From bdc41bd9907d7dba62863c8e3f8af716cb041fb4 Mon Sep 17 00:00:00 2001 From: "Saffo, David" Date: Thu, 25 Jul 2024 17:46:14 -0400 Subject: [PATCH 1/8] thinInstance start --- anu-examples/examples/BarCharts/barchart3d.js | 6 +- .../ScatterPlots/ScatterplotThinInstance.js | 88 + anu-examples/examples/Text/text.js | 27 +- anu-examples/main.js | 4 +- anu-examples/package.json | 5 +- docs/.vitepress/cache/deps/@babylonjs_core.js | 4 +- docs/.vitepress/cache/deps/@babylonjs_gui.js | 2 +- .../cache/deps/@jpmorganchase_anu.js | 7905 +- .../cache/deps/@jpmorganchase_anu.js.map | 6 +- docs/.vitepress/cache/deps/_metadata.json | 36 +- .../{chunk-AT2PKA3F.js => chunk-3EX2ZL37.js} | 4 +- ...-AT2PKA3F.js.map => chunk-3EX2ZL37.js.map} | 0 .../cache/deps/chunk-A56RIS75.js.map | 7 - .../{chunk-A56RIS75.js => chunk-F43E4K3S.js} | 114786 +++++++-------- .../cache/deps/chunk-F43E4K3S.js.map | 7 + package-lock.json | 4 +- src/bind.ts | 20 +- src/index.ts | 2 +- src/selection/index.ts | 2 + src/selection/property/thin.ts | 16 + 20 files changed, 61528 insertions(+), 61403 deletions(-) create mode 100644 anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js rename docs/.vitepress/cache/deps/{chunk-AT2PKA3F.js => chunk-3EX2ZL37.js} (99%) rename docs/.vitepress/cache/deps/{chunk-AT2PKA3F.js.map => chunk-3EX2ZL37.js.map} (100%) delete mode 100644 docs/.vitepress/cache/deps/chunk-A56RIS75.js.map rename docs/.vitepress/cache/deps/{chunk-A56RIS75.js => chunk-F43E4K3S.js} (99%) create mode 100644 docs/.vitepress/cache/deps/chunk-F43E4K3S.js.map create mode 100644 src/selection/property/thin.ts diff --git a/anu-examples/examples/BarCharts/barchart3d.js b/anu-examples/examples/BarCharts/barchart3d.js index 50dbd117..711bf177 100644 --- a/anu-examples/examples/BarCharts/barchart3d.js +++ b/anu-examples/examples/BarCharts/barchart3d.js @@ -57,7 +57,11 @@ export function barchart3D(babylonEngine){ .material((d, i) => scaleC(d.Miles_per_Gallon)) //.diffuseColor((d) => scaleC(d.Miles_per_Gallon)) - anu.createAxes('test', scene, {parent: chart, scale: {x: scaleX, y: scaleY, z: scaleZ}}); + anu.createAxes('test', scene, {parent: chart, + scale: {x: scaleX, y: scaleY, z: scaleZ}, + // labelOptions: {size: 1} + } + ); chart.run((d,n,i) => { diff --git a/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js b/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js new file mode 100644 index 00000000..ab52183d --- /dev/null +++ b/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright : J.P. Morgan Chase & Co. + +//Import everything we need to create our babylon scene and write our visualization code. +import * as anu from '@jpmorganchase/anu' //Anu for Scene-Graph Manipulation +import iris from '../../data/iris.json' assert {type: 'json'}; //Our data +import {HemisphericLight, Vector3, Scene, ArcRotateCamera, ActionManager, InterpolateValueAction, Matrix } from '@babylonjs/core'; +import {extent, scaleOrdinal, scaleLinear, map,} from "d3"; + +//import { Mesh } from 'anu'; + +//create and export a function that takes a babylon engine and returns a scene +export const scatterplotThinInstance = function(engine){ + + //Create an empty scene + const scene = new Scene(engine) + + //Add some lighting (name, position, scene) + new HemisphericLight('light1', new Vector3(0, 10, 0), scene) + + //Add a camera that rotates around the origin + const camera = new ArcRotateCamera("Camera", -(Math.PI / 4) * 3, Math.PI / 4, 10, new Vector3(0, 0, 0), scene); + camera.attachControl(true) + camera.position = new Vector3(2,2,-3.5); + + //Create the functions that we will use to scale our data according to our desired dimensions. In this case we want to scale the position of our points. + //These functions will take a number and scale it between -10 and 10. calling .nice() adds some padding at the beginning and end + var scaleX = scaleLinear().domain(extent(map(iris, (d) => {return d.sepalLength}))).range([-1,1]).nice(); //We want to encode sepal length along the x axis, so we make a linear scale function the will scale our data range (min and max sepal length) to our coordinate space (-10, 10 units) + var scaleY = scaleLinear().domain(extent(map(iris, (d) => {return d.petalLength}))).range([-1,1]).nice(); // + var scaleZ = scaleLinear().domain(extent(map(iris, (d) => {return d.sepalWidth}))).range([-1,1]).nice(); //Same as X for our Y and Z dimensions + + //This is a function that will create a color scale for our three types of flowers in our data + //pass in the flower name and it will return the hex of its color coding. schemecategory10 is an array of 10 color hexes + var scaleC = scaleOrdinal(anu.ordinalChromatic('d310').toStandardMaterial()) + + //Create a transform node to use as the parent node for all our meshes + let CoT = anu.create("cot", "cot"); + + //Select our center or transform with Anu to give us a selection obj CoT. + let chart = anu.selectName('cot', scene); + + + // let spheres = chart.bind('sphere', {diameter: 0.05}, iris) + // .positionX((d) => scaleX(d.sepalLength)) + // .positionY((d) => scaleY(d.petalLength)) + // .positionZ((d) => scaleZ(d.sepalWidth)) + // .material((d) => scaleC(d.species)) + + let root = anu.create('sphere', 'root', {diameter: 1}); + //root.scaling = new Vector3(0.1,0.1,0.1); + + let thinInstance = anu.bindThinInstance(root, iris) + .thinInstanceSetBuffer('matrix', (d,n,i) => { + var bufferMatrices = new Float32Array(n.thinInstanceCount * 16 * 3); + d.forEach((e, i) => { + let matrix = Matrix.Scaling(0.1,0.1,0.1) + matrix.copyToArray(bufferMatrices, i * 16); + }); + return bufferMatrices; + + }) + .thinInstanceSetBuffer('matrix', (d,n,i) => { + var bufferMatrices = new Float32Array(n.thinInstanceCount * 16 * 3); + let matricies = n.thinInstanceGetWorldMatrices(); + d.forEach((e, i) => { + let matrix = matricies[i].multiply( Matrix.Translation(scaleX(e.sepalLength), scaleY(e.petalLength), scaleZ(e.sepalWidth))) + matrix.copyToArray(bufferMatrices, i * 16); + }); + return bufferMatrices; + }) + + + + + //root.scaling = new Vector3(0.1,0.1,0.1); + + + console.log(thinInstance.selected[0]) + + anu.createAxes('test', scene, {parent: chart, scale: {x: scaleX, y: scaleY, z: scaleZ}}); + + + return scene; + + }; + + + diff --git a/anu-examples/examples/Text/text.js b/anu-examples/examples/Text/text.js index 9ef99579..425468c3 100644 --- a/anu-examples/examples/Text/text.js +++ b/anu-examples/examples/Text/text.js @@ -32,32 +32,27 @@ export const text = function(engine){ const randomizeThreshold = (threshold) => Math.random() * threshold * 2 - threshold const randmizeVector = (threshold = 50) => new Vector3(randomizeThreshold(threshold), randomizeThreshold(threshold), randomizeThreshold(threshold)) - // let mesh = createTextMesh({ - // text: `Test`, - // font: fnt, - // scene, - // atlas: png, - // engine, - // }); - - - // let instanceMesh = mesh.createInstance('test'); - - // instanceMesh.position = randmizeVector(); - for (let i = 0; i < 1; i++){ data.push({}) } - //anu.bind('text2d', scene, {text: 'Hello World', color: Color3.Green()}, data); let options = { - text: 'Hello World', + text: 'USA', + color: Color3.Green() + } + + let options2 = { + text: 'Europe', color: Color3.Green() } - anu.createPlaneText('myText', options, scene).position.x = -1; + anu.createPlaneText('myText', options, scene) + + anu.createPlaneText('myText2', options2, scene) + + //anu.create('box', 'box') return scene; diff --git a/anu-examples/main.js b/anu-examples/main.js index 32c0e4ec..85d2643f 100644 --- a/anu-examples/main.js +++ b/anu-examples/main.js @@ -48,6 +48,7 @@ import { nodelink3d } from './examples/Networks/NodeLink3D'; import { benchmark } from './examples/Benchmarks/benchmark'; import { fig1 } from './examples/Figures/fig1'; import { fig2 } from './examples/Figures/fig2'; +import { scatterplotThinInstance } from './examples/ScatterPlots/ScatterplotThinInstance'; const queryString = window.location.search; @@ -104,7 +105,8 @@ const scenes = { 'nodelink3d': nodelink3d, 'benchmark': benchmark, 'fig1': fig1, - 'fig2': fig2 + 'fig2': fig2, + 'scatterplotThinInstance': scatterplotThinInstance, } let scene = scenes[urlParams.get('example')](babylonEngine); diff --git a/anu-examples/package.json b/anu-examples/package.json index cd39f3c8..36d36416 100644 --- a/anu-examples/package.json +++ b/anu-examples/package.json @@ -12,10 +12,9 @@ "vite": "^3.2.7" }, "dependencies": { - "@babylonjs/core": "^7.0.0", + "@babylonjs/core": "^7.17.0", "@babylonjs/gui": "^7.0.0", - "@babylonjs/inspector": "^7.0.0", - "@jpmorganchase/anu": "^0.0.54", + "@babylonjs/inspector": "^7.17.0", "d3": "^7.6.1", "d3-force-3d": "^3.0.5", "simplify-3d": "^1.0.0", diff --git a/docs/.vitepress/cache/deps/@babylonjs_core.js b/docs/.vitepress/cache/deps/@babylonjs_core.js index 3d04ed87..fa946cd4 100644 --- a/docs/.vitepress/cache/deps/@babylonjs_core.js +++ b/docs/.vitepress/cache/deps/@babylonjs_core.js @@ -1021,7 +1021,7 @@ import { setStereoscopicAnaglyphRigMode, setStereoscopicRigMode, setVRRigMode -} from "./chunk-AT2PKA3F.js"; +} from "./chunk-3EX2ZL37.js"; import { AbstractActionManager, AbstractMesh, @@ -1374,7 +1374,7 @@ import { serializeAsTexture, serializeAsVector2, serializeAsVector3 -} from "./chunk-A56RIS75.js"; +} from "./chunk-F43E4K3S.js"; import "./chunk-Y2F7D3TJ.js"; export { AbstractActionManager, diff --git a/docs/.vitepress/cache/deps/@babylonjs_gui.js b/docs/.vitepress/cache/deps/@babylonjs_gui.js index a1521fe3..17dbc00e 100644 --- a/docs/.vitepress/cache/deps/@babylonjs_gui.js +++ b/docs/.vitepress/cache/deps/@babylonjs_gui.js @@ -71,7 +71,7 @@ import { serializeAsColor4, serializeAsTexture, serializeAsVector3 -} from "./chunk-A56RIS75.js"; +} from "./chunk-F43E4K3S.js"; import "./chunk-Y2F7D3TJ.js"; // node_modules/@babylonjs/gui/2D/valueAndUnit.js diff --git a/docs/.vitepress/cache/deps/@jpmorganchase_anu.js b/docs/.vitepress/cache/deps/@jpmorganchase_anu.js index 9953789e..9621530b 100644 --- a/docs/.vitepress/cache/deps/@jpmorganchase_anu.js +++ b/docs/.vitepress/cache/deps/@jpmorganchase_anu.js @@ -7,7 +7,7 @@ import { MeshBuilder, PBRMetallicRoughnessMaterial, PBRSpecularGlossinessMaterial -} from "./chunk-AT2PKA3F.js"; +} from "./chunk-3EX2ZL37.js"; import { AbstractMesh, Animation, @@ -18,6 +18,7 @@ import { DynamicTexture, Effect, KeyboardEventTypes, + Matrix, Mesh, PointerDragBehavior, ShaderMaterial, @@ -31,30 +32,30 @@ import { Vector3, VertexBuffer, VertexData -} from "./chunk-A56RIS75.js"; +} from "./chunk-F43E4K3S.js"; import "./chunk-Y2F7D3TJ.js"; // node_modules/@jpmorganchase/anu/dist/anu.js -function kR(n4) { - let e = n4[0], t = n4.slice(1), i = []; - return e === "." ? (this.selected.forEach((r) => i = i.concat(r == null ? void 0 : r.getChildren((s) => s.name == t))), new Jt(i, this.scene)) : e === "#" ? (this.selected.forEach((r) => i = i.concat(r == null ? void 0 : r.getChildren((s) => s.id == t))), new Jt(i, this.scene)) : e === "$" ? (this.selected.forEach((r) => i = i.concat(r == null ? void 0 : r.getChildren((s) => Tags.MatchesQuery(s, t) == true))), new Jt(i, this.scene)) : new Jt([], this.scene); -} function zR(n4) { - let e = []; - return Array.isArray(n4) ? n4.forEach((t, i) => this.selected.forEach((r) => e = e.concat(r == null ? void 0 : r.getChildren((s) => s.name == t)))) : this.selected.forEach((t) => e = e.concat(t == null ? void 0 : t.getChildren((i) => i.name == n4))), new Jt(e, this.scene); + let e = n4[0], t = n4.slice(1), i = []; + return e === "." ? (this.selected.forEach((r) => i = i.concat(r == null ? void 0 : r.getChildren((s) => s.name == t))), new qt(i, this.scene)) : e === "#" ? (this.selected.forEach((r) => i = i.concat(r == null ? void 0 : r.getChildren((s) => s.id == t))), new qt(i, this.scene)) : e === "$" ? (this.selected.forEach((r) => i = i.concat(r == null ? void 0 : r.getChildren((s) => Tags.MatchesQuery(s, t) == true))), new qt(i, this.scene)) : new qt([], this.scene); } function WR(n4) { let e = []; - return Array.isArray(n4) ? n4.forEach((t, i) => this.selected.forEach((r) => e = e.concat(r == null ? void 0 : r.getChildren((s) => s.id == t)))) : this.selected.forEach((t) => e = e.concat(t == null ? void 0 : t.getChildren((i) => i.id == n4))), new Jt(e, this.scene); + return Array.isArray(n4) ? n4.forEach((t, i) => this.selected.forEach((r) => e = e.concat(r == null ? void 0 : r.getChildren((s) => s.name == t)))) : this.selected.forEach((t) => e = e.concat(t == null ? void 0 : t.getChildren((i) => i.name == n4))), new qt(e, this.scene); } function GR(n4) { let e = []; - return Array.isArray(n4) ? n4.forEach((t, i) => this.selected.forEach((r) => e = e.concat(r == null ? void 0 : r.getChildren((s) => Tags.MatchesQuery(s, t) == true)))) : this.selected.forEach((t) => e = e.concat(t == null ? void 0 : t.getChildren((i) => Tags.MatchesQuery(i, n4) == true))), new Jt(e, this.scene); + return Array.isArray(n4) ? n4.forEach((t, i) => this.selected.forEach((r) => e = e.concat(r == null ? void 0 : r.getChildren((s) => s.id == t)))) : this.selected.forEach((t) => e = e.concat(t == null ? void 0 : t.getChildren((i) => i.id == n4))), new qt(e, this.scene); } -var XR = [ +function XR(n4) { + let e = []; + return Array.isArray(n4) ? n4.forEach((t, i) => this.selected.forEach((r) => e = e.concat(r == null ? void 0 : r.getChildren((s) => Tags.MatchesQuery(s, t) == true)))) : this.selected.forEach((t) => e = e.concat(t == null ? void 0 : t.getChildren((i) => Tags.MatchesQuery(i, n4) == true))), new qt(e, this.scene); +} +var HR = [ "roboto-regular.png" ]; -var HR = [ +var KR = [ { id: 40, index: 12, @@ -1470,7 +1471,7 @@ var HR = [ page: 0 } ]; -var KR = { +var qR = { face: "Roboto-Regular", size: 80, bold: 0, @@ -1593,7 +1594,7 @@ var KR = { 0 ] }; -var qR = { +var YR = { lineHeight: 84, base: 62, scaleW: 512, @@ -1605,11 +1606,11 @@ var qR = { greenChnl: 0, blueChnl: 0 }; -var YR = { +var ZR = { fieldType: "msdf", distanceRange: 4 }; -var ZR = [ +var jR = [ { first: 34, second: 34, @@ -3791,20 +3792,20 @@ var ZR = [ amount: -2 } ]; -var jR = { - pages: XR, - chars: HR, - info: KR, - common: qR, - distanceField: YR, - kernings: ZR +var QR = { + pages: HR, + chars: KR, + info: qR, + common: YR, + distanceField: ZR, + kernings: jR }; var S_ = "data:image/png;base64,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QiAEQiAEH6OuJ3JeJ4eu96Xb7bp//77R0VEjIyMGBwf19vb6/PPPHRscHPTNN984c+aM5eVlaZra3Ny0t7fn6OhIPp9XLBYNDw8rl8smJydNTEx40d27d926dcudO3fcu3dPvV73sbl06ZJqtapWq7l8+bLp6WknNZtNs7OzfvOb35idnXXr1i137961vr7utLa3t927d8/y8rJWq2V7e1u73faDQqFgamrKscnJSZ999pksy6ytrVldXZWmqZeZWcKSD2TG29rAjD8dk//ZJL/Cr/Ar9Hvev8e/wa/xbw7IMu9i2e9MeifjxuX9I/wK/wi/9Lw9/Bq/xq8tL/8rQ78Y8rnruI7r+Pue928wgxl+M8PRkVf57hdeqajoC9dxHdfxn3jeX2MGM7777v/2dhaw62NR8C5yaHtnOzs7vv32W2maGhsbMzQ0JJfL2d/f12q1LCwsSNPUaR0cEALr64RACJRKnokioohSiShib08iEYvFYonEU90uWUaWkWVkmTfJMlotWi2yjGrVE8PDxDFxTBwzMsLmpkgkEolEIpHnhEAIhMD6uo9ZFzmvk0PX+7K2tub27duKxaLe3l7dble73Xb58mV9fX2OjY+PGx8fd3h4aGtry/7+vqOjI/l8Xn9/v+HhYT09PV50cHDg7t27bt26ZXZ21q1bt9y+fVuapj4m4+PjLly44OLFiy5duqRarTppZ2fH7du33bx50+zsrO+//97s7Kx2u+1dbG5u+u677xwcHOh2uwqFgmKxaGhoSKlUcqxarVpdXbW8vGxpacni4qKlpSUvevjwr/HX+Kfev4fe1sPv8T3+J38Sxlev+3IVq1jFOc8bwxjGMPYdWeZd/JXfue6djBnztTGMoeL3rWAFK8yu+KtlXGcKn3uD33ij7657rQl84Q1u8J23dRs5H4uCV+oi50M5ODhw9+5dd+/e1dfXJ5fLOTg40O12vYsQCIEQCIFSyTOlElFEFFEqsboqFkskYrFY7KksI8vIMrKM3V1v0mrRapFltFrs7VEseiKOiWPimDhmc1MkUlISiUQizwmBEAiBEHzsup7IeZWcJ7reh4cPHyoUCn7Qbrft7OxYX1934cIF09PTTurp6VEqlZzGwsKCubk59+/fd+fOHbdu3TI7O2tubs7HZnp62rlz55w/f96FCxcMDAw46f79++7evev27dtu3bpl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"; var ys = ({ engine: n4, data: e, kind: t, stride: i, mesh: r }) => { const s = new VertexBuffer(n4, e, t, true, false, i); r.setVerticesBuffer(s); }; -var QR = ` +var JR = ` precision highp float; attribute vec3 position; @@ -3822,7 +3823,7 @@ void main(void) { vCenter = center; } `; -var JR = ` +var $R = ` precision highp float; varying vec2 vUv; @@ -3893,7 +3894,7 @@ void main(void) { function y_(n4) { return n4 && n4.__esModule && Object.prototype.hasOwnProperty.call(n4, "default") ? n4.default : n4; } -var $R = function(n4) { +var eS = function(n4) { switch (n4) { case "int8": return Int8Array; @@ -3917,34 +3918,34 @@ var $R = function(n4) { return Uint8ClampedArray; } }; -var eS = Object.prototype.toString; -var tS = iS; -function iS(n4) { - return n4.BYTES_PER_ELEMENT && eS.call(n4.buffer) === "[object ArrayBuffer]" || Array.isArray(n4); +var tS = Object.prototype.toString; +var iS = rS; +function rS(n4) { + return n4.BYTES_PER_ELEMENT && tS.call(n4.buffer) === "[object ArrayBuffer]" || Array.isArray(n4); } -var rS = function(n4) { - return n4 != null && (I_(n4) || sS(n4) || !!n4._isBuffer); +var sS = function(n4) { + return n4 != null && (I_(n4) || nS(n4) || !!n4._isBuffer); }; function I_(n4) { return !!n4.constructor && typeof n4.constructor.isBuffer == "function" && n4.constructor.isBuffer(n4); } -function sS(n4) { +function nS(n4) { return typeof n4.readFloatLE == "function" && typeof n4.slice == "function" && I_(n4.slice(0, 0)); } -var nS = $R; -var aS = tS; -var oS = rS; -var lS = [0, 2, 3]; -var cS = [2, 1, 3]; -var hS = function(n4, e) { - (!n4 || !(aS(n4) || oS(n4))) && (e = n4 || {}, n4 = null), typeof e == "number" ? e = { count: e } : e = e || {}; - for (var t = typeof e.type == "string" ? e.type : "uint16", i = typeof e.count == "number" ? e.count : 1, r = e.start || 0, s = e.clockwise !== false ? lS : cS, a = s[0], o = s[1], l = s[2], c = i * 6, h = n4 || new (nS(t))(c), u = 0, f = 0; u < c; u += 6, f += 4) { +var aS = eS; +var oS = iS; +var lS = sS; +var cS = [0, 2, 3]; +var hS = [2, 1, 3]; +var uS = function(n4, e) { + (!n4 || !(oS(n4) || lS(n4))) && (e = n4 || {}, n4 = null), typeof e == "number" ? e = { count: e } : e = e || {}; + for (var t = typeof e.type == "string" ? e.type : "uint16", i = typeof e.count == "number" ? e.count : 1, r = e.start || 0, s = e.clockwise !== false ? cS : hS, a = s[0], o = s[1], l = s[2], c = i * 6, h = n4 || new (aS(t))(c), u = 0, f = 0; u < c; u += 6, f += 4) { var d = u + r; h[d + 0] = f + 0, h[d + 1] = f + 1, h[d + 2] = f + 2, h[d + 3] = f + a, h[d + 4] = f + o, h[d + 5] = f + l; } return h; }; -var uS = y_(hS); +var fS = y_(uS); var b_ = { exports: {} }; (function(n4) { var e = /\n/, t = ` @@ -4010,9 +4011,9 @@ var b_ = { exports: {} }; }; } })(b_); -var fS = b_.exports; -var dS = y_(fS); -var Bp = [ +var dS = b_.exports; +var pS = y_(dS); +var kp = [ "x", "e", "a", @@ -4027,8 +4028,8 @@ var Bp = [ "w", "z" ]; -var kp = ["m", "w"]; -var zp = [ +var zp = ["m", "w"]; +var Wp = [ "H", "I", "N", @@ -4044,12 +4045,12 @@ var zp = [ "Y", "Z" ]; -var Wp = 9; +var Gp = 9; var Ja = 32; -var pS = 0; +var gS = 0; var A_ = 1; var M_ = 2; -var gS = class { +var mS = class { constructor(e = {}) { this.glyphs = [], this._measure = this.computeMetrics.bind(this), this.update(e); } @@ -4090,11 +4091,11 @@ var gS = class { return this._wordsTotal; } update(e) { - if (e = Object.assign({ measure: this._measure }, e), this._options = e, this._options.tabSize = xS(this._options.tabSize, 4), !e.font) + if (e = Object.assign({ measure: this._measure }, e), this._options = e, this._options.tabSize = CS(this._options.tabSize, 4), !e.font) throw new Error("must provide a valid bitmap font"); const t = this.glyphs, i = e.text || "", r = e.font; this._setupSpaceGlyphs(r); - const s = dS.lines(i, e), a = e.width || 0, o = i.split(" ").filter((R) => R !== ` + const s = pS.lines(i, e), a = e.width || 0, o = i.split(" ").filter((R) => R !== ` `).length, l = i.split("").filter((R) => R !== ` ` && R !== " ").length; t.length = 0; @@ -4102,16 +4103,16 @@ var gS = class { return Math.max(R, x.width, a); }, 0); let h = 0, u = 0; - const f = e.lineHeight ? e.lineHeight : 1, d = r.common.lineHeight * Math.max(f, 1), p = r.common.base, g = d - p, m = e.letterSpacing || 0, v = d * s.length - g, E = TS(this._options.align); - u -= v, this._width = c, this._height = v, this._descender = d - p, this._baseline = p, this._xHeight = _S(r), this._capHeight = vS(r), this._lineHeight = d, this._ascender = d - g - this._xHeight; + const f = e.lineHeight ? e.lineHeight : 1, d = r.common.lineHeight * Math.max(f, 1), p = r.common.base, g = d - p, m = e.letterSpacing || 0, v = d * s.length - g, E = xS(this._options.align); + u -= v, this._width = c, this._height = v, this._descender = d - p, this._baseline = p, this._xHeight = ES(r), this._capHeight = TS(r), this._lineHeight = d, this._ascender = d - g - this._xHeight; let C = 0, T = 0; s.forEach((R, x) => { - const S = R.start, M = R.end, N = R.width, F = i.slice(S, M).split(" ").filter((k) => k !== "").length, L = i.slice(S, M).split(" ").join("").length; - let K = 0, q = 0, j; + const S = R.start, M = R.end, N = R.width, F = i.slice(S, M).split(" ").filter((k) => k !== "").length, U = i.slice(S, M).split(" ").join("").length; + let H = 0, q = 0, Z; for (let k = S; k < M; k++) { const Q = i.charCodeAt(k), ce = this.getGlyph(r, Q); if (ce) { - j && (h += Xp(r, j.id, ce.id)); + Z && (h += Hp(r, Z.id, ce.id)); let de = h; E === A_ ? de += (c - N) / 2 : E === M_ && (de += c - N), t.push({ position: [de, u], @@ -4120,8 +4121,8 @@ var gS = class { // Line linesTotal: s.length, lineIndex: x, - lineLettersTotal: L, - lineLetterIndex: K, + lineLettersTotal: U, + lineLetterIndex: H, lineWordsTotal: F, lineWordIndex: q, // Word @@ -4130,14 +4131,14 @@ var gS = class { // Letter lettersTotal: l, letterIndex: T - }), ce.id === Ja && j.id !== Ja && (q++, C++), ce.id !== Ja && (K++, T++), h += ce.xadvance + m, j = ce; + }), ce.id === Ja && Z.id !== Ja && (q++, C++), ce.id !== Ja && (H++, T++), h += ce.xadvance + m, Z = ce; } } u += d, h = 0; }), this._lettersTotal = l, this._wordsTotal = o, this._linesTotal = s.length; } getGlyph(e, t) { - return Gp(e, t) || (t === Wp ? this._fallbackTabGlyph : t === Ja ? this._fallbackSpaceGlyph : null); + return Xp(e, t) || (t === Gp ? this._fallbackTabGlyph : t === Ja ? this._fallbackSpaceGlyph : null); } computeMetrics(e, t, i, r) { const s = this._options.letterSpacing || 0, a = this._options.font; @@ -4153,7 +4154,7 @@ var gS = class { const d = e.charCodeAt(f); if (h = this.getGlyph(a, d), h) { h.char = e[f], h.xoffset; - const p = u ? Xp(a, u.id, h.id) : 0; + const p = u ? Hp(a, u.id, h.id) : 0; o += p; const g = o + h.xadvance + s, m = o + h.width; if (m >= r || g >= r) @@ -4174,14 +4175,14 @@ var gS = class { _setupSpaceGlyphs(e) { if (this._fallbackSpaceGlyph = null, this._fallbackTabGlyph = null, !e.chars || e.chars.length === 0) return; - const t = Gp(e, Ja) || ES(e) || e.chars[0], i = this._options.tabSize * t.xadvance; + const t = Xp(e, Ja) || vS(e) || e.chars[0], i = this._options.tabSize * t.xadvance; this._fallbackSpaceGlyph = t; const r = Object.assign({}, t); this._fallbackTabGlyph = Object.assign(r, { x: 0, y: 0, xadvance: i, - id: Wp, + id: Gp, xoffset: 0, yoffset: 0, width: 0, @@ -4189,40 +4190,40 @@ var gS = class { }); } }; -function mS(n4) { - return new gS(n4); +function _S(n4) { + return new mS(n4); } -function Gp(n4, e) { +function Xp(n4, e) { if (!n4.chars || n4.chars.length === 0) return null; const t = Mc(n4.chars, e); return t >= 0 ? n4.chars[t] : null; } -function _S(n4) { - for (let e = 0; e < Bp.length; e++) { - const t = Bp[e].charCodeAt(0), i = Mc(n4.chars, t); - if (i >= 0) - return n4.chars[i].height; - } - return 0; -} function ES(n4) { for (let e = 0; e < kp.length; e++) { const t = kp[e].charCodeAt(0), i = Mc(n4.chars, t); if (i >= 0) - return n4.chars[i]; + return n4.chars[i].height; } return 0; } function vS(n4) { for (let e = 0; e < zp.length; e++) { const t = zp[e].charCodeAt(0), i = Mc(n4.chars, t); + if (i >= 0) + return n4.chars[i]; + } + return 0; +} +function TS(n4) { + for (let e = 0; e < Wp.length; e++) { + const t = Wp[e].charCodeAt(0), i = Mc(n4.chars, t); if (i >= 0) return n4.chars[i].height; } return 0; } -function Xp(n4, e, t) { +function Hp(n4, e, t) { if (!n4.kernings || n4.kernings.length === 0) return 0; const i = n4.kernings; @@ -4233,8 +4234,8 @@ function Xp(n4, e, t) { } return 0; } -function TS(n4) { - return n4 === "center" ? A_ : n4 === "right" ? M_ : pS; +function xS(n4) { + return n4 === "center" ? A_ : n4 === "right" ? M_ : gS; } function Mc(n4, e, t) { t = t || 0; @@ -4243,10 +4244,10 @@ function Mc(n4, e, t) { return i; return -1; } -function xS(n4, e) { +function CS(n4, e) { return typeof n4 == "number" ? n4 : typeof e == "number" ? e : 0; } -function CS(n4) { +function RS(n4) { const e = new Float32Array(n4.length * 4 * 1); let t = 0; return n4.forEach(function(i) { @@ -4254,7 +4255,7 @@ function CS(n4) { e[t++] = r, e[t++] = r, e[t++] = r, e[t++] = r; }), e; } -function RS(n4, e, t, i, r) { +function SS(n4, e, t, i, r) { const s = new Float32Array(n4.length * 4 * 2), a = new Float32Array(n4.length * 4 * 2), o = new Float32Array(n4.length * 4 * 3), l = new Float32Array(n4.length * 4 * 2); let c = 0, h = 0, u = 0, f = 0; return n4.forEach(function(d) { @@ -4267,7 +4268,7 @@ function RS(n4, e, t, i, r) { o[h++] = R, o[h++] = x, o[h++] = S, o[h++] = R, o[h++] = x + N, o[h++] = S, o[h++] = R + M, o[h++] = x + N, o[h++] = S, o[h++] = R + M, o[h++] = x, o[h++] = S, l[u++] = R + M / 2, l[u++] = x + N / 2, l[u++] = R + M / 2, l[u++] = x + N / 2, l[u++] = R + M / 2, l[u++] = x + N / 2, l[u++] = R + M / 2, l[u++] = x + N / 2; }), { uvs: s, layoutUvs: a, positions: o, centers: l }; } -function SS(n4) { +function yS(n4) { const e = new Float32Array(n4.length * 4), t = new Float32Array(n4.length * 4), i = new Float32Array(n4.length * 4), r = new Float32Array(n4.length * 4), s = new Float32Array(n4.length * 4), a = new Float32Array(n4.length * 4), o = new Float32Array(n4.length * 4); let l, c, h, u = 0, f = 0, d = 0, p = 0, g = 0, m = 0, v = 0; for (let E = 0; E < n4.length; E++) { @@ -4287,12 +4288,12 @@ function SS(n4) { letterIndex: o }; } -var Hp = { - pages: CS, - attributes: RS, - infos: SS +var Kp = { + pages: RS, + attributes: SS, + infos: yS }; -var yS = ({ +var IS = ({ color: n4 = new Color3(0, 0, 0), stroke: e, strokeColor: t = new Color3(0, 0, 0), @@ -4300,7 +4301,7 @@ var yS = ({ strokeWidth: r = 0.5, ...s }) => { - const a = mS(s), o = s.font; + const a = _S(s), o = s.font; s.engine && console.warn( "Warning: The engine argument is no longer required and will be ignored." ), s.atlas instanceof Texture || console.warn( @@ -4309,13 +4310,13 @@ var yS = ({ const l = s.scene.getEngine(), c = o.common.scaleW, h = o.common.scaleH, u = a.glyphs.filter((x) => { const S = x.data; return S.width * S.height > 0; - }), f = Hp.attributes( + }), f = Kp.attributes( u, c, h, true, a - ), d = Hp.infos(u, a), p = uS([], { + ), d = Kp.infos(u, a), p = fS([], { clockwise: true, type: "uint16", count: u.length @@ -4376,7 +4377,7 @@ var yS = ({ kind: "letterIndex", stride: 1, mesh: g - }), m.applyToMesh(g), g.scaling = new Vector3(0.5, 0.5, 0.5), g.rotation.y = 0, g.rotation.x = 3.14, Effect.ShadersStore.customVertexShader = QR, Effect.ShadersStore.customFragmentShader = JR; + }), m.applyToMesh(g), g.scaling = new Vector3(0.5, 0.5, 0.5), g.rotation.y = 0, g.rotation.x = 3.14, Effect.ShadersStore.customVertexShader = JR, Effect.ShadersStore.customFragmentShader = $R; const E = new ShaderMaterial( "shader", s.scene, @@ -4425,40 +4426,40 @@ var yS = ({ const R = new Color3(t.r, t.g, t.b); return E.setColor3("uStrokeColor", R), E.setFloat("uThreshold", 0.05), E.setFloat("uStrokeOutsetWidth", 0), E.setFloat("uStrokeInsetWidth", 0.3), E.setFloat("uOpacity", i), E.setFloat("uAlphaTest", 0.01), E.setInt("uLinesTotal", d.linesTotal), E.setInt("uWordsTotal", d.wordsTotal), E.setInt("uLettersTotal", d.lettersTotal), E.backFaceCulling = false, g.material = E, g; }; -var IS = class { +var bS = class { constructor(e, t, i) { this.name = e, this.options = t, this.scene = i, this.mesh = this.run(); } run() { - let e = new Mesh("cot"), t = yS({ + let e = new Mesh("cot"), t = IS({ text: this.options.text.toString(), color: this.options.color, opacity: this.options.opacity, align: this.options.align, font: this.options.font, scene: e.getScene(), - atlas: this.options.atlas - }); - t.computeWorldMatrix(true); - let i = 1 / t.getBoundingInfo().boundingBox.extendSize._y; - t.scaling = new Vector3(i, i, i), t.computeWorldMatrix(true), t.bakeCurrentTransformIntoVertices(), t.scaling = new Vector3(this.options.size, this.options.size, this.options.size), t.computeWorldMatrix(true), t.bakeCurrentTransformIntoVertices(); + atlas: this.options.atlas, + lineHeight: 1 + }), i = this.options.align == "left" ? 0 : this.options.align == "center" ? 1 : this.options.align == "right" ? 2 : null; + t.scaling = new Vector3(0.015, 0.015, 1), t.rotation.x = 180 * Math.PI / 180, t.bakeCurrentTransformIntoVertices(), t.computeWorldMatrix(true); let r = t.getBoundingInfo().boundingBox; - return e.position = new Vector3(r.center.x, r.center.y, 0), t.setParent(e), e; + const s = t.position.subtract(new Vector3(r.center.x * i, r.center.y, 0)); + return t.setPivotMatrix(Matrix.Translation(s.x, 0, 0), false), t.setParent(e), e.scaling = new Vector3(this.options.size, this.options.size, 1), e; } }; -function bS(n4, e, t) { +function AS(n4, e, t) { const i = { text: e.text || "undefined", size: e.size || 1, opacity: e.opacity || 1, align: e.align || "center", color: e.color || Color3.White(), - font: e.font || jR, + font: e.font || QR, atlas: e.atlas || S_ }; - return new IS(n4, i, t).mesh; + return new bS(n4, i, t).mesh; } -function AS(n4, e, t) { +function MS(n4, e, t) { let i = e.calculateBounds || true, r = e.exclude || void 0, s = e.childObserver || false, a = new Mesh(n4, t); if (i) { let { min: o, max: l } = a.getHierarchyBoundingVectors(true, r); @@ -4477,14 +4478,14 @@ function AS(n4, e, t) { }); }), a; } -function MS(n4, e, t) { +function PS(n4, e, t) { return new TransformNode(n4, t); } -function PS(n4, e, t) { +function OS(n4, e, t) { return CreateGreasedLine(n4, e, {}, t); } -var OS = { - cot: MS, +var DS = { + cot: PS, sphere: MeshBuilder.CreateSphere, box: MeshBuilder.CreateBox, tiledBox: MeshBuilder.CreateTiledBox, @@ -4511,48 +4512,48 @@ var OS = { icosphere: MeshBuilder.CreateIcoSphere, geodesic: MeshBuilder.CreateGeodesic, goldberg: MeshBuilder.CreateGoldberg, - planeText: bS, - greasedLine: PS, - container: AS + planeText: AS, + greasedLine: OS, + container: MS }; function zo(n4, e, t = {}, i = {}, r) { let s = {}; for (let [l, c] of Object.entries(t)) c instanceof Function ? s[l] = c(i) : s[l] = c; - let a = OS[n4], o = a(e, s, r); + let a = DS[n4], o = a(e, s, r); return o instanceof Mesh && (o.actionManager = new ActionManager(o.getScene())), Tags.EnableFor(o), o.metadata = { ...o.metadata, data: i }, o; } -function DS(n4, e = {}, t = [{}]) { +function NS(n4, e = {}, t = [{}]) { let i = []; return this.selected.forEach((r) => { t.forEach((s, a) => { var o = zo(n4, n4, e, s, this.scene); o.setParent(r), i.push(o); }); - }), new Jt(i, this.scene); + }), new qt(i, this.scene); } -function NS(n4, e = [{}]) { +function FS(n4, e = [{}]) { let t = []; return this.selected.forEach((i) => { e.forEach((r, s) => { var a = n4.createInstance(n4.name + "_" + s); n4 instanceof InstancedMesh && (n4.actionManager = new ActionManager(this.scene)), Tags.EnableFor(a), a.parent = i, a.metadata = { ...n4.metadata, data: r }, t.push(a); }); - }), new Jt(t, this.scene); + }), new qt(t, this.scene); } -function FS(n4) { +function LS(n4) { return this.prop("position", n4), this; } -function LS(n4) { +function wS(n4) { return this.prop("position.x", n4), this; } -function wS(n4) { +function US(n4) { return this.prop("position.y", n4), this; } -function US(n4) { +function VS(n4) { return this.prop("position.z", n4), this; } -function VS(n4, e, t) { +function BS(n4, e, t) { return this.selected.forEach((i, r) => { i instanceof TransformNode ? i.translate( n4 instanceof Function ? n4(i.metadata.data, r) : n4, @@ -4561,28 +4562,28 @@ function VS(n4, e, t) { ) : console.log("Node not a mesh, skipping."); }), this; } -function BS(n4) { +function kS(n4) { return this.prop("rotation", n4), this; } -function kS(n4) { +function zS(n4) { return this.prop("rotation.x", n4), this; } -function zS(n4) { +function WS(n4) { return this.prop("rotation.y", n4), this; } -function WS(n4) { +function GS(n4) { return this.prop("rotation.z", n4), this; } -function GS(n4) { +function XS(n4) { return this.prop("scaling", n4), this; } -function XS(n4) { +function HS(n4) { return this.prop("scaling.x", n4), this; } -function HS(n4) { +function KS(n4) { return this.prop("scaling.y", n4), this; } -function KS(n4) { +function qS(n4) { return this.prop("scaling.z", n4), this; } var P_ = class { @@ -4608,7 +4609,7 @@ var P_ = class { return this.mask = e, this.skipNextObservers = t, this.target = i, this.currentTarget = r, this; } }; -var qS = class { +var YS = class { /** * Creates a new observer * @param callback defines the callback to call when the observer is notified @@ -4662,7 +4663,7 @@ var he = class du { add(e, t = -1, i = false, r = null, s = false) { if (!e) return null; - const a = new qS(e, t, r); + const a = new YS(e, t, r); return a.unregisterOnNextCall = s, i ? this._observers.unshift(a) : this._observers.push(a), this._onObserverAdded && this._onObserverAdded(a), this._hasNotified && this.notifyIfTriggered && this._lastNotifiedValue !== void 0 && this.notifyObserver(a, this._lastNotifiedValue), a._remove = () => { this.remove(a); }, a; @@ -4886,8 +4887,8 @@ ne.errorsCount = 0; ne.Log = ne._LogEnabled.bind(ne, ne.MessageLogLevel); ne.Warn = ne._LogEnabled.bind(ne, ne.WarningLogLevel); ne.Error = ne._LogEnabled.bind(ne, ne.ErrorLogLevel); -var Kp = (n4, e, t) => !n4 || n4.getClassName && n4.getClassName() === "Mesh" ? null : n4.getClassName && (n4.getClassName() === "SubMesh" || n4.getClassName() === "PhysicsBody") ? n4.clone(e) : n4.clone ? n4.clone() : Array.isArray(n4) ? n4.slice() : t && typeof n4 == "object" ? { ...n4 } : null; -function YS(n4) { +var qp = (n4, e, t) => !n4 || n4.getClassName && n4.getClassName() === "Mesh" ? null : n4.getClassName && (n4.getClassName() === "SubMesh" || n4.getClassName() === "PhysicsBody") ? n4.clone(e) : n4.clone ? n4.clone() : Array.isArray(n4) ? n4.slice() : t && typeof n4 == "object" ? { ...n4 } : null; +function ZS(n4) { const e = []; do Object.getOwnPropertyNames(n4).forEach(function(t) { @@ -4907,7 +4908,7 @@ var Dn = class { * @remarks shallowCopyValues will not instantite the copied values which makes it only usable for "JSON objects" */ static DeepCopy(e, t, i, r, s = false) { - const a = YS(e); + const a = ZS(e); for (const o of a) { if (o[0] === "_" && (!r || r.indexOf(o) === -1) || o.endsWith("Observable") || i && i.indexOf(o) !== -1) continue; @@ -4921,13 +4922,13 @@ var Dn = class { if (t[o] = [], l.length > 0) if (typeof l[0] == "object") for (let h = 0; h < l.length; h++) { - const u = Kp(l[h], t, s); + const u = qp(l[h], t, s); t[o].indexOf(u) === -1 && t[o].push(u); } else t[o] = l.slice(0); } else - t[o] = Kp(l, t, s); + t[o] = qp(l, t, s); else t[o] = l; } catch (h) { @@ -4944,17 +4945,17 @@ var sr = class { return yi() && window.performance && window.performance.now ? window.performance.now() : Date.now(); } }; -var qp = {}; +var Yp = {}; function We(n4, e = false) { - if (!(e && qp[n4])) - return qp[n4] = true, `${n4} needs to be imported before as it contains a side-effect required by your code.`; + if (!(e && Yp[n4])) + return Yp[n4] = true, `${n4} needs to be imported before as it contains a side-effect required by your code.`; } -function ZS() { +function jS() { return typeof _native < "u" && _native.XMLHttpRequest ? new _native.XMLHttpRequest() : new XMLHttpRequest(); } var mi = class _mi { constructor() { - this._xhr = ZS(), this._requestURL = ""; + this._xhr = jS(), this._requestURL = ""; } /** * This function can be called to check if there are request modifiers for network requests @@ -5110,7 +5111,7 @@ st.FallbackTexture = ""; var ao = class { }; ao.FilesToLoad = {}; -var jS = class { +var QS = class { /** * Function used to defines an exponential back off strategy * @param maxRetries defines the maximum number of retries (3 by default) @@ -5165,14 +5166,14 @@ var D_ = (n4) => { return t; }; var N_ = (n4) => atob(n4); -var QS = (n4) => { +var JS = (n4) => { const e = N_(n4), t = e.length, i = new Uint8Array(new ArrayBuffer(t)); for (let r = 0; r < t; r++) i[r] = e.charCodeAt(r); return i.buffer; }; -var JS = "attribute"; -var $S = "varying"; +var $S = "attribute"; +var ey = "varying"; var oo = class { constructor() { this.children = []; @@ -5189,7 +5190,7 @@ var oo = class { const u = t.processor; if (u) { u.lineProcessor && (h = u.lineProcessor(h, t.isFragment, t.processingContext)); - const f = ((r = t.processor) == null ? void 0 : r.attributeKeywordName) ?? JS, d = t.isFragment && ((s = t.processor) != null && s.varyingFragmentKeywordName) ? (a = t.processor) == null ? void 0 : a.varyingFragmentKeywordName : !t.isFragment && ((o = t.processor) != null && o.varyingVertexKeywordName) ? (l = t.processor) == null ? void 0 : l.varyingVertexKeywordName : $S; + const f = ((r = t.processor) == null ? void 0 : r.attributeKeywordName) ?? $S, d = t.isFragment && ((s = t.processor) != null && s.varyingFragmentKeywordName) ? (a = t.processor) == null ? void 0 : a.varyingFragmentKeywordName : !t.isFragment && ((o = t.processor) != null && o.varyingVertexKeywordName) ? (l = t.processor) == null ? void 0 : l.varyingVertexKeywordName : ey; !t.isFragment && u.attributeProcessor && this.line.startsWith(f) ? h = u.attributeProcessor(this.line, e, t.processingContext) : u.varyingProcessor && ((c = u.varyingCheck) != null && c.call(u, this.line, t.isFragment) || !u.varyingCheck && this.line.startsWith(d)) ? h = u.varyingProcessor(this.line, t.isFragment, e, t.processingContext) : u.uniformProcessor && u.uniformRegexp && u.uniformRegexp.test(this.line) ? t.lookForClosingBracketForUniformBuffer || (h = u.uniformProcessor(this.line, t.isFragment, e, t.processingContext)) : u.uniformBufferProcessor && u.uniformBufferRegexp && u.uniformBufferRegexp.test(this.line) ? t.lookForClosingBracketForUniformBuffer || (h = u.uniformBufferProcessor(this.line, t.isFragment, t.processingContext), t.lookForClosingBracketForUniformBuffer = true) : u.textureProcessor && u.textureRegexp && u.textureRegexp.test(this.line) ? h = u.textureProcessor(this.line, t.isFragment, e, t.processingContext) : (u.uniformProcessor || u.uniformBufferProcessor) && this.line.startsWith("uniform") && !t.lookForClosingBracketForUniformBuffer && (/uniform\s+(?:(?:highp)?|(?:lowp)?)\s*(\S+)\s+(\S+)\s*;/.test(this.line) ? u.uniformProcessor && (h = u.uniformProcessor(this.line, t.isFragment, e, t.processingContext)) : u.uniformBufferProcessor && (h = u.uniformBufferProcessor(this.line, t.isFragment, t.processingContext), t.lookForClosingBracketForUniformBuffer = true)), t.lookForClosingBracketForUniformBuffer && this.line.indexOf("}") !== -1 && (t.lookForClosingBracketForUniformBuffer = false, u.endOfUniformBufferProcessor && (h = u.endOfUniformBufferProcessor(this.line, t.isFragment, t.processingContext))); } i += h + ` @@ -5200,7 +5201,7 @@ var oo = class { }), this.additionalDefineKey && (e[this.additionalDefineKey] = this.additionalDefineValue || "true"), i; } }; -var ey = class { +var ty = class { constructor() { this._lines = []; } @@ -5251,12 +5252,12 @@ var Uh = class extends oo { return ""; } }; -var ty = class extends oo { +var iy = class extends oo { isValid(e) { return this.testExpression.isTrue(e); } }; -var Yt = class _Yt { +var Zt = class _Zt { // eslint-disable-next-line @typescript-eslint/no-unused-vars isTrue(e) { return true; @@ -5264,7 +5265,7 @@ var Yt = class _Yt { static postfixToInfix(e) { const t = []; for (const i of e) - if (_Yt._OperatorPriority[i] === void 0) + if (_Zt._OperatorPriority[i] === void 0) t.push(i); else { const r = t[t.length - 1], s = t[t.length - 2]; @@ -5292,7 +5293,7 @@ var Yt = class _Yt { * @returns The postfix expression as an array of strings. */ static infixToPostfix(e) { - const t = _Yt._InfixToPostfixCache.get(e); + const t = _Zt._InfixToPostfixCache.get(e); if (t) return t.accessTime = Date.now(), t.result; if (!e.includes("&&") && !e.includes("||") && !e.includes(")") && !e.includes("(")) @@ -5302,8 +5303,8 @@ var Yt = class _Yt { const s = () => { h = h.trim(), h !== "" && (i.push(h), h = ""); }, a = (u) => { - r < _Yt._Stack.length - 1 && (_Yt._Stack[++r] = u); - }, o = () => _Yt._Stack[r], l = () => r === -1 ? "!!INVALID EXPRESSION!!" : _Yt._Stack[r--]; + r < _Zt._Stack.length - 1 && (_Zt._Stack[++r] = u); + }, o = () => _Zt._Stack[r], l = () => r === -1 ? "!!INVALID EXPRESSION!!" : _Zt._Stack[r--]; let c = 0, h = ""; for (; c < e.length; ) { const u = e.charAt(c), f = c < e.length - 1 ? e.substr(c, 2) : ""; @@ -5313,8 +5314,8 @@ var Yt = class _Yt { for (s(); r !== -1 && o() !== "("; ) i.push(l()); l(); - } else if (_Yt._OperatorPriority[f] > 1) { - for (s(); r !== -1 && _Yt._OperatorPriority[o()] >= _Yt._OperatorPriority[f]; ) + } else if (_Zt._OperatorPriority[f] > 1) { + for (s(); r !== -1 && _Zt._OperatorPriority[o()] >= _Zt._OperatorPriority[f]; ) i.push(l()); a(f), c++; } else @@ -5323,25 +5324,25 @@ var Yt = class _Yt { } for (s(); r !== -1; ) o() === "(" ? l() : i.push(l()); - return _Yt._InfixToPostfixCache.size >= _Yt.InfixToPostfixCacheLimitSize && _Yt.ClearCache(), _Yt._InfixToPostfixCache.set(e, { result: i, accessTime: Date.now() }), i; + return _Zt._InfixToPostfixCache.size >= _Zt.InfixToPostfixCacheLimitSize && _Zt.ClearCache(), _Zt._InfixToPostfixCache.set(e, { result: i, accessTime: Date.now() }), i; } static ClearCache() { - const e = Array.from(_Yt._InfixToPostfixCache.entries()).sort((t, i) => t[1].accessTime - i[1].accessTime); - for (let t = 0; t < _Yt.InfixToPostfixCacheCleanupSize; t++) - _Yt._InfixToPostfixCache.delete(e[t][0]); + const e = Array.from(_Zt._InfixToPostfixCache.entries()).sort((t, i) => t[1].accessTime - i[1].accessTime); + for (let t = 0; t < _Zt.InfixToPostfixCacheCleanupSize; t++) + _Zt._InfixToPostfixCache.delete(e[t][0]); } }; -Yt.InfixToPostfixCacheLimitSize = 5e4; -Yt.InfixToPostfixCacheCleanupSize = 25e3; -Yt._InfixToPostfixCache = /* @__PURE__ */ new Map(); -Yt._OperatorPriority = { +Zt.InfixToPostfixCacheLimitSize = 5e4; +Zt.InfixToPostfixCacheCleanupSize = 25e3; +Zt._InfixToPostfixCache = /* @__PURE__ */ new Map(); +Zt._OperatorPriority = { ")": 0, "(": 1, "||": 2, "&&": 3 }; -Yt._Stack = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]; -var pl = class extends Yt { +Zt._Stack = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]; +var pl = class extends Zt { constructor(e, t = false) { super(), this.define = e, this.not = t; } @@ -5350,17 +5351,17 @@ var pl = class extends Yt { return this.not && (t = !t), t; } }; -var iy = class extends Yt { +var ry = class extends Zt { isTrue(e) { return this.leftOperand.isTrue(e) || this.rightOperand.isTrue(e); } }; -var ry = class extends Yt { +var sy = class extends Zt { isTrue(e) { return this.leftOperand.isTrue(e) && this.rightOperand.isTrue(e); } }; -var sy = class extends Yt { +var ny = class extends Zt { constructor(e, t, i) { super(), this.define = e, this.operand = t, this.testValue = i; } @@ -5396,12 +5397,12 @@ var _i; (function(n4) { n4[n4.GLSL = 0] = "GLSL", n4[n4.WGSL = 1] = "WGSL"; })(_i || (_i = {})); -var ny = /defined\s*?\((.+?)\)/g; +var ay = /defined\s*?\((.+?)\)/g; var Vh = /defined\s*?\[(.+?)\]/g; -var ay = /#include\s?<(.+)>(\((.*)\))*(\[(.*)\])*/g; -var oy = /__decl__/; -var Yp = /light\{X\}.(\w*)/g; -var Zp = /\{X\}/g; +var oy = /#include\s?<(.+)>(\((.*)\))*(\[(.*)\])*/g; +var ly = /__decl__/; +var Zp = /light\{X\}.(\w*)/g; +var jp = /\{X\}/g; var gl = []; var hs = class _hs { static Initialize(e) { @@ -5447,25 +5448,25 @@ var hs = class _hs { if (a === -1) return new pl(e); const o = e.substring(0, a).trim(), l = e.substring(a + s.length).trim(); - return new sy(o, s, l); + return new ny(o, s, l); } static _BuildSubExpression(e) { - e = e.replace(ny, "defined[$1]"); - const t = Yt.infixToPostfix(e), i = []; + e = e.replace(ay, "defined[$1]"); + const t = Zt.infixToPostfix(e), i = []; for (const s of t) if (s !== "||" && s !== "&&") i.push(s); else if (i.length >= 2) { let a = i[i.length - 1], o = i[i.length - 2]; i.length -= 2; - const l = s == "&&" ? new ry() : new iy(); + const l = s == "&&" ? new sy() : new ry(); typeof a == "string" && (a = a.replace(Vh, "defined($1)")), typeof o == "string" && (o = o.replace(Vh, "defined($1)")), l.leftOperand = typeof o == "string" ? this._ExtractOperation(o) : o, l.rightOperand = typeof a == "string" ? this._ExtractOperation(a) : a, i.push(l); } let r = i[i.length - 1]; return typeof r == "string" && (r = r.replace(Vh, "defined($1)")), typeof r == "string" ? this._ExtractOperation(r) : r; } static _BuildExpression(e, t) { - const i = new ty(), r = e.substring(0, t); + const i = new iy(), r = e.substring(0, t); let s = e.substring(t); return s = s.substring(0, (s.indexOf("//") + 1 || s.length + 1) - 1).trim(), r === "#ifdef" ? i.testExpression = new pl(s) : r === "#ifndef" ? i.testExpression = new pl(s, true) : i.testExpression = this._BuildSubExpression(s), i; } @@ -5529,7 +5530,7 @@ var hs = class _hs { return false; } static _EvaluatePreProcessors(e, t, i) { - const r = new oo(), s = new ey(); + const r = new oo(), s = new ty(); return s.lineIndex = -1, s.lines = e.split(` `), this._MoveCursor(s, r), r.process(t, i); } @@ -5559,12 +5560,12 @@ var hs = class _hs { static _ProcessIncludes(e, t, i) { gl.length = 0; let r; - for (; (r = ay.exec(e)) !== null; ) + for (; (r = oy.exec(e)) !== null; ) gl.push(r); let s = String(e), a = [e], o = false; for (const l of gl) { let c = l[1]; - if (c.indexOf("__decl__") !== -1 && (c = c.replace(oy, ""), t.supportsUniformBuffers && (c = c.replace("Vertex", "Ubo").replace("Fragment", "Ubo")), c = c + "Declaration"), t.includesShadersStore[c]) { + if (c.indexOf("__decl__") !== -1 && (c = c.replace(ly, ""), t.supportsUniformBuffers && (c = c.replace("Vertex", "Ubo").replace("Fragment", "Ubo")), c = c + "Declaration"), t.includesShadersStore[c]) { let h = t.includesShadersStore[c]; if (l[2]) { const f = l[3].split(","); @@ -5580,10 +5581,10 @@ var hs = class _hs { let g = parseInt(d[1]), m = h.slice(0); h = "", isNaN(g) && (g = t.indexParameters[d[1]]); for (let v = p; v < g; v++) - t.supportsUniformBuffers || (m = m.replace(Yp, (E, C) => C + "{X}")), h += m.replace(Zp, v.toString()) + ` + t.supportsUniformBuffers || (m = m.replace(Zp, (E, C) => C + "{X}")), h += m.replace(jp, v.toString()) + ` `; } else - t.supportsUniformBuffers || (h = h.replace(Yp, (d, p) => p + "{X}")), h = h.replace(Zp, f); + t.supportsUniformBuffers || (h = h.replace(Zp, (d, p) => p + "{X}")), h = h.replace(jp, f); } const u = []; for (const f of a) { @@ -6539,7 +6540,7 @@ Hi._UniqueIdSeed = 0; Hi._BaseCache = {}; Hi.ShadersStore = Y.ShadersStore; Hi.IncludesShadersStore = Y.IncludesShadersStore; -var ly = class { +var cy = class { /** * Initializes the state. * @param reset @@ -6664,7 +6665,7 @@ var Ls = class _Ls { Ls.ALWAYS = 519; Ls.KEEP = 7680; Ls.REPLACE = 7681; -var cy = class { +var hy = class { /** * Initializes the state. */ @@ -6696,7 +6697,7 @@ var cy = class { this.isDirty && (this._isAlphaBlendDirty && (this._alphaBlend ? e.enable(e.BLEND) : e.disable(e.BLEND), this._isAlphaBlendDirty = false), this._isBlendFunctionParametersDirty && (e.blendFuncSeparate(this._blendFunctionParameters[0], this._blendFunctionParameters[1], this._blendFunctionParameters[2], this._blendFunctionParameters[3]), this._isBlendFunctionParametersDirty = false), this._isBlendEquationParametersDirty && (e.blendEquationSeparate(this._blendEquationParameters[0], this._blendEquationParameters[1]), this._isBlendEquationParametersDirty = false), this._isBlendConstantsDirty && (e.blendColor(this._blendConstants[0], this._blendConstants[1], this._blendConstants[2], this._blendConstants[3]), this._isBlendConstantsDirty = false)); } }; -var hy = class { +var uy = class { /** * | Value | Type | Description | * | ----- | ------------------ | ----------- | @@ -6798,7 +6799,7 @@ var Dt; (function(n4) { n4[n4.Unknown = 0] = "Unknown", n4[n4.Url = 1] = "Url", n4[n4.Temp = 2] = "Temp", n4[n4.Raw = 3] = "Raw", n4[n4.Dynamic = 4] = "Dynamic", n4[n4.RenderTarget = 5] = "RenderTarget", n4[n4.MultiRenderTarget = 6] = "MultiRenderTarget", n4[n4.Cube = 7] = "Cube", n4[n4.CubeRaw = 8] = "CubeRaw", n4[n4.CubePrefiltered = 9] = "CubePrefiltered", n4[n4.Raw3D = 10] = "Raw3D", n4[n4.Raw2DArray = 11] = "Raw2DArray", n4[n4.DepthStencil = 12] = "DepthStencil", n4[n4.CubeRawRGBD = 13] = "CubeRawRGBD", n4[n4.Depth = 14] = "Depth"; })(Dt || (Dt = {})); -var ar = class _ar extends hy { +var or = class _or extends uy { /** * Gets a boolean indicating if the texture uses mipmaps * TODO implements useMipMaps as a separate setting from generateMipMaps @@ -6837,7 +6838,7 @@ var ar = class _ar extends hy { * @param delayAllocation if the texture allocation should be delayed (default: false) */ constructor(e, t, i = false) { - super(), this.isReady = false, this.isCube = false, this.is3D = false, this.is2DArray = false, this.isMultiview = false, this.url = "", this.generateMipMaps = false, this.samples = 0, this.type = -1, this.format = -1, this.onLoadedObservable = new he(), this.onErrorObservable = new he(), this.onRebuildCallback = null, this.width = 0, this.height = 0, this.depth = 0, this.baseWidth = 0, this.baseHeight = 0, this.baseDepth = 0, this.invertY = false, this._invertVScale = false, this._associatedChannel = -1, this._source = Dt.Unknown, this._buffer = null, this._bufferView = null, this._bufferViewArray = null, this._bufferViewArrayArray = null, this._size = 0, this._extension = "", this._files = null, this._workingCanvas = null, this._workingContext = null, this._cachedCoordinatesMode = null, this._isDisabled = false, this._compression = null, this._sphericalPolynomial = null, this._sphericalPolynomialPromise = null, this._sphericalPolynomialComputed = false, this._lodGenerationScale = 0, this._lodGenerationOffset = 0, this._useSRGBBuffer = false, this._creationFlags = 0, this._lodTextureHigh = null, this._lodTextureMid = null, this._lodTextureLow = null, this._isRGBD = false, this._linearSpecularLOD = false, this._irradianceTexture = null, this._hardwareTexture = null, this._maxLodLevel = null, this._references = 1, this._gammaSpace = null, this._premulAlpha = false, this._dynamicTextureSource = null, this._engine = e, this._source = t, this._uniqueId = _ar._Counter++, i || (this._hardwareTexture = e._createHardwareTexture()); + super(), this.isReady = false, this.isCube = false, this.is3D = false, this.is2DArray = false, this.isMultiview = false, this.url = "", this.generateMipMaps = false, this.samples = 0, this.type = -1, this.format = -1, this.onLoadedObservable = new he(), this.onErrorObservable = new he(), this.onRebuildCallback = null, this.width = 0, this.height = 0, this.depth = 0, this.baseWidth = 0, this.baseHeight = 0, this.baseDepth = 0, this.invertY = false, this._invertVScale = false, this._associatedChannel = -1, this._source = Dt.Unknown, this._buffer = null, this._bufferView = null, this._bufferViewArray = null, this._bufferViewArrayArray = null, this._size = 0, this._extension = "", this._files = null, this._workingCanvas = null, this._workingContext = null, this._cachedCoordinatesMode = null, this._isDisabled = false, this._compression = null, this._sphericalPolynomial = null, this._sphericalPolynomialPromise = null, this._sphericalPolynomialComputed = false, this._lodGenerationScale = 0, this._lodGenerationOffset = 0, this._useSRGBBuffer = false, this._creationFlags = 0, this._lodTextureHigh = null, this._lodTextureMid = null, this._lodTextureLow = null, this._isRGBD = false, this._linearSpecularLOD = false, this._irradianceTexture = null, this._hardwareTexture = null, this._maxLodLevel = null, this._references = 1, this._gammaSpace = null, this._premulAlpha = false, this._dynamicTextureSource = null, this._engine = e, this._source = t, this._uniqueId = _or._Counter++, i || (this._hardwareTexture = e._createHardwareTexture()); } /** * Increments the number of references (ie. the number of Texture that point to it) @@ -6939,8 +6940,8 @@ var ar = class _ar extends hy { this._references--, this.onLoadedObservable.clear(), this.onErrorObservable.clear(), this._references === 0 && (this._engine._releaseTexture(this), this._hardwareTexture = null, this._dynamicTextureSource = null); } }; -ar._Counter = 0; -var uy = class { +or._Counter = 0; +var fy = class { constructor() { this.shaderLanguage = _i.GLSL; } @@ -6952,8 +6953,8 @@ var uy = class { return e; } }; -var fy = /(flat\s)?\s*varying\s*.*/; -var dy = class { +var dy = /(flat\s)?\s*varying\s*.*/; +var py = class { constructor() { this.shaderLanguage = _i.GLSL; } @@ -6961,7 +6962,7 @@ var dy = class { return e.replace("attribute", "in"); } varyingCheck(e, t) { - return fy.test(e); + return dy.test(e); } varyingProcessor(e, t) { return e.replace("varying", t ? "in" : "out"); @@ -7002,7 +7003,7 @@ var po = class extends Wo { return this._buffer; } }; -var py = class { +var gy = class { constructor() { this._valueCache = {}, this.vertexCompilationError = null, this.fragmentCompilationError = null, this.programLinkError = null, this.programValidationError = null, this._isDisposed = false; } @@ -7457,7 +7458,7 @@ var ka = class { (e = this.drawContext) == null || e.dispose(); } }; -var gy = class { +var my = class { get isDirty() { return this._isStencilTestDirty || this._isStencilMaskDirty || this._isStencilFuncDirty || this._isStencilOpDirty; } @@ -7524,7 +7525,7 @@ var gy = class { this.enabled = t ? this.stencilMaterial.enabled : this.stencilGlobal.enabled, this.func = t ? this.stencilMaterial.func : this.stencilGlobal.func, this.funcRef = t ? this.stencilMaterial.funcRef : this.stencilGlobal.funcRef, this.funcMask = t ? this.stencilMaterial.funcMask : this.stencilGlobal.funcMask, this.opStencilFail = t ? this.stencilMaterial.opStencilFail : this.stencilGlobal.opStencilFail, this.opDepthFail = t ? this.stencilMaterial.opDepthFail : this.stencilGlobal.opDepthFail, this.opStencilDepthPass = t ? this.stencilMaterial.opStencilDepthPass : this.stencilGlobal.opStencilDepthPass, this.mask = t ? this.stencilMaterial.mask : this.stencilGlobal.mask, this.isDirty && (this._isStencilTestDirty && (this.enabled ? e.enable(e.STENCIL_TEST) : e.disable(e.STENCIL_TEST), this._isStencilTestDirty = false), this._isStencilMaskDirty && (e.stencilMask(this.mask), this._isStencilMaskDirty = false), this._isStencilFuncDirty && (e.stencilFunc(this.func, this.funcRef, this.funcMask), this._isStencilFuncDirty = false), this._isStencilOpDirty && (e.stencilOp(this.opStencilFail, this.opDepthFail, this.opStencilDepthPass), this._isStencilOpDirty = false)); } }; -var my = class { +var _y = class { }; var De = class _De { /** @@ -7750,7 +7751,7 @@ var De = class _De { */ constructor(e, t, i, r) { var c, h; - this._name = "WebGL", this._isDisposed = false, this.forcePOTTextures = false, this.isFullscreen = false, this.cullBackFaces = null, this.renderEvenInBackground = true, this.preventCacheWipeBetweenFrames = false, this.validateShaderPrograms = false, this._useReverseDepthBuffer = false, this.isNDCHalfZRange = false, this.hasOriginBottomLeft = true, this.disableUniformBuffers = false, this.onDisposeObservable = new he(), this._frameId = 0, this._uniformBuffers = new Array(), this._storageBuffers = new Array(), this._webGLVersion = 1, this._windowIsBackground = false, this._highPrecisionShadersAllowed = true, this._badOS = false, this._badDesktopOS = false, this._activeRenderLoops = new Array(), this.onContextLostObservable = new he(), this.onContextRestoredObservable = new he(), this._contextWasLost = false, this._doNotHandleContextLost = false, this.disableVertexArrayObjects = false, this._colorWrite = true, this._colorWriteChanged = true, this._depthCullingState = new ly(), this._stencilStateComposer = new gy(), this._stencilState = new Ls(), this._alphaState = new cy(), this._alphaMode = 1, this._alphaEquation = 0, this._internalTexturesCache = new Array(), this._renderTargetWrapperCache = new Array(), this._activeChannel = 0, this._currentTextureChannel = -1, this._boundTexturesCache = {}, this._compiledEffects = {}, this._vertexAttribArraysEnabled = [], this._currentRenderTarget = null, this._uintIndicesCurrentlySet = false, this._currentBoundBuffer = new Array(), this._currentFramebuffer = null, this._dummyFramebuffer = null, this._currentBufferPointers = new Array(), this._currentInstanceLocations = new Array(), this._currentInstanceBuffers = new Array(), this._boundRenderFunction = () => this._renderLoop(), this._vaoRecordInProgress = false, this._mustWipeVertexAttributes = false, this._frameHandler = 0, this._nextFreeTextureSlots = new Array(), this._maxSimultaneousTextures = 0, this._maxMSAASamplesOverride = null, this._activeRequests = new Array(), this.adaptToDeviceRatio = false, this._lastDevicePixelRatio = 1, this._transformTextureUrl = null, this.hostInformation = { + this._name = "WebGL", this._isDisposed = false, this.forcePOTTextures = false, this.isFullscreen = false, this.cullBackFaces = null, this.renderEvenInBackground = true, this.preventCacheWipeBetweenFrames = false, this.validateShaderPrograms = false, this._useReverseDepthBuffer = false, this.isNDCHalfZRange = false, this.hasOriginBottomLeft = true, this.disableUniformBuffers = false, this.onDisposeObservable = new he(), this._frameId = 0, this._uniformBuffers = new Array(), this._storageBuffers = new Array(), this._webGLVersion = 1, this._windowIsBackground = false, this._highPrecisionShadersAllowed = true, this._badOS = false, this._badDesktopOS = false, this._activeRenderLoops = new Array(), this.onContextLostObservable = new he(), this.onContextRestoredObservable = new he(), this._contextWasLost = false, this._doNotHandleContextLost = false, this.disableVertexArrayObjects = false, this._colorWrite = true, this._colorWriteChanged = true, this._depthCullingState = new cy(), this._stencilStateComposer = new my(), this._stencilState = new Ls(), this._alphaState = new hy(), this._alphaMode = 1, this._alphaEquation = 0, this._internalTexturesCache = new Array(), this._renderTargetWrapperCache = new Array(), this._activeChannel = 0, this._currentTextureChannel = -1, this._boundTexturesCache = {}, this._compiledEffects = {}, this._vertexAttribArraysEnabled = [], this._currentRenderTarget = null, this._uintIndicesCurrentlySet = false, this._currentBoundBuffer = new Array(), this._currentFramebuffer = null, this._dummyFramebuffer = null, this._currentBufferPointers = new Array(), this._currentInstanceLocations = new Array(), this._currentInstanceBuffers = new Array(), this._boundRenderFunction = () => this._renderLoop(), this._vaoRecordInProgress = false, this._mustWipeVertexAttributes = false, this._frameHandler = 0, this._nextFreeTextureSlots = new Array(), this._maxSimultaneousTextures = 0, this._maxMSAASamplesOverride = null, this._activeRequests = new Array(), this.adaptToDeviceRatio = false, this._lastDevicePixelRatio = 1, this._transformTextureUrl = null, this.hostInformation = { isMobile: false }, this.premultipliedAlpha = true, this.onBeforeTextureInitObservable = new he(), this._isWebGPU = false, this._snapshotRenderingMode = 0, this._viewportCached = { x: 0, y: 0, z: 0, w: 0 }, this._unpackFlipYCached = null, this.enableUnpackFlipYCached = true, this._boundUniforms = {}, this.startTime = sr.Now; let s = null; @@ -7815,8 +7816,8 @@ var De = class _De { } this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE), i.useHighPrecisionFloats !== void 0 && (this._highPrecisionShadersAllowed = i.useHighPrecisionFloats), this.resize(), this._initGLContext(), this._initFeatures(); for (let u = 0; u < this._caps.maxVertexAttribs; u++) - this._currentBufferPointers[u] = new my(); - this._shaderProcessor = this.webGLVersion > 1 ? new dy() : new uy(), this._badOS = /iPad/i.test(navigator.userAgent) || /iPhone/i.test(navigator.userAgent); + this._currentBufferPointers[u] = new _y(); + this._shaderProcessor = this.webGLVersion > 1 ? new py() : new fy(), this._badOS = /iPad/i.test(navigator.userAgent) || /iPhone/i.test(navigator.userAgent); const l = `Babylon.js v${_De.Version}`; ne.Log(l + ` - ${this.description}`), this._renderingCanvas && this._renderingCanvas.setAttribute && this._renderingCanvas.setAttribute("data-engine", l); } @@ -8920,7 +8921,7 @@ var De = class _De { * @returns the new pipeline */ createPipelineContext(e) { - const t = new py(); + const t = new gy(); return t.engine = this, this._caps.parallelShaderCompile && (t.isParallelCompiled = true), t; } /** @@ -9426,7 +9427,7 @@ var De = class _De { _createInternalTexture(e, t, i = true, r = Dt.Unknown) { let s = false, a = 0, o = 3, l = 5, c = false, h = 1, u; t !== void 0 && typeof t == "object" ? (s = !!t.generateMipMaps, a = t.type === void 0 ? 0 : t.type, o = t.samplingMode === void 0 ? 3 : t.samplingMode, l = t.format === void 0 ? 5 : t.format, c = t.useSRGBBuffer === void 0 ? false : t.useSRGBBuffer, h = t.samples ?? 1, u = t.label) : s = !!t, c && (c = this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU)), (a === 1 && !this._caps.textureFloatLinearFiltering || a === 2 && !this._caps.textureHalfFloatLinearFiltering) && (o = 1), a === 1 && !this._caps.textureFloat && (a = 0, ne.Warn("Float textures are not supported. Type forced to TEXTURETYPE_UNSIGNED_BYTE")); - const f = this._gl, d = new ar(this, r), p = e.width || e, g = e.height || e, m = e.depth || 0, v = e.layers || 0, E = this._getSamplingParameters(o, s), C = v !== 0 ? f.TEXTURE_2D_ARRAY : m !== 0 ? f.TEXTURE_3D : f.TEXTURE_2D, T = this._getRGBABufferInternalSizedFormat(a, l, c), R = this._getInternalFormat(l), x = this._getWebGLTextureType(a); + const f = this._gl, d = new or(this, r), p = e.width || e, g = e.height || e, m = e.depth || 0, v = e.layers || 0, E = this._getSamplingParameters(o, s), C = v !== 0 ? f.TEXTURE_2D_ARRAY : m !== 0 ? f.TEXTURE_3D : f.TEXTURE_2D, T = this._getRGBABufferInternalSizedFormat(a, l, c), R = this._getInternalFormat(l), x = this._getWebGLTextureType(a); return this._bindTextureDirectly(C, d), v !== 0 ? (d.is2DArray = true, f.texImage3D(C, 0, T, p, g, v, 0, R, x, null)) : m !== 0 ? (d.is3D = true, f.texImage3D(C, 0, T, p, g, m, 0, R, x, null)) : f.texImage2D(C, 0, T, p, g, 0, R, x, null), f.texParameteri(C, f.TEXTURE_MAG_FILTER, E.mag), f.texParameteri(C, f.TEXTURE_MIN_FILTER, E.min), f.texParameteri(C, f.TEXTURE_WRAP_S, f.CLAMP_TO_EDGE), f.texParameteri(C, f.TEXTURE_WRAP_T, f.CLAMP_TO_EDGE), s && this._gl.generateMipmap(C), this._bindTextureDirectly(C, null), d._useSRGBBuffer = c, d.baseWidth = p, d.baseHeight = g, d.width = p, d.height = g, d.depth = v, d.isReady = true, d.samples = h, d.generateMipMaps = s, d.samplingMode = o, d.type = a, d.format = l, d.label = u, this._internalTexturesCache.push(d), d; } /** @@ -9437,38 +9438,38 @@ var De = class _De { } _createTextureBase(e, t, i, r, s = 3, a = null, o = null, l, c, h = null, u = null, f = null, d = null, p, g, m) { e = e || ""; - const v = e.substr(0, 5) === "data:", E = e.substr(0, 5) === "blob:", C = v && e.indexOf(";base64,") !== -1, T = u || new ar(this, Dt.Url); + const v = e.substr(0, 5) === "data:", E = e.substr(0, 5) === "blob:", C = v && e.indexOf(";base64,") !== -1, T = u || new or(this, Dt.Url); T !== u && (T.label = e.substring(0, 60)); const R = e; this._transformTextureUrl && !C && !u && !h && (e = this._transformTextureUrl(e)), R !== e && (T._originalUrl = R); const x = e.lastIndexOf("."); let S = d || (x > -1 ? e.substring(x).toLowerCase() : ""), M = null; S.indexOf("?") > -1 && (S = S.split("?")[0]); - for (const K of _De._TextureLoaders) - if (K.canLoad(S, p)) { - M = K; + for (const H of _De._TextureLoaders) + if (H.canLoad(S, p)) { + M = H; break; } r && r.addPendingData(T), T.url = e, T.generateMipMaps = !t, T.samplingMode = s, T.invertY = i, T._useSRGBBuffer = this._getUseSRGBBuffer(!!m, t), this._doNotHandleContextLost || (T._buffer = h); let F = null; a && !u && (F = T.onLoadedObservable.add(a)), u || this._internalTexturesCache.push(T); - const L = (K, q) => { - r && r.removePendingData(T), e === R ? (F && T.onLoadedObservable.remove(F), st.UseFallbackTexture && e !== st.FallbackTexture && this._createTextureBase(st.FallbackTexture, t, T.invertY, r, s, null, o, l, c, h, T), K = (K || "Unknown error") + (st.UseFallbackTexture ? " - Fallback texture was used" : ""), T.onErrorObservable.notifyObservers({ message: K, exception: q }), o && o(K, q)) : (ne.Warn(`Failed to load ${e}, falling back to ${R}`), this._createTextureBase(R, t, T.invertY, r, s, a, o, l, c, h, T, f, d, p, g, m)); + const U = (H, q) => { + r && r.removePendingData(T), e === R ? (F && T.onLoadedObservable.remove(F), st.UseFallbackTexture && e !== st.FallbackTexture && this._createTextureBase(st.FallbackTexture, t, T.invertY, r, s, null, o, l, c, h, T), H = (H || "Unknown error") + (st.UseFallbackTexture ? " - Fallback texture was used" : ""), T.onErrorObservable.notifyObservers({ message: H, exception: q }), o && o(H, q)) : (ne.Warn(`Failed to load ${e}, falling back to ${R}`), this._createTextureBase(R, t, T.invertY, r, s, a, o, l, c, h, T, f, d, p, g, m)); }; if (M) { - const K = (q) => { - M.loadData(q, T, (j, k, Q, ce, de, Z) => { - Z ? L("TextureLoader failed to load data") : l(T, S, r, { width: j, height: k }, T.invertY, !Q, ce, () => (de(), false), s); + const H = (q) => { + M.loadData(q, T, (Z, k, Q, ce, de, j) => { + j ? U("TextureLoader failed to load data") : l(T, S, r, { width: Z, height: k }, T.invertY, !Q, ce, () => (de(), false), s); }, g); }; - h ? h instanceof ArrayBuffer ? K(new Uint8Array(h)) : ArrayBuffer.isView(h) ? K(h) : o && o("Unable to load: only ArrayBuffer or ArrayBufferView is supported", null) : this._loadFile(e, (q) => K(new Uint8Array(q)), void 0, r ? r.offlineProvider : void 0, true, (q, j) => { - L("Unable to load " + (q && q.responseURL, j)); + h ? h instanceof ArrayBuffer ? H(new Uint8Array(h)) : ArrayBuffer.isView(h) ? H(h) : o && o("Unable to load: only ArrayBuffer or ArrayBufferView is supported", null) : this._loadFile(e, (q) => H(new Uint8Array(q)), void 0, r ? r.offlineProvider : void 0, true, (q, Z) => { + U("Unable to load " + (q && q.responseURL, Z)); }); } else { - const K = (q) => { + const H = (q) => { E && !this._doNotHandleContextLost && (T._buffer = q), l(T, S, r, q, T.invertY, t, false, c, s); }; - !v || C ? h && (typeof h.decoding == "string" || h.close) ? K(h) : _De._FileToolsLoadImage(e, K, L, r ? r.offlineProvider : null, p, T.invertY && this._features.needsInvertingBitmap ? { imageOrientation: "flipY" } : void 0) : typeof h == "string" || h instanceof ArrayBuffer || ArrayBuffer.isView(h) || h instanceof Blob ? _De._FileToolsLoadImage(h, K, L, r ? r.offlineProvider : null, p, T.invertY && this._features.needsInvertingBitmap ? { imageOrientation: "flipY" } : void 0) : h && K(h); + !v || C ? h && (typeof h.decoding == "string" || h.close) ? H(h) : _De._FileToolsLoadImage(e, H, U, r ? r.offlineProvider : null, p, T.invertY && this._features.needsInvertingBitmap ? { imageOrientation: "flipY" } : void 0) : typeof h == "string" || h instanceof ArrayBuffer || ArrayBuffer.isView(h) || h instanceof Blob ? _De._FileToolsLoadImage(h, H, U, r ? r.offlineProvider : null, p, T.invertY && this._features.needsInvertingBitmap ? { imageOrientation: "flipY" } : void 0) : h && H(h); } return T; } @@ -9506,7 +9507,7 @@ var De = class _De { if (E.width > N || E.height > N || !this._supportsHardwareTextureRescaling) return this._prepareWorkingCanvas(), !this._workingCanvas || !this._workingContext || (this._workingCanvas.width = m, this._workingCanvas.height = v, this._workingContext.drawImage(E, 0, 0, E.width, E.height, 0, 0, m, v), x.texImage2D(x.TEXTURE_2D, 0, M.internalFormat, M.format, M.type, this._workingCanvas), T.width = m, T.height = v), false; { - const F = new ar(this, Dt.Temp); + const F = new or(this, Dt.Temp); this._bindTextureDirectly(x.TEXTURE_2D, F, true), x.texImage2D(x.TEXTURE_2D, 0, M.internalFormat, M.format, M.type, E), this._rescaleTexture(F, T, r, M.format, () => { this._releaseTexture(F), this._bindTextureDirectly(x.TEXTURE_2D, T, true), R(); }); @@ -10493,14 +10494,14 @@ var ec = class _ec extends Ba { super(e, Pc.RequestFileError), this.request = t, this.name = "RequestFileError", ba._setPrototypeOf(this, _ec.prototype); } }; -var Qu = class _Qu extends Ba { +var Ju = class _Ju extends Ba { /** * Creates a new ReadFileError * @param message defines the message of the error * @param file defines the optional file */ constructor(e, t) { - super(e, Pc.ReadFileError), this.file = t, this.name = "ReadFileError", ba._setPrototypeOf(this, _Qu.prototype); + super(e, Pc.ReadFileError), this.file = t, this.name = "ReadFileError", ba._setPrototypeOf(this, _Ju.prototype); } }; var li = { @@ -10509,7 +10510,7 @@ var li = { * When defining this function, return the wait time before trying again or return -1 to * stop retrying and error out. */ - DefaultRetryStrategy: jS.ExponentialBackoff(), + DefaultRetryStrategy: QS.ExponentialBackoff(), /** * Gets or sets the base URL to use to load assets */ @@ -10540,7 +10541,7 @@ var li = { ScriptPreprocessUrl: (n4) => n4 }; var w_ = (n4) => (n4 = n4.replace(/#/gm, "%23"), n4); -var Ju = (n4, e) => { +var $u = (n4, e) => { if (!(n4 && n4.indexOf("data:") === 0) && li.CorsBehavior) if (typeof li.CorsBehavior == "string" || li.CorsBehavior instanceof String) e.crossOrigin = li.CorsBehavior; @@ -10562,7 +10563,7 @@ var Go = (n4, e, t, i, r = "", s) => { } }; if (a != null && a._features.forceBitmapOverHTMLImageElement) - return an(o, (R) => { + return on(o, (R) => { a.createImageBitmap(new Blob([R], { type: r }), { premultiplyAlpha: "none", ...s }).then((x) => { e(x), l && URL.revokeObjectURL(o); }).catch((x) => { @@ -10572,7 +10573,7 @@ var Go = (n4, e, t, i, r = "", s) => { c(x); }), null; const h = new Image(); - Ju(o, h); + $u(o, h); const u = [], f = () => { u.forEach((R) => { R.target.addEventListener(R.name, R.handler); @@ -10594,7 +10595,7 @@ var Go = (n4, e, t, i, r = "", s) => { }; u.push({ target: h, name: "load", handler: p }), u.push({ target: h, name: "error", handler: g }), u.push({ target: document, name: "securitypolicyviolation", handler: m }), f(); const v = o.substring(0, 5) === "blob:", E = o.substring(0, 5) === "data:", C = () => { - v || E || !mi.IsCustomRequestAvailable ? h.src = o : an(o, (R, x, S) => { + v || E || !mi.IsCustomRequestAvailable ? h.src = o : on(o, (R, x, S) => { const M = !r && S ? S : r, N = new Blob([R], { type: M }), F = URL.createObjectURL(N); l = true, h.src = F; }, void 0, i || void 0, true, (R, x) => { @@ -10633,12 +10634,12 @@ var go = (n4, e, t, i, r) => { abort: () => s.abort() }; return s.onloadend = () => a.onCompleteObservable.notifyObservers(a), r && (s.onerror = () => { - r(new Qu(`Unable to read ${n4.name}`, n4)); + r(new Ju(`Unable to read ${n4.name}`, n4)); }), s.onload = (o) => { e(o.target.result); }, t && (s.onprogress = t), i ? s.readAsArrayBuffer(n4) : s.readAsText(n4), a; }; -var an = (n4, e, t, i, r, s, a) => { +var on = (n4, e, t, i, r, s, a) => { if (n4.name) return go(n4, e, t, r, s ? (h) => { s(void 0, h); @@ -10651,7 +10652,7 @@ var an = (n4, e, t, i, r, s, a) => { if (u) return go(u, e, t, r, s ? (f) => s(void 0, new $l(f.message, f.file)) : void 0); } - const { match: l, type: c } = _y(o); + const { match: l, type: c } = Ey(o); if (l) { const h = { onCompleteObservable: new he(), @@ -10659,7 +10660,7 @@ var an = (n4, e, t, i, r, s, a) => { } }; try { - const u = r ? ef(o) : B_(o); + const u = r ? tf(o) : B_(o); e(u, void 0, c); } catch (u) { s ? s(void 0, u) : ne.Error(u.message || "Failed to parse the Data URL"); @@ -10668,13 +10669,13 @@ var an = (n4, e, t, i, r, s, a) => { h.onCompleteObservable.notifyObservers(h); }), h; } - return $u(o, (h, u) => { + return ef(o, (h, u) => { e(h, u == null ? void 0 : u.responseURL, u == null ? void 0 : u.getResponseHeader("content-type")); }, t, i, r, s ? (h) => { s(h.request, new $l(h.message, h.request)); } : void 0, a); }; -var $u = (n4, e, t, i, r, s, a) => { +var ef = (n4, e, t, i, r, s, a) => { n4 = w_(n4), n4 = li.PreprocessUrl(n4); const o = li.BaseUrl + n4; let l = false; @@ -10747,20 +10748,20 @@ var $u = (n4, e, t, i, r, s, a) => { }; var U_ = () => typeof location < "u" && location.protocol === "file:"; var V_ = (n4) => L_.test(n4); -var _y = (n4) => { +var Ey = (n4) => { const e = L_.exec(n4); return e === null || e.length === 0 ? { match: false, type: "" } : { match: true, type: e[0].replace("data:", "").replace("base64,", "") }; }; -function ef(n4) { - return QS(n4.split(",")[1]); +function tf(n4) { + return JS(n4.split(",")[1]); } var B_ = (n4) => N_(n4.split(",")[1]); -var Ey = () => { - De._FileToolsLoadImage = Go, De._FileToolsLoadFile = an, hs._FileToolsLoadFile = an; +var vy = () => { + De._FileToolsLoadImage = Go, De._FileToolsLoadFile = on, hs._FileToolsLoadFile = on; }; -Ey(); +vy(); var $a; -var vy = (n4, e, t, i, r, s, a, o, l, c) => { +var Ty = (n4, e, t, i, r, s, a, o, l, c) => { $a = { DecodeBase64UrlToBinary: n4, DecodeBase64UrlToString: e, @@ -10805,7 +10806,7 @@ var vy = (n4, e, t, i, r, s, a, o, l, c) => { } }); }; -vy(ef, B_, li, V_, U_, an, Go, go, $u, Ju); +Ty(tf, B_, li, V_, U_, on, Go, go, ef, $u); var k_ = {}; function Re(n4, e) { k_[n4] = e; @@ -10834,7 +10835,7 @@ var lo = class { } }; lo.RegisteredExternalClasses = {}; -function tf() { +function rf() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (n4) => { const e = Math.random() * 16 | 0; return (n4 === "x" ? e : e & 3 | 8).toString(16); @@ -11068,7 +11069,7 @@ var ge = class _ge { * @param element.crossOrigin */ static SetCorsBehavior(e, t) { - Ju(e, t); + $u(e, t); } /** * Sets the referrerPolicy behavior on a dom element. @@ -11121,7 +11122,7 @@ var ge = class _ge { * @returns a file request object */ static LoadFile(e, t, i, r, s, a) { - return an(e, t, i, r, s, a); + return on(e, t, i, r, s, a); } /** * Loads a file from a url @@ -11131,7 +11132,7 @@ var ge = class _ge { */ static LoadFileAsync(e, t = true) { return new Promise((i, r) => { - an(e, (s) => { + on(e, (s) => { i(s); }, void 0, void 0, t, (s, a) => { r(a); @@ -11566,7 +11567,7 @@ var ge = class _ge { * @returns a pseudo random id */ static RandomId() { - return tf(); + return rf(); } /** * Test if the given uri is a base64 string @@ -11584,7 +11585,7 @@ var ge = class _ge { * @returns The decoded base64 data. */ static DecodeBase64(e) { - return ef(e); + return tf(e); } /** * Gets a value indicating the number of loading errors @@ -11899,7 +11900,7 @@ var Li = class _Li { } }; Li._GlobalId = 0; -var xn = class extends Li { +var Cn = class extends Li { constructor() { super(...arguments), this._duplicateId = 0; } @@ -11941,7 +11942,7 @@ var xn = class extends Li { } } }; -var jp = class { +var Qp = class { constructor() { this._count = 0, this._data = {}; } @@ -12067,7 +12068,7 @@ var jp = class { return null; } }; -var Rn = class _Rn { +var Sn = class _Sn { /** * Evaluate a query * @param query defines the query to evaluate @@ -12075,7 +12076,7 @@ var Rn = class _Rn { * @returns true if the query matches */ static Eval(e, t) { - return e.match(/\([^()]*\)/g) ? e = e.replace(/\([^()]*\)/g, (i) => (i = i.slice(1, i.length - 1), _Rn._HandleParenthesisContent(i, t))) : e = _Rn._HandleParenthesisContent(e, t), e === "true" ? true : e === "false" ? false : _Rn.Eval(e, t); + return e.match(/\([^()]*\)/g) ? e = e.replace(/\([^()]*\)/g, (i) => (i = i.slice(1, i.length - 1), _Sn._HandleParenthesisContent(i, t))) : e = _Sn._HandleParenthesisContent(e, t), e === "true" ? true : e === "false" ? false : _Sn.Eval(e, t); } static _HandleParenthesisContent(e, t) { t = t || ((s) => s === "true"); @@ -12083,11 +12084,11 @@ var Rn = class _Rn { const r = e.split("||"); for (const s in r) if (Object.prototype.hasOwnProperty.call(r, s)) { - let a = _Rn._SimplifyNegation(r[s].trim()); + let a = _Sn._SimplifyNegation(r[s].trim()); const o = a.split("&&"); if (o.length > 1) for (let l = 0; l < o.length; ++l) { - const c = _Rn._SimplifyNegation(o[l].trim()); + const c = _Sn._SimplifyNegation(o[l].trim()); if (c !== "true" && c !== "false" ? c[0] === "!" ? i = !t(c.substring(1)) : i = t(c) : i = c === "true", !i) { a = "false"; break; @@ -12195,7 +12196,7 @@ var rt = class _rt { * @returns a boolean */ static MatchesQuery(e, t) { - return t === void 0 ? true : t === "" ? _rt.HasTags(e) : Rn.Eval(t, (i) => _rt.HasTags(e) && e._tags[i]); + return t === void 0 ? true : t === "" ? _rt.HasTags(e) : Sn.Eval(t, (i) => _rt.HasTags(e) && e._tags[i]); } }; var kl = 1 / 2.2; @@ -12224,7 +12225,7 @@ var vi = class _vi { return _vi.BuildArray(e, t); } }; -function Ty(n4, e, t) { +function xy(n4, e, t) { const i = n4[e]; if (typeof i != "function") return null; @@ -12240,9 +12241,9 @@ function Ty(n4, e, t) { a ? (s.next = a, a.previous = s) : (s.next = void 0, n4[e] = s), r.next = void 0, r.previous = void 0; }; } -var xy = ["push", "splice", "pop", "shift", "unshift"]; +var Cy = ["push", "splice", "pop", "shift", "unshift"]; function z_(n4, e) { - const t = xy.map((i) => Ty(n4, i, e)); + const t = Cy.map((i) => xy(n4, i, e)); return () => { t.forEach((i) => { i == null || i(); @@ -12252,7 +12253,7 @@ function z_(n4, e) { function Ii(n4, e, t = 1401298e-51) { return Math.abs(n4 - e) <= t; } -function Zt(n4, e) { +function jt(n4, e) { return n4 === e ? n4 : Math.random() * (e - n4) + n4; } function W_(n4, e, t) { @@ -12264,7 +12265,7 @@ function ii(n4, e = 0, t = 1) { function G_(n4) { return n4 -= Math.PI * 2 * Math.floor((n4 + Math.PI) / (Math.PI * 2)), n4; } -function Kr(n4) { +function qr(n4) { const e = n4.toString(16); return n4 <= 15 ? ("0" + e).toUpperCase() : e.toUpperCase(); } @@ -12783,7 +12784,7 @@ var me = class _me { * @returns a Vector2 with random values between min and max */ static Random(e = 0, t = 1) { - return new _me(Zt(e, t), Zt(e, t)); + return new _me(jt(e, t), jt(e, t)); } /** * Sets a Vector2 with random values between min and max @@ -12793,7 +12794,7 @@ var me = class _me { * @returns the ref with random values between min and max */ static RandomToRef(e = 0, t = 1, i) { - return i.copyFromFloats(Zt(e, t), Zt(e, t)); + return i.copyFromFloats(jt(e, t), jt(e, t)); } /** * Gets a zero Vector2 that must not be updated @@ -14050,7 +14051,7 @@ var _ = class __2 { * @returns a Vector3 with random values between min and max */ static Random(e = 0, t = 1) { - return new __2(Zt(e, t), Zt(e, t), Zt(e, t)); + return new __2(jt(e, t), jt(e, t), jt(e, t)); } /** * Sets a Vector3 with random values between min and max @@ -14060,7 +14061,7 @@ var _ = class __2 { * @returns the ref with random values between min and max */ static RandomToRef(e = 0, t = 1, i) { - return i.copyFromFloats(Zt(e, t), Zt(e, t), Zt(e, t)); + return i.copyFromFloats(jt(e, t), jt(e, t), jt(e, t)); } /** * Returns a new Vector3 set with the result of the transformation by the given matrix of the given vector. @@ -14352,7 +14353,7 @@ var _ = class __2 { */ static ProjectToRef(e, t, i, r, s) { const a = r.width, o = r.height, l = r.x, c = r.y, h = be.Matrix[1]; - w.FromValuesToRef(a / 2, 0, 0, 0, 0, -o / 2, 0, 0, 0, 0, 0.5, 0, l + a / 2, o / 2 + c, 0.5, 1, h); + L.FromValuesToRef(a / 2, 0, 0, 0, 0, -o / 2, 0, 0, 0, 0, 0.5, 0, l + a / 2, o / 2 + c, 0.5, 1, h); const u = be.Matrix[0]; return t.multiplyToRef(i, u), u.multiplyToRef(h, u), __2.TransformCoordinatesToRef(e, u, s), s; } @@ -14395,7 +14396,7 @@ var _ = class __2 { * @returns the new Vector3 */ static UnprojectFromTransform(e, t, i, r, s) { - return this.Unproject(e, t, i, r, s, w.IdentityReadOnly); + return this.Unproject(e, t, i, r, s, L.IdentityReadOnly); } /** * Unproject from screen space to object space @@ -14530,24 +14531,24 @@ var _ = class __2 { S.copyFrom(E).subtractInPlace(i), __2.CrossToRef(T, S, x), M = __2.Dot(x, c); const F = M; S.copyFrom(E).subtractInPlace(r), __2.CrossToRef(R, S, x), M = __2.Dot(x, c); - const L = M, K = be.Vector3[10]; - let q, j; - N > 0 && F < 0 ? (K.copyFrom(a), q = t, j = i) : F > 0 && L < 0 ? (K.copyFrom(l), q = i, j = r) : (K.copyFrom(o).scaleInPlace(-1), q = r, j = t); + const U = M, H = be.Vector3[10]; + let q, Z; + N > 0 && F < 0 ? (H.copyFrom(a), q = t, Z = i) : F > 0 && U < 0 ? (H.copyFrom(l), q = i, Z = r) : (H.copyFrom(o).scaleInPlace(-1), q = r, Z = t); const k = be.Vector3[9], Q = be.Vector3[4]; - if (q.subtractToRef(E, x), j.subtractToRef(E, k), __2.CrossToRef(x, k, Q), !(__2.Dot(Q, c) < 0)) + if (q.subtractToRef(E, x), Z.subtractToRef(E, k), __2.CrossToRef(x, k, Q), !(__2.Dot(Q, c) < 0)) return s.copyFrom(E), Math.abs(g * m); const de = be.Vector3[5]; - __2.CrossToRef(K, Q, de), de.normalize(); - const Z = be.Vector3[9]; - Z.copyFrom(q).subtractInPlace(E); - const J = Z.length(); + __2.CrossToRef(H, Q, de), de.normalize(); + const j = be.Vector3[9]; + j.copyFrom(q).subtractInPlace(E); + const J = j.length(); if (J < xt) return s.copyFrom(q), __2.Distance(e, q); - Z.normalizeFromLength(J); - const O = __2.Dot(de, Z), G = be.Vector3[7]; - G.copyFrom(E).addInPlace(de.scaleInPlace(J * O)), x.copyFrom(G).subtractInPlace(q), g = K.length(), K.normalizeFromLength(g); - let ee = __2.Dot(x, K) / Math.max(g, xt); - return ee = ii(ee, 0, 1), G.copyFrom(q).addInPlace(K.scaleInPlace(ee * g)), s.copyFrom(G), __2.Distance(e, G); + j.normalizeFromLength(J); + const O = __2.Dot(de, j), G = be.Vector3[7]; + G.copyFrom(E).addInPlace(de.scaleInPlace(J * O)), x.copyFrom(G).subtractInPlace(q), g = H.length(), H.normalizeFromLength(g); + let ee = __2.Dot(x, H) / Math.max(g, xt); + return ee = ii(ee, 0, 1), G.copyFrom(q).addInPlace(H.scaleInPlace(ee * g)), s.copyFrom(G), __2.Distance(e, G); } /** * Returns a new Vector3 located at the center between "value1" and "value2" @@ -15143,7 +15144,7 @@ var Ke = class _Ke { * @returns a Vector4 with random values between min and max */ static Random(e = 0, t = 1) { - return new _Ke(Zt(e, t), Zt(e, t), Zt(e, t), Zt(e, t)); + return new _Ke(jt(e, t), jt(e, t), jt(e, t), jt(e, t)); } /** * Sets a Vector4 with random values between min and max @@ -15153,7 +15154,7 @@ var Ke = class _Ke { * @returns the ref with random values between min and max */ static RandomToRef(e = 0, t = 1, i) { - return i.copyFromFloats(Zt(e, t), Zt(e, t), Zt(e, t), Zt(e, t)); + return i.copyFromFloats(jt(e, t), jt(e, t), jt(e, t), jt(e, t)); } /** * Returns a new Vector4 set with the coordinates of "value", if the vector "value" is in the cube defined by the vectors "min" and "max" @@ -15862,7 +15863,7 @@ var Ce = class _Ce { * @returns the updated matrix with the rotation */ toRotationMatrix(e) { - return w.FromQuaternionToRef(this, e), e; + return L.FromQuaternionToRef(this, e), e; } /** * Updates the current quaternion from the given rotation matrix values @@ -16166,7 +16167,7 @@ var Ce = class _Ce { */ static RotationQuaternionFromAxisToRef(e, t, i, r) { const s = be.Matrix[0]; - return w.FromXYZAxesToRef(e.normalize(), t.normalize(), i.normalize(), s), _Ce.FromRotationMatrixToRef(s, r), r; + return L.FromXYZAxesToRef(e.normalize(), t.normalize(), i.normalize(), s), _Ce.FromRotationMatrixToRef(s, r), r; } /** * Creates a new rotation value to orient an object to look towards the given forward direction, the up direction being oriented like "up". @@ -16191,7 +16192,7 @@ var Ce = class _Ce { */ static FromLookDirectionLHToRef(e, t, i) { const r = be.Matrix[0]; - return w.LookDirectionLHToRef(e, t, r), _Ce.FromRotationMatrixToRef(r, i), i; + return L.LookDirectionLHToRef(e, t, r), _Ce.FromRotationMatrixToRef(r, i), i; } /** * Creates a new rotation value to orient an object to look towards the given forward direction, the up direction being oriented like "up". @@ -16216,7 +16217,7 @@ var Ce = class _Ce { */ static FromLookDirectionRHToRef(e, t, i) { const r = be.Matrix[0]; - return w.LookDirectionRHToRef(e, t, r), _Ce.FromRotationMatrixToRef(r, i); + return L.LookDirectionRHToRef(e, t, r), _Ce.FromRotationMatrixToRef(r, i); } /** * Interpolates between two quaternions @@ -16344,7 +16345,7 @@ var Ce = class _Ce { * @returns a Quaternion with random values between min and max */ static Random(e = 0, t = 1) { - return new _Ce(Zt(e, t), Zt(e, t), Zt(e, t), Zt(e, t)); + return new _Ce(jt(e, t), jt(e, t), jt(e, t), jt(e, t)); } /** * Sets a Quaternion with random values between min and max @@ -16354,7 +16355,7 @@ var Ce = class _Ce { * @returns the ref with random values between min and max */ static RandomToRef(e = 0, t = 1, i) { - return i.copyFromFloats(Zt(e, t), Zt(e, t), Zt(e, t), Zt(e, t)); + return i.copyFromFloats(jt(e, t), jt(e, t), jt(e, t), jt(e, t)); } /** * Do not use @@ -16413,7 +16414,7 @@ Object.defineProperties(Ce.prototype, { dimension: { value: [4] }, rank: { value: 1 } }); -var w = class _w2 { +var L = class _L2 { /** * Gets the precision of matrix computations */ @@ -16430,7 +16431,7 @@ var w = class _w2 { * Update the updateFlag to indicate that the matrix has been updated */ markAsUpdated() { - this.updateFlag = _w2._UpdateFlagSeed++, this._isIdentity = false, this._isIdentity3x2 = false, this._isIdentityDirty = true, this._isIdentity3x2Dirty = true; + this.updateFlag = _L2._UpdateFlagSeed++, this._isIdentity = false, this._isIdentity3x2 = false, this._isIdentityDirty = true, this._isIdentity3x2Dirty = true; } _updateIdentityStatus(e, t = false, i = false, r = true) { this._isIdentity = e, this._isIdentity3x2 = e || i, this._isIdentityDirty = this._isIdentity ? false : t, this._isIdentity3x2Dirty = this._isIdentity3x2 ? false : r; @@ -16469,8 +16470,8 @@ var w = class _w2 { determinant() { if (this._isIdentity === true) return 1; - const e = this._m, t = e[0], i = e[1], r = e[2], s = e[3], a = e[4], o = e[5], l = e[6], c = e[7], h = e[8], u = e[9], f = e[10], d = e[11], p = e[12], g = e[13], m = e[14], v = e[15], E = f * v - m * d, C = u * v - g * d, T = u * m - g * f, R = h * v - p * d, x = h * m - f * p, S = h * g - p * u, M = +(o * E - l * C + c * T), N = -(a * E - l * R + c * x), F = +(a * C - o * R + c * S), L = -(a * T - o * x + l * S); - return t * M + i * N + r * F + s * L; + const e = this._m, t = e[0], i = e[1], r = e[2], s = e[3], a = e[4], o = e[5], l = e[6], c = e[7], h = e[8], u = e[9], f = e[10], d = e[11], p = e[12], g = e[13], m = e[14], v = e[15], E = f * v - m * d, C = u * v - g * d, T = u * m - g * f, R = h * v - p * d, x = h * m - f * p, S = h * g - p * u, M = +(o * E - l * C + c * T), N = -(a * E - l * R + c * x), F = +(a * C - o * R + c * S), U = -(a * T - o * x + l * S); + return t * M + i * N + r * F + s * U; } // Methods /** @@ -16500,10 +16501,10 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; return this._m; } fromArray(e, t = 0) { - return _w2.FromArrayToRef(e, t, this); + return _L2.FromArrayToRef(e, t, this); } copyFromFloats(...e) { - return _w2.FromArrayToRef(e, 0, this); + return _L2.FromArrayToRef(e, 0, this); } set(...e) { const t = this._m; @@ -16530,7 +16531,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the current matrix */ reset() { - return _w2.FromValuesToRef(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, this), this._updateIdentityStatus(false), this; + return _L2.FromValuesToRef(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, this), this._updateIdentityStatus(false), this; } /** * Adds the current matrix with a second one @@ -16614,12 +16615,12 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ invertToRef(e) { if (this._isIdentity === true) - return _w2.IdentityToRef(e), e; - const t = this._m, i = t[0], r = t[1], s = t[2], a = t[3], o = t[4], l = t[5], c = t[6], h = t[7], u = t[8], f = t[9], d = t[10], p = t[11], g = t[12], m = t[13], v = t[14], E = t[15], C = d * E - v * p, T = f * E - m * p, R = f * v - m * d, x = u * E - g * p, S = u * v - d * g, M = u * m - g * f, N = +(l * C - c * T + h * R), F = -(o * C - c * x + h * S), L = +(o * T - l * x + h * M), K = -(o * R - l * S + c * M), q = i * N + r * F + s * L + a * K; + return _L2.IdentityToRef(e), e; + const t = this._m, i = t[0], r = t[1], s = t[2], a = t[3], o = t[4], l = t[5], c = t[6], h = t[7], u = t[8], f = t[9], d = t[10], p = t[11], g = t[12], m = t[13], v = t[14], E = t[15], C = d * E - v * p, T = f * E - m * p, R = f * v - m * d, x = u * E - g * p, S = u * v - d * g, M = u * m - g * f, N = +(l * C - c * T + h * R), F = -(o * C - c * x + h * S), U = +(o * T - l * x + h * M), H = -(o * R - l * S + c * M), q = i * N + r * F + s * U + a * H; if (q === 0) return e.copyFrom(this), e; - const j = 1 / q, k = c * E - v * h, Q = l * E - m * h, ce = l * v - m * c, de = o * E - g * h, Z = o * v - g * c, J = o * m - g * l, O = c * p - d * h, G = l * p - f * h, ee = l * d - f * c, _e = o * p - u * h, Oe = o * d - u * c, ze = o * f - u * l, fe = -(r * C - s * T + a * R), Te = +(i * C - s * x + a * S), Fe = -(i * T - r * x + a * M), Se = +(i * R - r * S + s * M), qe = +(r * k - s * Q + a * ce), ue = -(i * k - s * de + a * Z), Ye = +(i * Q - r * de + a * J), lt = -(i * ce - r * Z + s * J), Ut = -(r * O - s * G + a * ee), Ct = +(i * O - s * _e + a * Oe), Bi = -(i * G - r * _e + a * ze), hi = +(i * ee - r * Oe + s * ze); - return _w2.FromValuesToRef(N * j, fe * j, qe * j, Ut * j, F * j, Te * j, ue * j, Ct * j, L * j, Fe * j, Ye * j, Bi * j, K * j, Se * j, lt * j, hi * j, e), e; + const Z = 1 / q, k = c * E - v * h, Q = l * E - m * h, ce = l * v - m * c, de = o * E - g * h, j = o * v - g * c, J = o * m - g * l, O = c * p - d * h, G = l * p - f * h, ee = l * d - f * c, _e = o * p - u * h, Oe = o * d - u * c, ze = o * f - u * l, fe = -(r * C - s * T + a * R), Te = +(i * C - s * x + a * S), Fe = -(i * T - r * x + a * M), Se = +(i * R - r * S + s * M), qe = +(r * k - s * Q + a * ce), ue = -(i * k - s * de + a * j), Ye = +(i * Q - r * de + a * J), lt = -(i * ce - r * j + s * J), Ut = -(r * O - s * G + a * ee), Ct = +(i * O - s * _e + a * Oe), Bi = -(i * G - r * _e + a * ze), hi = +(i * ee - r * Oe + s * ze); + return _L2.FromValuesToRef(N * Z, fe * Z, qe * Z, Ut * Z, F * Z, Te * Z, ue * Z, Ct * Z, U * Z, Fe * Z, Ye * Z, Bi * Z, H * Z, Se * Z, lt * Z, hi * Z, e), e; } /** * add a value at the specified position in the current Matrix @@ -16695,7 +16696,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ removeRotationAndScaling() { const e = this.m; - return _w2.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, e[12], e[13], e[14], e[15], this), this._updateIdentityStatus(e[12] === 0 && e[13] === 0 && e[14] === 0 && e[15] === 1), this; + return _L2.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, e[12], e[13], e[14], e[15], this), this._updateIdentityStatus(e[12] === 0 && e[13] === 0 && e[14] === 0 && e[15] === 1), this; } /** * Copy the current matrix from the given one @@ -16771,8 +16772,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the current matrix */ multiplyToArray(e, t, i) { - const r = this._m, s = e.m, a = r[0], o = r[1], l = r[2], c = r[3], h = r[4], u = r[5], f = r[6], d = r[7], p = r[8], g = r[9], m = r[10], v = r[11], E = r[12], C = r[13], T = r[14], R = r[15], x = s[0], S = s[1], M = s[2], N = s[3], F = s[4], L = s[5], K = s[6], q = s[7], j = s[8], k = s[9], Q = s[10], ce = s[11], de = s[12], Z = s[13], J = s[14], O = s[15]; - return t[i] = a * x + o * F + l * j + c * de, t[i + 1] = a * S + o * L + l * k + c * Z, t[i + 2] = a * M + o * K + l * Q + c * J, t[i + 3] = a * N + o * q + l * ce + c * O, t[i + 4] = h * x + u * F + f * j + d * de, t[i + 5] = h * S + u * L + f * k + d * Z, t[i + 6] = h * M + u * K + f * Q + d * J, t[i + 7] = h * N + u * q + f * ce + d * O, t[i + 8] = p * x + g * F + m * j + v * de, t[i + 9] = p * S + g * L + m * k + v * Z, t[i + 10] = p * M + g * K + m * Q + v * J, t[i + 11] = p * N + g * q + m * ce + v * O, t[i + 12] = E * x + C * F + T * j + R * de, t[i + 13] = E * S + C * L + T * k + R * Z, t[i + 14] = E * M + C * K + T * Q + R * J, t[i + 15] = E * N + C * q + T * ce + R * O, this; + const r = this._m, s = e.m, a = r[0], o = r[1], l = r[2], c = r[3], h = r[4], u = r[5], f = r[6], d = r[7], p = r[8], g = r[9], m = r[10], v = r[11], E = r[12], C = r[13], T = r[14], R = r[15], x = s[0], S = s[1], M = s[2], N = s[3], F = s[4], U = s[5], H = s[6], q = s[7], Z = s[8], k = s[9], Q = s[10], ce = s[11], de = s[12], j = s[13], J = s[14], O = s[15]; + return t[i] = a * x + o * F + l * Z + c * de, t[i + 1] = a * S + o * U + l * k + c * j, t[i + 2] = a * M + o * H + l * Q + c * J, t[i + 3] = a * N + o * q + l * ce + c * O, t[i + 4] = h * x + u * F + f * Z + d * de, t[i + 5] = h * S + u * U + f * k + d * j, t[i + 6] = h * M + u * H + f * Q + d * J, t[i + 7] = h * N + u * q + f * ce + d * O, t[i + 8] = p * x + g * F + m * Z + v * de, t[i + 9] = p * S + g * U + m * k + v * j, t[i + 10] = p * M + g * H + m * Q + v * J, t[i + 11] = p * N + g * q + m * ce + v * O, t[i + 12] = E * x + C * F + T * Z + R * de, t[i + 13] = E * S + C * U + T * k + R * j, t[i + 14] = E * M + C * H + T * Q + R * J, t[i + 15] = E * N + C * q + T * ce + R * O, this; } divide(e) { return this.divideToRef(e, new this.constructor()); @@ -16932,7 +16933,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; return t && t.copyFromFloats(0, 0, 0, 1), false; if (t) { const o = 1 / e._x, l = 1 / e._y, c = 1 / e._z; - _w2.FromValuesToRef(a[0] * o, a[1] * o, a[2] * o, 0, a[4] * l, a[5] * l, a[6] * l, 0, a[8] * c, a[9] * c, a[10] * c, 0, 0, 0, 0, 1, be.Matrix[0]), Ce.FromRotationMatrixToRef(be.Matrix[0], t); + _L2.FromValuesToRef(a[0] * o, a[1] * o, a[2] * o, 0, a[4] * l, a[5] * l, a[6] * l, 0, a[8] * c, a[9] * c, a[10] * c, 0, 0, 0, 0, 1, be.Matrix[0]), Ce.FromRotationMatrixToRef(be.Matrix[0], t); } return true; } @@ -16979,7 +16980,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ transpose() { const e = new this.constructor(); - return _w2.TransposeToRef(this, e), e; + return _L2.TransposeToRef(this, e), e; } /** * Compute the transpose of the matrix and store it in a given matrix @@ -16988,7 +16989,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns result input */ transposeToRef(e) { - return _w2.TransposeToRef(this, e), e; + return _L2.TransposeToRef(this, e), e; } /** * Sets the index-th row of the current matrix with the given 4 x float values @@ -17053,7 +17054,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; const t = be.Matrix[0]; this.invertToRef(t), t.transposeToRef(e); const i = e._m; - return _w2.FromValuesToRef(i[0], i[1], i[2], 0, i[4], i[5], i[6], 0, i[8], i[9], i[10], 0, 0, 0, 0, 1, e), e; + return _L2.FromValuesToRef(i[0], i[1], i[2], 0, i[4], i[5], i[6], 0, i[8], i[9], i[10], 0, 0, 0, 0, 1, e), e; } /** * Gets only rotation part of the current matrix @@ -17071,9 +17072,9 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; getRotationMatrixToRef(e) { const t = be.Vector3[0]; if (!this.decompose(t)) - return _w2.IdentityToRef(e), e; + return _L2.IdentityToRef(e), e; const i = this._m, r = 1 / t._x, s = 1 / t._y, a = 1 / t._z; - return _w2.FromValuesToRef(i[0] * r, i[1] * r, i[2] * r, 0, i[4] * s, i[5] * s, i[6] * s, 0, i[8] * a, i[9] * a, i[10] * a, 0, 0, 0, 0, 1, e), e; + return _L2.FromValuesToRef(i[0] * r, i[1] * r, i[2] * r, 0, i[4] * s, i[5] * s, i[6] * s, 0, i[8] * a, i[9] * a, i[10] * a, 0, 0, 0, 0, 1, e), e; } /** * Toggles model matrix from being right handed to left handed in place and vice versa @@ -17100,8 +17101,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns a new Matrix set from the starting index of the given array */ static FromArray(e, t = 0) { - const i = new _w2(); - return _w2.FromArrayToRef(e, t, i), i; + const i = new _L2(); + return _L2.FromArrayToRef(e, t, i), i; } /** * Copy the content of an array into a given matrix @@ -17134,7 +17135,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * Gets an identity matrix that must not be updated */ static get IdentityReadOnly() { - return _w2._IdentityReadOnly; + return _L2._IdentityReadOnly; } /** * Stores a list of values (16) inside a given matrix @@ -17181,7 +17182,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the new matrix */ static FromValues(e, t, i, r, s, a, o, l, c, h, u, f, d, p, g, m) { - const v = new _w2(), E = v._m; + const v = new _L2(), E = v._m; return E[0] = e, E[1] = t, E[2] = i, E[3] = r, E[4] = s, E[5] = a, E[6] = o, E[7] = l, E[8] = c, E[9] = h, E[10] = u, E[11] = f, E[12] = d, E[13] = p, E[14] = g, E[15] = m, v.markAsUpdated(), v; } /** @@ -17193,8 +17194,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns a new matrix */ static Compose(e, t, i) { - const r = new _w2(); - return _w2.ComposeToRef(e, t, i, r), r; + const r = new _L2(); + return _L2.ComposeToRef(e, t, i, r), r; } /** * Sets a matrix to a value composed by merging scale (vector3), rotation (quaternion) and translation (vector3) @@ -17214,7 +17215,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns a new identity matrix */ static Identity() { - const e = _w2.FromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + const e = _L2.FromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); return e._updateIdentityStatus(true), e; } /** @@ -17223,14 +17224,14 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns result input */ static IdentityToRef(e) { - return _w2.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, e), e._updateIdentityStatus(true), e; + return _L2.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, e), e._updateIdentityStatus(true), e; } /** * Creates a new zero matrix * @returns a new zero matrix */ static Zero() { - const e = _w2.FromValues(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + const e = _L2.FromValues(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); return e._updateIdentityStatus(false), e; } /** @@ -17240,8 +17241,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the new matrix */ static RotationX(e) { - const t = new _w2(); - return _w2.RotationXToRef(e, t), t; + const t = new _L2(); + return _L2.RotationXToRef(e, t), t; } /** * Creates a new matrix as the invert of a given matrix @@ -17262,7 +17263,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static RotationXToRef(e, t) { const i = Math.sin(e), r = Math.cos(e); - return _w2.FromValuesToRef(1, 0, 0, 0, 0, r, i, 0, 0, -i, r, 0, 0, 0, 0, 1, t), t._updateIdentityStatus(r === 1 && i === 0), t; + return _L2.FromValuesToRef(1, 0, 0, 0, 0, r, i, 0, 0, -i, r, 0, 0, 0, 0, 1, t), t._updateIdentityStatus(r === 1 && i === 0), t; } /** * Creates a new rotation matrix for "angle" radians around the Y axis @@ -17271,8 +17272,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the new matrix */ static RotationY(e) { - const t = new _w2(); - return _w2.RotationYToRef(e, t), t; + const t = new _L2(); + return _L2.RotationYToRef(e, t), t; } /** * Creates a new rotation matrix for "angle" radians around the Y axis and stores it in a given matrix @@ -17283,7 +17284,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static RotationYToRef(e, t) { const i = Math.sin(e), r = Math.cos(e); - return _w2.FromValuesToRef(r, 0, -i, 0, 0, 1, 0, 0, i, 0, r, 0, 0, 0, 0, 1, t), t._updateIdentityStatus(r === 1 && i === 0), t; + return _L2.FromValuesToRef(r, 0, -i, 0, 0, 1, 0, 0, i, 0, r, 0, 0, 0, 0, 1, t), t._updateIdentityStatus(r === 1 && i === 0), t; } /** * Creates a new rotation matrix for "angle" radians around the Z axis @@ -17292,8 +17293,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the new matrix */ static RotationZ(e) { - const t = new _w2(); - return _w2.RotationZToRef(e, t), t; + const t = new _L2(); + return _L2.RotationZToRef(e, t), t; } /** * Creates a new rotation matrix for "angle" radians around the Z axis and stores it in a given matrix @@ -17304,7 +17305,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static RotationZToRef(e, t) { const i = Math.sin(e), r = Math.cos(e); - return _w2.FromValuesToRef(r, i, 0, 0, -i, r, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, t), t._updateIdentityStatus(r === 1 && i === 0), t; + return _L2.FromValuesToRef(r, i, 0, 0, -i, r, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, t), t._updateIdentityStatus(r === 1 && i === 0), t; } /** * Creates a new rotation matrix for "angle" radians around the given axis @@ -17314,8 +17315,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the new matrix */ static RotationAxis(e, t) { - const i = new _w2(); - return _w2.RotationAxisToRef(e, t, i), i; + const i = new _L2(); + return _L2.RotationAxisToRef(e, t, i), i; } /** * Creates a new rotation matrix for "angle" radians around the given axis and stores it in a given matrix @@ -17361,8 +17362,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the new rotation matrix */ static RotationYawPitchRoll(e, t, i) { - const r = new _w2(); - return _w2.RotationYawPitchRollToRef(e, t, i, r), r; + const r = new _L2(); + return _L2.RotationYawPitchRollToRef(e, t, i, r), r; } /** * Creates a rotation matrix and stores it in a given matrix @@ -17385,8 +17386,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the new matrix */ static Scaling(e, t, i) { - const r = new _w2(); - return _w2.ScalingToRef(e, t, i, r), r; + const r = new _L2(); + return _L2.ScalingToRef(e, t, i, r), r; } /** * Creates a scaling matrix and stores it in a given matrix @@ -17398,7 +17399,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns result input */ static ScalingToRef(e, t, i, r) { - return _w2.FromValuesToRef(e, 0, 0, 0, 0, t, 0, 0, 0, 0, i, 0, 0, 0, 0, 1, r), r._updateIdentityStatus(e === 1 && t === 1 && i === 1), r; + return _L2.FromValuesToRef(e, 0, 0, 0, 0, t, 0, 0, 0, 0, i, 0, 0, 0, 0, 1, r), r._updateIdentityStatus(e === 1 && t === 1 && i === 1), r; } /** * Creates a translation matrix @@ -17409,8 +17410,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the new matrix */ static Translation(e, t, i) { - const r = new _w2(); - return _w2.TranslationToRef(e, t, i, r), r; + const r = new _L2(); + return _L2.TranslationToRef(e, t, i, r), r; } /** * Creates a translation matrix and stores it in a given matrix @@ -17422,7 +17423,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns result input */ static TranslationToRef(e, t, i, r) { - return _w2.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, e, t, i, 1, r), r._updateIdentityStatus(e === 0 && t === 0 && i === 0), r; + return _L2.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, e, t, i, 1, r), r._updateIdentityStatus(e === 0 && t === 0 && i === 0), r; } /** * Returns a new Matrix whose values are the interpolated values for "gradient" (float) between the ones of the matrices "startValue" and "endValue". @@ -17434,7 +17435,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static Lerp(e, t, i) { const r = new e.constructor(); - return _w2.LerpToRef(e, t, i, r), r; + return _L2.LerpToRef(e, t, i, r), r; } /** * Set the given matrix "result" as the interpolated values for "gradient" (float) between the ones of the matrices "startValue" and "endValue". @@ -17465,7 +17466,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static DecomposeLerp(e, t, i) { const r = new e.constructor(); - return _w2.DecomposeLerpToRef(e, t, i, r), r; + return _L2.DecomposeLerpToRef(e, t, i, r), r; } /** * Update a matrix to values which are computed by: @@ -17490,7 +17491,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; const f = be.Quaternion[2]; Ce.SlerpToRef(a, c, i, f); const d = be.Vector3[5]; - return _.LerpToRef(o, h, i, d), _w2.ComposeToRef(u, f, d, r), r; + return _.LerpToRef(o, h, i, d), _L2.ComposeToRef(u, f, d, r), r; } /** * Creates a new matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera. @@ -17503,8 +17504,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the new matrix */ static LookAtLH(e, t, i) { - const r = new _w2(); - return _w2.LookAtLHToRef(e, t, i, r), r; + const r = new _L2(); + return _L2.LookAtLHToRef(e, t, i, r), r; } /** * Sets the given "result" Matrix to a matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera. @@ -17523,7 +17524,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; const l = s.lengthSquared(); l === 0 ? s.x = 1 : s.normalizeFromLength(Math.sqrt(l)), _.CrossToRef(o, s, a), a.normalize(); const c = -_.Dot(s, e), h = -_.Dot(a, e), u = -_.Dot(o, e); - return _w2.FromValuesToRef(s._x, a._x, o._x, 0, s._y, a._y, o._y, 0, s._z, a._z, o._z, 0, c, h, u, 1, r), r; + return _L2.FromValuesToRef(s._x, a._x, o._x, 0, s._y, a._y, o._y, 0, s._z, a._z, o._z, 0, c, h, u, 1, r), r; } /** * Creates a new matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera. @@ -17536,8 +17537,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the new matrix */ static LookAtRH(e, t, i) { - const r = new _w2(); - return _w2.LookAtRHToRef(e, t, i, r), r; + const r = new _L2(); + return _L2.LookAtRHToRef(e, t, i, r), r; } /** * Sets the given "result" Matrix to a matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera. @@ -17556,7 +17557,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; const l = s.lengthSquared(); l === 0 ? s.x = 1 : s.normalizeFromLength(Math.sqrt(l)), _.CrossToRef(o, s, a), a.normalize(); const c = -_.Dot(s, e), h = -_.Dot(a, e), u = -_.Dot(o, e); - return _w2.FromValuesToRef(s._x, a._x, o._x, 0, s._y, a._y, o._y, 0, s._z, a._z, o._z, 0, c, h, u, 1, r), r; + return _L2.FromValuesToRef(s._x, a._x, o._x, 0, s._y, a._y, o._y, 0, s._z, a._z, o._z, 0, c, h, u, 1, r), r; } /** * Creates a new matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0) @@ -17567,8 +17568,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the new matrix */ static LookDirectionLH(e, t) { - const i = new _w2(); - return _w2.LookDirectionLHToRef(e, t, i), i; + const i = new _L2(); + return _L2.LookDirectionLHToRef(e, t, i), i; } /** * Sets the given "result" Matrix to a matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0) @@ -17583,7 +17584,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; const r = be.Vector3[0]; r.copyFrom(e), r.scaleInPlace(-1); const s = be.Vector3[1]; - return _.CrossToRef(t, r, s), _w2.FromValuesToRef(s._x, s._y, s._z, 0, t._x, t._y, t._z, 0, r._x, r._y, r._z, 0, 0, 0, 0, 1, i), i; + return _.CrossToRef(t, r, s), _L2.FromValuesToRef(s._x, s._y, s._z, 0, t._x, t._y, t._z, 0, r._x, r._y, r._z, 0, 0, 0, 0, 1, i), i; } /** * Creates a new matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0) @@ -17594,8 +17595,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the new matrix */ static LookDirectionRH(e, t) { - const i = new _w2(); - return _w2.LookDirectionRHToRef(e, t, i), i; + const i = new _L2(); + return _L2.LookDirectionRHToRef(e, t, i), i; } /** * Sets the given "result" Matrix to a matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0) @@ -17608,7 +17609,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static LookDirectionRHToRef(e, t, i) { const r = be.Vector3[2]; - return _.CrossToRef(t, e, r), _w2.FromValuesToRef(r._x, r._y, r._z, 0, t._x, t._y, t._z, 0, e._x, e._y, e._z, 0, 0, 0, 0, 1, i), i; + return _.CrossToRef(t, e, r), _L2.FromValuesToRef(r._x, r._y, r._z, 0, t._x, t._y, t._z, 0, e._x, e._y, e._z, 0, 0, 0, 0, 1, i), i; } /** * Create a left-handed orthographic projection matrix @@ -17621,8 +17622,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns a new matrix as a left-handed orthographic projection matrix */ static OrthoLH(e, t, i, r, s) { - const a = new _w2(); - return _w2.OrthoLHToRef(e, t, i, r, a, s), a; + const a = new _L2(); + return _L2.OrthoLHToRef(e, t, i, r, a, s), a; } /** * Store a left-handed orthographic projection to a given matrix @@ -17637,7 +17638,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static OrthoLHToRef(e, t, i, r, s, a) { const o = i, l = r, c = 2 / e, h = 2 / t, u = 2 / (l - o), f = -(l + o) / (l - o); - return _w2.FromValuesToRef(c, 0, 0, 0, 0, h, 0, 0, 0, 0, u, 0, 0, 0, f, 1, s), a && s.multiplyToRef(En, s), s._updateIdentityStatus(c === 1 && h === 1 && u === 1 && f === 0), s; + return _L2.FromValuesToRef(c, 0, 0, 0, 0, h, 0, 0, 0, 0, u, 0, 0, 0, f, 1, s), a && s.multiplyToRef(vn, s), s._updateIdentityStatus(c === 1 && h === 1 && u === 1 && f === 0), s; } /** * Create a left-handed orthographic projection matrix @@ -17652,8 +17653,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns a new matrix as a left-handed orthographic projection matrix */ static OrthoOffCenterLH(e, t, i, r, s, a, o) { - const l = new _w2(); - return _w2.OrthoOffCenterLHToRef(e, t, i, r, s, a, l, o), l; + const l = new _L2(); + return _L2.OrthoOffCenterLHToRef(e, t, i, r, s, a, l, o), l; } /** * Stores a left-handed orthographic projection into a given matrix @@ -17670,7 +17671,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static OrthoOffCenterLHToRef(e, t, i, r, s, a, o, l) { const c = s, h = a, u = 2 / (t - e), f = 2 / (r - i), d = 2 / (h - c), p = -(h + c) / (h - c), g = (e + t) / (e - t), m = (r + i) / (i - r); - return _w2.FromValuesToRef(u, 0, 0, 0, 0, f, 0, 0, 0, 0, d, 0, g, m, p, 1, o), l && o.multiplyToRef(En, o), o.markAsUpdated(), o; + return _L2.FromValuesToRef(u, 0, 0, 0, 0, f, 0, 0, 0, 0, d, 0, g, m, p, 1, o), l && o.multiplyToRef(vn, o), o.markAsUpdated(), o; } /** * Stores a left-handed oblique projection into a given matrix @@ -17689,7 +17690,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static ObliqueOffCenterLHToRef(e, t, i, r, s, a, o, l, c, h, u) { const f = -o * Math.cos(l), d = -o * Math.sin(l); - return _w2.TranslationToRef(0, 0, -c, be.Matrix[1]), _w2.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, f, d, 1, 0, 0, 0, 0, 1, be.Matrix[0]), be.Matrix[1].multiplyToRef(be.Matrix[0], be.Matrix[0]), _w2.TranslationToRef(0, 0, c, be.Matrix[1]), be.Matrix[0].multiplyToRef(be.Matrix[1], be.Matrix[0]), _w2.OrthoOffCenterLHToRef(e, t, i, r, s, a, h, u), be.Matrix[0].multiplyToRef(h, h), h; + return _L2.TranslationToRef(0, 0, -c, be.Matrix[1]), _L2.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, f, d, 1, 0, 0, 0, 0, 1, be.Matrix[0]), be.Matrix[1].multiplyToRef(be.Matrix[0], be.Matrix[0]), _L2.TranslationToRef(0, 0, c, be.Matrix[1]), be.Matrix[0].multiplyToRef(be.Matrix[1], be.Matrix[0]), _L2.OrthoOffCenterLHToRef(e, t, i, r, s, a, h, u), be.Matrix[0].multiplyToRef(h, h), h; } /** * Creates a right-handed orthographic projection matrix @@ -17704,8 +17705,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns a new matrix as a right-handed orthographic projection matrix */ static OrthoOffCenterRH(e, t, i, r, s, a, o) { - const l = new _w2(); - return _w2.OrthoOffCenterRHToRef(e, t, i, r, s, a, l, o), l; + const l = new _L2(); + return _L2.OrthoOffCenterRHToRef(e, t, i, r, s, a, l, o), l; } /** * Stores a right-handed orthographic projection into a given matrix @@ -17721,7 +17722,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns result input */ static OrthoOffCenterRHToRef(e, t, i, r, s, a, o, l) { - return _w2.OrthoOffCenterLHToRef(e, t, i, r, s, a, o, l), o._m[10] *= -1, o; + return _L2.OrthoOffCenterLHToRef(e, t, i, r, s, a, o, l), o._m[10] *= -1, o; } /** * Stores a right-handed oblique projection into a given matrix @@ -17740,7 +17741,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static ObliqueOffCenterRHToRef(e, t, i, r, s, a, o, l, c, h, u) { const f = o * Math.cos(l), d = o * Math.sin(l); - return _w2.TranslationToRef(0, 0, c, be.Matrix[1]), _w2.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, f, d, 1, 0, 0, 0, 0, 1, be.Matrix[0]), be.Matrix[1].multiplyToRef(be.Matrix[0], be.Matrix[0]), _w2.TranslationToRef(0, 0, -c, be.Matrix[1]), be.Matrix[0].multiplyToRef(be.Matrix[1], be.Matrix[0]), _w2.OrthoOffCenterRHToRef(e, t, i, r, s, a, h, u), be.Matrix[0].multiplyToRef(h, h), h; + return _L2.TranslationToRef(0, 0, c, be.Matrix[1]), _L2.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, f, d, 1, 0, 0, 0, 0, 1, be.Matrix[0]), be.Matrix[1].multiplyToRef(be.Matrix[0], be.Matrix[0]), _L2.TranslationToRef(0, 0, -c, be.Matrix[1]), be.Matrix[0].multiplyToRef(be.Matrix[1], be.Matrix[0]), _L2.OrthoOffCenterRHToRef(e, t, i, r, s, a, h, u), be.Matrix[0].multiplyToRef(h, h), h; } /** * Creates a left-handed perspective projection matrix @@ -17754,8 +17755,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns a new matrix as a left-handed perspective projection matrix */ static PerspectiveLH(e, t, i, r, s, a = 0) { - const o = new _w2(), l = i, c = r, h = 2 * l / e, u = 2 * l / t, f = (c + l) / (c - l), d = -2 * c * l / (c - l), p = Math.tan(a); - return _w2.FromValuesToRef(h, 0, 0, 0, 0, u, 0, p, 0, 0, f, 1, 0, 0, d, 0, o), s && o.multiplyToRef(En, o), o._updateIdentityStatus(false), o; + const o = new _L2(), l = i, c = r, h = 2 * l / e, u = 2 * l / t, f = (c + l) / (c - l), d = -2 * c * l / (c - l), p = Math.tan(a); + return _L2.FromValuesToRef(h, 0, 0, 0, 0, u, 0, p, 0, 0, f, 1, 0, 0, d, 0, o), s && o.multiplyToRef(vn, o), o._updateIdentityStatus(false), o; } /** * Creates a left-handed perspective projection matrix @@ -17770,8 +17771,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns a new matrix as a left-handed perspective projection matrix */ static PerspectiveFovLH(e, t, i, r, s, a = 0, o = false) { - const l = new _w2(); - return _w2.PerspectiveFovLHToRef(e, t, i, r, l, true, s, a, o), l; + const l = new _L2(); + return _L2.PerspectiveFovLHToRef(e, t, i, r, l, true, s, a, o), l; } /** * Stores a left-handed perspective projection into a given matrix @@ -17789,7 +17790,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static PerspectiveFovLHToRef(e, t, i, r, s, a = true, o, l = 0, c = false) { const h = i, u = r, f = 1 / Math.tan(e * 0.5), d = a ? f / t : f, p = a ? f : f * t, g = c && h === 0 ? -1 : u !== 0 ? (u + h) / (u - h) : 1, m = c && h === 0 ? 2 * u : u !== 0 ? -2 * u * h / (u - h) : -2 * h, v = Math.tan(l); - return _w2.FromValuesToRef(d, 0, 0, 0, 0, p, 0, v, 0, 0, g, 1, 0, 0, m, 0, s), o && s.multiplyToRef(En, s), s._updateIdentityStatus(false), s; + return _L2.FromValuesToRef(d, 0, 0, 0, 0, p, 0, v, 0, 0, g, 1, 0, 0, m, 0, s), o && s.multiplyToRef(vn, s), s._updateIdentityStatus(false), s; } /** * Stores a left-handed perspective projection into a given matrix with depth reversed @@ -17806,7 +17807,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static PerspectiveFovReverseLHToRef(e, t, i, r, s, a = true, o, l = 0) { const c = 1 / Math.tan(e * 0.5), h = a ? c / t : c, u = a ? c : c * t, f = Math.tan(l); - return _w2.FromValuesToRef(h, 0, 0, 0, 0, u, 0, f, 0, 0, -i, 1, 0, 0, 1, 0, s), o && s.multiplyToRef(En, s), s._updateIdentityStatus(false), s; + return _L2.FromValuesToRef(h, 0, 0, 0, 0, u, 0, f, 0, 0, -i, 1, 0, 0, 1, 0, s), o && s.multiplyToRef(vn, s), s._updateIdentityStatus(false), s; } /** * Creates a right-handed perspective projection matrix @@ -17821,8 +17822,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns a new matrix as a right-handed perspective projection matrix */ static PerspectiveFovRH(e, t, i, r, s, a = 0, o = false) { - const l = new _w2(); - return _w2.PerspectiveFovRHToRef(e, t, i, r, l, true, s, a, o), l; + const l = new _L2(); + return _L2.PerspectiveFovRHToRef(e, t, i, r, l, true, s, a, o), l; } /** * Stores a right-handed perspective projection into a given matrix @@ -17840,7 +17841,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static PerspectiveFovRHToRef(e, t, i, r, s, a = true, o, l = 0, c = false) { const h = i, u = r, f = 1 / Math.tan(e * 0.5), d = a ? f / t : f, p = a ? f : f * t, g = c && h === 0 ? 1 : u !== 0 ? -(u + h) / (u - h) : -1, m = c && h === 0 ? 2 * u : u !== 0 ? -2 * u * h / (u - h) : -2 * h, v = Math.tan(l); - return _w2.FromValuesToRef(d, 0, 0, 0, 0, p, 0, v, 0, 0, g, -1, 0, 0, m, 0, s), o && s.multiplyToRef(En, s), s._updateIdentityStatus(false), s; + return _L2.FromValuesToRef(d, 0, 0, 0, 0, p, 0, v, 0, 0, g, -1, 0, 0, m, 0, s), o && s.multiplyToRef(vn, s), s._updateIdentityStatus(false), s; } /** * Stores a right-handed perspective projection into a given matrix @@ -17857,7 +17858,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static PerspectiveFovReverseRHToRef(e, t, i, r, s, a = true, o, l = 0) { const c = 1 / Math.tan(e * 0.5), h = a ? c / t : c, u = a ? c : c * t, f = Math.tan(l); - return _w2.FromValuesToRef(h, 0, 0, 0, 0, u, 0, f, 0, 0, -i, -1, 0, 0, -1, 0, s), o && s.multiplyToRef(En, s), s._updateIdentityStatus(false), s; + return _L2.FromValuesToRef(h, 0, 0, 0, 0, u, 0, f, 0, 0, -i, -1, 0, 0, -1, 0, s), o && s.multiplyToRef(vn, s), s._updateIdentityStatus(false), s; } /** * Computes a complete transformation matrix @@ -17871,7 +17872,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns the transformation matrix */ static GetFinalMatrix(e, t, i, r, s, a) { - const o = e.width, l = e.height, c = e.x, h = e.y, u = _w2.FromValues(o / 2, 0, 0, 0, 0, -l / 2, 0, 0, 0, 0, a - s, 0, c + o / 2, l / 2 + h, s, 1), f = new t.constructor(); + const o = e.width, l = e.height, c = e.x, h = e.y, u = _L2.FromValues(o / 2, 0, 0, 0, 0, -l / 2, 0, 0, 0, 0, a - s, 0, c + o / 2, l / 2 + h, s, 1), f = new t.constructor(); return t.multiplyToRef(i, f), f.multiplyToRef(r, f), f.multiplyToRef(u, f); } /** @@ -17900,7 +17901,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; */ static Transpose(e) { const t = new e.constructor(); - return _w2.TransposeToRef(e, t), t; + return _L2.TransposeToRef(e, t), t; } /** * Compute the transpose of a matrix and store it in a target matrix @@ -17920,8 +17921,8 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns a new matrix */ static Reflection(e) { - const t = new _w2(); - return _w2.ReflectionToRef(e, t), t; + const t = new _L2(); + return _L2.ReflectionToRef(e, t), t; } /** * Computes a reflection matrix from a plane @@ -17933,7 +17934,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; static ReflectionToRef(e, t) { e.normalize(); const i = e.normal.x, r = e.normal.y, s = e.normal.z, a = -2 * i, o = -2 * r, l = -2 * s; - return _w2.FromValuesToRef(a * i + 1, o * i, l * i, 0, a * r, o * r + 1, l * r, 0, a * s, o * s, l * s + 1, 0, a * e.d, o * e.d, l * e.d, 1, t), t; + return _L2.FromValuesToRef(a * i + 1, o * i, l * i, 0, a * r, o * r + 1, l * r, 0, a * s, o * s, l * s + 1, 0, a * e.d, o * e.d, l * e.d, 1, t), t; } /** * Sets the given matrix as a rotation matrix composed from the 3 left handed axes @@ -17944,7 +17945,7 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; * @returns result input */ static FromXYZAxesToRef(e, t, i, r) { - return _w2.FromValuesToRef(e._x, e._y, e._z, 0, t._x, t._y, t._z, 0, i._x, i._y, i._z, 0, 0, 0, 0, 1, r), r; + return _L2.FromValuesToRef(e._x, e._y, e._z, 0, t._x, t._y, t._z, 0, i._x, i._y, i._z, 0, 0, 0, 0, 1, r), r; } /** * Creates a rotation matrix from a quaternion and stores it in a target matrix @@ -17957,16 +17958,16 @@ ${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`; return t._m[0] = 1 - 2 * (r + s), t._m[1] = 2 * (a + o), t._m[2] = 2 * (l - c), t._m[3] = 0, t._m[4] = 2 * (a - o), t._m[5] = 1 - 2 * (s + i), t._m[6] = 2 * (h + u), t._m[7] = 0, t._m[8] = 2 * (l + c), t._m[9] = 2 * (h - u), t._m[10] = 1 - 2 * (r + i), t._m[11] = 0, t._m[12] = 0, t._m[13] = 0, t._m[14] = 0, t._m[15] = 1, t.markAsUpdated(), t; } }; -w._UpdateFlagSeed = 0; -w._IdentityReadOnly = w.Identity(); -Object.defineProperties(w.prototype, { +L._UpdateFlagSeed = 0; +L._IdentityReadOnly = L.Identity(); +Object.defineProperties(L.prototype, { dimension: { value: [4, 4] }, rank: { value: 2 } }); var be = class { }; be.Vector3 = vi.BuildTuple(11, _.Zero); -be.Matrix = vi.BuildTuple(2, w.Identity); +be.Matrix = vi.BuildTuple(2, L.Identity); be.Quaternion = vi.BuildTuple(3, Ce.Zero); var z = class { }; @@ -17974,12 +17975,12 @@ z.Vector2 = vi.BuildTuple(3, me.Zero); z.Vector3 = vi.BuildTuple(13, _.Zero); z.Vector4 = vi.BuildTuple(3, Ke.Zero); z.Quaternion = vi.BuildTuple(2, Ce.Zero); -z.Matrix = vi.BuildTuple(8, w.Identity); +z.Matrix = vi.BuildTuple(8, L.Identity); Re("BABYLON.Vector2", me); Re("BABYLON.Vector3", _); Re("BABYLON.Vector4", Ke); -Re("BABYLON.Matrix", w); -var En = w.FromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 1); +Re("BABYLON.Matrix", L); +var vn = L.FromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 1); var Xo = class { constructor() { this.rootNodes = [], this.cameras = [], this.lights = [], this.meshes = [], this.skeletons = [], this.particleSystems = [], this.animations = [], this.animationGroups = [], this.multiMaterials = [], this.materials = [], this.morphTargetManagers = [], this.geometries = [], this.transformNodes = [], this.actionManagers = [], this.textures = [], this._environmentTexture = null, this.postProcesses = []; @@ -18059,7 +18060,7 @@ function P(n4, e, t, i) { } var ml = {}; var Wl = {}; -function Cy(n4) { +function Ry(n4) { const e = n4.getClassName(); return Wl[e] || (Wl[e] = {}), Wl[e]; } @@ -18090,13 +18091,13 @@ function gu(n4) { } return t; } -function Lr(n4, e) { +function wr(n4, e) { return (t, i) => { - const r = Cy(t); + const r = Ry(t); r[i] || (r[i] = { type: n4, sourceName: e }); }; } -function Ry(n4, e = null) { +function Sy(n4, e = null) { return (t, i) => { const r = e || "_" + i; Object.defineProperty(t, i, { @@ -18112,45 +18113,45 @@ function Ry(n4, e = null) { }; } function oe(n4, e = null) { - return Ry(n4, e); + return Sy(n4, e); } -function U(n4) { - return Lr(0, n4); +function w(n4) { + return wr(0, n4); } function Tt(n4) { - return Lr(1, n4); + return wr(1, n4); } function $i(n4) { - return Lr(2, n4); + return wr(2, n4); } function Ho(n4) { - return Lr(3, n4); + return wr(3, n4); } function X_(n4) { - return Lr(4, n4); + return wr(4, n4); } -function cn(n4) { - return Lr(5, n4); -} -function Sy(n4) { - return Lr(6, n4); +function hn(n4) { + return wr(5, n4); } function yy(n4) { - return Lr(7, n4); -} -function H_(n4) { - return Lr(8, n4); + return wr(6, n4); } function Iy(n4) { - return Lr(9, n4); + return wr(7, n4); +} +function H_(n4) { + return wr(8, n4); } function by(n4) { - return Lr(10, n4); + return wr(9, n4); +} +function Ay(n4) { + return wr(10, n4); } function K_(n4) { - return Lr(12, n4); + return wr(12, n4); } -function on(n4, e, t, i) { +function ln(n4, e, t, i) { const r = t.value; t.value = (...s) => { let a = r; @@ -18161,8 +18162,8 @@ function on(n4, e, t, i) { return n4[e] = a, a(...s); }; } -on.filter = function(n4) { - return (e, t, i) => on(e, t, i, n4); +ln.filter = function(n4) { + return (e, t, i) => ln(e, t, i, n4); }; var je = class _je { /** @@ -18388,10 +18389,10 @@ var je = class _je { }; je.TwoPi = Math.PI * 2; je.WithinEpsilon = Ii; -je.ToHex = Kr; +je.ToHex = qr; je.Clamp = ii; je.Lerp = W_; -je.RandomRange = Zt; +je.RandomRange = jt; je.NormalizeRadians = G_; function pa(n4) { return Math.pow(n4, zl); @@ -18830,7 +18831,7 @@ var Ne = class _Ne { */ toHexString() { const e = Math.round(this.r * 255), t = Math.round(this.g * 255), i = Math.round(this.b * 255); - return "#" + Kr(e) + Kr(t) + Kr(i); + return "#" + qr(e) + qr(t) + qr(i); } /** * Converts current color in rgb space to HSV values @@ -19511,9 +19512,9 @@ var et = class _et { toHexString(e = false) { const t = Math.round(this.r * 255), i = Math.round(this.g * 255), r = Math.round(this.b * 255); if (e) - return "#" + Kr(t) + Kr(i) + Kr(r); + return "#" + qr(t) + qr(i) + qr(r); const s = Math.round(this.a * 255); - return "#" + Kr(t) + Kr(i) + Kr(r) + Kr(s); + return "#" + qr(t) + qr(i) + qr(r) + qr(s); } /** * Computes a new Color4 converted from the current one to linear space @@ -19693,13 +19694,13 @@ Object.defineProperties(et.prototype, { dimension: { value: [4] }, rank: { value: 1 } }); -var Zr = class { +var jr = class { }; -Zr.Color3 = vi.BuildArray(3, Ne.Black); -Zr.Color4 = vi.BuildArray(3, () => new et(0, 0, 0, 0)); +jr.Color3 = vi.BuildArray(3, Ne.Black); +jr.Color4 = vi.BuildArray(3, () => new et(0, 0, 0, 0)); Re("BABYLON.Color3", Ne); Re("BABYLON.Color4", et); -var Qp = function(n4, e, t, i = {}) { +var Jp = function(n4, e, t, i = {}) { const r = n4(); rt && rt.HasTags(e) && rt.AddTagsTo(r, rt.GetTags(e, true)); const s = gu(r), a = {}; @@ -19851,7 +19852,7 @@ var Le = class _Le { i && (h[a] = i.getCameraById(l)); break; case 12: - h[a] = w.FromArray(l); + h[a] = L.FromArray(l); break; } } @@ -19877,7 +19878,7 @@ var Le = class _Le { * @returns the cloned object */ static Clone(e, t, i = {}) { - return Qp(e, t, false, i); + return Jp(e, t, false, i); } /** * Instanciates a new object based on a source one (some data will be shared between both object) @@ -19886,7 +19887,7 @@ var Le = class _Le { * @returns the new object */ static Instanciate(e, t) { - return Qp(e, t, true); + return Jp(e, t, true); } }; Le.AllowLoadingUniqueId = false; @@ -20254,46 +20255,46 @@ var Xt = class _Xt { }; Xt.PrepareUniforms = q_; P([ - U() + w() ], Xt.prototype, "_globalHue", void 0); P([ - U() + w() ], Xt.prototype, "_globalDensity", void 0); P([ - U() + w() ], Xt.prototype, "_globalSaturation", void 0); P([ - U() + w() ], Xt.prototype, "_globalExposure", void 0); P([ - U() + w() ], Xt.prototype, "_highlightsHue", void 0); P([ - U() + w() ], Xt.prototype, "_highlightsDensity", void 0); P([ - U() + w() ], Xt.prototype, "_highlightsSaturation", void 0); P([ - U() + w() ], Xt.prototype, "_highlightsExposure", void 0); P([ - U() + w() ], Xt.prototype, "_midtonesHue", void 0); P([ - U() + w() ], Xt.prototype, "_midtonesDensity", void 0); P([ - U() + w() ], Xt.prototype, "_midtonesSaturation", void 0); P([ - U() + w() ], Xt.prototype, "_midtonesExposure", void 0); Le._ColorCurvesParser = Xt.Parse; -function Ay(n4, e) { +function My(n4, e) { e.EXPOSURE && n4.push("exposureLinear"), e.CONTRAST && n4.push("contrast"), e.COLORGRADING && n4.push("colorTransformSettings"), (e.VIGNETTE || e.DITHER) && n4.push("vInverseScreenSize"), e.VIGNETTE && (n4.push("vignetteSettings1"), n4.push("vignetteSettings2")), e.COLORCURVES && q_(n4), e.DITHER && n4.push("ditherIntensity"); } -function My(n4, e) { +function Py(n4, e) { e.COLORGRADING && n4.push("txColorTransform"); } var at = class _at { @@ -20627,78 +20628,78 @@ var at = class _at { }; at.TONEMAPPING_STANDARD = 0; at.TONEMAPPING_ACES = 1; -at.PrepareUniforms = Ay; -at.PrepareSamplers = My; +at.PrepareUniforms = My; +at.PrepareSamplers = Py; at._VIGNETTEMODE_MULTIPLY = 0; at._VIGNETTEMODE_OPAQUE = 1; P([ - yy() + Iy() ], at.prototype, "colorCurves", void 0); P([ - U() + w() ], at.prototype, "_colorCurvesEnabled", void 0); P([ Tt("colorGradingTexture") ], at.prototype, "_colorGradingTexture", void 0); P([ - U() + w() ], at.prototype, "_colorGradingEnabled", void 0); P([ - U() + w() ], at.prototype, "_colorGradingWithGreenDepth", void 0); P([ - U() + w() ], at.prototype, "_colorGradingBGR", void 0); P([ - U() + w() ], at.prototype, "_exposure", void 0); P([ - U() + w() ], at.prototype, "_toneMappingEnabled", void 0); P([ - U() + w() ], at.prototype, "_toneMappingType", void 0); P([ - U() + w() ], at.prototype, "_contrast", void 0); P([ - U() + w() ], at.prototype, "vignetteStretch", void 0); P([ - U() + w() ], at.prototype, "vignetteCenterX", void 0); P([ - U() + w() ], at.prototype, "vignetteCenterY", void 0); P([ - U() + w() ], at.prototype, "vignetteWeight", void 0); P([ H_() ], at.prototype, "vignetteColor", void 0); P([ - U() + w() ], at.prototype, "vignetteCameraFov", void 0); P([ - U() + w() ], at.prototype, "_vignetteBlendMode", void 0); P([ - U() + w() ], at.prototype, "_vignetteEnabled", void 0); P([ - U() + w() ], at.prototype, "_ditheringEnabled", void 0); P([ - U() + w() ], at.prototype, "_ditheringIntensity", void 0); P([ - U() + w() ], at.prototype, "_skipFinalColorClamp", void 0); P([ - U() + w() ], at.prototype, "_applyByPostProcess", void 0); P([ - U() + w() ], at.prototype, "_isEnabled", void 0); Le._ImageProcessingConfigurationParser = at.Parse; De.prototype.createUniformBuffer = function(n4, e) { @@ -21287,7 +21288,7 @@ Ie._MAX_UNIFORM_SIZE = 256; Ie._TempBuffer = new Float32Array(Ie._MAX_UNIFORM_SIZE); Ie._TempBufferInt32View = new Int32Array(Ie._TempBuffer.buffer); Ie._TempBufferUInt32View = new Uint32Array(Ie._TempBuffer.buffer); -var fr = class { +var dr = class { /** * Gets a boolean indicating if the Buffer is disposed */ @@ -21442,7 +21443,7 @@ var I = class _I2 { constructor(e, t, i, r, s, a, o, l, c, h, u = false, f = false, d = 1, p = false) { this._isDisposed = false; let g = false; - if (this.engine = e, typeof r == "object" && r !== null ? (g = r.updatable ?? false, s = r.postponeInternalCreation, a = r.stride, o = r.instanced, l = r.offset, c = r.size, h = r.type, u = r.normalized ?? false, f = r.useBytes ?? false, d = r.divisor ?? 1, p = r.takeBufferOwnership ?? false, this._label = r.label) : g = !!r, t instanceof fr ? (this._buffer = t, this._ownsBuffer = p) : (this._buffer = new fr(e, t, g, a, s, o, f, d, this._label), this._ownsBuffer = true), this.uniqueId = _I2._Counter++, this._kind = i, h === void 0) { + if (this.engine = e, typeof r == "object" && r !== null ? (g = r.updatable ?? false, s = r.postponeInternalCreation, a = r.stride, o = r.instanced, l = r.offset, c = r.size, h = r.type, u = r.normalized ?? false, f = r.useBytes ?? false, d = r.divisor ?? 1, p = r.takeBufferOwnership ?? false, this._label = r.label) : g = !!r, t instanceof dr ? (this._buffer = t, this._ownsBuffer = p) : (this._buffer = new dr(e, t, g, a, s, o, f, d, this._label), this._ownsBuffer = true), this.uniqueId = _I2._Counter++, this._kind = i, h === void 0) { const v = this.getData(); this.type = v ? _I2.GetDataType(v) : _I2.FLOAT; } else @@ -21966,27 +21967,27 @@ var mu = class { e && (e.dispose(), this._vertexBuffers[I.PositionKind] = null), this._indexBuffer && (this._scene.getEngine()._releaseBuffer(this._indexBuffer), this._indexBuffer = null); } }; -var Hr = class _Hr { +var Kr = class _Kr { /** * Set the opaque sort comparison function. * If null the sub meshes will be render in the order they were created */ set opaqueSortCompareFn(e) { - e ? this._opaqueSortCompareFn = e : this._opaqueSortCompareFn = _Hr.PainterSortCompare, this._renderOpaque = this._renderOpaqueSorted; + e ? this._opaqueSortCompareFn = e : this._opaqueSortCompareFn = _Kr.PainterSortCompare, this._renderOpaque = this._renderOpaqueSorted; } /** * Set the alpha test sort comparison function. * If null the sub meshes will be render in the order they were created */ set alphaTestSortCompareFn(e) { - e ? this._alphaTestSortCompareFn = e : this._alphaTestSortCompareFn = _Hr.PainterSortCompare, this._renderAlphaTest = this._renderAlphaTestSorted; + e ? this._alphaTestSortCompareFn = e : this._alphaTestSortCompareFn = _Kr.PainterSortCompare, this._renderAlphaTest = this._renderAlphaTestSorted; } /** * Set the transparent sort comparison function. * If null the sub meshes will be render in the order they were created */ set transparentSortCompareFn(e) { - e ? this._transparentSortCompareFn = e : this._transparentSortCompareFn = _Hr.defaultTransparentSortCompare, this._renderTransparent = this._renderTransparentSorted; + e ? this._transparentSortCompareFn = e : this._transparentSortCompareFn = _Kr.defaultTransparentSortCompare, this._renderTransparent = this._renderTransparentSorted; } /** * Creates a new rendering group. @@ -21997,7 +21998,7 @@ var Hr = class _Hr { * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied */ constructor(e, t, i = null, r = null, s = null) { - this.index = e, this._opaqueSubMeshes = new Li(256), this._transparentSubMeshes = new Li(256), this._alphaTestSubMeshes = new Li(256), this._depthOnlySubMeshes = new Li(256), this._particleSystems = new Li(256), this._spriteManagers = new Li(256), this._empty = true, this._edgesRenderers = new xn(16), this._scene = t, this.opaqueSortCompareFn = i, this.alphaTestSortCompareFn = r, this.transparentSortCompareFn = s; + this.index = e, this._opaqueSubMeshes = new Li(256), this._transparentSubMeshes = new Li(256), this._alphaTestSubMeshes = new Li(256), this._depthOnlySubMeshes = new Li(256), this._particleSystems = new Li(256), this._spriteManagers = new Li(256), this._empty = true, this._edgesRenderers = new Cn(16), this._scene = t, this.opaqueSortCompareFn = i, this.alphaTestSortCompareFn = r, this.transparentSortCompareFn = s; } /** * Render all the sub meshes contained in the group. @@ -22034,21 +22035,21 @@ var Hr = class _Hr { * @param subMeshes The submeshes to render */ _renderOpaqueSorted(e) { - _Hr._RenderSorted(e, this._opaqueSortCompareFn, this._scene.activeCamera, false); + _Kr._RenderSorted(e, this._opaqueSortCompareFn, this._scene.activeCamera, false); } /** * Renders the opaque submeshes in the order from the alphatestSortCompareFn. * @param subMeshes The submeshes to render */ _renderAlphaTestSorted(e) { - _Hr._RenderSorted(e, this._alphaTestSortCompareFn, this._scene.activeCamera, false); + _Kr._RenderSorted(e, this._alphaTestSortCompareFn, this._scene.activeCamera, false); } /** * Renders the opaque submeshes in the order from the transparentSortCompareFn. * @param subMeshes The submeshes to render */ _renderTransparentSorted(e) { - _Hr._RenderSorted(e, this._transparentSortCompareFn, this._scene.activeCamera, true); + _Kr._RenderSorted(e, this._transparentSortCompareFn, this._scene.activeCamera, true); } /** * Renders the submeshes in a specified order. @@ -22059,7 +22060,7 @@ var Hr = class _Hr { */ static _RenderSorted(e, t, i, r) { let s = 0, a; - const o = i ? i.globalPosition : _Hr._ZeroVector; + const o = i ? i.globalPosition : _Kr._ZeroVector; if (r) for (; s < e.length; s++) a = e.data[s], a._alphaIndex = a.getMesh().alphaIndex, a._distanceToCamera = _.Distance(a.getBoundingInfo().boundingSphere.centerWorld, o); @@ -22088,7 +22089,7 @@ var Hr = class _Hr { */ // eslint-disable-next-line @typescript-eslint/naming-convention static defaultTransparentSortCompare(e, t) { - return e._alphaIndex > t._alphaIndex ? 1 : e._alphaIndex < t._alphaIndex ? -1 : _Hr.backToFrontSortCompare(e, t); + return e._alphaIndex > t._alphaIndex ? 1 : e._alphaIndex < t._alphaIndex ? -1 : _Kr.backToFrontSortCompare(e, t); } /** * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent) @@ -22182,8 +22183,8 @@ var Hr = class _Hr { this._scene.onAfterSpritesRenderingObservable.notifyObservers(this._scene); } }; -Hr._ZeroVector = _.Zero(); -var Py = class { +Kr._ZeroVector = _.Zero(); +var Oy = class { }; var Di = class _Di { /** @@ -22217,7 +22218,7 @@ var Di = class _Di { * @param scene Defines the scene the groups belongs to */ constructor(e) { - this._useSceneAutoClearSetup = false, this._renderingGroups = new Array(), this._autoClearDepthStencil = {}, this._customOpaqueSortCompareFn = {}, this._customAlphaTestSortCompareFn = {}, this._customTransparentSortCompareFn = {}, this._renderingGroupInfo = new Py(), this._maintainStateBetweenFrames = false, this._scene = e; + this._useSceneAutoClearSetup = false, this._renderingGroups = new Array(), this._autoClearDepthStencil = {}, this._customOpaqueSortCompareFn = {}, this._customAlphaTestSortCompareFn = {}, this._customTransparentSortCompareFn = {}, this._renderingGroupInfo = new Oy(), this._maintainStateBetweenFrames = false, this._scene = e; for (let t = _Di.MIN_RENDERINGGROUPS; t < _Di.MAX_RENDERINGGROUPS; t++) this._autoClearDepthStencil[t] = { autoClear: true, depth: true, stencil: true }; } @@ -22300,7 +22301,7 @@ var Di = class _Di { } } _prepareRenderingGroup(e) { - this._renderingGroups[e] === void 0 && (this._renderingGroups[e] = new Hr(e, this._scene, this._customOpaqueSortCompareFn[e], this._customAlphaTestSortCompareFn[e], this._customTransparentSortCompareFn[e])); + this._renderingGroups[e] === void 0 && (this._renderingGroups[e] = new Kr(e, this._scene, this._customOpaqueSortCompareFn[e], this._customAlphaTestSortCompareFn[e], this._customTransparentSortCompareFn[e])); } /** * Add a sprite manager to the rendering manager in order to render it this frame. @@ -22485,7 +22486,7 @@ var Y_ = class { this.type = e, this.event = t; } }; -var Oy = class extends Y_ { +var Dy = class extends Y_ { /** * Instantiates a PointerInfoPre to store pointer related info to the onPrePointerObservable event. * @param type Defines the type of event (PointerEventTypes) @@ -22575,7 +22576,7 @@ var _u = class { this.type = e, this.event = t; } }; -var Jp = class extends _u { +var $p = class extends _u { /** * Defines whether the engine should skip the next onKeyboardObservable associated to this pre. * @deprecated use skipOnKeyboardObservable property instead @@ -22608,32 +22609,32 @@ var ic; (function(n4) { n4[n4.Horizontal = 0] = "Horizontal", n4[n4.Vertical = 1] = "Vertical", n4[n4.LeftClick = 2] = "LeftClick", n4[n4.MiddleClick = 3] = "MiddleClick", n4[n4.RightClick = 4] = "RightClick", n4[n4.BrowserBack = 5] = "BrowserBack", n4[n4.BrowserForward = 6] = "BrowserForward", n4[n4.MouseWheelX = 7] = "MouseWheelX", n4[n4.MouseWheelY = 8] = "MouseWheelY", n4[n4.MouseWheelZ = 9] = "MouseWheelZ", n4[n4.DeltaHorizontal = 10] = "DeltaHorizontal", n4[n4.DeltaVertical = 11] = "DeltaVertical"; })(ic || (ic = {})); -var $p; -(function(n4) { - n4[n4.Cross = 0] = "Cross", n4[n4.Circle = 1] = "Circle", n4[n4.Square = 2] = "Square", n4[n4.Triangle = 3] = "Triangle", n4[n4.L1 = 4] = "L1", n4[n4.R1 = 5] = "R1", n4[n4.L2 = 6] = "L2", n4[n4.R2 = 7] = "R2", n4[n4.Share = 8] = "Share", n4[n4.Options = 9] = "Options", n4[n4.L3 = 10] = "L3", n4[n4.R3 = 11] = "R3", n4[n4.DPadUp = 12] = "DPadUp", n4[n4.DPadDown = 13] = "DPadDown", n4[n4.DPadLeft = 14] = "DPadLeft", n4[n4.DPadRight = 15] = "DPadRight", n4[n4.Home = 16] = "Home", n4[n4.TouchPad = 17] = "TouchPad", n4[n4.LStickXAxis = 18] = "LStickXAxis", n4[n4.LStickYAxis = 19] = "LStickYAxis", n4[n4.RStickXAxis = 20] = "RStickXAxis", n4[n4.RStickYAxis = 21] = "RStickYAxis"; -})($p || ($p = {})); var eg; (function(n4) { - n4[n4.Cross = 0] = "Cross", n4[n4.Circle = 1] = "Circle", n4[n4.Square = 2] = "Square", n4[n4.Triangle = 3] = "Triangle", n4[n4.L1 = 4] = "L1", n4[n4.R1 = 5] = "R1", n4[n4.L2 = 6] = "L2", n4[n4.R2 = 7] = "R2", n4[n4.Create = 8] = "Create", n4[n4.Options = 9] = "Options", n4[n4.L3 = 10] = "L3", n4[n4.R3 = 11] = "R3", n4[n4.DPadUp = 12] = "DPadUp", n4[n4.DPadDown = 13] = "DPadDown", n4[n4.DPadLeft = 14] = "DPadLeft", n4[n4.DPadRight = 15] = "DPadRight", n4[n4.Home = 16] = "Home", n4[n4.TouchPad = 17] = "TouchPad", n4[n4.LStickXAxis = 18] = "LStickXAxis", n4[n4.LStickYAxis = 19] = "LStickYAxis", n4[n4.RStickXAxis = 20] = "RStickXAxis", n4[n4.RStickYAxis = 21] = "RStickYAxis"; + n4[n4.Cross = 0] = "Cross", n4[n4.Circle = 1] = "Circle", n4[n4.Square = 2] = "Square", n4[n4.Triangle = 3] = "Triangle", n4[n4.L1 = 4] = "L1", n4[n4.R1 = 5] = "R1", n4[n4.L2 = 6] = "L2", n4[n4.R2 = 7] = "R2", n4[n4.Share = 8] = "Share", n4[n4.Options = 9] = "Options", n4[n4.L3 = 10] = "L3", n4[n4.R3 = 11] = "R3", n4[n4.DPadUp = 12] = "DPadUp", n4[n4.DPadDown = 13] = "DPadDown", n4[n4.DPadLeft = 14] = "DPadLeft", n4[n4.DPadRight = 15] = "DPadRight", n4[n4.Home = 16] = "Home", n4[n4.TouchPad = 17] = "TouchPad", n4[n4.LStickXAxis = 18] = "LStickXAxis", n4[n4.LStickYAxis = 19] = "LStickYAxis", n4[n4.RStickXAxis = 20] = "RStickXAxis", n4[n4.RStickYAxis = 21] = "RStickYAxis"; })(eg || (eg = {})); var tg; (function(n4) { - n4[n4.A = 0] = "A", n4[n4.B = 1] = "B", n4[n4.X = 2] = "X", n4[n4.Y = 3] = "Y", n4[n4.LB = 4] = "LB", n4[n4.RB = 5] = "RB", n4[n4.LT = 6] = "LT", n4[n4.RT = 7] = "RT", n4[n4.Back = 8] = "Back", n4[n4.Start = 9] = "Start", n4[n4.LS = 10] = "LS", n4[n4.RS = 11] = "RS", n4[n4.DPadUp = 12] = "DPadUp", n4[n4.DPadDown = 13] = "DPadDown", n4[n4.DPadLeft = 14] = "DPadLeft", n4[n4.DPadRight = 15] = "DPadRight", n4[n4.Home = 16] = "Home", n4[n4.LStickXAxis = 17] = "LStickXAxis", n4[n4.LStickYAxis = 18] = "LStickYAxis", n4[n4.RStickXAxis = 19] = "RStickXAxis", n4[n4.RStickYAxis = 20] = "RStickYAxis"; + n4[n4.Cross = 0] = "Cross", n4[n4.Circle = 1] = "Circle", n4[n4.Square = 2] = "Square", n4[n4.Triangle = 3] = "Triangle", n4[n4.L1 = 4] = "L1", n4[n4.R1 = 5] = "R1", n4[n4.L2 = 6] = "L2", n4[n4.R2 = 7] = "R2", n4[n4.Create = 8] = "Create", n4[n4.Options = 9] = "Options", n4[n4.L3 = 10] = "L3", n4[n4.R3 = 11] = "R3", n4[n4.DPadUp = 12] = "DPadUp", n4[n4.DPadDown = 13] = "DPadDown", n4[n4.DPadLeft = 14] = "DPadLeft", n4[n4.DPadRight = 15] = "DPadRight", n4[n4.Home = 16] = "Home", n4[n4.TouchPad = 17] = "TouchPad", n4[n4.LStickXAxis = 18] = "LStickXAxis", n4[n4.LStickYAxis = 19] = "LStickYAxis", n4[n4.RStickXAxis = 20] = "RStickXAxis", n4[n4.RStickYAxis = 21] = "RStickYAxis"; })(tg || (tg = {})); var ig; (function(n4) { - n4[n4.B = 0] = "B", n4[n4.A = 1] = "A", n4[n4.Y = 2] = "Y", n4[n4.X = 3] = "X", n4[n4.L = 4] = "L", n4[n4.R = 5] = "R", n4[n4.ZL = 6] = "ZL", n4[n4.ZR = 7] = "ZR", n4[n4.Minus = 8] = "Minus", n4[n4.Plus = 9] = "Plus", n4[n4.LS = 10] = "LS", n4[n4.RS = 11] = "RS", n4[n4.DPadUp = 12] = "DPadUp", n4[n4.DPadDown = 13] = "DPadDown", n4[n4.DPadLeft = 14] = "DPadLeft", n4[n4.DPadRight = 15] = "DPadRight", n4[n4.Home = 16] = "Home", n4[n4.Capture = 17] = "Capture", n4[n4.LStickXAxis = 18] = "LStickXAxis", n4[n4.LStickYAxis = 19] = "LStickYAxis", n4[n4.RStickXAxis = 20] = "RStickXAxis", n4[n4.RStickYAxis = 21] = "RStickYAxis"; + n4[n4.A = 0] = "A", n4[n4.B = 1] = "B", n4[n4.X = 2] = "X", n4[n4.Y = 3] = "Y", n4[n4.LB = 4] = "LB", n4[n4.RB = 5] = "RB", n4[n4.LT = 6] = "LT", n4[n4.RT = 7] = "RT", n4[n4.Back = 8] = "Back", n4[n4.Start = 9] = "Start", n4[n4.LS = 10] = "LS", n4[n4.RS = 11] = "RS", n4[n4.DPadUp = 12] = "DPadUp", n4[n4.DPadDown = 13] = "DPadDown", n4[n4.DPadLeft = 14] = "DPadLeft", n4[n4.DPadRight = 15] = "DPadRight", n4[n4.Home = 16] = "Home", n4[n4.LStickXAxis = 17] = "LStickXAxis", n4[n4.LStickYAxis = 18] = "LStickYAxis", n4[n4.RStickXAxis = 19] = "RStickXAxis", n4[n4.RStickYAxis = 20] = "RStickYAxis"; })(ig || (ig = {})); var rg; (function(n4) { - n4[n4.PointerMove = 0] = "PointerMove", n4[n4.PointerDown = 1] = "PointerDown", n4[n4.PointerUp = 2] = "PointerUp"; + n4[n4.B = 0] = "B", n4[n4.A = 1] = "A", n4[n4.Y = 2] = "Y", n4[n4.X = 3] = "X", n4[n4.L = 4] = "L", n4[n4.R = 5] = "R", n4[n4.ZL = 6] = "ZL", n4[n4.ZR = 7] = "ZR", n4[n4.Minus = 8] = "Minus", n4[n4.Plus = 9] = "Plus", n4[n4.LS = 10] = "LS", n4[n4.RS = 11] = "RS", n4[n4.DPadUp = 12] = "DPadUp", n4[n4.DPadDown = 13] = "DPadDown", n4[n4.DPadLeft = 14] = "DPadLeft", n4[n4.DPadRight = 15] = "DPadRight", n4[n4.Home = 16] = "Home", n4[n4.Capture = 17] = "Capture", n4[n4.LStickXAxis = 18] = "LStickXAxis", n4[n4.LStickYAxis = 19] = "LStickYAxis", n4[n4.RStickXAxis = 20] = "RStickXAxis", n4[n4.RStickYAxis = 21] = "RStickYAxis"; })(rg || (rg = {})); +var sg; +(function(n4) { + n4[n4.PointerMove = 0] = "PointerMove", n4[n4.PointerDown = 1] = "PointerDown", n4[n4.PointerUp = 2] = "PointerUp"; +})(sg || (sg = {})); var Oc = class { }; Oc.DOM_DELTA_PIXEL = 0; Oc.DOM_DELTA_LINE = 1; Oc.DOM_DELTA_PAGE = 2; -var Cn = class { +var Rn = class { /** * Create device input events based on provided type and slot * @@ -22748,10 +22749,10 @@ var Cn = class { }, t.target = e, t; } }; -var Dy = class { +var Ny = class { constructor(e, t, i) { this._nativeInput = _native.DeviceInputSystem ? new _native.DeviceInputSystem(e, t, (r, s, a, o) => { - const l = Cn.CreateDeviceEvent(r, s, a, o, this); + const l = Rn.CreateDeviceEvent(r, s, a, o, this); i(r, s, l); }) : this._createDummyNativeInput(); } @@ -22793,9 +22794,9 @@ var Dy = class { }; } }; -var sg = 255; -var ng = Object.keys(Be).length / 2; -var Ny = class { +var ng = 255; +var ag = Object.keys(Be).length / 2; +var Fy = class { /** * Constructor for the WebDeviceInputSystem * @param engine Engine to reference @@ -22909,7 +22910,7 @@ var Ny = class { * @param currentY Current Y at point of adding */ _addPointerDevice(e, t, i, r) { - this._pointerActive || (this._pointerActive = true), this._registerDevice(e, t, ng); + this._pointerActive || (this._pointerActive = true), this._registerDevice(e, t, ag); const s = this._inputs[e][t]; s[0] = i, s[1] = r; } @@ -22940,7 +22941,7 @@ var Ny = class { */ _handleKeyActions() { this._keyboardDownEvent = (e) => { - this._keyboardActive || (this._keyboardActive = true, this._registerDevice(Pe.Keyboard, 0, sg)); + this._keyboardActive || (this._keyboardActive = true, this._registerDevice(Pe.Keyboard, 0, ng)); const t = this._inputs[Pe.Keyboard][0]; if (t) { t[e.keyCode] = 1; @@ -22948,14 +22949,14 @@ var Ny = class { i.inputIndex = e.keyCode, this._usingMacOS && e.metaKey && e.key !== "Meta" && (this._metaKeys.includes(e.keyCode) || this._metaKeys.push(e.keyCode)), this._onInputChanged(Pe.Keyboard, 0, i); } }, this._keyboardUpEvent = (e) => { - this._keyboardActive || (this._keyboardActive = true, this._registerDevice(Pe.Keyboard, 0, sg)); + this._keyboardActive || (this._keyboardActive = true, this._registerDevice(Pe.Keyboard, 0, ng)); const t = this._inputs[Pe.Keyboard][0]; if (t) { t[e.keyCode] = 0; const i = e; if (i.inputIndex = e.keyCode, this._usingMacOS && e.key === "Meta" && this._metaKeys.length > 0) { for (const r of this._metaKeys) { - const s = Cn.CreateDeviceEvent(Pe.Keyboard, 0, r, 0, this, this._elementToAttachTo); + const s = Rn.CreateDeviceEvent(Pe.Keyboard, 0, r, 0, this, this._elementToAttachTo); t[r] = 0, this._onInputChanged(Pe.Keyboard, 0, s); } this._metaKeys.splice(0, this._metaKeys.length); @@ -22968,7 +22969,7 @@ var Ny = class { for (let t = 0; t < e.length; t++) if (e[t] !== 0) { e[t] = 0; - const i = Cn.CreateDeviceEvent(Pe.Keyboard, 0, t, 0, this, this._elementToAttachTo); + const i = Rn.CreateDeviceEvent(Pe.Keyboard, 0, t, 0, this, this._elementToAttachTo); this._onInputChanged(Pe.Keyboard, 0, i); } this._usingMacOS && this._metaKeys.splice(0, this._metaKeys.length); @@ -23054,7 +23055,7 @@ var Ny = class { for (let c = Be.LeftClick; c <= Be.BrowserForward; c++) if (l[c] === 1) { l[c] = 0; - const h = Cn.CreateDeviceEvent(Pe.Mouse, 0, c, 0, this, this._elementToAttachTo); + const h = Rn.CreateDeviceEvent(Pe.Mouse, 0, c, 0, this, this._elementToAttachTo); this._onInputChanged(Pe.Mouse, 0, h); } } else { @@ -23062,7 +23063,7 @@ var Ny = class { if (l === -1) return; (o = (a = this._elementToAttachTo).hasPointerCapture) != null && o.call(a, i.pointerId) && this._elementToAttachTo.releasePointerCapture(i.pointerId), this._inputs[Pe.Touch][l][Be.LeftClick] = 0; - const c = Cn.CreateDeviceEvent(Pe.Touch, l, Be.LeftClick, 0, this, this._elementToAttachTo, i.pointerId); + const c = Rn.CreateDeviceEvent(Pe.Touch, l, Be.LeftClick, 0, this, this._elementToAttachTo, i.pointerId); this._onInputChanged(Pe.Touch, l, c), this._activeTouchIds[l] = -1, this._onDeviceDisconnected(Pe.Touch, l); } }, this._wheelEventName = "onwheel" in document.createElement("div") ? "wheel" : document.onmousewheel !== void 0 ? "mousewheel" : "DOMMouseScroll"; @@ -23086,7 +23087,7 @@ var Ny = class { for (let c = Be.LeftClick; c <= Be.BrowserForward; c++) if (l[c] === 1) { l[c] = 0; - const h = Cn.CreateDeviceEvent(Pe.Mouse, 0, c, 0, this, this._elementToAttachTo); + const h = Rn.CreateDeviceEvent(Pe.Mouse, 0, c, 0, this, this._elementToAttachTo); this._onInputChanged(Pe.Mouse, 0, h); } } @@ -23096,14 +23097,14 @@ var Ny = class { const h = this._activeTouchIds[c]; if ((a = (s = this._elementToAttachTo).hasPointerCapture) != null && a.call(s, h) && this._elementToAttachTo.releasePointerCapture(h), h !== -1 && ((o = l[c]) == null ? void 0 : o[Be.LeftClick]) === 1) { l[c][Be.LeftClick] = 0; - const u = Cn.CreateDeviceEvent(Pe.Touch, c, Be.LeftClick, 0, this, this._elementToAttachTo, h); + const u = Rn.CreateDeviceEvent(Pe.Touch, c, Be.LeftClick, 0, this, this._elementToAttachTo, h); this._onInputChanged(Pe.Touch, c, u), this._activeTouchIds[c] = -1, this._onDeviceDisconnected(Pe.Touch, c); } } } }, this._pointerWheelEvent = (i) => { const r = Pe.Mouse, s = 0; - this._inputs[r] || (this._inputs[r] = []), this._inputs[r][s] || (this._pointerActive = true, this._registerDevice(r, s, ng)); + this._inputs[r] || (this._inputs[r] = []), this._inputs[r][s] || (this._pointerActive = true, this._registerDevice(r, s, ag)); const a = this._inputs[r][s]; if (a) { a[Be.MouseWheelX] = i.deltaX || 0, a[Be.MouseWheelY] = i.deltaY || i.wheelDelta || 0, a[Be.MouseWheelZ] = i.deltaZ || 0; @@ -23163,7 +23164,7 @@ var Ny = class { return (e.pointerType === "touch" || e.pointerType === "pen" || e.touches) && (t = Pe.Touch), t; } }; -var ag = class { +var og = class { /** * Default Constructor * @param deviceInputSystem - Reference to DeviceInputSystem @@ -23182,14 +23183,14 @@ var ag = class { return this._deviceInputSystem.pollInput(this.deviceType, this.deviceSlot, e); } }; -var Fy = class { +var Ly = class { constructor(e) { this._registeredManagers = new Array(), this._refCount = 0, this.registerManager = (a) => { for (let o = 0; o < this._devices.length; o++) { const l = this._devices[o]; for (const c in l) { const h = +c; - a._addDevice(new ag(this._deviceInputSystem, o, h)); + a._addDevice(new og(this._deviceInputSystem, o, h)); } } this._registeredManagers.push(a); @@ -23202,7 +23203,7 @@ var Fy = class { const i = (a, o) => { this._devices[a] || (this._devices[a] = new Array()), this._devices[a][o] || (this._devices[a][o] = o); for (const l of this._registeredManagers) { - const c = new ag(this._deviceInputSystem, a, o); + const c = new og(this._deviceInputSystem, a, o); l._addDevice(c); } }, r = (a, o) => { @@ -23215,13 +23216,13 @@ var Fy = class { for (const c of this._registeredManagers) c._onInputChanged(a, o, l); }; - typeof _native < "u" ? this._deviceInputSystem = new Dy(i, r, s) : this._deviceInputSystem = new Ny(e, i, r, s); + typeof _native < "u" ? this._deviceInputSystem = new Ny(i, r, s) : this._deviceInputSystem = new Fy(e, i, r, s); } dispose() { this._deviceInputSystem.dispose(); } }; -var Ly = class { +var wy = class { // Public Functions /** * Gets a DeviceSource, given a type and slot @@ -23251,7 +23252,7 @@ var Ly = class { */ constructor(e) { const t = Object.keys(Pe).length / 2; - this._devices = new Array(t), this._firstDevice = new Array(t), this._engine = e, this._engine._deviceSourceManager || (this._engine._deviceSourceManager = new Fy(e)), this._engine._deviceSourceManager._refCount++, this.onDeviceConnectedObservable = new he((i) => { + this._devices = new Array(t), this._firstDevice = new Array(t), this._engine = e, this._engine._deviceSourceManager || (this._engine._deviceSourceManager = new Ly(e)), this._engine._deviceSourceManager._refCount++, this.onDeviceConnectedObservable = new he((i) => { for (const r of this._devices) if (r) for (const s of r) @@ -23321,7 +23322,7 @@ var Ly = class { } } }; -var og = class { +var lg = class { constructor() { this._singleClick = false, this._doubleClick = false, this._hasSwiped = false, this._ignore = false; } @@ -23421,7 +23422,7 @@ var ti = class _ti { /** @internal */ _setRayOnPointerInfo(e, t) { const i = this._scene; - e && i._pickingAvailable && (e.ray || (e.ray = i.createPickingRay(t.offsetX, t.offsetY, w.Identity(), i.activeCamera))); + e && i._pickingAvailable && (e.ray || (e.ray = i.createPickingRay(t.offsetX, t.offsetY, L.Identity(), i.activeCamera))); } /** @internal */ _addCameraPointerObserver(e, t) { @@ -23435,7 +23436,7 @@ var ti = class _ti { return !!(this._scene.onPointerObservable.observers.length > this._cameraObserverCount || this._scene.onPointerPick); } _checkPrePointerObservable(e, t, i) { - const r = this._scene, s = new Oy(i, t, this._unTranslatedPointerX, this._unTranslatedPointerY); + const r = this._scene, s = new Dy(i, t, this._unTranslatedPointerX, this._unTranslatedPointerY); return e && (s.originalPickingInfo = e, s.ray = e.ray, t.pointerType === "xr-near" && e.originMesh && (s.nearInteractionPickingInfo = e)), r.onPrePointerObservable.notifyObservers(s, i), !!s.skipOnPointerObservable; } /** @internal */ @@ -23520,7 +23521,7 @@ var ti = class _ti { simulatePointerUp(e, t, i) { const r = new PointerEvent("pointerup", t); r.inputIndex = Be.Move; - const s = new og(); + const s = new lg(); i ? s.doubleClick = true : s.singleClick = true, !this._checkPrePointerObservable(e, r, pt.POINTERUP) && this._processPointerUp(e, r, s); } _processPointerUp(e, t, i) { @@ -23571,7 +23572,7 @@ var ti = class _ti { */ attachControl(e = true, t = true, i = true, r = null) { const s = this._scene, a = s.getEngine(); - r || (r = a.getInputElement()), this._alreadyAttached && this.detachControl(), r && (this._alreadyAttachedTo = r), this._deviceSourceManager = new Ly(a), this._initActionManager = (o) => { + r || (r = a.getInputElement()), this._alreadyAttached && this.detachControl(), r && (this._alreadyAttachedTo = r), this._deviceSourceManager = new wy(a), this._initActionManager = (o) => { if (!this._meshPickProceed) { const l = s.skipPointerUpPicking || s._registeredActions === 0 && !this._checkForPicking() && !s.onPointerUp ? null : s.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, s.pointerUpPredicate, s.pointerUpFastCheck, s.cameraToUseForPointers, s.pointerUpTrianglePredicate); this._currentPickResult = l, l && (o = l.hit && l.pickedMesh ? l.pickedMesh._getActionManagerForTrigger() : null), this._meshPickProceed = true; @@ -23584,7 +23585,7 @@ var ti = class _ti { } }, this._initClickEvent = (o, l, c, h) => { var g, m; - const u = new og(); + const u = new lg(); this._currentPickResult = null; let f = null, d = o.hasSpecificMask(pt.POINTERPICK) || l.hasSpecificMask(pt.POINTERPICK) || o.hasSpecificMask(pt.POINTERTAP) || l.hasSpecificMask(pt.POINTERTAP) || o.hasSpecificMask(pt.POINTERDOUBLETAP) || l.hasSpecificMask(pt.POINTERDOUBLETAP); !d && xr && (f = this._initActionManager(f, u), f && (d = f.hasPickTriggers)); @@ -23655,7 +23656,7 @@ var ti = class _ti { }, this._onKeyDown = (o) => { const l = tc.KEYDOWN; if (s.onPreKeyboardObservable.hasObservers()) { - const c = new Jp(l, o); + const c = new $p(l, o); if (s.onPreKeyboardObservable.notifyObservers(c, l), c.skipOnKeyboardObservable) return; } @@ -23667,7 +23668,7 @@ var ti = class _ti { }, this._onKeyUp = (o) => { const l = tc.KEYUP; if (s.onPreKeyboardObservable.hasObservers()) { - const c = new Jp(l, o); + const c = new $p(l, o); if (s.onPreKeyboardObservable.notifyObservers(c, l), c.skipOnKeyboardObservable) return; } @@ -23823,7 +23824,7 @@ var us = class _us { } }; us.Enabled = true; -var qr = class _qr { +var Yr = class _Yr { /** * Creates a Plane object according to the given floats a, b, c, d and the plane equation : ax + by + cz + d = 0 * @param a a component of the plane @@ -23845,7 +23846,7 @@ var qr = class _qr { * @returns a new plane copied from the current Plane. */ clone() { - return new _qr(this.normal.x, this.normal.y, this.normal.z, this.d); + return new _Yr(this.normal.x, this.normal.y, this.normal.z, this.d); } /** * @returns the string "Plane". @@ -23875,10 +23876,10 @@ var qr = class _qr { * @returns a new Plane as the result of the transformation of the current Plane by the given matrix. */ transform(e) { - const t = _qr._TmpMatrix; + const t = _Yr._TmpMatrix; e.invertToRef(t); const i = t.m, r = this.normal.x, s = this.normal.y, a = this.normal.z, o = this.d, l = r * i[0] + s * i[1] + a * i[2] + o * i[3], c = r * i[4] + s * i[5] + a * i[6] + o * i[7], h = r * i[8] + s * i[9] + a * i[10] + o * i[11], u = r * i[12] + s * i[13] + a * i[14] + o * i[15]; - return new _qr(l, c, h, u); + return new _Yr(l, c, h, u); } /** * Compute the dot product between the point and the plane normal @@ -23927,7 +23928,7 @@ var qr = class _qr { * @returns a new Plane from the given array. */ static FromArray(e) { - return new _qr(e[0], e[1], e[2], e[3]); + return new _Yr(e[0], e[1], e[2], e[3]); } /** * Creates a plane from three points @@ -23937,7 +23938,7 @@ var qr = class _qr { * @returns a new Plane defined by the three given points. */ static FromPoints(e, t, i) { - const r = new _qr(0, 0, 0, 0); + const r = new _Yr(0, 0, 0, 0); return r.copyFromPoints(e, t, i), r; } /** @@ -23947,7 +23948,7 @@ var qr = class _qr { * @returns a new Plane the normal vector to this plane at the given origin point. */ static FromPositionAndNormal(e, t) { - const i = new _qr(0, 0, 0, 0); + const i = new _Yr(0, 0, 0, 0); return this.FromPositionAndNormalToRef(e, t, i); } /** @@ -23972,7 +23973,7 @@ var qr = class _qr { return _.Dot(i, t) + r; } }; -qr._TmpMatrix = w.Identity(); +Yr._TmpMatrix = L.Identity(); var Or = class _Or { /** * Gets the planes representing the frustum @@ -23982,7 +23983,7 @@ var Or = class _Or { static GetPlanes(e) { const t = []; for (let i = 0; i < 6; i++) - t.push(new qr(0, 0, 0, 0)); + t.push(new Yr(0, 0, 0, 0)); return _Or.GetPlanesToRef(e, t), t; } /** @@ -24060,7 +24061,7 @@ var Or = class _Or { return true; } }; -var rf = class { +var sf = class { /** * Gets an unique (relatively to the current scene) Id */ @@ -24069,7 +24070,7 @@ var rf = class { return this._UniqueIdCounter++, e; } }; -rf._UniqueIdCounter = 1; +sf._UniqueIdCounter = 1; var Et = class { /** * Sort function to order lights for rendering. @@ -24097,7 +24098,7 @@ Et.LIGHTTYPEID_POINTLIGHT = 0; Et.LIGHTTYPEID_DIRECTIONALLIGHT = 1; Et.LIGHTTYPEID_SPOTLIGHT = 2; Et.LIGHTTYPEID_HEMISPHERICLIGHT = 3; -var wy = class { +var Uy = class { constructor() { this.pointerDownFastCheck = false, this.pointerUpFastCheck = false, this.pointerMoveFastCheck = false, this.skipPointerMovePicking = false, this.skipPointerDownPicking = false, this.skipPointerUpPicking = false; } @@ -24551,7 +24552,7 @@ var Ot = class _Ot extends Xo { * @param options defines the scene options */ constructor(e, t) { - super(), this._inputManager = new ti(this), this.cameraToUseForPointers = null, this._isScene = true, this._blockEntityCollection = false, this.autoClear = true, this.autoClearDepthAndStencil = true, this.clearColor = new et(0.2, 0.2, 0.3, 1), this.ambientColor = new Ne(0, 0, 0), this.environmentIntensity = 1, this._performancePriority = fs.BackwardCompatible, this.onScenePerformancePriorityChangedObservable = new he(), this._forceWireframe = false, this._skipFrustumClipping = false, this._forcePointsCloud = false, this.animationsEnabled = true, this._animationPropertiesOverride = null, this.useConstantAnimationDeltaTime = false, this.constantlyUpdateMeshUnderPointer = false, this.hoverCursor = "pointer", this.defaultCursor = "", this.doNotHandleCursors = false, this.preventDefaultOnPointerDown = true, this.preventDefaultOnPointerUp = true, this.metadata = null, this.reservedDataStore = null, this.disableOfflineSupportExceptionRules = [], this.onDisposeObservable = new he(), this._onDisposeObserver = null, this.onBeforeRenderObservable = new he(), this._onBeforeRenderObserver = null, this.onAfterRenderObservable = new he(), this.onAfterRenderCameraObservable = new he(), this._onAfterRenderObserver = null, this.onBeforeAnimationsObservable = new he(), this.onAfterAnimationsObservable = new he(), this.onBeforeDrawPhaseObservable = new he(), this.onAfterDrawPhaseObservable = new he(), this.onReadyObservable = new he(), this.onBeforeCameraRenderObservable = new he(), this._onBeforeCameraRenderObserver = null, this.onAfterCameraRenderObservable = new he(), this._onAfterCameraRenderObserver = null, this.onBeforeActiveMeshesEvaluationObservable = new he(), this.onAfterActiveMeshesEvaluationObservable = new he(), this.onBeforeParticlesRenderingObservable = new he(), this.onAfterParticlesRenderingObservable = new he(), this.onDataLoadedObservable = new he(), this.onNewCameraAddedObservable = new he(), this.onCameraRemovedObservable = new he(), this.onNewLightAddedObservable = new he(), this.onLightRemovedObservable = new he(), this.onNewGeometryAddedObservable = new he(), this.onGeometryRemovedObservable = new he(), this.onNewTransformNodeAddedObservable = new he(), this.onTransformNodeRemovedObservable = new he(), this.onNewMeshAddedObservable = new he(), this.onMeshRemovedObservable = new he(), this.onNewSkeletonAddedObservable = new he(), this.onSkeletonRemovedObservable = new he(), this.onNewMaterialAddedObservable = new he(), this.onNewMultiMaterialAddedObservable = new he(), this.onMaterialRemovedObservable = new he(), this.onMultiMaterialRemovedObservable = new he(), this.onNewTextureAddedObservable = new he(), this.onTextureRemovedObservable = new he(), this.onBeforeRenderTargetsRenderObservable = new he(), this.onAfterRenderTargetsRenderObservable = new he(), this.onBeforeStepObservable = new he(), this.onAfterStepObservable = new he(), this.onActiveCameraChanged = new he(), this.onActiveCamerasChanged = new he(), this.onBeforeRenderingGroupObservable = new he(), this.onAfterRenderingGroupObservable = new he(), this.onMeshImportedObservable = new he(), this.onAnimationFileImportedObservable = new he(), this._registeredForLateAnimationBindings = new xn(256), this._pointerPickingConfiguration = new wy(), this.onPrePointerObservable = new he(), this.onPointerObservable = new he(), this.onPreKeyboardObservable = new he(), this.onKeyboardObservable = new he(), this._useRightHandedSystem = false, this._timeAccumulator = 0, this._currentStepId = 0, this._currentInternalStep = 0, this._fogEnabled = true, this._fogMode = _Ot.FOGMODE_NONE, this.fogColor = new Ne(0.2, 0.2, 0.3), this.fogDensity = 0.1, this.fogStart = 0, this.fogEnd = 1e3, this.needsPreviousWorldMatrices = false, this._shadowsEnabled = true, this._lightsEnabled = true, this._unObserveActiveCameras = null, this._texturesEnabled = true, this.physicsEnabled = true, this.particlesEnabled = true, this.spritesEnabled = true, this._skeletonsEnabled = true, this.lensFlaresEnabled = true, this.collisionsEnabled = true, this.gravity = new _(0, -9.807, 0), this.postProcessesEnabled = true, this.renderTargetsEnabled = true, this.dumpNextRenderTargets = false, this.customRenderTargets = [], this.importedMeshesFiles = [], this.probesEnabled = true, this._meshesForIntersections = new xn(256), this.proceduralTexturesEnabled = true, this._totalVertices = new us(), this._activeIndices = new us(), this._activeParticles = new us(), this._activeBones = new us(), this._animationTime = 0, this.animationTimeScale = 1, this._renderId = 0, this._frameId = 0, this._executeWhenReadyTimeoutId = null, this._intermediateRendering = false, this._defaultFrameBufferCleared = false, this._viewUpdateFlag = -1, this._projectionUpdateFlag = -1, this._toBeDisposed = new Array(256), this._activeRequests = new Array(), this._pendingData = new Array(), this._isDisposed = false, this.dispatchAllSubMeshesOfActiveMeshes = false, this._activeMeshes = new Li(256), this._processedMaterials = new Li(256), this._renderTargets = new xn(256), this._materialsRenderTargets = new xn(256), this._activeParticleSystems = new Li(256), this._activeSkeletons = new xn(32), this._softwareSkinnedMeshes = new xn(32), this._activeAnimatables = new Array(), this._transformMatrix = w.Zero(), this.requireLightSorting = false, this._components = [], this._serializableComponents = [], this._transientComponents = [], this._beforeCameraUpdateStage = ei.Create(), this._beforeClearStage = ei.Create(), this._beforeRenderTargetClearStage = ei.Create(), this._gatherRenderTargetsStage = ei.Create(), this._gatherActiveCameraRenderTargetsStage = ei.Create(), this._isReadyForMeshStage = ei.Create(), this._beforeEvaluateActiveMeshStage = ei.Create(), this._evaluateSubMeshStage = ei.Create(), this._preActiveMeshStage = ei.Create(), this._cameraDrawRenderTargetStage = ei.Create(), this._beforeCameraDrawStage = ei.Create(), this._beforeRenderTargetDrawStage = ei.Create(), this._beforeRenderingGroupDrawStage = ei.Create(), this._beforeRenderingMeshStage = ei.Create(), this._afterRenderingMeshStage = ei.Create(), this._afterRenderingGroupDrawStage = ei.Create(), this._afterCameraDrawStage = ei.Create(), this._afterCameraPostProcessStage = ei.Create(), this._afterRenderTargetDrawStage = ei.Create(), this._afterRenderTargetPostProcessStage = ei.Create(), this._afterRenderStage = ei.Create(), this._pointerMoveStage = ei.Create(), this._pointerDownStage = ei.Create(), this._pointerUpStage = ei.Create(), this._geometriesByUniqueId = null, this._defaultMeshCandidates = { + super(), this._inputManager = new ti(this), this.cameraToUseForPointers = null, this._isScene = true, this._blockEntityCollection = false, this.autoClear = true, this.autoClearDepthAndStencil = true, this.clearColor = new et(0.2, 0.2, 0.3, 1), this.ambientColor = new Ne(0, 0, 0), this.environmentIntensity = 1, this._performancePriority = fs.BackwardCompatible, this.onScenePerformancePriorityChangedObservable = new he(), this._forceWireframe = false, this._skipFrustumClipping = false, this._forcePointsCloud = false, this.animationsEnabled = true, this._animationPropertiesOverride = null, this.useConstantAnimationDeltaTime = false, this.constantlyUpdateMeshUnderPointer = false, this.hoverCursor = "pointer", this.defaultCursor = "", this.doNotHandleCursors = false, this.preventDefaultOnPointerDown = true, this.preventDefaultOnPointerUp = true, this.metadata = null, this.reservedDataStore = null, this.disableOfflineSupportExceptionRules = [], this.onDisposeObservable = new he(), this._onDisposeObserver = null, this.onBeforeRenderObservable = new he(), this._onBeforeRenderObserver = null, this.onAfterRenderObservable = new he(), this.onAfterRenderCameraObservable = new he(), this._onAfterRenderObserver = null, this.onBeforeAnimationsObservable = new he(), this.onAfterAnimationsObservable = new he(), this.onBeforeDrawPhaseObservable = new he(), this.onAfterDrawPhaseObservable = new he(), this.onReadyObservable = new he(), this.onBeforeCameraRenderObservable = new he(), this._onBeforeCameraRenderObserver = null, this.onAfterCameraRenderObservable = new he(), this._onAfterCameraRenderObserver = null, this.onBeforeActiveMeshesEvaluationObservable = new he(), this.onAfterActiveMeshesEvaluationObservable = new he(), this.onBeforeParticlesRenderingObservable = new he(), this.onAfterParticlesRenderingObservable = new he(), this.onDataLoadedObservable = new he(), this.onNewCameraAddedObservable = new he(), this.onCameraRemovedObservable = new he(), this.onNewLightAddedObservable = new he(), this.onLightRemovedObservable = new he(), this.onNewGeometryAddedObservable = new he(), this.onGeometryRemovedObservable = new he(), this.onNewTransformNodeAddedObservable = new he(), this.onTransformNodeRemovedObservable = new he(), this.onNewMeshAddedObservable = new he(), this.onMeshRemovedObservable = new he(), this.onNewSkeletonAddedObservable = new he(), this.onSkeletonRemovedObservable = new he(), this.onNewMaterialAddedObservable = new he(), this.onNewMultiMaterialAddedObservable = new he(), this.onMaterialRemovedObservable = new he(), this.onMultiMaterialRemovedObservable = new he(), this.onNewTextureAddedObservable = new he(), this.onTextureRemovedObservable = new he(), this.onBeforeRenderTargetsRenderObservable = new he(), this.onAfterRenderTargetsRenderObservable = new he(), this.onBeforeStepObservable = new he(), this.onAfterStepObservable = new he(), this.onActiveCameraChanged = new he(), this.onActiveCamerasChanged = new he(), this.onBeforeRenderingGroupObservable = new he(), this.onAfterRenderingGroupObservable = new he(), this.onMeshImportedObservable = new he(), this.onAnimationFileImportedObservable = new he(), this._registeredForLateAnimationBindings = new Cn(256), this._pointerPickingConfiguration = new Uy(), this.onPrePointerObservable = new he(), this.onPointerObservable = new he(), this.onPreKeyboardObservable = new he(), this.onKeyboardObservable = new he(), this._useRightHandedSystem = false, this._timeAccumulator = 0, this._currentStepId = 0, this._currentInternalStep = 0, this._fogEnabled = true, this._fogMode = _Ot.FOGMODE_NONE, this.fogColor = new Ne(0.2, 0.2, 0.3), this.fogDensity = 0.1, this.fogStart = 0, this.fogEnd = 1e3, this.needsPreviousWorldMatrices = false, this._shadowsEnabled = true, this._lightsEnabled = true, this._unObserveActiveCameras = null, this._texturesEnabled = true, this.physicsEnabled = true, this.particlesEnabled = true, this.spritesEnabled = true, this._skeletonsEnabled = true, this.lensFlaresEnabled = true, this.collisionsEnabled = true, this.gravity = new _(0, -9.807, 0), this.postProcessesEnabled = true, this.renderTargetsEnabled = true, this.dumpNextRenderTargets = false, this.customRenderTargets = [], this.importedMeshesFiles = [], this.probesEnabled = true, this._meshesForIntersections = new Cn(256), this.proceduralTexturesEnabled = true, this._totalVertices = new us(), this._activeIndices = new us(), this._activeParticles = new us(), this._activeBones = new us(), this._animationTime = 0, this.animationTimeScale = 1, this._renderId = 0, this._frameId = 0, this._executeWhenReadyTimeoutId = null, this._intermediateRendering = false, this._defaultFrameBufferCleared = false, this._viewUpdateFlag = -1, this._projectionUpdateFlag = -1, this._toBeDisposed = new Array(256), this._activeRequests = new Array(), this._pendingData = new Array(), this._isDisposed = false, this.dispatchAllSubMeshesOfActiveMeshes = false, this._activeMeshes = new Li(256), this._processedMaterials = new Li(256), this._renderTargets = new Cn(256), this._materialsRenderTargets = new Cn(256), this._activeParticleSystems = new Li(256), this._activeSkeletons = new Cn(32), this._softwareSkinnedMeshes = new Cn(32), this._activeAnimatables = new Array(), this._transformMatrix = L.Zero(), this.requireLightSorting = false, this._components = [], this._serializableComponents = [], this._transientComponents = [], this._beforeCameraUpdateStage = ei.Create(), this._beforeClearStage = ei.Create(), this._beforeRenderTargetClearStage = ei.Create(), this._gatherRenderTargetsStage = ei.Create(), this._gatherActiveCameraRenderTargetsStage = ei.Create(), this._isReadyForMeshStage = ei.Create(), this._beforeEvaluateActiveMeshStage = ei.Create(), this._evaluateSubMeshStage = ei.Create(), this._preActiveMeshStage = ei.Create(), this._cameraDrawRenderTargetStage = ei.Create(), this._beforeCameraDrawStage = ei.Create(), this._beforeRenderTargetDrawStage = ei.Create(), this._beforeRenderingGroupDrawStage = ei.Create(), this._beforeRenderingMeshStage = ei.Create(), this._afterRenderingMeshStage = ei.Create(), this._afterRenderingGroupDrawStage = ei.Create(), this._afterCameraDrawStage = ei.Create(), this._afterCameraPostProcessStage = ei.Create(), this._afterRenderTargetDrawStage = ei.Create(), this._afterRenderTargetPostProcessStage = ei.Create(), this._afterRenderStage = ei.Create(), this._pointerMoveStage = ei.Create(), this._pointerDownStage = ei.Create(), this._pointerUpStage = ei.Create(), this._geometriesByUniqueId = null, this._defaultMeshCandidates = { data: [], length: 0 }, this._defaultSubMeshCandidates = { @@ -25042,7 +25043,7 @@ var Ot = class _Ot extends Xo { * @returns an unique number for the scene */ getUniqueId() { - return rf.UniqueId; + return sf.UniqueId; } /** * Add a mesh to the list of scene's meshes @@ -25881,7 +25882,7 @@ var Ot = class _Ot extends Xo { * @returns true if no such key were already present and the data was added successfully, false otherwise */ addExternalData(e, t) { - return this._externalData || (this._externalData = new jp()), this._externalData.add(e, t); + return this._externalData || (this._externalData = new Qp()), this._externalData.add(e, t); } /** * Get an externally attached data from its key @@ -25898,7 +25899,7 @@ var Ot = class _Ot extends Xo { * @returns the associated data, can be null if the factory returned null. */ getOrAddExternalDataWithFactory(e, t) { - return this._externalData || (this._externalData = new jp()), this._externalData.getOrAddWithFactory(e, t); + return this._externalData || (this._externalData = new Qp()), this._externalData.getOrAddWithFactory(e, t); } /** * Remove an externally attached data from the Engine instance @@ -26644,7 +26645,7 @@ var Ot = class _Ot extends Xo { * @internal */ _loadFile(e, t, i, r, s, a, o) { - const l = an(e, t, i, r ? this.offlineProvider : void 0, s, a, o); + const l = on(e, t, i, r ? this.offlineProvider : void 0, s, a, o); return this._activeRequests.push(l), l.onCompleteObservable.add((c) => { this._activeRequests.splice(this._activeRequests.indexOf(c), 1); }), l; @@ -26665,7 +26666,7 @@ var Ot = class _Ot extends Xo { * @internal */ _requestFile(e, t, i, r, s, a, o) { - const l = $u(e, t, i, r ? this.offlineProvider : void 0, s, a, o); + const l = ef(e, t, i, r ? this.offlineProvider : void 0, s, a, o); return this._activeRequests.push(l), l.onCompleteObservable.add((c) => { this._activeRequests.splice(this._activeRequests.indexOf(c), 1); }), l; @@ -26908,13 +26909,13 @@ Ot.FOGMODE_EXP2 = 2; Ot.FOGMODE_LINEAR = 3; Ot.MinDeltaTime = 1; Ot.MaxDeltaTime = 1e3; -var Uy = class { +var Vy = class { /** * constructor * @param frameSampleSize The number of samples required to saturate the sliding window */ constructor(e = 30) { - this._enabled = true, this._rollingFrameTime = new Vy(e); + this._enabled = true, this._rollingFrameTime = new By(e); } /** * Samples current frame @@ -26992,7 +26993,7 @@ var Uy = class { this._lastFrameTimeMs = null, this._rollingFrameTime.reset(); } }; -var Vy = class { +var By = class { /** * constructor * @param length The number of samples required to saturate the sliding window @@ -27147,7 +27148,7 @@ De.prototype.setAlphaEquation = function(n4) { De.prototype.getAlphaEquation = function() { return this._alphaEquation; }; -function By(n4, e, t = false, i) { +function ky(n4, e, t = false, i) { switch (n4) { case 3: { const s = e instanceof ArrayBuffer ? new Int8Array(e) : new Int8Array(e); @@ -27204,7 +27205,7 @@ De.prototype._readTexturePixelsSync = function(n4, e, t, i = -1, r = 0, s = null h.bindFramebuffer(h.FRAMEBUFFER, this._dummyFramebuffer), i > -1 ? h.framebufferTexture2D(h.FRAMEBUFFER, h.COLOR_ATTACHMENT0, h.TEXTURE_CUBE_MAP_POSITIVE_X + i, (f = n4._hardwareTexture) == null ? void 0 : f.underlyingResource, r) : h.framebufferTexture2D(h.FRAMEBUFFER, h.COLOR_ATTACHMENT0, h.TEXTURE_2D, (d = n4._hardwareTexture) == null ? void 0 : d.underlyingResource, r); let u = n4.type !== void 0 ? this._getWebGLTextureType(n4.type) : h.UNSIGNED_BYTE; if (o) - s || (s = By(n4.type, 4 * e * t)); + s || (s = ky(n4.type, 4 * e * t)); else switch (u) { case h.UNSIGNED_BYTE: @@ -27362,7 +27363,7 @@ var se = class _se extends De { * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false) */ constructor(e, t, i, r = false) { - if (super(e, t, i, r), this.enableOfflineSupport = false, this.disableManifestCheck = false, this.disableContextMenu = true, this.scenes = [], this._virtualScenes = new Array(), this.onNewSceneAddedObservable = new he(), this.postProcesses = [], this.isPointerLock = false, this.onResizeObservable = new he(), this.onCanvasBlurObservable = new he(), this.onCanvasFocusObservable = new he(), this.onCanvasPointerOutObservable = new he(), this.onBeginFrameObservable = new he(), this.customAnimationFrameRequester = null, this.onEndFrameObservable = new he(), this.onBeforeShaderCompilationObservable = new he(), this.onAfterShaderCompilationObservable = new he(), this._deterministicLockstep = false, this._lockstepMaxSteps = 4, this._timeStep = 1 / 60, this._fps = 60, this._deltaTime = 0, this._drawCalls = new us(), this.canvasTabIndex = 1, this.disablePerformanceMonitorInBackground = false, this._performanceMonitor = new Uy(), this._compatibilityMode = true, this.currentRenderPassId = 0, this._renderPassNames = ["main"], _se.Instances.push(this), !!e && (this._features.supportRenderPasses = true, i = this._creationOptions, e.getContext)) { + if (super(e, t, i, r), this.enableOfflineSupport = false, this.disableManifestCheck = false, this.disableContextMenu = true, this.scenes = [], this._virtualScenes = new Array(), this.onNewSceneAddedObservable = new he(), this.postProcesses = [], this.isPointerLock = false, this.onResizeObservable = new he(), this.onCanvasBlurObservable = new he(), this.onCanvasFocusObservable = new he(), this.onCanvasPointerOutObservable = new he(), this.onBeginFrameObservable = new he(), this.customAnimationFrameRequester = null, this.onEndFrameObservable = new he(), this.onBeforeShaderCompilationObservable = new he(), this.onAfterShaderCompilationObservable = new he(), this._deterministicLockstep = false, this._lockstepMaxSteps = 4, this._timeStep = 1 / 60, this._fps = 60, this._deltaTime = 0, this._drawCalls = new us(), this.canvasTabIndex = 1, this.disablePerformanceMonitorInBackground = false, this._performanceMonitor = new Vy(), this._compatibilityMode = true, this.currentRenderPassId = 0, this._renderPassNames = ["main"], _se.Instances.push(this), !!e && (this._features.supportRenderPasses = true, i = this._creationOptions, e.getContext)) { const s = e; this._sharedInit(s); } @@ -28014,7 +28015,7 @@ var se = class _se extends De { * @returns the babylon internal texture */ wrapWebGLTexture(e, t = false, i = 3, r = 0, s = 0) { - const a = new F_(e, this._gl), o = new ar(this, Dt.Unknown, true); + const a = new F_(e, this._gl), o = new or(this, Dt.Unknown, true); return o._hardwareTexture = a, o.baseWidth = r, o.baseHeight = s, o.width = r, o.height = s, o.isReady = true, o.useMipMaps = t, this.updateTextureSamplingMode(i, o), o; } /** @@ -28322,7 +28323,7 @@ function rc(n4, e, t) { t(i); } } -function ky(n4 = 25) { +function zy(n4 = 25) { let e; return (t, i, r) => { const s = performance.now(); @@ -28343,7 +28344,7 @@ function Z_(n4, e, t, i, r) { }; s(); } -function sf(n4, e) { +function nf(n4, e) { let t; return Z_(n4, rc, (i) => t = i, (i) => { throw i; @@ -28354,8 +28355,8 @@ function j_(n4, e, t) { Z_(n4, e, i, r, t); }); } -function zy(n4, e) { - return (...t) => sf(n4(...t), e); +function Wy(n4, e) { + return (...t) => nf(n4(...t), e); } var Eu = class { constructor(e, t, i) { @@ -28381,7 +28382,7 @@ var Fs = class _Fs { */ reConstruct(e, t, i) { const r = e.x, s = e.y, a = e.z, o = t.x, l = t.y, c = t.z, h = this.vectors; - this.minimum.copyFromFloats(r, s, a), this.maximum.copyFromFloats(o, l, c), h[0].copyFromFloats(r, s, a), h[1].copyFromFloats(o, l, c), h[2].copyFromFloats(o, s, a), h[3].copyFromFloats(r, l, a), h[4].copyFromFloats(r, s, c), h[5].copyFromFloats(o, l, a), h[6].copyFromFloats(r, l, c), h[7].copyFromFloats(o, s, c), t.addToRef(e, this.center).scaleInPlace(0.5), t.subtractToRef(e, this.extendSize).scaleInPlace(0.5), this._worldMatrix = i || w.IdentityReadOnly, this._update(this._worldMatrix); + this.minimum.copyFromFloats(r, s, a), this.maximum.copyFromFloats(o, l, c), h[0].copyFromFloats(r, s, a), h[1].copyFromFloats(o, l, c), h[2].copyFromFloats(o, s, a), h[3].copyFromFloats(r, l, a), h[4].copyFromFloats(r, s, c), h[5].copyFromFloats(o, l, a), h[6].copyFromFloats(r, l, c), h[7].copyFromFloats(o, s, c), t.addToRef(e, this.center).scaleInPlace(0.5), t.subtractToRef(e, this.extendSize).scaleInPlace(0.5), this._worldMatrix = i || L.IdentityReadOnly, this._update(this._worldMatrix); } /** * Scale the current bounding box by applying a scale factor @@ -28530,7 +28531,7 @@ var Fs = class _Fs { } }; Fs._TmpVector3 = vi.BuildArray(3, _.Zero); -var An = class _An { +var Mn = class _Mn { /** * Creates a new bounding sphere * @param min defines the minimum vector (in local space) @@ -28549,7 +28550,7 @@ var An = class _An { reConstruct(e, t, i) { this.minimum.copyFrom(e), this.maximum.copyFrom(t); const r = _.Distance(e, t); - t.addToRef(e, this.center).scaleInPlace(0.5), this.radius = r * 0.5, this._update(i || w.IdentityReadOnly); + t.addToRef(e, this.center).scaleInPlace(0.5), this.radius = r * 0.5, this._update(i || L.IdentityReadOnly); } /** * Scale the current bounding sphere by applying a scale factor @@ -28557,7 +28558,7 @@ var An = class _An { * @returns the current bounding box */ scale(e) { - const t = this.radius * e, i = _An._TmpVector3, r = i[0].setAll(t), s = this.center.subtractToRef(r, i[1]), a = this.center.addToRef(r, i[2]); + const t = this.radius * e, i = _Mn._TmpVector3, r = i[0].setAll(t), s = this.center.subtractToRef(r, i[1]), a = this.center.addToRef(r, i[2]); return this.reConstruct(s, a, this._worldMatrix), this; } /** @@ -28576,7 +28577,7 @@ var An = class _An { this.centerWorld.copyFrom(this.center), this.radiusWorld = this.radius; else { _.TransformCoordinatesToRef(this.center, e, this.centerWorld); - const t = _An._TmpVector3[0]; + const t = _Mn._TmpVector3[0]; _.TransformNormalFromFloatsToRef(1, 1, 1, e, t), this.radiusWorld = Math.max(Math.abs(t.x), Math.abs(t.y), Math.abs(t.z)) * this.radius; } } @@ -28634,18 +28635,18 @@ var An = class _An { */ static CreateFromCenterAndRadius(e, t, i) { this._TmpVector3[0].copyFrom(e), this._TmpVector3[1].copyFromFloats(0, 0, t), this._TmpVector3[2].copyFrom(e), this._TmpVector3[0].addInPlace(this._TmpVector3[1]), this._TmpVector3[2].subtractInPlace(this._TmpVector3[1]); - const r = new _An(this._TmpVector3[0], this._TmpVector3[2]); - return i ? r._worldMatrix = i : r._worldMatrix = w.Identity(), r; + const r = new _Mn(this._TmpVector3[0], this._TmpVector3[2]); + return i ? r._worldMatrix = i : r._worldMatrix = L.Identity(), r; } }; -An._TmpVector3 = vi.BuildArray(3, _.Zero); +Mn._TmpVector3 = vi.BuildArray(3, _.Zero); var Bh = { min: 0, max: 0 }; var kh = { min: 0, max: 0 }; -var lg = (n4, e, t) => { +var cg = (n4, e, t) => { const i = _.Dot(e.centerWorld, n4), r = Math.abs(_.Dot(e.directions[0], n4)) * e.extendSize.x, s = Math.abs(_.Dot(e.directions[1], n4)) * e.extendSize.y, a = Math.abs(_.Dot(e.directions[2], n4)) * e.extendSize.z, o = r + s + a; t.min = i - o, t.max = i + o; }; -var tr = (n4, e, t) => (lg(n4, e, Bh), lg(n4, t, kh), !(Bh.min > kh.max || kh.min > Bh.max)); +var tr = (n4, e, t) => (cg(n4, e, Bh), cg(n4, t, kh), !(Bh.min > kh.max || kh.min > Bh.max)); var Cr = class _Cr { /** * Constructs bounding info @@ -28654,7 +28655,7 @@ var Cr = class _Cr { * @param worldMatrix defines the new world matrix */ constructor(e, t, i) { - this._isLocked = false, this.boundingBox = new Fs(e, t, i), this.boundingSphere = new An(e, t, i); + this._isLocked = false, this.boundingBox = new Fs(e, t, i), this.boundingSphere = new Mn(e, t, i); } /** * Recreates the entire bounding info from scratch as if we call the constructor in place @@ -28785,7 +28786,7 @@ var Cr = class _Cr { * @returns if the bounding info intersects */ intersects(e, t) { - if (!An.Intersects(this.boundingSphere, e.boundingSphere) || !Fs.Intersects(this.boundingBox, e.boundingBox)) + if (!Mn.Intersects(this.boundingSphere, e.boundingSphere) || !Fs.Intersects(this.boundingBox, e.boundingBox)) return false; if (!t) return true; @@ -28809,14 +28810,14 @@ var Dc = class { } }; P([ - on.filter((...[n4, e]) => !Array.isArray(n4) && !Array.isArray(e)) + ln.filter((...[n4, e]) => !Array.isArray(n4) && !Array.isArray(e)) // eslint-disable-next-line @typescript-eslint/naming-convention ], Dc, "extractMinAndMaxIndexed", null); P([ - on.filter((...[n4]) => !Array.isArray(n4)) + ln.filter((...[n4]) => !Array.isArray(n4)) // eslint-disable-next-line @typescript-eslint/naming-convention ], Dc, "extractMinAndMax", null); -function Wy(n4, e, t, i, r = null) { +function Gy(n4, e, t, i, r = null) { const s = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), a = new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); return Dc.extractMinAndMaxIndexed(n4, e, t, i, s, a), r && (s.x -= s.x * r.x + r.y, s.y -= s.y * r.x + r.y, s.z -= s.z * r.x + r.y, a.x += a.x * r.x + r.y, a.y += a.y * r.x + r.y, a.z += a.z * r.x + r.y), { minimum: s, @@ -29024,7 +29025,7 @@ var bi = class _bi { const r = this._renderingMesh.getBoundingInfo(); i = { minimum: r.minimum.clone(), maximum: r.maximum.clone() }; } else - i = Wy(e, t, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias); + i = Gy(e, t, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias); return this._boundingInfo ? this._boundingInfo.reConstruct(i.minimum, i.maximum) : this._boundingInfo = new Cr(i.minimum, i.maximum), this; } /** @@ -29248,7 +29249,7 @@ var re = class _re { * Creates a new VertexData */ constructor() { - this.uniqueId = 0, this.metadata = {}, this._applyTo = zy(this._applyToCoroutine.bind(this)), this.uniqueId = _re._UniqueIDGenerator, _re._UniqueIDGenerator++; + this.uniqueId = 0, this.metadata = {}, this._applyTo = Wy(this._applyToCoroutine.bind(this)), this.uniqueId = _re._UniqueIDGenerator, _re._UniqueIDGenerator++; } /** * Uses the passed data array to set the set the values for the specified kind of data @@ -29413,7 +29414,7 @@ var re = class _re { */ merge(e, t = false, i = false, r = false, s = false) { const a = Array.isArray(e) ? e.map((o) => ({ vertexData: o })) : [{ vertexData: e }]; - return sf(this._mergeCoroutine(void 0, a, t, false, i, r, s)); + return nf(this._mergeCoroutine(void 0, a, t, false, i, r, s)); } /** * @internal @@ -29933,18 +29934,18 @@ var re = class _re { * * depthSortedFacets : optional array of depthSortedFacets to store the facet distances from the reference location */ static ComputeNormals(e, t, i, r) { - let s = 0, a = 0, o = 0, l = 0, c = 0, h = 0, u = 0, f = 0, d = 0, p = 0, g = 0, m = 0, v = 0, E = 0, C = 0, T = 0, R = 0, x = 0, S = 0, M = 0, N = false, F = false, L = false, K = false, q = 1, j = 0, k = null; - r && (N = !!r.facetNormals, F = !!r.facetPositions, L = !!r.facetPartitioning, q = r.useRightHandedSystem === true ? -1 : 1, j = r.ratio || 0, K = !!r.depthSort, k = r.distanceTo, K && k === void 0 && (k = _.Zero())); - let Q = 0, ce = 0, de = 0, Z = 0; - for (L && r && r.bbSize && (Q = r.subDiv.X * j / r.bbSize.x, ce = r.subDiv.Y * j / r.bbSize.y, de = r.subDiv.Z * j / r.bbSize.z, Z = r.subDiv.max * r.subDiv.max, r.facetPartitioning.length = 0), s = 0; s < e.length; s++) + let s = 0, a = 0, o = 0, l = 0, c = 0, h = 0, u = 0, f = 0, d = 0, p = 0, g = 0, m = 0, v = 0, E = 0, C = 0, T = 0, R = 0, x = 0, S = 0, M = 0, N = false, F = false, U = false, H = false, q = 1, Z = 0, k = null; + r && (N = !!r.facetNormals, F = !!r.facetPositions, U = !!r.facetPartitioning, q = r.useRightHandedSystem === true ? -1 : 1, Z = r.ratio || 0, H = !!r.depthSort, k = r.distanceTo, H && k === void 0 && (k = _.Zero())); + let Q = 0, ce = 0, de = 0, j = 0; + for (U && r && r.bbSize && (Q = r.subDiv.X * Z / r.bbSize.x, ce = r.subDiv.Y * Z / r.bbSize.y, de = r.subDiv.Z * Z / r.bbSize.z, j = r.subDiv.max * r.subDiv.max, r.facetPartitioning.length = 0), s = 0; s < e.length; s++) i[s] = 0; const J = t.length / 3 | 0; for (s = 0; s < J; s++) { - if (m = t[s * 3] * 3, v = m + 1, E = m + 2, C = t[s * 3 + 1] * 3, T = C + 1, R = C + 2, x = t[s * 3 + 2] * 3, S = x + 1, M = x + 2, a = e[m] - e[C], o = e[v] - e[T], l = e[E] - e[R], c = e[x] - e[C], h = e[S] - e[T], u = e[M] - e[R], f = q * (o * u - l * h), d = q * (l * c - a * u), p = q * (a * h - o * c), g = Math.sqrt(f * f + d * d + p * p), g = g === 0 ? 1 : g, f /= g, d /= g, p /= g, N && r && (r.facetNormals[s].x = f, r.facetNormals[s].y = d, r.facetNormals[s].z = p), F && r && (r.facetPositions[s].x = (e[m] + e[C] + e[x]) / 3, r.facetPositions[s].y = (e[v] + e[T] + e[S]) / 3, r.facetPositions[s].z = (e[E] + e[R] + e[M]) / 3), L && r) { - const O = Math.floor((r.facetPositions[s].x - r.bInfo.minimum.x * j) * Q), G = Math.floor((r.facetPositions[s].y - r.bInfo.minimum.y * j) * ce), ee = Math.floor((r.facetPositions[s].z - r.bInfo.minimum.z * j) * de), _e = Math.floor((e[m] - r.bInfo.minimum.x * j) * Q), Oe = Math.floor((e[v] - r.bInfo.minimum.y * j) * ce), ze = Math.floor((e[E] - r.bInfo.minimum.z * j) * de), fe = Math.floor((e[C] - r.bInfo.minimum.x * j) * Q), Te = Math.floor((e[T] - r.bInfo.minimum.y * j) * ce), Fe = Math.floor((e[R] - r.bInfo.minimum.z * j) * de), Se = Math.floor((e[x] - r.bInfo.minimum.x * j) * Q), qe = Math.floor((e[S] - r.bInfo.minimum.y * j) * ce), ue = Math.floor((e[M] - r.bInfo.minimum.z * j) * de), Ye = _e + r.subDiv.max * Oe + Z * ze, lt = fe + r.subDiv.max * Te + Z * Fe, Ut = Se + r.subDiv.max * qe + Z * ue, Ct = O + r.subDiv.max * G + Z * ee; + if (m = t[s * 3] * 3, v = m + 1, E = m + 2, C = t[s * 3 + 1] * 3, T = C + 1, R = C + 2, x = t[s * 3 + 2] * 3, S = x + 1, M = x + 2, a = e[m] - e[C], o = e[v] - e[T], l = e[E] - e[R], c = e[x] - e[C], h = e[S] - e[T], u = e[M] - e[R], f = q * (o * u - l * h), d = q * (l * c - a * u), p = q * (a * h - o * c), g = Math.sqrt(f * f + d * d + p * p), g = g === 0 ? 1 : g, f /= g, d /= g, p /= g, N && r && (r.facetNormals[s].x = f, r.facetNormals[s].y = d, r.facetNormals[s].z = p), F && r && (r.facetPositions[s].x = (e[m] + e[C] + e[x]) / 3, r.facetPositions[s].y = (e[v] + e[T] + e[S]) / 3, r.facetPositions[s].z = (e[E] + e[R] + e[M]) / 3), U && r) { + const O = Math.floor((r.facetPositions[s].x - r.bInfo.minimum.x * Z) * Q), G = Math.floor((r.facetPositions[s].y - r.bInfo.minimum.y * Z) * ce), ee = Math.floor((r.facetPositions[s].z - r.bInfo.minimum.z * Z) * de), _e = Math.floor((e[m] - r.bInfo.minimum.x * Z) * Q), Oe = Math.floor((e[v] - r.bInfo.minimum.y * Z) * ce), ze = Math.floor((e[E] - r.bInfo.minimum.z * Z) * de), fe = Math.floor((e[C] - r.bInfo.minimum.x * Z) * Q), Te = Math.floor((e[T] - r.bInfo.minimum.y * Z) * ce), Fe = Math.floor((e[R] - r.bInfo.minimum.z * Z) * de), Se = Math.floor((e[x] - r.bInfo.minimum.x * Z) * Q), qe = Math.floor((e[S] - r.bInfo.minimum.y * Z) * ce), ue = Math.floor((e[M] - r.bInfo.minimum.z * Z) * de), Ye = _e + r.subDiv.max * Oe + j * ze, lt = fe + r.subDiv.max * Te + j * Fe, Ut = Se + r.subDiv.max * qe + j * ue, Ct = O + r.subDiv.max * G + j * ee; r.facetPartitioning[Ct] = r.facetPartitioning[Ct] ? r.facetPartitioning[Ct] : new Array(), r.facetPartitioning[Ye] = r.facetPartitioning[Ye] ? r.facetPartitioning[Ye] : new Array(), r.facetPartitioning[lt] = r.facetPartitioning[lt] ? r.facetPartitioning[lt] : new Array(), r.facetPartitioning[Ut] = r.facetPartitioning[Ut] ? r.facetPartitioning[Ut] : new Array(), r.facetPartitioning[Ye].push(s), lt != Ye && r.facetPartitioning[lt].push(s), Ut == lt || Ut == Ye || r.facetPartitioning[Ut].push(s), Ct == Ye || Ct == lt || Ct == Ut || r.facetPartitioning[Ct].push(s); } - if (K && r && r.facetPositions) { + if (H && r && r.facetPositions) { const O = r.depthSortedFacets[s]; O.ind = s * 3, O.sqDistance = _.DistanceSquared(r.facetPositions[s], k); } @@ -30046,18 +30047,18 @@ re.DOUBLESIDE = 2; re.DEFAULTSIDE = 0; re._UniqueIDGenerator = 0; P([ - on.filter((...[n4]) => !Array.isArray(n4)) + ln.filter((...[n4]) => !Array.isArray(n4)) ], re, "_TransformVector3Coordinates", null); P([ - on.filter((...[n4]) => !Array.isArray(n4)) + ln.filter((...[n4]) => !Array.isArray(n4)) ], re, "_TransformVector3Normals", null); P([ - on.filter((...[n4]) => !Array.isArray(n4)) + ln.filter((...[n4]) => !Array.isArray(n4)) ], re, "_TransformVector4Normals", null); P([ - on.filter((...[n4]) => !Array.isArray(n4)) + ln.filter((...[n4]) => !Array.isArray(n4)) ], re, "_FlipFaces", null); -var Gy = class { +var Xy = class { constructor() { this._doNotSerialize = false, this._isDisposed = false, this._sceneRootNodesIndex = -1, this._isEnabled = true, this._isParentEnabled = true, this._isReady = true, this._onEnabledStateChangedObservable = new he(), this._onClonedObservable = new he(); } @@ -30182,7 +30183,7 @@ var Ai = class vu { * @param scene the scene this node will be added to */ constructor(e, t = null) { - this._isDirty = false, this._nodeDataStorage = new Gy(), this.state = "", this.metadata = null, this.reservedDataStore = null, this._accessibilityTag = null, this.onAccessibilityTagChangedObservable = new he(), this._parentContainer = null, this.animations = [], this._ranges = {}, this.onReady = null, this._currentRenderId = -1, this._parentUpdateId = -1, this._childUpdateId = -1, this._waitingParentId = null, this._waitingParentInstanceIndex = null, this._waitingParsedUniqueId = null, this._cache = {}, this._parentNode = null, this._children = null, this._worldMatrix = w.Identity(), this._worldMatrixDeterminant = 0, this._worldMatrixDeterminantIsDirty = true, this._animationPropertiesOverride = null, this._isNode = true, this.onDisposeObservable = new he(), this._onDisposeObserver = null, this._behaviors = new Array(), this.name = e, this.id = e, this._scene = t || st.LastCreatedScene, this.uniqueId = this._scene.getUniqueId(), this._initCache(); + this._isDirty = false, this._nodeDataStorage = new Xy(), this.state = "", this.metadata = null, this.reservedDataStore = null, this._accessibilityTag = null, this.onAccessibilityTagChangedObservable = new he(), this._parentContainer = null, this.animations = [], this._ranges = {}, this.onReady = null, this._currentRenderId = -1, this._parentUpdateId = -1, this._childUpdateId = -1, this._waitingParentId = null, this._waitingParentInstanceIndex = null, this._waitingParsedUniqueId = null, this._cache = {}, this._parentNode = null, this._children = null, this._worldMatrix = L.Identity(), this._worldMatrixDeterminant = 0, this._worldMatrixDeterminantIsDirty = true, this._animationPropertiesOverride = null, this._isNode = true, this.onDisposeObservable = new he(), this._onDisposeObserver = null, this._behaviors = new Array(), this.name = e, this.id = e, this._scene = t || st.LastCreatedScene, this.uniqueId = this._scene.getUniqueId(), this._initCache(); } /** * Gets the scene of the node @@ -30503,7 +30504,7 @@ var Ai = class vu { * @returns the world matrix */ computeWorldMatrix(e) { - return this._worldMatrix || (this._worldMatrix = w.Identity()), this._worldMatrix; + return this._worldMatrix || (this._worldMatrix = L.Identity()), this._worldMatrix; } /** * Releases resources associated with this node. @@ -30570,19 +30571,19 @@ Ai._AnimationRangeFactory = (n4, e, t) => { }; Ai._NodeConstructors = {}; P([ - U() + w() ], Ai.prototype, "name", void 0); P([ - U() + w() ], Ai.prototype, "id", void 0); P([ - U() + w() ], Ai.prototype, "uniqueId", void 0); P([ - U() + w() ], Ai.prototype, "state", void 0); P([ - U() + w() ], Ai.prototype, "metadata", void 0); var ut; (function(n4) { @@ -30593,11 +30594,11 @@ var Ko = class { Ko.X = new _(1, 0, 0); Ko.Y = new _(0, 1, 0); Ko.Z = new _(0, 0, 1); -var cg; +var hg; (function(n4) { n4[n4.X = 0] = "X", n4[n4.Y = 1] = "Y", n4[n4.Z = 2] = "Z"; -})(cg || (cg = {})); -var Xy = w.Compose(_.One(), Ce.FromEulerAngles(0, Math.PI, 0), _.Zero()); +})(hg || (hg = {})); +var Hy = L.Compose(_.One(), Ce.FromEulerAngles(0, Math.PI, 0), _.Zero()); var He = class _He extends Ai { /** * Gets or sets the billboard mode. Default is 0. @@ -30640,7 +30641,7 @@ var He = class _He extends Ai { this._infiniteDistance !== e && (this._infiniteDistance = e); } constructor(e, t = null, i = true) { - super(e, t), this._forward = new _(0, 0, 1), this._up = new _(0, 1, 0), this._right = new _(1, 0, 0), this._position = _.Zero(), this._rotation = _.Zero(), this._rotationQuaternion = null, this._scaling = _.One(), this._transformToBoneReferal = null, this._isAbsoluteSynced = false, this._billboardMode = _He.BILLBOARDMODE_NONE, this._preserveParentRotationForBillboard = false, this.scalingDeterminant = 1, this._infiniteDistance = false, this.ignoreNonUniformScaling = false, this.reIntegrateRotationIntoRotationQuaternion = false, this._poseMatrix = null, this._localMatrix = w.Zero(), this._usePivotMatrix = false, this._absolutePosition = _.Zero(), this._absoluteScaling = _.Zero(), this._absoluteRotationQuaternion = Ce.Identity(), this._pivotMatrix = w.Identity(), this._postMultiplyPivotMatrix = false, this._isWorldMatrixFrozen = false, this._indexInSceneTransformNodesArray = -1, this.onAfterWorldMatrixUpdateObservable = new he(), this._nonUniformScaling = false, i && this.getScene().addTransformNode(this); + super(e, t), this._forward = new _(0, 0, 1), this._up = new _(0, 1, 0), this._right = new _(1, 0, 0), this._position = _.Zero(), this._rotation = _.Zero(), this._rotationQuaternion = null, this._scaling = _.One(), this._transformToBoneReferal = null, this._isAbsoluteSynced = false, this._billboardMode = _He.BILLBOARDMODE_NONE, this._preserveParentRotationForBillboard = false, this.scalingDeterminant = 1, this._infiniteDistance = false, this.ignoreNonUniformScaling = false, this.reIntegrateRotationIntoRotationQuaternion = false, this._poseMatrix = null, this._localMatrix = L.Zero(), this._usePivotMatrix = false, this._absolutePosition = _.Zero(), this._absoluteScaling = _.Zero(), this._absoluteRotationQuaternion = Ce.Identity(), this._pivotMatrix = L.Identity(), this._postMultiplyPivotMatrix = false, this._isWorldMatrixFrozen = false, this._indexInSceneTransformNodesArray = -1, this.onAfterWorldMatrixUpdateObservable = new he(), this._nonUniformScaling = false, i && this.getScene().addTransformNode(this); } /** * Gets a string identifying the name of the class @@ -30731,7 +30732,7 @@ var He = class _He extends Ai { * @returns the pose matrix */ getPoseMatrix() { - return this._poseMatrix || (this._poseMatrix = w.Identity()), this._poseMatrix; + return this._poseMatrix || (this._poseMatrix = L.Identity()), this._poseMatrix; } /** @internal */ _isSynchronized() { @@ -30780,7 +30781,7 @@ var He = class _He extends Ai { * @returns the current TransformNode */ setPivotMatrix(e, t = true) { - return this._pivotMatrix.copyFrom(e), this._usePivotMatrix = !this._pivotMatrix.isIdentity(), this._cache.pivotMatrixUpdated = true, this._postMultiplyPivotMatrix = t, this._postMultiplyPivotMatrix && (this._pivotMatrixInverse ? this._pivotMatrix.invertToRef(this._pivotMatrixInverse) : this._pivotMatrixInverse = w.Invert(this._pivotMatrix)), this; + return this._pivotMatrix.copyFrom(e), this._usePivotMatrix = !this._pivotMatrix.isIdentity(), this._cache.pivotMatrixUpdated = true, this._postMultiplyPivotMatrix = t, this._postMultiplyPivotMatrix && (this._pivotMatrixInverse ? this._pivotMatrix.invertToRef(this._pivotMatrixInverse) : this._pivotMatrixInverse = L.Invert(this._pivotMatrix)), this; } /** * Returns the mesh pivot matrix. @@ -30954,7 +30955,7 @@ var He = class _He extends Ai { const r = z.Matrix[0]; i.invertToRef(r), e = _.TransformCoordinates(e, r); } - return this.setPivotMatrix(w.Translation(-e.x, -e.y, -e.z), true); + return this.setPivotMatrix(L.Translation(-e.x, -e.y, -e.z), true); } /** * Returns a new Vector3 set with the mesh pivot point coordinates in the local space. @@ -31017,11 +31018,11 @@ var He = class _He extends Ai { if (!e && !this.parent) return this; const r = z.Quaternion[0], s = z.Vector3[0], a = z.Vector3[1], o = z.Matrix[1]; - w.IdentityToRef(o); + L.IdentityToRef(o); const l = z.Matrix[0]; this.computeWorldMatrix(true); let c = this.rotationQuaternion; - return c || (c = _He._TmpRotation, Ce.RotationYawPitchRollToRef(this._rotation.y, this._rotation.x, this._rotation.z, c)), w.ComposeToRef(this.scaling, c, this.position, l), this.parent && l.multiplyToRef(this.parent.computeWorldMatrix(true), l), e && (e.computeWorldMatrix(true).invertToRef(o), l.multiplyToRef(o, l)), l.decompose(a, r, s, t ? this : void 0), this.rotationQuaternion ? this.rotationQuaternion.copyFrom(r) : r.toEulerAnglesToRef(this.rotation), this.scaling.copyFrom(a), this.position.copyFrom(s), this.parent = e, i && this.setPivotMatrix(w.Identity()), this; + return c || (c = _He._TmpRotation, Ce.RotationYawPitchRollToRef(this._rotation.y, this._rotation.x, this._rotation.z, c)), L.ComposeToRef(this.scaling, c, this.position, l), this.parent && l.multiplyToRef(this.parent.computeWorldMatrix(true), l), e && (e.computeWorldMatrix(true).invertToRef(o), l.multiplyToRef(o, l)), l.decompose(a, r, s, t ? this : void 0), this.rotationQuaternion ? this.rotationQuaternion.copyFrom(r) : r.toEulerAnglesToRef(this.rotation), this.scaling.copyFrom(a), this.position.copyFrom(s), this.parent = e, i && this.setPivotMatrix(L.Identity()), this; } /** * True if the scaling property of this object is non uniform eg. (1,2,1) @@ -31089,7 +31090,7 @@ var He = class _He extends Ai { rotateAround(e, t, i) { t.normalize(), this.rotationQuaternion || (this.rotationQuaternion = Ce.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z), this.rotation.setAll(0)); const r = z.Vector3[0], s = z.Vector3[1], a = z.Vector3[2], o = z.Quaternion[0], l = z.Matrix[0], c = z.Matrix[1], h = z.Matrix[2], u = z.Matrix[3]; - return e.subtractToRef(this.position, r), w.TranslationToRef(r.x, r.y, r.z, l), w.TranslationToRef(-r.x, -r.y, -r.z, c), w.RotationAxisToRef(t, i, h), c.multiplyToRef(h, u), u.multiplyToRef(l, u), u.decompose(s, o, a), this.position.addInPlace(a), o.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion), this; + return e.subtractToRef(this.position, r), L.TranslationToRef(r.x, r.y, r.z, l), L.TranslationToRef(-r.x, -r.y, -r.z, c), L.RotationAxisToRef(t, i, h), c.multiplyToRef(h, u), u.multiplyToRef(l, u), u.decompose(s, o, a), this.position.addInPlace(a), o.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion), this; } /** * Translates the mesh along the axis vector for the passed distance in the given space. @@ -31170,11 +31171,11 @@ var He = class _He extends Ai { let l; if (this._rotationQuaternion ? (this._rotationQuaternion._isDirty = false, l = this._rotationQuaternion, this.reIntegrateRotationIntoRotationQuaternion && this.rotation.lengthSquared() && (this._rotationQuaternion.multiplyInPlace(Ce.RotationYawPitchRoll(this._rotation.y, this._rotation.x, this._rotation.z)), this._rotation.copyFromFloats(0, 0, 0))) : (l = _He._TmpRotation, Ce.RotationYawPitchRollToRef(this._rotation.y, this._rotation.x, this._rotation.z, l)), this._usePivotMatrix) { const c = z.Matrix[1]; - w.ScalingToRef(a.x, a.y, a.z, c); + L.ScalingToRef(a.x, a.y, a.z, c); const h = z.Matrix[0]; l.toRotationMatrix(h), this._pivotMatrix.multiplyToRef(c, z.Matrix[4]), z.Matrix[4].multiplyToRef(h, this._localMatrix), this._postMultiplyPivotMatrix && this._localMatrix.multiplyToRef(this._pivotMatrixInverse, this._localMatrix), this._localMatrix.addTranslationFromFloats(o.x, o.y, o.z); } else - w.ComposeToRef(a, l, o, this._localMatrix); + L.ComposeToRef(a, l, o, this._localMatrix); if (s && s.getWorldMatrix) { if (e && s.computeWorldMatrix(e), r.useBillboardPath) { if (this._transformToBoneReferal) { @@ -31183,7 +31184,7 @@ var He = class _He extends Ai { } else z.Matrix[7].copyFrom(s.getWorldMatrix()); const c = z.Vector3[5], h = z.Vector3[6], u = z.Quaternion[0]; - z.Matrix[7].decompose(h, u, c), w.ScalingToRef(h.x, h.y, h.z, z.Matrix[7]), z.Matrix[7].setTranslation(c), _He.BillboardUseParentOrientation && (this._position.applyRotationQuaternionToRef(u, c), this._localMatrix.setTranslation(c)), this._localMatrix.multiplyToRef(z.Matrix[7], this._worldMatrix); + z.Matrix[7].decompose(h, u, c), L.ScalingToRef(h.x, h.y, h.z, z.Matrix[7]), z.Matrix[7].setTranslation(c), _He.BillboardUseParentOrientation && (this._position.applyRotationQuaternionToRef(u, c), this._localMatrix.setTranslation(c)), this._localMatrix.multiplyToRef(z.Matrix[7], this._worldMatrix); } else if (this._transformToBoneReferal) { const c = this.parent; c.getSkeleton().prepare(), this._localMatrix.multiplyToRef(c.getFinalMatrix(), z.Matrix[6]), z.Matrix[6].multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), this._worldMatrix); @@ -31194,10 +31195,10 @@ var He = class _He extends Ai { this._worldMatrix.copyFrom(this._localMatrix); if (r.useBillboardPath && t && this.billboardMode && !r.useBillboardPosition) { const c = z.Vector3[0]; - if (this._worldMatrix.getTranslationToRef(c), z.Matrix[1].copyFrom(t.getViewMatrix()), this._scene.useRightHandedSystem && z.Matrix[1].multiplyToRef(Xy, z.Matrix[1]), z.Matrix[1].setTranslationFromFloats(0, 0, 0), z.Matrix[1].invertToRef(z.Matrix[0]), (this.billboardMode & _He.BILLBOARDMODE_ALL) !== _He.BILLBOARDMODE_ALL) { + if (this._worldMatrix.getTranslationToRef(c), z.Matrix[1].copyFrom(t.getViewMatrix()), this._scene.useRightHandedSystem && z.Matrix[1].multiplyToRef(Hy, z.Matrix[1]), z.Matrix[1].setTranslationFromFloats(0, 0, 0), z.Matrix[1].invertToRef(z.Matrix[0]), (this.billboardMode & _He.BILLBOARDMODE_ALL) !== _He.BILLBOARDMODE_ALL) { z.Matrix[0].decompose(void 0, z.Quaternion[0], void 0); const h = z.Vector3[1]; - z.Quaternion[0].toEulerAnglesToRef(h), (this.billboardMode & _He.BILLBOARDMODE_X) !== _He.BILLBOARDMODE_X && (h.x = 0), (this.billboardMode & _He.BILLBOARDMODE_Y) !== _He.BILLBOARDMODE_Y && (h.y = 0), (this.billboardMode & _He.BILLBOARDMODE_Z) !== _He.BILLBOARDMODE_Z && (h.z = 0), w.RotationYawPitchRollToRef(h.y, h.x, h.z, z.Matrix[0]); + z.Quaternion[0].toEulerAnglesToRef(h), (this.billboardMode & _He.BILLBOARDMODE_X) !== _He.BILLBOARDMODE_X && (h.x = 0), (this.billboardMode & _He.BILLBOARDMODE_Y) !== _He.BILLBOARDMODE_Y && (h.y = 0), (this.billboardMode & _He.BILLBOARDMODE_Z) !== _He.BILLBOARDMODE_Z && (h.z = 0), L.RotationYawPitchRollToRef(h.y, h.x, h.z, z.Matrix[0]); } this._worldMatrix.setTranslationFromFloats(0, 0, 0), this._worldMatrix.multiplyToRef(z.Matrix[0], this._worldMatrix), this._worldMatrix.setTranslation(z.Vector3[0]); } else if (r.useBillboardPath && t && r.useBillboardPosition) { @@ -31210,12 +31211,12 @@ var He = class _He extends Ai { const f = -Math.atan2(u.z, u.x) + Math.PI / 2, d = Math.sqrt(u.x * u.x + u.z * u.z), p = -Math.atan2(u.y, d); if (Ce.RotationYawPitchRollToRef(f, p, 0, z.Quaternion[0]), (this.billboardMode & _He.BILLBOARDMODE_ALL) !== _He.BILLBOARDMODE_ALL) { const g = z.Vector3[1]; - z.Quaternion[0].toEulerAnglesToRef(g), (this.billboardMode & _He.BILLBOARDMODE_X) !== _He.BILLBOARDMODE_X && (g.x = 0), (this.billboardMode & _He.BILLBOARDMODE_Y) !== _He.BILLBOARDMODE_Y && (g.y = 0), (this.billboardMode & _He.BILLBOARDMODE_Z) !== _He.BILLBOARDMODE_Z && (g.z = 0), w.RotationYawPitchRollToRef(g.y, g.x, g.z, z.Matrix[0]); + z.Quaternion[0].toEulerAnglesToRef(g), (this.billboardMode & _He.BILLBOARDMODE_X) !== _He.BILLBOARDMODE_X && (g.x = 0), (this.billboardMode & _He.BILLBOARDMODE_Y) !== _He.BILLBOARDMODE_Y && (g.y = 0), (this.billboardMode & _He.BILLBOARDMODE_Z) !== _He.BILLBOARDMODE_Z && (g.z = 0), L.RotationYawPitchRollToRef(g.y, g.x, g.z, z.Matrix[0]); } else - w.FromQuaternionToRef(z.Quaternion[0], z.Matrix[0]); + L.FromQuaternionToRef(z.Quaternion[0], z.Matrix[0]); this._worldMatrix.setTranslationFromFloats(0, 0, 0), this._worldMatrix.multiplyToRef(z.Matrix[0], this._worldMatrix), this._worldMatrix.setTranslation(z.Vector3[0]); } - return this.ignoreNonUniformScaling ? this._updateNonUniformScalingState(false) : this._scaling.isNonUniformWithinEpsilon(1e-6) ? this._updateNonUniformScalingState(true) : s && s._nonUniformScaling ? this._updateNonUniformScalingState(s._nonUniformScaling) : this._updateNonUniformScalingState(false), this._afterComputeWorldMatrix(), this._absolutePosition.copyFromFloats(this._worldMatrix.m[12], this._worldMatrix.m[13], this._worldMatrix.m[14]), this._isAbsoluteSynced = false, this.onAfterWorldMatrixUpdateObservable.notifyObservers(this), this._poseMatrix || (this._poseMatrix = w.Invert(this._worldMatrix)), this._worldMatrixDeterminantIsDirty = true, this._worldMatrix; + return this.ignoreNonUniformScaling ? this._updateNonUniformScalingState(false) : this._scaling.isNonUniformWithinEpsilon(1e-6) ? this._updateNonUniformScalingState(true) : s && s._nonUniformScaling ? this._updateNonUniformScalingState(s._nonUniformScaling) : this._updateNonUniformScalingState(false), this._afterComputeWorldMatrix(), this._absolutePosition.copyFromFloats(this._worldMatrix.m[12], this._worldMatrix.m[13], this._worldMatrix.m[14]), this._isAbsoluteSynced = false, this.onAfterWorldMatrixUpdateObservable.notifyObservers(this), this._poseMatrix || (this._poseMatrix = L.Invert(this._worldMatrix)), this._worldMatrixDeterminantIsDirty = true, this._worldMatrix; } /** * Resets this nodeTransform's local matrix to Matrix.Identity(). @@ -31235,7 +31236,7 @@ var He = class _He extends Ai { } } } - this.scaling.copyFromFloats(1, 1, 1), this.position.copyFromFloats(0, 0, 0), this.rotation.copyFromFloats(0, 0, 0), this.rotationQuaternion && (this.rotationQuaternion = Ce.Identity()), this._worldMatrix = w.Identity(); + this.scaling.copyFromFloats(1, 1, 1), this.position.copyFromFloats(0, 0, 0), this.rotation.copyFromFloats(0, 0, 0), this.rotationQuaternion && (this.rotationQuaternion = Ce.Identity()), this._worldMatrix = L.Identity(); } _afterComputeWorldMatrix() { } @@ -31309,7 +31310,7 @@ var He = class _He extends Ai { */ static Parse(e, t, i) { const r = Le.Parse(() => new _He(e.name, t), e, t, i); - if (e.localMatrix ? r.setPreTransformMatrix(w.FromArray(e.localMatrix)) : e.pivotMatrix && r.setPivotMatrix(w.FromArray(e.pivotMatrix)), r.setEnabled(e.isEnabled), r._waitingParsedUniqueId = e.uniqueId, e.parentId !== void 0 && (r._waitingParentId = e.parentId), e.parentInstanceIndex !== void 0 && (r._waitingParentInstanceIndex = e.parentInstanceIndex), e.animations) { + if (e.localMatrix ? r.setPreTransformMatrix(L.FromArray(e.localMatrix)) : e.pivotMatrix && r.setPivotMatrix(L.FromArray(e.pivotMatrix)), r.setEnabled(e.isEnabled), r._waitingParsedUniqueId = e.uniqueId, e.parentId !== void 0 && (r._waitingParentId = e.parentId), e.parentInstanceIndex !== void 0 && (r._waitingParentInstanceIndex = e.parentInstanceIndex), e.animations) { for (let s = 0; s < e.animations.length; s++) { const a = e.animations[s], o = mr("BABYLON.Animation"); o && r.animations.push(o.Parse(a)); @@ -31378,38 +31379,38 @@ He._TmpTranslation = _.Zero(); He._LookAtVectorCache = new _(0, 0, 0); He._RotationAxisCache = new Ce(); P([ - cn("position") + hn("position") ], He.prototype, "_position", void 0); P([ - cn("rotation") + hn("rotation") ], He.prototype, "_rotation", void 0); P([ - by("rotationQuaternion") + Ay("rotationQuaternion") ], He.prototype, "_rotationQuaternion", void 0); P([ - cn("scaling") + hn("scaling") ], He.prototype, "_scaling", void 0); P([ - U("billboardMode") + w("billboardMode") ], He.prototype, "_billboardMode", void 0); P([ - U() + w() ], He.prototype, "scalingDeterminant", void 0); P([ - U("infiniteDistance") + w("infiniteDistance") ], He.prototype, "_infiniteDistance", void 0); P([ - U() + w() ], He.prototype, "ignoreNonUniformScaling", void 0); P([ - U() + w() ], He.prototype, "reIntegrateRotationIntoRotationQuaternion", void 0); -var Hy = class { +var Ky = class { constructor() { this._checkCollisions = false, this._collisionMask = -1, this._collisionGroup = -1, this._surroundingMeshes = null, this._collider = null, this._oldPositionForCollisions = new _(0, 0, 0), this._diffPositionForCollisions = new _(0, 0, 0), this._collisionResponse = true; } }; -var Ky = class { +var qy = class { constructor() { this.facetNb = 0, this.partitioningSubdivisions = 10, this.partitioningBBoxRatio = 1.01, this.facetDataEnabled = false, this.facetParameters = {}, this.bbSize = _.Zero(), this.subDiv = { // actual number of subdivisions per axis for ComputeNormals() @@ -31423,9 +31424,9 @@ var Ky = class { }, this.facetDepthSort = false, this.facetDepthSortEnabled = false; } }; -var qy = class { +var Yy = class { constructor() { - this._hasVertexAlpha = false, this._useVertexColors = true, this._numBoneInfluencers = 4, this._applyFog = true, this._receiveShadows = false, this._facetData = new Ky(), this._visibility = 1, this._skeleton = null, this._layerMask = 268435455, this._computeBonesUsingShaders = true, this._isActive = false, this._onlyForInstances = false, this._isActiveIntermediate = false, this._onlyForInstancesIntermediate = false, this._actAsRegularMesh = false, this._currentLOD = null, this._currentLODIsUpToDate = false, this._collisionRetryCount = 3, this._morphTargetManager = null, this._renderingGroupId = 0, this._bakedVertexAnimationManager = null, this._material = null, this._positions = null, this._pointerOverDisableMeshTesting = false, this._meshCollisionData = new Hy(), this._enableDistantPicking = false, this._rawBoundingInfo = null; + this._hasVertexAlpha = false, this._useVertexColors = true, this._numBoneInfluencers = 4, this._applyFog = true, this._receiveShadows = false, this._facetData = new qy(), this._visibility = 1, this._skeleton = null, this._layerMask = 268435455, this._computeBonesUsingShaders = true, this._isActive = false, this._onlyForInstances = false, this._isActiveIntermediate = false, this._onlyForInstancesIntermediate = false, this._actAsRegularMesh = false, this._currentLOD = null, this._currentLODIsUpToDate = false, this._collisionRetryCount = 3, this._morphTargetManager = null, this._renderingGroupId = 0, this._bakedVertexAnimationManager = null, this._material = null, this._positions = null, this._pointerOverDisableMeshTesting = false, this._meshCollisionData = new Ky(), this._enableDistantPicking = false, this._rawBoundingInfo = null; } }; var er = class _er extends He { @@ -31764,7 +31765,7 @@ var er = class _er extends He { * @param scene defines the hosting scene */ constructor(e, t = null) { - switch (super(e, t, false), this._internalAbstractMeshDataInfo = new qy(), this._waitingMaterialId = null, this.cullingStrategy = _er.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY, this.onCollideObservable = new he(), this.onCollisionPositionChangeObservable = new he(), this.onMaterialChangedObservable = new he(), this.definedFacingForward = true, this._occlusionQuery = null, this._renderingGroup = null, this.alphaIndex = Number.MAX_VALUE, this.isVisible = true, this.isPickable = true, this.isNearPickable = false, this.isNearGrabbable = false, this.showSubMeshesBoundingBox = false, this.isBlocker = false, this.enablePointerMoveEvents = false, this.outlineColor = Ne.Red(), this.outlineWidth = 0.02, this.overlayColor = Ne.Red(), this.overlayAlpha = 0.5, this.useOctreeForRenderingSelection = true, this.useOctreeForPicking = true, this.useOctreeForCollisions = true, this.alwaysSelectAsActiveMesh = false, this.doNotSyncBoundingInfo = false, this.actionManager = null, this.ellipsoid = new _(0.5, 1, 0.5), this.ellipsoidOffset = new _(0, 0, 0), this.edgesWidth = 1, this.edgesColor = new et(1, 0, 0, 1), this._edgesRenderer = null, this._masterMesh = null, this._boundingInfo = null, this._boundingInfoIsDirty = true, this._renderId = 0, this._intersectionsInProgress = new Array(), this._unIndexed = false, this._lightSources = new Array(), this._waitingData = { + switch (super(e, t, false), this._internalAbstractMeshDataInfo = new Yy(), this._waitingMaterialId = null, this.cullingStrategy = _er.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY, this.onCollideObservable = new he(), this.onCollisionPositionChangeObservable = new he(), this.onMaterialChangedObservable = new he(), this.definedFacingForward = true, this._occlusionQuery = null, this._renderingGroup = null, this.alphaIndex = Number.MAX_VALUE, this.isVisible = true, this.isPickable = true, this.isNearPickable = false, this.isNearGrabbable = false, this.showSubMeshesBoundingBox = false, this.isBlocker = false, this.enablePointerMoveEvents = false, this.outlineColor = Ne.Red(), this.outlineWidth = 0.02, this.overlayColor = Ne.Red(), this.overlayAlpha = 0.5, this.useOctreeForRenderingSelection = true, this.useOctreeForPicking = true, this.useOctreeForCollisions = true, this.alwaysSelectAsActiveMesh = false, this.doNotSyncBoundingInfo = false, this.actionManager = null, this.ellipsoid = new _(0.5, 1, 0.5), this.ellipsoidOffset = new _(0, 0, 0), this.edgesWidth = 1, this.edgesColor = new et(1, 0, 0, 1), this._edgesRenderer = null, this._masterMesh = null, this._boundingInfo = null, this._boundingInfoIsDirty = true, this._renderId = 0, this._intersectionsInProgress = new Array(), this._unIndexed = false, this._lightSources = new Array(), this._waitingData = { lods: null, actions: null, freezeWorldMatrix: null @@ -32169,7 +32170,7 @@ var er = class _er extends He { * @returns the new displacement vector */ calcMovePOV(e, t, i) { - const r = new w(); + const r = new L(); (this.rotationQuaternion ? this.rotationQuaternion : Ce.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z)).toRotationMatrix(r); const a = _.Zero(), o = this.definedFacingForward ? -1 : 1; return _.TransformCoordinatesFromFloatsToRef(e * o, t, i * o, r, a), a; @@ -32271,10 +32272,10 @@ var er = class _er extends He { f.reset(); let m, v; for (m = 0; m < 4; m++) - v = a[p + m], v > 0 && (w.FromFloat32ArrayToRefScaled(h, Math.floor(s[p + m] * 16), v, d), f.addToSelf(d)); + v = a[p + m], v > 0 && (L.FromFloat32ArrayToRefScaled(h, Math.floor(s[p + m] * 16), v, d), f.addToSelf(d)); if (o) for (m = 0; m < 4; m++) - v = c[p + m], v > 0 && (w.FromFloat32ArrayToRefScaled(h, Math.floor(l[p + m] * 16), v, d), f.addToSelf(d)); + v = c[p + m], v > 0 && (L.FromFloat32ArrayToRefScaled(h, Math.floor(l[p + m] * 16), v, d), f.addToSelf(d)); r === I.NormalKind ? _.TransformNormalFromFloatsToRef(i[g], i[g + 1], i[g + 2], f, u) : _.TransformCoordinatesFromFloatsToRef(i[g], i[g + 1], i[g + 2], f, u), u.toArray(i, g), r === I.PositionKind && this._positions && this._positions[g / 3].copyFrom(u); } } @@ -32449,7 +32450,7 @@ var er = class _er extends He { if (!this.getBoundingInfo()._checkCollision(e)) return this; const t = z.Matrix[0], i = z.Matrix[1]; - return w.ScalingToRef(1 / e._radius.x, 1 / e._radius.y, 1 / e._radius.z, t), this.worldMatrixFromCache.multiplyToRef(t, i), this._processCollisionsForSubMeshes(e, i), this; + return L.ScalingToRef(1 / e._radius.x, 1 / e._radius.y, 1 / e._radius.z, t), this.worldMatrixFromCache.multiplyToRef(t, i), this._processCollisionsForSubMeshes(e, i), this; } // Picking /** @internal */ @@ -32624,7 +32625,7 @@ var er = class _er extends He { const l = { ind: o * 3, sqDistance: 0 }; e.depthSortedFacets.push(l); } - e.invertedMatrix = w.Identity(), e.facetDepthSortOrigin = _.Zero(); + e.invertedMatrix = L.Identity(), e.facetDepthSortOrigin = _.Zero(); } e.bbSize.x = s.maximum.x - s.minimum.x > xt ? s.maximum.x - s.minimum.x : xt, e.bbSize.y = s.maximum.y - s.minimum.y > xt ? s.maximum.y - s.minimum.y : xt, e.bbSize.z = s.maximum.z - s.minimum.z > xt ? s.maximum.z - s.minimum.z : xt; let a = e.bbSize.x > e.bbSize.y ? e.bbSize.x : e.bbSize.y; @@ -33798,7 +33799,7 @@ var $e = class _$e extends Ai { * @param setActiveOnSceneIfNoneActive Defines if the camera should be set as active after creation if no other camera have been defined in the scene */ constructor(e, t, i, r = true) { - super(e, i), this._position = _.Zero(), this._upVector = _.Up(), this.oblique = null, this._orthoLeft = null, this._orthoRight = null, this._orthoBottom = null, this._orthoTop = null, this.fov = 0.8, this.projectionPlaneTilt = 0, this.minZ = 1, this.maxZ = 1e4, this.inertia = 0.9, this._mode = _$e.PERSPECTIVE_CAMERA, this.isIntermediate = false, this.viewport = new Eo(0, 0, 1, 1), this.layerMask = 268435455, this.fovMode = _$e.FOVMODE_VERTICAL_FIXED, this.cameraRigMode = _$e.RIG_MODE_NONE, this.customRenderTargets = [], this.outputRenderTarget = null, this.onViewMatrixChangedObservable = new he(), this.onProjectionMatrixChangedObservable = new he(), this.onAfterCheckInputsObservable = new he(), this.onRestoreStateObservable = new he(), this.isRigCamera = false, this._hasMoved = false, this._rigCameras = new Array(), this._skipRendering = false, this._projectionMatrix = new w(), this._postProcesses = new Array(), this._activeMeshes = new Li(256), this._globalPosition = _.Zero(), this._computedViewMatrix = w.Identity(), this._doNotComputeProjectionMatrix = false, this._transformMatrix = w.Zero(), this._refreshFrustumPlanes = true, this._absoluteRotation = Ce.Identity(), this._isCamera = true, this._isLeftCamera = false, this._isRightCamera = false, this.getScene().addCamera(this), r && !this.getScene().activeCamera && (this.getScene().activeCamera = this), this.position = t, this.renderPassId = this.getScene().getEngine().createRenderPassId(`Camera ${e}`); + super(e, i), this._position = _.Zero(), this._upVector = _.Up(), this.oblique = null, this._orthoLeft = null, this._orthoRight = null, this._orthoBottom = null, this._orthoTop = null, this.fov = 0.8, this.projectionPlaneTilt = 0, this.minZ = 1, this.maxZ = 1e4, this.inertia = 0.9, this._mode = _$e.PERSPECTIVE_CAMERA, this.isIntermediate = false, this.viewport = new Eo(0, 0, 1, 1), this.layerMask = 268435455, this.fovMode = _$e.FOVMODE_VERTICAL_FIXED, this.cameraRigMode = _$e.RIG_MODE_NONE, this.customRenderTargets = [], this.outputRenderTarget = null, this.onViewMatrixChangedObservable = new he(), this.onProjectionMatrixChangedObservable = new he(), this.onAfterCheckInputsObservable = new he(), this.onRestoreStateObservable = new he(), this.isRigCamera = false, this._hasMoved = false, this._rigCameras = new Array(), this._skipRendering = false, this._projectionMatrix = new L(), this._postProcesses = new Array(), this._activeMeshes = new Li(256), this._globalPosition = _.Zero(), this._computedViewMatrix = L.Identity(), this._doNotComputeProjectionMatrix = false, this._transformMatrix = L.Zero(), this._refreshFrustumPlanes = true, this._absoluteRotation = Ce.Identity(), this._isCamera = true, this._isLeftCamera = false, this._isRightCamera = false, this.getScene().addCamera(this), r && !this.getScene().activeCamera && (this.getScene().activeCamera = this), this.position = t, this.renderPassId = this.getScene().getEngine().createRenderPassId(`Camera ${e}`); } /** * Store current camera state (fov, position, etc..) @@ -33988,7 +33989,7 @@ var $e = class _$e extends Ai { } /** @internal */ _getViewMatrix() { - return w.Identity(); + return L.Identity(); } /** * Gets the current view matrix of the camera. @@ -34027,10 +34028,10 @@ var $e = class _$e extends Ai { if (this.mode === _$e.PERSPECTIVE_CAMERA) { this._cache.fov = this.fov, this._cache.fovMode = this.fovMode, this._cache.aspectRatio = t.getAspectRatio(this), this._cache.projectionPlaneTilt = this.projectionPlaneTilt, this.minZ <= 0 && (this.minZ = 0.1); let l; - i.useRightHandedSystem ? l = w.PerspectiveFovRHToRef : l = w.PerspectiveFovLHToRef, l(this.fov, t.getAspectRatio(this), r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this._projectionMatrix, this.fovMode === _$e.FOVMODE_VERTICAL_FIXED, t.isNDCHalfZRange, this.projectionPlaneTilt, r); + i.useRightHandedSystem ? l = L.PerspectiveFovRHToRef : l = L.PerspectiveFovLHToRef, l(this.fov, t.getAspectRatio(this), r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this._projectionMatrix, this.fovMode === _$e.FOVMODE_VERTICAL_FIXED, t.isNDCHalfZRange, this.projectionPlaneTilt, r); } else { const l = t.getRenderWidth() / 2, c = t.getRenderHeight() / 2; - i.useRightHandedSystem ? this.oblique ? w.ObliqueOffCenterRHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this.oblique.length, this.oblique.angle, this._computeObliqueDistance(this.oblique.offset), this._projectionMatrix, t.isNDCHalfZRange) : w.OrthoOffCenterRHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this._projectionMatrix, t.isNDCHalfZRange) : this.oblique ? w.ObliqueOffCenterLHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this.oblique.length, this.oblique.angle, this._computeObliqueDistance(this.oblique.offset), this._projectionMatrix, t.isNDCHalfZRange) : w.OrthoOffCenterLHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this._projectionMatrix, t.isNDCHalfZRange), this._cache.orthoLeft = this.orthoLeft, this._cache.orthoRight = this.orthoRight, this._cache.orthoBottom = this.orthoBottom, this._cache.orthoTop = this.orthoTop, this._cache.obliqueAngle = (s = this.oblique) == null ? void 0 : s.angle, this._cache.obliqueLength = (a = this.oblique) == null ? void 0 : a.length, this._cache.obliqueOffset = (o = this.oblique) == null ? void 0 : o.offset, this._cache.renderWidth = t.getRenderWidth(), this._cache.renderHeight = t.getRenderHeight(); + i.useRightHandedSystem ? this.oblique ? L.ObliqueOffCenterRHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this.oblique.length, this.oblique.angle, this._computeObliqueDistance(this.oblique.offset), this._projectionMatrix, t.isNDCHalfZRange) : L.OrthoOffCenterRHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this._projectionMatrix, t.isNDCHalfZRange) : this.oblique ? L.ObliqueOffCenterLHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this.oblique.length, this.oblique.angle, this._computeObliqueDistance(this.oblique.offset), this._projectionMatrix, t.isNDCHalfZRange) : L.OrthoOffCenterLHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this._projectionMatrix, t.isNDCHalfZRange), this._cache.orthoLeft = this.orthoLeft, this._cache.orthoRight = this.orthoRight, this._cache.orthoBottom = this.orthoBottom, this._cache.orthoTop = this.orthoTop, this._cache.obliqueAngle = (s = this.oblique) == null ? void 0 : s.angle, this._cache.obliqueLength = (a = this.oblique) == null ? void 0 : a.length, this._cache.obliqueOffset = (o = this.oblique) == null ? void 0 : o.offset, this._cache.renderWidth = t.getRenderWidth(), this._cache.renderHeight = t.getRenderHeight(); } return this.onProjectionMatrixChangedObservable.notifyObservers(this), this._projectionMatrix; } @@ -34189,7 +34190,7 @@ var $e = class _$e extends Ai { } /** @internal */ _getVRProjectionMatrix() { - return w.PerspectiveFovLHToRef(this._cameraRigParams.vrMetrics.aspectRatioFov, this._cameraRigParams.vrMetrics.aspectRatio, this.minZ, this.maxZ, this._cameraRigParams.vrWorkMatrix, true, this.getEngine().isNDCHalfZRange), this._cameraRigParams.vrWorkMatrix.multiplyToRef(this._cameraRigParams.vrHMatrix, this._projectionMatrix), this._projectionMatrix; + return L.PerspectiveFovLHToRef(this._cameraRigParams.vrMetrics.aspectRatioFov, this._cameraRigParams.vrMetrics.aspectRatio, this.minZ, this.maxZ, this._cameraRigParams.vrWorkMatrix, true, this.getEngine().isNDCHalfZRange), this._cameraRigParams.vrWorkMatrix.multiplyToRef(this._cameraRigParams.vrHMatrix, this._projectionMatrix), this._projectionMatrix; } /** * @internal @@ -34327,55 +34328,55 @@ $e.RIG_MODE_VR = 20; $e.RIG_MODE_CUSTOM = 22; $e.ForceAttachControlToAlwaysPreventDefault = false; P([ - cn("position") + hn("position") ], $e.prototype, "_position", void 0); P([ - cn("upVector") + hn("upVector") ], $e.prototype, "_upVector", void 0); P([ - U() + w() ], $e.prototype, "orthoLeft", null); P([ - U() + w() ], $e.prototype, "orthoRight", null); P([ - U() + w() ], $e.prototype, "orthoBottom", null); P([ - U() + w() ], $e.prototype, "orthoTop", null); P([ - U() + w() ], $e.prototype, "fov", void 0); P([ - U() + w() ], $e.prototype, "projectionPlaneTilt", void 0); P([ - U() + w() ], $e.prototype, "minZ", void 0); P([ - U() + w() ], $e.prototype, "maxZ", void 0); P([ - U() + w() ], $e.prototype, "inertia", void 0); P([ - U() + w() ], $e.prototype, "mode", null); P([ - U() + w() ], $e.prototype, "layerMask", void 0); P([ - U() + w() ], $e.prototype, "fovMode", void 0); P([ - U() + w() ], $e.prototype, "cameraRigMode", void 0); P([ - U() + w() ], $e.prototype, "interaxialDistance", void 0); P([ - U() + w() ], $e.prototype, "isStereoscopicSideBySide", void 0); var zs = class { /** @@ -34494,28 +34495,28 @@ var zs = class { } }; P([ - U() + w() ], zs.prototype, "func", null); P([ - U() + w() ], zs.prototype, "funcRef", null); P([ - U() + w() ], zs.prototype, "funcMask", null); P([ - U() + w() ], zs.prototype, "opStencilFail", null); P([ - U() + w() ], zs.prototype, "opDepthFail", null); P([ - U() + w() ], zs.prototype, "opStencilDepthPass", null); P([ - U() + w() ], zs.prototype, "mask", null); P([ - U() + w() ], zs.prototype, "enabled", null); var Ri; (function(n4) { @@ -34524,11 +34525,11 @@ var Ri; function Nc(n4) { n4.indexOf("vClipPlane") === -1 && n4.push("vClipPlane"), n4.indexOf("vClipPlane2") === -1 && n4.push("vClipPlane2"), n4.indexOf("vClipPlane3") === -1 && n4.push("vClipPlane3"), n4.indexOf("vClipPlane4") === -1 && n4.push("vClipPlane4"), n4.indexOf("vClipPlane5") === -1 && n4.push("vClipPlane5"), n4.indexOf("vClipPlane6") === -1 && n4.push("vClipPlane6"); } -function Yy(n4, e, t) { +function Zy(n4, e, t) { const i = !!(n4.clipPlane ?? e.clipPlane), r = !!(n4.clipPlane2 ?? e.clipPlane2), s = !!(n4.clipPlane3 ?? e.clipPlane3), a = !!(n4.clipPlane4 ?? e.clipPlane4), o = !!(n4.clipPlane5 ?? e.clipPlane5), l = !!(n4.clipPlane6 ?? e.clipPlane6); i && t.push("#define CLIPPLANE"), r && t.push("#define CLIPPLANE2"), s && t.push("#define CLIPPLANE3"), a && t.push("#define CLIPPLANE4"), o && t.push("#define CLIPPLANE5"), l && t.push("#define CLIPPLANE6"); } -function Zy(n4, e, t) { +function jy(n4, e, t) { let i = false; const r = !!(n4.clipPlane ?? e.clipPlane), s = !!(n4.clipPlane2 ?? e.clipPlane2), a = !!(n4.clipPlane3 ?? e.clipPlane3), o = !!(n4.clipPlane4 ?? e.clipPlane4), l = !!(n4.clipPlane5 ?? e.clipPlane5), c = !!(n4.clipPlane6 ?? e.clipPlane6); return t.CLIPPLANE !== r && (t.CLIPPLANE = r, i = true), t.CLIPPLANE2 !== s && (t.CLIPPLANE2 = s, i = true), t.CLIPPLANE3 !== a && (t.CLIPPLANE3 = a, i = true), t.CLIPPLANE4 !== o && (t.CLIPPLANE4 = o, i = true), t.CLIPPLANE5 !== l && (t.CLIPPLANE5 = l, i = true), t.CLIPPLANE6 !== c && (t.CLIPPLANE6 = c, i = true), i; @@ -34540,7 +34541,7 @@ function Fc(n4, e, t) { function Qn(n4, e, t) { t && n4.setFloat4(e, t.normal.x, t.normal.y, t.normal.z, t.d); } -var hg = Ne.Black(); +var ug = Ne.Black(); function Lc(n4, e, t) { if (!n4 || n4.LOGARITHMICDEPTH || n4.indexOf && n4.indexOf("LOGARITHMICDEPTH") >= 0) { const i = t.activeCamera; @@ -34548,7 +34549,7 @@ function Lc(n4, e, t) { } } function wc(n4, e, t, i = false) { - t && n4.fogEnabled && (!e || e.applyFog) && n4.fogMode !== 0 && (t.setFloat4("vFogInfos", n4.fogMode, n4.fogStart, n4.fogEnd, n4.fogDensity), i ? (n4.fogColor.toLinearSpaceToRef(hg, n4.getEngine().useExactSrgbConversions), t.setColor3("vFogColor", hg)) : t.setColor3("vFogColor", n4.fogColor)); + t && n4.fogEnabled && (!e || e.applyFog) && n4.fogMode !== 0 && (t.setFloat4("vFogInfos", n4.fogMode, n4.fogStart, n4.fogEnd, n4.fogDensity), i ? (n4.fogColor.toLinearSpaceToRef(ug, n4.getEngine().useExactSrgbConversions), t.setColor3("vFogColor", ug)) : t.setColor3("vFogColor", n4.fogColor)); } function Q_(n4, e, t) { const i = t.NUM_MORPH_INFLUENCERS; @@ -34564,7 +34565,7 @@ function Q_(n4, e, t) { function J_(n4, e = false) { n4.push("world0"), n4.push("world1"), n4.push("world2"), n4.push("world3"), e && (n4.push("previousWorld0"), n4.push("previousWorld1"), n4.push("previousWorld2"), n4.push("previousWorld3")); } -function nf(n4, e) { +function af(n4, e) { const t = n4.morphTargetManager; !n4 || !t || e.setFloatArray("morphTargetInfluences", t.influences); } @@ -34578,13 +34579,13 @@ function Mt(n4, e, t) { const i = n4.getTextureMatrix(); e.updateMatrix(t + "Matrix", i); } -function af(n4, e, t) { +function of(n4, e, t) { t.BAKED_VERTEX_ANIMATION_TEXTURE && t.INSTANCES && n4.push("bakedVertexAnimationSettingsInstanced"); } -function jy(n4, e) { +function Qy(n4, e) { return e.set(n4), e; } -function of(n4, e, t) { +function lf(n4, e, t) { if (!(!e || !n4) && (n4.computeBonesUsingShaders && e._bonesComputationForcedToCPU && (n4.computeBonesUsingShaders = false), n4.useBones && n4.computeBonesUsingShaders && n4.skeleton)) { const i = n4.skeleton; if (i.isUsingTextureForMatrices && e.getUniformIndex("boneTextureWidth") > -1) { @@ -34592,24 +34593,24 @@ function of(n4, e, t) { e.setTexture("boneSampler", r), e.setFloat("boneTextureWidth", 4 * (i.bones.length + 1)); } else { const r = i.getTransformMatrices(n4); - r && (e.setMatrices("mBones", r), t && n4.getScene().prePassRenderer && n4.getScene().prePassRenderer.getIndex(2) && (t.previousBones[n4.uniqueId] || (t.previousBones[n4.uniqueId] = r.slice()), e.setMatrices("mPreviousBones", t.previousBones[n4.uniqueId]), jy(r, t.previousBones[n4.uniqueId]))); + r && (e.setMatrices("mBones", r), t && n4.getScene().prePassRenderer && n4.getScene().prePassRenderer.getIndex(2) && (t.previousBones[n4.uniqueId] || (t.previousBones[n4.uniqueId] = r.slice()), e.setMatrices("mPreviousBones", t.previousBones[n4.uniqueId]), Qy(r, t.previousBones[n4.uniqueId]))); } } } -function Qy(n4, e, t, i, r, s = true) { +function Jy(n4, e, t, i, r, s = true) { n4._bindLight(e, t, i, r, s); } function e0(n4, e, t, i, r = 4) { const s = Math.min(e.lightSources.length, r); for (let a = 0; a < s; a++) { const o = e.lightSources[a]; - Qy(o, a, n4, t, typeof i == "boolean" ? i : i.SPECULARTERM, e.receiveShadows); + Jy(o, a, n4, t, typeof i == "boolean" ? i : i.SPECULARTERM, e.receiveShadows); } } function t0(n4, e, t, i) { t.NUM_BONE_INFLUENCERS > 0 && (i.addCPUSkinningFallback(0, e), n4.push("matricesIndices"), n4.push("matricesWeights"), t.NUM_BONE_INFLUENCERS > 4 && (n4.push("matricesIndicesExtra"), n4.push("matricesWeightsExtra"))); } -function lf(n4, e) { +function cf(n4, e) { (e.INSTANCES || e.THIN_INSTANCES) && J_(n4, !!e.PREPASS_VELOCITY), e.INSTANCESCOLOR && n4.push("instanceColor"); } function i0(n4, e, t = 4, i = 0) { @@ -34618,11 +34619,11 @@ function i0(n4, e, t = 4, i = 0) { s > 0 && (r = i + s, e.addFallback(r, "LIGHT" + s)), n4.SHADOWS || (n4["SHADOW" + s] && e.addFallback(i, "SHADOW" + s), n4["SHADOWPCF" + s] && e.addFallback(i, "SHADOWPCF" + s), n4["SHADOWPCSS" + s] && e.addFallback(i, "SHADOWPCSS" + s), n4["SHADOWPOISSON" + s] && e.addFallback(i, "SHADOWPOISSON" + s), n4["SHADOWESM" + s] && e.addFallback(i, "SHADOWESM" + s), n4["SHADOWCLOSEESM" + s] && e.addFallback(i, "SHADOWCLOSEESM" + s)); return r++; } -function Jy(n4, e) { +function $y(n4, e) { return e.fogEnabled && n4.applyFog && e.fogMode !== 0; } -function cf(n4, e, t, i, r, s, a, o = false) { - a._areMiscDirty && (a.LOGARITHMICDEPTH = t, a.POINTSIZE = i, a.FOG = r && Jy(n4, e), a.NONUNIFORMSCALING = n4.nonUniformScaling, a.ALPHATEST = s, a.DECAL_AFTER_DETAIL = o); +function hf(n4, e, t, i, r, s, a, o = false) { + a._areMiscDirty && (a.LOGARITHMICDEPTH = t, a.POINTSIZE = i, a.FOG = r && $y(n4, e), a.NONUNIFORMSCALING = n4.nonUniformScaling, a.ALPHATEST = s, a.DECAL_AFTER_DETAIL = o); } function r0(n4, e, t, i, r = 4, s = false) { if (!t._areLightsDirty) @@ -34637,7 +34638,7 @@ function r0(n4, e, t, i, r = 4, s = false) { }; if (n4.lightsEnabled && !s) { for (const c of e.lightSources) - if ($y(n4, e, c, a, t, i, o), a++, a === r) + if (eI(n4, e, c, a, t, i, o), a++, a === r) break; } t.SPECULARTERM = o.specularEnabled, t.SHADOWS = o.shadowEnabled; @@ -34646,7 +34647,7 @@ function r0(n4, e, t, i, r = 4, s = false) { const l = n4.getEngine().getCaps(); return t.SHADOWFLOAT === void 0 && (o.needRebuild = true), t.SHADOWFLOAT = o.shadowEnabled && (l.textureFloatRender && l.textureFloatLinearFiltering || l.textureHalfFloatRender && l.textureHalfFloatLinearFiltering), t.LIGHTMAPEXCLUDED = o.lightmapMode, o.needRebuild && t.rebuild(), o.needNormals; } -function $y(n4, e, t, i, r, s, a) { +function eI(n4, e, t, i, r, s, a) { switch (a.needNormals = true, r["LIGHT" + i] === void 0 && (a.needRebuild = true), r["LIGHT" + i] = true, r["SPOTLIGHT" + i] = false, r["HEMILIGHT" + i] = false, r["POINTLIGHT" + i] = false, r["DIRLIGHT" + i] = false, t.prepareLightSpecificDefines(r, i), r["LIGHT_FALLOFF_PHYSICAL" + i] = false, r["LIGHT_FALLOFF_GLTF" + i] = false, r["LIGHT_FALLOFF_STANDARD" + i] = false, t.falloffType) { case Et.FALLOFF_GLTF: r["LIGHT_FALLOFF_GLTF" + i] = true; @@ -34667,11 +34668,11 @@ function $y(n4, e, t, i, r, s, a) { } t.lightmapMode != Et.LIGHTMAP_DEFAULT ? (a.lightmapMode = true, r["LIGHTMAPEXCLUDED" + i] = true, r["LIGHTMAPNOSPECULAR" + i] = t.lightmapMode == Et.LIGHTMAP_SHADOWSONLY) : (r["LIGHTMAPEXCLUDED" + i] = false, r["LIGHTMAPNOSPECULAR" + i] = false); } -function hf(n4, e, t, i, r, s = null, a = false) { - let o = rI(n4, i); - s !== false && (o = Zy(t, n4, i)), i.DEPTHPREPASS !== !e.getColorWrite() && (i.DEPTHPREPASS = !i.DEPTHPREPASS, o = true), i.INSTANCES !== r && (i.INSTANCES = r, o = true), i.THIN_INSTANCES !== a && (i.THIN_INSTANCES = a, o = true), o && i.markAsUnprocessed(); +function uf(n4, e, t, i, r, s = null, a = false) { + let o = sI(n4, i); + s !== false && (o = jy(t, n4, i)), i.DEPTHPREPASS !== !e.getColorWrite() && (i.DEPTHPREPASS = !i.DEPTHPREPASS, o = true), i.INSTANCES !== r && (i.INSTANCES = r, o = true), i.THIN_INSTANCES !== a && (i.THIN_INSTANCES = a, o = true), o && i.markAsUnprocessed(); } -function eI(n4, e) { +function tI(n4, e) { if (n4.useBones && n4.computeBonesUsingShaders && n4.skeleton) { e.NUM_BONE_INFLUENCERS = n4.numBoneInfluencers; const t = e.BONETEXTURE !== void 0; @@ -34688,15 +34689,15 @@ function eI(n4, e) { } else e.NUM_BONE_INFLUENCERS = 0, e.BonesPerMesh = 0, e.BONETEXTURE !== void 0 && (e.BONETEXTURE = false); } -function tI(n4, e) { +function iI(n4, e) { const t = n4.morphTargetManager; t ? (e.MORPHTARGETS_UV = t.supportsUVs && e.UV1, e.MORPHTARGETS_TANGENT = t.supportsTangents && e.TANGENT, e.MORPHTARGETS_NORMAL = t.supportsNormals && e.NORMAL, e.NUM_MORPH_INFLUENCERS = t.numMaxInfluencers || t.numInfluencers, e.MORPHTARGETS = e.NUM_MORPH_INFLUENCERS > 0, e.MORPHTARGETS_TEXTURE = t.isUsingTextureForTargets) : (e.MORPHTARGETS_UV = false, e.MORPHTARGETS_TANGENT = false, e.MORPHTARGETS_NORMAL = false, e.MORPHTARGETS = false, e.NUM_MORPH_INFLUENCERS = 0); } -function iI(n4, e) { +function rI(n4, e) { const t = n4.bakedVertexAnimationManager; e.BAKED_VERTEX_ANIMATION_TEXTURE = !!(t && t.isEnabled); } -function uf(n4, e, t, i, r = false, s = true, a = true) { +function ff(n4, e, t, i, r = false, s = true, a = true) { if (!e._areAttributesDirty && e._needNormals === e._normals && e._needUVs === e._uvs) return false; e._normals = e._needNormals, e._uvs = e._needUVs, e.NORMAL = e._needNormals && n4.isVerticesDataPresent("normal"), e._needNormals && n4.isVerticesDataPresent("tangent") && (e.TANGENT = true); @@ -34706,7 +34707,7 @@ function uf(n4, e, t, i, r = false, s = true, a = true) { const o = n4.useVertexColors && n4.isVerticesDataPresent("color"); e.VERTEXCOLOR = o, e.VERTEXALPHA = n4.hasVertexAlpha && o && s; } - return n4.isVerticesDataPresent("instanceColor") && (n4.hasInstances || n4.hasThinInstances) && (e.INSTANCESCOLOR = true), i && eI(n4, e), r && tI(n4, e), a && iI(n4, e), true; + return n4.isVerticesDataPresent("instanceColor") && (n4.hasInstances || n4.hasThinInstances) && (e.INSTANCESCOLOR = true), i && tI(n4, e), r && iI(n4, e), a && rI(n4, e), true; } function s0(n4, e) { if (n4.activeCamera) { @@ -34772,7 +34773,7 @@ function a0(n4, e, t) { } e.PREPASS != i && (e.markAsUnprocessed(), e.markAsImageProcessingDirty()); } -function rI(n4, e) { +function sI(n4, e) { let t = false; if (n4.activeCamera) { const i = e.CAMERA_ORTHOGRAPHIC ? 1 : 0, r = e.CAMERA_PERSPECTIVE ? 1 : 0, s = n4.activeCamera.mode === 1 ? 1 : 0, a = n4.activeCamera.mode === 0 ? 1 : 0; @@ -34780,10 +34781,10 @@ function rI(n4, e) { } return t; } -function sI(n4, e, t, i, r = null, s = false) { +function nI(n4, e, t, i, r = null, s = false) { r && r.push("Light" + n4), !s && (e.push("vLightData" + n4, "vLightDiffuse" + n4, "vLightSpecular" + n4, "vLightDirection" + n4, "vLightFalloff" + n4, "vLightGround" + n4, "lightMatrix" + n4, "shadowsInfo" + n4, "depthValues" + n4), t.push("shadowSampler" + n4), t.push("depthSampler" + n4), e.push("viewFrustumZ" + n4, "cascadeBlendFactor" + n4, "lightSizeUVCorrection" + n4, "depthCorrection" + n4, "penumbraDarkness" + n4, "frustumLengths" + n4), i && (t.push("projectionLightSampler" + n4), e.push("textureProjectionMatrix" + n4))); } -function ff(n4, e, t, i = 4) { +function df(n4, e, t, i = 4) { let r, s = null; if (n4.uniformsNames) { const a = n4; @@ -34791,7 +34792,7 @@ function ff(n4, e, t, i = 4) { } else r = n4, e || (e = []); for (let a = 0; a < i && t["LIGHT" + a]; a++) - sI(a, r, e, t["PROJECTEDLIGHTTEXTURE" + a], s); + nI(a, r, e, t["PROJECTEDLIGHTTEXTURE" + a], s); t.NUM_MORPH_INFLUENCERS && (r.push("morphTargetInfluences"), r.push("morphTargetCount")), t.BAKED_VERTEX_ANIMATION_TEXTURE && (r.push("bakedVertexAnimationSettings"), r.push("bakedVertexAnimationTextureSizeInverted"), r.push("bakedVertexAnimationTime"), e.push("bakedVertexAnimationTexture")); } var ie = class _ie { @@ -35354,7 +35355,7 @@ var ie = class _ie { if (!this._scene || !this._scene.getEngine()) return; const c = a.clipPlane; - if (s.clipPlane && (a.clipPlane = new qr(0, 0, 0, 1)), this._storeEffectOnSubMeshes) { + if (s.clipPlane && (a.clipPlane = new Yr(0, 0, 0, 1)), this._storeEffectOnSubMeshes) { let h = true, u = null; if (e.subMeshes) { const f = new bi(0, 0, 0, 0, 0, e, void 0, false, false); @@ -35630,82 +35631,82 @@ ie._RunDirtyCallBacks = (n4) => { e(n4); }; P([ - U() + w() ], ie.prototype, "id", void 0); P([ - U() + w() ], ie.prototype, "uniqueId", void 0); P([ - U() + w() ], ie.prototype, "name", void 0); P([ - U() + w() ], ie.prototype, "metadata", void 0); P([ - U() + w() ], ie.prototype, "checkReadyOnEveryCall", void 0); P([ - U() + w() ], ie.prototype, "checkReadyOnlyOnce", void 0); P([ - U() + w() ], ie.prototype, "state", void 0); P([ - U("alpha") + w("alpha") ], ie.prototype, "_alpha", void 0); P([ - U("backFaceCulling") + w("backFaceCulling") ], ie.prototype, "_backFaceCulling", void 0); P([ - U("cullBackFaces") + w("cullBackFaces") ], ie.prototype, "_cullBackFaces", void 0); P([ - U() + w() ], ie.prototype, "sideOrientation", void 0); P([ - U("alphaMode") + w("alphaMode") ], ie.prototype, "_alphaMode", void 0); P([ - U() + w() ], ie.prototype, "_needDepthPrePass", void 0); P([ - U() + w() ], ie.prototype, "disableDepthWrite", void 0); P([ - U() + w() ], ie.prototype, "disableColorWrite", void 0); P([ - U() + w() ], ie.prototype, "forceDepthWrite", void 0); P([ - U() + w() ], ie.prototype, "depthFunction", void 0); P([ - U() + w() ], ie.prototype, "separateCullingPass", void 0); P([ - U("fogEnabled") + w("fogEnabled") ], ie.prototype, "_fogEnabled", void 0); P([ - U() + w() ], ie.prototype, "pointSize", void 0); P([ - U() + w() ], ie.prototype, "zOffset", void 0); P([ - U() + w() ], ie.prototype, "zOffsetUnits", void 0); P([ - U() + w() ], ie.prototype, "pointsCloud", null); P([ - U() + w() ], ie.prototype, "fillMode", null); P([ - U() + w() ], ie.prototype, "useLogarithmicDepth", null); P([ - U() + w() ], ie.prototype, "transparencyMode", null); var Aa = class _Aa extends ie { /** @@ -35865,7 +35866,7 @@ var Aa = class _Aa extends ie { } }; Re("BABYLON.MultiMaterial", Aa); -var nI = class { +var aI = class { /** * Creates a new LOD level * @param distanceOrScreenCoverage defines either the distance or the screen coverage where this level should start being displayed @@ -35877,22 +35878,22 @@ var nI = class { }; var o0 = class { }; -var aI = class { +var oI = class { constructor() { - this.visibleInstances = {}, this.batchCache = new ug(), this.batchCacheReplacementModeInFrozenMode = new ug(), this.instancesBufferSize = 32 * 16 * 4; + this.visibleInstances = {}, this.batchCache = new fg(), this.batchCacheReplacementModeInFrozenMode = new fg(), this.instancesBufferSize = 32 * 16 * 4; } }; -var ug = class { +var fg = class { constructor() { this.mustReturn = false, this.visibleInstances = new Array(), this.renderSelf = [], this.hardwareInstancedRendering = []; } }; -var oI = class { +var lI = class { constructor() { this.instancesCount = 0, this.matrixBuffer = null, this.previousMatrixBuffer = null, this.matrixBufferSize = 32 * 16, this.matrixData = null, this.boundingVectors = [], this.worldMatrices = null; } }; -var lI = class { +var cI = class { constructor() { this._areNormalsFrozen = false, this._source = null, this.meshMap = null, this._preActivateId = -1, this._LODLevels = new Array(), this._useLODScreenCoverage = false, this._effectiveMaterial = null, this._forcedInstanceCount = 0, this._overrideRenderingFillMode = null; } @@ -36048,7 +36049,7 @@ var B = class _B2 extends er { * @param clonePhysicsImpostor When cloning, include cloning mesh physics impostor, default True. */ constructor(e, t = null, i = null, r = null, s, a = true) { - if (super(e, t), this._internalMeshDataInfo = new lI(), this.delayLoadState = 0, this.instances = [], this._creationDataStorage = null, this._geometry = null, this._instanceDataStorage = new aI(), this._thinInstanceDataStorage = new oI(), this._shouldGenerateFlatShading = false, this._originalBuilderSideOrientation = _B2.DEFAULTSIDE, this.overrideMaterialSideOrientation = null, this.ignoreCameraMaxZ = false, t = this.getScene(), this._onBeforeDraw = (o, l, c) => { + if (super(e, t), this._internalMeshDataInfo = new cI(), this.delayLoadState = 0, this.instances = [], this._creationDataStorage = null, this._geometry = null, this._instanceDataStorage = new oI(), this._thinInstanceDataStorage = new lI(), this._shouldGenerateFlatShading = false, this._originalBuilderSideOrientation = _B2.DEFAULTSIDE, this.overrideMaterialSideOrientation = null, this.ignoreCameraMaxZ = false, t = this.getScene(), this._onBeforeDraw = (o, l, c) => { o && c && (this._uniformBuffer ? this.transferToEffect(l) : c.bindOnlyWorldMatrix(l)); }, r) { if (r._geometry && r._geometry.applyToMesh(this), Dn.DeepCopy(r, this, [ @@ -36198,7 +36199,7 @@ var B = class _B2 extends er { addLODLevel(e, t) { if (t && t._masterMesh) return ne.Warn("You cannot use a mesh as LOD level twice"), this; - const i = new nI(e, t); + const i = new aI(e, t); return this._internalMeshDataInfo._LODLevels.push(i), t && (t._masterMesh = this), this._sortLODLevels(), this; } /** @@ -36883,13 +36884,13 @@ var B = class _B2 extends er { } } else g = (m ? 1 : 0) + o; - return v ? (h && h.dispose(), u && u.dispose(), h = new fr(s, l.instancesData, true, 16, false, true), l.instancesBuffer = h, this._userInstancedBuffersStorage || (this._userInstancedBuffersStorage = { + return v ? (h && h.dispose(), u && u.dispose(), h = new dr(s, l.instancesData, true, 16, false, true), l.instancesBuffer = h, this._userInstancedBuffersStorage || (this._userInstancedBuffersStorage = { data: {}, vertexBuffers: {}, strides: {}, sizes: {}, vertexArrayObjects: this.getEngine().getCaps().vertexArrayObject ? {} : void 0 - }), this._userInstancedBuffersStorage.vertexBuffers.world0 = h.createVertexBuffer("world0", 0, 4), this._userInstancedBuffersStorage.vertexBuffers.world1 = h.createVertexBuffer("world1", 4, 4), this._userInstancedBuffersStorage.vertexBuffers.world2 = h.createVertexBuffer("world2", 8, 4), this._userInstancedBuffersStorage.vertexBuffers.world3 = h.createVertexBuffer("world3", 12, 4), this._scene.needsPreviousWorldMatrices && (u = new fr(s, l.instancesPreviousData, true, 16, false, true), l.instancesPreviousBuffer = u, this._userInstancedBuffersStorage.vertexBuffers.previousWorld0 = u.createVertexBuffer("previousWorld0", 0, 4), this._userInstancedBuffersStorage.vertexBuffers.previousWorld1 = u.createVertexBuffer("previousWorld1", 4, 4), this._userInstancedBuffersStorage.vertexBuffers.previousWorld2 = u.createVertexBuffer("previousWorld2", 8, 4), this._userInstancedBuffersStorage.vertexBuffers.previousWorld3 = u.createVertexBuffer("previousWorld3", 12, 4)), this._invalidateInstanceVertexArrayObject()) : (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) && (h.updateDirectly(l.instancesData, 0, g), this._scene.needsPreviousWorldMatrices && (!this._instanceDataStorage.manualUpdate || this._instanceDataStorage.previousManualUpdate) && u.updateDirectly(l.instancesPreviousData, 0, g)), this._processInstancedBuffers(a, m), this.getScene()._activeIndices.addCount(e.indexCount * g, false), s._currentDrawContext && (s._currentDrawContext.useInstancing = true), this._bind(e, r, t), this._draw(e, t, g), this._scene.needsPreviousWorldMatrices && !v && this._instanceDataStorage.manualUpdate && (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) && !this._instanceDataStorage.previousManualUpdate && u.updateDirectly(l.instancesData, 0, g), s.unbindInstanceAttributes(), this; + }), this._userInstancedBuffersStorage.vertexBuffers.world0 = h.createVertexBuffer("world0", 0, 4), this._userInstancedBuffersStorage.vertexBuffers.world1 = h.createVertexBuffer("world1", 4, 4), this._userInstancedBuffersStorage.vertexBuffers.world2 = h.createVertexBuffer("world2", 8, 4), this._userInstancedBuffersStorage.vertexBuffers.world3 = h.createVertexBuffer("world3", 12, 4), this._scene.needsPreviousWorldMatrices && (u = new dr(s, l.instancesPreviousData, true, 16, false, true), l.instancesPreviousBuffer = u, this._userInstancedBuffersStorage.vertexBuffers.previousWorld0 = u.createVertexBuffer("previousWorld0", 0, 4), this._userInstancedBuffersStorage.vertexBuffers.previousWorld1 = u.createVertexBuffer("previousWorld1", 4, 4), this._userInstancedBuffersStorage.vertexBuffers.previousWorld2 = u.createVertexBuffer("previousWorld2", 8, 4), this._userInstancedBuffersStorage.vertexBuffers.previousWorld3 = u.createVertexBuffer("previousWorld3", 12, 4)), this._invalidateInstanceVertexArrayObject()) : (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) && (h.updateDirectly(l.instancesData, 0, g), this._scene.needsPreviousWorldMatrices && (!this._instanceDataStorage.manualUpdate || this._instanceDataStorage.previousManualUpdate) && u.updateDirectly(l.instancesPreviousData, 0, g)), this._processInstancedBuffers(a, m), this.getScene()._activeIndices.addCount(e.indexCount * g, false), s._currentDrawContext && (s._currentDrawContext.useInstancing = true), this._bind(e, r, t), this._draw(e, t, g), this._scene.needsPreviousWorldMatrices && !v && this._instanceDataStorage.manualUpdate && (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) && !this._instanceDataStorage.previousManualUpdate && u.updateDirectly(l.instancesData, 0, g), s.unbindInstanceAttributes(), this; } /** * @internal @@ -37683,7 +37684,7 @@ Bad Bone Indices = ` + p; */ static Parse(e, t, i) { let r; - if (e.type && e.type === "LinesMesh" ? r = _B2._LinesMeshParser(e, t) : e.type && e.type === "GroundMesh" ? r = _B2._GroundMeshParser(e, t) : e.type && e.type === "GoldbergMesh" ? r = _B2._GoldbergMeshParser(e, t) : e.type && e.type === "GreasedLineMesh" ? r = _B2._GreasedLineMeshParser(e, t) : e.type && e.type === "TrailMesh" ? r = _B2._TrailMeshParser(e, t) : r = new _B2(e.name, t), r.id = e.id, r._waitingParsedUniqueId = e.uniqueId, rt && rt.AddTagsTo(r, e.tags), r.position = _.FromArray(e.position), e.metadata !== void 0 && (r.metadata = e.metadata), e.rotationQuaternion ? r.rotationQuaternion = Ce.FromArray(e.rotationQuaternion) : e.rotation && (r.rotation = _.FromArray(e.rotation)), r.scaling = _.FromArray(e.scaling), e.localMatrix ? r.setPreTransformMatrix(w.FromArray(e.localMatrix)) : e.pivotMatrix && r.setPivotMatrix(w.FromArray(e.pivotMatrix)), r.setEnabled(e.isEnabled), r.isVisible = e.isVisible, r.infiniteDistance = e.infiniteDistance, r.alwaysSelectAsActiveMesh = !!e.alwaysSelectAsActiveMesh, r.showBoundingBox = e.showBoundingBox, r.showSubMeshesBoundingBox = e.showSubMeshesBoundingBox, e.applyFog !== void 0 && (r.applyFog = e.applyFog), e.pickable !== void 0 && (r.isPickable = e.pickable), e.alphaIndex !== void 0 && (r.alphaIndex = e.alphaIndex), r.receiveShadows = e.receiveShadows, e.billboardMode !== void 0 && (r.billboardMode = e.billboardMode), e.visibility !== void 0 && (r.visibility = e.visibility), r.checkCollisions = e.checkCollisions, r.doNotSyncBoundingInfo = !!e.doNotSyncBoundingInfo, e.ellipsoid && (r.ellipsoid = _.FromArray(e.ellipsoid)), e.ellipsoidOffset && (r.ellipsoidOffset = _.FromArray(e.ellipsoidOffset)), e.overrideMaterialSideOrientation !== void 0 && (r.overrideMaterialSideOrientation = e.overrideMaterialSideOrientation), e.isBlocker !== void 0 && (r.isBlocker = e.isBlocker), r._shouldGenerateFlatShading = e.useFlatShading, e.freezeWorldMatrix && (r._waitingData.freezeWorldMatrix = e.freezeWorldMatrix), e.parentId !== void 0 && (r._waitingParentId = e.parentId), e.parentInstanceIndex !== void 0 && (r._waitingParentInstanceIndex = e.parentInstanceIndex), e.actions !== void 0 && (r._waitingData.actions = e.actions), e.overlayAlpha !== void 0 && (r.overlayAlpha = e.overlayAlpha), e.overlayColor !== void 0 && (r.overlayColor = Ne.FromArray(e.overlayColor)), e.renderOverlay !== void 0 && (r.renderOverlay = e.renderOverlay), r.isUnIndexed = !!e.isUnIndexed, r.hasVertexAlpha = e.hasVertexAlpha, e.delayLoadingFile ? (r.delayLoadState = 4, r.delayLoadingFile = i + e.delayLoadingFile, r.buildBoundingInfo(_.FromArray(e.boundingBoxMinimum), _.FromArray(e.boundingBoxMaximum)), e._binaryInfo && (r._binaryInfo = e._binaryInfo), r._delayInfo = [], e.hasUVs && r._delayInfo.push(I.UVKind), e.hasUVs2 && r._delayInfo.push(I.UV2Kind), e.hasUVs3 && r._delayInfo.push(I.UV3Kind), e.hasUVs4 && r._delayInfo.push(I.UV4Kind), e.hasUVs5 && r._delayInfo.push(I.UV5Kind), e.hasUVs6 && r._delayInfo.push(I.UV6Kind), e.hasColors && r._delayInfo.push(I.ColorKind), e.hasMatricesIndices && r._delayInfo.push(I.MatricesIndicesKind), e.hasMatricesWeights && r._delayInfo.push(I.MatricesWeightsKind), r._delayLoadingFunction = is._ImportGeometry, ir.ForceFullSceneLoadingForIncremental && r._checkDelayState()) : is._ImportGeometry(e, r), e.materialUniqueId ? r._waitingMaterialId = e.materialUniqueId : e.materialId && (r._waitingMaterialId = e.materialId), e.morphTargetManagerId > -1 && (r.morphTargetManager = t.getMorphTargetManagerById(e.morphTargetManagerId)), e.skeletonId !== void 0 && e.skeletonId !== null && (r.skeleton = t.getLastSkeletonById(e.skeletonId), e.numBoneInfluencers && (r.numBoneInfluencers = e.numBoneInfluencers)), e.animations) { + if (e.type && e.type === "LinesMesh" ? r = _B2._LinesMeshParser(e, t) : e.type && e.type === "GroundMesh" ? r = _B2._GroundMeshParser(e, t) : e.type && e.type === "GoldbergMesh" ? r = _B2._GoldbergMeshParser(e, t) : e.type && e.type === "GreasedLineMesh" ? r = _B2._GreasedLineMeshParser(e, t) : e.type && e.type === "TrailMesh" ? r = _B2._TrailMeshParser(e, t) : r = new _B2(e.name, t), r.id = e.id, r._waitingParsedUniqueId = e.uniqueId, rt && rt.AddTagsTo(r, e.tags), r.position = _.FromArray(e.position), e.metadata !== void 0 && (r.metadata = e.metadata), e.rotationQuaternion ? r.rotationQuaternion = Ce.FromArray(e.rotationQuaternion) : e.rotation && (r.rotation = _.FromArray(e.rotation)), r.scaling = _.FromArray(e.scaling), e.localMatrix ? r.setPreTransformMatrix(L.FromArray(e.localMatrix)) : e.pivotMatrix && r.setPivotMatrix(L.FromArray(e.pivotMatrix)), r.setEnabled(e.isEnabled), r.isVisible = e.isVisible, r.infiniteDistance = e.infiniteDistance, r.alwaysSelectAsActiveMesh = !!e.alwaysSelectAsActiveMesh, r.showBoundingBox = e.showBoundingBox, r.showSubMeshesBoundingBox = e.showSubMeshesBoundingBox, e.applyFog !== void 0 && (r.applyFog = e.applyFog), e.pickable !== void 0 && (r.isPickable = e.pickable), e.alphaIndex !== void 0 && (r.alphaIndex = e.alphaIndex), r.receiveShadows = e.receiveShadows, e.billboardMode !== void 0 && (r.billboardMode = e.billboardMode), e.visibility !== void 0 && (r.visibility = e.visibility), r.checkCollisions = e.checkCollisions, r.doNotSyncBoundingInfo = !!e.doNotSyncBoundingInfo, e.ellipsoid && (r.ellipsoid = _.FromArray(e.ellipsoid)), e.ellipsoidOffset && (r.ellipsoidOffset = _.FromArray(e.ellipsoidOffset)), e.overrideMaterialSideOrientation !== void 0 && (r.overrideMaterialSideOrientation = e.overrideMaterialSideOrientation), e.isBlocker !== void 0 && (r.isBlocker = e.isBlocker), r._shouldGenerateFlatShading = e.useFlatShading, e.freezeWorldMatrix && (r._waitingData.freezeWorldMatrix = e.freezeWorldMatrix), e.parentId !== void 0 && (r._waitingParentId = e.parentId), e.parentInstanceIndex !== void 0 && (r._waitingParentInstanceIndex = e.parentInstanceIndex), e.actions !== void 0 && (r._waitingData.actions = e.actions), e.overlayAlpha !== void 0 && (r.overlayAlpha = e.overlayAlpha), e.overlayColor !== void 0 && (r.overlayColor = Ne.FromArray(e.overlayColor)), e.renderOverlay !== void 0 && (r.renderOverlay = e.renderOverlay), r.isUnIndexed = !!e.isUnIndexed, r.hasVertexAlpha = e.hasVertexAlpha, e.delayLoadingFile ? (r.delayLoadState = 4, r.delayLoadingFile = i + e.delayLoadingFile, r.buildBoundingInfo(_.FromArray(e.boundingBoxMinimum), _.FromArray(e.boundingBoxMaximum)), e._binaryInfo && (r._binaryInfo = e._binaryInfo), r._delayInfo = [], e.hasUVs && r._delayInfo.push(I.UVKind), e.hasUVs2 && r._delayInfo.push(I.UV2Kind), e.hasUVs3 && r._delayInfo.push(I.UV3Kind), e.hasUVs4 && r._delayInfo.push(I.UV4Kind), e.hasUVs5 && r._delayInfo.push(I.UV5Kind), e.hasUVs6 && r._delayInfo.push(I.UV6Kind), e.hasColors && r._delayInfo.push(I.ColorKind), e.hasMatricesIndices && r._delayInfo.push(I.MatricesIndicesKind), e.hasMatricesWeights && r._delayInfo.push(I.MatricesWeightsKind), r._delayLoadingFunction = is._ImportGeometry, ir.ForceFullSceneLoadingForIncremental && r._checkDelayState()) : is._ImportGeometry(e, r), e.materialUniqueId ? r._waitingMaterialId = e.materialUniqueId : e.materialId && (r._waitingMaterialId = e.materialId), e.morphTargetManagerId > -1 && (r.morphTargetManager = t.getMorphTargetManagerById(e.morphTargetManagerId)), e.skeletonId !== void 0 && e.skeletonId !== null && (r.skeleton = t.getLastSkeletonById(e.skeletonId), e.numBoneInfluencers && (r.numBoneInfluencers = e.numBoneInfluencers)), e.animations) { for (let s = 0; s < e.animations.length; s++) { const a = e.animations[s], o = mr("BABYLON.Animation"); o && r.animations.push(o.Parse(a)); @@ -37779,15 +37780,15 @@ Bad Bone Indices = ` + p; const a = this.getVerticesData(I.MatricesIndicesKind), o = this.getVerticesData(I.MatricesWeightsKind); if (!o || !a) return this; - const l = this.numBoneInfluencers > 4, c = l ? this.getVerticesData(I.MatricesIndicesExtraKind) : null, h = l ? this.getVerticesData(I.MatricesWeightsExtraKind) : null, u = e.getTransformMatrices(this), f = _.Zero(), d = new w(), p = new w(); + const l = this.numBoneInfluencers > 4, c = l ? this.getVerticesData(I.MatricesIndicesExtraKind) : null, h = l ? this.getVerticesData(I.MatricesWeightsExtraKind) : null, u = e.getTransformMatrices(this), f = _.Zero(), d = new L(), p = new L(); let g = 0, m; for (let v = 0; v < r.length; v += 3, g += 4) { let E; for (m = 0; m < 4; m++) - E = o[g + m], E > 0 && (w.FromFloat32ArrayToRefScaled(u, Math.floor(a[g + m] * 16), E, p), d.addToSelf(p)); + E = o[g + m], E > 0 && (L.FromFloat32ArrayToRefScaled(u, Math.floor(a[g + m] * 16), E, p), d.addToSelf(p)); if (l) for (m = 0; m < 4; m++) - E = h[g + m], E > 0 && (w.FromFloat32ArrayToRefScaled(u, Math.floor(c[g + m] * 16), E, p), d.addToSelf(p)); + E = h[g + m], E > 0 && (L.FromFloat32ArrayToRefScaled(u, Math.floor(c[g + m] * 16), E, p), d.addToSelf(p)); _.TransformCoordinatesFromFloatsToRef(i._sourcePositions[v], i._sourcePositions[v + 1], i._sourcePositions[v + 2], d, f), f.toArray(r, v), t && (_.TransformNormalFromFloatsToRef(i._sourceNormals[v], i._sourceNormals[v + 1], i._sourceNormals[v + 2], d, f), f.toArray(s, v)), d.reset(); } return this.updateVerticesData(I.PositionKind, r), t && this.updateVerticesData(I.NormalKind, s), this; @@ -37831,7 +37832,7 @@ Bad Bone Indices = ` + p; * @returns a new mesh */ static MergeMeshes(e, t = true, i, r, s, a) { - return sf(_B2._MergeMeshesCoroutine(e, t, i, r, s, a, false)); + return nf(_B2._MergeMeshesCoroutine(e, t, i, r, s, a, false)); } /** * Merge the array of meshes into a single mesh for performance reasons. @@ -37844,7 +37845,7 @@ Bad Bone Indices = ` + p; * @returns a new mesh */ static MergeMeshesAsync(e, t = true, i, r, s, a) { - return j_(_B2._MergeMeshesCoroutine(e, t, i, r, s, a, true), ky()); + return j_(_B2._MergeMeshesCoroutine(e, t, i, r, s, a, true), zy()); } static *_MergeMeshesCoroutine(e, t = true, i, r, s, a, o) { if (e = e.filter(Boolean), e.length === 0) @@ -38454,7 +38455,7 @@ var vo = class _vo { return new _vo(_.Lerp(this.pos, e.pos, t), _.Lerp(this.normal, e.normal, t), this.uv && e.uv ? me.Lerp(this.uv, e.uv, t) : void 0, this.vertColor && e.vertColor ? et.Lerp(this.vertColor, e.vertColor, t) : void 0); } }; -var yn = class _yn { +var In = class _In { /** * Initializes the plane * @param normal The normal for the plane @@ -38475,14 +38476,14 @@ var yn = class _yn { if (r.lengthSquared() === 0 || s.lengthSquared() === 0) return null; const a = _.Normalize(_.Cross(r, s)); - return new _yn(a, _.Dot(a, e)); + return new _In(a, _.Dot(a, e)); } /** * Clone, or make a deep copy of the plane * @returns a new Plane */ clone() { - return new _yn(this.normal.clone(), this.w); + return new _In(this.normal.clone(), this.w); } /** * Flip the face of the plane @@ -38508,7 +38509,7 @@ var yn = class _yn { let f, d; for (f = 0; f < e.vertices.length; f++) { d = _.Dot(this.normal, e.vertices[f].pos) - this.w; - const p = d < -_yn.EPSILON ? 2 : d > _yn.EPSILON ? 1 : 0; + const p = d < -_In.EPSILON ? 2 : d > _In.EPSILON ? 1 : 0; h |= p, u.push(p); } switch (h) { @@ -38538,7 +38539,7 @@ var yn = class _yn { } } }; -yn.EPSILON = 1e-5; +In.EPSILON = 1e-5; var Ma = class _Ma { /** * Initializes the polygon @@ -38546,7 +38547,7 @@ var Ma = class _Ma { * @param shared The properties shared across all polygons */ constructor(e, t) { - this.vertices = e, this.shared = t, this.plane = yn.FromPoints(e[0].pos, e[1].pos, e[2].pos); + this.vertices = e, this.shared = t, this.plane = In.FromPoints(e[0].pos, e[1].pos, e[2].pos); } /** * Clones, or makes a deep copy, or the polygon @@ -38661,7 +38662,7 @@ var ss = class _ss { i = new Ma(r, { subMeshId: 0, meshId: _l, materialIndex: 0 }), i.plane && s.push(i); } const u = _ss._FromPolygons(s); - return u.matrix = w.Identity(), u.position = _.Zero(), u.rotation = _.Zero(), u.scaling = _.One(), u.rotationQuaternion = Ce.Identity(), _l++, u; + return u.matrix = L.Identity(), u.position = _.Zero(), u.rotation = _.Zero(), u.scaling = _.One(), u.rotationQuaternion = Ce.Identity(), _l++, u; } /** * Convert the Mesh to CSG @@ -38679,18 +38680,18 @@ var ss = class _ss { throw "BABYLON.CSG: Wrong Mesh type, must be BABYLON.Mesh"; const v = e.getIndices(), E = e.getVerticesData(I.PositionKind), C = e.getVerticesData(I.NormalKind), T = e.getVerticesData(I.UVKind), R = e.getVerticesData(I.ColorKind), x = e.subMeshes; for (let M = 0, N = x.length; M < N; M++) - for (let F = x[M].indexStart, L = x[M].indexCount + x[M].indexStart; F < L; F += 3) { + for (let F = x[M].indexStart, U = x[M].indexCount + x[M].indexStart; F < U; F += 3) { c = []; - for (let K = 0; K < 3; K++) { - const q = K === 0 ? F + K : m ? F + 3 - K : F + K, j = new _(C[v[q] * 3], C[v[q] * 3 + 1], C[v[q] * 3 + 2]); + for (let H = 0; H < 3; H++) { + const q = H === 0 ? F + H : m ? F + 3 - H : F + H, Z = new _(C[v[q] * 3], C[v[q] * 3 + 1], C[v[q] * 3 + 2]); T && (s = new me(T[v[q] * 2], T[v[q] * 2 + 1])), R && (o = new et(R[v[q] * 4], R[v[q] * 4 + 1], R[v[q] * 4 + 2], R[v[q] * 4 + 3])); const k = new _(E[v[q] * 3], E[v[q] * 3 + 1], E[v[q] * 3 + 2]); - a = _.TransformCoordinates(k, u), r = _.TransformNormal(j, u), i = new vo(a, r, s, o), c.push(i); + a = _.TransformCoordinates(k, u), r = _.TransformNormal(Z, u), i = new vo(a, r, s, o), c.push(i); } l = new Ma(c, { subMeshId: M, meshId: _l, materialIndex: x[M].materialIndex }), l.plane && h.push(l); } const S = _ss._FromPolygons(h); - return S.matrix = t ? w.Identity() : u, S.position = t ? _.Zero() : f, S.rotation = t ? _.Zero() : d, S.scaling = t ? _.One() : g, S.rotationQuaternion = t && p ? Ce.Identity() : p, _l++, S; + return S.matrix = t ? L.Identity() : u, S.position = t ? _.Zero() : f, S.rotation = t ? _.Zero() : d, S.scaling = t ? _.One() : g, S.rotationQuaternion = t && p ? Ce.Identity() : p, _l++, S; } /** * Construct a CSG solid from a list of `CSG.Polygon` instances. @@ -38812,8 +38813,8 @@ var ss = class _ss { m = g[M.x + "," + M.y + "," + M.z]; let F = false; l && !(l[m * 2] === f.x || l[m * 2 + 1] === f.y) && (F = true); - let L = false; - c && !(c[m * 4] === d.r || c[m * 4 + 1] === d.g || c[m * 4 + 2] === d.b || c[m * 4 + 3] === d.a) && (L = true), (!(typeof m < "u" && o[m * 3] === N.x && o[m * 3 + 1] === N.y && o[m * 3 + 2] === N.z) || F || L) && (s.push(M.x, M.y, M.z), l && l.push(f.x, f.y), o.push(u.x, u.y, u.z), c && c.push(d.r, d.g, d.b, d.a), m = g[M.x + "," + M.y + "," + M.z] = s.length / 3 - 1), a.push(m), t && t(); + let U = false; + c && !(c[m * 4] === d.r || c[m * 4 + 1] === d.g || c[m * 4 + 2] === d.b || c[m * 4 + 3] === d.a) && (U = true), (!(typeof m < "u" && o[m * 3] === N.x && o[m * 3 + 1] === N.y && o[m * 3 + 2] === N.z) || F || U) && (s.push(M.x, M.y, M.z), l && l.push(f.x, f.y), o.push(u.x, u.y, u.z), c && c.push(d.r, d.g, d.b, d.a), m = g[M.x + "," + M.y + "," + M.z] = s.length / 3 - 1), a.push(m), t && t(); } } } @@ -38995,7 +38996,7 @@ var vr = class _vr { return new _vr(r, s); } }; -var df = class _df { +var pf = class _pf { /** * | Value | Type | Description | * | ----- | ------------------ | ----------- | @@ -39076,7 +39077,7 @@ var df = class _df { * @param internalTexture Define the internalTexture to wrap. You can also pass a RenderTargetWrapper, in which case the texture will be the render target's texture */ constructor(e) { - this._wrapU = 1, this._wrapV = 1, this.wrapR = 1, this.anisotropicFilteringLevel = 4, this.delayLoadState = 0, this._texture = null, this._engine = null, this._cachedSize = vr.Zero(), this._cachedBaseSize = vr.Zero(), this._initialSamplingMode = 2, this._texture = _df._IsRenderTargetWrapper(e) ? e.texture : e, this._texture && (this._engine = this._texture.getEngine()); + this._wrapU = 1, this._wrapV = 1, this.wrapR = 1, this.anisotropicFilteringLevel = 4, this.delayLoadState = 0, this._texture = null, this._engine = null, this._cachedSize = vr.Zero(), this._cachedBaseSize = vr.Zero(), this._initialSamplingMode = 2, this._texture = _pf._IsRenderTargetWrapper(e) ? e.texture : e, this._texture && (this._engine = this._texture.getEngine()); } /** * Get if the texture is ready to be used (downloaded, converted, mip mapped...). @@ -39164,7 +39165,7 @@ var df = class _df { this._texture && (this.releaseInternalTexture(), this._engine = null); } }; -var It = class _It extends df { +var It = class _It extends pf { /** * Define if the texture is having a usable alpha value (can be use for transparency or glossiness for instance). */ @@ -39357,7 +39358,7 @@ var It = class _It extends df { * Define the unique id of the texture in the scene. */ get uid() { - return this._uid || (this._uid = tf()), this._uid; + return this._uid || (this._uid = rf()), this._uid; } /** * Return a string representation of the texture. @@ -39434,14 +39435,14 @@ var It = class _It extends df { * @returns the transformation matrix */ getTextureMatrix() { - return w.IdentityReadOnly; + return L.IdentityReadOnly; } /** * Get the texture reflection matrix used to rotate/transform the reflection. * @returns the reflection matrix */ getReflectionTextureMatrix() { - return w.IdentityReadOnly; + return L.IdentityReadOnly; } /** * Gets a suitable rotate/transform matrix when the texture is used for refraction. @@ -39629,76 +39630,76 @@ var It = class _It extends df { }; It.DEFAULT_ANISOTROPIC_FILTERING_LEVEL = 4; P([ - U() + w() ], It.prototype, "uniqueId", void 0); P([ - U() + w() ], It.prototype, "name", void 0); P([ - U() + w() ], It.prototype, "metadata", void 0); P([ - U("hasAlpha") + w("hasAlpha") ], It.prototype, "_hasAlpha", void 0); P([ - U("getAlphaFromRGB") + w("getAlphaFromRGB") ], It.prototype, "_getAlphaFromRGB", void 0); P([ - U() + w() ], It.prototype, "level", void 0); P([ - U("coordinatesIndex") + w("coordinatesIndex") ], It.prototype, "_coordinatesIndex", void 0); P([ - U() + w() ], It.prototype, "optimizeUVAllocation", void 0); P([ - U("coordinatesMode") + w("coordinatesMode") ], It.prototype, "_coordinatesMode", void 0); P([ - U() + w() ], It.prototype, "wrapU", null); P([ - U() + w() ], It.prototype, "wrapV", null); P([ - U() + w() ], It.prototype, "wrapR", void 0); P([ - U() + w() ], It.prototype, "anisotropicFilteringLevel", void 0); P([ - U() + w() ], It.prototype, "isCube", null); P([ - U() + w() ], It.prototype, "is3D", null); P([ - U() + w() ], It.prototype, "is2DArray", null); P([ - U() + w() ], It.prototype, "gammaSpace", null); P([ - U() + w() ], It.prototype, "invertZ", void 0); P([ - U() + w() ], It.prototype, "lodLevelInAlpha", void 0); P([ - U() + w() ], It.prototype, "lodGenerationOffset", null); P([ - U() + w() ], It.prototype, "lodGenerationScale", null); P([ - U() + w() ], It.prototype, "linearSpecularLOD", null); P([ Tt() ], It.prototype, "irradianceTexture", null); P([ - U() + w() ], It.prototype, "isRenderTarget", void 0); function l0(n4, e, t = false) { const i = e.width, r = e.height; @@ -39725,14 +39726,14 @@ function l0(n4, e, t = false) { } return s.toDataURL("image/png"); } -function cI(n4, e = 0, t = 0) { +function hI(n4, e = 0, t = 0) { const i = n4.getInternalTexture(); if (!i) return null; const r = n4._readPixelsSync(e, t); return r ? l0(r, n4.getSize(), i.invertY) : null; } -async function hI(n4, e = 0, t = 0) { +async function uI(n4, e = 0, t = 0) { const i = n4.getInternalTexture(); if (!i) return null; @@ -39867,7 +39868,7 @@ var le = class _le extends It { getTextureMatrix(e = 1) { if (this.uOffset === this._cachedUOffset && this.vOffset === this._cachedVOffset && this.uScale * e === this._cachedUScale && this.vScale === this._cachedVScale && this.uAng === this._cachedUAng && this.vAng === this._cachedVAng && this.wAng === this._cachedWAng && this.uRotationCenter === this._cachedURotationCenter && this.vRotationCenter === this._cachedVRotationCenter && this.wRotationCenter === this._cachedWRotationCenter && this.homogeneousRotationInUVTransform === this._cachedHomogeneousRotationInUVTransform) return this._cachedTextureMatrix; - this._cachedUOffset = this.uOffset, this._cachedVOffset = this.vOffset, this._cachedUScale = this.uScale * e, this._cachedVScale = this.vScale, this._cachedUAng = this.uAng, this._cachedVAng = this.vAng, this._cachedWAng = this.wAng, this._cachedURotationCenter = this.uRotationCenter, this._cachedVRotationCenter = this.vRotationCenter, this._cachedWRotationCenter = this.wRotationCenter, this._cachedHomogeneousRotationInUVTransform = this.homogeneousRotationInUVTransform, (!this._cachedTextureMatrix || !this._rowGenerationMatrix) && (this._cachedTextureMatrix = w.Zero(), this._rowGenerationMatrix = new w(), this._t0 = _.Zero(), this._t1 = _.Zero(), this._t2 = _.Zero()), w.RotationYawPitchRollToRef(this.vAng, this.uAng, this.wAng, this._rowGenerationMatrix), this.homogeneousRotationInUVTransform ? (w.TranslationToRef(-this._cachedURotationCenter, -this._cachedVRotationCenter, -this._cachedWRotationCenter, z.Matrix[0]), w.TranslationToRef(this._cachedURotationCenter, this._cachedVRotationCenter, this._cachedWRotationCenter, z.Matrix[1]), w.ScalingToRef(this._cachedUScale, this._cachedVScale, 0, z.Matrix[2]), w.TranslationToRef(this._cachedUOffset, this._cachedVOffset, 0, z.Matrix[3]), z.Matrix[0].multiplyToRef(this._rowGenerationMatrix, this._cachedTextureMatrix), this._cachedTextureMatrix.multiplyToRef(z.Matrix[1], this._cachedTextureMatrix), this._cachedTextureMatrix.multiplyToRef(z.Matrix[2], this._cachedTextureMatrix), this._cachedTextureMatrix.multiplyToRef(z.Matrix[3], this._cachedTextureMatrix), this._cachedTextureMatrix.setRowFromFloats(2, this._cachedTextureMatrix.m[12], this._cachedTextureMatrix.m[13], this._cachedTextureMatrix.m[14], 1)) : (this._prepareRowForTextureGeneration(0, 0, 0, this._t0), this._prepareRowForTextureGeneration(1, 0, 0, this._t1), this._prepareRowForTextureGeneration(0, 1, 0, this._t2), this._t1.subtractInPlace(this._t0), this._t2.subtractInPlace(this._t0), w.FromValuesToRef(this._t1.x, this._t1.y, this._t1.z, 0, this._t2.x, this._t2.y, this._t2.z, 0, this._t0.x, this._t0.y, this._t0.z, 0, 0, 0, 0, 1, this._cachedTextureMatrix)); + this._cachedUOffset = this.uOffset, this._cachedVOffset = this.vOffset, this._cachedUScale = this.uScale * e, this._cachedVScale = this.vScale, this._cachedUAng = this.uAng, this._cachedVAng = this.vAng, this._cachedWAng = this.wAng, this._cachedURotationCenter = this.uRotationCenter, this._cachedVRotationCenter = this.vRotationCenter, this._cachedWRotationCenter = this.wRotationCenter, this._cachedHomogeneousRotationInUVTransform = this.homogeneousRotationInUVTransform, (!this._cachedTextureMatrix || !this._rowGenerationMatrix) && (this._cachedTextureMatrix = L.Zero(), this._rowGenerationMatrix = new L(), this._t0 = _.Zero(), this._t1 = _.Zero(), this._t2 = _.Zero()), L.RotationYawPitchRollToRef(this.vAng, this.uAng, this.wAng, this._rowGenerationMatrix), this.homogeneousRotationInUVTransform ? (L.TranslationToRef(-this._cachedURotationCenter, -this._cachedVRotationCenter, -this._cachedWRotationCenter, z.Matrix[0]), L.TranslationToRef(this._cachedURotationCenter, this._cachedVRotationCenter, this._cachedWRotationCenter, z.Matrix[1]), L.ScalingToRef(this._cachedUScale, this._cachedVScale, 0, z.Matrix[2]), L.TranslationToRef(this._cachedUOffset, this._cachedVOffset, 0, z.Matrix[3]), z.Matrix[0].multiplyToRef(this._rowGenerationMatrix, this._cachedTextureMatrix), this._cachedTextureMatrix.multiplyToRef(z.Matrix[1], this._cachedTextureMatrix), this._cachedTextureMatrix.multiplyToRef(z.Matrix[2], this._cachedTextureMatrix), this._cachedTextureMatrix.multiplyToRef(z.Matrix[3], this._cachedTextureMatrix), this._cachedTextureMatrix.setRowFromFloats(2, this._cachedTextureMatrix.m[12], this._cachedTextureMatrix.m[13], this._cachedTextureMatrix.m[14], 1)) : (this._prepareRowForTextureGeneration(0, 0, 0, this._t0), this._prepareRowForTextureGeneration(1, 0, 0, this._t1), this._prepareRowForTextureGeneration(0, 1, 0, this._t2), this._t1.subtractInPlace(this._t0), this._t2.subtractInPlace(this._t0), L.FromValuesToRef(this._t1.x, this._t1.y, this._t1.z, 0, this._t2.x, this._t2.y, this._t2.z, 0, this._t0.x, this._t0.y, this._t0.z, 0, 0, 0, 0, 1, this._cachedTextureMatrix)); const t = this.getScene(); if (!t) return this._cachedTextureMatrix; @@ -39888,21 +39889,21 @@ var le = class _le extends It { return this._cachedReflectionTextureMatrix; } else return this._cachedReflectionTextureMatrix; - this._cachedReflectionTextureMatrix || (this._cachedReflectionTextureMatrix = w.Zero()), this._projectionModeMatrix || (this._projectionModeMatrix = w.Zero()); + this._cachedReflectionTextureMatrix || (this._cachedReflectionTextureMatrix = L.Zero()), this._projectionModeMatrix || (this._projectionModeMatrix = L.Zero()); const t = this._cachedReflectionCoordinatesMode !== this.coordinatesMode; switch (this._cachedReflectionUOffset = this.uOffset, this._cachedReflectionVOffset = this.vOffset, this._cachedReflectionUScale = this.uScale, this._cachedReflectionVScale = this.vScale, this._cachedReflectionCoordinatesMode = this.coordinatesMode, this.coordinatesMode) { case _le.PLANAR_MODE: { - w.IdentityToRef(this._cachedReflectionTextureMatrix), this._cachedReflectionTextureMatrix[0] = this.uScale, this._cachedReflectionTextureMatrix[5] = this.vScale, this._cachedReflectionTextureMatrix[12] = this.uOffset, this._cachedReflectionTextureMatrix[13] = this.vOffset; + L.IdentityToRef(this._cachedReflectionTextureMatrix), this._cachedReflectionTextureMatrix[0] = this.uScale, this._cachedReflectionTextureMatrix[5] = this.vScale, this._cachedReflectionTextureMatrix[12] = this.uOffset, this._cachedReflectionTextureMatrix[13] = this.vOffset; break; } case _le.PROJECTION_MODE: { - w.FromValuesToRef(0.5, 0, 0, 0, 0, -0.5, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 1, 1, this._projectionModeMatrix); + L.FromValuesToRef(0.5, 0, 0, 0, 0, -0.5, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 1, 1, this._projectionModeMatrix); const i = e.getProjectionMatrix(); this._cachedReflectionProjectionMatrixId = i.updateFlag, i.multiplyToRef(this._projectionModeMatrix, this._cachedReflectionTextureMatrix); break; } default: - w.IdentityToRef(this._cachedReflectionTextureMatrix); + L.IdentityToRef(this._cachedReflectionTextureMatrix); break; } return t && e.markAllMaterialsAsDirty(1, (i) => i.hasTexture(this)), this._cachedReflectionTextureMatrix; @@ -39937,7 +39938,7 @@ var le = class _le extends It { const e = this.name; _le.SerializeBuffers || this.name.startsWith("data:") && (this.name = ""), this.name.startsWith("data:") && this.url === this.name && (this.url = ""); const t = super.serialize(_le._SerializeInternalTextureUniqueId); - return t ? ((_le.SerializeBuffers || _le.ForceSerializeBuffers) && (typeof this._buffer == "string" && this._buffer.substr(0, 5) === "data:" ? (t.base64String = this._buffer, t.name = t.name.replace("data:", "")) : this.url && this.url.startsWith("data:") && this._buffer instanceof Uint8Array ? t.base64String = "data:image/png;base64," + D_(this._buffer) : (_le.ForceSerializeBuffers || this.url && this.url.startsWith("blob:") || this._forceSerialize) && (t.base64String = !this._engine || this._engine._features.supportSyncTextureRead ? cI(this) : hI(this))), t.invertY = this._invertY, t.samplingMode = this.samplingMode, t._creationFlags = this._creationFlags, t._useSRGBBuffer = this._useSRGBBuffer, _le._SerializeInternalTextureUniqueId && (t.internalTextureUniqueId = ((i = this._texture) == null ? void 0 : i.uniqueId) ?? void 0), t.noMipmap = this._noMipmap, this.name = e, t) : null; + return t ? ((_le.SerializeBuffers || _le.ForceSerializeBuffers) && (typeof this._buffer == "string" && this._buffer.substr(0, 5) === "data:" ? (t.base64String = this._buffer, t.name = t.name.replace("data:", "")) : this.url && this.url.startsWith("data:") && this._buffer instanceof Uint8Array ? t.base64String = "data:image/png;base64," + D_(this._buffer) : (_le.ForceSerializeBuffers || this.url && this.url.startsWith("blob:") || this._forceSerialize) && (t.base64String = !this._engine || this._engine._features.supportSyncTextureRead ? hI(this) : uI(this))), t.invertY = this._invertY, t.samplingMode = this.samplingMode, t._creationFlags = this._creationFlags, t._useSRGBBuffer = this._useSRGBBuffer, _le._SerializeInternalTextureUniqueId && (t.internalTextureUniqueId = ((i = this._texture) == null ? void 0 : i.uniqueId) ?? void 0), t.noMipmap = this._noMipmap, this.name = e, t) : null; } /** * Get the current class name of the texture useful for serialization or dynamic coding. @@ -39995,7 +39996,7 @@ var le = class _le extends It { let l = true; if (e.noMipmap && (l = false), e.mirrorPlane) { const c = _le._CreateMirror(e.name, e.renderTargetSize, t, l); - return c._waitingRenderList = e.renderList, c.mirrorPlane = qr.FromArray(e.mirrorPlane), a(c), c; + return c._waitingRenderList = e.renderList, c.mirrorPlane = Yr.FromArray(e.mirrorPlane), a(c), c; } else if (e.isRenderTarget) { let c = null; if (e.isCube) { @@ -40116,47 +40117,47 @@ le.WRAP_ADDRESSMODE = 1; le.MIRROR_ADDRESSMODE = 2; le.UseSerializedUrlIfAny = false; P([ - U() + w() ], le.prototype, "url", void 0); P([ - U() + w() ], le.prototype, "uOffset", void 0); P([ - U() + w() ], le.prototype, "vOffset", void 0); P([ - U() + w() ], le.prototype, "uScale", void 0); P([ - U() + w() ], le.prototype, "vScale", void 0); P([ - U() + w() ], le.prototype, "uAng", void 0); P([ - U() + w() ], le.prototype, "vAng", void 0); P([ - U() + w() ], le.prototype, "wAng", void 0); P([ - U() + w() ], le.prototype, "uRotationCenter", void 0); P([ - U() + w() ], le.prototype, "vRotationCenter", void 0); P([ - U() + w() ], le.prototype, "wRotationCenter", void 0); P([ - U() + w() ], le.prototype, "homogeneousRotationInUVTransform", void 0); P([ - U() + w() ], le.prototype, "isBlocking", null); Re("BABYLON.Texture", le); Le._TextureParser = le.Parse; -var pf = class { +var gf = class { constructor() { this._defines = {}, this._currentRank = 32, this._maxRank = -1, this._mesh = null; } @@ -40228,7 +40229,7 @@ var pf = class { }; var Uc = class extends ie { constructor(e, t, i = true) { - super(e, t), this._normalMatrix = new w(), this._storeEffectOnSubMeshes = i; + super(e, t), this._normalMatrix = new L(), this._storeEffectOnSubMeshes = i; } getEffect() { return this._storeEffectOnSubMeshes ? this._activeEffect : super.getEffect(); @@ -40283,7 +40284,7 @@ var ks = class _ks extends Uc { * @param storeEffectOnSubMeshes true to store effect on submeshes, false to store the effect directly in the material class. */ constructor(e, t, i, r = {}, s = true) { - super(e, t, s), this._textures = {}, this._textureArrays = {}, this._externalTextures = {}, this._floats = {}, this._ints = {}, this._uints = {}, this._floatsArrays = {}, this._colors3 = {}, this._colors3Arrays = {}, this._colors4 = {}, this._colors4Arrays = {}, this._vectors2 = {}, this._vectors3 = {}, this._vectors4 = {}, this._quaternions = {}, this._quaternionsArrays = {}, this._matrices = {}, this._matrixArrays = {}, this._matrices3x3 = {}, this._matrices2x2 = {}, this._vectors2Arrays = {}, this._vectors3Arrays = {}, this._vectors4Arrays = {}, this._uniformBuffers = {}, this._textureSamplers = {}, this._storageBuffers = {}, this._cachedWorldViewMatrix = new w(), this._cachedWorldViewProjectionMatrix = new w(), this._multiview = false, this._materialHelperNeedsPreviousMatrices = false, this._shaderPath = i, this._options = { + super(e, t, s), this._textures = {}, this._textureArrays = {}, this._externalTextures = {}, this._floats = {}, this._ints = {}, this._uints = {}, this._floatsArrays = {}, this._colors3 = {}, this._colors3Arrays = {}, this._colors4 = {}, this._colors4Arrays = {}, this._vectors2 = {}, this._vectors3 = {}, this._vectors4 = {}, this._quaternions = {}, this._quaternionsArrays = {}, this._matrices = {}, this._matrixArrays = {}, this._matrices3x3 = {}, this._matrices2x2 = {}, this._vectors2Arrays = {}, this._vectors3Arrays = {}, this._vectors4Arrays = {}, this._uniformBuffers = {}, this._textureSamplers = {}, this._storageBuffers = {}, this._cachedWorldViewMatrix = new L(), this._cachedWorldViewProjectionMatrix = new L(), this._multiview = false, this._materialHelperNeedsPreviousMatrices = false, this._shaderPath = i, this._options = { needAlphaBlending: false, needAlphaTesting: false, attributes: ["position", "normal", "uv"], @@ -40626,7 +40627,7 @@ var ks = class _ks extends Uc { if (R.effect && R._wasPreviouslyReady && R._wasPreviouslyUsingInstances === t) return true; } - const s = this.getScene(), a = s.getEngine(), o = [], l = [], c = new pf(); + const s = this.getScene(), a = s.getEngine(), o = [], l = [], c = new gf(); let h = this._shaderPath, u = this._options.uniforms, f = this._options.uniformBuffers, d = this._options.samplers; a.getCaps().multiview && s.activeCamera && s.activeCamera.outputRenderTarget && s.activeCamera.outputRenderTarget.getViewCount() > 1 && (this._multiview = true, o.push("#define MULTIVIEW"), u.indexOf("viewProjection") !== -1 && u.indexOf("viewProjectionR") === -1 && u.push("viewProjectionR")); for (let R = 0; R < this._options.defines.length; R++) { @@ -40653,12 +40654,12 @@ var ks = class _ks extends Uc { o.push("#define NUM_MORPH_INFLUENCERS 0"); if (e) { const R = e.bakedVertexAnimationManager; - R && R.isEnabled && (o.push("#define BAKED_VERTEX_ANIMATION_TEXTURE"), u.indexOf("bakedVertexAnimationSettings") === -1 && u.push("bakedVertexAnimationSettings"), u.indexOf("bakedVertexAnimationTextureSizeInverted") === -1 && u.push("bakedVertexAnimationTextureSizeInverted"), u.indexOf("bakedVertexAnimationTime") === -1 && u.push("bakedVertexAnimationTime"), this._options.samplers.indexOf("bakedVertexAnimationTexture") === -1 && this._options.samplers.push("bakedVertexAnimationTexture")), af(l, e, o); + R && R.isEnabled && (o.push("#define BAKED_VERTEX_ANIMATION_TEXTURE"), u.indexOf("bakedVertexAnimationSettings") === -1 && u.push("bakedVertexAnimationSettings"), u.indexOf("bakedVertexAnimationTextureSizeInverted") === -1 && u.push("bakedVertexAnimationTextureSizeInverted"), u.indexOf("bakedVertexAnimationTime") === -1 && u.push("bakedVertexAnimationTime"), this._options.samplers.indexOf("bakedVertexAnimationTexture") === -1 && this._options.samplers.push("bakedVertexAnimationTexture")), of(l, e, o); } for (const R in this._textures) if (!this._textures[R].isReady()) return false; - e && this._shouldTurnAlphaTestOn(e) && o.push("#define ALPHATEST"), this._options.useClipPlane !== false && (Nc(u), Yy(this, s, o)), s.fogEnabled && (e != null && e.applyFog) && s.fogMode !== Ot.FOGMODE_NONE && (o.push("#define FOG"), u.indexOf("view") === -1 && u.push("view"), u.indexOf("vFogInfos") === -1 && u.push("vFogInfos"), u.indexOf("vFogColor") === -1 && u.push("vFogColor")), this._useLogarithmicDepth && (o.push("#define LOGARITHMICDEPTH"), u.indexOf("logarithmicDepthConstant") === -1 && u.push("logarithmicDepthConstant")), this.customShaderNameResolve && (u = u.slice(), f = f.slice(), d = d.slice(), h = this.customShaderNameResolve(this.name, u, f, d, o, l)); + e && this._shouldTurnAlphaTestOn(e) && o.push("#define ALPHATEST"), this._options.useClipPlane !== false && (Nc(u), Zy(this, s, o)), s.fogEnabled && (e != null && e.applyFog) && s.fogMode !== Ot.FOGMODE_NONE && (o.push("#define FOG"), u.indexOf("view") === -1 && u.push("view"), u.indexOf("vFogInfos") === -1 && u.push("vFogInfos"), u.indexOf("vFogColor") === -1 && u.push("vFogColor")), this._useLogarithmicDepth && (o.push("#define LOGARITHMICDEPTH"), u.indexOf("logarithmicDepthConstant") === -1 && u.push("logarithmicDepthConstant")), this.customShaderNameResolve && (u = u.slice(), f = f.slice(), d = d.slice(), h = this.customShaderNameResolve(this.name, u, f, d, o, l)); const m = r ? i._getDrawWrapper(void 0, true) : this._drawWrapper, v = (m == null ? void 0 : m.effect) ?? null, E = (m == null ? void 0 : m.defines) ?? null, C = o.join(` `); let T = v; @@ -40722,7 +40723,7 @@ var ks = class _ks extends Uc { } const h = t && s ? this._mustRebind(o, a, r, t.visibility) : o.getCachedMaterial() !== this; if (a && h) { - !c && this._options.uniforms.indexOf("view") !== -1 && a.setMatrix("view", o.getViewMatrix()), !c && this._options.uniforms.indexOf("projection") !== -1 && a.setMatrix("projection", o.getProjectionMatrix()), !c && this._options.uniforms.indexOf("viewProjection") !== -1 && (a.setMatrix("viewProjection", o.getTransformMatrix()), this._multiview && a.setMatrix("viewProjectionR", o._transformMatrixR)), o.activeCamera && this._options.uniforms.indexOf("cameraPosition") !== -1 && a.setVector3("cameraPosition", o.activeCamera.globalPosition), of(t, a), Fc(a, this, o), this._useLogarithmicDepth && Lc(s ? r.materialDefines : a.defines, a, o), t && wc(o, t, a); + !c && this._options.uniforms.indexOf("view") !== -1 && a.setMatrix("view", o.getViewMatrix()), !c && this._options.uniforms.indexOf("projection") !== -1 && a.setMatrix("projection", o.getProjectionMatrix()), !c && this._options.uniforms.indexOf("viewProjection") !== -1 && (a.setMatrix("viewProjection", o.getTransformMatrix()), this._multiview && a.setMatrix("viewProjectionR", o._transformMatrixR)), o.activeCamera && this._options.uniforms.indexOf("cameraPosition") !== -1 && a.setVector3("cameraPosition", o.activeCamera.globalPosition), lf(t, a), Fc(a, this, o), this._useLogarithmicDepth && Lc(s ? r.materialDefines : a.defines, a, o), t && wc(o, t, a); let f; for (f in this._textures) a.setTexture(f, this._textures[f]); @@ -40783,7 +40784,7 @@ var ks = class _ks extends Uc { } if (a && t && (h || !this.isFrozen)) { const f = t.morphTargetManager; - f && f.numInfluencers > 0 && nf(t, a); + f && f.numInfluencers > 0 && af(t, a); const d = t.bakedVertexAnimationManager; if (d && d.isEnabled) { const p = s ? r._drawWrapper : this._drawWrapper; @@ -41038,7 +41039,7 @@ var ks = class _ks extends Uc { for (s in e.quaternions) r.setQuaternion(s, Ce.FromArray(e.quaternions[s])); for (s in e.matrices) - r.setMatrix(s, w.FromArray(e.matrices[s])); + r.setMatrix(s, L.FromArray(e.matrices[s])); for (s in e.matrixArray) r._matrixArrays[s] = new Float32Array(e.matrixArray[s]); for (s in e.matrices3x3) @@ -41100,7 +41101,7 @@ var ks = class _ks extends Uc { ks.SnippetUrl = "https://snippet.babylonjs.com"; ks.CreateFromSnippetAsync = ks.ParseFromSnippetAsync; Re("BABYLON.ShaderMaterial", ks); -var uI = class { +var fI = class { /** * Gets the depth/stencil texture (if created by a createDepthStencilTexture() call) */ @@ -41385,7 +41386,7 @@ var uI = class { e || ((t = this._depthStencilTexture) == null || t.dispose(), this._depthStencilTexture = null, this.releaseTextures()), this._engine._releaseRenderTargetWrapper(this); } }; -var fI = class extends uI { +var dI = class extends fI { constructor(e, t, i, r, s) { super(e, t, i, r), this._framebuffer = null, this._depthStencilBuffer = null, this._MSAAFramebuffer = null, this._colorTextureArray = null, this._depthStencilTextureArray = null, this._disposeOnlyFramebuffers = false, this._currentLOD = 0, this._context = s; } @@ -41488,7 +41489,7 @@ var fI = class extends uI { } }; De.prototype._createHardwareRenderTargetWrapper = function(n4, e, t) { - const i = new fI(n4, e, t, this, this._gl); + const i = new dI(n4, e, t, this, this._gl); return this._renderTargetWrapperCache.push(i), i; }; De.prototype.createRenderTargetTexture = function(n4, e) { @@ -41509,7 +41510,7 @@ De.prototype._createDepthStencilTexture = function(n4, e) { const t = this._gl, i = n4.layers || 0, r = n4.depth || 0; let s = t.TEXTURE_2D; i !== 0 ? s = t.TEXTURE_2D_ARRAY : r !== 0 && (s = t.TEXTURE_3D); - const a = new ar(this, Dt.DepthStencil); + const a = new or(this, Dt.DepthStencil); if (a.label = e.label, !this._caps.depthTextureExtension) return ne.Error("Depth texture is not supported by your browser or hardware."), a; const o = { @@ -41563,7 +41564,7 @@ De.prototype.createRenderTargetCubeTexture = function(n4, e) { ...e }; i.generateStencilBuffer = i.generateDepthBuffer && i.generateStencilBuffer, (i.type === 1 && !this._caps.textureFloatLinearFiltering || i.type === 2 && !this._caps.textureHalfFloatLinearFiltering) && (i.samplingMode = 1); - const r = this._gl, s = new ar(this, Dt.RenderTarget); + const r = this._gl, s = new or(this, Dt.RenderTarget); this._bindTextureDirectly(r.TEXTURE_CUBE_MAP, s, true); const a = this._getSamplingParameters(i.samplingMode, i.generateMipMaps); i.type === 1 && !this._caps.textureFloat && (i.type = 0, ne.Warn("Float textures are not supported. Cube render target forced to TEXTURETYPE_UNESIGNED_BYTE type")), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_MAG_FILTER, a.mag), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_MIN_FILTER, a.min), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_WRAP_S, r.CLAMP_TO_EDGE), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_WRAP_T, r.CLAMP_TO_EDGE); @@ -41572,15 +41573,15 @@ De.prototype.createRenderTargetCubeTexture = function(n4, e) { const o = r.createFramebuffer(); return this._bindUnboundFramebuffer(o), t._depthStencilBuffer = this._setupFramebufferDepthAttachments(i.generateStencilBuffer, i.generateDepthBuffer, n4, n4), i.generateMipMaps && r.generateMipmap(r.TEXTURE_CUBE_MAP), this._bindTextureDirectly(r.TEXTURE_CUBE_MAP, null), this._bindUnboundFramebuffer(null), t._framebuffer = o, t._generateDepthBuffer = i.generateDepthBuffer, t._generateStencilBuffer = i.generateStencilBuffer, s.width = n4, s.height = n4, s.isReady = true, s.isCube = true, s.samples = 1, s.generateMipMaps = i.generateMipMaps, s.samplingMode = i.samplingMode, s.type = i.type, s.format = i.format, this._internalTexturesCache.push(s), t.setTextures(s), t; }; -var dI = "postprocessVertexShader"; -var pI = `attribute vec2 position;uniform vec2 scale;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5); +var pI = "postprocessVertexShader"; +var gI = `attribute vec2 position;uniform vec2 scale;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5); #define CUSTOM_VERTEX_DEFINITIONS void main(void) { #define CUSTOM_VERTEX_MAIN_BEGIN vUV=(position*madd+madd)*scale;gl_Position=vec4(position,0.0,1.0); #define CUSTOM_VERTEX_MAIN_END }`; -Y.ShadersStore[dI] = pI; +Y.ShadersStore[pI] = gI; var Wh = { positions: [1, 1, -1, 1, -1, -1, 1, -1], indices: [0, 1, 2, 0, 2, 3] @@ -41714,7 +41715,7 @@ var f0 = `varying vec2 vUV;uniform sampler2D textureSampler; void main(void) {gl_FragColor=texture2D(textureSampler,vUV);}`; Y.ShadersStore[u0] = f0; -var fg = { name: u0, shader: f0 }; +var dg = { name: u0, shader: f0 }; var Ni = class _Ni { static _CreateDumpRenderer() { if (!_Ni._DumpToolsEngine) { @@ -41736,8 +41737,8 @@ var Ni = class _Ni { t.getCaps().parallelShaderCompile = void 0; const r = new c0(t), s = new h0({ engine: t, - name: fg.name, - fragmentShader: fg.shader, + name: dg.name, + fragmentShader: dg.shader, samplerNames: ["textureSampler"] }); _Ni._DumpToolsEngine = { @@ -41820,10 +41821,10 @@ var Ni = class _Ni { _Ni._DumpToolsEngine && (_Ni._DumpToolsEngine.wrapper.dispose(), _Ni._DumpToolsEngine.renderer.dispose(), _Ni._DumpToolsEngine.engine.dispose()), _Ni._DumpToolsEngine = null; } }; -var gI = () => { +var mI = () => { ge.DumpData = Ni.DumpData, ge.DumpDataAsync = Ni.DumpDataAsync, ge.DumpFramebuffer = Ni.DumpFramebuffer; }; -gI(); +mI(); var gr = class _gr extends le { /** * Use this list to define the list of mesh you want to render. @@ -41973,7 +41974,7 @@ var gr = class _gr extends le { useSRGBBuffer: v, colorAttachment: E, label: this.name - }, this.samplingMode === le.NEAREST_SAMPLINGMODE && (this.wrapU = le.CLAMP_ADDRESSMODE, this.wrapV = le.CLAMP_ADDRESSMODE), d || (o ? (this._renderTarget = i.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions), this.coordinatesMode = le.INVCUBIC_MODE, this._textureMatrix = w.Identity()) : this._renderTarget = i.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions), this._texture = this._renderTarget.texture, p !== void 0 && (this.samples = p))); + }, this.samplingMode === le.NEAREST_SAMPLINGMODE && (this.wrapU = le.CLAMP_ADDRESSMODE, this.wrapV = le.CLAMP_ADDRESSMODE), d || (o ? (this._renderTarget = i.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions), this.coordinatesMode = le.INVCUBIC_MODE, this._textureMatrix = L.Identity()) : this._renderTarget = i.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions), this._texture = this._renderTarget.texture, p !== void 0 && (this.samples = p))); } /** * Creates a depth stencil texture. @@ -42812,56 +42813,56 @@ var Pt = class _Pt { }; Pt._CustomShaderCodeProcessing = {}; P([ - U() + w() ], Pt.prototype, "uniqueId", void 0); P([ - U() + w() ], Pt.prototype, "name", void 0); P([ - U() + w() ], Pt.prototype, "width", void 0); P([ - U() + w() ], Pt.prototype, "height", void 0); P([ - U() + w() ], Pt.prototype, "renderTargetSamplingMode", void 0); P([ H_() ], Pt.prototype, "clearColor", void 0); P([ - U() + w() ], Pt.prototype, "autoClear", void 0); P([ - U() + w() ], Pt.prototype, "forceAutoClearInAlphaMode", void 0); P([ - U() + w() ], Pt.prototype, "alphaMode", void 0); P([ - U() + w() ], Pt.prototype, "alphaConstants", void 0); P([ - U() + w() ], Pt.prototype, "enablePixelPerfectMode", void 0); P([ - U() + w() ], Pt.prototype, "forceFullscreenViewport", void 0); P([ - U() + w() ], Pt.prototype, "scaleMode", void 0); P([ - U() + w() ], Pt.prototype, "alwaysForcePOT", void 0); P([ - U("samples") + w("samples") ], Pt.prototype, "_samples", void 0); P([ - U() + w() ], Pt.prototype, "adaptScaleToCurrentViewport", void 0); Re("BABYLON.PostProcess", Pt); -var mI = "bonesDeclaration"; -var _I = `#if NUM_BONE_INFLUENCERS>0 +var _I = "bonesDeclaration"; +var EI = `#if NUM_BONE_INFLUENCERS>0 attribute vec4 matricesIndices;attribute vec4 matricesWeights; #if NUM_BONE_INFLUENCERS>4 attribute vec4 matricesIndicesExtra;attribute vec4 matricesWeightsExtra; @@ -42883,9 +42884,9 @@ mat4 readMatrixFromRawSampler(sampler2D smp,float index) #endif #endif `; -Y.IncludesShadersStore[mI] = _I; -var EI = "bakedVertexAnimationDeclaration"; -var vI = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE +Y.IncludesShadersStore[_I] = EI; +var vI = "bakedVertexAnimationDeclaration"; +var TI = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE uniform float bakedVertexAnimationTime;uniform vec2 bakedVertexAnimationTextureSizeInverted;uniform vec4 bakedVertexAnimationSettings;uniform sampler2D bakedVertexAnimationTexture; #ifdef INSTANCES attribute vec4 bakedVertexAnimationSettingsInstanced; @@ -42895,9 +42896,9 @@ mat4 readMatrixFromRawSamplerVAT(sampler2D smp,float index,float frame) {float offset=index*4.0;float frameUV=(frame+0.5)*bakedVertexAnimationTextureSizeInverted.y;float dx=bakedVertexAnimationTextureSizeInverted.x;vec4 m0=texture2D(smp,vec2(dx*(offset+0.5),frameUV));vec4 m1=texture2D(smp,vec2(dx*(offset+1.5),frameUV));vec4 m2=texture2D(smp,vec2(dx*(offset+2.5),frameUV));vec4 m3=texture2D(smp,vec2(dx*(offset+3.5),frameUV));return mat4(m0,m1,m2,m3);} #endif `; -Y.IncludesShadersStore[EI] = vI; -var TI = "morphTargetsVertexGlobalDeclaration"; -var xI = `#ifdef MORPHTARGETS +Y.IncludesShadersStore[vI] = TI; +var xI = "morphTargetsVertexGlobalDeclaration"; +var CI = `#ifdef MORPHTARGETS uniform float morphTargetInfluences[NUM_MORPH_INFLUENCERS]; #ifdef MORPHTARGETS_TEXTURE uniform float morphTargetTextureIndices[NUM_MORPH_INFLUENCERS];uniform vec3 morphTargetTextureInfo;uniform highp sampler2DArray morphTargets;vec3 readVector3FromRawSampler(int targetIndex,float vertexIndex) @@ -42906,9 +42907,9 @@ float y=floor(vertexIndex/morphTargetTextureInfo.y);float x=vertexIndex-y*morphT #endif #endif `; -Y.IncludesShadersStore[TI] = xI; -var CI = "morphTargetsVertexDeclaration"; -var RI = `#ifdef MORPHTARGETS +Y.IncludesShadersStore[xI] = CI; +var RI = "morphTargetsVertexDeclaration"; +var SI = `#ifdef MORPHTARGETS #ifndef MORPHTARGETS_TEXTURE attribute vec3 position{X}; #ifdef MORPHTARGETS_NORMAL @@ -42925,9 +42926,9 @@ uniform int morphTargetCount; #endif #endif `; -Y.IncludesShadersStore[CI] = RI; -var SI = "instancesDeclaration"; -var yI = `#ifdef INSTANCES +Y.IncludesShadersStore[RI] = SI; +var yI = "instancesDeclaration"; +var II = `#ifdef INSTANCES attribute vec4 world0;attribute vec4 world1;attribute vec4 world2;attribute vec4 world3; #ifdef INSTANCESCOLOR attribute vec4 instanceColor; @@ -42950,17 +42951,17 @@ uniform mat4 previousWorld; #endif #endif `; -Y.IncludesShadersStore[SI] = yI; -var II = "morphTargetsVertexGlobal"; -var bI = `#ifdef MORPHTARGETS +Y.IncludesShadersStore[yI] = II; +var bI = "morphTargetsVertexGlobal"; +var AI = `#ifdef MORPHTARGETS #ifdef MORPHTARGETS_TEXTURE float vertexID; #endif #endif `; -Y.IncludesShadersStore[II] = bI; -var AI = "morphTargetsVertex"; -var MI = `#ifdef MORPHTARGETS +Y.IncludesShadersStore[bI] = AI; +var MI = "morphTargetsVertex"; +var PI = `#ifdef MORPHTARGETS #ifdef MORPHTARGETS_TEXTURE #if {X}==0 for (int i=0; i=morphTargetCount) break;vertexID=float(gl_VertexID)*morphTargetTextureInfo.x;positionUpdated+=(readVector3FromRawSampler(i,vertexID)-position)*morphTargetInfluences[i];vertexID+=1.0; @@ -42989,9 +42990,9 @@ uvUpdated+=(uv_{X}-uv)*morphTargetInfluences[{X}]; #endif #endif `; -Y.IncludesShadersStore[AI] = MI; -var PI = "instancesVertex"; -var OI = `#ifdef INSTANCES +Y.IncludesShadersStore[MI] = PI; +var OI = "instancesVertex"; +var DI = `#ifdef INSTANCES mat4 finalWorld=mat4(world0,world1,world2,world3); #if defined(PREPASS_VELOCITY) || defined(VELOCITY) mat4 finalPreviousWorld=mat4(previousWorld0,previousWorld1,previousWorld2,previousWorld3); @@ -43009,9 +43010,9 @@ mat4 finalPreviousWorld=previousWorld; #endif #endif `; -Y.IncludesShadersStore[PI] = OI; -var DI = "bonesVertex"; -var NI = `#ifndef BAKED_VERTEX_ANIMATION_TEXTURE +Y.IncludesShadersStore[OI] = DI; +var NI = "bonesVertex"; +var FI = `#ifndef BAKED_VERTEX_ANIMATION_TEXTURE #if NUM_BONE_INFLUENCERS>0 mat4 influence; #ifdef BONETEXTURE @@ -43065,9 +43066,9 @@ finalWorld=finalWorld*influence; #endif #endif `; -Y.IncludesShadersStore[DI] = NI; -var FI = "bakedVertexAnimation"; -var LI = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE +Y.IncludesShadersStore[NI] = FI; +var LI = "bakedVertexAnimation"; +var wI = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE { #ifdef INSTANCES #define BVASNAME bakedVertexAnimationSettingsInstanced @@ -43099,9 +43100,9 @@ VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIn finalWorld=finalWorld*VATInfluence;} #endif `; -Y.IncludesShadersStore[FI] = LI; -var wI = "meshUVSpaceRendererVertexShader"; -var UI = `precision highp float;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;uniform mat4 projMatrix;varying vec2 vDecalTC; +Y.IncludesShadersStore[LI] = wI; +var UI = "meshUVSpaceRendererVertexShader"; +var VI = `precision highp float;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;uniform mat4 projMatrix;varying vec2 vDecalTC; #include #include #include @@ -43123,31 +43124,31 @@ normWorldSM=transposeMat3(inverseMat3(normWorldSM)); vNormalW=normalize(normWorldSM*normalUpdated); #endif vec3 normalView=normalize((projMatrix*vec4(vNormalW,0.0)).xyz);vec3 decalTC=(projMatrix*worldPos).xyz;vDecalTC=decalTC.xy;gl_Position=vec4(uv*2.0-1.0,normalView.z>0.0 ? 2. : decalTC.z,1.0);}`; -Y.ShadersStore[wI] = UI; -var VI = "meshUVSpaceRendererPixelShader"; -var BI = `precision highp float;varying vec2 vDecalTC;uniform sampler2D textureSampler;void main(void) {if (vDecalTC.x<0. || vDecalTC.x>1. || vDecalTC.y<0. || vDecalTC.y>1.) {discard;} +Y.ShadersStore[UI] = VI; +var BI = "meshUVSpaceRendererPixelShader"; +var kI = `precision highp float;varying vec2 vDecalTC;uniform sampler2D textureSampler;void main(void) {if (vDecalTC.x<0. || vDecalTC.x>1. || vDecalTC.y<0. || vDecalTC.y>1.) {discard;} gl_FragColor=texture2D(textureSampler,vDecalTC);} `; -Y.ShadersStore[VI] = BI; -var kI = "meshUVSpaceRendererMaskerVertexShader"; -var zI = "attribute vec2 uv;varying vec2 vUV;void main(void) {gl_Position=vec4(vec2(uv.x,uv.y)*2.0-1.0,0.,1.0);vUV=uv;}"; -Y.ShadersStore[kI] = zI; -var WI = "meshUVSpaceRendererMaskerPixelShader"; -var GI = `varying vec2 vUV;void main(void) {gl_FragColor=vec4(1.0,1.0,1.0,1.0);} +Y.ShadersStore[BI] = kI; +var zI = "meshUVSpaceRendererMaskerVertexShader"; +var WI = "attribute vec2 uv;varying vec2 vUV;void main(void) {gl_Position=vec4(vec2(uv.x,uv.y)*2.0-1.0,0.,1.0);vUV=uv;}"; +Y.ShadersStore[zI] = WI; +var GI = "meshUVSpaceRendererMaskerPixelShader"; +var XI = `varying vec2 vUV;void main(void) {gl_FragColor=vec4(1.0,1.0,1.0,1.0);} `; -Y.ShadersStore[WI] = GI; -var XI = "meshUVSpaceRendererFinaliserPixelShader"; -var HI = `precision highp float;varying vec2 vUV;uniform sampler2D textureSampler;uniform sampler2D maskTextureSampler;uniform vec2 textureSize;void main() {vec4 mask=texture2D(maskTextureSampler,vUV).rgba;if (mask.r>0.5) {gl_FragColor=texture2D(textureSampler,vUV);} else {vec2 texelSize=4.0/textureSize;vec2 uv_p01=vUV+vec2(-1.0,0.0)*texelSize;vec2 uv_p21=vUV+vec2(1.0,0.0)*texelSize;vec2 uv_p10=vUV+vec2(0.0,-1.0)*texelSize;vec2 uv_p12=vUV+vec2(0.0,1.0)*texelSize;float mask_p01=texture2D(maskTextureSampler,uv_p01).r;float mask_p21=texture2D(maskTextureSampler,uv_p21).r;float mask_p10=texture2D(maskTextureSampler,uv_p10).r;float mask_p12=texture2D(maskTextureSampler,uv_p12).r;vec4 col=vec4(0.0,0.0,0.0,0.0);float total_weight=0.0;if (mask_p01>0.5) {col+=texture2D(textureSampler,uv_p01);total_weight+=1.0;} +Y.ShadersStore[GI] = XI; +var HI = "meshUVSpaceRendererFinaliserPixelShader"; +var KI = `precision highp float;varying vec2 vUV;uniform sampler2D textureSampler;uniform sampler2D maskTextureSampler;uniform vec2 textureSize;void main() {vec4 mask=texture2D(maskTextureSampler,vUV).rgba;if (mask.r>0.5) {gl_FragColor=texture2D(textureSampler,vUV);} else {vec2 texelSize=4.0/textureSize;vec2 uv_p01=vUV+vec2(-1.0,0.0)*texelSize;vec2 uv_p21=vUV+vec2(1.0,0.0)*texelSize;vec2 uv_p10=vUV+vec2(0.0,-1.0)*texelSize;vec2 uv_p12=vUV+vec2(0.0,1.0)*texelSize;float mask_p01=texture2D(maskTextureSampler,uv_p01).r;float mask_p21=texture2D(maskTextureSampler,uv_p21).r;float mask_p10=texture2D(maskTextureSampler,uv_p10).r;float mask_p12=texture2D(maskTextureSampler,uv_p12).r;vec4 col=vec4(0.0,0.0,0.0,0.0);float total_weight=0.0;if (mask_p01>0.5) {col+=texture2D(textureSampler,uv_p01);total_weight+=1.0;} if (mask_p21>0.5) {col+=texture2D(textureSampler,uv_p21);total_weight+=1.0;} if (mask_p10>0.5) {col+=texture2D(textureSampler,uv_p10);total_weight+=1.0;} if (mask_p12>0.5) {col+=texture2D(textureSampler,uv_p12);total_weight+=1.0;} if (total_weight>0.0) {gl_FragColor=col/total_weight;} else {gl_FragColor=col;}}} `; -Y.ShadersStore[XI] = HI; -var KI = "meshUVSpaceRendererFinaliserVertexShader"; -var qI = `precision highp float;attribute vec3 position;attribute vec2 uv;uniform mat4 worldViewProjection;varying vec2 vUV;void main() {gl_Position=worldViewProjection*vec4(position,1.0);vUV=uv;} +Y.ShadersStore[HI] = KI; +var qI = "meshUVSpaceRendererFinaliserVertexShader"; +var YI = `precision highp float;attribute vec3 position;attribute vec2 uv;uniform mat4 worldViewProjection;varying vec2 vUV;void main() {gl_Position=worldViewProjection*vec4(position,1.0);vUV=uv;} `; -Y.ShadersStore[KI] = qI; +Y.ShadersStore[qI] = YI; B._GroundMeshParser = (n4, e) => qo.Parse(n4, e); var qo = class _qo extends B { constructor(e, t) { @@ -43306,8 +43307,8 @@ var qo = class _qo extends B { return i._subdivisionsX = e.subdivisionsX || 1, i._subdivisionsY = e.subdivisionsY || 1, i._minX = e.minX, i._maxX = e.maxX, i._minZ = e.minZ, i._maxZ = e.maxZ, i._width = e.width, i._height = e.height, i; } }; -B._GoldbergMeshParser = (n4, e) => gf.Parse(n4, e); -var gf = class _gf extends B { +B._GoldbergMeshParser = (n4, e) => mf.Parse(n4, e); +var mf = class _mf extends B { constructor() { super(...arguments), this.goldbergData = { faceColors: [], @@ -43449,7 +43450,7 @@ var gf = class _gf extends B { static Parse(e, t) { const i = e.goldbergData; i.faceColors = i.faceColors.map((s) => et.FromArray(s)), i.faceCenters = i.faceCenters.map((s) => _.FromArray(s)), i.faceZaxis = i.faceZaxis.map((s) => _.FromArray(s)), i.faceXaxis = i.faceXaxis.map((s) => _.FromArray(s)), i.faceYaxis = i.faceYaxis.map((s) => _.FromArray(s)); - const r = new _gf(e.name, t); + const r = new _mf(e.name, t); return r.goldbergData = i, r; } }; @@ -43838,7 +43839,7 @@ var d0 = class extends er { } getWorldMatrix() { if (this._currentLOD && this._currentLOD.billboardMode !== He.BILLBOARDMODE_NONE && this._currentLOD._masterMesh !== this) { - this._billboardWorldMatrix || (this._billboardWorldMatrix = new w()); + this._billboardWorldMatrix || (this._billboardWorldMatrix = new L()); const e = this._currentLOD._masterMesh; return this._currentLOD._masterMesh = this, z.Vector3[7].copyFrom(this._currentLOD.position), this._currentLOD.position.set(0, 0, 0), this._billboardWorldMatrix.copyFrom(this._currentLOD.computeWorldMatrix(true)), this._currentLOD.position.copyFrom(z.Vector3[7]), this._currentLOD._masterMesh = e, this._billboardWorldMatrix; } @@ -44020,8 +44021,8 @@ B.prototype._disposeInstanceSpecificData = function() { this._userInstancedBuffersStorage.vertexBuffers[n4] && this._userInstancedBuffersStorage.vertexBuffers[n4].dispose(); this._invalidateInstanceVertexArrayObject(), this.instancedBuffers = {}; }; -var YI = "clipPlaneFragmentDeclaration"; -var ZI = `#ifdef CLIPPLANE +var ZI = "clipPlaneFragmentDeclaration"; +var jI = `#ifdef CLIPPLANE varying float fClipDistance; #endif #ifdef CLIPPLANE2 @@ -44040,9 +44041,9 @@ varying float fClipDistance5; varying float fClipDistance6; #endif `; -Y.IncludesShadersStore[YI] = ZI; -var jI = "fogFragmentDeclaration"; -var QI = `#ifdef FOG +Y.IncludesShadersStore[ZI] = jI; +var QI = "fogFragmentDeclaration"; +var JI = `#ifdef FOG #define FOGMODE_NONE 0. #define FOGMODE_EXP 1. #define FOGMODE_EXP2 2. @@ -44058,9 +44059,9 @@ else if (FOGMODE_EXP2==vFogInfos.x) return clamp(fogCoeff,0.0,1.0);} #endif `; -Y.IncludesShadersStore[jI] = QI; -var JI = "clipPlaneFragment"; -var $I = `#if defined(CLIPPLANE) || defined(CLIPPLANE2) || defined(CLIPPLANE3) || defined(CLIPPLANE4) || defined(CLIPPLANE5) || defined(CLIPPLANE6) +Y.IncludesShadersStore[QI] = JI; +var $I = "clipPlaneFragment"; +var eb = `#if defined(CLIPPLANE) || defined(CLIPPLANE2) || defined(CLIPPLANE3) || defined(CLIPPLANE4) || defined(CLIPPLANE5) || defined(CLIPPLANE6) if (false) {} #endif #ifdef CLIPPLANE @@ -44088,9 +44089,9 @@ else if (fClipDistance6>0.0) {discard;} #endif `; -Y.IncludesShadersStore[JI] = $I; -var eb = "fogFragment"; -var tb = `#ifdef FOG +Y.IncludesShadersStore[$I] = eb; +var tb = "fogFragment"; +var ib = `#ifdef FOG float fog=CalcFogFactor(); #ifdef PBR fog=toLinearSpace(fog); @@ -44098,9 +44099,9 @@ fog=toLinearSpace(fog); color.rgb=mix(vFogColor,color.rgb,fog); #endif `; -Y.IncludesShadersStore[eb] = tb; -var ib = "colorPixelShader"; -var rb = `#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES) +Y.IncludesShadersStore[tb] = ib; +var rb = "colorPixelShader"; +var sb = `#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES) #define VERTEXCOLOR varying vec4 vColor; #else @@ -44120,9 +44121,9 @@ gl_FragColor=color; #include(color,gl_FragColor) #define CUSTOM_FRAGMENT_MAIN_END }`; -Y.ShadersStore[ib] = rb; -var sb = "clipPlaneVertexDeclaration"; -var nb = `#ifdef CLIPPLANE +Y.ShadersStore[rb] = sb; +var nb = "clipPlaneVertexDeclaration"; +var ab = `#ifdef CLIPPLANE uniform vec4 vClipPlane;varying float fClipDistance; #endif #ifdef CLIPPLANE2 @@ -44141,15 +44142,15 @@ uniform vec4 vClipPlane5;varying float fClipDistance5; uniform vec4 vClipPlane6;varying float fClipDistance6; #endif `; -Y.IncludesShadersStore[sb] = nb; -var ab = "fogVertexDeclaration"; -var ob = `#ifdef FOG +Y.IncludesShadersStore[nb] = ab; +var ob = "fogVertexDeclaration"; +var lb = `#ifdef FOG varying vec3 vFogDistance; #endif `; -Y.IncludesShadersStore[ab] = ob; -var lb = "clipPlaneVertex"; -var cb = `#ifdef CLIPPLANE +Y.IncludesShadersStore[ob] = lb; +var cb = "clipPlaneVertex"; +var hb = `#ifdef CLIPPLANE fClipDistance=dot(worldPos,vClipPlane); #endif #ifdef CLIPPLANE2 @@ -44168,15 +44169,15 @@ fClipDistance5=dot(worldPos,vClipPlane5); fClipDistance6=dot(worldPos,vClipPlane6); #endif `; -Y.IncludesShadersStore[lb] = cb; -var hb = "fogVertex"; -var ub = `#ifdef FOG +Y.IncludesShadersStore[cb] = hb; +var ub = "fogVertex"; +var fb = `#ifdef FOG vFogDistance=(view*worldPos).xyz; #endif `; -Y.IncludesShadersStore[hb] = ub; -var fb = "vertexColorMixing"; -var db = `#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES) +Y.IncludesShadersStore[ub] = fb; +var db = "vertexColorMixing"; +var pb = `#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES) vColor=vec4(1.0); #ifdef VERTEXCOLOR #ifdef VERTEXALPHA @@ -44190,9 +44191,9 @@ vColor*=instanceColor; #endif #endif `; -Y.IncludesShadersStore[fb] = db; -var pb = "colorVertexShader"; -var gb = `attribute vec3 position; +Y.IncludesShadersStore[db] = pb; +var gb = "colorVertexShader"; +var mb = `attribute vec3 position; #ifdef VERTEXCOLOR attribute vec4 color; #endif @@ -44228,7 +44229,7 @@ gl_Position=viewProjection*worldPos; #include #define CUSTOM_VERTEX_MAIN_END }`; -Y.ShadersStore[pb] = gb; +Y.ShadersStore[gb] = mb; B._LinesMeshParser = (n4, e) => Pa.Parse(n4, e); var Pa = class _Pa extends B { _isShaderMaterial(e) { @@ -44336,7 +44337,7 @@ var Pa = class _Pa extends B { * @returns a new InstancedLinesMesh */ createInstance(e) { - const t = new mb(e, this); + const t = new _b(e, this); if (this.instancedBuffers) { t.instancedBuffers = {}; for (const i in this.instancedBuffers) @@ -44362,7 +44363,7 @@ var Pa = class _Pa extends B { return i.color = Ne.FromArray(e.color), i.alpha = e.alpha, i; } }; -var mb = class extends d0 { +var _b = class extends d0 { constructor(e, t) { super(e, t), this.intersectionThreshold = t.intersectionThreshold; } @@ -44390,26 +44391,26 @@ function p0(n4) { } let M = 0; const N = i ? 1 : 0, F = t ? 1 : 0; - let L, K; + let U, H; E = e[0].length; - let q, j; + let q, Z; for (R = 0; R < e.length + F; R++) { - for (m[R] = 0, p[R] = [0], L = R === e.length ? e[0] : e[R], K = L.length, E = E < K ? E : K, S = 0; S < K; ) - h.push(L[S].x, L[S].y, L[S].z), S > 0 && (q = L[S].subtract(L[S - 1]).length(), j = q + m[R], p[R].push(j), m[R] = j), S++; - i && (S--, h.push(L[0].x, L[0].y, L[0].z), q = L[S].subtract(L[0]).length(), j = q + m[R], p[R].push(j), m[R] = j), C[R] = K + N, T[R] = M, M += K + N; + for (m[R] = 0, p[R] = [0], U = R === e.length ? e[0] : e[R], H = U.length, E = E < H ? E : H, S = 0; S < H; ) + h.push(U[S].x, U[S].y, U[S].z), S > 0 && (q = U[S].subtract(U[S - 1]).length(), Z = q + m[R], p[R].push(Z), m[R] = Z), S++; + i && (S--, h.push(U[0].x, U[0].y, U[0].z), q = U[S].subtract(U[0]).length(), Z = q + m[R], p[R].push(Z), m[R] = Z), C[R] = H + N, T[R] = M, M += H + N; } let k, Q, ce = null, de = null; for (x = 0; x < E + N; x++) for (v[x] = 0, g[x] = [0], R = 0; R < e.length - 1 + F; R++) - k = e[R], Q = R === e.length - 1 ? e[0] : e[R + 1], x === E ? (ce = k[0], de = Q[0]) : (ce = k[x], de = Q[x]), q = de.subtract(ce).length(), j = q + v[x], g[x].push(j), v[x] = j; - let Z, J; + k = e[R], Q = R === e.length - 1 ? e[0] : e[R + 1], x === E ? (ce = k[0], de = Q[0]) : (ce = k[x], de = Q[x]), q = de.subtract(ce).length(), Z = q + v[x], g[x].push(Z), v[x] = Z; + let j, J; if (l) for (R = 0; R < l.length; R++) d.push(l[R].x, nt.UseOpenGLOrientationForUV ? 1 - l[R].y : l[R].y); else for (R = 0; R < e.length + F; R++) for (x = 0; x < E + N; x++) - Z = m[R] != 0 ? p[R][x] / m[R] : 0, J = v[x] != 0 ? g[x][R] / v[x] : 0, r ? d.push(J, Z) : d.push(Z, nt.UseOpenGLOrientationForUV ? 1 - J : J); + j = m[R] != 0 ? p[R][x] / m[R] : 0, J = v[x] != 0 ? g[x][R] / v[x] : 0, r ? d.push(J, j) : d.push(j, nt.UseOpenGLOrientationForUV ? 1 - J : J); R = 0; let O = 0, G = C[R] - 1, ee = C[R + 1] - 1, _e = G < ee ? G : ee, Oe = T[1] - T[0]; const ze = C.length - 1; @@ -44504,7 +44505,7 @@ B.CreateRibbon = (n4, e, t = false, i, r, s, a = false, o, l) => Oa(n4, { sideOrientation: o, instance: l }, s); -function mf(n4) { +function _f(n4) { const e = [], t = [], i = [], r = [], s = n4.radius || 0.5, a = n4.tessellation || 64, o = n4.arc && (n4.arc <= 0 || n4.arc > 1) ? 1 : n4.arc || 1, l = n4.sideOrientation === 0 ? 0 : n4.sideOrientation || re.DEFAULTSIDE; e.push(0, 0, 0), r.push(0.5, 0.5); const c = Math.PI * 2 * o, h = o === 1 ? c / a : c / (a - 1); @@ -44523,9 +44524,9 @@ function mf(n4) { } function g0(n4, e = {}, t = null) { const i = new B(n4, t); - return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, mf(e).applyToMesh(i, e.updatable), i; + return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, _f(e).applyToMesh(i, e.updatable), i; } -re.CreateDisc = mf; +re.CreateDisc = _f; B.CreateDisc = (n4, e, t, i = null, r, s) => g0(n4, { radius: e, tessellation: t, @@ -44601,15 +44602,15 @@ function _0(n4) { const h = new re(); return h.indices = e, h.positions = t, h.normals = i, h.uvs = r, h; } -function _b(n4, e = {}, t) { +function Eb(n4, e = {}, t) { const i = new qo(n4, t); return i._setReady(false), i._subdivisionsX = e.subdivisionsX || e.subdivisions || 1, i._subdivisionsY = e.subdivisionsY || e.subdivisions || 1, i._width = e.width || 1, i._height = e.height || 1, i._maxX = i._width / 2, i._maxZ = i._height / 2, i._minX = -i._maxX, i._minZ = -i._maxZ, Ns(e).applyToMesh(i, e.updatable), i._setReady(true), i; } -function Eb(n4, e, t = null) { +function vb(n4, e, t = null) { const i = new B(n4, t); return m0(e).applyToMesh(i, e.updatable), i; } -function vb(n4, e, t = {}, i = null) { +function Tb(n4, e, t = {}, i = null) { const r = t.width || 10, s = t.height || 10, a = t.subdivisions || 1, o = t.minHeight || 0, l = t.maxHeight || 1, c = t.colorFilter || new Ne(0.3, 0.59, 0.11), h = t.alphaFilter || 0, u = t.updatable, f = t.onReady; i = i || st.LastCreatedScene; const d = new qo(n4, i); @@ -44648,13 +44649,13 @@ function vb(n4, e, t = {}, i = null) { re.CreateGround = Ns; re.CreateTiledGround = m0; re.CreateGroundFromHeightMap = _0; -B.CreateGround = (n4, e, t, i, r, s) => _b(n4, { +B.CreateGround = (n4, e, t, i, r, s) => Eb(n4, { width: e, height: t, subdivisions: i, updatable: s }, r); -B.CreateTiledGround = (n4, e, t, i, r, s, a, o, l) => Eb(n4, { +B.CreateTiledGround = (n4, e, t, i, r, s, a, o, l) => vb(n4, { xmin: e, zmin: t, xmax: i, @@ -44663,7 +44664,7 @@ B.CreateTiledGround = (n4, e, t, i, r, s, a, o, l) => Eb(n4, { precision: a, updatable: l }, o); -B.CreateGroundFromHeightMap = (n4, e, t, i, r, s, a, o, l, c, h) => vb(n4, e, { +B.CreateGroundFromHeightMap = (n4, e, t, i, r, s, a, o, l, c, h) => Tb(n4, e, { width: t, height: i, subdivisions: r, @@ -44914,26 +44915,26 @@ function E0(n4) { } return x; } -function Tb(n4) { - const e = n4.width || n4.size || 1, t = n4.height || n4.size || 1, i = n4.depth || n4.size || 1, r = (n4.widthSegments || n4.segments || 1) | 0, s = (n4.heightSegments || n4.segments || 1) | 0, a = (n4.depthSegments || n4.segments || 1) | 0, o = new w(), l = new w(), c = new w(), h = Ns({ width: e, height: i, subdivisionsX: r, subdivisionsY: a }); - w.TranslationToRef(0, -t / 2, 0, l), w.RotationZToRef(Math.PI, o), o.multiplyToRef(l, c), h.transform(c); +function xb(n4) { + const e = n4.width || n4.size || 1, t = n4.height || n4.size || 1, i = n4.depth || n4.size || 1, r = (n4.widthSegments || n4.segments || 1) | 0, s = (n4.heightSegments || n4.segments || 1) | 0, a = (n4.depthSegments || n4.segments || 1) | 0, o = new L(), l = new L(), c = new L(), h = Ns({ width: e, height: i, subdivisionsX: r, subdivisionsY: a }); + L.TranslationToRef(0, -t / 2, 0, l), L.RotationZToRef(Math.PI, o), o.multiplyToRef(l, c), h.transform(c); const u = Ns({ width: e, height: i, subdivisionsX: r, subdivisionsY: a }); - w.TranslationToRef(0, t / 2, 0, c), u.transform(c); + L.TranslationToRef(0, t / 2, 0, c), u.transform(c); const f = Ns({ width: t, height: i, subdivisionsX: s, subdivisionsY: a }); - w.TranslationToRef(-e / 2, 0, 0, l), w.RotationZToRef(Math.PI / 2, o), o.multiplyToRef(l, c), f.transform(c); + L.TranslationToRef(-e / 2, 0, 0, l), L.RotationZToRef(Math.PI / 2, o), o.multiplyToRef(l, c), f.transform(c); const d = Ns({ width: t, height: i, subdivisionsX: s, subdivisionsY: a }); - w.TranslationToRef(e / 2, 0, 0, l), w.RotationZToRef(-Math.PI / 2, o), o.multiplyToRef(l, c), d.transform(c); + L.TranslationToRef(e / 2, 0, 0, l), L.RotationZToRef(-Math.PI / 2, o), o.multiplyToRef(l, c), d.transform(c); const p = Ns({ width: e, height: t, subdivisionsX: r, subdivisionsY: s }); - w.TranslationToRef(0, 0, -i / 2, l), w.RotationXToRef(-Math.PI / 2, o), o.multiplyToRef(l, c), p.transform(c); + L.TranslationToRef(0, 0, -i / 2, l), L.RotationXToRef(-Math.PI / 2, o), o.multiplyToRef(l, c), p.transform(c); const g = Ns({ width: e, height: t, subdivisionsX: r, subdivisionsY: s }); - return w.TranslationToRef(0, 0, i / 2, l), w.RotationXToRef(Math.PI / 2, o), o.multiplyToRef(l, c), g.transform(c), h.merge([u, d, f, p, g], true), h; + return L.TranslationToRef(0, 0, i / 2, l), L.RotationXToRef(Math.PI / 2, o), o.multiplyToRef(l, c), g.transform(c), h.merge([u, d, f, p, g], true), h; } -function xb(n4, e = {}, t = null) { +function Cb(n4, e = {}, t = null) { const i = new B(n4, t); return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, E0(e).applyToMesh(i, e.updatable), i; } re.CreateBox = E0; -B.CreateBox = (n4, e, t = null, i, r) => xb(n4, { +B.CreateBox = (n4, e, t = null, i, r) => Cb(n4, { size: e, sideOrientation: r, updatable: i @@ -44974,46 +44975,46 @@ function Hl(n4) { let S = []; const M = [], N = []; let F = 0; - for (let j = 0; j < h; j++) + for (let Z = 0; Z < h; Z++) for (let k = 0; k < o; k++) - T.push(-f + k * t + p, -d + j * i + g, 0), T.push(-f + (k + 1) * t + p, -d + j * i + g, 0), T.push(-f + (k + 1) * t + p, -d + (j + 1) * i + g, 0), T.push(-f + k * t + p, -d + (j + 1) * i + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(x[(k % 2 + j % 2) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(x[j % 2]) : S = S.concat(x[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1), F += 4; + T.push(-f + k * t + p, -d + Z * i + g, 0), T.push(-f + (k + 1) * t + p, -d + Z * i + g, 0), T.push(-f + (k + 1) * t + p, -d + (Z + 1) * i + g, 0), T.push(-f + k * t + p, -d + (Z + 1) * i + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(x[(k % 2 + Z % 2) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(x[Z % 2]) : S = S.concat(x[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1), F += 4; if (l > 0 || u > 0) { - const j = u > 0 && (s === B.CENTER || s === B.TOP), k = u > 0 && (s === B.CENTER || s === B.BOTTOM), Q = l > 0 && (r === B.CENTER || r === B.RIGHT), ce = l > 0 && (r === B.CENTER || r === B.LEFT); - let de = [], Z, J, O, G; - if (j && Q && (T.push(m + p, v + g, 0), T.push(-f + p, v + g, 0), T.push(-f + p, v + u + g, 0), T.push(m + p, v + u + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, Z = 1 - l / t, J = 1 - u / i, O = 1, G = 1, de = [Z, J, O, J, O, G, Z, G], e === B.ROTATE_ROW && (de = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), e === B.FLIP_ROW && (de = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), e === B.FLIP_N_ROTATE_ROW && (de = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), j && ce && (T.push(f + p, v + g, 0), T.push(E + p, v + g, 0), T.push(E + p, v + u + g, 0), T.push(f + p, v + u + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, Z = 0, J = 1 - u / i, O = l / t, G = 1, de = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_ROW || e === B.ROTATE_TILE && o % 2 === 0) && (de = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_ROW || e === B.FLIP_TILE && o % 2 === 0) && (de = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_ROW || e === B.FLIP_N_ROTATE_TILE && o % 2 === 0) && (de = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), k && Q && (T.push(m + p, d + g, 0), T.push(-f + p, d + g, 0), T.push(-f + p, C + g, 0), T.push(m + p, C + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, Z = 1 - l / t, J = 0, O = 1, G = u / i, de = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_ROW && h % 2 === 1 || e === B.ROTATE_TILE && h % 1 === 0) && (de = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_ROW && h % 2 === 1 || e === B.FLIP_TILE && h % 2 === 0) && (de = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_ROW && h % 2 === 1 || e === B.FLIP_N_ROTATE_TILE && h % 2 === 0) && (de = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), k && ce && (T.push(f + p, d + g, 0), T.push(E + p, d + g, 0), T.push(E + p, C + g, 0), T.push(f + p, C + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, Z = 0, J = 0, O = l / t, G = u / i, de = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_ROW && h % 2 === 1 || e === B.ROTATE_TILE && (h + o) % 2 === 1) && (de = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_ROW && h % 2 === 1 || e === B.FLIP_TILE && (h + o) % 2 === 1) && (de = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_ROW && h % 2 === 1 || e === B.FLIP_N_ROTATE_TILE && (h + o) % 2 === 1) && (de = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), j) { + const Z = u > 0 && (s === B.CENTER || s === B.TOP), k = u > 0 && (s === B.CENTER || s === B.BOTTOM), Q = l > 0 && (r === B.CENTER || r === B.RIGHT), ce = l > 0 && (r === B.CENTER || r === B.LEFT); + let de = [], j, J, O, G; + if (Z && Q && (T.push(m + p, v + g, 0), T.push(-f + p, v + g, 0), T.push(-f + p, v + u + g, 0), T.push(m + p, v + u + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, j = 1 - l / t, J = 1 - u / i, O = 1, G = 1, de = [j, J, O, J, O, G, j, G], e === B.ROTATE_ROW && (de = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), e === B.FLIP_ROW && (de = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), e === B.FLIP_N_ROTATE_ROW && (de = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), Z && ce && (T.push(f + p, v + g, 0), T.push(E + p, v + g, 0), T.push(E + p, v + u + g, 0), T.push(f + p, v + u + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, j = 0, J = 1 - u / i, O = l / t, G = 1, de = [j, J, O, J, O, G, j, G], (e === B.ROTATE_ROW || e === B.ROTATE_TILE && o % 2 === 0) && (de = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_ROW || e === B.FLIP_TILE && o % 2 === 0) && (de = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_ROW || e === B.FLIP_N_ROTATE_TILE && o % 2 === 0) && (de = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), k && Q && (T.push(m + p, d + g, 0), T.push(-f + p, d + g, 0), T.push(-f + p, C + g, 0), T.push(m + p, C + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, j = 1 - l / t, J = 0, O = 1, G = u / i, de = [j, J, O, J, O, G, j, G], (e === B.ROTATE_ROW && h % 2 === 1 || e === B.ROTATE_TILE && h % 1 === 0) && (de = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_ROW && h % 2 === 1 || e === B.FLIP_TILE && h % 2 === 0) && (de = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_ROW && h % 2 === 1 || e === B.FLIP_N_ROTATE_TILE && h % 2 === 0) && (de = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), k && ce && (T.push(f + p, d + g, 0), T.push(E + p, d + g, 0), T.push(E + p, C + g, 0), T.push(f + p, C + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, j = 0, J = 0, O = l / t, G = u / i, de = [j, J, O, J, O, G, j, G], (e === B.ROTATE_ROW && h % 2 === 1 || e === B.ROTATE_TILE && (h + o) % 2 === 1) && (de = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_ROW && h % 2 === 1 || e === B.FLIP_TILE && (h + o) % 2 === 1) && (de = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_ROW && h % 2 === 1 || e === B.FLIP_N_ROTATE_TILE && (h + o) % 2 === 1) && (de = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), Z) { const ee = []; - Z = 0, J = 1 - u / i, O = 1, G = 1, ee[0] = [Z, J, O, J, O, G, Z, G], ee[1] = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]); + j = 0, J = 1 - u / i, O = 1, G = 1, ee[0] = [j, J, O, J, O, G, j, G], ee[1] = [j, J, O, J, O, G, j, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]); for (let _e = 0; _e < o; _e++) T.push(-f + _e * t + p, v + g, 0), T.push(-f + (_e + 1) * t + p, v + g, 0), T.push(-f + (_e + 1) * t + p, v + u + g, 0), T.push(-f + _e * t + p, v + u + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(ee[(_e + 1) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(ee[1]) : S = S.concat(ee[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1); } if (k) { const ee = []; - Z = 0, J = 0, O = 1, G = u / i, ee[0] = [Z, J, O, J, O, G, Z, G], ee[1] = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]); + j = 0, J = 0, O = 1, G = u / i, ee[0] = [j, J, O, J, O, G, j, G], ee[1] = [j, J, O, J, O, G, j, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]); for (let _e = 0; _e < o; _e++) T.push(-f + _e * t + p, C - u + g, 0), T.push(-f + (_e + 1) * t + p, C - u + g, 0), T.push(-f + (_e + 1) * t + p, C + g, 0), T.push(-f + _e * t + p, C + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(ee[(_e + h) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(ee[h % 2]) : S = S.concat(ee[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1); } if (Q) { const ee = []; - Z = 1 - l / t, J = 0, O = 1, G = 1, ee[0] = [Z, J, O, J, O, G, Z, G], ee[1] = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]); + j = 1 - l / t, J = 0, O = 1, G = 1, ee[0] = [j, J, O, J, O, G, j, G], ee[1] = [j, J, O, J, O, G, j, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]); for (let _e = 0; _e < h; _e++) T.push(m + p, -d + _e * i + g, 0), T.push(m + l + p, -d + _e * i + g, 0), T.push(m + l + p, -d + (_e + 1) * i + g, 0), T.push(m + p, -d + (_e + 1) * i + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(ee[(_e + 1) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(ee[_e % 2]) : S = S.concat(ee[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1); } if (ce) { const ee = []; - Z = 0, J = 0, O = l / i, G = 1, ee[0] = [Z, J, O, J, O, G, Z, G], ee[1] = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]); + j = 0, J = 0, O = l / i, G = 1, ee[0] = [j, J, O, J, O, G, j, G], ee[1] = [j, J, O, J, O, G, j, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]); for (let _e = 0; _e < h; _e++) T.push(E - l + p, -d + _e * i + g, 0), T.push(E + p, -d + _e * i + g, 0), T.push(E + p, -d + (_e + 1) * i + g, 0), T.push(E - l + p, -d + (_e + 1) * i + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(ee[(_e + o) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(ee[_e % 2]) : S = S.concat(ee[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1); } } - const L = n4.sideOrientation === 0 ? 0 : n4.sideOrientation || re.DEFAULTSIDE; - re._ComputeSides(L, T, N, R, S, n4.frontUVs, n4.backUVs); - const K = new re(); - K.indices = N, K.positions = T, K.normals = R, K.uvs = S; - const q = L === re.DOUBLESIDE ? M.concat(M) : M; - return K.colors = q, K; + const U = n4.sideOrientation === 0 ? 0 : n4.sideOrientation || re.DEFAULTSIDE; + re._ComputeSides(U, T, N, R, S, n4.frontUVs, n4.backUVs); + const H = new re(); + H.indices = N, H.positions = T, H.normals = R, H.uvs = S; + const q = U === re.DOUBLESIDE ? M.concat(M) : M; + return H.colors = q, H; } re.CreateTiledPlane = Hl; -function Cb(n4) { +function Rb(n4) { const t = n4.faceUV || new Array(6), i = n4.faceColors, r = n4.pattern || B.NO_FLIP, s = n4.width || n4.size || 1, a = n4.height || n4.size || 1, o = n4.depth || n4.size || 1, l = n4.tileWidth || n4.tileSize || 1, c = n4.tileHeight || n4.tileSize || 1, h = n4.alignHorizontal || 0, u = n4.alignVertical || 0, f = n4.sideOrientation === 0 ? 0 : n4.sideOrientation || re.DEFAULTSIDE; for (let O = 0; O < 6; O++) t[O] === void 0 && (t[O] = new Ke(0, 0, 1, 1)), i && i[O] === void 0 && (i[O] = new et(1, 1, 1, 1)); @@ -45055,7 +45056,7 @@ function Cb(n4) { }); let E = [], C = [], T = [], R = []; const x = [], S = [], M = [], N = []; - let F = 0, L = 0; + let F = 0, U = 0; for (let O = 0; O < 6; O++) { const G = m[O].positions.length; S[O] = [], M[O] = []; @@ -45064,20 +45065,20 @@ function Cb(n4) { F = m[O].uvs.length, N[O] = []; for (let ee = 0; ee < F; ee += 2) N[O][ee] = t[O].x + (t[O].z - t[O].x) * m[O].uvs[ee], N[O][ee + 1] = t[O].y + (t[O].w - t[O].y) * m[O].uvs[ee + 1], nt.UseOpenGLOrientationForUV && (N[O][ee + 1] = 1 - N[O][ee + 1]); - if (T = T.concat(N[O]), R = R.concat(m[O].indices.map((ee) => ee + L)), L += S[O].length, i) + if (T = T.concat(N[O]), R = R.concat(m[O].indices.map((ee) => ee + U)), U += S[O].length, i) for (let ee = 0; ee < 4; ee++) x.push(i[O].r, i[O].g, i[O].b, i[O].a); } - const K = new _(0, 0, g), q = w.RotationY(Math.PI); - E = S[0].map((O) => _.TransformNormal(O, q).add(K)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []), C = M[0].map((O) => _.TransformNormal(O, q)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []), E = E.concat(S[1].map((O) => O.subtract(K)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[1].map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])); - const j = new _(d, 0, 0), k = w.RotationY(-Math.PI / 2); - E = E.concat(S[2].map((O) => _.TransformNormal(O, k).add(j)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[2].map((O) => _.TransformNormal(O, k)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])); - const Q = w.RotationY(Math.PI / 2); - E = E.concat(S[3].map((O) => _.TransformNormal(O, Q).subtract(j)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[3].map((O) => _.TransformNormal(O, Q)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])); - const ce = new _(0, p, 0), de = w.RotationX(Math.PI / 2); + const H = new _(0, 0, g), q = L.RotationY(Math.PI); + E = S[0].map((O) => _.TransformNormal(O, q).add(H)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []), C = M[0].map((O) => _.TransformNormal(O, q)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []), E = E.concat(S[1].map((O) => O.subtract(H)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[1].map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])); + const Z = new _(d, 0, 0), k = L.RotationY(-Math.PI / 2); + E = E.concat(S[2].map((O) => _.TransformNormal(O, k).add(Z)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[2].map((O) => _.TransformNormal(O, k)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])); + const Q = L.RotationY(Math.PI / 2); + E = E.concat(S[3].map((O) => _.TransformNormal(O, Q).subtract(Z)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[3].map((O) => _.TransformNormal(O, Q)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])); + const ce = new _(0, p, 0), de = L.RotationX(Math.PI / 2); E = E.concat(S[4].map((O) => _.TransformNormal(O, de).add(ce)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[4].map((O) => _.TransformNormal(O, de)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])); - const Z = w.RotationX(-Math.PI / 2); - E = E.concat(S[5].map((O) => _.TransformNormal(O, Z).subtract(ce)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[5].map((O) => _.TransformNormal(O, Z)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), re._ComputeSides(f, E, R, C, T); + const j = L.RotationX(-Math.PI / 2); + E = E.concat(S[5].map((O) => _.TransformNormal(O, j).subtract(ce)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[5].map((O) => _.TransformNormal(O, j)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), re._ComputeSides(f, E, R, C, T); const J = new re(); if (J.indices = R, J.positions = E, J.normals = C, J.uvs = T, i) { const O = f === re.DOUBLESIDE ? x.concat(x) : x; @@ -45085,14 +45086,14 @@ function Cb(n4) { } return J; } -re.CreateTiledBox = Cb; -function _f(n4) { +re.CreateTiledBox = Rb; +function Ef(n4) { const e = (n4.segments || 32) | 0, t = n4.diameterX || n4.diameter || 1, i = n4.diameterY || n4.diameter || 1, r = n4.diameterZ || n4.diameter || 1, s = n4.arc && (n4.arc <= 0 || n4.arc > 1) ? 1 : n4.arc || 1, a = n4.slice && n4.slice <= 0 ? 1 : n4.slice || 1, o = n4.sideOrientation === 0 ? 0 : n4.sideOrientation || re.DEFAULTSIDE, l = !!n4.dedupTopBottomIndices, c = new _(t / 2, i / 2, r / 2), h = 2 + e, u = 2 * h, f = [], d = [], p = [], g = []; for (let v = 0; v <= h; v++) { const E = v / h, C = E * Math.PI * a; for (let T = 0; T <= u; T++) { - const R = T / u, x = R * Math.PI * 2 * s, S = w.RotationZ(-C), M = w.RotationY(x), N = _.TransformCoordinates(_.Up(), S), F = _.TransformCoordinates(N, M), L = F.multiply(c), K = F.divide(c).normalize(); - d.push(L.x, L.y, L.z), p.push(K.x, K.y, K.z), g.push(R, nt.UseOpenGLOrientationForUV ? 1 - E : E); + const R = T / u, x = R * Math.PI * 2 * s, S = L.RotationZ(-C), M = L.RotationY(x), N = _.TransformCoordinates(_.Up(), S), F = _.TransformCoordinates(N, M), U = F.multiply(c), H = F.divide(c).normalize(); + d.push(U.x, U.y, U.z), p.push(H.x, H.y, H.z), g.push(R, nt.UseOpenGLOrientationForUV ? 1 - E : E); } if (v > 0) { const T = d.length / 3; @@ -45106,9 +45107,9 @@ function _f(n4) { } function v0(n4, e = {}, t = null) { const i = new B(n4, t); - return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, _f(e).applyToMesh(i, e.updatable), i; + return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, Ef(e).applyToMesh(i, e.updatable), i; } -re.CreateSphere = _f; +re.CreateSphere = Ef; B.CreateSphere = (n4, e, t, i, r, s) => v0(n4, { segments: e, diameterX: t, @@ -45117,7 +45118,7 @@ B.CreateSphere = (n4, e, t, i, r, s) => v0(n4, { sideOrientation: s, updatable: r }, i); -function Ef(n4) { +function vf(n4) { const e = n4.height || 2; let t = n4.diameterTop === 0 ? 0 : n4.diameterTop || n4.diameter || 1, i = n4.diameterBottom === 0 ? 0 : n4.diameterBottom || n4.diameter || 1; t = t || 1e-5, i = i || 1e-5; @@ -45129,13 +45130,13 @@ function Ef(n4) { u && u[m] === void 0 && (u[m] = new Ke(0, 0, 1, 1)); const v = [], E = [], C = [], T = [], R = [], x = Math.PI * 2 * c / r; let S, M, N; - const F = (i - t) / 2 / e, L = _.Zero(), K = _.Zero(), q = _.Zero(), j = _.Zero(), k = _.Zero(), Q = Ko.Y; - let ce, de, Z, J = 1, O = 1, G = 0, ee = 0; + const F = (i - t) / 2 / e, U = _.Zero(), H = _.Zero(), q = _.Zero(), Z = _.Zero(), k = _.Zero(), Q = Ko.Y; + let ce, de, j, J = 1, O = 1, G = 0, ee = 0; for (ce = 0; ce <= s; ce++) - for (M = ce / s, N = (M * (t - i) + i) / 2, J = a && ce !== 0 && ce !== s ? 2 : 1, Z = 0; Z < J; Z++) { - for (a && (O += Z), o && (O += 2 * Z), de = 0; de <= r; de++) - S = de * x, L.x = Math.cos(-S) * N, L.y = -e / 2 + M * e, L.z = Math.sin(-S) * N, t === 0 && ce === s ? (K.x = C[C.length - (r + 1) * 3], K.y = C[C.length - (r + 1) * 3 + 1], K.z = C[C.length - (r + 1) * 3 + 2]) : (K.x = L.x, K.z = L.z, K.y = Math.sqrt(K.x * K.x + K.z * K.z) * F, K.normalize()), de === 0 && (q.copyFrom(L), j.copyFrom(K)), E.push(L.x, L.y, L.z), C.push(K.x, K.y, K.z), a ? ee = G !== O ? u[O].y : u[O].w : ee = u[O].y + (u[O].w - u[O].y) * M, T.push(u[O].x + (u[O].z - u[O].x) * de / r, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), f && R.push(f[O].r, f[O].g, f[O].b, f[O].a); - c !== 1 && o && (E.push(L.x, L.y, L.z), E.push(0, L.y, 0), E.push(0, L.y, 0), E.push(q.x, q.y, q.z), _.CrossToRef(Q, K, k), k.normalize(), C.push(k.x, k.y, k.z, k.x, k.y, k.z), _.CrossToRef(j, Q, k), k.normalize(), C.push(k.x, k.y, k.z, k.x, k.y, k.z), a ? ee = G !== O ? u[O + 1].y : u[O + 1].w : ee = u[O + 1].y + (u[O + 1].w - u[O + 1].y) * M, T.push(u[O + 1].x, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), T.push(u[O + 1].z, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), a ? ee = G !== O ? u[O + 2].y : u[O + 2].w : ee = u[O + 2].y + (u[O + 2].w - u[O + 2].y) * M, T.push(u[O + 2].x, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), T.push(u[O + 2].z, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), f && (R.push(f[O + 1].r, f[O + 1].g, f[O + 1].b, f[O + 1].a), R.push(f[O + 1].r, f[O + 1].g, f[O + 1].b, f[O + 1].a), R.push(f[O + 2].r, f[O + 2].g, f[O + 2].b, f[O + 2].a), R.push(f[O + 2].r, f[O + 2].g, f[O + 2].b, f[O + 2].a))), G !== O && (G = O); + for (M = ce / s, N = (M * (t - i) + i) / 2, J = a && ce !== 0 && ce !== s ? 2 : 1, j = 0; j < J; j++) { + for (a && (O += j), o && (O += 2 * j), de = 0; de <= r; de++) + S = de * x, U.x = Math.cos(-S) * N, U.y = -e / 2 + M * e, U.z = Math.sin(-S) * N, t === 0 && ce === s ? (H.x = C[C.length - (r + 1) * 3], H.y = C[C.length - (r + 1) * 3 + 1], H.z = C[C.length - (r + 1) * 3 + 2]) : (H.x = U.x, H.z = U.z, H.y = Math.sqrt(H.x * H.x + H.z * H.z) * F, H.normalize()), de === 0 && (q.copyFrom(U), Z.copyFrom(H)), E.push(U.x, U.y, U.z), C.push(H.x, H.y, H.z), a ? ee = G !== O ? u[O].y : u[O].w : ee = u[O].y + (u[O].w - u[O].y) * M, T.push(u[O].x + (u[O].z - u[O].x) * de / r, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), f && R.push(f[O].r, f[O].g, f[O].b, f[O].a); + c !== 1 && o && (E.push(U.x, U.y, U.z), E.push(0, U.y, 0), E.push(0, U.y, 0), E.push(q.x, q.y, q.z), _.CrossToRef(Q, H, k), k.normalize(), C.push(k.x, k.y, k.z, k.x, k.y, k.z), _.CrossToRef(Z, Q, k), k.normalize(), C.push(k.x, k.y, k.z, k.x, k.y, k.z), a ? ee = G !== O ? u[O + 1].y : u[O + 1].w : ee = u[O + 1].y + (u[O + 1].w - u[O + 1].y) * M, T.push(u[O + 1].x, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), T.push(u[O + 1].z, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), a ? ee = G !== O ? u[O + 2].y : u[O + 2].w : ee = u[O + 2].y + (u[O + 2].w - u[O + 2].y) * M, T.push(u[O + 2].x, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), T.push(u[O + 2].z, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), f && (R.push(f[O + 1].r, f[O + 1].g, f[O + 1].b, f[O + 1].a), R.push(f[O + 1].r, f[O + 1].g, f[O + 1].b, f[O + 1].a), R.push(f[O + 2].r, f[O + 2].g, f[O + 2].b, f[O + 2].a), R.push(f[O + 2].r, f[O + 2].g, f[O + 2].b, f[O + 2].a))), G !== O && (G = O); } const _e = c !== 1 && o ? r + 4 : r; for (ce = 0, O = 0; O < s; O++) { @@ -45159,9 +45160,9 @@ function Ef(n4) { const hi = new me(0.5, 0.5); for (qe = 0; qe <= r; qe++) { Fe = Math.PI * 2 * qe * c / r; - const Es = Math.cos(-Fe), Ur = Math.sin(-Fe); - Se = new _(Es * Te, Ut, Ur * Te); - const vs = new me(Es * hi.x + 0.5, Ur * hi.y + 0.5); + const Es = Math.cos(-Fe), Vr = Math.sin(-Fe); + Se = new _(Es * Te, Ut, Vr * Te); + const vs = new me(Es * hi.x + 0.5, Vr * hi.y + 0.5); E.push(Se.x, Se.y, Se.z), C.push(0, fe ? 1 : -1, 0); const ki = ue.y + (ue.w - ue.y) * vs.y; T.push(ue.x + (ue.z - ue.x) * vs.x, nt.UseOpenGLOrientationForUV ? 1 - ki : ki), Ye && R.push(Ye.r, Ye.g, Ye.b, Ye.a); @@ -45173,12 +45174,12 @@ function Ef(n4) { const ze = new re(); return ze.indices = v, ze.positions = E, ze.normals = C, ze.uvs = T, f && (ze.colors = R), ze; } -function Rb(n4, e = {}, t) { +function Sb(n4, e = {}, t) { const i = new B(n4, t); - return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, Ef(e).applyToMesh(i, e.updatable), i; + return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, vf(e).applyToMesh(i, e.updatable), i; } -re.CreateCylinder = Ef; -B.CreateCylinder = (n4, e, t, i, r, s, a, o, l) => ((a === void 0 || !(a instanceof Ot)) && (a !== void 0 && (l = o || B.DEFAULTSIDE, o = a), a = s, s = 1), Rb(n4, { +re.CreateCylinder = vf; +B.CreateCylinder = (n4, e, t, i, r, s, a, o, l) => ((a === void 0 || !(a instanceof Ot)) && (a !== void 0 && (l = o || B.DEFAULTSIDE, o = a), a = s, s = 1), Sb(n4, { height: e, diameterTop: t, diameterBottom: i, @@ -45187,10 +45188,10 @@ B.CreateCylinder = (n4, e, t, i, r, s, a, o, l) => ((a === void 0 || !(a instanc sideOrientation: l, updatable: o }, a)); -function vf(n4) { +function Tf(n4) { const e = [], t = [], i = [], r = [], s = n4.diameter || 1, a = n4.thickness || 0.5, o = (n4.tessellation || 16) | 0, l = n4.sideOrientation === 0 ? 0 : n4.sideOrientation || re.DEFAULTSIDE, c = o + 1; for (let u = 0; u <= o; u++) { - const f = u / o, d = u * Math.PI * 2 / o - Math.PI / 2, p = w.Translation(s / 2, 0, 0).multiply(w.RotationY(d)); + const f = u / o, d = u * Math.PI * 2 / o - Math.PI / 2, p = L.Translation(s / 2, 0, 0).multiply(L.RotationY(d)); for (let g = 0; g <= o; g++) { const m = 1 - g / o, v = g * Math.PI * 2 / o + Math.PI, E = Math.cos(v), C = Math.sin(v); let T = new _(E, C, 0), R = T.scale(a / 2); @@ -45204,12 +45205,12 @@ function vf(n4) { const h = new re(); return h.indices = e, h.positions = t, h.normals = i, h.uvs = r, h; } -function Sb(n4, e = {}, t) { +function yb(n4, e = {}, t) { const i = new B(n4, t); - return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, vf(e).applyToMesh(i, e.updatable), i; + return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, Tf(e).applyToMesh(i, e.updatable), i; } -re.CreateTorus = vf; -B.CreateTorus = (n4, e, t, i, r, s, a) => Sb(n4, { +re.CreateTorus = Tf; +B.CreateTorus = (n4, e, t, i, r, s, a) => yb(n4, { diameter: e, thickness: t, tessellation: i, @@ -45240,12 +45241,12 @@ function T0(n4) { const g = new re(); return g.indices = e, g.positions = t, g.normals = i, g.uvs = r, g; } -function yb(n4, e = {}, t) { +function Ib(n4, e = {}, t) { const i = new B(n4, t); return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, T0(e).applyToMesh(i, e.updatable), i; } re.CreateTorusKnot = T0; -B.CreateTorusKnot = (n4, e, t, i, r, s, a, o, l, c) => yb(n4, { +B.CreateTorusKnot = (n4, e, t, i, r, s, a, o, l, c) => Ib(n4, { radius: e, tube: t, radialSegments: i, @@ -45285,7 +45286,7 @@ function C0(n4) { const g = new re(); return g.positions = s, g.indices = a, g; } -function Ib(n4, e, t = null) { +function bb(n4, e, t = null) { const i = e.instance, r = e.lines, s = e.colors; if (i) { const c = i.getVerticesData(I.PositionKind); @@ -45302,11 +45303,11 @@ function Ib(n4, e, t = null) { const a = !!s, o = new Pa(n4, t, null, void 0, void 0, a, e.useVertexAlpha, e.material); return x0(e).applyToMesh(o, e.updatable), o; } -function bb(n4, e, t = null) { +function Ab(n4, e, t = null) { const i = e.colors ? [e.colors] : null; - return Ib(n4, { lines: [e.points], updatable: e.updatable, instance: e.instance, colors: i, useVertexAlpha: e.useVertexAlpha, material: e.material }, t); + return bb(n4, { lines: [e.points], updatable: e.updatable, instance: e.instance, colors: i, useVertexAlpha: e.useVertexAlpha, material: e.material }, t); } -function Ab(n4, e, t = null) { +function Mb(n4, e, t = null) { const i = e.points, r = e.instance, s = e.gapSize || 1, a = e.dashSize || 3; if (r) { const c = (h) => { @@ -45329,12 +45330,12 @@ function Ab(n4, e, t = null) { } re.CreateLineSystem = x0; re.CreateDashedLines = C0; -B.CreateLines = (n4, e, t = null, i = false, r = null) => bb(n4, { +B.CreateLines = (n4, e, t = null, i = false, r = null) => Ab(n4, { points: e, updatable: i, instance: r }, t); -B.CreateDashedLines = (n4, e, t, i, r, s = null, a, o) => Ab(n4, { +B.CreateDashedLines = (n4, e, t, i, r, s = null, a, o) => Mb(n4, { points: e, dashSize: t, gapSize: i, @@ -45411,7 +45412,7 @@ var os = class _os { return new _os(e * Math.PI / 180); } }; -var Mb = class { +var Pb = class { /** * Creates an Arc object from the three given points : start, middle and end. * @param startPoint Defines the start point of the arc @@ -45460,7 +45461,7 @@ var Vc = class _Vc { addArcTo(e, t, i, r, s = 36) { if (this.closed) return this; - const a = this._points[this._points.length - 1], o = new me(e, t), l = new me(i, r), c = new Mb(a, o, l); + const a = this._points[this._points.length - 1], o = new me(e, t), l = new me(i, r), c = new Pb(a, o, l); let h = c.angle.radians() / s; c.orientation === Ea.CW && (h *= -1); let u = c.startAngle.radians() + h; @@ -45627,7 +45628,7 @@ var To = class _To { position: 0, subPosition: 0, interpolateReady: false, - interpolationMatrix: w.Identity() + interpolationMatrix: L.Identity() }; for (let s = 0; s < e.length; s++) this._curve[s] = e[s].clone(); @@ -45869,7 +45870,7 @@ var To = class _To { * Updates the point at interpolation matrix for the tangents, normals and binormals */ _updateInterpolationMatrix() { - this._pointAtData.interpolationMatrix = w.Identity(); + this._pointAtData.interpolationMatrix = L.Identity(); const e = this._pointAtData.previousPointArrayIndex; if (e !== this._tangents.length - 1) { const t = e + 1, i = this._tangents[e].clone(), r = this._normals[e].clone(), s = this._binormals[e].clone(), a = this._tangents[t].clone(), o = this._normals[t].clone(), l = this._binormals[t].clone(), c = Ce.RotationQuaternionFromAxis(r, s, i), h = Ce.RotationQuaternionFromAxis(o, l, a); @@ -45970,17 +45971,17 @@ var Os = class _Os { const o = [], l = t.subtract(e), c = i.subtract(t), h = e.subtract(i), u = _.Cross(l, c), f = u.length(); if (f < Math.pow(10, -8)) return new _Os(o); - const d = l.lengthSquared(), p = c.lengthSquared(), g = h.lengthSquared(), m = u.lengthSquared(), v = l.length(), E = c.length(), C = h.length(), T = 0.5 * v * E * C / f, R = _.Dot(l, h), x = _.Dot(l, c), S = _.Dot(c, h), M = -0.5 * p * R / m, N = -0.5 * g * x / m, F = -0.5 * d * S / m, L = e.scale(M).add(t.scale(N)).add(i.scale(F)), q = e.subtract(L).normalize(), j = _.Cross(u, q).normalize(); + const d = l.lengthSquared(), p = c.lengthSquared(), g = h.lengthSquared(), m = u.lengthSquared(), v = l.length(), E = c.length(), C = h.length(), T = 0.5 * v * E * C / f, R = _.Dot(l, h), x = _.Dot(l, c), S = _.Dot(c, h), M = -0.5 * p * R / m, N = -0.5 * g * x / m, F = -0.5 * d * S / m, U = e.scale(M).add(t.scale(N)).add(i.scale(F)), q = e.subtract(U).normalize(), Z = _.Cross(u, q).normalize(); if (a) { const k = 2 * Math.PI / r; for (let Q = 0; Q <= 2 * Math.PI; Q += k) - o.push(L.add(q.scale(T * Math.cos(Q)).add(j.scale(T * Math.sin(Q))))); + o.push(U.add(q.scale(T * Math.cos(Q)).add(Z.scale(T * Math.sin(Q))))); o.push(e); } else { const k = 1 / r; let Q = 0, ce = _.Zero(); do - ce = L.add(q.scale(T * Math.cos(Q)).add(j.scale(T * Math.sin(Q)))), o.push(ce), Q += k; + ce = U.add(q.scale(T * Math.cos(Q)).add(Z.scale(T * Math.sin(Q)))), o.push(ce), Q += k; while (!ce.equalsWithEpsilon(i, T * k * 1.1)); o.push(i), s && o.push(e); } @@ -46027,7 +46028,7 @@ var Os = class _Os { return t; } }; -var Pb = class extends me { +var Ob = class extends me { constructor(e, t) { super(e.x, e.y), this.index = t; } @@ -46039,7 +46040,7 @@ var Gh = class { add(e) { const t = []; return e.forEach((i) => { - const r = new Pb(i, this.elements.length); + const r = new Ob(i, this.elements.length); t.push(r), this.elements.push(r); }), t; } @@ -46055,7 +46056,7 @@ var Gh = class { }; } }; -var Ob = class { +var Db = class { _addToepoint(e) { for (const t of e) this._epoints.push(t.x, t.y); @@ -46180,7 +46181,7 @@ function S0(n4, e, t = null, i = earcut) { for (let p = 0; p < r.length; p++) l[p] = new me(r[p].x, r[p].z); l[0].equalsWithEpsilon(l[l.length - 1], 1e-8) && l.pop(); - const u = new Ob(n4, l, t || st.LastCreatedScene, i); + const u = new Db(n4, l, t || st.LastCreatedScene, i); for (let p = 0; p < s.length; p++) { c = []; for (let g = 0; g < s[p].length; g++) @@ -46190,7 +46191,7 @@ function S0(n4, e, t = null, i = earcut) { const f = u.build(false, a, o); return f._originalBuilderSideOrientation = e.sideOrientation, R0(f, e.sideOrientation, e.faceUV, e.faceColors, e.frontUVs, e.backUVs, e.wrap).applyToMesh(f, e.updatable), f; } -function Db(n4, e, t = null, i = earcut) { +function Nb(n4, e, t = null, i = earcut) { return S0(n4, e, t, i); } re.CreatePolygon = R0; @@ -46200,25 +46201,25 @@ B.CreatePolygon = (n4, e, t, i, r, s, a = earcut) => S0(n4, { updatable: r, sideOrientation: s }, t, a); -B.ExtrudePolygon = (n4, e, t, i, r, s, a, o = earcut) => Db(n4, { +B.ExtrudePolygon = (n4, e, t, i, r, s, a, o = earcut) => Nb(n4, { shape: e, holes: r, depth: t, updatable: s, sideOrientation: a }, i, o); -function Nb(n4, e, t = null) { +function Fb(n4, e, t = null) { const i = e.path, r = e.shape, s = e.scale || 1, a = e.rotation || 0, o = e.cap === 0 ? 0 : e.cap || B.NO_CAP, l = e.updatable, c = B._GetDefaultSideOrientation(e.sideOrientation), h = e.instance || null, u = e.invertUV || false, f = e.closeShape || false, d = e.closePath || false; return y0(n4, r, i, s, a, null, null, d, f, o, false, t, !!l, c, h, u, e.frontUVs || null, e.backUVs || null, e.firstNormal || null, !!e.adjustFrame); } -function Fb(n4, e, t = null) { +function Lb(n4, e, t = null) { const i = e.path, r = e.shape, s = e.scaleFunction || (() => 1), a = e.rotationFunction || (() => 0), o = e.closePath || e.ribbonCloseArray || false, l = e.closeShape || e.ribbonClosePath || false, c = e.cap === 0 ? 0 : e.cap || B.NO_CAP, h = e.updatable, u = e.firstNormal || null, f = e.adjustFrame || false, d = B._GetDefaultSideOrientation(e.sideOrientation), p = e.instance, g = e.invertUV || false; return y0(n4, r, i, null, null, s, a, o, l, c, true, t, !!h, d, p || null, g, e.frontUVs || null, e.backUVs || null, u, f); } function y0(n4, e, t, i, r, s, a, o, l, c, h, u, f, d, p, g, m, v, E, C) { - const T = (N, F, L, K, q, j, k, Q, ce, de, Z) => { - const J = L.getTangents(), O = L.getNormals(), G = L.getBinormals(), ee = L.getDistances(); - if (Z) { + const T = (N, F, U, H, q, Z, k, Q, ce, de, j) => { + const J = U.getTangents(), O = U.getNormals(), G = U.getBinormals(), ee = U.getDistances(); + if (j) { for (let ue = 0; ue < J.length; ue++) if (J[ue].x == 0 && J[ue].y == 0 && J[ue].z == 0 && J[ue].copyFrom(J[ue - 1]), O[ue].x == 0 && O[ue].y == 0 && O[ue].z == 0 && O[ue].copyFrom(O[ue - 1]), G[ue].x == 0 && G[ue].y == 0 && G[ue].z == 0 && G[ue].copyFrom(G[ue - 1]), ue > 0) { let Ye = J[ue - 1]; @@ -46226,17 +46227,17 @@ function y0(n4, e, t, i, r, s, a, o, l, c, h, u, f, d, p, g, m, v, E, C) { } } let _e = 0; - const Oe = () => q !== null ? q : 1, fe = de && Q ? Q : () => j !== null ? j : 0, Te = de && k ? k : Oe; + const Oe = () => q !== null ? q : 1, fe = de && Q ? Q : () => Z !== null ? Z : 0, Te = de && k ? k : Oe; let Fe = ce === B.NO_CAP || ce === B.CAP_END ? 0 : 2; const Se = z.Matrix[0]; for (let ue = 0; ue < F.length; ue++) { const Ye = [], lt = fe(ue, ee[ue]), Ut = Te(ue, ee[ue]); - w.RotationAxisToRef(J[ue], _e, Se); + L.RotationAxisToRef(J[ue], _e, Se); for (let Ct = 0; Ct < N.length; Ct++) { const Bi = J[ue].scale(N[Ct].z).add(O[ue].scale(N[Ct].x)).add(G[ue].scale(N[Ct].y)), hi = _.Zero(); _.TransformCoordinatesToRef(Bi, Se, hi), hi.scaleInPlace(Ut).addInPlace(F[ue]), Ye[Ct] = hi; } - K[Fe] = Ye, _e += lt, Fe++; + H[Fe] = Ye, _e += lt, Fe++; } const qe = (ue) => { const Ye = Array(), lt = _.Zero(); @@ -46251,16 +46252,16 @@ function y0(n4, e, t, i, r, s, a, o, l, c, h, u, f, d, p, g, m, v, E, C) { case B.NO_CAP: break; case B.CAP_START: - K[0] = qe(K[2]), K[1] = K[2]; + H[0] = qe(H[2]), H[1] = H[2]; break; case B.CAP_END: - K[Fe] = K[Fe - 1], K[Fe + 1] = qe(K[Fe - 1]); + H[Fe] = H[Fe - 1], H[Fe + 1] = qe(H[Fe - 1]); break; case B.CAP_ALL: - K[0] = qe(K[2]), K[1] = K[2], K[Fe] = K[Fe - 1], K[Fe + 1] = qe(K[Fe - 1]); + H[0] = qe(H[2]), H[1] = H[2], H[Fe] = H[Fe - 1], H[Fe + 1] = qe(H[Fe - 1]); break; } - return K; + return H; }; let R, x; if (p) { @@ -46293,7 +46294,7 @@ B.ExtrudeShape = (n4, e, t, i, r, s, a = null, o, l, c) => { instance: c, updatable: o }; - return Nb(n4, h, a); + return Fb(n4, h, a); }; B.ExtrudeShapeCustom = (n4, e, t, i, r, s, a, o, l, c, h, u) => { const f = { @@ -46308,9 +46309,9 @@ B.ExtrudeShapeCustom = (n4, e, t, i, r, s, a, o, l, c, h, u) => { instance: u, updatable: c }; - return Fb(n4, f, l); + return Lb(n4, f, l); }; -function Lb(n4, e, t = null) { +function wb(n4, e, t = null) { const i = e.arc ? e.arc <= 0 || e.arc > 1 ? 1 : e.arc : 1, r = e.closed === void 0 ? true : e.closed, s = e.shape, a = e.radius || 1, o = e.tessellation || 64, l = e.clip || 0, c = e.updatable, h = B._GetDefaultSideOrientation(e.sideOrientation), u = e.cap || B.NO_CAP, f = Math.PI * 2, d = [], p = e.invertUV || false; let g = 0, m = 0; const v = f / o * i; @@ -46322,32 +46323,32 @@ function Lb(n4, e, t = null) { } return Oa(n4, { pathArray: d, closeArray: r, sideOrientation: h, updatable: c, invertUV: p, frontUVs: e.frontUVs, backUVs: e.backUVs }, t); } -B.CreateLathe = (n4, e, t, i, r, s, a) => Lb(n4, { +B.CreateLathe = (n4, e, t, i, r, s, a) => wb(n4, { shape: e, radius: t, tessellation: i, sideOrientation: a, updatable: s }, r); -function Tf(n4) { +function xf(n4) { const e = [], t = [], i = [], r = [], s = n4.width || n4.size || 1, a = n4.height || n4.size || 1, o = n4.sideOrientation === 0 ? 0 : n4.sideOrientation || re.DEFAULTSIDE, l = s / 2, c = a / 2; t.push(-l, -c, 0), i.push(0, 0, -1), r.push(0, nt.UseOpenGLOrientationForUV ? 1 : 0), t.push(l, -c, 0), i.push(0, 0, -1), r.push(1, nt.UseOpenGLOrientationForUV ? 1 : 0), t.push(l, c, 0), i.push(0, 0, -1), r.push(1, nt.UseOpenGLOrientationForUV ? 0 : 1), t.push(-l, c, 0), i.push(0, 0, -1), r.push(0, nt.UseOpenGLOrientationForUV ? 0 : 1), e.push(0), e.push(1), e.push(2), e.push(0), e.push(2), e.push(3), re._ComputeSides(o, t, e, i, r, n4.frontUVs, n4.backUVs); const h = new re(); return h.indices = e, h.positions = t, h.normals = i, h.uvs = r, h; } -function wb(n4, e = {}, t = null) { +function Ub(n4, e = {}, t = null) { const i = new B(n4, t); - return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, Tf(e).applyToMesh(i, e.updatable), e.sourcePlane && (i.translate(e.sourcePlane.normal, -e.sourcePlane.d), i.setDirection(e.sourcePlane.normal.scale(-1))), i; + return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, xf(e).applyToMesh(i, e.updatable), e.sourcePlane && (i.translate(e.sourcePlane.normal, -e.sourcePlane.d), i.setDirection(e.sourcePlane.normal.scale(-1))), i; } -re.CreatePlane = Tf; -B.CreatePlane = (n4, e, t, i, r) => wb(n4, { +re.CreatePlane = xf; +B.CreatePlane = (n4, e, t, i, r) => Ub(n4, { size: e, width: e, height: e, sideOrientation: r, updatable: i }, t); -function Ub(n4, e, t = null) { +function Vb(n4, e, t = null) { const i = e.path; let r = e.instance, s = 1; e.radius !== void 0 ? s = e.radius : r && (s = r._creationDataStorage.radius); @@ -46356,14 +46357,14 @@ function Ub(n4, e, t = null) { const c = e.invertUV || false, h = e.updatable, u = B._GetDefaultSideOrientation(e.sideOrientation); e.arc = e.arc && (e.arc <= 0 || e.arc > 1) ? 1 : e.arc || 1; const f = (v, E, C, T, R, x, S, M) => { - const N = E.getTangents(), F = E.getNormals(), L = E.getDistances(), q = Math.PI * 2 / R * M, k = x || (() => T); - let Q, ce, de, Z; + const N = E.getTangents(), F = E.getNormals(), U = E.getDistances(), q = Math.PI * 2 / R * M, k = x || (() => T); + let Q, ce, de, j; const J = z.Matrix[0]; let O = S === B.NO_CAP || S === B.CAP_END ? 0 : 2; for (let ee = 0; ee < v.length; ee++) { - ce = k(ee, L[ee]), Q = Array(), de = F[ee]; + ce = k(ee, U[ee]), Q = Array(), de = F[ee]; for (let _e = 0; _e < R; _e++) - w.RotationAxisToRef(N[ee], q * _e, J), Z = Q[_e] ? Q[_e] : _.Zero(), _.TransformCoordinatesToRef(de, J, Z), Z.scaleInPlace(ce).addInPlace(v[ee]), Q[_e] = Z; + L.RotationAxisToRef(N[ee], q * _e, J), j = Q[_e] ? Q[_e] : _.Zero(), _.TransformCoordinatesToRef(de, J, j), j.scaleInPlace(ce).addInPlace(v[ee]), Q[_e] = j; C[O] = Q, O++; } const G = (ee, _e) => { @@ -46407,7 +46408,7 @@ function Ub(n4, e, t = null) { }, t); return m._creationDataStorage.pathArray = p, m._creationDataStorage.path3D = d, m._creationDataStorage.tessellation = a, m._creationDataStorage.cap = l, m._creationDataStorage.arc = e.arc, m._creationDataStorage.radius = s, m; } -B.CreateTube = (n4, e, t, i, r, s, a, o, l, c) => Ub(n4, { +B.CreateTube = (n4, e, t, i, r, s, a, o, l, c) => Vb(n4, { path: e, radius: t, tessellation: i, @@ -46829,18 +46830,18 @@ function I0(n4) { const t = n4.type && (n4.type < 0 || n4.type >= e.length) ? 0 : n4.type || 0, i = n4.size, r = n4.sizeX || i || 1, s = n4.sizeY || i || 1, a = n4.sizeZ || i || 1, o = n4.custom || e[t], l = o.face.length, c = n4.faceUV || new Array(l), h = n4.faceColors, u = n4.flat === void 0 ? true : n4.flat, f = n4.sideOrientation === 0 ? 0 : n4.sideOrientation || re.DEFAULTSIDE, d = [], p = [], g = [], m = [], v = []; let E = 0, C = 0; const T = []; - let R = 0, x = 0, S, M, N, F, L, K; + let R = 0, x = 0, S, M, N, F, U, H; if (u) for (x = 0; x < l; x++) h && h[x] === void 0 && (h[x] = new et(1, 1, 1, 1)), c && c[x] === void 0 && (c[x] = new Ke(0, 0, 1, 1)); if (u) for (x = 0; x < l; x++) { - const j = o.face[x].length; - for (N = 2 * Math.PI / j, F = 0.5 * Math.tan(N / 2), L = 0.5, R = 0; R < j; R++) - d.push(o.vertex[o.face[x][R]][0] * r, o.vertex[o.face[x][R]][1] * s, o.vertex[o.face[x][R]][2] * a), T.push(E), E++, S = c[x].x + (c[x].z - c[x].x) * (0.5 + F), M = c[x].y + (c[x].w - c[x].y) * (L - 0.5), m.push(S, nt.UseOpenGLOrientationForUV ? 1 - M : M), K = F * Math.cos(N) - L * Math.sin(N), L = F * Math.sin(N) + L * Math.cos(N), F = K, h && v.push(h[x].r, h[x].g, h[x].b, h[x].a); - for (R = 0; R < j - 2; R++) + const Z = o.face[x].length; + for (N = 2 * Math.PI / Z, F = 0.5 * Math.tan(N / 2), U = 0.5, R = 0; R < Z; R++) + d.push(o.vertex[o.face[x][R]][0] * r, o.vertex[o.face[x][R]][1] * s, o.vertex[o.face[x][R]][2] * a), T.push(E), E++, S = c[x].x + (c[x].z - c[x].x) * (0.5 + F), M = c[x].y + (c[x].w - c[x].y) * (U - 0.5), m.push(S, nt.UseOpenGLOrientationForUV ? 1 - M : M), H = F * Math.cos(N) - U * Math.sin(N), U = F * Math.sin(N) + U * Math.cos(N), F = H, h && v.push(h[x].r, h[x].g, h[x].b, h[x].a); + for (R = 0; R < Z - 2; R++) p.push(T[0 + C], T[R + 2 + C], T[R + 1 + C]); - C += j; + C += Z; } else { for (R = 0; R < o.vertex.length; R++) @@ -46853,13 +46854,13 @@ function I0(n4) { const q = new re(); return q.positions = d, q.indices = p, q.normals = g, q.uvs = m, h && u && (q.colors = v), q; } -function Vb(n4, e = {}, t = null) { +function Bb(n4, e = {}, t = null) { const i = new B(n4, t); return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, I0(e).applyToMesh(i, e.updatable), i; } re.CreatePolyhedron = I0; -B.CreatePolyhedron = (n4, e, t) => Vb(n4, e, t); -function xf(n4) { +B.CreatePolyhedron = (n4, e, t) => Bb(n4, e, t); +function Cf(n4) { const e = n4.sideOrientation || re.DEFAULTSIDE, t = n4.radius || 1, i = n4.flat === void 0 ? true : n4.flat, r = (n4.subdivisions || 4) | 0, s = n4.radiusX || t, a = n4.radiusY || t, o = n4.radiusZ || t, l = (1 + Math.sqrt(5)) / 2, c = [ -1, l, @@ -47062,16 +47063,16 @@ function xf(n4) { ], T = [], R = [], x = [], S = []; let M = 0; const N = new Array(3), F = new Array(3); - let L; - for (L = 0; L < 3; L++) - N[L] = _.Zero(), F[L] = me.Zero(); + let U; + for (U = 0; U < 3; U++) + N[U] = _.Zero(), F[U] = me.Zero(); for (let q = 0; q < 20; q++) { - for (L = 0; L < 3; L++) { - const k = h[3 * q + L]; - N[L].copyFromFloats(c[3 * u[k]], c[3 * u[k] + 1], c[3 * u[k] + 2]), N[L].normalize(), F[L].copyFromFloats(f[2 * k] * d + g + C[q] * v, f[2 * k + 1] * p + m + C[q] * E); + for (U = 0; U < 3; U++) { + const k = h[3 * q + U]; + N[U].copyFromFloats(c[3 * u[k]], c[3 * u[k] + 1], c[3 * u[k] + 2]), N[U].normalize(), F[U].copyFromFloats(f[2 * k] * d + g + C[q] * v, f[2 * k + 1] * p + m + C[q] * E); } - const j = (k, Q, ce, de) => { - const Z = _.Lerp(N[0], N[2], Q / r), J = _.Lerp(N[1], N[2], Q / r), O = r === Q ? N[2] : _.Lerp(Z, J, k / (r - Q)); + const Z = (k, Q, ce, de) => { + const j = _.Lerp(N[0], N[2], Q / r), J = _.Lerp(N[1], N[2], Q / r), O = r === Q ? N[2] : _.Lerp(j, J, k / (r - Q)); O.normalize(); let G; if (i) { @@ -47085,24 +47086,24 @@ function xf(n4) { }; for (let k = 0; k < r; k++) for (let Q = 0; Q + k < r; Q++) - j(Q, k, Q + 1 / 3, k + 1 / 3), j(Q + 1, k, Q + 1 / 3, k + 1 / 3), j(Q, k + 1, Q + 1 / 3, k + 1 / 3), Q + k + 1 < r && (j(Q + 1, k, Q + 2 / 3, k + 2 / 3), j(Q + 1, k + 1, Q + 2 / 3, k + 2 / 3), j(Q, k + 1, Q + 2 / 3, k + 2 / 3)); + Z(Q, k, Q + 1 / 3, k + 1 / 3), Z(Q + 1, k, Q + 1 / 3, k + 1 / 3), Z(Q, k + 1, Q + 1 / 3, k + 1 / 3), Q + k + 1 < r && (Z(Q + 1, k, Q + 2 / 3, k + 2 / 3), Z(Q + 1, k + 1, Q + 2 / 3, k + 2 / 3), Z(Q, k + 1, Q + 2 / 3, k + 2 / 3)); } re._ComputeSides(e, R, T, x, S, n4.frontUVs, n4.backUVs); - const K = new re(); - return K.indices = T, K.positions = R, K.normals = x, K.uvs = S, K; + const H = new re(); + return H.indices = T, H.positions = R, H.normals = x, H.uvs = S, H; } -function Bb(n4, e = {}, t = null) { +function kb(n4, e = {}, t = null) { const i = new B(n4, t); - return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, xf(e).applyToMesh(i, e.updatable), i; -} -re.CreateIcoSphere = xf; -B.CreateIcoSphere = (n4, e, t) => Bb(n4, e, t); -var kb = new _(1, 0, 0); -var zb = new _(-1, 0, 0); -var Wb = new _(0, 1, 0); -var Gb = new _(0, -1, 0); -var Xb = new _(0, 0, 1); -var Hb = new _(0, 0, -1); + return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, Cf(e).applyToMesh(i, e.updatable), i; +} +re.CreateIcoSphere = Cf; +B.CreateIcoSphere = (n4, e, t) => kb(n4, e, t); +var zb = new _(1, 0, 0); +var Wb = new _(-1, 0, 0); +var Gb = new _(0, 1, 0); +var Xb = new _(0, -1, 0); +var Hb = new _(0, 0, 1); +var Kb = new _(0, 0, -1); var nc = class _nc { constructor(e = _.Zero(), t = _.Up(), i = me.Zero(), r = 0, s = 0, a = null, o = null, l = null, c = null) { this.position = e, this.normal = t, this.uv = i, this.vertexIdx = r, this.vertexIdxForBones = s, this.localPositionOverride = a, this.localNormalOverride = o, this.matrixIndicesOverride = l, this.matrixWeightsOverride = c; @@ -47112,8 +47113,8 @@ var nc = class _nc { return new _nc(this.position.clone(), this.normal.clone(), this.uv.clone(), this.vertexIdx, this.vertexIdxForBones, (e = this.localPositionOverride) == null ? void 0 : e.slice(), (t = this.localNormalOverride) == null ? void 0 : t.slice(), (i = this.matrixIndicesOverride) == null ? void 0 : i.slice(), (r = this.matrixWeightsOverride) == null ? void 0 : r.slice()); } }; -function Kb(n4, e, t) { - var ce, de, Z, J; +function qb(n4, e, t) { + var ce, de, j, J; const i = !!e.skeleton, r = t.localMode || i, s = e.overrideMaterialSideOrientation !== null && e.overrideMaterialSideOrientation !== void 0, a = e.getIndices(), o = i ? e.getPositionData(true, true) : e.getVerticesData(I.PositionKind), l = i ? e.getNormalsData(true, true) : e.getVerticesData(I.NormalKind), c = r ? i ? e.getVerticesData(I.PositionKind) : o : null, h = r ? i ? e.getVerticesData(I.NormalKind) : l : null, u = e.getVerticesData(I.UVKind), f = i ? e.getVerticesData(I.MatricesIndicesKind) : null, d = i ? e.getVerticesData(I.MatricesWeightsKind) : null, p = i ? e.getVerticesData(I.MatricesIndicesExtraKind) : null, g = i ? e.getVerticesData(I.MatricesWeightsExtraKind) : null, m = t.position || _.Zero(); let v = t.normal || _.Up(); const E = t.size || _.One(), C = t.angle || 0; @@ -47134,7 +47135,7 @@ function Kb(n4, e, t) { ee.uv = new me(u[_e * 2], nt.UseOpenGLOrientationForUV ? 1 - Oe : Oe); } return ee; - }, F = [0, 0, 0, 0], L = (O, G) => { + }, F = [0, 0, 0, 0], U = (O, G) => { if (O.length === 0) return O; const ee = 0.5 * Math.abs(_.Dot(E, G)), _e = (fe, Te, Fe, Se) => { @@ -47146,22 +47147,22 @@ function Kb(n4, e, t) { const Fe = _.GetClipFactor(fe.position, Te.position, G, ee); let Se = F, qe = F; if (f && d) { - const yr = fe.matrixIndicesOverride ? 0 : fe.vertexIdxForBones, Vr = fe.matrixIndicesOverride ?? f, pn = fe.matrixWeightsOverride ?? d, Mi = Te.matrixIndicesOverride ? 0 : Te.vertexIdxForBones, sl = Te.matrixIndicesOverride ?? f, Ya = Te.matrixWeightsOverride ?? d; + const yr = fe.matrixIndicesOverride ? 0 : fe.vertexIdxForBones, Br = fe.matrixIndicesOverride ?? f, gn = fe.matrixWeightsOverride ?? d, Mi = Te.matrixIndicesOverride ? 0 : Te.vertexIdxForBones, sl = Te.matrixIndicesOverride ?? f, Ya = Te.matrixWeightsOverride ?? d; Se = [0, 0, 0, 0], qe = [0, 0, 0, 0]; let ts = 0; for (let _r = 0; _r < 4; ++_r) - if (pn[yr + _r] > 0) { - const Gs = _e(sl, Vr[yr + _r], Mi, 4); - Se[ts] = Vr[yr + _r], qe[ts] = je.Lerp(pn[yr + _r], Gs >= 0 ? Ya[Gs] : 0, Fe), ts++; + if (gn[yr + _r] > 0) { + const Gs = _e(sl, Br[yr + _r], Mi, 4); + Se[ts] = Br[yr + _r], qe[ts] = je.Lerp(gn[yr + _r], Gs >= 0 ? Ya[Gs] : 0, Fe), ts++; } for (let _r = 0; _r < 4 && ts < 4; ++_r) { const Gs = sl[Mi + _r]; - _e(Vr, Gs, yr, 4) === -1 && (Se[ts] = Gs, qe[ts] = je.Lerp(0, Ya[Mi + _r], Fe), ts++); + _e(Br, Gs, yr, 4) === -1 && (Se[ts] = Gs, qe[ts] = je.Lerp(0, Ya[Mi + _r], Fe), ts++); } const kn = qe[0] + qe[1] + qe[2] + qe[3]; qe[0] /= kn, qe[1] /= kn, qe[2] /= kn, qe[3] /= kn; } - const ue = fe.localPositionOverride ? fe.localPositionOverride[0] : (c == null ? void 0 : c[fe.vertexIdx]) ?? 0, Ye = fe.localPositionOverride ? fe.localPositionOverride[1] : (c == null ? void 0 : c[fe.vertexIdx + 1]) ?? 0, lt = fe.localPositionOverride ? fe.localPositionOverride[2] : (c == null ? void 0 : c[fe.vertexIdx + 2]) ?? 0, Ut = Te.localPositionOverride ? Te.localPositionOverride[0] : (c == null ? void 0 : c[Te.vertexIdx]) ?? 0, Ct = Te.localPositionOverride ? Te.localPositionOverride[1] : (c == null ? void 0 : c[Te.vertexIdx + 1]) ?? 0, Bi = Te.localPositionOverride ? Te.localPositionOverride[2] : (c == null ? void 0 : c[Te.vertexIdx + 2]) ?? 0, hi = fe.localNormalOverride ? fe.localNormalOverride[0] : (h == null ? void 0 : h[fe.vertexIdx]) ?? 0, Es = fe.localNormalOverride ? fe.localNormalOverride[1] : (h == null ? void 0 : h[fe.vertexIdx + 1]) ?? 0, Ur = fe.localNormalOverride ? fe.localNormalOverride[2] : (h == null ? void 0 : h[fe.vertexIdx + 2]) ?? 0, vs = Te.localNormalOverride ? Te.localNormalOverride[0] : (h == null ? void 0 : h[Te.vertexIdx]) ?? 0, ki = Te.localNormalOverride ? Te.localNormalOverride[1] : (h == null ? void 0 : h[Te.vertexIdx + 1]) ?? 0, lr = Te.localNormalOverride ? Te.localNormalOverride[2] : (h == null ? void 0 : h[Te.vertexIdx + 2]) ?? 0, Rr = hi + (vs - hi) * Fe, Sr = Es + (ki - Es) * Fe, Ts = Ur + (lr - Ur) * Fe, xs = Math.sqrt(Rr * Rr + Sr * Sr + Ts * Ts); + const ue = fe.localPositionOverride ? fe.localPositionOverride[0] : (c == null ? void 0 : c[fe.vertexIdx]) ?? 0, Ye = fe.localPositionOverride ? fe.localPositionOverride[1] : (c == null ? void 0 : c[fe.vertexIdx + 1]) ?? 0, lt = fe.localPositionOverride ? fe.localPositionOverride[2] : (c == null ? void 0 : c[fe.vertexIdx + 2]) ?? 0, Ut = Te.localPositionOverride ? Te.localPositionOverride[0] : (c == null ? void 0 : c[Te.vertexIdx]) ?? 0, Ct = Te.localPositionOverride ? Te.localPositionOverride[1] : (c == null ? void 0 : c[Te.vertexIdx + 1]) ?? 0, Bi = Te.localPositionOverride ? Te.localPositionOverride[2] : (c == null ? void 0 : c[Te.vertexIdx + 2]) ?? 0, hi = fe.localNormalOverride ? fe.localNormalOverride[0] : (h == null ? void 0 : h[fe.vertexIdx]) ?? 0, Es = fe.localNormalOverride ? fe.localNormalOverride[1] : (h == null ? void 0 : h[fe.vertexIdx + 1]) ?? 0, Vr = fe.localNormalOverride ? fe.localNormalOverride[2] : (h == null ? void 0 : h[fe.vertexIdx + 2]) ?? 0, vs = Te.localNormalOverride ? Te.localNormalOverride[0] : (h == null ? void 0 : h[Te.vertexIdx]) ?? 0, ki = Te.localNormalOverride ? Te.localNormalOverride[1] : (h == null ? void 0 : h[Te.vertexIdx + 1]) ?? 0, cr = Te.localNormalOverride ? Te.localNormalOverride[2] : (h == null ? void 0 : h[Te.vertexIdx + 2]) ?? 0, Rr = hi + (vs - hi) * Fe, Sr = Es + (ki - Es) * Fe, Ts = Vr + (cr - Vr) * Fe, xs = Math.sqrt(Rr * Rr + Sr * Sr + Ts * Ts); return new nc(_.Lerp(fe.position, Te.position, Fe), _.Lerp(fe.normal, Te.normal, Fe).normalize(), me.Lerp(fe.uv, Te.uv, Fe), -1, -1, c ? [ ue + (Ut - ue) * Fe, Ye + (Ct - Ye) * Fe, @@ -47190,17 +47191,17 @@ function Kb(n4, e, t) { } } return ze; - }, K = e instanceof B ? e : null, q = K == null ? void 0 : K._thinInstanceDataStorage.matrixData, j = (K == null ? void 0 : K.thinInstanceCount) || 1, k = z.Matrix[0]; - k.copyFrom(w.IdentityReadOnly); - for (let O = 0; O < j; ++O) { - if (K != null && K.hasThinInstances && q) { + }, H = e instanceof B ? e : null, q = H == null ? void 0 : H._thinInstanceDataStorage.matrixData, Z = (H == null ? void 0 : H.thinInstanceCount) || 1, k = z.Matrix[0]; + k.copyFrom(L.IdentityReadOnly); + for (let O = 0; O < Z; ++O) { + if (H != null && H.hasThinInstances && q) { const fe = O * 16; k.setRowFromFloats(0, q[fe + 0], q[fe + 1], q[fe + 2], q[fe + 3]), k.setRowFromFloats(1, q[fe + 4], q[fe + 5], q[fe + 6], q[fe + 7]), k.setRowFromFloats(2, q[fe + 8], q[fe + 9], q[fe + 10], q[fe + 11]), k.setRowFromFloats(3, q[fe + 12], q[fe + 13], q[fe + 14], q[fe + 15]); } - const G = w.RotationYawPitchRoll(T, x, C).multiply(w.Translation(m.x, m.y, m.z)), ee = w.Invert(G), _e = e.getWorldMatrix(), Oe = k.multiply(_e).multiply(ee), ze = new Array(3); + const G = L.RotationYawPitchRoll(T, x, C).multiply(L.Translation(m.x, m.y, m.z)), ee = L.Invert(G), _e = e.getWorldMatrix(), Oe = k.multiply(_e).multiply(ee), ze = new Array(3); for (let fe = 0; fe < a.length; fe += 3) { let Te = ze; - if (Te[0] = N(fe, Oe), s && r ? (Te[1] = N(fe + 2, Oe), Te[2] = N(fe + 1, Oe)) : (Te[1] = N(fe + 1, Oe), Te[2] = N(fe + 2, Oe)), !(t.cullBackFaces && -Te[0].normal.z <= 0 && -Te[1].normal.z <= 0 && -Te[2].normal.z <= 0) && (Te = L(Te, kb), !!Te && (Te = L(Te, zb), !!Te && (Te = L(Te, Wb), !!Te && (Te = L(Te, Gb), !!Te && (Te = L(Te, Xb), !!Te && (Te = L(Te, Hb), !!Te))))))) + if (Te[0] = N(fe, Oe), s && r ? (Te[1] = N(fe + 2, Oe), Te[2] = N(fe + 1, Oe)) : (Te[1] = N(fe + 1, Oe), Te[2] = N(fe + 2, Oe)), !(t.cullBackFaces && -Te[0].normal.z <= 0 && -Te[1].normal.z <= 0 && -Te[2].normal.z <= 0) && (Te = U(Te, zb), !!Te && (Te = U(Te, Wb), !!Te && (Te = U(Te, Gb), !!Te && (Te = U(Te, Xb), !!Te && (Te = U(Te, Hb), !!Te && (Te = U(Te, Kb), !!Te))))))) for (let Fe = 0; Fe < Te.length; Fe++) { const Se = Te[Fe]; if (S.indices.push(M), r ? (Se.localPositionOverride ? (S.positions[M * 3] = Se.localPositionOverride[0], S.positions[M * 3 + 1] = Se.localPositionOverride[1], S.positions[M * 3 + 2] = Se.localPositionOverride[2]) : c && (S.positions[M * 3] = c[Se.vertexIdx], S.positions[M * 3 + 1] = c[Se.vertexIdx + 1], S.positions[M * 3 + 2] = c[Se.vertexIdx + 2]), Se.localNormalOverride ? (S.normals[M * 3] = Se.localNormalOverride[0], S.normals[M * 3 + 1] = Se.localNormalOverride[1], S.normals[M * 3 + 2] = Se.localNormalOverride[2]) : h && (S.normals[M * 3] = h[Se.vertexIdx], S.normals[M * 3 + 1] = h[Se.vertexIdx + 1], S.normals[M * 3 + 2] = h[Se.vertexIdx + 2])) : (Se.position.toArray(S.positions, M * 3), Se.normal.toArray(S.normals, M * 3)), S.matricesIndices && S.matricesWeights && (Se.matrixIndicesOverride ? (S.matricesIndices[M * 4] = Se.matrixIndicesOverride[0], S.matricesIndices[M * 4 + 1] = Se.matrixIndicesOverride[1], S.matricesIndices[M * 4 + 2] = Se.matrixIndicesOverride[2], S.matricesIndices[M * 4 + 3] = Se.matrixIndicesOverride[3]) : (f && (S.matricesIndices[M * 4] = f[Se.vertexIdxForBones], S.matricesIndices[M * 4 + 1] = f[Se.vertexIdxForBones + 1], S.matricesIndices[M * 4 + 2] = f[Se.vertexIdxForBones + 2], S.matricesIndices[M * 4 + 3] = f[Se.vertexIdxForBones + 3]), p && S.matricesIndicesExtra && (S.matricesIndicesExtra[M * 4] = p[Se.vertexIdxForBones], S.matricesIndicesExtra[M * 4 + 1] = p[Se.vertexIdxForBones + 1], S.matricesIndicesExtra[M * 4 + 2] = p[Se.vertexIdxForBones + 2], S.matricesIndicesExtra[M * 4 + 3] = p[Se.vertexIdxForBones + 3])), Se.matrixWeightsOverride ? (S.matricesWeights[M * 4] = Se.matrixWeightsOverride[0], S.matricesWeights[M * 4 + 1] = Se.matrixWeightsOverride[1], S.matricesWeights[M * 4 + 2] = Se.matrixWeightsOverride[2], S.matricesWeights[M * 4 + 3] = Se.matrixWeightsOverride[3]) : (d && (S.matricesWeights[M * 4] = d[Se.vertexIdxForBones], S.matricesWeights[M * 4 + 1] = d[Se.vertexIdxForBones + 1], S.matricesWeights[M * 4 + 2] = d[Se.vertexIdxForBones + 2], S.matricesWeights[M * 4 + 3] = d[Se.vertexIdxForBones + 3]), g && S.matricesWeightsExtra && (S.matricesWeightsExtra[M * 4] = g[Se.vertexIdxForBones], S.matricesWeightsExtra[M * 4 + 1] = g[Se.vertexIdxForBones + 1], S.matricesWeightsExtra[M * 4 + 2] = g[Se.vertexIdxForBones + 2], S.matricesWeightsExtra[M * 4 + 3] = g[Se.vertexIdxForBones + 3]))), t.captureUVS) @@ -47214,17 +47215,17 @@ function Kb(n4, e, t) { } } } - S.indices.length === 0 && (S.indices = null), S.positions.length === 0 && (S.positions = null), S.normals.length === 0 && (S.normals = null), S.uvs.length === 0 && (S.uvs = null), ((ce = S.matricesIndices) == null ? void 0 : ce.length) === 0 && (S.matricesIndices = null), ((de = S.matricesWeights) == null ? void 0 : de.length) === 0 && (S.matricesWeights = null), ((Z = S.matricesIndicesExtra) == null ? void 0 : Z.length) === 0 && (S.matricesIndicesExtra = null), ((J = S.matricesWeightsExtra) == null ? void 0 : J.length) === 0 && (S.matricesWeightsExtra = null); + S.indices.length === 0 && (S.indices = null), S.positions.length === 0 && (S.positions = null), S.normals.length === 0 && (S.normals = null), S.uvs.length === 0 && (S.uvs = null), ((ce = S.matricesIndices) == null ? void 0 : ce.length) === 0 && (S.matricesIndices = null), ((de = S.matricesWeights) == null ? void 0 : de.length) === 0 && (S.matricesWeights = null), ((j = S.matricesIndicesExtra) == null ? void 0 : j.length) === 0 && (S.matricesIndicesExtra = null), ((J = S.matricesWeightsExtra) == null ? void 0 : J.length) === 0 && (S.matricesWeightsExtra = null); const Q = new B(n4, e.getScene()); return S.applyToMesh(Q), r ? (Q.skeleton = e.skeleton, Q.parent = e) : (Q.position = m.clone(), Q.rotation = new _(x, T, C)), Q.computeWorldMatrix(true), Q.refreshBoundingInfo(true, true), Q; } -B.CreateDecal = (n4, e, t, i, r, s) => Kb(n4, e, { +B.CreateDecal = (n4, e, t, i, r, s) => qb(n4, e, { position: t, normal: i, size: r, angle: s }); -function Cf(n4 = { +function Rf(n4 = { subdivisions: 2, tessellation: 16, height: 1, @@ -47237,7 +47238,7 @@ function Cf(n4 = { let T = 0; const R = [], x = h * 0.5, S = Math.PI * 0.5; let M, N; - const F = _.Zero(), L = _.Zero(), K = Math.cos(g), q = Math.sin(g), j = new me(l * q, x + l * K).subtract(new me(c * q, -x + c * K)).length(), k = l * g + j + c * (S - g); + const F = _.Zero(), U = _.Zero(), H = Math.cos(g), q = Math.sin(g), Z = new me(l * q, x + l * H).subtract(new me(c * q, -x + c * H)).length(), k = l * g + Z + c * (S - g); let Q = 0; for (N = 0; N <= d; N++) { const J = [], O = S - g * (N / d); @@ -47245,18 +47246,18 @@ function Cf(n4 = { const G = Math.cos(O), ee = Math.sin(O), _e = G * l; for (M = 0; M <= a; M++) { const Oe = M / a, ze = Oe * f + u, fe = Math.sin(ze), Te = Math.cos(ze); - L.x = _e * fe, L.y = x + ee * l, L.z = _e * Te, v.push(L.x, L.y, L.z), F.set(G * fe, ee, G * Te), E.push(F.x, F.y, F.z), C.push(Oe, nt.UseOpenGLOrientationForUV ? Q / k : 1 - Q / k), J.push(T), T++; + U.x = _e * fe, U.y = x + ee * l, U.z = _e * Te, v.push(U.x, U.y, U.z), F.set(G * fe, ee, G * Te), E.push(F.x, F.y, F.z), C.push(Oe, nt.UseOpenGLOrientationForUV ? Q / k : 1 - Q / k), J.push(T), T++; } R.push(J); } - const ce = i - l - c + K * l - K * c, de = q * (c - l) / ce; + const ce = i - l - c + H * l - H * c, de = q * (c - l) / ce; for (N = 1; N <= o; N++) { const J = []; - Q += j / o; + Q += Z / o; const O = q * (N * (c - l) / o + l); for (M = 0; M <= a; M++) { const G = M / a, ee = G * f + u, _e = Math.sin(ee), Oe = Math.cos(ee); - L.x = O * _e, L.y = x + K * l - N * ce / o, L.z = O * Oe, v.push(L.x, L.y, L.z), F.set(_e, de, Oe).normalize(), E.push(F.x, F.y, F.z), C.push(G, nt.UseOpenGLOrientationForUV ? Q / k : 1 - Q / k), J.push(T), T++; + U.x = O * _e, U.y = x + H * l - N * ce / o, U.z = O * Oe, v.push(U.x, U.y, U.z), F.set(_e, de, Oe).normalize(), E.push(F.x, F.y, F.z), C.push(G, nt.UseOpenGLOrientationForUV ? Q / k : 1 - Q / k), J.push(T), T++; } R.push(J); } @@ -47266,7 +47267,7 @@ function Cf(n4 = { const G = Math.cos(O), ee = Math.sin(O), _e = G * c; for (M = 0; M <= a; M++) { const Oe = M / a, ze = Oe * f + u, fe = Math.sin(ze), Te = Math.cos(ze); - L.x = _e * fe, L.y = -x + ee * c, L.z = _e * Te, v.push(L.x, L.y, L.z), F.set(G * fe, ee, G * Te), E.push(F.x, F.y, F.z), C.push(Oe, nt.UseOpenGLOrientationForUV ? Q / k : 1 - Q / k), J.push(T), T++; + U.x = _e * fe, U.y = -x + ee * c, U.z = _e * Te, v.push(U.x, U.y, U.z), F.set(G * fe, ee, G * Te), E.push(F.x, F.y, F.z), C.push(Oe, nt.UseOpenGLOrientationForUV ? Q / k : 1 - Q / k), J.push(T), T++; } R.push(J); } @@ -47276,16 +47277,16 @@ function Cf(n4 = { m.push(J), m.push(O), m.push(ee), m.push(O), m.push(G), m.push(ee); } if (m = m.reverse(), n4.orientation && !n4.orientation.equals(_.Up())) { - const J = new w(); + const J = new L(); n4.orientation.clone().scale(Math.PI * 0.5).cross(_.Up()).toQuaternion().toRotationMatrix(J); const O = _.Zero(); for (let G = 0; G < v.length; G += 3) O.set(v[G], v[G + 1], v[G + 2]), _.TransformCoordinatesToRef(O.clone(), J, O), v[G] = O.x, v[G + 1] = O.y, v[G + 2] = O.z; } - const Z = new re(); - return Z.positions = v, Z.normals = E, Z.uvs = C, Z.indices = m, Z; + const j = new re(); + return j.positions = v, j.normals = E, j.uvs = C, j.indices = m, j; } -function qb(n4, e = { +function Yb(n4, e = { orientation: _.Up(), subdivisions: 2, tessellation: 16, @@ -47295,11 +47296,11 @@ function qb(n4, e = { updatable: false }, t = null) { const i = new B(n4, t); - return Cf(e).applyToMesh(i, e.updatable), i; + return Rf(e).applyToMesh(i, e.updatable), i; } -B.CreateCapsule = (n4, e, t) => qb(n4, e, t); -re.CreateCapsule = Cf; -var Yb = class { +B.CreateCapsule = (n4, e, t) => Yb(n4, e, t); +re.CreateCapsule = Rf; +var Zb = class { /** Create the ShapePath used to support glyphs * @param resolution defines the resolution used to determine the number of points per curve (default is 4) */ @@ -47360,11 +47361,11 @@ var Yb = class { return this._holes; } }; -function Zb(n4, e, t, i, r, s) { +function jb(n4, e, t, i, r, s) { const a = s.glyphs[n4] || s.glyphs["?"]; if (!a) return null; - const o = new Yb(r); + const o = new Zb(r); if (a.o) { const l = a.o.split(" "); for (let c = 0, h = l.length; c < h; ) @@ -47393,7 +47394,7 @@ function Zb(n4, e, t, i, r, s) { } return o.extractHoles(), { offsetX: a.ha * e, shapePath: o }; } -function jb(n4, e, t, i) { +function Qb(n4, e, t, i) { const r = Array.from(n4), s = e / i.resolution, a = (i.boundingBox.yMax - i.boundingBox.yMin + i.underlineThickness) * s, o = []; let l = 0, c = 0; for (let h = 0; h < r.length; h++) { @@ -47402,13 +47403,13 @@ function jb(n4, e, t, i) { `) l = 0, c -= a; else { - const f = Zb(u, s, l, c, t, i); + const f = jb(u, s, l, c, t, i); f && (l += f.offsetX, o.push(f.shapePath)); } } return o; } -var Qb = class { +var Jb = class { /** * Creates a new queue */ @@ -47459,7 +47460,7 @@ var Qb = class { switch (e.simplificationType) { case ac.QUADRATIC: default: - return new tA(e.mesh); + return new iA(e.mesh); } } }; @@ -47467,12 +47468,12 @@ var ac; (function(n4) { n4[n4.QUADRATIC = 0] = "QUADRATIC"; })(ac || (ac = {})); -var Jb = class { +var $b = class { constructor(e) { this._vertices = e, this.error = new Array(4), this.deleted = false, this.isDirty = false, this.deletePending = false, this.borderFactor = 0; } }; -var $b = class { +var eA = class { constructor(e, t) { this.position = e, this.id = t, this.isBorder = true, this.q = new va(), this.triangleCount = 0, this.triangleStart = 0, this.originalOffsets = []; } @@ -47511,12 +47512,12 @@ var va = class _va { return [e * e, e * t, e * i, e * r, t * t, t * i, t * r, i * i, i * r, r * r]; } }; -var eA = class { +var tA = class { constructor(e, t) { this.vertexId = e, this.triangleId = t; } }; -var tA = class { +var iA = class { /** * Creates a new QuadraticErrorSimplification * @param _mesh defines the target mesh @@ -47609,14 +47610,14 @@ var tA = class { }, l = [], c = (u) => { if (!r) return; - const f = u + a.verticesStart, d = _.FromArray(r, f * 3), p = o(d) || new $b(d, this._vertices.length); + const f = u + a.verticesStart, d = _.FromArray(r, f * 3), p = o(d) || new eA(d, this._vertices.length); p.originalOffsets.push(f), p.id === this._vertices.length && this._vertices.push(p), l.push(p.id); }, h = a.verticesCount; Pr.SyncAsyncForLoop(h, this.syncIterations / 4 >> 0, c, () => { const u = (f) => { if (!s) return; - const p = (a.indexStart / 3 + f) * 3, g = s[p + 0], m = s[p + 1], v = s[p + 2], E = this._vertices[l[g - a.verticesStart]], C = this._vertices[l[m - a.verticesStart]], T = this._vertices[l[v - a.verticesStart]], R = new Jb([E, C, T]); + const p = (a.indexStart / 3 + f) * 3, g = s[p + 0], m = s[p + 1], v = s[p + 2], E = this._vertices[l[g - a.verticesStart]], C = this._vertices[l[m - a.verticesStart]], T = this._vertices[l[v - a.verticesStart]], R = new $b([E, C, T]); R.originalOffset = p, this._triangles.push(R); }; Pr.SyncAsyncForLoop(a.indexCount / 3, this.syncIterations, u, () => { @@ -47770,7 +47771,7 @@ var tA = class { const o = new Array(this._triangles.length * 3); for (t = 0; t < this._triangles.length; ++t) for (i = this._triangles[t], r = 0; r < 3; ++r) - s = i._vertices[r], o[s.triangleStart + s.triangleCount] = new eA(r, t), s.triangleCount++; + s = i._vertices[r], o[s.triangleStart + s.triangleCount] = new tA(r, t), s.triangleCount++; this._references = o, e && this._identifyBorder(); } _vertexError(e, t) { @@ -47793,9 +47794,9 @@ var tA = class { Object.defineProperty(Ot.prototype, "simplificationQueue", { get: function() { if (!this._simplificationQueue) { - this._simplificationQueue = new Qb(); + this._simplificationQueue = new Jb(); let n4 = this._getComponent(ke.NAME_SIMPLIFICATIONQUEUE); - n4 || (n4 = new iA(this), this._addComponent(n4)); + n4 || (n4 = new rA(this), this._addComponent(n4)); } return this._simplificationQueue; }, @@ -47814,7 +47815,7 @@ B.prototype.simplify = function(n4, e = true, t = ac.QUADRATIC, i) { successCallback: i }), this; }; -var iA = class { +var rA = class { /** * Creates a new instance of the component for the given scene * @param scene Defines the scene to register the component in @@ -47886,14 +47887,14 @@ bi.prototype.projectToRef = function(n4, e, t, i) { } return r.fillMode === 4 ? -1 : !t.length && this._mesh._unIndexed ? this._projectOnUnIndexedTrianglesToRef(n4, e, t, i) : this._projectOnTrianglesToRef(n4, e, t, s, a, i); }; -function rA(n4, e = {}, t) { +function sA(n4, e = {}, t) { e.diameter || (e.diameter = 1), e.segments || (e.segments = 16); const i = v0("", { slice: 0.5, diameter: e.diameter, segments: e.segments }, t), r = g0("", { radius: e.diameter / 2, tessellation: e.segments * 3 + (4 - e.segments) }, t); r.rotation.x = -Math.PI / 2, r.parent = i; const s = B.MergeMeshes([r, i], true); return s.name = n4, s; } -B.CreateHemisphere = (n4, e, t, i) => rA(n4, { +B.CreateHemisphere = (n4, e, t, i) => sA(n4, { segments: e, diameter: t }, i); @@ -48312,14 +48313,14 @@ ae._ThicknessTextureEnabled = true; ae._RefractionIntensityTextureEnabled = true; ae._TranslucencyIntensityTextureEnabled = true; ae._IridescenceTextureEnabled = true; -var sA = "decalFragmentDeclaration"; -var nA = `#ifdef DECAL +var nA = "decalFragmentDeclaration"; +var aA = `#ifdef DECAL uniform vec4 vDecalInfos; #endif `; -Y.IncludesShadersStore[sA] = nA; -var aA = "defaultFragmentDeclaration"; -var oA = `uniform vec4 vEyePosition;uniform vec4 vDiffuseColor; +Y.IncludesShadersStore[nA] = aA; +var oA = "defaultFragmentDeclaration"; +var lA = `uniform vec4 vEyePosition;uniform vec4 vDiffuseColor; #ifdef SPECULARTERM uniform vec4 vSpecularColor; #endif @@ -48392,17 +48393,17 @@ uniform vec4 vDetailInfos; #include #define ADDITIONAL_FRAGMENT_DECLARATION `; -Y.IncludesShadersStore[aA] = oA; -var lA = "sceneUboDeclaration"; -var cA = `layout(std140,column_major) uniform;uniform Scene {mat4 viewProjection; +Y.IncludesShadersStore[oA] = lA; +var cA = "sceneUboDeclaration"; +var hA = `layout(std140,column_major) uniform;uniform Scene {mat4 viewProjection; #ifdef MULTIVIEW mat4 viewProjectionR; #endif mat4 view;mat4 projection;vec4 vEyePosition;}; `; -Y.IncludesShadersStore[lA] = cA; -var hA = "meshUboDeclaration"; -var uA = `#ifdef WEBGL2 +Y.IncludesShadersStore[cA] = hA; +var uA = "meshUboDeclaration"; +var fA = `#ifdef WEBGL2 uniform mat4 world;uniform float visibility; #else layout(std140,column_major) uniform;uniform Mesh @@ -48410,18 +48411,18 @@ layout(std140,column_major) uniform;uniform Mesh #endif #define WORLD_UBO `; -Y.IncludesShadersStore[hA] = uA; -var fA = "defaultUboDeclaration"; -var dA = `layout(std140,column_major) uniform;uniform Material +Y.IncludesShadersStore[uA] = fA; +var dA = "defaultUboDeclaration"; +var pA = `layout(std140,column_major) uniform;uniform Material {vec4 diffuseLeftColor;vec4 diffuseRightColor;vec4 opacityParts;vec4 reflectionLeftColor;vec4 reflectionRightColor;vec4 refractionLeftColor;vec4 refractionRightColor;vec4 emissiveLeftColor;vec4 emissiveRightColor;vec2 vDiffuseInfos;vec2 vAmbientInfos;vec2 vOpacityInfos;vec2 vReflectionInfos;vec3 vReflectionPosition;vec3 vReflectionSize;vec2 vEmissiveInfos;vec2 vLightmapInfos;vec2 vSpecularInfos;vec3 vBumpInfos;mat4 diffuseMatrix;mat4 ambientMatrix;mat4 opacityMatrix;mat4 reflectionMatrix;mat4 emissiveMatrix;mat4 lightmapMatrix;mat4 specularMatrix;mat4 bumpMatrix;vec2 vTangentSpaceParams;float pointSize;float alphaCutOff;mat4 refractionMatrix;vec4 vRefractionInfos;vec3 vRefractionPosition;vec3 vRefractionSize;vec4 vSpecularColor;vec3 vEmissiveColor;vec4 vDiffuseColor;vec3 vAmbientColor; #define ADDITIONAL_UBO_DECLARATION }; #include #include `; -Y.IncludesShadersStore[fA] = dA; -var pA = "prePassDeclaration"; -var gA = `#ifdef PREPASS +Y.IncludesShadersStore[dA] = pA; +var gA = "prePassDeclaration"; +var mA = `#ifdef PREPASS #extension GL_EXT_draw_buffers : require layout(location=0) out highp vec4 glFragData[{X}];highp vec4 gl_FragColor; #ifdef PREPASS_DEPTH @@ -48432,9 +48433,9 @@ varying highp vec4 vCurrentPosition;varying highp vec4 vPreviousPosition; #endif #endif `; -Y.IncludesShadersStore[pA] = gA; -var mA = "oitDeclaration"; -var _A = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY +Y.IncludesShadersStore[gA] = mA; +var _A = "oitDeclaration"; +var EA = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY #extension GL_EXT_draw_buffers : require layout(location=0) out vec2 depth; layout(location=1) out vec4 frontColor;layout(location=2) out vec4 backColor; @@ -48442,15 +48443,15 @@ layout(location=1) out vec4 frontColor;layout(location=2) out vec4 backColor; highp vec4 gl_FragColor;uniform sampler2D oitDepthSampler;uniform sampler2D oitFrontColorSampler; #endif `; -Y.IncludesShadersStore[mA] = _A; -var EA = "mainUVVaryingDeclaration"; -var vA = `#ifdef MAINUV{X} +Y.IncludesShadersStore[_A] = EA; +var vA = "mainUVVaryingDeclaration"; +var TA = `#ifdef MAINUV{X} varying vec2 vMainUV{X}; #endif `; -Y.IncludesShadersStore[EA] = vA; -var TA = "helperFunctions"; -var xA = `const float PI=3.1415926535897932384626433832795;const float RECIPROCAL_PI=0.3183098861837907;const float RECIPROCAL_PI2=0.15915494309189535;const float HALF_MIN=5.96046448e-08; +Y.IncludesShadersStore[vA] = TA; +var xA = "helperFunctions"; +var CA = `const float PI=3.1415926535897932384626433832795;const float RECIPROCAL_PI=0.3183098861837907;const float RECIPROCAL_PI2=0.15915494309189535;const float HALF_MIN=5.96046448e-08; const float LinearEncodePowerApprox=2.2;const float GammaEncodePowerApprox=1.0/LinearEncodePowerApprox;const vec3 LuminanceEncodeApprox=vec3(0.2126,0.7152,0.0722);const float Epsilon=0.0000001; #define saturate(x) clamp(x,0.0,1.0) #define absEps(x) abs(x)+Epsilon @@ -48551,9 +48552,9 @@ const float rgbdMaxRange=255.0;vec4 toRGBD(vec3 color) {float maxRGB=maxEps(max( vec3 fromRGBD(vec4 rgbd) {rgbd.rgb=toLinearSpace(rgbd.rgb);return rgbd.rgb/rgbd.a;} vec3 parallaxCorrectNormal( vec3 vertexPos,vec3 origVec,vec3 cubeSize,vec3 cubePos ) {vec3 invOrigVec=vec3(1.0,1.0,1.0)/origVec;vec3 halfSize=cubeSize*0.5;vec3 intersecAtMaxPlane=(cubePos+halfSize-vertexPos)*invOrigVec;vec3 intersecAtMinPlane=(cubePos-halfSize-vertexPos)*invOrigVec;vec3 largestIntersec=max(intersecAtMaxPlane,intersecAtMinPlane);float distance=min(min(largestIntersec.x,largestIntersec.y),largestIntersec.z);vec3 intersectPositionWS=vertexPos+origVec*distance;return intersectPositionWS-cubePos;} `; -Y.IncludesShadersStore[TA] = xA; -var CA = "lightFragmentDeclaration"; -var RA = `#ifdef LIGHT{X} +Y.IncludesShadersStore[xA] = CA; +var RA = "lightFragmentDeclaration"; +var SA = `#ifdef LIGHT{X} uniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X}; #ifdef SPECULARTERM uniform vec4 vLightSpecular{X}; @@ -48616,9 +48617,9 @@ uniform mat4 textureProjectionMatrix{X};uniform sampler2D projectionLightSampler #endif #endif `; -Y.IncludesShadersStore[CA] = RA; -var SA = "lightUboDeclaration"; -var yA = `#ifdef LIGHT{X} +Y.IncludesShadersStore[RA] = SA; +var yA = "lightUboDeclaration"; +var IA = `#ifdef LIGHT{X} uniform Light{X} {vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular; #ifdef SPOTLIGHT{X} @@ -48677,9 +48678,9 @@ uniform mat4 lightMatrix{X}; #endif #endif `; -Y.IncludesShadersStore[SA] = yA; -var IA = "lightsFragmentFunctions"; -var bA = `struct lightingInfo +Y.IncludesShadersStore[yA] = IA; +var bA = "lightsFragmentFunctions"; +var AA = `struct lightingInfo {vec3 diffuse; #ifdef SPECULARTERM vec3 specular; @@ -48729,9 +48730,9 @@ vec3 angleW=normalize(viewDirectionW+lightData.xyz);float specComp=max(0.,dot(vN return result;} #define inline vec3 computeProjectionTextureDiffuseLighting(sampler2D projectionLightSampler,mat4 textureProjectionMatrix){vec4 strq=textureProjectionMatrix*vec4(vPositionW,1.0);strq/=strq.w;vec3 textureColor=texture2D(projectionLightSampler,strq.xy).rgb;return textureColor;}`; -Y.IncludesShadersStore[IA] = bA; -var AA = "shadowsFragmentFunctions"; -var MA = `#ifdef SHADOWS +Y.IncludesShadersStore[bA] = AA; +var MA = "shadowsFragmentFunctions"; +var PA = `#ifdef SHADOWS #if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE) #define TEXTUREFUNC(s,c,l) texture2DLodEXT(s,c,l) #else @@ -49058,9 +49059,9 @@ float computeShadowWithCSMPCSS64(float layer,vec4 vPositionFromLight,float depth #endif #endif `; -Y.IncludesShadersStore[AA] = MA; -var PA = "samplerFragmentDeclaration"; -var OA = `#ifdef _DEFINENAME_ +Y.IncludesShadersStore[MA] = PA; +var OA = "samplerFragmentDeclaration"; +var DA = `#ifdef _DEFINENAME_ #if _DEFINENAME_DIRECTUV==1 #define v_VARYINGNAME_UV vMainUV1 #elif _DEFINENAME_DIRECTUV==2 @@ -49079,16 +49080,16 @@ varying vec2 v_VARYINGNAME_UV; uniform sampler2D _SAMPLERNAME_Sampler; #endif `; -Y.IncludesShadersStore[PA] = OA; -var DA = "fresnelFunction"; -var NA = `#ifdef FRESNEL +Y.IncludesShadersStore[OA] = DA; +var NA = "fresnelFunction"; +var FA = `#ifdef FRESNEL float computeFresnelTerm(vec3 viewDirection,vec3 worldNormal,float bias,float power) {float fresnelTerm=pow(bias+abs(dot(viewDirection,worldNormal)),power);return clamp(fresnelTerm,0.,1.);} #endif `; -Y.IncludesShadersStore[DA] = NA; -var FA = "reflectionFunction"; -var LA = `vec3 computeFixedEquirectangularCoords(vec4 worldPos,vec3 worldNormal,vec3 direction) +Y.IncludesShadersStore[NA] = FA; +var LA = "reflectionFunction"; +var wA = `vec3 computeFixedEquirectangularCoords(vec4 worldPos,vec3 worldNormal,vec3 direction) {float lon=atan(direction.z,direction.x);float lat=acos(direction.y);vec2 sphereCoords=vec2(lon,lat)*RECIPROCAL_PI2*2.0;float s=sphereCoords.x*0.5+0.5;float t=sphereCoords.y;return vec3(s,t,0); } vec3 computeMirroredFixedEquirectangularCoords(vec4 worldPos,vec3 worldNormal,vec3 direction) {float lon=atan(direction.z,direction.x);float lat=acos(direction.y);vec2 sphereCoords=vec2(lon,lat)*RECIPROCAL_PI2*2.0;float s=sphereCoords.x*0.5+0.5;float t=sphereCoords.y;return vec3(1.0-s,t,0); } @@ -49151,9 +49152,9 @@ return vec3(0,0,0); } #endif `; -Y.IncludesShadersStore[FA] = LA; -var wA = "imageProcessingDeclaration"; -var UA = `#ifdef EXPOSURE +Y.IncludesShadersStore[LA] = wA; +var UA = "imageProcessingDeclaration"; +var VA = `#ifdef EXPOSURE uniform float exposureLinear; #endif #ifdef CONTRAST @@ -49180,9 +49181,9 @@ uniform vec4 colorTransformSettings; uniform float ditherIntensity; #endif `; -Y.IncludesShadersStore[wA] = UA; -var VA = "imageProcessingFunctions"; -var BA = `#if defined(COLORGRADING) && !defined(COLORGRADING3D) +Y.IncludesShadersStore[UA] = VA; +var BA = "imageProcessingFunctions"; +var kA = `#if defined(COLORGRADING) && !defined(COLORGRADING3D) /** * Polyfill for SAMPLE_TEXTURE_3D,which is unsupported in WebGL. * sampler3dSetting.x=textureOffset (0.5/textureSize). @@ -49267,9 +49268,9 @@ float rand=getRand(gl_FragCoord.xy*vInverseScreenSize);float dither=mix(-ditherI #endif #define CUSTOM_IMAGEPROCESSINGFUNCTIONS_UPDATERESULT_ATEND return result;}`; -Y.IncludesShadersStore[VA] = BA; -var kA = "bumpFragmentMainFunctions"; -var zA = `#if defined(BUMP) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) || defined(DETAIL) +Y.IncludesShadersStore[BA] = kA; +var zA = "bumpFragmentMainFunctions"; +var WA = `#if defined(BUMP) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) || defined(DETAIL) #if defined(TANGENT) && defined(NORMAL) varying mat3 vTBN; #endif @@ -49331,9 +49332,9 @@ mat3 cotangent_frame(vec3 normal,vec3 p,vec2 uv,vec2 tangentSpaceParams) {vec3 dp1=dFdx(p);vec3 dp2=dFdy(p);vec2 duv1=dFdx(uv);vec2 duv2=dFdy(uv);vec3 dp2perp=cross(dp2,normal);vec3 dp1perp=cross(normal,dp1);vec3 tangent=dp2perp*duv1.x+dp1perp*duv2.x;vec3 bitangent=dp2perp*duv1.y+dp1perp*duv2.y;tangent*=tangentSpaceParams.x;bitangent*=tangentSpaceParams.y;float det=max(dot(tangent,tangent),dot(bitangent,bitangent));float invmax=det==0.0 ? 0.0 : inversesqrt(det);return mat3(tangent*invmax,bitangent*invmax,normal);} #endif `; -Y.IncludesShadersStore[kA] = zA; -var WA = "bumpFragmentFunctions"; -var GA = `#if defined(BUMP) +Y.IncludesShadersStore[zA] = WA; +var GA = "bumpFragmentFunctions"; +var XA = `#if defined(BUMP) #include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_SAMPLERNAME_,bump) #endif #if defined(DETAIL) @@ -49364,15 +49365,15 @@ return -texCoordOffset; } #endif `; -Y.IncludesShadersStore[WA] = GA; -var XA = "logDepthDeclaration"; -var HA = `#ifdef LOGARITHMICDEPTH +Y.IncludesShadersStore[GA] = XA; +var HA = "logDepthDeclaration"; +var KA = `#ifdef LOGARITHMICDEPTH uniform float logarithmicDepthConstant;varying float vFragmentDepth; #endif `; -Y.IncludesShadersStore[XA] = HA; -var KA = "bumpFragment"; -var qA = `vec2 uvOffset=vec2(0.0,0.0); +Y.IncludesShadersStore[HA] = KA; +var qA = "bumpFragment"; +var YA = `vec2 uvOffset=vec2(0.0,0.0); #if defined(BUMP) || defined(PARALLAX) || defined(DETAIL) #ifdef NORMALXYSCALE float normalScale=1.0; @@ -49425,9 +49426,9 @@ normalW=perturbNormalBase(TBN,blendedNormal,vBumpInfos.y); detailNormal.xy*=vDetailInfos.z;normalW=perturbNormalBase(TBN,detailNormal,vDetailInfos.z); #endif `; -Y.IncludesShadersStore[KA] = qA; -var YA = "decalFragment"; -var ZA = `#ifdef DECAL +Y.IncludesShadersStore[qA] = YA; +var ZA = "decalFragment"; +var jA = `#ifdef DECAL #ifdef GAMMADECAL decalColor.rgb=toLinearSpace(decalColor.rgb); #endif @@ -49437,15 +49438,15 @@ decalColor.a*=decalColor.a; surfaceAlbedo.rgb=mix(surfaceAlbedo.rgb,decalColor.rgb,decalColor.a); #endif `; -Y.IncludesShadersStore[YA] = ZA; -var jA = "depthPrePass"; -var QA = `#ifdef DEPTHPREPASS +Y.IncludesShadersStore[ZA] = jA; +var QA = "depthPrePass"; +var JA = `#ifdef DEPTHPREPASS gl_FragColor=vec4(0.,0.,0.,1.0);return; #endif `; -Y.IncludesShadersStore[jA] = QA; -var JA = "lightFragment"; -var $A = `#ifdef LIGHT{X} +Y.IncludesShadersStore[QA] = JA; +var $A = "lightFragment"; +var e1 = `#ifdef LIGHT{X} #if defined(SHADOWONLY) || defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X}) && defined(LIGHTMAPNOSPECULAR{X}) #else #ifdef PBR @@ -49708,15 +49709,15 @@ sheenBase+=info.sheen.rgb*shadow; #endif #endif `; -Y.IncludesShadersStore[JA] = $A; -var e1 = "logDepthFragment"; -var t1 = `#ifdef LOGARITHMICDEPTH +Y.IncludesShadersStore[$A] = e1; +var t1 = "logDepthFragment"; +var i1 = `#ifdef LOGARITHMICDEPTH gl_FragDepthEXT=log2(vFragmentDepth)*logarithmicDepthConstant*0.5; #endif `; -Y.IncludesShadersStore[e1] = t1; -var i1 = "oitFragment"; -var r1 = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY +Y.IncludesShadersStore[t1] = i1; +var r1 = "oitFragment"; +var s1 = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY float fragDepth=gl_FragCoord.z; #ifdef ORDER_INDEPENDENT_TRANSPARENCY_16BITS uint halfFloat=packHalf2x16(vec2(fragDepth));vec2 full=unpackHalf2x16(halfFloat);fragDepth=full.x; @@ -49742,9 +49743,9 @@ if (fragDepth>nearestDepth && fragDepth +Y.IncludesShadersStore[r1] = s1; +var n1 = "defaultPixelShader"; +var a1 = `#include<__decl__defaultFragment> #if defined(BUMP) || !defined(NORMAL) #extension GL_OES_standard_derivatives : enable #endif @@ -50074,15 +50075,15 @@ if (fragDepth==nearestDepth) {frontColor.rgb+=color.rgb*color.a*alphaMultiplier; #define CUSTOM_FRAGMENT_MAIN_END } `; -Y.ShadersStore[s1] = n1; -var a1 = "decalVertexDeclaration"; -var o1 = `#ifdef DECAL +Y.ShadersStore[n1] = a1; +var o1 = "decalVertexDeclaration"; +var l1 = `#ifdef DECAL uniform vec4 vDecalInfos;uniform mat4 decalMatrix; #endif `; -Y.IncludesShadersStore[a1] = o1; -var l1 = "defaultVertexDeclaration"; -var c1 = `uniform mat4 viewProjection;uniform mat4 view; +Y.IncludesShadersStore[o1] = l1; +var c1 = "defaultVertexDeclaration"; +var h1 = `uniform mat4 viewProjection;uniform mat4 view; #ifdef DIFFUSE uniform mat4 diffuseMatrix;uniform vec2 vDiffuseInfos; #endif @@ -50116,15 +50117,15 @@ uniform vec4 vDetailInfos;uniform mat4 detailMatrix; #include #define ADDITIONAL_VERTEX_DECLARATION `; -Y.IncludesShadersStore[l1] = c1; -var h1 = "uvAttributeDeclaration"; -var u1 = `#ifdef UV{X} +Y.IncludesShadersStore[c1] = h1; +var u1 = "uvAttributeDeclaration"; +var f1 = `#ifdef UV{X} attribute vec2 uv{X}; #endif `; -Y.IncludesShadersStore[h1] = u1; -var f1 = "prePassVertexDeclaration"; -var d1 = `#ifdef PREPASS +Y.IncludesShadersStore[u1] = f1; +var d1 = "prePassVertexDeclaration"; +var p1 = `#ifdef PREPASS #ifdef PREPASS_DEPTH varying vec3 vViewPos; #endif @@ -50133,23 +50134,23 @@ uniform mat4 previousViewProjection;varying vec4 vCurrentPosition;varying vec4 v #endif #endif `; -Y.IncludesShadersStore[f1] = d1; -var p1 = "samplerVertexDeclaration"; -var g1 = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0 +Y.IncludesShadersStore[d1] = p1; +var g1 = "samplerVertexDeclaration"; +var m1 = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0 varying vec2 v_VARYINGNAME_UV; #endif `; -Y.IncludesShadersStore[p1] = g1; -var m1 = "bumpVertexDeclaration"; -var _1 = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) +Y.IncludesShadersStore[g1] = m1; +var _1 = "bumpVertexDeclaration"; +var E1 = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) #if defined(TANGENT) && defined(NORMAL) varying mat3 vTBN; #endif #endif `; -Y.IncludesShadersStore[m1] = _1; -var E1 = "lightVxFragmentDeclaration"; -var v1 = `#ifdef LIGHT{X} +Y.IncludesShadersStore[_1] = E1; +var v1 = "lightVxFragmentDeclaration"; +var T1 = `#ifdef LIGHT{X} uniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X}; #ifdef SPECULARTERM uniform vec4 vLightSpecular{X}; @@ -50174,9 +50175,9 @@ uniform vec3 vLightGround{X}; #endif #endif `; -Y.IncludesShadersStore[E1] = v1; -var T1 = "lightVxUboDeclaration"; -var x1 = `#ifdef LIGHT{X} +Y.IncludesShadersStore[v1] = T1; +var x1 = "lightVxUboDeclaration"; +var C1 = `#ifdef LIGHT{X} uniform Light{X} {vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular; #ifdef SPOTLIGHT{X} @@ -50197,9 +50198,9 @@ varying vec4 vPositionFromLight{X};varying float vDepthMetric{X};uniform mat4 li #endif #endif `; -Y.IncludesShadersStore[T1] = x1; -var C1 = "prePassVertex"; -var R1 = `#ifdef PREPASS_DEPTH +Y.IncludesShadersStore[x1] = C1; +var R1 = "prePassVertex"; +var S1 = `#ifdef PREPASS_DEPTH vViewPos=(view*worldPos).rgb; #endif #if defined(PREPASS_VELOCITY) && defined(BONES_VELOCITY_ENABLED) @@ -50233,18 +50234,18 @@ vPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated #endif #endif `; -Y.IncludesShadersStore[C1] = R1; -var S1 = "uvVariableDeclaration"; -var y1 = `#if !defined(UV{X}) && defined(MAINUV{X}) +Y.IncludesShadersStore[R1] = S1; +var y1 = "uvVariableDeclaration"; +var I1 = `#if !defined(UV{X}) && defined(MAINUV{X}) vec2 uv{X}=vec2(0.,0.); #endif #ifdef MAINUV{X} vMainUV{X}=uv{X}; #endif `; -Y.IncludesShadersStore[S1] = y1; -var I1 = "samplerVertexImplementation"; -var b1 = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0 +Y.IncludesShadersStore[y1] = I1; +var b1 = "samplerVertexImplementation"; +var A1 = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0 if (v_INFONAME_==0.) {v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uvUpdated,1.0,0.0));} #ifdef UV2 @@ -50269,17 +50270,17 @@ else if (v_INFONAME_==5.) #endif #endif `; -Y.IncludesShadersStore[I1] = b1; -var A1 = "bumpVertex"; -var M1 = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) +Y.IncludesShadersStore[b1] = A1; +var M1 = "bumpVertex"; +var P1 = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) #if defined(TANGENT) && defined(NORMAL) vec3 tbnNormal=normalize(normalUpdated);vec3 tbnTangent=normalize(tangentUpdated.xyz);vec3 tbnBitangent=cross(tbnNormal,tbnTangent)*tangentUpdated.w;vTBN=mat3(finalWorld)*mat3(tbnTangent,tbnBitangent,tbnNormal); #endif #endif `; -Y.IncludesShadersStore[A1] = M1; -var P1 = "shadowsVertex"; -var O1 = `#ifdef SHADOWS +Y.IncludesShadersStore[M1] = P1; +var O1 = "shadowsVertex"; +var D1 = `#ifdef SHADOWS #if defined(SHADOWCSM{X}) vPositionFromCamera{X}=view*worldPos;for (int i=0; i +Y.IncludesShadersStore[L1] = w1; +var U1 = "defaultVertexShader"; +var V1 = `#include<__decl__defaultVertex> #define CUSTOM_VERTEX_BEGIN attribute vec3 position; #ifdef NORMAL @@ -50442,8 +50443,8 @@ vMainUV1=uvUpdated; #define CUSTOM_VERTEX_MAIN_END } `; -Y.ShadersStore[w1] = U1; -var V1 = new RegExp("^([gimus]+)!"); +Y.ShadersStore[U1] = V1; +var B1 = new RegExp("^([gimus]+)!"); var rn = class _rn { /** * Creates a new instance of the plugin manager @@ -50640,7 +50641,7 @@ var rn = class _rn { if (c.charAt(0) === "!") u = "", c = c.substring(1); else { - const g = V1.exec(c); + const g = B1.exec(c); g && g.length >= 2 && (u = g[1], c = c.substring(u.length + 1)); } u.indexOf("g") < 0 && (u += "g"); @@ -50666,14 +50667,14 @@ var rn = class _rn { rn._MaterialPluginClassToMainDefine = {}; rn._MaterialPluginCounter = 0; st.OnEnginesDisposedObservable.add(() => { - k1(); + z1(); }); -var B1 = []; -var dg = null; -function k1() { - B1.length = 0, ie.OnEventObservable.remove(dg), dg = null; +var k1 = []; +var pg = null; +function z1() { + k1.length = 0, ie.OnEventObservable.remove(pg), pg = null; } -var wr = class { +var Ur = class { _enable(e) { e && this._pluginManager._activatePlugin(this); } @@ -50886,29 +50887,29 @@ var wr = class { } }; P([ - U() -], wr.prototype, "name", void 0); + w() +], Ur.prototype, "name", void 0); P([ - U() -], wr.prototype, "priority", void 0); + w() +], Ur.prototype, "priority", void 0); P([ - U() -], wr.prototype, "resolveIncludes", void 0); + w() +], Ur.prototype, "resolveIncludes", void 0); P([ - U() -], wr.prototype, "registerForExtraEvents", void 0); -var z1 = class extends es { + w() +], Ur.prototype, "registerForExtraEvents", void 0); +var W1 = class extends es { constructor() { super(...arguments), this.DETAIL = false, this.DETAILDIRECTUV = 0, this.DETAIL_NORMALBLENDMETHOD = 0; } }; -var hn = class extends wr { +var un = class extends Ur { /** @internal */ _markAllSubMeshesAsTexturesDirty() { this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty(); } constructor(e, t = true) { - super(e, "DetailMap", 140, new z1(), t), this._texture = null, this.diffuseBlendLevel = 1, this.roughnessBlendLevel = 1, this.bumpLevel = 1, this._normalBlendMethod = ie.MATERIAL_NORMALBLENDMETHOD_WHITEOUT, this._isEnabled = false, this.isEnabled = false, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1]; + super(e, "DetailMap", 140, new W1(), t), this._texture = null, this.diffuseBlendLevel = 1, this.roughnessBlendLevel = 1, this.bumpLevel = 1, this._normalBlendMethod = ie.MATERIAL_NORMALBLENDMETHOD_WHITEOUT, this._isEnabled = false, this.isEnabled = false, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1]; } isReadyForSubMesh(e, t, i) { return this._isEnabled ? !(e._areTexturesDirty && t.texturesEnabled && i.getCaps().standardDerivatives && this._texture && ae.DetailTextureEnabled && !this._texture.isReady()) : true; @@ -50958,26 +50959,26 @@ var hn = class extends wr { P([ Tt("detailTexture"), oe("_markAllSubMeshesAsTexturesDirty") -], hn.prototype, "texture", void 0); +], un.prototype, "texture", void 0); P([ - U() -], hn.prototype, "diffuseBlendLevel", void 0); + w() +], un.prototype, "diffuseBlendLevel", void 0); P([ - U() -], hn.prototype, "roughnessBlendLevel", void 0); + w() +], un.prototype, "roughnessBlendLevel", void 0); P([ - U() -], hn.prototype, "bumpLevel", void 0); + w() +], un.prototype, "bumpLevel", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") -], hn.prototype, "normalBlendMethod", void 0); +], un.prototype, "normalBlendMethod", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") -], hn.prototype, "isEnabled", void 0); +], un.prototype, "isEnabled", void 0); var Xh = { effect: null, subMesh: null }; -var W1 = class extends es { +var G1 = class extends es { /** * Initializes the Standard Material defines. * @param externalProperties The external properties @@ -51141,7 +51142,7 @@ var Ee = class _Ee extends Uc { * @param scene Define the scene the material belong to */ constructor(e, t) { - super(e, t), this._diffuseTexture = null, this._ambientTexture = null, this._opacityTexture = null, this._reflectionTexture = null, this._emissiveTexture = null, this._specularTexture = null, this._bumpTexture = null, this._lightmapTexture = null, this._refractionTexture = null, this.ambientColor = new Ne(0, 0, 0), this.diffuseColor = new Ne(1, 1, 1), this.specularColor = new Ne(1, 1, 1), this.emissiveColor = new Ne(0, 0, 0), this.specularPower = 64, this._useAlphaFromDiffuseTexture = false, this._useEmissiveAsIllumination = false, this._linkEmissiveWithDiffuse = false, this._useSpecularOverAlpha = false, this._useReflectionOverAlpha = false, this._disableLighting = false, this._useObjectSpaceNormalMap = false, this._useParallax = false, this._useParallaxOcclusion = false, this.parallaxScaleBias = 0.05, this._roughness = 0, this.indexOfRefraction = 0.98, this.invertRefractionY = true, this.alphaCutOff = 0.4, this._useLightmapAsShadowmap = false, this._useReflectionFresnelFromSpecular = false, this._useGlossinessFromSpecularMapAlpha = false, this._maxSimultaneousLights = 4, this._invertNormalMapX = false, this._invertNormalMapY = false, this._twoSidedLighting = false, this._applyDecalMapAfterDetailMap = false, this._renderTargets = new Li(16), this._worldViewProjectionMatrix = w.Zero(), this._globalAmbientColor = new Ne(0, 0, 0), this._cacheHasRenderTargetTextures = false, this.detailMap = new hn(this), this._attachImageProcessingConfiguration(null), this.prePassConfiguration = new oc(), this.getRenderTargetTextures = () => (this._renderTargets.reset(), _Ee.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget && this._renderTargets.push(this._reflectionTexture), _Ee.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget && this._renderTargets.push(this._refractionTexture), this._eventInfo.renderTargets = this._renderTargets, this._callbackPluginEventFillRenderTargetTextures(this._eventInfo), this._renderTargets); + super(e, t), this._diffuseTexture = null, this._ambientTexture = null, this._opacityTexture = null, this._reflectionTexture = null, this._emissiveTexture = null, this._specularTexture = null, this._bumpTexture = null, this._lightmapTexture = null, this._refractionTexture = null, this.ambientColor = new Ne(0, 0, 0), this.diffuseColor = new Ne(1, 1, 1), this.specularColor = new Ne(1, 1, 1), this.emissiveColor = new Ne(0, 0, 0), this.specularPower = 64, this._useAlphaFromDiffuseTexture = false, this._useEmissiveAsIllumination = false, this._linkEmissiveWithDiffuse = false, this._useSpecularOverAlpha = false, this._useReflectionOverAlpha = false, this._disableLighting = false, this._useObjectSpaceNormalMap = false, this._useParallax = false, this._useParallaxOcclusion = false, this.parallaxScaleBias = 0.05, this._roughness = 0, this.indexOfRefraction = 0.98, this.invertRefractionY = true, this.alphaCutOff = 0.4, this._useLightmapAsShadowmap = false, this._useReflectionFresnelFromSpecular = false, this._useGlossinessFromSpecularMapAlpha = false, this._maxSimultaneousLights = 4, this._invertNormalMapX = false, this._invertNormalMapY = false, this._twoSidedLighting = false, this._applyDecalMapAfterDetailMap = false, this._renderTargets = new Li(16), this._worldViewProjectionMatrix = L.Zero(), this._globalAmbientColor = new Ne(0, 0, 0), this._cacheHasRenderTargetTextures = false, this.detailMap = new un(this), this._attachImageProcessingConfiguration(null), this.prePassConfiguration = new oc(), this.getRenderTargetTextures = () => (this._renderTargets.reset(), _Ee.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget && this._renderTargets.push(this._reflectionTexture), _Ee.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget && this._renderTargets.push(this._refractionTexture), this._eventInfo.renderTargets = this._renderTargets, this._callbackPluginEventFillRenderTargetTextures(this._eventInfo), this._renderTargets); } /** * Gets a boolean indicating that current material needs to register RTT @@ -51203,7 +51204,7 @@ var Ee = class _Ee extends Uc { const r = t._drawWrapper; if (r.effect && this.isFrozen && r._wasPreviouslyReady && r._wasPreviouslyUsingInstances === i) return true; - t.materialDefines || (this._callbackPluginEventGeneric(Ri.GetDefineNames, this._eventInfo), t.materialDefines = new W1(this._eventInfo.defineNames)); + t.materialDefines || (this._callbackPluginEventGeneric(Ri.GetDefineNames, this._eventInfo), t.materialDefines = new G1(this._eventInfo.defineNames)); const s = this.getScene(), a = t.materialDefines; if (this._isReadyForSubMesh(t)) return true; @@ -51322,18 +51323,18 @@ var Ee = class _Ee extends Uc { return false; this._imageProcessingConfiguration.prepareDefines(a), a.IS_REFLECTION_LINEAR = this.reflectionTexture != null && !this.reflectionTexture.gammaSpace, a.IS_REFRACTION_LINEAR = this.refractionTexture != null && !this.refractionTexture.gammaSpace; } - a._areFresnelDirty && (_Ee.FresnelEnabled ? (this._diffuseFresnelParameters || this._opacityFresnelParameters || this._emissiveFresnelParameters || this._refractionFresnelParameters || this._reflectionFresnelParameters) && (a.DIFFUSEFRESNEL = this._diffuseFresnelParameters && this._diffuseFresnelParameters.isEnabled, a.OPACITYFRESNEL = this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled, a.REFLECTIONFRESNEL = this._reflectionFresnelParameters && this._reflectionFresnelParameters.isEnabled, a.REFLECTIONFRESNELFROMSPECULAR = this._useReflectionFresnelFromSpecular, a.REFRACTIONFRESNEL = this._refractionFresnelParameters && this._refractionFresnelParameters.isEnabled, a.EMISSIVEFRESNEL = this._emissiveFresnelParameters && this._emissiveFresnelParameters.isEnabled, a._needNormals = true, a.FRESNEL = true) : a.FRESNEL = false), cf(e, s, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, this._shouldTurnAlphaTestOn(e) || this._forceAlphaTest, a, this._applyDecalMapAfterDetailMap), hf(s, o, this, a, i, null, t.getRenderingMesh().hasThinInstances), this._eventInfo.defines = a, this._eventInfo.mesh = e, this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo), uf(e, a, true, true, true), this._callbackPluginEventPrepareDefines(this._eventInfo); + a._areFresnelDirty && (_Ee.FresnelEnabled ? (this._diffuseFresnelParameters || this._opacityFresnelParameters || this._emissiveFresnelParameters || this._refractionFresnelParameters || this._reflectionFresnelParameters) && (a.DIFFUSEFRESNEL = this._diffuseFresnelParameters && this._diffuseFresnelParameters.isEnabled, a.OPACITYFRESNEL = this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled, a.REFLECTIONFRESNEL = this._reflectionFresnelParameters && this._reflectionFresnelParameters.isEnabled, a.REFLECTIONFRESNELFROMSPECULAR = this._useReflectionFresnelFromSpecular, a.REFRACTIONFRESNEL = this._refractionFresnelParameters && this._refractionFresnelParameters.isEnabled, a.EMISSIVEFRESNEL = this._emissiveFresnelParameters && this._emissiveFresnelParameters.isEnabled, a._needNormals = true, a.FRESNEL = true) : a.FRESNEL = false), hf(e, s, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, this._shouldTurnAlphaTestOn(e) || this._forceAlphaTest, a, this._applyDecalMapAfterDetailMap), uf(s, o, this, a, i, null, t.getRenderingMesh().hasThinInstances), this._eventInfo.defines = a, this._eventInfo.mesh = e, this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo), ff(e, a, true, true, true), this._callbackPluginEventPrepareDefines(this._eventInfo); let c = false; if (a.isDirty) { const h = a._areLightsDisposed; a.markAsProcessed(); - const u = new pf(); + const u = new gf(); a.REFLECTION && u.addFallback(0, "REFLECTION"), a.SPECULAR && u.addFallback(0, "SPECULAR"), a.BUMP && u.addFallback(0, "BUMP"), a.PARALLAX && u.addFallback(1, "PARALLAX"), a.PARALLAX_RHS && u.addFallback(1, "PARALLAX_RHS"), a.PARALLAXOCCLUSION && u.addFallback(0, "PARALLAXOCCLUSION"), a.SPECULAROVERALPHA && u.addFallback(0, "SPECULAROVERALPHA"), a.FOG && u.addFallback(1, "FOG"), a.POINTSIZE && u.addFallback(0, "POINTSIZE"), a.LOGARITHMICDEPTH && u.addFallback(0, "LOGARITHMICDEPTH"), i0(a, u, this._maxSimultaneousLights), a.SPECULARTERM && u.addFallback(0, "SPECULARTERM"), a.DIFFUSEFRESNEL && u.addFallback(1, "DIFFUSEFRESNEL"), a.OPACITYFRESNEL && u.addFallback(2, "OPACITYFRESNEL"), a.REFLECTIONFRESNEL && u.addFallback(3, "REFLECTIONFRESNEL"), a.EMISSIVEFRESNEL && u.addFallback(4, "EMISSIVEFRESNEL"), a.FRESNEL && u.addFallback(4, "FRESNEL"), a.MULTIVIEW && u.addFallback(0, "MULTIVIEW"); const f = [I.PositionKind]; a.NORMAL && f.push(I.NormalKind), a.TANGENT && f.push(I.TangentKind); for (let x = 1; x <= 6; ++x) a["UV" + x] && f.push(`uv${x === 1 ? "" : x}`); - a.VERTEXCOLOR && f.push(I.ColorKind), t0(f, e, a, u), lf(f, a), Q_(f, e, a), af(f, e, a); + a.VERTEXCOLOR && f.push(I.ColorKind), t0(f, e, a, u), cf(f, a), Q_(f, e, a), of(f, e, a); let d = "default"; const p = [ "world", @@ -51405,7 +51406,7 @@ var Ee = class _Ee extends Uc { "oitDepthSampler", "oitFrontColorSampler" ], m = ["Material", "Scene", "Mesh"], v = { maxSimultaneousLights: this._maxSimultaneousLights, maxSimultaneousMorphTargets: a.NUM_MORPH_INFLUENCERS }; - this._eventInfo.fallbacks = u, this._eventInfo.fallbackRank = 0, this._eventInfo.defines = a, this._eventInfo.uniforms = p, this._eventInfo.attributes = f, this._eventInfo.samplers = g, this._eventInfo.uniformBuffersNames = m, this._eventInfo.customCode = void 0, this._eventInfo.mesh = e, this._eventInfo.indexParameters = v, this._callbackPluginEventGeneric(Ri.PrepareEffect, this._eventInfo), oc.AddUniforms(p), at && (at.PrepareUniforms(p, a), at.PrepareSamplers(g, a)), ff({ + this._eventInfo.fallbacks = u, this._eventInfo.fallbackRank = 0, this._eventInfo.defines = a, this._eventInfo.uniforms = p, this._eventInfo.attributes = f, this._eventInfo.samplers = g, this._eventInfo.uniformBuffersNames = m, this._eventInfo.customCode = void 0, this._eventInfo.mesh = e, this._eventInfo.indexParameters = v, this._callbackPluginEventGeneric(Ri.PrepareEffect, this._eventInfo), oc.AddUniforms(p), at && (at.PrepareUniforms(p, a), at.PrepareSamplers(g, a)), df({ uniformsNames: p, uniformBuffersNames: m, samplers: g, @@ -51462,7 +51463,7 @@ var Ee = class _Ee extends Uc { return; this._activeEffect = a, t.getMeshUniformBuffer().bindToEffect(a, "Mesh"), t.transferToEffect(e), this._uniformBuffer.bindToEffect(a, "Material"), this.prePassConfiguration.bindForSubMesh(this._activeEffect, r, t, e, this.isFrozen), this._eventInfo.subMesh = i, this._callbackPluginEventHardBindForSubMesh(this._eventInfo), s.OBJECTSPACE_NORMALMAP && (e.toNormalMatrix(this._normalMatrix), this.bindOnlyNormalMatrix(this._normalMatrix)); const o = this._mustRebind(r, a, i, t.visibility); - of(t, a); + lf(t, a); const l = this._uniformBuffer; if (o) { if (this.bindViewProjection(a), !l.useUbo || !this.isFrozen || !l.isSync || i._drawWrapper._forceRebindOnNextCall) { @@ -51484,7 +51485,7 @@ var Ee = class _Ee extends Uc { r.texturesEnabled && (this._diffuseTexture && _Ee.DiffuseTextureEnabled && a.setTexture("diffuseSampler", this._diffuseTexture), this._ambientTexture && _Ee.AmbientTextureEnabled && a.setTexture("ambientSampler", this._ambientTexture), this._opacityTexture && _Ee.OpacityTextureEnabled && a.setTexture("opacitySampler", this._opacityTexture), this._reflectionTexture && _Ee.ReflectionTextureEnabled && (this._reflectionTexture.isCube ? a.setTexture("reflectionCubeSampler", this._reflectionTexture) : a.setTexture("reflection2DSampler", this._reflectionTexture)), this._emissiveTexture && _Ee.EmissiveTextureEnabled && a.setTexture("emissiveSampler", this._emissiveTexture), this._lightmapTexture && _Ee.LightmapTextureEnabled && a.setTexture("lightmapSampler", this._lightmapTexture), this._specularTexture && _Ee.SpecularTextureEnabled && a.setTexture("specularSampler", this._specularTexture), this._bumpTexture && r.getEngine().getCaps().standardDerivatives && _Ee.BumpTextureEnabled && a.setTexture("bumpSampler", this._bumpTexture), this._refractionTexture && _Ee.RefractionTextureEnabled && (this._refractionTexture.isCube ? a.setTexture("refractionCubeSampler", this._refractionTexture) : a.setTexture("refraction2DSampler", this._refractionTexture))), this.getScene().useOrderIndependentTransparency && this.needAlphaBlendingForMesh(t) && this.getScene().depthPeelingRenderer.bind(a), this._eventInfo.subMesh = i, this._callbackPluginEventBindForSubMesh(this._eventInfo), Fc(a, this, r), this.bindEyePosition(a); } else r.getEngine()._features.needToAlwaysBindUniformBuffers && (this._needToBindSceneUbo = true); - (o || !this.isFrozen) && (r.lightsEnabled && !this._disableLighting && e0(r, t, a, s, this._maxSimultaneousLights), (r.fogEnabled && t.applyFog && r.fogMode !== Ot.FOGMODE_NONE || this._reflectionTexture || this._refractionTexture || t.receiveShadows || s.PREPASS) && this.bindView(a), wc(r, t, a), s.NUM_MORPH_INFLUENCERS && nf(t, a), s.BAKED_VERTEX_ANIMATION_TEXTURE && ((c = t.bakedVertexAnimationManager) == null || c.bind(a, s.INSTANCES)), this.useLogarithmicDepth && Lc(s, a, r), this._imageProcessingConfiguration && !this._imageProcessingConfiguration.applyByPostProcess && this._imageProcessingConfiguration.bind(this._activeEffect)), this._afterBind(t, this._activeEffect, i), l.update(); + (o || !this.isFrozen) && (r.lightsEnabled && !this._disableLighting && e0(r, t, a, s, this._maxSimultaneousLights), (r.fogEnabled && t.applyFog && r.fogMode !== Ot.FOGMODE_NONE || this._reflectionTexture || this._refractionTexture || t.receiveShadows || s.PREPASS) && this.bindView(a), wc(r, t, a), s.NUM_MORPH_INFLUENCERS && af(t, a), s.BAKED_VERTEX_ANIMATION_TEXTURE && ((c = t.bakedVertexAnimationManager) == null || c.bind(a, s.INSTANCES)), this.useLogarithmicDepth && Lc(s, a, r), this._imageProcessingConfiguration && !this._imageProcessingConfiguration.applyByPostProcess && this._imageProcessingConfiguration.bind(this._activeEffect)), this._afterBind(t, this._activeEffect, i), l.update(); } /** * Get the list of animatables in the material. @@ -51718,82 +51719,82 @@ P([ $i("emissive") ], Ee.prototype, "emissiveColor", void 0); P([ - U() + w() ], Ee.prototype, "specularPower", void 0); P([ - U("useAlphaFromDiffuseTexture") + w("useAlphaFromDiffuseTexture") ], Ee.prototype, "_useAlphaFromDiffuseTexture", void 0); P([ oe("_markAllSubMeshesAsTexturesAndMiscDirty") ], Ee.prototype, "useAlphaFromDiffuseTexture", void 0); P([ - U("useEmissiveAsIllumination") + w("useEmissiveAsIllumination") ], Ee.prototype, "_useEmissiveAsIllumination", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") ], Ee.prototype, "useEmissiveAsIllumination", void 0); P([ - U("linkEmissiveWithDiffuse") + w("linkEmissiveWithDiffuse") ], Ee.prototype, "_linkEmissiveWithDiffuse", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") ], Ee.prototype, "linkEmissiveWithDiffuse", void 0); P([ - U("useSpecularOverAlpha") + w("useSpecularOverAlpha") ], Ee.prototype, "_useSpecularOverAlpha", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") ], Ee.prototype, "useSpecularOverAlpha", void 0); P([ - U("useReflectionOverAlpha") + w("useReflectionOverAlpha") ], Ee.prototype, "_useReflectionOverAlpha", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") ], Ee.prototype, "useReflectionOverAlpha", void 0); P([ - U("disableLighting") + w("disableLighting") ], Ee.prototype, "_disableLighting", void 0); P([ oe("_markAllSubMeshesAsLightsDirty") ], Ee.prototype, "disableLighting", void 0); P([ - U("useObjectSpaceNormalMap") + w("useObjectSpaceNormalMap") ], Ee.prototype, "_useObjectSpaceNormalMap", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") ], Ee.prototype, "useObjectSpaceNormalMap", void 0); P([ - U("useParallax") + w("useParallax") ], Ee.prototype, "_useParallax", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") ], Ee.prototype, "useParallax", void 0); P([ - U("useParallaxOcclusion") + w("useParallaxOcclusion") ], Ee.prototype, "_useParallaxOcclusion", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") ], Ee.prototype, "useParallaxOcclusion", void 0); P([ - U() + w() ], Ee.prototype, "parallaxScaleBias", void 0); P([ - U("roughness") + w("roughness") ], Ee.prototype, "_roughness", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") ], Ee.prototype, "roughness", void 0); P([ - U() + w() ], Ee.prototype, "indexOfRefraction", void 0); P([ - U() + w() ], Ee.prototype, "invertRefractionY", void 0); P([ - U() + w() ], Ee.prototype, "alphaCutOff", void 0); P([ - U("useLightmapAsShadowmap") + w("useLightmapAsShadowmap") ], Ee.prototype, "_useLightmapAsShadowmap", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") @@ -51829,58 +51830,58 @@ P([ oe("_markAllSubMeshesAsFresnelDirty") ], Ee.prototype, "emissiveFresnelParameters", void 0); P([ - U("useReflectionFresnelFromSpecular") + w("useReflectionFresnelFromSpecular") ], Ee.prototype, "_useReflectionFresnelFromSpecular", void 0); P([ oe("_markAllSubMeshesAsFresnelDirty") ], Ee.prototype, "useReflectionFresnelFromSpecular", void 0); P([ - U("useGlossinessFromSpecularMapAlpha") + w("useGlossinessFromSpecularMapAlpha") ], Ee.prototype, "_useGlossinessFromSpecularMapAlpha", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") ], Ee.prototype, "useGlossinessFromSpecularMapAlpha", void 0); P([ - U("maxSimultaneousLights") + w("maxSimultaneousLights") ], Ee.prototype, "_maxSimultaneousLights", void 0); P([ oe("_markAllSubMeshesAsLightsDirty") ], Ee.prototype, "maxSimultaneousLights", void 0); P([ - U("invertNormalMapX") + w("invertNormalMapX") ], Ee.prototype, "_invertNormalMapX", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") ], Ee.prototype, "invertNormalMapX", void 0); P([ - U("invertNormalMapY") + w("invertNormalMapY") ], Ee.prototype, "_invertNormalMapY", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") ], Ee.prototype, "invertNormalMapY", void 0); P([ - U("twoSidedLighting") + w("twoSidedLighting") ], Ee.prototype, "_twoSidedLighting", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") ], Ee.prototype, "twoSidedLighting", void 0); P([ - U("applyDecalMapAfterDetailMap") + w("applyDecalMapAfterDetailMap") ], Ee.prototype, "_applyDecalMapAfterDetailMap", void 0); P([ oe("_markAllSubMeshesAsMiscDirty") ], Ee.prototype, "applyDecalMapAfterDetailMap", void 0); Re("BABYLON.StandardMaterial", Ee); Ot.DefaultMaterialFactory = (n4) => new Ee("default material", n4); -var G1 = "rgbdDecodePixelShader"; -var X1 = `varying vec2 vUV;uniform sampler2D textureSampler; +var X1 = "rgbdDecodePixelShader"; +var H1 = `varying vec2 vUV;uniform sampler2D textureSampler; #include #define CUSTOM_FRAGMENT_DEFINITIONS void main(void) {gl_FragColor=vec4(fromRGBD(texture2D(textureSampler,vUV)),1.0);}`; -Y.ShadersStore[G1] = X1; -var H1 = "passCubePixelShader"; -var K1 = `varying vec2 vUV;uniform samplerCube textureSampler; +Y.ShadersStore[X1] = H1; +var K1 = "passCubePixelShader"; +var q1 = `varying vec2 vUV;uniform samplerCube textureSampler; #define CUSTOM_FRAGMENT_DEFINITIONS void main(void) {vec2 uv=vUV*2.0-1.0; @@ -51903,7 +51904,7 @@ gl_FragColor=textureCube(textureSampler,vec3(uv,1.001)); gl_FragColor=textureCube(textureSampler,vec3(uv,-1.001)); #endif }`; -Y.ShadersStore[H1] = K1; +Y.ShadersStore[K1] = q1; var Yo = class _Yo extends Pt { /** * Gets a string identifying the name of the class @@ -51935,7 +51936,7 @@ var Yo = class _Yo extends Pt { }; Re("BABYLON.PassPostProcess", Yo); se._RescalePostProcessFactory = (n4) => new Yo("rescale", 1, null, 2, n4, false, 0); -function q1(n4, e, t, i = true) { +function Y1(n4, e, t, i = true) { const r = n4.getScene(), s = r.getEngine(), a = new gr("resized" + n4.name, { width: e, height: t }, r, !n4.noMipmap, true, n4._texture.type, false, n4.samplingMode, false); a.wrapU = n4.wrapU, a.wrapV = n4.wrapV, a.uOffset = n4.uOffset, a.vOffset = n4.vOffset, a.uScale = n4.uScale, a.vScale = n4.vScale, a.uAng = n4.uAng, a.vAng = n4.vAng, a.wAng = n4.wAng, a.coordinatesIndex = n4.coordinatesIndex, a.level = n4.level, a.anisotropicFilteringLevel = n4.anisotropicFilteringLevel, a._texture.isReady = false, n4.wrapU = le.CLAMP_ADDRESSMODE, n4.wrapV = le.CLAMP_ADDRESSMODE; const o = new Yo("pass", 1, null, i ? le.BILINEAR_SAMPLINGMODE : le.NEAREST_SAMPLINGMODE, s, false, 0); @@ -51947,7 +51948,7 @@ function q1(n4, e, t, i = true) { l && (r.postProcessManager.directRender([o], l), s.unBindFramebuffer(l), a.disposeFramebufferObjects(), o.dispose(), a.getInternalTexture().isReady = true); }), a; } -function Rf(n4, e, t, i, r, s, a, o) { +function Sf(n4, e, t, i, r, s, a, o) { const l = e.getEngine(); return e.isReady = false, r = r ?? e.samplingMode, i = i ?? e.type, s = s ?? e.format, a = a ?? e.width, o = o ?? e.height, i === -1 && (i = 0), new Promise((c) => { const h = new Pt("postprocess", n4, null, null, 1, null, r, l, false, void 0, i, void 0, null, false, s); @@ -51968,10 +51969,10 @@ function Rf(n4, e, t, i, r, s, a, o) { }); } var El; -var pg; +var gg; function ns(n4) { - El || (El = new Float32Array(1), pg = new Int32Array(El.buffer)), El[0] = n4; - const e = pg[0]; + El || (El = new Float32Array(1), gg = new Int32Array(El.buffer)), El[0] = n4; + const e = gg[0]; let t = e >> 16 & 32768, i = e >> 12 & 2047; const r = e >> 23 & 255; return r < 103 ? t : r > 142 ? (t |= 31744, t |= (r == 255 ? 0 : 1) && e & 8388607, t) : r < 113 ? (i |= 2048, t |= (i >> 114 - r) + (i >> 113 - r & 1), t) : (t |= r - 112 << 10 | i >> 1, t += i & 1, t); @@ -51980,7 +51981,7 @@ function Ms(n4) { const e = (n4 & 32768) >> 15, t = (n4 & 31744) >> 10, i = n4 & 1023; return t === 0 ? (e ? -1 : 1) * Math.pow(2, -14) * (i / Math.pow(2, 10)) : t == 31 ? i ? NaN : (e ? -1 : 1) * (1 / 0) : (e ? -1 : 1) * Math.pow(2, t - 15) * (1 + i / Math.pow(2, 10)); } -var Y1 = async (n4, e, t, i, r) => { +var Z1 = async (n4, e, t, i, r) => { const s = n4.getScene(), a = s.getEngine(); let o; if (!n4.isCube) @@ -52011,7 +52012,7 @@ var Y1 = async (n4, e, t, i, r) => { l.dispose(), o.dispose(); } }; -async function Z1(n4, e, t, i = 0, r = 0) { +async function j1(n4, e, t, i = 0, r = 0) { return !n4.isReady() && n4._texture && await new Promise((s, a) => { if (n4._texture === null) { a(0); @@ -52020,9 +52021,9 @@ async function Z1(n4, e, t, i = 0, r = 0) { n4._texture.onLoadedObservable.addOnce(() => { s(0); }); - }), await Y1(n4, e, t, i, r); + }), await Z1(n4, e, t, i, r); } -var j1 = { +var Q1 = { /** * Uses the GPU to create a copy texture rescaled at a given size * @param texture Texture to copy from @@ -52031,7 +52032,7 @@ var j1 = { * @param useBilinearMode defines if bilinear mode has to be used * @returns the generated texture */ - CreateResizedCopy: q1, + CreateResizedCopy: Y1, /** * Apply a post process to a texture * @param postProcessName name of the fragment post process @@ -52042,7 +52043,7 @@ var j1 = { * @param format format of the output texture. If not provided, use the one from internalTexture * @returns a promise with the internalTexture having its texture replaced by the result of the processing */ - ApplyPostProcess: Rf, + ApplyPostProcess: Sf, /** * Converts a number to half float * @param value number to convert @@ -52066,9 +52067,9 @@ var j1 = { * @param lod if the texture has multiple LODs, the lod index to use for the source * @returns the 8-bit texture data */ - GetTextureDataAsync: Z1 + GetTextureDataAsync: j1 }; -var gg = class { +var mg = class { /** * Expand the RGBD Texture from RGBD to Half Float if possible. * @param texture the texture to expand. @@ -52107,25 +52108,25 @@ var gg = class { * @returns a promise with the internalTexture having its texture replaced by the result of the processing */ static EncodeTextureToRGBD(e, t, i = 0) { - return Rf("rgbdEncode", e, t, i, 1, 5); + return Sf("rgbdEncode", e, t, i, 1, 5); } }; -var Q1 = "data:image/png;base64,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"; -var J1 = 0; +var J1 = "data:image/png;base64,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"; +var $1 = 0; var b0 = (n4) => { if (!n4.environmentBRDFTexture) { const e = n4.useDelayedTextureLoading; n4.useDelayedTextureLoading = false; const t = n4._blockEntityCollection; n4._blockEntityCollection = false; - const i = le.CreateFromBase64String(Q1, "EnvironmentBRDFTexture" + J1++, n4, true, false, le.BILINEAR_SAMPLINGMODE); + const i = le.CreateFromBase64String(J1, "EnvironmentBRDFTexture" + $1++, n4, true, false, le.BILINEAR_SAMPLINGMODE); n4._blockEntityCollection = t; const r = n4.getEngine().getLoadedTexturesCache(), s = r.indexOf(i.getInternalTexture()); - s !== -1 && r.splice(s, 1), i.isRGBD = true, i.wrapU = le.CLAMP_ADDRESSMODE, i.wrapV = le.CLAMP_ADDRESSMODE, n4.environmentBRDFTexture = i, n4.useDelayedTextureLoading = e, gg.ExpandRGBDTexture(i); + s !== -1 && r.splice(s, 1), i.isRGBD = true, i.wrapU = le.CLAMP_ADDRESSMODE, i.wrapV = le.CLAMP_ADDRESSMODE, n4.environmentBRDFTexture = i, n4.useDelayedTextureLoading = e, mg.ExpandRGBDTexture(i); const a = n4.getEngine().onContextRestoredObservable.add(() => { i.isRGBD = true; const o = n4.onBeforeRenderObservable.add(() => { - i.isReady() && (n4.onBeforeRenderObservable.remove(o), gg.ExpandRGBDTexture(i)); + i.isReady() && (n4.onBeforeRenderObservable.remove(o), mg.ExpandRGBDTexture(i)); }); }); n4.onDisposeObservable.add(() => { @@ -52134,18 +52135,18 @@ var b0 = (n4) => { } return n4.environmentBRDFTexture; }; -var $1 = class extends es { +var eM = class extends es { constructor() { super(...arguments), this.BRDF_V_HEIGHT_CORRELATED = false, this.MS_BRDF_ENERGY_CONSERVATION = false, this.SPHERICAL_HARMONICS = false, this.SPECULAR_GLOSSINESS_ENERGY_CONSERVATION = false; } }; -var Fi = class _Fi extends wr { +var Fi = class _Fi extends Ur { /** @internal */ _markAllSubMeshesAsMiscDirty() { this._internalMarkAllSubMeshesAsMiscDirty(); } constructor(e, t = true) { - super(e, "PBRBRDF", 90, new $1(), t), this._useEnergyConservation = _Fi.DEFAULT_USE_ENERGY_CONSERVATION, this.useEnergyConservation = _Fi.DEFAULT_USE_ENERGY_CONSERVATION, this._useSmithVisibilityHeightCorrelated = _Fi.DEFAULT_USE_SMITH_VISIBILITY_HEIGHT_CORRELATED, this.useSmithVisibilityHeightCorrelated = _Fi.DEFAULT_USE_SMITH_VISIBILITY_HEIGHT_CORRELATED, this._useSphericalHarmonics = _Fi.DEFAULT_USE_SPHERICAL_HARMONICS, this.useSphericalHarmonics = _Fi.DEFAULT_USE_SPHERICAL_HARMONICS, this._useSpecularGlossinessInputEnergyConservation = _Fi.DEFAULT_USE_SPECULAR_GLOSSINESS_INPUT_ENERGY_CONSERVATION, this.useSpecularGlossinessInputEnergyConservation = _Fi.DEFAULT_USE_SPECULAR_GLOSSINESS_INPUT_ENERGY_CONSERVATION, this._internalMarkAllSubMeshesAsMiscDirty = e._dirtyCallbacks[16], this._enable(true); + super(e, "PBRBRDF", 90, new eM(), t), this._useEnergyConservation = _Fi.DEFAULT_USE_ENERGY_CONSERVATION, this.useEnergyConservation = _Fi.DEFAULT_USE_ENERGY_CONSERVATION, this._useSmithVisibilityHeightCorrelated = _Fi.DEFAULT_USE_SMITH_VISIBILITY_HEIGHT_CORRELATED, this.useSmithVisibilityHeightCorrelated = _Fi.DEFAULT_USE_SMITH_VISIBILITY_HEIGHT_CORRELATED, this._useSphericalHarmonics = _Fi.DEFAULT_USE_SPHERICAL_HARMONICS, this.useSphericalHarmonics = _Fi.DEFAULT_USE_SPHERICAL_HARMONICS, this._useSpecularGlossinessInputEnergyConservation = _Fi.DEFAULT_USE_SPECULAR_GLOSSINESS_INPUT_ENERGY_CONSERVATION, this.useSpecularGlossinessInputEnergyConservation = _Fi.DEFAULT_USE_SPECULAR_GLOSSINESS_INPUT_ENERGY_CONSERVATION, this._internalMarkAllSubMeshesAsMiscDirty = e._dirtyCallbacks[16], this._enable(true); } prepareDefines(e) { e.BRDF_V_HEIGHT_CORRELATED = this._useSmithVisibilityHeightCorrelated, e.MS_BRDF_ENERGY_CONSERVATION = this._useEnergyConservation && this._useSmithVisibilityHeightCorrelated, e.SPHERICAL_HARMONICS = this._useSphericalHarmonics, e.SPECULAR_GLOSSINESS_ENERGY_CONSERVATION = this._useSpecularGlossinessInputEnergyConservation; @@ -52159,19 +52160,19 @@ Fi.DEFAULT_USE_SMITH_VISIBILITY_HEIGHT_CORRELATED = true; Fi.DEFAULT_USE_SPHERICAL_HARMONICS = true; Fi.DEFAULT_USE_SPECULAR_GLOSSINESS_INPUT_ENERGY_CONSERVATION = true; P([ - U(), + w(), oe("_markAllSubMeshesAsMiscDirty") ], Fi.prototype, "useEnergyConservation", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsMiscDirty") ], Fi.prototype, "useSmithVisibilityHeightCorrelated", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsMiscDirty") ], Fi.prototype, "useSphericalHarmonics", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsMiscDirty") ], Fi.prototype, "useSpecularGlossinessInputEnergyConservation", void 0); var rs = [ @@ -52186,7 +52187,7 @@ var rs = [ Math.sqrt(15 / (16 * Math.PI)) // l22 ]; -var eM = [ +var tM = [ () => 1, (n4) => n4.y, (n4) => n4.z, @@ -52198,7 +52199,7 @@ var eM = [ (n4) => n4.x * n4.x - n4.y * n4.y // l22 ]; -var bs = (n4, e) => rs[n4] * eM[n4](e); +var bs = (n4, e) => rs[n4] * tM[n4](e); var As = [Math.PI, 2 * Math.PI / 3, 2 * Math.PI / 3, 2 * Math.PI / 3, Math.PI / 4, Math.PI / 4, Math.PI / 4, Math.PI / 4, Math.PI / 4]; var xo = class _xo { constructor() { @@ -52421,10 +52422,10 @@ var za = class { isNaN(x) && (x = 0), isNaN(S) && (S = 0), isNaN(M) && (M = 0), e.type === 0 && (x /= 255, S /= 255, M /= 255), e.gammaSpace && (x = Math.pow(je.Clamp(x), zl), S = Math.pow(je.Clamp(S), zl), M = Math.pow(je.Clamp(M), zl)); const N = this.MAX_HDRI_VALUE; if (this.PRESERVE_CLAMPED_COLORS) { - const L = Math.max(x, S, M); - if (L > N) { - const K = N / L; - x *= K, S *= K, M *= K; + const U = Math.max(x, S, M); + if (U > N) { + const H = N / U; + x *= H, S *= H, M *= H; } } else x = je.Clamp(x, 0, N), S = je.Clamp(S, 0, N), M = je.Clamp(M, 0, N); @@ -52470,8 +52471,8 @@ Object.defineProperty(It.prototype, "sphericalPolynomial", { enumerable: true, configurable: true }); -var tM = "pbrFragmentDeclaration"; -var iM = `uniform vec4 vEyePosition;uniform vec3 vReflectionColor;uniform vec4 vAlbedoColor;uniform vec4 vLightingIntensity;uniform vec4 vReflectivityColor;uniform vec4 vMetallicReflectanceFactors;uniform vec3 vEmissiveColor;uniform float visibility;uniform vec3 vAmbientColor; +var iM = "pbrFragmentDeclaration"; +var rM = `uniform vec4 vEyePosition;uniform vec3 vReflectionColor;uniform vec4 vAlbedoColor;uniform vec4 vLightingIntensity;uniform vec4 vReflectivityColor;uniform vec4 vMetallicReflectanceFactors;uniform vec3 vEmissiveColor;uniform float visibility;uniform vec3 vAmbientColor; #ifdef ALBEDO uniform vec2 vAlbedoInfos; #endif @@ -52608,17 +52609,17 @@ uniform vec3 vSphericalX;uniform vec3 vSphericalY;uniform vec3 vSphericalZ;unifo #endif #define ADDITIONAL_FRAGMENT_DECLARATION `; -Y.IncludesShadersStore[tM] = iM; -var rM = "pbrUboDeclaration"; -var sM = `layout(std140,column_major) uniform;uniform Material {vec2 vAlbedoInfos;vec4 vAmbientInfos;vec2 vOpacityInfos;vec2 vEmissiveInfos;vec2 vLightmapInfos;vec3 vReflectivityInfos;vec2 vMicroSurfaceSamplerInfos;vec2 vReflectionInfos;vec2 vReflectionFilteringInfo;vec3 vReflectionPosition;vec3 vReflectionSize;vec3 vBumpInfos;mat4 albedoMatrix;mat4 ambientMatrix;mat4 opacityMatrix;mat4 emissiveMatrix;mat4 lightmapMatrix;mat4 reflectivityMatrix;mat4 microSurfaceSamplerMatrix;mat4 bumpMatrix;vec2 vTangentSpaceParams;mat4 reflectionMatrix;vec3 vReflectionColor;vec4 vAlbedoColor;vec4 vLightingIntensity;vec3 vReflectionMicrosurfaceInfos;float pointSize;vec4 vReflectivityColor;vec3 vEmissiveColor;vec3 vAmbientColor;vec2 vDebugMode;vec4 vMetallicReflectanceFactors;vec2 vMetallicReflectanceInfos;mat4 metallicReflectanceMatrix;vec2 vReflectanceInfos;mat4 reflectanceMatrix;vec3 vSphericalL00;vec3 vSphericalL1_1;vec3 vSphericalL10;vec3 vSphericalL11;vec3 vSphericalL2_2;vec3 vSphericalL2_1;vec3 vSphericalL20;vec3 vSphericalL21;vec3 vSphericalL22;vec3 vSphericalX;vec3 vSphericalY;vec3 vSphericalZ;vec3 vSphericalXX_ZZ;vec3 vSphericalYY_ZZ;vec3 vSphericalZZ;vec3 vSphericalXY;vec3 vSphericalYZ;vec3 vSphericalZX; +Y.IncludesShadersStore[iM] = rM; +var sM = "pbrUboDeclaration"; +var nM = `layout(std140,column_major) uniform;uniform Material {vec2 vAlbedoInfos;vec4 vAmbientInfos;vec2 vOpacityInfos;vec2 vEmissiveInfos;vec2 vLightmapInfos;vec3 vReflectivityInfos;vec2 vMicroSurfaceSamplerInfos;vec2 vReflectionInfos;vec2 vReflectionFilteringInfo;vec3 vReflectionPosition;vec3 vReflectionSize;vec3 vBumpInfos;mat4 albedoMatrix;mat4 ambientMatrix;mat4 opacityMatrix;mat4 emissiveMatrix;mat4 lightmapMatrix;mat4 reflectivityMatrix;mat4 microSurfaceSamplerMatrix;mat4 bumpMatrix;vec2 vTangentSpaceParams;mat4 reflectionMatrix;vec3 vReflectionColor;vec4 vAlbedoColor;vec4 vLightingIntensity;vec3 vReflectionMicrosurfaceInfos;float pointSize;vec4 vReflectivityColor;vec3 vEmissiveColor;vec3 vAmbientColor;vec2 vDebugMode;vec4 vMetallicReflectanceFactors;vec2 vMetallicReflectanceInfos;mat4 metallicReflectanceMatrix;vec2 vReflectanceInfos;mat4 reflectanceMatrix;vec3 vSphericalL00;vec3 vSphericalL1_1;vec3 vSphericalL10;vec3 vSphericalL11;vec3 vSphericalL2_2;vec3 vSphericalL2_1;vec3 vSphericalL20;vec3 vSphericalL21;vec3 vSphericalL22;vec3 vSphericalX;vec3 vSphericalY;vec3 vSphericalZ;vec3 vSphericalXX_ZZ;vec3 vSphericalYY_ZZ;vec3 vSphericalZZ;vec3 vSphericalXY;vec3 vSphericalYZ;vec3 vSphericalZX; #define ADDITIONAL_UBO_DECLARATION }; #include #include `; -Y.IncludesShadersStore[rM] = sM; -var nM = "pbrFragmentExtraDeclaration"; -var aM = `varying vec3 vPositionW; +Y.IncludesShadersStore[sM] = nM; +var aM = "pbrFragmentExtraDeclaration"; +var oM = `varying vec3 vPositionW; #if DEBUGMODE>0 varying vec4 vClipSpacePosition; #endif @@ -52633,9 +52634,9 @@ varying vec3 vEnvironmentIrradiance; varying vec4 vColor; #endif `; -Y.IncludesShadersStore[nM] = aM; -var oM = "samplerFragmentAlternateDeclaration"; -var lM = `#ifdef _DEFINENAME_ +Y.IncludesShadersStore[aM] = oM; +var lM = "samplerFragmentAlternateDeclaration"; +var cM = `#ifdef _DEFINENAME_ #if _DEFINENAME_DIRECTUV==1 #define v_VARYINGNAME_UV vMainUV1 #elif _DEFINENAME_DIRECTUV==2 @@ -52653,9 +52654,9 @@ varying vec2 v_VARYINGNAME_UV; #endif #endif `; -Y.IncludesShadersStore[oM] = lM; -var cM = "pbrFragmentSamplersDeclaration"; -var hM = `#include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_SAMPLERNAME_,albedo) +Y.IncludesShadersStore[lM] = cM; +var hM = "pbrFragmentSamplersDeclaration"; +var uM = `#include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_SAMPLERNAME_,albedo) #include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_SAMPLERNAME_,ambient) #include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_SAMPLERNAME_,opacity) #include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_SAMPLERNAME_,emissive) @@ -52748,19 +52749,19 @@ uniform sampler2D refractionSamplerLow;uniform sampler2D refractionSamplerHigh; #include(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity,_SAMPLERNAME_,translucencyIntensity) #endif `; -Y.IncludesShadersStore[cM] = hM; -var uM = "subSurfaceScatteringFunctions"; -var fM = `bool testLightingForSSS(float diffusionProfile) +Y.IncludesShadersStore[hM] = uM; +var fM = "subSurfaceScatteringFunctions"; +var dM = `bool testLightingForSSS(float diffusionProfile) {return diffusionProfile<1.;}`; -Y.IncludesShadersStore[uM] = fM; -var dM = "importanceSampling"; -var pM = `vec3 hemisphereCosSample(vec2 u) {float phi=2.*PI*u.x;float cosTheta2=1.-u.y;float cosTheta=sqrt(cosTheta2);float sinTheta=sqrt(1.-cosTheta2);return vec3(sinTheta*cos(phi),sinTheta*sin(phi),cosTheta);} +Y.IncludesShadersStore[fM] = dM; +var pM = "importanceSampling"; +var gM = `vec3 hemisphereCosSample(vec2 u) {float phi=2.*PI*u.x;float cosTheta2=1.-u.y;float cosTheta=sqrt(cosTheta2);float sinTheta=sqrt(1.-cosTheta2);return vec3(sinTheta*cos(phi),sinTheta*sin(phi),cosTheta);} vec3 hemisphereImportanceSampleDggx(vec2 u,float a) {float phi=2.*PI*u.x;float cosTheta2=(1.-u.y)/(1.+(a+1.)*((a-1.)*u.y));float cosTheta=sqrt(cosTheta2);float sinTheta=sqrt(1.-cosTheta2);return vec3(sinTheta*cos(phi),sinTheta*sin(phi),cosTheta);} vec3 hemisphereImportanceSampleDCharlie(vec2 u,float a) { float phi=2.*PI*u.x;float sinTheta=pow(u.y,a/(2.*a+1.));float cosTheta=sqrt(1.-sinTheta*sinTheta);return vec3(sinTheta*cos(phi),sinTheta*sin(phi),cosTheta);}`; -Y.IncludesShadersStore[dM] = pM; -var gM = "pbrHelperFunctions"; -var mM = `#define MINIMUMVARIANCE 0.0005 +Y.IncludesShadersStore[pM] = gM; +var mM = "pbrHelperFunctions"; +var _M = `#define MINIMUMVARIANCE 0.0005 float convertRoughnessToAverageSlope(float roughness) {return square(roughness)+MINIMUMVARIANCE;} float fresnelGrazingReflectance(float reflectance0) {float reflectance90=saturate(reflectance0*25.0);return reflectance90;} @@ -52793,9 +52794,9 @@ float computeDefaultMicroSurface(float microSurface,vec3 reflectivityColor) {const float kReflectivityNoAlphaWorkflow_SmoothnessMax=0.95;float reflectivityLuminance=getLuminance(reflectivityColor);float reflectivityLuma=sqrt(reflectivityLuminance);microSurface=reflectivityLuma*kReflectivityNoAlphaWorkflow_SmoothnessMax;return microSurface;} #endif `; -Y.IncludesShadersStore[gM] = mM; -var _M = "harmonicsFunctions"; -var EM = `#ifdef USESPHERICALFROMREFLECTIONMAP +Y.IncludesShadersStore[mM] = _M; +var EM = "harmonicsFunctions"; +var vM = `#ifdef USESPHERICALFROMREFLECTIONMAP #ifdef SPHERICAL_HARMONICS vec3 computeEnvironmentIrradiance(vec3 normal) {return vSphericalL00 + vSphericalL1_1*(normal.y) @@ -52811,9 +52812,9 @@ vec3 computeEnvironmentIrradiance(vec3 normal) {float Nx=normal.x;float Ny=norma #endif #endif `; -Y.IncludesShadersStore[_M] = EM; -var vM = "pbrDirectLightingSetupFunctions"; -var TM = `struct preLightingInfo +Y.IncludesShadersStore[EM] = vM; +var TM = "pbrDirectLightingSetupFunctions"; +var xM = `struct preLightingInfo {vec3 lightOffset;float lightDistanceSquared;float lightDistance;float attenuation;vec3 L;vec3 H;float NdotV;float NdotLUnclamped;float NdotL;float VdotH;float roughness; #ifdef IRIDESCENCE float iridescenceIntensity; @@ -52825,9 +52826,9 @@ preLightingInfo computeHemisphericPreLightingInfo(vec4 lightData,vec3 V,vec3 N) result.L=normalize(lightData.xyz);result.H=normalize(V+result.L);result.VdotH=saturate(dot(V,result.H)); #endif return result;}`; -Y.IncludesShadersStore[vM] = TM; -var xM = "pbrDirectLightingFalloffFunctions"; -var CM = `float computeDistanceLightFalloff_Standard(vec3 lightOffset,float range) +Y.IncludesShadersStore[TM] = xM; +var CM = "pbrDirectLightingFalloffFunctions"; +var RM = `float computeDistanceLightFalloff_Standard(vec3 lightOffset,float range) {return max(0.,1.0-length(lightOffset)/range);} float computeDistanceLightFalloff_Physical(float lightDistanceSquared) {return 1.0/maxEps(lightDistanceSquared);} @@ -52862,9 +52863,9 @@ return computeDirectionalLightFalloff_GLTF(lightDirection,directionToLightCenter return computeDirectionalLightFalloff_Standard(lightDirection,directionToLightCenterW,cosHalfAngle,exponent); #endif }`; -Y.IncludesShadersStore[xM] = CM; -var RM = "pbrBRDFFunctions"; -var SM = `#define FRESNEL_MAXIMUM_ON_ROUGH 0.25 +Y.IncludesShadersStore[CM] = RM; +var SM = "pbrBRDFFunctions"; +var yM = `#define FRESNEL_MAXIMUM_ON_ROUGH 0.25 #ifdef MS_BRDF_ENERGY_CONSERVATION vec3 getEnergyConservationFactor(const vec3 specularEnvironmentR0,const vec3 environmentBrdf) {return 1.0+specularEnvironmentR0*(1.0/environmentBrdf.y-1.0);} #endif @@ -52995,9 +52996,9 @@ vec3 transmittanceBRDF_Burley(const vec3 tintColor,const vec3 diffusionDistance, float computeWrappedDiffuseNdotL(float NdotL,float w) {float t=1.0+w;float invt2=1.0/square(t);return saturate((NdotL+w)*invt2);} #endif `; -Y.IncludesShadersStore[RM] = SM; -var yM = "hdrFilteringFunctions"; -var IM = `#ifdef NUM_SAMPLES +Y.IncludesShadersStore[SM] = yM; +var IM = "hdrFilteringFunctions"; +var bM = `#ifdef NUM_SAMPLES #if NUM_SAMPLES>0 #if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE) float radicalInverse_VdC(uint bits) @@ -53051,9 +53052,9 @@ result=result/weight;return result;}} #endif #endif `; -Y.IncludesShadersStore[yM] = IM; -var bM = "pbrDirectLightingFunctions"; -var AM = `#define CLEARCOATREFLECTANCE90 1.0 +Y.IncludesShadersStore[IM] = bM; +var AM = "pbrDirectLightingFunctions"; +var MM = `#define CLEARCOATREFLECTANCE90 1.0 struct lightingInfo {vec3 diffuse; #ifdef SPECULARTERM @@ -53114,9 +53115,9 @@ float visibility=visibility_Ashikhmin(info.NdotL,info.NdotV);/* #endif */ float sheenTerm=fresnel*distribution*visibility;return sheenTerm*info.attenuation*info.NdotL*lightColor;} #endif `; -Y.IncludesShadersStore[bM] = AM; -var MM = "pbrIBLFunctions"; -var PM = `#if defined(REFLECTION) || defined(SS_REFRACTION) +Y.IncludesShadersStore[AM] = MM; +var PM = "pbrIBLFunctions"; +var OM = `#if defined(REFLECTION) || defined(SS_REFRACTION) float getLodFromAlphaG(float cubeMapDimensionPixels,float microsurfaceAverageSlope) {float microsurfaceAverageSlopeTexels=cubeMapDimensionPixels*microsurfaceAverageSlope;float lod=log2(microsurfaceAverageSlopeTexels);return lod;} float getLinearLodFromRoughness(float cubeMapDimensionPixels,float roughness) {float lod=log2(cubeMapDimensionPixels)*roughness;return lod;} #endif @@ -53131,9 +53132,9 @@ float environmentHorizonOcclusion(vec3 view,vec3 normal,vec3 geometricNormal) {v float getLodFromAlphaG(float cubeMapDimensionPixels,float alphaG,float NdotV) {float microsurfaceAverageSlope=alphaG;microsurfaceAverageSlope*=sqrt(abs(NdotV));return getLodFromAlphaG(cubeMapDimensionPixels,microsurfaceAverageSlope);} #endif `; -Y.IncludesShadersStore[MM] = PM; -var OM = "pbrBlockAlbedoOpacity"; -var DM = `struct albedoOpacityOutParams +Y.IncludesShadersStore[PM] = OM; +var DM = "pbrBlockAlbedoOpacity"; +var NM = `struct albedoOpacityOutParams {vec3 surfaceAlbedo;float alpha;}; #define pbr_inline void albedoOpacityBlock( @@ -53205,9 +53206,9 @@ alpha=1.0; #endif outParams.surfaceAlbedo=surfaceAlbedo;outParams.alpha=alpha;} `; -Y.IncludesShadersStore[OM] = DM; -var NM = "pbrBlockReflectivity"; -var FM = `struct reflectivityOutParams +Y.IncludesShadersStore[DM] = NM; +var FM = "pbrBlockReflectivity"; +var LM = `struct reflectivityOutParams {float microSurface;float roughness;vec3 surfaceReflectivityColor; #ifdef METALLICWORKFLOW vec3 surfaceAlbedo; @@ -53318,9 +53319,9 @@ microSurface*=microSurfaceTexel.r; #endif microSurface=saturate(microSurface);float roughness=1.-microSurface;outParams.microSurface=microSurface;outParams.roughness=roughness;outParams.surfaceReflectivityColor=surfaceReflectivityColor;} `; -Y.IncludesShadersStore[NM] = FM; -var LM = "pbrBlockAmbientOcclusion"; -var wM = `struct ambientOcclusionOutParams +Y.IncludesShadersStore[FM] = LM; +var wM = "pbrBlockAmbientOcclusion"; +var UM = `struct ambientOcclusionOutParams {vec3 ambientOcclusionColor; #if DEBUGMODE>0 && defined(AMBIENT) vec3 ambientOcclusionColorMap; @@ -53347,9 +53348,9 @@ outParams.ambientOcclusionColorMap=ambientOcclusionColorMap; #endif outParams.ambientOcclusionColor=ambientOcclusionColor;} `; -Y.IncludesShadersStore[LM] = wM; -var UM = "pbrBlockAlphaFresnel"; -var VM = `#ifdef ALPHAFRESNEL +Y.IncludesShadersStore[wM] = UM; +var VM = "pbrBlockAlphaFresnel"; +var BM = `#ifdef ALPHAFRESNEL #if defined(ALPHATEST) || defined(ALPHABLEND) struct alphaFresnelOutParams {float alpha;}; @@ -53379,9 +53380,9 @@ outParams.alpha=1.0; #endif #endif `; -Y.IncludesShadersStore[UM] = VM; -var BM = "pbrBlockAnisotropic"; -var kM = `#ifdef ANISOTROPIC +Y.IncludesShadersStore[VM] = BM; +var kM = "pbrBlockAnisotropic"; +var zM = `#ifdef ANISOTROPIC struct anisotropicOutParams {float anisotropy;vec3 anisotropicTangent;vec3 anisotropicBitangent;vec3 anisotropicNormal; #if DEBUGMODE>0 && defined(ANISOTROPIC_TEXTURE) @@ -53416,9 +53417,9 @@ anisotropyDirection.xy=mat2(anisotropyDirection.x,anisotropyDirection.y,-anisotr mat3 anisoTBN=mat3(normalize(TBN[0]),normalize(TBN[1]),normalize(TBN[2]));vec3 anisotropicTangent=normalize(anisoTBN*anisotropyDirection);vec3 anisotropicBitangent=normalize(cross(anisoTBN[2],anisotropicTangent));outParams.anisotropy=anisotropy;outParams.anisotropicTangent=anisotropicTangent;outParams.anisotropicBitangent=anisotropicBitangent;outParams.anisotropicNormal=getAnisotropicBentNormals(anisotropicTangent,anisotropicBitangent,normalW,viewDirectionW,anisotropy,roughness);} #endif `; -Y.IncludesShadersStore[BM] = kM; -var zM = "pbrBlockReflection"; -var WM = `#ifdef REFLECTION +Y.IncludesShadersStore[kM] = zM; +var WM = "pbrBlockReflection"; +var GM = `#ifdef REFLECTION struct reflectionOutParams {vec4 environmentRadiance;vec3 environmentIrradiance; #ifdef REFLECTIONMAP_3D @@ -53666,9 +53667,9 @@ environmentIrradiance.rgb=toLinearSpace(environmentIrradiance.rgb); environmentIrradiance*=vReflectionColor.rgb;outParams.environmentRadiance=environmentRadiance;outParams.environmentIrradiance=environmentIrradiance;outParams.reflectionCoords=reflectionCoords;} #endif `; -Y.IncludesShadersStore[zM] = WM; -var GM = "pbrBlockSheen"; -var XM = `#ifdef SHEEN +Y.IncludesShadersStore[WM] = GM; +var XM = "pbrBlockSheen"; +var HM = `#ifdef SHEEN struct sheenOutParams {float sheenIntensity;vec3 sheenColor;float sheenRoughness; #ifdef SHEEN_LINKWITHALBEDO @@ -53851,9 +53852,9 @@ outParams.sheenAlbedoScaling=1.0-sheenIntensity*max(max(sheenColor.r,sheenColor. outParams.sheenIntensity=sheenIntensity;outParams.sheenColor=sheenColor;outParams.sheenRoughness=sheenRoughness;} #endif `; -Y.IncludesShadersStore[GM] = XM; -var HM = "pbrBlockClearcoat"; -var KM = `struct clearcoatOutParams +Y.IncludesShadersStore[XM] = HM; +var KM = "pbrBlockClearcoat"; +var qM = `struct clearcoatOutParams {vec3 specularEnvironmentR0;float conservationFactor;vec3 clearCoatNormalW;vec2 clearCoatAARoughnessFactors;float clearCoatIntensity;float clearCoatRoughness; #ifdef REFLECTION vec3 finalClearCoatRadianceScaled; @@ -54101,9 +54102,9 @@ outParams.energyConservationFactorClearCoat=getEnergyConservationFactor(outParam } #endif `; -Y.IncludesShadersStore[HM] = KM; -var qM = "pbrBlockIridescence"; -var YM = `struct iridescenceOutParams +Y.IncludesShadersStore[KM] = qM; +var YM = "pbrBlockIridescence"; +var ZM = `struct iridescenceOutParams {float iridescenceIntensity;float iridescenceIOR;float iridescenceThickness;vec3 specularEnvironmentR0;}; #ifdef IRIDESCENCE #define pbr_inline @@ -54147,9 +54148,9 @@ topIor=mix(1.0,vClearCoatRefractionParams.w-1.,clearCoatIntensity);viewAngle=sqr vec3 iridescenceFresnel=evalIridescence(topIor,iridescenceIOR,viewAngle,iridescenceThickness,specularEnvironmentR0);outParams.specularEnvironmentR0=mix(specularEnvironmentR0,iridescenceFresnel,iridescenceIntensity);outParams.iridescenceIntensity=iridescenceIntensity;outParams.iridescenceThickness=iridescenceThickness;outParams.iridescenceIOR=iridescenceIOR;} #endif `; -Y.IncludesShadersStore[qM] = YM; -var ZM = "pbrBlockSubSurface"; -var jM = `struct subSurfaceOutParams +Y.IncludesShadersStore[YM] = ZM; +var jM = "pbrBlockSubSurface"; +var QM = `struct subSurfaceOutParams {vec3 specularEnvironmentReflectance; #ifdef SS_REFRACTION vec3 finalRefraction;vec3 surfaceAlbedo; @@ -54530,9 +54531,9 @@ outParams.refractionIrradiance=refractionIrradiance.rgb; } #endif `; -Y.IncludesShadersStore[ZM] = jM; -var QM = "pbrBlockNormalGeometric"; -var JM = `vec3 viewDirectionW=normalize(vEyePosition.xyz-vPositionW); +Y.IncludesShadersStore[jM] = QM; +var JM = "pbrBlockNormalGeometric"; +var $M = `vec3 viewDirectionW=normalize(vEyePosition.xyz-vPositionW); #ifdef NORMAL vec3 normalW=normalize(vNormalW); #else @@ -54543,9 +54544,9 @@ vec3 geometricNormalW=normalW; geometricNormalW=gl_FrontFacing ? geometricNormalW : -geometricNormalW; #endif `; -Y.IncludesShadersStore[QM] = JM; -var $M = "pbrBlockNormalFinal"; -var eP = `#if defined(FORCENORMALFORWARD) && defined(NORMAL) +Y.IncludesShadersStore[JM] = $M; +var eP = "pbrBlockNormalFinal"; +var tP = `#if defined(FORCENORMALFORWARD) && defined(NORMAL) vec3 faceNormal=normalize(cross(dFdx(vPositionW),dFdy(vPositionW)))*vEyePosition.w; #if defined(TWOSIDEDLIGHTING) faceNormal=gl_FrontFacing ? faceNormal : -faceNormal; @@ -54556,9 +54557,9 @@ normalW*=sign(dot(normalW,faceNormal)); normalW=gl_FrontFacing ? normalW : -normalW; #endif `; -Y.IncludesShadersStore[$M] = eP; -var tP = "pbrBlockLightmapInit"; -var iP = `#ifdef LIGHTMAP +Y.IncludesShadersStore[eP] = tP; +var iP = "pbrBlockLightmapInit"; +var rP = `#ifdef LIGHTMAP vec4 lightmapColor=texture2D(lightmapSampler,vLightmapUV+uvOffset); #ifdef RGBDLIGHTMAP lightmapColor.rgb=fromRGBD(lightmapColor); @@ -54569,9 +54570,9 @@ lightmapColor.rgb=toLinearSpace(lightmapColor.rgb); lightmapColor.rgb*=vLightmapInfos.y; #endif `; -Y.IncludesShadersStore[tP] = iP; -var rP = "pbrBlockGeometryInfo"; -var sP = `float NdotVUnclamped=dot(normalW,viewDirectionW);float NdotV=absEps(NdotVUnclamped);float alphaG=convertRoughnessToAverageSlope(roughness);vec2 AARoughnessFactors=getAARoughnessFactors(normalW.xyz); +Y.IncludesShadersStore[iP] = rP; +var sP = "pbrBlockGeometryInfo"; +var nP = `float NdotVUnclamped=dot(normalW,viewDirectionW);float NdotV=absEps(NdotVUnclamped);float alphaG=convertRoughnessToAverageSlope(roughness);vec2 AARoughnessFactors=getAARoughnessFactors(normalW.xyz); #ifdef SPECULARAA alphaG+=AARoughnessFactors.y; #endif @@ -54596,9 +54597,9 @@ float eho=environmentHorizonOcclusion(-viewDirectionW,normalW,geometricNormalW); #endif #endif `; -Y.IncludesShadersStore[rP] = sP; -var nP = "pbrBlockReflectance0"; -var aP = `float reflectance=max(max(reflectivityOut.surfaceReflectivityColor.r,reflectivityOut.surfaceReflectivityColor.g),reflectivityOut.surfaceReflectivityColor.b);vec3 specularEnvironmentR0=reflectivityOut.surfaceReflectivityColor.rgb; +Y.IncludesShadersStore[sP] = nP; +var aP = "pbrBlockReflectance0"; +var oP = `float reflectance=max(max(reflectivityOut.surfaceReflectivityColor.r,reflectivityOut.surfaceReflectivityColor.g),reflectivityOut.surfaceReflectivityColor.b);vec3 specularEnvironmentR0=reflectivityOut.surfaceReflectivityColor.rgb; #ifdef METALLICWORKFLOW vec3 specularEnvironmentR90=vec3(metallicReflectanceFactors.a); #else @@ -54608,9 +54609,9 @@ vec3 specularEnvironmentR90=vec3(1.0,1.0,1.0); float reflectance90=fresnelGrazingReflectance(reflectance);specularEnvironmentR90=specularEnvironmentR90*reflectance90; #endif `; -Y.IncludesShadersStore[nP] = aP; -var oP = "pbrBlockReflectance"; -var lP = `#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX) +Y.IncludesShadersStore[aP] = oP; +var lP = "pbrBlockReflectance"; +var cP = `#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX) vec3 specularEnvironmentReflectance=getReflectanceFromBRDFLookup(clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,environmentBrdf); #ifdef RADIANCEOCCLUSION specularEnvironmentReflectance*=seo; @@ -54632,9 +54633,9 @@ specularEnvironmentReflectance*=clearcoatOut.absorption; #endif #endif `; -Y.IncludesShadersStore[oP] = lP; -var cP = "pbrBlockDirectLighting"; -var hP = `vec3 diffuseBase=vec3(0.,0.,0.); +Y.IncludesShadersStore[lP] = cP; +var hP = "pbrBlockDirectLighting"; +var uP = `vec3 diffuseBase=vec3(0.,0.,0.); #ifdef SPECULARTERM vec3 specularBase=vec3(0.,0.,0.); #endif @@ -54650,9 +54651,9 @@ float aggShadow=0.;float numLights=0.; vec3 absorption=vec3(0.); #endif `; -Y.IncludesShadersStore[cP] = hP; -var uP = "pbrBlockFinalLitComponents"; -var fP = `aggShadow=aggShadow/numLights; +Y.IncludesShadersStore[hP] = uP; +var fP = "pbrBlockFinalLitComponents"; +var dP = `aggShadow=aggShadow/numLights; #if defined(ENVIRONMENTBRDF) #ifdef MS_BRDF_ENERGY_CONSERVATION vec3 energyConservationFactor=getEnergyConservationFactor(clearcoatOut.specularEnvironmentR0,environmentBrdf); @@ -54740,9 +54741,9 @@ alpha=saturate(alpha+luminanceOverAlpha*luminanceOverAlpha); #endif #endif `; -Y.IncludesShadersStore[uP] = fP; -var dP = "pbrBlockFinalUnlitComponents"; -var pP = `vec3 finalDiffuse=diffuseBase;finalDiffuse*=surfaceAlbedo.rgb;finalDiffuse=max(finalDiffuse,0.0);finalDiffuse*=vLightingIntensity.x;vec3 finalAmbient=vAmbientColor;finalAmbient*=surfaceAlbedo.rgb;vec3 finalEmissive=vEmissiveColor; +Y.IncludesShadersStore[fP] = dP; +var pP = "pbrBlockFinalUnlitComponents"; +var gP = `vec3 finalDiffuse=diffuseBase;finalDiffuse*=surfaceAlbedo.rgb;finalDiffuse=max(finalDiffuse,0.0);finalDiffuse*=vLightingIntensity.x;vec3 finalAmbient=vAmbientColor;finalAmbient*=surfaceAlbedo.rgb;vec3 finalEmissive=vEmissiveColor; #ifdef EMISSIVE vec3 emissiveColorTex=texture2D(emissiveSampler,vEmissiveUV+uvOffset).rgb; #ifdef GAMMAEMISSIVE @@ -54760,9 +54761,9 @@ vec3 ambientOcclusionForDirectDiffuse=aoOut.ambientOcclusionColor; #endif finalAmbient*=aoOut.ambientOcclusionColor;finalDiffuse*=ambientOcclusionForDirectDiffuse; `; -Y.IncludesShadersStore[dP] = pP; -var gP = "pbrBlockFinalColorComposition"; -var mP = `vec4 finalColor=vec4( +Y.IncludesShadersStore[pP] = gP; +var mP = "pbrBlockFinalColorComposition"; +var _P = `vec4 finalColor=vec4( #ifndef UNLIT #ifdef REFLECTION finalIrradiance + @@ -54805,9 +54806,9 @@ finalColor.rgb+=finalEmissive; #define CUSTOM_FRAGMENT_BEFORE_FOG finalColor=max(finalColor,0.0); `; -Y.IncludesShadersStore[gP] = mP; -var _P = "pbrBlockImageProcessing"; -var EP = `#if defined(IMAGEPROCESSINGPOSTPROCESS) || defined(SS_SCATTERING) +Y.IncludesShadersStore[mP] = _P; +var EP = "pbrBlockImageProcessing"; +var vP = `#if defined(IMAGEPROCESSINGPOSTPROCESS) || defined(SS_SCATTERING) #if !defined(SKIPFINALCOLORCLAMP) finalColor.rgb=clamp(finalColor.rgb,0.,30.0); #endif @@ -54819,9 +54820,9 @@ finalColor.a*=visibility; finalColor.rgb*=finalColor.a; #endif `; -Y.IncludesShadersStore[_P] = EP; -var vP = "pbrDebug"; -var TP = `#if DEBUGMODE>0 +Y.IncludesShadersStore[EP] = vP; +var TP = "pbrDebug"; +var xP = `#if DEBUGMODE>0 if (vClipSpacePosition.x/vClipSpacePosition.w>=vDebugMode.x) { #if DEBUGMODE==1 gl_FragColor.rgb=vPositionW.rgb; @@ -55006,9 +55007,9 @@ return; } #endif `; -Y.IncludesShadersStore[vP] = TP; -var xP = "pbrPixelShader"; -var CP = `#if defined(BUMP) || !defined(NORMAL) || defined(FORCENORMALFORWARD) || defined(SPECULARAA) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) +Y.IncludesShadersStore[TP] = xP; +var CP = "pbrPixelShader"; +var RP = `#if defined(BUMP) || !defined(NORMAL) || defined(FORCENORMALFORWARD) || defined(SPECULARAA) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) #extension GL_OES_standard_derivatives : enable #endif #ifdef LODBASEDMICROSFURACE @@ -55585,9 +55586,9 @@ if (fragDepth==nearestDepth) {frontColor.rgb+=finalColor.rgb*finalColor.a*alphaM #define CUSTOM_FRAGMENT_MAIN_END } `; -Y.ShadersStore[xP] = CP; -var RP = "pbrVertexDeclaration"; -var SP = `uniform mat4 view;uniform mat4 viewProjection; +Y.ShadersStore[CP] = RP; +var SP = "pbrVertexDeclaration"; +var yP = `uniform mat4 view;uniform mat4 viewProjection; #ifdef ALBEDO uniform mat4 albedoMatrix;uniform vec2 vAlbedoInfos; #endif @@ -55699,9 +55700,9 @@ uniform vec4 vDetailInfos;uniform mat4 detailMatrix; #include #define ADDITIONAL_VERTEX_DECLARATION `; -Y.IncludesShadersStore[RP] = SP; -var yP = "pbrVertexShader"; -var IP = `precision highp float; +Y.IncludesShadersStore[SP] = yP; +var IP = "pbrVertexShader"; +var bP = `precision highp float; #include<__decl__pbrVertex> #define CUSTOM_VERTEX_BEGIN attribute vec3 position; @@ -55895,19 +55896,19 @@ gl_PointSize=pointSize; #include #define CUSTOM_VERTEX_MAIN_END }`; -Y.ShadersStore[yP] = IP; -var bP = class extends es { +Y.ShadersStore[IP] = bP; +var AP = class extends es { constructor() { super(...arguments), this.CLEARCOAT = false, this.CLEARCOAT_DEFAULTIOR = false, this.CLEARCOAT_TEXTURE = false, this.CLEARCOAT_TEXTURE_ROUGHNESS = false, this.CLEARCOAT_TEXTUREDIRECTUV = 0, this.CLEARCOAT_TEXTURE_ROUGHNESSDIRECTUV = 0, this.CLEARCOAT_BUMP = false, this.CLEARCOAT_BUMPDIRECTUV = 0, this.CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE = false, this.CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL = false, this.CLEARCOAT_REMAP_F0 = false, this.CLEARCOAT_TINT = false, this.CLEARCOAT_TINT_TEXTURE = false, this.CLEARCOAT_TINT_TEXTUREDIRECTUV = 0, this.CLEARCOAT_TINT_GAMMATEXTURE = false; } }; -var Si = class _Si extends wr { +var Si = class _Si extends Ur { /** @internal */ _markAllSubMeshesAsTexturesDirty() { this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty(); } constructor(e, t = true) { - super(e, "PBRClearCoat", 100, new bP(), t), this._isEnabled = false, this.isEnabled = false, this.intensity = 1, this.roughness = 0, this._indexOfRefraction = _Si._DefaultIndexOfRefraction, this.indexOfRefraction = _Si._DefaultIndexOfRefraction, this._texture = null, this.texture = null, this._useRoughnessFromMainTexture = true, this.useRoughnessFromMainTexture = true, this._textureRoughness = null, this.textureRoughness = null, this._remapF0OnInterfaceChange = true, this.remapF0OnInterfaceChange = true, this._bumpTexture = null, this.bumpTexture = null, this._isTintEnabled = false, this.isTintEnabled = false, this.tintColor = Ne.White(), this.tintColorAtDistance = 1, this.tintThickness = 1, this._tintTexture = null, this.tintTexture = null, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1]; + super(e, "PBRClearCoat", 100, new AP(), t), this._isEnabled = false, this.isEnabled = false, this.intensity = 1, this.roughness = 0, this._indexOfRefraction = _Si._DefaultIndexOfRefraction, this.indexOfRefraction = _Si._DefaultIndexOfRefraction, this._texture = null, this.texture = null, this._useRoughnessFromMainTexture = true, this.useRoughnessFromMainTexture = true, this._textureRoughness = null, this.textureRoughness = null, this._remapF0OnInterfaceChange = true, this.remapF0OnInterfaceChange = true, this._bumpTexture = null, this.bumpTexture = null, this._isTintEnabled = false, this.isTintEnabled = false, this.tintColor = Ne.White(), this.tintColorAtDistance = 1, this.tintThickness = 1, this._tintTexture = null, this.tintTexture = null, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1]; } isReadyForSubMesh(e, t, i) { if (!this._isEnabled) @@ -55974,17 +55975,17 @@ var Si = class _Si extends wr { }; Si._DefaultIndexOfRefraction = 1.5; P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], Si.prototype, "isEnabled", void 0); P([ - U() + w() ], Si.prototype, "intensity", void 0); P([ - U() + w() ], Si.prototype, "roughness", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], Si.prototype, "indexOfRefraction", void 0); P([ @@ -55992,7 +55993,7 @@ P([ oe("_markAllSubMeshesAsTexturesDirty") ], Si.prototype, "texture", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], Si.prototype, "useRoughnessFromMainTexture", void 0); P([ @@ -56000,7 +56001,7 @@ P([ oe("_markAllSubMeshesAsTexturesDirty") ], Si.prototype, "textureRoughness", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], Si.prototype, "remapF0OnInterfaceChange", void 0); P([ @@ -56008,34 +56009,34 @@ P([ oe("_markAllSubMeshesAsTexturesDirty") ], Si.prototype, "bumpTexture", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], Si.prototype, "isTintEnabled", void 0); P([ $i() ], Si.prototype, "tintColor", void 0); P([ - U() + w() ], Si.prototype, "tintColorAtDistance", void 0); P([ - U() + w() ], Si.prototype, "tintThickness", void 0); P([ Tt(), oe("_markAllSubMeshesAsTexturesDirty") ], Si.prototype, "tintTexture", void 0); -var AP = class extends es { +var MP = class extends es { constructor() { super(...arguments), this.IRIDESCENCE = false, this.IRIDESCENCE_TEXTURE = false, this.IRIDESCENCE_TEXTUREDIRECTUV = 0, this.IRIDESCENCE_THICKNESS_TEXTURE = false, this.IRIDESCENCE_THICKNESS_TEXTUREDIRECTUV = 0, this.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE = false; } }; -var or = class _or extends wr { +var lr = class _lr extends Ur { /** @internal */ _markAllSubMeshesAsTexturesDirty() { this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty(); } constructor(e, t = true) { - super(e, "PBRIridescence", 110, new AP(), t), this._isEnabled = false, this.isEnabled = false, this.intensity = 1, this.minimumThickness = _or._DefaultMinimumThickness, this.maximumThickness = _or._DefaultMaximumThickness, this.indexOfRefraction = _or._DefaultIndexOfRefraction, this._texture = null, this.texture = null, this._thicknessTexture = null, this.thicknessTexture = null, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1]; + super(e, "PBRIridescence", 110, new MP(), t), this._isEnabled = false, this.isEnabled = false, this.intensity = 1, this.minimumThickness = _lr._DefaultMinimumThickness, this.maximumThickness = _lr._DefaultMaximumThickness, this.indexOfRefraction = _lr._DefaultIndexOfRefraction, this._texture = null, this.texture = null, this._thicknessTexture = null, this.thicknessTexture = null, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1]; } isReadyForSubMesh(e, t) { return this._isEnabled ? !(e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.IridescenceTextureEnabled && !this._texture.isReadyOrNotBlocking() || this._thicknessTexture && ae.IridescenceTextureEnabled && !this._thicknessTexture.isReadyOrNotBlocking())) : true; @@ -56084,39 +56085,39 @@ var or = class _or extends wr { }; } }; -or._DefaultMinimumThickness = 100; -or._DefaultMaximumThickness = 400; -or._DefaultIndexOfRefraction = 1.3; +lr._DefaultMinimumThickness = 100; +lr._DefaultMaximumThickness = 400; +lr._DefaultIndexOfRefraction = 1.3; P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") -], or.prototype, "isEnabled", void 0); +], lr.prototype, "isEnabled", void 0); P([ - U() -], or.prototype, "intensity", void 0); + w() +], lr.prototype, "intensity", void 0); P([ - U() -], or.prototype, "minimumThickness", void 0); + w() +], lr.prototype, "minimumThickness", void 0); P([ - U() -], or.prototype, "maximumThickness", void 0); + w() +], lr.prototype, "maximumThickness", void 0); P([ - U() -], or.prototype, "indexOfRefraction", void 0); + w() +], lr.prototype, "indexOfRefraction", void 0); P([ Tt(), oe("_markAllSubMeshesAsTexturesDirty") -], or.prototype, "texture", void 0); +], lr.prototype, "texture", void 0); P([ Tt(), oe("_markAllSubMeshesAsTexturesDirty") -], or.prototype, "thicknessTexture", void 0); -var MP = class extends es { +], lr.prototype, "thicknessTexture", void 0); +var PP = class extends es { constructor() { super(...arguments), this.ANISOTROPIC = false, this.ANISOTROPIC_TEXTURE = false, this.ANISOTROPIC_TEXTUREDIRECTUV = 0, this.ANISOTROPIC_LEGACY = false, this.MAINUV1 = false; } }; -var Wa = class extends wr { +var Wa = class extends Ur { /** * Sets the anisotropy direction as an angle. */ @@ -56139,7 +56140,7 @@ var Wa = class extends wr { this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsMiscDirty(); } constructor(e, t = true) { - super(e, "PBRAnisotropic", 110, new MP(), t), this._isEnabled = false, this.isEnabled = false, this.intensity = 1, this.direction = new me(1, 0), this._texture = null, this.texture = null, this._legacy = false, this.legacy = false, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1], this._internalMarkAllSubMeshesAsMiscDirty = e._dirtyCallbacks[16]; + super(e, "PBRAnisotropic", 110, new PP(), t), this._isEnabled = false, this.isEnabled = false, this.intensity = 1, this.direction = new me(1, 0), this._texture = null, this.texture = null, this._legacy = false, this.legacy = false, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1], this._internalMarkAllSubMeshesAsMiscDirty = e._dirtyCallbacks[16]; } isReadyForSubMesh(e, t) { return this._isEnabled ? !(e._areTexturesDirty && t.texturesEnabled && this._texture && ae.AnisotropicTextureEnabled && !this._texture.isReadyOrNotBlocking()) : true; @@ -56194,11 +56195,11 @@ var Wa = class extends wr { } }; P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], Wa.prototype, "isEnabled", void 0); P([ - U() + w() ], Wa.prototype, "intensity", void 0); P([ X_() @@ -56208,21 +56209,21 @@ P([ oe("_markAllSubMeshesAsTexturesDirty") ], Wa.prototype, "texture", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsMiscDirty") ], Wa.prototype, "legacy", void 0); -var PP = class extends es { +var OP = class extends es { constructor() { super(...arguments), this.SHEEN = false, this.SHEEN_TEXTURE = false, this.SHEEN_GAMMATEXTURE = false, this.SHEEN_TEXTURE_ROUGHNESS = false, this.SHEEN_TEXTUREDIRECTUV = 0, this.SHEEN_TEXTURE_ROUGHNESSDIRECTUV = 0, this.SHEEN_LINKWITHALBEDO = false, this.SHEEN_ROUGHNESS = false, this.SHEEN_ALBEDOSCALING = false, this.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE = false, this.SHEEN_TEXTURE_ROUGHNESS_IDENTICAL = false; } }; -var _s = class extends wr { +var _s = class extends Ur { /** @internal */ _markAllSubMeshesAsTexturesDirty() { this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty(); } constructor(e, t = true) { - super(e, "Sheen", 120, new PP(), t), this._isEnabled = false, this.isEnabled = false, this._linkSheenWithAlbedo = false, this.linkSheenWithAlbedo = false, this.intensity = 1, this.color = Ne.White(), this._texture = null, this.texture = null, this._useRoughnessFromMainTexture = true, this.useRoughnessFromMainTexture = true, this._roughness = null, this.roughness = null, this._textureRoughness = null, this.textureRoughness = null, this._albedoScaling = false, this.albedoScaling = false, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1]; + super(e, "Sheen", 120, new OP(), t), this._isEnabled = false, this.isEnabled = false, this._linkSheenWithAlbedo = false, this.linkSheenWithAlbedo = false, this.intensity = 1, this.color = Ne.White(), this._texture = null, this.texture = null, this._useRoughnessFromMainTexture = true, this.useRoughnessFromMainTexture = true, this._roughness = null, this.roughness = null, this._textureRoughness = null, this.textureRoughness = null, this._albedoScaling = false, this.albedoScaling = false, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1]; } isReadyForSubMesh(e, t) { return this._isEnabled ? !(e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.SheenTextureEnabled && !this._texture.isReadyOrNotBlocking() || this._textureRoughness && ae.SheenTextureEnabled && !this._textureRoughness.isReadyOrNotBlocking())) : true; @@ -56273,15 +56274,15 @@ var _s = class extends wr { } }; P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], _s.prototype, "isEnabled", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], _s.prototype, "linkSheenWithAlbedo", void 0); P([ - U() + w() ], _s.prototype, "intensity", void 0); P([ $i() @@ -56291,11 +56292,11 @@ P([ oe("_markAllSubMeshesAsTexturesDirty") ], _s.prototype, "texture", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], _s.prototype, "useRoughnessFromMainTexture", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], _s.prototype, "roughness", void 0); P([ @@ -56303,15 +56304,15 @@ P([ oe("_markAllSubMeshesAsTexturesDirty") ], _s.prototype, "textureRoughness", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], _s.prototype, "albedoScaling", void 0); -var OP = class extends es { +var DP = class extends es { constructor() { super(...arguments), this.SUBSURFACE = false, this.SS_REFRACTION = false, this.SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE = false, this.SS_TRANSLUCENCY = false, this.SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE = false, this.SS_SCATTERING = false, this.SS_DISPERSION = false, this.SS_THICKNESSANDMASK_TEXTURE = false, this.SS_THICKNESSANDMASK_TEXTUREDIRECTUV = 0, this.SS_HAS_THICKNESS = false, this.SS_REFRACTIONINTENSITY_TEXTURE = false, this.SS_REFRACTIONINTENSITY_TEXTUREDIRECTUV = 0, this.SS_TRANSLUCENCYINTENSITY_TEXTURE = false, this.SS_TRANSLUCENCYINTENSITY_TEXTUREDIRECTUV = 0, this.SS_REFRACTIONMAP_3D = false, this.SS_REFRACTIONMAP_OPPOSITEZ = false, this.SS_LODINREFRACTIONALPHA = false, this.SS_GAMMAREFRACTION = false, this.SS_RGBDREFRACTION = false, this.SS_LINEARSPECULARREFRACTION = false, this.SS_LINKREFRACTIONTOTRANSPARENCY = false, this.SS_ALBEDOFORREFRACTIONTINT = false, this.SS_ALBEDOFORTRANSLUCENCYTINT = false, this.SS_USE_LOCAL_REFRACTIONMAP_CUBIC = false, this.SS_USE_THICKNESS_AS_DEPTH = false, this.SS_MASK_FROM_THICKNESS_TEXTURE = false, this.SS_USE_GLTF_TEXTURES = false; } }; -var qt = class extends wr { +var Yt = class extends Ur { /** * Diffusion profile for subsurface scattering. * Useful for better scattering in the skins or foliages. @@ -56344,7 +56345,7 @@ var qt = class extends wr { this._internalMarkAllSubMeshesAsTexturesDirty(), this._internalMarkScenePrePassDirty(); } constructor(e, t = true) { - super(e, "PBRSubSurface", 130, new OP(), t), this._isRefractionEnabled = false, this.isRefractionEnabled = false, this._isTranslucencyEnabled = false, this.isTranslucencyEnabled = false, this._isDispersionEnabled = false, this.isDispersionEnabled = false, this._isScatteringEnabled = false, this.isScatteringEnabled = false, this._scatteringDiffusionProfileIndex = 0, this.refractionIntensity = 1, this.translucencyIntensity = 1, this.useAlbedoToTintRefraction = false, this.useAlbedoToTintTranslucency = false, this._thicknessTexture = null, this.thicknessTexture = null, this._refractionTexture = null, this.refractionTexture = null, this._indexOfRefraction = 1.5, this.indexOfRefraction = 1.5, this._volumeIndexOfRefraction = -1, this._invertRefractionY = false, this.invertRefractionY = false, this._linkRefractionWithTransparency = false, this.linkRefractionWithTransparency = false, this.minimumThickness = 0, this.maximumThickness = 1, this.useThicknessAsDepth = false, this.tintColor = Ne.White(), this.tintColorAtDistance = 1, this.dispersion = 0, this.diffusionDistance = Ne.White(), this._useMaskFromThicknessTexture = false, this.useMaskFromThicknessTexture = false, this._refractionIntensityTexture = null, this.refractionIntensityTexture = null, this._translucencyIntensityTexture = null, this.translucencyIntensityTexture = null, this._useGltfStyleTextures = false, this.useGltfStyleTextures = false, this._scene = e.getScene(), this.registerForExtraEvents = true, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1], this._internalMarkScenePrePassDirty = e._dirtyCallbacks[32]; + super(e, "PBRSubSurface", 130, new DP(), t), this._isRefractionEnabled = false, this.isRefractionEnabled = false, this._isTranslucencyEnabled = false, this.isTranslucencyEnabled = false, this._isDispersionEnabled = false, this.isDispersionEnabled = false, this._isScatteringEnabled = false, this.isScatteringEnabled = false, this._scatteringDiffusionProfileIndex = 0, this.refractionIntensity = 1, this.translucencyIntensity = 1, this.useAlbedoToTintRefraction = false, this.useAlbedoToTintTranslucency = false, this._thicknessTexture = null, this.thicknessTexture = null, this._refractionTexture = null, this.refractionTexture = null, this._indexOfRefraction = 1.5, this.indexOfRefraction = 1.5, this._volumeIndexOfRefraction = -1, this._invertRefractionY = false, this.invertRefractionY = false, this._linkRefractionWithTransparency = false, this.linkRefractionWithTransparency = false, this.minimumThickness = 0, this.maximumThickness = 1, this.useThicknessAsDepth = false, this.tintColor = Ne.White(), this.tintColorAtDistance = 1, this.dispersion = 0, this.diffusionDistance = Ne.White(), this._useMaskFromThicknessTexture = false, this.useMaskFromThicknessTexture = false, this._refractionIntensityTexture = null, this.refractionIntensityTexture = null, this._translucencyIntensityTexture = null, this.translucencyIntensityTexture = null, this._useGltfStyleTextures = false, this.useGltfStyleTextures = false, this._scene = e.getScene(), this.registerForExtraEvents = true, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1], this._internalMarkScenePrePassDirty = e._dirtyCallbacks[32]; } isReadyForSubMesh(e, t) { if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled) @@ -56478,101 +56479,101 @@ var qt = class extends wr { } }; P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") -], qt.prototype, "isRefractionEnabled", void 0); +], Yt.prototype, "isRefractionEnabled", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") -], qt.prototype, "isTranslucencyEnabled", void 0); +], Yt.prototype, "isTranslucencyEnabled", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") -], qt.prototype, "isDispersionEnabled", void 0); +], Yt.prototype, "isDispersionEnabled", void 0); P([ - U(), + w(), oe("_markScenePrePassDirty") -], qt.prototype, "isScatteringEnabled", void 0); +], Yt.prototype, "isScatteringEnabled", void 0); P([ - U() -], qt.prototype, "_scatteringDiffusionProfileIndex", void 0); + w() +], Yt.prototype, "_scatteringDiffusionProfileIndex", void 0); P([ - U() -], qt.prototype, "refractionIntensity", void 0); + w() +], Yt.prototype, "refractionIntensity", void 0); P([ - U() -], qt.prototype, "translucencyIntensity", void 0); + w() +], Yt.prototype, "translucencyIntensity", void 0); P([ - U() -], qt.prototype, "useAlbedoToTintRefraction", void 0); + w() +], Yt.prototype, "useAlbedoToTintRefraction", void 0); P([ - U() -], qt.prototype, "useAlbedoToTintTranslucency", void 0); + w() +], Yt.prototype, "useAlbedoToTintTranslucency", void 0); P([ Tt(), oe("_markAllSubMeshesAsTexturesDirty") -], qt.prototype, "thicknessTexture", void 0); +], Yt.prototype, "thicknessTexture", void 0); P([ Tt(), oe("_markAllSubMeshesAsTexturesDirty") -], qt.prototype, "refractionTexture", void 0); +], Yt.prototype, "refractionTexture", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") -], qt.prototype, "indexOfRefraction", void 0); +], Yt.prototype, "indexOfRefraction", void 0); P([ - U() -], qt.prototype, "_volumeIndexOfRefraction", void 0); + w() +], Yt.prototype, "_volumeIndexOfRefraction", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") -], qt.prototype, "volumeIndexOfRefraction", null); +], Yt.prototype, "volumeIndexOfRefraction", null); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") -], qt.prototype, "invertRefractionY", void 0); +], Yt.prototype, "invertRefractionY", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") -], qt.prototype, "linkRefractionWithTransparency", void 0); +], Yt.prototype, "linkRefractionWithTransparency", void 0); P([ - U() -], qt.prototype, "minimumThickness", void 0); + w() +], Yt.prototype, "minimumThickness", void 0); P([ - U() -], qt.prototype, "maximumThickness", void 0); + w() +], Yt.prototype, "maximumThickness", void 0); P([ - U() -], qt.prototype, "useThicknessAsDepth", void 0); + w() +], Yt.prototype, "useThicknessAsDepth", void 0); P([ $i() -], qt.prototype, "tintColor", void 0); +], Yt.prototype, "tintColor", void 0); P([ - U() -], qt.prototype, "tintColorAtDistance", void 0); + w() +], Yt.prototype, "tintColorAtDistance", void 0); P([ - U() -], qt.prototype, "dispersion", void 0); + w() +], Yt.prototype, "dispersion", void 0); P([ $i() -], qt.prototype, "diffusionDistance", void 0); +], Yt.prototype, "diffusionDistance", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") -], qt.prototype, "useMaskFromThicknessTexture", void 0); +], Yt.prototype, "useMaskFromThicknessTexture", void 0); P([ Tt(), oe("_markAllSubMeshesAsTexturesDirty") -], qt.prototype, "refractionIntensityTexture", void 0); +], Yt.prototype, "refractionIntensityTexture", void 0); P([ Tt(), oe("_markAllSubMeshesAsTexturesDirty") -], qt.prototype, "translucencyIntensityTexture", void 0); +], Yt.prototype, "translucencyIntensityTexture", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") -], qt.prototype, "useGltfStyleTextures", void 0); +], Yt.prototype, "useGltfStyleTextures", void 0); var $n = { effect: null, subMesh: null }; -var mg = class extends es { +var _g = class extends es { /** * Initializes the PBR Material defines. * @param externalProperties The external properties @@ -56628,7 +56629,7 @@ var Nt = class _Nt extends Uc { * @param scene The scene the material will be use in. */ constructor(e, t) { - super(e, t), this._directIntensity = 1, this._emissiveIntensity = 1, this._environmentIntensity = 1, this._specularIntensity = 1, this._lightingInfos = new Ke(this._directIntensity, this._emissiveIntensity, this._environmentIntensity, this._specularIntensity), this._disableBumpMap = false, this._albedoTexture = null, this._ambientTexture = null, this._ambientTextureStrength = 1, this._ambientTextureImpactOnAnalyticalLights = _Nt.DEFAULT_AO_ON_ANALYTICAL_LIGHTS, this._opacityTexture = null, this._reflectionTexture = null, this._emissiveTexture = null, this._reflectivityTexture = null, this._metallicTexture = null, this._metallic = null, this._roughness = null, this._metallicF0Factor = 1, this._metallicReflectanceColor = Ne.White(), this._useOnlyMetallicFromMetallicReflectanceTexture = false, this._metallicReflectanceTexture = null, this._reflectanceTexture = null, this._microSurfaceTexture = null, this._bumpTexture = null, this._lightmapTexture = null, this._ambientColor = new Ne(0, 0, 0), this._albedoColor = new Ne(1, 1, 1), this._reflectivityColor = new Ne(1, 1, 1), this._reflectionColor = new Ne(1, 1, 1), this._emissiveColor = new Ne(0, 0, 0), this._microSurface = 0.9, this._useLightmapAsShadowmap = false, this._useHorizonOcclusion = true, this._useRadianceOcclusion = true, this._useAlphaFromAlbedoTexture = false, this._useSpecularOverAlpha = true, this._useMicroSurfaceFromReflectivityMapAlpha = false, this._useRoughnessFromMetallicTextureAlpha = true, this._useRoughnessFromMetallicTextureGreen = false, this._useMetallnessFromMetallicTextureBlue = false, this._useAmbientOcclusionFromMetallicTextureRed = false, this._useAmbientInGrayScale = false, this._useAutoMicroSurfaceFromReflectivityMap = false, this._lightFalloff = _Nt.LIGHTFALLOFF_PHYSICAL, this._useRadianceOverAlpha = true, this._useObjectSpaceNormalMap = false, this._useParallax = false, this._useParallaxOcclusion = false, this._parallaxScaleBias = 0.05, this._disableLighting = false, this._maxSimultaneousLights = 4, this._invertNormalMapX = false, this._invertNormalMapY = false, this._twoSidedLighting = false, this._alphaCutOff = 0.4, this._forceAlphaTest = false, this._useAlphaFresnel = false, this._useLinearAlphaFresnel = false, this._environmentBRDFTexture = null, this._forceIrradianceInFragment = false, this._realTimeFiltering = false, this._realTimeFilteringQuality = 8, this._forceNormalForward = false, this._enableSpecularAntiAliasing = false, this._imageProcessingObserver = null, this._renderTargets = new Li(16), this._globalAmbientColor = new Ne(0, 0, 0), this._unlit = false, this._applyDecalMapAfterDetailMap = false, this._debugMode = 0, this.debugMode = 0, this.debugLimit = -1, this.debugFactor = 1, this._cacheHasRenderTargetTextures = false, this.brdf = new Fi(this), this.clearCoat = new Si(this), this.iridescence = new or(this), this.anisotropy = new Wa(this), this.sheen = new _s(this), this.subSurface = new qt(this), this.detailMap = new hn(this), this._attachImageProcessingConfiguration(null), this.getRenderTargetTextures = () => (this._renderTargets.reset(), ae.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget && this._renderTargets.push(this._reflectionTexture), this._eventInfo.renderTargets = this._renderTargets, this._callbackPluginEventFillRenderTargetTextures(this._eventInfo), this._renderTargets), this._environmentBRDFTexture = b0(this.getScene()), this.prePassConfiguration = new oc(); + super(e, t), this._directIntensity = 1, this._emissiveIntensity = 1, this._environmentIntensity = 1, this._specularIntensity = 1, this._lightingInfos = new Ke(this._directIntensity, this._emissiveIntensity, this._environmentIntensity, this._specularIntensity), this._disableBumpMap = false, this._albedoTexture = null, this._ambientTexture = null, this._ambientTextureStrength = 1, this._ambientTextureImpactOnAnalyticalLights = _Nt.DEFAULT_AO_ON_ANALYTICAL_LIGHTS, this._opacityTexture = null, this._reflectionTexture = null, this._emissiveTexture = null, this._reflectivityTexture = null, this._metallicTexture = null, this._metallic = null, this._roughness = null, this._metallicF0Factor = 1, this._metallicReflectanceColor = Ne.White(), this._useOnlyMetallicFromMetallicReflectanceTexture = false, this._metallicReflectanceTexture = null, this._reflectanceTexture = null, this._microSurfaceTexture = null, this._bumpTexture = null, this._lightmapTexture = null, this._ambientColor = new Ne(0, 0, 0), this._albedoColor = new Ne(1, 1, 1), this._reflectivityColor = new Ne(1, 1, 1), this._reflectionColor = new Ne(1, 1, 1), this._emissiveColor = new Ne(0, 0, 0), this._microSurface = 0.9, this._useLightmapAsShadowmap = false, this._useHorizonOcclusion = true, this._useRadianceOcclusion = true, this._useAlphaFromAlbedoTexture = false, this._useSpecularOverAlpha = true, this._useMicroSurfaceFromReflectivityMapAlpha = false, this._useRoughnessFromMetallicTextureAlpha = true, this._useRoughnessFromMetallicTextureGreen = false, this._useMetallnessFromMetallicTextureBlue = false, this._useAmbientOcclusionFromMetallicTextureRed = false, this._useAmbientInGrayScale = false, this._useAutoMicroSurfaceFromReflectivityMap = false, this._lightFalloff = _Nt.LIGHTFALLOFF_PHYSICAL, this._useRadianceOverAlpha = true, this._useObjectSpaceNormalMap = false, this._useParallax = false, this._useParallaxOcclusion = false, this._parallaxScaleBias = 0.05, this._disableLighting = false, this._maxSimultaneousLights = 4, this._invertNormalMapX = false, this._invertNormalMapY = false, this._twoSidedLighting = false, this._alphaCutOff = 0.4, this._forceAlphaTest = false, this._useAlphaFresnel = false, this._useLinearAlphaFresnel = false, this._environmentBRDFTexture = null, this._forceIrradianceInFragment = false, this._realTimeFiltering = false, this._realTimeFilteringQuality = 8, this._forceNormalForward = false, this._enableSpecularAntiAliasing = false, this._imageProcessingObserver = null, this._renderTargets = new Li(16), this._globalAmbientColor = new Ne(0, 0, 0), this._unlit = false, this._applyDecalMapAfterDetailMap = false, this._debugMode = 0, this.debugMode = 0, this.debugLimit = -1, this.debugFactor = 1, this._cacheHasRenderTargetTextures = false, this.brdf = new Fi(this), this.clearCoat = new Si(this), this.iridescence = new lr(this), this.anisotropy = new Wa(this), this.sheen = new _s(this), this.subSurface = new Yt(this), this.detailMap = new un(this), this._attachImageProcessingConfiguration(null), this.getRenderTargetTextures = () => (this._renderTargets.reset(), ae.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget && this._renderTargets.push(this._reflectionTexture), this._eventInfo.renderTargets = this._renderTargets, this._callbackPluginEventFillRenderTargetTextures(this._eventInfo), this._renderTargets), this._environmentBRDFTexture = b0(this.getScene()), this.prePassConfiguration = new oc(); } /** * Gets a boolean indicating that current material needs to register RTT @@ -56699,7 +56700,7 @@ var Nt = class _Nt extends Uc { const r = t._drawWrapper; if (r.effect && this.isFrozen && r._wasPreviouslyReady && r._wasPreviouslyUsingInstances === i) return true; - t.materialDefines || (this._callbackPluginEventGeneric(Ri.GetDefineNames, this._eventInfo), t.materialDefines = new mg(this._eventInfo.defineNames)); + t.materialDefines || (this._callbackPluginEventGeneric(Ri.GetDefineNames, this._eventInfo), t.materialDefines = new _g(this._eventInfo.defineNames)); const s = t.materialDefines; if (this._isReadyForSubMesh(t)) return true; @@ -56755,14 +56756,14 @@ var Nt = class _Nt extends Uc { if (this._prepareDefines(e, t, s, a, o), !t.isDirty) return null; t.markAsProcessed(); - const c = this.getScene().getEngine(), h = new pf(); + const c = this.getScene().getEngine(), h = new gf(); let u = 0; t.USESPHERICALINVERTEX && h.addFallback(u++, "USESPHERICALINVERTEX"), t.FOG && h.addFallback(u, "FOG"), t.SPECULARAA && h.addFallback(u, "SPECULARAA"), t.POINTSIZE && h.addFallback(u, "POINTSIZE"), t.LOGARITHMICDEPTH && h.addFallback(u, "LOGARITHMICDEPTH"), t.PARALLAX && h.addFallback(u, "PARALLAX"), t.PARALLAX_RHS && h.addFallback(u, "PARALLAX_RHS"), t.PARALLAXOCCLUSION && h.addFallback(u++, "PARALLAXOCCLUSION"), t.ENVIRONMENTBRDF && h.addFallback(u++, "ENVIRONMENTBRDF"), t.TANGENT && h.addFallback(u++, "TANGENT"), t.BUMP && h.addFallback(u++, "BUMP"), u = i0(t, h, this._maxSimultaneousLights, u++), t.SPECULARTERM && h.addFallback(u++, "SPECULARTERM"), t.USESPHERICALFROMREFLECTIONMAP && h.addFallback(u++, "USESPHERICALFROMREFLECTIONMAP"), t.USEIRRADIANCEMAP && h.addFallback(u++, "USEIRRADIANCEMAP"), t.LIGHTMAP && h.addFallback(u++, "LIGHTMAP"), t.NORMAL && h.addFallback(u++, "NORMAL"), t.AMBIENT && h.addFallback(u++, "AMBIENT"), t.EMISSIVE && h.addFallback(u++, "EMISSIVE"), t.VERTEXCOLOR && h.addFallback(u++, "VERTEXCOLOR"), t.MORPHTARGETS && h.addFallback(u++, "MORPHTARGETS"), t.MULTIVIEW && h.addFallback(0, "MULTIVIEW"); const f = [I.PositionKind]; t.NORMAL && f.push(I.NormalKind), t.TANGENT && f.push(I.TangentKind); for (let R = 1; R <= 6; ++R) t["UV" + R] && f.push(`uv${R === 1 ? "" : R}`); - t.VERTEXCOLOR && f.push(I.ColorKind), t0(f, e, t, h), lf(f, t), Q_(f, e, t), af(f, e, t); + t.VERTEXCOLOR && f.push(I.ColorKind), t0(f, e, t, h), cf(f, t), Q_(f, e, t), of(f, e, t); let d = "pbr"; const p = [ "world", @@ -56854,7 +56855,7 @@ var Nt = class _Nt extends Uc { "oitDepthSampler", "oitFrontColorSampler" ], m = ["Material", "Scene", "Mesh"], v = { maxSimultaneousLights: this._maxSimultaneousLights, maxSimultaneousMorphTargets: t.NUM_MORPH_INFLUENCERS }; - this._eventInfo.fallbacks = h, this._eventInfo.fallbackRank = u, this._eventInfo.defines = t, this._eventInfo.uniforms = p, this._eventInfo.attributes = f, this._eventInfo.samplers = g, this._eventInfo.uniformBuffersNames = m, this._eventInfo.customCode = void 0, this._eventInfo.mesh = e, this._eventInfo.indexParameters = v, this._callbackPluginEventGeneric(Ri.PrepareEffect, this._eventInfo), oc.AddUniforms(p), Nc(p), at && (at.PrepareUniforms(p, t), at.PrepareSamplers(g, t)), ff({ + this._eventInfo.fallbacks = h, this._eventInfo.fallbackRank = u, this._eventInfo.defines = t, this._eventInfo.uniforms = p, this._eventInfo.attributes = f, this._eventInfo.samplers = g, this._eventInfo.uniformBuffersNames = m, this._eventInfo.customCode = void 0, this._eventInfo.mesh = e, this._eventInfo.indexParameters = v, this._callbackPluginEventGeneric(Ri.PrepareEffect, this._eventInfo), oc.AddUniforms(p), Nc(p), at && (at.PrepareUniforms(p, t), at.PrepareSamplers(g, t)), df({ uniformsNames: p, uniformBuffersNames: m, samplers: g, @@ -56939,7 +56940,7 @@ var Nt = class _Nt extends Uc { } t.SPECULAROVERALPHA = this._useSpecularOverAlpha, this._lightFalloff === _Nt.LIGHTFALLOFF_STANDARD ? (t.USEPHYSICALLIGHTFALLOFF = false, t.USEGLTFLIGHTFALLOFF = false) : this._lightFalloff === _Nt.LIGHTFALLOFF_GLTF ? (t.USEPHYSICALLIGHTFALLOFF = false, t.USEGLTFLIGHTFALLOFF = true) : (t.USEPHYSICALLIGHTFALLOFF = true, t.USEGLTFLIGHTFALLOFF = false), t.RADIANCEOVERALPHA = this._useRadianceOverAlpha, !this.backFaceCulling && this._twoSidedLighting ? t.TWOSIDEDLIGHTING = true : t.TWOSIDEDLIGHTING = false, t.SPECULARAA = o.getCaps().standardDerivatives && this._enableSpecularAntiAliasing; } - (t._areTexturesDirty || t._areMiscDirty) && (t.ALPHATESTVALUE = `${this._alphaCutOff}${this._alphaCutOff % 1 === 0 ? "." : ""}`, t.PREMULTIPLYALPHA = this.alphaMode === 7 || this.alphaMode === 8, t.ALPHABLEND = this.needAlphaBlendingForMesh(e), t.ALPHAFRESNEL = this._useAlphaFresnel || this._useLinearAlphaFresnel, t.LINEARALPHAFRESNEL = this._useLinearAlphaFresnel), t._areImageProcessingDirty && this._imageProcessingConfiguration && this._imageProcessingConfiguration.prepareDefines(t), t.FORCENORMALFORWARD = this._forceNormalForward, t.RADIANCEOCCLUSION = this._useRadianceOcclusion, t.HORIZONOCCLUSION = this._useHorizonOcclusion, t._areMiscDirty && (cf(e, a, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, this._shouldTurnAlphaTestOn(e) || this._forceAlphaTest, t, this._applyDecalMapAfterDetailMap), t.UNLIT = this._unlit || (this.pointsCloud || this.wireframe) && !e.isVerticesDataPresent(I.NormalKind), t.DEBUGMODE = this._debugMode), hf(a, o, this, t, !!i, r, s), this._eventInfo.defines = t, this._eventInfo.mesh = e, this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo), uf(e, t, true, true, true, this._transparencyMode !== _Nt.PBRMATERIAL_OPAQUE), this._callbackPluginEventPrepareDefines(this._eventInfo); + (t._areTexturesDirty || t._areMiscDirty) && (t.ALPHATESTVALUE = `${this._alphaCutOff}${this._alphaCutOff % 1 === 0 ? "." : ""}`, t.PREMULTIPLYALPHA = this.alphaMode === 7 || this.alphaMode === 8, t.ALPHABLEND = this.needAlphaBlendingForMesh(e), t.ALPHAFRESNEL = this._useAlphaFresnel || this._useLinearAlphaFresnel, t.LINEARALPHAFRESNEL = this._useLinearAlphaFresnel), t._areImageProcessingDirty && this._imageProcessingConfiguration && this._imageProcessingConfiguration.prepareDefines(t), t.FORCENORMALFORWARD = this._forceNormalForward, t.RADIANCEOCCLUSION = this._useRadianceOcclusion, t.HORIZONOCCLUSION = this._useHorizonOcclusion, t._areMiscDirty && (hf(e, a, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, this._shouldTurnAlphaTestOn(e) || this._forceAlphaTest, t, this._applyDecalMapAfterDetailMap), t.UNLIT = this._unlit || (this.pointsCloud || this.wireframe) && !e.isVerticesDataPresent(I.NormalKind), t.DEBUGMODE = this._debugMode), uf(a, o, this, t, !!i, r, s), this._eventInfo.defines = t, this._eventInfo.mesh = e, this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo), ff(e, t, true, true, true, this._transparencyMode !== _Nt.PBRMATERIAL_OPAQUE), this._callbackPluginEventPrepareDefines(this._eventInfo); } /** * Force shader compilation @@ -56954,7 +56955,7 @@ var Nt = class _Nt extends Uc { ...i }; this._uniformBufferLayoutBuilt || this.buildUniformLayout(), this._callbackPluginEventGeneric(Ri.GetDefineNames, this._eventInfo); - const s = new mg(this._eventInfo.defineNames), a = this._prepareEffect(e, s, void 0, void 0, r.useInstances, r.clipPlane, e.hasThinInstances); + const s = new _g(this._eventInfo.defineNames), a = this._prepareEffect(e, s, void 0, void 0, r.useInstances, r.clipPlane, e.hasThinInstances); this._onEffectCreatedObservable && ($n.effect = a, $n.subMesh = null, this._onEffectCreatedObservable.notifyObservers($n)), a.isReady() ? t && t(this) : a.onCompileObservable.add(() => { t && t(this); }); @@ -56984,7 +56985,7 @@ var Nt = class _Nt extends Uc { const o = r.getEngine(); this._uniformBuffer.bindToEffect(a, "Material"), this.prePassConfiguration.bindForSubMesh(this._activeEffect, r, t, e, this.isFrozen), this._eventInfo.subMesh = i, this._callbackPluginEventHardBindForSubMesh(this._eventInfo), s.OBJECTSPACE_NORMALMAP && (e.toNormalMatrix(this._normalMatrix), this.bindOnlyNormalMatrix(this._normalMatrix)); const l = this._mustRebind(r, a, i, t.visibility); - of(t, this._activeEffect, this.prePassConfiguration); + lf(t, this._activeEffect, this.prePassConfiguration); let c = null; const h = this._uniformBuffer; if (l) { @@ -57013,11 +57014,11 @@ var Nt = class _Nt extends Uc { this._emissiveTexture && ae.EmissiveTextureEnabled && (h.updateFloat2("vEmissiveInfos", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level), Mt(this._emissiveTexture, h, "emissive")), this._lightmapTexture && ae.LightmapTextureEnabled && (h.updateFloat2("vLightmapInfos", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level), Mt(this._lightmapTexture, h, "lightmap")), ae.SpecularTextureEnabled && (this._metallicTexture ? (h.updateFloat3("vReflectivityInfos", this._metallicTexture.coordinatesIndex, this._metallicTexture.level, this._ambientTextureStrength), Mt(this._metallicTexture, h, "reflectivity")) : this._reflectivityTexture && (h.updateFloat3("vReflectivityInfos", this._reflectivityTexture.coordinatesIndex, this._reflectivityTexture.level, 1), Mt(this._reflectivityTexture, h, "reflectivity")), this._metallicReflectanceTexture && (h.updateFloat2("vMetallicReflectanceInfos", this._metallicReflectanceTexture.coordinatesIndex, this._metallicReflectanceTexture.level), Mt(this._metallicReflectanceTexture, h, "metallicReflectance")), this._reflectanceTexture && s.REFLECTANCE && (h.updateFloat2("vReflectanceInfos", this._reflectanceTexture.coordinatesIndex, this._reflectanceTexture.level), Mt(this._reflectanceTexture, h, "reflectance")), this._microSurfaceTexture && (h.updateFloat2("vMicroSurfaceSamplerInfos", this._microSurfaceTexture.coordinatesIndex, this._microSurfaceTexture.level), Mt(this._microSurfaceTexture, h, "microSurfaceSampler"))), this._bumpTexture && o.getCaps().standardDerivatives && ae.BumpTextureEnabled && !this._disableBumpMap && (h.updateFloat3("vBumpInfos", this._bumpTexture.coordinatesIndex, this._bumpTexture.level, this._parallaxScaleBias), Mt(this._bumpTexture, h, "bump"), r._mirroredCameraPosition ? h.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? 1 : -1, this._invertNormalMapY ? 1 : -1) : h.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? -1 : 1, this._invertNormalMapY ? -1 : 1)); } if (this.pointsCloud && h.updateFloat("pointSize", this.pointSize), s.METALLICWORKFLOW) { - Zr.Color3[0].r = this._metallic === void 0 || this._metallic === null ? 1 : this._metallic, Zr.Color3[0].g = this._roughness === void 0 || this._roughness === null ? 1 : this._roughness, h.updateColor4("vReflectivityColor", Zr.Color3[0], 1); + jr.Color3[0].r = this._metallic === void 0 || this._metallic === null ? 1 : this._metallic, jr.Color3[0].g = this._roughness === void 0 || this._roughness === null ? 1 : this._roughness, h.updateColor4("vReflectivityColor", jr.Color3[0], 1); const p = ((u = this.subSurface) == null ? void 0 : u._indexOfRefraction) ?? 1.5, g = 1, m = Math.pow((p - g) / (p + g), 2); - this._metallicReflectanceColor.scaleToRef(m * this._metallicF0Factor, Zr.Color3[0]); + this._metallicReflectanceColor.scaleToRef(m * this._metallicF0Factor, jr.Color3[0]); const v = this._metallicF0Factor; - h.updateColor4("vMetallicReflectanceFactors", Zr.Color3[0], v); + h.updateColor4("vMetallicReflectanceFactors", jr.Color3[0], v); } else h.updateColor4("vReflectivityColor", this._reflectivityColor, this._microSurface); h.updateColor3("vEmissiveColor", ae.EmissiveTextureEnabled ? this._emissiveColor : Ne.BlackReadOnly), h.updateColor3("vReflectionColor", this._reflectionColor), !s.SS_REFRACTION && ((f = this.subSurface) != null && f._linkRefractionWithTransparency) ? h.updateColor4("vAlbedoColor", this._albedoColor, 1) : h.updateColor4("vAlbedoColor", this._albedoColor, this.alpha), this._lightingInfos.x = this._directIntensity, this._lightingInfos.y = this._emissiveIntensity, this._lightingInfos.z = this._environmentIntensity * r.environmentIntensity, this._lightingInfos.w = this._specularIntensity, h.updateVector4("vLightingIntensity", this._lightingInfos), r.ambientColor.multiplyToRef(this._ambientColor, this._globalAmbientColor), h.updateColor3("vAmbientColor", this._globalAmbientColor), h.updateFloat2("vDebugMode", this.debugLimit, this.debugFactor); @@ -57025,7 +57026,7 @@ var Nt = class _Nt extends Uc { r.texturesEnabled && (this._albedoTexture && ae.DiffuseTextureEnabled && h.setTexture("albedoSampler", this._albedoTexture), this._ambientTexture && ae.AmbientTextureEnabled && h.setTexture("ambientSampler", this._ambientTexture), this._opacityTexture && ae.OpacityTextureEnabled && h.setTexture("opacitySampler", this._opacityTexture), c && ae.ReflectionTextureEnabled && (s.LODBASEDMICROSFURACE ? h.setTexture("reflectionSampler", c) : (h.setTexture("reflectionSampler", c._lodTextureMid || c), h.setTexture("reflectionSamplerLow", c._lodTextureLow || c), h.setTexture("reflectionSamplerHigh", c._lodTextureHigh || c)), s.USEIRRADIANCEMAP && h.setTexture("irradianceSampler", c.irradianceTexture)), s.ENVIRONMENTBRDF && h.setTexture("environmentBrdfSampler", this._environmentBRDFTexture), this._emissiveTexture && ae.EmissiveTextureEnabled && h.setTexture("emissiveSampler", this._emissiveTexture), this._lightmapTexture && ae.LightmapTextureEnabled && h.setTexture("lightmapSampler", this._lightmapTexture), ae.SpecularTextureEnabled && (this._metallicTexture ? h.setTexture("reflectivitySampler", this._metallicTexture) : this._reflectivityTexture && h.setTexture("reflectivitySampler", this._reflectivityTexture), this._metallicReflectanceTexture && h.setTexture("metallicReflectanceSampler", this._metallicReflectanceTexture), this._reflectanceTexture && s.REFLECTANCE && h.setTexture("reflectanceSampler", this._reflectanceTexture), this._microSurfaceTexture && h.setTexture("microSurfaceSampler", this._microSurfaceTexture)), this._bumpTexture && o.getCaps().standardDerivatives && ae.BumpTextureEnabled && !this._disableBumpMap && h.setTexture("bumpSampler", this._bumpTexture)), this.getScene().useOrderIndependentTransparency && this.needAlphaBlendingForMesh(t) && this.getScene().depthPeelingRenderer.bind(a), this._eventInfo.subMesh = i, this._callbackPluginEventBindForSubMesh(this._eventInfo), Fc(this._activeEffect, this, r), this.bindEyePosition(a); } else r.getEngine()._features.needToAlwaysBindUniformBuffers && (this._needToBindSceneUbo = true); - (l || !this.isFrozen) && (r.lightsEnabled && !this._disableLighting && e0(r, t, this._activeEffect, s, this._maxSimultaneousLights), (r.fogEnabled && t.applyFog && r.fogMode !== Ot.FOGMODE_NONE || c || this.subSurface.refractionTexture || t.receiveShadows || s.PREPASS) && this.bindView(a), wc(r, t, this._activeEffect, true), s.NUM_MORPH_INFLUENCERS && nf(t, this._activeEffect), s.BAKED_VERTEX_ANIMATION_TEXTURE && ((d = t.bakedVertexAnimationManager) == null || d.bind(a, s.INSTANCES)), this._imageProcessingConfiguration.bind(this._activeEffect), Lc(s, this._activeEffect, r)), this._afterBind(t, this._activeEffect, i), h.update(); + (l || !this.isFrozen) && (r.lightsEnabled && !this._disableLighting && e0(r, t, this._activeEffect, s, this._maxSimultaneousLights), (r.fogEnabled && t.applyFog && r.fogMode !== Ot.FOGMODE_NONE || c || this.subSurface.refractionTexture || t.receiveShadows || s.PREPASS) && this.bindView(a), wc(r, t, this._activeEffect, true), s.NUM_MORPH_INFLUENCERS && af(t, this._activeEffect), s.BAKED_VERTEX_ANIMATION_TEXTURE && ((d = t.bakedVertexAnimationManager) == null || d.bind(a, s.INSTANCES)), this._imageProcessingConfiguration.bind(this._activeEffect), Lc(s, this._activeEffect, r)), this._afterBind(t, this._activeEffect, i), h.update(); } /** * Returns the animatable textures. @@ -57091,7 +57092,7 @@ Nt.LIGHTFALLOFF_PHYSICAL = 0; Nt.LIGHTFALLOFF_GLTF = 1; Nt.LIGHTFALLOFF_STANDARD = 2; P([ - Iy() + by() ], Nt.prototype, "_imageProcessingConfiguration", void 0); P([ oe("_markAllSubMeshesAsMiscDirty") @@ -57330,23 +57331,23 @@ we.PBRMATERIAL_ALPHABLEND = Nt.PBRMATERIAL_ALPHABLEND; we.PBRMATERIAL_ALPHATESTANDBLEND = Nt.PBRMATERIAL_ALPHATESTANDBLEND; we.DEFAULT_AO_ON_ANALYTICAL_LIGHTS = Nt.DEFAULT_AO_ON_ANALYTICAL_LIGHTS; P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "directIntensity", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "emissiveIntensity", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "environmentIntensity", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "specularIntensity", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "disableBumpMap", void 0); P([ @@ -57358,11 +57359,11 @@ P([ oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "ambientTexture", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "ambientTextureStrength", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "ambientTextureImpactOnAnalyticalLights", void 0); P([ @@ -57386,15 +57387,15 @@ P([ oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "metallicTexture", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "metallic", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "roughness", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "metallicF0Factor", void 0); P([ @@ -57402,7 +57403,7 @@ P([ oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "metallicReflectanceColor", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useOnlyMetallicFromMetallicReflectanceTexture", void 0); P([ @@ -57446,140 +57447,140 @@ P([ oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "emissiveColor", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "microSurface", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useLightmapAsShadowmap", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesAndMiscDirty") ], we.prototype, "useAlphaFromAlbedoTexture", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesAndMiscDirty") ], we.prototype, "forceAlphaTest", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesAndMiscDirty") ], we.prototype, "alphaCutOff", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useSpecularOverAlpha", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useMicroSurfaceFromReflectivityMapAlpha", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useRoughnessFromMetallicTextureAlpha", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useRoughnessFromMetallicTextureGreen", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useMetallnessFromMetallicTextureBlue", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useAmbientOcclusionFromMetallicTextureRed", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useAmbientInGrayScale", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useAutoMicroSurfaceFromReflectivityMap", void 0); P([ - U() + w() ], we.prototype, "usePhysicalLightFalloff", null); P([ - U() + w() ], we.prototype, "useGLTFLightFalloff", null); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useRadianceOverAlpha", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useObjectSpaceNormalMap", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useParallax", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useParallaxOcclusion", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "parallaxScaleBias", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsLightsDirty") ], we.prototype, "disableLighting", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "forceIrradianceInFragment", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsLightsDirty") ], we.prototype, "maxSimultaneousLights", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "invertNormalMapX", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "invertNormalMapY", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "twoSidedLighting", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useAlphaFresnel", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useLinearAlphaFresnel", void 0); P([ oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "environmentBRDFTexture", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "forceNormalForward", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "enableSpecularAntiAliasing", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useHorizonOcclusion", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsTexturesDirty") ], we.prototype, "useRadianceOcclusion", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsMiscDirty") ], we.prototype, "unlit", void 0); P([ - U(), + w(), oe("_markAllSubMeshesAsMiscDirty") ], we.prototype, "applyDecalMapAfterDetailMap", void 0); Re("BABYLON.PBRMaterial", we); @@ -57590,13 +57591,13 @@ De.prototype.updateRawTexture = function(n4, e, t, i, r = null, s = 0, a = false this._bindTextureDirectly(this._gl.TEXTURE_2D, n4, true), this._unpackFlipY(i === void 0 ? true : !!i), this._doNotHandleContextLost || (n4._bufferView = e, n4.format = t, n4.type = s, n4.invertY = i, n4._compression = r), n4.width % 4 !== 0 && this._gl.pixelStorei(this._gl.UNPACK_ALIGNMENT, 1), r && e ? this._gl.compressedTexImage2D(this._gl.TEXTURE_2D, 0, this.getCaps().s3tc[r], n4.width, n4.height, 0, e) : this._gl.texImage2D(this._gl.TEXTURE_2D, 0, o, n4.width, n4.height, 0, l, c, e), n4.generateMipMaps && this._gl.generateMipmap(this._gl.TEXTURE_2D), this._bindTextureDirectly(this._gl.TEXTURE_2D, null), n4.isReady = true; }; De.prototype.createRawTexture = function(n4, e, t, i, r, s, a, o = null, l = 0, c = 0, h = false) { - const u = new ar(this, Dt.Raw); + const u = new or(this, Dt.Raw); u.baseWidth = e, u.baseHeight = t, u.width = e, u.height = t, u.format = i, u.generateMipMaps = r, u.samplingMode = a, u.invertY = s, u._compression = o, u.type = l, u._useSRGBBuffer = this._getUseSRGBBuffer(h, !r), this._doNotHandleContextLost || (u._bufferView = n4), this.updateRawTexture(u, n4, i, s, o, l, u._useSRGBBuffer), this._bindTextureDirectly(this._gl.TEXTURE_2D, u, true); const f = this._getSamplingParameters(a, r); return this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, f.mag), this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, f.min), r && this._gl.generateMipmap(this._gl.TEXTURE_2D), this._bindTextureDirectly(this._gl.TEXTURE_2D, null), this._internalTexturesCache.push(u), u; }; De.prototype.createRawCubeTexture = function(n4, e, t, i, r, s, a, o = null) { - const l = this._gl, c = new ar(this, Dt.CubeRaw); + const l = this._gl, c = new or(this, Dt.CubeRaw); c.isCube = true, c.format = t, c.type = i, this._doNotHandleContextLost || (c._bufferViewArray = n4); const h = this._getWebGLTextureType(i); let u = this._getInternalFormat(t); @@ -57646,8 +57647,8 @@ De.prototype.createRawCubeTextureFromUrl = function(n4, e, t, i, r, s, a, o, l = for (let M = 0; M < S.length; M++) { const N = v >> M; for (let F = 0; F < 6; F++) { - let L = S[M][F]; - x && (L = A0(L, N, N, r)), f.texImage2D(F, M, R, N, N, 0, T, C, L); + let U = S[M][F]; + x && (U = A0(U, N, N, r)), f.texImage2D(F, M, R, N, N, 0, T, C, U); } } this._bindTextureDirectly(f.TEXTURE_CUBE_MAP, null); @@ -57672,7 +57673,7 @@ function A0(n4, e, t, i) { } function M0(n4) { return function(e, t, i, r, s, a, o, l, c = null, h = 0) { - const u = n4 ? this._gl.TEXTURE_3D : this._gl.TEXTURE_2D_ARRAY, f = n4 ? Dt.Raw3D : Dt.Raw2DArray, d = new ar(this, f); + const u = n4 ? this._gl.TEXTURE_3D : this._gl.TEXTURE_2D_ARRAY, f = n4 ? Dt.Raw3D : Dt.Raw2DArray, d = new or(this, f); d.baseWidth = t, d.baseHeight = i, d.baseDepth = r, d.width = t, d.height = i, d.depth = r, d.format = s, d.type = h, d.generateMipMaps = a, d.samplingMode = l, n4 ? d.is3D = true : d.is2DArray = true, this._doNotHandleContextLost || (d._bufferView = e), n4 ? this.updateRawTexture3D(d, e, s, o, c, h) : this.updateRawTexture2DArray(d, e, s, o, c, h), this._bindTextureDirectly(u, d, true); const p = this._getSamplingParameters(l, a); return this._gl.texParameteri(u, this._gl.TEXTURE_MAG_FILTER, p.mag), this._gl.texParameteri(u, this._gl.TEXTURE_MIN_FILTER, p.min), a && this._gl.generateMipmap(u), this._bindTextureDirectly(u, null), this._internalTexturesCache.push(d), d; @@ -58160,7 +58161,7 @@ var _t = class __t { * @returns number[][] of 3D positions */ static GetPointsFromText(e, t, i, r, s = 0, a = true) { - const o = [], l = jb(e, t, i, r); + const o = [], l = Qb(e, t, i, r); for (const c of l) { for (const h of c.paths) { const u = [], f = h.getPoints(); @@ -58230,10 +58231,10 @@ var _t = class __t { return e ? 1 : 0; } }; -var _g; +var Eg; (function(n4) { n4[n4.MATERIAL_TYPE_STANDARD = 0] = "MATERIAL_TYPE_STANDARD", n4[n4.MATERIAL_TYPE_PBR = 1] = "MATERIAL_TYPE_PBR", n4[n4.MATERIAL_TYPE_SIMPLE = 2] = "MATERIAL_TYPE_SIMPLE"; -})(_g || (_g = {})); +})(Eg || (Eg = {})); var Tr; (function(n4) { n4[n4.COLOR_MODE_SET = 0] = "COLOR_MODE_SET", n4[n4.COLOR_MODE_ADD = 1] = "COLOR_MODE_ADD", n4[n4.COLOR_MODE_MULTIPLY = 2] = "COLOR_MODE_MULTIPLY"; @@ -58242,12 +58243,12 @@ var ws; (function(n4) { n4[n4.COLOR_DISTRIBUTION_TYPE_SEGMENT = 0] = "COLOR_DISTRIBUTION_TYPE_SEGMENT", n4[n4.COLOR_DISTRIBUTION_TYPE_LINE = 1] = "COLOR_DISTRIBUTION_TYPE_LINE"; })(ws || (ws = {})); -var DP = class extends es { +var NP = class extends es { constructor() { super(...arguments), this.GREASED_LINE_HAS_COLOR = false, this.GREASED_LINE_SIZE_ATTENUATION = false, this.GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE = false, this.GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM = false, this.GREASED_LINE_CAMERA_FACING = true; } }; -var Nn = class _Nn extends wr { +var Nn = class _Nn extends Ur { /** * Creates a new instance of the GreasedLinePluginMaterial * @param material base material for the plugin @@ -58258,7 +58259,7 @@ var Nn = class _Nn extends wr { i = i || { color: wi.DEFAULT_COLOR }; - const r = new DP(); + const r = new NP(); r.GREASED_LINE_HAS_COLOR = !!i.color && !i.useColors, r.GREASED_LINE_SIZE_ATTENUATION = i.sizeAttenuation ?? false, r.GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE = i.colorDistributionType === ws.COLOR_DISTRIBUTION_TYPE_LINE, r.GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM = (t ?? e.getScene()).useRightHandedSystem, r.GREASED_LINE_CAMERA_FACING = i.cameraFacing ?? true, super(e, _Nn.GREASED_LINE_MATERIAL_NAME, 200, r), this.colorsTexture = null, this._scene = t ?? e.getScene(), this._engine = this._scene.getEngine(), this._cameraFacing = i.cameraFacing ?? true, this.visibility = i.visibility ?? 1, this.useDash = i.useDash ?? false, this.dashRatio = i.dashRatio ?? 0.5, this.dashOffset = i.dashOffset ?? 0, this.width = i.width ? i.width : i.sizeAttenuation ? wi.DEFAULT_WIDTH_ATTENUATED : wi.DEFAULT_WIDTH, this._sizeAttenuation = i.sizeAttenuation ?? false, this.colorMode = i.colorMode ?? Tr.COLOR_MODE_SET, this._color = i.color ?? null, this.useColors = i.useColors ?? false, this._colorsDistributionType = i.colorDistributionType ?? ws.COLOR_DISTRIBUTION_TYPE_SEGMENT, this.colorsSampling = i.colorsSampling ?? rr.NEAREST_NEAREST, this._colors = i.colors ?? null, this.dashCount = i.dashCount ?? 1, this.resolution = i.resolution ?? new me(this._engine.getRenderWidth(), this._engine.getRenderHeight()), i.colorsTexture ? this.colorsTexture = i.colorsTexture : this._colors ? this.colorsTexture = _t.CreateColorsTexture(`${e.name}-colors-texture`, this._colors, this.colorsSampling, this._scene) : (this._color = this._color ?? wi.DEFAULT_COLOR, _t.PrepareEmptyColorsTexture(this._scene)), this._engine.onDisposeObservable.add(() => { _t.DisposeEmptyColorsTexture(); }), this._enable(true); @@ -58669,15 +58670,15 @@ var Nn = class _Nn extends wr { }; Nn.GREASED_LINE_MATERIAL_NAME = "GreasedLinePluginMaterial"; Re(`BABYLON.${Nn.GREASED_LINE_MATERIAL_NAME}`, Nn); -var NP = "greasedLinePixelShader"; -var FP = `precision highp float;uniform sampler2D grlColors;uniform float grlUseColors;uniform float grlUseDash;uniform float grlDashArray;uniform float grlDashOffset;uniform float grlDashRatio;uniform float grlVisibility;uniform float grlColorsWidth;uniform vec2 grl_colorModeAndColorDistributionType;uniform vec3 grlColor;varying float grlCounters;varying float grlColorPointer;void main() {float grlColorMode=grl_colorModeAndColorDistributionType.x;float grlColorDistributionType=grl_colorModeAndColorDistributionType.y;gl_FragColor=vec4(grlColor,1.);gl_FragColor.a=step(grlCounters,grlVisibility);if (gl_FragColor.a==0.) discard;if( grlUseDash==1. ){gl_FragColor.a=ceil(mod(grlCounters+grlDashOffset,grlDashArray)-(grlDashArray*grlDashRatio));if (gl_FragColor.a==0.) discard;} +var FP = "greasedLinePixelShader"; +var LP = `precision highp float;uniform sampler2D grlColors;uniform float grlUseColors;uniform float grlUseDash;uniform float grlDashArray;uniform float grlDashOffset;uniform float grlDashRatio;uniform float grlVisibility;uniform float grlColorsWidth;uniform vec2 grl_colorModeAndColorDistributionType;uniform vec3 grlColor;varying float grlCounters;varying float grlColorPointer;void main() {float grlColorMode=grl_colorModeAndColorDistributionType.x;float grlColorDistributionType=grl_colorModeAndColorDistributionType.y;gl_FragColor=vec4(grlColor,1.);gl_FragColor.a=step(grlCounters,grlVisibility);if (gl_FragColor.a==0.) discard;if( grlUseDash==1. ){gl_FragColor.a=ceil(mod(grlCounters+grlDashOffset,grlDashArray)-(grlDashArray*grlDashRatio));if (gl_FragColor.a==0.) discard;} if (grlUseColors==1.) {vec4 textureColor;if (grlColorDistributionType==COLOR_DISTRIBUTION_TYPE_LINE) { textureColor=texture2D(grlColors,vec2(grlCounters,0.),0.);} else {textureColor=texture2D(grlColors,vec2(grlColorPointer/grlColorsWidth,0.),0.);} if (grlColorMode==COLOR_MODE_SET) {gl_FragColor=textureColor;} else if (grlColorMode==COLOR_MODE_ADD) {gl_FragColor+=textureColor;} else if (grlColorMode==COLOR_MODE_MULTIPLY) {gl_FragColor*=textureColor;}}} `; -Y.ShadersStore[NP] = FP; -var LP = "greasedLineVertexShader"; -var wP = `precision highp float; +Y.ShadersStore[FP] = LP; +var wP = "greasedLineVertexShader"; +var UP = `precision highp float; #include attribute float grl_widths;attribute vec3 grl_offsets;attribute float grl_colorPointers;attribute vec3 position;uniform mat4 viewProjection;uniform mat4 projection;varying float grlCounters;varying float grlColorPointer; #ifdef GREASED_LINE_CAMERA_FACING @@ -58703,8 +58704,8 @@ grlCounters=grl_counters;vec4 grlFinalPosition=worldViewProjection*vec4( (positi #endif } `; -Y.ShadersStore[LP] = wP; -var UP = class extends ks { +Y.ShadersStore[wP] = UP; +var VP = class extends ks { /** * GreasedLineSimple material constructor * @param name material name @@ -59125,7 +59126,7 @@ var O0 = class extends B { */ get greasedLineMaterial() { var t, i; - if (this.material && this.material instanceof UP) + if (this.material && this.material instanceof VP) return this.material; const e = (i = (t = this.material) == null ? void 0 : t.pluginManager) == null ? void 0 : i.getPlugin(Nn.GREASED_LINE_MATERIAL_NAME); if (e) @@ -59172,7 +59173,7 @@ var O0 = class extends B { return t.positions = this._vertexPositions, t.indices = this._indices, t.uvs = this._uvs, e && (t.normals = [], re.ComputeNormals(this._vertexPositions, this._indices, t.normals)), t.applyToMesh(this, this._options.updatable), t; } _createOffsetsBuffer(e) { - const t = this._scene.getEngine(), i = new fr(t, e, this._updatable, 3); + const t = this._scene.getEngine(), i = new dr(t, e, this._updatable, 3); this.setVerticesBuffer(i.createVertexBuffer("grl_offsets", 0, 3)), this._offsetsBuffer = i; } }; @@ -59216,11 +59217,11 @@ var xi = class _xi extends O0 { let f = 0, d = 0, p = 0, g = 0, m = 0; e.forEach((v) => { const E = _t.GetLineLengthArray(v), C = E[E.length - 1]; - for (let F = 0, L = 0; L < v.length; F++, L += 3) { - const K = f + L * 2; - if (o[K + 0] = v[L + 0], o[K + 1] = v[L + 1], o[K + 2] = v[L + 2], o[K + 3] = v[L + 0], o[K + 4] = v[L + 1], o[K + 5] = v[L + 2], L < v.length - 3) { - const q = F * 2 + t, j = d + L * 2; - l[j + 0] = q, l[j + 1] = q + 1, l[j + 2] = q + 2, l[j + 3] = q + 2, l[j + 4] = q + 1, l[j + 5] = q + 3; + for (let F = 0, U = 0; U < v.length; F++, U += 3) { + const H = f + U * 2; + if (o[H + 0] = v[U + 0], o[H + 1] = v[U + 1], o[H + 2] = v[U + 2], o[H + 3] = v[U + 0], o[H + 4] = v[U + 1], o[H + 5] = v[U + 2], U < v.length - 3) { + const q = F * 2 + t, Z = d + U * 2; + l[Z + 0] = q, l[Z + 1] = q + 1, l[Z + 2] = q + 2, l[Z + 3] = q + 2, l[Z + 4] = q + 1, l[Z + 5] = q + 3; } } t += v.length / 3 * 2; @@ -59229,16 +59230,16 @@ var xi = class _xi extends O0 { const x = new Float32Array(R.length), S = new Float32Array(R.length), M = R.length / 6; let N; _xi._CompareV3(0, M - 1, R) ? N = R.subarray((M - 2) * 6, (M - 1) * 6) : N = R.subarray(0, 6), x.set(N), x.set(R.subarray(0, R.length - 6), 6), S.set(R.subarray(6)), _xi._CompareV3(M - 1, 0, R) ? N = R.subarray(6, 12) : N = R.subarray((M - 1) * 6, M * 6), S.set(N, S.length - 6); - for (let F = 0, L = R.length / 3; F < L; F++) + for (let F = 0, U = R.length / 3; F < U; F++) h[g++] = x[F * 3], h[g++] = x[F * 3 + 1], h[g++] = x[F * 3 + 2], h[g++] = 1 - ((F & 1) << 1), u[m++] = S[F * 3], u[m++] = S[F * 3 + 1], u[m++] = S[F * 3 + 2], u[m++] = E[F >> 1] / C; if (this._options.uvs) { const F = this._options.uvs; - for (const L of F) - c[p++] = L; + for (const U of F) + c[p++] = U; } else { for (let F = 0; F < M; F++) { - const L = p + F * 4; - c[L + 0] = F / (M - 1), c[L + 1] = 0, c[L + 2] = F / (M - 1), c[L + 3] = 1; + const U = p + F * 4; + c[U + 0] = F / (M - 1), c[U + 1] = 0, c[U + 2] = F / (M - 1), c[U + 3] = 1; } p += M * 4; } @@ -59334,13 +59335,13 @@ var xi = class _xi extends O0 { return i[r] === i[s] && i[r + 1] === i[s + 1] && i[r + 2] === i[s + 2]; } _createVertexBuffers() { - const e = super._createVertexBuffers(), t = this._scene.getEngine(), i = new fr(t, this._previousAndSide, false, 4); + const e = super._createVertexBuffers(), t = this._scene.getEngine(), i = new dr(t, this._previousAndSide, false, 4); this.setVerticesBuffer(i.createVertexBuffer("grl_previousAndSide", 0, 4)); - const r = new fr(t, this._nextAndCounters, false, 4); + const r = new dr(t, this._nextAndCounters, false, 4); this.setVerticesBuffer(r.createVertexBuffer("grl_nextAndCounters", 0, 4)); - const s = new fr(t, this._widths, this._updatable, 1); + const s = new dr(t, this._widths, this._updatable, 1); this.setVerticesBuffer(s.createVertexBuffer("grl_widths", 0, 1)), this._widthsBuffer = s; - const a = new fr(t, this._colorPointers, this._updatable, 1); + const a = new dr(t, this._colorPointers, this._updatable, 1); return this.setVerticesBuffer(a.createVertexBuffer("grl_colorPointers", 0, 1)), this._colorPointersBuffer = a, e; } }; @@ -59620,13 +59621,13 @@ var ni = class _ni extends O0 { _createVertexBuffers() { var a; this._uvs = this._options.uvs ?? this._uvs; - const e = super._createVertexBuffers((a = this._options.ribbonOptions) == null ? void 0 : a.smoothShading), t = new fr(this._engine, this._counters, this._updatable, 1); + const e = super._createVertexBuffers((a = this._options.ribbonOptions) == null ? void 0 : a.smoothShading), t = new dr(this._engine, this._counters, this._updatable, 1); this.setVerticesBuffer(t.createVertexBuffer("grl_counters", 0, 1)); - const i = new fr(this._engine, this._colorPointers, this._updatable, 1); + const i = new dr(this._engine, this._colorPointers, this._updatable, 1); this.setVerticesBuffer(i.createVertexBuffer("grl_colorPointers", 0, 1)); - const r = new fr(this._engine, this._slopes, this._updatable, 3); + const r = new dr(this._engine, this._slopes, this._updatable, 3); this.setVerticesBuffer(r.createVertexBuffer("grl_slopes", 0, 3)); - const s = new fr(this._engine, this._ribbonWidths, this._updatable, 1); + const s = new dr(this._engine, this._ribbonWidths, this._updatable, 1); return this.setVerticesBuffer(s.createVertexBuffer("grl_widths", 0, 1)), this._widthsBuffer = s, e; } }; @@ -59637,14 +59638,14 @@ ni._LeftReadOnlyQuaternion = Ce.RotationAxis(_.LeftReadOnly, Math.PI / 2); ni.DIRECTION_XY = _.LeftHandedForwardReadOnly; ni.DIRECTION_XZ = _.UpReadOnly; ni.DIRECTION_YZ = _.LeftReadOnly; -var Eg; +var vg; (function(n4) { n4[n4.COLOR_DISTRIBUTION_NONE = 0] = "COLOR_DISTRIBUTION_NONE", n4[n4.COLOR_DISTRIBUTION_REPEAT = 1] = "COLOR_DISTRIBUTION_REPEAT", n4[n4.COLOR_DISTRIBUTION_EVEN = 2] = "COLOR_DISTRIBUTION_EVEN", n4[n4.COLOR_DISTRIBUTION_START = 3] = "COLOR_DISTRIBUTION_START", n4[n4.COLOR_DISTRIBUTION_END = 4] = "COLOR_DISTRIBUTION_END", n4[n4.COLOR_DISTRIBUTION_START_END = 5] = "COLOR_DISTRIBUTION_START_END"; -})(Eg || (Eg = {})); -var vg; +})(vg || (vg = {})); +var Tg; (function(n4) { n4[n4.WIDTH_DISTRIBUTION_NONE = 0] = "WIDTH_DISTRIBUTION_NONE", n4[n4.WIDTH_DISTRIBUTION_REPEAT = 1] = "WIDTH_DISTRIBUTION_REPEAT", n4[n4.WIDTH_DISTRIBUTION_EVEN = 2] = "WIDTH_DISTRIBUTION_EVEN", n4[n4.WIDTH_DISTRIBUTION_START = 3] = "WIDTH_DISTRIBUTION_START", n4[n4.WIDTH_DISTRIBUTION_END = 4] = "WIDTH_DISTRIBUTION_END", n4[n4.WIDTH_DISTRIBUTION_START_END = 5] = "WIDTH_DISTRIBUTION_START_END"; -})(vg || (vg = {})); +})(Tg || (Tg = {})); B.prototype.thinInstanceAdd = function(n4, e = true) { if (!this.getScene().getEngine().getCaps().instancedArrays) return ne.Error("Thin Instances are not supported on this device as Instanced Array extension not supported"), -1; @@ -59658,7 +59659,7 @@ B.prototype.thinInstanceAdd = function(n4, e = true) { return t; }; B.prototype.thinInstanceAddSelf = function(n4 = true) { - return this.thinInstanceAdd(w.IdentityReadOnly, n4); + return this.thinInstanceAdd(L.IdentityReadOnly, n4); }; B.prototype.thinInstanceRegisterAttribute = function(n4, e) { n4 === I.ColorKind && (n4 = I.ColorInstanceKind), this.removeVerticesData(n4), this._thinInstanceInitializeUserStorage(), this._userThinInstanceBuffersStorage.strides[n4] = e, this._userThinInstanceBuffersStorage.sizes[n4] = e * Math.max(32, this._thinInstanceDataStorage.instancesCount), this._userThinInstanceBuffersStorage.data[n4] = new Float32Array(this._userThinInstanceBuffersStorage.sizes[n4]), this._userThinInstanceBuffersStorage.vertexBuffers[n4] = new I(this.getEngine(), this._userThinInstanceBuffersStorage.data[n4], n4, true, false, e, true), this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[n4]); @@ -59685,7 +59686,7 @@ Object.defineProperty(B.prototype, "thinInstanceCount", { configurable: true }); B.prototype._thinInstanceCreateMatrixBuffer = function(n4, e, t = true) { - const i = new fr(this.getEngine(), e, !t, 16, false, true); + const i = new dr(this.getEngine(), e, !t, 16, false, true); for (let r = 0; r < 4; r++) this.setVerticesBuffer(i.createVertexBuffer(n4 + r, r * 4, 4)); return i; @@ -59709,7 +59710,7 @@ B.prototype.thinInstanceGetWorldMatrices = function() { if (!this._thinInstanceDataStorage.worldMatrices) { this._thinInstanceDataStorage.worldMatrices = []; for (let e = 0; e < this._thinInstanceDataStorage.instancesCount; ++e) - this._thinInstanceDataStorage.worldMatrices[e] = w.FromArray(n4, e * 16); + this._thinInstanceDataStorage.worldMatrices[e] = L.FromArray(n4, e * 16); } return this._thinInstanceDataStorage.worldMatrices; }; @@ -59728,7 +59729,7 @@ B.prototype.thinInstanceRefreshBoundingInfo = function(n4 = false, e = false, t i.push(r.boundingBox.vectors[a].clone()); z.Vector3[0].setAll(Number.POSITIVE_INFINITY), z.Vector3[1].setAll(Number.NEGATIVE_INFINITY); for (let a = 0; a < this._thinInstanceDataStorage.instancesCount; ++a) { - w.FromArrayToRef(s, a * 16, z.Matrix[0]); + L.FromArrayToRef(s, a * 16, z.Matrix[0]); for (let o = 0; o < i.length; ++o) _.TransformCoordinatesToRef(i[o], z.Matrix[0], z.Vector3[2]), z.Vector3[0].minimizeInPlace(z.Vector3[2]), z.Vector3[1].maximizeInPlace(z.Vector3[2]); } @@ -59784,7 +59785,7 @@ var Ro; (function(n4) { n4[n4.Input = 0] = "Input", n4[n4.Output = 1] = "Output"; })(Ro || (Ro = {})); -var Tg = class { +var xg = class { /** Gets the direction of the point */ get direction() { return this._direction; @@ -60075,7 +60076,7 @@ var Ve = class { * @param name defines the block name */ constructor(e) { - this._name = "", this._isInput = false, this._isTeleportOut = false, this._isTeleportIn = false, this._isDebug = false, this._isUnique = false, this._buildExecutionTime = 0, this.onBuildObservable = new he(), this._inputs = new Array(), this._outputs = new Array(), this._codeVariableName = "", this.visibleOnFrame = false, this._name = e, this.uniqueId = rf.UniqueId; + this._name = "", this._isInput = false, this._isTeleportOut = false, this._isTeleportIn = false, this._isDebug = false, this._isUnique = false, this._buildExecutionTime = 0, this.onBuildObservable = new he(), this._inputs = new Array(), this._outputs = new Array(), this._codeVariableName = "", this.visibleOnFrame = false, this._name = e, this.uniqueId = sf.UniqueId; } /** * Register a new input. Must be called inside a block constructor @@ -60088,7 +60089,7 @@ var Ve = class { * @returns the current block */ registerInput(e, t, i = false, r, s, a) { - const o = new Tg(e, this, Ro.Input); + const o = new xg(e, this, Ro.Input); return o.type = t, o.isOptional = i, o.defaultValue = r, o.value = r, o.valueMin = s, o.valueMax = a, this._inputs.push(o), this; } /** @@ -60099,7 +60100,7 @@ var Ve = class { * @returns the current block */ registerOutput(e, t, i) { - return i = i ?? new Tg(e, this, Ro.Output), i.type = t, this._outputs.push(i), this; + return i = i ?? new xg(e, this, Ro.Output), i.type = t, this._outputs.push(i), this; } // eslint-disable-next-line @typescript-eslint/no-unused-vars _buildBlock(e) { @@ -60290,7 +60291,7 @@ var Ve = class { } }; P([ - U("comment") + w("comment") ], Ve.prototype, "comments", void 0); var D0 = class extends Ve { /** @@ -60328,9 +60329,9 @@ var ct; (function(n4) { n4[n4.None = 0] = "None", n4[n4.Positions = 1] = "Positions", n4[n4.Normals = 2] = "Normals", n4[n4.Tangents = 3] = "Tangents", n4[n4.UV = 4] = "UV", n4[n4.UV2 = 5] = "UV2", n4[n4.UV3 = 6] = "UV3", n4[n4.UV4 = 7] = "UV4", n4[n4.UV5 = 8] = "UV5", n4[n4.UV6 = 9] = "UV6", n4[n4.Colors = 10] = "Colors", n4[n4.VertexID = 11] = "VertexID", n4[n4.FaceID = 12] = "FaceID", n4[n4.GeometryID = 13] = "GeometryID", n4[n4.CollectionID = 14] = "CollectionID", n4[n4.LoopID = 15] = "LoopID", n4[n4.InstanceID = 16] = "InstanceID"; })(ct || (ct = {})); -var VP = class { +var BP = class { constructor() { - this._rotationMatrix = new w(), this._scalingMatrix = new w(), this._positionMatrix = new w(), this._scalingRotationMatrix = new w(), this._transformMatrix = new w(), this._tempVector3 = new _(), this.notConnectedNonOptionalInputs = [], this.noContextualData = [], this.vertexData = null, this._geometryContext = null, this._executionContext = null, this._instancingContext = null, this._geometryContextStack = [], this._executionContextStack = [], this._instancingContextStack = []; + this._rotationMatrix = new L(), this._scalingMatrix = new L(), this._positionMatrix = new L(), this._scalingRotationMatrix = new L(), this._transformMatrix = new L(), this._tempVector3 = new _(), this.notConnectedNonOptionalInputs = [], this.noContextualData = [], this.vertexData = null, this._geometryContext = null, this._executionContext = null, this._instancingContext = null, this._geometryContextStack = [], this._executionContextStack = [], this._instancingContextStack = []; } /** Gets or sets the geometry context */ get geometryContext() { @@ -60490,7 +60491,7 @@ var VP = class { } /** @internal */ _instantiate(e, t, i, r, s) { - w.ScalingToRef(r.x, r.y, r.z, this._scalingMatrix), w.RotationYawPitchRollToRef(i.y, i.x, i.z, this._rotationMatrix), w.TranslationToRef(t.x, t.y, t.z, this._positionMatrix), this._scalingMatrix.multiplyToRef(this._rotationMatrix, this._scalingRotationMatrix), this._scalingRotationMatrix.multiplyToRef(this._positionMatrix, this._transformMatrix); + L.ScalingToRef(r.x, r.y, r.z, this._scalingMatrix), L.RotationYawPitchRollToRef(i.y, i.x, i.z, this._rotationMatrix), L.TranslationToRef(t.x, t.y, t.z, this._positionMatrix), this._scalingMatrix.multiplyToRef(this._rotationMatrix, this._scalingRotationMatrix), this._scalingRotationMatrix.multiplyToRef(this._positionMatrix, this._transformMatrix); for (let a = 0; a < e.positions.length; a += 3) this._tempVector3.fromArray(e.positions, a), _.TransformCoordinatesToRef(this._tempVector3, this._transformMatrix, this._tempVector3), this._tempVector3.toArray(e.positions, a), e.normals && (this._tempVector3.fromArray(e.normals, a), _.TransformNormalToRef(this._tempVector3, this._scalingRotationMatrix, this._tempVector3), this._tempVector3.toArray(e.normals, a)); s.push(e); @@ -60503,7 +60504,7 @@ var VP = class { } /** @internal */ _instantiateWithPositionAndMatrix(e, t, i, r) { - w.TranslationToRef(t.x, t.y, t.z, this._positionMatrix), i.multiplyToRef(this._positionMatrix, this._transformMatrix); + L.TranslationToRef(t.x, t.y, t.z, this._positionMatrix), i.multiplyToRef(this._positionMatrix, this._transformMatrix); for (let s = 0; s < e.positions.length; s += 3) this._tempVector3.fromArray(e.positions, s), _.TransformCoordinatesToRef(this._tempVector3, this._transformMatrix, this._tempVector3), this._tempVector3.toArray(e.positions, s), e.normals && (this._tempVector3.fromArray(e.normals, s), _.TransformNormalToRef(this._tempVector3, this._transformMatrix, this._tempVector3), this._tempVector3.toArray(e.normals, s)); r.push(e); @@ -60631,7 +60632,7 @@ var si = class extends Ve { this.value = Ke.Zero(); break; case b.Matrix: - this.value = w.Identity(); + this.value = L.Identity(); break; } } @@ -60697,7 +60698,7 @@ function gt(n4, e = ht.Boolean, t = "PROPERTIES", i) { }); }; } -var Sf = class extends Ve { +var yf = class extends Ve { /** * Create a new BoxBlock * @param name defines the block name @@ -60791,7 +60792,7 @@ var Sf = class extends Ve { const t = {}, i = (r) => { t.size = this.size.getConnectedValue(r), t.width = this.width.getConnectedValue(r), t.height = this.height.getConnectedValue(r), t.depth = this.depth.getConnectedValue(r); const s = this.subdivisions.getConnectedValue(r), a = this.subdivisionsX.getConnectedValue(r), o = this.subdivisionsY.getConnectedValue(r), l = this.subdivisionsZ.getConnectedValue(r); - return s && (t.segments = s), a && (t.widthSegments = a), o && (t.heightSegments = o), l && (t.depthSegments = l), Tb(t); + return s && (t.segments = s), a && (t.widthSegments = a), o && (t.heightSegments = o), l && (t.depthSegments = l), xb(t); }; if (this.evaluateContext) this.geometry._storedFunction = i; @@ -60818,9 +60819,9 @@ var Sf = class extends Ve { }; P([ gt("Evaluate context", ht.Boolean, "ADVANCED", { notifiers: { rebuild: true } }) -], Sf.prototype, "evaluateContext", void 0); -Re("BABYLON.BoxBlock", Sf); -var hr = class _hr { +], yf.prototype, "evaluateContext", void 0); +Re("BABYLON.BoxBlock", yf); +var ur = class _ur { /** @returns the inspector from bundle or global */ _getGlobalNodeGeometryEditor() { if (typeof NODEGEOMETRYEDITOR < "u") @@ -60839,7 +60840,7 @@ var hr = class _hr { * @param name defines the name of the geometry */ constructor(e) { - this._buildId = _hr._BuildIdGenerator++, this._buildWasSuccessful = false, this._vertexData = null, this._buildExecutionTime = 0, this.BJSNODEGEOMETRYEDITOR = this._getGlobalNodeGeometryEditor(), this.editorData = null, this.attachedBlocks = [], this.onBuildObservable = new he(), this.outputBlock = null, this.name = e; + this._buildId = _ur._BuildIdGenerator++, this._buildWasSuccessful = false, this._vertexData = null, this._buildExecutionTime = 0, this.BJSNODEGEOMETRYEDITOR = this._getGlobalNodeGeometryEditor(), this.editorData = null, this.attachedBlocks = [], this.onBuildObservable = new he(), this.outputBlock = null, this.name = e; } /** * Gets the current class name of the geometry e.g. "NodeGeometry" @@ -60892,7 +60893,7 @@ var hr = class _hr { edit(e) { return new Promise((t) => { if (this.BJSNODEGEOMETRYEDITOR = this.BJSNODEGEOMETRYEDITOR || this._getGlobalNodeGeometryEditor(), typeof this.BJSNODEGEOMETRYEDITOR > "u") { - const i = e && e.editorURL ? e.editorURL : _hr.EditorURL; + const i = e && e.editorURL ? e.editorURL : _ur.EditorURL; ge.LoadBabylonScript(i, () => { this.BJSNODEGEOMETRYEDITOR = this.BJSNODEGEOMETRYEDITOR || this._getGlobalNodeGeometryEditor(), this._createNodeEditor(e == null ? void 0 : e.nodeGeometryEditorConfig), t(); }); @@ -60922,8 +60923,8 @@ var hr = class _hr { throw "You must define the outputBlock property before building the geometry"; const r = sr.Now; this._initializeBlock(this.outputBlock, i); - const s = new VP(); - s.buildId = this._buildId, s.verbose = e, this.outputBlock.build(s), t && (this._buildId = _hr._BuildIdGenerator++), this._buildExecutionTime = sr.Now - r, s.emitErrors(), this._buildWasSuccessful = true, this._vertexData = s.vertexData, this.onBuildObservable.notifyObservers(this); + const s = new BP(); + s.buildId = this._buildId, s.verbose = e, this.outputBlock.build(s), t && (this._buildId = _ur._BuildIdGenerator++), this._buildExecutionTime = sr.Now - r, s.emitErrors(), this._buildWasSuccessful = true, this._vertexData = s.vertexData, this.onBuildObservable.notifyObservers(this); } /** * Creates a mesh from the geometry blocks @@ -61065,7 +61066,7 @@ var hr = class _hr { */ setToDefault() { this.clear(), this.editorData = null; - const e = new Sf("Box"); + const e = new yf("Box"); e.autoConfigure(); const t = new D0("Geometry Output"); e.geometry.connectTo(t.geometry), this.outputBlock = t; @@ -61076,7 +61077,7 @@ var hr = class _hr { * @returns the new geometry */ clone(e) { - const t = this.serialize(), i = Le.Clone(() => new _hr(e), this); + const t = this.serialize(), i = Le.Clone(() => new _ur(e), this); return i.name = e, i.parseSerializedObject(t), i._buildId = this._buildId, i.build(false), i; } /** @@ -61110,7 +61111,7 @@ var hr = class _hr { * @returns a new NodeGeometry */ static CreateDefault(e) { - const t = new _hr(e); + const t = new _ur(e); return t.setToDefault(), t.build(), t; } /** @@ -61119,7 +61120,7 @@ var hr = class _hr { * @returns a new node geometry */ static Parse(e) { - const t = Le.Parse(() => new _hr(e.name), e, null); + const t = Le.Parse(() => new _ur(e.name), e, null); return t.parseSerializedObject(e), t.build(), t; } /** @@ -61130,13 +61131,13 @@ var hr = class _hr { * @returns a promise that will resolve to the new node geometry */ static ParseFromSnippetAsync(e, t, i = false) { - return e === "_BLANK" ? Promise.resolve(_hr.CreateDefault("blank")) : new Promise((r, s) => { + return e === "_BLANK" ? Promise.resolve(_ur.CreateDefault("blank")) : new Promise((r, s) => { const a = new mi(); a.addEventListener("readystatechange", () => { if (a.readyState == 4) if (a.status == 200) { const o = JSON.parse(JSON.parse(a.responseText).jsonPayload), l = JSON.parse(o.nodeGeometry); - t || (t = Le.Parse(() => new _hr(e), l, null)), t.parseSerializedObject(l), t.snippetId = e; + t || (t = Le.Parse(() => new _ur(e), l, null)), t.parseSerializedObject(l), t.snippetId = e; try { i || t.build(), r(t); } catch (c) { @@ -61148,16 +61149,16 @@ var hr = class _hr { }); } }; -hr._BuildIdGenerator = 0; -hr.EditorURL = `${ge._DefaultCdnUrl}/v${se.Version}/nodeGeometryEditor/babylon.nodeGeometryEditor.js`; -hr.SnippetUrl = "https://snippet.babylonjs.com"; +ur._BuildIdGenerator = 0; +ur.EditorURL = `${ge._DefaultCdnUrl}/v${se.Version}/nodeGeometryEditor/babylon.nodeGeometryEditor.js`; +ur.SnippetUrl = "https://snippet.babylonjs.com"; P([ - U() -], hr.prototype, "name", void 0); + w() +], ur.prototype, "name", void 0); P([ - U("comment") -], hr.prototype, "comment", void 0); -var yf = class extends Ve { + w("comment") +], ur.prototype, "comment", void 0); +var If = class extends Ve { /** * Creates a new GeometryOptimizeBlock * @param name defines the block name @@ -61224,11 +61225,11 @@ var yf = class extends Ve { }; P([ gt("Evaluate context", ht.Boolean, "ADVANCED", { notifiers: { rebuild: true } }) -], yf.prototype, "evaluateContext", void 0); +], If.prototype, "evaluateContext", void 0); P([ gt("Epsilon", ht.Float, "ADVANCED", { notifiers: { rebuild: true } }) -], yf.prototype, "epsilon", void 0); -Re("BABYLON.GeometryOptimizeBlock", yf); +], If.prototype, "epsilon", void 0); +Re("BABYLON.GeometryOptimizeBlock", If); var N0 = class extends Ve { /** * Create a new PlaneBlock @@ -61286,7 +61287,7 @@ var N0 = class extends Ve { } } _buildBlock(e) { - const t = {}, i = (r) => (t.size = this.size.getConnectedValue(r), t.width = this.width.getConnectedValue(r), t.height = this.height.getConnectedValue(r), Tf(t)); + const t = {}, i = (r) => (t.size = this.size.getConnectedValue(r), t.width = this.width.getConnectedValue(r), t.height = this.height.getConnectedValue(r), xf(t)); if (this.evaluateContext) this.geometry._storedFunction = i; else { @@ -61443,7 +61444,7 @@ var L0 = class extends Ve { } } _buildBlock(e) { - const t = {}, i = (r) => (t.radius = this.radius.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), t.radiusX = this.radiusX.getConnectedValue(r), t.radiusY = this.radiusY.getConnectedValue(r), t.radiusZ = this.radiusZ.getConnectedValue(r), xf(t)); + const t = {}, i = (r) => (t.radius = this.radius.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), t.radiusX = this.radiusX.getConnectedValue(r), t.radiusY = this.radiusY.getConnectedValue(r), t.radiusZ = this.radiusZ.getConnectedValue(r), Cf(t)); if (this.evaluateContext) this.geometry._storedFunction = i; else { @@ -61541,7 +61542,7 @@ var w0 = class extends Ve { } } _buildBlock(e) { - const t = {}, i = (r) => (t.segments = this.segments.getConnectedValue(r), t.diameter = this.diameter.getConnectedValue(r), t.diameterX = this.diameterX.getConnectedValue(r), t.diameterY = this.diameterY.getConnectedValue(r), t.diameterZ = this.diameterZ.getConnectedValue(r), t.arc = this.arc.getConnectedValue(r), t.slice = this.slice.getConnectedValue(r), _f(t)); + const t = {}, i = (r) => (t.segments = this.segments.getConnectedValue(r), t.diameter = this.diameter.getConnectedValue(r), t.diameterX = this.diameterX.getConnectedValue(r), t.diameterY = this.diameterY.getConnectedValue(r), t.diameterZ = this.diameterZ.getConnectedValue(r), t.arc = this.arc.getConnectedValue(r), t.slice = this.slice.getConnectedValue(r), Ef(t)); if (this.evaluateContext) this.geometry._storedFunction = i; else { @@ -61705,7 +61706,7 @@ var V0 = class extends Ve { } } _buildBlock(e) { - const t = {}, i = (r) => (t.thickness = this.thickness.getConnectedValue(r), t.diameter = this.diameter.getConnectedValue(r), t.tessellation = this.tessellation.getConnectedValue(r), vf(t)); + const t = {}, i = (r) => (t.thickness = this.thickness.getConnectedValue(r), t.diameter = this.diameter.getConnectedValue(r), t.tessellation = this.tessellation.getConnectedValue(r), Tf(t)); if (this.evaluateContext) this.geometry._storedFunction = i; else { @@ -61807,7 +61808,7 @@ var B0 = class extends Ve { } } _buildBlock(e) { - const t = {}, i = (r) => (t.height = this.height.getConnectedValue(r), t.diameter = this.diameter.getConnectedValue(r), t.diameterTop = this.diameterTop.getConnectedValue(r), t.diameterBottom = this.diameterBottom.getConnectedValue(r), t.diameterTop === -1 && (t.diameterTop = t.diameter), t.diameterBottom === -1 && (t.diameterBottom = t.diameter), t.tessellation = this.tessellation.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), t.arc = this.arc.getConnectedValue(r), Ef(t)); + const t = {}, i = (r) => (t.height = this.height.getConnectedValue(r), t.diameter = this.diameter.getConnectedValue(r), t.diameterTop = this.diameterTop.getConnectedValue(r), t.diameterBottom = this.diameterBottom.getConnectedValue(r), t.diameterTop === -1 && (t.diameterTop = t.diameter), t.diameterBottom === -1 && (t.diameterBottom = t.diameter), t.tessellation = this.tessellation.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), t.arc = this.arc.getConnectedValue(r), vf(t)); if (this.evaluateContext) this.geometry._storedFunction = i; else { @@ -61891,7 +61892,7 @@ var k0 = class extends Ve { } } _buildBlock(e) { - const t = {}, i = (r) => (t.height = this.height.getConnectedValue(r), t.radius = this.radius.getConnectedValue(r), t.tessellation = this.tessellation.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), Cf(t)); + const t = {}, i = (r) => (t.height = this.height.getConnectedValue(r), t.radius = this.radius.getConnectedValue(r), t.tessellation = this.tessellation.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), Rf(t)); if (this.evaluateContext) this.geometry._storedFunction = i; else { @@ -61965,7 +61966,7 @@ var z0 = class extends Ve { } } _buildBlock(e) { - const t = {}, i = (r) => (t.radius = this.radius.getConnectedValue(r), t.tessellation = this.tessellation.getConnectedValue(r), t.arc = this.arc.getConnectedValue(r), mf(t)); + const t = {}, i = (r) => (t.radius = this.radius.getConnectedValue(r), t.tessellation = this.tessellation.getConnectedValue(r), t.arc = this.arc.getConnectedValue(r), _f(t)); if (this.evaluateContext) this.geometry._storedFunction = i; else { @@ -61993,7 +61994,7 @@ P([ gt("Evaluate context", ht.Boolean, "ADVANCED", { notifiers: { rebuild: true } }) ], z0.prototype, "evaluateContext", void 0); Re("BABYLON.DiscBlock", z0); -var BP = class extends Ve { +var kP = class extends Ve { /** * Create a new NullBlock * @param name defines the block name @@ -62018,7 +62019,7 @@ var BP = class extends Ve { this.geometry._storedValue = null; } }; -Re("BABYLON.NullBlock", BP); +Re("BABYLON.NullBlock", kP); var W0 = class extends Ve { /** * Create a new SetPositionsBlock @@ -62202,7 +62203,7 @@ P([ gt("Evaluate context", ht.Boolean, "ADVANCED", { notifiers: { rebuild: true } }) ], G0.prototype, "evaluateContext", void 0); Re("BABYLON.SetNormalsBlock", G0); -var If = class extends Ve { +var bf = class extends Ve { /** * Create a new SetUVsBlock * @param name defines the block name @@ -62315,7 +62316,7 @@ var If = class extends Ve { }; P([ gt("Evaluate context", ht.Boolean, "ADVANCED", { notifiers: { rebuild: true } }) -], If.prototype, "evaluateContext", void 0); +], bf.prototype, "evaluateContext", void 0); P([ gt("Texture coordinates index", ht.List, "ADVANCED", { notifiers: { update: true }, @@ -62328,8 +62329,8 @@ P([ { label: "UV6", value: 5 } ] }) -], If.prototype, "textureCoordinateIndex", void 0); -Re("BABYLON.SetUVsBlock", If); +], bf.prototype, "textureCoordinateIndex", void 0); +Re("BABYLON.SetUVsBlock", bf); var X0 = class extends Ve { /** * Create a new SetColorsBlock @@ -62686,7 +62687,7 @@ P([ }) ], K0.prototype, "operation", void 0); Re("BABYLON.MathBlock", K0); -var kP = class extends Ve { +var zP = class extends Ve { /** * Create a new MapRangeBlock * @param name defines the block name @@ -62748,7 +62749,7 @@ var kP = class extends Ve { }; } }; -Re("BABYLON.MapRangeBlock", kP); +Re("BABYLON.MapRangeBlock", zP); var fi; (function(n4) { n4[n4.Equal = 0] = "Equal", n4[n4.NotEqual = 1] = "NotEqual", n4[n4.LessThan = 2] = "LessThan", n4[n4.GreaterThan = 3] = "GreaterThan", n4[n4.LessOrEqual = 4] = "LessOrEqual", n4[n4.GreaterOrEqual = 5] = "GreaterOrEqual", n4[n4.Xor = 6] = "Xor", n4[n4.Or = 7] = "Or", n4[n4.And = 8] = "And"; @@ -62872,17 +62873,17 @@ P([ }) ], q0.prototype, "test", void 0); Re("BABYLON.ConditionBlock", q0); -var Yr; +var Zr; (function(n4) { n4[n4.None = 0] = "None", n4[n4.LoopID = 1] = "LoopID", n4[n4.InstanceID = 2] = "InstanceID"; -})(Yr || (Yr = {})); +})(Zr || (Zr = {})); var Y0 = class extends Ve { /** * Create a new RandomBlock * @param name defines the block name */ constructor(e) { - super(e), this._currentLockId = -1, this.lockMode = Yr.None, this.registerInput("min", b.AutoDetect), this.registerInput("max", b.AutoDetect), this.registerOutput("output", b.BasedOnInput), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Geometry), this._inputs[1].excludedConnectionPointTypes.push(b.Texture), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1); + super(e), this._currentLockId = -1, this.lockMode = Zr.None, this.registerInput("min", b.AutoDetect), this.registerInput("max", b.AutoDetect), this.registerOutput("output", b.BasedOnInput), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Geometry), this._inputs[1].excludedConnectionPointTypes.push(b.Texture), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1); } /** * Gets the current class name @@ -62952,21 +62953,21 @@ var Y0 = class extends Ve { break; } } - this.lockMode === Yr.None || !e ? this.output._storedFunction = e : this.output._storedFunction = (t) => { + this.lockMode === Zr.None || !e ? this.output._storedFunction = e : this.output._storedFunction = (t) => { let i = 0; switch (this.lockMode) { - case Yr.InstanceID: + case Zr.InstanceID: i = t.getContextualValue(ct.InstanceID, true) || 0; break; - case Yr.LoopID: + case Zr.LoopID: i = t.getContextualValue(ct.LoopID, true) || 0; break; } - return (this._currentLockId !== i || this.lockMode === Yr.None) && (this._currentLockId = i, this.output._storedValue = e(t)), this.output._storedValue; + return (this._currentLockId !== i || this.lockMode === Zr.None) && (this._currentLockId = i, this.output._storedValue = e(t)), this.output._storedValue; }; } _dumpPropertiesCode() { - return super._dumpPropertiesCode() + `${this._codeVariableName}.lockMode = BABYLON.RandomBlockLocks.${Yr[this.lockMode]}; + return super._dumpPropertiesCode() + `${this._codeVariableName}.lockMode = BABYLON.RandomBlockLocks.${Zr[this.lockMode]}; `; } /** @@ -62985,14 +62986,14 @@ P([ gt("LockMode", ht.List, "ADVANCED", { notifiers: { rebuild: true }, options: [ - { label: "None", value: Yr.None }, - { label: "LoopID", value: Yr.LoopID }, - { label: "InstanceID", value: Yr.InstanceID } + { label: "None", value: Zr.None }, + { label: "LoopID", value: Zr.LoopID }, + { label: "InstanceID", value: Zr.InstanceID } ] }) ], Y0.prototype, "lockMode", void 0); Re("BABYLON.RandomBlock", Y0); -var zP = class extends Ve { +var WP = class extends Ve { /** * Create a new NoiseBlock * @param name defines the block name @@ -63101,7 +63102,7 @@ var zP = class extends Ve { }; } }; -Re("BABYLON.NoiseBlock", zP); +Re("BABYLON.NoiseBlock", WP); var Z0 = class extends Ve { /** * Create a new MergeGeometryBlock @@ -63317,7 +63318,7 @@ P([ gt("Evaluate context", ht.Boolean, "ADVANCED", { notifiers: { rebuild: true } }) ], j0.prototype, "evaluateContext", void 0); Re("BABYLON.GeometryCollectionBlock", j0); -var WP = class extends Ve { +var GP = class extends Ve { /** * Creates a new GeometryElbowBlock * @param name defines the block name @@ -63356,8 +63357,8 @@ var WP = class extends Ve { t._storedFunction = (r) => i.getConnectedValue(r); } }; -Re("BABYLON.GeometryElbowBlock", WP); -var GP = class extends Ve { +Re("BABYLON.GeometryElbowBlock", GP); +var XP = class extends Ve { /** * Creates a new ComputeNormalsBlock * @param name defines the block name @@ -63393,8 +63394,8 @@ var GP = class extends Ve { }; } }; -Re("BABYLON.ComputeNormalsBlock", GP); -var XP = class extends Ve { +Re("BABYLON.ComputeNormalsBlock", XP); +var HP = class extends Ve { /** * Create a new VectorConverterBlock * @param name defines the block name @@ -63562,8 +63563,8 @@ var XP = class extends Ve { }, p._storedFunction = (C) => E(C).x, g._storedFunction = (C) => E(C).y, m._storedFunction = (C) => E(C).z, v._storedFunction = (C) => E(C).w; } }; -Re("BABYLON.VectorConverterBlock", XP); -var HP = class extends Ve { +Re("BABYLON.VectorConverterBlock", HP); +var KP = class extends Ve { /** * Creates a new NormalizeVectorBlock * @param name defines the block name @@ -63598,7 +63599,7 @@ var HP = class extends Ve { this.output._storedFunction = (t) => this.input.getConnectedValue(t).normalize(); } }; -Re("BABYLON.NormalizeVectorBlock", HP); +Re("BABYLON.NormalizeVectorBlock", KP); var Q0 = class extends Ve { /** * Create a new SetMaterialIDBlock @@ -63870,7 +63871,7 @@ var $0 = class extends Ve { * @param name defines the block name */ constructor(e) { - super(e), this._rotationMatrix = new w(), this._scalingMatrix = new w(), this._translationMatrix = new w(), this._scalingRotationMatrix = new w(), this._transformMatrix = new w(), this.evaluateContext = true, this.registerInput("value", b.AutoDetect), this.registerInput("matrix", b.Matrix, true), this.registerInput("translation", b.Vector3, true, _.Zero()), this.registerInput("rotation", b.Vector3, true, _.Zero()), this.registerInput("scaling", b.Vector3, true, _.One()), this.registerOutput("output", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Texture); + super(e), this._rotationMatrix = new L(), this._scalingMatrix = new L(), this._translationMatrix = new L(), this._scalingRotationMatrix = new L(), this._transformMatrix = new L(), this.evaluateContext = true, this.registerInput("value", b.AutoDetect), this.registerInput("matrix", b.Matrix, true), this.registerInput("translation", b.Vector3, true, _.Zero()), this.registerInput("rotation", b.Vector3, true, _.Zero()), this.registerInput("scaling", b.Vector3, true, _.One()), this.registerOutput("output", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Texture); } /** * Gets the current class name @@ -63929,7 +63930,7 @@ var $0 = class extends Ve { s = this.matrix.getConnectedValue(i); else { const a = this.scaling.getConnectedValue(i), o = this.rotation.getConnectedValue(i), l = this.translation.getConnectedValue(i); - w.ScalingToRef(a.x, a.y, a.z, this._scalingMatrix), w.RotationYawPitchRollToRef(o.y, o.x, o.z, this._rotationMatrix), w.TranslationToRef(l.x, l.y, l.z, this._translationMatrix), this._scalingMatrix.multiplyToRef(this._rotationMatrix, this._scalingRotationMatrix), this._scalingRotationMatrix.multiplyToRef(this._translationMatrix, this._transformMatrix), s = this._transformMatrix; + L.ScalingToRef(a.x, a.y, a.z, this._scalingMatrix), L.RotationYawPitchRollToRef(o.y, o.x, o.z, this._rotationMatrix), L.TranslationToRef(l.x, l.y, l.z, this._translationMatrix), this._scalingMatrix.multiplyToRef(this._rotationMatrix, this._scalingRotationMatrix), this._scalingRotationMatrix.multiplyToRef(this._translationMatrix, this._transformMatrix), s = this._transformMatrix; } switch (this.value.type) { case b.Geometry: { @@ -63967,7 +63968,7 @@ P([ gt("Evaluate context", ht.Boolean, "ADVANCED", { notifiers: { rebuild: true } }) ], $0.prototype, "evaluateContext", void 0); Re("BABYLON.GeometryTransformBlock", $0); -var KP = class extends Ve { +var qP = class extends Ve { /** * Create a new RotationXBlock * @param name defines the block name @@ -64001,11 +64002,11 @@ var KP = class extends Ve { } } _buildBlock(e) { - super._buildBlock(e), this.matrix._storedFunction = (t) => w.RotationX(this.angle.getConnectedValue(t)); + super._buildBlock(e), this.matrix._storedFunction = (t) => L.RotationX(this.angle.getConnectedValue(t)); } }; -Re("BABYLON.RotationXBlock", KP); -var qP = class extends Ve { +Re("BABYLON.RotationXBlock", qP); +var YP = class extends Ve { /** * Create a new RotationYBlock * @param name defines the block name @@ -64039,11 +64040,11 @@ var qP = class extends Ve { } } _buildBlock(e) { - super._buildBlock(e), this.matrix._storedFunction = (t) => w.RotationY(this.angle.getConnectedValue(t)); + super._buildBlock(e), this.matrix._storedFunction = (t) => L.RotationY(this.angle.getConnectedValue(t)); } }; -Re("BABYLON.RotationYBlock", qP); -var YP = class extends Ve { +Re("BABYLON.RotationYBlock", YP); +var ZP = class extends Ve { /** * Create a new RotationZBlock * @param name defines the block name @@ -64077,11 +64078,11 @@ var YP = class extends Ve { } } _buildBlock(e) { - super._buildBlock(e), this.matrix._storedFunction = (t) => w.RotationZ(this.angle.getConnectedValue(t)); + super._buildBlock(e), this.matrix._storedFunction = (t) => L.RotationZ(this.angle.getConnectedValue(t)); } }; -Re("BABYLON.RotationZBlock", YP); -var ZP = class extends Ve { +Re("BABYLON.RotationZBlock", ZP); +var jP = class extends Ve { /** * Create a new ScalingBlock * @param name defines the block name @@ -64117,12 +64118,12 @@ var ZP = class extends Ve { _buildBlock(e) { super._buildBlock(e), this.matrix._storedFunction = (t) => { const i = this.scale.getConnectedValue(t); - return w.Scaling(i.x, i.y, i.z); + return L.Scaling(i.x, i.y, i.z); }; } }; -Re("BABYLON.ScalingBlock", ZP); -var jP = class extends Ve { +Re("BABYLON.ScalingBlock", jP); +var QP = class extends Ve { /** * Create a new AlignBlock * @param name defines the block name @@ -64157,13 +64158,13 @@ var jP = class extends Ve { } _buildBlock(e) { super._buildBlock(e), this.matrix._storedFunction = (t) => { - const i = this.source.getConnectedValue(t).clone(), r = this.target.getConnectedValue(t).clone(), s = new w(); - return i.normalize(), r.normalize(), w.RotationAlignToRef(i, r, s, true), s; + const i = this.source.getConnectedValue(t).clone(), r = this.target.getConnectedValue(t).clone(), s = new L(); + return i.normalize(), r.normalize(), L.RotationAlignToRef(i, r, s, true), s; }; } }; -Re("BABYLON.AlignBlock", jP); -var QP = class extends Ve { +Re("BABYLON.AlignBlock", QP); +var JP = class extends Ve { /** * Create a new TranslationBlock * @param name defines the block name @@ -64199,12 +64200,12 @@ var QP = class extends Ve { _buildBlock(e) { super._buildBlock(e), this.matrix._storedFunction = (t) => { const i = this.translation.getConnectedValue(t); - return w.Translation(i.x, i.y, i.z); + return L.Translation(i.x, i.y, i.z); }; } }; -Re("BABYLON.TranslationBlock", QP); -var bf = class extends Ve { +Re("BABYLON.TranslationBlock", JP); +var Af = class extends Ve { /** * Create a new InstantiateOnVerticesBlock * @param name defines the block name @@ -64363,11 +64364,11 @@ var bf = class extends Ve { }; P([ gt("Evaluate context", ht.Boolean, "ADVANCED", { notifiers: { rebuild: true } }) -], bf.prototype, "evaluateContext", void 0); +], Af.prototype, "evaluateContext", void 0); P([ gt("Remove duplicated positions", ht.Boolean, "ADVANCED", { notifiers: { update: true } }) -], bf.prototype, "removeDuplicatedPositions", void 0); -Re("BABYLON.InstantiateOnVerticesBlock", bf); +], Af.prototype, "removeDuplicatedPositions", void 0); +Re("BABYLON.InstantiateOnVerticesBlock", Af); var eE = class extends Ve { /** * Create a new InstantiateOnFacesBlock @@ -64746,7 +64747,7 @@ var ot = class _ot { */ update(e, t, i, r, s, a, o, l = false) { if (l) { - _ot._RayDistant || (_ot._RayDistant = _ot.Zero()), _ot._RayDistant.unprojectRayToRef(e, t, i, r, w.IdentityReadOnly, a, o); + _ot._RayDistant || (_ot._RayDistant = _ot.Zero()), _ot._RayDistant.unprojectRayToRef(e, t, i, r, L.IdentityReadOnly, a, o); const c = z.Matrix[0]; s.invertToRef(c), _ot.TransformToRef(_ot._RayDistant, c, this); } else @@ -64783,7 +64784,7 @@ var ot = class _ot { * @param world a matrix to transform the ray to. Default is the identity matrix. * @returns the new ray */ - static CreateNewFromTo(e, t, i = w.IdentityReadOnly) { + static CreateNewFromTo(e, t, i = L.IdentityReadOnly) { const r = new _ot(new _(0, 0, 0), new _(0, 0, 0)); return _ot.CreateFromToToRef(e, t, r, i); } @@ -64796,7 +64797,7 @@ var ot = class _ot { * @param world a matrix to transform the ray to. Default is the identity matrix. * @returns the ref ray */ - static CreateFromToToRef(e, t, i, r = w.IdentityReadOnly) { + static CreateFromToToRef(e, t, i, r = L.IdentityReadOnly) { i.origin.copyFrom(e); const s = t.subtractToRef(e, i.direction), a = Math.sqrt(s.x * s.x + s.y * s.y + s.z * s.z); return i.length = a, i.direction.normalize(), _ot.TransformToRef(i, r, i); @@ -64859,7 +64860,7 @@ Ot.prototype.createPickingRayToRef = function(n4, e, t, i, r, s = false, a = fal if (!r && !(r = this.activeCamera)) return this; const l = r.viewport, c = o.getRenderHeight(), { x: h, y: u, width: f, height: d } = l.toGlobal(o.getRenderWidth(), c), p = 1 / o.getHardwareScalingLevel(); - return n4 = n4 * p - h, e = e * p - (c - u - d), i.update(n4, e, f, d, t || w.IdentityReadOnly, s ? w.IdentityReadOnly : r.getViewMatrix(), r.getProjectionMatrix(), a), this; + return n4 = n4 * p - h, e = e * p - (c - u - d), i.update(n4, e, f, d, t || L.IdentityReadOnly, s ? L.IdentityReadOnly : r.getViewMatrix(), r.getProjectionMatrix(), a), this; }; Ot.prototype.createPickingRayInCameraSpace = function(n4, e, t) { const i = ot.Zero(); @@ -64871,7 +64872,7 @@ Ot.prototype.createPickingRayInCameraSpaceToRef = function(n4, e, t, i) { const r = this.getEngine(); if (!i && !(i = this.activeCamera)) throw new Error("Active camera not set"); - const s = i.viewport, a = r.getRenderHeight(), { x: o, y: l, width: c, height: h } = s.toGlobal(r.getRenderWidth(), a), u = w.Identity(), f = 1 / r.getHardwareScalingLevel(); + const s = i.viewport, a = r.getRenderHeight(), { x: o, y: l, width: c, height: h } = s.toGlobal(r.getRenderWidth(), a), u = L.Identity(), f = 1 / r.getHardwareScalingLevel(); return n4 = n4 * f - o, e = e * f - (a - l - h), t.update(n4, e, c, h, u, u, i.getProjectionMatrix()), this; }; Ot.prototype._internalPickForMesh = function(n4, e, t, i, r, s, a, o) { @@ -64942,7 +64943,7 @@ Ot.prototype.pickWithBoundingInfo = function(n4, e, t, i, r) { if (!ps) return null; const s = this._internalPick((a) => (this._tempPickingRay || (this._tempPickingRay = ot.Zero()), this.createPickingRayToRef(n4, e, a, this._tempPickingRay, r || null), this._tempPickingRay), t, i, true); - return s && (s.ray = this.createPickingRay(n4, e, w.Identity(), r || null)), s; + return s && (s.ray = this.createPickingRay(n4, e, L.Identity(), r || null)), s; }; Object.defineProperty(Ot.prototype, "_pickingAvailable", { get: () => true, @@ -64951,17 +64952,17 @@ Object.defineProperty(Ot.prototype, "_pickingAvailable", { }); Ot.prototype.pick = function(n4, e, t, i, r, s, a = false) { const o = this._internalPick((l, c) => (this._tempPickingRay || (this._tempPickingRay = ot.Zero()), this.createPickingRayToRef(n4, e, l, this._tempPickingRay, r || null, false, c), this._tempPickingRay), t, i, false, s); - return o && (o.ray = this.createPickingRay(n4, e, w.Identity(), r || null)), o; + return o && (o.ray = this.createPickingRay(n4, e, L.Identity(), r || null)), o; }; Ot.prototype.pickWithRay = function(n4, e, t, i) { - const r = this._internalPick((s) => (this._pickWithRayInverseMatrix || (this._pickWithRayInverseMatrix = w.Identity()), s.invertToRef(this._pickWithRayInverseMatrix), this._cachedRayForTransform || (this._cachedRayForTransform = ot.Zero()), ot.TransformToRef(n4, this._pickWithRayInverseMatrix, this._cachedRayForTransform), this._cachedRayForTransform), e, t, false, i); + const r = this._internalPick((s) => (this._pickWithRayInverseMatrix || (this._pickWithRayInverseMatrix = L.Identity()), s.invertToRef(this._pickWithRayInverseMatrix), this._cachedRayForTransform || (this._cachedRayForTransform = ot.Zero()), ot.TransformToRef(n4, this._pickWithRayInverseMatrix, this._cachedRayForTransform), this._cachedRayForTransform), e, t, false, i); return r && (r.ray = n4), r; }; Ot.prototype.multiPick = function(n4, e, t, i, r) { return this._internalMultiPick((s) => this.createPickingRay(n4, e, s, i || null), t, r); }; Ot.prototype.multiPickWithRay = function(n4, e, t) { - return this._internalMultiPick((i) => (this._pickWithRayInverseMatrix || (this._pickWithRayInverseMatrix = w.Identity()), i.invertToRef(this._pickWithRayInverseMatrix), this._cachedRayForTransform || (this._cachedRayForTransform = ot.Zero()), ot.TransformToRef(n4, this._pickWithRayInverseMatrix, this._cachedRayForTransform), this._cachedRayForTransform), e, t); + return this._internalMultiPick((i) => (this._pickWithRayInverseMatrix || (this._pickWithRayInverseMatrix = L.Identity()), i.invertToRef(this._pickWithRayInverseMatrix), this._cachedRayForTransform || (this._cachedRayForTransform = ot.Zero()), ot.TransformToRef(n4, this._pickWithRayInverseMatrix, this._cachedRayForTransform), this._cachedRayForTransform), e, t); }; $e.prototype.getForwardRay = function(n4 = 100, e, t) { return this.getForwardRayToRef(new ot(_.Zero(), _.Zero(), n4), n4, e, t); @@ -65210,7 +65211,7 @@ var Bc = class extends Ve { P([ gt("Evaluate context", ht.Boolean, "ADVANCED", { notifiers: { rebuild: true } }) ], Bc.prototype, "evaluateContext", void 0); -var JP = class extends Bc { +var $P = class extends Bc { /** * Create a new InstantiateBlock * @param name defines the block name @@ -65306,8 +65307,8 @@ var JP = class extends Bc { this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e)); } }; -Re("BABYLON.InstantiateBlock", JP); -var $P = class extends Bc { +Re("BABYLON.InstantiateBlock", $P); +var eO = class extends Bc { /** * Create a new Instantiate Linear Block * @param name defines the block name @@ -65343,13 +65344,13 @@ var $P = class extends Bc { _buildBlock(e) { const t = (i) => { i.pushExecutionContext(this), i.pushInstancingContext(this); - const r = this.count.getConnectedValue(i), s = [], a = w.Identity(), o = _.Zero(), l = _.Zero(), c = _.Zero(); + const r = this.count.getConnectedValue(i), s = [], a = L.Identity(), o = _.Zero(), l = _.Zero(), c = _.Zero(); for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) { const h = this.instance.getConnectedValue(i); if (!h || !h.positions || h.positions.length === 0) continue; const u = h.clone(), f = this.direction.getConnectedValue(i), d = this.rotation.getConnectedValue(i), p = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly); - o.copyFrom(f.clone().scale(this._currentIndex)), l.copyFrom(d.clone().scale(this._currentIndex)), c.copyFrom(p.clone().scale(this._currentIndex)), c.addInPlaceFromFloats(1, 1, 1), w.ComposeToRef(c, Ce.FromEulerAngles(l.x, l.y, l.z), o, a), i._instantiateWithMatrix(u, a, s); + o.copyFrom(f.clone().scale(this._currentIndex)), l.copyFrom(d.clone().scale(this._currentIndex)), c.copyFrom(p.clone().scale(this._currentIndex)), c.addInPlaceFromFloats(1, 1, 1), L.ComposeToRef(c, Ce.FromEulerAngles(l.x, l.y, l.z), o, a), i._instantiateWithMatrix(u, a, s); } if (s.length) if (s.length === 1) @@ -65363,8 +65364,8 @@ var $P = class extends Bc { this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e)); } }; -Re("BABYLON.InstantiateLinearBlock", $P); -var eO = class extends Bc { +Re("BABYLON.InstantiateLinearBlock", eO); +var tO = class extends Bc { /** * Create a new InstantiateRadialBlock * @param name defines the block name @@ -65418,13 +65419,13 @@ var eO = class extends Bc { _buildBlock(e) { const t = (i) => { i.pushExecutionContext(this), i.pushInstancingContext(this); - const r = this.count.getConnectedValue(i), s = [], a = w.Identity(), o = w.Identity(), l = w.Identity(), c = _.Zero(), h = _.Zero(), u = _.Zero(); + const r = this.count.getConnectedValue(i), s = [], a = L.Identity(), o = L.Identity(), l = L.Identity(), c = _.Zero(), h = _.Zero(), u = _.Zero(); for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) { const f = this.instance.getConnectedValue(i); if (!f || !f.positions || f.positions.length === 0) continue; const d = f.clone(), p = this.radius.getConnectedValue(i), g = this.angleStart.getConnectedValue(i), m = this.angleEnd.getConnectedValue(i), v = this.transform.getConnectedValue(i), E = this.rotation.getConnectedValue(i), C = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly), R = (m - g) / r, x = g + R * this._currentIndex, S = Ce.FromEulerAngles(0, x, 0); - c.copyFrom(v.clone().scale(this._currentIndex)), h.copyFrom(E.clone().scale(this._currentIndex)), u.copyFrom(C.clone().scale(this._currentIndex)), u.addInPlaceFromFloats(1, 1, 1), w.RotationYawPitchRollToRef(h.y, h.x, h.z, a), o.setTranslationFromFloats(0, 0, p), w.ComposeToRef(u, S, c, l), a.multiplyToRef(o, o), o.multiplyToRef(l, l), i._instantiateWithMatrix(d, l, s); + c.copyFrom(v.clone().scale(this._currentIndex)), h.copyFrom(E.clone().scale(this._currentIndex)), u.copyFrom(C.clone().scale(this._currentIndex)), u.addInPlaceFromFloats(1, 1, 1), L.RotationYawPitchRollToRef(h.y, h.x, h.z, a), o.setTranslationFromFloats(0, 0, p), L.ComposeToRef(u, S, c, l), a.multiplyToRef(o, o), o.multiplyToRef(l, l), i._instantiateWithMatrix(d, l, s); } if (s.length) if (s.length === 1) @@ -65438,8 +65439,8 @@ var eO = class extends Bc { this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e)); } }; -Re("BABYLON.InstantiateRadialBlock", eO); -var tO = class extends Ve { +Re("BABYLON.InstantiateRadialBlock", tO); +var iO = class extends Ve { /** * Create a new IntFloatConverterBlock * @param name defines the block name @@ -65485,17 +65486,17 @@ var tO = class extends Ve { this.floatOut._storedFunction = (e) => this.floatIn.isConnected ? this.floatIn.getConnectedValue(e) : this.intIn.isConnected ? this.intIn.getConnectedValue(e) : 0, this.intOut._storedFunction = (e) => this.floatIn.isConnected ? Math.floor(this.floatIn.getConnectedValue(e)) : this.intIn.isConnected ? Math.floor(this.intIn.getConnectedValue(e)) : 0; } }; -Re("BABYLON.IntFloatConverterBlock", tO); -function iO(n4, e) { +Re("BABYLON.IntFloatConverterBlock", iO); +function rO(n4, e) { return `{X: ${n4.x.toFixed(e)} Y: ${n4.y.toFixed(e)}}`; } -function rO(n4, e) { +function sO(n4, e) { return `{X: ${n4._x.toFixed(e)} Y: ${n4._y.toFixed(e)} Z: ${n4._z.toFixed(e)}}`; } -function sO(n4, e) { +function nO(n4, e) { return `{X: ${n4.x.toFixed(e)} Y: ${n4.y.toFixed(e)} Z: ${n4.z.toFixed(e)} W: ${n4.w.toFixed(e)}}`; } -var nO = class extends Ve { +var aO = class extends Ve { /** * Create a new DebugBlock * @param name defines the block name @@ -65540,13 +65541,13 @@ var nO = class extends Ve { return this.log.push(["null", ""]), r; switch (this.input.type) { case b.Vector2: - this.log.push([iO(r, 4), r.toString()]); + this.log.push([rO(r, 4), r.toString()]); break; case b.Vector3: - this.log.push([rO(r, 4), r.toString()]); + this.log.push([sO(r, 4), r.toString()]); break; case b.Vector4: - this.log.push([sO(r, 4), r.toString()]); + this.log.push([nO(r, 4), r.toString()]); break; default: this.log.push([r.toString(), r.toString()]); @@ -65557,8 +65558,8 @@ var nO = class extends Ve { this.output.isConnected ? this.output._storedFunction = t : this.output._storedValue = t(e); } }; -Re("BABYLON.DebugBlock", nO); -var aO = class extends Ve { +Re("BABYLON.DebugBlock", aO); +var oO = class extends Ve { /** * Create a new GeometryInfoBlock * @param name defines the block name @@ -65617,7 +65618,7 @@ var aO = class extends Ve { this.output._storedFunction = (e) => (this._currentVertexData = this.geometry.getConnectedValue(e), this._currentVertexData), this.id._storedFunction = (e) => (this._currentVertexData = this._currentVertexData || this.geometry.getConnectedValue(e), this._currentVertexData.uniqueId), this.collectionId._storedFunction = (e) => (this._currentVertexData = this._currentVertexData || this.geometry.getConnectedValue(e), this._currentVertexData.metadata ? this._currentVertexData.metadata.collectionId : 0), this.verticesCount._storedFunction = (e) => (this._currentVertexData = this._currentVertexData || this.geometry.getConnectedValue(e), this._currentVertexData.positions ? this._currentVertexData.positions.length / 3 : 0), this.facesCount._storedFunction = (e) => (this._currentVertexData = this._currentVertexData || this.geometry.getConnectedValue(e), this._currentVertexData.indices ? this._currentVertexData.indices.length / 3 : 0); } }; -Re("BABYLON.GeometryInfoBlock", aO); +Re("BABYLON.GeometryInfoBlock", oO); var ls; (function(n4) { n4[n4.Spherical = 0] = "Spherical", n4[n4.Cylindrical = 1] = "Cylindrical", n4[n4.Cubic = 2] = "Cubic"; @@ -65718,7 +65719,7 @@ P([ }) ], iE.prototype, "mapping", void 0); Re("BABYLON.MappingBlock", iE); -var oO = class extends Ve { +var lO = class extends Ve { /** * Create a new MatrixComposeBlock * @param name defines the block name @@ -65760,8 +65761,8 @@ var oO = class extends Ve { }; } }; -Re("BABYLON.MatrixComposeBlock", oO); -var lO = class extends Ve { +Re("BABYLON.MatrixComposeBlock", lO); +var cO = class extends Ve { /** Gets the list of attached endpoints */ get endpoints() { return this._endpoints; @@ -65851,8 +65852,8 @@ var lO = class extends Ve { e.output._storedFunction = (t) => this.input.getConnectedValue(t); } }; -Re("BABYLON.TeleportInBlock", lO); -var cO = class extends Ve { +Re("BABYLON.TeleportInBlock", cO); +var hO = class extends Ve { /** * Create a new TeleportOutBlock * @param name defines the block name @@ -65922,7 +65923,7 @@ var cO = class extends Ve { super._deserialize(e), this._tempEntryPointUniqueId = e.entryPoint; } }; -Re("BABYLON.TeleportOutBlock", cO); +Re("BABYLON.TeleportOutBlock", hO); var rE = class extends Ve { /** * Gets the texture data @@ -66010,7 +66011,7 @@ var rE = class extends Ve { return; } const r = e.getSize(); - j1.GetTextureDataAsync(e, r.width, r.height).then(async (s) => { + Q1.GetTextureDataAsync(e, r.width, r.height).then(async (s) => { const a = new Float32Array(s.length); for (let o = 0; o < s.length; o++) a[o] = s[o] / 255; @@ -66160,7 +66161,7 @@ P([ gt("Clamp Coordinates", ht.Boolean, "ADVANCED", { notifiers: { rebuild: true } }) ], sE.prototype, "clampCoordinates", void 0); Re("BABYLON.GeometryTextureFetchBlock", sE); -var hO = class extends Ve { +var uO = class extends Ve { /** * Create a new BoundingBlock * @param name defines the block name @@ -66203,12 +66204,12 @@ var hO = class extends Ve { }; } }; -Re("BABYLON.BoundingBlock", hO); +Re("BABYLON.BoundingBlock", uO); var cs; (function(n4) { n4[n4.Intersect = 0] = "Intersect", n4[n4.Subtract = 1] = "Subtract", n4[n4.Union = 2] = "Union"; })(cs || (cs = {})); -var Af = class extends Ve { +var Mf = class extends Ve { /** * Create a new BooleanGeometryBlock * @param name defines the block name @@ -66285,7 +66286,7 @@ var Af = class extends Ve { }; P([ gt("Evaluate context", ht.Boolean, "ADVANCED", { notifiers: { rebuild: true } }) -], Af.prototype, "evaluateContext", void 0); +], Mf.prototype, "evaluateContext", void 0); P([ gt("Operation", ht.List, "ADVANCED", { notifiers: { rebuild: true }, @@ -66295,9 +66296,9 @@ P([ { label: "Union", value: cs.Union } ] }) -], Af.prototype, "operation", void 0); -Re("BABYLON.BooleanGeometryBlock", Af); -var uO = class extends Ve { +], Mf.prototype, "operation", void 0); +Re("BABYLON.BooleanGeometryBlock", Mf); +var fO = class extends Ve { /** * Creates a new GeometryArcTan2Block * @param name defines the block name @@ -66353,8 +66354,8 @@ var uO = class extends Ve { }; } }; -Re("BABYLON.GeometryArcTan2Block", uO); -var fO = class extends Ve { +Re("BABYLON.GeometryArcTan2Block", fO); +var dO = class extends Ve { /** * Creates a new GeometryLerpBlock * @param name defines the block name @@ -66416,8 +66417,8 @@ var fO = class extends Ve { }, this; } }; -Re("BABYLON.GeometryLerpBlock", fO); -var dO = class extends Ve { +Re("BABYLON.GeometryLerpBlock", dO); +var pO = class extends Ve { /** * Creates a new GeometryNLerpBlock * @param name defines the block name @@ -66485,8 +66486,8 @@ var dO = class extends Ve { }, this; } }; -Re("BABYLON.GeometryNLerpBlock", dO); -var pO = class extends Ve { +Re("BABYLON.GeometryNLerpBlock", pO); +var gO = class extends Ve { /** * Creates a new GeometryStepBlock * @param name defines the block name @@ -66542,8 +66543,8 @@ var pO = class extends Ve { }, this; } }; -Re("BABYLON.GeometryStepBlock", pO); -var gO = class extends Ve { +Re("BABYLON.GeometryStepBlock", gO); +var mO = class extends Ve { /** * Creates a new GeometrySmoothStepBlock * @param name defines the block name @@ -66608,8 +66609,8 @@ var gO = class extends Ve { }, this; } }; -Re("BABYLON.GeometrySmoothStepBlock", gO); -var mO = class extends Ve { +Re("BABYLON.GeometrySmoothStepBlock", mO); +var _O = class extends Ve { /** * Creates a new GeometryModBlock * @param name defines the block name @@ -66665,8 +66666,8 @@ var mO = class extends Ve { }, this; } }; -Re("BABYLON.GeometryModBlock", mO); -var _O = class extends Ve { +Re("BABYLON.GeometryModBlock", _O); +var EO = class extends Ve { /** * Creates a new GeometryPowBlock * @param name defines the block name @@ -66722,8 +66723,8 @@ var _O = class extends Ve { }, this; } }; -Re("BABYLON.GeometryPowBlock", _O); -var Mf = class extends Ve { +Re("BABYLON.GeometryPowBlock", EO); +var Pf = class extends Ve { /** * Creates a new GeometryClampBlock * @param name defines the block name @@ -66788,12 +66789,12 @@ var Mf = class extends Ve { }; P([ gt("Minimum", ht.Float) -], Mf.prototype, "minimum", void 0); +], Pf.prototype, "minimum", void 0); P([ gt("Maximum", ht.Float) -], Mf.prototype, "maximum", void 0); -Re("BABYLON.GeometryClampBlock", Mf); -var EO = class extends Ve { +], Pf.prototype, "maximum", void 0); +Re("BABYLON.GeometryClampBlock", Pf); +var vO = class extends Ve { /** * Creates a new GeometryCrossBlock * @param name defines the block name @@ -66843,7 +66844,7 @@ var EO = class extends Ve { }, this; } }; -Re("BABYLON.GeometryCrossBlock", EO); +Re("BABYLON.GeometryCrossBlock", vO); var Ze; (function(n4) { n4[n4.EaseInSine = 0] = "EaseInSine", n4[n4.EaseOutSine = 1] = "EaseOutSine", n4[n4.EaseInOutSine = 2] = "EaseInOutSine", n4[n4.EaseInQuad = 3] = "EaseInQuad", n4[n4.EaseOutQuad = 4] = "EaseOutQuad", n4[n4.EaseInOutQuad = 5] = "EaseInOutQuad", n4[n4.EaseInCubic = 6] = "EaseInCubic", n4[n4.EaseOutCubic = 7] = "EaseOutCubic", n4[n4.EaseInOutCubic = 8] = "EaseInOutCubic", n4[n4.EaseInQuart = 9] = "EaseInQuart", n4[n4.EaseOutQuart = 10] = "EaseOutQuart", n4[n4.EaseInOutQuart = 11] = "EaseInOutQuart", n4[n4.EaseInQuint = 12] = "EaseInQuint", n4[n4.EaseOutQuint = 13] = "EaseOutQuint", n4[n4.EaseInOutQuint = 14] = "EaseInOutQuint", n4[n4.EaseInExpo = 15] = "EaseInExpo", n4[n4.EaseOutExpo = 16] = "EaseOutExpo", n4[n4.EaseInOutExpo = 17] = "EaseInOutExpo", n4[n4.EaseInCirc = 18] = "EaseInCirc", n4[n4.EaseOutCirc = 19] = "EaseOutCirc", n4[n4.EaseInOutCirc = 20] = "EaseInOutCirc", n4[n4.EaseInBack = 21] = "EaseInBack", n4[n4.EaseOutBack = 22] = "EaseOutBack", n4[n4.EaseInOutBack = 23] = "EaseInOutBack", n4[n4.EaseInElastic = 24] = "EaseInElastic", n4[n4.EaseOutElastic = 25] = "EaseOutElastic", n4[n4.EaseInOutElastic = 26] = "EaseInOutElastic"; @@ -67045,7 +67046,7 @@ P([ }) ], nE.prototype, "type", void 0); Re("BABYLON.GeometryCurveBlock", nE); -var vO = class extends Ve { +var TO = class extends Ve { /** * Creates a new GeometryDesaturateBlock * @param name defines the block name @@ -67089,8 +67090,8 @@ var vO = class extends Ve { }, this; } }; -Re("BABYLON.GeometryDesaturateBlock", vO); -var TO = class extends Ve { +Re("BABYLON.GeometryDesaturateBlock", TO); +var xO = class extends Ve { /** * Creates a new GeometryPosterizeBlock * @param name defines the block name @@ -67156,8 +67157,8 @@ var TO = class extends Ve { }, this; } }; -Re("BABYLON.GeometryPosterizeBlock", TO); -var xO = class extends Ve { +Re("BABYLON.GeometryPosterizeBlock", xO); +var CO = class extends Ve { /** * Creates a new GeometryReplaceColorBlock * @param name defines the block name @@ -67213,8 +67214,8 @@ var xO = class extends Ve { }, this; } }; -Re("BABYLON.GeometryReplaceColorBlock", xO); -var CO = class extends Ve { +Re("BABYLON.GeometryReplaceColorBlock", CO); +var RO = class extends Ve { /** * Creates a new GeometryDistanceBlock * @param name defines the block name @@ -67258,8 +67259,8 @@ var CO = class extends Ve { }, this; } }; -Re("BABYLON.GeometryDistanceBlock", CO); -var RO = class extends Ve { +Re("BABYLON.GeometryDistanceBlock", RO); +var SO = class extends Ve { /** * Creates a new GeometryDotBlock * @param name defines the block name @@ -67303,8 +67304,8 @@ var RO = class extends Ve { }, this; } }; -Re("BABYLON.GeometryDotBlock", RO); -var SO = class extends Ve { +Re("BABYLON.GeometryDotBlock", SO); +var yO = class extends Ve { /** * Creates a new GeometryLengthBlock * @param name defines the block name @@ -67339,8 +67340,8 @@ var SO = class extends Ve { return this.output._storedFunction = (e) => this.value.getConnectedValue(e).length(), this; } }; -Re("BABYLON.GeometryLengthBlock", SO); -var yO = class extends Ve { +Re("BABYLON.GeometryLengthBlock", yO); +var IO = class extends Ve { /** * Creates a new GeometryRotate2dBlock * @param name defines the block name @@ -67384,9 +67385,9 @@ var yO = class extends Ve { }, this; } }; -Re("BABYLON.GeometryRotate2dBlock", yO); -var IO = "gaussianSplattingPixelShader"; -var bO = `#include +Re("BABYLON.GeometryRotate2dBlock", IO); +var bO = "gaussianSplattingPixelShader"; +var AO = `#include #include #include varying vec4 vColor;varying vec2 vPosition;void main () { @@ -67399,18 +67400,18 @@ vec3 color=vColor.rgb; #endif gl_FragColor=vec4(color,B);} `; -Y.ShadersStore[IO] = bO; -var AO = "gaussianSplattingVertexDeclaration"; -var MO = `uniform mat4 world;uniform mat4 view;uniform mat4 projection; +Y.ShadersStore[bO] = AO; +var MO = "gaussianSplattingVertexDeclaration"; +var PO = `uniform mat4 world;uniform mat4 view;uniform mat4 projection; `; -Y.IncludesShadersStore[AO] = MO; -var PO = "gaussianSplattingUboDeclaration"; -var OO = `#include +Y.IncludesShadersStore[MO] = PO; +var OO = "gaussianSplattingUboDeclaration"; +var DO = `#include #include `; -Y.IncludesShadersStore[PO] = OO; -var DO = "gaussianSplattingVertexShader"; -var NO = `#include<__decl__gaussianSplattingVertex> +Y.IncludesShadersStore[OO] = DO; +var NO = "gaussianSplattingVertexShader"; +var FO = `#include<__decl__gaussianSplattingVertex> #ifdef LOGARITHMICDEPTH #extension GL_EXT_frag_depth : enable #endif @@ -67443,8 +67444,8 @@ vCenter #include } `; -Y.ShadersStore[DO] = NO; -var FO = class extends es { +Y.ShadersStore[NO] = FO; +var LO = class extends es { /** * Constructor of the defines. */ @@ -67491,17 +67492,17 @@ var So = class _So extends Uc { const r = t._drawWrapper; if (r.effect && this.isFrozen && r._wasPreviouslyReady && r._wasPreviouslyUsingInstances === true) return true; - t.materialDefines || (t.materialDefines = new FO()); + t.materialDefines || (t.materialDefines = new LO()); const s = this.getScene(), a = t.materialDefines; if (this._isReadyForSubMesh(t)) return true; const o = s.getEngine(); - if (cf(e, s, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, false, a), hf(s, o, this, a, true, null, true), uf(e, a, false, false), a.isDirty) { + if (hf(e, s, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, false, a), uf(s, o, this, a, true, null, true), ff(e, a, false, false), a.isDirty) { a.markAsProcessed(), s.resetCachedMaterial(); const l = [I.PositionKind, "splatIndex"]; - lf(l, a); + cf(l, a); const c = ["world", "view", "projection", "vFogInfos", "vFogColor", "logarithmicDepthConstant", "viewport", "dataTextureSize", "focal"], h = ["covariancesATexture", "covariancesBTexture", "centersTexture", "colorsTexture"], u = ["Scene", "Mesh"]; - ff({ + df({ uniformsNames: c, uniformBuffersNames: u, samplers: h, @@ -67616,7 +67617,7 @@ var lc = class _lc extends B { * @param scene defines the hosting scene (optional) */ constructor(e, t = null, i = null) { - super(e, i), this._vertexCount = 0, this._worker = null, this._frameIdLastUpdate = -1, this._modelViewMatrix = w.Identity(), this._material = null, this._canPostToWorker = true, this._covariancesATexture = null, this._covariancesBTexture = null, this._centersTexture = null, this._colorsTexture = null; + super(e, i), this._vertexCount = 0, this._worker = null, this._frameIdLastUpdate = -1, this._modelViewMatrix = L.Identity(), this._material = null, this._canPostToWorker = true, this._covariancesATexture = null, this._covariancesBTexture = null, this._centersTexture = null, this._colorsTexture = null; const r = new re(); r.positions = [-2, -2, 0, 2, -2, 0, 2, 2, 0, -2, 2, 0], r.indices = [0, 1, 2, 0, 2, 3], r.applyToMesh(this), this.subMeshes = [], new bi(0, 0, 4, 0, 6, this), this.doNotSyncBoundingInfo = true, this.setEnabled(false), this._lastProj = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], t && this.loadFileAsync(t); } @@ -67688,71 +67689,71 @@ var lc = class _lc extends B { let R = 255, x = 0, S = 0, M = 0; for (let N = 0; N < c.length; N++) { const F = c[N]; - let L; + let U; switch (F.type) { case "float": - L = d.getFloat32(F.offset + m * o, true); + U = d.getFloat32(F.offset + m * o, true); break; case "int": - L = d.getInt32(F.offset + m * o, true); + U = d.getInt32(F.offset + m * o, true); break; default: throw new Error(`Unsupported property type: ${F.type}`); } switch (F.name) { case "x": - v[0] = L; + v[0] = U; break; case "y": - v[1] = L; + v[1] = U; break; case "z": - v[2] = L; + v[2] = U; break; case "scale_0": - E[0] = Math.exp(L); + E[0] = Math.exp(U); break; case "scale_1": - E[1] = Math.exp(L); + E[1] = Math.exp(U); break; case "scale_2": - E[2] = Math.exp(L); + E[2] = Math.exp(U); break; case "red": - C[0] = L; + C[0] = U; break; case "green": - C[1] = L; + C[1] = U; break; case "blue": - C[2] = L; + C[2] = U; break; case "f_dc_0": - C[0] = (0.5 + f * L) * 255; + C[0] = (0.5 + f * U) * 255; break; case "f_dc_1": - C[1] = (0.5 + f * L) * 255; + C[1] = (0.5 + f * U) * 255; break; case "f_dc_2": - C[2] = (0.5 + f * L) * 255; + C[2] = (0.5 + f * U) * 255; break; case "f_dc_3": - C[3] = (0.5 + f * L) * 255; + C[3] = (0.5 + f * U) * 255; break; case "opacity": - C[3] = 1 / (1 + Math.exp(-L)) * 255; + C[3] = 1 / (1 + Math.exp(-U)) * 255; break; case "rot_0": - R = L; + R = U; break; case "rot_1": - x = L; + x = U; break; case "rot_2": - S = L; + S = U; break; case "rot_3": - M = L; + M = U; break; } } @@ -67795,7 +67796,7 @@ var lc = class _lc extends B { const a = this._getTextureSize(s), o = a.x * a.y, l = new Float32Array(3 * o), c = new Float32Array(3 * o), h = new Float32Array(3 * o), u = z.Matrix[0], f = z.Matrix[1], d = z.Quaternion[0], p = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), g = new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); for (let x = 0; x < s; x++) { const S = i[8 * x + 0], M = -i[8 * x + 1], N = i[8 * x + 2]; - l[3 * x + 0] = S, l[3 * x + 1] = M, l[3 * x + 2] = N, p.minimizeInPlaceFromFloats(S, M, N), g.maximizeInPlaceFromFloats(S, M, N), d.set((t[32 * x + 28 + 1] - 128) / 128, (t[32 * x + 28 + 2] - 128) / 128, (t[32 * x + 28 + 3] - 128) / 128, -(t[32 * x + 28 + 0] - 128) / 128), d.toRotationMatrix(u), w.ScalingToRef(i[8 * x + 3 + 0] * 2, i[8 * x + 3 + 1] * 2, i[8 * x + 3 + 2] * 2, f); + l[3 * x + 0] = S, l[3 * x + 1] = M, l[3 * x + 2] = N, p.minimizeInPlaceFromFloats(S, M, N), g.maximizeInPlaceFromFloats(S, M, N), d.set((t[32 * x + 28 + 1] - 128) / 128, (t[32 * x + 28 + 2] - 128) / 128, (t[32 * x + 28 + 3] - 128) / 128, -(t[32 * x + 28 + 0] - 128) / 128), d.toRotationMatrix(u), L.ScalingToRef(i[8 * x + 3 + 0] * 2, i[8 * x + 3 + 1] * 2, i[8 * x + 3 + 2] * 2, f); const F = u.multiplyToRef(f, z.Matrix[0]).m; c[x * 3 + 0] = F[0] * F[0] + F[1] * F[1] + F[2] * F[2], c[x * 3 + 1] = F[0] * F[4] + F[1] * F[5] + F[2] * F[6], c[x * 3 + 2] = F[0] * F[8] + F[1] * F[9] + F[2] * F[10], h[x * 3 + 0] = F[4] * F[4] + F[5] * F[5] + F[6] * F[6], h[x * 3 + 1] = F[4] * F[8] + F[5] * F[9] + F[6] * F[10], h[x * 3 + 2] = F[8] * F[8] + F[9] * F[9] + F[10] * F[10]; } @@ -67852,77 +67853,77 @@ lc._CreateWorker = function(n4) { }; var Zo = Array.isArray; var aE = typeof global == "object" && global && global.Object === Object && global; -var LO = typeof self == "object" && self && self.Object === Object && self; -var kc = aE || LO || Function("return this")(); +var wO = typeof self == "object" && self && self.Object === Object && self; +var kc = aE || wO || Function("return this")(); var Da = kc.Symbol; var oE = Object.prototype; -var wO = oE.hasOwnProperty; -var UO = oE.toString; +var UO = oE.hasOwnProperty; +var VO = oE.toString; var eo = Da ? Da.toStringTag : void 0; -function VO(n4) { - var e = wO.call(n4, eo), t = n4[eo]; +function BO(n4) { + var e = UO.call(n4, eo), t = n4[eo]; try { n4[eo] = void 0; var i = true; } catch { } - var r = UO.call(n4); + var r = VO.call(n4); return i && (e ? n4[eo] = t : delete n4[eo]), r; } -var BO = Object.prototype; -var kO = BO.toString; -function zO(n4) { - return kO.call(n4); +var kO = Object.prototype; +var zO = kO.toString; +function WO(n4) { + return zO.call(n4); } -var WO = "[object Null]"; -var GO = "[object Undefined]"; -var xg = Da ? Da.toStringTag : void 0; +var GO = "[object Null]"; +var XO = "[object Undefined]"; +var Cg = Da ? Da.toStringTag : void 0; function zc(n4) { - return n4 == null ? n4 === void 0 ? GO : WO : xg && xg in Object(n4) ? VO(n4) : zO(n4); + return n4 == null ? n4 === void 0 ? XO : GO : Cg && Cg in Object(n4) ? BO(n4) : WO(n4); } function Wc(n4) { return n4 != null && typeof n4 == "object"; } -var XO = "[object Symbol]"; -function Pf(n4) { - return typeof n4 == "symbol" || Wc(n4) && zc(n4) == XO; +var HO = "[object Symbol]"; +function Of(n4) { + return typeof n4 == "symbol" || Wc(n4) && zc(n4) == HO; } -var HO = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/; -var KO = /^\w*$/; -function qO(n4, e) { +var KO = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/; +var qO = /^\w*$/; +function YO(n4, e) { if (Zo(n4)) return false; var t = typeof n4; - return t == "number" || t == "symbol" || t == "boolean" || n4 == null || Pf(n4) ? true : KO.test(n4) || !HO.test(n4) || e != null && n4 in Object(e); + return t == "number" || t == "symbol" || t == "boolean" || n4 == null || Of(n4) ? true : qO.test(n4) || !KO.test(n4) || e != null && n4 in Object(e); } function yo(n4) { var e = typeof n4; return n4 != null && (e == "object" || e == "function"); } -var YO = "[object AsyncFunction]"; -var ZO = "[object Function]"; -var jO = "[object GeneratorFunction]"; -var QO = "[object Proxy]"; +var ZO = "[object AsyncFunction]"; +var jO = "[object Function]"; +var QO = "[object GeneratorFunction]"; +var JO = "[object Proxy]"; function lE(n4) { if (!yo(n4)) return false; var e = zc(n4); - return e == ZO || e == jO || e == YO || e == QO; + return e == jO || e == QO || e == ZO || e == JO; } var Hh = kc["__core-js_shared__"]; -var Cg = function() { +var Rg = function() { var n4 = /[^.]+$/.exec(Hh && Hh.keys && Hh.keys.IE_PROTO || ""); return n4 ? "Symbol(src)_1." + n4 : ""; }(); -function JO(n4) { - return !!Cg && Cg in n4; +function $O(n4) { + return !!Rg && Rg in n4; } -var $O = Function.prototype; -var eD = $O.toString; -function tD(n4) { +var eD = Function.prototype; +var tD = eD.toString; +function iD(n4) { if (n4 != null) { try { - return eD.call(n4); + return tD.call(n4); } catch { } try { @@ -67932,57 +67933,57 @@ function tD(n4) { } return ""; } -var iD = /[\\^$.*+?()[\]{}|]/g; -var rD = /^\[object .+?Constructor\]$/; -var sD = Function.prototype; -var nD = Object.prototype; -var aD = sD.toString; -var oD = nD.hasOwnProperty; -var lD = RegExp( - "^" + aD.call(oD).replace(iD, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$" +var rD = /[\\^$.*+?()[\]{}|]/g; +var sD = /^\[object .+?Constructor\]$/; +var nD = Function.prototype; +var aD = Object.prototype; +var oD = nD.toString; +var lD = aD.hasOwnProperty; +var cD = RegExp( + "^" + oD.call(lD).replace(rD, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$" ); -function cD(n4) { - if (!yo(n4) || JO(n4)) +function hD(n4) { + if (!yo(n4) || $O(n4)) return false; - var e = lE(n4) ? lD : rD; - return e.test(tD(n4)); + var e = lE(n4) ? cD : sD; + return e.test(iD(n4)); } -function hD(n4, e) { +function uD(n4, e) { return n4 == null ? void 0 : n4[e]; } -function Of(n4, e) { - var t = hD(n4, e); - return cD(t) ? t : void 0; +function Df(n4, e) { + var t = uD(n4, e); + return hD(t) ? t : void 0; } -var Io = Of(Object, "create"); -function uD() { +var Io = Df(Object, "create"); +function fD() { this.__data__ = Io ? Io(null) : {}, this.size = 0; } -function fD(n4) { +function dD(n4) { var e = this.has(n4) && delete this.__data__[n4]; return this.size -= e ? 1 : 0, e; } -var dD = "__lodash_hash_undefined__"; -var pD = Object.prototype; -var gD = pD.hasOwnProperty; -function mD(n4) { +var pD = "__lodash_hash_undefined__"; +var gD = Object.prototype; +var mD = gD.hasOwnProperty; +function _D(n4) { var e = this.__data__; if (Io) { var t = e[n4]; - return t === dD ? void 0 : t; + return t === pD ? void 0 : t; } - return gD.call(e, n4) ? e[n4] : void 0; + return mD.call(e, n4) ? e[n4] : void 0; } -var _D = Object.prototype; -var ED = _D.hasOwnProperty; -function vD(n4) { +var ED = Object.prototype; +var vD = ED.hasOwnProperty; +function TD(n4) { var e = this.__data__; - return Io ? e[n4] !== void 0 : ED.call(e, n4); + return Io ? e[n4] !== void 0 : vD.call(e, n4); } -var TD = "__lodash_hash_undefined__"; -function xD(n4, e) { +var xD = "__lodash_hash_undefined__"; +function CD(n4, e) { var t = this.__data__; - return this.size += this.has(n4) ? 0 : 1, t[n4] = Io && e === void 0 ? TD : e, this; + return this.size += this.has(n4) ? 0 : 1, t[n4] = Io && e === void 0 ? xD : e, this; } function Fn(n4) { var e = -1, t = n4 == null ? 0 : n4.length; @@ -67991,40 +67992,40 @@ function Fn(n4) { this.set(i[0], i[1]); } } -Fn.prototype.clear = uD; -Fn.prototype.delete = fD; -Fn.prototype.get = mD; -Fn.prototype.has = vD; -Fn.prototype.set = xD; -function CD() { +Fn.prototype.clear = fD; +Fn.prototype.delete = dD; +Fn.prototype.get = _D; +Fn.prototype.has = TD; +Fn.prototype.set = CD; +function RD() { this.__data__ = [], this.size = 0; } -function Df(n4, e) { +function Nf(n4, e) { return n4 === e || n4 !== n4 && e !== e; } function Gc(n4, e) { for (var t = n4.length; t--; ) - if (Df(n4[t][0], e)) + if (Nf(n4[t][0], e)) return t; return -1; } -var RD = Array.prototype; -var SD = RD.splice; -function yD(n4) { +var SD = Array.prototype; +var yD = SD.splice; +function ID(n4) { var e = this.__data__, t = Gc(e, n4); if (t < 0) return false; var i = e.length - 1; - return t == i ? e.pop() : SD.call(e, t, 1), --this.size, true; + return t == i ? e.pop() : yD.call(e, t, 1), --this.size, true; } -function ID(n4) { +function bD(n4) { var e = this.__data__, t = Gc(e, n4); return t < 0 ? void 0 : e[t][1]; } -function bD(n4) { +function AD(n4) { return Gc(this.__data__, n4) > -1; } -function AD(n4, e) { +function MD(n4, e) { var t = this.__data__, i = Gc(t, n4); return i < 0 ? (++this.size, t.push([n4, e])) : t[i][1] = e, this; } @@ -68035,38 +68036,38 @@ function Ga(n4) { this.set(i[0], i[1]); } } -Ga.prototype.clear = CD; -Ga.prototype.delete = yD; -Ga.prototype.get = ID; -Ga.prototype.has = bD; -Ga.prototype.set = AD; -var MD = Of(kc, "Map"); -function PD() { +Ga.prototype.clear = RD; +Ga.prototype.delete = ID; +Ga.prototype.get = bD; +Ga.prototype.has = AD; +Ga.prototype.set = MD; +var PD = Df(kc, "Map"); +function OD() { this.size = 0, this.__data__ = { hash: new Fn(), - map: new (MD || Ga)(), + map: new (PD || Ga)(), string: new Fn() }; } -function OD(n4) { +function DD(n4) { var e = typeof n4; return e == "string" || e == "number" || e == "symbol" || e == "boolean" ? n4 !== "__proto__" : n4 === null; } function Xc(n4, e) { var t = n4.__data__; - return OD(e) ? t[typeof e == "string" ? "string" : "hash"] : t.map; + return DD(e) ? t[typeof e == "string" ? "string" : "hash"] : t.map; } -function DD(n4) { +function ND(n4) { var e = Xc(this, n4).delete(n4); return this.size -= e ? 1 : 0, e; } -function ND(n4) { +function FD(n4) { return Xc(this, n4).get(n4); } -function FD(n4) { +function LD(n4) { return Xc(this, n4).has(n4); } -function LD(n4, e) { +function wD(n4, e) { var t = Xc(this, n4), i = t.size; return t.set(n4, e), this.size += t.size == i ? 0 : 1, this; } @@ -68077,15 +68078,15 @@ function Un(n4) { this.set(i[0], i[1]); } } -Un.prototype.clear = PD; -Un.prototype.delete = DD; -Un.prototype.get = ND; -Un.prototype.has = FD; -Un.prototype.set = LD; -var wD = "Expected a function"; -function Nf(n4, e) { +Un.prototype.clear = OD; +Un.prototype.delete = ND; +Un.prototype.get = FD; +Un.prototype.has = LD; +Un.prototype.set = wD; +var UD = "Expected a function"; +function Ff(n4, e) { if (typeof n4 != "function" || e != null && typeof e != "function") - throw new TypeError(wD); + throw new TypeError(UD); var t = function() { var i = arguments, r = e ? e.apply(this, i) : i[0], s = t.cache; if (s.has(r)) @@ -68093,78 +68094,78 @@ function Nf(n4, e) { var a = n4.apply(this, i); return t.cache = s.set(r, a) || s, a; }; - return t.cache = new (Nf.Cache || Un)(), t; + return t.cache = new (Ff.Cache || Un)(), t; } -Nf.Cache = Un; -var UD = 500; -function VD(n4) { - var e = Nf(n4, function(i) { - return t.size === UD && t.clear(), i; +Ff.Cache = Un; +var VD = 500; +function BD(n4) { + var e = Ff(n4, function(i) { + return t.size === VD && t.clear(), i; }), t = e.cache; return e; } -var BD = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; -var kD = /\\(\\)?/g; -var zD = VD(function(n4) { +var kD = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; +var zD = /\\(\\)?/g; +var WD = BD(function(n4) { var e = []; - return n4.charCodeAt(0) === 46 && e.push(""), n4.replace(BD, function(t, i, r, s) { - e.push(r ? s.replace(kD, "$1") : i || t); + return n4.charCodeAt(0) === 46 && e.push(""), n4.replace(kD, function(t, i, r, s) { + e.push(r ? s.replace(zD, "$1") : i || t); }), e; }); -function WD(n4, e) { +function GD(n4, e) { for (var t = -1, i = n4 == null ? 0 : n4.length, r = Array(i); ++t < i; ) r[t] = e(n4[t], t, n4); return r; } -var GD = 1 / 0; -var Rg = Da ? Da.prototype : void 0; -var Sg = Rg ? Rg.toString : void 0; +var XD = 1 / 0; +var Sg = Da ? Da.prototype : void 0; +var yg = Sg ? Sg.toString : void 0; function cE(n4) { if (typeof n4 == "string") return n4; if (Zo(n4)) - return WD(n4, cE) + ""; - if (Pf(n4)) - return Sg ? Sg.call(n4) : ""; + return GD(n4, cE) + ""; + if (Of(n4)) + return yg ? yg.call(n4) : ""; var e = n4 + ""; - return e == "0" && 1 / n4 == -GD ? "-0" : e; + return e == "0" && 1 / n4 == -XD ? "-0" : e; } -function XD(n4) { +function HD(n4) { return n4 == null ? "" : cE(n4); } -function Ff(n4, e) { - return Zo(n4) ? n4 : qO(n4, e) ? [n4] : zD(XD(n4)); +function Lf(n4, e) { + return Zo(n4) ? n4 : YO(n4, e) ? [n4] : WD(HD(n4)); } -var HD = 1 / 0; -function Lf(n4) { - if (typeof n4 == "string" || Pf(n4)) +var KD = 1 / 0; +function wf(n4) { + if (typeof n4 == "string" || Of(n4)) return n4; var e = n4 + ""; - return e == "0" && 1 / n4 == -HD ? "-0" : e; + return e == "0" && 1 / n4 == -KD ? "-0" : e; } -function KD(n4, e) { - e = Ff(e, n4); +function qD(n4, e) { + e = Lf(e, n4); for (var t = 0, i = e.length; n4 != null && t < i; ) - n4 = n4[Lf(e[t++])]; + n4 = n4[wf(e[t++])]; return t && t == i ? n4 : void 0; } function hE(n4, e, t) { - var i = n4 == null ? void 0 : KD(n4, e); + var i = n4 == null ? void 0 : qD(n4, e); return i === void 0 ? t : i; } -function qD(n4) { +function YD(n4) { let e = []; return this.selected.forEach((t, i) => { t instanceof He ? e.push({ node: t, value: hE(t, n4) }) : console.log("Node not a mesh, skipping."); }), e; } -var yg; +var Ig; (function(n4) { n4[n4.Clean = 0] = "Clean", n4[n4.Stop = 1] = "Stop", n4[n4.Sync = 2] = "Sync", n4[n4.NoSync = 3] = "NoSync"; -})(yg || (yg = {})); +})(Ig || (Ig = {})); new he(); De.prototype._createDepthStencilCubeTexture = function(n4, e) { - const t = new ar(this, Dt.DepthStencil); + const t = new or(this, Dt.DepthStencil); if (t.isCube = true, this.webGLVersion === 1) return ne.Error("Depth cube texture is not supported by WebGL 1."), t; const i = { @@ -68199,7 +68200,7 @@ De.prototype._cascadeLoadImgs = function(n4, e, t, i, r = null, s) { this._partialLoadImg(i[o], o, a, n4, e, t, r, s); }; De.prototype._partialLoadImg = function(n4, e, t, i, r, s, a = null, o) { - const l = tf(); + const l = rf(); Go(n4, (u) => { t[e] = u, t._internalCount++, i && i.removePendingData(l), t._internalCount === 6 && s && s(r, t); }, (u, f) => { @@ -68211,7 +68212,7 @@ De.prototype._setCubeMapTextureParams = function(n4, e, t) { i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_MAG_FILTER, i.LINEAR), i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_MIN_FILTER, e ? i.LINEAR_MIPMAP_LINEAR : i.LINEAR), i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_WRAP_S, i.CLAMP_TO_EDGE), i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_WRAP_T, i.CLAMP_TO_EDGE), n4.samplingMode = e ? 3 : 2, e && this.getCaps().textureMaxLevel && t !== void 0 && t > 0 && (i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_MAX_LEVEL, t), n4._maxLodLevel = t), this._bindTextureDirectly(i.TEXTURE_CUBE_MAP, null); }; De.prototype.createCubeTextureBase = function(n4, e, t, i, r = null, s = null, a, o = null, l = false, c = 0, h = 0, u = null, f = null, d = null, p = false) { - const g = u || new ar(this, Dt.Cube); + const g = u || new or(this, Dt.Cube); g.isCube = true, g.url = n4, g.generateMipMaps = !i, g._lodGenerationScale = c, g._lodGenerationOffset = h, g._useSRGBBuffer = !!p && this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU || !!i), g !== u && (g.label = n4.substring(0, 60)), this._doNotHandleContextLost || (g._extension = o, g._files = t); const m = n4; this._transformTextureUrl && !u && (n4 = this._transformTextureUrl(n4)); @@ -68291,7 +68292,7 @@ var Qi = class _Qi extends It { * Sets texture matrix rotation angle around Y axis in radians. */ set rotationY(e) { - this._rotationY = e, this.setReflectionTextureMatrix(w.RotationY(this._rotationY)); + this._rotationY = e, this.setReflectionTextureMatrix(L.RotationY(this._rotationY)); } /** * Gets texture matrix rotation angle around Y axis radians. @@ -68358,7 +68359,7 @@ var Qi = class _Qi extends It { */ constructor(e, t, i = null, r = false, s = null, a = null, o = null, l = 5, c = false, h = null, u = false, f = 0.8, d = 0, p, g) { var m; - super(t), this._lodScale = 0.8, this._lodOffset = 0, this.onLoadObservable = new he(), this.boundingBoxPosition = _.Zero(), this._rotationY = 0, this._files = null, this._forcedExtension = null, this._extensions = null, this._textureMatrixRefraction = new w(), this.name = e, this.url = e, this._noMipmap = r, this.hasAlpha = false, this._format = l, this.isCube = true, this._textureMatrix = w.Identity(), this._createPolynomials = u, this.coordinatesMode = le.CUBIC_MODE, this._extensions = i, this._files = s, this._forcedExtension = h, this._loaderOptions = p, this._useSRGBBuffer = g, this._lodScale = f, this._lodOffset = d, !(!e && !s) && this.updateURL(e, h, a, c, o, i, (m = this.getScene()) == null ? void 0 : m.useDelayedTextureLoading, s); + super(t), this._lodScale = 0.8, this._lodOffset = 0, this.onLoadObservable = new he(), this.boundingBoxPosition = _.Zero(), this._rotationY = 0, this._files = null, this._forcedExtension = null, this._extensions = null, this._textureMatrixRefraction = new L(), this.name = e, this.url = e, this._noMipmap = r, this.hasAlpha = false, this._format = l, this.isCube = true, this._textureMatrix = L.Identity(), this._createPolynomials = u, this.coordinatesMode = le.CUBIC_MODE, this._extensions = i, this._files = s, this._forcedExtension = h, this._loaderOptions = p, this._useSRGBBuffer = g, this._lodScale = f, this._lodOffset = d, !(!e && !s) && this.updateURL(e, h, a, c, o, i, (m = this.getScene()) == null ? void 0 : m.useDelayedTextureLoading, s); } /** * Get the current class name of the texture useful for serialization or dynamic coding. @@ -68413,7 +68414,7 @@ var Qi = class _Qi extends It { if (e.updateFlag === this._textureMatrix.updateFlag || (e.isIdentity() !== this._textureMatrix.isIdentity() && ((s = this.getScene()) == null || s.markAllMaterialsAsDirty(1, (o) => o.getActiveTextures().indexOf(this) !== -1)), this._textureMatrix = e, !((a = this.getScene()) != null && a.useRightHandedSystem))) return; const t = z.Vector3[0], i = z.Quaternion[0], r = z.Vector3[1]; - this._textureMatrix.decompose(t, i, r), i.z *= -1, i.w *= -1, w.ComposeToRef(t, i, r, this._textureMatrixRefraction); + this._textureMatrix.decompose(t, i, r), i.z *= -1, i.w *= -1, L.ComposeToRef(t, i, r, this._textureMatrixRefraction); } /** * Gets a suitable rotate/transform matrix when the texture is used for refraction. @@ -68469,25 +68470,25 @@ var Qi = class _Qi extends It { } }; P([ - U() + w() ], Qi.prototype, "url", void 0); P([ - cn() + hn() ], Qi.prototype, "boundingBoxPosition", void 0); P([ - cn() + hn() ], Qi.prototype, "boundingBoxSize", null); P([ - U("rotationY") + w("rotationY") ], Qi.prototype, "rotationY", null); P([ - U("files") + w("files") ], Qi.prototype, "_files", void 0); P([ - U("forcedExtension") + w("forcedExtension") ], Qi.prototype, "_forcedExtension", void 0); P([ - U("extensions") + w("extensions") ], Qi.prototype, "_extensions", void 0); P([ K_("textureMatrix") @@ -68497,7 +68498,7 @@ P([ ], Qi.prototype, "_textureMatrixRefraction", void 0); le._CubeTextureParser = Qi.Parse; Re("BABYLON.CubeTexture", Qi); -var un = class { +var fn = class { /** * Converts a panorama stored in RGB right to left up to down format into a cubemap (6 faces). * @@ -68566,13 +68567,13 @@ var un = class { }; } }; -un.FACE_LEFT = [new _(-1, -1, -1), new _(1, -1, -1), new _(-1, 1, -1), new _(1, 1, -1)]; -un.FACE_RIGHT = [new _(1, -1, 1), new _(-1, -1, 1), new _(1, 1, 1), new _(-1, 1, 1)]; -un.FACE_FRONT = [new _(1, -1, -1), new _(1, -1, 1), new _(1, 1, -1), new _(1, 1, 1)]; -un.FACE_BACK = [new _(-1, -1, 1), new _(-1, -1, -1), new _(-1, 1, 1), new _(-1, 1, -1)]; -un.FACE_DOWN = [new _(1, 1, -1), new _(1, 1, 1), new _(-1, 1, -1), new _(-1, 1, 1)]; -un.FACE_UP = [new _(-1, -1, -1), new _(-1, -1, 1), new _(1, -1, -1), new _(1, -1, 1)]; -var YD = class { +fn.FACE_LEFT = [new _(-1, -1, -1), new _(1, -1, -1), new _(-1, 1, -1), new _(1, 1, -1)]; +fn.FACE_RIGHT = [new _(1, -1, 1), new _(-1, -1, 1), new _(1, 1, 1), new _(-1, 1, 1)]; +fn.FACE_FRONT = [new _(1, -1, -1), new _(1, -1, 1), new _(1, 1, -1), new _(1, 1, 1)]; +fn.FACE_BACK = [new _(-1, -1, 1), new _(-1, -1, -1), new _(-1, 1, 1), new _(-1, 1, -1)]; +fn.FACE_DOWN = [new _(1, 1, -1), new _(1, 1, 1), new _(-1, 1, -1), new _(-1, 1, 1)]; +fn.FACE_UP = [new _(-1, -1, -1), new _(-1, -1, 1), new _(1, -1, -1), new _(1, -1, 1)]; +var ZD = class { static _Ldexp(e, t) { return t > 1023 ? e * Math.pow(2, 1023) * Math.pow(2, t - 1023) : t < -1074 ? e * Math.pow(2, -1074) * Math.pow(2, t + 1074) : e * Math.pow(2, t); } @@ -68631,7 +68632,7 @@ var YD = class { */ static GetCubeMapTextureData(e, t, i = false) { const r = new Uint8Array(e), s = this.RGBE_ReadHeader(r), a = this.RGBE_ReadPixels(r, s); - return un.ConvertPanoramaToCubemap(a, s.width, s.height, t, i); + return fn.ConvertPanoramaToCubemap(a, s.width, s.height, t, i); } /** * Returns the pixels data extracted from an RGBE texture. @@ -68691,23 +68692,23 @@ var YD = class { return f; } }; -var ZD = "hdrFilteringVertexShader"; -var jD = `attribute vec2 position;varying vec3 direction;uniform vec3 up;uniform vec3 right;uniform vec3 front; +var jD = "hdrFilteringVertexShader"; +var QD = `attribute vec2 position;varying vec3 direction;uniform vec3 up;uniform vec3 right;uniform vec3 front; #define CUSTOM_VERTEX_DEFINITIONS void main(void) { #define CUSTOM_VERTEX_MAIN_BEGIN mat3 view=mat3(up,right,front);direction=view*vec3(position,1.0);gl_Position=vec4(position,0.0,1.0); #define CUSTOM_VERTEX_MAIN_END }`; -Y.ShadersStore[ZD] = jD; -var QD = "hdrFilteringPixelShader"; -var JD = `#include +Y.ShadersStore[jD] = QD; +var JD = "hdrFilteringPixelShader"; +var $D = `#include #include #include #include uniform float alphaG;uniform samplerCube inputTexture;uniform vec2 vFilteringInfo;uniform float hdrScale;varying vec3 direction;void main() {vec3 color=radiance(alphaG,inputTexture,direction,vFilteringInfo);gl_FragColor=vec4(color*hdrScale,1.0);}`; -Y.ShadersStore[QD] = JD; -var $D = class { +Y.ShadersStore[JD] = $D; +var eN = class { /** * Instantiates HDR filter for reflection maps * @@ -68814,7 +68815,7 @@ var Ta = class _Ta extends It { * Sets texture matrix rotation angle around Y axis in radians. */ set rotationY(e) { - this._rotationY = e, this.setReflectionTextureMatrix(w.RotationY(this._rotationY)); + this._rotationY = e, this.setReflectionTextureMatrix(L.RotationY(this._rotationY)); } /** * Gets texture matrix rotation angle around Y axis radians. @@ -68854,7 +68855,7 @@ var Ta = class _Ta extends It { */ constructor(e, t, i, r = false, s = true, a = false, o = false, l = null, c = null, h = false) { var u; - super(t), this._generateHarmonics = true, this._onError = null, this._isBlocking = true, this._rotationY = 0, this.boundingBoxPosition = _.Zero(), this.onLoadObservable = new he(), e && (this._coordinatesMode = le.CUBIC_MODE, this.name = e, this.url = e, this.hasAlpha = false, this.isCube = true, this._textureMatrix = w.Identity(), this._prefilterOnLoad = o, this._onLoad = () => { + super(t), this._generateHarmonics = true, this._onError = null, this._isBlocking = true, this._rotationY = 0, this.boundingBoxPosition = _.Zero(), this.onLoadObservable = new he(), e && (this._coordinatesMode = le.CUBIC_MODE, this.name = e, this.url = e, this.hasAlpha = false, this.isCube = true, this._textureMatrix = L.Identity(), this._prefilterOnLoad = o, this._onLoad = () => { this.onLoadObservable.notifyObservers(this), l && l(); }, this._onError = c, this.gammaSpace = a, this._noMipmap = r, this._size = i, this._supersample = h, this._generateHarmonics = s, this._texture = this._getFromCache(e, this._noMipmap, void 0, void 0, void 0, this.isCube), this._texture ? this._texture.isReady ? ge.SetImmediate(() => this._onLoad()) : this._texture.onLoadedObservable.add(this._onLoad) : (u = this.getScene()) != null && u.useDelayedTextureLoading ? this.delayLoadState = 4 : this._loadTexture()); } @@ -68874,7 +68875,7 @@ var Ta = class _Ta extends It { t.textureFloat && t.textureFloatLinearFiltering ? i = 1 : t.textureHalfFloat && t.textureHalfFloatLinearFiltering && (i = 2); const r = (s) => { this.lodGenerationOffset = 0, this.lodGenerationScale = 0.8; - const a = YD.GetCubeMapTextureData(s, this._size, this._supersample); + const a = ZD.GetCubeMapTextureData(s, this._size, this._supersample); if (this._generateHarmonics) { const h = za.ConvertCubeMapToSphericalPolynomial(a); this.sphericalPolynomial = h; @@ -68901,7 +68902,7 @@ var Ta = class _Ta extends It { return o; }; if (e._features.allowTexturePrefiltering && this._prefilterOnLoad) { - const s = this._onLoad, a = new $D(e); + const s = this._onLoad, a = new eN(e); this._onLoad = () => { a.prefilter(this, s); }; @@ -69002,7 +69003,7 @@ var cc = class _cc extends It { */ _loadTexture() { const e = this.getScene(), t = () => { - const s = this._getFloat32ArrayFromArrayBuffer(this._buffer), a = un.ConvertPanoramaToCubemap(s, this._width, this._height, this._size, this._supersample), o = []; + const s = this._getFloat32ArrayFromArrayBuffer(this._buffer), a = fn.ConvertPanoramaToCubemap(s, this._width, this._height, this._size, this._supersample), o = []; for (let l = 0; l < 6; l++) { const c = a[_cc._FacesMapping[l]]; o.push(c); @@ -69046,52 +69047,52 @@ var cc = class _cc extends It { } }; cc._FacesMapping = ["right", "left", "up", "down", "front", "back"]; -var Ig; +var bg; (function(n4) { n4[n4.INIT = 0] = "INIT", n4[n4.RUNNING = 1] = "RUNNING", n4[n4.DONE = 2] = "DONE", n4[n4.ERROR = 3] = "ERROR"; -})(Ig || (Ig = {})); -var bg; +})(bg || (bg = {})); +var Ag; (function(n4) { n4[n4.cTFETC1 = 0] = "cTFETC1", n4[n4.cTFETC2 = 1] = "cTFETC2", n4[n4.cTFBC1 = 2] = "cTFBC1", n4[n4.cTFBC3 = 3] = "cTFBC3", n4[n4.cTFBC4 = 4] = "cTFBC4", n4[n4.cTFBC5 = 5] = "cTFBC5", n4[n4.cTFBC7 = 6] = "cTFBC7", n4[n4.cTFPVRTC1_4_RGB = 8] = "cTFPVRTC1_4_RGB", n4[n4.cTFPVRTC1_4_RGBA = 9] = "cTFPVRTC1_4_RGBA", n4[n4.cTFASTC_4x4 = 10] = "cTFASTC_4x4", n4[n4.cTFATC_RGB = 11] = "cTFATC_RGB", n4[n4.cTFATC_RGBA_INTERPOLATED_ALPHA = 12] = "cTFATC_RGBA_INTERPOLATED_ALPHA", n4[n4.cTFRGBA32 = 13] = "cTFRGBA32", n4[n4.cTFRGB565 = 14] = "cTFRGB565", n4[n4.cTFBGR565 = 15] = "cTFBGR565", n4[n4.cTFRGBA4444 = 16] = "cTFRGBA4444", n4[n4.cTFFXT1_RGB = 17] = "cTFFXT1_RGB", n4[n4.cTFPVRTC2_4_RGB = 18] = "cTFPVRTC2_4_RGB", n4[n4.cTFPVRTC2_4_RGBA = 19] = "cTFPVRTC2_4_RGBA", n4[n4.cTFETC2_EAC_R11 = 20] = "cTFETC2_EAC_R11", n4[n4.cTFETC2_EAC_RG11 = 21] = "cTFETC2_EAC_RG11"; -})(bg || (bg = {})); +})(Ag || (Ag = {})); `${ge._DefaultCdnUrl}`, `${ge._DefaultCdnUrl}`; -var eN = 542327876; -var Ag = 131072; -var Mg = 512; -var Pg = 4; -var Og = 64; -var Dg = 131072; +var tN = 542327876; +var Mg = 131072; +var Pg = 512; +var Og = 4; +var Dg = 64; +var Ng = 131072; function Hc(n4) { return n4.charCodeAt(0) + (n4.charCodeAt(1) << 8) + (n4.charCodeAt(2) << 16) + (n4.charCodeAt(3) << 24); } -function tN(n4) { +function iN(n4) { return String.fromCharCode(n4 & 255, n4 >> 8 & 255, n4 >> 16 & 255, n4 >> 24 & 255); } -var Ng = Hc("DXT1"); -var Fg = Hc("DXT3"); -var Lg = Hc("DXT5"); +var Fg = Hc("DXT1"); +var Lg = Hc("DXT3"); +var wg = Hc("DXT5"); var Kh = Hc("DX10"); -var wg = 113; -var Ug = 116; -var Vg = 2; -var Bg = 10; -var iN = 88; +var Ug = 113; +var Vg = 116; +var Bg = 2; +var kg = 10; +var rN = 88; var qh = 31; -var rN = 0; -var sN = 1; -var kg = 2; -var zg = 3; +var sN = 0; +var nN = 1; +var zg = 2; +var Wg = 3; var Yh = 4; -var Wg = 7; +var Gg = 7; var Zh = 20; -var Gg = 21; -var nN = 22; -var aN = 23; -var oN = 24; -var lN = 25; -var cN = 26; -var hN = 28; -var uN = 32; +var Xg = 21; +var aN = 22; +var oN = 23; +var lN = 24; +var cN = 25; +var hN = 26; +var uN = 28; +var fN = 32; var Lt = class _Lt { /** * Gets DDS information from an array buffer @@ -69101,35 +69102,35 @@ var Lt = class _Lt { static GetDDSInfo(e) { const t = new Int32Array(e.buffer, e.byteOffset, qh), i = new Int32Array(e.buffer, e.byteOffset, qh + 4); let r = 1; - t[kg] & Ag && (r = Math.max(1, t[Wg])); - const s = t[Gg], a = s === Kh ? i[uN] : 0; + t[zg] & Mg && (r = Math.max(1, t[Gg])); + const s = t[Xg], a = s === Kh ? i[fN] : 0; let o = 0; switch (s) { - case wg: + case Ug: o = 2; break; - case Ug: + case Vg: o = 1; break; case Kh: - if (a === Bg) { + if (a === kg) { o = 2; break; } - if (a === Vg) { + if (a === Bg) { o = 1; break; } } return { width: t[Yh], - height: t[zg], + height: t[Wg], mipmapCount: r, - isFourCC: (t[Zh] & Pg) === Pg, - isRGB: (t[Zh] & Og) === Og, - isLuminance: (t[Zh] & Dg) === Dg, - isCube: (t[hN] & Mg) === Mg, - isCompressed: s === Ng || s === Fg || s === Lg, + isFourCC: (t[Zh] & Og) === Og, + isRGB: (t[Zh] & Dg) === Dg, + isLuminance: (t[Zh] & Ng) === Ng, + isCube: (t[uN] & Pg) === Pg, + isCompressed: s === Fg || s === Lg || s === wg, dxgiFormat: a, textureType: o }; @@ -69242,7 +69243,7 @@ var Lt = class _Lt { t.generateMipMaps = s; const f = new Int32Array(i.buffer, i.byteOffset, qh); let d, p, g, m = 0, v, E, C, T, R = 0, x = 1; - if (f[rN] !== eN) { + if (f[sN] !== tN) { ne.Error("Invalid magic number in DDS header"); return; } @@ -69254,37 +69255,37 @@ var Lt = class _Lt { ne.Error("Compressed textures are not supported on this platform."); return; } - let S = f[nN]; - v = f[sN] + 4; + let S = f[aN]; + v = f[nN] + 4; let M = false; if (r.isFourCC) - switch (d = f[Gg], d) { - case Ng: + switch (d = f[Xg], d) { + case Fg: x = 8, R = 33777; break; - case Fg: + case Lg: x = 16, R = 33778; break; - case Lg: + case wg: x = 16, R = 33779; break; - case wg: + case Ug: M = true, S = 64; break; - case Ug: + case Vg: M = true, S = 128; break; case Kh: { v += 5 * 4; let k = false; switch (r.dxgiFormat) { - case Bg: + case kg: M = true, S = 64, k = true; break; - case Vg: + case Bg: M = true, S = 128, k = true; break; - case iN: + case rN: r.isRGB = true, r.isFourCC = false, S = 32, k = true; break; } @@ -69292,23 +69293,23 @@ var Lt = class _Lt { break; } default: - ne.Error(["Unsupported FourCC code:", tN(d)]); + ne.Error(["Unsupported FourCC code:", iN(d)]); return; } - const N = _Lt._ExtractLongWordOrder(f[aN]), F = _Lt._ExtractLongWordOrder(f[oN]), L = _Lt._ExtractLongWordOrder(f[lN]), K = _Lt._ExtractLongWordOrder(f[cN]); - M && (R = e._getRGBABufferInternalSizedFormat(r.textureType)), C = 1, f[kg] & Ag && s !== false && (C = Math.max(1, f[Wg])); - const q = l || 0, j = e.getCaps(); + const N = _Lt._ExtractLongWordOrder(f[oN]), F = _Lt._ExtractLongWordOrder(f[lN]), U = _Lt._ExtractLongWordOrder(f[cN]), H = _Lt._ExtractLongWordOrder(f[hN]); + M && (R = e._getRGBABufferInternalSizedFormat(r.textureType)), C = 1, f[zg] & Mg && s !== false && (C = Math.max(1, f[Gg])); + const q = l || 0, Z = e.getCaps(); for (let k = q; k < a; k++) { - for (p = f[Yh], g = f[zg], T = 0; T < C; ++T) { + for (p = f[Yh], g = f[Wg], T = 0; T < C; ++T) { if (o === -1 || o === T) { const Q = o === -1 ? T : 0; if (!r.isCompressed && r.isFourCC) { t.format = 5, m = p * g * 4; let ce = null; - if (e._badOS || e._badDesktopOS || !j.textureHalfFloat && !j.textureFloat) + if (e._badOS || e._badDesktopOS || !Z.textureHalfFloat && !Z.textureFloat) S === 128 ? (ce = _Lt._GetFloatAsUIntRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, Q), h && Q == 0 && h.push(_Lt._GetFloatRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, Q))) : S === 64 && (ce = _Lt._GetHalfFloatAsUIntRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, Q), h && Q == 0 && h.push(_Lt._GetHalfFloatAsFloatRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, Q))), t.type = 0; else { - const de = j.textureFloat && (c && j.textureFloatLinearFiltering || !c), Z = j.textureHalfFloat && (c && j.textureHalfFloatLinearFiltering || !c), J = (S === 128 || S === 64 && !Z) && de ? 1 : (S === 64 || S === 128 && !de) && Z ? 2 : 0; + const de = Z.textureFloat && (c && Z.textureFloatLinearFiltering || !c), j = Z.textureHalfFloat && (c && Z.textureHalfFloatLinearFiltering || !c), J = (S === 128 || S === 64 && !j) && de ? 1 : (S === 64 || S === 128 && !de) && j ? 2 : 0; let O, G = null; switch (S) { case 128: { @@ -69344,7 +69345,7 @@ var Lt = class _Lt { } ce && e._uploadDataToTextureDirectly(t, ce, k, Q); } else if (r.isRGB) - t.type = 0, S === 24 ? (t.format = 4, m = p * g * 3, E = _Lt._GetRGBArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, N, F, L), e._uploadDataToTextureDirectly(t, E, k, Q)) : (t.format = 5, m = p * g * 4, E = _Lt._GetRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, N, F, L, K), e._uploadDataToTextureDirectly(t, E, k, Q)); + t.type = 0, S === 24 ? (t.format = 4, m = p * g * 3, E = _Lt._GetRGBArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, N, F, U), e._uploadDataToTextureDirectly(t, E, k, Q)) : (t.format = 5, m = p * g * 4, E = _Lt._GetRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, N, F, U, H), e._uploadDataToTextureDirectly(t, E, k, Q)); else if (r.isLuminance) { const ce = e._getUnpackAlignement(), de = p; m = Math.floor((p + ce - 1) / ce) * ce * (g - 1) + de, E = _Lt._GetLuminanceArrayBuffer(p, g, i.byteOffset + v, m, i.buffer), t.format = 1, t.type = 0, e._uploadDataToTextureDirectly(t, E, k, Q); @@ -69387,7 +69388,7 @@ De.prototype.createPrefilteredCubeTexture = function(n4, e, t, i, r = null, s = return; const g = []; for (let m = 0; m < f; m++) { - const E = 1 - m / (f - 1), C = i, T = je.Log2(p) * t + i, R = C + (T - C) * E, x = Math.round(Math.min(Math.max(R, 0), T)), S = new ar(this, Dt.Temp); + const E = 1 - m / (f - 1), C = i, T = je.Log2(p) * t + i, R = C + (T - C) * E, x = Math.round(Math.min(Math.max(R, 0), T)), S = new or(this, Dt.Temp); if (S.type = u.type, S.format = u.format, S.width = Math.pow(2, Math.max(je.Log2(p) - x, 0)), S.height = S.width, S.isCube = true, S._cachedWrapU = 0, S._cachedWrapV = 0, this._bindTextureDirectly(d.TEXTURE_CUBE_MAP, S, true), S.samplingMode = 2, d.texParameteri(d.TEXTURE_CUBE_MAP, d.TEXTURE_MAG_FILTER, d.LINEAR), d.texParameteri(d.TEXTURE_CUBE_MAP, d.TEXTURE_MIN_FILTER, d.LINEAR), d.texParameteri(d.TEXTURE_CUBE_MAP, d.TEXTURE_WRAP_S, d.CLAMP_TO_EDGE), d.texParameteri(d.TEXTURE_CUBE_MAP, d.TEXTURE_WRAP_T, d.CLAMP_TO_EDGE), h.isDDS) { const N = h.info, F = h.data; this._unpackFlipY(N.isCompressed), Lt.UploadDDSLevels(this, S, F, N, true, 6, x); @@ -69401,13 +69402,13 @@ De.prototype.createPrefilteredCubeTexture = function(n4, e, t, i, r = null, s = }; return this.createCubeTexture(n4, e, null, false, c, s, a, o, l, t, i); }; -var fN = "rgbdEncodePixelShader"; -var dN = `varying vec2 vUV;uniform sampler2D textureSampler; +var dN = "rgbdEncodePixelShader"; +var pN = `varying vec2 vUV;uniform sampler2D textureSampler; #include #define CUSTOM_FRAGMENT_DEFINITIONS void main(void) {gl_FragColor=toRGBD(texture2D(textureSampler,vUV).rgb);}`; -Y.ShadersStore[fN] = dN; +Y.ShadersStore[dN] = pN; he.prototype.notifyObserversWithPromise = async function(n4, e = -1, t, i, r) { let s = Promise.resolve(n4); if (!this.observers.length) @@ -69417,12 +69418,12 @@ he.prototype.notifyObserversWithPromise = async function(n4, e = -1, t, i, r) { a.skipNextObservers || o._willBeUnregistered || o.mask & e && (o.scope ? s = s.then((l) => (a.lastReturnValue = l, o.callback.apply(o.scope, [n4, a]))) : s = s.then((l) => (a.lastReturnValue = l, o.callback(n4, a))), o.unregisterOnNextCall && this._deferUnregister(o)); }), await s, n4; }; -var Xg; +var Hg; (function(n4) { n4[n4.X = 0] = "X", n4[n4.Y = 1] = "Y", n4[n4.Z = 2] = "Z"; -})(Xg || (Xg = {})); -var pN = "fxaaPixelShader"; -var gN = `#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE) +})(Hg || (Hg = {})); +var gN = "fxaaPixelShader"; +var mN = `#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE) #define TEXTUREFUNC(s,c,l) texture2DLodEXT(s,c,l) #else #define TEXTUREFUNC(s,c,b) texture2D(s,c,b) @@ -69475,16 +69476,16 @@ else gl_FragColor=TEXTUREFUNC(textureSampler,posM,0.0); #endif }`; -Y.ShadersStore[pN] = gN; -var mN = "fxaaVertexShader"; -var _N = `attribute vec2 position;uniform vec2 texelSize;varying vec2 vUV;varying vec2 sampleCoordS;varying vec2 sampleCoordE;varying vec2 sampleCoordN;varying vec2 sampleCoordW;varying vec2 sampleCoordNW;varying vec2 sampleCoordSE;varying vec2 sampleCoordNE;varying vec2 sampleCoordSW;const vec2 madd=vec2(0.5,0.5); +Y.ShadersStore[gN] = mN; +var _N = "fxaaVertexShader"; +var EN = `attribute vec2 position;uniform vec2 texelSize;varying vec2 vUV;varying vec2 sampleCoordS;varying vec2 sampleCoordE;varying vec2 sampleCoordN;varying vec2 sampleCoordW;varying vec2 sampleCoordNW;varying vec2 sampleCoordSE;varying vec2 sampleCoordNE;varying vec2 sampleCoordSW;const vec2 madd=vec2(0.5,0.5); #define CUSTOM_VERTEX_DEFINITIONS void main(void) { #define CUSTOM_VERTEX_MAIN_BEGIN vUV=(position*madd+madd);sampleCoordS=vUV+vec2( 0.0,1.0)*texelSize;sampleCoordE=vUV+vec2( 1.0,0.0)*texelSize;sampleCoordN=vUV+vec2( 0.0,-1.0)*texelSize;sampleCoordW=vUV+vec2(-1.0,0.0)*texelSize;sampleCoordNW=vUV+vec2(-1.0,-1.0)*texelSize;sampleCoordSE=vUV+vec2( 1.0,1.0)*texelSize;sampleCoordNE=vUV+vec2( 1.0,-1.0)*texelSize;sampleCoordSW=vUV+vec2(-1.0,1.0)*texelSize;gl_Position=vec4(position,0.0,1.0); #define CUSTOM_VERTEX_MAIN_END }`; -Y.ShadersStore[mN] = _N; +Y.ShadersStore[_N] = EN; var Kc = class _Kc extends Pt { /** * Gets a string identifying the name of the class @@ -69529,7 +69530,7 @@ function uE(n4, e, t, i, r = "image/png", s = false, a) { let u = l, f = u / h; f > o && (f = o, u = f * h); const d = Math.max(0, l - u) / 2, p = Math.max(0, o - f) / 2; - e.getScene().activeCamera !== e ? wf(n4, e, t, (m) => { + e.getScene().activeCamera !== e ? Uf(n4, e, t, (m) => { if (s) { const v = new Blob([m]); ge.DownloadBlob(v), i && i(""); @@ -69540,14 +69541,14 @@ function uE(n4, e, t, i, r = "image/png", s = false, a) { c && m && c.drawImage(m, d, p, u, f), Ys && (s ? (ge.EncodeScreenshotCanvasData(Ys, void 0, r, void 0, a), i && i("")) : ge.EncodeScreenshotCanvasData(Ys, i, r, void 0, a)); }); } -function EN(n4, e, t, i = "image/png", r) { +function vN(n4, e, t, i = "image/png", r) { return new Promise((s, a) => { uE(n4, e, t, (o) => { typeof o < "u" ? s(o) : a(new Error("Data is undefined")); }, i, void 0, r); }); } -function wf(n4, e, t, i, r = "image/png", s = 1, a = false, o, l = false, c = false, h = true, u, f) { +function Uf(n4, e, t, i, r = "image/png", s = 1, a = false, o, l = false, c = false, h = true, u, f) { const { height: d, width: p, finalWidth: g, finalHeight: m } = fE(n4, e, t), v = { width: p, height: d }; if (!(d && p)) { ne.Error("Invalid 'size' parameter !"); @@ -69561,7 +69562,7 @@ function wf(n4, e, t, i, r = "image/png", s = 1, a = false, o, l = false, c = fa T.isReadyForRendering() && e.isReady(true) ? (n4.onEndFrameObservable.addOnce(() => { g === p && m === d ? T.readPixels(void 0, void 0, void 0, false).then((S) => { Ni.DumpData(p, d, S, i, r, o, true, void 0, u), T.dispose(); - }) : Rf("pass", T.getInternalTexture(), C, void 0, void 0, void 0, g, m).then((S) => { + }) : Sf("pass", T.getInternalTexture(), C, void 0, void 0, void 0, g, m).then((S) => { n4._readTexturePixels(S, g, m, -1, 0, null, true, false, 0, 0).then((M) => { Ni.DumpData(g, m, M, i, r, o, true, void 0, u), S.dispose(); }); @@ -69578,9 +69579,9 @@ function wf(n4, e, t, i, r = "image/png", s = 1, a = false, o, l = false, c = fa } else x(); } -function vN(n4, e, t, i = "image/png", r = 1, s = false, a, o = false, l = false, c = true, h) { +function TN(n4, e, t, i = "image/png", r = 1, s = false, a, o = false, l = false, c = true, h) { return new Promise((u, f) => { - wf(n4, e, t, (d) => { + Uf(n4, e, t, (d) => { typeof d < "u" ? u(d) : f(new Error("Data is undefined")); }, i, r, s, a, o, l, c, h); }); @@ -69594,16 +69595,16 @@ function fE(n4, e, t) { isNaN(t) || (i = t, r = t, s = t, a = t); return r && (r = Math.floor(r)), i && (i = Math.floor(i)), s && (s = Math.floor(s)), a && (a = Math.floor(a)), { height: i | 0, width: r | 0, finalWidth: s | 0, finalHeight: a | 0 }; } -var TN = () => { - ge.CreateScreenshot = uE, ge.CreateScreenshotAsync = EN, ge.CreateScreenshotUsingRenderTarget = wf, ge.CreateScreenshotUsingRenderTargetAsync = vN; +var xN = () => { + ge.CreateScreenshot = uE, ge.CreateScreenshotAsync = vN, ge.CreateScreenshotUsingRenderTarget = Uf, ge.CreateScreenshotUsingRenderTargetAsync = TN; }; -TN(); -var Hg; +xN(); +var Kg; (function(n4) { n4[n4.Checkbox = 0] = "Checkbox", n4[n4.Slider = 1] = "Slider", n4[n4.Vector3 = 2] = "Vector3", n4[n4.Quaternion = 3] = "Quaternion", n4[n4.Color3 = 4] = "Color3", n4[n4.String = 5] = "String", n4[n4.Button = 6] = "Button", n4[n4.Options = 7] = "Options", n4[n4.Tab = 8] = "Tab", n4[n4.FileButton = 9] = "FileButton", n4[n4.Vector2 = 10] = "Vector2"; -})(Hg || (Hg = {})); -var xN = "minmaxReduxPixelShader"; -var CN = `varying vec2 vUV;uniform sampler2D textureSampler; +})(Kg || (Kg = {})); +var CN = "minmaxReduxPixelShader"; +var RN = `varying vec2 vUV;uniform sampler2D textureSampler; #if defined(INITIAL) uniform sampler2D sourceTexture;uniform vec2 texSize;void main(void) {ivec2 coord=ivec2(vUV*(texSize-1.0));float f1=texelFetch(sourceTexture,coord,0).r;float f2=texelFetch(sourceTexture,coord+ivec2(1,0),0).r;float f3=texelFetch(sourceTexture,coord+ivec2(1,1),0).r;float f4=texelFetch(sourceTexture,coord+ivec2(0,1),0).r;float minz=min(min(min(f1,f2),f3),f4); @@ -69625,15 +69626,15 @@ void main(void) discard;}} #endif `; -Y.ShadersStore[xN] = CN; -var RN = "packingFunctions"; -var SN = `vec4 pack(float depth) +Y.ShadersStore[CN] = RN; +var SN = "packingFunctions"; +var yN = `vec4 pack(float depth) {const vec4 bit_shift=vec4(255.0*255.0*255.0,255.0*255.0,255.0,1.0);const vec4 bit_mask=vec4(0.0,1.0/255.0,1.0/255.0,1.0/255.0);vec4 res=fract(depth*bit_shift);res-=res.xxyz*bit_mask;return res;} float unpack(vec4 color) {const vec4 bit_shift=vec4(1.0/(255.0*255.0*255.0),1.0/(255.0*255.0),1.0/255.0,1.0);return dot(color,bit_shift);}`; -Y.IncludesShadersStore[RN] = SN; -var yN = "depthPixelShader"; -var IN = `#ifdef ALPHATEST +Y.IncludesShadersStore[SN] = yN; +var IN = "depthPixelShader"; +var bN = `#ifdef ALPHATEST varying vec2 vUV;uniform sampler2D diffuseSampler; #endif #include @@ -69674,15 +69675,15 @@ gl_FragColor=vec4(vDepthMetric,0.0,0.0,1.0); #endif #endif }`; -Y.ShadersStore[yN] = IN; -var bN = "pointCloudVertexDeclaration"; -var AN = `#ifdef POINTSIZE +Y.ShadersStore[IN] = bN; +var AN = "pointCloudVertexDeclaration"; +var MN = `#ifdef POINTSIZE uniform float pointSize; #endif `; -Y.IncludesShadersStore[bN] = AN; -var MN = "depthVertexShader"; -var PN = `attribute vec3 position; +Y.IncludesShadersStore[AN] = MN; +var PN = "depthVertexShader"; +var ON = `attribute vec3 position; #include #include #include @@ -69738,8 +69739,8 @@ vUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0)); #include } `; -Y.ShadersStore[MN] = PN; -var Kg = class { +Y.ShadersStore[PN] = ON; +var qg = class { static _GetStorage() { try { return localStorage.setItem("test", ""), localStorage.removeItem("test"), localStorage; @@ -69811,7 +69812,7 @@ var Kg = class { this._Storage.setItem(e, t.toString()); } }; -Kg._Storage = Kg._GetStorage(); +qg._Storage = qg._GetStorage(); var tt = class _tt extends Ai { /** * Defines how far from the source the light is impacting in scene units. @@ -69982,7 +69983,7 @@ var tt = class _tt extends Ai { if (this._uniformBuffer.bindToEffect(i, "Light" + a), this._renderId !== t.getRenderId() || this._lastUseSpecular !== r || !this._uniformBuffer.useUbo) { this._renderId = t.getRenderId(), this._lastUseSpecular = r; const l = this.getScaledIntensity(); - this.transferToEffect(i, a), this.diffuse.scaleToRef(l, Zr.Color3[0]), this._uniformBuffer.updateColor4("vLightDiffuse", Zr.Color3[0], this.range, a), r && (this.specular.scaleToRef(l, Zr.Color3[1]), this._uniformBuffer.updateColor4("vLightSpecular", Zr.Color3[1], this.radius, a)), o = true; + this.transferToEffect(i, a), this.diffuse.scaleToRef(l, jr.Color3[0]), this._uniformBuffer.updateColor4("vLightDiffuse", jr.Color3[0], this.range, a), r && (this.specular.scaleToRef(l, jr.Color3[1]), this._uniformBuffer.updateColor4("vLightSpecular", jr.Color3[1], this.radius, a)), o = true; } if (this.transferTexturesToEffect(i, a), t.shadowsEnabled && this.shadowEnabled && s) { const l = this.getShadowGenerator(t.activeCamera) ?? this.getShadowGenerator(); @@ -70261,37 +70262,37 @@ P([ $i() ], tt.prototype, "specular", void 0); P([ - U() + w() ], tt.prototype, "falloffType", void 0); P([ - U() + w() ], tt.prototype, "intensity", void 0); P([ - U() + w() ], tt.prototype, "range", null); P([ - U() + w() ], tt.prototype, "intensityMode", null); P([ - U() + w() ], tt.prototype, "radius", null); P([ - U() + w() ], tt.prototype, "_renderPriority", void 0); P([ oe("_reorderLightsInScene") ], tt.prototype, "renderPriority", void 0); P([ - U("shadowEnabled") + w("shadowEnabled") ], tt.prototype, "_shadowEnabled", void 0); P([ - U("excludeWithLayerMask") + w("excludeWithLayerMask") ], tt.prototype, "_excludeWithLayerMask", void 0); P([ - U("includeOnlyWithLayerMask") + w("includeOnlyWithLayerMask") ], tt.prototype, "_includeOnlyWithLayerMask", void 0); P([ - U("lightmapMode") + w("lightmapMode") ], tt.prototype, "_lightmapMode", void 0); var Wt = class _Wt extends Ai { /** @internal */ @@ -70313,7 +70314,7 @@ var Wt = class _Wt extends Ai { * @param index defines index of the bone in the hierarchy (default: null) */ constructor(e, t, i = null, r = null, s = null, a = null, o = null) { - super(e, t.getScene()), this.name = e, this.children = [], this.animations = [], this._index = null, this._scalingDeterminant = 1, this._needToDecompose = true, this._needToCompose = false, this._linkedTransformNode = null, this._waitingTransformNodeId = null, this._skeleton = t, this._localMatrix = (r == null ? void 0 : r.clone()) ?? w.Identity(), this._restMatrix = s ?? this._localMatrix.clone(), this._bindMatrix = a ?? this._localMatrix.clone(), this._index = o, this._absoluteMatrix = new w(), this._absoluteBindMatrix = new w(), this._absoluteInverseBindMatrix = new w(), this._finalMatrix = new w(), t.bones.push(this), this.setParent(i, false), this._updateAbsoluteBindMatrices(); + super(e, t.getScene()), this.name = e, this.children = [], this.animations = [], this._index = null, this._scalingDeterminant = 1, this._needToDecompose = true, this._needToCompose = false, this._linkedTransformNode = null, this._waitingTransformNodeId = null, this._skeleton = t, this._localMatrix = (r == null ? void 0 : r.clone()) ?? L.Identity(), this._restMatrix = s ?? this._localMatrix.clone(), this._bindMatrix = a ?? this._localMatrix.clone(), this._index = o, this._absoluteMatrix = new L(), this._absoluteBindMatrix = new L(), this._absoluteInverseBindMatrix = new L(), this._finalMatrix = new L(), t.bones.push(this), this.setParent(i, false), this._updateAbsoluteBindMatrices(); } /** * Gets the current object class name. @@ -70563,7 +70564,7 @@ var Wt = class _Wt extends Ai { this._needToCompose = false; return; } - this._needToCompose = false, w.ComposeToRef(this._localScaling, this._localRotation, this._localPosition, this._localMatrix); + this._needToCompose = false, L.ComposeToRef(this._localScaling, this._localRotation, this._localPosition, this._localMatrix); } } /** @@ -70606,7 +70607,7 @@ var Wt = class _Wt extends Ai { let a = null; i && (a = i.getWorldMatrix()), this._skeleton.computeAbsoluteMatrices(); const o = _Wt._TmpMats[0], l = _Wt._TmpVecs[0]; - this.parent ? i && a ? (o.copyFrom(this.parent.getAbsoluteMatrix()), o.multiplyToRef(a, o)) : o.copyFrom(this.parent.getAbsoluteMatrix()) : w.IdentityToRef(o), r && o.setTranslationFromFloats(0, 0, 0), o.invert(), _.TransformCoordinatesToRef(e, o, l), r ? (s.addAtIndex(12, l.x), s.addAtIndex(13, l.y), s.addAtIndex(14, l.z)) : s.setTranslationFromFloats(l.x, l.y, l.z); + this.parent ? i && a ? (o.copyFrom(this.parent.getAbsoluteMatrix()), o.multiplyToRef(a, o)) : o.copyFrom(this.parent.getAbsoluteMatrix()) : L.IdentityToRef(o), r && o.setTranslationFromFloats(0, 0, 0), o.invert(), _.TransformCoordinatesToRef(e, o, l), r ? (s.addAtIndex(12, l.x), s.addAtIndex(13, l.y), s.addAtIndex(14, l.z)) : s.setTranslationFromFloats(l.x, l.y, l.z); } this._markAsDirtyAndDecompose(); } @@ -70645,7 +70646,7 @@ var Wt = class _Wt extends Ai { */ scale(e, t, i, r = false) { const s = this.getLocalMatrix(), a = _Wt._TmpMats[0]; - w.ScalingToRef(e, t, i, a), a.multiplyToRef(s, s), a.invert(); + L.ScalingToRef(e, t, i, a), a.multiplyToRef(s, s), a.invert(); for (const o of this.children) { const l = o.getLocalMatrix(); l.multiplyToRef(a, l), l.multiplyAtIndex(12, e), l.multiplyAtIndex(13, t), l.multiplyAtIndex(14, i), o._markAsDirtyAndDecompose(); @@ -70693,7 +70694,7 @@ var Wt = class _Wt extends Ai { if (!this._getAbsoluteInverseMatrixUnscaledToRef(a, s)) return; const o = _Wt._TmpMats[1]; - w.RotationYawPitchRollToRef(e, t, i, o), a.multiplyToRef(o, o), this._rotateWithMatrix(o, r, s); + L.RotationYawPitchRollToRef(e, t, i, o), a.multiplyToRef(o, o), this._rotateWithMatrix(o, r, s); } /** * Add a rotation to the bone on an axis in local or world space @@ -70704,7 +70705,7 @@ var Wt = class _Wt extends Ai { */ rotate(e, t, i = ut.LOCAL, r) { const s = _Wt._TmpMats[0]; - s.setTranslationFromFloats(0, 0, 0), w.RotationAxisToRef(e, t, s), this._rotateWithMatrix(s, i, r); + s.setTranslationFromFloats(0, 0, 0), L.RotationAxisToRef(e, t, s), this._rotateWithMatrix(s, i, r); } /** * Set the rotation of the bone to a particular axis angle in local or world space @@ -70723,7 +70724,7 @@ var Wt = class _Wt extends Ai { if (!this._getAbsoluteInverseMatrixUnscaledToRef(s, r)) return; const a = _Wt._TmpMats[1]; - w.RotationAxisToRef(e, t, a), s.multiplyToRef(a, a), this._rotateWithMatrix(a, i, r); + L.RotationAxisToRef(e, t, a), s.multiplyToRef(a, a), this._rotateWithMatrix(a, i, r); } /** * Set the euler rotation of the bone in local or world space @@ -70749,7 +70750,7 @@ var Wt = class _Wt extends Ai { if (!this._getAbsoluteInverseMatrixUnscaledToRef(r, i)) return; const s = _Wt._TmpMats[1]; - w.FromQuaternionToRef(e, s), r.multiplyToRef(s, s), this._rotateWithMatrix(s, t, i); + L.FromQuaternionToRef(e, s), r.multiplyToRef(s, s), this._rotateWithMatrix(s, t, i); } /** * Set the rotation matrix of the bone in local or world space @@ -70775,7 +70776,7 @@ var Wt = class _Wt extends Ai { } _getAbsoluteInverseMatrixUnscaledToRef(e, t) { const i = _Wt._TmpMats[2]; - return e.copyFrom(this.getAbsoluteMatrix()), t ? (e.multiplyToRef(t.getWorldMatrix(), e), w.ScalingToRef(t.scaling.x, t.scaling.y, t.scaling.z, i)) : w.IdentityToRef(i), e.invert(), isNaN(e.m[0]) ? false : (i.multiplyAtIndex(0, this._scalingDeterminant), e.multiplyToRef(i, e), true); + return e.copyFrom(this.getAbsoluteMatrix()), t ? (e.multiplyToRef(t.getWorldMatrix(), e), L.ScalingToRef(t.scaling.x, t.scaling.y, t.scaling.z, i)) : L.IdentityToRef(i), e.invert(), isNaN(e.m[0]) ? false : (i.multiplyAtIndex(0, this._scalingDeterminant), e.multiplyToRef(i, e), true); } /** * Get the position of the bone in local or world space @@ -70916,7 +70917,7 @@ var Wt = class _Wt extends Ai { * @returns The rotation matrix */ getRotationMatrix(e = ut.LOCAL, t) { - const i = w.Identity(); + const i = L.Identity(); return this.getRotationMatrixToRef(e, t, i), i; } /** @@ -70986,7 +70987,7 @@ var Wt = class _Wt extends Ai { }; Wt._TmpVecs = vi.BuildArray(2, _.Zero); Wt._TmpQuat = Ce.Identity(); -Wt._TmpMats = vi.BuildArray(5, w.Identity); +Wt._TmpMats = vi.BuildArray(5, L.Identity); var xu; (function(n4) { n4[n4.NONE = 0] = "NONE", n4[n4.STEP = 1] = "STEP"; @@ -71009,13 +71010,13 @@ var qc = class _qc { return new _qc(this.name, this.from, this.to); } }; -var ON = Object.freeze(new Ce(0, 0, 0, 0)); -var DN = Object.freeze(_.Zero()); -var NN = Object.freeze(me.Zero()); -var FN = Object.freeze(vr.Zero()); -var LN = Object.freeze(Ne.Black()); -var wN = Object.freeze(new et(0, 0, 0, 0)); -var Wr = { +var DN = Object.freeze(new Ce(0, 0, 0, 0)); +var NN = Object.freeze(_.Zero()); +var FN = Object.freeze(me.Zero()); +var LN = Object.freeze(vr.Zero()); +var wN = Object.freeze(Ne.Black()); +var UN = Object.freeze(new et(0, 0, 0, 0)); +var Gr = { key: 0, repeatCount: 0, loopMode: 2 @@ -71144,8 +71145,8 @@ var ve = class _ve { const E = o._getKeyValue(f.value); d.referenceValue = E.clone ? E.clone() : E; } else { - Wr.key = 0; - const E = o._interpolate(l, Wr); + Gr.key = 0; + const E = o._interpolate(l, Gr); d.referenceValue = E.clone ? E.clone() : E; } o.dataType === _ve.ANIMATIONTYPE_QUATERNION ? d.referenceValue.normalize().conjugateInPlace() : o.dataType === _ve.ANIMATIONTYPE_MATRIX && (d.referenceValue.decompose(d.referenceScaling, d.referenceQuaternion, d.referencePosition), d.referenceQuaternion.normalize().conjugateInPlace()); @@ -71163,7 +71164,7 @@ var ve = class _ve { }, m === Number.MAX_VALUE && (m = C.frame), C.frame -= m, v.push(C)), !(E && o.dataType !== _ve.ANIMATIONTYPE_FLOAT && C.value === h.value)) switch (o.dataType) { case _ve.ANIMATIONTYPE_MATRIX: - C.value.decompose(d.keyScaling, d.keyQuaternion, d.keyPosition), d.keyPosition.subtractInPlace(d.referencePosition), d.keyScaling.divideInPlace(d.referenceScaling), d.referenceQuaternion.multiplyToRef(d.keyQuaternion, d.keyQuaternion), w.ComposeToRef(d.keyScaling, d.keyQuaternion, d.keyPosition, C.value); + C.value.decompose(d.keyScaling, d.keyQuaternion, d.keyPosition), d.keyPosition.subtractInPlace(d.referencePosition), d.keyScaling.divideInPlace(d.referenceScaling), d.referenceQuaternion.multiplyToRef(d.keyQuaternion, d.keyQuaternion), L.ComposeToRef(d.keyScaling, d.keyQuaternion, d.keyPosition, C.value); break; case _ve.ANIMATIONTYPE_QUATERNION: d.referenceValue.multiplyToRef(C.value, C.value); @@ -71496,7 +71497,7 @@ var ve = class _ve { * @returns the animation value */ evaluate(e) { - return Wr.key = 0, this._interpolate(e, Wr); + return Gr.key = 0, this._interpolate(e, Gr); } /** * @internal Internal use only @@ -71546,7 +71547,7 @@ var ve = class _ve { return g; case _ve.ANIMATIONLOOPMODE_RELATIVE: case _ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: - return g.addInPlace((t.offsetValue || ON).scale(t.repeatCount)); + return g.addInPlace((t.offsetValue || DN).scale(t.repeatCount)); } return g; } @@ -71559,7 +71560,7 @@ var ve = class _ve { return g; case _ve.ANIMATIONLOOPMODE_RELATIVE: case _ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: - return g.add((t.offsetValue || DN).scale(t.repeatCount)); + return g.add((t.offsetValue || NN).scale(t.repeatCount)); } break; } @@ -71572,7 +71573,7 @@ var ve = class _ve { return g; case _ve.ANIMATIONLOOPMODE_RELATIVE: case _ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: - return g.add((t.offsetValue || NN).scale(t.repeatCount)); + return g.add((t.offsetValue || FN).scale(t.repeatCount)); } break; } @@ -71584,7 +71585,7 @@ var ve = class _ve { return this.sizeInterpolateFunction(c, h, d); case _ve.ANIMATIONLOOPMODE_RELATIVE: case _ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: - return this.sizeInterpolateFunction(c, h, d).add((t.offsetValue || FN).scale(t.repeatCount)); + return this.sizeInterpolateFunction(c, h, d).add((t.offsetValue || LN).scale(t.repeatCount)); } break; } @@ -71597,7 +71598,7 @@ var ve = class _ve { return g; case _ve.ANIMATIONLOOPMODE_RELATIVE: case _ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: - return g.add((t.offsetValue || LN).scale(t.repeatCount)); + return g.add((t.offsetValue || wN).scale(t.repeatCount)); } break; } @@ -71610,7 +71611,7 @@ var ve = class _ve { return g; case _ve.ANIMATIONLOOPMODE_RELATIVE: case _ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: - return g.add((t.offsetValue || wN).scale(t.repeatCount)); + return g.add((t.offsetValue || UN).scale(t.repeatCount)); } break; } @@ -71638,7 +71639,7 @@ var ve = class _ve { * @returns the interpolated matrix */ matrixInterpolateFunction(e, t, i, r) { - return _ve.AllowMatrixDecomposeForInterpolation ? r ? (w.DecomposeLerpToRef(e, t, i, r), r) : w.DecomposeLerp(e, t, i) : r ? (w.LerpToRef(e, t, i, r), r) : w.Lerp(e, t, i); + return _ve.AllowMatrixDecomposeForInterpolation ? r ? (L.DecomposeLerpToRef(e, t, i, r), r) : L.DecomposeLerp(e, t, i) : r ? (L.LerpToRef(e, t, i, r), r) : L.Lerp(e, t, i); } /** * Makes a copy of the animation @@ -71669,15 +71670,15 @@ var ve = class _ve { * @returns The key index if the key was added or the index of the pre existing key if the frame passed as parameter already has a corresponding key */ createKeyForFrame(e) { - Wr.key = 0; - const t = this._interpolate(e, Wr, true); + Gr.key = 0; + const t = this._interpolate(e, Gr, true); if (!t) - return this._keys[Wr.key].frame === e ? Wr.key : Wr.key + 1; + return this._keys[Gr.key].frame === e ? Gr.key : Gr.key + 1; const i = { frame: e, value: t.clone ? t.clone() : t }; - return this._keys.splice(Wr.key + 1, 0, i), Wr.key + 1; + return this._keys.splice(Gr.key + 1, 0, i), Gr.key + 1; } /** * Serializes the animation to an object @@ -71749,7 +71750,7 @@ var ve = class _ve { o.values.length >= 13 && (h = o.values[12]); break; case _ve.ANIMATIONTYPE_MATRIX: - s = w.FromArray(o.values), o.values.length >= 17 && (h = o.values[16]); + s = L.FromArray(o.values), o.values.length >= 17 && (h = o.values[16]); break; case _ve.ANIMATIONTYPE_COLOR3: s = Ne.FromArray(o.values), o.values[3] && (l = Ne.FromArray(o.values[3])), o.values[4] && (c = Ne.FromArray(o.values[4])), o.values[5] && (h = o.values[5]); @@ -71854,8 +71855,8 @@ ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT = 5; ve.CreateFromSnippetAsync = ve.ParseFromSnippetAsync; Re("BABYLON.Animation", ve); Ai._AnimationRangeFactory = (n4, e, t) => new qc(n4, e, t); -var UN = "particlesPixelShader"; -var VN = `#ifdef LOGARITHMICDEPTH +var VN = "particlesPixelShader"; +var BN = `#ifdef LOGARITHMICDEPTH #extension GL_EXT_frag_depth : enable #endif varying vec2 vUV;varying vec4 vColor;uniform vec4 textureMask;uniform sampler2D diffuseSampler; @@ -71891,9 +71892,9 @@ baseColor.rgb=toLinearSpace(baseColor.rgb);baseColor=applyImageProcessing(baseCo gl_FragColor=baseColor; #define CUSTOM_FRAGMENT_MAIN_END }`; -Y.ShadersStore[UN] = VN; -var BN = "particlesVertexShader"; -var kN = `attribute vec3 position;attribute vec4 color;attribute float angle;attribute vec2 size; +Y.ShadersStore[VN] = BN; +var kN = "particlesVertexShader"; +var zN = `attribute vec3 position;attribute vec4 color;attribute float angle;attribute vec2 size; #ifdef ANIMATESHEET attribute float cellIndex; #endif @@ -71967,11 +71968,11 @@ vec4 worldPos=vec4(vPositionW,1.0); #include #define CUSTOM_VERTEX_MAIN_END }`; -Y.ShadersStore[BN] = kN; -var qg; +Y.ShadersStore[kN] = zN; +var Yg; (function(n4) { n4[n4.ATTACHED = 0] = "ATTACHED", n4[n4.END = 1] = "END"; -})(qg || (qg = {})); +})(Yg || (Yg = {})); var ho = class _ho { /** * Gets or sets the influence of this target (ie. its weight in the overall morphing) @@ -72148,13 +72149,13 @@ var ho = class _ho { } }; P([ - U() + w() ], ho.prototype, "id", void 0); -var zN = "kernelBlurVaryingDeclaration"; -var WN = "varying vec2 sampleCoord{X};"; -Y.IncludesShadersStore[zN] = WN; -var GN = "kernelBlurFragment"; -var XN = `#ifdef DOF +var WN = "kernelBlurVaryingDeclaration"; +var GN = "varying vec2 sampleCoord{X};"; +Y.IncludesShadersStore[WN] = GN; +var XN = "kernelBlurFragment"; +var HN = `#ifdef DOF factor=sampleCoC(sampleCoord{X}); computedWeight=KERNEL_WEIGHT{X}*factor;sumOfWeights+=computedWeight; #else @@ -72166,9 +72167,9 @@ blend+=unpack(texture2D(textureSampler,sampleCoord{X}))*computedWeight; blend+=texture2D(textureSampler,sampleCoord{X})*computedWeight; #endif `; -Y.IncludesShadersStore[GN] = XN; -var HN = "kernelBlurFragment2"; -var KN = `#ifdef DOF +Y.IncludesShadersStore[XN] = HN; +var KN = "kernelBlurFragment2"; +var qN = `#ifdef DOF factor=sampleCoC(sampleCenter+delta*KERNEL_DEP_OFFSET{X});computedWeight=KERNEL_DEP_WEIGHT{X}*factor;sumOfWeights+=computedWeight; #else computedWeight=KERNEL_DEP_WEIGHT{X}; @@ -72179,9 +72180,9 @@ blend+=unpack(texture2D(textureSampler,sampleCenter+delta*KERNEL_DEP_OFFSET{X})) blend+=texture2D(textureSampler,sampleCenter+delta*KERNEL_DEP_OFFSET{X})*computedWeight; #endif `; -Y.IncludesShadersStore[HN] = KN; -var qN = "kernelBlurPixelShader"; -var YN = `uniform sampler2D textureSampler;uniform vec2 delta;varying vec2 sampleCenter; +Y.IncludesShadersStore[KN] = qN; +var YN = "kernelBlurPixelShader"; +var ZN = `uniform sampler2D textureSampler;uniform vec2 delta;varying vec2 sampleCenter; #ifdef DOF uniform sampler2D circleOfConfusionSampler;float sampleCoC(in vec2 offset) {float coc=texture2D(circleOfConfusionSampler,offset).r;return coc; } #endif @@ -72217,12 +72218,12 @@ gl_FragColor=blend; gl_FragColor/=sumOfWeights; #endif }`; -Y.ShadersStore[qN] = YN; -var ZN = "kernelBlurVertex"; -var jN = "sampleCoord{X}=sampleCenter+delta*KERNEL_OFFSET{X};"; -Y.IncludesShadersStore[ZN] = jN; -var QN = "kernelBlurVertexShader"; -var JN = `attribute vec2 position;uniform vec2 delta;varying vec2 sampleCenter; +Y.ShadersStore[YN] = ZN; +var jN = "kernelBlurVertex"; +var QN = "sampleCoord{X}=sampleCenter+delta*KERNEL_OFFSET{X};"; +Y.IncludesShadersStore[jN] = QN; +var JN = "kernelBlurVertexShader"; +var $N = `attribute vec2 position;uniform vec2 delta;varying vec2 sampleCenter; #include[0..varyingCount] const vec2 madd=vec2(0.5,0.5); #define CUSTOM_VERTEX_DEFINITIONS @@ -72233,7 +72234,7 @@ sampleCenter=(position*madd+madd); gl_Position=vec4(position,0.0,1.0); #define CUSTOM_VERTEX_MAIN_END }`; -Y.ShadersStore[QN] = JN; +Y.ShadersStore[JN] = $N; var Xa = class _Xa extends Pt { /** * Sets the length in pixels of the blur sample region @@ -72380,17 +72381,17 @@ var Xa = class _Xa extends Pt { } }; P([ - U("kernel") + w("kernel") ], Xa.prototype, "_kernel", void 0); P([ - U("packedFloat") + w("packedFloat") ], Xa.prototype, "_packedFloat", void 0); P([ X_() ], Xa.prototype, "direction", void 0); Re("BABYLON.BlurPostProcess", Xa); -var $N = "bayerDitherFunctions"; -var eF = `float bayerDither2(vec2 _P) {return mod(2.0*_P.y+_P.x+1.0,4.0);} +var eF = "bayerDitherFunctions"; +var tF = `float bayerDither2(vec2 _P) {return mod(2.0*_P.y+_P.x+1.0,4.0);} float bayerDither4(vec2 _P) {vec2 P1=mod(_P,2.0); vec2 P2=floor(0.5*mod(_P,4.0)); return 4.0*bayerDither2(P1)+bayerDither2(P2);} @@ -72399,9 +72400,9 @@ vec2 P2=floor(0.5 *mod(_P,4.0)); vec2 P4=floor(0.25*mod(_P,8.0)); return 4.0*(4.0*bayerDither2(P1)+bayerDither2(P2))+bayerDither2(P4);} `; -Y.IncludesShadersStore[$N] = eF; -var tF = "shadowMapFragmentExtraDeclaration"; -var iF = `#if SM_FLOAT==0 +Y.IncludesShadersStore[eF] = tF; +var iF = "shadowMapFragmentExtraDeclaration"; +var rF = `#if SM_FLOAT==0 #include #endif #if SM_SOFTTRANSPARENTSHADOW==1 @@ -72417,9 +72418,9 @@ uniform vec3 biasAndScaleSM;uniform vec2 depthValuesSM; varying float zSM; #endif `; -Y.IncludesShadersStore[tF] = iF; -var rF = "shadowMapFragment"; -var sF = `float depthSM=vDepthMetricSM; +Y.IncludesShadersStore[iF] = rF; +var sF = "shadowMapFragment"; +var nF = `float depthSM=vDepthMetricSM; #if defined(SM_DEPTHCLAMP) && SM_DEPTHCLAMP==1 #if SM_USEDISTANCE==1 depthSM=(length(vPositionWSM-lightDataSM)+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x; @@ -72447,9 +72448,9 @@ gl_FragColor=vec4(depthSM,1.0,1.0,1.0); gl_FragColor=pack(depthSM); #endif return;`; -Y.IncludesShadersStore[rF] = sF; -var nF = "shadowMapPixelShader"; -var aF = `#include +Y.IncludesShadersStore[sF] = nF; +var aF = "shadowMapPixelShader"; +var oF = `#include #ifdef ALPHATEXTURE varying vec2 vUV;uniform sampler2D diffuseSampler; #endif @@ -72474,32 +72475,32 @@ if ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowS #endif #include }`; -Y.ShadersStore[nF] = aF; -var oF = "sceneVertexDeclaration"; -var lF = `uniform mat4 viewProjection; +Y.ShadersStore[aF] = oF; +var lF = "sceneVertexDeclaration"; +var cF = `uniform mat4 viewProjection; #ifdef MULTIVIEW uniform mat4 viewProjectionR; #endif uniform mat4 view;uniform mat4 projection;uniform vec4 vEyePosition; `; -Y.IncludesShadersStore[oF] = lF; -var cF = "meshVertexDeclaration"; -var hF = `uniform mat4 world;uniform float visibility; +Y.IncludesShadersStore[lF] = cF; +var hF = "meshVertexDeclaration"; +var uF = `uniform mat4 world;uniform float visibility; `; -Y.IncludesShadersStore[cF] = hF; -var uF = "shadowMapVertexDeclaration"; -var fF = `#include +Y.IncludesShadersStore[hF] = uF; +var fF = "shadowMapVertexDeclaration"; +var dF = `#include #include `; -Y.IncludesShadersStore[uF] = fF; -var dF = "shadowMapUboDeclaration"; -var pF = `layout(std140,column_major) uniform; +Y.IncludesShadersStore[fF] = dF; +var pF = "shadowMapUboDeclaration"; +var gF = `layout(std140,column_major) uniform; #include #include `; -Y.IncludesShadersStore[dF] = pF; -var gF = "shadowMapVertexExtraDeclaration"; -var mF = `#if SM_NORMALBIAS==1 +Y.IncludesShadersStore[pF] = gF; +var mF = "shadowMapVertexExtraDeclaration"; +var _F = `#if SM_NORMALBIAS==1 uniform vec3 lightDataSM; #endif uniform vec3 biasAndScaleSM;uniform vec2 depthValuesSM;varying float vDepthMetricSM; @@ -72510,9 +72511,9 @@ varying vec3 vPositionWSM; varying float zSM; #endif `; -Y.IncludesShadersStore[gF] = mF; -var _F = "shadowMapVertexNormalBias"; -var EF = `#if SM_NORMALBIAS==1 +Y.IncludesShadersStore[mF] = _F; +var EF = "shadowMapVertexNormalBias"; +var vF = `#if SM_NORMALBIAS==1 #if SM_DIRECTIONINLIGHTDATA==1 vec3 worldLightDirSM=normalize(-lightDataSM.xyz); #else @@ -72521,9 +72522,9 @@ vec3 directionToLightSM=lightDataSM.xyz-worldPos.xyz;vec3 worldLightDirSM=normal float ndlSM=dot(vNormalW,worldLightDirSM);float sinNLSM=sqrt(1.0-ndlSM*ndlSM);float normalBiasSM=biasAndScaleSM.y*sinNLSM;worldPos.xyz-=vNormalW*normalBiasSM; #endif `; -Y.IncludesShadersStore[_F] = EF; -var vF = "shadowMapVertexMetric"; -var TF = `#if SM_USEDISTANCE==1 +Y.IncludesShadersStore[EF] = vF; +var TF = "shadowMapVertexMetric"; +var xF = `#if SM_USEDISTANCE==1 vPositionWSM=worldPos.xyz; #endif #if SM_DEPTHTEXTURE==1 @@ -72548,9 +72549,9 @@ vDepthMetricSM=(gl_Position.z+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x; #endif #endif `; -Y.IncludesShadersStore[vF] = TF; -var xF = "shadowMapVertexShader"; -var CF = `attribute vec3 position; +Y.IncludesShadersStore[TF] = xF; +var CF = "shadowMapVertexShader"; +var RF = `attribute vec3 position; #ifdef NORMAL attribute vec3 normal; #endif @@ -72613,34 +72614,34 @@ vUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0)); #endif #include }`; -Y.ShadersStore[xF] = CF; -var RF = "depthBoxBlurPixelShader"; -var SF = `varying vec2 vUV;uniform sampler2D textureSampler;uniform vec2 screenSize; +Y.ShadersStore[CF] = RF; +var SF = "depthBoxBlurPixelShader"; +var yF = `varying vec2 vUV;uniform sampler2D textureSampler;uniform vec2 screenSize; #define CUSTOM_FRAGMENT_DEFINITIONS void main(void) {vec4 colorDepth=vec4(0.0);for (int x=-OFFSET; x<=OFFSET; x++) for (int y=-OFFSET; y<=OFFSET; y++) colorDepth+=texture2D(textureSampler,vUV+vec2(x,y)/screenSize);gl_FragColor=(colorDepth/float((OFFSET*2+1)*(OFFSET*2+1)));}`; -Y.ShadersStore[RF] = SF; -var yF = "shadowMapFragmentSoftTransparentShadow"; -var IF = `#if SM_SOFTTRANSPARENTSHADOW==1 +Y.ShadersStore[SF] = yF; +var IF = "shadowMapFragmentSoftTransparentShadow"; +var bF = `#if SM_SOFTTRANSPARENTSHADOW==1 if ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM*alpha) discard; #endif `; -Y.IncludesShadersStore[yF] = IF; -var Yg; -(function(n4) { - n4[n4.ETC1S = 0] = "ETC1S", n4[n4.UASTC4x4 = 1] = "UASTC4x4"; -})(Yg || (Yg = {})); +Y.IncludesShadersStore[IF] = bF; var Zg; (function(n4) { - n4[n4.ASTC_4X4_RGBA = 0] = "ASTC_4X4_RGBA", n4[n4.BC7_RGBA = 1] = "BC7_RGBA", n4[n4.BC3_RGBA = 2] = "BC3_RGBA", n4[n4.BC1_RGB = 3] = "BC1_RGB", n4[n4.PVRTC1_4_RGBA = 4] = "PVRTC1_4_RGBA", n4[n4.PVRTC1_4_RGB = 5] = "PVRTC1_4_RGB", n4[n4.ETC2_RGBA = 6] = "ETC2_RGBA", n4[n4.ETC1_RGB = 7] = "ETC1_RGB", n4[n4.RGBA32 = 8] = "RGBA32", n4[n4.R8 = 9] = "R8", n4[n4.RG8 = 10] = "RG8"; + n4[n4.ETC1S = 0] = "ETC1S", n4[n4.UASTC4x4 = 1] = "UASTC4x4"; })(Zg || (Zg = {})); var jg; (function(n4) { - n4[n4.COMPRESSED_RGBA_BPTC_UNORM_EXT = 36492] = "COMPRESSED_RGBA_BPTC_UNORM_EXT", n4[n4.COMPRESSED_RGBA_ASTC_4X4_KHR = 37808] = "COMPRESSED_RGBA_ASTC_4X4_KHR", n4[n4.COMPRESSED_RGB_S3TC_DXT1_EXT = 33776] = "COMPRESSED_RGB_S3TC_DXT1_EXT", n4[n4.COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779] = "COMPRESSED_RGBA_S3TC_DXT5_EXT", n4[n4.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 35842] = "COMPRESSED_RGBA_PVRTC_4BPPV1_IMG", n4[n4.COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 35840] = "COMPRESSED_RGB_PVRTC_4BPPV1_IMG", n4[n4.COMPRESSED_RGBA8_ETC2_EAC = 37496] = "COMPRESSED_RGBA8_ETC2_EAC", n4[n4.COMPRESSED_RGB8_ETC2 = 37492] = "COMPRESSED_RGB8_ETC2", n4[n4.COMPRESSED_RGB_ETC1_WEBGL = 36196] = "COMPRESSED_RGB_ETC1_WEBGL", n4[n4.RGBA8Format = 32856] = "RGBA8Format", n4[n4.R8Format = 33321] = "R8Format", n4[n4.RG8Format = 33323] = "RG8Format"; + n4[n4.ASTC_4X4_RGBA = 0] = "ASTC_4X4_RGBA", n4[n4.BC7_RGBA = 1] = "BC7_RGBA", n4[n4.BC3_RGBA = 2] = "BC3_RGBA", n4[n4.BC1_RGB = 3] = "BC1_RGB", n4[n4.PVRTC1_4_RGBA = 4] = "PVRTC1_4_RGBA", n4[n4.PVRTC1_4_RGB = 5] = "PVRTC1_4_RGB", n4[n4.ETC2_RGBA = 6] = "ETC2_RGBA", n4[n4.ETC1_RGB = 7] = "ETC1_RGB", n4[n4.RGBA32 = 8] = "RGBA32", n4[n4.R8 = 9] = "R8", n4[n4.RG8 = 10] = "RG8"; })(jg || (jg = {})); var Qg; +(function(n4) { + n4[n4.COMPRESSED_RGBA_BPTC_UNORM_EXT = 36492] = "COMPRESSED_RGBA_BPTC_UNORM_EXT", n4[n4.COMPRESSED_RGBA_ASTC_4X4_KHR = 37808] = "COMPRESSED_RGBA_ASTC_4X4_KHR", n4[n4.COMPRESSED_RGB_S3TC_DXT1_EXT = 33776] = "COMPRESSED_RGB_S3TC_DXT1_EXT", n4[n4.COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779] = "COMPRESSED_RGBA_S3TC_DXT5_EXT", n4[n4.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 35842] = "COMPRESSED_RGBA_PVRTC_4BPPV1_IMG", n4[n4.COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 35840] = "COMPRESSED_RGB_PVRTC_4BPPV1_IMG", n4[n4.COMPRESSED_RGBA8_ETC2_EAC = 37496] = "COMPRESSED_RGBA8_ETC2_EAC", n4[n4.COMPRESSED_RGB8_ETC2 = 37492] = "COMPRESSED_RGB8_ETC2", n4[n4.COMPRESSED_RGB_ETC1_WEBGL = 36196] = "COMPRESSED_RGB_ETC1_WEBGL", n4[n4.RGBA8Format = 32856] = "RGBA8Format", n4[n4.R8Format = 33321] = "R8Format", n4[n4.RG8Format = 33323] = "RG8Format"; +})(Qg || (Qg = {})); +var Jg; (function(n4) { class e { /** @@ -72779,13 +72780,13 @@ var Qg; } } t._MAX_SEQUENCE_LENGTH = 256, t._CostMatrix = [...Array(t._MAX_SEQUENCE_LENGTH + 1)].map(() => new Array(t._MAX_SEQUENCE_LENGTH + 1)), n4.Sequence = t; -})(Qg || (Qg = {})); -new w(); -var Jg; +})(Jg || (Jg = {})); +new L(); +var $g; (function(n4) { n4[n4.INIT = 0] = "INIT", n4[n4.STARTED = 1] = "STARTED", n4[n4.ENDED = 2] = "ENDED"; -})(Jg || (Jg = {})); -var bF = 1.5; +})($g || ($g = {})); +var AF = 1.5; var Zs = class { /** * Creates a new DynamicFloat32Array with the desired item capacity. @@ -72828,18 +72829,18 @@ var Zs = class { * Grows the array by the growth factor when necessary. */ _growArray() { - const e = Math.floor(this._view.length * bF), t = new Float32Array(e); + const e = Math.floor(this._view.length * AF), t = new Float32Array(e); t.set(this._view), this._view = t; } }; var js = 1800; -var AF = 24; -var MF = "0"; -var $g = "timestamp"; -var em = "numPoints"; -var PF = /\r/g; +var MF = 24; +var PF = "0"; +var em = "timestamp"; +var tm = "numPoints"; +var OF = /\r/g; var jh = "@"; -var Xr = class _Xr { +var Hr = class _Hr { /** * The offset for when actual data values start appearing inside a slice. */ @@ -72863,7 +72864,7 @@ var Xr = class _Xr { let a = 0; if (s > 0) { const o = this.datasets.startingIndices.at(s - 1); - a = o + this.datasets.data.at(o + _Xr.NumberOfPointsOffset) + _Xr.SliceDataOffset; + a = o + this.datasets.data.at(o + _Hr.NumberOfPointsOffset) + _Hr.SliceDataOffset; } if (this.datasets.startingIndices.push(a), this.datasets.data.push(i), this.datasets.data.push(r), this.datasets.ids.forEach((o) => { const l = this._strategies.get(o); @@ -72871,7 +72872,7 @@ var Xr = class _Xr { }), this.datasetObservable.hasObservers()) { const o = [i, r]; for (let l = 0; l < r; l++) - o.push(this.datasets.data.at(a + _Xr.SliceDataOffset + l)); + o.push(this.datasets.data.at(a + _Hr.SliceDataOffset + l)); this.datasetObservable.notifyObservers(o); } }, this.datasets = { @@ -72957,9 +72958,9 @@ var Xr = class _Xr { for (let r = 0; r < e.length; r++) t = e.charCodeAt(r) + ((t << 5) - t); let i = "#"; - for (let r = 0; r < AF; r += 8) { + for (let r = 0; r < MF; r += 8) { const s = t >> r & 255; - i += (MF + s.toString(16)).substr(-2); + i += (PF + s.toString(16)).substr(-2); } return i; } @@ -73008,8 +73009,8 @@ var Xr = class _Xr { * @returns true if the data was successfully loaded, false otherwise. */ loadFromFileData(e, t) { - const i = e.replace(PF, "").split(` -`).map((u) => u.split(",").filter((f) => f.length > 0)).filter((u) => u.length > 0), r = 0, s = _Xr.NumberOfPointsOffset; + const i = e.replace(OF, "").split(` +`).map((u) => u.split(",").filter((f) => f.length > 0)).filter((u) => u.length > 0), r = 0, s = _Hr.NumberOfPointsOffset; if (i.length < 2) return false; const a = { @@ -73017,10 +73018,10 @@ var Xr = class _Xr { data: new Zs(js), startingIndices: new Zs(js) }, [o, ...l] = i; - if (o.length < 2 || o[r] !== $g || o[s] !== em) + if (o.length < 2 || o[r] !== em || o[s] !== tm) return false; const c = /* @__PURE__ */ new Map(); - for (let u = _Xr.SliceDataOffset; u < o.length; u++) { + for (let u = _Hr.SliceDataOffset; u < o.length; u++) { const [f, d] = o[u].split(jh); a.ids.push(f), c.set(f, d); } @@ -73029,9 +73030,9 @@ var Xr = class _Xr { if (u.length < 2) return false; const f = parseFloat(u[r]), d = parseInt(u[s]); - if (isNaN(d) || isNaN(f) || (a.data.push(f), a.data.push(d), d + _Xr.SliceDataOffset !== u.length)) + if (isNaN(d) || isNaN(f) || (a.data.push(f), a.data.push(d), d + _Hr.SliceDataOffset !== u.length)) return false; - for (let p = _Xr.SliceDataOffset; p < u.length; p++) { + for (let p = _Hr.SliceDataOffset; p < u.length; p++) { const g = parseFloat(u[p]); if (isNaN(g)) return false; @@ -73051,7 +73052,7 @@ var Xr = class _Xr { */ exportDataToCsv() { let e = ""; - e += `${$g},${em}`; + e += `${em},${tm}`; for (let i = 0; i < this.datasets.ids.length; i++) if (e += `,${this.datasets.ids[i]}`, this._datasetMeta) { const r = this._datasetMeta.get(this.datasets.ids[i]); @@ -73060,10 +73061,10 @@ var Xr = class _Xr { e += ` `; for (let i = 0; i < this.datasets.startingIndices.itemLength; i++) { - const r = this.datasets.startingIndices.at(i), s = this.datasets.data.at(r), a = this.datasets.data.at(r + _Xr.NumberOfPointsOffset); + const r = this.datasets.startingIndices.at(i), s = this.datasets.data.at(r), a = this.datasets.data.at(r + _Hr.NumberOfPointsOffset); e += `${s},${a}`; for (let o = 0; o < a; o++) - e += `,${this.datasets.data.at(r + _Xr.SliceDataOffset + o)}`; + e += `,${this.datasets.data.at(r + _Hr.SliceDataOffset + o)}`; for (let o = 0; o < this.datasets.ids.length - a; o++) e += ","; e += ` @@ -73101,9 +73102,9 @@ var Xr = class _Xr { } }; Ot.prototype.getPerfCollector = function() { - return this._perfCollector || (this._perfCollector = new Xr(this)), this._perfCollector; + return this._perfCollector || (this._perfCollector = new Hr(this)), this._perfCollector; }; -function OF(n4) { +function DF(n4) { const e = new Array(), t = new Array(), i = new Array(), r = n4.add(() => { const a = e.length; for (let o = 0; o < a; o++) @@ -73120,7 +73121,7 @@ function OF(n4) { } he.prototype.runCoroutineAsync = function(n4) { if (!this._coroutineScheduler) { - const e = OF(this); + const e = DF(this); this._coroutineScheduler = e.scheduler, this._coroutineSchedulerDispose = e.dispose; } return j_(n4, this._coroutineScheduler); @@ -73128,8 +73129,8 @@ he.prototype.runCoroutineAsync = function(n4) { he.prototype.cancelAllCoroutines = function() { this._coroutineSchedulerDispose && this._coroutineSchedulerDispose(), this._coroutineScheduler = void 0, this._coroutineSchedulerDispose = void 0; }; -var DF = "copyTextureToTexturePixelShader"; -var NF = `uniform float conversion;uniform sampler2D textureSampler;varying vec2 vUV; +var NF = "copyTextureToTexturePixelShader"; +var FF = `uniform float conversion;uniform sampler2D textureSampler;varying vec2 vUV; #include void main(void) {vec4 color=texture2D(textureSampler,vUV); @@ -73141,11 +73142,11 @@ gl_FragColor=color; #endif } `; -Y.ShadersStore[DF] = NF; -var tm; +Y.ShadersStore[NF] = FF; +var im; (function(n4) { n4[n4.None = 0] = "None", n4[n4.ToLinearSpace = 1] = "ToLinearSpace", n4[n4.ToGammaSpace = 2] = "ToGammaSpace"; -})(tm || (tm = {})); +})(im || (im = {})); Xo.prototype.removeReflectionProbe = function(n4) { if (!this.reflectionProbes) return -1; @@ -73166,7 +73167,7 @@ var Yc = class _Yc { * @param linearSpace defines if the probe should be generated in linear space or not (false by default) */ constructor(e, t, i, r = true, s = false, a = false) { - if (this.name = e, this._viewMatrix = w.Identity(), this._target = _.Zero(), this._add = _.Zero(), this._invertYAxis = false, this.position = _.Zero(), this.metadata = null, this._parentContainer = null, this._scene = i, i.getEngine().supportsUniformBuffers) { + if (this.name = e, this._viewMatrix = L.Identity(), this._target = _.Zero(), this._add = _.Zero(), this._invertYAxis = false, this.position = _.Zero(), this.metadata = null, this._parentContainer = null, this._scene = i, i.getEngine().supportsUniformBuffers) { this._sceneUBOs = []; for (let h = 0; h < 6; ++h) this._sceneUBOs.push(i.createSceneUniformBuffer(`Scene for Reflection Probe (name "${e}") face #${h}`)); @@ -73201,7 +73202,7 @@ var Yc = class _Yc { break; } this._attachedMesh && this.position.copyFrom(this._attachedMesh.getAbsolutePosition()), this.position.addToRef(this._add, this._target); - const u = i.useRightHandedSystem ? w.LookAtRHToRef : w.LookAtLHToRef, f = i.useRightHandedSystem ? w.PerspectiveFovRH : w.PerspectiveFovLH; + const u = i.useRightHandedSystem ? L.LookAtRHToRef : L.LookAtLHToRef, f = i.useRightHandedSystem ? L.PerspectiveFovRH : L.PerspectiveFovLH; u(this.position, this._target, _.Up(), this._viewMatrix), i.activeCamera && (this._projectionMatrix = f(Math.PI / 2, 1, l ? i.activeCamera.maxZ : i.activeCamera.minZ, l ? i.activeCamera.minZ : i.activeCamera.maxZ, this._scene.getEngine().isNDCHalfZRange), i.setTransformMatrix(this._viewMatrix, this._projectionMatrix), i.activeCamera.isRigCamera && !this._renderTargetTexture.activeCamera && (this._renderTargetTexture.activeCamera = i.activeCamera.rigParent || null)), i._forcedViewPosition = this.position; }); let c; @@ -73320,12 +73321,12 @@ var Yc = class _Yc { } }; P([ - Sy() + yy() ], Yc.prototype, "_attachedMesh", void 0); P([ - cn() + hn() ], Yc.prototype, "position", void 0); -var FF = class { +var LF = class { /** * Creates a new instance of the component for the given scene * @param scene Defines the scene to register the component in @@ -73361,16 +73362,16 @@ var FF = class { } } }; -var LF = "proceduralVertexShader"; -var wF = `attribute vec2 position;varying vec2 vPosition;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5); +var wF = "proceduralVertexShader"; +var UF = `attribute vec2 position;varying vec2 vPosition;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5); #define CUSTOM_VERTEX_DEFINITIONS void main(void) { #define CUSTOM_VERTEX_MAIN_BEGIN vPosition=position;vUV=position*madd+madd;gl_Position=vec4(position,0.0,1.0); #define CUSTOM_VERTEX_MAIN_END }`; -Y.ShadersStore[LF] = wF; -var fn = class _fn extends le { +Y.ShadersStore[wF] = UF; +var dn = class _dn extends le { /** * Instantiates a new procedural texture. * Procedural texturing is a way to programmatically create a texture. There are 2 types of procedural textures: code-only, and code that references some classic 2D images, sometimes called 'refMaps' or 'sampler' images. @@ -73391,7 +73392,7 @@ var fn = class _fn extends le { constructor(e, t, i, r, s = null, a = true, o = false, l = 0) { super(null, r, !a), this.isEnabled = true, this.autoClear = true, this.onGeneratedObservable = new he(), this.onBeforeGenerationObservable = new he(), this.nodeMaterialSource = null, this._textures = {}, this._currentRefreshId = -1, this._frameId = -1, this._refreshRate = 1, this._vertexBuffers = {}, this._uniforms = new Array(), this._samplers = new Array(), this._floats = {}, this._ints = {}, this._floatsArrays = {}, this._colors3 = {}, this._colors4 = {}, this._vectors2 = {}, this._vectors3 = {}, this._matrices = {}, this._fallbackTextureUsed = false, this._cachedDefines = null, this._contentUpdateId = -1, this._rtWrapper = null, s !== null && !(s instanceof le) ? (this._options = s, this._fallbackTexture = s.fallbackTexture ?? null) : (this._options = {}, this._fallbackTexture = s), r = this.getScene() || st.LastCreatedScene; let c = r._getComponent(ke.NAME_PROCEDURALTEXTURE); - c || (c = new FF(r), r._addComponent(c)), r.proceduralTextures.push(this), this._fullEngine = r.getEngine(), this.name = e, this.isRenderTarget = true, this._size = t, this._textureType = l, this._generateMipMaps = a, this._drawWrapper = new ka(this._fullEngine), this.setFragment(i); + c || (c = new LF(r), r._addComponent(c)), r.proceduralTextures.push(this), this._fullEngine = r.getEngine(), this.name = e, this.isRenderTarget = true, this._size = t, this._textureType = l, this._generateMipMaps = a, this._drawWrapper = new ka(this._fullEngine), this.setFragment(i); const h = this._createRtWrapper(o, t, a, l); this._texture = h.texture; const u = []; @@ -73677,7 +73678,7 @@ var fn = class _fn extends le { * @returns the cloned texture */ clone() { - const e = this.getSize(), t = new _fn(this.name, e.width, this._fragment, this.getScene(), this._fallbackTexture, this._generateMipMaps); + const e = this.getSize(), t = new _dn(this.name, e.width, this._fragment, this.getScene(), this._fallbackTexture, this._generateMipMaps); return t.hasAlpha = this.hasAlpha, t.level = this.level, t.coordinatesMode = this.coordinatesMode, t; } /** @@ -73694,23 +73695,23 @@ var fn = class _fn extends le { } }; P([ - U() -], fn.prototype, "isEnabled", void 0); + w() +], dn.prototype, "isEnabled", void 0); P([ - U() -], fn.prototype, "autoClear", void 0); + w() +], dn.prototype, "autoClear", void 0); P([ - U() -], fn.prototype, "_generateMipMaps", void 0); + w() +], dn.prototype, "_generateMipMaps", void 0); P([ - U() -], fn.prototype, "_size", void 0); + w() +], dn.prototype, "_size", void 0); P([ - U() -], fn.prototype, "refreshRate", null); -Re("BABYLON.ProceduralTexture", fn); -var UF = "equirectangularPanoramaPixelShader"; -var VF = `#ifdef GL_ES + w() +], dn.prototype, "refreshRate", null); +Re("BABYLON.ProceduralTexture", dn); +var VF = "equirectangularPanoramaPixelShader"; +var BF = `#ifdef GL_ES precision highp float; #endif #define M_PI 3.1415926535897932384626433832795 @@ -73719,68 +73720,68 @@ varying vec2 vUV;uniform samplerCube cubeMap;void main(void) {vec2 uv=vUV;float cos( latitude ), - cos( longitude )*sin( latitude ) );normalize( dir );gl_FragColor=textureCube( cubeMap,dir );}`; -Y.ShadersStore[UF] = VF; -function BF(n4) { +Y.ShadersStore[VF] = BF; +function kF(n4) { return this.selected.forEach((e, t) => { let i = n4 instanceof Function ? n4(e.metadata.data, t) : n4; rt.AddTagsTo(e, i); }), this; } -function kF(n4) { +function zF(n4) { return this.selected.forEach((e) => rt.RemoveTagsFrom(e, n4)), this; } -function zF(n4) { +function WF(n4) { let e = []; return this.selected.forEach((t) => { n4 === void 0 ? e.push({ node: t, value: rt.HasTags(t) }) : e.push({ node: t, value: rt.MatchesQuery(t, n4) }); }), e; } -function WF(n4) { +function GF(n4) { return this.selected.forEach((e, t) => { var i, r, s; e instanceof AbstractMesh ? n4 instanceof Function ? (r = e.actionManager) == null || r.registerAction(n4((i = e.metadata).data ?? (i.data = {}), e, t)) : (s = e.actionManager) == null || s.registerAction(n4) : console.log("Node not a mesh, skipping."); }), this; } -function GF(n4) { +function XF(n4) { return this.prop("material", n4), this; } -function XF(n4) { +function HF(n4) { return this.prop("material.diffuseColor", n4), this; } -function HF(n4) { +function KF(n4) { return this.prop("material.specularColor", n4), this; } -function KF(n4) { +function qF(n4) { return this.prop("material.emissiveColor", n4), this; } -function qF(n4) { +function YF(n4) { return this.prop("material.ambientColor", n4), this; } -function YF(n4) { +function ZF(n4) { return this.prop("material.diffuseTexture", n4), this; } -function ZF(n4) { +function jF(n4) { return this.prop("material.specularTexture", n4), this; } -function jF(n4) { +function QF(n4) { return this.prop("material.emissiveTexture", n4), this; } -function QF(n4) { +function JF(n4) { return this.prop("material.ambientTexture", n4), this; } -function JF(n4, e) { +function $F(n4, e) { return this.selected.forEach((t, i) => { t instanceof Mesh ? t.registerInstancedBuffer(n4, e) : console.log("Node not a mesh skipping"); }), this; } -function $F(n4, e) { +function eL(n4, e) { return this.selected.forEach((t, i) => { t instanceof InstancedMesh ? t.instancedBuffers[n4] = e instanceof Function ? e(t.metadata.data, i) : e : console.log("Node not a mesh, skipping."); }), this; } var hc = function() { try { - var n4 = Of(Object, "defineProperty"); + var n4 = Df(Object, "defineProperty"); return n4({}, "", {}), n4; } catch { } @@ -73793,104 +73794,104 @@ function dE(n4, e, t) { writable: true }) : n4[e] = t; } -var eL = Object.prototype; -var tL = eL.hasOwnProperty; -function Uf(n4, e, t) { +var tL = Object.prototype; +var iL = tL.hasOwnProperty; +function Vf(n4, e, t) { var i = n4[e]; - (!(tL.call(n4, e) && Df(i, t)) || t === void 0 && !(e in n4)) && dE(n4, e, t); + (!(iL.call(n4, e) && Nf(i, t)) || t === void 0 && !(e in n4)) && dE(n4, e, t); } -var iL = 9007199254740991; -var rL = /^(?:0|[1-9]\d*)$/; +var rL = 9007199254740991; +var sL = /^(?:0|[1-9]\d*)$/; function Zc(n4, e) { var t = typeof n4; - return e = e ?? iL, !!e && (t == "number" || t != "symbol" && rL.test(n4)) && n4 > -1 && n4 % 1 == 0 && n4 < e; + return e = e ?? rL, !!e && (t == "number" || t != "symbol" && sL.test(n4)) && n4 > -1 && n4 % 1 == 0 && n4 < e; } -function sL(n4, e, t, i) { +function nL(n4, e, t, i) { if (!yo(n4)) return n4; - e = Ff(e, n4); + e = Lf(e, n4); for (var r = -1, s = e.length, a = s - 1, o = n4; o != null && ++r < s; ) { - var l = Lf(e[r]), c = t; + var l = wf(e[r]), c = t; if (l === "__proto__" || l === "constructor" || l === "prototype") return n4; if (r != a) { var h = o[l]; c = i ? i(h, l, o) : void 0, c === void 0 && (c = yo(h) ? h : Zc(e[r + 1]) ? [] : {}); } - Uf(o, l, c), o = o[l]; + Vf(o, l, c), o = o[l]; } return n4; } function jc(n4, e, t) { - return n4 == null ? n4 : sL(n4, e, t); + return n4 == null ? n4 : nL(n4, e, t); } -function nL(n4, e) { +function aL(n4, e) { return n4 != null && e in Object(n4); } -var aL = "[object Arguments]"; -function im(n4) { - return Wc(n4) && zc(n4) == aL; +var oL = "[object Arguments]"; +function rm(n4) { + return Wc(n4) && zc(n4) == oL; } var pE = Object.prototype; -var oL = pE.hasOwnProperty; -var lL = pE.propertyIsEnumerable; -var cL = im(/* @__PURE__ */ function() { +var lL = pE.hasOwnProperty; +var cL = pE.propertyIsEnumerable; +var hL = rm(/* @__PURE__ */ function() { return arguments; -}()) ? im : function(n4) { - return Wc(n4) && oL.call(n4, "callee") && !lL.call(n4, "callee"); +}()) ? rm : function(n4) { + return Wc(n4) && lL.call(n4, "callee") && !cL.call(n4, "callee"); }; -var gE = cL; -var hL = 9007199254740991; -function Vf(n4) { - return typeof n4 == "number" && n4 > -1 && n4 % 1 == 0 && n4 <= hL; +var gE = hL; +var uL = 9007199254740991; +function Bf(n4) { + return typeof n4 == "number" && n4 > -1 && n4 % 1 == 0 && n4 <= uL; } -function uL(n4, e, t) { - e = Ff(e, n4); +function fL(n4, e, t) { + e = Lf(e, n4); for (var i = -1, r = e.length, s = false; ++i < r; ) { - var a = Lf(e[i]); + var a = wf(e[i]); if (!(s = n4 != null && t(n4, a))) break; n4 = n4[a]; } - return s || ++i != r ? s : (r = n4 == null ? 0 : n4.length, !!r && Vf(r) && Zc(a, r) && (Zo(n4) || gE(n4))); + return s || ++i != r ? s : (r = n4 == null ? 0 : n4.length, !!r && Bf(r) && Zc(a, r) && (Zo(n4) || gE(n4))); } -function Bf(n4, e) { - return n4 != null && uL(n4, e, nL); +function kf(n4, e) { + return n4 != null && fL(n4, e, aL); } -function fL(n4, e) { +function dL(n4, e) { return this.selected.forEach((t, i) => { t instanceof TransformNode ? hE(t, n4) != null ? jc(t, n4, e instanceof Function ? e(t.metadata.data, i) : e) : console.error(n4 + " not a property of " + t) : console.warn("Node not a mesh, skipping."); }), this; } -function dL(n4, e) { +function pL(n4, e) { return this.selected.forEach((t, i) => { var r; - Bf(t, n4) ? jc(t, n4, e instanceof Function ? e((r = t.metadata).data ?? (r.data = {}), t, i) : e) : console.error(n4 + " not a property of " + t); + kf(t, n4) ? jc(t, n4, e instanceof Function ? e((r = t.metadata).data ?? (r.data = {}), t, i) : e) : console.error(n4 + " not a property of " + t); }), this; } -function pL(n4) { +function gL(n4) { return this.selected.forEach((e, t) => { var i; for (let r in n4) - Bf(e, r) ? jc( + kf(e, r) ? jc( e, r, n4[r] instanceof Function ? n4[r]((i = e.metadata).data ?? (i.data = {}), e, t) : n4[r] ) : console.log(r + " not property of " + e); }), this; } -function gL(n4) { +function mL(n4) { return this.selected.forEach((e, t) => { var i; n4((i = e.metadata).data ?? (i.data = {}), e, t); }), this; } -function mL(n4) { +function _L(n4) { return this.selected.forEach((e, t) => { n4 != null ? n4(e, t) && e.dispose() : e.dispose(); }), this; } -function rm(n4) { +function sm(n4) { return this.selected.forEach((e, t) => { if (e instanceof Mesh && e.material !== null) { let i = e.material.diffuseTexture; @@ -73898,7 +73899,7 @@ function rm(n4) { } }), this; } -function _L(n4, e, t = null, i = null, r = null, s = null) { +function EL(n4, e, t = null, i = null, r = null, s = null) { return this.selected.forEach((a, o) => { if (a instanceof Mesh && a.material !== null) { let l = a.material.diffuseTexture; @@ -73913,7 +73914,7 @@ function _L(n4, e, t = null, i = null, r = null, s = null) { } }), this; } -function EL(n4 = "") { +function vL(n4 = "") { let e = this.selected[0], t = e instanceof Mesh ? e.getBoundingInfo().boundingBox.minimumWorld : e instanceof TransformNode ? this.selected[0].position : new Vector3(), i = e instanceof Mesh ? e.getBoundingInfo().boundingBox.maximumWorld : e instanceof TransformNode ? this.selected[0].position : new Vector3(); return this.selected.forEach((r, s) => { r.computeWorldMatrix(true), (r.getChildMeshes().length > 0 ? r.getChildMeshes() : [r]).forEach((o, l) => { @@ -73925,36 +73926,36 @@ function EL(n4 = "") { }); }), new BoundingInfo(t, i); } -function vL(n4) { +function TL(n4) { let e = []; return this.selected.forEach((t, i) => { var r; n4((r = t.metadata).data ?? (r.data = {}), t, i) && e.push(t); - }), new Jt(e, this.scene); + }), new qt(e, this.scene); } -function TL(n4) { +function xL(n4) { return this.prop("name", n4), this; } -function xL(n4) { +function CL(n4) { return this.prop("id", n4), this; } -function CL(n4, e) { +function RL(n4, e) { return this.selected.forEach((t, i) => { - Bf(t, "metadata") ? jc( + kf(t, "metadata") ? jc( t, "metadata", e instanceof Function ? { ...t.metadata, key: e(t.metadata.data, t, i) } : { ...t.metadata, key: e } ) : console.error("metadata not a property of " + t); }), this; } -function RL(n4 = {}) { +function SL(n4 = {}) { return this.selected.forEach((e) => { let { min: t, max: i } = e.getHierarchyBoundingVectors(true, (v) => !Tags.MatchesQuery(v, "exclude")), r = new BoundingInfo(t, i), s = n4.name || e.name + "PositionUI", a = n4.width || r.boundingBox.extendSize.x * 0.5, o = n4.radius || a * 0.05, l = n4.position || new Vector3(0, -r.boundingBox.extendSize.y, -Math.hypot(r.boundingBox.extendSize.x, r.boundingBox.extendSize.z)), c = n4.offset || new Vector3(0, -o * 2.5, 0), h = n4.billboard || 0, u; n4.material === void 0 ? (u = new StandardMaterial("PositionUIMat", this.scene), u.diffuseColor = n4.diffuseColor || Color3.White()) : u = n4.material; let f = n4.visibility || 1, d; n4.behavior === void 0 ? (d = new SixDofDragBehavior(), d.faceCameraOnDragStart = true, d.rotateAroundYOnly = true, d.zDragFactor = 100) : d = n4.behavior; let p = zo("container", s + "Container", { calculateBounds: false }, this.scene); - p.setParent(e), p.setBoundingInfo(r), p.isPickable = false, p.billboardMode = h, new Jt([p], this.scene).bind("capsule", { height: a, radius: o }).name(s).position(l.addInPlace(c)).rotation(new Vector3(0, 0, 1.57)).material(u).prop("visibility", f).action((v, E, C) => new ExecuteCodeAction( + p.setParent(e), p.setBoundingInfo(r), p.isPickable = false, p.billboardMode = h, new qt([p], this.scene).bind("capsule", { height: a, radius: o }).name(s).position(l.addInPlace(c)).rotation(new Vector3(0, 0, 1.57)).material(u).prop("visibility", f).action((v, E, C) => new ExecuteCodeAction( ActionManager.OnPickDownTrigger, () => { e.addBehavior(d); @@ -73972,14 +73973,14 @@ function RL(n4 = {}) { )).addTags("exclude"); }), this; } -function SL(n4 = {}) { +function yL(n4 = {}) { return this.selected.forEach((e) => { let { min: t, max: i } = e.getHierarchyBoundingVectors(true, (v) => !Tags.MatchesQuery(v, "exclude")), r = new BoundingInfo(t, i), s = n4.name || e.name + "ScaleUI", a = n4.diameter || r.boundingBox.extendSize.x * 0.5 * 0.05 * 2, o = n4.position || new Vector3(0, -r.boundingBox.extendSize.y, -Math.hypot(r.boundingBox.extendSize.x, r.boundingBox.extendSize.z)), l = n4.offset || new Vector3(r.boundingBox.extendSize.x * 0.5 * 1.5 / 2, -a / 2 * 2.5, 0), c = n4.billboard || 0, h; n4.material === void 0 ? (h = new StandardMaterial("PositionUIMat", this.scene), h.diffuseColor = n4.diffuseColor || Color3.White()) : h = n4.material; let u = n4.visibility || 1, f; n4.behavior === void 0 ? (f = new PointerDragBehavior({ dragAxis: new Vector3(0, 1, 0) }), f.moveAttached = false) : f = n4.behavior; let d = n4.minimum || -1 / 0, p = n4.maximum || 1 / 0, g = zo("container", s + "Container", { calculateBounds: false }, this.scene); - g.setParent(e), g.setBoundingInfo(r), g.isPickable = false, g.billboardMode = c, new Jt([g], this.scene).bind("sphere", { diameter: a }).name(s).position(o.addInPlace(l)).rotation(new Vector3(0, 0, 1.57)).material(h).prop("visibility", u).addTags("exclude").action((v, E, C) => new ExecuteCodeAction( + g.setParent(e), g.setBoundingInfo(r), g.isPickable = false, g.billboardMode = c, new qt([g], this.scene).bind("sphere", { diameter: a }).name(s).position(o.addInPlace(l)).rotation(new Vector3(0, 0, 1.57)).material(h).prop("visibility", u).addTags("exclude").action((v, E, C) => new ExecuteCodeAction( ActionManager.OnPickDownTrigger, () => { E.addBehavior(f); @@ -74004,7 +74005,7 @@ function SL(n4 = {}) { }); }), this; } -function yL(n4 = {}) { +function IL(n4 = {}) { return this.selected.forEach((e) => { let { min: t, max: i } = e.getHierarchyBoundingVectors(true, (E) => !Tags.MatchesQuery(E, "exclude")), r = new BoundingInfo(t, i), s = n4.name || e.name + "ScaleUI", a = n4.billboard || 0, o = n4.axis || { x: true, y: true, z: true }, l = n4.diameter || r.boundingBox.extendSize.x * 0.5 * 0.05 * 2, c = n4.thickness || l / 2, h = n4.position || new Vector3(0, -r.boundingBox.extendSize.y, -Math.hypot(r.boundingBox.extendSize.x, r.boundingBox.extendSize.z)), u = n4.offset || new Vector3(0, -l * 2.5, 0), f; n4.material === void 0 ? (f = new StandardMaterial("PositionUIMat", this.scene), f.diffuseColor = n4.diffuseColor || Color3.White()) : f = n4.material; @@ -74019,7 +74020,7 @@ function yL(n4 = {}) { o[E] == true && g.push({ axis: E }); }); let m = zo("container", s + "Container", { calculateBounds: false }, this.scene); - m.setParent(e), m.setBoundingInfo(r), m.isPickable = false, m.billboardMode = a, new Jt([m], this.scene).bind("torus", { diameter: l, thickness: c }, g).name((E, C, T) => n4.name ?? (n4.name = C.name + "_scaleUI")).position( + m.setParent(e), m.setBoundingInfo(r), m.isPickable = false, m.billboardMode = a, new qt([m], this.scene).bind("torus", { diameter: l, thickness: c }, g).name((E, C, T) => n4.name ?? (n4.name = C.name + "_scaleUI")).position( (E) => E.axis == "x" ? new Vector3(0, 0, 0).addInPlace(h).addInPlace(u) : E.axis == "y" ? new Vector3(l * 1.5, 0, 0).addInPlace(h).addInPlace(u) : E.axis == "z" ? new Vector3(-l * 1.5, 0, 0).addInPlace(h).addInPlace(u) : new Vector3(0, 0, 0) ).rotation( (E) => E.axis == "x" ? new Vector3(0, 0, 1.57) : E.axis == "y" ? new Vector3(0, 0, 0) : E.axis == "z" ? new Vector3(1.57, 0, 0) : new Vector3(0, 0, 0) @@ -74047,24 +74048,24 @@ function yL(n4 = {}) { }); }), this; } -var Jt = class { +var qt = class { constructor(e, t) { - this.select = kR, this.selectName = zR, this.selectId = WR, this.selectTag = GR, this.bind = DS, this.run = gL, this.bindInstance = NS, this.position = FS, this.positionX = LS, this.positionY = wS, this.positionZ = US, this.translate = VS, this.rotation = BS, this.rotationX = kS, this.rotationY = zS, this.rotationZ = WS, this.scaling = GS, this.scalingX = XS, this.scalingY = HS, this.scalingZ = KS, this.get = qD, this.attr = fL, this.addTags = BF, this.removeTags = kF, this.hasTags = zF, this.action = WF, this.material = GF, this.diffuseColor = XF, this.specularColor = HF, this.emissiveColor = KF, this.ambientColor = qF, this.registerInstancedBuffer = JF, this.setInstancedBuffer = $F, this.dispose = mL, this.diffuseTexture = YF, this.specularTexture = ZF, this.emissiveTexture = jF, this.ambientTexture = QF, this.scaleDT = rm, this.scaleToDT = rm, this.drawTextDT = _L, this.boundingBox = EL, this.filter = vL, this.props = pL, this.prop = dL, this.name = TL, this.id = xL, this.metadata = CL, this.positionUI = RL, this.scaleUI = SL, this.rotateUI = yL, this.selected = e, this.scene = t; + this.select = zR, this.selectName = WR, this.selectId = GR, this.selectTag = XR, this.bind = NS, this.run = mL, this.bindInstance = FS, this.position = LS, this.positionX = wS, this.positionY = US, this.positionZ = VS, this.translate = BS, this.rotation = kS, this.rotationX = zS, this.rotationY = WS, this.rotationZ = GS, this.scaling = XS, this.scalingX = HS, this.scalingY = KS, this.scalingZ = qS, this.get = YD, this.attr = dL, this.addTags = kF, this.removeTags = zF, this.hasTags = WF, this.action = GF, this.material = XF, this.diffuseColor = HF, this.specularColor = KF, this.emissiveColor = qF, this.ambientColor = YF, this.registerInstancedBuffer = $F, this.setInstancedBuffer = eL, this.dispose = _L, this.diffuseTexture = ZF, this.specularTexture = jF, this.emissiveTexture = QF, this.ambientTexture = JF, this.scaleDT = sm, this.scaleToDT = sm, this.drawTextDT = EL, this.boundingBox = vL, this.filter = TL, this.props = gL, this.prop = pL, this.name = xL, this.id = CL, this.metadata = RL, this.positionUI = SL, this.scaleUI = yL, this.rotateUI = IL, this.selected = e, this.scene = t; } }; -function IL(n4, e, t, i) { +function bL(n4, e, t, i) { var r = !t; t || (t = {}); for (var s = -1, a = e.length; ++s < a; ) { var o = e[s], l = i ? i(t[o], n4[o], o, t, n4) : void 0; - l === void 0 && (l = n4[o]), r ? dE(t, o, l) : Uf(t, o, l); + l === void 0 && (l = n4[o]), r ? dE(t, o, l) : Vf(t, o, l); } return t; } function mE(n4) { return n4; } -function bL(n4, e, t) { +function AL(n4, e, t) { switch (t.length) { case 0: return n4.call(e); @@ -74077,261 +74078,252 @@ function bL(n4, e, t) { } return n4.apply(e, t); } -var sm = Math.max; -function AL(n4, e, t) { - return e = sm(e === void 0 ? n4.length - 1 : e, 0), function() { - for (var i = arguments, r = -1, s = sm(i.length - e, 0), a = Array(s); ++r < s; ) +var nm = Math.max; +function ML(n4, e, t) { + return e = nm(e === void 0 ? n4.length - 1 : e, 0), function() { + for (var i = arguments, r = -1, s = nm(i.length - e, 0), a = Array(s); ++r < s; ) a[r] = i[e + r]; r = -1; for (var o = Array(e + 1); ++r < e; ) o[r] = i[r]; - return o[e] = t(a), bL(n4, this, o); + return o[e] = t(a), AL(n4, this, o); }; } -function ML(n4) { +function PL(n4) { return function() { return n4; }; } -var PL = hc ? function(n4, e) { +var OL = hc ? function(n4, e) { return hc(n4, "toString", { configurable: true, enumerable: false, - value: ML(e), + value: PL(e), writable: true }); } : mE; -var OL = PL; -var DL = 800; -var NL = 16; -var FL = Date.now; -function LL(n4) { +var DL = OL; +var NL = 800; +var FL = 16; +var LL = Date.now; +function wL(n4) { var e = 0, t = 0; return function() { - var i = FL(), r = NL - (i - t); + var i = LL(), r = FL - (i - t); if (t = i, r > 0) { - if (++e >= DL) + if (++e >= NL) return arguments[0]; } else e = 0; return n4.apply(void 0, arguments); }; } -var wL = LL(OL); -function UL(n4, e) { - return wL(AL(n4, e, mE), n4 + ""); +var UL = wL(DL); +function VL(n4, e) { + return UL(ML(n4, e, mE), n4 + ""); } -function kf(n4) { - return n4 != null && Vf(n4.length) && !lE(n4); +function zf(n4) { + return n4 != null && Bf(n4.length) && !lE(n4); } -function VL(n4, e, t) { +function BL(n4, e, t) { if (!yo(t)) return false; var i = typeof e; - return (i == "number" ? kf(t) && Zc(e, t.length) : i == "string" && e in t) ? Df(t[e], n4) : false; + return (i == "number" ? zf(t) && Zc(e, t.length) : i == "string" && e in t) ? Nf(t[e], n4) : false; } -function BL(n4) { - return UL(function(e, t) { +function kL(n4) { + return VL(function(e, t) { var i = -1, r = t.length, s = r > 1 ? t[r - 1] : void 0, a = r > 2 ? t[2] : void 0; - for (s = n4.length > 3 && typeof s == "function" ? (r--, s) : void 0, a && VL(t[0], t[1], a) && (s = r < 3 ? void 0 : s, r = 1), e = Object(e); ++i < r; ) { + for (s = n4.length > 3 && typeof s == "function" ? (r--, s) : void 0, a && BL(t[0], t[1], a) && (s = r < 3 ? void 0 : s, r = 1), e = Object(e); ++i < r; ) { var o = t[i]; o && n4(e, o, i, s); } return e; }); } -var kL = Object.prototype; +var zL = Object.prototype; function _E(n4) { - var e = n4 && n4.constructor, t = typeof e == "function" && e.prototype || kL; + var e = n4 && n4.constructor, t = typeof e == "function" && e.prototype || zL; return n4 === t; } -function zL(n4, e) { +function WL(n4, e) { for (var t = -1, i = Array(n4); ++t < n4; ) i[t] = e(t); return i; } -function WL() { +function GL() { return false; } var EE = typeof exports == "object" && exports && !exports.nodeType && exports; -var nm = EE && typeof module == "object" && module && !module.nodeType && module; -var GL = nm && nm.exports === EE; -var am = GL ? kc.Buffer : void 0; -var XL = am ? am.isBuffer : void 0; -var HL = XL || WL; -var KL = "[object Arguments]"; -var qL = "[object Array]"; -var YL = "[object Boolean]"; -var ZL = "[object Date]"; -var jL = "[object Error]"; -var QL = "[object Function]"; -var JL = "[object Map]"; -var $L = "[object Number]"; -var e2 = "[object Object]"; -var t2 = "[object RegExp]"; -var i2 = "[object Set]"; -var r2 = "[object String]"; -var s2 = "[object WeakMap]"; -var n2 = "[object ArrayBuffer]"; -var a2 = "[object DataView]"; -var o2 = "[object Float32Array]"; -var l2 = "[object Float64Array]"; -var c2 = "[object Int8Array]"; -var h2 = "[object Int16Array]"; -var u2 = "[object Int32Array]"; -var f2 = "[object Uint8Array]"; -var d2 = "[object Uint8ClampedArray]"; -var p2 = "[object Uint16Array]"; -var g2 = "[object Uint32Array]"; +var am = EE && typeof module == "object" && module && !module.nodeType && module; +var XL = am && am.exports === EE; +var om = XL ? kc.Buffer : void 0; +var HL = om ? om.isBuffer : void 0; +var KL = HL || GL; +var qL = "[object Arguments]"; +var YL = "[object Array]"; +var ZL = "[object Boolean]"; +var jL = "[object Date]"; +var QL = "[object Error]"; +var JL = "[object Function]"; +var $L = "[object Map]"; +var e2 = "[object Number]"; +var t2 = "[object Object]"; +var i2 = "[object RegExp]"; +var r2 = "[object Set]"; +var s2 = "[object String]"; +var n2 = "[object WeakMap]"; +var a2 = "[object ArrayBuffer]"; +var o2 = "[object DataView]"; +var l2 = "[object Float32Array]"; +var c2 = "[object Float64Array]"; +var h2 = "[object Int8Array]"; +var u2 = "[object Int16Array]"; +var f2 = "[object Int32Array]"; +var d2 = "[object Uint8Array]"; +var p2 = "[object Uint8ClampedArray]"; +var g2 = "[object Uint16Array]"; +var m2 = "[object Uint32Array]"; var ri = {}; -ri[o2] = ri[l2] = ri[c2] = ri[h2] = ri[u2] = ri[f2] = ri[d2] = ri[p2] = ri[g2] = true; -ri[KL] = ri[qL] = ri[n2] = ri[YL] = ri[a2] = ri[ZL] = ri[jL] = ri[QL] = ri[JL] = ri[$L] = ri[e2] = ri[t2] = ri[i2] = ri[r2] = ri[s2] = false; -function m2(n4) { - return Wc(n4) && Vf(n4.length) && !!ri[zc(n4)]; -} +ri[l2] = ri[c2] = ri[h2] = ri[u2] = ri[f2] = ri[d2] = ri[p2] = ri[g2] = ri[m2] = true; +ri[qL] = ri[YL] = ri[a2] = ri[ZL] = ri[o2] = ri[jL] = ri[QL] = ri[JL] = ri[$L] = ri[e2] = ri[t2] = ri[i2] = ri[r2] = ri[s2] = ri[n2] = false; function _2(n4) { + return Wc(n4) && Bf(n4.length) && !!ri[zc(n4)]; +} +function E2(n4) { return function(e) { return n4(e); }; } var vE = typeof exports == "object" && exports && !exports.nodeType && exports; var uo = vE && typeof module == "object" && module && !module.nodeType && module; -var E2 = uo && uo.exports === vE; -var Qh = E2 && aE.process; -var om = function() { +var v2 = uo && uo.exports === vE; +var Qh = v2 && aE.process; +var lm = function() { try { var n4 = uo && uo.require && uo.require("util").types; return n4 || Qh && Qh.binding && Qh.binding("util"); } catch { } }(); -var lm = om && om.isTypedArray; -var v2 = lm ? _2(lm) : m2; -var T2 = Object.prototype; -var x2 = T2.hasOwnProperty; -function C2(n4, e) { - var t = Zo(n4), i = !t && gE(n4), r = !t && !i && HL(n4), s = !t && !i && !r && v2(n4), a = t || i || r || s, o = a ? zL(n4.length, String) : [], l = o.length; +var cm = lm && lm.isTypedArray; +var T2 = cm ? E2(cm) : _2; +var x2 = Object.prototype; +var C2 = x2.hasOwnProperty; +function R2(n4, e) { + var t = Zo(n4), i = !t && gE(n4), r = !t && !i && KL(n4), s = !t && !i && !r && T2(n4), a = t || i || r || s, o = a ? WL(n4.length, String) : [], l = o.length; for (var c in n4) - (e || x2.call(n4, c)) && !(a && // Safari 9 has enumerable `arguments.length` in strict mode. + (e || C2.call(n4, c)) && !(a && // Safari 9 has enumerable `arguments.length` in strict mode. (c == "length" || // Node.js 0.10 has enumerable non-index properties on buffers. r && (c == "offset" || c == "parent") || // PhantomJS 2 has enumerable non-index properties on typed arrays. s && (c == "buffer" || c == "byteLength" || c == "byteOffset") || // Skip index properties. Zc(c, l))) && o.push(c); return o; } -function R2(n4, e) { +function S2(n4, e) { return function(t) { return n4(e(t)); }; } -var S2 = R2(Object.keys, Object); -var y2 = Object.prototype; -var I2 = y2.hasOwnProperty; -function b2(n4) { +var y2 = S2(Object.keys, Object); +var I2 = Object.prototype; +var b2 = I2.hasOwnProperty; +function A2(n4) { if (!_E(n4)) - return S2(n4); + return y2(n4); var e = []; for (var t in Object(n4)) - I2.call(n4, t) && t != "constructor" && e.push(t); + b2.call(n4, t) && t != "constructor" && e.push(t); return e; } -function A2(n4) { - return kf(n4) ? C2(n4) : b2(n4); +function M2(n4) { + return zf(n4) ? R2(n4) : A2(n4); } -var M2 = Object.prototype; -var P2 = M2.hasOwnProperty; -var Zi = BL(function(n4, e) { - if (_E(e) || kf(e)) { - IL(e, A2(e), n4); +var P2 = Object.prototype; +var O2 = P2.hasOwnProperty; +var Zi = kL(function(n4, e) { + if (_E(e) || zf(e)) { + bL(e, M2(e), n4); return; } for (var t in e) - P2.call(e, t) && Uf(n4, t, e[t]); + O2.call(e, t) && Vf(n4, t, e[t]); }); -function O2() { - var u, f, d, p, g, m, v, E, C; - let n4 = this.scales.x.scale, e = this.scales.x.range, t = this.scales.x.domain, i = this.scales.y.scale, r = this.scales.y.range, s = this.scales.y.domain, a = this.scales.z.scale, o = this.scales.z.range, l = this.scales.z.domain, c = {}, h = 0.02; - if (((u = this.options.scale) == null ? void 0 : u.x) != null) { - let T; - if (((f = this.options.labelTicks) == null ? void 0 : f.x) != null) - T = this.options.labelTicks.x; +function D2() { + var g, m, v, E, C, T, R, x, S; + let n4 = this.scales.x.scale, e = this.scales.x.range, t = this.scales.x.domain, i = this.scales.y.scale, r = this.scales.y.range, s = this.scales.y.domain, a = this.scales.z.scale, o = this.scales.z.range, l = this.scales.z.domain, c = {}, { min: h, max: u } = this.CoT.selected[0].getHierarchyBoundingVectors(), f = new BoundingInfo(h, u).boundingBox, d = f.extendSize.y + f.extendSize.x + f.extendSize.z, p = d * 0.025; + if (console.log(d, f), ((g = this.options.scale) == null ? void 0 : g.x) != null) { + let M; + if (((m = this.options.labelTicks) == null ? void 0 : m.x) != null) + M = this.options.labelTicks.x; else try { - T = n4.ticks(); + M = n4.ticks(); } catch { - T = t; + M = t; } new Vector3(0, 0, 0); - let R; - ((d = this.options.labelFormat) == null ? void 0 : d.x) != null ? R = { text: (M) => { - var N; - return (N = this.options.labelFormat) == null ? void 0 : N.x(M.text); - }, size: this.scales.size * h, atlas: this.options.atlas } : R = { text: (M) => M.text, size: this.scales.size * h, atlas: this.options.atlas }; - let x = {}, S = this.CoT.bind( + let N; + ((v = this.options.labelFormat) == null ? void 0 : v.x) != null ? N = { text: (H) => { + var q; + return (q = this.options.labelFormat) == null ? void 0 : q.x(H.text); + }, size: p, atlas: this.options.atlas } : N = { text: (H) => H.text, size: p, atlas: this.options.atlas }; + let F = {}, U = this.CoT.bind( "planeText", - Zi({}, R, this.options.labelOptions), - T.map((M) => ({ text: M })) - ).prop("name", this.name + "_labelX").position((M, N, F) => { - let L = N.getChildMeshes()[0].getBoundingInfo().boundingBox; - return new Vector3(n4(M.text), r[0] - L.center.y * 1.5, o[0] - L.center.y * 1.5); - }).props(Zi({}, x, this.options.labelProperties)); - c.x = S; - } - if (((p = this.options.scale) == null ? void 0 : p.y) != null) { - let T; - if (((g = this.options.labelTicks) == null ? void 0 : g.y) != null) - T = this.options.labelTicks.y; + Zi({}, N, this.options.labelOptions), + M.map((H) => ({ text: H })) + ).prop("name", this.name + "_labelX").position((H, q, Z) => new Vector3(n4(H.text), r[0] - p, o[0])).props(Zi({}, F, this.options.labelProperties)); + c.x = U; + } + if (((E = this.options.scale) == null ? void 0 : E.y) != null) { + let M; + if (((C = this.options.labelTicks) == null ? void 0 : C.y) != null) + M = this.options.labelTicks.y; else try { - T = i.ticks(); + M = i.ticks(); } catch { - T = s; + M = s; } new Vector3(0, 0, 0); - let R; - ((m = this.options.labelFormat) == null ? void 0 : m.y) != null ? R = { text: (M) => { - var N; - return (N = this.options.labelFormat) == null ? void 0 : N.y(M.text); - }, size: this.scales.size * h, atlas: this.options.atlas } : R = { text: (M) => M.text, size: this.scales.size * h, atlas: this.options.atlas }; - let x = {}, S = this.CoT.bind( + let N; + ((T = this.options.labelFormat) == null ? void 0 : T.y) != null ? N = { text: (H) => { + var q; + return (q = this.options.labelFormat) == null ? void 0 : q.y(H.text); + }, align: "right", size: p, atlas: this.options.atlas } : N = { text: (H) => H.text, align: "right", size: p, atlas: this.options.atlas }; + let F = {}, U = this.CoT.bind( "planeText", - Zi({}, R, this.options.labelOptions), - T.map((M) => ({ text: M })) - ).prop("name", this.name + "_labelY").position((M, N, F) => { - let L = N.getChildMeshes()[0].getBoundingInfo().boundingBox; - return new Vector3(e[0] - L.center._x - L.center.y * 1.5, i(M.text), o[0] - L.center.y * 1.5); - }).props(Zi({}, x, this.options.labelProperties)); - c.y = S; - } - if (((v = this.options.scale) == null ? void 0 : v.z) != null) { - let T; - if (((E = this.options.labelTicks) == null ? void 0 : E.z) != null) - T = this.options.labelTicks.z; + Zi({}, N, this.options.labelOptions), + M.map((H) => ({ text: H })) + ).prop("name", this.name + "_labelY").position((H, q, Z) => new Vector3(e[0] - 0.05, i(H.text) - p / 2, o[0])).props(Zi({}, F, this.options.labelProperties)); + c.y = U; + } + if (((R = this.options.scale) == null ? void 0 : R.z) != null) { + let M; + if (((x = this.options.labelTicks) == null ? void 0 : x.z) != null) + M = this.options.labelTicks.z; else try { - T = a.ticks(); + M = a.ticks(); } catch { - T = l; + M = l; } new Vector3(0, 0, 0); - let R; - ((C = this.options.labelFormat) == null ? void 0 : C.z) != null ? R = { text: (M) => { - var N; - return (N = this.options.labelFormat) == null ? void 0 : N.z(M.text); - }, size: this.scales.size * h, atlas: this.options.atlas } : R = { text: (M) => M.text, size: this.scales.size * h, atlas: this.options.atlas }; - let x = { "rotation.y": -Math.PI / 2 }, S = this.CoT.bind( + let N; + ((S = this.options.labelFormat) == null ? void 0 : S.z) != null ? N = { text: (H) => { + var q; + return (q = this.options.labelFormat) == null ? void 0 : q.z(H.text); + }, size: p, atlas: this.options.atlas } : N = { text: (H) => H.text, size: p, atlas: this.options.atlas }; + let F = { "rotation.y": -Math.PI / 2 }, U = this.CoT.bind( "planeText", - Zi({}, R, this.options.labelOptions), - T.map((M) => ({ text: M })) - ).prop("name", this.name + "_labelZ").position((M, N, F) => { - let L = N.getChildMeshes()[0].getBoundingInfo().boundingBox; - return new Vector3(e[1] + L.center.y * 1.5, r[0] - L.center.y * 1.5, a(M.text)); - }).props(Zi({}, x, this.options.labelProperties)); - c.z = S; + Zi({}, N, this.options.labelOptions), + M.map((H) => ({ text: H })) + ).prop("name", this.name + "_labelZ").position((H, q, Z) => new Vector3(e[1], r[0] - p, a(H.text))).props(Zi({}, F, this.options.labelProperties)); + c.z = U; } return c; } -function D2() { +function N2() { var r, s, a, o, l, c; this.scales.x.scale; let n4 = this.scales.x.range; @@ -74363,7 +74355,7 @@ function D2() { } return i; } -function N2() { +function F2() { var p, g, m, v, E, C; let n4 = this.scales.x.scale, e = this.scales.x.range, t = this.scales.x.domain, i = this.scales.y.scale, r = this.scales.y.range, s = this.scales.y.domain, a = this.scales.z.scale, o = this.scales.z.range, l = this.scales.z.domain, c = []; if (((p = this.options.scale) == null ? void 0 : p.x) != null) { @@ -74430,7 +74422,7 @@ function N2() { }; return this.CoT.bind("lineSystem", Zi({}, u, this.options.gridOptions)).props(Zi({}, f, this.options.gridProperties)); } -function F2() { +function L2() { var l, c, h; this.scales.x.scale; let n4 = this.scales.x.range; @@ -74461,18 +74453,18 @@ function F2() { this.scene ); a.parent = this.CoT.selected[0]; - let o = new Jt([a], this.scene); + let o = new qt([a], this.scene); return o.prop("name", this.name + "_domain"), o; } -var L2 = class { +var w2 = class { constructor(e, t, i = {}) { - this.setDomain = F2, this.setBackground = D2, this.setGrid = N2, this.setLabel = O2, this.name = e, this.options = i, this.scene = t, this.CoT = this.setCoT(), this.scales = this.setScales(), this.domain = this.options.domain ? this.setDomain() : new Jt([], t), this.background = this.options.background ? this.setBackground() : {}, this.grid = this.options.grid ? this.setGrid() : new Jt([], t), this.label = this.options.label ? this.setLabel() : {}; + this.setDomain = L2, this.setBackground = N2, this.setGrid = F2, this.setLabel = D2, this.name = e, this.options = i, this.scene = t, this.CoT = this.setCoT(), this.scales = this.setScales(), this.domain = this.options.domain ? this.setDomain() : new qt([], t), this.background = this.options.background ? this.setBackground() : {}, this.grid = this.options.grid ? this.setGrid() : new qt([], t), this.label = this.options.label ? this.setLabel() : {}; } setCoT() { let e; if (this.options.parent === void 0) { let t = new TransformNode(this.name + "CoT", this.scene); - e = new Jt([t], this.scene); + e = new qt([t], this.scene); } else e = this.options.parent.bind("cot").prop("name", this.name + "CoT"); return e; @@ -74504,7 +74496,7 @@ var L2 = class { }; } }; -function Sk(n4, e, t) { +function yk(n4, e, t) { const i = { scale: t.scale, parent: t.parent || void 0, @@ -74525,9 +74517,9 @@ function Sk(n4, e, t) { labelFormat: t.labelFormat || {}, atlas: t.atlas || new Texture(S_, e) }; - return new L2(n4, e, i); + return new w2(n4, e, i); } -var dn = class { +var pn = class { /** * @param {string} type Type. */ @@ -74558,7 +74550,7 @@ var bo = { */ PROPERTYCHANGE: "propertychange" }; -var zf = class { +var Wf = class { constructor() { this.disposed = false; } @@ -74575,10 +74567,10 @@ var zf = class { disposeInternal() { } }; -function Wf(n4, e) { +function Gf(n4, e) { return n4 > e ? 1 : n4 < e ? -1 : 0; } -function Gf(n4, e, t) { +function Xf(n4, e, t) { if (n4[0] <= e) return 0; const i = n4.length; @@ -74614,7 +74606,7 @@ function Gf(n4, e, t) { } return i - 1; } -function w2(n4, e) { +function U2(n4, e) { const t = Array.isArray(e) ? e : [e], i = t.length; for (let r = 0; r < i; r++) n4[n4.length] = t[r]; @@ -74628,8 +74620,8 @@ function Qc(n4, e) { return false; return true; } -function U2(n4, e, t) { - const i = e || Wf; +function V2(n4, e, t) { + const i = e || Gf; return n4.every(function(r, s) { if (s === 0) return true; @@ -74645,7 +74637,7 @@ function Jc() { } function fc() { } -function V2(n4) { +function B2(n4) { let e = false, t, i, r; return function() { const s = Array.prototype.slice.call(arguments); @@ -74656,13 +74648,13 @@ function $c(n4) { for (const e in n4) delete n4[e]; } -function B2(n4) { +function k2(n4) { let e; for (e in n4) return false; return !e; } -var Xf = class extends zf { +var Hf = class extends Wf { /** * @param {*} [target] Default event target for dispatched events. */ @@ -74693,7 +74685,7 @@ var Xf = class extends zf { const t = typeof e == "string", i = t ? e : e.type, r = this.listeners_ && this.listeners_[i]; if (!r) return; - const s = t ? new dn(e) : ( + const s = t ? new pn(e) : ( /** @type {Event} */ e ); @@ -74801,7 +74793,7 @@ function dc(n4, e, t, i) { function Ei(n4) { n4 && n4.target && (n4.target.removeEventListener(n4.type, n4.listener), $c(n4)); } -var jo = class extends Xf { +var jo = class extends Hf { constructor() { super(), this.on = /** @type {ObservableOnSignature} */ this.onInternal, this.once = /** @type {ObservableOnSignature} */ @@ -74878,7 +74870,7 @@ var jo = class extends Xf { t.ol_key ); if (i) - k2(i); + z2(i); else if (Array.isArray(e)) for (let r = 0, s = e.length; r < s; ++r) this.removeEventListener(e[r], t); @@ -74889,7 +74881,7 @@ var jo = class extends Xf { jo.prototype.on; jo.prototype.once; jo.prototype.un; -function k2(n4) { +function z2(n4) { if (Array.isArray(n4)) for (let e = 0, t = n4.length; e < t; ++e) Ei(n4[e]); @@ -74902,11 +74894,11 @@ function k2(n4) { function di() { throw new Error("Unimplemented abstract method."); } -var z2 = 0; -function ur(n4) { - return n4.ol_uid || (n4.ol_uid = String(++z2)); +var W2 = 0; +function fr(n4) { + return n4.ol_uid || (n4.ol_uid = String(++W2)); } -var cm = class extends dn { +var hm = class extends pn { /** * @param {string} type The event type. * @param {string} key The property name. @@ -74921,7 +74913,7 @@ var Ws = class extends jo { * @param {Object} [values] An object with key-value pairs. */ constructor(e) { - super(), this.on, this.once, this.un, ur(this), this.values_ = null, e !== void 0 && this.setProperties(e); + super(), this.on, this.once, this.un, fr(this), this.values_ = null, e !== void 0 && this.setProperties(e); } /** * Gets a value. @@ -74961,7 +74953,7 @@ var Ws = class extends jo { */ notify(e, t) { let i; - i = `change:${e}`, this.hasListener(i) && this.dispatchEvent(new cm(i, e, t)), i = bo.PROPERTYCHANGE, this.hasListener(i) && this.dispatchEvent(new cm(i, e, t)); + i = `change:${e}`, this.hasListener(i) && this.dispatchEvent(new hm(i, e, t)), i = bo.PROPERTYCHANGE, this.hasListener(i) && this.dispatchEvent(new hm(i, e, t)); } /** * @param {string} key Key name. @@ -75021,11 +75013,11 @@ var Ws = class extends jo { unset(e, t) { if (this.values_ && e in this.values_) { const i = this.values_[e]; - delete this.values_[e], B2(this.values_) && (this.values_ = null), t || this.notify(e, i); + delete this.values_[e], k2(this.values_) && (this.values_ = null), t || this.notify(e, i); } } }; -var W2 = { +var G2 = { 1: "The view center is not defined", 2: "The view resolution is not defined", 3: "The view rotation is not defined", @@ -75089,7 +75081,7 @@ var TE = class extends Error { * @param {number} code Error code. */ constructor(e) { - const t = W2[e]; + const t = G2[e]; super(t), this.code = e, this.name = "AssertionError", this.message = t; } }; @@ -75107,10 +75099,10 @@ var Dr = { */ REMOVE: "remove" }; -var hm = { +var um = { LENGTH: "length" }; -var vl = class extends dn { +var vl = class extends pn { /** * @param {import("./CollectionEventType.js").default} type Type. * @param {T} element Element. @@ -75190,7 +75182,7 @@ var Us = class extends Ws { * @api */ getLength() { - return this.get(hm.LENGTH); + return this.get(um.LENGTH); } /** * Insert an element at the provided index. @@ -75281,7 +75273,7 @@ var Us = class extends Ws { * @private */ updateLength_() { - this.set(hm.LENGTH, this.array_.length); + this.set(um.LENGTH, this.array_.length); } /** * @private @@ -75294,15 +75286,15 @@ var Us = class extends Ws { throw new TE(58); } }; -var ln = typeof navigator < "u" && typeof navigator.userAgent < "u" ? navigator.userAgent.toLowerCase() : ""; -var G2 = ln.includes("firefox"); -var X2 = ln.includes("safari") && !ln.includes("chrom"); -X2 && (ln.includes("version/15.4") || /cpu (os|iphone os) 15_4 like mac os x/.test(ln)); -var H2 = ln.includes("webkit") && !ln.includes("edge"); -var xE = ln.includes("macintosh"); +var cn = typeof navigator < "u" && typeof navigator.userAgent < "u" ? navigator.userAgent.toLowerCase() : ""; +var X2 = cn.includes("firefox"); +var H2 = cn.includes("safari") && !cn.includes("chrom"); +H2 && (cn.includes("version/15.4") || /cpu (os|iphone os) 15_4 like mac os x/.test(cn)); +var K2 = cn.includes("webkit") && !cn.includes("edge"); +var xE = cn.includes("macintosh"); var CE = typeof devicePixelRatio < "u" ? devicePixelRatio : 1; var RE = typeof WorkerGlobalScope < "u" && typeof OffscreenCanvas < "u" && self instanceof WorkerGlobalScope; -var K2 = typeof Image < "u" && Image.prototype.decode; +var q2 = typeof Image < "u" && Image.prototype.decode; var SE = function() { let n4 = false; try { @@ -75333,20 +75325,20 @@ function Ao(n4, e, t, i, r, s, a, o) { return n4[0] = i * c, n4[1] = r * l, n4[2] = -i * l, n4[3] = r * c, n4[4] = a * i * c - o * i * l + e, n4[5] = a * r * l + o * r * c + t, n4; } function yE(n4, e) { - const t = q2(e); + const t = Y2(e); Kt(t !== 0, 32); const i = e[0], r = e[1], s = e[2], a = e[3], o = e[4], l = e[5]; return n4[0] = a / t, n4[1] = -r / t, n4[2] = -s / t, n4[3] = i / t, n4[4] = (s * l - a * o) / t, n4[5] = -(i * l - r * o) / t, n4; } -function q2(n4) { +function Y2(n4) { return n4[0] * n4[3] - n4[1] * n4[2]; } -var um; -function Y2(n4) { +var fm; +function Z2(n4) { const e = "matrix(" + n4.join(", ") + ")"; if (RE) return e; - const t = um || (um = document.createElement("div")); + const t = fm || (fm = document.createElement("div")); return t.style.transform = e, t.style.transform; } var Gi = { @@ -75357,33 +75349,33 @@ var Gi = { BELOW: 8, LEFT: 16 }; -function fm(n4) { +function dm(n4) { const e = Vn(); for (let t = 0, i = n4.length; t < i; ++t) Kl(e, n4[t]); return e; } -function Z2(n4, e, t) { +function j2(n4, e, t) { const i = Math.min.apply(null, n4), r = Math.min.apply(null, e), s = Math.max.apply(null, n4), a = Math.max.apply(null, e); return Ha(i, r, s, a, t); } -function j2(n4, e) { +function Q2(n4, e) { return e ? (e[0] = n4[0], e[1] = n4[1], e[2] = n4[2], e[3] = n4[3], e) : n4.slice(); } function IE(n4, e, t) { let i, r; return e < n4[0] ? i = n4[0] - e : n4[2] < e ? i = e - n4[2] : i = 0, t < n4[1] ? r = n4[1] - t : n4[3] < t ? r = t - n4[3] : r = 0, i * i + r * r; } -function Hf(n4, e) { +function Kf(n4, e) { return bE(n4, e[0], e[1]); } -function Q2(n4, e) { +function J2(n4, e) { return n4[0] <= e[0] && e[2] <= n4[2] && n4[1] <= e[1] && e[3] <= n4[3]; } function bE(n4, e, t) { return n4[0] <= e && e <= n4[2] && n4[1] <= t && t <= n4[3]; } -function dm(n4, e) { +function pm(n4, e) { const t = n4[0], i = n4[1], r = n4[2], s = n4[3], a = e[0], o = e[1]; let l = Gi.UNKNOWN; return a < t ? l = l | Gi.LEFT : a > r && (l = l | Gi.RIGHT), o < i ? l = l | Gi.BELOW : o > s && (l = l | Gi.ABOVE), l === Gi.UNKNOWN && (l = Gi.INTERSECTING), l; @@ -75397,18 +75389,18 @@ function Ha(n4, e, t, i, r) { function Qo(n4) { return Ha(1 / 0, 1 / 0, -1 / 0, -1 / 0, n4); } -function J2(n4, e) { +function $2(n4, e) { const t = n4[0], i = n4[1]; return Ha(t, i, t, i, e); } -function $2(n4, e, t, i, r) { +function ew(n4, e, t, i, r) { const s = Qo(r); return AE(s, n4, e, t, i); } function Cu(n4, e) { return n4[0] == e[0] && n4[2] == e[2] && n4[1] == e[1] && n4[3] == e[3]; } -function ew(n4, e) { +function tw(n4, e) { return e[0] < n4[0] && (n4[0] = e[0]), e[2] > n4[2] && (n4[2] = e[2]), e[1] < n4[1] && (n4[1] = e[1]), e[3] > n4[3] && (n4[3] = e[3]), n4; } function Kl(n4, e) { @@ -75416,10 +75408,10 @@ function Kl(n4, e) { } function AE(n4, e, t, i, r) { for (; t < i; t += r) - tw(n4, e[t], e[t + 1]); + iw(n4, e[t], e[t + 1]); return n4; } -function tw(n4, e, t) { +function iw(n4, e, t) { n4[0] = Math.min(n4[0], e), n4[1] = Math.min(n4[1], t), n4[2] = Math.max(n4[2], e), n4[3] = Math.max(n4[3], t); } function ME(n4, e) { @@ -75439,7 +75431,7 @@ function th(n4) { function Mo(n4) { return [(n4[0] + n4[2]) / 2, (n4[1] + n4[3]) / 2]; } -function iw(n4, e) { +function rw(n4, e) { let t; return e === "bottom-left" ? t = eh(n4) : e === "bottom-right" ? t = th(n4) : e === "top-left" ? t = Bn(n4) : e === "top-right" ? t = ih(n4) : Kt(false, 13), t; } @@ -75495,12 +75487,12 @@ function Jo(n4, e) { function $o(n4) { return n4[2] < n4[0] || n4[3] < n4[1]; } -function rw(n4, e) { +function sw(n4, e) { return e ? (e[0] = n4[0], e[1] = n4[1], e[2] = n4[2], e[3] = n4[3], e) : n4; } -function sw(n4, e, t) { +function nw(n4, e, t) { let i = false; - const r = dm(n4, e), s = dm(n4, t); + const r = pm(n4, e), s = pm(n4, t); if (r === Gi.INTERSECTING || s === Gi.INTERSECTING) i = true; else { @@ -75510,7 +75502,7 @@ function sw(n4, e, t) { } return i; } -function nw(n4, e, t, i) { +function aw(n4, e, t, i) { if ($o(n4)) return Qo(t); let r = []; @@ -75542,12 +75534,12 @@ function nw(n4, e, t, i) { const s = [], a = []; for (let o = 0, l = r.length; o < l; o += 2) s.push(r[o]), a.push(r[o + 1]); - return Z2(s, a, t); + return j2(s, a, t); } function Vi(n4, e, t) { return Math.min(Math.max(n4, e), t); } -function aw(n4, e, t, i, r, s) { +function ow(n4, e, t, i, r, s) { const a = r - t, o = s - i; if (a !== 0 || o !== 0) { const l = ((n4 - t) * a + (e - i) * o) / (a * a + o * o); @@ -75559,7 +75551,7 @@ function Ca(n4, e, t, i) { const r = t - n4, s = i - e; return r * r + s * s; } -function ow(n4) { +function lw(n4) { const e = n4.length; for (let i = 0; i < e; i++) { let r = i, s = Math.abs(n4[i][i]); @@ -75592,7 +75584,7 @@ function Ra(n4, e) { const t = n4 % e; return t * e < 0 ? t + e : t; } -function lw(n4, e, t) { +function cw(n4, e, t) { return n4 + t * (e - n4); } function PE(n4, e) { @@ -75605,12 +75597,12 @@ function Tl(n4, e) { function xl(n4, e) { return Math.ceil(PE(n4, e)); } -var cw = /^#([a-f0-9]{3}|[a-f0-9]{4}(?:[a-f0-9]{2}){0,2})$/i; -var hw = /^([a-z]*)$|^hsla?\(.*\)$/i; -function uw(n4) { - return typeof n4 == "string" ? n4 : gw(n4); -} +var hw = /^#([a-f0-9]{3}|[a-f0-9]{4}(?:[a-f0-9]{2}){0,2})$/i; +var uw = /^([a-z]*)$|^hsla?\(.*\)$/i; function fw(n4) { + return typeof n4 == "string" ? n4 : mw(n4); +} +function dw(n4) { const e = document.createElement("div"); if (e.style.color = n4, e.style.color !== "") { document.body.appendChild(e); @@ -75619,7 +75611,7 @@ function fw(n4) { } return ""; } -var dw = /* @__PURE__ */ function() { +var pw = /* @__PURE__ */ function() { const e = {}; let t = 0; return ( @@ -75637,31 +75629,31 @@ var dw = /* @__PURE__ */ function() { for (const a in e) s++ & 3 || (delete e[a], --t); } - r = pw(i), e[i] = r, ++t; + r = gw(i), e[i] = r, ++t; } return r; } ); }(); -function pm(n4) { - return Array.isArray(n4) ? n4 : dw(n4); +function gm(n4) { + return Array.isArray(n4) ? n4 : pw(n4); } -function pw(n4) { +function gw(n4) { let e, t, i, r, s; - if (hw.exec(n4) && (n4 = fw(n4)), cw.exec(n4)) { + if (uw.exec(n4) && (n4 = dw(n4)), hw.exec(n4)) { const a = n4.length - 1; let o; a <= 4 ? o = 1 : o = 2; const l = a === 4 || a === 8; e = parseInt(n4.substr(1 + 0 * o, o), 16), t = parseInt(n4.substr(1 + 1 * o, o), 16), i = parseInt(n4.substr(1 + 2 * o, o), 16), l ? r = parseInt(n4.substr(1 + 3 * o, o), 16) : r = 255, o == 1 && (e = (e << 4) + e, t = (t << 4) + t, i = (i << 4) + i, l && (r = (r << 4) + r)), s = [e, t, i, r / 255]; } else - n4.startsWith("rgba(") ? (s = n4.slice(5, -1).split(",").map(Number), gm(s)) : n4.startsWith("rgb(") ? (s = n4.slice(4, -1).split(",").map(Number), s.push(1), gm(s)) : Kt(false, 14); + n4.startsWith("rgba(") ? (s = n4.slice(5, -1).split(",").map(Number), mm(s)) : n4.startsWith("rgb(") ? (s = n4.slice(4, -1).split(",").map(Number), s.push(1), mm(s)) : Kt(false, 14); return s; } -function gm(n4) { +function mm(n4) { return n4[0] = Vi(n4[0] + 0.5 | 0, 0, 255), n4[1] = Vi(n4[1] + 0.5 | 0, 0, 255), n4[2] = Vi(n4[2] + 0.5 | 0, 0, 255), n4[3] = Vi(n4[3], 0, 1), n4; } -function gw(n4) { +function mw(n4) { let e = n4[0]; e != (e | 0) && (e = e + 0.5 | 0); let t = n4[1]; @@ -75671,7 +75663,7 @@ function gw(n4) { const r = n4[3] === void 0 ? 1 : Math.round(n4[3] * 100) / 100; return "rgba(" + e + "," + t + "," + i + "," + r + ")"; } -var mw = class { +var _w = class { constructor() { this.cache_ = {}, this.cacheSize_ = 0, this.maxCacheSize_ = 32; } @@ -75706,7 +75698,7 @@ var mw = class { * @return {import("./IconImage.js").default} Icon image. */ get(e, t, i) { - const r = mm(e, t, i); + const r = _m(e, t, i); return r in this.cache_ ? this.cache_[r] : null; } /** @@ -75716,7 +75708,7 @@ var mw = class { * @param {import("./IconImage.js").default} iconImage Icon image. */ set(e, t, i, r) { - const s = mm(e, t, i); + const s = _m(e, t, i); this.cache_[s] = r, ++this.cacheSize_; } /** @@ -75730,11 +75722,11 @@ var mw = class { this.maxCacheSize_ = e, this.expire(); } }; -function mm(n4, e, t) { - const i = t ? uw(t) : "null"; +function _m(n4, e, t) { + const i = t ? fw(t) : "null"; return e + ":" + n4 + ":" + i; } -var OE = new mw(); +var OE = new _w(); var Gt = { OPACITY: "opacity", VISIBLE: "visible", @@ -76042,13 +76034,13 @@ var Mr = { ANIMATING: 0, INTERACTING: 1 }; -var Gr = { +var Xr = { CENTER: "center", RESOLUTION: "resolution", ROTATION: "rotation" }; -var _w = 42; -var Kf = 256; +var Ew = 42; +var qf = 256; var Po = { // use the radius of the Normal sphere radians: 6370997 / (2 * Math.PI), @@ -76192,8 +76184,8 @@ var NE = class { }; var el = 6378137; var ca = Math.PI * el; -var Ew = [-ca, -ca, ca, ca]; -var vw = [-180, -85, 180, 85]; +var vw = [-ca, -ca, ca, ca]; +var Tw = [-180, -85, 180, 85]; var Cl = el * Math.log(Math.tan(Math.PI / 2)); var ea = class extends NE { /** @@ -76203,16 +76195,16 @@ var ea = class extends NE { super({ code: e, units: "m", - extent: Ew, + extent: vw, global: true, - worldExtent: vw, + worldExtent: Tw, getPointResolution: function(t, i) { return t / Math.cosh(i[1] / el); } }); } }; -var _m = [ +var Em = [ new ea("EPSG:3857"), new ea("EPSG:102100"), new ea("EPSG:102113"), @@ -76220,7 +76212,7 @@ var _m = [ new ea("http://www.opengis.net/def/crs/EPSG/0/3857"), new ea("http://www.opengis.net/gml/srs/epsg.xml#3857") ]; -function Tw(n4, e, t) { +function xw(n4, e, t) { const i = n4.length; t = t > 1 ? t : 2, e === void 0 && (t > 2 ? e = n4.slice() : e = new Array(i)); for (let r = 0; r < i; r += t) { @@ -76230,17 +76222,17 @@ function Tw(n4, e, t) { } return e; } -function xw(n4, e, t) { +function Cw(n4, e, t) { const i = n4.length; t = t > 1 ? t : 2, e === void 0 && (t > 2 ? e = n4.slice() : e = new Array(i)); for (let r = 0; r < i; r += t) e[r] = 180 * n4[r] / ca, e[r + 1] = 360 * Math.atan(Math.exp(n4[r + 1] / el)) / Math.PI - 90; return e; } -var Cw = 6378137; -var Em = [-180, -90, 180, 90]; -var Rw = Math.PI * Cw / 180; -var vn = class extends NE { +var Rw = 6378137; +var vm = [-180, -90, 180, 90]; +var Sw = Math.PI * Rw / 180; +var Tn = class extends NE { /** * @param {string} code Code. * @param {string} [axisOrientation] Axis orientation. @@ -76249,28 +76241,28 @@ var vn = class extends NE { super({ code: e, units: "degrees", - extent: Em, + extent: vm, axisOrientation: t, global: true, - metersPerUnit: Rw, - worldExtent: Em + metersPerUnit: Sw, + worldExtent: vm }); } }; -var vm = [ - new vn("CRS:84"), - new vn("EPSG:4326", "neu"), - new vn("urn:ogc:def:crs:OGC:1.3:CRS84"), - new vn("urn:ogc:def:crs:OGC:2:84"), - new vn("http://www.opengis.net/def/crs/OGC/1.3/CRS84"), - new vn("http://www.opengis.net/gml/srs/epsg.xml#4326", "neu"), - new vn("http://www.opengis.net/def/crs/EPSG/0/4326", "neu") +var Tm = [ + new Tn("CRS:84"), + new Tn("EPSG:4326", "neu"), + new Tn("urn:ogc:def:crs:OGC:1.3:CRS84"), + new Tn("urn:ogc:def:crs:OGC:2:84"), + new Tn("http://www.opengis.net/def/crs/OGC/1.3/CRS84"), + new Tn("http://www.opengis.net/gml/srs/epsg.xml#4326", "neu"), + new Tn("http://www.opengis.net/def/crs/EPSG/0/4326", "neu") ]; var Iu = {}; -function Sw(n4) { +function yw(n4) { return Iu[n4] || Iu[n4.replace(/urn:(x-)?ogc:def:crs:EPSG:(.*:)?(\w+)$/, "EPSG:$3")] || null; } -function yw(n4, e) { +function Iw(n4, e) { Iu[n4] = e; } var Sa = {}; @@ -76278,11 +76270,11 @@ function pc(n4, e, t) { const i = n4.getCode(), r = e.getCode(); i in Sa || (Sa[i] = {}), Sa[i][r] = t; } -function Iw(n4, e) { +function bw(n4, e) { let t; return n4 in Sa && e in Sa[n4] && (t = Sa[n4][e]), t; } -function bw(n4, e) { +function Aw(n4, e) { return n4[0] += +e[0], n4[1] += +e[1], n4; } function gc(n4, e) { @@ -76294,30 +76286,30 @@ function gc(n4, e) { } return t; } -function qf(n4, e) { +function Yf(n4, e) { const t = Math.cos(e), i = Math.sin(e), r = n4[0] * t - n4[1] * i, s = n4[1] * t + n4[0] * i; return n4[0] = r, n4[1] = s, n4; } -function Aw(n4, e) { +function Mw(n4, e) { return n4[0] *= e, n4[1] *= e, n4; } -function Mw(n4, e) { +function Pw(n4, e) { if (e.canWrapX()) { - const t = Ui(e.getExtent()), i = Pw(n4, e, t); + const t = Ui(e.getExtent()), i = Ow(n4, e, t); i && (n4[0] -= i * t); } return n4; } -function Pw(n4, e, t) { +function Ow(n4, e, t) { const i = e.getExtent(); let r = 0; return e.canWrapX() && (n4[0] < i[0] || n4[0] > i[2]) && (t = t || Ui(i), r = Math.floor( (n4[0] - i[0]) / t )), r; } -var Ow = 63710088e-1; -function Tm(n4, e, t) { - t = t || Ow; +var Dw = 63710088e-1; +function xm(n4, e, t) { + t = t || Dw; const i = ql(n4[1]), r = ql(e[1]), s = (r - i) / 2, a = ql(e[0] - n4[0]) / 2, o = Math.sin(s) * Math.sin(s) + Math.sin(a) * Math.sin(a) * Math.cos(i) * Math.cos(r); return 2 * t * Math.atan2(Math.sqrt(o), Math.sqrt(1 - o)); } @@ -76325,10 +76317,10 @@ function FE(...n4) { console.warn(...n4); } var bu = true; -function Dw(n4) { +function Nw(n4) { bu = !(n4 === void 0 ? true : n4); } -function Yf(n4, e) { +function Zf(n4, e) { if (e !== void 0) { for (let t = 0, i = n4.length; t < i; ++t) e[t] = n4[t]; @@ -76345,14 +76337,14 @@ function LE(n4, e) { } return n4; } -function Nw(n4) { - yw(n4.getCode(), n4), pc(n4, n4, Yf); -} function Fw(n4) { - n4.forEach(Nw); + Iw(n4.getCode(), n4), pc(n4, n4, Zf); +} +function Lw(n4) { + n4.forEach(Fw); } -function Fr(n4) { - return typeof n4 == "string" ? Sw( +function Lr(n4) { + return typeof n4 == "string" ? yw( /** @type {string} */ n4 ) : ( @@ -76360,8 +76352,8 @@ function Fr(n4) { n4 || null ); } -function xm(n4, e, t, i) { - n4 = Fr(n4); +function Cm(n4, e, t, i) { + n4 = Lr(n4); let r; const s = n4.getPointResolutionFunc(); if (s) { @@ -76374,9 +76366,9 @@ function xm(n4, e, t, i) { if (a == "degrees" && !i || i == "degrees") r = e; else { - const o = jf( + const o = Qf( n4, - Fr("EPSG:4326") + Lr("EPSG:4326") ); if (o === LE && a !== "degrees") r = e * n4.getMetersPerUnit(); @@ -76392,7 +76384,7 @@ function xm(n4, e, t, i) { t[1] + e / 2 ]; c = o(c, c, 2); - const h = Tm(c.slice(0, 2), c.slice(2, 4)), u = Tm(c.slice(4, 6), c.slice(6, 8)); + const h = xm(c.slice(0, 2), c.slice(2, 4)), u = xm(c.slice(4, 6), c.slice(6, 8)); r = (h + u) / 2; } const l = i ? Po[i] : n4.getMetersPerUnit(); @@ -76401,82 +76393,82 @@ function xm(n4, e, t, i) { } return r; } -function Cm(n4) { - Fw(n4), n4.forEach(function(e) { +function Rm(n4) { + Lw(n4), n4.forEach(function(e) { n4.forEach(function(t) { - e !== t && pc(e, t, Yf); + e !== t && pc(e, t, Zf); }); }); } -function Lw(n4, e, t, i) { +function ww(n4, e, t, i) { n4.forEach(function(r) { e.forEach(function(s) { pc(r, s, t), pc(s, r, i); }); }); } -function Zf(n4, e) { - return n4 ? typeof n4 == "string" ? Fr(n4) : ( +function jf(n4, e) { + return n4 ? typeof n4 == "string" ? Lr(n4) : ( /** @type {Projection} */ n4 - ) : Fr(e); + ) : Lr(e); } function aa(n4, e) { if (n4 === e) return true; const t = n4.getUnits() === e.getUnits(); - return (n4.getCode() === e.getCode() || jf(n4, e) === Yf) && t; + return (n4.getCode() === e.getCode() || Qf(n4, e) === Zf) && t; } -function jf(n4, e) { +function Qf(n4, e) { const t = n4.getCode(), i = e.getCode(); - let r = Iw(t, i); + let r = bw(t, i); return r || (r = LE), r; } function Oo(n4, e) { - const t = Fr(n4), i = Fr(e); - return jf(t, i); + const t = Lr(n4), i = Lr(e); + return Qf(t, i); } -function Qf(n4, e, t) { +function Jf(n4, e, t) { return Oo(e, t)(n4, void 0, n4.length); } function wE(n4, e, t, i) { const r = Oo(e, t); - return nw(n4, r, void 0, i); + return aw(n4, r, void 0, i); } var ms = null; -function ww(n4) { - ms = Fr(n4); +function Uw(n4) { + ms = Lr(n4); } -function Uw() { +function Vw() { return ms; } -function Vw() { - ww("EPSG:4326"); +function Bw() { + Uw("EPSG:4326"); } function Au(n4, e) { - return ms ? Qf(n4, e, ms) : n4; + return ms ? Jf(n4, e, ms) : n4; } function Ps(n4, e) { - return ms ? Qf(n4, ms, e) : (bu && !gc(n4, [0, 0]) && n4[0] >= -180 && n4[0] <= 180 && n4[1] >= -90 && n4[1] <= 90 && (bu = false, FE( + return ms ? Jf(n4, ms, e) : (bu && !gc(n4, [0, 0]) && n4[0] >= -180 && n4[0] <= 180 && n4[1] >= -90 && n4[1] <= 90 && (bu = false, FE( "Call useGeographic() from ol/proj once to work with [longitude, latitude] coordinates." )), n4); } -function Bw(n4, e) { +function kw(n4, e) { return ms ? wE(n4, e, ms) : n4; } function ha(n4, e) { return ms ? wE(n4, ms, e) : n4; } -function kw() { - Cm(_m), Cm(vm), Lw( - vm, - _m, - Tw, - xw +function zw() { + Rm(Em), Rm(Tm), ww( + Tm, + Em, + xw, + Cw ); } -kw(); -function Rm(n4, e, t) { +zw(); +function Sm(n4, e, t) { return ( /** * @param {import("./coordinate.js").Coordinate|undefined} center Center. @@ -76503,19 +76495,19 @@ function Rm(n4, e, t) { } ); } -function zw(n4) { +function Ww(n4) { return n4; } -function Jf(n4, e, t, i) { +function $f(n4, e, t, i) { const r = Ui(e) / t[0], s = gs(e) / t[1]; return i ? Math.min(n4, Math.max(r, s)) : Math.min(n4, Math.min(r, s)); } -function $f(n4, e, t) { +function ed(n4, e, t) { let i = Math.min(n4, e); const r = 50; return i *= Math.log(1 + r * Math.max(0, n4 / e - 1)) / r + 1, t && (i = Math.max(i, t), i /= Math.log(1 + r * Math.max(0, t / n4 - 1)) / r + 1), Vi(i, t / 2, e * 2); } -function Ww(n4, e, t, i) { +function Gw(n4, e, t, i) { return e = e !== void 0 ? e : true, /** * @param {number|undefined} resolution Resolution. * @param {number} direction Direction. @@ -76525,24 +76517,24 @@ function Ww(n4, e, t, i) { */ function(r, s, a, o) { if (r !== void 0) { - const l = n4[0], c = n4[n4.length - 1], h = t ? Jf( + const l = n4[0], c = n4[n4.length - 1], h = t ? $f( l, t, a, i ) : l; if (o) - return e ? $f( + return e ? ed( r, h, c ) : Vi(r, c, h); - const u = Math.min(h, r), f = Math.floor(Gf(n4, u, s)); + const u = Math.min(h, r), f = Math.floor(Xf(n4, u, s)); return n4[f] > h && f < n4.length - 1 ? n4[f + 1] : n4[f]; } }; } -function Gw(n4, e, t, i, r, s) { +function Xw(n4, e, t, i, r, s) { return i = i !== void 0 ? i : true, t = t !== void 0 ? t : 0, /** * @param {number|undefined} resolution Resolution. * @param {number} direction Direction. @@ -76552,14 +76544,14 @@ function Gw(n4, e, t, i, r, s) { */ function(a, o, l, c) { if (a !== void 0) { - const h = r ? Jf( + const h = r ? $f( e, r, l, s ) : e; if (c) - return i ? $f( + return i ? ed( a, h, t @@ -76573,7 +76565,7 @@ function Gw(n4, e, t, i, r, s) { } }; } -function Sm(n4, e, t, i, r) { +function ym(n4, e, t, i, r) { return t = t !== void 0 ? t : true, /** * @param {number|undefined} resolution Resolution. * @param {number} direction Direction. @@ -76583,13 +76575,13 @@ function Sm(n4, e, t, i, r) { */ function(s, a, o, l) { if (s !== void 0) { - const c = i ? Jf( + const c = i ? $f( n4, i, o, r ) : n4; - return !t || !l ? Vi(s, e, c) : $f( + return !t || !l ? Vi(s, e, c) : ed( s, c, e @@ -76597,15 +76589,15 @@ function Sm(n4, e, t, i, r) { } }; } -function ed(n4) { +function td(n4) { if (n4 !== void 0) return 0; } -function ym(n4) { +function Im(n4) { if (n4 !== void 0) return n4; } -function Xw(n4) { +function Hw(n4) { const e = 2 * Math.PI / n4; return ( /** @@ -76621,7 +76613,7 @@ function Xw(n4) { } ); } -function Hw(n4) { +function Kw(n4) { return n4 = n4 || ql(5), /** * @param {number|undefined} rotation Rotation. * @param {boolean} [isMoving] True if an interaction or animation is in progress. @@ -76640,13 +76632,13 @@ function UE(n4) { function Ka(n4) { return 1 - UE(1 - n4); } -function Kw(n4) { +function qw(n4) { return 3 * n4 * n4 - 2 * n4 * n4 * n4; } -function qw(n4) { +function Yw(n4) { return n4; } -function Yw(n4, e, t, i, r, s) { +function Zw(n4, e, t, i, r, s) { s = s || []; let a = 0; for (let o = e; o < t; o += i) { @@ -76655,7 +76647,7 @@ function Yw(n4, e, t, i, r, s) { } return s && s.length != a && (s.length = a), s; } -function Zw(n4, e, t, i, r, s, a) { +function jw(n4, e, t, i, r, s, a) { a = a || []; const o = Math.cos(r), l = Math.sin(r), c = s[0], h = s[1]; let u = 0; @@ -76667,7 +76659,7 @@ function Zw(n4, e, t, i, r, s, a) { } return a && a.length != u && (a.length = u), a; } -function jw(n4, e, t, i, r, s, a, o) { +function Qw(n4, e, t, i, r, s, a, o) { o = o || []; const l = a[0], c = a[1]; let h = 0; @@ -76679,7 +76671,7 @@ function jw(n4, e, t, i, r, s, a, o) { } return o && o.length != h && (o.length = h), o; } -function Qw(n4, e, t, i, r, s, a) { +function Jw(n4, e, t, i, r, s, a) { a = a || []; let o = 0; for (let l = e; l < t; l += i) { @@ -76689,10 +76681,10 @@ function Qw(n4, e, t, i, r, s, a) { } return a && a.length != o && (a.length = o), a; } -var Im = xa(); -var Jw = class extends Ws { +var bm = xa(); +var $w = class extends Ws { constructor() { - super(), this.extent_ = Vn(), this.extentRevision_ = -1, this.simplifiedGeometryMaxMinSquaredTolerance = 0, this.simplifiedGeometryRevision = 0, this.simplifyTransformedInternal = V2(function(e, t, i) { + super(), this.extent_ = Vn(), this.extentRevision_ = -1, this.simplifiedGeometryMaxMinSquaredTolerance = 0, this.simplifiedGeometryRevision = 0, this.simplifyTransformedInternal = B2(function(e, t, i) { if (!i) return this.getSimplifiedGeometry(t); const r = this.clone(); @@ -76782,7 +76774,7 @@ var Jw = class extends Ws { const t = this.computeExtent(this.extent_); (isNaN(t[0]) || isNaN(t[1])) && Qo(t), this.extentRevision_ = this.getRevision(); } - return rw(this.extent_, e); + return sw(this.extent_, e); } /** * Rotate the geometry around a given coordinate. This modifies the geometry @@ -76887,10 +76879,10 @@ var Jw = class extends Ws { * @api */ transform(e, t) { - const i = Fr(e), r = i.getUnits() == "tile-pixels" ? function(s, a, o) { + const i = Lr(e), r = i.getUnits() == "tile-pixels" ? function(s, a, o) { const l = i.getExtent(), c = i.getWorldExtent(), h = gs(c) / gs(l); return Ao( - Im, + bm, c[0], c[3], h, @@ -76898,12 +76890,12 @@ var Jw = class extends Ws { 0, 0, 0 - ), Yw( + ), Zw( s, 0, s.length, o, - Im, + bm, a ), Oo(i, t)( s, @@ -76914,7 +76906,7 @@ var Jw = class extends Ws { return this.applyTransform(r), this; } }; -var td = class extends Jw { +var id = class extends $w { constructor() { super(), this.layout = "XY", this.stride = 2, this.flatCoordinates = null; } @@ -76924,7 +76916,7 @@ var td = class extends Jw { * @return {import("../extent.js").Extent} extent Extent. */ computeExtent(e) { - return $2( + return ew( this.flatCoordinates, 0, this.flatCoordinates.length, @@ -77001,7 +76993,7 @@ var td = class extends Jw { * @param {Array} flatCoordinates Flat coordinates. */ setFlatCoordinates(e, t) { - this.stride = bm(e), this.layout = e, this.flatCoordinates = t; + this.stride = Am(e), this.layout = e, this.flatCoordinates = t; } /** * @abstract @@ -77020,7 +77012,7 @@ var td = class extends Jw { setLayout(e, t, i) { let r; if (e) - r = bm(e); + r = Am(e); else { for (let s = 0; s < i; ++s) { if (t.length === 0) { @@ -77030,7 +77022,7 @@ var td = class extends Jw { t = /** @type {Array} */ t[0]; } - r = t.length, e = $w(r); + r = t.length, e = eU(r); } this.layout = e, this.stride = r; } @@ -77057,7 +77049,7 @@ var td = class extends Jw { const i = this.getFlatCoordinates(); if (i) { const r = this.getStride(); - Zw( + jw( i, 0, i.length, @@ -77082,7 +77074,7 @@ var td = class extends Jw { const r = this.getFlatCoordinates(); if (r) { const s = this.getStride(); - jw( + Qw( r, 0, r.length, @@ -77105,7 +77097,7 @@ var td = class extends Jw { const i = this.getFlatCoordinates(); if (i) { const r = this.getStride(); - Qw( + Jw( i, 0, i.length, @@ -77117,17 +77109,17 @@ var td = class extends Jw { } } }; -function $w(n4) { +function eU(n4) { let e; return n4 == 2 ? e = "XY" : n4 == 3 ? e = "XYZ" : n4 == 4 && (e = "XYZM"), /** @type {import("./Geometry.js").GeometryLayout} */ e; } -function bm(n4) { +function Am(n4) { let e; return n4 == "XY" ? e = 2 : n4 == "XYZ" || n4 == "XYM" ? e = 3 : n4 == "XYZM" && (e = 4), /** @type {number} */ e; } -function Am(n4, e, t, i, r, s, a) { +function Mm(n4, e, t, i, r, s, a) { const o = n4[e], l = n4[e + 1], c = n4[t] - o, h = n4[t + 1] - l; let u; if (c === 0 && h === 0) @@ -77138,7 +77130,7 @@ function Am(n4, e, t, i, r, s, a) { u = t; else if (f > 0) { for (let d = 0; d < i; ++d) - a[d] = lw( + a[d] = cw( n4[e + d], n4[t + d], f @@ -77160,7 +77152,7 @@ function VE(n4, e, t, i, r) { } return r; } -function eU(n4, e, t, i, r) { +function tU(n4, e, t, i, r) { for (let s = 0, a = t.length; s < a; ++s) { const o = t[s]; r = VE(n4, e, o, i, r), e = o; @@ -77187,7 +77179,7 @@ function BE(n4, e, t, i, r, s, a, o, l, c, h) { h = h || [NaN, NaN]; let d = e + i; for (; d < t; ) - if (Am( + if (Mm( n4, d - i, d, @@ -77204,7 +77196,7 @@ function BE(n4, e, t, i, r, s, a, o, l, c, h) { (Math.sqrt(f) - Math.sqrt(c)) / r | 0, 1 ); - if (s && (Am( + if (s && (Mm( n4, t - i, e, @@ -77219,7 +77211,7 @@ function BE(n4, e, t, i, r, s, a, o, l, c, h) { } return c; } -function tU(n4, e, t, i, r, s, a, o, l, c, h) { +function iU(n4, e, t, i, r, s, a, o, l, c, h) { h = h || [NaN, NaN]; for (let u = 0, f = t.length; u < f; ++u) { const d = t[u]; @@ -77239,7 +77231,7 @@ function tU(n4, e, t, i, r, s, a, o, l, c, h) { } return c; } -function iU(n4, e, t, i) { +function rU(n4, e, t, i) { for (let r = 0, s = t.length; r < s; ++r) n4[e++] = t[r]; return e; @@ -77252,7 +77244,7 @@ function kE(n4, e, t, i) { } return e; } -function rU(n4, e, t, i, r) { +function sU(n4, e, t, i, r) { r = r || []; let s = 0; for (let a = 0, o = t.length; a < o; ++a) { @@ -77266,7 +77258,7 @@ function rU(n4, e, t, i, r) { } return r.length = s, r; } -function sU(n4, e, t, i, r, s, a) { +function nU(n4, e, t, i, r, s, a) { const o = (t - e) / i; if (o < 3) { for (; e < t; e += i) @@ -77282,7 +77274,7 @@ function sU(n4, e, t, i, r, s, a) { let d = 0; const p = n4[f], g = n4[f + 1], m = n4[u], v = n4[u + 1]; for (let E = f + i; E < u; E += i) { - const C = n4[E], T = n4[E + 1], R = aw(C, T, p, g, m, v); + const C = n4[E], T = n4[E + 1], R = ow(C, T, p, g, m, v); R > d && (h = E, d = R); } d > r && (l[(h - e) / i] = 1, f + i < h && c.push(f, h), h + i < u && c.push(h, u)); @@ -77294,7 +77286,7 @@ function sU(n4, e, t, i, r, s, a) { function ta(n4, e) { return e * Math.round(n4 / e); } -function nU(n4, e, t, i, r, s, a) { +function aU(n4, e, t, i, r, s, a) { if (e == t) return a; let o = ta(n4[e], r), l = ta(n4[e + 1], r); @@ -77317,10 +77309,10 @@ function nU(n4, e, t, i, r, s, a) { } return s[a++] = c, s[a++] = h, a; } -function aU(n4, e, t, i, r, s, a, o) { +function oU(n4, e, t, i, r, s, a, o) { for (let l = 0, c = t.length; l < c; ++l) { const h = t[l]; - a = nU( + a = aU( n4, e, h, @@ -77339,7 +77331,7 @@ function zE(n4, e, t, i, r) { r[s++] = n4.slice(a, a + i); return r.length = s, r; } -function oU(n4, e, t, i, r) { +function lU(n4, e, t, i, r) { r = r !== void 0 ? r : []; let s = 0; for (let a = 0, o = t.length; a < o; ++a) { @@ -77362,7 +77354,7 @@ function WE(n4, e, t, i) { } return r / 2; } -function lU(n4, e, t, i) { +function cU(n4, e, t, i) { let r = 0; for (let s = 0, a = t.length; s < a; ++s) { const o = t[s]; @@ -77370,7 +77362,7 @@ function lU(n4, e, t, i) { } return r; } -var Do = class _Do extends td { +var Do = class _Do extends id { /** * @param {Array|Array} coordinates Coordinates. * For internal use, flat coordinates in combination with `layout` are also accepted. @@ -77457,7 +77449,7 @@ var Do = class _Do extends td { */ getSimplifiedGeometryInternal(e) { const t = []; - return t.length = sU( + return t.length = nU( this.flatCoordinates, 0, this.flatCoordinates.length, @@ -77499,7 +77491,7 @@ var Do = class _Do extends td { ), this.changed(); } }; -var id = class _id extends td { +var rd = class _rd extends id { /** * @param {import("../coordinate.js").Coordinate} coordinates Coordinates. * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. @@ -77513,7 +77505,7 @@ var id = class _id extends td { * @api */ clone() { - const e = new _id(this.flatCoordinates.slice(), this.layout); + const e = new _rd(this.flatCoordinates.slice(), this.layout); return e.applyProperties(this), e; } /** @@ -77552,7 +77544,7 @@ var id = class _id extends td { * @return {import("../extent.js").Extent} extent Extent. */ computeExtent(e) { - return J2(this.flatCoordinates, e); + return $2(this.flatCoordinates, e); } /** * Get the type of this geometry. @@ -77577,7 +77569,7 @@ var id = class _id extends td { * @api */ setCoordinates(e, t) { - this.setLayout(t, e, 0), this.flatCoordinates || (this.flatCoordinates = []), this.flatCoordinates.length = iU( + this.setLayout(t, e, 0), this.flatCoordinates || (this.flatCoordinates = []), this.flatCoordinates.length = rU( this.flatCoordinates, 0, e, @@ -77585,7 +77577,7 @@ var id = class _id extends td { ), this.changed(); } }; -function cU(n4, e, t, i, r) { +function hU(n4, e, t, i, r) { return !ME( r, /** @@ -77593,7 +77585,7 @@ function cU(n4, e, t, i, r) { * @return {boolean} Contains (x, y). */ function(a) { - return !In( + return !bn( n4, e, t, @@ -77604,7 +77596,7 @@ function cU(n4, e, t, i, r) { } ); } -function In(n4, e, t, i, r, s) { +function bn(n4, e, t, i, r, s) { let a = 0, o = n4[t - i], l = n4[t - i + 1]; for (; e < t; e += i) { const c = n4[e], h = n4[e + 1]; @@ -77613,14 +77605,14 @@ function In(n4, e, t, i, r, s) { return a !== 0; } function GE(n4, e, t, i, r, s) { - if (t.length === 0 || !In(n4, e, t[0], i, r, s)) + if (t.length === 0 || !bn(n4, e, t[0], i, r, s)) return false; for (let a = 1, o = t.length; a < o; ++a) - if (In(n4, t[a - 1], t[a], i, r, s)) + if (bn(n4, t[a - 1], t[a], i, r, s)) return false; return true; } -function hU(n4, e, t, i, r, s, a) { +function uU(n4, e, t, i, r, s, a) { let o, l, c, h, u, f, d; const p = r[s + 1], g = []; for (let E = 0, C = t.length; E < C; ++E) { @@ -77629,14 +77621,14 @@ function hU(n4, e, t, i, r, s, a) { u = n4[o], d = n4[o + 1], (p <= f && d <= p || f <= p && p <= d) && (c = (p - f) / (d - f) * (u - h) + h, g.push(c)), h = u, f = d; } let m = NaN, v = -1 / 0; - for (g.sort(Wf), h = g[0], o = 1, l = g.length; o < l; ++o) { + for (g.sort(Gf), h = g[0], o = 1, l = g.length; o < l; ++o) { u = g[o]; const E = Math.abs(u - h); E > v && (c = (h + u) / 2, GE(n4, e, t, i, c, p) && (m = c, v = E)), h = u; } return isNaN(m) && (m = r[s]), a ? (a.push(m, p, v), a) : [m, p, v]; } -function uU(n4, e, t, i, r) { +function fU(n4, e, t, i, r) { let s; for (e += i; e < t; e += i) if (s = r( @@ -77654,7 +77646,7 @@ function XE(n4, e, t, i, r) { t, i ); - return Jo(r, s) ? Q2(r, s) || s[0] >= r[0] && s[2] <= r[2] || s[1] >= r[1] && s[3] <= r[3] ? true : uU( + return Jo(r, s) ? J2(r, s) || s[0] >= r[0] && s[2] <= r[2] || s[1] >= r[1] && s[3] <= r[3] ? true : fU( n4, e, t, @@ -77666,33 +77658,33 @@ function XE(n4, e, t, i, r) { * `false` otherwise. */ function(a, o) { - return sw(r, a, o); + return nw(r, a, o); } ) : false; } function HE(n4, e, t, i, r) { - return !!(XE(n4, e, t, i, r) || In( + return !!(XE(n4, e, t, i, r) || bn( n4, e, t, i, r[0], r[1] - ) || In( + ) || bn( n4, e, t, i, r[0], r[3] - ) || In( + ) || bn( n4, e, t, i, r[2], r[1] - ) || In( + ) || bn( n4, e, t, @@ -77701,13 +77693,13 @@ function HE(n4, e, t, i, r) { r[3] )); } -function fU(n4, e, t, i, r) { +function dU(n4, e, t, i, r) { if (!HE(n4, e, t[0], i, r)) return false; if (t.length === 1) return true; for (let s = 1, a = t.length; s < a; ++s) - if (cU( + if (hU( n4, t[s - 1], t[s], @@ -77723,7 +77715,7 @@ function fU(n4, e, t, i, r) { return false; return true; } -function dU(n4, e, t, i) { +function pU(n4, e, t, i) { for (; e < t - i; ) { for (let r = 0; r < i; ++r) { const s = n4[e + r]; @@ -77740,7 +77732,7 @@ function KE(n4, e, t, i) { } return r === 0 ? void 0 : r > 0; } -function pU(n4, e, t, i, r) { +function gU(n4, e, t, i, r) { r = r !== void 0 ? r : false; for (let s = 0, a = t.length; s < a; ++s) { const o = t[s], l = KE( @@ -77758,7 +77750,7 @@ function pU(n4, e, t, i, r) { } return true; } -function Mm(n4, e, t, i, r) { +function Pm(n4, e, t, i, r) { r = r !== void 0 ? r : false; for (let s = 0, a = t.length; s < a; ++s) { const o = t[s], l = KE( @@ -77767,11 +77759,11 @@ function Mm(n4, e, t, i, r) { o, i ); - (s === 0 ? r && l || !r && !l : r && !l || !r && l) && dU(n4, e, o, i), e = o; + (s === 0 ? r && l || !r && !l : r && !l || !r && l) && pU(n4, e, o, i), e = o; } return e; } -var No = class _No extends td { +var No = class _No extends id { /** * @param {!Array>|!Array} coordinates * Array of linear rings that define the polygon. The first linear ring of the @@ -77800,7 +77792,7 @@ var No = class _No extends td { * @api */ appendLinearRing(e) { - this.flatCoordinates ? w2(this.flatCoordinates, e.getFlatCoordinates()) : this.flatCoordinates = e.getFlatCoordinates().slice(), this.ends_.push(this.flatCoordinates.length), this.changed(); + this.flatCoordinates ? U2(this.flatCoordinates, e.getFlatCoordinates()) : this.flatCoordinates = e.getFlatCoordinates().slice(), this.ends_.push(this.flatCoordinates.length), this.changed(); } /** * Make a complete copy of the geometry. @@ -77824,14 +77816,14 @@ var No = class _No extends td { */ closestPointXY(e, t, i, r) { return r < IE(this.getExtent(), e, t) ? r : (this.maxDeltaRevision_ != this.getRevision() && (this.maxDelta_ = Math.sqrt( - eU( + tU( this.flatCoordinates, 0, this.ends_, this.stride, 0 ) - ), this.maxDeltaRevision_ = this.getRevision()), tU( + ), this.maxDeltaRevision_ = this.getRevision()), iU( this.flatCoordinates, 0, this.ends_, @@ -77865,7 +77857,7 @@ var No = class _No extends td { * @api */ getArea() { - return lU( + return cU( this.getOrientedFlatCoordinates(), 0, this.ends_, @@ -77887,7 +77879,7 @@ var No = class _No extends td { */ getCoordinates(e) { let t; - return e !== void 0 ? (t = this.getOrientedFlatCoordinates().slice(), Mm(t, 0, this.ends_, this.stride, e)) : t = this.flatCoordinates, oU(t, 0, this.ends_, this.stride); + return e !== void 0 ? (t = this.getOrientedFlatCoordinates().slice(), Pm(t, 0, this.ends_, this.stride, e)) : t = this.flatCoordinates, lU(t, 0, this.ends_, this.stride); } /** * @return {Array} Ends. @@ -77901,7 +77893,7 @@ var No = class _No extends td { getFlatInteriorPoint() { if (this.flatInteriorPointRevision_ != this.getRevision()) { const e = Mo(this.getExtent()); - this.flatInteriorPoint_ = hU( + this.flatInteriorPoint_ = uU( this.getOrientedFlatCoordinates(), 0, this.ends_, @@ -77919,7 +77911,7 @@ var No = class _No extends td { * @api */ getInteriorPoint() { - return new id(this.getFlatInteriorPoint(), "XYM"); + return new rd(this.getFlatInteriorPoint(), "XYM"); } /** * Return the number of rings of the polygon, this includes the exterior @@ -77973,7 +77965,7 @@ var No = class _No extends td { getOrientedFlatCoordinates() { if (this.orientedRevision_ != this.getRevision()) { const e = this.flatCoordinates; - pU(e, 0, this.ends_, this.stride) ? this.orientedFlatCoordinates_ = e : (this.orientedFlatCoordinates_ = e.slice(), this.orientedFlatCoordinates_.length = Mm( + gU(e, 0, this.ends_, this.stride) ? this.orientedFlatCoordinates_ = e : (this.orientedFlatCoordinates_ = e.slice(), this.orientedFlatCoordinates_.length = Pm( this.orientedFlatCoordinates_, 0, this.ends_, @@ -77989,7 +77981,7 @@ var No = class _No extends td { */ getSimplifiedGeometryInternal(e) { const t = [], i = []; - return t.length = aU( + return t.length = oU( this.flatCoordinates, 0, this.ends_, @@ -78015,7 +78007,7 @@ var No = class _No extends td { * @api */ intersectsExtent(e) { - return fU( + return dU( this.getOrientedFlatCoordinates(), 0, this.ends_, @@ -78031,7 +78023,7 @@ var No = class _No extends td { */ setCoordinates(e, t) { this.setLayout(t, e, 2), this.flatCoordinates || (this.flatCoordinates = []); - const i = rU( + const i = sU( this.flatCoordinates, 0, e, @@ -78041,7 +78033,7 @@ var No = class _No extends td { this.flatCoordinates.length = i.length === 0 ? 0 : i[i.length - 1], this.changed(); } }; -function Pm(n4) { +function Om(n4) { if ($o(n4)) throw new Error("Cannot create polygon from empty extent"); const e = n4[0], t = n4[1], i = n4[2], r = n4[3], s = [ @@ -78059,12 +78051,12 @@ function Pm(n4) { return new No(s, "XY", [s.length]); } var Jh = 0; -var gU = class extends Ws { +var mU = class extends Ws { /** * @param {ViewOptions} [options] View options. */ constructor(e) { - super(), this.on, this.once, this.un, e = Object.assign({}, e), this.hints_ = [0, 0], this.animations_ = [], this.updateAnimationKey_, this.projection_ = Zf(e.projection, "EPSG:3857"), this.viewportSize_ = [100, 100], this.targetCenter_ = null, this.targetResolution_, this.targetRotation_, this.nextCenter_ = null, this.nextResolution_, this.nextRotation_, this.cancelAnchor_ = void 0, e.projection && Dw(), e.center && (e.center = Ps(e.center, this.projection_)), e.extent && (e.extent = ha(e.extent, this.projection_)), this.applyOptions_(e); + super(), this.on, this.once, this.un, e = Object.assign({}, e), this.hints_ = [0, 0], this.animations_ = [], this.updateAnimationKey_, this.projection_ = jf(e.projection, "EPSG:3857"), this.viewportSize_ = [100, 100], this.targetCenter_ = null, this.targetResolution_, this.targetRotation_, this.nextCenter_ = null, this.nextResolution_, this.nextRotation_, this.cancelAnchor_ = void 0, e.projection && Nw(), e.center && (e.center = Ps(e.center, this.projection_)), e.extent && (e.extent = ha(e.extent, this.projection_)), this.applyOptions_(e); } /** * Set up the view with the given options. @@ -78072,12 +78064,12 @@ var gU = class extends Ws { */ applyOptions_(e) { const t = Object.assign({}, e); - for (const o in Gr) + for (const o in Xr) delete t[o]; this.setProperties(t, true); - const i = _U(e); + const i = EU(e); this.maxResolution_ = i.maxResolution, this.minResolution_ = i.minResolution, this.zoomFactor_ = i.zoomFactor, this.resolutions_ = e.resolutions, this.padding_ = e.padding, this.minZoom_ = i.minZoom; - const r = mU(e), s = i.constraint, a = EU(e); + const r = _U(e), s = i.constraint, a = vU(e); this.constraints_ = { center: r, resolution: s, @@ -78195,7 +78187,7 @@ var gU = class extends Ws { complete: false, anchor: h.anchor, duration: h.duration !== void 0 ? h.duration : 1e3, - easing: h.easing || Kw, + easing: h.easing || qw, callback: i }; if (h.center && (u.sourceCenter = a, u.targetCenter = h.center.slice(), a = u.targetCenter), h.zoom !== void 0 ? (u.sourceResolution = o, u.targetResolution = this.getResolutionForZoom(h.zoom), o = u.targetResolution) : h.resolution && (u.sourceResolution = o, u.targetResolution = h.resolution, o = u.targetResolution), h.rotation !== void 0) { @@ -78203,7 +78195,7 @@ var gU = class extends Ws { const f = Ra(h.rotation - l + Math.PI, 2 * Math.PI) - Math.PI; u.targetRotation = l + f, l = u.targetRotation; } - vU(u) ? u.complete = true : s += u.duration, c.push(u); + TU(u) ? u.complete = true : s += u.duration, c.push(u); } this.animations_.push(c), this.setHint(Mr.ANIMATING, 1), this.updateAnimations_(); } @@ -78319,7 +78311,7 @@ var gU = class extends Ws { calculateCenterRotate(e, t) { let i; const r = this.getCenterInternal(); - return r !== void 0 && (i = [r[0] - t[0], r[1] - t[1]], qf(i, e - this.getRotation()), bw(i, t)), i; + return r !== void 0 && (i = [r[0] - t[0], r[1] - t[1]], Yf(i, e - this.getRotation()), Aw(i, t)), i; } /** * @param {number} resolution Target resolution. @@ -78379,7 +78371,7 @@ var gU = class extends Ws { getCenterInternal() { return ( /** @type {import("./coordinate.js").Coordinate|undefined} */ - this.get(Gr.CENTER) + this.get(Xr.CENTER) ); } /** @@ -78413,7 +78405,7 @@ var gU = class extends Ws { */ calculateExtent(e) { const t = this.calculateExtentInternal(e); - return Bw(t, this.getProjection()); + return kw(t, this.getProjection()); } /** * @param {import("./size.js").Size} [size] Box pixel size. If not provided, @@ -78517,7 +78509,7 @@ var gU = class extends Ws { getResolution() { return ( /** @type {number|undefined} */ - this.get(Gr.RESOLUTION) + this.get(Xr.RESOLUTION) ); } /** @@ -78583,7 +78575,7 @@ var gU = class extends Ws { getRotation() { return ( /** @type {number} */ - this.get(Gr.ROTATION) + this.get(Xr.ROTATION) ); } /** @@ -78679,7 +78671,7 @@ var gU = class extends Ws { getZoomForResolution(e) { let t = this.minZoom_ || 0, i, r; if (this.resolutions_) { - const s = Gf(this.resolutions_, e, 1); + const s = Xf(this.resolutions_, e, 1); t = s, i = this.resolutions_[s], s == this.resolutions_.length - 1 ? r = 2 : r = i / this.resolutions_[s + 1]; } else i = this.maxResolution_, r = this.zoomFactor_; @@ -78723,15 +78715,15 @@ var gU = class extends Ws { ), Array.isArray(e)) { Kt(!$o(e), 25); const r = ha(e, this.getProjection()); - i = Pm(r); + i = Om(r); } else if (e.getType() === "Circle") { const r = ha( e.getExtent(), this.getProjection() ); - i = Pm(r), i.rotate(this.getRotation(), Mo(r)); + i = Om(r), i.rotate(this.getRotation(), Mo(r)); } else { - const r = Uw(); + const r = Vw(); r ? i = /** @type {import("./geom/SimpleGeometry.js").default} */ e.clone().transform(r, this.getProjection()) : i = e; } @@ -79003,7 +78995,7 @@ var gU = class extends Ws { s ) ); - this.get(Gr.ROTATION) !== r && this.set(Gr.ROTATION, r), this.get(Gr.RESOLUTION) !== a && (this.set(Gr.RESOLUTION, a), this.set("zoom", this.getZoom(), true)), (!o || !this.get(Gr.CENTER) || !gc(this.get(Gr.CENTER), o)) && this.set(Gr.CENTER, o), this.getAnimating() && !e && this.cancelAnimations(), this.cancelAnchor_ = void 0; + this.get(Xr.ROTATION) !== r && this.set(Xr.ROTATION, r), this.get(Xr.RESOLUTION) !== a && (this.set(Xr.RESOLUTION, a), this.set("zoom", this.getZoom(), true)), (!o || !this.get(Xr.CENTER) || !gc(this.get(Xr.CENTER), o)) && this.set(Xr.CENTER, o), this.getAnimating() && !e && this.cancelAnimations(), this.cancelAnchor_ = void 0; } /** * If any constraints need to be applied, an animation will be triggered. @@ -79125,30 +79117,30 @@ function Rl(n4, e) { n4(e); }, 0); } -function mU(n4) { +function _U(n4) { if (n4.extent !== void 0) { const t = n4.smoothExtentConstraint !== void 0 ? n4.smoothExtentConstraint : true; - return Rm(n4.extent, n4.constrainOnlyCenter, t); + return Sm(n4.extent, n4.constrainOnlyCenter, t); } - const e = Zf(n4.projection, "EPSG:3857"); + const e = jf(n4.projection, "EPSG:3857"); if (n4.multiWorld !== true && e.isGlobal()) { const t = e.getExtent().slice(); - return t[0] = -1 / 0, t[2] = 1 / 0, Rm(t, false, false); + return t[0] = -1 / 0, t[2] = 1 / 0, Sm(t, false, false); } - return zw; + return Ww; } -function _U(n4) { +function EU(n4) { let e, t, i, a = n4.minZoom !== void 0 ? n4.minZoom : Jh, o = n4.maxZoom !== void 0 ? n4.maxZoom : 28; - const l = n4.zoomFactor !== void 0 ? n4.zoomFactor : 2, c = n4.multiWorld !== void 0 ? n4.multiWorld : false, h = n4.smoothResolutionConstraint !== void 0 ? n4.smoothResolutionConstraint : true, u = n4.showFullExtent !== void 0 ? n4.showFullExtent : false, f = Zf(n4.projection, "EPSG:3857"), d = f.getExtent(); + const l = n4.zoomFactor !== void 0 ? n4.zoomFactor : 2, c = n4.multiWorld !== void 0 ? n4.multiWorld : false, h = n4.smoothResolutionConstraint !== void 0 ? n4.smoothResolutionConstraint : true, u = n4.showFullExtent !== void 0 ? n4.showFullExtent : false, f = jf(n4.projection, "EPSG:3857"), d = f.getExtent(); let p = n4.constrainOnlyCenter, g = n4.extent; if (!c && !g && f.isGlobal() && (p = false, g = d), n4.resolutions !== void 0) { const m = n4.resolutions; - t = m[a], i = m[o] !== void 0 ? m[o] : m[m.length - 1], n4.constrainResolution ? e = Ww( + t = m[a], i = m[o] !== void 0 ? m[o] : m[m.length - 1], n4.constrainResolution ? e = Gw( m, h, !p && g, u - ) : e = Sm( + ) : e = ym( t, i, h, @@ -79159,17 +79151,17 @@ function _U(n4) { const v = (d ? Math.max(Ui(d), gs(d)) : ( // use an extent that can fit the whole world if need be 360 * Po.degrees / f.getMetersPerUnit() - )) / Kf / Math.pow(2, Jh), E = v / Math.pow(2, 28 - Jh); + )) / qf / Math.pow(2, Jh), E = v / Math.pow(2, 28 - Jh); t = n4.maxResolution, t !== void 0 ? a = 0 : t = v / Math.pow(l, a), i = n4.minResolution, i === void 0 && (n4.maxZoom !== void 0 ? n4.maxResolution !== void 0 ? i = t / Math.pow(l, o) : i = v / Math.pow(l, o) : i = E), o = a + Math.floor( Math.log(t / i) / Math.log(l) - ), i = t / Math.pow(l, o - a), n4.constrainResolution ? e = Gw( + ), i = t / Math.pow(l, o - a), n4.constrainResolution ? e = Xw( l, t, i, h, !p && g, u - ) : e = Sm( + ) : e = ym( t, i, h, @@ -79185,14 +79177,14 @@ function _U(n4) { zoomFactor: l }; } -function EU(n4) { +function vU(n4) { if (n4.enableRotation !== void 0 ? n4.enableRotation : true) { const t = n4.constrainRotation; - return t === void 0 || t === true ? Hw() : t === false ? ym : typeof t == "number" ? Xw(t) : ym; + return t === void 0 || t === true ? Kw() : t === false ? Im : typeof t == "number" ? Hw(t) : Im; } - return ed; + return td; } -function vU(n4) { +function TU(n4) { return !(n4.sourceCenter && n4.targetCenter && !gc(n4.sourceCenter, n4.targetCenter) || n4.sourceResolution !== n4.targetResolution || n4.sourceRotation !== n4.targetRotation); } function $h(n4, e, t, i, r) { @@ -79202,8 +79194,8 @@ function $h(n4, e, t, i, r) { const c = o * s - l * a, h = l * s + o * a; return [c, h]; } -var jr = gU; -var TU = class extends DE { +var Qr = mU; +var xU = class extends DE { /** * @param {Options} options Layer options. */ @@ -79306,7 +79298,7 @@ var TU = class extends DE { isVisible(e) { let t; const i = this.getMapInternal(); - !e && i && (e = i.getView()), e instanceof jr ? t = { + !e && i && (e = i.getView()), e instanceof Qr ? t = { viewState: e.getState(), extent: e.calculateExtent() } : t = e, !t.layerStatesArray && i && (t.layerStatesArray = i.getLayerGroup().getLayerStatesArray()); @@ -79315,7 +79307,7 @@ var TU = class extends DE { (a) => a.layer === this ) : r = this.getLayerState(); const s = this.getExtent(); - return rd(r, t.viewState) && (!s || Jo(s, t.extent)); + return sd(r, t.viewState) && (!s || Jo(s, t.extent)); } /** * Get the attributions of the source of this layer for the given view. @@ -79331,7 +79323,7 @@ var TU = class extends DE { const i = this.getSource(); if (i && (t = i.getAttributions()), !t) return []; - const r = e instanceof jr ? e.getViewStateAndExtent() : e; + const r = e instanceof Qr ? e.getViewStateAndExtent() : e; let s = t(r); return Array.isArray(s) || (s = [s]), s; } @@ -79434,7 +79426,7 @@ var TU = class extends DE { this.renderer_ && (this.renderer_.dispose(), delete this.renderer_), this.setSource(null), super.disposeInternal(); } }; -function rd(n4, e) { +function sd(n4, e) { if (!n4.visible) return false; const t = e.resolution; @@ -79443,8 +79435,8 @@ function rd(n4, e) { const i = e.zoom; return i > n4.minZoom && i <= n4.maxZoom; } -var sd = TU; -var xU = class extends zf { +var nd = xU; +var CU = class extends Wf { /** * @param {import("../Map.js").default} map Map. */ @@ -79497,7 +79489,7 @@ var xU = class extends zf { function u(T, R, x, S) { return s.call(a, R, T ? x : null, S); } - const f = h.projection, d = Mw(e.slice(), f), p = [[0, 0]]; + const f = h.projection, d = Pw(e.slice(), f), p = [[0, 0]]; if (f.canWrapX() && r) { const T = f.getExtent(), R = Ui(T); p.push([-R, 0], [R, 0]); @@ -79509,10 +79501,10 @@ var xU = class extends zf { for (let T = 0; T < p.length; T++) for (let R = m - 1; R >= 0; --R) { const x = g[R], S = x.layer; - if (S.hasRenderer() && rd(x, h) && o.call(l, S)) { + if (S.hasRenderer() && sd(x, h) && o.call(l, S)) { const M = S.getRenderer(), N = S.getSource(); if (M && N) { - const F = N.getWrapX() ? d : e, L = u.bind( + const F = N.getWrapX() ? d : e, U = u.bind( null, x.managed ); @@ -79520,7 +79512,7 @@ var xU = class extends zf { E, t, i, - L, + U, v ); } @@ -79582,13 +79574,13 @@ var xU = class extends zf { * @protected */ scheduleExpireIconCache(e) { - OE.canExpireCache() && e.postRenderFunctions.push(CU); + OE.canExpireCache() && e.postRenderFunctions.push(RU); } }; -function CU(n4, e) { +function RU(n4, e) { OE.expire(); } -var qE = class extends dn { +var qE = class extends pn { /** * @param {import("./EventType.js").default} type Type. * @param {import("../transform.js").Transform} [inversePixelTransform] Transform for @@ -79602,29 +79594,29 @@ var qE = class extends dn { }; var Sl = "ol-hidden"; var rh = "ol-unselectable"; -var nd = "ol-control"; -var Om = "ol-collapsed"; +var ad = "ol-control"; +var Dm = "ol-collapsed"; function Na(n4, e, t, i) { let r; return t && t.length ? r = t.shift() : RE ? r = new OffscreenCanvas(n4 || 300, e || 300) : r = document.createElement("canvas"), n4 && (r.width = n4), e && (r.height = e), /** @type {CanvasRenderingContext2D} */ r.getContext("2d", i); } -function ad(n4) { +function od(n4) { const e = n4.canvas; e.width = 1, e.height = 1, n4.clearRect(0, 0, 1, 1); } -function Dm(n4, e) { +function Nm(n4, e) { const t = e.parentNode; t && t.replaceChild(n4, e); } function Mu(n4) { return n4 && n4.parentNode ? n4.parentNode.removeChild(n4) : null; } -function RU(n4) { +function SU(n4) { for (; n4.lastChild; ) n4.removeChild(n4.lastChild); } -function SU(n4, e) { +function yU(n4, e) { const t = n4.childNodes; for (let i = 0; ; ++i) { const r = t[i], s = e[i]; @@ -79643,14 +79635,14 @@ function SU(n4, e) { } } } -var yU = new Ws(); -var IU = class extends xU { +var IU = new Ws(); +var bU = class extends CU { /** * @param {import("../Map.js").default} map Map. */ constructor(e) { super(e), this.fontChangeListenerKey_ = Ht( - yU, + IU, bo.PROPERTYCHANGE, e.redrawText.bind(e) ), this.element_ = document.createElement("div"); @@ -79694,7 +79686,7 @@ var IU = class extends xU { const l = t[a]; e.layerIndex = a; const c = l.layer, h = c.getSourceState(); - if (!rd(l, i) || h != "ready" && h != "undefined") { + if (!sd(l, i) || h != "ready" && h != "undefined") { c.unrender(); continue; } @@ -79704,7 +79696,7 @@ var IU = class extends xU { c )); } - this.flushDeclutterItems(e), SU(this.element_, this.children_), this.dispatchRenderEvent(nn.POSTCOMPOSE, e), this.renderedVisible_ || (this.element_.style.display = "", this.renderedVisible_ = true), this.scheduleExpireIconCache(e); + this.flushDeclutterItems(e), yU(this.element_, this.children_), this.dispatchRenderEvent(nn.POSTCOMPOSE, e), this.renderedVisible_ || (this.element_.style.display = "", this.renderedVisible_ = true), this.scheduleExpireIconCache(e); } /** * @param {import("../Map.js").FrameState} frameState Frame state. @@ -79716,7 +79708,7 @@ var IU = class extends xU { t.length = 0; } }; -var tn = class extends dn { +var tn = class extends pn { /** * @param {EventType} type The event type. * @param {BaseLayer} layer The layer. @@ -79785,7 +79777,7 @@ var qa = class _qa extends DE { e instanceof _qa && t.push( Ht(e, "addlayer", this.handleLayerGroupAdd_, this), Ht(e, "removelayer", this.handleLayerGroupRemove_, this) - ), this.listenerKeys_[ur(e)] = t; + ), this.listenerKeys_[fr(e)] = t; } /** * @param {GroupEvent} event The layer group event. @@ -79812,7 +79804,7 @@ var qa = class _qa extends DE { * @private */ handleLayersRemove_(e) { - const t = e.element, i = ur(t); + const t = e.element, i = fr(t); this.listenerKeys_[i].forEach(Ei), delete this.listenerKeys_[i], this.dispatchEvent(new tn("removelayer", t)), this.changed(); } /** @@ -79894,7 +79886,7 @@ var qa = class _qa extends DE { return "ready"; } }; -var oa = class extends dn { +var oa = class extends pn { /** * @param {string} type Event type. * @param {import("./Map.js").default} map Map. @@ -80007,7 +79999,7 @@ var Pu = { POINTERLEAVE: "pointerleave", POINTERCANCEL: "pointercancel" }; -var bU = class extends Xf { +var AU = class extends Hf { /** * @param {import("./Map.js").default} map The map with the viewport to listen to events on. * @param {number} [moveTolerance] The minimal distance the pointer must travel to trigger a move. @@ -80266,7 +80258,7 @@ var Ki = { VIEW: "view" }; var mc = 1 / 0; -var AU = class { +var MU = class { /** * @param {function(T): number} priorityFunction Priority function. * @param {function(T): string} keyFunction Key function. @@ -80414,7 +80406,7 @@ var Qe = { ERROR: 3, EMPTY: 4 }; -var MU = class extends AU { +var PU = class extends MU { /** * @param {PriorityFunction} tilePriorityFunction Tile priority function. * @param {function(): ?} tileChangeCallback Function called on each tile change event. @@ -80480,13 +80472,13 @@ var MU = class extends AU { this.dequeue()[0], a = s.getKey(), r = s.getState(), r === Qe.IDLE && !(a in this.tilesLoadingKeys_) && (this.tilesLoadingKeys_[a] = true, ++this.tilesLoading_, ++i, s.load()); } }; -function PU(n4, e, t, i, r) { +function OU(n4, e, t, i, r) { if (!n4 || !(t in n4.wantedTiles) || !n4.wantedTiles[t][e.getKey()]) return mc; const s = n4.viewState.center, a = i[0] - s[0], o = i[1] - s[1]; return 65536 * Math.log(r) + Math.sqrt(a * a + o * o) / r; } -var od = class extends Ws { +var ld = class extends Ws { /** * @param {Options} options Control options. */ @@ -80545,7 +80537,7 @@ var od = class extends Ws { this.target_ = typeof e == "string" ? document.getElementById(e) : e; } }; -var OU = class extends od { +var DU = class extends ld { /** * @param {Options} [options] Attribution options. */ @@ -80565,7 +80557,7 @@ var OU = class extends od { this.handleClick_.bind(this), false ); - const c = t + " " + rh + " " + nd + (this.collapsed_ && this.collapsible_ ? " " + Om : "") + (this.collapsible_ ? "" : " ol-uncollapsible"), h = this.element; + const c = t + " " + rh + " " + ad + (this.collapsed_ && this.collapsible_ ? " " + Dm : "") + (this.collapsible_ ? "" : " ol-uncollapsible"), h = this.element; h.className = c, h.appendChild(this.toggleButton_), h.appendChild(this.ulElement_), this.renderedAttributions_ = [], this.renderedVisible_ = true; } /** @@ -80595,7 +80587,7 @@ var OU = class extends od { } const t = this.collectSourceAttributions_(e), i = t.length > 0; if (this.renderedVisible_ != i && (this.element.style.display = i ? "" : "none", this.renderedVisible_ = i), !Qc(t, this.renderedAttributions_)) { - RU(this.ulElement_); + SU(this.ulElement_); for (let r = 0, s = t.length; r < s; ++r) { const a = document.createElement("li"); a.innerHTML = t[r], this.ulElement_.appendChild(a); @@ -80614,7 +80606,7 @@ var OU = class extends od { * @private */ handleToggle_() { - this.element.classList.toggle(Om), this.collapsed_ ? Dm(this.collapseLabel_, this.label_) : Dm(this.label_, this.collapseLabel_), this.collapsed_ = !this.collapsed_, this.toggleButton_.setAttribute("aria-expanded", String(!this.collapsed_)); + this.element.classList.toggle(Dm), this.collapsed_ ? Nm(this.collapseLabel_, this.label_) : Nm(this.label_, this.collapseLabel_), this.collapsed_ = !this.collapsed_, this.toggleButton_.setAttribute("aria-expanded", String(!this.collapsed_)); } /** * Return `true` if the attribution is collapsible, `false` otherwise. @@ -80660,8 +80652,8 @@ var OU = class extends od { this.updateElement_(e.frameState); } }; -var DU = OU; -var NU = class extends od { +var NU = DU; +var FU = class extends ld { /** * @param {Options} [options] Rotate options. */ @@ -80679,7 +80671,7 @@ var NU = class extends od { this.handleClick_.bind(this), false ); - const o = t + " " + rh + " " + nd, l = this.element; + const o = t + " " + rh + " " + ad, l = this.element; l.className = o, l.appendChild(a), this.callResetNorth_ = e.resetNorth ? e.resetNorth : void 0, this.duration_ = e.duration !== void 0 ? e.duration : 250, this.autoHide_ = e.autoHide !== void 0 ? e.autoHide : true, this.rotation_ = void 0, this.autoHide_ && this.element.classList.add(Sl); } /** @@ -80724,8 +80716,8 @@ var NU = class extends od { this.rotation_ = i; } }; -var FU = NU; -var LU = class extends od { +var LU = FU; +var wU = class extends ld { /** * @param {Options} [options] Zoom options. */ @@ -80750,7 +80742,7 @@ var LU = class extends od { this.handleClick_.bind(this, -i), false ); - const f = t + " " + rh + " " + nd, d = this.element; + const f = t + " " + rh + " " + ad, d = this.element; d.className = f, d.appendChild(h), d.appendChild(u), this.duration_ = e.duration !== void 0 ? e.duration : 250; } /** @@ -80780,13 +80772,13 @@ var LU = class extends od { } } }; -var wU = LU; -function UU(n4) { +var UU = wU; +function VU(n4) { n4 = n4 || {}; const e = new Us(); - return (n4.zoom !== void 0 ? n4.zoom : true) && e.push(new wU(n4.zoomOptions)), (n4.rotate !== void 0 ? n4.rotate : true) && e.push(new FU(n4.rotateOptions)), (n4.attribution !== void 0 ? n4.attribution : true) && e.push(new DU(n4.attributionOptions)), e; + return (n4.zoom !== void 0 ? n4.zoom : true) && e.push(new UU(n4.zoomOptions)), (n4.rotate !== void 0 ? n4.rotate : true) && e.push(new LU(n4.rotateOptions)), (n4.attribution !== void 0 ? n4.attribution : true) && e.push(new NU(n4.attributionOptions)), e; } -var Nm = { +var Fm = { ACTIVE: "active" }; var tl = class extends Ws { @@ -80805,7 +80797,7 @@ var tl = class extends Ws { getActive() { return ( /** @type {boolean} */ - this.get(Nm.ACTIVE) + this.get(Fm.ACTIVE) ); } /** @@ -80832,7 +80824,7 @@ var tl = class extends Ws { * @api */ setActive(e) { - this.set(Nm.ACTIVE, e); + this.set(Fm.ACTIVE, e); } /** * Remove the interaction from its current map and attach it to the new map. @@ -80844,18 +80836,18 @@ var tl = class extends Ws { this.map_ = e; } }; -function VU(n4, e, t) { +function BU(n4, e, t) { const i = n4.getCenterInternal(); if (i) { const r = [i[0] + e[0], i[1] + e[1]]; n4.animateInternal({ duration: t !== void 0 ? t : 250, - easing: qw, + easing: Yw, center: n4.getConstrainedCenter(r) }); } } -function ld(n4, e, t, i) { +function cd(n4, e, t, i) { const r = n4.getZoom(); if (r === void 0) return; @@ -80867,7 +80859,7 @@ function ld(n4, e, t, i) { easing: Ka }); } -var BU = class extends tl { +var kU = class extends tl { /** * @param {Options} [options] Options. */ @@ -80887,12 +80879,12 @@ var BU = class extends tl { /** @type {MouseEvent} */ e.originalEvent ), r = e.map, s = e.coordinate, a = i.shiftKey ? -this.delta_ : this.delta_, o = r.getView(); - ld(o, a, s, this.duration_), i.preventDefault(), t = true; + cd(o, a, s, this.duration_), i.preventDefault(), t = true; } return !t; } }; -var kU = BU; +var zU = kU; var il = class extends tl { /** * @param {Options} [options] Options. @@ -80987,7 +80979,7 @@ var il = class extends tl { e.activePointers && (this.targetPointers = e.activePointers); } }; -function cd(n4) { +function hd(n4) { const e = n4.length; let t = 0, i = 0; for (let r = 0; r < e; r++) @@ -81003,27 +80995,27 @@ function Ou(n4) { return i; }; } -var zU = function(n4) { +var WU = function(n4) { const e = ( /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ n4.originalEvent ); return e.altKey && !(e.metaKey || e.ctrlKey) && e.shiftKey; }; -var WU = function(n4) { +var GU = function(n4) { const e = n4.map.getTargetElement(), t = n4.map.getOwnerDocument().activeElement; return e.contains(t); }; var YE = function(n4) { - return n4.map.getTargetElement().hasAttribute("tabindex") ? WU(n4) : true; + return n4.map.getTargetElement().hasAttribute("tabindex") ? GU(n4) : true; }; -var GU = uc; +var XU = uc; var ZE = function(n4) { const e = ( /** @type {MouseEvent} */ n4.originalEvent ); - return e.button == 0 && !(H2 && xE && e.ctrlKey); + return e.button == 0 && !(K2 && xE && e.ctrlKey); }; var jE = function(n4) { const e = ( @@ -81032,14 +81024,14 @@ var jE = function(n4) { ); return !e.altKey && !(e.metaKey || e.ctrlKey) && !e.shiftKey; }; -var XU = function(n4) { +var HU = function(n4) { const e = ( /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ n4.originalEvent ); return xE ? e.metaKey : e.ctrlKey; }; -var HU = function(n4) { +var KU = function(n4) { const e = ( /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ n4.originalEvent @@ -81066,14 +81058,14 @@ var tu = function(n4) { ); return Kt(e !== void 0, 56), e.pointerType == "mouse"; }; -var KU = function(n4) { +var qU = function(n4) { const e = ( /** @type {import("../MapBrowserEvent").default} */ n4.originalEvent ); return Kt(e !== void 0, 56), e.isPrimary && e.button === 0; }; -var qU = class extends il { +var YU = class extends il { /** * @param {Options} [options] Options. */ @@ -81081,7 +81073,7 @@ var qU = class extends il { super({ stopDown: Jc }), e = e || {}, this.kinetic_ = e.kinetic, this.lastCentroid = null, this.lastPointersCount_, this.panning_ = false; - const t = e.condition ? e.condition : Ou(jE, KU); + const t = e.condition ? e.condition : Ou(jE, qU); this.condition_ = e.onFocusOnly ? Ou(YE, t) : t, this.noKinetic_ = false; } /** @@ -81091,14 +81083,14 @@ var qU = class extends il { handleDragEvent(e) { const t = e.map; this.panning_ || (this.panning_ = true, t.getView().beginInteraction()); - const i = this.targetPointers, r = t.getEventPixel(cd(i)); + const i = this.targetPointers, r = t.getEventPixel(hd(i)); if (i.length == this.lastPointersCount_) { if (this.kinetic_ && this.kinetic_.update(r[0], r[1]), this.lastCentroid) { const s = [ this.lastCentroid[0] - r[0], r[1] - this.lastCentroid[1] ], o = e.map.getView(); - Aw(s, o.getResolution()), qf(s, o.getRotation()), o.adjustCenterInternal(s); + Mw(s, o.getResolution()), Yf(s, o.getRotation()), o.adjustCenterInternal(s); } } else this.kinetic_ && this.kinetic_.begin(); @@ -81140,15 +81132,15 @@ var qU = class extends il { return false; } }; -var YU = qU; -var ZU = class extends il { +var ZU = YU; +var jU = class extends il { /** * @param {Options} [options] Options. */ constructor(e) { e = e || {}, super({ stopDown: Jc - }), this.condition_ = e.condition ? e.condition : zU, this.lastAngle_ = void 0, this.duration_ = e.duration !== void 0 ? e.duration : 250; + }), this.condition_ = e.condition ? e.condition : WU, this.lastAngle_ = void 0, this.duration_ = e.duration !== void 0 ? e.duration : 250; } /** * Handle pointer drag events. @@ -81158,7 +81150,7 @@ var ZU = class extends il { if (!tu(e)) return; const t = e.map, i = t.getView(); - if (i.getConstraints().rotation === ed) + if (i.getConstraints().rotation === td) return; const r = t.getSize(), s = e.pixel, a = Math.atan2(r[1] / 2 - s[1], s[0] - r[0] / 2); if (this.lastAngle_ !== void 0) { @@ -81184,7 +81176,7 @@ var ZU = class extends il { return tu(e) && ZE(e) && this.condition_(e) ? (e.map.getView().beginInteraction(), this.lastAngle_ = void 0, true) : false; } }; -var jU = class extends zf { +var QU = class extends Wf { /** * @param {string} className CSS class name. */ @@ -81270,7 +81262,7 @@ var yl = { */ BOXCANCEL: "boxcancel" }; -var iu = class extends dn { +var iu = class extends pn { /** * @param {string} type The event type. * @param {import("../coordinate.js").Coordinate} coordinate The event coordinate. @@ -81280,12 +81272,12 @@ var iu = class extends dn { super(e), this.coordinate = t, this.mapBrowserEvent = i; } }; -var QU = class extends il { +var JU = class extends il { /** * @param {Options} [options] Options. */ constructor(e) { - super(), this.on, this.once, this.un, e = e || {}, this.box_ = new jU(e.className || "ol-dragbox"), this.minArea_ = e.minArea !== void 0 ? e.minArea : 64, e.onBoxEnd && (this.onBoxEnd = e.onBoxEnd), this.startPixel_ = null, this.condition_ = e.condition ? e.condition : ZE, this.boxEndCondition_ = e.boxEndCondition ? e.boxEndCondition : this.defaultBoxEndCondition; + super(), this.on, this.once, this.un, e = e || {}, this.box_ = new QU(e.className || "ol-dragbox"), this.minArea_ = e.minArea !== void 0 ? e.minArea : 64, e.onBoxEnd && (this.onBoxEnd = e.onBoxEnd), this.startPixel_ = null, this.condition_ = e.condition ? e.condition : ZE, this.boxEndCondition_ = e.boxEndCondition ? e.boxEndCondition : this.defaultBoxEndCondition; } /** * The default condition for determining whether the boxend event @@ -81362,13 +81354,13 @@ var QU = class extends il { onBoxEnd(e) { } }; -var JU = class extends QU { +var $U = class extends JU { /** * @param {Options} [options] Options. */ constructor(e) { e = e || {}; - const t = e.condition ? e.condition : HU; + const t = e.condition ? e.condition : KU; super({ condition: t, className: e.className || "ol-dragzoom", @@ -81395,14 +81387,14 @@ var JU = class extends QU { }); } }; -var $U = JU; -var Tn = { +var e3 = $U; +var xn = { LEFT: "ArrowLeft", UP: "ArrowUp", RIGHT: "ArrowRight", DOWN: "ArrowDown" }; -var e3 = class extends tl { +var t3 = class extends tl { /** * @param {Options} [options] Options. */ @@ -81425,24 +81417,24 @@ var e3 = class extends tl { /** @type {KeyboardEvent} */ e.originalEvent ), r = i.key; - if (this.condition_(e) && (r == Tn.DOWN || r == Tn.LEFT || r == Tn.RIGHT || r == Tn.UP)) { + if (this.condition_(e) && (r == xn.DOWN || r == xn.LEFT || r == xn.RIGHT || r == xn.UP)) { const a = e.map.getView(), o = a.getResolution() * this.pixelDelta_; let l = 0, c = 0; - r == Tn.DOWN ? c = -o : r == Tn.LEFT ? l = -o : r == Tn.RIGHT ? l = o : c = o; + r == xn.DOWN ? c = -o : r == xn.LEFT ? l = -o : r == xn.RIGHT ? l = o : c = o; const h = [l, c]; - qf(h, a.getRotation()), VU(a, h, this.duration_), i.preventDefault(), t = true; + Yf(h, a.getRotation()), BU(a, h, this.duration_), i.preventDefault(), t = true; } } return !t; } }; -var t3 = class extends tl { +var i3 = class extends tl { /** * @param {Options} [options] Options. */ constructor(e) { super(), e = e || {}, this.condition_ = e.condition ? e.condition : function(t) { - return !XU(t) && QE(t); + return !HU(t) && QE(t); }, this.delta_ = e.delta ? e.delta : 1, this.duration_ = e.duration !== void 0 ? e.duration : 100; } /** @@ -81461,14 +81453,14 @@ var t3 = class extends tl { ), r = i.key; if (this.condition_(e) && (r === "+" || r === "-")) { const s = e.map, a = r === "+" ? this.delta_ : -this.delta_, o = s.getView(); - ld(o, a, void 0, this.duration_), i.preventDefault(), t = true; + cd(o, a, void 0, this.duration_), i.preventDefault(), t = true; } } return !t; } }; -var i3 = t3; -var r3 = class { +var r3 = i3; +var s3 = class { /** * @param {number} decay Rate of decay (must be negative). * @param {number} minVelocity Minimum velocity (pixels/millisecond). @@ -81522,7 +81514,7 @@ var r3 = class { return this.angle_; } }; -var s3 = class extends tl { +var n3 = class extends tl { /** * @param {Options} [options] Options. */ @@ -81531,7 +81523,7 @@ var s3 = class extends tl { /** @type {import("./Interaction.js").InteractionOptions} */ e ), this.totalDelta_ = 0, this.lastDelta_ = 0, this.maxDelta_ = e.maxDelta !== void 0 ? e.maxDelta : 1, this.duration_ = e.duration !== void 0 ? e.duration : 250, this.timeout_ = e.timeout !== void 0 ? e.timeout : 80, this.useAnchor_ = e.useAnchor !== void 0 ? e.useAnchor : true, this.constrainResolution_ = e.constrainResolution !== void 0 ? e.constrainResolution : false; - const t = e.condition ? e.condition : GU; + const t = e.condition ? e.condition : XU; this.condition_ = e.onFocusOnly ? Ou(YE, t) : t, this.lastAnchor_ = null, this.startTime_ = void 0, this.timeoutId_, this.mode_ = void 0, this.trackpadEventGap_ = 400, this.trackpadTimeoutId_, this.deltaPerZoom_ = 300; } /** @@ -81563,7 +81555,7 @@ var s3 = class extends tl { ); r.preventDefault(), this.useAnchor_ && (this.lastAnchor_ = e.coordinate); let s; - if (e.type == St.WHEEL && (s = r.deltaY, G2 && r.deltaMode === WheelEvent.DOM_DELTA_PIXEL && (s /= CE), r.deltaMode === WheelEvent.DOM_DELTA_LINE && (s *= 40)), s === 0) + if (e.type == St.WHEEL && (s = r.deltaY, X2 && r.deltaMode === WheelEvent.DOM_DELTA_PIXEL && (s /= CE), r.deltaMode === WheelEvent.DOM_DELTA_LINE && (s *= 40)), s === 0) return false; this.lastDelta_ = s; const a = Date.now(); @@ -81593,7 +81585,7 @@ var s3 = class extends tl { -this.maxDelta_ * this.deltaPerZoom_, this.maxDelta_ * this.deltaPerZoom_ ) / this.deltaPerZoom_; - (t.getConstrainResolution() || this.constrainResolution_) && (i = i ? i > 0 ? 1 : -1 : 0), ld(t, i, this.lastAnchor_, this.duration_), this.mode_ = void 0, this.totalDelta_ = 0, this.lastAnchor_ = null, this.startTime_ = void 0, this.timeoutId_ = void 0; + (t.getConstrainResolution() || this.constrainResolution_) && (i = i ? i > 0 ? 1 : -1 : 0), cd(t, i, this.lastAnchor_, this.duration_), this.mode_ = void 0, this.totalDelta_ = 0, this.lastAnchor_ = null, this.startTime_ = void 0, this.timeoutId_ = void 0; } /** * Enable or disable using the mouse's location as an anchor when zooming @@ -81605,8 +81597,8 @@ var s3 = class extends tl { this.useAnchor_ = e, e || (this.lastAnchor_ = null); } }; -var n3 = s3; -var a3 = class extends il { +var a3 = n3; +var o3 = class extends il { /** * @param {Options} [options] Options. */ @@ -81634,8 +81626,8 @@ var a3 = class extends il { } this.lastAngle_ = s; const a = e.map, o = a.getView(); - o.getConstraints().rotation !== ed && (this.anchor_ = a.getCoordinateFromPixelInternal( - a.getEventPixel(cd(this.targetPointers)) + o.getConstraints().rotation !== td && (this.anchor_ = a.getCoordinateFromPixelInternal( + a.getEventPixel(hd(this.targetPointers)) ), this.rotating_ && (a.render(), o.adjustRotationInternal(t, this.anchor_))); } /** @@ -81659,7 +81651,7 @@ var a3 = class extends il { return false; } }; -var o3 = class extends il { +var l3 = class extends il { /** * @param {Options} [options] Options. */ @@ -81681,7 +81673,7 @@ var o3 = class extends il { this.lastDistance_ !== void 0 && (t = this.lastDistance_ / o), this.lastDistance_ = o; const l = e.map, c = l.getView(); t != 1 && (this.lastScaleDelta_ = t), this.anchor_ = l.getCoordinateFromPixelInternal( - l.getEventPixel(cd(this.targetPointers)) + l.getEventPixel(hd(this.targetPointers)) ), l.render(), c.adjustResolutionInternal(t, this.anchor_); } /** @@ -81709,58 +81701,58 @@ var o3 = class extends il { return false; } }; -var l3 = o3; -function c3(n4) { +var c3 = l3; +function h3(n4) { n4 = n4 || {}; - const e = new Us(), t = new r3(-5e-3, 0.05, 100); - return (n4.altShiftDragRotate !== void 0 ? n4.altShiftDragRotate : true) && e.push(new ZU()), (n4.doubleClickZoom !== void 0 ? n4.doubleClickZoom : true) && e.push( - new kU({ + const e = new Us(), t = new s3(-5e-3, 0.05, 100); + return (n4.altShiftDragRotate !== void 0 ? n4.altShiftDragRotate : true) && e.push(new jU()), (n4.doubleClickZoom !== void 0 ? n4.doubleClickZoom : true) && e.push( + new zU({ delta: n4.zoomDelta, duration: n4.zoomDuration }) ), (n4.dragPan !== void 0 ? n4.dragPan : true) && e.push( - new YU({ + new ZU({ onFocusOnly: n4.onFocusOnly, kinetic: t }) - ), (n4.pinchRotate !== void 0 ? n4.pinchRotate : true) && e.push(new a3()), (n4.pinchZoom !== void 0 ? n4.pinchZoom : true) && e.push( - new l3({ + ), (n4.pinchRotate !== void 0 ? n4.pinchRotate : true) && e.push(new o3()), (n4.pinchZoom !== void 0 ? n4.pinchZoom : true) && e.push( + new c3({ duration: n4.zoomDuration }) - ), (n4.keyboard !== void 0 ? n4.keyboard : true) && (e.push(new e3()), e.push( - new i3({ + ), (n4.keyboard !== void 0 ? n4.keyboard : true) && (e.push(new t3()), e.push( + new r3({ delta: n4.zoomDelta, duration: n4.zoomDuration }) )), (n4.mouseWheelZoom !== void 0 ? n4.mouseWheelZoom : true) && e.push( - new n3({ + new a3({ onFocusOnly: n4.onFocusOnly, duration: n4.zoomDuration }) ), (n4.shiftDragZoom !== void 0 ? n4.shiftDragZoom : true) && e.push( - new $U({ + new e3({ duration: n4.zoomDuration }) ), e; } -function Fm(n4) { +function Lm(n4) { return n4[0] > 0 && n4[1] > 0; } -function h3(n4, e, t) { +function u3(n4, e, t) { return t === void 0 && (t = [0, 0]), t[0] = n4[0] * e + 0.5 | 0, t[1] = n4[1] * e + 0.5 | 0, t; } function sn(n4, e) { return Array.isArray(n4) ? n4 : (e === void 0 ? e = [n4, n4] : (e[0] = n4, e[1] = n4), e); } function JE(n4) { - if (n4 instanceof sd) { + if (n4 instanceof nd) { n4.setMapInternal(null); return; } n4 instanceof qa && n4.getLayers().forEach(JE); } function $E(n4, e) { - if (n4 instanceof sd) { + if (n4 instanceof nd) { n4.setMapInternal(e); return; } @@ -81776,10 +81768,10 @@ var ev = class extends Ws { */ constructor(e) { super(), e = e || {}, this.on, this.once, this.un; - const t = u3(e); - this.renderComplete_, this.loaded_ = true, this.boundHandleBrowserEvent_ = this.handleBrowserEvent.bind(this), this.maxTilesLoading_ = e.maxTilesLoading !== void 0 ? e.maxTilesLoading : 16, this.pixelRatio_ = e.pixelRatio !== void 0 ? e.pixelRatio : CE, this.postRenderTimeoutHandle_, this.animationDelayKey_, this.animationDelay_ = this.animationDelay_.bind(this), this.coordinateToPixelTransform_ = xa(), this.pixelToCoordinateTransform_ = xa(), this.frameIndex_ = 0, this.frameState_ = null, this.previousExtent_ = null, this.viewPropertyListenerKey_ = null, this.viewChangeListenerKey_ = null, this.layerGroupPropertyListenerKeys_ = null, this.viewport_ = document.createElement("div"), this.viewport_.className = "ol-viewport" + ("ontouchstart" in window ? " ol-touch" : ""), this.viewport_.style.position = "relative", this.viewport_.style.overflow = "hidden", this.viewport_.style.width = "100%", this.viewport_.style.height = "100%", this.overlayContainer_ = document.createElement("div"), this.overlayContainer_.style.position = "absolute", this.overlayContainer_.style.zIndex = "0", this.overlayContainer_.style.width = "100%", this.overlayContainer_.style.height = "100%", this.overlayContainer_.style.pointerEvents = "none", this.overlayContainer_.className = "ol-overlaycontainer", this.viewport_.appendChild(this.overlayContainer_), this.overlayContainerStopEvent_ = document.createElement("div"), this.overlayContainerStopEvent_.style.position = "absolute", this.overlayContainerStopEvent_.style.zIndex = "0", this.overlayContainerStopEvent_.style.width = "100%", this.overlayContainerStopEvent_.style.height = "100%", this.overlayContainerStopEvent_.style.pointerEvents = "none", this.overlayContainerStopEvent_.className = "ol-overlaycontainer-stopevent", this.viewport_.appendChild(this.overlayContainerStopEvent_), this.mapBrowserEventHandler_ = null, this.moveTolerance_ = e.moveTolerance, this.keyboardEventTarget_ = t.keyboardEventTarget, this.targetChangeHandlerKeys_ = null, this.targetElement_ = null, this.resizeObserver_ = new ResizeObserver(() => this.updateSize()), this.controls = t.controls || UU(), this.interactions = t.interactions || c3({ + const t = f3(e); + this.renderComplete_, this.loaded_ = true, this.boundHandleBrowserEvent_ = this.handleBrowserEvent.bind(this), this.maxTilesLoading_ = e.maxTilesLoading !== void 0 ? e.maxTilesLoading : 16, this.pixelRatio_ = e.pixelRatio !== void 0 ? e.pixelRatio : CE, this.postRenderTimeoutHandle_, this.animationDelayKey_, this.animationDelay_ = this.animationDelay_.bind(this), this.coordinateToPixelTransform_ = xa(), this.pixelToCoordinateTransform_ = xa(), this.frameIndex_ = 0, this.frameState_ = null, this.previousExtent_ = null, this.viewPropertyListenerKey_ = null, this.viewChangeListenerKey_ = null, this.layerGroupPropertyListenerKeys_ = null, this.viewport_ = document.createElement("div"), this.viewport_.className = "ol-viewport" + ("ontouchstart" in window ? " ol-touch" : ""), this.viewport_.style.position = "relative", this.viewport_.style.overflow = "hidden", this.viewport_.style.width = "100%", this.viewport_.style.height = "100%", this.overlayContainer_ = document.createElement("div"), this.overlayContainer_.style.position = "absolute", this.overlayContainer_.style.zIndex = "0", this.overlayContainer_.style.width = "100%", this.overlayContainer_.style.height = "100%", this.overlayContainer_.style.pointerEvents = "none", this.overlayContainer_.className = "ol-overlaycontainer", this.viewport_.appendChild(this.overlayContainer_), this.overlayContainerStopEvent_ = document.createElement("div"), this.overlayContainerStopEvent_.style.position = "absolute", this.overlayContainerStopEvent_.style.zIndex = "0", this.overlayContainerStopEvent_.style.width = "100%", this.overlayContainerStopEvent_.style.height = "100%", this.overlayContainerStopEvent_.style.pointerEvents = "none", this.overlayContainerStopEvent_.className = "ol-overlaycontainer-stopevent", this.viewport_.appendChild(this.overlayContainerStopEvent_), this.mapBrowserEventHandler_ = null, this.moveTolerance_ = e.moveTolerance, this.keyboardEventTarget_ = t.keyboardEventTarget, this.targetChangeHandlerKeys_ = null, this.targetElement_ = null, this.resizeObserver_ = new ResizeObserver(() => this.updateSize()), this.controls = t.controls || VU(), this.interactions = t.interactions || h3({ onFocusOnly: true - }), this.overlays_ = t.overlays, this.overlayIdIndex_ = {}, this.renderer_ = null, this.postRenderFunctions_ = [], this.tileQueue_ = new MU( + }), this.overlays_ = t.overlays, this.overlayIdIndex_ = {}, this.renderer_ = null, this.postRenderFunctions_ = [], this.tileQueue_ = new PU( this.getTilePriority.bind(this), this.handleTileChange_.bind(this) ), this.addChangeListener( @@ -81787,8 +81779,8 @@ var ev = class extends Ws { this.handleLayerGroupChanged_ ), this.addChangeListener(Ki.VIEW, this.handleViewChanged_), this.addChangeListener(Ki.SIZE, this.handleSizeChanged_), this.addChangeListener(Ki.TARGET, this.handleTargetChanged_), this.setProperties(t.values); const i = this; - e.view && !(e.view instanceof jr) && e.view.then(function(r) { - i.setView(new jr(r)); + e.view && !(e.view instanceof Qr) && e.view.then(function(r) { + i.setView(new Qr(r)); }), this.controls.addEventListener( Dr.ADD, /** @@ -82287,7 +82279,7 @@ var ev = class extends Ws { * @return {number} Tile priority. */ getTilePriority(e, t, i, r) { - return PU( + return OU( this.frameState_, e, t, @@ -82400,7 +82392,7 @@ var ev = class extends Ws { if (this.targetElement_ = t, !t) this.renderer_ && (clearTimeout(this.postRenderTimeoutHandle_), this.postRenderTimeoutHandle_ = void 0, this.postRenderFunctions_.length = 0, this.renderer_.dispose(), this.renderer_ = null), this.animationDelayKey_ && (cancelAnimationFrame(this.animationDelayKey_), this.animationDelayKey_ = void 0); else { - t.appendChild(this.viewport_), this.renderer_ || (this.renderer_ = new IU(this)), this.mapBrowserEventHandler_ = new bU( + t.appendChild(this.viewport_), this.renderer_ || (this.renderer_ = new bU(this)), this.mapBrowserEventHandler_ = new AU( this, this.moveTolerance_ ); @@ -82582,7 +82574,7 @@ var ev = class extends Ws { renderFrame_(e) { const t = this.getSize(), i = this.getView(), r = this.frameState_; let s = null; - if (t !== void 0 && Fm(t) && i && i.isDef()) { + if (t !== void 0 && Lm(t) && i && i.isDef()) { const a = i.getHints( this.frameState_ ? this.frameState_.viewHints : void 0 ), o = i.getState(); @@ -82609,7 +82601,7 @@ var ev = class extends Ws { viewState: o, viewHints: a, wantedTiles: {}, - mapId: ur(this), + mapId: fr(this), renderTargets: {} }, o.nextCenter && o.nextResolution) { const l = isNaN(o.nextRotation) ? o.rotation : o.nextRotation; @@ -82628,7 +82620,7 @@ var ev = class extends Ws { new oa($s.MOVESTART, this, r) ), this.previousExtent_ = Qo(this.previousExtent_)), this.previousExtent_ && !s.viewHints[Mr.ANIMATING] && !s.viewHints[Mr.INTERACTING] && !Cu(s.extent, this.previousExtent_) && (this.dispatchEvent( new oa($s.MOVEEND, this, s) - ), j2(s.extent, this.previousExtent_))), this.dispatchEvent(new oa($s.POSTRENDER, this, s)), this.renderComplete_ = this.hasListener($s.LOADSTART) || this.hasListener($s.LOADEND) || this.hasListener(nn.RENDERCOMPLETE) ? !this.tileQueue_.getTilesLoading() && !this.tileQueue_.getCount() && !this.getLoadingOrNotReady() : void 0, this.postRenderTimeoutHandle_ || (this.postRenderTimeoutHandle_ = setTimeout(() => { + ), Q2(s.extent, this.previousExtent_))), this.dispatchEvent(new oa($s.POSTRENDER, this, s)), this.renderComplete_ = this.hasListener($s.LOADSTART) || this.hasListener($s.LOADEND) || this.hasListener(nn.RENDERCOMPLETE) ? !this.tileQueue_.getTilesLoading() && !this.tileQueue_.getCount() && !this.getLoadingOrNotReady() : void 0, this.postRenderTimeoutHandle_ || (this.postRenderTimeoutHandle_ = setTimeout(() => { this.postRenderTimeoutHandle_ = void 0, this.handlePostRender(); }, 0)); } @@ -82671,14 +82663,14 @@ var ev = class extends Ws { * @api */ setView(e) { - if (!e || e instanceof jr) { + if (!e || e instanceof Qr) { this.set(Ki.VIEW, e); return; } - this.set(Ki.VIEW, new jr()); + this.set(Ki.VIEW, new Qr()); const t = this; e.then(function(i) { - t.setView(new jr(i)); + t.setView(new Qr(i)); }); } /** @@ -82691,7 +82683,7 @@ var ev = class extends Ws { let t; if (e) { const r = getComputedStyle(e), s = e.offsetWidth - parseFloat(r.borderLeftWidth) - parseFloat(r.paddingLeft) - parseFloat(r.paddingRight) - parseFloat(r.borderRightWidth), a = e.offsetHeight - parseFloat(r.borderTopWidth) - parseFloat(r.paddingTop) - parseFloat(r.paddingBottom) - parseFloat(r.borderBottomWidth); - !isNaN(s) && !isNaN(a) && (t = [s, a], !Fm(t) && (e.offsetWidth || e.offsetHeight || e.getClientRects().length) && FE( + !isNaN(s) && !isNaN(a) && (t = [s, a], !Lm(t) && (e.offsetWidth || e.offsetHeight || e.getClientRects().length) && FE( "No map visible because the map container's width or height are 0." )); } @@ -82714,7 +82706,7 @@ var ev = class extends Ws { } } }; -function u3(n4) { +function f3(n4) { let e = null; n4.keyboardEventTarget !== void 0 && (e = typeof n4.keyboardEventTarget == "string" ? document.getElementById(n4.keyboardEventTarget) : n4.keyboardEventTarget); const t = {}, i = n4.layers && typeof /** @type {?} */ @@ -82727,7 +82719,7 @@ function u3(n4) { n4.layers ) }); - t[Ki.LAYERGROUP] = i, t[Ki.TARGET] = n4.target, t[Ki.VIEW] = n4.view instanceof jr ? n4.view : new jr(); + t[Ki.LAYERGROUP] = i, t[Ki.TARGET] = n4.target, t[Ki.VIEW] = n4.view instanceof Qr ? n4.view : new Qr(); let r; n4.controls !== void 0 && (Array.isArray(n4.controls) ? r = new Us(n4.controls.slice()) : (Kt( typeof /** @type {?} */ @@ -82757,7 +82749,7 @@ var Il = { PRELOAD: "preload", USE_INTERIM_TILES_ON_ERROR: "useInterimTilesOnError" }; -var f3 = class extends sd { +var d3 = class extends nd { /** * @param {Options} [options] Tile layer options. */ @@ -82837,7 +82829,7 @@ var ia = { ERROR: 3, EMPTY: 4 }; -var d3 = class extends jo { +var p3 = class extends jo { /** * @param {LayerType} layer Layer. */ @@ -82972,12 +82964,12 @@ var d3 = class extends jo { } }; var la = null; -function p3() { +function g3() { la = Na(1, 1, void 0, { willReadFrequently: true }); } -var g3 = class extends d3 { +var m3 = class extends p3 { /** * @param {LayerType} layer Layer. */ @@ -82991,7 +82983,7 @@ var g3 = class extends d3 { * @return {Uint8ClampedArray|null} The image data. */ getImageData(e, t, i) { - la || p3(), la.clearRect(0, 0, 1, 1); + la || g3(), la.clearRect(0, 0, 1, 1); let r; try { la.drawImage(e, t, i, 1, 1, 0, 0, 1, 1), r = la.getImageData(0, 0, 1, 1).data; @@ -83018,8 +83010,8 @@ var g3 = class extends d3 { const r = this.getLayer().getClassName(); let s, a; if (e && e.className === r && (!i || e && e.style.backgroundColor && Qc( - pm(e.style.backgroundColor), - pm(i) + gm(e.style.backgroundColor), + gm(i) ))) { const o = e.firstElementChild; o instanceof HTMLCanvasElement && (a = o.getContext("2d")); @@ -83111,7 +83103,7 @@ var g3 = class extends d3 { delete this.frameState, super.disposeInternal(); } }; -var tv = class extends Xf { +var tv = class extends Hf { /** * @param {import("./tilecoord.js").TileCoord} tileCoord Tile coordinate. * @param {import("./TileState.js").default} state State. @@ -83244,7 +83236,7 @@ var tv = class extends Xf { this.transition_ && (this.transitionStarts_[e] = -1); } }; -function m3(n4, e, t) { +function _3(n4, e, t) { const i = ( /** @type {HTMLImageElement} */ n4 @@ -83255,7 +83247,7 @@ function m3(n4, e, t) { a = true, s || e(); }) ]; - return i.src && K2 ? (s = true, i.decode().then(function() { + return i.src && q2 ? (s = true, i.decode().then(function() { r && e(); }).catch(function(l) { r && (a ? e() : t()); @@ -83296,7 +83288,7 @@ var iv = class extends tv { * @private */ handleImageError_() { - this.state = Qe.ERROR, this.unlistenImage_(), this.image_ = _3(), this.changed(); + this.state = Qe.ERROR, this.unlistenImage_(), this.image_ = E3(), this.changed(); } /** * Tracks successful image load. @@ -83348,7 +83340,7 @@ var iv = class extends tv { * @api */ load() { - this.state == Qe.ERROR && (this.state = Qe.IDLE, this.image_ = new Image(), this.crossOrigin_ !== null && (this.image_.crossOrigin = this.crossOrigin_)), this.state == Qe.IDLE && (this.state = Qe.LOADING, this.changed(), this.tileLoadFunction_(this, this.src_), this.unlisten_ = m3( + this.state == Qe.ERROR && (this.state = Qe.IDLE, this.image_ = new Image(), this.crossOrigin_ !== null && (this.image_.crossOrigin = this.crossOrigin_)), this.state == Qe.IDLE && (this.state = Qe.LOADING, this.changed(), this.tileLoadFunction_(this, this.src_), this.unlisten_ = _3( this.image_, this.handleImageLoad_.bind(this), this.handleImageError_.bind(this) @@ -83363,14 +83355,14 @@ var iv = class extends tv { this.unlisten_ && (this.unlisten_(), this.unlisten_ = null); } }; -function _3() { +function E3() { const n4 = Na(1, 1); return n4.fillStyle = "rgba(0,0,0,0)", n4.fillRect(0, 0, 1, 1), n4.canvas; } -var E3 = 0.5; -var v3 = 10; -var Lm = 0.25; -var T3 = class { +var v3 = 0.5; +var T3 = 10; +var wm = 0.25; +var x3 = class { /** * @param {import("../proj/Projection.js").default} sourceProj Source projection. * @param {import("../proj/Projection.js").default} targetProj Target projection. @@ -83387,7 +83379,7 @@ var T3 = class { const C = E[0] + "/" + E[1]; return o[C] || (o[C] = l(E)), o[C]; }, this.maxSourceExtent_ = r, this.errorThresholdSquared_ = s * s, this.triangles_ = [], this.wrapsXInSource_ = false, this.canWrapXInSource_ = this.sourceProj_.canWrapX() && !!r && !!this.sourceProj_.getExtent() && Ui(r) >= Ui(this.sourceProj_.getExtent()), this.sourceWorldWidth_ = this.sourceProj_.getExtent() ? Ui(this.sourceProj_.getExtent()) : null, this.targetWorldWidth_ = this.targetProj_.getExtent() ? Ui(this.targetProj_.getExtent()) : null; - const c = Bn(i), h = ih(i), u = th(i), f = eh(i), d = this.transformInv_(c), p = this.transformInv_(h), g = this.transformInv_(u), m = this.transformInv_(f), v = v3 + (a ? Math.max( + const c = Bn(i), h = ih(i), u = th(i), f = eh(i), d = this.transformInv_(c), p = this.transformInv_(h), g = this.transformInv_(u), m = this.transformInv_(f), v = T3 + (a ? Math.max( 0, Math.ceil( Math.log2( @@ -83474,17 +83466,17 @@ var T3 = class { * @private */ addQuad_(e, t, i, r, s, a, o, l, c) { - const h = fm([s, a, o, l]), u = this.sourceWorldWidth_ ? Ui(h) / this.sourceWorldWidth_ : null, f = ( + const h = dm([s, a, o, l]), u = this.sourceWorldWidth_ ? Ui(h) / this.sourceWorldWidth_ : null, f = ( /** @type {number} */ this.sourceWorldWidth_ ), d = this.sourceProj_.canWrapX() && u > 0.5 && u < 1; let p = false; if (c > 0) { if (this.targetProj_.isGlobal() && this.targetWorldWidth_) { - const m = fm([e, t, i, r]); - p = Ui(m) / this.targetWorldWidth_ > Lm || p; + const m = dm([e, t, i, r]); + p = Ui(m) / this.targetWorldWidth_ > wm || p; } - !d && this.sourceProj_.isGlobal() && u && (p = u > Lm || p); + !d && this.sourceProj_.isGlobal() && u && (p = u > wm || p); } if (!p && this.maxSourceExtent_ && isFinite(h[0]) && isFinite(h[1]) && isFinite(h[2]) && isFinite(h[3]) && !Jo(h, this.maxSourceExtent_)) return; @@ -83582,24 +83574,24 @@ var T3 = class { }; var ru; var ya = []; -function wm(n4, e, t, i, r) { +function Um(n4, e, t, i, r) { n4.beginPath(), n4.moveTo(0, 0), n4.lineTo(e, t), n4.lineTo(i, r), n4.closePath(), n4.save(), n4.clip(), n4.fillRect(0, 0, Math.max(e, i) + 1, Math.max(t, r)), n4.restore(); } function su(n4, e) { return Math.abs(n4[e * 4] - 210) > 2 || Math.abs(n4[e * 4 + 3] - 0.75 * 255) > 2; } -function x3() { +function C3() { if (ru === void 0) { const n4 = Na(6, 6, ya); - n4.globalCompositeOperation = "lighter", n4.fillStyle = "rgba(210, 0, 0, 0.75)", wm(n4, 4, 5, 4, 0), wm(n4, 4, 5, 0, 5); + n4.globalCompositeOperation = "lighter", n4.fillStyle = "rgba(210, 0, 0, 0.75)", Um(n4, 4, 5, 4, 0), Um(n4, 4, 5, 0, 5); const e = n4.getImageData(0, 0, 3, 3).data; - ru = su(e, 0) || su(e, 4) || su(e, 8), ad(n4), ya.push(n4.canvas); + ru = su(e, 0) || su(e, 4) || su(e, 8), od(n4), ya.push(n4.canvas); } return ru; } -function Um(n4, e, t, i) { - const r = Qf(t, e, n4); - let s = xm( +function Vm(n4, e, t, i) { + const r = Jf(t, e, n4); + let s = Cm( e, i, t @@ -83609,22 +83601,22 @@ function Um(n4, e, t, i) { const o = n4.getMetersPerUnit(); o !== void 0 && (s /= o); const l = n4.getExtent(); - if (!l || Hf(l, r)) { - const c = xm(n4, s, r) / s; + if (!l || Kf(l, r)) { + const c = Cm(n4, s, r) / s; isFinite(c) && c > 0 && (s /= c); } return s; } -function C3(n4, e, t, i) { +function R3(n4, e, t, i) { const r = Mo(t); - let s = Um( + let s = Vm( n4, e, r, i ); return (!isFinite(s) || s <= 0) && ME(t, function(a) { - return s = Um( + return s = Vm( n4, e, a, @@ -83632,7 +83624,7 @@ function C3(n4, e, t, i) { ), isFinite(s) && s > 0; }), s; } -function R3(n4, e, t, i, r, s, a, o, l, c, h, u) { +function S3(n4, e, t, i, r, s, a, o, l, c, h, u) { const f = Na( Math.round(t * n4), Math.round(t * e), @@ -83647,7 +83639,7 @@ function R3(n4, e, t, i, r, s, a, o, l, c, h, u) { f.globalCompositeOperation = "lighter"; const p = Vn(); l.forEach(function(T, R, x) { - ew(p, T.extent); + tw(p, T.extent); }); const g = Ui(p), m = gs(p), v = Na( Math.round(t * g / i), @@ -83673,23 +83665,23 @@ function R3(n4, e, t, i, r, s, a, o, l, c, h, u) { const C = Bn(a); return o.getTriangles().forEach(function(T, R, x) { const S = T.source, M = T.target; - let N = S[0][0], F = S[0][1], L = S[1][0], K = S[1][1], q = S[2][0], j = S[2][1]; + let N = S[0][0], F = S[0][1], U = S[1][0], H = S[1][1], q = S[2][0], Z = S[2][1]; const k = d((M[0][0] - C[0]) / s), Q = d( -(M[0][1] - C[1]) / s ), ce = d((M[1][0] - C[0]) / s), de = d( -(M[1][1] - C[1]) / s - ), Z = d((M[2][0] - C[0]) / s), J = d( + ), j = d((M[2][0] - C[0]) / s), J = d( -(M[2][1] - C[1]) / s ), O = N, G = F; - N = 0, F = 0, L -= O, K -= G, q -= O, j -= G; + N = 0, F = 0, U -= O, H -= G, q -= O, Z -= G; const ee = [ - [L, K, 0, 0, ce - k], - [q, j, 0, 0, Z - k], - [0, 0, L, K, de - Q], - [0, 0, q, j, J - Q] - ], _e = ow(ee); + [U, H, 0, 0, ce - k], + [q, Z, 0, 0, j - k], + [0, 0, U, H, de - Q], + [0, 0, q, Z, J - Q] + ], _e = lw(ee); if (_e) { - if (f.save(), f.beginPath(), x3() || !u) { + if (f.save(), f.beginPath(), C3() || !u) { f.moveTo(ce, de); const Oe = 4, ze = k - ce, fe = Q - de; for (let Te = 0; Te < Oe; Te++) @@ -83700,9 +83692,9 @@ function R3(n4, e, t, i, r, s, a, o, l, c, h, u) { ce + d((Te + 1) * ze / Oe), de + d((Te + 1) * fe / (Oe - 1)) ); - f.lineTo(Z, J); + f.lineTo(j, J); } else - f.moveTo(ce, de), f.lineTo(k, Q), f.lineTo(Z, J); + f.moveTo(ce, de), f.lineTo(k, Q), f.lineTo(j, J); f.clip(), f.transform( _e[0], _e[2], @@ -83718,9 +83710,9 @@ function R3(n4, e, t, i, r, s, a, o, l, c, h, u) { -i / t ), f.drawImage(v.canvas, 0, 0), f.restore(); } - }), ad(v), ya.push(v.canvas), h && (f.save(), f.globalCompositeOperation = "source-over", f.strokeStyle = "black", f.lineWidth = 1, o.getTriangles().forEach(function(T, R, x) { - const S = T.target, M = (S[0][0] - C[0]) / s, N = -(S[0][1] - C[1]) / s, F = (S[1][0] - C[0]) / s, L = -(S[1][1] - C[1]) / s, K = (S[2][0] - C[0]) / s, q = -(S[2][1] - C[1]) / s; - f.beginPath(), f.moveTo(F, L), f.lineTo(M, N), f.lineTo(K, q), f.closePath(), f.stroke(); + }), od(v), ya.push(v.canvas), h && (f.save(), f.globalCompositeOperation = "source-over", f.strokeStyle = "black", f.lineWidth = 1, o.getTriangles().forEach(function(T, R, x) { + const S = T.target, M = (S[0][0] - C[0]) / s, N = -(S[0][1] - C[1]) / s, F = (S[1][0] - C[0]) / s, U = -(S[1][1] - C[1]) / s, H = (S[2][0] - C[0]) / s, q = -(S[2][1] - C[1]) / s; + f.beginPath(), f.moveTo(F, U), f.lineTo(M, N), f.lineTo(H, q), f.closePath(), f.stroke(); }), f.restore()), f.canvas; } var Du = class extends tv { @@ -83754,7 +83746,7 @@ var Du = class extends tv { v && (g ? g = fo(g, v) : g = v); const E = r.getResolution( this.wrappedTileCoord_[0] - ), C = C3( + ), C = R3( e, i, m, @@ -83764,8 +83756,8 @@ var Du = class extends tv { this.state = Qe.EMPTY; return; } - const T = h !== void 0 ? h : E3; - if (this.triangulation_ = new T3( + const T = h !== void 0 ? h : v3; + if (this.triangulation_ = new x3( e, i, m, @@ -83826,7 +83818,7 @@ var Du = class extends tv { ), l = this.targetTileGrid_.getTileCoordExtent( this.wrappedTileCoord_ ); - this.canvas_ = R3( + this.canvas_ = S3( r, s, this.pixelRatio_, @@ -83880,10 +83872,10 @@ var Du = class extends tv { * Remove from the cache due to expiry */ release() { - this.canvas_ && (ad(this.canvas_.getContext("2d")), ya.push(this.canvas_), this.canvas_ = null), super.release(); + this.canvas_ && (od(this.canvas_.getContext("2d")), ya.push(this.canvas_), this.canvas_ = null), super.release(); } }; -var hd = class { +var ud = class { /** * @param {number} minX Minimum X. * @param {number} maxX Maximum X. @@ -83955,14 +83947,14 @@ var hd = class { } }; function ra(n4, e, t, i, r) { - return r !== void 0 ? (r.minX = n4, r.maxX = e, r.minY = t, r.maxY = i, r) : new hd(n4, e, t, i); + return r !== void 0 ? (r.minX = n4, r.maxX = e, r.minY = t, r.maxY = i, r) : new ud(n4, e, t, i); } -var S3 = class extends g3 { +var y3 = class extends m3 { /** * @param {LayerType} tileLayer Tile layer. */ constructor(e) { - super(e), this.extentChanged = true, this.renderedExtent_ = null, this.renderedPixelRatio, this.renderedProjection = null, this.renderedRevision, this.renderedTiles = [], this.newTiles_ = false, this.tmpExtent = Vn(), this.tmpTileRange_ = new hd(0, 0, 0, 0); + super(e), this.extentChanged = true, this.renderedExtent_ = null, this.renderedPixelRatio, this.renderedProjection = null, this.renderedRevision, this.renderedTiles = [], this.newTiles_ = false, this.tmpExtent = Vn(), this.tmpTileRange_ = new ud(0, 0, 0, 0); } /** * @protected @@ -83997,7 +83989,7 @@ var S3 = class extends g3 { t.pixelToCoordinateTransform, e.slice() ), s = i.getExtent(); - if (s && !Hf(s, r)) + if (s && !Kf(s, r)) return null; const a = t.pixelRatio, o = t.viewState.projection, l = t.viewState, c = i.getRenderSource(), h = c.getTileGridForProjection(l.projection), u = c.getTilePixelRatio(t.pixelRatio); for (let f = h.getZForResolution(l.resolution); f >= h.getMinZoom(); --f) { @@ -84061,13 +84053,13 @@ var S3 = class extends g3 { o[1] + S ], N = d.getTileRangeForExtentAndZ(m, p), F = {}; F[p] = {}; - const L = this.createLoadedTileFinder( + const U = this.createLoadedTileFinder( u, s, F - ), K = this.tmpExtent, q = this.tmpTileRange_; + ), H = this.tmpExtent, q = this.tmpTileRange_; this.newTiles_ = false; - const j = l ? yu( + const Z = l ? yu( r.center, v, l, @@ -84075,11 +84067,11 @@ var S3 = class extends g3 { ) : void 0; for (let ee = N.minX; ee <= N.maxX; ++ee) for (let _e = N.minY; _e <= N.maxY; ++_e) { - if (l && !d.tileCoordIntersectsViewport([p, ee, _e], j)) + if (l && !d.tileCoordIntersectsViewport([p, ee, _e], Z)) continue; const Oe = this.getTile(p, ee, _e, e); if (this.isDrawableTile(Oe)) { - const Te = ur(this); + const Te = fr(this); if (Oe.getState() == Qe.LOADED) { F[p][Oe.tileCoord.toString()] = Oe; let Fe = Oe.inTransition(Te); @@ -84091,14 +84083,14 @@ var S3 = class extends g3 { const ze = d.getTileCoordChildTileRange( Oe.tileCoord, q, - K + H ); let fe = false; - ze && (fe = L(p + 1, ze)), fe || d.forEachTileCoordParentTileRange( + ze && (fe = U(p + 1, ze)), fe || d.forEachTileCoordParentTileRange( Oe.tileCoord, - L, + U, q, - K + H ); } const k = g / a * c / E; @@ -84112,7 +84104,7 @@ var S3 = class extends g3 { -C / 2, -T / 2 ); - const Q = Y2(this.pixelTransform); + const Q = Z2(this.pixelTransform); this.useContainer(t, Q, this.getBackground(e)); const ce = this.context, de = ce.canvas; yE(this.inversePixelTransform, this.pixelTransform), Ao( @@ -84125,12 +84117,12 @@ var S3 = class extends g3 { -C / 2, -T / 2 ), de.width != C || de.height != T ? (de.width = C, de.height = T) : this.containerReused || ce.clearRect(0, 0, C, T), R && this.clipUnrotated(ce, e, R), u.getInterpolate() || (ce.imageSmoothingEnabled = false), this.preRender(ce, e), this.renderedTiles.length = 0; - let Z = Object.keys(F).map(Number); - Z.sort(Wf); + let j = Object.keys(F).map(Number); + j.sort(Gf); let J, O, G; - i.opacity === 1 && (!this.containerReused || u.getOpaque(e.viewState.projection)) ? Z = Z.reverse() : (J = [], O = []); - for (let ee = Z.length - 1; ee >= 0; --ee) { - const _e = Z[ee], Oe = u.getTilePixelSize( + i.opacity === 1 && (!this.containerReused || u.getOpaque(e.viewState.projection)) ? j = j.reverse() : (J = [], O = []); + for (let ee = j.length - 1; ee >= 0; --ee) { + const _e = j[ee], Oe = u.getTilePixelSize( _e, c, s @@ -84145,27 +84137,27 @@ var S3 = class extends g3 { const Ct = ( /** @type {import("../../ImageTile.js").default} */ lt[Ut] - ), Bi = Ct.tileCoord, hi = Se[1] - Bi[1], Es = Math.round(ue[0] - (hi - 1) * Te), Ur = Se[2] - Bi[2], vs = Math.round(ue[1] - (Ur - 1) * Fe), ki = Math.round(ue[0] - hi * Te), lr = Math.round(ue[1] - Ur * Fe), Rr = Es - ki, Sr = vs - lr, Ts = p === _e, xs = Ts && Ct.getAlpha(ur(this), e.time) !== 1; + ), Bi = Ct.tileCoord, hi = Se[1] - Bi[1], Es = Math.round(ue[0] - (hi - 1) * Te), Vr = Se[2] - Bi[2], vs = Math.round(ue[1] - (Vr - 1) * Fe), ki = Math.round(ue[0] - hi * Te), cr = Math.round(ue[1] - Vr * Fe), Rr = Es - ki, Sr = vs - cr, Ts = p === _e, xs = Ts && Ct.getAlpha(fr(this), e.time) !== 1; let yr = false; if (!xs) if (J) { - G = [ki, lr, ki + Rr, lr, ki + Rr, lr + Sr, ki, lr + Sr]; - for (let Vr = 0, pn = J.length; Vr < pn; ++Vr) - if (p !== _e && _e < O[Vr]) { - const Mi = J[Vr]; + G = [ki, cr, ki + Rr, cr, ki + Rr, cr + Sr, ki, cr + Sr]; + for (let Br = 0, gn = J.length; Br < gn; ++Br) + if (p !== _e && _e < O[Br]) { + const Mi = J[Br]; Jo( - [ki, lr, ki + Rr, lr + Sr], + [ki, cr, ki + Rr, cr + Sr], [Mi[0], Mi[3], Mi[4], Mi[7]] ) && (yr || (ce.save(), yr = true), ce.beginPath(), ce.moveTo(G[0], G[1]), ce.lineTo(G[2], G[3]), ce.lineTo(G[4], G[5]), ce.lineTo(G[6], G[7]), ce.moveTo(Mi[6], Mi[7]), ce.lineTo(Mi[4], Mi[5]), ce.lineTo(Mi[2], Mi[3]), ce.lineTo(Mi[0], Mi[1]), ce.clip()); } J.push(G), O.push(_e); } else - ce.clearRect(ki, lr, Rr, Sr); + ce.clearRect(ki, cr, Rr, Sr); this.drawTileImage( Ct, e, ki, - lr, + cr, Rr, Sr, Ye, @@ -84198,7 +84190,7 @@ var S3 = class extends g3 { const c = this.getTileImage(e); if (!c) return; - const h = ur(this), u = t.layerStatesArray[t.layerIndex], f = u.opacity * (l ? e.getAlpha(h, t.time) : 1), d = f !== this.context.globalAlpha; + const h = fr(this), u = t.layerStatesArray[t.layerIndex], f = u.opacity * (l ? e.getAlpha(h, t.time) : 1), d = f !== this.context.globalAlpha; d && (this.context.save(), this.context.globalAlpha = f), this.context.drawImage( c, o, @@ -84235,7 +84227,7 @@ var S3 = class extends g3 { scheduleExpireCache(e, t) { if (t.canExpireCache()) { const i = (function(r, s, a) { - const o = ur(r); + const o = fr(r); o in a.usedTiles && r.expireCache( a.viewState.projection, a.usedTiles[o] @@ -84254,7 +84246,7 @@ var S3 = class extends g3 { * @protected */ updateUsedTiles(e, t, i) { - const r = ur(t); + const r = fr(t); r in e || (e[r] = {}), e[r][i.getKey()] = true; } /** @@ -84276,7 +84268,7 @@ var S3 = class extends g3 { * @protected */ manageTilePyramid(e, t, i, r, s, a, o, l, c) { - const h = ur(t); + const h = fr(t); h in e.wantedTiles || (e.wantedTiles[h] = {}); const u = e.wantedTiles[h], f = e.tileQueue, d = i.getMinZoom(), p = e.viewState.rotation, g = p ? yu( e.viewState.center, @@ -84297,7 +84289,7 @@ var S3 = class extends g3 { t.updateCacheSize(m, s); } }; -var y3 = class extends f3 { +var I3 = class extends d3 { /** * @param {import("./BaseTile.js").Options} [options] Tile layer options. */ @@ -84305,11 +84297,11 @@ var y3 = class extends f3 { super(e); } createRenderer() { - return new S3(this); + return new y3(this); } }; -var rv = y3; -var I3 = class { +var rv = I3; +var b3 = class { /** * @param {number} [highWaterMark] High water mark. */ @@ -84467,7 +84459,7 @@ var I3 = class { this.highWaterMark = e; } }; -function Vm(n4, e, t, i) { +function Bm(n4, e, t, i) { return i !== void 0 ? (i[0] = n4, i[1] = e, i[2] = t, i) : [n4, e, t]; } function sh(n4, e, t) { @@ -84476,20 +84468,20 @@ function sh(n4, e, t) { function sv(n4) { return sh(n4[0], n4[1], n4[2]); } -function b3(n4) { +function A3(n4) { return n4.split("/").map(Number); } -function A3(n4) { +function M3(n4) { return (n4[1] << n4[0]) + n4[2]; } -function M3(n4, e) { +function P3(n4, e) { const t = n4[0], i = n4[1], r = n4[2]; if (e.getMinZoom() > t || t > e.getMaxZoom()) return false; const s = e.getFullTileRange(t); return s ? s.containsXY(i, r) : true; } -var nv = class extends I3 { +var nv = class extends b3 { clear() { for (; this.getCount() > 0; ) this.pop().release(); @@ -84508,7 +84500,7 @@ var nv = class extends I3 { pruneExceptNewestZ() { if (this.getCount() === 0) return; - const e = this.peekFirstKey(), i = b3(e)[0]; + const e = this.peekFirstKey(), i = A3(e)[0]; this.forEach((r) => { r.tileCoord[0] !== i && (this.remove(sv(r.tileCoord)), r.release()); }); @@ -84537,12 +84529,12 @@ var nu = { */ TILELOADERROR: "tileloaderror" }; -var P3 = class extends Ws { +var O3 = class extends Ws { /** * @param {Options} options Source options. */ constructor(e) { - super(), this.projection = Fr(e.projection), this.attributions_ = Bm(e.attributions), this.attributionsCollapsible_ = e.attributionsCollapsible !== void 0 ? e.attributionsCollapsible : true, this.loading = false, this.state_ = e.state !== void 0 ? e.state : "ready", this.wrapX_ = e.wrapX !== void 0 ? e.wrapX : false, this.interpolate_ = !!e.interpolate, this.viewResolver = null, this.viewRejector = null; + super(), this.projection = Lr(e.projection), this.attributions_ = km(e.attributions), this.attributionsCollapsible_ = e.attributionsCollapsible !== void 0 ? e.attributionsCollapsible : true, this.loading = false, this.state_ = e.state !== void 0 ? e.state : "ready", this.wrapX_ = e.wrapX !== void 0 ? e.wrapX : false, this.interpolate_ = !!e.interpolate, this.viewResolver = null, this.viewRejector = null; const t = this; this.viewPromise_ = new Promise(function(i, r) { t.viewResolver = i, t.viewRejector = r; @@ -84619,7 +84611,7 @@ var P3 = class extends Ws { * @api */ setAttributions(e) { - this.attributions_ = Bm(e), this.changed(); + this.attributions_ = km(e), this.changed(); } /** * Set the state of the source. @@ -84629,7 +84621,7 @@ var P3 = class extends Ws { this.state_ = e, this.changed(); } }; -function Bm(n4) { +function km(n4) { return n4 ? Array.isArray(n4) ? function(e) { return n4; } : typeof n4 == "function" ? n4 : function(e) { @@ -84638,13 +84630,13 @@ function Bm(n4) { } var sa = [0, 0, 0]; var Qs = 5; -var O3 = class { +var D3 = class { /** * @param {Options} options Tile grid options. */ constructor(e) { this.minZoom = e.minZoom !== void 0 ? e.minZoom : 0, this.resolutions_ = e.resolutions, Kt( - U2( + V2( this.resolutions_, function(r, s) { return s - r; @@ -84668,11 +84660,11 @@ var O3 = class { i !== void 0 && !this.origin_ && !this.origins_ && (this.origin_ = Bn(i)), Kt( !this.origin_ && this.origins_ || this.origin_ && !this.origins_, 18 - ), this.tileSizes_ = null, e.tileSizes !== void 0 && (this.tileSizes_ = e.tileSizes, Kt(this.tileSizes_.length == this.resolutions_.length, 19)), this.tileSize_ = e.tileSize !== void 0 ? e.tileSize : this.tileSizes_ ? null : Kf, Kt( + ), this.tileSizes_ = null, e.tileSizes !== void 0 && (this.tileSizes_ = e.tileSizes, Kt(this.tileSizes_.length == this.resolutions_.length, 19)), this.tileSize_ = e.tileSize !== void 0 ? e.tileSize : this.tileSizes_ ? null : qf, Kt( !this.tileSize_ && this.tileSizes_ || this.tileSize_ && !this.tileSizes_, 22 ), this.extent_ = i !== void 0 ? i : null, this.fullTileRanges_ = null, this.tmpSize_ = [0, 0], this.tmpExtent_ = [0, 0, 0, 0], e.sizes !== void 0 ? this.fullTileRanges_ = e.sizes.map(function(r, s) { - const a = new hd( + const a = new ud( Math.min(0, r[0]), Math.max(r[0] - 1, -1), Math.min(0, r[1]), @@ -84900,7 +84892,7 @@ var O3 = class { getTileCoordForXYAndResolution_(e, t, i, r, s) { const a = this.getZForResolution(i), o = i / this.getResolution(a), l = this.getOrigin(a), c = sn(this.getTileSize(a), this.tmpSize_); let h = o * (e - l[0]) / i / c[0], u = o * (l[1] - t) / i / c[1]; - return r ? (h = xl(h, Qs) - 1, u = xl(u, Qs) - 1) : (h = Tl(h, Qs), u = Tl(u, Qs)), Vm(a, h, u, s); + return r ? (h = xl(h, Qs) - 1, u = xl(u, Qs) - 1) : (h = Tl(h, Qs), u = Tl(u, Qs)), Bm(a, h, u, s); } /** * Although there is repetition between this method and `getTileCoordForXYAndResolution_`, @@ -84920,7 +84912,7 @@ var O3 = class { getTileCoordForXYAndZ_(e, t, i, r, s) { const a = this.getOrigin(i), o = this.getResolution(i), l = sn(this.getTileSize(i), this.tmpSize_); let c = (e - a[0]) / o / l[0], h = (a[1] - t) / o / l[1]; - return r ? (c = xl(c, Qs) - 1, h = xl(h, Qs) - 1) : (c = Tl(c, Qs), h = Tl(h, Qs)), Vm(i, c, h, s); + return r ? (c = xl(c, Qs) - 1, h = xl(h, Qs) - 1) : (c = Tl(c, Qs), h = Tl(h, Qs)), Bm(i, c, h, s); } /** * Get a tile coordinate given a map coordinate and zoom level. @@ -84982,7 +84974,7 @@ var O3 = class { * @api */ getZForResolution(e, t) { - const i = Gf( + const i = Xf( this.resolutions_, e, t || 0 @@ -85015,14 +85007,14 @@ var O3 = class { this.fullTileRanges_ = i; } }; -var av = O3; +var av = D3; function ov(n4) { let e = n4.getDefaultTileGrid(); - return e || (e = L3(n4), n4.setDefaultTileGrid(e)), e; + return e || (e = w3(n4), n4.setDefaultTileGrid(e)), e; } -function D3(n4, e, t) { - const i = e[0], r = n4.getTileCoordCenter(e), s = ud(t); - if (!Hf(s, r)) { +function N3(n4, e, t) { + const i = e[0], r = n4.getTileCoordCenter(e), s = fd(t); + if (!Kf(s, r)) { const a = Ui(s), o = Math.ceil( (s[0] - r[0]) / a ); @@ -85030,18 +85022,18 @@ function D3(n4, e, t) { } return e; } -function N3(n4, e, t, i) { +function F3(n4, e, t, i) { i = i !== void 0 ? i : "top-left"; const r = lv(n4, e, t); return new av({ extent: n4, - origin: iw(n4, i), + origin: rw(n4, i), resolutions: r, tileSize: t }); } -function F3(n4) { - const e = n4 || {}, t = e.extent || Fr("EPSG:3857").getExtent(), i = { +function L3(n4) { + const e = n4 || {}, t = e.extent || Lr("EPSG:3857").getExtent(), i = { extent: t, minZoom: e.minZoom, tileSize: e.tileSize, @@ -85055,7 +85047,7 @@ function F3(n4) { return new av(i); } function lv(n4, e, t, i) { - e = e !== void 0 ? e : _w, t = sn(t !== void 0 ? t : Kf); + e = e !== void 0 ? e : Ew, t = sn(t !== void 0 ? t : qf); const r = gs(n4), s = Ui(n4); i = i > 0 ? i : Math.max(s / t[0], r / t[1]); const a = e + 1, o = new Array(a); @@ -85063,12 +85055,12 @@ function lv(n4, e, t, i) { o[l] = i / Math.pow(2, l); return o; } -function L3(n4, e, t, i) { - const r = ud(n4); - return N3(r, e, t, i); +function w3(n4, e, t, i) { + const r = fd(n4); + return F3(r, e, t, i); } -function ud(n4) { - n4 = Fr(n4); +function fd(n4) { + n4 = Lr(n4); let e = n4.getExtent(); if (!e) { const t = 180 * Po.degrees / n4.getMetersPerUnit(); @@ -85076,7 +85068,7 @@ function ud(n4) { } return e; } -var w3 = class extends P3 { +var U3 = class extends O3 { /** * @param {Options} options SourceTile source options. */ @@ -85224,7 +85216,7 @@ var w3 = class extends P3 { */ getTilePixelSize(e, t, i) { const r = this.getTileGridForProjection(i), s = this.getTilePixelRatio(t), a = sn(r.getTileSize(e), this.tmpSize); - return s == 1 ? a : h3(a, s, this.tmpSize); + return s == 1 ? a : u3(a, s, this.tmpSize); } /** * Returns a tile coordinate wrapped around the x-axis. When the tile coordinate @@ -85238,7 +85230,7 @@ var w3 = class extends P3 { getTileCoordForTileUrlFunction(e, t) { t = t !== void 0 ? t : this.getProjection(); const i = this.getTileGridForProjection(t); - return this.getWrapX() && t.isGlobal() && (e = D3(i, e, t)), M3(e, i) ? e : null; + return this.getWrapX() && t.isGlobal() && (e = N3(i, e, t)), P3(e, i) ? e : null; } /** * Remove all cached tiles from the source. The next render cycle will fetch new tiles. @@ -85270,7 +85262,7 @@ var w3 = class extends P3 { useTile(e, t, i, r) { } }; -var U3 = class extends dn { +var V3 = class extends pn { /** * @param {string} type Type. * @param {import("../Tile.js").default} tile The tile. @@ -85279,7 +85271,7 @@ var U3 = class extends dn { super(e), this.tile = t; } }; -function V3(n4, e) { +function B3(n4, e) { const t = /\{z\}/g, i = /\{x\}/g, r = /\{y\}/g, s = /\{-y\}/g; return ( /** @@ -85297,13 +85289,13 @@ function V3(n4, e) { } ); } -function B3(n4, e) { +function k3(n4, e) { const t = n4.length, i = new Array(t); for (let r = 0; r < t; ++r) - i[r] = V3(n4[r], e); - return k3(i); + i[r] = B3(n4[r], e); + return z3(i); } -function k3(n4) { +function z3(n4) { return n4.length === 1 ? n4[0] : ( /** * @param {import("./tilecoord.js").TileCoord} tileCoord Tile Coordinate. @@ -85314,12 +85306,12 @@ function k3(n4) { function(e, t, i) { if (!e) return; - const r = A3(e), s = Ra(r, n4.length); + const r = M3(e), s = Ra(r, n4.length); return n4[s](e, t, i); } ); } -function z3(n4) { +function W3(n4) { const e = []; let t = /\{([a-z])-([a-z])\}/.exec(n4); if (t) { @@ -85337,7 +85329,7 @@ function z3(n4) { } return e.push(n4), e; } -var fd = class _fd extends w3 { +var dd = class _dd extends U3 { /** * @param {Options} options Image tile options. */ @@ -85356,7 +85348,7 @@ var fd = class _fd extends w3 { key: e.key, attributionsCollapsible: e.attributionsCollapsible, zDirection: e.zDirection - }), this.generateTileUrlFunction_ = this.tileUrlFunction === _fd.prototype.tileUrlFunction, this.tileLoadFunction = e.tileLoadFunction, e.tileUrlFunction && (this.tileUrlFunction = e.tileUrlFunction), this.urls = null, e.urls ? this.setUrls(e.urls) : e.url && this.setUrl(e.url), this.tileLoadingKeys_ = {}; + }), this.generateTileUrlFunction_ = this.tileUrlFunction === _dd.prototype.tileUrlFunction, this.tileLoadFunction = e.tileLoadFunction, e.tileUrlFunction && (this.tileUrlFunction = e.tileUrlFunction), this.urls = null, e.urls ? this.setUrls(e.urls) : e.url && this.setUrl(e.url), this.tileLoadingKeys_ = {}; } /** * Return the tile load function of the source. @@ -85393,9 +85385,9 @@ var fd = class _fd extends w3 { const t = ( /** @type {import("../Tile.js").default} */ e.target - ), i = ur(t), r = t.getState(); + ), i = fr(t), r = t.getState(); let s; - r == Qe.LOADING ? (this.tileLoadingKeys_[i] = true, s = nu.TILELOADSTART) : i in this.tileLoadingKeys_ && (delete this.tileLoadingKeys_[i], s = r == Qe.ERROR ? nu.TILELOADERROR : r == Qe.LOADED ? nu.TILELOADEND : void 0), s != null && this.dispatchEvent(new U3(s, t)); + r == Qe.LOADING ? (this.tileLoadingKeys_[i] = true, s = nu.TILELOADSTART) : i in this.tileLoadingKeys_ && (delete this.tileLoadingKeys_[i], s = r == Qe.ERROR ? nu.TILELOADERROR : r == Qe.LOADED ? nu.TILELOADEND : void 0), s != null && this.dispatchEvent(new V3(s, t)); } /** * Set the tile load function of the source. @@ -85420,7 +85412,7 @@ var fd = class _fd extends w3 { * @api */ setUrl(e) { - const t = z3(e); + const t = W3(e); this.urls = t, this.setUrls(t); } /** @@ -85432,7 +85424,7 @@ var fd = class _fd extends w3 { this.urls = e; const t = e.join(` `); - this.generateTileUrlFunction_ ? this.setTileUrlFunction(B3(e, this.tileGrid), t) : this.setKey(t); + this.generateTileUrlFunction_ ? this.setTileUrlFunction(k3(e, this.tileGrid), t) : this.setKey(t); } /** * @param {import("../tilecoord.js").TileCoord} tileCoord Tile coordinate. @@ -85453,7 +85445,7 @@ var fd = class _fd extends w3 { this.tileCache.containsKey(r) && this.tileCache.get(r); } }; -var W3 = class extends fd { +var G3 = class extends dd { /** * @param {!Options} options Image tile options. */ @@ -85465,7 +85457,7 @@ var W3 = class extends fd { projection: e.projection, state: e.state, tileGrid: e.tileGrid, - tileLoadFunction: e.tileLoadFunction ? e.tileLoadFunction : G3, + tileLoadFunction: e.tileLoadFunction ? e.tileLoadFunction : X3, tilePixelRatio: e.tilePixelRatio, tileUrlFunction: e.tileUrlFunction, url: e.url, @@ -85539,7 +85531,7 @@ var W3 = class extends fd { const t = this.getProjection(); if (this.tileGrid && (!t || aa(t, e))) return this.tileGrid; - const i = ur(e); + const i = fr(e); return i in this.tileGridForProjection || (this.tileGridForProjection[i] = ov(e)), this.tileGridForProjection[i]; } /** @@ -85550,7 +85542,7 @@ var W3 = class extends fd { const t = this.getProjection(); if (!t || aa(t, e)) return this.tileCache; - const i = ur(e); + const i = fr(e); return i in this.tileCacheForProjection || (this.tileCacheForProjection[i] = new nv( this.tileCache.highWaterMark )), this.tileCacheForProjection[i]; @@ -85669,9 +85661,9 @@ var W3 = class extends fd { * @api */ setTileGridForProjection(e, t) { - const i = Fr(e); + const i = Lr(e); if (i) { - const r = ur(i); + const r = fr(i); r in this.tileGridForProjection || (this.tileGridForProjection[r] = t); } } @@ -85681,17 +85673,17 @@ var W3 = class extends fd { this.tileCacheForProjection[e].clear(); } }; -function G3(n4, e) { +function X3(n4, e) { n4.getImage().src = e; } -var X3 = class extends W3 { +var H3 = class extends G3 { /** * @param {Options} [options] XYZ options. */ constructor(e) { e = e || {}; - const t = e.projection !== void 0 ? e.projection : "EPSG:3857", i = e.tileGrid !== void 0 ? e.tileGrid : F3({ - extent: ud(t), + const t = e.projection !== void 0 ? e.projection : "EPSG:3857", i = e.tileGrid !== void 0 ? e.tileGrid : L3({ + extent: fd(t), maxResolution: e.maxResolution, maxZoom: e.maxZoom, minZoom: e.minZoom, @@ -85724,19 +85716,19 @@ var X3 = class extends W3 { return this.gutter_; } }; -var H3 = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}; +var K3 = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}; function cv(n4) { return n4 && n4.__esModule && Object.prototype.hasOwnProperty.call(n4, "default") ? n4.default : n4; } -var K3 = '© OpenStreetMap contributors.'; -var q3 = class extends X3 { +var q3 = '© OpenStreetMap contributors.'; +var Y3 = class extends H3 { /** * @param {Options} [options] Open Street Map options. */ constructor(e) { e = e || {}; let t; - e.attributions !== void 0 ? t = e.attributions : t = [K3]; + e.attributions !== void 0 ? t = e.attributions : t = [q3]; const i = e.crossOrigin !== void 0 ? e.crossOrigin : "anonymous", r = e.url !== void 0 ? e.url : "https://tile.openstreetmap.org/{z}/{x}/{y}.png"; super({ attributions: t, @@ -85755,8 +85747,8 @@ var q3 = class extends X3 { }); } }; -var hv = q3; -var Y3 = class { +var hv = Y3; +var Z3 = class { constructor(e, t, i, r, s, a) { this.name = e, this.scene = a, this.layers = t, this.target = "globe", this.view = i, this.resolution = r, this.diameter = s, this.container = this.createContainer(), this.map = this.createOLMap(), this.texture = this.createTexture(), this.context = this.texture.getContext(), this.mesh = this.createMesh(), this.lonLatToVector3 = this.createScales; } @@ -85794,26 +85786,26 @@ var Y3 = class { return new Vector3(s, o, a); } }; -function Ik(n4, e = {}, t) { +function bk(n4, e = {}, t) { const i = e.layers || [ new rv({ source: new hv(), extent: [-180, -90, 180, 90] }) - ], r = e.view || new jr({ + ], r = e.view || new Qr({ projection: "EPSG:4326", extent: [-180, -90, 180, 90], center: [0, 0], zoom: 0 }), s = e.resolution || new Vector2(1e3, 500), a = e.diameter || 1; - return new Y3(n4, i, r, s, a, t); + return new Z3(n4, i, r, s, a, t); } function Yl(n4, e) { return n4 == null || e == null ? NaN : n4 < e ? -1 : n4 > e ? 1 : n4 >= e ? 0 : NaN; } -function Z3(n4, e) { +function j3(n4, e) { return n4 == null || e == null ? NaN : e < n4 ? -1 : e > n4 ? 1 : e >= n4 ? 0 : NaN; } function uv(n4) { let e, t, i; - n4.length !== 2 ? (e = Yl, t = (o, l) => Yl(n4(o), l), i = (o, l) => n4(o) - l) : (e = n4 === Yl || n4 === Z3 ? n4 : j3, t = n4, i = n4); + n4.length !== 2 ? (e = Yl, t = (o, l) => Yl(n4(o), l), i = (o, l) => n4(o) - l) : (e = n4 === Yl || n4 === j3 ? n4 : Q3, t = n4, i = n4); function r(o, l, c = 0, h = o.length) { if (c < h) { if (e(l, l) !== 0) @@ -85842,16 +85834,16 @@ function uv(n4) { } return { left: r, center: a, right: s }; } -function j3() { +function Q3() { return 0; } -function Q3(n4) { +function J3(n4) { return n4 === null ? NaN : +n4; } -var J3 = uv(Yl); -var $3 = J3.right; -uv(Q3).center; -var eV = class { +var $3 = uv(Yl); +var eV = $3.right; +uv(J3).center; +var tV = class { constructor() { this._partials = new Float64Array(32), this._n = 0; } @@ -85875,15 +85867,15 @@ var eV = class { return a; } }; -var tV = Math.sqrt(50); -var iV = Math.sqrt(10); -var rV = Math.sqrt(2); +var iV = Math.sqrt(50); +var rV = Math.sqrt(10); +var sV = Math.sqrt(2); function _c(n4, e, t) { - const i = (e - n4) / Math.max(0, t), r = Math.floor(Math.log10(i)), s = i / Math.pow(10, r), a = s >= tV ? 10 : s >= iV ? 5 : s >= rV ? 2 : 1; + const i = (e - n4) / Math.max(0, t), r = Math.floor(Math.log10(i)), s = i / Math.pow(10, r), a = s >= iV ? 10 : s >= rV ? 5 : s >= sV ? 2 : 1; let o, l, c; return r < 0 ? (c = Math.pow(10, -r) / a, o = Math.round(n4 * c), l = Math.round(e * c), o / c < n4 && ++o, l / c > e && --l, c = -c) : (c = Math.pow(10, r) * a, o = Math.round(n4 / c), l = Math.round(e / c), o * c < n4 && ++o, l * c > e && --l), l < o && 0.5 <= t && t < 2 ? _c(n4, e, t * 2) : [o, l, c]; } -function sV(n4, e, t) { +function nV(n4, e, t) { if (e = +e, n4 = +n4, t = +t, !(t > 0)) return []; if (n4 === e) @@ -85910,19 +85902,19 @@ function sV(n4, e, t) { function Nu(n4, e, t) { return e = +e, n4 = +n4, t = +t, _c(n4, e, t)[2]; } -function nV(n4, e, t) { +function aV(n4, e, t) { e = +e, n4 = +n4, t = +t; const i = e < n4, r = i ? Nu(e, n4, t) : Nu(n4, e, t); return (i ? -1 : 1) * (r < 0 ? 1 / -r : r); } -function* aV(n4) { +function* oV(n4) { for (const e of n4) yield* e; } function fv(n4) { - return Array.from(aV(n4)); + return Array.from(oV(n4)); } -function oV(n4, e) { +function lV(n4, e) { switch (arguments.length) { case 0: break; @@ -85935,7 +85927,7 @@ function oV(n4, e) { } return this; } -function dd(n4, e, t) { +function pd(n4, e, t) { n4.prototype = e.prototype = t, t.constructor = n4; } function dv(n4, e) { @@ -85951,14 +85943,14 @@ var Ec = 1 / Fo; var Ia = "\\s*([+-]?\\d+)\\s*"; var Lo = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*"; var ds = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*"; -var lV = /^#([0-9a-f]{3,8})$/; -var cV = new RegExp(`^rgb\\(${Ia},${Ia},${Ia}\\)$`); -var hV = new RegExp(`^rgb\\(${ds},${ds},${ds}\\)$`); -var uV = new RegExp(`^rgba\\(${Ia},${Ia},${Ia},${Lo}\\)$`); -var fV = new RegExp(`^rgba\\(${ds},${ds},${ds},${Lo}\\)$`); -var dV = new RegExp(`^hsl\\(${Lo},${ds},${ds}\\)$`); -var pV = new RegExp(`^hsla\\(${Lo},${ds},${ds},${Lo}\\)$`); -var km = { +var cV = /^#([0-9a-f]{3,8})$/; +var hV = new RegExp(`^rgb\\(${Ia},${Ia},${Ia}\\)$`); +var uV = new RegExp(`^rgb\\(${ds},${ds},${ds}\\)$`); +var fV = new RegExp(`^rgba\\(${Ia},${Ia},${Ia},${Lo}\\)$`); +var dV = new RegExp(`^rgba\\(${ds},${ds},${ds},${Lo}\\)$`); +var pV = new RegExp(`^hsl\\(${Lo},${ds},${ds}\\)$`); +var gV = new RegExp(`^hsla\\(${Lo},${ds},${ds},${Lo}\\)$`); +var zm = { aliceblue: 15792383, antiquewhite: 16444375, aqua: 65535, @@ -86108,124 +86100,124 @@ var km = { yellow: 16776960, yellowgreen: 10145074 }; -dd(rl, wo, { +pd(rl, wo, { copy(n4) { return Object.assign(new this.constructor(), this, n4); }, displayable() { return this.rgb().displayable(); }, - hex: zm, + hex: Wm, // Deprecated! Use color.formatHex. - formatHex: zm, - formatHex8: gV, - formatHsl: mV, - formatRgb: Wm, - toString: Wm + formatHex: Wm, + formatHex8: mV, + formatHsl: _V, + formatRgb: Gm, + toString: Gm }); -function zm() { +function Wm() { return this.rgb().formatHex(); } -function gV() { +function mV() { return this.rgb().formatHex8(); } -function mV() { +function _V() { return pv(this).formatHsl(); } -function Wm() { +function Gm() { return this.rgb().formatRgb(); } function wo(n4) { var e, t; - return n4 = (n4 + "").trim().toLowerCase(), (e = lV.exec(n4)) ? (t = e[1].length, e = parseInt(e[1], 16), t === 6 ? Gm(e) : t === 3 ? new dr(e >> 8 & 15 | e >> 4 & 240, e >> 4 & 15 | e & 240, (e & 15) << 4 | e & 15, 1) : t === 8 ? bl(e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, (e & 255) / 255) : t === 4 ? bl(e >> 12 & 15 | e >> 8 & 240, e >> 8 & 15 | e >> 4 & 240, e >> 4 & 15 | e & 240, ((e & 15) << 4 | e & 15) / 255) : null) : (e = cV.exec(n4)) ? new dr(e[1], e[2], e[3], 1) : (e = hV.exec(n4)) ? new dr(e[1] * 255 / 100, e[2] * 255 / 100, e[3] * 255 / 100, 1) : (e = uV.exec(n4)) ? bl(e[1], e[2], e[3], e[4]) : (e = fV.exec(n4)) ? bl(e[1] * 255 / 100, e[2] * 255 / 100, e[3] * 255 / 100, e[4]) : (e = dV.exec(n4)) ? Km(e[1], e[2] / 100, e[3] / 100, 1) : (e = pV.exec(n4)) ? Km(e[1], e[2] / 100, e[3] / 100, e[4]) : km.hasOwnProperty(n4) ? Gm(km[n4]) : n4 === "transparent" ? new dr(NaN, NaN, NaN, 0) : null; + return n4 = (n4 + "").trim().toLowerCase(), (e = cV.exec(n4)) ? (t = e[1].length, e = parseInt(e[1], 16), t === 6 ? Xm(e) : t === 3 ? new pr(e >> 8 & 15 | e >> 4 & 240, e >> 4 & 15 | e & 240, (e & 15) << 4 | e & 15, 1) : t === 8 ? bl(e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, (e & 255) / 255) : t === 4 ? bl(e >> 12 & 15 | e >> 8 & 240, e >> 8 & 15 | e >> 4 & 240, e >> 4 & 15 | e & 240, ((e & 15) << 4 | e & 15) / 255) : null) : (e = hV.exec(n4)) ? new pr(e[1], e[2], e[3], 1) : (e = uV.exec(n4)) ? new pr(e[1] * 255 / 100, e[2] * 255 / 100, e[3] * 255 / 100, 1) : (e = fV.exec(n4)) ? bl(e[1], e[2], e[3], e[4]) : (e = dV.exec(n4)) ? bl(e[1] * 255 / 100, e[2] * 255 / 100, e[3] * 255 / 100, e[4]) : (e = pV.exec(n4)) ? qm(e[1], e[2] / 100, e[3] / 100, 1) : (e = gV.exec(n4)) ? qm(e[1], e[2] / 100, e[3] / 100, e[4]) : zm.hasOwnProperty(n4) ? Xm(zm[n4]) : n4 === "transparent" ? new pr(NaN, NaN, NaN, 0) : null; } -function Gm(n4) { - return new dr(n4 >> 16 & 255, n4 >> 8 & 255, n4 & 255, 1); +function Xm(n4) { + return new pr(n4 >> 16 & 255, n4 >> 8 & 255, n4 & 255, 1); } function bl(n4, e, t, i) { - return i <= 0 && (n4 = e = t = NaN), new dr(n4, e, t, i); + return i <= 0 && (n4 = e = t = NaN), new pr(n4, e, t, i); } -function _V(n4) { - return n4 instanceof rl || (n4 = wo(n4)), n4 ? (n4 = n4.rgb(), new dr(n4.r, n4.g, n4.b, n4.opacity)) : new dr(); +function EV(n4) { + return n4 instanceof rl || (n4 = wo(n4)), n4 ? (n4 = n4.rgb(), new pr(n4.r, n4.g, n4.b, n4.opacity)) : new pr(); } function Fu(n4, e, t, i) { - return arguments.length === 1 ? _V(n4) : new dr(n4, e, t, i ?? 1); + return arguments.length === 1 ? EV(n4) : new pr(n4, e, t, i ?? 1); } -function dr(n4, e, t, i) { +function pr(n4, e, t, i) { this.r = +n4, this.g = +e, this.b = +t, this.opacity = +i; } -dd(dr, Fu, dv(rl, { +pd(pr, Fu, dv(rl, { brighter(n4) { - return n4 = n4 == null ? Ec : Math.pow(Ec, n4), new dr(this.r * n4, this.g * n4, this.b * n4, this.opacity); + return n4 = n4 == null ? Ec : Math.pow(Ec, n4), new pr(this.r * n4, this.g * n4, this.b * n4, this.opacity); }, darker(n4) { - return n4 = n4 == null ? Fo : Math.pow(Fo, n4), new dr(this.r * n4, this.g * n4, this.b * n4, this.opacity); + return n4 = n4 == null ? Fo : Math.pow(Fo, n4), new pr(this.r * n4, this.g * n4, this.b * n4, this.opacity); }, rgb() { return this; }, clamp() { - return new dr(Mn(this.r), Mn(this.g), Mn(this.b), vc(this.opacity)); + return new pr(Pn(this.r), Pn(this.g), Pn(this.b), vc(this.opacity)); }, displayable() { return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1; }, - hex: Xm, + hex: Hm, // Deprecated! Use color.formatHex. - formatHex: Xm, - formatHex8: EV, - formatRgb: Hm, - toString: Hm + formatHex: Hm, + formatHex8: vV, + formatRgb: Km, + toString: Km })); -function Xm() { - return `#${bn(this.r)}${bn(this.g)}${bn(this.b)}`; +function Hm() { + return `#${An(this.r)}${An(this.g)}${An(this.b)}`; } -function EV() { - return `#${bn(this.r)}${bn(this.g)}${bn(this.b)}${bn((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`; +function vV() { + return `#${An(this.r)}${An(this.g)}${An(this.b)}${An((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`; } -function Hm() { +function Km() { const n4 = vc(this.opacity); - return `${n4 === 1 ? "rgb(" : "rgba("}${Mn(this.r)}, ${Mn(this.g)}, ${Mn(this.b)}${n4 === 1 ? ")" : `, ${n4})`}`; + return `${n4 === 1 ? "rgb(" : "rgba("}${Pn(this.r)}, ${Pn(this.g)}, ${Pn(this.b)}${n4 === 1 ? ")" : `, ${n4})`}`; } function vc(n4) { return isNaN(n4) ? 1 : Math.max(0, Math.min(1, n4)); } -function Mn(n4) { +function Pn(n4) { return Math.max(0, Math.min(255, Math.round(n4) || 0)); } -function bn(n4) { - return n4 = Mn(n4), (n4 < 16 ? "0" : "") + n4.toString(16); +function An(n4) { + return n4 = Pn(n4), (n4 < 16 ? "0" : "") + n4.toString(16); } -function Km(n4, e, t, i) { - return i <= 0 ? n4 = e = t = NaN : t <= 0 || t >= 1 ? n4 = e = NaN : e <= 0 && (n4 = NaN), new Qr(n4, e, t, i); +function qm(n4, e, t, i) { + return i <= 0 ? n4 = e = t = NaN : t <= 0 || t >= 1 ? n4 = e = NaN : e <= 0 && (n4 = NaN), new Jr(n4, e, t, i); } function pv(n4) { - if (n4 instanceof Qr) - return new Qr(n4.h, n4.s, n4.l, n4.opacity); + if (n4 instanceof Jr) + return new Jr(n4.h, n4.s, n4.l, n4.opacity); if (n4 instanceof rl || (n4 = wo(n4)), !n4) - return new Qr(); - if (n4 instanceof Qr) + return new Jr(); + if (n4 instanceof Jr) return n4; n4 = n4.rgb(); var e = n4.r / 255, t = n4.g / 255, i = n4.b / 255, r = Math.min(e, t, i), s = Math.max(e, t, i), a = NaN, o = s - r, l = (s + r) / 2; - return o ? (e === s ? a = (t - i) / o + (t < i) * 6 : t === s ? a = (i - e) / o + 2 : a = (e - t) / o + 4, o /= l < 0.5 ? s + r : 2 - s - r, a *= 60) : o = l > 0 && l < 1 ? 0 : a, new Qr(a, o, l, n4.opacity); + return o ? (e === s ? a = (t - i) / o + (t < i) * 6 : t === s ? a = (i - e) / o + 2 : a = (e - t) / o + 4, o /= l < 0.5 ? s + r : 2 - s - r, a *= 60) : o = l > 0 && l < 1 ? 0 : a, new Jr(a, o, l, n4.opacity); } -function vV(n4, e, t, i) { - return arguments.length === 1 ? pv(n4) : new Qr(n4, e, t, i ?? 1); +function TV(n4, e, t, i) { + return arguments.length === 1 ? pv(n4) : new Jr(n4, e, t, i ?? 1); } -function Qr(n4, e, t, i) { +function Jr(n4, e, t, i) { this.h = +n4, this.s = +e, this.l = +t, this.opacity = +i; } -dd(Qr, vV, dv(rl, { +pd(Jr, TV, dv(rl, { brighter(n4) { - return n4 = n4 == null ? Ec : Math.pow(Ec, n4), new Qr(this.h, this.s, this.l * n4, this.opacity); + return n4 = n4 == null ? Ec : Math.pow(Ec, n4), new Jr(this.h, this.s, this.l * n4, this.opacity); }, darker(n4) { - return n4 = n4 == null ? Fo : Math.pow(Fo, n4), new Qr(this.h, this.s, this.l * n4, this.opacity); + return n4 = n4 == null ? Fo : Math.pow(Fo, n4), new Jr(this.h, this.s, this.l * n4, this.opacity); }, rgb() { var n4 = this.h % 360 + (this.h < 0) * 360, e = isNaN(n4) || isNaN(this.s) ? 0 : this.s, t = this.l, i = t + (t < 0.5 ? t : 1 - t) * e, r = 2 * t - i; - return new dr( + return new pr( au(n4 >= 240 ? n4 - 240 : n4 + 120, r, i), au(n4, r, i), au(n4 < 120 ? n4 + 240 : n4 - 120, r, i), @@ -86233,17 +86225,17 @@ dd(Qr, vV, dv(rl, { ); }, clamp() { - return new Qr(qm(this.h), Al(this.s), Al(this.l), vc(this.opacity)); + return new Jr(Ym(this.h), Al(this.s), Al(this.l), vc(this.opacity)); }, displayable() { return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1; }, formatHsl() { const n4 = vc(this.opacity); - return `${n4 === 1 ? "hsl(" : "hsla("}${qm(this.h)}, ${Al(this.s) * 100}%, ${Al(this.l) * 100}%${n4 === 1 ? ")" : `, ${n4})`}`; + return `${n4 === 1 ? "hsl(" : "hsla("}${Ym(this.h)}, ${Al(this.s) * 100}%, ${Al(this.l) * 100}%${n4 === 1 ? ")" : `, ${n4})`}`; } })); -function qm(n4) { +function Ym(n4) { return n4 = (n4 || 0) % 360, n4 < 0 ? n4 + 360 : n4; } function Al(n4) { @@ -86252,28 +86244,28 @@ function Al(n4) { function au(n4, e, t) { return (n4 < 60 ? e + (t - e) * n4 / 60 : n4 < 180 ? t : n4 < 240 ? e + (t - e) * (240 - n4) / 60 : e) * 255; } -var pd = (n4) => () => n4; -function TV(n4, e) { +var gd = (n4) => () => n4; +function xV(n4, e) { return function(t) { return n4 + t * e; }; } -function xV(n4, e, t) { +function CV(n4, e, t) { return n4 = Math.pow(n4, t), e = Math.pow(e, t) - n4, t = 1 / t, function(i) { return Math.pow(n4 + i * e, t); }; } -function CV(n4) { +function RV(n4) { return (n4 = +n4) == 1 ? gv : function(e, t) { - return t - e ? xV(e, t, n4) : pd(isNaN(e) ? t : e); + return t - e ? CV(e, t, n4) : gd(isNaN(e) ? t : e); }; } function gv(n4, e) { var t = e - n4; - return t ? TV(n4, t) : pd(isNaN(n4) ? e : n4); + return t ? xV(n4, t) : gd(isNaN(n4) ? e : n4); } -var Ym = function n(e) { - var t = CV(e); +var Zm = function n(e) { + var t = RV(e); function i(r, s) { var a = t((r = Fu(r)).r, (s = Fu(s)).r), o = t(r.g, s.g), l = t(r.b, s.b), c = gv(r.opacity, s.opacity); return function(h) { @@ -86282,7 +86274,7 @@ var Ym = function n(e) { } return i.gamma = n, i; }(1); -function RV(n4, e) { +function SV(n4, e) { e || (e = []); var t = n4 ? Math.min(e.length, n4.length) : 0, i = e.slice(), r; return function(s) { @@ -86291,13 +86283,13 @@ function RV(n4, e) { return i; }; } -function SV(n4) { +function yV(n4) { return ArrayBuffer.isView(n4) && !(n4 instanceof DataView); } -function yV(n4, e) { +function IV(n4, e) { var t = e ? e.length : 0, i = n4 ? Math.min(t, n4.length) : 0, r = new Array(i), s = new Array(t), a; for (a = 0; a < i; ++a) - r[a] = gd(n4[a], e[a]); + r[a] = md(n4[a], e[a]); for (; a < t; ++a) s[a] = e[a]; return function(o) { @@ -86306,7 +86298,7 @@ function yV(n4, e) { return s; }; } -function IV(n4, e) { +function bV(n4, e) { var t = /* @__PURE__ */ new Date(); return n4 = +n4, e = +e, function(i) { return t.setTime(n4 * (1 - i) + e * i), t; @@ -86317,11 +86309,11 @@ function Tc(n4, e) { return n4 * (1 - t) + e * t; }; } -function bV(n4, e) { +function AV(n4, e) { var t = {}, i = {}, r; (n4 === null || typeof n4 != "object") && (n4 = {}), (e === null || typeof e != "object") && (e = {}); for (r in e) - r in n4 ? t[r] = gd(n4[r], e[r]) : i[r] = e[r]; + r in n4 ? t[r] = md(n4[r], e[r]) : i[r] = e[r]; return function(s) { for (r in t) i[r] = t[r](s); @@ -86330,81 +86322,81 @@ function bV(n4, e) { } var Lu = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; var ou = new RegExp(Lu.source, "g"); -function AV(n4) { +function MV(n4) { return function() { return n4; }; } -function MV(n4) { +function PV(n4) { return function(e) { return n4(e) + ""; }; } -function PV(n4, e) { +function OV(n4, e) { var t = Lu.lastIndex = ou.lastIndex = 0, i, r, s, a = -1, o = [], l = []; for (n4 = n4 + "", e = e + ""; (i = Lu.exec(n4)) && (r = ou.exec(e)); ) (s = r.index) > t && (s = e.slice(t, s), o[a] ? o[a] += s : o[++a] = s), (i = i[0]) === (r = r[0]) ? o[a] ? o[a] += r : o[++a] = r : (o[++a] = null, l.push({ i: a, x: Tc(i, r) })), t = ou.lastIndex; - return t < e.length && (s = e.slice(t), o[a] ? o[a] += s : o[++a] = s), o.length < 2 ? l[0] ? MV(l[0].x) : AV(e) : (e = l.length, function(c) { + return t < e.length && (s = e.slice(t), o[a] ? o[a] += s : o[++a] = s), o.length < 2 ? l[0] ? PV(l[0].x) : MV(e) : (e = l.length, function(c) { for (var h = 0, u; h < e; ++h) o[(u = l[h]).i] = u.x(c); return o.join(""); }); } -function gd(n4, e) { +function md(n4, e) { var t = typeof e, i; - return e == null || t === "boolean" ? pd(e) : (t === "number" ? Tc : t === "string" ? (i = wo(e)) ? (e = i, Ym) : PV : e instanceof wo ? Ym : e instanceof Date ? IV : SV(e) ? RV : Array.isArray(e) ? yV : typeof e.valueOf != "function" && typeof e.toString != "function" || isNaN(e) ? bV : Tc)(n4, e); + return e == null || t === "boolean" ? gd(e) : (t === "number" ? Tc : t === "string" ? (i = wo(e)) ? (e = i, Zm) : OV : e instanceof wo ? Zm : e instanceof Date ? bV : yV(e) ? SV : Array.isArray(e) ? IV : typeof e.valueOf != "function" && typeof e.toString != "function" || isNaN(e) ? AV : Tc)(n4, e); } -function OV(n4, e) { +function DV(n4, e) { return n4 = +n4, e = +e, function(t) { return Math.round(n4 * (1 - t) + e * t); }; } -function DV(n4) { +function NV(n4) { return function() { return n4; }; } -function NV(n4) { +function FV(n4) { return +n4; } -var Zm = [0, 1]; +var jm = [0, 1]; function ua(n4) { return n4; } function wu(n4, e) { return (e -= n4 = +n4) ? function(t) { return (t - n4) / e; - } : DV(isNaN(e) ? NaN : 0.5); + } : NV(isNaN(e) ? NaN : 0.5); } -function FV(n4, e) { +function LV(n4, e) { var t; return n4 > e && (t = n4, n4 = e, e = t), function(i) { return Math.max(n4, Math.min(e, i)); }; } -function LV(n4, e, t) { +function wV(n4, e, t) { var i = n4[0], r = n4[1], s = e[0], a = e[1]; return r < i ? (i = wu(r, i), s = t(a, s)) : (i = wu(i, r), s = t(s, a)), function(o) { return s(i(o)); }; } -function wV(n4, e, t) { +function UV(n4, e, t) { var i = Math.min(n4.length, e.length) - 1, r = new Array(i), s = new Array(i), a = -1; for (n4[i] < n4[0] && (n4 = n4.slice().reverse(), e = e.slice().reverse()); ++a < i; ) r[a] = wu(n4[a], n4[a + 1]), s[a] = t(e[a], e[a + 1]); return function(o) { - var l = $3(n4, o, 1, i) - 1; + var l = eV(n4, o, 1, i) - 1; return s[l](r[l](o)); }; } -function UV(n4, e) { +function VV(n4, e) { return e.domain(n4.domain()).range(n4.range()).interpolate(n4.interpolate()).clamp(n4.clamp()).unknown(n4.unknown()); } -function VV() { - var n4 = Zm, e = Zm, t = gd, i, r, s, a = ua, o, l, c; +function BV() { + var n4 = jm, e = jm, t = md, i, r, s, a = ua, o, l, c; function h() { var f = Math.min(n4.length, e.length); - return a !== ua && (a = FV(n4[0], n4[f - 1])), o = f > 2 ? wV : LV, l = c = null, u; + return a !== ua && (a = LV(n4[0], n4[f - 1])), o = f > 2 ? UV : wV, l = c = null, u; } function u(f) { return f == null || isNaN(f = +f) ? s : (l || (l = o(n4.map(i), e, t)))(i(a(f))); @@ -86412,11 +86404,11 @@ function VV() { return u.invert = function(f) { return a(r((c || (c = o(e, n4.map(i), Tc)))(f))); }, u.domain = function(f) { - return arguments.length ? (n4 = Array.from(f, NV), h()) : n4.slice(); + return arguments.length ? (n4 = Array.from(f, FV), h()) : n4.slice(); }, u.range = function(f) { return arguments.length ? (e = Array.from(f), h()) : e.slice(); }, u.rangeRound = function(f) { - return e = Array.from(f), t = OV, h(); + return e = Array.from(f), t = DV, h(); }, u.clamp = function(f) { return arguments.length ? (a = f ? true : ua, h()) : a !== ua; }, u.interpolate = function(f) { @@ -86427,10 +86419,10 @@ function VV() { return i = f, r = d, h(); }; } -function BV() { - return VV()(ua, ua); +function kV() { + return BV()(ua, ua); } -function kV(n4) { +function zV(n4) { return Math.abs(n4 = Math.round(n4)) >= 1e21 ? n4.toLocaleString("en").replace(/,/g, "") : n4.toString(10); } function xc(n4, e) { @@ -86445,26 +86437,26 @@ function xc(n4, e) { function Fa(n4) { return n4 = xc(Math.abs(n4)), n4 ? n4[1] : NaN; } -function zV(n4, e) { +function WV(n4, e) { return function(t, i) { for (var r = t.length, s = [], a = 0, o = n4[0], l = 0; r > 0 && o > 0 && (l + o + 1 > i && (o = Math.max(1, i - l)), s.push(t.substring(r -= o, r + o)), !((l += o + 1) > i)); ) o = n4[a = (a + 1) % n4.length]; return s.reverse().join(e); }; } -function WV(n4) { +function GV(n4) { return function(e) { return e.replace(/[0-9]/g, function(t) { return n4[+t]; }); }; } -var GV = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; +var XV = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; function Cc(n4) { - if (!(e = GV.exec(n4))) + if (!(e = XV.exec(n4))) throw new Error("invalid format: " + n4); var e; - return new md({ + return new _d({ fill: e[1], align: e[2], sign: e[3], @@ -86477,14 +86469,14 @@ function Cc(n4) { type: e[10] }); } -Cc.prototype = md.prototype; -function md(n4) { +Cc.prototype = _d.prototype; +function _d(n4) { this.fill = n4.fill === void 0 ? " " : n4.fill + "", this.align = n4.align === void 0 ? ">" : n4.align + "", this.sign = n4.sign === void 0 ? "-" : n4.sign + "", this.symbol = n4.symbol === void 0 ? "" : n4.symbol + "", this.zero = !!n4.zero, this.width = n4.width === void 0 ? void 0 : +n4.width, this.comma = !!n4.comma, this.precision = n4.precision === void 0 ? void 0 : +n4.precision, this.trim = !!n4.trim, this.type = n4.type === void 0 ? "" : n4.type + ""; } -md.prototype.toString = function() { +_d.prototype.toString = function() { return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (this.width === void 0 ? "" : Math.max(1, this.width | 0)) + (this.comma ? "," : "") + (this.precision === void 0 ? "" : "." + Math.max(0, this.precision | 0)) + (this.trim ? "~" : "") + this.type; }; -function XV(n4) { +function HV(n4) { e: for (var e = n4.length, t = 1, i = -1, r; t < e; ++t) switch (n4[t]) { @@ -86503,87 +86495,87 @@ function XV(n4) { return i > 0 ? n4.slice(0, i) + n4.slice(r + 1) : n4; } var mv; -function HV(n4, e) { +function KV(n4, e) { var t = xc(n4, e); if (!t) return n4 + ""; var i = t[0], r = t[1], s = r - (mv = Math.max(-8, Math.min(8, Math.floor(r / 3))) * 3) + 1, a = i.length; return s === a ? i : s > a ? i + new Array(s - a + 1).join("0") : s > 0 ? i.slice(0, s) + "." + i.slice(s) : "0." + new Array(1 - s).join("0") + xc(n4, Math.max(0, e + s - 1))[0]; } -function jm(n4, e) { +function Qm(n4, e) { var t = xc(n4, e); if (!t) return n4 + ""; var i = t[0], r = t[1]; return r < 0 ? "0." + new Array(-r).join("0") + i : i.length > r + 1 ? i.slice(0, r + 1) + "." + i.slice(r + 1) : i + new Array(r - i.length + 2).join("0"); } -var Qm = { +var Jm = { "%": (n4, e) => (n4 * 100).toFixed(e), b: (n4) => Math.round(n4).toString(2), c: (n4) => n4 + "", - d: kV, + d: zV, e: (n4, e) => n4.toExponential(e), f: (n4, e) => n4.toFixed(e), g: (n4, e) => n4.toPrecision(e), o: (n4) => Math.round(n4).toString(8), - p: (n4, e) => jm(n4 * 100, e), - r: jm, - s: HV, + p: (n4, e) => Qm(n4 * 100, e), + r: Qm, + s: KV, X: (n4) => Math.round(n4).toString(16).toUpperCase(), x: (n4) => Math.round(n4).toString(16) }; -function Jm(n4) { +function $m(n4) { return n4; } -var $m = Array.prototype.map; -var e_ = ["y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"]; -function KV(n4) { - var e = n4.grouping === void 0 || n4.thousands === void 0 ? Jm : zV($m.call(n4.grouping, Number), n4.thousands + ""), t = n4.currency === void 0 ? "" : n4.currency[0] + "", i = n4.currency === void 0 ? "" : n4.currency[1] + "", r = n4.decimal === void 0 ? "." : n4.decimal + "", s = n4.numerals === void 0 ? Jm : WV($m.call(n4.numerals, String)), a = n4.percent === void 0 ? "%" : n4.percent + "", o = n4.minus === void 0 ? "−" : n4.minus + "", l = n4.nan === void 0 ? "NaN" : n4.nan + ""; +var e_ = Array.prototype.map; +var t_ = ["y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"]; +function qV(n4) { + var e = n4.grouping === void 0 || n4.thousands === void 0 ? $m : WV(e_.call(n4.grouping, Number), n4.thousands + ""), t = n4.currency === void 0 ? "" : n4.currency[0] + "", i = n4.currency === void 0 ? "" : n4.currency[1] + "", r = n4.decimal === void 0 ? "." : n4.decimal + "", s = n4.numerals === void 0 ? $m : GV(e_.call(n4.numerals, String)), a = n4.percent === void 0 ? "%" : n4.percent + "", o = n4.minus === void 0 ? "−" : n4.minus + "", l = n4.nan === void 0 ? "NaN" : n4.nan + ""; function c(u) { u = Cc(u); var f = u.fill, d = u.align, p = u.sign, g = u.symbol, m = u.zero, v = u.width, E = u.comma, C = u.precision, T = u.trim, R = u.type; - R === "n" ? (E = true, R = "g") : Qm[R] || (C === void 0 && (C = 12), T = true, R = "g"), (m || f === "0" && d === "=") && (m = true, f = "0", d = "="); - var x = g === "$" ? t : g === "#" && /[boxX]/.test(R) ? "0" + R.toLowerCase() : "", S = g === "$" ? i : /[%p]/.test(R) ? a : "", M = Qm[R], N = /[defgprs%]/.test(R); + R === "n" ? (E = true, R = "g") : Jm[R] || (C === void 0 && (C = 12), T = true, R = "g"), (m || f === "0" && d === "=") && (m = true, f = "0", d = "="); + var x = g === "$" ? t : g === "#" && /[boxX]/.test(R) ? "0" + R.toLowerCase() : "", S = g === "$" ? i : /[%p]/.test(R) ? a : "", M = Jm[R], N = /[defgprs%]/.test(R); C = C === void 0 ? 6 : /[gprs]/.test(R) ? Math.max(1, Math.min(21, C)) : Math.max(0, Math.min(20, C)); - function F(L) { - var K = x, q = S, j, k, Q; + function F(U) { + var H = x, q = S, Z, k, Q; if (R === "c") - q = M(L) + q, L = ""; + q = M(U) + q, U = ""; else { - L = +L; - var ce = L < 0 || 1 / L < 0; - if (L = isNaN(L) ? l : M(Math.abs(L), C), T && (L = XV(L)), ce && +L == 0 && p !== "+" && (ce = false), K = (ce ? p === "(" ? p : o : p === "-" || p === "(" ? "" : p) + K, q = (R === "s" ? e_[8 + mv / 3] : "") + q + (ce && p === "(" ? ")" : ""), N) { - for (j = -1, k = L.length; ++j < k; ) - if (Q = L.charCodeAt(j), 48 > Q || Q > 57) { - q = (Q === 46 ? r + L.slice(j + 1) : L.slice(j)) + q, L = L.slice(0, j); + U = +U; + var ce = U < 0 || 1 / U < 0; + if (U = isNaN(U) ? l : M(Math.abs(U), C), T && (U = HV(U)), ce && +U == 0 && p !== "+" && (ce = false), H = (ce ? p === "(" ? p : o : p === "-" || p === "(" ? "" : p) + H, q = (R === "s" ? t_[8 + mv / 3] : "") + q + (ce && p === "(" ? ")" : ""), N) { + for (Z = -1, k = U.length; ++Z < k; ) + if (Q = U.charCodeAt(Z), 48 > Q || Q > 57) { + q = (Q === 46 ? r + U.slice(Z + 1) : U.slice(Z)) + q, U = U.slice(0, Z); break; } } } - E && !m && (L = e(L, 1 / 0)); - var de = K.length + L.length + q.length, Z = de < v ? new Array(v - de + 1).join(f) : ""; - switch (E && m && (L = e(Z + L, Z.length ? v - q.length : 1 / 0), Z = ""), d) { + E && !m && (U = e(U, 1 / 0)); + var de = H.length + U.length + q.length, j = de < v ? new Array(v - de + 1).join(f) : ""; + switch (E && m && (U = e(j + U, j.length ? v - q.length : 1 / 0), j = ""), d) { case "<": - L = K + L + q + Z; + U = H + U + q + j; break; case "=": - L = K + Z + L + q; + U = H + j + U + q; break; case "^": - L = Z.slice(0, de = Z.length >> 1) + K + L + q + Z.slice(de); + U = j.slice(0, de = j.length >> 1) + H + U + q + j.slice(de); break; default: - L = Z + K + L + q; + U = j + H + U + q; break; } - return s(L); + return s(U); } return F.toString = function() { return u + ""; }, F; } function h(u, f) { - var d = c((u = Cc(u), u.type = "f", u)), p = Math.max(-8, Math.min(8, Math.floor(Fa(f) / 3))) * 3, g = Math.pow(10, -p), m = e_[8 + p / 3]; + var d = c((u = Cc(u), u.type = "f", u)), p = Math.max(-8, Math.min(8, Math.floor(Fa(f) / 3))) * 3, g = Math.pow(10, -p), m = t_[8 + p / 3]; return function(v) { return d(g * v) + m; }; @@ -86596,54 +86588,54 @@ function KV(n4) { var Ml; var _v; var Ev; -qV({ +YV({ thousands: ",", grouping: [3], currency: ["$", ""] }); -function qV(n4) { - return Ml = KV(n4), _v = Ml.format, Ev = Ml.formatPrefix, Ml; -} function YV(n4) { + return Ml = qV(n4), _v = Ml.format, Ev = Ml.formatPrefix, Ml; +} +function ZV(n4) { return Math.max(0, -Fa(Math.abs(n4))); } -function ZV(n4, e) { +function jV(n4, e) { return Math.max(0, Math.max(-8, Math.min(8, Math.floor(Fa(e) / 3))) * 3 - Fa(Math.abs(n4))); } -function jV(n4, e) { +function QV(n4, e) { return n4 = Math.abs(n4), e = Math.abs(e) - n4, Math.max(0, Fa(e) - Fa(n4)) + 1; } -function QV(n4, e, t, i) { - var r = nV(n4, e, t), s; +function JV(n4, e, t, i) { + var r = aV(n4, e, t), s; switch (i = Cc(i ?? ",f"), i.type) { case "s": { var a = Math.max(Math.abs(n4), Math.abs(e)); - return i.precision == null && !isNaN(s = ZV(r, a)) && (i.precision = s), Ev(i, a); + return i.precision == null && !isNaN(s = jV(r, a)) && (i.precision = s), Ev(i, a); } case "": case "e": case "g": case "p": case "r": { - i.precision == null && !isNaN(s = jV(r, Math.max(Math.abs(n4), Math.abs(e)))) && (i.precision = s - (i.type === "e")); + i.precision == null && !isNaN(s = QV(r, Math.max(Math.abs(n4), Math.abs(e)))) && (i.precision = s - (i.type === "e")); break; } case "f": case "%": { - i.precision == null && !isNaN(s = YV(r)) && (i.precision = s - (i.type === "%") * 2); + i.precision == null && !isNaN(s = ZV(r)) && (i.precision = s - (i.type === "%") * 2); break; } } return _v(i); } -function JV(n4) { +function $V(n4) { var e = n4.domain; return n4.ticks = function(t) { var i = e(); - return sV(i[0], i[i.length - 1], t ?? 10); + return nV(i[0], i[i.length - 1], t ?? 10); }, n4.tickFormat = function(t, i) { var r = e(); - return QV(r[0], r[r.length - 1], t ?? 10, i); + return JV(r[0], r[r.length - 1], t ?? 10, i); }, n4.nice = function(t) { t == null && (t = 10); var i = e(), r = 0, s = i.length - 1, a = i[r], o = i[s], l, c, h = 10; @@ -86662,12 +86654,12 @@ function JV(n4) { }, n4; } function Uu() { - var n4 = BV(); + var n4 = kV(); return n4.copy = function() { - return UV(n4, Uu()); - }, oV.apply(n4, arguments), JV(n4); + return VV(n4, Uu()); + }, lV.apply(n4, arguments), $V(n4); } -var $V = class { +var eB = class { constructor(e, t, i, r, s, a) { this.name = e, this.scene = a, this.layers = t, this.target = "map2D", this.view = i, this.resolution = r, this.size = s, this.container = this.createContainer(), this.map = this.createOLMap(), this.texture = this.createTexture(), this.context = this.texture.getContext(), this.mesh = this.createMesh(); let o = this.createScales(); @@ -86709,7 +86701,7 @@ var $V = class { return i.diffuseTexture = this.texture, i.specularColor = new Color3(0, 0, 0), t.material = i, t; } createScales() { - Vw(); + Bw(); let e = this.resolution.width / this.resolution.height, t = this.size * e, i = this.size, r = Uu().domain([0, this.resolution.width]).range([-(t / 2), t / 2]), s = Uu().domain([this.resolution.height, 0]).range([-(i / 2), i / 2]); return [r, s]; } @@ -86754,28 +86746,28 @@ var $V = class { }), this; } }; -function bk(n4, e = {}, t) { - const i = e.layers || [new rv({ source: new hv() })], r = e.view || new jr({ center: [0, 0], zoom: 1 }), s = e.mapWidth || 2e3, a = e.mapHeight || 1e3, o = e.meshSize || 50; - return new $V(n4, i, r, { width: s, height: a }, o, t); +function Ak(n4, e = {}, t) { + const i = e.layers || [new rv({ source: new hv() })], r = e.view || new Qr({ center: [0, 0], zoom: 1 }), s = e.mapWidth || 2e3, a = e.mapHeight || 1e3, o = e.meshSize || 50; + return new eB(n4, i, r, { width: s, height: a }, o, t); } -var Qt = 1e-6; -var eB = 1e-12; +var Jt = 1e-6; +var tB = 1e-12; var yt = Math.PI; var Nr = yt / 2; -var t_ = yt / 4; +var i_ = yt / 4; var $r = yt * 2; var br = 180 / yt; var qi = yt / 180; var oi = Math.abs; -var tB = Math.atan; +var iB = Math.atan; var La = Math.atan2; var ai = Math.cos; -var jt = Math.sin; +var Qt = Math.sin; var Zl = Math.sign || function(n4) { return n4 > 0 ? 1 : n4 < 0 ? -1 : 0; }; var wa = Math.sqrt; -function iB(n4) { +function rB(n4) { return n4 > 1 ? 0 : n4 < -1 ? yt : Math.acos(n4); } function Ln(n4) { @@ -86784,9 +86776,9 @@ function Ln(n4) { function io() { } function Rc(n4, e) { - n4 && r_.hasOwnProperty(n4.type) && r_[n4.type](n4, e); + n4 && s_.hasOwnProperty(n4.type) && s_[n4.type](n4, e); } -var i_ = { +var r_ = { Feature: function(n4, e) { Rc(n4.geometry, e); }, @@ -86795,7 +86787,7 @@ var i_ = { Rc(t[i].geometry, e); } }; -var r_ = { +var s_ = { Sphere: function(n4, e) { e.sphere(); }, @@ -86814,11 +86806,11 @@ var r_ = { Vu(t[i], e, 0); }, Polygon: function(n4, e) { - s_(n4.coordinates, e); + n_(n4.coordinates, e); }, MultiPolygon: function(n4, e) { for (var t = n4.coordinates, i = -1, r = t.length; ++i < r; ) - s_(t[i], e); + n_(t[i], e); }, GeometryCollection: function(n4, e) { for (var t = n4.geometries, i = -1, r = t.length; ++i < r; ) @@ -86831,21 +86823,21 @@ function Vu(n4, e, t) { s = n4[i], e.point(s[0], s[1], s[2]); e.lineEnd(); } -function s_(n4, e) { +function n_(n4, e) { var t = -1, i = n4.length; for (e.polygonStart(); ++t < i; ) Vu(n4[t], e, 1); e.polygonEnd(); } function vv(n4, e) { - n4 && i_.hasOwnProperty(n4.type) ? i_[n4.type](n4, e) : Rc(n4, e); + n4 && r_.hasOwnProperty(n4.type) ? r_[n4.type](n4, e) : Rc(n4, e); } function Bu(n4) { return [La(n4[1], n4[0]), Ln(n4[2])]; } function Ua(n4) { var e = n4[0], t = n4[1], i = ai(t); - return [i * ai(e), i * jt(e), jt(t)]; + return [i * ai(e), i * Qt(e), Qt(t)]; } function Pl(n4, e) { return n4[0] * e[0] + n4[1] * e[1] + n4[2] * e[2]; @@ -86875,47 +86867,47 @@ function Wu(n4, e) { return oi(n4) > yt && (n4 -= Math.round(n4 / $r) * $r), [n4, e]; } Wu.invert = Wu; -function rB(n4, e, t) { - return (n4 %= $r) ? e || t ? zu(a_(n4), o_(e, t)) : a_(n4) : e || t ? o_(e, t) : Wu; +function sB(n4, e, t) { + return (n4 %= $r) ? e || t ? zu(o_(n4), l_(e, t)) : o_(n4) : e || t ? l_(e, t) : Wu; } -function n_(n4) { +function a_(n4) { return function(e, t) { return e += n4, oi(e) > yt && (e -= Math.round(e / $r) * $r), [e, t]; }; } -function a_(n4) { - var e = n_(n4); - return e.invert = n_(-n4), e; +function o_(n4) { + var e = a_(n4); + return e.invert = a_(-n4), e; } -function o_(n4, e) { - var t = ai(n4), i = jt(n4), r = ai(e), s = jt(e); +function l_(n4, e) { + var t = ai(n4), i = Qt(n4), r = ai(e), s = Qt(e); function a(o, l) { - var c = ai(l), h = ai(o) * c, u = jt(o) * c, f = jt(l), d = f * t + h * i; + var c = ai(l), h = ai(o) * c, u = Qt(o) * c, f = Qt(l), d = f * t + h * i; return [ La(u * r - d * s, h * t - f * i), Ln(d * r + u * s) ]; } return a.invert = function(o, l) { - var c = ai(l), h = ai(o) * c, u = jt(o) * c, f = jt(l), d = f * r - u * s; + var c = ai(l), h = ai(o) * c, u = Qt(o) * c, f = Qt(l), d = f * r - u * s; return [ La(u * r + f * s, h * t + d * i), Ln(d * t - h * i) ]; }, a; } -function sB(n4, e, t, i, r, s) { +function nB(n4, e, t, i, r, s) { if (t) { - var a = ai(e), o = jt(e), l = i * t; - r == null ? (r = e + i * $r, s = e - l / 2) : (r = l_(a, r), s = l_(a, s), (i > 0 ? r < s : r > s) && (r += i * $r)); + var a = ai(e), o = Qt(e), l = i * t; + r == null ? (r = e + i * $r, s = e - l / 2) : (r = c_(a, r), s = c_(a, s), (i > 0 ? r < s : r > s) && (r += i * $r)); for (var c, h = r; i > 0 ? h > s : h < s; h -= l) - c = Bu([a, -o * ai(h), -o * jt(h)]), n4.point(c[0], c[1]); + c = Bu([a, -o * ai(h), -o * Qt(h)]), n4.point(c[0], c[1]); } } -function l_(n4, e) { +function c_(n4, e) { e = Ua(e), e[0] -= n4, ku(e); - var t = iB(-e[1]); - return ((-e[2] < 0 ? -t : t) + $r - Qt) % $r; + var t = rB(-e[1]); + return ((-e[2] < 0 ? -t : t) + $r - Jt) % $r; } function Tv() { var n4 = [], e; @@ -86937,7 +86929,7 @@ function Tv() { }; } function jl(n4, e) { - return oi(n4[0] - e[0]) < Qt && oi(n4[1] - e[1]) < Qt; + return oi(n4[0] - e[0]) < Jt && oi(n4[1] - e[1]) < Jt; } function Dl(n4, e, t, i) { this.x = n4, this.z = e, this.o = t, this.e = i, this.v = false, this.n = this.p = null; @@ -86954,12 +86946,12 @@ function xv(n4, e, t, i, r) { r.lineEnd(); return; } - v[0] += 2 * Qt; + v[0] += 2 * Jt; } s.push(E = new Dl(m, p, null, true)), a.push(E.o = new Dl(m, null, E, false)), s.push(E = new Dl(v, p, null, false)), a.push(E.o = new Dl(v, null, E, true)); } }), !!s.length) { - for (a.sort(e), c_(s), c_(a), o = 0, l = a.length; o < l; ++o) + for (a.sort(e), h_(s), h_(a), o = 0, l = a.length; o < l; ++o) a[o].e = t = !t; for (var c = s[0], h, u; ; ) { for (var f = c, d = true; f.v; ) @@ -86988,7 +86980,7 @@ function xv(n4, e, t, i, r) { } } } -function c_(n4) { +function h_(n4) { if (e = n4.length) { for (var e, t = 0, i = n4[0], r; ++t < e; ) i.n = r = n4[t], r.p = i, i = r; @@ -86998,23 +86990,23 @@ function c_(n4) { function cu(n4) { return oi(n4[0]) <= yt ? n4[0] : Zl(n4[0]) * ((oi(n4[0]) + yt) % $r - yt); } -function nB(n4, e) { - var t = cu(e), i = e[1], r = jt(i), s = [jt(t), -ai(t), 0], a = 0, o = 0, l = new eV(); - r === 1 ? i = Nr + Qt : r === -1 && (i = -Nr - Qt); +function aB(n4, e) { + var t = cu(e), i = e[1], r = Qt(i), s = [Qt(t), -ai(t), 0], a = 0, o = 0, l = new tV(); + r === 1 ? i = Nr + Jt : r === -1 && (i = -Nr - Jt); for (var c = 0, h = n4.length; c < h; ++c) if (f = (u = n4[c]).length) - for (var u, f, d = u[f - 1], p = cu(d), g = d[1] / 2 + t_, m = jt(g), v = ai(g), E = 0; E < f; ++E, p = T, m = x, v = S, d = C) { - var C = u[E], T = cu(C), R = C[1] / 2 + t_, x = jt(R), S = ai(R), M = T - p, N = M >= 0 ? 1 : -1, F = N * M, L = F > yt, K = m * x; - if (l.add(La(K * N * jt(F), v * S + K * ai(F))), a += L ? M + N * $r : M, L ^ p >= t ^ T >= t) { + for (var u, f, d = u[f - 1], p = cu(d), g = d[1] / 2 + i_, m = Qt(g), v = ai(g), E = 0; E < f; ++E, p = T, m = x, v = S, d = C) { + var C = u[E], T = cu(C), R = C[1] / 2 + i_, x = Qt(R), S = ai(R), M = T - p, N = M >= 0 ? 1 : -1, F = N * M, U = F > yt, H = m * x; + if (l.add(La(H * N * Qt(F), v * S + H * ai(F))), a += U ? M + N * $r : M, U ^ p >= t ^ T >= t) { var q = Sc(Ua(d), Ua(C)); ku(q); - var j = Sc(s, q); - ku(j); - var k = (L ^ M >= 0 ? -1 : 1) * Ln(j[2]); - (i > k || i === k && (q[0] || q[1])) && (o += L ^ M >= 0 ? 1 : -1); + var Z = Sc(s, q); + ku(Z); + var k = (U ^ M >= 0 ? -1 : 1) * Ln(Z[2]); + (i > k || i === k && (q[0] || q[1])) && (o += U ^ M >= 0 ? 1 : -1); } } - return (a < -Qt || a < Qt && l < -eB) ^ o & 1; + return (a < -Jt || a < Jt && l < -tB) ^ o & 1; } function Cv(n4, e, t, i) { return function(r) { @@ -87027,8 +87019,8 @@ function Cv(n4, e, t, i) { }, polygonEnd: function() { f.point = d, f.lineStart = g, f.lineEnd = m, h = fv(h); - var T = nB(c, i); - h.length ? (l || (r.polygonStart(), l = true), xv(h, oB, T, t, r)) : T && (l || (r.polygonStart(), l = true), r.lineStart(), t(null, null, 1, r), r.lineEnd()), l && (r.polygonEnd(), l = false), h = c = null; + var T = aB(c, i); + h.length ? (l || (r.polygonStart(), l = true), xv(h, lB, T, t, r)) : T && (l || (r.polygonStart(), l = true), r.lineStart(), t(null, null, 1, r), r.lineEnd()), l && (r.polygonEnd(), l = false), h = c = null; }, sphere: function() { r.polygonStart(), r.lineStart(), t(null, null, 1, r), r.lineEnd(), r.polygonEnd(); @@ -87064,27 +87056,27 @@ function Cv(n4, e, t, i) { } return; } - S > 1 && T & 2 && R.push(R.pop().concat(R.shift())), h.push(R.filter(aB)); + S > 1 && T & 2 && R.push(R.pop().concat(R.shift())), h.push(R.filter(oB)); } } return f; }; } -function aB(n4) { +function oB(n4) { return n4.length > 1; } -function oB(n4, e) { - return ((n4 = n4.x)[0] < 0 ? n4[1] - Nr - Qt : Nr - n4[1]) - ((e = e.x)[0] < 0 ? e[1] - Nr - Qt : Nr - e[1]); +function lB(n4, e) { + return ((n4 = n4.x)[0] < 0 ? n4[1] - Nr - Jt : Nr - n4[1]) - ((e = e.x)[0] < 0 ? e[1] - Nr - Jt : Nr - e[1]); } -var h_ = Cv( +var u_ = Cv( function() { return true; }, - lB, - hB, + cB, + uB, [-yt, -Nr] ); -function lB(n4) { +function cB(n4) { var e = NaN, t = NaN, i = NaN, r; return { lineStart: function() { @@ -87092,7 +87084,7 @@ function lB(n4) { }, point: function(s, a) { var o = s > 0 ? yt : -yt, l = oi(s - e); - oi(l - yt) < Qt ? (n4.point(e, t = (t + a) / 2 > 0 ? Nr : -Nr), n4.point(i, t), n4.lineEnd(), n4.lineStart(), n4.point(o, t), n4.point(s, t), r = 0) : i !== o && l >= yt && (oi(e - i) < Qt && (e -= i * Qt), oi(s - o) < Qt && (s -= o * Qt), t = cB(e, t, s, a), n4.point(i, t), n4.lineEnd(), n4.lineStart(), n4.point(o, t), r = 0), n4.point(e = s, t = a), i = o; + oi(l - yt) < Jt ? (n4.point(e, t = (t + a) / 2 > 0 ? Nr : -Nr), n4.point(i, t), n4.lineEnd(), n4.lineStart(), n4.point(o, t), n4.point(s, t), r = 0) : i !== o && l >= yt && (oi(e - i) < Jt && (e -= i * Jt), oi(s - o) < Jt && (s -= o * Jt), t = hB(e, t, s, a), n4.point(i, t), n4.lineEnd(), n4.lineStart(), n4.point(o, t), r = 0), n4.point(e = s, t = a), i = o; }, lineEnd: function() { n4.lineEnd(), e = t = NaN; @@ -87102,24 +87094,24 @@ function lB(n4) { } }; } -function cB(n4, e, t, i) { - var r, s, a = jt(n4 - t); - return oi(a) > Qt ? tB((jt(e) * (s = ai(i)) * jt(t) - jt(i) * (r = ai(e)) * jt(n4)) / (r * s * a)) : (e + i) / 2; -} function hB(n4, e, t, i) { + var r, s, a = Qt(n4 - t); + return oi(a) > Jt ? iB((Qt(e) * (s = ai(i)) * Qt(t) - Qt(i) * (r = ai(e)) * Qt(n4)) / (r * s * a)) : (e + i) / 2; +} +function uB(n4, e, t, i) { var r; if (n4 == null) r = t * Nr, i.point(-yt, r), i.point(0, r), i.point(yt, r), i.point(yt, 0), i.point(yt, -r), i.point(0, -r), i.point(-yt, -r), i.point(-yt, 0), i.point(-yt, r); - else if (oi(n4[0] - e[0]) > Qt) { + else if (oi(n4[0] - e[0]) > Jt) { var s = n4[0] < e[0] ? yt : -yt; r = t * s / 2, i.point(-s, r), i.point(0, r), i.point(s, r); } else i.point(e[0], e[1]); } -function uB(n4) { - var e = ai(n4), t = 2 * qi, i = e > 0, r = oi(e) > Qt; +function fB(n4) { + var e = ai(n4), t = 2 * qi, i = e > 0, r = oi(e) > Jt; function s(h, u, f, d) { - sB(d, n4, t, f, h, u); + nB(d, n4, t, f, h, u); } function a(h, u) { return ai(h) * ai(u) > e; @@ -87156,17 +87148,17 @@ function uB(n4) { return !f && h; var T = e * v / C, R = -e * E / C, x = Sc(g, m), S = Ol(g, T), M = Ol(m, R); lu(S, M); - var N = x, F = Pl(S, N), L = Pl(N, N), K = F * F - L * (Pl(S, S) - 1); - if (!(K < 0)) { - var q = wa(K), j = Ol(N, (-F - q) / L); - if (lu(j, S), j = Bu(j), !f) - return j; - var k = h[0], Q = u[0], ce = h[1], de = u[1], Z; - Q < k && (Z = k, k = Q, Q = Z); - var J = Q - k, O = oi(J - yt) < Qt, G = O || J < Qt; - if (!O && de < ce && (Z = ce, ce = de, de = Z), G ? O ? ce + de > 0 ^ j[1] < (oi(j[0] - k) < Qt ? ce : de) : ce <= j[1] && j[1] <= de : J > yt ^ (k <= j[0] && j[0] <= Q)) { - var ee = Ol(N, (-F + q) / L); - return lu(ee, S), [j, Bu(ee)]; + var N = x, F = Pl(S, N), U = Pl(N, N), H = F * F - U * (Pl(S, S) - 1); + if (!(H < 0)) { + var q = wa(H), Z = Ol(N, (-F - q) / U); + if (lu(Z, S), Z = Bu(Z), !f) + return Z; + var k = h[0], Q = u[0], ce = h[1], de = u[1], j; + Q < k && (j = k, k = Q, Q = j); + var J = Q - k, O = oi(J - yt) < Jt, G = O || J < Jt; + if (!O && de < ce && (j = ce, ce = de, de = j), G ? O ? ce + de > 0 ^ Z[1] < (oi(Z[0] - k) < Jt ? ce : de) : ce <= Z[1] && Z[1] <= de : J > yt ^ (k <= Z[0] && Z[0] <= Q)) { + var ee = Ol(N, (-F + q) / U); + return lu(ee, S), [Z, Bu(ee)]; } } } @@ -87176,7 +87168,7 @@ function uB(n4) { } return Cv(a, o, s, i ? [0, -n4] : [-yt, n4 - yt]); } -function fB(n4, e, t, i, r, s) { +function dB(n4, e, t, i, r, s) { var a = n4[0], o = n4[1], l = e[0], c = e[1], h = 0, u = 1, f = l - a, d = c - o, p; if (p = t - a, !(!f && p > 0)) { if (p /= f, f < 0) { @@ -87240,7 +87232,7 @@ function Rv(n4, e, t, i) { f.point(h[0], h[1]); } function a(c, h) { - return oi(c[0] - n4) < Qt ? h > 0 ? 0 : 3 : oi(c[0] - t) < Qt ? h > 0 ? 2 : 1 : oi(c[1] - e) < Qt ? h > 0 ? 1 : 0 : h > 0 ? 3 : 2; + return oi(c[0] - n4) < Jt ? h > 0 ? 0 : 3 : oi(c[0] - t) < Jt ? h > 0 ? 2 : 1 : oi(c[1] - e) < Jt ? h > 0 ? 1 : 0 : h > 0 ? 3 : 2; } function o(c, h) { return l(c.x, h.x); @@ -87252,42 +87244,42 @@ function Rv(n4, e, t, i) { return function(c) { var h = c, u = Tv(), f, d, p, g, m, v, E, C, T, R, x, S = { point: M, - lineStart: K, + lineStart: H, lineEnd: q, polygonStart: F, - polygonEnd: L + polygonEnd: U }; function M(k, Q) { r(k, Q) && h.point(k, Q); } function N() { for (var k = 0, Q = 0, ce = d.length; Q < ce; ++Q) - for (var de = d[Q], Z = 1, J = de.length, O = de[0], G, ee, _e = O[0], Oe = O[1]; Z < J; ++Z) - G = _e, ee = Oe, O = de[Z], _e = O[0], Oe = O[1], ee <= i ? Oe > i && (_e - G) * (i - ee) > (Oe - ee) * (n4 - G) && ++k : Oe <= i && (_e - G) * (i - ee) < (Oe - ee) * (n4 - G) && --k; + for (var de = d[Q], j = 1, J = de.length, O = de[0], G, ee, _e = O[0], Oe = O[1]; j < J; ++j) + G = _e, ee = Oe, O = de[j], _e = O[0], Oe = O[1], ee <= i ? Oe > i && (_e - G) * (i - ee) > (Oe - ee) * (n4 - G) && ++k : Oe <= i && (_e - G) * (i - ee) < (Oe - ee) * (n4 - G) && --k; return k; } function F() { h = u, f = [], d = [], x = true; } - function L() { + function U() { var k = N(), Q = x && k, ce = (f = fv(f)).length; (Q || ce) && (c.polygonStart(), Q && (c.lineStart(), s(null, null, 1, c), c.lineEnd()), ce && xv(f, o, k, s, c), c.polygonEnd()), h = c, f = d = p = null; } - function K() { - S.point = j, d && d.push(p = []), R = true, T = false, E = C = NaN; + function H() { + S.point = Z, d && d.push(p = []), R = true, T = false, E = C = NaN; } function q() { - f && (j(g, m), v && T && u.rejoin(), f.push(u.result())), S.point = M, T && h.lineEnd(); + f && (Z(g, m), v && T && u.rejoin(), f.push(u.result())), S.point = M, T && h.lineEnd(); } - function j(k, Q) { + function Z(k, Q) { var ce = r(k, Q); if (d && p.push([k, Q]), R) g = k, m = Q, v = ce, R = false, ce && (h.lineStart(), h.point(k, Q)); else if (ce && T) h.point(k, Q); else { - var de = [E = Math.max(Nl, Math.min(ro, E)), C = Math.max(Nl, Math.min(ro, C))], Z = [k = Math.max(Nl, Math.min(ro, k)), Q = Math.max(Nl, Math.min(ro, Q))]; - fB(de, Z, n4, e, t, i) ? (T || (h.lineStart(), h.point(de[0], de[1])), h.point(Z[0], Z[1]), ce || h.lineEnd(), x = false) : ce && (h.lineStart(), h.point(k, Q), x = false); + var de = [E = Math.max(Nl, Math.min(ro, E)), C = Math.max(Nl, Math.min(ro, C))], j = [k = Math.max(Nl, Math.min(ro, k)), Q = Math.max(Nl, Math.min(ro, Q))]; + dB(de, j, n4, e, t, i) ? (T || (h.lineStart(), h.point(de[0], de[1])), h.point(j[0], j[1]), ce || h.lineEnd(), x = false) : ce && (h.lineStart(), h.point(k, Q), x = false); } E = k, C = Q, T = ce; } @@ -87299,8 +87291,8 @@ var Va = 1 / 0; var Ic = Va; var Uo = -Va; var bc = Uo; -var dB = { - point: pB, +var pB = { + point: gB, lineStart: io, lineEnd: io, polygonStart: io, @@ -87310,10 +87302,10 @@ var dB = { return Uo = bc = -(Ic = Va = 1 / 0), n4; } }; -function pB(n4, e) { +function gB(n4, e) { n4 < Va && (Va = n4), n4 > Uo && (Uo = n4), e < Ic && (Ic = e), e > bc && (bc = e); } -var u_ = dB; +var f_ = pB; function nh(n4) { return function(e) { var t = new Gu(); @@ -87345,49 +87337,49 @@ Gu.prototype = { this.stream.polygonEnd(); } }; -function _d(n4, e, t) { +function Ed(n4, e, t) { var i = n4.clipExtent && n4.clipExtent(); - return n4.scale(150).translate([0, 0]), i != null && n4.clipExtent(null), vv(t, n4.stream(u_)), e(u_.result()), i != null && n4.clipExtent(i), n4; + return n4.scale(150).translate([0, 0]), i != null && n4.clipExtent(null), vv(t, n4.stream(f_)), e(f_.result()), i != null && n4.clipExtent(i), n4; } -function Ed(n4, e, t) { - return _d(n4, function(i) { +function vd(n4, e, t) { + return Ed(n4, function(i) { var r = e[1][0] - e[0][0], s = e[1][1] - e[0][1], a = Math.min(r / (i[1][0] - i[0][0]), s / (i[1][1] - i[0][1])), o = +e[0][0] + (r - a * (i[1][0] + i[0][0])) / 2, l = +e[0][1] + (s - a * (i[1][1] + i[0][1])) / 2; n4.scale(150 * a).translate([o, l]); }, t); } function Sv(n4, e, t) { - return Ed(n4, [[0, 0], e], t); + return vd(n4, [[0, 0], e], t); } function yv(n4, e, t) { - return _d(n4, function(i) { + return Ed(n4, function(i) { var r = +e, s = r / (i[1][0] - i[0][0]), a = (r - s * (i[1][0] + i[0][0])) / 2, o = -s * i[0][1]; n4.scale(150 * s).translate([a, o]); }, t); } function Iv(n4, e, t) { - return _d(n4, function(i) { + return Ed(n4, function(i) { var r = +e, s = r / (i[1][1] - i[0][1]), a = -s * i[0][0], o = (r - s * (i[1][1] + i[0][1])) / 2; n4.scale(150 * s).translate([a, o]); }, t); } -var f_ = 16; -var gB = ai(30 * qi); -function d_(n4, e) { - return +e ? _B(n4, e) : mB(n4); +var d_ = 16; +var mB = ai(30 * qi); +function p_(n4, e) { + return +e ? EB(n4, e) : _B(n4); } -function mB(n4) { +function _B(n4) { return nh({ point: function(e, t) { e = n4(e, t), this.stream.point(e[0], e[1]); } }); } -function _B(n4, e) { +function EB(n4, e) { function t(i, r, s, a, o, l, c, h, u, f, d, p, g, m) { var v = c - i, E = h - r, C = v * v + E * E; if (C > 4 * e && g--) { - var T = a + f, R = o + d, x = l + p, S = wa(T * T + R * R + x * x), M = Ln(x /= S), N = oi(oi(x) - 1) < Qt || oi(s - u) < Qt ? (s + u) / 2 : La(R, T), F = n4(N, M), L = F[0], K = F[1], q = L - i, j = K - r, k = E * q - v * j; - (k * k / C > e || oi((v * q + E * j) / C - 0.5) > 0.3 || a * f + o * d + l * p < gB) && (t(i, r, s, a, o, l, L, K, N, T /= S, R /= S, x, g, m), m.point(L, K), t(L, K, N, T, R, x, c, h, u, f, d, p, g, m)); + var T = a + f, R = o + d, x = l + p, S = wa(T * T + R * R + x * x), M = Ln(x /= S), N = oi(oi(x) - 1) < Jt || oi(s - u) < Jt ? (s + u) / 2 : La(R, T), F = n4(N, M), U = F[0], H = F[1], q = U - i, Z = H - r, k = E * q - v * Z; + (k * k / C > e || oi((v * q + E * Z) / C - 0.5) > 0.3 || a * f + o * d + l * p < mB) && (t(i, r, s, a, o, l, U, H, N, T /= S, R /= S, x, g, m), m.point(U, H), t(U, H, N, T, R, x, c, h, u, f, d, p, g, m)); } } return function(i) { @@ -87409,8 +87401,8 @@ function _B(n4, e) { u = NaN, m.point = C, i.lineStart(); } function C(M, N) { - var F = Ua([M, N]), L = n4(M, N); - t(u, f, h, d, p, g, u = L[0], f = L[1], h = M, d = F[0], p = F[1], g = F[2], f_, i), i.point(u, f); + var F = Ua([M, N]), U = n4(M, N); + t(u, f, h, d, p, g, u = U[0], f = U[1], h = M, d = F[0], p = F[1], g = F[2], d_, i), i.point(u, f); } function T() { m.point = v, i.lineEnd(); @@ -87422,17 +87414,17 @@ function _B(n4, e) { C(r = M, N), s = u, a = f, o = d, l = p, c = g, m.point = C; } function S() { - t(u, f, h, d, p, g, s, a, r, o, l, c, f_, i), m.lineEnd = T, T(); + t(u, f, h, d, p, g, s, a, r, o, l, c, d_, i), m.lineEnd = T, T(); } return m; }; } -var EB = nh({ +var vB = nh({ point: function(n4, e) { this.stream.point(n4 * qi, e * qi); } }); -function vB(n4) { +function TB(n4) { return nh({ point: function(e, t) { var i = n4(e, t); @@ -87440,7 +87432,7 @@ function vB(n4) { } }); } -function TB(n4, e, t, i, r) { +function xB(n4, e, t, i, r) { function s(a, o) { return a *= i, o *= r, [e + n4 * a, t - n4 * o]; } @@ -87448,10 +87440,10 @@ function TB(n4, e, t, i, r) { return [(a - e) / n4 * i, (t - o) / n4 * r]; }, s; } -function p_(n4, e, t, i, r, s) { +function g_(n4, e, t, i, r, s) { if (!s) - return TB(n4, e, t, i, r); - var a = ai(s), o = jt(s), l = a * n4, c = o * n4, h = a / n4, u = o / n4, f = (o * t - a * e) / n4, d = (o * e + a * t) / n4; + return xB(n4, e, t, i, r); + var a = ai(s), o = Qt(s), l = a * n4, c = o * n4, h = a / n4, u = o / n4, f = (o * t - a * e) / n4, d = (o * e + a * t) / n4; function p(g, m) { return g *= i, m *= r, [l * g - c * m + e, t - c * g - l * m]; } @@ -87459,96 +87451,96 @@ function p_(n4, e, t, i, r, s) { return [i * (h * g - u * m + f), r * (d - u * g - h * m)]; }, p; } -function xB(n4) { - var e, t = 150, i = 480, r = 250, s = 0, a = 0, o = 0, l = 0, c = 0, h, u = 0, f = 1, d = 1, p = null, g = h_, m = null, v, E, C, T = yc, R = 0.5, x, S, M, N, F; - function L(k) { +function CB(n4) { + var e, t = 150, i = 480, r = 250, s = 0, a = 0, o = 0, l = 0, c = 0, h, u = 0, f = 1, d = 1, p = null, g = u_, m = null, v, E, C, T = yc, R = 0.5, x, S, M, N, F; + function U(k) { return M(k[0] * qi, k[1] * qi); } - function K(k) { + function H(k) { return k = M.invert(k[0], k[1]), k && [k[0] * br, k[1] * br]; } - L.stream = function(k) { - return N && F === k ? N : N = EB(vB(h)(g(x(T(F = k))))); - }, L.preclip = function(k) { - return arguments.length ? (g = k, p = void 0, j()) : g; - }, L.postclip = function(k) { - return arguments.length ? (T = k, m = v = E = C = null, j()) : T; - }, L.clipAngle = function(k) { - return arguments.length ? (g = +k ? uB(p = k * qi) : (p = null, h_), j()) : p * br; - }, L.clipExtent = function(k) { - return arguments.length ? (T = k == null ? (m = v = E = C = null, yc) : Rv(m = +k[0][0], v = +k[0][1], E = +k[1][0], C = +k[1][1]), j()) : m == null ? null : [[m, v], [E, C]]; - }, L.scale = function(k) { + U.stream = function(k) { + return N && F === k ? N : N = vB(TB(h)(g(x(T(F = k))))); + }, U.preclip = function(k) { + return arguments.length ? (g = k, p = void 0, Z()) : g; + }, U.postclip = function(k) { + return arguments.length ? (T = k, m = v = E = C = null, Z()) : T; + }, U.clipAngle = function(k) { + return arguments.length ? (g = +k ? fB(p = k * qi) : (p = null, u_), Z()) : p * br; + }, U.clipExtent = function(k) { + return arguments.length ? (T = k == null ? (m = v = E = C = null, yc) : Rv(m = +k[0][0], v = +k[0][1], E = +k[1][0], C = +k[1][1]), Z()) : m == null ? null : [[m, v], [E, C]]; + }, U.scale = function(k) { return arguments.length ? (t = +k, q()) : t; - }, L.translate = function(k) { + }, U.translate = function(k) { return arguments.length ? (i = +k[0], r = +k[1], q()) : [i, r]; - }, L.center = function(k) { + }, U.center = function(k) { return arguments.length ? (s = k[0] % 360 * qi, a = k[1] % 360 * qi, q()) : [s * br, a * br]; - }, L.rotate = function(k) { + }, U.rotate = function(k) { return arguments.length ? (o = k[0] % 360 * qi, l = k[1] % 360 * qi, c = k.length > 2 ? k[2] % 360 * qi : 0, q()) : [o * br, l * br, c * br]; - }, L.angle = function(k) { + }, U.angle = function(k) { return arguments.length ? (u = k % 360 * qi, q()) : u * br; - }, L.reflectX = function(k) { + }, U.reflectX = function(k) { return arguments.length ? (f = k ? -1 : 1, q()) : f < 0; - }, L.reflectY = function(k) { + }, U.reflectY = function(k) { return arguments.length ? (d = k ? -1 : 1, q()) : d < 0; - }, L.precision = function(k) { - return arguments.length ? (x = d_(S, R = k * k), j()) : wa(R); - }, L.fitExtent = function(k, Q) { - return Ed(L, k, Q); - }, L.fitSize = function(k, Q) { - return Sv(L, k, Q); - }, L.fitWidth = function(k, Q) { - return yv(L, k, Q); - }, L.fitHeight = function(k, Q) { - return Iv(L, k, Q); + }, U.precision = function(k) { + return arguments.length ? (x = p_(S, R = k * k), Z()) : wa(R); + }, U.fitExtent = function(k, Q) { + return vd(U, k, Q); + }, U.fitSize = function(k, Q) { + return Sv(U, k, Q); + }, U.fitWidth = function(k, Q) { + return yv(U, k, Q); + }, U.fitHeight = function(k, Q) { + return Iv(U, k, Q); }; function q() { - var k = p_(t, 0, 0, f, d, u).apply(null, e(s, a)), Q = p_(t, i - k[0], r - k[1], f, d, u); - return h = rB(o, l, c), S = zu(e, Q), M = zu(h, S), x = d_(S, R), j(); + var k = g_(t, 0, 0, f, d, u).apply(null, e(s, a)), Q = g_(t, i - k[0], r - k[1], f, d, u); + return h = sB(o, l, c), S = zu(e, Q), M = zu(h, S), x = p_(S, R), Z(); } - function j() { - return N = F = null, L; + function Z() { + return N = F = null, U; } return function() { - return e = n4.apply(this, arguments), L.invert = e.invert && K, q(); + return e = n4.apply(this, arguments), U.invert = e.invert && H, q(); }; } -function CB(n4) { - var e = 0, t = yt / 3, i = xB(n4), r = i(e, t); +function RB(n4) { + var e = 0, t = yt / 3, i = CB(n4), r = i(e, t); return r.parallels = function(s) { return arguments.length ? i(e = s[0] * qi, t = s[1] * qi) : [e * br, t * br]; }, r; } -function RB(n4) { +function SB(n4) { var e = ai(n4); function t(i, r) { - return [i * e, jt(r) / e]; + return [i * e, Qt(r) / e]; } return t.invert = function(i, r) { return [i / e, Ln(r * e)]; }, t; } -function SB(n4, e) { - var t = jt(n4), i = (t + jt(e)) / 2; - if (oi(i) < Qt) - return RB(n4); +function yB(n4, e) { + var t = Qt(n4), i = (t + Qt(e)) / 2; + if (oi(i) < Jt) + return SB(n4); var r = 1 + t * (2 * i - t), s = wa(r) / i; function a(o, l) { - var c = wa(r - 2 * i * jt(l)) / i; - return [c * jt(o *= i), s - c * ai(o)]; + var c = wa(r - 2 * i * Qt(l)) / i; + return [c * Qt(o *= i), s - c * ai(o)]; } return a.invert = function(o, l) { var c = s - l, h = La(o, oi(c)) * Zl(c); return c * i < 0 && (h -= yt * Zl(o) * Zl(c)), [h / i, Ln((r - (o * o + c * c) * i * i) / (2 * i))]; }, a; } -function yB() { - return CB(SB).scale(155.424).center([0, 33.6442]); -} function IB() { - return yB().parallels([29.5, 45.5]).scale(1070).translate([480, 250]).rotate([96, 0]).center([-0.6, 38.7]); + return RB(yB).scale(155.424).center([0, 33.6442]); } function bB() { + return IB().parallels([29.5, 45.5]).scale(1070).translate([480, 250]).rotate([96, 0]).center([-0.6, 38.7]); +} +function AB() { var n4 = 1, e = 0, t = 0, i = 1, r = 1, s = 0, a, o, l = null, c, h, u, f = 1, d = 1, p = nh({ point: function(T, R) { var x = C([T, R]); @@ -87584,13 +87576,13 @@ function bB() { }, C.translate = function(T) { return arguments.length ? (e = +T[0], t = +T[1], E()) : [e, t]; }, C.angle = function(T) { - return arguments.length ? (s = T % 360 * qi, o = jt(s), a = ai(s), E()) : s * br; + return arguments.length ? (s = T % 360 * qi, o = Qt(s), a = ai(s), E()) : s * br; }, C.reflectX = function(T) { return arguments.length ? (i = T ? -1 : 1, E()) : i < 0; }, C.reflectY = function(T) { return arguments.length ? (r = T ? -1 : 1, E()) : r < 0; }, C.fitExtent = function(T, R) { - return Ed(C, T, R); + return vd(C, T, R); }, C.fitSize = function(T, R) { return Sv(C, T, R); }, C.fitWidth = function(T, R) { @@ -87599,12 +87591,12 @@ function bB() { return Iv(C, T, R); }, C; } -function AB(n4) { +function MB(n4) { return n4; } function bv(n4) { if (n4 == null) - return AB; + return MB; var e, t, i = n4.scale[0], r = n4.scale[1], s = n4.translate[0], a = n4.translate[1]; return function(o, l) { l || (e = t = 0); @@ -87614,26 +87606,26 @@ function bv(n4) { return u; }; } -function MB(n4, e) { +function PB(n4, e) { for (var t, i = n4.length, r = i - e; r < --i; ) t = n4[r], n4[r++] = n4[i], n4[i] = t; } -function PB(n4, e) { +function OB(n4, e) { return typeof e == "string" && (e = n4.objects[e]), e.type === "GeometryCollection" ? { type: "FeatureCollection", features: e.geometries.map(function(t) { - return g_(n4, t); - }) } : g_(n4, e); + return m_(n4, t); + }) } : m_(n4, e); } -function g_(n4, e) { - var t = e.id, i = e.bbox, r = e.properties == null ? {} : e.properties, s = OB(n4, e); +function m_(n4, e) { + var t = e.id, i = e.bbox, r = e.properties == null ? {} : e.properties, s = DB(n4, e); return t == null && i == null ? { type: "Feature", properties: r, geometry: s } : i == null ? { type: "Feature", id: t, properties: r, geometry: s } : { type: "Feature", id: t, bbox: i, properties: r, geometry: s }; } -function OB(n4, e) { +function DB(n4, e) { var t = bv(n4.transform), i = n4.arcs; function r(h, u) { u.length && u.pop(); for (var f = i[h < 0 ? ~h : h], d = 0, p = f.length; d < p; ++d) u.push(t(f[d], d)); - h < 0 && MB(u, p); + h < 0 && PB(u, p); } function s(h) { return t(h); @@ -87681,14 +87673,14 @@ function OB(n4, e) { } return c(e); } -function DB(n4) { +function NB(n4) { var e = n4[0], t = n4[1], i = n4[2]; return Math.abs((e[0] - i[0]) * (t[1] - e[1]) - (e[0] - t[0]) * (i[1] - e[1])) / 2; } function Fl(n4, e) { return n4[1][2] - e[1][2]; } -function NB() { +function FB() { var n4 = {}, e = [], t = 0; n4.push = function(s) { return i(e[s._ = t] = s, t++), t; @@ -87720,12 +87712,12 @@ function NB() { } return n4; } -function FB(n4) { +function LB(n4) { return [n4[0], n4[1], 0]; } -function LB(n4, e) { - var t = n4.transform ? bv(n4.transform) : FB, i = NB(); - e == null && (e = DB); +function wB(n4, e) { + var t = n4.transform ? bv(n4.transform) : LB, i = FB(); + e == null && (e = NB); var r = n4.arcs.map(function(a) { var o = [], l = 0, c, h, u; for (a = a.map(t), h = 1, u = a.length - 1; h < u; ++h) @@ -87748,7 +87740,7 @@ function LB(n4, e) { arcs: r }; } -function wB(n4, e) { +function UB(n4, e) { e = e == null ? Number.MIN_VALUE : +e; var t = n4.arcs.map(function(i) { for (var r = -1, s = 0, a = i.length, o = new Array(a), l; ++r < a; ) @@ -87764,7 +87756,7 @@ function wB(n4, e) { }; } var ah = Object.prototype.hasOwnProperty; -function UB(n4) { +function VB(n4) { var e = 1 / 0, t = 1 / 0, i = -1 / 0, r = -1 / 0; function s(u) { u != null && ah.call(a, u.type) && a[u.type](u); @@ -87806,7 +87798,7 @@ function UB(n4) { s(n4[h]); return i >= e && r >= t ? [e, t, i, r] : void 0; } -function VB(n4, e, t, i, r) { +function BB(n4, e, t, i, r) { arguments.length === 3 && (i = Array, r = null); for (var s = new i(n4 = 1 << Math.max(4, Math.ceil(Math.log(n4) / Math.LN2))), a = n4 - 1, o = 0; o < n4; ++o) s[o] = r; @@ -87843,7 +87835,7 @@ function VB(n4, e, t, i, r) { values: h }; } -function vd(n4, e, t, i, r, s) { +function Td(n4, e, t, i, r, s) { arguments.length === 3 && (i = s = Array, r = null); for (var a = new i(n4 = 1 << Math.max(4, Math.ceil(Math.log(n4) / Math.LN2))), o = new s(n4), l = n4 - 1, c = 0; c < n4; ++c) a[c] = r; @@ -87892,18 +87884,18 @@ function vd(n4, e, t, i, r, s) { keys: d }; } -function Sn(n4, e) { +function yn(n4, e) { return n4[0] === e[0] && n4[1] === e[1]; } var Av = new ArrayBuffer(16); -var m_ = new Float64Array(Av); +var __ = new Float64Array(Av); var Ll = new Uint32Array(Av); function Xu(n4) { - m_[0] = n4[0], m_[1] = n4[1]; + __[0] = n4[0], __[1] = n4[1]; var e = Ll[0] ^ Ll[1]; return e = e << 5 ^ e >> 7 ^ Ll[2] ^ Ll[3], e & 2147483647; } -function BB(n4) { +function kB(n4) { var e = n4.coordinates, t = n4.lines, i = n4.rings, r = x(), s = new Int32Array(e.length), a = new Int32Array(e.length), o = new Int32Array(e.length), l = new Int8Array(e.length), c = 0, h, u, f, d, p; for (h = 0, u = e.length; h < u; ++h) s[h] = a[h] = o[h] = -1; @@ -87920,52 +87912,52 @@ function BB(n4) { for (f = r[T - 1], d = r[C - 1], p = r[C], R(h, f, d, p); ++C <= T; ) R(h, f = d, d = p, p = r[C]); } - function R(L, K, q, j) { - if (s[q] !== L) { - s[q] = L; + function R(U, H, q, Z) { + if (s[q] !== U) { + s[q] = U; var k = a[q]; if (k >= 0) { var Q = o[q]; - (k !== K || Q !== j) && (k !== j || Q !== K) && (++c, l[q] = 1); + (k !== H || Q !== Z) && (k !== Z || Q !== H) && (++c, l[q] = 1); } else - a[q] = K, o[q] = j; + a[q] = H, o[q] = Z; } } function x() { - for (var L = vd(e.length * 1.4, S, M, Int32Array, -1, Int32Array), K = new Int32Array(e.length), q = 0, j = e.length; q < j; ++q) - K[q] = L.maybeSet(q, q); - return K; + for (var U = Td(e.length * 1.4, S, M, Int32Array, -1, Int32Array), H = new Int32Array(e.length), q = 0, Z = e.length; q < Z; ++q) + H[q] = U.maybeSet(q, q); + return H; } - function S(L) { - return Xu(e[L]); + function S(U) { + return Xu(e[U]); } - function M(L, K) { - return Sn(e[L], e[K]); + function M(U, H) { + return yn(e[U], e[H]); } s = a = o = null; - var N = VB(c * 1.4, Xu, Sn), F; + var N = BB(c * 1.4, Xu, yn), F; for (h = 0, u = e.length; h < u; ++h) l[F = r[h]] && N.add(e[F]); return N; } -function kB(n4) { - var e = BB(n4), t = n4.coordinates, i = n4.lines, r = n4.rings, s, a, o; +function zB(n4) { + var e = kB(n4), t = n4.coordinates, i = n4.lines, r = n4.rings, s, a, o; for (a = 0, o = i.length; a < o; ++a) for (var l = i[a], c = l[0], h = l[1]; ++c < h; ) e.has(t[c]) && (s = { 0: c, 1: l[1] }, l[1] = c, l = l.next = s); for (a = 0, o = r.length; a < o; ++a) for (var u = r[a], f = u[0], d = f, p = u[1], g = e.has(t[f]); ++d < p; ) - e.has(t[d]) && (g ? (s = { 0: d, 1: u[1] }, u[1] = d, u = u.next = s) : (zB(t, f, p, p - d), t[p] = t[f], g = true, d = f)); + e.has(t[d]) && (g ? (s = { 0: d, 1: u[1] }, u[1] = d, u = u.next = s) : (WB(t, f, p, p - d), t[p] = t[f], g = true, d = f)); return n4; } -function zB(n4, e, t, i) { +function WB(n4, e, t, i) { hu(n4, e, t), hu(n4, e, e + i), hu(n4, e + i, t); } function hu(n4, e, t) { for (var i = e + (t-- - e >> 1), r; e < i; ++e, --t) r = n4[e], n4[e] = n4[t], n4[t] = r; } -function WB(n4) { +function GB(n4) { var e = n4.coordinates, t = n4.lines, i, r = n4.rings, s, a = t.length + r.length, o, l; for (delete n4.lines, delete n4.rings, o = 0, l = t.length; o < l; ++o) for (i = t[o]; i = i.next; ) @@ -87973,7 +87965,7 @@ function WB(n4) { for (o = 0, l = r.length; o < l; ++o) for (s = r[o]; s = s.next; ) ++a; - var c = vd(a * 2 * 1.4, Xu, Sn), h = n4.arcs = []; + var c = Td(a * 2 * 1.4, Xu, yn), h = n4.arcs = []; for (o = 0, l = t.length; o < l; ++o) { i = t[o]; do @@ -88036,7 +88028,7 @@ function WB(n4) { if (T - x !== R - S) return false; for (; T <= x; ++T, ++R) - if (!Sn(e[T], e[R])) + if (!yn(e[T], e[R])) return false; return true; } @@ -88045,7 +88037,7 @@ function WB(n4) { if (T - x !== R - S) return false; for (; T <= x; ++T, --S) - if (!Sn(e[T], e[S])) + if (!yn(e[T], e[S])) return false; return true; } @@ -88053,8 +88045,8 @@ function WB(n4) { var T = E[0], R = C[0], x = E[1], S = C[1], M = x - T; if (M !== S - R) return false; - for (var N = v(E), F = v(C), L = 0; L < M; ++L) - if (!Sn(e[T + (L + N) % M], e[R + (L + F) % M])) + for (var N = v(E), F = v(C), U = 0; U < M; ++U) + if (!yn(e[T + (U + N) % M], e[R + (U + F) % M])) return false; return true; } @@ -88062,8 +88054,8 @@ function WB(n4) { var T = E[0], R = C[0], x = E[1], S = C[1], M = x - T; if (M !== S - R) return false; - for (var N = v(E), F = M - v(C), L = 0; L < M; ++L) - if (!Sn(e[T + (L + N) % M], e[S - (L + F) % M])) + for (var N = v(E), F = M - v(C), U = 0; U < M; ++U) + if (!yn(e[T + (U + N) % M], e[S - (U + F) % M])) return false; return true; } @@ -88076,7 +88068,7 @@ function WB(n4) { } return n4; } -function GB(n4) { +function XB(n4) { for (var e = -1, t = n4.length; ++e < t; ) { for (var i = n4[e], r = 0, s = 1, a = i.length, o = i[0], l = o[0], c = o[1], h, u; ++r < a; ) o = i[r], h = o[0], u = o[1], (h !== l || u !== c) && (i[s++] = [h - l, u - c], l = h, c = u); @@ -88084,7 +88076,7 @@ function GB(n4) { } return n4; } -function XB(n4) { +function HB(n4) { var e = -1, t = [], i = [], r = []; function s(u) { u && ah.call(a, u.type) && a[u.type](u); @@ -88131,21 +88123,21 @@ function XB(n4) { objects: n4 }; } -function HB(n4) { +function KB(n4) { var e = {}, t; for (t in n4) - e[t] = KB(n4[t]); + e[t] = qB(n4[t]); return e; } -function KB(n4) { - return n4 == null ? { type: null } : (n4.type === "FeatureCollection" ? qB : n4.type === "Feature" ? Mv : Td)(n4); -} function qB(n4) { + return n4 == null ? { type: null } : (n4.type === "FeatureCollection" ? YB : n4.type === "Feature" ? Mv : xd)(n4); +} +function YB(n4) { var e = { type: "GeometryCollection", geometries: n4.features.map(Mv) }; return n4.bbox != null && (e.bbox = n4.bbox), e; } function Mv(n4) { - var e = Td(n4.geometry), t; + var e = xd(n4.geometry), t; n4.id != null && (e.id = n4.id), n4.bbox != null && (e.bbox = n4.bbox); for (t in n4.properties) { e.properties = n4.properties; @@ -88153,20 +88145,20 @@ function Mv(n4) { } return e; } -function Td(n4) { +function xd(n4) { if (n4 == null) return { type: null }; - var e = n4.type === "GeometryCollection" ? { type: "GeometryCollection", geometries: n4.geometries.map(Td) } : n4.type === "Point" || n4.type === "MultiPoint" ? { type: n4.type, coordinates: n4.coordinates } : { type: n4.type, arcs: n4.coordinates }; + var e = n4.type === "GeometryCollection" ? { type: "GeometryCollection", geometries: n4.geometries.map(xd) } : n4.type === "Point" || n4.type === "MultiPoint" ? { type: n4.type, coordinates: n4.coordinates } : { type: n4.type, arcs: n4.coordinates }; return n4.bbox != null && (e.bbox = n4.bbox), e; } -function YB(n4, e, t) { +function ZB(n4, e, t) { var i = e[0], r = e[1], s = e[2], a = e[3], o = s - i ? (t - 1) / (s - i) : 1, l = a - r ? (t - 1) / (a - r) : 1; function c(v) { return [Math.round((v[0] - i) * o), Math.round((v[1] - r) * l)]; } function h(v, E) { - for (var C = -1, T = 0, R = v.length, x = new Array(R), S, M, N, F, L; ++C < R; ) - S = v[C], F = Math.round((S[0] - i) * o), L = Math.round((S[1] - r) * l), (F !== M || L !== N) && (x[T++] = [M = F, N = L]); + for (var C = -1, T = 0, R = v.length, x = new Array(R), S, M, N, F, U; ++C < R; ) + S = v[C], F = Math.round((S[0] - i) * o), U = Math.round((S[1] - r) * l), (F !== M || U !== N) && (x[T++] = [M = F, N = U]); for (x.length = T; T < E; ) T = x.push([x[0][0], x[0][1]]); return x; @@ -88213,8 +88205,8 @@ function YB(n4, e, t) { translate: [i, r] }; } -function ZB(n4, e) { - var t = UB(n4 = HB(n4)), i = e > 0 && t && YB(n4, t, e), r = WB(kB(XB(n4))), s = r.coordinates, a = vd(r.arcs.length * 1.4, jB, QB); +function jB(n4, e) { + var t = VB(n4 = KB(n4)), i = e > 0 && t && ZB(n4, t, e), r = GB(zB(HB(n4))), s = r.coordinates, a = Td(r.arcs.length * 1.4, QB, JB); n4 = r.objects, r.bbox = t, r.arcs = r.arcs.map(function(f, d) { return a.set(f, d), s.slice(f[0], f[1] + 1); }), delete r.coordinates, s = null; @@ -88251,26 +88243,26 @@ function ZB(n4, e) { } for (var u in n4) o(n4[u]); - return i && (r.transform = i, r.arcs = GB(r.arcs)), r; + return i && (r.transform = i, r.arcs = XB(r.arcs)), r; } -function jB(n4) { +function QB(n4) { var e = n4[0], t = n4[1], i; return t < e && (i = e, e = t, t = i), e + 31 * t; } -function QB(n4, e) { +function JB(n4, e) { var t = n4[0], i = n4[1], r = e[0], s = e[1], a; return i < t && (a = t, t = i, i = a), s < r && (a = r, r = s, s = a), t === r && i === s; } -var xd = { exports: {} }; -xd.exports = oh; -xd.exports.default = oh; +var Cd = { exports: {} }; +Cd.exports = oh; +Cd.exports.default = oh; function oh(n4, e, t) { t = t || 2; var i = e && e.length, r = i ? e[0] * t : n4.length, s = Pv(n4, 0, r, t, true), a = []; if (!s || s.next === s.prev) return a; var o, l, c, h, u, f, d; - if (i && (s = ik(n4, e, s, t)), n4.length > 80 * t) { + if (i && (s = rk(n4, e, s, t)), n4.length > 80 * t) { o = c = n4[0], l = h = n4[1]; for (var p = t; p < r; p += t) u = n4[p], f = n4[p + 1], u < o && (o = u), f < l && (l = f), u > c && (c = u), f > h && (h = f); @@ -88282,10 +88274,10 @@ function Pv(n4, e, t, i, r) { var s, a; if (r === qu(n4, e, t, i) > 0) for (s = e; s < t; s += i) - a = __(s, n4[s], n4[s + 1], a); + a = E_(s, n4[s], n4[s + 1], a); else for (s = t - i; s >= e; s -= i) - a = __(s, n4[s], n4[s + 1], a); + a = E_(s, n4[s], n4[s + 1], a); return a && lh(a, a.next) && (ko(a), a = a.next), a; } function wn(n4, e) { @@ -88305,20 +88297,20 @@ function wn(n4, e) { } function Vo(n4, e, t, i, r, s, a) { if (n4) { - !a && s && ok(n4, i, r, s); + !a && s && lk(n4, i, r, s); for (var o = n4, l, c; n4.prev !== n4.next; ) { - if (l = n4.prev, c = n4.next, s ? $B(n4, i, r, s) : JB(n4)) { + if (l = n4.prev, c = n4.next, s ? ek(n4, i, r, s) : $B(n4)) { e.push(l.i / t | 0), e.push(n4.i / t | 0), e.push(c.i / t | 0), ko(n4), n4 = c.next, o = c.next; continue; } if (n4 = c, n4 === o) { - a ? a === 1 ? (n4 = ek(wn(n4), e, t), Vo(n4, e, t, i, r, s, 2)) : a === 2 && tk(n4, e, t, i, r, s) : Vo(wn(n4), e, t, i, r, s, 1); + a ? a === 1 ? (n4 = tk(wn(n4), e, t), Vo(n4, e, t, i, r, s, 2)) : a === 2 && ik(n4, e, t, i, r, s) : Vo(wn(n4), e, t, i, r, s, 1); break; } } } } -function JB(n4) { +function $B(n4) { var e = n4.prev, t = n4, i = n4.next; if (ci(e, t, i) >= 0) return false; @@ -88329,7 +88321,7 @@ function JB(n4) { } return true; } -function $B(n4, e, t, i) { +function ek(n4, e, t, i) { var r = n4.prev, s = n4, a = n4.next; if (ci(r, s, a) >= 0) return false; @@ -88350,7 +88342,7 @@ function $B(n4, e, t, i) { } return true; } -function ek(n4, e, t) { +function tk(n4, e, t) { var i = n4; do { var r = i.prev, s = i.next.next; @@ -88358,11 +88350,11 @@ function ek(n4, e, t) { } while (i !== n4); return wn(i); } -function tk(n4, e, t, i, r, s) { +function ik(n4, e, t, i, r, s) { var a = n4; do { for (var o = a.next.next; o !== a.prev; ) { - if (a.i !== o.i && hk(a, o)) { + if (a.i !== o.i && uk(a, o)) { var l = Dv(a, o); a = wn(a, a.next), l = wn(l, l.next), Vo(a, e, t, i, r, s, 0), Vo(l, e, t, i, r, s, 0); return; @@ -88372,25 +88364,25 @@ function tk(n4, e, t, i, r, s) { a = a.next; } while (a !== n4); } -function ik(n4, e, t, i) { +function rk(n4, e, t, i) { var r = [], s, a, o, l, c; for (s = 0, a = e.length; s < a; s++) - o = e[s] * i, l = s < a - 1 ? e[s + 1] * i : n4.length, c = Pv(n4, o, l, i, false), c === c.next && (c.steiner = true), r.push(ck(c)); - for (r.sort(rk), s = 0; s < r.length; s++) - t = sk(r[s], t); + o = e[s] * i, l = s < a - 1 ? e[s + 1] * i : n4.length, c = Pv(n4, o, l, i, false), c === c.next && (c.steiner = true), r.push(hk(c)); + for (r.sort(sk), s = 0; s < r.length; s++) + t = nk(r[s], t); return t; } -function rk(n4, e) { +function sk(n4, e) { return n4.x - e.x; } -function sk(n4, e) { - var t = nk(n4, e); +function nk(n4, e) { + var t = ak(n4, e); if (!t) return e; var i = Dv(t, n4); return wn(i, i.next), wn(t, t.next); } -function nk(n4, e) { +function ak(n4, e) { var t = e, i = n4.x, r = n4.y, s = -1 / 0, a; do { if (r <= t.y && r >= t.next.y && t.next.y !== t.y) { @@ -88405,21 +88397,21 @@ function nk(n4, e) { var l = a, c = a.x, h = a.y, u = 1 / 0, f; t = a; do - i >= t.x && t.x >= c && i !== t.x && fa(r < h ? i : s, r, c, h, r < h ? s : i, r, t.x, t.y) && (f = Math.abs(r - t.y) / (i - t.x), Bo(t, n4) && (f < u || f === u && (t.x > a.x || t.x === a.x && ak(a, t))) && (a = t, u = f)), t = t.next; + i >= t.x && t.x >= c && i !== t.x && fa(r < h ? i : s, r, c, h, r < h ? s : i, r, t.x, t.y) && (f = Math.abs(r - t.y) / (i - t.x), Bo(t, n4) && (f < u || f === u && (t.x > a.x || t.x === a.x && ok(a, t))) && (a = t, u = f)), t = t.next; while (t !== l); return a; } -function ak(n4, e) { +function ok(n4, e) { return ci(n4.prev, n4, e.prev) < 0 && ci(e.next, n4, n4.next) < 0; } -function ok(n4, e, t, i) { +function lk(n4, e, t, i) { var r = n4; do r.z === 0 && (r.z = Hu(r.x, r.y, e, t, i)), r.prevZ = r.prev, r.nextZ = r.next, r = r.next; while (r !== n4); - r.prevZ.nextZ = null, r.prevZ = null, lk(r); + r.prevZ.nextZ = null, r.prevZ = null, ck(r); } -function lk(n4) { +function ck(n4) { var e, t, i, r, s, a, o, l, c = 1; do { for (t = n4, n4 = null, s = null, a = 0; t; ) { @@ -88436,7 +88428,7 @@ function lk(n4) { function Hu(n4, e, t, i, r) { return n4 = (n4 - t) * r | 0, e = (e - i) * r | 0, n4 = (n4 | n4 << 8) & 16711935, n4 = (n4 | n4 << 4) & 252645135, n4 = (n4 | n4 << 2) & 858993459, n4 = (n4 | n4 << 1) & 1431655765, e = (e | e << 8) & 16711935, e = (e | e << 4) & 252645135, e = (e | e << 2) & 858993459, e = (e | e << 1) & 1431655765, n4 | e << 1; } -function ck(n4) { +function hk(n4) { var e = n4, t = n4; do (e.x < t.x || e.x === t.x && e.y < t.y) && (t = e), e = e.next; @@ -88446,9 +88438,9 @@ function ck(n4) { function fa(n4, e, t, i, r, s, a, o) { return (r - a) * (e - o) >= (n4 - a) * (s - o) && (n4 - a) * (i - o) >= (t - a) * (e - o) && (t - a) * (s - o) >= (r - a) * (i - o); } -function hk(n4, e) { - return n4.next.i !== e.i && n4.prev.i !== e.i && !uk(n4, e) && // dones't intersect other edges - (Bo(n4, e) && Bo(e, n4) && fk(n4, e) && // locally visible +function uk(n4, e) { + return n4.next.i !== e.i && n4.prev.i !== e.i && !fk(n4, e) && // dones't intersect other edges + (Bo(n4, e) && Bo(e, n4) && dk(n4, e) && // locally visible (ci(n4.prev, n4, e.prev) || ci(n4, e.prev, e)) || // does not create opposite-facing sectors lh(n4, e) && ci(n4.prev, n4, n4.next) > 0 && ci(e.prev, e, e.next) > 0); } @@ -88468,7 +88460,7 @@ function wl(n4, e, t) { function Ul(n4) { return n4 > 0 ? 1 : n4 < 0 ? -1 : 0; } -function uk(n4, e) { +function fk(n4, e) { var t = n4; do { if (t.i !== n4.i && t.next.i !== n4.i && t.i !== e.i && t.next.i !== e.i && Ov(t, t.next, n4, e)) @@ -88480,7 +88472,7 @@ function uk(n4, e) { function Bo(n4, e) { return ci(n4.prev, n4, n4.next) < 0 ? ci(n4, e, n4.next) >= 0 && ci(n4, n4.prev, e) >= 0 : ci(n4, e, n4.prev) < 0 || ci(n4, n4.next, e) < 0; } -function fk(n4, e) { +function dk(n4, e) { var t = n4, i = false, r = (n4.x + e.x) / 2, s = (n4.y + e.y) / 2; do t.y > s != t.next.y > s && t.next.y !== t.y && r < (t.next.x - t.x) * (s - t.y) / (t.next.y - t.y) + t.x && (i = !i), t = t.next; @@ -88491,7 +88483,7 @@ function Dv(n4, e) { var t = new Ku(n4.i, n4.x, n4.y), i = new Ku(e.i, e.x, e.y), r = n4.next, s = e.prev; return n4.next = e, e.prev = n4, t.next = r, r.prev = t, i.next = t, t.prev = i, s.next = i, i.prev = s, i; } -function __(n4, e, t, i) { +function E_(n4, e, t, i) { var r = new Ku(n4, e, t); return i ? (r.next = i.next, r.prev = i, i.next.prev = r, i.next = r) : (r.prev = r, r.next = r), r; } @@ -88531,25 +88523,25 @@ oh.flatten = function(n4) { } return t; }; -var dk = xd.exports; -var E_ = cv(dk); +var pk = Cd.exports; +var v_ = cv(pk); var Ql = () => { }; -function pk(n4) { +function gk(n4) { if ((t = n4.length) < 4) return false; for (var e = 0, t, i = n4[t - 1][1] * n4[0][0] - n4[t - 1][0] * n4[0][1]; ++e < t; ) i += n4[e - 1][1] * n4[e][0] - n4[e - 1][0] * n4[e][1]; return i <= 0; } -function gk(n4, e) { +function mk(n4, e) { for (var t = e[0], i = e[1], r = false, s = 0, a = n4.length, o = a - 1; s < a; o = s++) { var l = n4[s], c = l[0], h = l[1], u = n4[o], f = u[0], d = u[1]; h > i ^ d > i && t < (f - c) * (i - h) / (d - h) + c && (r = !r); } return r; } -function v_(n4, e) { +function T_(n4, e) { var t = e.stream, i; if (!t) throw new Error("invalid projection"); @@ -88558,15 +88550,15 @@ function v_(n4, e) { i = Nv; break; case "FeatureCollection": - i = mk; + i = _k; break; default: - i = Cd; + i = Rd; break; } return i(n4, t); } -function mk(n4, e) { +function _k(n4, e) { return { type: "FeatureCollection", features: n4.features.map(function(t) { @@ -88579,35 +88571,35 @@ function Nv(n4, e) { type: "Feature", id: n4.id, properties: n4.properties, - geometry: Cd(n4.geometry, e) + geometry: Rd(n4.geometry, e) }; } -function _k(n4, e) { +function Ek(n4, e) { return { type: "GeometryCollection", geometries: n4.geometries.map(function(t) { - return Cd(t, e); + return Rd(t, e); }) }; } -function Cd(n4, e) { +function Rd(n4, e) { if (!n4) return null; if (n4.type === "GeometryCollection") - return _k(n4, e); + return Ek(n4, e); var t; switch (n4.type) { case "Point": - t = T_; + t = x_; break; case "MultiPoint": - t = T_; + t = x_; break; case "LineString": - t = x_; + t = C_; break; case "MultiLineString": - t = x_; + t = C_; break; case "Polygon": t = uu; @@ -88625,7 +88617,7 @@ function Cd(n4, e) { } var ji = []; var as = []; -var T_ = { +var x_ = { point: function(n4, e) { ji.push([n4, e]); }, @@ -88634,7 +88626,7 @@ var T_ = { return ji = [], n4; } }; -var x_ = { +var C_ = { lineStart: Ql, point: function(n4, e) { ji.push([n4, e]); @@ -88668,49 +88660,49 @@ var uu = { return null; var n4 = [], e = []; return as.forEach(function(t) { - pk(t) ? n4.push([t]) : e.push(t); + gk(t) ? n4.push([t]) : e.push(t); }), e.forEach(function(t) { var i = t[0]; n4.some(function(r) { - if (gk(r[0], i)) + if (mk(r[0], i)) return r.push(t), true; }) || n4.push([t]); }), as = [], n4.length ? n4.length > 1 ? { type: "MultiPolygon", coordinates: n4 } : { type: "Polygon", coordinates: n4[0] } : null; } }; -var Ek = class { +var vk = class { constructor(e, t, i, r, s, a, o, l, c) { this.name = e, this.scene = c, this.geoJson = t, this.projection = i, this.size = r, this.transform = s, this.simplification = a, this.cot = l, this.depth = o, this.selection = this.createMap(); } createMap() { - let e = v_(this.geoJson, this.projection.fitSize(this.size, this.geoJson).translate(this.transform)), t = v_(e, bB()), i = ZB({ features: t }), r = LB(i), s = wB(r, this.simplification), a = PB(s, s.objects.features), o, l = []; + let e = T_(this.geoJson, this.projection.fitSize(this.size, this.geoJson).translate(this.transform)), t = T_(e, AB()), i = jB({ features: t }), r = wB(i), s = UB(r, this.simplification), a = OB(s, s.objects.features), o, l = []; return a.features.forEach((c) => { if (c.geometry != null) { if (c.geometry.type === "Polygon") { let h = []; - c.geometry.coordinates[0].forEach((u) => h.push(new Vector3(u[0], 0, u[1]))), o = MeshBuilder.ExtrudePolygon("polygon", { shape: h, depth: this.depth, wrap: false, sideOrientation: 2 }, this.scene, E_), o.name = "polygon", o.parent = this.cot, o.metadata = { ...o.metadata, data: c.properties != null ? c.properties : null }, l.push(o); + c.geometry.coordinates[0].forEach((u) => h.push(new Vector3(u[0], 0, u[1]))), o = MeshBuilder.ExtrudePolygon("polygon", { shape: h, depth: this.depth, wrap: false, sideOrientation: 2 }, this.scene, v_), o.name = "polygon", o.parent = this.cot, o.metadata = { ...o.metadata, data: c.properties != null ? c.properties : null }, l.push(o); } else if (c.geometry.type === "MultiPolygon") { let h = []; c.geometry.coordinates.forEach((u) => { u.forEach((f) => { let d = []; - f.forEach((p) => d.push(new Vector3(p[0], 0, p[1]))), h.push(MeshBuilder.ExtrudePolygon("polygon", { shape: d, depth: this.depth, wrap: false, sideOrientation: 2 }, this.scene, E_)); + f.forEach((p) => d.push(new Vector3(p[0], 0, p[1]))), h.push(MeshBuilder.ExtrudePolygon("polygon", { shape: d, depth: this.depth, wrap: false, sideOrientation: 2 }, this.scene, v_)); }); }), o = Mesh.MergeMeshes(h, true, true), o.name = "polygon", o.parent = this.cot, o.metadata = { ...o.metadata, data: c.properties != null ? c.properties : null }, l.push(o); } } - }), new Jt(l, this.scene); + }), new qt(l, this.scene); } }; -function Ak(n4, e, t) { - const i = e.geoJson, r = e.projection || IB(), s = e.size || [10, 10], a = e.transform || [0, 0], o = e.simplification || 0, l = e.depth || 1, c = e.cot || new TransformNode("meshMapCOT", t); - return new Ek(n4, i, r, s, a, o, l, c, t); +function Mk(n4, e, t) { + const i = e.geoJson, r = e.projection || bB(), s = e.size || [10, 10], a = e.transform || [0, 0], o = e.simplification || 0, l = e.depth || 1, c = e.cot || new TransformNode("meshMapCOT", t); + return new vk(n4, i, r, s, a, o, l, c, t); } var Fv = { exports: {} }; (function(n4, e) { (function(t, i) { n4.exports = i(); - })(H3, function() { + })(K3, function() { for (var t = function(y, A, D) { return A === void 0 && (A = 0), D === void 0 && (D = 1), y < A ? A : y > D ? D : y; }, i = t, r = function(y) { @@ -88755,9 +88747,9 @@ var Fv = { exports: {} }; var V = this; if (C(A[0]) === "object" && A[0].constructor && A[0].constructor === this.constructor) return A[0]; - var X = v(A), H = false; + var X = v(A), K = false; if (!X) { - H = true, T.sorted || (T.autodetect = T.autodetect.sort(function(xe, Ue) { + K = true, T.sorted || (T.autodetect = T.autodetect.sort(function(xe, Ue) { return Ue.p - xe.p; }), T.sorted = true); for (var W = 0, $ = T.autodetect; W < $.length; W += 1) { @@ -88767,7 +88759,7 @@ var Fv = { exports: {} }; } } if (T.format[X]) { - var pe = T.format[X].apply(null, H ? A : A.slice(0, -1)); + var pe = T.format[X].apply(null, K ? A : A.slice(0, -1)); V._rgb = E(pe); } else throw new Error("unknown format: " + A); @@ -88782,28 +88774,28 @@ var Fv = { exports: {} }; return new (Function.prototype.bind.apply(S.Color, [null].concat(y)))(); }; S.Color = x, S.version = "2.4.2"; - var M = S, N = g.unpack, F = Math.max, L = function() { + var M = S, N = g.unpack, F = Math.max, U = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - var D = N(y, "rgb"), V = D[0], X = D[1], H = D[2]; - V = V / 255, X = X / 255, H = H / 255; - var W = 1 - F(V, F(X, H)), $ = W < 1 ? 1 / (1 - W) : 0, te = (1 - V - W) * $, pe = (1 - X - W) * $, xe = (1 - H - W) * $; + var D = N(y, "rgb"), V = D[0], X = D[1], K = D[2]; + V = V / 255, X = X / 255, K = K / 255; + var W = 1 - F(V, F(X, K)), $ = W < 1 ? 1 / (1 - W) : 0, te = (1 - V - W) * $, pe = (1 - X - W) * $, xe = (1 - K - W) * $; return [te, pe, xe, W]; - }, K = L, q = g.unpack, j = function() { + }, H = U, q = g.unpack, Z = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; y = q(y, "cmyk"); - var D = y[0], V = y[1], X = y[2], H = y[3], W = y.length > 4 ? y[4] : 1; - return H === 1 ? [0, 0, 0, W] : [ - D >= 1 ? 0 : 255 * (1 - D) * (1 - H), + var D = y[0], V = y[1], X = y[2], K = y[3], W = y.length > 4 ? y[4] : 1; + return K === 1 ? [0, 0, 0, W] : [ + D >= 1 ? 0 : 255 * (1 - D) * (1 - K), // r - V >= 1 ? 0 : 255 * (1 - V) * (1 - H), + V >= 1 ? 0 : 255 * (1 - V) * (1 - K), // g - X >= 1 ? 0 : 255 * (1 - X) * (1 - H), + X >= 1 ? 0 : 255 * (1 - X) * (1 - K), // b W ]; - }, k = j, Q = M, ce = x, de = m, Z = g.unpack, J = g.type, O = K; + }, k = Z, Q = M, ce = x, de = m, j = g.unpack, J = g.type, O = H; ce.prototype.cmyk = function() { return O(this._rgb); }, Q.cmyk = function() { @@ -88815,7 +88807,7 @@ var Fv = { exports: {} }; test: function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - if (y = Z(y, "cmyk"), J(y) === "array" && y.length === 4) + if (y = j(y, "cmyk"), J(y) === "array" && y.length === 4) return "cmyk"; } }); @@ -88832,8 +88824,8 @@ var Fv = { exports: {} }; y = fe(y, "rgba"); var D = y[0], V = y[1], X = y[2]; D /= 255, V /= 255, X /= 255; - var H = Math.min(D, V, X), W = Math.max(D, V, X), $ = (W + H) / 2, te, pe; - return W === H ? (te = 0, pe = Number.NaN) : te = $ < 0.5 ? (W - H) / (W + H) : (W - H) / (2 - W - H), D == W ? pe = (V - X) / (W - H) : V == W ? pe = 2 + (X - D) / (W - H) : X == W && (pe = 4 + (D - V) / (W - H)), pe *= 60, pe < 0 && (pe += 360), y.length > 3 && y[3] !== void 0 ? [pe, te, $, y[3]] : [pe, te, $]; + var K = Math.min(D, V, X), W = Math.max(D, V, X), $ = (W + K) / 2, te, pe; + return W === K ? (te = 0, pe = Number.NaN) : te = $ < 0.5 ? (W - K) / (W + K) : (W - K) / (2 - W - K), D == W ? pe = (V - X) / (W - K) : V == W ? pe = 2 + (X - D) / (W - K) : X == W && (pe = 4 + (D - V) / (W - K)), pe *= 60, pe < 0 && (pe += 360), y.length > 3 && y[3] !== void 0 ? [pe, te, $, y[3]] : [pe, te, $]; }, Fe = Te, Se = g.unpack, qe = g.last, ue = ze, Ye = Fe, lt = Math.round, Ut = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; @@ -88843,18 +88835,18 @@ var Fv = { exports: {} }; for (var y, A = [], D = arguments.length; D--; ) A[D] = arguments[D]; A = Bi(A, "hsl"); - var V = A[0], X = A[1], H = A[2], W, $, te; + var V = A[0], X = A[1], K = A[2], W, $, te; if (X === 0) - W = $ = te = H * 255; + W = $ = te = K * 255; else { - var pe = [0, 0, 0], xe = [0, 0, 0], Ue = H < 0.5 ? H * (1 + X) : H + X - H * X, ye = 2 * H - Ue, Xe = V / 360; + var pe = [0, 0, 0], xe = [0, 0, 0], Ue = K < 0.5 ? K * (1 + X) : K + X - K * X, ye = 2 * K - Ue, Xe = V / 360; pe[0] = Xe + 1 / 3, pe[1] = Xe, pe[2] = Xe - 1 / 3; for (var Ge = 0; Ge < 3; Ge++) pe[Ge] < 0 && (pe[Ge] += 1), pe[Ge] > 1 && (pe[Ge] -= 1), 6 * pe[Ge] < 1 ? xe[Ge] = ye + (Ue - ye) * 6 * pe[Ge] : 2 * pe[Ge] < 1 ? xe[Ge] = Ue : 3 * pe[Ge] < 2 ? xe[Ge] = ye + (Ue - ye) * (2 / 3 - pe[Ge]) * 6 : xe[Ge] = ye; y = [hi(xe[0] * 255), hi(xe[1] * 255), hi(xe[2] * 255)], W = y[0], $ = y[1], te = y[2]; } return A.length > 3 ? [W, $, te, A[3]] : [W, $, te, 1]; - }, Ur = Es, vs = Ur, ki = m, lr = /^rgb\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*\)$/, Rr = /^rgba\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*,\s*([01]|[01]?\.\d+)\)$/, Sr = /^rgb\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/, Ts = /^rgba\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/, xs = /^hsl\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/, yr = /^hsla\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/, Vr = Math.round, pn = function(y) { + }, Vr = Es, vs = Vr, ki = m, cr = /^rgb\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*\)$/, Rr = /^rgba\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*,\s*([01]|[01]?\.\d+)\)$/, Sr = /^rgb\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/, Ts = /^rgba\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/, xs = /^hsl\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/, yr = /^hsla\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/, Br = Math.round, gn = function(y) { y = y.toLowerCase().trim(); var A; if (ki.format.named) @@ -88862,24 +88854,24 @@ var Fv = { exports: {} }; return ki.format.named(y); } catch { } - if (A = y.match(lr)) { + if (A = y.match(cr)) { for (var D = A.slice(1, 4), V = 0; V < 3; V++) D[V] = +D[V]; return D[3] = 1, D; } if (A = y.match(Rr)) { - for (var X = A.slice(1, 5), H = 0; H < 4; H++) - X[H] = +X[H]; + for (var X = A.slice(1, 5), K = 0; K < 4; K++) + X[K] = +X[K]; return X; } if (A = y.match(Sr)) { for (var W = A.slice(1, 4), $ = 0; $ < 3; $++) - W[$] = Vr(W[$] * 2.55); + W[$] = Br(W[$] * 2.55); return W[3] = 1, W; } if (A = y.match(Ts)) { for (var te = A.slice(1, 5), pe = 0; pe < 3; pe++) - te[pe] = Vr(te[pe] * 2.55); + te[pe] = Br(te[pe] * 2.55); return te[3] = +te[3], te; } if (A = y.match(xs)) { @@ -88895,10 +88887,10 @@ var Fv = { exports: {} }; return Xe[3] = +A[4], Xe; } }; - pn.test = function(y) { - return lr.test(y) || Rr.test(y) || Sr.test(y) || Ts.test(y) || xs.test(y) || yr.test(y); + gn.test = function(y) { + return cr.test(y) || Rr.test(y) || Sr.test(y) || Ts.test(y) || xs.test(y) || yr.test(y); }; - var Mi = pn, sl = M, Ya = x, ts = m, kn = g.type, _r = Ct, Gs = Mi; + var Mi = gn, sl = M, Ya = x, ts = m, kn = g.type, _r = Ct, Gs = Mi; Ya.prototype.css = function(y) { return _r(this._rgb, y); }, sl.css = function() { @@ -88914,7 +88906,7 @@ var Fv = { exports: {} }; return "css"; } }); - var Rd = x, Uv = M, Vv = m, Bv = g.unpack; + var Sd = x, Uv = M, Vv = m, Bv = g.unpack; Vv.format.gl = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; @@ -88923,18 +88915,18 @@ var Fv = { exports: {} }; }, Uv.gl = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - return new (Function.prototype.bind.apply(Rd, [null].concat(y, ["gl"])))(); - }, Rd.prototype.gl = function() { + return new (Function.prototype.bind.apply(Sd, [null].concat(y, ["gl"])))(); + }, Sd.prototype.gl = function() { var y = this._rgb; return [y[0] / 255, y[1] / 255, y[2] / 255, y[3]]; }; var kv = g.unpack, zv = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - var D = kv(y, "rgb"), V = D[0], X = D[1], H = D[2], W = Math.min(V, X, H), $ = Math.max(V, X, H), te = $ - W, pe = te * 100 / 255, xe = W / (255 - te) * 100, Ue; - return te === 0 ? Ue = Number.NaN : (V === $ && (Ue = (X - H) / te), X === $ && (Ue = 2 + (H - V) / te), H === $ && (Ue = 4 + (V - X) / te), Ue *= 60, Ue < 0 && (Ue += 360)), [Ue, pe, xe]; + var D = kv(y, "rgb"), V = D[0], X = D[1], K = D[2], W = Math.min(V, X, K), $ = Math.max(V, X, K), te = $ - W, pe = te * 100 / 255, xe = W / (255 - te) * 100, Ue; + return te === 0 ? Ue = Number.NaN : (V === $ && (Ue = (X - K) / te), X === $ && (Ue = 2 + (K - V) / te), K === $ && (Ue = 4 + (V - X) / te), Ue *= 60, Ue < 0 && (Ue += 360)), [Ue, pe, xe]; }, Wv = zv, Gv = g.unpack, Xv = Math.floor, Hv = function() { - for (var y, A, D, V, X, H, W = [], $ = arguments.length; $--; ) + for (var y, A, D, V, X, K, W = [], $ = arguments.length; $--; ) W[$] = arguments[$]; W = Gv(W, "hcg"); var te = W[0], pe = W[1], xe = W[2], Ue, ye, Xe; @@ -88962,19 +88954,19 @@ var Fv = { exports: {} }; X = [zi, bt, Oi], Ue = X[0], ye = X[1], Xe = X[2]; break; case 5: - H = [Oi, bt, Ft], Ue = H[0], ye = H[1], Xe = H[2]; + K = [Oi, bt, Ft], Ue = K[0], ye = K[1], Xe = K[2]; break; } } return [Ue, ye, Xe, W.length > 3 ? W[3] : 1]; - }, Kv = Hv, qv = g.unpack, Yv = g.type, Zv = M, Sd = x, yd = m, jv = Wv; - Sd.prototype.hcg = function() { + }, Kv = Hv, qv = g.unpack, Yv = g.type, Zv = M, yd = x, Id = m, jv = Wv; + yd.prototype.hcg = function() { return jv(this._rgb); }, Zv.hcg = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - return new (Function.prototype.bind.apply(Sd, [null].concat(y, ["hcg"])))(); - }, yd.format.hcg = Kv, yd.autodetect.push({ + return new (Function.prototype.bind.apply(yd, [null].concat(y, ["hcg"])))(); + }, Id.format.hcg = Kv, Id.autodetect.push({ p: 1, test: function() { for (var y = [], A = arguments.length; A--; ) @@ -88986,9 +88978,9 @@ var Fv = { exports: {} }; var Qv = g.unpack, Jv = g.last, nl = Math.round, $v = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - var D = Qv(y, "rgba"), V = D[0], X = D[1], H = D[2], W = D[3], $ = Jv(y) || "auto"; - W === void 0 && (W = 1), $ === "auto" && ($ = W < 1 ? "rgba" : "rgb"), V = nl(V), X = nl(X), H = nl(H); - var te = V << 16 | X << 8 | H, pe = "000000" + te.toString(16); + var D = Qv(y, "rgba"), V = D[0], X = D[1], K = D[2], W = D[3], $ = Jv(y) || "auto"; + W === void 0 && (W = 1), $ === "auto" && ($ = W < 1 ? "rgba" : "rgb"), V = nl(V), X = nl(X), K = nl(K); + var te = V << 16 | X << 8 | K, pe = "000000" + te.toString(16); pe = pe.substr(pe.length - 6); var xe = "0" + nl(W * 255).toString(16); switch (xe = xe.substr(xe.length - 2), $.toLowerCase()) { @@ -88999,7 +88991,7 @@ var Fv = { exports: {} }; default: return "#" + pe; } - }, Id = $v, eT = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/, tT = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/, iT = function(y) { + }, bd = $v, eT = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/, tT = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/, iT = function(y) { if (y.match(eT)) { (y.length === 4 || y.length === 7) && (y = y.substr(1)), y.length === 3 && (y = y.split(""), y = y[0] + y[0] + y[1] + y[1] + y[2] + y[2]); var A = parseInt(y, 16), D = A >> 16, V = A >> 8 & 255, X = A & 255; @@ -89007,18 +88999,18 @@ var Fv = { exports: {} }; } if (y.match(tT)) { (y.length === 5 || y.length === 9) && (y = y.substr(1)), y.length === 4 && (y = y.split(""), y = y[0] + y[0] + y[1] + y[1] + y[2] + y[2] + y[3] + y[3]); - var H = parseInt(y, 16), W = H >> 24 & 255, $ = H >> 16 & 255, te = H >> 8 & 255, pe = Math.round((H & 255) / 255 * 100) / 100; + var K = parseInt(y, 16), W = K >> 24 & 255, $ = K >> 16 & 255, te = K >> 8 & 255, pe = Math.round((K & 255) / 255 * 100) / 100; return [W, $, te, pe]; } throw new Error("unknown hex color: " + y); - }, bd = iT, rT = M, Ad = x, sT = g.type, Md = m, nT = Id; - Ad.prototype.hex = function(y) { + }, Ad = iT, rT = M, Md = x, sT = g.type, Pd = m, nT = bd; + Md.prototype.hex = function(y) { return nT(this._rgb, y); }, rT.hex = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - return new (Function.prototype.bind.apply(Ad, [null].concat(y, ["hex"])))(); - }, Md.format.hex = bd, Md.autodetect.push({ + return new (Function.prototype.bind.apply(Md, [null].concat(y, ["hex"])))(); + }, Pd.format.hex = Ad, Pd.autodetect.push({ p: 4, test: function(y) { for (var A = [], D = arguments.length - 1; D-- > 0; ) @@ -89027,27 +89019,27 @@ var Fv = { exports: {} }; return "hex"; } }); - var aT = g.unpack, Pd = g.TWOPI, oT = Math.min, lT = Math.sqrt, cT = Math.acos, hT = function() { + var aT = g.unpack, Od = g.TWOPI, oT = Math.min, lT = Math.sqrt, cT = Math.acos, hT = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - var D = aT(y, "rgb"), V = D[0], X = D[1], H = D[2]; - V /= 255, X /= 255, H /= 255; - var W, $ = oT(V, X, H), te = (V + X + H) / 3, pe = te > 0 ? 1 - $ / te : 0; - return pe === 0 ? W = NaN : (W = (V - X + (V - H)) / 2, W /= lT((V - X) * (V - X) + (V - H) * (X - H)), W = cT(W), H > X && (W = Pd - W), W /= Pd), [W * 360, pe, te]; + var D = aT(y, "rgb"), V = D[0], X = D[1], K = D[2]; + V /= 255, X /= 255, K /= 255; + var W, $ = oT(V, X, K), te = (V + X + K) / 3, pe = te > 0 ? 1 - $ / te : 0; + return pe === 0 ? W = NaN : (W = (V - X + (V - K)) / 2, W /= lT((V - X) * (V - X) + (V - K) * (X - K)), W = cT(W), K > X && (W = Od - W), W /= Od), [W * 360, pe, te]; }, uT = hT, fT = g.unpack, ch = g.limit, zn = g.TWOPI, hh = g.PITHIRD, Wn = Math.cos, dT = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; y = fT(y, "hsi"); - var D = y[0], V = y[1], X = y[2], H, W, $; - return isNaN(D) && (D = 0), isNaN(V) && (V = 0), D > 360 && (D -= 360), D < 0 && (D += 360), D /= 360, D < 1 / 3 ? ($ = (1 - V) / 3, H = (1 + V * Wn(zn * D) / Wn(hh - zn * D)) / 3, W = 1 - ($ + H)) : D < 2 / 3 ? (D -= 1 / 3, H = (1 - V) / 3, W = (1 + V * Wn(zn * D) / Wn(hh - zn * D)) / 3, $ = 1 - (H + W)) : (D -= 2 / 3, W = (1 - V) / 3, $ = (1 + V * Wn(zn * D) / Wn(hh - zn * D)) / 3, H = 1 - (W + $)), H = ch(X * H * 3), W = ch(X * W * 3), $ = ch(X * $ * 3), [H * 255, W * 255, $ * 255, y.length > 3 ? y[3] : 1]; - }, pT = dT, gT = g.unpack, mT = g.type, _T = M, Od = x, Dd = m, ET = uT; - Od.prototype.hsi = function() { + var D = y[0], V = y[1], X = y[2], K, W, $; + return isNaN(D) && (D = 0), isNaN(V) && (V = 0), D > 360 && (D -= 360), D < 0 && (D += 360), D /= 360, D < 1 / 3 ? ($ = (1 - V) / 3, K = (1 + V * Wn(zn * D) / Wn(hh - zn * D)) / 3, W = 1 - ($ + K)) : D < 2 / 3 ? (D -= 1 / 3, K = (1 - V) / 3, W = (1 + V * Wn(zn * D) / Wn(hh - zn * D)) / 3, $ = 1 - (K + W)) : (D -= 2 / 3, W = (1 - V) / 3, $ = (1 + V * Wn(zn * D) / Wn(hh - zn * D)) / 3, K = 1 - (W + $)), K = ch(X * K * 3), W = ch(X * W * 3), $ = ch(X * $ * 3), [K * 255, W * 255, $ * 255, y.length > 3 ? y[3] : 1]; + }, pT = dT, gT = g.unpack, mT = g.type, _T = M, Dd = x, Nd = m, ET = uT; + Dd.prototype.hsi = function() { return ET(this._rgb); }, _T.hsi = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - return new (Function.prototype.bind.apply(Od, [null].concat(y, ["hsi"])))(); - }, Dd.format.hsi = pT, Dd.autodetect.push({ + return new (Function.prototype.bind.apply(Dd, [null].concat(y, ["hsi"])))(); + }, Nd.format.hsi = pT, Nd.autodetect.push({ p: 2, test: function() { for (var y = [], A = arguments.length; A--; ) @@ -89056,14 +89048,14 @@ var Fv = { exports: {} }; return "hsi"; } }); - var vT = g.unpack, TT = g.type, xT = M, Nd = x, Fd = m, CT = Fe; - Nd.prototype.hsl = function() { + var vT = g.unpack, TT = g.type, xT = M, Fd = x, Ld = m, CT = Fe; + Fd.prototype.hsl = function() { return CT(this._rgb); }, xT.hsl = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - return new (Function.prototype.bind.apply(Nd, [null].concat(y, ["hsl"])))(); - }, Fd.format.hsl = Ur, Fd.autodetect.push({ + return new (Function.prototype.bind.apply(Fd, [null].concat(y, ["hsl"])))(); + }, Ld.format.hsl = Vr, Ld.autodetect.push({ p: 2, test: function() { for (var y = [], A = arguments.length; A--; ) @@ -89076,10 +89068,10 @@ var Fv = { exports: {} }; for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; y = RT(y, "rgb"); - var D = y[0], V = y[1], X = y[2], H = ST(D, V, X), W = yT(D, V, X), $ = W - H, te, pe, xe; + var D = y[0], V = y[1], X = y[2], K = ST(D, V, X), W = yT(D, V, X), $ = W - K, te, pe, xe; return xe = W / 255, W === 0 ? (te = Number.NaN, pe = 0) : (pe = $ / W, D === W && (te = (V - X) / $), V === W && (te = 2 + (X - D) / $), X === W && (te = 4 + (D - V) / $), te *= 60, te < 0 && (te += 360)), [te, pe, xe]; }, bT = IT, AT = g.unpack, MT = Math.floor, PT = function() { - for (var y, A, D, V, X, H, W = [], $ = arguments.length; $--; ) + for (var y, A, D, V, X, K, W = [], $ = arguments.length; $--; ) W[$] = arguments[$]; W = AT(W, "hsv"); var te = W[0], pe = W[1], xe = W[2], Ue, ye, Xe; @@ -89105,19 +89097,19 @@ var Fv = { exports: {} }; X = [Ft, vt, xe], Ue = X[0], ye = X[1], Xe = X[2]; break; case 5: - H = [xe, vt, bt], Ue = H[0], ye = H[1], Xe = H[2]; + K = [xe, vt, bt], Ue = K[0], ye = K[1], Xe = K[2]; break; } } return [Ue, ye, Xe, W.length > 3 ? W[3] : 1]; - }, OT = PT, DT = g.unpack, NT = g.type, FT = M, Ld = x, wd = m, LT = bT; - Ld.prototype.hsv = function() { + }, OT = PT, DT = g.unpack, NT = g.type, FT = M, wd = x, Ud = m, LT = bT; + wd.prototype.hsv = function() { return LT(this._rgb); }, FT.hsv = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - return new (Function.prototype.bind.apply(Ld, [null].concat(y, ["hsv"])))(); - }, wd.format.hsv = OT, wd.autodetect.push({ + return new (Function.prototype.bind.apply(wd, [null].concat(y, ["hsv"])))(); + }, Ud.format.hsv = OT, Ud.autodetect.push({ p: 2, test: function() { for (var y = [], A = arguments.length; A--; ) @@ -89141,37 +89133,37 @@ var Fv = { exports: {} }; // 3 * t1 * t1 t3: 8856452e-9 // t1 * t1 * t1 - }, Gn = al, wT = g.unpack, Ud = Math.pow, UT = function() { + }, Gn = al, wT = g.unpack, Vd = Math.pow, UT = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - var D = wT(y, "rgb"), V = D[0], X = D[1], H = D[2], W = VT(V, X, H), $ = W[0], te = W[1], pe = W[2], xe = 116 * te - 16; + var D = wT(y, "rgb"), V = D[0], X = D[1], K = D[2], W = VT(V, X, K), $ = W[0], te = W[1], pe = W[2], xe = 116 * te - 16; return [xe < 0 ? 0 : xe, 500 * ($ - te), 200 * (te - pe)]; }, uh = function(y) { - return (y /= 255) <= 0.04045 ? y / 12.92 : Ud((y + 0.055) / 1.055, 2.4); + return (y /= 255) <= 0.04045 ? y / 12.92 : Vd((y + 0.055) / 1.055, 2.4); }, fh = function(y) { - return y > Gn.t3 ? Ud(y, 1 / 3) : y / Gn.t2 + Gn.t0; + return y > Gn.t3 ? Vd(y, 1 / 3) : y / Gn.t2 + Gn.t0; }, VT = function(y, A, D) { y = uh(y), A = uh(A), D = uh(D); - var V = fh((0.4124564 * y + 0.3575761 * A + 0.1804375 * D) / Gn.Xn), X = fh((0.2126729 * y + 0.7151522 * A + 0.072175 * D) / Gn.Yn), H = fh((0.0193339 * y + 0.119192 * A + 0.9503041 * D) / Gn.Zn); - return [V, X, H]; - }, Vd = UT, Xn = al, BT = g.unpack, kT = Math.pow, zT = function() { + var V = fh((0.4124564 * y + 0.3575761 * A + 0.1804375 * D) / Gn.Xn), X = fh((0.2126729 * y + 0.7151522 * A + 0.072175 * D) / Gn.Yn), K = fh((0.0193339 * y + 0.119192 * A + 0.9503041 * D) / Gn.Zn); + return [V, X, K]; + }, Bd = UT, Xn = al, BT = g.unpack, kT = Math.pow, zT = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; y = BT(y, "lab"); - var D = y[0], V = y[1], X = y[2], H, W, $, te, pe, xe; - return W = (D + 16) / 116, H = isNaN(V) ? W : W + V / 500, $ = isNaN(X) ? W : W - X / 200, W = Xn.Yn * ph(W), H = Xn.Xn * ph(H), $ = Xn.Zn * ph($), te = dh(3.2404542 * H - 1.5371385 * W - 0.4985314 * $), pe = dh(-0.969266 * H + 1.8760108 * W + 0.041556 * $), xe = dh(0.0556434 * H - 0.2040259 * W + 1.0572252 * $), [te, pe, xe, y.length > 3 ? y[3] : 1]; + var D = y[0], V = y[1], X = y[2], K, W, $, te, pe, xe; + return W = (D + 16) / 116, K = isNaN(V) ? W : W + V / 500, $ = isNaN(X) ? W : W - X / 200, W = Xn.Yn * ph(W), K = Xn.Xn * ph(K), $ = Xn.Zn * ph($), te = dh(3.2404542 * K - 1.5371385 * W - 0.4985314 * $), pe = dh(-0.969266 * K + 1.8760108 * W + 0.041556 * $), xe = dh(0.0556434 * K - 0.2040259 * W + 1.0572252 * $), [te, pe, xe, y.length > 3 ? y[3] : 1]; }, dh = function(y) { return 255 * (y <= 304e-5 ? 12.92 * y : 1.055 * kT(y, 1 / 2.4) - 0.055); }, ph = function(y) { return y > Xn.t1 ? y * y * y : Xn.t2 * (y - Xn.t0); - }, Bd = zT, WT = g.unpack, GT = g.type, XT = M, kd = x, zd = m, HT = Vd; - kd.prototype.lab = function() { + }, kd = zT, WT = g.unpack, GT = g.type, XT = M, zd = x, Wd = m, HT = Bd; + zd.prototype.lab = function() { return HT(this._rgb); }, XT.lab = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - return new (Function.prototype.bind.apply(kd, [null].concat(y, ["lab"])))(); - }, zd.format.lab = Bd, zd.autodetect.push({ + return new (Function.prototype.bind.apply(zd, [null].concat(y, ["lab"])))(); + }, Wd.format.lab = kd, Wd.autodetect.push({ p: 2, test: function() { for (var y = [], A = arguments.length; A--; ) @@ -89183,43 +89175,43 @@ var Fv = { exports: {} }; var KT = g.unpack, qT = g.RAD2DEG, YT = Math.sqrt, ZT = Math.atan2, jT = Math.round, QT = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - var D = KT(y, "lab"), V = D[0], X = D[1], H = D[2], W = YT(X * X + H * H), $ = (ZT(H, X) * qT + 360) % 360; + var D = KT(y, "lab"), V = D[0], X = D[1], K = D[2], W = YT(X * X + K * K), $ = (ZT(K, X) * qT + 360) % 360; return jT(W * 1e4) === 0 && ($ = Number.NaN), [V, W, $]; - }, Wd = QT, JT = g.unpack, $T = Vd, ex = Wd, tx = function() { + }, Gd = QT, JT = g.unpack, $T = Bd, ex = Gd, tx = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - var D = JT(y, "rgb"), V = D[0], X = D[1], H = D[2], W = $T(V, X, H), $ = W[0], te = W[1], pe = W[2]; + var D = JT(y, "rgb"), V = D[0], X = D[1], K = D[2], W = $T(V, X, K), $ = W[0], te = W[1], pe = W[2]; return ex($, te, pe); }, ix = tx, rx = g.unpack, sx = g.DEG2RAD, nx = Math.sin, ax = Math.cos, ox = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - var D = rx(y, "lch"), V = D[0], X = D[1], H = D[2]; - return isNaN(H) && (H = 0), H = H * sx, [V, ax(H) * X, nx(H) * X]; - }, Gd = ox, lx = g.unpack, cx = Gd, hx = Bd, ux = function() { + var D = rx(y, "lch"), V = D[0], X = D[1], K = D[2]; + return isNaN(K) && (K = 0), K = K * sx, [V, ax(K) * X, nx(K) * X]; + }, Xd = ox, lx = g.unpack, cx = Xd, hx = kd, ux = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; y = lx(y, "lch"); - var D = y[0], V = y[1], X = y[2], H = cx(D, V, X), W = H[0], $ = H[1], te = H[2], pe = hx(W, $, te), xe = pe[0], Ue = pe[1], ye = pe[2]; + var D = y[0], V = y[1], X = y[2], K = cx(D, V, X), W = K[0], $ = K[1], te = K[2], pe = hx(W, $, te), xe = pe[0], Ue = pe[1], ye = pe[2]; return [xe, Ue, ye, y.length > 3 ? y[3] : 1]; - }, Xd = ux, fx = g.unpack, dx = Xd, px = function() { + }, Hd = ux, fx = g.unpack, dx = Hd, px = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; var D = fx(y, "hcl").reverse(); return dx.apply(void 0, D); - }, gx = px, mx = g.unpack, _x = g.type, Hd = M, ol = x, gh = m, Kd = ix; + }, gx = px, mx = g.unpack, _x = g.type, Kd = M, ol = x, gh = m, qd = ix; ol.prototype.lch = function() { - return Kd(this._rgb); + return qd(this._rgb); }, ol.prototype.hcl = function() { - return Kd(this._rgb).reverse(); - }, Hd.lch = function() { + return qd(this._rgb).reverse(); + }, Kd.lch = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; return new (Function.prototype.bind.apply(ol, [null].concat(y, ["lch"])))(); - }, Hd.hcl = function() { + }, Kd.hcl = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; return new (Function.prototype.bind.apply(ol, [null].concat(y, ["hcl"])))(); - }, gh.format.lch = Xd, gh.format.hcl = gx, ["lch", "hcl"].forEach(function(y) { + }, gh.format.lch = Hd, gh.format.hcl = gx, ["lch", "hcl"].forEach(function(y) { return gh.autodetect.push({ p: 2, test: function() { @@ -89386,7 +89378,7 @@ var Fv = { exports: {} }; whitesmoke: "#f5f5f5", yellow: "#ffff00", yellowgreen: "#9acd32" - }, qd = Ex, vx = x, Yd = m, Tx = g.type, Za = qd, xx = bd, Cx = Id; + }, Yd = Ex, vx = x, Zd = m, Tx = g.type, Za = Yd, xx = Ad, Cx = bd; vx.prototype.name = function() { for (var y = Cx(this._rgb, "rgb"), A = 0, D = Object.keys(Za); A < D.length; A += 1) { var V = D[A]; @@ -89394,11 +89386,11 @@ var Fv = { exports: {} }; return V.toLowerCase(); } return y; - }, Yd.format.named = function(y) { + }, Zd.format.named = function(y) { if (y = y.toLowerCase(), Za[y]) return xx(Za[y]); throw new Error("unknown color name: " + y); - }, Yd.autodetect.push({ + }, Zd.autodetect.push({ p: 5, test: function(y) { for (var A = [], D = arguments.length - 1; D-- > 0; ) @@ -89410,22 +89402,22 @@ var Fv = { exports: {} }; var Rx = g.unpack, Sx = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - var D = Rx(y, "rgb"), V = D[0], X = D[1], H = D[2]; - return (V << 16) + (X << 8) + H; + var D = Rx(y, "rgb"), V = D[0], X = D[1], K = D[2]; + return (V << 16) + (X << 8) + K; }, yx = Sx, Ix = g.type, bx = function(y) { if (Ix(y) == "number" && y >= 0 && y <= 16777215) { var A = y >> 16, D = y >> 8 & 255, V = y & 255; return [A, D, V, 1]; } throw new Error("unknown num color: " + y); - }, Ax = bx, Mx = M, Zd = x, jd = m, Px = g.type, Ox = yx; - Zd.prototype.num = function() { + }, Ax = bx, Mx = M, jd = x, Qd = m, Px = g.type, Ox = yx; + jd.prototype.num = function() { return Ox(this._rgb); }, Mx.num = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - return new (Function.prototype.bind.apply(Zd, [null].concat(y, ["num"])))(); - }, jd.format.num = Ax, jd.autodetect.push({ + return new (Function.prototype.bind.apply(jd, [null].concat(y, ["num"])))(); + }, Qd.format.num = Ax, Qd.autodetect.push({ p: 5, test: function() { for (var y = [], A = arguments.length; A--; ) @@ -89434,41 +89426,41 @@ var Fv = { exports: {} }; return "num"; } }); - var Dx = M, mh = x, Qd = m, Jd = g.unpack, $d = g.type, ep = Math.round; + var Dx = M, mh = x, Jd = m, $d = g.unpack, ep = g.type, tp = Math.round; mh.prototype.rgb = function(y) { - return y === void 0 && (y = true), y === false ? this._rgb.slice(0, 3) : this._rgb.slice(0, 3).map(ep); + return y === void 0 && (y = true), y === false ? this._rgb.slice(0, 3) : this._rgb.slice(0, 3).map(tp); }, mh.prototype.rgba = function(y) { return y === void 0 && (y = true), this._rgb.slice(0, 4).map(function(A, D) { - return D < 3 ? y === false ? A : ep(A) : A; + return D < 3 ? y === false ? A : tp(A) : A; }); }, Dx.rgb = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; return new (Function.prototype.bind.apply(mh, [null].concat(y, ["rgb"])))(); - }, Qd.format.rgb = function() { + }, Jd.format.rgb = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - var D = Jd(y, "rgba"); + var D = $d(y, "rgba"); return D[3] === void 0 && (D[3] = 1), D; - }, Qd.autodetect.push({ + }, Jd.autodetect.push({ p: 3, test: function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - if (y = Jd(y, "rgba"), $d(y) === "array" && (y.length === 3 || y.length === 4 && $d(y[3]) == "number" && y[3] >= 0 && y[3] <= 1)) + if (y = $d(y, "rgba"), ep(y) === "array" && (y.length === 3 || y.length === 4 && ep(y[3]) == "number" && y[3] >= 0 && y[3] <= 1)) return "rgb"; } }); var ll = Math.log, Nx = function(y) { var A = y / 100, D, V, X; return A < 66 ? (D = 255, V = A < 6 ? 0 : -155.25485562709179 - 0.44596950469579133 * (V = A - 2) + 104.49216199393888 * ll(V), X = A < 20 ? 0 : -254.76935184120902 + 0.8274096064007395 * (X = A - 10) + 115.67994401066147 * ll(X)) : (D = 351.97690566805693 + 0.114206453784165 * (D = A - 55) - 40.25366309332127 * ll(D), V = 325.4494125711974 + 0.07943456536662342 * (V = A - 50) - 28.0852963507957 * ll(V), X = 255), [D, V, X, 1]; - }, tp = Nx, Fx = tp, Lx = g.unpack, wx = Math.round, Ux = function() { + }, ip = Nx, Fx = ip, Lx = g.unpack, wx = Math.round, Ux = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - for (var D = Lx(y, "rgb"), V = D[0], X = D[2], H = 1e3, W = 4e4, $ = 0.4, te; W - H > $; ) { - te = (W + H) * 0.5; + for (var D = Lx(y, "rgb"), V = D[0], X = D[2], K = 1e3, W = 4e4, $ = 0.4, te; W - K > $; ) { + te = (W + K) * 0.5; var pe = Fx(te); - pe[2] / pe[0] >= X / V ? W = te : H = te; + pe[2] / pe[0] >= X / V ? W = te : K = te; } return wx(te); }, Vx = Ux, _h = M, cl = x, Eh = m, Bx = Vx; @@ -89478,17 +89470,17 @@ var Fv = { exports: {} }; for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; return new (Function.prototype.bind.apply(cl, [null].concat(y, ["temp"])))(); - }, Eh.format.temp = Eh.format.kelvin = Eh.format.temperature = tp; + }, Eh.format.temp = Eh.format.kelvin = Eh.format.temperature = ip; var kx = g.unpack, vh = Math.cbrt, zx = Math.pow, Wx = Math.sign, Gx = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - var D = kx(y, "rgb"), V = D[0], X = D[1], H = D[2], W = [Th(V / 255), Th(X / 255), Th(H / 255)], $ = W[0], te = W[1], pe = W[2], xe = vh(0.4122214708 * $ + 0.5363325363 * te + 0.0514459929 * pe), Ue = vh(0.2119034982 * $ + 0.6806995451 * te + 0.1073969566 * pe), ye = vh(0.0883024619 * $ + 0.2817188376 * te + 0.6299787005 * pe); + var D = kx(y, "rgb"), V = D[0], X = D[1], K = D[2], W = [Th(V / 255), Th(X / 255), Th(K / 255)], $ = W[0], te = W[1], pe = W[2], xe = vh(0.4122214708 * $ + 0.5363325363 * te + 0.0514459929 * pe), Ue = vh(0.2119034982 * $ + 0.6806995451 * te + 0.1073969566 * pe), ye = vh(0.0883024619 * $ + 0.2817188376 * te + 0.6299787005 * pe); return [ 0.2104542553 * xe + 0.793617785 * Ue - 0.0040720468 * ye, 1.9779984951 * xe - 2.428592205 * Ue + 0.4505937099 * ye, 0.0259040371 * xe + 0.7827717662 * Ue - 0.808675766 * ye ]; - }, ip = Gx; + }, rp = Gx; function Th(y) { var A = Math.abs(y); return A < 0.04045 ? y / 12.92 : (Wx(y) || 1) * zx((A + 0.055) / 1.055, 2.4); @@ -89497,26 +89489,26 @@ var Fv = { exports: {} }; for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; y = Xx(y, "lab"); - var D = y[0], V = y[1], X = y[2], H = hl(D + 0.3963377774 * V + 0.2158037573 * X, 3), W = hl(D - 0.1055613458 * V - 0.0638541728 * X, 3), $ = hl(D - 0.0894841775 * V - 1.291485548 * X, 3); + var D = y[0], V = y[1], X = y[2], K = hl(D + 0.3963377774 * V + 0.2158037573 * X, 3), W = hl(D - 0.1055613458 * V - 0.0638541728 * X, 3), $ = hl(D - 0.0894841775 * V - 1.291485548 * X, 3); return [ - 255 * xh(4.0767416621 * H - 3.3077115913 * W + 0.2309699292 * $), - 255 * xh(-1.2684380046 * H + 2.6097574011 * W - 0.3413193965 * $), - 255 * xh(-0.0041960863 * H - 0.7034186147 * W + 1.707614701 * $), + 255 * xh(4.0767416621 * K - 3.3077115913 * W + 0.2309699292 * $), + 255 * xh(-1.2684380046 * K + 2.6097574011 * W - 0.3413193965 * $), + 255 * xh(-0.0041960863 * K - 0.7034186147 * W + 1.707614701 * $), y.length > 3 ? y[3] : 1 ]; - }, rp = Kx; + }, sp = Kx; function xh(y) { var A = Math.abs(y); return A > 31308e-7 ? (Hx(y) || 1) * (1.055 * hl(A, 1 / 2.4) - 0.055) : y * 12.92; } - var qx = g.unpack, Yx = g.type, Zx = M, sp = x, np = m, jx = ip; - sp.prototype.oklab = function() { + var qx = g.unpack, Yx = g.type, Zx = M, np = x, ap = m, jx = rp; + np.prototype.oklab = function() { return jx(this._rgb); }, Zx.oklab = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - return new (Function.prototype.bind.apply(sp, [null].concat(y, ["oklab"])))(); - }, np.format.oklab = rp, np.autodetect.push({ + return new (Function.prototype.bind.apply(np, [null].concat(y, ["oklab"])))(); + }, ap.format.oklab = sp, ap.autodetect.push({ p: 3, test: function() { for (var y = [], A = arguments.length; A--; ) @@ -89525,25 +89517,25 @@ var Fv = { exports: {} }; return "oklab"; } }); - var Qx = g.unpack, Jx = ip, $x = Wd, eC = function() { + var Qx = g.unpack, Jx = rp, $x = Gd, eC = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - var D = Qx(y, "rgb"), V = D[0], X = D[1], H = D[2], W = Jx(V, X, H), $ = W[0], te = W[1], pe = W[2]; + var D = Qx(y, "rgb"), V = D[0], X = D[1], K = D[2], W = Jx(V, X, K), $ = W[0], te = W[1], pe = W[2]; return $x($, te, pe); - }, tC = eC, iC = g.unpack, rC = Gd, sC = rp, nC = function() { + }, tC = eC, iC = g.unpack, rC = Xd, sC = sp, nC = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; y = iC(y, "lch"); - var D = y[0], V = y[1], X = y[2], H = rC(D, V, X), W = H[0], $ = H[1], te = H[2], pe = sC(W, $, te), xe = pe[0], Ue = pe[1], ye = pe[2]; + var D = y[0], V = y[1], X = y[2], K = rC(D, V, X), W = K[0], $ = K[1], te = K[2], pe = sC(W, $, te), xe = pe[0], Ue = pe[1], ye = pe[2]; return [xe, Ue, ye, y.length > 3 ? y[3] : 1]; - }, aC = nC, oC = g.unpack, lC = g.type, cC = M, ap = x, op = m, hC = tC; - ap.prototype.oklch = function() { + }, aC = nC, oC = g.unpack, lC = g.type, cC = M, op = x, lp = m, hC = tC; + op.prototype.oklch = function() { return hC(this._rgb); }, cC.oklch = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; - return new (Function.prototype.bind.apply(ap, [null].concat(y, ["oklch"])))(); - }, op.format.oklch = aC, op.autodetect.push({ + return new (Function.prototype.bind.apply(op, [null].concat(y, ["oklch"])))(); + }, lp.format.oklch = aC, lp.autodetect.push({ p: 3, test: function() { for (var y = [], A = arguments.length; A--; ) @@ -89552,29 +89544,29 @@ var Fv = { exports: {} }; return "oklch"; } }); - var lp = x, uC = g.type; - lp.prototype.alpha = function(y, A) { - return A === void 0 && (A = false), y !== void 0 && uC(y) === "number" ? A ? (this._rgb[3] = y, this) : new lp([this._rgb[0], this._rgb[1], this._rgb[2], y], "rgb") : this._rgb[3]; + var cp = x, uC = g.type; + cp.prototype.alpha = function(y, A) { + return A === void 0 && (A = false), y !== void 0 && uC(y) === "number" ? A ? (this._rgb[3] = y, this) : new cp([this._rgb[0], this._rgb[1], this._rgb[2], y], "rgb") : this._rgb[3]; }; var fC = x; fC.prototype.clipped = function() { return this._rgb._clipped || false; }; - var gn = x, dC = al; - gn.prototype.darken = function(y) { + var mn = x, dC = al; + mn.prototype.darken = function(y) { y === void 0 && (y = 1); var A = this, D = A.lab(); - return D[0] -= dC.Kn * y, new gn(D, "lab").alpha(A.alpha(), true); - }, gn.prototype.brighten = function(y) { + return D[0] -= dC.Kn * y, new mn(D, "lab").alpha(A.alpha(), true); + }, mn.prototype.brighten = function(y) { return y === void 0 && (y = 1), this.darken(-y); - }, gn.prototype.darker = gn.prototype.darken, gn.prototype.brighter = gn.prototype.brighten; + }, mn.prototype.darker = mn.prototype.darken, mn.prototype.brighter = mn.prototype.brighten; var pC = x; pC.prototype.get = function(y) { var A = y.split("."), D = A[0], V = A[1], X = this[D](); if (V) { - var H = D.indexOf(V) - (D.substr(0, 2) === "ok" ? 2 : 0); - if (H > -1) - return X[H]; + var K = D.indexOf(V) - (D.substr(0, 2) === "ok" ? 2 : 0); + if (K > -1) + return X[K]; throw new Error("unknown channel " + V + " in mode " + D); } else return X; @@ -89589,8 +89581,8 @@ var Fv = { exports: {} }; var A = this.luminance(), D = "rgb", V = EC, X = function(W, $) { var te = W.interpolate($, 0.5, D), pe = te.luminance(); return Math.abs(y - pe) < _C || !V-- ? te : pe > y ? X(W, te) : X(te, $); - }, H = (A > y ? X(new Hn([0, 0, 0]), this) : X(this, new Hn([255, 255, 255]))).rgb(); - return new Hn(H.concat([this._rgb[3]])); + }, K = (A > y ? X(new Hn([0, 0, 0]), this) : X(this, new Hn([255, 255, 255]))).rgb(); + return new Hn(K.concat([this._rgb[3]])); } return vC.apply(void 0, this._rgb.slice(0, 3)); }; @@ -89598,26 +89590,26 @@ var Fv = { exports: {} }; return y = Ch(y), A = Ch(A), D = Ch(D), 0.2126 * y + 0.7152 * A + 0.0722 * D; }, Ch = function(y) { return y /= 255, y <= 0.03928 ? y / 12.92 : mC((y + 0.055) / 1.055, 2.4); - }, Er = {}, cp = x, hp = g.type, ul = Er, up = function(y, A, D) { + }, Er = {}, hp = x, up = g.type, ul = Er, fp = function(y, A, D) { D === void 0 && (D = 0.5); for (var V = [], X = arguments.length - 3; X-- > 0; ) V[X] = arguments[X + 3]; - var H = V[0] || "lrgb"; - if (!ul[H] && !V.length && (H = Object.keys(ul)[0]), !ul[H]) - throw new Error("interpolation mode " + H + " is not defined"); - return hp(y) !== "object" && (y = new cp(y)), hp(A) !== "object" && (A = new cp(A)), ul[H](y, A, D).alpha(y.alpha() + D * (A.alpha() - y.alpha())); - }, fp = x, TC = up; - fp.prototype.mix = fp.prototype.interpolate = function(y, A) { + var K = V[0] || "lrgb"; + if (!ul[K] && !V.length && (K = Object.keys(ul)[0]), !ul[K]) + throw new Error("interpolation mode " + K + " is not defined"); + return up(y) !== "object" && (y = new hp(y)), up(A) !== "object" && (A = new hp(A)), ul[K](y, A, D).alpha(y.alpha() + D * (A.alpha() - y.alpha())); + }, dp = x, TC = fp; + dp.prototype.mix = dp.prototype.interpolate = function(y, A) { A === void 0 && (A = 0.5); for (var D = [], V = arguments.length - 2; V-- > 0; ) D[V] = arguments[V + 2]; return TC.apply(void 0, [this, y, A].concat(D)); }; - var dp = x; - dp.prototype.premultiply = function(y) { + var pp = x; + pp.prototype.premultiply = function(y) { y === void 0 && (y = false); var A = this._rgb, D = A[3]; - return y ? (this._rgb = [A[0] * D, A[1] * D, A[2] * D, D], this) : new dp([A[0] * D, A[1] * D, A[2] * D, D], "rgb"); + return y ? (this._rgb = [A[0] * D, A[1] * D, A[2] * D, D], this) : new pp([A[0] * D, A[1] * D, A[2] * D, D], "rgb"); }; var Rh = x, xC = al; Rh.prototype.saturate = function(y) { @@ -89627,14 +89619,14 @@ var Fv = { exports: {} }; }, Rh.prototype.desaturate = function(y) { return y === void 0 && (y = 1), this.saturate(-y); }; - var pp = x, gp = g.type; - pp.prototype.set = function(y, A, D) { + var gp = x, mp = g.type; + gp.prototype.set = function(y, A, D) { D === void 0 && (D = false); - var V = y.split("."), X = V[0], H = V[1], W = this[X](); - if (H) { - var $ = X.indexOf(H) - (X.substr(0, 2) === "ok" ? 2 : 0); + var V = y.split("."), X = V[0], K = V[1], W = this[X](); + if (K) { + var $ = X.indexOf(K) - (X.substr(0, 2) === "ok" ? 2 : 0); if ($ > -1) { - if (gp(A) == "string") + if (mp(A) == "string") switch (A.charAt(0)) { case "+": W[$] += +A; @@ -89651,14 +89643,14 @@ var Fv = { exports: {} }; default: W[$] = +A; } - else if (gp(A) === "number") + else if (mp(A) === "number") W[$] = A; else throw new Error("unsupported value for Color.set"); - var te = new pp(W, X); + var te = new gp(W, X); return D ? (this._rgb = te._rgb, this) : te; } - throw new Error("unknown channel " + H + " in mode " + X); + throw new Error("unknown channel " + K + " in mode " + X); } else return W; }; @@ -89673,10 +89665,10 @@ var Fv = { exports: {} }; }; Er.rgb = RC; var SC = x, Sh = Math.sqrt, Kn = Math.pow, yC = function(y, A, D) { - var V = y._rgb, X = V[0], H = V[1], W = V[2], $ = A._rgb, te = $[0], pe = $[1], xe = $[2]; + var V = y._rgb, X = V[0], K = V[1], W = V[2], $ = A._rgb, te = $[0], pe = $[1], xe = $[2]; return new SC( Sh(Kn(X, 2) * (1 - D) + Kn(te, 2) * D), - Sh(Kn(H, 2) * (1 - D) + Kn(pe, 2) * D), + Sh(Kn(K, 2) * (1 - D) + Kn(pe, 2) * D), Sh(Kn(W, 2) * (1 - D) + Kn(xe, 2) * D), "rgb" ); @@ -89692,17 +89684,17 @@ var Fv = { exports: {} }; ); }; Er.lab = bC; - var mp = x, qn = function(y, A, D, V) { - var X, H, W, $; + var _p = x, qn = function(y, A, D, V) { + var X, K, W, $; V === "hsl" ? (W = y.hsl(), $ = A.hsl()) : V === "hsv" ? (W = y.hsv(), $ = A.hsv()) : V === "hcg" ? (W = y.hcg(), $ = A.hcg()) : V === "hsi" ? (W = y.hsi(), $ = A.hsi()) : V === "lch" || V === "hcl" ? (V = "hcl", W = y.hcl(), $ = A.hcl()) : V === "oklch" && (W = y.oklch().reverse(), $ = A.oklch().reverse()); var te, pe, xe, Ue, ye, Xe; - (V.substr(0, 1) === "h" || V === "oklch") && (X = W, te = X[0], xe = X[1], ye = X[2], H = $, pe = H[0], Ue = H[1], Xe = H[2]); + (V.substr(0, 1) === "h" || V === "oklch") && (X = W, te = X[0], xe = X[1], ye = X[2], K = $, pe = K[0], Ue = K[1], Xe = K[2]); var Ge, ft, vt, bt; - return !isNaN(te) && !isNaN(pe) ? (pe > te && pe - te > 180 ? bt = pe - (te + 360) : pe < te && te - pe > 180 ? bt = pe + 360 - te : bt = pe - te, ft = te + D * bt) : isNaN(te) ? isNaN(pe) ? ft = Number.NaN : (ft = pe, (ye == 1 || ye == 0) && V != "hsv" && (Ge = Ue)) : (ft = te, (Xe == 1 || Xe == 0) && V != "hsv" && (Ge = xe)), Ge === void 0 && (Ge = xe + D * (Ue - xe)), vt = ye + D * (Xe - ye), V === "oklch" ? new mp([vt, Ge, ft], V) : new mp([ft, Ge, vt], V); - }, AC = qn, _p = function(y, A, D) { + return !isNaN(te) && !isNaN(pe) ? (pe > te && pe - te > 180 ? bt = pe - (te + 360) : pe < te && te - pe > 180 ? bt = pe + 360 - te : bt = pe - te, ft = te + D * bt) : isNaN(te) ? isNaN(pe) ? ft = Number.NaN : (ft = pe, (ye == 1 || ye == 0) && V != "hsv" && (Ge = Ue)) : (ft = te, (Xe == 1 || Xe == 0) && V != "hsv" && (Ge = xe)), Ge === void 0 && (Ge = xe + D * (Ue - xe)), vt = ye + D * (Xe - ye), V === "oklch" ? new _p([vt, Ge, ft], V) : new _p([ft, Ge, vt], V); + }, AC = qn, Ep = function(y, A, D) { return AC(y, A, D, "lch"); }; - Er.lch = _p, Er.hcl = _p; + Er.lch = Ep, Er.hcl = Ep; var MC = x, PC = function(y, A, D) { var V = y.num(), X = A.num(); return new MC(V + D * (X - V), "num"); @@ -89738,7 +89730,7 @@ var Fv = { exports: {} }; return zC(y, A, D, "oklch"); }; Er.oklch = WC; - var yh = x, GC = g.clip_rgb, Ih = Math.pow, bh = Math.sqrt, Ah = Math.PI, Ep = Math.cos, vp = Math.sin, XC = Math.atan2, HC = function(y, A, D) { + var yh = x, GC = g.clip_rgb, Ih = Math.pow, bh = Math.sqrt, Ah = Math.PI, vp = Math.cos, Tp = Math.sin, XC = Math.atan2, HC = function(y, A, D) { A === void 0 && (A = "lrgb"), D === void 0 && (D = null); var V = y.length; D || (D = Array.from(new Array(V)).map(function() { @@ -89753,12 +89745,12 @@ var Fv = { exports: {} }; return new yh(ft); }), A === "lrgb") return KC(y, D); - for (var H = y.shift(), W = H.get(A), $ = [], te = 0, pe = 0, xe = 0; xe < W.length; xe++) + for (var K = y.shift(), W = K.get(A), $ = [], te = 0, pe = 0, xe = 0; xe < W.length; xe++) if (W[xe] = (W[xe] || 0) * D[0], $.push(isNaN(W[xe]) ? 0 : D[0]), A.charAt(xe) === "h" && !isNaN(W[xe])) { var Ue = W[xe] / 180 * Ah; - te += Ep(Ue) * D[0], pe += vp(Ue) * D[0]; + te += vp(Ue) * D[0], pe += Tp(Ue) * D[0]; } - var ye = H.alpha() * D[0]; + var ye = K.alpha() * D[0]; y.forEach(function(ft, vt) { var bt = ft.get(A); ye += ft.alpha() * D[vt + 1]; @@ -89766,7 +89758,7 @@ var Fv = { exports: {} }; if (!isNaN(bt[Ft])) if ($[Ft] += D[vt + 1], A.charAt(Ft) === "h") { var zi = bt[Ft] / 180 * Ah; - te += Ep(zi) * D[vt + 1], pe += vp(zi) * D[vt + 1]; + te += vp(zi) * D[vt + 1], pe += Tp(zi) * D[vt + 1]; } else W[Ft] += bt[Ft] * D[vt + 1]; }); @@ -89782,21 +89774,21 @@ var Fv = { exports: {} }; return ye /= V, new yh(W, A).alpha(ye > 0.99999 ? 1 : ye, true); }, KC = function(y, A) { for (var D = y.length, V = [0, 0, 0, 0], X = 0; X < y.length; X++) { - var H = y[X], W = A[X] / D, $ = H._rgb; + var K = y[X], W = A[X] / D, $ = K._rgb; V[0] += Ih($[0], 2) * W, V[1] += Ih($[1], 2) * W, V[2] += Ih($[2], 2) * W, V[3] += $[3] * W; } return V[0] = bh(V[0]), V[1] = bh(V[1]), V[2] = bh(V[2]), V[3] > 0.9999999 && (V[3] = 1), new yh(GC(V)); - }, Br = M, Yn = g.type, qC = Math.pow, Mh = function(y) { - var A = "rgb", D = Br("#ccc"), V = 0, X = [0, 1], H = [], W = [0, 0], $ = false, te = [], pe = false, xe = 0, Ue = 1, ye = false, Xe = {}, Ge = true, ft = 1, vt = function(Ae) { - if (Ae = Ae || ["#fff", "#000"], Ae && Yn(Ae) === "string" && Br.brewer && Br.brewer[Ae.toLowerCase()] && (Ae = Br.brewer[Ae.toLowerCase()]), Yn(Ae) === "array") { + }, kr = M, Yn = g.type, qC = Math.pow, Mh = function(y) { + var A = "rgb", D = kr("#ccc"), V = 0, X = [0, 1], K = [], W = [0, 0], $ = false, te = [], pe = false, xe = 0, Ue = 1, ye = false, Xe = {}, Ge = true, ft = 1, vt = function(Ae) { + if (Ae = Ae || ["#fff", "#000"], Ae && Yn(Ae) === "string" && kr.brewer && kr.brewer[Ae.toLowerCase()] && (Ae = kr.brewer[Ae.toLowerCase()]), Yn(Ae) === "array") { Ae.length === 1 && (Ae = [Ae[0], Ae[0]]), Ae = Ae.slice(0); for (var Je = 0; Je < Ae.length; Je++) - Ae[Je] = Br(Ae[Je]); - H.length = 0; + Ae[Je] = kr(Ae[Je]); + K.length = 0; for (var mt = 0; mt < Ae.length; mt++) - H.push(mt / (Ae.length - 1)); + K.push(mt / (Ae.length - 1)); } - return cr(), te = Ae; + return hr(), te = Ae; }, bt = function(Ae) { if ($ != null) { for (var Je = $.length - 1, mt = 0; mt < Je && Ae >= $[mt]; ) @@ -89825,18 +89817,18 @@ var Fv = { exports: {} }; mt = Xe[$t]; else { if (Yn(te) === "array") - for (var At = 0; At < H.length; At++) { - var Vt = H[At]; + for (var At = 0; At < K.length; At++) { + var Vt = K[At]; if (dt <= Vt) { mt = te[At]; break; } - if (dt >= Vt && At === H.length - 1) { + if (dt >= Vt && At === K.length - 1) { mt = te[At]; break; } - if (dt > Vt && dt < H[At + 1]) { - dt = (dt - Vt) / (H[At + 1] - Vt), mt = Br.interpolate(te[At], te[At + 1], dt, A); + if (dt > Vt && dt < K[At + 1]) { + dt = (dt - Vt) / (K[At + 1] - Vt), mt = kr.interpolate(te[At], te[At + 1], dt, A); break; } } @@ -89845,12 +89837,12 @@ var Fv = { exports: {} }; Ge && (Xe[$t] = mt); } return mt; - }, cr = function() { + }, hr = function() { return Xe = {}; }; vt(y); var Rt = function(Ae) { - var Je = Br(Oi(Ae)); + var Je = kr(Oi(Ae)); return pe && Je[pe] ? Je[pe]() : Je; }; return Rt.classes = function(Ae) { @@ -89858,8 +89850,8 @@ var Fv = { exports: {} }; if (Yn(Ae) === "array") $ = Ae, X = [Ae[0], Ae[Ae.length - 1]]; else { - var Je = Br.analyze(X); - Ae === 0 ? $ = [Je.min, Je.max] : $ = Br.limits(Je, "e", Ae); + var Je = kr.analyze(X); + Ae === 0 ? $ = [Je.min, Je.max] : $ = kr.limits(Je, "e", Ae); } return Rt; } @@ -89867,16 +89859,16 @@ var Fv = { exports: {} }; }, Rt.domain = function(Ae) { if (!arguments.length) return X; - xe = Ae[0], Ue = Ae[Ae.length - 1], H = []; + xe = Ae[0], Ue = Ae[Ae.length - 1], K = []; var Je = te.length; if (Ae.length === Je && xe !== Ue) for (var mt = 0, dt = Array.from(Ae); mt < dt.length; mt += 1) { var Wi = dt[mt]; - H.push((Wi - xe) / (Ue - xe)); + K.push((Wi - xe) / (Ue - xe)); } else { for (var $t = 0; $t < Je; $t++) - H.push($t / (Je - 1)); + K.push($t / (Je - 1)); if (Ae.length > 2) { var At = Ae.map(function(Bt, zt) { return zt / (Ae.length - 1); @@ -89890,14 +89882,14 @@ var Fv = { exports: {} }; return Bt; for (var zt = 0; Bt >= Vt[zt + 1]; ) zt++; - var zr = (Bt - Vt[zt]) / (Vt[zt + 1] - Vt[zt]), Ks = At[zt] + zr * (At[zt + 1] - At[zt]); + var Wr = (Bt - Vt[zt]) / (Vt[zt + 1] - Vt[zt]), Ks = At[zt] + Wr * (At[zt + 1] - At[zt]); return Ks; }); } } return X = [xe, Ue], Rt; }, Rt.mode = function(Ae) { - return arguments.length ? (A = Ae, cr(), Rt) : A; + return arguments.length ? (A = Ae, hr(), Rt) : A; }, Rt.range = function(Ae, Je) { return vt(Ae), Rt; }, Rt.out = function(Ae) { @@ -89905,8 +89897,8 @@ var Fv = { exports: {} }; }, Rt.spread = function(Ae) { return arguments.length ? (V = Ae, Rt) : V; }, Rt.correctLightness = function(Ae) { - return Ae == null && (Ae = true), ye = Ae, cr(), ye ? Ft = function(Je) { - for (var mt = Oi(0, true).lab()[0], dt = Oi(1, true).lab()[0], Wi = mt > dt, $t = Oi(Je, true).lab()[0], At = mt + (dt - mt) * Je, Vt = $t - At, Bt = 0, zt = 1, zr = 20; Math.abs(Vt) > 0.01 && zr-- > 0; ) + return Ae == null && (Ae = true), ye = Ae, hr(), ye ? Ft = function(Je) { + for (var mt = Oi(0, true).lab()[0], dt = Oi(1, true).lab()[0], Wi = mt > dt, $t = Oi(Je, true).lab()[0], At = mt + (dt - mt) * Je, Vt = $t - At, Bt = 0, zt = 1, Wr = 20; Math.abs(Vt) > 0.01 && Wr-- > 0; ) (function() { return Wi && (Vt *= -1), Vt < 0 ? (Bt = Je, Je += (zt - Je) * 0.5) : (zt = Je, Je += (Bt - Je) * 0.5), $t = Oi(Je, true).lab()[0], Vt = $t - At; })(); @@ -89940,7 +89932,7 @@ var Fv = { exports: {} }; return Rt(zt); }); } - return Br[Je] && (mt = mt.map(function(zt) { + return kr[Je] && (mt = mt.map(function(zt) { return zt[Je](); })), mt; }, Rt.cache = function(Ae) { @@ -89948,11 +89940,11 @@ var Fv = { exports: {} }; }, Rt.gamma = function(Ae) { return Ae != null ? (ft = Ae, Rt) : ft; }, Rt.nodata = function(Ae) { - return Ae != null ? (D = Br(Ae), Rt) : D; + return Ae != null ? (D = kr(Ae), Rt) : D; }, Rt; }; function YC(y, A, D) { - for (var V = [], X = y < A, H = D ? X ? A + 1 : A - 1 : A, W = y; X ? W < H : W > H; X ? W++ : W--) + for (var V = [], X = y < A, K = D ? X ? A + 1 : A - 1 : A, W = y; X ? W < K : W > K; X ? W++ : W--) V.push(W); return V; } @@ -89964,24 +89956,24 @@ var Fv = { exports: {} }; } return A; }, QC = function(y) { - var A, D, V, X, H, W, $; + var A, D, V, X, K, W, $; if (y = y.map(function(ye) { return new ja(ye); }), y.length === 2) A = y.map(function(ye) { return ye.lab(); - }), H = A[0], W = A[1], X = function(ye) { + }), K = A[0], W = A[1], X = function(ye) { var Xe = [0, 1, 2].map(function(Ge) { - return H[Ge] + ye * (W[Ge] - H[Ge]); + return K[Ge] + ye * (W[Ge] - K[Ge]); }); return new ja(Xe, "lab"); }; else if (y.length === 3) D = y.map(function(ye) { return ye.lab(); - }), H = D[0], W = D[1], $ = D[2], X = function(ye) { + }), K = D[0], W = D[1], $ = D[2], X = function(ye) { var Xe = [0, 1, 2].map(function(Ge) { - return (1 - ye) * (1 - ye) * H[Ge] + 2 * (1 - ye) * ye * W[Ge] + ye * ye * $[Ge]; + return (1 - ye) * (1 - ye) * K[Ge] + 2 * (1 - ye) * ye * W[Ge] + ye * ye * $[Ge]; }); return new ja(Xe, "lab"); }; @@ -89989,9 +89981,9 @@ var Fv = { exports: {} }; var te; V = y.map(function(ye) { return ye.lab(); - }), H = V[0], W = V[1], $ = V[2], te = V[3], X = function(ye) { + }), K = V[0], W = V[1], $ = V[2], te = V[3], X = function(ye) { var Xe = [0, 1, 2].map(function(Ge) { - return (1 - ye) * (1 - ye) * (1 - ye) * H[Ge] + 3 * (1 - ye) * (1 - ye) * ye * W[Ge] + 3 * (1 - ye) * ye * ye * $[Ge] + ye * ye * ye * te[Ge]; + return (1 - ye) * (1 - ye) * (1 - ye) * K[Ge] + 3 * (1 - ye) * (1 - ye) * ye * W[Ge] + 3 * (1 - ye) * ye * ye * $[Ge] + ye * ye * ye * te[Ge]; }); return new ja(Xe, "lab"); }; @@ -90015,10 +90007,10 @@ var Fv = { exports: {} }; return A.scale = function() { return ZC(A); }, A; - }, Ph = M, kr = function(y, A, D) { - if (!kr[D]) + }, Ph = M, zr = function(y, A, D) { + if (!zr[D]) throw new Error("unknown blend mode " + D); - return kr[D](y, A); + return zr[D](y, A); }, Xs = function(y) { return function(A, D) { var V = Ph(D).rgb(), X = Ph(A).rgb(); @@ -90046,14 +90038,14 @@ var Fv = { exports: {} }; }, aR = function(y, A) { return y === 255 ? 255 : (y = 255 * (A / 255) / (1 - y / 255), y > 255 ? 255 : y); }; - kr.normal = Xs(Hs($C)), kr.multiply = Xs(Hs(eR)), kr.screen = Xs(Hs(rR)), kr.overlay = Xs(Hs(sR)), kr.darken = Xs(Hs(tR)), kr.lighten = Xs(Hs(iR)), kr.dodge = Xs(Hs(aR)), kr.burn = Xs(Hs(nR)); - for (var oR = kr, Oh = g.type, lR = g.clip_rgb, cR = g.TWOPI, hR = Math.pow, uR = Math.sin, fR = Math.cos, Tp = M, dR = function(y, A, D, V, X) { + zr.normal = Xs(Hs($C)), zr.multiply = Xs(Hs(eR)), zr.screen = Xs(Hs(rR)), zr.overlay = Xs(Hs(sR)), zr.darken = Xs(Hs(tR)), zr.lighten = Xs(Hs(iR)), zr.dodge = Xs(Hs(aR)), zr.burn = Xs(Hs(nR)); + for (var oR = zr, Oh = g.type, lR = g.clip_rgb, cR = g.TWOPI, hR = Math.pow, uR = Math.sin, fR = Math.cos, xp = M, dR = function(y, A, D, V, X) { y === void 0 && (y = 300), A === void 0 && (A = -1.5), D === void 0 && (D = 1), V === void 0 && (V = 1), X === void 0 && (X = [0, 1]); - var H = 0, W; + var K = 0, W; Oh(X) === "array" ? W = X[1] - X[0] : (W = 0, X = [X, X]); var $ = function(te) { - var pe = cR * ((y + 120) / 360 + A * te), xe = hR(X[0] + W * te, V), Ue = H !== 0 ? D[0] + te * H : D, ye = Ue * xe * (1 - xe) / 2, Xe = fR(pe), Ge = uR(pe), ft = xe + ye * (-0.14861 * Xe + 1.78277 * Ge), vt = xe + ye * (-0.29227 * Xe - 0.90649 * Ge), bt = xe + ye * (1.97294 * Xe); - return Tp(lR([ft * 255, vt * 255, bt * 255, 1])); + var pe = cR * ((y + 120) / 360 + A * te), xe = hR(X[0] + W * te, V), Ue = K !== 0 ? D[0] + te * K : D, ye = Ue * xe * (1 - xe) / 2, Xe = fR(pe), Ge = uR(pe), ft = xe + ye * (-0.14861 * Xe + 1.78277 * Ge), vt = xe + ye * (-0.29227 * Xe - 0.90649 * Ge), bt = xe + ye * (1.97294 * Xe); + return xp(lR([ft * 255, vt * 255, bt * 255, 1])); }; return $.start = function(te) { return te == null ? y : (y = te, $); @@ -90062,17 +90054,17 @@ var Fv = { exports: {} }; }, $.gamma = function(te) { return te == null ? V : (V = te, $); }, $.hue = function(te) { - return te == null ? D : (D = te, Oh(D) === "array" ? (H = D[1] - D[0], H === 0 && (D = D[1])) : H = 0, $); + return te == null ? D : (D = te, Oh(D) === "array" ? (K = D[1] - D[0], K === 0 && (D = D[1])) : K = 0, $); }, $.lightness = function(te) { return te == null ? X : (Oh(te) === "array" ? (X = te, W = te[1] - te[0]) : (X = [te, te], W = 0), $); }, $.scale = function() { - return Tp.scale($); + return xp.scale($); }, $.hue(D), $; }, pR = x, gR = "0123456789abcdef", mR = Math.floor, _R = Math.random, ER = function() { for (var y = "#", A = 0; A < 6; A++) y += gR.charAt(mR(_R() * 16)); return new pR(y, "hex"); - }, Dh = c, xp = Math.log, vR = Math.pow, TR = Math.floor, xR = Math.abs, Cp = function(y, A) { + }, Dh = c, Cp = Math.log, vR = Math.pow, TR = Math.floor, xR = Math.abs, Rp = function(y, A) { A === void 0 && (A = null); var D = { min: Number.MAX_VALUE, @@ -90084,11 +90076,11 @@ var Fv = { exports: {} }; return Dh(y) === "object" && (y = Object.values(y)), y.forEach(function(V) { A && Dh(V) === "object" && (V = V[A]), V != null && !isNaN(V) && (D.values.push(V), D.sum += V, V < D.min && (D.min = V), V > D.max && (D.max = V), D.count += 1); }), D.domain = [D.min, D.max], D.limits = function(V, X) { - return Rp(D, V, X); + return Sp(D, V, X); }, D; - }, Rp = function(y, A, D) { - A === void 0 && (A = "equal"), D === void 0 && (D = 7), Dh(y) == "array" && (y = Cp(y)); - var V = y.min, X = y.max, H = y.values.sort(function(Fh, Lh) { + }, Sp = function(y, A, D) { + A === void 0 && (A = "equal"), D === void 0 && (D = 7), Dh(y) == "array" && (y = Rp(y)); + var V = y.min, X = y.max, K = y.values.sort(function(Fh, Lh) { return Fh - Lh; }); if (D === 1) @@ -90102,7 +90094,7 @@ var Fv = { exports: {} }; } else if (A.substr(0, 1) === "l") { if (V <= 0) throw new Error("Logarithmic scales are only possible for values > 0"); - var te = Math.LOG10E * xp(V), pe = Math.LOG10E * xp(X); + var te = Math.LOG10E * Cp(V), pe = Math.LOG10E * Cp(X); W.push(V); for (var xe = 1; xe < D; xe++) W.push(vR(10, te + xe / D * (pe - te))); @@ -90110,81 +90102,81 @@ var Fv = { exports: {} }; } else if (A.substr(0, 1) === "q") { W.push(V); for (var Ue = 1; Ue < D; Ue++) { - var ye = (H.length - 1) * Ue / D, Xe = TR(ye); + var ye = (K.length - 1) * Ue / D, Xe = TR(ye); if (Xe === ye) - W.push(H[Xe]); + W.push(K[Xe]); else { var Ge = ye - Xe; - W.push(H[Xe] * (1 - Ge) + H[Xe + 1] * Ge); + W.push(K[Xe] * (1 - Ge) + K[Xe + 1] * Ge); } } W.push(X); } else if (A.substr(0, 1) === "k") { - var ft, vt = H.length, bt = new Array(vt), Ft = new Array(D), zi = true, Oi = 0, cr = null; - cr = [], cr.push(V); + var ft, vt = K.length, bt = new Array(vt), Ft = new Array(D), zi = true, Oi = 0, hr = null; + hr = [], hr.push(V); for (var Rt = 1; Rt < D; Rt++) - cr.push(V + Rt / D * (X - V)); - for (cr.push(X); zi; ) { + hr.push(V + Rt / D * (X - V)); + for (hr.push(X); zi; ) { for (var Ae = 0; Ae < D; Ae++) Ft[Ae] = 0; for (var Je = 0; Je < vt; Je++) - for (var mt = H[Je], dt = Number.MAX_VALUE, Wi = void 0, $t = 0; $t < D; $t++) { - var At = xR(cr[$t] - mt); + for (var mt = K[Je], dt = Number.MAX_VALUE, Wi = void 0, $t = 0; $t < D; $t++) { + var At = xR(hr[$t] - mt); At < dt && (dt = At, Wi = $t), Ft[Wi]++, bt[Je] = Wi; } for (var Vt = new Array(D), Bt = 0; Bt < D; Bt++) Vt[Bt] = null; for (var zt = 0; zt < vt; zt++) - ft = bt[zt], Vt[ft] === null ? Vt[ft] = H[zt] : Vt[ft] += H[zt]; - for (var zr = 0; zr < D; zr++) - Vt[zr] *= 1 / Ft[zr]; + ft = bt[zt], Vt[ft] === null ? Vt[ft] = K[zt] : Vt[ft] += K[zt]; + for (var Wr = 0; Wr < D; Wr++) + Vt[Wr] *= 1 / Ft[Wr]; zi = false; for (var Ks = 0; Ks < D; Ks++) - if (Vt[Ks] !== cr[Ks]) { + if (Vt[Ks] !== hr[Ks]) { zi = true; break; } - cr = Vt, Oi++, Oi > 200 && (zi = false); + hr = Vt, Oi++, Oi > 200 && (zi = false); } for (var qs = {}, Zn = 0; Zn < D; Zn++) qs[Zn] = []; for (var jn = 0; jn < vt; jn++) - ft = bt[jn], qs[ft].push(H[jn]); - for (var Rs = [], mn = 0; mn < D; mn++) - Rs.push(qs[mn][0]), Rs.push(qs[mn][qs[mn].length - 1]); + ft = bt[jn], qs[ft].push(K[jn]); + for (var Rs = [], _n = 0; _n < D; _n++) + Rs.push(qs[_n][0]), Rs.push(qs[_n][qs[_n].length - 1]); Rs = Rs.sort(function(Fh, Lh) { return Fh - Lh; }), W.push(Rs[0]); for (var Qa = 1; Qa < Rs.length; Qa += 2) { - var _n = Rs[Qa]; - !isNaN(_n) && W.indexOf(_n) === -1 && W.push(_n); + var En = Rs[Qa]; + !isNaN(En) && W.indexOf(En) === -1 && W.push(En); } } return W; - }, Sp = { analyze: Cp, limits: Rp }, yp = x, CR = function(y, A) { - y = new yp(y), A = new yp(A); + }, yp = { analyze: Rp, limits: Sp }, Ip = x, CR = function(y, A) { + y = new Ip(y), A = new Ip(A); var D = y.luminance(), V = A.luminance(); return D > V ? (D + 0.05) / (V + 0.05) : (V + 0.05) / (D + 0.05); - }, Ip = x, Cs = Math.sqrt, Ti = Math.pow, RR = Math.min, SR = Math.max, bp = Math.atan2, Ap = Math.abs, fl = Math.cos, Mp = Math.sin, yR = Math.exp, Pp = Math.PI, IR = function(y, A, D, V, X) { + }, bp = x, Cs = Math.sqrt, Ti = Math.pow, RR = Math.min, SR = Math.max, Ap = Math.atan2, Mp = Math.abs, fl = Math.cos, Pp = Math.sin, yR = Math.exp, Op = Math.PI, IR = function(y, A, D, V, X) { D === void 0 && (D = 1), V === void 0 && (V = 1), X === void 0 && (X = 1); - var H = function(_n) { - return 360 * _n / (2 * Pp); - }, W = function(_n) { - return 2 * Pp * _n / 360; + var K = function(En) { + return 360 * En / (2 * Op); + }, W = function(En) { + return 2 * Op * En / 360; }; - y = new Ip(y), A = new Ip(A); - var $ = Array.from(y.lab()), te = $[0], pe = $[1], xe = $[2], Ue = Array.from(A.lab()), ye = Ue[0], Xe = Ue[1], Ge = Ue[2], ft = (te + ye) / 2, vt = Cs(Ti(pe, 2) + Ti(xe, 2)), bt = Cs(Ti(Xe, 2) + Ti(Ge, 2)), Ft = (vt + bt) / 2, zi = 0.5 * (1 - Cs(Ti(Ft, 7) / (Ti(Ft, 7) + Ti(25, 7)))), Oi = pe * (1 + zi), cr = Xe * (1 + zi), Rt = Cs(Ti(Oi, 2) + Ti(xe, 2)), Ae = Cs(Ti(cr, 2) + Ti(Ge, 2)), Je = (Rt + Ae) / 2, mt = H(bp(xe, Oi)), dt = H(bp(Ge, cr)), Wi = mt >= 0 ? mt : mt + 360, $t = dt >= 0 ? dt : dt + 360, At = Ap(Wi - $t) > 180 ? (Wi + $t + 360) / 2 : (Wi + $t) / 2, Vt = 1 - 0.17 * fl(W(At - 30)) + 0.24 * fl(W(2 * At)) + 0.32 * fl(W(3 * At + 6)) - 0.2 * fl(W(4 * At - 63)), Bt = $t - Wi; - Bt = Ap(Bt) <= 180 ? Bt : $t <= Wi ? Bt + 360 : Bt - 360, Bt = 2 * Cs(Rt * Ae) * Mp(W(Bt) / 2); - var zt = ye - te, zr = Ae - Rt, Ks = 1 + 0.015 * Ti(ft - 50, 2) / Cs(20 + Ti(ft - 50, 2)), qs = 1 + 0.045 * Je, Zn = 1 + 0.015 * Je * Vt, jn = 30 * yR(-Ti((At - 275) / 25, 2)), Rs = 2 * Cs(Ti(Je, 7) / (Ti(Je, 7) + Ti(25, 7))), mn = -Rs * Mp(2 * W(jn)), Qa = Cs(Ti(zt / (D * Ks), 2) + Ti(zr / (V * qs), 2) + Ti(Bt / (X * Zn), 2) + mn * (zr / (V * qs)) * (Bt / (X * Zn))); + y = new bp(y), A = new bp(A); + var $ = Array.from(y.lab()), te = $[0], pe = $[1], xe = $[2], Ue = Array.from(A.lab()), ye = Ue[0], Xe = Ue[1], Ge = Ue[2], ft = (te + ye) / 2, vt = Cs(Ti(pe, 2) + Ti(xe, 2)), bt = Cs(Ti(Xe, 2) + Ti(Ge, 2)), Ft = (vt + bt) / 2, zi = 0.5 * (1 - Cs(Ti(Ft, 7) / (Ti(Ft, 7) + Ti(25, 7)))), Oi = pe * (1 + zi), hr = Xe * (1 + zi), Rt = Cs(Ti(Oi, 2) + Ti(xe, 2)), Ae = Cs(Ti(hr, 2) + Ti(Ge, 2)), Je = (Rt + Ae) / 2, mt = K(Ap(xe, Oi)), dt = K(Ap(Ge, hr)), Wi = mt >= 0 ? mt : mt + 360, $t = dt >= 0 ? dt : dt + 360, At = Mp(Wi - $t) > 180 ? (Wi + $t + 360) / 2 : (Wi + $t) / 2, Vt = 1 - 0.17 * fl(W(At - 30)) + 0.24 * fl(W(2 * At)) + 0.32 * fl(W(3 * At + 6)) - 0.2 * fl(W(4 * At - 63)), Bt = $t - Wi; + Bt = Mp(Bt) <= 180 ? Bt : $t <= Wi ? Bt + 360 : Bt - 360, Bt = 2 * Cs(Rt * Ae) * Pp(W(Bt) / 2); + var zt = ye - te, Wr = Ae - Rt, Ks = 1 + 0.015 * Ti(ft - 50, 2) / Cs(20 + Ti(ft - 50, 2)), qs = 1 + 0.045 * Je, Zn = 1 + 0.015 * Je * Vt, jn = 30 * yR(-Ti((At - 275) / 25, 2)), Rs = 2 * Cs(Ti(Je, 7) / (Ti(Je, 7) + Ti(25, 7))), _n = -Rs * Pp(2 * W(jn)), Qa = Cs(Ti(zt / (D * Ks), 2) + Ti(Wr / (V * qs), 2) + Ti(Bt / (X * Zn), 2) + _n * (Wr / (V * qs)) * (Bt / (X * Zn))); return SR(0, RR(100, Qa)); - }, Op = x, bR = function(y, A, D) { - D === void 0 && (D = "lab"), y = new Op(y), A = new Op(A); - var V = y.get(D), X = A.get(D), H = 0; + }, Dp = x, bR = function(y, A, D) { + D === void 0 && (D = "lab"), y = new Dp(y), A = new Dp(A); + var V = y.get(D), X = A.get(D), K = 0; for (var W in V) { var $ = (V[W] || 0) - (X[W] || 0); - H += $ * $; + K += $ * $; } - return Math.sqrt(H); + return Math.sqrt(K); }, AR = x, MR = function() { for (var y = [], A = arguments.length; A--; ) y[A] = arguments[A]; @@ -90193,12 +90185,12 @@ var Fv = { exports: {} }; } catch { return false; } - }, Dp = M, Np = Mh, PR = { + }, Np = M, Fp = Mh, PR = { cool: function() { - return Np([Dp.hsl(180, 1, 0.9), Dp.hsl(250, 0.7, 0.4)]); + return Fp([Np.hsl(180, 1, 0.9), Np.hsl(250, 0.7, 0.4)]); }, hot: function() { - return Np(["#000", "#f00", "#ff0", "#fff"]).mode("rgb"); + return Fp(["#000", "#f00", "#ff0", "#fff"]).mode("rgb"); } }, dl = { // sequential @@ -90240,19 +90232,19 @@ var Fv = { exports: {} }; Paired: ["#a6cee3", "#1f78b4", "#b2df8a", "#33a02c", "#fb9a99", "#e31a1c", "#fdbf6f", "#ff7f00", "#cab2d6", "#6a3d9a", "#ffff99", "#b15928"], Pastel2: ["#b3e2cd", "#fdcdac", "#cbd5e8", "#f4cae4", "#e6f5c9", "#fff2ae", "#f1e2cc", "#cccccc"], Pastel1: ["#fbb4ae", "#b3cde3", "#ccebc5", "#decbe4", "#fed9a6", "#ffffcc", "#e5d8bd", "#fddaec", "#f2f2f2"] - }, Nh = 0, Fp = Object.keys(dl); Nh < Fp.length; Nh += 1) { - var Lp = Fp[Nh]; - dl[Lp.toLowerCase()] = dl[Lp]; + }, Nh = 0, Lp = Object.keys(dl); Nh < Lp.length; Nh += 1) { + var wp = Lp[Nh]; + dl[wp.toLowerCase()] = dl[wp]; } var OR = dl, Pi = M; - Pi.average = HC, Pi.bezier = JC, Pi.blend = oR, Pi.cubehelix = dR, Pi.mix = Pi.interpolate = up, Pi.random = ER, Pi.scale = Mh, Pi.analyze = Sp.analyze, Pi.contrast = CR, Pi.deltaE = IR, Pi.distance = bR, Pi.limits = Sp.limits, Pi.valid = MR, Pi.scales = PR, Pi.colors = qd, Pi.brewer = OR; + Pi.average = HC, Pi.bezier = JC, Pi.blend = oR, Pi.cubehelix = dR, Pi.mix = Pi.interpolate = fp, Pi.random = ER, Pi.scale = Mh, Pi.analyze = yp.analyze, Pi.contrast = CR, Pi.deltaE = IR, Pi.distance = bR, Pi.limits = yp.limits, Pi.valid = MR, Pi.scales = PR, Pi.colors = Yd, Pi.brewer = OR; var DR = Pi; return DR; }); })(Fv); -var vk = Fv.exports; -var Xi = cv(vk); -var Tk = class { +var Tk = Fv.exports; +var Xi = cv(Tk); +var xk = class { constructor(e) { this.scheme = typeof e == "string" ? Lv[e] : e; } @@ -90272,7 +90264,7 @@ var Tk = class { return Xi.scale(this.scheme).colors(e).map((t) => ju(t)); } }; -var xk = class { +var Ck = class { constructor(e) { this.scheme = typeof e == "string" ? Lv[e] : e; } @@ -90292,12 +90284,12 @@ var xk = class { return e === void 0 ? (t) => ju(Xi.scale(this.scheme)(t).hex()) : (t) => ju(Xi.scale(this.scheme).classes(e)(t).hex()); } }; -function Mk(n4) { - return new Tk(n4); -} function Pk(n4) { return new xk(n4); } +function Ok(n4) { + return new Ck(n4); +} var Lv = { ...Xi.brewer, d310: [ @@ -90336,14 +90328,14 @@ var wv = class { this.currentLayout = 1; let e = this.options.rows || 1, t = this.options.margin || new Vector2(0, 0), i = this.options.selection.selected.length, r = this.boundingBoxLocal(this.options.selection), s = r.boundingBox.maximumWorld.x - r.boundingBox.minimumWorld.x, a = r.boundingBox.maximumWorld.y - r.boundingBox.minimumWorld.y, o = this.options.columns || i; return o = i % e == 0 ? i / e : Math.floor(i / e) + 1, this.options.selection.selected.forEach((l, c) => { - l.parent = this.root, this.animatePosition(l, new Vector3(c % o * (s + t.x), Math.floor(c / o) * (a + t.y), 0)), this.animateRotation(l, new Vector3(0, 0, 0)); + l.parent = this.root, this.animatePosition(l, new Vector3((c % o - (o - 1) / 2) * (s + t.x), Math.floor(c / o) * (a + t.y), 0)), this.animateRotation(l, new Vector3(0, 0, 0)); }), this; } cylinderLayout() { this.currentLayout = 2; let e = this.options.rows || 1, t = this.options.margin || new Vector2(0, 0), i = this.options.selection.selected.length, r = this.boundingBoxLocal(this.options.selection), s = this.options.radius || 5, a = r.boundingBox.maximumWorld.x - r.boundingBox.minimumWorld.x, o = r.boundingBox.maximumWorld.y - r.boundingBox.minimumWorld.y, l = this.options.columns || i; l = i % e == 0 ? i / e : Math.floor(i / e) + 1; - let c = Math.atan(a / 2 / s) * 2, h = new Vector3(0, 0, 1); + let c = Math.atan(a / 2 / s) * 2 / Math.PI * 180, h = new Vector3(0, 0, 1); return new Vector3(0, 1, 0), this.options.selection.selected.forEach((u, f) => { var T; u.parent = this.root, this.animateRotation(u, new Vector3(0, 0, 0)); @@ -90435,7 +90427,7 @@ var wv = class { }), new BoundingInfo(t, i); } }; -function Ok(n4, e, t) { +function Dk(n4, e, t) { const i = { selection: e.selection, rows: e.rows || 1, @@ -90445,7 +90437,7 @@ function Ok(n4, e, t) { }; return new wv(n4, i, t).planeLayout(); } -function Dk(n4, e, t) { +function Nk(n4, e, t) { const i = { selection: e.selection, rows: e.rows || 1, @@ -90456,67 +90448,76 @@ function Dk(n4, e, t) { }; return new wv(n4, i, t).cylinderLayout(); } -function Nk(n4, e) { - let t = n4[0], i = n4.slice(1), r = []; - return t === "." ? (r = e.getNodes().filter((s) => s.name == i), new Jt(r, e)) : t === "#" ? (r = e.getNodes().filter((s) => s.id == i), new Jt(r, e)) : t === "$" ? (r = e.getNodes().filter((s) => Tags.MatchesQuery(s, i) == true), new Jt(r, e)) : new Jt([], e); -} function Fk(n4, e) { - let t = []; - return Array.isArray(n4) ? n4.forEach((i, r) => t = [...t, ...e.getNodes().filter((s) => s.name == i)]) : t = e.getNodes().filter((i) => i.name == n4), new Jt(t, e); + let t = n4[0], i = n4.slice(1), r = []; + return t === "." ? (r = e.getNodes().filter((s) => s.name == i), new qt(r, e)) : t === "#" ? (r = e.getNodes().filter((s) => s.id == i), new qt(r, e)) : t === "$" ? (r = e.getNodes().filter((s) => Tags.MatchesQuery(s, i) == true), new qt(r, e)) : new qt([], e); } function Lk(n4, e) { let t = []; - return Array.isArray(n4) ? n4.forEach((i, r) => t = [...t, ...e.getNodes().filter((s) => s.name == i)]) : t = e.getNodes().filter((i) => i.id == n4), new Jt(t, e); + return Array.isArray(n4) ? n4.forEach((i, r) => t = [...t, ...e.getNodes().filter((s) => s.name == i)]) : t = e.getNodes().filter((i) => i.name == n4), new qt(t, e); } function wk(n4, e) { + let t = []; + return Array.isArray(n4) ? n4.forEach((i, r) => t = [...t, ...e.getNodes().filter((s) => s.name == i)]) : t = e.getNodes().filter((i) => i.id == n4), new qt(t, e); +} +function Uk(n4, e) { let t = []; return Array.isArray(n4) ? n4.forEach( (i, r) => t = [...t, ...e.getNodes().filter((s) => Tags.MatchesQuery(s, i) == true)] - ) : t = e.getNodes().filter((i) => Tags.MatchesQuery(i, n4) == true), new Jt(t, e); + ) : t = e.getNodes().filter((i) => Tags.MatchesQuery(i, n4) == true), new qt(t, e); } -function Uk(n4, e, t) { +function Vk(n4, e, t) { let i = []; return Array.isArray(n4) && Array.isArray(e) ? n4.forEach( (r, s) => i = [ ...i, ...t.getNodes().filter((a) => a.metadata != null).filter((a) => a.metadata.data[r] == e[s]) ] - ) : i = t.getNodes().filter((r) => r.metadata != null).filter((r) => r.metadata.data.key == e), new Jt(i, t); + ) : i = t.getNodes().filter((r) => r.metadata != null).filter((r) => r.metadata.data.key == e), new qt(i, t); } -function Vk(n4, e, t = [{}], i) { +function Bk(n4, e, t = [{}], i) { let r = []; return t.forEach((s, a) => { var o = zo(n4, n4, e, s, i); r.push(o); - }), new Jt(r, r[0].getScene()); + }), new qt(r, r[0].getScene()); +} +function kk(n4, e = [{}], t) { + t = t ?? n4.getScene(); + let i = []; + return e.forEach((r, s) => { + var a = n4.createInstance(n4.name + "_" + s); + n4 instanceof InstancedMesh && (n4.actionManager = new ActionManager(t)), Tags.EnableFor(a), a.metadata = { ...n4.metadata, data: r }, i.push(a); + }), new qt(i, t); } export { - L2 as Axis, + w2 as Axis, wv as Layout, - Ek as MeshMap, - Tk as OrdinalChromatic, - IS as PlaneText, - Jt as Selection, - xk as SequentialChromatic, - Y3 as TextureGlobe, - $V as TextureMap, - Vk as bind, + vk as MeshMap, + xk as OrdinalChromatic, + bS as PlaneText, + qt as Selection, + Ck as SequentialChromatic, + Z3 as TextureGlobe, + eB as TextureMap, + Bk as bind, + kk as bindInstance, zo as create, - Sk as createAxes, - Ak as createMeshMap, - bS as createPlaneText, - Ik as createTextureGlobe, - bk as createTextureMap, - Dk as cylinderLayout, - Mk as ordinalChromatic, - Ok as planeLayout, + yk as createAxes, + Mk as createMeshMap, + AS as createPlaneText, + bk as createTextureGlobe, + Ak as createTextureMap, + Nk as cylinderLayout, + Pk as ordinalChromatic, + Dk as planeLayout, Lv as schemes, - Nk as select, - Uk as selectData, - Lk as selectId, - Fk as selectName, - wk as selectTag, - Pk as sequentialChromatic + Fk as select, + Vk as selectData, + wk as selectId, + Lk as selectName, + Uk as selectTag, + Ok as sequentialChromatic }; /*! Bundled license information: diff --git a/docs/.vitepress/cache/deps/@jpmorganchase_anu.js.map b/docs/.vitepress/cache/deps/@jpmorganchase_anu.js.map index d57e3653..368e5620 100644 --- a/docs/.vitepress/cache/deps/@jpmorganchase_anu.js.map +++ b/docs/.vitepress/cache/deps/@jpmorganchase_anu.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../node_modules/@jpmorganchase/anu/dist/anu.js"], - "sourcesContent": ["import { Tags as pr, Texture as Vl, Mesh as Ji, VertexData as wp, Vector3 as Me, Effect as Up, ShaderMaterial as NR, Color3 as pi, VertexBuffer as FR, BoundingInfo as Pn, MeshBuilder as kt, TransformNode as On, CreateGreasedLine as C_, ActionManager as Jr, InstancedMesh as R_, AbstractMesh as LR, DynamicTexture as Ac, StandardMaterial as Vs, SixDofDragBehavior as wR, ExecuteCodeAction as Bs, PointerDragBehavior as Bl, Space as so, Axis as Vp, Vector2 as da, KeyboardEventTypes as UR, Color4 as fu, PBRMetallicRoughnessMaterial as VR, PBRSpecularGlossinessMaterial as BR, Animation as Ss, BezierCurveEase as wh } from \"@babylonjs/core\";\nfunction kR(n) {\n let e = n[0], t = n.slice(1), i = [];\n return e === \".\" ? (this.selected.forEach((r) => i = i.concat(r == null ? void 0 : r.getChildren((s) => s.name == t))), new Jt(i, this.scene)) : e === \"#\" ? (this.selected.forEach((r) => i = i.concat(r == null ? void 0 : r.getChildren((s) => s.id == t))), new Jt(i, this.scene)) : e === \"$\" ? (this.selected.forEach((r) => i = i.concat(r == null ? void 0 : r.getChildren((s) => pr.MatchesQuery(s, t) == !0))), new Jt(i, this.scene)) : new Jt([], this.scene);\n}\nfunction zR(n) {\n let e = [];\n return Array.isArray(n) ? n.forEach((t, i) => this.selected.forEach((r) => e = e.concat(r == null ? void 0 : r.getChildren((s) => s.name == t)))) : this.selected.forEach((t) => e = e.concat(t == null ? void 0 : t.getChildren((i) => i.name == n))), new Jt(e, this.scene);\n}\nfunction WR(n) {\n let e = [];\n return Array.isArray(n) ? n.forEach((t, i) => this.selected.forEach((r) => e = e.concat(r == null ? void 0 : r.getChildren((s) => s.id == t)))) : this.selected.forEach((t) => e = e.concat(t == null ? void 0 : t.getChildren((i) => i.id == n))), new Jt(e, this.scene);\n}\nfunction GR(n) {\n let e = [];\n return Array.isArray(n) ? n.forEach((t, i) => this.selected.forEach((r) => e = e.concat(r == null ? void 0 : r.getChildren((s) => pr.MatchesQuery(s, t) == !0)))) : this.selected.forEach((t) => e = e.concat(t == null ? void 0 : t.getChildren((i) => pr.MatchesQuery(i, n) == !0))), new Jt(e, this.scene);\n}\nconst XR = [\n \"roboto-regular.png\"\n], HR = [\n {\n id: 40,\n index: 12,\n char: \"(\",\n width: 25,\n height: 87,\n xoffset: 3,\n yoffset: -2,\n xadvance: 27,\n chnl: 15,\n x: 0,\n y: 0,\n page: 0\n },\n {\n id: 41,\n index: 13,\n char: \")\",\n width: 25,\n height: 87,\n xoffset: -1,\n yoffset: -2,\n xadvance: 28,\n chnl: 15,\n x: 0,\n y: 88,\n page: 0\n },\n {\n id: 91,\n index: 63,\n char: \"[\",\n width: 19,\n height: 81,\n xoffset: 4,\n yoffset: -3,\n xadvance: 21,\n chnl: 15,\n x: 0,\n y: 176,\n page: 0\n },\n {\n id: 93,\n index: 65,\n char: \"]\",\n width: 19,\n height: 81,\n xoffset: -2,\n yoffset: -3,\n xadvance: 21,\n chnl: 15,\n x: 0,\n y: 258,\n page: 0\n },\n {\n id: 123,\n index: 95,\n char: \"{\",\n width: 28,\n height: 81,\n xoffset: 1,\n yoffset: 0,\n xadvance: 27,\n chnl: 15,\n x: 0,\n y: 340,\n page: 0\n },\n {\n id: 125,\n index: 97,\n char: \"}\",\n width: 28,\n height: 81,\n xoffset: -1,\n yoffset: 0,\n xadvance: 27,\n chnl: 15,\n x: 0,\n y: 422,\n page: 0\n },\n {\n id: 106,\n index: 78,\n char: \"j\",\n width: 20,\n height: 79,\n xoffset: -5,\n yoffset: 4,\n xadvance: 19,\n chnl: 15,\n x: 20,\n y: 176,\n page: 0\n },\n {\n id: 36,\n index: 8,\n char: \"$\",\n width: 40,\n height: 78,\n xoffset: 2,\n yoffset: -4,\n xadvance: 45,\n chnl: 15,\n x: 20,\n y: 256,\n page: 0\n },\n {\n id: 64,\n index: 36,\n char: \"@\",\n width: 67,\n height: 78,\n xoffset: 3,\n yoffset: 6,\n xadvance: 72,\n chnl: 15,\n x: 26,\n y: 0,\n page: 0\n },\n {\n id: 81,\n index: 53,\n char: \"Q\",\n width: 50,\n height: 71,\n xoffset: 2,\n yoffset: 4,\n xadvance: 55,\n chnl: 15,\n x: 26,\n y: 79,\n page: 0\n },\n {\n id: 87,\n index: 59,\n char: \"W\",\n width: 71,\n height: 61,\n xoffset: 0,\n yoffset: 5,\n xadvance: 71,\n chnl: 15,\n x: 41,\n y: 151,\n page: 0\n },\n {\n id: 124,\n index: 96,\n char: \"|\",\n width: 10,\n height: 71,\n xoffset: 5,\n yoffset: 5,\n xadvance: 19,\n chnl: 15,\n x: 77,\n y: 79,\n page: 0\n },\n {\n id: 92,\n index: 64,\n char: \"\\\\\",\n width: 35,\n height: 66,\n xoffset: 0,\n yoffset: 5,\n xadvance: 33,\n chnl: 15,\n x: 88,\n y: 79,\n page: 0\n },\n {\n id: 47,\n index: 19,\n char: \"/\",\n width: 34,\n height: 66,\n xoffset: -1,\n yoffset: 5,\n xadvance: 33,\n chnl: 15,\n x: 94,\n y: 0,\n page: 0\n },\n {\n id: 162,\n index: 100,\n char: \"¢\",\n width: 40,\n height: 65,\n xoffset: 2,\n yoffset: 11,\n xadvance: 44,\n chnl: 15,\n x: 29,\n y: 335,\n page: 0\n },\n {\n id: 98,\n index: 70,\n char: \"b\",\n width: 40,\n height: 65,\n xoffset: 3,\n yoffset: 2,\n xadvance: 45,\n chnl: 15,\n x: 29,\n y: 401,\n page: 0\n },\n {\n id: 100,\n index: 72,\n char: \"d\",\n width: 40,\n height: 65,\n xoffset: 2,\n yoffset: 2,\n xadvance: 45,\n chnl: 15,\n x: 61,\n y: 213,\n page: 0\n },\n {\n id: 102,\n index: 74,\n char: \"f\",\n width: 30,\n height: 65,\n xoffset: 0,\n yoffset: 1,\n xadvance: 28,\n chnl: 15,\n x: 70,\n y: 279,\n page: 0\n },\n {\n id: 103,\n index: 75,\n char: \"g\",\n width: 40,\n height: 64,\n xoffset: 2,\n yoffset: 19,\n xadvance: 45,\n chnl: 15,\n x: 70,\n y: 345,\n page: 0\n },\n {\n id: 104,\n index: 76,\n char: \"h\",\n width: 37,\n height: 64,\n xoffset: 3,\n yoffset: 2,\n xadvance: 44,\n chnl: 15,\n x: 101,\n y: 279,\n page: 0\n },\n {\n id: 107,\n index: 79,\n char: \"k\",\n width: 39,\n height: 64,\n xoffset: 4,\n yoffset: 2,\n xadvance: 41,\n chnl: 15,\n x: 102,\n y: 213,\n page: 0\n },\n {\n id: 108,\n index: 80,\n char: \"l\",\n width: 11,\n height: 64,\n xoffset: 4,\n yoffset: 2,\n xadvance: 19,\n chnl: 15,\n x: 113,\n y: 146,\n page: 0\n },\n {\n id: 37,\n index: 9,\n char: \"%\",\n width: 55,\n height: 63,\n xoffset: 2,\n yoffset: 4,\n xadvance: 59,\n chnl: 15,\n x: 124,\n y: 67,\n page: 0\n },\n {\n id: 109,\n index: 81,\n char: \"m\",\n width: 63,\n height: 47,\n xoffset: 3,\n yoffset: 19,\n xadvance: 70,\n chnl: 15,\n x: 129,\n y: 0,\n page: 0\n },\n {\n id: 112,\n index: 84,\n char: \"p\",\n width: 40,\n height: 63,\n xoffset: 3,\n yoffset: 19,\n xadvance: 45,\n chnl: 15,\n x: 125,\n y: 131,\n page: 0\n },\n {\n id: 113,\n index: 85,\n char: \"q\",\n width: 40,\n height: 63,\n xoffset: 2,\n yoffset: 19,\n xadvance: 45,\n chnl: 15,\n x: 70,\n y: 410,\n page: 0\n },\n {\n id: 121,\n index: 93,\n char: \"y\",\n width: 40,\n height: 63,\n xoffset: -1,\n yoffset: 20,\n xadvance: 38,\n chnl: 15,\n x: 111,\n y: 344,\n page: 0\n },\n {\n id: 163,\n index: 101,\n char: \"£\",\n width: 45,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 46,\n chnl: 15,\n x: 139,\n y: 278,\n page: 0\n },\n {\n id: 38,\n index: 10,\n char: \"&\",\n width: 50,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 50,\n chnl: 15,\n x: 142,\n y: 195,\n page: 0\n },\n {\n id: 48,\n index: 20,\n char: \"0\",\n width: 40,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 45,\n chnl: 15,\n x: 166,\n y: 131,\n page: 0\n },\n {\n id: 50,\n index: 22,\n char: \"2\",\n width: 42,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 45,\n chnl: 15,\n x: 180,\n y: 48,\n page: 0\n },\n {\n id: 51,\n index: 23,\n char: \"3\",\n width: 40,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 45,\n chnl: 15,\n x: 111,\n y: 408,\n page: 0\n },\n {\n id: 53,\n index: 25,\n char: \"5\",\n width: 40,\n height: 62,\n xoffset: 4,\n yoffset: 5,\n xadvance: 45,\n chnl: 15,\n x: 152,\n y: 341,\n page: 0\n },\n {\n id: 54,\n index: 26,\n char: \"6\",\n width: 40,\n height: 62,\n xoffset: 3,\n yoffset: 5,\n xadvance: 45,\n chnl: 15,\n x: 185,\n y: 258,\n page: 0\n },\n {\n id: 56,\n index: 28,\n char: \"8\",\n width: 40,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 45,\n chnl: 15,\n x: 193,\n y: 194,\n page: 0\n },\n {\n id: 57,\n index: 29,\n char: \"9\",\n width: 40,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 45,\n chnl: 15,\n x: 207,\n y: 111,\n page: 0\n },\n {\n id: 63,\n index: 35,\n char: \"?\",\n width: 36,\n height: 62,\n xoffset: 1,\n yoffset: 4,\n xadvance: 38,\n chnl: 15,\n x: 152,\n y: 404,\n page: 0\n },\n {\n id: 67,\n index: 39,\n char: \"C\",\n width: 48,\n height: 62,\n xoffset: 3,\n yoffset: 4,\n xadvance: 52,\n chnl: 15,\n x: 189,\n y: 404,\n page: 0\n },\n {\n id: 71,\n index: 43,\n char: \"G\",\n width: 48,\n height: 62,\n xoffset: 3,\n yoffset: 4,\n xadvance: 54,\n chnl: 15,\n x: 193,\n y: 321,\n page: 0\n },\n {\n id: 74,\n index: 46,\n char: \"J\",\n width: 40,\n height: 62,\n xoffset: 0,\n yoffset: 5,\n xadvance: 44,\n chnl: 15,\n x: 226,\n y: 257,\n page: 0\n },\n {\n id: 79,\n index: 51,\n char: \"O\",\n width: 50,\n height: 62,\n xoffset: 3,\n yoffset: 4,\n xadvance: 55,\n chnl: 15,\n x: 234,\n y: 174,\n page: 0\n },\n {\n id: 83,\n index: 55,\n char: \"S\",\n width: 45,\n height: 62,\n xoffset: 1,\n yoffset: 4,\n xadvance: 47,\n chnl: 15,\n x: 223,\n y: 0,\n page: 0\n },\n {\n id: 85,\n index: 57,\n char: \"U\",\n width: 45,\n height: 62,\n xoffset: 3,\n yoffset: 5,\n xadvance: 52,\n chnl: 15,\n x: 248,\n y: 63,\n page: 0\n },\n {\n id: 105,\n index: 77,\n char: \"i\",\n width: 13,\n height: 62,\n xoffset: 4,\n yoffset: 4,\n xadvance: 19,\n chnl: 15,\n x: 269,\n y: 0,\n page: 0\n },\n {\n id: 165,\n index: 103,\n char: \"Â¥\",\n width: 45,\n height: 61,\n xoffset: -1,\n yoffset: 5,\n xadvance: 42,\n chnl: 15,\n x: 283,\n y: 0,\n page: 0\n },\n {\n id: 161,\n index: 99,\n char: \"¡\",\n width: 13,\n height: 61,\n xoffset: 3,\n yoffset: 19,\n xadvance: 19,\n chnl: 15,\n x: 238,\n y: 384,\n page: 0\n },\n {\n id: 33,\n index: 5,\n char: \"!\",\n width: 13,\n height: 61,\n xoffset: 4,\n yoffset: 5,\n xadvance: 21,\n chnl: 15,\n x: 242,\n y: 320,\n page: 0\n },\n {\n id: 35,\n index: 7,\n char: \"#\",\n width: 48,\n height: 61,\n xoffset: 3,\n yoffset: 5,\n xadvance: 49,\n chnl: 15,\n x: 238,\n y: 446,\n page: 0\n },\n {\n id: 49,\n index: 21,\n char: \"1\",\n width: 26,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 45,\n chnl: 15,\n x: 252,\n y: 382,\n page: 0\n },\n {\n id: 52,\n index: 24,\n char: \"4\",\n width: 45,\n height: 61,\n xoffset: 0,\n yoffset: 5,\n xadvance: 45,\n chnl: 15,\n x: 256,\n y: 320,\n page: 0\n },\n {\n id: 55,\n index: 27,\n char: \"7\",\n width: 42,\n height: 61,\n xoffset: 1,\n yoffset: 5,\n xadvance: 45,\n chnl: 15,\n x: 279,\n y: 382,\n page: 0\n },\n {\n id: 65,\n index: 37,\n char: \"A\",\n width: 54,\n height: 61,\n xoffset: -1,\n yoffset: 5,\n xadvance: 52,\n chnl: 15,\n x: 287,\n y: 444,\n page: 0\n },\n {\n id: 66,\n index: 38,\n char: \"B\",\n width: 43,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 50,\n chnl: 15,\n x: 267,\n y: 237,\n page: 0\n },\n {\n id: 68,\n index: 40,\n char: \"D\",\n width: 45,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 52,\n chnl: 15,\n x: 302,\n y: 299,\n page: 0\n },\n {\n id: 69,\n index: 41,\n char: \"E\",\n width: 40,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 45,\n chnl: 15,\n x: 322,\n y: 361,\n page: 0\n },\n {\n id: 70,\n index: 42,\n char: \"F\",\n width: 39,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 44,\n chnl: 15,\n x: 342,\n y: 423,\n page: 0\n },\n {\n id: 72,\n index: 44,\n char: \"H\",\n width: 48,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 57,\n chnl: 15,\n x: 285,\n y: 126,\n page: 0\n },\n {\n id: 73,\n index: 45,\n char: \"I\",\n width: 12,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 22,\n chnl: 15,\n x: 294,\n y: 62,\n page: 0\n },\n {\n id: 75,\n index: 47,\n char: \"K\",\n width: 48,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 50,\n chnl: 15,\n x: 307,\n y: 62,\n page: 0\n },\n {\n id: 76,\n index: 48,\n char: \"L\",\n width: 38,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 43,\n chnl: 15,\n x: 329,\n y: 0,\n page: 0\n },\n {\n id: 77,\n index: 49,\n char: \"M\",\n width: 61,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 70,\n chnl: 15,\n x: 311,\n y: 188,\n page: 0\n },\n {\n id: 78,\n index: 50,\n char: \"N\",\n width: 48,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 57,\n chnl: 15,\n x: 334,\n y: 124,\n page: 0\n },\n {\n id: 80,\n index: 52,\n char: \"P\",\n width: 45,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 50,\n chnl: 15,\n x: 356,\n y: 62,\n page: 0\n },\n {\n id: 82,\n index: 54,\n char: \"R\",\n width: 45,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 49,\n chnl: 15,\n x: 368,\n y: 0,\n page: 0\n },\n {\n id: 84,\n index: 56,\n char: \"T\",\n width: 48,\n height: 61,\n xoffset: 0,\n yoffset: 5,\n xadvance: 48,\n chnl: 15,\n x: 348,\n y: 250,\n page: 0\n },\n {\n id: 86,\n index: 58,\n char: \"V\",\n width: 53,\n height: 61,\n xoffset: -1,\n yoffset: 5,\n xadvance: 51,\n chnl: 15,\n x: 373,\n y: 186,\n page: 0\n },\n {\n id: 88,\n index: 60,\n char: \"X\",\n width: 50,\n height: 61,\n xoffset: 0,\n yoffset: 5,\n xadvance: 50,\n chnl: 15,\n x: 383,\n y: 124,\n page: 0\n },\n {\n id: 89,\n index: 61,\n char: \"Y\",\n width: 51,\n height: 61,\n xoffset: -1,\n yoffset: 5,\n xadvance: 48,\n chnl: 15,\n x: 402,\n y: 62,\n page: 0\n },\n {\n id: 90,\n index: 62,\n char: \"Z\",\n width: 45,\n height: 61,\n xoffset: 1,\n yoffset: 5,\n xadvance: 48,\n chnl: 15,\n x: 414,\n y: 0,\n page: 0\n },\n {\n id: 119,\n index: 91,\n char: \"w\",\n width: 61,\n height: 46,\n xoffset: 0,\n yoffset: 20,\n xadvance: 60,\n chnl: 15,\n x: 348,\n y: 312,\n page: 0\n },\n {\n id: 59,\n index: 31,\n char: \";\",\n width: 16,\n height: 58,\n xoffset: 0,\n yoffset: 19,\n xadvance: 17,\n chnl: 15,\n x: 363,\n y: 359,\n page: 0\n },\n {\n id: 116,\n index: 88,\n char: \"t\",\n width: 27,\n height: 57,\n xoffset: -2,\n yoffset: 10,\n xadvance: 26,\n chnl: 15,\n x: 397,\n y: 248,\n page: 0\n },\n {\n id: 164,\n index: 102,\n char: \"¤\",\n width: 53,\n height: 54,\n xoffset: 2,\n yoffset: 13,\n xadvance: 57,\n chnl: 15,\n x: 454,\n y: 62,\n page: 0\n },\n {\n id: 97,\n index: 69,\n char: \"a\",\n width: 39,\n height: 48,\n xoffset: 2,\n yoffset: 19,\n xadvance: 44,\n chnl: 15,\n x: 460,\n y: 0,\n page: 0\n },\n {\n id: 99,\n index: 71,\n char: \"c\",\n width: 40,\n height: 48,\n xoffset: 2,\n yoffset: 19,\n xadvance: 42,\n chnl: 15,\n x: 380,\n y: 359,\n page: 0\n },\n {\n id: 101,\n index: 73,\n char: \"e\",\n width: 40,\n height: 48,\n xoffset: 2,\n yoffset: 19,\n xadvance: 42,\n chnl: 15,\n x: 410,\n y: 306,\n page: 0\n },\n {\n id: 111,\n index: 83,\n char: \"o\",\n width: 42,\n height: 48,\n xoffset: 2,\n yoffset: 19,\n xadvance: 46,\n chnl: 15,\n x: 425,\n y: 248,\n page: 0\n },\n {\n id: 115,\n index: 87,\n char: \"s\",\n width: 38,\n height: 48,\n xoffset: 2,\n yoffset: 19,\n xadvance: 41,\n chnl: 15,\n x: 468,\n y: 117,\n page: 0\n },\n {\n id: 126,\n index: 98,\n char: \"~\",\n width: 48,\n height: 20,\n xoffset: 3,\n yoffset: 31,\n xadvance: 54,\n chnl: 15,\n x: 342,\n y: 485,\n page: 0\n },\n {\n id: 58,\n index: 30,\n char: \":\",\n width: 13,\n height: 47,\n xoffset: 3,\n yoffset: 19,\n xadvance: 19,\n chnl: 15,\n x: 193,\n y: 0,\n page: 0\n },\n {\n id: 110,\n index: 82,\n char: \"n\",\n width: 37,\n height: 47,\n xoffset: 3,\n yoffset: 19,\n xadvance: 44,\n chnl: 15,\n x: 468,\n y: 166,\n page: 0\n },\n {\n id: 114,\n index: 86,\n char: \"r\",\n width: 24,\n height: 47,\n xoffset: 3,\n yoffset: 19,\n xadvance: 27,\n chnl: 15,\n x: 223,\n y: 63,\n page: 0\n },\n {\n id: 117,\n index: 89,\n char: \"u\",\n width: 37,\n height: 47,\n xoffset: 3,\n yoffset: 20,\n xadvance: 44,\n chnl: 15,\n x: 427,\n y: 186,\n page: 0\n },\n {\n id: 118,\n index: 90,\n char: \"v\",\n width: 40,\n height: 46,\n xoffset: -1,\n yoffset: 20,\n xadvance: 39,\n chnl: 15,\n x: 468,\n y: 214,\n page: 0\n },\n {\n id: 120,\n index: 92,\n char: \"x\",\n width: 40,\n height: 46,\n xoffset: 0,\n yoffset: 20,\n xadvance: 40,\n chnl: 15,\n x: 468,\n y: 261,\n page: 0\n },\n {\n id: 122,\n index: 94,\n char: \"z\",\n width: 38,\n height: 46,\n xoffset: 1,\n yoffset: 20,\n xadvance: 40,\n chnl: 15,\n x: 451,\n y: 308,\n page: 0\n },\n {\n id: 43,\n index: 15,\n char: \"+\",\n width: 43,\n height: 45,\n xoffset: 1,\n yoffset: 15,\n xadvance: 45,\n chnl: 15,\n x: 152,\n y: 467,\n page: 0\n },\n {\n id: 95,\n index: 67,\n char: \"_\",\n width: 40,\n height: 10,\n xoffset: -2,\n yoffset: 62,\n xadvance: 36,\n chnl: 15,\n x: 29,\n y: 467,\n page: 0\n },\n {\n id: 60,\n index: 32,\n char: \"<\",\n width: 36,\n height: 39,\n xoffset: 1,\n yoffset: 19,\n xadvance: 41,\n chnl: 15,\n x: 248,\n y: 126,\n page: 0\n },\n {\n id: 62,\n index: 34,\n char: \">\",\n width: 37,\n height: 39,\n xoffset: 3,\n yoffset: 19,\n xadvance: 42,\n chnl: 15,\n x: 111,\n y: 471,\n page: 0\n },\n {\n id: 42,\n index: 14,\n char: \"*\",\n width: 36,\n height: 37,\n xoffset: -1,\n yoffset: 5,\n xadvance: 34,\n chnl: 15,\n x: 311,\n y: 250,\n page: 0\n },\n {\n id: 61,\n index: 33,\n char: \"=\",\n width: 37,\n height: 27,\n xoffset: 4,\n yoffset: 24,\n xadvance: 44,\n chnl: 15,\n x: 70,\n y: 474,\n page: 0\n },\n {\n id: 171,\n index: 109,\n char: \"«\",\n width: 34,\n height: 35,\n xoffset: 2,\n yoffset: 25,\n xadvance: 38,\n chnl: 15,\n x: 196,\n y: 467,\n page: 0\n },\n {\n id: 94,\n index: 66,\n char: \"^\",\n width: 32,\n height: 32,\n xoffset: 1,\n yoffset: 5,\n xadvance: 33,\n chnl: 15,\n x: 434,\n y: 124,\n page: 0\n },\n {\n id: 44,\n index: 16,\n char: \",\",\n width: 15,\n height: 24,\n xoffset: -1,\n yoffset: 53,\n xadvance: 16,\n chnl: 15,\n x: 207,\n y: 0,\n page: 0\n },\n {\n id: 34,\n index: 6,\n char: '\"',\n width: 20,\n height: 23,\n xoffset: 3,\n yoffset: 2,\n xadvance: 26,\n chnl: 15,\n x: 490,\n y: 308,\n page: 0\n },\n {\n id: 39,\n index: 11,\n char: \"'\",\n width: 10,\n height: 23,\n xoffset: 2,\n yoffset: 2,\n xadvance: 14,\n chnl: 15,\n x: 26,\n y: 151,\n page: 0\n },\n {\n id: 45,\n index: 17,\n char: \"-\",\n width: 23,\n height: 10,\n xoffset: -1,\n yoffset: 35,\n xadvance: 22,\n chnl: 15,\n x: 311,\n y: 288,\n page: 0\n },\n {\n id: 96,\n index: 68,\n char: \"`\",\n width: 20,\n height: 15,\n xoffset: 0,\n yoffset: 2,\n xadvance: 25,\n chnl: 15,\n x: 490,\n y: 332,\n page: 0\n },\n {\n id: 46,\n index: 18,\n char: \".\",\n width: 13,\n height: 13,\n xoffset: 4,\n yoffset: 54,\n xadvance: 21,\n chnl: 15,\n x: 427,\n y: 234,\n page: 0\n },\n {\n id: 32,\n index: 4,\n char: \" \",\n width: 0,\n height: 0,\n xoffset: -2,\n yoffset: 62,\n xadvance: 20,\n chnl: 15,\n x: 124,\n y: 131,\n page: 0\n }\n], KR = {\n face: \"Roboto-Regular\",\n size: 80,\n bold: 0,\n italic: 0,\n charset: [\n \"«\",\n \"¢\",\n \"£\",\n \"¤\",\n \"Â¥\",\n \"¡\",\n \"!\",\n \"\\\\\",\n '\"',\n \"#\",\n \"$\",\n \"%\",\n \"&\",\n \"'\",\n \"(\",\n \")\",\n \"*\",\n \"+\",\n \",\",\n \"-\",\n \".\",\n \"/\",\n \"0\",\n \"1\",\n \"2\",\n \"3\",\n \"4\",\n \"5\",\n \"6\",\n \"7\",\n \"8\",\n \"9\",\n \":\",\n \";\",\n \"<\",\n \"=\",\n \">\",\n \"?\",\n \"@\",\n \"A\",\n \"B\",\n \"C\",\n \"D\",\n \"E\",\n \"F\",\n \"G\",\n \"H\",\n \"I\",\n \"J\",\n \"K\",\n \"L\",\n \"M\",\n \"N\",\n \"O\",\n \"P\",\n \"Q\",\n \"R\",\n \"S\",\n \"T\",\n \"U\",\n \"V\",\n \"W\",\n \"X\",\n \"Y\",\n \"Z\",\n \"[\",\n \"]\",\n \"^\",\n \"_\",\n \"`\",\n \"a\",\n \"b\",\n \"c\",\n \"d\",\n \"e\",\n \"f\",\n \"g\",\n \"h\",\n \"i\",\n \"j\",\n \"k\",\n \"l\",\n \"m\",\n \"n\",\n \"o\",\n \"p\",\n \"q\",\n \"r\",\n \"s\",\n \"t\",\n \"u\",\n \"v\",\n \"w\",\n \"x\",\n \"y\",\n \"z\",\n \"{\",\n \"|\",\n \"}\",\n \"~\",\n \" \"\n ],\n unicode: 1,\n stretchH: 100,\n smooth: 1,\n aa: 1,\n padding: [\n 2,\n 2,\n 2,\n 2\n ],\n spacing: [\n 0,\n 0\n ]\n}, qR = {\n lineHeight: 84,\n base: 62,\n scaleW: 512,\n scaleH: 512,\n pages: 1,\n packed: 0,\n alphaChnl: 0,\n redChnl: 0,\n greenChnl: 0,\n blueChnl: 0\n}, YR = {\n fieldType: \"msdf\",\n distanceRange: 4\n}, ZR = [\n {\n first: 34,\n second: 34,\n amount: -4\n },\n {\n first: 34,\n second: 39,\n amount: -4\n },\n {\n first: 34,\n second: 65,\n amount: -5\n },\n {\n first: 34,\n second: 97,\n amount: -2\n },\n {\n first: 34,\n second: 99,\n amount: -2\n },\n {\n first: 34,\n second: 100,\n amount: -2\n },\n {\n first: 34,\n second: 101,\n amount: -2\n },\n {\n first: 34,\n second: 103,\n amount: -2\n },\n {\n first: 34,\n second: 109,\n amount: -1\n },\n {\n first: 34,\n second: 110,\n amount: -1\n },\n {\n first: 34,\n second: 111,\n amount: -2\n },\n {\n first: 34,\n second: 112,\n amount: -1\n },\n {\n first: 34,\n second: 113,\n amount: -2\n },\n {\n first: 34,\n second: 115,\n amount: -3\n },\n {\n first: 34,\n second: 119,\n amount: 0\n },\n {\n first: 39,\n second: 34,\n amount: -4\n },\n {\n first: 39,\n second: 39,\n amount: -4\n },\n {\n first: 39,\n second: 65,\n amount: -5\n },\n {\n first: 39,\n second: 97,\n amount: -2\n },\n {\n first: 39,\n second: 99,\n amount: -2\n },\n {\n first: 39,\n second: 100,\n amount: -2\n },\n {\n first: 39,\n second: 101,\n amount: -2\n },\n {\n first: 39,\n second: 103,\n amount: -2\n },\n {\n first: 39,\n second: 109,\n amount: -1\n },\n {\n first: 39,\n second: 110,\n amount: -1\n },\n {\n first: 39,\n second: 111,\n amount: -2\n },\n {\n first: 39,\n second: 112,\n amount: -1\n },\n {\n first: 39,\n second: 113,\n amount: -2\n },\n {\n first: 39,\n second: 115,\n amount: -3\n },\n {\n first: 39,\n second: 119,\n amount: 0\n },\n {\n first: 40,\n second: 86,\n amount: 1\n },\n {\n first: 40,\n second: 87,\n amount: 1\n },\n {\n first: 40,\n second: 89,\n amount: 1\n },\n {\n first: 44,\n second: 34,\n amount: -7\n },\n {\n first: 44,\n second: 39,\n amount: -7\n },\n {\n first: 46,\n second: 34,\n amount: -7\n },\n {\n first: 46,\n second: 39,\n amount: -7\n },\n {\n first: 47,\n second: 47,\n amount: -9\n },\n {\n first: 65,\n second: 34,\n amount: -5\n },\n {\n first: 65,\n second: 39,\n amount: -5\n },\n {\n first: 65,\n second: 63,\n amount: -2\n },\n {\n first: 65,\n second: 67,\n amount: 0\n },\n {\n first: 65,\n second: 71,\n amount: 0\n },\n {\n first: 65,\n second: 79,\n amount: 0\n },\n {\n first: 65,\n second: 81,\n amount: 0\n },\n {\n first: 65,\n second: 84,\n amount: -5\n },\n {\n first: 65,\n second: 85,\n amount: -1\n },\n {\n first: 65,\n second: 86,\n amount: -3\n },\n {\n first: 65,\n second: 87,\n amount: -3\n },\n {\n first: 65,\n second: 89,\n amount: -4\n },\n {\n first: 65,\n second: 111,\n amount: 0\n },\n {\n first: 65,\n second: 116,\n amount: -1\n },\n {\n first: 65,\n second: 117,\n amount: 0\n },\n {\n first: 65,\n second: 118,\n amount: -2\n },\n {\n first: 65,\n second: 119,\n amount: -1\n },\n {\n first: 65,\n second: 121,\n amount: -2\n },\n {\n first: 65,\n second: 122,\n amount: 0\n },\n {\n first: 66,\n second: 84,\n amount: -1\n },\n {\n first: 66,\n second: 86,\n amount: -1\n },\n {\n first: 66,\n second: 89,\n amount: -2\n },\n {\n first: 67,\n second: 41,\n amount: -1\n },\n {\n first: 67,\n second: 84,\n amount: -1\n },\n {\n first: 67,\n second: 93,\n amount: 0\n },\n {\n first: 67,\n second: 125,\n amount: -1\n },\n {\n first: 68,\n second: 44,\n amount: -4\n },\n {\n first: 68,\n second: 46,\n amount: -4\n },\n {\n first: 68,\n second: 65,\n amount: -1\n },\n {\n first: 68,\n second: 84,\n amount: -1\n },\n {\n first: 68,\n second: 86,\n amount: -1\n },\n {\n first: 68,\n second: 88,\n amount: -1\n },\n {\n first: 68,\n second: 89,\n amount: -2\n },\n {\n first: 68,\n second: 90,\n amount: -1\n },\n {\n first: 69,\n second: 84,\n amount: 1\n },\n {\n first: 69,\n second: 99,\n amount: -1\n },\n {\n first: 69,\n second: 100,\n amount: -1\n },\n {\n first: 69,\n second: 101,\n amount: -1\n },\n {\n first: 69,\n second: 102,\n amount: -1\n },\n {\n first: 69,\n second: 103,\n amount: -1\n },\n {\n first: 69,\n second: 111,\n amount: -1\n },\n {\n first: 69,\n second: 113,\n amount: -1\n },\n {\n first: 69,\n second: 117,\n amount: -1\n },\n {\n first: 69,\n second: 118,\n amount: -1\n },\n {\n first: 69,\n second: 119,\n amount: -1\n },\n {\n first: 69,\n second: 121,\n amount: -1\n },\n {\n first: 70,\n second: 44,\n amount: -9\n },\n {\n first: 70,\n second: 46,\n amount: -9\n },\n {\n first: 70,\n second: 65,\n amount: -7\n },\n {\n first: 70,\n second: 74,\n amount: -10\n },\n {\n first: 70,\n second: 84,\n amount: 1\n },\n {\n first: 70,\n second: 97,\n amount: -1\n },\n {\n first: 70,\n second: 99,\n amount: -1\n },\n {\n first: 70,\n second: 100,\n amount: -1\n },\n {\n first: 70,\n second: 101,\n amount: -1\n },\n {\n first: 70,\n second: 103,\n amount: -1\n },\n {\n first: 70,\n second: 111,\n amount: -1\n },\n {\n first: 70,\n second: 113,\n amount: -1\n },\n {\n first: 70,\n second: 114,\n amount: -1\n },\n {\n first: 70,\n second: 117,\n amount: -1\n },\n {\n first: 70,\n second: 118,\n amount: -1\n },\n {\n first: 70,\n second: 121,\n amount: -1\n },\n {\n first: 72,\n second: 65,\n amount: 1\n },\n {\n first: 72,\n second: 84,\n amount: -1\n },\n {\n first: 72,\n second: 88,\n amount: 1\n },\n {\n first: 72,\n second: 89,\n amount: -1\n },\n {\n first: 73,\n second: 65,\n amount: 1\n },\n {\n first: 73,\n second: 84,\n amount: -1\n },\n {\n first: 73,\n second: 88,\n amount: 1\n },\n {\n first: 73,\n second: 89,\n amount: -1\n },\n {\n first: 74,\n second: 65,\n amount: -1\n },\n {\n first: 75,\n second: 45,\n amount: -2\n },\n {\n first: 75,\n second: 67,\n amount: -1\n },\n {\n first: 75,\n second: 71,\n amount: -1\n },\n {\n first: 75,\n second: 79,\n amount: -1\n },\n {\n first: 75,\n second: 81,\n amount: -1\n },\n {\n first: 75,\n second: 99,\n amount: -1\n },\n {\n first: 75,\n second: 100,\n amount: -1\n },\n {\n first: 75,\n second: 101,\n amount: -1\n },\n {\n first: 75,\n second: 103,\n amount: -1\n },\n {\n first: 75,\n second: 109,\n amount: -1\n },\n {\n first: 75,\n second: 110,\n amount: -1\n },\n {\n first: 75,\n second: 111,\n amount: -1\n },\n {\n first: 75,\n second: 112,\n amount: -1\n },\n {\n first: 75,\n second: 113,\n amount: -1\n },\n {\n first: 75,\n second: 117,\n amount: -1\n },\n {\n first: 75,\n second: 118,\n amount: -2\n },\n {\n first: 75,\n second: 119,\n amount: -2\n },\n {\n first: 75,\n second: 121,\n amount: -2\n },\n {\n first: 76,\n second: 34,\n amount: -13\n },\n {\n first: 76,\n second: 39,\n amount: -13\n },\n {\n first: 76,\n second: 65,\n amount: 1\n },\n {\n first: 76,\n second: 67,\n amount: -3\n },\n {\n first: 76,\n second: 71,\n amount: -3\n },\n {\n first: 76,\n second: 79,\n amount: -3\n },\n {\n first: 76,\n second: 81,\n amount: -3\n },\n {\n first: 76,\n second: 84,\n amount: -11\n },\n {\n first: 76,\n second: 85,\n amount: -2\n },\n {\n first: 76,\n second: 86,\n amount: -7\n },\n {\n first: 76,\n second: 87,\n amount: -6\n },\n {\n first: 76,\n second: 89,\n amount: -9\n },\n {\n first: 76,\n second: 117,\n amount: -2\n },\n {\n first: 76,\n second: 118,\n amount: -5\n },\n {\n first: 76,\n second: 119,\n amount: -4\n },\n {\n first: 76,\n second: 121,\n amount: -5\n },\n {\n first: 77,\n second: 65,\n amount: 1\n },\n {\n first: 77,\n second: 84,\n amount: -1\n },\n {\n first: 77,\n second: 88,\n amount: 1\n },\n {\n first: 77,\n second: 89,\n amount: -1\n },\n {\n first: 78,\n second: 65,\n amount: 1\n },\n {\n first: 78,\n second: 84,\n amount: -1\n },\n {\n first: 78,\n second: 88,\n amount: 1\n },\n {\n first: 78,\n second: 89,\n amount: -1\n },\n {\n first: 79,\n second: 44,\n amount: -4\n },\n {\n first: 79,\n second: 46,\n amount: -4\n },\n {\n first: 79,\n second: 65,\n amount: -1\n },\n {\n first: 79,\n second: 84,\n amount: -1\n },\n {\n first: 79,\n second: 86,\n amount: -1\n },\n {\n first: 79,\n second: 88,\n amount: -1\n },\n {\n first: 79,\n second: 89,\n amount: -2\n },\n {\n first: 79,\n second: 90,\n amount: -1\n },\n {\n first: 80,\n second: 44,\n amount: -13\n },\n {\n first: 80,\n second: 46,\n amount: -13\n },\n {\n first: 80,\n second: 65,\n amount: -5\n },\n {\n first: 80,\n second: 74,\n amount: -8\n },\n {\n first: 80,\n second: 88,\n amount: -1\n },\n {\n first: 80,\n second: 90,\n amount: -1\n },\n {\n first: 80,\n second: 97,\n amount: 0\n },\n {\n first: 80,\n second: 99,\n amount: -1\n },\n {\n first: 80,\n second: 100,\n amount: -1\n },\n {\n first: 80,\n second: 101,\n amount: -1\n },\n {\n first: 80,\n second: 103,\n amount: -1\n },\n {\n first: 80,\n second: 111,\n amount: -1\n },\n {\n first: 80,\n second: 113,\n amount: -1\n },\n {\n first: 80,\n second: 116,\n amount: 1\n },\n {\n first: 80,\n second: 118,\n amount: 1\n },\n {\n first: 80,\n second: 121,\n amount: 1\n },\n {\n first: 81,\n second: 84,\n amount: -2\n },\n {\n first: 81,\n second: 86,\n amount: -1\n },\n {\n first: 81,\n second: 87,\n amount: -1\n },\n {\n first: 81,\n second: 89,\n amount: -1\n },\n {\n first: 82,\n second: 84,\n amount: -3\n },\n {\n first: 82,\n second: 86,\n amount: -1\n },\n {\n first: 82,\n second: 89,\n amount: -2\n },\n {\n first: 84,\n second: 171,\n amount: -13\n },\n {\n first: 84,\n second: 44,\n amount: -9\n },\n {\n first: 84,\n second: 45,\n amount: -9\n },\n {\n first: 84,\n second: 46,\n amount: -9\n },\n {\n first: 84,\n second: 65,\n amount: -3\n },\n {\n first: 84,\n second: 67,\n amount: -1\n },\n {\n first: 84,\n second: 71,\n amount: -1\n },\n {\n first: 84,\n second: 74,\n amount: -9\n },\n {\n first: 84,\n second: 79,\n amount: -1\n },\n {\n first: 84,\n second: 81,\n amount: -1\n },\n {\n first: 84,\n second: 83,\n amount: -1\n },\n {\n first: 84,\n second: 84,\n amount: 1\n },\n {\n first: 84,\n second: 86,\n amount: 1\n },\n {\n first: 84,\n second: 87,\n amount: 1\n },\n {\n first: 84,\n second: 89,\n amount: 1\n },\n {\n first: 84,\n second: 97,\n amount: -4\n },\n {\n first: 84,\n second: 99,\n amount: -4\n },\n {\n first: 84,\n second: 100,\n amount: -4\n },\n {\n first: 84,\n second: 101,\n amount: -4\n },\n {\n first: 84,\n second: 103,\n amount: -4\n },\n {\n first: 84,\n second: 109,\n amount: -4\n },\n {\n first: 84,\n second: 110,\n amount: -4\n },\n {\n first: 84,\n second: 111,\n amount: -4\n },\n {\n first: 84,\n second: 112,\n amount: -4\n },\n {\n first: 84,\n second: 113,\n amount: -4\n },\n {\n first: 84,\n second: 114,\n amount: -3\n },\n {\n first: 84,\n second: 115,\n amount: -5\n },\n {\n first: 84,\n second: 117,\n amount: -4\n },\n {\n first: 84,\n second: 118,\n amount: -3\n },\n {\n first: 84,\n second: 119,\n amount: -2\n },\n {\n first: 84,\n second: 120,\n amount: -3\n },\n {\n first: 84,\n second: 121,\n amount: -3\n },\n {\n first: 84,\n second: 122,\n amount: -2\n },\n {\n first: 84,\n second: 32,\n amount: -2\n },\n {\n first: 85,\n second: 65,\n amount: -1\n },\n {\n first: 86,\n second: 41,\n amount: 1\n },\n {\n first: 86,\n second: 44,\n amount: -9\n },\n {\n first: 86,\n second: 45,\n amount: -1\n },\n {\n first: 86,\n second: 46,\n amount: -9\n },\n {\n first: 86,\n second: 65,\n amount: -3\n },\n {\n first: 86,\n second: 67,\n amount: -1\n },\n {\n first: 86,\n second: 71,\n amount: -1\n },\n {\n first: 86,\n second: 79,\n amount: -1\n },\n {\n first: 86,\n second: 81,\n amount: -1\n },\n {\n first: 86,\n second: 93,\n amount: 1\n },\n {\n first: 86,\n second: 97,\n amount: -2\n },\n {\n first: 86,\n second: 99,\n amount: -2\n },\n {\n first: 86,\n second: 100,\n amount: -2\n },\n {\n first: 86,\n second: 101,\n amount: -2\n },\n {\n first: 86,\n second: 103,\n amount: -2\n },\n {\n first: 86,\n second: 111,\n amount: -2\n },\n {\n first: 86,\n second: 113,\n amount: -2\n },\n {\n first: 86,\n second: 114,\n amount: -1\n },\n {\n first: 86,\n second: 117,\n amount: -1\n },\n {\n first: 86,\n second: 118,\n amount: 0\n },\n {\n first: 86,\n second: 121,\n amount: 0\n },\n {\n first: 86,\n second: 125,\n amount: 1\n },\n {\n first: 87,\n second: 41,\n amount: 1\n },\n {\n first: 87,\n second: 44,\n amount: -5\n },\n {\n first: 87,\n second: 45,\n amount: -2\n },\n {\n first: 87,\n second: 46,\n amount: -5\n },\n {\n first: 87,\n second: 65,\n amount: -2\n },\n {\n first: 87,\n second: 84,\n amount: 1\n },\n {\n first: 87,\n second: 93,\n amount: 0\n },\n {\n first: 87,\n second: 97,\n amount: -1\n },\n {\n first: 87,\n second: 99,\n amount: -1\n },\n {\n first: 87,\n second: 100,\n amount: -1\n },\n {\n first: 87,\n second: 101,\n amount: -1\n },\n {\n first: 87,\n second: 103,\n amount: -1\n },\n {\n first: 87,\n second: 111,\n amount: -1\n },\n {\n first: 87,\n second: 113,\n amount: -1\n },\n {\n first: 87,\n second: 114,\n amount: -1\n },\n {\n first: 87,\n second: 117,\n amount: -1\n },\n {\n first: 87,\n second: 125,\n amount: 1\n },\n {\n first: 88,\n second: 45,\n amount: -2\n },\n {\n first: 88,\n second: 67,\n amount: -1\n },\n {\n first: 88,\n second: 71,\n amount: -1\n },\n {\n first: 88,\n second: 79,\n amount: -1\n },\n {\n first: 88,\n second: 81,\n amount: -1\n },\n {\n first: 88,\n second: 86,\n amount: 1\n },\n {\n first: 88,\n second: 99,\n amount: -1\n },\n {\n first: 88,\n second: 100,\n amount: -1\n },\n {\n first: 88,\n second: 101,\n amount: -1\n },\n {\n first: 88,\n second: 103,\n amount: -1\n },\n {\n first: 88,\n second: 111,\n amount: -1\n },\n {\n first: 88,\n second: 113,\n amount: -1\n },\n {\n first: 88,\n second: 117,\n amount: -1\n },\n {\n first: 88,\n second: 118,\n amount: -1\n },\n {\n first: 88,\n second: 121,\n amount: -1\n },\n {\n first: 89,\n second: 171,\n amount: -3\n },\n {\n first: 89,\n second: 38,\n amount: -1\n },\n {\n first: 89,\n second: 41,\n amount: 1\n },\n {\n first: 89,\n second: 42,\n amount: -2\n },\n {\n first: 89,\n second: 44,\n amount: -8\n },\n {\n first: 89,\n second: 45,\n amount: -2\n },\n {\n first: 89,\n second: 46,\n amount: -8\n },\n {\n first: 89,\n second: 65,\n amount: -4\n },\n {\n first: 89,\n second: 67,\n amount: -1\n },\n {\n first: 89,\n second: 71,\n amount: -1\n },\n {\n first: 89,\n second: 74,\n amount: -4\n },\n {\n first: 89,\n second: 79,\n amount: -1\n },\n {\n first: 89,\n second: 81,\n amount: -1\n },\n {\n first: 89,\n second: 83,\n amount: -1\n },\n {\n first: 89,\n second: 84,\n amount: 1\n },\n {\n first: 89,\n second: 85,\n amount: -4\n },\n {\n first: 89,\n second: 86,\n amount: 1\n },\n {\n first: 89,\n second: 87,\n amount: 1\n },\n {\n first: 89,\n second: 88,\n amount: 1\n },\n {\n first: 89,\n second: 89,\n amount: 1\n },\n {\n first: 89,\n second: 93,\n amount: 1\n },\n {\n first: 89,\n second: 97,\n amount: -3\n },\n {\n first: 89,\n second: 99,\n amount: -3\n },\n {\n first: 89,\n second: 100,\n amount: -3\n },\n {\n first: 89,\n second: 101,\n amount: -3\n },\n {\n first: 89,\n second: 102,\n amount: -1\n },\n {\n first: 89,\n second: 103,\n amount: -3\n },\n {\n first: 89,\n second: 109,\n amount: -2\n },\n {\n first: 89,\n second: 110,\n amount: -2\n },\n {\n first: 89,\n second: 111,\n amount: -3\n },\n {\n first: 89,\n second: 112,\n amount: -2\n },\n {\n first: 89,\n second: 113,\n amount: -3\n },\n {\n first: 89,\n second: 114,\n amount: -2\n },\n {\n first: 89,\n second: 115,\n amount: -2\n },\n {\n first: 89,\n second: 116,\n amount: -1\n },\n {\n first: 89,\n second: 117,\n amount: -2\n },\n {\n first: 89,\n second: 118,\n amount: -1\n },\n {\n first: 89,\n second: 120,\n amount: -1\n },\n {\n first: 89,\n second: 121,\n amount: -1\n },\n {\n first: 89,\n second: 122,\n amount: -1\n },\n {\n first: 89,\n second: 125,\n amount: 1\n },\n {\n first: 90,\n second: 65,\n amount: 1\n },\n {\n first: 90,\n second: 67,\n amount: -1\n },\n {\n first: 90,\n second: 71,\n amount: -1\n },\n {\n first: 90,\n second: 79,\n amount: -1\n },\n {\n first: 90,\n second: 81,\n amount: -1\n },\n {\n first: 90,\n second: 99,\n amount: -1\n },\n {\n first: 90,\n second: 100,\n amount: -1\n },\n {\n first: 90,\n second: 101,\n amount: -1\n },\n {\n first: 90,\n second: 103,\n amount: -1\n },\n {\n first: 90,\n second: 111,\n amount: -1\n },\n {\n first: 90,\n second: 113,\n amount: -1\n },\n {\n first: 90,\n second: 117,\n amount: -1\n },\n {\n first: 90,\n second: 118,\n amount: -1\n },\n {\n first: 90,\n second: 119,\n amount: -1\n },\n {\n first: 90,\n second: 121,\n amount: -1\n },\n {\n first: 91,\n second: 74,\n amount: -1\n },\n {\n first: 91,\n second: 85,\n amount: -1\n },\n {\n first: 97,\n second: 34,\n amount: -3\n },\n {\n first: 97,\n second: 39,\n amount: -3\n },\n {\n first: 97,\n second: 118,\n amount: -1\n },\n {\n first: 97,\n second: 121,\n amount: -1\n },\n {\n first: 98,\n second: 34,\n amount: -1\n },\n {\n first: 98,\n second: 39,\n amount: -1\n },\n {\n first: 98,\n second: 118,\n amount: 0\n },\n {\n first: 98,\n second: 120,\n amount: -1\n },\n {\n first: 98,\n second: 121,\n amount: 0\n },\n {\n first: 98,\n second: 122,\n amount: -1\n },\n {\n first: 99,\n second: 34,\n amount: 0\n },\n {\n first: 99,\n second: 39,\n amount: 0\n },\n {\n first: 101,\n second: 34,\n amount: -1\n },\n {\n first: 101,\n second: 39,\n amount: -1\n },\n {\n first: 101,\n second: 118,\n amount: -1\n },\n {\n first: 101,\n second: 121,\n amount: -1\n },\n {\n first: 102,\n second: 34,\n amount: 1\n },\n {\n first: 102,\n second: 39,\n amount: 1\n },\n {\n first: 102,\n second: 41,\n amount: 1\n },\n {\n first: 102,\n second: 93,\n amount: 1\n },\n {\n first: 102,\n second: 99,\n amount: -1\n },\n {\n first: 102,\n second: 100,\n amount: -1\n },\n {\n first: 102,\n second: 101,\n amount: -1\n },\n {\n first: 102,\n second: 103,\n amount: -1\n },\n {\n first: 102,\n second: 113,\n amount: -1\n },\n {\n first: 102,\n second: 125,\n amount: 1\n },\n {\n first: 104,\n second: 34,\n amount: -4\n },\n {\n first: 104,\n second: 39,\n amount: -4\n },\n {\n first: 107,\n second: 99,\n amount: -1\n },\n {\n first: 107,\n second: 100,\n amount: -1\n },\n {\n first: 107,\n second: 101,\n amount: -1\n },\n {\n first: 107,\n second: 103,\n amount: -1\n },\n {\n first: 107,\n second: 113,\n amount: -1\n },\n {\n first: 109,\n second: 34,\n amount: -4\n },\n {\n first: 109,\n second: 39,\n amount: -4\n },\n {\n first: 110,\n second: 34,\n amount: -4\n },\n {\n first: 110,\n second: 39,\n amount: -4\n },\n {\n first: 111,\n second: 34,\n amount: -5\n },\n {\n first: 111,\n second: 39,\n amount: -5\n },\n {\n first: 111,\n second: 118,\n amount: -1\n },\n {\n first: 111,\n second: 120,\n amount: -1\n },\n {\n first: 111,\n second: 121,\n amount: -1\n },\n {\n first: 111,\n second: 122,\n amount: -1\n },\n {\n first: 112,\n second: 34,\n amount: -1\n },\n {\n first: 112,\n second: 39,\n amount: -1\n },\n {\n first: 112,\n second: 118,\n amount: 0\n },\n {\n first: 112,\n second: 120,\n amount: -1\n },\n {\n first: 112,\n second: 121,\n amount: 0\n },\n {\n first: 112,\n second: 122,\n amount: -1\n },\n {\n first: 114,\n second: 34,\n amount: 1\n },\n {\n first: 114,\n second: 39,\n amount: 1\n },\n {\n first: 114,\n second: 44,\n amount: -5\n },\n {\n first: 114,\n second: 46,\n amount: -5\n },\n {\n first: 114,\n second: 97,\n amount: -2\n },\n {\n first: 114,\n second: 99,\n amount: -1\n },\n {\n first: 114,\n second: 100,\n amount: -1\n },\n {\n first: 114,\n second: 101,\n amount: -1\n },\n {\n first: 114,\n second: 102,\n amount: 1\n },\n {\n first: 114,\n second: 103,\n amount: -1\n },\n {\n first: 114,\n second: 111,\n amount: -1\n },\n {\n first: 114,\n second: 113,\n amount: -1\n },\n {\n first: 114,\n second: 116,\n amount: 2\n },\n {\n first: 114,\n second: 118,\n amount: 1\n },\n {\n first: 114,\n second: 119,\n amount: 1\n },\n {\n first: 114,\n second: 121,\n amount: 1\n },\n {\n first: 116,\n second: 111,\n amount: -1\n },\n {\n first: 118,\n second: 34,\n amount: 1\n },\n {\n first: 118,\n second: 39,\n amount: 1\n },\n {\n first: 118,\n second: 44,\n amount: -4\n },\n {\n first: 118,\n second: 46,\n amount: -4\n },\n {\n first: 118,\n second: 97,\n amount: -1\n },\n {\n first: 118,\n second: 99,\n amount: -1\n },\n {\n first: 118,\n second: 100,\n amount: -1\n },\n {\n first: 118,\n second: 101,\n amount: -1\n },\n {\n first: 118,\n second: 102,\n amount: 1\n },\n {\n first: 118,\n second: 103,\n amount: -1\n },\n {\n first: 118,\n second: 111,\n amount: -1\n },\n {\n first: 118,\n second: 113,\n amount: -1\n },\n {\n first: 119,\n second: 44,\n amount: -5\n },\n {\n first: 119,\n second: 46,\n amount: -5\n },\n {\n first: 120,\n second: 99,\n amount: -1\n },\n {\n first: 120,\n second: 100,\n amount: -1\n },\n {\n first: 120,\n second: 101,\n amount: -1\n },\n {\n first: 120,\n second: 103,\n amount: -1\n },\n {\n first: 120,\n second: 111,\n amount: -1\n },\n {\n first: 120,\n second: 113,\n amount: -1\n },\n {\n first: 121,\n second: 34,\n amount: 1\n },\n {\n first: 121,\n second: 39,\n amount: 1\n },\n {\n first: 121,\n second: 44,\n amount: -4\n },\n {\n first: 121,\n second: 46,\n amount: -4\n },\n {\n first: 121,\n second: 97,\n amount: -1\n },\n {\n first: 121,\n second: 99,\n amount: -1\n },\n {\n first: 121,\n second: 100,\n amount: -1\n },\n {\n first: 121,\n second: 101,\n amount: -1\n },\n {\n first: 121,\n second: 102,\n amount: 1\n },\n {\n first: 121,\n second: 103,\n amount: -1\n },\n {\n first: 121,\n second: 111,\n amount: -1\n },\n {\n first: 121,\n second: 113,\n amount: -1\n },\n {\n first: 122,\n second: 99,\n amount: -1\n },\n {\n first: 122,\n second: 100,\n amount: -1\n },\n {\n first: 122,\n second: 101,\n amount: -1\n },\n {\n first: 122,\n second: 103,\n amount: -1\n },\n {\n first: 122,\n second: 111,\n amount: -1\n },\n {\n first: 122,\n second: 113,\n amount: -1\n },\n {\n first: 123,\n second: 74,\n amount: -1\n },\n {\n first: 123,\n second: 85,\n amount: -1\n },\n {\n first: 32,\n second: 84,\n amount: -2\n }\n], jR = {\n pages: XR,\n chars: HR,\n info: KR,\n common: qR,\n distanceField: YR,\n kernings: ZR\n}, S_ = \"data:image/png;base64,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QiAEQiAEH6OuJ3JeJ4eu96Xb7bp//77R0VEjIyMGBwf19vb6/PPPHRscHPTNN984c+aM5eVlaZra3Ny0t7fn6OhIPp9XLBYNDw8rl8smJydNTEx40d27d926dcudO3fcu3dPvV73sbl06ZJqtapWq7l8+bLp6WknNZtNs7OzfvOb35idnXXr1i137961vr7utLa3t927d8/y8rJWq2V7e1u73faDQqFgamrKscnJSZ999pksy6ytrVldXZWmqZeZWcKSD2TG29rAjD8dk//ZJL/Cr/Ar9Hvev8e/wa/xbw7IMu9i2e9MeifjxuX9I/wK/wi/9Lw9/Bq/xq8tL/8rQ78Y8rnruI7r+Pue928wgxl+M8PRkVf57hdeqajoC9dxHdfxn3jeX2MGM7777v/2dhaw62NR8C5yaHtnOzs7vv32W2maGhsbMzQ0JJfL2d/f12q1LCwsSNPUaR0cEALr64RACJRKnokioohSiShib08iEYvFYonEU90uWUaWkWVkmTfJMlotWi2yjGrVE8PDxDFxTBwzMsLmpkgkEolEIpHnhEAIhMD6uo9ZFzmvk0PX+7K2tub27duKxaLe3l7dble73Xb58mV9fX2OjY+PGx8fd3h4aGtry/7+vqOjI/l8Xn9/v+HhYT09PV50cHDg7t27bt26ZXZ21q1bt9y+fVuapj4m4+PjLly44OLFiy5duqRarTppZ2fH7du33bx50+zsrO+//97s7Kx2u+1dbG5u+u677xwcHOh2uwqFgmKxaGhoSKlUcqxarVpdXbW8vGxpacni4qKlpSUvevjwr/HX+Kfev4fe1sPv8T3+J38Sxlev+3IVq1jFOc8bwxjGMPYdWeZd/JXfue6djBnztTGMoeL3rWAFK8yu+KtlXGcKn3uD33ij7657rQl84Q1u8J23dRs5H4uCV+oi50M5ODhw9+5dd+/e1dfXJ5fLOTg40O12vYsQCIEQCIFSyTOlElFEFFEqsboqFkskYrFY7KksI8vIMrKM3V1v0mrRapFltFrs7VEseiKOiWPimDhmc1MkUlISiUQizwmBEAiBEHzsup7IeZWcJ7reh4cPHyoUCn7Qbrft7OxYX1934cIF09PTTurp6VEqlZzGwsKCubk59+/fd+fOHbdu3TI7O2tubs7HZnp62rlz55w/f96FCxcMDAw46f79++7evev27dtu3bpl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\", ys = ({ engine: n, data: e, kind: t, stride: i, mesh: r }) => {\n const s = new FR(n, e, t, !0, !1, i);\n r.setVerticesBuffer(s);\n}, QR = `\nprecision highp float; \n\nattribute vec3 position; \nattribute vec2 uv; \nattribute vec2 center; \n\nuniform mat4 worldViewProjection; \n\nvarying vec2 vUv;\nvarying vec2 vCenter; \n\nvoid main(void) { \n gl_Position = worldViewProjection * vec4(position, 1.0); \n vUv = uv; \n vCenter = center;\n}\n`, JR = `\nprecision highp float;\n\nvarying vec2 vUv; \nvarying vec2 vCenter; \n\nuniform sampler2D uFontAtlas;\n\nuniform vec3 uStrokeColor;\nuniform vec3 uColor;\n\nuniform float uThreshold;\nuniform float uStrokeOutsetWidth;\nuniform float uStrokeInsetWidth;\nuniform float uOpacity;\nuniform float uAlphaTest;\n\nuniform int uLinesTotal;\nuniform int uWordsTotal;\nuniform int uLettersTotal;\n\nfloat median(float r, float g, float b) {\n return max(min(r, g), min(max(r, g), b));\n}\n\n\nvoid main(void) { \n\n float thickness = 0.5;\n float softness = 0.5;\n\n vec3 s = texture2D(uFontAtlas, vUv).rgb;\n float sigDist = median(s.r, s.g, s.b) - 0.5;\n float afwidth = 1.4142135623730951 / 2.0;\n\n #ifdef IS_SMALL\n float alpha = smoothstep(uThreshold - afwidth, uThreshold + afwidth, sigDist);\n #else\n float alpha = clamp(sigDist / fwidth(sigDist) + 0.5, 0.0, 1.0);\n #endif\n \n float sigDistOutset = sigDist + uStrokeOutsetWidth * 0.5;\n \n // Inset\n float sigDistInset = sigDist - uStrokeInsetWidth * 0.5;\n \n #ifdef IS_SMALL\n float outset = smoothstep(uThreshold - afwidth, uThreshold + afwidth, sigDistOutset);\n float inset = 1.0 - smoothstep(uThreshold - afwidth, uThreshold + afwidth, sigDistInset);\n #else\n float outset = clamp(sigDistOutset / fwidth(sigDistOutset) + 0.5, 0.0, 1.0);\n float inset = 1.0 - clamp(sigDistInset / fwidth(sigDistInset) + 0.5, 0.0, 1.0);\n #endif\n \n float border = outset * inset;\n \n // Alpha Test\n if (alpha < uAlphaTest) discard;\n\n // Output: Common\n vec4 filledFragColor = vec4(uColor, uOpacity * alpha);\n \n // Output: Strokes\n vec4 strokedFragColor = vec4(uStrokeColor, uOpacity * border);\n \n gl_FragColor = filledFragColor; \n}\n`;\nfunction y_(n) {\n return n && n.__esModule && Object.prototype.hasOwnProperty.call(n, \"default\") ? n.default : n;\n}\nvar $R = function(n) {\n switch (n) {\n case \"int8\":\n return Int8Array;\n case \"int16\":\n return Int16Array;\n case \"int32\":\n return Int32Array;\n case \"uint8\":\n return Uint8Array;\n case \"uint16\":\n return Uint16Array;\n case \"uint32\":\n return Uint32Array;\n case \"float32\":\n return Float32Array;\n case \"float64\":\n return Float64Array;\n case \"array\":\n return Array;\n case \"uint8_clamped\":\n return Uint8ClampedArray;\n }\n}, eS = Object.prototype.toString, tS = iS;\nfunction iS(n) {\n return n.BYTES_PER_ELEMENT && eS.call(n.buffer) === \"[object ArrayBuffer]\" || Array.isArray(n);\n}\n/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\nvar rS = function(n) {\n return n != null && (I_(n) || sS(n) || !!n._isBuffer);\n};\nfunction I_(n) {\n return !!n.constructor && typeof n.constructor.isBuffer == \"function\" && n.constructor.isBuffer(n);\n}\nfunction sS(n) {\n return typeof n.readFloatLE == \"function\" && typeof n.slice == \"function\" && I_(n.slice(0, 0));\n}\nvar nS = $R, aS = tS, oS = rS, lS = [0, 2, 3], cS = [2, 1, 3], hS = function(n, e) {\n (!n || !(aS(n) || oS(n))) && (e = n || {}, n = null), typeof e == \"number\" ? e = { count: e } : e = e || {};\n for (var t = typeof e.type == \"string\" ? e.type : \"uint16\", i = typeof e.count == \"number\" ? e.count : 1, r = e.start || 0, s = e.clockwise !== !1 ? lS : cS, a = s[0], o = s[1], l = s[2], c = i * 6, h = n || new (nS(t))(c), u = 0, f = 0; u < c; u += 6, f += 4) {\n var d = u + r;\n h[d + 0] = f + 0, h[d + 1] = f + 1, h[d + 2] = f + 2, h[d + 3] = f + a, h[d + 4] = f + o, h[d + 5] = f + l;\n }\n return h;\n};\nconst uS = /* @__PURE__ */ y_(hS);\nvar b_ = { exports: {} };\n(function(n) {\n var e = /\\n/, t = `\n`, i = /\\s/;\n n.exports = function(c, h) {\n var u = n.exports.lines(c, h);\n return u.map(function(f) {\n return c.substring(f.start, f.end);\n }).join(`\n`);\n }, n.exports.lines = function(c, h) {\n if (h = h || {}, h.width === 0 && h.mode !== \"nowrap\")\n return [];\n c = c || \"\";\n var u = typeof h.width == \"number\" ? h.width : Number.MAX_VALUE, f = Math.max(0, h.start || 0), d = typeof h.end == \"number\" ? h.end : c.length, p = h.mode, g = h.measure || l;\n return p === \"pre\" ? a(g, c, f, d, u) : o(g, c, f, d, u, p);\n };\n function r(c, h, u, f) {\n var d = c.indexOf(h, u);\n return d === -1 || d > f ? f : d;\n }\n function s(c) {\n return i.test(c);\n }\n function a(c, h, u, f, d) {\n for (var p = [], g = u, m = u; m < f && m < h.length; m++) {\n var v = h.charAt(m), E = e.test(v);\n if (E || m === f - 1) {\n var C = E ? m : m + 1, T = c(h, g, C, d);\n p.push(T), g = m + 1;\n }\n }\n return p;\n }\n function o(c, h, u, f, d, p) {\n var g = [], m = d;\n for (p === \"nowrap\" && (m = Number.MAX_VALUE); u < f && u < h.length; ) {\n for (var v = r(h, t, u, f); u < v && s(h.charAt(u)); )\n u++;\n var E = c(h, u, v, m), C = u + (E.end - E.start), T = C + t.length;\n if (C < v) {\n for (; C > u && !s(h.charAt(C)); )\n C--;\n if (C === u)\n T > u + t.length && T--, C = T;\n else\n for (T = C; C > u && s(h.charAt(C - t.length)); )\n C--;\n }\n if (C >= u) {\n var R = c(h, u, C, m);\n g.push(R);\n }\n u = T;\n }\n return g;\n }\n function l(c, h, u, f) {\n var d = Math.min(f, u - h);\n return {\n start: h,\n end: h + d\n };\n }\n})(b_);\nvar fS = b_.exports;\nconst dS = /* @__PURE__ */ y_(fS), Bp = [\n \"x\",\n \"e\",\n \"a\",\n \"o\",\n \"n\",\n \"s\",\n \"r\",\n \"c\",\n \"u\",\n \"m\",\n \"v\",\n \"w\",\n \"z\"\n], kp = [\"m\", \"w\"], zp = [\n \"H\",\n \"I\",\n \"N\",\n \"E\",\n \"F\",\n \"K\",\n \"L\",\n \"T\",\n \"U\",\n \"V\",\n \"W\",\n \"X\",\n \"Y\",\n \"Z\"\n], Wp = 9, Ja = 32, pS = 0, A_ = 1, M_ = 2;\nclass gS {\n constructor(e = {}) {\n this.glyphs = [], this._measure = this.computeMetrics.bind(this), this.update(e);\n }\n /**\n * Getters\n */\n get width() {\n return this._width;\n }\n get height() {\n return this._height;\n }\n get descender() {\n return this._descender;\n }\n get ascender() {\n return this._ascender;\n }\n get xHeight() {\n return this._xHeight;\n }\n get baseline() {\n return this._baseline;\n }\n get capHeight() {\n return this._capHeight;\n }\n get lineHeight() {\n return this._lineHeight;\n }\n get linesTotal() {\n return this._linesTotal;\n }\n get lettersTotal() {\n return this._lettersTotal;\n }\n get wordsTotal() {\n return this._wordsTotal;\n }\n update(e) {\n if (e = Object.assign({ measure: this._measure }, e), this._options = e, this._options.tabSize = xS(this._options.tabSize, 4), !e.font)\n throw new Error(\"must provide a valid bitmap font\");\n const t = this.glyphs, i = e.text || \"\", r = e.font;\n this._setupSpaceGlyphs(r);\n const s = dS.lines(i, e), a = e.width || 0, o = i.split(\" \").filter((R) => R !== `\n`).length, l = i.split(\"\").filter((R) => R !== `\n` && R !== \" \").length;\n t.length = 0;\n const c = s.reduce(function(R, x) {\n return Math.max(R, x.width, a);\n }, 0);\n let h = 0, u = 0;\n const f = e.lineHeight ? e.lineHeight : 1, d = r.common.lineHeight * Math.max(f, 1), p = r.common.base, g = d - p, m = e.letterSpacing || 0, v = d * s.length - g, E = TS(this._options.align);\n u -= v, this._width = c, this._height = v, this._descender = d - p, this._baseline = p, this._xHeight = _S(r), this._capHeight = vS(r), this._lineHeight = d, this._ascender = d - g - this._xHeight;\n let C = 0, T = 0;\n s.forEach((R, x) => {\n const S = R.start, M = R.end, N = R.width, F = i.slice(S, M).split(\" \").filter((k) => k !== \"\").length, L = i.slice(S, M).split(\" \").join(\"\").length;\n let K = 0, q = 0, j;\n for (let k = S; k < M; k++) {\n const Q = i.charCodeAt(k), ce = this.getGlyph(r, Q);\n if (ce) {\n j && (h += Xp(r, j.id, ce.id));\n let de = h;\n E === A_ ? de += (c - N) / 2 : E === M_ && (de += c - N), t.push({\n position: [de, u],\n data: ce,\n index: k,\n // Line\n linesTotal: s.length,\n lineIndex: x,\n lineLettersTotal: L,\n lineLetterIndex: K,\n lineWordsTotal: F,\n lineWordIndex: q,\n // Word\n wordsTotal: o,\n wordIndex: C,\n // Letter\n lettersTotal: l,\n letterIndex: T\n }), ce.id === Ja && j.id !== Ja && (q++, C++), ce.id !== Ja && (K++, T++), h += ce.xadvance + m, j = ce;\n }\n }\n u += d, h = 0;\n }), this._lettersTotal = l, this._wordsTotal = o, this._linesTotal = s.length;\n }\n getGlyph(e, t) {\n return Gp(e, t) || (t === Wp ? this._fallbackTabGlyph : t === Ja ? this._fallbackSpaceGlyph : null);\n }\n computeMetrics(e, t, i, r) {\n const s = this._options.letterSpacing || 0, a = this._options.font;\n let o = 0, l = 0, c = 0, h, u;\n if (!a.chars || a.chars.length === 0)\n return {\n start: t,\n end: t,\n width: 0\n };\n i = Math.min(e.length, i);\n for (let f = t; f < i; f++) {\n const d = e.charCodeAt(f);\n if (h = this.getGlyph(a, d), h) {\n h.char = e[f], h.xoffset;\n const p = u ? Xp(a, u.id, h.id) : 0;\n o += p;\n const g = o + h.xadvance + s, m = o + h.width;\n if (m >= r || g >= r)\n break;\n o = g, l = m, u = h;\n }\n c++;\n }\n return u && (l += u.xoffset), {\n start: t,\n end: t + c,\n width: l\n };\n }\n /**\n * Private\n */\n _setupSpaceGlyphs(e) {\n if (this._fallbackSpaceGlyph = null, this._fallbackTabGlyph = null, !e.chars || e.chars.length === 0)\n return;\n const t = Gp(e, Ja) || ES(e) || e.chars[0], i = this._options.tabSize * t.xadvance;\n this._fallbackSpaceGlyph = t;\n const r = Object.assign({}, t);\n this._fallbackTabGlyph = Object.assign(r, {\n x: 0,\n y: 0,\n xadvance: i,\n id: Wp,\n xoffset: 0,\n yoffset: 0,\n width: 0,\n height: 0\n });\n }\n}\nfunction mS(n) {\n return new gS(n);\n}\nfunction Gp(n, e) {\n if (!n.chars || n.chars.length === 0)\n return null;\n const t = Mc(n.chars, e);\n return t >= 0 ? n.chars[t] : null;\n}\nfunction _S(n) {\n for (let e = 0; e < Bp.length; e++) {\n const t = Bp[e].charCodeAt(0), i = Mc(n.chars, t);\n if (i >= 0)\n return n.chars[i].height;\n }\n return 0;\n}\nfunction ES(n) {\n for (let e = 0; e < kp.length; e++) {\n const t = kp[e].charCodeAt(0), i = Mc(n.chars, t);\n if (i >= 0)\n return n.chars[i];\n }\n return 0;\n}\nfunction vS(n) {\n for (let e = 0; e < zp.length; e++) {\n const t = zp[e].charCodeAt(0), i = Mc(n.chars, t);\n if (i >= 0)\n return n.chars[i].height;\n }\n return 0;\n}\nfunction Xp(n, e, t) {\n if (!n.kernings || n.kernings.length === 0)\n return 0;\n const i = n.kernings;\n for (let r = 0; r < i.length; r++) {\n const s = i[r];\n if (s.first === e && s.second === t)\n return s.amount;\n }\n return 0;\n}\nfunction TS(n) {\n return n === \"center\" ? A_ : n === \"right\" ? M_ : pS;\n}\nfunction Mc(n, e, t) {\n t = t || 0;\n for (let i = t; i < n.length; i++)\n if (n[i].id === e)\n return i;\n return -1;\n}\nfunction xS(n, e) {\n return typeof n == \"number\" ? n : typeof e == \"number\" ? e : 0;\n}\nfunction CS(n) {\n const e = new Float32Array(n.length * 4 * 1);\n let t = 0;\n return n.forEach(function(i) {\n const r = i.data.page || 0;\n e[t++] = r, e[t++] = r, e[t++] = r, e[t++] = r;\n }), e;\n}\nfunction RS(n, e, t, i, r) {\n const s = new Float32Array(n.length * 4 * 2), a = new Float32Array(n.length * 4 * 2), o = new Float32Array(n.length * 4 * 3), l = new Float32Array(n.length * 4 * 2);\n let c = 0, h = 0, u = 0, f = 0;\n return n.forEach(function(d) {\n const p = d.data, g = p.x + p.width, m = p.y + p.height, v = p.x / e;\n let E = p.y / t;\n const C = g / e;\n let T = m / t;\n i && (E = (t - p.y) / t, T = (t - m) / t), s[c++] = v, s[c++] = E, s[c++] = v, s[c++] = T, s[c++] = C, s[c++] = T, s[c++] = C, s[c++] = E, a[f++] = d.position[0] / r.width, a[f++] = (d.position[1] + r.height) / r.height, a[f++] = d.position[0] / r.width, a[f++] = (d.position[1] + r.height + p.height) / r.height, a[f++] = (d.position[0] + p.width) / r.width, a[f++] = (d.position[1] + r.height + p.height) / r.height, a[f++] = (d.position[0] + p.width) / r.width, a[f++] = (d.position[1] + r.height) / r.height;\n const R = d.position[0] + p.xoffset, x = d.position[1] + p.yoffset, S = 0, M = p.width, N = p.height;\n o[h++] = R, o[h++] = x, o[h++] = S, o[h++] = R, o[h++] = x + N, o[h++] = S, o[h++] = R + M, o[h++] = x + N, o[h++] = S, o[h++] = R + M, o[h++] = x, o[h++] = S, l[u++] = R + M / 2, l[u++] = x + N / 2, l[u++] = R + M / 2, l[u++] = x + N / 2, l[u++] = R + M / 2, l[u++] = x + N / 2, l[u++] = R + M / 2, l[u++] = x + N / 2;\n }), { uvs: s, layoutUvs: a, positions: o, centers: l };\n}\nfunction SS(n) {\n const e = new Float32Array(n.length * 4), t = new Float32Array(n.length * 4), i = new Float32Array(n.length * 4), r = new Float32Array(n.length * 4), s = new Float32Array(n.length * 4), a = new Float32Array(n.length * 4), o = new Float32Array(n.length * 4);\n let l, c, h, u = 0, f = 0, d = 0, p = 0, g = 0, m = 0, v = 0;\n for (let E = 0; E < n.length; E++) {\n const C = n[E];\n e[u++] = C.lineIndex, e[u++] = C.lineIndex, e[u++] = C.lineIndex, e[u++] = C.lineIndex, t[f++] = C.lineLettersTotal, t[f++] = C.lineLettersTotal, t[f++] = C.lineLettersTotal, t[f++] = C.lineLettersTotal, i[d++] = C.lineLetterIndex, i[d++] = C.lineLetterIndex, i[d++] = C.lineLetterIndex, i[d++] = C.lineLetterIndex, r[p++] = C.lineWordsTotal, r[p++] = C.lineWordsTotal, r[p++] = C.lineWordsTotal, r[p++] = C.lineWordsTotal, s[g++] = C.lineWordIndex, s[g++] = C.lineWordIndex, s[g++] = C.lineWordIndex, s[g++] = C.lineWordIndex, a[m++] = C.wordIndex, a[m++] = C.wordIndex, a[m++] = C.wordIndex, a[m++] = C.wordIndex, o[v++] = C.letterIndex, o[v++] = C.letterIndex, o[v++] = C.letterIndex, o[v++] = C.letterIndex, h = C.lettersTotal, l = C.wordsTotal, c = C.linesTotal;\n }\n return {\n linesTotal: c,\n lineIndex: e,\n lineLettersTotal: t,\n lineLetterIndex: i,\n lineWordsTotal: r,\n lineWordIndex: s,\n wordsTotal: l,\n wordIndex: a,\n lettersTotal: h,\n letterIndex: o\n };\n}\nconst Hp = {\n pages: CS,\n attributes: RS,\n infos: SS\n}, yS = ({\n color: n = new pi(0, 0, 0),\n stroke: e,\n strokeColor: t = new pi(0, 0, 0),\n opacity: i = 1,\n strokeWidth: r = 0.5,\n ...s\n}) => {\n const a = mS(s), o = s.font;\n s.engine && console.warn(\n \"Warning: The engine argument is no longer required and will be ignored.\"\n ), s.atlas instanceof Vl || console.warn(\n \"Please provide the atlas as texture instead of image so each text mesh won't have a seperate texture instance\"\n );\n const l = s.scene.getEngine(), c = o.common.scaleW, h = o.common.scaleH, u = a.glyphs.filter((x) => {\n const S = x.data;\n return S.width * S.height > 0;\n }), f = Hp.attributes(\n u,\n c,\n h,\n !0,\n a\n ), d = Hp.infos(u, a), p = uS([], {\n clockwise: !0,\n type: \"uint16\",\n count: u.length\n }), g = new Ji(s.text || \"text\", s.scene), m = new wp();\n m.positions = f.positions, m.indices = p, m.uvs = f.uvs;\n const v = [];\n wp.ComputeNormals(f.positions, p, v), m.normals = v, ys({\n engine: l,\n data: f.centers,\n kind: \"center\",\n stride: 2,\n mesh: g\n }), ys({\n engine: l,\n data: f.layoutUvs,\n kind: \"layoutUv\",\n stride: 2,\n mesh: g\n }), ys({\n engine: l,\n data: d.lineIndex,\n kind: \"lineIndex\",\n stride: 1,\n mesh: g\n }), ys({\n engine: l,\n data: d.lineLettersTotal,\n kind: \"lineLettersTotal\",\n stride: 1,\n mesh: g\n }), ys({\n engine: l,\n data: d.lineLetterIndex,\n kind: \"lineLetterIndex\",\n stride: 1,\n mesh: g\n }), ys({\n engine: l,\n data: d.lineWordsTotal,\n kind: \"lineWordsTotal\",\n stride: 1,\n mesh: g\n }), ys({\n engine: l,\n data: d.lineWordIndex,\n kind: \"lineWordIndex\",\n stride: 1,\n mesh: g\n }), ys({\n engine: l,\n data: d.wordIndex,\n kind: \"wordIndex\",\n stride: 1,\n mesh: g\n }), ys({\n engine: l,\n data: d.letterIndex,\n kind: \"letterIndex\",\n stride: 1,\n mesh: g\n }), m.applyToMesh(g), g.scaling = new Me(0.5, 0.5, 0.5), g.rotation.y = 0, g.rotation.x = 3.14, Up.ShadersStore.customVertexShader = QR, Up.ShadersStore.customFragmentShader = JR;\n const E = new NR(\n \"shader\",\n s.scene,\n {\n vertex: \"custom\",\n fragment: \"custom\"\n },\n {\n attributes: [\n \"position\",\n \"normal\",\n \"uv\",\n \"center\",\n \"layoutUv\",\n \"lineIndex\",\n \"lineLettersTotal\",\n \"lineLetterIndex\",\n \"lineWordsTotal\",\n \"lineWordIndex\",\n \"wordIndex\",\n \"letterIndex\"\n ],\n uniforms: [\n \"world\",\n \"worldView\",\n \"worldViewProjection\",\n \"view\",\n \"projection\",\n \"uColor\",\n \"uThreshold\",\n \"uStrokeOutsetWidth\",\n \"uStrokeInsetWidth\",\n \"uOpacity\",\n \"uAlphaTest\",\n \"uStrokeColor\",\n \"uLinesTotal\",\n \"uWordsTotal\",\n \"uLettersTotal\"\n ],\n needAlphaBlending: !0\n }\n ), C = s.atlas instanceof Vl ? s.atlas : new Vl(s.atlas, s.scene);\n E.setTexture(\"uFontAtlas\", C);\n const T = new pi(n.r, n.g, n.b);\n E.setColor3(\"uColor\", T);\n const R = new pi(t.r, t.g, t.b);\n return E.setColor3(\"uStrokeColor\", R), E.setFloat(\"uThreshold\", 0.05), E.setFloat(\"uStrokeOutsetWidth\", 0), E.setFloat(\"uStrokeInsetWidth\", 0.3), E.setFloat(\"uOpacity\", i), E.setFloat(\"uAlphaTest\", 0.01), E.setInt(\"uLinesTotal\", d.linesTotal), E.setInt(\"uWordsTotal\", d.wordsTotal), E.setInt(\"uLettersTotal\", d.lettersTotal), E.backFaceCulling = !1, g.material = E, g;\n};\nclass IS {\n constructor(e, t, i) {\n this.name = e, this.options = t, this.scene = i, this.mesh = this.run();\n }\n run() {\n let e = new Ji(\"cot\"), t = yS({\n text: this.options.text.toString(),\n color: this.options.color,\n opacity: this.options.opacity,\n align: this.options.align,\n font: this.options.font,\n scene: e.getScene(),\n atlas: this.options.atlas\n });\n t.computeWorldMatrix(!0);\n let i = 1 / t.getBoundingInfo().boundingBox.extendSize._y;\n t.scaling = new Me(i, i, i), t.computeWorldMatrix(!0), t.bakeCurrentTransformIntoVertices(), t.scaling = new Me(this.options.size, this.options.size, this.options.size), t.computeWorldMatrix(!0), t.bakeCurrentTransformIntoVertices();\n let r = t.getBoundingInfo().boundingBox;\n return e.position = new Me(r.center.x, r.center.y, 0), t.setParent(e), e;\n }\n}\nfunction bS(n, e, t) {\n const i = {\n text: e.text || \"undefined\",\n size: e.size || 1,\n opacity: e.opacity || 1,\n align: e.align || \"center\",\n color: e.color || pi.White(),\n font: e.font || jR,\n atlas: e.atlas || S_\n };\n return new IS(n, i, t).mesh;\n}\nfunction AS(n, e, t) {\n let i = e.calculateBounds || !0, r = e.exclude || void 0, s = e.childObserver || !1, a = new Ji(n, t);\n if (i) {\n let { min: o, max: l } = a.getHierarchyBoundingVectors(!0, r);\n a.setBoundingInfo(new Pn(o, l));\n }\n return s && a.onAfterWorldMatrixUpdateObservable.add(() => {\n setTimeout(() => {\n if (a.detectReentrancy)\n return;\n a.detectReentrancy = !0;\n let { min: o, max: l } = a.getHierarchyBoundingVectors(!0, r);\n const c = a.getWorldMatrix().clone().invert();\n Me.TransformCoordinatesToRef(o, c, o), Me.TransformCoordinatesToRef(l, c, l), a.setBoundingInfo(new Pn(o, l)), setTimeout(() => {\n a.detectReentrancy = !1;\n });\n });\n }), a;\n}\nfunction MS(n, e, t) {\n return new On(n, t);\n}\nfunction PS(n, e, t) {\n return C_(n, e, {}, t);\n}\nconst OS = {\n cot: MS,\n sphere: kt.CreateSphere,\n box: kt.CreateBox,\n tiledBox: kt.CreateTiledBox,\n cylinder: kt.CreateCylinder,\n capsule: kt.CreateCapsule,\n plane: kt.CreatePlane,\n tiledPlane: kt.CreateTiledPlane,\n disc: kt.CreateDisc,\n torus: kt.CreateTorus,\n torusKnot: kt.CreateTorusKnot,\n ground: kt.CreateGround,\n tiledGround: kt.CreateTiledGround,\n lines: kt.CreateLines,\n dashedLines: kt.CreateDashedLines,\n lineSystem: kt.CreateLineSystem,\n ribbon: kt.CreateRibbon,\n tube: kt.CreateTube,\n extrude: kt.ExtrudeShape,\n extrudeCustom: kt.ExtrudeShapeCustom,\n lathe: kt.CreateLathe,\n polygon: kt.CreatePolygon,\n extrudePolygon: kt.ExtrudePolygon,\n polyhedra: kt.CreatePolyhedron,\n icosphere: kt.CreateIcoSphere,\n geodesic: kt.CreateGeodesic,\n goldberg: kt.CreateGoldberg,\n planeText: bS,\n greasedLine: PS,\n container: AS\n};\nfunction zo(n, e, t = {}, i = {}, r) {\n let s = {};\n for (let [l, c] of Object.entries(t))\n c instanceof Function ? s[l] = c(i) : s[l] = c;\n let a = OS[n], o = a(e, s, r);\n return o instanceof Ji && (o.actionManager = new Jr(o.getScene())), pr.EnableFor(o), o.metadata = { ...o.metadata, data: i }, o;\n}\nfunction DS(n, e = {}, t = [{}]) {\n let i = [];\n return this.selected.forEach((r) => {\n t.forEach((s, a) => {\n var o = zo(n, n, e, s, this.scene);\n o.setParent(r), i.push(o);\n });\n }), new Jt(i, this.scene);\n}\nfunction NS(n, e = [{}]) {\n let t = [];\n return this.selected.forEach((i) => {\n e.forEach((r, s) => {\n var a = n.createInstance(n.name + \"_\" + s);\n n instanceof R_ && (n.actionManager = new Jr(this.scene)), pr.EnableFor(a), a.parent = i, a.metadata = { ...n.metadata, data: r }, t.push(a);\n });\n }), new Jt(t, this.scene);\n}\nfunction FS(n) {\n return this.prop(\"position\", n), this;\n}\nfunction LS(n) {\n return this.prop(\"position.x\", n), this;\n}\nfunction wS(n) {\n return this.prop(\"position.y\", n), this;\n}\nfunction US(n) {\n return this.prop(\"position.z\", n), this;\n}\nfunction VS(n, e, t) {\n return this.selected.forEach((i, r) => {\n i instanceof On ? i.translate(\n n instanceof Function ? n(i.metadata.data, r) : n,\n e instanceof Function ? e(i.metadata.data, r) : e,\n t\n ) : console.log(\"Node not a mesh, skipping.\");\n }), this;\n}\nfunction BS(n) {\n return this.prop(\"rotation\", n), this;\n}\nfunction kS(n) {\n return this.prop(\"rotation.x\", n), this;\n}\nfunction zS(n) {\n return this.prop(\"rotation.y\", n), this;\n}\nfunction WS(n) {\n return this.prop(\"rotation.z\", n), this;\n}\nfunction GS(n) {\n return this.prop(\"scaling\", n), this;\n}\nfunction XS(n) {\n return this.prop(\"scaling.x\", n), this;\n}\nfunction HS(n) {\n return this.prop(\"scaling.y\", n), this;\n}\nfunction KS(n) {\n return this.prop(\"scaling.z\", n), this;\n}\nclass P_ {\n /**\n * Create a new EventState\n * @param mask defines the mask associated with this state\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\n * @param target defines the original target of the state\n * @param currentTarget defines the current target of the state\n */\n constructor(e, t = !1, i, r) {\n this.initialize(e, t, i, r);\n }\n /**\n * Initialize the current event state\n * @param mask defines the mask associated with this state\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\n * @param target defines the original target of the state\n * @param currentTarget defines the current target of the state\n * @returns the current event state\n */\n initialize(e, t = !1, i, r) {\n return this.mask = e, this.skipNextObservers = t, this.target = i, this.currentTarget = r, this;\n }\n}\nclass qS {\n /**\n * Creates a new observer\n * @param callback defines the callback to call when the observer is notified\n * @param mask defines the mask of the observer (used to filter notifications)\n * @param scope defines the current scope used to restore the JS context\n */\n constructor(e, t, i = null) {\n this.callback = e, this.mask = t, this.scope = i, this._willBeUnregistered = !1, this.unregisterOnNextCall = !1, this._remove = null;\n }\n /**\n * Remove the observer from its observable\n * This can be used instead of using the observable's remove function.\n */\n remove() {\n this._remove && this._remove();\n }\n}\nlet he = class du {\n /**\n * Create an observable from a Promise.\n * @param promise a promise to observe for fulfillment.\n * @param onErrorObservable an observable to notify if a promise was rejected.\n * @returns the new Observable\n */\n static FromPromise(e, t) {\n const i = new du();\n return e.then((r) => {\n i.notifyObservers(r);\n }).catch((r) => {\n if (t)\n t.notifyObservers(r);\n else\n throw r;\n }), i;\n }\n /**\n * Gets the list of observers\n * Note that observers that were recently deleted may still be present in the list because they are only really deleted on the next javascript tick!\n */\n get observers() {\n return this._observers;\n }\n /**\n * Creates a new observable\n * @param onObserverAdded defines a callback to call when a new observer is added\n * @param notifyIfTriggered If set to true the observable will notify when an observer was added if the observable was already triggered.\n */\n constructor(e, t = !1) {\n this.notifyIfTriggered = t, this._observers = new Array(), this._numObserversMarkedAsDeleted = 0, this._hasNotified = !1, this._eventState = new P_(0), e && (this._onObserverAdded = e);\n }\n add(e, t = -1, i = !1, r = null, s = !1) {\n if (!e)\n return null;\n const a = new qS(e, t, r);\n return a.unregisterOnNextCall = s, i ? this._observers.unshift(a) : this._observers.push(a), this._onObserverAdded && this._onObserverAdded(a), this._hasNotified && this.notifyIfTriggered && this._lastNotifiedValue !== void 0 && this.notifyObserver(a, this._lastNotifiedValue), a._remove = () => {\n this.remove(a);\n }, a;\n }\n addOnce(e) {\n return this.add(e, void 0, void 0, void 0, !0);\n }\n /**\n * Remove an Observer from the Observable object\n * @param observer the instance of the Observer to remove\n * @returns false if it doesn't belong to this Observable\n */\n remove(e) {\n return e ? (e._remove = null, this._observers.indexOf(e) !== -1 ? (this._deferUnregister(e), !0) : !1) : !1;\n }\n /**\n * Remove a callback from the Observable object\n * @param callback the callback to remove\n * @param scope optional scope. If used only the callbacks with this scope will be removed\n * @returns false if it doesn't belong to this Observable\n */\n removeCallback(e, t) {\n for (let i = 0; i < this._observers.length; i++) {\n const r = this._observers[i];\n if (!r._willBeUnregistered && r.callback === e && (!t || t === r.scope))\n return this._deferUnregister(r), !0;\n }\n return !1;\n }\n /**\n * @internal\n */\n _deferUnregister(e) {\n e._willBeUnregistered || (this._numObserversMarkedAsDeleted++, e.unregisterOnNextCall = !1, e._willBeUnregistered = !0, setTimeout(() => {\n this._remove(e);\n }, 0));\n }\n // This should only be called when not iterating over _observers to avoid callback skipping.\n // Removes an observer from the _observer Array.\n _remove(e, t = !0) {\n if (!e)\n return !1;\n const i = this._observers.indexOf(e);\n return i !== -1 ? (t && this._numObserversMarkedAsDeleted--, this._observers.splice(i, 1), !0) : !1;\n }\n /**\n * Moves the observable to the top of the observer list making it get called first when notified\n * @param observer the observer to move\n */\n makeObserverTopPriority(e) {\n this._remove(e, !1), this._observers.unshift(e);\n }\n /**\n * Moves the observable to the bottom of the observer list making it get called last when notified\n * @param observer the observer to move\n */\n makeObserverBottomPriority(e) {\n this._remove(e, !1), this._observers.push(e);\n }\n /**\n * Notify all Observers by calling their respective callback with the given data\n * Will return true if all observers were executed, false if an observer set skipNextObservers to true, then prevent the subsequent ones to execute\n * @param eventData defines the data to send to all observers\n * @param mask defines the mask of the current notification (observers with incompatible mask (ie mask & observer.mask === 0) will not be notified)\n * @param target defines the original target of the state\n * @param currentTarget defines the current target of the state\n * @param userInfo defines any user info to send to observers\n * @returns false if the complete observer chain was not processed (because one observer set the skipNextObservers to true)\n */\n notifyObservers(e, t = -1, i, r, s) {\n if (this.notifyIfTriggered && (this._hasNotified = !0, this._lastNotifiedValue = e), !this._observers.length)\n return !0;\n const a = this._eventState;\n a.mask = t, a.target = i, a.currentTarget = r, a.skipNextObservers = !1, a.lastReturnValue = e, a.userInfo = s;\n for (const o of this._observers)\n if (!o._willBeUnregistered && (o.mask & t && (o.unregisterOnNextCall && this._deferUnregister(o), o.scope ? a.lastReturnValue = o.callback.apply(o.scope, [e, a]) : a.lastReturnValue = o.callback(e, a)), a.skipNextObservers))\n return !1;\n return !0;\n }\n /**\n * Notify a specific observer\n * @param observer defines the observer to notify\n * @param eventData defines the data to be sent to each callback\n * @param mask is used to filter observers defaults to -1\n */\n notifyObserver(e, t, i = -1) {\n if (this.notifyIfTriggered && (this._hasNotified = !0, this._lastNotifiedValue = t), e._willBeUnregistered)\n return;\n const r = this._eventState;\n r.mask = i, r.skipNextObservers = !1, e.unregisterOnNextCall && this._deferUnregister(e), e.callback(t, r);\n }\n /**\n * Gets a boolean indicating if the observable has at least one observer\n * @returns true is the Observable has at least one Observer registered\n */\n hasObservers() {\n return this._observers.length - this._numObserversMarkedAsDeleted > 0;\n }\n /**\n * Clear the list of observers\n */\n clear() {\n for (; this._observers.length; ) {\n const e = this._observers.pop();\n e && (e._remove = null);\n }\n this._onObserverAdded = null, this._numObserversMarkedAsDeleted = 0, this.cleanLastNotifiedState();\n }\n /**\n * Clean the last notified state - both the internal last value and the has-notified flag\n */\n cleanLastNotifiedState() {\n this._hasNotified = !1, this._lastNotifiedValue = void 0;\n }\n /**\n * Clone the current observable\n * @returns a new observable\n */\n clone() {\n const e = new du();\n return e._observers = this._observers.slice(0), e;\n }\n /**\n * Does this observable handles observer registered with a given mask\n * @param mask defines the mask to be tested\n * @returns whether or not one observer registered with the given mask is handled\n **/\n hasSpecificMask(e = -1) {\n for (const t of this._observers)\n if (t.mask & e || t.mask === e)\n return !0;\n return !1;\n }\n};\nfunction yi() {\n return typeof window < \"u\";\n}\nfunction to() {\n return typeof navigator < \"u\";\n}\nfunction no() {\n return typeof document < \"u\";\n}\nfunction O_(n) {\n let e = \"\", t = n.firstChild;\n for (; t; )\n t.nodeType === 3 && (e += t.textContent), t = t.nextSibling;\n return e;\n}\nclass ne {\n static _CheckLimit(e, t) {\n let i = ne._LogLimitOutputs[e];\n return i ? i.current++ : (i = { limit: t, current: 1 }, ne._LogLimitOutputs[e] = i), i.current <= i.limit;\n }\n static _GenerateLimitMessage(e, t = 1) {\n const i = ne._LogLimitOutputs[e];\n if (!i || !ne.MessageLimitReached)\n return;\n const r = this._Levels[t];\n i.current === i.limit && ne[r.name](ne.MessageLimitReached.replace(/%LIMIT%/g, \"\" + i.limit).replace(/%TYPE%/g, r.name ?? \"\"));\n }\n static _AddLogEntry(e) {\n ne._LogCache = e + ne._LogCache, ne.OnNewCacheEntry && ne.OnNewCacheEntry(e);\n }\n static _FormatMessage(e) {\n const t = (r) => r < 10 ? \"0\" + r : \"\" + r, i = /* @__PURE__ */ new Date();\n return \"[\" + t(i.getHours()) + \":\" + t(i.getMinutes()) + \":\" + t(i.getSeconds()) + \"]: \" + e;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static _LogDisabled(e, t) {\n }\n static _LogEnabled(e = 1, t, i) {\n const r = Array.isArray(t) ? t[0] : t;\n if (i !== void 0 && !ne._CheckLimit(r, i))\n return;\n const s = ne._FormatMessage(r), a = this._Levels[e], o = Array.isArray(t) ? t.slice(1) : [];\n a.logFunc && a.logFunc(\"BJS - \" + s, ...o);\n const l = `
${s}

`;\n ne._AddLogEntry(l), ne._GenerateLimitMessage(r, e);\n }\n /**\n * Gets current log cache (list of logs)\n */\n static get LogCache() {\n return ne._LogCache;\n }\n /**\n * Clears the log cache\n */\n static ClearLogCache() {\n ne._LogCache = \"\", ne._LogLimitOutputs = {}, ne.errorsCount = 0;\n }\n /**\n * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel)\n */\n static set LogLevels(e) {\n ne.Log = ne._LogDisabled, ne.Warn = ne._LogDisabled, ne.Error = ne._LogDisabled, [ne.MessageLogLevel, ne.WarningLogLevel, ne.ErrorLogLevel].forEach((t) => {\n if ((e & t) === t) {\n const i = this._Levels[t];\n ne[i.name] = ne._LogEnabled.bind(ne, t);\n }\n });\n }\n}\nne.NoneLogLevel = 0;\nne.MessageLogLevel = 1;\nne.WarningLogLevel = 2;\nne.ErrorLogLevel = 4;\nne.AllLogLevel = 7;\nne.MessageLimitReached = \"Too many %TYPE%s (%LIMIT%), no more %TYPE%s will be reported for this message.\";\nne._LogCache = \"\";\nne._LogLimitOutputs = {};\nne._Levels = [\n {},\n { color: \"white\", logFunc: console.log, name: \"Log\" },\n { color: \"orange\", logFunc: console.warn, name: \"Warn\" },\n {},\n { color: \"red\", logFunc: console.error, name: \"Error\" }\n];\nne.errorsCount = 0;\nne.Log = ne._LogEnabled.bind(ne, ne.MessageLogLevel);\nne.Warn = ne._LogEnabled.bind(ne, ne.WarningLogLevel);\nne.Error = ne._LogEnabled.bind(ne, ne.ErrorLogLevel);\nconst Kp = (n, e, t) => !n || n.getClassName && n.getClassName() === \"Mesh\" ? null : n.getClassName && (n.getClassName() === \"SubMesh\" || n.getClassName() === \"PhysicsBody\") ? n.clone(e) : n.clone ? n.clone() : Array.isArray(n) ? n.slice() : t && typeof n == \"object\" ? { ...n } : null;\nfunction YS(n) {\n const e = [];\n do\n Object.getOwnPropertyNames(n).forEach(function(t) {\n e.indexOf(t) === -1 && e.push(t);\n });\n while (n = Object.getPrototypeOf(n));\n return e;\n}\nclass Dn {\n /**\n * Tries to copy an object by duplicating every property\n * @param source defines the source object\n * @param destination defines the target object\n * @param doNotCopyList defines a list of properties to avoid\n * @param mustCopyList defines a list of properties to copy (even if they start with _)\n * @param shallowCopyValues defines wether properties referencing objects (none cloneable) must be shallow copied (false by default)\n * @remarks shallowCopyValues will not instantite the copied values which makes it only usable for \"JSON objects\"\n */\n static DeepCopy(e, t, i, r, s = !1) {\n const a = YS(e);\n for (const o of a) {\n if (o[0] === \"_\" && (!r || r.indexOf(o) === -1) || o.endsWith(\"Observable\") || i && i.indexOf(o) !== -1)\n continue;\n const l = e[o], c = typeof l;\n if (c !== \"function\")\n try {\n if (c === \"object\")\n if (l instanceof Uint8Array)\n t[o] = Uint8Array.from(l);\n else if (l instanceof Array) {\n if (t[o] = [], l.length > 0)\n if (typeof l[0] == \"object\")\n for (let h = 0; h < l.length; h++) {\n const u = Kp(l[h], t, s);\n t[o].indexOf(u) === -1 && t[o].push(u);\n }\n else\n t[o] = l.slice(0);\n } else\n t[o] = Kp(l, t, s);\n else\n t[o] = l;\n } catch (h) {\n ne.Warn(h.message);\n }\n }\n }\n}\nclass sr {\n /**\n * Gets either window.performance.now() if supported or Date.now() else\n */\n static get Now() {\n return yi() && window.performance && window.performance.now ? window.performance.now() : Date.now();\n }\n}\nconst qp = {};\nfunction We(n, e = !1) {\n if (!(e && qp[n]))\n return qp[n] = !0, `${n} needs to be imported before as it contains a side-effect required by your code.`;\n}\nfunction ZS() {\n return typeof _native < \"u\" && _native.XMLHttpRequest ? new _native.XMLHttpRequest() : new XMLHttpRequest();\n}\nclass mi {\n constructor() {\n this._xhr = ZS(), this._requestURL = \"\";\n }\n /**\n * This function can be called to check if there are request modifiers for network requests\n * @returns true if there are any custom requests available\n */\n static get IsCustomRequestAvailable() {\n return Object.keys(mi.CustomRequestHeaders).length > 0 || mi.CustomRequestModifiers.length > 0;\n }\n _injectCustomRequestHeaders() {\n if (!this._shouldSkipRequestModifications(this._requestURL))\n for (const e in mi.CustomRequestHeaders) {\n const t = mi.CustomRequestHeaders[e];\n t && this._xhr.setRequestHeader(e, t);\n }\n }\n _shouldSkipRequestModifications(e) {\n return mi.SkipRequestModificationForBabylonCDN && (e.includes(\"preview.babylonjs.com\") || e.includes(\"cdn.babylonjs.com\"));\n }\n /**\n * Gets or sets a function to be called when loading progress changes\n */\n get onprogress() {\n return this._xhr.onprogress;\n }\n set onprogress(e) {\n this._xhr.onprogress = e;\n }\n /**\n * Returns client's state\n */\n get readyState() {\n return this._xhr.readyState;\n }\n /**\n * Returns client's status\n */\n get status() {\n return this._xhr.status;\n }\n /**\n * Returns client's status as a text\n */\n get statusText() {\n return this._xhr.statusText;\n }\n /**\n * Returns client's response\n */\n get response() {\n return this._xhr.response;\n }\n /**\n * Returns client's response url\n */\n get responseURL() {\n return this._xhr.responseURL;\n }\n /**\n * Returns client's response as text\n */\n get responseText() {\n return this._xhr.responseText;\n }\n /**\n * Gets or sets the expected response type\n */\n get responseType() {\n return this._xhr.responseType;\n }\n set responseType(e) {\n this._xhr.responseType = e;\n }\n /**\n * Gets or sets the timeout value in milliseconds\n */\n get timeout() {\n return this._xhr.timeout;\n }\n set timeout(e) {\n this._xhr.timeout = e;\n }\n addEventListener(e, t, i) {\n this._xhr.addEventListener(e, t, i);\n }\n removeEventListener(e, t, i) {\n this._xhr.removeEventListener(e, t, i);\n }\n /**\n * Cancels any network activity\n */\n abort() {\n this._xhr.abort();\n }\n /**\n * Initiates the request. The optional argument provides the request body. The argument is ignored if request method is GET or HEAD\n * @param body defines an optional request body\n */\n send(e) {\n mi.CustomRequestHeaders && this._injectCustomRequestHeaders(), this._xhr.send(e);\n }\n /**\n * Sets the request method, request URL\n * @param method defines the method to use (GET, POST, etc..)\n * @param url defines the url to connect with\n */\n open(e, t) {\n for (const i of mi.CustomRequestModifiers) {\n if (this._shouldSkipRequestModifications(t))\n return;\n i(this._xhr, t);\n }\n t = t.replace(\"file:http:\", \"http:\"), t = t.replace(\"file:https:\", \"https:\"), this._requestURL = t, this._xhr.open(e, t, !0);\n }\n /**\n * Sets the value of a request header.\n * @param name The name of the header whose value is to be set\n * @param value The value to set as the body of the header\n */\n setRequestHeader(e, t) {\n this._xhr.setRequestHeader(e, t);\n }\n /**\n * Get the string containing the text of a particular header's value.\n * @param name The name of the header\n * @returns The string containing the text of the given header name\n */\n getResponseHeader(e) {\n return this._xhr.getResponseHeader(e);\n }\n}\nmi.CustomRequestHeaders = {};\nmi.CustomRequestModifiers = new Array();\nmi.SkipRequestModificationForBabylonCDN = !0;\nclass st {\n /**\n * Gets the latest created engine\n */\n static get LastCreatedEngine() {\n return this.Instances.length === 0 ? null : this.Instances[this.Instances.length - 1];\n }\n /**\n * Gets the latest created scene\n */\n static get LastCreatedScene() {\n return this._LastCreatedScene;\n }\n}\nst.Instances = [];\nst.OnEnginesDisposedObservable = new he();\nst._LastCreatedScene = null;\nst.UseFallbackTexture = !0;\nst.FallbackTexture = \"\";\nclass ao {\n}\nao.FilesToLoad = {};\nclass jS {\n /**\n * Function used to defines an exponential back off strategy\n * @param maxRetries defines the maximum number of retries (3 by default)\n * @param baseInterval defines the interval between retries\n * @returns the strategy function to use\n */\n static ExponentialBackoff(e = 3, t = 500) {\n return (i, r, s) => r.status !== 0 || s >= e || i.indexOf(\"file:\") !== -1 ? -1 : Math.pow(2, s) * t;\n }\n}\nclass ba extends Error {\n}\nba._setPrototypeOf = Object.setPrototypeOf || ((n, e) => (n.__proto__ = e, n));\nconst Pc = {\n // Mesh errors 0-999\n /** Invalid or empty mesh vertex positions. */\n MeshInvalidPositionsError: 0,\n // Texture errors 1000-1999\n /** Unsupported texture found. */\n UnsupportedTextureError: 1e3,\n // GLTFLoader errors 2000-2999\n /** Unexpected magic number found in GLTF file header. */\n GLTFLoaderUnexpectedMagicError: 2e3,\n // SceneLoader errors 3000-3999\n /** SceneLoader generic error code. Ideally wraps the inner exception. */\n SceneLoaderError: 3e3,\n // File related errors 4000-4999\n /** Load file error */\n LoadFileError: 4e3,\n /** Request file error */\n RequestFileError: 4001,\n /** Read file error */\n ReadFileError: 4002\n};\nclass Ba extends ba {\n /**\n * Creates a new RuntimeError\n * @param message defines the message of the error\n * @param errorCode the error code\n * @param innerError the error that caused the outer error\n */\n constructor(e, t, i) {\n super(e), this.errorCode = t, this.innerError = i, this.name = \"RuntimeError\", ba._setPrototypeOf(this, Ba.prototype);\n }\n}\nconst D_ = (n) => {\n const e = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n let t = \"\", i, r, s, a, o, l, c, h = 0;\n const u = ArrayBuffer.isView(n) ? new Uint8Array(n.buffer, n.byteOffset, n.byteLength) : new Uint8Array(n);\n for (; h < u.length; )\n i = u[h++], r = h < u.length ? u[h++] : Number.NaN, s = h < u.length ? u[h++] : Number.NaN, a = i >> 2, o = (i & 3) << 4 | r >> 4, l = (r & 15) << 2 | s >> 6, c = s & 63, isNaN(r) ? l = c = 64 : isNaN(s) && (c = 64), t += e.charAt(a) + e.charAt(o) + e.charAt(l) + e.charAt(c);\n return t;\n}, N_ = (n) => atob(n), QS = (n) => {\n const e = N_(n), t = e.length, i = new Uint8Array(new ArrayBuffer(t));\n for (let r = 0; r < t; r++)\n i[r] = e.charCodeAt(r);\n return i.buffer;\n}, JS = \"attribute\", $S = \"varying\";\nclass oo {\n constructor() {\n this.children = [];\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isValid(e) {\n return !0;\n }\n process(e, t) {\n var r, s, a, o, l, c;\n let i = \"\";\n if (this.line) {\n let h = this.line;\n const u = t.processor;\n if (u) {\n u.lineProcessor && (h = u.lineProcessor(h, t.isFragment, t.processingContext));\n const f = ((r = t.processor) == null ? void 0 : r.attributeKeywordName) ?? JS, d = t.isFragment && ((s = t.processor) != null && s.varyingFragmentKeywordName) ? (a = t.processor) == null ? void 0 : a.varyingFragmentKeywordName : !t.isFragment && ((o = t.processor) != null && o.varyingVertexKeywordName) ? (l = t.processor) == null ? void 0 : l.varyingVertexKeywordName : $S;\n !t.isFragment && u.attributeProcessor && this.line.startsWith(f) ? h = u.attributeProcessor(this.line, e, t.processingContext) : u.varyingProcessor && ((c = u.varyingCheck) != null && c.call(u, this.line, t.isFragment) || !u.varyingCheck && this.line.startsWith(d)) ? h = u.varyingProcessor(this.line, t.isFragment, e, t.processingContext) : u.uniformProcessor && u.uniformRegexp && u.uniformRegexp.test(this.line) ? t.lookForClosingBracketForUniformBuffer || (h = u.uniformProcessor(this.line, t.isFragment, e, t.processingContext)) : u.uniformBufferProcessor && u.uniformBufferRegexp && u.uniformBufferRegexp.test(this.line) ? t.lookForClosingBracketForUniformBuffer || (h = u.uniformBufferProcessor(this.line, t.isFragment, t.processingContext), t.lookForClosingBracketForUniformBuffer = !0) : u.textureProcessor && u.textureRegexp && u.textureRegexp.test(this.line) ? h = u.textureProcessor(this.line, t.isFragment, e, t.processingContext) : (u.uniformProcessor || u.uniformBufferProcessor) && this.line.startsWith(\"uniform\") && !t.lookForClosingBracketForUniformBuffer && (/uniform\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/.test(this.line) ? u.uniformProcessor && (h = u.uniformProcessor(this.line, t.isFragment, e, t.processingContext)) : u.uniformBufferProcessor && (h = u.uniformBufferProcessor(this.line, t.isFragment, t.processingContext), t.lookForClosingBracketForUniformBuffer = !0)), t.lookForClosingBracketForUniformBuffer && this.line.indexOf(\"}\") !== -1 && (t.lookForClosingBracketForUniformBuffer = !1, u.endOfUniformBufferProcessor && (h = u.endOfUniformBufferProcessor(this.line, t.isFragment, t.processingContext)));\n }\n i += h + `\n`;\n }\n return this.children.forEach((h) => {\n i += h.process(e, t);\n }), this.additionalDefineKey && (e[this.additionalDefineKey] = this.additionalDefineValue || \"true\"), i;\n }\n}\nclass ey {\n constructor() {\n this._lines = [];\n }\n get currentLine() {\n return this._lines[this.lineIndex];\n }\n get canRead() {\n return this.lineIndex < this._lines.length - 1;\n }\n set lines(e) {\n this._lines.length = 0;\n for (const t of e) {\n if (!t || t === \"\\r\")\n continue;\n if (t[0] === \"#\") {\n this._lines.push(t);\n continue;\n }\n const i = t.trim();\n if (!i)\n continue;\n if (i.startsWith(\"//\")) {\n this._lines.push(t);\n continue;\n }\n const r = i.indexOf(\";\");\n if (r === -1)\n this._lines.push(i);\n else if (r === i.length - 1)\n i.length > 1 && this._lines.push(i);\n else {\n const s = t.split(\";\");\n for (let a = 0; a < s.length; a++) {\n let o = s[a];\n o && (o = o.trim(), o && this._lines.push(o + (a !== s.length - 1 ? \";\" : \"\")));\n }\n }\n }\n }\n}\nclass Uh extends oo {\n process(e, t) {\n for (let i = 0; i < this.children.length; i++) {\n const r = this.children[i];\n if (r.isValid(e))\n return r.process(e, t);\n }\n return \"\";\n }\n}\nclass ty extends oo {\n isValid(e) {\n return this.testExpression.isTrue(e);\n }\n}\nclass Yt {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isTrue(e) {\n return !0;\n }\n static postfixToInfix(e) {\n const t = [];\n for (const i of e)\n if (Yt._OperatorPriority[i] === void 0)\n t.push(i);\n else {\n const r = t[t.length - 1], s = t[t.length - 2];\n t.length -= 2, t.push(`(${s}${i}${r})`);\n }\n return t[t.length - 1];\n }\n /**\n * Converts an infix expression to a postfix expression.\n *\n * This method is used to transform infix expressions, which are more human-readable,\n * into postfix expressions, also known as Reverse Polish Notation (RPN), that can be\n * evaluated more efficiently by a computer. The conversion is based on the operator\n * priority defined in _OperatorPriority.\n *\n * The function employs a stack-based algorithm for the conversion and caches the result\n * to improve performance. The cache keeps track of each converted expression's access time\n * to manage the cache size and optimize memory usage. When the cache size exceeds a specified\n * limit, the least recently accessed items in the cache are deleted.\n *\n * The cache mechanism is particularly helpful for shader compilation, where the same infix\n * expressions might be encountered repeatedly, hence the caching can speed up the process.\n *\n * @param infix - The infix expression to be converted.\n * @returns The postfix expression as an array of strings.\n */\n static infixToPostfix(e) {\n const t = Yt._InfixToPostfixCache.get(e);\n if (t)\n return t.accessTime = Date.now(), t.result;\n if (!e.includes(\"&&\") && !e.includes(\"||\") && !e.includes(\")\") && !e.includes(\"(\"))\n return [e];\n const i = [];\n let r = -1;\n const s = () => {\n h = h.trim(), h !== \"\" && (i.push(h), h = \"\");\n }, a = (u) => {\n r < Yt._Stack.length - 1 && (Yt._Stack[++r] = u);\n }, o = () => Yt._Stack[r], l = () => r === -1 ? \"!!INVALID EXPRESSION!!\" : Yt._Stack[r--];\n let c = 0, h = \"\";\n for (; c < e.length; ) {\n const u = e.charAt(c), f = c < e.length - 1 ? e.substr(c, 2) : \"\";\n if (u === \"(\")\n h = \"\", a(u);\n else if (u === \")\") {\n for (s(); r !== -1 && o() !== \"(\"; )\n i.push(l());\n l();\n } else if (Yt._OperatorPriority[f] > 1) {\n for (s(); r !== -1 && Yt._OperatorPriority[o()] >= Yt._OperatorPriority[f]; )\n i.push(l());\n a(f), c++;\n } else\n h += u;\n c++;\n }\n for (s(); r !== -1; )\n o() === \"(\" ? l() : i.push(l());\n return Yt._InfixToPostfixCache.size >= Yt.InfixToPostfixCacheLimitSize && Yt.ClearCache(), Yt._InfixToPostfixCache.set(e, { result: i, accessTime: Date.now() }), i;\n }\n static ClearCache() {\n const e = Array.from(Yt._InfixToPostfixCache.entries()).sort((t, i) => t[1].accessTime - i[1].accessTime);\n for (let t = 0; t < Yt.InfixToPostfixCacheCleanupSize; t++)\n Yt._InfixToPostfixCache.delete(e[t][0]);\n }\n}\nYt.InfixToPostfixCacheLimitSize = 5e4;\nYt.InfixToPostfixCacheCleanupSize = 25e3;\nYt._InfixToPostfixCache = /* @__PURE__ */ new Map();\nYt._OperatorPriority = {\n \")\": 0,\n \"(\": 1,\n \"||\": 2,\n \"&&\": 3\n};\nYt._Stack = [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\nclass pl extends Yt {\n constructor(e, t = !1) {\n super(), this.define = e, this.not = t;\n }\n isTrue(e) {\n let t = e[this.define] !== void 0;\n return this.not && (t = !t), t;\n }\n}\nclass iy extends Yt {\n isTrue(e) {\n return this.leftOperand.isTrue(e) || this.rightOperand.isTrue(e);\n }\n}\nclass ry extends Yt {\n isTrue(e) {\n return this.leftOperand.isTrue(e) && this.rightOperand.isTrue(e);\n }\n}\nclass sy extends Yt {\n constructor(e, t, i) {\n super(), this.define = e, this.operand = t, this.testValue = i;\n }\n isTrue(e) {\n let t = e[this.define];\n t === void 0 && (t = this.define);\n let i = !1;\n const r = parseInt(t), s = parseInt(this.testValue);\n switch (this.operand) {\n case \">\":\n i = r > s;\n break;\n case \"<\":\n i = r < s;\n break;\n case \"<=\":\n i = r <= s;\n break;\n case \">=\":\n i = r >= s;\n break;\n case \"==\":\n i = r === s;\n break;\n case \"!=\":\n i = r !== s;\n break;\n }\n return i;\n }\n}\nvar _i;\n(function(n) {\n n[n.GLSL = 0] = \"GLSL\", n[n.WGSL = 1] = \"WGSL\";\n})(_i || (_i = {}));\nconst ny = /defined\\s*?\\((.+?)\\)/g, Vh = /defined\\s*?\\[(.+?)\\]/g, ay = /#include\\s?<(.+)>(\\((.*)\\))*(\\[(.*)\\])*/g, oy = /__decl__/, Yp = /light\\{X\\}.(\\w*)/g, Zp = /\\{X\\}/g, gl = [];\nclass hs {\n static Initialize(e) {\n e.processor && e.processor.initializeShaders && e.processor.initializeShaders(e.processingContext);\n }\n static Process(e, t, i, r) {\n var s;\n (s = t.processor) != null && s.preProcessShaderCode && (e = t.processor.preProcessShaderCode(e, t.isFragment)), this._ProcessIncludes(e, t, (a) => {\n t.processCodeAfterIncludes && (a = t.processCodeAfterIncludes(t.isFragment ? \"fragment\" : \"vertex\", a));\n const o = this._ProcessShaderConversion(a, t, r);\n i(o, a);\n });\n }\n static PreProcess(e, t, i, r) {\n var s;\n (s = t.processor) != null && s.preProcessShaderCode && (e = t.processor.preProcessShaderCode(e, t.isFragment)), this._ProcessIncludes(e, t, (a) => {\n t.processCodeAfterIncludes && (a = t.processCodeAfterIncludes(t.isFragment ? \"fragment\" : \"vertex\", a));\n const o = this._ApplyPreProcessing(a, t, r);\n i(o, a);\n });\n }\n static Finalize(e, t, i) {\n return !i.processor || !i.processor.finalizeShaders ? { vertexCode: e, fragmentCode: t } : i.processor.finalizeShaders(e, t, i.processingContext);\n }\n static _ProcessPrecision(e, t) {\n var r;\n if ((r = t.processor) != null && r.noPrecision)\n return e;\n const i = t.shouldUseHighPrecisionShader;\n return e.indexOf(\"precision highp float\") === -1 ? i ? e = `precision highp float;\n` + e : e = `precision mediump float;\n` + e : i || (e = e.replace(\"precision highp float\", \"precision mediump float\")), e;\n }\n static _ExtractOperation(e) {\n const i = /defined\\((.+)\\)/.exec(e);\n if (i && i.length)\n return new pl(i[1].trim(), e[0] === \"!\");\n const r = [\"==\", \"!=\", \">=\", \"<=\", \"<\", \">\"];\n let s = \"\", a = 0;\n for (s of r)\n if (a = e.indexOf(s), a > -1)\n break;\n if (a === -1)\n return new pl(e);\n const o = e.substring(0, a).trim(), l = e.substring(a + s.length).trim();\n return new sy(o, s, l);\n }\n static _BuildSubExpression(e) {\n e = e.replace(ny, \"defined[$1]\");\n const t = Yt.infixToPostfix(e), i = [];\n for (const s of t)\n if (s !== \"||\" && s !== \"&&\")\n i.push(s);\n else if (i.length >= 2) {\n let a = i[i.length - 1], o = i[i.length - 2];\n i.length -= 2;\n const l = s == \"&&\" ? new ry() : new iy();\n typeof a == \"string\" && (a = a.replace(Vh, \"defined($1)\")), typeof o == \"string\" && (o = o.replace(Vh, \"defined($1)\")), l.leftOperand = typeof o == \"string\" ? this._ExtractOperation(o) : o, l.rightOperand = typeof a == \"string\" ? this._ExtractOperation(a) : a, i.push(l);\n }\n let r = i[i.length - 1];\n return typeof r == \"string\" && (r = r.replace(Vh, \"defined($1)\")), typeof r == \"string\" ? this._ExtractOperation(r) : r;\n }\n static _BuildExpression(e, t) {\n const i = new ty(), r = e.substring(0, t);\n let s = e.substring(t);\n return s = s.substring(0, (s.indexOf(\"//\") + 1 || s.length + 1) - 1).trim(), r === \"#ifdef\" ? i.testExpression = new pl(s) : r === \"#ifndef\" ? i.testExpression = new pl(s, !0) : i.testExpression = this._BuildSubExpression(s), i;\n }\n static _MoveCursorWithinIf(e, t, i) {\n let r = e.currentLine;\n for (; this._MoveCursor(e, i); ) {\n r = e.currentLine;\n const s = r.substring(0, 5).toLowerCase();\n if (s === \"#else\") {\n const a = new oo();\n t.children.push(a), this._MoveCursor(e, a);\n return;\n } else if (s === \"#elif\") {\n const a = this._BuildExpression(r, 5);\n t.children.push(a), i = a;\n }\n }\n }\n static _MoveCursor(e, t) {\n for (; e.canRead; ) {\n e.lineIndex++;\n const i = e.currentLine;\n if (i.indexOf(\"#\") >= 0) {\n const s = hs._MoveCursorRegex.exec(i);\n if (s && s.length) {\n switch (s[0]) {\n case \"#ifdef\": {\n const o = new Uh();\n t.children.push(o);\n const l = this._BuildExpression(i, 6);\n o.children.push(l), this._MoveCursorWithinIf(e, o, l);\n break;\n }\n case \"#else\":\n case \"#elif\":\n return !0;\n case \"#endif\":\n return !1;\n case \"#ifndef\": {\n const o = new Uh();\n t.children.push(o);\n const l = this._BuildExpression(i, 7);\n o.children.push(l), this._MoveCursorWithinIf(e, o, l);\n break;\n }\n case \"#if\": {\n const o = new Uh(), l = this._BuildExpression(i, 3);\n t.children.push(o), o.children.push(l), this._MoveCursorWithinIf(e, o, l);\n break;\n }\n }\n continue;\n }\n }\n const r = new oo();\n if (r.line = i, t.children.push(r), i[0] === \"#\" && i[1] === \"d\") {\n const s = i.replace(\";\", \"\").split(\" \");\n r.additionalDefineKey = s[1], s.length === 3 && (r.additionalDefineValue = s[2]);\n }\n }\n return !1;\n }\n static _EvaluatePreProcessors(e, t, i) {\n const r = new oo(), s = new ey();\n return s.lineIndex = -1, s.lines = e.split(`\n`), this._MoveCursor(s, r), r.process(t, i);\n }\n static _PreparePreProcessors(e, t) {\n var s;\n const i = e.defines, r = {};\n for (const a of i) {\n const l = a.replace(\"#define\", \"\").replace(\";\", \"\").trim().split(\" \");\n r[l[0]] = l.length > 1 ? l[1] : \"\";\n }\n return ((s = e.processor) == null ? void 0 : s.shaderLanguage) === _i.GLSL && (r.GL_ES = \"true\"), r.__VERSION__ = e.version, r[e.platformName] = \"true\", t._getGlobalDefines(r), r;\n }\n static _ProcessShaderConversion(e, t, i) {\n let r = this._ProcessPrecision(e, t);\n if (!t.processor || t.processor.shaderLanguage === _i.GLSL && r.indexOf(\"#version 3\") !== -1 && (r = r.replace(\"#version 300 es\", \"\"), !t.processor.parseGLES3))\n return r;\n const s = t.defines, a = this._PreparePreProcessors(t, i);\n return t.processor.preProcessor && (r = t.processor.preProcessor(r, s, t.isFragment, t.processingContext)), r = this._EvaluatePreProcessors(r, a, t), t.processor.postProcessor && (r = t.processor.postProcessor(r, s, t.isFragment, t.processingContext, i)), i._features.needShaderCodeInlining && (r = i.inlineShaderCode(r)), r;\n }\n static _ApplyPreProcessing(e, t, i) {\n var o, l;\n let r = e;\n const s = t.defines, a = this._PreparePreProcessors(t, i);\n return (o = t.processor) != null && o.preProcessor && (r = t.processor.preProcessor(r, s, t.isFragment, t.processingContext)), r = this._EvaluatePreProcessors(r, a, t), (l = t.processor) != null && l.postProcessor && (r = t.processor.postProcessor(r, s, t.isFragment, t.processingContext, i)), i._features.needShaderCodeInlining && (r = i.inlineShaderCode(r)), r;\n }\n /** @internal */\n static _ProcessIncludes(e, t, i) {\n gl.length = 0;\n let r;\n for (; (r = ay.exec(e)) !== null; )\n gl.push(r);\n let s = String(e), a = [e], o = !1;\n for (const l of gl) {\n let c = l[1];\n if (c.indexOf(\"__decl__\") !== -1 && (c = c.replace(oy, \"\"), t.supportsUniformBuffers && (c = c.replace(\"Vertex\", \"Ubo\").replace(\"Fragment\", \"Ubo\")), c = c + \"Declaration\"), t.includesShadersStore[c]) {\n let h = t.includesShadersStore[c];\n if (l[2]) {\n const f = l[3].split(\",\");\n for (let d = 0; d < f.length; d += 2) {\n const p = new RegExp(f[d], \"g\"), g = f[d + 1];\n h = h.replace(p, g);\n }\n }\n if (l[4]) {\n const f = l[5];\n if (f.indexOf(\"..\") !== -1) {\n const d = f.split(\"..\"), p = parseInt(d[0]);\n let g = parseInt(d[1]), m = h.slice(0);\n h = \"\", isNaN(g) && (g = t.indexParameters[d[1]]);\n for (let v = p; v < g; v++)\n t.supportsUniformBuffers || (m = m.replace(Yp, (E, C) => C + \"{X}\")), h += m.replace(Zp, v.toString()) + `\n`;\n } else\n t.supportsUniformBuffers || (h = h.replace(Yp, (d, p) => p + \"{X}\")), h = h.replace(Zp, f);\n }\n const u = [];\n for (const f of a) {\n const d = f.split(l[0]);\n for (let p = 0; p < d.length - 1; p++)\n u.push(d[p]), u.push(h);\n u.push(d[d.length - 1]);\n }\n a = u, o = o || h.indexOf(\"#include<\") >= 0 || h.indexOf(\"#include <\") >= 0;\n } else {\n const h = t.shadersRepository + \"ShadersInclude/\" + c + \".fx\";\n hs._FileToolsLoadFile(h, (u) => {\n t.includesShadersStore[c] = u, this._ProcessIncludes(a.join(\"\"), t, i);\n });\n return;\n }\n }\n gl.length = 0, s = a.join(\"\"), o ? this._ProcessIncludes(s.toString(), t, i) : i(s);\n }\n /**\n * Loads a file from a url\n * @param url url to load\n * @param onSuccess callback called when the file successfully loads\n * @param onProgress callback called while file is loading (if the server supports this mode)\n * @param offlineProvider defines the offline provider for caching\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\n * @param onError callback called when the file fails to load\n * @returns a file request object\n * @internal\n */\n static _FileToolsLoadFile(e, t, i, r, s, a) {\n throw We(\"FileTools\");\n }\n}\nhs._MoveCursorRegex = /(#ifdef)|(#else)|(#elif)|(#endif)|(#ifndef)|(#if)/;\nclass Y {\n /**\n * Gets the shaders repository path for a given shader language\n * @param shaderLanguage the shader language\n * @returns the path to the shaders repository\n */\n static GetShadersRepository(e = _i.GLSL) {\n return e === _i.GLSL ? Y.ShadersRepository : Y.ShadersRepositoryWGSL;\n }\n /**\n * Gets the shaders store of a given shader language\n * @param shaderLanguage the shader language\n * @returns the shaders store\n */\n static GetShadersStore(e = _i.GLSL) {\n return e === _i.GLSL ? Y.ShadersStore : Y.ShadersStoreWGSL;\n }\n /**\n * Gets the include shaders store of a given shader language\n * @param shaderLanguage the shader language\n * @returns the include shaders store\n */\n static GetIncludesShadersStore(e = _i.GLSL) {\n return e === _i.GLSL ? Y.IncludesShadersStore : Y.IncludesShadersStoreWGSL;\n }\n}\nY.ShadersRepository = \"src/Shaders/\";\nY.ShadersStore = {};\nY.IncludesShadersStore = {};\nY.ShadersRepositoryWGSL = \"src/ShadersWGSL/\";\nY.ShadersStoreWGSL = {};\nY.IncludesShadersStoreWGSL = {};\nclass Hi {\n /**\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\n */\n static get ShadersRepository() {\n return Y.ShadersRepository;\n }\n static set ShadersRepository(e) {\n Y.ShadersRepository = e;\n }\n /**\n * Observable that will be called when effect is bound.\n */\n get onBindObservable() {\n return this._onBindObservable || (this._onBindObservable = new he()), this._onBindObservable;\n }\n /**\n * Gets the shader language type used to write vertex and fragment source code.\n */\n get shaderLanguage() {\n return this._shaderLanguage;\n }\n /**\n * Instantiates an effect.\n * An effect can be used to create/manage/execute vertex and fragment shaders.\n * @param baseName Name of the effect.\n * @param attributesNamesOrOptions List of attribute names that will be passed to the shader or set of all options to create the effect.\n * @param uniformsNamesOrEngine List of uniform variable names that will be passed to the shader or the engine that will be used to render effect.\n * @param samplers List of sampler variables that will be passed to the shader.\n * @param engine Engine to be used to render the effect\n * @param defines Define statements to be added to the shader.\n * @param fallbacks Possible fallbacks for this effect to improve performance when needed.\n * @param onCompiled Callback that will be called when the shader is compiled.\n * @param onError Callback that will be called if an error occurs during shader compilation.\n * @param indexParameters Parameters to be used with Babylons include syntax to iterate over an array (eg. \\{lights: 10\\})\n * @param key Effect Key identifying uniquely compiled shader variants\n * @param shaderLanguage the language the shader is written in (default: GLSL)\n */\n constructor(e, t, i, r = null, s, a = null, o = null, l = null, c = null, h, u = \"\", f = _i.GLSL) {\n if (this.defines = \"\", this.onCompiled = null, this.onError = null, this.onBind = null, this.uniqueId = 0, this.onCompileObservable = new he(), this.onErrorObservable = new he(), this._onBindObservable = null, this._isDisposed = !1, this._bonesComputationForcedToCPU = !1, this._uniformBuffersNames = {}, this._multiTarget = !1, this._samplers = {}, this._isReady = !1, this._compilationError = \"\", this._allFallbacksProcessed = !1, this._uniforms = {}, this._key = \"\", this._fallbacks = null, this._vertexSourceCodeOverride = \"\", this._fragmentSourceCodeOverride = \"\", this._transformFeedbackVaryings = null, this._pipelineContext = null, this._vertexSourceCode = \"\", this._fragmentSourceCode = \"\", this._vertexSourceCodeBeforeMigration = \"\", this._fragmentSourceCodeBeforeMigration = \"\", this._rawVertexSourceCode = \"\", this._rawFragmentSourceCode = \"\", this._processCodeAfterIncludes = void 0, this._processFinalCode = null, this.name = e, this._key = u, t.attributes) {\n const d = t;\n if (this._engine = i, this._attributesNames = d.attributes, this._uniformsNames = d.uniformsNames.concat(d.samplers), this._samplerList = d.samplers.slice(), this.defines = d.defines, this.onError = d.onError, this.onCompiled = d.onCompiled, this._fallbacks = d.fallbacks, this._indexParameters = d.indexParameters, this._transformFeedbackVaryings = d.transformFeedbackVaryings || null, this._multiTarget = !!d.multiTarget, this._shaderLanguage = d.shaderLanguage ?? _i.GLSL, d.uniformBuffersNames) {\n this._uniformBuffersNamesList = d.uniformBuffersNames.slice();\n for (let p = 0; p < d.uniformBuffersNames.length; p++)\n this._uniformBuffersNames[d.uniformBuffersNames[p]] = p;\n }\n this._processFinalCode = d.processFinalCode ?? null, this._processCodeAfterIncludes = d.processCodeAfterIncludes ?? void 0;\n } else\n this._engine = s, this.defines = a ?? \"\", this._uniformsNames = i.concat(r), this._samplerList = r ? r.slice() : [], this._attributesNames = t, this._uniformBuffersNamesList = [], this._shaderLanguage = f, this.onError = c, this.onCompiled = l, this._indexParameters = h, this._fallbacks = o;\n this._attributeLocationByName = {}, this.uniqueId = Hi._UniqueIdSeed++, this._processShaderCode();\n }\n /** @internal */\n _processShaderCode(e = null, t = !1) {\n let i, r;\n const s = this.name, a = yi() ? this._engine.getHostDocument() : null;\n typeof s == \"string\" ? i = s : s.vertexSource ? i = \"source:\" + s.vertexSource : s.vertexElement ? i = (a == null ? void 0 : a.getElementById(s.vertexElement)) || s.vertexElement : i = s.vertex || s, typeof s == \"string\" ? r = s : s.fragmentSource ? r = \"source:\" + s.fragmentSource : s.fragmentElement ? r = (a == null ? void 0 : a.getElementById(s.fragmentElement)) || s.fragmentElement : r = s.fragment || s, this._processingContext = this._engine._getShaderProcessingContext(this._shaderLanguage);\n let o = {\n defines: this.defines.split(`\n`),\n indexParameters: this._indexParameters,\n isFragment: !1,\n shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader,\n processor: e ?? this._engine._getShaderProcessor(this._shaderLanguage),\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\n shadersRepository: Y.GetShadersRepository(this._shaderLanguage),\n includesShadersStore: Y.GetIncludesShadersStore(this._shaderLanguage),\n version: (this._engine.version * 100).toString(),\n platformName: this._engine.shaderPlatformName,\n processingContext: this._processingContext,\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\n processCodeAfterIncludes: this._processCodeAfterIncludes\n };\n const l = [void 0, void 0], c = () => {\n if (l[0] && l[1]) {\n o.isFragment = !0;\n const [h, u] = l;\n hs.Process(u, o, (f, d) => {\n this._fragmentSourceCodeBeforeMigration = d, this._processFinalCode && (f = this._processFinalCode(\"fragment\", f));\n const p = hs.Finalize(h, f, o);\n o = null, this._useFinalCode(p.vertexCode, p.fragmentCode, s, t);\n }, this._engine);\n }\n };\n this._loadShader(i, \"Vertex\", \"\", (h) => {\n hs.Initialize(o), hs.Process(h, o, (u, f) => {\n this._rawVertexSourceCode = h, this._vertexSourceCodeBeforeMigration = f, this._processFinalCode && (u = this._processFinalCode(\"vertex\", u)), l[0] = u, c();\n }, this._engine);\n }), this._loadShader(r, \"Fragment\", \"Pixel\", (h) => {\n this._rawFragmentSourceCode = h, l[1] = h, c();\n });\n }\n _useFinalCode(e, t, i, r = !1) {\n if (i) {\n const s = i.vertexElement || i.vertex || i.spectorName || i, a = i.fragmentElement || i.fragment || i.spectorName || i;\n this._vertexSourceCode = (this._shaderLanguage === _i.WGSL ? \"//\" : \"\") + \"#define SHADER_NAME vertex:\" + s + `\n` + e, this._fragmentSourceCode = (this._shaderLanguage === _i.WGSL ? \"//\" : \"\") + \"#define SHADER_NAME fragment:\" + a + `\n` + t;\n } else\n this._vertexSourceCode = e, this._fragmentSourceCode = t;\n this._prepareEffect(r);\n }\n /**\n * Unique key for this effect\n */\n get key() {\n return this._key;\n }\n /**\n * If the effect has been compiled and prepared.\n * @returns if the effect is compiled and prepared.\n */\n isReady() {\n try {\n return this._isReadyInternal();\n } catch {\n return !1;\n }\n }\n _isReadyInternal() {\n return this._isReady ? !0 : this._pipelineContext ? this._pipelineContext.isReady : !1;\n }\n /**\n * The engine the effect was initialized with.\n * @returns the engine.\n */\n getEngine() {\n return this._engine;\n }\n /**\n * The pipeline context for this effect\n * @returns the associated pipeline context\n */\n getPipelineContext() {\n return this._pipelineContext;\n }\n /**\n * The set of names of attribute variables for the shader.\n * @returns An array of attribute names.\n */\n getAttributesNames() {\n return this._attributesNames;\n }\n /**\n * Returns the attribute at the given index.\n * @param index The index of the attribute.\n * @returns The location of the attribute.\n */\n getAttributeLocation(e) {\n return this._attributes[e];\n }\n /**\n * Returns the attribute based on the name of the variable.\n * @param name of the attribute to look up.\n * @returns the attribute location.\n */\n getAttributeLocationByName(e) {\n return this._attributeLocationByName[e];\n }\n /**\n * The number of attributes.\n * @returns the number of attributes.\n */\n getAttributesCount() {\n return this._attributes.length;\n }\n /**\n * Gets the index of a uniform variable.\n * @param uniformName of the uniform to look up.\n * @returns the index.\n */\n getUniformIndex(e) {\n return this._uniformsNames.indexOf(e);\n }\n /**\n * Returns the attribute based on the name of the variable.\n * @param uniformName of the uniform to look up.\n * @returns the location of the uniform.\n */\n getUniform(e) {\n return this._uniforms[e];\n }\n /**\n * Returns an array of sampler variable names\n * @returns The array of sampler variable names.\n */\n getSamplers() {\n return this._samplerList;\n }\n /**\n * Returns an array of uniform variable names\n * @returns The array of uniform variable names.\n */\n getUniformNames() {\n return this._uniformsNames;\n }\n /**\n * Returns an array of uniform buffer variable names\n * @returns The array of uniform buffer variable names.\n */\n getUniformBuffersNames() {\n return this._uniformBuffersNamesList;\n }\n /**\n * Returns the index parameters used to create the effect\n * @returns The index parameters object\n */\n getIndexParameters() {\n return this._indexParameters;\n }\n /**\n * The error from the last compilation.\n * @returns the error string.\n */\n getCompilationError() {\n return this._compilationError;\n }\n /**\n * Gets a boolean indicating that all fallbacks were used during compilation\n * @returns true if all fallbacks were used\n */\n allFallbacksProcessed() {\n return this._allFallbacksProcessed;\n }\n /**\n * Adds a callback to the onCompiled observable and call the callback immediately if already ready.\n * @param func The callback to be used.\n */\n executeWhenCompiled(e) {\n if (this.isReady()) {\n e(this);\n return;\n }\n this.onCompileObservable.add((t) => {\n e(t);\n }), (!this._pipelineContext || this._pipelineContext.isAsync) && setTimeout(() => {\n this._checkIsReady(null);\n }, 16);\n }\n _checkIsReady(e) {\n try {\n if (this._isReadyInternal())\n return;\n } catch (t) {\n this._processCompilationErrors(t, e);\n return;\n }\n this._isDisposed || setTimeout(() => {\n this._checkIsReady(e);\n }, 16);\n }\n _loadShader(e, t, i, r) {\n if (typeof HTMLElement < \"u\" && e instanceof HTMLElement) {\n const o = O_(e);\n r(o);\n return;\n }\n if (e.substr(0, 7) === \"source:\") {\n r(e.substr(7));\n return;\n }\n if (e.substr(0, 7) === \"base64:\") {\n const o = window.atob(e.substr(7));\n r(o);\n return;\n }\n const s = Y.GetShadersStore(this._shaderLanguage);\n if (s[e + t + \"Shader\"]) {\n r(s[e + t + \"Shader\"]);\n return;\n }\n if (i && s[e + i + \"Shader\"]) {\n r(s[e + i + \"Shader\"]);\n return;\n }\n let a;\n e[0] === \".\" || e[0] === \"/\" || e.indexOf(\"http\") > -1 ? a = e : a = Y.GetShadersRepository(this._shaderLanguage) + e, this._engine._loadFile(a + \".\" + t.toLowerCase() + \".fx\", r);\n }\n /**\n * Gets the vertex shader source code of this effect\n * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)\n */\n get vertexSourceCode() {\n var e;\n return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride ? this._vertexSourceCodeOverride : ((e = this._pipelineContext) == null ? void 0 : e._getVertexShaderCode()) ?? this._vertexSourceCode;\n }\n /**\n * Gets the fragment shader source code of this effect\n * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)\n */\n get fragmentSourceCode() {\n var e;\n return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride ? this._fragmentSourceCodeOverride : ((e = this._pipelineContext) == null ? void 0 : e._getFragmentShaderCode()) ?? this._fragmentSourceCode;\n }\n /**\n * Gets the vertex shader source code before migration.\n * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.\n * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).\n */\n get vertexSourceCodeBeforeMigration() {\n return this._vertexSourceCodeBeforeMigration;\n }\n /**\n * Gets the fragment shader source code before migration.\n * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.\n * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).\n */\n get fragmentSourceCodeBeforeMigration() {\n return this._fragmentSourceCodeBeforeMigration;\n }\n /**\n * Gets the vertex shader source code before it has been modified by any processing\n */\n get rawVertexSourceCode() {\n return this._rawVertexSourceCode;\n }\n /**\n * Gets the fragment shader source code before it has been modified by any processing\n */\n get rawFragmentSourceCode() {\n return this._rawFragmentSourceCode;\n }\n /**\n * Recompiles the webGL program\n * @param vertexSourceCode The source code for the vertex shader.\n * @param fragmentSourceCode The source code for the fragment shader.\n * @param onCompiled Callback called when completed.\n * @param onError Callback called on error.\n * @internal\n */\n _rebuildProgram(e, t, i, r) {\n this._isReady = !1, this._vertexSourceCodeOverride = e, this._fragmentSourceCodeOverride = t, this.onError = (s, a) => {\n r && r(a);\n }, this.onCompiled = () => {\n var a, o;\n const s = this.getEngine().scenes;\n if (s)\n for (let l = 0; l < s.length; l++)\n s[l].markAllMaterialsAsDirty(63);\n (o = (a = this._pipelineContext)._handlesSpectorRebuildCallback) == null || o.call(a, i);\n }, this._fallbacks = null, this._prepareEffect();\n }\n /**\n * Prepares the effect\n * @internal\n */\n _prepareEffect(e = !1) {\n const t = this._attributesNames, i = this.defines, r = this._pipelineContext;\n this._isReady = !1;\n try {\n const s = this._engine;\n this._pipelineContext = (e ? r : void 0) ?? s.createPipelineContext(this._processingContext), this._pipelineContext._name = this._key.replace(/\\r/g, \"\").replace(/\\n/g, \"|\");\n const a = (o, l, c, h) => this._rebuildProgram(o, l, c, h);\n this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride ? s._preparePipelineContext(this._pipelineContext, this._vertexSourceCodeOverride, this._fragmentSourceCodeOverride, !0, this._rawVertexSourceCode, this._rawFragmentSourceCode, a, null, this._transformFeedbackVaryings, this._key) : s._preparePipelineContext(this._pipelineContext, this._vertexSourceCode, this._fragmentSourceCode, !1, this._rawVertexSourceCode, this._rawFragmentSourceCode, a, i, this._transformFeedbackVaryings, this._key), s._executeWhenRenderingStateIsCompiled(this._pipelineContext, () => {\n if (this._attributes = [], this._pipelineContext._fillEffectInformation(this, this._uniformBuffersNames, this._uniformsNames, this._uniforms, this._samplerList, this._samplers, t, this._attributes), t)\n for (let o = 0; o < t.length; o++) {\n const l = t[o];\n this._attributeLocationByName[l] = this._attributes[o];\n }\n s.bindSamplers(this), this._compilationError = \"\", this._isReady = !0, this.onCompiled && this.onCompiled(this), this.onCompileObservable.notifyObservers(this), this.onCompileObservable.clear(), this._fallbacks && this._fallbacks.unBindMesh(), r && !e && this.getEngine()._deletePipelineContext(r);\n }), this._pipelineContext.isAsync && this._checkIsReady(r);\n } catch (s) {\n this._processCompilationErrors(s, r);\n }\n }\n _getShaderCodeAndErrorLine(e, t, i) {\n const r = i ? /FRAGMENT SHADER ERROR: 0:(\\d+?):/ : /VERTEX SHADER ERROR: 0:(\\d+?):/;\n let s = null;\n if (t && e) {\n const a = t.match(r);\n if (a && a.length === 2) {\n const o = parseInt(a[1]), l = e.split(`\n`, -1);\n l.length >= o && (s = `Offending line [${o}] in ${i ? \"fragment\" : \"vertex\"} code: ${l[o - 1]}`);\n }\n }\n return [e, s];\n }\n _processCompilationErrors(e, t = null) {\n var a, o, l;\n this._compilationError = e.message;\n const i = this._attributesNames, r = this._fallbacks;\n if (ne.Error(\"Unable to compile effect:\"), ne.Error(\"Uniforms: \" + this._uniformsNames.map(function(c) {\n return \" \" + c;\n })), ne.Error(\"Attributes: \" + i.map(function(c) {\n return \" \" + c;\n })), ne.Error(`Defines:\n` + this.defines), Hi.LogShaderCodeOnCompilationError) {\n let c = null, h = null, u = null;\n (a = this._pipelineContext) != null && a._getVertexShaderCode() && ([u, c] = this._getShaderCodeAndErrorLine(this._pipelineContext._getVertexShaderCode(), this._compilationError, !1), u && (ne.Error(\"Vertex code:\"), ne.Error(u))), (o = this._pipelineContext) != null && o._getFragmentShaderCode() && ([u, h] = this._getShaderCodeAndErrorLine((l = this._pipelineContext) == null ? void 0 : l._getFragmentShaderCode(), this._compilationError, !0), u && (ne.Error(\"Fragment code:\"), ne.Error(u))), c && ne.Error(c), h && ne.Error(h);\n }\n ne.Error(\"Error: \" + this._compilationError);\n const s = () => {\n this.onError && this.onError(this, this._compilationError), this.onErrorObservable.notifyObservers(this);\n };\n t && (this._pipelineContext = t, this._isReady = !0, s()), r ? (this._pipelineContext = null, r.hasMoreFallbacks ? (this._allFallbacksProcessed = !1, ne.Error(\"Trying next fallback.\"), this.defines = r.reduce(this.defines, this), this._prepareEffect()) : (this._allFallbacksProcessed = !0, s(), this.onErrorObservable.clear(), this._fallbacks && this._fallbacks.unBindMesh())) : (this._allFallbacksProcessed = !0, t || s());\n }\n /**\n * Checks if the effect is supported. (Must be called after compilation)\n */\n get isSupported() {\n return this._compilationError === \"\";\n }\n /**\n * Binds a texture to the engine to be used as output of the shader.\n * @param channel Name of the output variable.\n * @param texture Texture to bind.\n * @internal\n */\n _bindTexture(e, t) {\n this._engine._bindTexture(this._samplers[e], t, e);\n }\n /**\n * Sets a texture on the engine to be used in the shader.\n * @param channel Name of the sampler variable.\n * @param texture Texture to set.\n */\n setTexture(e, t) {\n this._engine.setTexture(this._samplers[e], this._uniforms[e], t, e);\n }\n /**\n * Sets a depth stencil texture from a render target on the engine to be used in the shader.\n * @param channel Name of the sampler variable.\n * @param texture Texture to set.\n */\n setDepthStencilTexture(e, t) {\n this._engine.setDepthStencilTexture(this._samplers[e], this._uniforms[e], t, e);\n }\n /**\n * Sets an array of textures on the engine to be used in the shader.\n * @param channel Name of the variable.\n * @param textures Textures to set.\n */\n setTextureArray(e, t) {\n const i = e + \"Ex\";\n if (this._samplerList.indexOf(i + \"0\") === -1) {\n const r = this._samplerList.indexOf(e);\n for (let a = 1; a < t.length; a++) {\n const o = i + (a - 1).toString();\n this._samplerList.splice(r + a, 0, o);\n }\n let s = 0;\n for (const a of this._samplerList)\n this._samplers[a] = s, s += 1;\n }\n this._engine.setTextureArray(this._samplers[e], this._uniforms[e], t, e);\n }\n /**\n * Sets a texture to be the input of the specified post process. (To use the output, pass in the next post process in the pipeline)\n * @param channel Name of the sampler variable.\n * @param postProcess Post process to get the input texture from.\n */\n setTextureFromPostProcess(e, t) {\n this._engine.setTextureFromPostProcess(this._samplers[e], t, e);\n }\n /**\n * (Warning! setTextureFromPostProcessOutput may be desired instead)\n * Sets the input texture of the passed in post process to be input of this effect. (To use the output of the passed in post process use setTextureFromPostProcessOutput)\n * @param channel Name of the sampler variable.\n * @param postProcess Post process to get the output texture from.\n */\n setTextureFromPostProcessOutput(e, t) {\n this._engine.setTextureFromPostProcessOutput(this._samplers[e], t, e);\n }\n /**\n * Binds a buffer to a uniform.\n * @param buffer Buffer to bind.\n * @param name Name of the uniform variable to bind to.\n */\n bindUniformBuffer(e, t) {\n const i = this._uniformBuffersNames[t];\n i === void 0 || Hi._BaseCache[i] === e && this._engine._features.useUBOBindingCache || (Hi._BaseCache[i] = e, this._engine.bindUniformBufferBase(e, i, t));\n }\n /**\n * Binds block to a uniform.\n * @param blockName Name of the block to bind.\n * @param index Index to bind.\n */\n bindUniformBlock(e, t) {\n this._engine.bindUniformBlock(this._pipelineContext, e, t);\n }\n /**\n * Sets an integer value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param value Value to be set.\n * @returns this effect.\n */\n setInt(e, t) {\n return this._pipelineContext.setInt(e, t), this;\n }\n /**\n * Sets an int2 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First int in int2.\n * @param y Second int in int2.\n * @returns this effect.\n */\n setInt2(e, t, i) {\n return this._pipelineContext.setInt2(e, t, i), this;\n }\n /**\n * Sets an int3 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First int in int3.\n * @param y Second int in int3.\n * @param z Third int in int3.\n * @returns this effect.\n */\n setInt3(e, t, i, r) {\n return this._pipelineContext.setInt3(e, t, i, r), this;\n }\n /**\n * Sets an int4 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First int in int4.\n * @param y Second int in int4.\n * @param z Third int in int4.\n * @param w Fourth int in int4.\n * @returns this effect.\n */\n setInt4(e, t, i, r, s) {\n return this._pipelineContext.setInt4(e, t, i, r, s), this;\n }\n /**\n * Sets an int array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setIntArray(e, t) {\n return this._pipelineContext.setIntArray(e, t), this;\n }\n /**\n * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setIntArray2(e, t) {\n return this._pipelineContext.setIntArray2(e, t), this;\n }\n /**\n * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setIntArray3(e, t) {\n return this._pipelineContext.setIntArray3(e, t), this;\n }\n /**\n * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setIntArray4(e, t) {\n return this._pipelineContext.setIntArray4(e, t), this;\n }\n /**\n * Sets an unsigned integer value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param value Value to be set.\n * @returns this effect.\n */\n setUInt(e, t) {\n return this._pipelineContext.setUInt(e, t), this;\n }\n /**\n * Sets an unsigned int2 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First unsigned int in uint2.\n * @param y Second unsigned int in uint2.\n * @returns this effect.\n */\n setUInt2(e, t, i) {\n return this._pipelineContext.setUInt2(e, t, i), this;\n }\n /**\n * Sets an unsigned int3 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First unsigned int in uint3.\n * @param y Second unsigned int in uint3.\n * @param z Third unsigned int in uint3.\n * @returns this effect.\n */\n setUInt3(e, t, i, r) {\n return this._pipelineContext.setUInt3(e, t, i, r), this;\n }\n /**\n * Sets an unsigned int4 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First unsigned int in uint4.\n * @param y Second unsigned int in uint4.\n * @param z Third unsigned int in uint4.\n * @param w Fourth unsigned int in uint4.\n * @returns this effect.\n */\n setUInt4(e, t, i, r, s) {\n return this._pipelineContext.setUInt4(e, t, i, r, s), this;\n }\n /**\n * Sets an unsigned int array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setUIntArray(e, t) {\n return this._pipelineContext.setUIntArray(e, t), this;\n }\n /**\n * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setUIntArray2(e, t) {\n return this._pipelineContext.setUIntArray2(e, t), this;\n }\n /**\n * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setUIntArray3(e, t) {\n return this._pipelineContext.setUIntArray3(e, t), this;\n }\n /**\n * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setUIntArray4(e, t) {\n return this._pipelineContext.setUIntArray4(e, t), this;\n }\n /**\n * Sets an float array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setFloatArray(e, t) {\n return this._pipelineContext.setArray(e, t), this;\n }\n /**\n * Sets an float array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setFloatArray2(e, t) {\n return this._pipelineContext.setArray2(e, t), this;\n }\n /**\n * Sets an float array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setFloatArray3(e, t) {\n return this._pipelineContext.setArray3(e, t), this;\n }\n /**\n * Sets an float array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setFloatArray4(e, t) {\n return this._pipelineContext.setArray4(e, t), this;\n }\n /**\n * Sets an array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setArray(e, t) {\n return this._pipelineContext.setArray(e, t), this;\n }\n /**\n * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setArray2(e, t) {\n return this._pipelineContext.setArray2(e, t), this;\n }\n /**\n * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setArray3(e, t) {\n return this._pipelineContext.setArray3(e, t), this;\n }\n /**\n * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setArray4(e, t) {\n return this._pipelineContext.setArray4(e, t), this;\n }\n /**\n * Sets matrices on a uniform variable.\n * @param uniformName Name of the variable.\n * @param matrices matrices to be set.\n * @returns this effect.\n */\n setMatrices(e, t) {\n return this._pipelineContext.setMatrices(e, t), this;\n }\n /**\n * Sets matrix on a uniform variable.\n * @param uniformName Name of the variable.\n * @param matrix matrix to be set.\n * @returns this effect.\n */\n setMatrix(e, t) {\n return this._pipelineContext.setMatrix(e, t), this;\n }\n /**\n * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix)\n * @param uniformName Name of the variable.\n * @param matrix matrix to be set.\n * @returns this effect.\n */\n setMatrix3x3(e, t) {\n return this._pipelineContext.setMatrix3x3(e, t), this;\n }\n /**\n * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix)\n * @param uniformName Name of the variable.\n * @param matrix matrix to be set.\n * @returns this effect.\n */\n setMatrix2x2(e, t) {\n return this._pipelineContext.setMatrix2x2(e, t), this;\n }\n /**\n * Sets a float on a uniform variable.\n * @param uniformName Name of the variable.\n * @param value value to be set.\n * @returns this effect.\n */\n setFloat(e, t) {\n return this._pipelineContext.setFloat(e, t), this;\n }\n /**\n * Sets a boolean on a uniform variable.\n * @param uniformName Name of the variable.\n * @param bool value to be set.\n * @returns this effect.\n */\n setBool(e, t) {\n return this._pipelineContext.setInt(e, t ? 1 : 0), this;\n }\n /**\n * Sets a Vector2 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param vector2 vector2 to be set.\n * @returns this effect.\n */\n setVector2(e, t) {\n return this._pipelineContext.setVector2(e, t), this;\n }\n /**\n * Sets a float2 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First float in float2.\n * @param y Second float in float2.\n * @returns this effect.\n */\n setFloat2(e, t, i) {\n return this._pipelineContext.setFloat2(e, t, i), this;\n }\n /**\n * Sets a Vector3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param vector3 Value to be set.\n * @returns this effect.\n */\n setVector3(e, t) {\n return this._pipelineContext.setVector3(e, t), this;\n }\n /**\n * Sets a float3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First float in float3.\n * @param y Second float in float3.\n * @param z Third float in float3.\n * @returns this effect.\n */\n setFloat3(e, t, i, r) {\n return this._pipelineContext.setFloat3(e, t, i, r), this;\n }\n /**\n * Sets a Vector4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param vector4 Value to be set.\n * @returns this effect.\n */\n setVector4(e, t) {\n return this._pipelineContext.setVector4(e, t), this;\n }\n /**\n * Sets a Quaternion on a uniform variable.\n * @param uniformName Name of the variable.\n * @param quaternion Value to be set.\n * @returns this effect.\n */\n setQuaternion(e, t) {\n return this._pipelineContext.setQuaternion(e, t), this;\n }\n /**\n * Sets a float4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First float in float4.\n * @param y Second float in float4.\n * @param z Third float in float4.\n * @param w Fourth float in float4.\n * @returns this effect.\n */\n setFloat4(e, t, i, r, s) {\n return this._pipelineContext.setFloat4(e, t, i, r, s), this;\n }\n /**\n * Sets a Color3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param color3 Value to be set.\n * @returns this effect.\n */\n setColor3(e, t) {\n return this._pipelineContext.setColor3(e, t), this;\n }\n /**\n * Sets a Color4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param color3 Value to be set.\n * @param alpha Alpha value to be set.\n * @returns this effect.\n */\n setColor4(e, t, i) {\n return this._pipelineContext.setColor4(e, t, i), this;\n }\n /**\n * Sets a Color4 on a uniform variable\n * @param uniformName defines the name of the variable\n * @param color4 defines the value to be set\n * @returns this effect.\n */\n setDirectColor4(e, t) {\n return this._pipelineContext.setDirectColor4(e, t), this;\n }\n /**\n * Release all associated resources.\n **/\n dispose() {\n this._pipelineContext && this._pipelineContext.dispose(), this._engine._releaseEffect(this), this._isDisposed = !0;\n }\n /**\n * This function will add a new shader to the shader store\n * @param name the name of the shader\n * @param pixelShader optional pixel shader content\n * @param vertexShader optional vertex shader content\n * @param shaderLanguage the language the shader is written in (default: GLSL)\n */\n static RegisterShader(e, t, i, r = _i.GLSL) {\n t && (Y.GetShadersStore(r)[`${e}PixelShader`] = t), i && (Y.GetShadersStore(r)[`${e}VertexShader`] = i);\n }\n /**\n * Resets the cache of effects.\n */\n static ResetCache() {\n Hi._BaseCache = {};\n }\n}\nHi.LogShaderCodeOnCompilationError = !0;\nHi._UniqueIdSeed = 0;\nHi._BaseCache = {};\nHi.ShadersStore = Y.ShadersStore;\nHi.IncludesShadersStore = Y.IncludesShadersStore;\nclass ly {\n /**\n * Initializes the state.\n * @param reset\n */\n constructor(e = !0) {\n this._isDepthTestDirty = !1, this._isDepthMaskDirty = !1, this._isDepthFuncDirty = !1, this._isCullFaceDirty = !1, this._isCullDirty = !1, this._isZOffsetDirty = !1, this._isFrontFaceDirty = !1, e && this.reset();\n }\n get isDirty() {\n return this._isDepthFuncDirty || this._isDepthTestDirty || this._isDepthMaskDirty || this._isCullFaceDirty || this._isCullDirty || this._isZOffsetDirty || this._isFrontFaceDirty;\n }\n get zOffset() {\n return this._zOffset;\n }\n set zOffset(e) {\n this._zOffset !== e && (this._zOffset = e, this._isZOffsetDirty = !0);\n }\n get zOffsetUnits() {\n return this._zOffsetUnits;\n }\n set zOffsetUnits(e) {\n this._zOffsetUnits !== e && (this._zOffsetUnits = e, this._isZOffsetDirty = !0);\n }\n get cullFace() {\n return this._cullFace;\n }\n set cullFace(e) {\n this._cullFace !== e && (this._cullFace = e, this._isCullFaceDirty = !0);\n }\n get cull() {\n return this._cull;\n }\n set cull(e) {\n this._cull !== e && (this._cull = e, this._isCullDirty = !0);\n }\n get depthFunc() {\n return this._depthFunc;\n }\n set depthFunc(e) {\n this._depthFunc !== e && (this._depthFunc = e, this._isDepthFuncDirty = !0);\n }\n get depthMask() {\n return this._depthMask;\n }\n set depthMask(e) {\n this._depthMask !== e && (this._depthMask = e, this._isDepthMaskDirty = !0);\n }\n get depthTest() {\n return this._depthTest;\n }\n set depthTest(e) {\n this._depthTest !== e && (this._depthTest = e, this._isDepthTestDirty = !0);\n }\n get frontFace() {\n return this._frontFace;\n }\n set frontFace(e) {\n this._frontFace !== e && (this._frontFace = e, this._isFrontFaceDirty = !0);\n }\n reset() {\n this._depthMask = !0, this._depthTest = !0, this._depthFunc = null, this._cullFace = null, this._cull = null, this._zOffset = 0, this._zOffsetUnits = 0, this._frontFace = null, this._isDepthTestDirty = !0, this._isDepthMaskDirty = !0, this._isDepthFuncDirty = !1, this._isCullFaceDirty = !1, this._isCullDirty = !1, this._isZOffsetDirty = !0, this._isFrontFaceDirty = !1;\n }\n apply(e) {\n this.isDirty && (this._isCullDirty && (this.cull ? e.enable(e.CULL_FACE) : e.disable(e.CULL_FACE), this._isCullDirty = !1), this._isCullFaceDirty && (e.cullFace(this.cullFace), this._isCullFaceDirty = !1), this._isDepthMaskDirty && (e.depthMask(this.depthMask), this._isDepthMaskDirty = !1), this._isDepthTestDirty && (this.depthTest ? e.enable(e.DEPTH_TEST) : e.disable(e.DEPTH_TEST), this._isDepthTestDirty = !1), this._isDepthFuncDirty && (e.depthFunc(this.depthFunc), this._isDepthFuncDirty = !1), this._isZOffsetDirty && (this.zOffset || this.zOffsetUnits ? (e.enable(e.POLYGON_OFFSET_FILL), e.polygonOffset(this.zOffset, this.zOffsetUnits)) : e.disable(e.POLYGON_OFFSET_FILL), this._isZOffsetDirty = !1), this._isFrontFaceDirty && (e.frontFace(this.frontFace), this._isFrontFaceDirty = !1));\n }\n}\nclass Ls {\n constructor() {\n this.reset();\n }\n reset() {\n this.enabled = !1, this.mask = 255, this.func = Ls.ALWAYS, this.funcRef = 1, this.funcMask = 255, this.opStencilFail = Ls.KEEP, this.opDepthFail = Ls.KEEP, this.opStencilDepthPass = Ls.REPLACE;\n }\n get stencilFunc() {\n return this.func;\n }\n set stencilFunc(e) {\n this.func = e;\n }\n get stencilFuncRef() {\n return this.funcRef;\n }\n set stencilFuncRef(e) {\n this.funcRef = e;\n }\n get stencilFuncMask() {\n return this.funcMask;\n }\n set stencilFuncMask(e) {\n this.funcMask = e;\n }\n get stencilOpStencilFail() {\n return this.opStencilFail;\n }\n set stencilOpStencilFail(e) {\n this.opStencilFail = e;\n }\n get stencilOpDepthFail() {\n return this.opDepthFail;\n }\n set stencilOpDepthFail(e) {\n this.opDepthFail = e;\n }\n get stencilOpStencilDepthPass() {\n return this.opStencilDepthPass;\n }\n set stencilOpStencilDepthPass(e) {\n this.opStencilDepthPass = e;\n }\n get stencilMask() {\n return this.mask;\n }\n set stencilMask(e) {\n this.mask = e;\n }\n get stencilTest() {\n return this.enabled;\n }\n set stencilTest(e) {\n this.enabled = e;\n }\n}\nLs.ALWAYS = 519;\nLs.KEEP = 7680;\nLs.REPLACE = 7681;\nclass cy {\n /**\n * Initializes the state.\n */\n constructor() {\n this._blendFunctionParameters = new Array(4), this._blendEquationParameters = new Array(2), this._blendConstants = new Array(4), this._isBlendConstantsDirty = !1, this._alphaBlend = !1, this._isAlphaBlendDirty = !1, this._isBlendFunctionParametersDirty = !1, this._isBlendEquationParametersDirty = !1, this.reset();\n }\n get isDirty() {\n return this._isAlphaBlendDirty || this._isBlendFunctionParametersDirty || this._isBlendEquationParametersDirty;\n }\n get alphaBlend() {\n return this._alphaBlend;\n }\n set alphaBlend(e) {\n this._alphaBlend !== e && (this._alphaBlend = e, this._isAlphaBlendDirty = !0);\n }\n setAlphaBlendConstants(e, t, i, r) {\n this._blendConstants[0] === e && this._blendConstants[1] === t && this._blendConstants[2] === i && this._blendConstants[3] === r || (this._blendConstants[0] = e, this._blendConstants[1] = t, this._blendConstants[2] = i, this._blendConstants[3] = r, this._isBlendConstantsDirty = !0);\n }\n setAlphaBlendFunctionParameters(e, t, i, r) {\n this._blendFunctionParameters[0] === e && this._blendFunctionParameters[1] === t && this._blendFunctionParameters[2] === i && this._blendFunctionParameters[3] === r || (this._blendFunctionParameters[0] = e, this._blendFunctionParameters[1] = t, this._blendFunctionParameters[2] = i, this._blendFunctionParameters[3] = r, this._isBlendFunctionParametersDirty = !0);\n }\n setAlphaEquationParameters(e, t) {\n this._blendEquationParameters[0] === e && this._blendEquationParameters[1] === t || (this._blendEquationParameters[0] = e, this._blendEquationParameters[1] = t, this._isBlendEquationParametersDirty = !0);\n }\n reset() {\n this._alphaBlend = !1, this._blendFunctionParameters[0] = null, this._blendFunctionParameters[1] = null, this._blendFunctionParameters[2] = null, this._blendFunctionParameters[3] = null, this._blendEquationParameters[0] = null, this._blendEquationParameters[1] = null, this._blendConstants[0] = null, this._blendConstants[1] = null, this._blendConstants[2] = null, this._blendConstants[3] = null, this._isAlphaBlendDirty = !0, this._isBlendFunctionParametersDirty = !1, this._isBlendEquationParametersDirty = !1, this._isBlendConstantsDirty = !1;\n }\n apply(e) {\n this.isDirty && (this._isAlphaBlendDirty && (this._alphaBlend ? e.enable(e.BLEND) : e.disable(e.BLEND), this._isAlphaBlendDirty = !1), this._isBlendFunctionParametersDirty && (e.blendFuncSeparate(this._blendFunctionParameters[0], this._blendFunctionParameters[1], this._blendFunctionParameters[2], this._blendFunctionParameters[3]), this._isBlendFunctionParametersDirty = !1), this._isBlendEquationParametersDirty && (e.blendEquationSeparate(this._blendEquationParameters[0], this._blendEquationParameters[1]), this._isBlendEquationParametersDirty = !1), this._isBlendConstantsDirty && (e.blendColor(this._blendConstants[0], this._blendConstants[1], this._blendConstants[2], this._blendConstants[3]), this._isBlendConstantsDirty = !1));\n }\n}\nclass hy {\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapU() {\n return this._cachedWrapU;\n }\n set wrapU(e) {\n this._cachedWrapU = e;\n }\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapV() {\n return this._cachedWrapV;\n }\n set wrapV(e) {\n this._cachedWrapV = e;\n }\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapR() {\n return this._cachedWrapR;\n }\n set wrapR(e) {\n this._cachedWrapR = e;\n }\n /**\n * With compliant hardware and browser (supporting anisotropic filtering)\n * this defines the level of anisotropic filtering in the texture.\n * The higher the better but the slower.\n */\n get anisotropicFilteringLevel() {\n return this._cachedAnisotropicFilteringLevel;\n }\n set anisotropicFilteringLevel(e) {\n this._cachedAnisotropicFilteringLevel = e;\n }\n /**\n * Gets or sets the comparison function (513, 514, etc). Set 0 to not use a comparison function\n */\n get comparisonFunction() {\n return this._comparisonFunction;\n }\n set comparisonFunction(e) {\n this._comparisonFunction = e;\n }\n /**\n * Indicates to use the mip maps (if available on the texture).\n * Thanks to this flag, you can instruct the sampler to not sample the mipmaps even if they exist (and if the sampling mode is set to a value that normally samples the mipmaps!)\n */\n get useMipMaps() {\n return this._useMipMaps;\n }\n set useMipMaps(e) {\n this._useMipMaps = e;\n }\n /**\n * Creates a Sampler instance\n */\n constructor() {\n this.samplingMode = -1, this._useMipMaps = !0, this._cachedWrapU = null, this._cachedWrapV = null, this._cachedWrapR = null, this._cachedAnisotropicFilteringLevel = null, this._comparisonFunction = 0;\n }\n /**\n * Sets all the parameters of the sampler\n * @param wrapU u address mode (default: TEXTURE_WRAP_ADDRESSMODE)\n * @param wrapV v address mode (default: TEXTURE_WRAP_ADDRESSMODE)\n * @param wrapR r address mode (default: TEXTURE_WRAP_ADDRESSMODE)\n * @param anisotropicFilteringLevel anisotropic level (default: 1)\n * @param samplingMode sampling mode (default: 2)\n * @param comparisonFunction comparison function (default: 0 - no comparison function)\n * @returns the current sampler instance\n */\n setParameters(e = 1, t = 1, i = 1, r = 1, s = 2, a = 0) {\n return this._cachedWrapU = e, this._cachedWrapV = t, this._cachedWrapR = i, this._cachedAnisotropicFilteringLevel = r, this.samplingMode = s, this._comparisonFunction = a, this;\n }\n /**\n * Compares this sampler with another one\n * @param other sampler to compare with\n * @returns true if the samplers have the same parametres, else false\n */\n compareSampler(e) {\n return this._cachedWrapU === e._cachedWrapU && this._cachedWrapV === e._cachedWrapV && this._cachedWrapR === e._cachedWrapR && this._cachedAnisotropicFilteringLevel === e._cachedAnisotropicFilteringLevel && this.samplingMode === e.samplingMode && this._comparisonFunction === e._comparisonFunction && this._useMipMaps === e._useMipMaps;\n }\n}\nvar Dt;\n(function(n) {\n n[n.Unknown = 0] = \"Unknown\", n[n.Url = 1] = \"Url\", n[n.Temp = 2] = \"Temp\", n[n.Raw = 3] = \"Raw\", n[n.Dynamic = 4] = \"Dynamic\", n[n.RenderTarget = 5] = \"RenderTarget\", n[n.MultiRenderTarget = 6] = \"MultiRenderTarget\", n[n.Cube = 7] = \"Cube\", n[n.CubeRaw = 8] = \"CubeRaw\", n[n.CubePrefiltered = 9] = \"CubePrefiltered\", n[n.Raw3D = 10] = \"Raw3D\", n[n.Raw2DArray = 11] = \"Raw2DArray\", n[n.DepthStencil = 12] = \"DepthStencil\", n[n.CubeRawRGBD = 13] = \"CubeRawRGBD\", n[n.Depth = 14] = \"Depth\";\n})(Dt || (Dt = {}));\nclass ar extends hy {\n /**\n * Gets a boolean indicating if the texture uses mipmaps\n * TODO implements useMipMaps as a separate setting from generateMipMaps\n */\n get useMipMaps() {\n return this.generateMipMaps;\n }\n set useMipMaps(e) {\n this.generateMipMaps = e;\n }\n /** Gets the unique id of the internal texture */\n get uniqueId() {\n return this._uniqueId;\n }\n /** @internal */\n _setUniqueId(e) {\n this._uniqueId = e;\n }\n /**\n * Gets the Engine the texture belongs to.\n * @returns The babylon engine\n */\n getEngine() {\n return this._engine;\n }\n /**\n * Gets the data source type of the texture\n */\n get source() {\n return this._source;\n }\n /**\n * Creates a new InternalTexture\n * @param engine defines the engine to use\n * @param source defines the type of data that will be used\n * @param delayAllocation if the texture allocation should be delayed (default: false)\n */\n constructor(e, t, i = !1) {\n super(), this.isReady = !1, this.isCube = !1, this.is3D = !1, this.is2DArray = !1, this.isMultiview = !1, this.url = \"\", this.generateMipMaps = !1, this.samples = 0, this.type = -1, this.format = -1, this.onLoadedObservable = new he(), this.onErrorObservable = new he(), this.onRebuildCallback = null, this.width = 0, this.height = 0, this.depth = 0, this.baseWidth = 0, this.baseHeight = 0, this.baseDepth = 0, this.invertY = !1, this._invertVScale = !1, this._associatedChannel = -1, this._source = Dt.Unknown, this._buffer = null, this._bufferView = null, this._bufferViewArray = null, this._bufferViewArrayArray = null, this._size = 0, this._extension = \"\", this._files = null, this._workingCanvas = null, this._workingContext = null, this._cachedCoordinatesMode = null, this._isDisabled = !1, this._compression = null, this._sphericalPolynomial = null, this._sphericalPolynomialPromise = null, this._sphericalPolynomialComputed = !1, this._lodGenerationScale = 0, this._lodGenerationOffset = 0, this._useSRGBBuffer = !1, this._creationFlags = 0, this._lodTextureHigh = null, this._lodTextureMid = null, this._lodTextureLow = null, this._isRGBD = !1, this._linearSpecularLOD = !1, this._irradianceTexture = null, this._hardwareTexture = null, this._maxLodLevel = null, this._references = 1, this._gammaSpace = null, this._premulAlpha = !1, this._dynamicTextureSource = null, this._engine = e, this._source = t, this._uniqueId = ar._Counter++, i || (this._hardwareTexture = e._createHardwareTexture());\n }\n /**\n * Increments the number of references (ie. the number of Texture that point to it)\n */\n incrementReferences() {\n this._references++;\n }\n /**\n * Change the size of the texture (not the size of the content)\n * @param width defines the new width\n * @param height defines the new height\n * @param depth defines the new depth (1 by default)\n */\n updateSize(e, t, i = 1) {\n this._engine.updateTextureDimensions(this, e, t, i), this.width = e, this.height = t, this.depth = i, this.baseWidth = e, this.baseHeight = t, this.baseDepth = i, this._size = e * t * i;\n }\n /** @internal */\n _rebuild() {\n if (this.isReady = !1, this._cachedCoordinatesMode = null, this._cachedWrapU = null, this._cachedWrapV = null, this._cachedWrapR = null, this._cachedAnisotropicFilteringLevel = null, this.onRebuildCallback) {\n const t = this.onRebuildCallback(this), i = (r) => {\n r._swapAndDie(this, !1), this.isReady = t.isReady;\n };\n t.isAsync ? t.proxy.then(i) : i(t.proxy);\n return;\n }\n let e;\n switch (this.source) {\n case Dt.Temp:\n break;\n case Dt.Url:\n e = this._engine.createTexture(\n this._originalUrl ?? this.url,\n !this.generateMipMaps,\n this.invertY,\n null,\n this.samplingMode,\n // Do not use Proxy here as it could be fully synchronous\n // and proxy would be undefined.\n (t) => {\n t._swapAndDie(this, !1), this.isReady = !0;\n },\n null,\n this._buffer,\n void 0,\n this.format,\n this._extension,\n void 0,\n void 0,\n void 0,\n this._useSRGBBuffer\n );\n return;\n case Dt.Raw:\n e = this._engine.createRawTexture(this._bufferView, this.baseWidth, this.baseHeight, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression, this.type, this._creationFlags, this._useSRGBBuffer), e._swapAndDie(this, !1), this.isReady = !0;\n break;\n case Dt.Raw3D:\n e = this._engine.createRawTexture3D(this._bufferView, this.baseWidth, this.baseHeight, this.baseDepth, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression, this.type), e._swapAndDie(this, !1), this.isReady = !0;\n break;\n case Dt.Raw2DArray:\n e = this._engine.createRawTexture2DArray(this._bufferView, this.baseWidth, this.baseHeight, this.baseDepth, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression, this.type), e._swapAndDie(this, !1), this.isReady = !0;\n break;\n case Dt.Dynamic:\n e = this._engine.createDynamicTexture(this.baseWidth, this.baseHeight, this.generateMipMaps, this.samplingMode), e._swapAndDie(this, !1), this._dynamicTextureSource && this._engine.updateDynamicTexture(this, this._dynamicTextureSource, this.invertY, this._premulAlpha, this.format, !0);\n break;\n case Dt.Cube:\n e = this._engine.createCubeTexture(this.url, null, this._files, !this.generateMipMaps, () => {\n e._swapAndDie(this, !1), this.isReady = !0;\n }, null, this.format, this._extension, !1, 0, 0, null, void 0, this._useSRGBBuffer);\n return;\n case Dt.CubeRaw:\n e = this._engine.createRawCubeTexture(this._bufferViewArray, this.width, this._originalFormat ?? this.format, this.type, this.generateMipMaps, this.invertY, this.samplingMode, this._compression), e._swapAndDie(this, !1), this.isReady = !0;\n break;\n case Dt.CubeRawRGBD:\n return;\n case Dt.CubePrefiltered:\n e = this._engine.createPrefilteredCubeTexture(this.url, null, this._lodGenerationScale, this._lodGenerationOffset, (t) => {\n t && t._swapAndDie(this, !1), this.isReady = !0;\n }, null, this.format, this._extension), e._sphericalPolynomial = this._sphericalPolynomial;\n return;\n case Dt.DepthStencil:\n case Dt.Depth:\n break;\n }\n }\n /**\n * @internal\n */\n _swapAndDie(e, t = !0) {\n var s;\n (s = this._hardwareTexture) == null || s.setUsage(e._source, this.generateMipMaps, this.is2DArray, this.isCube, this.is3D, this.width, this.height, this.depth), e._hardwareTexture = this._hardwareTexture, t && (e._isRGBD = this._isRGBD), this._lodTextureHigh && (e._lodTextureHigh && e._lodTextureHigh.dispose(), e._lodTextureHigh = this._lodTextureHigh), this._lodTextureMid && (e._lodTextureMid && e._lodTextureMid.dispose(), e._lodTextureMid = this._lodTextureMid), this._lodTextureLow && (e._lodTextureLow && e._lodTextureLow.dispose(), e._lodTextureLow = this._lodTextureLow), this._irradianceTexture && (e._irradianceTexture && e._irradianceTexture.dispose(), e._irradianceTexture = this._irradianceTexture);\n const i = this._engine.getLoadedTexturesCache();\n let r = i.indexOf(this);\n r !== -1 && i.splice(r, 1), r = i.indexOf(e), r === -1 && i.push(e);\n }\n /**\n * Dispose the current allocated resources\n */\n dispose() {\n this._references--, this.onLoadedObservable.clear(), this.onErrorObservable.clear(), this._references === 0 && (this._engine._releaseTexture(this), this._hardwareTexture = null, this._dynamicTextureSource = null);\n }\n}\nar._Counter = 0;\nclass uy {\n constructor() {\n this.shaderLanguage = _i.GLSL;\n }\n postProcessor(e, t, i, r, s) {\n if (!s.getCaps().drawBuffersExtension) {\n const a = /#extension.+GL_EXT_draw_buffers.+(enable|require)/g;\n e = e.replace(a, \"\");\n }\n return e;\n }\n}\nconst fy = /(flat\\s)?\\s*varying\\s*.*/;\nclass dy {\n constructor() {\n this.shaderLanguage = _i.GLSL;\n }\n attributeProcessor(e) {\n return e.replace(\"attribute\", \"in\");\n }\n varyingCheck(e, t) {\n return fy.test(e);\n }\n varyingProcessor(e, t) {\n return e.replace(\"varying\", t ? \"in\" : \"out\");\n }\n postProcessor(e, t, i) {\n const r = e.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1, s = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\n if (e = e.replace(s, \"\"), e = e.replace(/texture2D\\s*\\(/g, \"texture(\"), i) {\n const a = e.search(/layout *\\(location *= *0\\) *out/g) !== -1;\n e = e.replace(/texture2DLodEXT\\s*\\(/g, \"textureLod(\"), e = e.replace(/textureCubeLodEXT\\s*\\(/g, \"textureLod(\"), e = e.replace(/textureCube\\s*\\(/g, \"texture(\"), e = e.replace(/gl_FragDepthEXT/g, \"gl_FragDepth\"), e = e.replace(/gl_FragColor/g, \"glFragColor\"), e = e.replace(/gl_FragData/g, \"glFragData\"), e = e.replace(/void\\s+?main\\s*\\(/g, (r || a ? \"\" : `layout(location = 0) out vec4 glFragColor;\n`) + \"void main(\");\n } else if (t.indexOf(\"#define MULTIVIEW\") !== -1)\n return `#extension GL_OVR_multiview2 : require\nlayout (num_views = 2) in;\n` + e;\n return e;\n }\n}\nclass Wo {\n /**\n * Gets the underlying buffer\n */\n get underlyingResource() {\n return null;\n }\n /**\n * Constructs the buffer\n */\n constructor() {\n this.references = 0, this.capacity = 0, this.is32Bits = !1, this.uniqueId = Wo._Counter++;\n }\n}\nWo._Counter = 0;\nclass po extends Wo {\n constructor(e) {\n super(), this._buffer = e;\n }\n get underlyingResource() {\n return this._buffer;\n }\n}\nclass py {\n constructor() {\n this._valueCache = {}, this.vertexCompilationError = null, this.fragmentCompilationError = null, this.programLinkError = null, this.programValidationError = null, this._isDisposed = !1;\n }\n get isAsync() {\n return this.isParallelCompiled;\n }\n get isReady() {\n return this.program ? this.isParallelCompiled ? this.engine._isRenderingStateCompiled(this) : !0 : !1;\n }\n _handlesSpectorRebuildCallback(e) {\n e && this.program && e(this.program);\n }\n _fillEffectInformation(e, t, i, r, s, a, o, l) {\n const c = this.engine;\n if (c.supportsUniformBuffers)\n for (const f in t)\n e.bindUniformBlock(f, t[f]);\n this.engine.getUniforms(this, i).forEach((f, d) => {\n r[i[d]] = f;\n }), this._uniforms = r;\n let u;\n for (u = 0; u < s.length; u++)\n e.getUniform(s[u]) == null && (s.splice(u, 1), u--);\n s.forEach((f, d) => {\n a[f] = d;\n });\n for (const f of c.getAttributes(this, o))\n l.push(f);\n }\n /**\n * Release all associated resources.\n **/\n dispose() {\n this._uniforms = {}, this._isDisposed = !0;\n }\n /**\n * @internal\n */\n _cacheMatrix(e, t) {\n const i = this._valueCache[e], r = t.updateFlag;\n return i !== void 0 && i === r ? !1 : (this._valueCache[e] = r, !0);\n }\n /**\n * @internal\n */\n _cacheFloat2(e, t, i) {\n let r = this._valueCache[e];\n if (!r || r.length !== 2)\n return r = [t, i], this._valueCache[e] = r, !0;\n let s = !1;\n return r[0] !== t && (r[0] = t, s = !0), r[1] !== i && (r[1] = i, s = !0), s;\n }\n /**\n * @internal\n */\n _cacheFloat3(e, t, i, r) {\n let s = this._valueCache[e];\n if (!s || s.length !== 3)\n return s = [t, i, r], this._valueCache[e] = s, !0;\n let a = !1;\n return s[0] !== t && (s[0] = t, a = !0), s[1] !== i && (s[1] = i, a = !0), s[2] !== r && (s[2] = r, a = !0), a;\n }\n /**\n * @internal\n */\n _cacheFloat4(e, t, i, r, s) {\n let a = this._valueCache[e];\n if (!a || a.length !== 4)\n return a = [t, i, r, s], this._valueCache[e] = a, !0;\n let o = !1;\n return a[0] !== t && (a[0] = t, o = !0), a[1] !== i && (a[1] = i, o = !0), a[2] !== r && (a[2] = r, o = !0), a[3] !== s && (a[3] = s, o = !0), o;\n }\n /**\n * Sets an integer value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param value Value to be set.\n */\n setInt(e, t) {\n const i = this._valueCache[e];\n i !== void 0 && i === t || this.engine.setInt(this._uniforms[e], t) && (this._valueCache[e] = t);\n }\n /**\n * Sets a int2 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First int in int2.\n * @param y Second int in int2.\n */\n setInt2(e, t, i) {\n this._cacheFloat2(e, t, i) && (this.engine.setInt2(this._uniforms[e], t, i) || (this._valueCache[e] = null));\n }\n /**\n * Sets a int3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First int in int3.\n * @param y Second int in int3.\n * @param z Third int in int3.\n */\n setInt3(e, t, i, r) {\n this._cacheFloat3(e, t, i, r) && (this.engine.setInt3(this._uniforms[e], t, i, r) || (this._valueCache[e] = null));\n }\n /**\n * Sets a int4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First int in int4.\n * @param y Second int in int4.\n * @param z Third int in int4.\n * @param w Fourth int in int4.\n */\n setInt4(e, t, i, r, s) {\n this._cacheFloat4(e, t, i, r, s) && (this.engine.setInt4(this._uniforms[e], t, i, r, s) || (this._valueCache[e] = null));\n }\n /**\n * Sets an int array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setIntArray(e, t) {\n this._valueCache[e] = null, this.engine.setIntArray(this._uniforms[e], t);\n }\n /**\n * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setIntArray2(e, t) {\n this._valueCache[e] = null, this.engine.setIntArray2(this._uniforms[e], t);\n }\n /**\n * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setIntArray3(e, t) {\n this._valueCache[e] = null, this.engine.setIntArray3(this._uniforms[e], t);\n }\n /**\n * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setIntArray4(e, t) {\n this._valueCache[e] = null, this.engine.setIntArray4(this._uniforms[e], t);\n }\n /**\n * Sets an unsigned integer value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param value Value to be set.\n */\n setUInt(e, t) {\n const i = this._valueCache[e];\n i !== void 0 && i === t || this.engine.setUInt(this._uniforms[e], t) && (this._valueCache[e] = t);\n }\n /**\n * Sets an unsigned int2 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First unsigned int in uint2.\n * @param y Second unsigned int in uint2.\n */\n setUInt2(e, t, i) {\n this._cacheFloat2(e, t, i) && (this.engine.setUInt2(this._uniforms[e], t, i) || (this._valueCache[e] = null));\n }\n /**\n * Sets an unsigned int3 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First unsigned int in uint3.\n * @param y Second unsigned int in uint3.\n * @param z Third unsigned int in uint3.\n */\n setUInt3(e, t, i, r) {\n this._cacheFloat3(e, t, i, r) && (this.engine.setUInt3(this._uniforms[e], t, i, r) || (this._valueCache[e] = null));\n }\n /**\n * Sets an unsigned int4 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First unsigned int in uint4.\n * @param y Second unsigned int in uint4.\n * @param z Third unsigned int in uint4.\n * @param w Fourth unsigned int in uint4.\n */\n setUInt4(e, t, i, r, s) {\n this._cacheFloat4(e, t, i, r, s) && (this.engine.setUInt4(this._uniforms[e], t, i, r, s) || (this._valueCache[e] = null));\n }\n /**\n * Sets an unsigned int array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setUIntArray(e, t) {\n this._valueCache[e] = null, this.engine.setUIntArray(this._uniforms[e], t);\n }\n /**\n * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setUIntArray2(e, t) {\n this._valueCache[e] = null, this.engine.setUIntArray2(this._uniforms[e], t);\n }\n /**\n * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setUIntArray3(e, t) {\n this._valueCache[e] = null, this.engine.setUIntArray3(this._uniforms[e], t);\n }\n /**\n * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setUIntArray4(e, t) {\n this._valueCache[e] = null, this.engine.setUIntArray4(this._uniforms[e], t);\n }\n /**\n * Sets an array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setArray(e, t) {\n this._valueCache[e] = null, this.engine.setArray(this._uniforms[e], t);\n }\n /**\n * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setArray2(e, t) {\n this._valueCache[e] = null, this.engine.setArray2(this._uniforms[e], t);\n }\n /**\n * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setArray3(e, t) {\n this._valueCache[e] = null, this.engine.setArray3(this._uniforms[e], t);\n }\n /**\n * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setArray4(e, t) {\n this._valueCache[e] = null, this.engine.setArray4(this._uniforms[e], t);\n }\n /**\n * Sets matrices on a uniform variable.\n * @param uniformName Name of the variable.\n * @param matrices matrices to be set.\n */\n setMatrices(e, t) {\n t && (this._valueCache[e] = null, this.engine.setMatrices(this._uniforms[e], t));\n }\n /**\n * Sets matrix on a uniform variable.\n * @param uniformName Name of the variable.\n * @param matrix matrix to be set.\n */\n setMatrix(e, t) {\n this._cacheMatrix(e, t) && (this.engine.setMatrices(this._uniforms[e], t.asArray()) || (this._valueCache[e] = null));\n }\n /**\n * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix)\n * @param uniformName Name of the variable.\n * @param matrix matrix to be set.\n */\n setMatrix3x3(e, t) {\n this._valueCache[e] = null, this.engine.setMatrix3x3(this._uniforms[e], t);\n }\n /**\n * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix)\n * @param uniformName Name of the variable.\n * @param matrix matrix to be set.\n */\n setMatrix2x2(e, t) {\n this._valueCache[e] = null, this.engine.setMatrix2x2(this._uniforms[e], t);\n }\n /**\n * Sets a float on a uniform variable.\n * @param uniformName Name of the variable.\n * @param value value to be set.\n */\n setFloat(e, t) {\n const i = this._valueCache[e];\n i !== void 0 && i === t || this.engine.setFloat(this._uniforms[e], t) && (this._valueCache[e] = t);\n }\n /**\n * Sets a Vector2 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param vector2 vector2 to be set.\n */\n setVector2(e, t) {\n this._cacheFloat2(e, t.x, t.y) && (this.engine.setFloat2(this._uniforms[e], t.x, t.y) || (this._valueCache[e] = null));\n }\n /**\n * Sets a float2 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First float in float2.\n * @param y Second float in float2.\n */\n setFloat2(e, t, i) {\n this._cacheFloat2(e, t, i) && (this.engine.setFloat2(this._uniforms[e], t, i) || (this._valueCache[e] = null));\n }\n /**\n * Sets a Vector3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param vector3 Value to be set.\n */\n setVector3(e, t) {\n this._cacheFloat3(e, t.x, t.y, t.z) && (this.engine.setFloat3(this._uniforms[e], t.x, t.y, t.z) || (this._valueCache[e] = null));\n }\n /**\n * Sets a float3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First float in float3.\n * @param y Second float in float3.\n * @param z Third float in float3.\n */\n setFloat3(e, t, i, r) {\n this._cacheFloat3(e, t, i, r) && (this.engine.setFloat3(this._uniforms[e], t, i, r) || (this._valueCache[e] = null));\n }\n /**\n * Sets a Vector4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param vector4 Value to be set.\n */\n setVector4(e, t) {\n this._cacheFloat4(e, t.x, t.y, t.z, t.w) && (this.engine.setFloat4(this._uniforms[e], t.x, t.y, t.z, t.w) || (this._valueCache[e] = null));\n }\n /**\n * Sets a Quaternion on a uniform variable.\n * @param uniformName Name of the variable.\n * @param quaternion Value to be set.\n */\n setQuaternion(e, t) {\n this._cacheFloat4(e, t.x, t.y, t.z, t.w) && (this.engine.setFloat4(this._uniforms[e], t.x, t.y, t.z, t.w) || (this._valueCache[e] = null));\n }\n /**\n * Sets a float4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First float in float4.\n * @param y Second float in float4.\n * @param z Third float in float4.\n * @param w Fourth float in float4.\n */\n setFloat4(e, t, i, r, s) {\n this._cacheFloat4(e, t, i, r, s) && (this.engine.setFloat4(this._uniforms[e], t, i, r, s) || (this._valueCache[e] = null));\n }\n /**\n * Sets a Color3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param color3 Value to be set.\n */\n setColor3(e, t) {\n this._cacheFloat3(e, t.r, t.g, t.b) && (this.engine.setFloat3(this._uniforms[e], t.r, t.g, t.b) || (this._valueCache[e] = null));\n }\n /**\n * Sets a Color4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param color3 Value to be set.\n * @param alpha Alpha value to be set.\n */\n setColor4(e, t, i) {\n this._cacheFloat4(e, t.r, t.g, t.b, i) && (this.engine.setFloat4(this._uniforms[e], t.r, t.g, t.b, i) || (this._valueCache[e] = null));\n }\n /**\n * Sets a Color4 on a uniform variable\n * @param uniformName defines the name of the variable\n * @param color4 defines the value to be set\n */\n setDirectColor4(e, t) {\n this._cacheFloat4(e, t.r, t.g, t.b, t.a) && (this.engine.setFloat4(this._uniforms[e], t.r, t.g, t.b, t.a) || (this._valueCache[e] = null));\n }\n _getVertexShaderCode() {\n return this.vertexShader ? this.engine._getShaderSource(this.vertexShader) : null;\n }\n _getFragmentShaderCode() {\n return this.fragmentShader ? this.engine._getShaderSource(this.fragmentShader) : null;\n }\n}\nclass gi {\n /**\n * @internal\n */\n static SetMatrixPrecision(e) {\n if (gi.MatrixTrackPrecisionChange = !1, e && !gi.MatrixUse64Bits && gi.MatrixTrackedMatrices)\n for (let t = 0; t < gi.MatrixTrackedMatrices.length; ++t) {\n const i = gi.MatrixTrackedMatrices[t], r = i._m;\n i._m = new Array(16);\n for (let s = 0; s < 16; ++s)\n i._m[s] = r[s];\n }\n gi.MatrixUse64Bits = e, gi.MatrixCurrentType = gi.MatrixUse64Bits ? Array : Float32Array, gi.MatrixTrackedMatrices = null;\n }\n}\ngi.MatrixUse64Bits = !1;\ngi.MatrixTrackPrecisionChange = !0;\ngi.MatrixCurrentType = Float32Array;\ngi.MatrixTrackedMatrices = [];\nclass F_ {\n get underlyingResource() {\n return this._webGLTexture;\n }\n constructor(e = null, t) {\n if (this._MSAARenderBuffers = null, this._context = t, !e && (e = t.createTexture(), !e))\n throw new Error(\"Unable to create webGL texture\");\n this.set(e);\n }\n setUsage() {\n }\n set(e) {\n this._webGLTexture = e;\n }\n reset() {\n this._webGLTexture = null, this._MSAARenderBuffers = null;\n }\n addMSAARenderBuffer(e) {\n this._MSAARenderBuffers || (this._MSAARenderBuffers = []), this._MSAARenderBuffers.push(e);\n }\n releaseMSAARenderBuffers() {\n if (this._MSAARenderBuffers) {\n for (const e of this._MSAARenderBuffers)\n this._context.deleteRenderbuffer(e);\n this._MSAARenderBuffers = null;\n }\n }\n getMSAARenderBuffer(e = 0) {\n var t;\n return ((t = this._MSAARenderBuffers) == null ? void 0 : t[e]) ?? null;\n }\n release() {\n this.releaseMSAARenderBuffers(), this._webGLTexture && this._context.deleteTexture(this._webGLTexture), this.reset();\n }\n}\nclass ka {\n static IsWrapper(e) {\n return e.getPipelineContext === void 0;\n }\n static GetEffect(e) {\n return e.getPipelineContext === void 0 ? e.effect : e;\n }\n constructor(e, t = !0) {\n this._wasPreviouslyReady = !1, this._forceRebindOnNextCall = !0, this._wasPreviouslyUsingInstances = null, this.effect = null, this.defines = null, this.drawContext = e.createDrawContext(), t && (this.materialContext = e.createMaterialContext());\n }\n setEffect(e, t, i = !0) {\n var r;\n this.effect = e, t !== void 0 && (this.defines = t), i && ((r = this.drawContext) == null || r.reset());\n }\n dispose() {\n var e;\n (e = this.drawContext) == null || e.dispose();\n }\n}\nclass gy {\n get isDirty() {\n return this._isStencilTestDirty || this._isStencilMaskDirty || this._isStencilFuncDirty || this._isStencilOpDirty;\n }\n get func() {\n return this._func;\n }\n set func(e) {\n this._func !== e && (this._func = e, this._isStencilFuncDirty = !0);\n }\n get funcRef() {\n return this._funcRef;\n }\n set funcRef(e) {\n this._funcRef !== e && (this._funcRef = e, this._isStencilFuncDirty = !0);\n }\n get funcMask() {\n return this._funcMask;\n }\n set funcMask(e) {\n this._funcMask !== e && (this._funcMask = e, this._isStencilFuncDirty = !0);\n }\n get opStencilFail() {\n return this._opStencilFail;\n }\n set opStencilFail(e) {\n this._opStencilFail !== e && (this._opStencilFail = e, this._isStencilOpDirty = !0);\n }\n get opDepthFail() {\n return this._opDepthFail;\n }\n set opDepthFail(e) {\n this._opDepthFail !== e && (this._opDepthFail = e, this._isStencilOpDirty = !0);\n }\n get opStencilDepthPass() {\n return this._opStencilDepthPass;\n }\n set opStencilDepthPass(e) {\n this._opStencilDepthPass !== e && (this._opStencilDepthPass = e, this._isStencilOpDirty = !0);\n }\n get mask() {\n return this._mask;\n }\n set mask(e) {\n this._mask !== e && (this._mask = e, this._isStencilMaskDirty = !0);\n }\n get enabled() {\n return this._enabled;\n }\n set enabled(e) {\n this._enabled !== e && (this._enabled = e, this._isStencilTestDirty = !0);\n }\n constructor(e = !0) {\n this._isStencilTestDirty = !1, this._isStencilMaskDirty = !1, this._isStencilFuncDirty = !1, this._isStencilOpDirty = !1, this.useStencilGlobalOnly = !1, e && this.reset();\n }\n reset() {\n var e;\n this.stencilMaterial = void 0, (e = this.stencilGlobal) == null || e.reset(), this._isStencilTestDirty = !0, this._isStencilMaskDirty = !0, this._isStencilFuncDirty = !0, this._isStencilOpDirty = !0;\n }\n apply(e) {\n var i;\n if (!e)\n return;\n const t = !this.useStencilGlobalOnly && !!((i = this.stencilMaterial) != null && i.enabled);\n this.enabled = t ? this.stencilMaterial.enabled : this.stencilGlobal.enabled, this.func = t ? this.stencilMaterial.func : this.stencilGlobal.func, this.funcRef = t ? this.stencilMaterial.funcRef : this.stencilGlobal.funcRef, this.funcMask = t ? this.stencilMaterial.funcMask : this.stencilGlobal.funcMask, this.opStencilFail = t ? this.stencilMaterial.opStencilFail : this.stencilGlobal.opStencilFail, this.opDepthFail = t ? this.stencilMaterial.opDepthFail : this.stencilGlobal.opDepthFail, this.opStencilDepthPass = t ? this.stencilMaterial.opStencilDepthPass : this.stencilGlobal.opStencilDepthPass, this.mask = t ? this.stencilMaterial.mask : this.stencilGlobal.mask, this.isDirty && (this._isStencilTestDirty && (this.enabled ? e.enable(e.STENCIL_TEST) : e.disable(e.STENCIL_TEST), this._isStencilTestDirty = !1), this._isStencilMaskDirty && (e.stencilMask(this.mask), this._isStencilMaskDirty = !1), this._isStencilFuncDirty && (e.stencilFunc(this.func, this.funcRef, this.funcMask), this._isStencilFuncDirty = !1), this._isStencilOpDirty && (e.stencilOp(this.opStencilFail, this.opDepthFail, this.opStencilDepthPass), this._isStencilOpDirty = !1));\n }\n}\nclass my {\n}\nclass De {\n /**\n * Returns the current npm package of the sdk\n */\n // Not mixed with Version for tooling purpose.\n static get NpmPackage() {\n return \"babylonjs@7.1.0\";\n }\n /**\n * Returns the current version of the framework\n */\n static get Version() {\n return \"7.1.0\";\n }\n /**\n * Returns a string describing the current engine\n */\n get description() {\n let e = this.name + this.webGLVersion;\n return this._caps.parallelShaderCompile && (e += \" - Parallel shader compilation\"), e;\n }\n /**\n * Gets or sets the name of the engine\n */\n get name() {\n return this._name;\n }\n set name(e) {\n this._name = e;\n }\n /**\n * Returns the version of the engine\n */\n get version() {\n return this._webGLVersion;\n }\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\n */\n static get ShadersRepository() {\n return Hi.ShadersRepository;\n }\n static set ShadersRepository(e) {\n Hi.ShadersRepository = e;\n }\n /**\n * @internal\n */\n _getShaderProcessor(e) {\n return this._shaderProcessor;\n }\n /**\n * Gets or sets a boolean indicating if depth buffer should be reverse, going from far to near.\n * This can provide greater z depth for distant objects.\n */\n get useReverseDepthBuffer() {\n return this._useReverseDepthBuffer;\n }\n set useReverseDepthBuffer(e) {\n e !== this._useReverseDepthBuffer && (this._useReverseDepthBuffer = e, e ? this._depthCullingState.depthFunc = 518 : this._depthCullingState.depthFunc = 515);\n }\n /**\n * Gets the current frame id\n */\n get frameId() {\n return this._frameId;\n }\n /**\n * Gets a boolean indicating that the engine supports uniform buffers\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\n */\n get supportsUniformBuffers() {\n return this.webGLVersion > 1 && !this.disableUniformBuffers;\n }\n /**\n * Gets the options used for engine creation\n * @returns EngineOptions object\n */\n getCreationOptions() {\n return this._creationOptions;\n }\n /** @internal */\n get _shouldUseHighPrecisionShader() {\n return !!(this._caps.highPrecisionShaderSupported && this._highPrecisionShadersAllowed);\n }\n /**\n * Gets a boolean indicating that only power of 2 textures are supported\n * Please note that you can still use non power of 2 textures but in this case the engine will forcefully convert them\n */\n get needPOTTextures() {\n return this._webGLVersion < 2 || this.forcePOTTextures;\n }\n /**\n * Gets the list of current active render loop functions\n * @returns a read only array with the current render loop functions\n */\n get activeRenderLoops() {\n return this._activeRenderLoops;\n }\n /**\n * Gets or sets a boolean indicating if resources should be retained to be able to handle context lost events\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#handling-webgl-context-lost\n */\n get doNotHandleContextLost() {\n return this._doNotHandleContextLost;\n }\n set doNotHandleContextLost(e) {\n this._doNotHandleContextLost = e;\n }\n get _supportsHardwareTextureRescaling() {\n return !1;\n }\n /**\n * sets the object from which width and height will be taken from when getting render width and height\n * Will fallback to the gl object\n * @param dimensions the framebuffer width and height that will be used.\n */\n set framebufferDimensionsObject(e) {\n this._framebufferDimensionsObject = e;\n }\n /**\n * Gets the current viewport\n */\n get currentViewport() {\n return this._cachedViewport;\n }\n /**\n * Gets the default empty texture\n */\n get emptyTexture() {\n return this._emptyTexture || (this._emptyTexture = this.createRawTexture(new Uint8Array(4), 1, 1, 5, !1, !1, 1)), this._emptyTexture;\n }\n /**\n * Gets the default empty 3D texture\n */\n get emptyTexture3D() {\n return this._emptyTexture3D || (this._emptyTexture3D = this.createRawTexture3D(new Uint8Array(4), 1, 1, 1, 5, !1, !1, 1)), this._emptyTexture3D;\n }\n /**\n * Gets the default empty 2D array texture\n */\n get emptyTexture2DArray() {\n return this._emptyTexture2DArray || (this._emptyTexture2DArray = this.createRawTexture2DArray(new Uint8Array(4), 1, 1, 1, 5, !1, !1, 1)), this._emptyTexture2DArray;\n }\n /**\n * Gets the default empty cube texture\n */\n get emptyCubeTexture() {\n if (!this._emptyCubeTexture) {\n const e = new Uint8Array(4), t = [e, e, e, e, e, e];\n this._emptyCubeTexture = this.createRawCubeTexture(t, 1, 5, 0, !1, !1, 1);\n }\n return this._emptyCubeTexture;\n }\n /**\n * Gets a boolean indicating if the engine runs in WebGPU or not.\n */\n get isWebGPU() {\n return this._isWebGPU;\n }\n /**\n * Gets the shader platform name used by the effects.\n */\n get shaderPlatformName() {\n return this._shaderPlatformName;\n }\n /**\n * Enables or disables the snapshot rendering mode\n * Note that the WebGL engine does not support snapshot rendering so setting the value won't have any effect for this engine\n */\n get snapshotRendering() {\n return !1;\n }\n set snapshotRendering(e) {\n }\n /**\n * Gets or sets the snapshot rendering mode\n */\n get snapshotRenderingMode() {\n return this._snapshotRenderingMode;\n }\n set snapshotRenderingMode(e) {\n this._snapshotRenderingMode = e;\n }\n /**\n * Creates a new snapshot at the next frame using the current snapshotRenderingMode\n */\n snapshotRenderingReset() {\n this.snapshotRendering = !1;\n }\n static _CreateCanvas(e, t) {\n if (typeof document > \"u\")\n return new OffscreenCanvas(e, t);\n const i = document.createElement(\"canvas\");\n return i.width = e, i.height = t, i;\n }\n /**\n * Create a canvas. This method is overridden by other engines\n * @param width width\n * @param height height\n * @returns ICanvas interface\n */\n createCanvas(e, t) {\n return De._CreateCanvas(e, t);\n }\n /**\n * Create an image to use with canvas\n * @returns IImage interface\n */\n createCanvasImage() {\n return document.createElement(\"img\");\n }\n /**\n * Creates a new engine\n * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which already used the WebGL context\n * @param antialias defines enable antialiasing (default: false)\n * @param options defines further options to be sent to the getContext() function\n * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false)\n */\n constructor(e, t, i, r) {\n var c, h;\n this._name = \"WebGL\", this._isDisposed = !1, this.forcePOTTextures = !1, this.isFullscreen = !1, this.cullBackFaces = null, this.renderEvenInBackground = !0, this.preventCacheWipeBetweenFrames = !1, this.validateShaderPrograms = !1, this._useReverseDepthBuffer = !1, this.isNDCHalfZRange = !1, this.hasOriginBottomLeft = !0, this.disableUniformBuffers = !1, this.onDisposeObservable = new he(), this._frameId = 0, this._uniformBuffers = new Array(), this._storageBuffers = new Array(), this._webGLVersion = 1, this._windowIsBackground = !1, this._highPrecisionShadersAllowed = !0, this._badOS = !1, this._badDesktopOS = !1, this._activeRenderLoops = new Array(), this.onContextLostObservable = new he(), this.onContextRestoredObservable = new he(), this._contextWasLost = !1, this._doNotHandleContextLost = !1, this.disableVertexArrayObjects = !1, this._colorWrite = !0, this._colorWriteChanged = !0, this._depthCullingState = new ly(), this._stencilStateComposer = new gy(), this._stencilState = new Ls(), this._alphaState = new cy(), this._alphaMode = 1, this._alphaEquation = 0, this._internalTexturesCache = new Array(), this._renderTargetWrapperCache = new Array(), this._activeChannel = 0, this._currentTextureChannel = -1, this._boundTexturesCache = {}, this._compiledEffects = {}, this._vertexAttribArraysEnabled = [], this._currentRenderTarget = null, this._uintIndicesCurrentlySet = !1, this._currentBoundBuffer = new Array(), this._currentFramebuffer = null, this._dummyFramebuffer = null, this._currentBufferPointers = new Array(), this._currentInstanceLocations = new Array(), this._currentInstanceBuffers = new Array(), this._boundRenderFunction = () => this._renderLoop(), this._vaoRecordInProgress = !1, this._mustWipeVertexAttributes = !1, this._frameHandler = 0, this._nextFreeTextureSlots = new Array(), this._maxSimultaneousTextures = 0, this._maxMSAASamplesOverride = null, this._activeRequests = new Array(), this.adaptToDeviceRatio = !1, this._lastDevicePixelRatio = 1, this._transformTextureUrl = null, this.hostInformation = {\n isMobile: !1\n }, this.premultipliedAlpha = !0, this.onBeforeTextureInitObservable = new he(), this._isWebGPU = !1, this._snapshotRenderingMode = 0, this._viewportCached = { x: 0, y: 0, z: 0, w: 0 }, this._unpackFlipYCached = null, this.enableUnpackFlipYCached = !0, this._boundUniforms = {}, this.startTime = sr.Now;\n let s = null;\n i = i || {}, this._creationOptions = i, this.adaptToDeviceRatio = r ?? !1, this._stencilStateComposer.stencilGlobal = this._stencilState, gi.SetMatrixPrecision(!!i.useHighPrecisionMatrix), i.antialias = t ?? i.antialias, i.deterministicLockstep = i.deterministicLockstep ?? !1, i.lockstepMaxSteps = i.lockstepMaxSteps ?? 4, i.timeStep = i.timeStep ?? 1 / 60, i.audioEngine = i.audioEngine ?? !0, i.stencil = i.stencil ?? !0, this._audioContext = ((c = i.audioEngineOptions) == null ? void 0 : c.audioContext) ?? null, this._audioDestination = ((h = i.audioEngineOptions) == null ? void 0 : h.audioDestination) ?? null, this.premultipliedAlpha = i.premultipliedAlpha ?? !0, this.useExactSrgbConversions = i.useExactSrgbConversions ?? !1, this._doNotHandleContextLost = !!i.doNotHandleContextLost, this._isStencilEnable = !!i.stencil, r = r || i.adaptToDeviceRatio || !1;\n const a = yi() && window.devicePixelRatio || 1, o = i.limitDeviceRatio || a;\n if (this._hardwareScalingLevel = r ? 1 / Math.min(o, a) : 1, this._lastDevicePixelRatio = a, !e)\n return;\n if (e.getContext) {\n if (s = e, this._renderingCanvas = s, i.preserveDrawingBuffer === void 0 && (i.preserveDrawingBuffer = !1), i.xrCompatible === void 0 && (i.xrCompatible = !0), navigator && navigator.userAgent) {\n this._setupMobileChecks();\n const u = navigator.userAgent;\n for (const f of De.ExceptionList) {\n const d = f.key, p = f.targets;\n if (new RegExp(d).test(u)) {\n if (f.capture && f.captureConstraint) {\n const m = f.capture, v = f.captureConstraint, C = new RegExp(m).exec(u);\n if (C && C.length > 0 && parseInt(C[C.length - 1]) >= v)\n continue;\n }\n for (const m of p)\n switch (m) {\n case \"uniformBuffer\":\n this.disableUniformBuffers = !0;\n break;\n case \"vao\":\n this.disableVertexArrayObjects = !0;\n break;\n case \"antialias\":\n i.antialias = !1;\n break;\n case \"maxMSAASamples\":\n this._maxMSAASamplesOverride = 1;\n break;\n }\n }\n }\n }\n if (this._doNotHandleContextLost || (this._onContextLost = (u) => {\n u.preventDefault(), this._contextWasLost = !0, ne.Warn(\"WebGL context lost.\"), this.onContextLostObservable.notifyObservers(this);\n }, this._onContextRestored = () => {\n this._restoreEngineAfterContextLost(() => this._initGLContext());\n }, s.addEventListener(\"webglcontextlost\", this._onContextLost, !1), s.addEventListener(\"webglcontextrestored\", this._onContextRestored, !1), i.powerPreference = i.powerPreference || \"high-performance\"), this._badDesktopOS = /^((?!chrome|android).)*safari/i.test(navigator.userAgent), this._badDesktopOS && (i.xrCompatible = !1), !i.disableWebGL2Support)\n try {\n this._gl = s.getContext(\"webgl2\", i) || s.getContext(\"experimental-webgl2\", i), this._gl && (this._webGLVersion = 2, this._shaderPlatformName = \"WEBGL2\", this._gl.deleteQuery || (this._webGLVersion = 1, this._shaderPlatformName = \"WEBGL1\"));\n } catch {\n }\n if (!this._gl) {\n if (!s)\n throw new Error(\"The provided canvas is null or undefined.\");\n try {\n this._gl = s.getContext(\"webgl\", i) || s.getContext(\"experimental-webgl\", i);\n } catch {\n throw new Error(\"WebGL not supported\");\n }\n }\n if (!this._gl)\n throw new Error(\"WebGL not supported\");\n } else {\n this._gl = e, this._renderingCanvas = this._gl.canvas, this._gl.renderbufferStorageMultisample ? (this._webGLVersion = 2, this._shaderPlatformName = \"WEBGL2\") : this._shaderPlatformName = \"WEBGL1\";\n const u = this._gl.getContextAttributes();\n u && (i.stencil = u.stencil);\n }\n this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE), i.useHighPrecisionFloats !== void 0 && (this._highPrecisionShadersAllowed = i.useHighPrecisionFloats), this.resize(), this._initGLContext(), this._initFeatures();\n for (let u = 0; u < this._caps.maxVertexAttribs; u++)\n this._currentBufferPointers[u] = new my();\n this._shaderProcessor = this.webGLVersion > 1 ? new dy() : new uy(), this._badOS = /iPad/i.test(navigator.userAgent) || /iPhone/i.test(navigator.userAgent);\n const l = `Babylon.js v${De.Version}`;\n ne.Log(l + ` - ${this.description}`), this._renderingCanvas && this._renderingCanvas.setAttribute && this._renderingCanvas.setAttribute(\"data-engine\", l);\n }\n _setupMobileChecks() {\n navigator && navigator.userAgent && (this._checkForMobile = () => {\n const e = navigator.userAgent;\n this.hostInformation.isMobile = e.indexOf(\"Mobile\") !== -1 || // Needed for iOS 13+ detection on iPad (inspired by solution from https://stackoverflow.com/questions/9038625/detect-if-device-is-ios)\n e.indexOf(\"Mac\") !== -1 && no() && \"ontouchend\" in document;\n }, this._checkForMobile(), yi() && window.addEventListener(\"resize\", this._checkForMobile));\n }\n _clearEmptyResources() {\n this._dummyFramebuffer = null, this._emptyTexture = null, this._emptyCubeTexture = null, this._emptyTexture3D = null, this._emptyTexture2DArray = null;\n }\n _rebuildGraphicsResources() {\n var e;\n this.wipeCaches(!0), this._rebuildEffects(), (e = this._rebuildComputeEffects) == null || e.call(this), this._rebuildBuffers(), this._rebuildInternalTextures(), this._rebuildTextures(), this._rebuildRenderTargetWrappers(), this.wipeCaches(!0);\n }\n _flagContextRestored() {\n ne.Warn(this.name + \" context successfully restored.\"), this.onContextRestoredObservable.notifyObservers(this), this._contextWasLost = !1;\n }\n _restoreEngineAfterContextLost(e) {\n setTimeout(async () => {\n this._clearEmptyResources();\n const t = this._depthCullingState.depthTest, i = this._depthCullingState.depthFunc, r = this._depthCullingState.depthMask, s = this._stencilState.stencilTest;\n await e(), this._rebuildGraphicsResources(), this._depthCullingState.depthTest = t, this._depthCullingState.depthFunc = i, this._depthCullingState.depthMask = r, this._stencilState.stencilTest = s, this._flagContextRestored();\n }, 0);\n }\n /**\n * Shared initialization across engines types.\n * @param canvas The canvas associated with this instance of the engine.\n */\n _sharedInit(e) {\n this._renderingCanvas = e;\n }\n /**\n * @internal\n */\n _getShaderProcessingContext(e) {\n return null;\n }\n _rebuildInternalTextures() {\n const e = this._internalTexturesCache.slice();\n for (const t of e)\n t._rebuild();\n }\n _rebuildRenderTargetWrappers() {\n const e = this._renderTargetWrapperCache.slice();\n for (const t of e)\n t._rebuild();\n }\n _rebuildEffects() {\n for (const e in this._compiledEffects) {\n const t = this._compiledEffects[e];\n t._pipelineContext = null, t._prepareEffect();\n }\n Hi.ResetCache();\n }\n /**\n * Gets a boolean indicating if all created effects are ready\n * @returns true if all effects are ready\n */\n areAllEffectsReady() {\n for (const e in this._compiledEffects)\n if (!this._compiledEffects[e].isReady())\n return !1;\n return !0;\n }\n _rebuildBuffers() {\n for (const e of this._uniformBuffers)\n e._rebuildAfterContextLost();\n }\n _rebuildTextures() {\n }\n _initGLContext() {\n this._caps = {\n maxTexturesImageUnits: this._gl.getParameter(this._gl.MAX_TEXTURE_IMAGE_UNITS),\n maxCombinedTexturesImageUnits: this._gl.getParameter(this._gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\n maxVertexTextureImageUnits: this._gl.getParameter(this._gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS),\n maxTextureSize: this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),\n maxSamples: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_SAMPLES) : 1,\n maxCubemapTextureSize: this._gl.getParameter(this._gl.MAX_CUBE_MAP_TEXTURE_SIZE),\n maxRenderTextureSize: this._gl.getParameter(this._gl.MAX_RENDERBUFFER_SIZE),\n maxVertexAttribs: this._gl.getParameter(this._gl.MAX_VERTEX_ATTRIBS),\n maxVaryingVectors: this._gl.getParameter(this._gl.MAX_VARYING_VECTORS),\n maxFragmentUniformVectors: this._gl.getParameter(this._gl.MAX_FRAGMENT_UNIFORM_VECTORS),\n maxVertexUniformVectors: this._gl.getParameter(this._gl.MAX_VERTEX_UNIFORM_VECTORS),\n parallelShaderCompile: this._gl.getExtension(\"KHR_parallel_shader_compile\") || void 0,\n standardDerivatives: this._webGLVersion > 1 || this._gl.getExtension(\"OES_standard_derivatives\") !== null,\n maxAnisotropy: 1,\n astc: this._gl.getExtension(\"WEBGL_compressed_texture_astc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_astc\"),\n bptc: this._gl.getExtension(\"EXT_texture_compression_bptc\") || this._gl.getExtension(\"WEBKIT_EXT_texture_compression_bptc\"),\n s3tc: this._gl.getExtension(\"WEBGL_compressed_texture_s3tc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc\"),\n // eslint-disable-next-line @typescript-eslint/naming-convention\n s3tc_srgb: this._gl.getExtension(\"WEBGL_compressed_texture_s3tc_srgb\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc_srgb\"),\n pvrtc: this._gl.getExtension(\"WEBGL_compressed_texture_pvrtc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_pvrtc\"),\n etc1: this._gl.getExtension(\"WEBGL_compressed_texture_etc1\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_etc1\"),\n etc2: this._gl.getExtension(\"WEBGL_compressed_texture_etc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_etc\") || this._gl.getExtension(\"WEBGL_compressed_texture_es3_0\"),\n textureAnisotropicFilterExtension: this._gl.getExtension(\"EXT_texture_filter_anisotropic\") || this._gl.getExtension(\"WEBKIT_EXT_texture_filter_anisotropic\") || this._gl.getExtension(\"MOZ_EXT_texture_filter_anisotropic\"),\n uintIndices: this._webGLVersion > 1 || this._gl.getExtension(\"OES_element_index_uint\") !== null,\n fragmentDepthSupported: this._webGLVersion > 1 || this._gl.getExtension(\"EXT_frag_depth\") !== null,\n highPrecisionShaderSupported: !1,\n timerQuery: this._gl.getExtension(\"EXT_disjoint_timer_query_webgl2\") || this._gl.getExtension(\"EXT_disjoint_timer_query\"),\n supportOcclusionQuery: this._webGLVersion > 1,\n canUseTimestampForTimerQuery: !1,\n drawBuffersExtension: !1,\n maxMSAASamples: 1,\n colorBufferFloat: !!(this._webGLVersion > 1 && this._gl.getExtension(\"EXT_color_buffer_float\")),\n supportFloatTexturesResolve: !1,\n rg11b10ufColorRenderable: !1,\n colorBufferHalfFloat: !!(this._webGLVersion > 1 && this._gl.getExtension(\"EXT_color_buffer_half_float\")),\n textureFloat: !!(this._webGLVersion > 1 || this._gl.getExtension(\"OES_texture_float\")),\n textureHalfFloat: !!(this._webGLVersion > 1 || this._gl.getExtension(\"OES_texture_half_float\")),\n textureHalfFloatRender: !1,\n textureFloatLinearFiltering: !1,\n textureFloatRender: !1,\n textureHalfFloatLinearFiltering: !1,\n vertexArrayObject: !1,\n instancedArrays: !1,\n textureLOD: !!(this._webGLVersion > 1 || this._gl.getExtension(\"EXT_shader_texture_lod\")),\n texelFetch: this._webGLVersion !== 1,\n blendMinMax: !1,\n multiview: this._gl.getExtension(\"OVR_multiview2\"),\n oculusMultiview: this._gl.getExtension(\"OCULUS_multiview\"),\n depthTextureExtension: !1,\n canUseGLInstanceID: this._webGLVersion > 1,\n canUseGLVertexID: this._webGLVersion > 1,\n supportComputeShaders: !1,\n supportSRGBBuffers: !1,\n supportTransformFeedbacks: this._webGLVersion > 1,\n textureMaxLevel: this._webGLVersion > 1,\n texture2DArrayMaxLayerCount: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_ARRAY_TEXTURE_LAYERS) : 128,\n disableMorphTargetTexture: !1\n }, this._caps.supportFloatTexturesResolve = this._caps.colorBufferFloat, this._caps.rg11b10ufColorRenderable = this._caps.colorBufferFloat, this._glVersion = this._gl.getParameter(this._gl.VERSION);\n const e = this._gl.getExtension(\"WEBGL_debug_renderer_info\");\n if (e != null && (this._glRenderer = this._gl.getParameter(e.UNMASKED_RENDERER_WEBGL), this._glVendor = this._gl.getParameter(e.UNMASKED_VENDOR_WEBGL)), this._glVendor || (this._glVendor = this._gl.getParameter(this._gl.VENDOR) || \"Unknown vendor\"), this._glRenderer || (this._glRenderer = this._gl.getParameter(this._gl.RENDERER) || \"Unknown renderer\"), this._gl.HALF_FLOAT_OES !== 36193 && (this._gl.HALF_FLOAT_OES = 36193), this._gl.RGBA16F !== 34842 && (this._gl.RGBA16F = 34842), this._gl.RGBA32F !== 34836 && (this._gl.RGBA32F = 34836), this._gl.DEPTH24_STENCIL8 !== 35056 && (this._gl.DEPTH24_STENCIL8 = 35056), this._caps.timerQuery && (this._webGLVersion === 1 && (this._gl.getQuery = this._caps.timerQuery.getQueryEXT.bind(this._caps.timerQuery)), this._caps.canUseTimestampForTimerQuery = (this._gl.getQuery(this._caps.timerQuery.TIMESTAMP_EXT, this._caps.timerQuery.QUERY_COUNTER_BITS_EXT) ?? 0) > 0), this._caps.maxAnisotropy = this._caps.textureAnisotropicFilterExtension ? this._gl.getParameter(this._caps.textureAnisotropicFilterExtension.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0, this._caps.textureFloatLinearFiltering = !!(this._caps.textureFloat && this._gl.getExtension(\"OES_texture_float_linear\")), this._caps.textureFloatRender = !!(this._caps.textureFloat && this._canRenderToFloatFramebuffer()), this._caps.textureHalfFloatLinearFiltering = !!(this._webGLVersion > 1 || this._caps.textureHalfFloat && this._gl.getExtension(\"OES_texture_half_float_linear\")), this._caps.astc && (this._gl.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = this._caps.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR), this._caps.bptc && (this._gl.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT = this._caps.bptc.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT), this._caps.s3tc_srgb && (this._gl.COMPRESSED_SRGB_S3TC_DXT1_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_S3TC_DXT1_EXT, this._gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, this._gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT), this._caps.etc2 && (this._gl.COMPRESSED_SRGB8_ETC2 = this._caps.etc2.COMPRESSED_SRGB8_ETC2, this._gl.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = this._caps.etc2.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC), this._webGLVersion > 1 && this._gl.HALF_FLOAT_OES !== 5131 && (this._gl.HALF_FLOAT_OES = 5131), this._caps.textureHalfFloatRender = this._caps.textureHalfFloat && this._canRenderToHalfFloatFramebuffer(), this._webGLVersion > 1)\n this._caps.drawBuffersExtension = !0, this._caps.maxMSAASamples = this._maxMSAASamplesOverride !== null ? this._maxMSAASamplesOverride : this._gl.getParameter(this._gl.MAX_SAMPLES);\n else {\n const t = this._gl.getExtension(\"WEBGL_draw_buffers\");\n if (t !== null) {\n this._caps.drawBuffersExtension = !0, this._gl.drawBuffers = t.drawBuffersWEBGL.bind(t), this._gl.DRAW_FRAMEBUFFER = this._gl.FRAMEBUFFER;\n for (let i = 0; i < 16; i++)\n this._gl[\"COLOR_ATTACHMENT\" + i + \"_WEBGL\"] = t[\"COLOR_ATTACHMENT\" + i + \"_WEBGL\"];\n }\n }\n if (this._webGLVersion > 1)\n this._caps.depthTextureExtension = !0;\n else {\n const t = this._gl.getExtension(\"WEBGL_depth_texture\");\n t != null && (this._caps.depthTextureExtension = !0, this._gl.UNSIGNED_INT_24_8 = t.UNSIGNED_INT_24_8_WEBGL);\n }\n if (this.disableVertexArrayObjects)\n this._caps.vertexArrayObject = !1;\n else if (this._webGLVersion > 1)\n this._caps.vertexArrayObject = !0;\n else {\n const t = this._gl.getExtension(\"OES_vertex_array_object\");\n t != null && (this._caps.vertexArrayObject = !0, this._gl.createVertexArray = t.createVertexArrayOES.bind(t), this._gl.bindVertexArray = t.bindVertexArrayOES.bind(t), this._gl.deleteVertexArray = t.deleteVertexArrayOES.bind(t));\n }\n if (this._webGLVersion > 1)\n this._caps.instancedArrays = !0;\n else {\n const t = this._gl.getExtension(\"ANGLE_instanced_arrays\");\n t != null ? (this._caps.instancedArrays = !0, this._gl.drawArraysInstanced = t.drawArraysInstancedANGLE.bind(t), this._gl.drawElementsInstanced = t.drawElementsInstancedANGLE.bind(t), this._gl.vertexAttribDivisor = t.vertexAttribDivisorANGLE.bind(t)) : this._caps.instancedArrays = !1;\n }\n if (this._gl.getShaderPrecisionFormat) {\n const t = this._gl.getShaderPrecisionFormat(this._gl.VERTEX_SHADER, this._gl.HIGH_FLOAT), i = this._gl.getShaderPrecisionFormat(this._gl.FRAGMENT_SHADER, this._gl.HIGH_FLOAT);\n t && i && (this._caps.highPrecisionShaderSupported = t.precision !== 0 && i.precision !== 0);\n }\n if (this._webGLVersion > 1)\n this._caps.blendMinMax = !0;\n else {\n const t = this._gl.getExtension(\"EXT_blend_minmax\");\n t != null && (this._caps.blendMinMax = !0, this._gl.MAX = t.MAX_EXT, this._gl.MIN = t.MIN_EXT);\n }\n if (!this._caps.supportSRGBBuffers) {\n if (this._webGLVersion > 1)\n this._caps.supportSRGBBuffers = !0, this._glSRGBExtensionValues = {\n SRGB: WebGL2RenderingContext.SRGB,\n SRGB8: WebGL2RenderingContext.SRGB8,\n SRGB8_ALPHA8: WebGL2RenderingContext.SRGB8_ALPHA8\n };\n else {\n const t = this._gl.getExtension(\"EXT_sRGB\");\n t != null && (this._caps.supportSRGBBuffers = !0, this._glSRGBExtensionValues = {\n SRGB: t.SRGB_EXT,\n SRGB8: t.SRGB_ALPHA_EXT,\n SRGB8_ALPHA8: t.SRGB_ALPHA_EXT\n });\n }\n this._caps.supportSRGBBuffers = this._caps.supportSRGBBuffers && !!(this._creationOptions && this._creationOptions.forceSRGBBufferSupportState);\n }\n this._depthCullingState.depthTest = !0, this._depthCullingState.depthFunc = this._gl.LEQUAL, this._depthCullingState.depthMask = !0, this._maxSimultaneousTextures = this._caps.maxCombinedTexturesImageUnits;\n for (let t = 0; t < this._maxSimultaneousTextures; t++)\n this._nextFreeTextureSlots.push(t);\n this._glRenderer === \"Mali-G72\" && (this._caps.disableMorphTargetTexture = !0);\n }\n _initFeatures() {\n this._features = {\n forceBitmapOverHTMLImageElement: typeof HTMLImageElement > \"u\",\n supportRenderAndCopyToLodForFloatTextures: this._webGLVersion !== 1,\n supportDepthStencilTexture: this._webGLVersion !== 1,\n supportShadowSamplers: this._webGLVersion !== 1,\n uniformBufferHardCheckMatrix: !1,\n allowTexturePrefiltering: this._webGLVersion !== 1,\n trackUbosInFrame: !1,\n checkUbosContentBeforeUpload: !1,\n supportCSM: this._webGLVersion !== 1,\n basisNeedsPOT: this._webGLVersion === 1,\n support3DTextures: this._webGLVersion !== 1,\n needTypeSuffixInShaderConstants: this._webGLVersion !== 1,\n supportMSAA: this._webGLVersion !== 1,\n supportSSAO2: this._webGLVersion !== 1,\n supportExtendedTextureFormats: this._webGLVersion !== 1,\n supportSwitchCaseInShader: this._webGLVersion !== 1,\n supportSyncTextureRead: !0,\n needsInvertingBitmap: !0,\n useUBOBindingCache: !0,\n needShaderCodeInlining: !1,\n needToAlwaysBindUniformBuffers: !1,\n supportRenderPasses: !1,\n supportSpriteInstancing: !0,\n forceVertexBufferStrideAndOffsetMultiple4Bytes: !1,\n _collectUbosUpdatedInFrame: !1\n };\n }\n /**\n * Gets version of the current webGL context\n * Keep it for back compat - use version instead\n */\n get webGLVersion() {\n return this._webGLVersion;\n }\n /**\n * Gets a string identifying the name of the class\n * @returns \"Engine\" string\n */\n getClassName() {\n return \"ThinEngine\";\n }\n /**\n * Returns true if the stencil buffer has been enabled through the creation option of the context.\n */\n get isStencilEnable() {\n return this._isStencilEnable;\n }\n /** @internal */\n _prepareWorkingCanvas() {\n if (this._workingCanvas)\n return;\n this._workingCanvas = this.createCanvas(1, 1);\n const e = this._workingCanvas.getContext(\"2d\");\n e && (this._workingContext = e);\n }\n /**\n * Reset the texture cache to empty state\n */\n resetTextureCache() {\n for (const e in this._boundTexturesCache)\n Object.prototype.hasOwnProperty.call(this._boundTexturesCache, e) && (this._boundTexturesCache[e] = null);\n this._currentTextureChannel = -1;\n }\n /**\n * Gets an object containing information about the current engine context\n * @returns an object containing the vendor, the renderer and the version of the current engine context\n */\n getInfo() {\n return this.getGlInfo();\n }\n /**\n * Gets an object containing information about the current webGL context\n * @returns an object containing the vendor, the renderer and the version of the current webGL context\n */\n getGlInfo() {\n return {\n vendor: this._glVendor,\n renderer: this._glRenderer,\n version: this._glVersion\n };\n }\n /**\n * Defines the hardware scaling level.\n * By default the hardware scaling level is computed from the window device ratio.\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\n * @param level defines the level to use\n */\n setHardwareScalingLevel(e) {\n this._hardwareScalingLevel = e, this.resize();\n }\n /**\n * Gets the current hardware scaling level.\n * By default the hardware scaling level is computed from the window device ratio.\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\n * @returns a number indicating the current hardware scaling level\n */\n getHardwareScalingLevel() {\n return this._hardwareScalingLevel;\n }\n /**\n * Gets the list of loaded textures\n * @returns an array containing all loaded textures\n */\n getLoadedTexturesCache() {\n return this._internalTexturesCache;\n }\n /**\n * Gets the object containing all engine capabilities\n * @returns the EngineCapabilities object\n */\n getCaps() {\n return this._caps;\n }\n /**\n * stop executing a render loop function and remove it from the execution array\n * @param renderFunction defines the function to be removed. If not provided all functions will be removed.\n */\n stopRenderLoop(e) {\n if (!e) {\n this._activeRenderLoops.length = 0, this._cancelFrame();\n return;\n }\n const t = this._activeRenderLoops.indexOf(e);\n t >= 0 && (this._activeRenderLoops.splice(t, 1), this._activeRenderLoops.length == 0 && this._cancelFrame());\n }\n _cancelFrame() {\n if (this._frameHandler !== 0) {\n const e = this._frameHandler;\n if (this._frameHandler = 0, yi()) {\n const { cancelAnimationFrame: t } = this.getHostWindow() || window;\n if (typeof t == \"function\")\n return t(e);\n } else if (typeof cancelAnimationFrame == \"function\")\n return cancelAnimationFrame(e);\n return clearTimeout(e);\n }\n }\n /** @internal */\n _renderLoop() {\n if (this._frameHandler = 0, !this._contextWasLost) {\n let e = !0;\n if ((this._isDisposed || !this.renderEvenInBackground && this._windowIsBackground) && (e = !1), e) {\n this.beginFrame();\n for (let t = 0; t < this._activeRenderLoops.length; t++) {\n const i = this._activeRenderLoops[t];\n i();\n }\n this.endFrame();\n }\n }\n this._frameHandler === 0 && (this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow()));\n }\n /**\n * Gets the HTML canvas attached with the current webGL context\n * @returns a HTML canvas\n */\n getRenderingCanvas() {\n return this._renderingCanvas;\n }\n /**\n * Gets the audio context specified in engine initialization options\n * @returns an Audio Context\n */\n getAudioContext() {\n return this._audioContext;\n }\n /**\n * Gets the audio destination specified in engine initialization options\n * @returns an audio destination node\n */\n getAudioDestination() {\n return this._audioDestination;\n }\n /**\n * Gets host window\n * @returns the host window object\n */\n getHostWindow() {\n return yi() ? this._renderingCanvas && this._renderingCanvas.ownerDocument && this._renderingCanvas.ownerDocument.defaultView ? this._renderingCanvas.ownerDocument.defaultView : window : null;\n }\n /**\n * Gets the current render width\n * @param useScreen defines if screen size must be used (or the current render target if any)\n * @returns a number defining the current render width\n */\n getRenderWidth(e = !1) {\n return !e && this._currentRenderTarget ? this._currentRenderTarget.width : this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferWidth : this._gl.drawingBufferWidth;\n }\n /**\n * Gets the current render height\n * @param useScreen defines if screen size must be used (or the current render target if any)\n * @returns a number defining the current render height\n */\n getRenderHeight(e = !1) {\n return !e && this._currentRenderTarget ? this._currentRenderTarget.height : this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferHeight : this._gl.drawingBufferHeight;\n }\n /**\n * Can be used to override the current requestAnimationFrame requester.\n * @internal\n */\n _queueNewFrame(e, t) {\n return De.QueueNewFrame(e, t);\n }\n /**\n * Register and execute a render loop. The engine can have more than one render function\n * @param renderFunction defines the function to continuously execute\n */\n runRenderLoop(e) {\n this._activeRenderLoops.indexOf(e) === -1 && (this._activeRenderLoops.push(e), this._activeRenderLoops.length === 1 && this._frameHandler === 0 && (this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow())));\n }\n /**\n * Clear the current render buffer or the current render target (if any is set up)\n * @param color defines the color to use\n * @param backBuffer defines if the back buffer must be cleared\n * @param depth defines if the depth buffer must be cleared\n * @param stencil defines if the stencil buffer must be cleared\n */\n clear(e, t, i, r = !1) {\n var o, l;\n const s = this.stencilStateComposer.useStencilGlobalOnly;\n this.stencilStateComposer.useStencilGlobalOnly = !0, this.applyStates(), this.stencilStateComposer.useStencilGlobalOnly = s;\n let a = 0;\n if (t && e) {\n let c = !0;\n if (this._currentRenderTarget) {\n const h = (o = this._currentRenderTarget.texture) == null ? void 0 : o.format;\n if (h === 8 || h === 9 || h === 10 || h === 11) {\n const u = (l = this._currentRenderTarget.texture) == null ? void 0 : l.type;\n u === 7 || u === 5 ? (De._TempClearColorUint32[0] = e.r * 255, De._TempClearColorUint32[1] = e.g * 255, De._TempClearColorUint32[2] = e.b * 255, De._TempClearColorUint32[3] = e.a * 255, this._gl.clearBufferuiv(this._gl.COLOR, 0, De._TempClearColorUint32), c = !1) : (De._TempClearColorInt32[0] = e.r * 255, De._TempClearColorInt32[1] = e.g * 255, De._TempClearColorInt32[2] = e.b * 255, De._TempClearColorInt32[3] = e.a * 255, this._gl.clearBufferiv(this._gl.COLOR, 0, De._TempClearColorInt32), c = !1);\n }\n }\n c && (this._gl.clearColor(e.r, e.g, e.b, e.a !== void 0 ? e.a : 1), a |= this._gl.COLOR_BUFFER_BIT);\n }\n i && (this.useReverseDepthBuffer ? (this._depthCullingState.depthFunc = this._gl.GEQUAL, this._gl.clearDepth(0)) : this._gl.clearDepth(1), a |= this._gl.DEPTH_BUFFER_BIT), r && (this._gl.clearStencil(0), a |= this._gl.STENCIL_BUFFER_BIT), this._gl.clear(a);\n }\n /**\n * @internal\n */\n _viewport(e, t, i, r) {\n (e !== this._viewportCached.x || t !== this._viewportCached.y || i !== this._viewportCached.z || r !== this._viewportCached.w) && (this._viewportCached.x = e, this._viewportCached.y = t, this._viewportCached.z = i, this._viewportCached.w = r, this._gl.viewport(e, t, i, r));\n }\n /**\n * Set the WebGL's viewport\n * @param viewport defines the viewport element to be used\n * @param requiredWidth defines the width required for rendering. If not provided the rendering canvas' width is used\n * @param requiredHeight defines the height required for rendering. If not provided the rendering canvas' height is used\n */\n setViewport(e, t, i) {\n const r = t || this.getRenderWidth(), s = i || this.getRenderHeight(), a = e.x || 0, o = e.y || 0;\n this._cachedViewport = e, this._viewport(a * r, o * s, r * e.width, s * e.height);\n }\n /**\n * Begin a new frame\n */\n beginFrame() {\n }\n /**\n * Enf the current frame\n */\n endFrame() {\n this._badOS && this.flushFramebuffer(), this._frameId++;\n }\n /**\n * Resize the view according to the canvas' size\n * @param forceSetSize true to force setting the sizes of the underlying canvas\n */\n resize(e = !1) {\n let t, i;\n if (this.adaptToDeviceRatio) {\n const r = yi() && window.devicePixelRatio || 1, s = this._lastDevicePixelRatio / r;\n this._lastDevicePixelRatio = r, this._hardwareScalingLevel *= s;\n }\n if (yi() && no())\n if (this._renderingCanvas) {\n const r = this._renderingCanvas.getBoundingClientRect ? this._renderingCanvas.getBoundingClientRect() : {\n // fallback to last solution in case the function doesn't exist\n width: this._renderingCanvas.width * this._hardwareScalingLevel,\n height: this._renderingCanvas.height * this._hardwareScalingLevel\n };\n t = this._renderingCanvas.clientWidth || r.width || this._renderingCanvas.width || 100, i = this._renderingCanvas.clientHeight || r.height || this._renderingCanvas.height || 100;\n } else\n t = window.innerWidth, i = window.innerHeight;\n else\n t = this._renderingCanvas ? this._renderingCanvas.width : 100, i = this._renderingCanvas ? this._renderingCanvas.height : 100;\n this.setSize(t / this._hardwareScalingLevel, i / this._hardwareScalingLevel, e);\n }\n /**\n * Force a specific size of the canvas\n * @param width defines the new canvas' width\n * @param height defines the new canvas' height\n * @param forceSetSize true to force setting the sizes of the underlying canvas\n * @returns true if the size was changed\n */\n setSize(e, t, i = !1) {\n return !this._renderingCanvas || (e = e | 0, t = t | 0, !i && this._renderingCanvas.width === e && this._renderingCanvas.height === t) ? !1 : (this._renderingCanvas.width = e, this._renderingCanvas.height = t, !0);\n }\n /**\n * Binds the frame buffer to the specified texture.\n * @param rtWrapper The render target wrapper to render to\n * @param faceIndex The face of the texture to render to in case of cube texture and if the render target wrapper is not a multi render target\n * @param requiredWidth The width of the target to render to\n * @param requiredHeight The height of the target to render to\n * @param forceFullscreenViewport Forces the viewport to be the entire texture/screen if true\n * @param lodLevel Defines the lod level to bind to the frame buffer\n * @param layer Defines the 2d array index to bind to the frame buffer if the render target wrapper is not a multi render target\n */\n bindFramebuffer(e, t = 0, i, r, s, a = 0, o = 0) {\n var u, f, d, p, g, m;\n const l = e;\n this._currentRenderTarget && this.unBindFramebuffer(this._currentRenderTarget), this._currentRenderTarget = e, this._bindUnboundFramebuffer(l._MSAAFramebuffer ? l._MSAAFramebuffer : l._framebuffer);\n const c = this._gl;\n e.isMulti || (e.is2DArray || e.is3D ? c.framebufferTextureLayer(c.FRAMEBUFFER, c.COLOR_ATTACHMENT0, (u = e.texture._hardwareTexture) == null ? void 0 : u.underlyingResource, a, o) : e.isCube ? c.framebufferTexture2D(c.FRAMEBUFFER, c.COLOR_ATTACHMENT0, c.TEXTURE_CUBE_MAP_POSITIVE_X + t, (f = e.texture._hardwareTexture) == null ? void 0 : f.underlyingResource, a) : l._currentLOD !== a && (c.framebufferTexture2D(c.FRAMEBUFFER, c.COLOR_ATTACHMENT0, c.TEXTURE_2D, (d = e.texture._hardwareTexture) == null ? void 0 : d.underlyingResource, a), l._currentLOD = a));\n const h = e._depthStencilTexture;\n if (h) {\n e.is3D && (e.texture.width !== h.width || e.texture.height !== h.height || e.texture.depth !== h.depth) && ne.Warn(\"Depth/Stencil attachment for 3D target must have same dimensions as color attachment\");\n const v = e._depthStencilTextureWithStencil ? c.DEPTH_STENCIL_ATTACHMENT : c.DEPTH_ATTACHMENT;\n e.is2DArray || e.is3D ? c.framebufferTextureLayer(c.FRAMEBUFFER, v, (p = h._hardwareTexture) == null ? void 0 : p.underlyingResource, a, o) : e.isCube ? c.framebufferTexture2D(c.FRAMEBUFFER, v, c.TEXTURE_CUBE_MAP_POSITIVE_X + t, (g = h._hardwareTexture) == null ? void 0 : g.underlyingResource, a) : c.framebufferTexture2D(c.FRAMEBUFFER, v, c.TEXTURE_2D, (m = h._hardwareTexture) == null ? void 0 : m.underlyingResource, a);\n }\n this._cachedViewport && !s ? this.setViewport(this._cachedViewport, i, r) : (i || (i = e.width, a && (i = i / Math.pow(2, a))), r || (r = e.height, a && (r = r / Math.pow(2, a))), this._viewport(0, 0, i, r)), this.wipeCaches();\n }\n /**\n * Set various states to the webGL context\n * @param culling defines culling state: true to enable culling, false to disable it\n * @param zOffset defines the value to apply to zOffset (0 by default)\n * @param force defines if states must be applied even if cache is up to date\n * @param reverseSide defines if culling must be reversed (CCW if false, CW if true)\n * @param cullBackFaces true to cull back faces, false to cull front faces (if culling is enabled)\n * @param stencil stencil states to set\n * @param zOffsetUnits defines the value to apply to zOffsetUnits (0 by default)\n */\n setState(e, t = 0, i, r = !1, s, a, o = 0) {\n (this._depthCullingState.cull !== e || i) && (this._depthCullingState.cull = e);\n const l = this.cullBackFaces ?? s ?? !0 ? this._gl.BACK : this._gl.FRONT;\n (this._depthCullingState.cullFace !== l || i) && (this._depthCullingState.cullFace = l), this.setZOffset(t), this.setZOffsetUnits(o);\n const c = r ? this._gl.CW : this._gl.CCW;\n (this._depthCullingState.frontFace !== c || i) && (this._depthCullingState.frontFace = c), this._stencilStateComposer.stencilMaterial = a;\n }\n /**\n * Gets a boolean indicating if depth testing is enabled\n * @returns the current state\n */\n getDepthBuffer() {\n return this._depthCullingState.depthTest;\n }\n /**\n * Enable or disable depth buffering\n * @param enable defines the state to set\n */\n setDepthBuffer(e) {\n this._depthCullingState.depthTest = e;\n }\n /**\n * Set the z offset Factor to apply to current rendering\n * @param value defines the offset to apply\n */\n setZOffset(e) {\n this._depthCullingState.zOffset = this.useReverseDepthBuffer ? -e : e;\n }\n /**\n * Gets the current value of the zOffset Factor\n * @returns the current zOffset Factor state\n */\n getZOffset() {\n const e = this._depthCullingState.zOffset;\n return this.useReverseDepthBuffer ? -e : e;\n }\n /**\n * Set the z offset Units to apply to current rendering\n * @param value defines the offset to apply\n */\n setZOffsetUnits(e) {\n this._depthCullingState.zOffsetUnits = this.useReverseDepthBuffer ? -e : e;\n }\n /**\n * Gets the current value of the zOffset Units\n * @returns the current zOffset Units state\n */\n getZOffsetUnits() {\n const e = this._depthCullingState.zOffsetUnits;\n return this.useReverseDepthBuffer ? -e : e;\n }\n /**\n * @internal\n */\n _bindUnboundFramebuffer(e) {\n this._currentFramebuffer !== e && (this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, e), this._currentFramebuffer = e);\n }\n /** @internal */\n _currentFrameBufferIsDefaultFrameBuffer() {\n return this._currentFramebuffer === null;\n }\n /**\n * Generates the mipmaps for a texture\n * @param texture texture to generate the mipmaps for\n */\n generateMipmaps(e) {\n const t = this._getTextureTarget(e);\n this._bindTextureDirectly(t, e, !0), this._gl.generateMipmap(t), this._bindTextureDirectly(t, null);\n }\n /**\n * Unbind the current render target texture from the webGL context\n * @param texture defines the render target wrapper to unbind\n * @param disableGenerateMipMaps defines a boolean indicating that mipmaps must not be generated\n * @param onBeforeUnbind defines a function which will be called before the effective unbind\n */\n unBindFramebuffer(e, t = !1, i) {\n var a;\n const r = e;\n this._currentRenderTarget = null;\n const s = this._gl;\n if (r._MSAAFramebuffer) {\n if (e.isMulti) {\n this.unBindMultiColorAttachmentFramebuffer(e, t, i);\n return;\n }\n s.bindFramebuffer(s.READ_FRAMEBUFFER, r._MSAAFramebuffer), s.bindFramebuffer(s.DRAW_FRAMEBUFFER, r._framebuffer), s.blitFramebuffer(0, 0, e.width, e.height, 0, 0, e.width, e.height, s.COLOR_BUFFER_BIT, s.NEAREST);\n }\n (a = e.texture) != null && a.generateMipMaps && !t && !e.isCube && this.generateMipmaps(e.texture), i && (r._MSAAFramebuffer && this._bindUnboundFramebuffer(r._framebuffer), i()), this._bindUnboundFramebuffer(null);\n }\n /**\n * Force a webGL flush (ie. a flush of all waiting webGL commands)\n */\n flushFramebuffer() {\n this._gl.flush();\n }\n /**\n * Unbind the current render target and bind the default framebuffer\n */\n restoreDefaultFramebuffer() {\n this._currentRenderTarget ? this.unBindFramebuffer(this._currentRenderTarget) : this._bindUnboundFramebuffer(null), this._cachedViewport && this.setViewport(this._cachedViewport), this.wipeCaches();\n }\n // VBOs\n /** @internal */\n _resetVertexBufferBinding() {\n this.bindArrayBuffer(null), this._cachedVertexBuffers = null;\n }\n /**\n * Creates a vertex buffer\n * @param data the data or size for the vertex buffer\n * @param _updatable whether the buffer should be created as updatable\n * @param _label defines the label of the buffer (for debug purpose)\n * @returns the new WebGL static buffer\n */\n createVertexBuffer(e, t, i) {\n return this._createVertexBuffer(e, this._gl.STATIC_DRAW);\n }\n _createVertexBuffer(e, t) {\n const i = this._gl.createBuffer();\n if (!i)\n throw new Error(\"Unable to create vertex buffer\");\n const r = new po(i);\n return this.bindArrayBuffer(r), typeof e != \"number\" ? e instanceof Array ? (this._gl.bufferData(this._gl.ARRAY_BUFFER, new Float32Array(e), t), r.capacity = e.length * 4) : (this._gl.bufferData(this._gl.ARRAY_BUFFER, e, t), r.capacity = e.byteLength) : (this._gl.bufferData(this._gl.ARRAY_BUFFER, new Uint8Array(e), t), r.capacity = e), this._resetVertexBufferBinding(), r.references = 1, r;\n }\n /**\n * Creates a dynamic vertex buffer\n * @param data the data for the dynamic vertex buffer\n * @param _label defines the label of the buffer (for debug purpose)\n * @returns the new WebGL dynamic buffer\n */\n createDynamicVertexBuffer(e, t) {\n return this._createVertexBuffer(e, this._gl.DYNAMIC_DRAW);\n }\n _resetIndexBufferBinding() {\n this.bindIndexBuffer(null), this._cachedIndexBuffer = null;\n }\n /**\n * Creates a new index buffer\n * @param indices defines the content of the index buffer\n * @param updatable defines if the index buffer must be updatable\n * @param _label defines the label of the buffer (for debug purpose)\n * @returns a new webGL buffer\n */\n createIndexBuffer(e, t, i) {\n const r = this._gl.createBuffer(), s = new po(r);\n if (!r)\n throw new Error(\"Unable to create index buffer\");\n this.bindIndexBuffer(s);\n const a = this._normalizeIndexData(e);\n return this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, a, t ? this._gl.DYNAMIC_DRAW : this._gl.STATIC_DRAW), this._resetIndexBufferBinding(), s.references = 1, s.is32Bits = a.BYTES_PER_ELEMENT === 4, s;\n }\n _normalizeIndexData(e) {\n if (e.BYTES_PER_ELEMENT === 2)\n return e;\n if (this._caps.uintIndices) {\n if (e instanceof Uint32Array)\n return e;\n for (let i = 0; i < e.length; i++)\n if (e[i] >= 65535)\n return new Uint32Array(e);\n return new Uint16Array(e);\n }\n return new Uint16Array(e);\n }\n /**\n * Bind a webGL buffer to the webGL context\n * @param buffer defines the buffer to bind\n */\n bindArrayBuffer(e) {\n this._vaoRecordInProgress || this._unbindVertexArrayObject(), this._bindBuffer(e, this._gl.ARRAY_BUFFER);\n }\n /**\n * Bind a specific block at a given index in a specific shader program\n * @param pipelineContext defines the pipeline context to use\n * @param blockName defines the block name\n * @param index defines the index where to bind the block\n */\n bindUniformBlock(e, t, i) {\n const r = e.program, s = this._gl.getUniformBlockIndex(r, t);\n this._gl.uniformBlockBinding(r, s, i);\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n bindIndexBuffer(e) {\n this._vaoRecordInProgress || this._unbindVertexArrayObject(), this._bindBuffer(e, this._gl.ELEMENT_ARRAY_BUFFER);\n }\n _bindBuffer(e, t) {\n (this._vaoRecordInProgress || this._currentBoundBuffer[t] !== e) && (this._gl.bindBuffer(t, e ? e.underlyingResource : null), this._currentBoundBuffer[t] = e);\n }\n /**\n * update the bound buffer with the given data\n * @param data defines the data to update\n */\n updateArrayBuffer(e) {\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, e);\n }\n _vertexAttribPointer(e, t, i, r, s, a, o) {\n const l = this._currentBufferPointers[t];\n if (!l)\n return;\n let c = !1;\n l.active ? (l.buffer !== e && (l.buffer = e, c = !0), l.size !== i && (l.size = i, c = !0), l.type !== r && (l.type = r, c = !0), l.normalized !== s && (l.normalized = s, c = !0), l.stride !== a && (l.stride = a, c = !0), l.offset !== o && (l.offset = o, c = !0)) : (c = !0, l.active = !0, l.index = t, l.size = i, l.type = r, l.normalized = s, l.stride = a, l.offset = o, l.buffer = e), (c || this._vaoRecordInProgress) && (this.bindArrayBuffer(e), r === this._gl.UNSIGNED_INT || r === this._gl.INT ? this._gl.vertexAttribIPointer(t, i, r, a, o) : this._gl.vertexAttribPointer(t, i, r, s, a, o));\n }\n /**\n * @internal\n */\n _bindIndexBufferWithCache(e) {\n e != null && this._cachedIndexBuffer !== e && (this._cachedIndexBuffer = e, this.bindIndexBuffer(e), this._uintIndicesCurrentlySet = e.is32Bits);\n }\n _bindVertexBuffersAttributes(e, t, i) {\n const r = t.getAttributesNames();\n this._vaoRecordInProgress || this._unbindVertexArrayObject(), this.unbindAllAttributes();\n for (let s = 0; s < r.length; s++) {\n const a = t.getAttributeLocation(s);\n if (a >= 0) {\n const o = r[s];\n let l = null;\n if (i && (l = i[o]), l || (l = e[o]), !l)\n continue;\n this._gl.enableVertexAttribArray(a), this._vaoRecordInProgress || (this._vertexAttribArraysEnabled[a] = !0);\n const c = l.getBuffer();\n c && (this._vertexAttribPointer(c, a, l.getSize(), l.type, l.normalized, l.byteStride, l.byteOffset), l.getIsInstanced() && (this._gl.vertexAttribDivisor(a, l.getInstanceDivisor()), this._vaoRecordInProgress || (this._currentInstanceLocations.push(a), this._currentInstanceBuffers.push(c))));\n }\n }\n }\n /**\n * Records a vertex array object\n * @see https://doc.babylonjs.com/setup/support/webGL2#vertex-array-objects\n * @param vertexBuffers defines the list of vertex buffers to store\n * @param indexBuffer defines the index buffer to store\n * @param effect defines the effect to store\n * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers\n * @returns the new vertex array object\n */\n recordVertexArrayObject(e, t, i, r) {\n const s = this._gl.createVertexArray();\n if (!s)\n throw new Error(\"Unable to create VAO\");\n return this._vaoRecordInProgress = !0, this._gl.bindVertexArray(s), this._mustWipeVertexAttributes = !0, this._bindVertexBuffersAttributes(e, i, r), this.bindIndexBuffer(t), this._vaoRecordInProgress = !1, this._gl.bindVertexArray(null), s;\n }\n /**\n * Bind a specific vertex array object\n * @see https://doc.babylonjs.com/setup/support/webGL2#vertex-array-objects\n * @param vertexArrayObject defines the vertex array object to bind\n * @param indexBuffer defines the index buffer to bind\n */\n bindVertexArrayObject(e, t) {\n this._cachedVertexArrayObject !== e && (this._cachedVertexArrayObject = e, this._gl.bindVertexArray(e), this._cachedVertexBuffers = null, this._cachedIndexBuffer = null, this._uintIndicesCurrentlySet = t != null && t.is32Bits, this._mustWipeVertexAttributes = !0);\n }\n /**\n * Bind webGl buffers directly to the webGL context\n * @param vertexBuffer defines the vertex buffer to bind\n * @param indexBuffer defines the index buffer to bind\n * @param vertexDeclaration defines the vertex declaration to use with the vertex buffer\n * @param vertexStrideSize defines the vertex stride of the vertex buffer\n * @param effect defines the effect associated with the vertex buffer\n */\n bindBuffersDirectly(e, t, i, r, s) {\n if (this._cachedVertexBuffers !== e || this._cachedEffectForVertexBuffers !== s) {\n this._cachedVertexBuffers = e, this._cachedEffectForVertexBuffers = s;\n const a = s.getAttributesCount();\n this._unbindVertexArrayObject(), this.unbindAllAttributes();\n let o = 0;\n for (let l = 0; l < a; l++)\n if (l < i.length) {\n const c = s.getAttributeLocation(l);\n c >= 0 && (this._gl.enableVertexAttribArray(c), this._vertexAttribArraysEnabled[c] = !0, this._vertexAttribPointer(e, c, i[l], this._gl.FLOAT, !1, r, o)), o += i[l] * 4;\n }\n }\n this._bindIndexBufferWithCache(t);\n }\n _unbindVertexArrayObject() {\n this._cachedVertexArrayObject && (this._cachedVertexArrayObject = null, this._gl.bindVertexArray(null));\n }\n /**\n * Bind a list of vertex buffers to the webGL context\n * @param vertexBuffers defines the list of vertex buffers to bind\n * @param indexBuffer defines the index buffer to bind\n * @param effect defines the effect associated with the vertex buffers\n * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers\n */\n bindBuffers(e, t, i, r) {\n (this._cachedVertexBuffers !== e || this._cachedEffectForVertexBuffers !== i) && (this._cachedVertexBuffers = e, this._cachedEffectForVertexBuffers = i, this._bindVertexBuffersAttributes(e, i, r)), this._bindIndexBufferWithCache(t);\n }\n /**\n * Unbind all instance attributes\n */\n unbindInstanceAttributes() {\n let e;\n for (let t = 0, i = this._currentInstanceLocations.length; t < i; t++) {\n const r = this._currentInstanceBuffers[t];\n e != r && r.references && (e = r, this.bindArrayBuffer(r));\n const s = this._currentInstanceLocations[t];\n this._gl.vertexAttribDivisor(s, 0);\n }\n this._currentInstanceBuffers.length = 0, this._currentInstanceLocations.length = 0;\n }\n /**\n * Release and free the memory of a vertex array object\n * @param vao defines the vertex array object to delete\n */\n releaseVertexArrayObject(e) {\n this._gl.deleteVertexArray(e);\n }\n /**\n * @internal\n */\n _releaseBuffer(e) {\n return e.references--, e.references === 0 ? (this._deleteBuffer(e), !0) : !1;\n }\n _deleteBuffer(e) {\n this._gl.deleteBuffer(e.underlyingResource);\n }\n /**\n * Update the content of a webGL buffer used with instantiation and bind it to the webGL context\n * @param instancesBuffer defines the webGL buffer to update and bind\n * @param data defines the data to store in the buffer\n * @param offsetLocations defines the offsets or attributes information used to determine where data must be stored in the buffer\n */\n updateAndBindInstancesBuffer(e, t, i) {\n if (this.bindArrayBuffer(e), t && this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, t), i[0].index !== void 0)\n this.bindInstancesBuffer(e, i, !0);\n else\n for (let r = 0; r < 4; r++) {\n const s = i[r];\n this._vertexAttribArraysEnabled[s] || (this._gl.enableVertexAttribArray(s), this._vertexAttribArraysEnabled[s] = !0), this._vertexAttribPointer(e, s, 4, this._gl.FLOAT, !1, 64, r * 16), this._gl.vertexAttribDivisor(s, 1), this._currentInstanceLocations.push(s), this._currentInstanceBuffers.push(e);\n }\n }\n /**\n * Bind the content of a webGL buffer used with instantiation\n * @param instancesBuffer defines the webGL buffer to bind\n * @param attributesInfo defines the offsets or attributes information used to determine where data must be stored in the buffer\n * @param computeStride defines Whether to compute the strides from the info or use the default 0\n */\n bindInstancesBuffer(e, t, i = !0) {\n this.bindArrayBuffer(e);\n let r = 0;\n if (i)\n for (let s = 0; s < t.length; s++) {\n const a = t[s];\n r += a.attributeSize * 4;\n }\n for (let s = 0; s < t.length; s++) {\n const a = t[s];\n a.index === void 0 && (a.index = this._currentEffect.getAttributeLocationByName(a.attributeName)), !(a.index < 0) && (this._vertexAttribArraysEnabled[a.index] || (this._gl.enableVertexAttribArray(a.index), this._vertexAttribArraysEnabled[a.index] = !0), this._vertexAttribPointer(e, a.index, a.attributeSize, a.attributeType || this._gl.FLOAT, a.normalized || !1, r, a.offset), this._gl.vertexAttribDivisor(a.index, a.divisor === void 0 ? 1 : a.divisor), this._currentInstanceLocations.push(a.index), this._currentInstanceBuffers.push(e));\n }\n }\n /**\n * Disable the instance attribute corresponding to the name in parameter\n * @param name defines the name of the attribute to disable\n */\n disableInstanceAttributeByName(e) {\n if (!this._currentEffect)\n return;\n const t = this._currentEffect.getAttributeLocationByName(e);\n this.disableInstanceAttribute(t);\n }\n /**\n * Disable the instance attribute corresponding to the location in parameter\n * @param attributeLocation defines the attribute location of the attribute to disable\n */\n disableInstanceAttribute(e) {\n let t = !1, i;\n for (; (i = this._currentInstanceLocations.indexOf(e)) !== -1; )\n this._currentInstanceLocations.splice(i, 1), this._currentInstanceBuffers.splice(i, 1), t = !0, i = this._currentInstanceLocations.indexOf(e);\n t && (this._gl.vertexAttribDivisor(e, 0), this.disableAttributeByIndex(e));\n }\n /**\n * Disable the attribute corresponding to the location in parameter\n * @param attributeLocation defines the attribute location of the attribute to disable\n */\n disableAttributeByIndex(e) {\n this._gl.disableVertexAttribArray(e), this._vertexAttribArraysEnabled[e] = !1, this._currentBufferPointers[e].active = !1;\n }\n /**\n * Send a draw order\n * @param useTriangles defines if triangles must be used to draw (else wireframe will be used)\n * @param indexStart defines the starting index\n * @param indexCount defines the number of index to draw\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\n */\n draw(e, t, i, r) {\n this.drawElementsType(e ? 0 : 1, t, i, r);\n }\n /**\n * Draw a list of points\n * @param verticesStart defines the index of first vertex to draw\n * @param verticesCount defines the count of vertices to draw\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\n */\n drawPointClouds(e, t, i) {\n this.drawArraysType(2, e, t, i);\n }\n /**\n * Draw a list of unindexed primitives\n * @param useTriangles defines if triangles must be used to draw (else wireframe will be used)\n * @param verticesStart defines the index of first vertex to draw\n * @param verticesCount defines the count of vertices to draw\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\n */\n drawUnIndexed(e, t, i, r) {\n this.drawArraysType(e ? 0 : 1, t, i, r);\n }\n /**\n * Draw a list of indexed primitives\n * @param fillMode defines the primitive to use\n * @param indexStart defines the starting index\n * @param indexCount defines the number of index to draw\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\n */\n drawElementsType(e, t, i, r) {\n this.applyStates(), this._reportDrawCall();\n const s = this._drawMode(e), a = this._uintIndicesCurrentlySet ? this._gl.UNSIGNED_INT : this._gl.UNSIGNED_SHORT, o = this._uintIndicesCurrentlySet ? 4 : 2;\n r ? this._gl.drawElementsInstanced(s, i, a, t * o, r) : this._gl.drawElements(s, i, a, t * o);\n }\n /**\n * Draw a list of unindexed primitives\n * @param fillMode defines the primitive to use\n * @param verticesStart defines the index of first vertex to draw\n * @param verticesCount defines the count of vertices to draw\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\n */\n drawArraysType(e, t, i, r) {\n this.applyStates(), this._reportDrawCall();\n const s = this._drawMode(e);\n r ? this._gl.drawArraysInstanced(s, t, i, r) : this._gl.drawArrays(s, t, i);\n }\n _drawMode(e) {\n switch (e) {\n case 0:\n return this._gl.TRIANGLES;\n case 2:\n return this._gl.POINTS;\n case 1:\n return this._gl.LINES;\n case 3:\n return this._gl.POINTS;\n case 4:\n return this._gl.LINES;\n case 5:\n return this._gl.LINE_LOOP;\n case 6:\n return this._gl.LINE_STRIP;\n case 7:\n return this._gl.TRIANGLE_STRIP;\n case 8:\n return this._gl.TRIANGLE_FAN;\n default:\n return this._gl.TRIANGLES;\n }\n }\n /** @internal */\n _reportDrawCall() {\n }\n // Shaders\n /**\n * @internal\n */\n _releaseEffect(e) {\n this._compiledEffects[e._key] && delete this._compiledEffects[e._key];\n const t = e.getPipelineContext();\n t && this._deletePipelineContext(t);\n }\n /**\n * @internal\n */\n _deletePipelineContext(e) {\n const t = e;\n t && t.program && (t.program.__SPECTOR_rebuildProgram = null, this._gl.deleteProgram(t.program));\n }\n /** @internal */\n _getGlobalDefines(e) {\n if (e) {\n this.isNDCHalfZRange ? e.IS_NDC_HALF_ZRANGE = \"\" : delete e.IS_NDC_HALF_ZRANGE, this.useReverseDepthBuffer ? e.USE_REVERSE_DEPTHBUFFER = \"\" : delete e.USE_REVERSE_DEPTHBUFFER, this.useExactSrgbConversions ? e.USE_EXACT_SRGB_CONVERSIONS = \"\" : delete e.USE_EXACT_SRGB_CONVERSIONS;\n return;\n } else {\n let t = \"\";\n return this.isNDCHalfZRange && (t += \"#define IS_NDC_HALF_ZRANGE\"), this.useReverseDepthBuffer && (t && (t += `\n`), t += \"#define USE_REVERSE_DEPTHBUFFER\"), this.useExactSrgbConversions && (t && (t += `\n`), t += \"#define USE_EXACT_SRGB_CONVERSIONS\"), t;\n }\n }\n /**\n * Create a new effect (used to store vertex/fragment shaders)\n * @param baseName defines the base name of the effect (The name of file without .fragment.fx or .vertex.fx)\n * @param attributesNamesOrOptions defines either a list of attribute names or an IEffectCreationOptions object\n * @param uniformsNamesOrEngine defines either a list of uniform names or the engine to use\n * @param samplers defines an array of string used to represent textures\n * @param defines defines the string containing the defines to use to compile the shaders\n * @param fallbacks defines the list of potential fallbacks to use if shader compilation fails\n * @param onCompiled defines a function to call when the effect creation is successful\n * @param onError defines a function to call when the effect creation has failed\n * @param indexParameters defines an object containing the index values to use to compile shaders (like the maximum number of simultaneous lights)\n * @param shaderLanguage the language the shader is written in (default: GLSL)\n * @returns the new Effect\n */\n createEffect(e, t, i, r, s, a, o, l, c, h = _i.GLSL) {\n const u = typeof e == \"string\" ? e : e.vertexToken || e.vertexSource || e.vertexElement || e.vertex, f = typeof e == \"string\" ? e : e.fragmentToken || e.fragmentSource || e.fragmentElement || e.fragment, d = this._getGlobalDefines();\n let p = s ?? t.defines ?? \"\";\n d && (p += d);\n const g = u + \"+\" + f + \"@\" + p;\n if (this._compiledEffects[g]) {\n const v = this._compiledEffects[g];\n return o && v.isReady() && o(v), v;\n }\n const m = new Hi(e, t, i, r, this, s, a, o, l, c, g, h);\n return this._compiledEffects[g] = m, m;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static _ConcatenateShader(e, t, i = \"\") {\n return i + (t ? t + `\n` : \"\") + e;\n }\n _compileShader(e, t, i, r) {\n return this._compileRawShader(De._ConcatenateShader(e, i, r), t);\n }\n _compileRawShader(e, t) {\n const i = this._gl, r = i.createShader(t === \"vertex\" ? i.VERTEX_SHADER : i.FRAGMENT_SHADER);\n if (!r) {\n let s = i.NO_ERROR, a = i.NO_ERROR;\n for (; (a = i.getError()) !== i.NO_ERROR; )\n s = a;\n throw new Error(`Something went wrong while creating a gl ${t} shader object. gl error=${s}, gl isContextLost=${i.isContextLost()}, _contextWasLost=${this._contextWasLost}`);\n }\n return i.shaderSource(r, e), i.compileShader(r), r;\n }\n /**\n * @internal\n */\n _getShaderSource(e) {\n return this._gl.getShaderSource(e);\n }\n /**\n * Directly creates a webGL program\n * @param pipelineContext defines the pipeline context to attach to\n * @param vertexCode defines the vertex shader code to use\n * @param fragmentCode defines the fragment shader code to use\n * @param context defines the webGL context to use (if not set, the current one will be used)\n * @param transformFeedbackVaryings defines the list of transform feedback varyings to use\n * @returns the new webGL program\n */\n createRawShaderProgram(e, t, i, r, s = null) {\n r = r || this._gl;\n const a = this._compileRawShader(t, \"vertex\"), o = this._compileRawShader(i, \"fragment\");\n return this._createShaderProgram(e, a, o, r, s);\n }\n /**\n * Creates a webGL program\n * @param pipelineContext defines the pipeline context to attach to\n * @param vertexCode defines the vertex shader code to use\n * @param fragmentCode defines the fragment shader code to use\n * @param defines defines the string containing the defines to use to compile the shaders\n * @param context defines the webGL context to use (if not set, the current one will be used)\n * @param transformFeedbackVaryings defines the list of transform feedback varyings to use\n * @returns the new webGL program\n */\n createShaderProgram(e, t, i, r, s, a = null) {\n s = s || this._gl;\n const o = this._webGLVersion > 1 ? `#version 300 es\n#define WEBGL2 \n` : \"\", l = this._compileShader(t, \"vertex\", r, o), c = this._compileShader(i, \"fragment\", r, o);\n return this._createShaderProgram(e, l, c, s, a);\n }\n /**\n * Inline functions in shader code that are marked to be inlined\n * @param code code to inline\n * @returns inlined code\n */\n inlineShaderCode(e) {\n return e;\n }\n /**\n * Creates a new pipeline context\n * @param shaderProcessingContext defines the shader processing context used during the processing if available\n * @returns the new pipeline\n */\n createPipelineContext(e) {\n const t = new py();\n return t.engine = this, this._caps.parallelShaderCompile && (t.isParallelCompiled = !0), t;\n }\n /**\n * Creates a new material context\n * @returns the new context\n */\n createMaterialContext() {\n }\n /**\n * Creates a new draw context\n * @returns the new context\n */\n createDrawContext() {\n }\n _createShaderProgram(e, t, i, r, s = null) {\n const a = r.createProgram();\n if (e.program = a, !a)\n throw new Error(\"Unable to create program\");\n return r.attachShader(a, t), r.attachShader(a, i), r.linkProgram(a), e.context = r, e.vertexShader = t, e.fragmentShader = i, e.isParallelCompiled || this._finalizePipelineContext(e), a;\n }\n _finalizePipelineContext(e) {\n const t = e.context, i = e.vertexShader, r = e.fragmentShader, s = e.program;\n if (!t.getProgramParameter(s, t.LINK_STATUS)) {\n if (!this._gl.getShaderParameter(i, this._gl.COMPILE_STATUS)) {\n const l = this._gl.getShaderInfoLog(i);\n if (l)\n throw e.vertexCompilationError = l, new Error(\"VERTEX SHADER \" + l);\n }\n if (!this._gl.getShaderParameter(r, this._gl.COMPILE_STATUS)) {\n const l = this._gl.getShaderInfoLog(r);\n if (l)\n throw e.fragmentCompilationError = l, new Error(\"FRAGMENT SHADER \" + l);\n }\n const o = t.getProgramInfoLog(s);\n if (o)\n throw e.programLinkError = o, new Error(o);\n }\n if (this.validateShaderPrograms && (t.validateProgram(s), !t.getProgramParameter(s, t.VALIDATE_STATUS))) {\n const l = t.getProgramInfoLog(s);\n if (l)\n throw e.programValidationError = l, new Error(l);\n }\n t.deleteShader(i), t.deleteShader(r), e.vertexShader = void 0, e.fragmentShader = void 0, e.onCompiled && (e.onCompiled(), e.onCompiled = void 0);\n }\n /**\n * @internal\n */\n _preparePipelineContext(e, t, i, r, s, a, o, l, c, h) {\n const u = e;\n r ? u.program = this.createRawShaderProgram(u, t, i, void 0, c) : u.program = this.createShaderProgram(u, t, i, l, void 0, c), u.program.__SPECTOR_rebuildProgram = o;\n }\n /**\n * @internal\n */\n _isRenderingStateCompiled(e) {\n const t = e;\n return this._isDisposed || t._isDisposed ? !1 : this._gl.getProgramParameter(t.program, this._caps.parallelShaderCompile.COMPLETION_STATUS_KHR) ? (this._finalizePipelineContext(t), !0) : !1;\n }\n /**\n * @internal\n */\n _executeWhenRenderingStateIsCompiled(e, t) {\n const i = e;\n if (!i.isParallelCompiled) {\n t();\n return;\n }\n const r = i.onCompiled;\n r ? i.onCompiled = () => {\n r(), t();\n } : i.onCompiled = t;\n }\n /**\n * Gets the list of webGL uniform locations associated with a specific program based on a list of uniform names\n * @param pipelineContext defines the pipeline context to use\n * @param uniformsNames defines the list of uniform names\n * @returns an array of webGL uniform locations\n */\n getUniforms(e, t) {\n const i = new Array(), r = e;\n for (let s = 0; s < t.length; s++)\n i.push(this._gl.getUniformLocation(r.program, t[s]));\n return i;\n }\n /**\n * Gets the list of active attributes for a given webGL program\n * @param pipelineContext defines the pipeline context to use\n * @param attributesNames defines the list of attribute names to get\n * @returns an array of indices indicating the offset of each attribute\n */\n getAttributes(e, t) {\n const i = [], r = e;\n for (let s = 0; s < t.length; s++)\n try {\n i.push(this._gl.getAttribLocation(r.program, t[s]));\n } catch {\n i.push(-1);\n }\n return i;\n }\n /**\n * Activates an effect, making it the current one (ie. the one used for rendering)\n * @param effect defines the effect to activate\n */\n enableEffect(e) {\n e = e !== null && ka.IsWrapper(e) ? e.effect : e, !(!e || e === this._currentEffect) && (this._stencilStateComposer.stencilMaterial = void 0, e = e, this.bindSamplers(e), this._currentEffect = e, e.onBind && e.onBind(e), e._onBindObservable && e._onBindObservable.notifyObservers(e));\n }\n /**\n * Set the value of an uniform to a number (int)\n * @param uniform defines the webGL uniform location where to store the value\n * @param value defines the int number to store\n * @returns true if the value was set\n */\n setInt(e, t) {\n return e ? (this._gl.uniform1i(e, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to a int2\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @returns true if the value was set\n */\n setInt2(e, t, i) {\n return e ? (this._gl.uniform2i(e, t, i), !0) : !1;\n }\n /**\n * Set the value of an uniform to a int3\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @param z defines the 3rd component of the value\n * @returns true if the value was set\n */\n setInt3(e, t, i, r) {\n return e ? (this._gl.uniform3i(e, t, i, r), !0) : !1;\n }\n /**\n * Set the value of an uniform to a int4\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @param z defines the 3rd component of the value\n * @param w defines the 4th component of the value\n * @returns true if the value was set\n */\n setInt4(e, t, i, r, s) {\n return e ? (this._gl.uniform4i(e, t, i, r, s), !0) : !1;\n }\n /**\n * Set the value of an uniform to an array of int32\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of int32 to store\n * @returns true if the value was set\n */\n setIntArray(e, t) {\n return e ? (this._gl.uniform1iv(e, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to an array of int32 (stored as vec2)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of int32 to store\n * @returns true if the value was set\n */\n setIntArray2(e, t) {\n return !e || t.length % 2 !== 0 ? !1 : (this._gl.uniform2iv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of int32 (stored as vec3)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of int32 to store\n * @returns true if the value was set\n */\n setIntArray3(e, t) {\n return !e || t.length % 3 !== 0 ? !1 : (this._gl.uniform3iv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of int32 (stored as vec4)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of int32 to store\n * @returns true if the value was set\n */\n setIntArray4(e, t) {\n return !e || t.length % 4 !== 0 ? !1 : (this._gl.uniform4iv(e, t), !0);\n }\n /**\n * Set the value of an uniform to a number (unsigned int)\n * @param uniform defines the webGL uniform location where to store the value\n * @param value defines the unsigned int number to store\n * @returns true if the value was set\n */\n setUInt(e, t) {\n return e ? (this._gl.uniform1ui(e, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to a unsigned int2\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @returns true if the value was set\n */\n setUInt2(e, t, i) {\n return e ? (this._gl.uniform2ui(e, t, i), !0) : !1;\n }\n /**\n * Set the value of an uniform to a unsigned int3\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @param z defines the 3rd component of the value\n * @returns true if the value was set\n */\n setUInt3(e, t, i, r) {\n return e ? (this._gl.uniform3ui(e, t, i, r), !0) : !1;\n }\n /**\n * Set the value of an uniform to a unsigned int4\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @param z defines the 3rd component of the value\n * @param w defines the 4th component of the value\n * @returns true if the value was set\n */\n setUInt4(e, t, i, r, s) {\n return e ? (this._gl.uniform4ui(e, t, i, r, s), !0) : !1;\n }\n /**\n * Set the value of an uniform to an array of unsigned int32\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of unsigned int32 to store\n * @returns true if the value was set\n */\n setUIntArray(e, t) {\n return e ? (this._gl.uniform1uiv(e, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to an array of unsigned int32 (stored as vec2)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of unsigned int32 to store\n * @returns true if the value was set\n */\n setUIntArray2(e, t) {\n return !e || t.length % 2 !== 0 ? !1 : (this._gl.uniform2uiv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of unsigned int32 (stored as vec3)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of unsigned int32 to store\n * @returns true if the value was set\n */\n setUIntArray3(e, t) {\n return !e || t.length % 3 !== 0 ? !1 : (this._gl.uniform3uiv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of unsigned int32 (stored as vec4)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of unsigned int32 to store\n * @returns true if the value was set\n */\n setUIntArray4(e, t) {\n return !e || t.length % 4 !== 0 ? !1 : (this._gl.uniform4uiv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of number\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of number to store\n * @returns true if the value was set\n */\n setArray(e, t) {\n return !e || t.length < 1 ? !1 : (this._gl.uniform1fv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of number (stored as vec2)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of number to store\n * @returns true if the value was set\n */\n setArray2(e, t) {\n return !e || t.length % 2 !== 0 ? !1 : (this._gl.uniform2fv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of number (stored as vec3)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of number to store\n * @returns true if the value was set\n */\n setArray3(e, t) {\n return !e || t.length % 3 !== 0 ? !1 : (this._gl.uniform3fv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of number (stored as vec4)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of number to store\n * @returns true if the value was set\n */\n setArray4(e, t) {\n return !e || t.length % 4 !== 0 ? !1 : (this._gl.uniform4fv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of float32 (stored as matrices)\n * @param uniform defines the webGL uniform location where to store the value\n * @param matrices defines the array of float32 to store\n * @returns true if the value was set\n */\n setMatrices(e, t) {\n return e ? (this._gl.uniformMatrix4fv(e, !1, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to a matrix (3x3)\n * @param uniform defines the webGL uniform location where to store the value\n * @param matrix defines the Float32Array representing the 3x3 matrix to store\n * @returns true if the value was set\n */\n setMatrix3x3(e, t) {\n return e ? (this._gl.uniformMatrix3fv(e, !1, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to a matrix (2x2)\n * @param uniform defines the webGL uniform location where to store the value\n * @param matrix defines the Float32Array representing the 2x2 matrix to store\n * @returns true if the value was set\n */\n setMatrix2x2(e, t) {\n return e ? (this._gl.uniformMatrix2fv(e, !1, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to a number (float)\n * @param uniform defines the webGL uniform location where to store the value\n * @param value defines the float number to store\n * @returns true if the value was transferred\n */\n setFloat(e, t) {\n return e ? (this._gl.uniform1f(e, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to a vec2\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @returns true if the value was set\n */\n setFloat2(e, t, i) {\n return e ? (this._gl.uniform2f(e, t, i), !0) : !1;\n }\n /**\n * Set the value of an uniform to a vec3\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @param z defines the 3rd component of the value\n * @returns true if the value was set\n */\n setFloat3(e, t, i, r) {\n return e ? (this._gl.uniform3f(e, t, i, r), !0) : !1;\n }\n /**\n * Set the value of an uniform to a vec4\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @param z defines the 3rd component of the value\n * @param w defines the 4th component of the value\n * @returns true if the value was set\n */\n setFloat4(e, t, i, r, s) {\n return e ? (this._gl.uniform4f(e, t, i, r, s), !0) : !1;\n }\n // States\n /**\n * Apply all cached states (depth, culling, stencil and alpha)\n */\n applyStates() {\n if (this._depthCullingState.apply(this._gl), this._stencilStateComposer.apply(this._gl), this._alphaState.apply(this._gl), this._colorWriteChanged) {\n this._colorWriteChanged = !1;\n const e = this._colorWrite;\n this._gl.colorMask(e, e, e, e);\n }\n }\n /**\n * Enable or disable color writing\n * @param enable defines the state to set\n */\n setColorWrite(e) {\n e !== this._colorWrite && (this._colorWriteChanged = !0, this._colorWrite = e);\n }\n /**\n * Gets a boolean indicating if color writing is enabled\n * @returns the current color writing state\n */\n getColorWrite() {\n return this._colorWrite;\n }\n /**\n * Gets the depth culling state manager\n */\n get depthCullingState() {\n return this._depthCullingState;\n }\n /**\n * Gets the alpha state manager\n */\n get alphaState() {\n return this._alphaState;\n }\n /**\n * Gets the stencil state manager\n */\n get stencilState() {\n return this._stencilState;\n }\n /**\n * Gets the stencil state composer\n */\n get stencilStateComposer() {\n return this._stencilStateComposer;\n }\n // Textures\n /**\n * Clears the list of texture accessible through engine.\n * This can help preventing texture load conflict due to name collision.\n */\n clearInternalTexturesCache() {\n this._internalTexturesCache.length = 0;\n }\n /**\n * Force the entire cache to be cleared\n * You should not have to use this function unless your engine needs to share the webGL context with another engine\n * @param bruteForce defines a boolean to force clearing ALL caches (including stencil, detoh and alpha states)\n */\n wipeCaches(e) {\n this.preventCacheWipeBetweenFrames && !e || (this._currentEffect = null, this._viewportCached.x = 0, this._viewportCached.y = 0, this._viewportCached.z = 0, this._viewportCached.w = 0, this._unbindVertexArrayObject(), e && (this._currentProgram = null, this.resetTextureCache(), this._stencilStateComposer.reset(), this._depthCullingState.reset(), this._depthCullingState.depthFunc = this._gl.LEQUAL, this._alphaState.reset(), this._alphaMode = 1, this._alphaEquation = 0, this._colorWrite = !0, this._colorWriteChanged = !0, this._unpackFlipYCached = null, this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE), this._gl.pixelStorei(this._gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0), this._mustWipeVertexAttributes = !0, this.unbindAllAttributes()), this._resetVertexBufferBinding(), this._cachedIndexBuffer = null, this._cachedEffectForVertexBuffers = null, this.bindIndexBuffer(null));\n }\n /**\n * @internal\n */\n _getSamplingParameters(e, t) {\n const i = this._gl;\n let r = i.NEAREST, s = i.NEAREST;\n switch (e) {\n case 11:\n r = i.LINEAR, t ? s = i.LINEAR_MIPMAP_NEAREST : s = i.LINEAR;\n break;\n case 3:\n r = i.LINEAR, t ? s = i.LINEAR_MIPMAP_LINEAR : s = i.LINEAR;\n break;\n case 8:\n r = i.NEAREST, t ? s = i.NEAREST_MIPMAP_LINEAR : s = i.NEAREST;\n break;\n case 4:\n r = i.NEAREST, t ? s = i.NEAREST_MIPMAP_NEAREST : s = i.NEAREST;\n break;\n case 5:\n r = i.NEAREST, t ? s = i.LINEAR_MIPMAP_NEAREST : s = i.LINEAR;\n break;\n case 6:\n r = i.NEAREST, t ? s = i.LINEAR_MIPMAP_LINEAR : s = i.LINEAR;\n break;\n case 7:\n r = i.NEAREST, s = i.LINEAR;\n break;\n case 1:\n r = i.NEAREST, s = i.NEAREST;\n break;\n case 9:\n r = i.LINEAR, t ? s = i.NEAREST_MIPMAP_NEAREST : s = i.NEAREST;\n break;\n case 10:\n r = i.LINEAR, t ? s = i.NEAREST_MIPMAP_LINEAR : s = i.NEAREST;\n break;\n case 2:\n r = i.LINEAR, s = i.LINEAR;\n break;\n case 12:\n r = i.LINEAR, s = i.NEAREST;\n break;\n }\n return {\n min: s,\n mag: r\n };\n }\n /** @internal */\n _createTexture() {\n const e = this._gl.createTexture();\n if (!e)\n throw new Error(\"Unable to create texture\");\n return e;\n }\n /** @internal */\n _createHardwareTexture() {\n return new F_(this._createTexture(), this._gl);\n }\n /**\n * Creates an internal texture without binding it to a framebuffer\n * @internal\n * @param size defines the size of the texture\n * @param options defines the options used to create the texture\n * @param delayGPUTextureCreation true to delay the texture creation the first time it is really needed. false to create it right away\n * @param source source type of the texture\n * @returns a new internal texture\n */\n _createInternalTexture(e, t, i = !0, r = Dt.Unknown) {\n let s = !1, a = 0, o = 3, l = 5, c = !1, h = 1, u;\n t !== void 0 && typeof t == \"object\" ? (s = !!t.generateMipMaps, a = t.type === void 0 ? 0 : t.type, o = t.samplingMode === void 0 ? 3 : t.samplingMode, l = t.format === void 0 ? 5 : t.format, c = t.useSRGBBuffer === void 0 ? !1 : t.useSRGBBuffer, h = t.samples ?? 1, u = t.label) : s = !!t, c && (c = this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU)), (a === 1 && !this._caps.textureFloatLinearFiltering || a === 2 && !this._caps.textureHalfFloatLinearFiltering) && (o = 1), a === 1 && !this._caps.textureFloat && (a = 0, ne.Warn(\"Float textures are not supported. Type forced to TEXTURETYPE_UNSIGNED_BYTE\"));\n const f = this._gl, d = new ar(this, r), p = e.width || e, g = e.height || e, m = e.depth || 0, v = e.layers || 0, E = this._getSamplingParameters(o, s), C = v !== 0 ? f.TEXTURE_2D_ARRAY : m !== 0 ? f.TEXTURE_3D : f.TEXTURE_2D, T = this._getRGBABufferInternalSizedFormat(a, l, c), R = this._getInternalFormat(l), x = this._getWebGLTextureType(a);\n return this._bindTextureDirectly(C, d), v !== 0 ? (d.is2DArray = !0, f.texImage3D(C, 0, T, p, g, v, 0, R, x, null)) : m !== 0 ? (d.is3D = !0, f.texImage3D(C, 0, T, p, g, m, 0, R, x, null)) : f.texImage2D(C, 0, T, p, g, 0, R, x, null), f.texParameteri(C, f.TEXTURE_MAG_FILTER, E.mag), f.texParameteri(C, f.TEXTURE_MIN_FILTER, E.min), f.texParameteri(C, f.TEXTURE_WRAP_S, f.CLAMP_TO_EDGE), f.texParameteri(C, f.TEXTURE_WRAP_T, f.CLAMP_TO_EDGE), s && this._gl.generateMipmap(C), this._bindTextureDirectly(C, null), d._useSRGBBuffer = c, d.baseWidth = p, d.baseHeight = g, d.width = p, d.height = g, d.depth = v, d.isReady = !0, d.samples = h, d.generateMipMaps = s, d.samplingMode = o, d.type = a, d.format = l, d.label = u, this._internalTexturesCache.push(d), d;\n }\n /**\n * @internal\n */\n _getUseSRGBBuffer(e, t) {\n return e && this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU || t);\n }\n _createTextureBase(e, t, i, r, s = 3, a = null, o = null, l, c, h = null, u = null, f = null, d = null, p, g, m) {\n e = e || \"\";\n const v = e.substr(0, 5) === \"data:\", E = e.substr(0, 5) === \"blob:\", C = v && e.indexOf(\";base64,\") !== -1, T = u || new ar(this, Dt.Url);\n T !== u && (T.label = e.substring(0, 60));\n const R = e;\n this._transformTextureUrl && !C && !u && !h && (e = this._transformTextureUrl(e)), R !== e && (T._originalUrl = R);\n const x = e.lastIndexOf(\".\");\n let S = d || (x > -1 ? e.substring(x).toLowerCase() : \"\"), M = null;\n S.indexOf(\"?\") > -1 && (S = S.split(\"?\")[0]);\n for (const K of De._TextureLoaders)\n if (K.canLoad(S, p)) {\n M = K;\n break;\n }\n r && r.addPendingData(T), T.url = e, T.generateMipMaps = !t, T.samplingMode = s, T.invertY = i, T._useSRGBBuffer = this._getUseSRGBBuffer(!!m, t), this._doNotHandleContextLost || (T._buffer = h);\n let F = null;\n a && !u && (F = T.onLoadedObservable.add(a)), u || this._internalTexturesCache.push(T);\n const L = (K, q) => {\n r && r.removePendingData(T), e === R ? (F && T.onLoadedObservable.remove(F), st.UseFallbackTexture && e !== st.FallbackTexture && this._createTextureBase(st.FallbackTexture, t, T.invertY, r, s, null, o, l, c, h, T), K = (K || \"Unknown error\") + (st.UseFallbackTexture ? \" - Fallback texture was used\" : \"\"), T.onErrorObservable.notifyObservers({ message: K, exception: q }), o && o(K, q)) : (ne.Warn(`Failed to load ${e}, falling back to ${R}`), this._createTextureBase(R, t, T.invertY, r, s, a, o, l, c, h, T, f, d, p, g, m));\n };\n if (M) {\n const K = (q) => {\n M.loadData(q, T, (j, k, Q, ce, de, Z) => {\n Z ? L(\"TextureLoader failed to load data\") : l(T, S, r, { width: j, height: k }, T.invertY, !Q, ce, () => (de(), !1), s);\n }, g);\n };\n h ? h instanceof ArrayBuffer ? K(new Uint8Array(h)) : ArrayBuffer.isView(h) ? K(h) : o && o(\"Unable to load: only ArrayBuffer or ArrayBufferView is supported\", null) : this._loadFile(e, (q) => K(new Uint8Array(q)), void 0, r ? r.offlineProvider : void 0, !0, (q, j) => {\n L(\"Unable to load \" + (q && q.responseURL, j));\n });\n } else {\n const K = (q) => {\n E && !this._doNotHandleContextLost && (T._buffer = q), l(T, S, r, q, T.invertY, t, !1, c, s);\n };\n !v || C ? h && (typeof h.decoding == \"string\" || h.close) ? K(h) : De._FileToolsLoadImage(e, K, L, r ? r.offlineProvider : null, p, T.invertY && this._features.needsInvertingBitmap ? { imageOrientation: \"flipY\" } : void 0) : typeof h == \"string\" || h instanceof ArrayBuffer || ArrayBuffer.isView(h) || h instanceof Blob ? De._FileToolsLoadImage(h, K, L, r ? r.offlineProvider : null, p, T.invertY && this._features.needsInvertingBitmap ? { imageOrientation: \"flipY\" } : void 0) : h && K(h);\n }\n return T;\n }\n /**\n * Usually called from Texture.ts.\n * Passed information to create a WebGLTexture\n * @param url defines a value which contains one of the following:\n * * A conventional http URL, e.g. 'http://...' or 'file://...'\n * * A base64 string of in-line texture data, e.g. 'data:image/jpg;base64,/...'\n * * An indicator that data being passed using the buffer parameter, e.g. 'data:mytexture.jpg'\n * @param noMipmap defines a boolean indicating that no mipmaps shall be generated. Ignored for compressed textures. They must be in the file\n * @param invertY when true, image is flipped when loaded. You probably want true. Certain compressed textures may invert this if their default is inverted (eg. ktx)\n * @param scene needed for loading to the correct scene\n * @param samplingMode mode with should be used sample / access the texture (Default: Texture.TRILINEAR_SAMPLINGMODE)\n * @param onLoad optional callback to be called upon successful completion\n * @param onError optional callback to be called upon failure\n * @param buffer a source of a file previously fetched as either a base64 string, an ArrayBuffer (compressed or image format), HTMLImageElement (image format), or a Blob\n * @param fallback an internal argument in case the function must be called again, due to etc1 not having alpha capabilities\n * @param format internal format. Default: RGB when extension is '.jpg' else RGBA. Ignored for compressed textures\n * @param forcedExtension defines the extension to use to pick the right loader\n * @param mimeType defines an optional mime type\n * @param loaderOptions options to be passed to the loader\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\n * @returns a InternalTexture for assignment back into BABYLON.Texture\n */\n createTexture(e, t, i, r, s = 3, a = null, o = null, l = null, c = null, h = null, u = null, f, d, p, g) {\n return this._createTextureBase(e, t, i, r, s, a, o, this._prepareWebGLTexture.bind(this), (m, v, E, C, T, R) => {\n const x = this._gl, S = E.width === m && E.height === v;\n T._creationFlags = p ?? 0;\n const M = this._getTexImageParametersForCreateTexture(h, C, T._useSRGBBuffer);\n if (S)\n return x.texImage2D(x.TEXTURE_2D, 0, M.internalFormat, M.format, M.type, E), !1;\n const N = this._caps.maxTextureSize;\n if (E.width > N || E.height > N || !this._supportsHardwareTextureRescaling)\n return this._prepareWorkingCanvas(), !this._workingCanvas || !this._workingContext || (this._workingCanvas.width = m, this._workingCanvas.height = v, this._workingContext.drawImage(E, 0, 0, E.width, E.height, 0, 0, m, v), x.texImage2D(x.TEXTURE_2D, 0, M.internalFormat, M.format, M.type, this._workingCanvas), T.width = m, T.height = v), !1;\n {\n const F = new ar(this, Dt.Temp);\n this._bindTextureDirectly(x.TEXTURE_2D, F, !0), x.texImage2D(x.TEXTURE_2D, 0, M.internalFormat, M.format, M.type, E), this._rescaleTexture(F, T, r, M.format, () => {\n this._releaseTexture(F), this._bindTextureDirectly(x.TEXTURE_2D, T, !0), R();\n });\n }\n return !0;\n }, l, c, h, u, f, d, g);\n }\n /**\n * Calls to the GL texImage2D and texImage3D functions require three arguments describing the pixel format of the texture.\n * createTexture derives these from the babylonFormat and useSRGBBuffer arguments and also the file extension of the URL it's working with.\n * This function encapsulates that derivation for easy unit testing.\n * @param babylonFormat Babylon's format enum, as specified in ITextureCreationOptions.\n * @param fileExtension The file extension including the dot, e.g. .jpg.\n * @param useSRGBBuffer Use SRGB not linear.\n * @returns The options to pass to texImage2D or texImage3D calls.\n * @internal\n */\n _getTexImageParametersForCreateTexture(e, t, i) {\n e == null && (e = t === \".jpg\" && !i ? 4 : 5);\n let r, s;\n return this.webGLVersion === 1 ? (r = this._getInternalFormat(e, i), s = r) : (r = this._getInternalFormat(e, !1), s = this._getRGBABufferInternalSizedFormat(0, e, i)), {\n internalFormat: s,\n format: r,\n type: this._gl.UNSIGNED_BYTE\n };\n }\n /**\n * Loads an image as an HTMLImageElement.\n * @param input url string, ArrayBuffer, or Blob to load\n * @param onLoad callback called when the image successfully loads\n * @param onError callback called when the image fails to load\n * @param offlineProvider offline provider for caching\n * @param mimeType optional mime type\n * @param imageBitmapOptions optional the options to use when creating an ImageBitmap\n * @returns the HTMLImageElement of the loaded image\n * @internal\n */\n static _FileToolsLoadImage(e, t, i, r, s, a) {\n throw We(\"FileTools\");\n }\n /**\n * @internal\n */\n _rescaleTexture(e, t, i, r, s) {\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a raw texture\n * @param data defines the data to store in the texture\n * @param width defines the width of the texture\n * @param height defines the height of the texture\n * @param format defines the format of the data\n * @param generateMipMaps defines if the engine should generate the mip levels\n * @param invertY defines if data must be stored with Y axis inverted\n * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default)\n * @param compression defines the compression used (null by default)\n * @param type defines the type fo the data (Engine.TEXTURETYPE_UNSIGNED_INT by default)\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\n * @returns the raw texture inside an InternalTexture\n */\n createRawTexture(e, t, i, r, s, a, o, l = null, c = 0, h = 0, u = !1) {\n throw We(\"Engine.RawTexture\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a new raw cube texture\n * @param data defines the array of data to use to create each face\n * @param size defines the size of the textures\n * @param format defines the format of the data\n * @param type defines the type of the data (like Engine.TEXTURETYPE_UNSIGNED_INT)\n * @param generateMipMaps defines if the engine should generate the mip levels\n * @param invertY defines if data must be stored with Y axis inverted\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\n * @param compression defines the compression used (null by default)\n * @returns the cube texture as an InternalTexture\n */\n createRawCubeTexture(e, t, i, r, s, a, o, l = null) {\n throw We(\"Engine.RawTexture\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a new raw 3D texture\n * @param data defines the data used to create the texture\n * @param width defines the width of the texture\n * @param height defines the height of the texture\n * @param depth defines the depth of the texture\n * @param format defines the format of the texture\n * @param generateMipMaps defines if the engine must generate mip levels\n * @param invertY defines if data must be stored with Y axis inverted\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\n * @param compression defines the compressed used (can be null)\n * @param textureType defines the compressed used (can be null)\n * @returns a new raw 3D texture (stored in an InternalTexture)\n */\n createRawTexture3D(e, t, i, r, s, a, o, l, c = null, h = 0) {\n throw We(\"Engine.RawTexture\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a new raw 2D array texture\n * @param data defines the data used to create the texture\n * @param width defines the width of the texture\n * @param height defines the height of the texture\n * @param depth defines the number of layers of the texture\n * @param format defines the format of the texture\n * @param generateMipMaps defines if the engine must generate mip levels\n * @param invertY defines if data must be stored with Y axis inverted\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\n * @param compression defines the compressed used (can be null)\n * @param textureType defines the compressed used (can be null)\n * @returns a new raw 2D array texture (stored in an InternalTexture)\n */\n createRawTexture2DArray(e, t, i, r, s, a, o, l, c = null, h = 0) {\n throw We(\"Engine.RawTexture\");\n }\n /**\n * @internal\n */\n _unpackFlipY(e) {\n this._unpackFlipYCached !== e && (this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, e ? 1 : 0), this.enableUnpackFlipYCached && (this._unpackFlipYCached = e));\n }\n /** @internal */\n _getUnpackAlignement() {\n return this._gl.getParameter(this._gl.UNPACK_ALIGNMENT);\n }\n _getTextureTarget(e) {\n return e.isCube ? this._gl.TEXTURE_CUBE_MAP : e.is3D ? this._gl.TEXTURE_3D : e.is2DArray || e.isMultiview ? this._gl.TEXTURE_2D_ARRAY : this._gl.TEXTURE_2D;\n }\n /**\n * Update the sampling mode of a given texture\n * @param samplingMode defines the required sampling mode\n * @param texture defines the texture to update\n * @param generateMipMaps defines whether to generate mipmaps for the texture\n */\n updateTextureSamplingMode(e, t, i = !1) {\n const r = this._getTextureTarget(t), s = this._getSamplingParameters(e, t.useMipMaps || i);\n this._setTextureParameterInteger(r, this._gl.TEXTURE_MAG_FILTER, s.mag, t), this._setTextureParameterInteger(r, this._gl.TEXTURE_MIN_FILTER, s.min), i && (t.generateMipMaps = !0, this._gl.generateMipmap(r)), this._bindTextureDirectly(r, null), t.samplingMode = e;\n }\n /**\n * Update the dimensions of a texture\n * @param texture texture to update\n * @param width new width of the texture\n * @param height new height of the texture\n * @param depth new depth of the texture\n */\n updateTextureDimensions(e, t, i, r = 1) {\n }\n /**\n * Update the sampling mode of a given texture\n * @param texture defines the texture to update\n * @param wrapU defines the texture wrap mode of the u coordinates\n * @param wrapV defines the texture wrap mode of the v coordinates\n * @param wrapR defines the texture wrap mode of the r coordinates\n */\n updateTextureWrappingMode(e, t, i = null, r = null) {\n const s = this._getTextureTarget(e);\n t !== null && (this._setTextureParameterInteger(s, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(t), e), e._cachedWrapU = t), i !== null && (this._setTextureParameterInteger(s, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(i), e), e._cachedWrapV = i), (e.is2DArray || e.is3D) && r !== null && (this._setTextureParameterInteger(s, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(r), e), e._cachedWrapR = r), this._bindTextureDirectly(s, null);\n }\n /**\n * @internal\n */\n _setupDepthStencilTexture(e, t, i, r, s, a = 1) {\n const o = t.width || t, l = t.height || t, c = t.layers || 0, h = t.depth || 0;\n e.baseWidth = o, e.baseHeight = l, e.width = o, e.height = l, e.is2DArray = c > 0, e.depth = c || h, e.isReady = !0, e.samples = a, e.generateMipMaps = !1, e.samplingMode = r ? 2 : 1, e.type = 0, e._comparisonFunction = s;\n const u = this._gl, f = this._getTextureTarget(e), d = this._getSamplingParameters(e.samplingMode, !1);\n u.texParameteri(f, u.TEXTURE_MAG_FILTER, d.mag), u.texParameteri(f, u.TEXTURE_MIN_FILTER, d.min), u.texParameteri(f, u.TEXTURE_WRAP_S, u.CLAMP_TO_EDGE), u.texParameteri(f, u.TEXTURE_WRAP_T, u.CLAMP_TO_EDGE), this.webGLVersion > 1 && (s === 0 ? (u.texParameteri(f, u.TEXTURE_COMPARE_FUNC, 515), u.texParameteri(f, u.TEXTURE_COMPARE_MODE, u.NONE)) : (u.texParameteri(f, u.TEXTURE_COMPARE_FUNC, s), u.texParameteri(f, u.TEXTURE_COMPARE_MODE, u.COMPARE_REF_TO_TEXTURE)));\n }\n /**\n * @internal\n */\n _uploadCompressedDataToTextureDirectly(e, t, i, r, s, a = 0, o = 0) {\n const l = this._gl;\n let c = l.TEXTURE_2D;\n if (e.isCube && (c = l.TEXTURE_CUBE_MAP_POSITIVE_X + a), e._useSRGBBuffer)\n switch (t) {\n case 37492:\n case 36196:\n this._caps.etc2 ? t = l.COMPRESSED_SRGB8_ETC2 : e._useSRGBBuffer = !1;\n break;\n case 37496:\n this._caps.etc2 ? t = l.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : e._useSRGBBuffer = !1;\n break;\n case 36492:\n t = l.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT;\n break;\n case 37808:\n t = l.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;\n break;\n case 33776:\n this._caps.s3tc_srgb ? t = l.COMPRESSED_SRGB_S3TC_DXT1_EXT : e._useSRGBBuffer = !1;\n break;\n case 33777:\n this._caps.s3tc_srgb ? t = l.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT : e._useSRGBBuffer = !1;\n break;\n case 33779:\n this._caps.s3tc_srgb ? t = l.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT : e._useSRGBBuffer = !1;\n break;\n default:\n e._useSRGBBuffer = !1;\n break;\n }\n this._gl.compressedTexImage2D(c, o, t, i, r, 0, s);\n }\n /**\n * @internal\n */\n _uploadDataToTextureDirectly(e, t, i = 0, r = 0, s, a = !1) {\n const o = this._gl, l = this._getWebGLTextureType(e.type), c = this._getInternalFormat(e.format), h = s === void 0 ? this._getRGBABufferInternalSizedFormat(e.type, e.format, e._useSRGBBuffer) : this._getInternalFormat(s, e._useSRGBBuffer);\n this._unpackFlipY(e.invertY);\n let u = o.TEXTURE_2D;\n e.isCube && (u = o.TEXTURE_CUBE_MAP_POSITIVE_X + i);\n const f = Math.round(Math.log(e.width) * Math.LOG2E), d = Math.round(Math.log(e.height) * Math.LOG2E), p = a ? e.width : Math.pow(2, Math.max(f - r, 0)), g = a ? e.height : Math.pow(2, Math.max(d - r, 0));\n o.texImage2D(u, r, h, p, g, 0, c, l, t);\n }\n /**\n * Update a portion of an internal texture\n * @param texture defines the texture to update\n * @param imageData defines the data to store into the texture\n * @param xOffset defines the x coordinates of the update rectangle\n * @param yOffset defines the y coordinates of the update rectangle\n * @param width defines the width of the update rectangle\n * @param height defines the height of the update rectangle\n * @param faceIndex defines the face index if texture is a cube (0 by default)\n * @param lod defines the lod level to update (0 by default)\n * @param generateMipMaps defines whether to generate mipmaps or not\n */\n updateTextureData(e, t, i, r, s, a, o = 0, l = 0, c = !1) {\n const h = this._gl, u = this._getWebGLTextureType(e.type), f = this._getInternalFormat(e.format);\n this._unpackFlipY(e.invertY);\n let d = h.TEXTURE_2D, p = h.TEXTURE_2D;\n e.isCube && (p = h.TEXTURE_CUBE_MAP_POSITIVE_X + o, d = h.TEXTURE_CUBE_MAP), this._bindTextureDirectly(d, e, !0), h.texSubImage2D(p, l, i, r, s, a, f, u, t), c && this._gl.generateMipmap(p), this._bindTextureDirectly(d, null);\n }\n /**\n * @internal\n */\n _uploadArrayBufferViewToTexture(e, t, i = 0, r = 0) {\n const s = this._gl, a = e.isCube ? s.TEXTURE_CUBE_MAP : s.TEXTURE_2D;\n this._bindTextureDirectly(a, e, !0), this._uploadDataToTextureDirectly(e, t, i, r), this._bindTextureDirectly(a, null, !0);\n }\n _prepareWebGLTextureContinuation(e, t, i, r, s) {\n const a = this._gl;\n if (!a)\n return;\n const o = this._getSamplingParameters(s, !i);\n a.texParameteri(a.TEXTURE_2D, a.TEXTURE_MAG_FILTER, o.mag), a.texParameteri(a.TEXTURE_2D, a.TEXTURE_MIN_FILTER, o.min), !i && !r && a.generateMipmap(a.TEXTURE_2D), this._bindTextureDirectly(a.TEXTURE_2D, null), t && t.removePendingData(e), e.onLoadedObservable.notifyObservers(e), e.onLoadedObservable.clear();\n }\n _prepareWebGLTexture(e, t, i, r, s, a, o, l, c = 3) {\n const h = this.getCaps().maxTextureSize, u = Math.min(h, this.needPOTTextures ? De.GetExponentOfTwo(r.width, h) : r.width), f = Math.min(h, this.needPOTTextures ? De.GetExponentOfTwo(r.height, h) : r.height), d = this._gl;\n if (d) {\n if (!e._hardwareTexture) {\n i && i.removePendingData(e);\n return;\n }\n this._bindTextureDirectly(d.TEXTURE_2D, e, !0), this._unpackFlipY(s === void 0 ? !0 : !!s), e.baseWidth = r.width, e.baseHeight = r.height, e.width = u, e.height = f, e.isReady = !0, e.type = e.type !== -1 ? e.type : 0, e.format = e.format !== -1 ? e.format : t === \".jpg\" && !e._useSRGBBuffer ? 4 : 5, !l(u, f, r, t, e, () => {\n this._prepareWebGLTextureContinuation(e, i, a, o, c);\n }) && this._prepareWebGLTextureContinuation(e, i, a, o, c);\n }\n }\n /**\n * @internal\n */\n _setupFramebufferDepthAttachments(e, t, i, r, s = 1) {\n const a = this._gl;\n if (e && t)\n return this._createRenderBuffer(i, r, s, a.DEPTH_STENCIL, a.DEPTH24_STENCIL8, a.DEPTH_STENCIL_ATTACHMENT);\n if (t) {\n let o = a.DEPTH_COMPONENT16;\n return this._webGLVersion > 1 && (o = a.DEPTH_COMPONENT32F), this._createRenderBuffer(i, r, s, o, o, a.DEPTH_ATTACHMENT);\n }\n return e ? this._createRenderBuffer(i, r, s, a.STENCIL_INDEX8, a.STENCIL_INDEX8, a.STENCIL_ATTACHMENT) : null;\n }\n /**\n * @internal\n */\n _createRenderBuffer(e, t, i, r, s, a, o = !0) {\n const c = this._gl.createRenderbuffer();\n return this._updateRenderBuffer(c, e, t, i, r, s, a, o);\n }\n _updateRenderBuffer(e, t, i, r, s, a, o, l = !0) {\n const c = this._gl;\n return c.bindRenderbuffer(c.RENDERBUFFER, e), r > 1 && c.renderbufferStorageMultisample ? c.renderbufferStorageMultisample(c.RENDERBUFFER, r, a, t, i) : c.renderbufferStorage(c.RENDERBUFFER, s, t, i), c.framebufferRenderbuffer(c.FRAMEBUFFER, o, c.RENDERBUFFER, e), l && c.bindRenderbuffer(c.RENDERBUFFER, null), e;\n }\n /**\n * @internal\n */\n _releaseTexture(e) {\n var i;\n this._deleteTexture((i = e._hardwareTexture) == null ? void 0 : i.underlyingResource), this.unbindAllTextures();\n const t = this._internalTexturesCache.indexOf(e);\n t !== -1 && this._internalTexturesCache.splice(t, 1), e._lodTextureHigh && e._lodTextureHigh.dispose(), e._lodTextureMid && e._lodTextureMid.dispose(), e._lodTextureLow && e._lodTextureLow.dispose(), e._irradianceTexture && e._irradianceTexture.dispose();\n }\n /**\n * @internal\n */\n _releaseRenderTargetWrapper(e) {\n const t = this._renderTargetWrapperCache.indexOf(e);\n t !== -1 && this._renderTargetWrapperCache.splice(t, 1);\n }\n _deleteTexture(e) {\n e && this._gl.deleteTexture(e);\n }\n _setProgram(e) {\n this._currentProgram !== e && (this._gl.useProgram(e), this._currentProgram = e);\n }\n /**\n * Binds an effect to the webGL context\n * @param effect defines the effect to bind\n */\n bindSamplers(e) {\n const t = e.getPipelineContext();\n this._setProgram(t.program);\n const i = e.getSamplers();\n for (let r = 0; r < i.length; r++) {\n const s = e.getUniform(i[r]);\n s && (this._boundUniforms[r] = s);\n }\n this._currentEffect = null;\n }\n _activateCurrentTexture() {\n this._currentTextureChannel !== this._activeChannel && (this._gl.activeTexture(this._gl.TEXTURE0 + this._activeChannel), this._currentTextureChannel = this._activeChannel);\n }\n /**\n * @internal\n */\n _bindTextureDirectly(e, t, i = !1, r = !1) {\n var l;\n let s = !1;\n const a = t && t._associatedChannel > -1;\n if (i && a && (this._activeChannel = t._associatedChannel), this._boundTexturesCache[this._activeChannel] !== t || r) {\n if (this._activateCurrentTexture(), t && t.isMultiview)\n throw ne.Error([\"_bindTextureDirectly called with a multiview texture!\", e, t]), \"_bindTextureDirectly called with a multiview texture!\";\n this._gl.bindTexture(e, ((l = t == null ? void 0 : t._hardwareTexture) == null ? void 0 : l.underlyingResource) ?? null), this._boundTexturesCache[this._activeChannel] = t, t && (t._associatedChannel = this._activeChannel);\n } else\n i && (s = !0, this._activateCurrentTexture());\n return a && !i && this._bindSamplerUniformToChannel(t._associatedChannel, this._activeChannel), s;\n }\n /**\n * @internal\n */\n _bindTexture(e, t, i) {\n if (e === void 0)\n return;\n t && (t._associatedChannel = e), this._activeChannel = e;\n const r = t ? this._getTextureTarget(t) : this._gl.TEXTURE_2D;\n this._bindTextureDirectly(r, t);\n }\n /**\n * Unbind all textures from the webGL context\n */\n unbindAllTextures() {\n for (let e = 0; e < this._maxSimultaneousTextures; e++)\n this._activeChannel = e, this._bindTextureDirectly(this._gl.TEXTURE_2D, null), this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null), this.webGLVersion > 1 && (this._bindTextureDirectly(this._gl.TEXTURE_3D, null), this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null));\n }\n /**\n * Sets a texture to the according uniform.\n * @param channel The texture channel\n * @param uniform The uniform to set\n * @param texture The texture to apply\n * @param name The name of the uniform in the effect\n */\n setTexture(e, t, i, r) {\n e !== void 0 && (t && (this._boundUniforms[e] = t), this._setTexture(e, i));\n }\n _bindSamplerUniformToChannel(e, t) {\n const i = this._boundUniforms[e];\n !i || i._currentState === t || (this._gl.uniform1i(i, t), i._currentState = t);\n }\n _getTextureWrapMode(e) {\n switch (e) {\n case 1:\n return this._gl.REPEAT;\n case 0:\n return this._gl.CLAMP_TO_EDGE;\n case 2:\n return this._gl.MIRRORED_REPEAT;\n }\n return this._gl.REPEAT;\n }\n _setTexture(e, t, i = !1, r = !1, s = \"\") {\n if (!t)\n return this._boundTexturesCache[e] != null && (this._activeChannel = e, this._bindTextureDirectly(this._gl.TEXTURE_2D, null), this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null), this.webGLVersion > 1 && (this._bindTextureDirectly(this._gl.TEXTURE_3D, null), this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null))), !1;\n if (t.video) {\n this._activeChannel = e;\n const c = t.getInternalTexture();\n c && (c._associatedChannel = e), t.update();\n } else if (t.delayLoadState === 4)\n return t.delayLoad(), !1;\n let a;\n r ? a = t.depthStencilTexture : t.isReady() ? a = t.getInternalTexture() : t.isCube ? a = this.emptyCubeTexture : t.is3D ? a = this.emptyTexture3D : t.is2DArray ? a = this.emptyTexture2DArray : a = this.emptyTexture, !i && a && (a._associatedChannel = e);\n let o = !0;\n this._boundTexturesCache[e] === a && (i || this._bindSamplerUniformToChannel(a._associatedChannel, e), o = !1), this._activeChannel = e;\n const l = this._getTextureTarget(a);\n if (o && this._bindTextureDirectly(l, a, i), a && !a.isMultiview) {\n if (a.isCube && a._cachedCoordinatesMode !== t.coordinatesMode) {\n a._cachedCoordinatesMode = t.coordinatesMode;\n const c = t.coordinatesMode !== 3 && t.coordinatesMode !== 5 ? 1 : 0;\n t.wrapU = c, t.wrapV = c;\n }\n a._cachedWrapU !== t.wrapU && (a._cachedWrapU = t.wrapU, this._setTextureParameterInteger(l, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(t.wrapU), a)), a._cachedWrapV !== t.wrapV && (a._cachedWrapV = t.wrapV, this._setTextureParameterInteger(l, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(t.wrapV), a)), a.is3D && a._cachedWrapR !== t.wrapR && (a._cachedWrapR = t.wrapR, this._setTextureParameterInteger(l, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(t.wrapR), a)), this._setAnisotropicLevel(l, a, t.anisotropicFilteringLevel);\n }\n return !0;\n }\n /**\n * Sets an array of texture to the webGL context\n * @param channel defines the channel where the texture array must be set\n * @param uniform defines the associated uniform location\n * @param textures defines the array of textures to bind\n * @param name name of the channel\n */\n setTextureArray(e, t, i, r) {\n if (!(e === void 0 || !t)) {\n (!this._textureUnits || this._textureUnits.length !== i.length) && (this._textureUnits = new Int32Array(i.length));\n for (let s = 0; s < i.length; s++) {\n const a = i[s].getInternalTexture();\n a ? (this._textureUnits[s] = e + s, a._associatedChannel = e + s) : this._textureUnits[s] = -1;\n }\n this._gl.uniform1iv(t, this._textureUnits);\n for (let s = 0; s < i.length; s++)\n this._setTexture(this._textureUnits[s], i[s], !0);\n }\n }\n /**\n * @internal\n */\n _setAnisotropicLevel(e, t, i) {\n const r = this._caps.textureAnisotropicFilterExtension;\n t.samplingMode !== 11 && t.samplingMode !== 3 && t.samplingMode !== 2 && (i = 1), r && t._cachedAnisotropicFilteringLevel !== i && (this._setTextureParameterFloat(e, r.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(i, this._caps.maxAnisotropy), t), t._cachedAnisotropicFilteringLevel = i);\n }\n _setTextureParameterFloat(e, t, i, r) {\n this._bindTextureDirectly(e, r, !0, !0), this._gl.texParameterf(e, t, i);\n }\n _setTextureParameterInteger(e, t, i, r) {\n r && this._bindTextureDirectly(e, r, !0, !0), this._gl.texParameteri(e, t, i);\n }\n /**\n * Unbind all vertex attributes from the webGL context\n */\n unbindAllAttributes() {\n if (this._mustWipeVertexAttributes) {\n this._mustWipeVertexAttributes = !1;\n for (let e = 0; e < this._caps.maxVertexAttribs; e++)\n this.disableAttributeByIndex(e);\n return;\n }\n for (let e = 0, t = this._vertexAttribArraysEnabled.length; e < t; e++)\n e >= this._caps.maxVertexAttribs || !this._vertexAttribArraysEnabled[e] || this.disableAttributeByIndex(e);\n }\n /**\n * Force the engine to release all cached effects. This means that next effect compilation will have to be done completely even if a similar effect was already compiled\n */\n releaseEffects() {\n for (const e in this._compiledEffects) {\n const t = this._compiledEffects[e].getPipelineContext();\n this._deletePipelineContext(t);\n }\n this._compiledEffects = {};\n }\n /**\n * Dispose and release all associated resources\n */\n dispose() {\n var e, t;\n this._isDisposed = !0, this.stopRenderLoop(), this.onBeforeTextureInitObservable && this.onBeforeTextureInitObservable.clear(), this._emptyTexture && (this._releaseTexture(this._emptyTexture), this._emptyTexture = null), this._emptyCubeTexture && (this._releaseTexture(this._emptyCubeTexture), this._emptyCubeTexture = null), this._dummyFramebuffer && this._gl.deleteFramebuffer(this._dummyFramebuffer), this.releaseEffects(), (e = this.releaseComputeEffects) == null || e.call(this), this.unbindAllAttributes(), this._boundUniforms = {}, yi() && this._renderingCanvas && (this._doNotHandleContextLost || (this._renderingCanvas.removeEventListener(\"webglcontextlost\", this._onContextLost), this._renderingCanvas.removeEventListener(\"webglcontextrestored\", this._onContextRestored)), window.removeEventListener(\"resize\", this._checkForMobile)), this._workingCanvas = null, this._workingContext = null, this._currentBufferPointers.length = 0, this._renderingCanvas = null, this._currentProgram = null, this._boundRenderFunction = null, Hi.ResetCache();\n for (const i of this._activeRequests)\n i.abort();\n this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear(), this._creationOptions.loseContextOnDispose && ((t = this._gl.getExtension(\"WEBGL_lose_context\")) == null || t.loseContext());\n }\n /**\n * Attach a new callback raised when context lost event is fired\n * @param callback defines the callback to call\n */\n attachContextLostEvent(e) {\n this._renderingCanvas && this._renderingCanvas.addEventListener(\"webglcontextlost\", e, !1);\n }\n /**\n * Attach a new callback raised when context restored event is fired\n * @param callback defines the callback to call\n */\n attachContextRestoredEvent(e) {\n this._renderingCanvas && this._renderingCanvas.addEventListener(\"webglcontextrestored\", e, !1);\n }\n /**\n * Get the current error code of the webGL context\n * @returns the error code\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError\n */\n getError() {\n return this._gl.getError();\n }\n _canRenderToFloatFramebuffer() {\n return this._webGLVersion > 1 ? this._caps.colorBufferFloat : this._canRenderToFramebuffer(1);\n }\n _canRenderToHalfFloatFramebuffer() {\n return this._webGLVersion > 1 ? this._caps.colorBufferFloat : this._canRenderToFramebuffer(2);\n }\n // Thank you : http://stackoverflow.com/questions/28827511/webgl-ios-render-to-floating-point-texture\n _canRenderToFramebuffer(e) {\n const t = this._gl;\n for (; t.getError() !== t.NO_ERROR; )\n ;\n let i = !0;\n const r = t.createTexture();\n t.bindTexture(t.TEXTURE_2D, r), t.texImage2D(t.TEXTURE_2D, 0, this._getRGBABufferInternalSizedFormat(e), 1, 1, 0, t.RGBA, this._getWebGLTextureType(e), null), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MIN_FILTER, t.NEAREST), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MAG_FILTER, t.NEAREST);\n const s = t.createFramebuffer();\n t.bindFramebuffer(t.FRAMEBUFFER, s), t.framebufferTexture2D(t.FRAMEBUFFER, t.COLOR_ATTACHMENT0, t.TEXTURE_2D, r, 0);\n const a = t.checkFramebufferStatus(t.FRAMEBUFFER);\n if (i = i && a === t.FRAMEBUFFER_COMPLETE, i = i && t.getError() === t.NO_ERROR, i && (t.clear(t.COLOR_BUFFER_BIT), i = i && t.getError() === t.NO_ERROR), i) {\n t.bindFramebuffer(t.FRAMEBUFFER, null);\n const o = t.RGBA, l = t.UNSIGNED_BYTE, c = new Uint8Array(4);\n t.readPixels(0, 0, 1, 1, o, l, c), i = i && t.getError() === t.NO_ERROR;\n }\n for (t.deleteTexture(r), t.deleteFramebuffer(s), t.bindFramebuffer(t.FRAMEBUFFER, null); !i && t.getError() !== t.NO_ERROR; )\n ;\n return i;\n }\n /**\n * @internal\n */\n _getWebGLTextureType(e) {\n if (this._webGLVersion === 1) {\n switch (e) {\n case 1:\n return this._gl.FLOAT;\n case 2:\n return this._gl.HALF_FLOAT_OES;\n case 0:\n return this._gl.UNSIGNED_BYTE;\n case 8:\n return this._gl.UNSIGNED_SHORT_4_4_4_4;\n case 9:\n return this._gl.UNSIGNED_SHORT_5_5_5_1;\n case 10:\n return this._gl.UNSIGNED_SHORT_5_6_5;\n }\n return this._gl.UNSIGNED_BYTE;\n }\n switch (e) {\n case 3:\n return this._gl.BYTE;\n case 0:\n return this._gl.UNSIGNED_BYTE;\n case 4:\n return this._gl.SHORT;\n case 5:\n return this._gl.UNSIGNED_SHORT;\n case 6:\n return this._gl.INT;\n case 7:\n return this._gl.UNSIGNED_INT;\n case 1:\n return this._gl.FLOAT;\n case 2:\n return this._gl.HALF_FLOAT;\n case 8:\n return this._gl.UNSIGNED_SHORT_4_4_4_4;\n case 9:\n return this._gl.UNSIGNED_SHORT_5_5_5_1;\n case 10:\n return this._gl.UNSIGNED_SHORT_5_6_5;\n case 11:\n return this._gl.UNSIGNED_INT_2_10_10_10_REV;\n case 12:\n return this._gl.UNSIGNED_INT_24_8;\n case 13:\n return this._gl.UNSIGNED_INT_10F_11F_11F_REV;\n case 14:\n return this._gl.UNSIGNED_INT_5_9_9_9_REV;\n case 15:\n return this._gl.FLOAT_32_UNSIGNED_INT_24_8_REV;\n }\n return this._gl.UNSIGNED_BYTE;\n }\n /**\n * @internal\n */\n _getInternalFormat(e, t = !1) {\n let i = t ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA;\n switch (e) {\n case 0:\n i = this._gl.ALPHA;\n break;\n case 1:\n i = this._gl.LUMINANCE;\n break;\n case 2:\n i = this._gl.LUMINANCE_ALPHA;\n break;\n case 6:\n i = this._gl.RED;\n break;\n case 7:\n i = this._gl.RG;\n break;\n case 4:\n i = t ? this._glSRGBExtensionValues.SRGB : this._gl.RGB;\n break;\n case 5:\n i = t ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA;\n break;\n }\n if (this._webGLVersion > 1)\n switch (e) {\n case 8:\n i = this._gl.RED_INTEGER;\n break;\n case 9:\n i = this._gl.RG_INTEGER;\n break;\n case 10:\n i = this._gl.RGB_INTEGER;\n break;\n case 11:\n i = this._gl.RGBA_INTEGER;\n break;\n }\n return i;\n }\n /**\n * @internal\n */\n _getRGBABufferInternalSizedFormat(e, t, i = !1) {\n if (this._webGLVersion === 1) {\n if (t !== void 0)\n switch (t) {\n case 0:\n return this._gl.ALPHA;\n case 1:\n return this._gl.LUMINANCE;\n case 2:\n return this._gl.LUMINANCE_ALPHA;\n case 4:\n return i ? this._glSRGBExtensionValues.SRGB : this._gl.RGB;\n }\n return this._gl.RGBA;\n }\n switch (e) {\n case 3:\n switch (t) {\n case 6:\n return this._gl.R8_SNORM;\n case 7:\n return this._gl.RG8_SNORM;\n case 4:\n return this._gl.RGB8_SNORM;\n case 8:\n return this._gl.R8I;\n case 9:\n return this._gl.RG8I;\n case 10:\n return this._gl.RGB8I;\n case 11:\n return this._gl.RGBA8I;\n default:\n return this._gl.RGBA8_SNORM;\n }\n case 0:\n switch (t) {\n case 6:\n return this._gl.R8;\n case 7:\n return this._gl.RG8;\n case 4:\n return i ? this._glSRGBExtensionValues.SRGB8 : this._gl.RGB8;\n case 5:\n return i ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA8;\n case 8:\n return this._gl.R8UI;\n case 9:\n return this._gl.RG8UI;\n case 10:\n return this._gl.RGB8UI;\n case 11:\n return this._gl.RGBA8UI;\n case 0:\n return this._gl.ALPHA;\n case 1:\n return this._gl.LUMINANCE;\n case 2:\n return this._gl.LUMINANCE_ALPHA;\n default:\n return this._gl.RGBA8;\n }\n case 4:\n switch (t) {\n case 8:\n return this._gl.R16I;\n case 9:\n return this._gl.RG16I;\n case 10:\n return this._gl.RGB16I;\n case 11:\n return this._gl.RGBA16I;\n default:\n return this._gl.RGBA16I;\n }\n case 5:\n switch (t) {\n case 8:\n return this._gl.R16UI;\n case 9:\n return this._gl.RG16UI;\n case 10:\n return this._gl.RGB16UI;\n case 11:\n return this._gl.RGBA16UI;\n default:\n return this._gl.RGBA16UI;\n }\n case 6:\n switch (t) {\n case 8:\n return this._gl.R32I;\n case 9:\n return this._gl.RG32I;\n case 10:\n return this._gl.RGB32I;\n case 11:\n return this._gl.RGBA32I;\n default:\n return this._gl.RGBA32I;\n }\n case 7:\n switch (t) {\n case 8:\n return this._gl.R32UI;\n case 9:\n return this._gl.RG32UI;\n case 10:\n return this._gl.RGB32UI;\n case 11:\n return this._gl.RGBA32UI;\n default:\n return this._gl.RGBA32UI;\n }\n case 1:\n switch (t) {\n case 6:\n return this._gl.R32F;\n case 7:\n return this._gl.RG32F;\n case 4:\n return this._gl.RGB32F;\n case 5:\n return this._gl.RGBA32F;\n default:\n return this._gl.RGBA32F;\n }\n case 2:\n switch (t) {\n case 6:\n return this._gl.R16F;\n case 7:\n return this._gl.RG16F;\n case 4:\n return this._gl.RGB16F;\n case 5:\n return this._gl.RGBA16F;\n default:\n return this._gl.RGBA16F;\n }\n case 10:\n return this._gl.RGB565;\n case 13:\n return this._gl.R11F_G11F_B10F;\n case 14:\n return this._gl.RGB9_E5;\n case 8:\n return this._gl.RGBA4;\n case 9:\n return this._gl.RGB5_A1;\n case 11:\n switch (t) {\n case 5:\n return this._gl.RGB10_A2;\n case 11:\n return this._gl.RGB10_A2UI;\n default:\n return this._gl.RGB10_A2;\n }\n }\n return i ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA8;\n }\n /**\n * @internal\n */\n _loadFile(e, t, i, r, s, a) {\n const o = De._FileToolsLoadFile(e, t, i, r, s, a);\n return this._activeRequests.push(o), o.onCompleteObservable.add((l) => {\n this._activeRequests.splice(this._activeRequests.indexOf(l), 1);\n }), o;\n }\n /**\n * Loads a file from a url\n * @param url url to load\n * @param onSuccess callback called when the file successfully loads\n * @param onProgress callback called while file is loading (if the server supports this mode)\n * @param offlineProvider defines the offline provider for caching\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\n * @param onError callback called when the file fails to load\n * @returns a file request object\n * @internal\n */\n static _FileToolsLoadFile(e, t, i, r, s, a) {\n throw We(\"FileTools\");\n }\n /**\n * Reads pixels from the current frame buffer. Please note that this function can be slow\n * @param x defines the x coordinate of the rectangle where pixels must be read\n * @param y defines the y coordinate of the rectangle where pixels must be read\n * @param width defines the width of the rectangle where pixels must be read\n * @param height defines the height of the rectangle where pixels must be read\n * @param hasAlpha defines whether the output should have alpha or not (defaults to true)\n * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels\n * @returns a ArrayBufferView promise (Uint8Array) containing RGBA colors\n */\n readPixels(e, t, i, r, s = !0, a = !0) {\n const o = s ? 4 : 3, l = s ? this._gl.RGBA : this._gl.RGB, c = new Uint8Array(r * i * o);\n return a && this.flushFramebuffer(), this._gl.readPixels(e, t, i, r, l, this._gl.UNSIGNED_BYTE, c), Promise.resolve(c);\n }\n /**\n * Gets a Promise indicating if the engine can be instantiated (ie. if a webGL context can be found)\n */\n static get IsSupportedAsync() {\n return Promise.resolve(this.isSupported());\n }\n /**\n * Gets a boolean indicating if the engine can be instantiated (ie. if a webGL context can be found)\n */\n static get IsSupported() {\n return this.isSupported();\n }\n /**\n * Gets a boolean indicating if the engine can be instantiated (ie. if a webGL context can be found)\n * @returns true if the engine can be created\n * @ignorenaming\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static isSupported() {\n if (this._HasMajorPerformanceCaveat !== null)\n return !this._HasMajorPerformanceCaveat;\n if (this._IsSupported === null)\n try {\n const e = this._CreateCanvas(1, 1), t = e.getContext(\"webgl\") || e.getContext(\"experimental-webgl\");\n this._IsSupported = t != null && !!window.WebGLRenderingContext;\n } catch {\n this._IsSupported = !1;\n }\n return this._IsSupported;\n }\n /**\n * Gets a boolean indicating if the engine can be instantiated on a performant device (ie. if a webGL context can be found and it does not use a slow implementation)\n */\n static get HasMajorPerformanceCaveat() {\n if (this._HasMajorPerformanceCaveat === null)\n try {\n const e = this._CreateCanvas(1, 1), t = e.getContext(\"webgl\", { failIfMajorPerformanceCaveat: !0 }) || e.getContext(\"experimental-webgl\", { failIfMajorPerformanceCaveat: !0 });\n this._HasMajorPerformanceCaveat = !t;\n } catch {\n this._HasMajorPerformanceCaveat = !1;\n }\n return this._HasMajorPerformanceCaveat;\n }\n /**\n * Find the next highest power of two.\n * @param x Number to start search from.\n * @returns Next highest power of two.\n */\n static CeilingPOT(e) {\n return e--, e |= e >> 1, e |= e >> 2, e |= e >> 4, e |= e >> 8, e |= e >> 16, e++, e;\n }\n /**\n * Find the next lowest power of two.\n * @param x Number to start search from.\n * @returns Next lowest power of two.\n */\n static FloorPOT(e) {\n return e = e | e >> 1, e = e | e >> 2, e = e | e >> 4, e = e | e >> 8, e = e | e >> 16, e - (e >> 1);\n }\n /**\n * Find the nearest power of two.\n * @param x Number to start search from.\n * @returns Next nearest power of two.\n */\n static NearestPOT(e) {\n const t = De.CeilingPOT(e), i = De.FloorPOT(e);\n return t - e > e - i ? i : t;\n }\n /**\n * Get the closest exponent of two\n * @param value defines the value to approximate\n * @param max defines the maximum value to return\n * @param mode defines how to define the closest value\n * @returns closest exponent of two of the given value\n */\n static GetExponentOfTwo(e, t, i = 2) {\n let r;\n switch (i) {\n case 1:\n r = De.FloorPOT(e);\n break;\n case 2:\n r = De.NearestPOT(e);\n break;\n case 3:\n default:\n r = De.CeilingPOT(e);\n break;\n }\n return Math.min(r, t);\n }\n /**\n * Queue a new function into the requested animation frame pool (ie. this function will be executed by the browser (or the javascript engine) for the next frame)\n * @param func - the function to be called\n * @param requester - the object that will request the next frame. Falls back to window.\n * @returns frame number\n */\n static QueueNewFrame(e, t) {\n if (yi()) {\n const { requestAnimationFrame: i } = t || window;\n if (typeof i == \"function\")\n return i(e);\n } else if (typeof requestAnimationFrame == \"function\")\n return requestAnimationFrame(e);\n return setTimeout(e, 16);\n }\n /**\n * Gets host document\n * @returns the host document object\n */\n getHostDocument() {\n return this._renderingCanvas && this._renderingCanvas.ownerDocument ? this._renderingCanvas.ownerDocument : no() ? document : null;\n }\n}\nDe._TempClearColorUint32 = new Uint32Array(4);\nDe._TempClearColorInt32 = new Int32Array(4);\nDe.ExceptionList = [\n { key: \"Chrome/63.0\", capture: \"63\\\\.0\\\\.3239\\\\.(\\\\d+)\", captureConstraint: 108, targets: [\"uniformBuffer\"] },\n { key: \"Firefox/58\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\n { key: \"Firefox/59\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\n { key: \"Chrome/72.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\n { key: \"Chrome/73.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\n { key: \"Chrome/74.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\n { key: \"Mac OS.+Chrome/71\", capture: null, captureConstraint: null, targets: [\"vao\"] },\n { key: \"Mac OS.+Chrome/72\", capture: null, captureConstraint: null, targets: [\"vao\"] },\n { key: \"Mac OS.+Chrome\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\n { key: \"Chrome/12\\\\d\\\\..+?Mobile\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\n // desktop osx safari 15.4\n { key: \".*AppleWebKit.*(15.4).*Safari\", capture: null, captureConstraint: null, targets: [\"antialias\", \"maxMSAASamples\"] },\n // mobile browsers using safari 15.4 on ios\n { key: \".*(15.4).*AppleWebKit.*Safari\", capture: null, captureConstraint: null, targets: [\"antialias\", \"maxMSAASamples\"] }\n];\nDe._TextureLoaders = [];\nDe.CollisionsEpsilon = 1e-3;\nDe._IsSupported = null;\nDe._HasMajorPerformanceCaveat = null;\nclass Jl {\n /**\n * Polyfill for setImmediate\n * @param action defines the action to execute after the current execution block\n */\n static SetImmediate(e) {\n yi() && window.setImmediate ? window.setImmediate(e) : setTimeout(e, 1);\n }\n}\nconst L_ = new RegExp(/^data:([^,]+\\/[^,]+)?;base64,/i);\nclass $l extends Ba {\n /**\n * Creates a new LoadFileError\n * @param message defines the message of the error\n * @param object defines the optional web request\n */\n constructor(e, t) {\n super(e, Pc.LoadFileError), this.name = \"LoadFileError\", ba._setPrototypeOf(this, $l.prototype), t instanceof mi ? this.request = t : this.file = t;\n }\n}\nclass ec extends Ba {\n /**\n * Creates a new LoadFileError\n * @param message defines the message of the error\n * @param request defines the optional web request\n */\n constructor(e, t) {\n super(e, Pc.RequestFileError), this.request = t, this.name = \"RequestFileError\", ba._setPrototypeOf(this, ec.prototype);\n }\n}\nclass Qu extends Ba {\n /**\n * Creates a new ReadFileError\n * @param message defines the message of the error\n * @param file defines the optional file\n */\n constructor(e, t) {\n super(e, Pc.ReadFileError), this.file = t, this.name = \"ReadFileError\", ba._setPrototypeOf(this, Qu.prototype);\n }\n}\nconst li = {\n /**\n * Gets or sets the retry strategy to apply when an error happens while loading an asset.\n * When defining this function, return the wait time before trying again or return -1 to\n * stop retrying and error out.\n */\n DefaultRetryStrategy: jS.ExponentialBackoff(),\n /**\n * Gets or sets the base URL to use to load assets\n */\n BaseUrl: \"\",\n /**\n * Default behaviour for cors in the application.\n * It can be a string if the expected behavior is identical in the entire app.\n * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance)\n */\n CorsBehavior: \"anonymous\",\n /**\n * Gets or sets a function used to pre-process url before using them to load assets\n * @param url\n * @returns the processed url\n */\n PreprocessUrl: (n) => n,\n /**\n * Gets or sets the base URL to use to load scripts\n * Used for both JS and WASM\n */\n ScriptBaseUrl: \"\",\n /**\n * Gets or sets a function used to pre-process script url before using them to load.\n * Used for both JS and WASM\n * @param url defines the url to process\n * @returns the processed url\n */\n ScriptPreprocessUrl: (n) => n\n}, w_ = (n) => (n = n.replace(/#/gm, \"%23\"), n), Ju = (n, e) => {\n if (!(n && n.indexOf(\"data:\") === 0) && li.CorsBehavior)\n if (typeof li.CorsBehavior == \"string\" || li.CorsBehavior instanceof String)\n e.crossOrigin = li.CorsBehavior;\n else {\n const t = li.CorsBehavior(n);\n t && (e.crossOrigin = t);\n }\n}, Go = (n, e, t, i, r = \"\", s) => {\n const a = st.LastCreatedEngine;\n if (typeof HTMLImageElement > \"u\" && !(a != null && a._features.forceBitmapOverHTMLImageElement))\n return t(\"LoadImage is only supported in web or BabylonNative environments.\"), null;\n let o, l = !1;\n n instanceof ArrayBuffer || ArrayBuffer.isView(n) ? typeof Blob < \"u\" && typeof URL < \"u\" ? (o = URL.createObjectURL(new Blob([n], { type: r })), l = !0) : o = `data:${r};base64,` + D_(n) : n instanceof Blob ? (o = URL.createObjectURL(n), l = !0) : (o = w_(n), o = li.PreprocessUrl(n));\n const c = (R) => {\n if (t) {\n const x = o || n.toString();\n t(`Error while trying to load image: ${x.indexOf(\"http\") === 0 || x.length <= 128 ? x : x.slice(0, 128) + \"...\"}`, R);\n }\n };\n if (a != null && a._features.forceBitmapOverHTMLImageElement)\n return an(o, (R) => {\n a.createImageBitmap(new Blob([R], { type: r }), { premultiplyAlpha: \"none\", ...s }).then((x) => {\n e(x), l && URL.revokeObjectURL(o);\n }).catch((x) => {\n t && t(\"Error while trying to load image: \" + n, x);\n });\n }, void 0, i || void 0, !0, (R, x) => {\n c(x);\n }), null;\n const h = new Image();\n Ju(o, h);\n const u = [], f = () => {\n u.forEach((R) => {\n R.target.addEventListener(R.name, R.handler);\n });\n }, d = () => {\n u.forEach((R) => {\n R.target.removeEventListener(R.name, R.handler);\n }), u.length = 0;\n }, p = () => {\n d(), e(h), l && h.src && URL.revokeObjectURL(h.src);\n }, g = (R) => {\n d(), c(R), l && h.src && URL.revokeObjectURL(h.src);\n }, m = (R) => {\n if (R.blockedURI !== h.src)\n return;\n d();\n const x = new Error(`CSP violation of policy ${R.effectiveDirective} ${R.blockedURI}. Current policy is ${R.originalPolicy}`);\n st.UseFallbackTexture = !1, c(x), l && h.src && URL.revokeObjectURL(h.src), h.src = \"\";\n };\n u.push({ target: h, name: \"load\", handler: p }), u.push({ target: h, name: \"error\", handler: g }), u.push({ target: document, name: \"securitypolicyviolation\", handler: m }), f();\n const v = o.substring(0, 5) === \"blob:\", E = o.substring(0, 5) === \"data:\", C = () => {\n v || E || !mi.IsCustomRequestAvailable ? h.src = o : an(o, (R, x, S) => {\n const M = !r && S ? S : r, N = new Blob([R], { type: M }), F = URL.createObjectURL(N);\n l = !0, h.src = F;\n }, void 0, i || void 0, !0, (R, x) => {\n c(x);\n });\n }, T = () => {\n i && i.loadImage(o, h);\n };\n if (!v && !E && i && i.enableTexturesOffline)\n i.open(T, C);\n else {\n if (o.indexOf(\"file:\") !== -1) {\n const R = decodeURIComponent(o.substring(5).toLowerCase());\n if (ao.FilesToLoad[R] && typeof URL < \"u\") {\n try {\n let x;\n try {\n x = URL.createObjectURL(ao.FilesToLoad[R]);\n } catch {\n x = URL.createObjectURL(ao.FilesToLoad[R]);\n }\n h.src = x, l = !0;\n } catch {\n h.src = \"\";\n }\n return h;\n }\n }\n C();\n }\n return h;\n}, go = (n, e, t, i, r) => {\n const s = new FileReader(), a = {\n onCompleteObservable: new he(),\n abort: () => s.abort()\n };\n return s.onloadend = () => a.onCompleteObservable.notifyObservers(a), r && (s.onerror = () => {\n r(new Qu(`Unable to read ${n.name}`, n));\n }), s.onload = (o) => {\n e(o.target.result);\n }, t && (s.onprogress = t), i ? s.readAsArrayBuffer(n) : s.readAsText(n), a;\n}, an = (n, e, t, i, r, s, a) => {\n if (n.name)\n return go(n, e, t, r, s ? (h) => {\n s(void 0, h);\n } : void 0);\n const o = n;\n if (o.indexOf(\"file:\") !== -1) {\n let h = decodeURIComponent(o.substring(5).toLowerCase());\n h.indexOf(\"./\") === 0 && (h = h.substring(2));\n const u = ao.FilesToLoad[h];\n if (u)\n return go(u, e, t, r, s ? (f) => s(void 0, new $l(f.message, f.file)) : void 0);\n }\n const { match: l, type: c } = _y(o);\n if (l) {\n const h = {\n onCompleteObservable: new he(),\n abort: () => () => {\n }\n };\n try {\n const u = r ? ef(o) : B_(o);\n e(u, void 0, c);\n } catch (u) {\n s ? s(void 0, u) : ne.Error(u.message || \"Failed to parse the Data URL\");\n }\n return Jl.SetImmediate(() => {\n h.onCompleteObservable.notifyObservers(h);\n }), h;\n }\n return $u(o, (h, u) => {\n e(h, u == null ? void 0 : u.responseURL, u == null ? void 0 : u.getResponseHeader(\"content-type\"));\n }, t, i, r, s ? (h) => {\n s(h.request, new $l(h.message, h.request));\n } : void 0, a);\n}, $u = (n, e, t, i, r, s, a) => {\n n = w_(n), n = li.PreprocessUrl(n);\n const o = li.BaseUrl + n;\n let l = !1;\n const c = {\n onCompleteObservable: new he(),\n abort: () => l = !0\n }, h = () => {\n let u = new mi(), f = null, d;\n const p = () => {\n u && (t && u.removeEventListener(\"progress\", t), d && u.removeEventListener(\"readystatechange\", d), u.removeEventListener(\"loadend\", g));\n };\n let g = () => {\n p(), c.onCompleteObservable.notifyObservers(c), c.onCompleteObservable.clear(), t = void 0, d = null, g = null, s = void 0, a = void 0, e = void 0;\n };\n c.abort = () => {\n l = !0, g && g(), u && u.readyState !== (XMLHttpRequest.DONE || 4) && u.abort(), f !== null && (clearTimeout(f), f = null), u = null;\n };\n const m = (E) => {\n const C = E.message || \"Unknown error\";\n s && u ? s(new ec(C, u)) : ne.Error(C);\n }, v = (E) => {\n if (u) {\n if (u.open(\"GET\", o), a)\n try {\n a(u);\n } catch (C) {\n m(C);\n return;\n }\n r && (u.responseType = \"arraybuffer\"), t && u.addEventListener(\"progress\", t), g && u.addEventListener(\"loadend\", g), d = () => {\n if (!(l || !u) && u.readyState === (XMLHttpRequest.DONE || 4)) {\n if (d && u.removeEventListener(\"readystatechange\", d), u.status >= 200 && u.status < 300 || u.status === 0 && (!yi() || U_())) {\n try {\n e && e(r ? u.response : u.responseText, u);\n } catch (R) {\n m(R);\n }\n return;\n }\n const C = li.DefaultRetryStrategy;\n if (C) {\n const R = C(o, u, E);\n if (R !== -1) {\n p(), u = new mi(), f = setTimeout(() => v(E + 1), R);\n return;\n }\n }\n const T = new ec(\"Error status: \" + u.status + \" \" + u.statusText + \" - Unable to load \" + o, u);\n s && s(T);\n }\n }, u.addEventListener(\"readystatechange\", d), u.send();\n }\n };\n v(0);\n };\n if (i && i.enableSceneOffline) {\n const u = (d) => {\n d && d.status > 400 ? s && s(d) : h();\n }, f = () => {\n i && i.loadFile(li.BaseUrl + n, (d) => {\n !l && e && e(d), c.onCompleteObservable.notifyObservers(c);\n }, t ? (d) => {\n !l && t && t(d);\n } : void 0, u, r);\n };\n i.open(f, u);\n } else\n h();\n return c;\n}, U_ = () => typeof location < \"u\" && location.protocol === \"file:\", V_ = (n) => L_.test(n), _y = (n) => {\n const e = L_.exec(n);\n return e === null || e.length === 0 ? { match: !1, type: \"\" } : { match: !0, type: e[0].replace(\"data:\", \"\").replace(\"base64,\", \"\") };\n};\nfunction ef(n) {\n return QS(n.split(\",\")[1]);\n}\nconst B_ = (n) => N_(n.split(\",\")[1]), Ey = () => {\n De._FileToolsLoadImage = Go, De._FileToolsLoadFile = an, hs._FileToolsLoadFile = an;\n};\nEy();\nlet $a;\nconst vy = (n, e, t, i, r, s, a, o, l, c) => {\n $a = {\n DecodeBase64UrlToBinary: n,\n DecodeBase64UrlToString: e,\n DefaultRetryStrategy: t.DefaultRetryStrategy,\n BaseUrl: t.BaseUrl,\n CorsBehavior: t.CorsBehavior,\n PreprocessUrl: t.PreprocessUrl,\n IsBase64DataUrl: i,\n IsFileURL: r,\n LoadFile: s,\n LoadImage: a,\n ReadFile: o,\n RequestFile: l,\n SetCorsBehavior: c\n }, Object.defineProperty($a, \"DefaultRetryStrategy\", {\n get: function() {\n return t.DefaultRetryStrategy;\n },\n set: function(h) {\n t.DefaultRetryStrategy = h;\n }\n }), Object.defineProperty($a, \"BaseUrl\", {\n get: function() {\n return t.BaseUrl;\n },\n set: function(h) {\n t.BaseUrl = h;\n }\n }), Object.defineProperty($a, \"PreprocessUrl\", {\n get: function() {\n return t.PreprocessUrl;\n },\n set: function(h) {\n t.PreprocessUrl = h;\n }\n }), Object.defineProperty($a, \"CorsBehavior\", {\n get: function() {\n return t.CorsBehavior;\n },\n set: function(h) {\n t.CorsBehavior = h;\n }\n });\n};\nvy(ef, B_, li, V_, U_, an, Go, go, $u, Ju);\nconst k_ = {};\nfunction Re(n, e) {\n k_[n] = e;\n}\nfunction mr(n) {\n return k_[n];\n}\nclass lo {\n /**\n * Tries to instantiate a new object from a given class name\n * @param className defines the class name to instantiate\n * @returns the new object or null if the system was not able to do the instantiation\n */\n static Instantiate(e) {\n if (this.RegisteredExternalClasses && this.RegisteredExternalClasses[e])\n return this.RegisteredExternalClasses[e];\n const t = mr(e);\n if (t)\n return t;\n ne.Warn(e + \" not found, you may have missed an import.\");\n const i = e.split(\".\");\n let r = window || this;\n for (let s = 0, a = i.length; s < a; s++)\n r = r[i[s]];\n return typeof r != \"function\" ? null : r;\n }\n}\nlo.RegisteredExternalClasses = {};\nfunction tf() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (n) => {\n const e = Math.random() * 16 | 0;\n return (n === \"x\" ? e : e & 3 | 8).toString(16);\n });\n}\nfunction mo(n) {\n let e = 1;\n do\n e *= 2;\n while (e < n);\n return e === n;\n}\nfunction pu(n, e, t) {\n return n * (1 - t) + e * t;\n}\nclass ge {\n /**\n * Gets or sets the base URL to use to load assets\n */\n static get BaseUrl() {\n return li.BaseUrl;\n }\n static set BaseUrl(e) {\n li.BaseUrl = e;\n }\n /**\n * This function checks whether a URL is absolute or not.\n * It will also detect data and blob URLs\n * @param url the url to check\n * @returns is the url absolute or relative\n */\n static IsAbsoluteUrl(e) {\n return e.indexOf(\"//\") === 0 ? !0 : e.indexOf(\"://\") === -1 || e.indexOf(\".\") === -1 || e.indexOf(\"/\") === -1 || e.indexOf(\":\") > e.indexOf(\"/\") ? !1 : e.indexOf(\"://\") < e.indexOf(\".\") || e.indexOf(\"data:\") === 0 || e.indexOf(\"blob:\") === 0;\n }\n /**\n * Sets the base URL to use to load scripts\n */\n static set ScriptBaseUrl(e) {\n li.ScriptBaseUrl = e;\n }\n static get ScriptBaseUrl() {\n return li.ScriptBaseUrl;\n }\n /**\n * Sets a preprocessing function to run on a source URL before importing it\n * Note that this function will execute AFTER the base URL is appended to the URL\n */\n static set ScriptPreprocessUrl(e) {\n li.ScriptPreprocessUrl = e;\n }\n static get ScriptPreprocessUrl() {\n return li.ScriptPreprocessUrl;\n }\n /**\n * Gets or sets the retry strategy to apply when an error happens while loading an asset\n */\n static get DefaultRetryStrategy() {\n return li.DefaultRetryStrategy;\n }\n static set DefaultRetryStrategy(e) {\n li.DefaultRetryStrategy = e;\n }\n /**\n * Default behavior for cors in the application.\n * It can be a string if the expected behavior is identical in the entire app.\n * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance)\n */\n static get CorsBehavior() {\n return li.CorsBehavior;\n }\n static set CorsBehavior(e) {\n li.CorsBehavior = e;\n }\n /**\n * Gets or sets a global variable indicating if fallback texture must be used when a texture cannot be loaded\n * @ignorenaming\n */\n static get UseFallbackTexture() {\n return st.UseFallbackTexture;\n }\n static set UseFallbackTexture(e) {\n st.UseFallbackTexture = e;\n }\n /**\n * Use this object to register external classes like custom textures or material\n * to allow the loaders to instantiate them\n */\n static get RegisteredExternalClasses() {\n return lo.RegisteredExternalClasses;\n }\n static set RegisteredExternalClasses(e) {\n lo.RegisteredExternalClasses = e;\n }\n /**\n * Texture content used if a texture cannot loaded\n * @ignorenaming\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static get fallbackTexture() {\n return st.FallbackTexture;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static set fallbackTexture(e) {\n st.FallbackTexture = e;\n }\n /**\n * Read the content of a byte array at a specified coordinates (taking in account wrapping)\n * @param u defines the coordinate on X axis\n * @param v defines the coordinate on Y axis\n * @param width defines the width of the source data\n * @param height defines the height of the source data\n * @param pixels defines the source byte array\n * @param color defines the output color\n */\n static FetchToRef(e, t, i, r, s, a) {\n const o = Math.abs(e) * i % i | 0, l = Math.abs(t) * r % r | 0, c = (o + l * i) * 4;\n a.r = s[c] / 255, a.g = s[c + 1] / 255, a.b = s[c + 2] / 255, a.a = s[c + 3] / 255;\n }\n /**\n * Interpolates between a and b via alpha\n * @param a The lower value (returned when alpha = 0)\n * @param b The upper value (returned when alpha = 1)\n * @param alpha The interpolation-factor\n * @returns The mixed value\n */\n static Mix(e, t, i) {\n return 0;\n }\n /**\n * Tries to instantiate a new object from a given class name\n * @param className defines the class name to instantiate\n * @returns the new object or null if the system was not able to do the instantiation\n */\n static Instantiate(e) {\n return lo.Instantiate(e);\n }\n /**\n * Polyfill for setImmediate\n * @param action defines the action to execute after the current execution block\n */\n static SetImmediate(e) {\n Jl.SetImmediate(e);\n }\n /**\n * Function indicating if a number is an exponent of 2\n * @param value defines the value to test\n * @returns true if the value is an exponent of 2\n */\n static IsExponentOfTwo(e) {\n return !0;\n }\n /**\n * Returns the nearest 32-bit single precision float representation of a Number\n * @param value A Number. If the parameter is of a different type, it will get converted\n * to a number or to NaN if it cannot be converted\n * @returns number\n */\n static FloatRound(e) {\n return Math.fround(e);\n }\n /**\n * Extracts the filename from a path\n * @param path defines the path to use\n * @returns the filename\n */\n static GetFilename(e) {\n const t = e.lastIndexOf(\"/\");\n return t < 0 ? e : e.substring(t + 1);\n }\n /**\n * Extracts the \"folder\" part of a path (everything before the filename).\n * @param uri The URI to extract the info from\n * @param returnUnchangedIfNoSlash Do not touch the URI if no slashes are present\n * @returns The \"folder\" part of the path\n */\n static GetFolderPath(e, t = !1) {\n const i = e.lastIndexOf(\"/\");\n return i < 0 ? t ? e : \"\" : e.substring(0, i + 1);\n }\n /**\n * Convert an angle in radians to degrees\n * @param angle defines the angle to convert\n * @returns the angle in degrees\n */\n static ToDegrees(e) {\n return e * 180 / Math.PI;\n }\n /**\n * Convert an angle in degrees to radians\n * @param angle defines the angle to convert\n * @returns the angle in radians\n */\n static ToRadians(e) {\n return e * Math.PI / 180;\n }\n /**\n * Smooth angle changes (kind of low-pass filter), in particular for device orientation \"shaking\"\n * Use trigonometric functions to avoid discontinuity (0/360, -180/180)\n * @param previousAngle defines last angle value, in degrees\n * @param newAngle defines new angle value, in degrees\n * @param smoothFactor defines smoothing sensitivity; min 0: no smoothing, max 1: new data ignored\n * @returns the angle in degrees\n */\n static SmoothAngleChange(e, t, i = 0.9) {\n const r = this.ToRadians(e), s = this.ToRadians(t);\n return this.ToDegrees(Math.atan2((1 - i) * Math.sin(s) + i * Math.sin(r), (1 - i) * Math.cos(s) + i * Math.cos(r)));\n }\n /**\n * Returns an array if obj is not an array\n * @param obj defines the object to evaluate as an array\n * @param allowsNullUndefined defines a boolean indicating if obj is allowed to be null or undefined\n * @returns either obj directly if obj is an array or a new array containing obj\n */\n static MakeArray(e, t) {\n return t !== !0 && (e === void 0 || e == null) ? null : Array.isArray(e) ? e : [e];\n }\n /**\n * Gets the pointer prefix to use\n * @param engine defines the engine we are finding the prefix for\n * @returns \"pointer\" if touch is enabled. Else returns \"mouse\"\n */\n static GetPointerPrefix(e) {\n let t = \"pointer\";\n return yi() && !window.PointerEvent && (t = \"mouse\"), e._badDesktopOS && !e._badOS && // And not ipad pros who claim to be macs...\n !(document && \"ontouchend\" in document) && (t = \"mouse\"), t;\n }\n /**\n * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element.\n * @param url define the url we are trying\n * @param element define the dom element where to configure the cors policy\n * @param element.crossOrigin\n */\n static SetCorsBehavior(e, t) {\n Ju(e, t);\n }\n /**\n * Sets the referrerPolicy behavior on a dom element.\n * @param referrerPolicy define the referrer policy to use\n * @param element define the dom element where to configure the referrer policy\n * @param element.referrerPolicy\n */\n static SetReferrerPolicyBehavior(e, t) {\n t.referrerPolicy = e;\n }\n // External files\n /**\n * Removes unwanted characters from an url\n * @param url defines the url to clean\n * @returns the cleaned url\n */\n static CleanUrl(e) {\n return e = e.replace(/#/gm, \"%23\"), e;\n }\n /**\n * Gets or sets a function used to pre-process url before using them to load assets\n */\n static get PreprocessUrl() {\n return li.PreprocessUrl;\n }\n static set PreprocessUrl(e) {\n li.PreprocessUrl = e;\n }\n /**\n * Loads an image as an HTMLImageElement.\n * @param input url string, ArrayBuffer, or Blob to load\n * @param onLoad callback called when the image successfully loads\n * @param onError callback called when the image fails to load\n * @param offlineProvider offline provider for caching\n * @param mimeType optional mime type\n * @param imageBitmapOptions optional the options to use when creating an ImageBitmap\n * @returns the HTMLImageElement of the loaded image\n */\n static LoadImage(e, t, i, r, s, a) {\n return Go(e, t, i, r, s, a);\n }\n /**\n * Loads a file from a url\n * @param url url string, ArrayBuffer, or Blob to load\n * @param onSuccess callback called when the file successfully loads\n * @param onProgress callback called while file is loading (if the server supports this mode)\n * @param offlineProvider defines the offline provider for caching\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\n * @param onError callback called when the file fails to load\n * @returns a file request object\n */\n static LoadFile(e, t, i, r, s, a) {\n return an(e, t, i, r, s, a);\n }\n /**\n * Loads a file from a url\n * @param url the file url to load\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\n * @returns a promise containing an ArrayBuffer corresponding to the loaded file\n */\n static LoadFileAsync(e, t = !0) {\n return new Promise((i, r) => {\n an(e, (s) => {\n i(s);\n }, void 0, void 0, t, (s, a) => {\n r(a);\n });\n });\n }\n /**\n * Get a script URL including preprocessing\n * @param scriptUrl the script Url to process\n * @param forceAbsoluteUrl force the script to be an absolute url (adding the current base url if necessary)\n * @returns a modified URL to use\n */\n static GetBabylonScriptURL(e, t) {\n if (!e)\n return \"\";\n if (ge.ScriptBaseUrl && e.startsWith(ge._DefaultCdnUrl)) {\n const i = ge.ScriptBaseUrl[ge.ScriptBaseUrl.length - 1] === \"/\" ? ge.ScriptBaseUrl.substring(0, ge.ScriptBaseUrl.length - 1) : ge.ScriptBaseUrl;\n e = e.replace(ge._DefaultCdnUrl, i);\n }\n return e = ge.ScriptPreprocessUrl(e), t && (e = ge.GetAbsoluteUrl(e)), e;\n }\n /**\n * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the\n * content of this file is added into a new script element, attached to the DOM (body element)\n * @param scriptUrl defines the url of the script to load\n * @param onSuccess defines the callback called when the script is loaded\n * @param onError defines the callback to call if an error occurs\n * @param scriptId defines the id of the script element\n */\n static LoadBabylonScript(e, t, i, r) {\n e = ge.GetBabylonScriptURL(e), ge.LoadScript(e, t, i);\n }\n /**\n * Load an asynchronous script (identified by an url). When the url returns, the\n * content of this file is added into a new script element, attached to the DOM (body element)\n * @param scriptUrl defines the url of the script to laod\n * @returns a promise request object\n */\n static LoadBabylonScriptAsync(e) {\n return e = ge.GetBabylonScriptURL(e), ge.LoadScriptAsync(e);\n }\n /**\n * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the\n * content of this file is added into a new script element, attached to the DOM (body element)\n * @param scriptUrl defines the url of the script to load\n * @param onSuccess defines the callback called when the script is loaded\n * @param onError defines the callback to call if an error occurs\n * @param scriptId defines the id of the script element\n */\n static LoadScript(e, t, i, r) {\n if (typeof importScripts == \"function\") {\n try {\n importScripts(e), t();\n } catch (o) {\n i == null || i(`Unable to load script '${e}' in worker`, o);\n }\n return;\n } else if (!yi()) {\n i == null || i(`Cannot load script '${e}' outside of a window or a worker`);\n return;\n }\n const s = document.getElementsByTagName(\"head\")[0], a = document.createElement(\"script\");\n a.setAttribute(\"type\", \"text/javascript\"), a.setAttribute(\"src\", e), r && (a.id = r), a.onload = () => {\n t && t();\n }, a.onerror = (o) => {\n i && i(`Unable to load script '${e}'`, o);\n }, s.appendChild(a);\n }\n /**\n * Load an asynchronous script (identified by an url). When the url returns, the\n * content of this file is added into a new script element, attached to the DOM (body element)\n * @param scriptUrl defines the url of the script to load\n * @param scriptId defines the id of the script element\n * @returns a promise request object\n */\n static LoadScriptAsync(e, t) {\n return new Promise((i, r) => {\n this.LoadScript(e, () => {\n i();\n }, (s, a) => {\n r(a || new Error(s));\n }, t);\n });\n }\n /**\n * Loads a file from a blob\n * @param fileToLoad defines the blob to use\n * @param callback defines the callback to call when data is loaded\n * @param progressCallback defines the callback to call during loading process\n * @returns a file request object\n */\n static ReadFileAsDataURL(e, t, i) {\n const r = new FileReader(), s = {\n onCompleteObservable: new he(),\n abort: () => r.abort()\n };\n return r.onloadend = () => {\n s.onCompleteObservable.notifyObservers(s);\n }, r.onload = (a) => {\n t(a.target.result);\n }, r.onprogress = i, r.readAsDataURL(e), s;\n }\n /**\n * Reads a file from a File object\n * @param file defines the file to load\n * @param onSuccess defines the callback to call when data is loaded\n * @param onProgress defines the callback to call during loading process\n * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer\n * @param onError defines the callback to call when an error occurs\n * @returns a file request object\n */\n static ReadFile(e, t, i, r, s) {\n return go(e, t, i, r, s);\n }\n /**\n * Creates a data url from a given string content\n * @param content defines the content to convert\n * @returns the new data url link\n */\n static FileAsURL(e) {\n const t = new Blob([e]);\n return window.URL.createObjectURL(t);\n }\n /**\n * Format the given number to a specific decimal format\n * @param value defines the number to format\n * @param decimals defines the number of decimals to use\n * @returns the formatted string\n */\n static Format(e, t = 2) {\n return e.toFixed(t);\n }\n /**\n * Tries to copy an object by duplicating every property\n * @param source defines the source object\n * @param destination defines the target object\n * @param doNotCopyList defines a list of properties to avoid\n * @param mustCopyList defines a list of properties to copy (even if they start with _)\n */\n static DeepCopy(e, t, i, r) {\n Dn.DeepCopy(e, t, i, r);\n }\n /**\n * Gets a boolean indicating if the given object has no own property\n * @param obj defines the object to test\n * @returns true if object has no own property\n */\n static IsEmpty(e) {\n for (const t in e)\n if (Object.prototype.hasOwnProperty.call(e, t))\n return !1;\n return !0;\n }\n /**\n * Function used to register events at window level\n * @param windowElement defines the Window object to use\n * @param events defines the events to register\n */\n static RegisterTopRootEvents(e, t) {\n for (let i = 0; i < t.length; i++) {\n const r = t[i];\n e.addEventListener(r.name, r.handler, !1);\n try {\n window.parent && window.parent.addEventListener(r.name, r.handler, !1);\n } catch {\n }\n }\n }\n /**\n * Function used to unregister events from window level\n * @param windowElement defines the Window object to use\n * @param events defines the events to unregister\n */\n static UnregisterTopRootEvents(e, t) {\n for (let i = 0; i < t.length; i++) {\n const r = t[i];\n e.removeEventListener(r.name, r.handler);\n try {\n e.parent && e.parent.removeEventListener(r.name, r.handler);\n } catch {\n }\n }\n }\n /**\n * Dumps the current bound framebuffer\n * @param width defines the rendering width\n * @param height defines the rendering height\n * @param engine defines the hosting engine\n * @param successCallback defines the callback triggered once the data are available\n * @param mimeType defines the mime type of the result\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n * @returns a void promise\n */\n static async DumpFramebuffer(e, t, i, r, s = \"image/png\", a, o) {\n throw We(\"DumpTools\");\n }\n /**\n * Dumps an array buffer\n * @param width defines the rendering width\n * @param height defines the rendering height\n * @param data the data array\n * @param successCallback defines the callback triggered once the data are available\n * @param mimeType defines the mime type of the result\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\n * @param invertY true to invert the picture in the Y dimension\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n */\n static DumpData(e, t, i, r, s = \"image/png\", a, o = !1, l = !1, c) {\n throw We(\"DumpTools\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Dumps an array buffer\n * @param width defines the rendering width\n * @param height defines the rendering height\n * @param data the data array\n * @param mimeType defines the mime type of the result\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\n * @param invertY true to invert the picture in the Y dimension\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n * @returns a promise that resolve to the final data\n */\n static DumpDataAsync(e, t, i, r = \"image/png\", s, a = !1, o = !1, l) {\n throw We(\"DumpTools\");\n }\n static _IsOffScreenCanvas(e) {\n return e.convertToBlob !== void 0;\n }\n /**\n * Converts the canvas data to blob.\n * This acts as a polyfill for browsers not supporting the to blob function.\n * @param canvas Defines the canvas to extract the data from (can be an offscreen canvas)\n * @param successCallback Defines the callback triggered once the data are available\n * @param mimeType Defines the mime type of the result\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n */\n static ToBlob(e, t, i = \"image/png\", r) {\n !ge._IsOffScreenCanvas(e) && !e.toBlob && (e.toBlob = function(s, a, o) {\n setTimeout(() => {\n const l = atob(this.toDataURL(a, o).split(\",\")[1]), c = l.length, h = new Uint8Array(c);\n for (let u = 0; u < c; u++)\n h[u] = l.charCodeAt(u);\n s(new Blob([h]));\n });\n }), ge._IsOffScreenCanvas(e) ? e.convertToBlob({\n type: i,\n quality: r\n }).then((s) => t(s)) : e.toBlob(function(s) {\n t(s);\n }, i, r);\n }\n /**\n * Download a Blob object\n * @param blob the Blob object\n * @param fileName the file name to download\n */\n static DownloadBlob(e, t) {\n if (\"download\" in document.createElement(\"a\")) {\n if (!t) {\n const i = /* @__PURE__ */ new Date();\n t = \"screenshot_\" + ((i.getFullYear() + \"-\" + (i.getMonth() + 1)).slice(2) + \"-\" + i.getDate() + \"_\" + i.getHours() + \"-\" + (\"0\" + i.getMinutes()).slice(-2)) + \".png\";\n }\n ge.Download(e, t);\n } else if (e && typeof URL < \"u\") {\n const i = URL.createObjectURL(e), r = window.open(\"\");\n if (!r)\n return;\n const s = r.document.createElement(\"img\");\n s.onload = function() {\n URL.revokeObjectURL(i);\n }, s.src = i, r.document.body.appendChild(s);\n }\n }\n /**\n * Encodes the canvas data to base 64, or automatically downloads the result if `fileName` is defined.\n * @param canvas The canvas to get the data from, which can be an offscreen canvas.\n * @param successCallback The callback which is triggered once the data is available. If `fileName` is defined, the callback will be invoked after the download occurs, and the `data` argument will be an empty string.\n * @param mimeType The mime type of the result.\n * @param fileName The name of the file to download. If defined, the result will automatically be downloaded. If not defined, and `successCallback` is also not defined, the result will automatically be downloaded with an auto-generated file name.\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n */\n static EncodeScreenshotCanvasData(e, t, i = \"image/png\", r, s) {\n if (typeof r == \"string\" || !t)\n this.ToBlob(e, function(a) {\n a && ge.DownloadBlob(a, r), t && t(\"\");\n }, i, s);\n else if (t) {\n if (ge._IsOffScreenCanvas(e)) {\n e.convertToBlob({\n type: i,\n quality: s\n }).then((o) => {\n const l = new FileReader();\n l.readAsDataURL(o), l.onloadend = () => {\n const c = l.result;\n t(c);\n };\n });\n return;\n }\n const a = e.toDataURL(i, s);\n t(a);\n }\n }\n /**\n * Downloads a blob in the browser\n * @param blob defines the blob to download\n * @param fileName defines the name of the downloaded file\n */\n static Download(e, t) {\n if (typeof URL > \"u\")\n return;\n const i = window.URL.createObjectURL(e), r = document.createElement(\"a\");\n document.body.appendChild(r), r.style.display = \"none\", r.href = i, r.download = t, r.addEventListener(\"click\", () => {\n r.parentElement && r.parentElement.removeChild(r);\n }), r.click(), window.URL.revokeObjectURL(i);\n }\n /**\n * Will return the right value of the noPreventDefault variable\n * Needed to keep backwards compatibility to the old API.\n *\n * @param args arguments passed to the attachControl function\n * @returns the correct value for noPreventDefault\n */\n static BackCompatCameraNoPreventDefault(e) {\n return typeof e[0] == \"boolean\" ? e[0] : typeof e[1] == \"boolean\" ? e[1] : !1;\n }\n /**\n * Captures a screenshot of the current rendering\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\n * @param engine defines the rendering engine\n * @param camera defines the source camera\n * @param size This parameter can be set to a single number or to an object with the\n * following (optional) properties: precision, width, height. If a single number is passed,\n * it will be used for both width and height. If an object is passed, the screenshot size\n * will be derived from the parameters. The precision property is a multiplier allowing\n * rendering at a higher or lower resolution\n * @param successCallback defines the callback receives a single parameter which contains the\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\n * src parameter of an to display it\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\n * Check your browser for supported MIME types\n * @param forceDownload force the system to download the image even if a successCallback is provided\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static CreateScreenshot(e, t, i, r, s = \"image/png\", a = !1, o) {\n throw We(\"ScreenshotTools\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Captures a screenshot of the current rendering\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\n * @param engine defines the rendering engine\n * @param camera defines the source camera\n * @param size This parameter can be set to a single number or to an object with the\n * following (optional) properties: precision, width, height. If a single number is passed,\n * it will be used for both width and height. If an object is passed, the screenshot size\n * will be derived from the parameters. The precision property is a multiplier allowing\n * rendering at a higher or lower resolution\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\n * Check your browser for supported MIME types\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\n * to the src parameter of an to display it\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static CreateScreenshotAsync(e, t, i, r = \"image/png\", s) {\n throw We(\"ScreenshotTools\");\n }\n /**\n * Generates an image screenshot from the specified camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\n * @param engine The engine to use for rendering\n * @param camera The camera to use for rendering\n * @param size This parameter can be set to a single number or to an object with the\n * following (optional) properties: precision, width, height. If a single number is passed,\n * it will be used for both width and height. If an object is passed, the screenshot size\n * will be derived from the parameters. The precision property is a multiplier allowing\n * rendering at a higher or lower resolution\n * @param successCallback The callback receives a single parameter which contains the\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\n * src parameter of an to display it\n * @param mimeType The MIME type of the screenshot image (default: image/png).\n * Check your browser for supported MIME types\n * @param samples Texture samples (default: 1)\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\n * @param fileName A name for for the downloaded file.\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\n * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static CreateScreenshotUsingRenderTarget(e, t, i, r, s = \"image/png\", a = 1, o = !1, l, c = !1, h = !1, u = !0, f) {\n throw We(\"ScreenshotTools\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Generates an image screenshot from the specified camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\n * @param engine The engine to use for rendering\n * @param camera The camera to use for rendering\n * @param size This parameter can be set to a single number or to an object with the\n * following (optional) properties: precision, width, height. If a single number is passed,\n * it will be used for both width and height. If an object is passed, the screenshot size\n * will be derived from the parameters. The precision property is a multiplier allowing\n * rendering at a higher or lower resolution\n * @param mimeType The MIME type of the screenshot image (default: image/png).\n * Check your browser for supported MIME types\n * @param samples Texture samples (default: 1)\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\n * @param fileName A name for for the downloaded file.\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\n * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n * to the src parameter of an to display it\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static CreateScreenshotUsingRenderTargetAsync(e, t, i, r = \"image/png\", s = 1, a = !1, o, l = !1, c = !1, h = !0, u) {\n throw We(\"ScreenshotTools\");\n }\n /**\n * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523\n * Be aware Math.random() could cause collisions, but:\n * \"All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide\"\n * @returns a pseudo random id\n */\n static RandomId() {\n return tf();\n }\n /**\n * Test if the given uri is a base64 string\n * @deprecated Please use FileTools.IsBase64DataUrl instead.\n * @param uri The uri to test\n * @returns True if the uri is a base64 string or false otherwise\n */\n static IsBase64(e) {\n return V_(e);\n }\n /**\n * Decode the given base64 uri.\n * @deprecated Please use FileTools.DecodeBase64UrlToBinary instead.\n * @param uri The uri to decode\n * @returns The decoded base64 data.\n */\n static DecodeBase64(e) {\n return ef(e);\n }\n /**\n * Gets a value indicating the number of loading errors\n * @ignorenaming\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static get errorsCount() {\n return ne.errorsCount;\n }\n /**\n * Log a message to the console\n * @param message defines the message to log\n */\n static Log(e) {\n ne.Log(e);\n }\n /**\n * Write a warning message to the console\n * @param message defines the message to log\n */\n static Warn(e) {\n ne.Warn(e);\n }\n /**\n * Write an error message to the console\n * @param message defines the message to log\n */\n static Error(e) {\n ne.Error(e);\n }\n /**\n * Gets current log cache (list of logs)\n */\n static get LogCache() {\n return ne.LogCache;\n }\n /**\n * Clears the log cache\n */\n static ClearLogCache() {\n ne.ClearLogCache();\n }\n /**\n * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel)\n */\n static set LogLevels(e) {\n ne.LogLevels = e;\n }\n /**\n * Sets the current performance log level\n */\n static set PerformanceLogLevel(e) {\n if ((e & ge.PerformanceUserMarkLogLevel) === ge.PerformanceUserMarkLogLevel) {\n ge.StartPerformanceCounter = ge._StartUserMark, ge.EndPerformanceCounter = ge._EndUserMark;\n return;\n }\n if ((e & ge.PerformanceConsoleLogLevel) === ge.PerformanceConsoleLogLevel) {\n ge.StartPerformanceCounter = ge._StartPerformanceConsole, ge.EndPerformanceCounter = ge._EndPerformanceConsole;\n return;\n }\n ge.StartPerformanceCounter = ge._StartPerformanceCounterDisabled, ge.EndPerformanceCounter = ge._EndPerformanceCounterDisabled;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static _StartPerformanceCounterDisabled(e, t) {\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static _EndPerformanceCounterDisabled(e, t) {\n }\n static _StartUserMark(e, t = !0) {\n if (!ge._Performance) {\n if (!yi())\n return;\n ge._Performance = window.performance;\n }\n !t || !ge._Performance.mark || ge._Performance.mark(e + \"-Begin\");\n }\n static _EndUserMark(e, t = !0) {\n !t || !ge._Performance.mark || (ge._Performance.mark(e + \"-End\"), ge._Performance.measure(e, e + \"-Begin\", e + \"-End\"));\n }\n static _StartPerformanceConsole(e, t = !0) {\n t && (ge._StartUserMark(e, t), console.time && console.time(e));\n }\n static _EndPerformanceConsole(e, t = !0) {\n t && (ge._EndUserMark(e, t), console.timeEnd(e));\n }\n /**\n * Gets either window.performance.now() if supported or Date.now() else\n */\n static get Now() {\n return sr.Now;\n }\n /**\n * This method will return the name of the class used to create the instance of the given object.\n * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator.\n * @param object the object to get the class name from\n * @param isType defines if the object is actually a type\n * @returns the name of the class, will be \"object\" for a custom data type not using the @className decorator\n */\n static GetClassName(e, t = !1) {\n let i = null;\n return !t && e.getClassName ? i = e.getClassName() : (e instanceof Object && (i = (t ? e : Object.getPrototypeOf(e)).constructor.__bjsclassName__), i || (i = typeof e)), i;\n }\n /**\n * Gets the first element of an array satisfying a given predicate\n * @param array defines the array to browse\n * @param predicate defines the predicate to use\n * @returns null if not found or the element\n */\n static First(e, t) {\n for (const i of e)\n if (t(i))\n return i;\n return null;\n }\n /**\n * This method will return the name of the full name of the class, including its owning module (if any).\n * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator or implementing a method getClassName():string (in which case the module won't be specified).\n * @param object the object to get the class name from\n * @param isType defines if the object is actually a type\n * @returns a string that can have two forms: \"moduleName.className\" if module was specified when the class' Name was registered or \"className\" if there was not module specified.\n * @ignorenaming\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static getFullClassName(e, t = !1) {\n let i = null, r = null;\n if (!t && e.getClassName)\n i = e.getClassName();\n else {\n if (e instanceof Object) {\n const s = t ? e : Object.getPrototypeOf(e);\n i = s.constructor.__bjsclassName__, r = s.constructor.__bjsmoduleName__;\n }\n i || (i = typeof e);\n }\n return i ? (r != null ? r + \".\" : \"\") + i : null;\n }\n /**\n * Returns a promise that resolves after the given amount of time.\n * @param delay Number of milliseconds to delay\n * @returns Promise that resolves after the given amount of time\n */\n static DelayAsync(e) {\n return new Promise((t) => {\n setTimeout(() => {\n t();\n }, e);\n });\n }\n /**\n * Utility function to detect if the current user agent is Safari\n * @returns whether or not the current user agent is safari\n */\n static IsSafari() {\n return to() ? /^((?!chrome|android).)*safari/i.test(navigator.userAgent) : !1;\n }\n}\nge.UseCustomRequestHeaders = !1;\nge.CustomRequestHeaders = mi.CustomRequestHeaders;\nge.GetDOMTextContent = O_;\nge._DefaultCdnUrl = \"https://cdn.babylonjs.com\";\nge.GetAbsoluteUrl = typeof document == \"object\" ? (n) => {\n const e = document.createElement(\"a\");\n return e.href = n, e.href;\n} : typeof URL == \"function\" && typeof location == \"object\" ? (n) => new URL(n, location.origin).href : () => {\n throw new Error(\"Unable to get absolute URL. Override BABYLON.Tools.GetAbsoluteUrl to a custom implementation for the current context.\");\n};\nge.NoneLogLevel = ne.NoneLogLevel;\nge.MessageLogLevel = ne.MessageLogLevel;\nge.WarningLogLevel = ne.WarningLogLevel;\nge.ErrorLogLevel = ne.ErrorLogLevel;\nge.AllLogLevel = ne.AllLogLevel;\nge.IsWindowObjectExist = yi;\nge.PerformanceNoneLogLevel = 0;\nge.PerformanceUserMarkLogLevel = 1;\nge.PerformanceConsoleLogLevel = 2;\nge.StartPerformanceCounter = ge._StartPerformanceCounterDisabled;\nge.EndPerformanceCounter = ge._EndPerformanceCounterDisabled;\nclass Pr {\n /**\n * Constructor.\n * @param iterations the number of iterations.\n * @param func the function to run each iteration\n * @param successCallback the callback that will be called upon successful execution\n * @param offset starting offset.\n */\n constructor(e, t, i, r = 0) {\n this.iterations = e, this.index = r - 1, this._done = !1, this._fn = t, this._successCallback = i;\n }\n /**\n * Execute the next iteration. Must be called after the last iteration was finished.\n */\n executeNext() {\n this._done || (this.index + 1 < this.iterations ? (++this.index, this._fn(this)) : this.breakLoop());\n }\n /**\n * Break the loop and run the success callback.\n */\n breakLoop() {\n this._done = !0, this._successCallback();\n }\n /**\n * Create and run an async loop.\n * @param iterations the number of iterations.\n * @param fn the function to run each iteration\n * @param successCallback the callback that will be called upon successful execution\n * @param offset starting offset.\n * @returns the created async loop object\n */\n static Run(e, t, i, r = 0) {\n const s = new Pr(e, t, i, r);\n return s.executeNext(), s;\n }\n /**\n * A for-loop that will run a given number of iterations synchronous and the rest async.\n * @param iterations total number of iterations\n * @param syncedIterations number of synchronous iterations in each async iteration.\n * @param fn the function to call each iteration.\n * @param callback a success call back that will be called when iterating stops.\n * @param breakFunction a break condition (optional)\n * @param timeout timeout settings for the setTimeout function. default - 0.\n * @returns the created async loop object\n */\n static SyncAsyncForLoop(e, t, i, r, s, a = 0) {\n return Pr.Run(Math.ceil(e / t), (o) => {\n s && s() ? o.breakLoop() : setTimeout(() => {\n for (let l = 0; l < t; ++l) {\n const c = o.index * t + l;\n if (c >= e)\n break;\n if (i(c), s && s()) {\n o.breakLoop();\n break;\n }\n }\n o.executeNext();\n }, a);\n }, r);\n }\n}\nge.Mix = pu;\nge.IsExponentOfTwo = mo;\nst.FallbackTexture = \"data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QBmRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAAExAAIAAAAQAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQubmV0IDQuMC41AP/bAEMABAIDAwMCBAMDAwQEBAQFCQYFBQUFCwgIBgkNCw0NDQsMDA4QFBEODxMPDAwSGBITFRYXFxcOERkbGRYaFBYXFv/bAEMBBAQEBQUFCgYGChYPDA8WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFv/AABEIAQABAAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APH6KKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76CiiigD5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BQooooA+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/voKKKKAPl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76CiiigD5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BQooooA+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/voKKKKAPl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76P//Z\";\nclass Li {\n /**\n * Instantiates a Smart Array.\n * @param capacity defines the default capacity of the array.\n */\n constructor(e) {\n this.length = 0, this.data = new Array(e), this._id = Li._GlobalId++;\n }\n /**\n * Pushes a value at the end of the active data.\n * @param value defines the object to push in the array.\n */\n push(e) {\n this.data[this.length++] = e, this.length > this.data.length && (this.data.length *= 2);\n }\n /**\n * Iterates over the active data and apply the lambda to them.\n * @param func defines the action to apply on each value.\n */\n forEach(e) {\n for (let t = 0; t < this.length; t++)\n e(this.data[t]);\n }\n /**\n * Sorts the full sets of data.\n * @param compareFn defines the comparison function to apply.\n */\n sort(e) {\n this.data.sort(e);\n }\n /**\n * Resets the active data to an empty array.\n */\n reset() {\n this.length = 0;\n }\n /**\n * Releases all the data from the array as well as the array.\n */\n dispose() {\n this.reset(), this.data && (this.data.length = 0);\n }\n /**\n * Concats the active data with a given array.\n * @param array defines the data to concatenate with.\n */\n concat(e) {\n if (e.length !== 0) {\n this.length + e.length > this.data.length && (this.data.length = (this.length + e.length) * 2);\n for (let t = 0; t < e.length; t++)\n this.data[this.length++] = (e.data || e)[t];\n }\n }\n /**\n * Returns the position of a value in the active data.\n * @param value defines the value to find the index for\n * @returns the index if found in the active data otherwise -1\n */\n indexOf(e) {\n const t = this.data.indexOf(e);\n return t >= this.length ? -1 : t;\n }\n /**\n * Returns whether an element is part of the active data.\n * @param value defines the value to look for\n * @returns true if found in the active data otherwise false\n */\n contains(e) {\n return this.indexOf(e) !== -1;\n }\n}\nLi._GlobalId = 0;\nclass xn extends Li {\n constructor() {\n super(...arguments), this._duplicateId = 0;\n }\n /**\n * Pushes a value at the end of the active data.\n * THIS DOES NOT PREVENT DUPPLICATE DATA\n * @param value defines the object to push in the array.\n */\n push(e) {\n super.push(e), e.__smartArrayFlags || (e.__smartArrayFlags = {}), e.__smartArrayFlags[this._id] = this._duplicateId;\n }\n /**\n * Pushes a value at the end of the active data.\n * If the data is already present, it won t be added again\n * @param value defines the object to push in the array.\n * @returns true if added false if it was already present\n */\n pushNoDuplicate(e) {\n return e.__smartArrayFlags && e.__smartArrayFlags[this._id] === this._duplicateId ? !1 : (this.push(e), !0);\n }\n /**\n * Resets the active data to an empty array.\n */\n reset() {\n super.reset(), this._duplicateId++;\n }\n /**\n * Concats the active data with a given array.\n * This ensures no duplicate will be present in the result.\n * @param array defines the data to concatenate with.\n */\n concatWithNoDuplicate(e) {\n if (e.length !== 0) {\n this.length + e.length > this.data.length && (this.data.length = (this.length + e.length) * 2);\n for (let t = 0; t < e.length; t++) {\n const i = (e.data || e)[t];\n this.pushNoDuplicate(i);\n }\n }\n }\n}\nclass jp {\n constructor() {\n this._count = 0, this._data = {};\n }\n /**\n * This will clear this dictionary and copy the content from the 'source' one.\n * If the T value is a custom object, it won't be copied/cloned, the same object will be used\n * @param source the dictionary to take the content from and copy to this dictionary\n */\n copyFrom(e) {\n this.clear(), e.forEach((t, i) => this.add(t, i));\n }\n /**\n * Get a value based from its key\n * @param key the given key to get the matching value from\n * @returns the value if found, otherwise undefined is returned\n */\n get(e) {\n const t = this._data[e];\n if (t !== void 0)\n return t;\n }\n /**\n * Get a value from its key or add it if it doesn't exist.\n * This method will ensure you that a given key/data will be present in the dictionary.\n * @param key the given key to get the matching value from\n * @param factory the factory that will create the value if the key is not present in the dictionary.\n * The factory will only be invoked if there's no data for the given key.\n * @returns the value corresponding to the key.\n */\n getOrAddWithFactory(e, t) {\n let i = this.get(e);\n return i !== void 0 || (i = t(e), i && this.add(e, i)), i;\n }\n /**\n * Get a value from its key if present in the dictionary otherwise add it\n * @param key the key to get the value from\n * @param val if there's no such key/value pair in the dictionary add it with this value\n * @returns the value corresponding to the key\n */\n getOrAdd(e, t) {\n const i = this.get(e);\n return i !== void 0 ? i : (this.add(e, t), t);\n }\n /**\n * Check if there's a given key in the dictionary\n * @param key the key to check for\n * @returns true if the key is present, false otherwise\n */\n contains(e) {\n return this._data[e] !== void 0;\n }\n /**\n * Add a new key and its corresponding value\n * @param key the key to add\n * @param value the value corresponding to the key\n * @returns true if the operation completed successfully, false if we couldn't insert the key/value because there was already this key in the dictionary\n */\n add(e, t) {\n return this._data[e] !== void 0 ? !1 : (this._data[e] = t, ++this._count, !0);\n }\n /**\n * Update a specific value associated to a key\n * @param key defines the key to use\n * @param value defines the value to store\n * @returns true if the value was updated (or false if the key was not found)\n */\n set(e, t) {\n return this._data[e] === void 0 ? !1 : (this._data[e] = t, !0);\n }\n /**\n * Get the element of the given key and remove it from the dictionary\n * @param key defines the key to search\n * @returns the value associated with the key or null if not found\n */\n getAndRemove(e) {\n const t = this.get(e);\n return t !== void 0 ? (delete this._data[e], --this._count, t) : null;\n }\n /**\n * Remove a key/value from the dictionary.\n * @param key the key to remove\n * @returns true if the item was successfully deleted, false if no item with such key exist in the dictionary\n */\n remove(e) {\n return this.contains(e) ? (delete this._data[e], --this._count, !0) : !1;\n }\n /**\n * Clear the whole content of the dictionary\n */\n clear() {\n this._data = {}, this._count = 0;\n }\n /**\n * Gets the current count\n */\n get count() {\n return this._count;\n }\n /**\n * Execute a callback on each key/val of the dictionary.\n * Note that you can remove any element in this dictionary in the callback implementation\n * @param callback the callback to execute on a given key/value pair\n */\n forEach(e) {\n for (const t in this._data) {\n const i = this._data[t];\n e(t, i);\n }\n }\n /**\n * Execute a callback on every occurrence of the dictionary until it returns a valid TRes object.\n * If the callback returns null or undefined the method will iterate to the next key/value pair\n * Note that you can remove any element in this dictionary in the callback implementation\n * @param callback the callback to execute, if it return a valid T instanced object the enumeration will stop and the object will be returned\n * @returns the first item\n */\n first(e) {\n for (const t in this._data) {\n const i = this._data[t], r = e(t, i);\n if (r)\n return r;\n }\n return null;\n }\n}\nclass Rn {\n /**\n * Evaluate a query\n * @param query defines the query to evaluate\n * @param evaluateCallback defines the callback used to filter result\n * @returns true if the query matches\n */\n static Eval(e, t) {\n return e.match(/\\([^()]*\\)/g) ? e = e.replace(/\\([^()]*\\)/g, (i) => (i = i.slice(1, i.length - 1), Rn._HandleParenthesisContent(i, t))) : e = Rn._HandleParenthesisContent(e, t), e === \"true\" ? !0 : e === \"false\" ? !1 : Rn.Eval(e, t);\n }\n static _HandleParenthesisContent(e, t) {\n t = t || ((s) => s === \"true\");\n let i;\n const r = e.split(\"||\");\n for (const s in r)\n if (Object.prototype.hasOwnProperty.call(r, s)) {\n let a = Rn._SimplifyNegation(r[s].trim());\n const o = a.split(\"&&\");\n if (o.length > 1)\n for (let l = 0; l < o.length; ++l) {\n const c = Rn._SimplifyNegation(o[l].trim());\n if (c !== \"true\" && c !== \"false\" ? c[0] === \"!\" ? i = !t(c.substring(1)) : i = t(c) : i = c === \"true\", !i) {\n a = \"false\";\n break;\n }\n }\n if (i || a === \"true\") {\n i = !0;\n break;\n }\n a !== \"true\" && a !== \"false\" ? a[0] === \"!\" ? i = !t(a.substring(1)) : i = t(a) : i = a === \"true\";\n }\n return i ? \"true\" : \"false\";\n }\n static _SimplifyNegation(e) {\n return e = e.replace(/^[\\s!]+/, (t) => (t = t.replace(/[\\s]/g, () => \"\"), t.length % 2 ? \"!\" : \"\")), e = e.trim(), e === \"!true\" ? e = \"false\" : e === \"!false\" && (e = \"true\"), e;\n }\n}\nclass rt {\n /**\n * Adds support for tags on the given object\n * @param obj defines the object to use\n */\n static EnableFor(e) {\n e._tags = e._tags || {}, e.hasTags = () => rt.HasTags(e), e.addTags = (t) => rt.AddTagsTo(e, t), e.removeTags = (t) => rt.RemoveTagsFrom(e, t), e.matchesTagsQuery = (t) => rt.MatchesQuery(e, t);\n }\n /**\n * Removes tags support\n * @param obj defines the object to use\n */\n static DisableFor(e) {\n delete e._tags, delete e.hasTags, delete e.addTags, delete e.removeTags, delete e.matchesTagsQuery;\n }\n /**\n * Gets a boolean indicating if the given object has tags\n * @param obj defines the object to use\n * @returns a boolean\n */\n static HasTags(e) {\n if (!e._tags)\n return !1;\n const t = e._tags;\n for (const i in t)\n if (Object.prototype.hasOwnProperty.call(t, i))\n return !0;\n return !1;\n }\n /**\n * Gets the tags available on a given object\n * @param obj defines the object to use\n * @param asString defines if the tags must be returned as a string instead of an array of strings\n * @returns the tags\n */\n static GetTags(e, t = !0) {\n if (!e._tags)\n return null;\n if (t) {\n const i = [];\n for (const r in e._tags)\n Object.prototype.hasOwnProperty.call(e._tags, r) && e._tags[r] === !0 && i.push(r);\n return i.join(\" \");\n } else\n return e._tags;\n }\n /**\n * Adds tags to an object\n * @param obj defines the object to use\n * @param tagsString defines the tag string. The tags 'true' and 'false' are reserved and cannot be used as tags.\n * A tag cannot start with '||', '&&', and '!'. It cannot contain whitespaces\n */\n static AddTagsTo(e, t) {\n if (!t || typeof t != \"string\")\n return;\n t.split(\" \").forEach(function(r) {\n rt._AddTagTo(e, r);\n });\n }\n /**\n * @internal\n */\n static _AddTagTo(e, t) {\n t = t.trim(), !(t === \"\" || t === \"true\" || t === \"false\") && (t.match(/[\\s]/) || t.match(/^([!]|([|]|[&]){2})/) || (rt.EnableFor(e), e._tags[t] = !0));\n }\n /**\n * Removes specific tags from a specific object\n * @param obj defines the object to use\n * @param tagsString defines the tags to remove\n */\n static RemoveTagsFrom(e, t) {\n if (!rt.HasTags(e))\n return;\n const i = t.split(\" \");\n for (const r in i)\n rt._RemoveTagFrom(e, i[r]);\n }\n /**\n * @internal\n */\n static _RemoveTagFrom(e, t) {\n delete e._tags[t];\n }\n /**\n * Defines if tags hosted on an object match a given query\n * @param obj defines the object to use\n * @param tagsQuery defines the tag query\n * @returns a boolean\n */\n static MatchesQuery(e, t) {\n return t === void 0 ? !0 : t === \"\" ? rt.HasTags(e) : Rn.Eval(t, (i) => rt.HasTags(e) && e._tags[i]);\n }\n}\nconst kl = 1 / 2.2, zl = 2.2, xt = 1e-3;\nclass vi {\n /**\n * Returns an array of the given size filled with elements built from the given constructor and the parameters.\n * @param size the number of element to construct and put in the array.\n * @param itemBuilder a callback responsible for creating new instance of item. Called once per array entry.\n * @returns a new array filled with new objects.\n */\n static BuildArray(e, t) {\n const i = [];\n for (let r = 0; r < e; ++r)\n i.push(t());\n return i;\n }\n /**\n * Returns a tuple of the given size filled with elements built from the given constructor and the parameters.\n * @param size he number of element to construct and put in the tuple.\n * @param itemBuilder a callback responsible for creating new instance of item. Called once per tuple entry.\n * @returns a new tuple filled with new objects.\n */\n static BuildTuple(e, t) {\n return vi.BuildArray(e, t);\n }\n}\nfunction Ty(n, e, t) {\n const i = n[e];\n if (typeof i != \"function\")\n return null;\n const r = function() {\n const s = n.length, a = r.previous.apply(n, arguments);\n return t(e, s), a;\n };\n return i.next = r, r.previous = i, n[e] = r, () => {\n const s = r.previous;\n if (!s)\n return;\n const a = r.next;\n a ? (s.next = a, a.previous = s) : (s.next = void 0, n[e] = s), r.next = void 0, r.previous = void 0;\n };\n}\nconst xy = [\"push\", \"splice\", \"pop\", \"shift\", \"unshift\"];\nfunction z_(n, e) {\n const t = xy.map((i) => Ty(n, i, e));\n return () => {\n t.forEach((i) => {\n i == null || i();\n });\n };\n}\nfunction Ii(n, e, t = 1401298e-51) {\n return Math.abs(n - e) <= t;\n}\nfunction Zt(n, e) {\n return n === e ? n : Math.random() * (e - n) + n;\n}\nfunction W_(n, e, t) {\n return n + (e - n) * t;\n}\nfunction ii(n, e = 0, t = 1) {\n return Math.min(t, Math.max(e, n));\n}\nfunction G_(n) {\n return n -= Math.PI * 2 * Math.floor((n + Math.PI) / (Math.PI * 2)), n;\n}\nfunction Kr(n) {\n const e = n.toString(16);\n return n <= 15 ? (\"0\" + e).toUpperCase() : e.toUpperCase();\n}\nconst nr = (n) => parseInt(n.toString().replace(/\\W/g, \"\"));\nclass me {\n /**\n * Creates a new Vector2 from the given x and y coordinates\n * @param x defines the first coordinate\n * @param y defines the second coordinate\n */\n constructor(e = 0, t = 0) {\n this.x = e, this.y = t;\n }\n /**\n * Gets a string with the Vector2 coordinates\n * @returns a string with the Vector2 coordinates\n */\n toString() {\n return `{X: ${this.x} Y: ${this.y}}`;\n }\n /**\n * Gets class name\n * @returns the string \"Vector2\"\n */\n getClassName() {\n return \"Vector2\";\n }\n /**\n * Gets current vector hash code\n * @returns the Vector2 hash code as a number\n */\n getHashCode() {\n const e = nr(this.x), t = nr(this.y);\n let i = e;\n return i = i * 397 ^ t, i;\n }\n // Operators\n /**\n * Sets the Vector2 coordinates in the given array or Float32Array from the given index.\n * Example Playground https://playground.babylonjs.com/#QYBWV4#15\n * @param array defines the source array\n * @param index defines the offset in source array\n * @returns the current Vector2\n */\n toArray(e, t = 0) {\n return e[t] = this.x, e[t + 1] = this.y, this;\n }\n /**\n * Update the current vector from an array\n * Example Playground https://playground.babylonjs.com/#QYBWV4#39\n * @param array defines the destination array\n * @param offset defines the offset in the destination array\n * @returns the current Vector2\n */\n fromArray(e, t = 0) {\n return me.FromArrayToRef(e, t, this), this;\n }\n /**\n * Copy the current vector to an array\n * Example Playground https://playground.babylonjs.com/#QYBWV4#40\n * @returns a new array with 2 elements: the Vector2 coordinates.\n */\n asArray() {\n return [this.x, this.y];\n }\n /**\n * Sets the Vector2 coordinates with the given Vector2 coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#24\n * @param source defines the source Vector2\n * @returns the current updated Vector2\n */\n copyFrom(e) {\n return this.x = e.x, this.y = e.y, this;\n }\n /**\n * Sets the Vector2 coordinates with the given floats\n * Example Playground https://playground.babylonjs.com/#QYBWV4#25\n * @param x defines the first coordinate\n * @param y defines the second coordinate\n * @returns the current updated Vector2\n */\n copyFromFloats(e, t) {\n return this.x = e, this.y = t, this;\n }\n /**\n * Sets the Vector2 coordinates with the given floats\n * Example Playground https://playground.babylonjs.com/#QYBWV4#62\n * @param x defines the first coordinate\n * @param y defines the second coordinate\n * @returns the current updated Vector2\n */\n set(e, t) {\n return this.copyFromFloats(e, t);\n }\n /**\n * Copies the given float to the current Vector2 coordinates\n * @param v defines the x and y coordinates of the operand\n * @returns the current updated Vector2\n */\n setAll(e) {\n return this.copyFromFloats(e, e);\n }\n /**\n * Add another vector with the current one\n * Example Playground https://playground.babylonjs.com/#QYBWV4#11\n * @param otherVector defines the other vector\n * @returns a new Vector2 set with the addition of the current Vector2 and the given one coordinates\n */\n add(e) {\n return new this.constructor(this.x + e.x, this.y + e.y);\n }\n /**\n * Sets the \"result\" coordinates with the addition of the current Vector2 and the given one coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#12\n * @param otherVector defines the other vector\n * @param result defines the target vector\n * @returns result input\n */\n addToRef(e, t) {\n return t.x = this.x + e.x, t.y = this.y + e.y, t;\n }\n /**\n * Set the Vector2 coordinates by adding the given Vector2 coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#13\n * @param otherVector defines the other vector\n * @returns the current updated Vector2\n */\n addInPlace(e) {\n return this.x += e.x, this.y += e.y, this;\n }\n /**\n * Adds the given coordinates to the current Vector2\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @returns the current updated Vector2\n */\n addInPlaceFromFloats(e, t) {\n return this.x += e, this.y += t, this;\n }\n /**\n * Gets a new Vector2 by adding the current Vector2 coordinates to the given Vector3 x, y coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#14\n * @param otherVector defines the other vector\n * @returns a new Vector2\n */\n addVector3(e) {\n return new this.constructor(this.x + e.x, this.y + e.y);\n }\n /**\n * Gets a new Vector2 set with the subtracted coordinates of the given one from the current Vector2\n * Example Playground https://playground.babylonjs.com/#QYBWV4#61\n * @param otherVector defines the other vector\n * @returns a new Vector2\n */\n subtract(e) {\n return new this.constructor(this.x - e.x, this.y - e.y);\n }\n /**\n * Sets the \"result\" coordinates with the subtraction of the given one from the current Vector2 coordinates.\n * Example Playground https://playground.babylonjs.com/#QYBWV4#63\n * @param otherVector defines the other vector\n * @param result defines the target vector\n * @returns result input\n */\n subtractToRef(e, t) {\n return t.x = this.x - e.x, t.y = this.y - e.y, t;\n }\n /**\n * Sets the current Vector2 coordinates by subtracting from it the given one coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#88\n * @param otherVector defines the other vector\n * @returns the current updated Vector2\n */\n subtractInPlace(e) {\n return this.x -= e.x, this.y -= e.y, this;\n }\n /**\n * Multiplies in place the current Vector2 coordinates by the given ones\n * Example Playground https://playground.babylonjs.com/#QYBWV4#43\n * @param otherVector defines the other vector\n * @returns the current updated Vector2\n */\n multiplyInPlace(e) {\n return this.x *= e.x, this.y *= e.y, this;\n }\n /**\n * Returns a new Vector2 set with the multiplication of the current Vector2 and the given one coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#42\n * @param otherVector defines the other vector\n * @returns a new Vector2\n */\n multiply(e) {\n return new this.constructor(this.x * e.x, this.y * e.y);\n }\n /**\n * Sets \"result\" coordinates with the multiplication of the current Vector2 and the given one coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#44\n * @param otherVector defines the other vector\n * @param result defines the target vector\n * @returns result input\n */\n multiplyToRef(e, t) {\n return t.x = this.x * e.x, t.y = this.y * e.y, t;\n }\n /**\n * Gets a new Vector2 set with the Vector2 coordinates multiplied by the given floats\n * Example Playground https://playground.babylonjs.com/#QYBWV4#89\n * @param x defines the first coordinate\n * @param y defines the second coordinate\n * @returns a new Vector2\n */\n multiplyByFloats(e, t) {\n return new this.constructor(this.x * e, this.y * t);\n }\n /**\n * Returns a new Vector2 set with the Vector2 coordinates divided by the given one coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#27\n * @param otherVector defines the other vector\n * @returns a new Vector2\n */\n divide(e) {\n return new this.constructor(this.x / e.x, this.y / e.y);\n }\n /**\n * Sets the \"result\" coordinates with the Vector2 divided by the given one coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#30\n * @param otherVector defines the other vector\n * @param result defines the target vector\n * @returns result input\n */\n divideToRef(e, t) {\n return t.x = this.x / e.x, t.y = this.y / e.y, t;\n }\n /**\n * Divides the current Vector2 coordinates by the given ones\n * Example Playground https://playground.babylonjs.com/#QYBWV4#28\n * @param otherVector defines the other vector\n * @returns the current updated Vector2\n */\n divideInPlace(e) {\n return this.x = this.x / e.x, this.y = this.y / e.y, this;\n }\n /**\n * Updates the current Vector2 with the minimal coordinate values between its and the given vector ones\n * @param other defines the second operand\n * @returns the current updated Vector2\n */\n minimizeInPlace(e) {\n return this.minimizeInPlaceFromFloats(e.x, e.y);\n }\n /**\n * Updates the current Vector2 with the maximal coordinate values between its and the given vector ones.\n * @param other defines the second operand\n * @returns the current updated Vector2\n */\n maximizeInPlace(e) {\n return this.maximizeInPlaceFromFloats(e.x, e.y);\n }\n /**\n * Updates the current Vector2 with the minimal coordinate values between its and the given coordinates\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @returns the current updated Vector2\n */\n minimizeInPlaceFromFloats(e, t) {\n return this.x = Math.min(e, this.x), this.y = Math.min(t, this.y), this;\n }\n /**\n * Updates the current Vector2 with the maximal coordinate values between its and the given coordinates.\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @returns the current updated Vector2\n */\n maximizeInPlaceFromFloats(e, t) {\n return this.x = Math.max(e, this.x), this.y = Math.max(t, this.y), this;\n }\n /**\n * Returns a new Vector2 set with the subtraction of the given floats from the current Vector2 coordinates\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @returns the resulting Vector2\n */\n subtractFromFloats(e, t) {\n return new this.constructor(this.x - e, this.y - t);\n }\n /**\n * Subtracts the given floats from the current Vector2 coordinates and set the given vector \"result\" with this result\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param result defines the Vector2 object where to store the result\n * @returns the result\n */\n subtractFromFloatsToRef(e, t, i) {\n return i.copyFromFloats(this.x - e, this.y - t);\n }\n /**\n * Gets a new Vector2 with current Vector2 negated coordinates\n * @returns a new Vector2\n */\n negate() {\n return new this.constructor(-this.x, -this.y);\n }\n /**\n * Negate this vector in place\n * Example Playground https://playground.babylonjs.com/#QYBWV4#23\n * @returns this\n */\n negateInPlace() {\n return this.x *= -1, this.y *= -1, this;\n }\n /**\n * Negate the current Vector2 and stores the result in the given vector \"result\" coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#41\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n negateToRef(e) {\n return e.copyFromFloats(this.x * -1, this.y * -1);\n }\n /**\n * Multiply the Vector2 coordinates by\n * Example Playground https://playground.babylonjs.com/#QYBWV4#59\n * @param scale defines the scaling factor\n * @returns the current updated Vector2\n */\n scaleInPlace(e) {\n return this.x *= e, this.y *= e, this;\n }\n /**\n * Returns a new Vector2 scaled by \"scale\" from the current Vector2\n * Example Playground https://playground.babylonjs.com/#QYBWV4#52\n * @param scale defines the scaling factor\n * @returns a new Vector2\n */\n scale(e) {\n return new this.constructor(this.x * e, this.y * e);\n }\n /**\n * Scale the current Vector2 values by a factor to a given Vector2\n * Example Playground https://playground.babylonjs.com/#QYBWV4#57\n * @param scale defines the scale factor\n * @param result defines the Vector2 object where to store the result\n * @returns result input\n */\n scaleToRef(e, t) {\n return t.x = this.x * e, t.y = this.y * e, t;\n }\n /**\n * Scale the current Vector2 values by a factor and add the result to a given Vector2\n * Example Playground https://playground.babylonjs.com/#QYBWV4#58\n * @param scale defines the scale factor\n * @param result defines the Vector2 object where to store the result\n * @returns result input\n */\n scaleAndAddToRef(e, t) {\n return t.x += this.x * e, t.y += this.y * e, t;\n }\n /**\n * Gets a boolean if two vectors are equals\n * Example Playground https://playground.babylonjs.com/#QYBWV4#31\n * @param otherVector defines the other vector\n * @returns true if the given vector coordinates strictly equal the current Vector2 ones\n */\n equals(e) {\n return e && this.x === e.x && this.y === e.y;\n }\n /**\n * Gets a boolean if two vectors are equals (using an epsilon value)\n * Example Playground https://playground.babylonjs.com/#QYBWV4#32\n * @param otherVector defines the other vector\n * @param epsilon defines the minimal distance to consider equality\n * @returns true if the given vector coordinates are close to the current ones by a distance of epsilon.\n */\n equalsWithEpsilon(e, t = xt) {\n return e && Ii(this.x, e.x, t) && Ii(this.y, e.y, t);\n }\n /**\n * Returns true if the current Vector2 coordinates equals the given floats\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @returns true if both vectors are equal\n */\n equalsToFloats(e, t) {\n return this.x === e && this.y === t;\n }\n /**\n * Gets a new Vector2 from current Vector2 floored values\n * Example Playground https://playground.babylonjs.com/#QYBWV4#35\n * eg (1.2, 2.31) returns (1, 2)\n * @returns a new Vector2\n */\n floor() {\n return new this.constructor(Math.floor(this.x), Math.floor(this.y));\n }\n /**\n * Gets the current Vector2's floored values and stores them in result\n * @param result the Vector2 to store the result in\n * @returns the result Vector2\n */\n floorToRef(e) {\n return e.x = Math.floor(this.x), e.y = Math.floor(this.y), e;\n }\n /**\n * Gets a new Vector2 from current Vector2 fractional values\n * Example Playground https://playground.babylonjs.com/#QYBWV4#34\n * eg (1.2, 2.31) returns (0.2, 0.31)\n * @returns a new Vector2\n */\n fract() {\n return new this.constructor(this.x - Math.floor(this.x), this.y - Math.floor(this.y));\n }\n /**\n * Gets the current Vector2's fractional values and stores them in result\n * @param result the Vector2 to store the result in\n * @returns the result Vector2\n */\n fractToRef(e) {\n return e.x = this.x - Math.floor(this.x), e.y = this.y - Math.floor(this.y), e;\n }\n /**\n * Rotate the current vector into a given result vector\n * Example Playground https://playground.babylonjs.com/#QYBWV4#49\n * @param angle defines the rotation angle\n * @param result defines the result vector where to store the rotated vector\n * @returns result input\n */\n rotateToRef(e, t) {\n const i = Math.cos(e), r = Math.sin(e), s = i * this.x - r * this.y, a = r * this.x + i * this.y;\n return t.x = s, t.y = a, t;\n }\n // Properties\n /**\n * Gets the length of the vector\n * @returns the vector length (float)\n */\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n /**\n * Gets the vector squared length\n * @returns the vector squared length (float)\n */\n lengthSquared() {\n return this.x * this.x + this.y * this.y;\n }\n // Methods\n /**\n * Normalize the vector\n * Example Playground https://playground.babylonjs.com/#QYBWV4#48\n * @returns the current updated Vector2\n */\n normalize() {\n return this.normalizeFromLength(this.length());\n }\n /**\n * Normalize the current Vector2 with the given input length.\n * Please note that this is an in place operation.\n * @param len the length of the vector\n * @returns the current updated Vector2\n */\n normalizeFromLength(e) {\n return e === 0 || e === 1 ? this : this.scaleInPlace(1 / e);\n }\n /**\n * Normalize the current Vector2 to a new vector\n * @returns the new Vector2\n */\n normalizeToNew() {\n const e = new this.constructor();\n return this.normalizeToRef(e), e;\n }\n /**\n * Normalize the current Vector2 to the reference\n * @param reference define the Vector to update\n * @returns the updated Vector2\n */\n normalizeToRef(e) {\n const t = this.length();\n return t === 0 ? e.copyFrom(this) : this.scaleToRef(1 / t, e);\n }\n /**\n * Gets a new Vector2 copied from the Vector2\n * Example Playground https://playground.babylonjs.com/#QYBWV4#20\n * @returns a new Vector2\n */\n clone() {\n return new this.constructor(this.x, this.y);\n }\n /**\n * Gets the dot product of the current vector and the vector \"otherVector\"\n * @param otherVector defines second vector\n * @returns the dot product (float)\n */\n dot(e) {\n return this.x * e.x + this.y * e.y;\n }\n // Statics\n /**\n * Gets a new Vector2(0, 0)\n * @returns a new Vector2\n */\n static Zero() {\n return new me(0, 0);\n }\n /**\n * Gets a new Vector2(1, 1)\n * @returns a new Vector2\n */\n static One() {\n return new me(1, 1);\n }\n /**\n * Returns a new Vector2 with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @returns a Vector2 with random values between min and max\n */\n static Random(e = 0, t = 1) {\n return new me(Zt(e, t), Zt(e, t));\n }\n /**\n * Sets a Vector2 with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @param ref the ref to store the values in\n * @returns the ref with random values between min and max\n */\n static RandomToRef(e = 0, t = 1, i) {\n return i.copyFromFloats(Zt(e, t), Zt(e, t));\n }\n /**\n * Gets a zero Vector2 that must not be updated\n */\n static get ZeroReadOnly() {\n return me._ZeroReadOnly;\n }\n /**\n * Gets a new Vector2 set from the given index element of the given array\n * Example Playground https://playground.babylonjs.com/#QYBWV4#79\n * @param array defines the data source\n * @param offset defines the offset in the data source\n * @returns a new Vector2\n */\n static FromArray(e, t = 0) {\n return new me(e[t], e[t + 1]);\n }\n /**\n * Sets \"result\" from the given index element of the given array\n * Example Playground https://playground.babylonjs.com/#QYBWV4#80\n * @param array defines the data source\n * @param offset defines the offset in the data source\n * @param result defines the target vector\n * @returns result input\n */\n static FromArrayToRef(e, t, i) {\n return i.x = e[t], i.y = e[t + 1], i;\n }\n /**\n * Sets the given vector \"result\" with the given floats.\n * @param x defines the x coordinate of the source\n * @param y defines the y coordinate of the source\n * @param result defines the Vector2 where to store the result\n * @returns the result vector\n */\n static FromFloatsToRef(e, t, i) {\n return i.copyFromFloats(e, t), i;\n }\n /**\n * Gets a new Vector2 located for \"amount\" (float) on the CatmullRom spline defined by the given four Vector2\n * Example Playground https://playground.babylonjs.com/#QYBWV4#65\n * @param value1 defines 1st point of control\n * @param value2 defines 2nd point of control\n * @param value3 defines 3rd point of control\n * @param value4 defines 4th point of control\n * @param amount defines the interpolation factor\n * @returns a new Vector2\n */\n static CatmullRom(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 0.5 * (2 * t.x + (-e.x + i.x) * s + (2 * e.x - 5 * t.x + 4 * i.x - r.x) * a + (-e.x + 3 * t.x - 3 * i.x + r.x) * o), c = 0.5 * (2 * t.y + (-e.y + i.y) * s + (2 * e.y - 5 * t.y + 4 * i.y - r.y) * a + (-e.y + 3 * t.y - 3 * i.y + r.y) * o);\n return new e.constructor(l, c);\n }\n /**\n * Sets reference with same the coordinates than \"value\" ones if the vector \"value\" is in the square defined by \"min\" and \"max\".\n * If a coordinate of \"value\" is lower than \"min\" coordinates, the returned Vector2 is given this \"min\" coordinate.\n * If a coordinate of \"value\" is greater than \"max\" coordinates, the returned Vector2 is given this \"max\" coordinate\n * @param value defines the value to clamp\n * @param min defines the lower limit\n * @param max defines the upper limit\n * @param ref the reference\n * @returns the reference\n */\n static ClampToRef(e, t, i, r) {\n return r.x = ii(e.x, t.x, i.x), r.y = ii(e.y, t.y, i.y), r;\n }\n /**\n * Returns a new Vector2 set with same the coordinates than \"value\" ones if the vector \"value\" is in the square defined by \"min\" and \"max\".\n * If a coordinate of \"value\" is lower than \"min\" coordinates, the returned Vector2 is given this \"min\" coordinate.\n * If a coordinate of \"value\" is greater than \"max\" coordinates, the returned Vector2 is given this \"max\" coordinate\n * Example Playground https://playground.babylonjs.com/#QYBWV4#76\n * @param value defines the value to clamp\n * @param min defines the lower limit\n * @param max defines the upper limit\n * @returns a new Vector2\n */\n static Clamp(e, t, i) {\n const r = ii(e.x, t.x, i.x), s = ii(e.y, t.y, i.y);\n return new e.constructor(r, s);\n }\n /**\n * Returns a new Vector2 located for \"amount\" (float) on the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\"\n * Example Playground https://playground.babylonjs.com/#QYBWV4#81\n * @param value1 defines the 1st control point\n * @param tangent1 defines the outgoing tangent\n * @param value2 defines the 2nd control point\n * @param tangent2 defines the incoming tangent\n * @param amount defines the interpolation factor\n * @returns a new Vector2\n */\n static Hermite(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 2 * o - 3 * a + 1, c = -2 * o + 3 * a, h = o - 2 * a + s, u = o - a, f = e.x * l + i.x * c + t.x * h + r.x * u, d = e.y * l + i.y * c + t.y * h + r.y * u;\n return new e.constructor(f, d);\n }\n /**\n * Returns a new Vector2 which is the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * Example Playground https://playground.babylonjs.com/#QYBWV4#82\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @returns 1st derivative\n */\n static Hermite1stDerivative(e, t, i, r, s) {\n const a = new e.constructor();\n return this.Hermite1stDerivativeToRef(e, t, i, r, s, a), a;\n }\n /**\n * Returns a new Vector2 which is the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * Example Playground https://playground.babylonjs.com/#QYBWV4#83\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @param result define where the derivative will be stored\n * @returns result input\n */\n static Hermite1stDerivativeToRef(e, t, i, r, s, a) {\n const o = s * s;\n return a.x = (o - s) * 6 * e.x + (3 * o - 4 * s + 1) * t.x + (-o + s) * 6 * i.x + (3 * o - 2 * s) * r.x, a.y = (o - s) * 6 * e.y + (3 * o - 4 * s + 1) * t.y + (-o + s) * 6 * i.y + (3 * o - 2 * s) * r.y, a;\n }\n /**\n * Returns a new Vector2 located for \"amount\" (float) on the linear interpolation between the vector \"start\" adn the vector \"end\".\n * Example Playground https://playground.babylonjs.com/#QYBWV4#84\n * @param start defines the start vector\n * @param end defines the end vector\n * @param amount defines the interpolation factor\n * @returns a new Vector2\n */\n static Lerp(e, t, i) {\n const r = e.x + (t.x - e.x) * i, s = e.y + (t.y - e.y) * i;\n return new e.constructor(r, s);\n }\n /**\n * Gets the dot product of the vector \"left\" and the vector \"right\"\n * Example Playground https://playground.babylonjs.com/#QYBWV4#90\n * @param left defines first vector\n * @param right defines second vector\n * @returns the dot product (float)\n */\n static Dot(e, t) {\n return e.x * t.x + e.y * t.y;\n }\n /**\n * Returns a new Vector2 equal to the normalized given vector\n * Example Playground https://playground.babylonjs.com/#QYBWV4#46\n * @param vector defines the vector to normalize\n * @returns a new Vector2\n */\n static Normalize(e) {\n const t = new e.constructor();\n return me.NormalizeToRef(e, t), t;\n }\n /**\n * Normalize a given vector into a second one\n * Example Playground https://playground.babylonjs.com/#QYBWV4#50\n * @param vector defines the vector to normalize\n * @param result defines the vector where to store the result\n * @returns result input\n */\n static NormalizeToRef(e, t) {\n return e.normalizeToRef(t), t;\n }\n /**\n * Gets a new Vector2 set with the minimal coordinate values from the \"left\" and \"right\" vectors\n * Example Playground https://playground.babylonjs.com/#QYBWV4#86\n * @param left defines 1st vector\n * @param right defines 2nd vector\n * @returns a new Vector2\n */\n static Minimize(e, t) {\n const i = e.x < t.x ? e.x : t.x, r = e.y < t.y ? e.y : t.y;\n return new e.constructor(i, r);\n }\n /**\n * Gets a new Vector2 set with the maximal coordinate values from the \"left\" and \"right\" vectors\n * Example Playground https://playground.babylonjs.com/#QYBWV4#86\n * @param left defines 1st vector\n * @param right defines 2nd vector\n * @returns a new Vector2\n */\n static Maximize(e, t) {\n const i = e.x > t.x ? e.x : t.x, r = e.y > t.y ? e.y : t.y;\n return new e.constructor(i, r);\n }\n /**\n * Gets a new Vector2 set with the transformed coordinates of the given vector by the given transformation matrix\n * Example Playground https://playground.babylonjs.com/#QYBWV4#17\n * @param vector defines the vector to transform\n * @param transformation defines the matrix to apply\n * @returns a new Vector2\n */\n static Transform(e, t) {\n const i = new e.constructor();\n return me.TransformToRef(e, t, i), i;\n }\n /**\n * Transforms the given vector coordinates by the given transformation matrix and stores the result in the vector \"result\" coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#19\n * @param vector defines the vector to transform\n * @param transformation defines the matrix to apply\n * @param result defines the target vector\n * @returns result input\n */\n static TransformToRef(e, t, i) {\n const r = t.m, s = e.x * r[0] + e.y * r[4] + r[12], a = e.x * r[1] + e.y * r[5] + r[13];\n return i.x = s, i.y = a, i;\n }\n /**\n * Determines if a given vector is included in a triangle\n * Example Playground https://playground.babylonjs.com/#QYBWV4#87\n * @param p defines the vector to test\n * @param p0 defines 1st triangle point\n * @param p1 defines 2nd triangle point\n * @param p2 defines 3rd triangle point\n * @returns true if the point \"p\" is in the triangle defined by the vectors \"p0\", \"p1\", \"p2\"\n */\n static PointInTriangle(e, t, i, r) {\n const s = 0.5 * (-i.y * r.x + t.y * (-i.x + r.x) + t.x * (i.y - r.y) + i.x * r.y), a = s < 0 ? -1 : 1, o = (t.y * r.x - t.x * r.y + (r.y - t.y) * e.x + (t.x - r.x) * e.y) * a, l = (t.x * i.y - t.y * i.x + (t.y - i.y) * e.x + (i.x - t.x) * e.y) * a;\n return o > 0 && l > 0 && o + l < 2 * s * a;\n }\n /**\n * Gets the distance between the vectors \"value1\" and \"value2\"\n * Example Playground https://playground.babylonjs.com/#QYBWV4#71\n * @param value1 defines first vector\n * @param value2 defines second vector\n * @returns the distance between vectors\n */\n static Distance(e, t) {\n return Math.sqrt(me.DistanceSquared(e, t));\n }\n /**\n * Returns the squared distance between the vectors \"value1\" and \"value2\"\n * Example Playground https://playground.babylonjs.com/#QYBWV4#72\n * @param value1 defines first vector\n * @param value2 defines second vector\n * @returns the squared distance between vectors\n */\n static DistanceSquared(e, t) {\n const i = e.x - t.x, r = e.y - t.y;\n return i * i + r * r;\n }\n /**\n * Gets a new Vector2 located at the center of the vectors \"value1\" and \"value2\"\n * Example Playground https://playground.babylonjs.com/#QYBWV4#86\n * Example Playground https://playground.babylonjs.com/#QYBWV4#66\n * @param value1 defines first vector\n * @param value2 defines second vector\n * @returns a new Vector2\n */\n static Center(e, t) {\n const i = new e.constructor();\n return me.CenterToRef(e, t, i);\n }\n /**\n * Gets the center of the vectors \"value1\" and \"value2\" and stores the result in the vector \"ref\"\n * Example Playground https://playground.babylonjs.com/#QYBWV4#66\n * @param value1 defines first vector\n * @param value2 defines second vector\n * @param ref defines third vector\n * @returns ref\n */\n static CenterToRef(e, t, i) {\n return i.copyFromFloats((e.x + t.x) / 2, (e.y + t.y) / 2);\n }\n /**\n * Gets the shortest distance (float) between the point \"p\" and the segment defined by the two points \"segA\" and \"segB\".\n * Example Playground https://playground.babylonjs.com/#QYBWV4#77\n * @param p defines the middle point\n * @param segA defines one point of the segment\n * @param segB defines the other point of the segment\n * @returns the shortest distance\n */\n static DistanceOfPointFromSegment(e, t, i) {\n const r = me.DistanceSquared(t, i);\n if (r === 0)\n return me.Distance(e, t);\n const s = i.subtract(t), a = Math.max(0, Math.min(1, me.Dot(e.subtract(t), s) / r)), o = t.add(s.multiplyByFloats(a, a));\n return me.Distance(e, o);\n }\n}\nme._ZeroReadOnly = me.Zero();\nObject.defineProperties(me.prototype, {\n dimension: { value: [2] },\n rank: { value: 1 }\n});\nclass _ {\n /** Gets or sets the x coordinate */\n get x() {\n return this._x;\n }\n set x(e) {\n this._x = e, this._isDirty = !0;\n }\n /** Gets or sets the y coordinate */\n get y() {\n return this._y;\n }\n set y(e) {\n this._y = e, this._isDirty = !0;\n }\n /** Gets or sets the z coordinate */\n get z() {\n return this._z;\n }\n set z(e) {\n this._z = e, this._isDirty = !0;\n }\n /**\n * Creates a new Vector3 object from the given x, y, z (floats) coordinates.\n * @param x defines the first coordinates (on X axis)\n * @param y defines the second coordinates (on Y axis)\n * @param z defines the third coordinates (on Z axis)\n */\n constructor(e = 0, t = 0, i = 0) {\n this._isDirty = !0, this._x = e, this._y = t, this._z = i;\n }\n /**\n * Creates a string representation of the Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#67\n * @returns a string with the Vector3 coordinates.\n */\n toString() {\n return `{X: ${this._x} Y: ${this._y} Z: ${this._z}}`;\n }\n /**\n * Gets the class name\n * @returns the string \"Vector3\"\n */\n getClassName() {\n return \"Vector3\";\n }\n /**\n * Creates the Vector3 hash code\n * @returns a number which tends to be unique between Vector3 instances\n */\n getHashCode() {\n const e = nr(this._x), t = nr(this._y), i = nr(this._z);\n let r = e;\n return r = r * 397 ^ t, r = r * 397 ^ i, r;\n }\n // Operators\n /**\n * Creates an array containing three elements : the coordinates of the Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#10\n * @returns a new array of numbers\n */\n asArray() {\n return [this._x, this._y, this._z];\n }\n /**\n * Populates the given array or Float32Array from the given index with the successive coordinates of the Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#65\n * @param array defines the destination array\n * @param index defines the offset in the destination array\n * @returns the current Vector3\n */\n toArray(e, t = 0) {\n return e[t] = this._x, e[t + 1] = this._y, e[t + 2] = this._z, this;\n }\n /**\n * Update the current vector from an array\n * Example Playground https://playground.babylonjs.com/#R1F8YU#24\n * @param array defines the destination array\n * @param offset defines the offset in the destination array\n * @returns the current Vector3\n */\n fromArray(e, t = 0) {\n return _.FromArrayToRef(e, t, this), this;\n }\n /**\n * Converts the current Vector3 into a quaternion (considering that the Vector3 contains Euler angles representation of a rotation)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#66\n * @returns a new Quaternion object, computed from the Vector3 coordinates\n */\n toQuaternion() {\n return Ce.RotationYawPitchRoll(this._y, this._x, this._z);\n }\n /**\n * Adds the given vector to the current Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#4\n * @param otherVector defines the second operand\n * @returns the current updated Vector3\n */\n addInPlace(e) {\n return this._x += e._x, this._y += e._y, this._z += e._z, this._isDirty = !0, this;\n }\n /**\n * Adds the given coordinates to the current Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#5\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the current updated Vector3\n */\n addInPlaceFromFloats(e, t, i) {\n return this._x += e, this._y += t, this._z += i, this._isDirty = !0, this;\n }\n /**\n * Gets a new Vector3, result of the addition the current Vector3 and the given vector\n * Example Playground https://playground.babylonjs.com/#R1F8YU#3\n * @param otherVector defines the second operand\n * @returns the resulting Vector3\n */\n add(e) {\n return new this.constructor(this._x + e._x, this._y + e._y, this._z + e._z);\n }\n /**\n * Adds the current Vector3 to the given one and stores the result in the vector \"result\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#6\n * @param otherVector defines the second operand\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n addToRef(e, t) {\n return t.copyFromFloats(this._x + e._x, this._y + e._y, this._z + e._z);\n }\n /**\n * Subtract the given vector from the current Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#61\n * @param otherVector defines the second operand\n * @returns the current updated Vector3\n */\n subtractInPlace(e) {\n return this._x -= e._x, this._y -= e._y, this._z -= e._z, this._isDirty = !0, this;\n }\n /**\n * Returns a new Vector3, result of the subtraction of the given vector from the current Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#60\n * @param otherVector defines the second operand\n * @returns the resulting Vector3\n */\n subtract(e) {\n return new this.constructor(this._x - e._x, this._y - e._y, this._z - e._z);\n }\n /**\n * Subtracts the given vector from the current Vector3 and stores the result in the vector \"result\".\n * Example Playground https://playground.babylonjs.com/#R1F8YU#63\n * @param otherVector defines the second operand\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n subtractToRef(e, t) {\n return this.subtractFromFloatsToRef(e._x, e._y, e._z, t);\n }\n /**\n * Returns a new Vector3 set with the subtraction of the given floats from the current Vector3 coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#62\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the resulting Vector3\n */\n subtractFromFloats(e, t, i) {\n return new this.constructor(this._x - e, this._y - t, this._z - i);\n }\n /**\n * Subtracts the given floats from the current Vector3 coordinates and set the given vector \"result\" with this result\n * Example Playground https://playground.babylonjs.com/#R1F8YU#64\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n subtractFromFloatsToRef(e, t, i, r) {\n return r.copyFromFloats(this._x - e, this._y - t, this._z - i);\n }\n /**\n * Gets a new Vector3 set with the current Vector3 negated coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#35\n * @returns a new Vector3\n */\n negate() {\n return new this.constructor(-this._x, -this._y, -this._z);\n }\n /**\n * Negate this vector in place\n * Example Playground https://playground.babylonjs.com/#R1F8YU#36\n * @returns this\n */\n negateInPlace() {\n return this._x *= -1, this._y *= -1, this._z *= -1, this._isDirty = !0, this;\n }\n /**\n * Negate the current Vector3 and stores the result in the given vector \"result\" coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#37\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n negateToRef(e) {\n return e.copyFromFloats(this._x * -1, this._y * -1, this._z * -1);\n }\n /**\n * Multiplies the Vector3 coordinates by the float \"scale\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#56\n * @param scale defines the multiplier factor\n * @returns the current updated Vector3\n */\n scaleInPlace(e) {\n return this._x *= e, this._y *= e, this._z *= e, this._isDirty = !0, this;\n }\n /**\n * Returns a new Vector3 set with the current Vector3 coordinates multiplied by the float \"scale\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#53\n * @param scale defines the multiplier factor\n * @returns a new Vector3\n */\n scale(e) {\n return new this.constructor(this._x * e, this._y * e, this._z * e);\n }\n /**\n * Multiplies the current Vector3 coordinates by the float \"scale\" and stores the result in the given vector \"result\" coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#57\n * @param scale defines the multiplier factor\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n scaleToRef(e, t) {\n return t.copyFromFloats(this._x * e, this._y * e, this._z * e);\n }\n /**\n * Creates a vector normal (perpendicular) to the current Vector3 and stores the result in the given vector\n * Out of the infinite possibilities the normal chosen is the one formed by rotating the current vector\n * 90 degrees about an axis which lies perpendicular to the current vector\n * and its projection on the xz plane. In the case of a current vector in the xz plane\n * the normal is calculated to be along the y axis.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#230\n * Example Playground https://playground.babylonjs.com/#R1F8YU#231\n * @param result defines the Vector3 object where to store the resultant normal\n * @returns the result\n */\n getNormalToRef(e) {\n const t = this.length();\n let i = Math.acos(this.y / t);\n const r = Math.atan2(this.z, this.x);\n i > Math.PI / 2 ? i -= Math.PI / 2 : i += Math.PI / 2;\n const s = t * Math.sin(i) * Math.cos(r), a = t * Math.cos(i), o = t * Math.sin(i) * Math.sin(r);\n return e.set(s, a, o), e;\n }\n /**\n * Rotates the vector using the given unit quaternion and stores the new vector in result\n * Example Playground https://playground.babylonjs.com/#R1F8YU#9\n * @param q the unit quaternion representing the rotation\n * @param result the output vector\n * @returns the result\n */\n applyRotationQuaternionToRef(e, t) {\n const i = this._x, r = this._y, s = this._z, a = e._x, o = e._y, l = e._z, c = e._w, h = 2 * (o * s - l * r), u = 2 * (l * i - a * s), f = 2 * (a * r - o * i);\n return t._x = i + c * h + o * f - l * u, t._y = r + c * u + l * h - a * f, t._z = s + c * f + a * u - o * h, t._isDirty = !0, t;\n }\n /**\n * Rotates the vector in place using the given unit quaternion\n * Example Playground https://playground.babylonjs.com/#R1F8YU#8\n * @param q the unit quaternion representing the rotation\n * @returns the current updated Vector3\n */\n applyRotationQuaternionInPlace(e) {\n return this.applyRotationQuaternionToRef(e, this);\n }\n /**\n * Rotates the vector using the given unit quaternion and returns the new vector\n * Example Playground https://playground.babylonjs.com/#R1F8YU#7\n * @param q the unit quaternion representing the rotation\n * @returns a new Vector3\n */\n applyRotationQuaternion(e) {\n return this.applyRotationQuaternionToRef(e, new this.constructor());\n }\n /**\n * Scale the current Vector3 values by a factor and add the result to a given Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#55\n * @param scale defines the scale factor\n * @param result defines the Vector3 object where to store the result\n * @returns result input\n */\n scaleAndAddToRef(e, t) {\n return t.addInPlaceFromFloats(this._x * e, this._y * e, this._z * e);\n }\n /**\n * Projects the current point Vector3 to a plane along a ray starting from a specified origin and passing through the current point Vector3.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#48\n * @param plane defines the plane to project to\n * @param origin defines the origin of the projection ray\n * @returns the projected vector3\n */\n projectOnPlane(e, t) {\n const i = new this.constructor();\n return this.projectOnPlaneToRef(e, t, i), i;\n }\n /**\n * Projects the current point Vector3 to a plane along a ray starting from a specified origin and passing through the current point Vector3.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#49\n * @param plane defines the plane to project to\n * @param origin defines the origin of the projection ray\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n projectOnPlaneToRef(e, t, i) {\n const r = e.normal, s = e.d, a = be.Vector3[0];\n this.subtractToRef(t, a), a.normalize();\n const o = _.Dot(a, r);\n if (Math.abs(o) < 1e-10)\n i.setAll(1 / 0);\n else {\n const l = -(_.Dot(t, r) + s) / o, c = a.scaleInPlace(l);\n t.addToRef(c, i);\n }\n return i;\n }\n /**\n * Returns true if the current Vector3 and the given vector coordinates are strictly equal\n * Example Playground https://playground.babylonjs.com/#R1F8YU#19\n * @param otherVector defines the second operand\n * @returns true if both vectors are equals\n */\n equals(e) {\n return e && this._x === e._x && this._y === e._y && this._z === e._z;\n }\n /**\n * Returns true if the current Vector3 and the given vector coordinates are distant less than epsilon\n * Example Playground https://playground.babylonjs.com/#R1F8YU#21\n * @param otherVector defines the second operand\n * @param epsilon defines the minimal distance to define values as equals\n * @returns true if both vectors are distant less than epsilon\n */\n equalsWithEpsilon(e, t = xt) {\n return e && Ii(this._x, e._x, t) && Ii(this._y, e._y, t) && Ii(this._z, e._z, t);\n }\n /**\n * Returns true if the current Vector3 coordinates equals the given floats\n * Example Playground https://playground.babylonjs.com/#R1F8YU#20\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns true if both vectors are equal\n */\n equalsToFloats(e, t, i) {\n return this._x === e && this._y === t && this._z === i;\n }\n /**\n * Multiplies the current Vector3 coordinates by the given ones\n * Example Playground https://playground.babylonjs.com/#R1F8YU#32\n * @param otherVector defines the second operand\n * @returns the current updated Vector3\n */\n multiplyInPlace(e) {\n return this._x *= e._x, this._y *= e._y, this._z *= e._z, this._isDirty = !0, this;\n }\n /**\n * Returns a new Vector3, result of the multiplication of the current Vector3 by the given vector\n * Example Playground https://playground.babylonjs.com/#R1F8YU#31\n * @param otherVector defines the second operand\n * @returns the new Vector3\n */\n multiply(e) {\n return this.multiplyByFloats(e._x, e._y, e._z);\n }\n /**\n * Multiplies the current Vector3 by the given one and stores the result in the given vector \"result\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#33\n * @param otherVector defines the second operand\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n multiplyToRef(e, t) {\n return t.copyFromFloats(this._x * e._x, this._y * e._y, this._z * e._z);\n }\n /**\n * Returns a new Vector3 set with the result of the multiplication of the current Vector3 coordinates by the given floats\n * Example Playground https://playground.babylonjs.com/#R1F8YU#34\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the new Vector3\n */\n multiplyByFloats(e, t, i) {\n return new this.constructor(this._x * e, this._y * t, this._z * i);\n }\n /**\n * Returns a new Vector3 set with the result of the division of the current Vector3 coordinates by the given ones\n * Example Playground https://playground.babylonjs.com/#R1F8YU#16\n * @param otherVector defines the second operand\n * @returns the new Vector3\n */\n divide(e) {\n return new this.constructor(this._x / e._x, this._y / e._y, this._z / e._z);\n }\n /**\n * Divides the current Vector3 coordinates by the given ones and stores the result in the given vector \"result\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#18\n * @param otherVector defines the second operand\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n divideToRef(e, t) {\n return t.copyFromFloats(this._x / e._x, this._y / e._y, this._z / e._z);\n }\n /**\n * Divides the current Vector3 coordinates by the given ones.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#17\n * @param otherVector defines the second operand\n * @returns the current updated Vector3\n */\n divideInPlace(e) {\n return this._x = this._x / e._x, this._y = this._y / e._y, this._z = this._z / e._z, this._isDirty = !0, this;\n }\n /**\n * Updates the current Vector3 with the minimal coordinate values between its and the given vector ones\n * Example Playground https://playground.babylonjs.com/#R1F8YU#29\n * @param other defines the second operand\n * @returns the current updated Vector3\n */\n minimizeInPlace(e) {\n return this.minimizeInPlaceFromFloats(e._x, e._y, e._z);\n }\n /**\n * Updates the current Vector3 with the maximal coordinate values between its and the given vector ones.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#27\n * @param other defines the second operand\n * @returns the current updated Vector3\n */\n maximizeInPlace(e) {\n return this.maximizeInPlaceFromFloats(e._x, e._y, e._z);\n }\n /**\n * Updates the current Vector3 with the minimal coordinate values between its and the given coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#30\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the current updated Vector3\n */\n minimizeInPlaceFromFloats(e, t, i) {\n return e < this._x && (this.x = e), t < this._y && (this.y = t), i < this._z && (this.z = i), this;\n }\n /**\n * Updates the current Vector3 with the maximal coordinate values between its and the given coordinates.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#28\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the current updated Vector3\n */\n maximizeInPlaceFromFloats(e, t, i) {\n return e > this._x && (this.x = e), t > this._y && (this.y = t), i > this._z && (this.z = i), this;\n }\n /**\n * Due to float precision, scale of a mesh could be uniform but float values are off by a small fraction\n * Check if is non uniform within a certain amount of decimal places to account for this\n * @param epsilon the amount the values can differ\n * @returns if the vector is non uniform to a certain number of decimal places\n */\n isNonUniformWithinEpsilon(e) {\n const t = Math.abs(this._x), i = Math.abs(this._y);\n if (!Ii(t, i, e))\n return !0;\n const r = Math.abs(this._z);\n return !Ii(t, r, e) || !Ii(i, r, e);\n }\n /**\n * Gets a boolean indicating that the vector is non uniform meaning x, y or z are not all the same\n */\n get isNonUniform() {\n const e = Math.abs(this._x), t = Math.abs(this._y);\n if (e !== t)\n return !0;\n const i = Math.abs(this._z);\n return e !== i;\n }\n /**\n * Gets the current Vector3's floored values and stores them in result\n * @param result the vector to store the result in\n * @returns the result vector\n */\n floorToRef(e) {\n return e._x = Math.floor(this._x), e._y = Math.floor(this._y), e._z = Math.floor(this._z), e._isDirty = !0, e;\n }\n /**\n * Gets a new Vector3 from current Vector3 floored values\n * Example Playground https://playground.babylonjs.com/#R1F8YU#22\n * @returns a new Vector3\n */\n floor() {\n return new this.constructor(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z));\n }\n /**\n * Gets the current Vector3's fractional values and stores them in result\n * @param result the vector to store the result in\n * @returns the result vector\n */\n fractToRef(e) {\n return e._x = this.x - Math.floor(this._x), e._y = this.y - Math.floor(this._y), e._z = this.z - Math.floor(this._z), e._isDirty = !0, e;\n }\n /**\n * Gets a new Vector3 from current Vector3 fractional values\n * Example Playground https://playground.babylonjs.com/#R1F8YU#23\n * @returns a new Vector3\n */\n fract() {\n return new this.constructor(this.x - Math.floor(this._x), this.y - Math.floor(this._y), this.z - Math.floor(this._z));\n }\n // Properties\n /**\n * Gets the length of the Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#25\n * @returns the length of the Vector3\n */\n length() {\n return Math.sqrt(this.lengthSquared());\n }\n /**\n * Gets the squared length of the Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#26\n * @returns squared length of the Vector3\n */\n lengthSquared() {\n return this._x * this._x + this._y * this._y + this._z * this._z;\n }\n /**\n * Gets a boolean indicating if the vector contains a zero in one of its components\n * Example Playground https://playground.babylonjs.com/#R1F8YU#1\n */\n get hasAZeroComponent() {\n return this._x * this._y * this._z === 0;\n }\n /**\n * Normalize the current Vector3.\n * Please note that this is an in place operation.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#122\n * @returns the current updated Vector3\n */\n normalize() {\n return this.normalizeFromLength(this.length());\n }\n /**\n * Reorders the x y z properties of the vector in place\n * Example Playground https://playground.babylonjs.com/#R1F8YU#44\n * @param order new ordering of the properties (eg. for vector 1,2,3 with \"ZYX\" will produce 3,2,1)\n * @returns the current updated vector\n */\n reorderInPlace(e) {\n if (e = e.toLowerCase(), e === \"xyz\")\n return this;\n const t = be.Vector3[0].copyFrom(this);\n return this.x = t[e[0]], this.y = t[e[1]], this.z = t[e[2]], this;\n }\n /**\n * Rotates the vector around 0,0,0 by a quaternion\n * Example Playground https://playground.babylonjs.com/#R1F8YU#47\n * @param quaternion the rotation quaternion\n * @param result vector to store the result\n * @returns the resulting vector\n */\n rotateByQuaternionToRef(e, t) {\n return e.toRotationMatrix(be.Matrix[0]), _.TransformCoordinatesToRef(this, be.Matrix[0], t), t;\n }\n /**\n * Rotates a vector around a given point\n * Example Playground https://playground.babylonjs.com/#R1F8YU#46\n * @param quaternion the rotation quaternion\n * @param point the point to rotate around\n * @param result vector to store the result\n * @returns the resulting vector\n */\n rotateByQuaternionAroundPointToRef(e, t, i) {\n return this.subtractToRef(t, be.Vector3[0]), be.Vector3[0].rotateByQuaternionToRef(e, be.Vector3[0]), t.addToRef(be.Vector3[0], i), i;\n }\n /**\n * Returns a new Vector3 as the cross product of the current vector and the \"other\" one\n * The cross product is then orthogonal to both current and \"other\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#14\n * @param other defines the right operand\n * @returns the cross product\n */\n cross(e) {\n const t = new this.constructor();\n return _.CrossToRef(this, e, t);\n }\n /**\n * Normalize the current Vector3 with the given input length.\n * Please note that this is an in place operation.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#123\n * @param len the length of the vector\n * @returns the current updated Vector3\n */\n normalizeFromLength(e) {\n return e === 0 || e === 1 ? this : this.scaleInPlace(1 / e);\n }\n /**\n * Normalize the current Vector3 to a new vector\n * Example Playground https://playground.babylonjs.com/#R1F8YU#124\n * @returns the new Vector3\n */\n normalizeToNew() {\n const e = new this.constructor(0, 0, 0);\n return this.normalizeToRef(e), e;\n }\n /**\n * Normalize the current Vector3 to the reference\n * Example Playground https://playground.babylonjs.com/#R1F8YU#125\n * @param reference define the Vector3 to update\n * @returns the updated Vector3\n */\n normalizeToRef(e) {\n const t = this.length();\n return t === 0 || t === 1 ? e.copyFrom(this) : this.scaleToRef(1 / t, e);\n }\n /**\n * Creates a new Vector3 copied from the current Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#11\n * @returns the new Vector3\n */\n clone() {\n return new this.constructor(this._x, this._y, this._z);\n }\n /**\n * Copies the given vector coordinates to the current Vector3 ones\n * Example Playground https://playground.babylonjs.com/#R1F8YU#12\n * @param source defines the source Vector3\n * @returns the current updated Vector3\n */\n copyFrom(e) {\n return this.copyFromFloats(e._x, e._y, e._z);\n }\n /**\n * Copies the given floats to the current Vector3 coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#13\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the current updated Vector3\n */\n copyFromFloats(e, t, i) {\n return this._x = e, this._y = t, this._z = i, this._isDirty = !0, this;\n }\n /**\n * Copies the given floats to the current Vector3 coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#58\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the current updated Vector3\n */\n set(e, t, i) {\n return this.copyFromFloats(e, t, i);\n }\n /**\n * Copies the given float to the current Vector3 coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#59\n * @param v defines the x, y and z coordinates of the operand\n * @returns the current updated Vector3\n */\n setAll(e) {\n return this._x = this._y = this._z = e, this._isDirty = !0, this;\n }\n // Statics\n /**\n * Get the clip factor between two vectors\n * Example Playground https://playground.babylonjs.com/#R1F8YU#126\n * @param vector0 defines the first operand\n * @param vector1 defines the second operand\n * @param axis defines the axis to use\n * @param size defines the size along the axis\n * @returns the clip factor\n */\n static GetClipFactor(e, t, i, r) {\n const s = _.Dot(e, i), a = _.Dot(t, i);\n return (s - r) / (s - a);\n }\n /**\n * Get angle between two vectors\n * Example Playground https://playground.babylonjs.com/#R1F8YU#86\n * @param vector0 the starting point\n * @param vector1 the ending point\n * @param normal direction of the normal\n * @returns the angle between vector0 and vector1\n */\n static GetAngleBetweenVectors(e, t, i) {\n const r = e.normalizeToRef(be.Vector3[1]), s = t.normalizeToRef(be.Vector3[2]);\n let a = _.Dot(r, s);\n a = ii(a, -1, 1);\n const o = Math.acos(a), l = be.Vector3[3];\n return _.CrossToRef(r, s, l), _.Dot(l, i) > 0 ? isNaN(o) ? 0 : o : isNaN(o) ? -Math.PI : -Math.acos(a);\n }\n /**\n * Get angle between two vectors projected on a plane\n * Example Playground https://playground.babylonjs.com/#R1F8YU#87\n * Expectation compute time: 0.01 ms (median) and 0.02 ms (percentile 95%)\n * @param vector0 angle between vector0 and vector1\n * @param vector1 angle between vector0 and vector1\n * @param normal Normal of the projection plane\n * @returns the angle in radians (float) between vector0 and vector1 projected on the plane with the specified normal\n */\n static GetAngleBetweenVectorsOnPlane(e, t, i) {\n be.Vector3[0].copyFrom(e);\n const r = be.Vector3[0];\n be.Vector3[1].copyFrom(t);\n const s = be.Vector3[1];\n be.Vector3[2].copyFrom(i);\n const a = be.Vector3[2], o = be.Vector3[3], l = be.Vector3[4];\n r.normalize(), s.normalize(), a.normalize(), _.CrossToRef(a, r, o), _.CrossToRef(o, a, l);\n const c = Math.atan2(_.Dot(s, o), _.Dot(s, l));\n return G_(c);\n }\n /**\n * Gets the rotation that aligns the roll axis (Y) to the line joining the start point to the target point and stores it in the ref Vector3\n * Example PG https://playground.babylonjs.com/#R1F8YU#189\n * @param start the starting point\n * @param target the target point\n * @param ref the vector3 to store the result\n * @returns ref in the form (pitch, yaw, 0)\n */\n static PitchYawRollToMoveBetweenPointsToRef(e, t, i) {\n const r = z.Vector3[0];\n return t.subtractToRef(e, r), i._y = Math.atan2(r.x, r.z) || 0, i._x = Math.atan2(Math.sqrt(r.x ** 2 + r.z ** 2), r.y) || 0, i._z = 0, i._isDirty = !0, i;\n }\n /**\n * Gets the rotation that aligns the roll axis (Y) to the line joining the start point to the target point\n * Example PG https://playground.babylonjs.com/#R1F8YU#188\n * @param start the starting point\n * @param target the target point\n * @returns the rotation in the form (pitch, yaw, 0)\n */\n static PitchYawRollToMoveBetweenPoints(e, t) {\n const i = _.Zero();\n return _.PitchYawRollToMoveBetweenPointsToRef(e, t, i);\n }\n /**\n * Slerp between two vectors. See also `SmoothToRef`\n * Slerp is a spherical linear interpolation\n * giving a slow in and out effect\n * Example Playground 1 https://playground.babylonjs.com/#R1F8YU#108\n * Example Playground 2 https://playground.babylonjs.com/#R1F8YU#109\n * @param vector0 Start vector\n * @param vector1 End vector\n * @param slerp amount (will be clamped between 0 and 1)\n * @param result The slerped vector\n * @returns The slerped vector\n */\n static SlerpToRef(e, t, i, r) {\n i = ii(i, 0, 1);\n const s = be.Vector3[0], a = be.Vector3[1];\n s.copyFrom(e);\n const o = s.length();\n s.normalizeFromLength(o), a.copyFrom(t);\n const l = a.length();\n a.normalizeFromLength(l);\n const c = _.Dot(s, a);\n let h, u;\n if (c < 1 - xt) {\n const f = Math.acos(c), d = 1 / Math.sin(f);\n h = Math.sin((1 - i) * f) * d, u = Math.sin(i * f) * d;\n } else\n h = 1 - i, u = i;\n return s.scaleInPlace(h), a.scaleInPlace(u), r.copyFrom(s).addInPlace(a), r.scaleInPlace(W_(o, l, i)), r;\n }\n /**\n * Smooth interpolation between two vectors using Slerp\n * Example Playground https://playground.babylonjs.com/#R1F8YU#110\n * @param source source vector\n * @param goal goal vector\n * @param deltaTime current interpolation frame\n * @param lerpTime total interpolation time\n * @param result the smoothed vector\n * @returns the smoothed vector\n */\n static SmoothToRef(e, t, i, r, s) {\n return _.SlerpToRef(e, t, r === 0 ? 1 : i / r, s), s;\n }\n /**\n * Returns a new Vector3 set from the index \"offset\" of the given array\n * Example Playground https://playground.babylonjs.com/#R1F8YU#83\n * @param array defines the source array\n * @param offset defines the offset in the source array\n * @returns the new Vector3\n */\n static FromArray(e, t = 0) {\n return new _(e[t], e[t + 1], e[t + 2]);\n }\n /**\n * Returns a new Vector3 set from the index \"offset\" of the given Float32Array\n * @param array defines the source array\n * @param offset defines the offset in the source array\n * @returns the new Vector3\n * @deprecated Please use FromArray instead.\n */\n static FromFloatArray(e, t) {\n return _.FromArray(e, t);\n }\n /**\n * Sets the given vector \"result\" with the element values from the index \"offset\" of the given array\n * Example Playground https://playground.babylonjs.com/#R1F8YU#84\n * @param array defines the source array\n * @param offset defines the offset in the source array\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static FromArrayToRef(e, t, i) {\n return i._x = e[t], i._y = e[t + 1], i._z = e[t + 2], i._isDirty = !0, i;\n }\n /**\n * Sets the given vector \"result\" with the element values from the index \"offset\" of the given Float32Array\n * @param array defines the source array\n * @param offset defines the offset in the source array\n * @param result defines the Vector3 where to store the result\n * @deprecated Please use FromArrayToRef instead.\n * @returns result input\n */\n static FromFloatArrayToRef(e, t, i) {\n return _.FromArrayToRef(e, t, i);\n }\n /**\n * Sets the given vector \"result\" with the given floats.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#85\n * @param x defines the x coordinate of the source\n * @param y defines the y coordinate of the source\n * @param z defines the z coordinate of the source\n * @param result defines the Vector3 where to store the result\n * @returns the result vector\n */\n static FromFloatsToRef(e, t, i, r) {\n return r.copyFromFloats(e, t, i), r;\n }\n /**\n * Returns a new Vector3 set to (0.0, 0.0, 0.0)\n * @returns a new empty Vector3\n */\n static Zero() {\n return new _(0, 0, 0);\n }\n /**\n * Returns a new Vector3 set to (1.0, 1.0, 1.0)\n * @returns a new Vector3\n */\n static One() {\n return new _(1, 1, 1);\n }\n /**\n * Returns a new Vector3 set to (0.0, 1.0, 0.0)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\n * @returns a new up Vector3\n */\n static Up() {\n return new _(0, 1, 0);\n }\n /**\n * Gets an up Vector3 that must not be updated\n */\n static get UpReadOnly() {\n return _._UpReadOnly;\n }\n /**\n * Gets a down Vector3 that must not be updated\n */\n static get DownReadOnly() {\n return _._DownReadOnly;\n }\n /**\n * Gets a right Vector3 that must not be updated\n */\n static get RightReadOnly() {\n return _._RightReadOnly;\n }\n /**\n * Gets a left Vector3 that must not be updated\n */\n static get LeftReadOnly() {\n return _._LeftReadOnly;\n }\n /**\n * Gets a forward Vector3 that must not be updated\n */\n static get LeftHandedForwardReadOnly() {\n return _._LeftHandedForwardReadOnly;\n }\n /**\n * Gets a forward Vector3 that must not be updated\n */\n static get RightHandedForwardReadOnly() {\n return _._RightHandedForwardReadOnly;\n }\n /**\n * Gets a backward Vector3 that must not be updated\n */\n static get LeftHandedBackwardReadOnly() {\n return _._LeftHandedBackwardReadOnly;\n }\n /**\n * Gets a backward Vector3 that must not be updated\n */\n static get RightHandedBackwardReadOnly() {\n return _._RightHandedBackwardReadOnly;\n }\n /**\n * Gets a zero Vector3 that must not be updated\n */\n static get ZeroReadOnly() {\n return _._ZeroReadOnly;\n }\n /**\n * Gets a one Vector3 that must not be updated\n */\n static get OneReadOnly() {\n return _._OneReadOnly;\n }\n /**\n * Returns a new Vector3 set to (0.0, -1.0, 0.0)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\n * @returns a new down Vector3\n */\n static Down() {\n return new _(0, -1, 0);\n }\n /**\n * Returns a new Vector3 set to (0.0, 0.0, 1.0)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\n * @param rightHandedSystem is the scene right-handed (negative z)\n * @returns a new forward Vector3\n */\n static Forward(e = !1) {\n return new _(0, 0, e ? -1 : 1);\n }\n /**\n * Returns a new Vector3 set to (0.0, 0.0, -1.0)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\n * @param rightHandedSystem is the scene right-handed (negative-z)\n * @returns a new Backward Vector3\n */\n static Backward(e = !1) {\n return new _(0, 0, e ? 1 : -1);\n }\n /**\n * Returns a new Vector3 set to (1.0, 0.0, 0.0)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\n * @returns a new right Vector3\n */\n static Right() {\n return new _(1, 0, 0);\n }\n /**\n * Returns a new Vector3 set to (-1.0, 0.0, 0.0)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\n * @returns a new left Vector3\n */\n static Left() {\n return new _(-1, 0, 0);\n }\n /**\n * Returns a new Vector3 with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @returns a Vector3 with random values between min and max\n */\n static Random(e = 0, t = 1) {\n return new _(Zt(e, t), Zt(e, t), Zt(e, t));\n }\n /**\n * Sets a Vector3 with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @param ref the ref to store the values in\n * @returns the ref with random values between min and max\n */\n static RandomToRef(e = 0, t = 1, i) {\n return i.copyFromFloats(Zt(e, t), Zt(e, t), Zt(e, t));\n }\n /**\n * Returns a new Vector3 set with the result of the transformation by the given matrix of the given vector.\n * This method computes transformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#111\n * @param vector defines the Vector3 to transform\n * @param transformation defines the transformation matrix\n * @returns the transformed Vector3\n */\n static TransformCoordinates(e, t) {\n const i = _.Zero();\n return _.TransformCoordinatesToRef(e, t, i), i;\n }\n /**\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given vector\n * This method computes transformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#113\n * @param vector defines the Vector3 to transform\n * @param transformation defines the transformation matrix\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static TransformCoordinatesToRef(e, t, i) {\n return _.TransformCoordinatesFromFloatsToRef(e._x, e._y, e._z, t, i), i;\n }\n /**\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given floats (x, y, z)\n * This method computes transformed coordinates only, not transformed direction vectors\n * Example Playground https://playground.babylonjs.com/#R1F8YU#115\n * @param x define the x coordinate of the source vector\n * @param y define the y coordinate of the source vector\n * @param z define the z coordinate of the source vector\n * @param transformation defines the transformation matrix\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static TransformCoordinatesFromFloatsToRef(e, t, i, r, s) {\n const a = r.m, o = e * a[0] + t * a[4] + i * a[8] + a[12], l = e * a[1] + t * a[5] + i * a[9] + a[13], c = e * a[2] + t * a[6] + i * a[10] + a[14], h = 1 / (e * a[3] + t * a[7] + i * a[11] + a[15]);\n return s._x = o * h, s._y = l * h, s._z = c * h, s._isDirty = !0, s;\n }\n /**\n * Returns a new Vector3 set with the result of the normal transformation by the given matrix of the given vector\n * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#112\n * @param vector defines the Vector3 to transform\n * @param transformation defines the transformation matrix\n * @returns the new Vector3\n */\n static TransformNormal(e, t) {\n const i = _.Zero();\n return _.TransformNormalToRef(e, t, i), i;\n }\n /**\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given vector\n * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#114\n * @param vector defines the Vector3 to transform\n * @param transformation defines the transformation matrix\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static TransformNormalToRef(e, t, i) {\n return this.TransformNormalFromFloatsToRef(e._x, e._y, e._z, t, i), i;\n }\n /**\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given floats (x, y, z)\n * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#116\n * @param x define the x coordinate of the source vector\n * @param y define the y coordinate of the source vector\n * @param z define the z coordinate of the source vector\n * @param transformation defines the transformation matrix\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static TransformNormalFromFloatsToRef(e, t, i, r, s) {\n const a = r.m;\n return s._x = e * a[0] + t * a[4] + i * a[8], s._y = e * a[1] + t * a[5] + i * a[9], s._z = e * a[2] + t * a[6] + i * a[10], s._isDirty = !0, s;\n }\n /**\n * Returns a new Vector3 located for \"amount\" on the CatmullRom interpolation spline defined by the vectors \"value1\", \"value2\", \"value3\", \"value4\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#69\n * @param value1 defines the first control point\n * @param value2 defines the second control point\n * @param value3 defines the third control point\n * @param value4 defines the fourth control point\n * @param amount defines the amount on the spline to use\n * @returns the new Vector3\n */\n static CatmullRom(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 0.5 * (2 * t._x + (-e._x + i._x) * s + (2 * e._x - 5 * t._x + 4 * i._x - r._x) * a + (-e._x + 3 * t._x - 3 * i._x + r._x) * o), c = 0.5 * (2 * t._y + (-e._y + i._y) * s + (2 * e._y - 5 * t._y + 4 * i._y - r._y) * a + (-e._y + 3 * t._y - 3 * i._y + r._y) * o), h = 0.5 * (2 * t._z + (-e._z + i._z) * s + (2 * e._z - 5 * t._z + 4 * i._z - r._z) * a + (-e._z + 3 * t._z - 3 * i._z + r._z) * o);\n return new e.constructor(l, c, h);\n }\n /**\n * Returns a new Vector3 set with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\n * Example Playground https://playground.babylonjs.com/#R1F8YU#76\n * @param value defines the current value\n * @param min defines the lower range value\n * @param max defines the upper range value\n * @returns the new Vector3\n */\n static Clamp(e, t, i) {\n const r = new e.constructor();\n return _.ClampToRef(e, t, i, r), r;\n }\n /**\n * Sets the given vector \"result\" with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\n * Example Playground https://playground.babylonjs.com/#R1F8YU#77\n * @param value defines the current value\n * @param min defines the lower range value\n * @param max defines the upper range value\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static ClampToRef(e, t, i, r) {\n let s = e._x;\n s = s > i._x ? i._x : s, s = s < t._x ? t._x : s;\n let a = e._y;\n a = a > i._y ? i._y : a, a = a < t._y ? t._y : a;\n let o = e._z;\n return o = o > i._z ? i._z : o, o = o < t._z ? t._z : o, r.copyFromFloats(s, a, o), r;\n }\n /**\n * Checks if a given vector is inside a specific range\n * Example Playground https://playground.babylonjs.com/#R1F8YU#75\n * @param v defines the vector to test\n * @param min defines the minimum range\n * @param max defines the maximum range\n */\n static CheckExtends(e, t, i) {\n t.minimizeInPlace(e), i.maximizeInPlace(e);\n }\n /**\n * Returns a new Vector3 located for \"amount\" (float) on the Hermite interpolation spline defined by the vectors \"value1\", \"tangent1\", \"value2\", \"tangent2\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#89\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent vector\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent vector\n * @param amount defines the amount on the interpolation spline (between 0 and 1)\n * @returns the new Vector3\n */\n static Hermite(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 2 * o - 3 * a + 1, c = -2 * o + 3 * a, h = o - 2 * a + s, u = o - a, f = e._x * l + i._x * c + t._x * h + r._x * u, d = e._y * l + i._y * c + t._y * h + r._y * u, p = e._z * l + i._z * c + t._z * h + r._z * u;\n return new e.constructor(f, d, p);\n }\n /**\n * Returns a new Vector3 which is the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * Example Playground https://playground.babylonjs.com/#R1F8YU#90\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @returns 1st derivative\n */\n static Hermite1stDerivative(e, t, i, r, s) {\n const a = new e.constructor();\n return this.Hermite1stDerivativeToRef(e, t, i, r, s, a), a;\n }\n /**\n * Update a Vector3 with the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * Example Playground https://playground.babylonjs.com/#R1F8YU#91\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @param result define where to store the derivative\n * @returns result input\n */\n static Hermite1stDerivativeToRef(e, t, i, r, s, a) {\n const o = s * s;\n return a._x = (o - s) * 6 * e._x + (3 * o - 4 * s + 1) * t._x + (-o + s) * 6 * i._x + (3 * o - 2 * s) * r._x, a._y = (o - s) * 6 * e._y + (3 * o - 4 * s + 1) * t._y + (-o + s) * 6 * i._y + (3 * o - 2 * s) * r._y, a._z = (o - s) * 6 * e._z + (3 * o - 4 * s + 1) * t._z + (-o + s) * 6 * i._z + (3 * o - 2 * s) * r._z, a._isDirty = !0, a;\n }\n /**\n * Returns a new Vector3 located for \"amount\" (float) on the linear interpolation between the vectors \"start\" and \"end\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#95\n * @param start defines the start value\n * @param end defines the end value\n * @param amount max defines amount between both (between 0 and 1)\n * @returns the new Vector3\n */\n static Lerp(e, t, i) {\n const r = new e.constructor(0, 0, 0);\n return _.LerpToRef(e, t, i, r), r;\n }\n /**\n * Sets the given vector \"result\" with the result of the linear interpolation from the vector \"start\" for \"amount\" to the vector \"end\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#93\n * @param start defines the start value\n * @param end defines the end value\n * @param amount max defines amount between both (between 0 and 1)\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static LerpToRef(e, t, i, r) {\n return r._x = e._x + (t._x - e._x) * i, r._y = e._y + (t._y - e._y) * i, r._z = e._z + (t._z - e._z) * i, r._isDirty = !0, r;\n }\n /**\n * Returns the dot product (float) between the vectors \"left\" and \"right\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#82\n * @param left defines the left operand\n * @param right defines the right operand\n * @returns the dot product\n */\n static Dot(e, t) {\n return e._x * t._x + e._y * t._y + e._z * t._z;\n }\n /**\n * Returns the dot product (float) between the current vectors and \"otherVector\"\n * @param otherVector defines the right operand\n * @returns the dot product\n */\n dot(e) {\n return this._x * e._x + this._y * e._y + this._z * e._z;\n }\n /**\n * Returns a new Vector3 as the cross product of the vectors \"left\" and \"right\"\n * The cross product is then orthogonal to both \"left\" and \"right\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#15\n * @param left defines the left operand\n * @param right defines the right operand\n * @returns the cross product\n */\n static Cross(e, t) {\n const i = new e.constructor();\n return _.CrossToRef(e, t, i), i;\n }\n /**\n * Sets the given vector \"result\" with the cross product of \"left\" and \"right\"\n * The cross product is then orthogonal to both \"left\" and \"right\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#78\n * @param left defines the left operand\n * @param right defines the right operand\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static CrossToRef(e, t, i) {\n const r = e._y * t._z - e._z * t._y, s = e._z * t._x - e._x * t._z, a = e._x * t._y - e._y * t._x;\n return i.copyFromFloats(r, s, a), i;\n }\n /**\n * Returns a new Vector3 as the normalization of the given vector\n * Example Playground https://playground.babylonjs.com/#R1F8YU#98\n * @param vector defines the Vector3 to normalize\n * @returns the new Vector3\n */\n static Normalize(e) {\n const t = _.Zero();\n return _.NormalizeToRef(e, t), t;\n }\n /**\n * Sets the given vector \"result\" with the normalization of the given first vector\n * Example Playground https://playground.babylonjs.com/#R1F8YU#98\n * @param vector defines the Vector3 to normalize\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static NormalizeToRef(e, t) {\n return e.normalizeToRef(t), t;\n }\n /**\n * Project a Vector3 onto screen space\n * Example Playground https://playground.babylonjs.com/#R1F8YU#101\n * @param vector defines the Vector3 to project\n * @param world defines the world matrix to use\n * @param transform defines the transform (view x projection) matrix to use\n * @param viewport defines the screen viewport to use\n * @returns the new Vector3\n */\n static Project(e, t, i, r) {\n const s = new e.constructor();\n return _.ProjectToRef(e, t, i, r, s), s;\n }\n /**\n * Project a Vector3 onto screen space to reference\n * Example Playground https://playground.babylonjs.com/#R1F8YU#102\n * @param vector defines the Vector3 to project\n * @param world defines the world matrix to use\n * @param transform defines the transform (view x projection) matrix to use\n * @param viewport defines the screen viewport to use\n * @param result the vector in which the screen space will be stored\n * @returns result input\n */\n static ProjectToRef(e, t, i, r, s) {\n const a = r.width, o = r.height, l = r.x, c = r.y, h = be.Matrix[1];\n w.FromValuesToRef(a / 2, 0, 0, 0, 0, -o / 2, 0, 0, 0, 0, 0.5, 0, l + a / 2, o / 2 + c, 0.5, 1, h);\n const u = be.Matrix[0];\n return t.multiplyToRef(i, u), u.multiplyToRef(h, u), _.TransformCoordinatesToRef(e, u, s), s;\n }\n /**\n * Reflects a vector off the plane defined by a normalized normal\n * @param inDirection defines the vector direction\n * @param normal defines the normal - Must be normalized\n * @returns the resulting vector\n */\n static Reflect(e, t) {\n return this.ReflectToRef(e, t, new _());\n }\n /**\n * Reflects a vector off the plane defined by a normalized normal to reference\n * @param inDirection defines the vector direction\n * @param normal defines the normal - Must be normalized\n * @param ref defines the Vector3 where to store the result\n * @returns the resulting vector\n */\n static ReflectToRef(e, t, i) {\n const r = z.Vector3[0];\n return r.copyFrom(t).scaleInPlace(2 * _.Dot(e, t)), i.copyFrom(e).subtractInPlace(r);\n }\n /**\n * @internal\n */\n static _UnprojectFromInvertedMatrixToRef(e, t, i) {\n _.TransformCoordinatesToRef(e, t, i);\n const r = t.m, s = e._x * r[3] + e._y * r[7] + e._z * r[11] + r[15];\n return Ii(s, 1) && i.scaleInPlace(1 / s), i;\n }\n /**\n * Unproject from screen space to object space\n * Example Playground https://playground.babylonjs.com/#R1F8YU#121\n * @param source defines the screen space Vector3 to use\n * @param viewportWidth defines the current width of the viewport\n * @param viewportHeight defines the current height of the viewport\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\n * @param transform defines the transform (view x projection) matrix to use\n * @returns the new Vector3\n */\n static UnprojectFromTransform(e, t, i, r, s) {\n return this.Unproject(e, t, i, r, s, w.IdentityReadOnly);\n }\n /**\n * Unproject from screen space to object space\n * Example Playground https://playground.babylonjs.com/#R1F8YU#117\n * @param source defines the screen space Vector3 to use\n * @param viewportWidth defines the current width of the viewport\n * @param viewportHeight defines the current height of the viewport\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\n * @param view defines the view matrix to use\n * @param projection defines the projection matrix to use\n * @returns the new Vector3\n */\n static Unproject(e, t, i, r, s, a) {\n const o = new e.constructor();\n return _.UnprojectToRef(e, t, i, r, s, a, o), o;\n }\n /**\n * Unproject from screen space to object space\n * Example Playground https://playground.babylonjs.com/#R1F8YU#119\n * @param source defines the screen space Vector3 to use\n * @param viewportWidth defines the current width of the viewport\n * @param viewportHeight defines the current height of the viewport\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\n * @param view defines the view matrix to use\n * @param projection defines the projection matrix to use\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static UnprojectToRef(e, t, i, r, s, a, o) {\n return _.UnprojectFloatsToRef(e._x, e._y, e._z, t, i, r, s, a, o), o;\n }\n /**\n * Unproject from screen space to object space\n * Example Playground https://playground.babylonjs.com/#R1F8YU#120\n * @param sourceX defines the screen space x coordinate to use\n * @param sourceY defines the screen space y coordinate to use\n * @param sourceZ defines the screen space z coordinate to use\n * @param viewportWidth defines the current width of the viewport\n * @param viewportHeight defines the current height of the viewport\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\n * @param view defines the view matrix to use\n * @param projection defines the projection matrix to use\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static UnprojectFloatsToRef(e, t, i, r, s, a, o, l, c) {\n var f;\n const h = be.Matrix[0];\n a.multiplyToRef(o, h), h.multiplyToRef(l, h), h.invert();\n const u = be.Vector3[0];\n return u.x = e / r * 2 - 1, u.y = -(t / s * 2 - 1), (f = st.LastCreatedEngine) != null && f.isNDCHalfZRange ? u.z = i : u.z = 2 * i - 1, _._UnprojectFromInvertedMatrixToRef(u, h, c), c;\n }\n /**\n * Gets the minimal coordinate values between two Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#97\n * @param left defines the first operand\n * @param right defines the second operand\n * @returns the new Vector3\n */\n static Minimize(e, t) {\n const i = new e.constructor();\n return i.copyFrom(e), i.minimizeInPlace(t), i;\n }\n /**\n * Gets the maximal coordinate values between two Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#96\n * @param left defines the first operand\n * @param right defines the second operand\n * @returns the new Vector3\n */\n static Maximize(e, t) {\n const i = new e.constructor();\n return i.copyFrom(e), i.maximizeInPlace(t), i;\n }\n /**\n * Returns the distance between the vectors \"value1\" and \"value2\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#81\n * @param value1 defines the first operand\n * @param value2 defines the second operand\n * @returns the distance\n */\n static Distance(e, t) {\n return Math.sqrt(_.DistanceSquared(e, t));\n }\n /**\n * Returns the squared distance between the vectors \"value1\" and \"value2\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#80\n * @param value1 defines the first operand\n * @param value2 defines the second operand\n * @returns the squared distance\n */\n static DistanceSquared(e, t) {\n const i = e._x - t._x, r = e._y - t._y, s = e._z - t._z;\n return i * i + r * r + s * s;\n }\n /**\n * Projects \"vector\" on the triangle determined by its extremities \"p0\", \"p1\" and \"p2\", stores the result in \"ref\"\n * and returns the distance to the projected point.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#104\n * From http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.4264&rep=rep1&type=pdf\n *\n * @param vector the vector to get distance from\n * @param p0 extremity of the triangle\n * @param p1 extremity of the triangle\n * @param p2 extremity of the triangle\n * @param ref variable to store the result to\n * @returns The distance between \"ref\" and \"vector\"\n */\n static ProjectOnTriangleToRef(e, t, i, r, s) {\n const a = be.Vector3[0], o = be.Vector3[1], l = be.Vector3[2], c = be.Vector3[3], h = be.Vector3[4];\n i.subtractToRef(t, a), r.subtractToRef(t, o), r.subtractToRef(i, l);\n const u = a.length(), f = o.length(), d = l.length();\n if (u < xt || f < xt || d < xt)\n return s.copyFrom(t), _.Distance(e, t);\n e.subtractToRef(t, h), _.CrossToRef(a, o, c);\n const p = c.length();\n if (p < xt)\n return s.copyFrom(t), _.Distance(e, t);\n c.normalizeFromLength(p);\n let g = h.length();\n if (g < xt)\n return s.copyFrom(t), 0;\n h.normalizeFromLength(g);\n const m = _.Dot(c, h), v = be.Vector3[5], E = be.Vector3[6];\n v.copyFrom(c).scaleInPlace(-g * m), E.copyFrom(e).addInPlace(v);\n const C = be.Vector3[4], T = be.Vector3[5], R = be.Vector3[7], x = be.Vector3[8];\n C.copyFrom(a).scaleInPlace(1 / u), x.copyFrom(o).scaleInPlace(1 / f), C.addInPlace(x).scaleInPlace(-1), T.copyFrom(a).scaleInPlace(-1 / u), x.copyFrom(l).scaleInPlace(1 / d), T.addInPlace(x).scaleInPlace(-1), R.copyFrom(l).scaleInPlace(-1 / d), x.copyFrom(o).scaleInPlace(-1 / f), R.addInPlace(x).scaleInPlace(-1);\n const S = be.Vector3[9];\n let M;\n S.copyFrom(E).subtractInPlace(t), _.CrossToRef(C, S, x), M = _.Dot(x, c);\n const N = M;\n S.copyFrom(E).subtractInPlace(i), _.CrossToRef(T, S, x), M = _.Dot(x, c);\n const F = M;\n S.copyFrom(E).subtractInPlace(r), _.CrossToRef(R, S, x), M = _.Dot(x, c);\n const L = M, K = be.Vector3[10];\n let q, j;\n N > 0 && F < 0 ? (K.copyFrom(a), q = t, j = i) : F > 0 && L < 0 ? (K.copyFrom(l), q = i, j = r) : (K.copyFrom(o).scaleInPlace(-1), q = r, j = t);\n const k = be.Vector3[9], Q = be.Vector3[4];\n if (q.subtractToRef(E, x), j.subtractToRef(E, k), _.CrossToRef(x, k, Q), !(_.Dot(Q, c) < 0))\n return s.copyFrom(E), Math.abs(g * m);\n const de = be.Vector3[5];\n _.CrossToRef(K, Q, de), de.normalize();\n const Z = be.Vector3[9];\n Z.copyFrom(q).subtractInPlace(E);\n const J = Z.length();\n if (J < xt)\n return s.copyFrom(q), _.Distance(e, q);\n Z.normalizeFromLength(J);\n const O = _.Dot(de, Z), G = be.Vector3[7];\n G.copyFrom(E).addInPlace(de.scaleInPlace(J * O)), x.copyFrom(G).subtractInPlace(q), g = K.length(), K.normalizeFromLength(g);\n let ee = _.Dot(x, K) / Math.max(g, xt);\n return ee = ii(ee, 0, 1), G.copyFrom(q).addInPlace(K.scaleInPlace(ee * g)), s.copyFrom(G), _.Distance(e, G);\n }\n /**\n * Returns a new Vector3 located at the center between \"value1\" and \"value2\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#72\n * @param value1 defines the first operand\n * @param value2 defines the second operand\n * @returns the new Vector3\n */\n static Center(e, t) {\n return _.CenterToRef(e, t, _.Zero());\n }\n /**\n * Gets the center of the vectors \"value1\" and \"value2\" and stores the result in the vector \"ref\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#73\n * @param value1 defines first vector\n * @param value2 defines second vector\n * @param ref defines third vector\n * @returns ref\n */\n static CenterToRef(e, t, i) {\n return i.copyFromFloats((e._x + t._x) / 2, (e._y + t._y) / 2, (e._z + t._z) / 2);\n }\n /**\n * Given three orthogonal normalized left-handed oriented Vector3 axis in space (target system),\n * RotationFromAxis() returns the rotation Euler angles (ex : rotation.x, rotation.y, rotation.z) to apply\n * to something in order to rotate it from its local system to the given target system\n * Note: axis1, axis2 and axis3 are normalized during this operation\n * Example Playground https://playground.babylonjs.com/#R1F8YU#106\n * @param axis1 defines the first axis\n * @param axis2 defines the second axis\n * @param axis3 defines the third axis\n * @returns a new Vector3\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/target_align\n */\n static RotationFromAxis(e, t, i) {\n const r = new e.constructor();\n return _.RotationFromAxisToRef(e, t, i, r), r;\n }\n /**\n * The same than RotationFromAxis but updates the given ref Vector3 parameter instead of returning a new Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#107\n * @param axis1 defines the first axis\n * @param axis2 defines the second axis\n * @param axis3 defines the third axis\n * @param ref defines the Vector3 where to store the result\n * @returns result input\n */\n static RotationFromAxisToRef(e, t, i, r) {\n const s = be.Quaternion[0];\n return Ce.RotationQuaternionFromAxisToRef(e, t, i, s), s.toEulerAnglesToRef(r), r;\n }\n}\n_._UpReadOnly = _.Up();\n_._DownReadOnly = _.Down();\n_._LeftHandedForwardReadOnly = _.Forward(!1);\n_._RightHandedForwardReadOnly = _.Forward(!0);\n_._LeftHandedBackwardReadOnly = _.Backward(!1);\n_._RightHandedBackwardReadOnly = _.Backward(!0);\n_._RightReadOnly = _.Right();\n_._LeftReadOnly = _.Left();\n_._ZeroReadOnly = _.Zero();\n_._OneReadOnly = _.One();\nObject.defineProperties(_.prototype, {\n dimension: { value: [3] },\n rank: { value: 1 }\n});\nclass Ke {\n /**\n * Creates a Vector4 object from the given floats.\n * @param x x value of the vector\n * @param y y value of the vector\n * @param z z value of the vector\n * @param w w value of the vector\n */\n constructor(e = 0, t = 0, i = 0, r = 0) {\n this.x = e, this.y = t, this.z = i, this.w = r;\n }\n /**\n * Returns the string with the Vector4 coordinates.\n * @returns a string containing all the vector values\n */\n toString() {\n return `{X: ${this.x} Y: ${this.y} Z: ${this.z} W: ${this.w}}`;\n }\n /**\n * Returns the string \"Vector4\".\n * @returns \"Vector4\"\n */\n getClassName() {\n return \"Vector4\";\n }\n /**\n * Returns the Vector4 hash code.\n * @returns a unique hash code\n */\n getHashCode() {\n const e = nr(this.x), t = nr(this.y), i = nr(this.z), r = nr(this.w);\n let s = e;\n return s = s * 397 ^ t, s = s * 397 ^ i, s = s * 397 ^ r, s;\n }\n // Operators\n /**\n * Returns a new array populated with 4 elements : the Vector4 coordinates.\n * @returns the resulting array\n */\n asArray() {\n return [this.x, this.y, this.z, this.w];\n }\n /**\n * Populates the given array from the given index with the Vector4 coordinates.\n * @param array array to populate\n * @param index index of the array to start at (default: 0)\n * @returns the Vector4.\n */\n toArray(e, t) {\n return t === void 0 && (t = 0), e[t] = this.x, e[t + 1] = this.y, e[t + 2] = this.z, e[t + 3] = this.w, this;\n }\n /**\n * Update the current vector from an array\n * @param array defines the destination array\n * @param offset defines the offset in the destination array\n * @returns the current Vector3\n */\n fromArray(e, t = 0) {\n return Ke.FromArrayToRef(e, t, this), this;\n }\n /**\n * Adds the given vector to the current Vector4.\n * @param otherVector the vector to add\n * @returns the updated Vector4.\n */\n addInPlace(e) {\n return this.x += e.x, this.y += e.y, this.z += e.z, this.w += e.w, this;\n }\n /**\n * Adds the given coordinates to the current Vector4\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @param w defines the w coordinate of the operand\n * @returns the current updated Vector4\n */\n addInPlaceFromFloats(e, t, i, r) {\n return this.x += e, this.y += t, this.z += i, this.w += r, this;\n }\n /**\n * Returns a new Vector4 as the result of the addition of the current Vector4 and the given one.\n * @param otherVector the vector to add\n * @returns the resulting vector\n */\n add(e) {\n return new this.constructor(this.x + e.x, this.y + e.y, this.z + e.z, this.w + e.w);\n }\n /**\n * Updates the given vector \"result\" with the result of the addition of the current Vector4 and the given one.\n * @param otherVector the vector to add\n * @param result the vector to store the result\n * @returns result input\n */\n addToRef(e, t) {\n return t.x = this.x + e.x, t.y = this.y + e.y, t.z = this.z + e.z, t.w = this.w + e.w, t;\n }\n /**\n * Subtract in place the given vector from the current Vector4.\n * @param otherVector the vector to subtract\n * @returns the updated Vector4.\n */\n subtractInPlace(e) {\n return this.x -= e.x, this.y -= e.y, this.z -= e.z, this.w -= e.w, this;\n }\n /**\n * Returns a new Vector4 with the result of the subtraction of the given vector from the current Vector4.\n * @param otherVector the vector to add\n * @returns the new vector with the result\n */\n subtract(e) {\n return new this.constructor(this.x - e.x, this.y - e.y, this.z - e.z, this.w - e.w);\n }\n /**\n * Sets the given vector \"result\" with the result of the subtraction of the given vector from the current Vector4.\n * @param otherVector the vector to subtract\n * @param result the vector to store the result\n * @returns result input\n */\n subtractToRef(e, t) {\n return t.x = this.x - e.x, t.y = this.y - e.y, t.z = this.z - e.z, t.w = this.w - e.w, t;\n }\n /**\n * Returns a new Vector4 set with the result of the subtraction of the given floats from the current Vector4 coordinates.\n * @param x value to subtract\n * @param y value to subtract\n * @param z value to subtract\n * @param w value to subtract\n * @returns new vector containing the result\n */\n subtractFromFloats(e, t, i, r) {\n return new this.constructor(this.x - e, this.y - t, this.z - i, this.w - r);\n }\n /**\n * Sets the given vector \"result\" set with the result of the subtraction of the given floats from the current Vector4 coordinates.\n * @param x value to subtract\n * @param y value to subtract\n * @param z value to subtract\n * @param w value to subtract\n * @param result the vector to store the result in\n * @returns result input\n */\n subtractFromFloatsToRef(e, t, i, r, s) {\n return s.x = this.x - e, s.y = this.y - t, s.z = this.z - i, s.w = this.w - r, s;\n }\n /**\n * Returns a new Vector4 set with the current Vector4 negated coordinates.\n * @returns a new vector with the negated values\n */\n negate() {\n return new this.constructor(-this.x, -this.y, -this.z, -this.w);\n }\n /**\n * Negate this vector in place\n * @returns this\n */\n negateInPlace() {\n return this.x *= -1, this.y *= -1, this.z *= -1, this.w *= -1, this;\n }\n /**\n * Negate the current Vector4 and stores the result in the given vector \"result\" coordinates\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n negateToRef(e) {\n return e.copyFromFloats(this.x * -1, this.y * -1, this.z * -1, this.w * -1);\n }\n /**\n * Multiplies the current Vector4 coordinates by scale (float).\n * @param scale the number to scale with\n * @returns the updated Vector4.\n */\n scaleInPlace(e) {\n return this.x *= e, this.y *= e, this.z *= e, this.w *= e, this;\n }\n /**\n * Returns a new Vector4 set with the current Vector4 coordinates multiplied by scale (float).\n * @param scale the number to scale with\n * @returns a new vector with the result\n */\n scale(e) {\n return new this.constructor(this.x * e, this.y * e, this.z * e, this.w * e);\n }\n /**\n * Sets the given vector \"result\" with the current Vector4 coordinates multiplied by scale (float).\n * @param scale the number to scale with\n * @param result a vector to store the result in\n * @returns result input\n */\n scaleToRef(e, t) {\n return t.x = this.x * e, t.y = this.y * e, t.z = this.z * e, t.w = this.w * e, t;\n }\n /**\n * Scale the current Vector4 values by a factor and add the result to a given Vector4\n * @param scale defines the scale factor\n * @param result defines the Vector4 object where to store the result\n * @returns result input\n */\n scaleAndAddToRef(e, t) {\n return t.x += this.x * e, t.y += this.y * e, t.z += this.z * e, t.w += this.w * e, t;\n }\n /**\n * Boolean : True if the current Vector4 coordinates are stricly equal to the given ones.\n * @param otherVector the vector to compare against\n * @returns true if they are equal\n */\n equals(e) {\n return e && this.x === e.x && this.y === e.y && this.z === e.z && this.w === e.w;\n }\n /**\n * Boolean : True if the current Vector4 coordinates are each beneath the distance \"epsilon\" from the given vector ones.\n * @param otherVector vector to compare against\n * @param epsilon (Default: very small number)\n * @returns true if they are equal\n */\n equalsWithEpsilon(e, t = xt) {\n return e && Ii(this.x, e.x, t) && Ii(this.y, e.y, t) && Ii(this.z, e.z, t) && Ii(this.w, e.w, t);\n }\n /**\n * Boolean : True if the given floats are strictly equal to the current Vector4 coordinates.\n * @param x x value to compare against\n * @param y y value to compare against\n * @param z z value to compare against\n * @param w w value to compare against\n * @returns true if equal\n */\n equalsToFloats(e, t, i, r) {\n return this.x === e && this.y === t && this.z === i && this.w === r;\n }\n /**\n * Multiplies in place the current Vector4 by the given one.\n * @param otherVector vector to multiple with\n * @returns the updated Vector4.\n */\n multiplyInPlace(e) {\n return this.x *= e.x, this.y *= e.y, this.z *= e.z, this.w *= e.w, this;\n }\n /**\n * Returns a new Vector4 set with the multiplication result of the current Vector4 and the given one.\n * @param otherVector vector to multiple with\n * @returns resulting new vector\n */\n multiply(e) {\n return new this.constructor(this.x * e.x, this.y * e.y, this.z * e.z, this.w * e.w);\n }\n /**\n * Updates the given vector \"result\" with the multiplication result of the current Vector4 and the given one.\n * @param otherVector vector to multiple with\n * @param result vector to store the result\n * @returns result input\n */\n multiplyToRef(e, t) {\n return t.x = this.x * e.x, t.y = this.y * e.y, t.z = this.z * e.z, t.w = this.w * e.w, t;\n }\n /**\n * Returns a new Vector4 set with the multiplication result of the given floats and the current Vector4 coordinates.\n * @param x x value multiply with\n * @param y y value multiply with\n * @param z z value multiply with\n * @param w w value multiply with\n * @returns resulting new vector\n */\n multiplyByFloats(e, t, i, r) {\n return new this.constructor(this.x * e, this.y * t, this.z * i, this.w * r);\n }\n /**\n * Returns a new Vector4 set with the division result of the current Vector4 by the given one.\n * @param otherVector vector to devide with\n * @returns resulting new vector\n */\n divide(e) {\n return new this.constructor(this.x / e.x, this.y / e.y, this.z / e.z, this.w / e.w);\n }\n /**\n * Updates the given vector \"result\" with the division result of the current Vector4 by the given one.\n * @param otherVector vector to devide with\n * @param result vector to store the result\n * @returns result input\n */\n divideToRef(e, t) {\n return t.x = this.x / e.x, t.y = this.y / e.y, t.z = this.z / e.z, t.w = this.w / e.w, t;\n }\n /**\n * Divides the current Vector3 coordinates by the given ones.\n * @param otherVector vector to devide with\n * @returns the updated Vector3.\n */\n divideInPlace(e) {\n return this.divideToRef(e, this);\n }\n /**\n * Updates the Vector4 coordinates with the minimum values between its own and the given vector ones\n * @param other defines the second operand\n * @returns the current updated Vector4\n */\n minimizeInPlace(e) {\n return e.x < this.x && (this.x = e.x), e.y < this.y && (this.y = e.y), e.z < this.z && (this.z = e.z), e.w < this.w && (this.w = e.w), this;\n }\n /**\n * Updates the Vector4 coordinates with the maximum values between its own and the given vector ones\n * @param other defines the second operand\n * @returns the current updated Vector4\n */\n maximizeInPlace(e) {\n return e.x > this.x && (this.x = e.x), e.y > this.y && (this.y = e.y), e.z > this.z && (this.z = e.z), e.w > this.w && (this.w = e.w), this;\n }\n /**\n * Updates the current Vector4 with the minimal coordinate values between its and the given coordinates\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @param w defines the w coordinate of the operand\n * @returns the current updated Vector4\n */\n minimizeInPlaceFromFloats(e, t, i, r) {\n return this.x = Math.min(e, this.x), this.y = Math.min(t, this.y), this.z = Math.min(i, this.z), this.w = Math.min(r, this.w), this;\n }\n /**\n * Updates the current Vector4 with the maximal coordinate values between its and the given coordinates.\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @param w defines the w coordinate of the operand\n * @returns the current updated Vector4\n */\n maximizeInPlaceFromFloats(e, t, i, r) {\n return this.x = Math.max(e, this.x), this.y = Math.max(t, this.y), this.z = Math.max(i, this.z), this.w = Math.max(r, this.w), this;\n }\n /**\n * Gets the current Vector4's floored values and stores them in result\n * @param result the vector to store the result in\n * @returns the result vector\n */\n floorToRef(e) {\n return e.x = Math.floor(this.x), e.y = Math.floor(this.y), e.z = Math.floor(this.z), e.w = Math.floor(this.w), e;\n }\n /**\n * Gets a new Vector4 from current Vector4 floored values\n * @returns a new Vector4\n */\n floor() {\n return new this.constructor(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z), Math.floor(this.w));\n }\n /**\n * Gets the current Vector4's fractional values and stores them in result\n * @param result the vector to store the result in\n * @returns the result vector\n */\n fractToRef(e) {\n return e.x = this.x - Math.floor(this.x), e.y = this.y - Math.floor(this.y), e.z = this.z - Math.floor(this.z), e.w = this.w - Math.floor(this.w), e;\n }\n /**\n * Gets a new Vector4 from current Vector4 fractional values\n * @returns a new Vector4\n */\n fract() {\n return new this.constructor(this.x - Math.floor(this.x), this.y - Math.floor(this.y), this.z - Math.floor(this.z), this.w - Math.floor(this.w));\n }\n // Properties\n /**\n * Returns the Vector4 length (float).\n * @returns the length\n */\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n }\n /**\n * Returns the Vector4 squared length (float).\n * @returns the length squared\n */\n lengthSquared() {\n return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n }\n // Methods\n /**\n * Normalizes in place the Vector4.\n * @returns the updated Vector4.\n */\n normalize() {\n return this.normalizeFromLength(this.length());\n }\n /**\n * Normalize the current Vector4 with the given input length.\n * Please note that this is an in place operation.\n * @param len the length of the vector\n * @returns the current updated Vector4\n */\n normalizeFromLength(e) {\n return e === 0 || e === 1 ? this : this.scaleInPlace(1 / e);\n }\n /**\n * Normalize the current Vector4 to a new vector\n * @returns the new Vector4\n */\n normalizeToNew() {\n const e = new this.constructor();\n return this.normalizeToRef(e), e;\n }\n /**\n * Normalize the current Vector4 to the reference\n * @param reference define the Vector4 to update\n * @returns the updated Vector4\n */\n normalizeToRef(e) {\n const t = this.length();\n return t === 0 || t === 1 ? e.copyFrom(this) : this.scaleToRef(1 / t, e);\n }\n /**\n * Returns a new Vector3 from the Vector4 (x, y, z) coordinates.\n * @returns this converted to a new vector3\n */\n toVector3() {\n return new _(this.x, this.y, this.z);\n }\n /**\n * Returns a new Vector4 copied from the current one.\n * @returns the new cloned vector\n */\n clone() {\n return new this.constructor(this.x, this.y, this.z, this.w);\n }\n /**\n * Updates the current Vector4 with the given one coordinates.\n * @param source the source vector to copy from\n * @returns the updated Vector4.\n */\n copyFrom(e) {\n return this.x = e.x, this.y = e.y, this.z = e.z, this.w = e.w, this;\n }\n /**\n * Updates the current Vector4 coordinates with the given floats.\n * @param x float to copy from\n * @param y float to copy from\n * @param z float to copy from\n * @param w float to copy from\n * @returns the updated Vector4.\n */\n copyFromFloats(e, t, i, r) {\n return this.x = e, this.y = t, this.z = i, this.w = r, this;\n }\n /**\n * Updates the current Vector4 coordinates with the given floats.\n * @param x float to set from\n * @param y float to set from\n * @param z float to set from\n * @param w float to set from\n * @returns the updated Vector4.\n */\n set(e, t, i, r) {\n return this.copyFromFloats(e, t, i, r);\n }\n /**\n * Copies the given float to the current Vector4 coordinates\n * @param v defines the x, y, z and w coordinates of the operand\n * @returns the current updated Vector4\n */\n setAll(e) {\n return this.x = this.y = this.z = this.w = e, this;\n }\n /**\n * Returns the dot product (float) between the current vectors and \"otherVector\"\n * @param otherVector defines the right operand\n * @returns the dot product\n */\n dot(e) {\n return this.x * e.x + this.y * e.y + this.z * e.z + this.w * e.w;\n }\n // Statics\n /**\n * Returns a new Vector4 set from the starting index of the given array.\n * @param array the array to pull values from\n * @param offset the offset into the array to start at\n * @returns the new vector\n */\n static FromArray(e, t) {\n return t || (t = 0), new Ke(e[t], e[t + 1], e[t + 2], e[t + 3]);\n }\n /**\n * Updates the given vector \"result\" from the starting index of the given array.\n * @param array the array to pull values from\n * @param offset the offset into the array to start at\n * @param result the vector to store the result in\n * @returns result input\n */\n static FromArrayToRef(e, t, i) {\n return i.x = e[t], i.y = e[t + 1], i.z = e[t + 2], i.w = e[t + 3], i;\n }\n /**\n * Updates the given vector \"result\" from the starting index of the given Float32Array.\n * @param array the array to pull values from\n * @param offset the offset into the array to start at\n * @param result the vector to store the result in\n * @returns result input\n */\n static FromFloatArrayToRef(e, t, i) {\n return Ke.FromArrayToRef(e, t, i), i;\n }\n /**\n * Updates the given vector \"result\" coordinates from the given floats.\n * @param x float to set from\n * @param y float to set from\n * @param z float to set from\n * @param w float to set from\n * @param result the vector to the floats in\n * @returns result input\n */\n static FromFloatsToRef(e, t, i, r, s) {\n return s.x = e, s.y = t, s.z = i, s.w = r, s;\n }\n /**\n * Returns a new Vector4 set to (0.0, 0.0, 0.0, 0.0)\n * @returns the new vector\n */\n static Zero() {\n return new Ke(0, 0, 0, 0);\n }\n /**\n * Returns a new Vector4 set to (1.0, 1.0, 1.0, 1.0)\n * @returns the new vector\n */\n static One() {\n return new Ke(1, 1, 1, 1);\n }\n /**\n * Returns a new Vector4 with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @returns a Vector4 with random values between min and max\n */\n static Random(e = 0, t = 1) {\n return new Ke(Zt(e, t), Zt(e, t), Zt(e, t), Zt(e, t));\n }\n /**\n * Sets a Vector4 with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @param ref the ref to store the values in\n * @returns the ref with random values between min and max\n */\n static RandomToRef(e = 0, t = 1, i) {\n return i.copyFromFloats(Zt(e, t), Zt(e, t), Zt(e, t), Zt(e, t));\n }\n /**\n * Returns a new Vector4 set with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\n * @param value defines the current value\n * @param min defines the lower range value\n * @param max defines the upper range value\n * @returns the new Vector4\n */\n static Clamp(e, t, i) {\n const r = new e.constructor();\n return Ke.ClampToRef(e, t, i, r), r;\n }\n /**\n * Sets the given vector \"result\" with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\n * @param value defines the current value\n * @param min defines the lower range value\n * @param max defines the upper range value\n * @param result defines the Vector4 where to store the result\n * @returns result input\n */\n static ClampToRef(e, t, i, r) {\n return r.copyFromFloats(ii(e.x, t.x, i.x), ii(e.y, t.y, i.y), ii(e.z, t.z, i.z), ii(e.w, t.w, i.w));\n }\n /**\n * Checks if a given vector is inside a specific range\n * Example Playground https://playground.babylonjs.com/#R1F8YU#75\n * @param v defines the vector to test\n * @param min defines the minimum range\n * @param max defines the maximum range\n */\n static CheckExtends(e, t, i) {\n t.minimizeInPlace(e), i.maximizeInPlace(e);\n }\n /**\n * Gets a zero Vector4 that must not be updated\n */\n static get ZeroReadOnly() {\n return Ke._ZeroReadOnly;\n }\n /**\n * Returns a new normalized Vector4 from the given one.\n * @param vector the vector to normalize\n * @returns the vector\n */\n static Normalize(e) {\n const t = Ke.Zero();\n return Ke.NormalizeToRef(e, t), t;\n }\n /**\n * Updates the given vector \"result\" from the normalization of the given one.\n * @param vector the vector to normalize\n * @param result the vector to store the result in\n * @returns result input\n */\n static NormalizeToRef(e, t) {\n return e.normalizeToRef(t), t;\n }\n /**\n * Returns a vector with the minimum values from the left and right vectors\n * @param left left vector to minimize\n * @param right right vector to minimize\n * @returns a new vector with the minimum of the left and right vector values\n */\n static Minimize(e, t) {\n const i = new e.constructor();\n return i.copyFrom(e), i.minimizeInPlace(t), i;\n }\n /**\n * Returns a vector with the maximum values from the left and right vectors\n * @param left left vector to maximize\n * @param right right vector to maximize\n * @returns a new vector with the maximum of the left and right vector values\n */\n static Maximize(e, t) {\n const i = new e.constructor();\n return i.copyFrom(e), i.maximizeInPlace(t), i;\n }\n /**\n * Returns the distance (float) between the vectors \"value1\" and \"value2\".\n * @param value1 value to calulate the distance between\n * @param value2 value to calulate the distance between\n * @returns the distance between the two vectors\n */\n static Distance(e, t) {\n return Math.sqrt(Ke.DistanceSquared(e, t));\n }\n /**\n * Returns the squared distance (float) between the vectors \"value1\" and \"value2\".\n * @param value1 value to calulate the distance between\n * @param value2 value to calulate the distance between\n * @returns the distance between the two vectors squared\n */\n static DistanceSquared(e, t) {\n const i = e.x - t.x, r = e.y - t.y, s = e.z - t.z, a = e.w - t.w;\n return i * i + r * r + s * s + a * a;\n }\n /**\n * Returns a new Vector4 located at the center between the vectors \"value1\" and \"value2\".\n * @param value1 value to calulate the center between\n * @param value2 value to calulate the center between\n * @returns the center between the two vectors\n */\n static Center(e, t) {\n return Ke.CenterToRef(e, t, Ke.Zero());\n }\n /**\n * Gets the center of the vectors \"value1\" and \"value2\" and stores the result in the vector \"ref\"\n * @param value1 defines first vector\n * @param value2 defines second vector\n * @param ref defines third vector\n * @returns ref\n */\n static CenterToRef(e, t, i) {\n return i.copyFromFloats((e.x + t.x) / 2, (e.y + t.y) / 2, (e.z + t.z) / 2, (e.w + t.w) / 2);\n }\n /**\n * Returns a new Vector4 set with the result of the transformation by the given matrix of the given vector.\n * This method computes tranformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\n * The difference with Vector3.TransformCoordinates is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead\n * @param vector defines the Vector3 to transform\n * @param transformation defines the transformation matrix\n * @returns the transformed Vector4\n */\n static TransformCoordinates(e, t) {\n const i = Ke.Zero();\n return Ke.TransformCoordinatesToRef(e, t, i), i;\n }\n /**\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given vector\n * This method computes tranformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\n * The difference with Vector3.TransformCoordinatesToRef is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead\n * @param vector defines the Vector3 to transform\n * @param transformation defines the transformation matrix\n * @param result defines the Vector4 where to store the result\n * @returns result input\n */\n static TransformCoordinatesToRef(e, t, i) {\n return Ke.TransformCoordinatesFromFloatsToRef(e._x, e._y, e._z, t, i), i;\n }\n /**\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given floats (x, y, z)\n * This method computes tranformed coordinates only, not transformed direction vectors\n * The difference with Vector3.TransformCoordinatesFromFloatsToRef is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead\n * @param x define the x coordinate of the source vector\n * @param y define the y coordinate of the source vector\n * @param z define the z coordinate of the source vector\n * @param transformation defines the transformation matrix\n * @param result defines the Vector4 where to store the result\n * @returns result input\n */\n static TransformCoordinatesFromFloatsToRef(e, t, i, r, s) {\n const a = r.m, o = e * a[0] + t * a[4] + i * a[8] + a[12], l = e * a[1] + t * a[5] + i * a[9] + a[13], c = e * a[2] + t * a[6] + i * a[10] + a[14], h = e * a[3] + t * a[7] + i * a[11] + a[15];\n return s.x = o, s.y = l, s.z = c, s.w = h, s;\n }\n /**\n * Returns a new Vector4 set with the result of the normal transformation by the given matrix of the given vector.\n * This methods computes transformed normalized direction vectors only.\n * @param vector the vector to transform\n * @param transformation the transformation matrix to apply\n * @returns the new vector\n */\n static TransformNormal(e, t) {\n const i = new e.constructor();\n return Ke.TransformNormalToRef(e, t, i), i;\n }\n /**\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given vector.\n * This methods computes transformed normalized direction vectors only.\n * @param vector the vector to transform\n * @param transformation the transformation matrix to apply\n * @param result the vector to store the result in\n * @returns result input\n */\n static TransformNormalToRef(e, t, i) {\n const r = t.m, s = e.x * r[0] + e.y * r[4] + e.z * r[8], a = e.x * r[1] + e.y * r[5] + e.z * r[9], o = e.x * r[2] + e.y * r[6] + e.z * r[10];\n return i.x = s, i.y = a, i.z = o, i.w = e.w, i;\n }\n /**\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given floats (x, y, z, w).\n * This methods computes transformed normalized direction vectors only.\n * @param x value to transform\n * @param y value to transform\n * @param z value to transform\n * @param w value to transform\n * @param transformation the transformation matrix to apply\n * @param result the vector to store the results in\n * @returns result input\n */\n static TransformNormalFromFloatsToRef(e, t, i, r, s, a) {\n const o = s.m;\n return a.x = e * o[0] + t * o[4] + i * o[8], a.y = e * o[1] + t * o[5] + i * o[9], a.z = e * o[2] + t * o[6] + i * o[10], a.w = r, a;\n }\n /**\n * Creates a new Vector4 from a Vector3\n * @param source defines the source data\n * @param w defines the 4th component (default is 0)\n * @returns a new Vector4\n */\n static FromVector3(e, t = 0) {\n return new Ke(e._x, e._y, e._z, t);\n }\n /**\n * Returns the dot product (float) between the vectors \"left\" and \"right\"\n * @param left defines the left operand\n * @param right defines the right operand\n * @returns the dot product\n */\n static Dot(e, t) {\n return e.dot(t);\n }\n}\nKe._ZeroReadOnly = Ke.Zero();\nObject.defineProperties(Ke.prototype, {\n dimension: { value: [4] },\n rank: { value: 1 }\n});\nclass Ce {\n /** Gets or sets the x coordinate */\n get x() {\n return this._x;\n }\n set x(e) {\n this._x = e, this._isDirty = !0;\n }\n /** Gets or sets the y coordinate */\n get y() {\n return this._y;\n }\n set y(e) {\n this._y = e, this._isDirty = !0;\n }\n /** Gets or sets the z coordinate */\n get z() {\n return this._z;\n }\n set z(e) {\n this._z = e, this._isDirty = !0;\n }\n /** Gets or sets the w coordinate */\n get w() {\n return this._w;\n }\n set w(e) {\n this._w = e, this._isDirty = !0;\n }\n /**\n * Creates a new Quaternion from the given floats\n * @param x defines the first component (0 by default)\n * @param y defines the second component (0 by default)\n * @param z defines the third component (0 by default)\n * @param w defines the fourth component (1.0 by default)\n */\n constructor(e = 0, t = 0, i = 0, r = 1) {\n this._isDirty = !0, this._x = e, this._y = t, this._z = i, this._w = r;\n }\n /**\n * Gets a string representation for the current quaternion\n * @returns a string with the Quaternion coordinates\n */\n toString() {\n return `{X: ${this._x} Y: ${this._y} Z: ${this._z} W: ${this._w}}`;\n }\n /**\n * Gets the class name of the quaternion\n * @returns the string \"Quaternion\"\n */\n getClassName() {\n return \"Quaternion\";\n }\n /**\n * Gets a hash code for this quaternion\n * @returns the quaternion hash code\n */\n getHashCode() {\n const e = nr(this._x), t = nr(this._y), i = nr(this._z), r = nr(this._w);\n let s = e;\n return s = s * 397 ^ t, s = s * 397 ^ i, s = s * 397 ^ r, s;\n }\n /**\n * Copy the quaternion to an array\n * Example Playground https://playground.babylonjs.com/#L49EJ7#13\n * @returns a new array populated with 4 elements from the quaternion coordinates\n */\n asArray() {\n return [this._x, this._y, this._z, this._w];\n }\n /**\n * Stores from the starting index in the given array the Quaternion successive values\n * Example Playground https://playground.babylonjs.com/#L49EJ7#59\n * @param array defines the array where to store the x,y,z,w components\n * @param index defines an optional index in the target array to define where to start storing values\n * @returns the current Quaternion object\n */\n toArray(e, t = 0) {\n return e[t] = this._x, e[t + 1] = this._y, e[t + 2] = this._z, e[t + 3] = this._w, this;\n }\n fromArray(e, t = 0) {\n return Ce.FromArrayToRef(e, t, this);\n }\n /**\n * Check if two quaternions are equals\n * Example Playground https://playground.babylonjs.com/#L49EJ7#38\n * @param otherQuaternion defines the second operand\n * @returns true if the current quaternion and the given one coordinates are strictly equals\n */\n equals(e) {\n return e && this._x === e._x && this._y === e._y && this._z === e._z && this._w === e._w;\n }\n /**\n * Gets a boolean if two quaternions are equals (using an epsilon value)\n * Example Playground https://playground.babylonjs.com/#L49EJ7#37\n * @param otherQuaternion defines the other quaternion\n * @param epsilon defines the minimal distance to consider equality\n * @returns true if the given quaternion coordinates are close to the current ones by a distance of epsilon.\n */\n equalsWithEpsilon(e, t = xt) {\n return e && Ii(this._x, e._x, t) && Ii(this._y, e._y, t) && Ii(this._z, e._z, t) && Ii(this._w, e._w, t);\n }\n /**\n * Clone the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#12\n * @returns a new quaternion copied from the current one\n */\n clone() {\n return new this.constructor(this._x, this._y, this._z, this._w);\n }\n /**\n * Copy a quaternion to the current one\n * Example Playground https://playground.babylonjs.com/#L49EJ7#86\n * @param other defines the other quaternion\n * @returns the updated current quaternion\n */\n copyFrom(e) {\n return this._x = e._x, this._y = e._y, this._z = e._z, this._w = e._w, this._isDirty = !0, this;\n }\n /**\n * Updates the current quaternion with the given float coordinates\n * Example Playground https://playground.babylonjs.com/#L49EJ7#87\n * @param x defines the x coordinate\n * @param y defines the y coordinate\n * @param z defines the z coordinate\n * @param w defines the w coordinate\n * @returns the updated current quaternion\n */\n copyFromFloats(e, t, i, r) {\n return this._x = e, this._y = t, this._z = i, this._w = r, this._isDirty = !0, this;\n }\n /**\n * Updates the current quaternion from the given float coordinates\n * Example Playground https://playground.babylonjs.com/#L49EJ7#56\n * @param x defines the x coordinate\n * @param y defines the y coordinate\n * @param z defines the z coordinate\n * @param w defines the w coordinate\n * @returns the updated current quaternion\n */\n set(e, t, i, r) {\n return this.copyFromFloats(e, t, i, r);\n }\n setAll(e) {\n return this.copyFromFloats(e, e, e, e);\n }\n /**\n * Adds two quaternions\n * Example Playground https://playground.babylonjs.com/#L49EJ7#10\n * @param other defines the second operand\n * @returns a new quaternion as the addition result of the given one and the current quaternion\n */\n add(e) {\n return new this.constructor(this._x + e._x, this._y + e._y, this._z + e._z, this._w + e._w);\n }\n /**\n * Add a quaternion to the current one\n * Example Playground https://playground.babylonjs.com/#L49EJ7#11\n * @param other defines the quaternion to add\n * @returns the current quaternion\n */\n addInPlace(e) {\n return this._x += e._x, this._y += e._y, this._z += e._z, this._w += e._w, this._isDirty = !0, this;\n }\n addToRef(e, t) {\n return t._x = this._x + e._x, t._y = this._y + e._y, t._z = this._z + e._z, t._w = this._w + e._w, t._isDirty = !0, t;\n }\n addInPlaceFromFloats(e, t, i, r) {\n return this._x += e, this._y += t, this._z += i, this._w += r, this._isDirty = !0, this;\n }\n subtractToRef(e, t) {\n return t._x = this._x - e._x, t._y = this._y - e._y, t._z = this._z - e._z, t._w = this._w - e._w, t._isDirty = !0, t;\n }\n subtractFromFloats(e, t, i, r) {\n return this.subtractFromFloatsToRef(e, t, i, r, new this.constructor());\n }\n subtractFromFloatsToRef(e, t, i, r, s) {\n return s._x = this._x - e, s._y = this._y - t, s._z = this._z - i, s._w = this._w - r, s._isDirty = !0, s;\n }\n /**\n * Subtract two quaternions\n * Example Playground https://playground.babylonjs.com/#L49EJ7#57\n * @param other defines the second operand\n * @returns a new quaternion as the subtraction result of the given one from the current one\n */\n subtract(e) {\n return new this.constructor(this._x - e._x, this._y - e._y, this._z - e._z, this._w - e._w);\n }\n /**\n * Subtract a quaternion to the current one\n * Example Playground https://playground.babylonjs.com/#L49EJ7#58\n * @param other defines the quaternion to subtract\n * @returns the current quaternion\n */\n subtractInPlace(e) {\n return this._x -= e._x, this._y -= e._y, this._z -= e._z, this._w -= e._w, this._isDirty = !0, this;\n }\n /**\n * Multiplies the current quaternion by a scale factor\n * Example Playground https://playground.babylonjs.com/#L49EJ7#88\n * @param value defines the scale factor\n * @returns a new quaternion set by multiplying the current quaternion coordinates by the float \"scale\"\n */\n scale(e) {\n return new this.constructor(this._x * e, this._y * e, this._z * e, this._w * e);\n }\n /**\n * Scale the current quaternion values by a factor and stores the result to a given quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#89\n * @param scale defines the scale factor\n * @param result defines the Quaternion object where to store the result\n * @returns result input\n */\n scaleToRef(e, t) {\n return t._x = this._x * e, t._y = this._y * e, t._z = this._z * e, t._w = this._w * e, t._isDirty = !0, t;\n }\n /**\n * Multiplies in place the current quaternion by a scale factor\n * Example Playground https://playground.babylonjs.com/#L49EJ7#90\n * @param value defines the scale factor\n * @returns the current modified quaternion\n */\n scaleInPlace(e) {\n return this._x *= e, this._y *= e, this._z *= e, this._w *= e, this._isDirty = !0, this;\n }\n /**\n * Scale the current quaternion values by a factor and add the result to a given quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#91\n * @param scale defines the scale factor\n * @param result defines the Quaternion object where to store the result\n * @returns result input\n */\n scaleAndAddToRef(e, t) {\n return t._x += this._x * e, t._y += this._y * e, t._z += this._z * e, t._w += this._w * e, t._isDirty = !0, t;\n }\n /**\n * Multiplies two quaternions\n * Example Playground https://playground.babylonjs.com/#L49EJ7#43\n * @param q1 defines the second operand\n * @returns a new quaternion set as the multiplication result of the current one with the given one \"q1\"\n */\n multiply(e) {\n const t = new this.constructor(0, 0, 0, 1);\n return this.multiplyToRef(e, t), t;\n }\n /**\n * Sets the given \"result\" as the multiplication result of the current one with the given one \"q1\"\n * Example Playground https://playground.babylonjs.com/#L49EJ7#45\n * @param q1 defines the second operand\n * @param result defines the target quaternion\n * @returns the current quaternion\n */\n multiplyToRef(e, t) {\n const i = this._x * e._w + this._y * e._z - this._z * e._y + this._w * e._x, r = -this._x * e._z + this._y * e._w + this._z * e._x + this._w * e._y, s = this._x * e._y - this._y * e._x + this._z * e._w + this._w * e._z, a = -this._x * e._x - this._y * e._y - this._z * e._z + this._w * e._w;\n return t.copyFromFloats(i, r, s, a), t;\n }\n /**\n * Updates the current quaternion with the multiplication of itself with the given one \"q1\"\n * Example Playground https://playground.babylonjs.com/#L49EJ7#46\n * @param other defines the second operand\n * @returns the currentupdated quaternion\n */\n multiplyInPlace(e) {\n return this.multiplyToRef(e, this);\n }\n multiplyByFloats(e, t, i, r) {\n return this._x *= e, this._y *= t, this._z *= i, this._w *= r, this._isDirty = !0, this;\n }\n /**\n * @internal\n * Do not use\n */\n divide(e) {\n throw new ReferenceError(\"Can not divide a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n divideToRef(e, t) {\n throw new ReferenceError(\"Can not divide a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n divideInPlace(e) {\n throw new ReferenceError(\"Can not divide a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n minimizeInPlace() {\n throw new ReferenceError(\"Can not minimize a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n minimizeInPlaceFromFloats() {\n throw new ReferenceError(\"Can not minimize a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n maximizeInPlace() {\n throw new ReferenceError(\"Can not maximize a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n maximizeInPlaceFromFloats() {\n throw new ReferenceError(\"Can not maximize a quaternion\");\n }\n negate() {\n return this.negateToRef(new this.constructor());\n }\n negateInPlace() {\n return this._x = -this._x, this._y = -this._y, this._z = -this._z, this._w = -this._w, this._isDirty = !0, this;\n }\n negateToRef(e) {\n return e._x = -this._x, e._y = -this._y, e._z = -this._z, e._w = -this._w, e._isDirty = !0, e;\n }\n equalsToFloats(e, t, i, r) {\n return this._x === e && this._y === t && this._z === i && this._w === r;\n }\n /**\n * @internal\n * Do not use\n */\n floorToRef(e) {\n throw new ReferenceError(\"Can not floor a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n floor() {\n throw new ReferenceError(\"Can not floor a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n fractToRef(e) {\n throw new ReferenceError(\"Can not fract a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n fract() {\n throw new ReferenceError(\"Can not fract a quaternion\");\n }\n /**\n * Conjugates the current quaternion and stores the result in the given quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#81\n * @param ref defines the target quaternion\n * @returns result input\n */\n conjugateToRef(e) {\n return e.copyFromFloats(-this._x, -this._y, -this._z, this._w), e;\n }\n /**\n * Conjugates in place the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#82\n * @returns the current updated quaternion\n */\n conjugateInPlace() {\n return this._x *= -1, this._y *= -1, this._z *= -1, this._isDirty = !0, this;\n }\n /**\n * Conjugates (1-q) the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#83\n * @returns a new quaternion\n */\n conjugate() {\n return new this.constructor(-this._x, -this._y, -this._z, this._w);\n }\n /**\n * Returns the inverse of the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#84\n * @returns a new quaternion\n */\n invert() {\n const e = this.conjugate(), t = this.lengthSquared();\n return t == 0 || t == 1 || e.scaleInPlace(1 / t), e;\n }\n /**\n * Invert in place the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#85\n * @returns this quaternion\n */\n invertInPlace() {\n this.conjugateInPlace();\n const e = this.lengthSquared();\n return e == 0 || e == 1 ? this : (this.scaleInPlace(1 / e), this);\n }\n /**\n * Gets squared length of current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#29\n * @returns the quaternion length (float)\n */\n lengthSquared() {\n return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n }\n /**\n * Gets length of current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#28\n * @returns the quaternion length (float)\n */\n length() {\n return Math.sqrt(this.lengthSquared());\n }\n /**\n * Normalize in place the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#54\n * @returns the current updated quaternion\n */\n normalize() {\n return this.normalizeFromLength(this.length());\n }\n /**\n * Normalize the current quaternion with the given input length.\n * Please note that this is an in place operation.\n * @param len the length of the quaternion\n * @returns the current updated Quaternion\n */\n normalizeFromLength(e) {\n return e === 0 || e === 1 ? this : this.scaleInPlace(1 / e);\n }\n /**\n * Normalize a copy of the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#55\n * @returns the normalized quaternion\n */\n normalizeToNew() {\n const e = new this.constructor(0, 0, 0, 1);\n return this.normalizeToRef(e), e;\n }\n /**\n * Normalize the current Quaternion to the reference\n * @param reference define the Quaternion to update\n * @returns the updated Quaternion\n */\n normalizeToRef(e) {\n const t = this.length();\n return t === 0 || t === 1 ? e.copyFromFloats(this._x, this._y, this._z, this._w) : this.scaleToRef(1 / t, e);\n }\n /**\n * Returns a new Vector3 set with the Euler angles translated from the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#32\n * @returns a new Vector3 containing the Euler angles\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/rotation_conventions\n */\n toEulerAngles() {\n const e = _.Zero();\n return this.toEulerAnglesToRef(e), e;\n }\n /**\n * Sets the given vector3 \"result\" with the Euler angles translated from the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#31\n * @param result defines the vector which will be filled with the Euler angles\n * @returns result input\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/rotation_conventions\n */\n toEulerAnglesToRef(e) {\n const t = this._z, i = this._x, r = this._y, s = this._w, a = r * t - i * s, o = 0.4999999;\n if (a < -o)\n e._y = 2 * Math.atan2(r, s), e._x = Math.PI / 2, e._z = 0, e._isDirty = !0;\n else if (a > o)\n e._y = 2 * Math.atan2(r, s), e._x = -Math.PI / 2, e._z = 0, e._isDirty = !0;\n else {\n const l = s * s, c = t * t, h = i * i, u = r * r;\n e._z = Math.atan2(2 * (i * r + t * s), -c - h + u + l), e._x = Math.asin(-2 * a), e._y = Math.atan2(2 * (t * i + r * s), c - h - u + l), e._isDirty = !0;\n }\n return e;\n }\n /**\n * Updates the given rotation matrix with the current quaternion values\n * Example Playground https://playground.babylonjs.com/#L49EJ7#67\n * @param result defines the target matrix\n * @returns the updated matrix with the rotation\n */\n toRotationMatrix(e) {\n return w.FromQuaternionToRef(this, e), e;\n }\n /**\n * Updates the current quaternion from the given rotation matrix values\n * Example Playground https://playground.babylonjs.com/#L49EJ7#41\n * @param matrix defines the source matrix\n * @returns the current updated quaternion\n */\n fromRotationMatrix(e) {\n return Ce.FromRotationMatrixToRef(e, this), this;\n }\n /**\n * Returns the dot product (float) between the current quaternions and \"other\"\n * @param other defines the right operand\n * @returns the dot product\n */\n dot(e) {\n return this._x * e._x + this._y * e._y + this._z * e._z + this._w * e._w;\n }\n // Statics\n /**\n * Creates a new quaternion from a rotation matrix\n * Example Playground https://playground.babylonjs.com/#L49EJ7#101\n * @param matrix defines the source matrix\n * @returns a new quaternion created from the given rotation matrix values\n */\n static FromRotationMatrix(e) {\n const t = new Ce();\n return Ce.FromRotationMatrixToRef(e, t), t;\n }\n /**\n * Updates the given quaternion with the given rotation matrix values\n * Example Playground https://playground.babylonjs.com/#L49EJ7#102\n * @param matrix defines the source matrix\n * @param result defines the target quaternion\n * @returns result input\n */\n static FromRotationMatrixToRef(e, t) {\n const i = e.m, r = i[0], s = i[4], a = i[8], o = i[1], l = i[5], c = i[9], h = i[2], u = i[6], f = i[10], d = r + l + f;\n let p;\n return d > 0 ? (p = 0.5 / Math.sqrt(d + 1), t._w = 0.25 / p, t._x = (u - c) * p, t._y = (a - h) * p, t._z = (o - s) * p, t._isDirty = !0) : r > l && r > f ? (p = 2 * Math.sqrt(1 + r - l - f), t._w = (u - c) / p, t._x = 0.25 * p, t._y = (s + o) / p, t._z = (a + h) / p, t._isDirty = !0) : l > f ? (p = 2 * Math.sqrt(1 + l - r - f), t._w = (a - h) / p, t._x = (s + o) / p, t._y = 0.25 * p, t._z = (c + u) / p, t._isDirty = !0) : (p = 2 * Math.sqrt(1 + f - r - l), t._w = (o - s) / p, t._x = (a + h) / p, t._y = (c + u) / p, t._z = 0.25 * p, t._isDirty = !0), t;\n }\n /**\n * Returns the dot product (float) between the quaternions \"left\" and \"right\"\n * Example Playground https://playground.babylonjs.com/#L49EJ7#61\n * @param left defines the left operand\n * @param right defines the right operand\n * @returns the dot product\n */\n static Dot(e, t) {\n return e._x * t._x + e._y * t._y + e._z * t._z + e._w * t._w;\n }\n /**\n * Checks if the orientations of two rotation quaternions are close to each other\n * Example Playground https://playground.babylonjs.com/#L49EJ7#60\n * @param quat0 defines the first quaternion to check\n * @param quat1 defines the second quaternion to check\n * @param epsilon defines closeness, 0 same orientation, 1 PI apart, default 0.1\n * @returns true if the two quaternions are close to each other within epsilon\n */\n static AreClose(e, t, i = 0.1) {\n const r = Ce.Dot(e, t);\n return 1 - r * r <= i;\n }\n /**\n * Smooth interpolation between two quaternions using Slerp\n * Example Playground https://playground.babylonjs.com/#L49EJ7#93\n * @param source source quaternion\n * @param goal goal quaternion\n * @param deltaTime current interpolation frame\n * @param lerpTime total interpolation time\n * @param result the smoothed quaternion\n * @returns the smoothed quaternion\n */\n static SmoothToRef(e, t, i, r, s) {\n let a = r === 0 ? 1 : i / r;\n return a = ii(a, 0, 1), Ce.SlerpToRef(e, t, a, s), s;\n }\n /**\n * Creates an empty quaternion\n * @returns a new quaternion set to (0.0, 0.0, 0.0)\n */\n static Zero() {\n return new Ce(0, 0, 0, 0);\n }\n /**\n * Inverse a given quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#103\n * @param q defines the source quaternion\n * @returns a new quaternion as the inverted current quaternion\n */\n static Inverse(e) {\n return new e.constructor(-e._x, -e._y, -e._z, e._w);\n }\n /**\n * Inverse a given quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#104\n * @param q defines the source quaternion\n * @param result the quaternion the result will be stored in\n * @returns the result quaternion\n */\n static InverseToRef(e, t) {\n return t.set(-e._x, -e._y, -e._z, e._w), t;\n }\n /**\n * Creates an identity quaternion\n * @returns the identity quaternion\n */\n static Identity() {\n return new Ce(0, 0, 0, 1);\n }\n /**\n * Gets a boolean indicating if the given quaternion is identity\n * @param quaternion defines the quaternion to check\n * @returns true if the quaternion is identity\n */\n static IsIdentity(e) {\n return e && e._x === 0 && e._y === 0 && e._z === 0 && e._w === 1;\n }\n /**\n * Creates a quaternion from a rotation around an axis\n * Example Playground https://playground.babylonjs.com/#L49EJ7#72\n * @param axis defines the axis to use\n * @param angle defines the angle to use\n * @returns a new quaternion created from the given axis (Vector3) and angle in radians (float)\n */\n static RotationAxis(e, t) {\n return Ce.RotationAxisToRef(e, t, new Ce());\n }\n /**\n * Creates a rotation around an axis and stores it into the given quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#73\n * @param axis defines the axis to use\n * @param angle defines the angle to use\n * @param result defines the target quaternion\n * @returns the target quaternion\n */\n static RotationAxisToRef(e, t, i) {\n const r = Math.sin(t / 2);\n return e.normalize(), i._w = Math.cos(t / 2), i._x = e._x * r, i._y = e._y * r, i._z = e._z * r, i._isDirty = !0, i;\n }\n /**\n * Creates a new quaternion from data stored into an array\n * Example Playground https://playground.babylonjs.com/#L49EJ7#63\n * @param array defines the data source\n * @param offset defines the offset in the source array where the data starts\n * @returns a new quaternion\n */\n static FromArray(e, t) {\n return t || (t = 0), new Ce(e[t], e[t + 1], e[t + 2], e[t + 3]);\n }\n /**\n * Updates the given quaternion \"result\" from the starting index of the given array.\n * Example Playground https://playground.babylonjs.com/#L49EJ7#64\n * @param array the array to pull values from\n * @param offset the offset into the array to start at\n * @param result the quaternion to store the result in\n * @returns result input\n */\n static FromArrayToRef(e, t, i) {\n return i._x = e[t], i._y = e[t + 1], i._z = e[t + 2], i._w = e[t + 3], i._isDirty = !0, i;\n }\n /**\n * Sets the given quaternion \"result\" with the given floats.\n * @param x defines the x coordinate of the source\n * @param y defines the y coordinate of the source\n * @param z defines the z coordinate of the source\n * @param w defines the w coordinate of the source\n * @param result defines the quaternion where to store the result\n * @returns the result quaternion\n */\n static FromFloatsToRef(e, t, i, r, s) {\n return s.copyFromFloats(e, t, i, r), s;\n }\n /**\n * Create a quaternion from Euler rotation angles\n * Example Playground https://playground.babylonjs.com/#L49EJ7#33\n * @param x Pitch\n * @param y Yaw\n * @param z Roll\n * @returns the new Quaternion\n */\n static FromEulerAngles(e, t, i) {\n const r = new Ce();\n return Ce.RotationYawPitchRollToRef(t, e, i, r), r;\n }\n /**\n * Updates a quaternion from Euler rotation angles\n * Example Playground https://playground.babylonjs.com/#L49EJ7#34\n * @param x Pitch\n * @param y Yaw\n * @param z Roll\n * @param result the quaternion to store the result\n * @returns the updated quaternion\n */\n static FromEulerAnglesToRef(e, t, i, r) {\n return Ce.RotationYawPitchRollToRef(t, e, i, r), r;\n }\n /**\n * Create a quaternion from Euler rotation vector\n * Example Playground https://playground.babylonjs.com/#L49EJ7#35\n * @param vec the Euler vector (x Pitch, y Yaw, z Roll)\n * @returns the new Quaternion\n */\n static FromEulerVector(e) {\n const t = new Ce();\n return Ce.RotationYawPitchRollToRef(e._y, e._x, e._z, t), t;\n }\n /**\n * Updates a quaternion from Euler rotation vector\n * Example Playground https://playground.babylonjs.com/#L49EJ7#36\n * @param vec the Euler vector (x Pitch, y Yaw, z Roll)\n * @param result the quaternion to store the result\n * @returns the updated quaternion\n */\n static FromEulerVectorToRef(e, t) {\n return Ce.RotationYawPitchRollToRef(e._y, e._x, e._z, t), t;\n }\n /**\n * Updates a quaternion so that it rotates vector vecFrom to vector vecTo\n * Example Playground - https://playground.babylonjs.com/#L49EJ7#70\n * @param vecFrom defines the direction vector from which to rotate\n * @param vecTo defines the direction vector to which to rotate\n * @param result the quaternion to store the result\n * @param epsilon defines the minimal dot value to define vecs as opposite. Default: `BABYLON.Epsilon`\n * @returns the updated quaternion\n */\n static FromUnitVectorsToRef(e, t, i, r = xt) {\n const s = _.Dot(e, t) + 1;\n return s < r ? Math.abs(e.x) > Math.abs(e.z) ? i.set(-e.y, e.x, 0, 0) : i.set(0, -e.z, e.y, 0) : (_.CrossToRef(e, t, z.Vector3[0]), i.set(z.Vector3[0].x, z.Vector3[0].y, z.Vector3[0].z, s)), i.normalize();\n }\n /**\n * Creates a new quaternion from the given Euler float angles (y, x, z)\n * Example Playground https://playground.babylonjs.com/#L49EJ7#77\n * @param yaw defines the rotation around Y axis\n * @param pitch defines the rotation around X axis\n * @param roll defines the rotation around Z axis\n * @returns the new quaternion\n */\n static RotationYawPitchRoll(e, t, i) {\n const r = new Ce();\n return Ce.RotationYawPitchRollToRef(e, t, i, r), r;\n }\n /**\n * Creates a new rotation from the given Euler float angles (y, x, z) and stores it in the target quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#78\n * @param yaw defines the rotation around Y axis\n * @param pitch defines the rotation around X axis\n * @param roll defines the rotation around Z axis\n * @param result defines the target quaternion\n * @returns result input\n */\n static RotationYawPitchRollToRef(e, t, i, r) {\n const s = i * 0.5, a = t * 0.5, o = e * 0.5, l = Math.sin(s), c = Math.cos(s), h = Math.sin(a), u = Math.cos(a), f = Math.sin(o), d = Math.cos(o);\n return r._x = d * h * c + f * u * l, r._y = f * u * c - d * h * l, r._z = d * u * l - f * h * c, r._w = d * u * c + f * h * l, r._isDirty = !0, r;\n }\n /**\n * Creates a new quaternion from the given Euler float angles expressed in z-x-z orientation\n * Example Playground https://playground.babylonjs.com/#L49EJ7#68\n * @param alpha defines the rotation around first axis\n * @param beta defines the rotation around second axis\n * @param gamma defines the rotation around third axis\n * @returns the new quaternion\n */\n static RotationAlphaBetaGamma(e, t, i) {\n const r = new Ce();\n return Ce.RotationAlphaBetaGammaToRef(e, t, i, r), r;\n }\n /**\n * Creates a new quaternion from the given Euler float angles expressed in z-x-z orientation and stores it in the target quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#69\n * @param alpha defines the rotation around first axis\n * @param beta defines the rotation around second axis\n * @param gamma defines the rotation around third axis\n * @param result defines the target quaternion\n * @returns result input\n */\n static RotationAlphaBetaGammaToRef(e, t, i, r) {\n const s = (i + e) * 0.5, a = (i - e) * 0.5, o = t * 0.5;\n return r._x = Math.cos(a) * Math.sin(o), r._y = Math.sin(a) * Math.sin(o), r._z = Math.sin(s) * Math.cos(o), r._w = Math.cos(s) * Math.cos(o), r._isDirty = !0, r;\n }\n /**\n * Creates a new quaternion containing the rotation value to reach the target (axis1, axis2, axis3) orientation as a rotated XYZ system (axis1, axis2 and axis3 are normalized during this operation)\n * Example Playground https://playground.babylonjs.com/#L49EJ7#75\n * @param axis1 defines the first axis\n * @param axis2 defines the second axis\n * @param axis3 defines the third axis\n * @returns the new quaternion\n */\n static RotationQuaternionFromAxis(e, t, i) {\n const r = new Ce(0, 0, 0, 0);\n return Ce.RotationQuaternionFromAxisToRef(e, t, i, r), r;\n }\n /**\n * Creates a rotation value to reach the target (axis1, axis2, axis3) orientation as a rotated XYZ system (axis1, axis2 and axis3 are normalized during this operation) and stores it in the target quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#76\n * @param axis1 defines the first axis\n * @param axis2 defines the second axis\n * @param axis3 defines the third axis\n * @param ref defines the target quaternion\n * @returns result input\n */\n static RotationQuaternionFromAxisToRef(e, t, i, r) {\n const s = be.Matrix[0];\n return w.FromXYZAxesToRef(e.normalize(), t.normalize(), i.normalize(), s), Ce.FromRotationMatrixToRef(s, r), r;\n }\n /**\n * Creates a new rotation value to orient an object to look towards the given forward direction, the up direction being oriented like \"up\".\n * This function works in left handed mode\n * Example Playground https://playground.babylonjs.com/#L49EJ7#96\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @returns A new quaternion oriented toward the specified forward and up.\n */\n static FromLookDirectionLH(e, t) {\n const i = new Ce();\n return Ce.FromLookDirectionLHToRef(e, t, i), i;\n }\n /**\n * Creates a new rotation value to orient an object to look towards the given forward direction with the up direction being oriented like \"up\", and stores it in the target quaternion.\n * This function works in left handed mode\n * Example Playground https://playground.babylonjs.com/#L49EJ7#97\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @param ref defines the target quaternion.\n * @returns result input\n */\n static FromLookDirectionLHToRef(e, t, i) {\n const r = be.Matrix[0];\n return w.LookDirectionLHToRef(e, t, r), Ce.FromRotationMatrixToRef(r, i), i;\n }\n /**\n * Creates a new rotation value to orient an object to look towards the given forward direction, the up direction being oriented like \"up\".\n * This function works in right handed mode\n * Example Playground https://playground.babylonjs.com/#L49EJ7#98\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @returns A new quaternion oriented toward the specified forward and up.\n */\n static FromLookDirectionRH(e, t) {\n const i = new Ce();\n return Ce.FromLookDirectionRHToRef(e, t, i), i;\n }\n /**\n * Creates a new rotation value to orient an object to look towards the given forward direction with the up direction being oriented like \"up\", and stores it in the target quaternion.\n * This function works in right handed mode\n * Example Playground https://playground.babylonjs.com/#L49EJ7#105\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @param ref defines the target quaternion.\n * @returns result input\n */\n static FromLookDirectionRHToRef(e, t, i) {\n const r = be.Matrix[0];\n return w.LookDirectionRHToRef(e, t, r), Ce.FromRotationMatrixToRef(r, i);\n }\n /**\n * Interpolates between two quaternions\n * Example Playground https://playground.babylonjs.com/#L49EJ7#79\n * @param left defines first quaternion\n * @param right defines second quaternion\n * @param amount defines the gradient to use\n * @returns the new interpolated quaternion\n */\n static Slerp(e, t, i) {\n const r = Ce.Identity();\n return Ce.SlerpToRef(e, t, i, r), r;\n }\n /**\n * Interpolates between two quaternions and stores it into a target quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#92\n * @param left defines first quaternion\n * @param right defines second quaternion\n * @param amount defines the gradient to use\n * @param result defines the target quaternion\n * @returns result input\n */\n static SlerpToRef(e, t, i, r) {\n let s, a, o = e._x * t._x + e._y * t._y + e._z * t._z + e._w * t._w, l = !1;\n if (o < 0 && (l = !0, o = -o), o > 0.999999)\n a = 1 - i, s = l ? -i : i;\n else {\n const c = Math.acos(o), h = 1 / Math.sin(c);\n a = Math.sin((1 - i) * c) * h, s = l ? -Math.sin(i * c) * h : Math.sin(i * c) * h;\n }\n return r._x = a * e._x + s * t._x, r._y = a * e._y + s * t._y, r._z = a * e._z + s * t._z, r._w = a * e._w + s * t._w, r._isDirty = !0, r;\n }\n /**\n * Interpolate between two quaternions using Hermite interpolation\n * Example Playground https://playground.babylonjs.com/#L49EJ7#47\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#hermite-quaternion-spline\n * @param value1 defines first quaternion\n * @param tangent1 defines the incoming tangent\n * @param value2 defines second quaternion\n * @param tangent2 defines the outgoing tangent\n * @param amount defines the target quaternion\n * @returns the new interpolated quaternion\n */\n static Hermite(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 2 * o - 3 * a + 1, c = -2 * o + 3 * a, h = o - 2 * a + s, u = o - a, f = e._x * l + i._x * c + t._x * h + r._x * u, d = e._y * l + i._y * c + t._y * h + r._y * u, p = e._z * l + i._z * c + t._z * h + r._z * u, g = e._w * l + i._w * c + t._w * h + r._w * u;\n return new e.constructor(f, d, p, g);\n }\n /**\n * Returns a new Quaternion which is the 1st derivative of the Hermite spline defined by the quaternions \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * Example Playground https://playground.babylonjs.com/#L49EJ7#48\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @returns 1st derivative\n */\n static Hermite1stDerivative(e, t, i, r, s) {\n const a = new e.constructor();\n return this.Hermite1stDerivativeToRef(e, t, i, r, s, a), a;\n }\n /**\n * Update a Quaternion with the 1st derivative of the Hermite spline defined by the quaternions \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * Example Playground https://playground.babylonjs.com/#L49EJ7#49\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @param result define where to store the derivative\n * @returns result input\n */\n static Hermite1stDerivativeToRef(e, t, i, r, s, a) {\n const o = s * s;\n return a._x = (o - s) * 6 * e._x + (3 * o - 4 * s + 1) * t._x + (-o + s) * 6 * i._x + (3 * o - 2 * s) * r._x, a._y = (o - s) * 6 * e._y + (3 * o - 4 * s + 1) * t._y + (-o + s) * 6 * i._y + (3 * o - 2 * s) * r._y, a._z = (o - s) * 6 * e._z + (3 * o - 4 * s + 1) * t._z + (-o + s) * 6 * i._z + (3 * o - 2 * s) * r._z, a._w = (o - s) * 6 * e._w + (3 * o - 4 * s + 1) * t._w + (-o + s) * 6 * i._w + (3 * o - 2 * s) * r._w, a._isDirty = !0, a;\n }\n /**\n * Returns a new Quaternion as the normalization of the given Quaternion\n * @param quat defines the Quaternion to normalize\n * @returns the new Quaternion\n */\n static Normalize(e) {\n const t = Ce.Zero();\n return Ce.NormalizeToRef(e, t), t;\n }\n /**\n * Sets the given Quaternion \"result\" with the normalization of the given first Quaternion\n * @param quat defines the Quaternion to normalize\n * @param result defines the Quaternion where to store the result\n * @returns result input\n */\n static NormalizeToRef(e, t) {\n return e.normalizeToRef(t), t;\n }\n /**\n * Returns a new Quaternion set with the coordinates of \"value\", if the quaternion \"value\" is in the cube defined by the quaternions \"min\" and \"max\"\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\n * @param value defines the current value\n * @param min defines the lower range value\n * @param max defines the upper range value\n * @returns the new Quaternion\n */\n static Clamp(e, t, i) {\n const r = new e.constructor();\n return Ce.ClampToRef(e, t, i, r), r;\n }\n /**\n * Sets the given quaternion \"result\" with the coordinates of \"value\", if the quaternion \"value\" is in the cube defined by the quaternions \"min\" and \"max\"\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\n * @param value defines the current value\n * @param min defines the lower range value\n * @param max defines the upper range value\n * @param result defines the Quaternion where to store the result\n * @returns result input\n */\n static ClampToRef(e, t, i, r) {\n return r.copyFromFloats(ii(e.x, t.x, i.x), ii(e.y, t.y, i.y), ii(e.z, t.z, i.z), ii(e.w, t.w, i.w));\n }\n /**\n * Returns a new Quaternion with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @returns a Quaternion with random values between min and max\n */\n static Random(e = 0, t = 1) {\n return new Ce(Zt(e, t), Zt(e, t), Zt(e, t), Zt(e, t));\n }\n /**\n * Sets a Quaternion with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @param ref the ref to store the values in\n * @returns the ref with random values between min and max\n */\n static RandomToRef(e = 0, t = 1, i) {\n return i.copyFromFloats(Zt(e, t), Zt(e, t), Zt(e, t), Zt(e, t));\n }\n /**\n * Do not use\n * @internal\n */\n static Minimize() {\n throw new ReferenceError(\"Quaternion.Minimize does not make sense\");\n }\n /**\n * Do not use\n * @internal\n */\n static Maximize() {\n throw new ReferenceError(\"Quaternion.Maximize does not make sense\");\n }\n /**\n * Returns the distance (float) between the quaternions \"value1\" and \"value2\".\n * @param value1 value to calulate the distance between\n * @param value2 value to calulate the distance between\n * @returns the distance between the two quaternions\n */\n static Distance(e, t) {\n return Math.sqrt(Ce.DistanceSquared(e, t));\n }\n /**\n * Returns the squared distance (float) between the quaternions \"value1\" and \"value2\".\n * @param value1 value to calulate the distance between\n * @param value2 value to calulate the distance between\n * @returns the distance between the two quaternions squared\n */\n static DistanceSquared(e, t) {\n const i = e.x - t.x, r = e.y - t.y, s = e.z - t.z, a = e.w - t.w;\n return i * i + r * r + s * s + a * a;\n }\n /**\n * Returns a new Quaternion located at the center between the quaternions \"value1\" and \"value2\".\n * @param value1 value to calulate the center between\n * @param value2 value to calulate the center between\n * @returns the center between the two quaternions\n */\n static Center(e, t) {\n return Ce.CenterToRef(e, t, Ce.Zero());\n }\n /**\n * Gets the center of the quaternions \"value1\" and \"value2\" and stores the result in the quaternion \"ref\"\n * @param value1 defines first quaternion\n * @param value2 defines second quaternion\n * @param ref defines third quaternion\n * @returns ref\n */\n static CenterToRef(e, t, i) {\n return i.copyFromFloats((e.x + t.x) / 2, (e.y + t.y) / 2, (e.z + t.z) / 2, (e.w + t.w) / 2);\n }\n}\nObject.defineProperties(Ce.prototype, {\n dimension: { value: [4] },\n rank: { value: 1 }\n});\nclass w {\n /**\n * Gets the precision of matrix computations\n */\n static get Use64Bits() {\n return gi.MatrixUse64Bits;\n }\n /**\n * Gets the internal data of the matrix\n */\n get m() {\n return this._m;\n }\n /**\n * Update the updateFlag to indicate that the matrix has been updated\n */\n markAsUpdated() {\n this.updateFlag = w._UpdateFlagSeed++, this._isIdentity = !1, this._isIdentity3x2 = !1, this._isIdentityDirty = !0, this._isIdentity3x2Dirty = !0;\n }\n _updateIdentityStatus(e, t = !1, i = !1, r = !0) {\n this._isIdentity = e, this._isIdentity3x2 = e || i, this._isIdentityDirty = this._isIdentity ? !1 : t, this._isIdentity3x2Dirty = this._isIdentity3x2 ? !1 : r;\n }\n /**\n * Creates an empty matrix (filled with zeros)\n */\n constructor() {\n this._isIdentity = !1, this._isIdentityDirty = !0, this._isIdentity3x2 = !0, this._isIdentity3x2Dirty = !0, this.updateFlag = -1, gi.MatrixTrackPrecisionChange && gi.MatrixTrackedMatrices.push(this), this._m = new gi.MatrixCurrentType(16), this.markAsUpdated();\n }\n // Properties\n /**\n * Check if the current matrix is identity\n * @returns true is the matrix is the identity matrix\n */\n isIdentity() {\n if (this._isIdentityDirty) {\n this._isIdentityDirty = !1;\n const e = this._m;\n this._isIdentity = e[0] === 1 && e[1] === 0 && e[2] === 0 && e[3] === 0 && e[4] === 0 && e[5] === 1 && e[6] === 0 && e[7] === 0 && e[8] === 0 && e[9] === 0 && e[10] === 1 && e[11] === 0 && e[12] === 0 && e[13] === 0 && e[14] === 0 && e[15] === 1;\n }\n return this._isIdentity;\n }\n /**\n * Check if the current matrix is identity as a texture matrix (3x2 store in 4x4)\n * @returns true is the matrix is the identity matrix\n */\n isIdentityAs3x2() {\n return this._isIdentity3x2Dirty && (this._isIdentity3x2Dirty = !1, this._m[0] !== 1 || this._m[5] !== 1 || this._m[15] !== 1 ? this._isIdentity3x2 = !1 : this._m[1] !== 0 || this._m[2] !== 0 || this._m[3] !== 0 || this._m[4] !== 0 || this._m[6] !== 0 || this._m[7] !== 0 || this._m[8] !== 0 || this._m[9] !== 0 || this._m[10] !== 0 || this._m[11] !== 0 || this._m[12] !== 0 || this._m[13] !== 0 || this._m[14] !== 0 ? this._isIdentity3x2 = !1 : this._isIdentity3x2 = !0), this._isIdentity3x2;\n }\n /**\n * Gets the determinant of the matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#34\n * @returns the matrix determinant\n */\n determinant() {\n if (this._isIdentity === !0)\n return 1;\n const e = this._m, t = e[0], i = e[1], r = e[2], s = e[3], a = e[4], o = e[5], l = e[6], c = e[7], h = e[8], u = e[9], f = e[10], d = e[11], p = e[12], g = e[13], m = e[14], v = e[15], E = f * v - m * d, C = u * v - g * d, T = u * m - g * f, R = h * v - p * d, x = h * m - f * p, S = h * g - p * u, M = +(o * E - l * C + c * T), N = -(a * E - l * R + c * x), F = +(a * C - o * R + c * S), L = -(a * T - o * x + l * S);\n return t * M + i * N + r * F + s * L;\n }\n // Methods\n /**\n * Gets a string with the Matrix values\n * @returns a string with the Matrix values\n */\n toString() {\n return `{${this.m[0]}, ${this.m[1]}, ${this.m[2]}, ${this.m[3]}\n${this.m[4]}, ${this.m[5]}, ${this.m[6]}, ${this.m[7]}\n${this.m[8]}, ${this.m[9]}, ${this.m[10]}, ${this.m[11]}\n${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`;\n }\n toArray(e = null, t = 0) {\n if (!e)\n return this._m;\n const i = this._m;\n for (let r = 0; r < 16; r++)\n e[t + r] = i[r];\n return this;\n }\n /**\n * Returns the matrix as a Float32Array or Array\n * Example Playground - https://playground.babylonjs.com/#AV9X17#114\n * @returns the matrix underlying array.\n */\n asArray() {\n return this._m;\n }\n fromArray(e, t = 0) {\n return w.FromArrayToRef(e, t, this);\n }\n copyFromFloats(...e) {\n return w.FromArrayToRef(e, 0, this);\n }\n set(...e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] = e[i];\n return this.markAsUpdated(), this;\n }\n setAll(e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] = e;\n return this.markAsUpdated(), this;\n }\n /**\n * Inverts the current matrix in place\n * Example Playground - https://playground.babylonjs.com/#AV9X17#118\n * @returns the current inverted matrix\n */\n invert() {\n return this.invertToRef(this), this;\n }\n /**\n * Sets all the matrix elements to zero\n * @returns the current matrix\n */\n reset() {\n return w.FromValuesToRef(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, this), this._updateIdentityStatus(!1), this;\n }\n /**\n * Adds the current matrix with a second one\n * Example Playground - https://playground.babylonjs.com/#AV9X17#44\n * @param other defines the matrix to add\n * @returns a new matrix as the addition of the current matrix and the given one\n */\n add(e) {\n const t = new this.constructor();\n return this.addToRef(e, t), t;\n }\n /**\n * Sets the given matrix \"result\" to the addition of the current matrix and the given one\n * Example Playground - https://playground.babylonjs.com/#AV9X17#45\n * @param other defines the matrix to add\n * @param result defines the target matrix\n * @returns result input\n */\n addToRef(e, t) {\n const i = this._m, r = t._m, s = e.m;\n for (let a = 0; a < 16; a++)\n r[a] = i[a] + s[a];\n return t.markAsUpdated(), t;\n }\n /**\n * Adds in place the given matrix to the current matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#46\n * @param other defines the second operand\n * @returns the current updated matrix\n */\n addToSelf(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] += i[r];\n return this.markAsUpdated(), this;\n }\n addInPlace(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] += i[r];\n return this.markAsUpdated(), this;\n }\n addInPlaceFromFloats(...e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] += e[i];\n return this.markAsUpdated(), this;\n }\n subtract(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] -= i[r];\n return this.markAsUpdated(), this;\n }\n subtractToRef(e, t) {\n const i = this._m, r = e.m, s = t._m;\n for (let a = 0; a < 16; a++)\n s[a] = i[a] - r[a];\n return t.markAsUpdated(), t;\n }\n subtractInPlace(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] -= i[r];\n return this.markAsUpdated(), this;\n }\n subtractFromFloats(...e) {\n return this.subtractFromFloatsToRef(...e, new this.constructor());\n }\n subtractFromFloatsToRef(...e) {\n const t = e.pop(), i = this._m, r = t._m, s = e;\n for (let a = 0; a < 16; a++)\n r[a] = i[a] - s[a];\n return t.markAsUpdated(), t;\n }\n /**\n * Sets the given matrix to the current inverted Matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#119\n * @param other defines the target matrix\n * @returns result input\n */\n invertToRef(e) {\n if (this._isIdentity === !0)\n return w.IdentityToRef(e), e;\n const t = this._m, i = t[0], r = t[1], s = t[2], a = t[3], o = t[4], l = t[5], c = t[6], h = t[7], u = t[8], f = t[9], d = t[10], p = t[11], g = t[12], m = t[13], v = t[14], E = t[15], C = d * E - v * p, T = f * E - m * p, R = f * v - m * d, x = u * E - g * p, S = u * v - d * g, M = u * m - g * f, N = +(l * C - c * T + h * R), F = -(o * C - c * x + h * S), L = +(o * T - l * x + h * M), K = -(o * R - l * S + c * M), q = i * N + r * F + s * L + a * K;\n if (q === 0)\n return e.copyFrom(this), e;\n const j = 1 / q, k = c * E - v * h, Q = l * E - m * h, ce = l * v - m * c, de = o * E - g * h, Z = o * v - g * c, J = o * m - g * l, O = c * p - d * h, G = l * p - f * h, ee = l * d - f * c, _e = o * p - u * h, Oe = o * d - u * c, ze = o * f - u * l, fe = -(r * C - s * T + a * R), Te = +(i * C - s * x + a * S), Fe = -(i * T - r * x + a * M), Se = +(i * R - r * S + s * M), qe = +(r * k - s * Q + a * ce), ue = -(i * k - s * de + a * Z), Ye = +(i * Q - r * de + a * J), lt = -(i * ce - r * Z + s * J), Ut = -(r * O - s * G + a * ee), Ct = +(i * O - s * _e + a * Oe), Bi = -(i * G - r * _e + a * ze), hi = +(i * ee - r * Oe + s * ze);\n return w.FromValuesToRef(N * j, fe * j, qe * j, Ut * j, F * j, Te * j, ue * j, Ct * j, L * j, Fe * j, Ye * j, Bi * j, K * j, Se * j, lt * j, hi * j, e), e;\n }\n /**\n * add a value at the specified position in the current Matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#47\n * @param index the index of the value within the matrix. between 0 and 15.\n * @param value the value to be added\n * @returns the current updated matrix\n */\n addAtIndex(e, t) {\n return this._m[e] += t, this.markAsUpdated(), this;\n }\n /**\n * mutiply the specified position in the current Matrix by a value\n * @param index the index of the value within the matrix. between 0 and 15.\n * @param value the value to be added\n * @returns the current updated matrix\n */\n multiplyAtIndex(e, t) {\n return this._m[e] *= t, this.markAsUpdated(), this;\n }\n /**\n * Inserts the translation vector (using 3 floats) in the current matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#120\n * @param x defines the 1st component of the translation\n * @param y defines the 2nd component of the translation\n * @param z defines the 3rd component of the translation\n * @returns the current updated matrix\n */\n setTranslationFromFloats(e, t, i) {\n return this._m[12] = e, this._m[13] = t, this._m[14] = i, this.markAsUpdated(), this;\n }\n /**\n * Adds the translation vector (using 3 floats) in the current matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#20\n * Example Playground - https://playground.babylonjs.com/#AV9X17#48\n * @param x defines the 1st component of the translation\n * @param y defines the 2nd component of the translation\n * @param z defines the 3rd component of the translation\n * @returns the current updated matrix\n */\n addTranslationFromFloats(e, t, i) {\n return this._m[12] += e, this._m[13] += t, this._m[14] += i, this.markAsUpdated(), this;\n }\n /**\n * Inserts the translation vector in the current matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#121\n * @param vector3 defines the translation to insert\n * @returns the current updated matrix\n */\n setTranslation(e) {\n return this.setTranslationFromFloats(e._x, e._y, e._z);\n }\n /**\n * Gets the translation value of the current matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#122\n * @returns a new Vector3 as the extracted translation from the matrix\n */\n getTranslation() {\n return new _(this._m[12], this._m[13], this._m[14]);\n }\n /**\n * Fill a Vector3 with the extracted translation from the matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#123\n * @param result defines the Vector3 where to store the translation\n * @returns the current matrix\n */\n getTranslationToRef(e) {\n return e.x = this._m[12], e.y = this._m[13], e.z = this._m[14], e;\n }\n /**\n * Remove rotation and scaling part from the matrix\n * @returns the updated matrix\n */\n removeRotationAndScaling() {\n const e = this.m;\n return w.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, e[12], e[13], e[14], e[15], this), this._updateIdentityStatus(e[12] === 0 && e[13] === 0 && e[14] === 0 && e[15] === 1), this;\n }\n /**\n * Copy the current matrix from the given one\n * Example Playground - https://playground.babylonjs.com/#AV9X17#21\n * @param other defines the source matrix\n * @returns the current updated matrix\n */\n copyFrom(e) {\n e.copyToArray(this._m);\n const t = e;\n return this.updateFlag = t.updateFlag, this._updateIdentityStatus(t._isIdentity, t._isIdentityDirty, t._isIdentity3x2, t._isIdentity3x2Dirty), this;\n }\n /**\n * Populates the given array from the starting index with the current matrix values\n * @param array defines the target array\n * @param offset defines the offset in the target array where to start storing values\n * @returns the current matrix\n */\n copyToArray(e, t = 0) {\n const i = this._m;\n return e[t] = i[0], e[t + 1] = i[1], e[t + 2] = i[2], e[t + 3] = i[3], e[t + 4] = i[4], e[t + 5] = i[5], e[t + 6] = i[6], e[t + 7] = i[7], e[t + 8] = i[8], e[t + 9] = i[9], e[t + 10] = i[10], e[t + 11] = i[11], e[t + 12] = i[12], e[t + 13] = i[13], e[t + 14] = i[14], e[t + 15] = i[15], this;\n }\n /**\n * Multiply two matrices\n * Example Playground - https://playground.babylonjs.com/#AV9X17#15\n * A.multiply(B) means apply B to A so result is B x A\n * @param other defines the second operand\n * @returns a new matrix set with the multiplication result of the current Matrix and the given one\n */\n multiply(e) {\n const t = new this.constructor();\n return this.multiplyToRef(e, t), t;\n }\n multiplyInPlace(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] *= i[r];\n return this.markAsUpdated(), this;\n }\n multiplyByFloats(...e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] = e[i];\n return this.markAsUpdated(), this;\n }\n /**\n * Multiples the current matrix by the given floats and stores them in the given ref\n * @param args The floats and ref\n * @returns The updated ref\n */\n multiplyByFloatsToRef(...e) {\n const t = e.pop(), i = this._m, r = t._m, s = e;\n for (let a = 0; a < 16; a++)\n r[a] = i[a] * s[a];\n return t.markAsUpdated(), t;\n }\n /**\n * Sets the given matrix \"result\" with the multiplication result of the current Matrix and the given one\n * A.multiplyToRef(B, R) means apply B to A and store in R and R = B x A\n * Example Playground - https://playground.babylonjs.com/#AV9X17#16\n * @param other defines the second operand\n * @param result defines the matrix where to store the multiplication\n * @returns result input\n */\n multiplyToRef(e, t) {\n return this._isIdentity ? (t.copyFrom(e), t) : e._isIdentity ? (t.copyFrom(this), t) : (this.multiplyToArray(e, t._m, 0), t.markAsUpdated(), t);\n }\n /**\n * Sets the Float32Array \"result\" from the given index \"offset\" with the multiplication of the current matrix and the given one\n * @param other defines the second operand\n * @param result defines the array where to store the multiplication\n * @param offset defines the offset in the target array where to start storing values\n * @returns the current matrix\n */\n multiplyToArray(e, t, i) {\n const r = this._m, s = e.m, a = r[0], o = r[1], l = r[2], c = r[3], h = r[4], u = r[5], f = r[6], d = r[7], p = r[8], g = r[9], m = r[10], v = r[11], E = r[12], C = r[13], T = r[14], R = r[15], x = s[0], S = s[1], M = s[2], N = s[3], F = s[4], L = s[5], K = s[6], q = s[7], j = s[8], k = s[9], Q = s[10], ce = s[11], de = s[12], Z = s[13], J = s[14], O = s[15];\n return t[i] = a * x + o * F + l * j + c * de, t[i + 1] = a * S + o * L + l * k + c * Z, t[i + 2] = a * M + o * K + l * Q + c * J, t[i + 3] = a * N + o * q + l * ce + c * O, t[i + 4] = h * x + u * F + f * j + d * de, t[i + 5] = h * S + u * L + f * k + d * Z, t[i + 6] = h * M + u * K + f * Q + d * J, t[i + 7] = h * N + u * q + f * ce + d * O, t[i + 8] = p * x + g * F + m * j + v * de, t[i + 9] = p * S + g * L + m * k + v * Z, t[i + 10] = p * M + g * K + m * Q + v * J, t[i + 11] = p * N + g * q + m * ce + v * O, t[i + 12] = E * x + C * F + T * j + R * de, t[i + 13] = E * S + C * L + T * k + R * Z, t[i + 14] = E * M + C * K + T * Q + R * J, t[i + 15] = E * N + C * q + T * ce + R * O, this;\n }\n divide(e) {\n return this.divideToRef(e, new this.constructor());\n }\n divideToRef(e, t) {\n const i = this._m, r = e.m, s = t._m;\n for (let a = 0; a < 16; a++)\n s[a] = i[a] / r[a];\n return t.markAsUpdated(), t;\n }\n divideInPlace(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] /= i[r];\n return this.markAsUpdated(), this;\n }\n minimizeInPlace(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] = Math.min(t[r], i[r]);\n return this.markAsUpdated(), this;\n }\n minimizeInPlaceFromFloats(...e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] = Math.min(t[i], e[i]);\n return this.markAsUpdated(), this;\n }\n maximizeInPlace(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] = Math.min(t[r], i[r]);\n return this.markAsUpdated(), this;\n }\n maximizeInPlaceFromFloats(...e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] = Math.min(t[i], e[i]);\n return this.markAsUpdated(), this;\n }\n negate() {\n return this.negateToRef(new this.constructor());\n }\n negateInPlace() {\n const e = this._m;\n for (let t = 0; t < 16; t++)\n e[t] = -e[t];\n return this.markAsUpdated(), this;\n }\n negateToRef(e) {\n const t = this._m, i = e._m;\n for (let r = 0; r < 16; r++)\n i[r] = -t[r];\n return e.markAsUpdated(), e;\n }\n /**\n * Check equality between this matrix and a second one\n * @param value defines the second matrix to compare\n * @returns true is the current matrix and the given one values are strictly equal\n */\n equals(e) {\n const t = e;\n if (!t)\n return !1;\n if ((this._isIdentity || t._isIdentity) && !this._isIdentityDirty && !t._isIdentityDirty)\n return this._isIdentity && t._isIdentity;\n const i = this.m, r = t.m;\n return i[0] === r[0] && i[1] === r[1] && i[2] === r[2] && i[3] === r[3] && i[4] === r[4] && i[5] === r[5] && i[6] === r[6] && i[7] === r[7] && i[8] === r[8] && i[9] === r[9] && i[10] === r[10] && i[11] === r[11] && i[12] === r[12] && i[13] === r[13] && i[14] === r[14] && i[15] === r[15];\n }\n equalsWithEpsilon(e, t = 0) {\n const i = this._m, r = e.m;\n for (let s = 0; s < 16; s++)\n if (!Ii(i[s], r[s], t))\n return !1;\n return !0;\n }\n equalsToFloats(...e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n if (t[i] != e[i])\n return !1;\n return !0;\n }\n floor() {\n return this.floorToRef(new this.constructor());\n }\n floorToRef(e) {\n const t = this._m, i = e._m;\n for (let r = 0; r < 16; r++)\n i[r] = Math.floor(t[r]);\n return e.markAsUpdated(), e;\n }\n fract() {\n return this.fractToRef(new this.constructor());\n }\n fractToRef(e) {\n const t = this._m, i = e._m;\n for (let r = 0; r < 16; r++)\n i[r] = t[r] - Math.floor(t[r]);\n return e.markAsUpdated(), e;\n }\n /**\n * Clone the current matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#18\n * @returns a new matrix from the current matrix\n */\n clone() {\n const e = new this.constructor();\n return e.copyFrom(this), e;\n }\n /**\n * Returns the name of the current matrix class\n * @returns the string \"Matrix\"\n */\n getClassName() {\n return \"Matrix\";\n }\n /**\n * Gets the hash code of the current matrix\n * @returns the hash code\n */\n getHashCode() {\n let e = nr(this._m[0]);\n for (let t = 1; t < 16; t++)\n e = e * 397 ^ nr(this._m[t]);\n return e;\n }\n /**\n * Decomposes the current Matrix into a translation, rotation and scaling components of the provided node\n * Example Playground - https://playground.babylonjs.com/#AV9X17#13\n * @param node the node to decompose the matrix to\n * @returns true if operation was successful\n */\n decomposeToTransformNode(e) {\n return e.rotationQuaternion = e.rotationQuaternion || new Ce(), this.decompose(e.scaling, e.rotationQuaternion, e.position);\n }\n /**\n * Decomposes the current Matrix into a translation, rotation and scaling components\n * Example Playground - https://playground.babylonjs.com/#AV9X17#12\n * @param scale defines the scale vector3 given as a reference to update\n * @param rotation defines the rotation quaternion given as a reference to update\n * @param translation defines the translation vector3 given as a reference to update\n * @param preserveScalingNode Use scaling sign coming from this node. Otherwise scaling sign might change.\n * @param useAbsoluteScaling Use scaling sign coming from this absoluteScaling when true or scaling otherwise.\n * @returns true if operation was successful\n */\n decompose(e, t, i, r, s = !0) {\n if (this._isIdentity)\n return i && i.setAll(0), e && e.setAll(1), t && t.copyFromFloats(0, 0, 0, 1), !0;\n const a = this._m;\n if (i && i.copyFromFloats(a[12], a[13], a[14]), e = e || be.Vector3[0], e.x = Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]), e.y = Math.sqrt(a[4] * a[4] + a[5] * a[5] + a[6] * a[6]), e.z = Math.sqrt(a[8] * a[8] + a[9] * a[9] + a[10] * a[10]), r) {\n const o = (s ? r.absoluteScaling.x : r.scaling.x) < 0 ? -1 : 1, l = (s ? r.absoluteScaling.y : r.scaling.y) < 0 ? -1 : 1, c = (s ? r.absoluteScaling.z : r.scaling.z) < 0 ? -1 : 1;\n e.x *= o, e.y *= l, e.z *= c;\n } else\n this.determinant() <= 0 && (e.y *= -1);\n if (e._x === 0 || e._y === 0 || e._z === 0)\n return t && t.copyFromFloats(0, 0, 0, 1), !1;\n if (t) {\n const o = 1 / e._x, l = 1 / e._y, c = 1 / e._z;\n w.FromValuesToRef(a[0] * o, a[1] * o, a[2] * o, 0, a[4] * l, a[5] * l, a[6] * l, 0, a[8] * c, a[9] * c, a[10] * c, 0, 0, 0, 0, 1, be.Matrix[0]), Ce.FromRotationMatrixToRef(be.Matrix[0], t);\n }\n return !0;\n }\n /**\n * Gets specific row of the matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\n * @param index defines the number of the row to get\n * @returns the index-th row of the current matrix as a new Vector4\n */\n getRow(e) {\n if (e < 0 || e > 3)\n return null;\n const t = e * 4;\n return new Ke(this._m[t + 0], this._m[t + 1], this._m[t + 2], this._m[t + 3]);\n }\n /**\n * Gets specific row of the matrix to ref\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\n * @param index defines the number of the row to get\n * @param rowVector vector to store the index-th row of the current matrix\n * @returns result input\n */\n getRowToRef(e, t) {\n if (e >= 0 && e <= 3) {\n const i = e * 4;\n t.x = this._m[i + 0], t.y = this._m[i + 1], t.z = this._m[i + 2], t.w = this._m[i + 3];\n }\n return t;\n }\n /**\n * Sets the index-th row of the current matrix to the vector4 values\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\n * @param index defines the number of the row to set\n * @param row defines the target vector4\n * @returns the updated current matrix\n */\n setRow(e, t) {\n return this.setRowFromFloats(e, t.x, t.y, t.z, t.w);\n }\n /**\n * Compute the transpose of the matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#40\n * @returns the new transposed matrix\n */\n transpose() {\n const e = new this.constructor();\n return w.TransposeToRef(this, e), e;\n }\n /**\n * Compute the transpose of the matrix and store it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#41\n * @param result defines the target matrix\n * @returns result input\n */\n transposeToRef(e) {\n return w.TransposeToRef(this, e), e;\n }\n /**\n * Sets the index-th row of the current matrix with the given 4 x float values\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\n * @param index defines the row index\n * @param x defines the x component to set\n * @param y defines the y component to set\n * @param z defines the z component to set\n * @param w defines the w component to set\n * @returns the updated current matrix\n */\n setRowFromFloats(e, t, i, r, s) {\n if (e < 0 || e > 3)\n return this;\n const a = e * 4;\n return this._m[a + 0] = t, this._m[a + 1] = i, this._m[a + 2] = r, this._m[a + 3] = s, this.markAsUpdated(), this;\n }\n /**\n * Compute a new matrix set with the current matrix values multiplied by scale (float)\n * @param scale defines the scale factor\n * @returns a new matrix\n */\n scale(e) {\n const t = new this.constructor();\n return this.scaleToRef(e, t), t;\n }\n /**\n * Scale the current matrix values by a factor to a given result matrix\n * @param scale defines the scale factor\n * @param result defines the matrix to store the result\n * @returns result input\n */\n scaleToRef(e, t) {\n for (let i = 0; i < 16; i++)\n t._m[i] = this._m[i] * e;\n return t.markAsUpdated(), t;\n }\n /**\n * Scale the current matrix values by a factor and add the result to a given matrix\n * @param scale defines the scale factor\n * @param result defines the Matrix to store the result\n * @returns result input\n */\n scaleAndAddToRef(e, t) {\n for (let i = 0; i < 16; i++)\n t._m[i] += this._m[i] * e;\n return t.markAsUpdated(), t;\n }\n scaleInPlace(e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] *= e;\n return this.markAsUpdated(), this;\n }\n /**\n * Writes to the given matrix a normal matrix, computed from this one (using values from identity matrix for fourth row and column).\n * Example Playground - https://playground.babylonjs.com/#AV9X17#17\n * @param ref matrix to store the result\n * @returns the reference matrix\n */\n toNormalMatrix(e) {\n const t = be.Matrix[0];\n this.invertToRef(t), t.transposeToRef(e);\n const i = e._m;\n return w.FromValuesToRef(i[0], i[1], i[2], 0, i[4], i[5], i[6], 0, i[8], i[9], i[10], 0, 0, 0, 0, 1, e), e;\n }\n /**\n * Gets only rotation part of the current matrix\n * @returns a new matrix sets to the extracted rotation matrix from the current one\n */\n getRotationMatrix() {\n const e = new this.constructor();\n return this.getRotationMatrixToRef(e), e;\n }\n /**\n * Extracts the rotation matrix from the current one and sets it as the given \"result\"\n * @param result defines the target matrix to store data to\n * @returns result input\n */\n getRotationMatrixToRef(e) {\n const t = be.Vector3[0];\n if (!this.decompose(t))\n return w.IdentityToRef(e), e;\n const i = this._m, r = 1 / t._x, s = 1 / t._y, a = 1 / t._z;\n return w.FromValuesToRef(i[0] * r, i[1] * r, i[2] * r, 0, i[4] * s, i[5] * s, i[6] * s, 0, i[8] * a, i[9] * a, i[10] * a, 0, 0, 0, 0, 1, e), e;\n }\n /**\n * Toggles model matrix from being right handed to left handed in place and vice versa\n * @returns the current updated matrix\n */\n toggleModelMatrixHandInPlace() {\n const e = this._m;\n return e[2] *= -1, e[6] *= -1, e[8] *= -1, e[9] *= -1, e[14] *= -1, this.markAsUpdated(), this;\n }\n /**\n * Toggles projection matrix from being right handed to left handed in place and vice versa\n * @returns the current updated matrix\n */\n toggleProjectionMatrixHandInPlace() {\n const e = this._m;\n return e[8] *= -1, e[9] *= -1, e[10] *= -1, e[11] *= -1, this.markAsUpdated(), this;\n }\n // Statics\n /**\n * Creates a matrix from an array\n * Example Playground - https://playground.babylonjs.com/#AV9X17#42\n * @param array defines the source array\n * @param offset defines an offset in the source array\n * @returns a new Matrix set from the starting index of the given array\n */\n static FromArray(e, t = 0) {\n const i = new w();\n return w.FromArrayToRef(e, t, i), i;\n }\n /**\n * Copy the content of an array into a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#43\n * @param array defines the source array\n * @param offset defines an offset in the source array\n * @param result defines the target matrix\n * @returns result input\n */\n static FromArrayToRef(e, t, i) {\n for (let r = 0; r < 16; r++)\n i._m[r] = e[r + t];\n return i.markAsUpdated(), i;\n }\n /**\n * Stores an array into a matrix after having multiplied each component by a given factor\n * Example Playground - https://playground.babylonjs.com/#AV9X17#50\n * @param array defines the source array\n * @param offset defines the offset in the source array\n * @param scale defines the scaling factor\n * @param result defines the target matrix\n * @returns result input\n */\n static FromFloat32ArrayToRefScaled(e, t, i, r) {\n for (let s = 0; s < 16; s++)\n r._m[s] = e[s + t] * i;\n return r.markAsUpdated(), r;\n }\n /**\n * Gets an identity matrix that must not be updated\n */\n static get IdentityReadOnly() {\n return w._IdentityReadOnly;\n }\n /**\n * Stores a list of values (16) inside a given matrix\n * @param initialM11 defines 1st value of 1st row\n * @param initialM12 defines 2nd value of 1st row\n * @param initialM13 defines 3rd value of 1st row\n * @param initialM14 defines 4th value of 1st row\n * @param initialM21 defines 1st value of 2nd row\n * @param initialM22 defines 2nd value of 2nd row\n * @param initialM23 defines 3rd value of 2nd row\n * @param initialM24 defines 4th value of 2nd row\n * @param initialM31 defines 1st value of 3rd row\n * @param initialM32 defines 2nd value of 3rd row\n * @param initialM33 defines 3rd value of 3rd row\n * @param initialM34 defines 4th value of 3rd row\n * @param initialM41 defines 1st value of 4th row\n * @param initialM42 defines 2nd value of 4th row\n * @param initialM43 defines 3rd value of 4th row\n * @param initialM44 defines 4th value of 4th row\n * @param result defines the target matrix\n */\n static FromValuesToRef(e, t, i, r, s, a, o, l, c, h, u, f, d, p, g, m, v) {\n const E = v._m;\n E[0] = e, E[1] = t, E[2] = i, E[3] = r, E[4] = s, E[5] = a, E[6] = o, E[7] = l, E[8] = c, E[9] = h, E[10] = u, E[11] = f, E[12] = d, E[13] = p, E[14] = g, E[15] = m, v.markAsUpdated();\n }\n /**\n * Creates new matrix from a list of values (16)\n * @param initialM11 defines 1st value of 1st row\n * @param initialM12 defines 2nd value of 1st row\n * @param initialM13 defines 3rd value of 1st row\n * @param initialM14 defines 4th value of 1st row\n * @param initialM21 defines 1st value of 2nd row\n * @param initialM22 defines 2nd value of 2nd row\n * @param initialM23 defines 3rd value of 2nd row\n * @param initialM24 defines 4th value of 2nd row\n * @param initialM31 defines 1st value of 3rd row\n * @param initialM32 defines 2nd value of 3rd row\n * @param initialM33 defines 3rd value of 3rd row\n * @param initialM34 defines 4th value of 3rd row\n * @param initialM41 defines 1st value of 4th row\n * @param initialM42 defines 2nd value of 4th row\n * @param initialM43 defines 3rd value of 4th row\n * @param initialM44 defines 4th value of 4th row\n * @returns the new matrix\n */\n static FromValues(e, t, i, r, s, a, o, l, c, h, u, f, d, p, g, m) {\n const v = new w(), E = v._m;\n return E[0] = e, E[1] = t, E[2] = i, E[3] = r, E[4] = s, E[5] = a, E[6] = o, E[7] = l, E[8] = c, E[9] = h, E[10] = u, E[11] = f, E[12] = d, E[13] = p, E[14] = g, E[15] = m, v.markAsUpdated(), v;\n }\n /**\n * Creates a new matrix composed by merging scale (vector3), rotation (quaternion) and translation (vector3)\n * Example Playground - https://playground.babylonjs.com/#AV9X17#24\n * @param scale defines the scale vector3\n * @param rotation defines the rotation quaternion\n * @param translation defines the translation vector3\n * @returns a new matrix\n */\n static Compose(e, t, i) {\n const r = new w();\n return w.ComposeToRef(e, t, i, r), r;\n }\n /**\n * Sets a matrix to a value composed by merging scale (vector3), rotation (quaternion) and translation (vector3)\n * Example Playground - https://playground.babylonjs.com/#AV9X17#25\n * @param scale defines the scale vector3\n * @param rotation defines the rotation quaternion\n * @param translation defines the translation vector3\n * @param result defines the target matrix\n * @returns result input\n */\n static ComposeToRef(e, t, i, r) {\n const s = r._m, a = t._x, o = t._y, l = t._z, c = t._w, h = a + a, u = o + o, f = l + l, d = a * h, p = a * u, g = a * f, m = o * u, v = o * f, E = l * f, C = c * h, T = c * u, R = c * f, x = e._x, S = e._y, M = e._z;\n return s[0] = (1 - (m + E)) * x, s[1] = (p + R) * x, s[2] = (g - T) * x, s[3] = 0, s[4] = (p - R) * S, s[5] = (1 - (d + E)) * S, s[6] = (v + C) * S, s[7] = 0, s[8] = (g + T) * M, s[9] = (v - C) * M, s[10] = (1 - (d + m)) * M, s[11] = 0, s[12] = i._x, s[13] = i._y, s[14] = i._z, s[15] = 1, r.markAsUpdated(), r;\n }\n /**\n * Creates a new identity matrix\n * @returns a new identity matrix\n */\n static Identity() {\n const e = w.FromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n return e._updateIdentityStatus(!0), e;\n }\n /**\n * Creates a new identity matrix and stores the result in a given matrix\n * @param result defines the target matrix\n * @returns result input\n */\n static IdentityToRef(e) {\n return w.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, e), e._updateIdentityStatus(!0), e;\n }\n /**\n * Creates a new zero matrix\n * @returns a new zero matrix\n */\n static Zero() {\n const e = w.FromValues(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n return e._updateIdentityStatus(!1), e;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the X axis\n * Example Playground - https://playground.babylonjs.com/#AV9X17#97\n * @param angle defines the angle (in radians) to use\n * @returns the new matrix\n */\n static RotationX(e) {\n const t = new w();\n return w.RotationXToRef(e, t), t;\n }\n /**\n * Creates a new matrix as the invert of a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#124\n * @param source defines the source matrix\n * @returns the new matrix\n */\n static Invert(e) {\n const t = new e.constructor();\n return e.invertToRef(t), t;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the X axis and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#98\n * @param angle defines the angle (in radians) to use\n * @param result defines the target matrix\n * @returns result input\n */\n static RotationXToRef(e, t) {\n const i = Math.sin(e), r = Math.cos(e);\n return w.FromValuesToRef(1, 0, 0, 0, 0, r, i, 0, 0, -i, r, 0, 0, 0, 0, 1, t), t._updateIdentityStatus(r === 1 && i === 0), t;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the Y axis\n * Example Playground - https://playground.babylonjs.com/#AV9X17#99\n * @param angle defines the angle (in radians) to use\n * @returns the new matrix\n */\n static RotationY(e) {\n const t = new w();\n return w.RotationYToRef(e, t), t;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the Y axis and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#100\n * @param angle defines the angle (in radians) to use\n * @param result defines the target matrix\n * @returns result input\n */\n static RotationYToRef(e, t) {\n const i = Math.sin(e), r = Math.cos(e);\n return w.FromValuesToRef(r, 0, -i, 0, 0, 1, 0, 0, i, 0, r, 0, 0, 0, 0, 1, t), t._updateIdentityStatus(r === 1 && i === 0), t;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the Z axis\n * Example Playground - https://playground.babylonjs.com/#AV9X17#101\n * @param angle defines the angle (in radians) to use\n * @returns the new matrix\n */\n static RotationZ(e) {\n const t = new w();\n return w.RotationZToRef(e, t), t;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the Z axis and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#102\n * @param angle defines the angle (in radians) to use\n * @param result defines the target matrix\n * @returns result input\n */\n static RotationZToRef(e, t) {\n const i = Math.sin(e), r = Math.cos(e);\n return w.FromValuesToRef(r, i, 0, 0, -i, r, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, t), t._updateIdentityStatus(r === 1 && i === 0), t;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the given axis\n * Example Playground - https://playground.babylonjs.com/#AV9X17#96\n * @param axis defines the axis to use\n * @param angle defines the angle (in radians) to use\n * @returns the new matrix\n */\n static RotationAxis(e, t) {\n const i = new w();\n return w.RotationAxisToRef(e, t, i), i;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the given axis and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#94\n * @param axis defines the axis to use\n * @param angle defines the angle (in radians) to use\n * @param result defines the target matrix\n * @returns result input\n */\n static RotationAxisToRef(e, t, i) {\n const r = Math.sin(-t), s = Math.cos(-t), a = 1 - s;\n e.normalize();\n const o = i._m;\n return o[0] = e._x * e._x * a + s, o[1] = e._x * e._y * a - e._z * r, o[2] = e._x * e._z * a + e._y * r, o[3] = 0, o[4] = e._y * e._x * a + e._z * r, o[5] = e._y * e._y * a + s, o[6] = e._y * e._z * a - e._x * r, o[7] = 0, o[8] = e._z * e._x * a - e._y * r, o[9] = e._z * e._y * a + e._x * r, o[10] = e._z * e._z * a + s, o[11] = 0, o[12] = 0, o[13] = 0, o[14] = 0, o[15] = 1, i.markAsUpdated(), i;\n }\n /**\n * Takes normalised vectors and returns a rotation matrix to align \"from\" with \"to\".\n * Taken from http://www.iquilezles.org/www/articles/noacos/noacos.htm\n * Example Playground - https://playground.babylonjs.com/#AV9X17#93\n * @param from defines the vector to align\n * @param to defines the vector to align to\n * @param result defines the target matrix\n * @param useYAxisForCoplanar defines a boolean indicating that we should favor Y axis for coplanar vectors (default is false)\n * @returns result input\n */\n static RotationAlignToRef(e, t, i, r = !1) {\n const s = _.Dot(t, e), a = i._m;\n if (s < -1 + xt)\n a[0] = -1, a[1] = 0, a[2] = 0, a[3] = 0, a[4] = 0, a[5] = r ? 1 : -1, a[6] = 0, a[7] = 0, a[8] = 0, a[9] = 0, a[10] = r ? -1 : 1, a[11] = 0;\n else {\n const o = _.Cross(t, e), l = 1 / (1 + s);\n a[0] = o._x * o._x * l + s, a[1] = o._y * o._x * l - o._z, a[2] = o._z * o._x * l + o._y, a[3] = 0, a[4] = o._x * o._y * l + o._z, a[5] = o._y * o._y * l + s, a[6] = o._z * o._y * l - o._x, a[7] = 0, a[8] = o._x * o._z * l - o._y, a[9] = o._y * o._z * l + o._x, a[10] = o._z * o._z * l + s, a[11] = 0;\n }\n return a[12] = 0, a[13] = 0, a[14] = 0, a[15] = 1, i.markAsUpdated(), i;\n }\n /**\n * Creates a rotation matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#103\n * Example Playground - https://playground.babylonjs.com/#AV9X17#105\n * @param yaw defines the yaw angle in radians (Y axis)\n * @param pitch defines the pitch angle in radians (X axis)\n * @param roll defines the roll angle in radians (Z axis)\n * @returns the new rotation matrix\n */\n static RotationYawPitchRoll(e, t, i) {\n const r = new w();\n return w.RotationYawPitchRollToRef(e, t, i, r), r;\n }\n /**\n * Creates a rotation matrix and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#104\n * @param yaw defines the yaw angle in radians (Y axis)\n * @param pitch defines the pitch angle in radians (X axis)\n * @param roll defines the roll angle in radians (Z axis)\n * @param result defines the target matrix\n * @returns result input\n */\n static RotationYawPitchRollToRef(e, t, i, r) {\n return Ce.RotationYawPitchRollToRef(e, t, i, be.Quaternion[0]), be.Quaternion[0].toRotationMatrix(r), r;\n }\n /**\n * Creates a scaling matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#107\n * @param x defines the scale factor on X axis\n * @param y defines the scale factor on Y axis\n * @param z defines the scale factor on Z axis\n * @returns the new matrix\n */\n static Scaling(e, t, i) {\n const r = new w();\n return w.ScalingToRef(e, t, i, r), r;\n }\n /**\n * Creates a scaling matrix and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#108\n * @param x defines the scale factor on X axis\n * @param y defines the scale factor on Y axis\n * @param z defines the scale factor on Z axis\n * @param result defines the target matrix\n * @returns result input\n */\n static ScalingToRef(e, t, i, r) {\n return w.FromValuesToRef(e, 0, 0, 0, 0, t, 0, 0, 0, 0, i, 0, 0, 0, 0, 1, r), r._updateIdentityStatus(e === 1 && t === 1 && i === 1), r;\n }\n /**\n * Creates a translation matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#109\n * @param x defines the translation on X axis\n * @param y defines the translation on Y axis\n * @param z defines the translationon Z axis\n * @returns the new matrix\n */\n static Translation(e, t, i) {\n const r = new w();\n return w.TranslationToRef(e, t, i, r), r;\n }\n /**\n * Creates a translation matrix and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#110\n * @param x defines the translation on X axis\n * @param y defines the translation on Y axis\n * @param z defines the translationon Z axis\n * @param result defines the target matrix\n * @returns result input\n */\n static TranslationToRef(e, t, i, r) {\n return w.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, e, t, i, 1, r), r._updateIdentityStatus(e === 0 && t === 0 && i === 0), r;\n }\n /**\n * Returns a new Matrix whose values are the interpolated values for \"gradient\" (float) between the ones of the matrices \"startValue\" and \"endValue\".\n * Example Playground - https://playground.babylonjs.com/#AV9X17#55\n * @param startValue defines the start value\n * @param endValue defines the end value\n * @param gradient defines the gradient factor\n * @returns the new matrix\n */\n static Lerp(e, t, i) {\n const r = new e.constructor();\n return w.LerpToRef(e, t, i, r), r;\n }\n /**\n * Set the given matrix \"result\" as the interpolated values for \"gradient\" (float) between the ones of the matrices \"startValue\" and \"endValue\".\n * Example Playground - https://playground.babylonjs.com/#AV9X17#54\n * @param startValue defines the start value\n * @param endValue defines the end value\n * @param gradient defines the gradient factor\n * @param result defines the Matrix object where to store data\n * @returns result input\n */\n static LerpToRef(e, t, i, r) {\n const s = r._m, a = e.m, o = t.m;\n for (let l = 0; l < 16; l++)\n s[l] = a[l] * (1 - i) + o[l] * i;\n return r.markAsUpdated(), r;\n }\n /**\n * Builds a new matrix whose values are computed by:\n * * decomposing the \"startValue\" and \"endValue\" matrices into their respective scale, rotation and translation matrices\n * * interpolating for \"gradient\" (float) the values between each of these decomposed matrices between the start and the end\n * * recomposing a new matrix from these 3 interpolated scale, rotation and translation matrices\n * Example Playground - https://playground.babylonjs.com/#AV9X17#22\n * Example Playground - https://playground.babylonjs.com/#AV9X17#51\n * @param startValue defines the first matrix\n * @param endValue defines the second matrix\n * @param gradient defines the gradient between the two matrices\n * @returns the new matrix\n */\n static DecomposeLerp(e, t, i) {\n const r = new e.constructor();\n return w.DecomposeLerpToRef(e, t, i, r), r;\n }\n /**\n * Update a matrix to values which are computed by:\n * * decomposing the \"startValue\" and \"endValue\" matrices into their respective scale, rotation and translation matrices\n * * interpolating for \"gradient\" (float) the values between each of these decomposed matrices between the start and the end\n * * recomposing a new matrix from these 3 interpolated scale, rotation and translation matrices\n * Example Playground - https://playground.babylonjs.com/#AV9X17#23\n * Example Playground - https://playground.babylonjs.com/#AV9X17#53\n * @param startValue defines the first matrix\n * @param endValue defines the second matrix\n * @param gradient defines the gradient between the two matrices\n * @param result defines the target matrix\n * @returns result input\n */\n static DecomposeLerpToRef(e, t, i, r) {\n const s = be.Vector3[0], a = be.Quaternion[0], o = be.Vector3[1];\n e.decompose(s, a, o);\n const l = be.Vector3[2], c = be.Quaternion[1], h = be.Vector3[3];\n t.decompose(l, c, h);\n const u = be.Vector3[4];\n _.LerpToRef(s, l, i, u);\n const f = be.Quaternion[2];\n Ce.SlerpToRef(a, c, i, f);\n const d = be.Vector3[5];\n return _.LerpToRef(o, h, i, d), w.ComposeToRef(u, f, d, r), r;\n }\n /**\n * Creates a new matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\n * This function generates a matrix suitable for a left handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#58\n * Example Playground - https://playground.babylonjs.com/#AV9X17#59\n * @param eye defines the final position of the entity\n * @param target defines where the entity should look at\n * @param up defines the up vector for the entity\n * @returns the new matrix\n */\n static LookAtLH(e, t, i) {\n const r = new w();\n return w.LookAtLHToRef(e, t, i, r), r;\n }\n /**\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\n * This function generates a matrix suitable for a left handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#60\n * Example Playground - https://playground.babylonjs.com/#AV9X17#61\n * @param eye defines the final position of the entity\n * @param target defines where the entity should look at\n * @param up defines the up vector for the entity\n * @param result defines the target matrix\n * @returns result input\n */\n static LookAtLHToRef(e, t, i, r) {\n const s = be.Vector3[0], a = be.Vector3[1], o = be.Vector3[2];\n t.subtractToRef(e, o), o.normalize(), _.CrossToRef(i, o, s);\n const l = s.lengthSquared();\n l === 0 ? s.x = 1 : s.normalizeFromLength(Math.sqrt(l)), _.CrossToRef(o, s, a), a.normalize();\n const c = -_.Dot(s, e), h = -_.Dot(a, e), u = -_.Dot(o, e);\n return w.FromValuesToRef(s._x, a._x, o._x, 0, s._y, a._y, o._y, 0, s._z, a._z, o._z, 0, c, h, u, 1, r), r;\n }\n /**\n * Creates a new matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\n * This function generates a matrix suitable for a right handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#62\n * Example Playground - https://playground.babylonjs.com/#AV9X17#63\n * @param eye defines the final position of the entity\n * @param target defines where the entity should look at\n * @param up defines the up vector for the entity\n * @returns the new matrix\n */\n static LookAtRH(e, t, i) {\n const r = new w();\n return w.LookAtRHToRef(e, t, i, r), r;\n }\n /**\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\n * This function generates a matrix suitable for a right handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#64\n * Example Playground - https://playground.babylonjs.com/#AV9X17#65\n * @param eye defines the final position of the entity\n * @param target defines where the entity should look at\n * @param up defines the up vector for the entity\n * @param result defines the target matrix\n * @returns result input\n */\n static LookAtRHToRef(e, t, i, r) {\n const s = be.Vector3[0], a = be.Vector3[1], o = be.Vector3[2];\n e.subtractToRef(t, o), o.normalize(), _.CrossToRef(i, o, s);\n const l = s.lengthSquared();\n l === 0 ? s.x = 1 : s.normalizeFromLength(Math.sqrt(l)), _.CrossToRef(o, s, a), a.normalize();\n const c = -_.Dot(s, e), h = -_.Dot(a, e), u = -_.Dot(o, e);\n return w.FromValuesToRef(s._x, a._x, o._x, 0, s._y, a._y, o._y, 0, s._z, a._z, o._z, 0, c, h, u, 1, r), r;\n }\n /**\n * Creates a new matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\n * This function generates a matrix suitable for a left handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#66\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @returns the new matrix\n */\n static LookDirectionLH(e, t) {\n const i = new w();\n return w.LookDirectionLHToRef(e, t, i), i;\n }\n /**\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\n * This function generates a matrix suitable for a left handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#67\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @param result defines the target matrix\n * @returns result input\n */\n static LookDirectionLHToRef(e, t, i) {\n const r = be.Vector3[0];\n r.copyFrom(e), r.scaleInPlace(-1);\n const s = be.Vector3[1];\n return _.CrossToRef(t, r, s), w.FromValuesToRef(s._x, s._y, s._z, 0, t._x, t._y, t._z, 0, r._x, r._y, r._z, 0, 0, 0, 0, 1, i), i;\n }\n /**\n * Creates a new matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\n * This function generates a matrix suitable for a right handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#68\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @returns the new matrix\n */\n static LookDirectionRH(e, t) {\n const i = new w();\n return w.LookDirectionRHToRef(e, t, i), i;\n }\n /**\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\n * This function generates a matrix suitable for a right handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#69\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @param result defines the target matrix\n * @returns result input\n */\n static LookDirectionRHToRef(e, t, i) {\n const r = be.Vector3[2];\n return _.CrossToRef(t, e, r), w.FromValuesToRef(r._x, r._y, r._z, 0, t._x, t._y, t._z, 0, e._x, e._y, e._z, 0, 0, 0, 0, 1, i), i;\n }\n /**\n * Create a left-handed orthographic projection matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#70\n * @param width defines the viewport width\n * @param height defines the viewport height\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns a new matrix as a left-handed orthographic projection matrix\n */\n static OrthoLH(e, t, i, r, s) {\n const a = new w();\n return w.OrthoLHToRef(e, t, i, r, a, s), a;\n }\n /**\n * Store a left-handed orthographic projection to a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#71\n * @param width defines the viewport width\n * @param height defines the viewport height\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param result defines the target matrix\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns result input\n */\n static OrthoLHToRef(e, t, i, r, s, a) {\n const o = i, l = r, c = 2 / e, h = 2 / t, u = 2 / (l - o), f = -(l + o) / (l - o);\n return w.FromValuesToRef(c, 0, 0, 0, 0, h, 0, 0, 0, 0, u, 0, 0, 0, f, 1, s), a && s.multiplyToRef(En, s), s._updateIdentityStatus(c === 1 && h === 1 && u === 1 && f === 0), s;\n }\n /**\n * Create a left-handed orthographic projection matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#72\n * @param left defines the viewport left coordinate\n * @param right defines the viewport right coordinate\n * @param bottom defines the viewport bottom coordinate\n * @param top defines the viewport top coordinate\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns a new matrix as a left-handed orthographic projection matrix\n */\n static OrthoOffCenterLH(e, t, i, r, s, a, o) {\n const l = new w();\n return w.OrthoOffCenterLHToRef(e, t, i, r, s, a, l, o), l;\n }\n /**\n * Stores a left-handed orthographic projection into a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#73\n * @param left defines the viewport left coordinate\n * @param right defines the viewport right coordinate\n * @param bottom defines the viewport bottom coordinate\n * @param top defines the viewport top coordinate\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param result defines the target matrix\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns result input\n */\n static OrthoOffCenterLHToRef(e, t, i, r, s, a, o, l) {\n const c = s, h = a, u = 2 / (t - e), f = 2 / (r - i), d = 2 / (h - c), p = -(h + c) / (h - c), g = (e + t) / (e - t), m = (r + i) / (i - r);\n return w.FromValuesToRef(u, 0, 0, 0, 0, f, 0, 0, 0, 0, d, 0, g, m, p, 1, o), l && o.multiplyToRef(En, o), o.markAsUpdated(), o;\n }\n /**\n * Stores a left-handed oblique projection into a given matrix\n * @param left defines the viewport left coordinate\n * @param right defines the viewport right coordinate\n * @param bottom defines the viewport bottom coordinate\n * @param top defines the viewport top coordinate\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param length Length of the shear\n * @param angle Angle (along X/Y Plane) to apply shear\n * @param distance Distance from shear point\n * @param result defines the target matrix\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns result input\n */\n static ObliqueOffCenterLHToRef(e, t, i, r, s, a, o, l, c, h, u) {\n const f = -o * Math.cos(l), d = -o * Math.sin(l);\n return w.TranslationToRef(0, 0, -c, be.Matrix[1]), w.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, f, d, 1, 0, 0, 0, 0, 1, be.Matrix[0]), be.Matrix[1].multiplyToRef(be.Matrix[0], be.Matrix[0]), w.TranslationToRef(0, 0, c, be.Matrix[1]), be.Matrix[0].multiplyToRef(be.Matrix[1], be.Matrix[0]), w.OrthoOffCenterLHToRef(e, t, i, r, s, a, h, u), be.Matrix[0].multiplyToRef(h, h), h;\n }\n /**\n * Creates a right-handed orthographic projection matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#76\n * @param left defines the viewport left coordinate\n * @param right defines the viewport right coordinate\n * @param bottom defines the viewport bottom coordinate\n * @param top defines the viewport top coordinate\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns a new matrix as a right-handed orthographic projection matrix\n */\n static OrthoOffCenterRH(e, t, i, r, s, a, o) {\n const l = new w();\n return w.OrthoOffCenterRHToRef(e, t, i, r, s, a, l, o), l;\n }\n /**\n * Stores a right-handed orthographic projection into a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#77\n * @param left defines the viewport left coordinate\n * @param right defines the viewport right coordinate\n * @param bottom defines the viewport bottom coordinate\n * @param top defines the viewport top coordinate\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param result defines the target matrix\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns result input\n */\n static OrthoOffCenterRHToRef(e, t, i, r, s, a, o, l) {\n return w.OrthoOffCenterLHToRef(e, t, i, r, s, a, o, l), o._m[10] *= -1, o;\n }\n /**\n * Stores a right-handed oblique projection into a given matrix\n * @param left defines the viewport left coordinate\n * @param right defines the viewport right coordinate\n * @param bottom defines the viewport bottom coordinate\n * @param top defines the viewport top coordinate\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param length Length of the shear\n * @param angle Angle (along X/Y Plane) to apply shear\n * @param distance Distance from shear point\n * @param result defines the target matrix\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns result input\n */\n static ObliqueOffCenterRHToRef(e, t, i, r, s, a, o, l, c, h, u) {\n const f = o * Math.cos(l), d = o * Math.sin(l);\n return w.TranslationToRef(0, 0, c, be.Matrix[1]), w.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, f, d, 1, 0, 0, 0, 0, 1, be.Matrix[0]), be.Matrix[1].multiplyToRef(be.Matrix[0], be.Matrix[0]), w.TranslationToRef(0, 0, -c, be.Matrix[1]), be.Matrix[0].multiplyToRef(be.Matrix[1], be.Matrix[0]), w.OrthoOffCenterRHToRef(e, t, i, r, s, a, h, u), be.Matrix[0].multiplyToRef(h, h), h;\n }\n /**\n * Creates a left-handed perspective projection matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#85\n * @param width defines the viewport width\n * @param height defines the viewport height\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @returns a new matrix as a left-handed perspective projection matrix\n */\n static PerspectiveLH(e, t, i, r, s, a = 0) {\n const o = new w(), l = i, c = r, h = 2 * l / e, u = 2 * l / t, f = (c + l) / (c - l), d = -2 * c * l / (c - l), p = Math.tan(a);\n return w.FromValuesToRef(h, 0, 0, 0, 0, u, 0, p, 0, 0, f, 1, 0, 0, d, 0, o), s && o.multiplyToRef(En, o), o._updateIdentityStatus(!1), o;\n }\n /**\n * Creates a left-handed perspective projection matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#78\n * @param fov defines the horizontal field of view\n * @param aspect defines the aspect ratio\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\n * @returns a new matrix as a left-handed perspective projection matrix\n */\n static PerspectiveFovLH(e, t, i, r, s, a = 0, o = !1) {\n const l = new w();\n return w.PerspectiveFovLHToRef(e, t, i, r, l, !0, s, a, o), l;\n }\n /**\n * Stores a left-handed perspective projection into a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#81\n * @param fov defines the horizontal field of view\n * @param aspect defines the aspect ratio\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\n * @param result defines the target matrix\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\n * @returns result input\n */\n static PerspectiveFovLHToRef(e, t, i, r, s, a = !0, o, l = 0, c = !1) {\n const h = i, u = r, f = 1 / Math.tan(e * 0.5), d = a ? f / t : f, p = a ? f : f * t, g = c && h === 0 ? -1 : u !== 0 ? (u + h) / (u - h) : 1, m = c && h === 0 ? 2 * u : u !== 0 ? -2 * u * h / (u - h) : -2 * h, v = Math.tan(l);\n return w.FromValuesToRef(d, 0, 0, 0, 0, p, 0, v, 0, 0, g, 1, 0, 0, m, 0, s), o && s.multiplyToRef(En, s), s._updateIdentityStatus(!1), s;\n }\n /**\n * Stores a left-handed perspective projection into a given matrix with depth reversed\n * Example Playground - https://playground.babylonjs.com/#AV9X17#89\n * @param fov defines the horizontal field of view\n * @param aspect defines the aspect ratio\n * @param znear defines the near clip plane\n * @param zfar not used as infinity is used as far clip\n * @param result defines the target matrix\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @returns result input\n */\n static PerspectiveFovReverseLHToRef(e, t, i, r, s, a = !0, o, l = 0) {\n const c = 1 / Math.tan(e * 0.5), h = a ? c / t : c, u = a ? c : c * t, f = Math.tan(l);\n return w.FromValuesToRef(h, 0, 0, 0, 0, u, 0, f, 0, 0, -i, 1, 0, 0, 1, 0, s), o && s.multiplyToRef(En, s), s._updateIdentityStatus(!1), s;\n }\n /**\n * Creates a right-handed perspective projection matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#83\n * @param fov defines the horizontal field of view\n * @param aspect defines the aspect ratio\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\n * @returns a new matrix as a right-handed perspective projection matrix\n */\n static PerspectiveFovRH(e, t, i, r, s, a = 0, o = !1) {\n const l = new w();\n return w.PerspectiveFovRHToRef(e, t, i, r, l, !0, s, a, o), l;\n }\n /**\n * Stores a right-handed perspective projection into a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#84\n * @param fov defines the horizontal field of view\n * @param aspect defines the aspect ratio\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\n * @param result defines the target matrix\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\n * @returns result input\n */\n static PerspectiveFovRHToRef(e, t, i, r, s, a = !0, o, l = 0, c = !1) {\n const h = i, u = r, f = 1 / Math.tan(e * 0.5), d = a ? f / t : f, p = a ? f : f * t, g = c && h === 0 ? 1 : u !== 0 ? -(u + h) / (u - h) : -1, m = c && h === 0 ? 2 * u : u !== 0 ? -2 * u * h / (u - h) : -2 * h, v = Math.tan(l);\n return w.FromValuesToRef(d, 0, 0, 0, 0, p, 0, v, 0, 0, g, -1, 0, 0, m, 0, s), o && s.multiplyToRef(En, s), s._updateIdentityStatus(!1), s;\n }\n /**\n * Stores a right-handed perspective projection into a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#90\n * @param fov defines the horizontal field of view\n * @param aspect defines the aspect ratio\n * @param znear defines the near clip plane\n * @param zfar not used as infinity is used as far clip\n * @param result defines the target matrix\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @returns result input\n */\n static PerspectiveFovReverseRHToRef(e, t, i, r, s, a = !0, o, l = 0) {\n const c = 1 / Math.tan(e * 0.5), h = a ? c / t : c, u = a ? c : c * t, f = Math.tan(l);\n return w.FromValuesToRef(h, 0, 0, 0, 0, u, 0, f, 0, 0, -i, -1, 0, 0, -1, 0, s), o && s.multiplyToRef(En, s), s._updateIdentityStatus(!1), s;\n }\n /**\n * Computes a complete transformation matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#113\n * @param viewport defines the viewport to use\n * @param world defines the world matrix\n * @param view defines the view matrix\n * @param projection defines the projection matrix\n * @param zmin defines the near clip plane\n * @param zmax defines the far clip plane\n * @returns the transformation matrix\n */\n static GetFinalMatrix(e, t, i, r, s, a) {\n const o = e.width, l = e.height, c = e.x, h = e.y, u = w.FromValues(o / 2, 0, 0, 0, 0, -l / 2, 0, 0, 0, 0, a - s, 0, c + o / 2, l / 2 + h, s, 1), f = new t.constructor();\n return t.multiplyToRef(i, f), f.multiplyToRef(r, f), f.multiplyToRef(u, f);\n }\n /**\n * Extracts a 2x2 matrix from a given matrix and store the result in a Float32Array\n * @param matrix defines the matrix to use\n * @returns a new Float32Array array with 4 elements : the 2x2 matrix extracted from the given matrix\n */\n static GetAsMatrix2x2(e) {\n const t = e.m, i = [t[0], t[1], t[4], t[5]];\n return gi.MatrixUse64Bits ? i : new Float32Array(i);\n }\n /**\n * Extracts a 3x3 matrix from a given matrix and store the result in a Float32Array\n * @param matrix defines the matrix to use\n * @returns a new Float32Array array with 9 elements : the 3x3 matrix extracted from the given matrix\n */\n static GetAsMatrix3x3(e) {\n const t = e.m, i = [t[0], t[1], t[2], t[4], t[5], t[6], t[8], t[9], t[10]];\n return gi.MatrixUse64Bits ? i : new Float32Array(i);\n }\n /**\n * Compute the transpose of a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#111\n * @param matrix defines the matrix to transpose\n * @returns the new matrix\n */\n static Transpose(e) {\n const t = new e.constructor();\n return w.TransposeToRef(e, t), t;\n }\n /**\n * Compute the transpose of a matrix and store it in a target matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#112\n * @param matrix defines the matrix to transpose\n * @param result defines the target matrix\n * @returns result input\n */\n static TransposeToRef(e, t) {\n const i = e.m, r = i[0], s = i[4], a = i[8], o = i[12], l = i[1], c = i[5], h = i[9], u = i[13], f = i[2], d = i[6], p = i[10], g = i[14], m = i[3], v = i[7], E = i[11], C = i[15], T = t._m;\n return T[0] = r, T[1] = s, T[2] = a, T[3] = o, T[4] = l, T[5] = c, T[6] = h, T[7] = u, T[8] = f, T[9] = d, T[10] = p, T[11] = g, T[12] = m, T[13] = v, T[14] = E, T[15] = C, t.markAsUpdated(), t._updateIdentityStatus(e._isIdentity, e._isIdentityDirty), t;\n }\n /**\n * Computes a reflection matrix from a plane\n * Example Playground - https://playground.babylonjs.com/#AV9X17#87\n * @param plane defines the reflection plane\n * @returns a new matrix\n */\n static Reflection(e) {\n const t = new w();\n return w.ReflectionToRef(e, t), t;\n }\n /**\n * Computes a reflection matrix from a plane\n * Example Playground - https://playground.babylonjs.com/#AV9X17#88\n * @param plane defines the reflection plane\n * @param result defines the target matrix\n * @returns result input\n */\n static ReflectionToRef(e, t) {\n e.normalize();\n const i = e.normal.x, r = e.normal.y, s = e.normal.z, a = -2 * i, o = -2 * r, l = -2 * s;\n return w.FromValuesToRef(a * i + 1, o * i, l * i, 0, a * r, o * r + 1, l * r, 0, a * s, o * s, l * s + 1, 0, a * e.d, o * e.d, l * e.d, 1, t), t;\n }\n /**\n * Sets the given matrix as a rotation matrix composed from the 3 left handed axes\n * @param xaxis defines the value of the 1st axis\n * @param yaxis defines the value of the 2nd axis\n * @param zaxis defines the value of the 3rd axis\n * @param result defines the target matrix\n * @returns result input\n */\n static FromXYZAxesToRef(e, t, i, r) {\n return w.FromValuesToRef(e._x, e._y, e._z, 0, t._x, t._y, t._z, 0, i._x, i._y, i._z, 0, 0, 0, 0, 1, r), r;\n }\n /**\n * Creates a rotation matrix from a quaternion and stores it in a target matrix\n * @param quat defines the quaternion to use\n * @param result defines the target matrix\n * @returns result input\n */\n static FromQuaternionToRef(e, t) {\n const i = e._x * e._x, r = e._y * e._y, s = e._z * e._z, a = e._x * e._y, o = e._z * e._w, l = e._z * e._x, c = e._y * e._w, h = e._y * e._z, u = e._x * e._w;\n return t._m[0] = 1 - 2 * (r + s), t._m[1] = 2 * (a + o), t._m[2] = 2 * (l - c), t._m[3] = 0, t._m[4] = 2 * (a - o), t._m[5] = 1 - 2 * (s + i), t._m[6] = 2 * (h + u), t._m[7] = 0, t._m[8] = 2 * (l + c), t._m[9] = 2 * (h - u), t._m[10] = 1 - 2 * (r + i), t._m[11] = 0, t._m[12] = 0, t._m[13] = 0, t._m[14] = 0, t._m[15] = 1, t.markAsUpdated(), t;\n }\n}\nw._UpdateFlagSeed = 0;\nw._IdentityReadOnly = w.Identity();\nObject.defineProperties(w.prototype, {\n dimension: { value: [4, 4] },\n rank: { value: 2 }\n});\nclass be {\n}\nbe.Vector3 = vi.BuildTuple(11, _.Zero);\nbe.Matrix = vi.BuildTuple(2, w.Identity);\nbe.Quaternion = vi.BuildTuple(3, Ce.Zero);\nclass z {\n}\nz.Vector2 = vi.BuildTuple(3, me.Zero);\nz.Vector3 = vi.BuildTuple(13, _.Zero);\nz.Vector4 = vi.BuildTuple(3, Ke.Zero);\nz.Quaternion = vi.BuildTuple(2, Ce.Zero);\nz.Matrix = vi.BuildTuple(8, w.Identity);\nRe(\"BABYLON.Vector2\", me);\nRe(\"BABYLON.Vector3\", _);\nRe(\"BABYLON.Vector4\", Ke);\nRe(\"BABYLON.Matrix\", w);\nconst En = w.FromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 1);\nclass Xo {\n constructor() {\n this.rootNodes = [], this.cameras = [], this.lights = [], this.meshes = [], this.skeletons = [], this.particleSystems = [], this.animations = [], this.animationGroups = [], this.multiMaterials = [], this.materials = [], this.morphTargetManagers = [], this.geometries = [], this.transformNodes = [], this.actionManagers = [], this.textures = [], this._environmentTexture = null, this.postProcesses = [];\n }\n /**\n * Adds a parser in the list of available ones\n * @param name Defines the name of the parser\n * @param parser Defines the parser to add\n */\n static AddParser(e, t) {\n this._BabylonFileParsers[e] = t;\n }\n /**\n * Gets a general parser from the list of available ones\n * @param name Defines the name of the parser\n * @returns the requested parser or null\n */\n static GetParser(e) {\n return this._BabylonFileParsers[e] ? this._BabylonFileParsers[e] : null;\n }\n /**\n * Adds n individual parser in the list of available ones\n * @param name Defines the name of the parser\n * @param parser Defines the parser to add\n */\n static AddIndividualParser(e, t) {\n this._IndividualBabylonFileParsers[e] = t;\n }\n /**\n * Gets an individual parser from the list of available ones\n * @param name Defines the name of the parser\n * @returns the requested parser or null\n */\n static GetIndividualParser(e) {\n return this._IndividualBabylonFileParsers[e] ? this._IndividualBabylonFileParsers[e] : null;\n }\n /**\n * Parser json data and populate both a scene and its associated container object\n * @param jsonData Defines the data to parse\n * @param scene Defines the scene to parse the data for\n * @param container Defines the container attached to the parsing sequence\n * @param rootUrl Defines the root url of the data\n */\n static Parse(e, t, i, r) {\n for (const s in this._BabylonFileParsers)\n Object.prototype.hasOwnProperty.call(this._BabylonFileParsers, s) && this._BabylonFileParsers[s](e, t, i, r);\n }\n /**\n * Texture used in all pbr material as the reflection texture.\n * As in the majority of the scene they are the same (exception for multi room and so on),\n * this is easier to reference from here than from all the materials.\n */\n get environmentTexture() {\n return this._environmentTexture;\n }\n set environmentTexture(e) {\n this._environmentTexture = e;\n }\n /**\n * @returns all meshes, lights, cameras, transformNodes and bones\n */\n getNodes() {\n let e = [];\n return e = e.concat(this.meshes), e = e.concat(this.lights), e = e.concat(this.cameras), e = e.concat(this.transformNodes), this.skeletons.forEach((t) => e = e.concat(t.bones)), e;\n }\n}\nXo._BabylonFileParsers = {};\nXo._IndividualBabylonFileParsers = {};\nfunction P(n, e, t, i) {\n var r = arguments.length, s = r < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, a;\n if (typeof Reflect == \"object\" && typeof Reflect.decorate == \"function\")\n s = Reflect.decorate(n, e, t, i);\n else\n for (var o = n.length - 1; o >= 0; o--)\n (a = n[o]) && (s = (r < 3 ? a(s) : r > 3 ? a(e, t, s) : a(e, t)) || s);\n return r > 3 && s && Object.defineProperty(e, t, s), s;\n}\nconst ml = {}, Wl = {};\nfunction Cy(n) {\n const e = n.getClassName();\n return Wl[e] || (Wl[e] = {}), Wl[e];\n}\nfunction gu(n) {\n const e = n.getClassName();\n if (ml[e])\n return ml[e];\n ml[e] = {};\n const t = ml[e];\n let i = n, r = e;\n for (; r; ) {\n const s = Wl[r];\n for (const l in s)\n t[l] = s[l];\n let a, o = !1;\n do {\n if (a = Object.getPrototypeOf(i), !a.getClassName) {\n o = !0;\n break;\n }\n if (a.getClassName() !== r)\n break;\n i = a;\n } while (a);\n if (o)\n break;\n r = a.getClassName(), i = a;\n }\n return t;\n}\nfunction Lr(n, e) {\n return (t, i) => {\n const r = Cy(t);\n r[i] || (r[i] = { type: n, sourceName: e });\n };\n}\nfunction Ry(n, e = null) {\n return (t, i) => {\n const r = e || \"_\" + i;\n Object.defineProperty(t, i, {\n get: function() {\n return this[r];\n },\n set: function(s) {\n typeof this.equals == \"function\" && this.equals(s) || this[r] !== s && (this[r] = s, t[n].apply(this));\n },\n enumerable: !0,\n configurable: !0\n });\n };\n}\nfunction oe(n, e = null) {\n return Ry(n, e);\n}\nfunction U(n) {\n return Lr(0, n);\n}\nfunction Tt(n) {\n return Lr(1, n);\n}\nfunction $i(n) {\n return Lr(2, n);\n}\nfunction Ho(n) {\n return Lr(3, n);\n}\nfunction X_(n) {\n return Lr(4, n);\n}\nfunction cn(n) {\n return Lr(5, n);\n}\nfunction Sy(n) {\n return Lr(6, n);\n}\nfunction yy(n) {\n return Lr(7, n);\n}\nfunction H_(n) {\n return Lr(8, n);\n}\nfunction Iy(n) {\n return Lr(9, n);\n}\nfunction by(n) {\n return Lr(10, n);\n}\nfunction K_(n) {\n return Lr(12, n);\n}\nfunction on(n, e, t, i) {\n const r = t.value;\n t.value = (...s) => {\n let a = r;\n if (typeof _native < \"u\" && _native[e]) {\n const o = _native[e];\n i ? a = (...l) => i(...l) ? o(...l) : r(...l) : a = o;\n }\n return n[e] = a, a(...s);\n };\n}\non.filter = function(n) {\n return (e, t, i) => on(e, t, i, n);\n};\nclass je {\n /**\n * Returns -1 if value is negative and +1 is value is positive.\n * @param value the value\n * @returns the value itself if it's equal to zero.\n */\n static Sign(e) {\n return e = +e, e === 0 || isNaN(e) ? e : e > 0 ? 1 : -1;\n }\n /**\n * the log2 of value.\n * @param value the value to compute log2 of\n * @returns the log2 of value.\n */\n static Log2(e) {\n return Math.log(e) * Math.LOG2E;\n }\n /**\n * the floor part of a log2 value.\n * @param value the value to compute log2 of\n * @returns the log2 of value.\n */\n static ILog2(e) {\n if (Math.log2)\n return Math.floor(Math.log2(e));\n if (e < 0)\n return NaN;\n if (e === 0)\n return -1 / 0;\n let t = 0;\n if (e < 1) {\n for (; e < 1; )\n t++, e = e * 2;\n t = -t;\n } else if (e > 1)\n for (; e > 1; )\n t++, e = Math.floor(e / 2);\n return t;\n }\n /**\n * Loops the value, so that it is never larger than length and never smaller than 0.\n *\n * This is similar to the modulo operator but it works with floating point numbers.\n * For example, using 3.0 for t and 2.5 for length, the result would be 0.5.\n * With t = 5 and length = 2.5, the result would be 0.0.\n * Note, however, that the behaviour is not defined for negative numbers as it is for the modulo operator\n * @param value the value\n * @param length the length\n * @returns the looped value\n */\n static Repeat(e, t) {\n return e - Math.floor(e / t) * t;\n }\n /**\n * Normalize the value between 0.0 and 1.0 using min and max values\n * @param value value to normalize\n * @param min max to normalize between\n * @param max min to normalize between\n * @returns the normalized value\n */\n static Normalize(e, t, i) {\n return (e - t) / (i - t);\n }\n /**\n * Denormalize the value from 0.0 and 1.0 using min and max values\n * @param normalized value to denormalize\n * @param min max to denormalize between\n * @param max min to denormalize between\n * @returns the denormalized value\n */\n static Denormalize(e, t, i) {\n return e * (i - t) + t;\n }\n /**\n * Calculates the shortest difference between two given angles given in degrees.\n * @param current current angle in degrees\n * @param target target angle in degrees\n * @returns the delta\n */\n static DeltaAngle(e, t) {\n let i = je.Repeat(t - e, 360);\n return i > 180 && (i -= 360), i;\n }\n /**\n * PingPongs the value t, so that it is never larger than length and never smaller than 0.\n * @param tx value\n * @param length length\n * @returns The returned value will move back and forth between 0 and length\n */\n static PingPong(e, t) {\n const i = je.Repeat(e, t * 2);\n return t - Math.abs(i - t);\n }\n /**\n * Interpolates between min and max with smoothing at the limits.\n *\n * This function interpolates between min and max in a similar way to Lerp. However, the interpolation will gradually speed up\n * from the start and slow down toward the end. This is useful for creating natural-looking animation, fading and other transitions.\n * @param from from\n * @param to to\n * @param tx value\n * @returns the smooth stepped value\n */\n static SmoothStep(e, t, i) {\n let r = je.Clamp(i);\n return r = -2 * r * r * r + 3 * r * r, t * r + e * (1 - r);\n }\n /**\n * Moves a value current towards target.\n *\n * This is essentially the same as Mathf.Lerp but instead the function will ensure that the speed never exceeds maxDelta.\n * Negative values of maxDelta pushes the value away from target.\n * @param current current value\n * @param target target value\n * @param maxDelta max distance to move\n * @returns resulting value\n */\n static MoveTowards(e, t, i) {\n let r = 0;\n return Math.abs(t - e) <= i ? r = t : r = e + je.Sign(t - e) * i, r;\n }\n /**\n * Same as MoveTowards but makes sure the values interpolate correctly when they wrap around 360 degrees.\n *\n * Variables current and target are assumed to be in degrees. For optimization reasons, negative values of maxDelta\n * are not supported and may cause oscillation. To push current away from a target angle, add 180 to that angle instead.\n * @param current current value\n * @param target target value\n * @param maxDelta max distance to move\n * @returns resulting angle\n */\n static MoveTowardsAngle(e, t, i) {\n const r = je.DeltaAngle(e, t);\n let s = 0;\n return -i < r && r < i ? s = t : (t = e + r, s = je.MoveTowards(e, t, i)), s;\n }\n /**\n * Same as Lerp but makes sure the values interpolate correctly when they wrap around 360 degrees.\n * The parameter t is clamped to the range [0, 1]. Variables a and b are assumed to be in degrees.\n * @param start start value\n * @param end target value\n * @param amount amount to lerp between\n * @returns the lerped value\n */\n static LerpAngle(e, t, i) {\n let r = je.Repeat(t - e, 360);\n return r > 180 && (r -= 360), e + r * ii(i);\n }\n /**\n * Calculates the linear parameter t that produces the interpolant value within the range [a, b].\n * @param a start value\n * @param b target value\n * @param value value between a and b\n * @returns the inverseLerp value\n */\n static InverseLerp(e, t, i) {\n let r = 0;\n return e != t ? r = ii((i - e) / (t - e)) : r = 0, r;\n }\n /**\n * Returns a new scalar located for \"amount\" (float) on the Hermite spline defined by the scalars \"value1\", \"value3\", \"tangent1\", \"tangent2\".\n * @see http://mathworld.wolfram.com/HermitePolynomial.html\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param amount defines the amount on the interpolation spline (between 0 and 1)\n * @returns hermite result\n */\n static Hermite(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 2 * o - 3 * a + 1, c = -2 * o + 3 * a, h = o - 2 * a + s, u = o - a;\n return e * l + i * c + t * h + r * u;\n }\n /**\n * Returns a new scalar which is the 1st derivative of the Hermite spline defined by the scalars \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @returns 1st derivative\n */\n static Hermite1stDerivative(e, t, i, r, s) {\n const a = s * s;\n return (a - s) * 6 * e + (3 * a - 4 * s + 1) * t + (-a + s) * 6 * i + (3 * a - 2 * s) * r;\n }\n /**\n * This function returns percentage of a number in a given range.\n *\n * RangeToPercent(40,20,60) will return 0.5 (50%)\n * RangeToPercent(34,0,100) will return 0.34 (34%)\n * @param number to convert to percentage\n * @param min min range\n * @param max max range\n * @returns the percentage\n */\n static RangeToPercent(e, t, i) {\n return (e - t) / (i - t);\n }\n /**\n * This function returns number that corresponds to the percentage in a given range.\n *\n * PercentToRange(0.34,0,100) will return 34.\n * @param percent to convert to number\n * @param min min range\n * @param max max range\n * @returns the number\n */\n static PercentToRange(e, t, i) {\n return (i - t) * e + t;\n }\n /**\n * Returns the highest common factor of two integers.\n * @param a first parameter\n * @param b second parameter\n * @returns HCF of a and b\n */\n static HCF(e, t) {\n const i = e % t;\n return i === 0 ? t : je.HCF(t, i);\n }\n}\nje.TwoPi = Math.PI * 2;\nje.WithinEpsilon = Ii;\nje.ToHex = Kr;\nje.Clamp = ii;\nje.Lerp = W_;\nje.RandomRange = Zt;\nje.NormalizeRadians = G_;\nfunction pa(n) {\n return Math.pow(n, zl);\n}\nfunction ga(n) {\n return n <= 0.04045 ? 0.0773993808 * n : Math.pow(0.947867299 * (n + 0.055), 2.4);\n}\nfunction ma(n) {\n return Math.pow(n, kl);\n}\nfunction _a(n) {\n return n <= 31308e-7 ? 12.92 * n : 1.055 * Math.pow(n, 0.41666) - 0.055;\n}\nclass Ne {\n /**\n * Creates a new Color3 object from red, green, blue values, all between 0 and 1\n * @param r defines the red component (between 0 and 1, default is 0)\n * @param g defines the green component (between 0 and 1, default is 0)\n * @param b defines the blue component (between 0 and 1, default is 0)\n */\n constructor(e = 0, t = 0, i = 0) {\n this.r = e, this.g = t, this.b = i;\n }\n /**\n * Creates a string with the Color3 current values\n * @returns the string representation of the Color3 object\n */\n toString() {\n return \"{R: \" + this.r + \" G:\" + this.g + \" B:\" + this.b + \"}\";\n }\n /**\n * Returns the string \"Color3\"\n * @returns \"Color3\"\n */\n getClassName() {\n return \"Color3\";\n }\n /**\n * Compute the Color3 hash code\n * @returns an unique number that can be used to hash Color3 objects\n */\n getHashCode() {\n let e = this.r * 255 | 0;\n return e = e * 397 ^ (this.g * 255 | 0), e = e * 397 ^ (this.b * 255 | 0), e;\n }\n // Operators\n /**\n * Stores in the given array from the given starting index the red, green, blue values as successive elements\n * @param array defines the array where to store the r,g,b components\n * @param index defines an optional index in the target array to define where to start storing values\n * @returns the current Color3 object\n */\n toArray(e, t = 0) {\n return e[t] = this.r, e[t + 1] = this.g, e[t + 2] = this.b, this;\n }\n /**\n * Update the current color with values stored in an array from the starting index of the given array\n * @param array defines the source array\n * @param offset defines an offset in the source array\n * @returns the current Color3 object\n */\n fromArray(e, t = 0) {\n return Ne.FromArrayToRef(e, t, this), this;\n }\n /**\n * Returns a new Color4 object from the current Color3 and the given alpha\n * @param alpha defines the alpha component on the new Color4 object (default is 1)\n * @returns a new Color4 object\n */\n toColor4(e = 1) {\n return new et(this.r, this.g, this.b, e);\n }\n /**\n * Returns a new array populated with 3 numeric elements : red, green and blue values\n * @returns the new array\n */\n asArray() {\n return [this.r, this.g, this.b];\n }\n /**\n * Returns the luminance value\n * @returns a float value\n */\n toLuminance() {\n return this.r * 0.3 + this.g * 0.59 + this.b * 0.11;\n }\n /**\n * Multiply each Color3 rgb values by the given Color3 rgb values in a new Color3 object\n * @param otherColor defines the second operand\n * @returns the new Color3 object\n */\n multiply(e) {\n return new this.constructor(this.r * e.r, this.g * e.g, this.b * e.b);\n }\n /**\n * Multiply the rgb values of the Color3 and the given Color3 and stores the result in the object \"result\"\n * @param otherColor defines the second operand\n * @param result defines the Color3 object where to store the result\n * @returns the result Color3\n */\n multiplyToRef(e, t) {\n return t.r = this.r * e.r, t.g = this.g * e.g, t.b = this.b * e.b, t;\n }\n /**\n * Multiplies the current Color3 coordinates by the given ones\n * @param otherColor defines the second operand\n * @returns the current updated Color3\n */\n multiplyInPlace(e) {\n return this.r *= e.r, this.g *= e.g, this.b *= e.b, this;\n }\n /**\n * Returns a new Color3 set with the result of the multiplication of the current Color3 coordinates by the given floats\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @returns the new Color3\n */\n multiplyByFloats(e, t, i) {\n return new this.constructor(this.r * e, this.g * t, this.b * i);\n }\n /**\n * @internal\n * Do not use\n */\n divide(e) {\n throw new ReferenceError(\"Can not divide a color\");\n }\n /**\n * @internal\n * Do not use\n */\n divideToRef(e, t) {\n throw new ReferenceError(\"Can not divide a color\");\n }\n /**\n * @internal\n * Do not use\n */\n divideInPlace(e) {\n throw new ReferenceError(\"Can not divide a color\");\n }\n /**\n * Updates the current Color3 with the minimal coordinate values between its and the given color ones\n * @param other defines the second operand\n * @returns the current updated Color3\n */\n minimizeInPlace(e) {\n return this.minimizeInPlaceFromFloats(e.r, e.g, e.b);\n }\n /**\n * Updates the current Color3 with the maximal coordinate values between its and the given color ones.\n * @param other defines the second operand\n * @returns the current updated Color3\n */\n maximizeInPlace(e) {\n return this.maximizeInPlaceFromFloats(e.r, e.g, e.b);\n }\n /**\n * Updates the current Color3 with the minimal coordinate values between its and the given coordinates\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @returns the current updated Color3\n */\n minimizeInPlaceFromFloats(e, t, i) {\n return this.r = Math.min(e, this.r), this.g = Math.min(t, this.g), this.b = Math.min(i, this.b), this;\n }\n /**\n * Updates the current Color3 with the maximal coordinate values between its and the given coordinates.\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @returns the current updated Color3\n */\n maximizeInPlaceFromFloats(e, t, i) {\n return this.r = Math.max(e, this.r), this.g = Math.max(t, this.g), this.b = Math.max(i, this.b), this;\n }\n /**\n * @internal\n * Do not use\n */\n floorToRef(e) {\n throw new ReferenceError(\"Can not floor a color\");\n }\n /**\n * @internal\n * Do not use\n */\n floor() {\n throw new ReferenceError(\"Can not floor a color\");\n }\n /**\n * @internal\n * Do not use\n */\n fractToRef(e) {\n throw new ReferenceError(\"Can not fract a color\");\n }\n /**\n * @internal\n * Do not use\n */\n fract() {\n throw new ReferenceError(\"Can not fract a color\");\n }\n /**\n * Determines equality between Color3 objects\n * @param otherColor defines the second operand\n * @returns true if the rgb values are equal to the given ones\n */\n equals(e) {\n return e && this.r === e.r && this.g === e.g && this.b === e.b;\n }\n /**\n * Alias for equalsToFloats\n * @param r red color component\n * @param g green color component\n * @param b blue color component\n * @returns boolean\n */\n equalsFloats(e, t, i) {\n return this.equalsToFloats(e, t, i);\n }\n /**\n * Determines equality between the current Color3 object and a set of r,b,g values\n * @param r defines the red component to check\n * @param g defines the green component to check\n * @param b defines the blue component to check\n * @returns true if the rgb values are equal to the given ones\n */\n equalsToFloats(e, t, i) {\n return this.r === e && this.g === t && this.b === i;\n }\n /**\n * Returns true if the current Color3 and the given color coordinates are distant less than epsilon\n * @param otherColor defines the second operand\n * @param epsilon defines the minimal distance to define values as equals\n * @returns true if both colors are distant less than epsilon\n */\n equalsWithEpsilon(e, t = xt) {\n return je.WithinEpsilon(this.r, e.r, t) && je.WithinEpsilon(this.g, e.g, t) && je.WithinEpsilon(this.b, e.b, t);\n }\n /**\n * @internal\n * Do not use\n */\n negate() {\n throw new ReferenceError(\"Can not negate a color\");\n }\n /**\n * @internal\n * Do not use\n */\n negateInPlace() {\n throw new ReferenceError(\"Can not negate a color\");\n }\n /**\n * @internal\n * Do not use\n */\n negateToRef(e) {\n throw new ReferenceError(\"Can not negate a color\");\n }\n /**\n * Creates a new Color3 with the current Color3 values multiplied by scale\n * @param scale defines the scaling factor to apply\n * @returns a new Color3 object\n */\n scale(e) {\n return new this.constructor(this.r * e, this.g * e, this.b * e);\n }\n /**\n * Multiplies the Color3 values by the float \"scale\"\n * @param scale defines the scaling factor to apply\n * @returns the current updated Color3\n */\n scaleInPlace(e) {\n return this.r *= e, this.g *= e, this.b *= e, this;\n }\n /**\n * Multiplies the rgb values by scale and stores the result into \"result\"\n * @param scale defines the scaling factor\n * @param result defines the Color3 object where to store the result\n * @returns the result Color3\n */\n scaleToRef(e, t) {\n return t.r = this.r * e, t.g = this.g * e, t.b = this.b * e, t;\n }\n /**\n * Scale the current Color3 values by a factor and add the result to a given Color3\n * @param scale defines the scale factor\n * @param result defines color to store the result into\n * @returns the result Color3\n */\n scaleAndAddToRef(e, t) {\n return t.r += this.r * e, t.g += this.g * e, t.b += this.b * e, t;\n }\n /**\n * Clamps the rgb values by the min and max values and stores the result into \"result\"\n * @param min defines minimum clamping value (default is 0)\n * @param max defines maximum clamping value (default is 1)\n * @param result defines color to store the result into\n * @returns the result Color3\n */\n clampToRef(e = 0, t = 1, i) {\n return i.r = ii(this.r, e, t), i.g = ii(this.g, e, t), i.b = ii(this.b, e, t), i;\n }\n /**\n * Creates a new Color3 set with the added values of the current Color3 and of the given one\n * @param otherColor defines the second operand\n * @returns the new Color3\n */\n add(e) {\n return new this.constructor(this.r + e.r, this.g + e.g, this.b + e.b);\n }\n /**\n * Adds the given color to the current Color3\n * @param otherColor defines the second operand\n * @returns the current updated Color3\n */\n addInPlace(e) {\n return this.r += e.r, this.g += e.g, this.b += e.b, this;\n }\n /**\n * Adds the given coordinates to the current Color3\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @returns the current updated Color3\n */\n addInPlaceFromFloats(e, t, i) {\n return this.r += e, this.g += t, this.b += i, this;\n }\n /**\n * Stores the result of the addition of the current Color3 and given one rgb values into \"result\"\n * @param otherColor defines the second operand\n * @param result defines Color3 object to store the result into\n * @returns the unmodified current Color3\n */\n addToRef(e, t) {\n return t.r = this.r + e.r, t.g = this.g + e.g, t.b = this.b + e.b, t;\n }\n /**\n * Returns a new Color3 set with the subtracted values of the given one from the current Color3\n * @param otherColor defines the second operand\n * @returns the new Color3\n */\n subtract(e) {\n return new this.constructor(this.r - e.r, this.g - e.g, this.b - e.b);\n }\n /**\n * Stores the result of the subtraction of given one from the current Color3 rgb values into \"result\"\n * @param otherColor defines the second operand\n * @param result defines Color3 object to store the result into\n * @returns the unmodified current Color3\n */\n subtractToRef(e, t) {\n return t.r = this.r - e.r, t.g = this.g - e.g, t.b = this.b - e.b, t;\n }\n /**\n * Subtract the given color from the current Color3\n * @param otherColor defines the second operand\n * @returns the current updated Color3\n */\n subtractInPlace(e) {\n return this.r -= e.r, this.g -= e.g, this.b -= e.b, this;\n }\n /**\n * Returns a new Color3 set with the subtraction of the given floats from the current Color3 coordinates\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @returns the resulting Color3\n */\n subtractFromFloats(e, t, i) {\n return new this.constructor(this.r - e, this.g - t, this.b - i);\n }\n /**\n * Subtracts the given floats from the current Color3 coordinates and set the given color \"result\" with this result\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @param result defines the Color3 object where to store the result\n * @returns the result\n */\n subtractFromFloatsToRef(e, t, i, r) {\n return r.copyFromFloats(this.r - e, this.g - t, this.b - i);\n }\n /**\n * Copy the current object\n * @returns a new Color3 copied the current one\n */\n clone() {\n return new this.constructor(this.r, this.g, this.b);\n }\n /**\n * Copies the rgb values from the source in the current Color3\n * @param source defines the source Color3 object\n * @returns the updated Color3 object\n */\n copyFrom(e) {\n return this.r = e.r, this.g = e.g, this.b = e.b, this;\n }\n /**\n * Updates the Color3 rgb values from the given floats\n * @param r defines the red component to read from\n * @param g defines the green component to read from\n * @param b defines the blue component to read from\n * @returns the current Color3 object\n */\n copyFromFloats(e, t, i) {\n return this.r = e, this.g = t, this.b = i, this;\n }\n /**\n * Updates the Color3 rgb values from the given floats\n * @param r defines the red component to read from\n * @param g defines the green component to read from\n * @param b defines the blue component to read from\n * @returns the current Color3 object\n */\n set(e, t, i) {\n return this.copyFromFloats(e, t, i);\n }\n /**\n * Copies the given float to the current Color3 coordinates\n * @param v defines the r, g and b coordinates of the operand\n * @returns the current updated Color3\n */\n setAll(e) {\n return this.r = this.g = this.b = e, this;\n }\n /**\n * Compute the Color3 hexadecimal code as a string\n * @returns a string containing the hexadecimal representation of the Color3 object\n */\n toHexString() {\n const e = Math.round(this.r * 255), t = Math.round(this.g * 255), i = Math.round(this.b * 255);\n return \"#\" + Kr(e) + Kr(t) + Kr(i);\n }\n /**\n * Converts current color in rgb space to HSV values\n * @returns a new color3 representing the HSV values\n */\n toHSV() {\n const e = new this.constructor();\n return this.toHSVToRef(e), e;\n }\n /**\n * Converts current color in rgb space to HSV values\n * @param result defines the Color3 where to store the HSV values\n */\n toHSVToRef(e) {\n const t = this.r, i = this.g, r = this.b, s = Math.max(t, i, r), a = Math.min(t, i, r);\n let o = 0, l = 0;\n const c = s, h = s - a;\n s !== 0 && (l = h / s), s != a && (s == t ? (o = (i - r) / h, i < r && (o += 6)) : s == i ? o = (r - t) / h + 2 : s == r && (o = (t - i) / h + 4), o *= 60), e.r = o, e.g = l, e.b = c;\n }\n /**\n * Computes a new Color3 converted from the current one to linear space\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns a new Color3 object\n */\n toLinearSpace(e = !1) {\n const t = new this.constructor();\n return this.toLinearSpaceToRef(t, e), t;\n }\n /**\n * Converts the Color3 values to linear space and stores the result in \"convertedColor\"\n * @param convertedColor defines the Color3 object where to store the linear space version\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns the unmodified Color3\n */\n toLinearSpaceToRef(e, t = !1) {\n return t ? (e.r = ga(this.r), e.g = ga(this.g), e.b = ga(this.b)) : (e.r = pa(this.r), e.g = pa(this.g), e.b = pa(this.b)), this;\n }\n /**\n * Computes a new Color3 converted from the current one to gamma space\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns a new Color3 object\n */\n toGammaSpace(e = !1) {\n const t = new this.constructor();\n return this.toGammaSpaceToRef(t, e), t;\n }\n /**\n * Converts the Color3 values to gamma space and stores the result in \"convertedColor\"\n * @param convertedColor defines the Color3 object where to store the gamma space version\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns the unmodified Color3\n */\n toGammaSpaceToRef(e, t = !1) {\n return t ? (e.r = _a(this.r), e.g = _a(this.g), e.b = _a(this.b)) : (e.r = ma(this.r), e.g = ma(this.g), e.b = ma(this.b)), this;\n }\n /**\n * Converts Hue, saturation and value to a Color3 (RGB)\n * @param hue defines the hue (value between 0 and 360)\n * @param saturation defines the saturation (value between 0 and 1)\n * @param value defines the value (value between 0 and 1)\n * @param result defines the Color3 where to store the RGB values\n */\n static HSVtoRGBToRef(e, t, i, r) {\n const s = i * t, a = e / 60, o = s * (1 - Math.abs(a % 2 - 1));\n let l = 0, c = 0, h = 0;\n a >= 0 && a <= 1 ? (l = s, c = o) : a >= 1 && a <= 2 ? (l = o, c = s) : a >= 2 && a <= 3 ? (c = s, h = o) : a >= 3 && a <= 4 ? (c = o, h = s) : a >= 4 && a <= 5 ? (l = o, h = s) : a >= 5 && a <= 6 && (l = s, h = o);\n const u = i - s;\n r.set(l + u, c + u, h + u);\n }\n /**\n * Converts Hue, saturation and value to a new Color3 (RGB)\n * @param hue defines the hue (value between 0 and 360)\n * @param saturation defines the saturation (value between 0 and 1)\n * @param value defines the value (value between 0 and 1)\n * @returns a new Color3 object\n */\n static FromHSV(e, t, i) {\n const r = new Ne(0, 0, 0);\n return Ne.HSVtoRGBToRef(e, t, i, r), r;\n }\n /**\n * Creates a new Color3 from the string containing valid hexadecimal values\n * @param hex defines a string containing valid hexadecimal values\n * @returns a new Color3 object\n */\n static FromHexString(e) {\n if (e.substring(0, 1) !== \"#\" || e.length !== 7)\n return new Ne(0, 0, 0);\n const t = parseInt(e.substring(1, 3), 16), i = parseInt(e.substring(3, 5), 16), r = parseInt(e.substring(5, 7), 16);\n return Ne.FromInts(t, i, r);\n }\n /**\n * Creates a new Color3 from the starting index of the given array\n * @param array defines the source array\n * @param offset defines an offset in the source array\n * @returns a new Color3 object\n */\n static FromArray(e, t = 0) {\n return new Ne(e[t], e[t + 1], e[t + 2]);\n }\n /**\n * Creates a new Color3 from the starting index element of the given array\n * @param array defines the source array to read from\n * @param offset defines the offset in the source array\n * @param result defines the target Color3 object\n */\n static FromArrayToRef(e, t = 0, i) {\n i.r = e[t], i.g = e[t + 1], i.b = e[t + 2];\n }\n /**\n * Creates a new Color3 from integer values (\\< 256)\n * @param r defines the red component to read from (value between 0 and 255)\n * @param g defines the green component to read from (value between 0 and 255)\n * @param b defines the blue component to read from (value between 0 and 255)\n * @returns a new Color3 object\n */\n static FromInts(e, t, i) {\n return new Ne(e / 255, t / 255, i / 255);\n }\n /**\n * Creates a new Color3 with values linearly interpolated of \"amount\" between the start Color3 and the end Color3\n * @param start defines the start Color3 value\n * @param end defines the end Color3 value\n * @param amount defines the gradient value between start and end\n * @returns a new Color3 object\n */\n static Lerp(e, t, i) {\n const r = new Ne(0, 0, 0);\n return Ne.LerpToRef(e, t, i, r), r;\n }\n /**\n * Creates a new Color3 with values linearly interpolated of \"amount\" between the start Color3 and the end Color3\n * @param left defines the start value\n * @param right defines the end value\n * @param amount defines the gradient factor\n * @param result defines the Color3 object where to store the result\n */\n static LerpToRef(e, t, i, r) {\n r.r = e.r + (t.r - e.r) * i, r.g = e.g + (t.g - e.g) * i, r.b = e.b + (t.b - e.b) * i;\n }\n /**\n * Returns a new Color3 located for \"amount\" (float) on the Hermite interpolation spline defined by the vectors \"value1\", \"tangent1\", \"value2\", \"tangent2\"\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent Color3\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent Color3\n * @param amount defines the amount on the interpolation spline (between 0 and 1)\n * @returns the new Color3\n */\n static Hermite(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 2 * o - 3 * a + 1, c = -2 * o + 3 * a, h = o - 2 * a + s, u = o - a, f = e.r * l + i.r * c + t.r * h + r.r * u, d = e.g * l + i.g * c + t.g * h + r.g * u, p = e.b * l + i.b * c + t.b * h + r.b * u;\n return new Ne(f, d, p);\n }\n /**\n * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @returns 1st derivative\n */\n static Hermite1stDerivative(e, t, i, r, s) {\n const a = Ne.Black();\n return this.Hermite1stDerivativeToRef(e, t, i, r, s, a), a;\n }\n /**\n * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @param result define where to store the derivative\n */\n static Hermite1stDerivativeToRef(e, t, i, r, s, a) {\n const o = s * s;\n a.r = (o - s) * 6 * e.r + (3 * o - 4 * s + 1) * t.r + (-o + s) * 6 * i.r + (3 * o - 2 * s) * r.r, a.g = (o - s) * 6 * e.g + (3 * o - 4 * s + 1) * t.g + (-o + s) * 6 * i.g + (3 * o - 2 * s) * r.g, a.b = (o - s) * 6 * e.b + (3 * o - 4 * s + 1) * t.b + (-o + s) * 6 * i.b + (3 * o - 2 * s) * r.b;\n }\n /**\n * Returns a Color3 value containing a red color\n * @returns a new Color3 object\n */\n static Red() {\n return new Ne(1, 0, 0);\n }\n /**\n * Returns a Color3 value containing a green color\n * @returns a new Color3 object\n */\n static Green() {\n return new Ne(0, 1, 0);\n }\n /**\n * Returns a Color3 value containing a blue color\n * @returns a new Color3 object\n */\n static Blue() {\n return new Ne(0, 0, 1);\n }\n /**\n * Returns a Color3 value containing a black color\n * @returns a new Color3 object\n */\n static Black() {\n return new Ne(0, 0, 0);\n }\n /**\n * Gets a Color3 value containing a black color that must not be updated\n */\n static get BlackReadOnly() {\n return Ne._BlackReadOnly;\n }\n /**\n * Returns a Color3 value containing a white color\n * @returns a new Color3 object\n */\n static White() {\n return new Ne(1, 1, 1);\n }\n /**\n * Returns a Color3 value containing a purple color\n * @returns a new Color3 object\n */\n static Purple() {\n return new Ne(0.5, 0, 0.5);\n }\n /**\n * Returns a Color3 value containing a magenta color\n * @returns a new Color3 object\n */\n static Magenta() {\n return new Ne(1, 0, 1);\n }\n /**\n * Returns a Color3 value containing a yellow color\n * @returns a new Color3 object\n */\n static Yellow() {\n return new Ne(1, 1, 0);\n }\n /**\n * Returns a Color3 value containing a gray color\n * @returns a new Color3 object\n */\n static Gray() {\n return new Ne(0.5, 0.5, 0.5);\n }\n /**\n * Returns a Color3 value containing a teal color\n * @returns a new Color3 object\n */\n static Teal() {\n return new Ne(0, 1, 1);\n }\n /**\n * Returns a Color3 value containing a random color\n * @returns a new Color3 object\n */\n static Random() {\n return new Ne(Math.random(), Math.random(), Math.random());\n }\n}\nNe._BlackReadOnly = Ne.Black();\nObject.defineProperties(Ne.prototype, {\n dimension: { value: [3] },\n rank: { value: 1 }\n});\nclass et {\n /**\n * Creates a new Color4 object from red, green, blue values, all between 0 and 1\n * @param r defines the red component (between 0 and 1, default is 0)\n * @param g defines the green component (between 0 and 1, default is 0)\n * @param b defines the blue component (between 0 and 1, default is 0)\n * @param a defines the alpha component (between 0 and 1, default is 1)\n */\n constructor(e = 0, t = 0, i = 0, r = 1) {\n this.r = e, this.g = t, this.b = i, this.a = r;\n }\n // Operators\n /**\n * Creates a new array populated with 4 numeric elements : red, green, blue, alpha values\n * @returns the new array\n */\n asArray() {\n return [this.r, this.g, this.b, this.a];\n }\n /**\n * Stores from the starting index in the given array the Color4 successive values\n * @param array defines the array where to store the r,g,b components\n * @param index defines an optional index in the target array to define where to start storing values\n * @returns the current Color4 object\n */\n toArray(e, t = 0) {\n return e[t] = this.r, e[t + 1] = this.g, e[t + 2] = this.b, e[t + 3] = this.a, this;\n }\n /**\n * Update the current color with values stored in an array from the starting index of the given array\n * @param array defines the source array\n * @param offset defines an offset in the source array\n * @returns the current Color4 object\n */\n fromArray(e, t = 0) {\n return this.r = e[t], this.g = e[t + 1], this.b = e[t + 2], this.a = e[t + 3], this;\n }\n /**\n * Determines equality between Color4 objects\n * @param otherColor defines the second operand\n * @returns true if the rgba values are equal to the given ones\n */\n equals(e) {\n return e && this.r === e.r && this.g === e.g && this.b === e.b && this.a === e.a;\n }\n /**\n * Creates a new Color4 set with the added values of the current Color4 and of the given one\n * @param otherColor defines the second operand\n * @returns a new Color4 object\n */\n add(e) {\n return new this.constructor(this.r + e.r, this.g + e.g, this.b + e.b, this.a + e.a);\n }\n /**\n * Updates the given color \"result\" with the result of the addition of the current Color4 and the given one.\n * @param otherColor the color to add\n * @param result the color to store the result\n * @returns result input\n */\n addToRef(e, t) {\n return t.r = this.r + e.r, t.g = this.g + e.g, t.b = this.b + e.b, t.a = this.a + e.a, t;\n }\n /**\n * Adds in place the given Color4 values to the current Color4 object\n * @param otherColor defines the second operand\n * @returns the current updated Color4 object\n */\n addInPlace(e) {\n return this.r += e.r, this.g += e.g, this.b += e.b, this.a += e.a, this;\n }\n /**\n * Adds the given coordinates to the current Color4\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @param a defines the a coordinate of the operand\n * @returns the current updated Color4\n */\n addInPlaceFromFloats(e, t, i, r) {\n return this.r += e, this.g += t, this.b += i, this.a += r, this;\n }\n /**\n * Creates a new Color4 set with the subtracted values of the given one from the current Color4\n * @param otherColor defines the second operand\n * @returns a new Color4 object\n */\n subtract(e) {\n return new this.constructor(this.r - e.r, this.g - e.g, this.b - e.b, this.a - e.a);\n }\n /**\n * Subtracts the given ones from the current Color4 values and stores the results in \"result\"\n * @param otherColor defines the second operand\n * @param result defines the Color4 object where to store the result\n * @returns the result Color4 object\n */\n subtractToRef(e, t) {\n return t.r = this.r - e.r, t.g = this.g - e.g, t.b = this.b - e.b, t.a = this.a - e.a, t;\n }\n /**\n * Subtract in place the given color from the current Color4.\n * @param otherColor the color to subtract\n * @returns the updated Color4.\n */\n subtractInPlace(e) {\n return this.r -= e.r, this.g -= e.g, this.b -= e.b, this.a -= e.a, this;\n }\n /**\n * Returns a new Color4 set with the result of the subtraction of the given floats from the current Color4 coordinates.\n * @param r value to subtract\n * @param g value to subtract\n * @param b value to subtract\n * @param a value to subtract\n * @returns new color containing the result\n */\n subtractFromFloats(e, t, i, r) {\n return new this.constructor(this.r - e, this.g - t, this.b - i, this.a - r);\n }\n /**\n * Sets the given color \"result\" set with the result of the subtraction of the given floats from the current Color4 coordinates.\n * @param r value to subtract\n * @param g value to subtract\n * @param b value to subtract\n * @param a value to subtract\n * @param result the color to store the result in\n * @returns result input\n */\n subtractFromFloatsToRef(e, t, i, r, s) {\n return s.r = this.r - e, s.g = this.g - t, s.b = this.b - i, s.a = this.a - r, s;\n }\n /**\n * Creates a new Color4 with the current Color4 values multiplied by scale\n * @param scale defines the scaling factor to apply\n * @returns a new Color4 object\n */\n scale(e) {\n return new this.constructor(this.r * e, this.g * e, this.b * e, this.a * e);\n }\n /**\n * Multiplies the Color4 values by the float \"scale\"\n * @param scale defines the scaling factor to apply\n * @returns the current updated Color4\n */\n scaleInPlace(e) {\n return this.r *= e, this.g *= e, this.b *= e, this.a *= e, this;\n }\n /**\n * Multiplies the current Color4 values by scale and stores the result in \"result\"\n * @param scale defines the scaling factor to apply\n * @param result defines the Color4 object where to store the result\n * @returns the result Color4\n */\n scaleToRef(e, t) {\n return t.r = this.r * e, t.g = this.g * e, t.b = this.b * e, t.a = this.a * e, t;\n }\n /**\n * Scale the current Color4 values by a factor and add the result to a given Color4\n * @param scale defines the scale factor\n * @param result defines the Color4 object where to store the result\n * @returns the result Color4\n */\n scaleAndAddToRef(e, t) {\n return t.r += this.r * e, t.g += this.g * e, t.b += this.b * e, t.a += this.a * e, t;\n }\n /**\n * Clamps the rgb values by the min and max values and stores the result into \"result\"\n * @param min defines minimum clamping value (default is 0)\n * @param max defines maximum clamping value (default is 1)\n * @param result defines color to store the result into.\n * @returns the result Color4\n */\n clampToRef(e = 0, t = 1, i) {\n return i.r = ii(this.r, e, t), i.g = ii(this.g, e, t), i.b = ii(this.b, e, t), i.a = ii(this.a, e, t), i;\n }\n /**\n * Multiply an Color4 value by another and return a new Color4 object\n * @param color defines the Color4 value to multiply by\n * @returns a new Color4 object\n */\n multiply(e) {\n return new this.constructor(this.r * e.r, this.g * e.g, this.b * e.b, this.a * e.a);\n }\n /**\n * Multiply a Color4 value by another and push the result in a reference value\n * @param color defines the Color4 value to multiply by\n * @param result defines the Color4 to fill the result in\n * @returns the result Color4\n */\n multiplyToRef(e, t) {\n return t.r = this.r * e.r, t.g = this.g * e.g, t.b = this.b * e.b, t.a = this.a * e.a, t;\n }\n /**\n * Multiplies in place the current Color4 by the given one.\n * @param otherColor color to multiple with\n * @returns the updated Color4.\n */\n multiplyInPlace(e) {\n return this.r *= e.r, this.g *= e.g, this.b *= e.b, this.a *= e.a, this;\n }\n /**\n * Returns a new Color4 set with the multiplication result of the given floats and the current Color4 coordinates.\n * @param r value multiply with\n * @param g value multiply with\n * @param b value multiply with\n * @param a value multiply with\n * @returns resulting new color\n */\n multiplyByFloats(e, t, i, r) {\n return new this.constructor(this.r * e, this.g * t, this.b * i, this.a * r);\n }\n /**\n * @internal\n * Do not use\n */\n divide(e) {\n throw new ReferenceError(\"Can not divide a color\");\n }\n /**\n * @internal\n * Do not use\n */\n divideToRef(e, t) {\n throw new ReferenceError(\"Can not divide a color\");\n }\n /**\n * @internal\n * Do not use\n */\n divideInPlace(e) {\n throw new ReferenceError(\"Can not divide a color\");\n }\n /**\n * Updates the Color4 coordinates with the minimum values between its own and the given color ones\n * @param other defines the second operand\n * @returns the current updated Color4\n */\n minimizeInPlace(e) {\n return this.r = Math.min(this.r, e.r), this.g = Math.min(this.g, e.g), this.b = Math.min(this.b, e.b), this.a = Math.min(this.a, e.a), this;\n }\n /**\n * Updates the Color4 coordinates with the maximum values between its own and the given color ones\n * @param other defines the second operand\n * @returns the current updated Color4\n */\n maximizeInPlace(e) {\n return this.r = Math.max(this.r, e.r), this.g = Math.max(this.g, e.g), this.b = Math.max(this.b, e.b), this.a = Math.max(this.a, e.a), this;\n }\n /**\n * Updates the current Color4 with the minimal coordinate values between its and the given coordinates\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @param a defines the a coordinate of the operand\n * @returns the current updated Color4\n */\n minimizeInPlaceFromFloats(e, t, i, r) {\n return this.r = Math.min(e, this.r), this.g = Math.min(t, this.g), this.b = Math.min(i, this.b), this.a = Math.min(r, this.a), this;\n }\n /**\n * Updates the current Color4 with the maximal coordinate values between its and the given coordinates.\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @param a defines the a coordinate of the operand\n * @returns the current updated Color4\n */\n maximizeInPlaceFromFloats(e, t, i, r) {\n return this.r = Math.max(e, this.r), this.g = Math.max(t, this.g), this.b = Math.max(i, this.b), this.a = Math.max(r, this.a), this;\n }\n /**\n * @internal\n * Do not use\n */\n floorToRef(e) {\n throw new ReferenceError(\"Can not floor a color\");\n }\n /**\n * @internal\n * Do not use\n */\n floor() {\n throw new ReferenceError(\"Can not floor a color\");\n }\n /**\n * @internal\n * Do not use\n */\n fractToRef(e) {\n throw new ReferenceError(\"Can not fract a color\");\n }\n /**\n * @internal\n * Do not use\n */\n fract() {\n throw new ReferenceError(\"Can not fract a color\");\n }\n /**\n * @internal\n * Do not use\n */\n negate() {\n throw new ReferenceError(\"Can not negate a color\");\n }\n /**\n * @internal\n * Do not use\n */\n negateInPlace() {\n throw new ReferenceError(\"Can not negate a color\");\n }\n /**\n * @internal\n * Do not use\n */\n negateToRef(e) {\n throw new ReferenceError(\"Can not negate a color\");\n }\n /**\n * Boolean : True if the current Color4 coordinates are each beneath the distance \"epsilon\" from the given color ones.\n * @param otherColor color to compare against\n * @param epsilon (Default: very small number)\n * @returns true if they are equal\n */\n equalsWithEpsilon(e, t = xt) {\n return je.WithinEpsilon(this.r, e.r, t) && je.WithinEpsilon(this.g, e.g, t) && je.WithinEpsilon(this.b, e.b, t) && je.WithinEpsilon(this.a, e.a, t);\n }\n /**\n * Boolean : True if the given floats are strictly equal to the current Color4 coordinates.\n * @param x x value to compare against\n * @param y y value to compare against\n * @param z z value to compare against\n * @param w w value to compare against\n * @returns true if equal\n */\n equalsToFloats(e, t, i, r) {\n return this.r === e && this.g === t && this.b === i && this.a === r;\n }\n /**\n * Creates a string with the Color4 current values\n * @returns the string representation of the Color4 object\n */\n toString() {\n return \"{R: \" + this.r + \" G:\" + this.g + \" B:\" + this.b + \" A:\" + this.a + \"}\";\n }\n /**\n * Returns the string \"Color4\"\n * @returns \"Color4\"\n */\n getClassName() {\n return \"Color4\";\n }\n /**\n * Compute the Color4 hash code\n * @returns an unique number that can be used to hash Color4 objects\n */\n getHashCode() {\n let e = this.r * 255 | 0;\n return e = e * 397 ^ (this.g * 255 | 0), e = e * 397 ^ (this.b * 255 | 0), e = e * 397 ^ (this.a * 255 | 0), e;\n }\n /**\n * Creates a new Color4 copied from the current one\n * @returns a new Color4 object\n */\n clone() {\n return new this.constructor().copyFrom(this);\n }\n /**\n * Copies the given Color4 values into the current one\n * @param source defines the source Color4 object\n * @returns the current updated Color4 object\n */\n copyFrom(e) {\n return this.r = e.r, this.g = e.g, this.b = e.b, this.a = e.a, this;\n }\n /**\n * Copies the given float values into the current one\n * @param r defines the red component to read from\n * @param g defines the green component to read from\n * @param b defines the blue component to read from\n * @param a defines the alpha component to read from\n * @returns the current updated Color4 object\n */\n copyFromFloats(e, t, i, r) {\n return this.r = e, this.g = t, this.b = i, this.a = r, this;\n }\n /**\n * Copies the given float values into the current one\n * @param r defines the red component to read from\n * @param g defines the green component to read from\n * @param b defines the blue component to read from\n * @param a defines the alpha component to read from\n * @returns the current updated Color4 object\n */\n set(e, t, i, r) {\n return this.copyFromFloats(e, t, i, r);\n }\n /**\n * Copies the given float to the current Vector4 coordinates\n * @param v defines the r, g, b, and a coordinates of the operand\n * @returns the current updated Vector4\n */\n setAll(e) {\n return this.r = this.g = this.b = this.a = e, this;\n }\n /**\n * Compute the Color4 hexadecimal code as a string\n * @param returnAsColor3 defines if the string should only contains RGB values (off by default)\n * @returns a string containing the hexadecimal representation of the Color4 object\n */\n toHexString(e = !1) {\n const t = Math.round(this.r * 255), i = Math.round(this.g * 255), r = Math.round(this.b * 255);\n if (e)\n return \"#\" + Kr(t) + Kr(i) + Kr(r);\n const s = Math.round(this.a * 255);\n return \"#\" + Kr(t) + Kr(i) + Kr(r) + Kr(s);\n }\n /**\n * Computes a new Color4 converted from the current one to linear space\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns a new Color4 object\n */\n toLinearSpace(e = !1) {\n const t = new et();\n return this.toLinearSpaceToRef(t, e), t;\n }\n /**\n * Converts the Color4 values to linear space and stores the result in \"convertedColor\"\n * @param convertedColor defines the Color4 object where to store the linear space version\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns the unmodified Color4\n */\n toLinearSpaceToRef(e, t = !1) {\n return t ? (e.r = ga(this.r), e.g = ga(this.g), e.b = ga(this.b)) : (e.r = pa(this.r), e.g = pa(this.g), e.b = pa(this.b)), e.a = this.a, this;\n }\n /**\n * Computes a new Color4 converted from the current one to gamma space\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns a new Color4 object\n */\n toGammaSpace(e = !1) {\n const t = new et();\n return this.toGammaSpaceToRef(t, e), t;\n }\n /**\n * Converts the Color4 values to gamma space and stores the result in \"convertedColor\"\n * @param convertedColor defines the Color4 object where to store the gamma space version\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns the unmodified Color4\n */\n toGammaSpaceToRef(e, t = !1) {\n return t ? (e.r = _a(this.r), e.g = _a(this.g), e.b = _a(this.b)) : (e.r = ma(this.r), e.g = ma(this.g), e.b = ma(this.b)), e.a = this.a, this;\n }\n // Statics\n /**\n * Creates a new Color4 from the string containing valid hexadecimal values.\n *\n * A valid hex string is either in the format #RRGGBB or #RRGGBBAA.\n *\n * When a hex string without alpha is passed, the resulting Color4 has\n * its alpha value set to 1.0.\n *\n * An invalid string results in a Color with all its channels set to 0.0,\n * i.e. \"transparent black\".\n *\n * @param hex defines a string containing valid hexadecimal values\n * @returns a new Color4 object\n */\n static FromHexString(e) {\n if (e.substring(0, 1) !== \"#\" || e.length !== 9 && e.length !== 7)\n return new et(0, 0, 0, 0);\n const t = parseInt(e.substring(1, 3), 16), i = parseInt(e.substring(3, 5), 16), r = parseInt(e.substring(5, 7), 16), s = e.length === 9 ? parseInt(e.substring(7, 9), 16) : 255;\n return et.FromInts(t, i, r, s);\n }\n /**\n * Creates a new Color4 object set with the linearly interpolated values of \"amount\" between the left Color4 object and the right Color4 object\n * @param left defines the start value\n * @param right defines the end value\n * @param amount defines the gradient factor\n * @returns a new Color4 object\n */\n static Lerp(e, t, i) {\n const r = new et(0, 0, 0, 0);\n return et.LerpToRef(e, t, i, r), r;\n }\n /**\n * Set the given \"result\" with the linearly interpolated values of \"amount\" between the left Color4 object and the right Color4 object\n * @param left defines the start value\n * @param right defines the end value\n * @param amount defines the gradient factor\n * @param result defines the Color4 object where to store data\n */\n static LerpToRef(e, t, i, r) {\n r.r = e.r + (t.r - e.r) * i, r.g = e.g + (t.g - e.g) * i, r.b = e.b + (t.b - e.b) * i, r.a = e.a + (t.a - e.a) * i;\n }\n /**\n * Interpolate between two Color4 using Hermite interpolation\n * @param value1 defines first Color4\n * @param tangent1 defines the incoming tangent\n * @param value2 defines second Color4\n * @param tangent2 defines the outgoing tangent\n * @param amount defines the target Color4\n * @returns the new interpolated Color4\n */\n static Hermite(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 2 * o - 3 * a + 1, c = -2 * o + 3 * a, h = o - 2 * a + s, u = o - a, f = e.r * l + i.r * c + t.r * h + r.r * u, d = e.g * l + i.g * c + t.g * h + r.g * u, p = e.b * l + i.b * c + t.b * h + r.b * u, g = e.a * l + i.a * c + t.a * h + r.a * u;\n return new et(f, d, p, g);\n }\n /**\n * Returns a new Color4 which is the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @returns 1st derivative\n */\n static Hermite1stDerivative(e, t, i, r, s) {\n const a = new et();\n return this.Hermite1stDerivativeToRef(e, t, i, r, s, a), a;\n }\n /**\n * Update a Color4 with the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @param result define where to store the derivative\n */\n static Hermite1stDerivativeToRef(e, t, i, r, s, a) {\n const o = s * s;\n a.r = (o - s) * 6 * e.r + (3 * o - 4 * s + 1) * t.r + (-o + s) * 6 * i.r + (3 * o - 2 * s) * r.r, a.g = (o - s) * 6 * e.g + (3 * o - 4 * s + 1) * t.g + (-o + s) * 6 * i.g + (3 * o - 2 * s) * r.g, a.b = (o - s) * 6 * e.b + (3 * o - 4 * s + 1) * t.b + (-o + s) * 6 * i.b + (3 * o - 2 * s) * r.b, a.a = (o - s) * 6 * e.a + (3 * o - 4 * s + 1) * t.a + (-o + s) * 6 * i.a + (3 * o - 2 * s) * r.a;\n }\n /**\n * Creates a new Color4 from a Color3 and an alpha value\n * @param color3 defines the source Color3 to read from\n * @param alpha defines the alpha component (1.0 by default)\n * @returns a new Color4 object\n */\n static FromColor3(e, t = 1) {\n return new et(e.r, e.g, e.b, t);\n }\n /**\n * Creates a new Color4 from the starting index element of the given array\n * @param array defines the source array to read from\n * @param offset defines the offset in the source array\n * @returns a new Color4 object\n */\n static FromArray(e, t = 0) {\n return new et(e[t], e[t + 1], e[t + 2], e[t + 3]);\n }\n /**\n * Creates a new Color4 from the starting index element of the given array\n * @param array defines the source array to read from\n * @param offset defines the offset in the source array\n * @param result defines the target Color4 object\n */\n static FromArrayToRef(e, t = 0, i) {\n i.r = e[t], i.g = e[t + 1], i.b = e[t + 2], i.a = e[t + 3];\n }\n /**\n * Creates a new Color3 from integer values (less than 256)\n * @param r defines the red component to read from (value between 0 and 255)\n * @param g defines the green component to read from (value between 0 and 255)\n * @param b defines the blue component to read from (value between 0 and 255)\n * @param a defines the alpha component to read from (value between 0 and 255)\n * @returns a new Color3 object\n */\n static FromInts(e, t, i, r) {\n return new et(e / 255, t / 255, i / 255, r / 255);\n }\n /**\n * Check the content of a given array and convert it to an array containing RGBA data\n * If the original array was already containing count * 4 values then it is returned directly\n * @param colors defines the array to check\n * @param count defines the number of RGBA data to expect\n * @returns an array containing count * 4 values (RGBA)\n */\n static CheckColors4(e, t) {\n if (e.length === t * 3) {\n const i = [];\n for (let r = 0; r < e.length; r += 3) {\n const s = r / 3 * 4;\n i[s] = e[r], i[s + 1] = e[r + 1], i[s + 2] = e[r + 2], i[s + 3] = 1;\n }\n return i;\n }\n return e;\n }\n}\nObject.defineProperties(et.prototype, {\n dimension: { value: [4] },\n rank: { value: 1 }\n});\nclass Zr {\n}\nZr.Color3 = vi.BuildArray(3, Ne.Black);\nZr.Color4 = vi.BuildArray(3, () => new et(0, 0, 0, 0));\nRe(\"BABYLON.Color3\", Ne);\nRe(\"BABYLON.Color4\", et);\nconst Qp = function(n, e, t, i = {}) {\n const r = n();\n rt && rt.HasTags(e) && rt.AddTagsTo(r, rt.GetTags(e, !0));\n const s = gu(r), a = {};\n for (const o in s) {\n const l = s[o], c = e[o], h = l.type;\n if (c != null && (o !== \"uniqueId\" || Le.AllowLoadingUniqueId))\n switch (h) {\n case 0:\n case 6:\n case 11:\n r[o] = c;\n break;\n case 1:\n i.cloneTexturesOnlyOnce && a[c.uniqueId] ? r[o] = a[c.uniqueId] : (r[o] = t || c.isRenderTarget ? c : c.clone(), a[c.uniqueId] = r[o]);\n break;\n case 2:\n case 3:\n case 4:\n case 5:\n case 7:\n case 10:\n case 12:\n r[o] = t ? c : c.clone();\n break;\n }\n }\n return r;\n};\nclass Le {\n /**\n * Appends the serialized animations from the source animations\n * @param source Source containing the animations\n * @param destination Target to store the animations\n */\n static AppendSerializedAnimations(e, t) {\n if (e.animations) {\n t.animations = [];\n for (let i = 0; i < e.animations.length; i++) {\n const r = e.animations[i];\n t.animations.push(r.serialize());\n }\n }\n }\n /**\n * Static function used to serialized a specific entity\n * @param entity defines the entity to serialize\n * @param serializationObject defines the optional target object where serialization data will be stored\n * @returns a JSON compatible object representing the serialization of the entity\n */\n static Serialize(e, t) {\n t || (t = {}), rt && (t.tags = rt.GetTags(e));\n const i = gu(e);\n for (const r in i) {\n const s = i[r], a = s.sourceName || r, o = s.type, l = e[r];\n if (l != null && (r !== \"uniqueId\" || Le.AllowLoadingUniqueId))\n switch (o) {\n case 0:\n t[a] = l;\n break;\n case 1:\n t[a] = l.serialize();\n break;\n case 2:\n t[a] = l.asArray();\n break;\n case 3:\n t[a] = l.serialize();\n break;\n case 4:\n t[a] = l.asArray();\n break;\n case 5:\n t[a] = l.asArray();\n break;\n case 6:\n t[a] = l.id;\n break;\n case 7:\n t[a] = l.serialize();\n break;\n case 8:\n t[a] = l.asArray();\n break;\n case 9:\n t[a] = l.serialize();\n break;\n case 10:\n t[a] = l.asArray();\n break;\n case 11:\n t[a] = l.id;\n break;\n case 12:\n t[a] = l.asArray();\n break;\n }\n }\n return t;\n }\n /**\n * Given a source json and a destination object in a scene, this function will parse the source and will try to apply its content to the destination object\n * @param source the source json data\n * @param destination the destination object\n * @param scene the scene where the object is\n * @param rootUrl root url to use to load assets\n */\n static ParseProperties(e, t, i, r) {\n r || (r = \"\");\n const s = gu(t);\n for (const a in s) {\n const o = s[a], l = e[o.sourceName || a], c = o.type;\n if (l != null && (a !== \"uniqueId\" || Le.AllowLoadingUniqueId)) {\n const h = t;\n switch (c) {\n case 0:\n h[a] = l;\n break;\n case 1:\n i && (h[a] = Le._TextureParser(l, i, r));\n break;\n case 2:\n h[a] = Ne.FromArray(l);\n break;\n case 3:\n h[a] = Le._FresnelParametersParser(l);\n break;\n case 4:\n h[a] = me.FromArray(l);\n break;\n case 5:\n h[a] = _.FromArray(l);\n break;\n case 6:\n i && (h[a] = i.getLastMeshById(l));\n break;\n case 7:\n h[a] = Le._ColorCurvesParser(l);\n break;\n case 8:\n h[a] = et.FromArray(l);\n break;\n case 9:\n h[a] = Le._ImageProcessingConfigurationParser(l);\n break;\n case 10:\n h[a] = Ce.FromArray(l);\n break;\n case 11:\n i && (h[a] = i.getCameraById(l));\n break;\n case 12:\n h[a] = w.FromArray(l);\n break;\n }\n }\n }\n }\n /**\n * Creates a new entity from a serialization data object\n * @param creationFunction defines a function used to instanciated the new entity\n * @param source defines the source serialization data\n * @param scene defines the hosting scene\n * @param rootUrl defines the root url for resources\n * @returns a new entity\n */\n static Parse(e, t, i, r = null) {\n const s = e();\n return rt && rt.AddTagsTo(s, t.tags), Le.ParseProperties(t, s, i, r), s;\n }\n /**\n * Clones an object\n * @param creationFunction defines the function used to instanciate the new object\n * @param source defines the source object\n * @param options defines the options to use\n * @returns the cloned object\n */\n static Clone(e, t, i = {}) {\n return Qp(e, t, !1, i);\n }\n /**\n * Instanciates a new object based on a source one (some data will be shared between both object)\n * @param creationFunction defines the function used to instanciate the new object\n * @param source defines the source object\n * @returns the new object\n */\n static Instanciate(e, t) {\n return Qp(e, t, !0);\n }\n}\nLe.AllowLoadingUniqueId = !1;\nLe._ImageProcessingConfigurationParser = (n) => {\n throw We(\"ImageProcessingConfiguration\");\n};\nLe._FresnelParametersParser = (n) => {\n throw We(\"FresnelParameters\");\n};\nLe._ColorCurvesParser = (n) => {\n throw We(\"ColorCurves\");\n};\nLe._TextureParser = (n, e, t) => {\n throw We(\"Texture\");\n};\nfunction q_(n) {\n n.push(\"vCameraColorCurveNeutral\", \"vCameraColorCurvePositive\", \"vCameraColorCurveNegative\");\n}\nclass Xt {\n constructor() {\n this._dirty = !0, this._tempColor = new et(0, 0, 0, 0), this._globalCurve = new et(0, 0, 0, 0), this._highlightsCurve = new et(0, 0, 0, 0), this._midtonesCurve = new et(0, 0, 0, 0), this._shadowsCurve = new et(0, 0, 0, 0), this._positiveCurve = new et(0, 0, 0, 0), this._negativeCurve = new et(0, 0, 0, 0), this._globalHue = 30, this._globalDensity = 0, this._globalSaturation = 0, this._globalExposure = 0, this._highlightsHue = 30, this._highlightsDensity = 0, this._highlightsSaturation = 0, this._highlightsExposure = 0, this._midtonesHue = 30, this._midtonesDensity = 0, this._midtonesSaturation = 0, this._midtonesExposure = 0, this._shadowsHue = 30, this._shadowsDensity = 0, this._shadowsSaturation = 0, this._shadowsExposure = 0;\n }\n /**\n * Gets the global Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n get globalHue() {\n return this._globalHue;\n }\n /**\n * Sets the global Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n set globalHue(e) {\n this._globalHue = e, this._dirty = !0;\n }\n /**\n * Gets the global Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n get globalDensity() {\n return this._globalDensity;\n }\n /**\n * Sets the global Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n set globalDensity(e) {\n this._globalDensity = e, this._dirty = !0;\n }\n /**\n * Gets the global Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n get globalSaturation() {\n return this._globalSaturation;\n }\n /**\n * Sets the global Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n set globalSaturation(e) {\n this._globalSaturation = e, this._dirty = !0;\n }\n /**\n * Gets the global Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n get globalExposure() {\n return this._globalExposure;\n }\n /**\n * Sets the global Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n set globalExposure(e) {\n this._globalExposure = e, this._dirty = !0;\n }\n /**\n * Gets the highlights Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n get highlightsHue() {\n return this._highlightsHue;\n }\n /**\n * Sets the highlights Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n set highlightsHue(e) {\n this._highlightsHue = e, this._dirty = !0;\n }\n /**\n * Gets the highlights Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n get highlightsDensity() {\n return this._highlightsDensity;\n }\n /**\n * Sets the highlights Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n set highlightsDensity(e) {\n this._highlightsDensity = e, this._dirty = !0;\n }\n /**\n * Gets the highlights Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n get highlightsSaturation() {\n return this._highlightsSaturation;\n }\n /**\n * Sets the highlights Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n set highlightsSaturation(e) {\n this._highlightsSaturation = e, this._dirty = !0;\n }\n /**\n * Gets the highlights Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n get highlightsExposure() {\n return this._highlightsExposure;\n }\n /**\n * Sets the highlights Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n set highlightsExposure(e) {\n this._highlightsExposure = e, this._dirty = !0;\n }\n /**\n * Gets the midtones Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n get midtonesHue() {\n return this._midtonesHue;\n }\n /**\n * Sets the midtones Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n set midtonesHue(e) {\n this._midtonesHue = e, this._dirty = !0;\n }\n /**\n * Gets the midtones Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n get midtonesDensity() {\n return this._midtonesDensity;\n }\n /**\n * Sets the midtones Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n set midtonesDensity(e) {\n this._midtonesDensity = e, this._dirty = !0;\n }\n /**\n * Gets the midtones Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n get midtonesSaturation() {\n return this._midtonesSaturation;\n }\n /**\n * Sets the midtones Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n set midtonesSaturation(e) {\n this._midtonesSaturation = e, this._dirty = !0;\n }\n /**\n * Gets the midtones Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n get midtonesExposure() {\n return this._midtonesExposure;\n }\n /**\n * Sets the midtones Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n set midtonesExposure(e) {\n this._midtonesExposure = e, this._dirty = !0;\n }\n /**\n * Gets the shadows Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n get shadowsHue() {\n return this._shadowsHue;\n }\n /**\n * Sets the shadows Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n set shadowsHue(e) {\n this._shadowsHue = e, this._dirty = !0;\n }\n /**\n * Gets the shadows Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n get shadowsDensity() {\n return this._shadowsDensity;\n }\n /**\n * Sets the shadows Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n set shadowsDensity(e) {\n this._shadowsDensity = e, this._dirty = !0;\n }\n /**\n * Gets the shadows Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n get shadowsSaturation() {\n return this._shadowsSaturation;\n }\n /**\n * Sets the shadows Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n set shadowsSaturation(e) {\n this._shadowsSaturation = e, this._dirty = !0;\n }\n /**\n * Gets the shadows Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n get shadowsExposure() {\n return this._shadowsExposure;\n }\n /**\n * Sets the shadows Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n set shadowsExposure(e) {\n this._shadowsExposure = e, this._dirty = !0;\n }\n /**\n * Returns the class name\n * @returns The class name\n */\n getClassName() {\n return \"ColorCurves\";\n }\n /**\n * Binds the color curves to the shader.\n * @param colorCurves The color curve to bind\n * @param effect The effect to bind to\n * @param positiveUniform The positive uniform shader parameter\n * @param neutralUniform The neutral uniform shader parameter\n * @param negativeUniform The negative uniform shader parameter\n */\n static Bind(e, t, i = \"vCameraColorCurvePositive\", r = \"vCameraColorCurveNeutral\", s = \"vCameraColorCurveNegative\") {\n e._dirty && (e._dirty = !1, e._getColorGradingDataToRef(e._globalHue, e._globalDensity, e._globalSaturation, e._globalExposure, e._globalCurve), e._getColorGradingDataToRef(e._highlightsHue, e._highlightsDensity, e._highlightsSaturation, e._highlightsExposure, e._tempColor), e._tempColor.multiplyToRef(e._globalCurve, e._highlightsCurve), e._getColorGradingDataToRef(e._midtonesHue, e._midtonesDensity, e._midtonesSaturation, e._midtonesExposure, e._tempColor), e._tempColor.multiplyToRef(e._globalCurve, e._midtonesCurve), e._getColorGradingDataToRef(e._shadowsHue, e._shadowsDensity, e._shadowsSaturation, e._shadowsExposure, e._tempColor), e._tempColor.multiplyToRef(e._globalCurve, e._shadowsCurve), e._highlightsCurve.subtractToRef(e._midtonesCurve, e._positiveCurve), e._midtonesCurve.subtractToRef(e._shadowsCurve, e._negativeCurve)), t && (t.setFloat4(i, e._positiveCurve.r, e._positiveCurve.g, e._positiveCurve.b, e._positiveCurve.a), t.setFloat4(r, e._midtonesCurve.r, e._midtonesCurve.g, e._midtonesCurve.b, e._midtonesCurve.a), t.setFloat4(s, e._negativeCurve.r, e._negativeCurve.g, e._negativeCurve.b, e._negativeCurve.a));\n }\n /**\n * Returns color grading data based on a hue, density, saturation and exposure value.\n * @param hue\n * @param density\n * @param saturation The saturation.\n * @param exposure The exposure.\n * @param result The result data container.\n */\n _getColorGradingDataToRef(e, t, i, r, s) {\n e != null && (e = Xt._Clamp(e, 0, 360), t = Xt._Clamp(t, -100, 100), i = Xt._Clamp(i, -100, 100), r = Xt._Clamp(r, -100, 100), t = Xt._ApplyColorGradingSliderNonlinear(t), t *= 0.5, r = Xt._ApplyColorGradingSliderNonlinear(r), t < 0 && (t *= -1, e = (e + 180) % 360), Xt._FromHSBToRef(e, t, 50 + 0.25 * r, s), s.scaleToRef(2, s), s.a = 1 + 0.01 * i);\n }\n /**\n * Takes an input slider value and returns an adjusted value that provides extra control near the centre.\n * @param value The input slider value in range [-100,100].\n * @returns Adjusted value.\n */\n static _ApplyColorGradingSliderNonlinear(e) {\n e /= 100;\n let t = Math.abs(e);\n return t = Math.pow(t, 2), e < 0 && (t *= -1), t *= 100, t;\n }\n /**\n * Returns an RGBA Color4 based on Hue, Saturation and Brightness (also referred to as value, HSV).\n * @param hue The hue (H) input.\n * @param saturation The saturation (S) input.\n * @param brightness The brightness (B) input.\n * @param result\n * @result An RGBA color represented as Vector4.\n */\n static _FromHSBToRef(e, t, i, r) {\n let s = Xt._Clamp(e, 0, 360);\n const a = Xt._Clamp(t / 100, 0, 1), o = Xt._Clamp(i / 100, 0, 1);\n if (a === 0)\n r.r = o, r.g = o, r.b = o;\n else {\n s /= 60;\n const l = Math.floor(s), c = s - l, h = o * (1 - a), u = o * (1 - a * c), f = o * (1 - a * (1 - c));\n switch (l) {\n case 0:\n r.r = o, r.g = f, r.b = h;\n break;\n case 1:\n r.r = u, r.g = o, r.b = h;\n break;\n case 2:\n r.r = h, r.g = o, r.b = f;\n break;\n case 3:\n r.r = h, r.g = u, r.b = o;\n break;\n case 4:\n r.r = f, r.g = h, r.b = o;\n break;\n default:\n r.r = o, r.g = h, r.b = u;\n break;\n }\n }\n r.a = 1;\n }\n /**\n * Returns a value clamped between min and max\n * @param value The value to clamp\n * @param min The minimum of value\n * @param max The maximum of value\n * @returns The clamped value.\n */\n static _Clamp(e, t, i) {\n return Math.min(Math.max(e, t), i);\n }\n /**\n * Clones the current color curve instance.\n * @returns The cloned curves\n */\n clone() {\n return Le.Clone(() => new Xt(), this);\n }\n /**\n * Serializes the current color curve instance to a json representation.\n * @returns a JSON representation\n */\n serialize() {\n return Le.Serialize(this);\n }\n /**\n * Parses the color curve from a json representation.\n * @param source the JSON source to parse\n * @returns The parsed curves\n */\n static Parse(e) {\n return Le.Parse(() => new Xt(), e, null, null);\n }\n}\nXt.PrepareUniforms = q_;\nP([\n U()\n], Xt.prototype, \"_globalHue\", void 0);\nP([\n U()\n], Xt.prototype, \"_globalDensity\", void 0);\nP([\n U()\n], Xt.prototype, \"_globalSaturation\", void 0);\nP([\n U()\n], Xt.prototype, \"_globalExposure\", void 0);\nP([\n U()\n], Xt.prototype, \"_highlightsHue\", void 0);\nP([\n U()\n], Xt.prototype, \"_highlightsDensity\", void 0);\nP([\n U()\n], Xt.prototype, \"_highlightsSaturation\", void 0);\nP([\n U()\n], Xt.prototype, \"_highlightsExposure\", void 0);\nP([\n U()\n], Xt.prototype, \"_midtonesHue\", void 0);\nP([\n U()\n], Xt.prototype, \"_midtonesDensity\", void 0);\nP([\n U()\n], Xt.prototype, \"_midtonesSaturation\", void 0);\nP([\n U()\n], Xt.prototype, \"_midtonesExposure\", void 0);\nLe._ColorCurvesParser = Xt.Parse;\nfunction Ay(n, e) {\n e.EXPOSURE && n.push(\"exposureLinear\"), e.CONTRAST && n.push(\"contrast\"), e.COLORGRADING && n.push(\"colorTransformSettings\"), (e.VIGNETTE || e.DITHER) && n.push(\"vInverseScreenSize\"), e.VIGNETTE && (n.push(\"vignetteSettings1\"), n.push(\"vignetteSettings2\")), e.COLORCURVES && q_(n), e.DITHER && n.push(\"ditherIntensity\");\n}\nfunction My(n, e) {\n e.COLORGRADING && n.push(\"txColorTransform\");\n}\nclass at {\n constructor() {\n this.colorCurves = new Xt(), this._colorCurvesEnabled = !1, this._colorGradingEnabled = !1, this._colorGradingWithGreenDepth = !0, this._colorGradingBGR = !0, this._exposure = 1, this._toneMappingEnabled = !1, this._toneMappingType = at.TONEMAPPING_STANDARD, this._contrast = 1, this.vignetteStretch = 0, this.vignetteCenterX = 0, this.vignetteCenterY = 0, this.vignetteWeight = 1.5, this.vignetteColor = new et(0, 0, 0, 0), this.vignetteCameraFov = 0.5, this._vignetteBlendMode = at.VIGNETTEMODE_MULTIPLY, this._vignetteEnabled = !1, this._ditheringEnabled = !1, this._ditheringIntensity = 1 / 255, this._skipFinalColorClamp = !1, this._applyByPostProcess = !1, this._isEnabled = !0, this.onUpdateParameters = new he();\n }\n /**\n * Gets whether the color curves effect is enabled.\n */\n get colorCurvesEnabled() {\n return this._colorCurvesEnabled;\n }\n /**\n * Sets whether the color curves effect is enabled.\n */\n set colorCurvesEnabled(e) {\n this._colorCurvesEnabled !== e && (this._colorCurvesEnabled = e, this._updateParameters());\n }\n /**\n * Color grading LUT texture used in the effect if colorGradingEnabled is set to true\n */\n get colorGradingTexture() {\n return this._colorGradingTexture;\n }\n /**\n * Color grading LUT texture used in the effect if colorGradingEnabled is set to true\n */\n set colorGradingTexture(e) {\n this._colorGradingTexture !== e && (this._colorGradingTexture = e, this._updateParameters());\n }\n /**\n * Gets whether the color grading effect is enabled.\n */\n get colorGradingEnabled() {\n return this._colorGradingEnabled;\n }\n /**\n * Sets whether the color grading effect is enabled.\n */\n set colorGradingEnabled(e) {\n this._colorGradingEnabled !== e && (this._colorGradingEnabled = e, this._updateParameters());\n }\n /**\n * Gets whether the color grading effect is using a green depth for the 3d Texture.\n */\n get colorGradingWithGreenDepth() {\n return this._colorGradingWithGreenDepth;\n }\n /**\n * Sets whether the color grading effect is using a green depth for the 3d Texture.\n */\n set colorGradingWithGreenDepth(e) {\n this._colorGradingWithGreenDepth !== e && (this._colorGradingWithGreenDepth = e, this._updateParameters());\n }\n /**\n * Gets whether the color grading texture contains BGR values.\n */\n get colorGradingBGR() {\n return this._colorGradingBGR;\n }\n /**\n * Sets whether the color grading texture contains BGR values.\n */\n set colorGradingBGR(e) {\n this._colorGradingBGR !== e && (this._colorGradingBGR = e, this._updateParameters());\n }\n /**\n * Gets the Exposure used in the effect.\n */\n get exposure() {\n return this._exposure;\n }\n /**\n * Sets the Exposure used in the effect.\n */\n set exposure(e) {\n this._exposure !== e && (this._exposure = e, this._updateParameters());\n }\n /**\n * Gets whether the tone mapping effect is enabled.\n */\n get toneMappingEnabled() {\n return this._toneMappingEnabled;\n }\n /**\n * Sets whether the tone mapping effect is enabled.\n */\n set toneMappingEnabled(e) {\n this._toneMappingEnabled !== e && (this._toneMappingEnabled = e, this._updateParameters());\n }\n /**\n * Gets the type of tone mapping effect.\n */\n get toneMappingType() {\n return this._toneMappingType;\n }\n /**\n * Sets the type of tone mapping effect used in BabylonJS.\n */\n set toneMappingType(e) {\n this._toneMappingType !== e && (this._toneMappingType = e, this._updateParameters());\n }\n /**\n * Gets the contrast used in the effect.\n */\n get contrast() {\n return this._contrast;\n }\n /**\n * Sets the contrast used in the effect.\n */\n set contrast(e) {\n this._contrast !== e && (this._contrast = e, this._updateParameters());\n }\n /**\n * Back Compat: Vignette center Y Offset.\n * @deprecated use vignetteCenterY instead\n */\n get vignetteCentreY() {\n return this.vignetteCenterY;\n }\n set vignetteCentreY(e) {\n this.vignetteCenterY = e;\n }\n /**\n * Back Compat: Vignette center X Offset.\n * @deprecated use vignetteCenterX instead\n */\n get vignetteCentreX() {\n return this.vignetteCenterX;\n }\n set vignetteCentreX(e) {\n this.vignetteCenterX = e;\n }\n /**\n * Gets the vignette blend mode allowing different kind of effect.\n */\n get vignetteBlendMode() {\n return this._vignetteBlendMode;\n }\n /**\n * Sets the vignette blend mode allowing different kind of effect.\n */\n set vignetteBlendMode(e) {\n this._vignetteBlendMode !== e && (this._vignetteBlendMode = e, this._updateParameters());\n }\n /**\n * Gets whether the vignette effect is enabled.\n */\n get vignetteEnabled() {\n return this._vignetteEnabled;\n }\n /**\n * Sets whether the vignette effect is enabled.\n */\n set vignetteEnabled(e) {\n this._vignetteEnabled !== e && (this._vignetteEnabled = e, this._updateParameters());\n }\n /**\n * Gets whether the dithering effect is enabled.\n * The dithering effect can be used to reduce banding.\n */\n get ditheringEnabled() {\n return this._ditheringEnabled;\n }\n /**\n * Sets whether the dithering effect is enabled.\n * The dithering effect can be used to reduce banding.\n */\n set ditheringEnabled(e) {\n this._ditheringEnabled !== e && (this._ditheringEnabled = e, this._updateParameters());\n }\n /**\n * Gets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0.\n */\n get ditheringIntensity() {\n return this._ditheringIntensity;\n }\n /**\n * Sets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0.\n */\n set ditheringIntensity(e) {\n this._ditheringIntensity !== e && (this._ditheringIntensity = e, this._updateParameters());\n }\n /**\n * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader\n * Applies to PBR materials.\n */\n get skipFinalColorClamp() {\n return this._skipFinalColorClamp;\n }\n /**\n * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader\n * Applies to PBR materials.\n */\n set skipFinalColorClamp(e) {\n this._skipFinalColorClamp !== e && (this._skipFinalColorClamp = e, this._updateParameters());\n }\n /**\n * Gets whether the image processing is applied through a post process or not.\n */\n get applyByPostProcess() {\n return this._applyByPostProcess;\n }\n /**\n * Sets whether the image processing is applied through a post process or not.\n */\n set applyByPostProcess(e) {\n this._applyByPostProcess !== e && (this._applyByPostProcess = e, this._updateParameters());\n }\n /**\n * Gets whether the image processing is enabled or not.\n */\n get isEnabled() {\n return this._isEnabled;\n }\n /**\n * Sets whether the image processing is enabled or not.\n */\n set isEnabled(e) {\n this._isEnabled !== e && (this._isEnabled = e, this._updateParameters());\n }\n /**\n * Method called each time the image processing information changes requires to recompile the effect.\n */\n _updateParameters() {\n this.onUpdateParameters.notifyObservers(this);\n }\n /**\n * Gets the current class name.\n * @returns \"ImageProcessingConfiguration\"\n */\n getClassName() {\n return \"ImageProcessingConfiguration\";\n }\n /**\n * Prepare the list of defines associated to the shader.\n * @param defines the list of defines to complete\n * @param forPostProcess Define if we are currently in post process mode or not\n */\n prepareDefines(e, t = !1) {\n if (t !== this.applyByPostProcess || !this._isEnabled) {\n e.VIGNETTE = !1, e.TONEMAPPING = !1, e.TONEMAPPING_ACES = !1, e.CONTRAST = !1, e.EXPOSURE = !1, e.COLORCURVES = !1, e.COLORGRADING = !1, e.COLORGRADING3D = !1, e.DITHER = !1, e.IMAGEPROCESSING = !1, e.SKIPFINALCOLORCLAMP = this.skipFinalColorClamp, e.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess && this._isEnabled;\n return;\n }\n switch (e.VIGNETTE = this.vignetteEnabled, e.VIGNETTEBLENDMODEMULTIPLY = this.vignetteBlendMode === at._VIGNETTEMODE_MULTIPLY, e.VIGNETTEBLENDMODEOPAQUE = !e.VIGNETTEBLENDMODEMULTIPLY, e.TONEMAPPING = this.toneMappingEnabled, this._toneMappingType) {\n case at.TONEMAPPING_ACES:\n e.TONEMAPPING_ACES = !0;\n break;\n default:\n e.TONEMAPPING_ACES = !1;\n break;\n }\n e.CONTRAST = this.contrast !== 1, e.EXPOSURE = this.exposure !== 1, e.COLORCURVES = this.colorCurvesEnabled && !!this.colorCurves, e.COLORGRADING = this.colorGradingEnabled && !!this.colorGradingTexture, e.COLORGRADING ? e.COLORGRADING3D = this.colorGradingTexture.is3D : e.COLORGRADING3D = !1, e.SAMPLER3DGREENDEPTH = this.colorGradingWithGreenDepth, e.SAMPLER3DBGRMAP = this.colorGradingBGR, e.DITHER = this._ditheringEnabled, e.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess, e.SKIPFINALCOLORCLAMP = this.skipFinalColorClamp, e.IMAGEPROCESSING = e.VIGNETTE || e.TONEMAPPING || e.CONTRAST || e.EXPOSURE || e.COLORCURVES || e.COLORGRADING || e.DITHER;\n }\n /**\n * Returns true if all the image processing information are ready.\n * @returns True if ready, otherwise, false\n */\n isReady() {\n return !this.colorGradingEnabled || !this.colorGradingTexture || this.colorGradingTexture.isReady();\n }\n /**\n * Binds the image processing to the shader.\n * @param effect The effect to bind to\n * @param overrideAspectRatio Override the aspect ratio of the effect\n */\n bind(e, t) {\n if (this._colorCurvesEnabled && this.colorCurves && Xt.Bind(this.colorCurves, e), this._vignetteEnabled || this._ditheringEnabled) {\n const i = 1 / e.getEngine().getRenderWidth(), r = 1 / e.getEngine().getRenderHeight();\n if (e.setFloat2(\"vInverseScreenSize\", i, r), this._ditheringEnabled && e.setFloat(\"ditherIntensity\", 0.5 * this._ditheringIntensity), this._vignetteEnabled) {\n const s = t ?? r / i;\n let a = Math.tan(this.vignetteCameraFov * 0.5), o = a * s;\n const l = Math.sqrt(o * a);\n o = pu(o, l, this.vignetteStretch), a = pu(a, l, this.vignetteStretch), e.setFloat4(\"vignetteSettings1\", o, a, -o * this.vignetteCenterX, -a * this.vignetteCenterY);\n const c = -2 * this.vignetteWeight;\n e.setFloat4(\"vignetteSettings2\", this.vignetteColor.r, this.vignetteColor.g, this.vignetteColor.b, c);\n }\n }\n if (e.setFloat(\"exposureLinear\", this.exposure), e.setFloat(\"contrast\", this.contrast), this.colorGradingTexture) {\n e.setTexture(\"txColorTransform\", this.colorGradingTexture);\n const i = this.colorGradingTexture.getSize().height;\n e.setFloat4(\n \"colorTransformSettings\",\n (i - 1) / i,\n // textureScale\n 0.5 / i,\n // textureOffset\n i,\n // textureSize\n this.colorGradingTexture.level\n // weight\n );\n }\n }\n /**\n * Clones the current image processing instance.\n * @returns The cloned image processing\n */\n clone() {\n return Le.Clone(() => new at(), this);\n }\n /**\n * Serializes the current image processing instance to a json representation.\n * @returns a JSON representation\n */\n serialize() {\n return Le.Serialize(this);\n }\n /**\n * Parses the image processing from a json representation.\n * @param source the JSON source to parse\n * @returns The parsed image processing\n */\n static Parse(e) {\n const t = Le.Parse(() => new at(), e, null, null);\n return e.vignetteCentreX !== void 0 && (t.vignetteCenterX = e.vignetteCentreX), e.vignetteCentreY !== void 0 && (t.vignetteCenterY = e.vignetteCentreY), t;\n }\n /**\n * Used to apply the vignette as a mix with the pixel color.\n */\n static get VIGNETTEMODE_MULTIPLY() {\n return this._VIGNETTEMODE_MULTIPLY;\n }\n /**\n * Used to apply the vignette as a replacement of the pixel color.\n */\n static get VIGNETTEMODE_OPAQUE() {\n return this._VIGNETTEMODE_OPAQUE;\n }\n}\nat.TONEMAPPING_STANDARD = 0;\nat.TONEMAPPING_ACES = 1;\nat.PrepareUniforms = Ay;\nat.PrepareSamplers = My;\nat._VIGNETTEMODE_MULTIPLY = 0;\nat._VIGNETTEMODE_OPAQUE = 1;\nP([\n yy()\n], at.prototype, \"colorCurves\", void 0);\nP([\n U()\n], at.prototype, \"_colorCurvesEnabled\", void 0);\nP([\n Tt(\"colorGradingTexture\")\n], at.prototype, \"_colorGradingTexture\", void 0);\nP([\n U()\n], at.prototype, \"_colorGradingEnabled\", void 0);\nP([\n U()\n], at.prototype, \"_colorGradingWithGreenDepth\", void 0);\nP([\n U()\n], at.prototype, \"_colorGradingBGR\", void 0);\nP([\n U()\n], at.prototype, \"_exposure\", void 0);\nP([\n U()\n], at.prototype, \"_toneMappingEnabled\", void 0);\nP([\n U()\n], at.prototype, \"_toneMappingType\", void 0);\nP([\n U()\n], at.prototype, \"_contrast\", void 0);\nP([\n U()\n], at.prototype, \"vignetteStretch\", void 0);\nP([\n U()\n], at.prototype, \"vignetteCenterX\", void 0);\nP([\n U()\n], at.prototype, \"vignetteCenterY\", void 0);\nP([\n U()\n], at.prototype, \"vignetteWeight\", void 0);\nP([\n H_()\n], at.prototype, \"vignetteColor\", void 0);\nP([\n U()\n], at.prototype, \"vignetteCameraFov\", void 0);\nP([\n U()\n], at.prototype, \"_vignetteBlendMode\", void 0);\nP([\n U()\n], at.prototype, \"_vignetteEnabled\", void 0);\nP([\n U()\n], at.prototype, \"_ditheringEnabled\", void 0);\nP([\n U()\n], at.prototype, \"_ditheringIntensity\", void 0);\nP([\n U()\n], at.prototype, \"_skipFinalColorClamp\", void 0);\nP([\n U()\n], at.prototype, \"_applyByPostProcess\", void 0);\nP([\n U()\n], at.prototype, \"_isEnabled\", void 0);\nLe._ImageProcessingConfigurationParser = at.Parse;\nDe.prototype.createUniformBuffer = function(n, e) {\n const t = this._gl.createBuffer();\n if (!t)\n throw new Error(\"Unable to create uniform buffer\");\n const i = new po(t);\n return this.bindUniformBuffer(i), n instanceof Float32Array ? this._gl.bufferData(this._gl.UNIFORM_BUFFER, n, this._gl.STATIC_DRAW) : this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(n), this._gl.STATIC_DRAW), this.bindUniformBuffer(null), i.references = 1, i;\n};\nDe.prototype.createDynamicUniformBuffer = function(n, e) {\n const t = this._gl.createBuffer();\n if (!t)\n throw new Error(\"Unable to create dynamic uniform buffer\");\n const i = new po(t);\n return this.bindUniformBuffer(i), n instanceof Float32Array ? this._gl.bufferData(this._gl.UNIFORM_BUFFER, n, this._gl.DYNAMIC_DRAW) : this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(n), this._gl.DYNAMIC_DRAW), this.bindUniformBuffer(null), i.references = 1, i;\n};\nDe.prototype.updateUniformBuffer = function(n, e, t, i) {\n this.bindUniformBuffer(n), t === void 0 && (t = 0), i === void 0 ? e instanceof Float32Array ? this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, t, e) : this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, t, new Float32Array(e)) : e instanceof Float32Array ? this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, e.subarray(t, t + i)) : this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, new Float32Array(e).subarray(t, t + i)), this.bindUniformBuffer(null);\n};\nDe.prototype.bindUniformBuffer = function(n) {\n this._gl.bindBuffer(this._gl.UNIFORM_BUFFER, n ? n.underlyingResource : null);\n};\nDe.prototype.bindUniformBufferBase = function(n, e, t) {\n this._gl.bindBufferBase(this._gl.UNIFORM_BUFFER, e, n ? n.underlyingResource : null);\n};\nDe.prototype.bindUniformBlock = function(n, e, t) {\n const i = n.program, r = this._gl.getUniformBlockIndex(i, e);\n r !== 4294967295 && this._gl.uniformBlockBinding(i, r, t);\n};\nclass Ie {\n /**\n * Instantiates a new Uniform buffer objects.\n *\n * Handles blocks of uniform on the GPU.\n *\n * If WebGL 2 is not available, this class falls back on traditional setUniformXXX calls.\n *\n * For more information, please refer to :\n * @see https://www.khronos.org/opengl/wiki/Uniform_Buffer_Object\n * @param engine Define the engine the buffer is associated with\n * @param data Define the data contained in the buffer\n * @param dynamic Define if the buffer is updatable\n * @param name to assign to the buffer (debugging purpose)\n * @param forceNoUniformBuffer define that this object must not rely on UBO objects\n */\n constructor(e, t, i, r, s = !1) {\n this._valueCache = {}, this._engine = e, this._noUBO = !e.supportsUniformBuffers || s, this._dynamic = i, this._name = r ?? \"no-name\", this._data = t || [], this._uniformLocations = {}, this._uniformSizes = {}, this._uniformArraySizes = {}, this._uniformLocationPointer = 0, this._needSync = !1, this._engine._features.trackUbosInFrame && (this._buffers = [], this._bufferIndex = -1, this._createBufferOnWrite = !1, this._currentFrameId = 0), this._noUBO ? (this.updateMatrix3x3 = this._updateMatrix3x3ForEffect, this.updateMatrix2x2 = this._updateMatrix2x2ForEffect, this.updateFloat = this._updateFloatForEffect, this.updateFloat2 = this._updateFloat2ForEffect, this.updateFloat3 = this._updateFloat3ForEffect, this.updateFloat4 = this._updateFloat4ForEffect, this.updateFloatArray = this._updateFloatArrayForEffect, this.updateArray = this._updateArrayForEffect, this.updateIntArray = this._updateIntArrayForEffect, this.updateUIntArray = this._updateUIntArrayForEffect, this.updateMatrix = this._updateMatrixForEffect, this.updateMatrices = this._updateMatricesForEffect, this.updateVector3 = this._updateVector3ForEffect, this.updateVector4 = this._updateVector4ForEffect, this.updateColor3 = this._updateColor3ForEffect, this.updateColor4 = this._updateColor4ForEffect, this.updateDirectColor4 = this._updateDirectColor4ForEffect, this.updateInt = this._updateIntForEffect, this.updateInt2 = this._updateInt2ForEffect, this.updateInt3 = this._updateInt3ForEffect, this.updateInt4 = this._updateInt4ForEffect, this.updateUInt = this._updateUIntForEffect, this.updateUInt2 = this._updateUInt2ForEffect, this.updateUInt3 = this._updateUInt3ForEffect, this.updateUInt4 = this._updateUInt4ForEffect) : (this._engine._uniformBuffers.push(this), this.updateMatrix3x3 = this._updateMatrix3x3ForUniform, this.updateMatrix2x2 = this._updateMatrix2x2ForUniform, this.updateFloat = this._updateFloatForUniform, this.updateFloat2 = this._updateFloat2ForUniform, this.updateFloat3 = this._updateFloat3ForUniform, this.updateFloat4 = this._updateFloat4ForUniform, this.updateFloatArray = this._updateFloatArrayForUniform, this.updateArray = this._updateArrayForUniform, this.updateIntArray = this._updateIntArrayForUniform, this.updateUIntArray = this._updateUIntArrayForUniform, this.updateMatrix = this._updateMatrixForUniform, this.updateMatrices = this._updateMatricesForUniform, this.updateVector3 = this._updateVector3ForUniform, this.updateVector4 = this._updateVector4ForUniform, this.updateColor3 = this._updateColor3ForUniform, this.updateColor4 = this._updateColor4ForUniform, this.updateDirectColor4 = this._updateDirectColor4ForUniform, this.updateInt = this._updateIntForUniform, this.updateInt2 = this._updateInt2ForUniform, this.updateInt3 = this._updateInt3ForUniform, this.updateInt4 = this._updateInt4ForUniform, this.updateUInt = this._updateUIntForUniform, this.updateUInt2 = this._updateUInt2ForUniform, this.updateUInt3 = this._updateUInt3ForUniform, this.updateUInt4 = this._updateUInt4ForUniform);\n }\n /**\n * Indicates if the buffer is using the WebGL2 UBO implementation,\n * or just falling back on setUniformXXX calls.\n */\n get useUbo() {\n return !this._noUBO;\n }\n /**\n * Indicates if the WebGL underlying uniform buffer is in sync\n * with the javascript cache data.\n */\n get isSync() {\n return !this._needSync;\n }\n /**\n * Indicates if the WebGL underlying uniform buffer is dynamic.\n * Also, a dynamic UniformBuffer will disable cache verification and always\n * update the underlying WebGL uniform buffer to the GPU.\n * @returns if Dynamic, otherwise false\n */\n isDynamic() {\n return this._dynamic !== void 0;\n }\n /**\n * The data cache on JS side.\n * @returns the underlying data as a float array\n */\n getData() {\n return this._bufferData;\n }\n /**\n * The underlying WebGL Uniform buffer.\n * @returns the webgl buffer\n */\n getBuffer() {\n return this._buffer;\n }\n /**\n * std140 layout specifies how to align data within an UBO structure.\n * See https://khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf#page=159\n * for specs.\n * @param size\n */\n _fillAlignment(e) {\n let t;\n if (e <= 2 ? t = e : t = 4, this._uniformLocationPointer % t !== 0) {\n const i = this._uniformLocationPointer;\n this._uniformLocationPointer += t - this._uniformLocationPointer % t;\n const r = this._uniformLocationPointer - i;\n for (let s = 0; s < r; s++)\n this._data.push(0);\n }\n }\n /**\n * Adds an uniform in the buffer.\n * Warning : the subsequents calls of this function must be in the same order as declared in the shader\n * for the layout to be correct ! The addUniform function only handles types like float, vec2, vec3, vec4, mat4,\n * meaning size=1,2,3,4 or 16. It does not handle struct types.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param size Data size, or data directly.\n * @param arraySize The number of elements in the array, 0 if not an array.\n */\n addUniform(e, t, i = 0) {\n if (this._noUBO || this._uniformLocations[e] !== void 0)\n return;\n let r;\n if (i > 0) {\n if (t instanceof Array)\n throw \"addUniform should not be use with Array in UBO: \" + e;\n if (this._fillAlignment(4), this._uniformArraySizes[e] = { strideSize: t, arraySize: i }, t == 16)\n t = t * i;\n else {\n const a = (4 - t) * i;\n t = t * i + a;\n }\n r = [];\n for (let s = 0; s < t; s++)\n r.push(0);\n } else {\n if (t instanceof Array)\n r = t, t = r.length;\n else {\n t = t, r = [];\n for (let s = 0; s < t; s++)\n r.push(0);\n }\n this._fillAlignment(t);\n }\n this._uniformSizes[e] = t, this._uniformLocations[e] = this._uniformLocationPointer, this._uniformLocationPointer += t;\n for (let s = 0; s < t; s++)\n this._data.push(r[s]);\n this._needSync = !0;\n }\n /**\n * Adds a Matrix 4x4 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param mat A 4x4 matrix.\n */\n addMatrix(e, t) {\n this.addUniform(e, Array.prototype.slice.call(t.asArray()));\n }\n /**\n * Adds a vec2 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param x Define the x component value of the vec2\n * @param y Define the y component value of the vec2\n */\n addFloat2(e, t, i) {\n const r = [t, i];\n this.addUniform(e, r);\n }\n /**\n * Adds a vec3 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param x Define the x component value of the vec3\n * @param y Define the y component value of the vec3\n * @param z Define the z component value of the vec3\n */\n addFloat3(e, t, i, r) {\n const s = [t, i, r];\n this.addUniform(e, s);\n }\n /**\n * Adds a vec3 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param color Define the vec3 from a Color\n */\n addColor3(e, t) {\n const i = [t.r, t.g, t.b];\n this.addUniform(e, i);\n }\n /**\n * Adds a vec4 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param color Define the rgb components from a Color\n * @param alpha Define the a component of the vec4\n */\n addColor4(e, t, i) {\n const r = [t.r, t.g, t.b, i];\n this.addUniform(e, r);\n }\n /**\n * Adds a vec3 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param vector Define the vec3 components from a Vector\n */\n addVector3(e, t) {\n const i = [t.x, t.y, t.z];\n this.addUniform(e, i);\n }\n /**\n * Adds a Matrix 3x3 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n */\n addMatrix3x3(e) {\n this.addUniform(e, 12);\n }\n /**\n * Adds a Matrix 2x2 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n */\n addMatrix2x2(e) {\n this.addUniform(e, 8);\n }\n /**\n * Effectively creates the WebGL Uniform Buffer, once layout is completed with `addUniform`.\n */\n create() {\n this._noUBO || this._buffer || (this._fillAlignment(4), this._bufferData = new Float32Array(this._data), this._rebuild(), this._needSync = !0);\n }\n // The result of this method is used for debugging purpose, as part of the buffer name\n // It is meant to more easily know what this buffer is about when debugging\n // Some buffers can have a lot of uniforms (several dozens), so the method only returns the first 10 of them\n // (should be enough to understand what the buffer is for)\n _getNames() {\n const e = [];\n let t = 0;\n for (const i in this._uniformLocations)\n if (e.push(i), ++t === 10)\n break;\n return e.join(\",\");\n }\n /** @internal */\n _rebuild() {\n this._noUBO || !this._bufferData || (this._dynamic ? this._buffer = this._engine.createDynamicUniformBuffer(this._bufferData, this._name + \"_UniformList:\" + this._getNames()) : this._buffer = this._engine.createUniformBuffer(this._bufferData, this._name + \"_UniformList:\" + this._getNames()), this._engine._features.trackUbosInFrame && (this._buffers.push([this._buffer, this._engine._features.checkUbosContentBeforeUpload ? this._bufferData.slice() : void 0]), this._bufferIndex = this._buffers.length - 1, this._createBufferOnWrite = !1));\n }\n /** @internal */\n _rebuildAfterContextLost() {\n this._engine._features.trackUbosInFrame && (this._buffers = [], this._currentFrameId = 0), this._rebuild();\n }\n /** @internal */\n get _numBuffers() {\n return this._buffers.length;\n }\n /** @internal */\n get _indexBuffer() {\n return this._bufferIndex;\n }\n /** Gets the name of this buffer */\n get name() {\n return this._name;\n }\n /** Gets the current effect */\n get currentEffect() {\n return this._currentEffect;\n }\n _buffersEqual(e, t) {\n for (let i = 0; i < e.length; ++i)\n if (e[i] !== t[i])\n return !1;\n return !0;\n }\n _copyBuffer(e, t) {\n for (let i = 0; i < e.length; ++i)\n t[i] = e[i];\n }\n /**\n * Updates the WebGL Uniform Buffer on the GPU.\n * If the `dynamic` flag is set to true, no cache comparison is done.\n * Otherwise, the buffer will be updated only if the cache differs.\n */\n update() {\n if (!this._noUBO) {\n if (this.bindUniformBuffer(), !this._buffer) {\n this.create();\n return;\n }\n if (!this._dynamic && !this._needSync) {\n this._createBufferOnWrite = this._engine._features.trackUbosInFrame;\n return;\n }\n if (this._buffers && this._buffers.length > 1 && this._buffers[this._bufferIndex][1])\n if (this._buffersEqual(this._bufferData, this._buffers[this._bufferIndex][1])) {\n this._needSync = !1, this._createBufferOnWrite = this._engine._features.trackUbosInFrame;\n return;\n } else\n this._copyBuffer(this._bufferData, this._buffers[this._bufferIndex][1]);\n this._engine.updateUniformBuffer(this._buffer, this._bufferData), this._engine._features._collectUbosUpdatedInFrame && (Ie._UpdatedUbosInFrame[this._name] || (Ie._UpdatedUbosInFrame[this._name] = 0), Ie._UpdatedUbosInFrame[this._name]++), this._needSync = !1, this._createBufferOnWrite = this._engine._features.trackUbosInFrame;\n }\n }\n _createNewBuffer() {\n this._bufferIndex + 1 < this._buffers.length ? (this._bufferIndex++, this._buffer = this._buffers[this._bufferIndex][0], this._createBufferOnWrite = !1, this._needSync = !0) : this._rebuild();\n }\n _checkNewFrame() {\n this._engine._features.trackUbosInFrame && this._currentFrameId !== this._engine.frameId && (this._currentFrameId = this._engine.frameId, this._createBufferOnWrite = !1, this._buffers && this._buffers.length > 0 ? (this._needSync = this._bufferIndex !== 0, this._bufferIndex = 0, this._buffer = this._buffers[this._bufferIndex][0]) : this._bufferIndex = -1);\n }\n /**\n * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU.\n * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.\n * @param data Define the flattened data\n * @param size Define the size of the data.\n */\n updateUniform(e, t, i) {\n this._checkNewFrame();\n let r = this._uniformLocations[e];\n if (r === void 0) {\n if (this._buffer) {\n ne.Error(\"Cannot add an uniform after UBO has been created. uniformName=\" + e);\n return;\n }\n this.addUniform(e, i), r = this._uniformLocations[e];\n }\n if (this._buffer || this.create(), this._dynamic)\n for (let s = 0; s < i; s++)\n this._bufferData[r + s] = t[s];\n else {\n let s = !1;\n for (let a = 0; a < i; a++)\n (i === 16 && !this._engine._features.uniformBufferHardCheckMatrix || this._bufferData[r + a] !== Math.fround(t[a])) && (s = !0, this._createBufferOnWrite && this._createNewBuffer(), this._bufferData[r + a] = t[a]);\n this._needSync = this._needSync || s;\n }\n }\n /**\n * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU.\n * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.\n * @param data Define the flattened data\n * @param size Define the size of the data.\n */\n updateUniformArray(e, t, i) {\n this._checkNewFrame();\n const r = this._uniformLocations[e];\n if (r === void 0) {\n ne.Error(\"Cannot add an uniform Array dynamically. Please, add it using addUniform and make sure that uniform buffers are supported by the current engine.\");\n return;\n }\n this._buffer || this.create();\n const s = this._uniformArraySizes[e];\n if (this._dynamic)\n for (let a = 0; a < i; a++)\n this._bufferData[r + a] = t[a];\n else {\n let a = !1, o = 0, l = 0;\n for (let c = 0; c < i; c++)\n if (this._bufferData[r + l * 4 + o] !== ge.FloatRound(t[c]) && (a = !0, this._createBufferOnWrite && this._createNewBuffer(), this._bufferData[r + l * 4 + o] = t[c]), o++, o === s.strideSize) {\n for (; o < 4; o++)\n this._bufferData[r + l * 4 + o] = 0;\n o = 0, l++;\n }\n this._needSync = this._needSync || a;\n }\n }\n _cacheMatrix(e, t) {\n this._checkNewFrame();\n const i = this._valueCache[e], r = t.updateFlag;\n return i !== void 0 && i === r ? !1 : (this._valueCache[e] = r, !0);\n }\n // Update methods\n _updateMatrix3x3ForUniform(e, t) {\n for (let i = 0; i < 3; i++)\n Ie._TempBuffer[i * 4] = t[i * 3], Ie._TempBuffer[i * 4 + 1] = t[i * 3 + 1], Ie._TempBuffer[i * 4 + 2] = t[i * 3 + 2], Ie._TempBuffer[i * 4 + 3] = 0;\n this.updateUniform(e, Ie._TempBuffer, 12);\n }\n _updateMatrix3x3ForEffect(e, t) {\n this._currentEffect.setMatrix3x3(e, t);\n }\n _updateMatrix2x2ForEffect(e, t) {\n this._currentEffect.setMatrix2x2(e, t);\n }\n _updateMatrix2x2ForUniform(e, t) {\n for (let i = 0; i < 2; i++)\n Ie._TempBuffer[i * 4] = t[i * 2], Ie._TempBuffer[i * 4 + 1] = t[i * 2 + 1], Ie._TempBuffer[i * 4 + 2] = 0, Ie._TempBuffer[i * 4 + 3] = 0;\n this.updateUniform(e, Ie._TempBuffer, 8);\n }\n _updateFloatForEffect(e, t) {\n this._currentEffect.setFloat(e, t);\n }\n _updateFloatForUniform(e, t) {\n Ie._TempBuffer[0] = t, this.updateUniform(e, Ie._TempBuffer, 1);\n }\n _updateFloat2ForEffect(e, t, i, r = \"\") {\n this._currentEffect.setFloat2(e + r, t, i);\n }\n _updateFloat2ForUniform(e, t, i) {\n Ie._TempBuffer[0] = t, Ie._TempBuffer[1] = i, this.updateUniform(e, Ie._TempBuffer, 2);\n }\n _updateFloat3ForEffect(e, t, i, r, s = \"\") {\n this._currentEffect.setFloat3(e + s, t, i, r);\n }\n _updateFloat3ForUniform(e, t, i, r) {\n Ie._TempBuffer[0] = t, Ie._TempBuffer[1] = i, Ie._TempBuffer[2] = r, this.updateUniform(e, Ie._TempBuffer, 3);\n }\n _updateFloat4ForEffect(e, t, i, r, s, a = \"\") {\n this._currentEffect.setFloat4(e + a, t, i, r, s);\n }\n _updateFloat4ForUniform(e, t, i, r, s) {\n Ie._TempBuffer[0] = t, Ie._TempBuffer[1] = i, Ie._TempBuffer[2] = r, Ie._TempBuffer[3] = s, this.updateUniform(e, Ie._TempBuffer, 4);\n }\n _updateFloatArrayForEffect(e, t) {\n this._currentEffect.setFloatArray(e, t);\n }\n _updateFloatArrayForUniform(e, t) {\n this.updateUniformArray(e, t, t.length);\n }\n _updateArrayForEffect(e, t) {\n this._currentEffect.setArray(e, t);\n }\n _updateArrayForUniform(e, t) {\n this.updateUniformArray(e, t, t.length);\n }\n _updateIntArrayForEffect(e, t) {\n this._currentEffect.setIntArray(e, t);\n }\n _updateIntArrayForUniform(e, t) {\n Ie._TempBufferInt32View.set(t), this.updateUniformArray(e, Ie._TempBuffer, t.length);\n }\n _updateUIntArrayForEffect(e, t) {\n this._currentEffect.setUIntArray(e, t);\n }\n _updateUIntArrayForUniform(e, t) {\n Ie._TempBufferUInt32View.set(t), this.updateUniformArray(e, Ie._TempBuffer, t.length);\n }\n _updateMatrixForEffect(e, t) {\n this._currentEffect.setMatrix(e, t);\n }\n _updateMatrixForUniform(e, t) {\n this._cacheMatrix(e, t) && this.updateUniform(e, t.asArray(), 16);\n }\n _updateMatricesForEffect(e, t) {\n this._currentEffect.setMatrices(e, t);\n }\n _updateMatricesForUniform(e, t) {\n this.updateUniform(e, t, t.length);\n }\n _updateVector3ForEffect(e, t) {\n this._currentEffect.setVector3(e, t);\n }\n _updateVector3ForUniform(e, t) {\n Ie._TempBuffer[0] = t.x, Ie._TempBuffer[1] = t.y, Ie._TempBuffer[2] = t.z, this.updateUniform(e, Ie._TempBuffer, 3);\n }\n _updateVector4ForEffect(e, t) {\n this._currentEffect.setVector4(e, t);\n }\n _updateVector4ForUniform(e, t) {\n Ie._TempBuffer[0] = t.x, Ie._TempBuffer[1] = t.y, Ie._TempBuffer[2] = t.z, Ie._TempBuffer[3] = t.w, this.updateUniform(e, Ie._TempBuffer, 4);\n }\n _updateColor3ForEffect(e, t, i = \"\") {\n this._currentEffect.setColor3(e + i, t);\n }\n _updateColor3ForUniform(e, t) {\n Ie._TempBuffer[0] = t.r, Ie._TempBuffer[1] = t.g, Ie._TempBuffer[2] = t.b, this.updateUniform(e, Ie._TempBuffer, 3);\n }\n _updateColor4ForEffect(e, t, i, r = \"\") {\n this._currentEffect.setColor4(e + r, t, i);\n }\n _updateDirectColor4ForEffect(e, t, i = \"\") {\n this._currentEffect.setDirectColor4(e + i, t);\n }\n _updateColor4ForUniform(e, t, i) {\n Ie._TempBuffer[0] = t.r, Ie._TempBuffer[1] = t.g, Ie._TempBuffer[2] = t.b, Ie._TempBuffer[3] = i, this.updateUniform(e, Ie._TempBuffer, 4);\n }\n _updateDirectColor4ForUniform(e, t) {\n Ie._TempBuffer[0] = t.r, Ie._TempBuffer[1] = t.g, Ie._TempBuffer[2] = t.b, Ie._TempBuffer[3] = t.a, this.updateUniform(e, Ie._TempBuffer, 4);\n }\n _updateIntForEffect(e, t, i = \"\") {\n this._currentEffect.setInt(e + i, t);\n }\n _updateIntForUniform(e, t) {\n Ie._TempBufferInt32View[0] = t, this.updateUniform(e, Ie._TempBuffer, 1);\n }\n _updateInt2ForEffect(e, t, i, r = \"\") {\n this._currentEffect.setInt2(e + r, t, i);\n }\n _updateInt2ForUniform(e, t, i) {\n Ie._TempBufferInt32View[0] = t, Ie._TempBufferInt32View[1] = i, this.updateUniform(e, Ie._TempBuffer, 2);\n }\n _updateInt3ForEffect(e, t, i, r, s = \"\") {\n this._currentEffect.setInt3(e + s, t, i, r);\n }\n _updateInt3ForUniform(e, t, i, r) {\n Ie._TempBufferInt32View[0] = t, Ie._TempBufferInt32View[1] = i, Ie._TempBufferInt32View[2] = r, this.updateUniform(e, Ie._TempBuffer, 3);\n }\n _updateInt4ForEffect(e, t, i, r, s, a = \"\") {\n this._currentEffect.setInt4(e + a, t, i, r, s);\n }\n _updateInt4ForUniform(e, t, i, r, s) {\n Ie._TempBufferInt32View[0] = t, Ie._TempBufferInt32View[1] = i, Ie._TempBufferInt32View[2] = r, Ie._TempBufferInt32View[3] = s, this.updateUniform(e, Ie._TempBuffer, 4);\n }\n _updateUIntForEffect(e, t, i = \"\") {\n this._currentEffect.setUInt(e + i, t);\n }\n _updateUIntForUniform(e, t) {\n Ie._TempBufferUInt32View[0] = t, this.updateUniform(e, Ie._TempBuffer, 1);\n }\n _updateUInt2ForEffect(e, t, i, r = \"\") {\n this._currentEffect.setUInt2(e + r, t, i);\n }\n _updateUInt2ForUniform(e, t, i) {\n Ie._TempBufferUInt32View[0] = t, Ie._TempBufferUInt32View[1] = i, this.updateUniform(e, Ie._TempBuffer, 2);\n }\n _updateUInt3ForEffect(e, t, i, r, s = \"\") {\n this._currentEffect.setUInt3(e + s, t, i, r);\n }\n _updateUInt3ForUniform(e, t, i, r) {\n Ie._TempBufferUInt32View[0] = t, Ie._TempBufferUInt32View[1] = i, Ie._TempBufferUInt32View[2] = r, this.updateUniform(e, Ie._TempBuffer, 3);\n }\n _updateUInt4ForEffect(e, t, i, r, s, a = \"\") {\n this._currentEffect.setUInt4(e + a, t, i, r, s);\n }\n _updateUInt4ForUniform(e, t, i, r, s) {\n Ie._TempBufferUInt32View[0] = t, Ie._TempBufferUInt32View[1] = i, Ie._TempBufferUInt32View[2] = r, Ie._TempBufferUInt32View[3] = s, this.updateUniform(e, Ie._TempBuffer, 4);\n }\n /**\n * Sets a sampler uniform on the effect.\n * @param name Define the name of the sampler.\n * @param texture Define the texture to set in the sampler\n */\n setTexture(e, t) {\n this._currentEffect.setTexture(e, t);\n }\n /**\n * Sets a sampler uniform on the effect.\n * @param name Define the name of the sampler.\n * @param texture Define the (internal) texture to set in the sampler\n */\n bindTexture(e, t) {\n this._currentEffect._bindTexture(e, t);\n }\n /**\n * Directly updates the value of the uniform in the cache AND on the GPU.\n * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.\n * @param data Define the flattened data\n */\n updateUniformDirectly(e, t) {\n this.updateUniform(e, t, t.length), this.update();\n }\n /**\n * Associates an effect to this uniform buffer\n * @param effect Define the effect to associate the buffer to\n * @param name Name of the uniform block in the shader.\n */\n bindToEffect(e, t) {\n this._currentEffect = e, this._currentEffectName = t;\n }\n /**\n * Binds the current (GPU) buffer to the effect\n */\n bindUniformBuffer() {\n !this._noUBO && this._buffer && this._currentEffect && this._currentEffect.bindUniformBuffer(this._buffer, this._currentEffectName);\n }\n /**\n * Dissociates the current effect from this uniform buffer\n */\n unbindEffect() {\n this._currentEffect = void 0, this._currentEffectName = void 0;\n }\n /**\n * Sets the current state of the class (_bufferIndex, _buffer) to point to the data buffer passed in parameter if this buffer is one of the buffers handled by the class (meaning if it can be found in the _buffers array)\n * This method is meant to be able to update a buffer at any time: just call setDataBuffer to set the class in the right state, call some updateXXX methods and then call udpate() => that will update the GPU buffer on the graphic card\n * @param dataBuffer buffer to look for\n * @returns true if the buffer has been found and the class internal state points to it, else false\n */\n setDataBuffer(e) {\n if (!this._buffers)\n return this._buffer === e;\n for (let t = 0; t < this._buffers.length; ++t)\n if (this._buffers[t][0] === e)\n return this._bufferIndex = t, this._buffer = e, this._createBufferOnWrite = !1, this._currentEffect = void 0, !0;\n return !1;\n }\n /**\n * Disposes the uniform buffer.\n */\n dispose() {\n if (this._noUBO)\n return;\n const e = this._engine._uniformBuffers, t = e.indexOf(this);\n if (t !== -1 && (e[t] = e[e.length - 1], e.pop()), this._engine._features.trackUbosInFrame && this._buffers)\n for (let i = 0; i < this._buffers.length; ++i) {\n const r = this._buffers[i][0];\n this._engine._releaseBuffer(r);\n }\n else\n this._buffer && this._engine._releaseBuffer(this._buffer) && (this._buffer = null);\n }\n}\nIe._UpdatedUbosInFrame = {};\nIe._MAX_UNIFORM_SIZE = 256;\nIe._TempBuffer = new Float32Array(Ie._MAX_UNIFORM_SIZE);\nIe._TempBufferInt32View = new Int32Array(Ie._TempBuffer.buffer);\nIe._TempBufferUInt32View = new Uint32Array(Ie._TempBuffer.buffer);\nlet fr = class {\n /**\n * Gets a boolean indicating if the Buffer is disposed\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Constructor\n * @param engine the engine\n * @param data the data to use for this buffer\n * @param updatable whether the data is updatable\n * @param stride the stride (optional)\n * @param postponeInternalCreation whether to postpone creating the internal WebGL buffer (optional)\n * @param instanced whether the buffer is instanced (optional)\n * @param useBytes set to true if the stride in in bytes (optional)\n * @param divisor sets an optional divisor for instances (1 by default)\n * @param label defines the label of the buffer (for debug purpose)\n */\n constructor(e, t, i, r = 0, s = !1, a = !1, o = !1, l, c) {\n this._isAlreadyOwned = !1, this._isDisposed = !1, e && e.getScene ? this._engine = e.getScene().getEngine() : this._engine = e, this._updatable = i, this._instanced = a, this._divisor = l || 1, this._label = c, t instanceof Wo ? (this._data = null, this._buffer = t) : (this._data = t, this._buffer = null), this.byteStride = o ? r : r * Float32Array.BYTES_PER_ELEMENT, s || this.create();\n }\n /**\n * Create a new VertexBuffer based on the current buffer\n * @param kind defines the vertex buffer kind (position, normal, etc.)\n * @param offset defines offset in the buffer (0 by default)\n * @param size defines the size in floats of attributes (position is 3 for instance)\n * @param stride defines the stride size in floats in the buffer (the offset to apply to reach next value when data is interleaved)\n * @param instanced defines if the vertex buffer contains indexed data\n * @param useBytes defines if the offset and stride are in bytes *\n * @param divisor sets an optional divisor for instances (1 by default)\n * @returns the new vertex buffer\n */\n createVertexBuffer(e, t, i, r, s, a = !1, o) {\n const l = a ? t : t * Float32Array.BYTES_PER_ELEMENT, c = r ? a ? r : r * Float32Array.BYTES_PER_ELEMENT : this.byteStride;\n return new I(this._engine, this, e, this._updatable, !0, c, s === void 0 ? this._instanced : s, l, i, void 0, void 0, !0, this._divisor || o);\n }\n // Properties\n /**\n * Gets a boolean indicating if the Buffer is updatable?\n * @returns true if the buffer is updatable\n */\n isUpdatable() {\n return this._updatable;\n }\n /**\n * Gets current buffer's data\n * @returns a DataArray or null\n */\n getData() {\n return this._data;\n }\n /**\n * Gets underlying native buffer\n * @returns underlying native buffer\n */\n getBuffer() {\n return this._buffer;\n }\n /**\n * Gets the stride in float32 units (i.e. byte stride / 4).\n * May not be an integer if the byte stride is not divisible by 4.\n * @returns the stride in float32 units\n * @deprecated Please use byteStride instead.\n */\n getStrideSize() {\n return this.byteStride / Float32Array.BYTES_PER_ELEMENT;\n }\n // Methods\n /**\n * Store data into the buffer. Creates the buffer if not used already.\n * If the buffer was already used, it will be updated only if it is updatable, otherwise it will do nothing.\n * @param data defines the data to store\n */\n create(e = null) {\n !e && this._buffer || (e = e || this._data, e && (this._buffer ? this._updatable && (this._engine.updateDynamicVertexBuffer(this._buffer, e), this._data = e) : this._updatable ? (this._buffer = this._engine.createDynamicVertexBuffer(e, this._label), this._data = e) : this._buffer = this._engine.createVertexBuffer(e, void 0, this._label)));\n }\n /** @internal */\n _rebuild() {\n if (this._data)\n this._buffer = null, this.create(this._data);\n else {\n if (!this._buffer)\n return;\n if (this._buffer.capacity > 0) {\n this._updatable ? this._buffer = this._engine.createDynamicVertexBuffer(this._buffer.capacity, this._label) : this._buffer = this._engine.createVertexBuffer(this._buffer.capacity, void 0, this._label);\n return;\n }\n ne.Warn(`Missing data for buffer \"${this._label}\" ${this._buffer ? \"(uniqueId: \" + this._buffer.uniqueId + \")\" : \"\"}. Buffer reconstruction failed.`), this._buffer = null;\n }\n }\n /**\n * Update current buffer data\n * @param data defines the data to store\n */\n update(e) {\n this.create(e);\n }\n /**\n * Updates the data directly.\n * @param data the new data\n * @param offset the new offset\n * @param vertexCount the vertex count (optional)\n * @param useBytes set to true if the offset is in bytes\n */\n updateDirectly(e, t, i, r = !1) {\n this._buffer && this._updatable && (this._engine.updateDynamicVertexBuffer(this._buffer, e, r ? t : t * Float32Array.BYTES_PER_ELEMENT, i ? i * this.byteStride : void 0), t === 0 && i === void 0 ? this._data = e : this._data = null);\n }\n /** @internal */\n _increaseReferences() {\n if (this._buffer) {\n if (!this._isAlreadyOwned) {\n this._isAlreadyOwned = !0;\n return;\n }\n this._buffer.references++;\n }\n }\n /**\n * Release all resources\n */\n dispose() {\n this._buffer && this._engine._releaseBuffer(this._buffer) && (this._isDisposed = !0, this._data = null, this._buffer = null);\n }\n};\nclass I {\n /**\n * Gets a boolean indicating if the Buffer is disposed\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Gets or sets the instance divisor when in instanced mode\n */\n get instanceDivisor() {\n return this._instanceDivisor;\n }\n set instanceDivisor(e) {\n const t = e != 0;\n this._instanceDivisor = e, t !== this._instanced && (this._instanced = t, this._computeHashCode());\n }\n /**\n * Gets the max possible amount of vertices stored within the current vertex buffer.\n * We do not have the end offset or count so this will be too big for concatenated vertex buffers.\n * @internal\n */\n get _maxVerticesCount() {\n const e = this.getData();\n return e ? Array.isArray(e) ? e.length / (this.byteStride / 4) - this.byteOffset / 4 : (e.byteLength - this.byteOffset) / this.byteStride : 0;\n }\n /** @internal */\n constructor(e, t, i, r, s, a, o, l, c, h, u = !1, f = !1, d = 1, p = !1) {\n this._isDisposed = !1;\n let g = !1;\n if (this.engine = e, typeof r == \"object\" && r !== null ? (g = r.updatable ?? !1, s = r.postponeInternalCreation, a = r.stride, o = r.instanced, l = r.offset, c = r.size, h = r.type, u = r.normalized ?? !1, f = r.useBytes ?? !1, d = r.divisor ?? 1, p = r.takeBufferOwnership ?? !1, this._label = r.label) : g = !!r, t instanceof fr ? (this._buffer = t, this._ownsBuffer = p) : (this._buffer = new fr(e, t, g, a, s, o, f, d, this._label), this._ownsBuffer = !0), this.uniqueId = I._Counter++, this._kind = i, h === void 0) {\n const v = this.getData();\n this.type = v ? I.GetDataType(v) : I.FLOAT;\n } else\n this.type = h;\n const m = I.GetTypeByteLength(this.type);\n f ? (this._size = c || (a ? a / m : I.DeduceStride(i)), this.byteStride = a || this._buffer.byteStride || this._size * m, this.byteOffset = l || 0) : (this._size = c || a || I.DeduceStride(i), this.byteStride = a ? a * m : this._buffer.byteStride || this._size * m, this.byteOffset = (l || 0) * m), this.normalized = u, this._instanced = o !== void 0 ? o : !1, this._instanceDivisor = o ? d : 0, this._alignBuffer(), this._computeHashCode();\n }\n _computeHashCode() {\n this.hashCode = (this.type - 5120 << 0) + ((this.normalized ? 1 : 0) << 3) + (this._size << 4) + ((this._instanced ? 1 : 0) << 6) + /* keep 5 bits free */\n (this.byteStride << 12);\n }\n /** @internal */\n _rebuild() {\n var e;\n (e = this._buffer) == null || e._rebuild();\n }\n /**\n * Returns the kind of the VertexBuffer (string)\n * @returns a string\n */\n getKind() {\n return this._kind;\n }\n // Properties\n /**\n * Gets a boolean indicating if the VertexBuffer is updatable?\n * @returns true if the buffer is updatable\n */\n isUpdatable() {\n return this._buffer.isUpdatable();\n }\n /**\n * Gets current buffer's data\n * @returns a DataArray or null\n */\n getData() {\n return this._buffer.getData();\n }\n /**\n * Gets current buffer's data as a float array. Float data is constructed if the vertex buffer data cannot be returned directly.\n * @param totalVertices number of vertices in the buffer to take into account\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\n * @returns a float array containing vertex data\n */\n getFloatData(e, t) {\n const i = this.getData();\n return i ? I.GetFloatData(i, this._size, this.type, this.byteOffset, this.byteStride, this.normalized, e, t) : null;\n }\n /**\n * Gets underlying native buffer\n * @returns underlying native buffer\n */\n getBuffer() {\n return this._buffer.getBuffer();\n }\n /**\n * Gets the Buffer instance that wraps the native GPU buffer\n * @returns the wrapper buffer\n */\n getWrapperBuffer() {\n return this._buffer;\n }\n /**\n * Gets the stride in float32 units (i.e. byte stride / 4).\n * May not be an integer if the byte stride is not divisible by 4.\n * @returns the stride in float32 units\n * @deprecated Please use byteStride instead.\n */\n getStrideSize() {\n return this.byteStride / I.GetTypeByteLength(this.type);\n }\n /**\n * Returns the offset as a multiple of the type byte length.\n * @returns the offset in bytes\n * @deprecated Please use byteOffset instead.\n */\n getOffset() {\n return this.byteOffset / I.GetTypeByteLength(this.type);\n }\n /**\n * Returns the number of components or the byte size per vertex attribute\n * @param sizeInBytes If true, returns the size in bytes or else the size in number of components of the vertex attribute (default: false)\n * @returns the number of components\n */\n getSize(e = !1) {\n return e ? this._size * I.GetTypeByteLength(this.type) : this._size;\n }\n /**\n * Gets a boolean indicating is the internal buffer of the VertexBuffer is instanced\n * @returns true if this buffer is instanced\n */\n getIsInstanced() {\n return this._instanced;\n }\n /**\n * Returns the instancing divisor, zero for non-instanced (integer).\n * @returns a number\n */\n getInstanceDivisor() {\n return this._instanceDivisor;\n }\n // Methods\n /**\n * Store data into the buffer. If the buffer was already used it will be either recreated or updated depending on isUpdatable property\n * @param data defines the data to store\n */\n create(e) {\n this._buffer.create(e), this._alignBuffer();\n }\n /**\n * Updates the underlying buffer according to the passed numeric array or Float32Array.\n * This function will create a new buffer if the current one is not updatable\n * @param data defines the data to store\n */\n update(e) {\n this._buffer.update(e), this._alignBuffer();\n }\n /**\n * Updates directly the underlying WebGLBuffer according to the passed numeric array or Float32Array.\n * Returns the directly updated WebGLBuffer.\n * @param data the new data\n * @param offset the new offset\n * @param useBytes set to true if the offset is in bytes\n */\n updateDirectly(e, t, i = !1) {\n this._buffer.updateDirectly(e, t, void 0, i), this._alignBuffer();\n }\n /**\n * Disposes the VertexBuffer and the underlying WebGLBuffer.\n */\n dispose() {\n this._ownsBuffer && this._buffer.dispose(), this._isDisposed = !0;\n }\n /**\n * Enumerates each value of this vertex buffer as numbers.\n * @param count the number of values to enumerate\n * @param callback the callback function called for each value\n */\n forEach(e, t) {\n I.ForEach(this._buffer.getData(), this.byteOffset, this.byteStride, this._size, this.type, e, this.normalized, t);\n }\n /** @internal */\n _alignBuffer() {\n }\n /**\n * Deduces the stride given a kind.\n * @param kind The kind string to deduce\n * @returns The deduced stride\n */\n static DeduceStride(e) {\n switch (e) {\n case I.UVKind:\n case I.UV2Kind:\n case I.UV3Kind:\n case I.UV4Kind:\n case I.UV5Kind:\n case I.UV6Kind:\n return 2;\n case I.NormalKind:\n case I.PositionKind:\n return 3;\n case I.ColorKind:\n case I.ColorInstanceKind:\n case I.MatricesIndicesKind:\n case I.MatricesIndicesExtraKind:\n case I.MatricesWeightsKind:\n case I.MatricesWeightsExtraKind:\n case I.TangentKind:\n return 4;\n default:\n throw new Error(\"Invalid kind '\" + e + \"'\");\n }\n }\n /**\n * Gets the vertex buffer type of the given data array.\n * @param data the data array\n * @returns the vertex buffer type\n */\n static GetDataType(e) {\n return e instanceof Int8Array ? I.BYTE : e instanceof Uint8Array ? I.UNSIGNED_BYTE : e instanceof Int16Array ? I.SHORT : e instanceof Uint16Array ? I.UNSIGNED_SHORT : e instanceof Int32Array ? I.INT : e instanceof Uint32Array ? I.UNSIGNED_INT : I.FLOAT;\n }\n /**\n * Gets the byte length of the given type.\n * @param type the type\n * @returns the number of bytes\n */\n static GetTypeByteLength(e) {\n switch (e) {\n case I.BYTE:\n case I.UNSIGNED_BYTE:\n return 1;\n case I.SHORT:\n case I.UNSIGNED_SHORT:\n return 2;\n case I.INT:\n case I.UNSIGNED_INT:\n case I.FLOAT:\n return 4;\n default:\n throw new Error(`Invalid type '${e}'`);\n }\n }\n /**\n * Enumerates each value of the given parameters as numbers.\n * @param data the data to enumerate\n * @param byteOffset the byte offset of the data\n * @param byteStride the byte stride of the data\n * @param componentCount the number of components per element\n * @param componentType the type of the component\n * @param count the number of values to enumerate\n * @param normalized whether the data is normalized\n * @param callback the callback function called for each value\n */\n static ForEach(e, t, i, r, s, a, o, l) {\n if (e instanceof Array) {\n let c = t / 4;\n const h = i / 4;\n for (let u = 0; u < a; u += r) {\n for (let f = 0; f < r; f++)\n l(e[c + f], u + f);\n c += h;\n }\n } else {\n const c = e instanceof ArrayBuffer ? new DataView(e) : new DataView(e.buffer, e.byteOffset, e.byteLength), h = I.GetTypeByteLength(s);\n for (let u = 0; u < a; u += r) {\n let f = t;\n for (let d = 0; d < r; d++) {\n const p = I._GetFloatValue(c, s, f, o);\n l(p, u + d), f += h;\n }\n t += i;\n }\n }\n }\n static _GetFloatValue(e, t, i, r) {\n switch (t) {\n case I.BYTE: {\n let s = e.getInt8(i);\n return r && (s = Math.max(s / 127, -1)), s;\n }\n case I.UNSIGNED_BYTE: {\n let s = e.getUint8(i);\n return r && (s = s / 255), s;\n }\n case I.SHORT: {\n let s = e.getInt16(i, !0);\n return r && (s = Math.max(s / 32767, -1)), s;\n }\n case I.UNSIGNED_SHORT: {\n let s = e.getUint16(i, !0);\n return r && (s = s / 65535), s;\n }\n case I.INT:\n return e.getInt32(i, !0);\n case I.UNSIGNED_INT:\n return e.getUint32(i, !0);\n case I.FLOAT:\n return e.getFloat32(i, !0);\n default:\n throw new Error(`Invalid component type ${t}`);\n }\n }\n /**\n * Gets the given data array as a float array. Float data is constructed if the data array cannot be returned directly.\n * @param data the input data array\n * @param size the number of components\n * @param type the component type\n * @param byteOffset the byte offset of the data\n * @param byteStride the byte stride of the data\n * @param normalized whether the data is normalized\n * @param totalVertices number of vertices in the buffer to take into account\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\n * @returns a float array containing vertex data\n */\n static GetFloatData(e, t, i, r, s, a, o, l) {\n const c = t * I.GetTypeByteLength(i), h = o * t;\n if (i !== I.FLOAT || s !== c) {\n const u = new Float32Array(h);\n return I.ForEach(e, r, s, t, i, h, a, (f, d) => u[d] = f), u;\n }\n if (!(e instanceof Array || e instanceof Float32Array) || r !== 0 || e.length !== h)\n if (e instanceof Array) {\n const u = r / 4;\n return e.slice(u, u + h);\n } else {\n if (e instanceof ArrayBuffer)\n return new Float32Array(e, r, h);\n {\n let u = e.byteOffset + r;\n if (l) {\n const d = new Float32Array(h), p = new Float32Array(e.buffer, u, h);\n return d.set(p), d;\n }\n const f = u % 4;\n return f && (u = Math.max(0, u - f)), new Float32Array(e.buffer, u, h);\n }\n }\n return l ? e.slice() : e;\n }\n}\nI._Counter = 0;\nI.BYTE = 5120;\nI.UNSIGNED_BYTE = 5121;\nI.SHORT = 5122;\nI.UNSIGNED_SHORT = 5123;\nI.INT = 5124;\nI.UNSIGNED_INT = 5125;\nI.FLOAT = 5126;\nI.PositionKind = \"position\";\nI.NormalKind = \"normal\";\nI.TangentKind = \"tangent\";\nI.UVKind = \"uv\";\nI.UV2Kind = \"uv2\";\nI.UV3Kind = \"uv3\";\nI.UV4Kind = \"uv4\";\nI.UV5Kind = \"uv5\";\nI.UV6Kind = \"uv6\";\nI.ColorKind = \"color\";\nI.ColorInstanceKind = \"instanceColor\";\nI.MatricesIndicesKind = \"matricesIndices\";\nI.MatricesWeightsKind = \"matricesWeights\";\nI.MatricesIndicesExtraKind = \"matricesIndicesExtra\";\nI.MatricesWeightsExtraKind = \"matricesWeightsExtra\";\nclass ps {\n constructor() {\n this.hit = !1, this.distance = 0, this.pickedPoint = null, this.pickedMesh = null, this.bu = 0, this.bv = 0, this.faceId = -1, this.subMeshFaceId = -1, this.subMeshId = 0, this.pickedSprite = null, this.thinInstanceIndex = -1, this.ray = null, this.originMesh = null, this.aimTransform = null, this.gripTransform = null;\n }\n /**\n * Gets the normal corresponding to the face the pick collided with\n * @param useWorldCoordinates If the resulting normal should be relative to the world (default: false)\n * @param useVerticesNormals If the vertices normals should be used to calculate the normal instead of the normal map (default: true)\n * @returns The normal corresponding to the face the pick collided with\n * @remarks Note that the returned normal will always point towards the picking ray.\n */\n getNormal(e = !1, t = !0) {\n if (!this.pickedMesh || t && !this.pickedMesh.isVerticesDataPresent(I.NormalKind))\n return null;\n let i = this.pickedMesh.getIndices();\n (i == null ? void 0 : i.length) === 0 && (i = null);\n let r;\n const s = z.Vector3[0], a = z.Vector3[1], o = z.Vector3[2];\n if (t) {\n const c = this.pickedMesh.getVerticesData(I.NormalKind);\n let h = i ? _.FromArrayToRef(c, i[this.faceId * 3] * 3, s) : s.copyFromFloats(c[this.faceId * 3 * 3], c[this.faceId * 3 * 3 + 1], c[this.faceId * 3 * 3 + 2]), u = i ? _.FromArrayToRef(c, i[this.faceId * 3 + 1] * 3, a) : a.copyFromFloats(c[(this.faceId * 3 + 1) * 3], c[(this.faceId * 3 + 1) * 3 + 1], c[(this.faceId * 3 + 1) * 3 + 2]), f = i ? _.FromArrayToRef(c, i[this.faceId * 3 + 2] * 3, o) : o.copyFromFloats(c[(this.faceId * 3 + 2) * 3], c[(this.faceId * 3 + 2) * 3 + 1], c[(this.faceId * 3 + 2) * 3 + 2]);\n h = h.scale(this.bu), u = u.scale(this.bv), f = f.scale(1 - this.bu - this.bv), r = new _(h.x + u.x + f.x, h.y + u.y + f.y, h.z + u.z + f.z);\n } else {\n const c = this.pickedMesh.getVerticesData(I.PositionKind), h = i ? _.FromArrayToRef(c, i[this.faceId * 3] * 3, s) : s.copyFromFloats(c[this.faceId * 3 * 3], c[this.faceId * 3 * 3 + 1], c[this.faceId * 3 * 3 + 2]), u = i ? _.FromArrayToRef(c, i[this.faceId * 3 + 1] * 3, a) : a.copyFromFloats(c[(this.faceId * 3 + 1) * 3], c[(this.faceId * 3 + 1) * 3 + 1], c[(this.faceId * 3 + 1) * 3 + 2]), f = i ? _.FromArrayToRef(c, i[this.faceId * 3 + 2] * 3, o) : o.copyFromFloats(c[(this.faceId * 3 + 2) * 3], c[(this.faceId * 3 + 2) * 3 + 1], c[(this.faceId * 3 + 2) * 3 + 2]), d = h.subtract(u), p = f.subtract(u);\n r = _.Cross(d, p);\n }\n const l = (c, h) => {\n let u = c.getWorldMatrix();\n c.nonUniformScaling && (z.Matrix[0].copyFrom(u), u = z.Matrix[0], u.setTranslationFromFloats(0, 0, 0), u.invert(), u.transposeToRef(z.Matrix[1]), u = z.Matrix[1]), _.TransformNormalToRef(h, u, h);\n };\n if (e && l(this.pickedMesh, r), this.ray) {\n const c = z.Vector3[0].copyFrom(r);\n e || l(this.pickedMesh, c), _.Dot(c, this.ray.direction) > 0 && r.negateInPlace();\n }\n return r.normalize(), r;\n }\n /**\n * Gets the texture coordinates of where the pick occurred\n * @param uvSet The UV set to use to calculate the texture coordinates (default: VertexBuffer.UVKind)\n * @returns The vector containing the coordinates of the texture\n */\n getTextureCoordinates(e = I.UVKind) {\n if (!this.pickedMesh || !this.pickedMesh.isVerticesDataPresent(e))\n return null;\n const t = this.pickedMesh.getIndices();\n if (!t)\n return null;\n const i = this.pickedMesh.getVerticesData(e);\n if (!i)\n return null;\n let r = me.FromArray(i, t[this.faceId * 3] * 2), s = me.FromArray(i, t[this.faceId * 3 + 1] * 2), a = me.FromArray(i, t[this.faceId * 3 + 2] * 2);\n return r = r.scale(this.bu), s = s.scale(this.bv), a = a.scale(1 - this.bu - this.bv), new me(r.x + s.x + a.x, r.y + s.y + a.y);\n }\n}\nclass Ci {\n /**\n * Creates a new ActionEvent\n * @param source The mesh or sprite that triggered the action\n * @param pointerX The X mouse cursor position at the time of the event\n * @param pointerY The Y mouse cursor position at the time of the event\n * @param meshUnderPointer The mesh that is currently pointed at (can be null)\n * @param sourceEvent the original (browser) event that triggered the ActionEvent\n * @param additionalData additional data for the event\n */\n constructor(e, t, i, r, s, a) {\n this.source = e, this.pointerX = t, this.pointerY = i, this.meshUnderPointer = r, this.sourceEvent = s, this.additionalData = a;\n }\n /**\n * Helper function to auto-create an ActionEvent from a source mesh.\n * @param source The source mesh that triggered the event\n * @param evt The original (browser) event\n * @param additionalData additional data for the event\n * @returns the new ActionEvent\n */\n static CreateNew(e, t, i) {\n const r = e.getScene();\n return new Ci(e, r.pointerX, r.pointerY, r.meshUnderPointer || e, t, i);\n }\n /**\n * Helper function to auto-create an ActionEvent from a source sprite\n * @param source The source sprite that triggered the event\n * @param scene Scene associated with the sprite\n * @param evt The original (browser) event\n * @param additionalData additional data for the event\n * @returns the new ActionEvent\n */\n static CreateNewFromSprite(e, t, i, r) {\n return new Ci(e, t.pointerX, t.pointerY, t.meshUnderPointer, i, r);\n }\n /**\n * Helper function to auto-create an ActionEvent from a scene. If triggered by a mesh use ActionEvent.CreateNew\n * @param scene the scene where the event occurred\n * @param evt The original (browser) event\n * @returns the new ActionEvent\n */\n static CreateNewFromScene(e, t) {\n return new Ci(null, e.pointerX, e.pointerY, e.meshUnderPointer, t);\n }\n /**\n * Helper function to auto-create an ActionEvent from a primitive\n * @param prim defines the target primitive\n * @param pointerPos defines the pointer position\n * @param evt The original (browser) event\n * @param additionalData additional data for the event\n * @returns the new ActionEvent\n */\n static CreateNewFromPrimitive(e, t, i, r) {\n return new Ci(e, t.x, t.y, null, i, r);\n }\n}\nclass mu {\n /**\n * Creates a new instance PostProcess\n * @param scene The scene that the post process is associated with.\n */\n constructor(e) {\n this._vertexBuffers = {}, this._scene = e;\n }\n _prepareBuffers() {\n if (this._vertexBuffers[I.PositionKind])\n return;\n const e = [];\n e.push(1, 1), e.push(-1, 1), e.push(-1, -1), e.push(1, -1), this._vertexBuffers[I.PositionKind] = new I(this._scene.getEngine(), e, I.PositionKind, !1, !1, 2), this._buildIndexBuffer();\n }\n _buildIndexBuffer() {\n const e = [];\n e.push(0), e.push(1), e.push(2), e.push(0), e.push(2), e.push(3), this._indexBuffer = this._scene.getEngine().createIndexBuffer(e);\n }\n /**\n * Rebuilds the vertex buffers of the manager.\n * @internal\n */\n _rebuild() {\n const e = this._vertexBuffers[I.PositionKind];\n e && (e._rebuild(), this._buildIndexBuffer());\n }\n // Methods\n /**\n * Prepares a frame to be run through a post process.\n * @param sourceTexture The input texture to the post processes. (default: null)\n * @param postProcesses An array of post processes to be run. (default: null)\n * @returns True if the post processes were able to be run.\n * @internal\n */\n _prepareFrame(e = null, t = null) {\n const i = this._scene.activeCamera;\n return !i || (t = t || i._postProcesses.filter((r) => r != null), !t || t.length === 0 || !this._scene.postProcessesEnabled) ? !1 : (t[0].activate(i, e, t != null), !0);\n }\n /**\n * Manually render a set of post processes to a texture.\n * Please note, the frame buffer won't be unbound after the call in case you have more render to do.\n * @param postProcesses An array of post processes to be run.\n * @param targetTexture The render target wrapper to render to.\n * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight\n * @param faceIndex defines the face to render to if a cubemap is defined as the target\n * @param lodLevel defines which lod of the texture to render to\n * @param doNotBindFrambuffer If set to true, assumes that the framebuffer has been bound previously\n */\n directRender(e, t = null, i = !1, r = 0, s = 0, a = !1) {\n var l;\n const o = this._scene.getEngine();\n for (let c = 0; c < e.length; c++) {\n c < e.length - 1 ? e[c + 1].activate(this._scene.activeCamera, t == null ? void 0 : t.texture) : (t ? o.bindFramebuffer(t, r, void 0, void 0, i, s) : a || o.restoreDefaultFramebuffer(), (l = o._debugInsertMarker) == null || l.call(o, `post process ${e[c].name} output`));\n const h = e[c], u = h.apply();\n u && (h.onBeforeRenderObservable.notifyObservers(u), this._prepareBuffers(), o.bindBuffers(this._vertexBuffers, this._indexBuffer, u), o.drawElementsType(0, 0, 6), h.onAfterRenderObservable.notifyObservers(u));\n }\n o.setDepthBuffer(!0), o.setDepthWrite(!0);\n }\n /**\n * Finalize the result of the output of the postprocesses.\n * @param doNotPresent If true the result will not be displayed to the screen.\n * @param targetTexture The render target wrapper to render to.\n * @param faceIndex The index of the face to bind the target texture to.\n * @param postProcesses The array of post processes to render.\n * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight (default: false)\n * @internal\n */\n _finalizeFrame(e, t, i, r, s = !1) {\n var l;\n const a = this._scene.activeCamera;\n if (!a || (r = r || a._postProcesses.filter((c) => c != null), r.length === 0 || !this._scene.postProcessesEnabled))\n return;\n const o = this._scene.getEngine();\n for (let c = 0, h = r.length; c < h; c++) {\n const u = r[c];\n if (c < h - 1 ? u._outputTexture = r[c + 1].activate(a, t == null ? void 0 : t.texture) : (t ? (o.bindFramebuffer(t, i, void 0, void 0, s), u._outputTexture = t) : (o.restoreDefaultFramebuffer(), u._outputTexture = null), (l = o._debugInsertMarker) == null || l.call(o, `post process ${r[c].name} output`)), e)\n break;\n const f = u.apply();\n f && (u.onBeforeRenderObservable.notifyObservers(f), this._prepareBuffers(), o.bindBuffers(this._vertexBuffers, this._indexBuffer, f), o.drawElementsType(0, 0, 6), u.onAfterRenderObservable.notifyObservers(f));\n }\n o.setDepthBuffer(!0), o.setDepthWrite(!0), o.setAlphaMode(0);\n }\n /**\n * Disposes of the post process manager.\n */\n dispose() {\n const e = this._vertexBuffers[I.PositionKind];\n e && (e.dispose(), this._vertexBuffers[I.PositionKind] = null), this._indexBuffer && (this._scene.getEngine()._releaseBuffer(this._indexBuffer), this._indexBuffer = null);\n }\n}\nclass Hr {\n /**\n * Set the opaque sort comparison function.\n * If null the sub meshes will be render in the order they were created\n */\n set opaqueSortCompareFn(e) {\n e ? this._opaqueSortCompareFn = e : this._opaqueSortCompareFn = Hr.PainterSortCompare, this._renderOpaque = this._renderOpaqueSorted;\n }\n /**\n * Set the alpha test sort comparison function.\n * If null the sub meshes will be render in the order they were created\n */\n set alphaTestSortCompareFn(e) {\n e ? this._alphaTestSortCompareFn = e : this._alphaTestSortCompareFn = Hr.PainterSortCompare, this._renderAlphaTest = this._renderAlphaTestSorted;\n }\n /**\n * Set the transparent sort comparison function.\n * If null the sub meshes will be render in the order they were created\n */\n set transparentSortCompareFn(e) {\n e ? this._transparentSortCompareFn = e : this._transparentSortCompareFn = Hr.defaultTransparentSortCompare, this._renderTransparent = this._renderTransparentSorted;\n }\n /**\n * Creates a new rendering group.\n * @param index The rendering group index\n * @param scene\n * @param opaqueSortCompareFn The opaque sort comparison function. If null no order is applied\n * @param alphaTestSortCompareFn The alpha test sort comparison function. If null no order is applied\n * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied\n */\n constructor(e, t, i = null, r = null, s = null) {\n this.index = e, this._opaqueSubMeshes = new Li(256), this._transparentSubMeshes = new Li(256), this._alphaTestSubMeshes = new Li(256), this._depthOnlySubMeshes = new Li(256), this._particleSystems = new Li(256), this._spriteManagers = new Li(256), this._empty = !0, this._edgesRenderers = new xn(16), this._scene = t, this.opaqueSortCompareFn = i, this.alphaTestSortCompareFn = r, this.transparentSortCompareFn = s;\n }\n /**\n * Render all the sub meshes contained in the group.\n * @param customRenderFunction Used to override the default render behaviour of the group.\n * @param renderSprites\n * @param renderParticles\n * @param activeMeshes\n */\n render(e, t, i, r) {\n if (e) {\n e(this._opaqueSubMeshes, this._alphaTestSubMeshes, this._transparentSubMeshes, this._depthOnlySubMeshes);\n return;\n }\n const s = this._scene.getEngine();\n this._depthOnlySubMeshes.length !== 0 && (s.setColorWrite(!1), this._renderAlphaTest(this._depthOnlySubMeshes), s.setColorWrite(!0)), this._opaqueSubMeshes.length !== 0 && this._renderOpaque(this._opaqueSubMeshes), this._alphaTestSubMeshes.length !== 0 && this._renderAlphaTest(this._alphaTestSubMeshes);\n const a = s.getStencilBuffer();\n if (s.setStencilBuffer(!1), t && this._renderSprites(), i && this._renderParticles(r), this.onBeforeTransparentRendering && this.onBeforeTransparentRendering(), this._transparentSubMeshes.length !== 0 || this._scene.useOrderIndependentTransparency) {\n if (s.setStencilBuffer(a), this._scene.useOrderIndependentTransparency) {\n const o = this._scene.depthPeelingRenderer.render(this._transparentSubMeshes);\n o.length && this._renderTransparent(o);\n } else\n this._renderTransparent(this._transparentSubMeshes);\n s.setAlphaMode(0);\n }\n if (s.setStencilBuffer(!1), this._edgesRenderers.length) {\n for (let o = 0; o < this._edgesRenderers.length; o++)\n this._edgesRenderers.data[o].render();\n s.setAlphaMode(0);\n }\n s.setStencilBuffer(a);\n }\n /**\n * Renders the opaque submeshes in the order from the opaqueSortCompareFn.\n * @param subMeshes The submeshes to render\n */\n _renderOpaqueSorted(e) {\n Hr._RenderSorted(e, this._opaqueSortCompareFn, this._scene.activeCamera, !1);\n }\n /**\n * Renders the opaque submeshes in the order from the alphatestSortCompareFn.\n * @param subMeshes The submeshes to render\n */\n _renderAlphaTestSorted(e) {\n Hr._RenderSorted(e, this._alphaTestSortCompareFn, this._scene.activeCamera, !1);\n }\n /**\n * Renders the opaque submeshes in the order from the transparentSortCompareFn.\n * @param subMeshes The submeshes to render\n */\n _renderTransparentSorted(e) {\n Hr._RenderSorted(e, this._transparentSortCompareFn, this._scene.activeCamera, !0);\n }\n /**\n * Renders the submeshes in a specified order.\n * @param subMeshes The submeshes to sort before render\n * @param sortCompareFn The comparison function use to sort\n * @param camera The camera position use to preprocess the submeshes to help sorting\n * @param transparent Specifies to activate blending if true\n */\n static _RenderSorted(e, t, i, r) {\n let s = 0, a;\n const o = i ? i.globalPosition : Hr._ZeroVector;\n if (r)\n for (; s < e.length; s++)\n a = e.data[s], a._alphaIndex = a.getMesh().alphaIndex, a._distanceToCamera = _.Distance(a.getBoundingInfo().boundingSphere.centerWorld, o);\n const l = e.length === e.data.length ? e.data : e.data.slice(0, e.length);\n t && l.sort(t);\n const c = l[0].getMesh().getScene();\n for (s = 0; s < l.length; s++)\n if (a = l[s], !(c._activeMeshesFrozenButKeepClipping && !a.isInFrustum(c._frustumPlanes))) {\n if (r) {\n const h = a.getMaterial();\n if (h && h.needDepthPrePass) {\n const u = h.getScene().getEngine();\n u.setColorWrite(!1), u.setAlphaMode(0), a.render(!1), u.setColorWrite(!0);\n }\n }\n a.render(r);\n }\n }\n /**\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\n * are rendered back to front if in the same alpha index.\n *\n * @param a The first submesh\n * @param b The second submesh\n * @returns The result of the comparison\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static defaultTransparentSortCompare(e, t) {\n return e._alphaIndex > t._alphaIndex ? 1 : e._alphaIndex < t._alphaIndex ? -1 : Hr.backToFrontSortCompare(e, t);\n }\n /**\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\n * are rendered back to front.\n *\n * @param a The first submesh\n * @param b The second submesh\n * @returns The result of the comparison\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static backToFrontSortCompare(e, t) {\n return e._distanceToCamera < t._distanceToCamera ? 1 : e._distanceToCamera > t._distanceToCamera ? -1 : 0;\n }\n /**\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\n * are rendered front to back (prevent overdraw).\n *\n * @param a The first submesh\n * @param b The second submesh\n * @returns The result of the comparison\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static frontToBackSortCompare(e, t) {\n return e._distanceToCamera < t._distanceToCamera ? -1 : e._distanceToCamera > t._distanceToCamera ? 1 : 0;\n }\n /**\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\n * are grouped by material then geometry.\n *\n * @param a The first submesh\n * @param b The second submesh\n * @returns The result of the comparison\n */\n static PainterSortCompare(e, t) {\n const i = e.getMesh(), r = t.getMesh();\n return i.material && r.material ? i.material.uniqueId - r.material.uniqueId : i.uniqueId - r.uniqueId;\n }\n /**\n * Resets the different lists of submeshes to prepare a new frame.\n */\n prepare() {\n this._opaqueSubMeshes.reset(), this._transparentSubMeshes.reset(), this._alphaTestSubMeshes.reset(), this._depthOnlySubMeshes.reset(), this._particleSystems.reset(), this.prepareSprites(), this._edgesRenderers.reset(), this._empty = !0;\n }\n /**\n * Resets the different lists of sprites to prepare a new frame.\n */\n prepareSprites() {\n this._spriteManagers.reset();\n }\n dispose() {\n this._opaqueSubMeshes.dispose(), this._transparentSubMeshes.dispose(), this._alphaTestSubMeshes.dispose(), this._depthOnlySubMeshes.dispose(), this._particleSystems.dispose(), this._spriteManagers.dispose(), this._edgesRenderers.dispose();\n }\n /**\n * Inserts the submesh in its correct queue depending on its material.\n * @param subMesh The submesh to dispatch\n * @param [mesh] Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.\n * @param [material] Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.\n */\n dispatch(e, t, i) {\n t === void 0 && (t = e.getMesh()), i === void 0 && (i = e.getMaterial()), i != null && (i.needAlphaBlendingForMesh(t) ? this._transparentSubMeshes.push(e) : i.needAlphaTesting() ? (i.needDepthPrePass && this._depthOnlySubMeshes.push(e), this._alphaTestSubMeshes.push(e)) : (i.needDepthPrePass && this._depthOnlySubMeshes.push(e), this._opaqueSubMeshes.push(e)), t._renderingGroup = this, t._edgesRenderer && t._edgesRenderer.isEnabled && this._edgesRenderers.pushNoDuplicate(t._edgesRenderer), this._empty = !1);\n }\n dispatchSprites(e) {\n this._spriteManagers.push(e), this._empty = !1;\n }\n dispatchParticles(e) {\n this._particleSystems.push(e), this._empty = !1;\n }\n _renderParticles(e) {\n if (this._particleSystems.length === 0)\n return;\n const t = this._scene.activeCamera;\n this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene);\n for (let i = 0; i < this._particleSystems.length; i++) {\n const r = this._particleSystems.data[i];\n if ((t && t.layerMask & r.layerMask) === 0)\n continue;\n const s = r.emitter;\n (!s.position || !e || e.indexOf(s) !== -1) && this._scene._activeParticles.addCount(r.render(), !1);\n }\n this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene);\n }\n _renderSprites() {\n if (!this._scene.spritesEnabled || this._spriteManagers.length === 0)\n return;\n const e = this._scene.activeCamera;\n this._scene.onBeforeSpritesRenderingObservable.notifyObservers(this._scene);\n for (let t = 0; t < this._spriteManagers.length; t++) {\n const i = this._spriteManagers.data[t];\n (e && e.layerMask & i.layerMask) !== 0 && i.render();\n }\n this._scene.onAfterSpritesRenderingObservable.notifyObservers(this._scene);\n }\n}\nHr._ZeroVector = _.Zero();\nclass Py {\n}\nclass Di {\n /**\n * Gets or sets a boolean indicating that the manager will not reset between frames.\n * This means that if a mesh becomes invisible or transparent it will not be visible until this boolean is set to false again.\n * By default, the rendering manager will dispatch all active meshes per frame (moving them to the transparent, opaque or alpha testing lists).\n * By turning this property on, you will accelerate the rendering by keeping all these lists unchanged between frames.\n */\n get maintainStateBetweenFrames() {\n return this._maintainStateBetweenFrames;\n }\n set maintainStateBetweenFrames(e) {\n e !== this._maintainStateBetweenFrames && (this._maintainStateBetweenFrames = e, this._maintainStateBetweenFrames || this.restoreDispachedFlags());\n }\n /**\n * Restore wasDispatched flags on the lists of elements to render.\n */\n restoreDispachedFlags() {\n for (const e of this._scene.meshes)\n if (e.subMeshes)\n for (const t of e.subMeshes)\n t._wasDispatched = !1;\n if (this._scene.spriteManagers)\n for (const e of this._scene.spriteManagers)\n e._wasDispatched = !1;\n for (const e of this._scene.particleSystems)\n e._wasDispatched = !1;\n }\n /**\n * Instantiates a new rendering group for a particular scene\n * @param scene Defines the scene the groups belongs to\n */\n constructor(e) {\n this._useSceneAutoClearSetup = !1, this._renderingGroups = new Array(), this._autoClearDepthStencil = {}, this._customOpaqueSortCompareFn = {}, this._customAlphaTestSortCompareFn = {}, this._customTransparentSortCompareFn = {}, this._renderingGroupInfo = new Py(), this._maintainStateBetweenFrames = !1, this._scene = e;\n for (let t = Di.MIN_RENDERINGGROUPS; t < Di.MAX_RENDERINGGROUPS; t++)\n this._autoClearDepthStencil[t] = { autoClear: !0, depth: !0, stencil: !0 };\n }\n /**\n * @returns the rendering group with the specified id.\n * @param id the id of the rendering group (0 by default)\n */\n getRenderingGroup(e) {\n const t = e || 0;\n return this._prepareRenderingGroup(t), this._renderingGroups[t];\n }\n _clearDepthStencilBuffer(e = !0, t = !0) {\n this._depthStencilBufferAlreadyCleaned || (this._scene.getEngine().clear(null, !1, e, t), this._depthStencilBufferAlreadyCleaned = !0);\n }\n /**\n * Renders the entire managed groups. This is used by the scene or the different render targets.\n * @internal\n */\n render(e, t, i, r) {\n const s = this._renderingGroupInfo;\n if (s.scene = this._scene, s.camera = this._scene.activeCamera, this._scene.spriteManagers && r)\n for (let a = 0; a < this._scene.spriteManagers.length; a++) {\n const o = this._scene.spriteManagers[a];\n this.dispatchSprites(o);\n }\n for (let a = Di.MIN_RENDERINGGROUPS; a < Di.MAX_RENDERINGGROUPS; a++) {\n this._depthStencilBufferAlreadyCleaned = a === Di.MIN_RENDERINGGROUPS;\n const o = this._renderingGroups[a];\n if (!o || o._empty)\n continue;\n const l = 1 << a;\n if (s.renderingGroupId = a, this._scene.onBeforeRenderingGroupObservable.notifyObservers(s, l), Di.AUTOCLEAR) {\n const c = this._useSceneAutoClearSetup ? this._scene.getAutoClearDepthStencilSetup(a) : this._autoClearDepthStencil[a];\n c && c.autoClear && this._clearDepthStencilBuffer(c.depth, c.stencil);\n }\n for (const c of this._scene._beforeRenderingGroupDrawStage)\n c.action(a);\n o.render(e, r, i, t);\n for (const c of this._scene._afterRenderingGroupDrawStage)\n c.action(a);\n this._scene.onAfterRenderingGroupObservable.notifyObservers(s, l);\n }\n }\n /**\n * Resets the different information of the group to prepare a new frame\n * @internal\n */\n reset() {\n if (!this.maintainStateBetweenFrames)\n for (let e = Di.MIN_RENDERINGGROUPS; e < Di.MAX_RENDERINGGROUPS; e++) {\n const t = this._renderingGroups[e];\n t && t.prepare();\n }\n }\n /**\n * Resets the sprites information of the group to prepare a new frame\n * @internal\n */\n resetSprites() {\n if (!this.maintainStateBetweenFrames)\n for (let e = Di.MIN_RENDERINGGROUPS; e < Di.MAX_RENDERINGGROUPS; e++) {\n const t = this._renderingGroups[e];\n t && t.prepareSprites();\n }\n }\n /**\n * Dispose and release the group and its associated resources.\n * @internal\n */\n dispose() {\n this.freeRenderingGroups(), this._renderingGroups.length = 0, this._renderingGroupInfo = null;\n }\n /**\n * Clear the info related to rendering groups preventing retention points during dispose.\n */\n freeRenderingGroups() {\n for (let e = Di.MIN_RENDERINGGROUPS; e < Di.MAX_RENDERINGGROUPS; e++) {\n const t = this._renderingGroups[e];\n t && t.dispose();\n }\n }\n _prepareRenderingGroup(e) {\n this._renderingGroups[e] === void 0 && (this._renderingGroups[e] = new Hr(e, this._scene, this._customOpaqueSortCompareFn[e], this._customAlphaTestSortCompareFn[e], this._customTransparentSortCompareFn[e]));\n }\n /**\n * Add a sprite manager to the rendering manager in order to render it this frame.\n * @param spriteManager Define the sprite manager to render\n */\n dispatchSprites(e) {\n this.maintainStateBetweenFrames && e._wasDispatched || (e._wasDispatched = !0, this.getRenderingGroup(e.renderingGroupId).dispatchSprites(e));\n }\n /**\n * Add a particle system to the rendering manager in order to render it this frame.\n * @param particleSystem Define the particle system to render\n */\n dispatchParticles(e) {\n this.maintainStateBetweenFrames && e._wasDispatched || (e._wasDispatched = !0, this.getRenderingGroup(e.renderingGroupId).dispatchParticles(e));\n }\n /**\n * Add a submesh to the manager in order to render it this frame\n * @param subMesh The submesh to dispatch\n * @param mesh Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.\n * @param material Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.\n */\n dispatch(e, t, i) {\n t === void 0 && (t = e.getMesh()), !(this.maintainStateBetweenFrames && e._wasDispatched) && (e._wasDispatched = !0, this.getRenderingGroup(t.renderingGroupId).dispatch(e, t, i));\n }\n /**\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\n * This allowed control for front to back rendering or reversely depending of the special needs.\n *\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\n */\n setRenderingOrder(e, t = null, i = null, r = null) {\n if (this._customOpaqueSortCompareFn[e] = t, this._customAlphaTestSortCompareFn[e] = i, this._customTransparentSortCompareFn[e] = r, this._renderingGroups[e]) {\n const s = this._renderingGroups[e];\n s.opaqueSortCompareFn = this._customOpaqueSortCompareFn[e], s.alphaTestSortCompareFn = this._customAlphaTestSortCompareFn[e], s.transparentSortCompareFn = this._customTransparentSortCompareFn[e];\n }\n }\n /**\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\n *\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\n * @param depth Automatically clears depth between groups if true and autoClear is true.\n * @param stencil Automatically clears stencil between groups if true and autoClear is true.\n */\n setRenderingAutoClearDepthStencil(e, t, i = !0, r = !0) {\n this._autoClearDepthStencil[e] = {\n autoClear: t,\n depth: i,\n stencil: r\n };\n }\n /**\n * Gets the current auto clear configuration for one rendering group of the rendering\n * manager.\n * @param index the rendering group index to get the information for\n * @returns The auto clear setup for the requested rendering group\n */\n getAutoClearDepthStencilSetup(e) {\n return this._autoClearDepthStencil[e];\n }\n}\nDi.MAX_RENDERINGGROUPS = 4;\nDi.MIN_RENDERINGGROUPS = 0;\nDi.AUTOCLEAR = !0;\nclass ke {\n}\nke.NAME_EFFECTLAYER = \"EffectLayer\";\nke.NAME_LAYER = \"Layer\";\nke.NAME_LENSFLARESYSTEM = \"LensFlareSystem\";\nke.NAME_BOUNDINGBOXRENDERER = \"BoundingBoxRenderer\";\nke.NAME_PARTICLESYSTEM = \"ParticleSystem\";\nke.NAME_GAMEPAD = \"Gamepad\";\nke.NAME_SIMPLIFICATIONQUEUE = \"SimplificationQueue\";\nke.NAME_GEOMETRYBUFFERRENDERER = \"GeometryBufferRenderer\";\nke.NAME_PREPASSRENDERER = \"PrePassRenderer\";\nke.NAME_DEPTHRENDERER = \"DepthRenderer\";\nke.NAME_DEPTHPEELINGRENDERER = \"DepthPeelingRenderer\";\nke.NAME_POSTPROCESSRENDERPIPELINEMANAGER = \"PostProcessRenderPipelineManager\";\nke.NAME_SPRITE = \"Sprite\";\nke.NAME_SUBSURFACE = \"SubSurface\";\nke.NAME_OUTLINERENDERER = \"Outline\";\nke.NAME_PROCEDURALTEXTURE = \"ProceduralTexture\";\nke.NAME_SHADOWGENERATOR = \"ShadowGenerator\";\nke.NAME_OCTREE = \"Octree\";\nke.NAME_PHYSICSENGINE = \"PhysicsEngine\";\nke.NAME_AUDIO = \"Audio\";\nke.NAME_FLUIDRENDERER = \"FluidRenderer\";\nke.STEP_ISREADYFORMESH_EFFECTLAYER = 0;\nke.STEP_BEFOREEVALUATEACTIVEMESH_BOUNDINGBOXRENDERER = 0;\nke.STEP_EVALUATESUBMESH_BOUNDINGBOXRENDERER = 0;\nke.STEP_PREACTIVEMESH_BOUNDINGBOXRENDERER = 0;\nke.STEP_CAMERADRAWRENDERTARGET_EFFECTLAYER = 1;\nke.STEP_BEFORECAMERADRAW_PREPASS = 0;\nke.STEP_BEFORECAMERADRAW_EFFECTLAYER = 1;\nke.STEP_BEFORECAMERADRAW_LAYER = 2;\nke.STEP_BEFORERENDERTARGETDRAW_PREPASS = 0;\nke.STEP_BEFORERENDERTARGETDRAW_LAYER = 1;\nke.STEP_BEFORERENDERINGMESH_PREPASS = 0;\nke.STEP_BEFORERENDERINGMESH_OUTLINE = 1;\nke.STEP_AFTERRENDERINGMESH_PREPASS = 0;\nke.STEP_AFTERRENDERINGMESH_OUTLINE = 1;\nke.STEP_AFTERRENDERINGGROUPDRAW_EFFECTLAYER_DRAW = 0;\nke.STEP_AFTERRENDERINGGROUPDRAW_BOUNDINGBOXRENDERER = 1;\nke.STEP_BEFORECAMERAUPDATE_SIMPLIFICATIONQUEUE = 0;\nke.STEP_BEFORECAMERAUPDATE_GAMEPAD = 1;\nke.STEP_BEFORECLEAR_PROCEDURALTEXTURE = 0;\nke.STEP_BEFORECLEAR_PREPASS = 1;\nke.STEP_BEFORERENDERTARGETCLEAR_PREPASS = 0;\nke.STEP_AFTERRENDERTARGETDRAW_PREPASS = 0;\nke.STEP_AFTERRENDERTARGETDRAW_LAYER = 1;\nke.STEP_AFTERCAMERADRAW_PREPASS = 0;\nke.STEP_AFTERCAMERADRAW_EFFECTLAYER = 1;\nke.STEP_AFTERCAMERADRAW_LENSFLARESYSTEM = 2;\nke.STEP_AFTERCAMERADRAW_EFFECTLAYER_DRAW = 3;\nke.STEP_AFTERCAMERADRAW_LAYER = 4;\nke.STEP_AFTERCAMERADRAW_FLUIDRENDERER = 5;\nke.STEP_AFTERCAMERAPOSTPROCESS_LAYER = 0;\nke.STEP_AFTERRENDERTARGETPOSTPROCESS_LAYER = 0;\nke.STEP_AFTERRENDER_AUDIO = 0;\nke.STEP_GATHERRENDERTARGETS_DEPTHRENDERER = 0;\nke.STEP_GATHERRENDERTARGETS_GEOMETRYBUFFERRENDERER = 1;\nke.STEP_GATHERRENDERTARGETS_SHADOWGENERATOR = 2;\nke.STEP_GATHERRENDERTARGETS_POSTPROCESSRENDERPIPELINEMANAGER = 3;\nke.STEP_GATHERACTIVECAMERARENDERTARGETS_DEPTHRENDERER = 0;\nke.STEP_GATHERACTIVECAMERARENDERTARGETS_FLUIDRENDERER = 1;\nke.STEP_POINTERMOVE_SPRITE = 0;\nke.STEP_POINTERDOWN_SPRITE = 0;\nke.STEP_POINTERUP_SPRITE = 0;\nclass ei extends Array {\n /**\n * Hide ctor from the rest of the world.\n * @param items The items to add.\n */\n constructor(e) {\n super(...e);\n }\n /**\n * Creates a new Stage.\n * @returns A new instance of a Stage\n */\n static Create() {\n return Object.create(ei.prototype);\n }\n /**\n * Registers a step in an ordered way in the targeted stage.\n * @param index Defines the position to register the step in\n * @param component Defines the component attached to the step\n * @param action Defines the action to launch during the step\n */\n registerStep(e, t, i) {\n let r = 0, s = Number.MAX_VALUE;\n for (; r < this.length && (s = this[r].index, !(e < s)); r++)\n ;\n this.splice(r, 0, { index: e, component: t, action: i.bind(t) });\n }\n /**\n * Clears all the steps from the stage.\n */\n clear() {\n this.length = 0;\n }\n}\nclass pt {\n}\npt.POINTERDOWN = 1;\npt.POINTERUP = 2;\npt.POINTERMOVE = 4;\npt.POINTERWHEEL = 8;\npt.POINTERPICK = 16;\npt.POINTERTAP = 32;\npt.POINTERDOUBLETAP = 64;\nclass Y_ {\n /**\n * Instantiates the base class of pointers info.\n * @param type Defines the type of event (PointerEventTypes)\n * @param event Defines the related dom event\n */\n constructor(e, t) {\n this.type = e, this.event = t;\n }\n}\nclass Oy extends Y_ {\n /**\n * Instantiates a PointerInfoPre to store pointer related info to the onPrePointerObservable event.\n * @param type Defines the type of event (PointerEventTypes)\n * @param event Defines the related dom event\n * @param localX Defines the local x coordinates of the pointer when the event occured\n * @param localY Defines the local y coordinates of the pointer when the event occured\n */\n constructor(e, t, i, r) {\n super(e, t), this.ray = null, this.originalPickingInfo = null, this.skipOnPointerObservable = !1, this.localPosition = new me(i, r);\n }\n}\nclass Is extends Y_ {\n /**\n * Defines the picking info associated with this PointerInfo object (if applicable)\n */\n get pickInfo() {\n return this._pickInfo || this._generatePickInfo(), this._pickInfo;\n }\n /**\n * Instantiates a PointerInfo to store pointer related info to the onPointerObservable event.\n * @param type Defines the type of event (PointerEventTypes)\n * @param event Defines the related dom event\n * @param pickInfo Defines the picking info associated to the info (if any)\n * @param inputManager Defines the InputManager to use if there is no pickInfo\n */\n constructor(e, t, i, r = null) {\n super(e, t), this._pickInfo = i, this._inputManager = r;\n }\n /**\n * Generates the picking info if needed\n */\n /** @internal */\n _generatePickInfo() {\n this._inputManager && (this._pickInfo = this._inputManager._pickMove(this.event), this._inputManager._setRayOnPointerInfo(this._pickInfo, this.event), this._inputManager = null);\n }\n}\nclass xr {\n constructor() {\n this.hoverCursor = \"\", this.actions = [], this.isRecursive = !1;\n }\n /**\n * Does exist one action manager with at least one trigger\n **/\n static get HasTriggers() {\n for (const e in xr.Triggers)\n if (Object.prototype.hasOwnProperty.call(xr.Triggers, e))\n return !0;\n return !1;\n }\n /**\n * Does exist one action manager with at least one pick trigger\n **/\n static get HasPickTriggers() {\n for (const e in xr.Triggers)\n if (Object.prototype.hasOwnProperty.call(xr.Triggers, e)) {\n const t = parseInt(e);\n if (t >= 1 && t <= 7)\n return !0;\n }\n return !1;\n }\n /**\n * Does exist one action manager that handles actions of a given trigger\n * @param trigger defines the trigger to be tested\n * @returns a boolean indicating whether the trigger is handled by at least one action manager\n **/\n static HasSpecificTrigger(e) {\n for (const t in xr.Triggers)\n if (Object.prototype.hasOwnProperty.call(xr.Triggers, t) && parseInt(t) === e)\n return !0;\n return !1;\n }\n}\nxr.Triggers = {};\nclass tc {\n}\ntc.KEYDOWN = 1;\ntc.KEYUP = 2;\nclass _u {\n /**\n * Instantiates a new keyboard info.\n * This class is used to store keyboard related info for the onKeyboardObservable event.\n * @param type Defines the type of event (KeyboardEventTypes)\n * @param event Defines the related dom event\n */\n constructor(e, t) {\n this.type = e, this.event = t;\n }\n}\nclass Jp extends _u {\n /**\n * Defines whether the engine should skip the next onKeyboardObservable associated to this pre.\n * @deprecated use skipOnKeyboardObservable property instead\n */\n get skipOnPointerObservable() {\n return this.skipOnKeyboardObservable;\n }\n set skipOnPointerObservable(e) {\n this.skipOnKeyboardObservable = e;\n }\n /**\n * Instantiates a new keyboard pre info.\n * This class is used to store keyboard related info for the onPreKeyboardObservable event.\n * @param type Defines the type of event (KeyboardEventTypes)\n * @param event Defines the related dom event\n */\n constructor(e, t) {\n super(e, t), this.type = e, this.event = t, this.skipOnKeyboardObservable = !1;\n }\n}\nvar Pe;\n(function(n) {\n n[n.Generic = 0] = \"Generic\", n[n.Keyboard = 1] = \"Keyboard\", n[n.Mouse = 2] = \"Mouse\", n[n.Touch = 3] = \"Touch\", n[n.DualShock = 4] = \"DualShock\", n[n.Xbox = 5] = \"Xbox\", n[n.Switch = 6] = \"Switch\", n[n.DualSense = 7] = \"DualSense\";\n})(Pe || (Pe = {}));\nvar Be;\n(function(n) {\n n[n.Horizontal = 0] = \"Horizontal\", n[n.Vertical = 1] = \"Vertical\", n[n.LeftClick = 2] = \"LeftClick\", n[n.MiddleClick = 3] = \"MiddleClick\", n[n.RightClick = 4] = \"RightClick\", n[n.BrowserBack = 5] = \"BrowserBack\", n[n.BrowserForward = 6] = \"BrowserForward\", n[n.MouseWheelX = 7] = \"MouseWheelX\", n[n.MouseWheelY = 8] = \"MouseWheelY\", n[n.MouseWheelZ = 9] = \"MouseWheelZ\", n[n.Move = 12] = \"Move\";\n})(Be || (Be = {}));\nvar ic;\n(function(n) {\n n[n.Horizontal = 0] = \"Horizontal\", n[n.Vertical = 1] = \"Vertical\", n[n.LeftClick = 2] = \"LeftClick\", n[n.MiddleClick = 3] = \"MiddleClick\", n[n.RightClick = 4] = \"RightClick\", n[n.BrowserBack = 5] = \"BrowserBack\", n[n.BrowserForward = 6] = \"BrowserForward\", n[n.MouseWheelX = 7] = \"MouseWheelX\", n[n.MouseWheelY = 8] = \"MouseWheelY\", n[n.MouseWheelZ = 9] = \"MouseWheelZ\", n[n.DeltaHorizontal = 10] = \"DeltaHorizontal\", n[n.DeltaVertical = 11] = \"DeltaVertical\";\n})(ic || (ic = {}));\nvar $p;\n(function(n) {\n n[n.Cross = 0] = \"Cross\", n[n.Circle = 1] = \"Circle\", n[n.Square = 2] = \"Square\", n[n.Triangle = 3] = \"Triangle\", n[n.L1 = 4] = \"L1\", n[n.R1 = 5] = \"R1\", n[n.L2 = 6] = \"L2\", n[n.R2 = 7] = \"R2\", n[n.Share = 8] = \"Share\", n[n.Options = 9] = \"Options\", n[n.L3 = 10] = \"L3\", n[n.R3 = 11] = \"R3\", n[n.DPadUp = 12] = \"DPadUp\", n[n.DPadDown = 13] = \"DPadDown\", n[n.DPadLeft = 14] = \"DPadLeft\", n[n.DPadRight = 15] = \"DPadRight\", n[n.Home = 16] = \"Home\", n[n.TouchPad = 17] = \"TouchPad\", n[n.LStickXAxis = 18] = \"LStickXAxis\", n[n.LStickYAxis = 19] = \"LStickYAxis\", n[n.RStickXAxis = 20] = \"RStickXAxis\", n[n.RStickYAxis = 21] = \"RStickYAxis\";\n})($p || ($p = {}));\nvar eg;\n(function(n) {\n n[n.Cross = 0] = \"Cross\", n[n.Circle = 1] = \"Circle\", n[n.Square = 2] = \"Square\", n[n.Triangle = 3] = \"Triangle\", n[n.L1 = 4] = \"L1\", n[n.R1 = 5] = \"R1\", n[n.L2 = 6] = \"L2\", n[n.R2 = 7] = \"R2\", n[n.Create = 8] = \"Create\", n[n.Options = 9] = \"Options\", n[n.L3 = 10] = \"L3\", n[n.R3 = 11] = \"R3\", n[n.DPadUp = 12] = \"DPadUp\", n[n.DPadDown = 13] = \"DPadDown\", n[n.DPadLeft = 14] = \"DPadLeft\", n[n.DPadRight = 15] = \"DPadRight\", n[n.Home = 16] = \"Home\", n[n.TouchPad = 17] = \"TouchPad\", n[n.LStickXAxis = 18] = \"LStickXAxis\", n[n.LStickYAxis = 19] = \"LStickYAxis\", n[n.RStickXAxis = 20] = \"RStickXAxis\", n[n.RStickYAxis = 21] = \"RStickYAxis\";\n})(eg || (eg = {}));\nvar tg;\n(function(n) {\n n[n.A = 0] = \"A\", n[n.B = 1] = \"B\", n[n.X = 2] = \"X\", n[n.Y = 3] = \"Y\", n[n.LB = 4] = \"LB\", n[n.RB = 5] = \"RB\", n[n.LT = 6] = \"LT\", n[n.RT = 7] = \"RT\", n[n.Back = 8] = \"Back\", n[n.Start = 9] = \"Start\", n[n.LS = 10] = \"LS\", n[n.RS = 11] = \"RS\", n[n.DPadUp = 12] = \"DPadUp\", n[n.DPadDown = 13] = \"DPadDown\", n[n.DPadLeft = 14] = \"DPadLeft\", n[n.DPadRight = 15] = \"DPadRight\", n[n.Home = 16] = \"Home\", n[n.LStickXAxis = 17] = \"LStickXAxis\", n[n.LStickYAxis = 18] = \"LStickYAxis\", n[n.RStickXAxis = 19] = \"RStickXAxis\", n[n.RStickYAxis = 20] = \"RStickYAxis\";\n})(tg || (tg = {}));\nvar ig;\n(function(n) {\n n[n.B = 0] = \"B\", n[n.A = 1] = \"A\", n[n.Y = 2] = \"Y\", n[n.X = 3] = \"X\", n[n.L = 4] = \"L\", n[n.R = 5] = \"R\", n[n.ZL = 6] = \"ZL\", n[n.ZR = 7] = \"ZR\", n[n.Minus = 8] = \"Minus\", n[n.Plus = 9] = \"Plus\", n[n.LS = 10] = \"LS\", n[n.RS = 11] = \"RS\", n[n.DPadUp = 12] = \"DPadUp\", n[n.DPadDown = 13] = \"DPadDown\", n[n.DPadLeft = 14] = \"DPadLeft\", n[n.DPadRight = 15] = \"DPadRight\", n[n.Home = 16] = \"Home\", n[n.Capture = 17] = \"Capture\", n[n.LStickXAxis = 18] = \"LStickXAxis\", n[n.LStickYAxis = 19] = \"LStickYAxis\", n[n.RStickXAxis = 20] = \"RStickXAxis\", n[n.RStickYAxis = 21] = \"RStickYAxis\";\n})(ig || (ig = {}));\nvar rg;\n(function(n) {\n n[n.PointerMove = 0] = \"PointerMove\", n[n.PointerDown = 1] = \"PointerDown\", n[n.PointerUp = 2] = \"PointerUp\";\n})(rg || (rg = {}));\nclass Oc {\n}\nOc.DOM_DELTA_PIXEL = 0;\nOc.DOM_DELTA_LINE = 1;\nOc.DOM_DELTA_PAGE = 2;\nclass Cn {\n /**\n * Create device input events based on provided type and slot\n *\n * @param deviceType Type of device\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n * @param currentState Current value for given input\n * @param deviceInputSystem Reference to DeviceInputSystem\n * @param elementToAttachTo HTMLElement to reference as target for inputs\n * @param pointerId PointerId to use for pointer events\n * @returns IUIEvent object\n */\n static CreateDeviceEvent(e, t, i, r, s, a, o) {\n switch (e) {\n case Pe.Keyboard:\n return this._CreateKeyboardEvent(i, r, s, a);\n case Pe.Mouse:\n if (i === Be.MouseWheelX || i === Be.MouseWheelY || i === Be.MouseWheelZ)\n return this._CreateWheelEvent(e, t, i, r, s, a);\n case Pe.Touch:\n return this._CreatePointerEvent(e, t, i, r, s, a, o);\n default:\n throw `Unable to generate event for device ${Pe[e]}`;\n }\n }\n /**\n * Creates pointer event\n *\n * @param deviceType Type of device\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n * @param currentState Current value for given input\n * @param deviceInputSystem Reference to DeviceInputSystem\n * @param elementToAttachTo HTMLElement to reference as target for inputs\n * @param pointerId PointerId to use for pointer events\n * @returns IUIEvent object (Pointer)\n */\n static _CreatePointerEvent(e, t, i, r, s, a, o) {\n const l = this._CreateMouseEvent(e, t, i, r, s, a);\n e === Pe.Mouse ? (l.deviceType = Pe.Mouse, l.pointerId = 1, l.pointerType = \"mouse\") : (l.deviceType = Pe.Touch, l.pointerId = o ?? t, l.pointerType = \"touch\");\n let c = 0;\n return c += s.pollInput(e, t, Be.LeftClick), c += s.pollInput(e, t, Be.RightClick) * 2, c += s.pollInput(e, t, Be.MiddleClick) * 4, l.buttons = c, i === Be.Move ? l.type = \"pointermove\" : i >= Be.LeftClick && i <= Be.RightClick && (l.type = r === 1 ? \"pointerdown\" : \"pointerup\", l.button = i - 2), l;\n }\n /**\n * Create Mouse Wheel Event\n * @param deviceType Type of device\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n * @param currentState Current value for given input\n * @param deviceInputSystem Reference to DeviceInputSystem\n * @param elementToAttachTo HTMLElement to reference as target for inputs\n * @returns IUIEvent object (Wheel)\n */\n static _CreateWheelEvent(e, t, i, r, s, a) {\n const o = this._CreateMouseEvent(e, t, i, r, s, a);\n switch (o.pointerId = 1, o.type = \"wheel\", o.deltaMode = Oc.DOM_DELTA_PIXEL, o.deltaX = 0, o.deltaY = 0, o.deltaZ = 0, i) {\n case Be.MouseWheelX:\n o.deltaX = r;\n break;\n case Be.MouseWheelY:\n o.deltaY = r;\n break;\n case Be.MouseWheelZ:\n o.deltaZ = r;\n break;\n }\n return o;\n }\n /**\n * Create Mouse Event\n * @param deviceType Type of device\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n * @param currentState Current value for given input\n * @param deviceInputSystem Reference to DeviceInputSystem\n * @param elementToAttachTo HTMLElement to reference as target for inputs\n * @returns IUIEvent object (Mouse)\n */\n static _CreateMouseEvent(e, t, i, r, s, a) {\n const o = this._CreateEvent(a), l = s.pollInput(e, t, Be.Horizontal), c = s.pollInput(e, t, Be.Vertical);\n return a ? (o.movementX = 0, o.movementY = 0, o.offsetX = o.movementX - a.getBoundingClientRect().x, o.offsetY = o.movementY - a.getBoundingClientRect().y) : (o.movementX = s.pollInput(e, t, ic.DeltaHorizontal), o.movementY = s.pollInput(e, t, ic.DeltaVertical), o.offsetX = 0, o.offsetY = 0), this._CheckNonCharacterKeys(o, s), o.clientX = l, o.clientY = c, o.x = l, o.y = c, o.deviceType = e, o.deviceSlot = t, o.inputIndex = i, o;\n }\n /**\n * Create Keyboard Event\n * @param inputIndex Id of input to be checked\n * @param currentState Current value for given input\n * @param deviceInputSystem Reference to DeviceInputSystem\n * @param elementToAttachTo HTMLElement to reference as target for inputs\n * @returns IEvent object (Keyboard)\n */\n static _CreateKeyboardEvent(e, t, i, r) {\n const s = this._CreateEvent(r);\n return this._CheckNonCharacterKeys(s, i), s.deviceType = Pe.Keyboard, s.deviceSlot = 0, s.inputIndex = e, s.type = t === 1 ? \"keydown\" : \"keyup\", s.key = String.fromCharCode(e), s.keyCode = e, s;\n }\n /**\n * Add parameters for non-character keys (Ctrl, Alt, Meta, Shift)\n * @param evt Event object to add parameters to\n * @param deviceInputSystem DeviceInputSystem to pull values from\n */\n static _CheckNonCharacterKeys(e, t) {\n const i = t.isDeviceAvailable(Pe.Keyboard), r = i && t.pollInput(Pe.Keyboard, 0, 18) === 1, s = i && t.pollInput(Pe.Keyboard, 0, 17) === 1, a = i && (t.pollInput(Pe.Keyboard, 0, 91) === 1 || t.pollInput(Pe.Keyboard, 0, 92) === 1 || t.pollInput(Pe.Keyboard, 0, 93) === 1), o = i && t.pollInput(Pe.Keyboard, 0, 16) === 1;\n e.altKey = r, e.ctrlKey = s, e.metaKey = a, e.shiftKey = o;\n }\n /**\n * Create base event object\n * @param elementToAttachTo Value to use as event target\n * @returns\n */\n static _CreateEvent(e) {\n const t = {};\n return t.preventDefault = () => {\n }, t.target = e, t;\n }\n}\nclass Dy {\n constructor(e, t, i) {\n this._nativeInput = _native.DeviceInputSystem ? new _native.DeviceInputSystem(e, t, (r, s, a, o) => {\n const l = Cn.CreateDeviceEvent(r, s, a, o, this);\n i(r, s, l);\n }) : this._createDummyNativeInput();\n }\n // Public functions\n /**\n * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized.\n * @param deviceType Enum specifying device type\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n * @returns Current value of input\n */\n pollInput(e, t, i) {\n return this._nativeInput.pollInput(e, t, i);\n }\n /**\n * Check for a specific device in the DeviceInputSystem\n * @param deviceType Type of device to check for\n * @returns bool with status of device's existence\n */\n isDeviceAvailable(e) {\n return e === Pe.Mouse || e === Pe.Touch;\n }\n /**\n * Dispose of all the observables\n */\n dispose() {\n this._nativeInput.dispose();\n }\n /**\n * For versions of BabylonNative that don't have the NativeInput plugin initialized, create a dummy version\n * @returns Object with dummy functions\n */\n _createDummyNativeInput() {\n return {\n pollInput: () => 0,\n isDeviceAvailable: () => !1,\n dispose: () => {\n }\n };\n }\n}\nconst sg = 255, ng = Object.keys(Be).length / 2;\nclass Ny {\n /**\n * Constructor for the WebDeviceInputSystem\n * @param engine Engine to reference\n * @param onDeviceConnected Callback to execute when device is connected\n * @param onDeviceDisconnected Callback to execute when device is disconnected\n * @param onInputChanged Callback to execute when input changes on device\n */\n constructor(e, t, i, r) {\n this._inputs = [], this._keyboardActive = !1, this._pointerActive = !1, this._usingSafari = ge.IsSafari(), this._usingMacOS = to() && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform), this._keyboardDownEvent = (s) => {\n }, this._keyboardUpEvent = (s) => {\n }, this._keyboardBlurEvent = (s) => {\n }, this._pointerMoveEvent = (s) => {\n }, this._pointerDownEvent = (s) => {\n }, this._pointerUpEvent = (s) => {\n }, this._pointerCancelEvent = (s) => {\n }, this._pointerWheelEvent = (s) => {\n }, this._pointerBlurEvent = (s) => {\n }, this._pointerMacOSChromeOutEvent = (s) => {\n }, this._eventsAttached = !1, this._mouseId = -1, this._isUsingFirefox = to() && navigator.userAgent && navigator.userAgent.indexOf(\"Firefox\") !== -1, this._isUsingChromium = to() && navigator.userAgent && navigator.userAgent.indexOf(\"Chrome\") !== -1, this._maxTouchPoints = 0, this._pointerInputClearObserver = null, this._gamepadConnectedEvent = (s) => {\n }, this._gamepadDisconnectedEvent = (s) => {\n }, this._eventPrefix = ge.GetPointerPrefix(e), this._engine = e, this._onDeviceConnected = t, this._onDeviceDisconnected = i, this._onInputChanged = r, this._mouseId = this._isUsingFirefox ? 0 : 1, this._enableEvents(), this._usingMacOS && (this._metaKeys = []), this._engine._onEngineViewChanged || (this._engine._onEngineViewChanged = () => {\n this._enableEvents();\n });\n }\n // Public functions\n /**\n * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized.\n * @param deviceType Enum specifying device type\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n * @returns Current value of input\n */\n pollInput(e, t, i) {\n const r = this._inputs[e][t];\n if (!r)\n throw `Unable to find device ${Pe[e]}`;\n e >= Pe.DualShock && e <= Pe.DualSense && this._updateDevice(e, t, i);\n const s = r[i];\n if (s === void 0)\n throw `Unable to find input ${i} for device ${Pe[e]} in slot ${t}`;\n return i === Be.Move && ge.Warn(\"Unable to provide information for PointerInput.Move. Try using PointerInput.Horizontal or PointerInput.Vertical for move data.\"), s;\n }\n /**\n * Check for a specific device in the DeviceInputSystem\n * @param deviceType Type of device to check for\n * @returns bool with status of device's existence\n */\n isDeviceAvailable(e) {\n return this._inputs[e] !== void 0;\n }\n /**\n * Dispose of all the eventlisteners\n */\n dispose() {\n this._onDeviceConnected = () => {\n }, this._onDeviceDisconnected = () => {\n }, this._onInputChanged = () => {\n }, delete this._engine._onEngineViewChanged, this._elementToAttachTo && this._disableEvents();\n }\n /**\n * Enable listening for user input events\n */\n _enableEvents() {\n const e = this == null ? void 0 : this._engine.getInputElement();\n if (e && (!this._eventsAttached || this._elementToAttachTo !== e)) {\n if (this._disableEvents(), this._inputs) {\n for (const t of this._inputs)\n if (t)\n for (const i in t) {\n const r = +i, s = t[r];\n if (s)\n for (let a = 0; a < s.length; a++)\n s[a] = 0;\n }\n }\n this._elementToAttachTo = e, this._elementToAttachTo.tabIndex = this._elementToAttachTo.tabIndex !== -1 ? this._elementToAttachTo.tabIndex : this._engine.canvasTabIndex, this._handleKeyActions(), this._handlePointerActions(), this._handleGamepadActions(), this._eventsAttached = !0, this._checkForConnectedDevices();\n }\n }\n /**\n * Disable listening for user input events\n */\n _disableEvents() {\n this._elementToAttachTo && (this._elementToAttachTo.removeEventListener(\"blur\", this._keyboardBlurEvent), this._elementToAttachTo.removeEventListener(\"blur\", this._pointerBlurEvent), this._elementToAttachTo.removeEventListener(\"keydown\", this._keyboardDownEvent), this._elementToAttachTo.removeEventListener(\"keyup\", this._keyboardUpEvent), this._elementToAttachTo.removeEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent), this._elementToAttachTo.removeEventListener(this._eventPrefix + \"down\", this._pointerDownEvent), this._elementToAttachTo.removeEventListener(this._eventPrefix + \"up\", this._pointerUpEvent), this._elementToAttachTo.removeEventListener(this._eventPrefix + \"cancel\", this._pointerCancelEvent), this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent), this._usingMacOS && this._isUsingChromium && this._elementToAttachTo.removeEventListener(\"lostpointercapture\", this._pointerMacOSChromeOutEvent), window.removeEventListener(\"gamepadconnected\", this._gamepadConnectedEvent), window.removeEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent)), this._pointerInputClearObserver && this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver), this._eventsAttached = !1;\n }\n /**\n * Checks for existing connections to devices and register them, if necessary\n * Currently handles gamepads and mouse\n */\n _checkForConnectedDevices() {\n if (navigator.getGamepads) {\n const e = navigator.getGamepads();\n for (const t of e)\n t && this._addGamePad(t);\n }\n typeof matchMedia == \"function\" && matchMedia(\"(pointer:fine)\").matches && this._addPointerDevice(Pe.Mouse, 0, 0, 0);\n }\n // Private functions\n /**\n * Add a gamepad to the DeviceInputSystem\n * @param gamepad A single DOM Gamepad object\n */\n _addGamePad(e) {\n const t = this._getGamepadDeviceType(e.id), i = e.index;\n this._gamepads = this._gamepads || new Array(e.index + 1), this._registerDevice(t, i, e.buttons.length + e.axes.length), this._gamepads[i] = t;\n }\n /**\n * Add pointer device to DeviceInputSystem\n * @param deviceType Type of Pointer to add\n * @param deviceSlot Pointer ID (0 for mouse, pointerId for Touch)\n * @param currentX Current X at point of adding\n * @param currentY Current Y at point of adding\n */\n _addPointerDevice(e, t, i, r) {\n this._pointerActive || (this._pointerActive = !0), this._registerDevice(e, t, ng);\n const s = this._inputs[e][t];\n s[0] = i, s[1] = r;\n }\n /**\n * Add device and inputs to device array\n * @param deviceType Enum specifying device type\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param numberOfInputs Number of input entries to create for given device\n */\n _registerDevice(e, t, i) {\n if (t === void 0)\n throw `Unable to register device ${Pe[e]} to undefined slot.`;\n if (this._inputs[e] || (this._inputs[e] = {}), !this._inputs[e][t]) {\n const r = new Array(i);\n r.fill(0), this._inputs[e][t] = r, this._onDeviceConnected(e, t);\n }\n }\n /**\n * Given a specific device name, remove that device from the device map\n * @param deviceType Enum specifying device type\n * @param deviceSlot \"Slot\" or index that device is referenced in\n */\n _unregisterDevice(e, t) {\n this._inputs[e][t] && (delete this._inputs[e][t], this._onDeviceDisconnected(e, t));\n }\n /**\n * Handle all actions that come from keyboard interaction\n */\n _handleKeyActions() {\n this._keyboardDownEvent = (e) => {\n this._keyboardActive || (this._keyboardActive = !0, this._registerDevice(Pe.Keyboard, 0, sg));\n const t = this._inputs[Pe.Keyboard][0];\n if (t) {\n t[e.keyCode] = 1;\n const i = e;\n i.inputIndex = e.keyCode, this._usingMacOS && e.metaKey && e.key !== \"Meta\" && (this._metaKeys.includes(e.keyCode) || this._metaKeys.push(e.keyCode)), this._onInputChanged(Pe.Keyboard, 0, i);\n }\n }, this._keyboardUpEvent = (e) => {\n this._keyboardActive || (this._keyboardActive = !0, this._registerDevice(Pe.Keyboard, 0, sg));\n const t = this._inputs[Pe.Keyboard][0];\n if (t) {\n t[e.keyCode] = 0;\n const i = e;\n if (i.inputIndex = e.keyCode, this._usingMacOS && e.key === \"Meta\" && this._metaKeys.length > 0) {\n for (const r of this._metaKeys) {\n const s = Cn.CreateDeviceEvent(Pe.Keyboard, 0, r, 0, this, this._elementToAttachTo);\n t[r] = 0, this._onInputChanged(Pe.Keyboard, 0, s);\n }\n this._metaKeys.splice(0, this._metaKeys.length);\n }\n this._onInputChanged(Pe.Keyboard, 0, i);\n }\n }, this._keyboardBlurEvent = () => {\n if (this._keyboardActive) {\n const e = this._inputs[Pe.Keyboard][0];\n for (let t = 0; t < e.length; t++)\n if (e[t] !== 0) {\n e[t] = 0;\n const i = Cn.CreateDeviceEvent(Pe.Keyboard, 0, t, 0, this, this._elementToAttachTo);\n this._onInputChanged(Pe.Keyboard, 0, i);\n }\n this._usingMacOS && this._metaKeys.splice(0, this._metaKeys.length);\n }\n }, this._elementToAttachTo.addEventListener(\"keydown\", this._keyboardDownEvent), this._elementToAttachTo.addEventListener(\"keyup\", this._keyboardUpEvent), this._elementToAttachTo.addEventListener(\"blur\", this._keyboardBlurEvent);\n }\n /**\n * Handle all actions that come from pointer interaction\n */\n _handlePointerActions() {\n this._maxTouchPoints = to() && navigator.maxTouchPoints || 2, this._activeTouchIds || (this._activeTouchIds = new Array(this._maxTouchPoints));\n for (let i = 0; i < this._maxTouchPoints; i++)\n this._activeTouchIds[i] = -1;\n this._pointerMoveEvent = (i) => {\n const r = this._getPointerType(i);\n let s = r === Pe.Mouse ? 0 : this._activeTouchIds.indexOf(i.pointerId);\n if (r === Pe.Touch && s === -1) {\n const o = this._activeTouchIds.indexOf(-1);\n if (o >= 0)\n s = o, this._activeTouchIds[o] = i.pointerId, this._onDeviceConnected(r, s);\n else {\n ge.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\n return;\n }\n }\n this._inputs[r] || (this._inputs[r] = {}), this._inputs[r][s] || this._addPointerDevice(r, s, i.clientX, i.clientY);\n const a = this._inputs[r][s];\n if (a) {\n const o = i;\n o.inputIndex = Be.Move, a[Be.Horizontal] = i.clientX, a[Be.Vertical] = i.clientY, r === Pe.Touch && a[Be.LeftClick] === 0 && (a[Be.LeftClick] = 1), i.pointerId === void 0 && (i.pointerId = this._mouseId), this._onInputChanged(r, s, o), !this._usingSafari && i.button !== -1 && (o.inputIndex = i.button + 2, a[i.button + 2] = a[i.button + 2] ? 0 : 1, this._onInputChanged(r, s, o));\n }\n }, this._pointerDownEvent = (i) => {\n const r = this._getPointerType(i);\n let s = r === Pe.Mouse ? 0 : i.pointerId;\n if (r === Pe.Touch) {\n const o = this._activeTouchIds.indexOf(-1);\n if (o >= 0)\n s = o, this._activeTouchIds[o] = i.pointerId;\n else {\n ge.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\n return;\n }\n }\n this._inputs[r] || (this._inputs[r] = {}), this._inputs[r][s] ? r === Pe.Touch && this._onDeviceConnected(r, s) : this._addPointerDevice(r, s, i.clientX, i.clientY);\n const a = this._inputs[r][s];\n if (a) {\n const o = a[Be.Horizontal], l = a[Be.Vertical];\n if (r === Pe.Mouse) {\n if (i.pointerId === void 0 && (i.pointerId = this._mouseId), !document.pointerLockElement)\n try {\n this._elementToAttachTo.setPointerCapture(this._mouseId);\n } catch {\n }\n } else if (i.pointerId && !document.pointerLockElement)\n try {\n this._elementToAttachTo.setPointerCapture(i.pointerId);\n } catch {\n }\n a[Be.Horizontal] = i.clientX, a[Be.Vertical] = i.clientY, a[i.button + 2] = 1;\n const c = i;\n c.inputIndex = i.button + 2, this._onInputChanged(r, s, c), (o !== i.clientX || l !== i.clientY) && (c.inputIndex = Be.Move, this._onInputChanged(r, s, c));\n }\n }, this._pointerUpEvent = (i) => {\n var o, l, c, h, u;\n const r = this._getPointerType(i), s = r === Pe.Mouse ? 0 : this._activeTouchIds.indexOf(i.pointerId);\n if (r === Pe.Touch) {\n if (s === -1)\n return;\n this._activeTouchIds[s] = -1;\n }\n const a = (o = this._inputs[r]) == null ? void 0 : o[s];\n if (a && a[i.button + 2] !== 0) {\n const f = a[Be.Horizontal], d = a[Be.Vertical];\n a[Be.Horizontal] = i.clientX, a[Be.Vertical] = i.clientY, a[i.button + 2] = 0;\n const p = i;\n i.pointerId === void 0 && (i.pointerId = this._mouseId), (f !== i.clientX || d !== i.clientY) && (p.inputIndex = Be.Move, this._onInputChanged(r, s, p)), p.inputIndex = i.button + 2, r === Pe.Mouse && this._mouseId >= 0 && ((c = (l = this._elementToAttachTo).hasPointerCapture) != null && c.call(l, this._mouseId)) ? this._elementToAttachTo.releasePointerCapture(this._mouseId) : i.pointerId && ((u = (h = this._elementToAttachTo).hasPointerCapture) != null && u.call(h, i.pointerId)) && this._elementToAttachTo.releasePointerCapture(i.pointerId), this._onInputChanged(r, s, p), r === Pe.Touch && this._onDeviceDisconnected(r, s);\n }\n }, this._pointerCancelEvent = (i) => {\n var r, s, a, o;\n if (i.pointerType === \"mouse\") {\n const l = this._inputs[Pe.Mouse][0];\n this._mouseId >= 0 && ((s = (r = this._elementToAttachTo).hasPointerCapture) != null && s.call(r, this._mouseId)) && this._elementToAttachTo.releasePointerCapture(this._mouseId);\n for (let c = Be.LeftClick; c <= Be.BrowserForward; c++)\n if (l[c] === 1) {\n l[c] = 0;\n const h = Cn.CreateDeviceEvent(Pe.Mouse, 0, c, 0, this, this._elementToAttachTo);\n this._onInputChanged(Pe.Mouse, 0, h);\n }\n } else {\n const l = this._activeTouchIds.indexOf(i.pointerId);\n if (l === -1)\n return;\n (o = (a = this._elementToAttachTo).hasPointerCapture) != null && o.call(a, i.pointerId) && this._elementToAttachTo.releasePointerCapture(i.pointerId), this._inputs[Pe.Touch][l][Be.LeftClick] = 0;\n const c = Cn.CreateDeviceEvent(Pe.Touch, l, Be.LeftClick, 0, this, this._elementToAttachTo, i.pointerId);\n this._onInputChanged(Pe.Touch, l, c), this._activeTouchIds[l] = -1, this._onDeviceDisconnected(Pe.Touch, l);\n }\n }, this._wheelEventName = \"onwheel\" in document.createElement(\"div\") ? \"wheel\" : document.onmousewheel !== void 0 ? \"mousewheel\" : \"DOMMouseScroll\";\n let e = !1;\n const t = function() {\n };\n try {\n const i = Object.defineProperty({}, \"passive\", {\n get: function() {\n e = !0;\n }\n });\n this._elementToAttachTo.addEventListener(\"test\", t, i), this._elementToAttachTo.removeEventListener(\"test\", t, i);\n } catch {\n }\n this._pointerBlurEvent = () => {\n var i, r, s, a, o;\n if (this.isDeviceAvailable(Pe.Mouse)) {\n const l = this._inputs[Pe.Mouse][0];\n this._mouseId >= 0 && ((r = (i = this._elementToAttachTo).hasPointerCapture) != null && r.call(i, this._mouseId)) && this._elementToAttachTo.releasePointerCapture(this._mouseId);\n for (let c = Be.LeftClick; c <= Be.BrowserForward; c++)\n if (l[c] === 1) {\n l[c] = 0;\n const h = Cn.CreateDeviceEvent(Pe.Mouse, 0, c, 0, this, this._elementToAttachTo);\n this._onInputChanged(Pe.Mouse, 0, h);\n }\n }\n if (this.isDeviceAvailable(Pe.Touch)) {\n const l = this._inputs[Pe.Touch];\n for (let c = 0; c < this._activeTouchIds.length; c++) {\n const h = this._activeTouchIds[c];\n if ((a = (s = this._elementToAttachTo).hasPointerCapture) != null && a.call(s, h) && this._elementToAttachTo.releasePointerCapture(h), h !== -1 && ((o = l[c]) == null ? void 0 : o[Be.LeftClick]) === 1) {\n l[c][Be.LeftClick] = 0;\n const u = Cn.CreateDeviceEvent(Pe.Touch, c, Be.LeftClick, 0, this, this._elementToAttachTo, h);\n this._onInputChanged(Pe.Touch, c, u), this._activeTouchIds[c] = -1, this._onDeviceDisconnected(Pe.Touch, c);\n }\n }\n }\n }, this._pointerWheelEvent = (i) => {\n const r = Pe.Mouse, s = 0;\n this._inputs[r] || (this._inputs[r] = []), this._inputs[r][s] || (this._pointerActive = !0, this._registerDevice(r, s, ng));\n const a = this._inputs[r][s];\n if (a) {\n a[Be.MouseWheelX] = i.deltaX || 0, a[Be.MouseWheelY] = i.deltaY || i.wheelDelta || 0, a[Be.MouseWheelZ] = i.deltaZ || 0;\n const o = i;\n i.pointerId === void 0 && (i.pointerId = this._mouseId), a[Be.MouseWheelX] !== 0 && (o.inputIndex = Be.MouseWheelX, this._onInputChanged(r, s, o)), a[Be.MouseWheelY] !== 0 && (o.inputIndex = Be.MouseWheelY, this._onInputChanged(r, s, o)), a[Be.MouseWheelZ] !== 0 && (o.inputIndex = Be.MouseWheelZ, this._onInputChanged(r, s, o));\n }\n }, this._usingMacOS && this._isUsingChromium && (this._pointerMacOSChromeOutEvent = (i) => {\n i.buttons > 1 && this._pointerCancelEvent(i);\n }, this._elementToAttachTo.addEventListener(\"lostpointercapture\", this._pointerMacOSChromeOutEvent)), this._elementToAttachTo.addEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent), this._elementToAttachTo.addEventListener(this._eventPrefix + \"down\", this._pointerDownEvent), this._elementToAttachTo.addEventListener(this._eventPrefix + \"up\", this._pointerUpEvent), this._elementToAttachTo.addEventListener(this._eventPrefix + \"cancel\", this._pointerCancelEvent), this._elementToAttachTo.addEventListener(\"blur\", this._pointerBlurEvent), this._elementToAttachTo.addEventListener(this._wheelEventName, this._pointerWheelEvent, e ? { passive: !1 } : !1), this._pointerInputClearObserver = this._engine.onEndFrameObservable.add(() => {\n if (this.isDeviceAvailable(Pe.Mouse)) {\n const i = this._inputs[Pe.Mouse][0];\n i[Be.MouseWheelX] = 0, i[Be.MouseWheelY] = 0, i[Be.MouseWheelZ] = 0;\n }\n });\n }\n /**\n * Handle all actions that come from gamepad interaction\n */\n _handleGamepadActions() {\n this._gamepadConnectedEvent = (e) => {\n this._addGamePad(e.gamepad);\n }, this._gamepadDisconnectedEvent = (e) => {\n if (this._gamepads) {\n const t = this._getGamepadDeviceType(e.gamepad.id), i = e.gamepad.index;\n this._unregisterDevice(t, i), delete this._gamepads[i];\n }\n }, window.addEventListener(\"gamepadconnected\", this._gamepadConnectedEvent), window.addEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\n }\n /**\n * Update all non-event based devices with each frame\n * @param deviceType Enum specifying device type\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n */\n _updateDevice(e, t, i) {\n const r = navigator.getGamepads()[t];\n if (r && e === this._gamepads[t]) {\n const s = this._inputs[e][t];\n i >= r.buttons.length ? s[i] = r.axes[i - r.buttons.length].valueOf() : s[i] = r.buttons[i].value;\n }\n }\n /**\n * Gets DeviceType from the device name\n * @param deviceName Name of Device from DeviceInputSystem\n * @returns DeviceType enum value\n */\n _getGamepadDeviceType(e) {\n return e.indexOf(\"054c\") !== -1 ? e.indexOf(\"0ce6\") !== -1 ? Pe.DualSense : Pe.DualShock : e.indexOf(\"Xbox One\") !== -1 || e.search(\"Xbox 360\") !== -1 || e.search(\"xinput\") !== -1 ? Pe.Xbox : e.indexOf(\"057e\") !== -1 ? Pe.Switch : Pe.Generic;\n }\n /**\n * Get DeviceType from a given pointer/mouse/touch event.\n * @param evt PointerEvent to evaluate\n * @returns DeviceType interpreted from event\n */\n _getPointerType(e) {\n let t = Pe.Mouse;\n return (e.pointerType === \"touch\" || e.pointerType === \"pen\" || e.touches) && (t = Pe.Touch), t;\n }\n}\nclass ag {\n /**\n * Default Constructor\n * @param deviceInputSystem - Reference to DeviceInputSystem\n * @param deviceType - Type of device\n * @param deviceSlot - \"Slot\" or index that device is referenced in\n */\n constructor(e, t, i = 0) {\n this.deviceType = t, this.deviceSlot = i, this.onInputChangedObservable = new he(), this._deviceInputSystem = e;\n }\n /**\n * Get input for specific input\n * @param inputIndex - index of specific input on device\n * @returns Input value from DeviceInputSystem\n */\n getInput(e) {\n return this._deviceInputSystem.pollInput(this.deviceType, this.deviceSlot, e);\n }\n}\nclass Fy {\n constructor(e) {\n this._registeredManagers = new Array(), this._refCount = 0, this.registerManager = (a) => {\n for (let o = 0; o < this._devices.length; o++) {\n const l = this._devices[o];\n for (const c in l) {\n const h = +c;\n a._addDevice(new ag(this._deviceInputSystem, o, h));\n }\n }\n this._registeredManagers.push(a);\n }, this.unregisterManager = (a) => {\n const o = this._registeredManagers.indexOf(a);\n o > -1 && this._registeredManagers.splice(o, 1);\n };\n const t = Object.keys(Pe).length / 2;\n this._devices = new Array(t);\n const i = (a, o) => {\n this._devices[a] || (this._devices[a] = new Array()), this._devices[a][o] || (this._devices[a][o] = o);\n for (const l of this._registeredManagers) {\n const c = new ag(this._deviceInputSystem, a, o);\n l._addDevice(c);\n }\n }, r = (a, o) => {\n var l;\n (l = this._devices[a]) != null && l[o] && delete this._devices[a][o];\n for (const c of this._registeredManagers)\n c._removeDevice(a, o);\n }, s = (a, o, l) => {\n if (l)\n for (const c of this._registeredManagers)\n c._onInputChanged(a, o, l);\n };\n typeof _native < \"u\" ? this._deviceInputSystem = new Dy(i, r, s) : this._deviceInputSystem = new Ny(e, i, r, s);\n }\n dispose() {\n this._deviceInputSystem.dispose();\n }\n}\nclass Ly {\n // Public Functions\n /**\n * Gets a DeviceSource, given a type and slot\n * @param deviceType - Type of Device\n * @param deviceSlot - Slot or ID of device\n * @returns DeviceSource\n */\n getDeviceSource(e, t) {\n if (t === void 0) {\n if (this._firstDevice[e] === void 0)\n return null;\n t = this._firstDevice[e];\n }\n return !this._devices[e] || this._devices[e][t] === void 0 ? null : this._devices[e][t];\n }\n /**\n * Gets an array of DeviceSource objects for a given device type\n * @param deviceType - Type of Device\n * @returns All available DeviceSources of a given type\n */\n getDeviceSources(e) {\n return this._devices[e] ? this._devices[e].filter((t) => !!t) : [];\n }\n /**\n * Default constructor\n * @param engine - Used to get canvas (if applicable)\n */\n constructor(e) {\n const t = Object.keys(Pe).length / 2;\n this._devices = new Array(t), this._firstDevice = new Array(t), this._engine = e, this._engine._deviceSourceManager || (this._engine._deviceSourceManager = new Fy(e)), this._engine._deviceSourceManager._refCount++, this.onDeviceConnectedObservable = new he((i) => {\n for (const r of this._devices)\n if (r)\n for (const s of r)\n s && this.onDeviceConnectedObservable.notifyObserver(i, s);\n }), this.onDeviceDisconnectedObservable = new he(), this._engine._deviceSourceManager.registerManager(this), this._onDisposeObserver = e.onDisposeObservable.add(() => {\n this.dispose();\n });\n }\n /**\n * Dispose of DeviceSourceManager\n */\n dispose() {\n this.onDeviceConnectedObservable.clear(), this.onDeviceDisconnectedObservable.clear(), this._engine._deviceSourceManager && (this._engine._deviceSourceManager.unregisterManager(this), --this._engine._deviceSourceManager._refCount < 1 && (this._engine._deviceSourceManager.dispose(), delete this._engine._deviceSourceManager)), this._engine.onDisposeObservable.remove(this._onDisposeObserver);\n }\n // Hidden Functions\n /**\n * @param deviceSource - Source to add\n * @internal\n */\n _addDevice(e) {\n this._devices[e.deviceType] || (this._devices[e.deviceType] = new Array()), this._devices[e.deviceType][e.deviceSlot] || (this._devices[e.deviceType][e.deviceSlot] = e, this._updateFirstDevices(e.deviceType)), this.onDeviceConnectedObservable.notifyObservers(e);\n }\n /**\n * @param deviceType - DeviceType\n * @param deviceSlot - DeviceSlot\n * @internal\n */\n _removeDevice(e, t) {\n var r, s;\n const i = (r = this._devices[e]) == null ? void 0 : r[t];\n this.onDeviceDisconnectedObservable.notifyObservers(i), (s = this._devices[e]) != null && s[t] && delete this._devices[e][t], this._updateFirstDevices(e);\n }\n /**\n * @param deviceType - DeviceType\n * @param deviceSlot - DeviceSlot\n * @param eventData - Event\n * @internal\n */\n _onInputChanged(e, t, i) {\n var r, s;\n (s = (r = this._devices[e]) == null ? void 0 : r[t]) == null || s.onInputChangedObservable.notifyObservers(i);\n }\n // Private Functions\n _updateFirstDevices(e) {\n switch (e) {\n case Pe.Keyboard:\n case Pe.Mouse:\n this._firstDevice[e] = 0;\n break;\n case Pe.Touch:\n case Pe.DualSense:\n case Pe.DualShock:\n case Pe.Xbox:\n case Pe.Switch:\n case Pe.Generic: {\n delete this._firstDevice[e];\n const t = this._devices[e];\n if (t) {\n for (let i = 0; i < t.length; i++)\n if (t[i]) {\n this._firstDevice[e] = i;\n break;\n }\n }\n break;\n }\n }\n }\n}\nclass og {\n constructor() {\n this._singleClick = !1, this._doubleClick = !1, this._hasSwiped = !1, this._ignore = !1;\n }\n get singleClick() {\n return this._singleClick;\n }\n get doubleClick() {\n return this._doubleClick;\n }\n get hasSwiped() {\n return this._hasSwiped;\n }\n get ignore() {\n return this._ignore;\n }\n set singleClick(e) {\n this._singleClick = e;\n }\n set doubleClick(e) {\n this._doubleClick = e;\n }\n set hasSwiped(e) {\n this._hasSwiped = e;\n }\n set ignore(e) {\n this._ignore = e;\n }\n}\nclass ti {\n /**\n * Creates a new InputManager\n * @param scene - defines the hosting scene\n */\n constructor(e) {\n this._alreadyAttached = !1, this._meshPickProceed = !1, this._currentPickResult = null, this._previousPickResult = null, this._totalPointersPressed = 0, this._doubleClickOccured = !1, this._isSwiping = !1, this._swipeButtonPressed = -1, this._skipPointerTap = !1, this._isMultiTouchGesture = !1, this._pointerX = 0, this._pointerY = 0, this._startingPointerPosition = new me(0, 0), this._previousStartingPointerPosition = new me(0, 0), this._startingPointerTime = 0, this._previousStartingPointerTime = 0, this._pointerCaptures = {}, this._meshUnderPointerId = {}, this._movePointerInfo = null, this._cameraObserverCount = 0, this._delayedClicks = [null, null, null, null, null], this._deviceSourceManager = null, this._scene = e || st.LastCreatedScene, this._scene;\n }\n /**\n * Gets the mesh that is currently under the pointer\n * @returns Mesh that the pointer is pointer is hovering over\n */\n get meshUnderPointer() {\n return this._movePointerInfo && (this._movePointerInfo._generatePickInfo(), this._movePointerInfo = null), this._pointerOverMesh;\n }\n /**\n * When using more than one pointer (for example in XR) you can get the mesh under the specific pointer\n * @param pointerId - the pointer id to use\n * @returns The mesh under this pointer id or null if not found\n */\n getMeshUnderPointerByPointerId(e) {\n return this._meshUnderPointerId[e] || null;\n }\n /**\n * Gets the pointer coordinates in 2D without any translation (ie. straight out of the pointer event)\n * @returns Vector with X/Y values directly from pointer event\n */\n get unTranslatedPointer() {\n return new me(this._unTranslatedPointerX, this._unTranslatedPointerY);\n }\n /**\n * Gets or sets the current on-screen X position of the pointer\n * @returns Translated X with respect to screen\n */\n get pointerX() {\n return this._pointerX;\n }\n set pointerX(e) {\n this._pointerX = e;\n }\n /**\n * Gets or sets the current on-screen Y position of the pointer\n * @returns Translated Y with respect to screen\n */\n get pointerY() {\n return this._pointerY;\n }\n set pointerY(e) {\n this._pointerY = e;\n }\n _updatePointerPosition(e) {\n const t = this._scene.getEngine().getInputElementClientRect();\n t && (this._pointerX = e.clientX - t.left, this._pointerY = e.clientY - t.top, this._unTranslatedPointerX = this._pointerX, this._unTranslatedPointerY = this._pointerY);\n }\n _processPointerMove(e, t) {\n const i = this._scene, r = i.getEngine(), s = r.getInputElement();\n s && (s.tabIndex = r.canvasTabIndex, i.doNotHandleCursors || (s.style.cursor = i.defaultCursor)), this._setCursorAndPointerOverMesh(e, t, i);\n for (const l of i._pointerMoveStage) {\n e = e || this._pickMove(t);\n const c = !!(e != null && e.pickedMesh);\n e = l.action(this._unTranslatedPointerX, this._unTranslatedPointerY, e, c, s);\n }\n const a = t.inputIndex >= Be.MouseWheelX && t.inputIndex <= Be.MouseWheelZ ? pt.POINTERWHEEL : pt.POINTERMOVE;\n i.onPointerMove && (e = e || this._pickMove(t), i.onPointerMove(t, e, a));\n let o;\n e ? (o = new Is(a, t, e), this._setRayOnPointerInfo(e, t)) : (o = new Is(a, t, null, this), this._movePointerInfo = o), i.onPointerObservable.hasObservers() && i.onPointerObservable.notifyObservers(o, a);\n }\n // Pointers handling\n /** @internal */\n _setRayOnPointerInfo(e, t) {\n const i = this._scene;\n e && i._pickingAvailable && (e.ray || (e.ray = i.createPickingRay(t.offsetX, t.offsetY, w.Identity(), i.activeCamera)));\n }\n /** @internal */\n _addCameraPointerObserver(e, t) {\n return this._cameraObserverCount++, this._scene.onPointerObservable.add(e, t);\n }\n /** @internal */\n _removeCameraPointerObserver(e) {\n return this._cameraObserverCount--, this._scene.onPointerObservable.remove(e);\n }\n _checkForPicking() {\n return !!(this._scene.onPointerObservable.observers.length > this._cameraObserverCount || this._scene.onPointerPick);\n }\n _checkPrePointerObservable(e, t, i) {\n const r = this._scene, s = new Oy(i, t, this._unTranslatedPointerX, this._unTranslatedPointerY);\n return e && (s.originalPickingInfo = e, s.ray = e.ray, t.pointerType === \"xr-near\" && e.originMesh && (s.nearInteractionPickingInfo = e)), r.onPrePointerObservable.notifyObservers(s, i), !!s.skipOnPointerObservable;\n }\n /** @internal */\n _pickMove(e) {\n const t = this._scene, i = t.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, t.pointerMovePredicate, t.pointerMoveFastCheck, t.cameraToUseForPointers, t.pointerMoveTrianglePredicate);\n return this._setCursorAndPointerOverMesh(i, e, t), i;\n }\n _setCursorAndPointerOverMesh(e, t, i) {\n const s = i.getEngine().getInputElement();\n if (e != null && e.pickedMesh) {\n if (this.setPointerOverMesh(e.pickedMesh, t.pointerId, e, t), !i.doNotHandleCursors && s && this._pointerOverMesh) {\n const a = this._pointerOverMesh._getActionManagerForTrigger();\n a && a.hasPointerTriggers && (s.style.cursor = a.hoverCursor || i.hoverCursor);\n }\n } else\n this.setPointerOverMesh(null, t.pointerId, e, t);\n }\n /**\n * Use this method to simulate a pointer move on a mesh\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\n * @param pickResult - pickingInfo of the object wished to simulate pointer event on\n * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\n */\n simulatePointerMove(e, t) {\n const i = new PointerEvent(\"pointermove\", t);\n i.inputIndex = Be.Move, !this._checkPrePointerObservable(e, i, pt.POINTERMOVE) && this._processPointerMove(e, i);\n }\n /**\n * Use this method to simulate a pointer down on a mesh\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\n * @param pickResult - pickingInfo of the object wished to simulate pointer event on\n * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\n */\n simulatePointerDown(e, t) {\n const i = new PointerEvent(\"pointerdown\", t);\n i.inputIndex = i.button + 2, !this._checkPrePointerObservable(e, i, pt.POINTERDOWN) && this._processPointerDown(e, i);\n }\n _processPointerDown(e, t) {\n const i = this._scene;\n if (e != null && e.pickedMesh) {\n this._pickedDownMesh = e.pickedMesh;\n const a = e.pickedMesh._getActionManagerForTrigger();\n if (a) {\n if (a.hasPickTriggers)\n switch (a.processTrigger(5, Ci.CreateNew(e.pickedMesh, t, e)), t.button) {\n case 0:\n a.processTrigger(2, Ci.CreateNew(e.pickedMesh, t, e));\n break;\n case 1:\n a.processTrigger(4, Ci.CreateNew(e.pickedMesh, t, e));\n break;\n case 2:\n a.processTrigger(3, Ci.CreateNew(e.pickedMesh, t, e));\n break;\n }\n a.hasSpecificTrigger(8) && window.setTimeout(() => {\n const o = i.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, (l) => l.isPickable && l.isVisible && l.isReady() && l.actionManager && l.actionManager.hasSpecificTrigger(8) && l === this._pickedDownMesh, !1, i.cameraToUseForPointers);\n o != null && o.pickedMesh && a && this._totalPointersPressed !== 0 && Date.now() - this._startingPointerTime > ti.LongPressDelay && !this._isPointerSwiping() && (this._startingPointerTime = 0, a.processTrigger(8, Ci.CreateNew(o.pickedMesh, t)));\n }, ti.LongPressDelay);\n }\n } else\n for (const a of i._pointerDownStage)\n e = a.action(this._unTranslatedPointerX, this._unTranslatedPointerY, e, t, !1);\n let r;\n const s = pt.POINTERDOWN;\n e ? (i.onPointerDown && i.onPointerDown(t, e, s), r = new Is(s, t, e), this._setRayOnPointerInfo(e, t)) : r = new Is(s, t, null, this), i.onPointerObservable.hasObservers() && i.onPointerObservable.notifyObservers(r, s);\n }\n /**\n * @internal\n * @internals Boolean if delta for pointer exceeds drag movement threshold\n */\n _isPointerSwiping() {\n return this._isSwiping;\n }\n /**\n * Use this method to simulate a pointer up on a mesh\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\n * @param pickResult - pickingInfo of the object wished to simulate pointer event on\n * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\n * @param doubleTap - indicates that the pointer up event should be considered as part of a double click (false by default)\n */\n simulatePointerUp(e, t, i) {\n const r = new PointerEvent(\"pointerup\", t);\n r.inputIndex = Be.Move;\n const s = new og();\n i ? s.doubleClick = !0 : s.singleClick = !0, !this._checkPrePointerObservable(e, r, pt.POINTERUP) && this._processPointerUp(e, r, s);\n }\n _processPointerUp(e, t, i) {\n const r = this._scene;\n if (e != null && e.pickedMesh) {\n if (this._pickedUpMesh = e.pickedMesh, this._pickedDownMesh === this._pickedUpMesh && (r.onPointerPick && r.onPointerPick(t, e), i.singleClick && !i.ignore && r.onPointerObservable.observers.length > this._cameraObserverCount)) {\n const a = pt.POINTERPICK, o = new Is(a, t, e);\n this._setRayOnPointerInfo(e, t), r.onPointerObservable.notifyObservers(o, a);\n }\n const s = e.pickedMesh._getActionManagerForTrigger();\n if (s && !i.ignore) {\n s.processTrigger(7, Ci.CreateNew(e.pickedMesh, t, e)), !i.hasSwiped && i.singleClick && s.processTrigger(1, Ci.CreateNew(e.pickedMesh, t, e));\n const a = e.pickedMesh._getActionManagerForTrigger(6);\n i.doubleClick && a && a.processTrigger(6, Ci.CreateNew(e.pickedMesh, t, e));\n }\n } else if (!i.ignore)\n for (const s of r._pointerUpStage)\n e = s.action(this._unTranslatedPointerX, this._unTranslatedPointerY, e, t, i.doubleClick);\n if (this._pickedDownMesh && this._pickedDownMesh !== this._pickedUpMesh) {\n const s = this._pickedDownMesh._getActionManagerForTrigger(16);\n s && s.processTrigger(16, Ci.CreateNew(this._pickedDownMesh, t));\n }\n if (!i.ignore) {\n const s = new Is(pt.POINTERUP, t, e);\n if (this._setRayOnPointerInfo(e, t), r.onPointerObservable.notifyObservers(s, pt.POINTERUP), r.onPointerUp && r.onPointerUp(t, e, pt.POINTERUP), !i.hasSwiped && !this._skipPointerTap && !this._isMultiTouchGesture) {\n let a = 0;\n if (i.singleClick ? a = pt.POINTERTAP : i.doubleClick && (a = pt.POINTERDOUBLETAP), a) {\n const o = new Is(a, t, e);\n r.onPointerObservable.hasObservers() && r.onPointerObservable.hasSpecificMask(a) && r.onPointerObservable.notifyObservers(o, a);\n }\n }\n }\n }\n /**\n * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down)\n * @param pointerId - defines the pointer id to use in a multi-touch scenario (0 by default)\n * @returns true if the pointer was captured\n */\n isPointerCaptured(e = 0) {\n return this._pointerCaptures[e];\n }\n /**\n * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp\n * @param attachUp - defines if you want to attach events to pointerup\n * @param attachDown - defines if you want to attach events to pointerdown\n * @param attachMove - defines if you want to attach events to pointermove\n * @param elementToAttachTo - defines the target DOM element to attach to (will use the canvas by default)\n */\n attachControl(e = !0, t = !0, i = !0, r = null) {\n const s = this._scene, a = s.getEngine();\n r || (r = a.getInputElement()), this._alreadyAttached && this.detachControl(), r && (this._alreadyAttachedTo = r), this._deviceSourceManager = new Ly(a), this._initActionManager = (o) => {\n if (!this._meshPickProceed) {\n const l = s.skipPointerUpPicking || s._registeredActions === 0 && !this._checkForPicking() && !s.onPointerUp ? null : s.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, s.pointerUpPredicate, s.pointerUpFastCheck, s.cameraToUseForPointers, s.pointerUpTrianglePredicate);\n this._currentPickResult = l, l && (o = l.hit && l.pickedMesh ? l.pickedMesh._getActionManagerForTrigger() : null), this._meshPickProceed = !0;\n }\n return o;\n }, this._delayedSimpleClick = (o, l, c) => {\n if ((Date.now() - this._previousStartingPointerTime > ti.DoubleClickDelay && !this._doubleClickOccured || o !== this._previousButtonPressed) && (this._doubleClickOccured = !1, l.singleClick = !0, l.ignore = !1, this._delayedClicks[o])) {\n const h = this._delayedClicks[o].evt, u = pt.POINTERTAP, f = new Is(u, h, this._currentPickResult);\n s.onPointerObservable.hasObservers() && s.onPointerObservable.hasSpecificMask(u) && s.onPointerObservable.notifyObservers(f, u), this._delayedClicks[o] = null;\n }\n }, this._initClickEvent = (o, l, c, h) => {\n var g, m;\n const u = new og();\n this._currentPickResult = null;\n let f = null, d = o.hasSpecificMask(pt.POINTERPICK) || l.hasSpecificMask(pt.POINTERPICK) || o.hasSpecificMask(pt.POINTERTAP) || l.hasSpecificMask(pt.POINTERTAP) || o.hasSpecificMask(pt.POINTERDOUBLETAP) || l.hasSpecificMask(pt.POINTERDOUBLETAP);\n !d && xr && (f = this._initActionManager(f, u), f && (d = f.hasPickTriggers));\n let p = !1;\n if (d) {\n const v = c.button;\n if (u.hasSwiped = this._isPointerSwiping(), !u.hasSwiped) {\n let E = !ti.ExclusiveDoubleClickMode;\n if (E || (E = !o.hasSpecificMask(pt.POINTERDOUBLETAP) && !l.hasSpecificMask(pt.POINTERDOUBLETAP), E && !xr.HasSpecificTrigger(6) && (f = this._initActionManager(f, u), f && (E = !f.hasSpecificTrigger(6)))), E)\n (Date.now() - this._previousStartingPointerTime > ti.DoubleClickDelay || v !== this._previousButtonPressed) && (u.singleClick = !0, h(u, this._currentPickResult), p = !0);\n else {\n const T = {\n evt: c,\n clickInfo: u,\n timeoutId: window.setTimeout(this._delayedSimpleClick.bind(this, v, u, h), ti.DoubleClickDelay)\n };\n this._delayedClicks[v] = T;\n }\n let C = o.hasSpecificMask(pt.POINTERDOUBLETAP) || l.hasSpecificMask(pt.POINTERDOUBLETAP);\n !C && xr.HasSpecificTrigger(6) && (f = this._initActionManager(f, u), f && (C = f.hasSpecificTrigger(6))), C && (v === this._previousButtonPressed && Date.now() - this._previousStartingPointerTime < ti.DoubleClickDelay && !this._doubleClickOccured ? (!u.hasSwiped && !this._isPointerSwiping() ? (this._previousStartingPointerTime = 0, this._doubleClickOccured = !0, u.doubleClick = !0, u.ignore = !1, ti.ExclusiveDoubleClickMode && this._delayedClicks[v] && (clearTimeout((g = this._delayedClicks[v]) == null ? void 0 : g.timeoutId), this._delayedClicks[v] = null), h(u, this._currentPickResult)) : (this._doubleClickOccured = !1, this._previousStartingPointerTime = this._startingPointerTime, this._previousStartingPointerPosition.x = this._startingPointerPosition.x, this._previousStartingPointerPosition.y = this._startingPointerPosition.y, this._previousButtonPressed = v, ti.ExclusiveDoubleClickMode ? (this._delayedClicks[v] && (clearTimeout((m = this._delayedClicks[v]) == null ? void 0 : m.timeoutId), this._delayedClicks[v] = null), h(u, this._previousPickResult)) : h(u, this._currentPickResult)), p = !0) : (this._doubleClickOccured = !1, this._previousStartingPointerTime = this._startingPointerTime, this._previousStartingPointerPosition.x = this._startingPointerPosition.x, this._previousStartingPointerPosition.y = this._startingPointerPosition.y, this._previousButtonPressed = v));\n }\n }\n p || h(u, this._currentPickResult);\n }, this._onPointerMove = (o) => {\n if (this._updatePointerPosition(o), !this._isSwiping && this._swipeButtonPressed !== -1 && (this._isSwiping = Math.abs(this._startingPointerPosition.x - this._pointerX) > ti.DragMovementThreshold || Math.abs(this._startingPointerPosition.y - this._pointerY) > ti.DragMovementThreshold), a.isPointerLock && a._verifyPointerLock(), this._checkPrePointerObservable(null, o, o.inputIndex >= Be.MouseWheelX && o.inputIndex <= Be.MouseWheelZ ? pt.POINTERWHEEL : pt.POINTERMOVE) || !s.cameraToUseForPointers && !s.activeCamera)\n return;\n if (s.skipPointerMovePicking) {\n this._processPointerMove(new ps(), o);\n return;\n }\n s.pointerMovePredicate || (s.pointerMovePredicate = (c) => c.isPickable && c.isVisible && c.isReady() && c.isEnabled() && (c.enablePointerMoveEvents || s.constantlyUpdateMeshUnderPointer || c._getActionManagerForTrigger() !== null) && (!s.cameraToUseForPointers || (s.cameraToUseForPointers.layerMask & c.layerMask) !== 0));\n const l = s._registeredActions > 0 || s.constantlyUpdateMeshUnderPointer ? this._pickMove(o) : null;\n this._processPointerMove(l, o);\n }, this._onPointerDown = (o) => {\n var c;\n if (this._totalPointersPressed++, this._pickedDownMesh = null, this._meshPickProceed = !1, ti.ExclusiveDoubleClickMode) {\n for (let h = 0; h < this._delayedClicks.length; h++)\n if (this._delayedClicks[h])\n if (o.button === h)\n clearTimeout((c = this._delayedClicks[h]) == null ? void 0 : c.timeoutId);\n else {\n const u = this._delayedClicks[h].clickInfo;\n this._doubleClickOccured = !1, u.singleClick = !0, u.ignore = !1;\n const f = this._delayedClicks[h].evt, d = pt.POINTERTAP, p = new Is(d, f, this._currentPickResult);\n s.onPointerObservable.hasObservers() && s.onPointerObservable.hasSpecificMask(d) && s.onPointerObservable.notifyObservers(p, d), this._delayedClicks[h] = null;\n }\n }\n if (this._updatePointerPosition(o), this._swipeButtonPressed === -1 && (this._swipeButtonPressed = o.button), s.preventDefaultOnPointerDown && r && (o.preventDefault(), r.focus()), this._startingPointerPosition.x = this._pointerX, this._startingPointerPosition.y = this._pointerY, this._startingPointerTime = Date.now(), this._checkPrePointerObservable(null, o, pt.POINTERDOWN) || !s.cameraToUseForPointers && !s.activeCamera)\n return;\n this._pointerCaptures[o.pointerId] = !0, s.pointerDownPredicate || (s.pointerDownPredicate = (h) => h.isPickable && h.isVisible && h.isReady() && h.isEnabled() && (!s.cameraToUseForPointers || (s.cameraToUseForPointers.layerMask & h.layerMask) !== 0)), this._pickedDownMesh = null;\n let l;\n s.skipPointerDownPicking || s._registeredActions === 0 && !this._checkForPicking() && !s.onPointerDown ? l = new ps() : l = s.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, s.pointerDownPredicate, s.pointerDownFastCheck, s.cameraToUseForPointers, s.pointerDownTrianglePredicate), this._processPointerDown(l, o);\n }, this._onPointerUp = (o) => {\n this._totalPointersPressed !== 0 && (this._totalPointersPressed--, this._pickedUpMesh = null, this._meshPickProceed = !1, this._updatePointerPosition(o), s.preventDefaultOnPointerUp && r && (o.preventDefault(), r.focus()), this._initClickEvent(s.onPrePointerObservable, s.onPointerObservable, o, (l, c) => {\n if (s.onPrePointerObservable.hasObservers() && (this._skipPointerTap = !1, !l.ignore)) {\n if (this._checkPrePointerObservable(null, o, pt.POINTERUP)) {\n this._swipeButtonPressed === o.button && (this._isSwiping = !1, this._swipeButtonPressed = -1), o.buttons === 0 && (this._pointerCaptures[o.pointerId] = !1);\n return;\n }\n l.hasSwiped || (l.singleClick && s.onPrePointerObservable.hasSpecificMask(pt.POINTERTAP) && this._checkPrePointerObservable(null, o, pt.POINTERTAP) && (this._skipPointerTap = !0), l.doubleClick && s.onPrePointerObservable.hasSpecificMask(pt.POINTERDOUBLETAP) && this._checkPrePointerObservable(null, o, pt.POINTERDOUBLETAP) && (this._skipPointerTap = !0));\n }\n if (!this._pointerCaptures[o.pointerId]) {\n this._swipeButtonPressed === o.button && (this._isSwiping = !1, this._swipeButtonPressed = -1);\n return;\n }\n o.buttons === 0 && (this._pointerCaptures[o.pointerId] = !1), !(!s.cameraToUseForPointers && !s.activeCamera) && (s.pointerUpPredicate || (s.pointerUpPredicate = (h) => h.isPickable && h.isVisible && h.isReady() && h.isEnabled() && (!s.cameraToUseForPointers || (s.cameraToUseForPointers.layerMask & h.layerMask) !== 0)), !this._meshPickProceed && (xr && xr.HasTriggers || this._checkForPicking() || s.onPointerUp) && this._initActionManager(null, l), c || (c = this._currentPickResult), this._processPointerUp(c, o, l), this._previousPickResult = this._currentPickResult, this._swipeButtonPressed === o.button && (this._isSwiping = !1, this._swipeButtonPressed = -1));\n }));\n }, this._onKeyDown = (o) => {\n const l = tc.KEYDOWN;\n if (s.onPreKeyboardObservable.hasObservers()) {\n const c = new Jp(l, o);\n if (s.onPreKeyboardObservable.notifyObservers(c, l), c.skipOnKeyboardObservable)\n return;\n }\n if (s.onKeyboardObservable.hasObservers()) {\n const c = new _u(l, o);\n s.onKeyboardObservable.notifyObservers(c, l);\n }\n s.actionManager && s.actionManager.processTrigger(14, Ci.CreateNewFromScene(s, o));\n }, this._onKeyUp = (o) => {\n const l = tc.KEYUP;\n if (s.onPreKeyboardObservable.hasObservers()) {\n const c = new Jp(l, o);\n if (s.onPreKeyboardObservable.notifyObservers(c, l), c.skipOnKeyboardObservable)\n return;\n }\n if (s.onKeyboardObservable.hasObservers()) {\n const c = new _u(l, o);\n s.onKeyboardObservable.notifyObservers(c, l);\n }\n s.actionManager && s.actionManager.processTrigger(15, Ci.CreateNewFromScene(s, o));\n }, this._deviceSourceManager.onDeviceConnectedObservable.add((o) => {\n o.deviceType === Pe.Mouse ? o.onInputChangedObservable.add((l) => {\n l.inputIndex === Be.LeftClick || l.inputIndex === Be.MiddleClick || l.inputIndex === Be.RightClick || l.inputIndex === Be.BrowserBack || l.inputIndex === Be.BrowserForward ? t && o.getInput(l.inputIndex) === 1 ? this._onPointerDown(l) : e && o.getInput(l.inputIndex) === 0 && this._onPointerUp(l) : i && (l.inputIndex === Be.Move ? this._onPointerMove(l) : (l.inputIndex === Be.MouseWheelX || l.inputIndex === Be.MouseWheelY || l.inputIndex === Be.MouseWheelZ) && this._onPointerMove(l));\n }) : o.deviceType === Pe.Touch ? o.onInputChangedObservable.add((l) => {\n l.inputIndex === Be.LeftClick && (t && o.getInput(l.inputIndex) === 1 ? (this._onPointerDown(l), this._totalPointersPressed > 1 && (this._isMultiTouchGesture = !0)) : e && o.getInput(l.inputIndex) === 0 && (this._onPointerUp(l), this._totalPointersPressed === 0 && (this._isMultiTouchGesture = !1))), i && l.inputIndex === Be.Move && this._onPointerMove(l);\n }) : o.deviceType === Pe.Keyboard && o.onInputChangedObservable.add((l) => {\n l.type === \"keydown\" ? this._onKeyDown(l) : l.type === \"keyup\" && this._onKeyUp(l);\n });\n }), this._alreadyAttached = !0;\n }\n /**\n * Detaches all event handlers\n */\n detachControl() {\n this._alreadyAttached && (this._deviceSourceManager.dispose(), this._deviceSourceManager = null, this._alreadyAttachedTo && !this._scene.doNotHandleCursors && (this._alreadyAttachedTo.style.cursor = this._scene.defaultCursor), this._alreadyAttached = !1, this._alreadyAttachedTo = null);\n }\n /**\n * Force the value of meshUnderPointer\n * @param mesh - defines the mesh to use\n * @param pointerId - optional pointer id when using more than one pointer. Defaults to 0\n * @param pickResult - optional pickingInfo data used to find mesh\n * @param evt - optional pointer event\n */\n setPointerOverMesh(e, t = 0, i, r) {\n if (this._meshUnderPointerId[t] === e && (!e || !e._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting))\n return;\n const s = this._meshUnderPointerId[t];\n let a;\n s && (a = s._getActionManagerForTrigger(10), a && a.processTrigger(10, Ci.CreateNew(s, r, { pointerId: t }))), e ? (this._meshUnderPointerId[t] = e, this._pointerOverMesh = e, a = e._getActionManagerForTrigger(9), a && a.processTrigger(9, Ci.CreateNew(e, r, { pointerId: t, pickResult: i }))) : (delete this._meshUnderPointerId[t], this._pointerOverMesh = null);\n }\n /**\n * Gets the mesh under the pointer\n * @returns a Mesh or null if no mesh is under the pointer\n */\n getPointerOverMesh() {\n return this.meshUnderPointer;\n }\n /**\n * @param mesh - Mesh to invalidate\n * @internal\n */\n _invalidateMesh(e) {\n this._pointerOverMesh === e && (this._pointerOverMesh = null), this._pickedDownMesh === e && (this._pickedDownMesh = null), this._pickedUpMesh === e && (this._pickedUpMesh = null);\n for (const t in this._meshUnderPointerId)\n this._meshUnderPointerId[t] === e && delete this._meshUnderPointerId[t];\n }\n}\nti.DragMovementThreshold = 10;\nti.LongPressDelay = 500;\nti.DoubleClickDelay = 300;\nti.ExclusiveDoubleClickMode = !1;\nclass us {\n /**\n * Returns the smallest value ever\n */\n get min() {\n return this._min;\n }\n /**\n * Returns the biggest value ever\n */\n get max() {\n return this._max;\n }\n /**\n * Returns the average value since the performance counter is running\n */\n get average() {\n return this._average;\n }\n /**\n * Returns the average value of the last second the counter was monitored\n */\n get lastSecAverage() {\n return this._lastSecAverage;\n }\n /**\n * Returns the current value\n */\n get current() {\n return this._current;\n }\n /**\n * Gets the accumulated total\n */\n get total() {\n return this._totalAccumulated;\n }\n /**\n * Gets the total value count\n */\n get count() {\n return this._totalValueCount;\n }\n /**\n * Creates a new counter\n */\n constructor() {\n this._startMonitoringTime = 0, this._min = 0, this._max = 0, this._average = 0, this._lastSecAverage = 0, this._current = 0, this._totalValueCount = 0, this._totalAccumulated = 0, this._lastSecAccumulated = 0, this._lastSecTime = 0, this._lastSecValueCount = 0;\n }\n /**\n * Call this method to start monitoring a new frame.\n * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the start of the frame, then beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count.\n */\n fetchNewFrame() {\n this._totalValueCount++, this._current = 0, this._lastSecValueCount++;\n }\n /**\n * Call this method to monitor a count of something (e.g. mesh drawn in viewport count)\n * @param newCount the count value to add to the monitored count\n * @param fetchResult true when it's the last time in the frame you add to the counter and you wish to update the statistics properties (min/max/average), false if you only want to update statistics.\n */\n addCount(e, t) {\n us.Enabled && (this._current += e, t && this._fetchResult());\n }\n /**\n * Start monitoring this performance counter\n */\n beginMonitoring() {\n us.Enabled && (this._startMonitoringTime = sr.Now);\n }\n /**\n * Compute the time lapsed since the previous beginMonitoring() call.\n * @param newFrame true by default to fetch the result and monitor a new frame, if false the time monitored will be added to the current frame counter\n */\n endMonitoring(e = !0) {\n if (!us.Enabled)\n return;\n e && this.fetchNewFrame();\n const t = sr.Now;\n this._current = t - this._startMonitoringTime, e && this._fetchResult();\n }\n /**\n * Call this method to end the monitoring of a frame.\n * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the end of the frame, after beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count.\n */\n endFrame() {\n this._fetchResult();\n }\n /** @internal */\n _fetchResult() {\n this._totalAccumulated += this._current, this._lastSecAccumulated += this._current, this._min = Math.min(this._min, this._current), this._max = Math.max(this._max, this._current), this._average = this._totalAccumulated / this._totalValueCount;\n const e = sr.Now;\n e - this._lastSecTime > 1e3 && (this._lastSecAverage = this._lastSecAccumulated / this._lastSecValueCount, this._lastSecTime = e, this._lastSecAccumulated = 0, this._lastSecValueCount = 0);\n }\n}\nus.Enabled = !0;\nclass qr {\n /**\n * Creates a Plane object according to the given floats a, b, c, d and the plane equation : ax + by + cz + d = 0\n * @param a a component of the plane\n * @param b b component of the plane\n * @param c c component of the plane\n * @param d d component of the plane\n */\n constructor(e, t, i, r) {\n this.normal = new _(e, t, i), this.d = r;\n }\n /**\n * @returns the plane coordinates as a new array of 4 elements [a, b, c, d].\n */\n asArray() {\n return [this.normal.x, this.normal.y, this.normal.z, this.d];\n }\n // Methods\n /**\n * @returns a new plane copied from the current Plane.\n */\n clone() {\n return new qr(this.normal.x, this.normal.y, this.normal.z, this.d);\n }\n /**\n * @returns the string \"Plane\".\n */\n getClassName() {\n return \"Plane\";\n }\n /**\n * @returns the Plane hash code.\n */\n getHashCode() {\n let e = this.normal.getHashCode();\n return e = e * 397 ^ (this.d | 0), e;\n }\n /**\n * Normalize the current Plane in place.\n * @returns the updated Plane.\n */\n normalize() {\n const e = Math.sqrt(this.normal.x * this.normal.x + this.normal.y * this.normal.y + this.normal.z * this.normal.z);\n let t = 0;\n return e !== 0 && (t = 1 / e), this.normal.x *= t, this.normal.y *= t, this.normal.z *= t, this.d *= t, this;\n }\n /**\n * Applies a transformation the plane and returns the result\n * @param transformation the transformation matrix to be applied to the plane\n * @returns a new Plane as the result of the transformation of the current Plane by the given matrix.\n */\n transform(e) {\n const t = qr._TmpMatrix;\n e.invertToRef(t);\n const i = t.m, r = this.normal.x, s = this.normal.y, a = this.normal.z, o = this.d, l = r * i[0] + s * i[1] + a * i[2] + o * i[3], c = r * i[4] + s * i[5] + a * i[6] + o * i[7], h = r * i[8] + s * i[9] + a * i[10] + o * i[11], u = r * i[12] + s * i[13] + a * i[14] + o * i[15];\n return new qr(l, c, h, u);\n }\n /**\n * Compute the dot product between the point and the plane normal\n * @param point point to calculate the dot product with\n * @returns the dot product (float) of the point coordinates and the plane normal.\n */\n dotCoordinate(e) {\n return this.normal.x * e.x + this.normal.y * e.y + this.normal.z * e.z + this.d;\n }\n /**\n * Updates the current Plane from the plane defined by the three given points.\n * @param point1 one of the points used to construct the plane\n * @param point2 one of the points used to construct the plane\n * @param point3 one of the points used to construct the plane\n * @returns the updated Plane.\n */\n copyFromPoints(e, t, i) {\n const r = t.x - e.x, s = t.y - e.y, a = t.z - e.z, o = i.x - e.x, l = i.y - e.y, c = i.z - e.z, h = s * c - a * l, u = a * o - r * c, f = r * l - s * o, d = Math.sqrt(h * h + u * u + f * f);\n let p;\n return d !== 0 ? p = 1 / d : p = 0, this.normal.x = h * p, this.normal.y = u * p, this.normal.z = f * p, this.d = -(this.normal.x * e.x + this.normal.y * e.y + this.normal.z * e.z), this;\n }\n /**\n * Checks if the plane is facing a given direction (meaning if the plane's normal is pointing in the opposite direction of the given vector).\n * Note that for this function to work as expected you should make sure that:\n * - direction and the plane normal are normalized\n * - epsilon is a number just bigger than -1, something like -0.99 for eg\n * @param direction the direction to check if the plane is facing\n * @param epsilon value the dot product is compared against (returns true if dot <= epsilon)\n * @returns True if the plane is facing the given direction\n */\n isFrontFacingTo(e, t) {\n return _.Dot(this.normal, e) <= t;\n }\n /**\n * Calculates the distance to a point\n * @param point point to calculate distance to\n * @returns the signed distance (float) from the given point to the Plane.\n */\n signedDistanceTo(e) {\n return _.Dot(e, this.normal) + this.d;\n }\n // Statics\n /**\n * Creates a plane from an array\n * @param array the array to create a plane from\n * @returns a new Plane from the given array.\n */\n static FromArray(e) {\n return new qr(e[0], e[1], e[2], e[3]);\n }\n /**\n * Creates a plane from three points\n * @param point1 point used to create the plane\n * @param point2 point used to create the plane\n * @param point3 point used to create the plane\n * @returns a new Plane defined by the three given points.\n */\n static FromPoints(e, t, i) {\n const r = new qr(0, 0, 0, 0);\n return r.copyFromPoints(e, t, i), r;\n }\n /**\n * Creates a plane from an origin point and a normal\n * @param origin origin of the plane to be constructed\n * @param normal normal of the plane to be constructed\n * @returns a new Plane the normal vector to this plane at the given origin point.\n */\n static FromPositionAndNormal(e, t) {\n const i = new qr(0, 0, 0, 0);\n return this.FromPositionAndNormalToRef(e, t, i);\n }\n /**\n * Updates the given Plane \"result\" from an origin point and a normal.\n * @param origin origin of the plane to be constructed\n * @param normal the normalized normals of the plane to be constructed\n * @param result defines the Plane where to store the result\n * @returns result input\n */\n static FromPositionAndNormalToRef(e, t, i) {\n return i.normal.copyFrom(t), i.normal.normalize(), i.d = -e.dot(i.normal), i;\n }\n /**\n * Calculates the distance from a plane and a point\n * @param origin origin of the plane to be constructed\n * @param normal normal of the plane to be constructed\n * @param point point to calculate distance to\n * @returns the signed distance between the plane defined by the normal vector at the \"origin\"\" point and the given other point.\n */\n static SignedDistanceToPlaneFromPositionAndNormal(e, t, i) {\n const r = -(t.x * e.x + t.y * e.y + t.z * e.z);\n return _.Dot(i, t) + r;\n }\n}\nqr._TmpMatrix = w.Identity();\nclass Or {\n /**\n * Gets the planes representing the frustum\n * @param transform matrix to be applied to the returned planes\n * @returns a new array of 6 Frustum planes computed by the given transformation matrix.\n */\n static GetPlanes(e) {\n const t = [];\n for (let i = 0; i < 6; i++)\n t.push(new qr(0, 0, 0, 0));\n return Or.GetPlanesToRef(e, t), t;\n }\n /**\n * Gets the near frustum plane transformed by the transform matrix\n * @param transform transformation matrix to be applied to the resulting frustum plane\n * @param frustumPlane the resulting frustum plane\n */\n static GetNearPlaneToRef(e, t) {\n const i = e.m;\n t.normal.x = i[3] + i[2], t.normal.y = i[7] + i[6], t.normal.z = i[11] + i[10], t.d = i[15] + i[14], t.normalize();\n }\n /**\n * Gets the far frustum plane transformed by the transform matrix\n * @param transform transformation matrix to be applied to the resulting frustum plane\n * @param frustumPlane the resulting frustum plane\n */\n static GetFarPlaneToRef(e, t) {\n const i = e.m;\n t.normal.x = i[3] - i[2], t.normal.y = i[7] - i[6], t.normal.z = i[11] - i[10], t.d = i[15] - i[14], t.normalize();\n }\n /**\n * Gets the left frustum plane transformed by the transform matrix\n * @param transform transformation matrix to be applied to the resulting frustum plane\n * @param frustumPlane the resulting frustum plane\n */\n static GetLeftPlaneToRef(e, t) {\n const i = e.m;\n t.normal.x = i[3] + i[0], t.normal.y = i[7] + i[4], t.normal.z = i[11] + i[8], t.d = i[15] + i[12], t.normalize();\n }\n /**\n * Gets the right frustum plane transformed by the transform matrix\n * @param transform transformation matrix to be applied to the resulting frustum plane\n * @param frustumPlane the resulting frustum plane\n */\n static GetRightPlaneToRef(e, t) {\n const i = e.m;\n t.normal.x = i[3] - i[0], t.normal.y = i[7] - i[4], t.normal.z = i[11] - i[8], t.d = i[15] - i[12], t.normalize();\n }\n /**\n * Gets the top frustum plane transformed by the transform matrix\n * @param transform transformation matrix to be applied to the resulting frustum plane\n * @param frustumPlane the resulting frustum plane\n */\n static GetTopPlaneToRef(e, t) {\n const i = e.m;\n t.normal.x = i[3] - i[1], t.normal.y = i[7] - i[5], t.normal.z = i[11] - i[9], t.d = i[15] - i[13], t.normalize();\n }\n /**\n * Gets the bottom frustum plane transformed by the transform matrix\n * @param transform transformation matrix to be applied to the resulting frustum plane\n * @param frustumPlane the resulting frustum plane\n */\n static GetBottomPlaneToRef(e, t) {\n const i = e.m;\n t.normal.x = i[3] + i[1], t.normal.y = i[7] + i[5], t.normal.z = i[11] + i[9], t.d = i[15] + i[13], t.normalize();\n }\n /**\n * Sets the given array \"frustumPlanes\" with the 6 Frustum planes computed by the given transformation matrix.\n * @param transform transformation matrix to be applied to the resulting frustum planes\n * @param frustumPlanes the resulting frustum planes\n */\n static GetPlanesToRef(e, t) {\n Or.GetNearPlaneToRef(e, t[0]), Or.GetFarPlaneToRef(e, t[1]), Or.GetLeftPlaneToRef(e, t[2]), Or.GetRightPlaneToRef(e, t[3]), Or.GetTopPlaneToRef(e, t[4]), Or.GetBottomPlaneToRef(e, t[5]);\n }\n /**\n * Tests if a point is located between the frustum planes.\n * @param point defines the point to test\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if the point is located between the frustum planes\n */\n static IsPointInFrustum(e, t) {\n for (let i = 0; i < 6; i++)\n if (t[i].dotCoordinate(e) < 0)\n return !1;\n return !0;\n }\n}\nclass rf {\n /**\n * Gets an unique (relatively to the current scene) Id\n */\n static get UniqueId() {\n const e = this._UniqueIdCounter;\n return this._UniqueIdCounter++, e;\n }\n}\nrf._UniqueIdCounter = 1;\nclass Et {\n /**\n * Sort function to order lights for rendering.\n * @param a First Light object to compare to second.\n * @param b Second Light object to compare first.\n * @returns -1 to reduce's a's index relative to be, 0 for no change, 1 to increase a's index relative to b.\n */\n static CompareLightsPriority(e, t) {\n return e.shadowEnabled !== t.shadowEnabled ? (t.shadowEnabled ? 1 : 0) - (e.shadowEnabled ? 1 : 0) : t.renderPriority - e.renderPriority;\n }\n}\nEt.FALLOFF_DEFAULT = 0;\nEt.FALLOFF_PHYSICAL = 1;\nEt.FALLOFF_GLTF = 2;\nEt.FALLOFF_STANDARD = 3;\nEt.LIGHTMAP_DEFAULT = 0;\nEt.LIGHTMAP_SPECULAR = 1;\nEt.LIGHTMAP_SHADOWSONLY = 2;\nEt.INTENSITYMODE_AUTOMATIC = 0;\nEt.INTENSITYMODE_LUMINOUSPOWER = 1;\nEt.INTENSITYMODE_LUMINOUSINTENSITY = 2;\nEt.INTENSITYMODE_ILLUMINANCE = 3;\nEt.INTENSITYMODE_LUMINANCE = 4;\nEt.LIGHTTYPEID_POINTLIGHT = 0;\nEt.LIGHTTYPEID_DIRECTIONALLIGHT = 1;\nEt.LIGHTTYPEID_SPOTLIGHT = 2;\nEt.LIGHTTYPEID_HEMISPHERICLIGHT = 3;\nclass wy {\n constructor() {\n this.pointerDownFastCheck = !1, this.pointerUpFastCheck = !1, this.pointerMoveFastCheck = !1, this.skipPointerMovePicking = !1, this.skipPointerDownPicking = !1, this.skipPointerUpPicking = !1;\n }\n}\nvar fs;\n(function(n) {\n n[n.BackwardCompatible = 0] = \"BackwardCompatible\", n[n.Intermediate = 1] = \"Intermediate\", n[n.Aggressive = 2] = \"Aggressive\";\n})(fs || (fs = {}));\nclass Ot extends Xo {\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Factory used to create the default material.\n * @param scene The scene to create the material for\n * @returns The default material\n */\n static DefaultMaterialFactory(e) {\n throw We(\"StandardMaterial\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Factory used to create the a collision coordinator.\n * @returns The collision coordinator\n */\n static CollisionCoordinatorFactory() {\n throw We(\"DefaultCollisionCoordinator\");\n }\n /**\n * Texture used in all pbr material as the reflection texture.\n * As in the majority of the scene they are the same (exception for multi room and so on),\n * this is easier to reference from here than from all the materials.\n */\n get environmentTexture() {\n return this._environmentTexture;\n }\n /**\n * Texture used in all pbr material as the reflection texture.\n * As in the majority of the scene they are the same (exception for multi room and so on),\n * this is easier to set here than in all the materials.\n */\n set environmentTexture(e) {\n this._environmentTexture !== e && (this._environmentTexture = e, this.markAllMaterialsAsDirty(1));\n }\n /**\n * Default image processing configuration used either in the rendering\n * Forward main pass or through the imageProcessingPostProcess if present.\n * As in the majority of the scene they are the same (exception for multi camera),\n * this is easier to reference from here than from all the materials and post process.\n *\n * No setter as we it is a shared configuration, you can set the values instead.\n */\n get imageProcessingConfiguration() {\n return this._imageProcessingConfiguration;\n }\n /**\n * Gets or sets a value indicating how to treat performance relatively to ease of use and backward compatibility\n */\n get performancePriority() {\n return this._performancePriority;\n }\n set performancePriority(e) {\n if (e !== this._performancePriority) {\n switch (this._performancePriority = e, e) {\n case fs.BackwardCompatible:\n this.skipFrustumClipping = !1, this._renderingManager.maintainStateBetweenFrames = !1, this.skipPointerMovePicking = !1, this.autoClear = !0;\n break;\n case fs.Intermediate:\n this.skipFrustumClipping = !1, this._renderingManager.maintainStateBetweenFrames = !1, this.skipPointerMovePicking = !0, this.autoClear = !1;\n break;\n case fs.Aggressive:\n this.skipFrustumClipping = !0, this._renderingManager.maintainStateBetweenFrames = !0, this.skipPointerMovePicking = !0, this.autoClear = !1;\n break;\n }\n this.onScenePerformancePriorityChangedObservable.notifyObservers(e);\n }\n }\n /**\n * Gets or sets a boolean indicating if all rendering must be done in wireframe\n */\n set forceWireframe(e) {\n this._forceWireframe !== e && (this._forceWireframe = e, this.markAllMaterialsAsDirty(16));\n }\n get forceWireframe() {\n return this._forceWireframe;\n }\n /**\n * Gets or sets a boolean indicating if we should skip the frustum clipping part of the active meshes selection\n */\n set skipFrustumClipping(e) {\n this._skipFrustumClipping !== e && (this._skipFrustumClipping = e);\n }\n get skipFrustumClipping() {\n return this._skipFrustumClipping;\n }\n /**\n * Gets or sets a boolean indicating if all rendering must be done in point cloud\n */\n set forcePointsCloud(e) {\n this._forcePointsCloud !== e && (this._forcePointsCloud = e, this.markAllMaterialsAsDirty(16));\n }\n get forcePointsCloud() {\n return this._forcePointsCloud;\n }\n /**\n * Gets or sets the animation properties override\n */\n get animationPropertiesOverride() {\n return this._animationPropertiesOverride;\n }\n set animationPropertiesOverride(e) {\n this._animationPropertiesOverride = e;\n }\n /** Sets a function to be executed when this scene is disposed. */\n set onDispose(e) {\n this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e);\n }\n /** Sets a function to be executed before rendering this scene */\n set beforeRender(e) {\n this._onBeforeRenderObserver && this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver), e && (this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(e));\n }\n /** Sets a function to be executed after rendering this scene */\n set afterRender(e) {\n this._onAfterRenderObserver && this.onAfterRenderObservable.remove(this._onAfterRenderObserver), e && (this._onAfterRenderObserver = this.onAfterRenderObservable.add(e));\n }\n /** Sets a function to be executed before rendering a camera*/\n set beforeCameraRender(e) {\n this._onBeforeCameraRenderObserver && this.onBeforeCameraRenderObservable.remove(this._onBeforeCameraRenderObserver), this._onBeforeCameraRenderObserver = this.onBeforeCameraRenderObservable.add(e);\n }\n /** Sets a function to be executed after rendering a camera*/\n set afterCameraRender(e) {\n this._onAfterCameraRenderObserver && this.onAfterCameraRenderObservable.remove(this._onAfterCameraRenderObserver), this._onAfterCameraRenderObserver = this.onAfterCameraRenderObservable.add(e);\n }\n /**\n * Gets or sets a predicate used to select candidate meshes for a pointer down event\n */\n get pointerDownPredicate() {\n return this._pointerPickingConfiguration.pointerDownPredicate;\n }\n set pointerDownPredicate(e) {\n this._pointerPickingConfiguration.pointerDownPredicate = e;\n }\n /**\n * Gets or sets a predicate used to select candidate meshes for a pointer up event\n */\n get pointerUpPredicate() {\n return this._pointerPickingConfiguration.pointerUpPredicate;\n }\n set pointerUpPredicate(e) {\n this._pointerPickingConfiguration.pointerUpPredicate = e;\n }\n /**\n * Gets or sets a predicate used to select candidate meshes for a pointer move event\n */\n get pointerMovePredicate() {\n return this._pointerPickingConfiguration.pointerMovePredicate;\n }\n set pointerMovePredicate(e) {\n this._pointerPickingConfiguration.pointerMovePredicate = e;\n }\n /**\n * Gets or sets a predicate used to select candidate meshes for a pointer down event\n */\n get pointerDownFastCheck() {\n return this._pointerPickingConfiguration.pointerDownFastCheck;\n }\n set pointerDownFastCheck(e) {\n this._pointerPickingConfiguration.pointerDownFastCheck = e;\n }\n /**\n * Gets or sets a predicate used to select candidate meshes for a pointer up event\n */\n get pointerUpFastCheck() {\n return this._pointerPickingConfiguration.pointerUpFastCheck;\n }\n set pointerUpFastCheck(e) {\n this._pointerPickingConfiguration.pointerUpFastCheck = e;\n }\n /**\n * Gets or sets a predicate used to select candidate meshes for a pointer move event\n */\n get pointerMoveFastCheck() {\n return this._pointerPickingConfiguration.pointerMoveFastCheck;\n }\n set pointerMoveFastCheck(e) {\n this._pointerPickingConfiguration.pointerMoveFastCheck = e;\n }\n /**\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer move event occurs.\n */\n get skipPointerMovePicking() {\n return this._pointerPickingConfiguration.skipPointerMovePicking;\n }\n set skipPointerMovePicking(e) {\n this._pointerPickingConfiguration.skipPointerMovePicking = e;\n }\n /**\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer down event occurs.\n */\n get skipPointerDownPicking() {\n return this._pointerPickingConfiguration.skipPointerDownPicking;\n }\n set skipPointerDownPicking(e) {\n this._pointerPickingConfiguration.skipPointerDownPicking = e;\n }\n /**\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer up event occurs. Off by default.\n */\n get skipPointerUpPicking() {\n return this._pointerPickingConfiguration.skipPointerUpPicking;\n }\n set skipPointerUpPicking(e) {\n this._pointerPickingConfiguration.skipPointerUpPicking = e;\n }\n /**\n * Gets the pointer coordinates without any translation (ie. straight out of the pointer event)\n */\n get unTranslatedPointer() {\n return this._inputManager.unTranslatedPointer;\n }\n /**\n * Gets or sets the distance in pixel that you have to move to prevent some events. Default is 10 pixels\n */\n static get DragMovementThreshold() {\n return ti.DragMovementThreshold;\n }\n static set DragMovementThreshold(e) {\n ti.DragMovementThreshold = e;\n }\n /**\n * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 500 ms\n */\n static get LongPressDelay() {\n return ti.LongPressDelay;\n }\n static set LongPressDelay(e) {\n ti.LongPressDelay = e;\n }\n /**\n * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 300 ms\n */\n static get DoubleClickDelay() {\n return ti.DoubleClickDelay;\n }\n static set DoubleClickDelay(e) {\n ti.DoubleClickDelay = e;\n }\n /** If you need to check double click without raising a single click at first click, enable this flag */\n static get ExclusiveDoubleClickMode() {\n return ti.ExclusiveDoubleClickMode;\n }\n static set ExclusiveDoubleClickMode(e) {\n ti.ExclusiveDoubleClickMode = e;\n }\n /**\n * Bind the current view position to an effect.\n * @param effect The effect to be bound\n * @param variableName name of the shader variable that will hold the eye position\n * @param isVector3 true to indicates that variableName is a Vector3 and not a Vector4\n * @returns the computed eye position\n */\n bindEyePosition(e, t = \"vEyePosition\", i = !1) {\n const r = this._forcedViewPosition ? this._forcedViewPosition : this._mirroredCameraPosition ? this._mirroredCameraPosition : this.activeCamera.globalPosition, s = this.useRightHandedSystem === (this._mirroredCameraPosition != null);\n return z.Vector4[0].set(r.x, r.y, r.z, s ? -1 : 1), e && (i ? e.setFloat3(t, z.Vector4[0].x, z.Vector4[0].y, z.Vector4[0].z) : e.setVector4(t, z.Vector4[0])), z.Vector4[0];\n }\n /**\n * Update the scene ubo before it can be used in rendering processing\n * @returns the scene UniformBuffer\n */\n finalizeSceneUbo() {\n const e = this.getSceneUniformBuffer(), t = this.bindEyePosition(null);\n return e.updateFloat4(\"vEyePosition\", t.x, t.y, t.z, t.w), e.update(), e;\n }\n /**\n * Gets or sets a boolean indicating if the scene must use right-handed coordinates system\n */\n set useRightHandedSystem(e) {\n this._useRightHandedSystem !== e && (this._useRightHandedSystem = e, this.markAllMaterialsAsDirty(16));\n }\n get useRightHandedSystem() {\n return this._useRightHandedSystem;\n }\n /**\n * Sets the step Id used by deterministic lock step\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\n * @param newStepId defines the step Id\n */\n setStepId(e) {\n this._currentStepId = e;\n }\n /**\n * Gets the step Id used by deterministic lock step\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\n * @returns the step Id\n */\n getStepId() {\n return this._currentStepId;\n }\n /**\n * Gets the internal step used by deterministic lock step\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\n * @returns the internal step\n */\n getInternalStep() {\n return this._currentInternalStep;\n }\n /**\n * Gets or sets a boolean indicating if fog is enabled on this scene\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\n * (Default is true)\n */\n set fogEnabled(e) {\n this._fogEnabled !== e && (this._fogEnabled = e, this.markAllMaterialsAsDirty(16));\n }\n get fogEnabled() {\n return this._fogEnabled;\n }\n /**\n * Gets or sets the fog mode to use\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\n * | mode | value |\n * | --- | --- |\n * | FOGMODE_NONE | 0 |\n * | FOGMODE_EXP | 1 |\n * | FOGMODE_EXP2 | 2 |\n * | FOGMODE_LINEAR | 3 |\n */\n set fogMode(e) {\n this._fogMode !== e && (this._fogMode = e, this.markAllMaterialsAsDirty(16));\n }\n get fogMode() {\n return this._fogMode;\n }\n /**\n * Flag indicating that the frame buffer binding is handled by another component\n */\n get prePass() {\n return !!this.prePassRenderer && this.prePassRenderer.defaultRT.enabled;\n }\n /**\n * Gets or sets a boolean indicating if shadows are enabled on this scene\n */\n set shadowsEnabled(e) {\n this._shadowsEnabled !== e && (this._shadowsEnabled = e, this.markAllMaterialsAsDirty(2));\n }\n get shadowsEnabled() {\n return this._shadowsEnabled;\n }\n /**\n * Gets or sets a boolean indicating if lights are enabled on this scene\n */\n set lightsEnabled(e) {\n this._lightsEnabled !== e && (this._lightsEnabled = e, this.markAllMaterialsAsDirty(2));\n }\n get lightsEnabled() {\n return this._lightsEnabled;\n }\n /** All of the active cameras added to this scene. */\n get activeCameras() {\n return this._activeCameras;\n }\n set activeCameras(e) {\n this._unObserveActiveCameras && (this._unObserveActiveCameras(), this._unObserveActiveCameras = null), e && (this._unObserveActiveCameras = z_(e, () => {\n this.onActiveCamerasChanged.notifyObservers(this);\n })), this._activeCameras = e;\n }\n /** Gets or sets the current active camera */\n get activeCamera() {\n return this._activeCamera;\n }\n set activeCamera(e) {\n e !== this._activeCamera && (this._activeCamera = e, this.onActiveCameraChanged.notifyObservers(this));\n }\n /** The default material used on meshes when no material is affected */\n get defaultMaterial() {\n return this._defaultMaterial || (this._defaultMaterial = Ot.DefaultMaterialFactory(this)), this._defaultMaterial;\n }\n /** The default material used on meshes when no material is affected */\n set defaultMaterial(e) {\n this._defaultMaterial = e;\n }\n /**\n * Gets or sets a boolean indicating if textures are enabled on this scene\n */\n set texturesEnabled(e) {\n this._texturesEnabled !== e && (this._texturesEnabled = e, this.markAllMaterialsAsDirty(1));\n }\n get texturesEnabled() {\n return this._texturesEnabled;\n }\n /**\n * Gets or sets a boolean indicating if skeletons are enabled on this scene\n */\n set skeletonsEnabled(e) {\n this._skeletonsEnabled !== e && (this._skeletonsEnabled = e, this.markAllMaterialsAsDirty(8));\n }\n get skeletonsEnabled() {\n return this._skeletonsEnabled;\n }\n /** @internal */\n get collisionCoordinator() {\n return this._collisionCoordinator || (this._collisionCoordinator = Ot.CollisionCoordinatorFactory(), this._collisionCoordinator.init(this)), this._collisionCoordinator;\n }\n /**\n * Gets the scene's rendering manager\n */\n get renderingManager() {\n return this._renderingManager;\n }\n /**\n * Gets the list of frustum planes (built from the active camera)\n */\n get frustumPlanes() {\n return this._frustumPlanes;\n }\n /**\n * Registers the transient components if needed.\n */\n _registerTransientComponents() {\n if (this._transientComponents.length > 0) {\n for (const e of this._transientComponents)\n e.register();\n this._transientComponents.length = 0;\n }\n }\n /**\n * @internal\n * Add a component to the scene.\n * Note that the ccomponent could be registered on th next frame if this is called after\n * the register component stage.\n * @param component Defines the component to add to the scene\n */\n _addComponent(e) {\n this._components.push(e), this._transientComponents.push(e);\n const t = e;\n t.addFromContainer && t.serialize && this._serializableComponents.push(t);\n }\n /**\n * @internal\n * Gets a component from the scene.\n * @param name defines the name of the component to retrieve\n * @returns the component or null if not present\n */\n _getComponent(e) {\n for (const t of this._components)\n if (t.name === e)\n return t;\n return null;\n }\n /**\n * Creates a new Scene\n * @param engine defines the engine to use to render this scene\n * @param options defines the scene options\n */\n constructor(e, t) {\n super(), this._inputManager = new ti(this), this.cameraToUseForPointers = null, this._isScene = !0, this._blockEntityCollection = !1, this.autoClear = !0, this.autoClearDepthAndStencil = !0, this.clearColor = new et(0.2, 0.2, 0.3, 1), this.ambientColor = new Ne(0, 0, 0), this.environmentIntensity = 1, this._performancePriority = fs.BackwardCompatible, this.onScenePerformancePriorityChangedObservable = new he(), this._forceWireframe = !1, this._skipFrustumClipping = !1, this._forcePointsCloud = !1, this.animationsEnabled = !0, this._animationPropertiesOverride = null, this.useConstantAnimationDeltaTime = !1, this.constantlyUpdateMeshUnderPointer = !1, this.hoverCursor = \"pointer\", this.defaultCursor = \"\", this.doNotHandleCursors = !1, this.preventDefaultOnPointerDown = !0, this.preventDefaultOnPointerUp = !0, this.metadata = null, this.reservedDataStore = null, this.disableOfflineSupportExceptionRules = [], this.onDisposeObservable = new he(), this._onDisposeObserver = null, this.onBeforeRenderObservable = new he(), this._onBeforeRenderObserver = null, this.onAfterRenderObservable = new he(), this.onAfterRenderCameraObservable = new he(), this._onAfterRenderObserver = null, this.onBeforeAnimationsObservable = new he(), this.onAfterAnimationsObservable = new he(), this.onBeforeDrawPhaseObservable = new he(), this.onAfterDrawPhaseObservable = new he(), this.onReadyObservable = new he(), this.onBeforeCameraRenderObservable = new he(), this._onBeforeCameraRenderObserver = null, this.onAfterCameraRenderObservable = new he(), this._onAfterCameraRenderObserver = null, this.onBeforeActiveMeshesEvaluationObservable = new he(), this.onAfterActiveMeshesEvaluationObservable = new he(), this.onBeforeParticlesRenderingObservable = new he(), this.onAfterParticlesRenderingObservable = new he(), this.onDataLoadedObservable = new he(), this.onNewCameraAddedObservable = new he(), this.onCameraRemovedObservable = new he(), this.onNewLightAddedObservable = new he(), this.onLightRemovedObservable = new he(), this.onNewGeometryAddedObservable = new he(), this.onGeometryRemovedObservable = new he(), this.onNewTransformNodeAddedObservable = new he(), this.onTransformNodeRemovedObservable = new he(), this.onNewMeshAddedObservable = new he(), this.onMeshRemovedObservable = new he(), this.onNewSkeletonAddedObservable = new he(), this.onSkeletonRemovedObservable = new he(), this.onNewMaterialAddedObservable = new he(), this.onNewMultiMaterialAddedObservable = new he(), this.onMaterialRemovedObservable = new he(), this.onMultiMaterialRemovedObservable = new he(), this.onNewTextureAddedObservable = new he(), this.onTextureRemovedObservable = new he(), this.onBeforeRenderTargetsRenderObservable = new he(), this.onAfterRenderTargetsRenderObservable = new he(), this.onBeforeStepObservable = new he(), this.onAfterStepObservable = new he(), this.onActiveCameraChanged = new he(), this.onActiveCamerasChanged = new he(), this.onBeforeRenderingGroupObservable = new he(), this.onAfterRenderingGroupObservable = new he(), this.onMeshImportedObservable = new he(), this.onAnimationFileImportedObservable = new he(), this._registeredForLateAnimationBindings = new xn(256), this._pointerPickingConfiguration = new wy(), this.onPrePointerObservable = new he(), this.onPointerObservable = new he(), this.onPreKeyboardObservable = new he(), this.onKeyboardObservable = new he(), this._useRightHandedSystem = !1, this._timeAccumulator = 0, this._currentStepId = 0, this._currentInternalStep = 0, this._fogEnabled = !0, this._fogMode = Ot.FOGMODE_NONE, this.fogColor = new Ne(0.2, 0.2, 0.3), this.fogDensity = 0.1, this.fogStart = 0, this.fogEnd = 1e3, this.needsPreviousWorldMatrices = !1, this._shadowsEnabled = !0, this._lightsEnabled = !0, this._unObserveActiveCameras = null, this._texturesEnabled = !0, this.physicsEnabled = !0, this.particlesEnabled = !0, this.spritesEnabled = !0, this._skeletonsEnabled = !0, this.lensFlaresEnabled = !0, this.collisionsEnabled = !0, this.gravity = new _(0, -9.807, 0), this.postProcessesEnabled = !0, this.renderTargetsEnabled = !0, this.dumpNextRenderTargets = !1, this.customRenderTargets = [], this.importedMeshesFiles = [], this.probesEnabled = !0, this._meshesForIntersections = new xn(256), this.proceduralTexturesEnabled = !0, this._totalVertices = new us(), this._activeIndices = new us(), this._activeParticles = new us(), this._activeBones = new us(), this._animationTime = 0, this.animationTimeScale = 1, this._renderId = 0, this._frameId = 0, this._executeWhenReadyTimeoutId = null, this._intermediateRendering = !1, this._defaultFrameBufferCleared = !1, this._viewUpdateFlag = -1, this._projectionUpdateFlag = -1, this._toBeDisposed = new Array(256), this._activeRequests = new Array(), this._pendingData = new Array(), this._isDisposed = !1, this.dispatchAllSubMeshesOfActiveMeshes = !1, this._activeMeshes = new Li(256), this._processedMaterials = new Li(256), this._renderTargets = new xn(256), this._materialsRenderTargets = new xn(256), this._activeParticleSystems = new Li(256), this._activeSkeletons = new xn(32), this._softwareSkinnedMeshes = new xn(32), this._activeAnimatables = new Array(), this._transformMatrix = w.Zero(), this.requireLightSorting = !1, this._components = [], this._serializableComponents = [], this._transientComponents = [], this._beforeCameraUpdateStage = ei.Create(), this._beforeClearStage = ei.Create(), this._beforeRenderTargetClearStage = ei.Create(), this._gatherRenderTargetsStage = ei.Create(), this._gatherActiveCameraRenderTargetsStage = ei.Create(), this._isReadyForMeshStage = ei.Create(), this._beforeEvaluateActiveMeshStage = ei.Create(), this._evaluateSubMeshStage = ei.Create(), this._preActiveMeshStage = ei.Create(), this._cameraDrawRenderTargetStage = ei.Create(), this._beforeCameraDrawStage = ei.Create(), this._beforeRenderTargetDrawStage = ei.Create(), this._beforeRenderingGroupDrawStage = ei.Create(), this._beforeRenderingMeshStage = ei.Create(), this._afterRenderingMeshStage = ei.Create(), this._afterRenderingGroupDrawStage = ei.Create(), this._afterCameraDrawStage = ei.Create(), this._afterCameraPostProcessStage = ei.Create(), this._afterRenderTargetDrawStage = ei.Create(), this._afterRenderTargetPostProcessStage = ei.Create(), this._afterRenderStage = ei.Create(), this._pointerMoveStage = ei.Create(), this._pointerDownStage = ei.Create(), this._pointerUpStage = ei.Create(), this._geometriesByUniqueId = null, this._defaultMeshCandidates = {\n data: [],\n length: 0\n }, this._defaultSubMeshCandidates = {\n data: [],\n length: 0\n }, this._preventFreeActiveMeshesAndRenderingGroups = !1, this._activeMeshesFrozen = !1, this._activeMeshesFrozenButKeepClipping = !1, this._skipEvaluateActiveMeshesCompletely = !1, this._allowPostProcessClearColor = !0, this.getDeterministicFrameTime = () => this._engine.getTimeStep(), this._registeredActions = 0, this._blockMaterialDirtyMechanism = !1, this._perfCollector = null, this.activeCameras = [];\n const i = {\n useGeometryUniqueIdsMap: !0,\n useMaterialMeshMap: !0,\n useClonedMeshMap: !0,\n virtual: !1,\n ...t\n };\n e = this._engine = e || st.LastCreatedEngine, i.virtual ? e._virtualScenes.push(this) : (st._LastCreatedScene = this, e.scenes.push(this)), this._uid = null, this._renderingManager = new Di(this), mu && (this.postProcessManager = new mu(this)), yi() && this.attachControl(), this._createUbo(), at && (this._imageProcessingConfiguration = new at()), this.setDefaultCandidateProviders(), i.useGeometryUniqueIdsMap && (this._geometriesByUniqueId = {}), this.useMaterialMeshMap = i.useMaterialMeshMap, this.useClonedMeshMap = i.useClonedMeshMap, (!t || !t.virtual) && e.onNewSceneAddedObservable.notifyObservers(this);\n }\n /**\n * Gets a string identifying the name of the class\n * @returns \"Scene\" string\n */\n getClassName() {\n return \"Scene\";\n }\n /**\n * @internal\n */\n _getDefaultMeshCandidates() {\n return this._defaultMeshCandidates.data = this.meshes, this._defaultMeshCandidates.length = this.meshes.length, this._defaultMeshCandidates;\n }\n /**\n * @internal\n */\n _getDefaultSubMeshCandidates(e) {\n return this._defaultSubMeshCandidates.data = e.subMeshes, this._defaultSubMeshCandidates.length = e.subMeshes.length, this._defaultSubMeshCandidates;\n }\n /**\n * Sets the default candidate providers for the scene.\n * This sets the getActiveMeshCandidates, getActiveSubMeshCandidates, getIntersectingSubMeshCandidates\n * and getCollidingSubMeshCandidates to their default function\n */\n setDefaultCandidateProviders() {\n this.getActiveMeshCandidates = () => this._getDefaultMeshCandidates(), this.getActiveSubMeshCandidates = (e) => this._getDefaultSubMeshCandidates(e), this.getIntersectingSubMeshCandidates = (e, t) => this._getDefaultSubMeshCandidates(e), this.getCollidingSubMeshCandidates = (e, t) => this._getDefaultSubMeshCandidates(e);\n }\n /**\n * Gets the mesh that is currently under the pointer\n */\n get meshUnderPointer() {\n return this._inputManager.meshUnderPointer;\n }\n /**\n * Gets or sets the current on-screen X position of the pointer\n */\n get pointerX() {\n return this._inputManager.pointerX;\n }\n set pointerX(e) {\n this._inputManager.pointerX = e;\n }\n /**\n * Gets or sets the current on-screen Y position of the pointer\n */\n get pointerY() {\n return this._inputManager.pointerY;\n }\n set pointerY(e) {\n this._inputManager.pointerY = e;\n }\n /**\n * Gets the cached material (ie. the latest rendered one)\n * @returns the cached material\n */\n getCachedMaterial() {\n return this._cachedMaterial;\n }\n /**\n * Gets the cached effect (ie. the latest rendered one)\n * @returns the cached effect\n */\n getCachedEffect() {\n return this._cachedEffect;\n }\n /**\n * Gets the cached visibility state (ie. the latest rendered one)\n * @returns the cached visibility state\n */\n getCachedVisibility() {\n return this._cachedVisibility;\n }\n /**\n * Gets a boolean indicating if the current material / effect / visibility must be bind again\n * @param material defines the current material\n * @param effect defines the current effect\n * @param visibility defines the current visibility state\n * @returns true if one parameter is not cached\n */\n isCachedMaterialInvalid(e, t, i = 1) {\n return this._cachedEffect !== t || this._cachedMaterial !== e || this._cachedVisibility !== i;\n }\n /**\n * Gets the engine associated with the scene\n * @returns an Engine\n */\n getEngine() {\n return this._engine;\n }\n /**\n * Gets the total number of vertices rendered per frame\n * @returns the total number of vertices rendered per frame\n */\n getTotalVertices() {\n return this._totalVertices.current;\n }\n /**\n * Gets the performance counter for total vertices\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\n */\n get totalVerticesPerfCounter() {\n return this._totalVertices;\n }\n /**\n * Gets the total number of active indices rendered per frame (You can deduce the number of rendered triangles by dividing this number by 3)\n * @returns the total number of active indices rendered per frame\n */\n getActiveIndices() {\n return this._activeIndices.current;\n }\n /**\n * Gets the performance counter for active indices\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\n */\n get totalActiveIndicesPerfCounter() {\n return this._activeIndices;\n }\n /**\n * Gets the total number of active particles rendered per frame\n * @returns the total number of active particles rendered per frame\n */\n getActiveParticles() {\n return this._activeParticles.current;\n }\n /**\n * Gets the performance counter for active particles\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\n */\n get activeParticlesPerfCounter() {\n return this._activeParticles;\n }\n /**\n * Gets the total number of active bones rendered per frame\n * @returns the total number of active bones rendered per frame\n */\n getActiveBones() {\n return this._activeBones.current;\n }\n /**\n * Gets the performance counter for active bones\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\n */\n get activeBonesPerfCounter() {\n return this._activeBones;\n }\n /**\n * Gets the array of active meshes\n * @returns an array of AbstractMesh\n */\n getActiveMeshes() {\n return this._activeMeshes;\n }\n /**\n * Gets the animation ratio (which is 1.0 is the scene renders at 60fps and 2 if the scene renders at 30fps, etc.)\n * @returns a number\n */\n getAnimationRatio() {\n return this._animationRatio !== void 0 ? this._animationRatio : 1;\n }\n /**\n * Gets an unique Id for the current render phase\n * @returns a number\n */\n getRenderId() {\n return this._renderId;\n }\n /**\n * Gets an unique Id for the current frame\n * @returns a number\n */\n getFrameId() {\n return this._frameId;\n }\n /** Call this function if you want to manually increment the render Id*/\n incrementRenderId() {\n this._renderId++;\n }\n _createUbo() {\n this.setSceneUniformBuffer(this.createSceneUniformBuffer());\n }\n /**\n * Use this method to simulate a pointer move on a mesh\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\n * @param pickResult pickingInfo of the object wished to simulate pointer event on\n * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\n * @returns the current scene\n */\n simulatePointerMove(e, t) {\n return this._inputManager.simulatePointerMove(e, t), this;\n }\n /**\n * Use this method to simulate a pointer down on a mesh\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\n * @param pickResult pickingInfo of the object wished to simulate pointer event on\n * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\n * @returns the current scene\n */\n simulatePointerDown(e, t) {\n return this._inputManager.simulatePointerDown(e, t), this;\n }\n /**\n * Use this method to simulate a pointer up on a mesh\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\n * @param pickResult pickingInfo of the object wished to simulate pointer event on\n * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\n * @param doubleTap indicates that the pointer up event should be considered as part of a double click (false by default)\n * @returns the current scene\n */\n simulatePointerUp(e, t, i) {\n return this._inputManager.simulatePointerUp(e, t, i), this;\n }\n /**\n * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down)\n * @param pointerId defines the pointer id to use in a multi-touch scenario (0 by default)\n * @returns true if the pointer was captured\n */\n isPointerCaptured(e = 0) {\n return this._inputManager.isPointerCaptured(e);\n }\n /**\n * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp\n * @param attachUp defines if you want to attach events to pointerup\n * @param attachDown defines if you want to attach events to pointerdown\n * @param attachMove defines if you want to attach events to pointermove\n */\n attachControl(e = !0, t = !0, i = !0) {\n this._inputManager.attachControl(e, t, i);\n }\n /** Detaches all event handlers*/\n detachControl() {\n this._inputManager.detachControl();\n }\n /**\n * This function will check if the scene can be rendered (textures are loaded, shaders are compiled)\n * Delay loaded resources are not taking in account\n * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: true)\n * @returns true if all required resources are ready\n */\n isReady(e = !0) {\n var a, o;\n if (this._isDisposed)\n return !1;\n let t;\n const i = this.getEngine(), r = i.currentRenderPassId;\n i.currentRenderPassId = ((a = this.activeCamera) == null ? void 0 : a.renderPassId) ?? r;\n let s = !0;\n for (this._pendingData.length > 0 && (s = !1), (o = this.prePassRenderer) == null || o.update(), this.useOrderIndependentTransparency && this.depthPeelingRenderer && s && (s = this.depthPeelingRenderer.isReady()), e && (this._processedMaterials.reset(), this._materialsRenderTargets.reset()), t = 0; t < this.meshes.length; t++) {\n const l = this.meshes[t];\n if (!l.subMeshes || l.subMeshes.length === 0)\n continue;\n if (!l.isReady(!0)) {\n s = !1;\n continue;\n }\n const c = l.hasThinInstances || l.getClassName() === \"InstancedMesh\" || l.getClassName() === \"InstancedLinesMesh\" || i.getCaps().instancedArrays && l.instances.length > 0;\n for (const u of this._isReadyForMeshStage)\n u.action(l, c) || (s = !1);\n if (!e)\n continue;\n const h = l.material || this.defaultMaterial;\n if (h)\n if (h._storeEffectOnSubMeshes)\n for (const u of l.subMeshes) {\n const f = u.getMaterial();\n f && f.hasRenderTargetTextures && f.getRenderTargetTextures != null && this._processedMaterials.indexOf(f) === -1 && (this._processedMaterials.push(f), this._materialsRenderTargets.concatWithNoDuplicate(f.getRenderTargetTextures()));\n }\n else\n h.hasRenderTargetTextures && h.getRenderTargetTextures != null && this._processedMaterials.indexOf(h) === -1 && (this._processedMaterials.push(h), this._materialsRenderTargets.concatWithNoDuplicate(h.getRenderTargetTextures()));\n }\n if (e)\n for (t = 0; t < this._materialsRenderTargets.length; ++t)\n this._materialsRenderTargets.data[t].isReadyForRendering() || (s = !1);\n for (t = 0; t < this.geometries.length; t++)\n this.geometries[t].delayLoadState === 2 && (s = !1);\n if (this.activeCameras && this.activeCameras.length > 0)\n for (const l of this.activeCameras)\n l.isReady(!0) || (s = !1);\n else\n this.activeCamera && (this.activeCamera.isReady(!0) || (s = !1));\n for (const l of this.particleSystems)\n l.isReady() || (s = !1);\n if (this.layers)\n for (const l of this.layers)\n l.isReady() || (s = !1);\n return i.areAllEffectsReady() || (s = !1), i.currentRenderPassId = r, s;\n }\n /** Resets all cached information relative to material (including effect and visibility) */\n resetCachedMaterial() {\n this._cachedMaterial = null, this._cachedEffect = null, this._cachedVisibility = null;\n }\n /**\n * Registers a function to be called before every frame render\n * @param func defines the function to register\n */\n registerBeforeRender(e) {\n this.onBeforeRenderObservable.add(e);\n }\n /**\n * Unregisters a function called before every frame render\n * @param func defines the function to unregister\n */\n unregisterBeforeRender(e) {\n this.onBeforeRenderObservable.removeCallback(e);\n }\n /**\n * Registers a function to be called after every frame render\n * @param func defines the function to register\n */\n registerAfterRender(e) {\n this.onAfterRenderObservable.add(e);\n }\n /**\n * Unregisters a function called after every frame render\n * @param func defines the function to unregister\n */\n unregisterAfterRender(e) {\n this.onAfterRenderObservable.removeCallback(e);\n }\n _executeOnceBeforeRender(e) {\n const t = () => {\n e(), setTimeout(() => {\n this.unregisterBeforeRender(t);\n });\n };\n this.registerBeforeRender(t);\n }\n /**\n * The provided function will run before render once and will be disposed afterwards.\n * A timeout delay can be provided so that the function will be executed in N ms.\n * The timeout is using the browser's native setTimeout so time percision cannot be guaranteed.\n * @param func The function to be executed.\n * @param timeout optional delay in ms\n */\n executeOnceBeforeRender(e, t) {\n t !== void 0 ? setTimeout(() => {\n this._executeOnceBeforeRender(e);\n }, t) : this._executeOnceBeforeRender(e);\n }\n /**\n * This function can help adding any object to the list of data awaited to be ready in order to check for a complete scene loading.\n * @param data defines the object to wait for\n */\n addPendingData(e) {\n this._pendingData.push(e);\n }\n /**\n * Remove a pending data from the loading list which has previously been added with addPendingData.\n * @param data defines the object to remove from the pending list\n */\n removePendingData(e) {\n const t = this.isLoading, i = this._pendingData.indexOf(e);\n i !== -1 && this._pendingData.splice(i, 1), t && !this.isLoading && this.onDataLoadedObservable.notifyObservers(this);\n }\n /**\n * Returns the number of items waiting to be loaded\n * @returns the number of items waiting to be loaded\n */\n getWaitingItemsCount() {\n return this._pendingData.length;\n }\n /**\n * Returns a boolean indicating if the scene is still loading data\n */\n get isLoading() {\n return this._pendingData.length > 0;\n }\n /**\n * Registers a function to be executed when the scene is ready\n * @param func - the function to be executed\n * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false)\n */\n executeWhenReady(e, t = !1) {\n this.onReadyObservable.addOnce(e), this._executeWhenReadyTimeoutId === null && this._checkIsReady(t);\n }\n /**\n * Returns a promise that resolves when the scene is ready\n * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false)\n * @returns A promise that resolves when the scene is ready\n */\n whenReadyAsync(e = !1) {\n return new Promise((t) => {\n this.executeWhenReady(() => {\n t();\n }, e);\n });\n }\n /**\n * @internal\n */\n _checkIsReady(e = !1) {\n if (this._registerTransientComponents(), this.isReady(e)) {\n this.onReadyObservable.notifyObservers(this), this.onReadyObservable.clear(), this._executeWhenReadyTimeoutId = null;\n return;\n }\n if (this._isDisposed) {\n this.onReadyObservable.clear(), this._executeWhenReadyTimeoutId = null;\n return;\n }\n this._executeWhenReadyTimeoutId = setTimeout(() => {\n this.incrementRenderId(), this._checkIsReady(e);\n }, 100);\n }\n /**\n * Gets all animatable attached to the scene\n */\n get animatables() {\n return this._activeAnimatables;\n }\n /**\n * Resets the last animation time frame.\n * Useful to override when animations start running when loading a scene for the first time.\n */\n resetLastAnimationTimeFrame() {\n this._animationTimeLast = sr.Now;\n }\n // Matrix\n /**\n * Gets the current view matrix\n * @returns a Matrix\n */\n getViewMatrix() {\n return this._viewMatrix;\n }\n /**\n * Gets the current projection matrix\n * @returns a Matrix\n */\n getProjectionMatrix() {\n return this._projectionMatrix;\n }\n /**\n * Gets the current transform matrix\n * @returns a Matrix made of View * Projection\n */\n getTransformMatrix() {\n return this._transformMatrix;\n }\n /**\n * Sets the current transform matrix\n * @param viewL defines the View matrix to use\n * @param projectionL defines the Projection matrix to use\n * @param viewR defines the right View matrix to use (if provided)\n * @param projectionR defines the right Projection matrix to use (if provided)\n */\n setTransformMatrix(e, t, i, r) {\n !i && !r && this._multiviewSceneUbo && (this._multiviewSceneUbo.dispose(), this._multiviewSceneUbo = null), !(this._viewUpdateFlag === e.updateFlag && this._projectionUpdateFlag === t.updateFlag) && (this._viewUpdateFlag = e.updateFlag, this._projectionUpdateFlag = t.updateFlag, this._viewMatrix = e, this._projectionMatrix = t, this._viewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix), this._frustumPlanes ? Or.GetPlanesToRef(this._transformMatrix, this._frustumPlanes) : this._frustumPlanes = Or.GetPlanes(this._transformMatrix), this._multiviewSceneUbo && this._multiviewSceneUbo.useUbo ? this._updateMultiviewUbo(i, r) : this._sceneUbo.useUbo && (this._sceneUbo.updateMatrix(\"viewProjection\", this._transformMatrix), this._sceneUbo.updateMatrix(\"view\", this._viewMatrix), this._sceneUbo.updateMatrix(\"projection\", this._projectionMatrix)));\n }\n /**\n * Gets the uniform buffer used to store scene data\n * @returns a UniformBuffer\n */\n getSceneUniformBuffer() {\n return this._multiviewSceneUbo ? this._multiviewSceneUbo : this._sceneUbo;\n }\n /**\n * Creates a scene UBO\n * @param name name of the uniform buffer (optional, for debugging purpose only)\n * @returns a new ubo\n */\n createSceneUniformBuffer(e) {\n const t = new Ie(this._engine, void 0, !1, e ?? \"scene\");\n return t.addUniform(\"viewProjection\", 16), t.addUniform(\"view\", 16), t.addUniform(\"projection\", 16), t.addUniform(\"vEyePosition\", 4), t;\n }\n /**\n * Sets the scene ubo\n * @param ubo the ubo to set for the scene\n */\n setSceneUniformBuffer(e) {\n this._sceneUbo = e, this._viewUpdateFlag = -1, this._projectionUpdateFlag = -1;\n }\n /**\n * Gets an unique (relatively to the current scene) Id\n * @returns an unique number for the scene\n */\n getUniqueId() {\n return rf.UniqueId;\n }\n /**\n * Add a mesh to the list of scene's meshes\n * @param newMesh defines the mesh to add\n * @param recursive if all child meshes should also be added to the scene\n */\n addMesh(e, t = !1) {\n this._blockEntityCollection || (this.meshes.push(e), e._resyncLightSources(), e.parent || e._addToSceneRootNodes(), this.onNewMeshAddedObservable.notifyObservers(e), t && e.getChildMeshes().forEach((i) => {\n this.addMesh(i);\n }));\n }\n /**\n * Remove a mesh for the list of scene's meshes\n * @param toRemove defines the mesh to remove\n * @param recursive if all child meshes should also be removed from the scene\n * @returns the index where the mesh was in the mesh list\n */\n removeMesh(e, t = !1) {\n const i = this.meshes.indexOf(e);\n return i !== -1 && (this.meshes[i] = this.meshes[this.meshes.length - 1], this.meshes.pop(), e.parent || e._removeFromSceneRootNodes()), this._inputManager._invalidateMesh(e), this.onMeshRemovedObservable.notifyObservers(e), t && e.getChildMeshes().forEach((r) => {\n this.removeMesh(r);\n }), i;\n }\n /**\n * Add a transform node to the list of scene's transform nodes\n * @param newTransformNode defines the transform node to add\n */\n addTransformNode(e) {\n this._blockEntityCollection || e.getScene() === this && e._indexInSceneTransformNodesArray !== -1 || (e._indexInSceneTransformNodesArray = this.transformNodes.length, this.transformNodes.push(e), e.parent || e._addToSceneRootNodes(), this.onNewTransformNodeAddedObservable.notifyObservers(e));\n }\n /**\n * Remove a transform node for the list of scene's transform nodes\n * @param toRemove defines the transform node to remove\n * @returns the index where the transform node was in the transform node list\n */\n removeTransformNode(e) {\n const t = e._indexInSceneTransformNodesArray;\n if (t !== -1) {\n if (t !== this.transformNodes.length - 1) {\n const i = this.transformNodes[this.transformNodes.length - 1];\n this.transformNodes[t] = i, i._indexInSceneTransformNodesArray = t;\n }\n e._indexInSceneTransformNodesArray = -1, this.transformNodes.pop(), e.parent || e._removeFromSceneRootNodes();\n }\n return this.onTransformNodeRemovedObservable.notifyObservers(e), t;\n }\n /**\n * Remove a skeleton for the list of scene's skeletons\n * @param toRemove defines the skeleton to remove\n * @returns the index where the skeleton was in the skeleton list\n */\n removeSkeleton(e) {\n const t = this.skeletons.indexOf(e);\n return t !== -1 && (this.skeletons.splice(t, 1), this.onSkeletonRemovedObservable.notifyObservers(e), this._executeActiveContainerCleanup(this._activeSkeletons)), t;\n }\n /**\n * Remove a morph target for the list of scene's morph targets\n * @param toRemove defines the morph target to remove\n * @returns the index where the morph target was in the morph target list\n */\n removeMorphTargetManager(e) {\n const t = this.morphTargetManagers.indexOf(e);\n return t !== -1 && this.morphTargetManagers.splice(t, 1), t;\n }\n /**\n * Remove a light for the list of scene's lights\n * @param toRemove defines the light to remove\n * @returns the index where the light was in the light list\n */\n removeLight(e) {\n const t = this.lights.indexOf(e);\n if (t !== -1) {\n for (const i of this.meshes)\n i._removeLightSource(e, !1);\n this.lights.splice(t, 1), this.sortLightsByPriority(), e.parent || e._removeFromSceneRootNodes();\n }\n return this.onLightRemovedObservable.notifyObservers(e), t;\n }\n /**\n * Remove a camera for the list of scene's cameras\n * @param toRemove defines the camera to remove\n * @returns the index where the camera was in the camera list\n */\n removeCamera(e) {\n const t = this.cameras.indexOf(e);\n if (t !== -1 && (this.cameras.splice(t, 1), e.parent || e._removeFromSceneRootNodes()), this.activeCameras) {\n const i = this.activeCameras.indexOf(e);\n i !== -1 && this.activeCameras.splice(i, 1);\n }\n return this.activeCamera === e && (this.cameras.length > 0 ? this.activeCamera = this.cameras[0] : this.activeCamera = null), this.onCameraRemovedObservable.notifyObservers(e), t;\n }\n /**\n * Remove a particle system for the list of scene's particle systems\n * @param toRemove defines the particle system to remove\n * @returns the index where the particle system was in the particle system list\n */\n removeParticleSystem(e) {\n const t = this.particleSystems.indexOf(e);\n return t !== -1 && (this.particleSystems.splice(t, 1), this._executeActiveContainerCleanup(this._activeParticleSystems)), t;\n }\n /**\n * Remove a animation for the list of scene's animations\n * @param toRemove defines the animation to remove\n * @returns the index where the animation was in the animation list\n */\n removeAnimation(e) {\n const t = this.animations.indexOf(e);\n return t !== -1 && this.animations.splice(t, 1), t;\n }\n /**\n * Will stop the animation of the given target\n * @param target - the target\n * @param animationName - the name of the animation to stop (all animations will be stopped if both this and targetMask are empty)\n * @param targetMask - a function that determines if the animation should be stopped based on its target (all animations will be stopped if both this and animationName are empty)\n */\n stopAnimation(e, t, i) {\n }\n /**\n * Removes the given animation group from this scene.\n * @param toRemove The animation group to remove\n * @returns The index of the removed animation group\n */\n removeAnimationGroup(e) {\n const t = this.animationGroups.indexOf(e);\n return t !== -1 && this.animationGroups.splice(t, 1), t;\n }\n /**\n * Removes the given multi-material from this scene.\n * @param toRemove The multi-material to remove\n * @returns The index of the removed multi-material\n */\n removeMultiMaterial(e) {\n const t = this.multiMaterials.indexOf(e);\n return t !== -1 && this.multiMaterials.splice(t, 1), this.onMultiMaterialRemovedObservable.notifyObservers(e), t;\n }\n /**\n * Removes the given material from this scene.\n * @param toRemove The material to remove\n * @returns The index of the removed material\n */\n removeMaterial(e) {\n const t = e._indexInSceneMaterialArray;\n if (t !== -1 && t < this.materials.length) {\n if (t !== this.materials.length - 1) {\n const i = this.materials[this.materials.length - 1];\n this.materials[t] = i, i._indexInSceneMaterialArray = t;\n }\n e._indexInSceneMaterialArray = -1, this.materials.pop();\n }\n return this.onMaterialRemovedObservable.notifyObservers(e), t;\n }\n /**\n * Removes the given action manager from this scene.\n * @deprecated\n * @param toRemove The action manager to remove\n * @returns The index of the removed action manager\n */\n removeActionManager(e) {\n const t = this.actionManagers.indexOf(e);\n return t !== -1 && this.actionManagers.splice(t, 1), t;\n }\n /**\n * Removes the given texture from this scene.\n * @param toRemove The texture to remove\n * @returns The index of the removed texture\n */\n removeTexture(e) {\n const t = this.textures.indexOf(e);\n return t !== -1 && this.textures.splice(t, 1), this.onTextureRemovedObservable.notifyObservers(e), t;\n }\n /**\n * Adds the given light to this scene\n * @param newLight The light to add\n */\n addLight(e) {\n if (!this._blockEntityCollection) {\n this.lights.push(e), this.sortLightsByPriority(), e.parent || e._addToSceneRootNodes();\n for (const t of this.meshes)\n t.lightSources.indexOf(e) === -1 && (t.lightSources.push(e), t._resyncLightSources());\n this.onNewLightAddedObservable.notifyObservers(e);\n }\n }\n /**\n * Sorts the list list based on light priorities\n */\n sortLightsByPriority() {\n this.requireLightSorting && this.lights.sort(Et.CompareLightsPriority);\n }\n /**\n * Adds the given camera to this scene\n * @param newCamera The camera to add\n */\n addCamera(e) {\n this._blockEntityCollection || (this.cameras.push(e), this.onNewCameraAddedObservable.notifyObservers(e), e.parent || e._addToSceneRootNodes());\n }\n /**\n * Adds the given skeleton to this scene\n * @param newSkeleton The skeleton to add\n */\n addSkeleton(e) {\n this._blockEntityCollection || (this.skeletons.push(e), this.onNewSkeletonAddedObservable.notifyObservers(e));\n }\n /**\n * Adds the given particle system to this scene\n * @param newParticleSystem The particle system to add\n */\n addParticleSystem(e) {\n this._blockEntityCollection || this.particleSystems.push(e);\n }\n /**\n * Adds the given animation to this scene\n * @param newAnimation The animation to add\n */\n addAnimation(e) {\n this._blockEntityCollection || this.animations.push(e);\n }\n /**\n * Adds the given animation group to this scene.\n * @param newAnimationGroup The animation group to add\n */\n addAnimationGroup(e) {\n this._blockEntityCollection || this.animationGroups.push(e);\n }\n /**\n * Adds the given multi-material to this scene\n * @param newMultiMaterial The multi-material to add\n */\n addMultiMaterial(e) {\n this._blockEntityCollection || (this.multiMaterials.push(e), this.onNewMultiMaterialAddedObservable.notifyObservers(e));\n }\n /**\n * Adds the given material to this scene\n * @param newMaterial The material to add\n */\n addMaterial(e) {\n this._blockEntityCollection || e.getScene() === this && e._indexInSceneMaterialArray !== -1 || (e._indexInSceneMaterialArray = this.materials.length, this.materials.push(e), this.onNewMaterialAddedObservable.notifyObservers(e));\n }\n /**\n * Adds the given morph target to this scene\n * @param newMorphTargetManager The morph target to add\n */\n addMorphTargetManager(e) {\n this._blockEntityCollection || this.morphTargetManagers.push(e);\n }\n /**\n * Adds the given geometry to this scene\n * @param newGeometry The geometry to add\n */\n addGeometry(e) {\n this._blockEntityCollection || (this._geometriesByUniqueId && (this._geometriesByUniqueId[e.uniqueId] = this.geometries.length), this.geometries.push(e));\n }\n /**\n * Adds the given action manager to this scene\n * @deprecated\n * @param newActionManager The action manager to add\n */\n addActionManager(e) {\n this.actionManagers.push(e);\n }\n /**\n * Adds the given texture to this scene.\n * @param newTexture The texture to add\n */\n addTexture(e) {\n this._blockEntityCollection || (this.textures.push(e), this.onNewTextureAddedObservable.notifyObservers(e));\n }\n /**\n * Switch active camera\n * @param newCamera defines the new active camera\n * @param attachControl defines if attachControl must be called for the new active camera (default: true)\n */\n switchActiveCamera(e, t = !0) {\n this._engine.getInputElement() && (this.activeCamera && this.activeCamera.detachControl(), this.activeCamera = e, t && e.attachControl());\n }\n /**\n * sets the active camera of the scene using its Id\n * @param id defines the camera's Id\n * @returns the new active camera or null if none found.\n */\n setActiveCameraById(e) {\n const t = this.getCameraById(e);\n return t ? (this.activeCamera = t, t) : null;\n }\n /**\n * sets the active camera of the scene using its name\n * @param name defines the camera's name\n * @returns the new active camera or null if none found.\n */\n setActiveCameraByName(e) {\n const t = this.getCameraByName(e);\n return t ? (this.activeCamera = t, t) : null;\n }\n /**\n * get an animation group using its name\n * @param name defines the material's name\n * @returns the animation group or null if none found.\n */\n getAnimationGroupByName(e) {\n for (let t = 0; t < this.animationGroups.length; t++)\n if (this.animationGroups[t].name === e)\n return this.animationGroups[t];\n return null;\n }\n _getMaterial(e, t) {\n for (let i = 0; i < this.materials.length; i++) {\n const r = this.materials[i];\n if (t(r))\n return r;\n }\n if (e)\n for (let i = 0; i < this.multiMaterials.length; i++) {\n const r = this.multiMaterials[i];\n if (t(r))\n return r;\n }\n return null;\n }\n /**\n * Get a material using its unique id\n * @param uniqueId defines the material's unique id\n * @param allowMultiMaterials determines whether multimaterials should be considered\n * @returns the material or null if none found.\n */\n getMaterialByUniqueID(e, t = !1) {\n return this._getMaterial(t, (i) => i.uniqueId === e);\n }\n /**\n * get a material using its id\n * @param id defines the material's Id\n * @param allowMultiMaterials determines whether multimaterials should be considered\n * @returns the material or null if none found.\n */\n getMaterialById(e, t = !1) {\n return this._getMaterial(t, (i) => i.id === e);\n }\n /**\n * Gets a material using its name\n * @param name defines the material's name\n * @param allowMultiMaterials determines whether multimaterials should be considered\n * @returns the material or null if none found.\n */\n getMaterialByName(e, t = !1) {\n return this._getMaterial(t, (i) => i.name === e);\n }\n /**\n * Gets a last added material using a given id\n * @param id defines the material's id\n * @param allowMultiMaterials determines whether multimaterials should be considered\n * @returns the last material with the given id or null if none found.\n */\n getLastMaterialById(e, t = !1) {\n for (let i = this.materials.length - 1; i >= 0; i--)\n if (this.materials[i].id === e)\n return this.materials[i];\n if (t) {\n for (let i = this.multiMaterials.length - 1; i >= 0; i--)\n if (this.multiMaterials[i].id === e)\n return this.multiMaterials[i];\n }\n return null;\n }\n /**\n * Get a texture using its unique id\n * @param uniqueId defines the texture's unique id\n * @returns the texture or null if none found.\n */\n getTextureByUniqueId(e) {\n for (let t = 0; t < this.textures.length; t++)\n if (this.textures[t].uniqueId === e)\n return this.textures[t];\n return null;\n }\n /**\n * Gets a texture using its name\n * @param name defines the texture's name\n * @returns the texture or null if none found.\n */\n getTextureByName(e) {\n for (let t = 0; t < this.textures.length; t++)\n if (this.textures[t].name === e)\n return this.textures[t];\n return null;\n }\n /**\n * Gets a camera using its Id\n * @param id defines the Id to look for\n * @returns the camera or null if not found\n */\n getCameraById(e) {\n for (let t = 0; t < this.cameras.length; t++)\n if (this.cameras[t].id === e)\n return this.cameras[t];\n return null;\n }\n /**\n * Gets a camera using its unique Id\n * @param uniqueId defines the unique Id to look for\n * @returns the camera or null if not found\n */\n getCameraByUniqueId(e) {\n for (let t = 0; t < this.cameras.length; t++)\n if (this.cameras[t].uniqueId === e)\n return this.cameras[t];\n return null;\n }\n /**\n * Gets a camera using its name\n * @param name defines the camera's name\n * @returns the camera or null if none found.\n */\n getCameraByName(e) {\n for (let t = 0; t < this.cameras.length; t++)\n if (this.cameras[t].name === e)\n return this.cameras[t];\n return null;\n }\n /**\n * Gets a bone using its Id\n * @param id defines the bone's Id\n * @returns the bone or null if not found\n */\n getBoneById(e) {\n for (let t = 0; t < this.skeletons.length; t++) {\n const i = this.skeletons[t];\n for (let r = 0; r < i.bones.length; r++)\n if (i.bones[r].id === e)\n return i.bones[r];\n }\n return null;\n }\n /**\n * Gets a bone using its id\n * @param name defines the bone's name\n * @returns the bone or null if not found\n */\n getBoneByName(e) {\n for (let t = 0; t < this.skeletons.length; t++) {\n const i = this.skeletons[t];\n for (let r = 0; r < i.bones.length; r++)\n if (i.bones[r].name === e)\n return i.bones[r];\n }\n return null;\n }\n /**\n * Gets a light node using its name\n * @param name defines the light's name\n * @returns the light or null if none found.\n */\n getLightByName(e) {\n for (let t = 0; t < this.lights.length; t++)\n if (this.lights[t].name === e)\n return this.lights[t];\n return null;\n }\n /**\n * Gets a light node using its Id\n * @param id defines the light's Id\n * @returns the light or null if none found.\n */\n getLightById(e) {\n for (let t = 0; t < this.lights.length; t++)\n if (this.lights[t].id === e)\n return this.lights[t];\n return null;\n }\n /**\n * Gets a light node using its scene-generated unique Id\n * @param uniqueId defines the light's unique Id\n * @returns the light or null if none found.\n */\n getLightByUniqueId(e) {\n for (let t = 0; t < this.lights.length; t++)\n if (this.lights[t].uniqueId === e)\n return this.lights[t];\n return null;\n }\n /**\n * Gets a particle system by Id\n * @param id defines the particle system Id\n * @returns the corresponding system or null if none found\n */\n getParticleSystemById(e) {\n for (let t = 0; t < this.particleSystems.length; t++)\n if (this.particleSystems[t].id === e)\n return this.particleSystems[t];\n return null;\n }\n /**\n * Gets a geometry using its Id\n * @param id defines the geometry's Id\n * @returns the geometry or null if none found.\n */\n getGeometryById(e) {\n for (let t = 0; t < this.geometries.length; t++)\n if (this.geometries[t].id === e)\n return this.geometries[t];\n return null;\n }\n _getGeometryByUniqueId(e) {\n if (this._geometriesByUniqueId) {\n const t = this._geometriesByUniqueId[e];\n if (t !== void 0)\n return this.geometries[t];\n } else\n for (let t = 0; t < this.geometries.length; t++)\n if (this.geometries[t].uniqueId === e)\n return this.geometries[t];\n return null;\n }\n /**\n * Add a new geometry to this scene\n * @param geometry defines the geometry to be added to the scene.\n * @param force defines if the geometry must be pushed even if a geometry with this id already exists\n * @returns a boolean defining if the geometry was added or not\n */\n pushGeometry(e, t) {\n return !t && this._getGeometryByUniqueId(e.uniqueId) ? !1 : (this.addGeometry(e), this.onNewGeometryAddedObservable.notifyObservers(e), !0);\n }\n /**\n * Removes an existing geometry\n * @param geometry defines the geometry to be removed from the scene\n * @returns a boolean defining if the geometry was removed or not\n */\n removeGeometry(e) {\n let t;\n if (this._geometriesByUniqueId) {\n if (t = this._geometriesByUniqueId[e.uniqueId], t === void 0)\n return !1;\n } else if (t = this.geometries.indexOf(e), t < 0)\n return !1;\n if (t !== this.geometries.length - 1) {\n const i = this.geometries[this.geometries.length - 1];\n i && (this.geometries[t] = i, this._geometriesByUniqueId && (this._geometriesByUniqueId[i.uniqueId] = t));\n }\n return this._geometriesByUniqueId && (this._geometriesByUniqueId[e.uniqueId] = void 0), this.geometries.pop(), this.onGeometryRemovedObservable.notifyObservers(e), !0;\n }\n /**\n * Gets the list of geometries attached to the scene\n * @returns an array of Geometry\n */\n getGeometries() {\n return this.geometries;\n }\n /**\n * Gets the first added mesh found of a given Id\n * @param id defines the Id to search for\n * @returns the mesh found or null if not found at all\n */\n getMeshById(e) {\n for (let t = 0; t < this.meshes.length; t++)\n if (this.meshes[t].id === e)\n return this.meshes[t];\n return null;\n }\n /**\n * Gets a list of meshes using their Id\n * @param id defines the Id to search for\n * @returns a list of meshes\n */\n getMeshesById(e) {\n return this.meshes.filter(function(t) {\n return t.id === e;\n });\n }\n /**\n * Gets the first added transform node found of a given Id\n * @param id defines the Id to search for\n * @returns the found transform node or null if not found at all.\n */\n getTransformNodeById(e) {\n for (let t = 0; t < this.transformNodes.length; t++)\n if (this.transformNodes[t].id === e)\n return this.transformNodes[t];\n return null;\n }\n /**\n * Gets a transform node with its auto-generated unique Id\n * @param uniqueId defines the unique Id to search for\n * @returns the found transform node or null if not found at all.\n */\n getTransformNodeByUniqueId(e) {\n for (let t = 0; t < this.transformNodes.length; t++)\n if (this.transformNodes[t].uniqueId === e)\n return this.transformNodes[t];\n return null;\n }\n /**\n * Gets a list of transform nodes using their Id\n * @param id defines the Id to search for\n * @returns a list of transform nodes\n */\n getTransformNodesById(e) {\n return this.transformNodes.filter(function(t) {\n return t.id === e;\n });\n }\n /**\n * Gets a mesh with its auto-generated unique Id\n * @param uniqueId defines the unique Id to search for\n * @returns the found mesh or null if not found at all.\n */\n getMeshByUniqueId(e) {\n for (let t = 0; t < this.meshes.length; t++)\n if (this.meshes[t].uniqueId === e)\n return this.meshes[t];\n return null;\n }\n /**\n * Gets a the last added mesh using a given Id\n * @param id defines the Id to search for\n * @returns the found mesh or null if not found at all.\n */\n getLastMeshById(e) {\n for (let t = this.meshes.length - 1; t >= 0; t--)\n if (this.meshes[t].id === e)\n return this.meshes[t];\n return null;\n }\n /**\n * Gets a the last transform node using a given Id\n * @param id defines the Id to search for\n * @returns the found mesh or null if not found at all.\n */\n getLastTransformNodeById(e) {\n for (let t = this.transformNodes.length - 1; t >= 0; t--)\n if (this.transformNodes[t].id === e)\n return this.transformNodes[t];\n return null;\n }\n /**\n * Gets a the last added node (Mesh, Camera, Light) using a given Id\n * @param id defines the Id to search for\n * @returns the found node or null if not found at all\n */\n getLastEntryById(e) {\n let t;\n for (t = this.meshes.length - 1; t >= 0; t--)\n if (this.meshes[t].id === e)\n return this.meshes[t];\n for (t = this.transformNodes.length - 1; t >= 0; t--)\n if (this.transformNodes[t].id === e)\n return this.transformNodes[t];\n for (t = this.cameras.length - 1; t >= 0; t--)\n if (this.cameras[t].id === e)\n return this.cameras[t];\n for (t = this.lights.length - 1; t >= 0; t--)\n if (this.lights[t].id === e)\n return this.lights[t];\n return null;\n }\n /**\n * Gets a node (Mesh, Camera, Light) using a given Id\n * @param id defines the Id to search for\n * @returns the found node or null if not found at all\n */\n getNodeById(e) {\n const t = this.getMeshById(e);\n if (t)\n return t;\n const i = this.getTransformNodeById(e);\n if (i)\n return i;\n const r = this.getLightById(e);\n if (r)\n return r;\n const s = this.getCameraById(e);\n if (s)\n return s;\n const a = this.getBoneById(e);\n return a || null;\n }\n /**\n * Gets a node (Mesh, Camera, Light) using a given name\n * @param name defines the name to search for\n * @returns the found node or null if not found at all.\n */\n getNodeByName(e) {\n const t = this.getMeshByName(e);\n if (t)\n return t;\n const i = this.getTransformNodeByName(e);\n if (i)\n return i;\n const r = this.getLightByName(e);\n if (r)\n return r;\n const s = this.getCameraByName(e);\n if (s)\n return s;\n const a = this.getBoneByName(e);\n return a || null;\n }\n /**\n * Gets a mesh using a given name\n * @param name defines the name to search for\n * @returns the found mesh or null if not found at all.\n */\n getMeshByName(e) {\n for (let t = 0; t < this.meshes.length; t++)\n if (this.meshes[t].name === e)\n return this.meshes[t];\n return null;\n }\n /**\n * Gets a transform node using a given name\n * @param name defines the name to search for\n * @returns the found transform node or null if not found at all.\n */\n getTransformNodeByName(e) {\n for (let t = 0; t < this.transformNodes.length; t++)\n if (this.transformNodes[t].name === e)\n return this.transformNodes[t];\n return null;\n }\n /**\n * Gets a skeleton using a given Id (if many are found, this function will pick the last one)\n * @param id defines the Id to search for\n * @returns the found skeleton or null if not found at all.\n */\n getLastSkeletonById(e) {\n for (let t = this.skeletons.length - 1; t >= 0; t--)\n if (this.skeletons[t].id === e)\n return this.skeletons[t];\n return null;\n }\n /**\n * Gets a skeleton using a given auto generated unique id\n * @param uniqueId defines the unique id to search for\n * @returns the found skeleton or null if not found at all.\n */\n getSkeletonByUniqueId(e) {\n for (let t = 0; t < this.skeletons.length; t++)\n if (this.skeletons[t].uniqueId === e)\n return this.skeletons[t];\n return null;\n }\n /**\n * Gets a skeleton using a given id (if many are found, this function will pick the first one)\n * @param id defines the id to search for\n * @returns the found skeleton or null if not found at all.\n */\n getSkeletonById(e) {\n for (let t = 0; t < this.skeletons.length; t++)\n if (this.skeletons[t].id === e)\n return this.skeletons[t];\n return null;\n }\n /**\n * Gets a skeleton using a given name\n * @param name defines the name to search for\n * @returns the found skeleton or null if not found at all.\n */\n getSkeletonByName(e) {\n for (let t = 0; t < this.skeletons.length; t++)\n if (this.skeletons[t].name === e)\n return this.skeletons[t];\n return null;\n }\n /**\n * Gets a morph target manager using a given id (if many are found, this function will pick the last one)\n * @param id defines the id to search for\n * @returns the found morph target manager or null if not found at all.\n */\n getMorphTargetManagerById(e) {\n for (let t = 0; t < this.morphTargetManagers.length; t++)\n if (this.morphTargetManagers[t].uniqueId === e)\n return this.morphTargetManagers[t];\n return null;\n }\n /**\n * Gets a morph target using a given id (if many are found, this function will pick the first one)\n * @param id defines the id to search for\n * @returns the found morph target or null if not found at all.\n */\n getMorphTargetById(e) {\n for (let t = 0; t < this.morphTargetManagers.length; ++t) {\n const i = this.morphTargetManagers[t];\n for (let r = 0; r < i.numTargets; ++r) {\n const s = i.getTarget(r);\n if (s.id === e)\n return s;\n }\n }\n return null;\n }\n /**\n * Gets a morph target using a given name (if many are found, this function will pick the first one)\n * @param name defines the name to search for\n * @returns the found morph target or null if not found at all.\n */\n getMorphTargetByName(e) {\n for (let t = 0; t < this.morphTargetManagers.length; ++t) {\n const i = this.morphTargetManagers[t];\n for (let r = 0; r < i.numTargets; ++r) {\n const s = i.getTarget(r);\n if (s.name === e)\n return s;\n }\n }\n return null;\n }\n /**\n * Gets a post process using a given name (if many are found, this function will pick the first one)\n * @param name defines the name to search for\n * @returns the found post process or null if not found at all.\n */\n getPostProcessByName(e) {\n for (let t = 0; t < this.postProcesses.length; ++t) {\n const i = this.postProcesses[t];\n if (i.name === e)\n return i;\n }\n return null;\n }\n /**\n * Gets a boolean indicating if the given mesh is active\n * @param mesh defines the mesh to look for\n * @returns true if the mesh is in the active list\n */\n isActiveMesh(e) {\n return this._activeMeshes.indexOf(e) !== -1;\n }\n /**\n * Return a unique id as a string which can serve as an identifier for the scene\n */\n get uid() {\n return this._uid || (this._uid = ge.RandomId()), this._uid;\n }\n /**\n * Add an externally attached data from its key.\n * This method call will fail and return false, if such key already exists.\n * If you don't care and just want to get the data no matter what, use the more convenient getOrAddExternalDataWithFactory() method.\n * @param key the unique key that identifies the data\n * @param data the data object to associate to the key for this Engine instance\n * @returns true if no such key were already present and the data was added successfully, false otherwise\n */\n addExternalData(e, t) {\n return this._externalData || (this._externalData = new jp()), this._externalData.add(e, t);\n }\n /**\n * Get an externally attached data from its key\n * @param key the unique key that identifies the data\n * @returns the associated data, if present (can be null), or undefined if not present\n */\n getExternalData(e) {\n return this._externalData ? this._externalData.get(e) : null;\n }\n /**\n * Get an externally attached data from its key, create it using a factory if it's not already present\n * @param key the unique key that identifies the data\n * @param factory the factory that will be called to create the instance if and only if it doesn't exists\n * @returns the associated data, can be null if the factory returned null.\n */\n getOrAddExternalDataWithFactory(e, t) {\n return this._externalData || (this._externalData = new jp()), this._externalData.getOrAddWithFactory(e, t);\n }\n /**\n * Remove an externally attached data from the Engine instance\n * @param key the unique key that identifies the data\n * @returns true if the data was successfully removed, false if it doesn't exist\n */\n removeExternalData(e) {\n return this._externalData.remove(e);\n }\n _evaluateSubMesh(e, t, i, r) {\n if (r || e.isInFrustum(this._frustumPlanes)) {\n for (const a of this._evaluateSubMeshStage)\n a.action(t, e);\n const s = e.getMaterial();\n s != null && (s.hasRenderTargetTextures && s.getRenderTargetTextures != null && this._processedMaterials.indexOf(s) === -1 && (this._processedMaterials.push(s), this._materialsRenderTargets.concatWithNoDuplicate(s.getRenderTargetTextures())), this._renderingManager.dispatch(e, t, s));\n }\n }\n /**\n * Clear the processed materials smart array preventing retention point in material dispose.\n */\n freeProcessedMaterials() {\n this._processedMaterials.dispose();\n }\n /** Gets or sets a boolean blocking all the calls to freeActiveMeshes and freeRenderingGroups\n * It can be used in order to prevent going through methods freeRenderingGroups and freeActiveMeshes several times to improve performance\n * when disposing several meshes in a row or a hierarchy of meshes.\n * When used, it is the responsibility of the user to blockfreeActiveMeshesAndRenderingGroups back to false.\n */\n get blockfreeActiveMeshesAndRenderingGroups() {\n return this._preventFreeActiveMeshesAndRenderingGroups;\n }\n set blockfreeActiveMeshesAndRenderingGroups(e) {\n this._preventFreeActiveMeshesAndRenderingGroups !== e && (e && (this.freeActiveMeshes(), this.freeRenderingGroups()), this._preventFreeActiveMeshesAndRenderingGroups = e);\n }\n /**\n * Clear the active meshes smart array preventing retention point in mesh dispose.\n */\n freeActiveMeshes() {\n if (!this.blockfreeActiveMeshesAndRenderingGroups && (this._activeMeshes.dispose(), this.activeCamera && this.activeCamera._activeMeshes && this.activeCamera._activeMeshes.dispose(), this.activeCameras))\n for (let e = 0; e < this.activeCameras.length; e++) {\n const t = this.activeCameras[e];\n t && t._activeMeshes && t._activeMeshes.dispose();\n }\n }\n /**\n * Clear the info related to rendering groups preventing retention points during dispose.\n */\n freeRenderingGroups() {\n if (!this.blockfreeActiveMeshesAndRenderingGroups && (this._renderingManager && this._renderingManager.freeRenderingGroups(), this.textures))\n for (let e = 0; e < this.textures.length; e++) {\n const t = this.textures[e];\n t && t.renderList && t.freeRenderingGroups();\n }\n }\n /** @internal */\n _isInIntermediateRendering() {\n return this._intermediateRendering;\n }\n /**\n * Use this function to stop evaluating active meshes. The current list will be keep alive between frames\n * @param skipEvaluateActiveMeshes defines an optional boolean indicating that the evaluate active meshes step must be completely skipped\n * @param onSuccess optional success callback\n * @param onError optional error callback\n * @param freezeMeshes defines if meshes should be frozen (true by default)\n * @param keepFrustumCulling defines if you want to keep running the frustum clipping (false by default)\n * @returns the current scene\n */\n freezeActiveMeshes(e = !1, t, i, r = !0, s = !1) {\n return this.executeWhenReady(() => {\n if (!this.activeCamera) {\n i && i(\"No active camera found\");\n return;\n }\n if (this._frustumPlanes || this.updateTransformMatrix(), this._evaluateActiveMeshes(), this._activeMeshesFrozen = !0, this._activeMeshesFrozenButKeepClipping = s, this._skipEvaluateActiveMeshesCompletely = e, r)\n for (let a = 0; a < this._activeMeshes.length; a++)\n this._activeMeshes.data[a]._freeze();\n t && t();\n }), this;\n }\n /**\n * Use this function to restart evaluating active meshes on every frame\n * @returns the current scene\n */\n unfreezeActiveMeshes() {\n for (let e = 0; e < this.meshes.length; e++) {\n const t = this.meshes[e];\n t._internalAbstractMeshDataInfo && (t._internalAbstractMeshDataInfo._isActive = !1);\n }\n for (let e = 0; e < this._activeMeshes.length; e++)\n this._activeMeshes.data[e]._unFreeze();\n return this._activeMeshesFrozen = !1, this;\n }\n _executeActiveContainerCleanup(e) {\n !(this._engine.snapshotRendering && this._engine.snapshotRenderingMode === 1) && this._activeMeshesFrozen && this._activeMeshes.length || this.onBeforeRenderObservable.addOnce(() => e.dispose());\n }\n _evaluateActiveMeshes() {\n var i;\n if (this._engine.snapshotRendering && this._engine.snapshotRenderingMode === 1) {\n this._activeMeshes.length > 0 && ((i = this.activeCamera) == null || i._activeMeshes.reset(), this._activeMeshes.reset(), this._renderingManager.reset(), this._processedMaterials.reset(), this._activeParticleSystems.reset(), this._activeSkeletons.reset(), this._softwareSkinnedMeshes.reset());\n return;\n }\n if (this._activeMeshesFrozen && this._activeMeshes.length) {\n if (!this._skipEvaluateActiveMeshesCompletely) {\n const r = this._activeMeshes.length;\n for (let s = 0; s < r; s++)\n this._activeMeshes.data[s].computeWorldMatrix();\n }\n if (this._activeParticleSystems) {\n const r = this._activeParticleSystems.length;\n for (let s = 0; s < r; s++)\n this._activeParticleSystems.data[s].animate();\n }\n this._renderingManager.resetSprites();\n return;\n }\n if (!this.activeCamera)\n return;\n this.onBeforeActiveMeshesEvaluationObservable.notifyObservers(this), this.activeCamera._activeMeshes.reset(), this._activeMeshes.reset(), this._renderingManager.reset(), this._processedMaterials.reset(), this._activeParticleSystems.reset(), this._activeSkeletons.reset(), this._softwareSkinnedMeshes.reset(), this._materialsRenderTargets.reset();\n for (const r of this._beforeEvaluateActiveMeshStage)\n r.action();\n const e = this.getActiveMeshCandidates(), t = e.length;\n for (let r = 0; r < t; r++) {\n const s = e.data[r];\n if (s._internalAbstractMeshDataInfo._currentLODIsUpToDate = !1, s.isBlocked || (this._totalVertices.addCount(s.getTotalVertices(), !1), !s.isReady() || !s.isEnabled() || s.scaling.hasAZeroComponent))\n continue;\n s.computeWorldMatrix(), s.actionManager && s.actionManager.hasSpecificTriggers2(12, 13) && this._meshesForIntersections.pushNoDuplicate(s);\n let a = this.customLODSelector ? this.customLODSelector(s, this.activeCamera) : s.getLOD(this.activeCamera);\n if (s._internalAbstractMeshDataInfo._currentLOD = a, s._internalAbstractMeshDataInfo._currentLODIsUpToDate = !0, a != null && (a !== s && a.billboardMode !== 0 && a.computeWorldMatrix(), s._preActivate(), s.isVisible && s.visibility > 0 && s.layerMask & this.activeCamera.layerMask && (this._skipFrustumClipping || s.alwaysSelectAsActiveMesh || s.isInFrustum(this._frustumPlanes)))) {\n this._activeMeshes.push(s), this.activeCamera._activeMeshes.push(s), a !== s && a._activate(this._renderId, !1);\n for (const o of this._preActiveMeshStage)\n o.action(s);\n s._activate(this._renderId, !1) && (s.isAnInstance ? s._internalAbstractMeshDataInfo._actAsRegularMesh && (a = s) : a._internalAbstractMeshDataInfo._onlyForInstances = !1, a._internalAbstractMeshDataInfo._isActive = !0, this._activeMesh(s, a)), s._postActivate();\n }\n }\n if (this.onAfterActiveMeshesEvaluationObservable.notifyObservers(this), this.particlesEnabled) {\n this.onBeforeParticlesRenderingObservable.notifyObservers(this);\n for (let r = 0; r < this.particleSystems.length; r++) {\n const s = this.particleSystems[r];\n if (!s.isStarted() || !s.emitter)\n continue;\n const a = s.emitter;\n (!a.position || a.isEnabled()) && (this._activeParticleSystems.push(s), s.animate(), this._renderingManager.dispatchParticles(s));\n }\n this.onAfterParticlesRenderingObservable.notifyObservers(this);\n }\n }\n _activeMesh(e, t) {\n this._skeletonsEnabled && t.skeleton !== null && t.skeleton !== void 0 && (this._activeSkeletons.pushNoDuplicate(t.skeleton) && (t.skeleton.prepare(), this._activeBones.addCount(t.skeleton.bones.length, !1)), t.computeBonesUsingShaders || this._softwareSkinnedMeshes.pushNoDuplicate(t));\n let i = e.hasInstances || e.isAnInstance || this.dispatchAllSubMeshesOfActiveMeshes || this._skipFrustumClipping || t.alwaysSelectAsActiveMesh;\n if (t && t.subMeshes && t.subMeshes.length > 0) {\n const r = this.getActiveSubMeshCandidates(t), s = r.length;\n i = i || s === 1;\n for (let a = 0; a < s; a++) {\n const o = r.data[a];\n this._evaluateSubMesh(o, t, e, i);\n }\n }\n }\n /**\n * Update the transform matrix to update from the current active camera\n * @param force defines a boolean used to force the update even if cache is up to date\n */\n updateTransformMatrix(e) {\n const t = this.activeCamera;\n if (t)\n if (t._renderingMultiview) {\n const i = t._rigCameras[0], r = t._rigCameras[1];\n this.setTransformMatrix(i.getViewMatrix(), i.getProjectionMatrix(e), r.getViewMatrix(), r.getProjectionMatrix(e));\n } else\n this.setTransformMatrix(t.getViewMatrix(), t.getProjectionMatrix(e));\n }\n _bindFrameBuffer(e, t = !0) {\n e && e._multiviewTexture ? e._multiviewTexture._bindFrameBuffer() : e && e.outputRenderTarget ? e.outputRenderTarget._bindFrameBuffer() : this._engine._currentFrameBufferIsDefaultFrameBuffer() || this._engine.restoreDefaultFramebuffer(), t && this._clearFrameBuffer(e);\n }\n _clearFrameBuffer(e) {\n if (!(e && e._multiviewTexture))\n if (e && e.outputRenderTarget && !e._renderingMultiview) {\n const t = e.outputRenderTarget;\n t.onClearObservable.hasObservers() ? t.onClearObservable.notifyObservers(this._engine) : !t.skipInitialClear && !e.isRightCamera && (this.autoClear && this._engine.clear(t.clearColor || this.clearColor, !t._cleared, !0, !0), t._cleared = !0);\n } else\n this._defaultFrameBufferCleared ? this._engine.clear(null, !1, !0, !0) : (this._defaultFrameBufferCleared = !0, this._clear());\n }\n /**\n * @internal\n */\n _renderForCamera(e, t, i = !0) {\n var a;\n if (e && e._skipRendering)\n return;\n const r = this._engine;\n if (this._activeCamera = e, !this.activeCamera)\n throw new Error(\"Active camera not set\");\n if (r.setViewport(this.activeCamera.viewport), this.resetCachedMaterial(), this._renderId++, !this.prePass && i) {\n let o = !0;\n e._renderingMultiview && e.outputRenderTarget && (o = e.outputRenderTarget.skipInitialClear, this.autoClear && (this._defaultFrameBufferCleared = !1, e.outputRenderTarget.skipInitialClear = !1)), this._bindFrameBuffer(this._activeCamera), e._renderingMultiview && e.outputRenderTarget && (e.outputRenderTarget.skipInitialClear = o);\n }\n this.updateTransformMatrix(), this.onBeforeCameraRenderObservable.notifyObservers(this.activeCamera), this._evaluateActiveMeshes();\n for (let o = 0; o < this._softwareSkinnedMeshes.length; o++) {\n const l = this._softwareSkinnedMeshes.data[o];\n l.applySkeleton(l.skeleton);\n }\n this.onBeforeRenderTargetsRenderObservable.notifyObservers(this), this._renderTargets.concatWithNoDuplicate(this._materialsRenderTargets), e.customRenderTargets && e.customRenderTargets.length > 0 && this._renderTargets.concatWithNoDuplicate(e.customRenderTargets), t && t.customRenderTargets && t.customRenderTargets.length > 0 && this._renderTargets.concatWithNoDuplicate(t.customRenderTargets), this.environmentTexture && this.environmentTexture.isRenderTarget && this._renderTargets.pushNoDuplicate(this.environmentTexture);\n for (const o of this._gatherActiveCameraRenderTargetsStage)\n o.action(this._renderTargets);\n let s = !1;\n if (this.renderTargetsEnabled) {\n if (this._intermediateRendering = !0, this._renderTargets.length > 0) {\n ge.StartPerformanceCounter(\"Render targets\", this._renderTargets.length > 0);\n for (let o = 0; o < this._renderTargets.length; o++) {\n const l = this._renderTargets.data[o];\n if (l._shouldRender()) {\n this._renderId++;\n const c = l.activeCamera && l.activeCamera !== this.activeCamera;\n l.render(c, this.dumpNextRenderTargets), s = !0;\n }\n }\n ge.EndPerformanceCounter(\"Render targets\", this._renderTargets.length > 0), this._renderId++;\n }\n for (const o of this._cameraDrawRenderTargetStage)\n s = o.action(this.activeCamera) || s;\n this._intermediateRendering = !1;\n }\n this._engine.currentRenderPassId = ((a = e.outputRenderTarget) == null ? void 0 : a.renderPassId) ?? e.renderPassId ?? 0, s && !this.prePass && (this._bindFrameBuffer(this._activeCamera, !1), this.updateTransformMatrix()), this.onAfterRenderTargetsRenderObservable.notifyObservers(this), this.postProcessManager && !e._multiviewTexture && !this.prePass && this.postProcessManager._prepareFrame();\n for (const o of this._beforeCameraDrawStage)\n o.action(this.activeCamera);\n this.onBeforeDrawPhaseObservable.notifyObservers(this), r.snapshotRendering && r.snapshotRenderingMode === 1 && this.finalizeSceneUbo(), this._renderingManager.render(null, null, !0, !0), this.onAfterDrawPhaseObservable.notifyObservers(this);\n for (const o of this._afterCameraDrawStage)\n o.action(this.activeCamera);\n if (this.postProcessManager && !e._multiviewTexture) {\n const o = e.outputRenderTarget ? e.outputRenderTarget.renderTarget : void 0;\n this.postProcessManager._finalizeFrame(e.isIntermediate, o);\n }\n for (const o of this._afterCameraPostProcessStage)\n o.action(this.activeCamera);\n this._renderTargets.reset(), this.onAfterCameraRenderObservable.notifyObservers(this.activeCamera);\n }\n _processSubCameras(e, t = !0) {\n if (e.cameraRigMode === 0 || e._renderingMultiview) {\n e._renderingMultiview && !this._multiviewSceneUbo && this._createMultiviewUbo(), this._renderForCamera(e, void 0, t), this.onAfterRenderCameraObservable.notifyObservers(e);\n return;\n }\n if (e._useMultiviewToSingleView)\n this._renderMultiviewToSingleView(e);\n else {\n this.onBeforeCameraRenderObservable.notifyObservers(e);\n for (let i = 0; i < e._rigCameras.length; i++)\n this._renderForCamera(e._rigCameras[i], e);\n }\n this._activeCamera = e, this.updateTransformMatrix(), this.onAfterRenderCameraObservable.notifyObservers(e);\n }\n _checkIntersections() {\n for (let e = 0; e < this._meshesForIntersections.length; e++) {\n const t = this._meshesForIntersections.data[e];\n if (t.actionManager)\n for (let i = 0; t.actionManager && i < t.actionManager.actions.length; i++) {\n const r = t.actionManager.actions[i];\n if (r.trigger === 12 || r.trigger === 13) {\n const s = r.getTriggerParameter(), a = s.mesh ? s.mesh : s, o = a.intersectsMesh(t, s.usePreciseIntersection), l = t._intersectionsInProgress.indexOf(a);\n o && l === -1 ? r.trigger === 12 ? (r._executeCurrent(Ci.CreateNew(t, void 0, a)), t._intersectionsInProgress.push(a)) : r.trigger === 13 && t._intersectionsInProgress.push(a) : !o && l > -1 && (r.trigger === 13 && r._executeCurrent(Ci.CreateNew(t, void 0, a)), (!t.actionManager.hasSpecificTrigger(13, (c) => {\n const h = c.mesh ? c.mesh : c;\n return a === h;\n }) || r.trigger === 13) && t._intersectionsInProgress.splice(l, 1));\n }\n }\n }\n }\n /**\n * @internal\n */\n _advancePhysicsEngineStep(e) {\n }\n /** @internal */\n _animate(e) {\n }\n /** Execute all animations (for a frame) */\n animate() {\n if (this._engine.isDeterministicLockStep()) {\n let e = Math.max(Ot.MinDeltaTime, Math.min(this._engine.getDeltaTime(), Ot.MaxDeltaTime)) + this._timeAccumulator;\n const t = this._engine.getTimeStep(), i = 1e3 / t / 1e3;\n let r = 0;\n const s = this._engine.getLockstepMaxSteps();\n let a = Math.floor(e / t);\n for (a = Math.min(a, s); e > 0 && r < a; )\n this.onBeforeStepObservable.notifyObservers(this), this._animationRatio = t * i, this._animate(t), this.onAfterAnimationsObservable.notifyObservers(this), this.physicsEnabled && this._advancePhysicsEngineStep(t), this.onAfterStepObservable.notifyObservers(this), this._currentStepId++, r++, e -= t;\n this._timeAccumulator = e < 0 ? 0 : e;\n } else {\n const e = this.useConstantAnimationDeltaTime ? 16 : Math.max(Ot.MinDeltaTime, Math.min(this._engine.getDeltaTime(), Ot.MaxDeltaTime));\n this._animationRatio = e * (60 / 1e3), this._animate(), this.onAfterAnimationsObservable.notifyObservers(this), this.physicsEnabled && this._advancePhysicsEngineStep(e);\n }\n }\n _clear() {\n (this.autoClearDepthAndStencil || this.autoClear) && this._engine.clear(this.clearColor, this.autoClear || this.forceWireframe || this.forcePointsCloud, this.autoClearDepthAndStencil, this.autoClearDepthAndStencil);\n }\n _checkCameraRenderTarget(e) {\n var t;\n if (e != null && e.outputRenderTarget && !(e != null && e.isRigCamera) && (e.outputRenderTarget._cleared = !1), (t = e == null ? void 0 : e.rigCameras) != null && t.length)\n for (let i = 0; i < e.rigCameras.length; ++i) {\n const r = e.rigCameras[i].outputRenderTarget;\n r && (r._cleared = !1);\n }\n }\n /**\n * Resets the draw wrappers cache of all meshes\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\n */\n resetDrawCache(e) {\n if (this.meshes)\n for (const t of this.meshes)\n t.resetDrawCache(e);\n }\n /**\n * Render the scene\n * @param updateCameras defines a boolean indicating if cameras must update according to their inputs (true by default)\n * @param ignoreAnimations defines a boolean indicating if animations should not be executed (false by default)\n */\n render(e = !0, t = !1) {\n var s, a;\n if (this.isDisposed)\n return;\n this.onReadyObservable.hasObservers() && this._executeWhenReadyTimeoutId === null && this._checkIsReady(), this._frameId++, this._defaultFrameBufferCleared = !1, this._checkCameraRenderTarget(this.activeCamera), (s = this.activeCameras) != null && s.length && this.activeCameras.forEach(this._checkCameraRenderTarget), this._registerTransientComponents(), this._activeParticles.fetchNewFrame(), this._totalVertices.fetchNewFrame(), this._activeIndices.fetchNewFrame(), this._activeBones.fetchNewFrame(), this._meshesForIntersections.reset(), this.resetCachedMaterial(), this.onBeforeAnimationsObservable.notifyObservers(this), this.actionManager && this.actionManager.processTrigger(11), t || this.animate();\n for (const o of this._beforeCameraUpdateStage)\n o.action();\n if (e) {\n if (this.activeCameras && this.activeCameras.length > 0)\n for (let o = 0; o < this.activeCameras.length; o++) {\n const l = this.activeCameras[o];\n if (l.update(), l.cameraRigMode !== 0)\n for (let c = 0; c < l._rigCameras.length; c++)\n l._rigCameras[c].update();\n }\n else if (this.activeCamera && (this.activeCamera.update(), this.activeCamera.cameraRigMode !== 0))\n for (let o = 0; o < this.activeCamera._rigCameras.length; o++)\n this.activeCamera._rigCameras[o].update();\n }\n this.onBeforeRenderObservable.notifyObservers(this);\n const i = this.getEngine();\n this.onBeforeRenderTargetsRenderObservable.notifyObservers(this);\n const r = (a = this.activeCameras) != null && a.length ? this.activeCameras[0] : this.activeCamera;\n if (this.renderTargetsEnabled) {\n ge.StartPerformanceCounter(\"Custom render targets\", this.customRenderTargets.length > 0), this._intermediateRendering = !0;\n for (let o = 0; o < this.customRenderTargets.length; o++) {\n const l = this.customRenderTargets[o];\n if (l._shouldRender()) {\n if (this._renderId++, this.activeCamera = l.activeCamera || this.activeCamera, !this.activeCamera)\n throw new Error(\"Active camera not set\");\n i.setViewport(this.activeCamera.viewport), this.updateTransformMatrix(), l.render(r !== this.activeCamera, this.dumpNextRenderTargets);\n }\n }\n ge.EndPerformanceCounter(\"Custom render targets\", this.customRenderTargets.length > 0), this._intermediateRendering = !1, this._renderId++;\n }\n this._engine.currentRenderPassId = (r == null ? void 0 : r.renderPassId) ?? 0, this.activeCamera = r, this._activeCamera && this._activeCamera.cameraRigMode !== 22 && !this.prePass && this._bindFrameBuffer(this._activeCamera, !1), this.onAfterRenderTargetsRenderObservable.notifyObservers(this);\n for (const o of this._beforeClearStage)\n o.action();\n this._clearFrameBuffer(this.activeCamera);\n for (const o of this._gatherRenderTargetsStage)\n o.action(this._renderTargets);\n if (this.activeCameras && this.activeCameras.length > 0)\n for (let o = 0; o < this.activeCameras.length; o++)\n this._processSubCameras(this.activeCameras[o], o > 0);\n else {\n if (!this.activeCamera)\n throw new Error(\"No camera defined\");\n this._processSubCameras(this.activeCamera, !!this.activeCamera.outputRenderTarget);\n }\n this._checkIntersections();\n for (const o of this._afterRenderStage)\n o.action();\n if (this.afterRender && this.afterRender(), this.onAfterRenderObservable.notifyObservers(this), this._toBeDisposed.length) {\n for (let o = 0; o < this._toBeDisposed.length; o++) {\n const l = this._toBeDisposed[o];\n l && l.dispose();\n }\n this._toBeDisposed.length = 0;\n }\n this.dumpNextRenderTargets && (this.dumpNextRenderTargets = !1), this._activeBones.addCount(0, !0), this._activeIndices.addCount(0, !0), this._activeParticles.addCount(0, !0), this._engine.restoreDefaultFramebuffer();\n }\n /**\n * Freeze all materials\n * A frozen material will not be updatable but should be faster to render\n * Note: multimaterials will not be frozen, but their submaterials will\n */\n freezeMaterials() {\n for (let e = 0; e < this.materials.length; e++)\n this.materials[e].freeze();\n }\n /**\n * Unfreeze all materials\n * A frozen material will not be updatable but should be faster to render\n */\n unfreezeMaterials() {\n for (let e = 0; e < this.materials.length; e++)\n this.materials[e].unfreeze();\n }\n /**\n * Releases all held resources\n */\n dispose() {\n if (this.isDisposed)\n return;\n this.beforeRender = null, this.afterRender = null, this.metadata = null, this.skeletons.length = 0, this.morphTargetManagers.length = 0, this._transientComponents.length = 0, this._isReadyForMeshStage.clear(), this._beforeEvaluateActiveMeshStage.clear(), this._evaluateSubMeshStage.clear(), this._preActiveMeshStage.clear(), this._cameraDrawRenderTargetStage.clear(), this._beforeCameraDrawStage.clear(), this._beforeRenderTargetDrawStage.clear(), this._beforeRenderingGroupDrawStage.clear(), this._beforeRenderingMeshStage.clear(), this._afterRenderingMeshStage.clear(), this._afterRenderingGroupDrawStage.clear(), this._afterCameraDrawStage.clear(), this._afterRenderTargetDrawStage.clear(), this._afterRenderStage.clear(), this._beforeCameraUpdateStage.clear(), this._beforeClearStage.clear(), this._gatherRenderTargetsStage.clear(), this._gatherActiveCameraRenderTargetsStage.clear(), this._pointerMoveStage.clear(), this._pointerDownStage.clear(), this._pointerUpStage.clear(), this.importedMeshesFiles = [], this.stopAllAnimations && (this._activeAnimatables.forEach((s) => {\n s.onAnimationEndObservable.clear(), s.onAnimationEnd = null;\n }), this.stopAllAnimations()), this.resetCachedMaterial(), this.activeCamera && (this.activeCamera._activeMeshes.dispose(), this.activeCamera = null), this.activeCameras = null, this._activeMeshes.dispose(), this._renderingManager.dispose(), this._processedMaterials.dispose(), this._activeParticleSystems.dispose(), this._activeSkeletons.dispose(), this._softwareSkinnedMeshes.dispose(), this._renderTargets.dispose(), this._materialsRenderTargets.dispose(), this._registeredForLateAnimationBindings.dispose(), this._meshesForIntersections.dispose(), this._toBeDisposed.length = 0;\n const e = this._activeRequests.slice();\n for (const s of e)\n s.abort();\n this._activeRequests.length = 0;\n try {\n this.onDisposeObservable.notifyObservers(this);\n } catch (s) {\n ne.Error(\"An error occurred while calling onDisposeObservable!\", s);\n }\n if (this.detachControl(), this._engine.getInputElement())\n for (let s = 0; s < this.cameras.length; s++)\n this.cameras[s].detachControl();\n this._disposeList(this.animationGroups), this._disposeList(this.lights), this._disposeList(this.meshes, (s) => s.dispose(!0)), this._disposeList(this.transformNodes, (s) => s.dispose(!0));\n const i = this.cameras;\n this._disposeList(i), this._defaultMaterial && this._defaultMaterial.dispose(), this._disposeList(this.multiMaterials), this._disposeList(this.materials), this._disposeList(this.particleSystems), this._disposeList(this.postProcesses), this._disposeList(this.textures), this._disposeList(this.morphTargetManagers), this._sceneUbo.dispose(), this._multiviewSceneUbo && this._multiviewSceneUbo.dispose(), this.postProcessManager.dispose(), this._disposeList(this._components);\n let r = this._engine.scenes.indexOf(this);\n r > -1 && this._engine.scenes.splice(r, 1), st._LastCreatedScene === this && (this._engine.scenes.length > 0 ? st._LastCreatedScene = this._engine.scenes[this._engine.scenes.length - 1] : st._LastCreatedScene = null), r = this._engine._virtualScenes.indexOf(this), r > -1 && this._engine._virtualScenes.splice(r, 1), this._engine.wipeCaches(!0), this.onDisposeObservable.clear(), this.onBeforeRenderObservable.clear(), this.onAfterRenderObservable.clear(), this.onBeforeRenderTargetsRenderObservable.clear(), this.onAfterRenderTargetsRenderObservable.clear(), this.onAfterStepObservable.clear(), this.onBeforeStepObservable.clear(), this.onBeforeActiveMeshesEvaluationObservable.clear(), this.onAfterActiveMeshesEvaluationObservable.clear(), this.onBeforeParticlesRenderingObservable.clear(), this.onAfterParticlesRenderingObservable.clear(), this.onBeforeDrawPhaseObservable.clear(), this.onAfterDrawPhaseObservable.clear(), this.onBeforeAnimationsObservable.clear(), this.onAfterAnimationsObservable.clear(), this.onDataLoadedObservable.clear(), this.onBeforeRenderingGroupObservable.clear(), this.onAfterRenderingGroupObservable.clear(), this.onMeshImportedObservable.clear(), this.onBeforeCameraRenderObservable.clear(), this.onAfterCameraRenderObservable.clear(), this.onAfterRenderCameraObservable.clear(), this.onReadyObservable.clear(), this.onNewCameraAddedObservable.clear(), this.onCameraRemovedObservable.clear(), this.onNewLightAddedObservable.clear(), this.onLightRemovedObservable.clear(), this.onNewGeometryAddedObservable.clear(), this.onGeometryRemovedObservable.clear(), this.onNewTransformNodeAddedObservable.clear(), this.onTransformNodeRemovedObservable.clear(), this.onNewMeshAddedObservable.clear(), this.onMeshRemovedObservable.clear(), this.onNewSkeletonAddedObservable.clear(), this.onSkeletonRemovedObservable.clear(), this.onNewMaterialAddedObservable.clear(), this.onNewMultiMaterialAddedObservable.clear(), this.onMaterialRemovedObservable.clear(), this.onMultiMaterialRemovedObservable.clear(), this.onNewTextureAddedObservable.clear(), this.onTextureRemovedObservable.clear(), this.onPrePointerObservable.clear(), this.onPointerObservable.clear(), this.onPreKeyboardObservable.clear(), this.onKeyboardObservable.clear(), this.onActiveCameraChanged.clear(), this.onScenePerformancePriorityChangedObservable.clear(), this._isDisposed = !0;\n }\n _disposeList(e, t) {\n const i = e.slice(0);\n t = t ?? ((r) => r.dispose());\n for (const r of i)\n t(r);\n e.length = 0;\n }\n /**\n * Gets if the scene is already disposed\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Call this function to reduce memory footprint of the scene.\n * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly)\n */\n clearCachedVertexData() {\n for (let e = 0; e < this.meshes.length; e++) {\n const i = this.meshes[e].geometry;\n i && i.clearCachedData();\n }\n }\n /**\n * This function will remove the local cached buffer data from texture.\n * It will save memory but will prevent the texture from being rebuilt\n */\n cleanCachedTextureBuffer() {\n for (const e of this.textures)\n e._buffer && (e._buffer = null);\n }\n /**\n * Get the world extend vectors with an optional filter\n *\n * @param filterPredicate the predicate - which meshes should be included when calculating the world size\n * @returns {{ min: Vector3; max: Vector3 }} min and max vectors\n */\n getWorldExtends(e) {\n const t = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), i = new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n return e = e || (() => !0), this.meshes.filter(e).forEach((r) => {\n if (r.computeWorldMatrix(!0), !r.subMeshes || r.subMeshes.length === 0 || r.infiniteDistance)\n return;\n const s = r.getBoundingInfo(), a = s.boundingBox.minimumWorld, o = s.boundingBox.maximumWorld;\n _.CheckExtends(a, t, i), _.CheckExtends(o, t, i);\n }), {\n min: t,\n max: i\n };\n }\n // Picking\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a ray that can be used to pick in the scene\n * @param x defines the x coordinate of the origin (on-screen)\n * @param y defines the y coordinate of the origin (on-screen)\n * @param world defines the world matrix to use if you want to pick in object space (instead of world space)\n * @param camera defines the camera to use for the picking\n * @param cameraViewSpace defines if picking will be done in view space (false by default)\n * @returns a Ray\n */\n createPickingRay(e, t, i, r, s = !1) {\n throw We(\"Ray\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a ray that can be used to pick in the scene\n * @param x defines the x coordinate of the origin (on-screen)\n * @param y defines the y coordinate of the origin (on-screen)\n * @param world defines the world matrix to use if you want to pick in object space (instead of world space)\n * @param result defines the ray where to store the picking ray\n * @param camera defines the camera to use for the picking\n * @param cameraViewSpace defines if picking will be done in view space (false by default)\n * @param enableDistantPicking defines if picking should handle large values for mesh position/scaling (false by default)\n * @returns the current scene\n */\n createPickingRayToRef(e, t, i, r, s, a = !1, o = !1) {\n throw We(\"Ray\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a ray that can be used to pick in the scene\n * @param x defines the x coordinate of the origin (on-screen)\n * @param y defines the y coordinate of the origin (on-screen)\n * @param camera defines the camera to use for the picking\n * @returns a Ray\n */\n createPickingRayInCameraSpace(e, t, i) {\n throw We(\"Ray\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a ray that can be used to pick in the scene\n * @param x defines the x coordinate of the origin (on-screen)\n * @param y defines the y coordinate of the origin (on-screen)\n * @param result defines the ray where to store the picking ray\n * @param camera defines the camera to use for the picking\n * @returns the current scene\n */\n createPickingRayInCameraSpaceToRef(e, t, i, r) {\n throw We(\"Ray\");\n }\n /** @internal */\n get _pickingAvailable() {\n return !1;\n }\n /** Launch a ray to try to pick a mesh in the scene\n * @param x position on screen\n * @param y position on screen\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\n * @param fastCheck defines if the first intersection will be used (and not the closest)\n * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @returns a PickingInfo\n */\n pick(e, t, i, r, s, a) {\n const o = We(\"Ray\", !0);\n return o && ne.Warn(o), new ps();\n }\n /** Launch a ray to try to pick a mesh in the scene using only bounding information of the main mesh (not using submeshes)\n * @param x position on screen\n * @param y position on screen\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\n * @param fastCheck defines if the first intersection will be used (and not the closest)\n * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used\n * @returns a PickingInfo (Please note that some info will not be set like distance, bv, bu and everything that cannot be capture by only using bounding infos)\n */\n pickWithBoundingInfo(e, t, i, r, s) {\n const a = We(\"Ray\", !0);\n return a && ne.Warn(a), new ps();\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Use the given ray to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides,\n * irrespective of orientation.\n * @param ray The ray to use to pick meshes\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must have isPickable set to true\n * @param fastCheck defines if the first intersection will be used (and not the closest)\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @returns a PickingInfo\n */\n pickWithRay(e, t, i, r) {\n throw We(\"Ray\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Launch a ray to try to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides,\n * irrespective of orientation.\n * @param x X position on screen\n * @param y Y position on screen\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\n * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @returns an array of PickingInfo\n */\n multiPick(e, t, i, r, s) {\n throw We(\"Ray\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Launch a ray to try to pick a mesh in the scene\n * @param ray Ray to use\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @returns an array of PickingInfo\n */\n multiPickWithRay(e, t, i) {\n throw We(\"Ray\");\n }\n /**\n * Force the value of meshUnderPointer\n * @param mesh defines the mesh to use\n * @param pointerId optional pointer id when using more than one pointer\n * @param pickResult optional pickingInfo data used to find mesh\n */\n setPointerOverMesh(e, t, i) {\n this._inputManager.setPointerOverMesh(e, t, i);\n }\n /**\n * Gets the mesh under the pointer\n * @returns a Mesh or null if no mesh is under the pointer\n */\n getPointerOverMesh() {\n return this._inputManager.getPointerOverMesh();\n }\n // Misc.\n /** @internal */\n _rebuildGeometries() {\n for (const e of this.geometries)\n e._rebuild();\n for (const e of this.meshes)\n e._rebuild();\n this.postProcessManager && this.postProcessManager._rebuild();\n for (const e of this._components)\n e.rebuild();\n for (const e of this.particleSystems)\n e.rebuild();\n if (this.spriteManagers)\n for (const e of this.spriteManagers)\n e.rebuild();\n }\n /** @internal */\n _rebuildTextures() {\n for (const e of this.textures)\n e._rebuild(!0);\n this.markAllMaterialsAsDirty(1);\n }\n /**\n * Get from a list of objects by tags\n * @param list the list of objects to use\n * @param tagsQuery the query to use\n * @param filter a predicate to filter for tags\n * @returns\n */\n _getByTags(e, t, i) {\n if (t === void 0)\n return e;\n const r = [];\n for (const s in e) {\n const a = e[s];\n rt && rt.MatchesQuery(a, t) && (!i || i(a)) && r.push(a);\n }\n return r;\n }\n /**\n * Get a list of meshes by tags\n * @param tagsQuery defines the tags query to use\n * @param filter defines a predicate used to filter results\n * @returns an array of Mesh\n */\n getMeshesByTags(e, t) {\n return this._getByTags(this.meshes, e, t);\n }\n /**\n * Get a list of cameras by tags\n * @param tagsQuery defines the tags query to use\n * @param filter defines a predicate used to filter results\n * @returns an array of Camera\n */\n getCamerasByTags(e, t) {\n return this._getByTags(this.cameras, e, t);\n }\n /**\n * Get a list of lights by tags\n * @param tagsQuery defines the tags query to use\n * @param filter defines a predicate used to filter results\n * @returns an array of Light\n */\n getLightsByTags(e, t) {\n return this._getByTags(this.lights, e, t);\n }\n /**\n * Get a list of materials by tags\n * @param tagsQuery defines the tags query to use\n * @param filter defines a predicate used to filter results\n * @returns an array of Material\n */\n getMaterialByTags(e, t) {\n return this._getByTags(this.materials, e, t).concat(this._getByTags(this.multiMaterials, e, t));\n }\n /**\n * Get a list of transform nodes by tags\n * @param tagsQuery defines the tags query to use\n * @param filter defines a predicate used to filter results\n * @returns an array of TransformNode\n */\n getTransformNodesByTags(e, t) {\n return this._getByTags(this.transformNodes, e, t);\n }\n /**\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\n * This allowed control for front to back rendering or reversly depending of the special needs.\n *\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\n */\n setRenderingOrder(e, t = null, i = null, r = null) {\n this._renderingManager.setRenderingOrder(e, t, i, r);\n }\n /**\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\n *\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\n * @param depth Automatically clears depth between groups if true and autoClear is true.\n * @param stencil Automatically clears stencil between groups if true and autoClear is true.\n */\n setRenderingAutoClearDepthStencil(e, t, i = !0, r = !0) {\n this._renderingManager.setRenderingAutoClearDepthStencil(e, t, i, r);\n }\n /**\n * Gets the current auto clear configuration for one rendering group of the rendering\n * manager.\n * @param index the rendering group index to get the information for\n * @returns The auto clear setup for the requested rendering group\n */\n getAutoClearDepthStencilSetup(e) {\n return this._renderingManager.getAutoClearDepthStencilSetup(e);\n }\n /** @internal */\n _forceBlockMaterialDirtyMechanism(e) {\n this._blockMaterialDirtyMechanism = e;\n }\n /** Gets or sets a boolean blocking all the calls to markAllMaterialsAsDirty (ie. the materials won't be updated if they are out of sync) */\n get blockMaterialDirtyMechanism() {\n return this._blockMaterialDirtyMechanism;\n }\n set blockMaterialDirtyMechanism(e) {\n this._blockMaterialDirtyMechanism !== e && (this._blockMaterialDirtyMechanism = e, e || this.markAllMaterialsAsDirty(63));\n }\n /**\n * Will flag all materials as dirty to trigger new shader compilation\n * @param flag defines the flag used to specify which material part must be marked as dirty\n * @param predicate If not null, it will be used to specify if a material has to be marked as dirty\n */\n markAllMaterialsAsDirty(e, t) {\n if (!this._blockMaterialDirtyMechanism)\n for (const i of this.materials)\n t && !t(i) || i.markAsDirty(e);\n }\n /**\n * @internal\n */\n _loadFile(e, t, i, r, s, a, o) {\n const l = an(e, t, i, r ? this.offlineProvider : void 0, s, a, o);\n return this._activeRequests.push(l), l.onCompleteObservable.add((c) => {\n this._activeRequests.splice(this._activeRequests.indexOf(c), 1);\n }), l;\n }\n /**\n * @internal\n */\n _loadFileAsync(e, t, i, r, s) {\n return new Promise((a, o) => {\n this._loadFile(e, (l) => {\n a(l);\n }, t, i, r, (l, c) => {\n o(c);\n }, s);\n });\n }\n /**\n * @internal\n */\n _requestFile(e, t, i, r, s, a, o) {\n const l = $u(e, t, i, r ? this.offlineProvider : void 0, s, a, o);\n return this._activeRequests.push(l), l.onCompleteObservable.add((c) => {\n this._activeRequests.splice(this._activeRequests.indexOf(c), 1);\n }), l;\n }\n /**\n * @internal\n */\n _requestFileAsync(e, t, i, r, s) {\n return new Promise((a, o) => {\n this._requestFile(e, (l) => {\n a(l);\n }, t, i, r, (l) => {\n o(l);\n }, s);\n });\n }\n /**\n * @internal\n */\n _readFile(e, t, i, r, s) {\n const a = go(e, t, i, r, s);\n return this._activeRequests.push(a), a.onCompleteObservable.add((o) => {\n this._activeRequests.splice(this._activeRequests.indexOf(o), 1);\n }), a;\n }\n /**\n * @internal\n */\n _readFileAsync(e, t, i) {\n return new Promise((r, s) => {\n this._readFile(e, (a) => {\n r(a);\n }, t, i, (a) => {\n s(a);\n });\n });\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * This method gets the performance collector belonging to the scene, which is generally shared with the inspector.\n * @returns the perf collector belonging to the scene.\n */\n getPerfCollector() {\n throw We(\"performanceViewerSceneExtension\");\n }\n // deprecated\n /**\n * Sets the active camera of the scene using its Id\n * @param id defines the camera's Id\n * @returns the new active camera or null if none found.\n * @deprecated Please use setActiveCameraById instead\n */\n setActiveCameraByID(e) {\n return this.setActiveCameraById(e);\n }\n /**\n * Get a material using its id\n * @param id defines the material's Id\n * @returns the material or null if none found.\n * @deprecated Please use getMaterialById instead\n */\n getMaterialByID(e) {\n return this.getMaterialById(e);\n }\n /**\n * Gets a the last added material using a given id\n * @param id defines the material's Id\n * @returns the last material with the given id or null if none found.\n * @deprecated Please use getLastMaterialById instead\n */\n getLastMaterialByID(e) {\n return this.getLastMaterialById(e);\n }\n /**\n * Get a texture using its unique id\n * @param uniqueId defines the texture's unique id\n * @returns the texture or null if none found.\n * @deprecated Please use getTextureByUniqueId instead\n */\n getTextureByUniqueID(e) {\n return this.getTextureByUniqueId(e);\n }\n /**\n * Gets a camera using its Id\n * @param id defines the Id to look for\n * @returns the camera or null if not found\n * @deprecated Please use getCameraById instead\n */\n getCameraByID(e) {\n return this.getCameraById(e);\n }\n /**\n * Gets a camera using its unique Id\n * @param uniqueId defines the unique Id to look for\n * @returns the camera or null if not found\n * @deprecated Please use getCameraByUniqueId instead\n */\n getCameraByUniqueID(e) {\n return this.getCameraByUniqueId(e);\n }\n /**\n * Gets a bone using its Id\n * @param id defines the bone's Id\n * @returns the bone or null if not found\n * @deprecated Please use getBoneById instead\n */\n getBoneByID(e) {\n return this.getBoneById(e);\n }\n /**\n * Gets a light node using its Id\n * @param id defines the light's Id\n * @returns the light or null if none found.\n * @deprecated Please use getLightById instead\n */\n getLightByID(e) {\n return this.getLightById(e);\n }\n /**\n * Gets a light node using its scene-generated unique Id\n * @param uniqueId defines the light's unique Id\n * @returns the light or null if none found.\n * @deprecated Please use getLightByUniqueId instead\n */\n getLightByUniqueID(e) {\n return this.getLightByUniqueId(e);\n }\n /**\n * Gets a particle system by Id\n * @param id defines the particle system Id\n * @returns the corresponding system or null if none found\n * @deprecated Please use getParticleSystemById instead\n */\n getParticleSystemByID(e) {\n return this.getParticleSystemById(e);\n }\n /**\n * Gets a geometry using its Id\n * @param id defines the geometry's Id\n * @returns the geometry or null if none found.\n * @deprecated Please use getGeometryById instead\n */\n getGeometryByID(e) {\n return this.getGeometryById(e);\n }\n /**\n * Gets the first added mesh found of a given Id\n * @param id defines the Id to search for\n * @returns the mesh found or null if not found at all\n * @deprecated Please use getMeshById instead\n */\n getMeshByID(e) {\n return this.getMeshById(e);\n }\n /**\n * Gets a mesh with its auto-generated unique Id\n * @param uniqueId defines the unique Id to search for\n * @returns the found mesh or null if not found at all.\n * @deprecated Please use getMeshByUniqueId instead\n */\n getMeshByUniqueID(e) {\n return this.getMeshByUniqueId(e);\n }\n /**\n * Gets a the last added mesh using a given Id\n * @param id defines the Id to search for\n * @returns the found mesh or null if not found at all.\n * @deprecated Please use getLastMeshById instead\n */\n getLastMeshByID(e) {\n return this.getLastMeshById(e);\n }\n /**\n * Gets a list of meshes using their Id\n * @param id defines the Id to search for\n * @returns a list of meshes\n * @deprecated Please use getMeshesById instead\n */\n getMeshesByID(e) {\n return this.getMeshesById(e);\n }\n /**\n * Gets the first added transform node found of a given Id\n * @param id defines the Id to search for\n * @returns the found transform node or null if not found at all.\n * @deprecated Please use getTransformNodeById instead\n */\n getTransformNodeByID(e) {\n return this.getTransformNodeById(e);\n }\n /**\n * Gets a transform node with its auto-generated unique Id\n * @param uniqueId defines the unique Id to search for\n * @returns the found transform node or null if not found at all.\n * @deprecated Please use getTransformNodeByUniqueId instead\n */\n getTransformNodeByUniqueID(e) {\n return this.getTransformNodeByUniqueId(e);\n }\n /**\n * Gets a list of transform nodes using their Id\n * @param id defines the Id to search for\n * @returns a list of transform nodes\n * @deprecated Please use getTransformNodesById instead\n */\n getTransformNodesByID(e) {\n return this.getTransformNodesById(e);\n }\n /**\n * Gets a node (Mesh, Camera, Light) using a given Id\n * @param id defines the Id to search for\n * @returns the found node or null if not found at all\n * @deprecated Please use getNodeById instead\n */\n getNodeByID(e) {\n return this.getNodeById(e);\n }\n /**\n * Gets a the last added node (Mesh, Camera, Light) using a given Id\n * @param id defines the Id to search for\n * @returns the found node or null if not found at all\n * @deprecated Please use getLastEntryById instead\n */\n getLastEntryByID(e) {\n return this.getLastEntryById(e);\n }\n /**\n * Gets a skeleton using a given Id (if many are found, this function will pick the last one)\n * @param id defines the Id to search for\n * @returns the found skeleton or null if not found at all.\n * @deprecated Please use getLastSkeletonById instead\n */\n getLastSkeletonByID(e) {\n return this.getLastSkeletonById(e);\n }\n}\nOt.FOGMODE_NONE = 0;\nOt.FOGMODE_EXP = 1;\nOt.FOGMODE_EXP2 = 2;\nOt.FOGMODE_LINEAR = 3;\nOt.MinDeltaTime = 1;\nOt.MaxDeltaTime = 1e3;\nclass Uy {\n /**\n * constructor\n * @param frameSampleSize The number of samples required to saturate the sliding window\n */\n constructor(e = 30) {\n this._enabled = !0, this._rollingFrameTime = new Vy(e);\n }\n /**\n * Samples current frame\n * @param timeMs A timestamp in milliseconds of the current frame to compare with other frames\n */\n sampleFrame(e = sr.Now) {\n if (this._enabled) {\n if (this._lastFrameTimeMs != null) {\n const t = e - this._lastFrameTimeMs;\n this._rollingFrameTime.add(t);\n }\n this._lastFrameTimeMs = e;\n }\n }\n /**\n * Returns the average frame time in milliseconds over the sliding window (or the subset of frames sampled so far)\n */\n get averageFrameTime() {\n return this._rollingFrameTime.average;\n }\n /**\n * Returns the variance frame time in milliseconds over the sliding window (or the subset of frames sampled so far)\n */\n get averageFrameTimeVariance() {\n return this._rollingFrameTime.variance;\n }\n /**\n * Returns the frame time of the most recent frame\n */\n get instantaneousFrameTime() {\n return this._rollingFrameTime.history(0);\n }\n /**\n * Returns the average framerate in frames per second over the sliding window (or the subset of frames sampled so far)\n */\n get averageFPS() {\n return 1e3 / this._rollingFrameTime.average;\n }\n /**\n * Returns the average framerate in frames per second using the most recent frame time\n */\n get instantaneousFPS() {\n const e = this._rollingFrameTime.history(0);\n return e === 0 ? 0 : 1e3 / e;\n }\n /**\n * Returns true if enough samples have been taken to completely fill the sliding window\n */\n get isSaturated() {\n return this._rollingFrameTime.isSaturated();\n }\n /**\n * Enables contributions to the sliding window sample set\n */\n enable() {\n this._enabled = !0;\n }\n /**\n * Disables contributions to the sliding window sample set\n * Samples will not be interpolated over the disabled period\n */\n disable() {\n this._enabled = !1, this._lastFrameTimeMs = null;\n }\n /**\n * Returns true if sampling is enabled\n */\n get isEnabled() {\n return this._enabled;\n }\n /**\n * Resets performance monitor\n */\n reset() {\n this._lastFrameTimeMs = null, this._rollingFrameTime.reset();\n }\n}\nclass Vy {\n /**\n * constructor\n * @param length The number of samples required to saturate the sliding window\n */\n constructor(e) {\n this._samples = new Array(e), this.reset();\n }\n /**\n * Adds a sample to the sample set\n * @param v The sample value\n */\n add(e) {\n let t;\n if (this.isSaturated()) {\n const i = this._samples[this._pos];\n t = i - this.average, this.average -= t / (this._sampleCount - 1), this._m2 -= t * (i - this.average);\n } else\n this._sampleCount++;\n t = e - this.average, this.average += t / this._sampleCount, this._m2 += t * (e - this.average), this.variance = this._m2 / (this._sampleCount - 1), this._samples[this._pos] = e, this._pos++, this._pos %= this._samples.length;\n }\n /**\n * Returns previously added values or null if outside of history or outside the sliding window domain\n * @param i Index in history. For example, pass 0 for the most recent value and 1 for the value before that\n * @returns Value previously recorded with add() or null if outside of range\n */\n history(e) {\n if (e >= this._sampleCount || e >= this._samples.length)\n return 0;\n const t = this._wrapPosition(this._pos - 1);\n return this._samples[this._wrapPosition(t - e)];\n }\n /**\n * Returns true if enough samples have been taken to completely fill the sliding window\n * @returns true if sample-set saturated\n */\n isSaturated() {\n return this._sampleCount >= this._samples.length;\n }\n /**\n * Resets the rolling average (equivalent to 0 samples taken so far)\n */\n reset() {\n this.average = 0, this.variance = 0, this._sampleCount = 0, this._pos = 0, this._m2 = 0;\n }\n /**\n * Wraps a value around the sample range boundaries\n * @param i Position in sample range, for example if the sample length is 5, and i is -3, then 2 will be returned.\n * @returns Wrapped position in sample range\n */\n _wrapPosition(e) {\n const t = this._samples.length;\n return (e % t + t) % t;\n }\n}\nDe.prototype.setAlphaConstants = function(n, e, t, i) {\n this._alphaState.setAlphaBlendConstants(n, e, t, i);\n};\nDe.prototype.setAlphaMode = function(n, e = !1) {\n if (this._alphaMode === n) {\n if (!e) {\n const t = n === 0;\n this.depthCullingState.depthMask !== t && (this.depthCullingState.depthMask = t);\n }\n return;\n }\n switch (n) {\n case 0:\n this._alphaState.alphaBlend = !1;\n break;\n case 7:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 8:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA), this._alphaState.alphaBlend = !0;\n break;\n case 2:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 6:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ZERO, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 1:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 3:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ZERO, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 4:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_COLOR, this._gl.ZERO, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 5:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 9:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.CONSTANT_COLOR, this._gl.ONE_MINUS_CONSTANT_COLOR, this._gl.CONSTANT_ALPHA, this._gl.ONE_MINUS_CONSTANT_ALPHA), this._alphaState.alphaBlend = !0;\n break;\n case 10:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA), this._alphaState.alphaBlend = !0;\n break;\n case 11:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 12:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ZERO), this._alphaState.alphaBlend = !0;\n break;\n case 13:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE_MINUS_DST_COLOR, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE_MINUS_DST_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA), this._alphaState.alphaBlend = !0;\n break;\n case 14:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA), this._alphaState.alphaBlend = !0;\n break;\n case 15:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ZERO), this._alphaState.alphaBlend = !0;\n break;\n case 16:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE_MINUS_DST_COLOR, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ZERO, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 17:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA), this._alphaState.alphaBlend = !0;\n break;\n }\n e || (this.depthCullingState.depthMask = n === 0), this._alphaMode = n;\n};\nDe.prototype.getAlphaMode = function() {\n return this._alphaMode;\n};\nDe.prototype.setAlphaEquation = function(n) {\n if (this._alphaEquation !== n) {\n switch (n) {\n case 0:\n this._alphaState.setAlphaEquationParameters(32774, 32774);\n break;\n case 1:\n this._alphaState.setAlphaEquationParameters(32778, 32778);\n break;\n case 2:\n this._alphaState.setAlphaEquationParameters(32779, 32779);\n break;\n case 3:\n this._alphaState.setAlphaEquationParameters(32776, 32776);\n break;\n case 4:\n this._alphaState.setAlphaEquationParameters(32775, 32775);\n break;\n case 5:\n this._alphaState.setAlphaEquationParameters(32775, 32774);\n break;\n }\n this._alphaEquation = n;\n }\n};\nDe.prototype.getAlphaEquation = function() {\n return this._alphaEquation;\n};\nfunction By(n, e, t = !1, i) {\n switch (n) {\n case 3: {\n const s = e instanceof ArrayBuffer ? new Int8Array(e) : new Int8Array(e);\n return i && s.set(new Int8Array(i)), s;\n }\n case 0: {\n const s = e instanceof ArrayBuffer ? new Uint8Array(e) : new Uint8Array(e);\n return i && s.set(new Uint8Array(i)), s;\n }\n case 4: {\n const s = e instanceof ArrayBuffer ? new Int16Array(e) : new Int16Array(t ? e / 2 : e);\n return i && s.set(new Int16Array(i)), s;\n }\n case 5:\n case 8:\n case 9:\n case 10:\n case 2: {\n const s = e instanceof ArrayBuffer ? new Uint16Array(e) : new Uint16Array(t ? e / 2 : e);\n return i && s.set(new Uint16Array(i)), s;\n }\n case 6: {\n const s = e instanceof ArrayBuffer ? new Int32Array(e) : new Int32Array(t ? e / 4 : e);\n return i && s.set(new Int32Array(i)), s;\n }\n case 7:\n case 11:\n case 12:\n case 13:\n case 14:\n case 15: {\n const s = e instanceof ArrayBuffer ? new Uint32Array(e) : new Uint32Array(t ? e / 4 : e);\n return i && s.set(new Uint32Array(i)), s;\n }\n case 1: {\n const s = e instanceof ArrayBuffer ? new Float32Array(e) : new Float32Array(t ? e / 4 : e);\n return i && s.set(new Float32Array(i)), s;\n }\n }\n const r = e instanceof ArrayBuffer ? new Uint8Array(e) : new Uint8Array(e);\n return i && r.set(new Uint8Array(i)), r;\n}\nDe.prototype._readTexturePixelsSync = function(n, e, t, i = -1, r = 0, s = null, a = !0, o = !1, l = 0, c = 0) {\n var f, d;\n const h = this._gl;\n if (!h)\n throw new Error(\"Engine does not have gl rendering context.\");\n if (!this._dummyFramebuffer) {\n const p = h.createFramebuffer();\n if (!p)\n throw new Error(\"Unable to create dummy framebuffer\");\n this._dummyFramebuffer = p;\n }\n h.bindFramebuffer(h.FRAMEBUFFER, this._dummyFramebuffer), i > -1 ? h.framebufferTexture2D(h.FRAMEBUFFER, h.COLOR_ATTACHMENT0, h.TEXTURE_CUBE_MAP_POSITIVE_X + i, (f = n._hardwareTexture) == null ? void 0 : f.underlyingResource, r) : h.framebufferTexture2D(h.FRAMEBUFFER, h.COLOR_ATTACHMENT0, h.TEXTURE_2D, (d = n._hardwareTexture) == null ? void 0 : d.underlyingResource, r);\n let u = n.type !== void 0 ? this._getWebGLTextureType(n.type) : h.UNSIGNED_BYTE;\n if (o)\n s || (s = By(n.type, 4 * e * t));\n else\n switch (u) {\n case h.UNSIGNED_BYTE:\n s || (s = new Uint8Array(4 * e * t)), u = h.UNSIGNED_BYTE;\n break;\n default:\n s || (s = new Float32Array(4 * e * t)), u = h.FLOAT;\n break;\n }\n return a && this.flushFramebuffer(), h.readPixels(l, c, e, t, h.RGBA, u, s), h.bindFramebuffer(h.FRAMEBUFFER, this._currentFramebuffer), s;\n};\nDe.prototype._readTexturePixels = function(n, e, t, i = -1, r = 0, s = null, a = !0, o = !1, l = 0, c = 0) {\n return Promise.resolve(this._readTexturePixelsSync(n, e, t, i, r, s, a, o, l, c));\n};\nDe.prototype.updateDynamicIndexBuffer = function(n, e, t = 0) {\n this._currentBoundBuffer[this._gl.ELEMENT_ARRAY_BUFFER] = null, this.bindIndexBuffer(n);\n let i;\n n.is32Bits ? i = e instanceof Uint32Array ? e : new Uint32Array(e) : i = e instanceof Uint16Array ? e : new Uint16Array(e), this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, i, this._gl.DYNAMIC_DRAW), this._resetIndexBufferBinding();\n};\nDe.prototype.updateDynamicVertexBuffer = function(n, e, t, i) {\n this.bindArrayBuffer(n), t === void 0 && (t = 0);\n const r = e.byteLength || e.length;\n i === void 0 || i >= r && t === 0 ? e instanceof Array ? this._gl.bufferSubData(this._gl.ARRAY_BUFFER, t, new Float32Array(e)) : this._gl.bufferSubData(this._gl.ARRAY_BUFFER, t, e) : e instanceof Array ? this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, new Float32Array(e).subarray(t, t + i)) : (e instanceof ArrayBuffer ? e = new Uint8Array(e, t, i) : e = new Uint8Array(e.buffer, e.byteOffset + t, i), this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, e)), this._resetVertexBufferBinding();\n};\nclass se extends De {\n /**\n * Returns the current npm package of the sdk\n */\n // Not mixed with Version for tooling purpose.\n static get NpmPackage() {\n return De.NpmPackage;\n }\n /**\n * Returns the current version of the framework\n */\n static get Version() {\n return De.Version;\n }\n /** Gets the list of created engines */\n static get Instances() {\n return st.Instances;\n }\n /**\n * Gets the latest created engine\n */\n static get LastCreatedEngine() {\n return st.LastCreatedEngine;\n }\n /**\n * Gets the latest created scene\n */\n static get LastCreatedScene() {\n return st.LastCreatedScene;\n }\n /** @internal */\n /**\n * Engine abstraction for loading and creating an image bitmap from a given source string.\n * @param imageSource source to load the image from.\n * @param options An object that sets options for the image's extraction.\n * @returns ImageBitmap.\n */\n _createImageBitmapFromSource(e, t) {\n return new Promise((r, s) => {\n const a = new Image();\n a.onload = () => {\n a.decode().then(() => {\n this.createImageBitmap(a, t).then((o) => {\n r(o);\n });\n });\n }, a.onerror = () => {\n s(`Error loading image ${a.src}`);\n }, a.src = e;\n });\n }\n /**\n * Engine abstraction for createImageBitmap\n * @param image source for image\n * @param options An object that sets options for the image's extraction.\n * @returns ImageBitmap\n */\n createImageBitmap(e, t) {\n return createImageBitmap(e, t);\n }\n /**\n * Resize an image and returns the image data as an uint8array\n * @param image image to resize\n * @param bufferWidth destination buffer width\n * @param bufferHeight destination buffer height\n * @returns an uint8array containing RGBA values of bufferWidth * bufferHeight size\n */\n resizeImageBitmap(e, t, i) {\n const s = this.createCanvas(t, i).getContext(\"2d\");\n if (!s)\n throw new Error(\"Unable to get 2d context for resizeImageBitmap\");\n return s.drawImage(e, 0, 0), s.getImageData(0, 0, t, i).data;\n }\n /**\n * Will flag all materials in all scenes in all engines as dirty to trigger new shader compilation\n * @param flag defines which part of the materials must be marked as dirty\n * @param predicate defines a predicate used to filter which materials should be affected\n */\n static MarkAllMaterialsAsDirty(e, t) {\n for (let i = 0; i < se.Instances.length; i++) {\n const r = se.Instances[i];\n for (let s = 0; s < r.scenes.length; s++)\n r.scenes[s].markAllMaterialsAsDirty(e, t);\n }\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Method called to create the default loading screen.\n * This can be overridden in your own app.\n * @param canvas The rendering canvas element\n * @returns The loading screen\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static DefaultLoadingScreenFactory(e) {\n throw We(\"LoadingScreen\");\n }\n get _supportsHardwareTextureRescaling() {\n return !!se._RescalePostProcessFactory;\n }\n /**\n * Gets the performance monitor attached to this engine\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation\n */\n get performanceMonitor() {\n return this._performanceMonitor;\n }\n /**\n * (WebGPU only) True (default) to be in compatibility mode, meaning rendering all existing scenes without artifacts (same rendering than WebGL).\n * Setting the property to false will improve performances but may not work in some scenes if some precautions are not taken.\n * See https://doc.babylonjs.com/setup/support/webGPU/webGPUOptimization/webGPUNonCompatibilityMode for more details\n */\n get compatibilityMode() {\n return this._compatibilityMode;\n }\n set compatibilityMode(e) {\n this._compatibilityMode = !0;\n }\n // Events\n /**\n * Gets the HTML element used to attach event listeners\n * @returns a HTML element\n */\n getInputElement() {\n return this._renderingCanvas;\n }\n /**\n * Creates a new engine\n * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which already used the WebGL context\n * @param antialias defines enable antialiasing (default: false)\n * @param options defines further options to be sent to the getContext() function\n * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false)\n */\n constructor(e, t, i, r = !1) {\n if (super(e, t, i, r), this.enableOfflineSupport = !1, this.disableManifestCheck = !1, this.disableContextMenu = !0, this.scenes = [], this._virtualScenes = new Array(), this.onNewSceneAddedObservable = new he(), this.postProcesses = [], this.isPointerLock = !1, this.onResizeObservable = new he(), this.onCanvasBlurObservable = new he(), this.onCanvasFocusObservable = new he(), this.onCanvasPointerOutObservable = new he(), this.onBeginFrameObservable = new he(), this.customAnimationFrameRequester = null, this.onEndFrameObservable = new he(), this.onBeforeShaderCompilationObservable = new he(), this.onAfterShaderCompilationObservable = new he(), this._deterministicLockstep = !1, this._lockstepMaxSteps = 4, this._timeStep = 1 / 60, this._fps = 60, this._deltaTime = 0, this._drawCalls = new us(), this.canvasTabIndex = 1, this.disablePerformanceMonitorInBackground = !1, this._performanceMonitor = new Uy(), this._compatibilityMode = !0, this.currentRenderPassId = 0, this._renderPassNames = [\"main\"], se.Instances.push(this), !!e && (this._features.supportRenderPasses = !0, i = this._creationOptions, e.getContext)) {\n const s = e;\n this._sharedInit(s);\n }\n }\n _initGLContext() {\n super._initGLContext(), this._rescalePostProcess = null;\n }\n /**\n * Shared initialization across engines types.\n * @param canvas The canvas associated with this instance of the engine.\n */\n _sharedInit(e) {\n super._sharedInit(e), this._onCanvasFocus = () => {\n this.onCanvasFocusObservable.notifyObservers(this);\n }, this._onCanvasBlur = () => {\n this.onCanvasBlurObservable.notifyObservers(this);\n }, this._onCanvasContextMenu = (i) => {\n this.disableContextMenu && i.preventDefault();\n }, e.addEventListener(\"focus\", this._onCanvasFocus), e.addEventListener(\"blur\", this._onCanvasBlur), e.addEventListener(\"contextmenu\", this._onCanvasContextMenu), this._onBlur = () => {\n this.disablePerformanceMonitorInBackground && this._performanceMonitor.disable(), this._windowIsBackground = !0;\n }, this._onFocus = () => {\n this.disablePerformanceMonitorInBackground && this._performanceMonitor.enable(), this._windowIsBackground = !1;\n }, this._onCanvasPointerOut = (i) => {\n document.elementFromPoint(i.clientX, i.clientY) !== e && this.onCanvasPointerOutObservable.notifyObservers(i);\n };\n const t = this.getHostWindow();\n t && typeof t.addEventListener == \"function\" && (t.addEventListener(\"blur\", this._onBlur), t.addEventListener(\"focus\", this._onFocus)), e.addEventListener(\"pointerout\", this._onCanvasPointerOut), this._creationOptions.doNotHandleTouchAction || this._disableTouchAction(), !se.audioEngine && this._creationOptions.audioEngine && se.AudioEngineFactory && (se.audioEngine = se.AudioEngineFactory(this.getRenderingCanvas(), this.getAudioContext(), this.getAudioDestination())), no() && (this._onFullscreenChange = () => {\n this.isFullscreen = !!document.fullscreenElement, this.isFullscreen && this._pointerLockRequested && e && se._RequestPointerlock(e);\n }, document.addEventListener(\"fullscreenchange\", this._onFullscreenChange, !1), document.addEventListener(\"webkitfullscreenchange\", this._onFullscreenChange, !1), this._onPointerLockChange = () => {\n this.isPointerLock = document.pointerLockElement === e;\n }, document.addEventListener(\"pointerlockchange\", this._onPointerLockChange, !1), document.addEventListener(\"webkitpointerlockchange\", this._onPointerLockChange, !1)), this.enableOfflineSupport = se.OfflineProviderFactory !== void 0, this._deterministicLockstep = !!this._creationOptions.deterministicLockstep, this._lockstepMaxSteps = this._creationOptions.lockstepMaxSteps || 0, this._timeStep = this._creationOptions.timeStep || 1 / 60;\n }\n /** @internal */\n _verifyPointerLock() {\n var e;\n (e = this._onPointerLockChange) == null || e.call(this);\n }\n /**\n * Gets current aspect ratio\n * @param viewportOwner defines the camera to use to get the aspect ratio\n * @param useScreen defines if screen size must be used (or the current render target if any)\n * @returns a number defining the aspect ratio\n */\n getAspectRatio(e, t = !1) {\n const i = e.viewport;\n return this.getRenderWidth(t) * i.width / (this.getRenderHeight(t) * i.height);\n }\n /**\n * Gets current screen aspect ratio\n * @returns a number defining the aspect ratio\n */\n getScreenAspectRatio() {\n return this.getRenderWidth(!0) / this.getRenderHeight(!0);\n }\n /**\n * Gets the client rect of the HTML canvas attached with the current webGL context\n * @returns a client rectangle\n */\n getRenderingCanvasClientRect() {\n return this._renderingCanvas ? this._renderingCanvas.getBoundingClientRect() : null;\n }\n /**\n * Gets the client rect of the HTML element used for events\n * @returns a client rectangle\n */\n getInputElementClientRect() {\n return this._renderingCanvas ? this.getInputElement().getBoundingClientRect() : null;\n }\n /**\n * Gets a boolean indicating that the engine is running in deterministic lock step mode\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\n * @returns true if engine is in deterministic lock step mode\n */\n isDeterministicLockStep() {\n return this._deterministicLockstep;\n }\n /**\n * Gets the max steps when engine is running in deterministic lock step\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\n * @returns the max steps\n */\n getLockstepMaxSteps() {\n return this._lockstepMaxSteps;\n }\n /**\n * Returns the time in ms between steps when using deterministic lock step.\n * @returns time step in (ms)\n */\n getTimeStep() {\n return this._timeStep * 1e3;\n }\n /**\n * Force the mipmap generation for the given render target texture\n * @param texture defines the render target texture to use\n * @param unbind defines whether or not to unbind the texture after generation. Defaults to true.\n */\n generateMipMapsForCubemap(e, t = !0) {\n if (e.generateMipMaps) {\n const i = this._gl;\n this._bindTextureDirectly(i.TEXTURE_CUBE_MAP, e, !0), i.generateMipmap(i.TEXTURE_CUBE_MAP), t && this._bindTextureDirectly(i.TEXTURE_CUBE_MAP, null);\n }\n }\n /** States */\n /**\n * Gets a boolean indicating if depth writing is enabled\n * @returns the current depth writing state\n */\n getDepthWrite() {\n return this._depthCullingState.depthMask;\n }\n /**\n * Enable or disable depth writing\n * @param enable defines the state to set\n */\n setDepthWrite(e) {\n this._depthCullingState.depthMask = e;\n }\n /**\n * Gets a boolean indicating if stencil buffer is enabled\n * @returns the current stencil buffer state\n */\n getStencilBuffer() {\n return this._stencilState.stencilTest;\n }\n /**\n * Enable or disable the stencil buffer\n * @param enable defines if the stencil buffer must be enabled or disabled\n */\n setStencilBuffer(e) {\n this._stencilState.stencilTest = e;\n }\n /**\n * Gets the current stencil mask\n * @returns a number defining the new stencil mask to use\n */\n getStencilMask() {\n return this._stencilState.stencilMask;\n }\n /**\n * Sets the current stencil mask\n * @param mask defines the new stencil mask to use\n */\n setStencilMask(e) {\n this._stencilState.stencilMask = e;\n }\n /**\n * Gets the current stencil function\n * @returns a number defining the stencil function to use\n */\n getStencilFunction() {\n return this._stencilState.stencilFunc;\n }\n /**\n * Gets the current stencil reference value\n * @returns a number defining the stencil reference value to use\n */\n getStencilFunctionReference() {\n return this._stencilState.stencilFuncRef;\n }\n /**\n * Gets the current stencil mask\n * @returns a number defining the stencil mask to use\n */\n getStencilFunctionMask() {\n return this._stencilState.stencilFuncMask;\n }\n /**\n * Sets the current stencil function\n * @param stencilFunc defines the new stencil function to use\n */\n setStencilFunction(e) {\n this._stencilState.stencilFunc = e;\n }\n /**\n * Sets the current stencil reference\n * @param reference defines the new stencil reference to use\n */\n setStencilFunctionReference(e) {\n this._stencilState.stencilFuncRef = e;\n }\n /**\n * Sets the current stencil mask\n * @param mask defines the new stencil mask to use\n */\n setStencilFunctionMask(e) {\n this._stencilState.stencilFuncMask = e;\n }\n /**\n * Gets the current stencil operation when stencil fails\n * @returns a number defining stencil operation to use when stencil fails\n */\n getStencilOperationFail() {\n return this._stencilState.stencilOpStencilFail;\n }\n /**\n * Gets the current stencil operation when depth fails\n * @returns a number defining stencil operation to use when depth fails\n */\n getStencilOperationDepthFail() {\n return this._stencilState.stencilOpDepthFail;\n }\n /**\n * Gets the current stencil operation when stencil passes\n * @returns a number defining stencil operation to use when stencil passes\n */\n getStencilOperationPass() {\n return this._stencilState.stencilOpStencilDepthPass;\n }\n /**\n * Sets the stencil operation to use when stencil fails\n * @param operation defines the stencil operation to use when stencil fails\n */\n setStencilOperationFail(e) {\n this._stencilState.stencilOpStencilFail = e;\n }\n /**\n * Sets the stencil operation to use when depth fails\n * @param operation defines the stencil operation to use when depth fails\n */\n setStencilOperationDepthFail(e) {\n this._stencilState.stencilOpDepthFail = e;\n }\n /**\n * Sets the stencil operation to use when stencil passes\n * @param operation defines the stencil operation to use when stencil passes\n */\n setStencilOperationPass(e) {\n this._stencilState.stencilOpStencilDepthPass = e;\n }\n /**\n * Sets a boolean indicating if the dithering state is enabled or disabled\n * @param value defines the dithering state\n */\n setDitheringState(e) {\n e ? this._gl.enable(this._gl.DITHER) : this._gl.disable(this._gl.DITHER);\n }\n /**\n * Sets a boolean indicating if the rasterizer state is enabled or disabled\n * @param value defines the rasterizer state\n */\n setRasterizerState(e) {\n e ? this._gl.disable(this._gl.RASTERIZER_DISCARD) : this._gl.enable(this._gl.RASTERIZER_DISCARD);\n }\n /**\n * Gets the current depth function\n * @returns a number defining the depth function\n */\n getDepthFunction() {\n return this._depthCullingState.depthFunc;\n }\n /**\n * Sets the current depth function\n * @param depthFunc defines the function to use\n */\n setDepthFunction(e) {\n this._depthCullingState.depthFunc = e;\n }\n /**\n * Sets the current depth function to GREATER\n */\n setDepthFunctionToGreater() {\n this.setDepthFunction(516);\n }\n /**\n * Sets the current depth function to GEQUAL\n */\n setDepthFunctionToGreaterOrEqual() {\n this.setDepthFunction(518);\n }\n /**\n * Sets the current depth function to LESS\n */\n setDepthFunctionToLess() {\n this.setDepthFunction(513);\n }\n /**\n * Sets the current depth function to LEQUAL\n */\n setDepthFunctionToLessOrEqual() {\n this.setDepthFunction(515);\n }\n /**\n * Caches the state of the stencil buffer\n */\n cacheStencilState() {\n this._cachedStencilBuffer = this.getStencilBuffer(), this._cachedStencilFunction = this.getStencilFunction(), this._cachedStencilMask = this.getStencilMask(), this._cachedStencilOperationPass = this.getStencilOperationPass(), this._cachedStencilOperationFail = this.getStencilOperationFail(), this._cachedStencilOperationDepthFail = this.getStencilOperationDepthFail(), this._cachedStencilReference = this.getStencilFunctionReference();\n }\n /**\n * Restores the state of the stencil buffer\n */\n restoreStencilState() {\n this.setStencilFunction(this._cachedStencilFunction), this.setStencilMask(this._cachedStencilMask), this.setStencilBuffer(this._cachedStencilBuffer), this.setStencilOperationPass(this._cachedStencilOperationPass), this.setStencilOperationFail(this._cachedStencilOperationFail), this.setStencilOperationDepthFail(this._cachedStencilOperationDepthFail), this.setStencilFunctionReference(this._cachedStencilReference);\n }\n /**\n * Directly set the WebGL Viewport\n * @param x defines the x coordinate of the viewport (in screen space)\n * @param y defines the y coordinate of the viewport (in screen space)\n * @param width defines the width of the viewport (in screen space)\n * @param height defines the height of the viewport (in screen space)\n * @returns the current viewport Object (if any) that is being replaced by this call. You can restore this viewport later on to go back to the original state\n */\n setDirectViewport(e, t, i, r) {\n const s = this._cachedViewport;\n return this._cachedViewport = null, this._viewport(e, t, i, r), s;\n }\n /**\n * Executes a scissor clear (ie. a clear on a specific portion of the screen)\n * @param x defines the x-coordinate of the bottom left corner of the clear rectangle\n * @param y defines the y-coordinate of the corner of the clear rectangle\n * @param width defines the width of the clear rectangle\n * @param height defines the height of the clear rectangle\n * @param clearColor defines the clear color\n */\n scissorClear(e, t, i, r, s) {\n this.enableScissor(e, t, i, r), this.clear(s, !0, !0, !0), this.disableScissor();\n }\n /**\n * Enable scissor test on a specific rectangle (ie. render will only be executed on a specific portion of the screen)\n * @param x defines the x-coordinate of the bottom left corner of the clear rectangle\n * @param y defines the y-coordinate of the corner of the clear rectangle\n * @param width defines the width of the clear rectangle\n * @param height defines the height of the clear rectangle\n */\n enableScissor(e, t, i, r) {\n const s = this._gl;\n s.enable(s.SCISSOR_TEST), s.scissor(e, t, i, r);\n }\n /**\n * Disable previously set scissor test rectangle\n */\n disableScissor() {\n const e = this._gl;\n e.disable(e.SCISSOR_TEST);\n }\n /**\n * @internal\n */\n _reportDrawCall(e = 1) {\n this._drawCalls.addCount(e, !1);\n }\n /**\n * @internal\n */\n _loadFileAsync(e, t, i) {\n return new Promise((r, s) => {\n this._loadFile(e, (a) => {\n r(a);\n }, void 0, t, i, (a, o) => {\n s(o);\n });\n });\n }\n /**\n * Gets the source code of the vertex shader associated with a specific webGL program\n * @param program defines the program to use\n * @returns a string containing the source code of the vertex shader associated with the program\n */\n getVertexShaderSource(e) {\n const t = this._gl.getAttachedShaders(e);\n return t ? this._gl.getShaderSource(t[0]) : null;\n }\n /**\n * Gets the source code of the fragment shader associated with a specific webGL program\n * @param program defines the program to use\n * @returns a string containing the source code of the fragment shader associated with the program\n */\n getFragmentShaderSource(e) {\n const t = this._gl.getAttachedShaders(e);\n return t ? this._gl.getShaderSource(t[1]) : null;\n }\n /**\n * Sets a depth stencil texture from a render target to the according uniform.\n * @param channel The texture channel\n * @param uniform The uniform to set\n * @param texture The render target texture containing the depth stencil texture to apply\n * @param name The texture name\n */\n setDepthStencilTexture(e, t, i, r) {\n e !== void 0 && (t && (this._boundUniforms[e] = t), !i || !i.depthStencilTexture ? this._setTexture(e, null, void 0, void 0, r) : this._setTexture(e, i, !1, !0, r));\n }\n /**\n * Sets a texture to the webGL context from a postprocess\n * @param channel defines the channel to use\n * @param postProcess defines the source postprocess\n * @param name name of the channel\n */\n setTextureFromPostProcess(e, t, i) {\n let r = null;\n t && (t._forcedOutputTexture ? r = t._forcedOutputTexture : t._textures.data[t._currentRenderTextureInd] && (r = t._textures.data[t._currentRenderTextureInd])), this._bindTexture(e, (r == null ? void 0 : r.texture) ?? null, i);\n }\n /**\n * Binds the output of the passed in post process to the texture channel specified\n * @param channel The channel the texture should be bound to\n * @param postProcess The post process which's output should be bound\n * @param name name of the channel\n */\n setTextureFromPostProcessOutput(e, t, i) {\n var r;\n this._bindTexture(e, ((r = t == null ? void 0 : t._outputTexture) == null ? void 0 : r.texture) ?? null, i);\n }\n /**\n * sets the object from which width and height will be taken from when getting render width and height\n * Will fallback to the gl object\n * @param dimensions the framebuffer width and height that will be used.\n */\n set framebufferDimensionsObject(e) {\n this._framebufferDimensionsObject = e, this._framebufferDimensionsObject && this.onResizeObservable.notifyObservers(this);\n }\n _rebuildBuffers() {\n for (const e of this.scenes)\n e.resetCachedMaterial(), e._rebuildGeometries();\n for (const e of this._virtualScenes)\n e.resetCachedMaterial(), e._rebuildGeometries();\n super._rebuildBuffers();\n }\n _rebuildTextures() {\n for (const e of this.scenes)\n e._rebuildTextures();\n for (const e of this._virtualScenes)\n e._rebuildTextures();\n super._rebuildTextures();\n }\n /** @internal */\n _renderFrame() {\n for (let e = 0; e < this._activeRenderLoops.length; e++) {\n const t = this._activeRenderLoops[e];\n t();\n }\n }\n _cancelFrame() {\n if (this.customAnimationFrameRequester) {\n if (this._frameHandler !== 0) {\n this._frameHandler = 0;\n const { cancelAnimationFrame: e } = this.customAnimationFrameRequester;\n e && e(this.customAnimationFrameRequester.requestID);\n }\n } else\n super._cancelFrame();\n }\n _renderLoop() {\n if (this._frameHandler = 0, !this._contextWasLost) {\n let e = !0;\n (this.isDisposed || !this.renderEvenInBackground && this._windowIsBackground) && (e = !1), e && (this.beginFrame(), this._renderViews() || this._renderFrame(), this.endFrame());\n }\n this._frameHandler === 0 && (this.customAnimationFrameRequester ? (this.customAnimationFrameRequester.requestID = this._queueNewFrame(this.customAnimationFrameRequester.renderFunction || this._boundRenderFunction, this.customAnimationFrameRequester), this._frameHandler = this.customAnimationFrameRequester.requestID) : this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow()));\n }\n /** @internal */\n _renderViews() {\n return !1;\n }\n /**\n * Toggle full screen mode\n * @param requestPointerLock defines if a pointer lock should be requested from the user\n */\n switchFullscreen(e) {\n this.isFullscreen ? this.exitFullscreen() : this.enterFullscreen(e);\n }\n /**\n * Enters full screen mode\n * @param requestPointerLock defines if a pointer lock should be requested from the user\n */\n enterFullscreen(e) {\n this.isFullscreen || (this._pointerLockRequested = e, this._renderingCanvas && se._RequestFullscreen(this._renderingCanvas));\n }\n /**\n * Exits full screen mode\n */\n exitFullscreen() {\n this.isFullscreen && se._ExitFullscreen();\n }\n /**\n * Enters Pointerlock mode\n */\n enterPointerlock() {\n this._renderingCanvas && se._RequestPointerlock(this._renderingCanvas);\n }\n /**\n * Exits Pointerlock mode\n */\n exitPointerlock() {\n se._ExitPointerlock();\n }\n /**\n * Begin a new frame\n */\n beginFrame() {\n this._measureFps(), this.onBeginFrameObservable.notifyObservers(this), super.beginFrame();\n }\n /**\n * End the current frame\n */\n endFrame() {\n super.endFrame(), this.onEndFrameObservable.notifyObservers(this);\n }\n /**\n * Force a specific size of the canvas\n * @param width defines the new canvas' width\n * @param height defines the new canvas' height\n * @param forceSetSize true to force setting the sizes of the underlying canvas\n * @returns true if the size was changed\n */\n setSize(e, t, i = !1) {\n if (!this._renderingCanvas || !super.setSize(e, t, i))\n return !1;\n if (this.scenes) {\n for (let r = 0; r < this.scenes.length; r++) {\n const s = this.scenes[r];\n for (let a = 0; a < s.cameras.length; a++) {\n const o = s.cameras[a];\n o._currentRenderId = 0;\n }\n }\n this.onResizeObservable.hasObservers() && this.onResizeObservable.notifyObservers(this);\n }\n return !0;\n }\n _deletePipelineContext(e) {\n const t = e;\n t && t.program && t.transformFeedback && (this.deleteTransformFeedback(t.transformFeedback), t.transformFeedback = null), super._deletePipelineContext(e);\n }\n createShaderProgram(e, t, i, r, s, a = null) {\n s = s || this._gl, this.onBeforeShaderCompilationObservable.notifyObservers(this);\n const o = super.createShaderProgram(e, t, i, r, s, a);\n return this.onAfterShaderCompilationObservable.notifyObservers(this), o;\n }\n _createShaderProgram(e, t, i, r, s = null) {\n const a = r.createProgram();\n if (e.program = a, !a)\n throw new Error(\"Unable to create program\");\n if (r.attachShader(a, t), r.attachShader(a, i), this.webGLVersion > 1 && s) {\n const o = this.createTransformFeedback();\n this.bindTransformFeedback(o), this.setTranformFeedbackVaryings(a, s), e.transformFeedback = o;\n }\n return r.linkProgram(a), this.webGLVersion > 1 && s && this.bindTransformFeedback(null), e.context = r, e.vertexShader = t, e.fragmentShader = i, e.isParallelCompiled || this._finalizePipelineContext(e), a;\n }\n /**\n * @internal\n */\n _releaseTexture(e) {\n super._releaseTexture(e);\n }\n /**\n * @internal\n */\n _releaseRenderTargetWrapper(e) {\n super._releaseRenderTargetWrapper(e), this.scenes.forEach((t) => {\n t.postProcesses.forEach((i) => {\n i._outputTexture === e && (i._outputTexture = null);\n }), t.cameras.forEach((i) => {\n i._postProcesses.forEach((r) => {\n r && r._outputTexture === e && (r._outputTexture = null);\n });\n });\n });\n }\n /**\n * Gets the names of the render passes that are currently created\n * @returns list of the render pass names\n */\n getRenderPassNames() {\n return this._renderPassNames;\n }\n /**\n * Gets the name of the current render pass\n * @returns name of the current render pass\n */\n getCurrentRenderPassName() {\n return this._renderPassNames[this.currentRenderPassId];\n }\n /**\n * Creates a render pass id\n * @param name Name of the render pass (for debug purpose only)\n * @returns the id of the new render pass\n */\n createRenderPassId(e) {\n const t = ++se._RenderPassIdCounter;\n return this._renderPassNames[t] = e ?? \"NONAME\", t;\n }\n /**\n * Releases a render pass id\n * @param id id of the render pass to release\n */\n releaseRenderPassId(e) {\n this._renderPassNames[e] = void 0;\n for (let t = 0; t < this.scenes.length; ++t) {\n const i = this.scenes[t];\n for (let r = 0; r < i.meshes.length; ++r) {\n const s = i.meshes[r];\n if (s.subMeshes)\n for (let a = 0; a < s.subMeshes.length; ++a)\n s.subMeshes[a]._removeDrawWrapper(e);\n }\n }\n }\n /**\n * @internal\n * Rescales a texture\n * @param source input texture\n * @param destination destination texture\n * @param scene scene to use to render the resize\n * @param internalFormat format to use when resizing\n * @param onComplete callback to be called when resize has completed\n */\n _rescaleTexture(e, t, i, r, s) {\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.LINEAR), this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.LINEAR), this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE), this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);\n const a = this.createRenderTargetTexture({\n width: t.width,\n height: t.height\n }, {\n generateMipMaps: !1,\n type: 0,\n samplingMode: 2,\n generateDepthBuffer: !1,\n generateStencilBuffer: !1\n });\n !this._rescalePostProcess && se._RescalePostProcessFactory && (this._rescalePostProcess = se._RescalePostProcessFactory(this)), this._rescalePostProcess && (this._rescalePostProcess.externalTextureSamplerBinding = !0, this._rescalePostProcess.getEffect().executeWhenCompiled(() => {\n this._rescalePostProcess.onApply = function(l) {\n l._bindTexture(\"textureSampler\", e);\n };\n let o = i;\n o || (o = this.scenes[this.scenes.length - 1]), o.postProcessManager.directRender([this._rescalePostProcess], a, !0), this._bindTextureDirectly(this._gl.TEXTURE_2D, t, !0), this._gl.copyTexImage2D(this._gl.TEXTURE_2D, 0, r, 0, 0, t.width, t.height, 0), this.unBindFramebuffer(a), a.dispose(), s && s();\n }));\n }\n // FPS\n /**\n * Gets the current framerate\n * @returns a number representing the framerate\n */\n getFps() {\n return this._fps;\n }\n /**\n * Gets the time spent between current and previous frame\n * @returns a number representing the delta time in ms\n */\n getDeltaTime() {\n return this._deltaTime;\n }\n _measureFps() {\n this._performanceMonitor.sampleFrame(), this._fps = this._performanceMonitor.averageFPS, this._deltaTime = this._performanceMonitor.instantaneousFrameTime || 0;\n }\n /**\n * Wraps an external web gl texture in a Babylon texture.\n * @param texture defines the external texture\n * @param hasMipMaps defines whether the external texture has mip maps (default: false)\n * @param samplingMode defines the sampling mode for the external texture (default: 3)\n * @param width defines the width for the external texture (default: 0)\n * @param height defines the height for the external texture (default: 0)\n * @returns the babylon internal texture\n */\n wrapWebGLTexture(e, t = !1, i = 3, r = 0, s = 0) {\n const a = new F_(e, this._gl), o = new ar(this, Dt.Unknown, !0);\n return o._hardwareTexture = a, o.baseWidth = r, o.baseHeight = s, o.width = r, o.height = s, o.isReady = !0, o.useMipMaps = t, this.updateTextureSamplingMode(i, o), o;\n }\n /**\n * @internal\n */\n _uploadImageToTexture(e, t, i = 0, r = 0) {\n const s = this._gl, a = this._getWebGLTextureType(e.type), o = this._getInternalFormat(e.format), l = this._getRGBABufferInternalSizedFormat(e.type, o), c = e.isCube ? s.TEXTURE_CUBE_MAP : s.TEXTURE_2D;\n this._bindTextureDirectly(c, e, !0), this._unpackFlipY(e.invertY);\n let h = s.TEXTURE_2D;\n e.isCube && (h = s.TEXTURE_CUBE_MAP_POSITIVE_X + i), s.texImage2D(h, r, l, o, a, t), this._bindTextureDirectly(c, null, !0);\n }\n /**\n * Updates a depth texture Comparison Mode and Function.\n * If the comparison Function is equal to 0, the mode will be set to none.\n * Otherwise, this only works in webgl 2 and requires a shadow sampler in the shader.\n * @param texture The texture to set the comparison function for\n * @param comparisonFunction The comparison function to set, 0 if no comparison required\n */\n updateTextureComparisonFunction(e, t) {\n if (this.webGLVersion === 1) {\n ne.Error(\"WebGL 1 does not support texture comparison.\");\n return;\n }\n const i = this._gl;\n e.isCube ? (this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, e, !0), t === 0 ? (i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_COMPARE_FUNC, 515), i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_COMPARE_MODE, i.NONE)) : (i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_COMPARE_FUNC, t), i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_COMPARE_MODE, i.COMPARE_REF_TO_TEXTURE)), this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null)) : (this._bindTextureDirectly(this._gl.TEXTURE_2D, e, !0), t === 0 ? (i.texParameteri(i.TEXTURE_2D, i.TEXTURE_COMPARE_FUNC, 515), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_COMPARE_MODE, i.NONE)) : (i.texParameteri(i.TEXTURE_2D, i.TEXTURE_COMPARE_FUNC, t), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_COMPARE_MODE, i.COMPARE_REF_TO_TEXTURE)), this._bindTextureDirectly(this._gl.TEXTURE_2D, null)), e._comparisonFunction = t;\n }\n /**\n * Creates a webGL buffer to use with instantiation\n * @param capacity defines the size of the buffer\n * @returns the webGL buffer\n */\n createInstancesBuffer(e) {\n const t = this._gl.createBuffer();\n if (!t)\n throw new Error(\"Unable to create instance buffer\");\n const i = new po(t);\n return i.capacity = e, this.bindArrayBuffer(i), this._gl.bufferData(this._gl.ARRAY_BUFFER, e, this._gl.DYNAMIC_DRAW), i.references = 1, i;\n }\n /**\n * Delete a webGL buffer used with instantiation\n * @param buffer defines the webGL buffer to delete\n */\n deleteInstancesBuffer(e) {\n this._gl.deleteBuffer(e);\n }\n _clientWaitAsync(e, t = 0, i = 10) {\n const r = this._gl;\n return new Promise((s, a) => {\n const o = () => {\n const l = r.clientWaitSync(e, t, 0);\n if (l == r.WAIT_FAILED) {\n a();\n return;\n }\n if (l == r.TIMEOUT_EXPIRED) {\n setTimeout(o, i);\n return;\n }\n s();\n };\n o();\n });\n }\n /**\n * @internal\n */\n _readPixelsAsync(e, t, i, r, s, a, o) {\n if (this._webGLVersion < 2)\n throw new Error(\"_readPixelsAsync only work on WebGL2+\");\n const l = this._gl, c = l.createBuffer();\n l.bindBuffer(l.PIXEL_PACK_BUFFER, c), l.bufferData(l.PIXEL_PACK_BUFFER, o.byteLength, l.STREAM_READ), l.readPixels(e, t, i, r, s, a, 0), l.bindBuffer(l.PIXEL_PACK_BUFFER, null);\n const h = l.fenceSync(l.SYNC_GPU_COMMANDS_COMPLETE, 0);\n return h ? (l.flush(), this._clientWaitAsync(h, 0, 10).then(() => (l.deleteSync(h), l.bindBuffer(l.PIXEL_PACK_BUFFER, c), l.getBufferSubData(l.PIXEL_PACK_BUFFER, 0, o), l.bindBuffer(l.PIXEL_PACK_BUFFER, null), l.deleteBuffer(c), o))) : null;\n }\n dispose() {\n for (this.hideLoadingUI(), this.onNewSceneAddedObservable.clear(); this.postProcesses.length; )\n this.postProcesses[0].dispose();\n for (this._rescalePostProcess && this._rescalePostProcess.dispose(); this.scenes.length; )\n this.scenes[0].dispose();\n for (; this._virtualScenes.length; )\n this._virtualScenes[0].dispose();\n st.Instances.length === 1 && se.audioEngine && (se.audioEngine.dispose(), se.audioEngine = null);\n const e = this.getHostWindow();\n e && typeof e.removeEventListener == \"function\" && (e.removeEventListener(\"blur\", this._onBlur), e.removeEventListener(\"focus\", this._onFocus)), this._renderingCanvas && (this._renderingCanvas.removeEventListener(\"focus\", this._onCanvasFocus), this._renderingCanvas.removeEventListener(\"blur\", this._onCanvasBlur), this._renderingCanvas.removeEventListener(\"pointerout\", this._onCanvasPointerOut), this._renderingCanvas.removeEventListener(\"contextmenu\", this._onCanvasContextMenu)), no() && (document.removeEventListener(\"fullscreenchange\", this._onFullscreenChange), document.removeEventListener(\"mozfullscreenchange\", this._onFullscreenChange), document.removeEventListener(\"webkitfullscreenchange\", this._onFullscreenChange), document.removeEventListener(\"msfullscreenchange\", this._onFullscreenChange), document.removeEventListener(\"pointerlockchange\", this._onPointerLockChange), document.removeEventListener(\"mspointerlockchange\", this._onPointerLockChange), document.removeEventListener(\"mozpointerlockchange\", this._onPointerLockChange), document.removeEventListener(\"webkitpointerlockchange\", this._onPointerLockChange)), super.dispose();\n const t = st.Instances.indexOf(this);\n t >= 0 && st.Instances.splice(t, 1), se.Instances.length || st.OnEnginesDisposedObservable.notifyObservers(this), this.onResizeObservable.clear(), this.onCanvasBlurObservable.clear(), this.onCanvasFocusObservable.clear(), this.onCanvasPointerOutObservable.clear(), this.onBeginFrameObservable.clear(), this.onEndFrameObservable.clear();\n }\n _disableTouchAction() {\n !this._renderingCanvas || !this._renderingCanvas.setAttribute || (this._renderingCanvas.setAttribute(\"touch-action\", \"none\"), this._renderingCanvas.style.touchAction = \"none\", this._renderingCanvas.style.webkitTapHighlightColor = \"transparent\");\n }\n // Loading screen\n /**\n * Display the loading screen\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\n */\n displayLoadingUI() {\n if (!yi())\n return;\n const e = this.loadingScreen;\n e && e.displayLoadingUI();\n }\n /**\n * Hide the loading screen\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\n */\n hideLoadingUI() {\n if (!yi())\n return;\n const e = this._loadingScreen;\n e && e.hideLoadingUI();\n }\n /**\n * Gets the current loading screen object\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\n */\n get loadingScreen() {\n return !this._loadingScreen && this._renderingCanvas && (this._loadingScreen = se.DefaultLoadingScreenFactory(this._renderingCanvas)), this._loadingScreen;\n }\n /**\n * Sets the current loading screen object\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\n */\n set loadingScreen(e) {\n this._loadingScreen = e;\n }\n /**\n * Sets the current loading screen text\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\n */\n set loadingUIText(e) {\n this.loadingScreen.loadingUIText = e;\n }\n /**\n * Sets the current loading screen background color\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\n */\n set loadingUIBackgroundColor(e) {\n this.loadingScreen.loadingUIBackgroundColor = e;\n }\n /**\n * creates and returns a new video element\n * @param constraints video constraints\n * @returns video element\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n createVideoElement(e) {\n return document.createElement(\"video\");\n }\n /** Pointerlock and fullscreen */\n /**\n * Ask the browser to promote the current element to pointerlock mode\n * @param element defines the DOM element to promote\n */\n static _RequestPointerlock(e) {\n if (e.requestPointerLock) {\n const t = e.requestPointerLock();\n t instanceof Promise ? t.then(() => {\n e.focus();\n }).catch(() => {\n }) : e.focus();\n }\n }\n /**\n * Asks the browser to exit pointerlock mode\n */\n static _ExitPointerlock() {\n document.exitPointerLock && document.exitPointerLock();\n }\n /**\n * Ask the browser to promote the current element to fullscreen rendering mode\n * @param element defines the DOM element to promote\n */\n static _RequestFullscreen(e) {\n const t = e.requestFullscreen || e.webkitRequestFullscreen;\n t && t.call(e);\n }\n /**\n * Asks the browser to exit fullscreen mode\n */\n static _ExitFullscreen() {\n const e = document;\n document.exitFullscreen ? document.exitFullscreen() : e.webkitCancelFullScreen && e.webkitCancelFullScreen();\n }\n /**\n * Get Font size information\n * @param font font name\n * @returns an object containing ascent, height and descent\n */\n getFontOffset(e) {\n const t = document.createElement(\"span\");\n t.innerHTML = \"Hg\", t.setAttribute(\"style\", `font: ${e} !important`);\n const i = document.createElement(\"div\");\n i.style.display = \"inline-block\", i.style.width = \"1px\", i.style.height = \"0px\", i.style.verticalAlign = \"bottom\";\n const r = document.createElement(\"div\");\n r.style.whiteSpace = \"nowrap\", r.appendChild(t), r.appendChild(i), document.body.appendChild(r);\n let s = 0, a = 0;\n try {\n a = i.getBoundingClientRect().top - t.getBoundingClientRect().top, i.style.verticalAlign = \"baseline\", s = i.getBoundingClientRect().top - t.getBoundingClientRect().top;\n } finally {\n document.body.removeChild(r);\n }\n return { ascent: s, height: a, descent: a - s };\n }\n}\nse.ALPHA_DISABLE = 0;\nse.ALPHA_ADD = 1;\nse.ALPHA_COMBINE = 2;\nse.ALPHA_SUBTRACT = 3;\nse.ALPHA_MULTIPLY = 4;\nse.ALPHA_MAXIMIZED = 5;\nse.ALPHA_ONEONE = 6;\nse.ALPHA_PREMULTIPLIED = 7;\nse.ALPHA_PREMULTIPLIED_PORTERDUFF = 8;\nse.ALPHA_INTERPOLATE = 9;\nse.ALPHA_SCREENMODE = 10;\nse.DELAYLOADSTATE_NONE = 0;\nse.DELAYLOADSTATE_LOADED = 1;\nse.DELAYLOADSTATE_LOADING = 2;\nse.DELAYLOADSTATE_NOTLOADED = 4;\nse.NEVER = 512;\nse.ALWAYS = 519;\nse.LESS = 513;\nse.EQUAL = 514;\nse.LEQUAL = 515;\nse.GREATER = 516;\nse.GEQUAL = 518;\nse.NOTEQUAL = 517;\nse.KEEP = 7680;\nse.REPLACE = 7681;\nse.INCR = 7682;\nse.DECR = 7683;\nse.INVERT = 5386;\nse.INCR_WRAP = 34055;\nse.DECR_WRAP = 34056;\nse.TEXTURE_CLAMP_ADDRESSMODE = 0;\nse.TEXTURE_WRAP_ADDRESSMODE = 1;\nse.TEXTURE_MIRROR_ADDRESSMODE = 2;\nse.TEXTUREFORMAT_ALPHA = 0;\nse.TEXTUREFORMAT_LUMINANCE = 1;\nse.TEXTUREFORMAT_LUMINANCE_ALPHA = 2;\nse.TEXTUREFORMAT_RGB = 4;\nse.TEXTUREFORMAT_RGBA = 5;\nse.TEXTUREFORMAT_RED = 6;\nse.TEXTUREFORMAT_R = 6;\nse.TEXTUREFORMAT_RG = 7;\nse.TEXTUREFORMAT_RED_INTEGER = 8;\nse.TEXTUREFORMAT_R_INTEGER = 8;\nse.TEXTUREFORMAT_RG_INTEGER = 9;\nse.TEXTUREFORMAT_RGB_INTEGER = 10;\nse.TEXTUREFORMAT_RGBA_INTEGER = 11;\nse.TEXTURETYPE_UNSIGNED_BYTE = 0;\nse.TEXTURETYPE_UNSIGNED_INT = 0;\nse.TEXTURETYPE_FLOAT = 1;\nse.TEXTURETYPE_HALF_FLOAT = 2;\nse.TEXTURETYPE_BYTE = 3;\nse.TEXTURETYPE_SHORT = 4;\nse.TEXTURETYPE_UNSIGNED_SHORT = 5;\nse.TEXTURETYPE_INT = 6;\nse.TEXTURETYPE_UNSIGNED_INTEGER = 7;\nse.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4 = 8;\nse.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1 = 9;\nse.TEXTURETYPE_UNSIGNED_SHORT_5_6_5 = 10;\nse.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV = 11;\nse.TEXTURETYPE_UNSIGNED_INT_24_8 = 12;\nse.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV = 13;\nse.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV = 14;\nse.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV = 15;\nse.TEXTURE_NEAREST_SAMPLINGMODE = 1;\nse.TEXTURE_BILINEAR_SAMPLINGMODE = 2;\nse.TEXTURE_TRILINEAR_SAMPLINGMODE = 3;\nse.TEXTURE_NEAREST_NEAREST_MIPLINEAR = 8;\nse.TEXTURE_LINEAR_LINEAR_MIPNEAREST = 11;\nse.TEXTURE_LINEAR_LINEAR_MIPLINEAR = 3;\nse.TEXTURE_NEAREST_NEAREST_MIPNEAREST = 4;\nse.TEXTURE_NEAREST_LINEAR_MIPNEAREST = 5;\nse.TEXTURE_NEAREST_LINEAR_MIPLINEAR = 6;\nse.TEXTURE_NEAREST_LINEAR = 7;\nse.TEXTURE_NEAREST_NEAREST = 1;\nse.TEXTURE_LINEAR_NEAREST_MIPNEAREST = 9;\nse.TEXTURE_LINEAR_NEAREST_MIPLINEAR = 10;\nse.TEXTURE_LINEAR_LINEAR = 2;\nse.TEXTURE_LINEAR_NEAREST = 12;\nse.TEXTURE_EXPLICIT_MODE = 0;\nse.TEXTURE_SPHERICAL_MODE = 1;\nse.TEXTURE_PLANAR_MODE = 2;\nse.TEXTURE_CUBIC_MODE = 3;\nse.TEXTURE_PROJECTION_MODE = 4;\nse.TEXTURE_SKYBOX_MODE = 5;\nse.TEXTURE_INVCUBIC_MODE = 6;\nse.TEXTURE_EQUIRECTANGULAR_MODE = 7;\nse.TEXTURE_FIXED_EQUIRECTANGULAR_MODE = 8;\nse.TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9;\nse.SCALEMODE_FLOOR = 1;\nse.SCALEMODE_NEAREST = 2;\nse.SCALEMODE_CEILING = 3;\nse._RescalePostProcessFactory = null;\nse._RenderPassIdCounter = 0;\nfunction rc(n, e, t) {\n try {\n const i = n.next();\n i.done ? e(i) : i.value ? i.value.then(() => {\n i.value = void 0, e(i);\n }, t) : e(i);\n } catch (i) {\n t(i);\n }\n}\nfunction ky(n = 25) {\n let e;\n return (t, i, r) => {\n const s = performance.now();\n e === void 0 || s - e > n ? (e = s, setTimeout(() => {\n rc(t, i, r);\n }, 0)) : rc(t, i, r);\n };\n}\nfunction Z_(n, e, t, i, r) {\n const s = () => {\n let a;\n const o = (l) => {\n l.done ? t(l.value) : a === void 0 ? a = !0 : s();\n };\n do\n a = void 0, !r || !r.aborted ? e(n, o, i) : i(new Error(\"Aborted\")), a === void 0 && (a = !1);\n while (a);\n };\n s();\n}\nfunction sf(n, e) {\n let t;\n return Z_(n, rc, (i) => t = i, (i) => {\n throw i;\n }, e), t;\n}\nfunction j_(n, e, t) {\n return new Promise((i, r) => {\n Z_(n, e, i, r, t);\n });\n}\nfunction zy(n, e) {\n return (...t) => sf(n(...t), e);\n}\nclass Eu {\n constructor(e, t, i) {\n this.bu = e, this.bv = t, this.distance = i, this.faceId = 0, this.subMeshId = 0;\n }\n}\nclass Fs {\n /**\n * Creates a new bounding box\n * @param min defines the minimum vector (in local space)\n * @param max defines the maximum vector (in local space)\n * @param worldMatrix defines the new world matrix\n */\n constructor(e, t, i) {\n this.vectors = vi.BuildArray(8, _.Zero), this.center = _.Zero(), this.centerWorld = _.Zero(), this.extendSize = _.Zero(), this.extendSizeWorld = _.Zero(), this.directions = vi.BuildArray(3, _.Zero), this.vectorsWorld = vi.BuildArray(8, _.Zero), this.minimumWorld = _.Zero(), this.maximumWorld = _.Zero(), this.minimum = _.Zero(), this.maximum = _.Zero(), this._drawWrapperFront = null, this._drawWrapperBack = null, this.reConstruct(e, t, i);\n }\n // Methods\n /**\n * Recreates the entire bounding box from scratch as if we call the constructor in place\n * @param min defines the new minimum vector (in local space)\n * @param max defines the new maximum vector (in local space)\n * @param worldMatrix defines the new world matrix\n */\n reConstruct(e, t, i) {\n const r = e.x, s = e.y, a = e.z, o = t.x, l = t.y, c = t.z, h = this.vectors;\n this.minimum.copyFromFloats(r, s, a), this.maximum.copyFromFloats(o, l, c), h[0].copyFromFloats(r, s, a), h[1].copyFromFloats(o, l, c), h[2].copyFromFloats(o, s, a), h[3].copyFromFloats(r, l, a), h[4].copyFromFloats(r, s, c), h[5].copyFromFloats(o, l, a), h[6].copyFromFloats(r, l, c), h[7].copyFromFloats(o, s, c), t.addToRef(e, this.center).scaleInPlace(0.5), t.subtractToRef(e, this.extendSize).scaleInPlace(0.5), this._worldMatrix = i || w.IdentityReadOnly, this._update(this._worldMatrix);\n }\n /**\n * Scale the current bounding box by applying a scale factor\n * @param factor defines the scale factor to apply\n * @returns the current bounding box\n */\n scale(e) {\n const t = Fs._TmpVector3, i = this.maximum.subtractToRef(this.minimum, t[0]), r = i.length();\n i.normalizeFromLength(r);\n const s = r * e, a = i.scaleInPlace(s * 0.5), o = this.center.subtractToRef(a, t[1]), l = this.center.addToRef(a, t[2]);\n return this.reConstruct(o, l, this._worldMatrix), this;\n }\n /**\n * Gets the world matrix of the bounding box\n * @returns a matrix\n */\n getWorldMatrix() {\n return this._worldMatrix;\n }\n /**\n * @internal\n */\n _update(e) {\n const t = this.minimumWorld, i = this.maximumWorld, r = this.directions, s = this.vectorsWorld, a = this.vectors;\n if (e.isIdentity()) {\n t.copyFrom(this.minimum), i.copyFrom(this.maximum);\n for (let o = 0; o < 8; ++o)\n s[o].copyFrom(a[o]);\n this.extendSizeWorld.copyFrom(this.extendSize), this.centerWorld.copyFrom(this.center);\n } else {\n t.setAll(Number.MAX_VALUE), i.setAll(-Number.MAX_VALUE);\n for (let o = 0; o < 8; ++o) {\n const l = s[o];\n _.TransformCoordinatesToRef(a[o], e, l), t.minimizeInPlace(l), i.maximizeInPlace(l);\n }\n i.subtractToRef(t, this.extendSizeWorld).scaleInPlace(0.5), i.addToRef(t, this.centerWorld).scaleInPlace(0.5);\n }\n _.FromArrayToRef(e.m, 0, r[0]), _.FromArrayToRef(e.m, 4, r[1]), _.FromArrayToRef(e.m, 8, r[2]), this._worldMatrix = e;\n }\n /**\n * Tests if the bounding box is intersecting the frustum planes\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if there is an intersection\n */\n isInFrustum(e) {\n return Fs.IsInFrustum(this.vectorsWorld, e);\n }\n /**\n * Tests if the bounding box is entirely inside the frustum planes\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if there is an inclusion\n */\n isCompletelyInFrustum(e) {\n return Fs.IsCompletelyInFrustum(this.vectorsWorld, e);\n }\n /**\n * Tests if a point is inside the bounding box\n * @param point defines the point to test\n * @returns true if the point is inside the bounding box\n */\n intersectsPoint(e) {\n const t = this.minimumWorld, i = this.maximumWorld, r = t.x, s = t.y, a = t.z, o = i.x, l = i.y, c = i.z, h = e.x, u = e.y, f = e.z, d = -xt;\n return !(o - h < d || d > h - r || l - u < d || d > u - s || c - f < d || d > f - a);\n }\n /**\n * Tests if the bounding box intersects with a bounding sphere\n * @param sphere defines the sphere to test\n * @returns true if there is an intersection\n */\n intersectsSphere(e) {\n return Fs.IntersectsSphere(this.minimumWorld, this.maximumWorld, e.centerWorld, e.radiusWorld);\n }\n /**\n * Tests if the bounding box intersects with a box defined by a min and max vectors\n * @param min defines the min vector to use\n * @param max defines the max vector to use\n * @returns true if there is an intersection\n */\n intersectsMinMax(e, t) {\n const i = this.minimumWorld, r = this.maximumWorld, s = i.x, a = i.y, o = i.z, l = r.x, c = r.y, h = r.z, u = e.x, f = e.y, d = e.z, p = t.x, g = t.y, m = t.z;\n return !(l < u || s > p || c < f || a > g || h < d || o > m);\n }\n /**\n * Disposes the resources of the class\n */\n dispose() {\n var e, t;\n (e = this._drawWrapperFront) == null || e.dispose(), (t = this._drawWrapperBack) == null || t.dispose();\n }\n // Statics\n /**\n * Tests if two bounding boxes are intersections\n * @param box0 defines the first box to test\n * @param box1 defines the second box to test\n * @returns true if there is an intersection\n */\n static Intersects(e, t) {\n return e.intersectsMinMax(t.minimumWorld, t.maximumWorld);\n }\n /**\n * Tests if a bounding box defines by a min/max vectors intersects a sphere\n * @param minPoint defines the minimum vector of the bounding box\n * @param maxPoint defines the maximum vector of the bounding box\n * @param sphereCenter defines the sphere center\n * @param sphereRadius defines the sphere radius\n * @returns true if there is an intersection\n */\n static IntersectsSphere(e, t, i, r) {\n const s = Fs._TmpVector3[0];\n return _.ClampToRef(i, e, t, s), _.DistanceSquared(i, s) <= r * r;\n }\n /**\n * Tests if a bounding box defined with 8 vectors is entirely inside frustum planes\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if there is an inclusion\n */\n static IsCompletelyInFrustum(e, t) {\n for (let i = 0; i < 6; ++i) {\n const r = t[i];\n for (let s = 0; s < 8; ++s)\n if (r.dotCoordinate(e[s]) < 0)\n return !1;\n }\n return !0;\n }\n /**\n * Tests if a bounding box defined with 8 vectors intersects frustum planes\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if there is an intersection\n */\n static IsInFrustum(e, t) {\n for (let i = 0; i < 6; ++i) {\n let r = !0;\n const s = t[i];\n for (let a = 0; a < 8; ++a)\n if (s.dotCoordinate(e[a]) >= 0) {\n r = !1;\n break;\n }\n if (r)\n return !1;\n }\n return !0;\n }\n}\nFs._TmpVector3 = vi.BuildArray(3, _.Zero);\nclass An {\n /**\n * Creates a new bounding sphere\n * @param min defines the minimum vector (in local space)\n * @param max defines the maximum vector (in local space)\n * @param worldMatrix defines the new world matrix\n */\n constructor(e, t, i) {\n this.center = _.Zero(), this.centerWorld = _.Zero(), this.minimum = _.Zero(), this.maximum = _.Zero(), this.reConstruct(e, t, i);\n }\n /**\n * Recreates the entire bounding sphere from scratch as if we call the constructor in place\n * @param min defines the new minimum vector (in local space)\n * @param max defines the new maximum vector (in local space)\n * @param worldMatrix defines the new world matrix\n */\n reConstruct(e, t, i) {\n this.minimum.copyFrom(e), this.maximum.copyFrom(t);\n const r = _.Distance(e, t);\n t.addToRef(e, this.center).scaleInPlace(0.5), this.radius = r * 0.5, this._update(i || w.IdentityReadOnly);\n }\n /**\n * Scale the current bounding sphere by applying a scale factor\n * @param factor defines the scale factor to apply\n * @returns the current bounding box\n */\n scale(e) {\n const t = this.radius * e, i = An._TmpVector3, r = i[0].setAll(t), s = this.center.subtractToRef(r, i[1]), a = this.center.addToRef(r, i[2]);\n return this.reConstruct(s, a, this._worldMatrix), this;\n }\n /**\n * Gets the world matrix of the bounding box\n * @returns a matrix\n */\n getWorldMatrix() {\n return this._worldMatrix;\n }\n // Methods\n /**\n * @internal\n */\n _update(e) {\n if (e.isIdentity())\n this.centerWorld.copyFrom(this.center), this.radiusWorld = this.radius;\n else {\n _.TransformCoordinatesToRef(this.center, e, this.centerWorld);\n const t = An._TmpVector3[0];\n _.TransformNormalFromFloatsToRef(1, 1, 1, e, t), this.radiusWorld = Math.max(Math.abs(t.x), Math.abs(t.y), Math.abs(t.z)) * this.radius;\n }\n }\n /**\n * Tests if the bounding sphere is intersecting the frustum planes\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if there is an intersection\n */\n isInFrustum(e) {\n const t = this.centerWorld, i = this.radiusWorld;\n for (let r = 0; r < 6; r++)\n if (e[r].dotCoordinate(t) <= -i)\n return !1;\n return !0;\n }\n /**\n * Tests if the bounding sphere center is in between the frustum planes.\n * Used for optimistic fast inclusion.\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if the sphere center is in between the frustum planes\n */\n isCenterInFrustum(e) {\n const t = this.centerWorld;\n for (let i = 0; i < 6; i++)\n if (e[i].dotCoordinate(t) < 0)\n return !1;\n return !0;\n }\n /**\n * Tests if a point is inside the bounding sphere\n * @param point defines the point to test\n * @returns true if the point is inside the bounding sphere\n */\n intersectsPoint(e) {\n const t = _.DistanceSquared(this.centerWorld, e);\n return !(this.radiusWorld * this.radiusWorld < t);\n }\n // Statics\n /**\n * Checks if two sphere intersect\n * @param sphere0 sphere 0\n * @param sphere1 sphere 1\n * @returns true if the spheres intersect\n */\n static Intersects(e, t) {\n const i = _.DistanceSquared(e.centerWorld, t.centerWorld), r = e.radiusWorld + t.radiusWorld;\n return !(r * r < i);\n }\n /**\n * Creates a sphere from a center and a radius\n * @param center The center\n * @param radius radius\n * @param matrix Optional worldMatrix\n * @returns The sphere\n */\n static CreateFromCenterAndRadius(e, t, i) {\n this._TmpVector3[0].copyFrom(e), this._TmpVector3[1].copyFromFloats(0, 0, t), this._TmpVector3[2].copyFrom(e), this._TmpVector3[0].addInPlace(this._TmpVector3[1]), this._TmpVector3[2].subtractInPlace(this._TmpVector3[1]);\n const r = new An(this._TmpVector3[0], this._TmpVector3[2]);\n return i ? r._worldMatrix = i : r._worldMatrix = w.Identity(), r;\n }\n}\nAn._TmpVector3 = vi.BuildArray(3, _.Zero);\nconst Bh = { min: 0, max: 0 }, kh = { min: 0, max: 0 }, lg = (n, e, t) => {\n const i = _.Dot(e.centerWorld, n), r = Math.abs(_.Dot(e.directions[0], n)) * e.extendSize.x, s = Math.abs(_.Dot(e.directions[1], n)) * e.extendSize.y, a = Math.abs(_.Dot(e.directions[2], n)) * e.extendSize.z, o = r + s + a;\n t.min = i - o, t.max = i + o;\n}, tr = (n, e, t) => (lg(n, e, Bh), lg(n, t, kh), !(Bh.min > kh.max || kh.min > Bh.max));\nclass Cr {\n /**\n * Constructs bounding info\n * @param minimum min vector of the bounding box/sphere\n * @param maximum max vector of the bounding box/sphere\n * @param worldMatrix defines the new world matrix\n */\n constructor(e, t, i) {\n this._isLocked = !1, this.boundingBox = new Fs(e, t, i), this.boundingSphere = new An(e, t, i);\n }\n /**\n * Recreates the entire bounding info from scratch as if we call the constructor in place\n * @param min defines the new minimum vector (in local space)\n * @param max defines the new maximum vector (in local space)\n * @param worldMatrix defines the new world matrix\n */\n reConstruct(e, t, i) {\n this.boundingBox.reConstruct(e, t, i), this.boundingSphere.reConstruct(e, t, i);\n }\n /**\n * min vector of the bounding box/sphere\n */\n get minimum() {\n return this.boundingBox.minimum;\n }\n /**\n * max vector of the bounding box/sphere\n */\n get maximum() {\n return this.boundingBox.maximum;\n }\n /**\n * If the info is locked and won't be updated to avoid perf overhead\n */\n get isLocked() {\n return this._isLocked;\n }\n set isLocked(e) {\n this._isLocked = e;\n }\n // Methods\n /**\n * Updates the bounding sphere and box\n * @param world world matrix to be used to update\n */\n update(e) {\n this._isLocked || (this.boundingBox._update(e), this.boundingSphere._update(e));\n }\n /**\n * Recreate the bounding info to be centered around a specific point given a specific extend.\n * @param center New center of the bounding info\n * @param extend New extend of the bounding info\n * @returns the current bounding info\n */\n centerOn(e, t) {\n const i = Cr._TmpVector3[0].copyFrom(e).subtractInPlace(t), r = Cr._TmpVector3[1].copyFrom(e).addInPlace(t);\n return this.boundingBox.reConstruct(i, r, this.boundingBox.getWorldMatrix()), this.boundingSphere.reConstruct(i, r, this.boundingBox.getWorldMatrix()), this;\n }\n /**\n * Grows the bounding info to include the given point.\n * @param point The point that will be included in the current bounding info (in local space)\n * @returns the current bounding info\n */\n encapsulate(e) {\n const t = _.Minimize(this.minimum, e), i = _.Maximize(this.maximum, e);\n return this.reConstruct(t, i, this.boundingBox.getWorldMatrix()), this;\n }\n /**\n * Grows the bounding info to encapsulate the given bounding info.\n * @param toEncapsulate The bounding info that will be encapsulated in the current bounding info\n * @returns the current bounding info\n */\n encapsulateBoundingInfo(e) {\n const t = z.Matrix[0];\n this.boundingBox.getWorldMatrix().invertToRef(t);\n const i = z.Vector3[0];\n return _.TransformCoordinatesToRef(e.boundingBox.minimumWorld, t, i), this.encapsulate(i), _.TransformCoordinatesToRef(e.boundingBox.maximumWorld, t, i), this.encapsulate(i), this;\n }\n /**\n * Scale the current bounding info by applying a scale factor\n * @param factor defines the scale factor to apply\n * @returns the current bounding info\n */\n scale(e) {\n return this.boundingBox.scale(e), this.boundingSphere.scale(e), this;\n }\n /**\n * Returns `true` if the bounding info is within the frustum defined by the passed array of planes.\n * @param frustumPlanes defines the frustum to test\n * @param strategy defines the strategy to use for the culling (default is BABYLON.AbstractMesh.CULLINGSTRATEGY_STANDARD)\n * The different strategies available are:\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_STANDARD most accurate but slower @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_STANDARD\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY faster but less accurate @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION can be faster if always visible @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_OPTIMISTIC_INCLUSION\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY can be faster if always visible @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY\n * @returns true if the bounding info is in the frustum planes\n */\n isInFrustum(e, t = 0) {\n return (t === 2 || t === 3) && this.boundingSphere.isCenterInFrustum(e) ? !0 : this.boundingSphere.isInFrustum(e) ? t === 1 || t === 3 ? !0 : this.boundingBox.isInFrustum(e) : !1;\n }\n /**\n * Gets the world distance between the min and max points of the bounding box\n */\n get diagonalLength() {\n const e = this.boundingBox;\n return e.maximumWorld.subtractToRef(e.minimumWorld, Cr._TmpVector3[0]).length();\n }\n /**\n * Checks if a cullable object (mesh...) is in the camera frustum\n * Unlike isInFrustum this checks the full bounding box\n * @param frustumPlanes Camera near/planes\n * @returns true if the object is in frustum otherwise false\n */\n isCompletelyInFrustum(e) {\n return this.boundingBox.isCompletelyInFrustum(e);\n }\n /**\n * @internal\n */\n _checkCollision(e) {\n return e._canDoCollision(this.boundingSphere.centerWorld, this.boundingSphere.radiusWorld, this.boundingBox.minimumWorld, this.boundingBox.maximumWorld);\n }\n /**\n * Checks if a point is inside the bounding box and bounding sphere or the mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\n * @param point the point to check intersection with\n * @returns if the point intersects\n */\n intersectsPoint(e) {\n return !(!this.boundingSphere.centerWorld || !this.boundingSphere.intersectsPoint(e) || !this.boundingBox.intersectsPoint(e));\n }\n /**\n * Checks if another bounding info intersects the bounding box and bounding sphere or the mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\n * @param boundingInfo the bounding info to check intersection with\n * @param precise if the intersection should be done using OBB\n * @returns if the bounding info intersects\n */\n intersects(e, t) {\n if (!An.Intersects(this.boundingSphere, e.boundingSphere) || !Fs.Intersects(this.boundingBox, e.boundingBox))\n return !1;\n if (!t)\n return !0;\n const i = this.boundingBox, r = e.boundingBox;\n return !(!tr(i.directions[0], i, r) || !tr(i.directions[1], i, r) || !tr(i.directions[2], i, r) || !tr(r.directions[0], i, r) || !tr(r.directions[1], i, r) || !tr(r.directions[2], i, r) || !tr(_.Cross(i.directions[0], r.directions[0]), i, r) || !tr(_.Cross(i.directions[0], r.directions[1]), i, r) || !tr(_.Cross(i.directions[0], r.directions[2]), i, r) || !tr(_.Cross(i.directions[1], r.directions[0]), i, r) || !tr(_.Cross(i.directions[1], r.directions[1]), i, r) || !tr(_.Cross(i.directions[1], r.directions[2]), i, r) || !tr(_.Cross(i.directions[2], r.directions[0]), i, r) || !tr(_.Cross(i.directions[2], r.directions[1]), i, r) || !tr(_.Cross(i.directions[2], r.directions[2]), i, r));\n }\n}\nCr._TmpVector3 = vi.BuildArray(2, _.Zero);\nclass Dc {\n static extractMinAndMaxIndexed(e, t, i, r, s, a) {\n for (let o = i; o < i + r; o++) {\n const l = t[o] * 3, c = e[l], h = e[l + 1], u = e[l + 2];\n s.minimizeInPlaceFromFloats(c, h, u), a.maximizeInPlaceFromFloats(c, h, u);\n }\n }\n static extractMinAndMax(e, t, i, r, s, a) {\n for (let o = t, l = t * r; o < t + i; o++, l += r) {\n const c = e[l], h = e[l + 1], u = e[l + 2];\n s.minimizeInPlaceFromFloats(c, h, u), a.maximizeInPlaceFromFloats(c, h, u);\n }\n }\n}\nP([\n on.filter((...[n, e]) => !Array.isArray(n) && !Array.isArray(e))\n // eslint-disable-next-line @typescript-eslint/naming-convention\n], Dc, \"extractMinAndMaxIndexed\", null);\nP([\n on.filter((...[n]) => !Array.isArray(n))\n // eslint-disable-next-line @typescript-eslint/naming-convention\n], Dc, \"extractMinAndMax\", null);\nfunction Wy(n, e, t, i, r = null) {\n const s = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), a = new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n return Dc.extractMinAndMaxIndexed(n, e, t, i, s, a), r && (s.x -= s.x * r.x + r.y, s.y -= s.y * r.x + r.y, s.z -= s.z * r.x + r.y, a.x += a.x * r.x + r.y, a.y += a.y * r.x + r.y, a.z += a.z * r.x + r.y), {\n minimum: s,\n maximum: a\n };\n}\nfunction _o(n, e, t, i = null, r) {\n const s = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), a = new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n return r || (r = 3), Dc.extractMinAndMax(n, e, t, r, s, a), i && (s.x -= s.x * i.x + i.y, s.y -= s.y * i.x + i.y, s.z -= s.z * i.x + i.y, a.x += a.x * i.x + i.y, a.y += a.y * i.x + i.y, a.z += a.z * i.x + i.y), {\n minimum: s,\n maximum: a\n };\n}\nclass bi {\n /**\n * Gets material defines used by the effect associated to the sub mesh\n */\n get materialDefines() {\n var e;\n return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.defines : (e = this._getDrawWrapper()) == null ? void 0 : e.defines;\n }\n /**\n * Sets material defines used by the effect associated to the sub mesh\n */\n set materialDefines(e) {\n const t = this._mainDrawWrapperOverride ?? this._getDrawWrapper(void 0, !0);\n t.defines = e;\n }\n /**\n * @internal\n */\n _getDrawWrapper(e, t = !1) {\n e = e ?? this._engine.currentRenderPassId;\n let i = this._drawWrappers[e];\n return !i && t && (this._drawWrappers[e] = i = new ka(this._mesh.getScene().getEngine())), i;\n }\n /**\n * @internal\n */\n _removeDrawWrapper(e, t = !0) {\n var i;\n t && ((i = this._drawWrappers[e]) == null || i.dispose()), this._drawWrappers[e] = void 0;\n }\n /**\n * Gets associated (main) effect (possibly the effect override if defined)\n */\n get effect() {\n var e;\n return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : ((e = this._getDrawWrapper()) == null ? void 0 : e.effect) ?? null;\n }\n /** @internal */\n get _drawWrapper() {\n return this._mainDrawWrapperOverride ?? this._getDrawWrapper(void 0, !0);\n }\n /** @internal */\n get _drawWrapperOverride() {\n return this._mainDrawWrapperOverride;\n }\n /**\n * @internal\n */\n _setMainDrawWrapperOverride(e) {\n this._mainDrawWrapperOverride = e;\n }\n /**\n * Sets associated effect (effect used to render this submesh)\n * @param effect defines the effect to associate with\n * @param defines defines the set of defines used to compile this effect\n * @param materialContext material context associated to the effect\n * @param resetContext true to reset the draw context\n */\n setEffect(e, t = null, i, r = !0) {\n const s = this._drawWrapper;\n s.setEffect(e, t, r), i !== void 0 && (s.materialContext = i), e || (s.defines = null, s.materialContext = void 0);\n }\n /**\n * Resets the draw wrappers cache\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\n */\n resetDrawCache(e) {\n if (this._drawWrappers)\n if (e !== void 0) {\n this._removeDrawWrapper(e);\n return;\n } else\n for (const t of this._drawWrappers)\n t == null || t.dispose();\n this._drawWrappers = [];\n }\n /**\n * Add a new submesh to a mesh\n * @param materialIndex defines the material index to use\n * @param verticesStart defines vertex index start\n * @param verticesCount defines vertices count\n * @param indexStart defines index start\n * @param indexCount defines indices count\n * @param mesh defines the parent mesh\n * @param renderingMesh defines an optional rendering mesh\n * @param createBoundingBox defines if bounding box should be created for this submesh\n * @returns the new submesh\n */\n static AddToMesh(e, t, i, r, s, a, o, l = !0) {\n return new bi(e, t, i, r, s, a, o, l);\n }\n /**\n * Creates a new submesh\n * @param materialIndex defines the material index to use\n * @param verticesStart defines vertex index start\n * @param verticesCount defines vertices count\n * @param indexStart defines index start\n * @param indexCount defines indices count\n * @param mesh defines the parent mesh\n * @param renderingMesh defines an optional rendering mesh\n * @param createBoundingBox defines if bounding box should be created for this submesh\n * @param addToMesh defines a boolean indicating that the submesh must be added to the mesh.subMeshes array (true by default)\n */\n constructor(e, t, i, r, s, a, o, l = !0, c = !0) {\n this.materialIndex = e, this.verticesStart = t, this.verticesCount = i, this.indexStart = r, this.indexCount = s, this._mainDrawWrapperOverride = null, this._linesIndexCount = 0, this._linesIndexBuffer = null, this._lastColliderWorldVertices = null, this._lastColliderTransformMatrix = null, this._wasDispatched = !1, this._renderId = 0, this._alphaIndex = 0, this._distanceToCamera = 0, this._currentMaterial = null, this._mesh = a, this._renderingMesh = o || a, c && a.subMeshes.push(this), this._engine = this._mesh.getScene().getEngine(), this.resetDrawCache(), this._trianglePlanes = [], this._id = a.subMeshes.length - 1, l && (this.refreshBoundingInfo(), a.computeWorldMatrix(!0));\n }\n /**\n * Returns true if this submesh covers the entire parent mesh\n * @ignorenaming\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n get IsGlobal() {\n return this.verticesStart === 0 && this.verticesCount === this._mesh.getTotalVertices() && this.indexStart === 0 && this.indexCount === this._mesh.getTotalIndices();\n }\n /**\n * Returns the submesh BoundingInfo object\n * @returns current bounding info (or mesh's one if the submesh is global)\n */\n getBoundingInfo() {\n return this.IsGlobal || this._mesh.hasThinInstances ? this._mesh.getBoundingInfo() : this._boundingInfo;\n }\n /**\n * Sets the submesh BoundingInfo\n * @param boundingInfo defines the new bounding info to use\n * @returns the SubMesh\n */\n setBoundingInfo(e) {\n return this._boundingInfo = e, this;\n }\n /**\n * Returns the mesh of the current submesh\n * @returns the parent mesh\n */\n getMesh() {\n return this._mesh;\n }\n /**\n * Returns the rendering mesh of the submesh\n * @returns the rendering mesh (could be different from parent mesh)\n */\n getRenderingMesh() {\n return this._renderingMesh;\n }\n /**\n * Returns the replacement mesh of the submesh\n * @returns the replacement mesh (could be different from parent mesh)\n */\n getReplacementMesh() {\n return this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\n }\n /**\n * Returns the effective mesh of the submesh\n * @returns the effective mesh (could be different from parent mesh)\n */\n getEffectiveMesh() {\n const e = this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\n return e || this._renderingMesh;\n }\n /**\n * Returns the submesh material\n * @param getDefaultMaterial Defines whether or not to get the default material if nothing has been defined.\n * @returns null or the current material\n */\n getMaterial(e = !0) {\n const t = this._renderingMesh.getMaterialForRenderPass(this._engine.currentRenderPassId) ?? this._renderingMesh.material;\n if (t) {\n if (this._isMultiMaterial(t)) {\n const i = t.getSubMaterial(this.materialIndex);\n return this._currentMaterial !== i && (this._currentMaterial = i, this.resetDrawCache()), i;\n }\n } else\n return e ? this._mesh.getScene().defaultMaterial : null;\n return t;\n }\n _isMultiMaterial(e) {\n return e.getSubMaterial !== void 0;\n }\n // Methods\n /**\n * Sets a new updated BoundingInfo object to the submesh\n * @param data defines an optional position array to use to determine the bounding info\n * @returns the SubMesh\n */\n refreshBoundingInfo(e = null) {\n if (this._lastColliderWorldVertices = null, this.IsGlobal || !this._renderingMesh || !this._renderingMesh.geometry)\n return this;\n if (e || (e = this._renderingMesh.getVerticesData(I.PositionKind)), !e)\n return this._boundingInfo = this._mesh.getBoundingInfo(), this;\n const t = this._renderingMesh.getIndices();\n let i;\n if (this.indexStart === 0 && this.indexCount === t.length) {\n const r = this._renderingMesh.getBoundingInfo();\n i = { minimum: r.minimum.clone(), maximum: r.maximum.clone() };\n } else\n i = Wy(e, t, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias);\n return this._boundingInfo ? this._boundingInfo.reConstruct(i.minimum, i.maximum) : this._boundingInfo = new Cr(i.minimum, i.maximum), this;\n }\n /**\n * @internal\n */\n _checkCollision(e) {\n return this.getBoundingInfo()._checkCollision(e);\n }\n /**\n * Updates the submesh BoundingInfo\n * @param world defines the world matrix to use to update the bounding info\n * @returns the submesh\n */\n updateBoundingInfo(e) {\n let t = this.getBoundingInfo();\n return t || (this.refreshBoundingInfo(), t = this.getBoundingInfo()), t && t.update(e), this;\n }\n /**\n * True is the submesh bounding box intersects the frustum defined by the passed array of planes.\n * @param frustumPlanes defines the frustum planes\n * @returns true if the submesh is intersecting with the frustum\n */\n isInFrustum(e) {\n const t = this.getBoundingInfo();\n return t ? t.isInFrustum(e, this._mesh.cullingStrategy) : !1;\n }\n /**\n * True is the submesh bounding box is completely inside the frustum defined by the passed array of planes\n * @param frustumPlanes defines the frustum planes\n * @returns true if the submesh is inside the frustum\n */\n isCompletelyInFrustum(e) {\n const t = this.getBoundingInfo();\n return t ? t.isCompletelyInFrustum(e) : !1;\n }\n /**\n * Renders the submesh\n * @param enableAlphaMode defines if alpha needs to be used\n * @returns the submesh\n */\n render(e) {\n return this._renderingMesh.render(this, e, this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : void 0), this;\n }\n /**\n * @internal\n */\n _getLinesIndexBuffer(e, t) {\n if (!this._linesIndexBuffer) {\n const i = [];\n for (let r = this.indexStart; r < this.indexStart + this.indexCount; r += 3)\n i.push(e[r], e[r + 1], e[r + 1], e[r + 2], e[r + 2], e[r]);\n this._linesIndexBuffer = t.createIndexBuffer(i), this._linesIndexCount = i.length;\n }\n return this._linesIndexBuffer;\n }\n /**\n * Checks if the submesh intersects with a ray\n * @param ray defines the ray to test\n * @returns true is the passed ray intersects the submesh bounding box\n */\n canIntersects(e) {\n const t = this.getBoundingInfo();\n return t ? e.intersectsBox(t.boundingBox) : !1;\n }\n /**\n * Intersects current submesh with a ray\n * @param ray defines the ray to test\n * @param positions defines mesh's positions array\n * @param indices defines mesh's indices array\n * @param fastCheck defines if the first intersection will be used (and not the closest)\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @returns intersection info or null if no intersection\n */\n intersects(e, t, i, r, s) {\n const a = this.getMaterial();\n if (!a)\n return null;\n let o = 3, l = !1;\n switch (a.fillMode) {\n case 3:\n case 5:\n case 6:\n case 8:\n return null;\n case 7:\n o = 1, l = !0;\n break;\n }\n return a.fillMode === 4 ? i.length ? this._intersectLines(e, t, i, this._mesh.intersectionThreshold, r) : this._intersectUnIndexedLines(e, t, i, this._mesh.intersectionThreshold, r) : !i.length && this._mesh._unIndexed ? this._intersectUnIndexedTriangles(e, t, i, r, s) : this._intersectTriangles(e, t, i, o, l, r, s);\n }\n /**\n * @internal\n */\n _intersectLines(e, t, i, r, s) {\n let a = null;\n for (let o = this.indexStart; o < this.indexStart + this.indexCount; o += 2) {\n const l = t[i[o]], c = t[i[o + 1]], h = e.intersectionSegment(l, c, r);\n if (!(h < 0) && (s || !a || h < a.distance) && (a = new Eu(null, null, h), a.faceId = o / 2, s))\n break;\n }\n return a;\n }\n /**\n * @internal\n */\n _intersectUnIndexedLines(e, t, i, r, s) {\n let a = null;\n for (let o = this.verticesStart; o < this.verticesStart + this.verticesCount; o += 2) {\n const l = t[o], c = t[o + 1], h = e.intersectionSegment(l, c, r);\n if (!(h < 0) && (s || !a || h < a.distance) && (a = new Eu(null, null, h), a.faceId = o / 2, s))\n break;\n }\n return a;\n }\n /**\n * @internal\n */\n _intersectTriangles(e, t, i, r, s, a, o) {\n let l = null, c = -1;\n for (let h = this.indexStart; h < this.indexStart + this.indexCount - (3 - r); h += r) {\n c++;\n const u = i[h], f = i[h + 1], d = i[h + 2];\n if (s && d === 4294967295) {\n h += 2;\n continue;\n }\n const p = t[u], g = t[f], m = t[d];\n if (!p || !g || !m || o && !o(p, g, m, e, u, f, d))\n continue;\n const v = e.intersectsTriangle(p, g, m);\n if (v) {\n if (v.distance < 0)\n continue;\n if ((a || !l || v.distance < l.distance) && (l = v, l.faceId = c, a))\n break;\n }\n }\n return l;\n }\n /**\n * @internal\n */\n _intersectUnIndexedTriangles(e, t, i, r, s) {\n let a = null;\n for (let o = this.verticesStart; o < this.verticesStart + this.verticesCount; o += 3) {\n const l = t[o], c = t[o + 1], h = t[o + 2];\n if (s && !s(l, c, h, e, -1, -1, -1))\n continue;\n const u = e.intersectsTriangle(l, c, h);\n if (u) {\n if (u.distance < 0)\n continue;\n if ((r || !a || u.distance < a.distance) && (a = u, a.faceId = o / 3, r))\n break;\n }\n }\n return a;\n }\n /** @internal */\n _rebuild() {\n this._linesIndexBuffer && (this._linesIndexBuffer = null);\n }\n // Clone\n /**\n * Creates a new submesh from the passed mesh\n * @param newMesh defines the new hosting mesh\n * @param newRenderingMesh defines an optional rendering mesh\n * @returns the new submesh\n */\n clone(e, t) {\n const i = new bi(this.materialIndex, this.verticesStart, this.verticesCount, this.indexStart, this.indexCount, e, t, !1);\n if (!this.IsGlobal) {\n const r = this.getBoundingInfo();\n if (!r)\n return i;\n i._boundingInfo = new Cr(r.minimum, r.maximum);\n }\n return i;\n }\n // Dispose\n /**\n * Release associated resources\n */\n dispose() {\n this._linesIndexBuffer && (this._mesh.getScene().getEngine()._releaseBuffer(this._linesIndexBuffer), this._linesIndexBuffer = null);\n const e = this._mesh.subMeshes.indexOf(this);\n this._mesh.subMeshes.splice(e, 1), this.resetDrawCache();\n }\n /**\n * Gets the class name\n * @returns the string \"SubMesh\".\n */\n getClassName() {\n return \"SubMesh\";\n }\n // Statics\n /**\n * Creates a new submesh from indices data\n * @param materialIndex the index of the main mesh material\n * @param startIndex the index where to start the copy in the mesh indices array\n * @param indexCount the number of indices to copy then from the startIndex\n * @param mesh the main mesh to create the submesh from\n * @param renderingMesh the optional rendering mesh\n * @param createBoundingBox defines if bounding box should be created for this submesh\n * @returns a new submesh\n */\n static CreateFromIndices(e, t, i, r, s, a = !0) {\n let o = Number.MAX_VALUE, l = -Number.MAX_VALUE;\n const h = (s || r).getIndices();\n for (let u = t; u < t + i; u++) {\n const f = h[u];\n f < o && (o = f), f > l && (l = f);\n }\n return new bi(e, o, l - o + 1, t, i, r, s, a);\n }\n}\nclass Gl {\n}\nclass re {\n /**\n * Creates a new VertexData\n */\n constructor() {\n this.uniqueId = 0, this.metadata = {}, this._applyTo = zy(this._applyToCoroutine.bind(this)), this.uniqueId = re._UniqueIDGenerator, re._UniqueIDGenerator++;\n }\n /**\n * Uses the passed data array to set the set the values for the specified kind of data\n * @param data a linear array of floating numbers\n * @param kind the type of data that is being set, eg positions, colors etc\n */\n set(e, t) {\n switch (e.length || ne.Warn(`Setting vertex data kind '${t}' with an empty array`), t) {\n case I.PositionKind:\n this.positions = e;\n break;\n case I.NormalKind:\n this.normals = e;\n break;\n case I.TangentKind:\n this.tangents = e;\n break;\n case I.UVKind:\n this.uvs = e;\n break;\n case I.UV2Kind:\n this.uvs2 = e;\n break;\n case I.UV3Kind:\n this.uvs3 = e;\n break;\n case I.UV4Kind:\n this.uvs4 = e;\n break;\n case I.UV5Kind:\n this.uvs5 = e;\n break;\n case I.UV6Kind:\n this.uvs6 = e;\n break;\n case I.ColorKind:\n this.colors = e;\n break;\n case I.MatricesIndicesKind:\n this.matricesIndices = e;\n break;\n case I.MatricesWeightsKind:\n this.matricesWeights = e;\n break;\n case I.MatricesIndicesExtraKind:\n this.matricesIndicesExtra = e;\n break;\n case I.MatricesWeightsExtraKind:\n this.matricesWeightsExtra = e;\n break;\n }\n }\n /**\n * Associates the vertexData to the passed Mesh.\n * Sets it as updatable or not (default `false`)\n * @param mesh the mesh the vertexData is applied to\n * @param updatable when used and having the value true allows new data to update the vertexData\n * @returns the VertexData\n */\n applyToMesh(e, t) {\n return this._applyTo(e, t, !1), this;\n }\n /**\n * Associates the vertexData to the passed Geometry.\n * Sets it as updatable or not (default `false`)\n * @param geometry the geometry the vertexData is applied to\n * @param updatable when used and having the value true allows new data to update the vertexData\n * @returns VertexData\n */\n applyToGeometry(e, t) {\n return this._applyTo(e, t, !1), this;\n }\n /**\n * Updates the associated mesh\n * @param mesh the mesh to be updated\n * @returns VertexData\n */\n updateMesh(e) {\n return this._update(e), this;\n }\n /**\n * Updates the associated geometry\n * @param geometry the geometry to be updated\n * @returns VertexData.\n */\n updateGeometry(e) {\n return this._update(e), this;\n }\n /**\n * @internal\n */\n *_applyToCoroutine(e, t = !1, i) {\n if (this.positions && (e.setVerticesData(I.PositionKind, this.positions, t), i && (yield)), this.normals && (e.setVerticesData(I.NormalKind, this.normals, t), i && (yield)), this.tangents && (e.setVerticesData(I.TangentKind, this.tangents, t), i && (yield)), this.uvs && (e.setVerticesData(I.UVKind, this.uvs, t), i && (yield)), this.uvs2 && (e.setVerticesData(I.UV2Kind, this.uvs2, t), i && (yield)), this.uvs3 && (e.setVerticesData(I.UV3Kind, this.uvs3, t), i && (yield)), this.uvs4 && (e.setVerticesData(I.UV4Kind, this.uvs4, t), i && (yield)), this.uvs5 && (e.setVerticesData(I.UV5Kind, this.uvs5, t), i && (yield)), this.uvs6 && (e.setVerticesData(I.UV6Kind, this.uvs6, t), i && (yield)), this.colors && (e.setVerticesData(I.ColorKind, this.colors, t), this.hasVertexAlpha && e.hasVertexAlpha !== void 0 && (e.hasVertexAlpha = !0), i && (yield)), this.matricesIndices && (e.setVerticesData(I.MatricesIndicesKind, this.matricesIndices, t), i && (yield)), this.matricesWeights && (e.setVerticesData(I.MatricesWeightsKind, this.matricesWeights, t), i && (yield)), this.matricesIndicesExtra && (e.setVerticesData(I.MatricesIndicesExtraKind, this.matricesIndicesExtra, t), i && (yield)), this.matricesWeightsExtra && (e.setVerticesData(I.MatricesWeightsExtraKind, this.matricesWeightsExtra, t), i && (yield)), this.indices ? (e.setIndices(this.indices, null, t), i && (yield)) : e.setIndices([], null), e.subMeshes && this.materialInfos && this.materialInfos.length > 1) {\n const r = e;\n r.subMeshes = [];\n for (const s of this.materialInfos)\n new bi(s.materialIndex, s.verticesStart, s.verticesCount, s.indexStart, s.indexCount, r);\n }\n return this;\n }\n _update(e, t, i) {\n return this.positions && e.updateVerticesData(I.PositionKind, this.positions, t, i), this.normals && e.updateVerticesData(I.NormalKind, this.normals, t, i), this.tangents && e.updateVerticesData(I.TangentKind, this.tangents, t, i), this.uvs && e.updateVerticesData(I.UVKind, this.uvs, t, i), this.uvs2 && e.updateVerticesData(I.UV2Kind, this.uvs2, t, i), this.uvs3 && e.updateVerticesData(I.UV3Kind, this.uvs3, t, i), this.uvs4 && e.updateVerticesData(I.UV4Kind, this.uvs4, t, i), this.uvs5 && e.updateVerticesData(I.UV5Kind, this.uvs5, t, i), this.uvs6 && e.updateVerticesData(I.UV6Kind, this.uvs6, t, i), this.colors && e.updateVerticesData(I.ColorKind, this.colors, t, i), this.matricesIndices && e.updateVerticesData(I.MatricesIndicesKind, this.matricesIndices, t, i), this.matricesWeights && e.updateVerticesData(I.MatricesWeightsKind, this.matricesWeights, t, i), this.matricesIndicesExtra && e.updateVerticesData(I.MatricesIndicesExtraKind, this.matricesIndicesExtra, t, i), this.matricesWeightsExtra && e.updateVerticesData(I.MatricesWeightsExtraKind, this.matricesWeightsExtra, t, i), this.indices && e.setIndices(this.indices, null), this;\n }\n static _TransformVector3Coordinates(e, t, i = 0, r = e.length) {\n const s = z.Vector3[0], a = z.Vector3[1];\n for (let o = i; o < i + r; o += 3)\n _.FromArrayToRef(e, o, s), _.TransformCoordinatesToRef(s, t, a), e[o] = a.x, e[o + 1] = a.y, e[o + 2] = a.z;\n }\n static _TransformVector3Normals(e, t, i = 0, r = e.length) {\n const s = z.Vector3[0], a = z.Vector3[1];\n for (let o = i; o < i + r; o += 3)\n _.FromArrayToRef(e, o, s), _.TransformNormalToRef(s, t, a), e[o] = a.x, e[o + 1] = a.y, e[o + 2] = a.z;\n }\n static _TransformVector4Normals(e, t, i = 0, r = e.length) {\n const s = z.Vector4[0], a = z.Vector4[1];\n for (let o = i; o < i + r; o += 4)\n Ke.FromArrayToRef(e, o, s), Ke.TransformNormalToRef(s, t, a), e[o] = a.x, e[o + 1] = a.y, e[o + 2] = a.z, e[o + 3] = a.w;\n }\n static _FlipFaces(e, t = 0, i = e.length) {\n for (let r = t; r < t + i; r += 3) {\n const s = e[r + 1];\n e[r + 1] = e[r + 2], e[r + 2] = s;\n }\n }\n /**\n * Transforms each position and each normal of the vertexData according to the passed Matrix\n * @param matrix the transforming matrix\n * @returns the VertexData\n */\n transform(e) {\n const t = e.determinant() < 0;\n return this.positions && re._TransformVector3Coordinates(this.positions, e), this.normals && re._TransformVector3Normals(this.normals, e), this.tangents && re._TransformVector4Normals(this.tangents, e), t && this.indices && re._FlipFaces(this.indices), this;\n }\n /**\n * Generates an array of vertex data where each vertex data only has one material info\n * @returns An array of VertexData\n */\n splitBasedOnMaterialID() {\n if (!this.materialInfos || this.materialInfos.length < 2)\n return [this];\n const e = [];\n for (const t of this.materialInfos) {\n const i = new re();\n if (this.positions && (i.positions = this.positions.slice(t.verticesStart * 3, (t.verticesCount + t.verticesStart) * 3)), this.normals && (i.normals = this.normals.slice(t.verticesStart * 3, (t.verticesCount + t.verticesStart) * 3)), this.tangents && (i.tangents = this.tangents.slice(t.verticesStart * 4, (t.verticesCount + t.verticesStart) * 4)), this.colors && (i.colors = this.colors.slice(t.verticesStart * 4, (t.verticesCount + t.verticesStart) * 4)), this.uvs && (i.uvs = this.uvs.slice(t.verticesStart * 2, (t.verticesCount + t.verticesStart) * 2)), this.uvs2 && (i.uvs2 = this.uvs2.slice(t.verticesStart * 2, (t.verticesCount + t.verticesStart) * 2)), this.uvs3 && (i.uvs3 = this.uvs3.slice(t.verticesStart * 2, (t.verticesCount + t.verticesStart) * 2)), this.uvs4 && (i.uvs4 = this.uvs4.slice(t.verticesStart * 2, (t.verticesCount + t.verticesStart) * 2)), this.uvs5 && (i.uvs5 = this.uvs5.slice(t.verticesStart * 2, (t.verticesCount + t.verticesStart) * 2)), this.uvs6 && (i.uvs6 = this.uvs6.slice(t.verticesStart * 2, (t.verticesCount + t.verticesStart) * 2)), this.matricesIndices && (i.matricesIndices = this.matricesIndices.slice(t.verticesStart * 4, (t.verticesCount + t.verticesStart) * 4)), this.matricesIndicesExtra && (i.matricesIndicesExtra = this.matricesIndicesExtra.slice(t.verticesStart * 4, (t.verticesCount + t.verticesStart) * 4)), this.matricesWeights && (i.matricesWeights = this.matricesWeights.slice(t.verticesStart * 4, (t.verticesCount + t.verticesStart) * 4)), this.matricesWeightsExtra && (i.matricesWeightsExtra = this.matricesWeightsExtra.slice(t.verticesStart * 4, (t.verticesCount + t.verticesStart) * 4)), this.indices) {\n i.indices = [];\n for (let s = t.indexStart; s < t.indexStart + t.indexCount; s++)\n i.indices.push(this.indices[s] - t.verticesStart);\n }\n const r = new Gl();\n r.indexStart = 0, r.indexCount = i.indices ? i.indices.length : 0, r.materialIndex = t.materialIndex, r.verticesStart = 0, r.verticesCount = (i.positions ? i.positions.length : 0) / 3, i.materialInfos = [r], e.push(i);\n }\n return e;\n }\n /**\n * Merges the passed VertexData into the current one\n * @param others the VertexData to be merged into the current one\n * @param use32BitsIndices defines a boolean indicating if indices must be store in a 32 bits array\n * @param forceCloneIndices defines a boolean indicating if indices are forced to be cloned\n * @param mergeMaterialIds defines a boolean indicating if we need to merge the material infos\n * @param enableCompletion defines a boolean indicating if the vertex data should be completed to be compatible\n * @returns the modified VertexData\n */\n merge(e, t = !1, i = !1, r = !1, s = !1) {\n const a = Array.isArray(e) ? e.map((o) => ({ vertexData: o })) : [{ vertexData: e }];\n return sf(this._mergeCoroutine(void 0, a, t, !1, i, r, s));\n }\n /**\n * @internal\n */\n *_mergeCoroutine(e, t, i = !1, r, s, a = !1, o = !1) {\n var d, p;\n this._validate();\n let l = t.map((g) => g.vertexData), c = this;\n if (o)\n for (const g of l)\n g && (g._validate(), !this.normals && g.normals && (this.normals = new Float32Array(this.positions.length)), !this.tangents && g.tangents && (this.tangents = new Float32Array(this.positions.length / 3 * 4)), !this.uvs && g.uvs && (this.uvs = new Float32Array(this.positions.length / 3 * 2)), !this.uvs2 && g.uvs2 && (this.uvs2 = new Float32Array(this.positions.length / 3 * 2)), !this.uvs3 && g.uvs3 && (this.uvs3 = new Float32Array(this.positions.length / 3 * 2)), !this.uvs4 && g.uvs4 && (this.uvs4 = new Float32Array(this.positions.length / 3 * 2)), !this.uvs5 && g.uvs5 && (this.uvs5 = new Float32Array(this.positions.length / 3 * 2)), !this.uvs6 && g.uvs6 && (this.uvs6 = new Float32Array(this.positions.length / 3 * 2)), !this.colors && g.colors && (this.colors = new Float32Array(this.positions.length / 3 * 4), this.colors.fill(1)), !this.matricesIndices && g.matricesIndices && (this.matricesIndices = new Float32Array(this.positions.length / 3 * 4)), !this.matricesWeights && g.matricesWeights && (this.matricesWeights = new Float32Array(this.positions.length / 3 * 4)), !this.matricesIndicesExtra && g.matricesIndicesExtra && (this.matricesIndicesExtra = new Float32Array(this.positions.length / 3 * 4)), !this.matricesWeightsExtra && g.matricesWeightsExtra && (this.matricesWeightsExtra = new Float32Array(this.positions.length / 3 * 4)));\n for (const g of l)\n if (g) {\n if (o)\n this.normals && !g.normals && (g.normals = new Float32Array(g.positions.length)), this.tangents && !g.tangents && (g.tangents = new Float32Array(g.positions.length / 3 * 4)), this.uvs && !g.uvs && (g.uvs = new Float32Array(g.positions.length / 3 * 2)), this.uvs2 && !g.uvs2 && (g.uvs2 = new Float32Array(g.positions.length / 3 * 2)), this.uvs3 && !g.uvs3 && (g.uvs3 = new Float32Array(g.positions.length / 3 * 2)), this.uvs4 && !g.uvs4 && (g.uvs4 = new Float32Array(g.positions.length / 3 * 2)), this.uvs5 && !g.uvs5 && (g.uvs5 = new Float32Array(g.positions.length / 3 * 2)), this.uvs6 && !g.uvs6 && (g.uvs6 = new Float32Array(g.positions.length / 3 * 2)), this.colors && !g.colors && (g.colors = new Float32Array(g.positions.length / 3 * 4), g.colors.fill(1)), this.matricesIndices && !g.matricesIndices && (g.matricesIndices = new Float32Array(g.positions.length / 3 * 4)), this.matricesWeights && !g.matricesWeights && (g.matricesWeights = new Float32Array(g.positions.length / 3 * 4)), this.matricesIndicesExtra && !g.matricesIndicesExtra && (g.matricesIndicesExtra = new Float32Array(g.positions.length / 3 * 4)), this.matricesWeightsExtra && !g.matricesWeightsExtra && (g.matricesWeightsExtra = new Float32Array(g.positions.length / 3 * 4));\n else if (g._validate(), !this.normals != !g.normals || !this.tangents != !g.tangents || !this.uvs != !g.uvs || !this.uvs2 != !g.uvs2 || !this.uvs3 != !g.uvs3 || !this.uvs4 != !g.uvs4 || !this.uvs5 != !g.uvs5 || !this.uvs6 != !g.uvs6 || !this.colors != !g.colors || !this.matricesIndices != !g.matricesIndices || !this.matricesWeights != !g.matricesWeights || !this.matricesIndicesExtra != !g.matricesIndicesExtra || !this.matricesWeightsExtra != !g.matricesWeightsExtra)\n throw new Error(\"Cannot merge vertex data that do not have the same set of attributes\");\n }\n if (a) {\n let g = 0, m = 0, v = 0;\n const E = [];\n let C = null;\n const T = [];\n for (const x of this.splitBasedOnMaterialID())\n T.push({ vertexData: x, transform: e });\n for (const x of t)\n if (x.vertexData)\n for (const S of x.vertexData.splitBasedOnMaterialID())\n T.push({ vertexData: S, transform: x.transform });\n T.sort((x, S) => {\n const M = x.vertexData.materialInfos ? x.vertexData.materialInfos[0].materialIndex : 0, N = S.vertexData.materialInfos ? S.vertexData.materialInfos[0].materialIndex : 0;\n return M > N ? 1 : M === N ? 0 : -1;\n });\n for (const x of T) {\n const S = x.vertexData;\n if (S.materialInfos ? g = S.materialInfos[0].materialIndex : g = 0, C && C.materialIndex === g)\n C.indexCount += S.indices.length, C.verticesCount += S.positions.length / 3;\n else {\n const M = new Gl();\n M.materialIndex = g, M.indexStart = m, M.indexCount = S.indices.length, M.verticesStart = v, M.verticesCount = S.positions.length / 3, E.push(M), C = M;\n }\n m += S.indices.length, v += S.positions.length / 3;\n }\n const R = T.splice(0, 1)[0];\n c = R.vertexData, e = R.transform, l = T.map((x) => x.vertexData), t = T, this.materialInfos = E;\n }\n const h = l.reduce((g, m) => {\n var v;\n return g + (((v = m.indices) == null ? void 0 : v.length) ?? 0);\n }, ((d = c.indices) == null ? void 0 : d.length) ?? 0);\n let f = s || l.some((g) => g.indices === c.indices) ? (p = c.indices) == null ? void 0 : p.slice() : c.indices;\n if (h > 0) {\n let g = (f == null ? void 0 : f.length) ?? 0;\n if (f || (f = new Array(h)), f.length !== h) {\n if (Array.isArray(f))\n f.length = h;\n else {\n const v = i || f instanceof Uint32Array ? new Uint32Array(h) : new Uint16Array(h);\n v.set(f), f = v;\n }\n e && e.determinant() < 0 && re._FlipFaces(f, 0, g);\n }\n let m = c.positions ? c.positions.length / 3 : 0;\n for (const { vertexData: v, transform: E } of t)\n if (v.indices) {\n for (let C = 0; C < v.indices.length; C++)\n f[g + C] = v.indices[C] + m;\n E && E.determinant() < 0 && re._FlipFaces(f, g, v.indices.length), m += v.positions.length / 3, g += v.indices.length, r && (yield);\n }\n }\n return this.indices = f, this.positions = re._MergeElement(I.PositionKind, c.positions, e, t.map((g) => [g.vertexData.positions, g.transform])), r && (yield), c.normals && (this.normals = re._MergeElement(I.NormalKind, c.normals, e, t.map((g) => [g.vertexData.normals, g.transform])), r && (yield)), c.tangents && (this.tangents = re._MergeElement(I.TangentKind, c.tangents, e, t.map((g) => [g.vertexData.tangents, g.transform])), r && (yield)), c.uvs && (this.uvs = re._MergeElement(I.UVKind, c.uvs, e, t.map((g) => [g.vertexData.uvs, g.transform])), r && (yield)), c.uvs2 && (this.uvs2 = re._MergeElement(I.UV2Kind, c.uvs2, e, t.map((g) => [g.vertexData.uvs2, g.transform])), r && (yield)), c.uvs3 && (this.uvs3 = re._MergeElement(I.UV3Kind, c.uvs3, e, t.map((g) => [g.vertexData.uvs3, g.transform])), r && (yield)), c.uvs4 && (this.uvs4 = re._MergeElement(I.UV4Kind, c.uvs4, e, t.map((g) => [g.vertexData.uvs4, g.transform])), r && (yield)), c.uvs5 && (this.uvs5 = re._MergeElement(I.UV5Kind, c.uvs5, e, t.map((g) => [g.vertexData.uvs5, g.transform])), r && (yield)), c.uvs6 && (this.uvs6 = re._MergeElement(I.UV6Kind, c.uvs6, e, t.map((g) => [g.vertexData.uvs6, g.transform])), r && (yield)), c.colors && (this.colors = re._MergeElement(I.ColorKind, c.colors, e, t.map((g) => [g.vertexData.colors, g.transform])), (c.hasVertexAlpha !== void 0 || t.some((g) => g.vertexData.hasVertexAlpha !== void 0)) && (this.hasVertexAlpha = c.hasVertexAlpha || t.some((g) => g.vertexData.hasVertexAlpha)), r && (yield)), c.matricesIndices && (this.matricesIndices = re._MergeElement(I.MatricesIndicesKind, c.matricesIndices, e, t.map((g) => [g.vertexData.matricesIndices, g.transform])), r && (yield)), c.matricesWeights && (this.matricesWeights = re._MergeElement(I.MatricesWeightsKind, c.matricesWeights, e, t.map((g) => [g.vertexData.matricesWeights, g.transform])), r && (yield)), c.matricesIndicesExtra && (this.matricesIndicesExtra = re._MergeElement(I.MatricesIndicesExtraKind, c.matricesIndicesExtra, e, t.map((g) => [g.vertexData.matricesIndicesExtra, g.transform])), r && (yield)), c.matricesWeightsExtra && (this.matricesWeightsExtra = re._MergeElement(I.MatricesWeightsExtraKind, c.matricesWeightsExtra, e, t.map((g) => [g.vertexData.matricesWeightsExtra, g.transform]))), this;\n }\n static _MergeElement(e, t, i, r) {\n const s = r.filter((l) => l[0] !== null && l[0] !== void 0);\n if (!t && s.length == 0)\n return t;\n if (!t)\n return this._MergeElement(e, s[0][0], s[0][1], s.slice(1));\n const a = s.reduce((l, c) => l + c[0].length, t.length), o = e === I.PositionKind ? re._TransformVector3Coordinates : e === I.NormalKind ? re._TransformVector3Normals : e === I.TangentKind ? re._TransformVector4Normals : () => {\n };\n if (t instanceof Float32Array) {\n const l = new Float32Array(a);\n l.set(t), i && o(l, i, 0, t.length);\n let c = t.length;\n for (const [h, u] of s)\n l.set(h, c), u && o(l, u, c, h.length), c += h.length;\n return l;\n } else {\n const l = new Array(a);\n for (let h = 0; h < t.length; h++)\n l[h] = t[h];\n i && o(l, i, 0, t.length);\n let c = t.length;\n for (const [h, u] of s) {\n for (let f = 0; f < h.length; f++)\n l[c + f] = h[f];\n u && o(l, u, c, h.length), c += h.length;\n }\n return l;\n }\n }\n _validate() {\n if (!this.positions)\n throw new Ba(\"Positions are required\", Pc.MeshInvalidPositionsError);\n const e = (r, s) => {\n const a = I.DeduceStride(r);\n if (s.length % a !== 0)\n throw new Error(\"The \" + r + \"s array count must be a multiple of \" + a);\n return s.length / a;\n }, t = e(I.PositionKind, this.positions), i = (r, s) => {\n const a = e(r, s);\n if (a !== t)\n throw new Error(\"The \" + r + \"s element count (\" + a + \") does not match the positions count (\" + t + \")\");\n };\n this.normals && i(I.NormalKind, this.normals), this.tangents && i(I.TangentKind, this.tangents), this.uvs && i(I.UVKind, this.uvs), this.uvs2 && i(I.UV2Kind, this.uvs2), this.uvs3 && i(I.UV3Kind, this.uvs3), this.uvs4 && i(I.UV4Kind, this.uvs4), this.uvs5 && i(I.UV5Kind, this.uvs5), this.uvs6 && i(I.UV6Kind, this.uvs6), this.colors && i(I.ColorKind, this.colors), this.matricesIndices && i(I.MatricesIndicesKind, this.matricesIndices), this.matricesWeights && i(I.MatricesWeightsKind, this.matricesWeights), this.matricesIndicesExtra && i(I.MatricesIndicesExtraKind, this.matricesIndicesExtra), this.matricesWeightsExtra && i(I.MatricesWeightsExtraKind, this.matricesWeightsExtra);\n }\n /**\n * Clone the current vertex data\n * @returns a copy of the current data\n */\n clone() {\n const e = this.serialize();\n return re.Parse(e);\n }\n /**\n * Serializes the VertexData\n * @returns a serialized object\n */\n serialize() {\n const e = {};\n if (this.positions && (e.positions = Array.from(this.positions)), this.normals && (e.normals = Array.from(this.normals)), this.tangents && (e.tangents = Array.from(this.tangents)), this.uvs && (e.uvs = Array.from(this.uvs)), this.uvs2 && (e.uvs2 = Array.from(this.uvs2)), this.uvs3 && (e.uvs3 = Array.from(this.uvs3)), this.uvs4 && (e.uvs4 = Array.from(this.uvs4)), this.uvs5 && (e.uvs5 = Array.from(this.uvs5)), this.uvs6 && (e.uvs6 = Array.from(this.uvs6)), this.colors && (e.colors = Array.from(this.colors), e.hasVertexAlpha = this.hasVertexAlpha), this.matricesIndices && (e.matricesIndices = Array.from(this.matricesIndices), e.matricesIndices._isExpanded = !0), this.matricesWeights && (e.matricesWeights = Array.from(this.matricesWeights)), this.matricesIndicesExtra && (e.matricesIndicesExtra = Array.from(this.matricesIndicesExtra), e.matricesIndicesExtra._isExpanded = !0), this.matricesWeightsExtra && (e.matricesWeightsExtra = Array.from(this.matricesWeightsExtra)), e.indices = Array.from(this.indices), this.materialInfos) {\n e.materialInfos = [];\n for (const t of this.materialInfos) {\n const i = {\n indexStart: t.indexStart,\n indexCount: t.indexCount,\n materialIndex: t.materialIndex,\n verticesStart: t.verticesStart,\n verticesCount: t.verticesCount\n };\n e.materialInfos.push(i);\n }\n }\n return e;\n }\n // Statics\n /**\n * Extracts the vertexData from a mesh\n * @param mesh the mesh from which to extract the VertexData\n * @param copyWhenShared defines if the VertexData must be cloned when shared between multiple meshes, optional, default false\n * @param forceCopy indicating that the VertexData must be cloned, optional, default false\n * @returns the object VertexData associated to the passed mesh\n */\n static ExtractFromMesh(e, t, i) {\n return re._ExtractFrom(e, t, i);\n }\n /**\n * Extracts the vertexData from the geometry\n * @param geometry the geometry from which to extract the VertexData\n * @param copyWhenShared defines if the VertexData must be cloned when the geometry is shared between multiple meshes, optional, default false\n * @param forceCopy indicating that the VertexData must be cloned, optional, default false\n * @returns the object VertexData associated to the passed mesh\n */\n static ExtractFromGeometry(e, t, i) {\n return re._ExtractFrom(e, t, i);\n }\n static _ExtractFrom(e, t, i) {\n const r = new re();\n return e.isVerticesDataPresent(I.PositionKind) && (r.positions = e.getVerticesData(I.PositionKind, t, i)), e.isVerticesDataPresent(I.NormalKind) && (r.normals = e.getVerticesData(I.NormalKind, t, i)), e.isVerticesDataPresent(I.TangentKind) && (r.tangents = e.getVerticesData(I.TangentKind, t, i)), e.isVerticesDataPresent(I.UVKind) && (r.uvs = e.getVerticesData(I.UVKind, t, i)), e.isVerticesDataPresent(I.UV2Kind) && (r.uvs2 = e.getVerticesData(I.UV2Kind, t, i)), e.isVerticesDataPresent(I.UV3Kind) && (r.uvs3 = e.getVerticesData(I.UV3Kind, t, i)), e.isVerticesDataPresent(I.UV4Kind) && (r.uvs4 = e.getVerticesData(I.UV4Kind, t, i)), e.isVerticesDataPresent(I.UV5Kind) && (r.uvs5 = e.getVerticesData(I.UV5Kind, t, i)), e.isVerticesDataPresent(I.UV6Kind) && (r.uvs6 = e.getVerticesData(I.UV6Kind, t, i)), e.isVerticesDataPresent(I.ColorKind) && (r.colors = e.getVerticesData(I.ColorKind, t, i)), e.isVerticesDataPresent(I.MatricesIndicesKind) && (r.matricesIndices = e.getVerticesData(I.MatricesIndicesKind, t, i)), e.isVerticesDataPresent(I.MatricesWeightsKind) && (r.matricesWeights = e.getVerticesData(I.MatricesWeightsKind, t, i)), e.isVerticesDataPresent(I.MatricesIndicesExtraKind) && (r.matricesIndicesExtra = e.getVerticesData(I.MatricesIndicesExtraKind, t, i)), e.isVerticesDataPresent(I.MatricesWeightsExtraKind) && (r.matricesWeightsExtra = e.getVerticesData(I.MatricesWeightsExtraKind, t, i)), r.indices = e.getIndices(t, i), r;\n }\n /**\n * Creates the VertexData for a Ribbon\n * @param options an object used to set the following optional parameters for the ribbon, required but can be empty\n * * pathArray array of paths, each of which an array of successive Vector3\n * * closeArray creates a seam between the first and the last paths of the pathArray, optional, default false\n * * closePath creates a seam between the first and the last points of each path of the path array, optional, default false\n * * offset a positive integer, only used when pathArray contains a single path (offset = 10 means the point 1 is joined to the point 11), default rounded half size of the pathArray length\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * * invertUV swaps in the U and V coordinates when applying a texture, optional, default false\n * * uvs a linear array, of length 2 * number of vertices, of custom UV values, optional\n * * colors a linear array, of length 4 * number of vertices, of custom color values, optional\n * @returns the VertexData of the ribbon\n * @deprecated use CreateRibbonVertexData instead\n */\n static CreateRibbon(e) {\n throw We(\"ribbonBuilder\");\n }\n /**\n * Creates the VertexData for a box\n * @param options an object used to set the following optional parameters for the box, required but can be empty\n * * size sets the width, height and depth of the box to the value of size, optional default 1\n * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size\n * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size\n * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size\n * * faceUV an array of 6 Vector4 elements used to set different images to each box side\n * * faceColors an array of 6 Color3 elements used to set different colors to each box side\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the box\n * @deprecated Please use CreateBoxVertexData from the BoxBuilder file instead\n */\n static CreateBox(e) {\n throw We(\"boxBuilder\");\n }\n /**\n * Creates the VertexData for a tiled box\n * @param options an object used to set the following optional parameters for the box, required but can be empty\n * * faceTiles sets the pattern, tile size and number of tiles for a face\n * * faceUV an array of 6 Vector4 elements used to set different images to each box side\n * * faceColors an array of 6 Color3 elements used to set different colors to each box side\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * @param options.pattern\n * @param options.width\n * @param options.height\n * @param options.depth\n * @param options.tileSize\n * @param options.tileWidth\n * @param options.tileHeight\n * @param options.alignHorizontal\n * @param options.alignVertical\n * @param options.faceUV\n * @param options.faceColors\n * @param options.sideOrientation\n * @returns the VertexData of the box\n * @deprecated Please use CreateTiledBoxVertexData instead\n */\n static CreateTiledBox(e) {\n throw We(\"tiledBoxBuilder\");\n }\n /**\n * Creates the VertexData for a tiled plane\n * @param options an object used to set the following optional parameters for the box, required but can be empty\n * * pattern a limited pattern arrangement depending on the number\n * * tileSize sets the width, height and depth of the tile to the value of size, optional default 1\n * * tileWidth sets the width (x direction) of the tile, overwrites the width set by size, optional, default size\n * * tileHeight sets the height (y direction) of the tile, overwrites the height set by size, optional, default size\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the tiled plane\n * @deprecated use CreateTiledPlaneVertexData instead\n */\n static CreateTiledPlane(e) {\n throw We(\"tiledPlaneBuilder\");\n }\n /**\n * Creates the VertexData for an ellipsoid, defaults to a sphere\n * @param options an object used to set the following optional parameters for the box, required but can be empty\n * * segments sets the number of horizontal strips optional, default 32\n * * diameter sets the axes dimensions, diameterX, diameterY and diameterZ to the value of diameter, optional default 1\n * * diameterX sets the diameterX (x direction) of the ellipsoid, overwrites the diameterX set by diameter, optional, default diameter\n * * diameterY sets the diameterY (y direction) of the ellipsoid, overwrites the diameterY set by diameter, optional, default diameter\n * * diameterZ sets the diameterZ (z direction) of the ellipsoid, overwrites the diameterZ set by diameter, optional, default diameter\n * * arc a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the circumference (latitude) given by the arc value, optional, default 1\n * * slice a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the height (latitude) given by the arc value, optional, default 1\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the ellipsoid\n * @deprecated use CreateSphereVertexData instead\n */\n static CreateSphere(e) {\n throw We(\"sphereBuilder\");\n }\n /**\n * Creates the VertexData for a cylinder, cone or prism\n * @param options an object used to set the following optional parameters for the box, required but can be empty\n * * height sets the height (y direction) of the cylinder, optional, default 2\n * * diameterTop sets the diameter of the top of the cone, overwrites diameter, optional, default diameter\n * * diameterBottom sets the diameter of the bottom of the cone, overwrites diameter, optional, default diameter\n * * diameter sets the diameter of the top and bottom of the cone, optional default 1\n * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24\n * * subdivisions` the number of rings along the cylinder height, optional, default 1\n * * arc a number from 0 to 1, to create an unclosed cylinder based on the fraction of the circumference given by the arc value, optional, default 1\n * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively\n * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively\n * * hasRings when true makes each subdivision independently treated as a face for faceUV and faceColors, optional, default false\n * * enclose when true closes an open cylinder by adding extra flat faces between the height axis and vertical edges, think cut cake\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the cylinder, cone or prism\n * @deprecated please use CreateCylinderVertexData instead\n */\n static CreateCylinder(e) {\n throw We(\"cylinderBuilder\");\n }\n /**\n * Creates the VertexData for a torus\n * @param options an object used to set the following optional parameters for the box, required but can be empty\n * * diameter the diameter of the torus, optional default 1\n * * thickness the diameter of the tube forming the torus, optional default 0.5\n * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the torus\n * @deprecated use CreateTorusVertexData instead\n */\n static CreateTorus(e) {\n throw We(\"torusBuilder\");\n }\n /**\n * Creates the VertexData of the LineSystem\n * @param options an object used to set the following optional parameters for the LineSystem, required but can be empty\n * - lines an array of lines, each line being an array of successive Vector3\n * - colors an array of line colors, each of the line colors being an array of successive Color4, one per line point\n * @returns the VertexData of the LineSystem\n * @deprecated use CreateLineSystemVertexData instead\n */\n static CreateLineSystem(e) {\n throw We(\"linesBuilder\");\n }\n /**\n * Create the VertexData for a DashedLines\n * @param options an object used to set the following optional parameters for the DashedLines, required but can be empty\n * - points an array successive Vector3\n * - dashSize the size of the dashes relative to the dash number, optional, default 3\n * - gapSize the size of the gap between two successive dashes relative to the dash number, optional, default 1\n * - dashNb the intended total number of dashes, optional, default 200\n * @returns the VertexData for the DashedLines\n * @deprecated use CreateDashedLinesVertexData instead\n */\n static CreateDashedLines(e) {\n throw We(\"linesBuilder\");\n }\n /**\n * Creates the VertexData for a Ground\n * @param options an object used to set the following optional parameters for the Ground, required but can be empty\n * - width the width (x direction) of the ground, optional, default 1\n * - height the height (z direction) of the ground, optional, default 1\n * - subdivisions the number of subdivisions per side, optional, default 1\n * @returns the VertexData of the Ground\n * @deprecated Please use CreateGroundVertexData instead\n */\n static CreateGround(e) {\n throw We(\"groundBuilder\");\n }\n /**\n * Creates the VertexData for a TiledGround by subdividing the ground into tiles\n * @param options an object used to set the following optional parameters for the Ground, required but can be empty\n * * xmin the ground minimum X coordinate, optional, default -1\n * * zmin the ground minimum Z coordinate, optional, default -1\n * * xmax the ground maximum X coordinate, optional, default 1\n * * zmax the ground maximum Z coordinate, optional, default 1\n * * subdivisions a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the ground width and height creating 'tiles', default {w: 6, h: 6}\n * * precision a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the tile width and height, default {w: 2, h: 2}\n * @returns the VertexData of the TiledGround\n * @deprecated use CreateTiledGroundVertexData instead\n */\n static CreateTiledGround(e) {\n throw We(\"groundBuilder\");\n }\n /**\n * Creates the VertexData of the Ground designed from a heightmap\n * @param options an object used to set the following parameters for the Ground, required and provided by CreateGroundFromHeightMap\n * * width the width (x direction) of the ground\n * * height the height (z direction) of the ground\n * * subdivisions the number of subdivisions per side\n * * minHeight the minimum altitude on the ground, optional, default 0\n * * maxHeight the maximum altitude on the ground, optional default 1\n * * colorFilter the filter to apply to the image pixel colors to compute the height, optional Color3, default (0.3, 0.59, 0.11)\n * * buffer the array holding the image color data\n * * bufferWidth the width of image\n * * bufferHeight the height of image\n * * alphaFilter Remove any data where the alpha channel is below this value, defaults 0 (all data visible)\n * @returns the VertexData of the Ground designed from a heightmap\n * @deprecated use CreateGroundFromHeightMapVertexData instead\n */\n static CreateGroundFromHeightMap(e) {\n throw We(\"groundBuilder\");\n }\n /**\n * Creates the VertexData for a Plane\n * @param options an object used to set the following optional parameters for the plane, required but can be empty\n * * size sets the width and height of the plane to the value of size, optional default 1\n * * width sets the width (x direction) of the plane, overwrites the width set by size, optional, default size\n * * height sets the height (y direction) of the plane, overwrites the height set by size, optional, default size\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the box\n * @deprecated use CreatePlaneVertexData instead\n */\n static CreatePlane(e) {\n throw We(\"planeBuilder\");\n }\n /**\n * Creates the VertexData of the Disc or regular Polygon\n * @param options an object used to set the following optional parameters for the disc, required but can be empty\n * * radius the radius of the disc, optional default 0.5\n * * tessellation the number of polygon sides, optional, default 64\n * * arc a number from 0 to 1, to create an unclosed polygon based on the fraction of the circumference given by the arc value, optional, default 1\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the box\n * @deprecated use CreateDiscVertexData instead\n */\n static CreateDisc(e) {\n throw We(\"discBuilder\");\n }\n /**\n * Creates the VertexData for an irregular Polygon in the XoZ plane using a mesh built by polygonTriangulation.build()\n * All parameters are provided by CreatePolygon as needed\n * @param polygon a mesh built from polygonTriangulation.build()\n * @param sideOrientation takes the values Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * @param fUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively\n * @param fColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively\n * @param frontUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * @param backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @param wrap a boolean, default false, when true and fUVs used texture is wrapped around all sides, when false texture is applied side\n * @returns the VertexData of the Polygon\n * @deprecated use CreatePolygonVertexData instead\n */\n static CreatePolygon(e, t, i, r, s, a, o) {\n throw We(\"polygonBuilder\");\n }\n /**\n * Creates the VertexData of the IcoSphere\n * @param options an object used to set the following optional parameters for the IcoSphere, required but can be empty\n * * radius the radius of the IcoSphere, optional default 1\n * * radiusX allows stretching in the x direction, optional, default radius\n * * radiusY allows stretching in the y direction, optional, default radius\n * * radiusZ allows stretching in the z direction, optional, default radius\n * * flat when true creates a flat shaded mesh, optional, default true\n * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the IcoSphere\n * @deprecated use CreateIcoSphereVertexData instead\n */\n static CreateIcoSphere(e) {\n throw We(\"icoSphereBuilder\");\n }\n // inspired from // http://stemkoski.github.io/Three.js/Polyhedra.html\n /**\n * Creates the VertexData for a Polyhedron\n * @param options an object used to set the following optional parameters for the polyhedron, required but can be empty\n * * type provided types are:\n * * 0 : Tetrahedron, 1 : Octahedron, 2 : Dodecahedron, 3 : Icosahedron, 4 : Rhombicuboctahedron, 5 : Triangular Prism, 6 : Pentagonal Prism, 7 : Hexagonal Prism, 8 : Square Pyramid (J1)\n * * 9 : Pentagonal Pyramid (J2), 10 : Triangular Dipyramid (J12), 11 : Pentagonal Dipyramid (J13), 12 : Elongated Square Dipyramid (J15), 13 : Elongated Pentagonal Dipyramid (J16), 14 : Elongated Pentagonal Cupola (J20)\n * * size the size of the IcoSphere, optional default 1\n * * sizeX allows stretching in the x direction, optional, default size\n * * sizeY allows stretching in the y direction, optional, default size\n * * sizeZ allows stretching in the z direction, optional, default size\n * * custom a number that overwrites the type to create from an extended set of polyhedron from https://www.babylonjs-playground.com/#21QRSK#15 with minimised editor\n * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively\n * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively\n * * flat when true creates a flat shaded mesh, optional, default true\n * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the Polyhedron\n * @deprecated use CreatePolyhedronVertexData instead\n */\n static CreatePolyhedron(e) {\n throw We(\"polyhedronBuilder\");\n }\n /**\n * Creates the VertexData for a Capsule, inspired from https://github.com/maximeq/three-js-capsule-geometry/blob/master/src/CapsuleBufferGeometry.js\n * @param options an object used to set the following optional parameters for the capsule, required but can be empty\n * @returns the VertexData of the Capsule\n * @deprecated Please use CreateCapsuleVertexData from the capsuleBuilder file instead\n */\n static CreateCapsule(e = {\n orientation: _.Up(),\n subdivisions: 2,\n tessellation: 16,\n height: 1,\n radius: 0.25,\n capSubdivisions: 6\n }) {\n throw We(\"capsuleBuilder\");\n }\n // based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3D/src/away3d/primitives/TorusKnot.as?spec=svn2473&r=2473\n /**\n * Creates the VertexData for a TorusKnot\n * @param options an object used to set the following optional parameters for the TorusKnot, required but can be empty\n * * radius the radius of the torus knot, optional, default 2\n * * tube the thickness of the tube, optional, default 0.5\n * * radialSegments the number of sides on each tube segments, optional, default 32\n * * tubularSegments the number of tubes to decompose the knot into, optional, default 32\n * * p the number of windings around the z axis, optional, default 2\n * * q the number of windings around the x axis, optional, default 3\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the Torus Knot\n * @deprecated use CreateTorusKnotVertexData instead\n */\n static CreateTorusKnot(e) {\n throw We(\"torusKnotBuilder\");\n }\n // Tools\n /**\n * Compute normals for given positions and indices\n * @param positions an array of vertex positions, [...., x, y, z, ......]\n * @param indices an array of indices in groups of three for each triangular facet, [...., i, j, k, ......]\n * @param normals an array of vertex normals, [...., x, y, z, ......]\n * @param options an object used to set the following optional parameters for the TorusKnot, optional\n * * facetNormals : optional array of facet normals (vector3)\n * * facetPositions : optional array of facet positions (vector3)\n * * facetPartitioning : optional partitioning array. facetPositions is required for facetPartitioning computation\n * * ratio : optional partitioning ratio / bounding box, required for facetPartitioning computation\n * * bInfo : optional bounding info, required for facetPartitioning computation\n * * bbSize : optional bounding box size data, required for facetPartitioning computation\n * * subDiv : optional partitioning data about subdivisions on each axis (int), required for facetPartitioning computation\n * * useRightHandedSystem: optional boolean to for right handed system computation\n * * depthSort : optional boolean to enable the facet depth sort computation\n * * distanceTo : optional Vector3 to compute the facet depth from this location\n * * depthSortedFacets : optional array of depthSortedFacets to store the facet distances from the reference location\n */\n static ComputeNormals(e, t, i, r) {\n let s = 0, a = 0, o = 0, l = 0, c = 0, h = 0, u = 0, f = 0, d = 0, p = 0, g = 0, m = 0, v = 0, E = 0, C = 0, T = 0, R = 0, x = 0, S = 0, M = 0, N = !1, F = !1, L = !1, K = !1, q = 1, j = 0, k = null;\n r && (N = !!r.facetNormals, F = !!r.facetPositions, L = !!r.facetPartitioning, q = r.useRightHandedSystem === !0 ? -1 : 1, j = r.ratio || 0, K = !!r.depthSort, k = r.distanceTo, K && k === void 0 && (k = _.Zero()));\n let Q = 0, ce = 0, de = 0, Z = 0;\n for (L && r && r.bbSize && (Q = r.subDiv.X * j / r.bbSize.x, ce = r.subDiv.Y * j / r.bbSize.y, de = r.subDiv.Z * j / r.bbSize.z, Z = r.subDiv.max * r.subDiv.max, r.facetPartitioning.length = 0), s = 0; s < e.length; s++)\n i[s] = 0;\n const J = t.length / 3 | 0;\n for (s = 0; s < J; s++) {\n if (m = t[s * 3] * 3, v = m + 1, E = m + 2, C = t[s * 3 + 1] * 3, T = C + 1, R = C + 2, x = t[s * 3 + 2] * 3, S = x + 1, M = x + 2, a = e[m] - e[C], o = e[v] - e[T], l = e[E] - e[R], c = e[x] - e[C], h = e[S] - e[T], u = e[M] - e[R], f = q * (o * u - l * h), d = q * (l * c - a * u), p = q * (a * h - o * c), g = Math.sqrt(f * f + d * d + p * p), g = g === 0 ? 1 : g, f /= g, d /= g, p /= g, N && r && (r.facetNormals[s].x = f, r.facetNormals[s].y = d, r.facetNormals[s].z = p), F && r && (r.facetPositions[s].x = (e[m] + e[C] + e[x]) / 3, r.facetPositions[s].y = (e[v] + e[T] + e[S]) / 3, r.facetPositions[s].z = (e[E] + e[R] + e[M]) / 3), L && r) {\n const O = Math.floor((r.facetPositions[s].x - r.bInfo.minimum.x * j) * Q), G = Math.floor((r.facetPositions[s].y - r.bInfo.minimum.y * j) * ce), ee = Math.floor((r.facetPositions[s].z - r.bInfo.minimum.z * j) * de), _e = Math.floor((e[m] - r.bInfo.minimum.x * j) * Q), Oe = Math.floor((e[v] - r.bInfo.minimum.y * j) * ce), ze = Math.floor((e[E] - r.bInfo.minimum.z * j) * de), fe = Math.floor((e[C] - r.bInfo.minimum.x * j) * Q), Te = Math.floor((e[T] - r.bInfo.minimum.y * j) * ce), Fe = Math.floor((e[R] - r.bInfo.minimum.z * j) * de), Se = Math.floor((e[x] - r.bInfo.minimum.x * j) * Q), qe = Math.floor((e[S] - r.bInfo.minimum.y * j) * ce), ue = Math.floor((e[M] - r.bInfo.minimum.z * j) * de), Ye = _e + r.subDiv.max * Oe + Z * ze, lt = fe + r.subDiv.max * Te + Z * Fe, Ut = Se + r.subDiv.max * qe + Z * ue, Ct = O + r.subDiv.max * G + Z * ee;\n r.facetPartitioning[Ct] = r.facetPartitioning[Ct] ? r.facetPartitioning[Ct] : new Array(), r.facetPartitioning[Ye] = r.facetPartitioning[Ye] ? r.facetPartitioning[Ye] : new Array(), r.facetPartitioning[lt] = r.facetPartitioning[lt] ? r.facetPartitioning[lt] : new Array(), r.facetPartitioning[Ut] = r.facetPartitioning[Ut] ? r.facetPartitioning[Ut] : new Array(), r.facetPartitioning[Ye].push(s), lt != Ye && r.facetPartitioning[lt].push(s), Ut == lt || Ut == Ye || r.facetPartitioning[Ut].push(s), Ct == Ye || Ct == lt || Ct == Ut || r.facetPartitioning[Ct].push(s);\n }\n if (K && r && r.facetPositions) {\n const O = r.depthSortedFacets[s];\n O.ind = s * 3, O.sqDistance = _.DistanceSquared(r.facetPositions[s], k);\n }\n i[m] += f, i[v] += d, i[E] += p, i[C] += f, i[T] += d, i[R] += p, i[x] += f, i[S] += d, i[M] += p;\n }\n for (s = 0; s < i.length / 3; s++)\n f = i[s * 3], d = i[s * 3 + 1], p = i[s * 3 + 2], g = Math.sqrt(f * f + d * d + p * p), g = g === 0 ? 1 : g, f /= g, d /= g, p /= g, i[s * 3] = f, i[s * 3 + 1] = d, i[s * 3 + 2] = p;\n }\n /**\n * @internal\n */\n static _ComputeSides(e, t, i, r, s, a, o) {\n const l = i.length, c = r.length;\n let h, u;\n switch (e = e || re.DEFAULTSIDE, e) {\n case re.FRONTSIDE:\n break;\n case re.BACKSIDE:\n for (h = 0; h < l; h += 3) {\n const f = i[h];\n i[h] = i[h + 2], i[h + 2] = f;\n }\n for (u = 0; u < c; u++)\n r[u] = -r[u];\n break;\n case re.DOUBLESIDE: {\n const f = t.length, d = f / 3;\n for (let m = 0; m < f; m++)\n t[f + m] = t[m];\n for (h = 0; h < l; h += 3)\n i[h + l] = i[h + 2] + d, i[h + 1 + l] = i[h + 1] + d, i[h + 2 + l] = i[h] + d;\n for (u = 0; u < c; u++)\n r[c + u] = -r[u];\n const p = s.length;\n let g = 0;\n for (g = 0; g < p; g++)\n s[g + p] = s[g];\n for (a = a || new Ke(0, 0, 1, 1), o = o || new Ke(0, 0, 1, 1), g = 0, h = 0; h < p / 2; h++)\n s[g] = a.x + (a.z - a.x) * s[g], s[g + 1] = a.y + (a.w - a.y) * s[g + 1], s[g + p] = o.x + (o.z - o.x) * s[g + p], s[g + p + 1] = o.y + (o.w - o.y) * s[g + p + 1], g += 2;\n break;\n }\n }\n }\n /**\n * Creates a VertexData from serialized data\n * @param parsedVertexData the parsed data from an imported file\n * @returns a VertexData\n */\n static Parse(e) {\n const t = new re(), i = e.positions;\n i && t.set(i, I.PositionKind);\n const r = e.normals;\n r && t.set(r, I.NormalKind);\n const s = e.tangents;\n s && t.set(s, I.TangentKind);\n const a = e.uvs;\n a && t.set(a, I.UVKind);\n const o = e.uvs2;\n o && t.set(o, I.UV2Kind);\n const l = e.uvs3;\n l && t.set(l, I.UV3Kind);\n const c = e.uvs4;\n c && t.set(c, I.UV4Kind);\n const h = e.uvs5;\n h && t.set(h, I.UV5Kind);\n const u = e.uvs6;\n u && t.set(u, I.UV6Kind);\n const f = e.colors;\n f && (t.set(et.CheckColors4(f, i.length / 3), I.ColorKind), e.hasVertexAlpha !== void 0 && (t.hasVertexAlpha = e.hasVertexAlpha));\n const d = e.matricesIndices;\n d && t.set(d, I.MatricesIndicesKind);\n const p = e.matricesWeights;\n p && t.set(p, I.MatricesWeightsKind);\n const g = e.indices;\n g && (t.indices = g);\n const m = e.materialInfos;\n if (m) {\n t.materialInfos = [];\n for (const v of m) {\n const E = new Gl();\n E.indexCount = v.indexCount, E.indexStart = v.indexStart, E.verticesCount = v.verticesCount, E.verticesStart = v.verticesStart, E.materialIndex = v.materialIndex, t.materialInfos.push(E);\n }\n }\n return t;\n }\n /**\n * Applies VertexData created from the imported parameters to the geometry\n * @param parsedVertexData the parsed data from an imported file\n * @param geometry the geometry to apply the VertexData to\n */\n static ImportVertexData(e, t) {\n const i = re.Parse(e);\n t.setAllVerticesData(i, e.updatable);\n }\n}\nre.FRONTSIDE = 0;\nre.BACKSIDE = 1;\nre.DOUBLESIDE = 2;\nre.DEFAULTSIDE = 0;\nre._UniqueIDGenerator = 0;\nP([\n on.filter((...[n]) => !Array.isArray(n))\n], re, \"_TransformVector3Coordinates\", null);\nP([\n on.filter((...[n]) => !Array.isArray(n))\n], re, \"_TransformVector3Normals\", null);\nP([\n on.filter((...[n]) => !Array.isArray(n))\n], re, \"_TransformVector4Normals\", null);\nP([\n on.filter((...[n]) => !Array.isArray(n))\n], re, \"_FlipFaces\", null);\nclass Gy {\n constructor() {\n this._doNotSerialize = !1, this._isDisposed = !1, this._sceneRootNodesIndex = -1, this._isEnabled = !0, this._isParentEnabled = !0, this._isReady = !0, this._onEnabledStateChangedObservable = new he(), this._onClonedObservable = new he();\n }\n}\nlet Ai = class vu {\n /**\n * Add a new node constructor\n * @param type defines the type name of the node to construct\n * @param constructorFunc defines the constructor function\n */\n static AddNodeConstructor(e, t) {\n this._NodeConstructors[e] = t;\n }\n /**\n * Returns a node constructor based on type name\n * @param type defines the type name\n * @param name defines the new node name\n * @param scene defines the hosting scene\n * @param options defines optional options to transmit to constructors\n * @returns the new constructor or null\n */\n static Construct(e, t, i, r) {\n const s = this._NodeConstructors[e];\n return s ? s(t, i, r) : null;\n }\n /**\n * Gets or sets the accessibility tag to describe the node for accessibility purpose.\n */\n set accessibilityTag(e) {\n this._accessibilityTag = e, this.onAccessibilityTagChangedObservable.notifyObservers(e);\n }\n get accessibilityTag() {\n return this._accessibilityTag;\n }\n /**\n * Gets or sets a boolean used to define if the node must be serialized\n */\n get doNotSerialize() {\n return this._nodeDataStorage._doNotSerialize ? !0 : this._parentNode ? this._parentNode.doNotSerialize : !1;\n }\n set doNotSerialize(e) {\n this._nodeDataStorage._doNotSerialize = e;\n }\n /**\n * Gets a boolean indicating if the node has been disposed\n * @returns true if the node was disposed\n */\n isDisposed() {\n return this._nodeDataStorage._isDisposed;\n }\n /**\n * Gets or sets the parent of the node (without keeping the current position in the scene)\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/parent\n */\n set parent(e) {\n if (this._parentNode === e)\n return;\n const t = this._parentNode;\n if (this._parentNode && this._parentNode._children !== void 0 && this._parentNode._children !== null) {\n const i = this._parentNode._children.indexOf(this);\n i !== -1 && this._parentNode._children.splice(i, 1), !e && !this._nodeDataStorage._isDisposed && this._addToSceneRootNodes();\n }\n this._parentNode = e, this._isDirty = !0, this._parentNode && ((this._parentNode._children === void 0 || this._parentNode._children === null) && (this._parentNode._children = new Array()), this._parentNode._children.push(this), t || this._removeFromSceneRootNodes()), this._syncParentEnabledState();\n }\n get parent() {\n return this._parentNode;\n }\n /**\n * @internal\n */\n _serializeAsParent(e) {\n e.parentId = this.uniqueId;\n }\n /** @internal */\n _addToSceneRootNodes() {\n this._nodeDataStorage._sceneRootNodesIndex === -1 && (this._nodeDataStorage._sceneRootNodesIndex = this._scene.rootNodes.length, this._scene.rootNodes.push(this));\n }\n /** @internal */\n _removeFromSceneRootNodes() {\n if (this._nodeDataStorage._sceneRootNodesIndex !== -1) {\n const e = this._scene.rootNodes, t = e.length - 1;\n e[this._nodeDataStorage._sceneRootNodesIndex] = e[t], e[this._nodeDataStorage._sceneRootNodesIndex]._nodeDataStorage._sceneRootNodesIndex = this._nodeDataStorage._sceneRootNodesIndex, this._scene.rootNodes.pop(), this._nodeDataStorage._sceneRootNodesIndex = -1;\n }\n }\n /**\n * Gets or sets the animation properties override\n */\n get animationPropertiesOverride() {\n return this._animationPropertiesOverride ? this._animationPropertiesOverride : this._scene.animationPropertiesOverride;\n }\n set animationPropertiesOverride(e) {\n this._animationPropertiesOverride = e;\n }\n /**\n * Gets a string identifying the name of the class\n * @returns \"Node\" string\n */\n getClassName() {\n return \"Node\";\n }\n /**\n * Sets a callback that will be raised when the node will be disposed\n */\n set onDispose(e) {\n this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e);\n }\n /**\n * An event triggered when the enabled state of the node changes\n */\n get onEnabledStateChangedObservable() {\n return this._nodeDataStorage._onEnabledStateChangedObservable;\n }\n /**\n * An event triggered when the node is cloned\n */\n get onClonedObservable() {\n return this._nodeDataStorage._onClonedObservable;\n }\n /**\n * Creates a new Node\n * @param name the name and id to be given to this node\n * @param scene the scene this node will be added to\n */\n constructor(e, t = null) {\n this._isDirty = !1, this._nodeDataStorage = new Gy(), this.state = \"\", this.metadata = null, this.reservedDataStore = null, this._accessibilityTag = null, this.onAccessibilityTagChangedObservable = new he(), this._parentContainer = null, this.animations = [], this._ranges = {}, this.onReady = null, this._currentRenderId = -1, this._parentUpdateId = -1, this._childUpdateId = -1, this._waitingParentId = null, this._waitingParentInstanceIndex = null, this._waitingParsedUniqueId = null, this._cache = {}, this._parentNode = null, this._children = null, this._worldMatrix = w.Identity(), this._worldMatrixDeterminant = 0, this._worldMatrixDeterminantIsDirty = !0, this._animationPropertiesOverride = null, this._isNode = !0, this.onDisposeObservable = new he(), this._onDisposeObserver = null, this._behaviors = new Array(), this.name = e, this.id = e, this._scene = t || st.LastCreatedScene, this.uniqueId = this._scene.getUniqueId(), this._initCache();\n }\n /**\n * Gets the scene of the node\n * @returns a scene\n */\n getScene() {\n return this._scene;\n }\n /**\n * Gets the engine of the node\n * @returns a Engine\n */\n getEngine() {\n return this._scene.getEngine();\n }\n /**\n * Attach a behavior to the node\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\n * @param behavior defines the behavior to attach\n * @param attachImmediately defines that the behavior must be attached even if the scene is still loading\n * @returns the current Node\n */\n addBehavior(e, t = !1) {\n return this._behaviors.indexOf(e) !== -1 ? this : (e.init(), this._scene.isLoading && !t ? this._scene.onDataLoadedObservable.addOnce(() => {\n e.attach(this);\n }) : e.attach(this), this._behaviors.push(e), this);\n }\n /**\n * Remove an attached behavior\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\n * @param behavior defines the behavior to attach\n * @returns the current Node\n */\n removeBehavior(e) {\n const t = this._behaviors.indexOf(e);\n return t === -1 ? this : (this._behaviors[t].detach(), this._behaviors.splice(t, 1), this);\n }\n /**\n * Gets the list of attached behaviors\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\n */\n get behaviors() {\n return this._behaviors;\n }\n /**\n * Gets an attached behavior by name\n * @param name defines the name of the behavior to look for\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\n * @returns null if behavior was not found else the requested behavior\n */\n getBehaviorByName(e) {\n for (const t of this._behaviors)\n if (t.name === e)\n return t;\n return null;\n }\n /**\n * Returns the latest update of the World matrix\n * @returns a Matrix\n */\n getWorldMatrix() {\n return this._currentRenderId !== this._scene.getRenderId() && this.computeWorldMatrix(), this._worldMatrix;\n }\n /** @internal */\n _getWorldMatrixDeterminant() {\n return this._worldMatrixDeterminantIsDirty && (this._worldMatrixDeterminantIsDirty = !1, this._worldMatrixDeterminant = this._worldMatrix.determinant()), this._worldMatrixDeterminant;\n }\n /**\n * Returns directly the latest state of the mesh World matrix.\n * A Matrix is returned.\n */\n get worldMatrixFromCache() {\n return this._worldMatrix;\n }\n // override it in derived class if you add new variables to the cache\n // and call the parent class method\n /** @internal */\n _initCache() {\n this._cache = {};\n }\n /**\n * @internal\n */\n updateCache(e) {\n !e && this.isSynchronized() || this._updateCache();\n }\n /**\n * @internal\n */\n _getActionManagerForTrigger(e, t = !0) {\n return this.parent ? this.parent._getActionManagerForTrigger(e, !1) : null;\n }\n // override it in derived class if you add new variables to the cache\n // and call the parent class method if !ignoreParentClass\n /**\n * @internal\n */\n _updateCache(e) {\n }\n // override it in derived class if you add new variables to the cache\n /** @internal */\n _isSynchronized() {\n return !0;\n }\n /** @internal */\n _markSyncedWithParent() {\n this._parentNode && (this._parentUpdateId = this._parentNode._childUpdateId);\n }\n /** @internal */\n isSynchronizedWithParent() {\n return this._parentNode ? this._parentNode._isDirty || this._parentUpdateId !== this._parentNode._childUpdateId ? !1 : this._parentNode.isSynchronized() : !0;\n }\n /** @internal */\n isSynchronized() {\n return this._parentNode && !this.isSynchronizedWithParent() ? !1 : this._isSynchronized();\n }\n /**\n * Is this node ready to be used/rendered\n * @param _completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\n * @returns true if the node is ready\n */\n isReady(e = !1) {\n return this._nodeDataStorage._isReady;\n }\n /**\n * Flag the node as dirty (Forcing it to update everything)\n * @param _property helps children apply precise \"dirtyfication\"\n * @returns this node\n */\n markAsDirty(e) {\n return this._currentRenderId = Number.MAX_VALUE, this._isDirty = !0, this;\n }\n /**\n * Is this node enabled?\n * If the node has a parent, all ancestors will be checked and false will be returned if any are false (not enabled), otherwise will return true\n * @param checkAncestors indicates if this method should check the ancestors. The default is to check the ancestors. If set to false, the method will return the value of this node without checking ancestors\n * @returns whether this node (and its parent) is enabled\n */\n isEnabled(e = !0) {\n return e === !1 ? this._nodeDataStorage._isEnabled : this._nodeDataStorage._isEnabled ? this._nodeDataStorage._isParentEnabled : !1;\n }\n /** @internal */\n _syncParentEnabledState() {\n this._nodeDataStorage._isParentEnabled = this._parentNode ? this._parentNode.isEnabled() : !0, this._children && this._children.forEach((e) => {\n e._syncParentEnabledState();\n });\n }\n /**\n * Set the enabled state of this node\n * @param value defines the new enabled state\n */\n setEnabled(e) {\n this._nodeDataStorage._isEnabled !== e && (this._nodeDataStorage._isEnabled = e, this._syncParentEnabledState(), this._nodeDataStorage._onEnabledStateChangedObservable.notifyObservers(e));\n }\n /**\n * Is this node a descendant of the given node?\n * The function will iterate up the hierarchy until the ancestor was found or no more parents defined\n * @param ancestor defines the parent node to inspect\n * @returns a boolean indicating if this node is a descendant of the given node\n */\n isDescendantOf(e) {\n return this.parent ? this.parent === e ? !0 : this.parent.isDescendantOf(e) : !1;\n }\n /**\n * @internal\n */\n _getDescendants(e, t = !1, i) {\n if (this._children)\n for (let r = 0; r < this._children.length; r++) {\n const s = this._children[r];\n (!i || i(s)) && e.push(s), t || s._getDescendants(e, !1, i);\n }\n }\n /**\n * Will return all nodes that have this node as ascendant\n * @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\n * @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\n * @returns all children nodes of all types\n */\n getDescendants(e, t) {\n const i = [];\n return this._getDescendants(i, e, t), i;\n }\n /**\n * Get all child-meshes of this node\n * @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 (Default: false)\n * @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\n * @returns an array of AbstractMesh\n */\n getChildMeshes(e, t) {\n const i = [];\n return this._getDescendants(i, e, (r) => (!t || t(r)) && r.cullingStrategy !== void 0), i;\n }\n /**\n * Get all direct children of this node\n * @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\n * @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 (Default: true)\n * @returns an array of Node\n */\n getChildren(e, t = !0) {\n return this.getDescendants(t, e);\n }\n /**\n * @internal\n */\n _setReady(e) {\n if (e !== this._nodeDataStorage._isReady) {\n if (!e) {\n this._nodeDataStorage._isReady = !1;\n return;\n }\n this.onReady && this.onReady(this), this._nodeDataStorage._isReady = !0;\n }\n }\n /**\n * Get an animation by name\n * @param name defines the name of the animation to look for\n * @returns null if not found else the requested animation\n */\n getAnimationByName(e) {\n for (let t = 0; t < this.animations.length; t++) {\n const i = this.animations[t];\n if (i.name === e)\n return i;\n }\n return null;\n }\n /**\n * Creates an animation range for this node\n * @param name defines the name of the range\n * @param from defines the starting key\n * @param to defines the end key\n */\n createAnimationRange(e, t, i) {\n if (!this._ranges[e]) {\n this._ranges[e] = vu._AnimationRangeFactory(e, t, i);\n for (let r = 0, s = this.animations.length; r < s; r++)\n this.animations[r] && this.animations[r].createRange(e, t, i);\n }\n }\n /**\n * Delete a specific animation range\n * @param name defines the name of the range to delete\n * @param deleteFrames defines if animation frames from the range must be deleted as well\n */\n deleteAnimationRange(e, t = !0) {\n for (let i = 0, r = this.animations.length; i < r; i++)\n this.animations[i] && this.animations[i].deleteRange(e, t);\n this._ranges[e] = null;\n }\n /**\n * Get an animation range by name\n * @param name defines the name of the animation range to look for\n * @returns null if not found else the requested animation range\n */\n getAnimationRange(e) {\n return this._ranges[e] || null;\n }\n /**\n * Clone the current node\n * @param name Name of the new clone\n * @param newParent New parent for the clone\n * @param doNotCloneChildren Do not clone children hierarchy\n * @returns the new transform node\n */\n clone(e, t, i) {\n const r = Le.Clone(() => new vu(e, this.getScene()), this);\n if (t && (r.parent = t), !i) {\n const s = this.getDescendants(!0);\n for (let a = 0; a < s.length; a++) {\n const o = s[a];\n o.clone(e + \".\" + o.name, r);\n }\n }\n return r;\n }\n /**\n * Gets the list of all animation ranges defined on this node\n * @returns an array\n */\n getAnimationRanges() {\n const e = [];\n let t;\n for (t in this._ranges)\n e.push(this._ranges[t]);\n return e;\n }\n /**\n * Will start the animation sequence\n * @param name defines the range frames for animation sequence\n * @param loop defines if the animation should loop (false by default)\n * @param speedRatio defines the speed factor in which to run the animation (1 by default)\n * @param onAnimationEnd defines a function to be executed when the animation ended (undefined by default)\n * @returns the object created for this animation. If range does not exist, it will return null\n */\n beginAnimation(e, t, i, r) {\n const s = this.getAnimationRange(e);\n return s ? this._scene.beginAnimation(this, s.from, s.to, t, i, r) : null;\n }\n /**\n * Serialize animation ranges into a JSON compatible object\n * @returns serialization object\n */\n serializeAnimationRanges() {\n const e = [];\n for (const t in this._ranges) {\n const i = this._ranges[t];\n if (!i)\n continue;\n const r = {};\n r.name = t, r.from = i.from, r.to = i.to, e.push(r);\n }\n return e;\n }\n /**\n * Computes the world matrix of the node\n * @param _force defines if the cache version should be invalidated forcing the world matrix to be created from scratch\n * @returns the world matrix\n */\n computeWorldMatrix(e) {\n return this._worldMatrix || (this._worldMatrix = w.Identity()), this._worldMatrix;\n }\n /**\n * Releases resources associated with this node.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n if (this._nodeDataStorage._isDisposed = !0, !e) {\n const i = this.getDescendants(!0);\n for (const r of i)\n r.dispose(e, t);\n }\n this.parent ? this.parent = null : this._removeFromSceneRootNodes(), this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear(), this.onEnabledStateChangedObservable.clear(), this.onClonedObservable.clear();\n for (const i of this._behaviors)\n i.detach();\n this._behaviors.length = 0, this.metadata = null;\n }\n /**\n * Parse animation range data from a serialization object and store them into a given node\n * @param node defines where to store the animation ranges\n * @param parsedNode defines the serialization object to read data from\n * @param _scene defines the hosting scene\n */\n static ParseAnimationRanges(e, t, i) {\n if (t.ranges)\n for (let r = 0; r < t.ranges.length; r++) {\n const s = t.ranges[r];\n e.createAnimationRange(s.name, s.from, s.to);\n }\n }\n /**\n * Return the minimum and maximum world vectors of the entire hierarchy under current node\n * @param includeDescendants Include bounding info from descendants as well (true by default)\n * @param predicate defines a callback function that can be customize to filter what meshes should be included in the list used to compute the bounding vectors\n * @returns the new bounding vectors\n */\n getHierarchyBoundingVectors(e = !0, t = null) {\n this.getScene().incrementRenderId(), this.computeWorldMatrix(!0);\n let i, r;\n const s = this;\n if (s.getBoundingInfo && s.subMeshes) {\n const a = s.getBoundingInfo();\n i = a.boundingBox.minimumWorld.clone(), r = a.boundingBox.maximumWorld.clone();\n } else\n i = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), r = new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n if (e) {\n const a = this.getDescendants(!1);\n for (const o of a) {\n const l = o;\n if (l.computeWorldMatrix(!0), t && !t(l) || !l.getBoundingInfo || l.getTotalVertices() === 0)\n continue;\n const h = l.getBoundingInfo().boundingBox, u = h.minimumWorld, f = h.maximumWorld;\n _.CheckExtends(u, i, r), _.CheckExtends(f, i, r);\n }\n }\n return {\n min: i,\n max: r\n };\n }\n};\nAi._AnimationRangeFactory = (n, e, t) => {\n throw We(\"AnimationRange\");\n};\nAi._NodeConstructors = {};\nP([\n U()\n], Ai.prototype, \"name\", void 0);\nP([\n U()\n], Ai.prototype, \"id\", void 0);\nP([\n U()\n], Ai.prototype, \"uniqueId\", void 0);\nP([\n U()\n], Ai.prototype, \"state\", void 0);\nP([\n U()\n], Ai.prototype, \"metadata\", void 0);\nvar ut;\n(function(n) {\n n[n.LOCAL = 0] = \"LOCAL\", n[n.WORLD = 1] = \"WORLD\", n[n.BONE = 2] = \"BONE\";\n})(ut || (ut = {}));\nclass Ko {\n}\nKo.X = new _(1, 0, 0);\nKo.Y = new _(0, 1, 0);\nKo.Z = new _(0, 0, 1);\nvar cg;\n(function(n) {\n n[n.X = 0] = \"X\", n[n.Y = 1] = \"Y\", n[n.Z = 2] = \"Z\";\n})(cg || (cg = {}));\nconst Xy = w.Compose(_.One(), Ce.FromEulerAngles(0, Math.PI, 0), _.Zero());\nclass He extends Ai {\n /**\n * Gets or sets the billboard mode. Default is 0.\n *\n * | Value | Type | Description |\n * | --- | --- | --- |\n * | 0 | BILLBOARDMODE_NONE | |\n * | 1 | BILLBOARDMODE_X | |\n * | 2 | BILLBOARDMODE_Y | |\n * | 4 | BILLBOARDMODE_Z | |\n * | 7 | BILLBOARDMODE_ALL | |\n *\n */\n get billboardMode() {\n return this._billboardMode;\n }\n set billboardMode(e) {\n this._billboardMode !== e && (this._billboardMode = e, this._cache.useBillboardPosition = (this._billboardMode & He.BILLBOARDMODE_USE_POSITION) !== 0, this._computeUseBillboardPath());\n }\n /**\n * Gets or sets a boolean indicating that parent rotation should be preserved when using billboards.\n * This could be useful for glTF objects where parent rotation helps converting from right handed to left handed\n */\n get preserveParentRotationForBillboard() {\n return this._preserveParentRotationForBillboard;\n }\n set preserveParentRotationForBillboard(e) {\n e !== this._preserveParentRotationForBillboard && (this._preserveParentRotationForBillboard = e, this._computeUseBillboardPath());\n }\n _computeUseBillboardPath() {\n this._cache.useBillboardPath = this._billboardMode !== He.BILLBOARDMODE_NONE && !this.preserveParentRotationForBillboard;\n }\n /**\n * Gets or sets the distance of the object to max, often used by skybox\n */\n get infiniteDistance() {\n return this._infiniteDistance;\n }\n set infiniteDistance(e) {\n this._infiniteDistance !== e && (this._infiniteDistance = e);\n }\n constructor(e, t = null, i = !0) {\n super(e, t), this._forward = new _(0, 0, 1), this._up = new _(0, 1, 0), this._right = new _(1, 0, 0), this._position = _.Zero(), this._rotation = _.Zero(), this._rotationQuaternion = null, this._scaling = _.One(), this._transformToBoneReferal = null, this._isAbsoluteSynced = !1, this._billboardMode = He.BILLBOARDMODE_NONE, this._preserveParentRotationForBillboard = !1, this.scalingDeterminant = 1, this._infiniteDistance = !1, this.ignoreNonUniformScaling = !1, this.reIntegrateRotationIntoRotationQuaternion = !1, this._poseMatrix = null, this._localMatrix = w.Zero(), this._usePivotMatrix = !1, this._absolutePosition = _.Zero(), this._absoluteScaling = _.Zero(), this._absoluteRotationQuaternion = Ce.Identity(), this._pivotMatrix = w.Identity(), this._postMultiplyPivotMatrix = !1, this._isWorldMatrixFrozen = !1, this._indexInSceneTransformNodesArray = -1, this.onAfterWorldMatrixUpdateObservable = new he(), this._nonUniformScaling = !1, i && this.getScene().addTransformNode(this);\n }\n /**\n * Gets a string identifying the name of the class\n * @returns \"TransformNode\" string\n */\n getClassName() {\n return \"TransformNode\";\n }\n /**\n * Gets or set the node position (default is (0.0, 0.0, 0.0))\n */\n get position() {\n return this._position;\n }\n set position(e) {\n this._position = e, this._isDirty = !0;\n }\n /**\n * return true if a pivot has been set\n * @returns true if a pivot matrix is used\n */\n isUsingPivotMatrix() {\n return this._usePivotMatrix;\n }\n /**\n * @returns true if pivot matrix must be cancelled in the world matrix. When this parameter is set to true (default), the inverse of the pivot matrix is also applied at the end to cancel the transformation effect.\n */\n isUsingPostMultiplyPivotMatrix() {\n return this._postMultiplyPivotMatrix;\n }\n /**\n * Gets or sets the rotation property : a Vector3 defining the rotation value in radians around each local axis X, Y, Z (default is (0.0, 0.0, 0.0)).\n * If rotation quaternion is set, this Vector3 will be ignored and copy from the quaternion\n */\n get rotation() {\n return this._rotation;\n }\n set rotation(e) {\n this._rotation = e, this._rotationQuaternion = null, this._isDirty = !0;\n }\n /**\n * Gets or sets the scaling property : a Vector3 defining the node scaling along each local axis X, Y, Z (default is (1.0, 1.0, 1.0)).\n */\n get scaling() {\n return this._scaling;\n }\n set scaling(e) {\n this._scaling = e, this._isDirty = !0;\n }\n /**\n * Gets or sets the rotation Quaternion property : this a Quaternion object defining the node rotation by using a unit quaternion (undefined by default, but can be null).\n * If set, only the rotationQuaternion is then used to compute the node rotation (ie. node.rotation will be ignored)\n */\n get rotationQuaternion() {\n return this._rotationQuaternion;\n }\n set rotationQuaternion(e) {\n this._rotationQuaternion = e, e && this._rotation.setAll(0), this._isDirty = !0;\n }\n /**\n * The forward direction of that transform in world space.\n */\n get forward() {\n return _.TransformNormalFromFloatsToRef(0, 0, this.getScene().useRightHandedSystem ? -1 : 1, this.getWorldMatrix(), this._forward), this._forward.normalize();\n }\n /**\n * The up direction of that transform in world space.\n */\n get up() {\n return _.TransformNormalFromFloatsToRef(0, 1, 0, this.getWorldMatrix(), this._up), this._up.normalize();\n }\n /**\n * The right direction of that transform in world space.\n */\n get right() {\n return _.TransformNormalFromFloatsToRef(this.getScene().useRightHandedSystem ? -1 : 1, 0, 0, this.getWorldMatrix(), this._right), this._right.normalize();\n }\n /**\n * Copies the parameter passed Matrix into the mesh Pose matrix.\n * @param matrix the matrix to copy the pose from\n * @returns this TransformNode.\n */\n updatePoseMatrix(e) {\n return this._poseMatrix ? (this._poseMatrix.copyFrom(e), this) : (this._poseMatrix = e.clone(), this);\n }\n /**\n * Returns the mesh Pose matrix.\n * @returns the pose matrix\n */\n getPoseMatrix() {\n return this._poseMatrix || (this._poseMatrix = w.Identity()), this._poseMatrix;\n }\n /** @internal */\n _isSynchronized() {\n const e = this._cache;\n return !(this._billboardMode !== e.billboardMode || this._billboardMode !== He.BILLBOARDMODE_NONE || e.pivotMatrixUpdated || this._infiniteDistance || this._position._isDirty || this._scaling._isDirty || this._rotationQuaternion && this._rotationQuaternion._isDirty || this._rotation._isDirty);\n }\n /** @internal */\n _initCache() {\n super._initCache();\n const e = this._cache;\n e.localMatrixUpdated = !1, e.billboardMode = -1, e.infiniteDistance = !1, e.useBillboardPosition = !1, e.useBillboardPath = !1;\n }\n /**\n * Returns the current mesh absolute position.\n * Returns a Vector3.\n */\n get absolutePosition() {\n return this.getAbsolutePosition();\n }\n /**\n * Returns the current mesh absolute scaling.\n * Returns a Vector3.\n */\n get absoluteScaling() {\n return this._syncAbsoluteScalingAndRotation(), this._absoluteScaling;\n }\n /**\n * Returns the current mesh absolute rotation.\n * Returns a Quaternion.\n */\n get absoluteRotationQuaternion() {\n return this._syncAbsoluteScalingAndRotation(), this._absoluteRotationQuaternion;\n }\n /**\n * Sets a new matrix to apply before all other transformation\n * @param matrix defines the transform matrix\n * @returns the current TransformNode\n */\n setPreTransformMatrix(e) {\n return this.setPivotMatrix(e, !1);\n }\n /**\n * Sets a new pivot matrix to the current node\n * @param matrix defines the new pivot matrix to use\n * @param postMultiplyPivotMatrix defines if the pivot matrix must be cancelled in the world matrix. When this parameter is set to true (default), the inverse of the pivot matrix is also applied at the end to cancel the transformation effect\n * @returns the current TransformNode\n */\n setPivotMatrix(e, t = !0) {\n return this._pivotMatrix.copyFrom(e), this._usePivotMatrix = !this._pivotMatrix.isIdentity(), this._cache.pivotMatrixUpdated = !0, this._postMultiplyPivotMatrix = t, this._postMultiplyPivotMatrix && (this._pivotMatrixInverse ? this._pivotMatrix.invertToRef(this._pivotMatrixInverse) : this._pivotMatrixInverse = w.Invert(this._pivotMatrix)), this;\n }\n /**\n * Returns the mesh pivot matrix.\n * Default : Identity.\n * @returns the matrix\n */\n getPivotMatrix() {\n return this._pivotMatrix;\n }\n /**\n * Instantiate (when possible) or clone that node with its hierarchy\n * @param newParent defines the new parent to use for the instance (or clone)\n * @param options defines options to configure how copy is done\n * @param options.doNotInstantiate defines if the model must be instantiated or just cloned\n * @param onNewNodeCreated defines an option callback to call when a clone or an instance is created\n * @returns an instance (or a clone) of the current node with its hierarchy\n */\n instantiateHierarchy(e = null, t, i) {\n const r = this.clone(\"Clone of \" + (this.name || this.id), e || this.parent, !0);\n r && i && i(this, r);\n for (const s of this.getChildTransformNodes(!0))\n s.instantiateHierarchy(r, t, i);\n return r;\n }\n /**\n * Prevents the World matrix to be computed any longer\n * @param newWorldMatrix defines an optional matrix to use as world matrix\n * @param decompose defines whether to decompose the given newWorldMatrix or directly assign\n * @returns the TransformNode.\n */\n freezeWorldMatrix(e = null, t = !1) {\n return e ? t ? (this._rotation.setAll(0), this._rotationQuaternion = this._rotationQuaternion || Ce.Identity(), e.decompose(this._scaling, this._rotationQuaternion, this._position), this.computeWorldMatrix(!0)) : (this._worldMatrix = e, this._absolutePosition.copyFromFloats(this._worldMatrix.m[12], this._worldMatrix.m[13], this._worldMatrix.m[14]), this._afterComputeWorldMatrix()) : (this._isWorldMatrixFrozen = !1, this.computeWorldMatrix(!0)), this._isDirty = !1, this._isWorldMatrixFrozen = !0, this;\n }\n /**\n * Allows back the World matrix computation.\n * @returns the TransformNode.\n */\n unfreezeWorldMatrix() {\n return this._isWorldMatrixFrozen = !1, this.computeWorldMatrix(!0), this;\n }\n /**\n * True if the World matrix has been frozen.\n */\n get isWorldMatrixFrozen() {\n return this._isWorldMatrixFrozen;\n }\n /**\n * Returns the mesh absolute position in the World.\n * @returns a Vector3.\n */\n getAbsolutePosition() {\n return this.computeWorldMatrix(), this._absolutePosition;\n }\n /**\n * Sets the mesh absolute position in the World from a Vector3 or an Array(3).\n * @param absolutePosition the absolute position to set\n * @returns the TransformNode.\n */\n setAbsolutePosition(e) {\n if (!e)\n return this;\n let t, i, r;\n if (e.x === void 0) {\n if (arguments.length < 3)\n return this;\n t = arguments[0], i = arguments[1], r = arguments[2];\n } else\n t = e.x, i = e.y, r = e.z;\n if (this.parent) {\n const s = z.Matrix[0];\n this.parent.getWorldMatrix().invertToRef(s), _.TransformCoordinatesFromFloatsToRef(t, i, r, s, this.position);\n } else\n this.position.x = t, this.position.y = i, this.position.z = r;\n return this._absolutePosition.copyFrom(e), this;\n }\n /**\n * Sets the mesh position in its local space.\n * @param vector3 the position to set in localspace\n * @returns the TransformNode.\n */\n setPositionWithLocalVector(e) {\n return this.computeWorldMatrix(), this.position = _.TransformNormal(e, this._localMatrix), this;\n }\n /**\n * Returns the mesh position in the local space from the current World matrix values.\n * @returns a new Vector3.\n */\n getPositionExpressedInLocalSpace() {\n this.computeWorldMatrix();\n const e = z.Matrix[0];\n return this._localMatrix.invertToRef(e), _.TransformNormal(this.position, e);\n }\n /**\n * Translates the mesh along the passed Vector3 in its local space.\n * @param vector3 the distance to translate in localspace\n * @returns the TransformNode.\n */\n locallyTranslate(e) {\n return this.computeWorldMatrix(!0), this.position = _.TransformCoordinates(e, this._localMatrix), this;\n }\n /**\n * Orients a mesh towards a target point. Mesh must be drawn facing user.\n * @param targetPoint the position (must be in same space as current mesh) to look at\n * @param yawCor optional yaw (y-axis) correction in radians\n * @param pitchCor optional pitch (x-axis) correction in radians\n * @param rollCor optional roll (z-axis) correction in radians\n * @param space the chosen space of the target\n * @returns the TransformNode.\n */\n lookAt(e, t = 0, i = 0, r = 0, s = ut.LOCAL) {\n const a = He._LookAtVectorCache, o = s === ut.LOCAL ? this.position : this.getAbsolutePosition();\n if (e.subtractToRef(o, a), this.setDirection(a, t, i, r), s === ut.WORLD && this.parent)\n if (this.rotationQuaternion) {\n const l = z.Matrix[0];\n this.rotationQuaternion.toRotationMatrix(l);\n const c = z.Matrix[1];\n this.parent.getWorldMatrix().getRotationMatrixToRef(c), c.invert(), l.multiplyToRef(c, l), this.rotationQuaternion.fromRotationMatrix(l);\n } else {\n const l = z.Quaternion[0];\n Ce.FromEulerVectorToRef(this.rotation, l);\n const c = z.Matrix[0];\n l.toRotationMatrix(c);\n const h = z.Matrix[1];\n this.parent.getWorldMatrix().getRotationMatrixToRef(h), h.invert(), c.multiplyToRef(h, c), l.fromRotationMatrix(c), l.toEulerAnglesToRef(this.rotation);\n }\n return this;\n }\n /**\n * Returns a new Vector3 that is the localAxis, expressed in the mesh local space, rotated like the mesh.\n * This Vector3 is expressed in the World space.\n * @param localAxis axis to rotate\n * @returns a new Vector3 that is the localAxis, expressed in the mesh local space, rotated like the mesh.\n */\n getDirection(e) {\n const t = _.Zero();\n return this.getDirectionToRef(e, t), t;\n }\n /**\n * Sets the Vector3 \"result\" as the rotated Vector3 \"localAxis\" in the same rotation than the mesh.\n * localAxis is expressed in the mesh local space.\n * result is computed in the World space from the mesh World matrix.\n * @param localAxis axis to rotate\n * @param result the resulting transformnode\n * @returns this TransformNode.\n */\n getDirectionToRef(e, t) {\n return _.TransformNormalToRef(e, this.getWorldMatrix(), t), this;\n }\n /**\n * Sets this transform node rotation to the given local axis.\n * @param localAxis the axis in local space\n * @param yawCor optional yaw (y-axis) correction in radians\n * @param pitchCor optional pitch (x-axis) correction in radians\n * @param rollCor optional roll (z-axis) correction in radians\n * @returns this TransformNode\n */\n setDirection(e, t = 0, i = 0, r = 0) {\n const s = -Math.atan2(e.z, e.x) + Math.PI / 2, a = Math.sqrt(e.x * e.x + e.z * e.z), o = -Math.atan2(e.y, a);\n return this.rotationQuaternion ? Ce.RotationYawPitchRollToRef(s + t, o + i, r, this.rotationQuaternion) : (this.rotation.x = o + i, this.rotation.y = s + t, this.rotation.z = r), this;\n }\n /**\n * Sets a new pivot point to the current node\n * @param point defines the new pivot point to use\n * @param space defines if the point is in world or local space (local by default)\n * @returns the current TransformNode\n */\n setPivotPoint(e, t = ut.LOCAL) {\n this.getScene().getRenderId() == 0 && this.computeWorldMatrix(!0);\n const i = this.getWorldMatrix();\n if (t == ut.WORLD) {\n const r = z.Matrix[0];\n i.invertToRef(r), e = _.TransformCoordinates(e, r);\n }\n return this.setPivotMatrix(w.Translation(-e.x, -e.y, -e.z), !0);\n }\n /**\n * Returns a new Vector3 set with the mesh pivot point coordinates in the local space.\n * @returns the pivot point\n */\n getPivotPoint() {\n const e = _.Zero();\n return this.getPivotPointToRef(e), e;\n }\n /**\n * Sets the passed Vector3 \"result\" with the coordinates of the mesh pivot point in the local space.\n * @param result the vector3 to store the result\n * @returns this TransformNode.\n */\n getPivotPointToRef(e) {\n return e.x = -this._pivotMatrix.m[12], e.y = -this._pivotMatrix.m[13], e.z = -this._pivotMatrix.m[14], this;\n }\n /**\n * Returns a new Vector3 set with the mesh pivot point World coordinates.\n * @returns a new Vector3 set with the mesh pivot point World coordinates.\n */\n getAbsolutePivotPoint() {\n const e = _.Zero();\n return this.getAbsolutePivotPointToRef(e), e;\n }\n /**\n * Sets the Vector3 \"result\" coordinates with the mesh pivot point World coordinates.\n * @param result vector3 to store the result\n * @returns this TransformNode.\n */\n getAbsolutePivotPointToRef(e) {\n return this.getPivotPointToRef(e), _.TransformCoordinatesToRef(e, this.getWorldMatrix(), e), this;\n }\n /**\n * Flag the transform node as dirty (Forcing it to update everything)\n * @param property if set to \"rotation\" the objects rotationQuaternion will be set to null\n * @returns this node\n */\n markAsDirty(e) {\n if (this._isDirty)\n return this;\n if (this._children)\n for (const t of this._children)\n t.markAsDirty(e);\n return super.markAsDirty(e);\n }\n /**\n * Defines the passed node as the parent of the current node.\n * The node will remain exactly where it is and its position / rotation will be updated accordingly.\n * Note that if the mesh has a pivot matrix / point defined it will be applied after the parent was updated.\n * In that case the node will not remain in the same space as it is, as the pivot will be applied.\n * To avoid this, you can set updatePivot to true and the pivot will be updated to identity\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/parent\n * @param node the node ot set as the parent\n * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.\n * @param updatePivot if true, update the pivot matrix to keep the node in the same space as before\n * @returns this TransformNode.\n */\n setParent(e, t = !1, i = !1) {\n if (!e && !this.parent)\n return this;\n const r = z.Quaternion[0], s = z.Vector3[0], a = z.Vector3[1], o = z.Matrix[1];\n w.IdentityToRef(o);\n const l = z.Matrix[0];\n this.computeWorldMatrix(!0);\n let c = this.rotationQuaternion;\n return c || (c = He._TmpRotation, Ce.RotationYawPitchRollToRef(this._rotation.y, this._rotation.x, this._rotation.z, c)), w.ComposeToRef(this.scaling, c, this.position, l), this.parent && l.multiplyToRef(this.parent.computeWorldMatrix(!0), l), e && (e.computeWorldMatrix(!0).invertToRef(o), l.multiplyToRef(o, l)), l.decompose(a, r, s, t ? this : void 0), this.rotationQuaternion ? this.rotationQuaternion.copyFrom(r) : r.toEulerAnglesToRef(this.rotation), this.scaling.copyFrom(a), this.position.copyFrom(s), this.parent = e, i && this.setPivotMatrix(w.Identity()), this;\n }\n /**\n * True if the scaling property of this object is non uniform eg. (1,2,1)\n */\n get nonUniformScaling() {\n return this._nonUniformScaling;\n }\n /**\n * @internal\n */\n _updateNonUniformScalingState(e) {\n return this._nonUniformScaling === e ? !1 : (this._nonUniformScaling = e, !0);\n }\n /**\n * Attach the current TransformNode to another TransformNode associated with a bone\n * @param bone Bone affecting the TransformNode\n * @param affectedTransformNode TransformNode associated with the bone\n * @returns this object\n */\n attachToBone(e, t) {\n return this._currentParentWhenAttachingToBone = this.parent, this._transformToBoneReferal = t, this.parent = e, e.getSkeleton().prepare(!0), e.getFinalMatrix().determinant() < 0 && (this.scalingDeterminant *= -1), this;\n }\n /**\n * Detach the transform node if its associated with a bone\n * @param resetToPreviousParent Indicates if the parent that was in effect when attachToBone was called should be set back or if we should set parent to null instead (defaults to the latter)\n * @returns this object\n */\n detachFromBone(e = !1) {\n return this.parent ? (this.parent.getWorldMatrix().determinant() < 0 && (this.scalingDeterminant *= -1), this._transformToBoneReferal = null, e ? this.parent = this._currentParentWhenAttachingToBone : this.parent = null, this) : (e && (this.parent = this._currentParentWhenAttachingToBone), this);\n }\n /**\n * Rotates the mesh around the axis vector for the passed angle (amount) expressed in radians, in the given space.\n * space (default LOCAL) can be either Space.LOCAL, either Space.WORLD.\n * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.\n * The passed axis is also normalized.\n * @param axis the axis to rotate around\n * @param amount the amount to rotate in radians\n * @param space Space to rotate in (Default: local)\n * @returns the TransformNode.\n */\n rotate(e, t, i) {\n e.normalize(), this.rotationQuaternion || (this.rotationQuaternion = this.rotation.toQuaternion(), this.rotation.setAll(0));\n let r;\n if (!i || i === ut.LOCAL)\n r = Ce.RotationAxisToRef(e, t, He._RotationAxisCache), this.rotationQuaternion.multiplyToRef(r, this.rotationQuaternion);\n else {\n if (this.parent) {\n const s = this.parent.getWorldMatrix(), a = z.Matrix[0];\n s.invertToRef(a), e = _.TransformNormal(e, a), s.determinant() < 0 && (t *= -1);\n }\n r = Ce.RotationAxisToRef(e, t, He._RotationAxisCache), r.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);\n }\n return this;\n }\n /**\n * Rotates the mesh around the axis vector for the passed angle (amount) expressed in radians, in world space.\n * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.\n * The passed axis is also normalized. .\n * Method is based on http://www.euclideanspace.com/maths/geometry/affine/aroundPoint/index.htm\n * @param point the point to rotate around\n * @param axis the axis to rotate around\n * @param amount the amount to rotate in radians\n * @returns the TransformNode\n */\n rotateAround(e, t, i) {\n t.normalize(), this.rotationQuaternion || (this.rotationQuaternion = Ce.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z), this.rotation.setAll(0));\n const r = z.Vector3[0], s = z.Vector3[1], a = z.Vector3[2], o = z.Quaternion[0], l = z.Matrix[0], c = z.Matrix[1], h = z.Matrix[2], u = z.Matrix[3];\n return e.subtractToRef(this.position, r), w.TranslationToRef(r.x, r.y, r.z, l), w.TranslationToRef(-r.x, -r.y, -r.z, c), w.RotationAxisToRef(t, i, h), c.multiplyToRef(h, u), u.multiplyToRef(l, u), u.decompose(s, o, a), this.position.addInPlace(a), o.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion), this;\n }\n /**\n * Translates the mesh along the axis vector for the passed distance in the given space.\n * space (default LOCAL) can be either Space.LOCAL, either Space.WORLD.\n * @param axis the axis to translate in\n * @param distance the distance to translate\n * @param space Space to rotate in (Default: local)\n * @returns the TransformNode.\n */\n translate(e, t, i) {\n const r = e.scale(t);\n if (!i || i === ut.LOCAL) {\n const s = this.getPositionExpressedInLocalSpace().add(r);\n this.setPositionWithLocalVector(s);\n } else\n this.setAbsolutePosition(this.getAbsolutePosition().add(r));\n return this;\n }\n /**\n * Adds a rotation step to the mesh current rotation.\n * x, y, z are Euler angles expressed in radians.\n * This methods updates the current mesh rotation, either mesh.rotation, either mesh.rotationQuaternion if it's set.\n * This means this rotation is made in the mesh local space only.\n * It's useful to set a custom rotation order different from the BJS standard one YXZ.\n * Example : this rotates the mesh first around its local X axis, then around its local Z axis, finally around its local Y axis.\n * ```javascript\n * mesh.addRotation(x1, 0, 0).addRotation(0, 0, z2).addRotation(0, 0, y3);\n * ```\n * Note that `addRotation()` accumulates the passed rotation values to the current ones and computes the .rotation or .rotationQuaternion updated values.\n * Under the hood, only quaternions are used. So it's a little faster is you use .rotationQuaternion because it doesn't need to translate them back to Euler angles.\n * @param x Rotation to add\n * @param y Rotation to add\n * @param z Rotation to add\n * @returns the TransformNode.\n */\n addRotation(e, t, i) {\n let r;\n this.rotationQuaternion ? r = this.rotationQuaternion : (r = z.Quaternion[1], Ce.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, r));\n const s = z.Quaternion[0];\n return Ce.RotationYawPitchRollToRef(t, e, i, s), r.multiplyInPlace(s), this.rotationQuaternion || r.toEulerAnglesToRef(this.rotation), this;\n }\n /**\n * @internal\n */\n _getEffectiveParent() {\n return this.parent;\n }\n /**\n * Returns whether the transform node world matrix computation needs the camera information to be computed.\n * This is the case when the node is a billboard or has an infinite distance for instance.\n * @returns true if the world matrix computation needs the camera information to be computed\n */\n isWorldMatrixCameraDependent() {\n return this._infiniteDistance && !this.parent || this._billboardMode !== He.BILLBOARDMODE_NONE && !this.preserveParentRotationForBillboard;\n }\n /**\n * Computes the world matrix of the node\n * @param force defines if the cache version should be invalidated forcing the world matrix to be created from scratch\n * @param camera defines the camera used if different from the scene active camera (This is used with modes like Billboard or infinite distance)\n * @returns the world matrix\n */\n computeWorldMatrix(e = !1, t = null) {\n if (this._isWorldMatrixFrozen && !this._isDirty)\n return this._worldMatrix;\n const i = this.getScene().getRenderId();\n if (!this._isDirty && !e && (this._currentRenderId === i || this.isSynchronized()))\n return this._currentRenderId = i, this._worldMatrix;\n t = t || this.getScene().activeCamera, this._updateCache();\n const r = this._cache;\n r.pivotMatrixUpdated = !1, r.billboardMode = this.billboardMode, r.infiniteDistance = this.infiniteDistance, r.parent = this._parentNode, this._currentRenderId = i, this._childUpdateId += 1, this._isDirty = !1, this._position._isDirty = !1, this._rotation._isDirty = !1, this._scaling._isDirty = !1;\n const s = this._getEffectiveParent(), a = He._TmpScaling;\n let o = this._position;\n if (this._infiniteDistance && !this.parent && t) {\n const c = t.getWorldMatrix(), h = new _(c.m[12], c.m[13], c.m[14]);\n o = He._TmpTranslation, o.copyFromFloats(this._position.x + h.x, this._position.y + h.y, this._position.z + h.z);\n }\n a.copyFromFloats(this._scaling.x * this.scalingDeterminant, this._scaling.y * this.scalingDeterminant, this._scaling.z * this.scalingDeterminant);\n let l;\n if (this._rotationQuaternion ? (this._rotationQuaternion._isDirty = !1, l = this._rotationQuaternion, this.reIntegrateRotationIntoRotationQuaternion && this.rotation.lengthSquared() && (this._rotationQuaternion.multiplyInPlace(Ce.RotationYawPitchRoll(this._rotation.y, this._rotation.x, this._rotation.z)), this._rotation.copyFromFloats(0, 0, 0))) : (l = He._TmpRotation, Ce.RotationYawPitchRollToRef(this._rotation.y, this._rotation.x, this._rotation.z, l)), this._usePivotMatrix) {\n const c = z.Matrix[1];\n w.ScalingToRef(a.x, a.y, a.z, c);\n const h = z.Matrix[0];\n l.toRotationMatrix(h), this._pivotMatrix.multiplyToRef(c, z.Matrix[4]), z.Matrix[4].multiplyToRef(h, this._localMatrix), this._postMultiplyPivotMatrix && this._localMatrix.multiplyToRef(this._pivotMatrixInverse, this._localMatrix), this._localMatrix.addTranslationFromFloats(o.x, o.y, o.z);\n } else\n w.ComposeToRef(a, l, o, this._localMatrix);\n if (s && s.getWorldMatrix) {\n if (e && s.computeWorldMatrix(e), r.useBillboardPath) {\n if (this._transformToBoneReferal) {\n const f = this.parent;\n f.getSkeleton().prepare(), f.getFinalMatrix().multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), z.Matrix[7]);\n } else\n z.Matrix[7].copyFrom(s.getWorldMatrix());\n const c = z.Vector3[5], h = z.Vector3[6], u = z.Quaternion[0];\n z.Matrix[7].decompose(h, u, c), w.ScalingToRef(h.x, h.y, h.z, z.Matrix[7]), z.Matrix[7].setTranslation(c), He.BillboardUseParentOrientation && (this._position.applyRotationQuaternionToRef(u, c), this._localMatrix.setTranslation(c)), this._localMatrix.multiplyToRef(z.Matrix[7], this._worldMatrix);\n } else if (this._transformToBoneReferal) {\n const c = this.parent;\n c.getSkeleton().prepare(), this._localMatrix.multiplyToRef(c.getFinalMatrix(), z.Matrix[6]), z.Matrix[6].multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), this._worldMatrix);\n } else\n this._localMatrix.multiplyToRef(s.getWorldMatrix(), this._worldMatrix);\n this._markSyncedWithParent();\n } else\n this._worldMatrix.copyFrom(this._localMatrix);\n if (r.useBillboardPath && t && this.billboardMode && !r.useBillboardPosition) {\n const c = z.Vector3[0];\n if (this._worldMatrix.getTranslationToRef(c), z.Matrix[1].copyFrom(t.getViewMatrix()), this._scene.useRightHandedSystem && z.Matrix[1].multiplyToRef(Xy, z.Matrix[1]), z.Matrix[1].setTranslationFromFloats(0, 0, 0), z.Matrix[1].invertToRef(z.Matrix[0]), (this.billboardMode & He.BILLBOARDMODE_ALL) !== He.BILLBOARDMODE_ALL) {\n z.Matrix[0].decompose(void 0, z.Quaternion[0], void 0);\n const h = z.Vector3[1];\n z.Quaternion[0].toEulerAnglesToRef(h), (this.billboardMode & He.BILLBOARDMODE_X) !== He.BILLBOARDMODE_X && (h.x = 0), (this.billboardMode & He.BILLBOARDMODE_Y) !== He.BILLBOARDMODE_Y && (h.y = 0), (this.billboardMode & He.BILLBOARDMODE_Z) !== He.BILLBOARDMODE_Z && (h.z = 0), w.RotationYawPitchRollToRef(h.y, h.x, h.z, z.Matrix[0]);\n }\n this._worldMatrix.setTranslationFromFloats(0, 0, 0), this._worldMatrix.multiplyToRef(z.Matrix[0], this._worldMatrix), this._worldMatrix.setTranslation(z.Vector3[0]);\n } else if (r.useBillboardPath && t && r.useBillboardPosition) {\n const c = z.Vector3[0];\n this._worldMatrix.getTranslationToRef(c);\n const h = t.globalPosition;\n this._worldMatrix.invertToRef(z.Matrix[1]);\n const u = z.Vector3[1];\n _.TransformCoordinatesToRef(h, z.Matrix[1], u), u.normalize();\n const f = -Math.atan2(u.z, u.x) + Math.PI / 2, d = Math.sqrt(u.x * u.x + u.z * u.z), p = -Math.atan2(u.y, d);\n if (Ce.RotationYawPitchRollToRef(f, p, 0, z.Quaternion[0]), (this.billboardMode & He.BILLBOARDMODE_ALL) !== He.BILLBOARDMODE_ALL) {\n const g = z.Vector3[1];\n z.Quaternion[0].toEulerAnglesToRef(g), (this.billboardMode & He.BILLBOARDMODE_X) !== He.BILLBOARDMODE_X && (g.x = 0), (this.billboardMode & He.BILLBOARDMODE_Y) !== He.BILLBOARDMODE_Y && (g.y = 0), (this.billboardMode & He.BILLBOARDMODE_Z) !== He.BILLBOARDMODE_Z && (g.z = 0), w.RotationYawPitchRollToRef(g.y, g.x, g.z, z.Matrix[0]);\n } else\n w.FromQuaternionToRef(z.Quaternion[0], z.Matrix[0]);\n this._worldMatrix.setTranslationFromFloats(0, 0, 0), this._worldMatrix.multiplyToRef(z.Matrix[0], this._worldMatrix), this._worldMatrix.setTranslation(z.Vector3[0]);\n }\n return this.ignoreNonUniformScaling ? this._updateNonUniformScalingState(!1) : this._scaling.isNonUniformWithinEpsilon(1e-6) ? this._updateNonUniformScalingState(!0) : s && s._nonUniformScaling ? this._updateNonUniformScalingState(s._nonUniformScaling) : this._updateNonUniformScalingState(!1), this._afterComputeWorldMatrix(), this._absolutePosition.copyFromFloats(this._worldMatrix.m[12], this._worldMatrix.m[13], this._worldMatrix.m[14]), this._isAbsoluteSynced = !1, this.onAfterWorldMatrixUpdateObservable.notifyObservers(this), this._poseMatrix || (this._poseMatrix = w.Invert(this._worldMatrix)), this._worldMatrixDeterminantIsDirty = !0, this._worldMatrix;\n }\n /**\n * Resets this nodeTransform's local matrix to Matrix.Identity().\n * @param independentOfChildren indicates if all child nodeTransform's world-space transform should be preserved.\n */\n resetLocalMatrix(e = !0) {\n if (this.computeWorldMatrix(), e) {\n const t = this.getChildren();\n for (let i = 0; i < t.length; ++i) {\n const r = t[i];\n if (r) {\n r.computeWorldMatrix();\n const s = z.Matrix[0];\n r._localMatrix.multiplyToRef(this._localMatrix, s);\n const a = z.Quaternion[0];\n s.decompose(r.scaling, a, r.position), r.rotationQuaternion ? r.rotationQuaternion.copyFrom(a) : a.toEulerAnglesToRef(r.rotation);\n }\n }\n }\n this.scaling.copyFromFloats(1, 1, 1), this.position.copyFromFloats(0, 0, 0), this.rotation.copyFromFloats(0, 0, 0), this.rotationQuaternion && (this.rotationQuaternion = Ce.Identity()), this._worldMatrix = w.Identity();\n }\n _afterComputeWorldMatrix() {\n }\n /**\n * If you'd like to be called back after the mesh position, rotation or scaling has been updated.\n * @param func callback function to add\n *\n * @returns the TransformNode.\n */\n registerAfterWorldMatrixUpdate(e) {\n return this.onAfterWorldMatrixUpdateObservable.add(e), this;\n }\n /**\n * Removes a registered callback function.\n * @param func callback function to remove\n * @returns the TransformNode.\n */\n unregisterAfterWorldMatrixUpdate(e) {\n return this.onAfterWorldMatrixUpdateObservable.removeCallback(e), this;\n }\n /**\n * Gets the position of the current mesh in camera space\n * @param camera defines the camera to use\n * @returns a position\n */\n getPositionInCameraSpace(e = null) {\n return e || (e = this.getScene().activeCamera), _.TransformCoordinates(this.getAbsolutePosition(), e.getViewMatrix());\n }\n /**\n * Returns the distance from the mesh to the active camera\n * @param camera defines the camera to use\n * @returns the distance\n */\n getDistanceToCamera(e = null) {\n return e || (e = this.getScene().activeCamera), this.getAbsolutePosition().subtract(e.globalPosition).length();\n }\n /**\n * Clone the current transform node\n * @param name Name of the new clone\n * @param newParent New parent for the clone\n * @param doNotCloneChildren Do not clone children hierarchy\n * @returns the new transform node\n */\n clone(e, t, i) {\n const r = Le.Clone(() => new He(e, this.getScene()), this);\n if (r.name = e, r.id = e, t && (r.parent = t), !i) {\n const s = this.getDescendants(!0);\n for (let a = 0; a < s.length; a++) {\n const o = s[a];\n o.clone && o.clone(e + \".\" + o.name, r);\n }\n }\n return r;\n }\n /**\n * Serializes the objects information.\n * @param currentSerializationObject defines the object to serialize in\n * @returns the serialized object\n */\n serialize(e) {\n const t = Le.Serialize(this, e);\n return t.type = this.getClassName(), t.uniqueId = this.uniqueId, this.parent && this.parent._serializeAsParent(t), t.localMatrix = this.getPivotMatrix().asArray(), t.isEnabled = this.isEnabled(), Le.AppendSerializedAnimations(this, t), t.ranges = this.serializeAnimationRanges(), t;\n }\n // Statics\n /**\n * Returns a new TransformNode object parsed from the source provided.\n * @param parsedTransformNode is the source.\n * @param scene the scene the object belongs to\n * @param rootUrl is a string, it's the root URL to prefix the `delayLoadingFile` property with\n * @returns a new TransformNode object parsed from the source provided.\n */\n static Parse(e, t, i) {\n const r = Le.Parse(() => new He(e.name, t), e, t, i);\n if (e.localMatrix ? r.setPreTransformMatrix(w.FromArray(e.localMatrix)) : e.pivotMatrix && r.setPivotMatrix(w.FromArray(e.pivotMatrix)), r.setEnabled(e.isEnabled), r._waitingParsedUniqueId = e.uniqueId, e.parentId !== void 0 && (r._waitingParentId = e.parentId), e.parentInstanceIndex !== void 0 && (r._waitingParentInstanceIndex = e.parentInstanceIndex), e.animations) {\n for (let s = 0; s < e.animations.length; s++) {\n const a = e.animations[s], o = mr(\"BABYLON.Animation\");\n o && r.animations.push(o.Parse(a));\n }\n Ai.ParseAnimationRanges(r, e, t);\n }\n return e.autoAnimate && t.beginAnimation(r, e.autoAnimateFrom, e.autoAnimateTo, e.autoAnimateLoop, e.autoAnimateSpeed || 1), r;\n }\n /**\n * Get all child-transformNodes of this node\n * @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\n * @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\n * @returns an array of TransformNode\n */\n getChildTransformNodes(e, t) {\n const i = [];\n return this._getDescendants(i, e, (r) => (!t || t(r)) && r instanceof He), i;\n }\n /**\n * Releases resources associated with this transform node.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n if (this.getScene().stopAnimation(this), this.getScene().removeTransformNode(this), this._parentContainer) {\n const i = this._parentContainer.transformNodes.indexOf(this);\n i > -1 && this._parentContainer.transformNodes.splice(i, 1), this._parentContainer = null;\n }\n if (this.onAfterWorldMatrixUpdateObservable.clear(), e) {\n const i = this.getChildTransformNodes(!0);\n for (const r of i)\n r.parent = null, r.computeWorldMatrix(!0);\n }\n super.dispose(e, t);\n }\n /**\n * Uniformly scales the mesh to fit inside of a unit cube (1 X 1 X 1 units)\n * @param includeDescendants Use the hierarchy's bounding box instead of the mesh's bounding box. Default is false\n * @param ignoreRotation ignore rotation when computing the scale (ie. object will be axis aligned). Default is false\n * @param predicate predicate that is passed in to getHierarchyBoundingVectors when selecting which object should be included when scaling\n * @returns the current mesh\n */\n normalizeToUnitCube(e = !0, t = !1, i) {\n let r = null, s = null;\n t && (this.rotationQuaternion ? (s = this.rotationQuaternion.clone(), this.rotationQuaternion.copyFromFloats(0, 0, 0, 1)) : this.rotation && (r = this.rotation.clone(), this.rotation.copyFromFloats(0, 0, 0)));\n const a = this.getHierarchyBoundingVectors(e, i), o = a.max.subtract(a.min), l = Math.max(o.x, o.y, o.z);\n if (l === 0)\n return this;\n const c = 1 / l;\n return this.scaling.scaleInPlace(c), t && (this.rotationQuaternion && s ? this.rotationQuaternion.copyFrom(s) : this.rotation && r && this.rotation.copyFrom(r)), this;\n }\n _syncAbsoluteScalingAndRotation() {\n this._isAbsoluteSynced || (this._worldMatrix.decompose(this._absoluteScaling, this._absoluteRotationQuaternion), this._isAbsoluteSynced = !0);\n }\n}\nHe.BILLBOARDMODE_NONE = 0;\nHe.BILLBOARDMODE_X = 1;\nHe.BILLBOARDMODE_Y = 2;\nHe.BILLBOARDMODE_Z = 4;\nHe.BILLBOARDMODE_ALL = 7;\nHe.BILLBOARDMODE_USE_POSITION = 128;\nHe.BillboardUseParentOrientation = !1;\nHe._TmpRotation = Ce.Zero();\nHe._TmpScaling = _.Zero();\nHe._TmpTranslation = _.Zero();\nHe._LookAtVectorCache = new _(0, 0, 0);\nHe._RotationAxisCache = new Ce();\nP([\n cn(\"position\")\n], He.prototype, \"_position\", void 0);\nP([\n cn(\"rotation\")\n], He.prototype, \"_rotation\", void 0);\nP([\n by(\"rotationQuaternion\")\n], He.prototype, \"_rotationQuaternion\", void 0);\nP([\n cn(\"scaling\")\n], He.prototype, \"_scaling\", void 0);\nP([\n U(\"billboardMode\")\n], He.prototype, \"_billboardMode\", void 0);\nP([\n U()\n], He.prototype, \"scalingDeterminant\", void 0);\nP([\n U(\"infiniteDistance\")\n], He.prototype, \"_infiniteDistance\", void 0);\nP([\n U()\n], He.prototype, \"ignoreNonUniformScaling\", void 0);\nP([\n U()\n], He.prototype, \"reIntegrateRotationIntoRotationQuaternion\", void 0);\nclass Hy {\n constructor() {\n this._checkCollisions = !1, this._collisionMask = -1, this._collisionGroup = -1, this._surroundingMeshes = null, this._collider = null, this._oldPositionForCollisions = new _(0, 0, 0), this._diffPositionForCollisions = new _(0, 0, 0), this._collisionResponse = !0;\n }\n}\nclass Ky {\n constructor() {\n this.facetNb = 0, this.partitioningSubdivisions = 10, this.partitioningBBoxRatio = 1.01, this.facetDataEnabled = !1, this.facetParameters = {}, this.bbSize = _.Zero(), this.subDiv = {\n // actual number of subdivisions per axis for ComputeNormals()\n max: 1,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n X: 1,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Y: 1,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Z: 1\n }, this.facetDepthSort = !1, this.facetDepthSortEnabled = !1;\n }\n}\nclass qy {\n constructor() {\n this._hasVertexAlpha = !1, this._useVertexColors = !0, this._numBoneInfluencers = 4, this._applyFog = !0, this._receiveShadows = !1, this._facetData = new Ky(), this._visibility = 1, this._skeleton = null, this._layerMask = 268435455, this._computeBonesUsingShaders = !0, this._isActive = !1, this._onlyForInstances = !1, this._isActiveIntermediate = !1, this._onlyForInstancesIntermediate = !1, this._actAsRegularMesh = !1, this._currentLOD = null, this._currentLODIsUpToDate = !1, this._collisionRetryCount = 3, this._morphTargetManager = null, this._renderingGroupId = 0, this._bakedVertexAnimationManager = null, this._material = null, this._positions = null, this._pointerOverDisableMeshTesting = !1, this._meshCollisionData = new Hy(), this._enableDistantPicking = !1, this._rawBoundingInfo = null;\n }\n}\nclass er extends He {\n /**\n * No billboard\n */\n static get BILLBOARDMODE_NONE() {\n return He.BILLBOARDMODE_NONE;\n }\n /** Billboard on X axis */\n static get BILLBOARDMODE_X() {\n return He.BILLBOARDMODE_X;\n }\n /** Billboard on Y axis */\n static get BILLBOARDMODE_Y() {\n return He.BILLBOARDMODE_Y;\n }\n /** Billboard on Z axis */\n static get BILLBOARDMODE_Z() {\n return He.BILLBOARDMODE_Z;\n }\n /** Billboard on all axes */\n static get BILLBOARDMODE_ALL() {\n return He.BILLBOARDMODE_ALL;\n }\n /** Billboard on using position instead of orientation */\n static get BILLBOARDMODE_USE_POSITION() {\n return He.BILLBOARDMODE_USE_POSITION;\n }\n /**\n * Gets the number of facets in the mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet\n */\n get facetNb() {\n return this._internalAbstractMeshDataInfo._facetData.facetNb;\n }\n /**\n * Gets or set the number (integer) of subdivisions per axis in the partitioning space\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning\n */\n get partitioningSubdivisions() {\n return this._internalAbstractMeshDataInfo._facetData.partitioningSubdivisions;\n }\n set partitioningSubdivisions(e) {\n this._internalAbstractMeshDataInfo._facetData.partitioningSubdivisions = e;\n }\n /**\n * The ratio (float) to apply to the bounding box size to set to the partitioning space.\n * Ex : 1.01 (default) the partitioning space is 1% bigger than the bounding box\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning\n */\n get partitioningBBoxRatio() {\n return this._internalAbstractMeshDataInfo._facetData.partitioningBBoxRatio;\n }\n set partitioningBBoxRatio(e) {\n this._internalAbstractMeshDataInfo._facetData.partitioningBBoxRatio = e;\n }\n /**\n * Gets or sets a boolean indicating that the facets must be depth sorted on next call to `updateFacetData()`.\n * Works only for updatable meshes.\n * Doesn't work with multi-materials\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort\n */\n get mustDepthSortFacets() {\n return this._internalAbstractMeshDataInfo._facetData.facetDepthSort;\n }\n set mustDepthSortFacets(e) {\n this._internalAbstractMeshDataInfo._facetData.facetDepthSort = e;\n }\n /**\n * The location (Vector3) where the facet depth sort must be computed from.\n * By default, the active camera position.\n * Used only when facet depth sort is enabled\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort\n */\n get facetDepthSortFrom() {\n return this._internalAbstractMeshDataInfo._facetData.facetDepthSortFrom;\n }\n set facetDepthSortFrom(e) {\n this._internalAbstractMeshDataInfo._facetData.facetDepthSortFrom = e;\n }\n /** number of collision detection tries. Change this value if not all collisions are detected and handled properly */\n get collisionRetryCount() {\n return this._internalAbstractMeshDataInfo._collisionRetryCount;\n }\n set collisionRetryCount(e) {\n this._internalAbstractMeshDataInfo._collisionRetryCount = e;\n }\n /**\n * gets a boolean indicating if facetData is enabled\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet\n */\n get isFacetDataEnabled() {\n return this._internalAbstractMeshDataInfo._facetData.facetDataEnabled;\n }\n /**\n * Gets or sets the morph target manager\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets\n */\n get morphTargetManager() {\n return this._internalAbstractMeshDataInfo._morphTargetManager;\n }\n set morphTargetManager(e) {\n this._internalAbstractMeshDataInfo._morphTargetManager !== e && (this._internalAbstractMeshDataInfo._morphTargetManager = e, this._syncGeometryWithMorphTargetManager());\n }\n /**\n * Gets or sets the baked vertex animation manager\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/baked_texture_animations\n */\n get bakedVertexAnimationManager() {\n return this._internalAbstractMeshDataInfo._bakedVertexAnimationManager;\n }\n set bakedVertexAnimationManager(e) {\n this._internalAbstractMeshDataInfo._bakedVertexAnimationManager !== e && (this._internalAbstractMeshDataInfo._bakedVertexAnimationManager = e, this._markSubMeshesAsAttributesDirty());\n }\n /** @internal */\n _syncGeometryWithMorphTargetManager() {\n }\n /**\n * @internal\n */\n _updateNonUniformScalingState(e) {\n return super._updateNonUniformScalingState(e) ? (this._markSubMeshesAsMiscDirty(), !0) : !1;\n }\n /** @internal */\n get rawBoundingInfo() {\n return this._internalAbstractMeshDataInfo._rawBoundingInfo;\n }\n set rawBoundingInfo(e) {\n this._internalAbstractMeshDataInfo._rawBoundingInfo = e;\n }\n /** Set a function to call when this mesh collides with another one */\n set onCollide(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver && this.onCollideObservable.remove(this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver), this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver = this.onCollideObservable.add(e);\n }\n /** Set a function to call when the collision's position changes */\n set onCollisionPositionChange(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver && this.onCollisionPositionChangeObservable.remove(this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver), this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver = this.onCollisionPositionChangeObservable.add(e);\n }\n /**\n * Gets or sets mesh visibility between 0 and 1 (default is 1)\n */\n get visibility() {\n return this._internalAbstractMeshDataInfo._visibility;\n }\n /**\n * Gets or sets mesh visibility between 0 and 1 (default is 1)\n */\n set visibility(e) {\n if (this._internalAbstractMeshDataInfo._visibility === e)\n return;\n const t = this._internalAbstractMeshDataInfo._visibility;\n this._internalAbstractMeshDataInfo._visibility = e, (t === 1 && e !== 1 || t !== 1 && e === 1) && this._markSubMeshesAsDirty((i) => {\n i.markAsMiscDirty(), i.markAsPrePassDirty();\n });\n }\n /**\n * Gets or sets the property which disables the test that is checking that the mesh under the pointer is the same than the previous time we tested for it (default: false).\n * Set this property to true if you want thin instances picking to be reported accurately when moving over the mesh.\n * Note that setting this property to true will incur some performance penalties when dealing with pointer events for this mesh so use it sparingly.\n */\n get pointerOverDisableMeshTesting() {\n return this._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting;\n }\n set pointerOverDisableMeshTesting(e) {\n this._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting = e;\n }\n /**\n * Specifies the rendering group id for this mesh (0 by default)\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#rendering-groups\n */\n get renderingGroupId() {\n return this._internalAbstractMeshDataInfo._renderingGroupId;\n }\n set renderingGroupId(e) {\n this._internalAbstractMeshDataInfo._renderingGroupId = e;\n }\n /** Gets or sets current material */\n get material() {\n return this._internalAbstractMeshDataInfo._material;\n }\n set material(e) {\n this._internalAbstractMeshDataInfo._material !== e && (this._internalAbstractMeshDataInfo._material && this._internalAbstractMeshDataInfo._material.meshMap && (this._internalAbstractMeshDataInfo._material.meshMap[this.uniqueId] = void 0), this._internalAbstractMeshDataInfo._material = e, e && e.meshMap && (e.meshMap[this.uniqueId] = this), this.onMaterialChangedObservable.hasObservers() && this.onMaterialChangedObservable.notifyObservers(this), this.subMeshes && (this.resetDrawCache(), this._unBindEffect()));\n }\n /**\n * Gets the material used to render the mesh in a specific render pass\n * @param renderPassId render pass id\n * @returns material used for the render pass. If no specific material is used for this render pass, undefined is returned (meaning mesh.material is used for this pass)\n */\n getMaterialForRenderPass(e) {\n var t;\n return (t = this._internalAbstractMeshDataInfo._materialForRenderPass) == null ? void 0 : t[e];\n }\n /**\n * Sets the material to be used to render the mesh in a specific render pass\n * @param renderPassId render pass id\n * @param material material to use for this render pass. If undefined is passed, no specific material will be used for this render pass but the regular material will be used instead (mesh.material)\n */\n setMaterialForRenderPass(e, t) {\n this.resetDrawCache(e), this._internalAbstractMeshDataInfo._materialForRenderPass || (this._internalAbstractMeshDataInfo._materialForRenderPass = []), this._internalAbstractMeshDataInfo._materialForRenderPass[e] = t;\n }\n /**\n * Gets or sets a boolean indicating that this mesh can receive realtime shadows\n * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows\n */\n get receiveShadows() {\n return this._internalAbstractMeshDataInfo._receiveShadows;\n }\n set receiveShadows(e) {\n this._internalAbstractMeshDataInfo._receiveShadows !== e && (this._internalAbstractMeshDataInfo._receiveShadows = e, this._markSubMeshesAsLightDirty());\n }\n /** Gets or sets a boolean indicating that this mesh contains vertex color data with alpha values */\n get hasVertexAlpha() {\n return this._internalAbstractMeshDataInfo._hasVertexAlpha;\n }\n set hasVertexAlpha(e) {\n this._internalAbstractMeshDataInfo._hasVertexAlpha !== e && (this._internalAbstractMeshDataInfo._hasVertexAlpha = e, this._markSubMeshesAsAttributesDirty(), this._markSubMeshesAsMiscDirty());\n }\n /** Gets or sets a boolean indicating that this mesh needs to use vertex color data to render (if this kind of vertex data is available in the geometry) */\n get useVertexColors() {\n return this._internalAbstractMeshDataInfo._useVertexColors;\n }\n set useVertexColors(e) {\n this._internalAbstractMeshDataInfo._useVertexColors !== e && (this._internalAbstractMeshDataInfo._useVertexColors = e, this._markSubMeshesAsAttributesDirty());\n }\n /**\n * Gets or sets a boolean indicating that bone animations must be computed by the GPU (true by default)\n */\n get computeBonesUsingShaders() {\n return this._internalAbstractMeshDataInfo._computeBonesUsingShaders;\n }\n set computeBonesUsingShaders(e) {\n this._internalAbstractMeshDataInfo._computeBonesUsingShaders !== e && (this._internalAbstractMeshDataInfo._computeBonesUsingShaders = e, this._markSubMeshesAsAttributesDirty());\n }\n /** Gets or sets the number of allowed bone influences per vertex (4 by default) */\n get numBoneInfluencers() {\n return this._internalAbstractMeshDataInfo._numBoneInfluencers;\n }\n set numBoneInfluencers(e) {\n this._internalAbstractMeshDataInfo._numBoneInfluencers !== e && (this._internalAbstractMeshDataInfo._numBoneInfluencers = e, this._markSubMeshesAsAttributesDirty());\n }\n /** Gets or sets a boolean indicating that this mesh will allow fog to be rendered on it (true by default) */\n get applyFog() {\n return this._internalAbstractMeshDataInfo._applyFog;\n }\n set applyFog(e) {\n this._internalAbstractMeshDataInfo._applyFog !== e && (this._internalAbstractMeshDataInfo._applyFog = e, this._markSubMeshesAsMiscDirty());\n }\n /** When enabled, decompose picking matrices for better precision with large values for mesh position and scling */\n get enableDistantPicking() {\n return this._internalAbstractMeshDataInfo._enableDistantPicking;\n }\n set enableDistantPicking(e) {\n this._internalAbstractMeshDataInfo._enableDistantPicking = e;\n }\n /**\n * Gets or sets the current layer mask (default is 0x0FFFFFFF)\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/layerMasksAndMultiCam\n */\n get layerMask() {\n return this._internalAbstractMeshDataInfo._layerMask;\n }\n set layerMask(e) {\n e !== this._internalAbstractMeshDataInfo._layerMask && (this._internalAbstractMeshDataInfo._layerMask = e, this._resyncLightSources());\n }\n /**\n * Gets or sets a collision mask used to mask collisions (default is -1).\n * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0\n */\n get collisionMask() {\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionMask;\n }\n set collisionMask(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionMask = isNaN(e) ? -1 : e;\n }\n /**\n * Gets or sets a collision response flag (default is true).\n * when collisionResponse is false, events are still triggered but colliding entity has no response\n * This helps creating trigger volume when user wants collision feedback events but not position/velocity\n * to respond to the collision.\n */\n get collisionResponse() {\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionResponse;\n }\n set collisionResponse(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionResponse = e;\n }\n /**\n * Gets or sets the current collision group mask (-1 by default).\n * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0\n */\n get collisionGroup() {\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionGroup;\n }\n set collisionGroup(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionGroup = isNaN(e) ? -1 : e;\n }\n /**\n * Gets or sets current surrounding meshes (null by default).\n *\n * By default collision detection is tested against every mesh in the scene.\n * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified\n * meshes will be tested for the collision.\n *\n * Note: if set to an empty array no collision will happen when this mesh is moved.\n */\n get surroundingMeshes() {\n return this._internalAbstractMeshDataInfo._meshCollisionData._surroundingMeshes;\n }\n set surroundingMeshes(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._surroundingMeshes = e;\n }\n /** Gets the list of lights affecting that mesh */\n get lightSources() {\n return this._lightSources;\n }\n /** @internal */\n get _positions() {\n return null;\n }\n /**\n * Gets or sets a skeleton to apply skinning transformations\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons\n */\n set skeleton(e) {\n const t = this._internalAbstractMeshDataInfo._skeleton;\n t && t.needInitialSkinMatrix && t._unregisterMeshWithPoseMatrix(this), e && e.needInitialSkinMatrix && e._registerMeshWithPoseMatrix(this), this._internalAbstractMeshDataInfo._skeleton = e, this._internalAbstractMeshDataInfo._skeleton || (this._bonesTransformMatrices = null), this._markSubMeshesAsAttributesDirty();\n }\n get skeleton() {\n return this._internalAbstractMeshDataInfo._skeleton;\n }\n // Constructor\n /**\n * Creates a new AbstractMesh\n * @param name defines the name of the mesh\n * @param scene defines the hosting scene\n */\n constructor(e, t = null) {\n switch (super(e, t, !1), this._internalAbstractMeshDataInfo = new qy(), this._waitingMaterialId = null, this.cullingStrategy = er.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY, this.onCollideObservable = new he(), this.onCollisionPositionChangeObservable = new he(), this.onMaterialChangedObservable = new he(), this.definedFacingForward = !0, this._occlusionQuery = null, this._renderingGroup = null, this.alphaIndex = Number.MAX_VALUE, this.isVisible = !0, this.isPickable = !0, this.isNearPickable = !1, this.isNearGrabbable = !1, this.showSubMeshesBoundingBox = !1, this.isBlocker = !1, this.enablePointerMoveEvents = !1, this.outlineColor = Ne.Red(), this.outlineWidth = 0.02, this.overlayColor = Ne.Red(), this.overlayAlpha = 0.5, this.useOctreeForRenderingSelection = !0, this.useOctreeForPicking = !0, this.useOctreeForCollisions = !0, this.alwaysSelectAsActiveMesh = !1, this.doNotSyncBoundingInfo = !1, this.actionManager = null, this.ellipsoid = new _(0.5, 1, 0.5), this.ellipsoidOffset = new _(0, 0, 0), this.edgesWidth = 1, this.edgesColor = new et(1, 0, 0, 1), this._edgesRenderer = null, this._masterMesh = null, this._boundingInfo = null, this._boundingInfoIsDirty = !0, this._renderId = 0, this._intersectionsInProgress = new Array(), this._unIndexed = !1, this._lightSources = new Array(), this._waitingData = {\n lods: null,\n actions: null,\n freezeWorldMatrix: null\n }, this._bonesTransformMatrices = null, this._transformMatrixTexture = null, this.onRebuildObservable = new he(), this._onCollisionPositionChange = (i, r, s = null) => {\n r.subtractToRef(this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions, this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions), this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions.length() > se.CollisionsEpsilon && this.position.addInPlace(this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions), s && this.onCollideObservable.notifyObservers(s), this.onCollisionPositionChangeObservable.notifyObservers(this.position);\n }, t = this.getScene(), t.addMesh(this), this._resyncLightSources(), this._uniformBuffer = new Ie(this.getScene().getEngine(), void 0, void 0, e, !this.getScene().getEngine().isWebGPU), this._buildUniformLayout(), t.performancePriority) {\n case fs.Aggressive:\n this.doNotSyncBoundingInfo = !0;\n case fs.Intermediate:\n this.alwaysSelectAsActiveMesh = !0, this.isPickable = !1;\n break;\n }\n }\n _buildUniformLayout() {\n this._uniformBuffer.addUniform(\"world\", 16), this._uniformBuffer.addUniform(\"visibility\", 1), this._uniformBuffer.create();\n }\n /**\n * Transfer the mesh values to its UBO.\n * @param world The world matrix associated with the mesh\n */\n transferToEffect(e) {\n const t = this._uniformBuffer;\n t.updateMatrix(\"world\", e), t.updateFloat(\"visibility\", this._internalAbstractMeshDataInfo._visibility), t.update();\n }\n /**\n * Gets the mesh uniform buffer.\n * @returns the uniform buffer of the mesh.\n */\n getMeshUniformBuffer() {\n return this._uniformBuffer;\n }\n /**\n * Returns the string \"AbstractMesh\"\n * @returns \"AbstractMesh\"\n */\n getClassName() {\n return \"AbstractMesh\";\n }\n /**\n * Gets a string representation of the current mesh\n * @param fullDetails defines a boolean indicating if full details must be included\n * @returns a string representation of the current mesh\n */\n toString(e) {\n let t = \"Name: \" + this.name + \", isInstance: \" + (this.getClassName() !== \"InstancedMesh\" ? \"YES\" : \"NO\");\n t += \", # of submeshes: \" + (this.subMeshes ? this.subMeshes.length : 0);\n const i = this._internalAbstractMeshDataInfo._skeleton;\n return i && (t += \", skeleton: \" + i.name), e && (t += \", billboard mode: \" + [\"NONE\", \"X\", \"Y\", null, \"Z\", null, null, \"ALL\"][this.billboardMode], t += \", freeze wrld mat: \" + (this._isWorldMatrixFrozen || this._waitingData.freezeWorldMatrix ? \"YES\" : \"NO\")), t;\n }\n /**\n * @internal\n */\n _getEffectiveParent() {\n return this._masterMesh && this.billboardMode !== He.BILLBOARDMODE_NONE ? this._masterMesh : super._getEffectiveParent();\n }\n /**\n * @internal\n */\n _getActionManagerForTrigger(e, t = !0) {\n if (this.actionManager && (t || this.actionManager.isRecursive))\n if (e) {\n if (this.actionManager.hasSpecificTrigger(e))\n return this.actionManager;\n } else\n return this.actionManager;\n return this.parent ? this.parent._getActionManagerForTrigger(e, !1) : null;\n }\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _rebuild(e = !1) {\n if (this.onRebuildObservable.notifyObservers(this), this._occlusionQuery !== null && (this._occlusionQuery = null), !!this.subMeshes) {\n for (const t of this.subMeshes)\n t._rebuild();\n this.resetDrawCache();\n }\n }\n /** @internal */\n _resyncLightSources() {\n this._lightSources.length = 0;\n for (const e of this.getScene().lights)\n e.isEnabled() && e.canAffectMesh(this) && this._lightSources.push(e);\n this._markSubMeshesAsLightDirty();\n }\n /**\n * @internal\n */\n _resyncLightSource(e) {\n const t = e.isEnabled() && e.canAffectMesh(this), i = this._lightSources.indexOf(e);\n let r = !1;\n if (i === -1) {\n if (!t)\n return;\n this._lightSources.push(e);\n } else {\n if (t)\n return;\n r = !0, this._lightSources.splice(i, 1);\n }\n this._markSubMeshesAsLightDirty(r);\n }\n /** @internal */\n _unBindEffect() {\n for (const e of this.subMeshes)\n e.setEffect(null);\n }\n /**\n * @internal\n */\n _removeLightSource(e, t) {\n const i = this._lightSources.indexOf(e);\n i !== -1 && (this._lightSources.splice(i, 1), this._markSubMeshesAsLightDirty(t));\n }\n _markSubMeshesAsDirty(e) {\n if (this.subMeshes)\n for (const t of this.subMeshes)\n for (let i = 0; i < t._drawWrappers.length; ++i) {\n const r = t._drawWrappers[i];\n !r || !r.defines || !r.defines.markAllAsDirty || e(r.defines);\n }\n }\n /**\n * @internal\n */\n _markSubMeshesAsLightDirty(e = !1) {\n this._markSubMeshesAsDirty((t) => t.markAsLightDirty(e));\n }\n /** @internal */\n _markSubMeshesAsAttributesDirty() {\n this._markSubMeshesAsDirty((e) => e.markAsAttributesDirty());\n }\n /** @internal */\n _markSubMeshesAsMiscDirty() {\n this._markSubMeshesAsDirty((e) => e.markAsMiscDirty());\n }\n /**\n * Flag the AbstractMesh as dirty (Forcing it to update everything)\n * @param property if set to \"rotation\" the objects rotationQuaternion will be set to null\n * @returns this AbstractMesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n markAsDirty(e) {\n return this._currentRenderId = Number.MAX_VALUE, this._isDirty = !0, this;\n }\n /**\n * Resets the draw wrappers cache for all submeshes of this abstract mesh\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\n */\n resetDrawCache(e) {\n if (this.subMeshes)\n for (const t of this.subMeshes)\n t.resetDrawCache(e);\n }\n // Methods\n /**\n * Returns true if the mesh is blocked. Implemented by child classes\n */\n get isBlocked() {\n return !1;\n }\n /**\n * Returns the mesh itself by default. Implemented by child classes\n * @param camera defines the camera to use to pick the right LOD level\n * @returns the currentAbstractMesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getLOD(e) {\n return this;\n }\n /**\n * Returns 0 by default. Implemented by child classes\n * @returns an integer\n */\n getTotalVertices() {\n return 0;\n }\n /**\n * Returns a positive integer : the total number of indices in this mesh geometry.\n * @returns the number of indices or zero if the mesh has no geometry.\n */\n getTotalIndices() {\n return 0;\n }\n /**\n * Returns null by default. Implemented by child classes\n * @returns null\n */\n getIndices() {\n return null;\n }\n /**\n * Returns the array of the requested vertex data kind. Implemented by child classes\n * @param kind defines the vertex data kind to use\n * @returns null\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getVerticesData(e) {\n return null;\n }\n /**\n * Sets the vertex data of the mesh geometry for the requested `kind`.\n * If the mesh has no geometry, a new Geometry object is set to the mesh and then passed this vertex data.\n * Note that a new underlying VertexBuffer object is created each call.\n * If the `kind` is the `PositionKind`, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\n * @param kind defines vertex data kind:\n * * VertexBuffer.PositionKind\n * * VertexBuffer.UVKind\n * * VertexBuffer.UV2Kind\n * * VertexBuffer.UV3Kind\n * * VertexBuffer.UV4Kind\n * * VertexBuffer.UV5Kind\n * * VertexBuffer.UV6Kind\n * * VertexBuffer.ColorKind\n * * VertexBuffer.MatricesIndicesKind\n * * VertexBuffer.MatricesIndicesExtraKind\n * * VertexBuffer.MatricesWeightsKind\n * * VertexBuffer.MatricesWeightsExtraKind\n * @param data defines the data source\n * @param updatable defines if the data must be flagged as updatable (or static)\n * @param stride defines the vertex stride (size of an entire vertex). Can be null and in this case will be deduced from vertex data kind\n * @returns the current mesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setVerticesData(e, t, i, r) {\n return this;\n }\n /**\n * Updates the existing vertex data of the mesh geometry for the requested `kind`.\n * If the mesh has no geometry, it is simply returned as it is.\n * @param kind defines vertex data kind:\n * * VertexBuffer.PositionKind\n * * VertexBuffer.UVKind\n * * VertexBuffer.UV2Kind\n * * VertexBuffer.UV3Kind\n * * VertexBuffer.UV4Kind\n * * VertexBuffer.UV5Kind\n * * VertexBuffer.UV6Kind\n * * VertexBuffer.ColorKind\n * * VertexBuffer.MatricesIndicesKind\n * * VertexBuffer.MatricesIndicesExtraKind\n * * VertexBuffer.MatricesWeightsKind\n * * VertexBuffer.MatricesWeightsExtraKind\n * @param data defines the data source\n * @param updateExtends If `kind` is `PositionKind` and if `updateExtends` is true, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed\n * @param makeItUnique If true, a new global geometry is created from this data and is set to the mesh\n * @returns the current mesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n updateVerticesData(e, t, i, r) {\n return this;\n }\n /**\n * Sets the mesh indices,\n * If the mesh has no geometry, a new Geometry object is created and set to the mesh.\n * @param indices Expects an array populated with integers or a typed array (Int32Array, Uint32Array, Uint16Array)\n * @param totalVertices Defines the total number of vertices\n * @returns the current mesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setIndices(e, t) {\n return this;\n }\n /**\n * Gets a boolean indicating if specific vertex data is present\n * @param kind defines the vertex data kind to use\n * @returns true is data kind is present\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isVerticesDataPresent(e) {\n return !1;\n }\n /**\n * Returns the mesh BoundingInfo object or creates a new one and returns if it was undefined.\n * Note that it returns a shallow bounding of the mesh (i.e. it does not include children).\n * However, if the mesh contains thin instances, it will be expanded to include them. If you want the \"raw\" bounding data instead, then use `getRawBoundingInfo()`.\n * To get the full bounding of all children, call `getHierarchyBoundingVectors` instead.\n * @returns a BoundingInfo\n */\n getBoundingInfo() {\n return this._masterMesh ? this._masterMesh.getBoundingInfo() : (this._boundingInfoIsDirty && (this._boundingInfoIsDirty = !1, this._updateBoundingInfo()), this._boundingInfo);\n }\n /**\n * Returns the bounding info unnafected by instance data.\n * @returns the bounding info of the mesh unaffected by instance data.\n */\n getRawBoundingInfo() {\n return this.rawBoundingInfo ?? this.getBoundingInfo();\n }\n /**\n * Overwrite the current bounding info\n * @param boundingInfo defines the new bounding info\n * @returns the current mesh\n */\n setBoundingInfo(e) {\n return this._boundingInfo = e, this;\n }\n /**\n * Returns true if there is already a bounding info\n */\n get hasBoundingInfo() {\n return this._boundingInfo !== null;\n }\n /**\n * Creates a new bounding info for the mesh\n * @param minimum min vector of the bounding box/sphere\n * @param maximum max vector of the bounding box/sphere\n * @param worldMatrix defines the new world matrix\n * @returns the new bounding info\n */\n buildBoundingInfo(e, t, i) {\n return this._boundingInfo = new Cr(e, t, i), this._boundingInfo;\n }\n /**\n * Uniformly scales the mesh to fit inside of a unit cube (1 X 1 X 1 units)\n * @param includeDescendants Use the hierarchy's bounding box instead of the mesh's bounding box. Default is false\n * @param ignoreRotation ignore rotation when computing the scale (ie. object will be axis aligned). Default is false\n * @param predicate predicate that is passed in to getHierarchyBoundingVectors when selecting which object should be included when scaling\n * @returns the current mesh\n */\n normalizeToUnitCube(e = !0, t = !1, i) {\n return super.normalizeToUnitCube(e, t, i);\n }\n /** Gets a boolean indicating if this mesh has skinning data and an attached skeleton */\n get useBones() {\n return this.skeleton && this.getScene().skeletonsEnabled && this.isVerticesDataPresent(I.MatricesIndicesKind) && this.isVerticesDataPresent(I.MatricesWeightsKind);\n }\n /** @internal */\n _preActivate() {\n }\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _preActivateForIntermediateRendering(e) {\n }\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _activate(e, t) {\n return this._renderId = e, !0;\n }\n /** @internal */\n _postActivate() {\n }\n /** @internal */\n _freeze() {\n }\n /** @internal */\n _unFreeze() {\n }\n /**\n * Gets the current world matrix\n * @returns a Matrix\n */\n getWorldMatrix() {\n return this._masterMesh && this.billboardMode === He.BILLBOARDMODE_NONE ? this._masterMesh.getWorldMatrix() : super.getWorldMatrix();\n }\n /** @internal */\n _getWorldMatrixDeterminant() {\n return this._masterMesh ? this._masterMesh._getWorldMatrixDeterminant() : super._getWorldMatrixDeterminant();\n }\n /**\n * Gets a boolean indicating if this mesh is an instance or a regular mesh\n */\n get isAnInstance() {\n return !1;\n }\n /**\n * Gets a boolean indicating if this mesh has instances\n */\n get hasInstances() {\n return !1;\n }\n /**\n * Gets a boolean indicating if this mesh has thin instances\n */\n get hasThinInstances() {\n return !1;\n }\n // ================================== Point of View Movement =================================\n /**\n * Perform relative position change from the point of view of behind the front of the mesh.\n * This is performed taking into account the meshes current rotation, so you do not have to care.\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\n * @param amountRight defines the distance on the right axis\n * @param amountUp defines the distance on the up axis\n * @param amountForward defines the distance on the forward axis\n * @returns the current mesh\n */\n movePOV(e, t, i) {\n return this.position.addInPlace(this.calcMovePOV(e, t, i)), this;\n }\n /**\n * Calculate relative position change from the point of view of behind the front of the mesh.\n * This is performed taking into account the meshes current rotation, so you do not have to care.\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\n * @param amountRight defines the distance on the right axis\n * @param amountUp defines the distance on the up axis\n * @param amountForward defines the distance on the forward axis\n * @returns the new displacement vector\n */\n calcMovePOV(e, t, i) {\n const r = new w();\n (this.rotationQuaternion ? this.rotationQuaternion : Ce.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z)).toRotationMatrix(r);\n const a = _.Zero(), o = this.definedFacingForward ? -1 : 1;\n return _.TransformCoordinatesFromFloatsToRef(e * o, t, i * o, r, a), a;\n }\n // ================================== Point of View Rotation =================================\n /**\n * Perform relative rotation change from the point of view of behind the front of the mesh.\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\n * @param flipBack defines the flip\n * @param twirlClockwise defines the twirl\n * @param tiltRight defines the tilt\n * @returns the current mesh\n */\n rotatePOV(e, t, i) {\n return this.rotation.addInPlace(this.calcRotatePOV(e, t, i)), this;\n }\n /**\n * Calculate relative rotation change from the point of view of behind the front of the mesh.\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\n * @param flipBack defines the flip\n * @param twirlClockwise defines the twirl\n * @param tiltRight defines the tilt\n * @returns the new rotation vector\n */\n calcRotatePOV(e, t, i) {\n const r = this.definedFacingForward ? 1 : -1;\n return new _(e * r, t, i * r);\n }\n /**\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\n * This means the mesh underlying bounding box and sphere are recomputed.\n * @param applySkeleton defines whether to apply the skeleton before computing the bounding info\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\n * @returns the current mesh\n */\n refreshBoundingInfo(e = !1, t = !1) {\n return this._boundingInfo && this._boundingInfo.isLocked ? this : (this._refreshBoundingInfo(this._getPositionData(e, t), null), this);\n }\n /**\n * @internal\n */\n _refreshBoundingInfo(e, t) {\n if (e) {\n const i = _o(e, 0, this.getTotalVertices(), t);\n this._boundingInfo ? this._boundingInfo.reConstruct(i.minimum, i.maximum) : this._boundingInfo = new Cr(i.minimum, i.maximum);\n }\n if (this.subMeshes)\n for (let i = 0; i < this.subMeshes.length; i++)\n this.subMeshes[i].refreshBoundingInfo(e);\n this._updateBoundingInfo();\n }\n /**\n * Internal function to get buffer data and possibly apply morphs and normals\n * @param applySkeleton\n * @param applyMorph\n * @param data\n * @param kind the kind of data you want. Can be Normal or Position\n * @returns a FloatArray of the vertex data\n */\n _getData(e = !1, t = !1, i, r = I.PositionKind) {\n if (i = i ?? this.getVerticesData(r).slice(), i && t && this.morphTargetManager) {\n let s = 0, a = 0;\n for (let o = 0; o < i.length; o++) {\n let l = i[o];\n for (let c = 0; c < this.morphTargetManager.numTargets; c++) {\n const h = this.morphTargetManager.getTarget(c), u = h.influence;\n if (u !== 0) {\n let f = null;\n switch (r) {\n case I.PositionKind:\n f = h.getPositions();\n break;\n case I.NormalKind:\n f = h.getNormals();\n break;\n case I.TangentKind:\n f = h.getTangents();\n break;\n case I.UVKind:\n f = h.getUVs();\n break;\n }\n f && (l += (f[o] - i[o]) * u);\n }\n }\n if (i[o] = l, s++, r === I.PositionKind && this._positions && s === 3) {\n s = 0;\n const c = a * 3;\n this._positions[a++].copyFromFloats(i[c], i[c + 1], i[c + 2]);\n }\n }\n }\n if (i && e && this.skeleton) {\n const s = this.getVerticesData(I.MatricesIndicesKind), a = this.getVerticesData(I.MatricesWeightsKind);\n if (a && s) {\n const o = this.numBoneInfluencers > 4, l = o ? this.getVerticesData(I.MatricesIndicesExtraKind) : null, c = o ? this.getVerticesData(I.MatricesWeightsExtraKind) : null, h = this.skeleton.getTransformMatrices(this), u = z.Vector3[0], f = z.Matrix[0], d = z.Matrix[1];\n let p = 0;\n for (let g = 0; g < i.length; g += 3, p += 4) {\n f.reset();\n let m, v;\n for (m = 0; m < 4; m++)\n v = a[p + m], v > 0 && (w.FromFloat32ArrayToRefScaled(h, Math.floor(s[p + m] * 16), v, d), f.addToSelf(d));\n if (o)\n for (m = 0; m < 4; m++)\n v = c[p + m], v > 0 && (w.FromFloat32ArrayToRefScaled(h, Math.floor(l[p + m] * 16), v, d), f.addToSelf(d));\n r === I.NormalKind ? _.TransformNormalFromFloatsToRef(i[g], i[g + 1], i[g + 2], f, u) : _.TransformCoordinatesFromFloatsToRef(i[g], i[g + 1], i[g + 2], f, u), u.toArray(i, g), r === I.PositionKind && this._positions && this._positions[g / 3].copyFrom(u);\n }\n }\n }\n return i;\n }\n /**\n * Get the normals vertex data and optionally apply skeleton and morphing.\n * @param applySkeleton defines whether to apply the skeleton\n * @param applyMorph defines whether to apply the morph target\n * @returns the normals data\n */\n getNormalsData(e = !1, t = !1) {\n return this._getData(e, t, null, I.NormalKind);\n }\n /**\n * Get the position vertex data and optionally apply skeleton and morphing.\n * @param applySkeleton defines whether to apply the skeleton\n * @param applyMorph defines whether to apply the morph target\n * @param data defines the position data to apply the skeleton and morph to\n * @returns the position data\n */\n getPositionData(e = !1, t = !1, i) {\n return this._getData(e, t, i, I.PositionKind);\n }\n /**\n * @internal\n */\n _getPositionData(e, t) {\n var r;\n let i = this.getVerticesData(I.PositionKind);\n if (this._internalAbstractMeshDataInfo._positions && (this._internalAbstractMeshDataInfo._positions = null), i && (e && this.skeleton || t && this.morphTargetManager)) {\n if (i = i.slice(), this._generatePointsArray(), this._positions) {\n const s = this._positions;\n this._internalAbstractMeshDataInfo._positions = new Array(s.length);\n for (let a = 0; a < s.length; a++)\n this._internalAbstractMeshDataInfo._positions[a] = ((r = s[a]) == null ? void 0 : r.clone()) || new _();\n }\n return this.getPositionData(e, t, i);\n }\n return i;\n }\n /** @internal */\n _updateBoundingInfo() {\n return this._boundingInfo ? this._boundingInfo.update(this.worldMatrixFromCache) : this._boundingInfo = new Cr(_.Zero(), _.Zero(), this.worldMatrixFromCache), this._updateSubMeshesBoundingInfo(this.worldMatrixFromCache), this;\n }\n /**\n * @internal\n */\n _updateSubMeshesBoundingInfo(e) {\n if (!this.subMeshes)\n return this;\n const t = this.subMeshes.length;\n for (let i = 0; i < t; i++) {\n const r = this.subMeshes[i];\n (t > 1 || !r.IsGlobal) && r.updateBoundingInfo(e);\n }\n return this;\n }\n /** @internal */\n _afterComputeWorldMatrix() {\n this.doNotSyncBoundingInfo || (this._boundingInfoIsDirty = !0);\n }\n /**\n * Returns `true` if the mesh is within the frustum defined by the passed array of planes.\n * A mesh is in the frustum if its bounding box intersects the frustum\n * @param frustumPlanes defines the frustum to test\n * @returns true if the mesh is in the frustum planes\n */\n isInFrustum(e) {\n return this.getBoundingInfo().isInFrustum(e, this.cullingStrategy);\n }\n /**\n * Returns `true` if the mesh is completely in the frustum defined be the passed array of planes.\n * A mesh is completely in the frustum if its bounding box it completely inside the frustum.\n * @param frustumPlanes defines the frustum to test\n * @returns true if the mesh is completely in the frustum planes\n */\n isCompletelyInFrustum(e) {\n return this.getBoundingInfo().isCompletelyInFrustum(e);\n }\n /**\n * True if the mesh intersects another mesh or a SolidParticle object\n * @param mesh defines a target mesh or SolidParticle to test\n * @param precise Unless the parameter `precise` is set to `true` the intersection is computed according to Axis Aligned Bounding Boxes (AABB), else according to OBB (Oriented BBoxes)\n * @param includeDescendants Can be set to true to test if the mesh defined in parameters intersects with the current mesh or any child meshes\n * @returns true if there is an intersection\n */\n intersectsMesh(e, t = !1, i) {\n const r = this.getBoundingInfo(), s = e.getBoundingInfo();\n if (r.intersects(s, t))\n return !0;\n if (i) {\n for (const a of this.getChildMeshes())\n if (a.intersectsMesh(e, t, !0))\n return !0;\n }\n return !1;\n }\n /**\n * Returns true if the passed point (Vector3) is inside the mesh bounding box\n * @param point defines the point to test\n * @returns true if there is an intersection\n */\n intersectsPoint(e) {\n return this.getBoundingInfo().intersectsPoint(e);\n }\n // Collisions\n /**\n * Gets or sets a boolean indicating that this mesh can be used in the collision engine\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\n */\n get checkCollisions() {\n return this._internalAbstractMeshDataInfo._meshCollisionData._checkCollisions;\n }\n set checkCollisions(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._checkCollisions = e;\n }\n /**\n * Gets Collider object used to compute collisions (not physics)\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\n */\n get collider() {\n return this._internalAbstractMeshDataInfo._meshCollisionData._collider;\n }\n /**\n * Move the mesh using collision engine\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\n * @param displacement defines the requested displacement vector\n * @returns the current mesh\n */\n moveWithCollisions(e) {\n this.getAbsolutePosition().addToRef(this.ellipsoidOffset, this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions);\n const i = this.getScene().collisionCoordinator;\n return this._internalAbstractMeshDataInfo._meshCollisionData._collider || (this._internalAbstractMeshDataInfo._meshCollisionData._collider = i.createCollider()), this._internalAbstractMeshDataInfo._meshCollisionData._collider._radius = this.ellipsoid, i.getNewPosition(this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions, e, this._internalAbstractMeshDataInfo._meshCollisionData._collider, this.collisionRetryCount, this, this._onCollisionPositionChange, this.uniqueId), this;\n }\n // Collisions\n /**\n * @internal\n */\n _collideForSubMesh(e, t, i) {\n var r;\n if (this._generatePointsArray(), !this._positions)\n return this;\n if (!e._lastColliderWorldVertices || !e._lastColliderTransformMatrix.equals(t)) {\n e._lastColliderTransformMatrix = t.clone(), e._lastColliderWorldVertices = [], e._trianglePlanes = [];\n const s = e.verticesStart, a = e.verticesStart + e.verticesCount;\n for (let o = s; o < a; o++)\n e._lastColliderWorldVertices.push(_.TransformCoordinates(this._positions[o], t));\n }\n return i._collide(e._trianglePlanes, e._lastColliderWorldVertices, this.getIndices(), e.indexStart, e.indexStart + e.indexCount, e.verticesStart, !!e.getMaterial(), this, this._shouldConvertRHS(), ((r = e.getMaterial()) == null ? void 0 : r.fillMode) === 7), this;\n }\n /**\n * @internal\n */\n _processCollisionsForSubMeshes(e, t) {\n const i = this._scene.getCollidingSubMeshCandidates(this, e), r = i.length;\n for (let s = 0; s < r; s++) {\n const a = i.data[s];\n r > 1 && !a._checkCollision(e) || this._collideForSubMesh(a, t, e);\n }\n return this;\n }\n /** @internal */\n _shouldConvertRHS() {\n return !1;\n }\n /**\n * @internal\n */\n _checkCollision(e) {\n if (!this.getBoundingInfo()._checkCollision(e))\n return this;\n const t = z.Matrix[0], i = z.Matrix[1];\n return w.ScalingToRef(1 / e._radius.x, 1 / e._radius.y, 1 / e._radius.z, t), this.worldMatrixFromCache.multiplyToRef(t, i), this._processCollisionsForSubMeshes(e, i), this;\n }\n // Picking\n /** @internal */\n _generatePointsArray() {\n return !1;\n }\n /**\n * Checks if the passed Ray intersects with the mesh. A mesh triangle can be picked both from its front and back sides,\n * irrespective of orientation.\n * @param ray defines the ray to use. It should be in the mesh's LOCAL coordinate space.\n * @param fastCheck defines if fast mode (but less precise) must be used (false by default)\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\n * @param worldToUse defines the world matrix to use to get the world coordinate of the intersection point\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\n * @returns the picking info\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\n */\n intersects(e, t, i, r = !1, s, a = !1) {\n const o = new ps(), l = this.getClassName(), c = l === \"InstancedLinesMesh\" || l === \"LinesMesh\" || l === \"GreasedLineMesh\" ? this.intersectionThreshold : 0, h = this.getBoundingInfo();\n if (!this.subMeshes || !a && (!e.intersectsSphere(h.boundingSphere, c) || !e.intersectsBox(h.boundingBox, c)))\n return o;\n if (r)\n return o.hit = !a, o.pickedMesh = a ? null : this, o.distance = a ? 0 : _.Distance(e.origin, h.boundingSphere.center), o.subMeshId = 0, o;\n if (!this._generatePointsArray())\n return o;\n let u = null;\n const f = this._scene.getIntersectingSubMeshCandidates(this, e), d = f.length;\n let p = !1;\n for (let g = 0; g < d; g++) {\n const v = f.data[g].getMaterial();\n if (v && (v.fillMode == 7 || v.fillMode == 0 || v.fillMode == 1 || v.fillMode == 2 || v.fillMode == 4)) {\n p = !0;\n break;\n }\n }\n if (!p)\n return o.hit = !0, o.pickedMesh = this, o.distance = _.Distance(e.origin, h.boundingSphere.center), o.subMeshId = -1, o;\n for (let g = 0; g < d; g++) {\n const m = f.data[g];\n if (d > 1 && !a && !m.canIntersects(e))\n continue;\n const v = m.intersects(e, this._positions, this.getIndices(), t, i);\n if (v && (t || !u || v.distance < u.distance) && (u = v, u.subMeshId = g, t))\n break;\n }\n if (u) {\n const g = s ?? this.getWorldMatrix(), m = z.Vector3[0], v = z.Vector3[1];\n _.TransformCoordinatesToRef(e.origin, g, m), e.direction.scaleToRef(u.distance, v);\n const C = _.TransformNormal(v, g).addInPlace(m);\n return o.hit = !0, o.distance = _.Distance(m, C), o.pickedPoint = C, o.pickedMesh = this, o.bu = u.bu || 0, o.bv = u.bv || 0, o.subMeshFaceId = u.faceId, o.faceId = u.faceId + f.data[u.subMeshId].indexStart / (this.getClassName().indexOf(\"LinesMesh\") !== -1 ? 2 : 3), o.subMeshId = u.subMeshId, o;\n }\n return o;\n }\n /**\n * Clones the current mesh\n * @param name defines the mesh name\n * @param newParent defines the new mesh parent\n * @param doNotCloneChildren defines a boolean indicating that children must not be cloned (false by default)\n * @returns the new mesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n clone(e, t, i) {\n return null;\n }\n /**\n * Disposes all the submeshes of the current meshnp\n * @returns the current mesh\n */\n releaseSubMeshes() {\n if (this.subMeshes)\n for (; this.subMeshes.length; )\n this.subMeshes[0].dispose();\n else\n this.subMeshes = [];\n return this;\n }\n /**\n * Releases resources associated with this abstract mesh.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n let i;\n const r = this.getScene();\n for (this._scene.useMaterialMeshMap && this._internalAbstractMeshDataInfo._material && this._internalAbstractMeshDataInfo._material.meshMap && (this._internalAbstractMeshDataInfo._material.meshMap[this.uniqueId] = void 0), r.freeActiveMeshes(), r.freeRenderingGroups(), r.renderingManager.maintainStateBetweenFrames && r.renderingManager.restoreDispachedFlags(), this.actionManager !== void 0 && this.actionManager !== null && (this._scene.meshes.some((o) => o !== this && o.actionManager === this.actionManager) || this.actionManager.dispose(), this.actionManager = null), this._internalAbstractMeshDataInfo._skeleton = null, this._transformMatrixTexture && (this._transformMatrixTexture.dispose(), this._transformMatrixTexture = null), i = 0; i < this._intersectionsInProgress.length; i++) {\n const o = this._intersectionsInProgress[i], l = o._intersectionsInProgress.indexOf(this);\n o._intersectionsInProgress.splice(l, 1);\n }\n this._intersectionsInProgress.length = 0, r.lights.forEach((o) => {\n let l = o.includedOnlyMeshes.indexOf(this);\n l !== -1 && o.includedOnlyMeshes.splice(l, 1), l = o.excludedMeshes.indexOf(this), l !== -1 && o.excludedMeshes.splice(l, 1);\n const c = o.getShadowGenerators();\n if (c) {\n const h = c.values();\n for (let u = h.next(); u.done !== !0; u = h.next()) {\n const d = u.value.getShadowMap();\n d && d.renderList && (l = d.renderList.indexOf(this), l !== -1 && d.renderList.splice(l, 1));\n }\n }\n }), (this.getClassName() !== \"InstancedMesh\" || this.getClassName() !== \"InstancedLinesMesh\") && this.releaseSubMeshes();\n const a = r.getEngine();\n if (this._occlusionQuery !== null && (this.isOcclusionQueryInProgress = !1, a.deleteQuery(this._occlusionQuery), this._occlusionQuery = null), a.wipeCaches(), r.removeMesh(this), this._parentContainer) {\n const o = this._parentContainer.meshes.indexOf(this);\n o > -1 && this._parentContainer.meshes.splice(o, 1), this._parentContainer = null;\n }\n if (t && this.material && (this.material.getClassName() === \"MultiMaterial\" ? this.material.dispose(!1, !0, !0) : this.material.dispose(!1, !0)), !e)\n for (i = 0; i < r.particleSystems.length; i++)\n r.particleSystems[i].emitter === this && (r.particleSystems[i].dispose(), i--);\n this._internalAbstractMeshDataInfo._facetData.facetDataEnabled && this.disableFacetData(), this._uniformBuffer.dispose(), this.onAfterWorldMatrixUpdateObservable.clear(), this.onCollideObservable.clear(), this.onCollisionPositionChangeObservable.clear(), this.onRebuildObservable.clear(), super.dispose(e, t);\n }\n /**\n * Adds the passed mesh as a child to the current mesh\n * @param mesh defines the child mesh\n * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.\n * @returns the current mesh\n */\n addChild(e, t = !1) {\n return e.setParent(this, t), this;\n }\n /**\n * Removes the passed mesh from the current mesh children list\n * @param mesh defines the child mesh\n * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.\n * @returns the current mesh\n */\n removeChild(e, t = !1) {\n return e.setParent(null, t), this;\n }\n // Facet data\n /** @internal */\n _initFacetData() {\n const e = this._internalAbstractMeshDataInfo._facetData;\n e.facetNormals || (e.facetNormals = []), e.facetPositions || (e.facetPositions = []), e.facetPartitioning || (e.facetPartitioning = new Array()), e.facetNb = this.getIndices().length / 3 | 0, e.partitioningSubdivisions = e.partitioningSubdivisions ? e.partitioningSubdivisions : 10, e.partitioningBBoxRatio = e.partitioningBBoxRatio ? e.partitioningBBoxRatio : 1.01;\n for (let t = 0; t < e.facetNb; t++)\n e.facetNormals[t] = _.Zero(), e.facetPositions[t] = _.Zero();\n return e.facetDataEnabled = !0, this;\n }\n /**\n * Updates the mesh facetData arrays and the internal partitioning when the mesh is morphed or updated.\n * This method can be called within the render loop.\n * You don't need to call this method by yourself in the render loop when you update/morph a mesh with the methods CreateXXX() as they automatically manage this computation\n * @returns the current mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n updateFacetData() {\n const e = this._internalAbstractMeshDataInfo._facetData;\n e.facetDataEnabled || this._initFacetData();\n const t = this.getVerticesData(I.PositionKind), i = this.getIndices(), r = this.getVerticesData(I.NormalKind), s = this.getBoundingInfo();\n if (e.facetDepthSort && !e.facetDepthSortEnabled) {\n if (e.facetDepthSortEnabled = !0, i instanceof Uint16Array)\n e.depthSortedIndices = new Uint16Array(i);\n else if (i instanceof Uint32Array)\n e.depthSortedIndices = new Uint32Array(i);\n else {\n let o = !1;\n for (let l = 0; l < i.length; l++)\n if (i[l] > 65535) {\n o = !0;\n break;\n }\n o ? e.depthSortedIndices = new Uint32Array(i) : e.depthSortedIndices = new Uint16Array(i);\n }\n if (e.facetDepthSortFunction = function(o, l) {\n return l.sqDistance - o.sqDistance;\n }, !e.facetDepthSortFrom) {\n const o = this.getScene().activeCamera;\n e.facetDepthSortFrom = o ? o.position : _.Zero();\n }\n e.depthSortedFacets = [];\n for (let o = 0; o < e.facetNb; o++) {\n const l = { ind: o * 3, sqDistance: 0 };\n e.depthSortedFacets.push(l);\n }\n e.invertedMatrix = w.Identity(), e.facetDepthSortOrigin = _.Zero();\n }\n e.bbSize.x = s.maximum.x - s.minimum.x > xt ? s.maximum.x - s.minimum.x : xt, e.bbSize.y = s.maximum.y - s.minimum.y > xt ? s.maximum.y - s.minimum.y : xt, e.bbSize.z = s.maximum.z - s.minimum.z > xt ? s.maximum.z - s.minimum.z : xt;\n let a = e.bbSize.x > e.bbSize.y ? e.bbSize.x : e.bbSize.y;\n if (a = a > e.bbSize.z ? a : e.bbSize.z, e.subDiv.max = e.partitioningSubdivisions, e.subDiv.X = Math.floor(e.subDiv.max * e.bbSize.x / a), e.subDiv.Y = Math.floor(e.subDiv.max * e.bbSize.y / a), e.subDiv.Z = Math.floor(e.subDiv.max * e.bbSize.z / a), e.subDiv.X = e.subDiv.X < 1 ? 1 : e.subDiv.X, e.subDiv.Y = e.subDiv.Y < 1 ? 1 : e.subDiv.Y, e.subDiv.Z = e.subDiv.Z < 1 ? 1 : e.subDiv.Z, e.facetParameters.facetNormals = this.getFacetLocalNormals(), e.facetParameters.facetPositions = this.getFacetLocalPositions(), e.facetParameters.facetPartitioning = this.getFacetLocalPartitioning(), e.facetParameters.bInfo = s, e.facetParameters.bbSize = e.bbSize, e.facetParameters.subDiv = e.subDiv, e.facetParameters.ratio = this.partitioningBBoxRatio, e.facetParameters.depthSort = e.facetDepthSort, e.facetDepthSort && e.facetDepthSortEnabled && (this.computeWorldMatrix(!0), this._worldMatrix.invertToRef(e.invertedMatrix), _.TransformCoordinatesToRef(e.facetDepthSortFrom, e.invertedMatrix, e.facetDepthSortOrigin), e.facetParameters.distanceTo = e.facetDepthSortOrigin), e.facetParameters.depthSortedFacets = e.depthSortedFacets, r && re.ComputeNormals(t, i, r, e.facetParameters), e.facetDepthSort && e.facetDepthSortEnabled) {\n e.depthSortedFacets.sort(e.facetDepthSortFunction);\n const o = e.depthSortedIndices.length / 3 | 0;\n for (let l = 0; l < o; l++) {\n const c = e.depthSortedFacets[l].ind;\n e.depthSortedIndices[l * 3] = i[c], e.depthSortedIndices[l * 3 + 1] = i[c + 1], e.depthSortedIndices[l * 3 + 2] = i[c + 2];\n }\n this.updateIndices(e.depthSortedIndices, void 0, !0);\n }\n return this;\n }\n /**\n * Returns the facetLocalNormals array.\n * The normals are expressed in the mesh local spac\n * @returns an array of Vector3\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetLocalNormals() {\n const e = this._internalAbstractMeshDataInfo._facetData;\n return e.facetNormals || this.updateFacetData(), e.facetNormals;\n }\n /**\n * Returns the facetLocalPositions array.\n * The facet positions are expressed in the mesh local space\n * @returns an array of Vector3\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetLocalPositions() {\n const e = this._internalAbstractMeshDataInfo._facetData;\n return e.facetPositions || this.updateFacetData(), e.facetPositions;\n }\n /**\n * Returns the facetLocalPartitioning array\n * @returns an array of array of numbers\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetLocalPartitioning() {\n const e = this._internalAbstractMeshDataInfo._facetData;\n return e.facetPartitioning || this.updateFacetData(), e.facetPartitioning;\n }\n /**\n * Returns the i-th facet position in the world system.\n * This method allocates a new Vector3 per call\n * @param i defines the facet index\n * @returns a new Vector3\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetPosition(e) {\n const t = _.Zero();\n return this.getFacetPositionToRef(e, t), t;\n }\n /**\n * Sets the reference Vector3 with the i-th facet position in the world system\n * @param i defines the facet index\n * @param ref defines the target vector\n * @returns the current mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetPositionToRef(e, t) {\n const i = this.getFacetLocalPositions()[e], r = this.getWorldMatrix();\n return _.TransformCoordinatesToRef(i, r, t), this;\n }\n /**\n * Returns the i-th facet normal in the world system.\n * This method allocates a new Vector3 per call\n * @param i defines the facet index\n * @returns a new Vector3\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetNormal(e) {\n const t = _.Zero();\n return this.getFacetNormalToRef(e, t), t;\n }\n /**\n * Sets the reference Vector3 with the i-th facet normal in the world system\n * @param i defines the facet index\n * @param ref defines the target vector\n * @returns the current mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetNormalToRef(e, t) {\n const i = this.getFacetLocalNormals()[e];\n return _.TransformNormalToRef(i, this.getWorldMatrix(), t), this;\n }\n /**\n * Returns the facets (in an array) in the same partitioning block than the one the passed coordinates are located (expressed in the mesh local system)\n * @param x defines x coordinate\n * @param y defines y coordinate\n * @param z defines z coordinate\n * @returns the array of facet indexes\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetsAtLocalCoordinates(e, t, i) {\n const r = this.getBoundingInfo(), s = this._internalAbstractMeshDataInfo._facetData, a = Math.floor((e - r.minimum.x * s.partitioningBBoxRatio) * s.subDiv.X * s.partitioningBBoxRatio / s.bbSize.x), o = Math.floor((t - r.minimum.y * s.partitioningBBoxRatio) * s.subDiv.Y * s.partitioningBBoxRatio / s.bbSize.y), l = Math.floor((i - r.minimum.z * s.partitioningBBoxRatio) * s.subDiv.Z * s.partitioningBBoxRatio / s.bbSize.z);\n return a < 0 || a > s.subDiv.max || o < 0 || o > s.subDiv.max || l < 0 || l > s.subDiv.max ? null : s.facetPartitioning[a + s.subDiv.max * o + s.subDiv.max * s.subDiv.max * l];\n }\n /**\n * Returns the closest mesh facet index at (x,y,z) World coordinates, null if not found\n * @param x defines x coordinate\n * @param y defines y coordinate\n * @param z defines z coordinate\n * @param projected sets as the (x,y,z) world projection on the facet\n * @param checkFace if true (default false), only the facet \"facing\" to (x,y,z) or only the ones \"turning their backs\", according to the parameter \"facing\" are returned\n * @param facing if facing and checkFace are true, only the facet \"facing\" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet \"turning their backs\" to (x, y, z) are returned : negative dot (x, y, z) * facet position\n * @returns the face index if found (or null instead)\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getClosestFacetAtCoordinates(e, t, i, r, s = !1, a = !0) {\n const o = this.getWorldMatrix(), l = z.Matrix[5];\n o.invertToRef(l);\n const c = z.Vector3[8];\n _.TransformCoordinatesFromFloatsToRef(e, t, i, l, c);\n const h = this.getClosestFacetAtLocalCoordinates(c.x, c.y, c.z, r, s, a);\n return r && _.TransformCoordinatesFromFloatsToRef(r.x, r.y, r.z, o, r), h;\n }\n /**\n * Returns the closest mesh facet index at (x,y,z) local coordinates, null if not found\n * @param x defines x coordinate\n * @param y defines y coordinate\n * @param z defines z coordinate\n * @param projected sets as the (x,y,z) local projection on the facet\n * @param checkFace if true (default false), only the facet \"facing\" to (x,y,z) or only the ones \"turning their backs\", according to the parameter \"facing\" are returned\n * @param facing if facing and checkFace are true, only the facet \"facing\" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet \"turning their backs\" to (x, y, z) are returned : negative dot (x, y, z) * facet position\n * @returns the face index if found (or null instead)\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getClosestFacetAtLocalCoordinates(e, t, i, r, s = !1, a = !0) {\n let o = null, l = 0, c = 0, h = 0, u = 0, f = 0, d = 0, p = 0, g = 0;\n const m = this.getFacetLocalPositions(), v = this.getFacetLocalNormals(), E = this.getFacetsAtLocalCoordinates(e, t, i);\n if (!E)\n return null;\n let C = Number.MAX_VALUE, T = C, R, x, S;\n for (let M = 0; M < E.length; M++)\n R = E[M], x = v[R], S = m[R], u = (e - S.x) * x.x + (t - S.y) * x.y + (i - S.z) * x.z, (!s || s && a && u >= 0 || s && !a && u <= 0) && (u = x.x * S.x + x.y * S.y + x.z * S.z, f = -(x.x * e + x.y * t + x.z * i - u) / (x.x * x.x + x.y * x.y + x.z * x.z), d = e + x.x * f, p = t + x.y * f, g = i + x.z * f, l = d - e, c = p - t, h = g - i, T = l * l + c * c + h * h, T < C && (C = T, o = R, r && (r.x = d, r.y = p, r.z = g)));\n return o;\n }\n /**\n * Returns the object \"parameter\" set with all the expected parameters for facetData computation by ComputeNormals()\n * @returns the parameters\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetDataParameters() {\n return this._internalAbstractMeshDataInfo._facetData.facetParameters;\n }\n /**\n * Disables the feature FacetData and frees the related memory\n * @returns the current mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n disableFacetData() {\n const e = this._internalAbstractMeshDataInfo._facetData;\n return e.facetDataEnabled && (e.facetDataEnabled = !1, e.facetPositions = [], e.facetNormals = [], e.facetPartitioning = new Array(), e.facetParameters = null, e.depthSortedIndices = new Uint32Array(0)), this;\n }\n /**\n * Updates the AbstractMesh indices array\n * @param indices defines the data source\n * @param offset defines the offset in the index buffer where to store the new data (can be null)\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\n * @returns the current mesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n updateIndices(e, t, i = !1) {\n return this;\n }\n /**\n * Creates new normals data for the mesh\n * @param updatable defines if the normal vertex buffer must be flagged as updatable\n * @returns the current mesh\n */\n createNormals(e) {\n const t = this.getVerticesData(I.PositionKind), i = this.getIndices();\n let r;\n return this.isVerticesDataPresent(I.NormalKind) ? r = this.getVerticesData(I.NormalKind) : r = [], re.ComputeNormals(t, i, r, { useRightHandedSystem: this.getScene().useRightHandedSystem }), this.setVerticesData(I.NormalKind, r, e), this;\n }\n /**\n * Align the mesh with a normal\n * @param normal defines the normal to use\n * @param upDirection can be used to redefined the up vector to use (will use the (0, 1, 0) by default)\n * @returns the current mesh\n */\n alignWithNormal(e, t) {\n t || (t = Ko.Y);\n const i = z.Vector3[0], r = z.Vector3[1];\n return _.CrossToRef(t, e, r), _.CrossToRef(e, r, i), this.rotationQuaternion ? Ce.RotationQuaternionFromAxisToRef(i, e, r, this.rotationQuaternion) : _.RotationFromAxisToRef(i, e, r, this.rotation), this;\n }\n /** @internal */\n _checkOcclusionQuery() {\n return !1;\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Disables the mesh edge rendering mode\n * @returns the currentAbstractMesh\n */\n disableEdgesRendering() {\n throw We(\"EdgesRenderer\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Enables the edge rendering mode on the mesh.\n * This mode makes the mesh edges visible\n * @param epsilon defines the maximal distance between two angles to detect a face\n * @param checkVerticesInsteadOfIndices indicates that we should check vertex list directly instead of faces\n * @param options options to the edge renderer\n * @returns the currentAbstractMesh\n * @see https://www.babylonjs-playground.com/#19O9TU#0\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n enableEdgesRendering(e, t, i) {\n throw We(\"EdgesRenderer\");\n }\n /**\n * This function returns all of the particle systems in the scene that use the mesh as an emitter.\n * @returns an array of particle systems in the scene that use the mesh as an emitter\n */\n getConnectedParticleSystems() {\n return this._scene.particleSystems.filter((e) => e.emitter === this);\n }\n}\ner.OCCLUSION_TYPE_NONE = 0;\ner.OCCLUSION_TYPE_OPTIMISTIC = 1;\ner.OCCLUSION_TYPE_STRICT = 2;\ner.OCCLUSION_ALGORITHM_TYPE_ACCURATE = 0;\ner.OCCLUSION_ALGORITHM_TYPE_CONSERVATIVE = 1;\ner.CULLINGSTRATEGY_STANDARD = 0;\ner.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY = 1;\ner.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION = 2;\ner.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY = 3;\nRe(\"BABYLON.AbstractMesh\", er);\nObject.defineProperty(er.prototype, \"decalMap\", {\n get: function() {\n return this._decalMap;\n },\n set: function(n) {\n this._decalMap = n;\n },\n enumerable: !0,\n configurable: !0\n});\nclass ir {\n /**\n * Gets or sets a boolean indicating if entire scene must be loaded even if scene contains incremental data\n */\n static get ForceFullSceneLoadingForIncremental() {\n return ir._ForceFullSceneLoadingForIncremental;\n }\n static set ForceFullSceneLoadingForIncremental(e) {\n ir._ForceFullSceneLoadingForIncremental = e;\n }\n /**\n * Gets or sets a boolean indicating if loading screen must be displayed while loading a scene\n */\n static get ShowLoadingScreen() {\n return ir._ShowLoadingScreen;\n }\n static set ShowLoadingScreen(e) {\n ir._ShowLoadingScreen = e;\n }\n /**\n * Defines the current logging level (while loading the scene)\n * @ignorenaming\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static get loggingLevel() {\n return ir._LoggingLevel;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static set loggingLevel(e) {\n ir._LoggingLevel = e;\n }\n /**\n * Gets or set a boolean indicating if matrix weights must be cleaned upon loading\n */\n static get CleanBoneMatrixWeights() {\n return ir._CleanBoneMatrixWeights;\n }\n static set CleanBoneMatrixWeights(e) {\n ir._CleanBoneMatrixWeights = e;\n }\n}\nir._ForceFullSceneLoadingForIncremental = !1;\nir._ShowLoadingScreen = !0;\nir._CleanBoneMatrixWeights = !1;\nir._LoggingLevel = 0;\nclass nt {\n}\nnt.UseOpenGLOrientationForUV = !1;\nlet is = class na {\n /**\n * Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y\n */\n get boundingBias() {\n return this._boundingBias;\n }\n /**\n * Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y\n */\n set boundingBias(e) {\n this._boundingBias ? this._boundingBias.copyFrom(e) : this._boundingBias = e.clone(), this._updateBoundingInfo(!0, null);\n }\n /**\n * Static function used to attach a new empty geometry to a mesh\n * @param mesh defines the mesh to attach the geometry to\n * @returns the new Geometry\n */\n static CreateGeometryForMesh(e) {\n const t = new na(na.RandomId(), e.getScene());\n return t.applyToMesh(e), t;\n }\n /** Get the list of meshes using this geometry */\n get meshes() {\n return this._meshes;\n }\n /**\n * Creates a new geometry\n * @param id defines the unique ID\n * @param scene defines the hosting scene\n * @param vertexData defines the VertexData used to get geometry data\n * @param updatable defines if geometry must be updatable (false by default)\n * @param mesh defines the mesh that will be associated with the geometry\n */\n constructor(e, t, i, r = !1, s = null) {\n this.delayLoadState = 0, this._totalVertices = 0, this._isDisposed = !1, this._indexBufferIsUpdatable = !1, this._positionsCache = [], this._parentContainer = null, this.useBoundingInfoFromGeometry = !1, this._scene = t || st.LastCreatedScene, this._scene && (this.id = e, this.uniqueId = this._scene.getUniqueId(), this._engine = this._scene.getEngine(), this._meshes = [], this._vertexBuffers = {}, this._indices = [], this._updatable = r, i ? this.setAllVerticesData(i, r) : this._totalVertices = 0, this._engine.getCaps().vertexArrayObject && (this._vertexArrayObjects = {}), s && (this.applyToMesh(s), s.computeWorldMatrix(!0)));\n }\n /**\n * Gets the current extend of the geometry\n */\n get extend() {\n return this._extend;\n }\n /**\n * Gets the hosting scene\n * @returns the hosting Scene\n */\n getScene() {\n return this._scene;\n }\n /**\n * Gets the hosting engine\n * @returns the hosting Engine\n */\n getEngine() {\n return this._engine;\n }\n /**\n * Defines if the geometry is ready to use\n * @returns true if the geometry is ready to be used\n */\n isReady() {\n return this.delayLoadState === 1 || this.delayLoadState === 0;\n }\n /**\n * Gets a value indicating that the geometry should not be serialized\n */\n get doNotSerialize() {\n for (let e = 0; e < this._meshes.length; e++)\n if (!this._meshes[e].doNotSerialize)\n return !1;\n return !0;\n }\n /** @internal */\n _rebuild() {\n this._vertexArrayObjects && (this._vertexArrayObjects = {}), this._meshes.length !== 0 && this._indices && (this._indexBuffer = this._engine.createIndexBuffer(this._indices, this._updatable, \"Geometry_\" + this.id + \"_IndexBuffer\"));\n const e = /* @__PURE__ */ new Set();\n for (const t in this._vertexBuffers)\n e.add(this._vertexBuffers[t].getWrapperBuffer());\n e.forEach((t) => {\n t._rebuild();\n });\n }\n /**\n * Affects all geometry data in one call\n * @param vertexData defines the geometry data\n * @param updatable defines if the geometry must be flagged as updatable (false as default)\n */\n setAllVerticesData(e, t) {\n e.applyToGeometry(this, t), this._notifyUpdate();\n }\n /**\n * Set specific vertex data\n * @param kind defines the data kind (Position, normal, etc...)\n * @param data defines the vertex data to use\n * @param updatable defines if the vertex must be flagged as updatable (false as default)\n * @param stride defines the stride to use (0 by default). This value is deduced from the kind value if not specified\n */\n setVerticesData(e, t, i = !1, r) {\n i && Array.isArray(t) && (t = new Float32Array(t));\n const s = new I(this._engine, t, e, {\n updatable: i,\n postponeInternalCreation: this._meshes.length === 0,\n stride: r,\n label: \"Geometry_\" + this.id + \"_\" + e\n });\n this.setVerticesBuffer(s);\n }\n /**\n * Removes a specific vertex data\n * @param kind defines the data kind (Position, normal, etc...)\n */\n removeVerticesData(e) {\n this._vertexBuffers[e] && (this._vertexBuffers[e].dispose(), delete this._vertexBuffers[e]), this._vertexArrayObjects && this._disposeVertexArrayObjects();\n }\n /**\n * Affect a vertex buffer to the geometry. the vertexBuffer.getKind() function is used to determine where to store the data\n * @param buffer defines the vertex buffer to use\n * @param totalVertices defines the total number of vertices for position kind (could be null)\n * @param disposeExistingBuffer disposes the existing buffer, if any (default: true)\n */\n setVerticesBuffer(e, t = null, i = !0) {\n const r = e.getKind();\n this._vertexBuffers[r] && i && this._vertexBuffers[r].dispose(), e._buffer && e._buffer._increaseReferences(), this._vertexBuffers[r] = e;\n const s = this._meshes, a = s.length;\n if (r === I.PositionKind) {\n this._totalVertices = t ?? e._maxVerticesCount, this._updateExtend(e.getFloatData(this._totalVertices)), this._resetPointsArrayCache();\n const o = this._extend && this._extend.minimum || new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE), l = this._extend && this._extend.maximum || new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n for (let c = 0; c < a; c++) {\n const h = s[c];\n h.buildBoundingInfo(o, l), h._createGlobalSubMesh(h.isUnIndexed), h.computeWorldMatrix(!0), h.synchronizeInstances();\n }\n }\n this._notifyUpdate(r);\n }\n /**\n * Update a specific vertex buffer\n * This function will directly update the underlying DataBuffer according to the passed numeric array or Float32Array\n * It will do nothing if the buffer is not updatable\n * @param kind defines the data kind (Position, normal, etc...)\n * @param data defines the data to use\n * @param offset defines the offset in the target buffer where to store the data\n * @param useBytes set to true if the offset is in bytes\n */\n updateVerticesDataDirectly(e, t, i, r = !1) {\n const s = this.getVertexBuffer(e);\n s && (s.updateDirectly(t, i, r), this._notifyUpdate(e));\n }\n /**\n * Update a specific vertex buffer\n * This function will create a new buffer if the current one is not updatable\n * @param kind defines the data kind (Position, normal, etc...)\n * @param data defines the data to use\n * @param updateExtends defines if the geometry extends must be recomputed (false by default)\n */\n updateVerticesData(e, t, i = !1) {\n const r = this.getVertexBuffer(e);\n r && (r.update(t), e === I.PositionKind && this._updateBoundingInfo(i, t), this._notifyUpdate(e));\n }\n _updateBoundingInfo(e, t) {\n if (e && this._updateExtend(t), this._resetPointsArrayCache(), e) {\n const i = this._meshes;\n for (const r of i) {\n r.hasBoundingInfo ? r.getBoundingInfo().reConstruct(this._extend.minimum, this._extend.maximum) : r.buildBoundingInfo(this._extend.minimum, this._extend.maximum);\n const s = r.subMeshes;\n for (const a of s)\n a.refreshBoundingInfo();\n }\n }\n }\n /**\n * @internal\n */\n _bind(e, t, i, r) {\n if (!e)\n return;\n t === void 0 && (t = this._indexBuffer);\n const s = this.getVertexBuffers();\n if (!s)\n return;\n if (t != this._indexBuffer || !this._vertexArrayObjects && !r) {\n this._engine.bindBuffers(s, t, e, i);\n return;\n }\n const a = r || this._vertexArrayObjects;\n a[e.key] || (a[e.key] = this._engine.recordVertexArrayObject(s, t, e, i)), this._engine.bindVertexArrayObject(a[e.key], t);\n }\n /**\n * Gets total number of vertices\n * @returns the total number of vertices\n */\n getTotalVertices() {\n return this.isReady() ? this._totalVertices : 0;\n }\n /**\n * Gets a specific vertex data attached to this geometry. Float data is constructed if the vertex buffer data cannot be returned directly.\n * @param kind defines the data kind (Position, normal, etc...)\n * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\n * @returns a float array containing vertex data\n */\n getVerticesData(e, t, i) {\n const r = this.getVertexBuffer(e);\n return r ? r.getFloatData(this._totalVertices, i || t && this._meshes.length !== 1) : null;\n }\n /**\n * Returns a boolean defining if the vertex data for the requested `kind` is updatable\n * @param kind defines the data kind (Position, normal, etc...)\n * @returns true if the vertex buffer with the specified kind is updatable\n */\n isVertexBufferUpdatable(e) {\n const t = this._vertexBuffers[e];\n return t ? t.isUpdatable() : !1;\n }\n /**\n * Gets a specific vertex buffer\n * @param kind defines the data kind (Position, normal, etc...)\n * @returns a VertexBuffer\n */\n getVertexBuffer(e) {\n return this.isReady() ? this._vertexBuffers[e] : null;\n }\n /**\n * Returns all vertex buffers\n * @returns an object holding all vertex buffers indexed by kind\n */\n getVertexBuffers() {\n return this.isReady() ? this._vertexBuffers : null;\n }\n /**\n * Gets a boolean indicating if specific vertex buffer is present\n * @param kind defines the data kind (Position, normal, etc...)\n * @returns true if data is present\n */\n isVerticesDataPresent(e) {\n return this._vertexBuffers ? this._vertexBuffers[e] !== void 0 : this._delayInfo ? this._delayInfo.indexOf(e) !== -1 : !1;\n }\n /**\n * Gets a list of all attached data kinds (Position, normal, etc...)\n * @returns a list of string containing all kinds\n */\n getVerticesDataKinds() {\n const e = [];\n let t;\n if (!this._vertexBuffers && this._delayInfo)\n for (t in this._delayInfo)\n e.push(t);\n else\n for (t in this._vertexBuffers)\n e.push(t);\n return e;\n }\n /**\n * Update index buffer\n * @param indices defines the indices to store in the index buffer\n * @param offset defines the offset in the target buffer where to store the data\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\n */\n updateIndices(e, t, i = !1) {\n if (this._indexBuffer)\n if (!this._indexBufferIsUpdatable)\n this.setIndices(e, null, !0);\n else {\n const r = e.length !== this._indices.length;\n if (i || (this._indices = e.slice()), this._engine.updateDynamicIndexBuffer(this._indexBuffer, e, t), r)\n for (const s of this._meshes)\n s._createGlobalSubMesh(!0);\n }\n }\n /**\n * Sets the index buffer for this geometry.\n * @param indexBuffer Defines the index buffer to use for this geometry\n * @param totalVertices Defines the total number of vertices used by the buffer\n * @param totalIndices Defines the total number of indices in the index buffer\n */\n setIndexBuffer(e, t, i) {\n this._indices = [], this._indexBufferIsUpdatable = !1, this._indexBuffer = e, this._totalVertices = t, this._totalIndices = i, e.is32Bits || (e.is32Bits = this._totalIndices > 65535);\n for (const r of this._meshes)\n r._createGlobalSubMesh(!0), r.synchronizeInstances();\n this._notifyUpdate();\n }\n /**\n * Creates a new index buffer\n * @param indices defines the indices to store in the index buffer\n * @param totalVertices defines the total number of vertices (could be null)\n * @param updatable defines if the index buffer must be flagged as updatable (false by default)\n */\n setIndices(e, t = null, i = !1) {\n this._indexBuffer && this._engine._releaseBuffer(this._indexBuffer), this._indices = e, this._indexBufferIsUpdatable = i, this._meshes.length !== 0 && this._indices && (this._indexBuffer = this._engine.createIndexBuffer(this._indices, i, \"Geometry_\" + this.id + \"_IndexBuffer\")), t != null && (this._totalVertices = t);\n for (const r of this._meshes)\n r._createGlobalSubMesh(!0), r.synchronizeInstances();\n this._notifyUpdate();\n }\n /**\n * Return the total number of indices\n * @returns the total number of indices\n */\n getTotalIndices() {\n return this.isReady() ? this._totalIndices !== void 0 ? this._totalIndices : this._indices.length : 0;\n }\n /**\n * Gets the index buffer array\n * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\n * @returns the index buffer array\n */\n getIndices(e, t) {\n if (!this.isReady())\n return null;\n const i = this._indices;\n return !t && (!e || this._meshes.length === 1) ? i : i.slice();\n }\n /**\n * Gets the index buffer\n * @returns the index buffer\n */\n getIndexBuffer() {\n return this.isReady() ? this._indexBuffer : null;\n }\n /**\n * @internal\n */\n _releaseVertexArrayObject(e = null) {\n !e || !this._vertexArrayObjects || this._vertexArrayObjects[e.key] && (this._engine.releaseVertexArrayObject(this._vertexArrayObjects[e.key]), delete this._vertexArrayObjects[e.key]);\n }\n /**\n * Release the associated resources for a specific mesh\n * @param mesh defines the source mesh\n * @param shouldDispose defines if the geometry must be disposed if there is no more mesh pointing to it\n */\n releaseForMesh(e, t) {\n const i = this._meshes, r = i.indexOf(e);\n r !== -1 && (i.splice(r, 1), this._vertexArrayObjects && e._invalidateInstanceVertexArrayObject(), e._geometry = null, i.length === 0 && t && this.dispose());\n }\n /**\n * Apply current geometry to a given mesh\n * @param mesh defines the mesh to apply geometry to\n */\n applyToMesh(e) {\n if (e._geometry === this)\n return;\n const t = e._geometry;\n t && t.releaseForMesh(e), this._vertexArrayObjects && e._invalidateInstanceVertexArrayObject();\n const i = this._meshes;\n e._geometry = this, e._internalAbstractMeshDataInfo._positions = null, this._scene.pushGeometry(this), i.push(e), this.isReady() ? this._applyToMesh(e) : this._boundingInfo && e.setBoundingInfo(this._boundingInfo);\n }\n _updateExtend(e = null) {\n if (this.useBoundingInfoFromGeometry && this._boundingInfo)\n this._extend = {\n minimum: this._boundingInfo.minimum.clone(),\n maximum: this._boundingInfo.maximum.clone()\n };\n else {\n if (!e && (e = this.getVerticesData(I.PositionKind), !e))\n return;\n this._extend = _o(e, 0, this._totalVertices, this.boundingBias, 3);\n }\n }\n _applyToMesh(e) {\n const t = this._meshes.length;\n for (const i in this._vertexBuffers)\n t === 1 && this._vertexBuffers[i].create(), i === I.PositionKind && (this._extend || this._updateExtend(), e.buildBoundingInfo(this._extend.minimum, this._extend.maximum), e._createGlobalSubMesh(e.isUnIndexed), e._updateBoundingInfo());\n t === 1 && this._indices && this._indices.length > 0 && (this._indexBuffer = this._engine.createIndexBuffer(this._indices, this._updatable, \"Geometry_\" + this.id + \"_IndexBuffer\")), e._syncGeometryWithMorphTargetManager(), e.synchronizeInstances();\n }\n _notifyUpdate(e) {\n this.onGeometryUpdated && this.onGeometryUpdated(this, e), this._vertexArrayObjects && this._disposeVertexArrayObjects();\n for (const t of this._meshes)\n t._markSubMeshesAsAttributesDirty();\n }\n /**\n * Load the geometry if it was flagged as delay loaded\n * @param scene defines the hosting scene\n * @param onLoaded defines a callback called when the geometry is loaded\n */\n load(e, t) {\n if (this.delayLoadState !== 2) {\n if (this.isReady()) {\n t && t();\n return;\n }\n this.delayLoadState = 2, this._queueLoad(e, t);\n }\n }\n _queueLoad(e, t) {\n this.delayLoadingFile && (e.addPendingData(this), e._loadFile(this.delayLoadingFile, (i) => {\n if (!this._delayLoadingFunction)\n return;\n this._delayLoadingFunction(JSON.parse(i), this), this.delayLoadState = 1, this._delayInfo = [], e.removePendingData(this);\n const r = this._meshes, s = r.length;\n for (let a = 0; a < s; a++)\n this._applyToMesh(r[a]);\n t && t();\n }, void 0, !0));\n }\n /**\n * Invert the geometry to move from a right handed system to a left handed one.\n */\n toLeftHanded() {\n const e = this.getIndices(!1);\n if (e != null && e.length > 0) {\n for (let r = 0; r < e.length; r += 3) {\n const s = e[r + 0];\n e[r + 0] = e[r + 2], e[r + 2] = s;\n }\n this.setIndices(e);\n }\n const t = this.getVerticesData(I.PositionKind, !1);\n if (t != null && t.length > 0) {\n for (let r = 0; r < t.length; r += 3)\n t[r + 2] = -t[r + 2];\n this.setVerticesData(I.PositionKind, t, !1);\n }\n const i = this.getVerticesData(I.NormalKind, !1);\n if (i != null && i.length > 0) {\n for (let r = 0; r < i.length; r += 3)\n i[r + 2] = -i[r + 2];\n this.setVerticesData(I.NormalKind, i, !1);\n }\n }\n // Cache\n /** @internal */\n _resetPointsArrayCache() {\n this._positions = null;\n }\n /** @internal */\n _generatePointsArray() {\n if (this._positions)\n return !0;\n const e = this.getVerticesData(I.PositionKind);\n if (!e || e.length === 0)\n return !1;\n for (let t = this._positionsCache.length * 3, i = this._positionsCache.length; t < e.length; t += 3, ++i)\n this._positionsCache[i] = _.FromArray(e, t);\n for (let t = 0, i = 0; t < e.length; t += 3, ++i)\n this._positionsCache[i].set(e[0 + t], e[1 + t], e[2 + t]);\n return this._positionsCache.length = e.length / 3, this._positions = this._positionsCache, !0;\n }\n /**\n * Gets a value indicating if the geometry is disposed\n * @returns true if the geometry was disposed\n */\n isDisposed() {\n return this._isDisposed;\n }\n _disposeVertexArrayObjects() {\n if (this._vertexArrayObjects) {\n for (const i in this._vertexArrayObjects)\n this._engine.releaseVertexArrayObject(this._vertexArrayObjects[i]);\n this._vertexArrayObjects = {};\n const e = this._meshes, t = e.length;\n for (let i = 0; i < t; i++)\n e[i]._invalidateInstanceVertexArrayObject();\n }\n }\n /**\n * Free all associated resources\n */\n dispose() {\n const e = this._meshes, t = e.length;\n let i;\n for (i = 0; i < t; i++)\n this.releaseForMesh(e[i]);\n this._meshes.length = 0, this._disposeVertexArrayObjects();\n for (const r in this._vertexBuffers)\n this._vertexBuffers[r].dispose();\n if (this._vertexBuffers = {}, this._totalVertices = 0, this._indexBuffer && this._engine._releaseBuffer(this._indexBuffer), this._indexBuffer = null, this._indices = [], this.delayLoadState = 0, this.delayLoadingFile = null, this._delayLoadingFunction = null, this._delayInfo = [], this._boundingInfo = null, this._scene.removeGeometry(this), this._parentContainer) {\n const r = this._parentContainer.geometries.indexOf(this);\n r > -1 && this._parentContainer.geometries.splice(r, 1), this._parentContainer = null;\n }\n this._isDisposed = !0;\n }\n /**\n * Clone the current geometry into a new geometry\n * @param id defines the unique ID of the new geometry\n * @returns a new geometry object\n */\n copy(e) {\n const t = new re();\n t.indices = [];\n const i = this.getIndices();\n if (i)\n for (let l = 0; l < i.length; l++)\n t.indices.push(i[l]);\n let r = !1, s = !1, a;\n for (a in this._vertexBuffers) {\n const l = this.getVerticesData(a);\n if (l && (l instanceof Float32Array ? t.set(new Float32Array(l), a) : t.set(l.slice(0), a), !s)) {\n const c = this.getVertexBuffer(a);\n c && (r = c.isUpdatable(), s = !r);\n }\n }\n const o = new na(e, this._scene, t, r);\n o.delayLoadState = this.delayLoadState, o.delayLoadingFile = this.delayLoadingFile, o._delayLoadingFunction = this._delayLoadingFunction;\n for (a in this._delayInfo)\n o._delayInfo = o._delayInfo || [], o._delayInfo.push(a);\n return o._boundingInfo = new Cr(this._extend.minimum, this._extend.maximum), o;\n }\n /**\n * Serialize the current geometry info (and not the vertices data) into a JSON object\n * @returns a JSON representation of the current geometry data (without the vertices data)\n */\n serialize() {\n const e = {};\n return e.id = this.id, e.uniqueId = this.uniqueId, e.updatable = this._updatable, rt && rt.HasTags(this) && (e.tags = rt.GetTags(this)), e;\n }\n _toNumberArray(e) {\n return Array.isArray(e) ? e : Array.prototype.slice.call(e);\n }\n /**\n * Release any memory retained by the cached data on the Geometry.\n *\n * Call this function to reduce memory footprint of the mesh.\n * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly)\n */\n clearCachedData() {\n this._indices = [], this._resetPointsArrayCache();\n for (const e in this._vertexBuffers)\n Object.prototype.hasOwnProperty.call(this._vertexBuffers, e) && (this._vertexBuffers[e]._buffer._data = null);\n }\n /**\n * Serialize all vertices data into a JSON object\n * @returns a JSON representation of the current geometry data\n */\n serializeVerticeData() {\n const e = this.serialize();\n return this.isVerticesDataPresent(I.PositionKind) && (e.positions = this._toNumberArray(this.getVerticesData(I.PositionKind)), this.isVertexBufferUpdatable(I.PositionKind) && (e.positions._updatable = !0)), this.isVerticesDataPresent(I.NormalKind) && (e.normals = this._toNumberArray(this.getVerticesData(I.NormalKind)), this.isVertexBufferUpdatable(I.NormalKind) && (e.normals._updatable = !0)), this.isVerticesDataPresent(I.TangentKind) && (e.tangents = this._toNumberArray(this.getVerticesData(I.TangentKind)), this.isVertexBufferUpdatable(I.TangentKind) && (e.tangents._updatable = !0)), this.isVerticesDataPresent(I.UVKind) && (e.uvs = this._toNumberArray(this.getVerticesData(I.UVKind)), this.isVertexBufferUpdatable(I.UVKind) && (e.uvs._updatable = !0)), this.isVerticesDataPresent(I.UV2Kind) && (e.uvs2 = this._toNumberArray(this.getVerticesData(I.UV2Kind)), this.isVertexBufferUpdatable(I.UV2Kind) && (e.uvs2._updatable = !0)), this.isVerticesDataPresent(I.UV3Kind) && (e.uvs3 = this._toNumberArray(this.getVerticesData(I.UV3Kind)), this.isVertexBufferUpdatable(I.UV3Kind) && (e.uvs3._updatable = !0)), this.isVerticesDataPresent(I.UV4Kind) && (e.uvs4 = this._toNumberArray(this.getVerticesData(I.UV4Kind)), this.isVertexBufferUpdatable(I.UV4Kind) && (e.uvs4._updatable = !0)), this.isVerticesDataPresent(I.UV5Kind) && (e.uvs5 = this._toNumberArray(this.getVerticesData(I.UV5Kind)), this.isVertexBufferUpdatable(I.UV5Kind) && (e.uvs5._updatable = !0)), this.isVerticesDataPresent(I.UV6Kind) && (e.uvs6 = this._toNumberArray(this.getVerticesData(I.UV6Kind)), this.isVertexBufferUpdatable(I.UV6Kind) && (e.uvs6._updatable = !0)), this.isVerticesDataPresent(I.ColorKind) && (e.colors = this._toNumberArray(this.getVerticesData(I.ColorKind)), this.isVertexBufferUpdatable(I.ColorKind) && (e.colors._updatable = !0)), this.isVerticesDataPresent(I.MatricesIndicesKind) && (e.matricesIndices = this._toNumberArray(this.getVerticesData(I.MatricesIndicesKind)), e.matricesIndices._isExpanded = !0, this.isVertexBufferUpdatable(I.MatricesIndicesKind) && (e.matricesIndices._updatable = !0)), this.isVerticesDataPresent(I.MatricesWeightsKind) && (e.matricesWeights = this._toNumberArray(this.getVerticesData(I.MatricesWeightsKind)), this.isVertexBufferUpdatable(I.MatricesWeightsKind) && (e.matricesWeights._updatable = !0)), e.indices = this._toNumberArray(this.getIndices()), e;\n }\n // Statics\n /**\n * Extracts a clone of a mesh geometry\n * @param mesh defines the source mesh\n * @param id defines the unique ID of the new geometry object\n * @returns the new geometry object\n */\n static ExtractFromMesh(e, t) {\n const i = e._geometry;\n return i ? i.copy(t) : null;\n }\n /**\n * You should now use Tools.RandomId(), this method is still here for legacy reasons.\n * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523\n * Be aware Math.random() could cause collisions, but:\n * \"All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide\"\n * @returns a string containing a new GUID\n */\n static RandomId() {\n return ge.RandomId();\n }\n static _GetGeometryByLoadedUniqueId(e, t) {\n for (let i = 0; i < t.geometries.length; i++)\n if (t.geometries[i]._loadedUniqueId === e)\n return t.geometries[i];\n return null;\n }\n /**\n * @internal\n */\n static _ImportGeometry(e, t) {\n const i = t.getScene(), r = e.geometryUniqueId, s = e.geometryId;\n if (r || s) {\n const a = r ? this._GetGeometryByLoadedUniqueId(r, i) : i.getGeometryById(s);\n a && a.applyToMesh(t);\n } else if (e instanceof ArrayBuffer) {\n const a = t._binaryInfo;\n if (a.positionsAttrDesc && a.positionsAttrDesc.count > 0) {\n const o = new Float32Array(e, a.positionsAttrDesc.offset, a.positionsAttrDesc.count);\n t.setVerticesData(I.PositionKind, o, !1);\n }\n if (a.normalsAttrDesc && a.normalsAttrDesc.count > 0) {\n const o = new Float32Array(e, a.normalsAttrDesc.offset, a.normalsAttrDesc.count);\n t.setVerticesData(I.NormalKind, o, !1);\n }\n if (a.tangetsAttrDesc && a.tangetsAttrDesc.count > 0) {\n const o = new Float32Array(e, a.tangetsAttrDesc.offset, a.tangetsAttrDesc.count);\n t.setVerticesData(I.TangentKind, o, !1);\n }\n if (a.uvsAttrDesc && a.uvsAttrDesc.count > 0) {\n const o = new Float32Array(e, a.uvsAttrDesc.offset, a.uvsAttrDesc.count);\n if (nt.UseOpenGLOrientationForUV)\n for (let l = 1; l < o.length; l += 2)\n o[l] = 1 - o[l];\n t.setVerticesData(I.UVKind, o, !1);\n }\n if (a.uvs2AttrDesc && a.uvs2AttrDesc.count > 0) {\n const o = new Float32Array(e, a.uvs2AttrDesc.offset, a.uvs2AttrDesc.count);\n if (nt.UseOpenGLOrientationForUV)\n for (let l = 1; l < o.length; l += 2)\n o[l] = 1 - o[l];\n t.setVerticesData(I.UV2Kind, o, !1);\n }\n if (a.uvs3AttrDesc && a.uvs3AttrDesc.count > 0) {\n const o = new Float32Array(e, a.uvs3AttrDesc.offset, a.uvs3AttrDesc.count);\n if (nt.UseOpenGLOrientationForUV)\n for (let l = 1; l < o.length; l += 2)\n o[l] = 1 - o[l];\n t.setVerticesData(I.UV3Kind, o, !1);\n }\n if (a.uvs4AttrDesc && a.uvs4AttrDesc.count > 0) {\n const o = new Float32Array(e, a.uvs4AttrDesc.offset, a.uvs4AttrDesc.count);\n if (nt.UseOpenGLOrientationForUV)\n for (let l = 1; l < o.length; l += 2)\n o[l] = 1 - o[l];\n t.setVerticesData(I.UV4Kind, o, !1);\n }\n if (a.uvs5AttrDesc && a.uvs5AttrDesc.count > 0) {\n const o = new Float32Array(e, a.uvs5AttrDesc.offset, a.uvs5AttrDesc.count);\n if (nt.UseOpenGLOrientationForUV)\n for (let l = 1; l < o.length; l += 2)\n o[l] = 1 - o[l];\n t.setVerticesData(I.UV5Kind, o, !1);\n }\n if (a.uvs6AttrDesc && a.uvs6AttrDesc.count > 0) {\n const o = new Float32Array(e, a.uvs6AttrDesc.offset, a.uvs6AttrDesc.count);\n if (nt.UseOpenGLOrientationForUV)\n for (let l = 1; l < o.length; l += 2)\n o[l] = 1 - o[l];\n t.setVerticesData(I.UV6Kind, o, !1);\n }\n if (a.colorsAttrDesc && a.colorsAttrDesc.count > 0) {\n const o = new Float32Array(e, a.colorsAttrDesc.offset, a.colorsAttrDesc.count);\n t.setVerticesData(I.ColorKind, o, !1, a.colorsAttrDesc.stride);\n }\n if (a.matricesIndicesAttrDesc && a.matricesIndicesAttrDesc.count > 0) {\n const o = new Int32Array(e, a.matricesIndicesAttrDesc.offset, a.matricesIndicesAttrDesc.count), l = [];\n for (let c = 0; c < o.length; c++) {\n const h = o[c];\n l.push(h & 255), l.push((h & 65280) >> 8), l.push((h & 16711680) >> 16), l.push(h >> 24 & 255);\n }\n t.setVerticesData(I.MatricesIndicesKind, l, !1);\n }\n if (a.matricesIndicesExtraAttrDesc && a.matricesIndicesExtraAttrDesc.count > 0) {\n const o = new Int32Array(e, a.matricesIndicesExtraAttrDesc.offset, a.matricesIndicesExtraAttrDesc.count), l = [];\n for (let c = 0; c < o.length; c++) {\n const h = o[c];\n l.push(h & 255), l.push((h & 65280) >> 8), l.push((h & 16711680) >> 16), l.push(h >> 24 & 255);\n }\n t.setVerticesData(I.MatricesIndicesExtraKind, l, !1);\n }\n if (a.matricesWeightsAttrDesc && a.matricesWeightsAttrDesc.count > 0) {\n const o = new Float32Array(e, a.matricesWeightsAttrDesc.offset, a.matricesWeightsAttrDesc.count);\n t.setVerticesData(I.MatricesWeightsKind, o, !1);\n }\n if (a.indicesAttrDesc && a.indicesAttrDesc.count > 0) {\n const o = new Int32Array(e, a.indicesAttrDesc.offset, a.indicesAttrDesc.count);\n t.setIndices(o, null);\n }\n if (a.subMeshesAttrDesc && a.subMeshesAttrDesc.count > 0) {\n const o = new Int32Array(e, a.subMeshesAttrDesc.offset, a.subMeshesAttrDesc.count * 5);\n t.subMeshes = [];\n for (let l = 0; l < a.subMeshesAttrDesc.count; l++) {\n const c = o[l * 5 + 0], h = o[l * 5 + 1], u = o[l * 5 + 2], f = o[l * 5 + 3], d = o[l * 5 + 4];\n bi.AddToMesh(c, h, u, f, d, t);\n }\n }\n } else if (e.positions && e.normals && e.indices) {\n if (t.setVerticesData(I.PositionKind, e.positions, e.positions._updatable), t.setVerticesData(I.NormalKind, e.normals, e.normals._updatable), e.tangents && t.setVerticesData(I.TangentKind, e.tangents, e.tangents._updatable), e.uvs && t.setVerticesData(I.UVKind, e.uvs, e.uvs._updatable), e.uvs2 && t.setVerticesData(I.UV2Kind, e.uvs2, e.uvs2._updatable), e.uvs3 && t.setVerticesData(I.UV3Kind, e.uvs3, e.uvs3._updatable), e.uvs4 && t.setVerticesData(I.UV4Kind, e.uvs4, e.uvs4._updatable), e.uvs5 && t.setVerticesData(I.UV5Kind, e.uvs5, e.uvs5._updatable), e.uvs6 && t.setVerticesData(I.UV6Kind, e.uvs6, e.uvs6._updatable), e.colors && t.setVerticesData(I.ColorKind, et.CheckColors4(e.colors, e.positions.length / 3), e.colors._updatable), e.matricesIndices)\n if (e.matricesIndices._isExpanded)\n delete e.matricesIndices._isExpanded, t.setVerticesData(I.MatricesIndicesKind, e.matricesIndices, e.matricesIndices._updatable);\n else {\n const a = [];\n for (let o = 0; o < e.matricesIndices.length; o++) {\n const l = e.matricesIndices[o];\n a.push(l & 255), a.push((l & 65280) >> 8), a.push((l & 16711680) >> 16), a.push(l >> 24 & 255);\n }\n t.setVerticesData(I.MatricesIndicesKind, a, e.matricesIndices._updatable);\n }\n if (e.matricesIndicesExtra)\n if (e.matricesIndicesExtra._isExpanded)\n delete e.matricesIndices._isExpanded, t.setVerticesData(I.MatricesIndicesExtraKind, e.matricesIndicesExtra, e.matricesIndicesExtra._updatable);\n else {\n const a = [];\n for (let o = 0; o < e.matricesIndicesExtra.length; o++) {\n const l = e.matricesIndicesExtra[o];\n a.push(l & 255), a.push((l & 65280) >> 8), a.push((l & 16711680) >> 16), a.push(l >> 24 & 255);\n }\n t.setVerticesData(I.MatricesIndicesExtraKind, a, e.matricesIndicesExtra._updatable);\n }\n e.matricesWeights && (na._CleanMatricesWeights(e, t), t.setVerticesData(I.MatricesWeightsKind, e.matricesWeights, e.matricesWeights._updatable)), e.matricesWeightsExtra && t.setVerticesData(I.MatricesWeightsExtraKind, e.matricesWeightsExtra, e.matricesWeights._updatable), t.setIndices(e.indices, null);\n }\n if (e.subMeshes) {\n t.subMeshes = [];\n for (let a = 0; a < e.subMeshes.length; a++) {\n const o = e.subMeshes[a];\n bi.AddToMesh(o.materialIndex, o.verticesStart, o.verticesCount, o.indexStart, o.indexCount, t);\n }\n }\n t._shouldGenerateFlatShading && (t.convertToFlatShadedMesh(), t._shouldGenerateFlatShading = !1), t.computeWorldMatrix(!0), i.onMeshImportedObservable.notifyObservers(t);\n }\n static _CleanMatricesWeights(e, t) {\n if (!ir.CleanBoneMatrixWeights)\n return;\n let r = 0;\n if (e.skeletonId > -1) {\n const u = t.getScene().getLastSkeletonById(e.skeletonId);\n if (!u)\n return;\n r = u.bones.length;\n } else\n return;\n const s = t.getVerticesData(I.MatricesIndicesKind), a = t.getVerticesData(I.MatricesIndicesExtraKind), o = e.matricesWeights, l = e.matricesWeightsExtra, c = e.numBoneInfluencer, h = o.length;\n for (let u = 0; u < h; u += 4) {\n let f = 0, d = -1;\n for (let p = 0; p < 4; p++) {\n const g = o[u + p];\n f += g, g < 1e-3 && d < 0 && (d = p);\n }\n if (l)\n for (let p = 0; p < 4; p++) {\n const g = l[u + p];\n f += g, g < 1e-3 && d < 0 && (d = p + 4);\n }\n if ((d < 0 || d > c - 1) && (d = c - 1), f > 1e-3) {\n const p = 1 / f;\n for (let g = 0; g < 4; g++)\n o[u + g] *= p;\n if (l)\n for (let g = 0; g < 4; g++)\n l[u + g] *= p;\n } else\n d >= 4 ? (l[u + d - 4] = 1 - f, a[u + d - 4] = r) : (o[u + d] = 1 - f, s[u + d] = r);\n }\n t.setVerticesData(I.MatricesIndicesKind, s), e.matricesWeightsExtra && t.setVerticesData(I.MatricesIndicesExtraKind, a);\n }\n /**\n * Create a new geometry from persisted data (Using .babylon file format)\n * @param parsedVertexData defines the persisted data\n * @param scene defines the hosting scene\n * @param rootUrl defines the root url to use to load assets (like delayed data)\n * @returns the new geometry object\n */\n static Parse(e, t, i) {\n const r = new na(e.id, t, void 0, e.updatable);\n return r._loadedUniqueId = e.uniqueId, rt && rt.AddTagsTo(r, e.tags), e.delayLoadingFile ? (r.delayLoadState = 4, r.delayLoadingFile = i + e.delayLoadingFile, r._boundingInfo = new Cr(_.FromArray(e.boundingBoxMinimum), _.FromArray(e.boundingBoxMaximum)), r._delayInfo = [], e.hasUVs && r._delayInfo.push(I.UVKind), e.hasUVs2 && r._delayInfo.push(I.UV2Kind), e.hasUVs3 && r._delayInfo.push(I.UV3Kind), e.hasUVs4 && r._delayInfo.push(I.UV4Kind), e.hasUVs5 && r._delayInfo.push(I.UV5Kind), e.hasUVs6 && r._delayInfo.push(I.UV6Kind), e.hasColors && r._delayInfo.push(I.ColorKind), e.hasMatricesIndices && r._delayInfo.push(I.MatricesIndicesKind), e.hasMatricesWeights && r._delayInfo.push(I.MatricesWeightsKind), r._delayLoadingFunction = re.ImportVertexData) : re.ImportVertexData(e, r), t.pushGeometry(r, !0), r;\n }\n};\n`${ge._DefaultCdnUrl}`, `${ge._DefaultCdnUrl}`, `${ge._DefaultCdnUrl}`;\n`${ge._DefaultCdnUrl}`;\nclass Eo {\n /**\n * Creates a Viewport object located at (x, y) and sized (width, height)\n * @param x defines viewport left coordinate\n * @param y defines viewport top coordinate\n * @param width defines the viewport width\n * @param height defines the viewport height\n */\n constructor(e, t, i, r) {\n this.x = e, this.y = t, this.width = i, this.height = r;\n }\n /**\n * Creates a new viewport using absolute sizing (from 0-> width, 0-> height instead of 0->1)\n * @param renderWidth defines the rendering width\n * @param renderHeight defines the rendering height\n * @returns a new Viewport\n */\n toGlobal(e, t) {\n return new Eo(this.x * e, this.y * t, this.width * e, this.height * t);\n }\n /**\n * Stores absolute viewport value into a target viewport (from 0-> width, 0-> height instead of 0->1)\n * @param renderWidth defines the rendering width\n * @param renderHeight defines the rendering height\n * @param ref defines the target viewport\n * @returns the current viewport\n */\n toGlobalToRef(e, t, i) {\n return i.x = this.x * e, i.y = this.y * t, i.width = this.width * e, i.height = this.height * t, this;\n }\n /**\n * Returns a new Viewport copied from the current one\n * @returns a new Viewport\n */\n clone() {\n return new Eo(this.x, this.y, this.width, this.height);\n }\n}\nclass $e extends Ai {\n /**\n * Define the current local position of the camera in the scene\n */\n get position() {\n return this._position;\n }\n set position(e) {\n this._position = e;\n }\n /**\n * The vector the camera should consider as up.\n * (default is Vector3(0, 1, 0) aka Vector3.Up())\n */\n set upVector(e) {\n this._upVector = e;\n }\n get upVector() {\n return this._upVector;\n }\n /**\n * The screen area in scene units squared\n */\n get screenArea() {\n let e = 0, t = 0;\n if (this.mode === $e.PERSPECTIVE_CAMERA)\n this.fovMode === $e.FOVMODE_VERTICAL_FIXED ? (t = this.minZ * 2 * Math.tan(this.fov / 2), e = this.getEngine().getAspectRatio(this) * t) : (e = this.minZ * 2 * Math.tan(this.fov / 2), t = e / this.getEngine().getAspectRatio(this));\n else {\n const i = this.getEngine().getRenderWidth() / 2, r = this.getEngine().getRenderHeight() / 2;\n e = (this.orthoRight ?? i) - (this.orthoLeft ?? -i), t = (this.orthoTop ?? r) - (this.orthoBottom ?? -r);\n }\n return e * t;\n }\n /**\n * Define the current limit on the left side for an orthographic camera\n * In scene unit\n */\n set orthoLeft(e) {\n this._orthoLeft = e;\n for (const t of this._rigCameras)\n t.orthoLeft = e;\n }\n get orthoLeft() {\n return this._orthoLeft;\n }\n /**\n * Define the current limit on the right side for an orthographic camera\n * In scene unit\n */\n set orthoRight(e) {\n this._orthoRight = e;\n for (const t of this._rigCameras)\n t.orthoRight = e;\n }\n get orthoRight() {\n return this._orthoRight;\n }\n /**\n * Define the current limit on the bottom side for an orthographic camera\n * In scene unit\n */\n set orthoBottom(e) {\n this._orthoBottom = e;\n for (const t of this._rigCameras)\n t.orthoBottom = e;\n }\n get orthoBottom() {\n return this._orthoBottom;\n }\n /**\n * Define the current limit on the top side for an orthographic camera\n * In scene unit\n */\n set orthoTop(e) {\n this._orthoTop = e;\n for (const t of this._rigCameras)\n t.orthoTop = e;\n }\n get orthoTop() {\n return this._orthoTop;\n }\n /**\n * Define the mode of the camera (Camera.PERSPECTIVE_CAMERA or Camera.ORTHOGRAPHIC_CAMERA)\n */\n set mode(e) {\n this._mode = e;\n for (const t of this._rigCameras)\n t.mode = e;\n }\n get mode() {\n return this._mode;\n }\n /**\n * Gets a flag indicating that the camera has moved in some way since the last call to Camera.update()\n */\n get hasMoved() {\n return this._hasMoved;\n }\n /**\n * Instantiates a new camera object.\n * This should not be used directly but through the inherited cameras: ArcRotate, Free...\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras\n * @param name Defines the name of the camera in the scene\n * @param position Defines the position of the camera\n * @param scene Defines the scene the camera belongs too\n * @param setActiveOnSceneIfNoneActive Defines if the camera should be set as active after creation if no other camera have been defined in the scene\n */\n constructor(e, t, i, r = !0) {\n super(e, i), this._position = _.Zero(), this._upVector = _.Up(), this.oblique = null, this._orthoLeft = null, this._orthoRight = null, this._orthoBottom = null, this._orthoTop = null, this.fov = 0.8, this.projectionPlaneTilt = 0, this.minZ = 1, this.maxZ = 1e4, this.inertia = 0.9, this._mode = $e.PERSPECTIVE_CAMERA, this.isIntermediate = !1, this.viewport = new Eo(0, 0, 1, 1), this.layerMask = 268435455, this.fovMode = $e.FOVMODE_VERTICAL_FIXED, this.cameraRigMode = $e.RIG_MODE_NONE, this.customRenderTargets = [], this.outputRenderTarget = null, this.onViewMatrixChangedObservable = new he(), this.onProjectionMatrixChangedObservable = new he(), this.onAfterCheckInputsObservable = new he(), this.onRestoreStateObservable = new he(), this.isRigCamera = !1, this._hasMoved = !1, this._rigCameras = new Array(), this._skipRendering = !1, this._projectionMatrix = new w(), this._postProcesses = new Array(), this._activeMeshes = new Li(256), this._globalPosition = _.Zero(), this._computedViewMatrix = w.Identity(), this._doNotComputeProjectionMatrix = !1, this._transformMatrix = w.Zero(), this._refreshFrustumPlanes = !0, this._absoluteRotation = Ce.Identity(), this._isCamera = !0, this._isLeftCamera = !1, this._isRightCamera = !1, this.getScene().addCamera(this), r && !this.getScene().activeCamera && (this.getScene().activeCamera = this), this.position = t, this.renderPassId = this.getScene().getEngine().createRenderPassId(`Camera ${e}`);\n }\n /**\n * Store current camera state (fov, position, etc..)\n * @returns the camera\n */\n storeState() {\n return this._stateStored = !0, this._storedFov = this.fov, this;\n }\n /**\n * Restores the camera state values if it has been stored. You must call storeState() first\n * @returns true if restored and false otherwise\n */\n _restoreStateValues() {\n return this._stateStored ? (this.fov = this._storedFov, !0) : !1;\n }\n /**\n * Restored camera state. You must call storeState() first.\n * @returns true if restored and false otherwise\n */\n restoreState() {\n return this._restoreStateValues() ? (this.onRestoreStateObservable.notifyObservers(this), !0) : !1;\n }\n /**\n * Gets the class name of the camera.\n * @returns the class name\n */\n getClassName() {\n return \"Camera\";\n }\n /**\n * Gets a string representation of the camera useful for debug purpose.\n * @param fullDetails Defines that a more verbose level of logging is required\n * @returns the string representation\n */\n toString(e) {\n let t = \"Name: \" + this.name;\n if (t += \", type: \" + this.getClassName(), this.animations)\n for (let i = 0; i < this.animations.length; i++)\n t += \", animation[0]: \" + this.animations[i].toString(e);\n return t;\n }\n /**\n * Automatically tilts the projection plane, using `projectionPlaneTilt`, to correct the perspective effect on vertical lines.\n */\n applyVerticalCorrection() {\n const e = this.absoluteRotation.toEulerAngles();\n this.projectionPlaneTilt = this._scene.useRightHandedSystem ? -e.x : e.x;\n }\n /**\n * Gets the current world space position of the camera.\n */\n get globalPosition() {\n return this._globalPosition;\n }\n /**\n * Gets the list of active meshes this frame (meshes no culled or excluded by lod s in the frame)\n * @returns the active meshe list\n */\n getActiveMeshes() {\n return this._activeMeshes;\n }\n /**\n * Check whether a mesh is part of the current active mesh list of the camera\n * @param mesh Defines the mesh to check\n * @returns true if active, false otherwise\n */\n isActiveMesh(e) {\n return this._activeMeshes.indexOf(e) !== -1;\n }\n /**\n * Is this camera ready to be used/rendered\n * @param completeCheck defines if a complete check (including post processes) has to be done (false by default)\n * @returns true if the camera is ready\n */\n isReady(e = !1) {\n if (e) {\n for (const t of this._postProcesses)\n if (t && !t.isReady())\n return !1;\n }\n return super.isReady(e);\n }\n /** @internal */\n _initCache() {\n super._initCache(), this._cache.position = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), this._cache.upVector = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), this._cache.mode = void 0, this._cache.minZ = void 0, this._cache.maxZ = void 0, this._cache.fov = void 0, this._cache.fovMode = void 0, this._cache.aspectRatio = void 0, this._cache.orthoLeft = void 0, this._cache.orthoRight = void 0, this._cache.orthoBottom = void 0, this._cache.orthoTop = void 0, this._cache.obliqueAngle = void 0, this._cache.obliqueLength = void 0, this._cache.obliqueOffset = void 0, this._cache.renderWidth = void 0, this._cache.renderHeight = void 0;\n }\n /**\n * @internal\n */\n _updateCache(e) {\n e || super._updateCache(), this._cache.position.copyFrom(this.position), this._cache.upVector.copyFrom(this.upVector);\n }\n /** @internal */\n _isSynchronized() {\n return this._isSynchronizedViewMatrix() && this._isSynchronizedProjectionMatrix();\n }\n /** @internal */\n _isSynchronizedViewMatrix() {\n return super._isSynchronized() ? this._cache.position.equals(this.position) && this._cache.upVector.equals(this.upVector) && this.isSynchronizedWithParent() : !1;\n }\n /** @internal */\n _isSynchronizedProjectionMatrix() {\n let e = this._cache.mode === this.mode && this._cache.minZ === this.minZ && this._cache.maxZ === this.maxZ;\n if (!e)\n return !1;\n const t = this.getEngine();\n return this.mode === $e.PERSPECTIVE_CAMERA ? e = this._cache.fov === this.fov && this._cache.fovMode === this.fovMode && this._cache.aspectRatio === t.getAspectRatio(this) && this._cache.projectionPlaneTilt === this.projectionPlaneTilt : (e = this._cache.orthoLeft === this.orthoLeft && this._cache.orthoRight === this.orthoRight && this._cache.orthoBottom === this.orthoBottom && this._cache.orthoTop === this.orthoTop && this._cache.renderWidth === t.getRenderWidth() && this._cache.renderHeight === t.getRenderHeight(), this.oblique && (e = e && this._cache.obliqueAngle === this.oblique.angle && this._cache.obliqueLength === this.oblique.length && this._cache.obliqueOffset === this.oblique.offset)), e;\n }\n /**\n * Attach the input controls to a specific dom element to get the input from.\n * This function is here because typescript removes the typing of the last function.\n * @param _ignored defines an ignored parameter kept for backward compatibility.\n * @param _noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\n */\n attachControl(e, t) {\n }\n /**\n * Detach the current controls from the specified dom element.\n * This function is here because typescript removes the typing of the last function.\n * @param _ignored defines an ignored parameter kept for backward compatibility.\n */\n detachControl(e) {\n }\n /**\n * Update the camera state according to the different inputs gathered during the frame.\n */\n update() {\n this._hasMoved = !1, this._checkInputs(), this.cameraRigMode !== $e.RIG_MODE_NONE && this._updateRigCameras(), this.getViewMatrix(), this.getProjectionMatrix();\n }\n /** @internal */\n _checkInputs() {\n this.onAfterCheckInputsObservable.notifyObservers(this);\n }\n /** @internal */\n get rigCameras() {\n return this._rigCameras;\n }\n /**\n * Gets the post process used by the rig cameras\n */\n get rigPostProcess() {\n return this._rigPostProcess;\n }\n /**\n * Internal, gets the first post process.\n * @returns the first post process to be run on this camera.\n */\n _getFirstPostProcess() {\n for (let e = 0; e < this._postProcesses.length; e++)\n if (this._postProcesses[e] !== null)\n return this._postProcesses[e];\n return null;\n }\n _cascadePostProcessesToRigCams() {\n const e = this._getFirstPostProcess();\n e && e.markTextureDirty();\n for (let t = 0, i = this._rigCameras.length; t < i; t++) {\n const r = this._rigCameras[t], s = r._rigPostProcess;\n s ? (s.getEffectName() === \"pass\" && (r.isIntermediate = this._postProcesses.length === 0), r._postProcesses = this._postProcesses.slice(0).concat(s), s.markTextureDirty()) : r._postProcesses = this._postProcesses.slice(0);\n }\n }\n /**\n * Attach a post process to the camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#attach-postprocess\n * @param postProcess The post process to attach to the camera\n * @param insertAt The position of the post process in case several of them are in use in the scene\n * @returns the position the post process has been inserted at\n */\n attachPostProcess(e, t = null) {\n return !e.isReusable() && this._postProcesses.indexOf(e) > -1 ? (ne.Error(\"You're trying to reuse a post process not defined as reusable.\"), 0) : (t == null || t < 0 ? this._postProcesses.push(e) : this._postProcesses[t] === null ? this._postProcesses[t] = e : this._postProcesses.splice(t, 0, e), this._cascadePostProcessesToRigCams(), this._scene.prePassRenderer && this._scene.prePassRenderer.markAsDirty(), this._postProcesses.indexOf(e));\n }\n /**\n * Detach a post process to the camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#attach-postprocess\n * @param postProcess The post process to detach from the camera\n */\n detachPostProcess(e) {\n const t = this._postProcesses.indexOf(e);\n t !== -1 && (this._postProcesses[t] = null), this._scene.prePassRenderer && this._scene.prePassRenderer.markAsDirty(), this._cascadePostProcessesToRigCams();\n }\n /**\n * Gets the current world matrix of the camera\n * @returns the world matrix\n */\n getWorldMatrix() {\n return this._isSynchronizedViewMatrix() ? this._worldMatrix : (this.getViewMatrix(), this._worldMatrix);\n }\n /** @internal */\n _getViewMatrix() {\n return w.Identity();\n }\n /**\n * Gets the current view matrix of the camera.\n * @param force forces the camera to recompute the matrix without looking at the cached state\n * @returns the view matrix\n */\n getViewMatrix(e) {\n return !e && this._isSynchronizedViewMatrix() ? this._computedViewMatrix : (this._hasMoved = !0, this.updateCache(), this._computedViewMatrix = this._getViewMatrix(), this._currentRenderId = this.getScene().getRenderId(), this._childUpdateId++, this._refreshFrustumPlanes = !0, this._cameraRigParams && this._cameraRigParams.vrPreViewMatrix && this._computedViewMatrix.multiplyToRef(this._cameraRigParams.vrPreViewMatrix, this._computedViewMatrix), this.parent && this.parent.onViewMatrixChangedObservable && this.parent.onViewMatrixChangedObservable.notifyObservers(this.parent), this.onViewMatrixChangedObservable.notifyObservers(this), this._computedViewMatrix.invertToRef(this._worldMatrix), this._computedViewMatrix);\n }\n /**\n * Freeze the projection matrix.\n * It will prevent the cache check of the camera projection compute and can speed up perf\n * if no parameter of the camera are meant to change\n * @param projection Defines manually a projection if necessary\n */\n freezeProjectionMatrix(e) {\n this._doNotComputeProjectionMatrix = !0, e !== void 0 && (this._projectionMatrix = e);\n }\n /**\n * Unfreeze the projection matrix if it has previously been freezed by freezeProjectionMatrix.\n */\n unfreezeProjectionMatrix() {\n this._doNotComputeProjectionMatrix = !1;\n }\n /**\n * Gets the current projection matrix of the camera.\n * @param force forces the camera to recompute the matrix without looking at the cached state\n * @returns the projection matrix\n */\n getProjectionMatrix(e) {\n var s, a, o;\n if (this._doNotComputeProjectionMatrix || !e && this._isSynchronizedProjectionMatrix())\n return this._projectionMatrix;\n this._cache.mode = this.mode, this._cache.minZ = this.minZ, this._cache.maxZ = this.maxZ, this._refreshFrustumPlanes = !0;\n const t = this.getEngine(), i = this.getScene(), r = t.useReverseDepthBuffer;\n if (this.mode === $e.PERSPECTIVE_CAMERA) {\n this._cache.fov = this.fov, this._cache.fovMode = this.fovMode, this._cache.aspectRatio = t.getAspectRatio(this), this._cache.projectionPlaneTilt = this.projectionPlaneTilt, this.minZ <= 0 && (this.minZ = 0.1);\n let l;\n i.useRightHandedSystem ? l = w.PerspectiveFovRHToRef : l = w.PerspectiveFovLHToRef, l(this.fov, t.getAspectRatio(this), r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this._projectionMatrix, this.fovMode === $e.FOVMODE_VERTICAL_FIXED, t.isNDCHalfZRange, this.projectionPlaneTilt, r);\n } else {\n const l = t.getRenderWidth() / 2, c = t.getRenderHeight() / 2;\n i.useRightHandedSystem ? this.oblique ? w.ObliqueOffCenterRHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this.oblique.length, this.oblique.angle, this._computeObliqueDistance(this.oblique.offset), this._projectionMatrix, t.isNDCHalfZRange) : w.OrthoOffCenterRHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this._projectionMatrix, t.isNDCHalfZRange) : this.oblique ? w.ObliqueOffCenterLHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this.oblique.length, this.oblique.angle, this._computeObliqueDistance(this.oblique.offset), this._projectionMatrix, t.isNDCHalfZRange) : w.OrthoOffCenterLHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this._projectionMatrix, t.isNDCHalfZRange), this._cache.orthoLeft = this.orthoLeft, this._cache.orthoRight = this.orthoRight, this._cache.orthoBottom = this.orthoBottom, this._cache.orthoTop = this.orthoTop, this._cache.obliqueAngle = (s = this.oblique) == null ? void 0 : s.angle, this._cache.obliqueLength = (a = this.oblique) == null ? void 0 : a.length, this._cache.obliqueOffset = (o = this.oblique) == null ? void 0 : o.offset, this._cache.renderWidth = t.getRenderWidth(), this._cache.renderHeight = t.getRenderHeight();\n }\n return this.onProjectionMatrixChangedObservable.notifyObservers(this), this._projectionMatrix;\n }\n /**\n * Gets the transformation matrix (ie. the multiplication of view by projection matrices)\n * @returns a Matrix\n */\n getTransformationMatrix() {\n return this._computedViewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix), this._transformMatrix;\n }\n _computeObliqueDistance(e) {\n const t = this, i = this;\n return (t.radius || (i.target ? _.Distance(this.position, i.target) : this.position.length())) + e;\n }\n _updateFrustumPlanes() {\n this._refreshFrustumPlanes && (this.getTransformationMatrix(), this._frustumPlanes ? Or.GetPlanesToRef(this._transformMatrix, this._frustumPlanes) : this._frustumPlanes = Or.GetPlanes(this._transformMatrix), this._refreshFrustumPlanes = !1);\n }\n /**\n * Checks if a cullable object (mesh...) is in the camera frustum\n * This checks the bounding box center. See isCompletelyInFrustum for a full bounding check\n * @param target The object to check\n * @param checkRigCameras If the rig cameras should be checked (eg. with VR camera both eyes should be checked) (Default: false)\n * @returns true if the object is in frustum otherwise false\n */\n isInFrustum(e, t = !1) {\n if (this._updateFrustumPlanes(), t && this.rigCameras.length > 0) {\n let i = !1;\n return this.rigCameras.forEach((r) => {\n r._updateFrustumPlanes(), i = i || e.isInFrustum(r._frustumPlanes);\n }), i;\n } else\n return e.isInFrustum(this._frustumPlanes);\n }\n /**\n * Checks if a cullable object (mesh...) is in the camera frustum\n * Unlike isInFrustum this checks the full bounding box\n * @param target The object to check\n * @returns true if the object is in frustum otherwise false\n */\n isCompletelyInFrustum(e) {\n return this._updateFrustumPlanes(), e.isCompletelyInFrustum(this._frustumPlanes);\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Gets a ray in the forward direction from the camera.\n * @param length Defines the length of the ray to create\n * @param transform Defines the transform to apply to the ray, by default the world matrix is used to create a workd space ray\n * @param origin Defines the start point of the ray which defaults to the camera position\n * @returns the forward ray\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getForwardRay(e = 100, t, i) {\n throw We(\"Ray\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Gets a ray in the forward direction from the camera.\n * @param refRay the ray to (re)use when setting the values\n * @param length Defines the length of the ray to create\n * @param transform Defines the transform to apply to the ray, by default the world matrx is used to create a workd space ray\n * @param origin Defines the start point of the ray which defaults to the camera position\n * @returns the forward ray\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getForwardRayToRef(e, t = 100, i, r) {\n throw We(\"Ray\");\n }\n /**\n * Releases resources associated with this node.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n for (this.onViewMatrixChangedObservable.clear(), this.onProjectionMatrixChangedObservable.clear(), this.onAfterCheckInputsObservable.clear(), this.onRestoreStateObservable.clear(), this.inputs && this.inputs.clear(), this.getScene().stopAnimation(this), this.getScene().removeCamera(this); this._rigCameras.length > 0; ) {\n const r = this._rigCameras.pop();\n r && r.dispose();\n }\n if (this._parentContainer) {\n const r = this._parentContainer.cameras.indexOf(this);\n r > -1 && this._parentContainer.cameras.splice(r, 1), this._parentContainer = null;\n }\n if (this._rigPostProcess)\n this._rigPostProcess.dispose(this), this._rigPostProcess = null, this._postProcesses.length = 0;\n else if (this.cameraRigMode !== $e.RIG_MODE_NONE)\n this._rigPostProcess = null, this._postProcesses.length = 0;\n else {\n let r = this._postProcesses.length;\n for (; --r >= 0; ) {\n const s = this._postProcesses[r];\n s && s.dispose(this);\n }\n }\n let i = this.customRenderTargets.length;\n for (; --i >= 0; )\n this.customRenderTargets[i].dispose();\n this.customRenderTargets.length = 0, this._activeMeshes.dispose(), this.getScene().getEngine().releaseRenderPassId(this.renderPassId), super.dispose(e, t);\n }\n /**\n * Gets the left camera of a rig setup in case of Rigged Camera\n */\n get isLeftCamera() {\n return this._isLeftCamera;\n }\n /**\n * Gets the right camera of a rig setup in case of Rigged Camera\n */\n get isRightCamera() {\n return this._isRightCamera;\n }\n /**\n * Gets the left camera of a rig setup in case of Rigged Camera\n */\n get leftCamera() {\n return this._rigCameras.length < 1 ? null : this._rigCameras[0];\n }\n /**\n * Gets the right camera of a rig setup in case of Rigged Camera\n */\n get rightCamera() {\n return this._rigCameras.length < 2 ? null : this._rigCameras[1];\n }\n /**\n * Gets the left camera target of a rig setup in case of Rigged Camera\n * @returns the target position\n */\n getLeftTarget() {\n return this._rigCameras.length < 1 ? null : this._rigCameras[0].getTarget();\n }\n /**\n * Gets the right camera target of a rig setup in case of Rigged Camera\n * @returns the target position\n */\n getRightTarget() {\n return this._rigCameras.length < 2 ? null : this._rigCameras[1].getTarget();\n }\n /**\n * @internal\n */\n setCameraRigMode(e, t) {\n if (this.cameraRigMode !== e) {\n for (; this._rigCameras.length > 0; ) {\n const i = this._rigCameras.pop();\n i && i.dispose();\n }\n if (this.cameraRigMode = e, this._cameraRigParams = {}, this._cameraRigParams.interaxialDistance = t.interaxialDistance || 0.0637, this._cameraRigParams.stereoHalfAngle = ge.ToRadians(this._cameraRigParams.interaxialDistance / 0.0637), this.cameraRigMode !== $e.RIG_MODE_NONE) {\n const i = this.createRigCamera(this.name + \"_L\", 0);\n i && (i._isLeftCamera = !0);\n const r = this.createRigCamera(this.name + \"_R\", 1);\n r && (r._isRightCamera = !0), i && r && (this._rigCameras.push(i), this._rigCameras.push(r));\n }\n this._setRigMode(t), this._cascadePostProcessesToRigCams(), this.update();\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _setRigMode(e) {\n }\n /** @internal */\n _getVRProjectionMatrix() {\n return w.PerspectiveFovLHToRef(this._cameraRigParams.vrMetrics.aspectRatioFov, this._cameraRigParams.vrMetrics.aspectRatio, this.minZ, this.maxZ, this._cameraRigParams.vrWorkMatrix, !0, this.getEngine().isNDCHalfZRange), this._cameraRigParams.vrWorkMatrix.multiplyToRef(this._cameraRigParams.vrHMatrix, this._projectionMatrix), this._projectionMatrix;\n }\n /**\n * @internal\n */\n setCameraRigParameter(e, t) {\n this._cameraRigParams || (this._cameraRigParams = {}), this._cameraRigParams[e] = t, e === \"interaxialDistance\" && (this._cameraRigParams.stereoHalfAngle = ge.ToRadians(t / 0.0637));\n }\n /**\n * needs to be overridden by children so sub has required properties to be copied\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n createRigCamera(e, t) {\n return null;\n }\n /**\n * May need to be overridden by children\n * @internal\n */\n _updateRigCameras() {\n for (let e = 0; e < this._rigCameras.length; e++)\n this._rigCameras[e].minZ = this.minZ, this._rigCameras[e].maxZ = this.maxZ, this._rigCameras[e].fov = this.fov, this._rigCameras[e].upVector.copyFrom(this.upVector);\n this.cameraRigMode === $e.RIG_MODE_STEREOSCOPIC_ANAGLYPH && (this._rigCameras[0].viewport = this._rigCameras[1].viewport = this.viewport);\n }\n /** @internal */\n _setupInputs() {\n }\n /**\n * Serialiaze the camera setup to a json representation\n * @returns the JSON representation\n */\n serialize() {\n const e = Le.Serialize(this);\n return e.uniqueId = this.uniqueId, e.type = this.getClassName(), this.parent && this.parent._serializeAsParent(e), this.inputs && this.inputs.serialize(e), Le.AppendSerializedAnimations(this, e), e.ranges = this.serializeAnimationRanges(), e.isEnabled = this.isEnabled(), e;\n }\n /**\n * Clones the current camera.\n * @param name The cloned camera name\n * @param newParent The cloned camera's new parent (none by default)\n * @returns the cloned camera\n */\n clone(e, t = null) {\n const i = Le.Clone($e.GetConstructorFromName(this.getClassName(), e, this.getScene(), this.interaxialDistance, this.isStereoscopicSideBySide), this);\n return i.name = e, i.parent = t, this.onClonedObservable.notifyObservers(i), i;\n }\n /**\n * Gets the direction of the camera relative to a given local axis.\n * @param localAxis Defines the reference axis to provide a relative direction.\n * @returns the direction\n */\n getDirection(e) {\n const t = _.Zero();\n return this.getDirectionToRef(e, t), t;\n }\n /**\n * Returns the current camera absolute rotation\n */\n get absoluteRotation() {\n return this.getWorldMatrix().decompose(void 0, this._absoluteRotation), this._absoluteRotation;\n }\n /**\n * Gets the direction of the camera relative to a given local axis into a passed vector.\n * @param localAxis Defines the reference axis to provide a relative direction.\n * @param result Defines the vector to store the result in\n */\n getDirectionToRef(e, t) {\n _.TransformNormalToRef(e, this.getWorldMatrix(), t);\n }\n /**\n * Gets a camera constructor for a given camera type\n * @param type The type of the camera to construct (should be equal to one of the camera class name)\n * @param name The name of the camera the result will be able to instantiate\n * @param scene The scene the result will construct the camera in\n * @param interaxial_distance In case of stereoscopic setup, the distance between both eyes\n * @param isStereoscopicSideBySide In case of stereoscopic setup, should the sereo be side b side\n * @returns a factory method to construct the camera\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static GetConstructorFromName(e, t, i, r = 0, s = !0) {\n const a = Ai.Construct(e, t, i, {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n interaxial_distance: r,\n isStereoscopicSideBySide: s\n });\n return a || (() => $e._CreateDefaultParsedCamera(t, i));\n }\n /**\n * Compute the world matrix of the camera.\n * @returns the camera world matrix\n */\n computeWorldMatrix() {\n return this.getWorldMatrix();\n }\n /**\n * Parse a JSON and creates the camera from the parsed information\n * @param parsedCamera The JSON to parse\n * @param scene The scene to instantiate the camera in\n * @returns the newly constructed camera\n */\n static Parse(e, t) {\n const i = e.type, r = $e.GetConstructorFromName(i, e.name, t, e.interaxial_distance, e.isStereoscopicSideBySide), s = Le.Parse(r, e, t);\n if (e.parentId !== void 0 && (s._waitingParentId = e.parentId), e.parentInstanceIndex !== void 0 && (s._waitingParentInstanceIndex = e.parentInstanceIndex), s.inputs && (s.inputs.parse(e), s._setupInputs()), e.upVector && (s.upVector = _.FromArray(e.upVector)), s.setPosition && (s.position.copyFromFloats(0, 0, 0), s.setPosition(_.FromArray(e.position))), e.target && s.setTarget && s.setTarget(_.FromArray(e.target)), e.cameraRigMode) {\n const a = e.interaxial_distance ? { interaxialDistance: e.interaxial_distance } : {};\n s.setCameraRigMode(e.cameraRigMode, a);\n }\n if (e.animations) {\n for (let a = 0; a < e.animations.length; a++) {\n const o = e.animations[a], l = mr(\"BABYLON.Animation\");\n l && s.animations.push(l.Parse(o));\n }\n Ai.ParseAnimationRanges(s, e, t);\n }\n return e.autoAnimate && t.beginAnimation(s, e.autoAnimateFrom, e.autoAnimateTo, e.autoAnimateLoop, e.autoAnimateSpeed || 1), e.isEnabled !== void 0 && s.setEnabled(e.isEnabled), s;\n }\n /** @internal */\n _calculateHandednessMultiplier() {\n let e = this.getScene().useRightHandedSystem ? -1 : 1;\n return this.parent && this.parent._getWorldMatrixDeterminant() < 0 && (e *= -1), e;\n }\n}\n$e._CreateDefaultParsedCamera = (n, e) => {\n throw We(\"UniversalCamera\");\n};\n$e.PERSPECTIVE_CAMERA = 0;\n$e.ORTHOGRAPHIC_CAMERA = 1;\n$e.FOVMODE_VERTICAL_FIXED = 0;\n$e.FOVMODE_HORIZONTAL_FIXED = 1;\n$e.RIG_MODE_NONE = 0;\n$e.RIG_MODE_STEREOSCOPIC_ANAGLYPH = 10;\n$e.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL = 11;\n$e.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED = 12;\n$e.RIG_MODE_STEREOSCOPIC_OVERUNDER = 13;\n$e.RIG_MODE_STEREOSCOPIC_INTERLACED = 14;\n$e.RIG_MODE_VR = 20;\n$e.RIG_MODE_CUSTOM = 22;\n$e.ForceAttachControlToAlwaysPreventDefault = !1;\nP([\n cn(\"position\")\n], $e.prototype, \"_position\", void 0);\nP([\n cn(\"upVector\")\n], $e.prototype, \"_upVector\", void 0);\nP([\n U()\n], $e.prototype, \"orthoLeft\", null);\nP([\n U()\n], $e.prototype, \"orthoRight\", null);\nP([\n U()\n], $e.prototype, \"orthoBottom\", null);\nP([\n U()\n], $e.prototype, \"orthoTop\", null);\nP([\n U()\n], $e.prototype, \"fov\", void 0);\nP([\n U()\n], $e.prototype, \"projectionPlaneTilt\", void 0);\nP([\n U()\n], $e.prototype, \"minZ\", void 0);\nP([\n U()\n], $e.prototype, \"maxZ\", void 0);\nP([\n U()\n], $e.prototype, \"inertia\", void 0);\nP([\n U()\n], $e.prototype, \"mode\", null);\nP([\n U()\n], $e.prototype, \"layerMask\", void 0);\nP([\n U()\n], $e.prototype, \"fovMode\", void 0);\nP([\n U()\n], $e.prototype, \"cameraRigMode\", void 0);\nP([\n U()\n], $e.prototype, \"interaxialDistance\", void 0);\nP([\n U()\n], $e.prototype, \"isStereoscopicSideBySide\", void 0);\nclass zs {\n /**\n * Creates a material stencil state instance\n */\n constructor() {\n this.reset();\n }\n /**\n * Resets all the stencil states to default values\n */\n reset() {\n this.enabled = !1, this.mask = 255, this.func = 519, this.funcRef = 1, this.funcMask = 255, this.opStencilFail = 7680, this.opDepthFail = 7680, this.opStencilDepthPass = 7681;\n }\n /**\n * Gets or sets the stencil function\n */\n get func() {\n return this._func;\n }\n set func(e) {\n this._func = e;\n }\n /**\n * Gets or sets the stencil function reference\n */\n get funcRef() {\n return this._funcRef;\n }\n set funcRef(e) {\n this._funcRef = e;\n }\n /**\n * Gets or sets the stencil function mask\n */\n get funcMask() {\n return this._funcMask;\n }\n set funcMask(e) {\n this._funcMask = e;\n }\n /**\n * Gets or sets the operation when the stencil test fails\n */\n get opStencilFail() {\n return this._opStencilFail;\n }\n set opStencilFail(e) {\n this._opStencilFail = e;\n }\n /**\n * Gets or sets the operation when the depth test fails\n */\n get opDepthFail() {\n return this._opDepthFail;\n }\n set opDepthFail(e) {\n this._opDepthFail = e;\n }\n /**\n * Gets or sets the operation when the stencil+depth test succeeds\n */\n get opStencilDepthPass() {\n return this._opStencilDepthPass;\n }\n set opStencilDepthPass(e) {\n this._opStencilDepthPass = e;\n }\n /**\n * Gets or sets the stencil mask\n */\n get mask() {\n return this._mask;\n }\n set mask(e) {\n this._mask = e;\n }\n /**\n * Enables or disables the stencil test\n */\n get enabled() {\n return this._enabled;\n }\n set enabled(e) {\n this._enabled = e;\n }\n /**\n * Get the current class name, useful for serialization or dynamic coding.\n * @returns \"MaterialStencilState\"\n */\n getClassName() {\n return \"MaterialStencilState\";\n }\n /**\n * Makes a duplicate of the current configuration into another one.\n * @param stencilState defines stencil state where to copy the info\n */\n copyTo(e) {\n Le.Clone(() => e, this);\n }\n /**\n * Serializes this stencil configuration.\n * @returns - An object with the serialized config.\n */\n serialize() {\n return Le.Serialize(this);\n }\n /**\n * Parses a stencil state configuration from a serialized object.\n * @param source - Serialized object.\n * @param scene Defines the scene we are parsing for\n * @param rootUrl Defines the rootUrl to load from\n */\n parse(e, t, i) {\n Le.Parse(() => this, e, t, i);\n }\n}\nP([\n U()\n], zs.prototype, \"func\", null);\nP([\n U()\n], zs.prototype, \"funcRef\", null);\nP([\n U()\n], zs.prototype, \"funcMask\", null);\nP([\n U()\n], zs.prototype, \"opStencilFail\", null);\nP([\n U()\n], zs.prototype, \"opDepthFail\", null);\nP([\n U()\n], zs.prototype, \"opStencilDepthPass\", null);\nP([\n U()\n], zs.prototype, \"mask\", null);\nP([\n U()\n], zs.prototype, \"enabled\", null);\nvar Ri;\n(function(n) {\n n[n.Created = 1] = \"Created\", n[n.Disposed = 2] = \"Disposed\", n[n.GetDefineNames = 4] = \"GetDefineNames\", n[n.PrepareUniformBuffer = 8] = \"PrepareUniformBuffer\", n[n.IsReadyForSubMesh = 16] = \"IsReadyForSubMesh\", n[n.PrepareDefines = 32] = \"PrepareDefines\", n[n.BindForSubMesh = 64] = \"BindForSubMesh\", n[n.PrepareEffect = 128] = \"PrepareEffect\", n[n.GetAnimatables = 256] = \"GetAnimatables\", n[n.GetActiveTextures = 512] = \"GetActiveTextures\", n[n.HasTexture = 1024] = \"HasTexture\", n[n.FillRenderTargetTextures = 2048] = \"FillRenderTargetTextures\", n[n.HasRenderTargetTextures = 4096] = \"HasRenderTargetTextures\", n[n.HardBindForSubMesh = 8192] = \"HardBindForSubMesh\";\n})(Ri || (Ri = {}));\nfunction Nc(n) {\n n.indexOf(\"vClipPlane\") === -1 && n.push(\"vClipPlane\"), n.indexOf(\"vClipPlane2\") === -1 && n.push(\"vClipPlane2\"), n.indexOf(\"vClipPlane3\") === -1 && n.push(\"vClipPlane3\"), n.indexOf(\"vClipPlane4\") === -1 && n.push(\"vClipPlane4\"), n.indexOf(\"vClipPlane5\") === -1 && n.push(\"vClipPlane5\"), n.indexOf(\"vClipPlane6\") === -1 && n.push(\"vClipPlane6\");\n}\nfunction Yy(n, e, t) {\n const i = !!(n.clipPlane ?? e.clipPlane), r = !!(n.clipPlane2 ?? e.clipPlane2), s = !!(n.clipPlane3 ?? e.clipPlane3), a = !!(n.clipPlane4 ?? e.clipPlane4), o = !!(n.clipPlane5 ?? e.clipPlane5), l = !!(n.clipPlane6 ?? e.clipPlane6);\n i && t.push(\"#define CLIPPLANE\"), r && t.push(\"#define CLIPPLANE2\"), s && t.push(\"#define CLIPPLANE3\"), a && t.push(\"#define CLIPPLANE4\"), o && t.push(\"#define CLIPPLANE5\"), l && t.push(\"#define CLIPPLANE6\");\n}\nfunction Zy(n, e, t) {\n let i = !1;\n const r = !!(n.clipPlane ?? e.clipPlane), s = !!(n.clipPlane2 ?? e.clipPlane2), a = !!(n.clipPlane3 ?? e.clipPlane3), o = !!(n.clipPlane4 ?? e.clipPlane4), l = !!(n.clipPlane5 ?? e.clipPlane5), c = !!(n.clipPlane6 ?? e.clipPlane6);\n return t.CLIPPLANE !== r && (t.CLIPPLANE = r, i = !0), t.CLIPPLANE2 !== s && (t.CLIPPLANE2 = s, i = !0), t.CLIPPLANE3 !== a && (t.CLIPPLANE3 = a, i = !0), t.CLIPPLANE4 !== o && (t.CLIPPLANE4 = o, i = !0), t.CLIPPLANE5 !== l && (t.CLIPPLANE5 = l, i = !0), t.CLIPPLANE6 !== c && (t.CLIPPLANE6 = c, i = !0), i;\n}\nfunction Fc(n, e, t) {\n let i = e.clipPlane ?? t.clipPlane;\n Qn(n, \"vClipPlane\", i), i = e.clipPlane2 ?? t.clipPlane2, Qn(n, \"vClipPlane2\", i), i = e.clipPlane3 ?? t.clipPlane3, Qn(n, \"vClipPlane3\", i), i = e.clipPlane4 ?? t.clipPlane4, Qn(n, \"vClipPlane4\", i), i = e.clipPlane5 ?? t.clipPlane5, Qn(n, \"vClipPlane5\", i), i = e.clipPlane6 ?? t.clipPlane6, Qn(n, \"vClipPlane6\", i);\n}\nfunction Qn(n, e, t) {\n t && n.setFloat4(e, t.normal.x, t.normal.y, t.normal.z, t.d);\n}\nconst hg = Ne.Black();\nfunction Lc(n, e, t) {\n if (!n || n.LOGARITHMICDEPTH || n.indexOf && n.indexOf(\"LOGARITHMICDEPTH\") >= 0) {\n const i = t.activeCamera;\n i.mode === 1 && ne.Error(\"Logarithmic depth is not compatible with orthographic cameras!\", 20), e.setFloat(\"logarithmicDepthConstant\", 2 / (Math.log(i.maxZ + 1) / Math.LN2));\n }\n}\nfunction wc(n, e, t, i = !1) {\n t && n.fogEnabled && (!e || e.applyFog) && n.fogMode !== 0 && (t.setFloat4(\"vFogInfos\", n.fogMode, n.fogStart, n.fogEnd, n.fogDensity), i ? (n.fogColor.toLinearSpaceToRef(hg, n.getEngine().useExactSrgbConversions), t.setColor3(\"vFogColor\", hg)) : t.setColor3(\"vFogColor\", n.fogColor));\n}\nfunction Q_(n, e, t) {\n const i = t.NUM_MORPH_INFLUENCERS;\n if (i > 0 && st.LastCreatedEngine) {\n const r = st.LastCreatedEngine.getCaps().maxVertexAttribs, s = e.morphTargetManager;\n if (s != null && s.isUsingTextureForTargets)\n return;\n const a = s && s.supportsNormals && t.NORMAL, o = s && s.supportsTangents && t.TANGENT, l = s && s.supportsUVs && t.UV1;\n for (let c = 0; c < i; c++)\n n.push(\"position\" + c), a && n.push(\"normal\" + c), o && n.push(\"tangent\" + c), l && n.push(\"uv_\" + c), n.length > r && ne.Error(\"Cannot add more vertex attributes for mesh \" + e.name);\n }\n}\nfunction J_(n, e = !1) {\n n.push(\"world0\"), n.push(\"world1\"), n.push(\"world2\"), n.push(\"world3\"), e && (n.push(\"previousWorld0\"), n.push(\"previousWorld1\"), n.push(\"previousWorld2\"), n.push(\"previousWorld3\"));\n}\nfunction nf(n, e) {\n const t = n.morphTargetManager;\n !n || !t || e.setFloatArray(\"morphTargetInfluences\", t.influences);\n}\nfunction $_(n, e) {\n e.bindToEffect(n, \"Scene\");\n}\nfunction wt(n, e, t) {\n e._needUVs = !0, e[t] = !0, n.optimizeUVAllocation && n.getTextureMatrix().isIdentityAs3x2() ? (e[t + \"DIRECTUV\"] = n.coordinatesIndex + 1, e[\"MAINUV\" + (n.coordinatesIndex + 1)] = !0) : e[t + \"DIRECTUV\"] = 0;\n}\nfunction Mt(n, e, t) {\n const i = n.getTextureMatrix();\n e.updateMatrix(t + \"Matrix\", i);\n}\nfunction af(n, e, t) {\n t.BAKED_VERTEX_ANIMATION_TEXTURE && t.INSTANCES && n.push(\"bakedVertexAnimationSettingsInstanced\");\n}\nfunction jy(n, e) {\n return e.set(n), e;\n}\nfunction of(n, e, t) {\n if (!(!e || !n) && (n.computeBonesUsingShaders && e._bonesComputationForcedToCPU && (n.computeBonesUsingShaders = !1), n.useBones && n.computeBonesUsingShaders && n.skeleton)) {\n const i = n.skeleton;\n if (i.isUsingTextureForMatrices && e.getUniformIndex(\"boneTextureWidth\") > -1) {\n const r = i.getTransformMatrixTexture(n);\n e.setTexture(\"boneSampler\", r), e.setFloat(\"boneTextureWidth\", 4 * (i.bones.length + 1));\n } else {\n const r = i.getTransformMatrices(n);\n r && (e.setMatrices(\"mBones\", r), t && n.getScene().prePassRenderer && n.getScene().prePassRenderer.getIndex(2) && (t.previousBones[n.uniqueId] || (t.previousBones[n.uniqueId] = r.slice()), e.setMatrices(\"mPreviousBones\", t.previousBones[n.uniqueId]), jy(r, t.previousBones[n.uniqueId])));\n }\n }\n}\nfunction Qy(n, e, t, i, r, s = !0) {\n n._bindLight(e, t, i, r, s);\n}\nfunction e0(n, e, t, i, r = 4) {\n const s = Math.min(e.lightSources.length, r);\n for (let a = 0; a < s; a++) {\n const o = e.lightSources[a];\n Qy(o, a, n, t, typeof i == \"boolean\" ? i : i.SPECULARTERM, e.receiveShadows);\n }\n}\nfunction t0(n, e, t, i) {\n t.NUM_BONE_INFLUENCERS > 0 && (i.addCPUSkinningFallback(0, e), n.push(\"matricesIndices\"), n.push(\"matricesWeights\"), t.NUM_BONE_INFLUENCERS > 4 && (n.push(\"matricesIndicesExtra\"), n.push(\"matricesWeightsExtra\")));\n}\nfunction lf(n, e) {\n (e.INSTANCES || e.THIN_INSTANCES) && J_(n, !!e.PREPASS_VELOCITY), e.INSTANCESCOLOR && n.push(\"instanceColor\");\n}\nfunction i0(n, e, t = 4, i = 0) {\n let r = 0;\n for (let s = 0; s < t && n[\"LIGHT\" + s]; s++)\n s > 0 && (r = i + s, e.addFallback(r, \"LIGHT\" + s)), n.SHADOWS || (n[\"SHADOW\" + s] && e.addFallback(i, \"SHADOW\" + s), n[\"SHADOWPCF\" + s] && e.addFallback(i, \"SHADOWPCF\" + s), n[\"SHADOWPCSS\" + s] && e.addFallback(i, \"SHADOWPCSS\" + s), n[\"SHADOWPOISSON\" + s] && e.addFallback(i, \"SHADOWPOISSON\" + s), n[\"SHADOWESM\" + s] && e.addFallback(i, \"SHADOWESM\" + s), n[\"SHADOWCLOSEESM\" + s] && e.addFallback(i, \"SHADOWCLOSEESM\" + s));\n return r++;\n}\nfunction Jy(n, e) {\n return e.fogEnabled && n.applyFog && e.fogMode !== 0;\n}\nfunction cf(n, e, t, i, r, s, a, o = !1) {\n a._areMiscDirty && (a.LOGARITHMICDEPTH = t, a.POINTSIZE = i, a.FOG = r && Jy(n, e), a.NONUNIFORMSCALING = n.nonUniformScaling, a.ALPHATEST = s, a.DECAL_AFTER_DETAIL = o);\n}\nfunction r0(n, e, t, i, r = 4, s = !1) {\n if (!t._areLightsDirty)\n return t._needNormals;\n let a = 0;\n const o = {\n needNormals: t._needNormals,\n needRebuild: !1,\n lightmapMode: !1,\n shadowEnabled: !1,\n specularEnabled: !1\n };\n if (n.lightsEnabled && !s) {\n for (const c of e.lightSources)\n if ($y(n, e, c, a, t, i, o), a++, a === r)\n break;\n }\n t.SPECULARTERM = o.specularEnabled, t.SHADOWS = o.shadowEnabled;\n for (let c = a; c < r; c++)\n t[\"LIGHT\" + c] !== void 0 && (t[\"LIGHT\" + c] = !1, t[\"HEMILIGHT\" + c] = !1, t[\"POINTLIGHT\" + c] = !1, t[\"DIRLIGHT\" + c] = !1, t[\"SPOTLIGHT\" + c] = !1, t[\"SHADOW\" + c] = !1, t[\"SHADOWCSM\" + c] = !1, t[\"SHADOWCSMDEBUG\" + c] = !1, t[\"SHADOWCSMNUM_CASCADES\" + c] = !1, t[\"SHADOWCSMUSESHADOWMAXZ\" + c] = !1, t[\"SHADOWCSMNOBLEND\" + c] = !1, t[\"SHADOWCSM_RIGHTHANDED\" + c] = !1, t[\"SHADOWPCF\" + c] = !1, t[\"SHADOWPCSS\" + c] = !1, t[\"SHADOWPOISSON\" + c] = !1, t[\"SHADOWESM\" + c] = !1, t[\"SHADOWCLOSEESM\" + c] = !1, t[\"SHADOWCUBE\" + c] = !1, t[\"SHADOWLOWQUALITY\" + c] = !1, t[\"SHADOWMEDIUMQUALITY\" + c] = !1);\n const l = n.getEngine().getCaps();\n return t.SHADOWFLOAT === void 0 && (o.needRebuild = !0), t.SHADOWFLOAT = o.shadowEnabled && (l.textureFloatRender && l.textureFloatLinearFiltering || l.textureHalfFloatRender && l.textureHalfFloatLinearFiltering), t.LIGHTMAPEXCLUDED = o.lightmapMode, o.needRebuild && t.rebuild(), o.needNormals;\n}\nfunction $y(n, e, t, i, r, s, a) {\n switch (a.needNormals = !0, r[\"LIGHT\" + i] === void 0 && (a.needRebuild = !0), r[\"LIGHT\" + i] = !0, r[\"SPOTLIGHT\" + i] = !1, r[\"HEMILIGHT\" + i] = !1, r[\"POINTLIGHT\" + i] = !1, r[\"DIRLIGHT\" + i] = !1, t.prepareLightSpecificDefines(r, i), r[\"LIGHT_FALLOFF_PHYSICAL\" + i] = !1, r[\"LIGHT_FALLOFF_GLTF\" + i] = !1, r[\"LIGHT_FALLOFF_STANDARD\" + i] = !1, t.falloffType) {\n case Et.FALLOFF_GLTF:\n r[\"LIGHT_FALLOFF_GLTF\" + i] = !0;\n break;\n case Et.FALLOFF_PHYSICAL:\n r[\"LIGHT_FALLOFF_PHYSICAL\" + i] = !0;\n break;\n case Et.FALLOFF_STANDARD:\n r[\"LIGHT_FALLOFF_STANDARD\" + i] = !0;\n break;\n }\n if (s && !t.specular.equalsFloats(0, 0, 0) && (a.specularEnabled = !0), r[\"SHADOW\" + i] = !1, r[\"SHADOWCSM\" + i] = !1, r[\"SHADOWCSMDEBUG\" + i] = !1, r[\"SHADOWCSMNUM_CASCADES\" + i] = !1, r[\"SHADOWCSMUSESHADOWMAXZ\" + i] = !1, r[\"SHADOWCSMNOBLEND\" + i] = !1, r[\"SHADOWCSM_RIGHTHANDED\" + i] = !1, r[\"SHADOWPCF\" + i] = !1, r[\"SHADOWPCSS\" + i] = !1, r[\"SHADOWPOISSON\" + i] = !1, r[\"SHADOWESM\" + i] = !1, r[\"SHADOWCLOSEESM\" + i] = !1, r[\"SHADOWCUBE\" + i] = !1, r[\"SHADOWLOWQUALITY\" + i] = !1, r[\"SHADOWMEDIUMQUALITY\" + i] = !1, e && e.receiveShadows && n.shadowsEnabled && t.shadowEnabled) {\n const o = t.getShadowGenerator(n.activeCamera) ?? t.getShadowGenerator();\n if (o) {\n const l = o.getShadowMap();\n l && l.renderList && l.renderList.length > 0 && (a.shadowEnabled = !0, o.prepareDefines(r, i));\n }\n }\n t.lightmapMode != Et.LIGHTMAP_DEFAULT ? (a.lightmapMode = !0, r[\"LIGHTMAPEXCLUDED\" + i] = !0, r[\"LIGHTMAPNOSPECULAR\" + i] = t.lightmapMode == Et.LIGHTMAP_SHADOWSONLY) : (r[\"LIGHTMAPEXCLUDED\" + i] = !1, r[\"LIGHTMAPNOSPECULAR\" + i] = !1);\n}\nfunction hf(n, e, t, i, r, s = null, a = !1) {\n let o = rI(n, i);\n s !== !1 && (o = Zy(t, n, i)), i.DEPTHPREPASS !== !e.getColorWrite() && (i.DEPTHPREPASS = !i.DEPTHPREPASS, o = !0), i.INSTANCES !== r && (i.INSTANCES = r, o = !0), i.THIN_INSTANCES !== a && (i.THIN_INSTANCES = a, o = !0), o && i.markAsUnprocessed();\n}\nfunction eI(n, e) {\n if (n.useBones && n.computeBonesUsingShaders && n.skeleton) {\n e.NUM_BONE_INFLUENCERS = n.numBoneInfluencers;\n const t = e.BONETEXTURE !== void 0;\n if (n.skeleton.isUsingTextureForMatrices && t)\n e.BONETEXTURE = !0;\n else {\n e.BonesPerMesh = n.skeleton.bones.length + 1, e.BONETEXTURE = t ? !1 : void 0;\n const i = n.getScene().prePassRenderer;\n if (i && i.enabled) {\n const r = i.excludedSkinnedMesh.indexOf(n) === -1;\n e.BONES_VELOCITY_ENABLED = r;\n }\n }\n } else\n e.NUM_BONE_INFLUENCERS = 0, e.BonesPerMesh = 0, e.BONETEXTURE !== void 0 && (e.BONETEXTURE = !1);\n}\nfunction tI(n, e) {\n const t = n.morphTargetManager;\n t ? (e.MORPHTARGETS_UV = t.supportsUVs && e.UV1, e.MORPHTARGETS_TANGENT = t.supportsTangents && e.TANGENT, e.MORPHTARGETS_NORMAL = t.supportsNormals && e.NORMAL, e.NUM_MORPH_INFLUENCERS = t.numMaxInfluencers || t.numInfluencers, e.MORPHTARGETS = e.NUM_MORPH_INFLUENCERS > 0, e.MORPHTARGETS_TEXTURE = t.isUsingTextureForTargets) : (e.MORPHTARGETS_UV = !1, e.MORPHTARGETS_TANGENT = !1, e.MORPHTARGETS_NORMAL = !1, e.MORPHTARGETS = !1, e.NUM_MORPH_INFLUENCERS = 0);\n}\nfunction iI(n, e) {\n const t = n.bakedVertexAnimationManager;\n e.BAKED_VERTEX_ANIMATION_TEXTURE = !!(t && t.isEnabled);\n}\nfunction uf(n, e, t, i, r = !1, s = !0, a = !0) {\n if (!e._areAttributesDirty && e._needNormals === e._normals && e._needUVs === e._uvs)\n return !1;\n e._normals = e._needNormals, e._uvs = e._needUVs, e.NORMAL = e._needNormals && n.isVerticesDataPresent(\"normal\"), e._needNormals && n.isVerticesDataPresent(\"tangent\") && (e.TANGENT = !0);\n for (let o = 1; o <= 6; ++o)\n e[\"UV\" + o] = e._needUVs ? n.isVerticesDataPresent(`uv${o === 1 ? \"\" : o}`) : !1;\n if (t) {\n const o = n.useVertexColors && n.isVerticesDataPresent(\"color\");\n e.VERTEXCOLOR = o, e.VERTEXALPHA = n.hasVertexAlpha && o && s;\n }\n return n.isVerticesDataPresent(\"instanceColor\") && (n.hasInstances || n.hasThinInstances) && (e.INSTANCESCOLOR = !0), i && eI(n, e), r && tI(n, e), a && iI(n, e), !0;\n}\nfunction s0(n, e) {\n if (n.activeCamera) {\n const t = e.MULTIVIEW;\n e.MULTIVIEW = n.activeCamera.outputRenderTarget !== null && n.activeCamera.outputRenderTarget.getViewCount() > 1, e.MULTIVIEW != t && e.markAsUnprocessed();\n }\n}\nfunction n0(n, e, t) {\n const i = e.ORDER_INDEPENDENT_TRANSPARENCY, r = e.ORDER_INDEPENDENT_TRANSPARENCY_16BITS;\n e.ORDER_INDEPENDENT_TRANSPARENCY = n.useOrderIndependentTransparency && t, e.ORDER_INDEPENDENT_TRANSPARENCY_16BITS = !n.getEngine().getCaps().textureFloatLinearFiltering, (i !== e.ORDER_INDEPENDENT_TRANSPARENCY || r !== e.ORDER_INDEPENDENT_TRANSPARENCY_16BITS) && e.markAsUnprocessed();\n}\nfunction a0(n, e, t) {\n const i = e.PREPASS;\n if (!e._arePrePassDirty)\n return;\n const r = [\n {\n type: 1,\n define: \"PREPASS_POSITION\",\n index: \"PREPASS_POSITION_INDEX\"\n },\n {\n type: 2,\n define: \"PREPASS_VELOCITY\",\n index: \"PREPASS_VELOCITY_INDEX\"\n },\n {\n type: 3,\n define: \"PREPASS_REFLECTIVITY\",\n index: \"PREPASS_REFLECTIVITY_INDEX\"\n },\n {\n type: 0,\n define: \"PREPASS_IRRADIANCE\",\n index: \"PREPASS_IRRADIANCE_INDEX\"\n },\n {\n type: 7,\n define: \"PREPASS_ALBEDO_SQRT\",\n index: \"PREPASS_ALBEDO_SQRT_INDEX\"\n },\n {\n type: 5,\n define: \"PREPASS_DEPTH\",\n index: \"PREPASS_DEPTH_INDEX\"\n },\n {\n type: 6,\n define: \"PREPASS_NORMAL\",\n index: \"PREPASS_NORMAL_INDEX\"\n }\n ];\n if (n.prePassRenderer && n.prePassRenderer.enabled && t) {\n e.PREPASS = !0, e.SCENE_MRT_COUNT = n.prePassRenderer.mrtCount, e.PREPASS_NORMAL_WORLDSPACE = n.prePassRenderer.generateNormalsInWorldSpace;\n for (let s = 0; s < r.length; s++) {\n const a = n.prePassRenderer.getIndex(r[s].type);\n a !== -1 ? (e[r[s].define] = !0, e[r[s].index] = a) : e[r[s].define] = !1;\n }\n } else {\n e.PREPASS = !1;\n for (let s = 0; s < r.length; s++)\n e[r[s].define] = !1;\n }\n e.PREPASS != i && (e.markAsUnprocessed(), e.markAsImageProcessingDirty());\n}\nfunction rI(n, e) {\n let t = !1;\n if (n.activeCamera) {\n const i = e.CAMERA_ORTHOGRAPHIC ? 1 : 0, r = e.CAMERA_PERSPECTIVE ? 1 : 0, s = n.activeCamera.mode === 1 ? 1 : 0, a = n.activeCamera.mode === 0 ? 1 : 0;\n (i ^ s || r ^ a) && (e.CAMERA_ORTHOGRAPHIC = s === 1, e.CAMERA_PERSPECTIVE = a === 1, t = !0);\n }\n return t;\n}\nfunction sI(n, e, t, i, r = null, s = !1) {\n r && r.push(\"Light\" + n), !s && (e.push(\"vLightData\" + n, \"vLightDiffuse\" + n, \"vLightSpecular\" + n, \"vLightDirection\" + n, \"vLightFalloff\" + n, \"vLightGround\" + n, \"lightMatrix\" + n, \"shadowsInfo\" + n, \"depthValues\" + n), t.push(\"shadowSampler\" + n), t.push(\"depthSampler\" + n), e.push(\"viewFrustumZ\" + n, \"cascadeBlendFactor\" + n, \"lightSizeUVCorrection\" + n, \"depthCorrection\" + n, \"penumbraDarkness\" + n, \"frustumLengths\" + n), i && (t.push(\"projectionLightSampler\" + n), e.push(\"textureProjectionMatrix\" + n)));\n}\nfunction ff(n, e, t, i = 4) {\n let r, s = null;\n if (n.uniformsNames) {\n const a = n;\n r = a.uniformsNames, s = a.uniformBuffersNames, e = a.samplers, t = a.defines, i = a.maxSimultaneousLights || 0;\n } else\n r = n, e || (e = []);\n for (let a = 0; a < i && t[\"LIGHT\" + a]; a++)\n sI(a, r, e, t[\"PROJECTEDLIGHTTEXTURE\" + a], s);\n t.NUM_MORPH_INFLUENCERS && (r.push(\"morphTargetInfluences\"), r.push(\"morphTargetCount\")), t.BAKED_VERTEX_ANIMATION_TEXTURE && (r.push(\"bakedVertexAnimationSettings\"), r.push(\"bakedVertexAnimationTextureSizeInverted\"), r.push(\"bakedVertexAnimationTime\"), e.push(\"bakedVertexAnimationTexture\"));\n}\nclass ie {\n /**\n * If the material can be rendered to several textures with MRT extension\n */\n get canRenderToMRT() {\n return !1;\n }\n /**\n * Sets the alpha value of the material\n */\n set alpha(e) {\n if (this._alpha === e)\n return;\n const t = this._alpha;\n this._alpha = e, (t === 1 || e === 1) && this.markAsDirty(ie.MiscDirtyFlag + ie.PrePassDirtyFlag);\n }\n /**\n * Gets the alpha value of the material\n */\n get alpha() {\n return this._alpha;\n }\n /**\n * Sets the culling state (true to enable culling, false to disable)\n */\n set backFaceCulling(e) {\n this._backFaceCulling !== e && (this._backFaceCulling = e, this.markAsDirty(ie.TextureDirtyFlag));\n }\n /**\n * Gets the culling state\n */\n get backFaceCulling() {\n return this._backFaceCulling;\n }\n /**\n * Sets the type of faces that should be culled (true for back faces, false for front faces)\n */\n set cullBackFaces(e) {\n this._cullBackFaces !== e && (this._cullBackFaces = e, this.markAsDirty(ie.TextureDirtyFlag));\n }\n /**\n * Gets the type of faces that should be culled\n */\n get cullBackFaces() {\n return this._cullBackFaces;\n }\n /**\n * Block the dirty-mechanism for this specific material\n * When set to false after being true the material will be marked as dirty.\n */\n get blockDirtyMechanism() {\n return this._blockDirtyMechanism;\n }\n set blockDirtyMechanism(e) {\n this._blockDirtyMechanism !== e && (this._blockDirtyMechanism = e, e || this.markDirty());\n }\n /**\n * This allows you to modify the material without marking it as dirty after every change.\n * This function should be used if you need to make more than one dirty-enabling change to the material - adding a texture, setting a new fill mode and so on.\n * The callback will pass the material as an argument, so you can make your changes to it.\n * @param callback the callback to be executed that will update the material\n */\n atomicMaterialsUpdate(e) {\n this.blockDirtyMechanism = !0;\n try {\n e(this);\n } finally {\n this.blockDirtyMechanism = !1;\n }\n }\n /**\n * Gets a boolean indicating that current material needs to register RTT\n */\n get hasRenderTargetTextures() {\n return this._eventInfo.hasRenderTargetTextures = !1, this._callbackPluginEventHasRenderTargetTextures(this._eventInfo), this._eventInfo.hasRenderTargetTextures;\n }\n /**\n * Called during a dispose event\n */\n set onDispose(e) {\n this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e);\n }\n /**\n * An event triggered when the material is bound\n */\n get onBindObservable() {\n return this._onBindObservable || (this._onBindObservable = new he()), this._onBindObservable;\n }\n /**\n * Called during a bind event\n */\n set onBind(e) {\n this._onBindObserver && this.onBindObservable.remove(this._onBindObserver), this._onBindObserver = this.onBindObservable.add(e);\n }\n /**\n * An event triggered when the material is unbound\n */\n get onUnBindObservable() {\n return this._onUnBindObservable || (this._onUnBindObservable = new he()), this._onUnBindObservable;\n }\n /**\n * An event triggered when the effect is (re)created\n */\n get onEffectCreatedObservable() {\n return this._onEffectCreatedObservable || (this._onEffectCreatedObservable = new he()), this._onEffectCreatedObservable;\n }\n /**\n * Sets the value of the alpha mode.\n *\n * | Value | Type | Description |\n * | --- | --- | --- |\n * | 0 | ALPHA_DISABLE | |\n * | 1 | ALPHA_ADD | |\n * | 2 | ALPHA_COMBINE | |\n * | 3 | ALPHA_SUBTRACT | |\n * | 4 | ALPHA_MULTIPLY | |\n * | 5 | ALPHA_MAXIMIZED | |\n * | 6 | ALPHA_ONEONE | |\n * | 7 | ALPHA_PREMULTIPLIED | |\n * | 8 | ALPHA_PREMULTIPLIED_PORTERDUFF | |\n * | 9 | ALPHA_INTERPOLATE | |\n * | 10 | ALPHA_SCREENMODE | |\n *\n */\n set alphaMode(e) {\n this._alphaMode !== e && (this._alphaMode = e, this.markAsDirty(ie.TextureDirtyFlag));\n }\n /**\n * Gets the value of the alpha mode\n */\n get alphaMode() {\n return this._alphaMode;\n }\n /**\n * Sets the need depth pre-pass value\n */\n set needDepthPrePass(e) {\n this._needDepthPrePass !== e && (this._needDepthPrePass = e, this._needDepthPrePass && (this.checkReadyOnEveryCall = !0));\n }\n /**\n * Gets the depth pre-pass value\n */\n get needDepthPrePass() {\n return this._needDepthPrePass;\n }\n /**\n * Can this material render to prepass\n */\n get isPrePassCapable() {\n return !1;\n }\n /**\n * Sets the state for enabling fog\n */\n set fogEnabled(e) {\n this._fogEnabled !== e && (this._fogEnabled = e, this.markAsDirty(ie.MiscDirtyFlag));\n }\n /**\n * Gets the value of the fog enabled state\n */\n get fogEnabled() {\n return this._fogEnabled;\n }\n get wireframe() {\n switch (this._fillMode) {\n case ie.WireFrameFillMode:\n case ie.LineListDrawMode:\n case ie.LineLoopDrawMode:\n case ie.LineStripDrawMode:\n return !0;\n }\n return this._scene.forceWireframe;\n }\n /**\n * Sets the state of wireframe mode\n */\n set wireframe(e) {\n this.fillMode = e ? ie.WireFrameFillMode : ie.TriangleFillMode;\n }\n /**\n * Gets the value specifying if point clouds are enabled\n */\n get pointsCloud() {\n switch (this._fillMode) {\n case ie.PointFillMode:\n case ie.PointListDrawMode:\n return !0;\n }\n return this._scene.forcePointsCloud;\n }\n /**\n * Sets the state of point cloud mode\n */\n set pointsCloud(e) {\n this.fillMode = e ? ie.PointFillMode : ie.TriangleFillMode;\n }\n /**\n * Gets the material fill mode\n */\n get fillMode() {\n return this._fillMode;\n }\n /**\n * Sets the material fill mode\n */\n set fillMode(e) {\n this._fillMode !== e && (this._fillMode = e, this.markAsDirty(ie.MiscDirtyFlag));\n }\n /**\n * In case the depth buffer does not allow enough depth precision for your scene (might be the case in large scenes)\n * You can try switching to logarithmic depth.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/logarithmicDepthBuffer\n */\n get useLogarithmicDepth() {\n return this._useLogarithmicDepth;\n }\n set useLogarithmicDepth(e) {\n const t = this.getScene().getEngine().getCaps().fragmentDepthSupported;\n e && !t && ne.Warn(\"Logarithmic depth has been requested for a material on a device that doesn't support it.\"), this._useLogarithmicDepth = e && t, this._markAllSubMeshesAsMiscDirty();\n }\n /** @internal */\n _getDrawWrapper() {\n return this._drawWrapper;\n }\n /**\n * @internal\n */\n _setDrawWrapper(e) {\n this._drawWrapper = e;\n }\n /**\n * Creates a material instance\n * @param name defines the name of the material\n * @param scene defines the scene to reference\n * @param doNotAdd specifies if the material should be added to the scene\n */\n constructor(e, t, i) {\n this.shadowDepthWrapper = null, this.allowShaderHotSwapping = !0, this.metadata = null, this.reservedDataStore = null, this.checkReadyOnEveryCall = !1, this.checkReadyOnlyOnce = !1, this.state = \"\", this._alpha = 1, this._backFaceCulling = !0, this._cullBackFaces = !0, this._blockDirtyMechanism = !1, this.onCompiled = null, this.onError = null, this.getRenderTargetTextures = null, this.doNotSerialize = !1, this._storeEffectOnSubMeshes = !1, this.animations = null, this.onDisposeObservable = new he(), this._onDisposeObserver = null, this._onUnBindObservable = null, this._onBindObserver = null, this._alphaMode = 2, this._needDepthPrePass = !1, this.disableDepthWrite = !1, this.disableColorWrite = !1, this.forceDepthWrite = !1, this.depthFunction = 0, this.separateCullingPass = !1, this._fogEnabled = !0, this.pointSize = 1, this.zOffset = 0, this.zOffsetUnits = 0, this.stencil = new zs(), this._useUBO = !1, this._fillMode = ie.TriangleFillMode, this._cachedDepthWriteState = !1, this._cachedColorWriteState = !1, this._cachedDepthFunctionState = 0, this._indexInSceneMaterialArray = -1, this.meshMap = null, this._parentContainer = null, this._uniformBufferLayoutBuilt = !1, this._eventInfo = {}, this._callbackPluginEventGeneric = () => {\n }, this._callbackPluginEventIsReadyForSubMesh = () => {\n }, this._callbackPluginEventPrepareDefines = () => {\n }, this._callbackPluginEventPrepareDefinesBeforeAttributes = () => {\n }, this._callbackPluginEventHardBindForSubMesh = () => {\n }, this._callbackPluginEventBindForSubMesh = () => {\n }, this._callbackPluginEventHasRenderTargetTextures = () => {\n }, this._callbackPluginEventFillRenderTargetTextures = () => {\n }, this._forceAlphaTest = !1, this._transparencyMode = null, this.name = e;\n const r = t || st.LastCreatedScene;\n r && (this._scene = r, this._dirtyCallbacks = {}, this._dirtyCallbacks[1] = this._markAllSubMeshesAsTexturesDirty.bind(this), this._dirtyCallbacks[2] = this._markAllSubMeshesAsLightsDirty.bind(this), this._dirtyCallbacks[4] = this._markAllSubMeshesAsFresnelDirty.bind(this), this._dirtyCallbacks[8] = this._markAllSubMeshesAsAttributesDirty.bind(this), this._dirtyCallbacks[16] = this._markAllSubMeshesAsMiscDirty.bind(this), this._dirtyCallbacks[32] = this._markAllSubMeshesAsPrePassDirty.bind(this), this._dirtyCallbacks[63] = this._markAllSubMeshesAsAllDirty.bind(this), this.id = e || ge.RandomId(), this.uniqueId = this._scene.getUniqueId(), this._materialContext = this._scene.getEngine().createMaterialContext(), this._drawWrapper = new ka(this._scene.getEngine(), !1), this._drawWrapper.materialContext = this._materialContext, this._scene.useRightHandedSystem ? this.sideOrientation = ie.ClockWiseSideOrientation : this.sideOrientation = ie.CounterClockWiseSideOrientation, this._uniformBuffer = new Ie(this._scene.getEngine(), void 0, void 0, e), this._useUBO = this.getScene().getEngine().supportsUniformBuffers, i || this._scene.addMaterial(this), this._scene.useMaterialMeshMap && (this.meshMap = {}), ie.OnEventObservable.notifyObservers(this, Ri.Created));\n }\n /**\n * Returns a string representation of the current material\n * @param fullDetails defines a boolean indicating which levels of logging is desired\n * @returns a string with material information\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n toString(e) {\n return \"Name: \" + this.name;\n }\n /**\n * Gets the class name of the material\n * @returns a string with the class name of the material\n */\n getClassName() {\n return \"Material\";\n }\n /** @internal */\n get _isMaterial() {\n return !0;\n }\n /**\n * Specifies if updates for the material been locked\n */\n get isFrozen() {\n return this.checkReadyOnlyOnce;\n }\n /**\n * Locks updates for the material\n */\n freeze() {\n this.markDirty(), this.checkReadyOnlyOnce = !0;\n }\n /**\n * Unlocks updates for the material\n */\n unfreeze() {\n this.markDirty(), this.checkReadyOnlyOnce = !1;\n }\n /**\n * Specifies if the material is ready to be used\n * @param mesh defines the mesh to check\n * @param useInstances specifies if instances should be used\n * @returns a boolean indicating if the material is ready to be used\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isReady(e, t) {\n return !0;\n }\n /**\n * Specifies that the submesh is ready to be used\n * @param mesh defines the mesh to check\n * @param subMesh defines which submesh to check\n * @param useInstances specifies that instances should be used\n * @returns a boolean indicating that the submesh is ready or not\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isReadyForSubMesh(e, t, i) {\n const r = t.materialDefines;\n return r ? (this._eventInfo.isReadyForSubMesh = !0, this._eventInfo.defines = r, this._callbackPluginEventIsReadyForSubMesh(this._eventInfo), this._eventInfo.isReadyForSubMesh) : !1;\n }\n /**\n * Returns the material effect\n * @returns the effect associated with the material\n */\n getEffect() {\n return this._drawWrapper.effect;\n }\n /**\n * Returns the current scene\n * @returns a Scene\n */\n getScene() {\n return this._scene;\n }\n /**\n * Gets the current transparency mode.\n */\n get transparencyMode() {\n return this._transparencyMode;\n }\n /**\n * Sets the transparency mode of the material.\n *\n * | Value | Type | Description |\n * | ----- | ----------------------------------- | ----------- |\n * | 0 | OPAQUE | |\n * | 1 | ALPHATEST | |\n * | 2 | ALPHABLEND | |\n * | 3 | ALPHATESTANDBLEND | |\n *\n */\n set transparencyMode(e) {\n this._transparencyMode !== e && (this._transparencyMode = e, this._forceAlphaTest = e === ie.MATERIAL_ALPHATESTANDBLEND, this._markAllSubMeshesAsTexturesAndMiscDirty());\n }\n /**\n * Returns true if alpha blending should be disabled.\n */\n get _disableAlphaBlending() {\n return this._transparencyMode === ie.MATERIAL_OPAQUE || this._transparencyMode === ie.MATERIAL_ALPHATEST;\n }\n /**\n * Specifies whether or not this material should be rendered in alpha blend mode.\n * @returns a boolean specifying if alpha blending is needed\n */\n needAlphaBlending() {\n return this._disableAlphaBlending ? !1 : this.alpha < 1;\n }\n /**\n * Specifies if the mesh will require alpha blending\n * @param mesh defines the mesh to check\n * @returns a boolean specifying if alpha blending is needed for the mesh\n */\n needAlphaBlendingForMesh(e) {\n return e.visibility < 1 ? !0 : this._disableAlphaBlending ? !1 : e.hasVertexAlpha || this.needAlphaBlending();\n }\n /**\n * Specifies whether or not this material should be rendered in alpha test mode.\n * @returns a boolean specifying if an alpha test is needed.\n */\n needAlphaTesting() {\n return !!this._forceAlphaTest;\n }\n /**\n * Specifies if material alpha testing should be turned on for the mesh\n * @param mesh defines the mesh to check\n * @returns a boolean specifying if alpha testing should be turned on for the mesh\n */\n _shouldTurnAlphaTestOn(e) {\n return !this.needAlphaBlendingForMesh(e) && this.needAlphaTesting();\n }\n /**\n * Gets the texture used for the alpha test\n * @returns the texture to use for alpha testing\n */\n getAlphaTestTexture() {\n return null;\n }\n /**\n * Marks the material to indicate that it needs to be re-calculated\n * @param forceMaterialDirty - Forces the material to be marked as dirty for all components (same as this.markAsDirty(Material.AllDirtyFlag)). You should use this flag if the material is frozen and you want to force a recompilation.\n */\n markDirty(e = !1) {\n const t = this.getScene().meshes;\n for (const i of t)\n if (i.subMeshes) {\n for (const r of i.subMeshes)\n if (r.getMaterial() === this)\n for (const s of r._drawWrappers)\n s && this._materialContext === s.materialContext && (s._wasPreviouslyReady = !1, s._wasPreviouslyUsingInstances = null, s._forceRebindOnNextCall = e);\n }\n e && this.markAsDirty(ie.AllDirtyFlag);\n }\n /**\n * @internal\n */\n _preBind(e, t = null) {\n const i = this._scene.getEngine(), s = (t ?? this.sideOrientation) === ie.ClockWiseSideOrientation;\n return i.enableEffect(e || this._getDrawWrapper()), i.setState(this.backFaceCulling, this.zOffset, !1, s, this._scene._mirroredCameraPosition ? !this.cullBackFaces : this.cullBackFaces, this.stencil, this.zOffsetUnits), s;\n }\n /**\n * Binds the material to the mesh\n * @param world defines the world transformation matrix\n * @param mesh defines the mesh to bind the material to\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n bind(e, t) {\n }\n /**\n * Initializes the uniform buffer layout for the shader.\n */\n buildUniformLayout() {\n const e = this._uniformBuffer;\n this._eventInfo.ubo = e, this._callbackPluginEventGeneric(Ri.PrepareUniformBuffer, this._eventInfo), e.create(), this._uniformBufferLayoutBuilt = !0;\n }\n /**\n * Binds the submesh to the material\n * @param world defines the world transformation matrix\n * @param mesh defines the mesh containing the submesh\n * @param subMesh defines the submesh to bind the material to\n */\n bindForSubMesh(e, t, i) {\n const r = i._drawWrapper;\n this._eventInfo.subMesh = i, this._callbackPluginEventBindForSubMesh(this._eventInfo), r._forceRebindOnNextCall = !1;\n }\n /**\n * Binds the world matrix to the material\n * @param world defines the world transformation matrix\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n bindOnlyWorldMatrix(e) {\n }\n /**\n * Binds the view matrix to the effect\n * @param effect defines the effect to bind the view matrix to\n */\n bindView(e) {\n this._useUBO ? this._needToBindSceneUbo = !0 : e.setMatrix(\"view\", this.getScene().getViewMatrix());\n }\n /**\n * Binds the view projection and projection matrices to the effect\n * @param effect defines the effect to bind the view projection and projection matrices to\n */\n bindViewProjection(e) {\n this._useUBO ? this._needToBindSceneUbo = !0 : (e.setMatrix(\"viewProjection\", this.getScene().getTransformMatrix()), e.setMatrix(\"projection\", this.getScene().getProjectionMatrix()));\n }\n /**\n * Binds the view matrix to the effect\n * @param effect defines the effect to bind the view matrix to\n * @param variableName name of the shader variable that will hold the eye position\n */\n bindEyePosition(e, t) {\n this._useUBO ? this._needToBindSceneUbo = !0 : this._scene.bindEyePosition(e, t);\n }\n /**\n * Processes to execute after binding the material to a mesh\n * @param mesh defines the rendered mesh\n * @param effect defines the effect used to bind the material\n * @param _subMesh defines the subMesh that the material has been bound for\n */\n _afterBind(e, t = null, i) {\n if (this._scene._cachedMaterial = this, this._needToBindSceneUbo && t && (this._needToBindSceneUbo = !1, $_(t, this.getScene().getSceneUniformBuffer()), this._scene.finalizeSceneUbo()), e ? this._scene._cachedVisibility = e.visibility : this._scene._cachedVisibility = 1, this._onBindObservable && e && this._onBindObservable.notifyObservers(e), this.disableDepthWrite) {\n const r = this._scene.getEngine();\n this._cachedDepthWriteState = r.getDepthWrite(), r.setDepthWrite(!1);\n }\n if (this.disableColorWrite) {\n const r = this._scene.getEngine();\n this._cachedColorWriteState = r.getColorWrite(), r.setColorWrite(!1);\n }\n if (this.depthFunction !== 0) {\n const r = this._scene.getEngine();\n this._cachedDepthFunctionState = r.getDepthFunction() || 0, r.setDepthFunction(this.depthFunction);\n }\n }\n /**\n * Unbinds the material from the mesh\n */\n unbind() {\n this._onUnBindObservable && this._onUnBindObservable.notifyObservers(this), this.depthFunction !== 0 && this._scene.getEngine().setDepthFunction(this._cachedDepthFunctionState), this.disableDepthWrite && this._scene.getEngine().setDepthWrite(this._cachedDepthWriteState), this.disableColorWrite && this._scene.getEngine().setColorWrite(this._cachedColorWriteState);\n }\n /**\n * Returns the animatable textures.\n * @returns - Array of animatable textures.\n */\n getAnimatables() {\n return this._eventInfo.animatables = [], this._callbackPluginEventGeneric(Ri.GetAnimatables, this._eventInfo), this._eventInfo.animatables;\n }\n /**\n * Gets the active textures from the material\n * @returns an array of textures\n */\n getActiveTextures() {\n return this._eventInfo.activeTextures = [], this._callbackPluginEventGeneric(Ri.GetActiveTextures, this._eventInfo), this._eventInfo.activeTextures;\n }\n /**\n * Specifies if the material uses a texture\n * @param texture defines the texture to check against the material\n * @returns a boolean specifying if the material uses the texture\n */\n hasTexture(e) {\n return this._eventInfo.hasTexture = !1, this._eventInfo.texture = e, this._callbackPluginEventGeneric(Ri.HasTexture, this._eventInfo), this._eventInfo.hasTexture;\n }\n /**\n * Makes a duplicate of the material, and gives it a new name\n * @param name defines the new name for the duplicated material\n * @returns the cloned material\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n clone(e) {\n return null;\n }\n _clonePlugins(e, t) {\n const i = {};\n if (this._serializePlugins(i), ie._ParsePlugins(i, e, this._scene, t), this.pluginManager)\n for (const r of this.pluginManager._plugins) {\n const s = e.pluginManager.getPlugin(r.name);\n s && r.copyTo(s);\n }\n }\n /**\n * Gets the meshes bound to the material\n * @returns an array of meshes bound to the material\n */\n getBindedMeshes() {\n if (this.meshMap) {\n const e = [];\n for (const t in this.meshMap) {\n const i = this.meshMap[t];\n i && e.push(i);\n }\n return e;\n } else\n return this._scene.meshes.filter((t) => t.material === this);\n }\n /**\n * Force shader compilation\n * @param mesh defines the mesh associated with this material\n * @param onCompiled defines a function to execute once the material is compiled\n * @param options defines the options to configure the compilation\n * @param onError defines a function to execute if the material fails compiling\n */\n forceCompilation(e, t, i, r) {\n const s = {\n clipPlane: !1,\n useInstances: !1,\n ...i\n }, a = this.getScene(), o = this.allowShaderHotSwapping;\n this.allowShaderHotSwapping = !1;\n const l = () => {\n if (!this._scene || !this._scene.getEngine())\n return;\n const c = a.clipPlane;\n if (s.clipPlane && (a.clipPlane = new qr(0, 0, 0, 1)), this._storeEffectOnSubMeshes) {\n let h = !0, u = null;\n if (e.subMeshes) {\n const f = new bi(0, 0, 0, 0, 0, e, void 0, !1, !1);\n f.materialDefines && (f.materialDefines._renderId = -1), this.isReadyForSubMesh(e, f, s.useInstances) || (f.effect && f.effect.getCompilationError() && f.effect.allFallbacksProcessed() ? u = f.effect.getCompilationError() : (h = !1, setTimeout(l, 16)));\n }\n h && (this.allowShaderHotSwapping = o, u && r && r(u), t && t(this));\n } else\n this.isReady() ? (this.allowShaderHotSwapping = o, t && t(this)) : setTimeout(l, 16);\n s.clipPlane && (a.clipPlane = c);\n };\n l();\n }\n /**\n * Force shader compilation\n * @param mesh defines the mesh that will use this material\n * @param options defines additional options for compiling the shaders\n * @returns a promise that resolves when the compilation completes\n */\n forceCompilationAsync(e, t) {\n return new Promise((i, r) => {\n this.forceCompilation(e, () => {\n i();\n }, t, (s) => {\n r(s);\n });\n });\n }\n /**\n * Marks a define in the material to indicate that it needs to be re-computed\n * @param flag defines a flag used to determine which parts of the material have to be marked as dirty\n */\n markAsDirty(e) {\n this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism || (ie._DirtyCallbackArray.length = 0, e & ie.TextureDirtyFlag && ie._DirtyCallbackArray.push(ie._TextureDirtyCallBack), e & ie.LightDirtyFlag && ie._DirtyCallbackArray.push(ie._LightsDirtyCallBack), e & ie.FresnelDirtyFlag && ie._DirtyCallbackArray.push(ie._FresnelDirtyCallBack), e & ie.AttributesDirtyFlag && ie._DirtyCallbackArray.push(ie._AttributeDirtyCallBack), e & ie.MiscDirtyFlag && ie._DirtyCallbackArray.push(ie._MiscDirtyCallBack), e & ie.PrePassDirtyFlag && ie._DirtyCallbackArray.push(ie._PrePassDirtyCallBack), ie._DirtyCallbackArray.length && this._markAllSubMeshesAsDirty(ie._RunDirtyCallBacks), this.getScene().resetCachedMaterial());\n }\n /**\n * Resets the draw wrappers cache for all submeshes that are using this material\n */\n resetDrawCache() {\n const e = this.getScene().meshes;\n for (const t of e)\n if (t.subMeshes)\n for (const i of t.subMeshes)\n i.getMaterial() === this && i.resetDrawCache();\n }\n /**\n * Marks all submeshes of a material to indicate that their material defines need to be re-calculated\n * @param func defines a function which checks material defines against the submeshes\n */\n _markAllSubMeshesAsDirty(e) {\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism)\n return;\n const t = this.getScene().meshes;\n for (const i of t)\n if (i.subMeshes) {\n for (const r of i.subMeshes)\n if (r.getMaterial(!1) === this)\n for (const s of r._drawWrappers)\n !s || !s.defines || !s.defines.markAllAsDirty || this._materialContext === s.materialContext && e(s.defines);\n }\n }\n /**\n * Indicates that the scene should check if the rendering now needs a prepass\n */\n _markScenePrePassDirty() {\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism)\n return;\n const e = this.getScene().enablePrePassRenderer();\n e && e.markAsDirty();\n }\n /**\n * Indicates that we need to re-calculated for all submeshes\n */\n _markAllSubMeshesAsAllDirty() {\n this._markAllSubMeshesAsDirty(ie._AllDirtyCallBack);\n }\n /**\n * Indicates that image processing needs to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsImageProcessingDirty() {\n this._markAllSubMeshesAsDirty(ie._ImageProcessingDirtyCallBack);\n }\n /**\n * Indicates that textures need to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsTexturesDirty() {\n this._markAllSubMeshesAsDirty(ie._TextureDirtyCallBack);\n }\n /**\n * Indicates that fresnel needs to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsFresnelDirty() {\n this._markAllSubMeshesAsDirty(ie._FresnelDirtyCallBack);\n }\n /**\n * Indicates that fresnel and misc need to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsFresnelAndMiscDirty() {\n this._markAllSubMeshesAsDirty(ie._FresnelAndMiscDirtyCallBack);\n }\n /**\n * Indicates that lights need to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsLightsDirty() {\n this._markAllSubMeshesAsDirty(ie._LightsDirtyCallBack);\n }\n /**\n * Indicates that attributes need to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsAttributesDirty() {\n this._markAllSubMeshesAsDirty(ie._AttributeDirtyCallBack);\n }\n /**\n * Indicates that misc needs to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsMiscDirty() {\n this._markAllSubMeshesAsDirty(ie._MiscDirtyCallBack);\n }\n /**\n * Indicates that prepass needs to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsPrePassDirty() {\n this._markAllSubMeshesAsDirty(ie._MiscDirtyCallBack);\n }\n /**\n * Indicates that textures and misc need to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsTexturesAndMiscDirty() {\n this._markAllSubMeshesAsDirty(ie._TextureAndMiscDirtyCallBack);\n }\n _checkScenePerformancePriority() {\n if (this._scene.performancePriority !== fs.BackwardCompatible) {\n this.checkReadyOnlyOnce = !0;\n const e = this._scene.onScenePerformancePriorityChangedObservable.addOnce(() => {\n this.checkReadyOnlyOnce = !1;\n });\n this.onDisposeObservable.add(() => {\n this._scene.onScenePerformancePriorityChangedObservable.remove(e);\n });\n }\n }\n /**\n * Sets the required values to the prepass renderer.\n * @param prePassRenderer defines the prepass renderer to setup.\n * @returns true if the pre pass is needed.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setPrePassRenderer(e) {\n return !1;\n }\n /**\n * Disposes the material\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\n * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh\n */\n dispose(e, t, i) {\n const r = this.getScene();\n if (r.stopAnimation(this), r.freeProcessedMaterials(), r.removeMaterial(this), this._eventInfo.forceDisposeTextures = t, this._callbackPluginEventGeneric(Ri.Disposed, this._eventInfo), this._parentContainer) {\n const s = this._parentContainer.materials.indexOf(this);\n s > -1 && this._parentContainer.materials.splice(s, 1), this._parentContainer = null;\n }\n if (i !== !0)\n if (this.meshMap)\n for (const s in this.meshMap) {\n const a = this.meshMap[s];\n a && (a.material = null, this.releaseVertexArrayObject(a, e));\n }\n else {\n const s = r.meshes;\n for (const a of s)\n a.material === this && !a.sourceMesh && (a.material = null, this.releaseVertexArrayObject(a, e));\n }\n this._uniformBuffer.dispose(), e && this._drawWrapper.effect && (this._storeEffectOnSubMeshes || this._drawWrapper.effect.dispose(), this._drawWrapper.effect = null), this.metadata = null, this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear(), this._onBindObservable && this._onBindObservable.clear(), this._onUnBindObservable && this._onUnBindObservable.clear(), this._onEffectCreatedObservable && this._onEffectCreatedObservable.clear(), this._eventInfo && (this._eventInfo = {});\n }\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n releaseVertexArrayObject(e, t) {\n const i = e.geometry;\n if (i)\n if (this._storeEffectOnSubMeshes) {\n if (e.subMeshes)\n for (const r of e.subMeshes)\n i._releaseVertexArrayObject(r.effect), t && r.effect && r.effect.dispose();\n } else\n i._releaseVertexArrayObject(this._drawWrapper.effect);\n }\n /**\n * Serializes this material\n * @returns the serialized material object\n */\n serialize() {\n const e = Le.Serialize(this);\n return e.stencil = this.stencil.serialize(), e.uniqueId = this.uniqueId, this._serializePlugins(e), e;\n }\n _serializePlugins(e) {\n if (e.plugins = {}, this.pluginManager)\n for (const t of this.pluginManager._plugins)\n e.plugins[t.getClassName()] = t.serialize();\n }\n /**\n * Creates a material from parsed material data\n * @param parsedMaterial defines parsed material data\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures\n * @returns a new material\n */\n static Parse(e, t, i) {\n if (!e.customType)\n e.customType = \"BABYLON.StandardMaterial\";\n else if (e.customType === \"BABYLON.PBRMaterial\" && e.overloadedAlbedo && (e.customType = \"BABYLON.LegacyPBRMaterial\", !BABYLON.LegacyPBRMaterial))\n return ne.Error(\"Your scene is trying to load a legacy version of the PBRMaterial, please, include it from the materials library.\"), null;\n const s = ge.Instantiate(e.customType).Parse(e, t, i);\n return s._loadedUniqueId = e.uniqueId, s;\n }\n static _ParsePlugins(e, t, i, r) {\n var s;\n if (e.plugins)\n for (const a in e.plugins) {\n const o = e.plugins[a];\n let l = (s = t.pluginManager) == null ? void 0 : s.getPlugin(o.name);\n if (!l) {\n const c = ge.Instantiate(\"BABYLON.\" + a);\n c && (l = new c(t));\n }\n l == null || l.parse(o, i, r);\n }\n }\n}\nie.TriangleFillMode = 0;\nie.WireFrameFillMode = 1;\nie.PointFillMode = 2;\nie.PointListDrawMode = 3;\nie.LineListDrawMode = 4;\nie.LineLoopDrawMode = 5;\nie.LineStripDrawMode = 6;\nie.TriangleStripDrawMode = 7;\nie.TriangleFanDrawMode = 8;\nie.ClockWiseSideOrientation = 0;\nie.CounterClockWiseSideOrientation = 1;\nie.TextureDirtyFlag = 1;\nie.LightDirtyFlag = 2;\nie.FresnelDirtyFlag = 4;\nie.AttributesDirtyFlag = 8;\nie.MiscDirtyFlag = 16;\nie.PrePassDirtyFlag = 32;\nie.AllDirtyFlag = 63;\nie.MATERIAL_OPAQUE = 0;\nie.MATERIAL_ALPHATEST = 1;\nie.MATERIAL_ALPHABLEND = 2;\nie.MATERIAL_ALPHATESTANDBLEND = 3;\nie.MATERIAL_NORMALBLENDMETHOD_WHITEOUT = 0;\nie.MATERIAL_NORMALBLENDMETHOD_RNM = 1;\nie.OnEventObservable = new he();\nie._AllDirtyCallBack = (n) => n.markAllAsDirty();\nie._ImageProcessingDirtyCallBack = (n) => n.markAsImageProcessingDirty();\nie._TextureDirtyCallBack = (n) => n.markAsTexturesDirty();\nie._FresnelDirtyCallBack = (n) => n.markAsFresnelDirty();\nie._MiscDirtyCallBack = (n) => n.markAsMiscDirty();\nie._PrePassDirtyCallBack = (n) => n.markAsPrePassDirty();\nie._LightsDirtyCallBack = (n) => n.markAsLightDirty();\nie._AttributeDirtyCallBack = (n) => n.markAsAttributesDirty();\nie._FresnelAndMiscDirtyCallBack = (n) => {\n ie._FresnelDirtyCallBack(n), ie._MiscDirtyCallBack(n);\n};\nie._TextureAndMiscDirtyCallBack = (n) => {\n ie._TextureDirtyCallBack(n), ie._MiscDirtyCallBack(n);\n};\nie._DirtyCallbackArray = [];\nie._RunDirtyCallBacks = (n) => {\n for (const e of ie._DirtyCallbackArray)\n e(n);\n};\nP([\n U()\n], ie.prototype, \"id\", void 0);\nP([\n U()\n], ie.prototype, \"uniqueId\", void 0);\nP([\n U()\n], ie.prototype, \"name\", void 0);\nP([\n U()\n], ie.prototype, \"metadata\", void 0);\nP([\n U()\n], ie.prototype, \"checkReadyOnEveryCall\", void 0);\nP([\n U()\n], ie.prototype, \"checkReadyOnlyOnce\", void 0);\nP([\n U()\n], ie.prototype, \"state\", void 0);\nP([\n U(\"alpha\")\n], ie.prototype, \"_alpha\", void 0);\nP([\n U(\"backFaceCulling\")\n], ie.prototype, \"_backFaceCulling\", void 0);\nP([\n U(\"cullBackFaces\")\n], ie.prototype, \"_cullBackFaces\", void 0);\nP([\n U()\n], ie.prototype, \"sideOrientation\", void 0);\nP([\n U(\"alphaMode\")\n], ie.prototype, \"_alphaMode\", void 0);\nP([\n U()\n], ie.prototype, \"_needDepthPrePass\", void 0);\nP([\n U()\n], ie.prototype, \"disableDepthWrite\", void 0);\nP([\n U()\n], ie.prototype, \"disableColorWrite\", void 0);\nP([\n U()\n], ie.prototype, \"forceDepthWrite\", void 0);\nP([\n U()\n], ie.prototype, \"depthFunction\", void 0);\nP([\n U()\n], ie.prototype, \"separateCullingPass\", void 0);\nP([\n U(\"fogEnabled\")\n], ie.prototype, \"_fogEnabled\", void 0);\nP([\n U()\n], ie.prototype, \"pointSize\", void 0);\nP([\n U()\n], ie.prototype, \"zOffset\", void 0);\nP([\n U()\n], ie.prototype, \"zOffsetUnits\", void 0);\nP([\n U()\n], ie.prototype, \"pointsCloud\", null);\nP([\n U()\n], ie.prototype, \"fillMode\", null);\nP([\n U()\n], ie.prototype, \"useLogarithmicDepth\", null);\nP([\n U()\n], ie.prototype, \"transparencyMode\", null);\nclass Aa extends ie {\n /**\n * Gets or Sets the list of Materials used within the multi material.\n * They need to be ordered according to the submeshes order in the associated mesh\n */\n get subMaterials() {\n return this._subMaterials;\n }\n set subMaterials(e) {\n this._subMaterials = e, this._hookArray(e);\n }\n /**\n * Function used to align with Node.getChildren()\n * @returns the list of Materials used within the multi material\n */\n getChildren() {\n return this.subMaterials;\n }\n /**\n * Instantiates a new Multi Material\n * A multi-material is used to apply different materials to different parts of the same object without the need of\n * separate meshes. This can be use to improve performances.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials\n * @param name Define the name in the scene\n * @param scene Define the scene the material belongs to\n */\n constructor(e, t) {\n super(e, t, !0), this._waitingSubMaterialsUniqueIds = [], this.getScene().addMultiMaterial(this), this.subMaterials = [], this._storeEffectOnSubMeshes = !0;\n }\n _hookArray(e) {\n const t = e.push;\n e.push = (...r) => {\n const s = t.apply(e, r);\n return this._markAllSubMeshesAsTexturesDirty(), s;\n };\n const i = e.splice;\n e.splice = (r, s) => {\n const a = i.apply(e, [r, s]);\n return this._markAllSubMeshesAsTexturesDirty(), a;\n };\n }\n /**\n * Get one of the submaterial by its index in the submaterials array\n * @param index The index to look the sub material at\n * @returns The Material if the index has been defined\n */\n getSubMaterial(e) {\n return e < 0 || e >= this.subMaterials.length ? this.getScene().defaultMaterial : this.subMaterials[e];\n }\n /**\n * Get the list of active textures for the whole sub materials list.\n * @returns All the textures that will be used during the rendering\n */\n getActiveTextures() {\n return super.getActiveTextures().concat(...this.subMaterials.map((e) => e ? e.getActiveTextures() : []));\n }\n /**\n * Specifies if any sub-materials of this multi-material use a given texture.\n * @param texture Defines the texture to check against this multi-material's sub-materials.\n * @returns A boolean specifying if any sub-material of this multi-material uses the texture.\n */\n hasTexture(e) {\n var t;\n if (super.hasTexture(e))\n return !0;\n for (let i = 0; i < this.subMaterials.length; i++)\n if ((t = this.subMaterials[i]) != null && t.hasTexture(e))\n return !0;\n return !1;\n }\n /**\n * Gets the current class name of the material e.g. \"MultiMaterial\"\n * Mainly use in serialization.\n * @returns the class name\n */\n getClassName() {\n return \"MultiMaterial\";\n }\n /**\n * Checks if the material is ready to render the requested sub mesh\n * @param mesh Define the mesh the submesh belongs to\n * @param subMesh Define the sub mesh to look readiness for\n * @param useInstances Define whether or not the material is used with instances\n * @returns true if ready, otherwise false\n */\n isReadyForSubMesh(e, t, i) {\n for (let r = 0; r < this.subMaterials.length; r++) {\n const s = this.subMaterials[r];\n if (s) {\n if (s._storeEffectOnSubMeshes) {\n if (!s.isReadyForSubMesh(e, t, i))\n return !1;\n continue;\n }\n if (!s.isReady(e))\n return !1;\n }\n }\n return !0;\n }\n /**\n * Clones the current material and its related sub materials\n * @param name Define the name of the newly cloned material\n * @param cloneChildren Define if submaterial will be cloned or shared with the parent instance\n * @returns the cloned material\n */\n clone(e, t) {\n const i = new Aa(e, this.getScene());\n for (let r = 0; r < this.subMaterials.length; r++) {\n let s = null;\n const a = this.subMaterials[r];\n t && a ? s = a.clone(e + \"-\" + a.name) : s = this.subMaterials[r], i.subMaterials.push(s);\n }\n return i;\n }\n /**\n * Serializes the materials into a JSON representation.\n * @returns the JSON representation\n */\n serialize() {\n const e = {};\n e.name = this.name, e.id = this.id, e.uniqueId = this.uniqueId, rt && (e.tags = rt.GetTags(this)), e.materialsUniqueIds = [], e.materials = [];\n for (let t = 0; t < this.subMaterials.length; t++) {\n const i = this.subMaterials[t];\n i ? (e.materialsUniqueIds.push(i.uniqueId), e.materials.push(i.id)) : (e.materialsUniqueIds.push(null), e.materials.push(null));\n }\n return e;\n }\n /**\n * Dispose the material and release its associated resources\n * @param forceDisposeEffect Define if we want to force disposing the associated effect (if false the shader is not released and could be reuse later on)\n * @param forceDisposeTextures Define if we want to force disposing the associated textures (if false, they will not be disposed and can still be use elsewhere in the app)\n * @param forceDisposeChildren Define if we want to force disposing the associated submaterials (if false, they will not be disposed and can still be use elsewhere in the app)\n */\n dispose(e, t, i) {\n const r = this.getScene();\n if (!r)\n return;\n if (i)\n for (let a = 0; a < this.subMaterials.length; a++) {\n const o = this.subMaterials[a];\n o && o.dispose(e, t);\n }\n const s = r.multiMaterials.indexOf(this);\n s >= 0 && r.multiMaterials.splice(s, 1), super.dispose(e, t);\n }\n /**\n * Creates a MultiMaterial from parsed MultiMaterial data.\n * @param parsedMultiMaterial defines parsed MultiMaterial data.\n * @param scene defines the hosting scene\n * @returns a new MultiMaterial\n */\n static ParseMultiMaterial(e, t) {\n const i = new Aa(e.name, t);\n return i.id = e.id, i._loadedUniqueId = e.uniqueId, rt && rt.AddTagsTo(i, e.tags), e.materialsUniqueIds ? i._waitingSubMaterialsUniqueIds = e.materialsUniqueIds : e.materials.forEach((r) => i.subMaterials.push(t.getLastMaterialById(r))), i;\n }\n}\nRe(\"BABYLON.MultiMaterial\", Aa);\nclass nI {\n /**\n * Creates a new LOD level\n * @param distanceOrScreenCoverage defines either the distance or the screen coverage where this level should start being displayed\n * @param mesh defines the mesh to use to render this level\n */\n constructor(e, t) {\n this.distanceOrScreenCoverage = e, this.mesh = t;\n }\n}\nclass o0 {\n}\nclass aI {\n constructor() {\n this.visibleInstances = {}, this.batchCache = new ug(), this.batchCacheReplacementModeInFrozenMode = new ug(), this.instancesBufferSize = 32 * 16 * 4;\n }\n}\nclass ug {\n constructor() {\n this.mustReturn = !1, this.visibleInstances = new Array(), this.renderSelf = [], this.hardwareInstancedRendering = [];\n }\n}\nclass oI {\n constructor() {\n this.instancesCount = 0, this.matrixBuffer = null, this.previousMatrixBuffer = null, this.matrixBufferSize = 32 * 16, this.matrixData = null, this.boundingVectors = [], this.worldMatrices = null;\n }\n}\nclass lI {\n constructor() {\n this._areNormalsFrozen = !1, this._source = null, this.meshMap = null, this._preActivateId = -1, this._LODLevels = new Array(), this._useLODScreenCoverage = !1, this._effectiveMaterial = null, this._forcedInstanceCount = 0, this._overrideRenderingFillMode = null;\n }\n}\nclass B extends er {\n /**\n * Gets the default side orientation.\n * @param orientation the orientation to value to attempt to get\n * @returns the default orientation\n * @internal\n */\n static _GetDefaultSideOrientation(e) {\n return e || B.FRONTSIDE;\n }\n /**\n * Determines if the LOD levels are intended to be calculated using screen coverage (surface area ratio) instead of distance.\n */\n get useLODScreenCoverage() {\n return this._internalMeshDataInfo._useLODScreenCoverage;\n }\n set useLODScreenCoverage(e) {\n this._internalMeshDataInfo._useLODScreenCoverage = e, this._sortLODLevels();\n }\n get computeBonesUsingShaders() {\n return this._internalAbstractMeshDataInfo._computeBonesUsingShaders;\n }\n set computeBonesUsingShaders(e) {\n this._internalAbstractMeshDataInfo._computeBonesUsingShaders !== e && (e && this._internalMeshDataInfo._sourcePositions && (this.setVerticesData(I.PositionKind, this._internalMeshDataInfo._sourcePositions, !0), this._internalMeshDataInfo._sourceNormals && this.setVerticesData(I.NormalKind, this._internalMeshDataInfo._sourceNormals, !0), this._internalMeshDataInfo._sourcePositions = null, this._internalMeshDataInfo._sourceNormals = null), this._internalAbstractMeshDataInfo._computeBonesUsingShaders = e, this._markSubMeshesAsAttributesDirty());\n }\n /**\n * An event triggered before rendering the mesh\n */\n get onBeforeRenderObservable() {\n return this._internalMeshDataInfo._onBeforeRenderObservable || (this._internalMeshDataInfo._onBeforeRenderObservable = new he()), this._internalMeshDataInfo._onBeforeRenderObservable;\n }\n /**\n * An event triggered before binding the mesh\n */\n get onBeforeBindObservable() {\n return this._internalMeshDataInfo._onBeforeBindObservable || (this._internalMeshDataInfo._onBeforeBindObservable = new he()), this._internalMeshDataInfo._onBeforeBindObservable;\n }\n /**\n * An event triggered after rendering the mesh\n */\n get onAfterRenderObservable() {\n return this._internalMeshDataInfo._onAfterRenderObservable || (this._internalMeshDataInfo._onAfterRenderObservable = new he()), this._internalMeshDataInfo._onAfterRenderObservable;\n }\n /**\n * An event triggeredbetween rendering pass when using separateCullingPass = true\n */\n get onBetweenPassObservable() {\n return this._internalMeshDataInfo._onBetweenPassObservable || (this._internalMeshDataInfo._onBetweenPassObservable = new he()), this._internalMeshDataInfo._onBetweenPassObservable;\n }\n /**\n * An event triggered before drawing the mesh\n */\n get onBeforeDrawObservable() {\n return this._internalMeshDataInfo._onBeforeDrawObservable || (this._internalMeshDataInfo._onBeforeDrawObservable = new he()), this._internalMeshDataInfo._onBeforeDrawObservable;\n }\n /**\n * Sets a callback to call before drawing the mesh. It is recommended to use onBeforeDrawObservable instead\n */\n set onBeforeDraw(e) {\n this._onBeforeDrawObserver && this.onBeforeDrawObservable.remove(this._onBeforeDrawObserver), this._onBeforeDrawObserver = this.onBeforeDrawObservable.add(e);\n }\n get hasInstances() {\n return this.instances.length > 0;\n }\n get hasThinInstances() {\n return (this.forcedInstanceCount || this._thinInstanceDataStorage.instancesCount || 0) > 0;\n }\n /**\n * Gets or sets the forced number of instances to display.\n * If 0 (default value), the number of instances is not forced and depends on the draw type\n * (regular / instance / thin instances mesh)\n */\n get forcedInstanceCount() {\n return this._internalMeshDataInfo._forcedInstanceCount;\n }\n set forcedInstanceCount(e) {\n this._internalMeshDataInfo._forcedInstanceCount = e;\n }\n /**\n * Use this property to override the Material's fillMode value\n */\n get overrideRenderingFillMode() {\n return this._internalMeshDataInfo._overrideRenderingFillMode;\n }\n set overrideRenderingFillMode(e) {\n this._internalMeshDataInfo._overrideRenderingFillMode = e;\n }\n /**\n * Gets the source mesh (the one used to clone this one from)\n */\n get source() {\n return this._internalMeshDataInfo._source;\n }\n /**\n * Gets the list of clones of this mesh\n * The scene must have been constructed with useClonedMeshMap=true for this to work!\n * Note that useClonedMeshMap=true is the default setting\n */\n get cloneMeshMap() {\n return this._internalMeshDataInfo.meshMap;\n }\n /**\n * Gets or sets a boolean indicating that this mesh does not use index buffer\n */\n get isUnIndexed() {\n return this._unIndexed;\n }\n set isUnIndexed(e) {\n this._unIndexed !== e && (this._unIndexed = e, this._markSubMeshesAsAttributesDirty());\n }\n /** Gets the array buffer used to store the instanced buffer used for instances' world matrices */\n get worldMatrixInstancedBuffer() {\n return this._instanceDataStorage.instancesData;\n }\n /** Gets the array buffer used to store the instanced buffer used for instances' previous world matrices */\n get previousWorldMatrixInstancedBuffer() {\n return this._instanceDataStorage.instancesPreviousData;\n }\n /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */\n get manualUpdateOfWorldMatrixInstancedBuffer() {\n return this._instanceDataStorage.manualUpdate;\n }\n set manualUpdateOfWorldMatrixInstancedBuffer(e) {\n this._instanceDataStorage.manualUpdate = e;\n }\n /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */\n get manualUpdateOfPreviousWorldMatrixInstancedBuffer() {\n return this._instanceDataStorage.previousManualUpdate;\n }\n set manualUpdateOfPreviousWorldMatrixInstancedBuffer(e) {\n this._instanceDataStorage.previousManualUpdate = e;\n }\n /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices must be performed in all cases (and notably even in frozen mode) */\n get forceWorldMatrixInstancedBufferUpdate() {\n return this._instanceDataStorage.forceMatrixUpdates;\n }\n set forceWorldMatrixInstancedBufferUpdate(e) {\n this._instanceDataStorage.forceMatrixUpdates = e;\n }\n /**\n * @constructor\n * @param name The value used by scene.getMeshByName() to do a lookup.\n * @param scene The scene to add this mesh to.\n * @param parent The parent of this mesh, if it has one\n * @param source An optional Mesh from which geometry is shared, cloned.\n * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False.\n * When false, achieved by calling a clone(), also passing False.\n * This will make creation of children, recursive.\n * @param clonePhysicsImpostor When cloning, include cloning mesh physics impostor, default True.\n */\n constructor(e, t = null, i = null, r = null, s, a = !0) {\n if (super(e, t), this._internalMeshDataInfo = new lI(), this.delayLoadState = 0, this.instances = [], this._creationDataStorage = null, this._geometry = null, this._instanceDataStorage = new aI(), this._thinInstanceDataStorage = new oI(), this._shouldGenerateFlatShading = !1, this._originalBuilderSideOrientation = B.DEFAULTSIDE, this.overrideMaterialSideOrientation = null, this.ignoreCameraMaxZ = !1, t = this.getScene(), this._onBeforeDraw = (o, l, c) => {\n o && c && (this._uniformBuffer ? this.transferToEffect(l) : c.bindOnlyWorldMatrix(l));\n }, r) {\n if (r._geometry && r._geometry.applyToMesh(this), Dn.DeepCopy(r, this, [\n \"name\",\n \"material\",\n \"skeleton\",\n \"instances\",\n \"parent\",\n \"uniqueId\",\n \"source\",\n \"metadata\",\n \"morphTargetManager\",\n \"hasInstances\",\n \"worldMatrixInstancedBuffer\",\n \"previousWorldMatrixInstancedBuffer\",\n \"hasLODLevels\",\n \"geometry\",\n \"isBlocked\",\n \"areNormalsFrozen\",\n \"facetNb\",\n \"isFacetDataEnabled\",\n \"lightSources\",\n \"useBones\",\n \"isAnInstance\",\n \"collider\",\n \"edgesRenderer\",\n \"forward\",\n \"up\",\n \"right\",\n \"absolutePosition\",\n \"absoluteScaling\",\n \"absoluteRotationQuaternion\",\n \"isWorldMatrixFrozen\",\n \"nonUniformScaling\",\n \"behaviors\",\n \"worldMatrixFromCache\",\n \"hasThinInstances\",\n \"cloneMeshMap\",\n \"hasBoundingInfo\",\n \"physicsBody\",\n \"physicsImpostor\"\n ], [\"_poseMatrix\"]), this._internalMeshDataInfo._source = r, t.useClonedMeshMap && (r._internalMeshDataInfo.meshMap || (r._internalMeshDataInfo.meshMap = {}), r._internalMeshDataInfo.meshMap[this.uniqueId] = this), this._originalBuilderSideOrientation = r._originalBuilderSideOrientation, this._creationDataStorage = r._creationDataStorage, r._ranges) {\n const o = r._ranges;\n for (const l in o)\n Object.prototype.hasOwnProperty.call(o, l) && o[l] && this.createAnimationRange(l, o[l].from, o[l].to);\n }\n if (r.metadata && r.metadata.clone ? this.metadata = r.metadata.clone() : this.metadata = r.metadata, this._internalMetadata = r._internalMetadata, rt && rt.HasTags(r) && rt.AddTagsTo(this, rt.GetTags(r, !0)), this.setEnabled(r.isEnabled(!1)), this.parent = r.parent, this.setPivotMatrix(r.getPivotMatrix(), this._postMultiplyPivotMatrix), this.id = e + \".\" + r.id, this.material = r.material, !s) {\n const o = r.getDescendants(!0);\n for (let l = 0; l < o.length; l++) {\n const c = o[l];\n c.clone && c.clone(e + \".\" + c.name, this);\n }\n }\n if (r.morphTargetManager && (this.morphTargetManager = r.morphTargetManager), t.getPhysicsEngine) {\n const o = t.getPhysicsEngine();\n if (a && o)\n if (o.getPluginVersion() === 1) {\n const l = o.getImpostorForPhysicsObject(r);\n l && (this.physicsImpostor = l.clone(this));\n } else\n o.getPluginVersion() === 2 && r.physicsBody && r.physicsBody.clone(this);\n }\n for (let o = 0; o < t.particleSystems.length; o++) {\n const l = t.particleSystems[o];\n l.emitter === r && l.clone(l.name, this);\n }\n this.skeleton = r.skeleton, this.refreshBoundingInfo(!0, !0), this.computeWorldMatrix(!0);\n }\n i !== null && (this.parent = i), this._instanceDataStorage.hardwareInstancedRendering = this.getEngine().getCaps().instancedArrays, this._internalMeshDataInfo._onMeshReadyObserverAdded = (o) => {\n o.unregisterOnNextCall = !0, this.isReady(!0) ? this.onMeshReadyObservable.notifyObservers(this) : this._internalMeshDataInfo._checkReadinessObserver || (this._internalMeshDataInfo._checkReadinessObserver = this._scene.onBeforeRenderObservable.add(() => {\n this.isReady(!0) && (this._scene.onBeforeRenderObservable.remove(this._internalMeshDataInfo._checkReadinessObserver), this._internalMeshDataInfo._checkReadinessObserver = null, this.onMeshReadyObservable.notifyObservers(this));\n }));\n }, this.onMeshReadyObservable = new he(this._internalMeshDataInfo._onMeshReadyObserverAdded), r && r.onClonedObservable.notifyObservers(this);\n }\n instantiateHierarchy(e = null, t, i) {\n const r = this.getTotalVertices() === 0 || t && t.doNotInstantiate && (t.doNotInstantiate === !0 || t.doNotInstantiate(this)) ? this.clone(\"Clone of \" + (this.name || this.id), e || this.parent, !0) : this.createInstance(\"instance of \" + (this.name || this.id));\n r.parent = e || this.parent, r.position = this.position.clone(), r.scaling = this.scaling.clone(), this.rotationQuaternion ? r.rotationQuaternion = this.rotationQuaternion.clone() : r.rotation = this.rotation.clone(), i && i(this, r);\n for (const s of this.getChildTransformNodes(!0))\n s.getClassName() === \"InstancedMesh\" && r.getClassName() === \"Mesh\" && s.sourceMesh === this ? s.instantiateHierarchy(r, {\n doNotInstantiate: t && t.doNotInstantiate || !1,\n newSourcedMesh: r\n }, i) : s.instantiateHierarchy(r, t, i);\n return r;\n }\n /**\n * Gets the class name\n * @returns the string \"Mesh\".\n */\n getClassName() {\n return \"Mesh\";\n }\n /** @internal */\n get _isMesh() {\n return !0;\n }\n /**\n * Returns a description of this mesh\n * @param fullDetails define if full details about this mesh must be used\n * @returns a descriptive string representing this mesh\n */\n toString(e) {\n let t = super.toString(e);\n if (t += \", n vertices: \" + this.getTotalVertices(), t += \", parent: \" + (this._waitingParentId ? this._waitingParentId : this.parent ? this.parent.name : \"NONE\"), this.animations)\n for (let i = 0; i < this.animations.length; i++)\n t += \", animation[0]: \" + this.animations[i].toString(e);\n if (e)\n if (this._geometry) {\n const i = this.getIndices(), r = this.getVerticesData(I.PositionKind);\n r && i && (t += \", flat shading: \" + (r.length / 3 === i.length ? \"YES\" : \"NO\"));\n } else\n t += \", flat shading: UNKNOWN\";\n return t;\n }\n /** @internal */\n _unBindEffect() {\n super._unBindEffect();\n for (const e of this.instances)\n e._unBindEffect();\n }\n /**\n * Gets a boolean indicating if this mesh has LOD\n */\n get hasLODLevels() {\n return this._internalMeshDataInfo._LODLevels.length > 0;\n }\n /**\n * Gets the list of MeshLODLevel associated with the current mesh\n * @returns an array of MeshLODLevel\n */\n getLODLevels() {\n return this._internalMeshDataInfo._LODLevels;\n }\n _sortLODLevels() {\n const e = this._internalMeshDataInfo._useLODScreenCoverage ? -1 : 1;\n this._internalMeshDataInfo._LODLevels.sort((t, i) => t.distanceOrScreenCoverage < i.distanceOrScreenCoverage ? e : t.distanceOrScreenCoverage > i.distanceOrScreenCoverage ? -e : 0);\n }\n /**\n * Add a mesh as LOD level triggered at the given distance.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\n * @param distanceOrScreenCoverage Either distance from the center of the object to show this level or the screen coverage if `useScreenCoverage` is set to `true`.\n * If screen coverage, value is a fraction of the screen's total surface, between 0 and 1.\n * Example Playground for distance https://playground.babylonjs.com/#QE7KM#197\n * Example Playground for screen coverage https://playground.babylonjs.com/#QE7KM#196\n * @param mesh The mesh to be added as LOD level (can be null)\n * @returns This mesh (for chaining)\n */\n addLODLevel(e, t) {\n if (t && t._masterMesh)\n return ne.Warn(\"You cannot use a mesh as LOD level twice\"), this;\n const i = new nI(e, t);\n return this._internalMeshDataInfo._LODLevels.push(i), t && (t._masterMesh = this), this._sortLODLevels(), this;\n }\n /**\n * Returns the LOD level mesh at the passed distance or null if not found.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\n * @param distance The distance from the center of the object to show this level\n * @returns a Mesh or `null`\n */\n getLODLevelAtDistance(e) {\n const t = this._internalMeshDataInfo;\n for (let i = 0; i < t._LODLevels.length; i++) {\n const r = t._LODLevels[i];\n if (r.distanceOrScreenCoverage === e)\n return r.mesh;\n }\n return null;\n }\n /**\n * Remove a mesh from the LOD array\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\n * @param mesh defines the mesh to be removed\n * @returns This mesh (for chaining)\n */\n removeLODLevel(e) {\n const t = this._internalMeshDataInfo;\n for (let i = 0; i < t._LODLevels.length; i++)\n t._LODLevels[i].mesh === e && (t._LODLevels.splice(i, 1), e && (e._masterMesh = null));\n return this._sortLODLevels(), this;\n }\n /**\n * Returns the registered LOD mesh distant from the parameter `camera` position if any, else returns the current mesh.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\n * @param camera defines the camera to use to compute distance\n * @param boundingSphere defines a custom bounding sphere to use instead of the one from this mesh\n * @returns This mesh (for chaining)\n */\n getLOD(e, t) {\n const i = this._internalMeshDataInfo;\n if (!i._LODLevels || i._LODLevels.length === 0)\n return this;\n const r = t || this.getBoundingInfo().boundingSphere, s = e.mode === $e.ORTHOGRAPHIC_CAMERA ? e.minZ : r.centerWorld.subtract(e.globalPosition).length();\n let a = s, o = 1;\n if (i._useLODScreenCoverage) {\n const l = e.screenArea;\n let c = r.radiusWorld * e.minZ / s;\n c = c * c * Math.PI, a = c / l, o = -1;\n }\n if (o * i._LODLevels[i._LODLevels.length - 1].distanceOrScreenCoverage > o * a)\n return this.onLODLevelSelection && this.onLODLevelSelection(a, this, this), this;\n for (let l = 0; l < i._LODLevels.length; l++) {\n const c = i._LODLevels[l];\n if (o * c.distanceOrScreenCoverage < o * a) {\n if (c.mesh) {\n if (c.mesh.delayLoadState === 4)\n return c.mesh._checkDelayState(), this;\n if (c.mesh.delayLoadState === 2)\n return this;\n c.mesh._preActivate(), c.mesh._updateSubMeshesBoundingInfo(this.worldMatrixFromCache);\n }\n return this.onLODLevelSelection && this.onLODLevelSelection(a, this, c.mesh), c.mesh;\n }\n }\n return this.onLODLevelSelection && this.onLODLevelSelection(a, this, this), this;\n }\n /**\n * Gets the mesh internal Geometry object\n */\n get geometry() {\n return this._geometry;\n }\n /**\n * Returns the total number of vertices within the mesh geometry or zero if the mesh has no geometry.\n * @returns the total number of vertices\n */\n getTotalVertices() {\n return this._geometry === null || this._geometry === void 0 ? 0 : this._geometry.getTotalVertices();\n }\n /**\n * Returns the content of an associated vertex buffer\n * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param copyWhenShared defines a boolean indicating that if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one\n * @param forceCopy defines a boolean forcing the copy of the buffer no matter what the value of copyWhenShared is\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\n * @returns a FloatArray or null if the mesh has no geometry or no vertex buffer for this kind.\n */\n getVerticesData(e, t, i, r) {\n var a, o;\n if (!this._geometry)\n return null;\n let s = r || (o = (a = this._userInstancedBuffersStorage) == null ? void 0 : a.vertexBuffers[e]) == null ? void 0 : o.getFloatData(\n this.instances.length + 1,\n // +1 because the master mesh is not included in the instances array\n i || t && this._geometry.meshes.length !== 1\n );\n return s || (s = this._geometry.getVerticesData(e, t, i)), s;\n }\n /**\n * Returns the mesh VertexBuffer object from the requested `kind`\n * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.NormalKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\n * @returns a FloatArray or null if the mesh has no vertex buffer for this kind.\n */\n getVertexBuffer(e, t) {\n var i;\n return this._geometry ? (t || (i = this._userInstancedBuffersStorage) == null ? void 0 : i.vertexBuffers[e]) ?? this._geometry.getVertexBuffer(e) : null;\n }\n /**\n * Tests if a specific vertex buffer is associated with this mesh\n * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.NormalKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\n * @returns a boolean\n */\n isVerticesDataPresent(e, t) {\n var i;\n return this._geometry ? !t && ((i = this._userInstancedBuffersStorage) == null ? void 0 : i.vertexBuffers[e]) !== void 0 || this._geometry.isVerticesDataPresent(e) : this._delayInfo ? this._delayInfo.indexOf(e) !== -1 : !1;\n }\n /**\n * Returns a boolean defining if the vertex data for the requested `kind` is updatable.\n * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\n * @returns a boolean\n */\n isVertexBufferUpdatable(e, t) {\n var i;\n if (!this._geometry)\n return this._delayInfo ? this._delayInfo.indexOf(e) !== -1 : !1;\n if (!t) {\n const r = (i = this._userInstancedBuffersStorage) == null ? void 0 : i.vertexBuffers[e];\n if (r)\n return r.isUpdatable();\n }\n return this._geometry.isVertexBufferUpdatable(e);\n }\n /**\n * Returns a string which contains the list of existing `kinds` of Vertex Data associated with this mesh.\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\n * @returns an array of strings\n */\n getVerticesDataKinds(e) {\n if (!this._geometry) {\n const i = [];\n return this._delayInfo && this._delayInfo.forEach(function(r) {\n i.push(r);\n }), i;\n }\n const t = this._geometry.getVerticesDataKinds();\n if (!e && this._userInstancedBuffersStorage)\n for (const i in this._userInstancedBuffersStorage.vertexBuffers)\n t.indexOf(i) === -1 && t.push(i);\n return t;\n }\n /**\n * Returns a positive integer : the total number of indices in this mesh geometry.\n * @returns the numner of indices or zero if the mesh has no geometry.\n */\n getTotalIndices() {\n return this._geometry ? this._geometry.getTotalIndices() : 0;\n }\n /**\n * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices.\n * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one.\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\n * @returns the indices array or an empty array if the mesh has no geometry\n */\n getIndices(e, t) {\n return this._geometry ? this._geometry.getIndices(e, t) : [];\n }\n get isBlocked() {\n return this._masterMesh !== null && this._masterMesh !== void 0;\n }\n /**\n * Determine if the current mesh is ready to be rendered\n * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\n * @param forceInstanceSupport will check if the mesh will be ready when used with instances (false by default)\n * @returns true if all associated assets are ready (material, textures, shaders)\n */\n isReady(e = !1, t = !1) {\n var l, c, h, u, f;\n if (this.delayLoadState === 2 || !super.isReady(e))\n return !1;\n if (!this.subMeshes || this.subMeshes.length === 0 || !e)\n return !0;\n const i = this.getEngine(), r = this.getScene(), s = t || i.getCaps().instancedArrays && (this.instances.length > 0 || this.hasThinInstances);\n this.computeWorldMatrix();\n const a = this.material || r.defaultMaterial;\n if (a) {\n if (a._storeEffectOnSubMeshes)\n for (const d of this.subMeshes) {\n const p = d.getMaterial();\n if (p) {\n if (p._storeEffectOnSubMeshes) {\n if (!p.isReadyForSubMesh(this, d, s))\n return !1;\n } else if (!p.isReady(this, s))\n return !1;\n }\n }\n else if (!a.isReady(this, s))\n return !1;\n }\n const o = i.currentRenderPassId;\n for (const d of this.lightSources) {\n const p = d.getShadowGenerators();\n if (!p)\n continue;\n const g = p.values();\n for (let m = g.next(); m.done !== !0; m = g.next()) {\n const v = m.value;\n if (v && (!((l = v.getShadowMap()) != null && l.renderList) || (c = v.getShadowMap()) != null && c.renderList && ((u = (h = v.getShadowMap()) == null ? void 0 : h.renderList) == null ? void 0 : u.indexOf(this)) !== -1)) {\n const C = v.getShadowMap().renderPassIds ?? [i.currentRenderPassId];\n for (let T = 0; T < C.length; ++T) {\n i.currentRenderPassId = C[T];\n for (const R of this.subMeshes)\n if (!v.isReady(R, s, ((f = R.getMaterial()) == null ? void 0 : f.needAlphaBlendingForMesh(this)) ?? !1))\n return i.currentRenderPassId = o, !1;\n }\n i.currentRenderPassId = o;\n }\n }\n }\n for (const d of this._internalMeshDataInfo._LODLevels)\n if (d.mesh && !d.mesh.isReady(s))\n return !1;\n return !0;\n }\n /**\n * Gets a boolean indicating if the normals aren't to be recomputed on next mesh `positions` array update. This property is pertinent only for updatable parametric shapes.\n */\n get areNormalsFrozen() {\n return this._internalMeshDataInfo._areNormalsFrozen;\n }\n /**\n * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It prevents the mesh normals from being recomputed on next `positions` array update.\n * @returns the current mesh\n */\n freezeNormals() {\n return this._internalMeshDataInfo._areNormalsFrozen = !0, this;\n }\n /**\n * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It reactivates the mesh normals computation if it was previously frozen\n * @returns the current mesh\n */\n unfreezeNormals() {\n return this._internalMeshDataInfo._areNormalsFrozen = !1, this;\n }\n /**\n * Sets a value overriding the instance count. Only applicable when custom instanced InterleavedVertexBuffer are used rather than InstancedMeshs\n */\n set overridenInstanceCount(e) {\n this._instanceDataStorage.overridenInstanceCount = e;\n }\n // Methods\n /** @internal */\n _preActivate() {\n const e = this._internalMeshDataInfo, t = this.getScene().getRenderId();\n return e._preActivateId === t ? this : (e._preActivateId = t, this._instanceDataStorage.visibleInstances = null, this);\n }\n /**\n * @internal\n */\n _preActivateForIntermediateRendering(e) {\n return this._instanceDataStorage.visibleInstances && (this._instanceDataStorage.visibleInstances.intermediateDefaultRenderId = e), this;\n }\n /**\n * @internal\n */\n _registerInstanceForRenderId(e, t) {\n return this._instanceDataStorage.visibleInstances || (this._instanceDataStorage.visibleInstances = {\n defaultRenderId: t,\n selfDefaultRenderId: this._renderId\n }), this._instanceDataStorage.visibleInstances[t] || (this._instanceDataStorage.previousRenderId !== void 0 && this._instanceDataStorage.isFrozen && (this._instanceDataStorage.visibleInstances[this._instanceDataStorage.previousRenderId] = null), this._instanceDataStorage.previousRenderId = t, this._instanceDataStorage.visibleInstances[t] = new Array()), this._instanceDataStorage.visibleInstances[t].push(e), this;\n }\n _afterComputeWorldMatrix() {\n super._afterComputeWorldMatrix(), this.hasThinInstances && (this.doNotSyncBoundingInfo || this.thinInstanceRefreshBoundingInfo(!1));\n }\n /** @internal */\n _postActivate() {\n this.edgesShareWithInstances && this.edgesRenderer && this.edgesRenderer.isEnabled && this._renderingGroup && (this._renderingGroup._edgesRenderers.pushNoDuplicate(this.edgesRenderer), this.edgesRenderer.customInstances.push(this.getWorldMatrix()));\n }\n /**\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\n * This means the mesh underlying bounding box and sphere are recomputed.\n * @param applySkeleton defines whether to apply the skeleton before computing the bounding info\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\n * @returns the current mesh\n */\n refreshBoundingInfo(e = !1, t = !1) {\n if (this.hasBoundingInfo && this.getBoundingInfo().isLocked)\n return this;\n const i = this.geometry ? this.geometry.boundingBias : null;\n return this._refreshBoundingInfo(this._getPositionData(e, t), i), this;\n }\n /**\n * @internal\n */\n _createGlobalSubMesh(e) {\n const t = this.getTotalVertices();\n if (!t || !this.getIndices())\n return null;\n if (this.subMeshes && this.subMeshes.length > 0) {\n const i = this.getIndices();\n if (!i)\n return null;\n const r = i.length;\n let s = !1;\n if (e)\n s = !0;\n else\n for (const a of this.subMeshes) {\n if (a.indexStart + a.indexCount > r) {\n s = !0;\n break;\n }\n if (a.verticesStart + a.verticesCount > t) {\n s = !0;\n break;\n }\n }\n if (!s)\n return this.subMeshes[0];\n }\n return this.releaseSubMeshes(), new bi(0, 0, t, 0, this.getTotalIndices(), this);\n }\n /**\n * This function will subdivide the mesh into multiple submeshes\n * @param count defines the expected number of submeshes\n */\n subdivide(e) {\n if (e < 1)\n return;\n const t = this.getTotalIndices();\n let i = t / e | 0, r = 0;\n for (; i % 3 !== 0; )\n i++;\n this.releaseSubMeshes();\n for (let s = 0; s < e && !(r >= t); s++)\n bi.CreateFromIndices(0, r, s === e - 1 ? t - r : i, this, void 0, !1), r += i;\n this.refreshBoundingInfo(), this.synchronizeInstances();\n }\n /**\n * Copy a FloatArray into a specific associated vertex buffer\n * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param data defines the data source\n * @param updatable defines if the updated vertex buffer must be flagged as updatable\n * @param stride defines the data stride size (can be null)\n * @returns the current mesh\n */\n setVerticesData(e, t, i = !1, r) {\n if (this._geometry)\n this._geometry.setVerticesData(e, t, i, r);\n else {\n const s = new re();\n s.set(t, e);\n const a = this.getScene();\n new is(is.RandomId(), a, s, i, this);\n }\n return this;\n }\n /**\n * Delete a vertex buffer associated with this mesh\n * @param kind defines which buffer to delete (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n */\n removeVerticesData(e) {\n this._geometry && this._geometry.removeVerticesData(e);\n }\n /**\n * Flags an associated vertex buffer as updatable\n * @param kind defines which buffer to use (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param updatable defines if the updated vertex buffer must be flagged as updatable\n */\n markVerticesDataAsUpdatable(e, t = !0) {\n const i = this.getVertexBuffer(e);\n !i || i.isUpdatable() === t || this.setVerticesData(e, this.getVerticesData(e), t);\n }\n /**\n * Sets the mesh global Vertex Buffer\n * @param buffer defines the buffer to use\n * @param disposeExistingBuffer disposes the existing buffer, if any (default: true)\n * @returns the current mesh\n */\n setVerticesBuffer(e, t = !0) {\n return this._geometry || (this._geometry = is.CreateGeometryForMesh(this)), this._geometry.setVerticesBuffer(e, null, t), this;\n }\n /**\n * Update a specific associated vertex buffer\n * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param data defines the data source\n * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for \"position\" kind\n * @param makeItUnique defines if the geometry associated with the mesh must be cloned to make the change only for this mesh (and not all meshes associated with the same geometry)\n * @returns the current mesh\n */\n updateVerticesData(e, t, i, r) {\n return this._geometry ? (r ? (this.makeGeometryUnique(), this.updateVerticesData(e, t, i, !1)) : this._geometry.updateVerticesData(e, t, i), this) : this;\n }\n /**\n * This method updates the vertex positions of an updatable mesh according to the `positionFunction` returned values.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#other-shapes-updatemeshpositions\n * @param positionFunction is a simple JS function what is passed the mesh `positions` array. It doesn't need to return anything\n * @param computeNormals is a boolean (default true) to enable/disable the mesh normal recomputation after the vertex position update\n * @returns the current mesh\n */\n updateMeshPositions(e, t = !0) {\n const i = this.getVerticesData(I.PositionKind);\n if (!i)\n return this;\n if (e(i), this.updateVerticesData(I.PositionKind, i, !1, !1), t) {\n const r = this.getIndices(), s = this.getVerticesData(I.NormalKind);\n if (!s)\n return this;\n re.ComputeNormals(i, r, s), this.updateVerticesData(I.NormalKind, s, !1, !1);\n }\n return this;\n }\n /**\n * Creates a un-shared specific occurence of the geometry for the mesh.\n * @returns the current mesh\n */\n makeGeometryUnique() {\n if (!this._geometry)\n return this;\n if (this._geometry.meshes.length === 1)\n return this;\n const e = this._geometry, t = this._geometry.copy(is.RandomId());\n return e.releaseForMesh(this, !0), t.applyToMesh(this), this;\n }\n /**\n * Sets the index buffer of this mesh.\n * @param indexBuffer Defines the index buffer to use for this mesh\n * @param totalVertices Defines the total number of vertices used by the buffer\n * @param totalIndices Defines the total number of indices in the index buffer\n */\n setIndexBuffer(e, t, i) {\n let r = this._geometry;\n r || (r = new is(is.RandomId(), this.getScene(), void 0, void 0, this)), r.setIndexBuffer(e, t, i);\n }\n /**\n * Set the index buffer of this mesh\n * @param indices defines the source data\n * @param totalVertices defines the total number of vertices referenced by this index data (can be null)\n * @param updatable defines if the updated index buffer must be flagged as updatable (default is false)\n * @returns the current mesh\n */\n setIndices(e, t = null, i = !1) {\n if (this._geometry)\n this._geometry.setIndices(e, t, i);\n else {\n const r = new re();\n r.indices = e;\n const s = this.getScene();\n new is(is.RandomId(), s, r, i, this);\n }\n return this;\n }\n /**\n * Update the current index buffer\n * @param indices defines the source data\n * @param offset defines the offset in the index buffer where to store the new data (can be null)\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\n * @returns the current mesh\n */\n updateIndices(e, t, i = !1) {\n return this._geometry ? (this._geometry.updateIndices(e, t, i), this) : this;\n }\n /**\n * Invert the geometry to move from a right handed system to a left handed one.\n * @returns the current mesh\n */\n toLeftHanded() {\n return this._geometry ? (this._geometry.toLeftHanded(), this) : this;\n }\n /**\n * @internal\n */\n _bind(e, t, i, r = !0) {\n if (!this._geometry)\n return this;\n const s = this.getScene().getEngine();\n this.morphTargetManager && this.morphTargetManager.isUsingTextureForTargets && this.morphTargetManager._bind(t);\n let a;\n if (this._unIndexed)\n a = null;\n else\n switch (this._getRenderingFillMode(i)) {\n case ie.PointFillMode:\n a = null;\n break;\n case ie.WireFrameFillMode:\n a = e._getLinesIndexBuffer(this.getIndices(), s);\n break;\n default:\n case ie.TriangleFillMode:\n a = this._geometry.getIndexBuffer();\n break;\n }\n return !r || !this._userInstancedBuffersStorage || this.hasThinInstances ? this._geometry._bind(t, a) : this._geometry._bind(t, a, this._userInstancedBuffersStorage.vertexBuffers, this._userInstancedBuffersStorage.vertexArrayObjects), this;\n }\n /**\n * @internal\n */\n _draw(e, t, i) {\n if (!this._geometry || !this._geometry.getVertexBuffers() || !this._unIndexed && !this._geometry.getIndexBuffer())\n return this;\n this._internalMeshDataInfo._onBeforeDrawObservable && this._internalMeshDataInfo._onBeforeDrawObservable.notifyObservers(this);\n const s = this.getScene().getEngine();\n return this._unIndexed || t == ie.PointFillMode ? s.drawArraysType(t, e.verticesStart, e.verticesCount, this.forcedInstanceCount || i) : t == ie.WireFrameFillMode ? s.drawElementsType(t, 0, e._linesIndexCount, this.forcedInstanceCount || i) : s.drawElementsType(t, e.indexStart, e.indexCount, this.forcedInstanceCount || i), this;\n }\n /**\n * Registers for this mesh a javascript function called just before the rendering process\n * @param func defines the function to call before rendering this mesh\n * @returns the current mesh\n */\n registerBeforeRender(e) {\n return this.onBeforeRenderObservable.add(e), this;\n }\n /**\n * Disposes a previously registered javascript function called before the rendering\n * @param func defines the function to remove\n * @returns the current mesh\n */\n unregisterBeforeRender(e) {\n return this.onBeforeRenderObservable.removeCallback(e), this;\n }\n /**\n * Registers for this mesh a javascript function called just after the rendering is complete\n * @param func defines the function to call after rendering this mesh\n * @returns the current mesh\n */\n registerAfterRender(e) {\n return this.onAfterRenderObservable.add(e), this;\n }\n /**\n * Disposes a previously registered javascript function called after the rendering.\n * @param func defines the function to remove\n * @returns the current mesh\n */\n unregisterAfterRender(e) {\n return this.onAfterRenderObservable.removeCallback(e), this;\n }\n /**\n * @internal\n */\n _getInstancesRenderList(e, t = !1) {\n if (this._instanceDataStorage.isFrozen) {\n if (t)\n return this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.hardwareInstancedRendering[e] = !1, this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.renderSelf[e] = !0, this._instanceDataStorage.batchCacheReplacementModeInFrozenMode;\n if (this._instanceDataStorage.previousBatch)\n return this._instanceDataStorage.previousBatch;\n }\n const i = this.getScene(), r = i._isInIntermediateRendering(), s = r ? this._internalAbstractMeshDataInfo._onlyForInstancesIntermediate : this._internalAbstractMeshDataInfo._onlyForInstances, a = this._instanceDataStorage.batchCache;\n if (a.mustReturn = !1, a.renderSelf[e] = t || !s && this.isEnabled() && this.isVisible, a.visibleInstances[e] = null, this._instanceDataStorage.visibleInstances && !t) {\n const o = this._instanceDataStorage.visibleInstances, l = i.getRenderId(), c = r ? o.intermediateDefaultRenderId : o.defaultRenderId;\n a.visibleInstances[e] = o[l], !a.visibleInstances[e] && c && (a.visibleInstances[e] = o[c]);\n }\n return a.hardwareInstancedRendering[e] = !t && this._instanceDataStorage.hardwareInstancedRendering && a.visibleInstances[e] !== null && a.visibleInstances[e] !== void 0, this._instanceDataStorage.previousBatch = a, a;\n }\n /**\n * @internal\n */\n _renderWithInstances(e, t, i, r, s) {\n var E;\n const a = i.visibleInstances[e._id], o = a ? a.length : 0, l = this._instanceDataStorage, c = l.instancesBufferSize;\n let h = l.instancesBuffer, u = l.instancesPreviousBuffer;\n const d = (o + 1) * 16 * 4;\n for (; l.instancesBufferSize < d; )\n l.instancesBufferSize *= 2;\n (!l.instancesData || c != l.instancesBufferSize) && (l.instancesData = new Float32Array(l.instancesBufferSize / 4)), (this._scene.needsPreviousWorldMatrices && !l.instancesPreviousData || c != l.instancesBufferSize) && (l.instancesPreviousData = new Float32Array(l.instancesBufferSize / 4));\n let p = 0, g = 0;\n const m = i.renderSelf[e._id], v = !h || c !== l.instancesBufferSize || this._scene.needsPreviousWorldMatrices && !l.instancesPreviousBuffer;\n if (!this._instanceDataStorage.manualUpdate && (!l.isFrozen || v)) {\n const C = this.getWorldMatrix();\n if (m && (this._scene.needsPreviousWorldMatrices && (l.masterMeshPreviousWorldMatrix ? (l.masterMeshPreviousWorldMatrix.copyToArray(l.instancesPreviousData, p), l.masterMeshPreviousWorldMatrix.copyFrom(C)) : (l.masterMeshPreviousWorldMatrix = C.clone(), l.masterMeshPreviousWorldMatrix.copyToArray(l.instancesPreviousData, p))), C.copyToArray(l.instancesData, p), p += 16, g++), a) {\n if (B.INSTANCEDMESH_SORT_TRANSPARENT && this._scene.activeCamera && ((E = e.getMaterial()) != null && E.needAlphaBlendingForMesh(e.getRenderingMesh()))) {\n const T = this._scene.activeCamera.globalPosition;\n for (let R = 0; R < a.length; R++) {\n const x = a[R];\n x._distanceToCamera = _.Distance(x.getBoundingInfo().boundingSphere.centerWorld, T);\n }\n a.sort((R, x) => R._distanceToCamera > x._distanceToCamera ? -1 : R._distanceToCamera < x._distanceToCamera ? 1 : 0);\n }\n for (let T = 0; T < a.length; T++) {\n const R = a[T], x = R.getWorldMatrix();\n x.copyToArray(l.instancesData, p), this._scene.needsPreviousWorldMatrices && (R._previousWorldMatrix ? (R._previousWorldMatrix.copyToArray(l.instancesPreviousData, p), R._previousWorldMatrix.copyFrom(x)) : (R._previousWorldMatrix = x.clone(), R._previousWorldMatrix.copyToArray(l.instancesPreviousData, p))), p += 16, g++;\n }\n }\n } else\n g = (m ? 1 : 0) + o;\n return v ? (h && h.dispose(), u && u.dispose(), h = new fr(s, l.instancesData, !0, 16, !1, !0), l.instancesBuffer = h, this._userInstancedBuffersStorage || (this._userInstancedBuffersStorage = {\n data: {},\n vertexBuffers: {},\n strides: {},\n sizes: {},\n vertexArrayObjects: this.getEngine().getCaps().vertexArrayObject ? {} : void 0\n }), this._userInstancedBuffersStorage.vertexBuffers.world0 = h.createVertexBuffer(\"world0\", 0, 4), this._userInstancedBuffersStorage.vertexBuffers.world1 = h.createVertexBuffer(\"world1\", 4, 4), this._userInstancedBuffersStorage.vertexBuffers.world2 = h.createVertexBuffer(\"world2\", 8, 4), this._userInstancedBuffersStorage.vertexBuffers.world3 = h.createVertexBuffer(\"world3\", 12, 4), this._scene.needsPreviousWorldMatrices && (u = new fr(s, l.instancesPreviousData, !0, 16, !1, !0), l.instancesPreviousBuffer = u, this._userInstancedBuffersStorage.vertexBuffers.previousWorld0 = u.createVertexBuffer(\"previousWorld0\", 0, 4), this._userInstancedBuffersStorage.vertexBuffers.previousWorld1 = u.createVertexBuffer(\"previousWorld1\", 4, 4), this._userInstancedBuffersStorage.vertexBuffers.previousWorld2 = u.createVertexBuffer(\"previousWorld2\", 8, 4), this._userInstancedBuffersStorage.vertexBuffers.previousWorld3 = u.createVertexBuffer(\"previousWorld3\", 12, 4)), this._invalidateInstanceVertexArrayObject()) : (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) && (h.updateDirectly(l.instancesData, 0, g), this._scene.needsPreviousWorldMatrices && (!this._instanceDataStorage.manualUpdate || this._instanceDataStorage.previousManualUpdate) && u.updateDirectly(l.instancesPreviousData, 0, g)), this._processInstancedBuffers(a, m), this.getScene()._activeIndices.addCount(e.indexCount * g, !1), s._currentDrawContext && (s._currentDrawContext.useInstancing = !0), this._bind(e, r, t), this._draw(e, t, g), this._scene.needsPreviousWorldMatrices && !v && this._instanceDataStorage.manualUpdate && (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) && !this._instanceDataStorage.previousManualUpdate && u.updateDirectly(l.instancesData, 0, g), s.unbindInstanceAttributes(), this;\n }\n /**\n * @internal\n */\n _renderWithThinInstances(e, t, i, r) {\n var a;\n const s = ((a = this._thinInstanceDataStorage) == null ? void 0 : a.instancesCount) ?? 0;\n this.getScene()._activeIndices.addCount(e.indexCount * s, !1), r._currentDrawContext && (r._currentDrawContext.useInstancing = !0), this._bind(e, i, t), this._draw(e, t, s), this._scene.needsPreviousWorldMatrices && !this._thinInstanceDataStorage.previousMatrixData && this._thinInstanceDataStorage.matrixData && (this._thinInstanceDataStorage.previousMatrixBuffer ? this._thinInstanceDataStorage.previousMatrixBuffer.updateDirectly(this._thinInstanceDataStorage.matrixData, 0, s) : this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", this._thinInstanceDataStorage.matrixData, !1)), r.unbindInstanceAttributes();\n }\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _processInstancedBuffers(e, t) {\n }\n /**\n * @internal\n */\n _processRendering(e, t, i, r, s, a, o, l) {\n const c = this.getScene(), h = c.getEngine();\n if (r = this._getRenderingFillMode(r), a && t.getRenderingMesh().hasThinInstances)\n return this._renderWithThinInstances(t, r, i, h), this;\n if (a)\n this._renderWithInstances(t, r, s, i, h);\n else {\n h._currentDrawContext && (h._currentDrawContext.useInstancing = !1);\n let u = 0;\n s.renderSelf[t._id] && (o && o(!1, e.getWorldMatrix(), l), u++, this._draw(t, r, this._instanceDataStorage.overridenInstanceCount));\n const f = s.visibleInstances[t._id];\n if (f) {\n const d = f.length;\n u += d;\n for (let p = 0; p < d; p++) {\n const m = f[p].getWorldMatrix();\n o && o(!0, m, l), this._draw(t, r);\n }\n }\n c._activeIndices.addCount(t.indexCount * u, !1);\n }\n return this;\n }\n /**\n * @internal\n */\n _rebuild(e = !1) {\n if (this._instanceDataStorage.instancesBuffer && (e && this._instanceDataStorage.instancesBuffer.dispose(), this._instanceDataStorage.instancesBuffer = null), this._userInstancedBuffersStorage) {\n for (const t in this._userInstancedBuffersStorage.vertexBuffers) {\n const i = this._userInstancedBuffersStorage.vertexBuffers[t];\n i && (e && i.dispose(), this._userInstancedBuffersStorage.vertexBuffers[t] = null);\n }\n this._userInstancedBuffersStorage.vertexArrayObjects && (this._userInstancedBuffersStorage.vertexArrayObjects = {});\n }\n this._internalMeshDataInfo._effectiveMaterial = null, super._rebuild(e);\n }\n /** @internal */\n _freeze() {\n if (this.subMeshes) {\n for (let e = 0; e < this.subMeshes.length; e++)\n this._getInstancesRenderList(e);\n this._internalMeshDataInfo._effectiveMaterial = null, this._instanceDataStorage.isFrozen = !0;\n }\n }\n /** @internal */\n _unFreeze() {\n this._instanceDataStorage.isFrozen = !1, this._instanceDataStorage.previousBatch = null;\n }\n /**\n * Triggers the draw call for the mesh (or a submesh), for a specific render pass id\n * @param renderPassId defines the render pass id to use to draw the mesh / submesh. If not provided, use the current renderPassId of the engine.\n * @param enableAlphaMode defines if alpha mode can be changed (default: false)\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering (default: undefined)\n * @param subMesh defines the subMesh to render. If not provided, draw all mesh submeshes (default: undefined)\n * @param checkFrustumCulling defines if frustum culling must be checked (default: true). If you know the mesh is in the frustum (or if you don't care!), you can pass false to optimize.\n * @returns the current mesh\n */\n renderWithRenderPassId(e, t, i, r, s = !0) {\n const a = this._scene.getEngine(), o = a.currentRenderPassId;\n if (e !== void 0 && (a.currentRenderPassId = e), r)\n (!s || s && r.isInFrustum(this._scene._frustumPlanes)) && this.render(r, !!t, i);\n else\n for (let l = 0; l < this.subMeshes.length; l++) {\n const c = this.subMeshes[l];\n (!s || s && c.isInFrustum(this._scene._frustumPlanes)) && this.render(c, !!t, i);\n }\n return e !== void 0 && (a.currentRenderPassId = o), this;\n }\n /**\n * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager\n * @param subMesh defines the subMesh to render\n * @param enableAlphaMode defines if alpha mode can be changed\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering\n * @returns the current mesh\n */\n render(e, t, i) {\n var S, M;\n const r = this.getScene();\n this._internalAbstractMeshDataInfo._isActiveIntermediate ? this._internalAbstractMeshDataInfo._isActiveIntermediate = !1 : this._internalAbstractMeshDataInfo._isActive = !1;\n const s = ((S = r.activeCameras) == null ? void 0 : S.length) ?? 0;\n if ((s > 1 && r.activeCamera === r.activeCameras[0] || s <= 1) && this._checkOcclusionQuery() && !this._occlusionDataStorage.forceRenderingWhenOccluded)\n return this;\n const o = this._getInstancesRenderList(e._id, !!i);\n if (o.mustReturn)\n return this;\n if (!this._geometry || !this._geometry.getVertexBuffers() || !this._unIndexed && !this._geometry.getIndexBuffer())\n return this;\n const l = r.getEngine();\n let c = 0, h = null;\n this.ignoreCameraMaxZ && r.activeCamera && !r._isInIntermediateRendering() && (c = r.activeCamera.maxZ, h = r.activeCamera, r.activeCamera.maxZ = 0, r.updateTransformMatrix(!0)), this._internalMeshDataInfo._onBeforeRenderObservable && this._internalMeshDataInfo._onBeforeRenderObservable.notifyObservers(this);\n const u = e.getRenderingMesh(), f = o.hardwareInstancedRendering[e._id] || u.hasThinInstances || !!this._userInstancedBuffersStorage && !e.getMesh()._internalAbstractMeshDataInfo._actAsRegularMesh, d = this._instanceDataStorage, p = e.getMaterial();\n if (!p)\n return h && (h.maxZ = c, r.updateTransformMatrix(!0)), this;\n if (!d.isFrozen || !this._internalMeshDataInfo._effectiveMaterial || this._internalMeshDataInfo._effectiveMaterial !== p) {\n if (p._storeEffectOnSubMeshes) {\n if (!p.isReadyForSubMesh(this, e, f))\n return h && (h.maxZ = c, r.updateTransformMatrix(!0)), this;\n } else if (!p.isReady(this, f))\n return h && (h.maxZ = c, r.updateTransformMatrix(!0)), this;\n this._internalMeshDataInfo._effectiveMaterial = p;\n } else if (p._storeEffectOnSubMeshes && !((M = e._drawWrapper) != null && M._wasPreviouslyReady) || !p._storeEffectOnSubMeshes && !p._getDrawWrapper()._wasPreviouslyReady)\n return h && (h.maxZ = c, r.updateTransformMatrix(!0)), this;\n t && l.setAlphaMode(this._internalMeshDataInfo._effectiveMaterial.alphaMode);\n let g;\n this._internalMeshDataInfo._effectiveMaterial._storeEffectOnSubMeshes ? g = e._drawWrapper : g = this._internalMeshDataInfo._effectiveMaterial._getDrawWrapper();\n const m = (g == null ? void 0 : g.effect) ?? null;\n for (const N of r._beforeRenderingMeshStage)\n N.action(this, e, o, m);\n if (!g || !m)\n return h && (h.maxZ = c, r.updateTransformMatrix(!0)), this;\n const v = i || this;\n let E;\n if (!d.isFrozen && (this._internalMeshDataInfo._effectiveMaterial.backFaceCulling || this.overrideMaterialSideOrientation !== null || this._internalMeshDataInfo._effectiveMaterial.twoSidedLighting)) {\n const N = v._getWorldMatrixDeterminant();\n E = this.overrideMaterialSideOrientation, E == null && (E = this._internalMeshDataInfo._effectiveMaterial.sideOrientation), N < 0 && (E = E === ie.ClockWiseSideOrientation ? ie.CounterClockWiseSideOrientation : ie.ClockWiseSideOrientation), d.sideOrientation = E;\n } else\n E = d.sideOrientation;\n const C = this._internalMeshDataInfo._effectiveMaterial._preBind(g, E);\n this._internalMeshDataInfo._effectiveMaterial.forceDepthWrite && l.setDepthWrite(!0);\n const T = this._internalMeshDataInfo._effectiveMaterial, R = T.fillMode;\n this._internalMeshDataInfo._onBeforeBindObservable && this._internalMeshDataInfo._onBeforeBindObservable.notifyObservers(this), f || this._bind(e, m, R, !1);\n const x = v.getWorldMatrix();\n T._storeEffectOnSubMeshes ? T.bindForSubMesh(x, this, e) : T.bind(x, this), !T.backFaceCulling && T.separateCullingPass && (l.setState(!0, T.zOffset, !1, !C, T.cullBackFaces, T.stencil, T.zOffsetUnits), this._processRendering(this, e, m, R, o, f, this._onBeforeDraw, this._internalMeshDataInfo._effectiveMaterial), l.setState(!0, T.zOffset, !1, C, T.cullBackFaces, T.stencil, T.zOffsetUnits), this._internalMeshDataInfo._onBetweenPassObservable && this._internalMeshDataInfo._onBetweenPassObservable.notifyObservers(e)), this._processRendering(this, e, m, R, o, f, this._onBeforeDraw, this._internalMeshDataInfo._effectiveMaterial), this._internalMeshDataInfo._effectiveMaterial.unbind();\n for (const N of r._afterRenderingMeshStage)\n N.action(this, e, o, m);\n return this._internalMeshDataInfo._onAfterRenderObservable && this._internalMeshDataInfo._onAfterRenderObservable.notifyObservers(this), h && (h.maxZ = c, r.updateTransformMatrix(!0)), r.performancePriority === fs.Aggressive && !d.isFrozen && this._freeze(), this;\n }\n /**\n * Renormalize the mesh and patch it up if there are no weights\n * Similar to normalization by adding the weights compute the reciprocal and multiply all elements, this wil ensure that everything adds to 1.\n * However in the case of zero weights then we set just a single influence to 1.\n * We check in the function for extra's present and if so we use the normalizeSkinWeightsWithExtras rather than the FourWeights version.\n */\n cleanMatrixWeights() {\n this.isVerticesDataPresent(I.MatricesWeightsKind) && (this.isVerticesDataPresent(I.MatricesWeightsExtraKind) ? this._normalizeSkinWeightsAndExtra() : this._normalizeSkinFourWeights());\n }\n // faster 4 weight version.\n _normalizeSkinFourWeights() {\n const e = this.getVerticesData(I.MatricesWeightsKind), t = e.length;\n for (let i = 0; i < t; i += 4) {\n const r = e[i] + e[i + 1] + e[i + 2] + e[i + 3];\n if (r === 0)\n e[i] = 1;\n else {\n const s = 1 / r;\n e[i] *= s, e[i + 1] *= s, e[i + 2] *= s, e[i + 3] *= s;\n }\n }\n this.setVerticesData(I.MatricesWeightsKind, e);\n }\n // handle special case of extra verts. (in theory gltf can handle 12 influences)\n _normalizeSkinWeightsAndExtra() {\n const e = this.getVerticesData(I.MatricesWeightsExtraKind), t = this.getVerticesData(I.MatricesWeightsKind), i = t.length;\n for (let r = 0; r < i; r += 4) {\n let s = t[r] + t[r + 1] + t[r + 2] + t[r + 3];\n if (s += e[r] + e[r + 1] + e[r + 2] + e[r + 3], s === 0)\n t[r] = 1;\n else {\n const a = 1 / s;\n t[r] *= a, t[r + 1] *= a, t[r + 2] *= a, t[r + 3] *= a, e[r] *= a, e[r + 1] *= a, e[r + 2] *= a, e[r + 3] *= a;\n }\n }\n this.setVerticesData(I.MatricesWeightsKind, t), this.setVerticesData(I.MatricesWeightsKind, e);\n }\n /**\n * ValidateSkinning is used to determine that a mesh has valid skinning data along with skin metrics, if missing weights,\n * or not normalized it is returned as invalid mesh the string can be used for console logs, or on screen messages to let\n * the user know there was an issue with importing the mesh\n * @returns a validation object with skinned, valid and report string\n */\n validateSkinning() {\n const e = this.getVerticesData(I.MatricesWeightsExtraKind), t = this.getVerticesData(I.MatricesWeightsKind);\n if (t === null || this.skeleton == null)\n return { skinned: !1, valid: !0, report: \"not skinned\" };\n const i = t.length;\n let r = 0, s = 0, a = 0, o = 0;\n const l = e === null ? 4 : 8, c = [];\n for (let m = 0; m <= l; m++)\n c[m] = 0;\n const h = 1e-3;\n for (let m = 0; m < i; m += 4) {\n let v = t[m], E = v, C = E === 0 ? 0 : 1;\n for (let T = 1; T < l; T++) {\n const R = T < 4 ? t[m + T] : e[m + T - 4];\n R > v && r++, R !== 0 && C++, E += R, v = R;\n }\n if (c[C]++, C > a && (a = C), E === 0)\n s++;\n else {\n const T = 1 / E;\n let R = 0;\n for (let x = 0; x < l; x++)\n x < 4 ? R += Math.abs(t[m + x] - t[m + x] * T) : R += Math.abs(e[m + x - 4] - e[m + x - 4] * T);\n R > h && o++;\n }\n }\n const u = this.skeleton.bones.length, f = this.getVerticesData(I.MatricesIndicesKind), d = this.getVerticesData(I.MatricesIndicesExtraKind);\n let p = 0;\n for (let m = 0; m < i; m += 4)\n for (let v = 0; v < l; v++) {\n const E = v < 4 ? f[m + v] : d[m + v - 4];\n (E >= u || E < 0) && p++;\n }\n const g = \"Number of Weights = \" + i / 4 + `\nMaximum influences = ` + a + `\nMissing Weights = ` + s + `\nNot Sorted = ` + r + `\nNot Normalized = ` + o + `\nWeightCounts = [` + c + `]\nNumber of bones = ` + u + `\nBad Bone Indices = ` + p;\n return { skinned: !0, valid: s === 0 && o === 0 && p === 0, report: g };\n }\n /** @internal */\n _checkDelayState() {\n const e = this.getScene();\n return this._geometry ? this._geometry.load(e) : this.delayLoadState === 4 && (this.delayLoadState = 2, this._queueLoad(e)), this;\n }\n _queueLoad(e) {\n e.addPendingData(this);\n const t = this.delayLoadingFile.indexOf(\".babylonbinarymeshdata\") !== -1;\n return ge.LoadFile(this.delayLoadingFile, (i) => {\n i instanceof ArrayBuffer ? this._delayLoadingFunction(i, this) : this._delayLoadingFunction(JSON.parse(i), this), this.instances.forEach((r) => {\n r.refreshBoundingInfo(), r._syncSubMeshes();\n }), this.delayLoadState = 1, e.removePendingData(this);\n }, () => {\n }, e.offlineProvider, t), this;\n }\n /**\n * Returns `true` if the mesh is within the frustum defined by the passed array of planes.\n * A mesh is in the frustum if its bounding box intersects the frustum\n * @param frustumPlanes defines the frustum to test\n * @returns true if the mesh is in the frustum planes\n */\n isInFrustum(e) {\n return this.delayLoadState === 2 || !super.isInFrustum(e) ? !1 : (this._checkDelayState(), !0);\n }\n /**\n * Sets the mesh material by the material or multiMaterial `id` property\n * @param id is a string identifying the material or the multiMaterial\n * @returns the current mesh\n */\n setMaterialById(e) {\n const t = this.getScene().materials;\n let i;\n for (i = t.length - 1; i > -1; i--)\n if (t[i].id === e)\n return this.material = t[i], this;\n const r = this.getScene().multiMaterials;\n for (i = r.length - 1; i > -1; i--)\n if (r[i].id === e)\n return this.material = r[i], this;\n return this;\n }\n /**\n * Returns as a new array populated with the mesh material and/or skeleton, if any.\n * @returns an array of IAnimatable\n */\n getAnimatables() {\n const e = [];\n return this.material && e.push(this.material), this.skeleton && e.push(this.skeleton), e;\n }\n /**\n * Modifies the mesh geometry according to the passed transformation matrix.\n * This method returns nothing, but it really modifies the mesh even if it's originally not set as updatable.\n * The mesh normals are modified using the same transformation.\n * Note that, under the hood, this method sets a new VertexBuffer each call.\n * @param transform defines the transform matrix to use\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms\n * @returns the current mesh\n */\n bakeTransformIntoVertices(e) {\n if (!this.isVerticesDataPresent(I.PositionKind))\n return this;\n const t = this.subMeshes.splice(0);\n this._resetPointsArrayCache();\n let i = this.getVerticesData(I.PositionKind);\n const r = _.Zero();\n let s;\n for (s = 0; s < i.length; s += 3)\n _.TransformCoordinatesFromFloatsToRef(i[s], i[s + 1], i[s + 2], e, r).toArray(i, s);\n if (this.setVerticesData(I.PositionKind, i, this.getVertexBuffer(I.PositionKind).isUpdatable()), this.isVerticesDataPresent(I.NormalKind)) {\n for (i = this.getVerticesData(I.NormalKind), s = 0; s < i.length; s += 3)\n _.TransformNormalFromFloatsToRef(i[s], i[s + 1], i[s + 2], e, r).normalize().toArray(i, s);\n this.setVerticesData(I.NormalKind, i, this.getVertexBuffer(I.NormalKind).isUpdatable());\n }\n if (this.isVerticesDataPresent(I.TangentKind)) {\n for (i = this.getVerticesData(I.TangentKind), s = 0; s < i.length; s += 4)\n _.TransformNormalFromFloatsToRef(i[s], i[s + 1], i[s + 2], e, r).normalize().toArray(i, s);\n this.setVerticesData(I.TangentKind, i, this.getVertexBuffer(I.TangentKind).isUpdatable());\n }\n return e.determinant() < 0 && this.flipFaces(), this.releaseSubMeshes(), this.subMeshes = t, this;\n }\n /**\n * Modifies the mesh geometry according to its own current World Matrix.\n * The mesh World Matrix is then reset.\n * This method returns nothing but really modifies the mesh even if it's originally not set as updatable.\n * Note that, under the hood, this method sets a new VertexBuffer each call.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms\n * @param bakeIndependentlyOfChildren indicates whether to preserve all child nodes' World Matrix during baking\n * @returns the current mesh\n */\n bakeCurrentTransformIntoVertices(e = !0) {\n return this.bakeTransformIntoVertices(this.computeWorldMatrix(!0)), this.resetLocalMatrix(e), this;\n }\n // Cache\n /** @internal */\n get _positions() {\n return this._internalAbstractMeshDataInfo._positions ? this._internalAbstractMeshDataInfo._positions : this._geometry ? this._geometry._positions : null;\n }\n /** @internal */\n _resetPointsArrayCache() {\n return this._geometry && this._geometry._resetPointsArrayCache(), this;\n }\n /** @internal */\n _generatePointsArray() {\n return this._geometry ? this._geometry._generatePointsArray() : !1;\n }\n /**\n * Returns a new Mesh object generated from the current mesh properties.\n * This method must not get confused with createInstance()\n * @param name is a string, the name given to the new mesh\n * @param newParent can be any Node object (default `null`)\n * @param doNotCloneChildren allows/denies the recursive cloning of the original mesh children if any (default `false`)\n * @param clonePhysicsImpostor allows/denies the cloning in the same time of the original mesh `body` used by the physics engine, if any (default `true`)\n * @returns a new mesh\n */\n clone(e = \"\", t = null, i, r = !0) {\n return new B(e, this.getScene(), t, this, i, r);\n }\n /**\n * Releases resources associated with this mesh.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n this.morphTargetManager = null, this._geometry && this._geometry.releaseForMesh(this, !0);\n const i = this._internalMeshDataInfo;\n if (i._onBeforeDrawObservable && i._onBeforeDrawObservable.clear(), i._onBeforeBindObservable && i._onBeforeBindObservable.clear(), i._onBeforeRenderObservable && i._onBeforeRenderObservable.clear(), i._onAfterRenderObservable && i._onAfterRenderObservable.clear(), i._onBetweenPassObservable && i._onBetweenPassObservable.clear(), this._scene.useClonedMeshMap) {\n if (i.meshMap)\n for (const r in i.meshMap) {\n const s = i.meshMap[r];\n s && (s._internalMeshDataInfo._source = null, i.meshMap[r] = void 0);\n }\n i._source && i._source._internalMeshDataInfo.meshMap && (i._source._internalMeshDataInfo.meshMap[this.uniqueId] = void 0);\n } else {\n const r = this.getScene().meshes;\n for (const s of r) {\n const a = s;\n a._internalMeshDataInfo && a._internalMeshDataInfo._source && a._internalMeshDataInfo._source === this && (a._internalMeshDataInfo._source = null);\n }\n }\n i._source = null, this._instanceDataStorage.visibleInstances = {}, this._disposeInstanceSpecificData(), this._disposeThinInstanceSpecificData(), this._internalMeshDataInfo._checkReadinessObserver && this._scene.onBeforeRenderObservable.remove(this._internalMeshDataInfo._checkReadinessObserver), super.dispose(e, t);\n }\n /** @internal */\n _disposeInstanceSpecificData() {\n }\n /** @internal */\n _disposeThinInstanceSpecificData() {\n }\n /** @internal */\n _invalidateInstanceVertexArrayObject() {\n }\n /**\n * Modifies the mesh geometry according to a displacement map.\n * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex.\n * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated.\n * @param url is a string, the URL from the image file is to be downloaded.\n * @param minHeight is the lower limit of the displacement.\n * @param maxHeight is the upper limit of the displacement.\n * @param onSuccess is an optional Javascript function to be called just after the mesh is modified. It is passed the modified mesh and must return nothing.\n * @param uvOffset is an optional vector2 used to offset UV.\n * @param uvScale is an optional vector2 used to scale UV.\n * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance.\n * @param onError defines a callback called when an error occurs during the processing of the request.\n * @returns the Mesh.\n */\n applyDisplacementMap(e, t, i, r, s, a, o = !1, l) {\n const c = this.getScene(), h = (u) => {\n const f = u.width, d = u.height, g = this.getEngine().createCanvas(f, d).getContext(\"2d\");\n g.drawImage(u, 0, 0);\n const m = g.getImageData(0, 0, f, d).data;\n this.applyDisplacementMapFromBuffer(m, f, d, t, i, s, a, o), r && r(this);\n };\n return ge.LoadImage(e, h, l || (() => {\n }), c.offlineProvider), this;\n }\n /**\n * Modifies the mesh geometry according to a displacementMap buffer.\n * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex.\n * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated.\n * @param buffer is a `Uint8Array` buffer containing series of `Uint8` lower than 255, the red, green, blue and alpha values of each successive pixel.\n * @param heightMapWidth is the width of the buffer image.\n * @param heightMapHeight is the height of the buffer image.\n * @param minHeight is the lower limit of the displacement.\n * @param maxHeight is the upper limit of the displacement.\n * @param uvOffset is an optional vector2 used to offset UV.\n * @param uvScale is an optional vector2 used to scale UV.\n * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance.\n * @returns the Mesh.\n */\n applyDisplacementMapFromBuffer(e, t, i, r, s, a, o, l = !1) {\n if (!this.isVerticesDataPresent(I.PositionKind) || !this.isVerticesDataPresent(I.NormalKind) || !this.isVerticesDataPresent(I.UVKind))\n return ne.Warn(\"Cannot call applyDisplacementMap: Given mesh is not complete. Position, Normal or UV are missing\"), this;\n const c = this.getVerticesData(I.PositionKind, !0, !0), h = this.getVerticesData(I.NormalKind), u = this.getVerticesData(I.UVKind);\n let f = _.Zero();\n const d = _.Zero(), p = me.Zero();\n a = a || me.Zero(), o = o || new me(1, 1);\n for (let g = 0; g < c.length; g += 3) {\n _.FromArrayToRef(c, g, f), _.FromArrayToRef(h, g, d), me.FromArrayToRef(u, g / 3 * 2, p);\n const m = Math.abs(p.x * o.x + a.x % 1) * (t - 1) % t | 0, v = Math.abs(p.y * o.y + a.y % 1) * (i - 1) % i | 0, E = (m + v * t) * 4, C = e[E] / 255, T = e[E + 1] / 255, R = e[E + 2] / 255, x = C * 0.3 + T * 0.59 + R * 0.11;\n d.normalize(), d.scaleInPlace(r + (s - r) * x), f = f.add(d), f.toArray(c, g);\n }\n return re.ComputeNormals(c, this.getIndices(), h), l ? (this.setVerticesData(I.PositionKind, c), this.setVerticesData(I.NormalKind, h), this.setVerticesData(I.UVKind, u)) : (this.updateVerticesData(I.PositionKind, c), this.updateVerticesData(I.NormalKind, h)), this;\n }\n _getFlattenedNormals(e, t) {\n const i = new Float32Array(e.length * 3);\n let r = 0;\n const s = this.overrideMaterialSideOrientation === (this._scene.useRightHandedSystem ? 1 : 0);\n for (let a = 0; a < e.length; a += 3) {\n const o = _.FromArray(t, e[a] * 3), l = _.FromArray(t, e[a + 1] * 3), c = _.FromArray(t, e[a + 2] * 3), h = o.subtract(l), u = c.subtract(l), f = _.Normalize(_.Cross(h, u));\n s && f.scaleInPlace(-1);\n for (let d = 0; d < 3; d++)\n i[r++] = f.x, i[r++] = f.y, i[r++] = f.z;\n }\n return i;\n }\n _convertToUnIndexedMesh(e = !1) {\n const t = this.getVerticesDataKinds(), i = this.getIndices(), r = {}, s = (o, l) => {\n const c = new Float32Array(i.length * l);\n let h = 0;\n for (let u = 0; u < i.length; u++)\n for (let f = 0; f < l; f++)\n c[h++] = o[i[u] * l + f];\n return c;\n }, a = this.geometry ? this.subMeshes.slice(0) : [];\n for (const o of t)\n r[o] = this.getVerticesData(o);\n for (const o of t) {\n const l = this.getVertexBuffer(o), c = l.getStrideSize();\n if (e && o === I.NormalKind) {\n const h = this._getFlattenedNormals(i, r[I.PositionKind]);\n this.setVerticesData(I.NormalKind, h, l.isUpdatable(), c);\n } else\n this.setVerticesData(o, s(r[o], c), l.isUpdatable(), c);\n }\n if (this.morphTargetManager) {\n for (let o = 0; o < this.morphTargetManager.numTargets; o++) {\n const l = this.morphTargetManager.getTarget(o), c = l.getPositions();\n l.setPositions(s(c, 3));\n const h = l.getNormals();\n h && l.setNormals(e ? this._getFlattenedNormals(i, c) : s(h, 3));\n const u = l.getTangents();\n u && l.setTangents(s(u, 3));\n const f = l.getUVs();\n f && l.setUVs(s(f, 2));\n }\n this.morphTargetManager.synchronize();\n }\n for (let o = 0; o < i.length; o++)\n i[o] = o;\n this.setIndices(i), this._unIndexed = !0, this.releaseSubMeshes();\n for (const o of a)\n bi.AddToMesh(o.materialIndex, o.indexStart, o.indexCount, o.indexStart, o.indexCount, this);\n return this.synchronizeInstances(), this;\n }\n /**\n * Modify the mesh to get a flat shading rendering.\n * This means each mesh facet will then have its own normals. Usually new vertices are added in the mesh geometry to get this result.\n * Warning : the mesh is really modified even if not set originally as updatable and, under the hood, a new VertexBuffer is allocated.\n * @returns current mesh\n */\n convertToFlatShadedMesh() {\n return this._convertToUnIndexedMesh(!0);\n }\n /**\n * This method removes all the mesh indices and add new vertices (duplication) in order to unfold facets into buffers.\n * In other words, more vertices, no more indices and a single bigger VBO.\n * The mesh is really modified even if not set originally as updatable. Under the hood, a new VertexBuffer is allocated.\n * @returns current mesh\n */\n convertToUnIndexedMesh() {\n return this._convertToUnIndexedMesh();\n }\n /**\n * Inverses facet orientations.\n * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.\n * @param flipNormals will also inverts the normals\n * @returns current mesh\n */\n flipFaces(e = !1) {\n const t = re.ExtractFromMesh(this);\n let i;\n if (e && this.isVerticesDataPresent(I.NormalKind) && t.normals)\n for (i = 0; i < t.normals.length; i++)\n t.normals[i] *= -1;\n if (t.indices) {\n let r;\n for (i = 0; i < t.indices.length; i += 3)\n r = t.indices[i + 1], t.indices[i + 1] = t.indices[i + 2], t.indices[i + 2] = r;\n }\n return t.applyToMesh(this, this.isVertexBufferUpdatable(I.PositionKind)), this;\n }\n /**\n * Increase the number of facets and hence vertices in a mesh\n * Vertex normals are interpolated from existing vertex normals\n * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.\n * @param numberPerEdge the number of new vertices to add to each edge of a facet, optional default 1\n */\n increaseVertices(e = 1) {\n const t = re.ExtractFromMesh(this), i = t.indices && !Array.isArray(t.indices) && Array.from ? Array.from(t.indices) : t.indices, r = t.positions && !Array.isArray(t.positions) && Array.from ? Array.from(t.positions) : t.positions, s = t.uvs && !Array.isArray(t.uvs) && Array.from ? Array.from(t.uvs) : t.uvs, a = t.normals && !Array.isArray(t.normals) && Array.from ? Array.from(t.normals) : t.normals;\n if (!i || !r)\n ne.Warn(\"Couldn't increase number of vertices : VertexData must contain at least indices and positions\");\n else {\n t.indices = i, t.positions = r, s && (t.uvs = s), a && (t.normals = a);\n const o = e + 1, l = new Array();\n for (let R = 0; R < o + 1; R++)\n l[R] = new Array();\n let c, h;\n const u = new _(0, 0, 0), f = new _(0, 0, 0), d = new me(0, 0), p = new Array(), g = new Array(), m = new Array();\n let v, E = r.length, C;\n s && (C = s.length);\n let T;\n a && (T = a.length);\n for (let R = 0; R < i.length; R += 3) {\n g[0] = i[R], g[1] = i[R + 1], g[2] = i[R + 2];\n for (let x = 0; x < 3; x++)\n if (c = g[x], h = g[(x + 1) % 3], m[c] === void 0 && m[h] === void 0 ? (m[c] = new Array(), m[h] = new Array()) : (m[c] === void 0 && (m[c] = new Array()), m[h] === void 0 && (m[h] = new Array())), m[c][h] === void 0 && m[h][c] === void 0) {\n m[c][h] = [], u.x = (r[3 * h] - r[3 * c]) / o, u.y = (r[3 * h + 1] - r[3 * c + 1]) / o, u.z = (r[3 * h + 2] - r[3 * c + 2]) / o, a && (f.x = (a[3 * h] - a[3 * c]) / o, f.y = (a[3 * h + 1] - a[3 * c + 1]) / o, f.z = (a[3 * h + 2] - a[3 * c + 2]) / o), s && (d.x = (s[2 * h] - s[2 * c]) / o, d.y = (s[2 * h + 1] - s[2 * c + 1]) / o), m[c][h].push(c);\n for (let S = 1; S < o; S++)\n m[c][h].push(r.length / 3), r[E++] = r[3 * c] + S * u.x, r[E++] = r[3 * c + 1] + S * u.y, r[E++] = r[3 * c + 2] + S * u.z, a && (a[T++] = a[3 * c] + S * f.x, a[T++] = a[3 * c + 1] + S * f.y, a[T++] = a[3 * c + 2] + S * f.z), s && (s[C++] = s[2 * c] + S * d.x, s[C++] = s[2 * c + 1] + S * d.y);\n m[c][h].push(h), m[h][c] = new Array(), v = m[c][h].length;\n for (let S = 0; S < v; S++)\n m[h][c][S] = m[c][h][v - 1 - S];\n }\n l[0][0] = i[R], l[1][0] = m[i[R]][i[R + 1]][1], l[1][1] = m[i[R]][i[R + 2]][1];\n for (let x = 2; x < o; x++) {\n l[x][0] = m[i[R]][i[R + 1]][x], l[x][x] = m[i[R]][i[R + 2]][x], u.x = (r[3 * l[x][x]] - r[3 * l[x][0]]) / x, u.y = (r[3 * l[x][x] + 1] - r[3 * l[x][0] + 1]) / x, u.z = (r[3 * l[x][x] + 2] - r[3 * l[x][0] + 2]) / x, a && (f.x = (a[3 * l[x][x]] - a[3 * l[x][0]]) / x, f.y = (a[3 * l[x][x] + 1] - a[3 * l[x][0] + 1]) / x, f.z = (a[3 * l[x][x] + 2] - a[3 * l[x][0] + 2]) / x), s && (d.x = (s[2 * l[x][x]] - s[2 * l[x][0]]) / x, d.y = (s[2 * l[x][x] + 1] - s[2 * l[x][0] + 1]) / x);\n for (let S = 1; S < x; S++)\n l[x][S] = r.length / 3, r[E++] = r[3 * l[x][0]] + S * u.x, r[E++] = r[3 * l[x][0] + 1] + S * u.y, r[E++] = r[3 * l[x][0] + 2] + S * u.z, a && (a[T++] = a[3 * l[x][0]] + S * f.x, a[T++] = a[3 * l[x][0] + 1] + S * f.y, a[T++] = a[3 * l[x][0] + 2] + S * f.z), s && (s[C++] = s[2 * l[x][0]] + S * d.x, s[C++] = s[2 * l[x][0] + 1] + S * d.y);\n }\n l[o] = m[i[R + 1]][i[R + 2]], p.push(l[0][0], l[1][0], l[1][1]);\n for (let x = 1; x < o; x++) {\n let S;\n for (S = 0; S < x; S++)\n p.push(l[x][S], l[x + 1][S], l[x + 1][S + 1]), p.push(l[x][S], l[x + 1][S + 1], l[x][S + 1]);\n p.push(l[x][S], l[x + 1][S], l[x + 1][S + 1]);\n }\n }\n t.indices = p, t.applyToMesh(this, this.isVertexBufferUpdatable(I.PositionKind));\n }\n }\n /**\n * Force adjacent facets to share vertices and remove any facets that have all vertices in a line\n * This will undo any application of covertToFlatShadedMesh\n * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.\n */\n forceSharedVertices() {\n const e = re.ExtractFromMesh(this), t = e.uvs, i = e.indices, r = e.positions, s = e.colors, a = e.matricesIndices, o = e.matricesWeights, l = e.matricesIndicesExtra, c = e.matricesWeightsExtra;\n if (i === void 0 || r === void 0 || i === null || r === null)\n ne.Warn(\"VertexData contains empty entries\");\n else {\n const h = new Array(), u = new Array(), f = new Array(), d = new Array(), p = new Array(), g = new Array(), m = new Array(), v = new Array();\n let E = new Array(), C = 0;\n const T = {};\n let R, x;\n for (let M = 0; M < i.length; M += 3) {\n x = [i[M], i[M + 1], i[M + 2]], E = [];\n for (let N = 0; N < 3; N++) {\n E[N] = \"\";\n for (let F = 0; F < 3; F++)\n Math.abs(r[3 * x[N] + F]) < 1e-8 && (r[3 * x[N] + F] = 0), E[N] += r[3 * x[N] + F] + \"|\";\n }\n if (!(E[0] == E[1] || E[0] == E[2] || E[1] == E[2]))\n for (let N = 0; N < 3; N++) {\n if (R = T[E[N]], R === void 0) {\n T[E[N]] = C, R = C++;\n for (let F = 0; F < 3; F++)\n h.push(r[3 * x[N] + F]);\n if (s != null)\n for (let F = 0; F < 4; F++)\n d.push(s[4 * x[N] + F]);\n if (t != null)\n for (let F = 0; F < 2; F++)\n f.push(t[2 * x[N] + F]);\n if (a != null)\n for (let F = 0; F < 4; F++)\n p.push(a[4 * x[N] + F]);\n if (o != null)\n for (let F = 0; F < 4; F++)\n g.push(o[4 * x[N] + F]);\n if (l != null)\n for (let F = 0; F < 4; F++)\n m.push(l[4 * x[N] + F]);\n if (c != null)\n for (let F = 0; F < 4; F++)\n v.push(c[4 * x[N] + F]);\n }\n u.push(R);\n }\n }\n const S = new Array();\n re.ComputeNormals(h, u, S), e.positions = h, e.indices = u, e.normals = S, t != null && (e.uvs = f), s != null && (e.colors = d), a != null && (e.matricesIndices = p), o != null && (e.matricesWeights = g), l != null && (e.matricesIndicesExtra = m), o != null && (e.matricesWeightsExtra = v), e.applyToMesh(this, this.isVertexBufferUpdatable(I.PositionKind));\n }\n }\n // Instances\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/naming-convention\n static _instancedMeshFactory(e, t) {\n throw We(\"InstancedMesh\");\n }\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static _PhysicsImpostorParser(e, t, i) {\n throw We(\"PhysicsImpostor\");\n }\n /**\n * Creates a new InstancedMesh object from the mesh model.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\n * @param name defines the name of the new instance\n * @returns a new InstancedMesh\n */\n createInstance(e) {\n return B._instancedMeshFactory(e, this);\n }\n /**\n * Synchronises all the mesh instance submeshes to the current mesh submeshes, if any.\n * After this call, all the mesh instances have the same submeshes than the current mesh.\n * @returns the current mesh\n */\n synchronizeInstances() {\n for (let e = 0; e < this.instances.length; e++)\n this.instances[e]._syncSubMeshes();\n return this;\n }\n /**\n * Optimization of the mesh's indices, in case a mesh has duplicated vertices.\n * The function will only reorder the indices and will not remove unused vertices to avoid problems with submeshes.\n * This should be used together with the simplification to avoid disappearing triangles.\n * @param successCallback an optional success callback to be called after the optimization finished.\n * @returns the current mesh\n */\n optimizeIndices(e) {\n const t = this.getIndices(), i = this.getVerticesData(I.PositionKind);\n if (!i || !t)\n return this;\n const r = [];\n for (let a = 0; a < i.length; a = a + 3)\n r.push(_.FromArray(i, a));\n const s = [];\n return Pr.SyncAsyncForLoop(r.length, 40, (a) => {\n const o = r.length - 1 - a, l = r[o];\n for (let c = 0; c < o; ++c) {\n const h = r[c];\n if (l.equals(h)) {\n s[o] = c;\n break;\n }\n }\n }, () => {\n for (let o = 0; o < t.length; ++o)\n t[o] = s[t[o]] || t[o];\n const a = this.subMeshes.slice(0);\n this.setIndices(t), this.subMeshes = a, e && e(this);\n }), this;\n }\n /**\n * Serialize current mesh\n * @param serializationObject defines the object which will receive the serialization data\n * @returns the serialized object\n */\n serialize(e = {}) {\n e.name = this.name, e.id = this.id, e.uniqueId = this.uniqueId, e.type = this.getClassName(), rt && rt.HasTags(this) && (e.tags = rt.GetTags(this)), e.position = this.position.asArray(), this.rotationQuaternion ? e.rotationQuaternion = this.rotationQuaternion.asArray() : this.rotation && (e.rotation = this.rotation.asArray()), e.scaling = this.scaling.asArray(), this._postMultiplyPivotMatrix ? e.pivotMatrix = this.getPivotMatrix().asArray() : e.localMatrix = this.getPivotMatrix().asArray(), e.isEnabled = this.isEnabled(!1), e.isVisible = this.isVisible, e.infiniteDistance = this.infiniteDistance, e.pickable = this.isPickable, e.receiveShadows = this.receiveShadows, e.billboardMode = this.billboardMode, e.visibility = this.visibility, e.alwaysSelectAsActiveMesh = this.alwaysSelectAsActiveMesh, e.checkCollisions = this.checkCollisions, e.ellipsoid = this.ellipsoid.asArray(), e.ellipsoidOffset = this.ellipsoidOffset.asArray(), e.doNotSyncBoundingInfo = this.doNotSyncBoundingInfo, e.isBlocker = this.isBlocker, e.overrideMaterialSideOrientation = this.overrideMaterialSideOrientation, this.parent && this.parent._serializeAsParent(e), e.isUnIndexed = this.isUnIndexed;\n const t = this._geometry;\n if (t && this.subMeshes) {\n e.geometryUniqueId = t.uniqueId, e.geometryId = t.id, e.subMeshes = [];\n for (let i = 0; i < this.subMeshes.length; i++) {\n const r = this.subMeshes[i];\n e.subMeshes.push({\n materialIndex: r.materialIndex,\n verticesStart: r.verticesStart,\n verticesCount: r.verticesCount,\n indexStart: r.indexStart,\n indexCount: r.indexCount\n });\n }\n }\n if (this.material ? this.material.doNotSerialize || (e.materialUniqueId = this.material.uniqueId, e.materialId = this.material.id) : (this.material = null, e.materialUniqueId = this._scene.defaultMaterial.uniqueId, e.materialId = this._scene.defaultMaterial.id), this.morphTargetManager && (e.morphTargetManagerId = this.morphTargetManager.uniqueId), this.skeleton && (e.skeletonId = this.skeleton.id, e.numBoneInfluencers = this.numBoneInfluencers), this.getScene()._getComponent(ke.NAME_PHYSICSENGINE)) {\n const i = this.getPhysicsImpostor();\n i && (e.physicsMass = i.getParam(\"mass\"), e.physicsFriction = i.getParam(\"friction\"), e.physicsRestitution = i.getParam(\"mass\"), e.physicsImpostor = i.type);\n }\n this.metadata && (e.metadata = this.metadata), e.instances = [];\n for (let i = 0; i < this.instances.length; i++) {\n const r = this.instances[i];\n if (r.doNotSerialize)\n continue;\n const s = {\n name: r.name,\n id: r.id,\n isEnabled: r.isEnabled(!1),\n isVisible: r.isVisible,\n isPickable: r.isPickable,\n checkCollisions: r.checkCollisions,\n position: r.position.asArray(),\n scaling: r.scaling.asArray()\n };\n if (r.parent && r.parent._serializeAsParent(s), r.rotationQuaternion ? s.rotationQuaternion = r.rotationQuaternion.asArray() : r.rotation && (s.rotation = r.rotation.asArray()), this.getScene()._getComponent(ke.NAME_PHYSICSENGINE)) {\n const a = r.getPhysicsImpostor();\n a && (s.physicsMass = a.getParam(\"mass\"), s.physicsFriction = a.getParam(\"friction\"), s.physicsRestitution = a.getParam(\"mass\"), s.physicsImpostor = a.type);\n }\n r.metadata && (s.metadata = r.metadata), r.actionManager && (s.actions = r.actionManager.serialize(r.name)), e.instances.push(s), Le.AppendSerializedAnimations(r, s), s.ranges = r.serializeAnimationRanges();\n }\n if (this._thinInstanceDataStorage.instancesCount && this._thinInstanceDataStorage.matrixData && (e.thinInstances = {\n instancesCount: this._thinInstanceDataStorage.instancesCount,\n matrixData: Array.from(this._thinInstanceDataStorage.matrixData),\n matrixBufferSize: this._thinInstanceDataStorage.matrixBufferSize,\n enablePicking: this.thinInstanceEnablePicking\n }, this._userThinInstanceBuffersStorage)) {\n const i = {\n data: {},\n sizes: {},\n strides: {}\n };\n for (const r in this._userThinInstanceBuffersStorage.data)\n i.data[r] = Array.from(this._userThinInstanceBuffersStorage.data[r]), i.sizes[r] = this._userThinInstanceBuffersStorage.sizes[r], i.strides[r] = this._userThinInstanceBuffersStorage.strides[r];\n e.thinInstances.userThinInstance = i;\n }\n return Le.AppendSerializedAnimations(this, e), e.ranges = this.serializeAnimationRanges(), e.layerMask = this.layerMask, e.alphaIndex = this.alphaIndex, e.hasVertexAlpha = this.hasVertexAlpha, e.overlayAlpha = this.overlayAlpha, e.overlayColor = this.overlayColor.asArray(), e.renderOverlay = this.renderOverlay, e.applyFog = this.applyFog, this.actionManager && (e.actions = this.actionManager.serialize(this.name)), e;\n }\n /** @internal */\n _syncGeometryWithMorphTargetManager() {\n if (!this.geometry)\n return;\n this._markSubMeshesAsAttributesDirty();\n const e = this._internalAbstractMeshDataInfo._morphTargetManager;\n if (e && e.vertexCount) {\n if (e.vertexCount !== this.getTotalVertices()) {\n ne.Error(\"Mesh is incompatible with morph targets. Targets and mesh must all have the same vertices count.\"), this.morphTargetManager = null;\n return;\n }\n if (e.isUsingTextureForTargets)\n return;\n for (let t = 0; t < e.numInfluencers; t++) {\n const i = e.getActiveTarget(t), r = i.getPositions();\n if (!r) {\n ne.Error(\"Invalid morph target. Target must have positions.\");\n return;\n }\n this.geometry.setVerticesData(I.PositionKind + t, r, !1, 3);\n const s = i.getNormals();\n s && this.geometry.setVerticesData(I.NormalKind + t, s, !1, 3);\n const a = i.getTangents();\n a && this.geometry.setVerticesData(I.TangentKind + t, a, !1, 3);\n const o = i.getUVs();\n o && this.geometry.setVerticesData(I.UVKind + \"_\" + t, o, !1, 2);\n }\n } else {\n let t = 0;\n for (; this.geometry.isVerticesDataPresent(I.PositionKind + t); )\n this.geometry.removeVerticesData(I.PositionKind + t), this.geometry.isVerticesDataPresent(I.NormalKind + t) && this.geometry.removeVerticesData(I.NormalKind + t), this.geometry.isVerticesDataPresent(I.TangentKind + t) && this.geometry.removeVerticesData(I.TangentKind + t), this.geometry.isVerticesDataPresent(I.UVKind + t) && this.geometry.removeVerticesData(I.UVKind + \"_\" + t), t++;\n }\n }\n /**\n * Returns a new Mesh object parsed from the source provided.\n * @param parsedMesh is the source\n * @param scene defines the hosting scene\n * @param rootUrl is the root URL to prefix the `delayLoadingFile` property with\n * @returns a new Mesh\n */\n static Parse(e, t, i) {\n let r;\n if (e.type && e.type === \"LinesMesh\" ? r = B._LinesMeshParser(e, t) : e.type && e.type === \"GroundMesh\" ? r = B._GroundMeshParser(e, t) : e.type && e.type === \"GoldbergMesh\" ? r = B._GoldbergMeshParser(e, t) : e.type && e.type === \"GreasedLineMesh\" ? r = B._GreasedLineMeshParser(e, t) : e.type && e.type === \"TrailMesh\" ? r = B._TrailMeshParser(e, t) : r = new B(e.name, t), r.id = e.id, r._waitingParsedUniqueId = e.uniqueId, rt && rt.AddTagsTo(r, e.tags), r.position = _.FromArray(e.position), e.metadata !== void 0 && (r.metadata = e.metadata), e.rotationQuaternion ? r.rotationQuaternion = Ce.FromArray(e.rotationQuaternion) : e.rotation && (r.rotation = _.FromArray(e.rotation)), r.scaling = _.FromArray(e.scaling), e.localMatrix ? r.setPreTransformMatrix(w.FromArray(e.localMatrix)) : e.pivotMatrix && r.setPivotMatrix(w.FromArray(e.pivotMatrix)), r.setEnabled(e.isEnabled), r.isVisible = e.isVisible, r.infiniteDistance = e.infiniteDistance, r.alwaysSelectAsActiveMesh = !!e.alwaysSelectAsActiveMesh, r.showBoundingBox = e.showBoundingBox, r.showSubMeshesBoundingBox = e.showSubMeshesBoundingBox, e.applyFog !== void 0 && (r.applyFog = e.applyFog), e.pickable !== void 0 && (r.isPickable = e.pickable), e.alphaIndex !== void 0 && (r.alphaIndex = e.alphaIndex), r.receiveShadows = e.receiveShadows, e.billboardMode !== void 0 && (r.billboardMode = e.billboardMode), e.visibility !== void 0 && (r.visibility = e.visibility), r.checkCollisions = e.checkCollisions, r.doNotSyncBoundingInfo = !!e.doNotSyncBoundingInfo, e.ellipsoid && (r.ellipsoid = _.FromArray(e.ellipsoid)), e.ellipsoidOffset && (r.ellipsoidOffset = _.FromArray(e.ellipsoidOffset)), e.overrideMaterialSideOrientation !== void 0 && (r.overrideMaterialSideOrientation = e.overrideMaterialSideOrientation), e.isBlocker !== void 0 && (r.isBlocker = e.isBlocker), r._shouldGenerateFlatShading = e.useFlatShading, e.freezeWorldMatrix && (r._waitingData.freezeWorldMatrix = e.freezeWorldMatrix), e.parentId !== void 0 && (r._waitingParentId = e.parentId), e.parentInstanceIndex !== void 0 && (r._waitingParentInstanceIndex = e.parentInstanceIndex), e.actions !== void 0 && (r._waitingData.actions = e.actions), e.overlayAlpha !== void 0 && (r.overlayAlpha = e.overlayAlpha), e.overlayColor !== void 0 && (r.overlayColor = Ne.FromArray(e.overlayColor)), e.renderOverlay !== void 0 && (r.renderOverlay = e.renderOverlay), r.isUnIndexed = !!e.isUnIndexed, r.hasVertexAlpha = e.hasVertexAlpha, e.delayLoadingFile ? (r.delayLoadState = 4, r.delayLoadingFile = i + e.delayLoadingFile, r.buildBoundingInfo(_.FromArray(e.boundingBoxMinimum), _.FromArray(e.boundingBoxMaximum)), e._binaryInfo && (r._binaryInfo = e._binaryInfo), r._delayInfo = [], e.hasUVs && r._delayInfo.push(I.UVKind), e.hasUVs2 && r._delayInfo.push(I.UV2Kind), e.hasUVs3 && r._delayInfo.push(I.UV3Kind), e.hasUVs4 && r._delayInfo.push(I.UV4Kind), e.hasUVs5 && r._delayInfo.push(I.UV5Kind), e.hasUVs6 && r._delayInfo.push(I.UV6Kind), e.hasColors && r._delayInfo.push(I.ColorKind), e.hasMatricesIndices && r._delayInfo.push(I.MatricesIndicesKind), e.hasMatricesWeights && r._delayInfo.push(I.MatricesWeightsKind), r._delayLoadingFunction = is._ImportGeometry, ir.ForceFullSceneLoadingForIncremental && r._checkDelayState()) : is._ImportGeometry(e, r), e.materialUniqueId ? r._waitingMaterialId = e.materialUniqueId : e.materialId && (r._waitingMaterialId = e.materialId), e.morphTargetManagerId > -1 && (r.morphTargetManager = t.getMorphTargetManagerById(e.morphTargetManagerId)), e.skeletonId !== void 0 && e.skeletonId !== null && (r.skeleton = t.getLastSkeletonById(e.skeletonId), e.numBoneInfluencers && (r.numBoneInfluencers = e.numBoneInfluencers)), e.animations) {\n for (let s = 0; s < e.animations.length; s++) {\n const a = e.animations[s], o = mr(\"BABYLON.Animation\");\n o && r.animations.push(o.Parse(a));\n }\n Ai.ParseAnimationRanges(r, e, t);\n }\n if (e.autoAnimate && t.beginAnimation(r, e.autoAnimateFrom, e.autoAnimateTo, e.autoAnimateLoop, e.autoAnimateSpeed || 1), e.layerMask && !isNaN(e.layerMask) ? r.layerMask = Math.abs(parseInt(e.layerMask)) : r.layerMask = 268435455, e.physicsImpostor && B._PhysicsImpostorParser(t, r, e), e.lodMeshIds && (r._waitingData.lods = {\n ids: e.lodMeshIds,\n distances: e.lodDistances ? e.lodDistances : null,\n coverages: e.lodCoverages ? e.lodCoverages : null\n }), e.instances)\n for (let s = 0; s < e.instances.length; s++) {\n const a = e.instances[s], o = r.createInstance(a.name);\n if (a.id && (o.id = a.id), rt && (a.tags ? rt.AddTagsTo(o, a.tags) : rt.AddTagsTo(o, e.tags)), o.position = _.FromArray(a.position), a.metadata !== void 0 && (o.metadata = a.metadata), a.parentId !== void 0 && (o._waitingParentId = a.parentId), a.parentInstanceIndex !== void 0 && (o._waitingParentInstanceIndex = a.parentInstanceIndex), a.isEnabled !== void 0 && a.isEnabled !== null && o.setEnabled(a.isEnabled), a.isVisible !== void 0 && a.isVisible !== null && (o.isVisible = a.isVisible), a.isPickable !== void 0 && a.isPickable !== null && (o.isPickable = a.isPickable), a.rotationQuaternion ? o.rotationQuaternion = Ce.FromArray(a.rotationQuaternion) : a.rotation && (o.rotation = _.FromArray(a.rotation)), o.scaling = _.FromArray(a.scaling), a.checkCollisions != null && a.checkCollisions != null && (o.checkCollisions = a.checkCollisions), a.pickable != null && a.pickable != null && (o.isPickable = a.pickable), a.showBoundingBox != null && a.showBoundingBox != null && (o.showBoundingBox = a.showBoundingBox), a.showSubMeshesBoundingBox != null && a.showSubMeshesBoundingBox != null && (o.showSubMeshesBoundingBox = a.showSubMeshesBoundingBox), a.alphaIndex != null && a.showSubMeshesBoundingBox != null && (o.alphaIndex = a.alphaIndex), a.physicsImpostor && B._PhysicsImpostorParser(t, o, a), a.actions !== void 0 && (o._waitingData.actions = a.actions), a.animations) {\n for (let l = 0; l < a.animations.length; l++) {\n const c = a.animations[l], h = mr(\"BABYLON.Animation\");\n h && o.animations.push(h.Parse(c));\n }\n Ai.ParseAnimationRanges(o, a, t), a.autoAnimate && t.beginAnimation(o, a.autoAnimateFrom, a.autoAnimateTo, a.autoAnimateLoop, a.autoAnimateSpeed || 1);\n }\n }\n if (e.thinInstances) {\n const s = e.thinInstances;\n if (r.thinInstanceEnablePicking = !!s.enablePicking, s.matrixData ? (r.thinInstanceSetBuffer(\"matrix\", new Float32Array(s.matrixData), 16, !1), r._thinInstanceDataStorage.matrixBufferSize = s.matrixBufferSize, r._thinInstanceDataStorage.instancesCount = s.instancesCount) : r._thinInstanceDataStorage.matrixBufferSize = s.matrixBufferSize, e.thinInstances.userThinInstance) {\n const a = e.thinInstances.userThinInstance;\n for (const o in a.data)\n r.thinInstanceSetBuffer(o, new Float32Array(a.data[o]), a.strides[o], !1), r._userThinInstanceBuffersStorage.sizes[o] = a.sizes[o];\n }\n }\n return r;\n }\n // Skeletons\n /**\n * Prepare internal position array for software CPU skinning\n * @returns original positions used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh\n */\n setPositionsForCPUSkinning() {\n const e = this._internalMeshDataInfo;\n if (!e._sourcePositions) {\n const t = this.getVerticesData(I.PositionKind);\n if (!t)\n return e._sourcePositions;\n e._sourcePositions = new Float32Array(t), this.isVertexBufferUpdatable(I.PositionKind) || this.setVerticesData(I.PositionKind, t, !0);\n }\n return e._sourcePositions;\n }\n /**\n * Prepare internal normal array for software CPU skinning\n * @returns original normals used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh.\n */\n setNormalsForCPUSkinning() {\n const e = this._internalMeshDataInfo;\n if (!e._sourceNormals) {\n const t = this.getVerticesData(I.NormalKind);\n if (!t)\n return e._sourceNormals;\n e._sourceNormals = new Float32Array(t), this.isVertexBufferUpdatable(I.NormalKind) || this.setVerticesData(I.NormalKind, t, !0);\n }\n return e._sourceNormals;\n }\n /**\n * Updates the vertex buffer by applying transformation from the bones\n * @param skeleton defines the skeleton to apply to current mesh\n * @returns the current mesh\n */\n applySkeleton(e) {\n if (!this.geometry)\n return this;\n if (this.geometry._softwareSkinningFrameId == this.getScene().getFrameId())\n return this;\n if (this.geometry._softwareSkinningFrameId = this.getScene().getFrameId(), !this.isVerticesDataPresent(I.PositionKind))\n return this;\n if (!this.isVerticesDataPresent(I.MatricesIndicesKind))\n return this;\n if (!this.isVerticesDataPresent(I.MatricesWeightsKind))\n return this;\n const t = this.isVerticesDataPresent(I.NormalKind), i = this._internalMeshDataInfo;\n if (!i._sourcePositions) {\n const v = this.subMeshes.slice();\n this.setPositionsForCPUSkinning(), this.subMeshes = v;\n }\n t && !i._sourceNormals && this.setNormalsForCPUSkinning();\n let r = this.getVerticesData(I.PositionKind);\n if (!r)\n return this;\n r instanceof Float32Array || (r = new Float32Array(r));\n let s = this.getVerticesData(I.NormalKind);\n if (t) {\n if (!s)\n return this;\n s instanceof Float32Array || (s = new Float32Array(s));\n }\n const a = this.getVerticesData(I.MatricesIndicesKind), o = this.getVerticesData(I.MatricesWeightsKind);\n if (!o || !a)\n return this;\n const l = this.numBoneInfluencers > 4, c = l ? this.getVerticesData(I.MatricesIndicesExtraKind) : null, h = l ? this.getVerticesData(I.MatricesWeightsExtraKind) : null, u = e.getTransformMatrices(this), f = _.Zero(), d = new w(), p = new w();\n let g = 0, m;\n for (let v = 0; v < r.length; v += 3, g += 4) {\n let E;\n for (m = 0; m < 4; m++)\n E = o[g + m], E > 0 && (w.FromFloat32ArrayToRefScaled(u, Math.floor(a[g + m] * 16), E, p), d.addToSelf(p));\n if (l)\n for (m = 0; m < 4; m++)\n E = h[g + m], E > 0 && (w.FromFloat32ArrayToRefScaled(u, Math.floor(c[g + m] * 16), E, p), d.addToSelf(p));\n _.TransformCoordinatesFromFloatsToRef(i._sourcePositions[v], i._sourcePositions[v + 1], i._sourcePositions[v + 2], d, f), f.toArray(r, v), t && (_.TransformNormalFromFloatsToRef(i._sourceNormals[v], i._sourceNormals[v + 1], i._sourceNormals[v + 2], d, f), f.toArray(s, v)), d.reset();\n }\n return this.updateVerticesData(I.PositionKind, r), t && this.updateVerticesData(I.NormalKind, s), this;\n }\n // Tools\n /**\n * Returns an object containing a min and max Vector3 which are the minimum and maximum vectors of each mesh bounding box from the passed array, in the world coordinates\n * @param meshes defines the list of meshes to scan\n * @returns an object `{min:` Vector3`, max:` Vector3`}`\n */\n static MinMax(e) {\n let t = null, i = null;\n return e.forEach(function(r) {\n const a = r.getBoundingInfo().boundingBox;\n !t || !i ? (t = a.minimumWorld, i = a.maximumWorld) : (t.minimizeInPlace(a.minimumWorld), i.maximizeInPlace(a.maximumWorld));\n }), !t || !i ? {\n min: _.Zero(),\n max: _.Zero()\n } : {\n min: t,\n max: i\n };\n }\n /**\n * Returns the center of the `{min:` Vector3`, max:` Vector3`}` or the center of MinMax vector3 computed from a mesh array\n * @param meshesOrMinMaxVector could be an array of meshes or a `{min:` Vector3`, max:` Vector3`}` object\n * @returns a vector3\n */\n static Center(e) {\n const t = e instanceof Array ? B.MinMax(e) : e;\n return _.Center(t.min, t.max);\n }\n /**\n * Merge the array of meshes into a single mesh for performance reasons.\n * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes.\n * @param disposeSource when true (default), dispose of the vertices from the source meshes.\n * @param allow32BitsIndices when the sum of the vertices > 64k, this must be set to true.\n * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted.\n * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes.\n * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes.\n * @returns a new mesh\n */\n static MergeMeshes(e, t = !0, i, r, s, a) {\n return sf(B._MergeMeshesCoroutine(e, t, i, r, s, a, !1));\n }\n /**\n * Merge the array of meshes into a single mesh for performance reasons.\n * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes.\n * @param disposeSource when true (default), dispose of the vertices from the source meshes.\n * @param allow32BitsIndices when the sum of the vertices > 64k, this must be set to true.\n * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted.\n * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes.\n * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes.\n * @returns a new mesh\n */\n static MergeMeshesAsync(e, t = !0, i, r, s, a) {\n return j_(B._MergeMeshesCoroutine(e, t, i, r, s, a, !0), ky());\n }\n static *_MergeMeshesCoroutine(e, t = !0, i, r, s, a, o) {\n if (e = e.filter(Boolean), e.length === 0)\n return null;\n let l;\n if (!i) {\n let S = 0;\n for (l = 0; l < e.length; l++)\n if (S += e[l].getTotalVertices(), S >= 65536)\n return ne.Warn(\"Cannot merge meshes because resulting mesh will have more than 65536 vertices. Please use allow32BitsIndices = true to use 32 bits indices\"), null;\n }\n a && (s = !1);\n const c = new Array(), h = new Array(), u = new Array(), f = e[0].overrideMaterialSideOrientation;\n for (l = 0; l < e.length; l++) {\n const S = e[l];\n if (S.isAnInstance)\n return ne.Warn(\"Cannot merge instance meshes.\"), null;\n if (f !== S.overrideMaterialSideOrientation)\n return ne.Warn(\"Cannot merge meshes with different overrideMaterialSideOrientation values.\"), null;\n if (s && u.push(S.getTotalIndices()), a)\n if (S.material) {\n const M = S.material;\n if (M instanceof Aa) {\n for (let N = 0; N < M.subMaterials.length; N++)\n c.indexOf(M.subMaterials[N]) < 0 && c.push(M.subMaterials[N]);\n for (let N = 0; N < S.subMeshes.length; N++)\n h.push(c.indexOf(M.subMaterials[S.subMeshes[N].materialIndex])), u.push(S.subMeshes[N].indexCount);\n } else {\n c.indexOf(M) < 0 && c.push(M);\n for (let N = 0; N < S.subMeshes.length; N++)\n h.push(c.indexOf(M)), u.push(S.subMeshes[N].indexCount);\n }\n } else\n for (let M = 0; M < S.subMeshes.length; M++)\n h.push(0), u.push(S.subMeshes[M].indexCount);\n }\n const d = e[0], p = (S) => {\n const M = S.computeWorldMatrix(!0);\n return { vertexData: re.ExtractFromMesh(S, !1, !1), transform: M };\n }, { vertexData: g, transform: m } = p(d);\n o && (yield);\n const v = new Array(e.length - 1);\n for (let S = 1; S < e.length; S++)\n v[S - 1] = p(e[S]), o && (yield);\n const E = g._mergeCoroutine(m, v, i, o, !t);\n let C = E.next();\n for (; !C.done; )\n o && (yield), C = E.next();\n const T = C.value;\n r || (r = new B(d.name + \"_merged\", d.getScene()));\n const R = T._applyToCoroutine(r, void 0, o);\n let x = R.next();\n for (; !x.done; )\n o && (yield), x = R.next();\n if (r.checkCollisions = d.checkCollisions, r.overrideMaterialSideOrientation = d.overrideMaterialSideOrientation, t)\n for (l = 0; l < e.length; l++)\n e[l].dispose();\n if (s || a) {\n r.releaseSubMeshes(), l = 0;\n let S = 0;\n for (; l < u.length; )\n bi.CreateFromIndices(0, S, u[l], r, void 0, !1), S += u[l], l++;\n for (const M of r.subMeshes)\n M.refreshBoundingInfo();\n r.computeWorldMatrix(!0);\n }\n if (a) {\n const S = new Aa(d.name + \"_merged\", d.getScene());\n S.subMaterials = c;\n for (let M = 0; M < r.subMeshes.length; M++)\n r.subMeshes[M].materialIndex = h[M];\n r.material = S;\n } else\n r.material = d.material;\n return r;\n }\n /**\n * @internal\n */\n addInstance(e) {\n e._indexInSourceMeshInstanceArray = this.instances.length, this.instances.push(e);\n }\n /**\n * @internal\n */\n removeInstance(e) {\n const t = e._indexInSourceMeshInstanceArray;\n if (t != -1) {\n if (t !== this.instances.length - 1) {\n const i = this.instances[this.instances.length - 1];\n this.instances[t] = i, i._indexInSourceMeshInstanceArray = t;\n }\n e._indexInSourceMeshInstanceArray = -1, this.instances.pop();\n }\n }\n /** @internal */\n _shouldConvertRHS() {\n return this.overrideMaterialSideOrientation === ie.CounterClockWiseSideOrientation;\n }\n /** @internal */\n _getRenderingFillMode(e) {\n const t = this.getScene();\n return t.forcePointsCloud ? ie.PointFillMode : t.forceWireframe ? ie.WireFrameFillMode : this.overrideRenderingFillMode ?? e;\n }\n // deprecated methods\n /**\n * Sets the mesh material by the material or multiMaterial `id` property\n * @param id is a string identifying the material or the multiMaterial\n * @returns the current mesh\n * @deprecated Please use MeshBuilder instead Please use setMaterialById instead\n */\n setMaterialByID(e) {\n return this.setMaterialById(e);\n }\n /**\n * Creates a ribbon mesh.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\n * @param name defines the name of the mesh to create\n * @param pathArray is a required array of paths, what are each an array of successive Vector3. The pathArray parameter depicts the ribbon geometry.\n * @param closeArray creates a seam between the first and the last paths of the path array (default is false)\n * @param closePath creates a seam between the first and the last points of each path of the path array\n * @param offset is taken in account only if the `pathArray` is containing a single path\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @param instance defines an instance of an existing Ribbon object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#ribbon)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateRibbon(e, t, i, r, s, a, o, l, c) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a plane polygonal mesh. By default, this is a disc.\n * @param name defines the name of the mesh to create\n * @param radius sets the radius size (float) of the polygon (default 0.5)\n * @param tessellation sets the number of polygon sides (positive integer, default 64). So a tessellation valued to 3 will build a triangle, to 4 a square, etc\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateDisc(e, t, i, r, s, a) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a box mesh.\n * @param name defines the name of the mesh to create\n * @param size sets the size (float) of each box side (default 1)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateBox(e, t, i, r, s) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a sphere mesh.\n * @param name defines the name of the mesh to create\n * @param segments sets the sphere number of horizontal stripes (positive integer, default 32)\n * @param diameter sets the diameter size (float) of the sphere (default 1)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateSphere(e, t, i, r, s, a) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a hemisphere mesh.\n * @param name defines the name of the mesh to create\n * @param segments sets the sphere number of horizontal stripes (positive integer, default 32)\n * @param diameter sets the diameter size (float) of the sphere (default 1)\n * @param scene defines the hosting scene\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateHemisphere(e, t, i, r) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a cylinder or a cone mesh.\n * @param name defines the name of the mesh to create\n * @param height sets the height size (float) of the cylinder/cone (float, default 2)\n * @param diameterTop set the top cap diameter (floats, default 1)\n * @param diameterBottom set the bottom cap diameter (floats, default 1). This value can't be zero\n * @param tessellation sets the number of cylinder sides (positive integer, default 24). Set it to 3 to get a prism for instance\n * @param subdivisions sets the number of rings along the cylinder height (positive integer, default 1)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateCylinder(e, t, i, r, s, a, o, l, c) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n // Torus (Code from SharpDX.org)\n /**\n * Creates a torus mesh.\n * @param name defines the name of the mesh to create\n * @param diameter sets the diameter size (float) of the torus (default 1)\n * @param thickness sets the diameter size of the tube of the torus (float, default 0.5)\n * @param tessellation sets the number of torus sides (positive integer, default 16)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateTorus(e, t, i, r, s, a, o) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a torus knot mesh.\n * @param name defines the name of the mesh to create\n * @param radius sets the global radius size (float) of the torus knot (default 2)\n * @param tube sets the diameter size of the tube of the torus (float, default 0.5)\n * @param radialSegments sets the number of sides on each tube segments (positive integer, default 32)\n * @param tubularSegments sets the number of tubes to decompose the knot into (positive integer, default 32)\n * @param p the number of windings on X axis (positive integers, default 2)\n * @param q the number of windings on Y axis (positive integers, default 3)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateTorusKnot(e, t, i, r, s, a, o, l, c, h) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a line mesh..\n * @param name defines the name of the mesh to create\n * @param points is an array successive Vector3\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines).\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateLines(e, t, i, r, s) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a dashed line mesh.\n * @param name defines the name of the mesh to create\n * @param points is an array successive Vector3\n * @param dashSize is the size of the dashes relatively the dash number (positive float, default 3)\n * @param gapSize is the size of the gap between two successive dashes relatively the dash number (positive float, default 1)\n * @param dashNb is the intended total number of dashes (positive integer, default 200)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateDashedLines(e, t, i, r, s, a, o, l) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a polygon mesh.Please consider using the same method from the MeshBuilder class instead\n * The polygon's shape will depend on the input parameters and is constructed parallel to a ground mesh.\n * The parameter `shape` is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors.\n * You can set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created.\n * Remember you can only change the shape positions, not their number when updating a polygon.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#non-regular-polygon\n * @param name defines the name of the mesh to create\n * @param shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors\n * @param scene defines the hosting scene\n * @param holes is a required array of arrays of successive Vector3 used to defines holes in the polygon\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @param earcutInjection can be used to inject your own earcut reference\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreatePolygon(e, t, i, r, s, a, o) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates an extruded polygon mesh, with depth in the Y direction..\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-non-regular-polygon\n * @param name defines the name of the mesh to create\n * @param shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors\n * @param depth defines the height of extrusion\n * @param scene defines the hosting scene\n * @param holes is a required array of arrays of successive Vector3 used to defines holes in the polygon\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @param earcutInjection can be used to inject your own earcut reference\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static ExtrudePolygon(e, t, i, r, s, a, o, l) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates an extruded shape mesh.\n * The extrusion is a parametric shape. It has no predefined shape. Its final shape will depend on the input parameters.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes\n * @param name defines the name of the mesh to create\n * @param shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis\n * @param path is a required array of successive Vector3. This is the axis curve the shape is extruded along\n * @param scale is the value to scale the shape\n * @param rotation is the angle value to rotate the shape each step (each path point), from the former step (so rotation added each step) along the curve\n * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @param instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#extruded-shape)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static ExtrudeShape(e, t, i, r, s, a, o, l, c, h) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates an custom extruded shape mesh.\n * The custom extrusion is a parametric shape.\n * It has no predefined shape. Its final shape will depend on the input parameters.\n *\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes\n * @param name defines the name of the mesh to create\n * @param shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis\n * @param path is a required array of successive Vector3. This is the axis curve the shape is extruded along\n * @param scaleFunction is a custom Javascript function called on each path point\n * @param rotationFunction is a custom Javascript function called on each path point\n * @param ribbonCloseArray forces the extrusion underlying ribbon to close all the paths in its `pathArray`\n * @param ribbonClosePath forces the extrusion underlying ribbon to close its `pathArray`\n * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @param instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#extruded-shape)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static ExtrudeShapeCustom(e, t, i, r, s, a, o, l, c, h, u, f) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates lathe mesh.\n * The lathe is a shape with a symmetry axis : a 2D model shape is rotated around this axis to design the lathe.\n * @param name defines the name of the mesh to create\n * @param shape is a required array of successive Vector3. This array depicts the shape to be rotated in its local space : the shape must be designed in the xOy plane and will be rotated around the Y axis. It's usually a 2D shape, so the Vector3 z coordinates are often set to zero\n * @param radius is the radius value of the lathe\n * @param tessellation is the side number of the lathe.\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateLathe(e, t, i, r, s, a, o) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a plane mesh.\n * @param name defines the name of the mesh to create\n * @param size sets the size (float) of both sides of the plane at once (default 1)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreatePlane(e, t, i, r, s) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a ground mesh.\n * @param name defines the name of the mesh to create\n * @param width set the width of the ground\n * @param height set the height of the ground\n * @param subdivisions sets the number of subdivisions per side\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateGround(e, t, i, r, s, a) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a tiled ground mesh.\n * @param name defines the name of the mesh to create\n * @param xmin set the ground minimum X coordinate\n * @param zmin set the ground minimum Y coordinate\n * @param xmax set the ground maximum X coordinate\n * @param zmax set the ground maximum Z coordinate\n * @param subdivisions is an object `{w: positive integer, h: positive integer}` (default `{w: 6, h: 6}`). `w` and `h` are the numbers of subdivisions on the ground width and height. Each subdivision is called a tile\n * @param precision is an object `{w: positive integer, h: positive integer}` (default `{w: 2, h: 2}`). `w` and `h` are the numbers of subdivisions on the ground width and height of each tile\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateTiledGround(e, t, i, r, s, a, o, l, c) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a ground mesh from a height map.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/height_map\n * @param name defines the name of the mesh to create\n * @param url sets the URL of the height map image resource\n * @param width set the ground width size\n * @param height set the ground height size\n * @param subdivisions sets the number of subdivision per side\n * @param minHeight is the minimum altitude on the ground\n * @param maxHeight is the maximum altitude on the ground\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param onReady is a callback function that will be called once the mesh is built (the height map download can last some time)\n * @param alphaFilter will filter any data where the alpha channel is below this value, defaults 0 (all data visible)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateGroundFromHeightMap(e, t, i, r, s, a, o, l, c, h, u) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a tube mesh.\n * The tube is a parametric shape.\n * It has no predefined shape. Its final shape will depend on the input parameters.\n *\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\n * @param name defines the name of the mesh to create\n * @param path is a required array of successive Vector3. It is the curve used as the axis of the tube\n * @param radius sets the tube radius size\n * @param tessellation is the number of sides on the tubular surface\n * @param radiusFunction is a custom function. If it is not null, it overrides the parameter `radius`. This function is called on each point of the tube path and is passed the index `i` of the i-th point and the distance of this point from the first point of the path\n * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @param instance is an instance of an existing Tube object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#tube)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateTube(e, t, i, r, s, a, o, l, c, h) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a polyhedron mesh.\n *.\n * * The parameter `type` (positive integer, max 14, default 0) sets the polyhedron type to build among the 15 embedded types. Please refer to the type sheet in the tutorial to choose the wanted type\n * * The parameter `size` (positive float, default 1) sets the polygon size\n * * You can overwrite the `size` on each dimension bu using the parameters `sizeX`, `sizeY` or `sizeZ` (positive floats, default to `size` value)\n * * You can build other polyhedron types than the 15 embbeded ones by setting the parameter `custom` (`polyhedronObject`, default null). If you set the parameter `custom`, this overwrittes the parameter `type`\n * * A `polyhedronObject` is a formatted javascript object. You'll find a full file with pre-set polyhedra here : https://github.com/BabylonJS/Extensions/tree/master/Polyhedron\n * * You can set the color and the UV of each side of the polyhedron with the parameters `faceColors` (Color4, default `(1, 1, 1, 1)`) and faceUV (Vector4, default `(0, 0, 1, 1)`)\n * * To understand how to set `faceUV` or `faceColors`, please read this by considering the right number of faces of your polyhedron, instead of only 6 for the box : https://doc.babylonjs.com/features/featuresDeepDive/materials/using/texturePerBoxFace\n * * The parameter `flat` (boolean, default true). If set to false, it gives the polyhedron a single global face, so less vertices and shared normals. In this case, `faceColors` and `faceUV` are ignored\n * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\n * @param name defines the name of the mesh to create\n * @param options defines the options used to create the mesh\n * @param scene defines the hosting scene\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreatePolyhedron(e, t, i) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a sphere based upon an icosahedron with 20 triangular faces which can be subdivided\n * * The parameter `radius` sets the radius size (float) of the icosphere (default 1)\n * * You can set some different icosphere dimensions, for instance to build an ellipsoid, by using the parameters `radiusX`, `radiusY` and `radiusZ` (all by default have the same value than `radius`)\n * * The parameter `subdivisions` sets the number of subdivisions (positive integer, default 4). The more subdivisions, the more faces on the icosphere whatever its size\n * * The parameter `flat` (boolean, default true) gives each side its own normals. Set it to false to get a smooth continuous light reflection on the surface\n * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/polyhedra#icosphere\n * @param name defines the name of the mesh\n * @param options defines the options used to create the mesh\n * @param scene defines the hosting scene\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateIcoSphere(e, t, i) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a decal mesh.\n *.\n * A decal is a mesh usually applied as a model onto the surface of another mesh\n * @param name defines the name of the mesh\n * @param sourceMesh defines the mesh receiving the decal\n * @param position sets the position of the decal in world coordinates\n * @param normal sets the normal of the mesh where the decal is applied onto in world coordinates\n * @param size sets the decal scaling\n * @param angle sets the angle to rotate the decal\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateDecal(e, t, i, r, s, a) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /** Creates a Capsule Mesh\n * @param name defines the name of the mesh.\n * @param options the constructors options used to shape the mesh.\n * @param scene defines the scene the mesh is scoped to.\n * @returns the capsule mesh\n * @see https://doc.babylonjs.com/how_to/capsule_shape\n * @deprecated Please use MeshBuilder instead\n */\n static CreateCapsule(e, t, i) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Extends a mesh to a Goldberg mesh\n * Warning the mesh to convert MUST be an import of a perviously exported Goldberg mesh\n * @param mesh the mesh to convert\n * @returns the extended mesh\n * @deprecated Please use ExtendMeshToGoldberg instead\n */\n static ExtendToGoldberg(e) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n}\nB.FRONTSIDE = re.FRONTSIDE;\nB.BACKSIDE = re.BACKSIDE;\nB.DOUBLESIDE = re.DOUBLESIDE;\nB.DEFAULTSIDE = re.DEFAULTSIDE;\nB.NO_CAP = 0;\nB.CAP_START = 1;\nB.CAP_END = 2;\nB.CAP_ALL = 3;\nB.NO_FLIP = 0;\nB.FLIP_TILE = 1;\nB.ROTATE_TILE = 2;\nB.FLIP_ROW = 3;\nB.ROTATE_ROW = 4;\nB.FLIP_N_ROTATE_TILE = 5;\nB.FLIP_N_ROTATE_ROW = 6;\nB.CENTER = 0;\nB.LEFT = 1;\nB.RIGHT = 2;\nB.TOP = 3;\nB.BOTTOM = 4;\nB.INSTANCEDMESH_SORT_TRANSPARENT = !1;\nB._GroundMeshParser = (n, e) => {\n throw We(\"GroundMesh\");\n};\nB._GoldbergMeshParser = (n, e) => {\n throw We(\"GoldbergMesh\");\n};\nB._LinesMeshParser = (n, e) => {\n throw We(\"LinesMesh\");\n};\nB._GreasedLineMeshParser = (n, e) => {\n throw We(\"GreasedLineMesh\");\n};\nB._GreasedLineRibbonMeshParser = (n, e) => {\n throw We(\"GreasedLineRibbonMesh\");\n};\nB._TrailMeshParser = (n, e) => {\n throw We(\"TrailMesh\");\n};\nRe(\"BABYLON.Mesh\", B);\nlet _l = 0;\nclass vo {\n /**\n * Initializes the vertex\n * @param pos The position of the vertex\n * @param normal The normal of the vertex\n * @param uv The texture coordinate of the vertex\n * @param vertColor The RGBA color of the vertex\n */\n constructor(e, t, i, r) {\n this.pos = e, this.normal = t, this.uv = i, this.vertColor = r;\n }\n /**\n * Make a clone, or deep copy, of the vertex\n * @returns A new Vertex\n */\n clone() {\n var e, t;\n return new vo(this.pos.clone(), this.normal.clone(), (e = this.uv) == null ? void 0 : e.clone(), (t = this.vertColor) == null ? void 0 : t.clone());\n }\n /**\n * Invert all orientation-specific data (e.g. vertex normal). Called when the\n * orientation of a polygon is flipped.\n */\n flip() {\n this.normal = this.normal.scale(-1);\n }\n /**\n * Create a new vertex between this vertex and `other` by linearly\n * interpolating all properties using a parameter of `t`. Subclasses should\n * override this to interpolate additional properties.\n * @param other the vertex to interpolate against\n * @param t The factor used to linearly interpolate between the vertices\n * @returns The new interpolated vertex\n */\n interpolate(e, t) {\n return new vo(_.Lerp(this.pos, e.pos, t), _.Lerp(this.normal, e.normal, t), this.uv && e.uv ? me.Lerp(this.uv, e.uv, t) : void 0, this.vertColor && e.vertColor ? et.Lerp(this.vertColor, e.vertColor, t) : void 0);\n }\n}\nclass yn {\n /**\n * Initializes the plane\n * @param normal The normal for the plane\n * @param w\n */\n constructor(e, t) {\n this.normal = e, this.w = t;\n }\n /**\n * Construct a plane from three points\n * @param a Point a\n * @param b Point b\n * @param c Point c\n * @returns A new plane\n */\n static FromPoints(e, t, i) {\n const r = i.subtract(e), s = t.subtract(e);\n if (r.lengthSquared() === 0 || s.lengthSquared() === 0)\n return null;\n const a = _.Normalize(_.Cross(r, s));\n return new yn(a, _.Dot(a, e));\n }\n /**\n * Clone, or make a deep copy of the plane\n * @returns a new Plane\n */\n clone() {\n return new yn(this.normal.clone(), this.w);\n }\n /**\n * Flip the face of the plane\n */\n flip() {\n this.normal.scaleInPlace(-1), this.w = -this.w;\n }\n /**\n * Split `polygon` by this plane if needed, then put the polygon or polygon\n * fragments in the appropriate lists. Coplanar polygons go into either\n `* coplanarFront` or `coplanarBack` depending on their orientation with\n * respect to this plane. Polygons in front or in back of this plane go into\n * either `front` or `back`\n * @param polygon The polygon to be split\n * @param coplanarFront Will contain polygons coplanar with the plane that are oriented to the front of the plane\n * @param coplanarBack Will contain polygons coplanar with the plane that are oriented to the back of the plane\n * @param front Will contain the polygons in front of the plane\n * @param back Will contain the polygons begind the plane\n */\n splitPolygon(e, t, i, r, s) {\n let h = 0;\n const u = [];\n let f, d;\n for (f = 0; f < e.vertices.length; f++) {\n d = _.Dot(this.normal, e.vertices[f].pos) - this.w;\n const p = d < -yn.EPSILON ? 2 : d > yn.EPSILON ? 1 : 0;\n h |= p, u.push(p);\n }\n switch (h) {\n case 0:\n (_.Dot(this.normal, e.plane.normal) > 0 ? t : i).push(e);\n break;\n case 1:\n r.push(e);\n break;\n case 2:\n s.push(e);\n break;\n case 3: {\n const p = [], g = [];\n for (f = 0; f < e.vertices.length; f++) {\n const v = (f + 1) % e.vertices.length, E = u[f], C = u[v], T = e.vertices[f], R = e.vertices[v];\n if (E !== 2 && p.push(T), E !== 1 && g.push(E !== 2 ? T.clone() : T), (E | C) === 3) {\n d = (this.w - _.Dot(this.normal, T.pos)) / _.Dot(this.normal, R.pos.subtract(T.pos));\n const x = T.interpolate(R, d);\n p.push(x), g.push(x.clone());\n }\n }\n let m;\n p.length >= 3 && (m = new Ma(p, e.shared), m.plane && r.push(m)), g.length >= 3 && (m = new Ma(g, e.shared), m.plane && s.push(m));\n break;\n }\n }\n }\n}\nyn.EPSILON = 1e-5;\nclass Ma {\n /**\n * Initializes the polygon\n * @param vertices The vertices of the polygon\n * @param shared The properties shared across all polygons\n */\n constructor(e, t) {\n this.vertices = e, this.shared = t, this.plane = yn.FromPoints(e[0].pos, e[1].pos, e[2].pos);\n }\n /**\n * Clones, or makes a deep copy, or the polygon\n * @returns A new CSGPolygon\n */\n clone() {\n const e = this.vertices.map((t) => t.clone());\n return new Ma(e, this.shared);\n }\n /**\n * Flips the faces of the polygon\n */\n flip() {\n this.vertices.reverse().map((e) => {\n e.flip();\n }), this.plane.flip();\n }\n}\nlet Ir = class Xl {\n /**\n * Initializes the node\n * @param polygons A collection of polygons held in the node\n */\n constructor(e) {\n this._plane = null, this._front = null, this._back = null, this._polygons = new Array(), e && this.build(e);\n }\n /**\n * Clones, or makes a deep copy, of the node\n * @returns The cloned node\n */\n clone() {\n const e = new Xl();\n return e._plane = this._plane && this._plane.clone(), e._front = this._front && this._front.clone(), e._back = this._back && this._back.clone(), e._polygons = this._polygons.map((t) => t.clone()), e;\n }\n /**\n * Convert solid space to empty space and empty space to solid space\n */\n invert() {\n for (let t = 0; t < this._polygons.length; t++)\n this._polygons[t].flip();\n this._plane && this._plane.flip(), this._front && this._front.invert(), this._back && this._back.invert();\n const e = this._front;\n this._front = this._back, this._back = e;\n }\n /**\n * Recursively remove all polygons in `polygons` that are inside this BSP\n * tree.\n * @param polygons Polygons to remove from the BSP\n * @returns Polygons clipped from the BSP\n */\n clipPolygons(e) {\n if (!this._plane)\n return e.slice();\n let t = [], i = [];\n for (let r = 0; r < e.length; r++)\n this._plane.splitPolygon(e[r], t, i, t, i);\n return this._front && (t = this._front.clipPolygons(t)), this._back ? i = this._back.clipPolygons(i) : i = [], t.concat(i);\n }\n /**\n * Remove all polygons in this BSP tree that are inside the other BSP tree\n * `bsp`.\n * @param bsp BSP containing polygons to remove from this BSP\n */\n clipTo(e) {\n this._polygons = e.clipPolygons(this._polygons), this._front && this._front.clipTo(e), this._back && this._back.clipTo(e);\n }\n /**\n * Return a list of all polygons in this BSP tree\n * @returns List of all polygons in this BSP tree\n */\n allPolygons() {\n let e = this._polygons.slice();\n return this._front && (e = e.concat(this._front.allPolygons())), this._back && (e = e.concat(this._back.allPolygons())), e;\n }\n /**\n * Build a BSP tree out of `polygons`. When called on an existing tree, the\n * new polygons are filtered down to the bottom of the tree and become new\n * nodes there. Each set of polygons is partitioned using the first polygon\n * (no heuristic is used to pick a good split)\n * @param polygons Polygons used to construct the BSP tree\n */\n build(e) {\n if (!e.length)\n return;\n this._plane || (this._plane = e[0].plane.clone());\n const t = [], i = [];\n for (let r = 0; r < e.length; r++)\n this._plane.splitPolygon(e[r], this._polygons, this._polygons, t, i);\n t.length && (this._front || (this._front = new Xl()), this._front.build(t)), i.length && (this._back || (this._back = new Xl()), this._back.build(i));\n }\n};\nclass ss {\n constructor() {\n this._polygons = new Array();\n }\n /**\n * Convert a VertexData to CSG\n * @param data defines the VertexData to convert to CSG\n * @returns the new CSG\n */\n static FromVertexData(e) {\n let t, i, r;\n const s = [], a = e.indices, o = e.positions, l = e.normals, c = e.uvs, h = e.colors;\n if (!a || !o)\n throw \"BABYLON.CSG: VertexData must at least contain positions and indices\";\n for (let f = 0; f < a.length; f += 3) {\n r = [];\n for (let d = 0; d < 3; d++) {\n const p = f + d, g = a[p], m = l ? _.FromArray(l, g * 3) : _.Zero(), v = c ? me.FromArray(c, g * 2) : void 0, E = h ? et.FromArray(h, g * 4) : void 0, C = _.FromArray(o, g * 3);\n t = new vo(C, m, v, E), r.push(t);\n }\n i = new Ma(r, { subMeshId: 0, meshId: _l, materialIndex: 0 }), i.plane && s.push(i);\n }\n const u = ss._FromPolygons(s);\n return u.matrix = w.Identity(), u.position = _.Zero(), u.rotation = _.Zero(), u.scaling = _.One(), u.rotationQuaternion = Ce.Identity(), _l++, u;\n }\n /**\n * Convert the Mesh to CSG\n * @param mesh The Mesh to convert to CSG\n * @param absolute If true, the final (local) matrix transformation is set to the identity and not to that of `mesh`. It can help when dealing with right-handed meshes (default: false)\n * @returns A new CSG from the Mesh\n */\n static FromMesh(e, t = !1) {\n let i, r, s, a, o, l, c;\n const h = [];\n let u, f, d, p = null, g, m = !1;\n if (e instanceof B)\n e.computeWorldMatrix(!0), u = e.getWorldMatrix(), f = e.position.clone(), d = e.rotation.clone(), e.rotationQuaternion && (p = e.rotationQuaternion.clone()), g = e.scaling.clone(), e.material && t && (m = e.material.sideOrientation === 0);\n else\n throw \"BABYLON.CSG: Wrong Mesh type, must be BABYLON.Mesh\";\n const v = e.getIndices(), E = e.getVerticesData(I.PositionKind), C = e.getVerticesData(I.NormalKind), T = e.getVerticesData(I.UVKind), R = e.getVerticesData(I.ColorKind), x = e.subMeshes;\n for (let M = 0, N = x.length; M < N; M++)\n for (let F = x[M].indexStart, L = x[M].indexCount + x[M].indexStart; F < L; F += 3) {\n c = [];\n for (let K = 0; K < 3; K++) {\n const q = K === 0 ? F + K : m ? F + 3 - K : F + K, j = new _(C[v[q] * 3], C[v[q] * 3 + 1], C[v[q] * 3 + 2]);\n T && (s = new me(T[v[q] * 2], T[v[q] * 2 + 1])), R && (o = new et(R[v[q] * 4], R[v[q] * 4 + 1], R[v[q] * 4 + 2], R[v[q] * 4 + 3]));\n const k = new _(E[v[q] * 3], E[v[q] * 3 + 1], E[v[q] * 3 + 2]);\n a = _.TransformCoordinates(k, u), r = _.TransformNormal(j, u), i = new vo(a, r, s, o), c.push(i);\n }\n l = new Ma(c, { subMeshId: M, meshId: _l, materialIndex: x[M].materialIndex }), l.plane && h.push(l);\n }\n const S = ss._FromPolygons(h);\n return S.matrix = t ? w.Identity() : u, S.position = t ? _.Zero() : f, S.rotation = t ? _.Zero() : d, S.scaling = t ? _.One() : g, S.rotationQuaternion = t && p ? Ce.Identity() : p, _l++, S;\n }\n /**\n * Construct a CSG solid from a list of `CSG.Polygon` instances.\n * @param polygons Polygons used to construct a CSG solid\n * @returns A new CSG solid\n */\n static _FromPolygons(e) {\n const t = new ss();\n return t._polygons = e, t;\n }\n /**\n * Clones, or makes a deep copy, of the CSG\n * @returns A new CSG\n */\n clone() {\n const e = new ss();\n return e._polygons = this._polygons.map((t) => t.clone()), e.copyTransformAttributes(this), e;\n }\n /**\n * Unions this CSG with another CSG\n * @param csg The CSG to union against this CSG\n * @returns The unioned CSG\n */\n union(e) {\n const t = new Ir(this.clone()._polygons), i = new Ir(e.clone()._polygons);\n return t.clipTo(i), i.clipTo(t), i.invert(), i.clipTo(t), i.invert(), t.build(i.allPolygons()), ss._FromPolygons(t.allPolygons()).copyTransformAttributes(this);\n }\n /**\n * Unions this CSG with another CSG in place\n * @param csg The CSG to union against this CSG\n */\n unionInPlace(e) {\n const t = new Ir(this._polygons), i = new Ir(e._polygons);\n t.clipTo(i), i.clipTo(t), i.invert(), i.clipTo(t), i.invert(), t.build(i.allPolygons()), this._polygons = t.allPolygons();\n }\n /**\n * Subtracts this CSG with another CSG\n * @param csg The CSG to subtract against this CSG\n * @returns A new CSG\n */\n subtract(e) {\n const t = new Ir(this.clone()._polygons), i = new Ir(e.clone()._polygons);\n return t.invert(), t.clipTo(i), i.clipTo(t), i.invert(), i.clipTo(t), i.invert(), t.build(i.allPolygons()), t.invert(), ss._FromPolygons(t.allPolygons()).copyTransformAttributes(this);\n }\n /**\n * Subtracts this CSG with another CSG in place\n * @param csg The CSG to subtract against this CSG\n */\n subtractInPlace(e) {\n const t = new Ir(this._polygons), i = new Ir(e._polygons);\n t.invert(), t.clipTo(i), i.clipTo(t), i.invert(), i.clipTo(t), i.invert(), t.build(i.allPolygons()), t.invert(), this._polygons = t.allPolygons();\n }\n /**\n * Intersect this CSG with another CSG\n * @param csg The CSG to intersect against this CSG\n * @returns A new CSG\n */\n intersect(e) {\n const t = new Ir(this.clone()._polygons), i = new Ir(e.clone()._polygons);\n return t.invert(), i.clipTo(t), i.invert(), t.clipTo(i), i.clipTo(t), t.build(i.allPolygons()), t.invert(), ss._FromPolygons(t.allPolygons()).copyTransformAttributes(this);\n }\n /**\n * Intersects this CSG with another CSG in place\n * @param csg The CSG to intersect against this CSG\n */\n intersectInPlace(e) {\n const t = new Ir(this._polygons), i = new Ir(e._polygons);\n t.invert(), i.clipTo(t), i.invert(), t.clipTo(i), i.clipTo(t), t.build(i.allPolygons()), t.invert(), this._polygons = t.allPolygons();\n }\n /**\n * Return a new CSG solid with solid and empty space switched. This solid is\n * not modified.\n * @returns A new CSG solid with solid and empty space switched\n */\n inverse() {\n const e = this.clone();\n return e.inverseInPlace(), e;\n }\n /**\n * Inverses the CSG in place\n */\n inverseInPlace() {\n this._polygons.map((e) => {\n e.flip();\n });\n }\n /**\n * This is used to keep meshes transformations so they can be restored\n * when we build back a Babylon Mesh\n * NB : All CSG operations are performed in world coordinates\n * @param csg The CSG to copy the transform attributes from\n * @returns This CSG\n */\n copyTransformAttributes(e) {\n return this.matrix = e.matrix, this.position = e.position, this.rotation = e.rotation, this.scaling = e.scaling, this.rotationQuaternion = e.rotationQuaternion, this;\n }\n /**\n * Build vertex data from CSG\n * Coordinates here are in world space\n * @param onBeforePolygonProcessing called before each polygon is being processed\n * @param onAfterPolygonProcessing called after each polygon has been processed\n * @returns the final vertex data\n */\n toVertexData(e = null, t = null) {\n const i = this.matrix.clone();\n i.invert();\n const r = this._polygons, s = [], a = [], o = [];\n let l = null, c = null;\n const h = _.Zero(), u = _.Zero(), f = me.Zero(), d = new et(0, 0, 0, 0), p = [0, 0, 0], g = {};\n let m;\n for (let E = 0, C = r.length; E < C; E++) {\n const T = r[E];\n e && e(T);\n for (let R = 2, x = T.vertices.length; R < x; R++) {\n p[0] = 0, p[1] = R - 1, p[2] = R;\n for (let S = 0; S < 3; S++) {\n h.copyFrom(T.vertices[p[S]].pos), u.copyFrom(T.vertices[p[S]].normal), T.vertices[p[S]].uv && (l || (l = []), f.copyFrom(T.vertices[p[S]].uv)), T.vertices[p[S]].vertColor && (c || (c = []), d.copyFrom(T.vertices[p[S]].vertColor));\n const M = _.TransformCoordinates(h, i), N = _.TransformNormal(u, i);\n m = g[M.x + \",\" + M.y + \",\" + M.z];\n let F = !1;\n l && !(l[m * 2] === f.x || l[m * 2 + 1] === f.y) && (F = !0);\n let L = !1;\n c && !(c[m * 4] === d.r || c[m * 4 + 1] === d.g || c[m * 4 + 2] === d.b || c[m * 4 + 3] === d.a) && (L = !0), (!(typeof m < \"u\" && o[m * 3] === N.x && o[m * 3 + 1] === N.y && o[m * 3 + 2] === N.z) || F || L) && (s.push(M.x, M.y, M.z), l && l.push(f.x, f.y), o.push(u.x, u.y, u.z), c && c.push(d.r, d.g, d.b, d.a), m = g[M.x + \",\" + M.y + \",\" + M.z] = s.length / 3 - 1), a.push(m), t && t();\n }\n }\n }\n const v = new re();\n return v.positions = s, v.normals = o, l && (v.uvs = l), c && (v.colors = c), v.indices = a, v;\n }\n /**\n * Build Raw mesh from CSG\n * Coordinates here are in world space\n * @param name The name of the mesh geometry\n * @param scene The Scene\n * @param keepSubMeshes Specifies if the submeshes should be kept\n * @returns A new Mesh\n */\n buildMeshGeometry(e, t, i) {\n const r = new B(e, t), s = this._polygons;\n let a = 0;\n const o = {};\n let l;\n if (i && s.sort((h, u) => h.shared.meshId === u.shared.meshId ? h.shared.subMeshId - u.shared.subMeshId : h.shared.meshId - u.shared.meshId), this.toVertexData((h) => {\n o[h.shared.meshId] || (o[h.shared.meshId] = {}), o[h.shared.meshId][h.shared.subMeshId] || (o[h.shared.meshId][h.shared.subMeshId] = {\n indexStart: 1 / 0,\n indexEnd: -1 / 0,\n materialIndex: h.shared.materialIndex\n }), l = o[h.shared.meshId][h.shared.subMeshId];\n }, () => {\n l.indexStart = Math.min(a, l.indexStart), l.indexEnd = Math.max(a, l.indexEnd), a++;\n }).applyToMesh(r), i) {\n let h = 0, u;\n r.subMeshes = [];\n for (const f in o) {\n u = -1;\n for (const d in o[f])\n l = o[f][d], bi.CreateFromIndices(l.materialIndex + h, l.indexStart, l.indexEnd - l.indexStart + 1, r), u = Math.max(l.materialIndex, u);\n h += ++u;\n }\n }\n return r;\n }\n /**\n * Build Mesh from CSG taking material and transforms into account\n * @param name The name of the Mesh\n * @param material The material of the Mesh\n * @param scene The Scene\n * @param keepSubMeshes Specifies if submeshes should be kept\n * @returns The new Mesh\n */\n toMesh(e, t = null, i, r) {\n const s = this.buildMeshGeometry(e, i, r);\n return s.material = t, s.position.copyFrom(this.position), s.rotation.copyFrom(this.rotation), this.rotationQuaternion && (s.rotationQuaternion = this.rotationQuaternion.clone()), s.scaling.copyFrom(this.scaling), s.computeWorldMatrix(!0), s;\n }\n}\nclass vr {\n /**\n * Creates a Size object from the given width and height (floats).\n * @param width width of the new size\n * @param height height of the new size\n */\n constructor(e, t) {\n this.width = e, this.height = t;\n }\n /**\n * Returns a string with the Size width and height\n * @returns a string with the Size width and height\n */\n toString() {\n return `{W: ${this.width}, H: ${this.height}}`;\n }\n /**\n * \"Size\"\n * @returns the string \"Size\"\n */\n getClassName() {\n return \"Size\";\n }\n /**\n * Returns the Size hash code.\n * @returns a hash code for a unique width and height\n */\n getHashCode() {\n let e = this.width | 0;\n return e = e * 397 ^ (this.height | 0), e;\n }\n /**\n * Updates the current size from the given one.\n * @param src the given size\n */\n copyFrom(e) {\n this.width = e.width, this.height = e.height;\n }\n /**\n * Updates in place the current Size from the given floats.\n * @param width width of the new size\n * @param height height of the new size\n * @returns the updated Size.\n */\n copyFromFloats(e, t) {\n return this.width = e, this.height = t, this;\n }\n /**\n * Updates in place the current Size from the given floats.\n * @param width width to set\n * @param height height to set\n * @returns the updated Size.\n */\n set(e, t) {\n return this.copyFromFloats(e, t);\n }\n /**\n * Multiplies the width and height by numbers\n * @param w factor to multiple the width by\n * @param h factor to multiple the height by\n * @returns a new Size set with the multiplication result of the current Size and the given floats.\n */\n multiplyByFloats(e, t) {\n return new vr(this.width * e, this.height * t);\n }\n /**\n * Clones the size\n * @returns a new Size copied from the given one.\n */\n clone() {\n return new vr(this.width, this.height);\n }\n /**\n * True if the current Size and the given one width and height are strictly equal.\n * @param other the other size to compare against\n * @returns True if the current Size and the given one width and height are strictly equal.\n */\n equals(e) {\n return e ? this.width === e.width && this.height === e.height : !1;\n }\n /**\n * The surface of the Size : width * height (float).\n */\n get surface() {\n return this.width * this.height;\n }\n /**\n * Create a new size of zero\n * @returns a new Size set to (0.0, 0.0)\n */\n static Zero() {\n return new vr(0, 0);\n }\n /**\n * Sums the width and height of two sizes\n * @param otherSize size to add to this size\n * @returns a new Size set as the addition result of the current Size and the given one.\n */\n add(e) {\n return new vr(this.width + e.width, this.height + e.height);\n }\n /**\n * Subtracts the width and height of two\n * @param otherSize size to subtract to this size\n * @returns a new Size set as the subtraction result of the given one from the current Size.\n */\n subtract(e) {\n return new vr(this.width - e.width, this.height - e.height);\n }\n /**\n * Scales the width and height\n * @param scale the scale to multiply the width and height by\n * @returns a new Size set with the multiplication result of the current Size and the given floats.\n */\n scale(e) {\n return new vr(this.width * e, this.height * e);\n }\n /**\n * Creates a new Size set at the linear interpolation \"amount\" between \"start\" and \"end\"\n * @param start starting size to lerp between\n * @param end end size to lerp between\n * @param amount amount to lerp between the start and end values\n * @returns a new Size set at the linear interpolation \"amount\" between \"start\" and \"end\"\n */\n static Lerp(e, t, i) {\n const r = e.width + (t.width - e.width) * i, s = e.height + (t.height - e.height) * i;\n return new vr(r, s);\n }\n}\nclass df {\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapU() {\n return this._wrapU;\n }\n set wrapU(e) {\n this._wrapU = e;\n }\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapV() {\n return this._wrapV;\n }\n set wrapV(e) {\n this._wrapV = e;\n }\n /**\n * How a texture is mapped.\n * Unused in thin texture mode.\n */\n get coordinatesMode() {\n return 0;\n }\n /**\n * Define if the texture is a cube texture or if false a 2d texture.\n */\n get isCube() {\n return this._texture ? this._texture.isCube : !1;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n set isCube(e) {\n this._texture && (this._texture.isCube = e);\n }\n /**\n * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture.\n */\n get is3D() {\n return this._texture ? this._texture.is3D : !1;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n set is3D(e) {\n this._texture && (this._texture.is3D = e);\n }\n /**\n * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture.\n */\n get is2DArray() {\n return this._texture ? this._texture.is2DArray : !1;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n set is2DArray(e) {\n this._texture && (this._texture.is2DArray = e);\n }\n /**\n * Get the class name of the texture.\n * @returns \"ThinTexture\"\n */\n getClassName() {\n return \"ThinTexture\";\n }\n static _IsRenderTargetWrapper(e) {\n return (e == null ? void 0 : e._shareDepth) !== void 0;\n }\n /**\n * Instantiates a new ThinTexture.\n * Base class of all the textures in babylon.\n * This can be used as an internal texture wrapper in ThinEngine to benefit from the cache\n * @param internalTexture Define the internalTexture to wrap. You can also pass a RenderTargetWrapper, in which case the texture will be the render target's texture\n */\n constructor(e) {\n this._wrapU = 1, this._wrapV = 1, this.wrapR = 1, this.anisotropicFilteringLevel = 4, this.delayLoadState = 0, this._texture = null, this._engine = null, this._cachedSize = vr.Zero(), this._cachedBaseSize = vr.Zero(), this._initialSamplingMode = 2, this._texture = df._IsRenderTargetWrapper(e) ? e.texture : e, this._texture && (this._engine = this._texture.getEngine());\n }\n /**\n * Get if the texture is ready to be used (downloaded, converted, mip mapped...).\n * @returns true if fully ready\n */\n isReady() {\n return this.delayLoadState === 4 ? (this.delayLoad(), !1) : this._texture ? this._texture.isReady : !1;\n }\n /**\n * Triggers the load sequence in delayed load mode.\n */\n delayLoad() {\n }\n /**\n * Get the underlying lower level texture from Babylon.\n * @returns the internal texture\n */\n getInternalTexture() {\n return this._texture;\n }\n /**\n * Get the size of the texture.\n * @returns the texture size.\n */\n getSize() {\n if (this._texture) {\n if (this._texture.width)\n return this._cachedSize.width = this._texture.width, this._cachedSize.height = this._texture.height, this._cachedSize;\n if (this._texture._size)\n return this._cachedSize.width = this._texture._size, this._cachedSize.height = this._texture._size, this._cachedSize;\n }\n return this._cachedSize;\n }\n /**\n * Get the base size of the texture.\n * It can be different from the size if the texture has been resized for POT for instance\n * @returns the base size\n */\n getBaseSize() {\n return !this.isReady() || !this._texture ? (this._cachedBaseSize.width = 0, this._cachedBaseSize.height = 0, this._cachedBaseSize) : this._texture._size ? (this._cachedBaseSize.width = this._texture._size, this._cachedBaseSize.height = this._texture._size, this._cachedBaseSize) : (this._cachedBaseSize.width = this._texture.baseWidth, this._cachedBaseSize.height = this._texture.baseHeight, this._cachedBaseSize);\n }\n /**\n * Get the current sampling mode associated with the texture.\n */\n get samplingMode() {\n return this._texture ? this._texture.samplingMode : this._initialSamplingMode;\n }\n /**\n * Update the sampling mode of the texture.\n * Default is Trilinear mode.\n *\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 1 | NEAREST_SAMPLINGMODE or NEAREST_NEAREST_MIPLINEAR | Nearest is: mag = nearest, min = nearest, mip = linear |\n * | 2 | BILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPNEAREST | Bilinear is: mag = linear, min = linear, mip = nearest |\n * | 3 | TRILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPLINEAR | Trilinear is: mag = linear, min = linear, mip = linear |\n * | 4 | NEAREST_NEAREST_MIPNEAREST | |\n * | 5 | NEAREST_LINEAR_MIPNEAREST | |\n * | 6 | NEAREST_LINEAR_MIPLINEAR | |\n * | 7 | NEAREST_LINEAR | |\n * | 8 | NEAREST_NEAREST | |\n * | 9 | LINEAR_NEAREST_MIPNEAREST | |\n * | 10 | LINEAR_NEAREST_MIPLINEAR | |\n * | 11 | LINEAR_LINEAR | |\n * | 12 | LINEAR_NEAREST | |\n *\n * > _mag_: magnification filter (close to the viewer)\n * > _min_: minification filter (far from the viewer)\n * > _mip_: filter used between mip map levels\n *@param samplingMode Define the new sampling mode of the texture\n */\n updateSamplingMode(e) {\n this._texture && this._engine && this._engine.updateTextureSamplingMode(e, this._texture);\n }\n /**\n * Release and destroy the underlying lower level texture aka internalTexture.\n */\n releaseInternalTexture() {\n this._texture && (this._texture.dispose(), this._texture = null);\n }\n /**\n * Dispose the texture and release its associated resources.\n */\n dispose() {\n this._texture && (this.releaseInternalTexture(), this._engine = null);\n }\n}\nclass It extends df {\n /**\n * Define if the texture is having a usable alpha value (can be use for transparency or glossiness for instance).\n */\n set hasAlpha(e) {\n this._hasAlpha !== e && (this._hasAlpha = e, this._scene && this._scene.markAllMaterialsAsDirty(1, (t) => t.hasTexture(this)));\n }\n get hasAlpha() {\n return this._hasAlpha;\n }\n /**\n * Defines if the alpha value should be determined via the rgb values.\n * If true the luminance of the pixel might be used to find the corresponding alpha value.\n */\n set getAlphaFromRGB(e) {\n this._getAlphaFromRGB !== e && (this._getAlphaFromRGB = e, this._scene && this._scene.markAllMaterialsAsDirty(1, (t) => t.hasTexture(this)));\n }\n get getAlphaFromRGB() {\n return this._getAlphaFromRGB;\n }\n /**\n * Define the UV channel to use starting from 0 and defaulting to 0.\n * This is part of the texture as textures usually maps to one uv set.\n */\n set coordinatesIndex(e) {\n this._coordinatesIndex !== e && (this._coordinatesIndex = e, this._scene && this._scene.markAllMaterialsAsDirty(1, (t) => t.hasTexture(this)));\n }\n get coordinatesIndex() {\n return this._coordinatesIndex;\n }\n /**\n * How a texture is mapped.\n *\n * | Value | Type | Description |\n * | ----- | ----------------------------------- | ----------- |\n * | 0 | EXPLICIT_MODE | |\n * | 1 | SPHERICAL_MODE | |\n * | 2 | PLANAR_MODE | |\n * | 3 | CUBIC_MODE | |\n * | 4 | PROJECTION_MODE | |\n * | 5 | SKYBOX_MODE | |\n * | 6 | INVCUBIC_MODE | |\n * | 7 | EQUIRECTANGULAR_MODE | |\n * | 8 | FIXED_EQUIRECTANGULAR_MODE | |\n * | 9 | FIXED_EQUIRECTANGULAR_MIRRORED_MODE | |\n */\n set coordinatesMode(e) {\n this._coordinatesMode !== e && (this._coordinatesMode = e, this._scene && this._scene.markAllMaterialsAsDirty(1, (t) => t.hasTexture(this)));\n }\n get coordinatesMode() {\n return this._coordinatesMode;\n }\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapU() {\n return this._wrapU;\n }\n set wrapU(e) {\n this._wrapU = e;\n }\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapV() {\n return this._wrapV;\n }\n set wrapV(e) {\n this._wrapV = e;\n }\n /**\n * Define if the texture is a cube texture or if false a 2d texture.\n */\n get isCube() {\n return this._texture ? this._texture.isCube : this._isCube;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n set isCube(e) {\n this._texture ? this._texture.isCube = e : this._isCube = e;\n }\n /**\n * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture.\n */\n get is3D() {\n return this._texture ? this._texture.is3D : !1;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n set is3D(e) {\n this._texture && (this._texture.is3D = e);\n }\n /**\n * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture.\n */\n get is2DArray() {\n return this._texture ? this._texture.is2DArray : !1;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n set is2DArray(e) {\n this._texture && (this._texture.is2DArray = e);\n }\n /**\n * Define if the texture contains data in gamma space (most of the png/jpg aside bump).\n * HDR texture are usually stored in linear space.\n * This only impacts the PBR and Background materials\n */\n get gammaSpace() {\n if (this._texture)\n this._texture._gammaSpace === null && (this._texture._gammaSpace = this._gammaSpace);\n else\n return this._gammaSpace;\n return this._texture._gammaSpace && !this._texture._useSRGBBuffer;\n }\n set gammaSpace(e) {\n var t;\n if (this._texture) {\n if (this._texture._gammaSpace === e)\n return;\n this._texture._gammaSpace = e;\n } else {\n if (this._gammaSpace === e)\n return;\n this._gammaSpace = e;\n }\n (t = this.getScene()) == null || t.markAllMaterialsAsDirty(1, (i) => i.hasTexture(this));\n }\n /**\n * Gets or sets whether or not the texture contains RGBD data.\n */\n get isRGBD() {\n return this._texture != null && this._texture._isRGBD;\n }\n set isRGBD(e) {\n var t;\n e !== this.isRGBD && (this._texture && (this._texture._isRGBD = e), (t = this.getScene()) == null || t.markAllMaterialsAsDirty(1, (i) => i.hasTexture(this)));\n }\n /**\n * Are mip maps generated for this texture or not.\n */\n get noMipmap() {\n return !1;\n }\n /**\n * With prefiltered texture, defined the offset used during the prefiltering steps.\n */\n get lodGenerationOffset() {\n return this._texture ? this._texture._lodGenerationOffset : 0;\n }\n set lodGenerationOffset(e) {\n this._texture && (this._texture._lodGenerationOffset = e);\n }\n /**\n * With prefiltered texture, defined the scale used during the prefiltering steps.\n */\n get lodGenerationScale() {\n return this._texture ? this._texture._lodGenerationScale : 0;\n }\n set lodGenerationScale(e) {\n this._texture && (this._texture._lodGenerationScale = e);\n }\n /**\n * With prefiltered texture, defined if the specular generation is based on a linear ramp.\n * By default we are using a log2 of the linear roughness helping to keep a better resolution for\n * average roughness values.\n */\n get linearSpecularLOD() {\n return this._texture ? this._texture._linearSpecularLOD : !1;\n }\n set linearSpecularLOD(e) {\n this._texture && (this._texture._linearSpecularLOD = e);\n }\n /**\n * In case a better definition than spherical harmonics is required for the diffuse part of the environment.\n * You can set the irradiance texture to rely on a texture instead of the spherical approach.\n * This texture need to have the same characteristics than its parent (Cube vs 2d, coordinates mode, Gamma/Linear, RGBD).\n */\n get irradianceTexture() {\n return this._texture ? this._texture._irradianceTexture : null;\n }\n set irradianceTexture(e) {\n this._texture && (this._texture._irradianceTexture = e);\n }\n /**\n * Define the unique id of the texture in the scene.\n */\n get uid() {\n return this._uid || (this._uid = tf()), this._uid;\n }\n /**\n * Return a string representation of the texture.\n * @returns the texture as a string\n */\n toString() {\n return this.name;\n }\n /**\n * Get the class name of the texture.\n * @returns \"BaseTexture\"\n */\n getClassName() {\n return \"BaseTexture\";\n }\n /**\n * Callback triggered when the texture has been disposed.\n * Kept for back compatibility, you can use the onDisposeObservable instead.\n */\n set onDispose(e) {\n this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e);\n }\n /**\n * Define if the texture is preventing a material to render or not.\n * If not and the texture is not ready, the engine will use a default black texture instead.\n */\n get isBlocking() {\n return !0;\n }\n /**\n * Was there any loading error?\n */\n get loadingError() {\n return this._loadingError;\n }\n /**\n * If a loading error occurred this object will be populated with information about the error.\n */\n get errorObject() {\n return this._errorObject;\n }\n /**\n * Instantiates a new BaseTexture.\n * Base class of all the textures in babylon.\n * It groups all the common properties the materials, post process, lights... might need\n * in order to make a correct use of the texture.\n * @param sceneOrEngine Define the scene or engine the texture belongs to\n * @param internalTexture Define the internal texture associated with the texture\n */\n constructor(e, t = null) {\n super(null), this.metadata = null, this.reservedDataStore = null, this._hasAlpha = !1, this._getAlphaFromRGB = !1, this.level = 1, this._coordinatesIndex = 0, this.optimizeUVAllocation = !0, this._coordinatesMode = 0, this.wrapR = 1, this.anisotropicFilteringLevel = It.DEFAULT_ANISOTROPIC_FILTERING_LEVEL, this._isCube = !1, this._gammaSpace = !0, this.invertZ = !1, this.lodLevelInAlpha = !1, this.isRenderTarget = !1, this._prefiltered = !1, this._forceSerialize = !1, this.animations = [], this.onDisposeObservable = new he(), this._onDisposeObserver = null, this._scene = null, this._uid = null, this._parentContainer = null, this._loadingError = !1, e ? It._IsScene(e) ? this._scene = e : this._engine = e : this._scene = st.LastCreatedScene, this._scene && (this.uniqueId = this._scene.getUniqueId(), this._scene.addTexture(this), this._engine = this._scene.getEngine()), this._texture = t, this._uid = null;\n }\n /**\n * Get the scene the texture belongs to.\n * @returns the scene or null if undefined\n */\n getScene() {\n return this._scene;\n }\n /** @internal */\n _getEngine() {\n return this._engine;\n }\n /**\n * Checks if the texture has the same transform matrix than another texture\n * @param texture texture to check against\n * @returns true if the transforms are the same, else false\n */\n checkTransformsAreIdentical(e) {\n return e !== null;\n }\n /**\n * Get the texture transform matrix used to offset tile the texture for instance.\n * @returns the transformation matrix\n */\n getTextureMatrix() {\n return w.IdentityReadOnly;\n }\n /**\n * Get the texture reflection matrix used to rotate/transform the reflection.\n * @returns the reflection matrix\n */\n getReflectionTextureMatrix() {\n return w.IdentityReadOnly;\n }\n /**\n * Gets a suitable rotate/transform matrix when the texture is used for refraction.\n * There's a separate function from getReflectionTextureMatrix because refraction requires a special configuration of the matrix in right-handed mode.\n * @returns The refraction matrix\n */\n getRefractionTextureMatrix() {\n return this.getReflectionTextureMatrix();\n }\n /**\n * Get if the texture is ready to be consumed (either it is ready or it is not blocking)\n * @returns true if ready, not blocking or if there was an error loading the texture\n */\n isReadyOrNotBlocking() {\n return !this.isBlocking || this.isReady() || this.loadingError;\n }\n /**\n * Scales the texture if is `canRescale()`\n * @param ratio the resize factor we want to use to rescale\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n scale(e) {\n }\n /**\n * Get if the texture can rescale.\n */\n get canRescale() {\n return !1;\n }\n /**\n * @internal\n */\n _getFromCache(e, t, i, r, s, a) {\n const o = this._getEngine();\n if (!o)\n return null;\n const l = o._getUseSRGBBuffer(!!s, t), c = o.getLoadedTexturesCache();\n for (let h = 0; h < c.length; h++) {\n const u = c[h];\n if ((s === void 0 || l === u._useSRGBBuffer) && (r === void 0 || r === u.invertY) && u.url === e && u.generateMipMaps === !t && (!i || i === u.samplingMode) && (a === void 0 || a === u.isCube))\n return u.incrementReferences(), u;\n }\n return null;\n }\n /** @internal */\n _rebuild(e = !1) {\n }\n /**\n * Clones the texture.\n * @returns the cloned texture\n */\n clone() {\n return null;\n }\n /**\n * Get the texture underlying type (INT, FLOAT...)\n */\n get textureType() {\n return this._texture && this._texture.type !== void 0 ? this._texture.type : 0;\n }\n /**\n * Get the texture underlying format (RGB, RGBA...)\n */\n get textureFormat() {\n return this._texture && this._texture.format !== void 0 ? this._texture.format : 5;\n }\n /**\n * Indicates that textures need to be re-calculated for all materials\n */\n _markAllSubMeshesAsTexturesDirty() {\n const e = this.getScene();\n e && e.markAllMaterialsAsDirty(1);\n }\n /**\n * Reads the pixels stored in the webgl texture and returns them as an ArrayBuffer.\n * This will returns an RGBA array buffer containing either in values (0-255) or\n * float values (0-1) depending of the underlying buffer type.\n * @param faceIndex defines the face of the texture to read (in case of cube texture)\n * @param level defines the LOD level of the texture to read (in case of Mip Maps)\n * @param buffer defines a user defined buffer to fill with data (can be null)\n * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels\n * @param noDataConversion false to convert the data to Uint8Array (if texture type is UNSIGNED_BYTE) or to Float32Array (if texture type is anything but UNSIGNED_BYTE). If true, the type of the generated buffer (if buffer==null) will depend on the type of the texture\n * @param x defines the region x coordinates to start reading from (default to 0)\n * @param y defines the region y coordinates to start reading from (default to 0)\n * @param width defines the region width to read from (default to the texture size at level)\n * @param height defines the region width to read from (default to the texture size at level)\n * @returns The Array buffer promise containing the pixels data.\n */\n readPixels(e = 0, t = 0, i = null, r = !0, s = !1, a = 0, o = 0, l = Number.MAX_VALUE, c = Number.MAX_VALUE) {\n if (!this._texture)\n return null;\n const h = this._getEngine();\n if (!h)\n return null;\n const u = this.getSize();\n let f = u.width, d = u.height;\n t !== 0 && (f = f / Math.pow(2, t), d = d / Math.pow(2, t), f = Math.round(f), d = Math.round(d)), l = Math.min(f, l), c = Math.min(d, c);\n try {\n return this._texture.isCube ? h._readTexturePixels(this._texture, l, c, e, t, i, r, s, a, o) : h._readTexturePixels(this._texture, l, c, -1, t, i, r, s, a, o);\n } catch {\n return null;\n }\n }\n /**\n * @internal\n */\n _readPixelsSync(e = 0, t = 0, i = null, r = !0, s = !1) {\n if (!this._texture)\n return null;\n const a = this.getSize();\n let o = a.width, l = a.height;\n const c = this._getEngine();\n if (!c)\n return null;\n t != 0 && (o = o / Math.pow(2, t), l = l / Math.pow(2, t), o = Math.round(o), l = Math.round(l));\n try {\n return this._texture.isCube ? c._readTexturePixelsSync(this._texture, o, l, e, t, i, r, s) : c._readTexturePixelsSync(this._texture, o, l, -1, t, i, r, s);\n } catch {\n return null;\n }\n }\n /** @internal */\n get _lodTextureHigh() {\n return this._texture ? this._texture._lodTextureHigh : null;\n }\n /** @internal */\n get _lodTextureMid() {\n return this._texture ? this._texture._lodTextureMid : null;\n }\n /** @internal */\n get _lodTextureLow() {\n return this._texture ? this._texture._lodTextureLow : null;\n }\n /**\n * Dispose the texture and release its associated resources.\n */\n dispose() {\n if (this._scene) {\n this._scene.stopAnimation && this._scene.stopAnimation(this), this._scene.removePendingData(this);\n const e = this._scene.textures.indexOf(this);\n if (e >= 0 && this._scene.textures.splice(e, 1), this._scene.onTextureRemovedObservable.notifyObservers(this), this._scene = null, this._parentContainer) {\n const t = this._parentContainer.textures.indexOf(this);\n t > -1 && this._parentContainer.textures.splice(t, 1), this._parentContainer = null;\n }\n }\n this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear(), this.metadata = null, super.dispose();\n }\n /**\n * Serialize the texture into a JSON representation that can be parsed later on.\n * @param allowEmptyName True to force serialization even if name is empty. Default: false\n * @returns the JSON representation of the texture\n */\n serialize(e = !1) {\n if (!this.name && !e)\n return null;\n const t = Le.Serialize(this);\n return Le.AppendSerializedAnimations(this, t), t;\n }\n /**\n * Helper function to be called back once a list of texture contains only ready textures.\n * @param textures Define the list of textures to wait for\n * @param callback Define the callback triggered once the entire list will be ready\n */\n static WhenAllReady(e, t) {\n let i = e.length;\n if (i === 0) {\n t();\n return;\n }\n for (let r = 0; r < e.length; r++) {\n const s = e[r];\n if (s.isReady())\n --i === 0 && t();\n else {\n const a = s.onLoadObservable;\n a ? a.addOnce(() => {\n --i === 0 && t();\n }) : --i === 0 && t();\n }\n }\n }\n static _IsScene(e) {\n return e.getClassName() === \"Scene\";\n }\n}\nIt.DEFAULT_ANISOTROPIC_FILTERING_LEVEL = 4;\nP([\n U()\n], It.prototype, \"uniqueId\", void 0);\nP([\n U()\n], It.prototype, \"name\", void 0);\nP([\n U()\n], It.prototype, \"metadata\", void 0);\nP([\n U(\"hasAlpha\")\n], It.prototype, \"_hasAlpha\", void 0);\nP([\n U(\"getAlphaFromRGB\")\n], It.prototype, \"_getAlphaFromRGB\", void 0);\nP([\n U()\n], It.prototype, \"level\", void 0);\nP([\n U(\"coordinatesIndex\")\n], It.prototype, \"_coordinatesIndex\", void 0);\nP([\n U()\n], It.prototype, \"optimizeUVAllocation\", void 0);\nP([\n U(\"coordinatesMode\")\n], It.prototype, \"_coordinatesMode\", void 0);\nP([\n U()\n], It.prototype, \"wrapU\", null);\nP([\n U()\n], It.prototype, \"wrapV\", null);\nP([\n U()\n], It.prototype, \"wrapR\", void 0);\nP([\n U()\n], It.prototype, \"anisotropicFilteringLevel\", void 0);\nP([\n U()\n], It.prototype, \"isCube\", null);\nP([\n U()\n], It.prototype, \"is3D\", null);\nP([\n U()\n], It.prototype, \"is2DArray\", null);\nP([\n U()\n], It.prototype, \"gammaSpace\", null);\nP([\n U()\n], It.prototype, \"invertZ\", void 0);\nP([\n U()\n], It.prototype, \"lodLevelInAlpha\", void 0);\nP([\n U()\n], It.prototype, \"lodGenerationOffset\", null);\nP([\n U()\n], It.prototype, \"lodGenerationScale\", null);\nP([\n U()\n], It.prototype, \"linearSpecularLOD\", null);\nP([\n Tt()\n], It.prototype, \"irradianceTexture\", null);\nP([\n U()\n], It.prototype, \"isRenderTarget\", void 0);\nfunction l0(n, e, t = !1) {\n const i = e.width, r = e.height;\n if (n instanceof Float32Array) {\n let c = n.byteLength / n.BYTES_PER_ELEMENT;\n const h = new Uint8Array(c);\n for (; --c >= 0; ) {\n let u = n[c];\n u < 0 ? u = 0 : u > 1 && (u = 1), h[c] = u * 255;\n }\n n = h;\n }\n const s = document.createElement(\"canvas\");\n s.width = i, s.height = r;\n const a = s.getContext(\"2d\");\n if (!a)\n return null;\n const o = a.createImageData(i, r);\n if (o.data.set(n), a.putImageData(o, 0, 0), t) {\n const c = document.createElement(\"canvas\");\n c.width = i, c.height = r;\n const h = c.getContext(\"2d\");\n return h ? (h.translate(0, r), h.scale(1, -1), h.drawImage(s, 0, 0), c.toDataURL(\"image/png\")) : null;\n }\n return s.toDataURL(\"image/png\");\n}\nfunction cI(n, e = 0, t = 0) {\n const i = n.getInternalTexture();\n if (!i)\n return null;\n const r = n._readPixelsSync(e, t);\n return r ? l0(r, n.getSize(), i.invertY) : null;\n}\nasync function hI(n, e = 0, t = 0) {\n const i = n.getInternalTexture();\n if (!i)\n return null;\n const r = await n.readPixels(e, t);\n return r ? l0(r, n.getSize(), i.invertY) : null;\n}\nclass le extends It {\n /**\n * @internal\n */\n static _CreateVideoTexture(e, t, i, r = !1, s = !1, a = le.TRILINEAR_SAMPLINGMODE, o = {}, l, c = 5) {\n throw We(\"VideoTexture\");\n }\n /**\n * Are mip maps generated for this texture or not.\n */\n get noMipmap() {\n return this._noMipmap;\n }\n /** Returns the texture mime type if it was defined by a loader (undefined else) */\n get mimeType() {\n return this._mimeType;\n }\n /**\n * Is the texture preventing material to render while loading.\n * If false, a default texture will be used instead of the loading one during the preparation step.\n */\n set isBlocking(e) {\n this._isBlocking = e;\n }\n get isBlocking() {\n return this._isBlocking;\n }\n /**\n * Gets a boolean indicating if the texture needs to be inverted on the y axis during loading\n */\n get invertY() {\n return this._invertY;\n }\n /**\n * Instantiates a new texture.\n * This represents a texture in babylon. It can be easily loaded from a network, base64 or html input.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#texture\n * @param url defines the url of the picture to load as a texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture\n * @param invertY defines if the texture needs to be inverted on the y axis during loading\n * @param samplingMode defines the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)\n * @param onLoad defines a callback triggered when the texture has been loaded\n * @param onError defines a callback triggered when an error occurred during the loading session\n * @param buffer defines the buffer to load the texture from in case the texture is loaded from a buffer representation\n * @param deleteBuffer defines if the buffer we are loading the texture from should be deleted after load\n * @param format defines the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)\n * @param mimeType defines an optional mime type information\n * @param loaderOptions options to be passed to the loader\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param forcedExtension defines the extension to use to pick the right loader\n */\n constructor(e, t, i, r, s = le.TRILINEAR_SAMPLINGMODE, a = null, o = null, l = null, c = !1, h, u, f, d, p) {\n super(t), this.url = null, this.uOffset = 0, this.vOffset = 0, this.uScale = 1, this.vScale = 1, this.uAng = 0, this.vAng = 0, this.wAng = 0, this.uRotationCenter = 0.5, this.vRotationCenter = 0.5, this.wRotationCenter = 0.5, this.homogeneousRotationInUVTransform = !1, this.inspectableCustomProperties = null, this._noMipmap = !1, this._invertY = !1, this._rowGenerationMatrix = null, this._cachedTextureMatrix = null, this._projectionModeMatrix = null, this._t0 = null, this._t1 = null, this._t2 = null, this._cachedUOffset = -1, this._cachedVOffset = -1, this._cachedUScale = 0, this._cachedVScale = 0, this._cachedUAng = -1, this._cachedVAng = -1, this._cachedWAng = -1, this._cachedReflectionProjectionMatrixId = -1, this._cachedURotationCenter = -1, this._cachedVRotationCenter = -1, this._cachedWRotationCenter = -1, this._cachedHomogeneousRotationInUVTransform = !1, this._cachedIdentity3x2 = !0, this._cachedReflectionTextureMatrix = null, this._cachedReflectionUOffset = -1, this._cachedReflectionVOffset = -1, this._cachedReflectionUScale = 0, this._cachedReflectionVScale = 0, this._cachedReflectionCoordinatesMode = -1, this._buffer = null, this._deleteBuffer = !1, this._format = null, this._delayedOnLoad = null, this._delayedOnError = null, this.onLoadObservable = new he(), this._isBlocking = !0, this.name = e || \"\", this.url = e;\n let g, m = !1, v = null, E = !0;\n typeof i == \"object\" && i !== null ? (g = i.noMipmap ?? !1, r = i.invertY ?? !nt.UseOpenGLOrientationForUV, s = i.samplingMode ?? le.TRILINEAR_SAMPLINGMODE, a = i.onLoad ?? null, o = i.onError ?? null, l = i.buffer ?? null, c = i.deleteBuffer ?? !1, h = i.format, u = i.mimeType, f = i.loaderOptions, d = i.creationFlags, m = i.useSRGBBuffer ?? !1, v = i.internalTexture ?? null, E = i.gammaSpace ?? E) : g = !!i, this._gammaSpace = E, this._noMipmap = g, this._invertY = r === void 0 ? !nt.UseOpenGLOrientationForUV : r, this._initialSamplingMode = s, this._buffer = l, this._deleteBuffer = c, this._mimeType = u, this._loaderOptions = f, this._creationFlags = d, this._useSRGBBuffer = m, this._forcedExtension = p, h && (this._format = h);\n const C = this.getScene(), T = this._getEngine();\n if (!T)\n return;\n T.onBeforeTextureInitObservable.notifyObservers(this);\n const R = () => {\n this._texture && (this._texture._invertVScale && (this.vScale *= -1, this.vOffset += 1), this._texture._cachedWrapU !== null && (this.wrapU = this._texture._cachedWrapU, this._texture._cachedWrapU = null), this._texture._cachedWrapV !== null && (this.wrapV = this._texture._cachedWrapV, this._texture._cachedWrapV = null), this._texture._cachedWrapR !== null && (this.wrapR = this._texture._cachedWrapR, this._texture._cachedWrapR = null)), this.onLoadObservable.hasObservers() && this.onLoadObservable.notifyObservers(this), a && a(), !this.isBlocking && C && C.resetCachedMaterial();\n }, x = (S, M) => {\n this._loadingError = !0, this._errorObject = { message: S, exception: M }, o && o(S, M), le.OnTextureLoadErrorObservable.notifyObservers(this);\n };\n if (!this.url && !v) {\n this._delayedOnLoad = R, this._delayedOnError = x;\n return;\n }\n if (this._texture = v ?? this._getFromCache(this.url, g, s, this._invertY, m, this.isCube), this._texture)\n if (this._texture.isReady)\n Jl.SetImmediate(() => R());\n else {\n const S = this._texture.onLoadedObservable.add(R);\n this._texture.onErrorObservable.add((M) => {\n var N;\n x(M.message, M.exception), (N = this._texture) == null || N.onLoadedObservable.remove(S);\n });\n }\n else if (!C || !C.useDelayedTextureLoading) {\n try {\n this._texture = T.createTexture(this.url, g, this._invertY, C, s, R, x, this._buffer, void 0, this._format, this._forcedExtension, u, f, d, m);\n } catch (S) {\n throw x(\"error loading\", S), S;\n }\n c && (this._buffer = null);\n } else\n this.delayLoadState = 4, this._delayedOnLoad = R, this._delayedOnError = x;\n }\n /**\n * Update the url (and optional buffer) of this texture if url was null during construction.\n * @param url the url of the texture\n * @param buffer the buffer of the texture (defaults to null)\n * @param onLoad callback called when the texture is loaded (defaults to null)\n * @param forcedExtension defines the extension to use to pick the right loader\n */\n updateURL(e, t = null, i, r) {\n this.url && (this.releaseInternalTexture(), this.getScene().markAllMaterialsAsDirty(1, (s) => s.hasTexture(this))), (!this.name || this.name.startsWith(\"data:\")) && (this.name = e), this.url = e, this._buffer = t, this._forcedExtension = r, this.delayLoadState = 4, i && (this._delayedOnLoad = i), this.delayLoad();\n }\n /**\n * Finish the loading sequence of a texture flagged as delayed load.\n * @internal\n */\n delayLoad() {\n if (this.delayLoadState !== 4)\n return;\n const e = this.getScene();\n e && (this.delayLoadState = 1, this._texture = this._getFromCache(this.url, this._noMipmap, this.samplingMode, this._invertY, this._useSRGBBuffer, this.isCube), this._texture ? this._delayedOnLoad && (this._texture.isReady ? Jl.SetImmediate(this._delayedOnLoad) : this._texture.onLoadedObservable.add(this._delayedOnLoad)) : (this._texture = e.getEngine().createTexture(this.url, this._noMipmap, this._invertY, e, this.samplingMode, this._delayedOnLoad, this._delayedOnError, this._buffer, null, this._format, this._forcedExtension, this._mimeType, this._loaderOptions, this._creationFlags, this._useSRGBBuffer), this._deleteBuffer && (this._buffer = null)), this._delayedOnLoad = null, this._delayedOnError = null);\n }\n _prepareRowForTextureGeneration(e, t, i, r) {\n e *= this._cachedUScale, t *= this._cachedVScale, e -= this.uRotationCenter * this._cachedUScale, t -= this.vRotationCenter * this._cachedVScale, i -= this.wRotationCenter, _.TransformCoordinatesFromFloatsToRef(e, t, i, this._rowGenerationMatrix, r), r.x += this.uRotationCenter * this._cachedUScale + this._cachedUOffset, r.y += this.vRotationCenter * this._cachedVScale + this._cachedVOffset, r.z += this.wRotationCenter;\n }\n /**\n * Checks if the texture has the same transform matrix than another texture\n * @param texture texture to check against\n * @returns true if the transforms are the same, else false\n */\n checkTransformsAreIdentical(e) {\n return e !== null && this.uOffset === e.uOffset && this.vOffset === e.vOffset && this.uScale === e.uScale && this.vScale === e.vScale && this.uAng === e.uAng && this.vAng === e.vAng && this.wAng === e.wAng;\n }\n /**\n * Get the current texture matrix which includes the requested offsetting, tiling and rotation components.\n * @param uBase The horizontal base offset multiplier (1 by default)\n * @returns the transform matrix of the texture.\n */\n getTextureMatrix(e = 1) {\n if (this.uOffset === this._cachedUOffset && this.vOffset === this._cachedVOffset && this.uScale * e === this._cachedUScale && this.vScale === this._cachedVScale && this.uAng === this._cachedUAng && this.vAng === this._cachedVAng && this.wAng === this._cachedWAng && this.uRotationCenter === this._cachedURotationCenter && this.vRotationCenter === this._cachedVRotationCenter && this.wRotationCenter === this._cachedWRotationCenter && this.homogeneousRotationInUVTransform === this._cachedHomogeneousRotationInUVTransform)\n return this._cachedTextureMatrix;\n this._cachedUOffset = this.uOffset, this._cachedVOffset = this.vOffset, this._cachedUScale = this.uScale * e, this._cachedVScale = this.vScale, this._cachedUAng = this.uAng, this._cachedVAng = this.vAng, this._cachedWAng = this.wAng, this._cachedURotationCenter = this.uRotationCenter, this._cachedVRotationCenter = this.vRotationCenter, this._cachedWRotationCenter = this.wRotationCenter, this._cachedHomogeneousRotationInUVTransform = this.homogeneousRotationInUVTransform, (!this._cachedTextureMatrix || !this._rowGenerationMatrix) && (this._cachedTextureMatrix = w.Zero(), this._rowGenerationMatrix = new w(), this._t0 = _.Zero(), this._t1 = _.Zero(), this._t2 = _.Zero()), w.RotationYawPitchRollToRef(this.vAng, this.uAng, this.wAng, this._rowGenerationMatrix), this.homogeneousRotationInUVTransform ? (w.TranslationToRef(-this._cachedURotationCenter, -this._cachedVRotationCenter, -this._cachedWRotationCenter, z.Matrix[0]), w.TranslationToRef(this._cachedURotationCenter, this._cachedVRotationCenter, this._cachedWRotationCenter, z.Matrix[1]), w.ScalingToRef(this._cachedUScale, this._cachedVScale, 0, z.Matrix[2]), w.TranslationToRef(this._cachedUOffset, this._cachedVOffset, 0, z.Matrix[3]), z.Matrix[0].multiplyToRef(this._rowGenerationMatrix, this._cachedTextureMatrix), this._cachedTextureMatrix.multiplyToRef(z.Matrix[1], this._cachedTextureMatrix), this._cachedTextureMatrix.multiplyToRef(z.Matrix[2], this._cachedTextureMatrix), this._cachedTextureMatrix.multiplyToRef(z.Matrix[3], this._cachedTextureMatrix), this._cachedTextureMatrix.setRowFromFloats(2, this._cachedTextureMatrix.m[12], this._cachedTextureMatrix.m[13], this._cachedTextureMatrix.m[14], 1)) : (this._prepareRowForTextureGeneration(0, 0, 0, this._t0), this._prepareRowForTextureGeneration(1, 0, 0, this._t1), this._prepareRowForTextureGeneration(0, 1, 0, this._t2), this._t1.subtractInPlace(this._t0), this._t2.subtractInPlace(this._t0), w.FromValuesToRef(this._t1.x, this._t1.y, this._t1.z, 0, this._t2.x, this._t2.y, this._t2.z, 0, this._t0.x, this._t0.y, this._t0.z, 0, 0, 0, 0, 1, this._cachedTextureMatrix));\n const t = this.getScene();\n if (!t)\n return this._cachedTextureMatrix;\n const i = this._cachedIdentity3x2;\n return this._cachedIdentity3x2 = this._cachedTextureMatrix.isIdentityAs3x2(), this.optimizeUVAllocation && i !== this._cachedIdentity3x2 && t.markAllMaterialsAsDirty(1, (r) => r.hasTexture(this)), this._cachedTextureMatrix;\n }\n /**\n * Get the current matrix used to apply reflection. This is useful to rotate an environment texture for instance.\n * @returns The reflection texture transform\n */\n getReflectionTextureMatrix() {\n const e = this.getScene();\n if (!e)\n return this._cachedReflectionTextureMatrix;\n if (this.uOffset === this._cachedReflectionUOffset && this.vOffset === this._cachedReflectionVOffset && this.uScale === this._cachedReflectionUScale && this.vScale === this._cachedReflectionVScale && this.coordinatesMode === this._cachedReflectionCoordinatesMode)\n if (this.coordinatesMode === le.PROJECTION_MODE) {\n if (this._cachedReflectionProjectionMatrixId === e.getProjectionMatrix().updateFlag)\n return this._cachedReflectionTextureMatrix;\n } else\n return this._cachedReflectionTextureMatrix;\n this._cachedReflectionTextureMatrix || (this._cachedReflectionTextureMatrix = w.Zero()), this._projectionModeMatrix || (this._projectionModeMatrix = w.Zero());\n const t = this._cachedReflectionCoordinatesMode !== this.coordinatesMode;\n switch (this._cachedReflectionUOffset = this.uOffset, this._cachedReflectionVOffset = this.vOffset, this._cachedReflectionUScale = this.uScale, this._cachedReflectionVScale = this.vScale, this._cachedReflectionCoordinatesMode = this.coordinatesMode, this.coordinatesMode) {\n case le.PLANAR_MODE: {\n w.IdentityToRef(this._cachedReflectionTextureMatrix), this._cachedReflectionTextureMatrix[0] = this.uScale, this._cachedReflectionTextureMatrix[5] = this.vScale, this._cachedReflectionTextureMatrix[12] = this.uOffset, this._cachedReflectionTextureMatrix[13] = this.vOffset;\n break;\n }\n case le.PROJECTION_MODE: {\n w.FromValuesToRef(0.5, 0, 0, 0, 0, -0.5, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 1, 1, this._projectionModeMatrix);\n const i = e.getProjectionMatrix();\n this._cachedReflectionProjectionMatrixId = i.updateFlag, i.multiplyToRef(this._projectionModeMatrix, this._cachedReflectionTextureMatrix);\n break;\n }\n default:\n w.IdentityToRef(this._cachedReflectionTextureMatrix);\n break;\n }\n return t && e.markAllMaterialsAsDirty(1, (i) => i.hasTexture(this)), this._cachedReflectionTextureMatrix;\n }\n /**\n * Clones the texture.\n * @returns the cloned texture\n */\n clone() {\n const e = {\n noMipmap: this._noMipmap,\n invertY: this._invertY,\n samplingMode: this.samplingMode,\n onLoad: void 0,\n onError: void 0,\n buffer: this._texture ? this._texture._buffer : void 0,\n deleteBuffer: this._deleteBuffer,\n format: this.textureFormat,\n mimeType: this.mimeType,\n loaderOptions: this._loaderOptions,\n creationFlags: this._creationFlags,\n useSRGBBuffer: this._useSRGBBuffer\n };\n return Le.Clone(() => new le(this._texture ? this._texture.url : null, this.getScene(), e), this);\n }\n /**\n * Serialize the texture to a JSON representation we can easily use in the respective Parse function.\n * @returns The JSON representation of the texture\n */\n serialize() {\n var i;\n const e = this.name;\n le.SerializeBuffers || this.name.startsWith(\"data:\") && (this.name = \"\"), this.name.startsWith(\"data:\") && this.url === this.name && (this.url = \"\");\n const t = super.serialize(le._SerializeInternalTextureUniqueId);\n return t ? ((le.SerializeBuffers || le.ForceSerializeBuffers) && (typeof this._buffer == \"string\" && this._buffer.substr(0, 5) === \"data:\" ? (t.base64String = this._buffer, t.name = t.name.replace(\"data:\", \"\")) : this.url && this.url.startsWith(\"data:\") && this._buffer instanceof Uint8Array ? t.base64String = \"data:image/png;base64,\" + D_(this._buffer) : (le.ForceSerializeBuffers || this.url && this.url.startsWith(\"blob:\") || this._forceSerialize) && (t.base64String = !this._engine || this._engine._features.supportSyncTextureRead ? cI(this) : hI(this))), t.invertY = this._invertY, t.samplingMode = this.samplingMode, t._creationFlags = this._creationFlags, t._useSRGBBuffer = this._useSRGBBuffer, le._SerializeInternalTextureUniqueId && (t.internalTextureUniqueId = ((i = this._texture) == null ? void 0 : i.uniqueId) ?? void 0), t.noMipmap = this._noMipmap, this.name = e, t) : null;\n }\n /**\n * Get the current class name of the texture useful for serialization or dynamic coding.\n * @returns \"Texture\"\n */\n getClassName() {\n return \"Texture\";\n }\n /**\n * Dispose the texture and release its associated resources.\n */\n dispose() {\n super.dispose(), this.onLoadObservable.clear(), this._delayedOnLoad = null, this._delayedOnError = null, this._buffer = null;\n }\n /**\n * Parse the JSON representation of a texture in order to recreate the texture in the given scene.\n * @param parsedTexture Define the JSON representation of the texture\n * @param scene Define the scene the parsed texture should be instantiated in\n * @param rootUrl Define the root url of the parsing sequence in the case of relative dependencies\n * @returns The parsed texture if successful\n */\n static Parse(e, t, i) {\n if (e.customType) {\n const c = lo.Instantiate(e.customType).Parse(e, t, i);\n return e.samplingMode && c.updateSamplingMode && c._samplingMode && c._samplingMode !== e.samplingMode && c.updateSamplingMode(e.samplingMode), c;\n }\n if (e.isCube && !e.isRenderTarget)\n return le._CubeTextureParser(e, t, i);\n const r = e.internalTextureUniqueId !== void 0;\n if (!e.name && !e.isRenderTarget && !r)\n return null;\n let s;\n if (r) {\n const l = t.getEngine().getLoadedTexturesCache();\n for (const c of l)\n if (c.uniqueId === e.internalTextureUniqueId) {\n s = c;\n break;\n }\n }\n const a = (l) => {\n var c;\n if (l && l._texture && (l._texture._cachedWrapU = null, l._texture._cachedWrapV = null, l._texture._cachedWrapR = null), e.samplingMode) {\n const h = e.samplingMode;\n l && l.samplingMode !== h && l.updateSamplingMode(h);\n }\n if (l && e.animations)\n for (let h = 0; h < e.animations.length; h++) {\n const u = e.animations[h], f = mr(\"BABYLON.Animation\");\n f && l.animations.push(f.Parse(u));\n }\n r && !s && ((c = l == null ? void 0 : l._texture) == null || c._setUniqueId(e.internalTextureUniqueId));\n };\n return Le.Parse(() => {\n let l = !0;\n if (e.noMipmap && (l = !1), e.mirrorPlane) {\n const c = le._CreateMirror(e.name, e.renderTargetSize, t, l);\n return c._waitingRenderList = e.renderList, c.mirrorPlane = qr.FromArray(e.mirrorPlane), a(c), c;\n } else if (e.isRenderTarget) {\n let c = null;\n if (e.isCube) {\n if (t.reflectionProbes)\n for (let h = 0; h < t.reflectionProbes.length; h++) {\n const u = t.reflectionProbes[h];\n if (u.name === e.name)\n return u.cubeTexture;\n }\n } else\n c = le._CreateRenderTargetTexture(e.name, e.renderTargetSize, t, l, e._creationFlags ?? 0), c._waitingRenderList = e.renderList;\n return a(c), c;\n } else if (e.isVideo) {\n const c = le._CreateVideoTexture(i + (e.url || e.name), i + (e.src || e.url), t, l, e.invertY, e.samplingMode, e.settings || {});\n return a(c), c;\n } else {\n let c;\n if (e.base64String && !s)\n c = le.CreateFromBase64String(e.base64String, e.base64String, t, !l, e.invertY, e.samplingMode, () => {\n a(c);\n }, e._creationFlags ?? 0, e._useSRGBBuffer ?? !1), c.name = e.name;\n else {\n let h;\n e.name && (e.name.indexOf(\"://\") > 0 || e.name.startsWith(\"data:\")) ? h = e.name : h = i + e.name, e.url && (e.url.startsWith(\"data:\") || le.UseSerializedUrlIfAny) && (h = e.url);\n const u = {\n noMipmap: !l,\n invertY: e.invertY,\n samplingMode: e.samplingMode,\n onLoad: () => {\n a(c);\n },\n internalTexture: s\n };\n c = new le(h, t, u);\n }\n return c;\n }\n }, e, t);\n }\n /**\n * Creates a texture from its base 64 representation.\n * @param data Define the base64 payload without the data: prefix\n * @param name Define the name of the texture in the scene useful fo caching purpose for instance\n * @param scene Define the scene the texture should belong to\n * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture\n * @param invertY define if the texture needs to be inverted on the y axis during loading\n * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)\n * @param onLoad define a callback triggered when the texture has been loaded\n * @param onError define a callback triggered when an error occurred during the loading session\n * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param forcedExtension defines the extension to use to pick the right loader\n * @returns the created texture\n */\n static CreateFromBase64String(e, t, i, r, s, a = le.TRILINEAR_SAMPLINGMODE, o = null, l = null, c = 5, h, u) {\n return new le(\"data:\" + t, i, r, s, a, o, l, e, !1, c, void 0, void 0, h, u);\n }\n /**\n * Creates a texture from its data: representation. (data: will be added in case only the payload has been passed in)\n * @param name Define the name of the texture in the scene useful fo caching purpose for instance\n * @param buffer define the buffer to load the texture from in case the texture is loaded from a buffer representation\n * @param scene Define the scene the texture should belong to\n * @param deleteBuffer define if the buffer we are loading the texture from should be deleted after load\n * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture\n * @param invertY define if the texture needs to be inverted on the y axis during loading\n * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)\n * @param onLoad define a callback triggered when the texture has been loaded\n * @param onError define a callback triggered when an error occurred during the loading session\n * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param forcedExtension defines the extension to use to pick the right loader\n * @returns the created texture\n */\n static LoadFromDataString(e, t, i, r = !1, s, a = !0, o = le.TRILINEAR_SAMPLINGMODE, l = null, c = null, h = 5, u, f) {\n return e.substr(0, 5) !== \"data:\" && (e = \"data:\" + e), new le(e, i, s, a, o, l, c, t, r, h, void 0, void 0, u, f);\n }\n}\nle.SerializeBuffers = !0;\nle.ForceSerializeBuffers = !1;\nle.OnTextureLoadErrorObservable = new he();\nle._SerializeInternalTextureUniqueId = !1;\nle._CubeTextureParser = (n, e, t) => {\n throw We(\"CubeTexture\");\n};\nle._CreateMirror = (n, e, t, i) => {\n throw We(\"MirrorTexture\");\n};\nle._CreateRenderTargetTexture = (n, e, t, i, r) => {\n throw We(\"RenderTargetTexture\");\n};\nle.NEAREST_SAMPLINGMODE = 1;\nle.NEAREST_NEAREST_MIPLINEAR = 8;\nle.BILINEAR_SAMPLINGMODE = 2;\nle.LINEAR_LINEAR_MIPNEAREST = 11;\nle.TRILINEAR_SAMPLINGMODE = 3;\nle.LINEAR_LINEAR_MIPLINEAR = 3;\nle.NEAREST_NEAREST_MIPNEAREST = 4;\nle.NEAREST_LINEAR_MIPNEAREST = 5;\nle.NEAREST_LINEAR_MIPLINEAR = 6;\nle.NEAREST_LINEAR = 7;\nle.NEAREST_NEAREST = 1;\nle.LINEAR_NEAREST_MIPNEAREST = 9;\nle.LINEAR_NEAREST_MIPLINEAR = 10;\nle.LINEAR_LINEAR = 2;\nle.LINEAR_NEAREST = 12;\nle.EXPLICIT_MODE = 0;\nle.SPHERICAL_MODE = 1;\nle.PLANAR_MODE = 2;\nle.CUBIC_MODE = 3;\nle.PROJECTION_MODE = 4;\nle.SKYBOX_MODE = 5;\nle.INVCUBIC_MODE = 6;\nle.EQUIRECTANGULAR_MODE = 7;\nle.FIXED_EQUIRECTANGULAR_MODE = 8;\nle.FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9;\nle.CLAMP_ADDRESSMODE = 0;\nle.WRAP_ADDRESSMODE = 1;\nle.MIRROR_ADDRESSMODE = 2;\nle.UseSerializedUrlIfAny = !1;\nP([\n U()\n], le.prototype, \"url\", void 0);\nP([\n U()\n], le.prototype, \"uOffset\", void 0);\nP([\n U()\n], le.prototype, \"vOffset\", void 0);\nP([\n U()\n], le.prototype, \"uScale\", void 0);\nP([\n U()\n], le.prototype, \"vScale\", void 0);\nP([\n U()\n], le.prototype, \"uAng\", void 0);\nP([\n U()\n], le.prototype, \"vAng\", void 0);\nP([\n U()\n], le.prototype, \"wAng\", void 0);\nP([\n U()\n], le.prototype, \"uRotationCenter\", void 0);\nP([\n U()\n], le.prototype, \"vRotationCenter\", void 0);\nP([\n U()\n], le.prototype, \"wRotationCenter\", void 0);\nP([\n U()\n], le.prototype, \"homogeneousRotationInUVTransform\", void 0);\nP([\n U()\n], le.prototype, \"isBlocking\", null);\nRe(\"BABYLON.Texture\", le);\nLe._TextureParser = le.Parse;\nclass pf {\n constructor() {\n this._defines = {}, this._currentRank = 32, this._maxRank = -1, this._mesh = null;\n }\n /**\n * Removes the fallback from the bound mesh.\n */\n unBindMesh() {\n this._mesh = null;\n }\n /**\n * Adds a fallback on the specified property.\n * @param rank The rank of the fallback (Lower ranks will be fallbacked to first)\n * @param define The name of the define in the shader\n */\n addFallback(e, t) {\n this._defines[e] || (e < this._currentRank && (this._currentRank = e), e > this._maxRank && (this._maxRank = e), this._defines[e] = new Array()), this._defines[e].push(t);\n }\n /**\n * Sets the mesh to use CPU skinning when needing to fallback.\n * @param rank The rank of the fallback (Lower ranks will be fallbacked to first)\n * @param mesh The mesh to use the fallbacks.\n */\n addCPUSkinningFallback(e, t) {\n this._mesh = t, e < this._currentRank && (this._currentRank = e), e > this._maxRank && (this._maxRank = e);\n }\n /**\n * Checks to see if more fallbacks are still available.\n */\n get hasMoreFallbacks() {\n return this._currentRank <= this._maxRank;\n }\n /**\n * Removes the defines that should be removed when falling back.\n * @param currentDefines defines the current define statements for the shader.\n * @param effect defines the current effect we try to compile\n * @returns The resulting defines with defines of the current rank removed.\n */\n reduce(e, t) {\n if (this._mesh && this._mesh.computeBonesUsingShaders && this._mesh.numBoneInfluencers > 0) {\n this._mesh.computeBonesUsingShaders = !1, e = e.replace(\"#define NUM_BONE_INFLUENCERS \" + this._mesh.numBoneInfluencers, \"#define NUM_BONE_INFLUENCERS 0\"), t._bonesComputationForcedToCPU = !0;\n const i = this._mesh.getScene();\n for (let r = 0; r < i.meshes.length; r++) {\n const s = i.meshes[r];\n if (!s.material) {\n !this._mesh.material && s.computeBonesUsingShaders && s.numBoneInfluencers > 0 && (s.computeBonesUsingShaders = !1);\n continue;\n }\n if (!(!s.computeBonesUsingShaders || s.numBoneInfluencers === 0)) {\n if (s.material.getEffect() === t)\n s.computeBonesUsingShaders = !1;\n else if (s.subMeshes) {\n for (const a of s.subMeshes)\n if (a.effect === t) {\n s.computeBonesUsingShaders = !1;\n break;\n }\n }\n }\n }\n } else {\n const i = this._defines[this._currentRank];\n if (i)\n for (let r = 0; r < i.length; r++)\n e = e.replace(\"#define \" + i[r], \"\");\n this._currentRank++;\n }\n return e;\n }\n}\nclass Uc extends ie {\n constructor(e, t, i = !0) {\n super(e, t), this._normalMatrix = new w(), this._storeEffectOnSubMeshes = i;\n }\n getEffect() {\n return this._storeEffectOnSubMeshes ? this._activeEffect : super.getEffect();\n }\n isReady(e, t) {\n return e ? !this._storeEffectOnSubMeshes || !e.subMeshes || e.subMeshes.length === 0 ? !0 : this.isReadyForSubMesh(e, e.subMeshes[0], t) : !1;\n }\n _isReadyForSubMesh(e) {\n const t = e.materialDefines;\n return !!(!this.checkReadyOnEveryCall && e.effect && t && t._renderId === this.getScene().getRenderId());\n }\n /**\n * Binds the given world matrix to the active effect\n *\n * @param world the matrix to bind\n */\n bindOnlyWorldMatrix(e) {\n this._activeEffect.setMatrix(\"world\", e);\n }\n /**\n * Binds the given normal matrix to the active effect\n *\n * @param normalMatrix the matrix to bind\n */\n bindOnlyNormalMatrix(e) {\n this._activeEffect.setMatrix(\"normalMatrix\", e);\n }\n bind(e, t) {\n t && this.bindForSubMesh(e, t, t.subMeshes[0]);\n }\n _afterBind(e, t = null, i) {\n super._afterBind(e, t, i), this.getScene()._cachedEffect = t, i ? i._drawWrapper._forceRebindOnNextCall = !1 : this._drawWrapper._forceRebindOnNextCall = !1;\n }\n _mustRebind(e, t, i, r = 1) {\n return i._drawWrapper._forceRebindOnNextCall || e.isCachedMaterialInvalid(this, t, r);\n }\n dispose(e, t, i) {\n this._activeEffect = void 0, super.dispose(e, t, i);\n }\n}\nconst zh = { effect: null, subMesh: null };\nclass ks extends Uc {\n /**\n * Instantiate a new shader material.\n * The ShaderMaterial object has the necessary methods to pass data from your scene to the Vertex and Fragment Shaders and returns a material that can be applied to any mesh.\n * This returned material effects how the mesh will look based on the code in the shaders.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/shaders/shaderMaterial\n * @param name Define the name of the material in the scene\n * @param scene Define the scene the material belongs to\n * @param shaderPath Defines the route to the shader code.\n * @param options Define the options used to create the shader\n * @param storeEffectOnSubMeshes true to store effect on submeshes, false to store the effect directly in the material class.\n */\n constructor(e, t, i, r = {}, s = !0) {\n super(e, t, s), this._textures = {}, this._textureArrays = {}, this._externalTextures = {}, this._floats = {}, this._ints = {}, this._uints = {}, this._floatsArrays = {}, this._colors3 = {}, this._colors3Arrays = {}, this._colors4 = {}, this._colors4Arrays = {}, this._vectors2 = {}, this._vectors3 = {}, this._vectors4 = {}, this._quaternions = {}, this._quaternionsArrays = {}, this._matrices = {}, this._matrixArrays = {}, this._matrices3x3 = {}, this._matrices2x2 = {}, this._vectors2Arrays = {}, this._vectors3Arrays = {}, this._vectors4Arrays = {}, this._uniformBuffers = {}, this._textureSamplers = {}, this._storageBuffers = {}, this._cachedWorldViewMatrix = new w(), this._cachedWorldViewProjectionMatrix = new w(), this._multiview = !1, this._materialHelperNeedsPreviousMatrices = !1, this._shaderPath = i, this._options = {\n needAlphaBlending: !1,\n needAlphaTesting: !1,\n attributes: [\"position\", \"normal\", \"uv\"],\n uniforms: [\"worldViewProjection\"],\n uniformBuffers: [],\n samplers: [],\n externalTextures: [],\n samplerObjects: [],\n storageBuffers: [],\n defines: [],\n useClipPlane: !1,\n ...r\n };\n }\n /**\n * Gets the shader path used to define the shader code\n * It can be modified to trigger a new compilation\n */\n get shaderPath() {\n return this._shaderPath;\n }\n /**\n * Sets the shader path used to define the shader code\n * It can be modified to trigger a new compilation\n */\n set shaderPath(e) {\n this._shaderPath = e;\n }\n /**\n * Gets the options used to compile the shader.\n * They can be modified to trigger a new compilation\n */\n get options() {\n return this._options;\n }\n /**\n * is multiview set to true?\n */\n get isMultiview() {\n return this._multiview;\n }\n /**\n * Gets the current class name of the material e.g. \"ShaderMaterial\"\n * Mainly use in serialization.\n * @returns the class name\n */\n getClassName() {\n return \"ShaderMaterial\";\n }\n /**\n * Specifies if the material will require alpha blending\n * @returns a boolean specifying if alpha blending is needed\n */\n needAlphaBlending() {\n return this.alpha < 1 || this._options.needAlphaBlending;\n }\n /**\n * Specifies if this material should be rendered in alpha test mode\n * @returns a boolean specifying if an alpha test is needed.\n */\n needAlphaTesting() {\n return this._options.needAlphaTesting;\n }\n _checkUniform(e) {\n this._options.uniforms.indexOf(e) === -1 && this._options.uniforms.push(e);\n }\n /**\n * Set a texture in the shader.\n * @param name Define the name of the uniform samplers as defined in the shader\n * @param texture Define the texture to bind to this sampler\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setTexture(e, t) {\n return this._options.samplers.indexOf(e) === -1 && this._options.samplers.push(e), this._textures[e] = t, this;\n }\n /**\n * Set a texture array in the shader.\n * @param name Define the name of the uniform sampler array as defined in the shader\n * @param textures Define the list of textures to bind to this sampler\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setTextureArray(e, t) {\n return this._options.samplers.indexOf(e) === -1 && this._options.samplers.push(e), this._checkUniform(e), this._textureArrays[e] = t, this;\n }\n /**\n * Set an internal texture in the shader.\n * @param name Define the name of the uniform samplers as defined in the shader\n * @param texture Define the texture to bind to this sampler\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setExternalTexture(e, t) {\n return this._options.externalTextures.indexOf(e) === -1 && this._options.externalTextures.push(e), this._externalTextures[e] = t, this;\n }\n /**\n * Set a float in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setFloat(e, t) {\n return this._checkUniform(e), this._floats[e] = t, this;\n }\n /**\n * Set a int in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setInt(e, t) {\n return this._checkUniform(e), this._ints[e] = t, this;\n }\n /**\n * Set a unsigned int in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setUInt(e, t) {\n return this._checkUniform(e), this._uints[e] = t, this;\n }\n /**\n * Set an array of floats in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setFloats(e, t) {\n return this._checkUniform(e), this._floatsArrays[e] = t, this;\n }\n /**\n * Set a vec3 in the shader from a Color3.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setColor3(e, t) {\n return this._checkUniform(e), this._colors3[e] = t, this;\n }\n /**\n * Set a vec3 array in the shader from a Color3 array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setColor3Array(e, t) {\n return this._checkUniform(e), this._colors3Arrays[e] = t.reduce((i, r) => (r.toArray(i, i.length), i), []), this;\n }\n /**\n * Set a vec4 in the shader from a Color4.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setColor4(e, t) {\n return this._checkUniform(e), this._colors4[e] = t, this;\n }\n /**\n * Set a vec4 array in the shader from a Color4 array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setColor4Array(e, t) {\n return this._checkUniform(e), this._colors4Arrays[e] = t.reduce((i, r) => (r.toArray(i, i.length), i), []), this;\n }\n /**\n * Set a vec2 in the shader from a Vector2.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setVector2(e, t) {\n return this._checkUniform(e), this._vectors2[e] = t, this;\n }\n /**\n * Set a vec3 in the shader from a Vector3.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setVector3(e, t) {\n return this._checkUniform(e), this._vectors3[e] = t, this;\n }\n /**\n * Set a vec4 in the shader from a Vector4.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setVector4(e, t) {\n return this._checkUniform(e), this._vectors4[e] = t, this;\n }\n /**\n * Set a vec4 in the shader from a Quaternion.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setQuaternion(e, t) {\n return this._checkUniform(e), this._quaternions[e] = t, this;\n }\n /**\n * Set a vec4 array in the shader from a Quaternion array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setQuaternionArray(e, t) {\n return this._checkUniform(e), this._quaternionsArrays[e] = t.reduce((i, r) => (r.toArray(i, i.length), i), []), this;\n }\n /**\n * Set a mat4 in the shader from a Matrix.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setMatrix(e, t) {\n return this._checkUniform(e), this._matrices[e] = t, this;\n }\n /**\n * Set a float32Array in the shader from a matrix array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setMatrices(e, t) {\n this._checkUniform(e);\n const i = new Float32Array(t.length * 16);\n for (let r = 0; r < t.length; r++)\n t[r].copyToArray(i, r * 16);\n return this._matrixArrays[e] = i, this;\n }\n /**\n * Set a mat3 in the shader from a Float32Array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setMatrix3x3(e, t) {\n return this._checkUniform(e), this._matrices3x3[e] = t, this;\n }\n /**\n * Set a mat2 in the shader from a Float32Array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setMatrix2x2(e, t) {\n return this._checkUniform(e), this._matrices2x2[e] = t, this;\n }\n /**\n * Set a vec2 array in the shader from a number array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setArray2(e, t) {\n return this._checkUniform(e), this._vectors2Arrays[e] = t, this;\n }\n /**\n * Set a vec3 array in the shader from a number array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setArray3(e, t) {\n return this._checkUniform(e), this._vectors3Arrays[e] = t, this;\n }\n /**\n * Set a vec4 array in the shader from a number array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setArray4(e, t) {\n return this._checkUniform(e), this._vectors4Arrays[e] = t, this;\n }\n /**\n * Set a uniform buffer in the shader\n * @param name Define the name of the uniform as defined in the shader\n * @param buffer Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setUniformBuffer(e, t) {\n return this._options.uniformBuffers.indexOf(e) === -1 && this._options.uniformBuffers.push(e), this._uniformBuffers[e] = t, this;\n }\n /**\n * Set a texture sampler in the shader\n * @param name Define the name of the uniform as defined in the shader\n * @param sampler Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setTextureSampler(e, t) {\n return this._options.samplerObjects.indexOf(e) === -1 && this._options.samplerObjects.push(e), this._textureSamplers[e] = t, this;\n }\n /**\n * Set a storage buffer in the shader\n * @param name Define the name of the storage buffer as defined in the shader\n * @param buffer Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setStorageBuffer(e, t) {\n return this._options.storageBuffers.indexOf(e) === -1 && this._options.storageBuffers.push(e), this._storageBuffers[e] = t, this;\n }\n /**\n * Adds, removes, or replaces the specified shader define and value.\n * * setDefine(\"MY_DEFINE\", true); // enables a boolean define\n * * setDefine(\"MY_DEFINE\", \"0.5\"); // adds \"#define MY_DEFINE 0.5\" to the shader (or sets and replaces the value of any existing define with that name)\n * * setDefine(\"MY_DEFINE\", false); // disables and removes the define\n * Note if the active defines do change, the shader will be recompiled and this can be expensive.\n * @param define the define name e.g., \"OUTPUT_TO_SRGB\" or \"#define OUTPUT_TO_SRGB\". If the define was passed into the constructor already, the version used should match that, and in either case, it should not include any appended value.\n * @param value either the value of the define (e.g. a numerical value) or for booleans, true if the define should be enabled or false if it should be disabled\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setDefine(e, t) {\n const i = e.trimEnd() + \" \", r = this.options.defines.findIndex((s) => s === e || s.startsWith(i));\n return r >= 0 && this.options.defines.splice(r, 1), (typeof t != \"boolean\" || t) && this.options.defines.push(i + t), this;\n }\n /**\n * Specifies that the submesh is ready to be used\n * @param mesh defines the mesh to check\n * @param subMesh defines which submesh to check\n * @param useInstances specifies that instances should be used\n * @returns a boolean indicating that the submesh is ready or not\n */\n isReadyForSubMesh(e, t, i) {\n return this.isReady(e, i, t);\n }\n /**\n * Checks if the material is ready to render the requested mesh\n * @param mesh Define the mesh to render\n * @param useInstances Define whether or not the material is used with instances\n * @param subMesh defines which submesh to render\n * @returns true if ready, otherwise false\n */\n isReady(e, t, i) {\n const r = i && this._storeEffectOnSubMeshes;\n if (this.isFrozen) {\n const R = r ? i._drawWrapper : this._drawWrapper;\n if (R.effect && R._wasPreviouslyReady && R._wasPreviouslyUsingInstances === t)\n return !0;\n }\n const s = this.getScene(), a = s.getEngine(), o = [], l = [], c = new pf();\n let h = this._shaderPath, u = this._options.uniforms, f = this._options.uniformBuffers, d = this._options.samplers;\n a.getCaps().multiview && s.activeCamera && s.activeCamera.outputRenderTarget && s.activeCamera.outputRenderTarget.getViewCount() > 1 && (this._multiview = !0, o.push(\"#define MULTIVIEW\"), u.indexOf(\"viewProjection\") !== -1 && u.indexOf(\"viewProjectionR\") === -1 && u.push(\"viewProjectionR\"));\n for (let R = 0; R < this._options.defines.length; R++) {\n const x = this._options.defines[R].indexOf(\"#define\") === 0 ? this._options.defines[R] : `#define ${this._options.defines[R]}`;\n o.push(x);\n }\n for (let R = 0; R < this._options.attributes.length; R++)\n l.push(this._options.attributes[R]);\n if (e && e.isVerticesDataPresent(I.ColorKind) && (l.indexOf(I.ColorKind) === -1 && l.push(I.ColorKind), o.push(\"#define VERTEXCOLOR\")), t && (o.push(\"#define INSTANCES\"), J_(l, this._materialHelperNeedsPreviousMatrices), e != null && e.hasThinInstances && (o.push(\"#define THIN_INSTANCES\"), e && e.isVerticesDataPresent(I.ColorInstanceKind) && (l.push(I.ColorInstanceKind), o.push(\"#define INSTANCESCOLOR\")))), e && e.useBones && e.computeBonesUsingShaders && e.skeleton) {\n l.push(I.MatricesIndicesKind), l.push(I.MatricesWeightsKind), e.numBoneInfluencers > 4 && (l.push(I.MatricesIndicesExtraKind), l.push(I.MatricesWeightsExtraKind));\n const R = e.skeleton;\n o.push(\"#define NUM_BONE_INFLUENCERS \" + e.numBoneInfluencers), c.addCPUSkinningFallback(0, e), R.isUsingTextureForMatrices ? (o.push(\"#define BONETEXTURE\"), u.indexOf(\"boneTextureWidth\") === -1 && u.push(\"boneTextureWidth\"), this._options.samplers.indexOf(\"boneSampler\") === -1 && this._options.samplers.push(\"boneSampler\")) : (o.push(\"#define BonesPerMesh \" + (R.bones.length + 1)), u.indexOf(\"mBones\") === -1 && u.push(\"mBones\"));\n } else\n o.push(\"#define NUM_BONE_INFLUENCERS 0\");\n let p = 0;\n const g = e ? e.morphTargetManager : null;\n if (g) {\n const R = g.supportsUVs && o.indexOf(\"#define UV1\") !== -1, x = g.supportsTangents && o.indexOf(\"#define TANGENT\") !== -1, S = g.supportsNormals && o.indexOf(\"#define NORMAL\") !== -1;\n p = g.numMaxInfluencers || g.numInfluencers, R && o.push(\"#define MORPHTARGETS_UV\"), x && o.push(\"#define MORPHTARGETS_TANGENT\"), S && o.push(\"#define MORPHTARGETS_NORMAL\"), p > 0 && o.push(\"#define MORPHTARGETS\"), g.isUsingTextureForTargets && (o.push(\"#define MORPHTARGETS_TEXTURE\"), u.indexOf(\"morphTargetTextureIndices\") === -1 && u.push(\"morphTargetTextureIndices\"), this._options.samplers.indexOf(\"morphTargets\") === -1 && this._options.samplers.push(\"morphTargets\")), o.push(\"#define NUM_MORPH_INFLUENCERS \" + p);\n for (let M = 0; M < p; M++)\n l.push(I.PositionKind + M), S && l.push(I.NormalKind + M), x && l.push(I.TangentKind + M), R && l.push(I.UVKind + \"_\" + M);\n p > 0 && (u = u.slice(), u.push(\"morphTargetInfluences\"), u.push(\"morphTargetCount\"), u.push(\"morphTargetTextureInfo\"), u.push(\"morphTargetTextureIndices\"));\n } else\n o.push(\"#define NUM_MORPH_INFLUENCERS 0\");\n if (e) {\n const R = e.bakedVertexAnimationManager;\n R && R.isEnabled && (o.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\"), u.indexOf(\"bakedVertexAnimationSettings\") === -1 && u.push(\"bakedVertexAnimationSettings\"), u.indexOf(\"bakedVertexAnimationTextureSizeInverted\") === -1 && u.push(\"bakedVertexAnimationTextureSizeInverted\"), u.indexOf(\"bakedVertexAnimationTime\") === -1 && u.push(\"bakedVertexAnimationTime\"), this._options.samplers.indexOf(\"bakedVertexAnimationTexture\") === -1 && this._options.samplers.push(\"bakedVertexAnimationTexture\")), af(l, e, o);\n }\n for (const R in this._textures)\n if (!this._textures[R].isReady())\n return !1;\n e && this._shouldTurnAlphaTestOn(e) && o.push(\"#define ALPHATEST\"), this._options.useClipPlane !== !1 && (Nc(u), Yy(this, s, o)), s.fogEnabled && (e != null && e.applyFog) && s.fogMode !== Ot.FOGMODE_NONE && (o.push(\"#define FOG\"), u.indexOf(\"view\") === -1 && u.push(\"view\"), u.indexOf(\"vFogInfos\") === -1 && u.push(\"vFogInfos\"), u.indexOf(\"vFogColor\") === -1 && u.push(\"vFogColor\")), this._useLogarithmicDepth && (o.push(\"#define LOGARITHMICDEPTH\"), u.indexOf(\"logarithmicDepthConstant\") === -1 && u.push(\"logarithmicDepthConstant\")), this.customShaderNameResolve && (u = u.slice(), f = f.slice(), d = d.slice(), h = this.customShaderNameResolve(this.name, u, f, d, o, l));\n const m = r ? i._getDrawWrapper(void 0, !0) : this._drawWrapper, v = (m == null ? void 0 : m.effect) ?? null, E = (m == null ? void 0 : m.defines) ?? null, C = o.join(`\n`);\n let T = v;\n return E !== C && (T = a.createEffect(h, {\n attributes: l,\n uniformsNames: u,\n uniformBuffersNames: f,\n samplers: d,\n defines: C,\n fallbacks: c,\n onCompiled: this.onCompiled,\n onError: this.onError,\n indexParameters: { maxSimultaneousMorphTargets: p },\n shaderLanguage: this._options.shaderLanguage\n }, a), r ? i.setEffect(T, C, this._materialContext) : m && m.setEffect(T, C), this._onEffectCreatedObservable && (zh.effect = T, zh.subMesh = i ?? (e == null ? void 0 : e.subMeshes[0]) ?? null, this._onEffectCreatedObservable.notifyObservers(zh))), m._wasPreviouslyUsingInstances = !!t, T != null && T.isReady() ? (v !== T && s.resetCachedMaterial(), m._wasPreviouslyReady = !0, !0) : !1;\n }\n /**\n * Binds the world matrix to the material\n * @param world defines the world transformation matrix\n * @param effectOverride - If provided, use this effect instead of internal effect\n */\n bindOnlyWorldMatrix(e, t) {\n const i = this.getScene(), r = t ?? this.getEffect();\n r && (this._options.uniforms.indexOf(\"world\") !== -1 && r.setMatrix(\"world\", e), this._options.uniforms.indexOf(\"worldView\") !== -1 && (e.multiplyToRef(i.getViewMatrix(), this._cachedWorldViewMatrix), r.setMatrix(\"worldView\", this._cachedWorldViewMatrix)), this._options.uniforms.indexOf(\"worldViewProjection\") !== -1 && (e.multiplyToRef(i.getTransformMatrix(), this._cachedWorldViewProjectionMatrix), r.setMatrix(\"worldViewProjection\", this._cachedWorldViewProjectionMatrix)), this._options.uniforms.indexOf(\"view\") !== -1 && r.setMatrix(\"view\", i.getViewMatrix()));\n }\n /**\n * Binds the submesh to this material by preparing the effect and shader to draw\n * @param world defines the world transformation matrix\n * @param mesh defines the mesh containing the submesh\n * @param subMesh defines the submesh to bind the material to\n */\n bindForSubMesh(e, t, i) {\n var r;\n this.bind(e, t, (r = i._drawWrapperOverride) == null ? void 0 : r.effect, i);\n }\n /**\n * Binds the material to the mesh\n * @param world defines the world transformation matrix\n * @param mesh defines the mesh to bind the material to\n * @param effectOverride - If provided, use this effect instead of internal effect\n * @param subMesh defines the submesh to bind the material to\n */\n bind(e, t, i, r) {\n var u;\n const s = r && this._storeEffectOnSubMeshes, a = i ?? (s ? r.effect : this.getEffect());\n if (!a)\n return;\n const o = this.getScene();\n this._activeEffect = a, this.bindOnlyWorldMatrix(e, i);\n const l = this._options.uniformBuffers;\n let c = !1;\n if (a && l && l.length > 0 && o.getEngine().supportsUniformBuffers)\n for (let f = 0; f < l.length; ++f)\n switch (l[f]) {\n case \"Mesh\":\n t && (t.getMeshUniformBuffer().bindToEffect(a, \"Mesh\"), t.transferToEffect(e));\n break;\n case \"Scene\":\n $_(a, o.getSceneUniformBuffer()), o.finalizeSceneUbo(), c = !0;\n break;\n }\n const h = t && s ? this._mustRebind(o, a, r, t.visibility) : o.getCachedMaterial() !== this;\n if (a && h) {\n !c && this._options.uniforms.indexOf(\"view\") !== -1 && a.setMatrix(\"view\", o.getViewMatrix()), !c && this._options.uniforms.indexOf(\"projection\") !== -1 && a.setMatrix(\"projection\", o.getProjectionMatrix()), !c && this._options.uniforms.indexOf(\"viewProjection\") !== -1 && (a.setMatrix(\"viewProjection\", o.getTransformMatrix()), this._multiview && a.setMatrix(\"viewProjectionR\", o._transformMatrixR)), o.activeCamera && this._options.uniforms.indexOf(\"cameraPosition\") !== -1 && a.setVector3(\"cameraPosition\", o.activeCamera.globalPosition), of(t, a), Fc(a, this, o), this._useLogarithmicDepth && Lc(s ? r.materialDefines : a.defines, a, o), t && wc(o, t, a);\n let f;\n for (f in this._textures)\n a.setTexture(f, this._textures[f]);\n for (f in this._textureArrays)\n a.setTextureArray(f, this._textureArrays[f]);\n for (f in this._externalTextures)\n a.setExternalTexture(f, this._externalTextures[f]);\n for (f in this._ints)\n a.setInt(f, this._ints[f]);\n for (f in this._uints)\n a.setUInt(f, this._uints[f]);\n for (f in this._floats)\n a.setFloat(f, this._floats[f]);\n for (f in this._floatsArrays)\n a.setArray(f, this._floatsArrays[f]);\n for (f in this._colors3)\n a.setColor3(f, this._colors3[f]);\n for (f in this._colors3Arrays)\n a.setArray3(f, this._colors3Arrays[f]);\n for (f in this._colors4) {\n const d = this._colors4[f];\n a.setFloat4(f, d.r, d.g, d.b, d.a);\n }\n for (f in this._colors4Arrays)\n a.setArray4(f, this._colors4Arrays[f]);\n for (f in this._vectors2)\n a.setVector2(f, this._vectors2[f]);\n for (f in this._vectors3)\n a.setVector3(f, this._vectors3[f]);\n for (f in this._vectors4)\n a.setVector4(f, this._vectors4[f]);\n for (f in this._quaternions)\n a.setQuaternion(f, this._quaternions[f]);\n for (f in this._matrices)\n a.setMatrix(f, this._matrices[f]);\n for (f in this._matrixArrays)\n a.setMatrices(f, this._matrixArrays[f]);\n for (f in this._matrices3x3)\n a.setMatrix3x3(f, this._matrices3x3[f]);\n for (f in this._matrices2x2)\n a.setMatrix2x2(f, this._matrices2x2[f]);\n for (f in this._vectors2Arrays)\n a.setArray2(f, this._vectors2Arrays[f]);\n for (f in this._vectors3Arrays)\n a.setArray3(f, this._vectors3Arrays[f]);\n for (f in this._vectors4Arrays)\n a.setArray4(f, this._vectors4Arrays[f]);\n for (f in this._quaternionsArrays)\n a.setArray4(f, this._quaternionsArrays[f]);\n for (f in this._uniformBuffers) {\n const d = this._uniformBuffers[f].getBuffer();\n d && a.bindUniformBuffer(d, f);\n }\n for (f in this._textureSamplers)\n a.setTextureSampler(f, this._textureSamplers[f]);\n for (f in this._storageBuffers)\n a.setStorageBuffer(f, this._storageBuffers[f]);\n }\n if (a && t && (h || !this.isFrozen)) {\n const f = t.morphTargetManager;\n f && f.numInfluencers > 0 && nf(t, a);\n const d = t.bakedVertexAnimationManager;\n if (d && d.isEnabled) {\n const p = s ? r._drawWrapper : this._drawWrapper;\n (u = t.bakedVertexAnimationManager) == null || u.bind(a, !!p._wasPreviouslyUsingInstances);\n }\n }\n this._afterBind(t, a, r);\n }\n /**\n * Gets the active textures from the material\n * @returns an array of textures\n */\n getActiveTextures() {\n const e = super.getActiveTextures();\n for (const t in this._textures)\n e.push(this._textures[t]);\n for (const t in this._textureArrays) {\n const i = this._textureArrays[t];\n for (let r = 0; r < i.length; r++)\n e.push(i[r]);\n }\n return e;\n }\n /**\n * Specifies if the material uses a texture\n * @param texture defines the texture to check against the material\n * @returns a boolean specifying if the material uses the texture\n */\n hasTexture(e) {\n if (super.hasTexture(e))\n return !0;\n for (const t in this._textures)\n if (this._textures[t] === e)\n return !0;\n for (const t in this._textureArrays) {\n const i = this._textureArrays[t];\n for (let r = 0; r < i.length; r++)\n if (i[r] === e)\n return !0;\n }\n return !1;\n }\n /**\n * Makes a duplicate of the material, and gives it a new name\n * @param name defines the new name for the duplicated material\n * @returns the cloned material\n */\n clone(e) {\n const t = Le.Clone(() => new ks(e, this.getScene(), this._shaderPath, this._options, this._storeEffectOnSubMeshes), this);\n t.name = e, t.id = e, typeof t._shaderPath == \"object\" && (t._shaderPath = { ...t._shaderPath }), this._options = { ...this._options }, Object.keys(this._options).forEach((i) => {\n const r = this._options[i];\n Array.isArray(r) && (this._options[i] = r.slice(0));\n }), this.stencil.copyTo(t.stencil);\n for (const i in this._textures)\n t.setTexture(i, this._textures[i]);\n for (const i in this._textureArrays)\n t.setTextureArray(i, this._textureArrays[i]);\n for (const i in this._externalTextures)\n t.setExternalTexture(i, this._externalTextures[i]);\n for (const i in this._ints)\n t.setInt(i, this._ints[i]);\n for (const i in this._uints)\n t.setUInt(i, this._uints[i]);\n for (const i in this._floats)\n t.setFloat(i, this._floats[i]);\n for (const i in this._floatsArrays)\n t.setFloats(i, this._floatsArrays[i]);\n for (const i in this._colors3)\n t.setColor3(i, this._colors3[i]);\n for (const i in this._colors3Arrays)\n t._colors3Arrays[i] = this._colors3Arrays[i];\n for (const i in this._colors4)\n t.setColor4(i, this._colors4[i]);\n for (const i in this._colors4Arrays)\n t._colors4Arrays[i] = this._colors4Arrays[i];\n for (const i in this._vectors2)\n t.setVector2(i, this._vectors2[i]);\n for (const i in this._vectors3)\n t.setVector3(i, this._vectors3[i]);\n for (const i in this._vectors4)\n t.setVector4(i, this._vectors4[i]);\n for (const i in this._quaternions)\n t.setQuaternion(i, this._quaternions[i]);\n for (const i in this._quaternionsArrays)\n t._quaternionsArrays[i] = this._quaternionsArrays[i];\n for (const i in this._matrices)\n t.setMatrix(i, this._matrices[i]);\n for (const i in this._matrixArrays)\n t._matrixArrays[i] = this._matrixArrays[i].slice();\n for (const i in this._matrices3x3)\n t.setMatrix3x3(i, this._matrices3x3[i]);\n for (const i in this._matrices2x2)\n t.setMatrix2x2(i, this._matrices2x2[i]);\n for (const i in this._vectors2Arrays)\n t.setArray2(i, this._vectors2Arrays[i]);\n for (const i in this._vectors3Arrays)\n t.setArray3(i, this._vectors3Arrays[i]);\n for (const i in this._vectors4Arrays)\n t.setArray4(i, this._vectors4Arrays[i]);\n for (const i in this._uniformBuffers)\n t.setUniformBuffer(i, this._uniformBuffers[i]);\n for (const i in this._textureSamplers)\n t.setTextureSampler(i, this._textureSamplers[i]);\n for (const i in this._storageBuffers)\n t.setStorageBuffer(i, this._storageBuffers[i]);\n return t;\n }\n /**\n * Disposes the material\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\n * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh\n */\n dispose(e, t, i) {\n if (t) {\n let r;\n for (r in this._textures)\n this._textures[r].dispose();\n for (r in this._textureArrays) {\n const s = this._textureArrays[r];\n for (let a = 0; a < s.length; a++)\n s[a].dispose();\n }\n }\n this._textures = {}, super.dispose(e, t, i);\n }\n /**\n * Serializes this material in a JSON representation\n * @returns the serialized material object\n */\n serialize() {\n const e = Le.Serialize(this);\n e.customType = \"BABYLON.ShaderMaterial\", e.uniqueId = this.uniqueId, e.options = this._options, e.shaderPath = this._shaderPath, e.storeEffectOnSubMeshes = this._storeEffectOnSubMeshes;\n let t;\n e.stencil = this.stencil.serialize(), e.textures = {};\n for (t in this._textures)\n e.textures[t] = this._textures[t].serialize();\n e.textureArrays = {};\n for (t in this._textureArrays) {\n e.textureArrays[t] = [];\n const i = this._textureArrays[t];\n for (let r = 0; r < i.length; r++)\n e.textureArrays[t].push(i[r].serialize());\n }\n e.ints = {};\n for (t in this._ints)\n e.ints[t] = this._ints[t];\n e.uints = {};\n for (t in this._uints)\n e.uints[t] = this._uints[t];\n e.floats = {};\n for (t in this._floats)\n e.floats[t] = this._floats[t];\n e.floatsArrays = {};\n for (t in this._floatsArrays)\n e.floatsArrays[t] = this._floatsArrays[t];\n e.colors3 = {};\n for (t in this._colors3)\n e.colors3[t] = this._colors3[t].asArray();\n e.colors3Arrays = {};\n for (t in this._colors3Arrays)\n e.colors3Arrays[t] = this._colors3Arrays[t];\n e.colors4 = {};\n for (t in this._colors4)\n e.colors4[t] = this._colors4[t].asArray();\n e.colors4Arrays = {};\n for (t in this._colors4Arrays)\n e.colors4Arrays[t] = this._colors4Arrays[t];\n e.vectors2 = {};\n for (t in this._vectors2)\n e.vectors2[t] = this._vectors2[t].asArray();\n e.vectors3 = {};\n for (t in this._vectors3)\n e.vectors3[t] = this._vectors3[t].asArray();\n e.vectors4 = {};\n for (t in this._vectors4)\n e.vectors4[t] = this._vectors4[t].asArray();\n e.quaternions = {};\n for (t in this._quaternions)\n e.quaternions[t] = this._quaternions[t].asArray();\n e.matrices = {};\n for (t in this._matrices)\n e.matrices[t] = this._matrices[t].asArray();\n e.matrixArray = {};\n for (t in this._matrixArrays)\n e.matrixArray[t] = this._matrixArrays[t];\n e.matrices3x3 = {};\n for (t in this._matrices3x3)\n e.matrices3x3[t] = this._matrices3x3[t];\n e.matrices2x2 = {};\n for (t in this._matrices2x2)\n e.matrices2x2[t] = this._matrices2x2[t];\n e.vectors2Arrays = {};\n for (t in this._vectors2Arrays)\n e.vectors2Arrays[t] = this._vectors2Arrays[t];\n e.vectors3Arrays = {};\n for (t in this._vectors3Arrays)\n e.vectors3Arrays[t] = this._vectors3Arrays[t];\n e.vectors4Arrays = {};\n for (t in this._vectors4Arrays)\n e.vectors4Arrays[t] = this._vectors4Arrays[t];\n e.quaternionsArrays = {};\n for (t in this._quaternionsArrays)\n e.quaternionsArrays[t] = this._quaternionsArrays[t];\n return e;\n }\n /**\n * Creates a shader material from parsed shader material data\n * @param source defines the JSON representation of the material\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a new material\n */\n static Parse(e, t, i) {\n const r = Le.Parse(() => new ks(e.name, t, e.shaderPath, e.options, e.storeEffectOnSubMeshes), e, t, i);\n let s;\n e.stencil && r.stencil.parse(e.stencil, t, i);\n for (s in e.textures)\n r.setTexture(s, le.Parse(e.textures[s], t, i));\n for (s in e.textureArrays) {\n const a = e.textureArrays[s], o = [];\n for (let l = 0; l < a.length; l++)\n o.push(le.Parse(a[l], t, i));\n r.setTextureArray(s, o);\n }\n for (s in e.ints)\n r.setInt(s, e.ints[s]);\n for (s in e.uints)\n r.setUInt(s, e.uints[s]);\n for (s in e.floats)\n r.setFloat(s, e.floats[s]);\n for (s in e.floatsArrays)\n r.setFloats(s, e.floatsArrays[s]);\n for (s in e.colors3)\n r.setColor3(s, Ne.FromArray(e.colors3[s]));\n for (s in e.colors3Arrays) {\n const a = e.colors3Arrays[s].reduce((o, l, c) => (c % 3 === 0 ? o.push([l]) : o[o.length - 1].push(l), o), []).map((o) => Ne.FromArray(o));\n r.setColor3Array(s, a);\n }\n for (s in e.colors4)\n r.setColor4(s, et.FromArray(e.colors4[s]));\n for (s in e.colors4Arrays) {\n const a = e.colors4Arrays[s].reduce((o, l, c) => (c % 4 === 0 ? o.push([l]) : o[o.length - 1].push(l), o), []).map((o) => et.FromArray(o));\n r.setColor4Array(s, a);\n }\n for (s in e.vectors2)\n r.setVector2(s, me.FromArray(e.vectors2[s]));\n for (s in e.vectors3)\n r.setVector3(s, _.FromArray(e.vectors3[s]));\n for (s in e.vectors4)\n r.setVector4(s, Ke.FromArray(e.vectors4[s]));\n for (s in e.quaternions)\n r.setQuaternion(s, Ce.FromArray(e.quaternions[s]));\n for (s in e.matrices)\n r.setMatrix(s, w.FromArray(e.matrices[s]));\n for (s in e.matrixArray)\n r._matrixArrays[s] = new Float32Array(e.matrixArray[s]);\n for (s in e.matrices3x3)\n r.setMatrix3x3(s, e.matrices3x3[s]);\n for (s in e.matrices2x2)\n r.setMatrix2x2(s, e.matrices2x2[s]);\n for (s in e.vectors2Arrays)\n r.setArray2(s, e.vectors2Arrays[s]);\n for (s in e.vectors3Arrays)\n r.setArray3(s, e.vectors3Arrays[s]);\n for (s in e.vectors4Arrays)\n r.setArray4(s, e.vectors4Arrays[s]);\n for (s in e.quaternionsArrays)\n r.setArray4(s, e.quaternionsArrays[s]);\n return r;\n }\n /**\n * Creates a new ShaderMaterial from a snippet saved in a remote file\n * @param name defines the name of the ShaderMaterial to create (can be null or empty to use the one from the json data)\n * @param url defines the url to load from\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a promise that will resolve to the new ShaderMaterial\n */\n static ParseFromFileAsync(e, t, i, r = \"\") {\n return new Promise((s, a) => {\n const o = new mi();\n o.addEventListener(\"readystatechange\", () => {\n if (o.readyState == 4)\n if (o.status == 200) {\n const l = JSON.parse(o.responseText), c = this.Parse(l, i || st.LastCreatedScene, r);\n e && (c.name = e), s(c);\n } else\n a(\"Unable to load the ShaderMaterial\");\n }), o.open(\"GET\", t), o.send();\n });\n }\n /**\n * Creates a ShaderMaterial from a snippet saved by the Inspector\n * @param snippetId defines the snippet to load\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a promise that will resolve to the new ShaderMaterial\n */\n static ParseFromSnippetAsync(e, t, i = \"\") {\n return new Promise((r, s) => {\n const a = new mi();\n a.addEventListener(\"readystatechange\", () => {\n if (a.readyState == 4)\n if (a.status == 200) {\n const o = JSON.parse(JSON.parse(a.responseText).jsonPayload), l = JSON.parse(o.shaderMaterial), c = this.Parse(l, t || st.LastCreatedScene, i);\n c.snippetId = e, r(c);\n } else\n s(\"Unable to load the snippet \" + e);\n }), a.open(\"GET\", this.SnippetUrl + \"/\" + e.replace(/#/g, \"/\")), a.send();\n });\n }\n}\nks.SnippetUrl = \"https://snippet.babylonjs.com\";\nks.CreateFromSnippetAsync = ks.ParseFromSnippetAsync;\nRe(\"BABYLON.ShaderMaterial\", ks);\nclass uI {\n /**\n * Gets the depth/stencil texture (if created by a createDepthStencilTexture() call)\n */\n get depthStencilTexture() {\n return this._depthStencilTexture;\n }\n /**\n * Indicates if the depth/stencil texture has a stencil aspect\n */\n get depthStencilTextureWithStencil() {\n return this._depthStencilTextureWithStencil;\n }\n /**\n * Defines if the render target wrapper is for a cube texture or if false a 2d texture\n */\n get isCube() {\n return this._isCube;\n }\n /**\n * Defines if the render target wrapper is for a single or multi target render wrapper\n */\n get isMulti() {\n return this._isMulti;\n }\n /**\n * Defines if the render target wrapper is for a single or an array of textures\n */\n get is2DArray() {\n return this.layers > 0;\n }\n /**\n * Defines if the render target wrapper is for a 3D texture\n */\n get is3D() {\n return this.depth > 0;\n }\n /**\n * Gets the size of the render target wrapper (used for cubes, as width=height in this case)\n */\n get size() {\n return this.width;\n }\n /**\n * Gets the width of the render target wrapper\n */\n get width() {\n return this._size.width || this._size;\n }\n /**\n * Gets the height of the render target wrapper\n */\n get height() {\n return this._size.height || this._size;\n }\n /**\n * Gets the number of layers of the render target wrapper (only used if is2DArray is true and wrapper is not a multi render target)\n */\n get layers() {\n return this._size.layers || 0;\n }\n /**\n * Gets the depth of the render target wrapper (only used if is3D is true and wrapper is not a multi render target)\n */\n get depth() {\n return this._size.depth || 0;\n }\n /**\n * Gets the render texture. If this is a multi render target, gets the first texture\n */\n get texture() {\n var e;\n return ((e = this._textures) == null ? void 0 : e[0]) ?? null;\n }\n /**\n * Gets the list of render textures. If we are not in a multi render target, the list will be null (use the texture getter instead)\n */\n get textures() {\n return this._textures;\n }\n /**\n * Gets the face indices that correspond to the list of render textures. If we are not in a multi render target, the list will be null\n */\n get faceIndices() {\n return this._faceIndices;\n }\n /**\n * Gets the layer indices that correspond to the list of render textures. If we are not in a multi render target, the list will be null\n */\n get layerIndices() {\n return this._layerIndices;\n }\n /**\n * Gets the sample count of the render target\n */\n get samples() {\n return this._samples;\n }\n /**\n * Sets the sample count of the render target\n * @param value sample count\n * @param initializeBuffers If set to true, the engine will make an initializing call to drawBuffers (only used when isMulti=true).\n * @param force true to force calling the update sample count engine function even if the current sample count is equal to value\n * @returns the sample count that has been set\n */\n setSamples(e, t = !0, i = !1) {\n if (this.samples === e && !i)\n return e;\n const r = this._isMulti ? this._engine.updateMultipleRenderTargetTextureSampleCount(this, e, t) : this._engine.updateRenderTargetTextureSampleCount(this, e);\n return this._samples = e, r;\n }\n /**\n * Initializes the render target wrapper\n * @param isMulti true if the wrapper is a multi render target\n * @param isCube true if the wrapper should render to a cube texture\n * @param size size of the render target (width/height/layers)\n * @param engine engine used to create the render target\n * @param label defines the label to use for the wrapper (for debugging purpose only)\n */\n constructor(e, t, i, r, s) {\n this._textures = null, this._faceIndices = null, this._layerIndices = null, this._samples = 1, this._attachments = null, this._generateStencilBuffer = !1, this._generateDepthBuffer = !1, this._depthStencilTextureWithStencil = !1, this._isMulti = e, this._isCube = t, this._size = i, this._engine = r, this._depthStencilTexture = null, this.label = s;\n }\n /**\n * Sets the render target texture(s)\n * @param textures texture(s) to set\n */\n setTextures(e) {\n Array.isArray(e) ? this._textures = e : e ? this._textures = [e] : this._textures = null;\n }\n /**\n * Set a texture in the textures array\n * @param texture The texture to set\n * @param index The index in the textures array to set\n * @param disposePrevious If this function should dispose the previous texture\n */\n setTexture(e, t = 0, i = !0) {\n this._textures || (this._textures = []), this._textures[t] !== e && (this._textures[t] && i && this._textures[t].dispose(), this._textures[t] = e);\n }\n /**\n * Sets the layer and face indices of every render target texture bound to each color attachment\n * @param layers The layers of each texture to be set\n * @param faces The faces of each texture to be set\n */\n setLayerAndFaceIndices(e, t) {\n this._layerIndices = e, this._faceIndices = t;\n }\n /**\n * Sets the layer and face indices of a texture in the textures array that should be bound to each color attachment\n * @param index The index of the texture in the textures array to modify\n * @param layer The layer of the texture to be set\n * @param face The face of the texture to be set\n */\n setLayerAndFaceIndex(e = 0, t, i) {\n this._layerIndices || (this._layerIndices = []), this._faceIndices || (this._faceIndices = []), t !== void 0 && t >= 0 && (this._layerIndices[e] = t), i !== void 0 && i >= 0 && (this._faceIndices[e] = i);\n }\n /**\n * Creates the depth/stencil texture\n * @param comparisonFunction Comparison function to use for the texture\n * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture\n * @param generateStencil true if the stencil aspect should also be created\n * @param samples sample count to use when creating the texture\n * @param format format of the depth texture\n * @param label defines the label to use for the texture (for debugging purpose only)\n * @returns the depth/stencil created texture\n */\n createDepthStencilTexture(e = 0, t = !0, i = !1, r = 1, s = 14, a) {\n var o;\n return (o = this._depthStencilTexture) == null || o.dispose(), this._depthStencilTextureWithStencil = i, this._depthStencilTextureLabel = a, this._depthStencilTexture = this._engine.createDepthStencilTexture(this._size, {\n bilinearFiltering: t,\n comparisonFunction: e,\n generateStencil: i,\n isCube: this._isCube,\n samples: r,\n depthTextureFormat: s,\n label: a\n }, this), this._depthStencilTexture;\n }\n /**\n * Shares the depth buffer of this render target with another render target.\n * @internal\n * @param renderTarget Destination renderTarget\n */\n _shareDepth(e) {\n this._depthStencilTexture && (e._depthStencilTexture && e._depthStencilTexture.dispose(), e._depthStencilTexture = this._depthStencilTexture, this._depthStencilTexture.incrementReferences());\n }\n /**\n * @internal\n */\n _swapAndDie(e) {\n this.texture && this.texture._swapAndDie(e), this._textures = null, this.dispose(!0);\n }\n _cloneRenderTargetWrapper() {\n var t, i, r, s, a;\n let e = null;\n if (this._isMulti) {\n const o = this.textures;\n if (o && o.length > 0) {\n let l = !1, c = o.length, h = -1;\n const u = o[o.length - 1]._source;\n (u === Dt.Depth || u === Dt.DepthStencil) && (l = !0, h = o[o.length - 1].format, c--);\n const f = [], d = [], p = [], g = [], m = [], v = [], E = [], C = {};\n for (let x = 0; x < c; ++x) {\n const S = o[x];\n f.push(S.samplingMode), d.push(S.type), p.push(S.format), C[S.uniqueId] !== void 0 ? (g.push(-1), E.push(0)) : (C[S.uniqueId] = x, S.is2DArray ? (g.push(35866), E.push(S.depth)) : S.isCube ? (g.push(34067), E.push(0)) : S.is3D ? (g.push(32879), E.push(S.depth)) : (g.push(3553), E.push(0))), this._faceIndices && m.push(this._faceIndices[x] ?? 0), this._layerIndices && v.push(this._layerIndices[x] ?? 0);\n }\n const T = {\n samplingModes: f,\n generateMipMaps: o[0].generateMipMaps,\n generateDepthBuffer: this._generateDepthBuffer,\n generateStencilBuffer: this._generateStencilBuffer,\n generateDepthTexture: l,\n depthTextureFormat: h,\n types: d,\n formats: p,\n textureCount: c,\n targetTypes: g,\n faceIndex: m,\n layerIndex: v,\n layerCounts: E,\n label: this.label\n }, R = {\n width: this.width,\n height: this.height,\n depth: this.depth\n };\n e = this._engine.createMultipleRenderTarget(R, T);\n for (let x = 0; x < c; ++x) {\n if (g[x] !== -1)\n continue;\n const S = C[o[x].uniqueId];\n e.setTexture(e.textures[S], x);\n }\n }\n } else {\n const o = {};\n if (o.generateDepthBuffer = this._generateDepthBuffer, o.generateMipMaps = ((t = this.texture) == null ? void 0 : t.generateMipMaps) ?? !1, o.generateStencilBuffer = this._generateStencilBuffer, o.samplingMode = (i = this.texture) == null ? void 0 : i.samplingMode, o.type = (r = this.texture) == null ? void 0 : r.type, o.format = (s = this.texture) == null ? void 0 : s.format, o.noColorAttachment = !this._textures, o.label = this.label, this.isCube)\n e = this._engine.createRenderTargetCubeTexture(this.width, o);\n else {\n const l = {\n width: this.width,\n height: this.height,\n layers: this.is2DArray || this.is3D ? (a = this.texture) == null ? void 0 : a.depth : void 0\n };\n e = this._engine.createRenderTargetTexture(l, o);\n }\n e.texture && (e.texture.isReady = !0);\n }\n return e;\n }\n _swapRenderTargetWrapper(e) {\n if (this._textures && e._textures)\n for (let t = 0; t < this._textures.length; ++t)\n this._textures[t]._swapAndDie(e._textures[t], !1), e._textures[t].isReady = !0;\n this._depthStencilTexture && e._depthStencilTexture && (this._depthStencilTexture._swapAndDie(e._depthStencilTexture), e._depthStencilTexture.isReady = !0), this._textures = null, this._depthStencilTexture = null;\n }\n /** @internal */\n _rebuild() {\n const e = this._cloneRenderTargetWrapper();\n if (e) {\n if (this._depthStencilTexture) {\n const t = this._depthStencilTexture.samplingMode, i = this._depthStencilTexture.format, r = t === 2 || t === 3 || t === 11;\n e.createDepthStencilTexture(this._depthStencilTexture._comparisonFunction, r, this._depthStencilTextureWithStencil, this._depthStencilTexture.samples, i, this._depthStencilTextureLabel);\n }\n this.samples > 1 && e.setSamples(this.samples), e._swapRenderTargetWrapper(this), e.dispose();\n }\n }\n /**\n * Releases the internal render textures\n */\n releaseTextures() {\n var e;\n if (this._textures)\n for (let t = 0; t < ((e = this._textures) == null ? void 0 : e.length); ++t)\n this._textures[t].dispose();\n this._textures = null;\n }\n /**\n * Disposes the whole render target wrapper\n * @param disposeOnlyFramebuffers true if only the frame buffers should be released (used for the WebGL engine). If false, all the textures will also be released\n */\n dispose(e = !1) {\n var t;\n e || ((t = this._depthStencilTexture) == null || t.dispose(), this._depthStencilTexture = null, this.releaseTextures()), this._engine._releaseRenderTargetWrapper(this);\n }\n}\nclass fI extends uI {\n constructor(e, t, i, r, s) {\n super(e, t, i, r), this._framebuffer = null, this._depthStencilBuffer = null, this._MSAAFramebuffer = null, this._colorTextureArray = null, this._depthStencilTextureArray = null, this._disposeOnlyFramebuffers = !1, this._currentLOD = 0, this._context = s;\n }\n _cloneRenderTargetWrapper() {\n let e = null;\n return this._colorTextureArray && this._depthStencilTextureArray ? (e = this._engine.createMultiviewRenderTargetTexture(this.width, this.height), e.texture.isReady = !0) : e = super._cloneRenderTargetWrapper(), e;\n }\n _swapRenderTargetWrapper(e) {\n super._swapRenderTargetWrapper(e), e._framebuffer = this._framebuffer, e._depthStencilBuffer = this._depthStencilBuffer, e._MSAAFramebuffer = this._MSAAFramebuffer, e._colorTextureArray = this._colorTextureArray, e._depthStencilTextureArray = this._depthStencilTextureArray, this._framebuffer = this._depthStencilBuffer = this._MSAAFramebuffer = this._colorTextureArray = this._depthStencilTextureArray = null;\n }\n /**\n * Creates the depth/stencil texture\n * @param comparisonFunction Comparison function to use for the texture\n * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture\n * @param generateStencil true if the stencil aspect should also be created\n * @param samples sample count to use when creating the texture\n * @param format format of the depth texture\n * @param label defines the label to use for the texture (for debugging purpose only)\n * @returns the depth/stencil created texture\n */\n createDepthStencilTexture(e = 0, t = !0, i = !1, r = 1, s = 14, a) {\n if (this._depthStencilBuffer) {\n const o = this._engine._currentFramebuffer, l = this._context;\n this._engine._bindUnboundFramebuffer(this._framebuffer), l.framebufferRenderbuffer(l.FRAMEBUFFER, l.DEPTH_STENCIL_ATTACHMENT, l.RENDERBUFFER, null), l.framebufferRenderbuffer(l.FRAMEBUFFER, l.DEPTH_ATTACHMENT, l.RENDERBUFFER, null), l.framebufferRenderbuffer(l.FRAMEBUFFER, l.STENCIL_ATTACHMENT, l.RENDERBUFFER, null), this._engine._bindUnboundFramebuffer(o), l.deleteRenderbuffer(this._depthStencilBuffer), this._depthStencilBuffer = null;\n }\n return super.createDepthStencilTexture(e, t, i, r, s, a);\n }\n /**\n * Shares the depth buffer of this render target with another render target.\n * @internal\n * @param renderTarget Destination renderTarget\n */\n _shareDepth(e) {\n super._shareDepth(e);\n const t = this._context, i = this._depthStencilBuffer, r = e._MSAAFramebuffer || e._framebuffer;\n e._depthStencilBuffer && e._depthStencilBuffer !== i && t.deleteRenderbuffer(e._depthStencilBuffer), e._depthStencilBuffer = i;\n const s = e._generateStencilBuffer ? t.DEPTH_STENCIL_ATTACHMENT : t.DEPTH_ATTACHMENT;\n this._engine._bindUnboundFramebuffer(r), t.framebufferRenderbuffer(t.FRAMEBUFFER, s, t.RENDERBUFFER, i), this._engine._bindUnboundFramebuffer(null);\n }\n /**\n * Binds a texture to this render target on a specific attachment\n * @param texture The texture to bind to the framebuffer\n * @param attachmentIndex Index of the attachment\n * @param faceIndexOrLayer The face or layer of the texture to render to in case of cube texture or array texture\n * @param lodLevel defines the lod level to bind to the frame buffer\n */\n _bindTextureRenderTarget(e, t = 0, i, r = 0) {\n var o, l;\n if (!e._hardwareTexture)\n return;\n const s = this._framebuffer, a = this._engine._currentFramebuffer;\n if (this._engine._bindUnboundFramebuffer(s), this._engine.webGLVersion > 1) {\n const c = this._context, h = c[\"COLOR_ATTACHMENT\" + t];\n e.is2DArray || e.is3D ? (i = i ?? ((o = this.layerIndices) == null ? void 0 : o[t]) ?? 0, c.framebufferTextureLayer(c.FRAMEBUFFER, h, e._hardwareTexture.underlyingResource, r, i)) : e.isCube ? (i = i ?? ((l = this.faceIndices) == null ? void 0 : l[t]) ?? 0, c.framebufferTexture2D(c.FRAMEBUFFER, h, c.TEXTURE_CUBE_MAP_POSITIVE_X + i, e._hardwareTexture.underlyingResource, r)) : c.framebufferTexture2D(c.FRAMEBUFFER, h, c.TEXTURE_2D, e._hardwareTexture.underlyingResource, r);\n } else {\n const c = this._context, h = c[\"COLOR_ATTACHMENT\" + t + \"_WEBGL\"], u = i !== void 0 ? c.TEXTURE_CUBE_MAP_POSITIVE_X + i : c.TEXTURE_2D;\n c.framebufferTexture2D(c.FRAMEBUFFER, h, u, e._hardwareTexture.underlyingResource, r);\n }\n this._engine._bindUnboundFramebuffer(a);\n }\n /**\n * Set a texture in the textures array\n * @param texture the texture to set\n * @param index the index in the textures array to set\n * @param disposePrevious If this function should dispose the previous texture\n */\n setTexture(e, t = 0, i = !0) {\n super.setTexture(e, t, i), this._bindTextureRenderTarget(e, t);\n }\n /**\n * Sets the layer and face indices of every render target texture\n * @param layers The layer of the texture to be set (make negative to not modify)\n * @param faces The face of the texture to be set (make negative to not modify)\n */\n setLayerAndFaceIndices(e, t) {\n var r;\n if (super.setLayerAndFaceIndices(e, t), !this.textures || !this.layerIndices || !this.faceIndices)\n return;\n const i = ((r = this._attachments) == null ? void 0 : r.length) ?? this.textures.length;\n for (let s = 0; s < i; s++) {\n const a = this.textures[s];\n a && (a.is2DArray || a.is3D ? this._bindTextureRenderTarget(a, s, this.layerIndices[s]) : a.isCube ? this._bindTextureRenderTarget(a, s, this.faceIndices[s]) : this._bindTextureRenderTarget(a, s));\n }\n }\n /**\n * Set the face and layer indices of a texture in the textures array\n * @param index The index of the texture in the textures array to modify\n * @param layer The layer of the texture to be set\n * @param face The face of the texture to be set\n */\n setLayerAndFaceIndex(e = 0, t, i) {\n if (super.setLayerAndFaceIndex(e, t, i), !this.textures || !this.layerIndices || !this.faceIndices)\n return;\n const r = this.textures[e];\n r.is2DArray || r.is3D ? this._bindTextureRenderTarget(this.textures[e], e, this.layerIndices[e]) : r.isCube && this._bindTextureRenderTarget(this.textures[e], e, this.faceIndices[e]);\n }\n dispose(e = this._disposeOnlyFramebuffers) {\n const t = this._context;\n e || (this._colorTextureArray && (this._context.deleteTexture(this._colorTextureArray), this._colorTextureArray = null), this._depthStencilTextureArray && (this._context.deleteTexture(this._depthStencilTextureArray), this._depthStencilTextureArray = null)), this._framebuffer && (t.deleteFramebuffer(this._framebuffer), this._framebuffer = null), this._depthStencilBuffer && (t.deleteRenderbuffer(this._depthStencilBuffer), this._depthStencilBuffer = null), this._MSAAFramebuffer && (t.deleteFramebuffer(this._MSAAFramebuffer), this._MSAAFramebuffer = null), super.dispose(e);\n }\n}\nDe.prototype._createHardwareRenderTargetWrapper = function(n, e, t) {\n const i = new fI(n, e, t, this, this._gl);\n return this._renderTargetWrapperCache.push(i), i;\n};\nDe.prototype.createRenderTargetTexture = function(n, e) {\n const t = this._createHardwareRenderTargetWrapper(!1, !1, n);\n let i = !0, r = !1, s = !1, a, o = 1, l;\n e !== void 0 && typeof e == \"object\" && (i = e.generateDepthBuffer ?? !0, r = !!e.generateStencilBuffer, s = !!e.noColorAttachment, a = e.colorAttachment, o = e.samples ?? 1, l = e.label);\n const c = a || (s ? null : this._createInternalTexture(n, e, !0, Dt.RenderTarget)), h = n.width || n, u = n.height || n, f = this._currentFramebuffer, d = this._gl, p = d.createFramebuffer();\n return this._bindUnboundFramebuffer(p), t._depthStencilBuffer = this._setupFramebufferDepthAttachments(r, i, h, u), c && !c.is2DArray && !c.is3D && d.framebufferTexture2D(d.FRAMEBUFFER, d.COLOR_ATTACHMENT0, d.TEXTURE_2D, c._hardwareTexture.underlyingResource, 0), this._bindUnboundFramebuffer(f), t.label = l ?? \"RenderTargetWrapper\", t._framebuffer = p, t._generateDepthBuffer = i, t._generateStencilBuffer = r, t.setTextures(c), this.updateRenderTargetTextureSampleCount(t, o), t;\n};\nDe.prototype.createDepthStencilTexture = function(n, e, t) {\n if (e.isCube) {\n const i = n.width || n;\n return this._createDepthStencilCubeTexture(i, e);\n } else\n return this._createDepthStencilTexture(n, e, t);\n};\nDe.prototype._createDepthStencilTexture = function(n, e) {\n const t = this._gl, i = n.layers || 0, r = n.depth || 0;\n let s = t.TEXTURE_2D;\n i !== 0 ? s = t.TEXTURE_2D_ARRAY : r !== 0 && (s = t.TEXTURE_3D);\n const a = new ar(this, Dt.DepthStencil);\n if (a.label = e.label, !this._caps.depthTextureExtension)\n return ne.Error(\"Depth texture is not supported by your browser or hardware.\"), a;\n const o = {\n bilinearFiltering: !1,\n comparisonFunction: 0,\n generateStencil: !1,\n ...e\n };\n if (this._bindTextureDirectly(s, a, !0), this._setupDepthStencilTexture(a, n, o.generateStencil, o.comparisonFunction === 0 ? !1 : o.bilinearFiltering, o.comparisonFunction, o.samples), o.depthTextureFormat !== void 0) {\n if (o.depthTextureFormat !== 15 && o.depthTextureFormat !== 16 && o.depthTextureFormat !== 17 && o.depthTextureFormat !== 13 && o.depthTextureFormat !== 14 && o.depthTextureFormat !== 18)\n return ne.Error(\"Depth texture format is not supported.\"), a;\n a.format = o.depthTextureFormat;\n } else\n a.format = o.generateStencil ? 13 : 16;\n const l = a.format === 17 || a.format === 13 || a.format === 18;\n let c = t.UNSIGNED_INT;\n a.format === 15 ? c = t.UNSIGNED_SHORT : a.format === 17 || a.format === 13 ? c = t.UNSIGNED_INT_24_8 : a.format === 14 ? c = t.FLOAT : a.format === 18 && (c = t.FLOAT_32_UNSIGNED_INT_24_8_REV);\n const h = l ? t.DEPTH_STENCIL : t.DEPTH_COMPONENT;\n let u = h;\n return this.webGLVersion > 1 && (a.format === 15 ? u = t.DEPTH_COMPONENT16 : a.format === 16 ? u = t.DEPTH_COMPONENT24 : a.format === 17 || a.format === 13 ? u = t.DEPTH24_STENCIL8 : a.format === 14 ? u = t.DEPTH_COMPONENT32F : a.format === 18 && (u = t.DEPTH32F_STENCIL8)), a.is2DArray ? t.texImage3D(s, 0, u, a.width, a.height, i, 0, h, c, null) : a.is3D ? t.texImage3D(s, 0, u, a.width, a.height, r, 0, h, c, null) : t.texImage2D(s, 0, u, a.width, a.height, 0, h, c, null), this._bindTextureDirectly(s, null), this._internalTexturesCache.push(a), a;\n};\nDe.prototype.updateRenderTargetTextureSampleCount = function(n, e) {\n if (this.webGLVersion < 2 || !n || !n.texture)\n return 1;\n if (n.samples === e)\n return e;\n const t = this._gl;\n e = Math.min(e, this.getCaps().maxMSAASamples), n._depthStencilBuffer && (t.deleteRenderbuffer(n._depthStencilBuffer), n._depthStencilBuffer = null), n._MSAAFramebuffer && (t.deleteFramebuffer(n._MSAAFramebuffer), n._MSAAFramebuffer = null);\n const i = n.texture._hardwareTexture;\n if (i.releaseMSAARenderBuffers(), e > 1 && typeof t.renderbufferStorageMultisample == \"function\") {\n const r = t.createFramebuffer();\n if (!r)\n throw new Error(\"Unable to create multi sampled framebuffer\");\n n._MSAAFramebuffer = r, this._bindUnboundFramebuffer(n._MSAAFramebuffer);\n const s = this._createRenderBuffer(n.texture.width, n.texture.height, e, -1, this._getRGBABufferInternalSizedFormat(n.texture.type, n.texture.format, n.texture._useSRGBBuffer), t.COLOR_ATTACHMENT0, !1);\n if (!s)\n throw new Error(\"Unable to create multi sampled framebuffer\");\n i.addMSAARenderBuffer(s);\n } else\n this._bindUnboundFramebuffer(n._framebuffer);\n return n.texture.samples = e, n._samples = e, n._depthStencilBuffer = this._setupFramebufferDepthAttachments(n._generateStencilBuffer, n._generateDepthBuffer, n.texture.width, n.texture.height, e), this._bindUnboundFramebuffer(null), e;\n};\nDe.prototype.createRenderTargetCubeTexture = function(n, e) {\n const t = this._createHardwareRenderTargetWrapper(!1, !0, n), i = {\n generateMipMaps: !0,\n generateDepthBuffer: !0,\n generateStencilBuffer: !1,\n type: 0,\n samplingMode: 3,\n format: 5,\n ...e\n };\n i.generateStencilBuffer = i.generateDepthBuffer && i.generateStencilBuffer, (i.type === 1 && !this._caps.textureFloatLinearFiltering || i.type === 2 && !this._caps.textureHalfFloatLinearFiltering) && (i.samplingMode = 1);\n const r = this._gl, s = new ar(this, Dt.RenderTarget);\n this._bindTextureDirectly(r.TEXTURE_CUBE_MAP, s, !0);\n const a = this._getSamplingParameters(i.samplingMode, i.generateMipMaps);\n i.type === 1 && !this._caps.textureFloat && (i.type = 0, ne.Warn(\"Float textures are not supported. Cube render target forced to TEXTURETYPE_UNESIGNED_BYTE type\")), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_MAG_FILTER, a.mag), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_MIN_FILTER, a.min), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_WRAP_S, r.CLAMP_TO_EDGE), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_WRAP_T, r.CLAMP_TO_EDGE);\n for (let l = 0; l < 6; l++)\n r.texImage2D(r.TEXTURE_CUBE_MAP_POSITIVE_X + l, 0, this._getRGBABufferInternalSizedFormat(i.type, i.format), n, n, 0, this._getInternalFormat(i.format), this._getWebGLTextureType(i.type), null);\n const o = r.createFramebuffer();\n return this._bindUnboundFramebuffer(o), t._depthStencilBuffer = this._setupFramebufferDepthAttachments(i.generateStencilBuffer, i.generateDepthBuffer, n, n), i.generateMipMaps && r.generateMipmap(r.TEXTURE_CUBE_MAP), this._bindTextureDirectly(r.TEXTURE_CUBE_MAP, null), this._bindUnboundFramebuffer(null), t._framebuffer = o, t._generateDepthBuffer = i.generateDepthBuffer, t._generateStencilBuffer = i.generateStencilBuffer, s.width = n, s.height = n, s.isReady = !0, s.isCube = !0, s.samples = 1, s.generateMipMaps = i.generateMipMaps, s.samplingMode = i.samplingMode, s.type = i.type, s.format = i.format, this._internalTexturesCache.push(s), t.setTextures(s), t;\n};\nconst dI = \"postprocessVertexShader\", pI = `attribute vec2 position;uniform vec2 scale;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5);\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvUV=(position*madd+madd)*scale;gl_Position=vec4(position,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[dI] = pI;\nconst Wh = {\n positions: [1, 1, -1, 1, -1, -1, 1, -1],\n indices: [0, 1, 2, 0, 2, 3]\n};\nclass c0 {\n /**\n * Creates an effect renderer\n * @param engine the engine to use for rendering\n * @param options defines the options of the effect renderer\n */\n constructor(e, t = Wh) {\n this._fullscreenViewport = new Eo(0, 0, 1, 1);\n const i = t.positions ?? Wh.positions, r = t.indices ?? Wh.indices;\n this.engine = e, this._vertexBuffers = {\n [I.PositionKind]: new I(e, i, I.PositionKind, !1, !1, 2)\n }, this._indexBuffer = e.createIndexBuffer(r), this._onContextRestoredObserver = e.onContextRestoredObservable.add(() => {\n this._indexBuffer = e.createIndexBuffer(r);\n for (const s in this._vertexBuffers)\n this._vertexBuffers[s]._rebuild();\n });\n }\n /**\n * Sets the current viewport in normalized coordinates 0-1\n * @param viewport Defines the viewport to set (defaults to 0 0 1 1)\n */\n setViewport(e = this._fullscreenViewport) {\n this.engine.setViewport(e);\n }\n /**\n * Binds the embedded attributes buffer to the effect.\n * @param effect Defines the effect to bind the attributes for\n */\n bindBuffers(e) {\n this.engine.bindBuffers(this._vertexBuffers, this._indexBuffer, e);\n }\n /**\n * Sets the current effect wrapper to use during draw.\n * The effect needs to be ready before calling this api.\n * This also sets the default full screen position attribute.\n * @param effectWrapper Defines the effect to draw with\n */\n applyEffectWrapper(e) {\n this.engine.setState(!0), this.engine.depthCullingState.depthTest = !1, this.engine.stencilState.stencilTest = !1, this.engine.enableEffect(e._drawWrapper), this.bindBuffers(e.effect), e.onApplyObservable.notifyObservers({});\n }\n /**\n * Saves engine states\n */\n saveStates() {\n this._savedStateDepthTest = this.engine.depthCullingState.depthTest, this._savedStateStencilTest = this.engine.stencilState.stencilTest;\n }\n /**\n * Restores engine states\n */\n restoreStates() {\n this.engine.depthCullingState.depthTest = this._savedStateDepthTest, this.engine.stencilState.stencilTest = this._savedStateStencilTest;\n }\n /**\n * Draws a full screen quad.\n */\n draw() {\n this.engine.drawElementsType(0, 0, 6);\n }\n _isRenderTargetTexture(e) {\n return e.renderTarget !== void 0;\n }\n /**\n * renders one or more effects to a specified texture\n * @param effectWrapper the effect to renderer\n * @param outputTexture texture to draw to, if null it will render to the screen.\n */\n render(e, t = null) {\n if (!e.effect.isReady())\n return;\n this.saveStates(), this.setViewport();\n const i = t === null ? null : this._isRenderTargetTexture(t) ? t.renderTarget : t;\n i && this.engine.bindFramebuffer(i), this.applyEffectWrapper(e), this.draw(), i && this.engine.unBindFramebuffer(i), this.restoreStates();\n }\n /**\n * Disposes of the effect renderer\n */\n dispose() {\n const e = this._vertexBuffers[I.PositionKind];\n e && (e.dispose(), delete this._vertexBuffers[I.PositionKind]), this._indexBuffer && this.engine._releaseBuffer(this._indexBuffer), this._onContextRestoredObserver && (this.engine.onContextRestoredObservable.remove(this._onContextRestoredObserver), this._onContextRestoredObserver = null);\n }\n}\nclass h0 {\n /**\n * The underlying effect\n */\n get effect() {\n return this._drawWrapper.effect;\n }\n set effect(e) {\n this._drawWrapper.effect = e;\n }\n /**\n * Creates an effect to be renderer\n * @param creationOptions options to create the effect\n */\n constructor(e) {\n this.onApplyObservable = new he();\n let t;\n const i = e.uniformNames || [];\n e.vertexShader ? t = {\n fragmentSource: e.fragmentShader,\n vertexSource: e.vertexShader,\n spectorName: e.name || \"effectWrapper\"\n } : (i.push(\"scale\"), t = {\n fragmentSource: e.fragmentShader,\n vertex: \"postprocess\",\n spectorName: e.name || \"effectWrapper\"\n }, this.onApplyObservable.add(() => {\n this.effect.setFloat2(\"scale\", 1, 1);\n }));\n const r = e.defines ? e.defines.join(`\n`) : \"\";\n this._drawWrapper = new ka(e.engine), e.useShaderStore ? (t.fragment = t.fragmentSource, t.vertex || (t.vertex = t.vertexSource), delete t.fragmentSource, delete t.vertexSource, this.effect = e.engine.createEffect(t, e.attributeNames || [\"position\"], i, e.samplerNames, r, void 0, e.onCompiled, void 0, void 0, e.shaderLanguage)) : (this.effect = new Hi(t, e.attributeNames || [\"position\"], i, e.samplerNames, e.engine, r, void 0, e.onCompiled, void 0, void 0, void 0, e.shaderLanguage), this._onContextRestoredObserver = e.engine.onContextRestoredObservable.add(() => {\n this.effect._pipelineContext = null, this.effect._prepareEffect();\n }));\n }\n /**\n * Disposes of the effect wrapper\n */\n dispose() {\n this._onContextRestoredObserver && (this.effect.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver), this._onContextRestoredObserver = null), this.effect.dispose();\n }\n}\nconst u0 = \"passPixelShader\", f0 = `varying vec2 vUV;uniform sampler2D textureSampler;\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) \n{gl_FragColor=texture2D(textureSampler,vUV);}`;\nY.ShadersStore[u0] = f0;\nconst fg = { name: u0, shader: f0 };\nclass Ni {\n static _CreateDumpRenderer() {\n if (!Ni._DumpToolsEngine) {\n let e, t = null;\n const i = {\n preserveDrawingBuffer: !0,\n depth: !1,\n stencil: !1,\n alpha: !0,\n premultipliedAlpha: !1,\n antialias: !1,\n failIfMajorPerformanceCaveat: !1\n };\n try {\n e = new OffscreenCanvas(100, 100), t = new De(e, !1, i);\n } catch {\n e = document.createElement(\"canvas\"), t = new De(e, !1, i);\n }\n t.getCaps().parallelShaderCompile = void 0;\n const r = new c0(t), s = new h0({\n engine: t,\n name: fg.name,\n fragmentShader: fg.shader,\n samplerNames: [\"textureSampler\"]\n });\n Ni._DumpToolsEngine = {\n canvas: e,\n engine: t,\n renderer: r,\n wrapper: s\n };\n }\n return Ni._DumpToolsEngine;\n }\n /**\n * Dumps the current bound framebuffer\n * @param width defines the rendering width\n * @param height defines the rendering height\n * @param engine defines the hosting engine\n * @param successCallback defines the callback triggered once the data are available\n * @param mimeType defines the mime type of the result\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n * @returns a void promise\n */\n static async DumpFramebuffer(e, t, i, r, s = \"image/png\", a, o) {\n const l = await i.readPixels(0, 0, e, t), c = new Uint8Array(l.buffer);\n Ni.DumpData(e, t, c, r, s, a, !0, void 0, o);\n }\n /**\n * Dumps an array buffer\n * @param width defines the rendering width\n * @param height defines the rendering height\n * @param data the data array\n * @param mimeType defines the mime type of the result\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\n * @param invertY true to invert the picture in the Y dimension\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n * @returns a promise that resolve to the final data\n */\n static DumpDataAsync(e, t, i, r = \"image/png\", s, a = !1, o = !1, l) {\n return new Promise((c) => {\n Ni.DumpData(e, t, i, (h) => c(h), r, s, a, o, l);\n });\n }\n /**\n * Dumps an array buffer\n * @param width defines the rendering width\n * @param height defines the rendering height\n * @param data the data array\n * @param successCallback defines the callback triggered once the data are available\n * @param mimeType defines the mime type of the result\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\n * @param invertY true to invert the picture in the Y dimension\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n */\n static DumpData(e, t, i, r, s = \"image/png\", a, o = !1, l = !1, c) {\n const h = Ni._CreateDumpRenderer();\n if (h.engine.setSize(e, t, !0), i instanceof Float32Array) {\n const f = new Uint8Array(i.length);\n let d = i.length;\n for (; d--; ) {\n const p = i[d];\n f[d] = Math.round(je.Clamp(p) * 255);\n }\n i = f;\n }\n const u = h.engine.createRawTexture(i, e, t, 5, !1, !o, 1);\n h.renderer.setViewport(), h.renderer.applyEffectWrapper(h.wrapper), h.wrapper.effect._bindTexture(\"textureSampler\", u), h.renderer.draw(), l ? ge.ToBlob(h.canvas, (f) => {\n const d = new FileReader();\n d.onload = (p) => {\n const g = p.target.result;\n r && r(g);\n }, d.readAsArrayBuffer(f);\n }, s, c) : ge.EncodeScreenshotCanvasData(h.canvas, r, s, a, c), u.dispose();\n }\n /**\n * Dispose the dump tools associated resources\n */\n static Dispose() {\n Ni._DumpToolsEngine && (Ni._DumpToolsEngine.wrapper.dispose(), Ni._DumpToolsEngine.renderer.dispose(), Ni._DumpToolsEngine.engine.dispose()), Ni._DumpToolsEngine = null;\n }\n}\nconst gI = () => {\n ge.DumpData = Ni.DumpData, ge.DumpDataAsync = Ni.DumpDataAsync, ge.DumpFramebuffer = Ni.DumpFramebuffer;\n};\ngI();\nclass gr extends le {\n /**\n * Use this list to define the list of mesh you want to render.\n */\n get renderList() {\n return this._renderList;\n }\n set renderList(e) {\n this._unObserveRenderList && (this._unObserveRenderList(), this._unObserveRenderList = null), e && (this._unObserveRenderList = z_(e, this._renderListHasChanged)), this._renderList = e;\n }\n /**\n * Post-processes for this render target\n */\n get postProcesses() {\n return this._postProcesses;\n }\n get _prePassEnabled() {\n return !!this._prePassRenderTarget && this._prePassRenderTarget.enabled;\n }\n /**\n * Set a after unbind callback in the texture.\n * This has been kept for backward compatibility and use of onAfterUnbindObservable is recommended.\n */\n set onAfterUnbind(e) {\n this._onAfterUnbindObserver && this.onAfterUnbindObservable.remove(this._onAfterUnbindObserver), this._onAfterUnbindObserver = this.onAfterUnbindObservable.add(e);\n }\n /**\n * Set a before render callback in the texture.\n * This has been kept for backward compatibility and use of onBeforeRenderObservable is recommended.\n */\n set onBeforeRender(e) {\n this._onBeforeRenderObserver && this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver), this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(e);\n }\n /**\n * Set a after render callback in the texture.\n * This has been kept for backward compatibility and use of onAfterRenderObservable is recommended.\n */\n set onAfterRender(e) {\n this._onAfterRenderObserver && this.onAfterRenderObservable.remove(this._onAfterRenderObserver), this._onAfterRenderObserver = this.onAfterRenderObservable.add(e);\n }\n /**\n * Set a clear callback in the texture.\n * This has been kept for backward compatibility and use of onClearObservable is recommended.\n */\n set onClear(e) {\n this._onClearObserver && this.onClearObservable.remove(this._onClearObserver), this._onClearObserver = this.onClearObservable.add(e);\n }\n /**\n * Gets the render pass ids used by the render target texture. For a single render target the array length will be 1, for a cube texture it will be 6 and for\n * a 2D texture array it will return an array of ids the size of the 2D texture array\n */\n get renderPassIds() {\n return this._renderPassIds;\n }\n /**\n * Gets the current value of the refreshId counter\n */\n get currentRefreshId() {\n return this._currentRefreshId;\n }\n /**\n * Sets a specific material to be used to render a mesh/a list of meshes in this render target texture\n * @param mesh mesh or array of meshes\n * @param material material or array of materials to use for this render pass. If undefined is passed, no specific material will be used but the regular material instead (mesh.material). It's possible to provide an array of materials to use a different material for each rendering in the case of a cube texture (6 rendering) and a 2D texture array (as many rendering as the length of the array)\n */\n setMaterialForRendering(e, t) {\n let i;\n Array.isArray(e) ? i = e : i = [e];\n for (let r = 0; r < i.length; ++r)\n for (let s = 0; s < this._renderPassIds.length; ++s)\n i[r].setMaterialForRenderPass(this._renderPassIds[s], t !== void 0 ? Array.isArray(t) ? t[s] : t : void 0);\n }\n /**\n * Define if the texture has multiple draw buffers or if false a single draw buffer.\n */\n get isMulti() {\n var e;\n return ((e = this._renderTarget) == null ? void 0 : e.isMulti) ?? !1;\n }\n /**\n * Gets render target creation options that were used.\n */\n get renderTargetOptions() {\n return this._renderTargetOptions;\n }\n /**\n * Gets the render target wrapper associated with this render target\n */\n get renderTarget() {\n return this._renderTarget;\n }\n _onRatioRescale() {\n this._sizeRatio && this.resize(this._initialSizeParameter);\n }\n /**\n * Gets or sets the size of the bounding box associated with the texture (when in cube mode)\n * When defined, the cubemap will switch to local mode\n * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity\n * @example https://www.babylonjs-playground.com/#RNASML\n */\n set boundingBoxSize(e) {\n if (this._boundingBoxSize && this._boundingBoxSize.equals(e))\n return;\n this._boundingBoxSize = e;\n const t = this.getScene();\n t && t.markAllMaterialsAsDirty(1);\n }\n get boundingBoxSize() {\n return this._boundingBoxSize;\n }\n /**\n * In case the RTT has been created with a depth texture, get the associated\n * depth texture.\n * Otherwise, return null.\n */\n get depthStencilTexture() {\n var e;\n return ((e = this._renderTarget) == null ? void 0 : e._depthStencilTexture) ?? null;\n }\n /** @internal */\n constructor(e, t, i, r = !1, s = !0, a = 0, o = !1, l = le.TRILINEAR_SAMPLINGMODE, c = !0, h = !1, u = !1, f = 5, d = !1, p, g, m = !1, v = !1) {\n let E, C = !0;\n if (typeof r == \"object\") {\n const R = r;\n r = !!R.generateMipMaps, s = R.doNotChangeAspectRatio ?? !0, a = R.type ?? 0, o = !!R.isCube, l = R.samplingMode ?? le.TRILINEAR_SAMPLINGMODE, c = R.generateDepthBuffer ?? !0, h = !!R.generateStencilBuffer, u = !!R.isMulti, f = R.format ?? 5, d = !!R.delayAllocation, p = R.samples, g = R.creationFlags, m = !!R.noColorAttachment, v = !!R.useSRGBBuffer, E = R.colorAttachment, C = R.gammaSpace ?? C;\n }\n if (super(null, i, !r, void 0, l, void 0, void 0, void 0, void 0, f), this._unObserveRenderList = null, this._renderListHasChanged = (R, x) => {\n var M;\n const S = this._renderList ? this._renderList.length : 0;\n (x === 0 && S > 0 || S === 0) && ((M = this.getScene()) == null || M.meshes.forEach((N) => {\n N._markSubMeshesAsLightDirty();\n }));\n }, this.renderParticles = !0, this.renderSprites = !1, this.forceLayerMaskCheck = !1, this.ignoreCameraViewport = !1, this.onBeforeBindObservable = new he(), this.onAfterUnbindObservable = new he(), this.onBeforeRenderObservable = new he(), this.onAfterRenderObservable = new he(), this.onClearObservable = new he(), this.onResizeObservable = new he(), this._cleared = !1, this.skipInitialClear = !1, this._currentRefreshId = -1, this._refreshRate = 1, this._samples = 1, this._canRescale = !0, this._renderTarget = null, this.boundingBoxPosition = _.Zero(), i = this.getScene(), !i)\n return;\n const T = this.getScene().getEngine();\n this._gammaSpace = C, this._coordinatesMode = le.PROJECTION_MODE, this.renderList = [], this.name = e, this.isRenderTarget = !0, this._initialSizeParameter = t, this._renderPassIds = [], this._isCubeData = o, this._processSizeParameter(t), this.renderPassId = this._renderPassIds[0], this._resizeObserver = T.onResizeObservable.add(() => {\n }), this._generateMipMaps = !!r, this._doNotChangeAspectRatio = s, this._renderingManager = new Di(i), this._renderingManager._useSceneAutoClearSetup = !0, !u && (this._renderTargetOptions = {\n generateMipMaps: r,\n type: a,\n format: this._format ?? void 0,\n samplingMode: this.samplingMode,\n generateDepthBuffer: c,\n generateStencilBuffer: h,\n samples: p,\n creationFlags: g,\n noColorAttachment: m,\n useSRGBBuffer: v,\n colorAttachment: E,\n label: this.name\n }, this.samplingMode === le.NEAREST_SAMPLINGMODE && (this.wrapU = le.CLAMP_ADDRESSMODE, this.wrapV = le.CLAMP_ADDRESSMODE), d || (o ? (this._renderTarget = i.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions), this.coordinatesMode = le.INVCUBIC_MODE, this._textureMatrix = w.Identity()) : this._renderTarget = i.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions), this._texture = this._renderTarget.texture, p !== void 0 && (this.samples = p)));\n }\n /**\n * Creates a depth stencil texture.\n * This is only available in WebGL 2 or with the depth texture extension available.\n * @param comparisonFunction Specifies the comparison function to set on the texture. If 0 or undefined, the texture is not in comparison mode (default: 0)\n * @param bilinearFiltering Specifies whether or not bilinear filtering is enable on the texture (default: true)\n * @param generateStencil Specifies whether or not a stencil should be allocated in the texture (default: false)\n * @param samples sample count of the depth/stencil texture (default: 1)\n * @param format format of the depth texture (default: 14)\n */\n createDepthStencilTexture(e = 0, t = !0, i = !1, r = 1, s = 14) {\n var a;\n (a = this._renderTarget) == null || a.createDepthStencilTexture(e, t, i, r, s);\n }\n _releaseRenderPassId() {\n if (this._scene) {\n const e = this._scene.getEngine();\n for (let t = 0; t < this._renderPassIds.length; ++t)\n e.releaseRenderPassId(this._renderPassIds[t]);\n }\n this._renderPassIds = [];\n }\n _createRenderPassId() {\n this._releaseRenderPassId();\n const e = this._scene.getEngine(), t = this._isCubeData ? 6 : this.getRenderLayers() || 1;\n for (let i = 0; i < t; ++i)\n this._renderPassIds[i] = e.createRenderPassId(`RenderTargetTexture - ${this.name}#${i}`);\n }\n _processSizeParameter(e, t = !0) {\n if (e.ratio) {\n this._sizeRatio = e.ratio;\n const i = this._getEngine();\n this._size = {\n width: this._bestReflectionRenderTargetDimension(i.getRenderWidth(), this._sizeRatio),\n height: this._bestReflectionRenderTargetDimension(i.getRenderHeight(), this._sizeRatio)\n };\n } else\n this._size = e;\n t && this._createRenderPassId();\n }\n /**\n * Define the number of samples to use in case of MSAA.\n * It defaults to one meaning no MSAA has been enabled.\n */\n get samples() {\n var e;\n return ((e = this._renderTarget) == null ? void 0 : e.samples) ?? this._samples;\n }\n set samples(e) {\n this._renderTarget && (this._samples = this._renderTarget.setSamples(e));\n }\n /**\n * Resets the refresh counter of the texture and start bak from scratch.\n * Could be useful to regenerate the texture if it is setup to render only once.\n */\n resetRefreshCounter() {\n this._currentRefreshId = -1;\n }\n /**\n * Define the refresh rate of the texture or the rendering frequency.\n * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...\n */\n get refreshRate() {\n return this._refreshRate;\n }\n set refreshRate(e) {\n this._refreshRate = e, this.resetRefreshCounter();\n }\n /**\n * Adds a post process to the render target rendering passes.\n * @param postProcess define the post process to add\n */\n addPostProcess(e) {\n if (!this._postProcessManager) {\n const t = this.getScene();\n if (!t)\n return;\n this._postProcessManager = new mu(t), this._postProcesses = new Array();\n }\n this._postProcesses.push(e), this._postProcesses[0].autoClear = !1;\n }\n /**\n * Clear all the post processes attached to the render target\n * @param dispose define if the cleared post processes should also be disposed (false by default)\n */\n clearPostProcesses(e = !1) {\n if (this._postProcesses) {\n if (e)\n for (const t of this._postProcesses)\n t.dispose();\n this._postProcesses = [];\n }\n }\n /**\n * Remove one of the post process from the list of attached post processes to the texture\n * @param postProcess define the post process to remove from the list\n */\n removePostProcess(e) {\n if (!this._postProcesses)\n return;\n const t = this._postProcesses.indexOf(e);\n t !== -1 && (this._postProcesses.splice(t, 1), this._postProcesses.length > 0 && (this._postProcesses[0].autoClear = !1));\n }\n /** @internal */\n _shouldRender() {\n return this._currentRefreshId === -1 ? (this._currentRefreshId = 1, !0) : this.refreshRate === this._currentRefreshId ? (this._currentRefreshId = 1, !0) : (this._currentRefreshId++, !1);\n }\n /**\n * Gets the actual render size of the texture.\n * @returns the width of the render size\n */\n getRenderSize() {\n return this.getRenderWidth();\n }\n /**\n * Gets the actual render width of the texture.\n * @returns the width of the render size\n */\n getRenderWidth() {\n return this._size.width ? this._size.width : this._size;\n }\n /**\n * Gets the actual render height of the texture.\n * @returns the height of the render size\n */\n getRenderHeight() {\n return this._size.width ? this._size.height : this._size;\n }\n /**\n * Gets the actual number of layers of the texture or, in the case of a 3D texture, return the depth.\n * @returns the number of layers\n */\n getRenderLayers() {\n const e = this._size.layers;\n if (e)\n return e;\n const t = this._size.depth;\n return t || 0;\n }\n /**\n * Don't allow this render target texture to rescale. Mainly used to prevent rescaling by the scene optimizer.\n */\n disableRescaling() {\n this._canRescale = !1;\n }\n /**\n * Get if the texture can be rescaled or not.\n */\n get canRescale() {\n return this._canRescale;\n }\n /**\n * Resize the texture using a ratio.\n * @param ratio the ratio to apply to the texture size in order to compute the new target size\n */\n scale(e) {\n const t = Math.max(1, this.getRenderSize() * e);\n this.resize(t);\n }\n /**\n * Get the texture reflection matrix used to rotate/transform the reflection.\n * @returns the reflection matrix\n */\n getReflectionTextureMatrix() {\n return this.isCube ? this._textureMatrix : super.getReflectionTextureMatrix();\n }\n /**\n * Resize the texture to a new desired size.\n * Be careful as it will recreate all the data in the new texture.\n * @param size Define the new size. It can be:\n * - a number for squared texture,\n * - an object containing { width: number, height: number }\n * - or an object containing a ratio { ratio: number }\n */\n resize(e) {\n var r;\n const t = this.isCube;\n (r = this._renderTarget) == null || r.dispose(), this._renderTarget = null;\n const i = this.getScene();\n i && (this._processSizeParameter(e, !1), t ? this._renderTarget = i.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions) : this._renderTarget = i.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions), this._texture = this._renderTarget.texture, this._renderTargetOptions.samples !== void 0 && (this.samples = this._renderTargetOptions.samples), this.onResizeObservable.hasObservers() && this.onResizeObservable.notifyObservers(this));\n }\n /**\n * Renders all the objects from the render list into the texture.\n * @param useCameraPostProcess Define if camera post processes should be used during the rendering\n * @param dumpForDebug Define if the rendering result should be dumped (copied) for debugging purpose\n */\n render(e = !1, t = !1) {\n this._render(e, t);\n }\n /**\n * This function will check if the render target texture can be rendered (textures are loaded, shaders are compiled)\n * @returns true if all required resources are ready\n */\n isReadyForRendering() {\n return this._render(!1, !1, !0);\n }\n _render(e = !1, t = !1, i = !1) {\n const r = this.getScene();\n if (!r)\n return i;\n const s = r.getEngine();\n if (this.useCameraPostProcesses !== void 0 && (e = this.useCameraPostProcesses), this._waitingRenderList) {\n if (!this.renderListPredicate) {\n this.renderList = [];\n for (let h = 0; h < this._waitingRenderList.length; h++) {\n const u = this._waitingRenderList[h], f = r.getMeshById(u);\n f && this.renderList.push(f);\n }\n }\n this._waitingRenderList = void 0;\n }\n if (this.renderListPredicate) {\n this.renderList ? this.renderList.length = 0 : this.renderList = [];\n const h = this.getScene();\n if (!h)\n return i;\n const u = h.meshes;\n for (let f = 0; f < u.length; f++) {\n const d = u[f];\n this.renderListPredicate(d) && this.renderList.push(d);\n }\n }\n const a = s.currentRenderPassId;\n this.onBeforeBindObservable.notifyObservers(this);\n const o = this.activeCamera ?? r.activeCamera, l = r.activeCamera;\n o && (o !== r.activeCamera && (r.setTransformMatrix(o.getViewMatrix(), o.getProjectionMatrix(!0)), r.activeCamera = o), s.setViewport(o.rigParent ? o.rigParent.viewport : o.viewport, this.getRenderWidth(), this.getRenderHeight())), this._defaultRenderListPrepared = !1;\n let c = i;\n if (i) {\n r.getViewMatrix() || r.updateTransformMatrix();\n const h = this.is2DArray || this.is3D ? this.getRenderLayers() : this.isCube ? 6 : 1;\n for (let u = 0; u < h && c; u++) {\n let f = null;\n const d = this.renderList ? this.renderList : r.getActiveMeshes().data, p = this.renderList ? this.renderList.length : r.getActiveMeshes().length;\n s.currentRenderPassId = this._renderPassIds[u], this.onBeforeRenderObservable.notifyObservers(u), this.getCustomRenderList && (f = this.getCustomRenderList(u, d, p)), f || (f = d), this._doNotChangeAspectRatio || r.updateTransformMatrix(!0);\n for (let g = 0; g < f.length && c; ++g) {\n const m = f[g];\n if (!(!m.isEnabled() || m.isBlocked || !m.isVisible || !m.subMeshes)) {\n if (this.customIsReadyFunction) {\n if (!this.customIsReadyFunction(m, this.refreshRate, i)) {\n c = !1;\n continue;\n }\n } else if (!m.isReady(!0)) {\n c = !1;\n continue;\n }\n }\n }\n this.onAfterRenderObservable.notifyObservers(u), (this.is2DArray || this.is3D || this.isCube) && (r.incrementRenderId(), r.resetCachedMaterial());\n }\n } else if ((this.is2DArray || this.is3D) && !this.isMulti)\n for (let h = 0; h < this.getRenderLayers(); h++)\n this._renderToTarget(0, e, t, h, o), r.incrementRenderId(), r.resetCachedMaterial();\n else if (this.isCube && !this.isMulti)\n for (let h = 0; h < 6; h++)\n this._renderToTarget(h, e, t, void 0, o), r.incrementRenderId(), r.resetCachedMaterial();\n else\n this._renderToTarget(0, e, t, void 0, o);\n return this.onAfterUnbindObservable.notifyObservers(this), s.currentRenderPassId = a, l && (r.activeCamera = l, this.activeCamera && this.activeCamera !== r.activeCamera && r.setTransformMatrix(r.activeCamera.getViewMatrix(), r.activeCamera.getProjectionMatrix(!0)), s.setViewport(r.activeCamera.viewport)), r.resetCachedMaterial(), c;\n }\n _bestReflectionRenderTargetDimension(e, t) {\n const r = e * t, s = se.NearestPOT(r + 128 * 128 / (128 + r));\n return Math.min(se.FloorPOT(e), s);\n }\n _prepareRenderingManager(e, t, i, r) {\n const s = this.getScene();\n if (!s)\n return;\n this._renderingManager.reset();\n const a = s.getRenderId();\n for (let o = 0; o < t; o++) {\n const l = e[o];\n if (l && !l.isBlocked) {\n if (this.customIsReadyFunction) {\n if (!this.customIsReadyFunction(l, this.refreshRate, !1)) {\n this.resetRefreshCounter();\n continue;\n }\n } else if (!l.isReady(this.refreshRate === 0)) {\n this.resetRefreshCounter();\n continue;\n }\n if (!l._internalAbstractMeshDataInfo._currentLODIsUpToDate && s.activeCamera && (l._internalAbstractMeshDataInfo._currentLOD = s.customLODSelector ? s.customLODSelector(l, this.activeCamera || s.activeCamera) : l.getLOD(this.activeCamera || s.activeCamera), l._internalAbstractMeshDataInfo._currentLODIsUpToDate = !0), !l._internalAbstractMeshDataInfo._currentLOD)\n continue;\n let c = l._internalAbstractMeshDataInfo._currentLOD;\n c._preActivateForIntermediateRendering(a);\n let h;\n if (r && i ? h = (l.layerMask & i.layerMask) === 0 : h = !1, l.isEnabled() && l.isVisible && l.subMeshes && !h && (c !== l && c._activate(a, !0), l._activate(a, !0) && l.subMeshes.length)) {\n l.isAnInstance ? l._internalAbstractMeshDataInfo._actAsRegularMesh && (c = l) : c._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = !1, c._internalAbstractMeshDataInfo._isActiveIntermediate = !0;\n for (let u = 0; u < c.subMeshes.length; u++) {\n const f = c.subMeshes[u];\n this._renderingManager.dispatch(f, c);\n }\n }\n }\n }\n for (let o = 0; o < s.particleSystems.length; o++) {\n const l = s.particleSystems[o], c = l.emitter;\n !l.isStarted() || !c || c.position && !c.isEnabled() || this._renderingManager.dispatchParticles(l);\n }\n }\n /**\n * @internal\n * @param faceIndex face index to bind to if this is a cubetexture\n * @param layer defines the index of the texture to bind in the array\n */\n _bindFrameBuffer(e = 0, t = 0) {\n const i = this.getScene();\n if (!i)\n return;\n const r = i.getEngine();\n this._renderTarget && r.bindFramebuffer(this._renderTarget, this.isCube ? e : void 0, void 0, void 0, this.ignoreCameraViewport, 0, t);\n }\n _unbindFrameBuffer(e, t) {\n this._renderTarget && e.unBindFramebuffer(this._renderTarget, this.isCube, () => {\n this.onAfterRenderObservable.notifyObservers(t);\n });\n }\n /**\n * @internal\n */\n _prepareFrame(e, t, i, r) {\n this._postProcessManager ? this._prePassEnabled || this._postProcessManager._prepareFrame(this._texture, this._postProcesses) : (!r || !e.postProcessManager._prepareFrame(this._texture)) && this._bindFrameBuffer(t, i);\n }\n _renderToTarget(e, t, i, r = 0, s = null) {\n var c, h, u;\n const a = this.getScene();\n if (!a)\n return;\n const o = a.getEngine();\n if ((c = o._debugPushGroup) == null || c.call(o, `render to face #${e} layer #${r}`, 1), this._prepareFrame(a, e, r, t), this.is2DArray || this.is3D ? (o.currentRenderPassId = this._renderPassIds[r], this.onBeforeRenderObservable.notifyObservers(r)) : (o.currentRenderPassId = this._renderPassIds[e], this.onBeforeRenderObservable.notifyObservers(e)), o.snapshotRendering && o.snapshotRenderingMode === 1)\n this.onClearObservable.hasObservers() ? this.onClearObservable.notifyObservers(o) : this.skipInitialClear || o.clear(this.clearColor || a.clearColor, !0, !0, !0);\n else {\n let f = null;\n const d = this.renderList ? this.renderList : a.getActiveMeshes().data, p = this.renderList ? this.renderList.length : a.getActiveMeshes().length;\n this.getCustomRenderList && (f = this.getCustomRenderList(this.is2DArray || this.is3D ? r : e, d, p)), f ? this._prepareRenderingManager(f, f.length, s, this.forceLayerMaskCheck) : (this._defaultRenderListPrepared || (this._prepareRenderingManager(d, p, s, !this.renderList || this.forceLayerMaskCheck), this._defaultRenderListPrepared = !0), f = d);\n for (const m of a._beforeRenderTargetClearStage)\n m.action(this, e, r);\n this.onClearObservable.hasObservers() ? this.onClearObservable.notifyObservers(o) : this.skipInitialClear || o.clear(this.clearColor || a.clearColor, !0, !0, !0), this._doNotChangeAspectRatio || a.updateTransformMatrix(!0);\n for (const m of a._beforeRenderTargetDrawStage)\n m.action(this, e, r);\n this._renderingManager.render(this.customRenderFunction, f, this.renderParticles, this.renderSprites);\n for (const m of a._afterRenderTargetDrawStage)\n m.action(this, e, r);\n const g = ((h = this._texture) == null ? void 0 : h.generateMipMaps) ?? !1;\n this._texture && (this._texture.generateMipMaps = !1), this._postProcessManager ? this._postProcessManager._finalizeFrame(!1, this._renderTarget ?? void 0, e, this._postProcesses, this.ignoreCameraViewport) : t && a.postProcessManager._finalizeFrame(!1, this._renderTarget ?? void 0, e);\n for (const m of a._afterRenderTargetPostProcessStage)\n m.action(this, e, r);\n this._texture && (this._texture.generateMipMaps = g), this._doNotChangeAspectRatio || a.updateTransformMatrix(!0), i && Ni.DumpFramebuffer(this.getRenderWidth(), this.getRenderHeight(), o);\n }\n this._unbindFrameBuffer(o, e), this._texture && this.isCube && e === 5 && o.generateMipMapsForCubemap(this._texture), (u = o._debugPopGroup) == null || u.call(o, 1);\n }\n /**\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\n * This allowed control for front to back rendering or reversely depending of the special needs.\n *\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\n */\n setRenderingOrder(e, t = null, i = null, r = null) {\n this._renderingManager.setRenderingOrder(e, t, i, r);\n }\n /**\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\n *\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\n */\n setRenderingAutoClearDepthStencil(e, t) {\n this._renderingManager.setRenderingAutoClearDepthStencil(e, t), this._renderingManager._useSceneAutoClearSetup = !1;\n }\n /**\n * Clones the texture.\n * @returns the cloned texture\n */\n clone() {\n const e = this.getSize(), t = new gr(this.name, e, this.getScene(), this._renderTargetOptions.generateMipMaps, this._doNotChangeAspectRatio, this._renderTargetOptions.type, this.isCube, this._renderTargetOptions.samplingMode, this._renderTargetOptions.generateDepthBuffer, this._renderTargetOptions.generateStencilBuffer, void 0, this._renderTargetOptions.format, void 0, this._renderTargetOptions.samples);\n return t.hasAlpha = this.hasAlpha, t.level = this.level, t.coordinatesMode = this.coordinatesMode, this.renderList && (t.renderList = this.renderList.slice(0)), t;\n }\n /**\n * Serialize the texture to a JSON representation we can easily use in the respective Parse function.\n * @returns The JSON representation of the texture\n */\n serialize() {\n if (!this.name)\n return null;\n const e = super.serialize();\n if (e.renderTargetSize = this.getRenderSize(), e.renderList = [], this.renderList)\n for (let t = 0; t < this.renderList.length; t++)\n e.renderList.push(this.renderList[t].id);\n return e;\n }\n /**\n * This will remove the attached framebuffer objects. The texture will not be able to be used as render target anymore\n */\n disposeFramebufferObjects() {\n var e;\n (e = this._renderTarget) == null || e.dispose(!0);\n }\n /**\n * Release and destroy the underlying lower level texture aka internalTexture.\n */\n releaseInternalTexture() {\n var e;\n (e = this._renderTarget) == null || e.releaseTextures(), this._texture = null;\n }\n /**\n * Dispose the texture and release its associated resources.\n */\n dispose() {\n var i;\n this.onResizeObservable.clear(), this.onClearObservable.clear(), this.onAfterRenderObservable.clear(), this.onAfterUnbindObservable.clear(), this.onBeforeBindObservable.clear(), this.onBeforeRenderObservable.clear(), this._postProcessManager && (this._postProcessManager.dispose(), this._postProcessManager = null), this._prePassRenderTarget && this._prePassRenderTarget.dispose(), this._releaseRenderPassId(), this.clearPostProcesses(!0), this._resizeObserver && (this.getScene().getEngine().onResizeObservable.remove(this._resizeObserver), this._resizeObserver = null), this.renderList = null;\n const e = this.getScene();\n if (!e)\n return;\n let t = e.customRenderTargets.indexOf(this);\n t >= 0 && e.customRenderTargets.splice(t, 1);\n for (const r of e.cameras)\n t = r.customRenderTargets.indexOf(this), t >= 0 && r.customRenderTargets.splice(t, 1);\n (i = this._renderTarget) == null || i.dispose(), this._renderTarget = null, this._texture = null, super.dispose();\n }\n /** @internal */\n _rebuild() {\n this.refreshRate === gr.REFRESHRATE_RENDER_ONCE && (this.refreshRate = gr.REFRESHRATE_RENDER_ONCE), this._postProcessManager && this._postProcessManager._rebuild();\n }\n /**\n * Clear the info related to rendering groups preventing retention point in material dispose.\n */\n freeRenderingGroups() {\n this._renderingManager && this._renderingManager.freeRenderingGroups();\n }\n /**\n * Gets the number of views the corresponding to the texture (eg. a MultiviewRenderTarget will have > 1)\n * @returns the view count\n */\n getViewCount() {\n return 1;\n }\n}\ngr.REFRESHRATE_RENDER_ONCE = 0;\ngr.REFRESHRATE_RENDER_ONEVERYFRAME = 1;\ngr.REFRESHRATE_RENDER_ONEVERYTWOFRAMES = 2;\nle._CreateRenderTargetTexture = (n, e, t, i, r) => new gr(n, e, t, i);\nclass Pt {\n /**\n * Registers a shader code processing with a post process name.\n * @param postProcessName name of the post process. Use null for the fallback shader code processing. This is the shader code processing that will be used in case no specific shader code processing has been associated to a post process name\n * @param customShaderCodeProcessing shader code processing to associate to the post process name\n */\n static RegisterShaderCodeProcessing(e, t) {\n if (!t) {\n delete Pt._CustomShaderCodeProcessing[e ?? \"\"];\n return;\n }\n Pt._CustomShaderCodeProcessing[e ?? \"\"] = t;\n }\n static _GetShaderCodeProcessing(e) {\n return Pt._CustomShaderCodeProcessing[e] ?? Pt._CustomShaderCodeProcessing[\"\"];\n }\n /**\n * Number of sample textures (default: 1)\n */\n get samples() {\n return this._samples;\n }\n set samples(e) {\n this._samples = Math.min(e, this._engine.getCaps().maxMSAASamples), this._textures.forEach((t) => {\n t.setSamples(this._samples);\n });\n }\n /**\n * Returns the fragment url or shader name used in the post process.\n * @returns the fragment url or name in the shader store.\n */\n getEffectName() {\n return this._fragmentUrl;\n }\n /**\n * A function that is added to the onActivateObservable\n */\n set onActivate(e) {\n this._onActivateObserver && this.onActivateObservable.remove(this._onActivateObserver), e && (this._onActivateObserver = this.onActivateObservable.add(e));\n }\n /**\n * A function that is added to the onSizeChangedObservable\n */\n set onSizeChanged(e) {\n this._onSizeChangedObserver && this.onSizeChangedObservable.remove(this._onSizeChangedObserver), this._onSizeChangedObserver = this.onSizeChangedObservable.add(e);\n }\n /**\n * A function that is added to the onApplyObservable\n */\n set onApply(e) {\n this._onApplyObserver && this.onApplyObservable.remove(this._onApplyObserver), this._onApplyObserver = this.onApplyObservable.add(e);\n }\n /**\n * A function that is added to the onBeforeRenderObservable\n */\n set onBeforeRender(e) {\n this._onBeforeRenderObserver && this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver), this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(e);\n }\n /**\n * A function that is added to the onAfterRenderObservable\n */\n set onAfterRender(e) {\n this._onAfterRenderObserver && this.onAfterRenderObservable.remove(this._onAfterRenderObserver), this._onAfterRenderObserver = this.onAfterRenderObservable.add(e);\n }\n /**\n * The input texture for this post process and the output texture of the previous post process. When added to a pipeline the previous post process will\n * render it's output into this texture and this texture will be used as textureSampler in the fragment shader of this post process.\n */\n get inputTexture() {\n return this._textures.data[this._currentRenderTextureInd];\n }\n set inputTexture(e) {\n this._forcedOutputTexture = e;\n }\n /**\n * Since inputTexture should always be defined, if we previously manually set `inputTexture`,\n * the only way to unset it is to use this function to restore its internal state\n */\n restoreDefaultInputTexture() {\n this._forcedOutputTexture && (this._forcedOutputTexture = null, this.markTextureDirty());\n }\n /**\n * Gets the camera which post process is applied to.\n * @returns The camera the post process is applied to.\n */\n getCamera() {\n return this._camera;\n }\n /**\n * Gets the texel size of the postprocess.\n * See https://en.wikipedia.org/wiki/Texel_(graphics)\n */\n get texelSize() {\n return this._shareOutputWithPostProcess ? this._shareOutputWithPostProcess.texelSize : (this._forcedOutputTexture && this._texelSize.copyFromFloats(1 / this._forcedOutputTexture.width, 1 / this._forcedOutputTexture.height), this._texelSize);\n }\n /** @internal */\n constructor(e, t, i, r, s, a, o = 1, l, c, h = null, u = 0, f = \"postprocess\", d, p = !1, g = 5, m = _i.GLSL) {\n this._parentContainer = null, this.width = -1, this.height = -1, this.nodeMaterialSource = null, this._outputTexture = null, this.autoClear = !0, this.forceAutoClearInAlphaMode = !1, this.alphaMode = 0, this.animations = [], this.enablePixelPerfectMode = !1, this.forceFullscreenViewport = !0, this.scaleMode = 1, this.alwaysForcePOT = !1, this._samples = 1, this.adaptScaleToCurrentViewport = !1, this._reusable = !1, this._renderId = 0, this.externalTextureSamplerBinding = !1, this._textures = new Li(2), this._textureCache = [], this._currentRenderTextureInd = 0, this._scaleRatio = new me(1, 1), this._texelSize = me.Zero(), this.onActivateObservable = new he(), this.onSizeChangedObservable = new he(), this.onApplyObservable = new he(), this.onBeforeRenderObservable = new he(), this.onAfterRenderObservable = new he(), this.name = e;\n let v = 1, E = null;\n if (i && !Array.isArray(i)) {\n const C = i;\n i = C.uniforms ?? null, r = C.samplers ?? null, v = C.size ?? 1, a = C.camera ?? null, o = C.samplingMode ?? 1, l = C.engine, c = C.reusable, h = C.defines ?? null, u = C.textureType ?? 0, f = C.vertexUrl ?? \"postprocess\", d = C.indexParameters, p = C.blockCompilation ?? !1, g = C.textureFormat ?? 5, m = C.shaderLanguage ?? _i.GLSL, E = C.uniformBuffers ?? null;\n } else\n s && (typeof s == \"number\" ? v = s : v = { width: s.width, height: s.height });\n a != null ? (this._camera = a, this._scene = a.getScene(), a.attachPostProcess(this), this._engine = this._scene.getEngine(), this._scene.postProcesses.push(this), this.uniqueId = this._scene.getUniqueId()) : l && (this._engine = l, this._engine.postProcesses.push(this)), this._options = v, this.renderTargetSamplingMode = o || 1, this._reusable = c || !1, this._textureType = u, this._textureFormat = g, this._shaderLanguage = m, this._samplers = r || [], this._samplers.push(\"textureSampler\"), this._fragmentUrl = t, this._vertexUrl = f, this._parameters = i || [], this._parameters.push(\"scale\"), this._uniformBuffers = E || [], this._indexParameters = d, this._drawWrapper = new ka(this._engine), p || this.updateEffect(h);\n }\n /**\n * Gets a string identifying the name of the class\n * @returns \"PostProcess\" string\n */\n getClassName() {\n return \"PostProcess\";\n }\n /**\n * Gets the engine which this post process belongs to.\n * @returns The engine the post process was enabled with.\n */\n getEngine() {\n return this._engine;\n }\n /**\n * The effect that is created when initializing the post process.\n * @returns The created effect corresponding the postprocess.\n */\n getEffect() {\n return this._drawWrapper.effect;\n }\n /**\n * To avoid multiple redundant textures for multiple post process, the output the output texture for this post process can be shared with another.\n * @param postProcess The post process to share the output with.\n * @returns This post process.\n */\n shareOutputWith(e) {\n return this._disposeTextures(), this._shareOutputWithPostProcess = e, this;\n }\n /**\n * Reverses the effect of calling shareOutputWith and returns the post process back to its original state.\n * This should be called if the post process that shares output with this post process is disabled/disposed.\n */\n useOwnOutput() {\n this._textures.length == 0 && (this._textures = new Li(2)), this._shareOutputWithPostProcess = null;\n }\n /**\n * Updates the effect with the current post process compile time values and recompiles the shader.\n * @param defines Define statements that should be added at the beginning of the shader. (default: null)\n * @param uniforms Set of uniform variables that will be passed to the shader. (default: null)\n * @param samplers Set of Texture2D variables that will be passed to the shader. (default: null)\n * @param indexParameters The index parameters to be used for babylons include syntax \"#include[0..varyingCount]\". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\n * @param onCompiled Called when the shader has been compiled.\n * @param onError Called if there is an error when compiling a shader.\n * @param vertexUrl The url of the vertex shader to be used (default: the one given at construction time)\n * @param fragmentUrl The url of the fragment shader to be used (default: the one given at construction time)\n */\n updateEffect(e = null, t = null, i = null, r, s, a, o, l) {\n const c = Pt._GetShaderCodeProcessing(this.name);\n if (c != null && c.defineCustomBindings) {\n const h = (t == null ? void 0 : t.slice()) ?? [];\n h.push(...this._parameters);\n const u = (i == null ? void 0 : i.slice()) ?? [];\n u.push(...this._samplers), e = c.defineCustomBindings(this.name, e, h, u), t = h, i = u;\n }\n this._postProcessDefines = e, this._drawWrapper.effect = this._engine.createEffect({ vertex: o ?? this._vertexUrl, fragment: l ?? this._fragmentUrl }, {\n attributes: [\"position\"],\n uniformsNames: t || this._parameters,\n uniformBuffersNames: this._uniformBuffers,\n samplers: i || this._samplers,\n defines: e !== null ? e : \"\",\n fallbacks: null,\n onCompiled: s ?? null,\n onError: a ?? null,\n indexParameters: r || this._indexParameters,\n processCodeAfterIncludes: c != null && c.processCodeAfterIncludes ? (h, u) => c.processCodeAfterIncludes(this.name, h, u) : null,\n processFinalCode: c != null && c.processFinalCode ? (h, u) => c.processFinalCode(this.name, h, u) : null,\n shaderLanguage: this._shaderLanguage\n }, this._engine);\n }\n /**\n * The post process is reusable if it can be used multiple times within one frame.\n * @returns If the post process is reusable\n */\n isReusable() {\n return this._reusable;\n }\n /** invalidate frameBuffer to hint the postprocess to create a depth buffer */\n markTextureDirty() {\n this.width = -1;\n }\n _createRenderTargetTexture(e, t, i = 0) {\n for (let s = 0; s < this._textureCache.length; s++)\n if (this._textureCache[s].texture.width === e.width && this._textureCache[s].texture.height === e.height && this._textureCache[s].postProcessChannel === i && this._textureCache[s].texture._generateDepthBuffer === t.generateDepthBuffer && this._textureCache[s].texture.samples === t.samples)\n return this._textureCache[s].texture;\n const r = this._engine.createRenderTargetTexture(e, t);\n return this._textureCache.push({ texture: r, postProcessChannel: i, lastUsedRenderId: -1 }), r;\n }\n _flushTextureCache() {\n const e = this._renderId;\n for (let t = this._textureCache.length - 1; t >= 0; t--)\n if (e - this._textureCache[t].lastUsedRenderId > 100) {\n let i = !1;\n for (let r = 0; r < this._textures.length; r++)\n if (this._textures.data[r] === this._textureCache[t].texture) {\n i = !0;\n break;\n }\n i || (this._textureCache[t].texture.dispose(), this._textureCache.splice(t, 1));\n }\n }\n /**\n * Resizes the post-process texture\n * @param width Width of the texture\n * @param height Height of the texture\n * @param camera The camera this post-process is applied to. Pass null if the post-process is used outside the context of a camera post-process chain (default: null)\n * @param needMipMaps True if mip maps need to be generated after render (default: false)\n * @param forceDepthStencil True to force post-process texture creation with stencil depth and buffer (default: false)\n */\n resize(e, t, i = null, r = !1, s = !1) {\n this._textures.length > 0 && this._textures.reset(), this.width = e, this.height = t;\n let a = null;\n if (i) {\n for (let c = 0; c < i._postProcesses.length; c++)\n if (i._postProcesses[c] !== null) {\n a = i._postProcesses[c];\n break;\n }\n }\n const o = { width: this.width, height: this.height }, l = {\n generateMipMaps: r,\n generateDepthBuffer: s || a === this,\n generateStencilBuffer: (s || a === this) && this._engine.isStencilEnable,\n samplingMode: this.renderTargetSamplingMode,\n type: this._textureType,\n format: this._textureFormat,\n samples: this._samples,\n label: \"PostProcessRTT-\" + this.name\n };\n this._textures.push(this._createRenderTargetTexture(o, l, 0)), this._reusable && this._textures.push(this._createRenderTargetTexture(o, l, 1)), this._texelSize.copyFromFloats(1 / this.width, 1 / this.height), this.onSizeChangedObservable.notifyObservers(this);\n }\n _getTarget() {\n let e;\n if (this._shareOutputWithPostProcess)\n e = this._shareOutputWithPostProcess.inputTexture;\n else if (this._forcedOutputTexture)\n e = this._forcedOutputTexture, this.width = this._forcedOutputTexture.width, this.height = this._forcedOutputTexture.height;\n else {\n e = this.inputTexture;\n let t;\n for (let i = 0; i < this._textureCache.length; i++)\n if (this._textureCache[i].texture === e) {\n t = this._textureCache[i];\n break;\n }\n t && (t.lastUsedRenderId = this._renderId);\n }\n return e;\n }\n /**\n * Activates the post process by intializing the textures to be used when executed. Notifies onActivateObservable.\n * When this post process is used in a pipeline, this is call will bind the input texture of this post process to the output of the previous.\n * @param camera The camera that will be used in the post process. This camera will be used when calling onActivateObservable.\n * @param sourceTexture The source texture to be inspected to get the width and height if not specified in the post process constructor. (default: null)\n * @param forceDepthStencil If true, a depth and stencil buffer will be generated. (default: false)\n * @returns The render target wrapper that was bound to be written to.\n */\n activate(e, t = null, i) {\n var d, p;\n e = e || this._camera;\n const r = e.getScene(), s = r.getEngine(), a = s.getCaps().maxTextureSize, o = (t ? t.width : this._engine.getRenderWidth(!0)) * this._options | 0, l = (t ? t.height : this._engine.getRenderHeight(!0)) * this._options | 0;\n let c = this._options.width || o, h = this._options.height || l;\n const u = this.renderTargetSamplingMode !== 7 && this.renderTargetSamplingMode !== 1 && this.renderTargetSamplingMode !== 2;\n let f = null;\n if (!this._shareOutputWithPostProcess && !this._forcedOutputTexture) {\n if (this.adaptScaleToCurrentViewport) {\n const g = s.currentViewport;\n g && (c *= g.width, h *= g.height);\n }\n (u || this.alwaysForcePOT) && (this._options.width || (c = s.needPOTTextures ? se.GetExponentOfTwo(c, a, this.scaleMode) : c), this._options.height || (h = s.needPOTTextures ? se.GetExponentOfTwo(h, a, this.scaleMode) : h)), (this.width !== c || this.height !== h || !(f = this._getTarget())) && this.resize(c, h, e, u, i), this._textures.forEach((g) => {\n g.samples !== this.samples && this._engine.updateRenderTargetTextureSampleCount(g, this.samples);\n }), this._flushTextureCache(), this._renderId++;\n }\n return f || (f = this._getTarget()), this.enablePixelPerfectMode ? (this._scaleRatio.copyFromFloats(o / c, l / h), this._engine.bindFramebuffer(f, 0, o, l, this.forceFullscreenViewport)) : (this._scaleRatio.copyFromFloats(1, 1), this._engine.bindFramebuffer(f, 0, void 0, void 0, this.forceFullscreenViewport)), (p = (d = this._engine)._debugInsertMarker) == null || p.call(d, `post process ${this.name} input`), this.onActivateObservable.notifyObservers(e), this.autoClear && (this.alphaMode === 0 || this.forceAutoClearInAlphaMode) && this._engine.clear(this.clearColor ? this.clearColor : r.clearColor, r._allowPostProcessClearColor, !0, !0), this._reusable && (this._currentRenderTextureInd = (this._currentRenderTextureInd + 1) % 2), f;\n }\n /**\n * If the post process is supported.\n */\n get isSupported() {\n return this._drawWrapper.effect.isSupported;\n }\n /**\n * The aspect ratio of the output texture.\n */\n get aspectRatio() {\n return this._shareOutputWithPostProcess ? this._shareOutputWithPostProcess.aspectRatio : this._forcedOutputTexture ? this._forcedOutputTexture.width / this._forcedOutputTexture.height : this.width / this.height;\n }\n /**\n * Get a value indicating if the post-process is ready to be used\n * @returns true if the post-process is ready (shader is compiled)\n */\n isReady() {\n var e;\n return ((e = this._drawWrapper.effect) == null ? void 0 : e.isReady()) ?? !1;\n }\n /**\n * Binds all textures and uniforms to the shader, this will be run on every pass.\n * @returns the effect corresponding to this post process. Null if not compiled or not ready.\n */\n apply() {\n var t, i, r;\n if (!((t = this._drawWrapper.effect) != null && t.isReady()))\n return null;\n this._engine.enableEffect(this._drawWrapper), this._engine.setState(!1), this._engine.setDepthBuffer(!1), this._engine.setDepthWrite(!1), this._engine.setAlphaMode(this.alphaMode), this.alphaConstants && this.getEngine().setAlphaConstants(this.alphaConstants.r, this.alphaConstants.g, this.alphaConstants.b, this.alphaConstants.a);\n let e;\n return this._shareOutputWithPostProcess ? e = this._shareOutputWithPostProcess.inputTexture : this._forcedOutputTexture ? e = this._forcedOutputTexture : e = this.inputTexture, this.externalTextureSamplerBinding || this._drawWrapper.effect._bindTexture(\"textureSampler\", e == null ? void 0 : e.texture), this._drawWrapper.effect.setVector2(\"scale\", this._scaleRatio), this.onApplyObservable.notifyObservers(this._drawWrapper.effect), (r = (i = Pt._GetShaderCodeProcessing(this.name)) == null ? void 0 : i.bindCustomBindings) == null || r.call(i, this.name, this._drawWrapper.effect), this._drawWrapper.effect;\n }\n _disposeTextures() {\n if (this._shareOutputWithPostProcess || this._forcedOutputTexture) {\n this._disposeTextureCache();\n return;\n }\n this._disposeTextureCache(), this._textures.dispose();\n }\n _disposeTextureCache() {\n for (let e = this._textureCache.length - 1; e >= 0; e--)\n this._textureCache[e].texture.dispose();\n this._textureCache.length = 0;\n }\n /**\n * Sets the required values to the prepass renderer.\n * @param prePassRenderer defines the prepass renderer to setup.\n * @returns true if the pre pass is needed.\n */\n setPrePassRenderer(e) {\n return this._prePassEffectConfiguration ? (this._prePassEffectConfiguration = e.addEffectConfiguration(this._prePassEffectConfiguration), this._prePassEffectConfiguration.enabled = !0, !0) : !1;\n }\n /**\n * Disposes the post process.\n * @param camera The camera to dispose the post process on.\n */\n dispose(e) {\n e = e || this._camera, this._disposeTextures();\n let t;\n if (this._scene && (t = this._scene.postProcesses.indexOf(this), t !== -1 && this._scene.postProcesses.splice(t, 1)), this._parentContainer) {\n const i = this._parentContainer.postProcesses.indexOf(this);\n i > -1 && this._parentContainer.postProcesses.splice(i, 1), this._parentContainer = null;\n }\n if (t = this._engine.postProcesses.indexOf(this), t !== -1 && this._engine.postProcesses.splice(t, 1), !!e) {\n if (e.detachPostProcess(this), t = e._postProcesses.indexOf(this), t === 0 && e._postProcesses.length > 0) {\n const i = this._camera._getFirstPostProcess();\n i && i.markTextureDirty();\n }\n this.onActivateObservable.clear(), this.onAfterRenderObservable.clear(), this.onApplyObservable.clear(), this.onBeforeRenderObservable.clear(), this.onSizeChangedObservable.clear();\n }\n }\n /**\n * Serializes the post process to a JSON object\n * @returns the JSON object\n */\n serialize() {\n const e = Le.Serialize(this), t = this.getCamera() || this._scene && this._scene.activeCamera;\n return e.customType = \"BABYLON.\" + this.getClassName(), e.cameraId = t ? t.id : null, e.reusable = this._reusable, e.textureType = this._textureType, e.fragmentUrl = this._fragmentUrl, e.parameters = this._parameters, e.samplers = this._samplers, e.options = this._options, e.defines = this._postProcessDefines, e.textureFormat = this._textureFormat, e.vertexUrl = this._vertexUrl, e.indexParameters = this._indexParameters, e;\n }\n /**\n * Clones this post process\n * @returns a new post process similar to this one\n */\n clone() {\n const e = this.serialize();\n e._engine = this._engine, e.cameraId = null;\n const t = Pt.Parse(e, this._scene, \"\");\n return t ? (t.onActivateObservable = this.onActivateObservable.clone(), t.onSizeChangedObservable = this.onSizeChangedObservable.clone(), t.onApplyObservable = this.onApplyObservable.clone(), t.onBeforeRenderObservable = this.onBeforeRenderObservable.clone(), t.onAfterRenderObservable = this.onAfterRenderObservable.clone(), t._prePassEffectConfiguration = this._prePassEffectConfiguration, t) : null;\n }\n /**\n * Creates a material from parsed material data\n * @param parsedPostProcess defines parsed post process data\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures\n * @returns a new post process\n */\n static Parse(e, t, i) {\n const r = mr(e.customType);\n if (!r || !r._Parse)\n return null;\n const s = t ? t.getCameraById(e.cameraId) : null;\n return r._Parse(e, s, t, i);\n }\n /**\n * @internal\n */\n static _Parse(e, t, i, r) {\n return Le.Parse(() => new Pt(e.name, e.fragmentUrl, e.parameters, e.samplers, e.options, t, e.renderTargetSamplingMode, e._engine, e.reusable, e.defines, e.textureType, e.vertexUrl, e.indexParameters, !1, e.textureFormat), e, i, r);\n }\n}\nPt._CustomShaderCodeProcessing = {};\nP([\n U()\n], Pt.prototype, \"uniqueId\", void 0);\nP([\n U()\n], Pt.prototype, \"name\", void 0);\nP([\n U()\n], Pt.prototype, \"width\", void 0);\nP([\n U()\n], Pt.prototype, \"height\", void 0);\nP([\n U()\n], Pt.prototype, \"renderTargetSamplingMode\", void 0);\nP([\n H_()\n], Pt.prototype, \"clearColor\", void 0);\nP([\n U()\n], Pt.prototype, \"autoClear\", void 0);\nP([\n U()\n], Pt.prototype, \"forceAutoClearInAlphaMode\", void 0);\nP([\n U()\n], Pt.prototype, \"alphaMode\", void 0);\nP([\n U()\n], Pt.prototype, \"alphaConstants\", void 0);\nP([\n U()\n], Pt.prototype, \"enablePixelPerfectMode\", void 0);\nP([\n U()\n], Pt.prototype, \"forceFullscreenViewport\", void 0);\nP([\n U()\n], Pt.prototype, \"scaleMode\", void 0);\nP([\n U()\n], Pt.prototype, \"alwaysForcePOT\", void 0);\nP([\n U(\"samples\")\n], Pt.prototype, \"_samples\", void 0);\nP([\n U()\n], Pt.prototype, \"adaptScaleToCurrentViewport\", void 0);\nRe(\"BABYLON.PostProcess\", Pt);\nconst mI = \"bonesDeclaration\", _I = `#if NUM_BONE_INFLUENCERS>0\nattribute vec4 matricesIndices;attribute vec4 matricesWeights;\n#if NUM_BONE_INFLUENCERS>4\nattribute vec4 matricesIndicesExtra;attribute vec4 matricesWeightsExtra;\n#endif\n#ifndef BAKED_VERTEX_ANIMATION_TEXTURE\n#ifdef BONETEXTURE\nuniform highp sampler2D boneSampler;uniform float boneTextureWidth;\n#else\nuniform mat4 mBones[BonesPerMesh];\n#endif\n#ifdef BONES_VELOCITY_ENABLED\nuniform mat4 mPreviousBones[BonesPerMesh];\n#endif\n#ifdef BONETEXTURE\n#define inline\nmat4 readMatrixFromRawSampler(sampler2D smp,float index)\n{float offset=index *4.0;float dx=1.0/boneTextureWidth;vec4 m0=texture2D(smp,vec2(dx*(offset+0.5),0.));vec4 m1=texture2D(smp,vec2(dx*(offset+1.5),0.));vec4 m2=texture2D(smp,vec2(dx*(offset+2.5),0.));vec4 m3=texture2D(smp,vec2(dx*(offset+3.5),0.));return mat4(m0,m1,m2,m3);}\n#endif\n#endif\n#endif\n`;\nY.IncludesShadersStore[mI] = _I;\nconst EI = \"bakedVertexAnimationDeclaration\", vI = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE\nuniform float bakedVertexAnimationTime;uniform vec2 bakedVertexAnimationTextureSizeInverted;uniform vec4 bakedVertexAnimationSettings;uniform sampler2D bakedVertexAnimationTexture;\n#ifdef INSTANCES\nattribute vec4 bakedVertexAnimationSettingsInstanced;\n#endif\n#define inline\nmat4 readMatrixFromRawSamplerVAT(sampler2D smp,float index,float frame)\n{float offset=index*4.0;float frameUV=(frame+0.5)*bakedVertexAnimationTextureSizeInverted.y;float dx=bakedVertexAnimationTextureSizeInverted.x;vec4 m0=texture2D(smp,vec2(dx*(offset+0.5),frameUV));vec4 m1=texture2D(smp,vec2(dx*(offset+1.5),frameUV));vec4 m2=texture2D(smp,vec2(dx*(offset+2.5),frameUV));vec4 m3=texture2D(smp,vec2(dx*(offset+3.5),frameUV));return mat4(m0,m1,m2,m3);}\n#endif\n`;\nY.IncludesShadersStore[EI] = vI;\nconst TI = \"morphTargetsVertexGlobalDeclaration\", xI = `#ifdef MORPHTARGETS\nuniform float morphTargetInfluences[NUM_MORPH_INFLUENCERS];\n#ifdef MORPHTARGETS_TEXTURE \nuniform float morphTargetTextureIndices[NUM_MORPH_INFLUENCERS];uniform vec3 morphTargetTextureInfo;uniform highp sampler2DArray morphTargets;vec3 readVector3FromRawSampler(int targetIndex,float vertexIndex)\n{ \nfloat y=floor(vertexIndex/morphTargetTextureInfo.y);float x=vertexIndex-y*morphTargetTextureInfo.y;vec3 textureUV=vec3((x+0.5)/morphTargetTextureInfo.y,(y+0.5)/morphTargetTextureInfo.z,morphTargetTextureIndices[targetIndex]);return texture(morphTargets,textureUV).xyz;}\n#endif\n#endif\n`;\nY.IncludesShadersStore[TI] = xI;\nconst CI = \"morphTargetsVertexDeclaration\", RI = `#ifdef MORPHTARGETS\n#ifndef MORPHTARGETS_TEXTURE\nattribute vec3 position{X};\n#ifdef MORPHTARGETS_NORMAL\nattribute vec3 normal{X};\n#endif\n#ifdef MORPHTARGETS_TANGENT\nattribute vec3 tangent{X};\n#endif\n#ifdef MORPHTARGETS_UV\nattribute vec2 uv_{X};\n#endif\n#elif {X}==0\nuniform int morphTargetCount;\n#endif\n#endif\n`;\nY.IncludesShadersStore[CI] = RI;\nconst SI = \"instancesDeclaration\", yI = `#ifdef INSTANCES\nattribute vec4 world0;attribute vec4 world1;attribute vec4 world2;attribute vec4 world3;\n#ifdef INSTANCESCOLOR\nattribute vec4 instanceColor;\n#endif\n#if defined(THIN_INSTANCES) && !defined(WORLD_UBO)\nuniform mat4 world;\n#endif\n#if defined(VELOCITY) || defined(PREPASS_VELOCITY)\nattribute vec4 previousWorld0;attribute vec4 previousWorld1;attribute vec4 previousWorld2;attribute vec4 previousWorld3;\n#ifdef THIN_INSTANCES\nuniform mat4 previousWorld;\n#endif\n#endif\n#else\n#if !defined(WORLD_UBO)\nuniform mat4 world;\n#endif\n#if defined(VELOCITY) || defined(PREPASS_VELOCITY)\nuniform mat4 previousWorld;\n#endif\n#endif\n`;\nY.IncludesShadersStore[SI] = yI;\nconst II = \"morphTargetsVertexGlobal\", bI = `#ifdef MORPHTARGETS\n#ifdef MORPHTARGETS_TEXTURE\nfloat vertexID;\n#endif\n#endif\n`;\nY.IncludesShadersStore[II] = bI;\nconst AI = \"morphTargetsVertex\", MI = `#ifdef MORPHTARGETS\n#ifdef MORPHTARGETS_TEXTURE\n#if {X}==0\nfor (int i=0; i=morphTargetCount) break;vertexID=float(gl_VertexID)*morphTargetTextureInfo.x;positionUpdated+=(readVector3FromRawSampler(i,vertexID)-position)*morphTargetInfluences[i];vertexID+=1.0;\n#ifdef MORPHTARGETS_NORMAL\nnormalUpdated+=(readVector3FromRawSampler(i,vertexID) -normal)*morphTargetInfluences[i];vertexID+=1.0;\n#endif\n#ifdef MORPHTARGETS_UV\nuvUpdated+=(readVector3FromRawSampler(i,vertexID).xy-uv)*morphTargetInfluences[i];vertexID+=1.0;\n#endif\n#ifdef MORPHTARGETS_TANGENT\ntangentUpdated.xyz+=(readVector3FromRawSampler(i,vertexID) -tangent.xyz)*morphTargetInfluences[i];\n#endif\n}\n#endif\n#else\npositionUpdated+=(position{X}-position)*morphTargetInfluences[{X}];\n#ifdef MORPHTARGETS_NORMAL\nnormalUpdated+=(normal{X}-normal)*morphTargetInfluences[{X}];\n#endif\n#ifdef MORPHTARGETS_TANGENT\ntangentUpdated.xyz+=(tangent{X}-tangent.xyz)*morphTargetInfluences[{X}];\n#endif\n#ifdef MORPHTARGETS_UV\nuvUpdated+=(uv_{X}-uv)*morphTargetInfluences[{X}];\n#endif\n#endif\n#endif\n`;\nY.IncludesShadersStore[AI] = MI;\nconst PI = \"instancesVertex\", OI = `#ifdef INSTANCES\nmat4 finalWorld=mat4(world0,world1,world2,world3);\n#if defined(PREPASS_VELOCITY) || defined(VELOCITY)\nmat4 finalPreviousWorld=mat4(previousWorld0,previousWorld1,previousWorld2,previousWorld3);\n#endif\n#ifdef THIN_INSTANCES\nfinalWorld=world*finalWorld;\n#if defined(PREPASS_VELOCITY) || defined(VELOCITY)\nfinalPreviousWorld=previousWorld*finalPreviousWorld;\n#endif\n#endif\n#else\nmat4 finalWorld=world;\n#if defined(PREPASS_VELOCITY) || defined(VELOCITY)\nmat4 finalPreviousWorld=previousWorld;\n#endif\n#endif\n`;\nY.IncludesShadersStore[PI] = OI;\nconst DI = \"bonesVertex\", NI = `#ifndef BAKED_VERTEX_ANIMATION_TEXTURE\n#if NUM_BONE_INFLUENCERS>0\nmat4 influence;\n#ifdef BONETEXTURE\ninfluence=readMatrixFromRawSampler(boneSampler,matricesIndices[0])*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndices[1])*matricesWeights[1];\n#endif\n#if NUM_BONE_INFLUENCERS>2\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndices[2])*matricesWeights[2];\n#endif\n#if NUM_BONE_INFLUENCERS>3\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndices[3])*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[0])*matricesWeightsExtra[0];\n#endif\n#if NUM_BONE_INFLUENCERS>5\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[1])*matricesWeightsExtra[1];\n#endif\n#if NUM_BONE_INFLUENCERS>6\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[2])*matricesWeightsExtra[2];\n#endif\n#if NUM_BONE_INFLUENCERS>7\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[3])*matricesWeightsExtra[3];\n#endif\n#else\ninfluence=mBones[int(matricesIndices[0])]*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\ninfluence+=mBones[int(matricesIndices[1])]*matricesWeights[1];\n#endif\n#if NUM_BONE_INFLUENCERS>2\ninfluence+=mBones[int(matricesIndices[2])]*matricesWeights[2];\n#endif\n#if NUM_BONE_INFLUENCERS>3\ninfluence+=mBones[int(matricesIndices[3])]*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\ninfluence+=mBones[int(matricesIndicesExtra[0])]*matricesWeightsExtra[0];\n#endif\n#if NUM_BONE_INFLUENCERS>5\ninfluence+=mBones[int(matricesIndicesExtra[1])]*matricesWeightsExtra[1];\n#endif\n#if NUM_BONE_INFLUENCERS>6\ninfluence+=mBones[int(matricesIndicesExtra[2])]*matricesWeightsExtra[2];\n#endif\n#if NUM_BONE_INFLUENCERS>7\ninfluence+=mBones[int(matricesIndicesExtra[3])]*matricesWeightsExtra[3];\n#endif\n#endif\nfinalWorld=finalWorld*influence;\n#endif\n#endif\n`;\nY.IncludesShadersStore[DI] = NI;\nconst FI = \"bakedVertexAnimation\", LI = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE\n{\n#ifdef INSTANCES\n#define BVASNAME bakedVertexAnimationSettingsInstanced\n#else\n#define BVASNAME bakedVertexAnimationSettings\n#endif\nfloat VATStartFrame=BVASNAME.x;float VATEndFrame=BVASNAME.y;float VATOffsetFrame=BVASNAME.z;float VATSpeed=BVASNAME.w;float totalFrames=VATEndFrame-VATStartFrame+1.0;float time=bakedVertexAnimationTime*VATSpeed/totalFrames;float frameCorrection=time<1.0 ? 0.0 : 1.0;float numOfFrames=totalFrames-frameCorrection;float VATFrameNum=fract(time)*numOfFrames;VATFrameNum=mod(VATFrameNum+VATOffsetFrame,numOfFrames);VATFrameNum=floor(VATFrameNum);VATFrameNum+=VATStartFrame+frameCorrection;mat4 VATInfluence;VATInfluence=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[0],VATFrameNum)*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[1],VATFrameNum)*matricesWeights[1];\n#endif\n#if NUM_BONE_INFLUENCERS>2\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[2],VATFrameNum)*matricesWeights[2];\n#endif\n#if NUM_BONE_INFLUENCERS>3\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[3],VATFrameNum)*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[0],VATFrameNum)*matricesWeightsExtra[0];\n#endif\n#if NUM_BONE_INFLUENCERS>5\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[1],VATFrameNum)*matricesWeightsExtra[1];\n#endif\n#if NUM_BONE_INFLUENCERS>6\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[2],VATFrameNum)*matricesWeightsExtra[2];\n#endif\n#if NUM_BONE_INFLUENCERS>7\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[3],VATFrameNum)*matricesWeightsExtra[3];\n#endif\nfinalWorld=finalWorld*VATInfluence;}\n#endif\n`;\nY.IncludesShadersStore[FI] = LI;\nconst wI = \"meshUVSpaceRendererVertexShader\", UI = `precision highp float;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;uniform mat4 projMatrix;varying vec2 vDecalTC;\n#include\n#include\n#include\n#include[0..maxSimultaneousMorphTargets]\n#include\nvoid main(void) {vec3 positionUpdated=position;vec3 normalUpdated=normal;\n#include\n#include[0..maxSimultaneousMorphTargets]\n#include\n#include\n#include\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);mat3 normWorldSM=mat3(finalWorld);vec3 vNormalW;\n#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvNormalW=normalUpdated/vec3(dot(normWorldSM[0],normWorldSM[0]),dot(normWorldSM[1],normWorldSM[1]),dot(normWorldSM[2],normWorldSM[2]));vNormalW=normalize(normWorldSM*vNormalW);\n#else\n#ifdef NONUNIFORMSCALING\nnormWorldSM=transposeMat3(inverseMat3(normWorldSM));\n#endif\nvNormalW=normalize(normWorldSM*normalUpdated);\n#endif\nvec3 normalView=normalize((projMatrix*vec4(vNormalW,0.0)).xyz);vec3 decalTC=(projMatrix*worldPos).xyz;vDecalTC=decalTC.xy;gl_Position=vec4(uv*2.0-1.0,normalView.z>0.0 ? 2. : decalTC.z,1.0);}`;\nY.ShadersStore[wI] = UI;\nconst VI = \"meshUVSpaceRendererPixelShader\", BI = `precision highp float;varying vec2 vDecalTC;uniform sampler2D textureSampler;void main(void) {if (vDecalTC.x<0. || vDecalTC.x>1. || vDecalTC.y<0. || vDecalTC.y>1.) {discard;}\ngl_FragColor=texture2D(textureSampler,vDecalTC);}\n`;\nY.ShadersStore[VI] = BI;\nconst kI = \"meshUVSpaceRendererMaskerVertexShader\", zI = \"attribute vec2 uv;varying vec2 vUV;void main(void) {gl_Position=vec4(vec2(uv.x,uv.y)*2.0-1.0,0.,1.0);vUV=uv;}\";\nY.ShadersStore[kI] = zI;\nconst WI = \"meshUVSpaceRendererMaskerPixelShader\", GI = `varying vec2 vUV;void main(void) {gl_FragColor=vec4(1.0,1.0,1.0,1.0);}\n`;\nY.ShadersStore[WI] = GI;\nconst XI = \"meshUVSpaceRendererFinaliserPixelShader\", HI = `precision highp float;varying vec2 vUV;uniform sampler2D textureSampler;uniform sampler2D maskTextureSampler;uniform vec2 textureSize;void main() {vec4 mask=texture2D(maskTextureSampler,vUV).rgba;if (mask.r>0.5) {gl_FragColor=texture2D(textureSampler,vUV);} else {vec2 texelSize=4.0/textureSize;vec2 uv_p01=vUV+vec2(-1.0,0.0)*texelSize;vec2 uv_p21=vUV+vec2(1.0,0.0)*texelSize;vec2 uv_p10=vUV+vec2(0.0,-1.0)*texelSize;vec2 uv_p12=vUV+vec2(0.0,1.0)*texelSize;float mask_p01=texture2D(maskTextureSampler,uv_p01).r;float mask_p21=texture2D(maskTextureSampler,uv_p21).r;float mask_p10=texture2D(maskTextureSampler,uv_p10).r;float mask_p12=texture2D(maskTextureSampler,uv_p12).r;vec4 col=vec4(0.0,0.0,0.0,0.0);float total_weight=0.0;if (mask_p01>0.5) {col+=texture2D(textureSampler,uv_p01);total_weight+=1.0;}\nif (mask_p21>0.5) {col+=texture2D(textureSampler,uv_p21);total_weight+=1.0;}\nif (mask_p10>0.5) {col+=texture2D(textureSampler,uv_p10);total_weight+=1.0;}\nif (mask_p12>0.5) {col+=texture2D(textureSampler,uv_p12);total_weight+=1.0;}\nif (total_weight>0.0) {gl_FragColor=col/total_weight;} else {gl_FragColor=col;}}}\n`;\nY.ShadersStore[XI] = HI;\nconst KI = \"meshUVSpaceRendererFinaliserVertexShader\", qI = `precision highp float;attribute vec3 position;attribute vec2 uv;uniform mat4 worldViewProjection;varying vec2 vUV;void main() {gl_Position=worldViewProjection*vec4(position,1.0);vUV=uv;}\n`;\nY.ShadersStore[KI] = qI;\nB._GroundMeshParser = (n, e) => qo.Parse(n, e);\nclass qo extends B {\n constructor(e, t) {\n super(e, t), this.generateOctree = !1;\n }\n /**\n * \"GroundMesh\"\n * @returns \"GroundMesh\"\n */\n getClassName() {\n return \"GroundMesh\";\n }\n /**\n * The minimum of x and y subdivisions\n */\n get subdivisions() {\n return Math.min(this._subdivisionsX, this._subdivisionsY);\n }\n /**\n * X subdivisions\n */\n get subdivisionsX() {\n return this._subdivisionsX;\n }\n /**\n * Y subdivisions\n */\n get subdivisionsY() {\n return this._subdivisionsY;\n }\n /**\n * This function will divide the mesh into submeshes and update an octree to help to select the right submeshes\n * for rendering, picking and collision computations. Please note that you must have a decent number of submeshes\n * to get performance improvements when using an octree.\n * @param chunksCount the number of submeshes the mesh will be divided into\n * @param octreeBlocksSize the maximum size of the octree blocks (Default: 32)\n */\n optimize(e, t = 32) {\n this._subdivisionsX = e, this._subdivisionsY = e, this.subdivide(e);\n const i = this;\n i.createOrUpdateSubmeshesOctree && i.createOrUpdateSubmeshesOctree(t);\n }\n /**\n * Returns a height (y) value in the World system :\n * the ground altitude at the coordinates (x, z) expressed in the World system.\n * @param x x coordinate\n * @param z z coordinate\n * @returns the ground y position if (x, z) are outside the ground surface.\n */\n getHeightAtCoordinates(e, t) {\n const i = this.getWorldMatrix(), r = z.Matrix[5];\n i.invertToRef(r);\n const s = z.Vector3[8];\n if (_.TransformCoordinatesFromFloatsToRef(e, 0, t, r, s), e = s.x, t = s.z, e < this._minX || e >= this._maxX || t <= this._minZ || t > this._maxZ)\n return this.position.y;\n (!this._heightQuads || this._heightQuads.length == 0) && (this._initHeightQuads(), this._computeHeightQuads());\n const a = this._getFacetAt(e, t), o = -(a.x * e + a.z * t + a.w) / a.y;\n return _.TransformCoordinatesFromFloatsToRef(0, o, 0, i, s), s.y;\n }\n /**\n * Returns a normalized vector (Vector3) orthogonal to the ground\n * at the ground coordinates (x, z) expressed in the World system.\n * @param x x coordinate\n * @param z z coordinate\n * @returns Vector3(0.0, 1.0, 0.0) if (x, z) are outside the ground surface.\n */\n getNormalAtCoordinates(e, t) {\n const i = new _(0, 1, 0);\n return this.getNormalAtCoordinatesToRef(e, t, i), i;\n }\n /**\n * Updates the Vector3 passed a reference with a normalized vector orthogonal to the ground\n * at the ground coordinates (x, z) expressed in the World system.\n * Doesn't update the reference Vector3 if (x, z) are outside the ground surface.\n * @param x x coordinate\n * @param z z coordinate\n * @param ref vector to store the result\n * @returns the GroundMesh.\n */\n getNormalAtCoordinatesToRef(e, t, i) {\n const r = this.getWorldMatrix(), s = z.Matrix[5];\n r.invertToRef(s);\n const a = z.Vector3[8];\n if (_.TransformCoordinatesFromFloatsToRef(e, 0, t, s, a), e = a.x, t = a.z, e < this._minX || e > this._maxX || t < this._minZ || t > this._maxZ)\n return this;\n (!this._heightQuads || this._heightQuads.length == 0) && (this._initHeightQuads(), this._computeHeightQuads());\n const o = this._getFacetAt(e, t);\n return _.TransformNormalFromFloatsToRef(o.x, o.y, o.z, r, i), this;\n }\n /**\n * Force the heights to be recomputed for getHeightAtCoordinates() or getNormalAtCoordinates()\n * if the ground has been updated.\n * This can be used in the render loop.\n * @returns the GroundMesh.\n */\n updateCoordinateHeights() {\n return (!this._heightQuads || this._heightQuads.length == 0) && this._initHeightQuads(), this._computeHeightQuads(), this;\n }\n // Returns the element \"facet\" from the heightQuads array relative to (x, z) local coordinates\n _getFacetAt(e, t) {\n const i = Math.floor((e + this._maxX) * this._subdivisionsX / this._width), r = Math.floor(-(t + this._maxZ) * this._subdivisionsY / this._height + this._subdivisionsY), s = this._heightQuads[r * this._subdivisionsX + i];\n let a;\n return t < s.slope.x * e + s.slope.y ? a = s.facet1 : a = s.facet2, a;\n }\n // Creates and populates the heightMap array with \"facet\" elements :\n // a quad is two triangular facets separated by a slope, so a \"facet\" element is 1 slope + 2 facets\n // slope : Vector2(c, h) = 2D diagonal line equation setting apart two triangular facets in a quad : z = cx + h\n // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0\n // facet2 : Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0\n // Returns the GroundMesh.\n _initHeightQuads() {\n const e = this._subdivisionsX, t = this._subdivisionsY;\n this._heightQuads = new Array();\n for (let i = 0; i < t; i++)\n for (let r = 0; r < e; r++) {\n const s = { slope: me.Zero(), facet1: new Ke(0, 0, 0, 0), facet2: new Ke(0, 0, 0, 0) };\n this._heightQuads[i * e + r] = s;\n }\n return this;\n }\n // Compute each quad element values and update the heightMap array :\n // slope : Vector2(c, h) = 2D diagonal line equation setting apart two triangular facets in a quad : z = cx + h\n // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0\n // facet2 : Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0\n // Returns the GroundMesh.\n _computeHeightQuads() {\n const e = this.getVerticesData(I.PositionKind);\n if (!e)\n return this;\n const t = z.Vector3[3], i = z.Vector3[2], r = z.Vector3[1], s = z.Vector3[0], a = z.Vector3[4], o = z.Vector3[5], l = z.Vector3[6], c = z.Vector3[7], h = z.Vector3[8];\n let u = 0, f = 0, d = 0, p = 0, g = 0, m = 0, v = 0;\n const E = this._subdivisionsX, C = this._subdivisionsY;\n for (let T = 0; T < C; T++)\n for (let R = 0; R < E; R++) {\n u = R * 3, f = T * (E + 1) * 3, d = (T + 1) * (E + 1) * 3, t.x = e[f + u], t.y = e[f + u + 1], t.z = e[f + u + 2], i.x = e[f + u + 3], i.y = e[f + u + 4], i.z = e[f + u + 5], r.x = e[d + u], r.y = e[d + u + 1], r.z = e[d + u + 2], s.x = e[d + u + 3], s.y = e[d + u + 4], s.z = e[d + u + 5], p = (s.z - t.z) / (s.x - t.x), g = t.z - p * t.x, i.subtractToRef(t, a), r.subtractToRef(t, o), s.subtractToRef(t, l), _.CrossToRef(l, o, c), _.CrossToRef(a, l, h), c.normalize(), h.normalize(), m = -(c.x * t.x + c.y * t.y + c.z * t.z), v = -(h.x * i.x + h.y * i.y + h.z * i.z);\n const x = this._heightQuads[T * E + R];\n x.slope.copyFromFloats(p, g), x.facet1.copyFromFloats(c.x, c.y, c.z, m), x.facet2.copyFromFloats(h.x, h.y, h.z, v);\n }\n return this;\n }\n /**\n * Serializes this ground mesh\n * @param serializationObject object to write serialization to\n */\n serialize(e) {\n super.serialize(e), e.subdivisionsX = this._subdivisionsX, e.subdivisionsY = this._subdivisionsY, e.minX = this._minX, e.maxX = this._maxX, e.minZ = this._minZ, e.maxZ = this._maxZ, e.width = this._width, e.height = this._height;\n }\n /**\n * Parses a serialized ground mesh\n * @param parsedMesh the serialized mesh\n * @param scene the scene to create the ground mesh in\n * @returns the created ground mesh\n */\n static Parse(e, t) {\n const i = new qo(e.name, t);\n return i._subdivisionsX = e.subdivisionsX || 1, i._subdivisionsY = e.subdivisionsY || 1, i._minX = e.minX, i._maxX = e.maxX, i._minZ = e.minZ, i._maxZ = e.maxZ, i._width = e.width, i._height = e.height, i;\n }\n}\nB._GoldbergMeshParser = (n, e) => gf.Parse(n, e);\nclass gf extends B {\n constructor() {\n super(...arguments), this.goldbergData = {\n faceColors: [],\n faceCenters: [],\n faceZaxis: [],\n faceXaxis: [],\n faceYaxis: [],\n nbSharedFaces: 0,\n nbUnsharedFaces: 0,\n nbFaces: 0,\n nbFacesAtPole: 0,\n adjacentFaces: []\n };\n }\n /**\n * Gets the related Goldberg face from pole infos\n * @param poleOrShared Defines the pole index or the shared face index if the fromPole parameter is passed in\n * @param fromPole Defines an optional pole index to find the related info from\n * @returns the goldberg face number\n */\n relatedGoldbergFace(e, t) {\n return t === void 0 ? (e > this.goldbergData.nbUnsharedFaces - 1 && (ne.Warn(\"Maximum number of unshared faces used\"), e = this.goldbergData.nbUnsharedFaces - 1), this.goldbergData.nbUnsharedFaces + e) : (e > 11 && (ne.Warn(\"Last pole used\"), e = 11), t > this.goldbergData.nbFacesAtPole - 1 && (ne.Warn(\"Maximum number of faces at a pole used\"), t = this.goldbergData.nbFacesAtPole - 1), 12 + e * this.goldbergData.nbFacesAtPole + t);\n }\n _changeGoldbergFaceColors(e) {\n for (let i = 0; i < e.length; i++) {\n const r = e[i][0], s = e[i][1], a = e[i][2];\n for (let o = r; o < s + 1; o++)\n this.goldbergData.faceColors[o] = a;\n }\n const t = [];\n for (let i = 0; i < 12; i++)\n for (let r = 0; r < 5; r++)\n t.push(this.goldbergData.faceColors[i].r, this.goldbergData.faceColors[i].g, this.goldbergData.faceColors[i].b, this.goldbergData.faceColors[i].a);\n for (let i = 12; i < this.goldbergData.faceColors.length; i++)\n for (let r = 0; r < 6; r++)\n t.push(this.goldbergData.faceColors[i].r, this.goldbergData.faceColors[i].g, this.goldbergData.faceColors[i].b, this.goldbergData.faceColors[i].a);\n return t;\n }\n /**\n * Set new goldberg face colors\n * @param colorRange the new color to apply to the mesh\n */\n setGoldbergFaceColors(e) {\n const t = this._changeGoldbergFaceColors(e);\n this.setVerticesData(I.ColorKind, t);\n }\n /**\n * Updates new goldberg face colors\n * @param colorRange the new color to apply to the mesh\n */\n updateGoldbergFaceColors(e) {\n const t = this._changeGoldbergFaceColors(e);\n this.updateVerticesData(I.ColorKind, t);\n }\n _changeGoldbergFaceUVs(e) {\n const t = this.getVerticesData(I.UVKind);\n for (let i = 0; i < e.length; i++) {\n const r = e[i][0], s = e[i][1], a = e[i][2], o = e[i][3], l = e[i][4], c = [], h = [];\n let u, f;\n for (let d = 0; d < 5; d++)\n u = a.x + o * Math.cos(l + d * Math.PI / 2.5), f = a.y + o * Math.sin(l + d * Math.PI / 2.5), u < 0 && (u = 0), u > 1 && (u = 1), c.push(u, f);\n for (let d = 0; d < 6; d++)\n u = a.x + o * Math.cos(l + d * Math.PI / 3), f = a.y + o * Math.sin(l + d * Math.PI / 3), u < 0 && (u = 0), u > 1 && (u = 1), h.push(u, f);\n for (let d = r; d < Math.min(12, s + 1); d++)\n for (let p = 0; p < 5; p++)\n t[10 * d + 2 * p] = c[2 * p], t[10 * d + 2 * p + 1] = c[2 * p + 1];\n for (let d = Math.max(12, r); d < s + 1; d++)\n for (let p = 0; p < 6; p++)\n t[12 * d - 24 + 2 * p] = h[2 * p], t[12 * d - 23 + 2 * p] = h[2 * p + 1];\n }\n return t;\n }\n /**\n * set new goldberg face UVs\n * @param uvRange the new UVs to apply to the mesh\n */\n setGoldbergFaceUVs(e) {\n const t = this._changeGoldbergFaceUVs(e);\n this.setVerticesData(I.UVKind, t);\n }\n /**\n * Updates new goldberg face UVs\n * @param uvRange the new UVs to apply to the mesh\n */\n updateGoldbergFaceUVs(e) {\n const t = this._changeGoldbergFaceUVs(e);\n this.updateVerticesData(I.UVKind, t);\n }\n /**\n * Places a mesh on a particular face of the goldberg polygon\n * @param mesh Defines the mesh to position\n * @param face Defines the face to position onto\n * @param position Defines the position relative to the face we are positioning the mesh onto\n */\n placeOnGoldbergFaceAt(e, t, i) {\n const r = _.RotationFromAxis(this.goldbergData.faceXaxis[t], this.goldbergData.faceYaxis[t], this.goldbergData.faceZaxis[t]);\n e.rotation = r, e.position = this.goldbergData.faceCenters[t].add(this.goldbergData.faceXaxis[t].scale(i.x)).add(this.goldbergData.faceYaxis[t].scale(i.y)).add(this.goldbergData.faceZaxis[t].scale(i.z));\n }\n /**\n * Serialize current mesh\n * @param serializationObject defines the object which will receive the serialization data\n */\n serialize(e) {\n super.serialize(e), e.type = \"GoldbergMesh\";\n const t = {};\n if (t.adjacentFaces = this.goldbergData.adjacentFaces, t.nbSharedFaces = this.goldbergData.nbSharedFaces, t.nbUnsharedFaces = this.goldbergData.nbUnsharedFaces, t.nbFaces = this.goldbergData.nbFaces, t.nbFacesAtPole = this.goldbergData.nbFacesAtPole, this.goldbergData.faceColors) {\n t.faceColors = [];\n for (const i of this.goldbergData.faceColors)\n t.faceColors.push(i.asArray());\n }\n if (this.goldbergData.faceCenters) {\n t.faceCenters = [];\n for (const i of this.goldbergData.faceCenters)\n t.faceCenters.push(i.asArray());\n }\n if (this.goldbergData.faceZaxis) {\n t.faceZaxis = [];\n for (const i of this.goldbergData.faceZaxis)\n t.faceZaxis.push(i.asArray());\n }\n if (this.goldbergData.faceYaxis) {\n t.faceYaxis = [];\n for (const i of this.goldbergData.faceYaxis)\n t.faceYaxis.push(i.asArray());\n }\n if (this.goldbergData.faceXaxis) {\n t.faceXaxis = [];\n for (const i of this.goldbergData.faceXaxis)\n t.faceXaxis.push(i.asArray());\n }\n e.goldbergData = t;\n }\n /**\n * Parses a serialized goldberg mesh\n * @param parsedMesh the serialized mesh\n * @param scene the scene to create the goldberg mesh in\n * @returns the created goldberg mesh\n */\n static Parse(e, t) {\n const i = e.goldbergData;\n i.faceColors = i.faceColors.map((s) => et.FromArray(s)), i.faceCenters = i.faceCenters.map((s) => _.FromArray(s)), i.faceZaxis = i.faceZaxis.map((s) => _.FromArray(s)), i.faceXaxis = i.faceXaxis.map((s) => _.FromArray(s)), i.faceYaxis = i.faceYaxis.map((s) => _.FromArray(s));\n const r = new gf(e.name, t);\n return r.goldbergData = i, r;\n }\n}\nB._TrailMeshParser = (n, e) => sc.Parse(n, e);\nclass sc extends B {\n /**\n * Creates a new TrailMesh.\n * @param name The value used by scene.getMeshByName() to do a lookup.\n * @param generator The mesh or transform node to generate a trail.\n * @param scene The scene to add this mesh to.\n * @param diameter Diameter of trailing mesh. Default is 1.\n * @param length Length of trailing mesh. Default is 60.\n * @param autoStart Automatically start trailing mesh. Default true.\n */\n constructor(e, t, i, r = 1, s = 60, a = !0) {\n super(e, i), this._sectionPolygonPointsCount = 4, this._running = !1, this._autoStart = a, this._generator = t, this.diameter = r, this._length = s, this._sectionVectors = [], this._sectionNormalVectors = [];\n for (let o = 0; o <= this._sectionPolygonPointsCount; o++)\n this._sectionVectors[o] = _.Zero(), this._sectionNormalVectors[o] = _.Zero();\n this._createMesh();\n }\n /**\n * \"TrailMesh\"\n * @returns \"TrailMesh\"\n */\n getClassName() {\n return \"TrailMesh\";\n }\n _createMesh() {\n const e = new re(), t = [], i = [], r = [], s = [];\n let a = _.Zero();\n this._generator instanceof er && this._generator.hasBoundingInfo ? a = this._generator.getBoundingInfo().boundingBox.centerWorld : a = this._generator.absolutePosition;\n const o = 2 * Math.PI / this._sectionPolygonPointsCount;\n for (let l = 0; l <= this._sectionPolygonPointsCount; l++) {\n const c = l !== this._sectionPolygonPointsCount ? l * o : 0;\n t.push(a.x + Math.cos(c) * this.diameter, a.y + Math.sin(c) * this.diameter, a.z), s.push(l / this._sectionPolygonPointsCount, 0);\n }\n for (let l = 1; l <= this._length; l++) {\n for (let h = 0; h <= this._sectionPolygonPointsCount; h++) {\n const u = h !== this._sectionPolygonPointsCount ? h * o : 0;\n t.push(a.x + Math.cos(u) * this.diameter, a.y + Math.sin(u) * this.diameter, a.z), s.push(h / this._sectionPolygonPointsCount, l / this._length);\n }\n const c = t.length / 3 - 2 * (this._sectionPolygonPointsCount + 1);\n for (let h = 0; h <= this._sectionPolygonPointsCount; h++)\n r.push(c + h, c + h + this._sectionPolygonPointsCount, c + h + this._sectionPolygonPointsCount + 1), r.push(c + h, c + h + this._sectionPolygonPointsCount + 1, c + h + 1);\n }\n re.ComputeNormals(t, r, i), e.positions = t, e.normals = i, e.indices = r, e.uvs = s, e.applyToMesh(this, !0), this._autoStart && this.start();\n }\n /**\n * Start trailing mesh.\n */\n start() {\n this._running || (this._running = !0, this._beforeRenderObserver = this.getScene().onBeforeRenderObservable.add(() => {\n this.update();\n }));\n }\n /**\n * Stop trailing mesh.\n */\n stop() {\n this._beforeRenderObserver && this._running && (this._running = !1, this.getScene().onBeforeRenderObservable.remove(this._beforeRenderObserver));\n }\n /**\n * Update trailing mesh geometry.\n */\n update() {\n const e = this.getVerticesData(I.PositionKind), t = this.getVerticesData(I.NormalKind), i = this._generator.getWorldMatrix();\n if (e && t) {\n for (let a = 3 * (this._sectionPolygonPointsCount + 1); a < e.length; a++)\n e[a - 3 * (this._sectionPolygonPointsCount + 1)] = e[a] - t[a] / this._length * this.diameter;\n for (let a = 3 * (this._sectionPolygonPointsCount + 1); a < t.length; a++)\n t[a - 3 * (this._sectionPolygonPointsCount + 1)] = t[a];\n const r = e.length - 3 * (this._sectionPolygonPointsCount + 1), s = 2 * Math.PI / this._sectionPolygonPointsCount;\n for (let a = 0; a <= this._sectionPolygonPointsCount; a++) {\n const o = a !== this._sectionPolygonPointsCount ? a * s : 0;\n this._sectionVectors[a].copyFromFloats(Math.cos(o) * this.diameter, Math.sin(o) * this.diameter, 0), this._sectionNormalVectors[a].copyFromFloats(Math.cos(o), Math.sin(o), 0), _.TransformCoordinatesToRef(this._sectionVectors[a], i, this._sectionVectors[a]), _.TransformNormalToRef(this._sectionNormalVectors[a], i, this._sectionNormalVectors[a]);\n }\n for (let a = 0; a <= this._sectionPolygonPointsCount; a++)\n e[r + 3 * a] = this._sectionVectors[a].x, e[r + 3 * a + 1] = this._sectionVectors[a].y, e[r + 3 * a + 2] = this._sectionVectors[a].z, t[r + 3 * a] = this._sectionNormalVectors[a].x, t[r + 3 * a + 1] = this._sectionNormalVectors[a].y, t[r + 3 * a + 2] = this._sectionNormalVectors[a].z;\n this.updateVerticesData(I.PositionKind, e, !0, !1), this.updateVerticesData(I.NormalKind, t, !0, !1);\n }\n }\n /**\n * Returns a new TrailMesh object.\n * @param name is a string, the name given to the new mesh\n * @param newGenerator use new generator object for cloned trail mesh\n * @returns a new mesh\n */\n clone(e = \"\", t) {\n return new sc(e, t ?? this._generator, this.getScene(), this.diameter, this._length, this._autoStart);\n }\n /**\n * Serializes this trail mesh\n * @param serializationObject object to write serialization to\n */\n serialize(e) {\n super.serialize(e), e.generatorId = this._generator.id;\n }\n /**\n * Parses a serialized trail mesh\n * @param parsedMesh the serialized mesh\n * @param scene the scene to create the trail mesh in\n * @returns the created trail mesh\n */\n static Parse(e, t) {\n const i = t.getLastMeshById(e.generatorId) ?? t.getLastTransformNodeById(e.generatorId);\n if (!i)\n throw new Error(\"TrailMesh: generator not found with ID \" + e.generatorId);\n return new sc(e.name, i, t, e.diameter ?? e._diameter, e._length, e._autoStart);\n }\n}\nB._instancedMeshFactory = (n, e) => {\n const t = new d0(n, e);\n if (e.instancedBuffers) {\n t.instancedBuffers = {};\n for (const i in e.instancedBuffers)\n t.instancedBuffers[i] = e.instancedBuffers[i];\n }\n return t;\n};\nclass d0 extends er {\n /**\n * Creates a new InstancedMesh object from the mesh source.\n * @param name defines the name of the instance\n * @param source the mesh to create the instance from\n */\n constructor(e, t) {\n super(e, t.getScene()), this._indexInSourceMeshInstanceArray = -1, this._distanceToCamera = 0, t.addInstance(this), this._sourceMesh = t, this._unIndexed = t._unIndexed, this.position.copyFrom(t.position), this.rotation.copyFrom(t.rotation), this.scaling.copyFrom(t.scaling), t.rotationQuaternion && (this.rotationQuaternion = t.rotationQuaternion.clone()), this.animations = t.animations.slice();\n for (const i of t.getAnimationRanges())\n i != null && this.createAnimationRange(i.name, i.from, i.to);\n this.infiniteDistance = t.infiniteDistance, this.setPivotMatrix(t.getPivotMatrix()), this.refreshBoundingInfo(!0, !0), this._syncSubMeshes();\n }\n /**\n * @returns the string \"InstancedMesh\".\n */\n getClassName() {\n return \"InstancedMesh\";\n }\n /** Gets the list of lights affecting that mesh */\n get lightSources() {\n return this._sourceMesh._lightSources;\n }\n _resyncLightSources() {\n }\n _resyncLightSource() {\n }\n _removeLightSource() {\n }\n // Methods\n /**\n * If the source mesh receives shadows\n */\n get receiveShadows() {\n return this._sourceMesh.receiveShadows;\n }\n set receiveShadows(e) {\n var t;\n ((t = this._sourceMesh) == null ? void 0 : t.receiveShadows) !== e && ge.Warn(\"Setting receiveShadows on an instanced mesh has no effect\");\n }\n /**\n * The material of the source mesh\n */\n get material() {\n return this._sourceMesh.material;\n }\n set material(e) {\n var t;\n ((t = this._sourceMesh) == null ? void 0 : t.material) !== e && ge.Warn(\"Setting material on an instanced mesh has no effect\");\n }\n /**\n * Visibility of the source mesh\n */\n get visibility() {\n return this._sourceMesh.visibility;\n }\n set visibility(e) {\n var t;\n ((t = this._sourceMesh) == null ? void 0 : t.visibility) !== e && ge.Warn(\"Setting visibility on an instanced mesh has no effect\");\n }\n /**\n * Skeleton of the source mesh\n */\n get skeleton() {\n return this._sourceMesh.skeleton;\n }\n set skeleton(e) {\n var t;\n ((t = this._sourceMesh) == null ? void 0 : t.skeleton) !== e && ge.Warn(\"Setting skeleton on an instanced mesh has no effect\");\n }\n /**\n * Rendering ground id of the source mesh\n */\n get renderingGroupId() {\n return this._sourceMesh.renderingGroupId;\n }\n set renderingGroupId(e) {\n !this._sourceMesh || e === this._sourceMesh.renderingGroupId || ne.Warn(\"Note - setting renderingGroupId of an instanced mesh has no effect on the scene\");\n }\n /**\n * @returns the total number of vertices (integer).\n */\n getTotalVertices() {\n return this._sourceMesh ? this._sourceMesh.getTotalVertices() : 0;\n }\n /**\n * Returns a positive integer : the total number of indices in this mesh geometry.\n * @returns the number of indices or zero if the mesh has no geometry.\n */\n getTotalIndices() {\n return this._sourceMesh.getTotalIndices();\n }\n /**\n * The source mesh of the instance\n */\n get sourceMesh() {\n return this._sourceMesh;\n }\n /**\n * Creates a new InstancedMesh object from the mesh model.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\n * @param name defines the name of the new instance\n * @returns a new InstancedMesh\n */\n createInstance(e) {\n return this._sourceMesh.createInstance(e);\n }\n /**\n * Is this node ready to be used/rendered\n * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\n * @returns {boolean} is it ready\n */\n isReady(e = !1) {\n return this._sourceMesh.isReady(e, !0);\n }\n /**\n * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices.\n * @param kind kind of verticies to retrieve (eg. positions, normals, uvs, etc.)\n * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one.\n * @param forceCopy defines a boolean forcing the copy of the buffer no matter what the value of copyWhenShared is\n * @returns a float array or a Float32Array of the requested kind of data : positions, normals, uvs, etc.\n */\n getVerticesData(e, t, i) {\n return this._sourceMesh.getVerticesData(e, t, i);\n }\n /**\n * Sets the vertex data of the mesh geometry for the requested `kind`.\n * If the mesh has no geometry, a new Geometry object is set to the mesh and then passed this vertex data.\n * The `data` are either a numeric array either a Float32Array.\n * The parameter `updatable` is passed as is to the underlying Geometry object constructor (if initially none) or updater.\n * The parameter `stride` is an optional positive integer, it is usually automatically deducted from the `kind` (3 for positions or normals, 2 for UV, etc).\n * Note that a new underlying VertexBuffer object is created each call.\n * If the `kind` is the `PositionKind`, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\n *\n * Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n *\n * Returns the Mesh.\n * @param kind defines vertex data kind\n * @param data defines the data source\n * @param updatable defines if the data must be flagged as updatable (false as default)\n * @param stride defines the vertex stride (optional)\n * @returns the current mesh\n */\n setVerticesData(e, t, i, r) {\n return this.sourceMesh && this.sourceMesh.setVerticesData(e, t, i, r), this.sourceMesh;\n }\n /**\n * Updates the existing vertex data of the mesh geometry for the requested `kind`.\n * If the mesh has no geometry, it is simply returned as it is.\n * The `data` are either a numeric array either a Float32Array.\n * No new underlying VertexBuffer object is created.\n * If the `kind` is the `PositionKind` and if `updateExtends` is true, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\n * If the parameter `makeItUnique` is true, a new global geometry is created from this positions and is set to the mesh.\n *\n * Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n *\n * Returns the Mesh.\n * @param kind defines vertex data kind\n * @param data defines the data source\n * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for \"position\" kind\n * @param makeItUnique defines it the updated vertex buffer must be flagged as unique (false by default)\n * @returns the source mesh\n */\n updateVerticesData(e, t, i, r) {\n return this.sourceMesh && this.sourceMesh.updateVerticesData(e, t, i, r), this.sourceMesh;\n }\n /**\n * Sets the mesh indices.\n * Expects an array populated with integers or a typed array (Int32Array, Uint32Array, Uint16Array).\n * If the mesh has no geometry, a new Geometry object is created and set to the mesh.\n * This method creates a new index buffer each call.\n * Returns the Mesh.\n * @param indices the source data\n * @param totalVertices defines the total number of vertices referenced by indices (could be null)\n * @returns source mesh\n */\n setIndices(e, t = null) {\n return this.sourceMesh && this.sourceMesh.setIndices(e, t), this.sourceMesh;\n }\n /**\n * Boolean : True if the mesh owns the requested kind of data.\n * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @returns true if data kind is present\n */\n isVerticesDataPresent(e) {\n return this._sourceMesh.isVerticesDataPresent(e);\n }\n /**\n * @returns an array of indices (IndicesArray).\n */\n getIndices() {\n return this._sourceMesh.getIndices();\n }\n get _positions() {\n return this._sourceMesh._positions;\n }\n /**\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\n * This means the mesh underlying bounding box and sphere are recomputed.\n * @param applySkeleton defines whether to apply the skeleton before computing the bounding info\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\n * @returns the current mesh\n */\n refreshBoundingInfo(e = !1, t = !1) {\n if (this.hasBoundingInfo && this.getBoundingInfo().isLocked)\n return this;\n const i = this._sourceMesh.geometry ? this._sourceMesh.geometry.boundingBias : null;\n return this._refreshBoundingInfo(this._sourceMesh._getPositionData(e, t), i), this;\n }\n /** @internal */\n _preActivate() {\n return this._currentLOD && this._currentLOD._preActivate(), this;\n }\n /**\n * @internal\n */\n _activate(e, t) {\n if (super._activate(e, t), this._sourceMesh.subMeshes || ne.Warn(\"Instances should only be created for meshes with geometry.\"), this._currentLOD) {\n if (this._currentLOD._getWorldMatrixDeterminant() >= 0 != this._getWorldMatrixDeterminant() >= 0)\n return this._internalAbstractMeshDataInfo._actAsRegularMesh = !0, !0;\n if (this._internalAbstractMeshDataInfo._actAsRegularMesh = !1, this._currentLOD._registerInstanceForRenderId(this, e), t) {\n if (!this._currentLOD._internalAbstractMeshDataInfo._isActiveIntermediate)\n return this._currentLOD._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = !0, !0;\n } else if (!this._currentLOD._internalAbstractMeshDataInfo._isActive)\n return this._currentLOD._internalAbstractMeshDataInfo._onlyForInstances = !0, !0;\n }\n return !1;\n }\n /** @internal */\n _postActivate() {\n this._sourceMesh.edgesShareWithInstances && this._sourceMesh._edgesRenderer && this._sourceMesh._edgesRenderer.isEnabled && this._sourceMesh._renderingGroup ? (this._sourceMesh._renderingGroup._edgesRenderers.pushNoDuplicate(this._sourceMesh._edgesRenderer), this._sourceMesh._edgesRenderer.customInstances.push(this.getWorldMatrix())) : this._edgesRenderer && this._edgesRenderer.isEnabled && this._sourceMesh._renderingGroup && this._sourceMesh._renderingGroup._edgesRenderers.push(this._edgesRenderer);\n }\n getWorldMatrix() {\n if (this._currentLOD && this._currentLOD.billboardMode !== He.BILLBOARDMODE_NONE && this._currentLOD._masterMesh !== this) {\n this._billboardWorldMatrix || (this._billboardWorldMatrix = new w());\n const e = this._currentLOD._masterMesh;\n return this._currentLOD._masterMesh = this, z.Vector3[7].copyFrom(this._currentLOD.position), this._currentLOD.position.set(0, 0, 0), this._billboardWorldMatrix.copyFrom(this._currentLOD.computeWorldMatrix(!0)), this._currentLOD.position.copyFrom(z.Vector3[7]), this._currentLOD._masterMesh = e, this._billboardWorldMatrix;\n }\n return super.getWorldMatrix();\n }\n get isAnInstance() {\n return !0;\n }\n /**\n * Returns the current associated LOD AbstractMesh.\n * @param camera defines the camera to use to pick the LOD level\n * @returns a Mesh or `null` if no LOD is associated with the AbstractMesh\n */\n getLOD(e) {\n if (!e)\n return this;\n const t = this.sourceMesh.getLODLevels();\n if (!t || t.length === 0)\n this._currentLOD = this.sourceMesh;\n else {\n const i = this.getBoundingInfo();\n this._currentLOD = this.sourceMesh.getLOD(e, i.boundingSphere);\n }\n return this._currentLOD;\n }\n /**\n * @internal\n */\n _preActivateForIntermediateRendering(e) {\n return this.sourceMesh._preActivateForIntermediateRendering(e);\n }\n /** @internal */\n _syncSubMeshes() {\n if (this.releaseSubMeshes(), this._sourceMesh.subMeshes)\n for (let e = 0; e < this._sourceMesh.subMeshes.length; e++)\n this._sourceMesh.subMeshes[e].clone(this, this._sourceMesh);\n return this;\n }\n /** @internal */\n _generatePointsArray() {\n return this._sourceMesh._generatePointsArray();\n }\n /** @internal */\n _updateBoundingInfo() {\n return this.hasBoundingInfo ? this.getBoundingInfo().update(this.worldMatrixFromCache) : this.buildBoundingInfo(this.absolutePosition, this.absolutePosition, this.worldMatrixFromCache), this._updateSubMeshesBoundingInfo(this.worldMatrixFromCache), this;\n }\n /**\n * Creates a new InstancedMesh from the current mesh.\n *\n * Returns the clone.\n * @param name the cloned mesh name\n * @param newParent the optional Node to parent the clone to.\n * @param doNotCloneChildren if `true` the model children aren't cloned.\n * @param newSourceMesh if set this mesh will be used as the source mesh instead of ths instance's one\n * @returns the clone\n */\n clone(e, t = null, i, r) {\n const s = (r || this._sourceMesh).createInstance(e);\n if (Dn.DeepCopy(this, s, [\n \"name\",\n \"subMeshes\",\n \"uniqueId\",\n \"parent\",\n \"lightSources\",\n \"receiveShadows\",\n \"material\",\n \"visibility\",\n \"skeleton\",\n \"sourceMesh\",\n \"isAnInstance\",\n \"facetNb\",\n \"isFacetDataEnabled\",\n \"isBlocked\",\n \"useBones\",\n \"hasInstances\",\n \"collider\",\n \"edgesRenderer\",\n \"forward\",\n \"up\",\n \"right\",\n \"absolutePosition\",\n \"absoluteScaling\",\n \"absoluteRotationQuaternion\",\n \"isWorldMatrixFrozen\",\n \"nonUniformScaling\",\n \"behaviors\",\n \"worldMatrixFromCache\",\n \"hasThinInstances\",\n \"hasBoundingInfo\"\n ], []), this.refreshBoundingInfo(), t && (s.parent = t), !i)\n for (let a = 0; a < this.getScene().meshes.length; a++) {\n const o = this.getScene().meshes[a];\n o.parent === this && o.clone(o.name, s);\n }\n return s.computeWorldMatrix(!0), this.onClonedObservable.notifyObservers(s), s;\n }\n /**\n * Disposes the InstancedMesh.\n * Returns nothing.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n this._sourceMesh.removeInstance(this), super.dispose(e, t);\n }\n /**\n * @internal\n */\n _serializeAsParent(e) {\n super._serializeAsParent(e), e.parentId = this._sourceMesh.uniqueId, e.parentInstanceIndex = this._indexInSourceMeshInstanceArray;\n }\n /**\n * Instantiate (when possible) or clone that node with its hierarchy\n * @param newParent defines the new parent to use for the instance (or clone)\n * @param options defines options to configure how copy is done\n * @param options.doNotInstantiate defines if the model must be instantiated or just cloned\n * @param options.newSourcedMesh newSourcedMesh the new source mesh for the instance (or clone)\n * @param onNewNodeCreated defines an option callback to call when a clone or an instance is created\n * @returns an instance (or a clone) of the current node with its hierarchy\n */\n instantiateHierarchy(e = null, t, i) {\n const r = this.clone(\"Clone of \" + (this.name || this.id), e || this.parent, !0, t && t.newSourcedMesh);\n r && i && i(this, r);\n for (const s of this.getChildTransformNodes(!0))\n s.instantiateHierarchy(r, t, i);\n return r;\n }\n}\nB.prototype.registerInstancedBuffer = function(n, e) {\n var t, i;\n if ((i = (t = this._userInstancedBuffersStorage) == null ? void 0 : t.vertexBuffers[n]) == null || i.dispose(), !this.instancedBuffers) {\n this.instancedBuffers = {};\n for (const r of this.instances)\n r.instancedBuffers = {};\n }\n this._userInstancedBuffersStorage || (this._userInstancedBuffersStorage = {\n data: {},\n vertexBuffers: {},\n strides: {},\n sizes: {},\n vertexArrayObjects: this.getEngine().getCaps().vertexArrayObject ? {} : void 0\n }), this.instancedBuffers[n] = null, this._userInstancedBuffersStorage.strides[n] = e, this._userInstancedBuffersStorage.sizes[n] = e * 32, this._userInstancedBuffersStorage.data[n] = new Float32Array(this._userInstancedBuffersStorage.sizes[n]), this._userInstancedBuffersStorage.vertexBuffers[n] = new I(this.getEngine(), this._userInstancedBuffersStorage.data[n], n, !0, !1, e, !0);\n for (const r of this.instances)\n r.instancedBuffers[n] = null;\n this._invalidateInstanceVertexArrayObject(), this._markSubMeshesAsAttributesDirty();\n};\nB.prototype._processInstancedBuffers = function(n, e) {\n const t = n ? n.length : 0;\n for (const i in this.instancedBuffers) {\n let r = this._userInstancedBuffersStorage.sizes[i];\n const s = this._userInstancedBuffersStorage.strides[i], a = (t + 1) * s;\n for (; r < a; )\n r *= 2;\n this._userInstancedBuffersStorage.data[i].length != r && (this._userInstancedBuffersStorage.data[i] = new Float32Array(r), this._userInstancedBuffersStorage.sizes[i] = r, this._userInstancedBuffersStorage.vertexBuffers[i] && (this._userInstancedBuffersStorage.vertexBuffers[i].dispose(), this._userInstancedBuffersStorage.vertexBuffers[i] = null));\n const o = this._userInstancedBuffersStorage.data[i];\n let l = 0;\n if (e) {\n const c = this.instancedBuffers[i];\n c.toArray ? c.toArray(o, l) : c.copyToArray ? c.copyToArray(o, l) : o[l] = c, l += s;\n }\n for (let c = 0; c < t; c++) {\n const u = n[c].instancedBuffers[i];\n u.toArray ? u.toArray(o, l) : u.copyToArray ? u.copyToArray(o, l) : o[l] = u, l += s;\n }\n this._userInstancedBuffersStorage.vertexBuffers[i] ? this._userInstancedBuffersStorage.vertexBuffers[i].updateDirectly(o, 0) : (this._userInstancedBuffersStorage.vertexBuffers[i] = new I(this.getEngine(), this._userInstancedBuffersStorage.data[i], i, !0, !1, s, !0), this._invalidateInstanceVertexArrayObject());\n }\n};\nB.prototype._invalidateInstanceVertexArrayObject = function() {\n if (!(!this._userInstancedBuffersStorage || this._userInstancedBuffersStorage.vertexArrayObjects === void 0)) {\n for (const n in this._userInstancedBuffersStorage.vertexArrayObjects)\n this.getEngine().releaseVertexArrayObject(this._userInstancedBuffersStorage.vertexArrayObjects[n]);\n this._userInstancedBuffersStorage.vertexArrayObjects = {};\n }\n};\nB.prototype._disposeInstanceSpecificData = function() {\n for (this._instanceDataStorage.instancesBuffer && (this._instanceDataStorage.instancesBuffer.dispose(), this._instanceDataStorage.instancesBuffer = null); this.instances.length; )\n this.instances[0].dispose();\n for (const n in this.instancedBuffers)\n this._userInstancedBuffersStorage.vertexBuffers[n] && this._userInstancedBuffersStorage.vertexBuffers[n].dispose();\n this._invalidateInstanceVertexArrayObject(), this.instancedBuffers = {};\n};\nconst YI = \"clipPlaneFragmentDeclaration\", ZI = `#ifdef CLIPPLANE\nvarying float fClipDistance;\n#endif\n#ifdef CLIPPLANE2\nvarying float fClipDistance2;\n#endif\n#ifdef CLIPPLANE3\nvarying float fClipDistance3;\n#endif\n#ifdef CLIPPLANE4\nvarying float fClipDistance4;\n#endif\n#ifdef CLIPPLANE5\nvarying float fClipDistance5;\n#endif\n#ifdef CLIPPLANE6\nvarying float fClipDistance6;\n#endif\n`;\nY.IncludesShadersStore[YI] = ZI;\nconst jI = \"fogFragmentDeclaration\", QI = `#ifdef FOG\n#define FOGMODE_NONE 0.\n#define FOGMODE_EXP 1.\n#define FOGMODE_EXP2 2.\n#define FOGMODE_LINEAR 3.\n#define E 2.71828\nuniform vec4 vFogInfos;uniform vec3 vFogColor;varying vec3 vFogDistance;float CalcFogFactor()\n{float fogCoeff=1.0;float fogStart=vFogInfos.y;float fogEnd=vFogInfos.z;float fogDensity=vFogInfos.w;float fogDistance=length(vFogDistance);if (FOGMODE_LINEAR==vFogInfos.x)\n{fogCoeff=(fogEnd-fogDistance)/(fogEnd-fogStart);}\nelse if (FOGMODE_EXP==vFogInfos.x)\n{fogCoeff=1.0/pow(E,fogDistance*fogDensity);}\nelse if (FOGMODE_EXP2==vFogInfos.x)\n{fogCoeff=1.0/pow(E,fogDistance*fogDistance*fogDensity*fogDensity);}\nreturn clamp(fogCoeff,0.0,1.0);}\n#endif\n`;\nY.IncludesShadersStore[jI] = QI;\nconst JI = \"clipPlaneFragment\", $I = `#if defined(CLIPPLANE) || defined(CLIPPLANE2) || defined(CLIPPLANE3) || defined(CLIPPLANE4) || defined(CLIPPLANE5) || defined(CLIPPLANE6)\nif (false) {}\n#endif\n#ifdef CLIPPLANE\nelse if (fClipDistance>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE2\nelse if (fClipDistance2>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE3\nelse if (fClipDistance3>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE4\nelse if (fClipDistance4>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE5\nelse if (fClipDistance5>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE6\nelse if (fClipDistance6>0.0)\n{discard;}\n#endif\n`;\nY.IncludesShadersStore[JI] = $I;\nconst eb = \"fogFragment\", tb = `#ifdef FOG\nfloat fog=CalcFogFactor();\n#ifdef PBR\nfog=toLinearSpace(fog);\n#endif\ncolor.rgb=mix(vFogColor,color.rgb,fog);\n#endif\n`;\nY.IncludesShadersStore[eb] = tb;\nconst ib = \"colorPixelShader\", rb = `#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\n#define VERTEXCOLOR\nvarying vec4 vColor;\n#else\nuniform vec4 color;\n#endif\n#include\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\ngl_FragColor=vColor;\n#else\ngl_FragColor=color;\n#endif\n#include(color,gl_FragColor)\n#define CUSTOM_FRAGMENT_MAIN_END\n}`;\nY.ShadersStore[ib] = rb;\nconst sb = \"clipPlaneVertexDeclaration\", nb = `#ifdef CLIPPLANE\nuniform vec4 vClipPlane;varying float fClipDistance;\n#endif\n#ifdef CLIPPLANE2\nuniform vec4 vClipPlane2;varying float fClipDistance2;\n#endif\n#ifdef CLIPPLANE3\nuniform vec4 vClipPlane3;varying float fClipDistance3;\n#endif\n#ifdef CLIPPLANE4\nuniform vec4 vClipPlane4;varying float fClipDistance4;\n#endif\n#ifdef CLIPPLANE5\nuniform vec4 vClipPlane5;varying float fClipDistance5;\n#endif\n#ifdef CLIPPLANE6\nuniform vec4 vClipPlane6;varying float fClipDistance6;\n#endif\n`;\nY.IncludesShadersStore[sb] = nb;\nconst ab = \"fogVertexDeclaration\", ob = `#ifdef FOG\nvarying vec3 vFogDistance;\n#endif\n`;\nY.IncludesShadersStore[ab] = ob;\nconst lb = \"clipPlaneVertex\", cb = `#ifdef CLIPPLANE\nfClipDistance=dot(worldPos,vClipPlane);\n#endif\n#ifdef CLIPPLANE2\nfClipDistance2=dot(worldPos,vClipPlane2);\n#endif\n#ifdef CLIPPLANE3\nfClipDistance3=dot(worldPos,vClipPlane3);\n#endif\n#ifdef CLIPPLANE4\nfClipDistance4=dot(worldPos,vClipPlane4);\n#endif\n#ifdef CLIPPLANE5\nfClipDistance5=dot(worldPos,vClipPlane5);\n#endif\n#ifdef CLIPPLANE6\nfClipDistance6=dot(worldPos,vClipPlane6);\n#endif\n`;\nY.IncludesShadersStore[lb] = cb;\nconst hb = \"fogVertex\", ub = `#ifdef FOG\nvFogDistance=(view*worldPos).xyz;\n#endif\n`;\nY.IncludesShadersStore[hb] = ub;\nconst fb = \"vertexColorMixing\", db = `#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvColor=vec4(1.0);\n#ifdef VERTEXCOLOR\n#ifdef VERTEXALPHA\nvColor*=color;\n#else\nvColor.rgb*=color.rgb;\n#endif\n#endif\n#ifdef INSTANCESCOLOR\nvColor*=instanceColor;\n#endif\n#endif\n`;\nY.IncludesShadersStore[fb] = db;\nconst pb = \"colorVertexShader\", gb = `attribute vec3 position;\n#ifdef VERTEXCOLOR\nattribute vec4 color;\n#endif\n#include\n#include\n#include\n#include\n#ifdef FOG\nuniform mat4 view;\n#endif\n#include\nuniform mat4 viewProjection;\n#ifdef MULTIVIEW\nuniform mat4 viewProjectionR;\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\n#include\n#include\n#include\nvec4 worldPos=finalWorld*vec4(position,1.0);\n#ifdef MULTIVIEW\nif (gl_ViewID_OVR==0u) {gl_Position=viewProjection*worldPos;} else {gl_Position=viewProjectionR*worldPos;}\n#else\ngl_Position=viewProjection*worldPos;\n#endif\n#include\n#include\n#include\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[pb] = gb;\nB._LinesMeshParser = (n, e) => Pa.Parse(n, e);\nclass Pa extends B {\n _isShaderMaterial(e) {\n return e.getClassName() === \"ShaderMaterial\";\n }\n /**\n * Creates a new LinesMesh\n * @param name defines the name\n * @param scene defines the hosting scene\n * @param parent defines the parent mesh if any\n * @param source defines the optional source LinesMesh used to clone data from\n * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False.\n * When false, achieved by calling a clone(), also passing False.\n * This will make creation of children, recursive.\n * @param useVertexColor defines if this LinesMesh supports vertex color\n * @param useVertexAlpha defines if this LinesMesh supports vertex alpha\n * @param material material to use to draw the line. If not provided, will create a new one\n */\n constructor(e, t = null, i = null, r = null, s, a, o, l) {\n super(e, t, i, r, s), this.useVertexColor = a, this.useVertexAlpha = o, this.color = new Ne(1, 1, 1), this.alpha = 1, r && (this.color = r.color.clone(), this.alpha = r.alpha, this.useVertexColor = r.useVertexColor, this.useVertexAlpha = r.useVertexAlpha), this.intersectionThreshold = 0.1;\n const c = [], h = {\n attributes: [I.PositionKind],\n uniforms: [\"world\", \"viewProjection\"],\n needAlphaBlending: !0,\n defines: c,\n useClipPlane: null\n };\n o === !1 ? h.needAlphaBlending = !1 : h.defines.push(\"#define VERTEXALPHA\"), a ? (h.defines.push(\"#define VERTEXCOLOR\"), h.attributes.push(I.ColorKind)) : (h.uniforms.push(\"color\"), this._color4 = new et()), l ? this.material = l : (this.material = new ks(\"colorShader\", this.getScene(), \"color\", h, !1), this.material.doNotSerialize = !0);\n }\n isReady() {\n return this._lineMaterial.isReady(this, !!this._userInstancedBuffersStorage || this.hasThinInstances) ? super.isReady() : !1;\n }\n /**\n * @returns the string \"LineMesh\"\n */\n getClassName() {\n return \"LinesMesh\";\n }\n /**\n * @internal\n */\n get material() {\n return this._lineMaterial;\n }\n /**\n * @internal\n */\n set material(e) {\n this._lineMaterial = e, this._lineMaterial.fillMode = ie.LineListDrawMode;\n }\n /**\n * @internal\n */\n get checkCollisions() {\n return !1;\n }\n set checkCollisions(e) {\n }\n /**\n * @internal\n */\n _bind(e, t) {\n if (!this._geometry)\n return this;\n const i = this.isUnIndexed ? null : this._geometry.getIndexBuffer();\n if (!this._userInstancedBuffersStorage || this.hasThinInstances ? this._geometry._bind(t, i) : this._geometry._bind(t, i, this._userInstancedBuffersStorage.vertexBuffers, this._userInstancedBuffersStorage.vertexArrayObjects), !this.useVertexColor && this._isShaderMaterial(this._lineMaterial)) {\n const { r, g: s, b: a } = this.color;\n this._color4.set(r, s, a, this.alpha), this._lineMaterial.setColor4(\"color\", this._color4);\n }\n return this;\n }\n /**\n * @internal\n */\n _draw(e, t, i) {\n if (!this._geometry || !this._geometry.getVertexBuffers() || !this._unIndexed && !this._geometry.getIndexBuffer())\n return this;\n const r = this.getScene().getEngine();\n return this._unIndexed ? r.drawArraysType(ie.LineListDrawMode, e.verticesStart, e.verticesCount, i) : r.drawElementsType(ie.LineListDrawMode, e.indexStart, e.indexCount, i), this;\n }\n /**\n * Disposes of the line mesh\n * @param doNotRecurse If children should be disposed\n * @param disposeMaterialAndTextures This parameter is not used by the LineMesh class\n * @param doNotDisposeMaterial If the material should not be disposed (default: false, meaning the material is disposed)\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n dispose(e, t = !1, i) {\n i || this._lineMaterial.dispose(!1, !1, !0), super.dispose(e);\n }\n /**\n * Returns a new LineMesh object cloned from the current one.\n * @param name defines the cloned mesh name\n * @param newParent defines the new mesh parent\n * @param doNotCloneChildren if set to true, none of the mesh children are cloned (false by default)\n * @returns the new mesh\n */\n clone(e, t = null, i) {\n return new Pa(e, this.getScene(), t, this, i);\n }\n /**\n * Creates a new InstancedLinesMesh object from the mesh model.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\n * @param name defines the name of the new instance\n * @returns a new InstancedLinesMesh\n */\n createInstance(e) {\n const t = new mb(e, this);\n if (this.instancedBuffers) {\n t.instancedBuffers = {};\n for (const i in this.instancedBuffers)\n t.instancedBuffers[i] = this.instancedBuffers[i];\n }\n return t;\n }\n /**\n * Serializes this ground mesh\n * @param serializationObject object to write serialization to\n */\n serialize(e) {\n super.serialize(e), e.color = this.color.asArray(), e.alpha = this.alpha;\n }\n /**\n * Parses a serialized ground mesh\n * @param parsedMesh the serialized mesh\n * @param scene the scene to create the ground mesh in\n * @returns the created ground mesh\n */\n static Parse(e, t) {\n const i = new Pa(e.name, t);\n return i.color = Ne.FromArray(e.color), i.alpha = e.alpha, i;\n }\n}\nclass mb extends d0 {\n constructor(e, t) {\n super(e, t), this.intersectionThreshold = t.intersectionThreshold;\n }\n /**\n * @returns the string \"InstancedLinesMesh\".\n */\n getClassName() {\n return \"InstancedLinesMesh\";\n }\n}\nfunction p0(n) {\n let e = n.pathArray;\n const t = n.closeArray || !1, i = n.closePath || !1, r = n.invertUV || !1, s = Math.floor(e[0].length / 2);\n let a = n.offset || s;\n a = a > s ? s : Math.floor(a);\n const o = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, l = n.uvs, c = n.colors, h = [], u = [], f = [], d = [], p = [], g = [], m = [], v = [];\n let E;\n const C = [], T = [];\n let R, x, S;\n if (e.length < 2) {\n const ue = [], Ye = [];\n for (x = 0; x < e[0].length - a; x++)\n ue.push(e[0][x]), Ye.push(e[0][x + a]);\n e = [ue, Ye];\n }\n let M = 0;\n const N = i ? 1 : 0, F = t ? 1 : 0;\n let L, K;\n E = e[0].length;\n let q, j;\n for (R = 0; R < e.length + F; R++) {\n for (m[R] = 0, p[R] = [0], L = R === e.length ? e[0] : e[R], K = L.length, E = E < K ? E : K, S = 0; S < K; )\n h.push(L[S].x, L[S].y, L[S].z), S > 0 && (q = L[S].subtract(L[S - 1]).length(), j = q + m[R], p[R].push(j), m[R] = j), S++;\n i && (S--, h.push(L[0].x, L[0].y, L[0].z), q = L[S].subtract(L[0]).length(), j = q + m[R], p[R].push(j), m[R] = j), C[R] = K + N, T[R] = M, M += K + N;\n }\n let k, Q, ce = null, de = null;\n for (x = 0; x < E + N; x++)\n for (v[x] = 0, g[x] = [0], R = 0; R < e.length - 1 + F; R++)\n k = e[R], Q = R === e.length - 1 ? e[0] : e[R + 1], x === E ? (ce = k[0], de = Q[0]) : (ce = k[x], de = Q[x]), q = de.subtract(ce).length(), j = q + v[x], g[x].push(j), v[x] = j;\n let Z, J;\n if (l)\n for (R = 0; R < l.length; R++)\n d.push(l[R].x, nt.UseOpenGLOrientationForUV ? 1 - l[R].y : l[R].y);\n else\n for (R = 0; R < e.length + F; R++)\n for (x = 0; x < E + N; x++)\n Z = m[R] != 0 ? p[R][x] / m[R] : 0, J = v[x] != 0 ? g[x][R] / v[x] : 0, r ? d.push(J, Z) : d.push(Z, nt.UseOpenGLOrientationForUV ? 1 - J : J);\n R = 0;\n let O = 0, G = C[R] - 1, ee = C[R + 1] - 1, _e = G < ee ? G : ee, Oe = T[1] - T[0];\n const ze = C.length - 1;\n for (; O <= _e && R < ze; )\n u.push(O, O + Oe, O + 1), u.push(O + Oe + 1, O + 1, O + Oe), O += 1, O === _e && (R++, Oe = T[R + 1] - T[R], G = C[R] - 1, ee = C[R + 1] - 1, O = T[R], _e = G < ee ? G + O : ee + O);\n if (re.ComputeNormals(h, u, f), i) {\n let ue = 0, Ye = 0;\n for (R = 0; R < e.length; R++) {\n ue = T[R] * 3, R + 1 < e.length ? Ye = (T[R + 1] - 1) * 3 : Ye = f.length - 3, f[ue] = (f[ue] + f[Ye]) * 0.5, f[ue + 1] = (f[ue + 1] + f[Ye + 1]) * 0.5, f[ue + 2] = (f[ue + 2] + f[Ye + 2]) * 0.5;\n const lt = Math.sqrt(f[ue] * f[ue] + f[ue + 1] * f[ue + 1] + f[ue + 2] * f[ue + 2]);\n f[ue] /= lt, f[ue + 1] /= lt, f[ue + 2] /= lt, f[Ye] = f[ue], f[Ye + 1] = f[ue + 1], f[Ye + 2] = f[ue + 2];\n }\n }\n if (t) {\n let ue = T[0] * 3, Ye = T[e.length] * 3;\n for (x = 0; x < E + N; x++) {\n f[ue] = (f[ue] + f[Ye]) * 0.5, f[ue + 1] = (f[ue + 1] + f[Ye + 1]) * 0.5, f[ue + 2] = (f[ue + 2] + f[Ye + 2]) * 0.5;\n const lt = Math.sqrt(f[ue] * f[ue] + f[ue + 1] * f[ue + 1] + f[ue + 2] * f[ue + 2]);\n f[ue] /= lt, f[ue + 1] /= lt, f[ue + 2] /= lt, f[Ye] = f[ue], f[Ye + 1] = f[ue + 1], f[Ye + 2] = f[ue + 2], ue += 3, Ye += 3;\n }\n }\n re._ComputeSides(o, h, u, f, d, n.frontUVs, n.backUVs);\n let fe = null;\n if (c) {\n fe = new Float32Array(c.length * 4);\n for (let ue = 0; ue < c.length; ue++)\n fe[ue * 4] = c[ue].r, fe[ue * 4 + 1] = c[ue].g, fe[ue * 4 + 2] = c[ue].b, fe[ue * 4 + 3] = c[ue].a;\n }\n const Te = new re(), Fe = new Float32Array(h), Se = new Float32Array(f), qe = new Float32Array(d);\n return Te.indices = u, Te.positions = Fe, Te.normals = Se, Te.uvs = qe, fe && Te.set(fe, I.ColorKind), i && (Te._idx = T), Te;\n}\nfunction Oa(n, e, t = null) {\n const i = e.pathArray, r = e.closeArray, s = e.closePath, a = B._GetDefaultSideOrientation(e.sideOrientation), o = e.instance, l = e.updatable;\n if (o) {\n const c = z.Vector3[0].setAll(Number.MAX_VALUE), h = z.Vector3[1].setAll(-Number.MAX_VALUE), u = (d) => {\n let p = i[0].length;\n const g = o;\n let m = 0;\n const v = g._originalBuilderSideOrientation === B.DOUBLESIDE ? 2 : 1;\n for (let E = 1; E <= v; ++E)\n for (let C = 0; C < i.length; ++C) {\n const T = i[C], R = T.length;\n p = p < R ? p : R;\n for (let x = 0; x < p; ++x) {\n const S = T[x];\n d[m] = S.x, d[m + 1] = S.y, d[m + 2] = S.z, c.minimizeInPlaceFromFloats(S.x, S.y, S.z), h.maximizeInPlaceFromFloats(S.x, S.y, S.z), m += 3;\n }\n if (g._creationDataStorage && g._creationDataStorage.closePath) {\n const x = T[0];\n d[m] = x.x, d[m + 1] = x.y, d[m + 2] = x.z, m += 3;\n }\n }\n }, f = o.getVerticesData(I.PositionKind);\n if (u(f), o.hasBoundingInfo ? o.getBoundingInfo().reConstruct(c, h, o._worldMatrix) : o.buildBoundingInfo(c, h, o._worldMatrix), o.updateVerticesData(I.PositionKind, f, !1, !1), e.colors) {\n const d = o.getVerticesData(I.ColorKind);\n for (let p = 0, g = 0; p < e.colors.length; p++, g += 4) {\n const m = e.colors[p];\n d[g] = m.r, d[g + 1] = m.g, d[g + 2] = m.b, d[g + 3] = m.a;\n }\n o.updateVerticesData(I.ColorKind, d, !1, !1);\n }\n if (e.uvs) {\n const d = o.getVerticesData(I.UVKind);\n for (let p = 0; p < e.uvs.length; p++)\n d[p * 2] = e.uvs[p].x, d[p * 2 + 1] = nt.UseOpenGLOrientationForUV ? 1 - e.uvs[p].y : e.uvs[p].y;\n o.updateVerticesData(I.UVKind, d, !1, !1);\n }\n if (!o.areNormalsFrozen || o.isFacetDataEnabled) {\n const d = o.getIndices(), p = o.getVerticesData(I.NormalKind), g = o.isFacetDataEnabled ? o.getFacetDataParameters() : null;\n if (re.ComputeNormals(f, d, p, g), o._creationDataStorage && o._creationDataStorage.closePath) {\n let m = 0, v = 0;\n for (let E = 0; E < i.length; E++)\n m = o._creationDataStorage.idx[E] * 3, E + 1 < i.length ? v = (o._creationDataStorage.idx[E + 1] - 1) * 3 : v = p.length - 3, p[m] = (p[m] + p[v]) * 0.5, p[m + 1] = (p[m + 1] + p[v + 1]) * 0.5, p[m + 2] = (p[m + 2] + p[v + 2]) * 0.5, p[v] = p[m], p[v + 1] = p[m + 1], p[v + 2] = p[m + 2];\n }\n o.areNormalsFrozen || o.updateVerticesData(I.NormalKind, p, !1, !1);\n }\n return o;\n } else {\n const c = new B(n, t);\n c._originalBuilderSideOrientation = a, c._creationDataStorage = new o0();\n const h = p0(e);\n return s && (c._creationDataStorage.idx = h._idx), c._creationDataStorage.closePath = s, c._creationDataStorage.closeArray = r, h.applyToMesh(c, l), c;\n }\n}\nre.CreateRibbon = p0;\nB.CreateRibbon = (n, e, t = !1, i, r, s, a = !1, o, l) => Oa(n, {\n pathArray: e,\n closeArray: t,\n closePath: i,\n offset: r,\n updatable: a,\n sideOrientation: o,\n instance: l\n}, s);\nfunction mf(n) {\n const e = [], t = [], i = [], r = [], s = n.radius || 0.5, a = n.tessellation || 64, o = n.arc && (n.arc <= 0 || n.arc > 1) ? 1 : n.arc || 1, l = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE;\n e.push(0, 0, 0), r.push(0.5, 0.5);\n const c = Math.PI * 2 * o, h = o === 1 ? c / a : c / (a - 1);\n let u = 0;\n for (let p = 0; p < a; p++) {\n const g = Math.cos(u), m = Math.sin(u), v = (g + 1) / 2, E = (1 - m) / 2;\n e.push(s * g, s * m, 0), r.push(v, nt.UseOpenGLOrientationForUV ? 1 - E : E), u += h;\n }\n o === 1 && (e.push(e[3], e[4], e[5]), r.push(r[2], nt.UseOpenGLOrientationForUV ? 1 - r[3] : r[3]));\n const f = e.length / 3;\n for (let p = 1; p < f - 1; p++)\n t.push(p + 1, 0, p);\n re.ComputeNormals(e, t, i), re._ComputeSides(l, e, t, i, r, n.frontUVs, n.backUVs);\n const d = new re();\n return d.indices = t, d.positions = e, d.normals = i, d.uvs = r, d;\n}\nfunction g0(n, e = {}, t = null) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, mf(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateDisc = mf;\nB.CreateDisc = (n, e, t, i = null, r, s) => g0(n, {\n radius: e,\n tessellation: t,\n sideOrientation: s,\n updatable: r\n}, i);\nfunction Ns(n) {\n const e = [], t = [], i = [], r = [];\n let s, a;\n const o = n.width || 1, l = n.height || 1, c = (n.subdivisionsX || n.subdivisions || 1) | 0, h = (n.subdivisionsY || n.subdivisions || 1) | 0;\n for (s = 0; s <= h; s++)\n for (a = 0; a <= c; a++) {\n const f = new _(a * o / c - o / 2, 0, (h - s) * l / h - l / 2), d = new _(0, 1, 0);\n t.push(f.x, f.y, f.z), i.push(d.x, d.y, d.z), r.push(a / c, nt.UseOpenGLOrientationForUV ? s / h : 1 - s / h);\n }\n for (s = 0; s < h; s++)\n for (a = 0; a < c; a++)\n e.push(a + 1 + (s + 1) * (c + 1)), e.push(a + 1 + s * (c + 1)), e.push(a + s * (c + 1)), e.push(a + (s + 1) * (c + 1)), e.push(a + 1 + (s + 1) * (c + 1)), e.push(a + s * (c + 1));\n const u = new re();\n return u.indices = e, u.positions = t, u.normals = i, u.uvs = r, u;\n}\nfunction m0(n) {\n const e = n.xmin !== void 0 && n.xmin !== null ? n.xmin : -1, t = n.zmin !== void 0 && n.zmin !== null ? n.zmin : -1, i = n.xmax !== void 0 && n.xmax !== null ? n.xmax : 1, r = n.zmax !== void 0 && n.zmax !== null ? n.zmax : 1, s = n.subdivisions || { w: 1, h: 1 }, a = n.precision || { w: 1, h: 1 }, o = [], l = [], c = [], h = [];\n let u, f, d, p;\n s.h = s.h < 1 ? 1 : s.h, s.w = s.w < 1 ? 1 : s.w, a.w = a.w < 1 ? 1 : a.w, a.h = a.h < 1 ? 1 : a.h;\n const g = {\n w: (i - e) / s.w,\n h: (r - t) / s.h\n };\n function m(E, C, T, R) {\n const x = l.length / 3, S = a.w + 1;\n for (u = 0; u < a.h; u++)\n for (f = 0; f < a.w; f++) {\n const F = [x + f + u * S, x + (f + 1) + u * S, x + (f + 1) + (u + 1) * S, x + f + (u + 1) * S];\n o.push(F[1]), o.push(F[2]), o.push(F[3]), o.push(F[0]), o.push(F[1]), o.push(F[3]);\n }\n const M = _.Zero(), N = new _(0, 1, 0);\n for (u = 0; u <= a.h; u++)\n for (M.z = u * (R - C) / a.h + C, f = 0; f <= a.w; f++)\n M.x = f * (T - E) / a.w + E, M.y = 0, l.push(M.x, M.y, M.z), c.push(N.x, N.y, N.z), h.push(f / a.w, u / a.h);\n }\n for (d = 0; d < s.h; d++)\n for (p = 0; p < s.w; p++)\n m(e + p * g.w, t + d * g.h, e + (p + 1) * g.w, t + (d + 1) * g.h);\n const v = new re();\n return v.indices = o, v.positions = l, v.normals = c, v.uvs = h, v;\n}\nfunction _0(n) {\n const e = [], t = [], i = [], r = [];\n let s, a;\n const o = n.colorFilter || new Ne(0.3, 0.59, 0.11), l = n.alphaFilter || 0;\n let c = !1;\n if (n.minHeight > n.maxHeight) {\n c = !0;\n const u = n.maxHeight;\n n.maxHeight = n.minHeight, n.minHeight = u;\n }\n for (s = 0; s <= n.subdivisions; s++)\n for (a = 0; a <= n.subdivisions; a++) {\n const u = new _(a * n.width / n.subdivisions - n.width / 2, 0, (n.subdivisions - s) * n.height / n.subdivisions - n.height / 2), f = (u.x + n.width / 2) / n.width * (n.bufferWidth - 1) | 0, d = (1 - (u.z + n.height / 2) / n.height) * (n.bufferHeight - 1) | 0, p = (f + d * n.bufferWidth) * 4;\n let g = n.buffer[p] / 255, m = n.buffer[p + 1] / 255, v = n.buffer[p + 2] / 255;\n const E = n.buffer[p + 3] / 255;\n c && (g = 1 - g, m = 1 - m, v = 1 - v);\n const C = g * o.r + m * o.g + v * o.b;\n E >= l ? u.y = n.minHeight + (n.maxHeight - n.minHeight) * C : u.y = n.minHeight - xt, n.heightBuffer && (n.heightBuffer[s * (n.subdivisions + 1) + a] = u.y), t.push(u.x, u.y, u.z), i.push(0, 0, 0), r.push(a / n.subdivisions, 1 - s / n.subdivisions);\n }\n for (s = 0; s < n.subdivisions; s++)\n for (a = 0; a < n.subdivisions; a++) {\n const u = a + 1 + (s + 1) * (n.subdivisions + 1), f = a + 1 + s * (n.subdivisions + 1), d = a + s * (n.subdivisions + 1), p = a + (s + 1) * (n.subdivisions + 1), g = t[u * 3 + 1] >= n.minHeight, m = t[f * 3 + 1] >= n.minHeight, v = t[d * 3 + 1] >= n.minHeight;\n g && m && v && (e.push(u), e.push(f), e.push(d)), t[p * 3 + 1] >= n.minHeight && g && v && (e.push(p), e.push(u), e.push(d));\n }\n re.ComputeNormals(t, e, i);\n const h = new re();\n return h.indices = e, h.positions = t, h.normals = i, h.uvs = r, h;\n}\nfunction _b(n, e = {}, t) {\n const i = new qo(n, t);\n return i._setReady(!1), i._subdivisionsX = e.subdivisionsX || e.subdivisions || 1, i._subdivisionsY = e.subdivisionsY || e.subdivisions || 1, i._width = e.width || 1, i._height = e.height || 1, i._maxX = i._width / 2, i._maxZ = i._height / 2, i._minX = -i._maxX, i._minZ = -i._maxZ, Ns(e).applyToMesh(i, e.updatable), i._setReady(!0), i;\n}\nfunction Eb(n, e, t = null) {\n const i = new B(n, t);\n return m0(e).applyToMesh(i, e.updatable), i;\n}\nfunction vb(n, e, t = {}, i = null) {\n const r = t.width || 10, s = t.height || 10, a = t.subdivisions || 1, o = t.minHeight || 0, l = t.maxHeight || 1, c = t.colorFilter || new Ne(0.3, 0.59, 0.11), h = t.alphaFilter || 0, u = t.updatable, f = t.onReady;\n i = i || st.LastCreatedScene;\n const d = new qo(n, i);\n d._subdivisionsX = a, d._subdivisionsY = a, d._width = r, d._height = s, d._maxX = d._width / 2, d._maxZ = d._height / 2, d._minX = -d._maxX, d._minZ = -d._maxZ, d._setReady(!1);\n let p;\n t.passHeightBufferInCallback && (p = new Float32Array((a + 1) * (a + 1)));\n const g = (m, v, E) => {\n _0({\n width: r,\n height: s,\n subdivisions: a,\n minHeight: o,\n maxHeight: l,\n colorFilter: c,\n buffer: m,\n bufferWidth: v,\n bufferHeight: E,\n alphaFilter: h,\n heightBuffer: p\n }).applyToMesh(d, u), f && f(d, p), d._setReady(!0);\n };\n if (typeof e == \"string\") {\n const m = (v) => {\n const E = v.width, C = v.height;\n if (i.isDisposed)\n return;\n const T = i == null ? void 0 : i.getEngine().resizeImageBitmap(v, E, C);\n g(T, E, C);\n };\n ge.LoadImage(e, m, t.onError ? t.onError : () => {\n }, i.offlineProvider);\n } else\n g(e.data, e.width, e.height);\n return d;\n}\nre.CreateGround = Ns;\nre.CreateTiledGround = m0;\nre.CreateGroundFromHeightMap = _0;\nB.CreateGround = (n, e, t, i, r, s) => _b(n, {\n width: e,\n height: t,\n subdivisions: i,\n updatable: s\n}, r);\nB.CreateTiledGround = (n, e, t, i, r, s, a, o, l) => Eb(n, {\n xmin: e,\n zmin: t,\n xmax: i,\n zmax: r,\n subdivisions: s,\n precision: a,\n updatable: l\n}, o);\nB.CreateGroundFromHeightMap = (n, e, t, i, r, s, a, o, l, c, h) => vb(n, e, {\n width: t,\n height: i,\n subdivisions: r,\n minHeight: s,\n maxHeight: a,\n updatable: l,\n onReady: c,\n alphaFilter: h\n}, o);\nfunction E0(n) {\n let t = [0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23];\n const i = [\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0\n ], r = [];\n let s = [];\n const a = n.width || n.size || 1, o = n.height || n.size || 1, l = n.depth || n.size || 1, c = n.wrap || !1;\n let h = n.topBaseAt === void 0 ? 1 : n.topBaseAt, u = n.bottomBaseAt === void 0 ? 0 : n.bottomBaseAt;\n h = (h + 4) % 4, u = (u + 4) % 4;\n const f = [2, 0, 3, 1], d = [2, 0, 1, 3];\n let p = f[h], g = d[u], m = [\n 1,\n -1,\n 1,\n -1,\n -1,\n 1,\n -1,\n 1,\n 1,\n 1,\n 1,\n 1,\n 1,\n 1,\n -1,\n -1,\n 1,\n -1,\n -1,\n -1,\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n -1,\n 1,\n -1,\n -1,\n 1,\n -1,\n 1,\n 1,\n 1,\n 1,\n -1,\n 1,\n 1,\n -1,\n -1,\n 1,\n -1,\n -1,\n -1,\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n -1,\n 1,\n -1,\n 1,\n 1,\n -1,\n 1,\n 1,\n 1,\n 1,\n -1,\n 1,\n 1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n 1\n ];\n if (c) {\n t = [2, 3, 0, 2, 0, 1, 4, 5, 6, 4, 6, 7, 9, 10, 11, 9, 11, 8, 12, 14, 15, 12, 13, 14], m = [\n -1,\n 1,\n 1,\n 1,\n 1,\n 1,\n 1,\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n 1,\n -1,\n -1,\n 1,\n -1,\n -1,\n -1,\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n 1,\n 1,\n 1,\n -1,\n 1,\n -1,\n -1,\n 1,\n -1,\n 1,\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n -1,\n -1,\n 1,\n -1,\n -1,\n -1\n ];\n let S = [\n [1, 1, 1],\n [-1, 1, 1],\n [-1, 1, -1],\n [1, 1, -1]\n ], M = [\n [-1, -1, 1],\n [1, -1, 1],\n [1, -1, -1],\n [-1, -1, -1]\n ];\n const N = [17, 18, 19, 16], F = [22, 23, 20, 21];\n for (; p > 0; )\n S.unshift(S.pop()), N.unshift(N.pop()), p--;\n for (; g > 0; )\n M.unshift(M.pop()), F.unshift(F.pop()), g--;\n S = S.flat(), M = M.flat(), m = m.concat(S).concat(M), t.push(N[0], N[2], N[3], N[0], N[1], N[2]), t.push(F[0], F[2], F[3], F[0], F[1], F[2]);\n }\n const v = [a / 2, o / 2, l / 2];\n s = m.reduce((S, M, N) => S.concat(M * v[N % 3]), []);\n const E = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, C = n.faceUV || new Array(6), T = n.faceColors, R = [];\n for (let S = 0; S < 6; S++)\n C[S] === void 0 && (C[S] = new Ke(0, 0, 1, 1)), T && T[S] === void 0 && (T[S] = new et(1, 1, 1, 1));\n for (let S = 0; S < 6; S++)\n if (r.push(C[S].z, nt.UseOpenGLOrientationForUV ? 1 - C[S].w : C[S].w), r.push(C[S].x, nt.UseOpenGLOrientationForUV ? 1 - C[S].w : C[S].w), r.push(C[S].x, nt.UseOpenGLOrientationForUV ? 1 - C[S].y : C[S].y), r.push(C[S].z, nt.UseOpenGLOrientationForUV ? 1 - C[S].y : C[S].y), T)\n for (let M = 0; M < 4; M++)\n R.push(T[S].r, T[S].g, T[S].b, T[S].a);\n re._ComputeSides(E, s, t, i, r, n.frontUVs, n.backUVs);\n const x = new re();\n if (x.indices = t, x.positions = s, x.normals = i, x.uvs = r, T) {\n const S = E === re.DOUBLESIDE ? R.concat(R) : R;\n x.colors = S;\n }\n return x;\n}\nfunction Tb(n) {\n const e = n.width || n.size || 1, t = n.height || n.size || 1, i = n.depth || n.size || 1, r = (n.widthSegments || n.segments || 1) | 0, s = (n.heightSegments || n.segments || 1) | 0, a = (n.depthSegments || n.segments || 1) | 0, o = new w(), l = new w(), c = new w(), h = Ns({ width: e, height: i, subdivisionsX: r, subdivisionsY: a });\n w.TranslationToRef(0, -t / 2, 0, l), w.RotationZToRef(Math.PI, o), o.multiplyToRef(l, c), h.transform(c);\n const u = Ns({ width: e, height: i, subdivisionsX: r, subdivisionsY: a });\n w.TranslationToRef(0, t / 2, 0, c), u.transform(c);\n const f = Ns({ width: t, height: i, subdivisionsX: s, subdivisionsY: a });\n w.TranslationToRef(-e / 2, 0, 0, l), w.RotationZToRef(Math.PI / 2, o), o.multiplyToRef(l, c), f.transform(c);\n const d = Ns({ width: t, height: i, subdivisionsX: s, subdivisionsY: a });\n w.TranslationToRef(e / 2, 0, 0, l), w.RotationZToRef(-Math.PI / 2, o), o.multiplyToRef(l, c), d.transform(c);\n const p = Ns({ width: e, height: t, subdivisionsX: r, subdivisionsY: s });\n w.TranslationToRef(0, 0, -i / 2, l), w.RotationXToRef(-Math.PI / 2, o), o.multiplyToRef(l, c), p.transform(c);\n const g = Ns({ width: e, height: t, subdivisionsX: r, subdivisionsY: s });\n return w.TranslationToRef(0, 0, i / 2, l), w.RotationXToRef(Math.PI / 2, o), o.multiplyToRef(l, c), g.transform(c), h.merge([u, d, f, p, g], !0), h;\n}\nfunction xb(n, e = {}, t = null) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, E0(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateBox = E0;\nB.CreateBox = (n, e, t = null, i, r) => xb(n, {\n size: e,\n sideOrientation: r,\n updatable: i\n}, t);\nfunction Hl(n) {\n const e = n.pattern || B.NO_FLIP, t = n.tileWidth || n.tileSize || 1, i = n.tileHeight || n.tileSize || 1, r = n.alignHorizontal || 0, s = n.alignVertical || 0, a = n.width || n.size || 1, o = Math.floor(a / t);\n let l = a - o * t;\n const c = n.height || n.size || 1, h = Math.floor(c / i);\n let u = c - h * i;\n const f = t * o / 2, d = i * h / 2;\n let p = 0, g = 0, m = 0, v = 0, E = 0, C = 0;\n if (l > 0 || u > 0) {\n switch (m = -f, v = -d, E = f, C = d, r) {\n case B.CENTER:\n l /= 2, m -= l, E += l;\n break;\n case B.LEFT:\n E += l, p = -l / 2;\n break;\n case B.RIGHT:\n m -= l, p = l / 2;\n break;\n }\n switch (s) {\n case B.CENTER:\n u /= 2, v -= u, C += u;\n break;\n case B.BOTTOM:\n C += u, g = -u / 2;\n break;\n case B.TOP:\n v -= u, g = u / 2;\n break;\n }\n }\n const T = [], R = [], x = [];\n x[0] = [0, 0, 1, 0, 1, 1, 0, 1], x[1] = [0, 0, 1, 0, 1, 1, 0, 1], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (x[1] = [1, 1, 0, 1, 0, 0, 1, 0]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (x[1] = [1, 0, 0, 0, 0, 1, 1, 1]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (x[1] = [0, 1, 1, 1, 1, 0, 0, 0]);\n let S = [];\n const M = [], N = [];\n let F = 0;\n for (let j = 0; j < h; j++)\n for (let k = 0; k < o; k++)\n T.push(-f + k * t + p, -d + j * i + g, 0), T.push(-f + (k + 1) * t + p, -d + j * i + g, 0), T.push(-f + (k + 1) * t + p, -d + (j + 1) * i + g, 0), T.push(-f + k * t + p, -d + (j + 1) * i + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(x[(k % 2 + j % 2) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(x[j % 2]) : S = S.concat(x[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1), F += 4;\n if (l > 0 || u > 0) {\n const j = u > 0 && (s === B.CENTER || s === B.TOP), k = u > 0 && (s === B.CENTER || s === B.BOTTOM), Q = l > 0 && (r === B.CENTER || r === B.RIGHT), ce = l > 0 && (r === B.CENTER || r === B.LEFT);\n let de = [], Z, J, O, G;\n if (j && Q && (T.push(m + p, v + g, 0), T.push(-f + p, v + g, 0), T.push(-f + p, v + u + g, 0), T.push(m + p, v + u + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, Z = 1 - l / t, J = 1 - u / i, O = 1, G = 1, de = [Z, J, O, J, O, G, Z, G], e === B.ROTATE_ROW && (de = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), e === B.FLIP_ROW && (de = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), e === B.FLIP_N_ROTATE_ROW && (de = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), j && ce && (T.push(f + p, v + g, 0), T.push(E + p, v + g, 0), T.push(E + p, v + u + g, 0), T.push(f + p, v + u + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, Z = 0, J = 1 - u / i, O = l / t, G = 1, de = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_ROW || e === B.ROTATE_TILE && o % 2 === 0) && (de = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_ROW || e === B.FLIP_TILE && o % 2 === 0) && (de = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_ROW || e === B.FLIP_N_ROTATE_TILE && o % 2 === 0) && (de = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), k && Q && (T.push(m + p, d + g, 0), T.push(-f + p, d + g, 0), T.push(-f + p, C + g, 0), T.push(m + p, C + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, Z = 1 - l / t, J = 0, O = 1, G = u / i, de = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_ROW && h % 2 === 1 || e === B.ROTATE_TILE && h % 1 === 0) && (de = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_ROW && h % 2 === 1 || e === B.FLIP_TILE && h % 2 === 0) && (de = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_ROW && h % 2 === 1 || e === B.FLIP_N_ROTATE_TILE && h % 2 === 0) && (de = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), k && ce && (T.push(f + p, d + g, 0), T.push(E + p, d + g, 0), T.push(E + p, C + g, 0), T.push(f + p, C + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, Z = 0, J = 0, O = l / t, G = u / i, de = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_ROW && h % 2 === 1 || e === B.ROTATE_TILE && (h + o) % 2 === 1) && (de = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_ROW && h % 2 === 1 || e === B.FLIP_TILE && (h + o) % 2 === 1) && (de = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_ROW && h % 2 === 1 || e === B.FLIP_N_ROTATE_TILE && (h + o) % 2 === 1) && (de = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), j) {\n const ee = [];\n Z = 0, J = 1 - u / i, O = 1, G = 1, ee[0] = [Z, J, O, J, O, G, Z, G], ee[1] = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]);\n for (let _e = 0; _e < o; _e++)\n T.push(-f + _e * t + p, v + g, 0), T.push(-f + (_e + 1) * t + p, v + g, 0), T.push(-f + (_e + 1) * t + p, v + u + g, 0), T.push(-f + _e * t + p, v + u + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(ee[(_e + 1) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(ee[1]) : S = S.concat(ee[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\n }\n if (k) {\n const ee = [];\n Z = 0, J = 0, O = 1, G = u / i, ee[0] = [Z, J, O, J, O, G, Z, G], ee[1] = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]);\n for (let _e = 0; _e < o; _e++)\n T.push(-f + _e * t + p, C - u + g, 0), T.push(-f + (_e + 1) * t + p, C - u + g, 0), T.push(-f + (_e + 1) * t + p, C + g, 0), T.push(-f + _e * t + p, C + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(ee[(_e + h) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(ee[h % 2]) : S = S.concat(ee[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\n }\n if (Q) {\n const ee = [];\n Z = 1 - l / t, J = 0, O = 1, G = 1, ee[0] = [Z, J, O, J, O, G, Z, G], ee[1] = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]);\n for (let _e = 0; _e < h; _e++)\n T.push(m + p, -d + _e * i + g, 0), T.push(m + l + p, -d + _e * i + g, 0), T.push(m + l + p, -d + (_e + 1) * i + g, 0), T.push(m + p, -d + (_e + 1) * i + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(ee[(_e + 1) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(ee[_e % 2]) : S = S.concat(ee[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\n }\n if (ce) {\n const ee = [];\n Z = 0, J = 0, O = l / i, G = 1, ee[0] = [Z, J, O, J, O, G, Z, G], ee[1] = [Z, J, O, J, O, G, Z, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - Z, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - Z, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - Z, J, 1 - O, J, 1 - O, G, 1 - Z, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [Z, 1 - J, O, 1 - J, O, 1 - G, Z, 1 - G]);\n for (let _e = 0; _e < h; _e++)\n T.push(E - l + p, -d + _e * i + g, 0), T.push(E + p, -d + _e * i + g, 0), T.push(E + p, -d + (_e + 1) * i + g, 0), T.push(E - l + p, -d + (_e + 1) * i + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(ee[(_e + o) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(ee[_e % 2]) : S = S.concat(ee[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\n }\n }\n const L = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE;\n re._ComputeSides(L, T, N, R, S, n.frontUVs, n.backUVs);\n const K = new re();\n K.indices = N, K.positions = T, K.normals = R, K.uvs = S;\n const q = L === re.DOUBLESIDE ? M.concat(M) : M;\n return K.colors = q, K;\n}\nre.CreateTiledPlane = Hl;\nfunction Cb(n) {\n const t = n.faceUV || new Array(6), i = n.faceColors, r = n.pattern || B.NO_FLIP, s = n.width || n.size || 1, a = n.height || n.size || 1, o = n.depth || n.size || 1, l = n.tileWidth || n.tileSize || 1, c = n.tileHeight || n.tileSize || 1, h = n.alignHorizontal || 0, u = n.alignVertical || 0, f = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE;\n for (let O = 0; O < 6; O++)\n t[O] === void 0 && (t[O] = new Ke(0, 0, 1, 1)), i && i[O] === void 0 && (i[O] = new et(1, 1, 1, 1));\n const d = s / 2, p = a / 2, g = o / 2, m = [];\n for (let O = 0; O < 2; O++)\n m[O] = Hl({\n pattern: r,\n tileWidth: l,\n tileHeight: c,\n width: s,\n height: a,\n alignVertical: u,\n alignHorizontal: h,\n sideOrientation: f\n });\n for (let O = 2; O < 4; O++)\n m[O] = Hl({\n pattern: r,\n tileWidth: l,\n tileHeight: c,\n width: o,\n height: a,\n alignVertical: u,\n alignHorizontal: h,\n sideOrientation: f\n });\n let v = u;\n u === B.BOTTOM ? v = B.TOP : u === B.TOP && (v = B.BOTTOM);\n for (let O = 4; O < 6; O++)\n m[O] = Hl({\n pattern: r,\n tileWidth: l,\n tileHeight: c,\n width: s,\n height: o,\n alignVertical: v,\n alignHorizontal: h,\n sideOrientation: f\n });\n let E = [], C = [], T = [], R = [];\n const x = [], S = [], M = [], N = [];\n let F = 0, L = 0;\n for (let O = 0; O < 6; O++) {\n const G = m[O].positions.length;\n S[O] = [], M[O] = [];\n for (let ee = 0; ee < G / 3; ee++)\n S[O].push(new _(m[O].positions[3 * ee], m[O].positions[3 * ee + 1], m[O].positions[3 * ee + 2])), M[O].push(new _(m[O].normals[3 * ee], m[O].normals[3 * ee + 1], m[O].normals[3 * ee + 2]));\n F = m[O].uvs.length, N[O] = [];\n for (let ee = 0; ee < F; ee += 2)\n N[O][ee] = t[O].x + (t[O].z - t[O].x) * m[O].uvs[ee], N[O][ee + 1] = t[O].y + (t[O].w - t[O].y) * m[O].uvs[ee + 1], nt.UseOpenGLOrientationForUV && (N[O][ee + 1] = 1 - N[O][ee + 1]);\n if (T = T.concat(N[O]), R = R.concat(m[O].indices.map((ee) => ee + L)), L += S[O].length, i)\n for (let ee = 0; ee < 4; ee++)\n x.push(i[O].r, i[O].g, i[O].b, i[O].a);\n }\n const K = new _(0, 0, g), q = w.RotationY(Math.PI);\n E = S[0].map((O) => _.TransformNormal(O, q).add(K)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []), C = M[0].map((O) => _.TransformNormal(O, q)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []), E = E.concat(S[1].map((O) => O.subtract(K)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[1].map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []));\n const j = new _(d, 0, 0), k = w.RotationY(-Math.PI / 2);\n E = E.concat(S[2].map((O) => _.TransformNormal(O, k).add(j)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[2].map((O) => _.TransformNormal(O, k)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []));\n const Q = w.RotationY(Math.PI / 2);\n E = E.concat(S[3].map((O) => _.TransformNormal(O, Q).subtract(j)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[3].map((O) => _.TransformNormal(O, Q)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []));\n const ce = new _(0, p, 0), de = w.RotationX(Math.PI / 2);\n E = E.concat(S[4].map((O) => _.TransformNormal(O, de).add(ce)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[4].map((O) => _.TransformNormal(O, de)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []));\n const Z = w.RotationX(-Math.PI / 2);\n E = E.concat(S[5].map((O) => _.TransformNormal(O, Z).subtract(ce)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[5].map((O) => _.TransformNormal(O, Z)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), re._ComputeSides(f, E, R, C, T);\n const J = new re();\n if (J.indices = R, J.positions = E, J.normals = C, J.uvs = T, i) {\n const O = f === re.DOUBLESIDE ? x.concat(x) : x;\n J.colors = O;\n }\n return J;\n}\nre.CreateTiledBox = Cb;\nfunction _f(n) {\n const e = (n.segments || 32) | 0, t = n.diameterX || n.diameter || 1, i = n.diameterY || n.diameter || 1, r = n.diameterZ || n.diameter || 1, s = n.arc && (n.arc <= 0 || n.arc > 1) ? 1 : n.arc || 1, a = n.slice && n.slice <= 0 ? 1 : n.slice || 1, o = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, l = !!n.dedupTopBottomIndices, c = new _(t / 2, i / 2, r / 2), h = 2 + e, u = 2 * h, f = [], d = [], p = [], g = [];\n for (let v = 0; v <= h; v++) {\n const E = v / h, C = E * Math.PI * a;\n for (let T = 0; T <= u; T++) {\n const R = T / u, x = R * Math.PI * 2 * s, S = w.RotationZ(-C), M = w.RotationY(x), N = _.TransformCoordinates(_.Up(), S), F = _.TransformCoordinates(N, M), L = F.multiply(c), K = F.divide(c).normalize();\n d.push(L.x, L.y, L.z), p.push(K.x, K.y, K.z), g.push(R, nt.UseOpenGLOrientationForUV ? 1 - E : E);\n }\n if (v > 0) {\n const T = d.length / 3;\n for (let R = T - 2 * (u + 1); R + u + 2 < T; R++)\n l ? (v > 1 && (f.push(R), f.push(R + 1), f.push(R + u + 1)), (v < h || a < 1) && (f.push(R + u + 1), f.push(R + 1), f.push(R + u + 2))) : (f.push(R), f.push(R + 1), f.push(R + u + 1), f.push(R + u + 1), f.push(R + 1), f.push(R + u + 2));\n }\n }\n re._ComputeSides(o, d, f, p, g, n.frontUVs, n.backUVs);\n const m = new re();\n return m.indices = f, m.positions = d, m.normals = p, m.uvs = g, m;\n}\nfunction v0(n, e = {}, t = null) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, _f(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateSphere = _f;\nB.CreateSphere = (n, e, t, i, r, s) => v0(n, {\n segments: e,\n diameterX: t,\n diameterY: t,\n diameterZ: t,\n sideOrientation: s,\n updatable: r\n}, i);\nfunction Ef(n) {\n const e = n.height || 2;\n let t = n.diameterTop === 0 ? 0 : n.diameterTop || n.diameter || 1, i = n.diameterBottom === 0 ? 0 : n.diameterBottom || n.diameter || 1;\n t = t || 1e-5, i = i || 1e-5;\n const r = (n.tessellation || 24) | 0, s = (n.subdivisions || 1) | 0, a = !!n.hasRings, o = !!n.enclose, l = n.cap === 0 ? 0 : n.cap || B.CAP_ALL, c = n.arc && (n.arc <= 0 || n.arc > 1) ? 1 : n.arc || 1, h = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, u = n.faceUV || new Array(3), f = n.faceColors, d = c !== 1 && o ? 2 : 0, p = a ? s : 1, g = 2 + (1 + d) * p;\n let m;\n for (m = 0; m < g; m++)\n f && f[m] === void 0 && (f[m] = new et(1, 1, 1, 1));\n for (m = 0; m < g; m++)\n u && u[m] === void 0 && (u[m] = new Ke(0, 0, 1, 1));\n const v = [], E = [], C = [], T = [], R = [], x = Math.PI * 2 * c / r;\n let S, M, N;\n const F = (i - t) / 2 / e, L = _.Zero(), K = _.Zero(), q = _.Zero(), j = _.Zero(), k = _.Zero(), Q = Ko.Y;\n let ce, de, Z, J = 1, O = 1, G = 0, ee = 0;\n for (ce = 0; ce <= s; ce++)\n for (M = ce / s, N = (M * (t - i) + i) / 2, J = a && ce !== 0 && ce !== s ? 2 : 1, Z = 0; Z < J; Z++) {\n for (a && (O += Z), o && (O += 2 * Z), de = 0; de <= r; de++)\n S = de * x, L.x = Math.cos(-S) * N, L.y = -e / 2 + M * e, L.z = Math.sin(-S) * N, t === 0 && ce === s ? (K.x = C[C.length - (r + 1) * 3], K.y = C[C.length - (r + 1) * 3 + 1], K.z = C[C.length - (r + 1) * 3 + 2]) : (K.x = L.x, K.z = L.z, K.y = Math.sqrt(K.x * K.x + K.z * K.z) * F, K.normalize()), de === 0 && (q.copyFrom(L), j.copyFrom(K)), E.push(L.x, L.y, L.z), C.push(K.x, K.y, K.z), a ? ee = G !== O ? u[O].y : u[O].w : ee = u[O].y + (u[O].w - u[O].y) * M, T.push(u[O].x + (u[O].z - u[O].x) * de / r, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), f && R.push(f[O].r, f[O].g, f[O].b, f[O].a);\n c !== 1 && o && (E.push(L.x, L.y, L.z), E.push(0, L.y, 0), E.push(0, L.y, 0), E.push(q.x, q.y, q.z), _.CrossToRef(Q, K, k), k.normalize(), C.push(k.x, k.y, k.z, k.x, k.y, k.z), _.CrossToRef(j, Q, k), k.normalize(), C.push(k.x, k.y, k.z, k.x, k.y, k.z), a ? ee = G !== O ? u[O + 1].y : u[O + 1].w : ee = u[O + 1].y + (u[O + 1].w - u[O + 1].y) * M, T.push(u[O + 1].x, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), T.push(u[O + 1].z, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), a ? ee = G !== O ? u[O + 2].y : u[O + 2].w : ee = u[O + 2].y + (u[O + 2].w - u[O + 2].y) * M, T.push(u[O + 2].x, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), T.push(u[O + 2].z, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), f && (R.push(f[O + 1].r, f[O + 1].g, f[O + 1].b, f[O + 1].a), R.push(f[O + 1].r, f[O + 1].g, f[O + 1].b, f[O + 1].a), R.push(f[O + 2].r, f[O + 2].g, f[O + 2].b, f[O + 2].a), R.push(f[O + 2].r, f[O + 2].g, f[O + 2].b, f[O + 2].a))), G !== O && (G = O);\n }\n const _e = c !== 1 && o ? r + 4 : r;\n for (ce = 0, O = 0; O < s; O++) {\n let fe = 0, Te = 0, Fe = 0, Se = 0;\n for (de = 0; de < r; de++)\n fe = ce * (_e + 1) + de, Te = (ce + 1) * (_e + 1) + de, Fe = ce * (_e + 1) + (de + 1), Se = (ce + 1) * (_e + 1) + (de + 1), v.push(fe, Te, Fe), v.push(Se, Fe, Te);\n c !== 1 && o && (v.push(fe + 2, Te + 2, Fe + 2), v.push(Se + 2, Fe + 2, Te + 2), v.push(fe + 4, Te + 4, Fe + 4), v.push(Se + 4, Fe + 4, Te + 4)), ce = a ? ce + 2 : ce + 1;\n }\n const Oe = (fe) => {\n const Te = fe ? t / 2 : i / 2;\n if (Te === 0)\n return;\n let Fe, Se, qe;\n const ue = fe ? u[g - 1] : u[0];\n let Ye = null;\n f && (Ye = fe ? f[g - 1] : f[0]);\n const lt = E.length / 3, Ut = fe ? e / 2 : -e / 2, Ct = new _(0, Ut, 0);\n E.push(Ct.x, Ct.y, Ct.z), C.push(0, fe ? 1 : -1, 0);\n const Bi = ue.y + (ue.w - ue.y) * 0.5;\n T.push(ue.x + (ue.z - ue.x) * 0.5, nt.UseOpenGLOrientationForUV ? 1 - Bi : Bi), Ye && R.push(Ye.r, Ye.g, Ye.b, Ye.a);\n const hi = new me(0.5, 0.5);\n for (qe = 0; qe <= r; qe++) {\n Fe = Math.PI * 2 * qe * c / r;\n const Es = Math.cos(-Fe), Ur = Math.sin(-Fe);\n Se = new _(Es * Te, Ut, Ur * Te);\n const vs = new me(Es * hi.x + 0.5, Ur * hi.y + 0.5);\n E.push(Se.x, Se.y, Se.z), C.push(0, fe ? 1 : -1, 0);\n const ki = ue.y + (ue.w - ue.y) * vs.y;\n T.push(ue.x + (ue.z - ue.x) * vs.x, nt.UseOpenGLOrientationForUV ? 1 - ki : ki), Ye && R.push(Ye.r, Ye.g, Ye.b, Ye.a);\n }\n for (qe = 0; qe < r; qe++)\n fe ? (v.push(lt), v.push(lt + (qe + 2)), v.push(lt + (qe + 1))) : (v.push(lt), v.push(lt + (qe + 1)), v.push(lt + (qe + 2)));\n };\n (l === B.CAP_START || l === B.CAP_ALL) && Oe(!1), (l === B.CAP_END || l === B.CAP_ALL) && Oe(!0), re._ComputeSides(h, E, v, C, T, n.frontUVs, n.backUVs);\n const ze = new re();\n return ze.indices = v, ze.positions = E, ze.normals = C, ze.uvs = T, f && (ze.colors = R), ze;\n}\nfunction Rb(n, e = {}, t) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, Ef(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateCylinder = Ef;\nB.CreateCylinder = (n, e, t, i, r, s, a, o, l) => ((a === void 0 || !(a instanceof Ot)) && (a !== void 0 && (l = o || B.DEFAULTSIDE, o = a), a = s, s = 1), Rb(n, {\n height: e,\n diameterTop: t,\n diameterBottom: i,\n tessellation: r,\n subdivisions: s,\n sideOrientation: l,\n updatable: o\n}, a));\nfunction vf(n) {\n const e = [], t = [], i = [], r = [], s = n.diameter || 1, a = n.thickness || 0.5, o = (n.tessellation || 16) | 0, l = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, c = o + 1;\n for (let u = 0; u <= o; u++) {\n const f = u / o, d = u * Math.PI * 2 / o - Math.PI / 2, p = w.Translation(s / 2, 0, 0).multiply(w.RotationY(d));\n for (let g = 0; g <= o; g++) {\n const m = 1 - g / o, v = g * Math.PI * 2 / o + Math.PI, E = Math.cos(v), C = Math.sin(v);\n let T = new _(E, C, 0), R = T.scale(a / 2);\n const x = new me(f, m);\n R = _.TransformCoordinates(R, p), T = _.TransformNormal(T, p), t.push(R.x, R.y, R.z), i.push(T.x, T.y, T.z), r.push(x.x, nt.UseOpenGLOrientationForUV ? 1 - x.y : x.y);\n const S = (u + 1) % c, M = (g + 1) % c;\n e.push(u * c + g), e.push(u * c + M), e.push(S * c + g), e.push(u * c + M), e.push(S * c + M), e.push(S * c + g);\n }\n }\n re._ComputeSides(l, t, e, i, r, n.frontUVs, n.backUVs);\n const h = new re();\n return h.indices = e, h.positions = t, h.normals = i, h.uvs = r, h;\n}\nfunction Sb(n, e = {}, t) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, vf(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateTorus = vf;\nB.CreateTorus = (n, e, t, i, r, s, a) => Sb(n, {\n diameter: e,\n thickness: t,\n tessellation: i,\n sideOrientation: a,\n updatable: s\n}, r);\nfunction T0(n) {\n const e = [], t = [], i = [], r = [], s = n.radius || 2, a = n.tube || 0.5, o = n.radialSegments || 32, l = n.tubularSegments || 32, c = n.p || 2, h = n.q || 3, u = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, f = (m) => {\n const v = Math.cos(m), E = Math.sin(m), C = h / c * m, T = Math.cos(C), R = s * (2 + T) * 0.5 * v, x = s * (2 + T) * E * 0.5, S = s * Math.sin(C) * 0.5;\n return new _(R, x, S);\n };\n let d, p;\n for (d = 0; d <= o; d++) {\n const v = d % o / o * 2 * c * Math.PI, E = f(v), C = f(v + 0.01), T = C.subtract(E);\n let R = C.add(E);\n const x = _.Cross(T, R);\n for (R = _.Cross(x, T), x.normalize(), R.normalize(), p = 0; p < l; p++) {\n const M = p % l / l * 2 * Math.PI, N = -a * Math.cos(M), F = a * Math.sin(M);\n t.push(E.x + N * R.x + F * x.x), t.push(E.y + N * R.y + F * x.y), t.push(E.z + N * R.z + F * x.z), r.push(d / o), r.push(nt.UseOpenGLOrientationForUV ? 1 - p / l : p / l);\n }\n }\n for (d = 0; d < o; d++)\n for (p = 0; p < l; p++) {\n const m = (p + 1) % l, v = d * l + p, E = (d + 1) * l + p, C = (d + 1) * l + m, T = d * l + m;\n e.push(T), e.push(E), e.push(v), e.push(T), e.push(C), e.push(E);\n }\n re.ComputeNormals(t, e, i), re._ComputeSides(u, t, e, i, r, n.frontUVs, n.backUVs);\n const g = new re();\n return g.indices = e, g.positions = t, g.normals = i, g.uvs = r, g;\n}\nfunction yb(n, e = {}, t) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, T0(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateTorusKnot = T0;\nB.CreateTorusKnot = (n, e, t, i, r, s, a, o, l, c) => yb(n, {\n radius: e,\n tube: t,\n radialSegments: i,\n tubularSegments: r,\n p: s,\n q: a,\n sideOrientation: c,\n updatable: l\n}, o);\nfunction x0(n) {\n const e = [], t = [], i = n.lines, r = n.colors, s = [];\n let a = 0;\n for (let l = 0; l < i.length; l++) {\n const c = i[l];\n for (let h = 0; h < c.length; h++) {\n const { x: u, y: f, z: d } = c[h];\n if (t.push(u, f, d), r) {\n const p = r[l], { r: g, g: m, b: v, a: E } = p[h];\n s.push(g, m, v, E);\n }\n h > 0 && (e.push(a - 1), e.push(a)), a++;\n }\n }\n const o = new re();\n return o.indices = e, o.positions = t, r && (o.colors = s), o;\n}\nfunction C0(n) {\n const e = n.dashSize || 3, t = n.gapSize || 1, i = n.dashNb || 200, r = n.points, s = [], a = [], o = _.Zero();\n let l = 0, c = 0, h = 0, u = 0, f = 0, d = 0, p = 0;\n for (p = 0; p < r.length - 1; p++)\n r[p + 1].subtractToRef(r[p], o), l += o.length();\n for (h = l / i, u = e * h / (e + t), p = 0; p < r.length - 1; p++) {\n r[p + 1].subtractToRef(r[p], o), c = Math.floor(o.length() / h), o.normalize();\n for (let m = 0; m < c; m++)\n f = h * m, s.push(r[p].x + f * o.x, r[p].y + f * o.y, r[p].z + f * o.z), s.push(r[p].x + (f + u) * o.x, r[p].y + (f + u) * o.y, r[p].z + (f + u) * o.z), a.push(d, d + 1), d += 2;\n }\n const g = new re();\n return g.positions = s, g.indices = a, g;\n}\nfunction Ib(n, e, t = null) {\n const i = e.instance, r = e.lines, s = e.colors;\n if (i) {\n const c = i.getVerticesData(I.PositionKind);\n let h, u;\n s && (h = i.getVerticesData(I.ColorKind));\n let f = 0, d = 0;\n for (let p = 0; p < r.length; p++) {\n const g = r[p];\n for (let m = 0; m < g.length; m++)\n c[f] = g[m].x, c[f + 1] = g[m].y, c[f + 2] = g[m].z, s && h && (u = s[p], h[d] = u[m].r, h[d + 1] = u[m].g, h[d + 2] = u[m].b, h[d + 3] = u[m].a, d += 4), f += 3;\n }\n return i.updateVerticesData(I.PositionKind, c, !1, !1), s && h && i.updateVerticesData(I.ColorKind, h, !1, !1), i;\n }\n const a = !!s, o = new Pa(n, t, null, void 0, void 0, a, e.useVertexAlpha, e.material);\n return x0(e).applyToMesh(o, e.updatable), o;\n}\nfunction bb(n, e, t = null) {\n const i = e.colors ? [e.colors] : null;\n return Ib(n, { lines: [e.points], updatable: e.updatable, instance: e.instance, colors: i, useVertexAlpha: e.useVertexAlpha, material: e.material }, t);\n}\nfunction Ab(n, e, t = null) {\n const i = e.points, r = e.instance, s = e.gapSize || 1, a = e.dashSize || 3;\n if (r) {\n const c = (h) => {\n const u = _.Zero(), f = h.length / 6;\n let d = 0, p = 0, g = 0, m = 0, v = 0, E = 0, C = 0, T = 0;\n for (C = 0; C < i.length - 1; C++)\n i[C + 1].subtractToRef(i[C], u), d += u.length();\n g = d / f;\n const R = r._creationDataStorage.dashSize, x = r._creationDataStorage.gapSize;\n for (m = R * g / (R + x), C = 0; C < i.length - 1; C++)\n for (i[C + 1].subtractToRef(i[C], u), p = Math.floor(u.length() / g), u.normalize(), T = 0; T < p && E < h.length; )\n v = g * T, h[E] = i[C].x + v * u.x, h[E + 1] = i[C].y + v * u.y, h[E + 2] = i[C].z + v * u.z, h[E + 3] = i[C].x + (v + m) * u.x, h[E + 4] = i[C].y + (v + m) * u.y, h[E + 5] = i[C].z + (v + m) * u.z, E += 6, T++;\n for (; E < h.length; )\n h[E] = i[C].x, h[E + 1] = i[C].y, h[E + 2] = i[C].z, E += 3;\n };\n return (e.dashNb || e.dashSize || e.gapSize || e.useVertexAlpha || e.material) && ne.Warn(\"You have used an option other than points with the instance option. Please be aware that these other options will be ignored.\"), r.updateMeshPositions(c, !1), r;\n }\n const o = new Pa(n, t, null, void 0, void 0, void 0, e.useVertexAlpha, e.material);\n return C0(e).applyToMesh(o, e.updatable), o._creationDataStorage = new o0(), o._creationDataStorage.dashSize = a, o._creationDataStorage.gapSize = s, o;\n}\nre.CreateLineSystem = x0;\nre.CreateDashedLines = C0;\nB.CreateLines = (n, e, t = null, i = !1, r = null) => bb(n, {\n points: e,\n updatable: i,\n instance: r\n}, t);\nB.CreateDashedLines = (n, e, t, i, r, s = null, a, o) => Ab(n, {\n points: e,\n dashSize: t,\n gapSize: i,\n dashNb: r,\n updatable: a,\n instance: o\n}, s);\nvar Ea;\n(function(n) {\n n[n.CW = 0] = \"CW\", n[n.CCW = 1] = \"CCW\";\n})(Ea || (Ea = {}));\nclass os {\n /**\n * Creates an Angle object of \"radians\" radians (float).\n * @param radians the angle in radians\n */\n constructor(e) {\n this._radians = e, this._radians < 0 && (this._radians += 2 * Math.PI);\n }\n /**\n * Get value in degrees\n * @returns the Angle value in degrees (float)\n */\n degrees() {\n return this._radians * 180 / Math.PI;\n }\n /**\n * Get value in radians\n * @returns the Angle value in radians (float)\n */\n radians() {\n return this._radians;\n }\n /**\n * Gets a new Angle object with a value of the angle (in radians) between the line connecting the two points and the x-axis\n * @param a defines first point as the origin\n * @param b defines point\n * @returns a new Angle\n */\n static BetweenTwoPoints(e, t) {\n const i = t.subtract(e), r = Math.atan2(i.y, i.x);\n return new os(r);\n }\n /**\n * Gets the angle between the two vectors\n * @param a defines first vector\n * @param b defines vector\n * @returns Returns an new Angle between 0 and PI\n */\n static BetweenTwoVectors(e, t) {\n let i = e.lengthSquared() * t.lengthSquared();\n if (i === 0)\n return new os(Math.PI / 2);\n i = Math.sqrt(i);\n let r = e.dot(t) / i;\n r = je.Clamp(r, -1, 1);\n const s = Math.acos(r);\n return new os(s);\n }\n /**\n * Gets a new Angle object from the given float in radians\n * @param radians defines the angle value in radians\n * @returns a new Angle\n */\n static FromRadians(e) {\n return new os(e);\n }\n /**\n * Gets a new Angle object from the given float in degrees\n * @param degrees defines the angle value in degrees\n * @returns a new Angle\n */\n static FromDegrees(e) {\n return new os(e * Math.PI / 180);\n }\n}\nclass Mb {\n /**\n * Creates an Arc object from the three given points : start, middle and end.\n * @param startPoint Defines the start point of the arc\n * @param midPoint Defines the middle point of the arc\n * @param endPoint Defines the end point of the arc\n */\n constructor(e, t, i) {\n this.startPoint = e, this.midPoint = t, this.endPoint = i;\n const r = Math.pow(t.x, 2) + Math.pow(t.y, 2), s = (Math.pow(e.x, 2) + Math.pow(e.y, 2) - r) / 2, a = (r - Math.pow(i.x, 2) - Math.pow(i.y, 2)) / 2, o = (e.x - t.x) * (t.y - i.y) - (t.x - i.x) * (e.y - t.y);\n this.centerPoint = new me((s * (t.y - i.y) - a * (e.y - t.y)) / o, ((e.x - t.x) * a - (t.x - i.x) * s) / o), this.radius = this.centerPoint.subtract(this.startPoint).length(), this.startAngle = os.BetweenTwoPoints(this.centerPoint, this.startPoint);\n const l = this.startAngle.degrees();\n let c = os.BetweenTwoPoints(this.centerPoint, this.midPoint).degrees(), h = os.BetweenTwoPoints(this.centerPoint, this.endPoint).degrees();\n c - l > 180 && (c -= 360), c - l < -180 && (c += 360), h - c > 180 && (h -= 360), h - c < -180 && (h += 360), this.orientation = c - l < 0 ? Ea.CW : Ea.CCW, this.angle = os.FromDegrees(this.orientation === Ea.CW ? l - h : h - l);\n }\n}\nclass Vc {\n /**\n * Creates a Path2 object from the starting 2D coordinates x and y.\n * @param x the starting points x value\n * @param y the starting points y value\n */\n constructor(e, t) {\n this._points = new Array(), this._length = 0, this.closed = !1, this._points.push(new me(e, t));\n }\n /**\n * Adds a new segment until the given coordinates (x, y) to the current Path2.\n * @param x the added points x value\n * @param y the added points y value\n * @returns the updated Path2.\n */\n addLineTo(e, t) {\n if (this.closed)\n return this;\n const i = new me(e, t), r = this._points[this._points.length - 1];\n return this._points.push(i), this._length += i.subtract(r).length(), this;\n }\n /**\n * Adds _numberOfSegments_ segments according to the arc definition (middle point coordinates, end point coordinates, the arc start point being the current Path2 last point) to the current Path2.\n * @param midX middle point x value\n * @param midY middle point y value\n * @param endX end point x value\n * @param endY end point y value\n * @param numberOfSegments (default: 36)\n * @returns the updated Path2.\n */\n addArcTo(e, t, i, r, s = 36) {\n if (this.closed)\n return this;\n const a = this._points[this._points.length - 1], o = new me(e, t), l = new me(i, r), c = new Mb(a, o, l);\n let h = c.angle.radians() / s;\n c.orientation === Ea.CW && (h *= -1);\n let u = c.startAngle.radians() + h;\n for (let f = 0; f < s; f++) {\n const d = Math.cos(u) * c.radius + c.centerPoint.x, p = Math.sin(u) * c.radius + c.centerPoint.y;\n this.addLineTo(d, p), u += h;\n }\n return this;\n }\n /**\n * Adds _numberOfSegments_ segments according to the quadratic curve definition to the current Path2.\n * @param controlX control point x value\n * @param controlY control point y value\n * @param endX end point x value\n * @param endY end point y value\n * @param numberOfSegments (default: 36)\n * @returns the updated Path2.\n */\n addQuadraticCurveTo(e, t, i, r, s = 36) {\n if (this.closed)\n return this;\n const a = (l, c, h, u) => (1 - l) * (1 - l) * c + 2 * l * (1 - l) * h + l * l * u, o = this._points[this._points.length - 1];\n for (let l = 0; l <= s; l++) {\n const c = l / s, h = a(c, o.x, e, i), u = a(c, o.y, t, r);\n this.addLineTo(h, u);\n }\n return this;\n }\n /**\n * Adds _numberOfSegments_ segments according to the bezier curve definition to the current Path2.\n * @param originTangentX tangent vector at the origin point x value\n * @param originTangentY tangent vector at the origin point y value\n * @param destinationTangentX tangent vector at the destination point x value\n * @param destinationTangentY tangent vector at the destination point y value\n * @param endX end point x value\n * @param endY end point y value\n * @param numberOfSegments (default: 36)\n * @returns the updated Path2.\n */\n addBezierCurveTo(e, t, i, r, s, a, o = 36) {\n if (this.closed)\n return this;\n const l = (h, u, f, d, p) => (1 - h) * (1 - h) * (1 - h) * u + 3 * h * (1 - h) * (1 - h) * f + 3 * h * h * (1 - h) * d + h * h * h * p, c = this._points[this._points.length - 1];\n for (let h = 0; h <= o; h++) {\n const u = h / o, f = l(u, c.x, e, i, s), d = l(u, c.y, t, r, a);\n this.addLineTo(f, d);\n }\n return this;\n }\n /**\n * Defines if a given point is inside the polygon defines by the path\n * @param point defines the point to test\n * @returns true if the point is inside\n */\n isPointInside(e) {\n let t = !1;\n const i = this._points.length;\n for (let r = i - 1, s = 0; s < i; r = s++) {\n let a = this._points[r], o = this._points[s], l = o.x - a.x, c = o.y - a.y;\n if (Math.abs(c) > Number.EPSILON) {\n if (c < 0 && (a = this._points[s], l = -l, o = this._points[r], c = -c), e.y < a.y || e.y > o.y)\n continue;\n if (e.y === a.y && e.x === a.x)\n return !0;\n {\n const h = c * (e.x - a.x) - l * (e.y - a.y);\n if (h === 0)\n return !0;\n if (h < 0)\n continue;\n t = !t;\n }\n } else {\n if (e.y !== a.y)\n continue;\n if (o.x <= e.x && e.x <= a.x || a.x <= e.x && e.x <= o.x)\n return !0;\n }\n }\n return t;\n }\n /**\n * Closes the Path2.\n * @returns the Path2.\n */\n close() {\n return this.closed = !0, this;\n }\n /**\n * Gets the sum of the distance between each sequential point in the path\n * @returns the Path2 total length (float).\n */\n length() {\n let e = this._length;\n if (this.closed) {\n const t = this._points[this._points.length - 1], i = this._points[0];\n e += i.subtract(t).length();\n }\n return e;\n }\n /**\n * Gets the area of the polygon defined by the path\n * @returns area value\n */\n area() {\n const e = this._points.length;\n let t = 0;\n for (let i = e - 1, r = 0; r < e; i = r++)\n t += this._points[i].x * this._points[r].y - this._points[r].x * this._points[i].y;\n return t * 0.5;\n }\n /**\n * Gets the points which construct the path\n * @returns the Path2 internal array of points.\n */\n getPoints() {\n return this._points;\n }\n /**\n * Retrieves the point at the distance aways from the starting point\n * @param normalizedLengthPosition the length along the path to retrieve the point from\n * @returns a new Vector2 located at a percentage of the Path2 total length on this path.\n */\n getPointAtLengthPosition(e) {\n if (e < 0 || e > 1)\n return me.Zero();\n const t = e * this.length();\n let i = 0;\n for (let r = 0; r < this._points.length; r++) {\n const s = (r + 1) % this._points.length, a = this._points[r], l = this._points[s].subtract(a), c = l.length() + i;\n if (t >= i && t <= c) {\n const h = l.normalize(), u = t - i;\n return new me(a.x + h.x * u, a.y + h.y * u);\n }\n i = c;\n }\n return me.Zero();\n }\n /**\n * Creates a new path starting from an x and y position\n * @param x starting x value\n * @param y starting y value\n * @returns a new Path2 starting at the coordinates (x, y).\n */\n static StartingAt(e, t) {\n return new Vc(e, t);\n }\n}\nclass To {\n /**\n * new Path3D(path, normal, raw)\n * Creates a Path3D. A Path3D is a logical math object, so not a mesh.\n * please read the description in the tutorial : https://doc.babylonjs.com/features/featuresDeepDive/mesh/path3D\n * @param path an array of Vector3, the curve axis of the Path3D\n * @param firstNormal (options) Vector3, the first wanted normal to the curve. Ex (0, 1, 0) for a vertical normal.\n * @param raw (optional, default false) : boolean, if true the returned Path3D isn't normalized. Useful to depict path acceleration or speed.\n * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path.\n */\n constructor(e, t = null, i, r = !1) {\n this.path = e, this._curve = new Array(), this._distances = new Array(), this._tangents = new Array(), this._normals = new Array(), this._binormals = new Array(), this._pointAtData = {\n id: 0,\n point: _.Zero(),\n previousPointArrayIndex: 0,\n position: 0,\n subPosition: 0,\n interpolateReady: !1,\n interpolationMatrix: w.Identity()\n };\n for (let s = 0; s < e.length; s++)\n this._curve[s] = e[s].clone();\n this._raw = i || !1, this._alignTangentsWithPath = r, this._compute(t, r);\n }\n /**\n * Returns the Path3D array of successive Vector3 designing its curve.\n * @returns the Path3D array of successive Vector3 designing its curve.\n */\n getCurve() {\n return this._curve;\n }\n /**\n * Returns the Path3D array of successive Vector3 designing its curve.\n * @returns the Path3D array of successive Vector3 designing its curve.\n */\n getPoints() {\n return this._curve;\n }\n /**\n * @returns the computed length (float) of the path.\n */\n length() {\n return this._distances[this._distances.length - 1];\n }\n /**\n * Returns an array populated with tangent vectors on each Path3D curve point.\n * @returns an array populated with tangent vectors on each Path3D curve point.\n */\n getTangents() {\n return this._tangents;\n }\n /**\n * Returns an array populated with normal vectors on each Path3D curve point.\n * @returns an array populated with normal vectors on each Path3D curve point.\n */\n getNormals() {\n return this._normals;\n }\n /**\n * Returns an array populated with binormal vectors on each Path3D curve point.\n * @returns an array populated with binormal vectors on each Path3D curve point.\n */\n getBinormals() {\n return this._binormals;\n }\n /**\n * Returns an array populated with distances (float) of the i-th point from the first curve point.\n * @returns an array populated with distances (float) of the i-th point from the first curve point.\n */\n getDistances() {\n return this._distances;\n }\n /**\n * Returns an interpolated point along this path\n * @param position the position of the point along this path, from 0.0 to 1.0\n * @returns a new Vector3 as the point\n */\n getPointAt(e) {\n return this._updatePointAtData(e).point;\n }\n /**\n * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path.\n * @param position the position of the point along this path, from 0.0 to 1.0\n * @param interpolated (optional, default false) : boolean, if true returns an interpolated tangent instead of the tangent of the previous path point.\n * @returns a tangent vector corresponding to the interpolated Path3D curve point, if not interpolated, the tangent is taken from the precomputed tangents array.\n */\n getTangentAt(e, t = !1) {\n return this._updatePointAtData(e, t), t ? _.TransformCoordinates(_.Forward(), this._pointAtData.interpolationMatrix) : this._tangents[this._pointAtData.previousPointArrayIndex];\n }\n /**\n * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path.\n * @param position the position of the point along this path, from 0.0 to 1.0\n * @param interpolated (optional, default false) : boolean, if true returns an interpolated normal instead of the normal of the previous path point.\n * @returns a normal vector corresponding to the interpolated Path3D curve point, if not interpolated, the normal is taken from the precomputed normals array.\n */\n getNormalAt(e, t = !1) {\n return this._updatePointAtData(e, t), t ? _.TransformCoordinates(_.Right(), this._pointAtData.interpolationMatrix) : this._normals[this._pointAtData.previousPointArrayIndex];\n }\n /**\n * Returns the binormal vector of an interpolated Path3D curve point at the specified position along this path.\n * @param position the position of the point along this path, from 0.0 to 1.0\n * @param interpolated (optional, default false) : boolean, if true returns an interpolated binormal instead of the binormal of the previous path point.\n * @returns a binormal vector corresponding to the interpolated Path3D curve point, if not interpolated, the binormal is taken from the precomputed binormals array.\n */\n getBinormalAt(e, t = !1) {\n return this._updatePointAtData(e, t), t ? _.TransformCoordinates(_.UpReadOnly, this._pointAtData.interpolationMatrix) : this._binormals[this._pointAtData.previousPointArrayIndex];\n }\n /**\n * Returns the distance (float) of an interpolated Path3D curve point at the specified position along this path.\n * @param position the position of the point along this path, from 0.0 to 1.0\n * @returns the distance of the interpolated Path3D curve point at the specified position along this path.\n */\n getDistanceAt(e) {\n return this.length() * e;\n }\n /**\n * Returns the array index of the previous point of an interpolated point along this path\n * @param position the position of the point to interpolate along this path, from 0.0 to 1.0\n * @returns the array index\n */\n getPreviousPointIndexAt(e) {\n return this._updatePointAtData(e), this._pointAtData.previousPointArrayIndex;\n }\n /**\n * Returns the position of an interpolated point relative to the two path points it lies between, from 0.0 (point A) to 1.0 (point B)\n * @param position the position of the point to interpolate along this path, from 0.0 to 1.0\n * @returns the sub position\n */\n getSubPositionAt(e) {\n return this._updatePointAtData(e), this._pointAtData.subPosition;\n }\n /**\n * Returns the position of the closest virtual point on this path to an arbitrary Vector3, from 0.0 to 1.0\n * @param target the vector of which to get the closest position to\n * @returns the position of the closest virtual point on this path to the target vector\n */\n getClosestPositionTo(e) {\n let t = Number.MAX_VALUE, i = 0;\n for (let r = 0; r < this._curve.length - 1; r++) {\n const s = this._curve[r + 0], a = this._curve[r + 1].subtract(s).normalize(), o = this._distances[r + 1] - this._distances[r + 0], l = Math.min(Math.max(_.Dot(a, e.subtract(s).normalize()), 0) * _.Distance(s, e) / o, 1), c = _.Distance(s.add(a.scale(l * o)), e);\n c < t && (t = c, i = (this._distances[r + 0] + o * l) / this.length());\n }\n return i;\n }\n /**\n * Returns a sub path (slice) of this path\n * @param start the position of the fist path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values\n * @param end the position of the last path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values\n * @returns a sub path (slice) of this path\n */\n slice(e = 0, t = 1) {\n if (e < 0 && (e = 1 - e * -1 % 1), t < 0 && (t = 1 - t * -1 % 1), e > t) {\n const c = e;\n e = t, t = c;\n }\n const i = this.getCurve(), r = this.getPointAt(e);\n let s = this.getPreviousPointIndexAt(e);\n const a = this.getPointAt(t), o = this.getPreviousPointIndexAt(t) + 1, l = [];\n return e !== 0 && (s++, l.push(r)), l.push(...i.slice(s, o)), (t !== 1 || e === 1) && l.push(a), new To(l, this.getNormalAt(e), this._raw, this._alignTangentsWithPath);\n }\n /**\n * Forces the Path3D tangent, normal, binormal and distance recomputation.\n * @param path path which all values are copied into the curves points\n * @param firstNormal which should be projected onto the curve\n * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path\n * @returns the same object updated.\n */\n update(e, t = null, i = !1) {\n for (let r = 0; r < e.length; r++)\n this._curve[r].x = e[r].x, this._curve[r].y = e[r].y, this._curve[r].z = e[r].z;\n return this._compute(t, i), this;\n }\n // private function compute() : computes tangents, normals and binormals\n _compute(e, t = !1) {\n const i = this._curve.length;\n if (i < 2)\n return;\n this._tangents[0] = this._getFirstNonNullVector(0), this._raw || this._tangents[0].normalize(), this._tangents[i - 1] = this._curve[i - 1].subtract(this._curve[i - 2]), this._raw || this._tangents[i - 1].normalize();\n const r = this._tangents[0], s = this._normalVector(r, e);\n this._normals[0] = s, this._raw || this._normals[0].normalize(), this._binormals[0] = _.Cross(r, this._normals[0]), this._raw || this._binormals[0].normalize(), this._distances[0] = 0;\n let a, o, l, c, h;\n for (let u = 1; u < i; u++)\n a = this._getLastNonNullVector(u), u < i - 1 && (o = this._getFirstNonNullVector(u), this._tangents[u] = t ? o : a.add(o), this._tangents[u].normalize()), this._distances[u] = this._distances[u - 1] + this._curve[u].subtract(this._curve[u - 1]).length(), l = this._tangents[u], h = this._binormals[u - 1], this._normals[u] = _.Cross(h, l), this._raw || (this._normals[u].length() === 0 ? (c = this._normals[u - 1], this._normals[u] = c.clone()) : this._normals[u].normalize()), this._binormals[u] = _.Cross(l, this._normals[u]), this._raw || this._binormals[u].normalize();\n this._pointAtData.id = NaN;\n }\n // private function getFirstNonNullVector(index)\n // returns the first non null vector from index : curve[index + N].subtract(curve[index])\n _getFirstNonNullVector(e) {\n let t = 1, i = this._curve[e + t].subtract(this._curve[e]);\n for (; i.length() === 0 && e + t + 1 < this._curve.length; )\n t++, i = this._curve[e + t].subtract(this._curve[e]);\n return i;\n }\n // private function getLastNonNullVector(index)\n // returns the last non null vector from index : curve[index].subtract(curve[index - N])\n _getLastNonNullVector(e) {\n let t = 1, i = this._curve[e].subtract(this._curve[e - t]);\n for (; i.length() === 0 && e > t + 1; )\n t++, i = this._curve[e].subtract(this._curve[e - t]);\n return i;\n }\n // private function normalVector(v0, vt, va) :\n // returns an arbitrary point in the plane defined by the point v0 and the vector vt orthogonal to this plane\n // if va is passed, it returns the va projection on the plane orthogonal to vt at the point v0\n _normalVector(e, t) {\n let i, r = e.length();\n if (r === 0 && (r = 1), t == null) {\n let s;\n je.WithinEpsilon(Math.abs(e.y) / r, 1, xt) ? je.WithinEpsilon(Math.abs(e.x) / r, 1, xt) ? je.WithinEpsilon(Math.abs(e.z) / r, 1, xt) ? s = _.Zero() : s = new _(0, 0, 1) : s = new _(1, 0, 0) : s = new _(0, -1, 0), i = _.Cross(e, s);\n } else\n i = _.Cross(e, t), _.CrossToRef(i, e, i);\n return i.normalize(), i;\n }\n /**\n * Updates the point at data for an interpolated point along this curve\n * @param position the position of the point along this curve, from 0.0 to 1.0\n * @param interpolateTNB\n * @interpolateTNB whether to compute the interpolated tangent, normal and binormal\n * @returns the (updated) point at data\n */\n _updatePointAtData(e, t = !1) {\n if (this._pointAtData.id === e)\n return this._pointAtData.interpolateReady || this._updateInterpolationMatrix(), this._pointAtData;\n this._pointAtData.id = e;\n const i = this.getPoints();\n if (e <= 0)\n return this._setPointAtData(0, 0, i[0], 0, t);\n if (e >= 1)\n return this._setPointAtData(1, 1, i[i.length - 1], i.length - 1, t);\n let r = i[0], s, a = 0;\n const o = e * this.length();\n for (let l = 1; l < i.length; l++) {\n s = i[l];\n const c = _.Distance(r, s);\n if (a += c, a === o)\n return this._setPointAtData(e, 1, s, l, t);\n if (a > o) {\n const u = (a - o) / c, f = r.subtract(s), d = s.add(f.scaleInPlace(u));\n return this._setPointAtData(e, 1 - u, d, l - 1, t);\n }\n r = s;\n }\n return this._pointAtData;\n }\n /**\n * Updates the point at data from the specified parameters\n * @param position where along the path the interpolated point is, from 0.0 to 1.0\n * @param subPosition\n * @param point the interpolated point\n * @param parentIndex the index of an existing curve point that is on, or else positionally the first behind, the interpolated point\n * @param interpolateTNB whether to compute the interpolated tangent, normal and binormal\n * @returns the (updated) point at data\n */\n _setPointAtData(e, t, i, r, s) {\n return this._pointAtData.point = i, this._pointAtData.position = e, this._pointAtData.subPosition = t, this._pointAtData.previousPointArrayIndex = r, this._pointAtData.interpolateReady = s, s && this._updateInterpolationMatrix(), this._pointAtData;\n }\n /**\n * Updates the point at interpolation matrix for the tangents, normals and binormals\n */\n _updateInterpolationMatrix() {\n this._pointAtData.interpolationMatrix = w.Identity();\n const e = this._pointAtData.previousPointArrayIndex;\n if (e !== this._tangents.length - 1) {\n const t = e + 1, i = this._tangents[e].clone(), r = this._normals[e].clone(), s = this._binormals[e].clone(), a = this._tangents[t].clone(), o = this._normals[t].clone(), l = this._binormals[t].clone(), c = Ce.RotationQuaternionFromAxis(r, s, i), h = Ce.RotationQuaternionFromAxis(o, l, a);\n Ce.Slerp(c, h, this._pointAtData.subPosition).toRotationMatrix(this._pointAtData.interpolationMatrix);\n }\n }\n}\nclass Os {\n /**\n * Returns a Curve3 object along a Quadratic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#quadratic-bezier-curve\n * @param v0 (Vector3) the origin point of the Quadratic Bezier\n * @param v1 (Vector3) the control point\n * @param v2 (Vector3) the end point of the Quadratic Bezier\n * @param nbPoints (integer) the wanted number of points in the curve\n * @returns the created Curve3\n */\n static CreateQuadraticBezier(e, t, i, r) {\n r = r > 2 ? r : 3;\n const s = [], a = (o, l, c, h) => (1 - o) * (1 - o) * l + 2 * o * (1 - o) * c + o * o * h;\n for (let o = 0; o <= r; o++)\n s.push(new _(a(o / r, e.x, t.x, i.x), a(o / r, e.y, t.y, i.y), a(o / r, e.z, t.z, i.z)));\n return new Os(s);\n }\n /**\n * Returns a Curve3 object along a Cubic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#cubic-bezier-curve\n * @param v0 (Vector3) the origin point of the Cubic Bezier\n * @param v1 (Vector3) the first control point\n * @param v2 (Vector3) the second control point\n * @param v3 (Vector3) the end point of the Cubic Bezier\n * @param nbPoints (integer) the wanted number of points in the curve\n * @returns the created Curve3\n */\n static CreateCubicBezier(e, t, i, r, s) {\n s = s > 3 ? s : 4;\n const a = [], o = (l, c, h, u, f) => (1 - l) * (1 - l) * (1 - l) * c + 3 * l * (1 - l) * (1 - l) * h + 3 * l * l * (1 - l) * u + l * l * l * f;\n for (let l = 0; l <= s; l++)\n a.push(new _(o(l / s, e.x, t.x, i.x, r.x), o(l / s, e.y, t.y, i.y, r.y), o(l / s, e.z, t.z, i.z, r.z)));\n return new Os(a);\n }\n /**\n * Returns a Curve3 object along a Hermite Spline curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#hermite-spline\n * @param p1 (Vector3) the origin point of the Hermite Spline\n * @param t1 (Vector3) the tangent vector at the origin point\n * @param p2 (Vector3) the end point of the Hermite Spline\n * @param t2 (Vector3) the tangent vector at the end point\n * @param nSeg (integer) the number of curve segments or nSeg + 1 points in the array\n * @returns the created Curve3\n */\n static CreateHermiteSpline(e, t, i, r, s) {\n const a = [], o = 1 / s;\n for (let l = 0; l <= s; l++)\n a.push(_.Hermite(e, t, i, r, l * o));\n return new Os(a);\n }\n /**\n * Returns a Curve3 object along a CatmullRom Spline curve :\n * @param points (array of Vector3) the points the spline must pass through. At least, four points required\n * @param nbPoints (integer) the wanted number of points between each curve control points\n * @param closed (boolean) optional with default false, when true forms a closed loop from the points\n * @returns the created Curve3\n */\n static CreateCatmullRomSpline(e, t, i) {\n const r = [], s = 1 / t;\n let a = 0;\n if (i) {\n const o = e.length;\n for (let l = 0; l < o; l++) {\n a = 0;\n for (let c = 0; c < t; c++)\n r.push(_.CatmullRom(e[l % o], e[(l + 1) % o], e[(l + 2) % o], e[(l + 3) % o], a)), a += s;\n }\n r.push(r[0]);\n } else {\n const o = [];\n o.push(e[0].clone()), Array.prototype.push.apply(o, e), o.push(e[e.length - 1].clone());\n let l = 0;\n for (; l < o.length - 3; l++) {\n a = 0;\n for (let c = 0; c < t; c++)\n r.push(_.CatmullRom(o[l], o[l + 1], o[l + 2], o[l + 3], a)), a += s;\n }\n l--, r.push(_.CatmullRom(o[l], o[l + 1], o[l + 2], o[l + 3], a));\n }\n return new Os(r);\n }\n /**\n * Returns a Curve3 object along an arc through three vector3 points:\n * The three points should not be colinear. When they are the Curve3 is empty.\n * @param first (Vector3) the first point the arc must pass through.\n * @param second (Vector3) the second point the arc must pass through.\n * @param third (Vector3) the third point the arc must pass through.\n * @param steps (number) the larger the number of steps the more detailed the arc.\n * @param closed (boolean) optional with default false, when true forms the chord from the first and third point\n * @param fullCircle Circle (boolean) optional with default false, when true forms the complete circle through the three points\n * @returns the created Curve3\n */\n static ArcThru3Points(e, t, i, r = 32, s = !1, a = !1) {\n const o = [], l = t.subtract(e), c = i.subtract(t), h = e.subtract(i), u = _.Cross(l, c), f = u.length();\n if (f < Math.pow(10, -8))\n return new Os(o);\n const d = l.lengthSquared(), p = c.lengthSquared(), g = h.lengthSquared(), m = u.lengthSquared(), v = l.length(), E = c.length(), C = h.length(), T = 0.5 * v * E * C / f, R = _.Dot(l, h), x = _.Dot(l, c), S = _.Dot(c, h), M = -0.5 * p * R / m, N = -0.5 * g * x / m, F = -0.5 * d * S / m, L = e.scale(M).add(t.scale(N)).add(i.scale(F)), q = e.subtract(L).normalize(), j = _.Cross(u, q).normalize();\n if (a) {\n const k = 2 * Math.PI / r;\n for (let Q = 0; Q <= 2 * Math.PI; Q += k)\n o.push(L.add(q.scale(T * Math.cos(Q)).add(j.scale(T * Math.sin(Q)))));\n o.push(e);\n } else {\n const k = 1 / r;\n let Q = 0, ce = _.Zero();\n do\n ce = L.add(q.scale(T * Math.cos(Q)).add(j.scale(T * Math.sin(Q)))), o.push(ce), Q += k;\n while (!ce.equalsWithEpsilon(i, T * k * 1.1));\n o.push(i), s && o.push(e);\n }\n return new Os(o);\n }\n /**\n * A Curve3 object is a logical object, so not a mesh, to handle curves in the 3D geometric space.\n * A Curve3 is designed from a series of successive Vector3.\n * Tuto : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#curve3-object\n * @param points points which make up the curve\n */\n constructor(e) {\n this._length = 0, this._points = e, this._length = this._computeLength(e);\n }\n /**\n * @returns the Curve3 stored array of successive Vector3\n */\n getPoints() {\n return this._points;\n }\n /**\n * @returns the computed length (float) of the curve.\n */\n length() {\n return this._length;\n }\n /**\n * Returns a new instance of Curve3 object : var curve = curveA.continue(curveB);\n * This new Curve3 is built by translating and sticking the curveB at the end of the curveA.\n * curveA and curveB keep unchanged.\n * @param curve the curve to continue from this curve\n * @returns the newly constructed curve\n */\n continue(e) {\n const t = this._points[this._points.length - 1], i = this._points.slice(), r = e.getPoints();\n for (let a = 1; a < r.length; a++)\n i.push(r[a].subtract(r[0]).add(t));\n return new Os(i);\n }\n _computeLength(e) {\n let t = 0;\n for (let i = 1; i < e.length; i++)\n t += e[i].subtract(e[i - 1]).length();\n return t;\n }\n}\nclass Pb extends me {\n constructor(e, t) {\n super(e.x, e.y), this.index = t;\n }\n}\nclass Gh {\n constructor() {\n this.elements = [];\n }\n add(e) {\n const t = [];\n return e.forEach((i) => {\n const r = new Pb(i, this.elements.length);\n t.push(r), this.elements.push(r);\n }), t;\n }\n computeBounds() {\n const e = new me(this.elements[0].x, this.elements[0].y), t = new me(this.elements[0].x, this.elements[0].y);\n return this.elements.forEach((i) => {\n i.x < e.x ? e.x = i.x : i.x > t.x && (t.x = i.x), i.y < e.y ? e.y = i.y : i.y > t.y && (t.y = i.y);\n }), {\n min: e,\n max: t,\n width: t.x - e.x,\n height: t.y - e.y\n };\n }\n}\nclass Ob {\n _addToepoint(e) {\n for (const t of e)\n this._epoints.push(t.x, t.y);\n }\n /**\n * Creates a PolygonMeshBuilder\n * @param name name of the builder\n * @param contours Path of the polygon\n * @param scene scene to add to when creating the mesh\n * @param earcutInjection can be used to inject your own earcut reference\n */\n constructor(e, t, i, r = earcut) {\n this._points = new Gh(), this._outlinepoints = new Gh(), this._holes = new Array(), this._epoints = new Array(), this._eholes = new Array(), this.bjsEarcut = r, this._name = e, this._scene = i || st.LastCreatedScene;\n let s;\n t instanceof Vc ? s = t.getPoints() : s = t, this._addToepoint(s), this._points.add(s), this._outlinepoints.add(s), typeof this.bjsEarcut > \"u\" && ne.Warn(\"Earcut was not found, the polygon will not be built.\");\n }\n /**\n * Adds a hole within the polygon\n * @param hole Array of points defining the hole\n * @returns this\n */\n addHole(e) {\n this._points.add(e);\n const t = new Gh();\n return t.add(e), this._holes.push(t), this._eholes.push(this._epoints.length / 2), this._addToepoint(e), this;\n }\n /**\n * Creates the polygon\n * @param updatable If the mesh should be updatable\n * @param depth The depth of the mesh created\n * @param smoothingThreshold Dot product threshold for smoothed normals\n * @returns the created mesh\n */\n build(e = !1, t = 0, i = 2) {\n const r = new B(this._name, this._scene), s = this.buildVertexData(t, i);\n return r.setVerticesData(I.PositionKind, s.positions, e), r.setVerticesData(I.NormalKind, s.normals, e), r.setVerticesData(I.UVKind, s.uvs, e), r.setIndices(s.indices), r;\n }\n /**\n * Creates the polygon\n * @param depth The depth of the mesh created\n * @param smoothingThreshold Dot product threshold for smoothed normals\n * @returns the created VertexData\n */\n buildVertexData(e = 0, t = 2) {\n const i = new re(), r = [], s = [], a = [], o = this._points.computeBounds();\n this._points.elements.forEach((h) => {\n r.push(0, 1, 0), s.push(h.x, 0, h.y), a.push((h.x - o.min.x) / o.width, (h.y - o.min.y) / o.height);\n });\n const l = [], c = this.bjsEarcut(this._epoints, this._eholes, 2);\n for (let h = 0; h < c.length; h++)\n l.push(c[h]);\n if (e > 0) {\n const h = s.length / 3;\n this._points.elements.forEach((f) => {\n r.push(0, -1, 0), s.push(f.x, -e, f.y), a.push(1 - (f.x - o.min.x) / o.width, 1 - (f.y - o.min.y) / o.height);\n });\n const u = l.length;\n for (let f = 0; f < u; f += 3) {\n const d = l[f + 0], p = l[f + 1], g = l[f + 2];\n l.push(g + h), l.push(p + h), l.push(d + h);\n }\n this._addSide(s, r, a, l, o, this._outlinepoints, e, !1, t), this._holes.forEach((f) => {\n this._addSide(s, r, a, l, o, f, e, !0, t);\n });\n }\n return i.indices = l, i.positions = s, i.normals = r, i.uvs = a, i;\n }\n /**\n * Adds a side to the polygon\n * @param positions points that make the polygon\n * @param normals normals of the polygon\n * @param uvs uvs of the polygon\n * @param indices indices of the polygon\n * @param bounds bounds of the polygon\n * @param points points of the polygon\n * @param depth depth of the polygon\n * @param flip flip of the polygon\n * @param smoothingThreshold\n */\n _addSide(e, t, i, r, s, a, o, l, c) {\n let h = e.length / 3, u = 0;\n for (let f = 0; f < a.elements.length; f++) {\n const d = a.elements[f], p = a.elements[(f + 1) % a.elements.length];\n e.push(d.x, 0, d.y), e.push(d.x, -o, d.y), e.push(p.x, 0, p.y), e.push(p.x, -o, p.y);\n const g = a.elements[(f + a.elements.length - 1) % a.elements.length], m = a.elements[(f + 2) % a.elements.length];\n let v = new _(-(p.y - d.y), 0, p.x - d.x), E = new _(-(d.y - g.y), 0, d.x - g.x), C = new _(-(m.y - p.y), 0, m.x - p.x);\n l || (v = v.scale(-1), E = E.scale(-1), C = C.scale(-1));\n const T = v.normalizeToNew();\n let R = E.normalizeToNew(), x = C.normalizeToNew();\n const S = _.Dot(R, T);\n S > c ? S < xt - 1 ? R = new _(d.x, 0, d.y).subtract(new _(p.x, 0, p.y)).normalize() : R = E.add(v).normalize() : R = T;\n const M = _.Dot(C, v);\n M > c ? M < xt - 1 ? x = new _(p.x, 0, p.y).subtract(new _(d.x, 0, d.y)).normalize() : x = C.add(v).normalize() : x = T, i.push(u / s.width, 0), i.push(u / s.width, 1), u += v.length(), i.push(u / s.width, 0), i.push(u / s.width, 1), t.push(R.x, R.y, R.z), t.push(R.x, R.y, R.z), t.push(x.x, x.y, x.z), t.push(x.x, x.y, x.z), l ? (r.push(h), r.push(h + 2), r.push(h + 1), r.push(h + 1), r.push(h + 2), r.push(h + 3)) : (r.push(h), r.push(h + 1), r.push(h + 2), r.push(h + 1), r.push(h + 3), r.push(h + 2)), h += 4;\n }\n }\n}\nfunction R0(n, e, t, i, r, s, a) {\n const o = t || new Array(3), l = i, c = [], h = a || !1;\n for (let N = 0; N < 3; N++)\n o[N] === void 0 && (o[N] = new Ke(0, 0, 1, 1)), l && l[N] === void 0 && (l[N] = new et(1, 1, 1, 1));\n const u = n.getVerticesData(I.PositionKind), f = n.getVerticesData(I.NormalKind), d = n.getVerticesData(I.UVKind), p = n.getIndices(), g = u.length / 9;\n let m = 0, v = 0, E = 0, C = 0, T = 0;\n const R = [0];\n if (h)\n for (let N = g; N < u.length / 3; N += 4)\n v = u[3 * (N + 2)] - u[3 * N], E = u[3 * (N + 2) + 2] - u[3 * N + 2], C = Math.sqrt(v * v + E * E), T += C, R.push(T);\n let x = 0, S = 0;\n for (let N = 0; N < f.length; N += 3)\n Math.abs(f[N + 1]) < 1e-3 && (S = 1), Math.abs(f[N + 1] - 1) < 1e-3 && (S = 0), Math.abs(f[N + 1] + 1) < 1e-3 && (S = 2), x = N / 3, S === 1 ? (m = x - g, m % 4 < 1.5 ? h ? d[2 * x] = o[S].x + (o[S].z - o[S].x) * R[Math.floor(m / 4)] / T : d[2 * x] = o[S].x : h ? d[2 * x] = o[S].x + (o[S].z - o[S].x) * R[Math.floor(m / 4) + 1] / T : d[2 * x] = o[S].z, m % 2 === 0 ? d[2 * x + 1] = nt.UseOpenGLOrientationForUV ? 1 - o[S].w : o[S].w : d[2 * x + 1] = nt.UseOpenGLOrientationForUV ? 1 - o[S].y : o[S].y) : (d[2 * x] = (1 - d[2 * x]) * o[S].x + d[2 * x] * o[S].z, d[2 * x + 1] = (1 - d[2 * x + 1]) * o[S].y + d[2 * x + 1] * o[S].w, nt.UseOpenGLOrientationForUV && (d[2 * x + 1] = 1 - d[2 * x + 1])), l && c.push(l[S].r, l[S].g, l[S].b, l[S].a);\n re._ComputeSides(e, u, p, f, d, r, s);\n const M = new re();\n if (M.indices = p, M.positions = u, M.normals = f, M.uvs = d, l) {\n const N = e === re.DOUBLESIDE ? c.concat(c) : c;\n M.colors = N;\n }\n return M;\n}\nfunction S0(n, e, t = null, i = earcut) {\n e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation);\n const r = e.shape, s = e.holes || [], a = e.depth || 0, o = e.smoothingThreshold || 2, l = [];\n let c = [];\n for (let p = 0; p < r.length; p++)\n l[p] = new me(r[p].x, r[p].z);\n l[0].equalsWithEpsilon(l[l.length - 1], 1e-8) && l.pop();\n const u = new Ob(n, l, t || st.LastCreatedScene, i);\n for (let p = 0; p < s.length; p++) {\n c = [];\n for (let g = 0; g < s[p].length; g++)\n c.push(new me(s[p][g].x, s[p][g].z));\n u.addHole(c);\n }\n const f = u.build(!1, a, o);\n return f._originalBuilderSideOrientation = e.sideOrientation, R0(f, e.sideOrientation, e.faceUV, e.faceColors, e.frontUVs, e.backUVs, e.wrap).applyToMesh(f, e.updatable), f;\n}\nfunction Db(n, e, t = null, i = earcut) {\n return S0(n, e, t, i);\n}\nre.CreatePolygon = R0;\nB.CreatePolygon = (n, e, t, i, r, s, a = earcut) => S0(n, {\n shape: e,\n holes: i,\n updatable: r,\n sideOrientation: s\n}, t, a);\nB.ExtrudePolygon = (n, e, t, i, r, s, a, o = earcut) => Db(n, {\n shape: e,\n holes: r,\n depth: t,\n updatable: s,\n sideOrientation: a\n}, i, o);\nfunction Nb(n, e, t = null) {\n const i = e.path, r = e.shape, s = e.scale || 1, a = e.rotation || 0, o = e.cap === 0 ? 0 : e.cap || B.NO_CAP, l = e.updatable, c = B._GetDefaultSideOrientation(e.sideOrientation), h = e.instance || null, u = e.invertUV || !1, f = e.closeShape || !1, d = e.closePath || !1;\n return y0(n, r, i, s, a, null, null, d, f, o, !1, t, !!l, c, h, u, e.frontUVs || null, e.backUVs || null, e.firstNormal || null, !!e.adjustFrame);\n}\nfunction Fb(n, e, t = null) {\n const i = e.path, r = e.shape, s = e.scaleFunction || (() => 1), a = e.rotationFunction || (() => 0), o = e.closePath || e.ribbonCloseArray || !1, l = e.closeShape || e.ribbonClosePath || !1, c = e.cap === 0 ? 0 : e.cap || B.NO_CAP, h = e.updatable, u = e.firstNormal || null, f = e.adjustFrame || !1, d = B._GetDefaultSideOrientation(e.sideOrientation), p = e.instance, g = e.invertUV || !1;\n return y0(n, r, i, null, null, s, a, o, l, c, !0, t, !!h, d, p || null, g, e.frontUVs || null, e.backUVs || null, u, f);\n}\nfunction y0(n, e, t, i, r, s, a, o, l, c, h, u, f, d, p, g, m, v, E, C) {\n const T = (N, F, L, K, q, j, k, Q, ce, de, Z) => {\n const J = L.getTangents(), O = L.getNormals(), G = L.getBinormals(), ee = L.getDistances();\n if (Z) {\n for (let ue = 0; ue < J.length; ue++)\n if (J[ue].x == 0 && J[ue].y == 0 && J[ue].z == 0 && J[ue].copyFrom(J[ue - 1]), O[ue].x == 0 && O[ue].y == 0 && O[ue].z == 0 && O[ue].copyFrom(O[ue - 1]), G[ue].x == 0 && G[ue].y == 0 && G[ue].z == 0 && G[ue].copyFrom(G[ue - 1]), ue > 0) {\n let Ye = J[ue - 1];\n _.Dot(Ye, J[ue]) < 0 && J[ue].scaleInPlace(-1), Ye = O[ue - 1], _.Dot(Ye, O[ue]) < 0 && O[ue].scaleInPlace(-1), Ye = G[ue - 1], _.Dot(Ye, G[ue]) < 0 && G[ue].scaleInPlace(-1);\n }\n }\n let _e = 0;\n const Oe = () => q !== null ? q : 1, fe = de && Q ? Q : () => j !== null ? j : 0, Te = de && k ? k : Oe;\n let Fe = ce === B.NO_CAP || ce === B.CAP_END ? 0 : 2;\n const Se = z.Matrix[0];\n for (let ue = 0; ue < F.length; ue++) {\n const Ye = [], lt = fe(ue, ee[ue]), Ut = Te(ue, ee[ue]);\n w.RotationAxisToRef(J[ue], _e, Se);\n for (let Ct = 0; Ct < N.length; Ct++) {\n const Bi = J[ue].scale(N[Ct].z).add(O[ue].scale(N[Ct].x)).add(G[ue].scale(N[Ct].y)), hi = _.Zero();\n _.TransformCoordinatesToRef(Bi, Se, hi), hi.scaleInPlace(Ut).addInPlace(F[ue]), Ye[Ct] = hi;\n }\n K[Fe] = Ye, _e += lt, Fe++;\n }\n const qe = (ue) => {\n const Ye = Array(), lt = _.Zero();\n let Ut;\n for (Ut = 0; Ut < ue.length; Ut++)\n lt.addInPlace(ue[Ut]);\n for (lt.scaleInPlace(1 / ue.length), Ut = 0; Ut < ue.length; Ut++)\n Ye.push(lt);\n return Ye;\n };\n switch (ce) {\n case B.NO_CAP:\n break;\n case B.CAP_START:\n K[0] = qe(K[2]), K[1] = K[2];\n break;\n case B.CAP_END:\n K[Fe] = K[Fe - 1], K[Fe + 1] = qe(K[Fe - 1]);\n break;\n case B.CAP_ALL:\n K[0] = qe(K[2]), K[1] = K[2], K[Fe] = K[Fe - 1], K[Fe + 1] = qe(K[Fe - 1]);\n break;\n }\n return K;\n };\n let R, x;\n if (p) {\n const N = p._creationDataStorage;\n return R = E ? N.path3D.update(t, E) : N.path3D.update(t), x = T(e, t, N.path3D, N.pathArray, i, r, s, a, N.cap, h, C), p = Oa(\"\", { pathArray: x, closeArray: !1, closePath: !1, offset: 0, updatable: !1, sideOrientation: 0, instance: p }, u || void 0), p;\n }\n R = E ? new To(t, E) : new To(t);\n const S = new Array();\n c = c < 0 || c > 3 ? 0 : c, x = T(e, t, R, S, i, r, s, a, c, h, C);\n const M = Oa(n, {\n pathArray: x,\n closeArray: o,\n closePath: l,\n updatable: f,\n sideOrientation: d,\n invertUV: g,\n frontUVs: m || void 0,\n backUVs: v || void 0\n }, u);\n return M._creationDataStorage.pathArray = x, M._creationDataStorage.path3D = R, M._creationDataStorage.cap = c, M;\n}\nB.ExtrudeShape = (n, e, t, i, r, s, a = null, o, l, c) => {\n const h = {\n shape: e,\n path: t,\n scale: i,\n rotation: r,\n cap: s === 0 ? 0 : s || B.NO_CAP,\n sideOrientation: l,\n instance: c,\n updatable: o\n };\n return Nb(n, h, a);\n};\nB.ExtrudeShapeCustom = (n, e, t, i, r, s, a, o, l, c, h, u) => {\n const f = {\n shape: e,\n path: t,\n scaleFunction: i,\n rotationFunction: r,\n ribbonCloseArray: s,\n ribbonClosePath: a,\n cap: o === 0 ? 0 : o || B.NO_CAP,\n sideOrientation: h,\n instance: u,\n updatable: c\n };\n return Fb(n, f, l);\n};\nfunction Lb(n, e, t = null) {\n const i = e.arc ? e.arc <= 0 || e.arc > 1 ? 1 : e.arc : 1, r = e.closed === void 0 ? !0 : e.closed, s = e.shape, a = e.radius || 1, o = e.tessellation || 64, l = e.clip || 0, c = e.updatable, h = B._GetDefaultSideOrientation(e.sideOrientation), u = e.cap || B.NO_CAP, f = Math.PI * 2, d = [], p = e.invertUV || !1;\n let g = 0, m = 0;\n const v = f / o * i;\n let E, C;\n for (g = 0; g <= o - l; g++) {\n for (C = [], (u == B.CAP_START || u == B.CAP_ALL) && (C.push(new _(0, s[0].y, 0)), C.push(new _(Math.cos(g * v) * s[0].x * a, s[0].y, Math.sin(g * v) * s[0].x * a))), m = 0; m < s.length; m++)\n E = new _(Math.cos(g * v) * s[m].x * a, s[m].y, Math.sin(g * v) * s[m].x * a), C.push(E);\n (u == B.CAP_END || u == B.CAP_ALL) && (C.push(new _(Math.cos(g * v) * s[s.length - 1].x * a, s[s.length - 1].y, Math.sin(g * v) * s[s.length - 1].x * a)), C.push(new _(0, s[s.length - 1].y, 0))), d.push(C);\n }\n return Oa(n, { pathArray: d, closeArray: r, sideOrientation: h, updatable: c, invertUV: p, frontUVs: e.frontUVs, backUVs: e.backUVs }, t);\n}\nB.CreateLathe = (n, e, t, i, r, s, a) => Lb(n, {\n shape: e,\n radius: t,\n tessellation: i,\n sideOrientation: a,\n updatable: s\n}, r);\nfunction Tf(n) {\n const e = [], t = [], i = [], r = [], s = n.width || n.size || 1, a = n.height || n.size || 1, o = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, l = s / 2, c = a / 2;\n t.push(-l, -c, 0), i.push(0, 0, -1), r.push(0, nt.UseOpenGLOrientationForUV ? 1 : 0), t.push(l, -c, 0), i.push(0, 0, -1), r.push(1, nt.UseOpenGLOrientationForUV ? 1 : 0), t.push(l, c, 0), i.push(0, 0, -1), r.push(1, nt.UseOpenGLOrientationForUV ? 0 : 1), t.push(-l, c, 0), i.push(0, 0, -1), r.push(0, nt.UseOpenGLOrientationForUV ? 0 : 1), e.push(0), e.push(1), e.push(2), e.push(0), e.push(2), e.push(3), re._ComputeSides(o, t, e, i, r, n.frontUVs, n.backUVs);\n const h = new re();\n return h.indices = e, h.positions = t, h.normals = i, h.uvs = r, h;\n}\nfunction wb(n, e = {}, t = null) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, Tf(e).applyToMesh(i, e.updatable), e.sourcePlane && (i.translate(e.sourcePlane.normal, -e.sourcePlane.d), i.setDirection(e.sourcePlane.normal.scale(-1))), i;\n}\nre.CreatePlane = Tf;\nB.CreatePlane = (n, e, t, i, r) => wb(n, {\n size: e,\n width: e,\n height: e,\n sideOrientation: r,\n updatable: i\n}, t);\nfunction Ub(n, e, t = null) {\n const i = e.path;\n let r = e.instance, s = 1;\n e.radius !== void 0 ? s = e.radius : r && (s = r._creationDataStorage.radius);\n const a = e.tessellation || 64, o = e.radiusFunction || null;\n let l = e.cap || B.NO_CAP;\n const c = e.invertUV || !1, h = e.updatable, u = B._GetDefaultSideOrientation(e.sideOrientation);\n e.arc = e.arc && (e.arc <= 0 || e.arc > 1) ? 1 : e.arc || 1;\n const f = (v, E, C, T, R, x, S, M) => {\n const N = E.getTangents(), F = E.getNormals(), L = E.getDistances(), q = Math.PI * 2 / R * M, k = x || (() => T);\n let Q, ce, de, Z;\n const J = z.Matrix[0];\n let O = S === B.NO_CAP || S === B.CAP_END ? 0 : 2;\n for (let ee = 0; ee < v.length; ee++) {\n ce = k(ee, L[ee]), Q = Array(), de = F[ee];\n for (let _e = 0; _e < R; _e++)\n w.RotationAxisToRef(N[ee], q * _e, J), Z = Q[_e] ? Q[_e] : _.Zero(), _.TransformCoordinatesToRef(de, J, Z), Z.scaleInPlace(ce).addInPlace(v[ee]), Q[_e] = Z;\n C[O] = Q, O++;\n }\n const G = (ee, _e) => {\n const Oe = Array();\n for (let ze = 0; ze < ee; ze++)\n Oe.push(v[_e]);\n return Oe;\n };\n switch (S) {\n case B.NO_CAP:\n break;\n case B.CAP_START:\n C[0] = G(R, 0), C[1] = C[2].slice(0);\n break;\n case B.CAP_END:\n C[O] = C[O - 1].slice(0), C[O + 1] = G(R, v.length - 1);\n break;\n case B.CAP_ALL:\n C[0] = G(R, 0), C[1] = C[2].slice(0), C[O] = C[O - 1].slice(0), C[O + 1] = G(R, v.length - 1);\n break;\n }\n return C;\n };\n let d, p;\n if (r) {\n const v = r._creationDataStorage, E = e.arc || v.arc;\n return d = v.path3D.update(i), p = f(i, d, v.pathArray, s, v.tessellation, o, v.cap, E), r = Oa(\"\", { pathArray: p, instance: r }), v.path3D = d, v.pathArray = p, v.arc = E, v.radius = s, r;\n }\n d = new To(i);\n const g = new Array();\n l = l < 0 || l > 3 ? 0 : l, p = f(i, d, g, s, a, o, l, e.arc);\n const m = Oa(n, {\n pathArray: p,\n closePath: !0,\n closeArray: !1,\n updatable: h,\n sideOrientation: u,\n invertUV: c,\n frontUVs: e.frontUVs,\n backUVs: e.backUVs\n }, t);\n return m._creationDataStorage.pathArray = p, m._creationDataStorage.path3D = d, m._creationDataStorage.tessellation = a, m._creationDataStorage.cap = l, m._creationDataStorage.arc = e.arc, m._creationDataStorage.radius = s, m;\n}\nB.CreateTube = (n, e, t, i, r, s, a, o, l, c) => Ub(n, {\n path: e,\n radius: t,\n tessellation: i,\n radiusFunction: r,\n arc: 1,\n cap: s,\n updatable: o,\n sideOrientation: l,\n instance: c\n}, a);\nfunction I0(n) {\n const e = [];\n e[0] = {\n vertex: [\n [0, 0, 1.732051],\n [1.632993, 0, -0.5773503],\n [-0.8164966, 1.414214, -0.5773503],\n [-0.8164966, -1.414214, -0.5773503]\n ],\n face: [\n [0, 1, 2],\n [0, 2, 3],\n [0, 3, 1],\n [1, 3, 2]\n ]\n }, e[1] = {\n vertex: [\n [0, 0, 1.414214],\n [1.414214, 0, 0],\n [0, 1.414214, 0],\n [-1.414214, 0, 0],\n [0, -1.414214, 0],\n [0, 0, -1.414214]\n ],\n face: [\n [0, 1, 2],\n [0, 2, 3],\n [0, 3, 4],\n [0, 4, 1],\n [1, 4, 5],\n [1, 5, 2],\n [2, 5, 3],\n [3, 5, 4]\n ]\n }, e[2] = {\n vertex: [\n [0, 0, 1.070466],\n [0.7136442, 0, 0.7978784],\n [-0.3568221, 0.618034, 0.7978784],\n [-0.3568221, -0.618034, 0.7978784],\n [0.7978784, 0.618034, 0.3568221],\n [0.7978784, -0.618034, 0.3568221],\n [-0.9341724, 0.381966, 0.3568221],\n [0.1362939, 1, 0.3568221],\n [0.1362939, -1, 0.3568221],\n [-0.9341724, -0.381966, 0.3568221],\n [0.9341724, 0.381966, -0.3568221],\n [0.9341724, -0.381966, -0.3568221],\n [-0.7978784, 0.618034, -0.3568221],\n [-0.1362939, 1, -0.3568221],\n [-0.1362939, -1, -0.3568221],\n [-0.7978784, -0.618034, -0.3568221],\n [0.3568221, 0.618034, -0.7978784],\n [0.3568221, -0.618034, -0.7978784],\n [-0.7136442, 0, -0.7978784],\n [0, 0, -1.070466]\n ],\n face: [\n [0, 1, 4, 7, 2],\n [0, 2, 6, 9, 3],\n [0, 3, 8, 5, 1],\n [1, 5, 11, 10, 4],\n [2, 7, 13, 12, 6],\n [3, 9, 15, 14, 8],\n [4, 10, 16, 13, 7],\n [5, 8, 14, 17, 11],\n [6, 12, 18, 15, 9],\n [10, 11, 17, 19, 16],\n [12, 13, 16, 19, 18],\n [14, 15, 18, 19, 17]\n ]\n }, e[3] = {\n vertex: [\n [0, 0, 1.175571],\n [1.051462, 0, 0.5257311],\n [0.3249197, 1, 0.5257311],\n [-0.8506508, 0.618034, 0.5257311],\n [-0.8506508, -0.618034, 0.5257311],\n [0.3249197, -1, 0.5257311],\n [0.8506508, 0.618034, -0.5257311],\n [0.8506508, -0.618034, -0.5257311],\n [-0.3249197, 1, -0.5257311],\n [-1.051462, 0, -0.5257311],\n [-0.3249197, -1, -0.5257311],\n [0, 0, -1.175571]\n ],\n face: [\n [0, 1, 2],\n [0, 2, 3],\n [0, 3, 4],\n [0, 4, 5],\n [0, 5, 1],\n [1, 5, 7],\n [1, 7, 6],\n [1, 6, 2],\n [2, 6, 8],\n [2, 8, 3],\n [3, 8, 9],\n [3, 9, 4],\n [4, 9, 10],\n [4, 10, 5],\n [5, 10, 7],\n [6, 7, 11],\n [6, 11, 8],\n [7, 10, 11],\n [8, 11, 9],\n [9, 11, 10]\n ]\n }, e[4] = {\n vertex: [\n [0, 0, 1.070722],\n [0.7148135, 0, 0.7971752],\n [-0.104682, 0.7071068, 0.7971752],\n [-0.6841528, 0.2071068, 0.7971752],\n [-0.104682, -0.7071068, 0.7971752],\n [0.6101315, 0.7071068, 0.5236279],\n [1.04156, 0.2071068, 0.1367736],\n [0.6101315, -0.7071068, 0.5236279],\n [-0.3574067, 1, 0.1367736],\n [-0.7888348, -0.5, 0.5236279],\n [-0.9368776, 0.5, 0.1367736],\n [-0.3574067, -1, 0.1367736],\n [0.3574067, 1, -0.1367736],\n [0.9368776, -0.5, -0.1367736],\n [0.7888348, 0.5, -0.5236279],\n [0.3574067, -1, -0.1367736],\n [-0.6101315, 0.7071068, -0.5236279],\n [-1.04156, -0.2071068, -0.1367736],\n [-0.6101315, -0.7071068, -0.5236279],\n [0.104682, 0.7071068, -0.7971752],\n [0.6841528, -0.2071068, -0.7971752],\n [0.104682, -0.7071068, -0.7971752],\n [-0.7148135, 0, -0.7971752],\n [0, 0, -1.070722]\n ],\n face: [\n [0, 2, 3],\n [1, 6, 5],\n [4, 9, 11],\n [7, 15, 13],\n [8, 16, 10],\n [12, 14, 19],\n [17, 22, 18],\n [20, 21, 23],\n [0, 1, 5, 2],\n [0, 3, 9, 4],\n [0, 4, 7, 1],\n [1, 7, 13, 6],\n [2, 5, 12, 8],\n [2, 8, 10, 3],\n [3, 10, 17, 9],\n [4, 11, 15, 7],\n [5, 6, 14, 12],\n [6, 13, 20, 14],\n [8, 12, 19, 16],\n [9, 17, 18, 11],\n [10, 16, 22, 17],\n [11, 18, 21, 15],\n [13, 15, 21, 20],\n [14, 20, 23, 19],\n [16, 19, 23, 22],\n [18, 22, 23, 21]\n ]\n }, e[5] = {\n vertex: [\n [0, 0, 1.322876],\n [1.309307, 0, 0.1889822],\n [-0.9819805, 0.8660254, 0.1889822],\n [0.1636634, -1.299038, 0.1889822],\n [0.3273268, 0.8660254, -0.9449112],\n [-0.8183171, -0.4330127, -0.9449112]\n ],\n face: [\n [0, 3, 1],\n [2, 4, 5],\n [0, 1, 4, 2],\n [0, 2, 5, 3],\n [1, 3, 5, 4]\n ]\n }, e[6] = {\n vertex: [\n [0, 0, 1.159953],\n [1.013464, 0, 0.5642542],\n [-0.3501431, 0.9510565, 0.5642542],\n [-0.7715208, -0.6571639, 0.5642542],\n [0.6633206, 0.9510565, -0.03144481],\n [0.8682979, -0.6571639, -0.3996071],\n [-1.121664, 0.2938926, -0.03144481],\n [-0.2348831, -1.063314, -0.3996071],\n [0.5181548, 0.2938926, -0.9953061],\n [-0.5850262, -0.112257, -0.9953061]\n ],\n face: [\n [0, 1, 4, 2],\n [0, 2, 6, 3],\n [1, 5, 8, 4],\n [3, 6, 9, 7],\n [5, 7, 9, 8],\n [0, 3, 7, 5, 1],\n [2, 4, 8, 9, 6]\n ]\n }, e[7] = {\n vertex: [\n [0, 0, 1.118034],\n [0.8944272, 0, 0.6708204],\n [-0.2236068, 0.8660254, 0.6708204],\n [-0.7826238, -0.4330127, 0.6708204],\n [0.6708204, 0.8660254, 0.2236068],\n [1.006231, -0.4330127, -0.2236068],\n [-1.006231, 0.4330127, 0.2236068],\n [-0.6708204, -0.8660254, -0.2236068],\n [0.7826238, 0.4330127, -0.6708204],\n [0.2236068, -0.8660254, -0.6708204],\n [-0.8944272, 0, -0.6708204],\n [0, 0, -1.118034]\n ],\n face: [\n [0, 1, 4, 2],\n [0, 2, 6, 3],\n [1, 5, 8, 4],\n [3, 6, 10, 7],\n [5, 9, 11, 8],\n [7, 10, 11, 9],\n [0, 3, 7, 9, 5, 1],\n [2, 4, 8, 11, 10, 6]\n ]\n }, e[8] = {\n vertex: [\n [-0.729665, 0.670121, 0.319155],\n [-0.655235, -0.29213, -0.754096],\n [-0.093922, -0.607123, 0.537818],\n [0.702196, 0.595691, 0.485187],\n [0.776626, -0.36656, -0.588064]\n ],\n face: [\n [1, 4, 2],\n [0, 1, 2],\n [3, 0, 2],\n [4, 3, 2],\n [4, 1, 0, 3]\n ]\n }, e[9] = {\n vertex: [\n [-0.868849, -0.100041, 0.61257],\n [-0.329458, 0.976099, 0.28078],\n [-0.26629, -0.013796, -0.477654],\n [-0.13392, -1.034115, 0.229829],\n [0.738834, 0.707117, -0.307018],\n [0.859683, -0.535264, -0.338508]\n ],\n face: [\n [3, 0, 2],\n [5, 3, 2],\n [4, 5, 2],\n [1, 4, 2],\n [0, 1, 2],\n [0, 3, 5, 4, 1]\n ]\n }, e[10] = {\n vertex: [\n [-0.610389, 0.243975, 0.531213],\n [-0.187812, -0.48795, -0.664016],\n [-0.187812, 0.9759, -0.664016],\n [0.187812, -0.9759, 0.664016],\n [0.798201, 0.243975, 0.132803]\n ],\n face: [\n [1, 3, 0],\n [3, 4, 0],\n [3, 1, 4],\n [0, 2, 1],\n [0, 4, 2],\n [2, 4, 1]\n ]\n }, e[11] = {\n vertex: [\n [-1.028778, 0.392027, -0.048786],\n [-0.640503, -0.646161, 0.621837],\n [-0.125162, -0.395663, -0.540059],\n [4683e-6, 0.888447, -0.651988],\n [0.125161, 0.395663, 0.540059],\n [0.632925, -0.791376, 0.433102],\n [1.031672, 0.157063, -0.354165]\n ],\n face: [\n [3, 2, 0],\n [2, 1, 0],\n [2, 5, 1],\n [0, 4, 3],\n [0, 1, 4],\n [4, 1, 5],\n [2, 3, 6],\n [3, 4, 6],\n [5, 2, 6],\n [4, 5, 6]\n ]\n }, e[12] = {\n vertex: [\n [-0.669867, 0.334933, -0.529576],\n [-0.669867, 0.334933, 0.529577],\n [-0.4043, 1.212901, 0],\n [-0.334933, -0.669867, -0.529576],\n [-0.334933, -0.669867, 0.529577],\n [0.334933, 0.669867, -0.529576],\n [0.334933, 0.669867, 0.529577],\n [0.4043, -1.212901, 0],\n [0.669867, -0.334933, -0.529576],\n [0.669867, -0.334933, 0.529577]\n ],\n face: [\n [8, 9, 7],\n [6, 5, 2],\n [3, 8, 7],\n [5, 0, 2],\n [4, 3, 7],\n [0, 1, 2],\n [9, 4, 7],\n [1, 6, 2],\n [9, 8, 5, 6],\n [8, 3, 0, 5],\n [3, 4, 1, 0],\n [4, 9, 6, 1]\n ]\n }, e[13] = {\n vertex: [\n [-0.931836, 0.219976, -0.264632],\n [-0.636706, 0.318353, 0.692816],\n [-0.613483, -0.735083, -0.264632],\n [-0.326545, 0.979634, 0],\n [-0.318353, -0.636706, 0.692816],\n [-0.159176, 0.477529, -0.856368],\n [0.159176, -0.477529, -0.856368],\n [0.318353, 0.636706, 0.692816],\n [0.326545, -0.979634, 0],\n [0.613482, 0.735082, -0.264632],\n [0.636706, -0.318353, 0.692816],\n [0.931835, -0.219977, -0.264632]\n ],\n face: [\n [11, 10, 8],\n [7, 9, 3],\n [6, 11, 8],\n [9, 5, 3],\n [2, 6, 8],\n [5, 0, 3],\n [4, 2, 8],\n [0, 1, 3],\n [10, 4, 8],\n [1, 7, 3],\n [10, 11, 9, 7],\n [11, 6, 5, 9],\n [6, 2, 0, 5],\n [2, 4, 1, 0],\n [4, 10, 7, 1]\n ]\n }, e[14] = {\n vertex: [\n [-0.93465, 0.300459, -0.271185],\n [-0.838689, -0.260219, -0.516017],\n [-0.711319, 0.717591, 0.128359],\n [-0.710334, -0.156922, 0.080946],\n [-0.599799, 0.556003, -0.725148],\n [-0.503838, -4675e-6, -0.969981],\n [-0.487004, 0.26021, 0.48049],\n [-0.460089, -0.750282, -0.512622],\n [-0.376468, 0.973135, -0.325605],\n [-0.331735, -0.646985, 0.084342],\n [-0.254001, 0.831847, 0.530001],\n [-0.125239, -0.494738, -0.966586],\n [0.029622, 0.027949, 0.730817],\n [0.056536, -0.982543, -0.262295],\n [0.08085, 1.087391, 0.076037],\n [0.125583, -0.532729, 0.485984],\n [0.262625, 0.599586, 0.780328],\n [0.391387, -0.726999, -0.716259],\n [0.513854, -0.868287, 0.139347],\n [0.597475, 0.85513, 0.326364],\n [0.641224, 0.109523, 0.783723],\n [0.737185, -0.451155, 0.538891],\n [0.848705, -0.612742, -0.314616],\n [0.976075, 0.365067, 0.32976],\n [1.072036, -0.19561, 0.084927]\n ],\n face: [\n [15, 18, 21],\n [12, 20, 16],\n [6, 10, 2],\n [3, 0, 1],\n [9, 7, 13],\n [2, 8, 4, 0],\n [0, 4, 5, 1],\n [1, 5, 11, 7],\n [7, 11, 17, 13],\n [13, 17, 22, 18],\n [18, 22, 24, 21],\n [21, 24, 23, 20],\n [20, 23, 19, 16],\n [16, 19, 14, 10],\n [10, 14, 8, 2],\n [15, 9, 13, 18],\n [12, 15, 21, 20],\n [6, 12, 16, 10],\n [3, 6, 2, 0],\n [9, 3, 1, 7],\n [9, 15, 12, 6, 3],\n [22, 17, 11, 5, 4, 8, 14, 19, 23, 24]\n ]\n };\n const t = n.type && (n.type < 0 || n.type >= e.length) ? 0 : n.type || 0, i = n.size, r = n.sizeX || i || 1, s = n.sizeY || i || 1, a = n.sizeZ || i || 1, o = n.custom || e[t], l = o.face.length, c = n.faceUV || new Array(l), h = n.faceColors, u = n.flat === void 0 ? !0 : n.flat, f = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, d = [], p = [], g = [], m = [], v = [];\n let E = 0, C = 0;\n const T = [];\n let R = 0, x = 0, S, M, N, F, L, K;\n if (u)\n for (x = 0; x < l; x++)\n h && h[x] === void 0 && (h[x] = new et(1, 1, 1, 1)), c && c[x] === void 0 && (c[x] = new Ke(0, 0, 1, 1));\n if (u)\n for (x = 0; x < l; x++) {\n const j = o.face[x].length;\n for (N = 2 * Math.PI / j, F = 0.5 * Math.tan(N / 2), L = 0.5, R = 0; R < j; R++)\n d.push(o.vertex[o.face[x][R]][0] * r, o.vertex[o.face[x][R]][1] * s, o.vertex[o.face[x][R]][2] * a), T.push(E), E++, S = c[x].x + (c[x].z - c[x].x) * (0.5 + F), M = c[x].y + (c[x].w - c[x].y) * (L - 0.5), m.push(S, nt.UseOpenGLOrientationForUV ? 1 - M : M), K = F * Math.cos(N) - L * Math.sin(N), L = F * Math.sin(N) + L * Math.cos(N), F = K, h && v.push(h[x].r, h[x].g, h[x].b, h[x].a);\n for (R = 0; R < j - 2; R++)\n p.push(T[0 + C], T[R + 2 + C], T[R + 1 + C]);\n C += j;\n }\n else {\n for (R = 0; R < o.vertex.length; R++)\n d.push(o.vertex[R][0] * r, o.vertex[R][1] * s, o.vertex[R][2] * a), m.push(0, nt.UseOpenGLOrientationForUV ? 1 : 0);\n for (x = 0; x < l; x++)\n for (R = 0; R < o.face[x].length - 2; R++)\n p.push(o.face[x][0], o.face[x][R + 2], o.face[x][R + 1]);\n }\n re.ComputeNormals(d, p, g), re._ComputeSides(f, d, p, g, m, n.frontUVs, n.backUVs);\n const q = new re();\n return q.positions = d, q.indices = p, q.normals = g, q.uvs = m, h && u && (q.colors = v), q;\n}\nfunction Vb(n, e = {}, t = null) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, I0(e).applyToMesh(i, e.updatable), i;\n}\nre.CreatePolyhedron = I0;\nB.CreatePolyhedron = (n, e, t) => Vb(n, e, t);\nfunction xf(n) {\n const e = n.sideOrientation || re.DEFAULTSIDE, t = n.radius || 1, i = n.flat === void 0 ? !0 : n.flat, r = (n.subdivisions || 4) | 0, s = n.radiusX || t, a = n.radiusY || t, o = n.radiusZ || t, l = (1 + Math.sqrt(5)) / 2, c = [\n -1,\n l,\n -0,\n 1,\n l,\n 0,\n -1,\n -l,\n 0,\n 1,\n -l,\n 0,\n 0,\n -1,\n -l,\n 0,\n 1,\n -l,\n 0,\n -1,\n l,\n 0,\n 1,\n l,\n l,\n 0,\n 1,\n l,\n 0,\n -1,\n -l,\n 0,\n 1,\n -l,\n 0,\n -1\n // v8-11\n ], h = [\n 0,\n 11,\n 5,\n 0,\n 5,\n 1,\n 0,\n 1,\n 7,\n 0,\n 7,\n 10,\n 12,\n 22,\n 23,\n 1,\n 5,\n 20,\n 5,\n 11,\n 4,\n 23,\n 22,\n 13,\n 22,\n 18,\n 6,\n 7,\n 1,\n 8,\n 14,\n 21,\n 4,\n 14,\n 4,\n 2,\n 16,\n 13,\n 6,\n 15,\n 6,\n 19,\n 3,\n 8,\n 9,\n 4,\n 21,\n 5,\n 13,\n 17,\n 23,\n 6,\n 13,\n 22,\n 19,\n 6,\n 18,\n 9,\n 8,\n 1\n ], u = [\n 0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9,\n 10,\n 11,\n // vertex alias\n 0,\n 2,\n 3,\n 3,\n 3,\n 4,\n 7,\n 8,\n 9,\n 9,\n 10,\n 11\n // 23: B + 12\n ], f = [\n 5,\n 1,\n 3,\n 1,\n 6,\n 4,\n 0,\n 0,\n 5,\n 3,\n 4,\n 2,\n 2,\n 2,\n 4,\n 0,\n 2,\n 0,\n 1,\n 1,\n 6,\n 0,\n 6,\n 2,\n // vertex alias (for same vertex on different faces)\n 0,\n 4,\n 3,\n 3,\n 4,\n 4,\n 3,\n 1,\n 4,\n 2,\n 4,\n 4,\n 0,\n 2,\n 1,\n 1,\n 2,\n 2,\n 3,\n 3,\n 1,\n 3,\n 2,\n 4\n // 23: B + 12\n ], d = 138 / 1024, p = 239 / 1024, g = 60 / 1024, m = 26 / 1024, v = -40 / 1024, E = 20 / 1024, C = [\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 1,\n 0,\n 0,\n 0,\n 1,\n 1,\n 0,\n 0,\n 1,\n 1,\n 1,\n 0\n // 15 - 19\n ], T = [], R = [], x = [], S = [];\n let M = 0;\n const N = new Array(3), F = new Array(3);\n let L;\n for (L = 0; L < 3; L++)\n N[L] = _.Zero(), F[L] = me.Zero();\n for (let q = 0; q < 20; q++) {\n for (L = 0; L < 3; L++) {\n const k = h[3 * q + L];\n N[L].copyFromFloats(c[3 * u[k]], c[3 * u[k] + 1], c[3 * u[k] + 2]), N[L].normalize(), F[L].copyFromFloats(f[2 * k] * d + g + C[q] * v, f[2 * k + 1] * p + m + C[q] * E);\n }\n const j = (k, Q, ce, de) => {\n const Z = _.Lerp(N[0], N[2], Q / r), J = _.Lerp(N[1], N[2], Q / r), O = r === Q ? N[2] : _.Lerp(Z, J, k / (r - Q));\n O.normalize();\n let G;\n if (i) {\n const ze = _.Lerp(N[0], N[2], de / r), fe = _.Lerp(N[1], N[2], de / r);\n G = _.Lerp(ze, fe, ce / (r - de));\n } else\n G = new _(O.x, O.y, O.z);\n G.x /= s, G.y /= a, G.z /= o, G.normalize();\n const ee = me.Lerp(F[0], F[2], Q / r), _e = me.Lerp(F[1], F[2], Q / r), Oe = r === Q ? F[2] : me.Lerp(ee, _e, k / (r - Q));\n R.push(O.x * s, O.y * a, O.z * o), x.push(G.x, G.y, G.z), S.push(Oe.x, nt.UseOpenGLOrientationForUV ? 1 - Oe.y : Oe.y), T.push(M), M++;\n };\n for (let k = 0; k < r; k++)\n for (let Q = 0; Q + k < r; Q++)\n j(Q, k, Q + 1 / 3, k + 1 / 3), j(Q + 1, k, Q + 1 / 3, k + 1 / 3), j(Q, k + 1, Q + 1 / 3, k + 1 / 3), Q + k + 1 < r && (j(Q + 1, k, Q + 2 / 3, k + 2 / 3), j(Q + 1, k + 1, Q + 2 / 3, k + 2 / 3), j(Q, k + 1, Q + 2 / 3, k + 2 / 3));\n }\n re._ComputeSides(e, R, T, x, S, n.frontUVs, n.backUVs);\n const K = new re();\n return K.indices = T, K.positions = R, K.normals = x, K.uvs = S, K;\n}\nfunction Bb(n, e = {}, t = null) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, xf(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateIcoSphere = xf;\nB.CreateIcoSphere = (n, e, t) => Bb(n, e, t);\nconst kb = new _(1, 0, 0), zb = new _(-1, 0, 0), Wb = new _(0, 1, 0), Gb = new _(0, -1, 0), Xb = new _(0, 0, 1), Hb = new _(0, 0, -1);\nclass nc {\n constructor(e = _.Zero(), t = _.Up(), i = me.Zero(), r = 0, s = 0, a = null, o = null, l = null, c = null) {\n this.position = e, this.normal = t, this.uv = i, this.vertexIdx = r, this.vertexIdxForBones = s, this.localPositionOverride = a, this.localNormalOverride = o, this.matrixIndicesOverride = l, this.matrixWeightsOverride = c;\n }\n clone() {\n var e, t, i, r;\n return new nc(this.position.clone(), this.normal.clone(), this.uv.clone(), this.vertexIdx, this.vertexIdxForBones, (e = this.localPositionOverride) == null ? void 0 : e.slice(), (t = this.localNormalOverride) == null ? void 0 : t.slice(), (i = this.matrixIndicesOverride) == null ? void 0 : i.slice(), (r = this.matrixWeightsOverride) == null ? void 0 : r.slice());\n }\n}\nfunction Kb(n, e, t) {\n var ce, de, Z, J;\n const i = !!e.skeleton, r = t.localMode || i, s = e.overrideMaterialSideOrientation !== null && e.overrideMaterialSideOrientation !== void 0, a = e.getIndices(), o = i ? e.getPositionData(!0, !0) : e.getVerticesData(I.PositionKind), l = i ? e.getNormalsData(!0, !0) : e.getVerticesData(I.NormalKind), c = r ? i ? e.getVerticesData(I.PositionKind) : o : null, h = r ? i ? e.getVerticesData(I.NormalKind) : l : null, u = e.getVerticesData(I.UVKind), f = i ? e.getVerticesData(I.MatricesIndicesKind) : null, d = i ? e.getVerticesData(I.MatricesWeightsKind) : null, p = i ? e.getVerticesData(I.MatricesIndicesExtraKind) : null, g = i ? e.getVerticesData(I.MatricesWeightsExtraKind) : null, m = t.position || _.Zero();\n let v = t.normal || _.Up();\n const E = t.size || _.One(), C = t.angle || 0;\n if (!v) {\n const O = new _(0, 0, 1), G = e.getScene().activeCamera, ee = _.TransformCoordinates(O, G.getWorldMatrix());\n v = G.globalPosition.subtract(ee);\n }\n const T = -Math.atan2(v.z, v.x) - Math.PI / 2, R = Math.sqrt(v.x * v.x + v.z * v.z), x = Math.atan2(v.y, R), S = new re();\n S.indices = [], S.positions = [], S.normals = [], S.uvs = [], S.matricesIndices = i ? [] : null, S.matricesWeights = i ? [] : null, S.matricesIndicesExtra = p ? [] : null, S.matricesWeightsExtra = g ? [] : null;\n let M = 0;\n const N = (O, G) => {\n const ee = new nc();\n if (!a || !o || !l)\n return ee;\n const _e = a[O];\n if (ee.vertexIdx = _e * 3, ee.vertexIdxForBones = _e * 4, ee.position = new _(o[_e * 3], o[_e * 3 + 1], o[_e * 3 + 2]), _.TransformCoordinatesToRef(ee.position, G, ee.position), ee.normal = new _(l[_e * 3], l[_e * 3 + 1], l[_e * 3 + 2]), _.TransformNormalToRef(ee.normal, G, ee.normal), t.captureUVS && u) {\n const Oe = u[_e * 2 + 1];\n ee.uv = new me(u[_e * 2], nt.UseOpenGLOrientationForUV ? 1 - Oe : Oe);\n }\n return ee;\n }, F = [0, 0, 0, 0], L = (O, G) => {\n if (O.length === 0)\n return O;\n const ee = 0.5 * Math.abs(_.Dot(E, G)), _e = (fe, Te, Fe, Se) => {\n for (let qe = 0; qe < Se; ++qe)\n if (fe[Fe + qe] === Te)\n return Fe + qe;\n return -1;\n }, Oe = (fe, Te) => {\n const Fe = _.GetClipFactor(fe.position, Te.position, G, ee);\n let Se = F, qe = F;\n if (f && d) {\n const yr = fe.matrixIndicesOverride ? 0 : fe.vertexIdxForBones, Vr = fe.matrixIndicesOverride ?? f, pn = fe.matrixWeightsOverride ?? d, Mi = Te.matrixIndicesOverride ? 0 : Te.vertexIdxForBones, sl = Te.matrixIndicesOverride ?? f, Ya = Te.matrixWeightsOverride ?? d;\n Se = [0, 0, 0, 0], qe = [0, 0, 0, 0];\n let ts = 0;\n for (let _r = 0; _r < 4; ++_r)\n if (pn[yr + _r] > 0) {\n const Gs = _e(sl, Vr[yr + _r], Mi, 4);\n Se[ts] = Vr[yr + _r], qe[ts] = je.Lerp(pn[yr + _r], Gs >= 0 ? Ya[Gs] : 0, Fe), ts++;\n }\n for (let _r = 0; _r < 4 && ts < 4; ++_r) {\n const Gs = sl[Mi + _r];\n _e(Vr, Gs, yr, 4) === -1 && (Se[ts] = Gs, qe[ts] = je.Lerp(0, Ya[Mi + _r], Fe), ts++);\n }\n const kn = qe[0] + qe[1] + qe[2] + qe[3];\n qe[0] /= kn, qe[1] /= kn, qe[2] /= kn, qe[3] /= kn;\n }\n const ue = fe.localPositionOverride ? fe.localPositionOverride[0] : (c == null ? void 0 : c[fe.vertexIdx]) ?? 0, Ye = fe.localPositionOverride ? fe.localPositionOverride[1] : (c == null ? void 0 : c[fe.vertexIdx + 1]) ?? 0, lt = fe.localPositionOverride ? fe.localPositionOverride[2] : (c == null ? void 0 : c[fe.vertexIdx + 2]) ?? 0, Ut = Te.localPositionOverride ? Te.localPositionOverride[0] : (c == null ? void 0 : c[Te.vertexIdx]) ?? 0, Ct = Te.localPositionOverride ? Te.localPositionOverride[1] : (c == null ? void 0 : c[Te.vertexIdx + 1]) ?? 0, Bi = Te.localPositionOverride ? Te.localPositionOverride[2] : (c == null ? void 0 : c[Te.vertexIdx + 2]) ?? 0, hi = fe.localNormalOverride ? fe.localNormalOverride[0] : (h == null ? void 0 : h[fe.vertexIdx]) ?? 0, Es = fe.localNormalOverride ? fe.localNormalOverride[1] : (h == null ? void 0 : h[fe.vertexIdx + 1]) ?? 0, Ur = fe.localNormalOverride ? fe.localNormalOverride[2] : (h == null ? void 0 : h[fe.vertexIdx + 2]) ?? 0, vs = Te.localNormalOverride ? Te.localNormalOverride[0] : (h == null ? void 0 : h[Te.vertexIdx]) ?? 0, ki = Te.localNormalOverride ? Te.localNormalOverride[1] : (h == null ? void 0 : h[Te.vertexIdx + 1]) ?? 0, lr = Te.localNormalOverride ? Te.localNormalOverride[2] : (h == null ? void 0 : h[Te.vertexIdx + 2]) ?? 0, Rr = hi + (vs - hi) * Fe, Sr = Es + (ki - Es) * Fe, Ts = Ur + (lr - Ur) * Fe, xs = Math.sqrt(Rr * Rr + Sr * Sr + Ts * Ts);\n return new nc(_.Lerp(fe.position, Te.position, Fe), _.Lerp(fe.normal, Te.normal, Fe).normalize(), me.Lerp(fe.uv, Te.uv, Fe), -1, -1, c ? [\n ue + (Ut - ue) * Fe,\n Ye + (Ct - Ye) * Fe,\n lt + (Bi - lt) * Fe\n ] : null, h ? [Rr / xs, Sr / xs, Ts / xs] : null, Se, qe);\n };\n let ze = null;\n O.length > 3 && (ze = []);\n for (let fe = 0; fe < O.length; fe += 3) {\n let Te = 0, Fe = null, Se = null, qe = null, ue = null;\n const Ye = _.Dot(O[fe].position, G) - ee, lt = _.Dot(O[fe + 1].position, G) - ee, Ut = _.Dot(O[fe + 2].position, G) - ee, Ct = Ye > 0, Bi = lt > 0, hi = Ut > 0;\n switch (Te = (Ct ? 1 : 0) + (Bi ? 1 : 0) + (hi ? 1 : 0), Te) {\n case 0:\n O.length > 3 ? (ze.push(O[fe]), ze.push(O[fe + 1]), ze.push(O[fe + 2])) : ze = O;\n break;\n case 1:\n if (ze = ze ?? new Array(), Ct && (Fe = O[fe + 1], Se = O[fe + 2], qe = Oe(O[fe], Fe), ue = Oe(O[fe], Se)), Bi) {\n Fe = O[fe], Se = O[fe + 2], qe = Oe(O[fe + 1], Fe), ue = Oe(O[fe + 1], Se), ze.push(qe), ze.push(Se.clone()), ze.push(Fe.clone()), ze.push(Se.clone()), ze.push(qe.clone()), ze.push(ue);\n break;\n }\n hi && (Fe = O[fe], Se = O[fe + 1], qe = Oe(O[fe + 2], Fe), ue = Oe(O[fe + 2], Se)), Fe && Se && qe && ue && (ze.push(Fe.clone()), ze.push(Se.clone()), ze.push(qe), ze.push(ue), ze.push(qe.clone()), ze.push(Se.clone()));\n break;\n case 2:\n ze = ze ?? new Array(), Ct || (Fe = O[fe].clone(), Se = Oe(Fe, O[fe + 1]), qe = Oe(Fe, O[fe + 2]), ze.push(Fe), ze.push(Se), ze.push(qe)), Bi || (Fe = O[fe + 1].clone(), Se = Oe(Fe, O[fe + 2]), qe = Oe(Fe, O[fe]), ze.push(Fe), ze.push(Se), ze.push(qe)), hi || (Fe = O[fe + 2].clone(), Se = Oe(Fe, O[fe]), qe = Oe(Fe, O[fe + 1]), ze.push(Fe), ze.push(Se), ze.push(qe));\n break;\n }\n }\n return ze;\n }, K = e instanceof B ? e : null, q = K == null ? void 0 : K._thinInstanceDataStorage.matrixData, j = (K == null ? void 0 : K.thinInstanceCount) || 1, k = z.Matrix[0];\n k.copyFrom(w.IdentityReadOnly);\n for (let O = 0; O < j; ++O) {\n if (K != null && K.hasThinInstances && q) {\n const fe = O * 16;\n k.setRowFromFloats(0, q[fe + 0], q[fe + 1], q[fe + 2], q[fe + 3]), k.setRowFromFloats(1, q[fe + 4], q[fe + 5], q[fe + 6], q[fe + 7]), k.setRowFromFloats(2, q[fe + 8], q[fe + 9], q[fe + 10], q[fe + 11]), k.setRowFromFloats(3, q[fe + 12], q[fe + 13], q[fe + 14], q[fe + 15]);\n }\n const G = w.RotationYawPitchRoll(T, x, C).multiply(w.Translation(m.x, m.y, m.z)), ee = w.Invert(G), _e = e.getWorldMatrix(), Oe = k.multiply(_e).multiply(ee), ze = new Array(3);\n for (let fe = 0; fe < a.length; fe += 3) {\n let Te = ze;\n if (Te[0] = N(fe, Oe), s && r ? (Te[1] = N(fe + 2, Oe), Te[2] = N(fe + 1, Oe)) : (Te[1] = N(fe + 1, Oe), Te[2] = N(fe + 2, Oe)), !(t.cullBackFaces && -Te[0].normal.z <= 0 && -Te[1].normal.z <= 0 && -Te[2].normal.z <= 0) && (Te = L(Te, kb), !!Te && (Te = L(Te, zb), !!Te && (Te = L(Te, Wb), !!Te && (Te = L(Te, Gb), !!Te && (Te = L(Te, Xb), !!Te && (Te = L(Te, Hb), !!Te)))))))\n for (let Fe = 0; Fe < Te.length; Fe++) {\n const Se = Te[Fe];\n if (S.indices.push(M), r ? (Se.localPositionOverride ? (S.positions[M * 3] = Se.localPositionOverride[0], S.positions[M * 3 + 1] = Se.localPositionOverride[1], S.positions[M * 3 + 2] = Se.localPositionOverride[2]) : c && (S.positions[M * 3] = c[Se.vertexIdx], S.positions[M * 3 + 1] = c[Se.vertexIdx + 1], S.positions[M * 3 + 2] = c[Se.vertexIdx + 2]), Se.localNormalOverride ? (S.normals[M * 3] = Se.localNormalOverride[0], S.normals[M * 3 + 1] = Se.localNormalOverride[1], S.normals[M * 3 + 2] = Se.localNormalOverride[2]) : h && (S.normals[M * 3] = h[Se.vertexIdx], S.normals[M * 3 + 1] = h[Se.vertexIdx + 1], S.normals[M * 3 + 2] = h[Se.vertexIdx + 2])) : (Se.position.toArray(S.positions, M * 3), Se.normal.toArray(S.normals, M * 3)), S.matricesIndices && S.matricesWeights && (Se.matrixIndicesOverride ? (S.matricesIndices[M * 4] = Se.matrixIndicesOverride[0], S.matricesIndices[M * 4 + 1] = Se.matrixIndicesOverride[1], S.matricesIndices[M * 4 + 2] = Se.matrixIndicesOverride[2], S.matricesIndices[M * 4 + 3] = Se.matrixIndicesOverride[3]) : (f && (S.matricesIndices[M * 4] = f[Se.vertexIdxForBones], S.matricesIndices[M * 4 + 1] = f[Se.vertexIdxForBones + 1], S.matricesIndices[M * 4 + 2] = f[Se.vertexIdxForBones + 2], S.matricesIndices[M * 4 + 3] = f[Se.vertexIdxForBones + 3]), p && S.matricesIndicesExtra && (S.matricesIndicesExtra[M * 4] = p[Se.vertexIdxForBones], S.matricesIndicesExtra[M * 4 + 1] = p[Se.vertexIdxForBones + 1], S.matricesIndicesExtra[M * 4 + 2] = p[Se.vertexIdxForBones + 2], S.matricesIndicesExtra[M * 4 + 3] = p[Se.vertexIdxForBones + 3])), Se.matrixWeightsOverride ? (S.matricesWeights[M * 4] = Se.matrixWeightsOverride[0], S.matricesWeights[M * 4 + 1] = Se.matrixWeightsOverride[1], S.matricesWeights[M * 4 + 2] = Se.matrixWeightsOverride[2], S.matricesWeights[M * 4 + 3] = Se.matrixWeightsOverride[3]) : (d && (S.matricesWeights[M * 4] = d[Se.vertexIdxForBones], S.matricesWeights[M * 4 + 1] = d[Se.vertexIdxForBones + 1], S.matricesWeights[M * 4 + 2] = d[Se.vertexIdxForBones + 2], S.matricesWeights[M * 4 + 3] = d[Se.vertexIdxForBones + 3]), g && S.matricesWeightsExtra && (S.matricesWeightsExtra[M * 4] = g[Se.vertexIdxForBones], S.matricesWeightsExtra[M * 4 + 1] = g[Se.vertexIdxForBones + 1], S.matricesWeightsExtra[M * 4 + 2] = g[Se.vertexIdxForBones + 2], S.matricesWeightsExtra[M * 4 + 3] = g[Se.vertexIdxForBones + 3]))), t.captureUVS)\n Se.uv.toArray(S.uvs, M * 2);\n else {\n S.uvs.push(0.5 + Se.position.x / E.x);\n const qe = 0.5 + Se.position.y / E.y;\n S.uvs.push(nt.UseOpenGLOrientationForUV ? 1 - qe : qe);\n }\n M++;\n }\n }\n }\n S.indices.length === 0 && (S.indices = null), S.positions.length === 0 && (S.positions = null), S.normals.length === 0 && (S.normals = null), S.uvs.length === 0 && (S.uvs = null), ((ce = S.matricesIndices) == null ? void 0 : ce.length) === 0 && (S.matricesIndices = null), ((de = S.matricesWeights) == null ? void 0 : de.length) === 0 && (S.matricesWeights = null), ((Z = S.matricesIndicesExtra) == null ? void 0 : Z.length) === 0 && (S.matricesIndicesExtra = null), ((J = S.matricesWeightsExtra) == null ? void 0 : J.length) === 0 && (S.matricesWeightsExtra = null);\n const Q = new B(n, e.getScene());\n return S.applyToMesh(Q), r ? (Q.skeleton = e.skeleton, Q.parent = e) : (Q.position = m.clone(), Q.rotation = new _(x, T, C)), Q.computeWorldMatrix(!0), Q.refreshBoundingInfo(!0, !0), Q;\n}\nB.CreateDecal = (n, e, t, i, r, s) => Kb(n, e, {\n position: t,\n normal: i,\n size: r,\n angle: s\n});\nfunction Cf(n = {\n subdivisions: 2,\n tessellation: 16,\n height: 1,\n radius: 0.25,\n capSubdivisions: 6\n}) {\n const e = Math.max(n.subdivisions ? n.subdivisions : 2, 1) | 0, t = Math.max(n.tessellation ? n.tessellation : 16, 3) | 0, i = Math.max(n.height ? n.height : 1, 0), r = Math.max(n.radius ? n.radius : 0.25, 0), s = Math.max(n.capSubdivisions ? n.capSubdivisions : 6, 1) | 0, a = t, o = e, l = Math.max(n.radiusTop ? n.radiusTop : r, 0), c = Math.max(n.radiusBottom ? n.radiusBottom : r, 0), h = i - (l + c), u = 0, f = 2 * Math.PI, d = Math.max(n.topCapSubdivisions ? n.topCapSubdivisions : s, 1), p = Math.max(n.bottomCapSubdivisions ? n.bottomCapSubdivisions : s, 1), g = Math.acos((c - l) / i);\n let m = [];\n const v = [], E = [], C = [];\n let T = 0;\n const R = [], x = h * 0.5, S = Math.PI * 0.5;\n let M, N;\n const F = _.Zero(), L = _.Zero(), K = Math.cos(g), q = Math.sin(g), j = new me(l * q, x + l * K).subtract(new me(c * q, -x + c * K)).length(), k = l * g + j + c * (S - g);\n let Q = 0;\n for (N = 0; N <= d; N++) {\n const J = [], O = S - g * (N / d);\n Q += l * g / d;\n const G = Math.cos(O), ee = Math.sin(O), _e = G * l;\n for (M = 0; M <= a; M++) {\n const Oe = M / a, ze = Oe * f + u, fe = Math.sin(ze), Te = Math.cos(ze);\n L.x = _e * fe, L.y = x + ee * l, L.z = _e * Te, v.push(L.x, L.y, L.z), F.set(G * fe, ee, G * Te), E.push(F.x, F.y, F.z), C.push(Oe, nt.UseOpenGLOrientationForUV ? Q / k : 1 - Q / k), J.push(T), T++;\n }\n R.push(J);\n }\n const ce = i - l - c + K * l - K * c, de = q * (c - l) / ce;\n for (N = 1; N <= o; N++) {\n const J = [];\n Q += j / o;\n const O = q * (N * (c - l) / o + l);\n for (M = 0; M <= a; M++) {\n const G = M / a, ee = G * f + u, _e = Math.sin(ee), Oe = Math.cos(ee);\n L.x = O * _e, L.y = x + K * l - N * ce / o, L.z = O * Oe, v.push(L.x, L.y, L.z), F.set(_e, de, Oe).normalize(), E.push(F.x, F.y, F.z), C.push(G, nt.UseOpenGLOrientationForUV ? Q / k : 1 - Q / k), J.push(T), T++;\n }\n R.push(J);\n }\n for (N = 1; N <= p; N++) {\n const J = [], O = S - g - (Math.PI - g) * (N / p);\n Q += c * g / p;\n const G = Math.cos(O), ee = Math.sin(O), _e = G * c;\n for (M = 0; M <= a; M++) {\n const Oe = M / a, ze = Oe * f + u, fe = Math.sin(ze), Te = Math.cos(ze);\n L.x = _e * fe, L.y = -x + ee * c, L.z = _e * Te, v.push(L.x, L.y, L.z), F.set(G * fe, ee, G * Te), E.push(F.x, F.y, F.z), C.push(Oe, nt.UseOpenGLOrientationForUV ? Q / k : 1 - Q / k), J.push(T), T++;\n }\n R.push(J);\n }\n for (M = 0; M < a; M++)\n for (N = 0; N < d + o + p; N++) {\n const J = R[N][M], O = R[N + 1][M], G = R[N + 1][M + 1], ee = R[N][M + 1];\n m.push(J), m.push(O), m.push(ee), m.push(O), m.push(G), m.push(ee);\n }\n if (m = m.reverse(), n.orientation && !n.orientation.equals(_.Up())) {\n const J = new w();\n n.orientation.clone().scale(Math.PI * 0.5).cross(_.Up()).toQuaternion().toRotationMatrix(J);\n const O = _.Zero();\n for (let G = 0; G < v.length; G += 3)\n O.set(v[G], v[G + 1], v[G + 2]), _.TransformCoordinatesToRef(O.clone(), J, O), v[G] = O.x, v[G + 1] = O.y, v[G + 2] = O.z;\n }\n const Z = new re();\n return Z.positions = v, Z.normals = E, Z.uvs = C, Z.indices = m, Z;\n}\nfunction qb(n, e = {\n orientation: _.Up(),\n subdivisions: 2,\n tessellation: 16,\n height: 1,\n radius: 0.25,\n capSubdivisions: 6,\n updatable: !1\n}, t = null) {\n const i = new B(n, t);\n return Cf(e).applyToMesh(i, e.updatable), i;\n}\nB.CreateCapsule = (n, e, t) => qb(n, e, t);\nre.CreateCapsule = Cf;\nclass Yb {\n /** Create the ShapePath used to support glyphs\n * @param resolution defines the resolution used to determine the number of points per curve (default is 4)\n */\n constructor(e) {\n this._paths = [], this._tempPaths = [], this._holes = [], this._resolution = e;\n }\n /** Move the virtual cursor to a coordinate\n * @param x defines the x coordinate\n * @param y defines the y coordinate\n */\n moveTo(e, t) {\n this._currentPath = new Vc(e, t), this._tempPaths.push(this._currentPath);\n }\n /** Draw a line from the virtual cursor to a given coordinate\n * @param x defines the x coordinate\n * @param y defines the y coordinate\n */\n lineTo(e, t) {\n this._currentPath.addLineTo(e, t);\n }\n /** Create a quadratic curve from the virtual cursor to a given coordinate\n * @param cpx defines the x coordinate of the control point\n * @param cpy defines the y coordinate of the control point\n * @param x defines the x coordinate of the end point\n * @param y defines the y coordinate of the end point\n */\n quadraticCurveTo(e, t, i, r) {\n this._currentPath.addQuadraticCurveTo(e, t, i, r, this._resolution);\n }\n /**\n * Create a bezier curve from the virtual cursor to a given coordinate\n * @param cpx1 defines the x coordinate of the first control point\n * @param cpy1 defines the y coordinate of the first control point\n * @param cpx2 defines the x coordinate of the second control point\n * @param cpy2 defines the y coordinate of the second control point\n * @param x defines the x coordinate of the end point\n * @param y defines the y coordinate of the end point\n */\n bezierCurveTo(e, t, i, r, s, a) {\n this._currentPath.addBezierCurveTo(e, t, i, r, s, a, this._resolution);\n }\n /** Extract holes based on CW / CCW */\n extractHoles() {\n for (const e of this._tempPaths)\n e.area() > 0 ? this._holes.push(e) : this._paths.push(e);\n if (!this._paths.length && this._holes.length) {\n const e = this._holes;\n this._holes = this._paths, this._paths = e;\n }\n this._tempPaths.length = 0;\n }\n /** Gets the list of paths */\n get paths() {\n return this._paths;\n }\n /** Gets the list of holes */\n get holes() {\n return this._holes;\n }\n}\nfunction Zb(n, e, t, i, r, s) {\n const a = s.glyphs[n] || s.glyphs[\"?\"];\n if (!a)\n return null;\n const o = new Yb(r);\n if (a.o) {\n const l = a.o.split(\" \");\n for (let c = 0, h = l.length; c < h; )\n switch (l[c++]) {\n case \"m\": {\n const f = parseInt(l[c++]) * e + t, d = parseInt(l[c++]) * e + i;\n o.moveTo(f, d);\n break;\n }\n case \"l\": {\n const f = parseInt(l[c++]) * e + t, d = parseInt(l[c++]) * e + i;\n o.lineTo(f, d);\n break;\n }\n case \"q\": {\n const f = parseInt(l[c++]) * e + t, d = parseInt(l[c++]) * e + i, p = parseInt(l[c++]) * e + t, g = parseInt(l[c++]) * e + i;\n o.quadraticCurveTo(p, g, f, d);\n break;\n }\n case \"b\": {\n const f = parseInt(l[c++]) * e + t, d = parseInt(l[c++]) * e + i, p = parseInt(l[c++]) * e + t, g = parseInt(l[c++]) * e + i, m = parseInt(l[c++]) * e + t, v = parseInt(l[c++]) * e + i;\n o.bezierCurveTo(p, g, m, v, f, d);\n break;\n }\n }\n }\n return o.extractHoles(), { offsetX: a.ha * e, shapePath: o };\n}\nfunction jb(n, e, t, i) {\n const r = Array.from(n), s = e / i.resolution, a = (i.boundingBox.yMax - i.boundingBox.yMin + i.underlineThickness) * s, o = [];\n let l = 0, c = 0;\n for (let h = 0; h < r.length; h++) {\n const u = r[h];\n if (u === `\n`)\n l = 0, c -= a;\n else {\n const f = Zb(u, s, l, c, t, i);\n f && (l += f.offsetX, o.push(f.shapePath));\n }\n }\n return o;\n}\nclass Qb {\n /**\n * Creates a new queue\n */\n constructor() {\n this.running = !1, this._simplificationArray = [];\n }\n /**\n * Adds a new simplification task\n * @param task defines a task to add\n */\n addTask(e) {\n this._simplificationArray.push(e);\n }\n /**\n * Execute next task\n */\n executeNext() {\n const e = this._simplificationArray.pop();\n e ? (this.running = !0, this.runSimplification(e)) : this.running = !1;\n }\n /**\n * Execute a simplification task\n * @param task defines the task to run\n */\n runSimplification(e) {\n if (e.parallelProcessing)\n e.settings.forEach((t) => {\n this._getSimplifier(e).simplify(t, (r) => {\n t.distance !== void 0 && e.mesh.addLODLevel(t.distance, r), r.isVisible = !0, t.quality === e.settings[e.settings.length - 1].quality && e.successCallback && e.successCallback(), this.executeNext();\n });\n });\n else {\n const t = this._getSimplifier(e), i = (r, s) => {\n t.simplify(r, (a) => {\n r.distance !== void 0 && e.mesh.addLODLevel(r.distance, a), a.isVisible = !0, s();\n });\n };\n Pr.Run(e.settings.length, (r) => {\n i(e.settings[r.index], () => {\n r.executeNext();\n });\n }, () => {\n e.successCallback && e.successCallback(), this.executeNext();\n });\n }\n }\n _getSimplifier(e) {\n switch (e.simplificationType) {\n case ac.QUADRATIC:\n default:\n return new tA(e.mesh);\n }\n }\n}\nvar ac;\n(function(n) {\n n[n.QUADRATIC = 0] = \"QUADRATIC\";\n})(ac || (ac = {}));\nclass Jb {\n constructor(e) {\n this._vertices = e, this.error = new Array(4), this.deleted = !1, this.isDirty = !1, this.deletePending = !1, this.borderFactor = 0;\n }\n}\nclass $b {\n constructor(e, t) {\n this.position = e, this.id = t, this.isBorder = !0, this.q = new va(), this.triangleCount = 0, this.triangleStart = 0, this.originalOffsets = [];\n }\n updatePosition(e) {\n this.position.copyFrom(e);\n }\n}\nclass va {\n constructor(e) {\n this.data = new Array(10);\n for (let t = 0; t < 10; ++t)\n e && e[t] ? this.data[t] = e[t] : this.data[t] = 0;\n }\n det(e, t, i, r, s, a, o, l, c) {\n return this.data[e] * this.data[s] * this.data[c] + this.data[i] * this.data[r] * this.data[l] + this.data[t] * this.data[a] * this.data[o] - this.data[i] * this.data[s] * this.data[o] - this.data[e] * this.data[a] * this.data[l] - this.data[t] * this.data[r] * this.data[c];\n }\n addInPlace(e) {\n for (let t = 0; t < 10; ++t)\n this.data[t] += e.data[t];\n }\n addArrayInPlace(e) {\n for (let t = 0; t < 10; ++t)\n this.data[t] += e[t];\n }\n add(e) {\n const t = new va();\n for (let i = 0; i < 10; ++i)\n t.data[i] = this.data[i] + e.data[i];\n return t;\n }\n static FromData(e, t, i, r) {\n return new va(va.DataFromNumbers(e, t, i, r));\n }\n //returning an array to avoid garbage collection\n static DataFromNumbers(e, t, i, r) {\n return [e * e, e * t, e * i, e * r, t * t, t * i, t * r, i * i, i * r, r * r];\n }\n}\nclass eA {\n constructor(e, t) {\n this.vertexId = e, this.triangleId = t;\n }\n}\nclass tA {\n /**\n * Creates a new QuadraticErrorSimplification\n * @param _mesh defines the target mesh\n */\n constructor(e) {\n this._mesh = e, this.syncIterations = 5e3, this.aggressiveness = 7, this.decimationIterations = 100, this.boundingBoxEpsilon = xt;\n }\n /**\n * Simplification of a given mesh according to the given settings.\n * Since this requires computation, it is assumed that the function runs async.\n * @param settings The settings of the simplification, including quality and distance\n * @param successCallback A callback that will be called after the mesh was simplified.\n */\n simplify(e, t) {\n this._initDecimatedMesh(), Pr.Run(this._mesh.subMeshes.length, (i) => {\n this._initWithMesh(i.index, () => {\n this._runDecimation(e, i.index, () => {\n i.executeNext();\n });\n }, e.optimizeMesh);\n }, () => {\n setTimeout(() => {\n t(this._reconstructedMesh);\n }, 0);\n });\n }\n _runDecimation(e, t, i) {\n const r = ~~(this._triangles.length * e.quality);\n let s = 0;\n const a = this._triangles.length, o = (l, c) => {\n setTimeout(() => {\n l % 5 === 0 && this._updateMesh(l === 0);\n for (let f = 0; f < this._triangles.length; ++f)\n this._triangles[f].isDirty = !1;\n const h = 1e-9 * Math.pow(l + 3, this.aggressiveness), u = (f) => {\n const d = ~~((this._triangles.length / 2 + f) % this._triangles.length), p = this._triangles[d];\n if (p && !(p.error[3] > h || p.deleted || p.isDirty)) {\n for (let g = 0; g < 3; ++g)\n if (p.error[g] < h) {\n const m = [], v = [], E = p._vertices[g], C = p._vertices[(g + 1) % 3];\n if (E.isBorder || C.isBorder)\n continue;\n const T = _.Zero();\n this._calculateError(E, C, T);\n const R = [];\n if (this._isFlipped(E, C, T, m, R) || this._isFlipped(C, E, T, v, R) || m.indexOf(!0) < 0 || v.indexOf(!0) < 0)\n continue;\n const x = [];\n if (R.forEach((N) => {\n x.indexOf(N) === -1 && (N.deletePending = !0, x.push(N));\n }), x.length % 2 !== 0)\n continue;\n E.q = C.q.add(E.q), E.updatePosition(T);\n const S = this._references.length;\n s = this._updateTriangles(E, E, m, s), s = this._updateTriangles(E, C, v, s);\n const M = this._references.length - S;\n if (M <= E.triangleCount) {\n if (M)\n for (let N = 0; N < M; N++)\n this._references[E.triangleStart + N] = this._references[S + N];\n } else\n E.triangleStart = S;\n E.triangleCount = M;\n break;\n }\n }\n };\n Pr.SyncAsyncForLoop(this._triangles.length, this.syncIterations, u, c, () => a - s <= r);\n }, 0);\n };\n Pr.Run(this.decimationIterations, (l) => {\n a - s <= r ? l.breakLoop() : o(l.index, () => {\n l.executeNext();\n });\n }, () => {\n setTimeout(() => {\n this._reconstructMesh(t), i();\n }, 0);\n });\n }\n _initWithMesh(e, t, i) {\n this._vertices = [], this._triangles = [];\n const r = this._mesh.getVerticesData(I.PositionKind), s = this._mesh.getIndices(), a = this._mesh.subMeshes[e], o = (u) => {\n if (i) {\n for (let f = 0; f < this._vertices.length; ++f)\n if (this._vertices[f].position.equalsWithEpsilon(u, 1e-4))\n return this._vertices[f];\n }\n return null;\n }, l = [], c = (u) => {\n if (!r)\n return;\n const f = u + a.verticesStart, d = _.FromArray(r, f * 3), p = o(d) || new $b(d, this._vertices.length);\n p.originalOffsets.push(f), p.id === this._vertices.length && this._vertices.push(p), l.push(p.id);\n }, h = a.verticesCount;\n Pr.SyncAsyncForLoop(h, this.syncIterations / 4 >> 0, c, () => {\n const u = (f) => {\n if (!s)\n return;\n const p = (a.indexStart / 3 + f) * 3, g = s[p + 0], m = s[p + 1], v = s[p + 2], E = this._vertices[l[g - a.verticesStart]], C = this._vertices[l[m - a.verticesStart]], T = this._vertices[l[v - a.verticesStart]], R = new Jb([E, C, T]);\n R.originalOffset = p, this._triangles.push(R);\n };\n Pr.SyncAsyncForLoop(a.indexCount / 3, this.syncIterations, u, () => {\n this._init(t);\n });\n });\n }\n _init(e) {\n const t = (i) => {\n const r = this._triangles[i];\n r.normal = _.Cross(r._vertices[1].position.subtract(r._vertices[0].position), r._vertices[2].position.subtract(r._vertices[0].position)).normalize();\n for (let s = 0; s < 3; s++)\n r._vertices[s].q.addArrayInPlace(va.DataFromNumbers(r.normal.x, r.normal.y, r.normal.z, -_.Dot(r.normal, r._vertices[0].position)));\n };\n Pr.SyncAsyncForLoop(this._triangles.length, this.syncIterations, t, () => {\n const i = (r) => {\n const s = this._triangles[r];\n for (let a = 0; a < 3; ++a)\n s.error[a] = this._calculateError(s._vertices[a], s._vertices[(a + 1) % 3]);\n s.error[3] = Math.min(s.error[0], s.error[1], s.error[2]);\n };\n Pr.SyncAsyncForLoop(this._triangles.length, this.syncIterations, i, () => {\n e();\n });\n });\n }\n _reconstructMesh(e) {\n const t = [];\n let i;\n for (i = 0; i < this._vertices.length; ++i)\n this._vertices[i].triangleCount = 0;\n let r, s;\n for (i = 0; i < this._triangles.length; ++i)\n if (!this._triangles[i].deleted) {\n for (r = this._triangles[i], s = 0; s < 3; ++s)\n r._vertices[s].triangleCount = 1;\n t.push(r);\n }\n const a = this._reconstructedMesh.getVerticesData(I.PositionKind) || [], o = this._reconstructedMesh.getVerticesData(I.NormalKind) || [], l = this._reconstructedMesh.getVerticesData(I.UVKind) || [], c = this._reconstructedMesh.getVerticesData(I.ColorKind) || [], h = this._mesh.getVerticesData(I.NormalKind), u = this._mesh.getVerticesData(I.UVKind), f = this._mesh.getVerticesData(I.ColorKind);\n let d = 0;\n for (i = 0; i < this._vertices.length; ++i) {\n const T = this._vertices[i];\n T.id = d, T.triangleCount && T.originalOffsets.forEach((R) => {\n a.push(T.position.x), a.push(T.position.y), a.push(T.position.z), h && h.length && (o.push(h[R * 3]), o.push(h[R * 3 + 1]), o.push(h[R * 3 + 2])), u && u.length && (l.push(u[R * 2]), l.push(u[R * 2 + 1])), f && f.length && (c.push(f[R * 4]), c.push(f[R * 4 + 1]), c.push(f[R * 4 + 2]), c.push(f[R * 4 + 3])), ++d;\n });\n }\n const p = this._reconstructedMesh.getTotalIndices(), g = this._reconstructedMesh.getTotalVertices(), m = this._reconstructedMesh.subMeshes;\n this._reconstructedMesh.subMeshes = [];\n const v = this._reconstructedMesh.getIndices(), E = this._mesh.getIndices();\n for (i = 0; i < t.length; ++i)\n r = t[i], [0, 1, 2].forEach((T) => {\n const R = E[r.originalOffset + T];\n let x = r._vertices[T].originalOffsets.indexOf(R);\n x < 0 && (x = 0), v.push(r._vertices[T].id + x + g);\n });\n this._reconstructedMesh.setIndices(v), this._reconstructedMesh.setVerticesData(I.PositionKind, a), o.length > 0 && this._reconstructedMesh.setVerticesData(I.NormalKind, o), l.length > 0 && this._reconstructedMesh.setVerticesData(I.UVKind, l), c.length > 0 && this._reconstructedMesh.setVerticesData(I.ColorKind, c);\n const C = this._mesh.subMeshes[e];\n e > 0 && (this._reconstructedMesh.subMeshes = [], m.forEach((T) => {\n bi.AddToMesh(\n T.materialIndex,\n T.verticesStart,\n T.verticesCount,\n /* 0, newPositionData.length/3, */\n T.indexStart,\n T.indexCount,\n T.getMesh()\n );\n }), bi.AddToMesh(\n C.materialIndex,\n g,\n d,\n /* 0, newPositionData.length / 3, */\n p,\n t.length * 3,\n this._reconstructedMesh\n ));\n }\n _initDecimatedMesh() {\n this._reconstructedMesh = new B(this._mesh.name + \"Decimated\", this._mesh.getScene()), this._reconstructedMesh.material = this._mesh.material, this._reconstructedMesh.parent = this._mesh.parent, this._reconstructedMesh.isVisible = !1, this._reconstructedMesh.renderingGroupId = this._mesh.renderingGroupId;\n }\n _isFlipped(e, t, i, r, s) {\n for (let a = 0; a < e.triangleCount; ++a) {\n const o = this._triangles[this._references[e.triangleStart + a].triangleId];\n if (o.deleted)\n continue;\n const l = this._references[e.triangleStart + a].vertexId, c = o._vertices[(l + 1) % 3], h = o._vertices[(l + 2) % 3];\n if (c === t || h === t) {\n r[a] = !0, s.push(o);\n continue;\n }\n let u = c.position.subtract(i);\n u = u.normalize();\n let f = h.position.subtract(i);\n if (f = f.normalize(), Math.abs(_.Dot(u, f)) > 0.999)\n return !0;\n const d = _.Cross(u, f).normalize();\n if (r[a] = !1, _.Dot(d, o.normal) < 0.2)\n return !0;\n }\n return !1;\n }\n _updateTriangles(e, t, i, r) {\n let s = r;\n for (let a = 0; a < t.triangleCount; ++a) {\n const o = this._references[t.triangleStart + a], l = this._triangles[o.triangleId];\n if (!l.deleted) {\n if (i[a] && l.deletePending) {\n l.deleted = !0, s++;\n continue;\n }\n l._vertices[o.vertexId] = e, l.isDirty = !0, l.error[0] = this._calculateError(l._vertices[0], l._vertices[1]) + l.borderFactor / 2, l.error[1] = this._calculateError(l._vertices[1], l._vertices[2]) + l.borderFactor / 2, l.error[2] = this._calculateError(l._vertices[2], l._vertices[0]) + l.borderFactor / 2, l.error[3] = Math.min(l.error[0], l.error[1], l.error[2]), this._references.push(o);\n }\n }\n return s;\n }\n _identifyBorder() {\n for (let e = 0; e < this._vertices.length; ++e) {\n const t = [], i = [], r = this._vertices[e];\n let s;\n for (s = 0; s < r.triangleCount; ++s) {\n const a = this._triangles[this._references[r.triangleStart + s].triangleId];\n for (let o = 0; o < 3; o++) {\n let l = 0;\n const c = a._vertices[o];\n for (; l < t.length && i[l] !== c.id; )\n ++l;\n l === t.length ? (t.push(1), i.push(c.id)) : t[l]++;\n }\n }\n for (s = 0; s < t.length; ++s)\n t[s] === 1 ? this._vertices[i[s]].isBorder = !0 : this._vertices[i[s]].isBorder = !1;\n }\n }\n _updateMesh(e = !1) {\n let t;\n if (!e) {\n const l = [];\n for (t = 0; t < this._triangles.length; ++t)\n this._triangles[t].deleted || l.push(this._triangles[t]);\n this._triangles = l;\n }\n for (t = 0; t < this._vertices.length; ++t)\n this._vertices[t].triangleCount = 0, this._vertices[t].triangleStart = 0;\n let i, r, s;\n for (t = 0; t < this._triangles.length; ++t)\n for (i = this._triangles[t], r = 0; r < 3; ++r)\n s = i._vertices[r], s.triangleCount++;\n let a = 0;\n for (t = 0; t < this._vertices.length; ++t)\n this._vertices[t].triangleStart = a, a += this._vertices[t].triangleCount, this._vertices[t].triangleCount = 0;\n const o = new Array(this._triangles.length * 3);\n for (t = 0; t < this._triangles.length; ++t)\n for (i = this._triangles[t], r = 0; r < 3; ++r)\n s = i._vertices[r], o[s.triangleStart + s.triangleCount] = new eA(r, t), s.triangleCount++;\n this._references = o, e && this._identifyBorder();\n }\n _vertexError(e, t) {\n const i = t.x, r = t.y, s = t.z;\n return e.data[0] * i * i + 2 * e.data[1] * i * r + 2 * e.data[2] * i * s + 2 * e.data[3] * i + e.data[4] * r * r + 2 * e.data[5] * r * s + 2 * e.data[6] * r + e.data[7] * s * s + 2 * e.data[8] * s + e.data[9];\n }\n _calculateError(e, t, i) {\n const r = e.q.add(t.q), s = e.isBorder && t.isBorder;\n let a = 0;\n const o = r.det(0, 1, 2, 1, 4, 5, 2, 5, 7);\n if (o !== 0 && !s)\n i || (i = _.Zero()), i.x = -1 / o * r.det(1, 2, 3, 4, 5, 6, 5, 7, 8), i.y = 1 / o * r.det(0, 2, 3, 1, 5, 6, 2, 7, 8), i.z = -1 / o * r.det(0, 1, 3, 1, 4, 6, 2, 5, 8), a = this._vertexError(r, i);\n else {\n const l = e.position.add(t.position).divide(new _(2, 2, 2)), c = this._vertexError(r, e.position), h = this._vertexError(r, t.position), u = this._vertexError(r, l);\n a = Math.min(c, h, u), a === c ? i && i.copyFrom(e.position) : a === h ? i && i.copyFrom(t.position) : i && i.copyFrom(l);\n }\n return a;\n }\n}\nObject.defineProperty(Ot.prototype, \"simplificationQueue\", {\n get: function() {\n if (!this._simplificationQueue) {\n this._simplificationQueue = new Qb();\n let n = this._getComponent(ke.NAME_SIMPLIFICATIONQUEUE);\n n || (n = new iA(this), this._addComponent(n));\n }\n return this._simplificationQueue;\n },\n set: function(n) {\n this._simplificationQueue = n;\n },\n enumerable: !0,\n configurable: !0\n});\nB.prototype.simplify = function(n, e = !0, t = ac.QUADRATIC, i) {\n return this.getScene().simplificationQueue.addTask({\n settings: n,\n parallelProcessing: e,\n mesh: this,\n simplificationType: t,\n successCallback: i\n }), this;\n};\nclass iA {\n /**\n * Creates a new instance of the component for the given scene\n * @param scene Defines the scene to register the component in\n */\n constructor(e) {\n this.name = ke.NAME_SIMPLIFICATIONQUEUE, this.scene = e;\n }\n /**\n * Registers the component in a given scene\n */\n register() {\n this.scene._beforeCameraUpdateStage.registerStep(ke.STEP_BEFORECAMERAUPDATE_SIMPLIFICATIONQUEUE, this, this._beforeCameraUpdate);\n }\n /**\n * Rebuilds the elements related to this component in case of\n * context lost for instance.\n */\n rebuild() {\n }\n /**\n * Disposes the component and the associated resources\n */\n dispose() {\n }\n _beforeCameraUpdate() {\n this.scene._simplificationQueue && !this.scene._simplificationQueue.running && this.scene._simplificationQueue.executeNext();\n }\n}\nbi.prototype._projectOnTrianglesToRef = function(n, e, t, i, r, s) {\n const a = z.Vector3[0], o = z.Vector3[1];\n let l = 1 / 0;\n for (let c = this.indexStart; c < this.indexStart + this.indexCount - (3 - i); c += i) {\n const h = t[c], u = t[c + 1], f = t[c + 2];\n if (r && f === 4294967295) {\n c += 2;\n continue;\n }\n const d = e[h], p = e[u], g = e[f];\n if (!d || !p || !g)\n continue;\n const m = _.ProjectOnTriangleToRef(n, d, p, g, o);\n m < l && (a.copyFrom(o), l = m);\n }\n return s.copyFrom(a), l;\n};\nbi.prototype._projectOnUnIndexedTrianglesToRef = function(n, e, t, i) {\n const r = z.Vector3[0], s = z.Vector3[1];\n let a = 1 / 0;\n for (let o = this.verticesStart; o < this.verticesStart + this.verticesCount; o += 3) {\n const l = e[o], c = e[o + 1], h = e[o + 2], u = _.ProjectOnTriangleToRef(n, l, c, h, s);\n u < a && (r.copyFrom(s), a = u);\n }\n return i.copyFrom(r), a;\n};\nbi.prototype.projectToRef = function(n, e, t, i) {\n const r = this.getMaterial();\n if (!r)\n return -1;\n let s = 3, a = !1;\n switch (r.fillMode) {\n case 3:\n case 5:\n case 6:\n case 8:\n return -1;\n case 7:\n s = 1, a = !0;\n break;\n }\n return r.fillMode === 4 ? -1 : !t.length && this._mesh._unIndexed ? this._projectOnUnIndexedTrianglesToRef(n, e, t, i) : this._projectOnTrianglesToRef(n, e, t, s, a, i);\n};\nfunction rA(n, e = {}, t) {\n e.diameter || (e.diameter = 1), e.segments || (e.segments = 16);\n const i = v0(\"\", { slice: 0.5, diameter: e.diameter, segments: e.segments }, t), r = g0(\"\", { radius: e.diameter / 2, tessellation: e.segments * 3 + (4 - e.segments) }, t);\n r.rotation.x = -Math.PI / 2, r.parent = i;\n const s = B.MergeMeshes([r, i], !0);\n return s.name = n, s;\n}\nB.CreateHemisphere = (n, e, t, i) => rA(n, {\n segments: e,\n diameter: t\n}, i);\nclass oc {\n constructor() {\n this.previousWorldMatrices = {}, this.previousBones = {};\n }\n /**\n * Add the required uniforms to the current list.\n * @param uniforms defines the current uniform list.\n */\n static AddUniforms(e) {\n e.push(\"previousWorld\", \"previousViewProjection\", \"mPreviousBones\");\n }\n /**\n * Add the required samplers to the current list.\n * @param samplers defines the current sampler list.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static AddSamplers(e) {\n }\n /**\n * Binds the material data.\n * @param effect defines the effect to update\n * @param scene defines the scene the material belongs to.\n * @param mesh The mesh\n * @param world World matrix of this mesh\n * @param isFrozen Is the material frozen\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n bindForSubMesh(e, t, i, r, s) {\n if (t.prePassRenderer && t.prePassRenderer.enabled && t.prePassRenderer.currentRTisSceneRT && t.prePassRenderer.getIndex(2) !== -1) {\n this.previousWorldMatrices[i.uniqueId] || (this.previousWorldMatrices[i.uniqueId] = r.clone()), this.previousViewProjection || (this.previousViewProjection = t.getTransformMatrix().clone(), this.currentViewProjection = t.getTransformMatrix().clone());\n const a = t.getEngine();\n this.currentViewProjection.updateFlag !== t.getTransformMatrix().updateFlag ? (this._lastUpdateFrameId = a.frameId, this.previousViewProjection.copyFrom(this.currentViewProjection), this.currentViewProjection.copyFrom(t.getTransformMatrix())) : this._lastUpdateFrameId !== a.frameId && (this._lastUpdateFrameId = a.frameId, this.previousViewProjection.copyFrom(this.currentViewProjection)), e.setMatrix(\"previousWorld\", this.previousWorldMatrices[i.uniqueId]), e.setMatrix(\"previousViewProjection\", this.previousViewProjection), this.previousWorldMatrices[i.uniqueId] = r.clone();\n }\n }\n}\nclass es {\n /**\n * Creates a new instance\n * @param externalProperties list of external properties to inject into the object\n */\n constructor(e) {\n if (this._keys = [], this._isDirty = !0, this._areLightsDirty = !0, this._areLightsDisposed = !1, this._areAttributesDirty = !0, this._areTexturesDirty = !0, this._areFresnelDirty = !0, this._areMiscDirty = !0, this._arePrePassDirty = !0, this._areImageProcessingDirty = !0, this._normals = !1, this._uvs = !1, this._needNormals = !1, this._needUVs = !1, this._externalProperties = e, e)\n for (const t in e)\n Object.prototype.hasOwnProperty.call(e, t) && this._setDefaultValue(t);\n }\n /**\n * Specifies if the material needs to be re-calculated\n */\n get isDirty() {\n return this._isDirty;\n }\n /**\n * Marks the material to indicate that it has been re-calculated\n */\n markAsProcessed() {\n this._isDirty = !1, this._areAttributesDirty = !1, this._areTexturesDirty = !1, this._areFresnelDirty = !1, this._areLightsDirty = !1, this._areLightsDisposed = !1, this._areMiscDirty = !1, this._arePrePassDirty = !1, this._areImageProcessingDirty = !1;\n }\n /**\n * Marks the material to indicate that it needs to be re-calculated\n */\n markAsUnprocessed() {\n this._isDirty = !0;\n }\n /**\n * Marks the material to indicate all of its defines need to be re-calculated\n */\n markAllAsDirty() {\n this._areTexturesDirty = !0, this._areAttributesDirty = !0, this._areLightsDirty = !0, this._areFresnelDirty = !0, this._areMiscDirty = !0, this._arePrePassDirty = !1, this._areImageProcessingDirty = !0, this._isDirty = !0;\n }\n /**\n * Marks the material to indicate that image processing needs to be re-calculated\n */\n markAsImageProcessingDirty() {\n this._areImageProcessingDirty = !0, this._isDirty = !0;\n }\n /**\n * Marks the material to indicate the lights need to be re-calculated\n * @param disposed Defines whether the light is dirty due to dispose or not\n */\n markAsLightDirty(e = !1) {\n this._areLightsDirty = !0, this._areLightsDisposed = this._areLightsDisposed || e, this._isDirty = !0;\n }\n /**\n * Marks the attribute state as changed\n */\n markAsAttributesDirty() {\n this._areAttributesDirty = !0, this._isDirty = !0;\n }\n /**\n * Marks the texture state as changed\n */\n markAsTexturesDirty() {\n this._areTexturesDirty = !0, this._isDirty = !0;\n }\n /**\n * Marks the fresnel state as changed\n */\n markAsFresnelDirty() {\n this._areFresnelDirty = !0, this._isDirty = !0;\n }\n /**\n * Marks the misc state as changed\n */\n markAsMiscDirty() {\n this._areMiscDirty = !0, this._isDirty = !0;\n }\n /**\n * Marks the prepass state as changed\n */\n markAsPrePassDirty() {\n this._arePrePassDirty = !0, this._isDirty = !0;\n }\n /**\n * Rebuilds the material defines\n */\n rebuild() {\n this._keys.length = 0;\n for (const e of Object.keys(this))\n e[0] !== \"_\" && this._keys.push(e);\n if (this._externalProperties)\n for (const e in this._externalProperties)\n this._keys.indexOf(e) === -1 && this._keys.push(e);\n }\n /**\n * Specifies if two material defines are equal\n * @param other - A material define instance to compare to\n * @returns - Boolean indicating if the material defines are equal (true) or not (false)\n */\n isEqual(e) {\n if (this._keys.length !== e._keys.length)\n return !1;\n for (let t = 0; t < this._keys.length; t++) {\n const i = this._keys[t];\n if (this[i] !== e[i])\n return !1;\n }\n return !0;\n }\n /**\n * Clones this instance's defines to another instance\n * @param other - material defines to clone values to\n */\n cloneTo(e) {\n this._keys.length !== e._keys.length && (e._keys = this._keys.slice(0));\n for (let t = 0; t < this._keys.length; t++) {\n const i = this._keys[t];\n e[i] = this[i];\n }\n }\n /**\n * Resets the material define values\n */\n reset() {\n this._keys.forEach((e) => this._setDefaultValue(e));\n }\n _setDefaultValue(e) {\n var r, s, a, o;\n const t = ((s = (r = this._externalProperties) == null ? void 0 : r[e]) == null ? void 0 : s.type) ?? typeof this[e], i = (o = (a = this._externalProperties) == null ? void 0 : a[e]) == null ? void 0 : o.default;\n switch (t) {\n case \"number\":\n this[e] = i ?? 0;\n break;\n case \"string\":\n this[e] = i ?? \"\";\n break;\n default:\n this[e] = i ?? !1;\n break;\n }\n }\n /**\n * Converts the material define values to a string\n * @returns - String of material define information\n */\n toString() {\n let e = \"\";\n for (let t = 0; t < this._keys.length; t++) {\n const i = this._keys[t], r = this[i];\n switch (typeof r) {\n case \"number\":\n case \"string\":\n e += \"#define \" + i + \" \" + r + `\n`;\n break;\n default:\n r && (e += \"#define \" + i + `\n`);\n break;\n }\n }\n return e;\n }\n}\nclass ae {\n /**\n * Are diffuse textures enabled in the application.\n */\n static get DiffuseTextureEnabled() {\n return this._DiffuseTextureEnabled;\n }\n static set DiffuseTextureEnabled(e) {\n this._DiffuseTextureEnabled !== e && (this._DiffuseTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are detail textures enabled in the application.\n */\n static get DetailTextureEnabled() {\n return this._DetailTextureEnabled;\n }\n static set DetailTextureEnabled(e) {\n this._DetailTextureEnabled !== e && (this._DetailTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are decal maps enabled in the application.\n */\n static get DecalMapEnabled() {\n return this._DecalMapEnabled;\n }\n static set DecalMapEnabled(e) {\n this._DecalMapEnabled !== e && (this._DecalMapEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are ambient textures enabled in the application.\n */\n static get AmbientTextureEnabled() {\n return this._AmbientTextureEnabled;\n }\n static set AmbientTextureEnabled(e) {\n this._AmbientTextureEnabled !== e && (this._AmbientTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are opacity textures enabled in the application.\n */\n static get OpacityTextureEnabled() {\n return this._OpacityTextureEnabled;\n }\n static set OpacityTextureEnabled(e) {\n this._OpacityTextureEnabled !== e && (this._OpacityTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are reflection textures enabled in the application.\n */\n static get ReflectionTextureEnabled() {\n return this._ReflectionTextureEnabled;\n }\n static set ReflectionTextureEnabled(e) {\n this._ReflectionTextureEnabled !== e && (this._ReflectionTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are emissive textures enabled in the application.\n */\n static get EmissiveTextureEnabled() {\n return this._EmissiveTextureEnabled;\n }\n static set EmissiveTextureEnabled(e) {\n this._EmissiveTextureEnabled !== e && (this._EmissiveTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are specular textures enabled in the application.\n */\n static get SpecularTextureEnabled() {\n return this._SpecularTextureEnabled;\n }\n static set SpecularTextureEnabled(e) {\n this._SpecularTextureEnabled !== e && (this._SpecularTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are bump textures enabled in the application.\n */\n static get BumpTextureEnabled() {\n return this._BumpTextureEnabled;\n }\n static set BumpTextureEnabled(e) {\n this._BumpTextureEnabled !== e && (this._BumpTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are lightmap textures enabled in the application.\n */\n static get LightmapTextureEnabled() {\n return this._LightmapTextureEnabled;\n }\n static set LightmapTextureEnabled(e) {\n this._LightmapTextureEnabled !== e && (this._LightmapTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are refraction textures enabled in the application.\n */\n static get RefractionTextureEnabled() {\n return this._RefractionTextureEnabled;\n }\n static set RefractionTextureEnabled(e) {\n this._RefractionTextureEnabled !== e && (this._RefractionTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are color grading textures enabled in the application.\n */\n static get ColorGradingTextureEnabled() {\n return this._ColorGradingTextureEnabled;\n }\n static set ColorGradingTextureEnabled(e) {\n this._ColorGradingTextureEnabled !== e && (this._ColorGradingTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are fresnels enabled in the application.\n */\n static get FresnelEnabled() {\n return this._FresnelEnabled;\n }\n static set FresnelEnabled(e) {\n this._FresnelEnabled !== e && (this._FresnelEnabled = e, se.MarkAllMaterialsAsDirty(4));\n }\n /**\n * Are clear coat textures enabled in the application.\n */\n static get ClearCoatTextureEnabled() {\n return this._ClearCoatTextureEnabled;\n }\n static set ClearCoatTextureEnabled(e) {\n this._ClearCoatTextureEnabled !== e && (this._ClearCoatTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are clear coat bump textures enabled in the application.\n */\n static get ClearCoatBumpTextureEnabled() {\n return this._ClearCoatBumpTextureEnabled;\n }\n static set ClearCoatBumpTextureEnabled(e) {\n this._ClearCoatBumpTextureEnabled !== e && (this._ClearCoatBumpTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are clear coat tint textures enabled in the application.\n */\n static get ClearCoatTintTextureEnabled() {\n return this._ClearCoatTintTextureEnabled;\n }\n static set ClearCoatTintTextureEnabled(e) {\n this._ClearCoatTintTextureEnabled !== e && (this._ClearCoatTintTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are sheen textures enabled in the application.\n */\n static get SheenTextureEnabled() {\n return this._SheenTextureEnabled;\n }\n static set SheenTextureEnabled(e) {\n this._SheenTextureEnabled !== e && (this._SheenTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are anisotropic textures enabled in the application.\n */\n static get AnisotropicTextureEnabled() {\n return this._AnisotropicTextureEnabled;\n }\n static set AnisotropicTextureEnabled(e) {\n this._AnisotropicTextureEnabled !== e && (this._AnisotropicTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are thickness textures enabled in the application.\n */\n static get ThicknessTextureEnabled() {\n return this._ThicknessTextureEnabled;\n }\n static set ThicknessTextureEnabled(e) {\n this._ThicknessTextureEnabled !== e && (this._ThicknessTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are refraction intensity textures enabled in the application.\n */\n static get RefractionIntensityTextureEnabled() {\n return this._ThicknessTextureEnabled;\n }\n static set RefractionIntensityTextureEnabled(e) {\n this._RefractionIntensityTextureEnabled !== e && (this._RefractionIntensityTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are translucency intensity textures enabled in the application.\n */\n static get TranslucencyIntensityTextureEnabled() {\n return this._ThicknessTextureEnabled;\n }\n static set TranslucencyIntensityTextureEnabled(e) {\n this._TranslucencyIntensityTextureEnabled !== e && (this._TranslucencyIntensityTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are translucency intensity textures enabled in the application.\n */\n static get IridescenceTextureEnabled() {\n return this._IridescenceTextureEnabled;\n }\n static set IridescenceTextureEnabled(e) {\n this._IridescenceTextureEnabled !== e && (this._IridescenceTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n}\nae._DiffuseTextureEnabled = !0;\nae._DetailTextureEnabled = !0;\nae._DecalMapEnabled = !0;\nae._AmbientTextureEnabled = !0;\nae._OpacityTextureEnabled = !0;\nae._ReflectionTextureEnabled = !0;\nae._EmissiveTextureEnabled = !0;\nae._SpecularTextureEnabled = !0;\nae._BumpTextureEnabled = !0;\nae._LightmapTextureEnabled = !0;\nae._RefractionTextureEnabled = !0;\nae._ColorGradingTextureEnabled = !0;\nae._FresnelEnabled = !0;\nae._ClearCoatTextureEnabled = !0;\nae._ClearCoatBumpTextureEnabled = !0;\nae._ClearCoatTintTextureEnabled = !0;\nae._SheenTextureEnabled = !0;\nae._AnisotropicTextureEnabled = !0;\nae._ThicknessTextureEnabled = !0;\nae._RefractionIntensityTextureEnabled = !0;\nae._TranslucencyIntensityTextureEnabled = !0;\nae._IridescenceTextureEnabled = !0;\nconst sA = \"decalFragmentDeclaration\", nA = `#ifdef DECAL\nuniform vec4 vDecalInfos;\n#endif\n`;\nY.IncludesShadersStore[sA] = nA;\nconst aA = \"defaultFragmentDeclaration\", oA = `uniform vec4 vEyePosition;uniform vec4 vDiffuseColor;\n#ifdef SPECULARTERM\nuniform vec4 vSpecularColor;\n#endif\nuniform vec3 vEmissiveColor;uniform vec3 vAmbientColor;uniform float visibility;\n#ifdef DIFFUSE\nuniform vec2 vDiffuseInfos;\n#endif\n#ifdef AMBIENT\nuniform vec2 vAmbientInfos;\n#endif\n#ifdef OPACITY \nuniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;uniform vec2 vTangentSpaceParams;\n#endif\n#ifdef ALPHATEST\nuniform float alphaCutOff;\n#endif\n#if defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_PROJECTION) || defined(REFRACTION) || defined(PREPASS)\nuniform mat4 view;\n#endif\n#ifdef REFRACTION\nuniform vec4 vRefractionInfos;\n#ifndef REFRACTIONMAP_3D\nuniform mat4 refractionMatrix;\n#endif\n#ifdef REFRACTIONFRESNEL\nuniform vec4 refractionLeftColor;uniform vec4 refractionRightColor;\n#endif\n#if defined(USE_LOCAL_REFRACTIONMAP_CUBIC) && defined(REFRACTIONMAP_3D)\nuniform vec3 vRefractionPosition;uniform vec3 vRefractionSize; \n#endif\n#endif\n#if defined(SPECULAR) && defined(SPECULARTERM)\nuniform vec2 vSpecularInfos;\n#endif\n#ifdef DIFFUSEFRESNEL\nuniform vec4 diffuseLeftColor;uniform vec4 diffuseRightColor;\n#endif\n#ifdef OPACITYFRESNEL\nuniform vec4 opacityParts;\n#endif\n#ifdef EMISSIVEFRESNEL\nuniform vec4 emissiveLeftColor;uniform vec4 emissiveRightColor;\n#endif\n#ifdef REFLECTION\nuniform vec2 vReflectionInfos;\n#if defined(REFLECTIONMAP_PLANAR) || defined(REFLECTIONMAP_CUBIC) || defined(REFLECTIONMAP_PROJECTION) || defined(REFLECTIONMAP_EQUIRECTANGULAR) || defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_SKYBOX)\nuniform mat4 reflectionMatrix;\n#endif\n#ifndef REFLECTIONMAP_SKYBOX\n#if defined(USE_LOCAL_REFLECTIONMAP_CUBIC) && defined(REFLECTIONMAP_CUBIC)\nuniform vec3 vReflectionPosition;uniform vec3 vReflectionSize; \n#endif\n#endif\n#ifdef REFLECTIONFRESNEL\nuniform vec4 reflectionLeftColor;uniform vec4 reflectionRightColor;\n#endif\n#endif\n#ifdef DETAIL\nuniform vec4 vDetailInfos;\n#endif\n#include\n#define ADDITIONAL_FRAGMENT_DECLARATION\n`;\nY.IncludesShadersStore[aA] = oA;\nconst lA = \"sceneUboDeclaration\", cA = `layout(std140,column_major) uniform;uniform Scene {mat4 viewProjection;\n#ifdef MULTIVIEW\nmat4 viewProjectionR;\n#endif \nmat4 view;mat4 projection;vec4 vEyePosition;};\n`;\nY.IncludesShadersStore[lA] = cA;\nconst hA = \"meshUboDeclaration\", uA = `#ifdef WEBGL2\nuniform mat4 world;uniform float visibility;\n#else\nlayout(std140,column_major) uniform;uniform Mesh\n{mat4 world;float visibility;};\n#endif\n#define WORLD_UBO\n`;\nY.IncludesShadersStore[hA] = uA;\nconst fA = \"defaultUboDeclaration\", dA = `layout(std140,column_major) uniform;uniform Material\n{vec4 diffuseLeftColor;vec4 diffuseRightColor;vec4 opacityParts;vec4 reflectionLeftColor;vec4 reflectionRightColor;vec4 refractionLeftColor;vec4 refractionRightColor;vec4 emissiveLeftColor;vec4 emissiveRightColor;vec2 vDiffuseInfos;vec2 vAmbientInfos;vec2 vOpacityInfos;vec2 vReflectionInfos;vec3 vReflectionPosition;vec3 vReflectionSize;vec2 vEmissiveInfos;vec2 vLightmapInfos;vec2 vSpecularInfos;vec3 vBumpInfos;mat4 diffuseMatrix;mat4 ambientMatrix;mat4 opacityMatrix;mat4 reflectionMatrix;mat4 emissiveMatrix;mat4 lightmapMatrix;mat4 specularMatrix;mat4 bumpMatrix;vec2 vTangentSpaceParams;float pointSize;float alphaCutOff;mat4 refractionMatrix;vec4 vRefractionInfos;vec3 vRefractionPosition;vec3 vRefractionSize;vec4 vSpecularColor;vec3 vEmissiveColor;vec4 vDiffuseColor;vec3 vAmbientColor;\n#define ADDITIONAL_UBO_DECLARATION\n};\n#include\n#include\n`;\nY.IncludesShadersStore[fA] = dA;\nconst pA = \"prePassDeclaration\", gA = `#ifdef PREPASS\n#extension GL_EXT_draw_buffers : require\nlayout(location=0) out highp vec4 glFragData[{X}];highp vec4 gl_FragColor;\n#ifdef PREPASS_DEPTH\nvarying highp vec3 vViewPos;\n#endif\n#ifdef PREPASS_VELOCITY\nvarying highp vec4 vCurrentPosition;varying highp vec4 vPreviousPosition;\n#endif\n#endif\n`;\nY.IncludesShadersStore[pA] = gA;\nconst mA = \"oitDeclaration\", _A = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY\n#extension GL_EXT_draw_buffers : require\nlayout(location=0) out vec2 depth; \nlayout(location=1) out vec4 frontColor;layout(location=2) out vec4 backColor;\n#define MAX_DEPTH 99999.0\nhighp vec4 gl_FragColor;uniform sampler2D oitDepthSampler;uniform sampler2D oitFrontColorSampler;\n#endif\n`;\nY.IncludesShadersStore[mA] = _A;\nconst EA = \"mainUVVaryingDeclaration\", vA = `#ifdef MAINUV{X}\nvarying vec2 vMainUV{X};\n#endif\n`;\nY.IncludesShadersStore[EA] = vA;\nconst TA = \"helperFunctions\", xA = `const float PI=3.1415926535897932384626433832795;const float RECIPROCAL_PI=0.3183098861837907;const float RECIPROCAL_PI2=0.15915494309189535;const float HALF_MIN=5.96046448e-08; \nconst float LinearEncodePowerApprox=2.2;const float GammaEncodePowerApprox=1.0/LinearEncodePowerApprox;const vec3 LuminanceEncodeApprox=vec3(0.2126,0.7152,0.0722);const float Epsilon=0.0000001;\n#define saturate(x) clamp(x,0.0,1.0)\n#define absEps(x) abs(x)+Epsilon\n#define maxEps(x) max(x,Epsilon)\n#define saturateEps(x) clamp(x,Epsilon,1.0)\nmat3 transposeMat3(mat3 inMatrix) {vec3 i0=inMatrix[0];vec3 i1=inMatrix[1];vec3 i2=inMatrix[2];mat3 outMatrix=mat3(\nvec3(i0.x,i1.x,i2.x),\nvec3(i0.y,i1.y,i2.y),\nvec3(i0.z,i1.z,i2.z)\n);return outMatrix;}\nmat3 inverseMat3(mat3 inMatrix) {float a00=inMatrix[0][0],a01=inMatrix[0][1],a02=inMatrix[0][2];float a10=inMatrix[1][0],a11=inMatrix[1][1],a12=inMatrix[1][2];float a20=inMatrix[2][0],a21=inMatrix[2][1],a22=inMatrix[2][2];float b01=a22*a11-a12*a21;float b11=-a22*a10+a12*a20;float b21=a21*a10-a11*a20;float det=a00*b01+a01*b11+a02*b21;return mat3(b01,(-a22*a01+a02*a21),(a12*a01-a02*a11),\nb11,(a22*a00-a02*a20),(-a12*a00+a02*a10),\nb21,(-a21*a00+a01*a20),(a11*a00-a01*a10))/det;}\n#if USE_EXACT_SRGB_CONVERSIONS\nvec3 toLinearSpaceExact(vec3 color)\n{vec3 nearZeroSection=0.0773993808*color;vec3 remainingSection=pow(0.947867299*(color+vec3(0.055)),vec3(2.4));\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nreturn mix(remainingSection,nearZeroSection,lessThanEqual(color,vec3(0.04045)));\n#else\nreturn\nvec3(\ncolor.r<=0.04045 ? nearZeroSection.r : remainingSection.r,\ncolor.g<=0.04045 ? nearZeroSection.g : remainingSection.g,\ncolor.b<=0.04045 ? nearZeroSection.b : remainingSection.b);\n#endif\n}\nvec3 toGammaSpaceExact(vec3 color)\n{vec3 nearZeroSection=12.92*color;vec3 remainingSection=1.055*pow(color,vec3(0.41666))-vec3(0.055);\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nreturn mix(remainingSection,nearZeroSection,lessThanEqual(color,vec3(0.0031308)));\n#else\nreturn\nvec3(\ncolor.r<=0.0031308 ? nearZeroSection.r : remainingSection.r,\ncolor.g<=0.0031308 ? nearZeroSection.g : remainingSection.g,\ncolor.b<=0.0031308 ? nearZeroSection.b : remainingSection.b);\n#endif\n}\n#endif\nfloat toLinearSpace(float color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nfloat nearZeroSection=0.0773993808*color;float remainingSection=pow(0.947867299*(color+0.055),2.4);return color<=0.04045 ? nearZeroSection : remainingSection;\n#else\nreturn pow(color,LinearEncodePowerApprox);\n#endif\n}\nvec3 toLinearSpace(vec3 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn toLinearSpaceExact(color);\n#else\nreturn pow(color,vec3(LinearEncodePowerApprox));\n#endif\n}\nvec4 toLinearSpace(vec4 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn vec4(toLinearSpaceExact(color.rgb),color.a);\n#else\nreturn vec4(pow(color.rgb,vec3(LinearEncodePowerApprox)),color.a);\n#endif\n}\nfloat toGammaSpace(float color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nfloat nearZeroSection=12.92*color;float remainingSection=1.055*pow(color,0.41666)-0.055;return color<=0.0031308 ? nearZeroSection : remainingSection;\n#else\nreturn pow(color,GammaEncodePowerApprox);\n#endif\n}\nvec3 toGammaSpace(vec3 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn toGammaSpaceExact(color);\n#else\nreturn pow(color,vec3(GammaEncodePowerApprox));\n#endif\n}\nvec4 toGammaSpace(vec4 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn vec4(toGammaSpaceExact(color.rgb),color.a);\n#else\nreturn vec4(pow(color.rgb,vec3(GammaEncodePowerApprox)),color.a);\n#endif\n}\nfloat square(float value)\n{return value*value;}\nvec3 square(vec3 value)\n{return value*value;}\nfloat pow5(float value) {float sq=value*value;return sq*sq*value;}\nfloat getLuminance(vec3 color)\n{return clamp(dot(color,LuminanceEncodeApprox),0.,1.);}\nfloat getRand(vec2 seed) {return fract(sin(dot(seed.xy ,vec2(12.9898,78.233)))*43758.5453);}\nfloat dither(vec2 seed,float varianceAmount) {float rand=getRand(seed);float normVariance=varianceAmount/255.0;float dither=mix(-normVariance,normVariance,rand);return dither;}\nconst float rgbdMaxRange=255.0;vec4 toRGBD(vec3 color) {float maxRGB=maxEps(max(color.r,max(color.g,color.b)));float D =max(rgbdMaxRange/maxRGB,1.);D =clamp(floor(D)/255.0,0.,1.);vec3 rgb=color.rgb*D;rgb=toGammaSpace(rgb);return vec4(clamp(rgb,0.,1.),D); }\nvec3 fromRGBD(vec4 rgbd) {rgbd.rgb=toLinearSpace(rgbd.rgb);return rgbd.rgb/rgbd.a;}\nvec3 parallaxCorrectNormal( vec3 vertexPos,vec3 origVec,vec3 cubeSize,vec3 cubePos ) {vec3 invOrigVec=vec3(1.0,1.0,1.0)/origVec;vec3 halfSize=cubeSize*0.5;vec3 intersecAtMaxPlane=(cubePos+halfSize-vertexPos)*invOrigVec;vec3 intersecAtMinPlane=(cubePos-halfSize-vertexPos)*invOrigVec;vec3 largestIntersec=max(intersecAtMaxPlane,intersecAtMinPlane);float distance=min(min(largestIntersec.x,largestIntersec.y),largestIntersec.z);vec3 intersectPositionWS=vertexPos+origVec*distance;return intersectPositionWS-cubePos;}\n`;\nY.IncludesShadersStore[TA] = xA;\nconst CA = \"lightFragmentDeclaration\", RA = `#ifdef LIGHT{X}\nuniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X};\n#ifdef SPECULARTERM\nuniform vec4 vLightSpecular{X};\n#else\nvec4 vLightSpecular{X}=vec4(0.);\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];uniform float viewFrustumZ{X}[SHADOWCSMNUM_CASCADES{X}];uniform float frustumLengths{X}[SHADOWCSMNUM_CASCADES{X}];uniform float cascadeBlendFactor{X};varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};uniform highp sampler2DArray depthSampler{X};uniform vec2 lightSizeUVCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float depthCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float penumbraDarkness{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};\n#else\nuniform highp sampler2DArray shadowSampler{X};\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nconst vec3 vCascadeColorsMultiplier{X}[8]=vec3[8]\n(\nvec3 ( 1.5,0.0,0.0 ),\nvec3 ( 0.0,1.5,0.0 ),\nvec3 ( 0.0,0.0,5.5 ),\nvec3 ( 1.5,0.0,5.5 ),\nvec3 ( 1.5,1.5,0.0 ),\nvec3 ( 1.0,1.0,1.0 ),\nvec3 ( 0.0,1.0,5.5 ),\nvec3 ( 0.5,3.5,0.75 )\n);vec3 shadowDebug{X};\n#endif\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nint index{X}=-1;\n#else\nint index{X}=SHADOWCSMNUM_CASCADES{X}-1;\n#endif\nfloat diff{X}=0.;\n#elif defined(SHADOWCUBE{X})\nuniform samplerCube shadowSampler{X};\n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DShadow shadowSampler{X};uniform highp sampler2D depthSampler{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DShadow shadowSampler{X};\n#else\nuniform sampler2D shadowSampler{X};\n#endif\nuniform mat4 lightMatrix{X};\n#endif\nuniform vec4 shadowsInfo{X};uniform vec2 depthValues{X};\n#endif\n#ifdef SPOTLIGHT{X}\nuniform vec4 vLightDirection{X};uniform vec4 vLightFalloff{X};\n#elif defined(POINTLIGHT{X})\nuniform vec4 vLightFalloff{X};\n#elif defined(HEMILIGHT{X})\nuniform vec3 vLightGround{X};\n#endif\n#ifdef PROJECTEDLIGHTTEXTURE{X}\nuniform mat4 textureProjectionMatrix{X};uniform sampler2D projectionLightSampler{X};\n#endif\n#endif\n`;\nY.IncludesShadersStore[CA] = RA;\nconst SA = \"lightUboDeclaration\", yA = `#ifdef LIGHT{X}\nuniform Light{X}\n{vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular;\n#ifdef SPOTLIGHT{X}\nvec4 vLightDirection;vec4 vLightFalloff;\n#elif defined(POINTLIGHT{X})\nvec4 vLightFalloff;\n#elif defined(HEMILIGHT{X})\nvec3 vLightGround;\n#endif\nvec4 shadowsInfo;vec2 depthValues;} light{X};\n#ifdef PROJECTEDLIGHTTEXTURE{X}\nuniform mat4 textureProjectionMatrix{X};uniform sampler2D projectionLightSampler{X};\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];uniform float viewFrustumZ{X}[SHADOWCSMNUM_CASCADES{X}];uniform float frustumLengths{X}[SHADOWCSMNUM_CASCADES{X}];uniform float cascadeBlendFactor{X};varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};uniform highp sampler2DArray depthSampler{X};uniform vec2 lightSizeUVCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float depthCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float penumbraDarkness{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};\n#else\nuniform highp sampler2DArray shadowSampler{X};\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nconst vec3 vCascadeColorsMultiplier{X}[8]=vec3[8]\n(\nvec3 ( 1.5,0.0,0.0 ),\nvec3 ( 0.0,1.5,0.0 ),\nvec3 ( 0.0,0.0,5.5 ),\nvec3 ( 1.5,0.0,5.5 ),\nvec3 ( 1.5,1.5,0.0 ),\nvec3 ( 1.0,1.0,1.0 ),\nvec3 ( 0.0,1.0,5.5 ),\nvec3 ( 0.5,3.5,0.75 )\n);vec3 shadowDebug{X};\n#endif\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nint index{X}=-1;\n#else\nint index{X}=SHADOWCSMNUM_CASCADES{X}-1;\n#endif\nfloat diff{X}=0.;\n#elif defined(SHADOWCUBE{X})\nuniform samplerCube shadowSampler{X}; \n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DShadow shadowSampler{X};uniform highp sampler2D depthSampler{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DShadow shadowSampler{X};\n#else\nuniform sampler2D shadowSampler{X};\n#endif\nuniform mat4 lightMatrix{X};\n#endif\n#endif\n#endif\n`;\nY.IncludesShadersStore[SA] = yA;\nconst IA = \"lightsFragmentFunctions\", bA = `struct lightingInfo\n{vec3 diffuse;\n#ifdef SPECULARTERM\nvec3 specular;\n#endif\n#ifdef NDOTL\nfloat ndl;\n#endif\n};lightingInfo computeLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {lightingInfo result;vec3 lightVectorW;float attenuation=1.0;if (lightData.w==0.)\n{vec3 direction=lightData.xyz-vPositionW;attenuation=max(0.,1.0-length(direction)/range);lightVectorW=normalize(direction);}\nelse\n{lightVectorW=normalize(-lightData.xyz);}\nfloat ndl=max(0.,dot(vNormal,lightVectorW));\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=ndl*diffuseColor*attenuation;\n#ifdef SPECULARTERM\nvec3 angleW=normalize(viewDirectionW+lightVectorW);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor*attenuation;\n#endif\nreturn result;}\nlightingInfo computeSpotLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec4 lightDirection,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {lightingInfo result;vec3 direction=lightData.xyz-vPositionW;vec3 lightVectorW=normalize(direction);float attenuation=max(0.,1.0-length(direction)/range);float cosAngle=max(0.,dot(lightDirection.xyz,-lightVectorW));if (cosAngle>=lightDirection.w)\n{cosAngle=max(0.,pow(cosAngle,lightData.w));attenuation*=cosAngle;float ndl=max(0.,dot(vNormal,lightVectorW));\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=ndl*diffuseColor*attenuation;\n#ifdef SPECULARTERM\nvec3 angleW=normalize(viewDirectionW+lightVectorW);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor*attenuation;\n#endif\nreturn result;}\nresult.diffuse=vec3(0.);\n#ifdef SPECULARTERM\nresult.specular=vec3(0.);\n#endif\n#ifdef NDOTL\nresult.ndl=0.;\n#endif\nreturn result;}\nlightingInfo computeHemisphericLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,vec3 groundColor,float glossiness) {lightingInfo result;float ndl=dot(vNormal,lightData.xyz)*0.5+0.5;\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=mix(groundColor,diffuseColor,ndl);\n#ifdef SPECULARTERM\nvec3 angleW=normalize(viewDirectionW+lightData.xyz);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor;\n#endif\nreturn result;}\n#define inline\nvec3 computeProjectionTextureDiffuseLighting(sampler2D projectionLightSampler,mat4 textureProjectionMatrix){vec4 strq=textureProjectionMatrix*vec4(vPositionW,1.0);strq/=strq.w;vec3 textureColor=texture2D(projectionLightSampler,strq.xy).rgb;return textureColor;}`;\nY.IncludesShadersStore[IA] = bA;\nconst AA = \"shadowsFragmentFunctions\", MA = `#ifdef SHADOWS\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\n#define TEXTUREFUNC(s,c,l) texture2DLodEXT(s,c,l)\n#else\n#define TEXTUREFUNC(s,c,b) texture2D(s,c,b)\n#endif\n#ifndef SHADOWFLOAT\nfloat unpack(vec4 color)\n{const vec4 bit_shift=vec4(1.0/(255.0*255.0*255.0),1.0/(255.0*255.0),1.0/255.0,1.0);return dot(color,bit_shift);}\n#endif\nfloat computeFallOff(float value,vec2 clipSpace,float frustumEdgeFalloff)\n{float mask=smoothstep(1.0-frustumEdgeFalloff,1.00000012,clamp(dot(clipSpace,clipSpace),0.,1.));return mix(value,1.0,mask);}\n#define inline\nfloat computeShadowCube(vec3 worldPos,vec3 lightPosition,samplerCube shadowSampler,float darkness,vec2 depthValues)\n{vec3 directionToLight=worldPos-lightPosition;float depth=length(directionToLight);depth=(depth+depthValues.x)/(depthValues.y);depth=clamp(depth,0.,1.0);directionToLight=normalize(directionToLight);directionToLight.y=-directionToLight.y;\n#ifndef SHADOWFLOAT\nfloat shadow=unpack(textureCube(shadowSampler,directionToLight));\n#else\nfloat shadow=textureCube(shadowSampler,directionToLight).x;\n#endif\nreturn depth>shadow ? darkness : 1.0;}\n#define inline\nfloat computeShadowWithPoissonSamplingCube(vec3 worldPos,vec3 lightPosition,samplerCube shadowSampler,float mapSize,float darkness,vec2 depthValues)\n{vec3 directionToLight=worldPos-lightPosition;float depth=length(directionToLight);depth=(depth+depthValues.x)/(depthValues.y);depth=clamp(depth,0.,1.0);directionToLight=normalize(directionToLight);directionToLight.y=-directionToLight.y;float visibility=1.;vec3 poissonDisk[4];poissonDisk[0]=vec3(-1.0,1.0,-1.0);poissonDisk[1]=vec3(1.0,-1.0,-1.0);poissonDisk[2]=vec3(-1.0,-1.0,-1.0);poissonDisk[3]=vec3(1.0,-1.0,1.0);\n#ifndef SHADOWFLOAT\nif (unpack(textureCube(shadowSampler,directionToLight+poissonDisk[0]*mapSize))shadow ? computeFallOff(darkness,clipSpace.xy,frustumEdgeFalloff) : 1.;}\n#endif\n#define inline\nfloat computeShadow(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0);\n#ifndef SHADOWFLOAT\nfloat shadow=unpack(TEXTUREFUNC(shadowSampler,uv,0.));\n#else\nfloat shadow=TEXTUREFUNC(shadowSampler,uv,0.).x;\n#endif\nreturn shadowPixelDepth>shadow ? computeFallOff(darkness,clipSpace.xy,frustumEdgeFalloff) : 1.;}}\n#define inline\nfloat computeShadowWithPoissonSampling(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float mapSize,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0);float visibility=1.;vec2 poissonDisk[4];poissonDisk[0]=vec2(-0.94201624,-0.39906216);poissonDisk[1]=vec2(0.94558609,-0.76890725);poissonDisk[2]=vec2(-0.094184101,-0.92938870);poissonDisk[3]=vec2(0.34495938,0.29387760);\n#ifndef SHADOWFLOAT\nif (unpack(TEXTUREFUNC(shadowSampler,uv+poissonDisk[0]*mapSize,0.))1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0);\n#ifndef SHADOWFLOAT\nfloat shadowMapSample=unpack(TEXTUREFUNC(shadowSampler,uv,0.));\n#else\nfloat shadowMapSample=TEXTUREFUNC(shadowSampler,uv,0.).x;\n#endif\nfloat esm=1.0-clamp(exp(min(87.,depthScale*shadowPixelDepth))*shadowMapSample,0.,1.-darkness);return computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);}}\n#define inline\nfloat computeShadowWithCloseESM(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float depthScale,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0); \n#ifndef SHADOWFLOAT\nfloat shadowMapSample=unpack(TEXTUREFUNC(shadowSampler,uv,0.));\n#else\nfloat shadowMapSample=TEXTUREFUNC(shadowSampler,uv,0.).x;\n#endif\nfloat esm=clamp(exp(min(87.,-depthScale*(shadowPixelDepth-shadowMapSample))),darkness,1.);return computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);}}\n#ifdef IS_NDC_HALF_ZRANGE\n#define ZINCLIP clipSpace.z\n#else\n#define ZINCLIP uvDepth.z\n#endif\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\n#define GREATEST_LESS_THAN_ONE 0.99999994\n/* disable_uniformity_analysis */\n#define inline\nfloat computeShadowWithCSMPCF1(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec4 uvDepthLayer=vec4(uvDepth.x,uvDepth.y,layer,uvDepth.z);float shadow=texture2D(shadowSampler,uvDepthLayer);shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}\n#define inline\nfloat computeShadowWithCSMPCF3(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=3.-2.*st;vec2 uvw1=1.+2.*st;vec2 u=vec2((2.-st.x)/uvw0.x-1.,st.x/uvw1.x+1.)*shadowMapSizeAndInverse.y;vec2 v=vec2((2.-st.y)/uvw0.y-1.,st.y/uvw1.y+1.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[0]),layer,uvDepth.z));shadow+=uvw1.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[0]),layer,uvDepth.z));shadow+=uvw0.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[1]),layer,uvDepth.z));shadow+=uvw1.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[1]),layer,uvDepth.z));shadow=shadow/16.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}\n#define inline\nfloat computeShadowWithCSMPCF5(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=4.-3.*st;vec2 uvw1=vec2(7.);vec2 uvw2=1.+3.*st;vec3 u=vec3((3.-2.*st.x)/uvw0.x-2.,(3.+st.x)/uvw1.x,st.x/uvw2.x+2.)*shadowMapSizeAndInverse.y;vec3 v=vec3((3.-2.*st.y)/uvw0.y-2.,(3.+st.y)/uvw1.y,st.y/uvw2.y+2.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[0]),layer,uvDepth.z));shadow+=uvw1.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[0]),layer,uvDepth.z));shadow+=uvw2.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[0]),layer,uvDepth.z));shadow+=uvw0.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[1]),layer,uvDepth.z));shadow+=uvw1.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[1]),layer,uvDepth.z));shadow+=uvw2.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[1]),layer,uvDepth.z));shadow+=uvw0.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[2]),layer,uvDepth.z));shadow+=uvw1.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[2]),layer,uvDepth.z));shadow+=uvw2.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[2]),layer,uvDepth.z));shadow=shadow/144.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}\n#define inline\nfloat computeShadowWithPCF1(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,float darkness,float frustumEdgeFalloff)\n{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;float shadow=TEXTUREFUNC(shadowSampler,uvDepth,0.);shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}}\n#define inline\nfloat computeShadowWithPCF3(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=3.-2.*st;vec2 uvw1=1.+2.*st;vec2 u=vec2((2.-st.x)/uvw0.x-1.,st.x/uvw1.x+1.)*shadowMapSizeAndInverse.y;vec2 v=vec2((2.-st.y)/uvw0.y-1.,st.y/uvw1.y+1.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[0]),uvDepth.z),0.);shadow+=uvw1.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[0]),uvDepth.z),0.);shadow+=uvw0.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[1]),uvDepth.z),0.);shadow+=uvw1.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[1]),uvDepth.z),0.);shadow=shadow/16.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}}\n#define inline\nfloat computeShadowWithPCF5(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=4.-3.*st;vec2 uvw1=vec2(7.);vec2 uvw2=1.+3.*st;vec3 u=vec3((3.-2.*st.x)/uvw0.x-2.,(3.+st.x)/uvw1.x,st.x/uvw2.x+2.)*shadowMapSizeAndInverse.y;vec3 v=vec3((3.-2.*st.y)/uvw0.y-2.,(3.+st.y)/uvw1.y,st.y/uvw2.y+2.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[0]),uvDepth.z),0.);shadow+=uvw1.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[0]),uvDepth.z),0.);shadow+=uvw2.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[0]),uvDepth.z),0.);shadow+=uvw0.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[1]),uvDepth.z),0.);shadow+=uvw1.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[1]),uvDepth.z),0.);shadow+=uvw2.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[1]),uvDepth.z),0.);shadow+=uvw0.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[2]),uvDepth.z),0.);shadow+=uvw1.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[2]),uvDepth.z),0.);shadow+=uvw2.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[2]),uvDepth.z),0.);shadow=shadow/144.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}}\nconst vec3 PoissonSamplers32[64]=vec3[64](\nvec3(0.06407013,0.05409927,0.),\nvec3(0.7366577,0.5789394,0.),\nvec3(-0.6270542,-0.5320278,0.),\nvec3(-0.4096107,0.8411095,0.),\nvec3(0.6849564,-0.4990818,0.),\nvec3(-0.874181,-0.04579735,0.),\nvec3(0.9989998,0.0009880066,0.),\nvec3(-0.004920578,-0.9151649,0.),\nvec3(0.1805763,0.9747483,0.),\nvec3(-0.2138451,0.2635818,0.),\nvec3(0.109845,0.3884785,0.),\nvec3(0.06876755,-0.3581074,0.),\nvec3(0.374073,-0.7661266,0.),\nvec3(0.3079132,-0.1216763,0.),\nvec3(-0.3794335,-0.8271583,0.),\nvec3(-0.203878,-0.07715034,0.),\nvec3(0.5912697,0.1469799,0.),\nvec3(-0.88069,0.3031784,0.),\nvec3(0.5040108,0.8283722,0.),\nvec3(-0.5844124,0.5494877,0.),\nvec3(0.6017799,-0.1726654,0.),\nvec3(-0.5554981,0.1559997,0.),\nvec3(-0.3016369,-0.3900928,0.),\nvec3(-0.5550632,-0.1723762,0.),\nvec3(0.925029,0.2995041,0.),\nvec3(-0.2473137,0.5538505,0.),\nvec3(0.9183037,-0.2862392,0.),\nvec3(0.2469421,0.6718712,0.),\nvec3(0.3916397,-0.4328209,0.),\nvec3(-0.03576927,-0.6220032,0.),\nvec3(-0.04661255,0.7995201,0.),\nvec3(0.4402924,0.3640312,0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.)\n);const vec3 PoissonSamplers64[64]=vec3[64](\nvec3(-0.613392,0.617481,0.),\nvec3(0.170019,-0.040254,0.),\nvec3(-0.299417,0.791925,0.),\nvec3(0.645680,0.493210,0.),\nvec3(-0.651784,0.717887,0.),\nvec3(0.421003,0.027070,0.),\nvec3(-0.817194,-0.271096,0.),\nvec3(-0.705374,-0.668203,0.),\nvec3(0.977050,-0.108615,0.),\nvec3(0.063326,0.142369,0.),\nvec3(0.203528,0.214331,0.),\nvec3(-0.667531,0.326090,0.),\nvec3(-0.098422,-0.295755,0.),\nvec3(-0.885922,0.215369,0.),\nvec3(0.566637,0.605213,0.),\nvec3(0.039766,-0.396100,0.),\nvec3(0.751946,0.453352,0.),\nvec3(0.078707,-0.715323,0.),\nvec3(-0.075838,-0.529344,0.),\nvec3(0.724479,-0.580798,0.),\nvec3(0.222999,-0.215125,0.),\nvec3(-0.467574,-0.405438,0.),\nvec3(-0.248268,-0.814753,0.),\nvec3(0.354411,-0.887570,0.),\nvec3(0.175817,0.382366,0.),\nvec3(0.487472,-0.063082,0.),\nvec3(-0.084078,0.898312,0.),\nvec3(0.488876,-0.783441,0.),\nvec3(0.470016,0.217933,0.),\nvec3(-0.696890,-0.549791,0.),\nvec3(-0.149693,0.605762,0.),\nvec3(0.034211,0.979980,0.),\nvec3(0.503098,-0.308878,0.),\nvec3(-0.016205,-0.872921,0.),\nvec3(0.385784,-0.393902,0.),\nvec3(-0.146886,-0.859249,0.),\nvec3(0.643361,0.164098,0.),\nvec3(0.634388,-0.049471,0.),\nvec3(-0.688894,0.007843,0.),\nvec3(0.464034,-0.188818,0.),\nvec3(-0.440840,0.137486,0.),\nvec3(0.364483,0.511704,0.),\nvec3(0.034028,0.325968,0.),\nvec3(0.099094,-0.308023,0.),\nvec3(0.693960,-0.366253,0.),\nvec3(0.678884,-0.204688,0.),\nvec3(0.001801,0.780328,0.),\nvec3(0.145177,-0.898984,0.),\nvec3(0.062655,-0.611866,0.),\nvec3(0.315226,-0.604297,0.),\nvec3(-0.780145,0.486251,0.),\nvec3(-0.371868,0.882138,0.),\nvec3(0.200476,0.494430,0.),\nvec3(-0.494552,-0.711051,0.),\nvec3(0.612476,0.705252,0.),\nvec3(-0.578845,-0.768792,0.),\nvec3(-0.772454,-0.090976,0.),\nvec3(0.504440,0.372295,0.),\nvec3(0.155736,0.065157,0.),\nvec3(0.391522,0.849605,0.),\nvec3(-0.620106,-0.328104,0.),\nvec3(0.789239,-0.419965,0.),\nvec3(-0.545396,0.538133,0.),\nvec3(-0.178564,-0.596057,0.)\n);\n#define inline\nfloat computeShadowWithCSMPCSS(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArray depthSampler,highp sampler2DArrayShadow shadowSampler,float shadowMapSizeInverse,float lightSizeUV,float darkness,float frustumEdgeFalloff,int searchTapCount,int pcfTapCount,vec3[64] poissonSamplers,vec2 lightSizeUVCorrection,float depthCorrection,float penumbraDarkness)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec4 uvDepthLayer=vec4(uvDepth.x,uvDepth.y,layer,uvDepth.z);float blockerDepth=0.0;float sumBlockerDepth=0.0;float numBlocker=0.0;for (int i=0; i1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;float blockerDepth=0.0;float sumBlockerDepth=0.0;float numBlocker=0.0;for (int i=0; i(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_SAMPLERNAME_,bump)\n#endif\n#if defined(DETAIL)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_SAMPLERNAME_,detail)\n#endif\n#if defined(BUMP) && defined(PARALLAX)\nconst float minSamples=4.;const float maxSamples=15.;const int iMaxSamples=15;vec2 parallaxOcclusion(vec3 vViewDirCoT,vec3 vNormalCoT,vec2 texCoord,float parallaxScale) {float parallaxLimit=length(vViewDirCoT.xy)/vViewDirCoT.z;parallaxLimit*=parallaxScale;vec2 vOffsetDir=normalize(vViewDirCoT.xy);vec2 vMaxOffset=vOffsetDir*parallaxLimit;float numSamples=maxSamples+(dot(vViewDirCoT,vNormalCoT)*(minSamples-maxSamples));float stepSize=1.0/numSamples;float currRayHeight=1.0;vec2 vCurrOffset=vec2(0,0);vec2 vLastOffset=vec2(0,0);float lastSampledHeight=1.0;float currSampledHeight=1.0;bool keepWorking=true;for (int i=0; icurrRayHeight)\n{float delta1=currSampledHeight-currRayHeight;float delta2=(currRayHeight+stepSize)-lastSampledHeight;float ratio=delta1/(delta1+delta2);vCurrOffset=(ratio)* vLastOffset+(1.0-ratio)*vCurrOffset;keepWorking=false;}\nelse\n{currRayHeight-=stepSize;vLastOffset=vCurrOffset;\n#ifdef PARALLAX_RHS\nvCurrOffset-=stepSize*vMaxOffset;\n#else\nvCurrOffset+=stepSize*vMaxOffset;\n#endif\nlastSampledHeight=currSampledHeight;}}\nreturn vCurrOffset;}\nvec2 parallaxOffset(vec3 viewDir,float heightScale)\n{float height=texture2D(bumpSampler,vBumpUV).w;vec2 texCoordOffset=heightScale*viewDir.xy*height;\n#ifdef PARALLAX_RHS\nreturn texCoordOffset;\n#else\nreturn -texCoordOffset;\n#endif\n}\n#endif\n`;\nY.IncludesShadersStore[WA] = GA;\nconst XA = \"logDepthDeclaration\", HA = `#ifdef LOGARITHMICDEPTH\nuniform float logarithmicDepthConstant;varying float vFragmentDepth;\n#endif\n`;\nY.IncludesShadersStore[XA] = HA;\nconst KA = \"bumpFragment\", qA = `vec2 uvOffset=vec2(0.0,0.0);\n#if defined(BUMP) || defined(PARALLAX) || defined(DETAIL)\n#ifdef NORMALXYSCALE\nfloat normalScale=1.0;\n#elif defined(BUMP)\nfloat normalScale=vBumpInfos.y;\n#else\nfloat normalScale=1.0;\n#endif\n#if defined(TANGENT) && defined(NORMAL)\nmat3 TBN=vTBN;\n#elif defined(BUMP)\nvec2 TBNUV=gl_FrontFacing ? vBumpUV : -vBumpUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vTangentSpaceParams);\n#else\nvec2 TBNUV=gl_FrontFacing ? vDetailUV : -vDetailUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vec2(1.,1.));\n#endif\n#elif defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL)\nmat3 TBN=vTBN;\n#else\nvec2 TBNUV=gl_FrontFacing ? vMainUV1 : -vMainUV1;mat3 TBN=cotangent_frame(normalW,vPositionW,TBNUV,vec2(1.,1.));\n#endif\n#endif\n#ifdef PARALLAX\nmat3 invTBN=transposeMat3(TBN);\n#ifdef PARALLAXOCCLUSION\nuvOffset=parallaxOcclusion(invTBN*-viewDirectionW,invTBN*normalW,vBumpUV,vBumpInfos.z);\n#else\nuvOffset=parallaxOffset(invTBN*viewDirectionW,vBumpInfos.z);\n#endif\n#endif\n#ifdef DETAIL\nvec4 detailColor=texture2D(detailSampler,vDetailUV+uvOffset);vec2 detailNormalRG=detailColor.wy*2.0-1.0;float detailNormalB=sqrt(1.-saturate(dot(detailNormalRG,detailNormalRG)));vec3 detailNormal=vec3(detailNormalRG,detailNormalB);\n#endif\n#ifdef BUMP\n#ifdef OBJECTSPACE_NORMALMAP\n#define CUSTOM_FRAGMENT_BUMP_FRAGMENT\nnormalW=normalize(texture2D(bumpSampler,vBumpUV).xyz *2.0-1.0);normalW=normalize(mat3(normalMatrix)*normalW);\n#elif !defined(DETAIL)\nnormalW=perturbNormal(TBN,texture2D(bumpSampler,vBumpUV+uvOffset).xyz,vBumpInfos.y);\n#else\nvec3 bumpNormal=texture2D(bumpSampler,vBumpUV+uvOffset).xyz*2.0-1.0;\n#if DETAIL_NORMALBLENDMETHOD==0 \ndetailNormal.xy*=vDetailInfos.z;vec3 blendedNormal=normalize(vec3(bumpNormal.xy+detailNormal.xy,bumpNormal.z*detailNormal.z));\n#elif DETAIL_NORMALBLENDMETHOD==1 \ndetailNormal.xy*=vDetailInfos.z;bumpNormal+=vec3(0.0,0.0,1.0);detailNormal*=vec3(-1.0,-1.0,1.0);vec3 blendedNormal=bumpNormal*dot(bumpNormal,detailNormal)/bumpNormal.z-detailNormal;\n#endif\nnormalW=perturbNormalBase(TBN,blendedNormal,vBumpInfos.y);\n#endif\n#elif defined(DETAIL)\ndetailNormal.xy*=vDetailInfos.z;normalW=perturbNormalBase(TBN,detailNormal,vDetailInfos.z);\n#endif\n`;\nY.IncludesShadersStore[KA] = qA;\nconst YA = \"decalFragment\", ZA = `#ifdef DECAL\n#ifdef GAMMADECAL\ndecalColor.rgb=toLinearSpace(decalColor.rgb);\n#endif\n#ifdef DECAL_SMOOTHALPHA\ndecalColor.a*=decalColor.a;\n#endif\nsurfaceAlbedo.rgb=mix(surfaceAlbedo.rgb,decalColor.rgb,decalColor.a);\n#endif\n`;\nY.IncludesShadersStore[YA] = ZA;\nconst jA = \"depthPrePass\", QA = `#ifdef DEPTHPREPASS\ngl_FragColor=vec4(0.,0.,0.,1.0);return;\n#endif\n`;\nY.IncludesShadersStore[jA] = QA;\nconst JA = \"lightFragment\", $A = `#ifdef LIGHT{X}\n#if defined(SHADOWONLY) || defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X}) && defined(LIGHTMAPNOSPECULAR{X})\n#else\n#ifdef PBR\n#ifdef SPOTLIGHT{X}\npreInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(POINTLIGHT{X})\npreInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(HEMILIGHT{X})\npreInfo=computeHemisphericPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(DIRLIGHT{X})\npreInfo=computeDirectionalPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#endif\npreInfo.NdotV=NdotV;\n#ifdef SPOTLIGHT{X}\n#ifdef LIGHT_FALLOFF_GLTF{X}\npreInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff_GLTF(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);\n#elif defined(LIGHT_FALLOFF_PHYSICAL{X})\npreInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);preInfo.attenuation*=computeDirectionalLightFalloff_Physical(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w);\n#elif defined(LIGHT_FALLOFF_STANDARD{X})\npreInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);preInfo.attenuation*=computeDirectionalLightFalloff_Standard(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w);\n#else\npreInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);\n#endif\n#elif defined(POINTLIGHT{X})\n#ifdef LIGHT_FALLOFF_GLTF{X}\npreInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);\n#elif defined(LIGHT_FALLOFF_PHYSICAL{X})\npreInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);\n#elif defined(LIGHT_FALLOFF_STANDARD{X})\npreInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);\n#else\npreInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);\n#endif\n#else\npreInfo.attenuation=1.0;\n#endif\n#ifdef HEMILIGHT{X}\npreInfo.roughness=roughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(roughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\n#ifdef IRIDESCENCE\npreInfo.iridescenceIntensity=iridescenceIntensity;\n#endif\n#ifdef HEMILIGHT{X}\ninfo.diffuse=computeHemisphericDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb,light{X}.vLightGround);\n#elif defined(SS_TRANSLUCENCY)\ninfo.diffuse=computeDiffuseAndTransmittedLighting(preInfo,light{X}.vLightDiffuse.rgb,subSurfaceOut.transmittance);\n#else\ninfo.diffuse=computeDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb);\n#endif\n#ifdef SPECULARTERM\n#ifdef ANISOTROPIC\ninfo.specular=computeAnisotropicSpecularLighting(preInfo,viewDirectionW,normalW,anisotropicOut.anisotropicTangent,anisotropicOut.anisotropicBitangent,anisotropicOut.anisotropy,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);\n#else\ninfo.specular=computeSpecularLighting(preInfo,normalW,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);\n#endif\n#endif\n#ifdef SHEEN\n#ifdef SHEEN_LINKWITHALBEDO\npreInfo.roughness=sheenOut.sheenIntensity;\n#else\n#ifdef HEMILIGHT{X}\npreInfo.roughness=sheenOut.sheenRoughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(sheenOut.sheenRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\n#endif\ninfo.sheen=computeSheenLighting(preInfo,normalW,sheenOut.sheenColor,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);\n#endif\n#ifdef CLEARCOAT\n#ifdef HEMILIGHT{X}\npreInfo.roughness=clearcoatOut.clearCoatRoughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(clearcoatOut.clearCoatRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\ninfo.clearCoat=computeClearCoatLighting(preInfo,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatAARoughnessFactors.x,clearcoatOut.clearCoatIntensity,light{X}.vLightDiffuse.rgb);\n#ifdef CLEARCOAT_TINT\nabsorption=computeClearCoatLightingAbsorption(clearcoatOut.clearCoatNdotVRefract,preInfo.L,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatColor,clearcoatOut.clearCoatThickness,clearcoatOut.clearCoatIntensity);info.diffuse*=absorption;\n#ifdef SPECULARTERM\ninfo.specular*=absorption;\n#endif\n#endif\ninfo.diffuse*=info.clearCoat.w;\n#ifdef SPECULARTERM\ninfo.specular*=info.clearCoat.w;\n#endif\n#ifdef SHEEN\ninfo.sheen*=info.clearCoat.w;\n#endif\n#endif\n#else\n#ifdef SPOTLIGHT{X}\ninfo=computeSpotLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDirection,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness);\n#elif defined(HEMILIGHT{X})\ninfo=computeHemisphericLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightGround,glossiness);\n#elif defined(POINTLIGHT{X}) || defined(DIRLIGHT{X})\ninfo=computeLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness);\n#endif\n#endif\n#ifdef PROJECTEDLIGHTTEXTURE{X}\ninfo.diffuse*=computeProjectionTextureDiffuseLighting(projectionLightSampler{X},textureProjectionMatrix{X});\n#endif\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nfor (int i=0; i=0.) {index{X}=i;break;}}\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nif (index{X}>=0)\n#endif\n{\n#if defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#else\nshadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#endif\n#else\nshadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nshadowDebug{X}=vec3(shadow)*vCascadeColorsMultiplier{X}[index{X}];\n#endif\n#ifndef SHADOWCSMNOBLEND{X}\nfloat frustumLength=frustumLengths{X}[index{X}];float diffRatio=clamp(diff{X}/frustumLength,0.,1.)*cascadeBlendFactor{X};if (index{X}<(SHADOWCSMNUM_CASCADES{X}-1) && diffRatio<1.)\n{index{X}+=1;float nextShadow=0.;\n#if defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nnextShadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nnextShadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nnextShadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nnextShadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#elif defined(SHADOWMEDIUMQUALITY{X})\nnextShadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#else\nnextShadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#endif\n#else\nnextShadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\nshadow=mix(nextShadow,shadow,diffRatio);\n#ifdef SHADOWCSMDEBUG{X}\nshadowDebug{X}=mix(vec3(nextShadow)*vCascadeColorsMultiplier{X}[index{X}],shadowDebug{X},diffRatio);\n#endif\n}\n#endif\n}\n#elif defined(SHADOWCLOSEESM{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithCloseESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);\n#else\nshadow=computeShadowWithCloseESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWESM{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);\n#else\nshadow=computeShadowWithESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPOISSON{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithPoissonSamplingCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.depthValues);\n#else\nshadow=computeShadowWithPoissonSampling(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithPCF1(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithPCF3(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithPCF5(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithPCSS16(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithPCSS32(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithPCSS64(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#else\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.depthValues);\n#else\nshadow=computeShadow(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#endif\n#ifdef SHADOWONLY\n#ifndef SHADOWINUSE\n#define SHADOWINUSE\n#endif\nglobalShadow+=shadow;shadowLightCount+=1.0;\n#endif\n#else\nshadow=1.;\n#endif\naggShadow+=shadow;numLights+=1.0;\n#ifndef SHADOWONLY\n#ifdef CUSTOMUSERLIGHTING\ndiffuseBase+=computeCustomDiffuseLighting(info,diffuseBase,shadow);\n#ifdef SPECULARTERM\nspecularBase+=computeCustomSpecularLighting(info,specularBase,shadow);\n#endif\n#elif defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X})\ndiffuseBase+=lightmapColor.rgb*shadow;\n#ifdef SPECULARTERM\n#ifndef LIGHTMAPNOSPECULAR{X}\nspecularBase+=info.specular*shadow*lightmapColor.rgb;\n#endif\n#endif\n#ifdef CLEARCOAT\n#ifndef LIGHTMAPNOSPECULAR{X}\nclearCoatBase+=info.clearCoat.rgb*shadow*lightmapColor.rgb;\n#endif\n#endif\n#ifdef SHEEN\n#ifndef LIGHTMAPNOSPECULAR{X}\nsheenBase+=info.sheen.rgb*shadow;\n#endif\n#endif\n#else\n#ifdef SHADOWCSMDEBUG{X}\ndiffuseBase+=info.diffuse*shadowDebug{X};\n#else \ndiffuseBase+=info.diffuse*shadow;\n#endif\n#ifdef SPECULARTERM\nspecularBase+=info.specular*shadow;\n#endif\n#ifdef CLEARCOAT\nclearCoatBase+=info.clearCoat.rgb*shadow;\n#endif\n#ifdef SHEEN\nsheenBase+=info.sheen.rgb*shadow;\n#endif\n#endif\n#endif\n#endif\n`;\nY.IncludesShadersStore[JA] = $A;\nconst e1 = \"logDepthFragment\", t1 = `#ifdef LOGARITHMICDEPTH\ngl_FragDepthEXT=log2(vFragmentDepth)*logarithmicDepthConstant*0.5;\n#endif\n`;\nY.IncludesShadersStore[e1] = t1;\nconst i1 = \"oitFragment\", r1 = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY\nfloat fragDepth=gl_FragCoord.z; \n#ifdef ORDER_INDEPENDENT_TRANSPARENCY_16BITS\nuint halfFloat=packHalf2x16(vec2(fragDepth));vec2 full=unpackHalf2x16(halfFloat);fragDepth=full.x;\n#endif\nivec2 fragCoord=ivec2(gl_FragCoord.xy);vec2 lastDepth=texelFetch(oitDepthSampler,fragCoord,0).rg;vec4 lastFrontColor=texelFetch(oitFrontColorSampler,fragCoord,0);depth.rg=vec2(-MAX_DEPTH);frontColor=lastFrontColor;backColor=vec4(0.0);\n#ifdef USE_REVERSE_DEPTHBUFFER\nfloat furthestDepth=-lastDepth.x;float nearestDepth=lastDepth.y;\n#else\nfloat nearestDepth=-lastDepth.x;float furthestDepth=lastDepth.y;\n#endif\nfloat alphaMultiplier=1.0-lastFrontColor.a;\n#ifdef USE_REVERSE_DEPTHBUFFER\nif (fragDepth>nearestDepth || fragDepthfurthestDepth) {\n#endif\nreturn;}\n#ifdef USE_REVERSE_DEPTHBUFFER\nif (fragDepthfurthestDepth) {\n#else\nif (fragDepth>nearestDepth && fragDepth\n#if defined(BUMP) || !defined(NORMAL)\n#extension GL_OES_standard_derivatives : enable\n#endif\n#include[SCENE_MRT_COUNT]\n#include\n#define CUSTOM_FRAGMENT_BEGIN\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#include[1..7]\n#include\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n#include\n#include\n#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse,_SAMPLERNAME_,diffuse)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_SAMPLERNAME_,ambient)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_SAMPLERNAME_,opacity)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_SAMPLERNAME_,emissive)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_SAMPLERNAME_,lightmap)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_SAMPLERNAME_,decal)\n#ifdef REFRACTION\n#ifdef REFRACTIONMAP_3D\nuniform samplerCube refractionCubeSampler;\n#else\nuniform sampler2D refraction2DSampler;\n#endif\n#endif\n#if defined(SPECULARTERM)\n#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular,_SAMPLERNAME_,specular)\n#endif\n#include\n#ifdef REFLECTION\n#ifdef REFLECTIONMAP_3D\nuniform samplerCube reflectionCubeSampler;\n#else\nuniform sampler2D reflection2DSampler;\n#endif\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#else\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#endif\n#include\n#endif\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include\nvec3 viewDirectionW=normalize(vEyePosition.xyz-vPositionW);vec4 baseColor=vec4(1.,1.,1.,1.);vec3 diffuseColor=vDiffuseColor.rgb;float alpha=vDiffuseColor.a;\n#ifdef NORMAL\nvec3 normalW=normalize(vNormalW);\n#else\nvec3 normalW=normalize(-cross(dFdx(vPositionW),dFdy(vPositionW)));\n#endif\n#include\n#ifdef TWOSIDEDLIGHTING\nnormalW=gl_FrontFacing ? normalW : -normalW;\n#endif\n#ifdef DIFFUSE\nbaseColor=texture2D(diffuseSampler,vDiffuseUV+uvOffset);\n#if defined(ALPHATEST) && !defined(ALPHATEST_AFTERALLALPHACOMPUTATIONS)\nif (baseColor.a(surfaceAlbedo,baseColor,GAMMADECAL,_GAMMADECAL_NOTUSED_)\n#endif\n#include\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nbaseColor.rgb*=vColor.rgb;\n#endif\n#ifdef DETAIL\nbaseColor.rgb=baseColor.rgb*2.0*mix(0.5,detailColor.r,vDetailInfos.y);\n#endif\n#if defined(DECAL) && defined(DECAL_AFTER_DETAIL)\nvec4 decalColor=texture2D(decalSampler,vDecalUV+uvOffset);\n#include(surfaceAlbedo,baseColor,GAMMADECAL,_GAMMADECAL_NOTUSED_)\n#endif\n#define CUSTOM_FRAGMENT_UPDATE_DIFFUSE\nvec3 baseAmbientColor=vec3(1.,1.,1.);\n#ifdef AMBIENT\nbaseAmbientColor=texture2D(ambientSampler,vAmbientUV+uvOffset).rgb*vAmbientInfos.y;\n#endif\n#define CUSTOM_FRAGMENT_BEFORE_LIGHTS\n#ifdef SPECULARTERM\nfloat glossiness=vSpecularColor.a;vec3 specularColor=vSpecularColor.rgb;\n#ifdef SPECULAR\nvec4 specularMapColor=texture2D(specularSampler,vSpecularUV+uvOffset);specularColor=specularMapColor.rgb;\n#ifdef GLOSSINESS\nglossiness=glossiness*specularMapColor.a;\n#endif\n#endif\n#else\nfloat glossiness=0.;\n#endif\nvec3 diffuseBase=vec3(0.,0.,0.);lightingInfo info;\n#ifdef SPECULARTERM\nvec3 specularBase=vec3(0.,0.,0.);\n#endif\nfloat shadow=1.;float aggShadow=0.;float numLights=0.;\n#ifdef LIGHTMAP\nvec4 lightmapColor=texture2D(lightmapSampler,vLightmapUV+uvOffset);\n#ifdef RGBDLIGHTMAP\nlightmapColor.rgb=fromRGBD(lightmapColor);\n#endif\nlightmapColor.rgb*=vLightmapInfos.y;\n#endif\n#include[0..maxSimultaneousLights]\naggShadow=aggShadow/numLights;vec4 refractionColor=vec4(0.,0.,0.,1.);\n#ifdef REFRACTION\nvec3 refractionVector=normalize(refract(-viewDirectionW,normalW,vRefractionInfos.y));\n#ifdef REFRACTIONMAP_3D\n#ifdef USE_LOCAL_REFRACTIONMAP_CUBIC\nrefractionVector=parallaxCorrectNormal(vPositionW,refractionVector,vRefractionSize,vRefractionPosition);\n#endif\nrefractionVector.y=refractionVector.y*vRefractionInfos.w;vec4 refractionLookup=textureCube(refractionCubeSampler,refractionVector);if (dot(refractionVector,viewDirectionW)<1.0) {refractionColor=refractionLookup;}\n#else\nvec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*vRefractionInfos.z,1.0)));vec2 refractionCoords=vRefractionUVW.xy/vRefractionUVW.z;refractionCoords.y=1.0-refractionCoords.y;refractionColor=texture2D(refraction2DSampler,refractionCoords);\n#endif\n#ifdef RGBDREFRACTION\nrefractionColor.rgb=fromRGBD(refractionColor);\n#endif\n#ifdef IS_REFRACTION_LINEAR\nrefractionColor.rgb=toGammaSpace(refractionColor.rgb);\n#endif\nrefractionColor.rgb*=vRefractionInfos.x;\n#endif\nvec4 reflectionColor=vec4(0.,0.,0.,1.);\n#ifdef REFLECTION\nvec3 vReflectionUVW=computeReflectionCoords(vec4(vPositionW,1.0),normalW);\n#ifdef REFLECTIONMAP_OPPOSITEZ\nvReflectionUVW.z*=-1.0;\n#endif\n#ifdef REFLECTIONMAP_3D\n#ifdef ROUGHNESS\nfloat bias=vReflectionInfos.y;\n#ifdef SPECULARTERM\n#ifdef SPECULAR\n#ifdef GLOSSINESS\nbias*=(1.0-specularMapColor.a);\n#endif\n#endif\n#endif\nreflectionColor=textureCube(reflectionCubeSampler,vReflectionUVW,bias);\n#else\nreflectionColor=textureCube(reflectionCubeSampler,vReflectionUVW);\n#endif\n#else\nvec2 coords=vReflectionUVW.xy;\n#ifdef REFLECTIONMAP_PROJECTION\ncoords/=vReflectionUVW.z;\n#endif\ncoords.y=1.0-coords.y;reflectionColor=texture2D(reflection2DSampler,coords);\n#endif\n#ifdef RGBDREFLECTION\nreflectionColor.rgb=fromRGBD(reflectionColor);\n#endif\n#ifdef IS_REFLECTION_LINEAR\nreflectionColor.rgb=toGammaSpace(reflectionColor.rgb);\n#endif\nreflectionColor.rgb*=vReflectionInfos.x;\n#ifdef REFLECTIONFRESNEL\nfloat reflectionFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,reflectionRightColor.a,reflectionLeftColor.a);\n#ifdef REFLECTIONFRESNELFROMSPECULAR\n#ifdef SPECULARTERM\nreflectionColor.rgb*=specularColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#else\nreflectionColor.rgb*=reflectionLeftColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#endif\n#else\nreflectionColor.rgb*=reflectionLeftColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#endif\n#endif\n#endif\n#ifdef REFRACTIONFRESNEL\nfloat refractionFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,refractionRightColor.a,refractionLeftColor.a);refractionColor.rgb*=refractionLeftColor.rgb*(1.0-refractionFresnelTerm)+refractionFresnelTerm*refractionRightColor.rgb;\n#endif\n#ifdef OPACITY\nvec4 opacityMap=texture2D(opacitySampler,vOpacityUV+uvOffset);\n#ifdef OPACITYRGB\nopacityMap.rgb=opacityMap.rgb*vec3(0.3,0.59,0.11);alpha*=(opacityMap.x+opacityMap.y+opacityMap.z)* vOpacityInfos.y;\n#else\nalpha*=opacityMap.a*vOpacityInfos.y;\n#endif\n#endif\n#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nalpha*=vColor.a;\n#endif\n#ifdef OPACITYFRESNEL\nfloat opacityFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,opacityParts.z,opacityParts.w);alpha+=opacityParts.x*(1.0-opacityFresnelTerm)+opacityFresnelTerm*opacityParts.y;\n#endif\n#ifdef ALPHATEST\n#ifdef ALPHATEST_AFTERALLALPHACOMPUTATIONS\nif (alpha\n#include\n#ifdef IMAGEPROCESSINGPOSTPROCESS\ncolor.rgb=toLinearSpace(color.rgb);\n#else\n#ifdef IMAGEPROCESSING\ncolor.rgb=toLinearSpace(color.rgb);color=applyImageProcessing(color);\n#endif\n#endif\ncolor.a*=visibility;\n#ifdef PREMULTIPLYALPHA\ncolor.rgb*=color.a;\n#endif\n#define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\n#ifdef PREPASS\nfloat writeGeometryInfo=color.a>0.4 ? 1.0 : 0.0;gl_FragData[0]=color; \n#ifdef PREPASS_POSITION\ngl_FragData[PREPASS_POSITION_INDEX]=vec4(vPositionW,writeGeometryInfo);\n#endif\n#ifdef PREPASS_VELOCITY\nvec2 a=(vCurrentPosition.xy/vCurrentPosition.w)*0.5+0.5;vec2 b=(vPreviousPosition.xy/vPreviousPosition.w)*0.5+0.5;vec2 velocity=abs(a-b);velocity=vec2(pow(velocity.x,1.0/3.0),pow(velocity.y,1.0/3.0))*sign(a-b)*0.5+0.5;gl_FragData[PREPASS_VELOCITY_INDEX]=vec4(velocity,0.0,writeGeometryInfo);\n#endif\n#ifdef PREPASS_IRRADIANCE\ngl_FragData[PREPASS_IRRADIANCE_INDEX]=vec4(0.0,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_DEPTH\ngl_FragData[PREPASS_DEPTH_INDEX]=vec4(vViewPos.z,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_NORMAL\n#ifdef PREPASS_NORMAL_WORLDSPACE\ngl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalW,writeGeometryInfo); \n#else\ngl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalize((view*vec4(normalW,0.0)).rgb),writeGeometryInfo); \n#endif\n#endif\n#ifdef PREPASS_ALBEDO_SQRT\ngl_FragData[PREPASS_ALBEDO_SQRT_INDEX]=vec4(0.0,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_REFLECTIVITY\n#if defined(SPECULARTERM)\n#if defined(SPECULAR)\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(toLinearSpace(specularMapColor))*writeGeometryInfo; \n#else\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(toLinearSpace(specularColor),1.0)*writeGeometryInfo;\n#endif\n#else\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(0.0,0.0,0.0,1.0)*writeGeometryInfo;\n#endif\n#endif\n#endif\n#if !defined(PREPASS) || defined(WEBGL2)\ngl_FragColor=color;\n#endif\n#include\n#if ORDER_INDEPENDENT_TRANSPARENCY\nif (fragDepth==nearestDepth) {frontColor.rgb+=color.rgb*color.a*alphaMultiplier;frontColor.a=1.0-alphaMultiplier*(1.0-color.a);} else {backColor+=color;}\n#endif\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n`;\nY.ShadersStore[s1] = n1;\nconst a1 = \"decalVertexDeclaration\", o1 = `#ifdef DECAL\nuniform vec4 vDecalInfos;uniform mat4 decalMatrix;\n#endif\n`;\nY.IncludesShadersStore[a1] = o1;\nconst l1 = \"defaultVertexDeclaration\", c1 = `uniform mat4 viewProjection;uniform mat4 view;\n#ifdef DIFFUSE\nuniform mat4 diffuseMatrix;uniform vec2 vDiffuseInfos;\n#endif\n#ifdef AMBIENT\nuniform mat4 ambientMatrix;uniform vec2 vAmbientInfos;\n#endif\n#ifdef OPACITY\nuniform mat4 opacityMatrix;uniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;uniform mat4 emissiveMatrix;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;uniform mat4 lightmapMatrix;\n#endif\n#if defined(SPECULAR) && defined(SPECULARTERM)\nuniform vec2 vSpecularInfos;uniform mat4 specularMatrix;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;uniform mat4 bumpMatrix;\n#endif\n#ifdef REFLECTION\nuniform mat4 reflectionMatrix;\n#endif\n#ifdef POINTSIZE\nuniform float pointSize;\n#endif\n#ifdef DETAIL\nuniform vec4 vDetailInfos;uniform mat4 detailMatrix;\n#endif\n#include\n#define ADDITIONAL_VERTEX_DECLARATION\n`;\nY.IncludesShadersStore[l1] = c1;\nconst h1 = \"uvAttributeDeclaration\", u1 = `#ifdef UV{X}\nattribute vec2 uv{X};\n#endif\n`;\nY.IncludesShadersStore[h1] = u1;\nconst f1 = \"prePassVertexDeclaration\", d1 = `#ifdef PREPASS\n#ifdef PREPASS_DEPTH\nvarying vec3 vViewPos;\n#endif\n#ifdef PREPASS_VELOCITY\nuniform mat4 previousViewProjection;varying vec4 vCurrentPosition;varying vec4 vPreviousPosition;\n#endif\n#endif\n`;\nY.IncludesShadersStore[f1] = d1;\nconst p1 = \"samplerVertexDeclaration\", g1 = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0\nvarying vec2 v_VARYINGNAME_UV;\n#endif\n`;\nY.IncludesShadersStore[p1] = g1;\nconst m1 = \"bumpVertexDeclaration\", _1 = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL) \nvarying mat3 vTBN;\n#endif\n#endif\n`;\nY.IncludesShadersStore[m1] = _1;\nconst E1 = \"lightVxFragmentDeclaration\", v1 = `#ifdef LIGHT{X}\nuniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X};\n#ifdef SPECULARTERM\nuniform vec4 vLightSpecular{X};\n#else\nvec4 vLightSpecular{X}=vec4(0.);\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#elif defined(SHADOWCUBE{X})\n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};uniform mat4 lightMatrix{X};\n#endif\nuniform vec4 shadowsInfo{X};uniform vec2 depthValues{X};\n#endif\n#ifdef SPOTLIGHT{X}\nuniform vec4 vLightDirection{X};uniform vec4 vLightFalloff{X};\n#elif defined(POINTLIGHT{X})\nuniform vec4 vLightFalloff{X};\n#elif defined(HEMILIGHT{X})\nuniform vec3 vLightGround{X};\n#endif\n#endif\n`;\nY.IncludesShadersStore[E1] = v1;\nconst T1 = \"lightVxUboDeclaration\", x1 = `#ifdef LIGHT{X}\nuniform Light{X}\n{vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular;\n#ifdef SPOTLIGHT{X}\nvec4 vLightDirection;vec4 vLightFalloff;\n#elif defined(POINTLIGHT{X})\nvec4 vLightFalloff;\n#elif defined(HEMILIGHT{X})\nvec3 vLightGround;\n#endif\nvec4 shadowsInfo;vec2 depthValues;} light{X};\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#elif defined(SHADOWCUBE{X})\n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};uniform mat4 lightMatrix{X};\n#endif\n#endif\n#endif\n`;\nY.IncludesShadersStore[T1] = x1;\nconst C1 = \"prePassVertex\", R1 = `#ifdef PREPASS_DEPTH\nvViewPos=(view*worldPos).rgb;\n#endif\n#if defined(PREPASS_VELOCITY) && defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*worldPos;\n#if NUM_BONE_INFLUENCERS>0\nmat4 previousInfluence;previousInfluence=mPreviousBones[int(matricesIndices[0])]*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\npreviousInfluence+=mPreviousBones[int(matricesIndices[1])]*matricesWeights[1];\n#endif \n#if NUM_BONE_INFLUENCERS>2\npreviousInfluence+=mPreviousBones[int(matricesIndices[2])]*matricesWeights[2];\n#endif \n#if NUM_BONE_INFLUENCERS>3\npreviousInfluence+=mPreviousBones[int(matricesIndices[3])]*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[0])]*matricesWeightsExtra[0];\n#endif \n#if NUM_BONE_INFLUENCERS>5\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[1])]*matricesWeightsExtra[1];\n#endif \n#if NUM_BONE_INFLUENCERS>6\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[2])]*matricesWeightsExtra[2];\n#endif \n#if NUM_BONE_INFLUENCERS>7\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[3])]*matricesWeightsExtra[3];\n#endif\nvPreviousPosition=previousViewProjection*finalPreviousWorld*previousInfluence*vec4(positionUpdated,1.0);\n#else\nvPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\n#endif\n#endif\n`;\nY.IncludesShadersStore[C1] = R1;\nconst S1 = \"uvVariableDeclaration\", y1 = `#if !defined(UV{X}) && defined(MAINUV{X})\nvec2 uv{X}=vec2(0.,0.);\n#endif\n#ifdef MAINUV{X}\nvMainUV{X}=uv{X};\n#endif\n`;\nY.IncludesShadersStore[S1] = y1;\nconst I1 = \"samplerVertexImplementation\", b1 = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0\nif (v_INFONAME_==0.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uvUpdated,1.0,0.0));}\n#ifdef UV2\nelse if (v_INFONAME_==1.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv2,1.0,0.0));}\n#endif\n#ifdef UV3\nelse if (v_INFONAME_==2.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv3,1.0,0.0));}\n#endif\n#ifdef UV4\nelse if (v_INFONAME_==3.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv4,1.0,0.0));}\n#endif\n#ifdef UV5\nelse if (v_INFONAME_==4.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv5,1.0,0.0));}\n#endif\n#ifdef UV6\nelse if (v_INFONAME_==5.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv6,1.0,0.0));}\n#endif\n#endif\n`;\nY.IncludesShadersStore[I1] = b1;\nconst A1 = \"bumpVertex\", M1 = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL)\nvec3 tbnNormal=normalize(normalUpdated);vec3 tbnTangent=normalize(tangentUpdated.xyz);vec3 tbnBitangent=cross(tbnNormal,tbnTangent)*tangentUpdated.w;vTBN=mat3(finalWorld)*mat3(tbnTangent,tbnBitangent,tbnNormal);\n#endif\n#endif\n`;\nY.IncludesShadersStore[A1] = M1;\nconst P1 = \"shadowsVertex\", O1 = `#ifdef SHADOWS\n#if defined(SHADOWCSM{X})\nvPositionFromCamera{X}=view*worldPos;for (int i=0; i\n#define CUSTOM_VERTEX_BEGIN\nattribute vec3 position;\n#ifdef NORMAL\nattribute vec3 normal;\n#endif\n#ifdef TANGENT\nattribute vec4 tangent;\n#endif\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#include[2..7]\n#ifdef VERTEXCOLOR\nattribute vec4 color;\n#endif\n#include\n#include\n#include\n#include\n#include\n#include[1..7]\n#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap)\n#if defined(SPECULARTERM)\n#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular)\n#endif\n#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal)\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#include\n#include\n#include\n#include<__decl__lightVxFragment>[0..maxSimultaneousLights]\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#include\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvec3 positionUpdated=position;\n#ifdef NORMAL\nvec3 normalUpdated=normal;\n#endif\n#ifdef TANGENT\nvec4 tangentUpdated=tangent;\n#endif\n#ifdef UV1\nvec2 uvUpdated=uv;\n#endif\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvPositionUVW=positionUpdated;\n#endif\n#define CUSTOM_VERTEX_UPDATE_POSITION\n#define CUSTOM_VERTEX_UPDATE_NORMAL\n#include\n#if defined(PREPASS) && defined(PREPASS_VELOCITY) && !defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*finalWorld*vec4(positionUpdated,1.0);vPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\n#endif\n#include\n#include\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\n#ifdef NORMAL\nmat3 normalWorld=mat3(finalWorld);\n#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvNormalW=normalUpdated/vec3(dot(normalWorld[0],normalWorld[0]),dot(normalWorld[1],normalWorld[1]),dot(normalWorld[2],normalWorld[2]));vNormalW=normalize(normalWorld*vNormalW);\n#else\n#ifdef NONUNIFORMSCALING\nnormalWorld=transposeMat3(inverseMat3(normalWorld));\n#endif\nvNormalW=normalize(normalWorld*normalUpdated);\n#endif\n#endif\n#define CUSTOM_VERTEX_UPDATE_WORLDPOS\n#ifdef MULTIVIEW\nif (gl_ViewID_OVR==0u) {gl_Position=viewProjection*worldPos;} else {gl_Position=viewProjectionR*worldPos;}\n#else\ngl_Position=viewProjection*worldPos;\n#endif\nvPositionW=vec3(worldPos);\n#include\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0)));\n#endif\n#ifndef UV1\nvec2 uvUpdated=vec2(0.,0.);\n#endif\n#ifdef MAINUV1\nvMainUV1=uvUpdated;\n#endif\n#include[2..7]\n#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse,_MATRIXNAME_,diffuse,_INFONAME_,DiffuseInfos.x)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_MATRIXNAME_,emissive,_INFONAME_,EmissiveInfos.x)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_MATRIXNAME_,lightmap,_INFONAME_,LightmapInfos.x)\n#if defined(SPECULARTERM)\n#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular,_MATRIXNAME_,specular,_INFONAME_,SpecularInfos.x)\n#endif\n#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_MATRIXNAME_,bump,_INFONAME_,BumpInfos.x)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_MATRIXNAME_,decal,_INFONAME_,DecalInfos.x)\n#include\n#include\n#include\n#include[0..maxSimultaneousLights]\n#include\n#include\n#include\n#define CUSTOM_VERTEX_MAIN_END\n}\n`;\nY.ShadersStore[w1] = U1;\nconst V1 = new RegExp(\"^([gimus]+)!\");\nclass rn {\n /**\n * Creates a new instance of the plugin manager\n * @param material material that this manager will manage the plugins for\n */\n constructor(e) {\n this._plugins = [], this._activePlugins = [], this._activePluginsForExtraEvents = [], this._material = e, this._scene = e.getScene(), this._engine = this._scene.getEngine();\n }\n /**\n * @internal\n */\n _addPlugin(e) {\n for (let r = 0; r < this._plugins.length; ++r)\n if (this._plugins[r].name === e.name)\n return !1;\n if (this._material._uniformBufferLayoutBuilt)\n throw `The plugin \"${e.name}\" can't be added to the material \"${this._material.name}\" because this material has already been used for rendering! Please add plugins to materials before any rendering with this material occurs.`;\n const t = e.getClassName();\n rn._MaterialPluginClassToMainDefine[t] || (rn._MaterialPluginClassToMainDefine[t] = \"MATERIALPLUGIN_\" + ++rn._MaterialPluginCounter), this._material._callbackPluginEventGeneric = (r, s) => this._handlePluginEvent(r, s), this._plugins.push(e), this._plugins.sort((r, s) => r.priority - s.priority), this._codeInjectionPoints = {};\n const i = {};\n i[rn._MaterialPluginClassToMainDefine[t]] = {\n type: \"boolean\",\n default: !0\n };\n for (const r of this._plugins)\n r.collectDefines(i), this._collectPointNames(\"vertex\", r.getCustomCode(\"vertex\")), this._collectPointNames(\"fragment\", r.getCustomCode(\"fragment\"));\n return this._defineNamesFromPlugins = i, !0;\n }\n /**\n * @internal\n */\n _activatePlugin(e) {\n this._activePlugins.indexOf(e) === -1 && (this._activePlugins.push(e), this._activePlugins.sort((t, i) => t.priority - i.priority), this._material._callbackPluginEventIsReadyForSubMesh = this._handlePluginEventIsReadyForSubMesh.bind(this), this._material._callbackPluginEventPrepareDefinesBeforeAttributes = this._handlePluginEventPrepareDefinesBeforeAttributes.bind(this), this._material._callbackPluginEventPrepareDefines = this._handlePluginEventPrepareDefines.bind(this), this._material._callbackPluginEventBindForSubMesh = this._handlePluginEventBindForSubMesh.bind(this), e.registerForExtraEvents && (this._activePluginsForExtraEvents.push(e), this._activePluginsForExtraEvents.sort((t, i) => t.priority - i.priority), this._material._callbackPluginEventHasRenderTargetTextures = this._handlePluginEventHasRenderTargetTextures.bind(this), this._material._callbackPluginEventFillRenderTargetTextures = this._handlePluginEventFillRenderTargetTextures.bind(this), this._material._callbackPluginEventHardBindForSubMesh = this._handlePluginEventHardBindForSubMesh.bind(this)));\n }\n /**\n * Gets a plugin from the list of plugins managed by this manager\n * @param name name of the plugin\n * @returns the plugin if found, else null\n */\n getPlugin(e) {\n for (let t = 0; t < this._plugins.length; ++t)\n if (this._plugins[t].name === e)\n return this._plugins[t];\n return null;\n }\n _handlePluginEventIsReadyForSubMesh(e) {\n let t = !0;\n for (const i of this._activePlugins)\n t = t && i.isReadyForSubMesh(e.defines, this._scene, this._engine, e.subMesh);\n e.isReadyForSubMesh = t;\n }\n _handlePluginEventPrepareDefinesBeforeAttributes(e) {\n for (const t of this._activePlugins)\n t.prepareDefinesBeforeAttributes(e.defines, this._scene, e.mesh);\n }\n _handlePluginEventPrepareDefines(e) {\n for (const t of this._activePlugins)\n t.prepareDefines(e.defines, this._scene, e.mesh);\n }\n _handlePluginEventHardBindForSubMesh(e) {\n for (const t of this._activePluginsForExtraEvents)\n t.hardBindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, e.subMesh);\n }\n _handlePluginEventBindForSubMesh(e) {\n for (const t of this._activePlugins)\n t.bindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, e.subMesh);\n }\n _handlePluginEventHasRenderTargetTextures(e) {\n let t = !1;\n for (const i of this._activePluginsForExtraEvents)\n if (t = i.hasRenderTargetTextures(), t)\n break;\n e.hasRenderTargetTextures = t;\n }\n _handlePluginEventFillRenderTargetTextures(e) {\n for (const t of this._activePluginsForExtraEvents)\n t.fillRenderTargetTextures(e.renderTargets);\n }\n _handlePluginEvent(e, t) {\n switch (e) {\n case Ri.GetActiveTextures: {\n const i = t;\n for (const r of this._activePlugins)\n r.getActiveTextures(i.activeTextures);\n break;\n }\n case Ri.GetAnimatables: {\n const i = t;\n for (const r of this._activePlugins)\n r.getAnimatables(i.animatables);\n break;\n }\n case Ri.HasTexture: {\n const i = t;\n let r = !1;\n for (const s of this._activePlugins)\n if (r = s.hasTexture(i.texture), r)\n break;\n i.hasTexture = r;\n break;\n }\n case Ri.Disposed: {\n const i = t;\n for (const r of this._plugins)\n r.dispose(i.forceDisposeTextures);\n break;\n }\n case Ri.GetDefineNames: {\n const i = t;\n i.defineNames = this._defineNamesFromPlugins;\n break;\n }\n case Ri.PrepareEffect: {\n const i = t;\n for (const r of this._activePlugins)\n i.fallbackRank = r.addFallbacks(i.defines, i.fallbacks, i.fallbackRank), r.getAttributes(i.attributes, this._scene, i.mesh);\n this._uniformList.length > 0 && i.uniforms.push(...this._uniformList), this._samplerList.length > 0 && i.samplers.push(...this._samplerList), this._uboList.length > 0 && i.uniformBuffersNames.push(...this._uboList), i.customCode = this._injectCustomCode(i, i.customCode);\n break;\n }\n case Ri.PrepareUniformBuffer: {\n const i = t;\n this._uboDeclaration = \"\", this._vertexDeclaration = \"\", this._fragmentDeclaration = \"\", this._uniformList = [], this._samplerList = [], this._uboList = [];\n for (const r of this._plugins) {\n const s = r.getUniforms();\n if (s) {\n if (s.ubo)\n for (const a of s.ubo) {\n if (a.size && a.type) {\n const o = a.arraySize ?? 0;\n i.ubo.addUniform(a.name, a.size, o), this._uboDeclaration += `${a.type} ${a.name}${o > 0 ? `[${o}]` : \"\"};\n`;\n }\n this._uniformList.push(a.name);\n }\n s.vertex && (this._vertexDeclaration += s.vertex + `\n`), s.fragment && (this._fragmentDeclaration += s.fragment + `\n`);\n }\n r.getSamplers(this._samplerList), r.getUniformBuffersNames(this._uboList);\n }\n break;\n }\n }\n }\n _collectPointNames(e, t) {\n if (t)\n for (const i in t)\n this._codeInjectionPoints[e] || (this._codeInjectionPoints[e] = {}), this._codeInjectionPoints[e][i] = !0;\n }\n _injectCustomCode(e, t) {\n return (i, r) => {\n var o, l;\n t && (r = t(i, r)), this._uboDeclaration && (r = r.replace(\"#define ADDITIONAL_UBO_DECLARATION\", this._uboDeclaration)), this._vertexDeclaration && (r = r.replace(\"#define ADDITIONAL_VERTEX_DECLARATION\", this._vertexDeclaration)), this._fragmentDeclaration && (r = r.replace(\"#define ADDITIONAL_FRAGMENT_DECLARATION\", this._fragmentDeclaration));\n const s = (o = this._codeInjectionPoints) == null ? void 0 : o[i];\n if (!s)\n return r;\n let a = null;\n for (let c in s) {\n let h = \"\";\n for (const u of this._activePlugins) {\n let f = (l = u.getCustomCode(i)) == null ? void 0 : l[c];\n if (f) {\n if (u.resolveIncludes) {\n if (a === null) {\n const d = _i.GLSL;\n a = {\n defines: [],\n indexParameters: e.indexParameters,\n isFragment: !1,\n shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader,\n processor: void 0,\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\n shadersRepository: Y.GetShadersRepository(d),\n includesShadersStore: Y.GetIncludesShadersStore(d),\n version: void 0,\n platformName: this._engine.shaderPlatformName,\n processingContext: void 0,\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\n processCodeAfterIncludes: void 0\n // not used by _ProcessIncludes\n };\n }\n a.isFragment = i === \"fragment\", hs._ProcessIncludes(f, a, (d) => f = d);\n }\n h += f + `\n`;\n }\n }\n if (h.length > 0)\n if (c.charAt(0) === \"!\") {\n c = c.substring(1);\n let u = \"g\";\n if (c.charAt(0) === \"!\")\n u = \"\", c = c.substring(1);\n else {\n const g = V1.exec(c);\n g && g.length >= 2 && (u = g[1], c = c.substring(u.length + 1));\n }\n u.indexOf(\"g\") < 0 && (u += \"g\");\n const f = r, d = new RegExp(c, u);\n let p = d.exec(f);\n for (; p !== null; ) {\n let g = h;\n for (let m = 0; m < p.length; ++m)\n g = g.replace(\"$\" + m, p[m]);\n r = r.replace(p[0], g), p = d.exec(f);\n }\n } else {\n const u = \"#define \" + c;\n r = r.replace(u, `\n` + h + `\n` + u);\n }\n }\n return r;\n };\n }\n}\nrn._MaterialPluginClassToMainDefine = {};\nrn._MaterialPluginCounter = 0;\nst.OnEnginesDisposedObservable.add(() => {\n k1();\n});\nconst B1 = [];\nlet dg = null;\nfunction k1() {\n B1.length = 0, ie.OnEventObservable.remove(dg), dg = null;\n}\nclass wr {\n _enable(e) {\n e && this._pluginManager._activatePlugin(this);\n }\n /**\n * Creates a new material plugin\n * @param material parent material of the plugin\n * @param name name of the plugin\n * @param priority priority of the plugin\n * @param defines list of defines used by the plugin. The value of the property is the default value for this property\n * @param addToPluginList true to add the plugin to the list of plugins managed by the material plugin manager of the material (default: true)\n * @param enable true to enable the plugin (it is handy if the plugin does not handle properties to switch its current activation)\n * @param resolveIncludes Indicates that any #include directive in the plugin code must be replaced by the corresponding code (default: false)\n */\n constructor(e, t, i, r, s = !0, a = !1, o = !1) {\n this.priority = 500, this.resolveIncludes = !1, this.registerForExtraEvents = !1, this._material = e, this.name = t, this.priority = i, this.resolveIncludes = o, e.pluginManager || (e.pluginManager = new rn(e), e.onDisposeObservable.add(() => {\n e.pluginManager = void 0;\n })), this._pluginDefineNames = r, this._pluginManager = e.pluginManager, s && this._pluginManager._addPlugin(this), a && this._enable(!0), this.markAllDefinesAsDirty = e._dirtyCallbacks[63];\n }\n /**\n * Gets the current class name useful for serialization or dynamic coding.\n * @returns The class name.\n */\n getClassName() {\n return \"MaterialPluginBase\";\n }\n /**\n * Specifies that the submesh is ready to be used.\n * @param defines the list of \"defines\" to update.\n * @param scene defines the scene the material belongs to.\n * @param engine the engine this scene belongs to.\n * @param subMesh the submesh to check for readiness\n * @returns - boolean indicating that the submesh is ready or not.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isReadyForSubMesh(e, t, i, r) {\n return !0;\n }\n /**\n * Binds the material data (this function is called even if mustRebind() returns false)\n * @param uniformBuffer defines the Uniform buffer to fill in.\n * @param scene defines the scene the material belongs to.\n * @param engine defines the engine the material belongs to.\n * @param subMesh the submesh to bind data for\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n hardBindForSubMesh(e, t, i, r) {\n }\n /**\n * Binds the material data.\n * @param uniformBuffer defines the Uniform buffer to fill in.\n * @param scene defines the scene the material belongs to.\n * @param engine the engine this scene belongs to.\n * @param subMesh the submesh to bind data for\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n bindForSubMesh(e, t, i, r) {\n }\n /**\n * Disposes the resources of the material.\n * @param forceDisposeTextures - Forces the disposal of all textures.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n dispose(e) {\n }\n /**\n * Returns a list of custom shader code fragments to customize the shader.\n * @param shaderType \"vertex\" or \"fragment\"\n * @returns null if no code to be added, or a list of pointName =\\> code.\n * Note that `pointName` can also be a regular expression if it starts with a `!`.\n * In that case, the string found by the regular expression (if any) will be\n * replaced by the code provided.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getCustomCode(e) {\n return null;\n }\n /**\n * Collects all defines.\n * @param defines The object to append to.\n */\n collectDefines(e) {\n if (this._pluginDefineNames)\n for (const t of Object.keys(this._pluginDefineNames)) {\n if (t[0] === \"_\")\n continue;\n const i = typeof this._pluginDefineNames[t];\n e[t] = {\n type: i === \"number\" ? \"number\" : i === \"string\" ? \"string\" : i === \"boolean\" ? \"boolean\" : \"object\",\n default: this._pluginDefineNames[t]\n };\n }\n }\n /**\n * Sets the defines for the next rendering. Called before PrepareDefinesForAttributes is called.\n * @param defines the list of \"defines\" to update.\n * @param scene defines the scene to the material belongs to.\n * @param mesh the mesh being rendered\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n prepareDefinesBeforeAttributes(e, t, i) {\n }\n /**\n * Sets the defines for the next rendering\n * @param defines the list of \"defines\" to update.\n * @param scene defines the scene to the material belongs to.\n * @param mesh the mesh being rendered\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n prepareDefines(e, t, i) {\n }\n /**\n * Checks to see if a texture is used in the material.\n * @param texture - Base texture to use.\n * @returns - Boolean specifying if a texture is used in the material.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n hasTexture(e) {\n return !1;\n }\n /**\n * Gets a boolean indicating that current material needs to register RTT\n * @returns true if this uses a render target otherwise false.\n */\n hasRenderTargetTextures() {\n return !1;\n }\n /**\n * Fills the list of render target textures.\n * @param renderTargets the list of render targets to update\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n fillRenderTargetTextures(e) {\n }\n /**\n * Returns an array of the actively used textures.\n * @param activeTextures Array of BaseTextures\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getActiveTextures(e) {\n }\n /**\n * Returns the animatable textures.\n * @param animatables Array of animatable textures.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getAnimatables(e) {\n }\n /**\n * Add fallbacks to the effect fallbacks list.\n * @param defines defines the Base texture to use.\n * @param fallbacks defines the current fallback list.\n * @param currentRank defines the current fallback rank.\n * @returns the new fallback rank.\n */\n addFallbacks(e, t, i) {\n return i;\n }\n /**\n * Gets the samplers used by the plugin.\n * @param samplers list that the sampler names should be added to.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getSamplers(e) {\n }\n /**\n * Gets the attributes used by the plugin.\n * @param attributes list that the attribute names should be added to.\n * @param scene the scene that the material belongs to.\n * @param mesh the mesh being rendered.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getAttributes(e, t, i) {\n }\n /**\n * Gets the uniform buffers names added by the plugin.\n * @param ubos list that the ubo names should be added to.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getUniformBuffersNames(e) {\n }\n /**\n * Gets the description of the uniforms to add to the ubo (if engine supports ubos) or to inject directly in the vertex/fragment shaders (if engine does not support ubos)\n * @returns the description of the uniforms\n */\n getUniforms() {\n return {};\n }\n /**\n * Makes a duplicate of the current configuration into another one.\n * @param plugin define the config where to copy the info\n */\n copyTo(e) {\n Le.Clone(() => e, this);\n }\n /**\n * Serializes this plugin configuration.\n * @returns - An object with the serialized config.\n */\n serialize() {\n return Le.Serialize(this);\n }\n /**\n * Parses a plugin configuration from a serialized object.\n * @param source - Serialized object.\n * @param scene Defines the scene we are parsing for\n * @param rootUrl Defines the rootUrl to load from\n */\n parse(e, t, i) {\n Le.Parse(() => this, e, t, i);\n }\n}\nP([\n U()\n], wr.prototype, \"name\", void 0);\nP([\n U()\n], wr.prototype, \"priority\", void 0);\nP([\n U()\n], wr.prototype, \"resolveIncludes\", void 0);\nP([\n U()\n], wr.prototype, \"registerForExtraEvents\", void 0);\nclass z1 extends es {\n constructor() {\n super(...arguments), this.DETAIL = !1, this.DETAILDIRECTUV = 0, this.DETAIL_NORMALBLENDMETHOD = 0;\n }\n}\nclass hn extends wr {\n /** @internal */\n _markAllSubMeshesAsTexturesDirty() {\n this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty();\n }\n constructor(e, t = !0) {\n super(e, \"DetailMap\", 140, new z1(), t), this._texture = null, this.diffuseBlendLevel = 1, this.roughnessBlendLevel = 1, this.bumpLevel = 1, this._normalBlendMethod = ie.MATERIAL_NORMALBLENDMETHOD_WHITEOUT, this._isEnabled = !1, this.isEnabled = !1, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1];\n }\n isReadyForSubMesh(e, t, i) {\n return this._isEnabled ? !(e._areTexturesDirty && t.texturesEnabled && i.getCaps().standardDerivatives && this._texture && ae.DetailTextureEnabled && !this._texture.isReady()) : !0;\n }\n prepareDefines(e, t) {\n if (this._isEnabled) {\n e.DETAIL_NORMALBLENDMETHOD = this._normalBlendMethod;\n const i = t.getEngine();\n e._areTexturesDirty && (i.getCaps().standardDerivatives && this._texture && ae.DetailTextureEnabled && this._isEnabled ? (wt(this._texture, e, \"DETAIL\"), e.DETAIL_NORMALBLENDMETHOD = this._normalBlendMethod) : e.DETAIL = !1);\n } else\n e.DETAIL = !1;\n }\n bindForSubMesh(e, t) {\n if (!this._isEnabled)\n return;\n const i = this._material.isFrozen;\n (!e.useUbo || !i || !e.isSync) && this._texture && ae.DetailTextureEnabled && (e.updateFloat4(\"vDetailInfos\", this._texture.coordinatesIndex, this.diffuseBlendLevel, this.bumpLevel, this.roughnessBlendLevel), Mt(this._texture, e, \"detail\")), t.texturesEnabled && this._texture && ae.DetailTextureEnabled && e.setTexture(\"detailSampler\", this._texture);\n }\n hasTexture(e) {\n return this._texture === e;\n }\n getActiveTextures(e) {\n this._texture && e.push(this._texture);\n }\n getAnimatables(e) {\n this._texture && this._texture.animations && this._texture.animations.length > 0 && e.push(this._texture);\n }\n dispose(e) {\n var t;\n e && ((t = this._texture) == null || t.dispose());\n }\n getClassName() {\n return \"DetailMapConfiguration\";\n }\n getSamplers(e) {\n e.push(\"detailSampler\");\n }\n getUniforms() {\n return {\n ubo: [\n { name: \"vDetailInfos\", size: 4, type: \"vec4\" },\n { name: \"detailMatrix\", size: 16, type: \"mat4\" }\n ]\n };\n }\n}\nP([\n Tt(\"detailTexture\"),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], hn.prototype, \"texture\", void 0);\nP([\n U()\n], hn.prototype, \"diffuseBlendLevel\", void 0);\nP([\n U()\n], hn.prototype, \"roughnessBlendLevel\", void 0);\nP([\n U()\n], hn.prototype, \"bumpLevel\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], hn.prototype, \"normalBlendMethod\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], hn.prototype, \"isEnabled\", void 0);\nconst Xh = { effect: null, subMesh: null };\nclass W1 extends es {\n /**\n * Initializes the Standard Material defines.\n * @param externalProperties The external properties\n */\n constructor(e) {\n super(e), this.MAINUV1 = !1, this.MAINUV2 = !1, this.MAINUV3 = !1, this.MAINUV4 = !1, this.MAINUV5 = !1, this.MAINUV6 = !1, this.DIFFUSE = !1, this.DIFFUSEDIRECTUV = 0, this.BAKED_VERTEX_ANIMATION_TEXTURE = !1, this.AMBIENT = !1, this.AMBIENTDIRECTUV = 0, this.OPACITY = !1, this.OPACITYDIRECTUV = 0, this.OPACITYRGB = !1, this.REFLECTION = !1, this.EMISSIVE = !1, this.EMISSIVEDIRECTUV = 0, this.SPECULAR = !1, this.SPECULARDIRECTUV = 0, this.BUMP = !1, this.BUMPDIRECTUV = 0, this.PARALLAX = !1, this.PARALLAX_RHS = !1, this.PARALLAXOCCLUSION = !1, this.SPECULAROVERALPHA = !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.ALPHAFROMDIFFUSE = !1, this.POINTSIZE = !1, this.FOG = !1, this.SPECULARTERM = !1, this.DIFFUSEFRESNEL = !1, this.OPACITYFRESNEL = !1, this.REFLECTIONFRESNEL = !1, this.REFRACTIONFRESNEL = !1, this.EMISSIVEFRESNEL = !1, this.FRESNEL = !1, this.NORMAL = !1, this.TANGENT = !1, this.UV1 = !1, this.UV2 = !1, this.UV3 = !1, this.UV4 = !1, this.UV5 = !1, this.UV6 = !1, this.VERTEXCOLOR = !1, this.VERTEXALPHA = !1, this.NUM_BONE_INFLUENCERS = 0, this.BonesPerMesh = 0, this.BONETEXTURE = !1, this.BONES_VELOCITY_ENABLED = !1, this.INSTANCES = !1, this.THIN_INSTANCES = !1, this.INSTANCESCOLOR = !1, this.GLOSSINESS = !1, this.ROUGHNESS = !1, this.EMISSIVEASILLUMINATION = !1, this.LINKEMISSIVEWITHDIFFUSE = !1, this.REFLECTIONFRESNELFROMSPECULAR = !1, this.LIGHTMAP = !1, this.LIGHTMAPDIRECTUV = 0, this.OBJECTSPACE_NORMALMAP = !1, this.USELIGHTMAPASSHADOWMAP = !1, this.REFLECTIONMAP_3D = !1, this.REFLECTIONMAP_SPHERICAL = !1, this.REFLECTIONMAP_PLANAR = !1, this.REFLECTIONMAP_CUBIC = !1, this.USE_LOCAL_REFLECTIONMAP_CUBIC = !1, this.USE_LOCAL_REFRACTIONMAP_CUBIC = !1, this.REFLECTIONMAP_PROJECTION = !1, this.REFLECTIONMAP_SKYBOX = !1, this.REFLECTIONMAP_EXPLICIT = !1, this.REFLECTIONMAP_EQUIRECTANGULAR = !1, this.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !1, this.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !1, this.REFLECTIONMAP_OPPOSITEZ = !1, this.INVERTCUBICMAP = !1, this.LOGARITHMICDEPTH = !1, this.REFRACTION = !1, this.REFRACTIONMAP_3D = !1, this.REFLECTIONOVERALPHA = !1, this.TWOSIDEDLIGHTING = !1, this.SHADOWFLOAT = !1, this.MORPHTARGETS = !1, this.MORPHTARGETS_NORMAL = !1, this.MORPHTARGETS_TANGENT = !1, this.MORPHTARGETS_UV = !1, this.NUM_MORPH_INFLUENCERS = 0, this.MORPHTARGETS_TEXTURE = !1, this.NONUNIFORMSCALING = !1, this.PREMULTIPLYALPHA = !1, this.ALPHATEST_AFTERALLALPHACOMPUTATIONS = !1, this.ALPHABLEND = !0, this.PREPASS = !1, this.PREPASS_IRRADIANCE = !1, this.PREPASS_IRRADIANCE_INDEX = -1, this.PREPASS_ALBEDO_SQRT = !1, this.PREPASS_ALBEDO_SQRT_INDEX = -1, this.PREPASS_DEPTH = !1, this.PREPASS_DEPTH_INDEX = -1, this.PREPASS_NORMAL = !1, this.PREPASS_NORMAL_INDEX = -1, this.PREPASS_NORMAL_WORLDSPACE = !1, this.PREPASS_POSITION = !1, this.PREPASS_POSITION_INDEX = -1, this.PREPASS_VELOCITY = !1, this.PREPASS_VELOCITY_INDEX = -1, this.PREPASS_REFLECTIVITY = !1, this.PREPASS_REFLECTIVITY_INDEX = -1, this.SCENE_MRT_COUNT = 0, this.RGBDLIGHTMAP = !1, this.RGBDREFLECTION = !1, this.RGBDREFRACTION = !1, this.IMAGEPROCESSING = !1, this.VIGNETTE = !1, this.VIGNETTEBLENDMODEMULTIPLY = !1, this.VIGNETTEBLENDMODEOPAQUE = !1, this.TONEMAPPING = !1, this.TONEMAPPING_ACES = !1, this.CONTRAST = !1, this.COLORCURVES = !1, this.COLORGRADING = !1, this.COLORGRADING3D = !1, this.SAMPLER3DGREENDEPTH = !1, this.SAMPLER3DBGRMAP = !1, this.DITHER = !1, this.IMAGEPROCESSINGPOSTPROCESS = !1, this.SKIPFINALCOLORCLAMP = !1, this.MULTIVIEW = !1, this.ORDER_INDEPENDENT_TRANSPARENCY = !1, this.ORDER_INDEPENDENT_TRANSPARENCY_16BITS = !1, this.CAMERA_ORTHOGRAPHIC = !1, this.CAMERA_PERSPECTIVE = !1, this.IS_REFLECTION_LINEAR = !1, this.IS_REFRACTION_LINEAR = !1, this.EXPOSURE = !1, this.DECAL_AFTER_DETAIL = !1, this.rebuild();\n }\n setReflectionMode(e) {\n const t = [\n \"REFLECTIONMAP_CUBIC\",\n \"REFLECTIONMAP_EXPLICIT\",\n \"REFLECTIONMAP_PLANAR\",\n \"REFLECTIONMAP_PROJECTION\",\n \"REFLECTIONMAP_PROJECTION\",\n \"REFLECTIONMAP_SKYBOX\",\n \"REFLECTIONMAP_SPHERICAL\",\n \"REFLECTIONMAP_EQUIRECTANGULAR\",\n \"REFLECTIONMAP_EQUIRECTANGULAR_FIXED\",\n \"REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED\"\n ];\n for (const i of t)\n this[i] = i === e;\n }\n}\nclass Ee extends Uc {\n /**\n * Gets the image processing configuration used either in this material.\n */\n get imageProcessingConfiguration() {\n return this._imageProcessingConfiguration;\n }\n /**\n * Sets the Default image processing configuration used either in the this material.\n *\n * If sets to null, the scene one is in use.\n */\n set imageProcessingConfiguration(e) {\n this._attachImageProcessingConfiguration(e), this._markAllSubMeshesAsTexturesDirty();\n }\n /**\n * Attaches a new image processing configuration to the Standard Material.\n * @param configuration\n */\n _attachImageProcessingConfiguration(e) {\n e !== this._imageProcessingConfiguration && (this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), e ? this._imageProcessingConfiguration = e : this._imageProcessingConfiguration = this.getScene().imageProcessingConfiguration, this._imageProcessingConfiguration && (this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add(() => {\n this._markAllSubMeshesAsImageProcessingDirty();\n })));\n }\n /**\n * Can this material render to prepass\n */\n get isPrePassCapable() {\n return !this.disableDepthWrite;\n }\n /**\n * Gets whether the color curves effect is enabled.\n */\n get cameraColorCurvesEnabled() {\n return this.imageProcessingConfiguration.colorCurvesEnabled;\n }\n /**\n * Sets whether the color curves effect is enabled.\n */\n set cameraColorCurvesEnabled(e) {\n this.imageProcessingConfiguration.colorCurvesEnabled = e;\n }\n /**\n * Gets whether the color grading effect is enabled.\n */\n get cameraColorGradingEnabled() {\n return this.imageProcessingConfiguration.colorGradingEnabled;\n }\n /**\n * Gets whether the color grading effect is enabled.\n */\n set cameraColorGradingEnabled(e) {\n this.imageProcessingConfiguration.colorGradingEnabled = e;\n }\n /**\n * Gets whether tonemapping is enabled or not.\n */\n get cameraToneMappingEnabled() {\n return this._imageProcessingConfiguration.toneMappingEnabled;\n }\n /**\n * Sets whether tonemapping is enabled or not\n */\n set cameraToneMappingEnabled(e) {\n this._imageProcessingConfiguration.toneMappingEnabled = e;\n }\n /**\n * The camera exposure used on this material.\n * This property is here and not in the camera to allow controlling exposure without full screen post process.\n * This corresponds to a photographic exposure.\n */\n get cameraExposure() {\n return this._imageProcessingConfiguration.exposure;\n }\n /**\n * The camera exposure used on this material.\n * This property is here and not in the camera to allow controlling exposure without full screen post process.\n * This corresponds to a photographic exposure.\n */\n set cameraExposure(e) {\n this._imageProcessingConfiguration.exposure = e;\n }\n /**\n * Gets The camera contrast used on this material.\n */\n get cameraContrast() {\n return this._imageProcessingConfiguration.contrast;\n }\n /**\n * Sets The camera contrast used on this material.\n */\n set cameraContrast(e) {\n this._imageProcessingConfiguration.contrast = e;\n }\n /**\n * Gets the Color Grading 2D Lookup Texture.\n */\n get cameraColorGradingTexture() {\n return this._imageProcessingConfiguration.colorGradingTexture;\n }\n /**\n * Sets the Color Grading 2D Lookup Texture.\n */\n set cameraColorGradingTexture(e) {\n this._imageProcessingConfiguration.colorGradingTexture = e;\n }\n /**\n * The color grading curves provide additional color adjustmnent that is applied after any color grading transform (3D LUT).\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\n */\n get cameraColorCurves() {\n return this._imageProcessingConfiguration.colorCurves;\n }\n /**\n * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT).\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\n */\n set cameraColorCurves(e) {\n this._imageProcessingConfiguration.colorCurves = e;\n }\n /**\n * Can this material render to several textures at once\n */\n get canRenderToMRT() {\n return !0;\n }\n /**\n * Instantiates a new standard material.\n * This is the default material used in Babylon. It is the best trade off between quality\n * and performances.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction\n * @param name Define the name of the material in the scene\n * @param scene Define the scene the material belong to\n */\n constructor(e, t) {\n super(e, t), this._diffuseTexture = null, this._ambientTexture = null, this._opacityTexture = null, this._reflectionTexture = null, this._emissiveTexture = null, this._specularTexture = null, this._bumpTexture = null, this._lightmapTexture = null, this._refractionTexture = null, this.ambientColor = new Ne(0, 0, 0), this.diffuseColor = new Ne(1, 1, 1), this.specularColor = new Ne(1, 1, 1), this.emissiveColor = new Ne(0, 0, 0), this.specularPower = 64, this._useAlphaFromDiffuseTexture = !1, this._useEmissiveAsIllumination = !1, this._linkEmissiveWithDiffuse = !1, this._useSpecularOverAlpha = !1, this._useReflectionOverAlpha = !1, this._disableLighting = !1, this._useObjectSpaceNormalMap = !1, this._useParallax = !1, this._useParallaxOcclusion = !1, this.parallaxScaleBias = 0.05, this._roughness = 0, this.indexOfRefraction = 0.98, this.invertRefractionY = !0, this.alphaCutOff = 0.4, this._useLightmapAsShadowmap = !1, this._useReflectionFresnelFromSpecular = !1, this._useGlossinessFromSpecularMapAlpha = !1, this._maxSimultaneousLights = 4, this._invertNormalMapX = !1, this._invertNormalMapY = !1, this._twoSidedLighting = !1, this._applyDecalMapAfterDetailMap = !1, this._renderTargets = new Li(16), this._worldViewProjectionMatrix = w.Zero(), this._globalAmbientColor = new Ne(0, 0, 0), this._cacheHasRenderTargetTextures = !1, this.detailMap = new hn(this), this._attachImageProcessingConfiguration(null), this.prePassConfiguration = new oc(), this.getRenderTargetTextures = () => (this._renderTargets.reset(), Ee.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget && this._renderTargets.push(this._reflectionTexture), Ee.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget && this._renderTargets.push(this._refractionTexture), this._eventInfo.renderTargets = this._renderTargets, this._callbackPluginEventFillRenderTargetTextures(this._eventInfo), this._renderTargets);\n }\n /**\n * Gets a boolean indicating that current material needs to register RTT\n */\n get hasRenderTargetTextures() {\n return Ee.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget || Ee.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget ? !0 : this._cacheHasRenderTargetTextures;\n }\n /**\n * Gets the current class name of the material e.g. \"StandardMaterial\"\n * Mainly use in serialization.\n * @returns the class name\n */\n getClassName() {\n return \"StandardMaterial\";\n }\n /**\n * Specifies if the material will require alpha blending\n * @returns a boolean specifying if alpha blending is needed\n */\n needAlphaBlending() {\n return this._disableAlphaBlending ? !1 : this.alpha < 1 || this._opacityTexture != null || this._shouldUseAlphaFromDiffuseTexture() || this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled;\n }\n /**\n * Specifies if this material should be rendered in alpha test mode\n * @returns a boolean specifying if an alpha test is needed.\n */\n needAlphaTesting() {\n return this._forceAlphaTest ? !0 : this._hasAlphaChannel() && (this._transparencyMode == null || this._transparencyMode === ie.MATERIAL_ALPHATEST);\n }\n /**\n * @returns whether or not the alpha value of the diffuse texture should be used for alpha blending.\n */\n _shouldUseAlphaFromDiffuseTexture() {\n return this._diffuseTexture != null && this._diffuseTexture.hasAlpha && this._useAlphaFromDiffuseTexture && this._transparencyMode !== ie.MATERIAL_OPAQUE;\n }\n /**\n * @returns whether or not there is a usable alpha channel for transparency.\n */\n _hasAlphaChannel() {\n return this._diffuseTexture != null && this._diffuseTexture.hasAlpha || this._opacityTexture != null;\n }\n /**\n * Get the texture used for alpha test purpose.\n * @returns the diffuse texture in case of the standard material.\n */\n getAlphaTestTexture() {\n return this._diffuseTexture;\n }\n /**\n * Get if the submesh is ready to be used and all its information available.\n * Child classes can use it to update shaders\n * @param mesh defines the mesh to check\n * @param subMesh defines which submesh to check\n * @param useInstances specifies that instances should be used\n * @returns a boolean indicating that the submesh is ready or not\n */\n isReadyForSubMesh(e, t, i = !1) {\n this._uniformBufferLayoutBuilt || this.buildUniformLayout();\n const r = t._drawWrapper;\n if (r.effect && this.isFrozen && r._wasPreviouslyReady && r._wasPreviouslyUsingInstances === i)\n return !0;\n t.materialDefines || (this._callbackPluginEventGeneric(Ri.GetDefineNames, this._eventInfo), t.materialDefines = new W1(this._eventInfo.defineNames));\n const s = this.getScene(), a = t.materialDefines;\n if (this._isReadyForSubMesh(t))\n return !0;\n const o = s.getEngine();\n a._needNormals = r0(s, e, a, !0, this._maxSimultaneousLights, this._disableLighting), s0(s, a);\n const l = this.needAlphaBlendingForMesh(e) && this.getScene().useOrderIndependentTransparency;\n if (a0(s, a, this.canRenderToMRT && !l), n0(s, a, l), a._areTexturesDirty) {\n this._eventInfo.hasRenderTargetTextures = !1, this._callbackPluginEventHasRenderTargetTextures(this._eventInfo), this._cacheHasRenderTargetTextures = this._eventInfo.hasRenderTargetTextures, a._needUVs = !1;\n for (let h = 1; h <= 6; ++h)\n a[\"MAINUV\" + h] = !1;\n if (s.texturesEnabled) {\n if (a.DIFFUSEDIRECTUV = 0, a.BUMPDIRECTUV = 0, a.AMBIENTDIRECTUV = 0, a.OPACITYDIRECTUV = 0, a.EMISSIVEDIRECTUV = 0, a.SPECULARDIRECTUV = 0, a.LIGHTMAPDIRECTUV = 0, this._diffuseTexture && Ee.DiffuseTextureEnabled)\n if (this._diffuseTexture.isReadyOrNotBlocking())\n wt(this._diffuseTexture, a, \"DIFFUSE\");\n else\n return !1;\n else\n a.DIFFUSE = !1;\n if (this._ambientTexture && Ee.AmbientTextureEnabled)\n if (this._ambientTexture.isReadyOrNotBlocking())\n wt(this._ambientTexture, a, \"AMBIENT\");\n else\n return !1;\n else\n a.AMBIENT = !1;\n if (this._opacityTexture && Ee.OpacityTextureEnabled)\n if (this._opacityTexture.isReadyOrNotBlocking())\n wt(this._opacityTexture, a, \"OPACITY\"), a.OPACITYRGB = this._opacityTexture.getAlphaFromRGB;\n else\n return !1;\n else\n a.OPACITY = !1;\n if (this._reflectionTexture && Ee.ReflectionTextureEnabled)\n if (this._reflectionTexture.isReadyOrNotBlocking()) {\n switch (a._needNormals = !0, a.REFLECTION = !0, a.ROUGHNESS = this._roughness > 0, a.REFLECTIONOVERALPHA = this._useReflectionOverAlpha, a.INVERTCUBICMAP = this._reflectionTexture.coordinatesMode === le.INVCUBIC_MODE, a.REFLECTIONMAP_3D = this._reflectionTexture.isCube, a.REFLECTIONMAP_OPPOSITEZ = a.REFLECTIONMAP_3D && this.getScene().useRightHandedSystem ? !this._reflectionTexture.invertZ : this._reflectionTexture.invertZ, a.RGBDREFLECTION = this._reflectionTexture.isRGBD, this._reflectionTexture.coordinatesMode) {\n case le.EXPLICIT_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_EXPLICIT\");\n break;\n case le.PLANAR_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_PLANAR\");\n break;\n case le.PROJECTION_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_PROJECTION\");\n break;\n case le.SKYBOX_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_SKYBOX\");\n break;\n case le.SPHERICAL_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_SPHERICAL\");\n break;\n case le.EQUIRECTANGULAR_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_EQUIRECTANGULAR\");\n break;\n case le.FIXED_EQUIRECTANGULAR_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_EQUIRECTANGULAR_FIXED\");\n break;\n case le.FIXED_EQUIRECTANGULAR_MIRRORED_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED\");\n break;\n case le.CUBIC_MODE:\n case le.INVCUBIC_MODE:\n default:\n a.setReflectionMode(\"REFLECTIONMAP_CUBIC\");\n break;\n }\n a.USE_LOCAL_REFLECTIONMAP_CUBIC = !!this._reflectionTexture.boundingBoxSize;\n } else\n return !1;\n else\n a.REFLECTION = !1, a.REFLECTIONMAP_OPPOSITEZ = !1;\n if (this._emissiveTexture && Ee.EmissiveTextureEnabled)\n if (this._emissiveTexture.isReadyOrNotBlocking())\n wt(this._emissiveTexture, a, \"EMISSIVE\");\n else\n return !1;\n else\n a.EMISSIVE = !1;\n if (this._lightmapTexture && Ee.LightmapTextureEnabled)\n if (this._lightmapTexture.isReadyOrNotBlocking())\n wt(this._lightmapTexture, a, \"LIGHTMAP\"), a.USELIGHTMAPASSHADOWMAP = this._useLightmapAsShadowmap, a.RGBDLIGHTMAP = this._lightmapTexture.isRGBD;\n else\n return !1;\n else\n a.LIGHTMAP = !1;\n if (this._specularTexture && Ee.SpecularTextureEnabled)\n if (this._specularTexture.isReadyOrNotBlocking())\n wt(this._specularTexture, a, \"SPECULAR\"), a.GLOSSINESS = this._useGlossinessFromSpecularMapAlpha;\n else\n return !1;\n else\n a.SPECULAR = !1;\n if (s.getEngine().getCaps().standardDerivatives && this._bumpTexture && Ee.BumpTextureEnabled) {\n if (this._bumpTexture.isReady())\n wt(this._bumpTexture, a, \"BUMP\"), a.PARALLAX = this._useParallax, a.PARALLAX_RHS = s.useRightHandedSystem, a.PARALLAXOCCLUSION = this._useParallaxOcclusion;\n else\n return !1;\n a.OBJECTSPACE_NORMALMAP = this._useObjectSpaceNormalMap;\n } else\n a.BUMP = !1, a.PARALLAX = !1, a.PARALLAX_RHS = !1, a.PARALLAXOCCLUSION = !1;\n if (this._refractionTexture && Ee.RefractionTextureEnabled)\n if (this._refractionTexture.isReadyOrNotBlocking())\n a._needUVs = !0, a.REFRACTION = !0, a.REFRACTIONMAP_3D = this._refractionTexture.isCube, a.RGBDREFRACTION = this._refractionTexture.isRGBD, a.USE_LOCAL_REFRACTIONMAP_CUBIC = !!this._refractionTexture.boundingBoxSize;\n else\n return !1;\n else\n a.REFRACTION = !1;\n a.TWOSIDEDLIGHTING = !this._backFaceCulling && this._twoSidedLighting;\n } else\n a.DIFFUSE = !1, a.AMBIENT = !1, a.OPACITY = !1, a.REFLECTION = !1, a.EMISSIVE = !1, a.LIGHTMAP = !1, a.BUMP = !1, a.REFRACTION = !1;\n a.ALPHAFROMDIFFUSE = this._shouldUseAlphaFromDiffuseTexture(), a.EMISSIVEASILLUMINATION = this._useEmissiveAsIllumination, a.LINKEMISSIVEWITHDIFFUSE = this._linkEmissiveWithDiffuse, a.SPECULAROVERALPHA = this._useSpecularOverAlpha, a.PREMULTIPLYALPHA = this.alphaMode === 7 || this.alphaMode === 8, a.ALPHATEST_AFTERALLALPHACOMPUTATIONS = this.transparencyMode !== null, a.ALPHABLEND = this.transparencyMode === null || this.needAlphaBlendingForMesh(e);\n }\n if (this._eventInfo.isReadyForSubMesh = !0, this._eventInfo.defines = a, this._eventInfo.subMesh = t, this._callbackPluginEventIsReadyForSubMesh(this._eventInfo), !this._eventInfo.isReadyForSubMesh)\n return !1;\n if (a._areImageProcessingDirty && this._imageProcessingConfiguration) {\n if (!this._imageProcessingConfiguration.isReady())\n return !1;\n this._imageProcessingConfiguration.prepareDefines(a), a.IS_REFLECTION_LINEAR = this.reflectionTexture != null && !this.reflectionTexture.gammaSpace, a.IS_REFRACTION_LINEAR = this.refractionTexture != null && !this.refractionTexture.gammaSpace;\n }\n a._areFresnelDirty && (Ee.FresnelEnabled ? (this._diffuseFresnelParameters || this._opacityFresnelParameters || this._emissiveFresnelParameters || this._refractionFresnelParameters || this._reflectionFresnelParameters) && (a.DIFFUSEFRESNEL = this._diffuseFresnelParameters && this._diffuseFresnelParameters.isEnabled, a.OPACITYFRESNEL = this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled, a.REFLECTIONFRESNEL = this._reflectionFresnelParameters && this._reflectionFresnelParameters.isEnabled, a.REFLECTIONFRESNELFROMSPECULAR = this._useReflectionFresnelFromSpecular, a.REFRACTIONFRESNEL = this._refractionFresnelParameters && this._refractionFresnelParameters.isEnabled, a.EMISSIVEFRESNEL = this._emissiveFresnelParameters && this._emissiveFresnelParameters.isEnabled, a._needNormals = !0, a.FRESNEL = !0) : a.FRESNEL = !1), cf(e, s, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, this._shouldTurnAlphaTestOn(e) || this._forceAlphaTest, a, this._applyDecalMapAfterDetailMap), hf(s, o, this, a, i, null, t.getRenderingMesh().hasThinInstances), this._eventInfo.defines = a, this._eventInfo.mesh = e, this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo), uf(e, a, !0, !0, !0), this._callbackPluginEventPrepareDefines(this._eventInfo);\n let c = !1;\n if (a.isDirty) {\n const h = a._areLightsDisposed;\n a.markAsProcessed();\n const u = new pf();\n a.REFLECTION && u.addFallback(0, \"REFLECTION\"), a.SPECULAR && u.addFallback(0, \"SPECULAR\"), a.BUMP && u.addFallback(0, \"BUMP\"), a.PARALLAX && u.addFallback(1, \"PARALLAX\"), a.PARALLAX_RHS && u.addFallback(1, \"PARALLAX_RHS\"), a.PARALLAXOCCLUSION && u.addFallback(0, \"PARALLAXOCCLUSION\"), a.SPECULAROVERALPHA && u.addFallback(0, \"SPECULAROVERALPHA\"), a.FOG && u.addFallback(1, \"FOG\"), a.POINTSIZE && u.addFallback(0, \"POINTSIZE\"), a.LOGARITHMICDEPTH && u.addFallback(0, \"LOGARITHMICDEPTH\"), i0(a, u, this._maxSimultaneousLights), a.SPECULARTERM && u.addFallback(0, \"SPECULARTERM\"), a.DIFFUSEFRESNEL && u.addFallback(1, \"DIFFUSEFRESNEL\"), a.OPACITYFRESNEL && u.addFallback(2, \"OPACITYFRESNEL\"), a.REFLECTIONFRESNEL && u.addFallback(3, \"REFLECTIONFRESNEL\"), a.EMISSIVEFRESNEL && u.addFallback(4, \"EMISSIVEFRESNEL\"), a.FRESNEL && u.addFallback(4, \"FRESNEL\"), a.MULTIVIEW && u.addFallback(0, \"MULTIVIEW\");\n const f = [I.PositionKind];\n a.NORMAL && f.push(I.NormalKind), a.TANGENT && f.push(I.TangentKind);\n for (let x = 1; x <= 6; ++x)\n a[\"UV\" + x] && f.push(`uv${x === 1 ? \"\" : x}`);\n a.VERTEXCOLOR && f.push(I.ColorKind), t0(f, e, a, u), lf(f, a), Q_(f, e, a), af(f, e, a);\n let d = \"default\";\n const p = [\n \"world\",\n \"view\",\n \"viewProjection\",\n \"vEyePosition\",\n \"vLightsType\",\n \"vAmbientColor\",\n \"vDiffuseColor\",\n \"vSpecularColor\",\n \"vEmissiveColor\",\n \"visibility\",\n \"vFogInfos\",\n \"vFogColor\",\n \"pointSize\",\n \"vDiffuseInfos\",\n \"vAmbientInfos\",\n \"vOpacityInfos\",\n \"vReflectionInfos\",\n \"vEmissiveInfos\",\n \"vSpecularInfos\",\n \"vBumpInfos\",\n \"vLightmapInfos\",\n \"vRefractionInfos\",\n \"mBones\",\n \"diffuseMatrix\",\n \"ambientMatrix\",\n \"opacityMatrix\",\n \"reflectionMatrix\",\n \"emissiveMatrix\",\n \"specularMatrix\",\n \"bumpMatrix\",\n \"normalMatrix\",\n \"lightmapMatrix\",\n \"refractionMatrix\",\n \"diffuseLeftColor\",\n \"diffuseRightColor\",\n \"opacityParts\",\n \"reflectionLeftColor\",\n \"reflectionRightColor\",\n \"emissiveLeftColor\",\n \"emissiveRightColor\",\n \"refractionLeftColor\",\n \"refractionRightColor\",\n \"vReflectionPosition\",\n \"vReflectionSize\",\n \"vRefractionPosition\",\n \"vRefractionSize\",\n \"logarithmicDepthConstant\",\n \"vTangentSpaceParams\",\n \"alphaCutOff\",\n \"boneTextureWidth\",\n \"morphTargetTextureInfo\",\n \"morphTargetTextureIndices\"\n ], g = [\n \"diffuseSampler\",\n \"ambientSampler\",\n \"opacitySampler\",\n \"reflectionCubeSampler\",\n \"reflection2DSampler\",\n \"emissiveSampler\",\n \"specularSampler\",\n \"bumpSampler\",\n \"lightmapSampler\",\n \"refractionCubeSampler\",\n \"refraction2DSampler\",\n \"boneSampler\",\n \"morphTargets\",\n \"oitDepthSampler\",\n \"oitFrontColorSampler\"\n ], m = [\"Material\", \"Scene\", \"Mesh\"], v = { maxSimultaneousLights: this._maxSimultaneousLights, maxSimultaneousMorphTargets: a.NUM_MORPH_INFLUENCERS };\n this._eventInfo.fallbacks = u, this._eventInfo.fallbackRank = 0, this._eventInfo.defines = a, this._eventInfo.uniforms = p, this._eventInfo.attributes = f, this._eventInfo.samplers = g, this._eventInfo.uniformBuffersNames = m, this._eventInfo.customCode = void 0, this._eventInfo.mesh = e, this._eventInfo.indexParameters = v, this._callbackPluginEventGeneric(Ri.PrepareEffect, this._eventInfo), oc.AddUniforms(p), at && (at.PrepareUniforms(p, a), at.PrepareSamplers(g, a)), ff({\n uniformsNames: p,\n uniformBuffersNames: m,\n samplers: g,\n defines: a,\n maxSimultaneousLights: this._maxSimultaneousLights\n }), Nc(p);\n const E = {};\n this.customShaderNameResolve && (d = this.customShaderNameResolve(d, p, m, g, a, f, E));\n const C = a.toString(), T = t.effect;\n let R = s.getEngine().createEffect(d, {\n attributes: f,\n uniformsNames: p,\n uniformBuffersNames: m,\n samplers: g,\n defines: C,\n fallbacks: u,\n onCompiled: this.onCompiled,\n onError: this.onError,\n indexParameters: v,\n processFinalCode: E.processFinalCode,\n processCodeAfterIncludes: this._eventInfo.customCode,\n multiTarget: a.PREPASS\n }, o);\n if (this._eventInfo.customCode = void 0, R)\n if (this._onEffectCreatedObservable && (Xh.effect = R, Xh.subMesh = t, this._onEffectCreatedObservable.notifyObservers(Xh)), this.allowShaderHotSwapping && T && !R.isReady()) {\n if (R = T, a.markAsUnprocessed(), c = this.isFrozen, h)\n return a._areLightsDisposed = !0, !1;\n } else\n s.resetCachedMaterial(), t.setEffect(R, a, this._materialContext);\n }\n return !t.effect || !t.effect.isReady() ? !1 : (a._renderId = s.getRenderId(), r._wasPreviouslyReady = !c, r._wasPreviouslyUsingInstances = i, this._checkScenePerformancePriority(), !0);\n }\n /**\n * Builds the material UBO layouts.\n * Used internally during the effect preparation.\n */\n buildUniformLayout() {\n const e = this._uniformBuffer;\n e.addUniform(\"diffuseLeftColor\", 4), e.addUniform(\"diffuseRightColor\", 4), e.addUniform(\"opacityParts\", 4), e.addUniform(\"reflectionLeftColor\", 4), e.addUniform(\"reflectionRightColor\", 4), e.addUniform(\"refractionLeftColor\", 4), e.addUniform(\"refractionRightColor\", 4), e.addUniform(\"emissiveLeftColor\", 4), e.addUniform(\"emissiveRightColor\", 4), e.addUniform(\"vDiffuseInfos\", 2), e.addUniform(\"vAmbientInfos\", 2), e.addUniform(\"vOpacityInfos\", 2), e.addUniform(\"vReflectionInfos\", 2), e.addUniform(\"vReflectionPosition\", 3), e.addUniform(\"vReflectionSize\", 3), e.addUniform(\"vEmissiveInfos\", 2), e.addUniform(\"vLightmapInfos\", 2), e.addUniform(\"vSpecularInfos\", 2), e.addUniform(\"vBumpInfos\", 3), e.addUniform(\"diffuseMatrix\", 16), e.addUniform(\"ambientMatrix\", 16), e.addUniform(\"opacityMatrix\", 16), e.addUniform(\"reflectionMatrix\", 16), e.addUniform(\"emissiveMatrix\", 16), e.addUniform(\"lightmapMatrix\", 16), e.addUniform(\"specularMatrix\", 16), e.addUniform(\"bumpMatrix\", 16), e.addUniform(\"vTangentSpaceParams\", 2), e.addUniform(\"pointSize\", 1), e.addUniform(\"alphaCutOff\", 1), e.addUniform(\"refractionMatrix\", 16), e.addUniform(\"vRefractionInfos\", 4), e.addUniform(\"vRefractionPosition\", 3), e.addUniform(\"vRefractionSize\", 3), e.addUniform(\"vSpecularColor\", 4), e.addUniform(\"vEmissiveColor\", 3), e.addUniform(\"vDiffuseColor\", 4), e.addUniform(\"vAmbientColor\", 3), super.buildUniformLayout();\n }\n /**\n * Binds the submesh to this material by preparing the effect and shader to draw\n * @param world defines the world transformation matrix\n * @param mesh defines the mesh containing the submesh\n * @param subMesh defines the submesh to bind the material to\n */\n bindForSubMesh(e, t, i) {\n var c;\n const r = this.getScene(), s = i.materialDefines;\n if (!s)\n return;\n const a = i.effect;\n if (!a)\n return;\n this._activeEffect = a, t.getMeshUniformBuffer().bindToEffect(a, \"Mesh\"), t.transferToEffect(e), this._uniformBuffer.bindToEffect(a, \"Material\"), this.prePassConfiguration.bindForSubMesh(this._activeEffect, r, t, e, this.isFrozen), this._eventInfo.subMesh = i, this._callbackPluginEventHardBindForSubMesh(this._eventInfo), s.OBJECTSPACE_NORMALMAP && (e.toNormalMatrix(this._normalMatrix), this.bindOnlyNormalMatrix(this._normalMatrix));\n const o = this._mustRebind(r, a, i, t.visibility);\n of(t, a);\n const l = this._uniformBuffer;\n if (o) {\n if (this.bindViewProjection(a), !l.useUbo || !this.isFrozen || !l.isSync || i._drawWrapper._forceRebindOnNextCall) {\n if (Ee.FresnelEnabled && s.FRESNEL && (this.diffuseFresnelParameters && this.diffuseFresnelParameters.isEnabled && (l.updateColor4(\"diffuseLeftColor\", this.diffuseFresnelParameters.leftColor, this.diffuseFresnelParameters.power), l.updateColor4(\"diffuseRightColor\", this.diffuseFresnelParameters.rightColor, this.diffuseFresnelParameters.bias)), this.opacityFresnelParameters && this.opacityFresnelParameters.isEnabled && l.updateColor4(\"opacityParts\", new Ne(this.opacityFresnelParameters.leftColor.toLuminance(), this.opacityFresnelParameters.rightColor.toLuminance(), this.opacityFresnelParameters.bias), this.opacityFresnelParameters.power), this.reflectionFresnelParameters && this.reflectionFresnelParameters.isEnabled && (l.updateColor4(\"reflectionLeftColor\", this.reflectionFresnelParameters.leftColor, this.reflectionFresnelParameters.power), l.updateColor4(\"reflectionRightColor\", this.reflectionFresnelParameters.rightColor, this.reflectionFresnelParameters.bias)), this.refractionFresnelParameters && this.refractionFresnelParameters.isEnabled && (l.updateColor4(\"refractionLeftColor\", this.refractionFresnelParameters.leftColor, this.refractionFresnelParameters.power), l.updateColor4(\"refractionRightColor\", this.refractionFresnelParameters.rightColor, this.refractionFresnelParameters.bias)), this.emissiveFresnelParameters && this.emissiveFresnelParameters.isEnabled && (l.updateColor4(\"emissiveLeftColor\", this.emissiveFresnelParameters.leftColor, this.emissiveFresnelParameters.power), l.updateColor4(\"emissiveRightColor\", this.emissiveFresnelParameters.rightColor, this.emissiveFresnelParameters.bias))), r.texturesEnabled) {\n if (this._diffuseTexture && Ee.DiffuseTextureEnabled && (l.updateFloat2(\"vDiffuseInfos\", this._diffuseTexture.coordinatesIndex, this._diffuseTexture.level), Mt(this._diffuseTexture, l, \"diffuse\")), this._ambientTexture && Ee.AmbientTextureEnabled && (l.updateFloat2(\"vAmbientInfos\", this._ambientTexture.coordinatesIndex, this._ambientTexture.level), Mt(this._ambientTexture, l, \"ambient\")), this._opacityTexture && Ee.OpacityTextureEnabled && (l.updateFloat2(\"vOpacityInfos\", this._opacityTexture.coordinatesIndex, this._opacityTexture.level), Mt(this._opacityTexture, l, \"opacity\")), this._hasAlphaChannel() && l.updateFloat(\"alphaCutOff\", this.alphaCutOff), this._reflectionTexture && Ee.ReflectionTextureEnabled && (l.updateFloat2(\"vReflectionInfos\", this._reflectionTexture.level, this.roughness), l.updateMatrix(\"reflectionMatrix\", this._reflectionTexture.getReflectionTextureMatrix()), this._reflectionTexture.boundingBoxSize)) {\n const h = this._reflectionTexture;\n l.updateVector3(\"vReflectionPosition\", h.boundingBoxPosition), l.updateVector3(\"vReflectionSize\", h.boundingBoxSize);\n }\n if (this._emissiveTexture && Ee.EmissiveTextureEnabled && (l.updateFloat2(\"vEmissiveInfos\", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level), Mt(this._emissiveTexture, l, \"emissive\")), this._lightmapTexture && Ee.LightmapTextureEnabled && (l.updateFloat2(\"vLightmapInfos\", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level), Mt(this._lightmapTexture, l, \"lightmap\")), this._specularTexture && Ee.SpecularTextureEnabled && (l.updateFloat2(\"vSpecularInfos\", this._specularTexture.coordinatesIndex, this._specularTexture.level), Mt(this._specularTexture, l, \"specular\")), this._bumpTexture && r.getEngine().getCaps().standardDerivatives && Ee.BumpTextureEnabled && (l.updateFloat3(\"vBumpInfos\", this._bumpTexture.coordinatesIndex, 1 / this._bumpTexture.level, this.parallaxScaleBias), Mt(this._bumpTexture, l, \"bump\"), r._mirroredCameraPosition ? l.updateFloat2(\"vTangentSpaceParams\", this._invertNormalMapX ? 1 : -1, this._invertNormalMapY ? 1 : -1) : l.updateFloat2(\"vTangentSpaceParams\", this._invertNormalMapX ? -1 : 1, this._invertNormalMapY ? -1 : 1)), this._refractionTexture && Ee.RefractionTextureEnabled) {\n let h = 1;\n if (this._refractionTexture.isCube || (l.updateMatrix(\"refractionMatrix\", this._refractionTexture.getReflectionTextureMatrix()), this._refractionTexture.depth && (h = this._refractionTexture.depth)), l.updateFloat4(\"vRefractionInfos\", this._refractionTexture.level, this.indexOfRefraction, h, this.invertRefractionY ? -1 : 1), this._refractionTexture.boundingBoxSize) {\n const u = this._refractionTexture;\n l.updateVector3(\"vRefractionPosition\", u.boundingBoxPosition), l.updateVector3(\"vRefractionSize\", u.boundingBoxSize);\n }\n }\n }\n this.pointsCloud && l.updateFloat(\"pointSize\", this.pointSize), s.SPECULARTERM && l.updateColor4(\"vSpecularColor\", this.specularColor, this.specularPower), l.updateColor3(\"vEmissiveColor\", Ee.EmissiveTextureEnabled ? this.emissiveColor : Ne.BlackReadOnly), l.updateColor4(\"vDiffuseColor\", this.diffuseColor, this.alpha), r.ambientColor.multiplyToRef(this.ambientColor, this._globalAmbientColor), l.updateColor3(\"vAmbientColor\", this._globalAmbientColor);\n }\n r.texturesEnabled && (this._diffuseTexture && Ee.DiffuseTextureEnabled && a.setTexture(\"diffuseSampler\", this._diffuseTexture), this._ambientTexture && Ee.AmbientTextureEnabled && a.setTexture(\"ambientSampler\", this._ambientTexture), this._opacityTexture && Ee.OpacityTextureEnabled && a.setTexture(\"opacitySampler\", this._opacityTexture), this._reflectionTexture && Ee.ReflectionTextureEnabled && (this._reflectionTexture.isCube ? a.setTexture(\"reflectionCubeSampler\", this._reflectionTexture) : a.setTexture(\"reflection2DSampler\", this._reflectionTexture)), this._emissiveTexture && Ee.EmissiveTextureEnabled && a.setTexture(\"emissiveSampler\", this._emissiveTexture), this._lightmapTexture && Ee.LightmapTextureEnabled && a.setTexture(\"lightmapSampler\", this._lightmapTexture), this._specularTexture && Ee.SpecularTextureEnabled && a.setTexture(\"specularSampler\", this._specularTexture), this._bumpTexture && r.getEngine().getCaps().standardDerivatives && Ee.BumpTextureEnabled && a.setTexture(\"bumpSampler\", this._bumpTexture), this._refractionTexture && Ee.RefractionTextureEnabled && (this._refractionTexture.isCube ? a.setTexture(\"refractionCubeSampler\", this._refractionTexture) : a.setTexture(\"refraction2DSampler\", this._refractionTexture))), this.getScene().useOrderIndependentTransparency && this.needAlphaBlendingForMesh(t) && this.getScene().depthPeelingRenderer.bind(a), this._eventInfo.subMesh = i, this._callbackPluginEventBindForSubMesh(this._eventInfo), Fc(a, this, r), this.bindEyePosition(a);\n } else\n r.getEngine()._features.needToAlwaysBindUniformBuffers && (this._needToBindSceneUbo = !0);\n (o || !this.isFrozen) && (r.lightsEnabled && !this._disableLighting && e0(r, t, a, s, this._maxSimultaneousLights), (r.fogEnabled && t.applyFog && r.fogMode !== Ot.FOGMODE_NONE || this._reflectionTexture || this._refractionTexture || t.receiveShadows || s.PREPASS) && this.bindView(a), wc(r, t, a), s.NUM_MORPH_INFLUENCERS && nf(t, a), s.BAKED_VERTEX_ANIMATION_TEXTURE && ((c = t.bakedVertexAnimationManager) == null || c.bind(a, s.INSTANCES)), this.useLogarithmicDepth && Lc(s, a, r), this._imageProcessingConfiguration && !this._imageProcessingConfiguration.applyByPostProcess && this._imageProcessingConfiguration.bind(this._activeEffect)), this._afterBind(t, this._activeEffect, i), l.update();\n }\n /**\n * Get the list of animatables in the material.\n * @returns the list of animatables object used in the material\n */\n getAnimatables() {\n const e = super.getAnimatables();\n return this._diffuseTexture && this._diffuseTexture.animations && this._diffuseTexture.animations.length > 0 && e.push(this._diffuseTexture), this._ambientTexture && this._ambientTexture.animations && this._ambientTexture.animations.length > 0 && e.push(this._ambientTexture), this._opacityTexture && this._opacityTexture.animations && this._opacityTexture.animations.length > 0 && e.push(this._opacityTexture), this._reflectionTexture && this._reflectionTexture.animations && this._reflectionTexture.animations.length > 0 && e.push(this._reflectionTexture), this._emissiveTexture && this._emissiveTexture.animations && this._emissiveTexture.animations.length > 0 && e.push(this._emissiveTexture), this._specularTexture && this._specularTexture.animations && this._specularTexture.animations.length > 0 && e.push(this._specularTexture), this._bumpTexture && this._bumpTexture.animations && this._bumpTexture.animations.length > 0 && e.push(this._bumpTexture), this._lightmapTexture && this._lightmapTexture.animations && this._lightmapTexture.animations.length > 0 && e.push(this._lightmapTexture), this._refractionTexture && this._refractionTexture.animations && this._refractionTexture.animations.length > 0 && e.push(this._refractionTexture), e;\n }\n /**\n * Gets the active textures from the material\n * @returns an array of textures\n */\n getActiveTextures() {\n const e = super.getActiveTextures();\n return this._diffuseTexture && e.push(this._diffuseTexture), this._ambientTexture && e.push(this._ambientTexture), this._opacityTexture && e.push(this._opacityTexture), this._reflectionTexture && e.push(this._reflectionTexture), this._emissiveTexture && e.push(this._emissiveTexture), this._specularTexture && e.push(this._specularTexture), this._bumpTexture && e.push(this._bumpTexture), this._lightmapTexture && e.push(this._lightmapTexture), this._refractionTexture && e.push(this._refractionTexture), e;\n }\n /**\n * Specifies if the material uses a texture\n * @param texture defines the texture to check against the material\n * @returns a boolean specifying if the material uses the texture\n */\n hasTexture(e) {\n return !!(super.hasTexture(e) || this._diffuseTexture === e || this._ambientTexture === e || this._opacityTexture === e || this._reflectionTexture === e || this._emissiveTexture === e || this._specularTexture === e || this._bumpTexture === e || this._lightmapTexture === e || this._refractionTexture === e);\n }\n /**\n * Disposes the material\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\n */\n dispose(e, t) {\n var i, r, s, a, o, l, c, h, u;\n t && ((i = this._diffuseTexture) == null || i.dispose(), (r = this._ambientTexture) == null || r.dispose(), (s = this._opacityTexture) == null || s.dispose(), (a = this._reflectionTexture) == null || a.dispose(), (o = this._emissiveTexture) == null || o.dispose(), (l = this._specularTexture) == null || l.dispose(), (c = this._bumpTexture) == null || c.dispose(), (h = this._lightmapTexture) == null || h.dispose(), (u = this._refractionTexture) == null || u.dispose()), this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), super.dispose(e, t);\n }\n /**\n * Makes a duplicate of the material, and gives it a new name\n * @param name defines the new name for the duplicated material\n * @param cloneTexturesOnlyOnce - if a texture is used in more than one channel (e.g diffuse and opacity), only clone it once and reuse it on the other channels. Default false.\n * @param rootUrl defines the root URL to use to load textures\n * @returns the cloned material\n */\n clone(e, t = !0, i = \"\") {\n const r = Le.Clone(() => new Ee(e, this.getScene()), this, { cloneTexturesOnlyOnce: t });\n return r.name = e, r.id = e, this.stencil.copyTo(r.stencil), this._clonePlugins(r, i), r;\n }\n /**\n * Creates a standard material from parsed material data\n * @param source defines the JSON representation of the material\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a new standard material\n */\n static Parse(e, t, i) {\n const r = Le.Parse(() => new Ee(e.name, t), e, t, i);\n return e.stencil && r.stencil.parse(e.stencil, t, i), ie._ParsePlugins(e, r, t, i), r;\n }\n // Flags used to enable or disable a type of texture for all Standard Materials\n /**\n * Are diffuse textures enabled in the application.\n */\n static get DiffuseTextureEnabled() {\n return ae.DiffuseTextureEnabled;\n }\n static set DiffuseTextureEnabled(e) {\n ae.DiffuseTextureEnabled = e;\n }\n /**\n * Are detail textures enabled in the application.\n */\n static get DetailTextureEnabled() {\n return ae.DetailTextureEnabled;\n }\n static set DetailTextureEnabled(e) {\n ae.DetailTextureEnabled = e;\n }\n /**\n * Are ambient textures enabled in the application.\n */\n static get AmbientTextureEnabled() {\n return ae.AmbientTextureEnabled;\n }\n static set AmbientTextureEnabled(e) {\n ae.AmbientTextureEnabled = e;\n }\n /**\n * Are opacity textures enabled in the application.\n */\n static get OpacityTextureEnabled() {\n return ae.OpacityTextureEnabled;\n }\n static set OpacityTextureEnabled(e) {\n ae.OpacityTextureEnabled = e;\n }\n /**\n * Are reflection textures enabled in the application.\n */\n static get ReflectionTextureEnabled() {\n return ae.ReflectionTextureEnabled;\n }\n static set ReflectionTextureEnabled(e) {\n ae.ReflectionTextureEnabled = e;\n }\n /**\n * Are emissive textures enabled in the application.\n */\n static get EmissiveTextureEnabled() {\n return ae.EmissiveTextureEnabled;\n }\n static set EmissiveTextureEnabled(e) {\n ae.EmissiveTextureEnabled = e;\n }\n /**\n * Are specular textures enabled in the application.\n */\n static get SpecularTextureEnabled() {\n return ae.SpecularTextureEnabled;\n }\n static set SpecularTextureEnabled(e) {\n ae.SpecularTextureEnabled = e;\n }\n /**\n * Are bump textures enabled in the application.\n */\n static get BumpTextureEnabled() {\n return ae.BumpTextureEnabled;\n }\n static set BumpTextureEnabled(e) {\n ae.BumpTextureEnabled = e;\n }\n /**\n * Are lightmap textures enabled in the application.\n */\n static get LightmapTextureEnabled() {\n return ae.LightmapTextureEnabled;\n }\n static set LightmapTextureEnabled(e) {\n ae.LightmapTextureEnabled = e;\n }\n /**\n * Are refraction textures enabled in the application.\n */\n static get RefractionTextureEnabled() {\n return ae.RefractionTextureEnabled;\n }\n static set RefractionTextureEnabled(e) {\n ae.RefractionTextureEnabled = e;\n }\n /**\n * Are color grading textures enabled in the application.\n */\n static get ColorGradingTextureEnabled() {\n return ae.ColorGradingTextureEnabled;\n }\n static set ColorGradingTextureEnabled(e) {\n ae.ColorGradingTextureEnabled = e;\n }\n /**\n * Are fresnels enabled in the application.\n */\n static get FresnelEnabled() {\n return ae.FresnelEnabled;\n }\n static set FresnelEnabled(e) {\n ae.FresnelEnabled = e;\n }\n}\nP([\n Tt(\"diffuseTexture\")\n], Ee.prototype, \"_diffuseTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], Ee.prototype, \"diffuseTexture\", void 0);\nP([\n Tt(\"ambientTexture\")\n], Ee.prototype, \"_ambientTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"ambientTexture\", void 0);\nP([\n Tt(\"opacityTexture\")\n], Ee.prototype, \"_opacityTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], Ee.prototype, \"opacityTexture\", void 0);\nP([\n Tt(\"reflectionTexture\")\n], Ee.prototype, \"_reflectionTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"reflectionTexture\", void 0);\nP([\n Tt(\"emissiveTexture\")\n], Ee.prototype, \"_emissiveTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"emissiveTexture\", void 0);\nP([\n Tt(\"specularTexture\")\n], Ee.prototype, \"_specularTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"specularTexture\", void 0);\nP([\n Tt(\"bumpTexture\")\n], Ee.prototype, \"_bumpTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"bumpTexture\", void 0);\nP([\n Tt(\"lightmapTexture\")\n], Ee.prototype, \"_lightmapTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"lightmapTexture\", void 0);\nP([\n Tt(\"refractionTexture\")\n], Ee.prototype, \"_refractionTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"refractionTexture\", void 0);\nP([\n $i(\"ambient\")\n], Ee.prototype, \"ambientColor\", void 0);\nP([\n $i(\"diffuse\")\n], Ee.prototype, \"diffuseColor\", void 0);\nP([\n $i(\"specular\")\n], Ee.prototype, \"specularColor\", void 0);\nP([\n $i(\"emissive\")\n], Ee.prototype, \"emissiveColor\", void 0);\nP([\n U()\n], Ee.prototype, \"specularPower\", void 0);\nP([\n U(\"useAlphaFromDiffuseTexture\")\n], Ee.prototype, \"_useAlphaFromDiffuseTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], Ee.prototype, \"useAlphaFromDiffuseTexture\", void 0);\nP([\n U(\"useEmissiveAsIllumination\")\n], Ee.prototype, \"_useEmissiveAsIllumination\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useEmissiveAsIllumination\", void 0);\nP([\n U(\"linkEmissiveWithDiffuse\")\n], Ee.prototype, \"_linkEmissiveWithDiffuse\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"linkEmissiveWithDiffuse\", void 0);\nP([\n U(\"useSpecularOverAlpha\")\n], Ee.prototype, \"_useSpecularOverAlpha\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useSpecularOverAlpha\", void 0);\nP([\n U(\"useReflectionOverAlpha\")\n], Ee.prototype, \"_useReflectionOverAlpha\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useReflectionOverAlpha\", void 0);\nP([\n U(\"disableLighting\")\n], Ee.prototype, \"_disableLighting\", void 0);\nP([\n oe(\"_markAllSubMeshesAsLightsDirty\")\n], Ee.prototype, \"disableLighting\", void 0);\nP([\n U(\"useObjectSpaceNormalMap\")\n], Ee.prototype, \"_useObjectSpaceNormalMap\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useObjectSpaceNormalMap\", void 0);\nP([\n U(\"useParallax\")\n], Ee.prototype, \"_useParallax\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useParallax\", void 0);\nP([\n U(\"useParallaxOcclusion\")\n], Ee.prototype, \"_useParallaxOcclusion\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useParallaxOcclusion\", void 0);\nP([\n U()\n], Ee.prototype, \"parallaxScaleBias\", void 0);\nP([\n U(\"roughness\")\n], Ee.prototype, \"_roughness\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"roughness\", void 0);\nP([\n U()\n], Ee.prototype, \"indexOfRefraction\", void 0);\nP([\n U()\n], Ee.prototype, \"invertRefractionY\", void 0);\nP([\n U()\n], Ee.prototype, \"alphaCutOff\", void 0);\nP([\n U(\"useLightmapAsShadowmap\")\n], Ee.prototype, \"_useLightmapAsShadowmap\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useLightmapAsShadowmap\", void 0);\nP([\n Ho(\"diffuseFresnelParameters\")\n], Ee.prototype, \"_diffuseFresnelParameters\", void 0);\nP([\n oe(\"_markAllSubMeshesAsFresnelDirty\")\n], Ee.prototype, \"diffuseFresnelParameters\", void 0);\nP([\n Ho(\"opacityFresnelParameters\")\n], Ee.prototype, \"_opacityFresnelParameters\", void 0);\nP([\n oe(\"_markAllSubMeshesAsFresnelAndMiscDirty\")\n], Ee.prototype, \"opacityFresnelParameters\", void 0);\nP([\n Ho(\"reflectionFresnelParameters\")\n], Ee.prototype, \"_reflectionFresnelParameters\", void 0);\nP([\n oe(\"_markAllSubMeshesAsFresnelDirty\")\n], Ee.prototype, \"reflectionFresnelParameters\", void 0);\nP([\n Ho(\"refractionFresnelParameters\")\n], Ee.prototype, \"_refractionFresnelParameters\", void 0);\nP([\n oe(\"_markAllSubMeshesAsFresnelDirty\")\n], Ee.prototype, \"refractionFresnelParameters\", void 0);\nP([\n Ho(\"emissiveFresnelParameters\")\n], Ee.prototype, \"_emissiveFresnelParameters\", void 0);\nP([\n oe(\"_markAllSubMeshesAsFresnelDirty\")\n], Ee.prototype, \"emissiveFresnelParameters\", void 0);\nP([\n U(\"useReflectionFresnelFromSpecular\")\n], Ee.prototype, \"_useReflectionFresnelFromSpecular\", void 0);\nP([\n oe(\"_markAllSubMeshesAsFresnelDirty\")\n], Ee.prototype, \"useReflectionFresnelFromSpecular\", void 0);\nP([\n U(\"useGlossinessFromSpecularMapAlpha\")\n], Ee.prototype, \"_useGlossinessFromSpecularMapAlpha\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useGlossinessFromSpecularMapAlpha\", void 0);\nP([\n U(\"maxSimultaneousLights\")\n], Ee.prototype, \"_maxSimultaneousLights\", void 0);\nP([\n oe(\"_markAllSubMeshesAsLightsDirty\")\n], Ee.prototype, \"maxSimultaneousLights\", void 0);\nP([\n U(\"invertNormalMapX\")\n], Ee.prototype, \"_invertNormalMapX\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"invertNormalMapX\", void 0);\nP([\n U(\"invertNormalMapY\")\n], Ee.prototype, \"_invertNormalMapY\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"invertNormalMapY\", void 0);\nP([\n U(\"twoSidedLighting\")\n], Ee.prototype, \"_twoSidedLighting\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"twoSidedLighting\", void 0);\nP([\n U(\"applyDecalMapAfterDetailMap\")\n], Ee.prototype, \"_applyDecalMapAfterDetailMap\", void 0);\nP([\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Ee.prototype, \"applyDecalMapAfterDetailMap\", void 0);\nRe(\"BABYLON.StandardMaterial\", Ee);\nOt.DefaultMaterialFactory = (n) => new Ee(\"default material\", n);\nconst G1 = \"rgbdDecodePixelShader\", X1 = `varying vec2 vUV;uniform sampler2D textureSampler;\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) \n{gl_FragColor=vec4(fromRGBD(texture2D(textureSampler,vUV)),1.0);}`;\nY.ShadersStore[G1] = X1;\nconst H1 = \"passCubePixelShader\", K1 = `varying vec2 vUV;uniform samplerCube textureSampler;\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) \n{vec2 uv=vUV*2.0-1.0;\n#ifdef POSITIVEX\ngl_FragColor=textureCube(textureSampler,vec3(1.001,uv.y,uv.x));\n#endif\n#ifdef NEGATIVEX\ngl_FragColor=textureCube(textureSampler,vec3(-1.001,uv.y,uv.x));\n#endif\n#ifdef POSITIVEY\ngl_FragColor=textureCube(textureSampler,vec3(uv.y,1.001,uv.x));\n#endif\n#ifdef NEGATIVEY\ngl_FragColor=textureCube(textureSampler,vec3(uv.y,-1.001,uv.x));\n#endif\n#ifdef POSITIVEZ\ngl_FragColor=textureCube(textureSampler,vec3(uv,1.001));\n#endif\n#ifdef NEGATIVEZ\ngl_FragColor=textureCube(textureSampler,vec3(uv,-1.001));\n#endif\n}`;\nY.ShadersStore[H1] = K1;\nclass Yo extends Pt {\n /**\n * Gets a string identifying the name of the class\n * @returns \"PassPostProcess\" string\n */\n getClassName() {\n return \"PassPostProcess\";\n }\n /**\n * Creates the PassPostProcess\n * @param name The name of the effect.\n * @param options The required width/height ratio to downsize to before computing the render pass.\n * @param camera The camera to apply the render pass to.\n * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)\n * @param engine The engine which the post process will be applied. (default: current engine)\n * @param reusable If the post process can be reused on the same frame. (default: false)\n * @param textureType The type of texture to be used when performing the post processing.\n * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)\n */\n constructor(e, t, i = null, r, s, a, o = 0, l = !1) {\n super(e, \"pass\", null, null, t, i, r, s, a, void 0, o, void 0, null, l);\n }\n /**\n * @internal\n */\n static _Parse(e, t, i, r) {\n return Le.Parse(() => new Yo(e.name, e.options, t, e.renderTargetSamplingMode, e._engine, e.reusable), e, i, r);\n }\n}\nRe(\"BABYLON.PassPostProcess\", Yo);\nse._RescalePostProcessFactory = (n) => new Yo(\"rescale\", 1, null, 2, n, !1, 0);\nfunction q1(n, e, t, i = !0) {\n const r = n.getScene(), s = r.getEngine(), a = new gr(\"resized\" + n.name, { width: e, height: t }, r, !n.noMipmap, !0, n._texture.type, !1, n.samplingMode, !1);\n a.wrapU = n.wrapU, a.wrapV = n.wrapV, a.uOffset = n.uOffset, a.vOffset = n.vOffset, a.uScale = n.uScale, a.vScale = n.vScale, a.uAng = n.uAng, a.vAng = n.vAng, a.wAng = n.wAng, a.coordinatesIndex = n.coordinatesIndex, a.level = n.level, a.anisotropicFilteringLevel = n.anisotropicFilteringLevel, a._texture.isReady = !1, n.wrapU = le.CLAMP_ADDRESSMODE, n.wrapV = le.CLAMP_ADDRESSMODE;\n const o = new Yo(\"pass\", 1, null, i ? le.BILINEAR_SAMPLINGMODE : le.NEAREST_SAMPLINGMODE, s, !1, 0);\n return o.externalTextureSamplerBinding = !0, o.getEffect().executeWhenCompiled(() => {\n o.onApply = function(c) {\n c.setTexture(\"textureSampler\", n);\n };\n const l = a.renderTarget;\n l && (r.postProcessManager.directRender([o], l), s.unBindFramebuffer(l), a.disposeFramebufferObjects(), o.dispose(), a.getInternalTexture().isReady = !0);\n }), a;\n}\nfunction Rf(n, e, t, i, r, s, a, o) {\n const l = e.getEngine();\n return e.isReady = !1, r = r ?? e.samplingMode, i = i ?? e.type, s = s ?? e.format, a = a ?? e.width, o = o ?? e.height, i === -1 && (i = 0), new Promise((c) => {\n const h = new Pt(\"postprocess\", n, null, null, 1, null, r, l, !1, void 0, i, void 0, null, !1, s);\n h.externalTextureSamplerBinding = !0;\n const u = l.createRenderTargetTexture({ width: a, height: o }, {\n generateDepthBuffer: !1,\n generateMipMaps: !1,\n generateStencilBuffer: !1,\n samplingMode: r,\n type: i,\n format: s\n });\n h.getEffect().executeWhenCompiled(() => {\n h.onApply = (f) => {\n f._bindTexture(\"textureSampler\", e), f.setFloat2(\"scale\", 1, 1);\n }, t.postProcessManager.directRender([h], u, !0), l.restoreDefaultFramebuffer(), l._releaseTexture(e), h && h.dispose(), u._swapAndDie(e), e.type = i, e.format = 5, e.isReady = !0, c(e);\n });\n });\n}\nlet El, pg;\nfunction ns(n) {\n El || (El = new Float32Array(1), pg = new Int32Array(El.buffer)), El[0] = n;\n const e = pg[0];\n let t = e >> 16 & 32768, i = e >> 12 & 2047;\n const r = e >> 23 & 255;\n return r < 103 ? t : r > 142 ? (t |= 31744, t |= (r == 255 ? 0 : 1) && e & 8388607, t) : r < 113 ? (i |= 2048, t |= (i >> 114 - r) + (i >> 113 - r & 1), t) : (t |= r - 112 << 10 | i >> 1, t += i & 1, t);\n}\nfunction Ms(n) {\n const e = (n & 32768) >> 15, t = (n & 31744) >> 10, i = n & 1023;\n return t === 0 ? (e ? -1 : 1) * Math.pow(2, -14) * (i / Math.pow(2, 10)) : t == 31 ? i ? NaN : (e ? -1 : 1) * (1 / 0) : (e ? -1 : 1) * Math.pow(2, t - 15) * (1 + i / Math.pow(2, 10));\n}\nconst Y1 = async (n, e, t, i, r) => {\n const s = n.getScene(), a = s.getEngine();\n let o;\n if (!n.isCube)\n o = new Pt(\"lod\", \"lod\", [\"lod\", \"gamma\"], null, 1, null, le.NEAREST_NEAREST_MIPNEAREST, a);\n else {\n const h = [\"#define POSITIVEX\", \"#define NEGATIVEX\", \"#define POSITIVEY\", \"#define NEGATIVEY\", \"#define POSITIVEZ\", \"#define NEGATIVEZ\"];\n o = new Pt(\"lodCube\", \"lodCube\", [\"lod\", \"gamma\"], null, 1, null, le.NEAREST_NEAREST_MIPNEAREST, a, !1, h[i]);\n }\n await new Promise((h) => {\n o.getEffect().executeWhenCompiled(() => {\n h(0);\n });\n });\n const l = new gr(\"temp\", { width: e, height: t }, s, !1);\n o.onApply = function(h) {\n h.setTexture(\"textureSampler\", n), h.setFloat(\"lod\", r), h.setBool(\"gamma\", n.gammaSpace);\n };\n const c = n.getInternalTexture();\n try {\n if (l.renderTarget && c) {\n const h = c.samplingMode;\n r !== 0 ? n.updateSamplingMode(le.NEAREST_NEAREST_MIPNEAREST) : n.updateSamplingMode(le.NEAREST_NEAREST), s.postProcessManager.directRender([o], l.renderTarget, !0), n.updateSamplingMode(h);\n const u = await a.readPixels(0, 0, e, t), f = new Uint8Array(u.buffer, 0, u.byteLength);\n return a.unBindFramebuffer(l.renderTarget), f;\n } else\n throw Error(\"Render to texture failed.\");\n } finally {\n l.dispose(), o.dispose();\n }\n};\nasync function Z1(n, e, t, i = 0, r = 0) {\n return !n.isReady() && n._texture && await new Promise((s, a) => {\n if (n._texture === null) {\n a(0);\n return;\n }\n n._texture.onLoadedObservable.addOnce(() => {\n s(0);\n });\n }), await Y1(n, e, t, i, r);\n}\nconst j1 = {\n /**\n * Uses the GPU to create a copy texture rescaled at a given size\n * @param texture Texture to copy from\n * @param width defines the desired width\n * @param height defines the desired height\n * @param useBilinearMode defines if bilinear mode has to be used\n * @returns the generated texture\n */\n CreateResizedCopy: q1,\n /**\n * Apply a post process to a texture\n * @param postProcessName name of the fragment post process\n * @param internalTexture the texture to encode\n * @param scene the scene hosting the texture\n * @param type type of the output texture. If not provided, use the one from internalTexture\n * @param samplingMode sampling mode to use to sample the source texture. If not provided, use the one from internalTexture\n * @param format format of the output texture. If not provided, use the one from internalTexture\n * @returns a promise with the internalTexture having its texture replaced by the result of the processing\n */\n ApplyPostProcess: Rf,\n /**\n * Converts a number to half float\n * @param value number to convert\n * @returns converted number\n */\n ToHalfFloat: ns,\n /**\n * Converts a half float to a number\n * @param value half float to convert\n * @returns converted half float\n */\n FromHalfFloat: Ms,\n /**\n * Gets the data of the specified texture by rendering it to an intermediate RGBA texture and retrieving the bytes from it.\n * This is convienent to get 8-bit RGBA values for a texture in a GPU compressed format.\n * @param texture the source texture\n * @param width the width of the result, which does not have to match the source texture width\n * @param height the height of the result, which does not have to match the source texture height\n * @param face if the texture has multiple faces, the face index to use for the source\n * @param channels a filter for which of the RGBA channels to return in the result\n * @param lod if the texture has multiple LODs, the lod index to use for the source\n * @returns the 8-bit texture data\n */\n GetTextureDataAsync: Z1\n};\nclass gg {\n /**\n * Expand the RGBD Texture from RGBD to Half Float if possible.\n * @param texture the texture to expand.\n */\n static ExpandRGBDTexture(e) {\n const t = e._texture;\n if (!t || !e.isRGBD)\n return;\n const i = t.getEngine(), r = i.getCaps(), s = t.isReady;\n let a = !1;\n r.textureHalfFloatRender && r.textureHalfFloatLinearFiltering ? (a = !0, t.type = 2) : r.textureFloatRender && r.textureFloatLinearFiltering && (a = !0, t.type = 1), a && (t.isReady = !1, t._isRGBD = !1, t.invertY = !1);\n const o = () => {\n const l = new Pt(\"rgbdDecode\", \"rgbdDecode\", null, null, 1, null, 3, i, !1, void 0, t.type, void 0, null, !1);\n l.externalTextureSamplerBinding = !0;\n const c = i.createRenderTargetTexture(t.width, {\n generateDepthBuffer: !1,\n generateMipMaps: !1,\n generateStencilBuffer: !1,\n samplingMode: t.samplingMode,\n type: t.type,\n format: 5\n });\n l.getEffect().executeWhenCompiled(() => {\n l.onApply = (h) => {\n h._bindTexture(\"textureSampler\", t), h.setFloat2(\"scale\", 1, 1);\n }, e.getScene().postProcessManager.directRender([l], c, !0), i.restoreDefaultFramebuffer(), i._releaseTexture(t), l && l.dispose(), c._swapAndDie(t), t.isReady = !0;\n });\n };\n a && (s ? o() : e.onLoadObservable.addOnce(o));\n }\n /**\n * Encode the texture to RGBD if possible.\n * @param internalTexture the texture to encode\n * @param scene the scene hosting the texture\n * @param outputTextureType type of the texture in which the encoding is performed\n * @returns a promise with the internalTexture having its texture replaced by the result of the processing\n */\n static EncodeTextureToRGBD(e, t, i = 0) {\n return Rf(\"rgbdEncode\", e, t, i, 1, 5);\n }\n}\nconst Q1 = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAgAElEQVR42u29yY5tWXIlZnbuiSaTbZFUkZRKrCKhElASQA0EoQABgn6hJvoXzfUP+gP9hWb6Bg00IgRoQJaKqUxmZmTEe8/v0uB2u7Fm2T7HIyIrnz88uPvt3f2a2WrMbOvf/u3PvvzP/sUf/N6//i8vf/lv/3v5H//d//Sb//Uq/5u8yf8hV/m/5Cp/L1f5hVzlG7nKJ7mKyJuIXN/hPwqXI/g++zq6rPI5u8z+WqfLre+zy7PrVv9L8brsMiGvk8XLmM/sdfHXal4e3ad6GXPdyu2ij8u/+uv/5cuf/OSLfdtEfvUr+dnf/d0X//t3H/7bf/hP//N/928h/0Yg/4VA/kogfyGQP5Wr/IFAvhbIlwK5CGQTPP+9z5uPeePJSW+yo2+s/GtN30Rnv1E+f5zxof9R/lSXv/nr//mrr3+i+5dfyX7ZZQP07Tffys//8R/l/9TtX7790T/7r/8G8pdy+/8XAvnnAvkzgfwzgfyxQP5AIL8vkJ8K5KsmMVzu1U7p5PA5AXxOAJ8TwPf7sX/51ZeXfcemqnp9w/W77/S7X/6T/vzf/7383RWCX3/z05/9i3/13/0PX//eX/2FyP8tIv+PiPy9iPy/IvIzEfm5iPxCRH4lIt/c/393//9BRD6KyKf7f488fP74/PH544dJAF9cLl98IZfLBZtuqterXr/7Dt9982v95S9+Lv+gF/3i7Spv/8lf/vnf/vGf/dF/JfKnIvLnIvLvReQ/NEngn0TklyLy6/v/34jIt00iGJOBlxAsdvv54/PH5493SQCXy9t2ueh2ueimKorrFbjq9eNH+fDtb+TXv/ol/vHyhX4Fxfbx7euPf/Lnf/PfiPyeiPyhiPxxkwB+fk8AvxzQgJcIrGTwFsiAEXH4/PH54/PHUgLY7whgu2C7bLqpQgHB2xvePn6SDx8+6G9+84384vKF/IPu8iVU9Y/+7C/+jWxffiHytYj8VER+X0T+oEEBvxqQwCMJeIngo5EI3goIwVMIPn98/vj8ESaAbbtu2ybbvl8u2ybbdtluSECA65u8ffqIDx8+6G++/VZ/efkV/sO261dQXP7wT/7kX8vl8qXIFyLylbySwe/dE0CLAr65B/9vGn0gQwRMMqgmhM/J4fPH548eAezbZd/lsm3YtssNAYiqiogAAkCvb5/k46cP8u2HD/rrb7+R/2/b9Wu9yJe//8d/9Ney6S5yEZFdRL68/38khG/uKOCnAwoYkcCoEXwkEgGDDq7CeQfyOTl8/vhd1QCum26ybZtu2yabbrKpQvXue1yvuF6v+vbpTT5+/CDffviAX1++1V9sO77WXb/66R/+4V/dgkbllQi+aBLBV/dE8LWRALwkYCWCNyMZXElkwLTMeMkga/P4/PH547ccAVwuctkvdxSw6bbdtYDbTfSZBN7e8PHTR/3u4wf55vKd/nL7DX6mu3791U9//5+/gkNFZGuSgZUQvnKowKgLWLTAQgRtEniTuEfwaELw0MJvf3LQzynud+53uG+X6y3gN9kul+2y6XVT1U27JCDAFVc8ksAn/e7jR/nN5YP+avtWfq6Xy9f7Vz/9w1dgRYngiyYhfNkkgzYBWHTg44AEMmqQUYQKOmDaiCIa8TmsfmzB+DnZDQjgcpGLbti2y3bZHjRAdRMVvb/dcYU8kcDbPQlsH/CrbddfbF98+RPZfvLFnAQeieCRDC5DMvju/vmD4JkEvjRQgKULeGggowdHkAHTYxihg89vu88I5UeGAPSOAFTlrgPopiqbKPSmCKreUoAAkCcSePukHz590m8vH+WbD9/JP335k6/+tA86KxFchv8jMvhiogE4JQm8XhfKqOAqx5qRPyeGzx8/cgSwbXcUoLJtim27C4Oi93+4v6VxQwKAvl2v+Hj9pB8+fZJvt4/yzfbF9lPdv/wJnsE2BogmyeCRED40tGFvksIXiSbgiYSRRpDNDZ6BDI6ghM+J4fPHeyKAO+zX7cb9t4tedMMNAQju5V+f1uAtBSiu1zsduMrHy5t8ePsk3376KN98sX/xE5FPAnm7/782o0DiUINXMkCXCB7/P94/e87AWUmARQWVvgMuKej9t1RLBp+Tw+ePgwngsutFFdu26WXbbl+rSvdfbnqAiuA23QcBgCugV1zl7e1NPm5v+LC96XfbJ/1W9y++fgXjA3bDYXV+MuhRwSPwL3JLMFYC+HS/LU8HYrGwIhwyNOF12SvgM4SgztdifP85MXz+KGsA2C6X7aJ6bXSAOwrY5OYIqGy3d5uq4P5GhABXuV6veLvRAf10fZMPb2/y3b7vX7+g+9v98/WOBq7GG7RNAlYy+Dgkhhb+Xxp0sE8IAC4SGAP/TbgVJK/PoJPBnAiwPKxsXfbbnRg+i3s/JAK4Q/4b9NfLtomBAqCickMBjy7BuywAUVyv8na94tMjCVzf9KNcLl/0SeA6oAEYb1i9g+FtSALb/bKL8/+t+wxXFMyswqiHoK4ToIgKqslgpg1qUC0QoYbvJZg/B/q5v4szHmPX7YEAsD0CX25OwEUVm9xag1+agKg+nxQArnKjAtDr9U0+Xd/k4/UqH7bL5YsewrcBBiMJZPRAp6TwQgWfjM9vgRbgUYGL8AvLWH2gqhesCokeUmCSwPsnhs8fP2YNYMO2XeSmAWxy2VQaXeDmDIhApf33rD4PTUCuV+DtCn27XuXT5ir8VmCJ2G5BpBM8/r/dEcJb8/0lEQMtJHA5TAlqNuLRhJChhEpSqFabH3di+G1AGj+W1/dyAR4IYJNNnuLf6+tWC9CHHiAtFhAIFLjK2/Uqn65X+SS67aK+3QeTDoy/IG2ogQ7fb/dAtz5vBgrYGqrwNtCHsVfgIvwK07OTQBURVNCBFpKCOjqCHn5L/67TgTN+fpySAC56nwSUi256kXsSuFGAVyLoUIDo8/Pz7fdoErr/v17lk162HbgHvFpIYDfoAJJfW4sGPjkU4VNAF8ZEcLmLhdc7kljdY1y1Dq9yLiI4IiRqcLujb138KIPn80ejATwRwIbtBvn1cqv+2J78/5EI5N4cJA8qIPcmwRsKAHDF9WYP6mV7VmrgLuTpxYTcMEW0LAmoQxFsuvAI8tv/a/C5fV2ZMMiKg++FCM7RDPRu8ebWY7VG6VJi+Bzk35MI2LsAckMAgwvQ0gC5DQjd3ABg2HQLAPpEAlZ1Bu7VV7MGHDFRAbo3VKsTbAY9sPWC/uvx86gBbDK3D1eEQS8pbAeSgSwmhepnJb6uBv/o/PzHLzxWA/X7TH77De5j6AGQi6o0CUGfCOD2X7cXAlCFQABtEsGLDtxuOyQB2UTQBKZe5GUPXgkUYCUAbZJRhBDeuq8xBf+bgwbehDm+BFQi2IJksOocvA8ysIMfxluVcRsY/eB3JzH8GFDAXQO48X/dcIf9jyDHptIigDsFkEe066tBSETQUYF7ElDdYEBytN4+rk9UcBPfrKaZqFHWcw3i4J8/X4ev2//bSXqAhwTay6OEIPLD2Ipt8OtAGzxkwLw9WVFRjTc/qC6H3+YK/b1oAA0KuOizHfieCLaHHiAb5NYTIC9EMEbZrVEQt1xwhVy1UfBh8PUOquMizwaap3tQXfY5B//tea/NZdfhsvbz+PURQTDSGWB87VX/7WSd4KxjUqrIgE0IUkoKGnhIvwvawpGf6eECXJ7tv4qbA7DJgwpsKthEmmYgfaAAffYF3HLxo0vwNjJ0SwRWMG4db4eh1gPNm18vQ+us/0eGmxDemu/fnM/X4evq/8342ksGHgLY5LyT/zg0wM8lcMjgGFXwqIOVFJBQw99eCvF9oZL9Mfl3QwAvIXDsBRC9R+fz8x0FPBLB0xJEpwUobrfAkARgIAF41h3wQgP6QAmX5E/7eI43IxGwwf/moIkRyWRJQIPgt9CA9b39nzt4bYUWjAlCjWDPgv8IEjgLJfzuaAsrv9VdVG4OwOXW/fdoA35qAdL0BDwvf6AAUVHd8LIEu94A3K+Q+2YxaB84MOH62P//qoo38fCRDERE2zf0JfmDa+MieElAjcDPKz+mRKCOtdgGtXaBjgNJ4H2owSpNeAW/rRH4CaHSpMwnBYYycjgSJwfie9CR6mPu20Uv8kABF206AvXlBMiIBPSlB9wjBW1fwEuSb94296VCqgMaGCt/G1BbExi3IG+r3a3J6P48Gv/J0YmEYoiGY7V/SxwFCwGoE/xa0AJ0CEiV9QPCJb1OJ5F1VTjEY2/MO9AEJvj1BJTQpqLfTlGwjABuzT962e4IoKnyrdh3+/6mzDVJ4PHOxj0JqGKoy20+wBMN6D1gLWi9NQHfVP5MEEPzjGYy8BMAOnTAJgEr8HUIejRo5xrA5xkR5AngmiSHs+zDDAmMgWzTg55GSJEmHE8IvWPAoYTfhWak/Wn/bQ0CGLSAjv83SUEfKp5q24LXuQICpzrjrgWoza8xVE00CQCORdhMJuTUT/rjuls0gO4Iby8BIEgK6gS7BsGuTtDrScH/fR68biUHNVGBnxjeNyHEvQe/ve3LZQqgG3rof6cEclsNflG9J4KtaQ8WHcVBHS1BtHE4QP9OBMS98mpbKTeDW7dJwRsnHpMBTFJpV4I+b0kY/NqInVFSyBLANbnMSgBM8F+Fqfxq/h657/Up+GaBnwV9hRqc9bZ/vA6vu+T9E8KPJWns94UfTeCj2QXwCHS9dNL8Xf3Ho/rfewSeFODGDV69AU0y6NFAE1DP3qK++rdB7/1HRxf86gT376zOr99T/h/ioBiXWQkgQgVeIrCC/WomhDmQK+hASI2ARQZKooHMLdCJwGEBBXC3+uERwg+VOHZ9ioAt9H80AI06wGgJ3nQA3BoCut6AhxYwgcPOFnxuFnrphk+NIKIGrWPQtgz3b0i7Y6D5rs1GKqTop0nQX52vmQC4BkjA+r4a7Kx9WLENGeegkhSETBCrNXIMdi/444Rw1n6E96ry7OPuj8UfLxtQ78NA2iSBbg7gIiIbdDLsb5agPhLC3RkYKv8NDbS2YGsatNRAG2oQwf9ZIOydgy1MAzBkAw8UwEEIDzSAqdPQ6za0PkeJAMH3Z0wXniUSZoHvBXU2mcjQgv56TedIKglCpIoQfgwCIjOytd8WgN0bfxoR8Fn9Gx0Aj5Zgq0lIZbsH/ibSJoFnS+C98g9ooHEELI3gliy25yONIiE6pb0NfBlyNEYyENoodkKwgl6I6s8kARgJ4ZoEfuYWHLEJa0LhSBXm7kImGeSfVdoJ1DO2G7WXsehAptupSOoyrCSF904k+6vt98X/ZcM98Hsd4JYIXhQAIg3/f9AAUYhsLQKAtkHVBnzjCKhOoYl2ym+iBtvzDzQ2DLXJ4PUmbJHAVnBQX4jkxfvHhNDqAdHXGQJgv0aSDGItgOseHIU+K9hXnIJzkoGlEKzNHagTdJ6VWEUH4iCKH4fd2AwDPaYBm4Wgng4gQ9V/CoGiuNmD04AQtNGMGzSAAQ2I2pzfogY9LRh7BrbOh4+D30sAencljFu2CUFrwY8UAWRfWwGvVOVfbx2uIILM0pwDv082dUTw8hYs8L+uIWiHGpWgClnAa1lMPJogovvvbePPs/q3Xr++kgCsfgB5oQF9WYKPJqEn6G+OE3i5AqouF59FQOmahQC8rlPLj38kg1c2f30vw+XaoIX24/pMGIgSBoZqoH3wo0sIIGlA9PWcCPrAtpPB8eBf6x1o6cHra+2+tpIFP4PgBfxZtZUJfo4qxELT948D9ucK8Mt9+ccjIQw6QJcEbrD/1g340ATuDgDkFfx6twSf1f9xvuBECYxq/7ythQQGm+5JDx6Brw4CkMGT3wgscCUoQ4sU2t6DR2ciBjTgtcpenQoZVX9NuL4Owc+dVaDursYVkVALX+shjSBKBuvCYDUZjE5BdNkxdHAUBexyHwB6NP7Iyw7sxUDViwge1t+mz8B/LAvVx/c3PeBBCToB8IUGOgqA3iV4yUg6UAOxaUFHDx6CYS8SorMOue0CCJGAf5YfRhoAI+A1CvwxqNkAY5yAIx2EQmkFfeWOXi+nEdSQQA0ZHMEItiagJArQxDXIrj8nCfQi4HZPAttrIahso9oPQ/2/JwV5JQU8zw+7I4D7/sBn4EO6rjw0FR+i3Z9fHtahzsFvJgM0X+tmVH5vaYiNDGAigewAz+gyNLThnjCURQFR1b9d3lZvnVqmj9mEPDKIUIC4KCCjBXywS4N+otp/Hk3QVthOkwEKlV9PQwXjT7s/zwF4Qf9toAAzFdjuaEB6S7D1//U5FIQu2MevO0rQQH8ZmoXE6B/IkgE60XCjVoq8gt2iCG0S8L5GdxkM1cGsfsCMArSCAnrr7dzAZxCEEpepvB8tqHJ/q+bmJGGts/AcAXFOMMeTwC7Pw0B6CtCtA2vWgonqBQJFSwH0JQK29OB2kvgj2HHXAoyeAIsCQO0kMNECAhFMqCBf8mElAkyBbX1tJQP2RJ/ha0gpAfS9l+/5n00CkrQpq0MZbOdAuxmMvHswog62jZj7BnYQe19b14kxNq2D/ehX/p68HEcF+x3yP7z/V/A/q/5DA3i5A/dzA5pdgbKp3v3/wQF4Bb70WkCTHGRAA6+KL0bFl6FJaFw0ImZwm6igSwbbwPn9RMBWf3sN2JgA/BVh/Rg0kQBgePf6HglAHLFQwqQQOwDjbdVxNZjR4iM6Qa3WxwvNxh0JFb3g/WzFQQS8b/ttKcDWoABtUMAd8j9hf0MB2uDXhzX4CHj03L9DBU3Qjz0C0l4mLSLQPicOOwZoVCB6P6dA7nDbGkVuxcNr8PU2JQO4wX5trEqmccZaHU4q8oCDFOpzAnOwqyMIMktNNNAHouDGxO37DgArQZzlmp/14W1QlqHTMaIIx7SCx0+5yza7AKJ3IXBrNAHVDcMZAU/BT/vgv/ULPOA+XiLggAREDF2g0ci6xNDRglegd7P7TWWH5oJfayliEg7bScQRBVgI4Ookg/F6rvpLWP29swREqA3CaG8/FpKqS8DTAV4TiBqIqtxfzaQRLys5I0XEFIFrPbZRQb+16Fgi2LvJv8EFUPW1gGfQv1T/F/d/HBnccP7rAwnIIyHI4ArgWeGbU4eHy6Tx/EeTZIb5bo/BsMBjmjBE08f/RB0PHYBd9eVRAGY7cHRwiBf8WeCPHY1bgBTa9xKTELzEkQX9CPtl0gJiqsAmCT7I8xbjivh3JGFI+D2nBcSJQJ8agDX+O9iBL7UfG4bzAkcaICrbtYHz1ycSmGmAjJfL3CMgT3tQpmrfB7gxSzC1DnvdhQMieG47u75+kTouKNkM8c/+vq/Q7ZYjO/hhVvRq8F/9gGfhP8aqE9EIdR6LTwJ1h0BItyDqB8iFwuNqASscRnYioxOg9ApvnYA35f8e9Ohbfe8J4rknoFkO0lmA2gmAG0YK0DkB4ieEjiLoMD8wBzom27ANZkzIoU8EMHk/uo1mzeVoEoRWKn8L/62EYAX/lsB7D/LXg74uAMr9oGivJ0CNJCGD6i9DhZdQF+gtOp4S+NODRzsDVbhdgv4BqTMNyIL9SCKwL9/FGPp5oQKxIf8A/UX6r231H7YIqLML0Ae2GtrADOvRQH5b/MPE9dt9BGLNG8jVTAQvIaK5TtvvvWQgDvyXIClUA78S9Nfg7VtIBlO7cbsEYkQDMot+ygQ7QwmOawTHnAM2XUSnJvPIYRYMmYPS+sv3J+cfP3d04JYIXsF/EwMbBKB9Q9AY+BiSwFj9mzrSXmcJhFPVHySTbgHJCPvRQ/z7G/SVUETsg0ZF+i3CRoCjhf7y1A9mOiDD7TwdwEoEXjLwAv+avLE2B7Jnb+OqDpBoAchoQJskxKnss0vu7Q2YhcDv4ySeLOg9GsCKiUIihP7yfW7zbTsBh0TQfN0iAWn9f72Z56/Ax9P7j5OAH/Qvv3/QxKfk0DgDuP+R3USg3bzBC7bO/QT9Eeh9QvDPG7glBQzJwK740lAFFgFk8P88CqDGAa223YckWYhr+c0BPdwetl2ocnsfzePAWcVnnAIp6gDVhDLyfV4nqFEDPxHsbWD3k4BDkN+pARqKMLYBPzYEvxp9xmCHQQdgWH/9EtH2TIFpu3AH/cdGydv1j0TQbRrq+D/mLcX3ZACZ15bF378CG0My6Kq/zoGOQwhASDFwFbxyNGBuSxbCEhQ/uEPe/6gAERWQObCVVfjPpQX+rexxYhYFxIkgpgX7Y/vPs+Pvxf9vwt8kAs7i32t3QCP+3SPaTwIytQXP38u0PESm+YER+o9B3vr8mETAUfDrEkPI80ck0FZ0dXh9U+HRbhey0cAc2H7A4y4egoD6y8JfkBiigLdFP8v2W00E8deT2IeAKujZ/QAVKpAtKI20gLWksHedfgPcb+0+NEHefd9vB9rayi8h7J91gBbaw20MsnWAF5xHkyDUCOoXp+yrOwwxcKj0aL6fFppaaKDv6OpHR5sgx5BAlK/+fYhuP1D196o8e7lFBaKqv5YIMnFQpd0FGVR35RJCnCDaABaXBtgbiSwtICMtalKC+1JQ6bx/PLcDPQL91QFodQNKpwOgF/9eqcBxBBqRcKAAVk+ArQOMx1RYGgB6naDhlK+uQQwJYx4meQbxtNnYQwMjt/d4f3M9ZE4UOld1LAh99fbfzOxiEkKFCkTJIUIMUeVnJ/9sDt8/e1NEJOi9oVHDGYhgnSLss9DX2IAqw1zALUncKcDr0FB5NP+0cBQNrEezDiyiADPkt9qGpwoPdL0AGPx/NOKeyf3b9WJNdfcFv6bKd2cLMJVfJ6Y3B6wB9WFUfWWEwKMfGiQL+3bz9XGQz2EHKhF41GCtZyDi/gUCsNhYoAr3UNJ58YidHKqnMb/6AB5J4N73/4L+t7mAkeeP3P+1LNSB/l0SkMEd8DcEuUlguEw6t2AU/PCE/q++Akw6QFf1u6SBrj1ZnnhG50AfkoGIdf7gJv1KcSfgzWWkQ9U33Z3tHXYASKJ9e/YhU90rvD+q9Ej69/wxYJVs506Eg/r3DkMDzEdDBRGgcZay49XihLA30P+l8N+hf1f57/0AoxbQbwYaan/rBMirE9Dk+sBzTkC8JNDEUlv5McB8PP19Y01Gayep+hC/2zvQ/2HGLAurowsNGlA1cnqGGzeH5weiYLZm7h3QQC4O2tXdhvMMk1ZS5ebpgI8eMrPvPGkwaxayk8Yc6PMOBPEdC1XZ+2UfbfOPtxLMQQAG9BcZFoF0gp/RKjxe7+oAw9T7ZPWhgedodgz0gf5KBtrtIZhQAZpAV1Bi36w6t98qVfH7hqGI318lLCjLCUFlxRHwqYEH9a2qb4XjWvDT7kBwfbZA5P0+PNuRuW1yf4yNQH3zzwv6b70QOJ0G9OT/dhoYRUGT15uQH/71MjQLtQlxfDuiCXrtM+SkA+icQdH6sU/xz7Ze7FlubV4TpoTQ2osdpaEjtqADmEU7OkBEFoLeC3IWFFeswJXKXzkboNL+wzcFHU8hTGKIboO7CLi1/P+5F+gydQhuvRbwEgxvtACmANikhLTbj0gCYk8KdlYgmj+4Ymaod7TwahwadICuX0Cm2fE5iNHPK0x/CDV66Kyg1MnqjNFBnhBoLQCgUULfaVe5nq/6EQWY67bXCszUb+7232fVPz51iGB12owK9peyP1T4raMFF/OEYJP792mgXYfZ04GHMAhBkCSmSj+dKqRPgVFGHbpLEGMiGFeQWfSgrY52VxaeDUPSNJI0P7NoisG729HHl78z6hxfs9rV3m4JjgM/lsui2qmThjCfDFSb+I9vwUqG5wwL55U7C+6ot8B+7N2o6r3q37T9trfpjgmTvv7PSQATLLeRAOZhIJHBQfDQQJPBdUwEbVW3+L08EcEE/9G4ANrCeWcnPKRHDupbNynMx5AA9IRYLmrc/YLSiD5EaEBS/s/TgnU9ILcH19n+CpHwegLejx7Mn/d25fdN+e9U/1vgb7bqf08MOtf8EXxaoh+GY8L6gDfhvs4i6HQ7seYI2sv1GchdMsBIG3xlvxcCRzdgCPTn+6q/TW00VE8Q9FaFv+R2VlOM1vm/hhjhDCdgNflVKME5B47I9xT8z0YgPAJ8myb/LqHy36j/Mwqw9AALxuO1JVjiuQAYLcFzIhiEPe05fk8tRjGw7yWQbsfuLAT2VqOId1osnr0F49VM8INACPHDoBz4B5mqqSnUgyh3ArjXxfQH5BbgUS8gP7aU+w0zHD9GGD0CGHf+P1p/DeivlhU4BbxR9a2kYFR58YaDZCUR2P0DMmgED2eg77puegy6PgDphEB0CwlG/i9d+/Hs34pBEQrBn0W51mqGnJAk3ACCHeiqkQ1XFQA5AlKH7Lk8yJKWY3/nym14h2C3JvxeMwD9ZVMz0BPMi1n1RbKl1cYhIVblF3G0ATsRiCMUvoK9//OgcwYMoe+ZKOLlC6/Xk50br9NFz9fanqA8UIYSpCwlBO4kHc4WLLBfBHVaKwKgLQjmP4Un61Vq+3s7Bsyi0WztmLjJwJwFeE0I2vD/1Q6MVwefxfUf32skCPbCnxQqf+QMPEUDHZ7vGeyj020JgkPXXwsldA7SYR1RE3h94NvNtugswcgxXEkIcBPCGZ1rmrgDC0A4K88nm2fn/eTnpQtWyZfybRoK8Dro4zYDIMGsf7saTBzvX0SMbkAD6o9CYbsfMK38cJKD9l2FJt9/VGs0h5Gib33pxMKWNsigFUh3G2un+/N1WUglI/EEx8fq27vUNnwsiOoKecL7kQS8VnWAGCFUgn6dBtQhv40CmIYggwK0uwDHRGAuBXVdfwzHUjZzATLMAoyJ4FmBhzaWBlrHld9CCWpPHRqofBqMReMGTJ78q9rDes1Tv7/0m0v0AFHXNR6P6g30SHivin7V1BOhh3iWPwvps/yE836L2XiwnUT8x2iHgfqhnwn667QHEE8oLQjEvtEW7GYBZDrDVkwNIO4G5GiBDf9fGoFM6n+vbEtzXwP6u9AduaWnGYSLAlVdl/AU+ikrSeEIKgwdaZ4AACAASURBVKj4/wtgHcHtdO2nWKcBkPfxcvnNQvsj2Me9f02r76T8q0IBn9OLKfz1HX8yVXQYGoAB/2UeBQ5/5kCL6+H/OGGoRnLSwdd3oH8r7KkGTbgIxEwVWvnF8KOpHnyzfF9Jod5Px+IF1h8owyitDw/XEgRb5bPqbt1uvn7qBIQ16vtS/u+DP3cR7CH0WWJgd5mTJKYgNzoGjQrfvu99NDBC+bnyW1x/qhTatv2OaMKgJWPvv5kwnMgxHYGFRtJW8VMl3uP+MgoqSZyWFKr7+KIDw1d6+IiOgZI4+d5iYL3imzbgyO+tph9t2oSBxOM3ugHtPoFZ1LM0hF4kXNEBssvVgPdjdXZWK7uKvyS3q1Xb1WQwtVDqSUggq+Vw3t56JA2cz7PXOwGNW1ecwxPhfe3QEUsDsFaAz8jg0nf+iZMAHNg/XSazDuC18Iq1HBRrOsAQ8NLB+16g614jmuSgs3bROxE55D+WDDQNA4ivdMJ9M1b309UqknaDU8ObV9/PwmMPATvTMAxpABLBzugUtV9bLdhNDQA+7B9tQJ06/7QNDHGSwtgZOCIA47InIoDdROQGtt0U1HI3GaoUnCnC/rzBMQJteN17+VaAzYNA7e+PFqHQUyXPUYB7iQYa5ZFjq1Zqpx8Uqu/XT7+6BWC1Xaj0GlBIwMoHu7UzcI/6/Acb8KIq+hzmGWmAYnADrIpvKP7TZeLaf0LAeQkGgebbq9FToI44p654F47tekKkI0L5PQNZPsDwPBpy/ni+wKMN76Vav4+2cFZFf8+JwAraMt0DFB7beA/u4Zz/a+RXx0M/ct4/jwaNAS8G17eSwmta0Fhx0VRxJkHMivso+onMXr+YwdWKbgioy1jp4x4AzIKg5lEA7wvHEYCRmdx11TAuT6lDLVl4KvXkAET9P4RT8H2u+lg9EPQIpw+/NpJ7RwE8HaDv/Mu4f3OdNkq/EfAiEiOANjEALvcWL9gfFV4NZbgbQc6qPky4Pm35QZxtH1f4j+P/jXuaYPcWwIEH/fmEPBoAO4m4LGxV3txOQqDU+dXgey+UwSzuqP++uImO/u/6ogCb7wTc1n61sL+vZi87rxnrNas+giTg6QLzaUCjIp6JfhwtGI7AjBBB9JjDY4ePYVR6ZPgN4owVv6Q2N5hhVHwNeYrM+w6dN6K1sMHZm/Ce7bHe3dzKr1xw1w4JrSQMZtgnoQHlr18fzunAszD4qurNUg/TDqzx/lfCaO6t4tACMUQ6P6htWjDPC1hCoZ8kpODzJ70MUR9AODcgwyqyPhmE+wfHYB/hvSqt6qeXUShhXH+d9SR8DzrDaZZdpSp/HxqLMQuATgDU/qDPRgOIeT8cvz/h/XC6BtE7ACLOWPE0KIS4UUjmZaJ2grBphiWgT41BUVWZfP3AnEIT6OrfoF122l2rMycBoU5i/OXoUZ4/aglsXwLzHNU++FVF3qikOj5HXm2PBitT1WuvJRAB+6O//W0/PY8vQH5IrAsMs/WuVmAdHBrQgrbOxJShXwRSsu08h8JMBpo0+aDTALwV4tbswgzHrftG/dJKIAQb5h9KCssWIMeto+GYqG12/HWGjx8kzqNJaa0noMWOr2KwW01AMwJoNvhMQda2/RKQP/3ecABM3g9uD6BY68Ntz9+nDOMb5iV+hIE+dP/Zs/wwJhJ9mgBnohBuStABUXjugF3hkXF9ZZJAjefKdHZCc389LoStKvIl7QIEb1d9RyciQgFDI9Cjyccc/23Aam7/PZJBhgDgin5CtQvbCzX8ip9YgIFtOAt+w0owp/hOiCWgEGbVHuYjRigPGR/YOnEoqPDoV5z5YqB3mRq2ox5ICmSSgAP1Ne+XV2NE+/vuFbCTRADxtS70VRBCjgBk2OyDUQiUgfl77b7DwaHm2rAZ7osRSOOUoHgKfNBSLI767+oDYrfwZvqChSpGfj3pFwZFsCJg2jeIQQBUiyI4WgD68ww4qO8khuWkkIuDrxWv2nv+UTBpJYiPd0KemTA8qqFiuUF1jWS3BoG6pADJq751JqBI0wvAVPyMQvjcX1zbELltKK+zBiXRFiRxG+b7q3M9xuLdzR8g0gCGNzSM5gNYfqGO9CBT8OHct6oB3KsSDBisUnwsFuISQaRHxDSv0vptt2oeLHMERfRn/FG/Cx01EpgIQG8LP+/i37PKw53xn6sYCM4/JwSRrCnIeB1ZkLsawDhaPKv/njU3wnZ/dBdGE8+YTHSG8+ofGgIjsC19YnwdM/KAnTSsqj6ig7uGgIPw3nYFzhhIIvriAxFP9CQd4HSlnzgxONIdrE7A8ZDPx9fjib8ifgegNIliRgdx95+E1T7+3nQVNNhEzDgGA3T2rEDLduwtPpuuouPcs8swwXFjdTaMKt+jA5gUAQPcf95KJQxYU0cYxEDvsBSmYuukp7AwnqniC9Afa5z8vboI68ImT0t26CvwBzSggkj447r9IojvCn7U92J/Hw0QSdwZKNNjxPCfSxRqnATkdwpOwh88oc4J8KTSm/wdbZjrc+4iFP8YO0/5JJDCfaijK5xVXevqfg6zGRrQf83chvX4aRfAE//6vv5+6490U4ADdO7QgM/5bcHP/n4OtCQhBEFeDWSvos8DPq8/IwzLzjpa8/U6MMSkBklDm8e0mn3QIY7XG1Om8wzN48y7HwhOK3P0/ZwUQHHv4psbdoVeb9VlAjChBCdtDDpOKTh9ZfcagOYq31RFjN4/gwBYzp8lAwYNwBELhZoxECeZxMlAzWGdCRV0fQWGHo8+8Kx+AAxnCIzowAxy9KvNepWfsfp4RR9kUrD88CPVTuXRybhqqTHcnxEGndsgub1Gdug8yz9fHt3Hpl57x/mfCOC29FOSQ7/noAZR5W3Ob24UMpuPYAYiQrQgk1gnFoUIKr4vKFpV15pHUJO3Y5rfH3UFHU4bGkU+NKJ9f2hJyOMxDBDpjAgwiYqvk5TqNl9EH2Arb6fA3yaA4cBtPWewhkEcIQJBlGzYp6zRmr1v+e3Fv27xpzvyI44NGDkCIi7CGNV9Dw0M8NtHC2vUwHINumCGNG8erxOwtQINsW88Tlwdoc+F85nI559ngEDpt2F/Uu3hiXYrkN/pBFS26hYDAkFgErMK67y9mGBA3L5ore5izf8b3n805MOq/t7XU4WHv1DUF/5gugCSOAIW/59uMwl6CHWAib8bvfxWl9/rBGEMTTwDfG+ezEYG4yk6FvRPuPwE+wvc39IRjENWM+/cm5b0W4Pf4WuKUnw/vD6eDbB1ETs5vl77Dhnm/51g6wPWwQAqxnivgQaeS3gy/u/1H4hpTPrIgHAN0mSgXUX13YP5PMIuQAfBr/f70cdeE+QoCX3i8nFMLcAjInBoAIYqt1LhC1WdtvmSab28AYffaeivCB+ohdYQgfUa/WS4ToMsNLHLc9nnvPZLwn1/EefPVf+U/xvnCVSEQEkEQEnEQJO7S7RvYDxNeNYKrG7DKMhtsQ8cMmhgPKKKj+F7CiHYFR5KIIPxOmg5IVAtu3ACQSPh7CzUQOgAej5CWEkIe3vgxz0ROGO//qYfz/dnLT+ZxDr4QW0eNCJBorCFOVC312Ec2TiY5Bk0cAaQmiA1VH1MOwDHQ0kHdEDDf+2UTWhS4Z8diQMicLx8MLBfverLcP/jQzF0P8EJj5+NGK9RCz755S6F/f1+X/gxeP+Wsedv+vF8/54aSPJYFjIQd624MDz/UDLQnr8HU3ztKHRf8Qeno1vyAQJBaLcMtTV3cvgP56COCqd/QP9xLgBkH4BxO13n4hNUDtACC6G1S3zqooZ6Ba4lp/zcAFb7iERKQwQcF39IFJjdXECGADw0IE4gg674pYAnk4HoHPx54tD5daO5vxrugSkMjgiiqc7TVKAT6AT8R4ckbHEQCYR/IZBxJgA+XZjsR7vaoRpIxWqeqfXuGC2CxwudicwePEB1kNkaZCuwyF0DuKv/4sz9mzP/Qxdg3BDkBTMC8Q+loD6UGBzx0Kz6eAX/KArOQTlPHFoI4vVtf4rNuLrca9edRn4xBP7k8w+9AgZCgBfEUZWfEs8iFNZ3UO7TqmkjCO/rWdgco/yIqHcQWaC2EGTzgz5y/iXQAvyx3riyxxV/JeBriaGB9OrTA5g9/eokM+37GszqfA/UZk9iW5UnCtBqBl3XoNN6Ag/+zy6A5evPAp+TIFDn15gQw9rjrOzFX0s2JBVAxa/nP1a6AsNWYGjPNGPLTQgBsNUFvOA3Ht9o/rGDN0tWOCcxJGp+f7++kkP7PxcGv1+GjkaLt/fawpwwerQxBJNW4b+PJsYEgiAYYdEAGIlDNaAbRkIgK3ut0jKByp+8yz23X6GttmBmjwDvChgiYLP5V/zhH6/110sGcKo5CkggCngxnIPoPja0j2B+1BRkiYJiviaLJqghDI63G2nAgAxMCuDdnoD0wIQm+urMB3VuAwbBrFGgGgnhAFqg9+ujKsLxB3qGCQNEEtPinIQlAj4WgIw7/iXc9V/x/yUWFs2KH504bAh4aYWf4TrTLGTy9YbftyLeVOWNfYNyt/ji29mQnqMAltU3ioTtbX343yv/1u0YPUBz6zB702tQucnX0gWaFh6DgPdmhXaapGotw0SFz1qDiTMdd8h45HfcqCPRUhA3+NmKz1l9teCPaMd4urGaewRitNBDdahR5c3AfQmDCFT9vmtQEwqAYXX4XI2n23Z9B/Yb1FL+LWox6wHGbZSo6FR1LzyG+3hriSZvWT6jfXhl2cmQZJDrAbuYAqAHo1GA/EOgD8eGcU7A8eDvH4fQBuAhBL/Zp/vamPTrRENDGLTV/7E1WEPLDlP/PwzU4YhusIMUgfIPAr6Dhv5R4y2r8ldFwiFoYHnmr8TAHbhRQSZOctH598ZYhqt6wP7q/ouqe77RJxvzFYaji/z4vna4v5cUMDXqDAJ5ytktqtBDckyjvJg04hl16LB0xFfyMfD77PZjErGQRRjYIfSvoAXntks0ok8MsUC4KARWnYPlJBeIgLeFrUgDOHYCag0/XNAbWgRwQuLAsaQwIhC1g7+jCNKuT38JfnYSyTi+QQEwwHeT4/dWHYxJPxfOj5oAnRQqgU3YgGZSOaDyK3n/qkDYBKptzR3oD6B4fyRKjp2AzSl80YR/3P+/1vBjX18Jbu+YsrMRgbqPP8zrDLTAaupphfeZtyPs9BPztpLSBZjowF3woYRwBwOWaqbev15b7X4RWsiqYiY6ZkFEIoUwUA2OrkeEQE8HYNyD/rl3m88jCGgO/nPW3xy8x4Q/HBcM1dYg5q8N+B/SBSYhtD0EY1PRGLDoKIBHF3yLz4H/gSYQJRETgqeB2d4vC8L2NVnQn4PoVJJAcP0inahAfdXVI8CFszjRagCTtRdV7Sr895NBpRKXIT64RMFw/iw5eChhEvmmyUIH+k+Qu3cLzOAN6ILlFvgWnx3YWFDz0f38ze9GlfP6UQ3ojEY0gtqRIEbA5/WgQFhsEuIeL75uTzvqHktAWfj/OD6sQXssROcGiRgFn0QVkld7OznMDT7CJKzhMIqxW9B+LCOQdH4uyxIcE49VTSeLj0wKjzcp2oDXQA8YoDEGBLMW0BJw+eAxXejPV/IXd59/tp5rVyYXDw5BlRetSpQAcvgfOwVM8ObzBq/AQ2wX4lwkQV3vNhYFfn2LFgaoDU1ogqsfqGkJYmrj9Tr22KQwBLzbLuzDeA9yzyJjVRfwegWq0H+FThDPA6ZhZwX2M2Kh4waovCzAWJTzD/qY00c+6PM8coz08VNqglzx54LfHuTJK7z2rwX35ABLg1DzsZ7Qv7l/f2yXDlbf4C/irg0MJ0aCuD0wP74MrxfdFlX7tq+vtRdCpvt599EG9Yz3V+P+Oj/n4zLruZHcJ7oMt/MNp9eD6HEeFb6/TMfbWo85Pb79HJo8t3371/PuIAZqMvjPC34nVV6ZB4hEuA7AzA5cfU0y2n6ux89D/35/n2/vWY5Bf0qwf3tPLISO1Tap9qzFB6eap/beqI94NCCbGwgqOItY3CGl446CaQ8i2Q9g0AvmgJOnBoAA0gu17tsKtKS7D4udgCYERy2QIceCX/P7mBW+g/7D9S6Mn50CS0eAoQPDcBjopIA5+EcxEjLweRjXq0UbLIjcBxsGx2IZvlf0ATjz/6qypAmY7bhrk4ahsIis6ccXKHdueAfUgk+RWPCLh42c6zEeKyJpRTdRAOqBbl/Wq/uT+q+Fx3FoTIuCzc6+hN8j4veGjuAnhSE5gKnco3A3XwYlq2sq+lmP4yEOpqEoG0M+mGDYuYT0pKCFHgLHKt3T7T9p8GcWH+n1UwGa8X6kQt2x4CeqPexegT6o/Z4Cr313PHdgrsS2ZReLfpKIf+IMFnmVmwxQ9AhithYT73+p2s+JIVfrjwiHnpAZrSsr9CMstQXP1+1+510N/q8E/YoekMN9OMFvi5LvkRDsy9rgFCOoPdpgaQIWBZjf5KCSQszZJ1ivTvLokpen6tsJAVND0NFqb6GUGg2Im4Dyx9Pn7/0dm4pADAslJzTv+dKNrAPQ0wyySm7bj1RQgbAXsRa4R+mBJzpaQmHLmy0BLoL+Nh2ZRca8uUc6P37k97n451fvTieAE8BdZ2ItqFEK6oOJIYPsiU4woo140Oh+H/UC++gatHYcOFT+2y3AYvD1rM/fpxdUcsAi70c0OxAEP45X/hymE9XeoC0zfYhbcqfbhs09HpwnKMDR6g0mmYyKth/UcLl9ITGQ8N1S6s+gA1HvQCc2pluPvN2Br8SyZyfyxPP/VhCi1L1HWX2CQCuAE8TIq/sBYdANZmTIwqq0sb0HIzhhugBeUpBZLFyA8y+EErsBUYDZHYN9QAAooQwOws+uQlhdESSSqk5Qsh8LSYI6LDS1AbmOvLlRBqQIeITvM36+TP63VfE5hFClCTr9zEyVFwS3STQBy66DMHB+PJWIrfgGnYBx2dTboPa2X49GaBVlePA7CFx4iaGi4ns0aLVjMGvtPTDtmO4XEE8E5Kb/8qYai+NHl60LgAICcUCoJPVeiYG6Pxw/X9VFNVbFn9FNPzXoIRDTyzcpREYB5Fm1EQQn3KRi9wKApR8Tz48SwxnV3qM0q7ZhpdKvr0zfY+gO4oQf+EGPFYW/Xf5hwWsUgxiBbShGoGIx+D2eH1h2EeR3UQMH4zMaUKr4033nzkSkfQADelFbLOQCalxdxvN8mInhPas9bxtGJw29Fx3Y8429MAS0fL33Oeo7qFZeiToCC3B/VSNYuU0fgDnkhxGgMFdxiYEY7MYel+OHPH30IMeVFK1C79l+QdXVpFqHlMAXEf3EYDyfkkGdNvJ8f3RAXU0jpgM7jMNA5yCrtfzOicKG/M9bgEkEjqqPPDEcDfqVwGZv6zcO9avDfOhf4OmLFd9OLBHHdxp51HvOBlnAoQksYjASA1xnIhPsapTCPjbsGB2YevpPpgM73EYeSYIftgPgte6CWesVBB9QEgfnWYMgoeC8ql69bWoRIqYHvSIv/u26bj/jdqZ9KSGk74JRo6QS9PuTiSHm6Z62kLUGH0UO4rwWrhtRETkR4iKRdI8giJ2D2nUCMjsA0TXiVDb98NAf/rCMlajA9wesWHZrAe1dlwRyVI2jx4KkyUHSx7YDe6YD4tOC6XW01puEdAJwaEJzf1uATHi6ZlSCpBQscsh6C1xRcWEG4bCFeKcAVhVlDu54JQIkTT21hptIT/Afk0kMcS9BKfjBJozcDXCrtgbWXxbMAw3INQIxtQJPAGwXmYaBbYh4SCsuKwLOAQ5awKskCMmRg8P3xwlBfbosQaDqyZqBkyQe1CLQACoTgN4qbyHsPwkTiF2pYaj6MAXBmUosQHnUEYCsBL3MW39SNKMJ5PfoBsT33DVJCEbFnBCMOkHfvj6Xq8uw+dgRIhGgAiUqf5QgKDFyhe8nnYrlqn9sG1GoAfirubygX4H+8IM1CmQrMFAJ5ExzKIp54nPoVU2Auh6eBShDlTV4u5c4HE/fVvjFrsII0Ik6QX+Iq68jB19ziLoKC27FYe0gC+j1RSS+BgB7AvAM3m8HLdy5fV60C8RMVuhD1ieQB32MCCq0QPJuvuw5IHF/geMKwOPdpmsxBwVEfGEOgeincJqNmuSFIPhPq/xM81CWIIi+gCFBqDX3QPYd2OcCRo6GZBoA3AM+00aesAOQ7/2Pe/vBCXoguD4OBD1WfPwClzcui12AuH+gC0gEwW72KfjBCQRBr05D0IQc7N8PzOCMehPWK384MPVDJQim7yDdoiRTItzzFV/ZOX9sYFetP0fsQzb6O7wOoFjxk89YoQXv+BmSN+yYHYO+BsDRAXHhuJXsEFbdIEGZQWUkNVNzGA9NZUVBIQL7jASR0AclE4Pb7JN3BO72mG92+o8UG3nybj+mASh0FsLKn9GPxDrEcS2Au35BzHO1BksriIJdpqWjKR1wlpR4fN977rZqI+XbYjYDgVDpcYQalOYKMiuQbB3G6Pu/HlMbi9a0EMkksXtjvvXTfgMKAEZRN/i/O7yD8Da2S2Bdh3ICWfp8yuMkYl5a4df4vVWt4UF0yyqEnaT6swYyWB8/j111Y1ERS9oB0SLMtBGDEBD1PEHwtdjUEAHnqmoHU4wCDAoAS+lHwtu9eQLUAgmxVvAuMB9cELMV3m8EUtcBYYI9nkNIEEJYrQeUHfnzzRyC39j8CgSkir/E0P2odnAmAqDnDIhqrtV9BDNS2POjv/0pwKr6z1h/PMz3uf9ykFYq9TtoAXSwpz0HljdvBCVAPY6t7osv6gFhMpkX13rcfXQMIpuTsfTibkfOPRAC2meLRipI4mDPwMD5x+v3+Ey+qEfACwoUEkKQSMZxYJDz9R68PyP43yvo2aYf881rNQbZgRU/jp80QnW/hdXqJxMvCFxXQSNHpE8QiF4XI+wFfQcw7VL2Md7RRajsKgh2D+6SLAKPF356+/7yXYBTUgFy/38StUjFHweD+iiHh8/LV/i/TSvGk4L5x7F6AsIKbgb4C0YjgdGRIToGUx7cgS3JKP8pRcgak95BJGQbjaJdBYQ1qHYnYHL8F45QgHx2gLMQ2cDxBD/4SeR0LSDi5XzPQNjM4ySE/HGG6g+ugltLNSARn281BPtNO72eJLjdX4ITSEgpQvJYFEUg24f1qAYQNQdxx6Q/RcB85j9f+03zf2QV33IDPHegNgPABTfqFR8cZK9TA7/ll0EQbUUHW8Gr1d+MSadia+LRHwhunv87yWoJ3h/pRDwJAbDNQQFd2P2mH4kP/wDT/ZeN3CK3+ZjvgVpw4r20AMafb58j4N1UMknuj6iCx883PU9g2VHVH5JX2eEcPghSgRBCKPzK0Q3fknwPN0Hk0CyC0zBkz//7duEetgFjVtypASDI4CsknYJgYDhqsBxxy29+eyxrAZX75EEf8f+CkOcijMDDHx4ASYGGu8WHgPwpHJc0qOG8FgFTuVk0cRZVePFwHEIUEu8xSHoL5qWg4I7/HgOKXe2dcnu2SSdCGIDTA+AcxY1zYL6Q6AAFu+/1GvjKPSeEoJV3NiM4Dz9C6oWkEav+NWjPWXNOIkKgNTi2I8LeBgaZHJxqrC4oNXoB9pzzMws/OW3ghSyQJgjbygOVEDhoj4nHLld8HPD6UUMFVLIgKrTL7cFoBRLQgEdXIseZ2/HhFPKbk4d5tYWwwR0nIFQSD2P5gQhs6meVfB+Bkyz2fOIvX/zxqsSODuAGIOLtPNnmIPCrv6Kqvgz3q4tCwNl9lWYfnsdHj2HTgQw5IBHwULmfSu1jEV3gDFSxTBmqSEVqiYK2IkWcRiAkwV/cyW9YhqHXDw9dkNQAcO6HFNJT7oChfrPUYc3KY17zAd+evAwF2w5SCKLV4EuCEKsKfjBVWHu9Q9Arh4CoBqEMWYBsNX7YgKP/69uC3M7/mOOz232QT+ox4iCyJGEFP4oBHd+GVvXBwX35nqp7qeIbV6L6tdZub3ueJ+gBIKgC6S5gOQFxDoGr+Bv2nzqbknd7ph/EmXzO0o+kZdc/wqvQkAOUffVMzKtYgx5Vob1/+HAfCdzHSiXHenX35/2JTr3KZ9Ruj2lYiMhLIFoNyMq9hFroeYMTE0bSLbhb4l3YlFPa6hMd2jk8dmrDgdQCnC4/+ANFlYTB6ATlx2GDGXP1rvL+SnWHw+cJes5/rRWt4H2pw9GklD4uSMpwasIQiaYR92gIyFX5S8dtRZt/nCAH48VXW3hRE/HKOsGquj8EM85Q9cfeAV4XwNGAlmIFIwPYrfLKuxV476RRetzcdeAsRSZhiHizCKEIOHn3EMOWy5X4uIJnXX6sFiBFLaBm/THOQAkVJK9j6TKwiSDTBWpwHkSPQJX7U959uAkoaTUuug6oQCBz1Zlxm0OJSIoIw04M+7zCGuYiznCfHww9AN6Ir+HXA7lfn2oBSJ2FOOh8SzINfmcAyITq8JX/sOMPx6A9LeYtVfwgCBZhdu25OB9/XmWWNPUEPD5dUuJ68wd1AqD2+w1PI9KxE9BW5t3z/igdYGWiL7L+wPv9jgVY8f0ZcbCKCuLAHN+c5wa69Zpr0J9t2KnpAGzyiAIPiFalJ8/xXrrA6Y+/8NoDnWCPNwFJzf5DpVkHte8hx76P+HU1+HEytEeSEIzAsu5r6wPJGu6oLz8VrKofXLce+ywIHhNa/Dmw8LrptWXZ4NKZm4pr/QQ7Qk8ehMrPtAF7PQCD309QgRgRZMKgAbFREAfBBXNalbHA9cEHMo4IgIUuPjjBWEUFEQpYTkhVO43eRiynJw9Jjj8TOUIlJExK+0wA4gWgQvcFBHAc7P4/u78/Ff4CC5ATB3P3oUwFClYgcALcxzp/B9Ez4DUV8RjBbsCBrMH4dLNwIDaCGhA6o3pXksdBvYBsktrXDgNJKAFy1Z+ZGIy5NXgXoBT8a3ZgVSPIUAMV6DjLxhsV8wX4n4ibbONObHNyCr8Z4FinNFjg8ziiF5zSV8A99u7Zdf5OisvVaAAAG3VJREFU/kIPAJLWX3hUIFD6o7MD4WkHIMXBk4IftSrPNBJVk0OoC7ice8HGS8XBKDoz/YFBLaQi392lGpCMJfhD9xVkx5Xbj73P9V4m1j0v73x9FjDDPlYvATkgFAVWcdNvJBamliOjAwRV0EpeRymAe717kMYRyy/j5FwFBX0fP7Dyx8gq8wn2ZXi8GfGYR+lFcGJSxa3Y84WgzBHetlU4cvKY44Ps4iP9fsgsPGEhQTAcHqwwGCj61SoPexKwasXFqtxq8qhD9SixoBBYcJEDNzmIoi3J7QkoJActVHocTVpPBCDhElAvMDK1PT/Sq3DwB/ygmyB9GNhYDH4so4Foy48kkPtZfZEv1PQTxYpyX0EI3Bu+/5krcN8fgwVdwWu2JNVNWAk+PcOOPMNdGFyAZ5Aj6gicgzNfwuHZg0HrLxBWfjSRl88fVCo/apX/IBrIvf65ZxtEoK9Bec4KZIPLe76osQns46NwW0pUPCPAyMc4A/KXOwZzFLGbAqD5xhhbgBcWfoJBAlarcCSQgdQJ+Movnih4gjZQTw51rz588y/ZgxVUEAQ8soCfX8OR26JwujCLGFAMsOjnwGrlPuQw9D/PPv8BYVR7pG/eeFtQpsLzR2KFI8SwKj9KlX++HeLOPuSBKrKeHBi7L4b+Kx184+ptAp4Trcscv69oARVYzWgaK01H1X0K3zNSmARKtxXYHvwJuT+8gLGGWgpHcWOmBeljFB2Ckg6wiAYOqfxEK3GMCAj6kIiTWdCBCXhkjUKMgJcLk271N9uLSbtvvK0S69OXAvoA5z94VsFubbmZvx4QAnXgBnJxENyQjy38wef81uPhxMpPJIQzr5ckuUTKe0wZyN57iFTWga8GvCwlh5UqvYgmaNV9XSxEVWs40kkosFwA70RgNOu8mLZfR6wDiwRa35y7j08NksqPQhcfkRBK/J8R75Iz+9C8gJpqzwiIeZII3QnYOkJWbVEI5jNuA+o2BwK82ifwnpSgHwaC+GNAdmW2VXfC+vPu6wR6lBj84C9WfvivZyUhZMJlJhjSukDlFJ3g4AvGJfC1iEpQJ/CaEd7G9wds7p71+odruKrHip/C7RdsxeVjzIxhoNkFGOW/+sk/YVAGtltfzZAIfzix8gcHhZCXpcGN2u69qWqD9OlRFAy7x2fQBhHUiETB+DocqvArYt98f+AEAXApsEmEcNLC0t2uPHCqPQIXwHYDfI4/9+8LMpchqr5HK39MJSrBXwnutNqjovjHFdq+fcHLp7YLR4mGgduW5hFpAXUoL4cTTuW5HJSkB5PC0S7A+8c+837DyoM1J9iv/po/o3BunlDqPjOSO/YbLFd+FGy9sxKFeT8b+nLNPrkAyD53FtT27yUS32yqUaEGTMBiASGcZ0FmK8nWxbvjC1q6WQC4VdWdAcBY8eFoAzIrC0b7Wt8wlPcIdE1FhUWeKU1Igv8Q/0dl4k/NnYSxdlDon8diUDeuQB4c8XVzcahRgyyZmNC+LAgeCfSVALde8/t1DCYawNoePGT83wlOpFUdOZKwxn89OsMEf0X8CxJCBN/dwKbFwkSMgx0ACJJDJD4iC1JEYh6XcEqVHpx4+J4I4UiAl26r5x64sttvSlAn3LBuQCz6edU8C+J5epBrC4YP52EFDgHrCw1B0eU9bOaTgh3wmYvQV3Oqqcf53XnVNXUBELX1xtSgFrirlII5d3HFulxBCNEfZx0h7K2f34XwdHpuYQcguN189Ow/nPXclaUcqMH5leCXjKOjbv3F0a7i2ZaRHmBe5zwnhA9S736ZC8AH8LHkg/T5znYgmES1dtuzGo92qwHIquiWX+4KgVLd8utv9Ml1BQNhEJW/FOgweiTguCUoQHkEwYhjfQIgm8eAzPKzHqAG5xGiiPyxeGRRaYetUpDVpHVC1T9bHGyaknb/TQTnuG7rDYwYCUT7/cMjtILzA+Go/FPw581F/mWeTkDuBsBCAK8ki+A29nMzPn4Rzjv6QV7xWW4fzQFUxb9jQQ1qc28kMi4mDl1NBr4usIsz5ltZqNm7AeJXfuTHd7nioLEyPBISU+8/tP1AC4Il/n+YGmjg2NiBRdl6yCw//zG5ph7bqaBuz8B4VMU/TqSsNPbwCeZA1cdxyG9SgKzRZPL+GXFOiH1/SFZ9wX8M3zUgvH8a4rMBjZj/h1W9MrwTiN6MlsCKiI4gycBzgV/xUaQGjGDHwHiYi0VIzeEAasCpNuL76AC7BIEl7i4AIxnAfoMxk35eJbZ68wWEUChs8IPz/EEE9BkUoNA4RCWSLJkY1h0Y/dG9bVCtUVPe7QRhtStXG4nOECDfUxc4Uw/Ik8JkA9o9+a83IrfHH11EdFUWc4phNgVFWkPsIHBnCvCCYBSgqEN9qtoXuwHhByYoJJA7BxIkkRwpDGgAHo+vQ3ZGOwCFJCJKUAx4MBpFZWvReeLgtBBkDDQu2OJxXa7SE/P4ZiUPHABjY1DsFIhPAaygWewiXK72hHjow/k8gCL6gKES8qcDZ7A+EhYlWCPGCX1wXIwzkQEKt8cP6iqkC0FEhFj/ZYtvXCtwuBLcDT5wXN+9H6ZEIkTwV/x/s78fXFX3siWHEKrC3tw7EFZ31Ll7ttknQyEMGgAqCaVe1bGk8r8nFWCQQR0h7CY0dsU/mIeIuA1AGCo02Q0YVXxub36sG1Qgfo0CBBUXxap+ECFEycQVyViBEBFPt14TK9rZHB9EwMG7DPXOv0OVHkdtx7OSCXfb3av4CFZGTwQBwT7/hKPHE4PzpJ4L4+FM9r1n8B+B+9R9I4Fu9brYUZgCunZWNxdQgIs8mASBQ4F8hJpEiaf4GPihk8FdAxin/kybjZjTj+mAQy6ihZ9whDvHAWB6BKrBXQr+5SBfqPaINwiz12UIwoTmbPACZY/fshBBBKNlW8ZCHwH/cVKSOZMm4Mxk4OwE9JeB+EFkn1IzcPQoiSB4vGgNeJSoik1A7m0TCmE/HrggB+/1M12C1Z18ACGoIeH1pH2IhAqFWgBq+kDFEWAvA3X8tpW0cnSD5WAOriOHhnYraF1eLTkS8P/QsHUBdtMPnOrMaANJE9AZiaKWII5Ue/8PTHn/UcCSTgIF2xN4zdmAQYIAKeBFl6FiO0aKfq5jcImHfPwTxcEdRmD3LcFoAva1Hdjm9UgGggI9YOoPkOBYLsT8HlG3nucMDGkOOJ8CkNOELdSO7D5qqAeJYBb2GpABgRi2gxLITgrOQ9C937HgB+0i7MeRx3gfPWCXLtgbLJAu/gCFBPzRX8eADJqCvA3FViC/BlOQC4LZyrBq8BdQAOUKoKjqR7v7EFfVFMojPgEoSlJesNIePyLHwW9NRgq7E6HvUN8A0yj0wyWDHRZ3J2A1jHdMyu3hCGwSDwdRir7h9VP7AKLgPoMCgKziOFLtrUm8aIFHlgxYfz8WBYUU55iAXauo+evJaIK/NTgRJM9sUcZRzcCnMdNKMJc7usnAyrpxHYkTRHK+n1HxS01LheAHqRWwKIDqLvQC0+PupHZgBawfVGsiniTVHwZHRqbUI/D4Cd+ftgyLAR1ehkIiqaKFw7MJEwUIuK5zsu4svoFYCFKgBJZACBuppOId2RDkPZas8H9kULcA9a0KTCQDGtpnzT+RMJiOGseHl4BQ1C29AWUXIIf/OIwwqoNEK3SCuA7FRiBrE9B4/PcrGJ1OQNj83F4Xbol/TgVHfMiIZLAdcaVkgh8sLrd+liNQH/FqsNTfj15m1J0X+ffZuq/gTY7QnvIfJz6UzBJLs83ItQpt3RfZz5iuGfNPajpngUm0R8DoA5jDlzsOTAwZjzsC3Jjxg7H914PjlcskGdghgx9HG4OOQH34uwQyzz61/0qiYNQjXxECuWYbGM/DrjtPH/Mw/K+gBLLSA+cEfPr4MroArzcDuybbr8Zc72i2UnzeHnTgzD4Ug78SzIvCoARVOQxaFFR3TzWnkkHUVFShEuqKxZnKz4p4YYcf8ZhYhuu8wFgSHcuuwCJagI4bgchJQK/qe9c/RT6nGcg6KGREJpb+MI0EY/b0jcsni3AJBeCQNsBOFVYoApcM2Aom4VFgIRdHpeIG8D3YaxBD+qCiQ+rBOSVnci8hzkAG1t/pgHA4uwDzmu8xFKkkkIqCfkIRs204r/hiDgutoAAcowBMZ9+KS0CcXVBOHCvJw2jMQSJyeoeExF2DuTuRcuWAo9sefyUQ6/oBaIjPtiRH1KvQKvygAHb171d+vc4GRMDPoxN/kL5pwlVh1mBQ1quQJAJ5j0TgOAis+h8d3mnC8xTKE34+8sDNjyVXE6nFMN+H39TQDmocHScENvN74LoGScGU4f7g6IG3n3C3qnG6JBS+Z5tHOOzRYQx+u7MZmAl0OSsRLAS/VIKfRAWU92+12aaVPksGDBWQuCMvgNy2M2Mt8EwqbjosZAec5xLEAmXmcFTHiOWARWglpNpjdEtBQRxJJU5VL5/7F1X86XntXgUK4q+KggsUoIIK8oA+kgy4+zLaACqQGTVOX6MBWdehL6BxHn+tlyBMDGAqufd7WOX5WTJwKYDfXJJP2GXDPk7Tj5Ed7BOG7DMFaBRAJgI/+H2Ngeb2SKb0zkoGlQBHkefDr7xMA5HZeJPtKIzyApI9gmnPgf1c3mulfhe0gFekDCdNFnrOwi4Gs6eTACNjB+Uegcgojog4V25P8bctRYY6RL8AJklE9ACFAGZdBEahd4d4CmghFhbzcwaXYH5qTlS6DY+KfNH5Avzjo2JJ0poDkSCMxLn73H/eB+ifvgvyIFCWAji7BWC8hd0qj0FziMdrS70BlVbgamIgcmotGZDNPwm0L9l5iHv7WRoAFx57ScFS2r2iwot8oKu8l+TOCOg2mZ2nFdjTgOFQENzKkJ8OjEnsE8f6AzyXwT6MNF3RDRnuj0Lwo6wTlBMDIyqaz6G+RiLJMg/KUrQV/rh9uH0tWduwoxmky0kSMQ+rnXxZsGadgnxfgk1pCnsIsGYltvfdzTOBIclIsN8MLAGcz5gBwj94AE8DuC9Molip/JGwB57nRyJiyD3pyk6q5ij+3TzRLohcqyqCEQBTepF15+WVmW8SEr5jMUUkx3oMIsrH3ndwAQganKzyMpOJNxMQooGBYwcByw7axIhgPRGEr6GSGJhkAELoQ1YRg+dPeD5IIRDIqq5PA2Jh0Rq0YcS8XBi0ghGRFpCtWTdum5+yLOsQf2EuYY8AfnbQZDgCjHxBSKwTGpt8QCIDVH3/4H5OwEvldhliINwAFLsEyyIfGKV+vm3eEehVqKTdNxtDiPoLHCRiuwTJxCECxMDqDjTvZ63KaPKvRgV2i/F3ohm88V8LN8hgJcXD5pVGIPPNn9EBqSQC0I4AMxBUcQNCkarkFgSn/oCs9GCVep4eUG5BRAOcQOCWlGSc3If0IFqRfURQGRrKewPKEJ9sLnIowKCcw+f48N6UHjqYtgInaCCkBbPSj8VEkCr2g8U43wY1xX/BNkwreQrzg+oaJghOCGTU8RBxuIp6VFOGoEXgEsBLIgV6gBgxoLSI5CgiYNT+GBHsU01GthrceiMUtv9KgAYktgVNeGrBbtiOQVi9x8WjiAW7UNUnm4Vet7WtsFgDCDYEwQ/EVL1PnQf/xCDLTowTh4c4HPRDoQaiwhKIAae4B7xgCBydI/CDPOrevK0FR4p6w3VfoXgQiB3T1N8Y1PCD0X19JqcHGfzB5WkQE4p/kdeXBcEVUXEIFqSij82lMyrWq/7c+LFHA7z5/dwOHHg8s/Y8C2CmhbmALtare+4UWLfb25BmXABKABTniC8gRAP2yvDAiUAsElnrxFzITQa/sAFecAOY7zPV/8jMQHSbWAiUPGkQNABhw85xrSCv+mMSzFR8+7mjw01A8f4F8S/td4jnDHYxpT8/OEyV3gz2+GTfdAeAszswfJNGlQhEIjB0Bls0BKn4Iw7WKu9f1gmSagmvqleEwJwnZwjO7npz1HdCJ1hS/mlBcRXyF3i/M7NxqJFoeH27z7nnJaBmpUZKHsTbGUc1ALEoIGsGYl9ixS50gjAT/VhB8IzvGTrBVfWEz1MzAkRFTtecW731VdjNQPukVdhdn0Y8d/a7WYH6i/TBPBzUFwAlHwtGHOQISrgb1AMUgDETTA3+THAdeRJhg59V/Ektofa9I8wxVICkC7QQSAd2O3cftzPzdMK6aA4iZI4ILfYRbb9RgqICt2AxVnYZ4kkBvHOBxT/zN9ybHx/f5Ql2fkGCX6ANm6F8WCfqAS+Eq5AGcHJd2IFHagTMHAAj+mWBnDXuc81CjhsAi5dL2K8QCYI1aJ/PJtSSxEFXASv7C2I3ZB9/a0j/7nDn/j1pHsz9Jr8fNpxPBUAUUYD4wz5GBlmyAiORjtAIGDFwzSUwqiNZ1d1tPiB7/Q9VeI9KeJU16/knkEeQJEALjY4rkp74fCZiMDSA/PgvT/aT2gYgp5E/P29AKBQAo6TRth5T4VesQFb0i4K7RA2MZpgyFXCEQHCOixuYMPgy2L7+45ezSSKt2oUkURlpXkEMOLSiXPuDQZjk63N5bmzOSxQdLHX7AhwUEA0BAeQPJIQzkAuFlOK/GtyLdiGDKEBdllQ7YouxV2Xdwza9So4Kp5Z0yAgUhTlJgFzSFrznIHYIwKcCu2/L3LsCg6UI1b1/CA+ApIV5/32HqOIjdQusE4azip5Wc1b0q/QGIAlaWEJbXP3r/L+AEipw/+BtkQVY9fIM2i/ZhgVEgJO6DZ1ksVtlYdoQAPhVO0oKmYBmnAYco4DRCRB3TwCziptaE0auER9/VzRqKNOEYINOQg2m1l9GpGNQAhh1v6UmxNQh2M4+LmlUzll0OTjYQOaGlZAEMCrdhmBphaMBwBADrSQQc3//He8KgFETT7p6BHnjj2X9EXsDjrgBS6ihoAmcSQVYmE4JgYWFpp1waAQRoqDzxDhU+HxSnZHz/9JEY6Y5MJA+cwoWrt99+U3Mc/9g/NQTFaigAEtwB1yBzwzucZSX7RZEILhR1d5GDCsBLVUdIQvsldZfEJt5i/MHx2hGJZFkVVyK242iFeh58oBUFqIQbkfp2DV2X0CkAYgv1sU+P+I/HmBu8nErugdRnUWhfp+A/ddlbEH3uQlBsNobUEMHasK1HOYn8BEEvCUaiuigXRIKj+sGOPA4KAWz9/s7WxcgB4+a6/fI2osEwv4yOENAiPf+wQhbc/5f0gGisWuQaRFmGoIqguARWsBQgTTocDLMT5OJUQnhqdCEig+/EShKSEgTVV0MBMnz04BcshPnLk/+OaV0/dwKzB4QUt1NB6uTDfGOP+cNm9mEsBAFiM7AQh9AKVEU75vy68jeOxrUC4mDEuYO0oLqoSdHaEF2eXYYSm0V+oEOwpLmYFOF3Z4CmAeBTIGueiIw2xoKPzDBJVBXQ5g5O8/twwA+QguIjJt3+g0NQEcDfUXgO5gsqlTBLkQLdl86K3CWneitQ8sg/5oWAUJP2C3V3RoEyji5n4b9lB4t9pz2CA+cAFn1Z9I/uzYsU/ELtEBOCHYQQqGcFejV+yeuRJX31zsKV5IGjway9z6PLDxKwNEPsBuOEiqw57jGgOtZ1Y++T50AuMFl7hPIbhskiOwsATtRoc7rS7dXrpcgrMCGJca6ELJo+Y0be0BW5ZKGcFz4y8W9BduwcDnK9iO5fagsKpp9ANnvDPxeP8THNyIVFo1AMas8Qk5v2Ytm0LCCYAXqn+wQsPTBh/5Bcnne14Os3uCQt28vsK1WUESJFviBgAW//3u9PLxusXchcCR2WsNzv/ImvgZzzkUByDUAIrjTvmSHAowpJBQE4SUlxMxnARlQbIqkArVAJ6pBBvELCCKlkyCDAP45BYfEPfcUpfMch3Vn4bheYK4E66BxAxHSVd5INgEPgU/NBCDfNQ8Ho1CoINAPQAW/QT8OCIZlNFCB84XhoDChFByHGjx35v9BLgyhmojqHYb5QYXnuAecvua0hZe6BV9f7v4ibvgvamrmAc1TmaEir0LQ9h97eYAYVoM/nWA60i8Q3Ifezha9BqaaL3zvqd6IAuwwLSCCuCLuJWch4h30giPtyiAphKEBcCu9BV5wwzkMxID8rhMwdwMhcSFgrBT3RUTQboAUg3+p+Qe1IGarOioVnazmefV3lHpwA0AcLWCahUiXwePHWJsP+GH1gnp/we5KfOhJAbsj0H/BIEb04TbrTPsAyb2LLu93KwfCvn5PLAwrOXAa72eEQRo1CNdw5IprsAZ3hApy9zlcITG2vpCihsRSYxNS+J4vdBZ6B52eqRcQ/QXmSjAWSfa/5GA5qEg4iJFtm624AqXLrSA2gx8p1Mdqcghv41S0lSp/xAYs9gakQc4Ie2RTUYwYgt748mV+FU1Xgp14eW3XYZ6cdqGTNHwHICTwEeTPl0jEZwIgP9gDEaogeg5IHWCF+1eoAhvEKPB/EAeTRsM/pSAP5wjWEUMM1/NJRhwJbpJSgK7S7zF3EOsI5jBQBK9DV80Z8Y0COzvmWzJXgDl40KEC6cqvqgi4OB5cpgLFYK/1CvDiItXqC6/S87wfAUfPtxqfGNzlYaOjlf1IsHPPvffHgDAoEeEST4ZLZUd/RSo91/BjXY5ggWgQ4In3fyj4mUqPrInHOCLKO3wUwRsfyXpt1nEIRLrqcWeTuk7bigsbid1zD4iDRQtnIdQsyIXnFCn1I9D7ADgxEhOvR5AJosoUbu1FkJyYCi9OhQERoIx+4AX/YqUXQhtYEwKN4Cy1HntLMmtaAQpqfrT/UCoLSxeswjA5UWPPi0mjajUWxMTdVusNvt/ChMdmILK5IRMFu90BMEzFYHdg2GAgeYVHMMJIBTA7EFTx/5fpgTFXz9w/en0ZjD8kCDoKPNGwlB01BmoWQbh+AxR689mBponGJOr9OwmMu3dtJ/ylW1Tik4ElUPmR9RqII+pVhD9ychABMQ51gOIZg+/G+5mGIzLB1JJC5WhzYjhJ7IWmLDpA8jzsAafUPkB2WnFBF4iSxkq1ty7f25rv/+EQLOxs2oUdTSA9HIR9swdBlCcFe9owPC3XWDDC0ISVzsEVbSCF/sWdA5Fu4HJqankp2SeQCYYrImNalfmhpVxYrGkUS4LeSUjg8dD7+D7w/ybIfy7vlB9/HJ978zr7/45Qgajzj+4EjIK/ULHPRAOlKr/aG0AFcqCyu0GcW45Igh6JMJmhA49/U+cEssHNJhtXDC1MOya3j/sAiAGcrEtqtgjBD6wEzSDc7D8o6C8rIqAZyPk+NQoNLAZ1hR64Yl1FBY648smUYKnSg1Xwk/0DyRyArByMUobyByhCcPnOaPyoegREFS4jNfYAw+IHCjdC1J2WDZBke/OyN85J24WiXwDYPoJyYuCD238ulvuzwt6KgHf0shWKsqCFFGjB/w8HU8eeTED9wAAAAABJRU5ErkJggg==\";\nlet J1 = 0;\nconst b0 = (n) => {\n if (!n.environmentBRDFTexture) {\n const e = n.useDelayedTextureLoading;\n n.useDelayedTextureLoading = !1;\n const t = n._blockEntityCollection;\n n._blockEntityCollection = !1;\n const i = le.CreateFromBase64String(Q1, \"EnvironmentBRDFTexture\" + J1++, n, !0, !1, le.BILINEAR_SAMPLINGMODE);\n n._blockEntityCollection = t;\n const r = n.getEngine().getLoadedTexturesCache(), s = r.indexOf(i.getInternalTexture());\n s !== -1 && r.splice(s, 1), i.isRGBD = !0, i.wrapU = le.CLAMP_ADDRESSMODE, i.wrapV = le.CLAMP_ADDRESSMODE, n.environmentBRDFTexture = i, n.useDelayedTextureLoading = e, gg.ExpandRGBDTexture(i);\n const a = n.getEngine().onContextRestoredObservable.add(() => {\n i.isRGBD = !0;\n const o = n.onBeforeRenderObservable.add(() => {\n i.isReady() && (n.onBeforeRenderObservable.remove(o), gg.ExpandRGBDTexture(i));\n });\n });\n n.onDisposeObservable.add(() => {\n n.getEngine().onContextRestoredObservable.remove(a);\n });\n }\n return n.environmentBRDFTexture;\n};\nclass $1 extends es {\n constructor() {\n super(...arguments), this.BRDF_V_HEIGHT_CORRELATED = !1, this.MS_BRDF_ENERGY_CONSERVATION = !1, this.SPHERICAL_HARMONICS = !1, this.SPECULAR_GLOSSINESS_ENERGY_CONSERVATION = !1;\n }\n}\nclass Fi extends wr {\n /** @internal */\n _markAllSubMeshesAsMiscDirty() {\n this._internalMarkAllSubMeshesAsMiscDirty();\n }\n constructor(e, t = !0) {\n super(e, \"PBRBRDF\", 90, new $1(), t), this._useEnergyConservation = Fi.DEFAULT_USE_ENERGY_CONSERVATION, this.useEnergyConservation = Fi.DEFAULT_USE_ENERGY_CONSERVATION, this._useSmithVisibilityHeightCorrelated = Fi.DEFAULT_USE_SMITH_VISIBILITY_HEIGHT_CORRELATED, this.useSmithVisibilityHeightCorrelated = Fi.DEFAULT_USE_SMITH_VISIBILITY_HEIGHT_CORRELATED, this._useSphericalHarmonics = Fi.DEFAULT_USE_SPHERICAL_HARMONICS, this.useSphericalHarmonics = Fi.DEFAULT_USE_SPHERICAL_HARMONICS, this._useSpecularGlossinessInputEnergyConservation = Fi.DEFAULT_USE_SPECULAR_GLOSSINESS_INPUT_ENERGY_CONSERVATION, this.useSpecularGlossinessInputEnergyConservation = Fi.DEFAULT_USE_SPECULAR_GLOSSINESS_INPUT_ENERGY_CONSERVATION, this._internalMarkAllSubMeshesAsMiscDirty = e._dirtyCallbacks[16], this._enable(!0);\n }\n prepareDefines(e) {\n e.BRDF_V_HEIGHT_CORRELATED = this._useSmithVisibilityHeightCorrelated, e.MS_BRDF_ENERGY_CONSERVATION = this._useEnergyConservation && this._useSmithVisibilityHeightCorrelated, e.SPHERICAL_HARMONICS = this._useSphericalHarmonics, e.SPECULAR_GLOSSINESS_ENERGY_CONSERVATION = this._useSpecularGlossinessInputEnergyConservation;\n }\n getClassName() {\n return \"PBRBRDFConfiguration\";\n }\n}\nFi.DEFAULT_USE_ENERGY_CONSERVATION = !0;\nFi.DEFAULT_USE_SMITH_VISIBILITY_HEIGHT_CORRELATED = !0;\nFi.DEFAULT_USE_SPHERICAL_HARMONICS = !0;\nFi.DEFAULT_USE_SPECULAR_GLOSSINESS_INPUT_ENERGY_CONSERVATION = !0;\nP([\n U(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Fi.prototype, \"useEnergyConservation\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Fi.prototype, \"useSmithVisibilityHeightCorrelated\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Fi.prototype, \"useSphericalHarmonics\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Fi.prototype, \"useSpecularGlossinessInputEnergyConservation\", void 0);\nconst rs = [\n Math.sqrt(1 / (4 * Math.PI)),\n -Math.sqrt(3 / (4 * Math.PI)),\n Math.sqrt(3 / (4 * Math.PI)),\n -Math.sqrt(3 / (4 * Math.PI)),\n Math.sqrt(15 / (4 * Math.PI)),\n -Math.sqrt(15 / (4 * Math.PI)),\n Math.sqrt(5 / (16 * Math.PI)),\n -Math.sqrt(15 / (4 * Math.PI)),\n Math.sqrt(15 / (16 * Math.PI))\n // l22\n], eM = [\n () => 1,\n (n) => n.y,\n (n) => n.z,\n (n) => n.x,\n (n) => n.x * n.y,\n (n) => n.y * n.z,\n (n) => 3 * n.z * n.z - 1,\n (n) => n.x * n.z,\n (n) => n.x * n.x - n.y * n.y\n // l22\n], bs = (n, e) => rs[n] * eM[n](e), As = [Math.PI, 2 * Math.PI / 3, 2 * Math.PI / 3, 2 * Math.PI / 3, Math.PI / 4, Math.PI / 4, Math.PI / 4, Math.PI / 4, Math.PI / 4];\nclass xo {\n constructor() {\n this.preScaled = !1, this.l00 = _.Zero(), this.l1_1 = _.Zero(), this.l10 = _.Zero(), this.l11 = _.Zero(), this.l2_2 = _.Zero(), this.l2_1 = _.Zero(), this.l20 = _.Zero(), this.l21 = _.Zero(), this.l22 = _.Zero();\n }\n /**\n * Adds a light to the spherical harmonics\n * @param direction the direction of the light\n * @param color the color of the light\n * @param deltaSolidAngle the delta solid angle of the light\n */\n addLight(e, t, i) {\n z.Vector3[0].set(t.r, t.g, t.b);\n const r = z.Vector3[0], s = z.Vector3[1];\n r.scaleToRef(i, s), s.scaleToRef(bs(0, e), z.Vector3[2]), this.l00.addInPlace(z.Vector3[2]), s.scaleToRef(bs(1, e), z.Vector3[2]), this.l1_1.addInPlace(z.Vector3[2]), s.scaleToRef(bs(2, e), z.Vector3[2]), this.l10.addInPlace(z.Vector3[2]), s.scaleToRef(bs(3, e), z.Vector3[2]), this.l11.addInPlace(z.Vector3[2]), s.scaleToRef(bs(4, e), z.Vector3[2]), this.l2_2.addInPlace(z.Vector3[2]), s.scaleToRef(bs(5, e), z.Vector3[2]), this.l2_1.addInPlace(z.Vector3[2]), s.scaleToRef(bs(6, e), z.Vector3[2]), this.l20.addInPlace(z.Vector3[2]), s.scaleToRef(bs(7, e), z.Vector3[2]), this.l21.addInPlace(z.Vector3[2]), s.scaleToRef(bs(8, e), z.Vector3[2]), this.l22.addInPlace(z.Vector3[2]);\n }\n /**\n * Scales the spherical harmonics by the given amount\n * @param scale the amount to scale\n */\n scaleInPlace(e) {\n this.l00.scaleInPlace(e), this.l1_1.scaleInPlace(e), this.l10.scaleInPlace(e), this.l11.scaleInPlace(e), this.l2_2.scaleInPlace(e), this.l2_1.scaleInPlace(e), this.l20.scaleInPlace(e), this.l21.scaleInPlace(e), this.l22.scaleInPlace(e);\n }\n /**\n * Convert from incident radiance (Li) to irradiance (E) by applying convolution with the cosine-weighted hemisphere.\n *\n * ```\n * E_lm = A_l * L_lm\n * ```\n *\n * In spherical harmonics this convolution amounts to scaling factors for each frequency band.\n * This corresponds to equation 5 in \"An Efficient Representation for Irradiance Environment Maps\", where\n * the scaling factors are given in equation 9.\n */\n convertIncidentRadianceToIrradiance() {\n this.l00.scaleInPlace(As[0]), this.l1_1.scaleInPlace(As[1]), this.l10.scaleInPlace(As[2]), this.l11.scaleInPlace(As[3]), this.l2_2.scaleInPlace(As[4]), this.l2_1.scaleInPlace(As[5]), this.l20.scaleInPlace(As[6]), this.l21.scaleInPlace(As[7]), this.l22.scaleInPlace(As[8]);\n }\n /**\n * Convert from irradiance to outgoing radiance for Lambertian BDRF, suitable for efficient shader evaluation.\n *\n * ```\n * L = (1/pi) * E * rho\n * ```\n *\n * This is done by an additional scale by 1/pi, so is a fairly trivial operation but important conceptually.\n */\n convertIrradianceToLambertianRadiance() {\n this.scaleInPlace(1 / Math.PI);\n }\n /**\n * Integrates the reconstruction coefficients directly in to the SH preventing further\n * required operations at run time.\n *\n * This is simply done by scaling back the SH with Ylm constants parameter.\n * The trigonometric part being applied by the shader at run time.\n */\n preScaleForRendering() {\n this.preScaled = !0, this.l00.scaleInPlace(rs[0]), this.l1_1.scaleInPlace(rs[1]), this.l10.scaleInPlace(rs[2]), this.l11.scaleInPlace(rs[3]), this.l2_2.scaleInPlace(rs[4]), this.l2_1.scaleInPlace(rs[5]), this.l20.scaleInPlace(rs[6]), this.l21.scaleInPlace(rs[7]), this.l22.scaleInPlace(rs[8]);\n }\n /**\n * update the spherical harmonics coefficients from the given array\n * @param data defines the 9x3 coefficients (l00, l1-1, l10, l11, l2-2, l2-1, l20, l21, l22)\n * @returns the spherical harmonics (this)\n */\n updateFromArray(e) {\n return _.FromArrayToRef(e[0], 0, this.l00), _.FromArrayToRef(e[1], 0, this.l1_1), _.FromArrayToRef(e[2], 0, this.l10), _.FromArrayToRef(e[3], 0, this.l11), _.FromArrayToRef(e[4], 0, this.l2_2), _.FromArrayToRef(e[5], 0, this.l2_1), _.FromArrayToRef(e[6], 0, this.l20), _.FromArrayToRef(e[7], 0, this.l21), _.FromArrayToRef(e[8], 0, this.l22), this;\n }\n /**\n * update the spherical harmonics coefficients from the given floats array\n * @param data defines the 9x3 coefficients (l00, l1-1, l10, l11, l2-2, l2-1, l20, l21, l22)\n * @returns the spherical harmonics (this)\n */\n updateFromFloatsArray(e) {\n return _.FromFloatsToRef(e[0], e[1], e[2], this.l00), _.FromFloatsToRef(e[3], e[4], e[5], this.l1_1), _.FromFloatsToRef(e[6], e[7], e[8], this.l10), _.FromFloatsToRef(e[9], e[10], e[11], this.l11), _.FromFloatsToRef(e[12], e[13], e[14], this.l2_2), _.FromFloatsToRef(e[15], e[16], e[17], this.l2_1), _.FromFloatsToRef(e[18], e[19], e[20], this.l20), _.FromFloatsToRef(e[21], e[22], e[23], this.l21), _.FromFloatsToRef(e[24], e[25], e[26], this.l22), this;\n }\n /**\n * Constructs a spherical harmonics from an array.\n * @param data defines the 9x3 coefficients (l00, l1-1, l10, l11, l2-2, l2-1, l20, l21, l22)\n * @returns the spherical harmonics\n */\n static FromArray(e) {\n return new xo().updateFromArray(e);\n }\n // Keep for references.\n /**\n * Gets the spherical harmonics from polynomial\n * @param polynomial the spherical polynomial\n * @returns the spherical harmonics\n */\n static FromPolynomial(e) {\n const t = new xo();\n return t.l00 = e.xx.scale(0.376127).add(e.yy.scale(0.376127)).add(e.zz.scale(0.376126)), t.l1_1 = e.y.scale(0.977204), t.l10 = e.z.scale(0.977204), t.l11 = e.x.scale(0.977204), t.l2_2 = e.xy.scale(1.16538), t.l2_1 = e.yz.scale(1.16538), t.l20 = e.zz.scale(1.34567).subtract(e.xx.scale(0.672834)).subtract(e.yy.scale(0.672834)), t.l21 = e.zx.scale(1.16538), t.l22 = e.xx.scale(1.16538).subtract(e.yy.scale(1.16538)), t.l1_1.scaleInPlace(-1), t.l11.scaleInPlace(-1), t.l2_1.scaleInPlace(-1), t.l21.scaleInPlace(-1), t.scaleInPlace(Math.PI), t;\n }\n}\nclass Co {\n constructor() {\n this.x = _.Zero(), this.y = _.Zero(), this.z = _.Zero(), this.xx = _.Zero(), this.yy = _.Zero(), this.zz = _.Zero(), this.xy = _.Zero(), this.yz = _.Zero(), this.zx = _.Zero();\n }\n /**\n * The spherical harmonics used to create the polynomials.\n */\n get preScaledHarmonics() {\n return this._harmonics || (this._harmonics = xo.FromPolynomial(this)), this._harmonics.preScaled || this._harmonics.preScaleForRendering(), this._harmonics;\n }\n /**\n * Adds an ambient color to the spherical polynomial\n * @param color the color to add\n */\n addAmbient(e) {\n z.Vector3[0].copyFromFloats(e.r, e.g, e.b);\n const t = z.Vector3[0];\n this.xx.addInPlace(t), this.yy.addInPlace(t), this.zz.addInPlace(t);\n }\n /**\n * Scales the spherical polynomial by the given amount\n * @param scale the amount to scale\n */\n scaleInPlace(e) {\n this.x.scaleInPlace(e), this.y.scaleInPlace(e), this.z.scaleInPlace(e), this.xx.scaleInPlace(e), this.yy.scaleInPlace(e), this.zz.scaleInPlace(e), this.yz.scaleInPlace(e), this.zx.scaleInPlace(e), this.xy.scaleInPlace(e);\n }\n /**\n * Updates the spherical polynomial from harmonics\n * @param harmonics the spherical harmonics\n * @returns the spherical polynomial\n */\n updateFromHarmonics(e) {\n return this._harmonics = e, this.x.copyFrom(e.l11), this.x.scaleInPlace(1.02333).scaleInPlace(-1), this.y.copyFrom(e.l1_1), this.y.scaleInPlace(1.02333).scaleInPlace(-1), this.z.copyFrom(e.l10), this.z.scaleInPlace(1.02333), this.xx.copyFrom(e.l00), z.Vector3[0].copyFrom(e.l20).scaleInPlace(0.247708), z.Vector3[1].copyFrom(e.l22).scaleInPlace(0.429043), this.xx.scaleInPlace(0.886277).subtractInPlace(z.Vector3[0]).addInPlace(z.Vector3[1]), this.yy.copyFrom(e.l00), this.yy.scaleInPlace(0.886277).subtractInPlace(z.Vector3[0]).subtractInPlace(z.Vector3[1]), this.zz.copyFrom(e.l00), z.Vector3[0].copyFrom(e.l20).scaleInPlace(0.495417), this.zz.scaleInPlace(0.886277).addInPlace(z.Vector3[0]), this.yz.copyFrom(e.l2_1), this.yz.scaleInPlace(0.858086).scaleInPlace(-1), this.zx.copyFrom(e.l21), this.zx.scaleInPlace(0.858086).scaleInPlace(-1), this.xy.copyFrom(e.l2_2), this.xy.scaleInPlace(0.858086), this.scaleInPlace(1 / Math.PI), this;\n }\n /**\n * Gets the spherical polynomial from harmonics\n * @param harmonics the spherical harmonics\n * @returns the spherical polynomial\n */\n static FromHarmonics(e) {\n return new Co().updateFromHarmonics(e);\n }\n /**\n * Constructs a spherical polynomial from an array.\n * @param data defines the 9x3 coefficients (x, y, z, xx, yy, zz, yz, zx, xy)\n * @returns the spherical polynomial\n */\n static FromArray(e) {\n const t = new Co();\n return _.FromArrayToRef(e[0], 0, t.x), _.FromArrayToRef(e[1], 0, t.y), _.FromArrayToRef(e[2], 0, t.z), _.FromArrayToRef(e[3], 0, t.xx), _.FromArrayToRef(e[4], 0, t.yy), _.FromArrayToRef(e[5], 0, t.zz), _.FromArrayToRef(e[6], 0, t.yz), _.FromArrayToRef(e[7], 0, t.zx), _.FromArrayToRef(e[8], 0, t.xy), t;\n }\n}\nclass Jn {\n constructor(e, t, i, r) {\n this.name = e, this.worldAxisForNormal = t, this.worldAxisForFileX = i, this.worldAxisForFileY = r;\n }\n}\nclass za {\n /**\n * Converts a texture to the according Spherical Polynomial data.\n * This extracts the first 3 orders only as they are the only one used in the lighting.\n *\n * @param texture The texture to extract the information from.\n * @returns The Spherical Polynomial data.\n */\n static ConvertCubeMapTextureToSphericalPolynomial(e) {\n var f;\n if (!e.isCube)\n return null;\n (f = e.getScene()) == null || f.getEngine().flushFramebuffer();\n const t = e.getSize().width, i = e.readPixels(0, void 0, void 0, !1), r = e.readPixels(1, void 0, void 0, !1);\n let s, a;\n e.isRenderTarget ? (s = e.readPixels(3, void 0, void 0, !1), a = e.readPixels(2, void 0, void 0, !1)) : (s = e.readPixels(2, void 0, void 0, !1), a = e.readPixels(3, void 0, void 0, !1));\n const o = e.readPixels(4, void 0, void 0, !1), l = e.readPixels(5, void 0, void 0, !1), c = e.gammaSpace, h = 5;\n let u = 0;\n return (e.textureType == 1 || e.textureType == 2) && (u = 1), new Promise((d) => {\n Promise.all([r, i, s, a, o, l]).then(([p, g, m, v, E, C]) => {\n const T = {\n size: t,\n right: g,\n left: p,\n up: m,\n down: v,\n front: E,\n back: C,\n format: h,\n type: u,\n gammaSpace: c\n };\n d(this.ConvertCubeMapToSphericalPolynomial(T));\n });\n });\n }\n /**\n * Compute the area on the unit sphere of the rectangle defined by (x,y) and the origin\n * See https://www.rorydriscoll.com/2012/01/15/cubemap-texel-solid-angle/\n * @param x\n * @param y\n * @returns the area\n */\n static _AreaElement(e, t) {\n return Math.atan2(e * t, Math.sqrt(e * e + t * t + 1));\n }\n /**\n * Converts a cubemap to the according Spherical Polynomial data.\n * This extracts the first 3 orders only as they are the only one used in the lighting.\n *\n * @param cubeInfo The Cube map to extract the information from.\n * @returns The Spherical Polynomial data.\n */\n static ConvertCubeMapToSphericalPolynomial(e) {\n const t = new xo();\n let i = 0;\n const r = 2 / e.size, s = r, a = 0.5 * r, o = a - 1;\n for (let f = 0; f < 6; f++) {\n const d = this._FileFaces[f], p = e[d.name];\n let g = o;\n const m = e.format === 5 ? 4 : 3;\n for (let v = 0; v < e.size; v++) {\n let E = o;\n for (let C = 0; C < e.size; C++) {\n const T = d.worldAxisForFileX.scale(E).add(d.worldAxisForFileY.scale(g)).add(d.worldAxisForNormal);\n T.normalize();\n const R = this._AreaElement(E - a, g - a) - this._AreaElement(E - a, g + a) - this._AreaElement(E + a, g - a) + this._AreaElement(E + a, g + a);\n let x = p[v * e.size * m + C * m + 0], S = p[v * e.size * m + C * m + 1], M = p[v * e.size * m + C * m + 2];\n isNaN(x) && (x = 0), isNaN(S) && (S = 0), isNaN(M) && (M = 0), e.type === 0 && (x /= 255, S /= 255, M /= 255), e.gammaSpace && (x = Math.pow(je.Clamp(x), zl), S = Math.pow(je.Clamp(S), zl), M = Math.pow(je.Clamp(M), zl));\n const N = this.MAX_HDRI_VALUE;\n if (this.PRESERVE_CLAMPED_COLORS) {\n const L = Math.max(x, S, M);\n if (L > N) {\n const K = N / L;\n x *= K, S *= K, M *= K;\n }\n } else\n x = je.Clamp(x, 0, N), S = je.Clamp(S, 0, N), M = je.Clamp(M, 0, N);\n const F = new Ne(x, S, M);\n t.addLight(T, F, R), i += R, E += r;\n }\n g += s;\n }\n }\n const u = 4 * Math.PI * 6 / 6 / i;\n return t.scaleInPlace(u), t.convertIncidentRadianceToIrradiance(), t.convertIrradianceToLambertianRadiance(), Co.FromHarmonics(t);\n }\n}\nza._FileFaces = [\n new Jn(\"right\", new _(1, 0, 0), new _(0, 0, -1), new _(0, -1, 0)),\n new Jn(\"left\", new _(-1, 0, 0), new _(0, 0, 1), new _(0, -1, 0)),\n new Jn(\"up\", new _(0, 1, 0), new _(1, 0, 0), new _(0, 0, 1)),\n new Jn(\"down\", new _(0, -1, 0), new _(1, 0, 0), new _(0, 0, -1)),\n new Jn(\"front\", new _(0, 0, 1), new _(1, 0, 0), new _(0, -1, 0)),\n new Jn(\"back\", new _(0, 0, -1), new _(-1, 0, 0), new _(0, -1, 0))\n // -Z bottom\n];\nza.MAX_HDRI_VALUE = 4096;\nza.PRESERVE_CLAMPED_COLORS = !1;\nIt.prototype.forceSphericalPolynomialsRecompute = function() {\n this._texture && (this._texture._sphericalPolynomial = null, this._texture._sphericalPolynomialPromise = null, this._texture._sphericalPolynomialComputed = !1);\n};\nObject.defineProperty(It.prototype, \"sphericalPolynomial\", {\n get: function() {\n if (this._texture) {\n if (this._texture._sphericalPolynomial || this._texture._sphericalPolynomialComputed)\n return this._texture._sphericalPolynomial;\n if (this._texture.isReady)\n return this._texture._sphericalPolynomialPromise || (this._texture._sphericalPolynomialPromise = za.ConvertCubeMapTextureToSphericalPolynomial(this), this._texture._sphericalPolynomialPromise === null ? this._texture._sphericalPolynomialComputed = !0 : this._texture._sphericalPolynomialPromise.then((n) => {\n this._texture._sphericalPolynomial = n, this._texture._sphericalPolynomialComputed = !0;\n })), null;\n }\n return null;\n },\n set: function(n) {\n this._texture && (this._texture._sphericalPolynomial = n);\n },\n enumerable: !0,\n configurable: !0\n});\nconst tM = \"pbrFragmentDeclaration\", iM = `uniform vec4 vEyePosition;uniform vec3 vReflectionColor;uniform vec4 vAlbedoColor;uniform vec4 vLightingIntensity;uniform vec4 vReflectivityColor;uniform vec4 vMetallicReflectanceFactors;uniform vec3 vEmissiveColor;uniform float visibility;uniform vec3 vAmbientColor;\n#ifdef ALBEDO\nuniform vec2 vAlbedoInfos;\n#endif\n#ifdef AMBIENT\nuniform vec4 vAmbientInfos;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;uniform vec2 vTangentSpaceParams;\n#endif\n#ifdef OPACITY\nuniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;\n#endif\n#ifdef REFLECTIVITY\nuniform vec3 vReflectivityInfos;\n#endif\n#ifdef MICROSURFACEMAP\nuniform vec2 vMicroSurfaceSamplerInfos;\n#endif\n#if defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_PROJECTION) || defined(SS_REFRACTION) || defined(PREPASS)\nuniform mat4 view;\n#endif\n#ifdef REFLECTION\nuniform vec2 vReflectionInfos;\n#ifdef REALTIME_FILTERING\nuniform vec2 vReflectionFilteringInfo;\n#endif\nuniform mat4 reflectionMatrix;uniform vec3 vReflectionMicrosurfaceInfos;\n#if defined(USE_LOCAL_REFLECTIONMAP_CUBIC) && defined(REFLECTIONMAP_CUBIC)\nuniform vec3 vReflectionPosition;uniform vec3 vReflectionSize; \n#endif\n#endif\n#if defined(SS_REFRACTION) && defined(SS_USE_LOCAL_REFRACTIONMAP_CUBIC)\nuniform vec3 vRefractionPosition;uniform vec3 vRefractionSize; \n#endif\n#ifdef CLEARCOAT\nuniform vec2 vClearCoatParams;uniform vec4 vClearCoatRefractionParams;\n#if defined(CLEARCOAT_TEXTURE) || defined(CLEARCOAT_TEXTURE_ROUGHNESS)\nuniform vec4 vClearCoatInfos;\n#endif\n#ifdef CLEARCOAT_TEXTURE\nuniform mat4 clearCoatMatrix;\n#endif\n#ifdef CLEARCOAT_TEXTURE_ROUGHNESS\nuniform mat4 clearCoatRoughnessMatrix;\n#endif\n#ifdef CLEARCOAT_BUMP\nuniform vec2 vClearCoatBumpInfos;uniform vec2 vClearCoatTangentSpaceParams;uniform mat4 clearCoatBumpMatrix;\n#endif\n#ifdef CLEARCOAT_TINT\nuniform vec4 vClearCoatTintParams;uniform float clearCoatColorAtDistance;\n#ifdef CLEARCOAT_TINT_TEXTURE\nuniform vec2 vClearCoatTintInfos;uniform mat4 clearCoatTintMatrix;\n#endif\n#endif\n#endif\n#ifdef IRIDESCENCE\nuniform vec4 vIridescenceParams;\n#if defined(IRIDESCENCE_TEXTURE) || defined(IRIDESCENCE_THICKNESS_TEXTURE)\nuniform vec4 vIridescenceInfos;\n#endif\n#ifdef IRIDESCENCE_TEXTURE\nuniform mat4 iridescenceMatrix;\n#endif\n#ifdef IRIDESCENCE_THICKNESS_TEXTURE\nuniform mat4 iridescenceThicknessMatrix;\n#endif\n#endif\n#ifdef ANISOTROPIC\nuniform vec3 vAnisotropy;\n#ifdef ANISOTROPIC_TEXTURE\nuniform vec2 vAnisotropyInfos;uniform mat4 anisotropyMatrix;\n#endif\n#endif\n#ifdef SHEEN\nuniform vec4 vSheenColor;\n#ifdef SHEEN_ROUGHNESS\nuniform float vSheenRoughness;\n#endif\n#if defined(SHEEN_TEXTURE) || defined(SHEEN_TEXTURE_ROUGHNESS)\nuniform vec4 vSheenInfos;\n#endif\n#ifdef SHEEN_TEXTURE\nuniform mat4 sheenMatrix;\n#endif\n#ifdef SHEEN_TEXTURE_ROUGHNESS\nuniform mat4 sheenRoughnessMatrix;\n#endif\n#endif\n#ifdef SUBSURFACE\n#ifdef SS_REFRACTION\nuniform vec4 vRefractionMicrosurfaceInfos;uniform vec4 vRefractionInfos;uniform mat4 refractionMatrix;\n#ifdef REALTIME_FILTERING\nuniform vec2 vRefractionFilteringInfo;\n#endif\n#ifdef SS_DISPERSION\nuniform float dispersion;\n#endif\n#endif\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nuniform vec2 vThicknessInfos;uniform mat4 thicknessMatrix;\n#endif\n#ifdef SS_REFRACTIONINTENSITY_TEXTURE\nuniform vec2 vRefractionIntensityInfos;uniform mat4 refractionIntensityMatrix;\n#endif\n#ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE\nuniform vec2 vTranslucencyIntensityInfos;uniform mat4 translucencyIntensityMatrix;\n#endif\nuniform vec2 vThicknessParam;uniform vec3 vDiffusionDistance;uniform vec4 vTintColor;uniform vec3 vSubSurfaceIntensity;\n#endif\n#ifdef PREPASS\n#ifdef SS_SCATTERING\nuniform float scatteringDiffusionProfile;\n#endif\n#endif\n#if DEBUGMODE>0\nuniform vec2 vDebugMode;\n#endif\n#ifdef DETAIL\nuniform vec4 vDetailInfos;\n#endif\n#include\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#ifdef SPHERICAL_HARMONICS\nuniform vec3 vSphericalL00;uniform vec3 vSphericalL1_1;uniform vec3 vSphericalL10;uniform vec3 vSphericalL11;uniform vec3 vSphericalL2_2;uniform vec3 vSphericalL2_1;uniform vec3 vSphericalL20;uniform vec3 vSphericalL21;uniform vec3 vSphericalL22;\n#else\nuniform vec3 vSphericalX;uniform vec3 vSphericalY;uniform vec3 vSphericalZ;uniform vec3 vSphericalXX_ZZ;uniform vec3 vSphericalYY_ZZ;uniform vec3 vSphericalZZ;uniform vec3 vSphericalXY;uniform vec3 vSphericalYZ;uniform vec3 vSphericalZX;\n#endif\n#endif\n#define ADDITIONAL_FRAGMENT_DECLARATION\n`;\nY.IncludesShadersStore[tM] = iM;\nconst rM = \"pbrUboDeclaration\", sM = `layout(std140,column_major) uniform;uniform Material {vec2 vAlbedoInfos;vec4 vAmbientInfos;vec2 vOpacityInfos;vec2 vEmissiveInfos;vec2 vLightmapInfos;vec3 vReflectivityInfos;vec2 vMicroSurfaceSamplerInfos;vec2 vReflectionInfos;vec2 vReflectionFilteringInfo;vec3 vReflectionPosition;vec3 vReflectionSize;vec3 vBumpInfos;mat4 albedoMatrix;mat4 ambientMatrix;mat4 opacityMatrix;mat4 emissiveMatrix;mat4 lightmapMatrix;mat4 reflectivityMatrix;mat4 microSurfaceSamplerMatrix;mat4 bumpMatrix;vec2 vTangentSpaceParams;mat4 reflectionMatrix;vec3 vReflectionColor;vec4 vAlbedoColor;vec4 vLightingIntensity;vec3 vReflectionMicrosurfaceInfos;float pointSize;vec4 vReflectivityColor;vec3 vEmissiveColor;vec3 vAmbientColor;vec2 vDebugMode;vec4 vMetallicReflectanceFactors;vec2 vMetallicReflectanceInfos;mat4 metallicReflectanceMatrix;vec2 vReflectanceInfos;mat4 reflectanceMatrix;vec3 vSphericalL00;vec3 vSphericalL1_1;vec3 vSphericalL10;vec3 vSphericalL11;vec3 vSphericalL2_2;vec3 vSphericalL2_1;vec3 vSphericalL20;vec3 vSphericalL21;vec3 vSphericalL22;vec3 vSphericalX;vec3 vSphericalY;vec3 vSphericalZ;vec3 vSphericalXX_ZZ;vec3 vSphericalYY_ZZ;vec3 vSphericalZZ;vec3 vSphericalXY;vec3 vSphericalYZ;vec3 vSphericalZX;\n#define ADDITIONAL_UBO_DECLARATION\n};\n#include\n#include\n`;\nY.IncludesShadersStore[rM] = sM;\nconst nM = \"pbrFragmentExtraDeclaration\", aM = `varying vec3 vPositionW;\n#if DEBUGMODE>0\nvarying vec4 vClipSpacePosition;\n#endif\n#include[1..7]\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvarying vec3 vEnvironmentIrradiance;\n#endif\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n`;\nY.IncludesShadersStore[nM] = aM;\nconst oM = \"samplerFragmentAlternateDeclaration\", lM = `#ifdef _DEFINENAME_\n#if _DEFINENAME_DIRECTUV==1\n#define v_VARYINGNAME_UV vMainUV1\n#elif _DEFINENAME_DIRECTUV==2\n#define v_VARYINGNAME_UV vMainUV2\n#elif _DEFINENAME_DIRECTUV==3\n#define v_VARYINGNAME_UV vMainUV3\n#elif _DEFINENAME_DIRECTUV==4\n#define v_VARYINGNAME_UV vMainUV4\n#elif _DEFINENAME_DIRECTUV==5\n#define v_VARYINGNAME_UV vMainUV5\n#elif _DEFINENAME_DIRECTUV==6\n#define v_VARYINGNAME_UV vMainUV6\n#else\nvarying vec2 v_VARYINGNAME_UV;\n#endif\n#endif\n`;\nY.IncludesShadersStore[oM] = lM;\nconst cM = \"pbrFragmentSamplersDeclaration\", hM = `#include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_SAMPLERNAME_,albedo)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_SAMPLERNAME_,ambient)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_SAMPLERNAME_,opacity)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_SAMPLERNAME_,emissive)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_SAMPLERNAME_,lightmap)\n#include(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity,_SAMPLERNAME_,reflectivity)\n#include(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler,_SAMPLERNAME_,microSurface)\n#include(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance,_SAMPLERNAME_,metallicReflectance)\n#include(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance,_SAMPLERNAME_,reflectance)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_SAMPLERNAME_,decal)\n#ifdef CLEARCOAT\n#include(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat,_SAMPLERNAME_,clearCoat)\n#include(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness)\n#if defined(CLEARCOAT_TEXTURE_ROUGHNESS) && !defined(CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL)\nuniform sampler2D clearCoatRoughnessSampler;\n#endif\n#include(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump,_SAMPLERNAME_,clearCoatBump)\n#include(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint,_SAMPLERNAME_,clearCoatTint)\n#endif\n#ifdef IRIDESCENCE\n#include(_DEFINENAME_,IRIDESCENCE_TEXTURE,_VARYINGNAME_,Iridescence,_SAMPLERNAME_,iridescence)\n#include(_DEFINENAME_,IRIDESCENCE_THICKNESS_TEXTURE,_VARYINGNAME_,IridescenceThickness,_SAMPLERNAME_,iridescenceThickness)\n#endif\n#ifdef SHEEN\n#include(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen,_SAMPLERNAME_,sheen)\n#include(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness)\n#if defined(SHEEN_ROUGHNESS) && defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL)\nuniform sampler2D sheenRoughnessSampler;\n#endif\n#endif\n#ifdef ANISOTROPIC\n#include(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy,_SAMPLERNAME_,anisotropy)\n#endif\n#ifdef REFLECTION\n#ifdef REFLECTIONMAP_3D\n#define sampleReflection(s,c) textureCube(s,c)\nuniform samplerCube reflectionSampler;\n#ifdef LODBASEDMICROSFURACE\n#define sampleReflectionLod(s,c,l) textureCubeLodEXT(s,c,l)\n#else\nuniform samplerCube reflectionSamplerLow;uniform samplerCube reflectionSamplerHigh;\n#endif\n#ifdef USEIRRADIANCEMAP\nuniform samplerCube irradianceSampler;\n#endif\n#else\n#define sampleReflection(s,c) texture2D(s,c)\nuniform sampler2D reflectionSampler;\n#ifdef LODBASEDMICROSFURACE\n#define sampleReflectionLod(s,c,l) texture2DLodEXT(s,c,l)\n#else\nuniform sampler2D reflectionSamplerLow;uniform sampler2D reflectionSamplerHigh;\n#endif\n#ifdef USEIRRADIANCEMAP\nuniform sampler2D irradianceSampler;\n#endif\n#endif\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#else\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#endif\n#endif\n#ifdef ENVIRONMENTBRDF\nuniform sampler2D environmentBrdfSampler;\n#endif\n#ifdef SUBSURFACE\n#ifdef SS_REFRACTION\n#ifdef SS_REFRACTIONMAP_3D\n#define sampleRefraction(s,c) textureCube(s,c)\nuniform samplerCube refractionSampler;\n#ifdef LODBASEDMICROSFURACE\n#define sampleRefractionLod(s,c,l) textureCubeLodEXT(s,c,l)\n#else\nuniform samplerCube refractionSamplerLow;uniform samplerCube refractionSamplerHigh;\n#endif\n#else\n#define sampleRefraction(s,c) texture2D(s,c)\nuniform sampler2D refractionSampler;\n#ifdef LODBASEDMICROSFURACE\n#define sampleRefractionLod(s,c,l) texture2DLodEXT(s,c,l)\n#else\nuniform sampler2D refractionSamplerLow;uniform sampler2D refractionSamplerHigh;\n#endif\n#endif\n#endif\n#include(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness,_SAMPLERNAME_,thickness)\n#include(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity,_SAMPLERNAME_,refractionIntensity)\n#include(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity,_SAMPLERNAME_,translucencyIntensity)\n#endif\n`;\nY.IncludesShadersStore[cM] = hM;\nconst uM = \"subSurfaceScatteringFunctions\", fM = `bool testLightingForSSS(float diffusionProfile)\n{return diffusionProfile<1.;}`;\nY.IncludesShadersStore[uM] = fM;\nconst dM = \"importanceSampling\", pM = `vec3 hemisphereCosSample(vec2 u) {float phi=2.*PI*u.x;float cosTheta2=1.-u.y;float cosTheta=sqrt(cosTheta2);float sinTheta=sqrt(1.-cosTheta2);return vec3(sinTheta*cos(phi),sinTheta*sin(phi),cosTheta);}\nvec3 hemisphereImportanceSampleDggx(vec2 u,float a) {float phi=2.*PI*u.x;float cosTheta2=(1.-u.y)/(1.+(a+1.)*((a-1.)*u.y));float cosTheta=sqrt(cosTheta2);float sinTheta=sqrt(1.-cosTheta2);return vec3(sinTheta*cos(phi),sinTheta*sin(phi),cosTheta);}\nvec3 hemisphereImportanceSampleDCharlie(vec2 u,float a) { \nfloat phi=2.*PI*u.x;float sinTheta=pow(u.y,a/(2.*a+1.));float cosTheta=sqrt(1.-sinTheta*sinTheta);return vec3(sinTheta*cos(phi),sinTheta*sin(phi),cosTheta);}`;\nY.IncludesShadersStore[dM] = pM;\nconst gM = \"pbrHelperFunctions\", mM = `#define MINIMUMVARIANCE 0.0005\nfloat convertRoughnessToAverageSlope(float roughness)\n{return square(roughness)+MINIMUMVARIANCE;}\nfloat fresnelGrazingReflectance(float reflectance0) {float reflectance90=saturate(reflectance0*25.0);return reflectance90;}\nvec2 getAARoughnessFactors(vec3 normalVector) {\n#ifdef SPECULARAA\nvec3 nDfdx=dFdx(normalVector.xyz);vec3 nDfdy=dFdy(normalVector.xyz);float slopeSquare=max(dot(nDfdx,nDfdx),dot(nDfdy,nDfdy));float geometricRoughnessFactor=pow(saturate(slopeSquare),0.333);float geometricAlphaGFactor=sqrt(slopeSquare);geometricAlphaGFactor*=0.75;return vec2(geometricRoughnessFactor,geometricAlphaGFactor);\n#else\nreturn vec2(0.);\n#endif\n}\n#ifdef ANISOTROPIC\n#ifdef ANISOTROPIC_LEGACY\nvec2 getAnisotropicRoughness(float alphaG,float anisotropy) {float alphaT=max(alphaG*(1.0+anisotropy),MINIMUMVARIANCE);float alphaB=max(alphaG*(1.0-anisotropy),MINIMUMVARIANCE);return vec2(alphaT,alphaB);}\nvec3 getAnisotropicBentNormals(const vec3 T,const vec3 B,const vec3 N,const vec3 V,float anisotropy,float roughness) {vec3 anisotropicFrameDirection=anisotropy>=0.0 ? B : T;vec3 anisotropicFrameTangent=cross(normalize(anisotropicFrameDirection),V);vec3 anisotropicFrameNormal=cross(anisotropicFrameTangent,anisotropicFrameDirection);vec3 anisotropicNormal=normalize(mix(N,anisotropicFrameNormal,abs(anisotropy)));return anisotropicNormal;}\n#else\nvec2 getAnisotropicRoughness(float alphaG,float anisotropy) {float alphaT=max(mix(alphaG,1.0,anisotropy*anisotropy),MINIMUMVARIANCE);float alphaB=max(alphaG,MINIMUMVARIANCE);return vec2(alphaT,alphaB);}\nvec3 getAnisotropicBentNormals(const vec3 T,const vec3 B,const vec3 N,const vec3 V,float anisotropy,float roughness) {vec3 bentNormal=cross(B,V);bentNormal=normalize(cross(bentNormal,B));float a=square(square(1.0-anisotropy*(1.0-roughness)));bentNormal=normalize(mix(bentNormal,N,a));return bentNormal;}\n#endif\n#endif\n#if defined(CLEARCOAT) || defined(SS_REFRACTION)\nvec3 cocaLambert(vec3 alpha,float distance) {return exp(-alpha*distance);}\nvec3 cocaLambert(float NdotVRefract,float NdotLRefract,vec3 alpha,float thickness) {return cocaLambert(alpha,(thickness*((NdotLRefract+NdotVRefract)/(NdotLRefract*NdotVRefract))));}\nvec3 computeColorAtDistanceInMedia(vec3 color,float distance) {return -log(color)/distance;}\nvec3 computeClearCoatAbsorption(float NdotVRefract,float NdotLRefract,vec3 clearCoatColor,float clearCoatThickness,float clearCoatIntensity) {vec3 clearCoatAbsorption=mix(vec3(1.0),\ncocaLambert(NdotVRefract,NdotLRefract,clearCoatColor,clearCoatThickness),\nclearCoatIntensity);return clearCoatAbsorption;}\n#endif\n#ifdef MICROSURFACEAUTOMATIC\nfloat computeDefaultMicroSurface(float microSurface,vec3 reflectivityColor)\n{const float kReflectivityNoAlphaWorkflow_SmoothnessMax=0.95;float reflectivityLuminance=getLuminance(reflectivityColor);float reflectivityLuma=sqrt(reflectivityLuminance);microSurface=reflectivityLuma*kReflectivityNoAlphaWorkflow_SmoothnessMax;return microSurface;}\n#endif\n`;\nY.IncludesShadersStore[gM] = mM;\nconst _M = \"harmonicsFunctions\", EM = `#ifdef USESPHERICALFROMREFLECTIONMAP\n#ifdef SPHERICAL_HARMONICS\nvec3 computeEnvironmentIrradiance(vec3 normal) {return vSphericalL00\n+ vSphericalL1_1*(normal.y)\n+ vSphericalL10*(normal.z)\n+ vSphericalL11*(normal.x)\n+ vSphericalL2_2*(normal.y*normal.x)\n+ vSphericalL2_1*(normal.y*normal.z)\n+ vSphericalL20*((3.0*normal.z*normal.z)-1.0)\n+ vSphericalL21*(normal.z*normal.x)\n+ vSphericalL22*(normal.x*normal.x-(normal.y*normal.y));}\n#else\nvec3 computeEnvironmentIrradiance(vec3 normal) {float Nx=normal.x;float Ny=normal.y;float Nz=normal.z;vec3 C1=vSphericalZZ.rgb;vec3 Cx=vSphericalX.rgb;vec3 Cy=vSphericalY.rgb;vec3 Cz=vSphericalZ.rgb;vec3 Cxx_zz=vSphericalXX_ZZ.rgb;vec3 Cyy_zz=vSphericalYY_ZZ.rgb;vec3 Cxy=vSphericalXY.rgb;vec3 Cyz=vSphericalYZ.rgb;vec3 Czx=vSphericalZX.rgb;vec3 a1=Cyy_zz*Ny+Cy;vec3 a2=Cyz*Nz+a1;vec3 b1=Czx*Nz+Cx;vec3 b2=Cxy*Ny+b1;vec3 b3=Cxx_zz*Nx+b2;vec3 t1=Cz *Nz+C1;vec3 t2=a2 *Ny+t1;vec3 t3=b3 *Nx+t2;return t3;}\n#endif\n#endif\n`;\nY.IncludesShadersStore[_M] = EM;\nconst vM = \"pbrDirectLightingSetupFunctions\", TM = `struct preLightingInfo\n{vec3 lightOffset;float lightDistanceSquared;float lightDistance;float attenuation;vec3 L;vec3 H;float NdotV;float NdotLUnclamped;float NdotL;float VdotH;float roughness;\n#ifdef IRIDESCENCE\nfloat iridescenceIntensity;\n#endif\n};preLightingInfo computePointAndSpotPreLightingInfo(vec4 lightData,vec3 V,vec3 N) {preLightingInfo result;result.lightOffset=lightData.xyz-vPositionW;result.lightDistanceSquared=dot(result.lightOffset,result.lightOffset);result.lightDistance=sqrt(result.lightDistanceSquared);result.L=normalize(result.lightOffset);result.H=normalize(V+result.L);result.VdotH=saturate(dot(V,result.H));result.NdotLUnclamped=dot(N,result.L);result.NdotL=saturateEps(result.NdotLUnclamped);return result;}\npreLightingInfo computeDirectionalPreLightingInfo(vec4 lightData,vec3 V,vec3 N) {preLightingInfo result;result.lightDistance=length(-lightData.xyz);result.L=normalize(-lightData.xyz);result.H=normalize(V+result.L);result.VdotH=saturate(dot(V,result.H));result.NdotLUnclamped=dot(N,result.L);result.NdotL=saturateEps(result.NdotLUnclamped);return result;}\npreLightingInfo computeHemisphericPreLightingInfo(vec4 lightData,vec3 V,vec3 N) {preLightingInfo result;result.NdotL=dot(N,lightData.xyz)*0.5+0.5;result.NdotL=saturateEps(result.NdotL);result.NdotLUnclamped=result.NdotL;\n#ifdef SPECULARTERM\nresult.L=normalize(lightData.xyz);result.H=normalize(V+result.L);result.VdotH=saturate(dot(V,result.H));\n#endif\nreturn result;}`;\nY.IncludesShadersStore[vM] = TM;\nconst xM = \"pbrDirectLightingFalloffFunctions\", CM = `float computeDistanceLightFalloff_Standard(vec3 lightOffset,float range)\n{return max(0.,1.0-length(lightOffset)/range);}\nfloat computeDistanceLightFalloff_Physical(float lightDistanceSquared)\n{return 1.0/maxEps(lightDistanceSquared);}\nfloat computeDistanceLightFalloff_GLTF(float lightDistanceSquared,float inverseSquaredRange)\n{float lightDistanceFalloff=1.0/maxEps(lightDistanceSquared);float factor=lightDistanceSquared*inverseSquaredRange;float attenuation=saturate(1.0-factor*factor);attenuation*=attenuation;lightDistanceFalloff*=attenuation;return lightDistanceFalloff;}\nfloat computeDistanceLightFalloff(vec3 lightOffset,float lightDistanceSquared,float range,float inverseSquaredRange)\n{\n#ifdef USEPHYSICALLIGHTFALLOFF\nreturn computeDistanceLightFalloff_Physical(lightDistanceSquared);\n#elif defined(USEGLTFLIGHTFALLOFF)\nreturn computeDistanceLightFalloff_GLTF(lightDistanceSquared,inverseSquaredRange);\n#else\nreturn computeDistanceLightFalloff_Standard(lightOffset,range);\n#endif\n}\nfloat computeDirectionalLightFalloff_Standard(vec3 lightDirection,vec3 directionToLightCenterW,float cosHalfAngle,float exponent)\n{float falloff=0.0;float cosAngle=maxEps(dot(-lightDirection,directionToLightCenterW));if (cosAngle>=cosHalfAngle)\n{falloff=max(0.,pow(cosAngle,exponent));}\nreturn falloff;}\nfloat computeDirectionalLightFalloff_Physical(vec3 lightDirection,vec3 directionToLightCenterW,float cosHalfAngle)\n{const float kMinusLog2ConeAngleIntensityRatio=6.64385618977; \nfloat concentrationKappa=kMinusLog2ConeAngleIntensityRatio/(1.0-cosHalfAngle);vec4 lightDirectionSpreadSG=vec4(-lightDirection*concentrationKappa,-concentrationKappa);float falloff=exp2(dot(vec4(directionToLightCenterW,1.0),lightDirectionSpreadSG));return falloff;}\nfloat computeDirectionalLightFalloff_GLTF(vec3 lightDirection,vec3 directionToLightCenterW,float lightAngleScale,float lightAngleOffset)\n{float cd=dot(-lightDirection,directionToLightCenterW);float falloff=saturate(cd*lightAngleScale+lightAngleOffset);falloff*=falloff;return falloff;}\nfloat computeDirectionalLightFalloff(vec3 lightDirection,vec3 directionToLightCenterW,float cosHalfAngle,float exponent,float lightAngleScale,float lightAngleOffset)\n{\n#ifdef USEPHYSICALLIGHTFALLOFF\nreturn computeDirectionalLightFalloff_Physical(lightDirection,directionToLightCenterW,cosHalfAngle);\n#elif defined(USEGLTFLIGHTFALLOFF)\nreturn computeDirectionalLightFalloff_GLTF(lightDirection,directionToLightCenterW,lightAngleScale,lightAngleOffset);\n#else\nreturn computeDirectionalLightFalloff_Standard(lightDirection,directionToLightCenterW,cosHalfAngle,exponent);\n#endif\n}`;\nY.IncludesShadersStore[xM] = CM;\nconst RM = \"pbrBRDFFunctions\", SM = `#define FRESNEL_MAXIMUM_ON_ROUGH 0.25\n#ifdef MS_BRDF_ENERGY_CONSERVATION\nvec3 getEnergyConservationFactor(const vec3 specularEnvironmentR0,const vec3 environmentBrdf) {return 1.0+specularEnvironmentR0*(1.0/environmentBrdf.y-1.0);}\n#endif\n#ifdef ENVIRONMENTBRDF\nvec3 getBRDFLookup(float NdotV,float perceptualRoughness) {vec2 UV=vec2(NdotV,perceptualRoughness);vec4 brdfLookup=texture2D(environmentBrdfSampler,UV);\n#ifdef ENVIRONMENTBRDF_RGBD\nbrdfLookup.rgb=fromRGBD(brdfLookup.rgba);\n#endif\nreturn brdfLookup.rgb;}\nvec3 getReflectanceFromBRDFLookup(const vec3 specularEnvironmentR0,const vec3 specularEnvironmentR90,const vec3 environmentBrdf) {\n#ifdef BRDF_V_HEIGHT_CORRELATED\nvec3 reflectance=(specularEnvironmentR90-specularEnvironmentR0)*environmentBrdf.x+specularEnvironmentR0*environmentBrdf.y;\n#else\nvec3 reflectance=specularEnvironmentR0*environmentBrdf.x+specularEnvironmentR90*environmentBrdf.y;\n#endif\nreturn reflectance;}\nvec3 getReflectanceFromBRDFLookup(const vec3 specularEnvironmentR0,const vec3 environmentBrdf) {\n#ifdef BRDF_V_HEIGHT_CORRELATED\nvec3 reflectance=mix(environmentBrdf.xxx,environmentBrdf.yyy,specularEnvironmentR0);\n#else\nvec3 reflectance=specularEnvironmentR0*environmentBrdf.x+environmentBrdf.y;\n#endif\nreturn reflectance;}\n#endif\n/* NOT USED\n#if defined(SHEEN) && defined(SHEEN_SOFTER)\nfloat getBRDFLookupCharlieSheen(float NdotV,float perceptualRoughness)\n{float c=1.0-NdotV;float c3=c*c*c;return 0.65584461*c3+1.0/(4.16526551+exp(-7.97291361*perceptualRoughness+6.33516894));}\n#endif\n*/\n#if !defined(ENVIRONMENTBRDF) || defined(REFLECTIONMAP_SKYBOX) || defined(ALPHAFRESNEL)\nvec3 getReflectanceFromAnalyticalBRDFLookup_Jones(float VdotN,vec3 reflectance0,vec3 reflectance90,float smoothness)\n{float weight=mix(FRESNEL_MAXIMUM_ON_ROUGH,1.0,smoothness);return reflectance0+weight*(reflectance90-reflectance0)*pow5(saturate(1.0-VdotN));}\n#endif\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF)\n/**\n* The sheen BRDF not containing F can be easily stored in the blue channel of the BRDF texture.\n* The blue channel contains DCharlie*VAshikhmin*NdotL as a lokkup table\n*/\nvec3 getSheenReflectanceFromBRDFLookup(const vec3 reflectance0,const vec3 environmentBrdf) {vec3 sheenEnvironmentReflectance=reflectance0*environmentBrdf.b;return sheenEnvironmentReflectance;}\n#endif\nvec3 fresnelSchlickGGX(float VdotH,vec3 reflectance0,vec3 reflectance90)\n{return reflectance0+(reflectance90-reflectance0)*pow5(1.0-VdotH);}\nfloat fresnelSchlickGGX(float VdotH,float reflectance0,float reflectance90)\n{return reflectance0+(reflectance90-reflectance0)*pow5(1.0-VdotH);}\n#ifdef CLEARCOAT\nvec3 getR0RemappedForClearCoat(vec3 f0) {\n#ifdef CLEARCOAT_DEFAULTIOR\n#ifdef MOBILE\nreturn saturate(f0*(f0*0.526868+0.529324)-0.0482256);\n#else\nreturn saturate(f0*(f0*(0.941892-0.263008*f0)+0.346479)-0.0285998);\n#endif\n#else\nvec3 s=sqrt(f0);vec3 t=(vClearCoatRefractionParams.z+vClearCoatRefractionParams.w*s)/(vClearCoatRefractionParams.w+vClearCoatRefractionParams.z*s);return square(t);\n#endif\n}\n#endif\n#ifdef IRIDESCENCE\nconst mat3 XYZ_TO_REC709=mat3(\n3.2404542,-0.9692660, 0.0556434,\n-1.5371385, 1.8760108,-0.2040259,\n-0.4985314, 0.0415560, 1.0572252\n);vec3 getIORTfromAirToSurfaceR0(vec3 f0) {vec3 sqrtF0=sqrt(f0);return (1.+sqrtF0)/(1.-sqrtF0);}\nvec3 getR0fromIORs(vec3 iorT,float iorI) {return square((iorT-vec3(iorI))/(iorT+vec3(iorI)));}\nfloat getR0fromIORs(float iorT,float iorI) {return square((iorT-iorI)/(iorT+iorI));}\nvec3 evalSensitivity(float opd,vec3 shift) {float phase=2.0*PI*opd*1.0e-9;const vec3 val=vec3(5.4856e-13,4.4201e-13,5.2481e-13);const vec3 pos=vec3(1.6810e+06,1.7953e+06,2.2084e+06);const vec3 var=vec3(4.3278e+09,9.3046e+09,6.6121e+09);vec3 xyz=val*sqrt(2.0*PI*var)*cos(pos*phase+shift)*exp(-square(phase)*var);xyz.x+=9.7470e-14*sqrt(2.0*PI*4.5282e+09)*cos(2.2399e+06*phase+shift[0])*exp(-4.5282e+09*square(phase));xyz/=1.0685e-7;vec3 srgb=XYZ_TO_REC709*xyz;return srgb;}\nvec3 evalIridescence(float outsideIOR,float eta2,float cosTheta1,float thinFilmThickness,vec3 baseF0) {vec3 I=vec3(1.0);float iridescenceIOR=mix(outsideIOR,eta2,smoothstep(0.0,0.03,thinFilmThickness));float sinTheta2Sq=square(outsideIOR/iridescenceIOR)*(1.0-square(cosTheta1));float cosTheta2Sq=1.0-sinTheta2Sq;if (cosTheta2Sq<0.0) {return I;}\nfloat cosTheta2=sqrt(cosTheta2Sq);float R0=getR0fromIORs(iridescenceIOR,outsideIOR);float R12=fresnelSchlickGGX(cosTheta1,R0,1.);float R21=R12;float T121=1.0-R12;float phi12=0.0;if (iridescenceIOR0\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nfloat radicalInverse_VdC(uint bits) \n{bits=(bits<<16u) | (bits>>16u);bits=((bits & 0x55555555u)<<1u) | ((bits & 0xAAAAAAAAu)>>1u);bits=((bits & 0x33333333u)<<2u) | ((bits & 0xCCCCCCCCu)>>2u);bits=((bits & 0x0F0F0F0Fu)<<4u) | ((bits & 0xF0F0F0F0u)>>4u);bits=((bits & 0x00FF00FFu)<<8u) | ((bits & 0xFF00FF00u)>>8u);return float(bits)*2.3283064365386963e-10; }\nvec2 hammersley(uint i,uint N)\n{return vec2(float(i)/float(N),radicalInverse_VdC(i));}\n#else\nfloat vanDerCorpus(int n,int base)\n{float invBase=1.0/float(base);float denom =1.0;float result =0.0;for(int i=0; i<32; ++i)\n{if(n>0)\n{denom =mod(float(n),2.0);result+=denom*invBase;invBase=invBase/2.0;n =int(float(n)/2.0);}}\nreturn result;}\nvec2 hammersley(int i,int N)\n{return vec2(float(i)/float(N),vanDerCorpus(i,2));}\n#endif\nfloat log4(float x) {return log2(x)/2.;}\nconst float NUM_SAMPLES_FLOAT=float(NUM_SAMPLES);const float NUM_SAMPLES_FLOAT_INVERSED=1./NUM_SAMPLES_FLOAT;const float K=4.;\n#define inline\nvec3 irradiance(samplerCube inputTexture,vec3 inputN,vec2 filteringInfo)\n{vec3 n=normalize(inputN);vec3 result=vec3(0.0);vec3 tangent=abs(n.z)<0.999 ? vec3(0.,0.,1.) : vec3(1.,0.,0.);tangent=normalize(cross(tangent,n));vec3 bitangent=cross(n,tangent);mat3 tbn=mat3(tangent,bitangent,n);float maxLevel=filteringInfo.y;float dim0=filteringInfo.x;float omegaP=(4.*PI)/(6.*dim0*dim0);\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nfor(uint i=0u; i0.) {float pdf_inversed=PI/NoL;float omegaS=NUM_SAMPLES_FLOAT_INVERSED*pdf_inversed;float l=log4(omegaS)-log4(omegaP)+log4(K);float mipLevel=clamp(l,0.0,maxLevel);vec3 c=textureCubeLodEXT(inputTexture,tbn*Ls,mipLevel).rgb;\n#ifdef GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nresult+=c;}}\nresult=result*NUM_SAMPLES_FLOAT_INVERSED;return result;}\n#define inline\nvec3 radiance(float alphaG,samplerCube inputTexture,vec3 inputN,vec2 filteringInfo)\n{vec3 n=normalize(inputN);vec3 c=textureCube(inputTexture,n).rgb; \nif (alphaG==0.) {\n#ifdef GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nreturn c;} else {vec3 result=vec3(0.);vec3 tangent=abs(n.z)<0.999 ? vec3(0.,0.,1.) : vec3(1.,0.,0.);tangent=normalize(cross(tangent,n));vec3 bitangent=cross(n,tangent);mat3 tbn=mat3(tangent,bitangent,n);float maxLevel=filteringInfo.y;float dim0=filteringInfo.x;float omegaP=(4.*PI)/(6.*dim0*dim0);float weight=0.;\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nfor(uint i=0u; i0.) {float pdf_inversed=4./normalDistributionFunction_TrowbridgeReitzGGX(NoH,alphaG);float omegaS=NUM_SAMPLES_FLOAT_INVERSED*pdf_inversed;float l=log4(omegaS)-log4(omegaP)+log4(K);float mipLevel=clamp(float(l),0.0,maxLevel);weight+=NoL;vec3 c=textureCubeLodEXT(inputTexture,tbn*L,mipLevel).rgb;\n#ifdef GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nresult+=c*NoL;}}\nresult=result/weight;return result;}}\n#endif\n#endif\n`;\nY.IncludesShadersStore[yM] = IM;\nconst bM = \"pbrDirectLightingFunctions\", AM = `#define CLEARCOATREFLECTANCE90 1.0\nstruct lightingInfo\n{vec3 diffuse;\n#ifdef SPECULARTERM\nvec3 specular;\n#endif\n#ifdef CLEARCOAT\nvec4 clearCoat;\n#endif\n#ifdef SHEEN\nvec3 sheen;\n#endif\n};float adjustRoughnessFromLightProperties(float roughness,float lightRadius,float lightDistance) {\n#if defined(USEPHYSICALLIGHTFALLOFF) || defined(USEGLTFLIGHTFALLOFF)\nfloat lightRoughness=lightRadius/lightDistance;float totalRoughness=saturate(lightRoughness+roughness);return totalRoughness;\n#else\nreturn roughness;\n#endif\n}\nvec3 computeHemisphericDiffuseLighting(preLightingInfo info,vec3 lightColor,vec3 groundColor) {return mix(groundColor,lightColor,info.NdotL);}\nvec3 computeDiffuseLighting(preLightingInfo info,vec3 lightColor) {float diffuseTerm=diffuseBRDF_Burley(info.NdotL,info.NdotV,info.VdotH,info.roughness);return diffuseTerm*info.attenuation*info.NdotL*lightColor;}\n#define inline\nvec3 computeProjectionTextureDiffuseLighting(sampler2D projectionLightSampler,mat4 textureProjectionMatrix){vec4 strq=textureProjectionMatrix*vec4(vPositionW,1.0);strq/=strq.w;vec3 textureColor=texture2D(projectionLightSampler,strq.xy).rgb;return toLinearSpace(textureColor);}\n#ifdef SS_TRANSLUCENCY\nvec3 computeDiffuseAndTransmittedLighting(preLightingInfo info,vec3 lightColor,vec3 transmittance) {float NdotL=absEps(info.NdotLUnclamped);float wrapNdotL=computeWrappedDiffuseNdotL(NdotL,0.02);float trAdapt=step(0.,info.NdotLUnclamped);vec3 transmittanceNdotL=mix(transmittance*wrapNdotL,vec3(wrapNdotL),trAdapt);float diffuseTerm=diffuseBRDF_Burley(NdotL,info.NdotV,info.VdotH,info.roughness);return diffuseTerm*transmittanceNdotL*info.attenuation*lightColor;}\n#endif\n#ifdef SPECULARTERM\nvec3 computeSpecularLighting(preLightingInfo info,vec3 N,vec3 reflectance0,vec3 reflectance90,float geometricRoughnessFactor,vec3 lightColor) {float NdotH=saturateEps(dot(N,info.H));float roughness=max(info.roughness,geometricRoughnessFactor);float alphaG=convertRoughnessToAverageSlope(roughness);vec3 fresnel=fresnelSchlickGGX(info.VdotH,reflectance0,reflectance90);\n#ifdef IRIDESCENCE\nfresnel=mix(fresnel,reflectance0,info.iridescenceIntensity);\n#endif\nfloat distribution=normalDistributionFunction_TrowbridgeReitzGGX(NdotH,alphaG);\n#ifdef BRDF_V_HEIGHT_CORRELATED\nfloat smithVisibility=smithVisibility_GGXCorrelated(info.NdotL,info.NdotV,alphaG);\n#else\nfloat smithVisibility=smithVisibility_TrowbridgeReitzGGXFast(info.NdotL,info.NdotV,alphaG);\n#endif\nvec3 specTerm=fresnel*distribution*smithVisibility;return specTerm*info.attenuation*info.NdotL*lightColor;}\n#endif\n#ifdef ANISOTROPIC\nvec3 computeAnisotropicSpecularLighting(preLightingInfo info,vec3 V,vec3 N,vec3 T,vec3 B,float anisotropy,vec3 reflectance0,vec3 reflectance90,float geometricRoughnessFactor,vec3 lightColor) {float NdotH=saturateEps(dot(N,info.H));float TdotH=dot(T,info.H);float BdotH=dot(B,info.H);float TdotV=dot(T,V);float BdotV=dot(B,V);float TdotL=dot(T,info.L);float BdotL=dot(B,info.L);float alphaG=convertRoughnessToAverageSlope(info.roughness);vec2 alphaTB=getAnisotropicRoughness(alphaG,anisotropy);alphaTB=max(alphaTB,square(geometricRoughnessFactor));vec3 fresnel=fresnelSchlickGGX(info.VdotH,reflectance0,reflectance90);\n#ifdef IRIDESCENCE\nfresnel=mix(fresnel,reflectance0,info.iridescenceIntensity);\n#endif\nfloat distribution=normalDistributionFunction_BurleyGGX_Anisotropic(NdotH,TdotH,BdotH,alphaTB);float smithVisibility=smithVisibility_GGXCorrelated_Anisotropic(info.NdotL,info.NdotV,TdotV,BdotV,TdotL,BdotL,alphaTB);vec3 specTerm=fresnel*distribution*smithVisibility;return specTerm*info.attenuation*info.NdotL*lightColor;}\n#endif\n#ifdef CLEARCOAT\nvec4 computeClearCoatLighting(preLightingInfo info,vec3 Ncc,float geometricRoughnessFactor,float clearCoatIntensity,vec3 lightColor) {float NccdotL=saturateEps(dot(Ncc,info.L));float NccdotH=saturateEps(dot(Ncc,info.H));float clearCoatRoughness=max(info.roughness,geometricRoughnessFactor);float alphaG=convertRoughnessToAverageSlope(clearCoatRoughness);float fresnel=fresnelSchlickGGX(info.VdotH,vClearCoatRefractionParams.x,CLEARCOATREFLECTANCE90);fresnel*=clearCoatIntensity;float distribution=normalDistributionFunction_TrowbridgeReitzGGX(NccdotH,alphaG);float kelemenVisibility=visibility_Kelemen(info.VdotH);float clearCoatTerm=fresnel*distribution*kelemenVisibility;return vec4(\nclearCoatTerm*info.attenuation*NccdotL*lightColor,\n1.0-fresnel\n);}\nvec3 computeClearCoatLightingAbsorption(float NdotVRefract,vec3 L,vec3 Ncc,vec3 clearCoatColor,float clearCoatThickness,float clearCoatIntensity) {vec3 LRefract=-refract(L,Ncc,vClearCoatRefractionParams.y);float NdotLRefract=saturateEps(dot(Ncc,LRefract));vec3 absorption=computeClearCoatAbsorption(NdotVRefract,NdotLRefract,clearCoatColor,clearCoatThickness,clearCoatIntensity);return absorption;}\n#endif\n#ifdef SHEEN\nvec3 computeSheenLighting(preLightingInfo info,vec3 N,vec3 reflectance0,vec3 reflectance90,float geometricRoughnessFactor,vec3 lightColor) {float NdotH=saturateEps(dot(N,info.H));float roughness=max(info.roughness,geometricRoughnessFactor);float alphaG=convertRoughnessToAverageSlope(roughness);float fresnel=1.;float distribution=normalDistributionFunction_CharlieSheen(NdotH,alphaG);/*#ifdef SHEEN_SOFTER\nfloat visibility=visibility_CharlieSheen(info.NdotL,info.NdotV,alphaG);\n#else */\nfloat visibility=visibility_Ashikhmin(info.NdotL,info.NdotV);/* #endif */\nfloat sheenTerm=fresnel*distribution*visibility;return sheenTerm*info.attenuation*info.NdotL*lightColor;}\n#endif\n`;\nY.IncludesShadersStore[bM] = AM;\nconst MM = \"pbrIBLFunctions\", PM = `#if defined(REFLECTION) || defined(SS_REFRACTION)\nfloat getLodFromAlphaG(float cubeMapDimensionPixels,float microsurfaceAverageSlope) {float microsurfaceAverageSlopeTexels=cubeMapDimensionPixels*microsurfaceAverageSlope;float lod=log2(microsurfaceAverageSlopeTexels);return lod;}\nfloat getLinearLodFromRoughness(float cubeMapDimensionPixels,float roughness) {float lod=log2(cubeMapDimensionPixels)*roughness;return lod;}\n#endif\n#if defined(ENVIRONMENTBRDF) && defined(RADIANCEOCCLUSION)\nfloat environmentRadianceOcclusion(float ambientOcclusion,float NdotVUnclamped) {float temp=NdotVUnclamped+ambientOcclusion;return saturate(square(temp)-1.0+ambientOcclusion);}\n#endif\n#if defined(ENVIRONMENTBRDF) && defined(HORIZONOCCLUSION)\nfloat environmentHorizonOcclusion(vec3 view,vec3 normal,vec3 geometricNormal) {vec3 reflection=reflect(view,normal);float temp=saturate(1.0+1.1*dot(reflection,geometricNormal));return square(temp);}\n#endif\n#if defined(LODINREFLECTIONALPHA) || defined(SS_LODINREFRACTIONALPHA)\n#define UNPACK_LOD(x) (1.0-x)*255.0\nfloat getLodFromAlphaG(float cubeMapDimensionPixels,float alphaG,float NdotV) {float microsurfaceAverageSlope=alphaG;microsurfaceAverageSlope*=sqrt(abs(NdotV));return getLodFromAlphaG(cubeMapDimensionPixels,microsurfaceAverageSlope);}\n#endif\n`;\nY.IncludesShadersStore[MM] = PM;\nconst OM = \"pbrBlockAlbedoOpacity\", DM = `struct albedoOpacityOutParams\n{vec3 surfaceAlbedo;float alpha;};\n#define pbr_inline\nvoid albedoOpacityBlock(\nin vec4 vAlbedoColor,\n#ifdef ALBEDO\nin vec4 albedoTexture,\nin vec2 albedoInfos,\n#endif\n#ifdef OPACITY\nin vec4 opacityMap,\nin vec2 vOpacityInfos,\n#endif\n#ifdef DETAIL\nin vec4 detailColor,\nin vec4 vDetailInfos,\n#endif\n#ifdef DECAL\nin vec4 decalColor,\nin vec4 vDecalInfos,\n#endif\nout albedoOpacityOutParams outParams\n)\n{vec3 surfaceAlbedo=vAlbedoColor.rgb;float alpha=vAlbedoColor.a;\n#ifdef ALBEDO\n#if defined(ALPHAFROMALBEDO) || defined(ALPHATEST)\nalpha*=albedoTexture.a;\n#endif\n#ifdef GAMMAALBEDO\nsurfaceAlbedo*=toLinearSpace(albedoTexture.rgb);\n#else\nsurfaceAlbedo*=albedoTexture.rgb;\n#endif\nsurfaceAlbedo*=albedoInfos.y;\n#endif\n#ifndef DECAL_AFTER_DETAIL\n#include\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nsurfaceAlbedo*=vColor.rgb;\n#endif\n#ifdef DETAIL\nfloat detailAlbedo=2.0*mix(0.5,detailColor.r,vDetailInfos.y);surfaceAlbedo.rgb=surfaceAlbedo.rgb*detailAlbedo*detailAlbedo; \n#endif\n#ifdef DECAL_AFTER_DETAIL\n#include\n#endif\n#define CUSTOM_FRAGMENT_UPDATE_ALBEDO\n#ifdef OPACITY\n#ifdef OPACITYRGB\nalpha=getLuminance(opacityMap.rgb);\n#else\nalpha*=opacityMap.a;\n#endif\nalpha*=vOpacityInfos.y;\n#endif\n#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nalpha*=vColor.a;\n#endif\n#if !defined(SS_LINKREFRACTIONTOTRANSPARENCY) && !defined(ALPHAFRESNEL)\n#ifdef ALPHATEST \n#if DEBUGMODE != 88\nif (alpha0\n#ifdef METALLICWORKFLOW\nvec2 metallicRoughness;\n#ifdef REFLECTIVITY\nvec4 surfaceMetallicColorMap;\n#endif\n#ifndef FROSTBITE_REFLECTANCE\nvec3 metallicF0;\n#endif\n#else\n#ifdef REFLECTIVITY\nvec4 surfaceReflectivityColorMap;\n#endif\n#endif\n#endif\n};\n#define pbr_inline\nvoid reflectivityBlock(\nin vec4 vReflectivityColor,\n#ifdef METALLICWORKFLOW\nin vec3 surfaceAlbedo,\nin vec4 metallicReflectanceFactors,\n#endif\n#ifdef REFLECTIVITY\nin vec3 reflectivityInfos,\nin vec4 surfaceMetallicOrReflectivityColorMap,\n#endif\n#if defined(METALLICWORKFLOW) && defined(REFLECTIVITY) && defined(AOSTOREINMETALMAPRED)\nin vec3 ambientOcclusionColorIn,\n#endif\n#ifdef MICROSURFACEMAP\nin vec4 microSurfaceTexel,\n#endif\n#ifdef DETAIL\nin vec4 detailColor,\nin vec4 vDetailInfos,\n#endif\nout reflectivityOutParams outParams\n)\n{float microSurface=vReflectivityColor.a;vec3 surfaceReflectivityColor=vReflectivityColor.rgb;\n#ifdef METALLICWORKFLOW\nvec2 metallicRoughness=surfaceReflectivityColor.rg;\n#ifdef REFLECTIVITY\n#if DEBUGMODE>0\noutParams.surfaceMetallicColorMap=surfaceMetallicOrReflectivityColorMap;\n#endif\n#ifdef AOSTOREINMETALMAPRED\nvec3 aoStoreInMetalMap=vec3(surfaceMetallicOrReflectivityColorMap.r,surfaceMetallicOrReflectivityColorMap.r,surfaceMetallicOrReflectivityColorMap.r);outParams.ambientOcclusionColor=mix(ambientOcclusionColorIn,aoStoreInMetalMap,reflectivityInfos.z);\n#endif\n#ifdef METALLNESSSTOREINMETALMAPBLUE\nmetallicRoughness.r*=surfaceMetallicOrReflectivityColorMap.b;\n#else\nmetallicRoughness.r*=surfaceMetallicOrReflectivityColorMap.r;\n#endif\n#ifdef ROUGHNESSSTOREINMETALMAPALPHA\nmetallicRoughness.g*=surfaceMetallicOrReflectivityColorMap.a;\n#else\n#ifdef ROUGHNESSSTOREINMETALMAPGREEN\nmetallicRoughness.g*=surfaceMetallicOrReflectivityColorMap.g;\n#endif\n#endif\n#endif\n#ifdef DETAIL\nfloat detailRoughness=mix(0.5,detailColor.b,vDetailInfos.w);float loLerp=mix(0.,metallicRoughness.g,detailRoughness*2.);float hiLerp=mix(metallicRoughness.g,1.,(detailRoughness-0.5)*2.);metallicRoughness.g=mix(loLerp,hiLerp,step(detailRoughness,0.5));\n#endif\n#ifdef MICROSURFACEMAP\nmetallicRoughness.g*=microSurfaceTexel.r;\n#endif\n#if DEBUGMODE>0\noutParams.metallicRoughness=metallicRoughness;\n#endif\n#define CUSTOM_FRAGMENT_UPDATE_METALLICROUGHNESS\nmicroSurface=1.0-metallicRoughness.g;vec3 baseColor=surfaceAlbedo;\n#ifdef FROSTBITE_REFLECTANCE\noutParams.surfaceAlbedo=baseColor.rgb*(1.0-metallicRoughness.r);surfaceReflectivityColor=mix(0.16*reflectance*reflectance,baseColor,metallicRoughness.r);\n#else\nvec3 metallicF0=metallicReflectanceFactors.rgb;\n#if DEBUGMODE>0\noutParams.metallicF0=metallicF0;\n#endif\noutParams.surfaceAlbedo=mix(baseColor.rgb*(1.0-metallicF0),vec3(0.,0.,0.),metallicRoughness.r);surfaceReflectivityColor=mix(metallicF0,baseColor,metallicRoughness.r);\n#endif\n#else\n#ifdef REFLECTIVITY\nsurfaceReflectivityColor*=surfaceMetallicOrReflectivityColorMap.rgb;\n#if DEBUGMODE>0\noutParams.surfaceReflectivityColorMap=surfaceMetallicOrReflectivityColorMap;\n#endif\n#ifdef MICROSURFACEFROMREFLECTIVITYMAP\nmicroSurface*=surfaceMetallicOrReflectivityColorMap.a;microSurface*=reflectivityInfos.z;\n#else\n#ifdef MICROSURFACEAUTOMATIC\nmicroSurface*=computeDefaultMicroSurface(microSurface,surfaceReflectivityColor);\n#endif\n#ifdef MICROSURFACEMAP\nmicroSurface*=microSurfaceTexel.r;\n#endif\n#define CUSTOM_FRAGMENT_UPDATE_MICROSURFACE\n#endif\n#endif\n#endif\nmicroSurface=saturate(microSurface);float roughness=1.-microSurface;outParams.microSurface=microSurface;outParams.roughness=roughness;outParams.surfaceReflectivityColor=surfaceReflectivityColor;}\n`;\nY.IncludesShadersStore[NM] = FM;\nconst LM = \"pbrBlockAmbientOcclusion\", wM = `struct ambientOcclusionOutParams\n{vec3 ambientOcclusionColor;\n#if DEBUGMODE>0 && defined(AMBIENT)\nvec3 ambientOcclusionColorMap;\n#endif\n};\n#define pbr_inline\nvoid ambientOcclusionBlock(\n#ifdef AMBIENT\nin vec3 ambientOcclusionColorMap_,\nin vec4 vAmbientInfos,\n#endif\nout ambientOcclusionOutParams outParams\n)\n{vec3 ambientOcclusionColor=vec3(1.,1.,1.);\n#ifdef AMBIENT\nvec3 ambientOcclusionColorMap=ambientOcclusionColorMap_*vAmbientInfos.y;\n#ifdef AMBIENTINGRAYSCALE\nambientOcclusionColorMap=vec3(ambientOcclusionColorMap.r,ambientOcclusionColorMap.r,ambientOcclusionColorMap.r);\n#endif\nambientOcclusionColor=mix(ambientOcclusionColor,ambientOcclusionColorMap,vAmbientInfos.z);\n#if DEBUGMODE>0\noutParams.ambientOcclusionColorMap=ambientOcclusionColorMap;\n#endif\n#endif\noutParams.ambientOcclusionColor=ambientOcclusionColor;}\n`;\nY.IncludesShadersStore[LM] = wM;\nconst UM = \"pbrBlockAlphaFresnel\", VM = `#ifdef ALPHAFRESNEL\n#if defined(ALPHATEST) || defined(ALPHABLEND)\nstruct alphaFresnelOutParams\n{float alpha;};\n#define pbr_inline\nvoid alphaFresnelBlock(\nin vec3 normalW,\nin vec3 viewDirectionW,\nin float alpha,\nin float microSurface,\nout alphaFresnelOutParams outParams\n)\n{float opacityPerceptual=alpha;\n#ifdef LINEARALPHAFRESNEL\nfloat opacity0=opacityPerceptual;\n#else\nfloat opacity0=opacityPerceptual*opacityPerceptual;\n#endif\nfloat opacity90=fresnelGrazingReflectance(opacity0);vec3 normalForward=faceforward(normalW,-viewDirectionW,normalW);outParams.alpha=getReflectanceFromAnalyticalBRDFLookup_Jones(saturate(dot(viewDirectionW,normalForward)),vec3(opacity0),vec3(opacity90),sqrt(microSurface)).x;\n#ifdef ALPHATEST\nif (outParams.alpha0 && defined(ANISOTROPIC_TEXTURE)\nvec3 anisotropyMapData;\n#endif\n};\n#define pbr_inline\nvoid anisotropicBlock(\nin vec3 vAnisotropy,\nin float roughness,\n#ifdef ANISOTROPIC_TEXTURE\nin vec3 anisotropyMapData,\n#endif\nin mat3 TBN,\nin vec3 normalW,\nin vec3 viewDirectionW,\nout anisotropicOutParams outParams\n)\n{float anisotropy=vAnisotropy.b;vec3 anisotropyDirection=vec3(vAnisotropy.xy,0.);\n#ifdef ANISOTROPIC_TEXTURE\nanisotropy*=anisotropyMapData.b;\n#if DEBUGMODE>0\noutParams.anisotropyMapData=anisotropyMapData;\n#endif\nanisotropyMapData.rg=anisotropyMapData.rg*2.0-1.0;\n#ifdef ANISOTROPIC_LEGACY\nanisotropyDirection.rg*=anisotropyMapData.rg;\n#else\nanisotropyDirection.xy=mat2(anisotropyDirection.x,anisotropyDirection.y,-anisotropyDirection.y,anisotropyDirection.x)*normalize(anisotropyMapData.rg);\n#endif\n#endif\nmat3 anisoTBN=mat3(normalize(TBN[0]),normalize(TBN[1]),normalize(TBN[2]));vec3 anisotropicTangent=normalize(anisoTBN*anisotropyDirection);vec3 anisotropicBitangent=normalize(cross(anisoTBN[2],anisotropicTangent));outParams.anisotropy=anisotropy;outParams.anisotropicTangent=anisotropicTangent;outParams.anisotropicBitangent=anisotropicBitangent;outParams.anisotropicNormal=getAnisotropicBentNormals(anisotropicTangent,anisotropicBitangent,normalW,viewDirectionW,anisotropy,roughness);}\n#endif\n`;\nY.IncludesShadersStore[BM] = kM;\nconst zM = \"pbrBlockReflection\", WM = `#ifdef REFLECTION\nstruct reflectionOutParams\n{vec4 environmentRadiance;vec3 environmentIrradiance;\n#ifdef REFLECTIONMAP_3D\nvec3 reflectionCoords;\n#else\nvec2 reflectionCoords;\n#endif\n#ifdef SS_TRANSLUCENCY\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\nvec3 irradianceVector;\n#endif\n#endif\n#endif\n};\n#define pbr_inline\nvoid createReflectionCoords(\nin vec3 vPositionW,\nin vec3 normalW,\n#ifdef ANISOTROPIC\nin anisotropicOutParams anisotropicOut,\n#endif\n#ifdef REFLECTIONMAP_3D\nout vec3 reflectionCoords\n#else\nout vec2 reflectionCoords\n#endif\n)\n{\n#ifdef ANISOTROPIC\nvec3 reflectionVector=computeReflectionCoords(vec4(vPositionW,1.0),anisotropicOut.anisotropicNormal);\n#else\nvec3 reflectionVector=computeReflectionCoords(vec4(vPositionW,1.0),normalW);\n#endif\n#ifdef REFLECTIONMAP_OPPOSITEZ\nreflectionVector.z*=-1.0;\n#endif\n#ifdef REFLECTIONMAP_3D\nreflectionCoords=reflectionVector;\n#else\nreflectionCoords=reflectionVector.xy;\n#ifdef REFLECTIONMAP_PROJECTION\nreflectionCoords/=reflectionVector.z;\n#endif\nreflectionCoords.y=1.0-reflectionCoords.y;\n#endif\n}\n#define pbr_inline\n#define inline\nvoid sampleReflectionTexture(\nin float alphaG,\nin vec3 vReflectionMicrosurfaceInfos,\nin vec2 vReflectionInfos,\nin vec3 vReflectionColor,\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nin float NdotVUnclamped,\n#endif\n#ifdef LINEARSPECULARREFLECTION\nin float roughness,\n#endif\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSampler,\nconst vec3 reflectionCoords,\n#else\nin sampler2D reflectionSampler,\nconst vec2 reflectionCoords,\n#endif\n#ifndef LODBASEDMICROSFURACE\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSamplerLow,\nin samplerCube reflectionSamplerHigh,\n#else\nin sampler2D reflectionSamplerLow,\nin sampler2D reflectionSamplerHigh,\n#endif\n#endif\n#ifdef REALTIME_FILTERING\nin vec2 vReflectionFilteringInfo,\n#endif\nout vec4 environmentRadiance\n)\n{\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nfloat reflectionLOD=getLodFromAlphaG(vReflectionMicrosurfaceInfos.x,alphaG,NdotVUnclamped);\n#elif defined(LINEARSPECULARREFLECTION)\nfloat reflectionLOD=getLinearLodFromRoughness(vReflectionMicrosurfaceInfos.x,roughness);\n#else\nfloat reflectionLOD=getLodFromAlphaG(vReflectionMicrosurfaceInfos.x,alphaG);\n#endif\n#ifdef LODBASEDMICROSFURACE\nreflectionLOD=reflectionLOD*vReflectionMicrosurfaceInfos.y+vReflectionMicrosurfaceInfos.z;\n#ifdef LODINREFLECTIONALPHA\nfloat automaticReflectionLOD=UNPACK_LOD(sampleReflection(reflectionSampler,reflectionCoords).a);float requestedReflectionLOD=max(automaticReflectionLOD,reflectionLOD);\n#else\nfloat requestedReflectionLOD=reflectionLOD;\n#endif\n#ifdef REALTIME_FILTERING\nenvironmentRadiance=vec4(radiance(alphaG,reflectionSampler,reflectionCoords,vReflectionFilteringInfo),1.0);\n#else\nenvironmentRadiance=sampleReflectionLod(reflectionSampler,reflectionCoords,reflectionLOD);\n#endif\n#else\nfloat lodReflectionNormalized=saturate(reflectionLOD/log2(vReflectionMicrosurfaceInfos.x));float lodReflectionNormalizedDoubled=lodReflectionNormalized*2.0;vec4 environmentMid=sampleReflection(reflectionSampler,reflectionCoords);if (lodReflectionNormalizedDoubled<1.0){environmentRadiance=mix(\nsampleReflection(reflectionSamplerHigh,reflectionCoords),\nenvironmentMid,\nlodReflectionNormalizedDoubled\n);} else {environmentRadiance=mix(\nenvironmentMid,\nsampleReflection(reflectionSamplerLow,reflectionCoords),\nlodReflectionNormalizedDoubled-1.0\n);}\n#endif\n#ifdef RGBDREFLECTION\nenvironmentRadiance.rgb=fromRGBD(environmentRadiance);\n#endif\n#ifdef GAMMAREFLECTION\nenvironmentRadiance.rgb=toLinearSpace(environmentRadiance.rgb);\n#endif\nenvironmentRadiance.rgb*=vReflectionInfos.x;environmentRadiance.rgb*=vReflectionColor.rgb;}\n#define pbr_inline\n#define inline\nvoid reflectionBlock(\nin vec3 vPositionW,\nin vec3 normalW,\nin float alphaG,\nin vec3 vReflectionMicrosurfaceInfos,\nin vec2 vReflectionInfos,\nin vec3 vReflectionColor,\n#ifdef ANISOTROPIC\nin anisotropicOutParams anisotropicOut,\n#endif\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nin float NdotVUnclamped,\n#endif\n#ifdef LINEARSPECULARREFLECTION\nin float roughness,\n#endif\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSampler,\n#else\nin sampler2D reflectionSampler,\n#endif\n#if defined(NORMAL) && defined(USESPHERICALINVERTEX)\nin vec3 vEnvironmentIrradiance,\n#endif\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\nin mat4 reflectionMatrix,\n#endif\n#endif\n#ifdef USEIRRADIANCEMAP\n#ifdef REFLECTIONMAP_3D\nin samplerCube irradianceSampler,\n#else\nin sampler2D irradianceSampler,\n#endif\n#endif\n#ifndef LODBASEDMICROSFURACE\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSamplerLow,\nin samplerCube reflectionSamplerHigh,\n#else\nin sampler2D reflectionSamplerLow,\nin sampler2D reflectionSamplerHigh,\n#endif\n#endif\n#ifdef REALTIME_FILTERING\nin vec2 vReflectionFilteringInfo,\n#endif\nout reflectionOutParams outParams\n)\n{vec4 environmentRadiance=vec4(0.,0.,0.,0.);\n#ifdef REFLECTIONMAP_3D\nvec3 reflectionCoords=vec3(0.);\n#else\nvec2 reflectionCoords=vec2(0.);\n#endif\ncreateReflectionCoords(\nvPositionW,\nnormalW,\n#ifdef ANISOTROPIC\nanisotropicOut,\n#endif\nreflectionCoords\n);sampleReflectionTexture(\nalphaG,\nvReflectionMicrosurfaceInfos,\nvReflectionInfos,\nvReflectionColor,\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nNdotVUnclamped,\n#endif\n#ifdef LINEARSPECULARREFLECTION\nroughness,\n#endif\n#ifdef REFLECTIONMAP_3D\nreflectionSampler,\nreflectionCoords,\n#else\nreflectionSampler,\nreflectionCoords,\n#endif\n#ifndef LODBASEDMICROSFURACE\nreflectionSamplerLow,\nreflectionSamplerHigh,\n#endif\n#ifdef REALTIME_FILTERING\nvReflectionFilteringInfo,\n#endif\nenvironmentRadiance\n);vec3 environmentIrradiance=vec3(0.,0.,0.);\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#if defined(NORMAL) && defined(USESPHERICALINVERTEX)\nenvironmentIrradiance=vEnvironmentIrradiance;\n#else\n#ifdef ANISOTROPIC\nvec3 irradianceVector=vec3(reflectionMatrix*vec4(anisotropicOut.anisotropicNormal,0)).xyz;\n#else\nvec3 irradianceVector=vec3(reflectionMatrix*vec4(normalW,0)).xyz;\n#endif\n#ifdef REFLECTIONMAP_OPPOSITEZ\nirradianceVector.z*=-1.0;\n#endif\n#ifdef INVERTCUBICMAP\nirradianceVector.y*=-1.0;\n#endif\n#if defined(REALTIME_FILTERING)\nenvironmentIrradiance=irradiance(reflectionSampler,irradianceVector,vReflectionFilteringInfo);\n#else\nenvironmentIrradiance=computeEnvironmentIrradiance(irradianceVector);\n#endif\n#ifdef SS_TRANSLUCENCY\noutParams.irradianceVector=irradianceVector;\n#endif\n#endif\n#elif defined(USEIRRADIANCEMAP)\nvec4 environmentIrradiance4=sampleReflection(irradianceSampler,reflectionCoords);environmentIrradiance=environmentIrradiance4.rgb;\n#ifdef RGBDREFLECTION\nenvironmentIrradiance.rgb=fromRGBD(environmentIrradiance4);\n#endif\n#ifdef GAMMAREFLECTION\nenvironmentIrradiance.rgb=toLinearSpace(environmentIrradiance.rgb);\n#endif\n#endif\nenvironmentIrradiance*=vReflectionColor.rgb;outParams.environmentRadiance=environmentRadiance;outParams.environmentIrradiance=environmentIrradiance;outParams.reflectionCoords=reflectionCoords;}\n#endif\n`;\nY.IncludesShadersStore[zM] = WM;\nconst GM = \"pbrBlockSheen\", XM = `#ifdef SHEEN\nstruct sheenOutParams\n{float sheenIntensity;vec3 sheenColor;float sheenRoughness;\n#ifdef SHEEN_LINKWITHALBEDO\nvec3 surfaceAlbedo;\n#endif\n#if defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)\nfloat sheenAlbedoScaling;\n#endif\n#if defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nvec3 finalSheenRadianceScaled;\n#endif\n#if DEBUGMODE>0\n#ifdef SHEEN_TEXTURE\nvec4 sheenMapData;\n#endif\n#if defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nvec3 sheenEnvironmentReflectance;\n#endif\n#endif\n};\n#define pbr_inline\n#define inline\nvoid sheenBlock(\nin vec4 vSheenColor,\n#ifdef SHEEN_ROUGHNESS\nin float vSheenRoughness,\n#if defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE)\nin vec4 sheenMapRoughnessData,\n#endif\n#endif\nin float roughness,\n#ifdef SHEEN_TEXTURE\nin vec4 sheenMapData,\nin float sheenMapLevel,\n#endif\nin float reflectance,\n#ifdef SHEEN_LINKWITHALBEDO\nin vec3 baseColor,\nin vec3 surfaceAlbedo,\n#endif\n#ifdef ENVIRONMENTBRDF\nin float NdotV,\nin vec3 environmentBrdf,\n#endif\n#if defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nin vec2 AARoughnessFactors,\nin vec3 vReflectionMicrosurfaceInfos,\nin vec2 vReflectionInfos,\nin vec3 vReflectionColor,\nin vec4 vLightingIntensity,\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSampler,\nin vec3 reflectionCoords,\n#else\nin sampler2D reflectionSampler,\nin vec2 reflectionCoords,\n#endif\nin float NdotVUnclamped,\n#ifndef LODBASEDMICROSFURACE\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSamplerLow,\nin samplerCube reflectionSamplerHigh,\n#else\nin sampler2D reflectionSamplerLow,\nin sampler2D reflectionSamplerHigh,\n#endif\n#endif\n#ifdef REALTIME_FILTERING\nin vec2 vReflectionFilteringInfo,\n#endif\n#if !defined(REFLECTIONMAP_SKYBOX) && defined(RADIANCEOCCLUSION)\nin float seo,\n#endif\n#if !defined(REFLECTIONMAP_SKYBOX) && defined(HORIZONOCCLUSION) && defined(BUMP) && defined(REFLECTIONMAP_3D)\nin float eho,\n#endif\n#endif\nout sheenOutParams outParams\n)\n{float sheenIntensity=vSheenColor.a;\n#ifdef SHEEN_TEXTURE\n#if DEBUGMODE>0\noutParams.sheenMapData=sheenMapData;\n#endif\n#endif\n#ifdef SHEEN_LINKWITHALBEDO\nfloat sheenFactor=pow5(1.0-sheenIntensity);vec3 sheenColor=baseColor.rgb*(1.0-sheenFactor);float sheenRoughness=sheenIntensity;outParams.surfaceAlbedo=surfaceAlbedo*sheenFactor;\n#ifdef SHEEN_TEXTURE\nsheenIntensity*=sheenMapData.a;\n#endif\n#else\nvec3 sheenColor=vSheenColor.rgb;\n#ifdef SHEEN_TEXTURE\n#ifdef SHEEN_GAMMATEXTURE\nsheenColor.rgb*=toLinearSpace(sheenMapData.rgb);\n#else\nsheenColor.rgb*=sheenMapData.rgb;\n#endif\nsheenColor.rgb*=sheenMapLevel;\n#endif\n#ifdef SHEEN_ROUGHNESS\nfloat sheenRoughness=vSheenRoughness;\n#ifdef SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE\n#if defined(SHEEN_TEXTURE)\nsheenRoughness*=sheenMapData.a;\n#endif\n#elif defined(SHEEN_TEXTURE_ROUGHNESS)\n#ifdef SHEEN_TEXTURE_ROUGHNESS_IDENTICAL\nsheenRoughness*=sheenMapData.a;\n#else\nsheenRoughness*=sheenMapRoughnessData.a;\n#endif\n#endif\n#else\nfloat sheenRoughness=roughness;\n#ifdef SHEEN_TEXTURE\nsheenIntensity*=sheenMapData.a;\n#endif\n#endif\n#if !defined(SHEEN_ALBEDOSCALING)\nsheenIntensity*=(1.-reflectance);\n#endif\nsheenColor*=sheenIntensity;\n#endif\n#ifdef ENVIRONMENTBRDF\n/*#ifdef SHEEN_SOFTER\nvec3 environmentSheenBrdf=vec3(0.,0.,getBRDFLookupCharlieSheen(NdotV,sheenRoughness));\n#else*/\n#ifdef SHEEN_ROUGHNESS\nvec3 environmentSheenBrdf=getBRDFLookup(NdotV,sheenRoughness);\n#else\nvec3 environmentSheenBrdf=environmentBrdf;\n#endif\n/*#endif*/\n#endif\n#if defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nfloat sheenAlphaG=convertRoughnessToAverageSlope(sheenRoughness);\n#ifdef SPECULARAA\nsheenAlphaG+=AARoughnessFactors.y;\n#endif\nvec4 environmentSheenRadiance=vec4(0.,0.,0.,0.);sampleReflectionTexture(\nsheenAlphaG,\nvReflectionMicrosurfaceInfos,\nvReflectionInfos,\nvReflectionColor,\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nNdotVUnclamped,\n#endif\n#ifdef LINEARSPECULARREFLECTION\nsheenRoughness,\n#endif\nreflectionSampler,\nreflectionCoords,\n#ifndef LODBASEDMICROSFURACE\nreflectionSamplerLow,\nreflectionSamplerHigh,\n#endif\n#ifdef REALTIME_FILTERING\nvReflectionFilteringInfo,\n#endif\nenvironmentSheenRadiance\n);vec3 sheenEnvironmentReflectance=getSheenReflectanceFromBRDFLookup(sheenColor,environmentSheenBrdf);\n#if !defined(REFLECTIONMAP_SKYBOX) && defined(RADIANCEOCCLUSION)\nsheenEnvironmentReflectance*=seo;\n#endif\n#if !defined(REFLECTIONMAP_SKYBOX) && defined(HORIZONOCCLUSION) && defined(BUMP) && defined(REFLECTIONMAP_3D)\nsheenEnvironmentReflectance*=eho;\n#endif\n#if DEBUGMODE>0\noutParams.sheenEnvironmentReflectance=sheenEnvironmentReflectance;\n#endif\noutParams.finalSheenRadianceScaled=\nenvironmentSheenRadiance.rgb *\nsheenEnvironmentReflectance *\nvLightingIntensity.z;\n#endif\n#if defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)\noutParams.sheenAlbedoScaling=1.0-sheenIntensity*max(max(sheenColor.r,sheenColor.g),sheenColor.b)*environmentSheenBrdf.b;\n#endif\noutParams.sheenIntensity=sheenIntensity;outParams.sheenColor=sheenColor;outParams.sheenRoughness=sheenRoughness;}\n#endif\n`;\nY.IncludesShadersStore[GM] = XM;\nconst HM = \"pbrBlockClearcoat\", KM = `struct clearcoatOutParams\n{vec3 specularEnvironmentR0;float conservationFactor;vec3 clearCoatNormalW;vec2 clearCoatAARoughnessFactors;float clearCoatIntensity;float clearCoatRoughness;\n#ifdef REFLECTION\nvec3 finalClearCoatRadianceScaled;\n#endif\n#ifdef CLEARCOAT_TINT\nvec3 absorption;float clearCoatNdotVRefract;vec3 clearCoatColor;float clearCoatThickness;\n#endif\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nvec3 energyConservationFactorClearCoat;\n#endif\n#if DEBUGMODE>0\n#ifdef CLEARCOAT_BUMP\nmat3 TBNClearCoat;\n#endif\n#ifdef CLEARCOAT_TEXTURE\nvec2 clearCoatMapData;\n#endif\n#if defined(CLEARCOAT_TINT) && defined(CLEARCOAT_TINT_TEXTURE)\nvec4 clearCoatTintMapData;\n#endif\n#ifdef REFLECTION\nvec4 environmentClearCoatRadiance;vec3 clearCoatEnvironmentReflectance;\n#endif\nfloat clearCoatNdotV;\n#endif\n};\n#ifdef CLEARCOAT\n#define pbr_inline\n#define inline\nvoid clearcoatBlock(\nin vec3 vPositionW,\nin vec3 geometricNormalW,\nin vec3 viewDirectionW,\nin vec2 vClearCoatParams,\n#if defined(CLEARCOAT_TEXTURE_ROUGHNESS) && !defined(CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE)\nin vec4 clearCoatMapRoughnessData,\n#endif\nin vec3 specularEnvironmentR0,\n#ifdef CLEARCOAT_TEXTURE\nin vec2 clearCoatMapData,\n#endif\n#ifdef CLEARCOAT_TINT\nin vec4 vClearCoatTintParams,\nin float clearCoatColorAtDistance,\nin vec4 vClearCoatRefractionParams,\n#ifdef CLEARCOAT_TINT_TEXTURE\nin vec4 clearCoatTintMapData,\n#endif\n#endif\n#ifdef CLEARCOAT_BUMP\nin vec2 vClearCoatBumpInfos,\nin vec4 clearCoatBumpMapData,\nin vec2 vClearCoatBumpUV,\n#if defined(TANGENT) && defined(NORMAL)\nin mat3 vTBN,\n#else\nin vec2 vClearCoatTangentSpaceParams,\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\nin mat4 normalMatrix,\n#endif\n#endif\n#if defined(FORCENORMALFORWARD) && defined(NORMAL)\nin vec3 faceNormal,\n#endif\n#ifdef REFLECTION\nin vec3 vReflectionMicrosurfaceInfos,\nin vec2 vReflectionInfos,\nin vec3 vReflectionColor,\nin vec4 vLightingIntensity,\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSampler,\n#else\nin sampler2D reflectionSampler,\n#endif\n#ifndef LODBASEDMICROSFURACE\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSamplerLow,\nin samplerCube reflectionSamplerHigh,\n#else\nin sampler2D reflectionSamplerLow,\nin sampler2D reflectionSamplerHigh,\n#endif\n#endif\n#ifdef REALTIME_FILTERING\nin vec2 vReflectionFilteringInfo,\n#endif\n#endif\n#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\n#ifdef RADIANCEOCCLUSION\nin float ambientMonochrome,\n#endif\n#endif\n#if defined(CLEARCOAT_BUMP) || defined(TWOSIDEDLIGHTING)\nin float frontFacingMultiplier,\n#endif\nout clearcoatOutParams outParams\n)\n{float clearCoatIntensity=vClearCoatParams.x;float clearCoatRoughness=vClearCoatParams.y;\n#ifdef CLEARCOAT_TEXTURE\nclearCoatIntensity*=clearCoatMapData.x;\n#ifdef CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE\nclearCoatRoughness*=clearCoatMapData.y;\n#endif\n#if DEBUGMODE>0\noutParams.clearCoatMapData=clearCoatMapData;\n#endif\n#endif\n#if defined(CLEARCOAT_TEXTURE_ROUGHNESS) && !defined(CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE)\n#ifdef CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL\nclearCoatRoughness*=clearCoatMapData.y;\n#else\nclearCoatRoughness*=clearCoatMapRoughnessData.y;\n#endif\n#endif\noutParams.clearCoatIntensity=clearCoatIntensity;outParams.clearCoatRoughness=clearCoatRoughness;\n#ifdef CLEARCOAT_TINT\nvec3 clearCoatColor=vClearCoatTintParams.rgb;float clearCoatThickness=vClearCoatTintParams.a;\n#ifdef CLEARCOAT_TINT_TEXTURE\n#ifdef CLEARCOAT_TINT_GAMMATEXTURE\nclearCoatColor*=toLinearSpace(clearCoatTintMapData.rgb);\n#else\nclearCoatColor*=clearCoatTintMapData.rgb;\n#endif\nclearCoatThickness*=clearCoatTintMapData.a;\n#if DEBUGMODE>0\noutParams.clearCoatTintMapData=clearCoatTintMapData;\n#endif\n#endif\noutParams.clearCoatColor=computeColorAtDistanceInMedia(clearCoatColor,clearCoatColorAtDistance);outParams.clearCoatThickness=clearCoatThickness;\n#endif\n#ifdef CLEARCOAT_REMAP_F0\nvec3 specularEnvironmentR0Updated=getR0RemappedForClearCoat(specularEnvironmentR0);\n#else\nvec3 specularEnvironmentR0Updated=specularEnvironmentR0;\n#endif\noutParams.specularEnvironmentR0=mix(specularEnvironmentR0,specularEnvironmentR0Updated,clearCoatIntensity);vec3 clearCoatNormalW=geometricNormalW;\n#ifdef CLEARCOAT_BUMP\n#ifdef NORMALXYSCALE\nfloat clearCoatNormalScale=1.0;\n#else\nfloat clearCoatNormalScale=vClearCoatBumpInfos.y;\n#endif\n#if defined(TANGENT) && defined(NORMAL)\nmat3 TBNClearCoat=vTBN;\n#else\nvec2 TBNClearCoatUV=vClearCoatBumpUV*frontFacingMultiplier;mat3 TBNClearCoat=cotangent_frame(clearCoatNormalW*clearCoatNormalScale,vPositionW,TBNClearCoatUV,vClearCoatTangentSpaceParams);\n#endif\n#if DEBUGMODE>0\noutParams.TBNClearCoat=TBNClearCoat;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\nclearCoatNormalW=normalize(clearCoatBumpMapData.xyz *2.0-1.0);clearCoatNormalW=normalize(mat3(normalMatrix)*clearCoatNormalW);\n#else\nclearCoatNormalW=perturbNormal(TBNClearCoat,clearCoatBumpMapData.xyz,vClearCoatBumpInfos.y);\n#endif\n#endif\n#if defined(FORCENORMALFORWARD) && defined(NORMAL)\nclearCoatNormalW*=sign(dot(clearCoatNormalW,faceNormal));\n#endif\n#if defined(TWOSIDEDLIGHTING) && defined(NORMAL)\nclearCoatNormalW=clearCoatNormalW*frontFacingMultiplier;\n#endif\noutParams.clearCoatNormalW=clearCoatNormalW;outParams.clearCoatAARoughnessFactors=getAARoughnessFactors(clearCoatNormalW.xyz);float clearCoatNdotVUnclamped=dot(clearCoatNormalW,viewDirectionW);float clearCoatNdotV=absEps(clearCoatNdotVUnclamped);\n#if DEBUGMODE>0\noutParams.clearCoatNdotV=clearCoatNdotV;\n#endif\n#ifdef CLEARCOAT_TINT\nvec3 clearCoatVRefract=refract(-viewDirectionW,clearCoatNormalW,vClearCoatRefractionParams.y);outParams.clearCoatNdotVRefract=absEps(dot(clearCoatNormalW,clearCoatVRefract));\n#endif\n#if defined(ENVIRONMENTBRDF) && (!defined(REFLECTIONMAP_SKYBOX) || defined(MS_BRDF_ENERGY_CONSERVATION))\nvec3 environmentClearCoatBrdf=getBRDFLookup(clearCoatNdotV,clearCoatRoughness);\n#endif\n#if defined(REFLECTION)\nfloat clearCoatAlphaG=convertRoughnessToAverageSlope(clearCoatRoughness);\n#ifdef SPECULARAA\nclearCoatAlphaG+=outParams.clearCoatAARoughnessFactors.y;\n#endif\nvec4 environmentClearCoatRadiance=vec4(0.,0.,0.,0.);vec3 clearCoatReflectionVector=computeReflectionCoords(vec4(vPositionW,1.0),clearCoatNormalW);\n#ifdef REFLECTIONMAP_OPPOSITEZ\nclearCoatReflectionVector.z*=-1.0;\n#endif\n#ifdef REFLECTIONMAP_3D\nvec3 clearCoatReflectionCoords=clearCoatReflectionVector;\n#else\nvec2 clearCoatReflectionCoords=clearCoatReflectionVector.xy;\n#ifdef REFLECTIONMAP_PROJECTION\nclearCoatReflectionCoords/=clearCoatReflectionVector.z;\n#endif\nclearCoatReflectionCoords.y=1.0-clearCoatReflectionCoords.y;\n#endif\nsampleReflectionTexture(\nclearCoatAlphaG,\nvReflectionMicrosurfaceInfos,\nvReflectionInfos,\nvReflectionColor,\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nclearCoatNdotVUnclamped,\n#endif\n#ifdef LINEARSPECULARREFLECTION\nclearCoatRoughness,\n#endif\nreflectionSampler,\nclearCoatReflectionCoords,\n#ifndef LODBASEDMICROSFURACE\nreflectionSamplerLow,\nreflectionSamplerHigh,\n#endif\n#ifdef REALTIME_FILTERING\nvReflectionFilteringInfo,\n#endif\nenvironmentClearCoatRadiance\n);\n#if DEBUGMODE>0\noutParams.environmentClearCoatRadiance=environmentClearCoatRadiance;\n#endif\n#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\nvec3 clearCoatEnvironmentReflectance=getReflectanceFromBRDFLookup(vec3(vClearCoatRefractionParams.x),environmentClearCoatBrdf);\n#ifdef HORIZONOCCLUSION\n#ifdef BUMP\n#ifdef REFLECTIONMAP_3D\nfloat clearCoatEho=environmentHorizonOcclusion(-viewDirectionW,clearCoatNormalW,geometricNormalW);clearCoatEnvironmentReflectance*=clearCoatEho;\n#endif\n#endif\n#endif\n#else\nvec3 clearCoatEnvironmentReflectance=getReflectanceFromAnalyticalBRDFLookup_Jones(clearCoatNdotV,vec3(1.),vec3(1.),sqrt(1.-clearCoatRoughness));\n#endif\nclearCoatEnvironmentReflectance*=clearCoatIntensity;\n#if DEBUGMODE>0\noutParams.clearCoatEnvironmentReflectance=clearCoatEnvironmentReflectance;\n#endif\noutParams.finalClearCoatRadianceScaled=\nenvironmentClearCoatRadiance.rgb *\nclearCoatEnvironmentReflectance *\nvLightingIntensity.z;\n#endif\n#if defined(CLEARCOAT_TINT)\noutParams.absorption=computeClearCoatAbsorption(outParams.clearCoatNdotVRefract,outParams.clearCoatNdotVRefract,outParams.clearCoatColor,clearCoatThickness,clearCoatIntensity);\n#endif\nfloat fresnelIBLClearCoat=fresnelSchlickGGX(clearCoatNdotV,vClearCoatRefractionParams.x,CLEARCOATREFLECTANCE90);fresnelIBLClearCoat*=clearCoatIntensity;outParams.conservationFactor=(1.-fresnelIBLClearCoat);\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\noutParams.energyConservationFactorClearCoat=getEnergyConservationFactor(outParams.specularEnvironmentR0,environmentClearCoatBrdf);\n#endif\n}\n#endif\n`;\nY.IncludesShadersStore[HM] = KM;\nconst qM = \"pbrBlockIridescence\", YM = `struct iridescenceOutParams\n{float iridescenceIntensity;float iridescenceIOR;float iridescenceThickness;vec3 specularEnvironmentR0;};\n#ifdef IRIDESCENCE\n#define pbr_inline\n#define inline\nvoid iridescenceBlock(\nin vec4 vIridescenceParams,\nin float viewAngle,\nin vec3 specularEnvironmentR0,\n#ifdef IRIDESCENCE_TEXTURE\nin vec2 iridescenceMapData,\n#endif\n#ifdef IRIDESCENCE_THICKNESS_TEXTURE\nin vec2 iridescenceThicknessMapData,\n#endif\n#ifdef CLEARCOAT\nin float NdotVUnclamped,\n#ifdef CLEARCOAT_TEXTURE\nin vec2 clearCoatMapData,\n#endif\n#endif\nout iridescenceOutParams outParams\n)\n{float iridescenceIntensity=vIridescenceParams.x;float iridescenceIOR=vIridescenceParams.y;float iridescenceThicknessMin=vIridescenceParams.z;float iridescenceThicknessMax=vIridescenceParams.w;float iridescenceThicknessWeight=1.;\n#ifdef IRIDESCENCE_TEXTURE\niridescenceIntensity*=iridescenceMapData.x;\n#ifdef IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE\niridescenceThicknessWeight=iridescenceMapData.g;\n#endif\n#endif\n#if defined(IRIDESCENCE_THICKNESS_TEXTURE)\niridescenceThicknessWeight=iridescenceThicknessMapData.g;\n#endif\nfloat iridescenceThickness=mix(iridescenceThicknessMin,iridescenceThicknessMax,iridescenceThicknessWeight);float topIor=1.; \n#ifdef CLEARCOAT\nfloat clearCoatIntensity=vClearCoatParams.x;\n#ifdef CLEARCOAT_TEXTURE\nclearCoatIntensity*=clearCoatMapData.x;\n#endif\ntopIor=mix(1.0,vClearCoatRefractionParams.w-1.,clearCoatIntensity);viewAngle=sqrt(1.0+square(1.0/topIor)*(square(NdotVUnclamped)-1.0));\n#endif\nvec3 iridescenceFresnel=evalIridescence(topIor,iridescenceIOR,viewAngle,iridescenceThickness,specularEnvironmentR0);outParams.specularEnvironmentR0=mix(specularEnvironmentR0,iridescenceFresnel,iridescenceIntensity);outParams.iridescenceIntensity=iridescenceIntensity;outParams.iridescenceThickness=iridescenceThickness;outParams.iridescenceIOR=iridescenceIOR;}\n#endif\n`;\nY.IncludesShadersStore[qM] = YM;\nconst ZM = \"pbrBlockSubSurface\", jM = `struct subSurfaceOutParams\n{vec3 specularEnvironmentReflectance;\n#ifdef SS_REFRACTION\nvec3 finalRefraction;vec3 surfaceAlbedo;\n#ifdef SS_LINKREFRACTIONTOTRANSPARENCY\nfloat alpha;\n#endif\n#ifdef REFLECTION\nfloat refractionFactorForIrradiance;\n#endif\n#endif\n#ifdef SS_TRANSLUCENCY\nvec3 transmittance;float translucencyIntensity;\n#ifdef REFLECTION\nvec3 refractionIrradiance;\n#endif\n#endif\n#if DEBUGMODE>0\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nvec4 thicknessMap;\n#endif\n#ifdef SS_REFRACTION\nvec4 environmentRefraction;vec3 refractionTransmittance;\n#endif\n#endif\n};\n#ifdef SUBSURFACE\n#ifdef SS_REFRACTION\n#define pbr_inline\n#define inline\nvec4 sampleEnvironmentRefraction(\nin float ior\n,in float thickness\n,in float refractionLOD\n,in vec3 normalW\n,in vec3 vPositionW\n,in vec3 viewDirectionW\n,in mat4 view\n,in vec4 vRefractionInfos\n,in mat4 refractionMatrix\n,in vec4 vRefractionMicrosurfaceInfos\n,in float alphaG\n#ifdef SS_REFRACTIONMAP_3D\n,in samplerCube refractionSampler\n#ifndef LODBASEDMICROSFURACE\n,in samplerCube refractionSamplerLow\n,in samplerCube refractionSamplerHigh\n#endif\n#else\n,in sampler2D refractionSampler\n#ifndef LODBASEDMICROSFURACE\n,in sampler2D refractionSamplerLow\n,in sampler2D refractionSamplerHigh\n#endif\n#endif\n#ifdef ANISOTROPIC\n,in anisotropicOutParams anisotropicOut\n#endif\n#ifdef REALTIME_FILTERING\n,in vec2 vRefractionFilteringInfo\n#endif\n#ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC\n,in vec3 refractionPosition\n,in vec3 refractionSize\n#endif\n) {vec4 environmentRefraction=vec4(0.,0.,0.,0.);\n#ifdef ANISOTROPIC\nvec3 refractionVector=refract(-viewDirectionW,anisotropicOut.anisotropicNormal,ior);\n#else\nvec3 refractionVector=refract(-viewDirectionW,normalW,ior);\n#endif\n#ifdef SS_REFRACTIONMAP_OPPOSITEZ\nrefractionVector.z*=-1.0;\n#endif\n#ifdef SS_REFRACTIONMAP_3D\n#ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC\nrefractionVector=parallaxCorrectNormal(vPositionW,refractionVector,refractionSize,refractionPosition);\n#endif\nrefractionVector.y=refractionVector.y*vRefractionInfos.w;vec3 refractionCoords=refractionVector;refractionCoords=vec3(refractionMatrix*vec4(refractionCoords,0));\n#else\n#ifdef SS_USE_THICKNESS_AS_DEPTH\nvec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*thickness,1.0)));\n#else\nvec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*vRefractionInfos.z,1.0)));\n#endif\nvec2 refractionCoords=vRefractionUVW.xy/vRefractionUVW.z;refractionCoords.y=1.0-refractionCoords.y;\n#endif\n#ifdef LODBASEDMICROSFURACE\nrefractionLOD=refractionLOD*vRefractionMicrosurfaceInfos.y+vRefractionMicrosurfaceInfos.z;\n#ifdef SS_LODINREFRACTIONALPHA\nfloat automaticRefractionLOD=UNPACK_LOD(sampleRefraction(refractionSampler,refractionCoords).a);float requestedRefractionLOD=max(automaticRefractionLOD,refractionLOD);\n#else\nfloat requestedRefractionLOD=refractionLOD;\n#endif\n#if defined(REALTIME_FILTERING) && defined(SS_REFRACTIONMAP_3D)\nenvironmentRefraction=vec4(radiance(alphaG,refractionSampler,refractionCoords,vRefractionFilteringInfo),1.0);\n#else\nenvironmentRefraction=sampleRefractionLod(refractionSampler,refractionCoords,requestedRefractionLOD);\n#endif\n#else\nfloat lodRefractionNormalized=saturate(refractionLOD/log2(vRefractionMicrosurfaceInfos.x));float lodRefractionNormalizedDoubled=lodRefractionNormalized*2.0;vec4 environmentRefractionMid=sampleRefraction(refractionSampler,refractionCoords);if (lodRefractionNormalizedDoubled<1.0){environmentRefraction=mix(\nsampleRefraction(refractionSamplerHigh,refractionCoords),\nenvironmentRefractionMid,\nlodRefractionNormalizedDoubled\n);} else {environmentRefraction=mix(\nenvironmentRefractionMid,\nsampleRefraction(refractionSamplerLow,refractionCoords),\nlodRefractionNormalizedDoubled-1.0\n);}\n#endif\n#ifdef SS_RGBDREFRACTION\nenvironmentRefraction.rgb=fromRGBD(environmentRefraction);\n#endif\n#ifdef SS_GAMMAREFRACTION\nenvironmentRefraction.rgb=toLinearSpace(environmentRefraction.rgb);\n#endif\nreturn environmentRefraction;}\n#endif\n#define pbr_inline\n#define inline\nvoid subSurfaceBlock(\nin vec3 vSubSurfaceIntensity,\nin vec2 vThicknessParam,\nin vec4 vTintColor,\nin vec3 normalW,\nin vec3 specularEnvironmentReflectance,\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nin vec4 thicknessMap,\n#endif\n#ifdef SS_REFRACTIONINTENSITY_TEXTURE\nin vec4 refractionIntensityMap,\n#endif\n#ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE\nin vec4 translucencyIntensityMap,\n#endif\n#ifdef REFLECTION\n#ifdef SS_TRANSLUCENCY\nin mat4 reflectionMatrix,\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\nin vec3 irradianceVector_,\n#endif\n#if defined(REALTIME_FILTERING)\nin samplerCube reflectionSampler,\nin vec2 vReflectionFilteringInfo,\n#endif\n#endif\n#ifdef USEIRRADIANCEMAP\n#ifdef REFLECTIONMAP_3D\nin samplerCube irradianceSampler,\n#else\nin sampler2D irradianceSampler,\n#endif\n#endif\n#endif\n#endif\n#if defined(SS_REFRACTION) || defined(SS_TRANSLUCENCY)\nin vec3 surfaceAlbedo,\n#endif\n#ifdef SS_REFRACTION\nin vec3 vPositionW,\nin vec3 viewDirectionW,\nin mat4 view,\nin vec4 vRefractionInfos,\nin mat4 refractionMatrix,\nin vec4 vRefractionMicrosurfaceInfos,\nin vec4 vLightingIntensity,\n#ifdef SS_LINKREFRACTIONTOTRANSPARENCY\nin float alpha,\n#endif\n#ifdef SS_LODINREFRACTIONALPHA\nin float NdotVUnclamped,\n#endif\n#ifdef SS_LINEARSPECULARREFRACTION\nin float roughness,\n#endif\nin float alphaG,\n#ifdef SS_REFRACTIONMAP_3D\nin samplerCube refractionSampler,\n#ifndef LODBASEDMICROSFURACE\nin samplerCube refractionSamplerLow,\nin samplerCube refractionSamplerHigh,\n#endif\n#else\nin sampler2D refractionSampler,\n#ifndef LODBASEDMICROSFURACE\nin sampler2D refractionSamplerLow,\nin sampler2D refractionSamplerHigh,\n#endif\n#endif\n#ifdef ANISOTROPIC\nin anisotropicOutParams anisotropicOut,\n#endif\n#ifdef REALTIME_FILTERING\nin vec2 vRefractionFilteringInfo,\n#endif\n#ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC\nin vec3 refractionPosition,\nin vec3 refractionSize,\n#endif\n#ifdef SS_DISPERSION\nin float dispersion,\n#endif\n#endif\n#ifdef SS_TRANSLUCENCY\nin vec3 vDiffusionDistance,\n#endif\nout subSurfaceOutParams outParams\n)\n{outParams.specularEnvironmentReflectance=specularEnvironmentReflectance;\n#ifdef SS_REFRACTION\nfloat refractionIntensity=vSubSurfaceIntensity.x;\n#ifdef SS_LINKREFRACTIONTOTRANSPARENCY\nrefractionIntensity*=(1.0-alpha);outParams.alpha=1.0;\n#endif\n#endif\n#ifdef SS_TRANSLUCENCY\nfloat translucencyIntensity=vSubSurfaceIntensity.y;\n#endif\n#ifdef SS_THICKNESSANDMASK_TEXTURE\n#if defined(SS_USE_GLTF_TEXTURES)\nfloat thickness=thicknessMap.g*vThicknessParam.y+vThicknessParam.x;\n#else\nfloat thickness=thicknessMap.r*vThicknessParam.y+vThicknessParam.x;\n#endif\n#if DEBUGMODE>0\noutParams.thicknessMap=thicknessMap;\n#endif\n#ifdef SS_MASK_FROM_THICKNESS_TEXTURE\n#if defined(SS_REFRACTION) && defined(SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE)\n#if defined(SS_USE_GLTF_TEXTURES)\nrefractionIntensity*=thicknessMap.r;\n#else\nrefractionIntensity*=thicknessMap.g;\n#endif\n#endif\n#if defined(SS_TRANSLUCENCY) && defined(SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE)\ntranslucencyIntensity*=thicknessMap.b;\n#endif\n#endif\n#else\nfloat thickness=vThicknessParam.y;\n#endif\n#if defined(SS_REFRACTION) && defined(SS_REFRACTIONINTENSITY_TEXTURE)\n#ifdef SS_USE_GLTF_TEXTURES\nrefractionIntensity*=refractionIntensityMap.r;\n#else\nrefractionIntensity*=refractionIntensityMap.g;\n#endif\n#endif\n#ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE\ntranslucencyIntensity*=translucencyIntensityMap.b;\n#endif\n#ifdef SS_TRANSLUCENCY\nthickness=maxEps(thickness);vec3 transmittance=transmittanceBRDF_Burley(vTintColor.rgb,vDiffusionDistance,thickness);transmittance*=translucencyIntensity;outParams.transmittance=transmittance;outParams.translucencyIntensity=translucencyIntensity;\n#endif\n#ifdef SS_REFRACTION\nvec4 environmentRefraction=vec4(0.,0.,0.,0.);\n#ifdef SS_HAS_THICKNESS\nfloat ior=vRefractionInfos.y;\n#else\nfloat ior=vRefractionMicrosurfaceInfos.w;\n#endif\n#ifdef SS_LODINREFRACTIONALPHA\nfloat refractionAlphaG=alphaG;refractionAlphaG=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLodFromAlphaG(vRefractionMicrosurfaceInfos.x,refractionAlphaG,NdotVUnclamped);\n#elif defined(SS_LINEARSPECULARREFRACTION)\nfloat refractionRoughness=alphaG;refractionRoughness=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLinearLodFromRoughness(vRefractionMicrosurfaceInfos.x,refractionRoughness);\n#else\nfloat refractionAlphaG=alphaG;refractionAlphaG=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLodFromAlphaG(vRefractionMicrosurfaceInfos.x,refractionAlphaG);\n#endif\nfloat refraction_ior=vRefractionInfos.y;\n#ifdef SS_DISPERSION\nfloat realIOR=1.0/refraction_ior;float iorDispersionSpread=0.04*dispersion*(realIOR-1.0);vec3 iors=vec3(1.0/(realIOR-iorDispersionSpread),refraction_ior,1.0/(realIOR+iorDispersionSpread));for (int i=0; i<3; i++) {refraction_ior=iors[i];\n#endif\nvec4 envSample=sampleEnvironmentRefraction(refraction_ior,thickness,refractionLOD,normalW,vPositionW,viewDirectionW,view,vRefractionInfos,refractionMatrix,vRefractionMicrosurfaceInfos,alphaG\n#ifdef SS_REFRACTIONMAP_3D\n,refractionSampler\n#ifndef LODBASEDMICROSFURACE\n,refractionSamplerLow\n,refractionSamplerHigh\n#endif\n#else\n,refractionSampler\n#ifndef LODBASEDMICROSFURACE\n,refractionSamplerLow\n,refractionSamplerHigh\n#endif\n#endif\n#ifdef ANISOTROPIC\n,anisotropicOut\n#endif\n#ifdef REALTIME_FILTERING\n,vRefractionFilteringInfo\n#endif\n#ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC\n,refractionPosition\n,refractionSize\n#endif\n);\n#ifdef SS_DISPERSION\nenvironmentRefraction[i]=envSample[i];}\n#else\nenvironmentRefraction=envSample;\n#endif\nenvironmentRefraction.rgb*=vRefractionInfos.x;\n#endif\n#ifdef SS_REFRACTION\nvec3 refractionTransmittance=vec3(refractionIntensity);\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nvec3 volumeAlbedo=computeColorAtDistanceInMedia(vTintColor.rgb,vTintColor.w);refractionTransmittance*=cocaLambert(volumeAlbedo,thickness);\n#elif defined(SS_LINKREFRACTIONTOTRANSPARENCY)\nfloat maxChannel=max(max(surfaceAlbedo.r,surfaceAlbedo.g),surfaceAlbedo.b);vec3 volumeAlbedo=saturate(maxChannel*surfaceAlbedo);environmentRefraction.rgb*=volumeAlbedo;\n#else\nvec3 volumeAlbedo=computeColorAtDistanceInMedia(vTintColor.rgb,vTintColor.w);refractionTransmittance*=cocaLambert(volumeAlbedo,vThicknessParam.y);\n#endif\n#ifdef SS_ALBEDOFORREFRACTIONTINT\nenvironmentRefraction.rgb*=surfaceAlbedo.rgb;\n#endif\noutParams.surfaceAlbedo=surfaceAlbedo*(1.-refractionIntensity);\n#ifdef REFLECTION\noutParams.refractionFactorForIrradiance=(1.-refractionIntensity);\n#endif\n#ifdef UNUSED_MULTIPLEBOUNCES\nvec3 bounceSpecularEnvironmentReflectance=(2.0*specularEnvironmentReflectance)/(1.0+specularEnvironmentReflectance);outParams.specularEnvironmentReflectance=mix(bounceSpecularEnvironmentReflectance,specularEnvironmentReflectance,refractionIntensity);\n#endif\nrefractionTransmittance*=1.0-outParams.specularEnvironmentReflectance;\n#if DEBUGMODE>0\noutParams.refractionTransmittance=refractionTransmittance;\n#endif\noutParams.finalRefraction=environmentRefraction.rgb*refractionTransmittance*vLightingIntensity.z;\n#if DEBUGMODE>0\noutParams.environmentRefraction=environmentRefraction;\n#endif\n#endif\n#if defined(REFLECTION) && defined(SS_TRANSLUCENCY)\n#if defined(NORMAL) && defined(USESPHERICALINVERTEX) || !defined(USESPHERICALFROMREFLECTIONMAP)\nvec3 irradianceVector=vec3(reflectionMatrix*vec4(normalW,0)).xyz;\n#ifdef REFLECTIONMAP_OPPOSITEZ\nirradianceVector.z*=-1.0;\n#endif\n#ifdef INVERTCUBICMAP\nirradianceVector.y*=-1.0;\n#endif\n#else\nvec3 irradianceVector=irradianceVector_;\n#endif\n#if defined(USESPHERICALFROMREFLECTIONMAP)\n#if defined(REALTIME_FILTERING)\nvec3 refractionIrradiance=irradiance(reflectionSampler,-irradianceVector,vReflectionFilteringInfo);\n#else\nvec3 refractionIrradiance=computeEnvironmentIrradiance(-irradianceVector);\n#endif\n#elif defined(USEIRRADIANCEMAP)\n#ifdef REFLECTIONMAP_3D\nvec3 irradianceCoords=irradianceVector;\n#else\nvec2 irradianceCoords=irradianceVector.xy;\n#ifdef REFLECTIONMAP_PROJECTION\nirradianceCoords/=irradianceVector.z;\n#endif\nirradianceCoords.y=1.0-irradianceCoords.y;\n#endif\nvec4 refractionIrradiance=sampleReflection(irradianceSampler,-irradianceCoords);\n#ifdef RGBDREFLECTION\nrefractionIrradiance.rgb=fromRGBD(refractionIrradiance);\n#endif\n#ifdef GAMMAREFLECTION\nrefractionIrradiance.rgb=toLinearSpace(refractionIrradiance.rgb);\n#endif\n#else\nvec4 refractionIrradiance=vec4(0.);\n#endif\nrefractionIrradiance.rgb*=transmittance;\n#ifdef SS_ALBEDOFORTRANSLUCENCYTINT\nrefractionIrradiance.rgb*=surfaceAlbedo.rgb;\n#endif\noutParams.refractionIrradiance=refractionIrradiance.rgb;\n#endif\n}\n#endif\n`;\nY.IncludesShadersStore[ZM] = jM;\nconst QM = \"pbrBlockNormalGeometric\", JM = `vec3 viewDirectionW=normalize(vEyePosition.xyz-vPositionW);\n#ifdef NORMAL\nvec3 normalW=normalize(vNormalW);\n#else\nvec3 normalW=normalize(cross(dFdx(vPositionW),dFdy(vPositionW)))*vEyePosition.w;\n#endif\nvec3 geometricNormalW=normalW;\n#if defined(TWOSIDEDLIGHTING) && defined(NORMAL)\ngeometricNormalW=gl_FrontFacing ? geometricNormalW : -geometricNormalW;\n#endif\n`;\nY.IncludesShadersStore[QM] = JM;\nconst $M = \"pbrBlockNormalFinal\", eP = `#if defined(FORCENORMALFORWARD) && defined(NORMAL)\nvec3 faceNormal=normalize(cross(dFdx(vPositionW),dFdy(vPositionW)))*vEyePosition.w;\n#if defined(TWOSIDEDLIGHTING)\nfaceNormal=gl_FrontFacing ? faceNormal : -faceNormal;\n#endif\nnormalW*=sign(dot(normalW,faceNormal));\n#endif\n#if defined(TWOSIDEDLIGHTING) && defined(NORMAL)\nnormalW=gl_FrontFacing ? normalW : -normalW;\n#endif\n`;\nY.IncludesShadersStore[$M] = eP;\nconst tP = \"pbrBlockLightmapInit\", iP = `#ifdef LIGHTMAP\nvec4 lightmapColor=texture2D(lightmapSampler,vLightmapUV+uvOffset);\n#ifdef RGBDLIGHTMAP\nlightmapColor.rgb=fromRGBD(lightmapColor);\n#endif\n#ifdef GAMMALIGHTMAP\nlightmapColor.rgb=toLinearSpace(lightmapColor.rgb);\n#endif\nlightmapColor.rgb*=vLightmapInfos.y;\n#endif\n`;\nY.IncludesShadersStore[tP] = iP;\nconst rP = \"pbrBlockGeometryInfo\", sP = `float NdotVUnclamped=dot(normalW,viewDirectionW);float NdotV=absEps(NdotVUnclamped);float alphaG=convertRoughnessToAverageSlope(roughness);vec2 AARoughnessFactors=getAARoughnessFactors(normalW.xyz);\n#ifdef SPECULARAA\nalphaG+=AARoughnessFactors.y;\n#endif\n#if defined(ENVIRONMENTBRDF)\nvec3 environmentBrdf=getBRDFLookup(NdotV,roughness);\n#endif\n#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\n#ifdef RADIANCEOCCLUSION\n#ifdef AMBIENTINGRAYSCALE\nfloat ambientMonochrome=aoOut.ambientOcclusionColor.r;\n#else\nfloat ambientMonochrome=getLuminance(aoOut.ambientOcclusionColor);\n#endif\nfloat seo=environmentRadianceOcclusion(ambientMonochrome,NdotVUnclamped);\n#endif\n#ifdef HORIZONOCCLUSION\n#ifdef BUMP\n#ifdef REFLECTIONMAP_3D\nfloat eho=environmentHorizonOcclusion(-viewDirectionW,normalW,geometricNormalW);\n#endif\n#endif\n#endif\n#endif\n`;\nY.IncludesShadersStore[rP] = sP;\nconst nP = \"pbrBlockReflectance0\", aP = `float reflectance=max(max(reflectivityOut.surfaceReflectivityColor.r,reflectivityOut.surfaceReflectivityColor.g),reflectivityOut.surfaceReflectivityColor.b);vec3 specularEnvironmentR0=reflectivityOut.surfaceReflectivityColor.rgb;\n#ifdef METALLICWORKFLOW\nvec3 specularEnvironmentR90=vec3(metallicReflectanceFactors.a);\n#else \nvec3 specularEnvironmentR90=vec3(1.0,1.0,1.0);\n#endif\n#ifdef ALPHAFRESNEL\nfloat reflectance90=fresnelGrazingReflectance(reflectance);specularEnvironmentR90=specularEnvironmentR90*reflectance90;\n#endif\n`;\nY.IncludesShadersStore[nP] = aP;\nconst oP = \"pbrBlockReflectance\", lP = `#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\nvec3 specularEnvironmentReflectance=getReflectanceFromBRDFLookup(clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,environmentBrdf);\n#ifdef RADIANCEOCCLUSION\nspecularEnvironmentReflectance*=seo;\n#endif\n#ifdef HORIZONOCCLUSION\n#ifdef BUMP\n#ifdef REFLECTIONMAP_3D\nspecularEnvironmentReflectance*=eho;\n#endif\n#endif\n#endif\n#else\nvec3 specularEnvironmentReflectance=getReflectanceFromAnalyticalBRDFLookup_Jones(NdotV,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,sqrt(microSurface));\n#endif\n#ifdef CLEARCOAT\nspecularEnvironmentReflectance*=clearcoatOut.conservationFactor;\n#if defined(CLEARCOAT_TINT)\nspecularEnvironmentReflectance*=clearcoatOut.absorption;\n#endif\n#endif\n`;\nY.IncludesShadersStore[oP] = lP;\nconst cP = \"pbrBlockDirectLighting\", hP = `vec3 diffuseBase=vec3(0.,0.,0.);\n#ifdef SPECULARTERM\nvec3 specularBase=vec3(0.,0.,0.);\n#endif\n#ifdef CLEARCOAT\nvec3 clearCoatBase=vec3(0.,0.,0.);\n#endif\n#ifdef SHEEN\nvec3 sheenBase=vec3(0.,0.,0.);\n#endif\npreLightingInfo preInfo;lightingInfo info;float shadow=1.; \nfloat aggShadow=0.;float numLights=0.;\n#if defined(CLEARCOAT) && defined(CLEARCOAT_TINT)\nvec3 absorption=vec3(0.);\n#endif\n`;\nY.IncludesShadersStore[cP] = hP;\nconst uP = \"pbrBlockFinalLitComponents\", fP = `aggShadow=aggShadow/numLights;\n#if defined(ENVIRONMENTBRDF)\n#ifdef MS_BRDF_ENERGY_CONSERVATION\nvec3 energyConservationFactor=getEnergyConservationFactor(clearcoatOut.specularEnvironmentR0,environmentBrdf);\n#endif\n#endif\n#ifndef METALLICWORKFLOW\n#ifdef SPECULAR_GLOSSINESS_ENERGY_CONSERVATION\nsurfaceAlbedo.rgb=(1.-reflectance)*surfaceAlbedo.rgb;\n#endif\n#endif\n#if defined(SHEEN) && defined(SHEEN_ALBEDOSCALING) && defined(ENVIRONMENTBRDF)\nsurfaceAlbedo.rgb=sheenOut.sheenAlbedoScaling*surfaceAlbedo.rgb;\n#endif\n#ifdef REFLECTION\nvec3 finalIrradiance=reflectionOut.environmentIrradiance;\n#if defined(CLEARCOAT)\nfinalIrradiance*=clearcoatOut.conservationFactor;\n#if defined(CLEARCOAT_TINT)\nfinalIrradiance*=clearcoatOut.absorption;\n#endif\n#endif\n#if defined(SS_REFRACTION)\nfinalIrradiance*=subSurfaceOut.refractionFactorForIrradiance;\n#endif\n#if defined(SS_TRANSLUCENCY)\nfinalIrradiance*=(1.0-subSurfaceOut.translucencyIntensity);finalIrradiance+=subSurfaceOut.refractionIrradiance;\n#endif\nfinalIrradiance*=surfaceAlbedo.rgb;finalIrradiance*=vLightingIntensity.z;finalIrradiance*=aoOut.ambientOcclusionColor;\n#endif\n#ifdef SPECULARTERM\nvec3 finalSpecular=specularBase;finalSpecular=max(finalSpecular,0.0);vec3 finalSpecularScaled=finalSpecular*vLightingIntensity.x*vLightingIntensity.w;\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nfinalSpecularScaled*=energyConservationFactor;\n#endif\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)\nfinalSpecularScaled*=sheenOut.sheenAlbedoScaling;\n#endif\n#endif\n#ifdef REFLECTION\nvec3 finalRadiance=reflectionOut.environmentRadiance.rgb;finalRadiance*=subSurfaceOut.specularEnvironmentReflectance;vec3 finalRadianceScaled=finalRadiance*vLightingIntensity.z;\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nfinalRadianceScaled*=energyConservationFactor;\n#endif\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)\nfinalRadianceScaled*=sheenOut.sheenAlbedoScaling;\n#endif\n#endif\n#ifdef SHEEN\nvec3 finalSheen=sheenBase*sheenOut.sheenColor;finalSheen=max(finalSheen,0.0);vec3 finalSheenScaled=finalSheen*vLightingIntensity.x*vLightingIntensity.w;\n#if defined(CLEARCOAT) && defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nsheenOut.finalSheenRadianceScaled*=clearcoatOut.conservationFactor;\n#if defined(CLEARCOAT_TINT)\nsheenOut.finalSheenRadianceScaled*=clearcoatOut.absorption;\n#endif\n#endif\n#endif\n#ifdef CLEARCOAT\nvec3 finalClearCoat=clearCoatBase;finalClearCoat=max(finalClearCoat,0.0);vec3 finalClearCoatScaled=finalClearCoat*vLightingIntensity.x*vLightingIntensity.w;\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nfinalClearCoatScaled*=clearcoatOut.energyConservationFactorClearCoat;\n#endif\n#ifdef SS_REFRACTION\nsubSurfaceOut.finalRefraction*=clearcoatOut.conservationFactor;\n#ifdef CLEARCOAT_TINT\nsubSurfaceOut.finalRefraction*=clearcoatOut.absorption;\n#endif\n#endif\n#endif\n#ifdef ALPHABLEND\nfloat luminanceOverAlpha=0.0;\n#if defined(REFLECTION) && defined(RADIANCEOVERALPHA)\nluminanceOverAlpha+=getLuminance(finalRadianceScaled);\n#if defined(CLEARCOAT)\nluminanceOverAlpha+=getLuminance(clearcoatOut.finalClearCoatRadianceScaled);\n#endif\n#endif\n#if defined(SPECULARTERM) && defined(SPECULAROVERALPHA)\nluminanceOverAlpha+=getLuminance(finalSpecularScaled);\n#endif\n#if defined(CLEARCOAT) && defined(CLEARCOATOVERALPHA)\nluminanceOverAlpha+=getLuminance(finalClearCoatScaled);\n#endif\n#if defined(RADIANCEOVERALPHA) || defined(SPECULAROVERALPHA) || defined(CLEARCOATOVERALPHA)\nalpha=saturate(alpha+luminanceOverAlpha*luminanceOverAlpha);\n#endif\n#endif\n`;\nY.IncludesShadersStore[uP] = fP;\nconst dP = \"pbrBlockFinalUnlitComponents\", pP = `vec3 finalDiffuse=diffuseBase;finalDiffuse*=surfaceAlbedo.rgb;finalDiffuse=max(finalDiffuse,0.0);finalDiffuse*=vLightingIntensity.x;vec3 finalAmbient=vAmbientColor;finalAmbient*=surfaceAlbedo.rgb;vec3 finalEmissive=vEmissiveColor;\n#ifdef EMISSIVE\nvec3 emissiveColorTex=texture2D(emissiveSampler,vEmissiveUV+uvOffset).rgb;\n#ifdef GAMMAEMISSIVE\nfinalEmissive*=toLinearSpace(emissiveColorTex.rgb);\n#else\nfinalEmissive*=emissiveColorTex.rgb;\n#endif\nfinalEmissive*= vEmissiveInfos.y;\n#endif\nfinalEmissive*=vLightingIntensity.y;\n#ifdef AMBIENT\nvec3 ambientOcclusionForDirectDiffuse=mix(vec3(1.),aoOut.ambientOcclusionColor,vAmbientInfos.w);\n#else\nvec3 ambientOcclusionForDirectDiffuse=aoOut.ambientOcclusionColor;\n#endif\nfinalAmbient*=aoOut.ambientOcclusionColor;finalDiffuse*=ambientOcclusionForDirectDiffuse;\n`;\nY.IncludesShadersStore[dP] = pP;\nconst gP = \"pbrBlockFinalColorComposition\", mP = `vec4 finalColor=vec4(\n#ifndef UNLIT\n#ifdef REFLECTION\nfinalIrradiance +\n#endif\n#ifdef SPECULARTERM\nfinalSpecularScaled +\n#endif\n#ifdef SHEEN\nfinalSheenScaled +\n#endif\n#ifdef CLEARCOAT\nfinalClearCoatScaled +\n#endif\n#ifdef REFLECTION\nfinalRadianceScaled +\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF)\nsheenOut.finalSheenRadianceScaled +\n#endif\n#ifdef CLEARCOAT\nclearcoatOut.finalClearCoatRadianceScaled +\n#endif\n#endif\n#ifdef SS_REFRACTION\nsubSurfaceOut.finalRefraction +\n#endif\n#endif\nfinalAmbient +\nfinalDiffuse,\nalpha);\n#ifdef LIGHTMAP\n#ifndef LIGHTMAPEXCLUDED\n#ifdef USELIGHTMAPASSHADOWMAP\nfinalColor.rgb*=lightmapColor.rgb;\n#else\nfinalColor.rgb+=lightmapColor.rgb;\n#endif\n#endif\n#endif\nfinalColor.rgb+=finalEmissive;\n#define CUSTOM_FRAGMENT_BEFORE_FOG\nfinalColor=max(finalColor,0.0);\n`;\nY.IncludesShadersStore[gP] = mP;\nconst _P = \"pbrBlockImageProcessing\", EP = `#if defined(IMAGEPROCESSINGPOSTPROCESS) || defined(SS_SCATTERING)\n#if !defined(SKIPFINALCOLORCLAMP)\nfinalColor.rgb=clamp(finalColor.rgb,0.,30.0);\n#endif\n#else\nfinalColor=applyImageProcessing(finalColor);\n#endif\nfinalColor.a*=visibility;\n#ifdef PREMULTIPLYALPHA\nfinalColor.rgb*=finalColor.a;\n#endif\n`;\nY.IncludesShadersStore[_P] = EP;\nconst vP = \"pbrDebug\", TP = `#if DEBUGMODE>0\nif (vClipSpacePosition.x/vClipSpacePosition.w>=vDebugMode.x) {\n#if DEBUGMODE==1\ngl_FragColor.rgb=vPositionW.rgb;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==2 && defined(NORMAL)\ngl_FragColor.rgb=vNormalW.rgb;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==3 && defined(BUMP) || DEBUGMODE==3 && defined(PARALLAX) || DEBUGMODE==3 && defined(ANISOTROPIC)\ngl_FragColor.rgb=TBN[0];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==4 && defined(BUMP) || DEBUGMODE==4 && defined(PARALLAX) || DEBUGMODE==4 && defined(ANISOTROPIC)\ngl_FragColor.rgb=TBN[1];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==5\ngl_FragColor.rgb=normalW;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==6 && defined(MAINUV1)\ngl_FragColor.rgb=vec3(vMainUV1,0.0);\n#elif DEBUGMODE==7 && defined(MAINUV2)\ngl_FragColor.rgb=vec3(vMainUV2,0.0);\n#elif DEBUGMODE==8 && defined(CLEARCOAT) && defined(CLEARCOAT_BUMP)\ngl_FragColor.rgb=clearcoatOut.TBNClearCoat[0];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==9 && defined(CLEARCOAT) && defined(CLEARCOAT_BUMP)\ngl_FragColor.rgb=clearcoatOut.TBNClearCoat[1];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==10 && defined(CLEARCOAT)\ngl_FragColor.rgb=clearcoatOut.clearCoatNormalW;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==11 && defined(ANISOTROPIC)\ngl_FragColor.rgb=anisotropicOut.anisotropicNormal;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==12 && defined(ANISOTROPIC)\ngl_FragColor.rgb=anisotropicOut.anisotropicTangent;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==13 && defined(ANISOTROPIC)\ngl_FragColor.rgb=anisotropicOut.anisotropicBitangent;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==20 && defined(ALBEDO)\ngl_FragColor.rgb=albedoTexture.rgb;\n#ifndef GAMMAALBEDO\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==21 && defined(AMBIENT)\ngl_FragColor.rgb=aoOut.ambientOcclusionColorMap.rgb;\n#elif DEBUGMODE==22 && defined(OPACITY)\ngl_FragColor.rgb=opacityMap.rgb;\n#elif DEBUGMODE==23 && defined(EMISSIVE)\ngl_FragColor.rgb=emissiveColorTex.rgb;\n#ifndef GAMMAEMISSIVE\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==24 && defined(LIGHTMAP)\ngl_FragColor.rgb=lightmapColor.rgb;\n#ifndef GAMMALIGHTMAP\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==25 && defined(REFLECTIVITY) && defined(METALLICWORKFLOW)\ngl_FragColor.rgb=reflectivityOut.surfaceMetallicColorMap.rgb;\n#elif DEBUGMODE==26 && defined(REFLECTIVITY) && !defined(METALLICWORKFLOW)\ngl_FragColor.rgb=reflectivityOut.surfaceReflectivityColorMap.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==27 && defined(CLEARCOAT) && defined(CLEARCOAT_TEXTURE)\ngl_FragColor.rgb=vec3(clearcoatOut.clearCoatMapData.rg,0.0);\n#elif DEBUGMODE==28 && defined(CLEARCOAT) && defined(CLEARCOAT_TINT) && defined(CLEARCOAT_TINT_TEXTURE)\ngl_FragColor.rgb=clearcoatOut.clearCoatTintMapData.rgb;\n#elif DEBUGMODE==29 && defined(SHEEN) && defined(SHEEN_TEXTURE)\ngl_FragColor.rgb=sheenOut.sheenMapData.rgb;\n#elif DEBUGMODE==30 && defined(ANISOTROPIC) && defined(ANISOTROPIC_TEXTURE)\ngl_FragColor.rgb=anisotropicOut.anisotropyMapData.rgb;\n#elif DEBUGMODE==31 && defined(SUBSURFACE) && defined(SS_THICKNESSANDMASK_TEXTURE)\ngl_FragColor.rgb=subSurfaceOut.thicknessMap.rgb;\n#elif DEBUGMODE==32 && defined(BUMP)\ngl_FragColor.rgb=texture2D(bumpSampler,vBumpUV).rgb;\n#elif DEBUGMODE==40 && defined(SS_REFRACTION)\ngl_FragColor.rgb=subSurfaceOut.environmentRefraction.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==41 && defined(REFLECTION)\ngl_FragColor.rgb=reflectionOut.environmentRadiance.rgb;\n#ifndef GAMMAREFLECTION\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==42 && defined(CLEARCOAT) && defined(REFLECTION)\ngl_FragColor.rgb=clearcoatOut.environmentClearCoatRadiance.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==50\ngl_FragColor.rgb=diffuseBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==51 && defined(SPECULARTERM)\ngl_FragColor.rgb=specularBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==52 && defined(CLEARCOAT)\ngl_FragColor.rgb=clearCoatBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==53 && defined(SHEEN)\ngl_FragColor.rgb=sheenBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==54 && defined(REFLECTION)\ngl_FragColor.rgb=reflectionOut.environmentIrradiance.rgb;\n#ifndef GAMMAREFLECTION\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==60\ngl_FragColor.rgb=surfaceAlbedo.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==61\ngl_FragColor.rgb=clearcoatOut.specularEnvironmentR0;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==62 && defined(METALLICWORKFLOW)\ngl_FragColor.rgb=vec3(reflectivityOut.metallicRoughness.r);\n#elif DEBUGMODE==71 && defined(METALLICWORKFLOW)\ngl_FragColor.rgb=reflectivityOut.metallicF0;\n#elif DEBUGMODE==63\ngl_FragColor.rgb=vec3(roughness);\n#elif DEBUGMODE==64\ngl_FragColor.rgb=vec3(alphaG);\n#elif DEBUGMODE==65\ngl_FragColor.rgb=vec3(NdotV);\n#elif DEBUGMODE==66 && defined(CLEARCOAT) && defined(CLEARCOAT_TINT)\ngl_FragColor.rgb=clearcoatOut.clearCoatColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==67 && defined(CLEARCOAT)\ngl_FragColor.rgb=vec3(clearcoatOut.clearCoatRoughness);\n#elif DEBUGMODE==68 && defined(CLEARCOAT)\ngl_FragColor.rgb=vec3(clearcoatOut.clearCoatNdotV);\n#elif DEBUGMODE==69 && defined(SUBSURFACE) && defined(SS_TRANSLUCENCY)\ngl_FragColor.rgb=subSurfaceOut.transmittance;\n#elif DEBUGMODE==70 && defined(SUBSURFACE) && defined(SS_REFRACTION)\ngl_FragColor.rgb=subSurfaceOut.refractionTransmittance;\n#elif DEBUGMODE==72\ngl_FragColor.rgb=vec3(microSurface);\n#elif DEBUGMODE==73\ngl_FragColor.rgb=vAlbedoColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==74 && !defined(METALLICWORKFLOW)\ngl_FragColor.rgb=vReflectivityColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==75\ngl_FragColor.rgb=vEmissiveColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==80 && defined(RADIANCEOCCLUSION)\ngl_FragColor.rgb=vec3(seo);\n#elif DEBUGMODE==81 && defined(HORIZONOCCLUSION) && defined(BUMP) && defined(REFLECTIONMAP_3D)\ngl_FragColor.rgb=vec3(eho);\n#elif DEBUGMODE==82 && defined(MS_BRDF_ENERGY_CONSERVATION)\ngl_FragColor.rgb=vec3(energyConservationFactor);\n#elif DEBUGMODE==83 && defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\ngl_FragColor.rgb=specularEnvironmentReflectance;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==84 && defined(CLEARCOAT) && defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\ngl_FragColor.rgb=clearcoatOut.clearCoatEnvironmentReflectance;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==85 && defined(SHEEN) && defined(REFLECTION)\ngl_FragColor.rgb=sheenOut.sheenEnvironmentReflectance;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==86 && defined(ALPHABLEND)\ngl_FragColor.rgb=vec3(luminanceOverAlpha);\n#elif DEBUGMODE==87\ngl_FragColor.rgb=vec3(alpha);\n#elif DEBUGMODE==88 && defined(ALBEDO)\ngl_FragColor.rgb=vec3(albedoTexture.a);\n#elif DEBUGMODE==89\ngl_FragColor.rgb=aoOut.ambientOcclusionColor.rgb;\n#else\nfloat stripeWidth=30.;float stripePos=floor((gl_FragCoord.x+gl_FragCoord.y)/stripeWidth);float whichColor=mod(stripePos,2.);vec3 color1=vec3(.6,.2,.2);vec3 color2=vec3(.3,.1,.1);gl_FragColor.rgb=mix(color1,color2,whichColor);\n#endif\ngl_FragColor.rgb*=vDebugMode.y;\n#ifdef DEBUGMODE_NORMALIZE\ngl_FragColor.rgb=normalize(gl_FragColor.rgb)*0.5+0.5;\n#endif\n#ifdef DEBUGMODE_GAMMA\ngl_FragColor.rgb=toGammaSpace(gl_FragColor.rgb);\n#endif\ngl_FragColor.a=1.0;\n#ifdef PREPASS\ngl_FragData[0]=toLinearSpace(gl_FragColor); \ngl_FragData[1]=vec4(0.,0.,0.,0.); \n#endif\n#ifdef DEBUGMODE_FORCERETURN\nreturn;\n#endif\n}\n#endif\n`;\nY.IncludesShadersStore[vP] = TP;\nconst xP = \"pbrPixelShader\", CP = `#if defined(BUMP) || !defined(NORMAL) || defined(FORCENORMALFORWARD) || defined(SPECULARAA) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#extension GL_OES_standard_derivatives : enable\n#endif\n#ifdef LODBASEDMICROSFURACE\n#extension GL_EXT_shader_texture_lod : enable\n#endif\n#define CUSTOM_FRAGMENT_BEGIN\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\n#include[SCENE_MRT_COUNT]\nprecision highp float;\n#include\n#ifndef FROMLINEARSPACE\n#define FROMLINEARSPACE\n#endif\n#include<__decl__pbrFragment>\n#include\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#ifdef REFLECTION\n#include\n#endif\n#define CUSTOM_FRAGMENT_DEFINITIONS\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include\n#include\n#include\n#include\nalbedoOpacityOutParams albedoOpacityOut;\n#ifdef ALBEDO\nvec4 albedoTexture=texture2D(albedoSampler,vAlbedoUV+uvOffset);\n#endif\n#ifdef OPACITY\nvec4 opacityMap=texture2D(opacitySampler,vOpacityUV+uvOffset);\n#endif\n#ifdef DECAL\nvec4 decalColor=texture2D(decalSampler,vDecalUV+uvOffset);\n#endif\nalbedoOpacityBlock(\nvAlbedoColor,\n#ifdef ALBEDO\nalbedoTexture,\nvAlbedoInfos,\n#endif\n#ifdef OPACITY\nopacityMap,\nvOpacityInfos,\n#endif\n#ifdef DETAIL\ndetailColor,\nvDetailInfos,\n#endif\n#ifdef DECAL\ndecalColor,\nvDecalInfos,\n#endif\nalbedoOpacityOut\n);vec3 surfaceAlbedo=albedoOpacityOut.surfaceAlbedo;float alpha=albedoOpacityOut.alpha;\n#define CUSTOM_FRAGMENT_UPDATE_ALPHA\n#include\n#define CUSTOM_FRAGMENT_BEFORE_LIGHTS\nambientOcclusionOutParams aoOut;\n#ifdef AMBIENT\nvec3 ambientOcclusionColorMap=texture2D(ambientSampler,vAmbientUV+uvOffset).rgb;\n#endif\nambientOcclusionBlock(\n#ifdef AMBIENT\nambientOcclusionColorMap,\nvAmbientInfos,\n#endif\naoOut\n);\n#include\n#ifdef UNLIT\nvec3 diffuseBase=vec3(1.,1.,1.);\n#else\nvec3 baseColor=surfaceAlbedo;reflectivityOutParams reflectivityOut;\n#if defined(REFLECTIVITY)\nvec4 surfaceMetallicOrReflectivityColorMap=texture2D(reflectivitySampler,vReflectivityUV+uvOffset);vec4 baseReflectivity=surfaceMetallicOrReflectivityColorMap;\n#ifndef METALLICWORKFLOW\n#ifdef REFLECTIVITY_GAMMA\nsurfaceMetallicOrReflectivityColorMap=toLinearSpace(surfaceMetallicOrReflectivityColorMap);\n#endif\nsurfaceMetallicOrReflectivityColorMap.rgb*=vReflectivityInfos.y;\n#endif\n#endif\n#if defined(MICROSURFACEMAP)\nvec4 microSurfaceTexel=texture2D(microSurfaceSampler,vMicroSurfaceSamplerUV+uvOffset)*vMicroSurfaceSamplerInfos.y;\n#endif\n#ifdef METALLICWORKFLOW\nvec4 metallicReflectanceFactors=vMetallicReflectanceFactors;\n#ifdef REFLECTANCE\nvec4 reflectanceFactorsMap=texture2D(reflectanceSampler,vReflectanceUV+uvOffset);\n#ifdef REFLECTANCE_GAMMA\nreflectanceFactorsMap=toLinearSpace(reflectanceFactorsMap);\n#endif\nmetallicReflectanceFactors.rgb*=reflectanceFactorsMap.rgb;\n#endif\n#ifdef METALLIC_REFLECTANCE\nvec4 metallicReflectanceFactorsMap=texture2D(metallicReflectanceSampler,vMetallicReflectanceUV+uvOffset);\n#ifdef METALLIC_REFLECTANCE_GAMMA\nmetallicReflectanceFactorsMap=toLinearSpace(metallicReflectanceFactorsMap);\n#endif\n#ifndef METALLIC_REFLECTANCE_USE_ALPHA_ONLY\nmetallicReflectanceFactors.rgb*=metallicReflectanceFactorsMap.rgb;\n#endif\nmetallicReflectanceFactors*=metallicReflectanceFactorsMap.a;\n#endif\n#endif\nreflectivityBlock(\nvReflectivityColor,\n#ifdef METALLICWORKFLOW\nsurfaceAlbedo,\nmetallicReflectanceFactors,\n#endif\n#ifdef REFLECTIVITY\nvReflectivityInfos,\nsurfaceMetallicOrReflectivityColorMap,\n#endif\n#if defined(METALLICWORKFLOW) && defined(REFLECTIVITY) && defined(AOSTOREINMETALMAPRED)\naoOut.ambientOcclusionColor,\n#endif\n#ifdef MICROSURFACEMAP\nmicroSurfaceTexel,\n#endif\n#ifdef DETAIL\ndetailColor,\nvDetailInfos,\n#endif\nreflectivityOut\n);float microSurface=reflectivityOut.microSurface;float roughness=reflectivityOut.roughness;\n#ifdef METALLICWORKFLOW\nsurfaceAlbedo=reflectivityOut.surfaceAlbedo;\n#endif\n#if defined(METALLICWORKFLOW) && defined(REFLECTIVITY) && defined(AOSTOREINMETALMAPRED)\naoOut.ambientOcclusionColor=reflectivityOut.ambientOcclusionColor;\n#endif\n#ifdef ALPHAFRESNEL\n#if defined(ALPHATEST) || defined(ALPHABLEND)\nalphaFresnelOutParams alphaFresnelOut;alphaFresnelBlock(\nnormalW,\nviewDirectionW,\nalpha,\nmicroSurface,\nalphaFresnelOut\n);alpha=alphaFresnelOut.alpha;\n#endif\n#endif\n#include\n#ifdef ANISOTROPIC\nanisotropicOutParams anisotropicOut;\n#ifdef ANISOTROPIC_TEXTURE\nvec3 anisotropyMapData=texture2D(anisotropySampler,vAnisotropyUV+uvOffset).rgb*vAnisotropyInfos.y;\n#endif\nanisotropicBlock(\nvAnisotropy,\nroughness,\n#ifdef ANISOTROPIC_TEXTURE\nanisotropyMapData,\n#endif\nTBN,\nnormalW,\nviewDirectionW,\nanisotropicOut\n);\n#endif\n#ifdef REFLECTION\nreflectionOutParams reflectionOut;\n#ifndef USE_CUSTOM_REFLECTION\nreflectionBlock(\nvPositionW,\nnormalW,\nalphaG,\nvReflectionMicrosurfaceInfos,\nvReflectionInfos,\nvReflectionColor,\n#ifdef ANISOTROPIC\nanisotropicOut,\n#endif\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nNdotVUnclamped,\n#endif\n#ifdef LINEARSPECULARREFLECTION\nroughness,\n#endif\nreflectionSampler,\n#if defined(NORMAL) && defined(USESPHERICALINVERTEX)\nvEnvironmentIrradiance,\n#endif\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\nreflectionMatrix,\n#endif\n#endif\n#ifdef USEIRRADIANCEMAP\nirradianceSampler,\n#endif\n#ifndef LODBASEDMICROSFURACE\nreflectionSamplerLow,\nreflectionSamplerHigh,\n#endif\n#ifdef REALTIME_FILTERING\nvReflectionFilteringInfo,\n#endif\nreflectionOut\n);\n#else\n#define CUSTOM_REFLECTION\n#endif\n#endif\n#include\n#ifdef SHEEN\nsheenOutParams sheenOut;\n#ifdef SHEEN_TEXTURE\nvec4 sheenMapData=texture2D(sheenSampler,vSheenUV+uvOffset);\n#endif\n#if defined(SHEEN_ROUGHNESS) && defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE)\nvec4 sheenMapRoughnessData=texture2D(sheenRoughnessSampler,vSheenRoughnessUV+uvOffset)*vSheenInfos.w;\n#endif\nsheenBlock(\nvSheenColor,\n#ifdef SHEEN_ROUGHNESS\nvSheenRoughness,\n#if defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE)\nsheenMapRoughnessData,\n#endif\n#endif\nroughness,\n#ifdef SHEEN_TEXTURE\nsheenMapData,\nvSheenInfos.y,\n#endif\nreflectance,\n#ifdef SHEEN_LINKWITHALBEDO\nbaseColor,\nsurfaceAlbedo,\n#endif\n#ifdef ENVIRONMENTBRDF\nNdotV,\nenvironmentBrdf,\n#endif\n#if defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nAARoughnessFactors,\nvReflectionMicrosurfaceInfos,\nvReflectionInfos,\nvReflectionColor,\nvLightingIntensity,\nreflectionSampler,\nreflectionOut.reflectionCoords,\nNdotVUnclamped,\n#ifndef LODBASEDMICROSFURACE\nreflectionSamplerLow,\nreflectionSamplerHigh,\n#endif\n#ifdef REALTIME_FILTERING\nvReflectionFilteringInfo,\n#endif\n#if !defined(REFLECTIONMAP_SKYBOX) && defined(RADIANCEOCCLUSION)\nseo,\n#endif\n#if !defined(REFLECTIONMAP_SKYBOX) && defined(HORIZONOCCLUSION) && defined(BUMP) && defined(REFLECTIONMAP_3D)\neho,\n#endif\n#endif\nsheenOut\n);\n#ifdef SHEEN_LINKWITHALBEDO\nsurfaceAlbedo=sheenOut.surfaceAlbedo;\n#endif\n#endif\n#ifdef CLEARCOAT\n#ifdef CLEARCOAT_TEXTURE\nvec2 clearCoatMapData=texture2D(clearCoatSampler,vClearCoatUV+uvOffset).rg*vClearCoatInfos.y;\n#endif\n#endif\n#ifdef IRIDESCENCE\niridescenceOutParams iridescenceOut;\n#ifdef IRIDESCENCE_TEXTURE\nvec2 iridescenceMapData=texture2D(iridescenceSampler,vIridescenceUV+uvOffset).rg*vIridescenceInfos.y;\n#endif\n#ifdef IRIDESCENCE_THICKNESS_TEXTURE\nvec2 iridescenceThicknessMapData=texture2D(iridescenceThicknessSampler,vIridescenceThicknessUV+uvOffset).rg*vIridescenceInfos.w;\n#endif\niridescenceBlock(\nvIridescenceParams,\nNdotV,\nspecularEnvironmentR0,\n#ifdef IRIDESCENCE_TEXTURE\niridescenceMapData,\n#endif\n#ifdef IRIDESCENCE_THICKNESS_TEXTURE\niridescenceThicknessMapData,\n#endif\n#ifdef CLEARCOAT\nNdotVUnclamped,\n#ifdef CLEARCOAT_TEXTURE\nclearCoatMapData,\n#endif\n#endif\niridescenceOut\n);float iridescenceIntensity=iridescenceOut.iridescenceIntensity;specularEnvironmentR0=iridescenceOut.specularEnvironmentR0;\n#endif\nclearcoatOutParams clearcoatOut;\n#ifdef CLEARCOAT\n#if defined(CLEARCOAT_TEXTURE_ROUGHNESS) && !defined(CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE)\nvec4 clearCoatMapRoughnessData=texture2D(clearCoatRoughnessSampler,vClearCoatRoughnessUV+uvOffset)*vClearCoatInfos.w;\n#endif\n#if defined(CLEARCOAT_TINT) && defined(CLEARCOAT_TINT_TEXTURE)\nvec4 clearCoatTintMapData=texture2D(clearCoatTintSampler,vClearCoatTintUV+uvOffset);\n#endif\n#ifdef CLEARCOAT_BUMP\nvec4 clearCoatBumpMapData=texture2D(clearCoatBumpSampler,vClearCoatBumpUV+uvOffset);\n#endif\nclearcoatBlock(\nvPositionW,\ngeometricNormalW,\nviewDirectionW,\nvClearCoatParams,\n#if defined(CLEARCOAT_TEXTURE_ROUGHNESS) && !defined(CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE)\nclearCoatMapRoughnessData,\n#endif\nspecularEnvironmentR0,\n#ifdef CLEARCOAT_TEXTURE\nclearCoatMapData,\n#endif\n#ifdef CLEARCOAT_TINT\nvClearCoatTintParams,\nclearCoatColorAtDistance,\nvClearCoatRefractionParams,\n#ifdef CLEARCOAT_TINT_TEXTURE\nclearCoatTintMapData,\n#endif\n#endif\n#ifdef CLEARCOAT_BUMP\nvClearCoatBumpInfos,\nclearCoatBumpMapData,\nvClearCoatBumpUV,\n#if defined(TANGENT) && defined(NORMAL)\nvTBN,\n#else\nvClearCoatTangentSpaceParams,\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\nnormalMatrix,\n#endif\n#endif\n#if defined(FORCENORMALFORWARD) && defined(NORMAL)\nfaceNormal,\n#endif\n#ifdef REFLECTION\nvReflectionMicrosurfaceInfos,\nvReflectionInfos,\nvReflectionColor,\nvLightingIntensity,\nreflectionSampler,\n#ifndef LODBASEDMICROSFURACE\nreflectionSamplerLow,\nreflectionSamplerHigh,\n#endif\n#ifdef REALTIME_FILTERING\nvReflectionFilteringInfo,\n#endif\n#endif\n#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\n#ifdef RADIANCEOCCLUSION\nambientMonochrome,\n#endif\n#endif\n#if defined(CLEARCOAT_BUMP) || defined(TWOSIDEDLIGHTING)\n(gl_FrontFacing ? 1. : -1.),\n#endif\nclearcoatOut\n);\n#else\nclearcoatOut.specularEnvironmentR0=specularEnvironmentR0;\n#endif\n#include\nsubSurfaceOutParams subSurfaceOut;\n#ifdef SUBSURFACE\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nvec4 thicknessMap=texture2D(thicknessSampler,vThicknessUV+uvOffset);\n#endif\n#ifdef SS_REFRACTIONINTENSITY_TEXTURE\nvec4 refractionIntensityMap=texture2D(refractionIntensitySampler,vRefractionIntensityUV+uvOffset);\n#endif\n#ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE\nvec4 translucencyIntensityMap=texture2D(translucencyIntensitySampler,vTranslucencyIntensityUV+uvOffset);\n#endif\nsubSurfaceBlock(\nvSubSurfaceIntensity,\nvThicknessParam,\nvTintColor,\nnormalW,\nspecularEnvironmentReflectance,\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nthicknessMap,\n#endif\n#ifdef SS_REFRACTIONINTENSITY_TEXTURE\nrefractionIntensityMap,\n#endif\n#ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE\ntranslucencyIntensityMap,\n#endif\n#ifdef REFLECTION\n#ifdef SS_TRANSLUCENCY\nreflectionMatrix,\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\nreflectionOut.irradianceVector,\n#endif\n#if defined(REALTIME_FILTERING)\nreflectionSampler,\nvReflectionFilteringInfo,\n#endif\n#endif\n#ifdef USEIRRADIANCEMAP\nirradianceSampler,\n#endif\n#endif\n#endif\n#if defined(SS_REFRACTION) || defined(SS_TRANSLUCENCY)\nsurfaceAlbedo,\n#endif\n#ifdef SS_REFRACTION\nvPositionW,\nviewDirectionW,\nview,\nvRefractionInfos,\nrefractionMatrix,\nvRefractionMicrosurfaceInfos,\nvLightingIntensity,\n#ifdef SS_LINKREFRACTIONTOTRANSPARENCY\nalpha,\n#endif\n#ifdef SS_LODINREFRACTIONALPHA\nNdotVUnclamped,\n#endif\n#ifdef SS_LINEARSPECULARREFRACTION\nroughness,\n#endif\nalphaG,\nrefractionSampler,\n#ifndef LODBASEDMICROSFURACE\nrefractionSamplerLow,\nrefractionSamplerHigh,\n#endif\n#ifdef ANISOTROPIC\nanisotropicOut,\n#endif\n#ifdef REALTIME_FILTERING\nvRefractionFilteringInfo,\n#endif\n#ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC\nvRefractionPosition,\nvRefractionSize,\n#endif\n#ifdef SS_DISPERSION\ndispersion,\n#endif\n#endif\n#ifdef SS_TRANSLUCENCY\nvDiffusionDistance,\n#endif\nsubSurfaceOut\n);\n#ifdef SS_REFRACTION\nsurfaceAlbedo=subSurfaceOut.surfaceAlbedo;\n#ifdef SS_LINKREFRACTIONTOTRANSPARENCY\nalpha=subSurfaceOut.alpha;\n#endif\n#endif\n#else\nsubSurfaceOut.specularEnvironmentReflectance=specularEnvironmentReflectance;\n#endif\n#include\n#include[0..maxSimultaneousLights]\n#include\n#endif \n#include\n#define CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\n#include\n#include\n#include(color,finalColor)\n#include\n#define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\n#ifdef PREPASS\nfloat writeGeometryInfo=finalColor.a>0.4 ? 1.0 : 0.0;\n#ifdef PREPASS_POSITION\ngl_FragData[PREPASS_POSITION_INDEX]=vec4(vPositionW,writeGeometryInfo);\n#endif\n#ifdef PREPASS_VELOCITY\nvec2 a=(vCurrentPosition.xy/vCurrentPosition.w)*0.5+0.5;vec2 b=(vPreviousPosition.xy/vPreviousPosition.w)*0.5+0.5;vec2 velocity=abs(a-b);velocity=vec2(pow(velocity.x,1.0/3.0),pow(velocity.y,1.0/3.0))*sign(a-b)*0.5+0.5;gl_FragData[PREPASS_VELOCITY_INDEX]=vec4(velocity,0.0,writeGeometryInfo);\n#endif\n#ifdef PREPASS_ALBEDO_SQRT\nvec3 sqAlbedo=sqrt(surfaceAlbedo); \n#endif\n#ifdef PREPASS_IRRADIANCE\nvec3 irradiance=finalDiffuse;\n#ifndef UNLIT\n#ifdef REFLECTION\nirradiance+=finalIrradiance;\n#endif\n#endif\n#ifdef SS_SCATTERING\ngl_FragData[0]=vec4(finalColor.rgb-irradiance,finalColor.a); \nirradiance/=sqAlbedo;\n#else\ngl_FragData[0]=finalColor; \nfloat scatteringDiffusionProfile=255.;\n#endif\ngl_FragData[PREPASS_IRRADIANCE_INDEX]=vec4(clamp(irradiance,vec3(0.),vec3(1.)),writeGeometryInfo*scatteringDiffusionProfile/255.); \n#else\ngl_FragData[0]=vec4(finalColor.rgb,finalColor.a);\n#endif\n#ifdef PREPASS_DEPTH\ngl_FragData[PREPASS_DEPTH_INDEX]=vec4(vViewPos.z,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_NORMAL\n#ifdef PREPASS_NORMAL_WORLDSPACE\ngl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalW,writeGeometryInfo); \n#else\ngl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalize((view*vec4(normalW,0.0)).rgb),writeGeometryInfo); \n#endif\n#endif\n#ifdef PREPASS_ALBEDO_SQRT\ngl_FragData[PREPASS_ALBEDO_SQRT_INDEX]=vec4(sqAlbedo,writeGeometryInfo); \n#endif\n#ifdef PREPASS_REFLECTIVITY\n#ifndef UNLIT\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(specularEnvironmentR0,microSurface)*writeGeometryInfo;\n#else\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4( 0.0,0.0,0.0,1.0 )*writeGeometryInfo;\n#endif\n#endif\n#endif\n#if !defined(PREPASS) || defined(WEBGL2)\ngl_FragColor=finalColor;\n#endif\n#include\n#if ORDER_INDEPENDENT_TRANSPARENCY\nif (fragDepth==nearestDepth) {frontColor.rgb+=finalColor.rgb*finalColor.a*alphaMultiplier;frontColor.a=1.0-alphaMultiplier*(1.0-finalColor.a);} else {backColor+=finalColor;}\n#endif\n#include\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n`;\nY.ShadersStore[xP] = CP;\nconst RP = \"pbrVertexDeclaration\", SP = `uniform mat4 view;uniform mat4 viewProjection;\n#ifdef ALBEDO\nuniform mat4 albedoMatrix;uniform vec2 vAlbedoInfos;\n#endif\n#ifdef AMBIENT\nuniform mat4 ambientMatrix;uniform vec4 vAmbientInfos;\n#endif\n#ifdef OPACITY\nuniform mat4 opacityMatrix;uniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;uniform mat4 emissiveMatrix;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;uniform mat4 lightmapMatrix;\n#endif\n#ifdef REFLECTIVITY \nuniform vec3 vReflectivityInfos;uniform mat4 reflectivityMatrix;\n#endif\n#ifdef METALLIC_REFLECTANCE\nuniform vec2 vMetallicReflectanceInfos;uniform mat4 metallicReflectanceMatrix;\n#endif\n#ifdef REFLECTANCE\nuniform vec2 vReflectanceInfos;uniform mat4 reflectanceMatrix;\n#endif\n#ifdef MICROSURFACEMAP\nuniform vec2 vMicroSurfaceSamplerInfos;uniform mat4 microSurfaceSamplerMatrix;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;uniform mat4 bumpMatrix;\n#endif\n#ifdef POINTSIZE\nuniform float pointSize;\n#endif\n#ifdef REFLECTION\nuniform vec2 vReflectionInfos;uniform mat4 reflectionMatrix;\n#endif\n#ifdef CLEARCOAT\n#if defined(CLEARCOAT_TEXTURE) || defined(CLEARCOAT_TEXTURE_ROUGHNESS)\nuniform vec4 vClearCoatInfos;\n#endif\n#ifdef CLEARCOAT_TEXTURE\nuniform mat4 clearCoatMatrix;\n#endif\n#ifdef CLEARCOAT_TEXTURE_ROUGHNESS\nuniform mat4 clearCoatRoughnessMatrix;\n#endif\n#ifdef CLEARCOAT_BUMP\nuniform vec2 vClearCoatBumpInfos;uniform mat4 clearCoatBumpMatrix;\n#endif\n#ifdef CLEARCOAT_TINT_TEXTURE\nuniform vec2 vClearCoatTintInfos;uniform mat4 clearCoatTintMatrix;\n#endif\n#endif\n#ifdef IRIDESCENCE\n#if defined(IRIDESCENCE_TEXTURE) || defined(IRIDESCENCE_THICKNESS_TEXTURE)\nuniform vec4 vIridescenceInfos;\n#endif\n#ifdef IRIDESCENCE_TEXTURE\nuniform mat4 iridescenceMatrix;\n#endif\n#ifdef IRIDESCENCE_THICKNESS_TEXTURE\nuniform mat4 iridescenceThicknessMatrix;\n#endif\n#endif\n#ifdef ANISOTROPIC\n#ifdef ANISOTROPIC_TEXTURE\nuniform vec2 vAnisotropyInfos;uniform mat4 anisotropyMatrix;\n#endif\n#endif\n#ifdef SHEEN\n#if defined(SHEEN_TEXTURE) || defined(SHEEN_TEXTURE_ROUGHNESS)\nuniform vec4 vSheenInfos;\n#endif\n#ifdef SHEEN_TEXTURE\nuniform mat4 sheenMatrix;\n#endif\n#ifdef SHEEN_TEXTURE_ROUGHNESS\nuniform mat4 sheenRoughnessMatrix;\n#endif\n#endif\n#ifdef SUBSURFACE\n#ifdef SS_REFRACTION\nuniform vec4 vRefractionInfos;uniform mat4 refractionMatrix;\n#endif\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nuniform vec2 vThicknessInfos;uniform mat4 thicknessMatrix;\n#endif\n#ifdef SS_REFRACTIONINTENSITY_TEXTURE\nuniform vec2 vRefractionIntensityInfos;uniform mat4 refractionIntensityMatrix;\n#endif\n#ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE\nuniform vec2 vTranslucencyIntensityInfos;uniform mat4 translucencyIntensityMatrix;\n#endif\n#endif\n#ifdef NORMAL\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#ifdef SPHERICAL_HARMONICS\nuniform vec3 vSphericalL00;uniform vec3 vSphericalL1_1;uniform vec3 vSphericalL10;uniform vec3 vSphericalL11;uniform vec3 vSphericalL2_2;uniform vec3 vSphericalL2_1;uniform vec3 vSphericalL20;uniform vec3 vSphericalL21;uniform vec3 vSphericalL22;\n#else\nuniform vec3 vSphericalX;uniform vec3 vSphericalY;uniform vec3 vSphericalZ;uniform vec3 vSphericalXX_ZZ;uniform vec3 vSphericalYY_ZZ;uniform vec3 vSphericalZZ;uniform vec3 vSphericalXY;uniform vec3 vSphericalYZ;uniform vec3 vSphericalZX;\n#endif\n#endif\n#endif\n#endif\n#ifdef DETAIL\nuniform vec4 vDetailInfos;uniform mat4 detailMatrix;\n#endif\n#include\n#define ADDITIONAL_VERTEX_DECLARATION\n`;\nY.IncludesShadersStore[RP] = SP;\nconst yP = \"pbrVertexShader\", IP = `precision highp float;\n#include<__decl__pbrVertex>\n#define CUSTOM_VERTEX_BEGIN\nattribute vec3 position;\n#ifdef NORMAL\nattribute vec3 normal;\n#endif\n#ifdef TANGENT\nattribute vec4 tangent;\n#endif\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#include[2..7]\n#include[1..7]\n#ifdef VERTEXCOLOR\nattribute vec4 color;\n#endif\n#include\n#include\n#include\n#include\n#include\n#include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap)\n#include(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity)\n#include(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler)\n#include(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance)\n#include(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance)\n#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal)\n#ifdef CLEARCOAT\n#include(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat)\n#include(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness)\n#include(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump)\n#include(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint)\n#endif\n#ifdef IRIDESCENCE\n#include(_DEFINENAME_,IRIDESCENCE_TEXTURE,_VARYINGNAME_,Iridescence)\n#include(_DEFINENAME_,IRIDESCENCE_THICKNESS_TEXTURE,_VARYINGNAME_,IridescenceThickness)\n#endif\n#ifdef SHEEN\n#include(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen)\n#include(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness)\n#endif\n#ifdef ANISOTROPIC\n#include(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy)\n#endif\n#ifdef SUBSURFACE\n#include(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness)\n#include(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity)\n#include(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity)\n#endif\nvarying vec3 vPositionW;\n#if DEBUGMODE>0\nvarying vec4 vClipSpacePosition;\n#endif\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvarying vec3 vEnvironmentIrradiance;\n#include\n#endif\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#include\n#include\n#include\n#include<__decl__lightVxFragment>[0..maxSimultaneousLights]\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#include\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvec3 positionUpdated=position;\n#ifdef NORMAL\nvec3 normalUpdated=normal;\n#endif\n#ifdef TANGENT\nvec4 tangentUpdated=tangent;\n#endif\n#ifdef UV1\nvec2 uvUpdated=uv;\n#endif\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvPositionUVW=positionUpdated;\n#endif\n#define CUSTOM_VERTEX_UPDATE_POSITION\n#define CUSTOM_VERTEX_UPDATE_NORMAL\n#include\n#if defined(PREPASS) && defined(PREPASS_VELOCITY) && !defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*finalWorld*vec4(positionUpdated,1.0);vPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\n#endif\n#include\n#include\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);vPositionW=vec3(worldPos);\n#include\n#ifdef NORMAL\nmat3 normalWorld=mat3(finalWorld);\n#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvNormalW=normalUpdated/vec3(dot(normalWorld[0],normalWorld[0]),dot(normalWorld[1],normalWorld[1]),dot(normalWorld[2],normalWorld[2]));vNormalW=normalize(normalWorld*vNormalW);\n#else\n#ifdef NONUNIFORMSCALING\nnormalWorld=transposeMat3(inverseMat3(normalWorld));\n#endif\nvNormalW=normalize(normalWorld*normalUpdated);\n#endif\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvec3 reflectionVector=vec3(reflectionMatrix*vec4(vNormalW,0)).xyz;\n#ifdef REFLECTIONMAP_OPPOSITEZ\nreflectionVector.z*=-1.0;\n#endif\nvEnvironmentIrradiance=computeEnvironmentIrradiance(reflectionVector);\n#endif\n#endif\n#define CUSTOM_VERTEX_UPDATE_WORLDPOS\n#ifdef MULTIVIEW\nif (gl_ViewID_OVR==0u) {gl_Position=viewProjection*worldPos;} else {gl_Position=viewProjectionR*worldPos;}\n#else\ngl_Position=viewProjection*worldPos;\n#endif\n#if DEBUGMODE>0\nvClipSpacePosition=gl_Position;\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0)));\n#endif\n#ifndef UV1\nvec2 uvUpdated=vec2(0.,0.);\n#endif\n#ifdef MAINUV1\nvMainUV1=uvUpdated;\n#endif\n#include[2..7]\n#include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_MATRIXNAME_,albedo,_INFONAME_,AlbedoInfos.x)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_MATRIXNAME_,emissive,_INFONAME_,EmissiveInfos.x)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_MATRIXNAME_,lightmap,_INFONAME_,LightmapInfos.x)\n#include(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity,_MATRIXNAME_,reflectivity,_INFONAME_,ReflectivityInfos.x)\n#include(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler,_MATRIXNAME_,microSurfaceSampler,_INFONAME_,MicroSurfaceSamplerInfos.x)\n#include(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance,_MATRIXNAME_,metallicReflectance,_INFONAME_,MetallicReflectanceInfos.x)\n#include(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance,_MATRIXNAME_,reflectance,_INFONAME_,ReflectanceInfos.x)\n#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_MATRIXNAME_,bump,_INFONAME_,BumpInfos.x)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_MATRIXNAME_,decal,_INFONAME_,DecalInfos.x)\n#ifdef CLEARCOAT\n#include(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat,_MATRIXNAME_,clearCoat,_INFONAME_,ClearCoatInfos.x)\n#include(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness,_MATRIXNAME_,clearCoatRoughness,_INFONAME_,ClearCoatInfos.z)\n#include(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump,_MATRIXNAME_,clearCoatBump,_INFONAME_,ClearCoatBumpInfos.x)\n#include(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint,_MATRIXNAME_,clearCoatTint,_INFONAME_,ClearCoatTintInfos.x)\n#endif\n#ifdef IRIDESCENCE\n#include(_DEFINENAME_,IRIDESCENCE_TEXTURE,_VARYINGNAME_,Iridescence,_MATRIXNAME_,iridescence,_INFONAME_,IridescenceInfos.x)\n#include(_DEFINENAME_,IRIDESCENCE_THICKNESS_TEXTURE,_VARYINGNAME_,IridescenceThickness,_MATRIXNAME_,iridescenceThickness,_INFONAME_,IridescenceInfos.z)\n#endif\n#ifdef SHEEN\n#include(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen,_MATRIXNAME_,sheen,_INFONAME_,SheenInfos.x)\n#include(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness,_MATRIXNAME_,sheenRoughness,_INFONAME_,SheenInfos.z)\n#endif\n#ifdef ANISOTROPIC\n#include(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy,_MATRIXNAME_,anisotropy,_INFONAME_,AnisotropyInfos.x)\n#endif\n#ifdef SUBSURFACE\n#include(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness,_MATRIXNAME_,thickness,_INFONAME_,ThicknessInfos.x)\n#include(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity,_MATRIXNAME_,refractionIntensity,_INFONAME_,RefractionIntensityInfos.x)\n#include(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity,_MATRIXNAME_,translucencyIntensity,_INFONAME_,TranslucencyIntensityInfos.x)\n#endif\n#include\n#include\n#include\n#include[0..maxSimultaneousLights]\n#include\n#if defined(POINTSIZE) && !defined(WEBGPU)\ngl_PointSize=pointSize;\n#endif\n#include\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[yP] = IP;\nclass bP extends es {\n constructor() {\n super(...arguments), this.CLEARCOAT = !1, this.CLEARCOAT_DEFAULTIOR = !1, this.CLEARCOAT_TEXTURE = !1, this.CLEARCOAT_TEXTURE_ROUGHNESS = !1, this.CLEARCOAT_TEXTUREDIRECTUV = 0, this.CLEARCOAT_TEXTURE_ROUGHNESSDIRECTUV = 0, this.CLEARCOAT_BUMP = !1, this.CLEARCOAT_BUMPDIRECTUV = 0, this.CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE = !1, this.CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL = !1, this.CLEARCOAT_REMAP_F0 = !1, this.CLEARCOAT_TINT = !1, this.CLEARCOAT_TINT_TEXTURE = !1, this.CLEARCOAT_TINT_TEXTUREDIRECTUV = 0, this.CLEARCOAT_TINT_GAMMATEXTURE = !1;\n }\n}\nclass Si extends wr {\n /** @internal */\n _markAllSubMeshesAsTexturesDirty() {\n this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty();\n }\n constructor(e, t = !0) {\n super(e, \"PBRClearCoat\", 100, new bP(), t), this._isEnabled = !1, this.isEnabled = !1, this.intensity = 1, this.roughness = 0, this._indexOfRefraction = Si._DefaultIndexOfRefraction, this.indexOfRefraction = Si._DefaultIndexOfRefraction, this._texture = null, this.texture = null, this._useRoughnessFromMainTexture = !0, this.useRoughnessFromMainTexture = !0, this._textureRoughness = null, this.textureRoughness = null, this._remapF0OnInterfaceChange = !0, this.remapF0OnInterfaceChange = !0, this._bumpTexture = null, this.bumpTexture = null, this._isTintEnabled = !1, this.isTintEnabled = !1, this.tintColor = Ne.White(), this.tintColorAtDistance = 1, this.tintThickness = 1, this._tintTexture = null, this.tintTexture = null, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1];\n }\n isReadyForSubMesh(e, t, i) {\n if (!this._isEnabled)\n return !0;\n const r = this._material._disableBumpMap;\n return !(e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.ClearCoatTextureEnabled && !this._texture.isReadyOrNotBlocking() || this._textureRoughness && ae.ClearCoatTextureEnabled && !this._textureRoughness.isReadyOrNotBlocking() || i.getCaps().standardDerivatives && this._bumpTexture && ae.ClearCoatBumpTextureEnabled && !r && !this._bumpTexture.isReady() || this._isTintEnabled && this._tintTexture && ae.ClearCoatTintTextureEnabled && !this._tintTexture.isReadyOrNotBlocking()));\n }\n prepareDefinesBeforeAttributes(e, t) {\n var i;\n this._isEnabled ? (e.CLEARCOAT = !0, e.CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE = this._useRoughnessFromMainTexture, e.CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL = this._texture !== null && this._texture._texture === ((i = this._textureRoughness) == null ? void 0 : i._texture) && this._texture.checkTransformsAreIdentical(this._textureRoughness), e.CLEARCOAT_REMAP_F0 = this._remapF0OnInterfaceChange, e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.ClearCoatTextureEnabled ? wt(this._texture, e, \"CLEARCOAT_TEXTURE\") : e.CLEARCOAT_TEXTURE = !1, this._textureRoughness && ae.ClearCoatTextureEnabled ? wt(this._textureRoughness, e, \"CLEARCOAT_TEXTURE_ROUGHNESS\") : e.CLEARCOAT_TEXTURE_ROUGHNESS = !1, this._bumpTexture && ae.ClearCoatBumpTextureEnabled ? wt(this._bumpTexture, e, \"CLEARCOAT_BUMP\") : e.CLEARCOAT_BUMP = !1, e.CLEARCOAT_DEFAULTIOR = this._indexOfRefraction === Si._DefaultIndexOfRefraction, this._isTintEnabled ? (e.CLEARCOAT_TINT = !0, this._tintTexture && ae.ClearCoatTintTextureEnabled ? (wt(this._tintTexture, e, \"CLEARCOAT_TINT_TEXTURE\"), e.CLEARCOAT_TINT_GAMMATEXTURE = this._tintTexture.gammaSpace) : e.CLEARCOAT_TINT_TEXTURE = !1) : (e.CLEARCOAT_TINT = !1, e.CLEARCOAT_TINT_TEXTURE = !1))) : (e.CLEARCOAT = !1, e.CLEARCOAT_TEXTURE = !1, e.CLEARCOAT_TEXTURE_ROUGHNESS = !1, e.CLEARCOAT_BUMP = !1, e.CLEARCOAT_TINT = !1, e.CLEARCOAT_TINT_TEXTURE = !1, e.CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE = !1, e.CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL = !1, e.CLEARCOAT_DEFAULTIOR = !1, e.CLEARCOAT_TEXTUREDIRECTUV = 0, e.CLEARCOAT_TEXTURE_ROUGHNESSDIRECTUV = 0, e.CLEARCOAT_BUMPDIRECTUV = 0, e.CLEARCOAT_REMAP_F0 = !1, e.CLEARCOAT_TINT_TEXTUREDIRECTUV = 0, e.CLEARCOAT_TINT_GAMMATEXTURE = !1);\n }\n bindForSubMesh(e, t, i, r) {\n var u, f, d, p;\n if (!this._isEnabled)\n return;\n const s = r.materialDefines, a = this._material.isFrozen, o = this._material._disableBumpMap, l = this._material._invertNormalMapX, c = this._material._invertNormalMapY, h = s.CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL;\n if (!e.useUbo || !a || !e.isSync) {\n h && ae.ClearCoatTextureEnabled ? (e.updateFloat4(\"vClearCoatInfos\", this._texture.coordinatesIndex, this._texture.level, -1, -1), Mt(this._texture, e, \"clearCoat\")) : (this._texture || this._textureRoughness) && ae.ClearCoatTextureEnabled && (e.updateFloat4(\"vClearCoatInfos\", ((u = this._texture) == null ? void 0 : u.coordinatesIndex) ?? 0, ((f = this._texture) == null ? void 0 : f.level) ?? 0, ((d = this._textureRoughness) == null ? void 0 : d.coordinatesIndex) ?? 0, ((p = this._textureRoughness) == null ? void 0 : p.level) ?? 0), this._texture && Mt(this._texture, e, \"clearCoat\"), this._textureRoughness && !h && !s.CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE && Mt(this._textureRoughness, e, \"clearCoatRoughness\")), this._bumpTexture && i.getCaps().standardDerivatives && ae.ClearCoatTextureEnabled && !o && (e.updateFloat2(\"vClearCoatBumpInfos\", this._bumpTexture.coordinatesIndex, this._bumpTexture.level), Mt(this._bumpTexture, e, \"clearCoatBump\"), t._mirroredCameraPosition ? e.updateFloat2(\"vClearCoatTangentSpaceParams\", l ? 1 : -1, c ? 1 : -1) : e.updateFloat2(\"vClearCoatTangentSpaceParams\", l ? -1 : 1, c ? -1 : 1)), this._tintTexture && ae.ClearCoatTintTextureEnabled && (e.updateFloat2(\"vClearCoatTintInfos\", this._tintTexture.coordinatesIndex, this._tintTexture.level), Mt(this._tintTexture, e, \"clearCoatTint\")), e.updateFloat2(\"vClearCoatParams\", this.intensity, this.roughness);\n const g = 1 - this._indexOfRefraction, m = 1 + this._indexOfRefraction, v = Math.pow(-g / m, 2), E = 1 / this._indexOfRefraction;\n e.updateFloat4(\"vClearCoatRefractionParams\", v, E, g, m), this._isTintEnabled && (e.updateFloat4(\"vClearCoatTintParams\", this.tintColor.r, this.tintColor.g, this.tintColor.b, Math.max(1e-5, this.tintThickness)), e.updateFloat(\"clearCoatColorAtDistance\", Math.max(1e-5, this.tintColorAtDistance)));\n }\n t.texturesEnabled && (this._texture && ae.ClearCoatTextureEnabled && e.setTexture(\"clearCoatSampler\", this._texture), this._textureRoughness && !h && !s.CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE && ae.ClearCoatTextureEnabled && e.setTexture(\"clearCoatRoughnessSampler\", this._textureRoughness), this._bumpTexture && i.getCaps().standardDerivatives && ae.ClearCoatBumpTextureEnabled && !o && e.setTexture(\"clearCoatBumpSampler\", this._bumpTexture), this._isTintEnabled && this._tintTexture && ae.ClearCoatTintTextureEnabled && e.setTexture(\"clearCoatTintSampler\", this._tintTexture));\n }\n hasTexture(e) {\n return this._texture === e || this._textureRoughness === e || this._bumpTexture === e || this._tintTexture === e;\n }\n getActiveTextures(e) {\n this._texture && e.push(this._texture), this._textureRoughness && e.push(this._textureRoughness), this._bumpTexture && e.push(this._bumpTexture), this._tintTexture && e.push(this._tintTexture);\n }\n getAnimatables(e) {\n this._texture && this._texture.animations && this._texture.animations.length > 0 && e.push(this._texture), this._textureRoughness && this._textureRoughness.animations && this._textureRoughness.animations.length > 0 && e.push(this._textureRoughness), this._bumpTexture && this._bumpTexture.animations && this._bumpTexture.animations.length > 0 && e.push(this._bumpTexture), this._tintTexture && this._tintTexture.animations && this._tintTexture.animations.length > 0 && e.push(this._tintTexture);\n }\n dispose(e) {\n var t, i, r, s;\n e && ((t = this._texture) == null || t.dispose(), (i = this._textureRoughness) == null || i.dispose(), (r = this._bumpTexture) == null || r.dispose(), (s = this._tintTexture) == null || s.dispose());\n }\n getClassName() {\n return \"PBRClearCoatConfiguration\";\n }\n addFallbacks(e, t, i) {\n return e.CLEARCOAT_BUMP && t.addFallback(i++, \"CLEARCOAT_BUMP\"), e.CLEARCOAT_TINT && t.addFallback(i++, \"CLEARCOAT_TINT\"), e.CLEARCOAT && t.addFallback(i++, \"CLEARCOAT\"), i;\n }\n getSamplers(e) {\n e.push(\"clearCoatSampler\", \"clearCoatRoughnessSampler\", \"clearCoatBumpSampler\", \"clearCoatTintSampler\");\n }\n getUniforms() {\n return {\n ubo: [\n { name: \"vClearCoatParams\", size: 2, type: \"vec2\" },\n { name: \"vClearCoatRefractionParams\", size: 4, type: \"vec4\" },\n { name: \"vClearCoatInfos\", size: 4, type: \"vec4\" },\n { name: \"clearCoatMatrix\", size: 16, type: \"mat4\" },\n { name: \"clearCoatRoughnessMatrix\", size: 16, type: \"mat4\" },\n { name: \"vClearCoatBumpInfos\", size: 2, type: \"vec2\" },\n { name: \"vClearCoatTangentSpaceParams\", size: 2, type: \"vec2\" },\n { name: \"clearCoatBumpMatrix\", size: 16, type: \"mat4\" },\n { name: \"vClearCoatTintParams\", size: 4, type: \"vec4\" },\n { name: \"clearCoatColorAtDistance\", size: 1, type: \"float\" },\n { name: \"vClearCoatTintInfos\", size: 2, type: \"vec2\" },\n { name: \"clearCoatTintMatrix\", size: 16, type: \"mat4\" }\n ]\n };\n }\n}\nSi._DefaultIndexOfRefraction = 1.5;\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"isEnabled\", void 0);\nP([\n U()\n], Si.prototype, \"intensity\", void 0);\nP([\n U()\n], Si.prototype, \"roughness\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"indexOfRefraction\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"texture\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"useRoughnessFromMainTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"textureRoughness\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"remapF0OnInterfaceChange\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"bumpTexture\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"isTintEnabled\", void 0);\nP([\n $i()\n], Si.prototype, \"tintColor\", void 0);\nP([\n U()\n], Si.prototype, \"tintColorAtDistance\", void 0);\nP([\n U()\n], Si.prototype, \"tintThickness\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"tintTexture\", void 0);\nclass AP extends es {\n constructor() {\n super(...arguments), this.IRIDESCENCE = !1, this.IRIDESCENCE_TEXTURE = !1, this.IRIDESCENCE_TEXTUREDIRECTUV = 0, this.IRIDESCENCE_THICKNESS_TEXTURE = !1, this.IRIDESCENCE_THICKNESS_TEXTUREDIRECTUV = 0, this.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE = !1;\n }\n}\nclass or extends wr {\n /** @internal */\n _markAllSubMeshesAsTexturesDirty() {\n this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty();\n }\n constructor(e, t = !0) {\n super(e, \"PBRIridescence\", 110, new AP(), t), this._isEnabled = !1, this.isEnabled = !1, this.intensity = 1, this.minimumThickness = or._DefaultMinimumThickness, this.maximumThickness = or._DefaultMaximumThickness, this.indexOfRefraction = or._DefaultIndexOfRefraction, this._texture = null, this.texture = null, this._thicknessTexture = null, this.thicknessTexture = null, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1];\n }\n isReadyForSubMesh(e, t) {\n return this._isEnabled ? !(e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.IridescenceTextureEnabled && !this._texture.isReadyOrNotBlocking() || this._thicknessTexture && ae.IridescenceTextureEnabled && !this._thicknessTexture.isReadyOrNotBlocking())) : !0;\n }\n prepareDefinesBeforeAttributes(e, t) {\n var i;\n this._isEnabled ? (e.IRIDESCENCE = !0, e.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE = this._texture !== null && this._texture._texture === ((i = this._thicknessTexture) == null ? void 0 : i._texture) && this._texture.checkTransformsAreIdentical(this._thicknessTexture), e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.IridescenceTextureEnabled ? wt(this._texture, e, \"IRIDESCENCE_TEXTURE\") : e.IRIDESCENCE_TEXTURE = !1, !e.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE && this._thicknessTexture && ae.IridescenceTextureEnabled ? wt(this._thicknessTexture, e, \"IRIDESCENCE_THICKNESS_TEXTURE\") : e.IRIDESCENCE_THICKNESS_TEXTURE = !1)) : (e.IRIDESCENCE = !1, e.IRIDESCENCE_TEXTURE = !1, e.IRIDESCENCE_THICKNESS_TEXTURE = !1, e.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE = !1, e.IRIDESCENCE_TEXTUREDIRECTUV = 0, e.IRIDESCENCE_THICKNESS_TEXTUREDIRECTUV = 0);\n }\n bindForSubMesh(e, t, i, r) {\n var l, c, h, u;\n if (!this._isEnabled)\n return;\n const s = r.materialDefines, a = this._material.isFrozen, o = s.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE;\n (!e.useUbo || !a || !e.isSync) && (o && ae.IridescenceTextureEnabled ? (e.updateFloat4(\"vIridescenceInfos\", this._texture.coordinatesIndex, this._texture.level, -1, -1), Mt(this._texture, e, \"iridescence\")) : (this._texture || this._thicknessTexture) && ae.IridescenceTextureEnabled && (e.updateFloat4(\"vIridescenceInfos\", ((l = this._texture) == null ? void 0 : l.coordinatesIndex) ?? 0, ((c = this._texture) == null ? void 0 : c.level) ?? 0, ((h = this._thicknessTexture) == null ? void 0 : h.coordinatesIndex) ?? 0, ((u = this._thicknessTexture) == null ? void 0 : u.level) ?? 0), this._texture && Mt(this._texture, e, \"iridescence\"), this._thicknessTexture && !o && !s.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE && Mt(this._thicknessTexture, e, \"iridescenceThickness\")), e.updateFloat4(\"vIridescenceParams\", this.intensity, this.indexOfRefraction, this.minimumThickness, this.maximumThickness)), t.texturesEnabled && (this._texture && ae.IridescenceTextureEnabled && e.setTexture(\"iridescenceSampler\", this._texture), this._thicknessTexture && !o && !s.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE && ae.IridescenceTextureEnabled && e.setTexture(\"iridescenceThicknessSampler\", this._thicknessTexture));\n }\n hasTexture(e) {\n return this._texture === e || this._thicknessTexture === e;\n }\n getActiveTextures(e) {\n this._texture && e.push(this._texture), this._thicknessTexture && e.push(this._thicknessTexture);\n }\n getAnimatables(e) {\n this._texture && this._texture.animations && this._texture.animations.length > 0 && e.push(this._texture), this._thicknessTexture && this._thicknessTexture.animations && this._thicknessTexture.animations.length > 0 && e.push(this._thicknessTexture);\n }\n dispose(e) {\n var t, i;\n e && ((t = this._texture) == null || t.dispose(), (i = this._thicknessTexture) == null || i.dispose());\n }\n getClassName() {\n return \"PBRIridescenceConfiguration\";\n }\n addFallbacks(e, t, i) {\n return e.IRIDESCENCE && t.addFallback(i++, \"IRIDESCENCE\"), i;\n }\n getSamplers(e) {\n e.push(\"iridescenceSampler\", \"iridescenceThicknessSampler\");\n }\n getUniforms() {\n return {\n ubo: [\n { name: \"vIridescenceParams\", size: 4, type: \"vec4\" },\n { name: \"vIridescenceInfos\", size: 4, type: \"vec4\" },\n { name: \"iridescenceMatrix\", size: 16, type: \"mat4\" },\n { name: \"iridescenceThicknessMatrix\", size: 16, type: \"mat4\" }\n ]\n };\n }\n}\nor._DefaultMinimumThickness = 100;\nor._DefaultMaximumThickness = 400;\nor._DefaultIndexOfRefraction = 1.3;\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], or.prototype, \"isEnabled\", void 0);\nP([\n U()\n], or.prototype, \"intensity\", void 0);\nP([\n U()\n], or.prototype, \"minimumThickness\", void 0);\nP([\n U()\n], or.prototype, \"maximumThickness\", void 0);\nP([\n U()\n], or.prototype, \"indexOfRefraction\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], or.prototype, \"texture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], or.prototype, \"thicknessTexture\", void 0);\nclass MP extends es {\n constructor() {\n super(...arguments), this.ANISOTROPIC = !1, this.ANISOTROPIC_TEXTURE = !1, this.ANISOTROPIC_TEXTUREDIRECTUV = 0, this.ANISOTROPIC_LEGACY = !1, this.MAINUV1 = !1;\n }\n}\nclass Wa extends wr {\n /**\n * Sets the anisotropy direction as an angle.\n */\n set angle(e) {\n this.direction.x = Math.cos(e), this.direction.y = Math.sin(e);\n }\n /**\n * Gets the anisotropy angle value in radians.\n * @returns the anisotropy angle value in radians.\n */\n get angle() {\n return Math.atan2(this.direction.y, this.direction.x);\n }\n /** @internal */\n _markAllSubMeshesAsTexturesDirty() {\n this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty();\n }\n /** @internal */\n _markAllSubMeshesAsMiscDirty() {\n this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsMiscDirty();\n }\n constructor(e, t = !0) {\n super(e, \"PBRAnisotropic\", 110, new MP(), t), this._isEnabled = !1, this.isEnabled = !1, this.intensity = 1, this.direction = new me(1, 0), this._texture = null, this.texture = null, this._legacy = !1, this.legacy = !1, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1], this._internalMarkAllSubMeshesAsMiscDirty = e._dirtyCallbacks[16];\n }\n isReadyForSubMesh(e, t) {\n return this._isEnabled ? !(e._areTexturesDirty && t.texturesEnabled && this._texture && ae.AnisotropicTextureEnabled && !this._texture.isReadyOrNotBlocking()) : !0;\n }\n prepareDefinesBeforeAttributes(e, t, i) {\n this._isEnabled ? (e.ANISOTROPIC = this._isEnabled, this._isEnabled && !i.isVerticesDataPresent(I.TangentKind) && (e._needUVs = !0, e.MAINUV1 = !0), e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.AnisotropicTextureEnabled ? wt(this._texture, e, \"ANISOTROPIC_TEXTURE\") : e.ANISOTROPIC_TEXTURE = !1), e._areMiscDirty && (e.ANISOTROPIC_LEGACY = this._legacy)) : (e.ANISOTROPIC = !1, e.ANISOTROPIC_TEXTURE = !1, e.ANISOTROPIC_TEXTUREDIRECTUV = 0, e.ANISOTROPIC_LEGACY = !1);\n }\n bindForSubMesh(e, t) {\n if (!this._isEnabled)\n return;\n const i = this._material.isFrozen;\n (!e.useUbo || !i || !e.isSync) && (this._texture && ae.AnisotropicTextureEnabled && (e.updateFloat2(\"vAnisotropyInfos\", this._texture.coordinatesIndex, this._texture.level), Mt(this._texture, e, \"anisotropy\")), e.updateFloat3(\"vAnisotropy\", this.direction.x, this.direction.y, this.intensity)), t.texturesEnabled && this._texture && ae.AnisotropicTextureEnabled && e.setTexture(\"anisotropySampler\", this._texture);\n }\n hasTexture(e) {\n return this._texture === e;\n }\n getActiveTextures(e) {\n this._texture && e.push(this._texture);\n }\n getAnimatables(e) {\n this._texture && this._texture.animations && this._texture.animations.length > 0 && e.push(this._texture);\n }\n dispose(e) {\n e && this._texture && this._texture.dispose();\n }\n getClassName() {\n return \"PBRAnisotropicConfiguration\";\n }\n addFallbacks(e, t, i) {\n return e.ANISOTROPIC && t.addFallback(i++, \"ANISOTROPIC\"), i;\n }\n getSamplers(e) {\n e.push(\"anisotropySampler\");\n }\n getUniforms() {\n return {\n ubo: [\n { name: \"vAnisotropy\", size: 3, type: \"vec3\" },\n { name: \"vAnisotropyInfos\", size: 2, type: \"vec2\" },\n { name: \"anisotropyMatrix\", size: 16, type: \"mat4\" }\n ]\n };\n }\n /**\n * Parses a anisotropy Configuration from a serialized object.\n * @param source - Serialized object.\n * @param scene Defines the scene we are parsing for\n * @param rootUrl Defines the rootUrl to load from\n */\n parse(e, t, i) {\n super.parse(e, t, i), e.legacy === void 0 && (this.legacy = !0);\n }\n}\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Wa.prototype, \"isEnabled\", void 0);\nP([\n U()\n], Wa.prototype, \"intensity\", void 0);\nP([\n X_()\n], Wa.prototype, \"direction\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Wa.prototype, \"texture\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Wa.prototype, \"legacy\", void 0);\nclass PP extends es {\n constructor() {\n super(...arguments), this.SHEEN = !1, this.SHEEN_TEXTURE = !1, this.SHEEN_GAMMATEXTURE = !1, this.SHEEN_TEXTURE_ROUGHNESS = !1, this.SHEEN_TEXTUREDIRECTUV = 0, this.SHEEN_TEXTURE_ROUGHNESSDIRECTUV = 0, this.SHEEN_LINKWITHALBEDO = !1, this.SHEEN_ROUGHNESS = !1, this.SHEEN_ALBEDOSCALING = !1, this.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE = !1, this.SHEEN_TEXTURE_ROUGHNESS_IDENTICAL = !1;\n }\n}\nclass _s extends wr {\n /** @internal */\n _markAllSubMeshesAsTexturesDirty() {\n this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty();\n }\n constructor(e, t = !0) {\n super(e, \"Sheen\", 120, new PP(), t), this._isEnabled = !1, this.isEnabled = !1, this._linkSheenWithAlbedo = !1, this.linkSheenWithAlbedo = !1, this.intensity = 1, this.color = Ne.White(), this._texture = null, this.texture = null, this._useRoughnessFromMainTexture = !0, this.useRoughnessFromMainTexture = !0, this._roughness = null, this.roughness = null, this._textureRoughness = null, this.textureRoughness = null, this._albedoScaling = !1, this.albedoScaling = !1, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1];\n }\n isReadyForSubMesh(e, t) {\n return this._isEnabled ? !(e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.SheenTextureEnabled && !this._texture.isReadyOrNotBlocking() || this._textureRoughness && ae.SheenTextureEnabled && !this._textureRoughness.isReadyOrNotBlocking())) : !0;\n }\n prepareDefinesBeforeAttributes(e, t) {\n var i;\n this._isEnabled ? (e.SHEEN = !0, e.SHEEN_LINKWITHALBEDO = this._linkSheenWithAlbedo, e.SHEEN_ROUGHNESS = this._roughness !== null, e.SHEEN_ALBEDOSCALING = this._albedoScaling, e.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE = this._useRoughnessFromMainTexture, e.SHEEN_TEXTURE_ROUGHNESS_IDENTICAL = this._texture !== null && this._texture._texture === ((i = this._textureRoughness) == null ? void 0 : i._texture) && this._texture.checkTransformsAreIdentical(this._textureRoughness), e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.SheenTextureEnabled ? (wt(this._texture, e, \"SHEEN_TEXTURE\"), e.SHEEN_GAMMATEXTURE = this._texture.gammaSpace) : e.SHEEN_TEXTURE = !1, this._textureRoughness && ae.SheenTextureEnabled ? wt(this._textureRoughness, e, \"SHEEN_TEXTURE_ROUGHNESS\") : e.SHEEN_TEXTURE_ROUGHNESS = !1)) : (e.SHEEN = !1, e.SHEEN_TEXTURE = !1, e.SHEEN_TEXTURE_ROUGHNESS = !1, e.SHEEN_LINKWITHALBEDO = !1, e.SHEEN_ROUGHNESS = !1, e.SHEEN_ALBEDOSCALING = !1, e.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE = !1, e.SHEEN_TEXTURE_ROUGHNESS_IDENTICAL = !1, e.SHEEN_GAMMATEXTURE = !1, e.SHEEN_TEXTUREDIRECTUV = 0, e.SHEEN_TEXTURE_ROUGHNESSDIRECTUV = 0);\n }\n bindForSubMesh(e, t, i, r) {\n var l, c, h, u;\n if (!this._isEnabled)\n return;\n const s = r.materialDefines, a = this._material.isFrozen, o = s.SHEEN_TEXTURE_ROUGHNESS_IDENTICAL;\n (!e.useUbo || !a || !e.isSync) && (o && ae.SheenTextureEnabled ? (e.updateFloat4(\"vSheenInfos\", this._texture.coordinatesIndex, this._texture.level, -1, -1), Mt(this._texture, e, \"sheen\")) : (this._texture || this._textureRoughness) && ae.SheenTextureEnabled && (e.updateFloat4(\"vSheenInfos\", ((l = this._texture) == null ? void 0 : l.coordinatesIndex) ?? 0, ((c = this._texture) == null ? void 0 : c.level) ?? 0, ((h = this._textureRoughness) == null ? void 0 : h.coordinatesIndex) ?? 0, ((u = this._textureRoughness) == null ? void 0 : u.level) ?? 0), this._texture && Mt(this._texture, e, \"sheen\"), this._textureRoughness && !o && !s.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE && Mt(this._textureRoughness, e, \"sheenRoughness\")), e.updateFloat4(\"vSheenColor\", this.color.r, this.color.g, this.color.b, this.intensity), this._roughness !== null && e.updateFloat(\"vSheenRoughness\", this._roughness)), t.texturesEnabled && (this._texture && ae.SheenTextureEnabled && e.setTexture(\"sheenSampler\", this._texture), this._textureRoughness && !o && !s.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE && ae.SheenTextureEnabled && e.setTexture(\"sheenRoughnessSampler\", this._textureRoughness));\n }\n hasTexture(e) {\n return this._texture === e || this._textureRoughness === e;\n }\n getActiveTextures(e) {\n this._texture && e.push(this._texture), this._textureRoughness && e.push(this._textureRoughness);\n }\n getAnimatables(e) {\n this._texture && this._texture.animations && this._texture.animations.length > 0 && e.push(this._texture), this._textureRoughness && this._textureRoughness.animations && this._textureRoughness.animations.length > 0 && e.push(this._textureRoughness);\n }\n dispose(e) {\n var t, i;\n e && ((t = this._texture) == null || t.dispose(), (i = this._textureRoughness) == null || i.dispose());\n }\n getClassName() {\n return \"PBRSheenConfiguration\";\n }\n addFallbacks(e, t, i) {\n return e.SHEEN && t.addFallback(i++, \"SHEEN\"), i;\n }\n getSamplers(e) {\n e.push(\"sheenSampler\", \"sheenRoughnessSampler\");\n }\n getUniforms() {\n return {\n ubo: [\n { name: \"vSheenColor\", size: 4, type: \"vec4\" },\n { name: \"vSheenRoughness\", size: 1, type: \"float\" },\n { name: \"vSheenInfos\", size: 4, type: \"vec4\" },\n { name: \"sheenMatrix\", size: 16, type: \"mat4\" },\n { name: \"sheenRoughnessMatrix\", size: 16, type: \"mat4\" }\n ]\n };\n }\n}\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"isEnabled\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"linkSheenWithAlbedo\", void 0);\nP([\n U()\n], _s.prototype, \"intensity\", void 0);\nP([\n $i()\n], _s.prototype, \"color\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"texture\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"useRoughnessFromMainTexture\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"roughness\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"textureRoughness\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"albedoScaling\", void 0);\nclass OP extends es {\n constructor() {\n super(...arguments), this.SUBSURFACE = !1, this.SS_REFRACTION = !1, this.SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE = !1, this.SS_TRANSLUCENCY = !1, this.SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE = !1, this.SS_SCATTERING = !1, this.SS_DISPERSION = !1, this.SS_THICKNESSANDMASK_TEXTURE = !1, this.SS_THICKNESSANDMASK_TEXTUREDIRECTUV = 0, this.SS_HAS_THICKNESS = !1, this.SS_REFRACTIONINTENSITY_TEXTURE = !1, this.SS_REFRACTIONINTENSITY_TEXTUREDIRECTUV = 0, this.SS_TRANSLUCENCYINTENSITY_TEXTURE = !1, this.SS_TRANSLUCENCYINTENSITY_TEXTUREDIRECTUV = 0, this.SS_REFRACTIONMAP_3D = !1, this.SS_REFRACTIONMAP_OPPOSITEZ = !1, this.SS_LODINREFRACTIONALPHA = !1, this.SS_GAMMAREFRACTION = !1, this.SS_RGBDREFRACTION = !1, this.SS_LINEARSPECULARREFRACTION = !1, this.SS_LINKREFRACTIONTOTRANSPARENCY = !1, this.SS_ALBEDOFORREFRACTIONTINT = !1, this.SS_ALBEDOFORTRANSLUCENCYTINT = !1, this.SS_USE_LOCAL_REFRACTIONMAP_CUBIC = !1, this.SS_USE_THICKNESS_AS_DEPTH = !1, this.SS_MASK_FROM_THICKNESS_TEXTURE = !1, this.SS_USE_GLTF_TEXTURES = !1;\n }\n}\nclass qt extends wr {\n /**\n * Diffusion profile for subsurface scattering.\n * Useful for better scattering in the skins or foliages.\n */\n get scatteringDiffusionProfile() {\n return this._scene.subSurfaceConfiguration ? this._scene.subSurfaceConfiguration.ssDiffusionProfileColors[this._scatteringDiffusionProfileIndex] : null;\n }\n set scatteringDiffusionProfile(e) {\n this._scene.enableSubSurfaceForPrePass() && e && (this._scatteringDiffusionProfileIndex = this._scene.subSurfaceConfiguration.addDiffusionProfile(e));\n }\n /**\n * Index of refraction of the material's volume.\n * https://en.wikipedia.org/wiki/List_of_refractive_indices\n *\n * This ONLY impacts refraction. If not provided or given a non-valid value,\n * the volume will use the same IOR as the surface.\n */\n get volumeIndexOfRefraction() {\n return this._volumeIndexOfRefraction >= 1 ? this._volumeIndexOfRefraction : this._indexOfRefraction;\n }\n set volumeIndexOfRefraction(e) {\n e >= 1 ? this._volumeIndexOfRefraction = e : this._volumeIndexOfRefraction = -1;\n }\n /** @internal */\n _markAllSubMeshesAsTexturesDirty() {\n this._enable(this._isRefractionEnabled || this._isTranslucencyEnabled || this._isScatteringEnabled), this._internalMarkAllSubMeshesAsTexturesDirty();\n }\n /** @internal */\n _markScenePrePassDirty() {\n this._internalMarkAllSubMeshesAsTexturesDirty(), this._internalMarkScenePrePassDirty();\n }\n constructor(e, t = !0) {\n super(e, \"PBRSubSurface\", 130, new OP(), t), this._isRefractionEnabled = !1, this.isRefractionEnabled = !1, this._isTranslucencyEnabled = !1, this.isTranslucencyEnabled = !1, this._isDispersionEnabled = !1, this.isDispersionEnabled = !1, this._isScatteringEnabled = !1, this.isScatteringEnabled = !1, this._scatteringDiffusionProfileIndex = 0, this.refractionIntensity = 1, this.translucencyIntensity = 1, this.useAlbedoToTintRefraction = !1, this.useAlbedoToTintTranslucency = !1, this._thicknessTexture = null, this.thicknessTexture = null, this._refractionTexture = null, this.refractionTexture = null, this._indexOfRefraction = 1.5, this.indexOfRefraction = 1.5, this._volumeIndexOfRefraction = -1, this._invertRefractionY = !1, this.invertRefractionY = !1, this._linkRefractionWithTransparency = !1, this.linkRefractionWithTransparency = !1, this.minimumThickness = 0, this.maximumThickness = 1, this.useThicknessAsDepth = !1, this.tintColor = Ne.White(), this.tintColorAtDistance = 1, this.dispersion = 0, this.diffusionDistance = Ne.White(), this._useMaskFromThicknessTexture = !1, this.useMaskFromThicknessTexture = !1, this._refractionIntensityTexture = null, this.refractionIntensityTexture = null, this._translucencyIntensityTexture = null, this.translucencyIntensityTexture = null, this._useGltfStyleTextures = !1, this.useGltfStyleTextures = !1, this._scene = e.getScene(), this.registerForExtraEvents = !0, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1], this._internalMarkScenePrePassDirty = e._dirtyCallbacks[32];\n }\n isReadyForSubMesh(e, t) {\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled)\n return !0;\n if (e._areTexturesDirty && t.texturesEnabled) {\n if (this._thicknessTexture && ae.ThicknessTextureEnabled && !this._thicknessTexture.isReadyOrNotBlocking())\n return !1;\n const i = this._getRefractionTexture(t);\n if (i && ae.RefractionTextureEnabled && !i.isReadyOrNotBlocking())\n return !1;\n }\n return !0;\n }\n prepareDefinesBeforeAttributes(e, t) {\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled) {\n e.SUBSURFACE = !1, e.SS_DISPERSION = !1, e.SS_TRANSLUCENCY = !1, e.SS_SCATTERING = !1, e.SS_REFRACTION = !1, e.SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE = !1, e.SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE = !1, e.SS_THICKNESSANDMASK_TEXTURE = !1, e.SS_THICKNESSANDMASK_TEXTUREDIRECTUV = 0, e.SS_HAS_THICKNESS = !1, e.SS_REFRACTIONINTENSITY_TEXTURE = !1, e.SS_REFRACTIONINTENSITY_TEXTUREDIRECTUV = 0, e.SS_TRANSLUCENCYINTENSITY_TEXTURE = !1, e.SS_TRANSLUCENCYINTENSITY_TEXTUREDIRECTUV = 0, e.SS_REFRACTIONMAP_3D = !1, e.SS_REFRACTIONMAP_OPPOSITEZ = !1, e.SS_LODINREFRACTIONALPHA = !1, e.SS_GAMMAREFRACTION = !1, e.SS_RGBDREFRACTION = !1, e.SS_LINEARSPECULARREFRACTION = !1, e.SS_LINKREFRACTIONTOTRANSPARENCY = !1, e.SS_ALBEDOFORREFRACTIONTINT = !1, e.SS_ALBEDOFORTRANSLUCENCYTINT = !1, e.SS_USE_LOCAL_REFRACTIONMAP_CUBIC = !1, e.SS_USE_THICKNESS_AS_DEPTH = !1, e.SS_MASK_FROM_THICKNESS_TEXTURE = !1, e.SS_USE_GLTF_TEXTURES = !1;\n return;\n }\n if (e._areTexturesDirty) {\n e.SUBSURFACE = !0, e.SS_DISPERSION = this._isDispersionEnabled, e.SS_TRANSLUCENCY = this._isTranslucencyEnabled, e.SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE = !1, e.SS_SCATTERING = this._isScatteringEnabled, e.SS_THICKNESSANDMASK_TEXTURE = !1, e.SS_REFRACTIONINTENSITY_TEXTURE = !1, e.SS_TRANSLUCENCYINTENSITY_TEXTURE = !1, e.SS_HAS_THICKNESS = !1, e.SS_MASK_FROM_THICKNESS_TEXTURE = !1, e.SS_USE_GLTF_TEXTURES = !1, e.SS_REFRACTION = !1, e.SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE = !1, e.SS_REFRACTIONMAP_3D = !1, e.SS_GAMMAREFRACTION = !1, e.SS_RGBDREFRACTION = !1, e.SS_LINEARSPECULARREFRACTION = !1, e.SS_REFRACTIONMAP_OPPOSITEZ = !1, e.SS_LODINREFRACTIONALPHA = !1, e.SS_LINKREFRACTIONTOTRANSPARENCY = !1, e.SS_ALBEDOFORREFRACTIONTINT = !1, e.SS_ALBEDOFORTRANSLUCENCYTINT = !1, e.SS_USE_LOCAL_REFRACTIONMAP_CUBIC = !1, e.SS_USE_THICKNESS_AS_DEPTH = !1;\n const i = !!this._thicknessTexture && !!this._refractionIntensityTexture && this._refractionIntensityTexture.checkTransformsAreIdentical(this._thicknessTexture) && this._refractionIntensityTexture._texture === this._thicknessTexture._texture, r = !!this._thicknessTexture && !!this._translucencyIntensityTexture && this._translucencyIntensityTexture.checkTransformsAreIdentical(this._thicknessTexture) && this._translucencyIntensityTexture._texture === this._thicknessTexture._texture, s = (i || !this._refractionIntensityTexture) && (r || !this._translucencyIntensityTexture);\n if (e._areTexturesDirty && t.texturesEnabled && (this._thicknessTexture && ae.ThicknessTextureEnabled && wt(this._thicknessTexture, e, \"SS_THICKNESSANDMASK_TEXTURE\"), this._refractionIntensityTexture && ae.RefractionIntensityTextureEnabled && !s && wt(this._refractionIntensityTexture, e, \"SS_REFRACTIONINTENSITY_TEXTURE\"), this._translucencyIntensityTexture && ae.TranslucencyIntensityTextureEnabled && !s && wt(this._translucencyIntensityTexture, e, \"SS_TRANSLUCENCYINTENSITY_TEXTURE\")), e.SS_HAS_THICKNESS = this.maximumThickness - this.minimumThickness !== 0, e.SS_MASK_FROM_THICKNESS_TEXTURE = (this._useMaskFromThicknessTexture || !!this._refractionIntensityTexture || !!this._translucencyIntensityTexture) && s, e.SS_USE_GLTF_TEXTURES = this._useGltfStyleTextures, e.SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE = (this._useMaskFromThicknessTexture || !!this._refractionIntensityTexture) && s, e.SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE = (this._useMaskFromThicknessTexture || !!this._translucencyIntensityTexture) && s, this._isRefractionEnabled && t.texturesEnabled) {\n const a = this._getRefractionTexture(t);\n a && ae.RefractionTextureEnabled && (e.SS_REFRACTION = !0, e.SS_REFRACTIONMAP_3D = a.isCube, e.SS_GAMMAREFRACTION = a.gammaSpace, e.SS_RGBDREFRACTION = a.isRGBD, e.SS_LINEARSPECULARREFRACTION = a.linearSpecularLOD, e.SS_REFRACTIONMAP_OPPOSITEZ = this._scene.useRightHandedSystem && a.isCube ? !a.invertZ : a.invertZ, e.SS_LODINREFRACTIONALPHA = a.lodLevelInAlpha, e.SS_LINKREFRACTIONTOTRANSPARENCY = this._linkRefractionWithTransparency, e.SS_ALBEDOFORREFRACTIONTINT = this.useAlbedoToTintRefraction, e.SS_USE_LOCAL_REFRACTIONMAP_CUBIC = a.isCube && a.boundingBoxSize, e.SS_USE_THICKNESS_AS_DEPTH = this.useThicknessAsDepth);\n }\n this._isTranslucencyEnabled && (e.SS_ALBEDOFORTRANSLUCENCYTINT = this.useAlbedoToTintTranslucency);\n }\n }\n /**\n * Binds the material data (this function is called even if mustRebind() returns false)\n * @param uniformBuffer defines the Uniform buffer to fill in.\n * @param scene defines the scene the material belongs to.\n * @param engine defines the engine the material belongs to.\n * @param subMesh the submesh to bind data for\n */\n hardBindForSubMesh(e, t, i, r) {\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled)\n return;\n r.getRenderingMesh().getWorldMatrix().decompose(z.Vector3[0]);\n const s = Math.max(Math.abs(z.Vector3[0].x), Math.abs(z.Vector3[0].y), Math.abs(z.Vector3[0].z));\n e.updateFloat2(\"vThicknessParam\", this.minimumThickness * s, (this.maximumThickness - this.minimumThickness) * s);\n }\n bindForSubMesh(e, t, i, r) {\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled)\n return;\n const s = r.materialDefines, a = this._material.isFrozen, o = this._material.realTimeFiltering, l = s.LODBASEDMICROSFURACE, c = this._getRefractionTexture(t);\n if (!e.useUbo || !a || !e.isSync) {\n if (this._thicknessTexture && ae.ThicknessTextureEnabled && (e.updateFloat2(\"vThicknessInfos\", this._thicknessTexture.coordinatesIndex, this._thicknessTexture.level), Mt(this._thicknessTexture, e, \"thickness\")), this._refractionIntensityTexture && ae.RefractionIntensityTextureEnabled && s.SS_REFRACTIONINTENSITY_TEXTURE && (e.updateFloat2(\"vRefractionIntensityInfos\", this._refractionIntensityTexture.coordinatesIndex, this._refractionIntensityTexture.level), Mt(this._refractionIntensityTexture, e, \"refractionIntensity\")), this._translucencyIntensityTexture && ae.TranslucencyIntensityTextureEnabled && s.SS_TRANSLUCENCYINTENSITY_TEXTURE && (e.updateFloat2(\"vTranslucencyIntensityInfos\", this._translucencyIntensityTexture.coordinatesIndex, this._translucencyIntensityTexture.level), Mt(this._translucencyIntensityTexture, e, \"translucencyIntensity\")), c && ae.RefractionTextureEnabled) {\n e.updateMatrix(\"refractionMatrix\", c.getRefractionTextureMatrix());\n let h = 1;\n c.isCube || c.depth && (h = c.depth);\n const u = c.getSize().width, f = this.volumeIndexOfRefraction;\n if (e.updateFloat4(\"vRefractionInfos\", c.level, 1 / f, h, this._invertRefractionY ? -1 : 1), e.updateFloat4(\"vRefractionMicrosurfaceInfos\", u, c.lodGenerationScale, c.lodGenerationOffset, 1 / this.indexOfRefraction), o && e.updateFloat2(\"vRefractionFilteringInfo\", u, je.Log2(u)), c.boundingBoxSize) {\n const d = c;\n e.updateVector3(\"vRefractionPosition\", d.boundingBoxPosition), e.updateVector3(\"vRefractionSize\", d.boundingBoxSize);\n }\n }\n this._isScatteringEnabled && e.updateFloat(\"scatteringDiffusionProfile\", this._scatteringDiffusionProfileIndex), e.updateColor3(\"vDiffusionDistance\", this.diffusionDistance), e.updateFloat4(\"vTintColor\", this.tintColor.r, this.tintColor.g, this.tintColor.b, Math.max(1e-5, this.tintColorAtDistance)), e.updateFloat3(\"vSubSurfaceIntensity\", this.refractionIntensity, this.translucencyIntensity, 0), e.updateFloat(\"dispersion\", this.dispersion);\n }\n t.texturesEnabled && (this._thicknessTexture && ae.ThicknessTextureEnabled && e.setTexture(\"thicknessSampler\", this._thicknessTexture), this._refractionIntensityTexture && ae.RefractionIntensityTextureEnabled && s.SS_REFRACTIONINTENSITY_TEXTURE && e.setTexture(\"refractionIntensitySampler\", this._refractionIntensityTexture), this._translucencyIntensityTexture && ae.TranslucencyIntensityTextureEnabled && s.SS_TRANSLUCENCYINTENSITY_TEXTURE && e.setTexture(\"translucencyIntensitySampler\", this._translucencyIntensityTexture), c && ae.RefractionTextureEnabled && (l ? e.setTexture(\"refractionSampler\", c) : (e.setTexture(\"refractionSampler\", c._lodTextureMid || c), e.setTexture(\"refractionSamplerLow\", c._lodTextureLow || c), e.setTexture(\"refractionSamplerHigh\", c._lodTextureHigh || c))));\n }\n /**\n * Returns the texture used for refraction or null if none is used.\n * @param scene defines the scene the material belongs to.\n * @returns - Refraction texture if present. If no refraction texture and refraction\n * is linked with transparency, returns environment texture. Otherwise, returns null.\n */\n _getRefractionTexture(e) {\n return this._refractionTexture ? this._refractionTexture : this._isRefractionEnabled ? e.environmentTexture : null;\n }\n /**\n * Returns true if alpha blending should be disabled.\n */\n get disableAlphaBlending() {\n return this._isRefractionEnabled && this._linkRefractionWithTransparency;\n }\n /**\n * Fills the list of render target textures.\n * @param renderTargets the list of render targets to update\n */\n fillRenderTargetTextures(e) {\n ae.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget && e.push(this._refractionTexture);\n }\n hasTexture(e) {\n return this._thicknessTexture === e || this._refractionTexture === e || this._refractionIntensityTexture === e || this._translucencyIntensityTexture === e;\n }\n hasRenderTargetTextures() {\n return !!(ae.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget);\n }\n getActiveTextures(e) {\n this._thicknessTexture && e.push(this._thicknessTexture), this._refractionTexture && e.push(this._refractionTexture);\n }\n getAnimatables(e) {\n this._thicknessTexture && this._thicknessTexture.animations && this._thicknessTexture.animations.length > 0 && e.push(this._thicknessTexture), this._refractionTexture && this._refractionTexture.animations && this._refractionTexture.animations.length > 0 && e.push(this._refractionTexture);\n }\n dispose(e) {\n e && (this._thicknessTexture && this._thicknessTexture.dispose(), this._refractionTexture && this._refractionTexture.dispose());\n }\n getClassName() {\n return \"PBRSubSurfaceConfiguration\";\n }\n addFallbacks(e, t, i) {\n return e.SS_SCATTERING && t.addFallback(i++, \"SS_SCATTERING\"), e.SS_TRANSLUCENCY && t.addFallback(i++, \"SS_TRANSLUCENCY\"), i;\n }\n getSamplers(e) {\n e.push(\"thicknessSampler\", \"refractionIntensitySampler\", \"translucencyIntensitySampler\", \"refractionSampler\", \"refractionSamplerLow\", \"refractionSamplerHigh\");\n }\n getUniforms() {\n return {\n ubo: [\n { name: \"vRefractionMicrosurfaceInfos\", size: 4, type: \"vec4\" },\n { name: \"vRefractionFilteringInfo\", size: 2, type: \"vec2\" },\n { name: \"vTranslucencyIntensityInfos\", size: 2, type: \"vec2\" },\n { name: \"vRefractionInfos\", size: 4, type: \"vec4\" },\n { name: \"refractionMatrix\", size: 16, type: \"mat4\" },\n { name: \"vThicknessInfos\", size: 2, type: \"vec2\" },\n { name: \"vRefractionIntensityInfos\", size: 2, type: \"vec2\" },\n { name: \"thicknessMatrix\", size: 16, type: \"mat4\" },\n { name: \"refractionIntensityMatrix\", size: 16, type: \"mat4\" },\n { name: \"translucencyIntensityMatrix\", size: 16, type: \"mat4\" },\n { name: \"vThicknessParam\", size: 2, type: \"vec2\" },\n { name: \"vDiffusionDistance\", size: 3, type: \"vec3\" },\n { name: \"vTintColor\", size: 4, type: \"vec4\" },\n { name: \"vSubSurfaceIntensity\", size: 3, type: \"vec3\" },\n { name: \"vRefractionPosition\", size: 3, type: \"vec3\" },\n { name: \"vRefractionSize\", size: 3, type: \"vec3\" },\n { name: \"scatteringDiffusionProfile\", size: 1, type: \"float\" },\n { name: \"dispersion\", size: 1, type: \"float\" }\n ]\n };\n }\n}\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], qt.prototype, \"isRefractionEnabled\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], qt.prototype, \"isTranslucencyEnabled\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], qt.prototype, \"isDispersionEnabled\", void 0);\nP([\n U(),\n oe(\"_markScenePrePassDirty\")\n], qt.prototype, \"isScatteringEnabled\", void 0);\nP([\n U()\n], qt.prototype, \"_scatteringDiffusionProfileIndex\", void 0);\nP([\n U()\n], qt.prototype, \"refractionIntensity\", void 0);\nP([\n U()\n], qt.prototype, \"translucencyIntensity\", void 0);\nP([\n U()\n], qt.prototype, \"useAlbedoToTintRefraction\", void 0);\nP([\n U()\n], qt.prototype, \"useAlbedoToTintTranslucency\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], qt.prototype, \"thicknessTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], qt.prototype, \"refractionTexture\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], qt.prototype, \"indexOfRefraction\", void 0);\nP([\n U()\n], qt.prototype, \"_volumeIndexOfRefraction\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], qt.prototype, \"volumeIndexOfRefraction\", null);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], qt.prototype, \"invertRefractionY\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], qt.prototype, \"linkRefractionWithTransparency\", void 0);\nP([\n U()\n], qt.prototype, \"minimumThickness\", void 0);\nP([\n U()\n], qt.prototype, \"maximumThickness\", void 0);\nP([\n U()\n], qt.prototype, \"useThicknessAsDepth\", void 0);\nP([\n $i()\n], qt.prototype, \"tintColor\", void 0);\nP([\n U()\n], qt.prototype, \"tintColorAtDistance\", void 0);\nP([\n U()\n], qt.prototype, \"dispersion\", void 0);\nP([\n $i()\n], qt.prototype, \"diffusionDistance\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], qt.prototype, \"useMaskFromThicknessTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], qt.prototype, \"refractionIntensityTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], qt.prototype, \"translucencyIntensityTexture\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], qt.prototype, \"useGltfStyleTextures\", void 0);\nconst $n = { effect: null, subMesh: null };\nclass mg extends es {\n /**\n * Initializes the PBR Material defines.\n * @param externalProperties The external properties\n */\n constructor(e) {\n super(e), this.PBR = !0, this.NUM_SAMPLES = \"0\", this.REALTIME_FILTERING = !1, this.MAINUV1 = !1, this.MAINUV2 = !1, this.MAINUV3 = !1, this.MAINUV4 = !1, this.MAINUV5 = !1, this.MAINUV6 = !1, this.UV1 = !1, this.UV2 = !1, this.UV3 = !1, this.UV4 = !1, this.UV5 = !1, this.UV6 = !1, this.ALBEDO = !1, this.GAMMAALBEDO = !1, this.ALBEDODIRECTUV = 0, this.VERTEXCOLOR = !1, this.BAKED_VERTEX_ANIMATION_TEXTURE = !1, this.AMBIENT = !1, this.AMBIENTDIRECTUV = 0, this.AMBIENTINGRAYSCALE = !1, this.OPACITY = !1, this.VERTEXALPHA = !1, this.OPACITYDIRECTUV = 0, this.OPACITYRGB = !1, this.ALPHATEST = !1, this.DEPTHPREPASS = !1, this.ALPHABLEND = !1, this.ALPHAFROMALBEDO = !1, this.ALPHATESTVALUE = \"0.5\", this.SPECULAROVERALPHA = !1, this.RADIANCEOVERALPHA = !1, this.ALPHAFRESNEL = !1, this.LINEARALPHAFRESNEL = !1, this.PREMULTIPLYALPHA = !1, this.EMISSIVE = !1, this.EMISSIVEDIRECTUV = 0, this.GAMMAEMISSIVE = !1, this.REFLECTIVITY = !1, this.REFLECTIVITY_GAMMA = !1, this.REFLECTIVITYDIRECTUV = 0, this.SPECULARTERM = !1, this.MICROSURFACEFROMREFLECTIVITYMAP = !1, this.MICROSURFACEAUTOMATIC = !1, this.LODBASEDMICROSFURACE = !1, this.MICROSURFACEMAP = !1, this.MICROSURFACEMAPDIRECTUV = 0, this.METALLICWORKFLOW = !1, this.ROUGHNESSSTOREINMETALMAPALPHA = !1, this.ROUGHNESSSTOREINMETALMAPGREEN = !1, this.METALLNESSSTOREINMETALMAPBLUE = !1, this.AOSTOREINMETALMAPRED = !1, this.METALLIC_REFLECTANCE = !1, this.METALLIC_REFLECTANCE_GAMMA = !1, this.METALLIC_REFLECTANCEDIRECTUV = 0, this.METALLIC_REFLECTANCE_USE_ALPHA_ONLY = !1, this.REFLECTANCE = !1, this.REFLECTANCE_GAMMA = !1, this.REFLECTANCEDIRECTUV = 0, this.ENVIRONMENTBRDF = !1, this.ENVIRONMENTBRDF_RGBD = !1, this.NORMAL = !1, this.TANGENT = !1, this.BUMP = !1, this.BUMPDIRECTUV = 0, this.OBJECTSPACE_NORMALMAP = !1, this.PARALLAX = !1, this.PARALLAX_RHS = !1, this.PARALLAXOCCLUSION = !1, this.NORMALXYSCALE = !0, this.LIGHTMAP = !1, this.LIGHTMAPDIRECTUV = 0, this.USELIGHTMAPASSHADOWMAP = !1, this.GAMMALIGHTMAP = !1, this.RGBDLIGHTMAP = !1, this.REFLECTION = !1, this.REFLECTIONMAP_3D = !1, this.REFLECTIONMAP_SPHERICAL = !1, this.REFLECTIONMAP_PLANAR = !1, this.REFLECTIONMAP_CUBIC = !1, this.USE_LOCAL_REFLECTIONMAP_CUBIC = !1, this.REFLECTIONMAP_PROJECTION = !1, this.REFLECTIONMAP_SKYBOX = !1, this.REFLECTIONMAP_EXPLICIT = !1, this.REFLECTIONMAP_EQUIRECTANGULAR = !1, this.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !1, this.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !1, this.INVERTCUBICMAP = !1, this.USESPHERICALFROMREFLECTIONMAP = !1, this.USEIRRADIANCEMAP = !1, this.USESPHERICALINVERTEX = !1, this.REFLECTIONMAP_OPPOSITEZ = !1, this.LODINREFLECTIONALPHA = !1, this.GAMMAREFLECTION = !1, this.RGBDREFLECTION = !1, this.LINEARSPECULARREFLECTION = !1, this.RADIANCEOCCLUSION = !1, this.HORIZONOCCLUSION = !1, this.INSTANCES = !1, this.THIN_INSTANCES = !1, this.INSTANCESCOLOR = !1, this.PREPASS = !1, this.PREPASS_IRRADIANCE = !1, this.PREPASS_IRRADIANCE_INDEX = -1, this.PREPASS_ALBEDO_SQRT = !1, this.PREPASS_ALBEDO_SQRT_INDEX = -1, this.PREPASS_DEPTH = !1, this.PREPASS_DEPTH_INDEX = -1, this.PREPASS_NORMAL = !1, this.PREPASS_NORMAL_INDEX = -1, this.PREPASS_NORMAL_WORLDSPACE = !1, this.PREPASS_POSITION = !1, this.PREPASS_POSITION_INDEX = -1, this.PREPASS_VELOCITY = !1, this.PREPASS_VELOCITY_INDEX = -1, this.PREPASS_REFLECTIVITY = !1, this.PREPASS_REFLECTIVITY_INDEX = -1, this.SCENE_MRT_COUNT = 0, this.NUM_BONE_INFLUENCERS = 0, this.BonesPerMesh = 0, this.BONETEXTURE = !1, this.BONES_VELOCITY_ENABLED = !1, this.NONUNIFORMSCALING = !1, this.MORPHTARGETS = !1, this.MORPHTARGETS_NORMAL = !1, this.MORPHTARGETS_TANGENT = !1, this.MORPHTARGETS_UV = !1, this.NUM_MORPH_INFLUENCERS = 0, this.MORPHTARGETS_TEXTURE = !1, this.IMAGEPROCESSING = !1, this.VIGNETTE = !1, this.VIGNETTEBLENDMODEMULTIPLY = !1, this.VIGNETTEBLENDMODEOPAQUE = !1, this.TONEMAPPING = !1, this.TONEMAPPING_ACES = !1, this.CONTRAST = !1, this.COLORCURVES = !1, this.COLORGRADING = !1, this.COLORGRADING3D = !1, this.SAMPLER3DGREENDEPTH = !1, this.SAMPLER3DBGRMAP = !1, this.DITHER = !1, this.IMAGEPROCESSINGPOSTPROCESS = !1, this.SKIPFINALCOLORCLAMP = !1, this.EXPOSURE = !1, this.MULTIVIEW = !1, this.ORDER_INDEPENDENT_TRANSPARENCY = !1, this.ORDER_INDEPENDENT_TRANSPARENCY_16BITS = !1, this.USEPHYSICALLIGHTFALLOFF = !1, this.USEGLTFLIGHTFALLOFF = !1, this.TWOSIDEDLIGHTING = !1, this.SHADOWFLOAT = !1, this.CLIPPLANE = !1, this.CLIPPLANE2 = !1, this.CLIPPLANE3 = !1, this.CLIPPLANE4 = !1, this.CLIPPLANE5 = !1, this.CLIPPLANE6 = !1, this.POINTSIZE = !1, this.FOG = !1, this.LOGARITHMICDEPTH = !1, this.CAMERA_ORTHOGRAPHIC = !1, this.CAMERA_PERSPECTIVE = !1, this.FORCENORMALFORWARD = !1, this.SPECULARAA = !1, this.UNLIT = !1, this.DECAL_AFTER_DETAIL = !1, this.DEBUGMODE = 0, this.rebuild();\n }\n /**\n * Resets the PBR Material defines.\n */\n reset() {\n super.reset(), this.ALPHATESTVALUE = \"0.5\", this.PBR = !0, this.NORMALXYSCALE = !0;\n }\n}\nclass Nt extends Uc {\n /**\n * Enables realtime filtering on the texture.\n */\n get realTimeFiltering() {\n return this._realTimeFiltering;\n }\n set realTimeFiltering(e) {\n this._realTimeFiltering = e, this.markAsDirty(1);\n }\n /**\n * Quality switch for realtime filtering\n */\n get realTimeFilteringQuality() {\n return this._realTimeFilteringQuality;\n }\n set realTimeFilteringQuality(e) {\n this._realTimeFilteringQuality = e, this.markAsDirty(1);\n }\n /**\n * Can this material render to several textures at once\n */\n get canRenderToMRT() {\n return !0;\n }\n /**\n * Attaches a new image processing configuration to the PBR Material.\n * @param configuration\n */\n _attachImageProcessingConfiguration(e) {\n e !== this._imageProcessingConfiguration && (this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), e ? this._imageProcessingConfiguration = e : this._imageProcessingConfiguration = this.getScene().imageProcessingConfiguration, this._imageProcessingConfiguration && (this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add(() => {\n this._markAllSubMeshesAsImageProcessingDirty();\n })));\n }\n /**\n * Instantiates a new PBRMaterial instance.\n *\n * @param name The material name\n * @param scene The scene the material will be use in.\n */\n constructor(e, t) {\n super(e, t), this._directIntensity = 1, this._emissiveIntensity = 1, this._environmentIntensity = 1, this._specularIntensity = 1, this._lightingInfos = new Ke(this._directIntensity, this._emissiveIntensity, this._environmentIntensity, this._specularIntensity), this._disableBumpMap = !1, this._albedoTexture = null, this._ambientTexture = null, this._ambientTextureStrength = 1, this._ambientTextureImpactOnAnalyticalLights = Nt.DEFAULT_AO_ON_ANALYTICAL_LIGHTS, this._opacityTexture = null, this._reflectionTexture = null, this._emissiveTexture = null, this._reflectivityTexture = null, this._metallicTexture = null, this._metallic = null, this._roughness = null, this._metallicF0Factor = 1, this._metallicReflectanceColor = Ne.White(), this._useOnlyMetallicFromMetallicReflectanceTexture = !1, this._metallicReflectanceTexture = null, this._reflectanceTexture = null, this._microSurfaceTexture = null, this._bumpTexture = null, this._lightmapTexture = null, this._ambientColor = new Ne(0, 0, 0), this._albedoColor = new Ne(1, 1, 1), this._reflectivityColor = new Ne(1, 1, 1), this._reflectionColor = new Ne(1, 1, 1), this._emissiveColor = new Ne(0, 0, 0), this._microSurface = 0.9, this._useLightmapAsShadowmap = !1, this._useHorizonOcclusion = !0, this._useRadianceOcclusion = !0, this._useAlphaFromAlbedoTexture = !1, this._useSpecularOverAlpha = !0, this._useMicroSurfaceFromReflectivityMapAlpha = !1, this._useRoughnessFromMetallicTextureAlpha = !0, this._useRoughnessFromMetallicTextureGreen = !1, this._useMetallnessFromMetallicTextureBlue = !1, this._useAmbientOcclusionFromMetallicTextureRed = !1, this._useAmbientInGrayScale = !1, this._useAutoMicroSurfaceFromReflectivityMap = !1, this._lightFalloff = Nt.LIGHTFALLOFF_PHYSICAL, this._useRadianceOverAlpha = !0, this._useObjectSpaceNormalMap = !1, this._useParallax = !1, this._useParallaxOcclusion = !1, this._parallaxScaleBias = 0.05, this._disableLighting = !1, this._maxSimultaneousLights = 4, this._invertNormalMapX = !1, this._invertNormalMapY = !1, this._twoSidedLighting = !1, this._alphaCutOff = 0.4, this._forceAlphaTest = !1, this._useAlphaFresnel = !1, this._useLinearAlphaFresnel = !1, this._environmentBRDFTexture = null, this._forceIrradianceInFragment = !1, this._realTimeFiltering = !1, this._realTimeFilteringQuality = 8, this._forceNormalForward = !1, this._enableSpecularAntiAliasing = !1, this._imageProcessingObserver = null, this._renderTargets = new Li(16), this._globalAmbientColor = new Ne(0, 0, 0), this._unlit = !1, this._applyDecalMapAfterDetailMap = !1, this._debugMode = 0, this.debugMode = 0, this.debugLimit = -1, this.debugFactor = 1, this._cacheHasRenderTargetTextures = !1, this.brdf = new Fi(this), this.clearCoat = new Si(this), this.iridescence = new or(this), this.anisotropy = new Wa(this), this.sheen = new _s(this), this.subSurface = new qt(this), this.detailMap = new hn(this), this._attachImageProcessingConfiguration(null), this.getRenderTargetTextures = () => (this._renderTargets.reset(), ae.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget && this._renderTargets.push(this._reflectionTexture), this._eventInfo.renderTargets = this._renderTargets, this._callbackPluginEventFillRenderTargetTextures(this._eventInfo), this._renderTargets), this._environmentBRDFTexture = b0(this.getScene()), this.prePassConfiguration = new oc();\n }\n /**\n * Gets a boolean indicating that current material needs to register RTT\n */\n get hasRenderTargetTextures() {\n return ae.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget ? !0 : this._cacheHasRenderTargetTextures;\n }\n /**\n * Can this material render to prepass\n */\n get isPrePassCapable() {\n return !this.disableDepthWrite;\n }\n /**\n * @returns the name of the material class.\n */\n getClassName() {\n return \"PBRBaseMaterial\";\n }\n /**\n * Returns true if alpha blending should be disabled.\n */\n get _disableAlphaBlending() {\n var e;\n return this._transparencyMode === Nt.PBRMATERIAL_OPAQUE || this._transparencyMode === Nt.PBRMATERIAL_ALPHATEST || ((e = this.subSurface) == null ? void 0 : e.disableAlphaBlending);\n }\n /**\n * @returns whether or not this material should be rendered in alpha blend mode.\n */\n needAlphaBlending() {\n return this._disableAlphaBlending ? !1 : this.alpha < 1 || this._opacityTexture != null || this._shouldUseAlphaFromAlbedoTexture();\n }\n /**\n * @returns whether or not this material should be rendered in alpha test mode.\n */\n needAlphaTesting() {\n var e;\n return this._forceAlphaTest ? !0 : (e = this.subSurface) != null && e.disableAlphaBlending ? !1 : this._hasAlphaChannel() && (this._transparencyMode == null || this._transparencyMode === Nt.PBRMATERIAL_ALPHATEST);\n }\n /**\n * @returns whether or not the alpha value of the albedo texture should be used for alpha blending.\n */\n _shouldUseAlphaFromAlbedoTexture() {\n return this._albedoTexture != null && this._albedoTexture.hasAlpha && this._useAlphaFromAlbedoTexture && this._transparencyMode !== Nt.PBRMATERIAL_OPAQUE;\n }\n /**\n * @returns whether or not there is a usable alpha channel for transparency.\n */\n _hasAlphaChannel() {\n return this._albedoTexture != null && this._albedoTexture.hasAlpha || this._opacityTexture != null;\n }\n /**\n * @returns the texture used for the alpha test.\n */\n getAlphaTestTexture() {\n return this._albedoTexture;\n }\n /**\n * Specifies that the submesh is ready to be used.\n * @param mesh - BJS mesh.\n * @param subMesh - A submesh of the BJS mesh. Used to check if it is ready.\n * @param useInstances - Specifies that instances should be used.\n * @returns - boolean indicating that the submesh is ready or not.\n */\n isReadyForSubMesh(e, t, i) {\n var f;\n this._uniformBufferLayoutBuilt || this.buildUniformLayout();\n const r = t._drawWrapper;\n if (r.effect && this.isFrozen && r._wasPreviouslyReady && r._wasPreviouslyUsingInstances === i)\n return !0;\n t.materialDefines || (this._callbackPluginEventGeneric(Ri.GetDefineNames, this._eventInfo), t.materialDefines = new mg(this._eventInfo.defineNames));\n const s = t.materialDefines;\n if (this._isReadyForSubMesh(t))\n return !0;\n const a = this.getScene(), o = a.getEngine();\n if (s._areTexturesDirty && (this._eventInfo.hasRenderTargetTextures = !1, this._callbackPluginEventHasRenderTargetTextures(this._eventInfo), this._cacheHasRenderTargetTextures = this._eventInfo.hasRenderTargetTextures, a.texturesEnabled)) {\n if (this._albedoTexture && ae.DiffuseTextureEnabled && !this._albedoTexture.isReadyOrNotBlocking() || this._ambientTexture && ae.AmbientTextureEnabled && !this._ambientTexture.isReadyOrNotBlocking() || this._opacityTexture && ae.OpacityTextureEnabled && !this._opacityTexture.isReadyOrNotBlocking())\n return !1;\n const d = this._getReflectionTexture();\n if (d && ae.ReflectionTextureEnabled) {\n if (!d.isReadyOrNotBlocking())\n return !1;\n if (d.irradianceTexture) {\n if (!d.irradianceTexture.isReadyOrNotBlocking())\n return !1;\n } else if (!d.sphericalPolynomial && ((f = d.getInternalTexture()) != null && f._sphericalPolynomialPromise))\n return !1;\n }\n if (this._lightmapTexture && ae.LightmapTextureEnabled && !this._lightmapTexture.isReadyOrNotBlocking() || this._emissiveTexture && ae.EmissiveTextureEnabled && !this._emissiveTexture.isReadyOrNotBlocking())\n return !1;\n if (ae.SpecularTextureEnabled) {\n if (this._metallicTexture) {\n if (!this._metallicTexture.isReadyOrNotBlocking())\n return !1;\n } else if (this._reflectivityTexture && !this._reflectivityTexture.isReadyOrNotBlocking())\n return !1;\n if (this._metallicReflectanceTexture && !this._metallicReflectanceTexture.isReadyOrNotBlocking() || this._reflectanceTexture && !this._reflectanceTexture.isReadyOrNotBlocking() || this._microSurfaceTexture && !this._microSurfaceTexture.isReadyOrNotBlocking())\n return !1;\n }\n if (o.getCaps().standardDerivatives && this._bumpTexture && ae.BumpTextureEnabled && !this._disableBumpMap && !this._bumpTexture.isReady() || this._environmentBRDFTexture && ae.ReflectionTextureEnabled && !this._environmentBRDFTexture.isReady())\n return !1;\n }\n if (this._eventInfo.isReadyForSubMesh = !0, this._eventInfo.defines = s, this._eventInfo.subMesh = t, this._callbackPluginEventIsReadyForSubMesh(this._eventInfo), !this._eventInfo.isReadyForSubMesh || s._areImageProcessingDirty && this._imageProcessingConfiguration && !this._imageProcessingConfiguration.isReady())\n return !1;\n !o.getCaps().standardDerivatives && !e.isVerticesDataPresent(I.NormalKind) && (e.createNormals(!0), ne.Warn(\"PBRMaterial: Normals have been created for the mesh: \" + e.name));\n const l = t.effect, c = s._areLightsDisposed;\n let h = this._prepareEffect(e, s, this.onCompiled, this.onError, i, null, t.getRenderingMesh().hasThinInstances), u = !1;\n if (h)\n if (this._onEffectCreatedObservable && ($n.effect = h, $n.subMesh = t, this._onEffectCreatedObservable.notifyObservers($n)), this.allowShaderHotSwapping && l && !h.isReady()) {\n if (h = l, s.markAsUnprocessed(), u = this.isFrozen, c)\n return s._areLightsDisposed = !0, !1;\n } else\n a.resetCachedMaterial(), t.setEffect(h, s, this._materialContext);\n return !t.effect || !t.effect.isReady() ? !1 : (s._renderId = a.getRenderId(), r._wasPreviouslyReady = !u, r._wasPreviouslyUsingInstances = !!i, this._checkScenePerformancePriority(), !0);\n }\n /**\n * Specifies if the material uses metallic roughness workflow.\n * @returns boolean specifying if the material uses metallic roughness workflow.\n */\n isMetallicWorkflow() {\n return !!(this._metallic != null || this._roughness != null || this._metallicTexture);\n }\n _prepareEffect(e, t, i = null, r = null, s = null, a = null, o) {\n if (this._prepareDefines(e, t, s, a, o), !t.isDirty)\n return null;\n t.markAsProcessed();\n const c = this.getScene().getEngine(), h = new pf();\n let u = 0;\n t.USESPHERICALINVERTEX && h.addFallback(u++, \"USESPHERICALINVERTEX\"), t.FOG && h.addFallback(u, \"FOG\"), t.SPECULARAA && h.addFallback(u, \"SPECULARAA\"), t.POINTSIZE && h.addFallback(u, \"POINTSIZE\"), t.LOGARITHMICDEPTH && h.addFallback(u, \"LOGARITHMICDEPTH\"), t.PARALLAX && h.addFallback(u, \"PARALLAX\"), t.PARALLAX_RHS && h.addFallback(u, \"PARALLAX_RHS\"), t.PARALLAXOCCLUSION && h.addFallback(u++, \"PARALLAXOCCLUSION\"), t.ENVIRONMENTBRDF && h.addFallback(u++, \"ENVIRONMENTBRDF\"), t.TANGENT && h.addFallback(u++, \"TANGENT\"), t.BUMP && h.addFallback(u++, \"BUMP\"), u = i0(t, h, this._maxSimultaneousLights, u++), t.SPECULARTERM && h.addFallback(u++, \"SPECULARTERM\"), t.USESPHERICALFROMREFLECTIONMAP && h.addFallback(u++, \"USESPHERICALFROMREFLECTIONMAP\"), t.USEIRRADIANCEMAP && h.addFallback(u++, \"USEIRRADIANCEMAP\"), t.LIGHTMAP && h.addFallback(u++, \"LIGHTMAP\"), t.NORMAL && h.addFallback(u++, \"NORMAL\"), t.AMBIENT && h.addFallback(u++, \"AMBIENT\"), t.EMISSIVE && h.addFallback(u++, \"EMISSIVE\"), t.VERTEXCOLOR && h.addFallback(u++, \"VERTEXCOLOR\"), t.MORPHTARGETS && h.addFallback(u++, \"MORPHTARGETS\"), t.MULTIVIEW && h.addFallback(0, \"MULTIVIEW\");\n const f = [I.PositionKind];\n t.NORMAL && f.push(I.NormalKind), t.TANGENT && f.push(I.TangentKind);\n for (let R = 1; R <= 6; ++R)\n t[\"UV\" + R] && f.push(`uv${R === 1 ? \"\" : R}`);\n t.VERTEXCOLOR && f.push(I.ColorKind), t0(f, e, t, h), lf(f, t), Q_(f, e, t), af(f, e, t);\n let d = \"pbr\";\n const p = [\n \"world\",\n \"view\",\n \"viewProjection\",\n \"vEyePosition\",\n \"vLightsType\",\n \"vAmbientColor\",\n \"vAlbedoColor\",\n \"vReflectivityColor\",\n \"vMetallicReflectanceFactors\",\n \"vEmissiveColor\",\n \"visibility\",\n \"vReflectionColor\",\n \"vFogInfos\",\n \"vFogColor\",\n \"pointSize\",\n \"vAlbedoInfos\",\n \"vAmbientInfos\",\n \"vOpacityInfos\",\n \"vReflectionInfos\",\n \"vReflectionPosition\",\n \"vReflectionSize\",\n \"vEmissiveInfos\",\n \"vReflectivityInfos\",\n \"vReflectionFilteringInfo\",\n \"vMetallicReflectanceInfos\",\n \"vReflectanceInfos\",\n \"vMicroSurfaceSamplerInfos\",\n \"vBumpInfos\",\n \"vLightmapInfos\",\n \"mBones\",\n \"albedoMatrix\",\n \"ambientMatrix\",\n \"opacityMatrix\",\n \"reflectionMatrix\",\n \"emissiveMatrix\",\n \"reflectivityMatrix\",\n \"normalMatrix\",\n \"microSurfaceSamplerMatrix\",\n \"bumpMatrix\",\n \"lightmapMatrix\",\n \"metallicReflectanceMatrix\",\n \"reflectanceMatrix\",\n \"vLightingIntensity\",\n \"logarithmicDepthConstant\",\n \"vSphericalX\",\n \"vSphericalY\",\n \"vSphericalZ\",\n \"vSphericalXX_ZZ\",\n \"vSphericalYY_ZZ\",\n \"vSphericalZZ\",\n \"vSphericalXY\",\n \"vSphericalYZ\",\n \"vSphericalZX\",\n \"vSphericalL00\",\n \"vSphericalL1_1\",\n \"vSphericalL10\",\n \"vSphericalL11\",\n \"vSphericalL2_2\",\n \"vSphericalL2_1\",\n \"vSphericalL20\",\n \"vSphericalL21\",\n \"vSphericalL22\",\n \"vReflectionMicrosurfaceInfos\",\n \"vTangentSpaceParams\",\n \"boneTextureWidth\",\n \"vDebugMode\",\n \"morphTargetTextureInfo\",\n \"morphTargetTextureIndices\"\n ], g = [\n \"albedoSampler\",\n \"reflectivitySampler\",\n \"ambientSampler\",\n \"emissiveSampler\",\n \"bumpSampler\",\n \"lightmapSampler\",\n \"opacitySampler\",\n \"reflectionSampler\",\n \"reflectionSamplerLow\",\n \"reflectionSamplerHigh\",\n \"irradianceSampler\",\n \"microSurfaceSampler\",\n \"environmentBrdfSampler\",\n \"boneSampler\",\n \"metallicReflectanceSampler\",\n \"reflectanceSampler\",\n \"morphTargets\",\n \"oitDepthSampler\",\n \"oitFrontColorSampler\"\n ], m = [\"Material\", \"Scene\", \"Mesh\"], v = { maxSimultaneousLights: this._maxSimultaneousLights, maxSimultaneousMorphTargets: t.NUM_MORPH_INFLUENCERS };\n this._eventInfo.fallbacks = h, this._eventInfo.fallbackRank = u, this._eventInfo.defines = t, this._eventInfo.uniforms = p, this._eventInfo.attributes = f, this._eventInfo.samplers = g, this._eventInfo.uniformBuffersNames = m, this._eventInfo.customCode = void 0, this._eventInfo.mesh = e, this._eventInfo.indexParameters = v, this._callbackPluginEventGeneric(Ri.PrepareEffect, this._eventInfo), oc.AddUniforms(p), Nc(p), at && (at.PrepareUniforms(p, t), at.PrepareSamplers(g, t)), ff({\n uniformsNames: p,\n uniformBuffersNames: m,\n samplers: g,\n defines: t,\n maxSimultaneousLights: this._maxSimultaneousLights\n });\n const E = {};\n this.customShaderNameResolve && (d = this.customShaderNameResolve(d, p, m, g, t, f, E));\n const C = t.toString(), T = c.createEffect(d, {\n attributes: f,\n uniformsNames: p,\n uniformBuffersNames: m,\n samplers: g,\n defines: C,\n fallbacks: h,\n onCompiled: i,\n onError: r,\n indexParameters: v,\n processFinalCode: E.processFinalCode,\n processCodeAfterIncludes: this._eventInfo.customCode,\n multiTarget: t.PREPASS\n }, c);\n return this._eventInfo.customCode = void 0, T;\n }\n _prepareDefines(e, t, i = null, r = null, s = !1) {\n var c;\n const a = this.getScene(), o = a.getEngine();\n r0(a, e, t, !0, this._maxSimultaneousLights, this._disableLighting), t._needNormals = !0, s0(a, t);\n const l = this.needAlphaBlendingForMesh(e) && this.getScene().useOrderIndependentTransparency;\n if (a0(a, t, this.canRenderToMRT && !l), n0(a, t, l), t.METALLICWORKFLOW = this.isMetallicWorkflow(), t._areTexturesDirty) {\n t._needUVs = !1;\n for (let h = 1; h <= 6; ++h)\n t[\"MAINUV\" + h] = !1;\n if (a.texturesEnabled) {\n t.ALBEDODIRECTUV = 0, t.AMBIENTDIRECTUV = 0, t.OPACITYDIRECTUV = 0, t.EMISSIVEDIRECTUV = 0, t.REFLECTIVITYDIRECTUV = 0, t.MICROSURFACEMAPDIRECTUV = 0, t.METALLIC_REFLECTANCEDIRECTUV = 0, t.REFLECTANCEDIRECTUV = 0, t.BUMPDIRECTUV = 0, t.LIGHTMAPDIRECTUV = 0, o.getCaps().textureLOD && (t.LODBASEDMICROSFURACE = !0), this._albedoTexture && ae.DiffuseTextureEnabled ? (wt(this._albedoTexture, t, \"ALBEDO\"), t.GAMMAALBEDO = this._albedoTexture.gammaSpace) : t.ALBEDO = !1, this._ambientTexture && ae.AmbientTextureEnabled ? (wt(this._ambientTexture, t, \"AMBIENT\"), t.AMBIENTINGRAYSCALE = this._useAmbientInGrayScale) : t.AMBIENT = !1, this._opacityTexture && ae.OpacityTextureEnabled ? (wt(this._opacityTexture, t, \"OPACITY\"), t.OPACITYRGB = this._opacityTexture.getAlphaFromRGB) : t.OPACITY = !1;\n const h = this._getReflectionTexture();\n if (h && ae.ReflectionTextureEnabled) {\n switch (t.REFLECTION = !0, t.GAMMAREFLECTION = h.gammaSpace, t.RGBDREFLECTION = h.isRGBD, t.LODINREFLECTIONALPHA = h.lodLevelInAlpha, t.LINEARSPECULARREFLECTION = h.linearSpecularLOD, this.realTimeFiltering && this.realTimeFilteringQuality > 0 ? (t.NUM_SAMPLES = \"\" + this.realTimeFilteringQuality, o._features.needTypeSuffixInShaderConstants && (t.NUM_SAMPLES = t.NUM_SAMPLES + \"u\"), t.REALTIME_FILTERING = !0) : t.REALTIME_FILTERING = !1, t.INVERTCUBICMAP = h.coordinatesMode === le.INVCUBIC_MODE, t.REFLECTIONMAP_3D = h.isCube, t.REFLECTIONMAP_OPPOSITEZ = t.REFLECTIONMAP_3D && this.getScene().useRightHandedSystem ? !h.invertZ : h.invertZ, t.REFLECTIONMAP_CUBIC = !1, t.REFLECTIONMAP_EXPLICIT = !1, t.REFLECTIONMAP_PLANAR = !1, t.REFLECTIONMAP_PROJECTION = !1, t.REFLECTIONMAP_SKYBOX = !1, t.REFLECTIONMAP_SPHERICAL = !1, t.REFLECTIONMAP_EQUIRECTANGULAR = !1, t.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !1, t.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !1, h.coordinatesMode) {\n case le.EXPLICIT_MODE:\n t.REFLECTIONMAP_EXPLICIT = !0;\n break;\n case le.PLANAR_MODE:\n t.REFLECTIONMAP_PLANAR = !0;\n break;\n case le.PROJECTION_MODE:\n t.REFLECTIONMAP_PROJECTION = !0;\n break;\n case le.SKYBOX_MODE:\n t.REFLECTIONMAP_SKYBOX = !0;\n break;\n case le.SPHERICAL_MODE:\n t.REFLECTIONMAP_SPHERICAL = !0;\n break;\n case le.EQUIRECTANGULAR_MODE:\n t.REFLECTIONMAP_EQUIRECTANGULAR = !0;\n break;\n case le.FIXED_EQUIRECTANGULAR_MODE:\n t.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !0;\n break;\n case le.FIXED_EQUIRECTANGULAR_MIRRORED_MODE:\n t.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !0;\n break;\n case le.CUBIC_MODE:\n case le.INVCUBIC_MODE:\n default:\n t.REFLECTIONMAP_CUBIC = !0, t.USE_LOCAL_REFLECTIONMAP_CUBIC = !!h.boundingBoxSize;\n break;\n }\n h.coordinatesMode !== le.SKYBOX_MODE && (h.irradianceTexture ? (t.USEIRRADIANCEMAP = !0, t.USESPHERICALFROMREFLECTIONMAP = !1) : h.isCube && (t.USESPHERICALFROMREFLECTIONMAP = !0, t.USEIRRADIANCEMAP = !1, this._forceIrradianceInFragment || this.realTimeFiltering || this._twoSidedLighting || o.getCaps().maxVaryingVectors <= 8 ? t.USESPHERICALINVERTEX = !1 : t.USESPHERICALINVERTEX = !0));\n } else\n t.REFLECTION = !1, t.REFLECTIONMAP_3D = !1, t.REFLECTIONMAP_SPHERICAL = !1, t.REFLECTIONMAP_PLANAR = !1, t.REFLECTIONMAP_CUBIC = !1, t.USE_LOCAL_REFLECTIONMAP_CUBIC = !1, t.REFLECTIONMAP_PROJECTION = !1, t.REFLECTIONMAP_SKYBOX = !1, t.REFLECTIONMAP_EXPLICIT = !1, t.REFLECTIONMAP_EQUIRECTANGULAR = !1, t.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !1, t.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !1, t.INVERTCUBICMAP = !1, t.USESPHERICALFROMREFLECTIONMAP = !1, t.USEIRRADIANCEMAP = !1, t.USESPHERICALINVERTEX = !1, t.REFLECTIONMAP_OPPOSITEZ = !1, t.LODINREFLECTIONALPHA = !1, t.GAMMAREFLECTION = !1, t.RGBDREFLECTION = !1, t.LINEARSPECULARREFLECTION = !1;\n if (this._lightmapTexture && ae.LightmapTextureEnabled ? (wt(this._lightmapTexture, t, \"LIGHTMAP\"), t.USELIGHTMAPASSHADOWMAP = this._useLightmapAsShadowmap, t.GAMMALIGHTMAP = this._lightmapTexture.gammaSpace, t.RGBDLIGHTMAP = this._lightmapTexture.isRGBD) : t.LIGHTMAP = !1, this._emissiveTexture && ae.EmissiveTextureEnabled ? (wt(this._emissiveTexture, t, \"EMISSIVE\"), t.GAMMAEMISSIVE = this._emissiveTexture.gammaSpace) : t.EMISSIVE = !1, ae.SpecularTextureEnabled) {\n if (this._metallicTexture ? (wt(this._metallicTexture, t, \"REFLECTIVITY\"), t.ROUGHNESSSTOREINMETALMAPALPHA = this._useRoughnessFromMetallicTextureAlpha, t.ROUGHNESSSTOREINMETALMAPGREEN = !this._useRoughnessFromMetallicTextureAlpha && this._useRoughnessFromMetallicTextureGreen, t.METALLNESSSTOREINMETALMAPBLUE = this._useMetallnessFromMetallicTextureBlue, t.AOSTOREINMETALMAPRED = this._useAmbientOcclusionFromMetallicTextureRed, t.REFLECTIVITY_GAMMA = !1) : this._reflectivityTexture ? (wt(this._reflectivityTexture, t, \"REFLECTIVITY\"), t.MICROSURFACEFROMREFLECTIVITYMAP = this._useMicroSurfaceFromReflectivityMapAlpha, t.MICROSURFACEAUTOMATIC = this._useAutoMicroSurfaceFromReflectivityMap, t.REFLECTIVITY_GAMMA = this._reflectivityTexture.gammaSpace) : t.REFLECTIVITY = !1, this._metallicReflectanceTexture || this._reflectanceTexture) {\n const u = this._metallicReflectanceTexture !== null && this._metallicReflectanceTexture._texture === ((c = this._reflectanceTexture) == null ? void 0 : c._texture) && this._metallicReflectanceTexture.checkTransformsAreIdentical(this._reflectanceTexture);\n t.METALLIC_REFLECTANCE_USE_ALPHA_ONLY = this._useOnlyMetallicFromMetallicReflectanceTexture && !u, this._metallicReflectanceTexture ? (wt(this._metallicReflectanceTexture, t, \"METALLIC_REFLECTANCE\"), t.METALLIC_REFLECTANCE_GAMMA = this._metallicReflectanceTexture.gammaSpace) : t.METALLIC_REFLECTANCE = !1, this._reflectanceTexture && !u && (!this._metallicReflectanceTexture || this._metallicReflectanceTexture && this._useOnlyMetallicFromMetallicReflectanceTexture) ? (wt(this._reflectanceTexture, t, \"REFLECTANCE\"), t.REFLECTANCE_GAMMA = this._reflectanceTexture.gammaSpace) : t.REFLECTANCE = !1;\n } else\n t.METALLIC_REFLECTANCE = !1, t.REFLECTANCE = !1;\n this._microSurfaceTexture ? wt(this._microSurfaceTexture, t, \"MICROSURFACEMAP\") : t.MICROSURFACEMAP = !1;\n } else\n t.REFLECTIVITY = !1, t.MICROSURFACEMAP = !1;\n o.getCaps().standardDerivatives && this._bumpTexture && ae.BumpTextureEnabled && !this._disableBumpMap ? (wt(this._bumpTexture, t, \"BUMP\"), this._useParallax && this._albedoTexture && ae.DiffuseTextureEnabled ? (t.PARALLAX = !0, t.PARALLAX_RHS = a.useRightHandedSystem, t.PARALLAXOCCLUSION = !!this._useParallaxOcclusion) : t.PARALLAX = !1, t.OBJECTSPACE_NORMALMAP = this._useObjectSpaceNormalMap) : (t.BUMP = !1, t.PARALLAX = !1, t.PARALLAX_RHS = !1, t.PARALLAXOCCLUSION = !1, t.OBJECTSPACE_NORMALMAP = !1), this._environmentBRDFTexture && ae.ReflectionTextureEnabled ? (t.ENVIRONMENTBRDF = !0, t.ENVIRONMENTBRDF_RGBD = this._environmentBRDFTexture.isRGBD) : (t.ENVIRONMENTBRDF = !1, t.ENVIRONMENTBRDF_RGBD = !1), this._shouldUseAlphaFromAlbedoTexture() ? t.ALPHAFROMALBEDO = !0 : t.ALPHAFROMALBEDO = !1;\n }\n t.SPECULAROVERALPHA = this._useSpecularOverAlpha, this._lightFalloff === Nt.LIGHTFALLOFF_STANDARD ? (t.USEPHYSICALLIGHTFALLOFF = !1, t.USEGLTFLIGHTFALLOFF = !1) : this._lightFalloff === Nt.LIGHTFALLOFF_GLTF ? (t.USEPHYSICALLIGHTFALLOFF = !1, t.USEGLTFLIGHTFALLOFF = !0) : (t.USEPHYSICALLIGHTFALLOFF = !0, t.USEGLTFLIGHTFALLOFF = !1), t.RADIANCEOVERALPHA = this._useRadianceOverAlpha, !this.backFaceCulling && this._twoSidedLighting ? t.TWOSIDEDLIGHTING = !0 : t.TWOSIDEDLIGHTING = !1, t.SPECULARAA = o.getCaps().standardDerivatives && this._enableSpecularAntiAliasing;\n }\n (t._areTexturesDirty || t._areMiscDirty) && (t.ALPHATESTVALUE = `${this._alphaCutOff}${this._alphaCutOff % 1 === 0 ? \".\" : \"\"}`, t.PREMULTIPLYALPHA = this.alphaMode === 7 || this.alphaMode === 8, t.ALPHABLEND = this.needAlphaBlendingForMesh(e), t.ALPHAFRESNEL = this._useAlphaFresnel || this._useLinearAlphaFresnel, t.LINEARALPHAFRESNEL = this._useLinearAlphaFresnel), t._areImageProcessingDirty && this._imageProcessingConfiguration && this._imageProcessingConfiguration.prepareDefines(t), t.FORCENORMALFORWARD = this._forceNormalForward, t.RADIANCEOCCLUSION = this._useRadianceOcclusion, t.HORIZONOCCLUSION = this._useHorizonOcclusion, t._areMiscDirty && (cf(e, a, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, this._shouldTurnAlphaTestOn(e) || this._forceAlphaTest, t, this._applyDecalMapAfterDetailMap), t.UNLIT = this._unlit || (this.pointsCloud || this.wireframe) && !e.isVerticesDataPresent(I.NormalKind), t.DEBUGMODE = this._debugMode), hf(a, o, this, t, !!i, r, s), this._eventInfo.defines = t, this._eventInfo.mesh = e, this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo), uf(e, t, !0, !0, !0, this._transparencyMode !== Nt.PBRMATERIAL_OPAQUE), this._callbackPluginEventPrepareDefines(this._eventInfo);\n }\n /**\n * Force shader compilation\n * @param mesh - Define the mesh we want to force the compilation for\n * @param onCompiled - Define a callback triggered when the compilation completes\n * @param options - Define the options used to create the compilation\n */\n forceCompilation(e, t, i) {\n const r = {\n clipPlane: !1,\n useInstances: !1,\n ...i\n };\n this._uniformBufferLayoutBuilt || this.buildUniformLayout(), this._callbackPluginEventGeneric(Ri.GetDefineNames, this._eventInfo);\n const s = new mg(this._eventInfo.defineNames), a = this._prepareEffect(e, s, void 0, void 0, r.useInstances, r.clipPlane, e.hasThinInstances);\n this._onEffectCreatedObservable && ($n.effect = a, $n.subMesh = null, this._onEffectCreatedObservable.notifyObservers($n)), a.isReady() ? t && t(this) : a.onCompileObservable.add(() => {\n t && t(this);\n });\n }\n /**\n * Initializes the uniform buffer layout for the shader.\n */\n buildUniformLayout() {\n const e = this._uniformBuffer;\n e.addUniform(\"vAlbedoInfos\", 2), e.addUniform(\"vAmbientInfos\", 4), e.addUniform(\"vOpacityInfos\", 2), e.addUniform(\"vEmissiveInfos\", 2), e.addUniform(\"vLightmapInfos\", 2), e.addUniform(\"vReflectivityInfos\", 3), e.addUniform(\"vMicroSurfaceSamplerInfos\", 2), e.addUniform(\"vReflectionInfos\", 2), e.addUniform(\"vReflectionFilteringInfo\", 2), e.addUniform(\"vReflectionPosition\", 3), e.addUniform(\"vReflectionSize\", 3), e.addUniform(\"vBumpInfos\", 3), e.addUniform(\"albedoMatrix\", 16), e.addUniform(\"ambientMatrix\", 16), e.addUniform(\"opacityMatrix\", 16), e.addUniform(\"emissiveMatrix\", 16), e.addUniform(\"lightmapMatrix\", 16), e.addUniform(\"reflectivityMatrix\", 16), e.addUniform(\"microSurfaceSamplerMatrix\", 16), e.addUniform(\"bumpMatrix\", 16), e.addUniform(\"vTangentSpaceParams\", 2), e.addUniform(\"reflectionMatrix\", 16), e.addUniform(\"vReflectionColor\", 3), e.addUniform(\"vAlbedoColor\", 4), e.addUniform(\"vLightingIntensity\", 4), e.addUniform(\"vReflectionMicrosurfaceInfos\", 3), e.addUniform(\"pointSize\", 1), e.addUniform(\"vReflectivityColor\", 4), e.addUniform(\"vEmissiveColor\", 3), e.addUniform(\"vAmbientColor\", 3), e.addUniform(\"vDebugMode\", 2), e.addUniform(\"vMetallicReflectanceFactors\", 4), e.addUniform(\"vMetallicReflectanceInfos\", 2), e.addUniform(\"metallicReflectanceMatrix\", 16), e.addUniform(\"vReflectanceInfos\", 2), e.addUniform(\"reflectanceMatrix\", 16), e.addUniform(\"vSphericalL00\", 3), e.addUniform(\"vSphericalL1_1\", 3), e.addUniform(\"vSphericalL10\", 3), e.addUniform(\"vSphericalL11\", 3), e.addUniform(\"vSphericalL2_2\", 3), e.addUniform(\"vSphericalL2_1\", 3), e.addUniform(\"vSphericalL20\", 3), e.addUniform(\"vSphericalL21\", 3), e.addUniform(\"vSphericalL22\", 3), e.addUniform(\"vSphericalX\", 3), e.addUniform(\"vSphericalY\", 3), e.addUniform(\"vSphericalZ\", 3), e.addUniform(\"vSphericalXX_ZZ\", 3), e.addUniform(\"vSphericalYY_ZZ\", 3), e.addUniform(\"vSphericalZZ\", 3), e.addUniform(\"vSphericalXY\", 3), e.addUniform(\"vSphericalYZ\", 3), e.addUniform(\"vSphericalZX\", 3), super.buildUniformLayout();\n }\n /**\n * Binds the submesh data.\n * @param world - The world matrix.\n * @param mesh - The BJS mesh.\n * @param subMesh - A submesh of the BJS mesh.\n */\n bindForSubMesh(e, t, i) {\n var u, f, d;\n const r = this.getScene(), s = i.materialDefines;\n if (!s)\n return;\n const a = i.effect;\n if (!a)\n return;\n this._activeEffect = a, t.getMeshUniformBuffer().bindToEffect(a, \"Mesh\"), t.transferToEffect(e);\n const o = r.getEngine();\n this._uniformBuffer.bindToEffect(a, \"Material\"), this.prePassConfiguration.bindForSubMesh(this._activeEffect, r, t, e, this.isFrozen), this._eventInfo.subMesh = i, this._callbackPluginEventHardBindForSubMesh(this._eventInfo), s.OBJECTSPACE_NORMALMAP && (e.toNormalMatrix(this._normalMatrix), this.bindOnlyNormalMatrix(this._normalMatrix));\n const l = this._mustRebind(r, a, i, t.visibility);\n of(t, this._activeEffect, this.prePassConfiguration);\n let c = null;\n const h = this._uniformBuffer;\n if (l) {\n if (this.bindViewProjection(a), c = this._getReflectionTexture(), !h.useUbo || !this.isFrozen || !h.isSync || i._drawWrapper._forceRebindOnNextCall) {\n if (r.texturesEnabled) {\n if (this._albedoTexture && ae.DiffuseTextureEnabled && (h.updateFloat2(\"vAlbedoInfos\", this._albedoTexture.coordinatesIndex, this._albedoTexture.level), Mt(this._albedoTexture, h, \"albedo\")), this._ambientTexture && ae.AmbientTextureEnabled && (h.updateFloat4(\"vAmbientInfos\", this._ambientTexture.coordinatesIndex, this._ambientTexture.level, this._ambientTextureStrength, this._ambientTextureImpactOnAnalyticalLights), Mt(this._ambientTexture, h, \"ambient\")), this._opacityTexture && ae.OpacityTextureEnabled && (h.updateFloat2(\"vOpacityInfos\", this._opacityTexture.coordinatesIndex, this._opacityTexture.level), Mt(this._opacityTexture, h, \"opacity\")), c && ae.ReflectionTextureEnabled) {\n if (h.updateMatrix(\"reflectionMatrix\", c.getReflectionTextureMatrix()), h.updateFloat2(\"vReflectionInfos\", c.level, 0), c.boundingBoxSize) {\n const p = c;\n h.updateVector3(\"vReflectionPosition\", p.boundingBoxPosition), h.updateVector3(\"vReflectionSize\", p.boundingBoxSize);\n }\n if (this.realTimeFiltering) {\n const p = c.getSize().width;\n h.updateFloat2(\"vReflectionFilteringInfo\", p, je.Log2(p));\n }\n if (!s.USEIRRADIANCEMAP) {\n const p = c.sphericalPolynomial;\n if (s.USESPHERICALFROMREFLECTIONMAP && p)\n if (s.SPHERICAL_HARMONICS) {\n const g = p.preScaledHarmonics;\n h.updateVector3(\"vSphericalL00\", g.l00), h.updateVector3(\"vSphericalL1_1\", g.l1_1), h.updateVector3(\"vSphericalL10\", g.l10), h.updateVector3(\"vSphericalL11\", g.l11), h.updateVector3(\"vSphericalL2_2\", g.l2_2), h.updateVector3(\"vSphericalL2_1\", g.l2_1), h.updateVector3(\"vSphericalL20\", g.l20), h.updateVector3(\"vSphericalL21\", g.l21), h.updateVector3(\"vSphericalL22\", g.l22);\n } else\n h.updateFloat3(\"vSphericalX\", p.x.x, p.x.y, p.x.z), h.updateFloat3(\"vSphericalY\", p.y.x, p.y.y, p.y.z), h.updateFloat3(\"vSphericalZ\", p.z.x, p.z.y, p.z.z), h.updateFloat3(\"vSphericalXX_ZZ\", p.xx.x - p.zz.x, p.xx.y - p.zz.y, p.xx.z - p.zz.z), h.updateFloat3(\"vSphericalYY_ZZ\", p.yy.x - p.zz.x, p.yy.y - p.zz.y, p.yy.z - p.zz.z), h.updateFloat3(\"vSphericalZZ\", p.zz.x, p.zz.y, p.zz.z), h.updateFloat3(\"vSphericalXY\", p.xy.x, p.xy.y, p.xy.z), h.updateFloat3(\"vSphericalYZ\", p.yz.x, p.yz.y, p.yz.z), h.updateFloat3(\"vSphericalZX\", p.zx.x, p.zx.y, p.zx.z);\n }\n h.updateFloat3(\"vReflectionMicrosurfaceInfos\", c.getSize().width, c.lodGenerationScale, c.lodGenerationOffset);\n }\n this._emissiveTexture && ae.EmissiveTextureEnabled && (h.updateFloat2(\"vEmissiveInfos\", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level), Mt(this._emissiveTexture, h, \"emissive\")), this._lightmapTexture && ae.LightmapTextureEnabled && (h.updateFloat2(\"vLightmapInfos\", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level), Mt(this._lightmapTexture, h, \"lightmap\")), ae.SpecularTextureEnabled && (this._metallicTexture ? (h.updateFloat3(\"vReflectivityInfos\", this._metallicTexture.coordinatesIndex, this._metallicTexture.level, this._ambientTextureStrength), Mt(this._metallicTexture, h, \"reflectivity\")) : this._reflectivityTexture && (h.updateFloat3(\"vReflectivityInfos\", this._reflectivityTexture.coordinatesIndex, this._reflectivityTexture.level, 1), Mt(this._reflectivityTexture, h, \"reflectivity\")), this._metallicReflectanceTexture && (h.updateFloat2(\"vMetallicReflectanceInfos\", this._metallicReflectanceTexture.coordinatesIndex, this._metallicReflectanceTexture.level), Mt(this._metallicReflectanceTexture, h, \"metallicReflectance\")), this._reflectanceTexture && s.REFLECTANCE && (h.updateFloat2(\"vReflectanceInfos\", this._reflectanceTexture.coordinatesIndex, this._reflectanceTexture.level), Mt(this._reflectanceTexture, h, \"reflectance\")), this._microSurfaceTexture && (h.updateFloat2(\"vMicroSurfaceSamplerInfos\", this._microSurfaceTexture.coordinatesIndex, this._microSurfaceTexture.level), Mt(this._microSurfaceTexture, h, \"microSurfaceSampler\"))), this._bumpTexture && o.getCaps().standardDerivatives && ae.BumpTextureEnabled && !this._disableBumpMap && (h.updateFloat3(\"vBumpInfos\", this._bumpTexture.coordinatesIndex, this._bumpTexture.level, this._parallaxScaleBias), Mt(this._bumpTexture, h, \"bump\"), r._mirroredCameraPosition ? h.updateFloat2(\"vTangentSpaceParams\", this._invertNormalMapX ? 1 : -1, this._invertNormalMapY ? 1 : -1) : h.updateFloat2(\"vTangentSpaceParams\", this._invertNormalMapX ? -1 : 1, this._invertNormalMapY ? -1 : 1));\n }\n if (this.pointsCloud && h.updateFloat(\"pointSize\", this.pointSize), s.METALLICWORKFLOW) {\n Zr.Color3[0].r = this._metallic === void 0 || this._metallic === null ? 1 : this._metallic, Zr.Color3[0].g = this._roughness === void 0 || this._roughness === null ? 1 : this._roughness, h.updateColor4(\"vReflectivityColor\", Zr.Color3[0], 1);\n const p = ((u = this.subSurface) == null ? void 0 : u._indexOfRefraction) ?? 1.5, g = 1, m = Math.pow((p - g) / (p + g), 2);\n this._metallicReflectanceColor.scaleToRef(m * this._metallicF0Factor, Zr.Color3[0]);\n const v = this._metallicF0Factor;\n h.updateColor4(\"vMetallicReflectanceFactors\", Zr.Color3[0], v);\n } else\n h.updateColor4(\"vReflectivityColor\", this._reflectivityColor, this._microSurface);\n h.updateColor3(\"vEmissiveColor\", ae.EmissiveTextureEnabled ? this._emissiveColor : Ne.BlackReadOnly), h.updateColor3(\"vReflectionColor\", this._reflectionColor), !s.SS_REFRACTION && ((f = this.subSurface) != null && f._linkRefractionWithTransparency) ? h.updateColor4(\"vAlbedoColor\", this._albedoColor, 1) : h.updateColor4(\"vAlbedoColor\", this._albedoColor, this.alpha), this._lightingInfos.x = this._directIntensity, this._lightingInfos.y = this._emissiveIntensity, this._lightingInfos.z = this._environmentIntensity * r.environmentIntensity, this._lightingInfos.w = this._specularIntensity, h.updateVector4(\"vLightingIntensity\", this._lightingInfos), r.ambientColor.multiplyToRef(this._ambientColor, this._globalAmbientColor), h.updateColor3(\"vAmbientColor\", this._globalAmbientColor), h.updateFloat2(\"vDebugMode\", this.debugLimit, this.debugFactor);\n }\n r.texturesEnabled && (this._albedoTexture && ae.DiffuseTextureEnabled && h.setTexture(\"albedoSampler\", this._albedoTexture), this._ambientTexture && ae.AmbientTextureEnabled && h.setTexture(\"ambientSampler\", this._ambientTexture), this._opacityTexture && ae.OpacityTextureEnabled && h.setTexture(\"opacitySampler\", this._opacityTexture), c && ae.ReflectionTextureEnabled && (s.LODBASEDMICROSFURACE ? h.setTexture(\"reflectionSampler\", c) : (h.setTexture(\"reflectionSampler\", c._lodTextureMid || c), h.setTexture(\"reflectionSamplerLow\", c._lodTextureLow || c), h.setTexture(\"reflectionSamplerHigh\", c._lodTextureHigh || c)), s.USEIRRADIANCEMAP && h.setTexture(\"irradianceSampler\", c.irradianceTexture)), s.ENVIRONMENTBRDF && h.setTexture(\"environmentBrdfSampler\", this._environmentBRDFTexture), this._emissiveTexture && ae.EmissiveTextureEnabled && h.setTexture(\"emissiveSampler\", this._emissiveTexture), this._lightmapTexture && ae.LightmapTextureEnabled && h.setTexture(\"lightmapSampler\", this._lightmapTexture), ae.SpecularTextureEnabled && (this._metallicTexture ? h.setTexture(\"reflectivitySampler\", this._metallicTexture) : this._reflectivityTexture && h.setTexture(\"reflectivitySampler\", this._reflectivityTexture), this._metallicReflectanceTexture && h.setTexture(\"metallicReflectanceSampler\", this._metallicReflectanceTexture), this._reflectanceTexture && s.REFLECTANCE && h.setTexture(\"reflectanceSampler\", this._reflectanceTexture), this._microSurfaceTexture && h.setTexture(\"microSurfaceSampler\", this._microSurfaceTexture)), this._bumpTexture && o.getCaps().standardDerivatives && ae.BumpTextureEnabled && !this._disableBumpMap && h.setTexture(\"bumpSampler\", this._bumpTexture)), this.getScene().useOrderIndependentTransparency && this.needAlphaBlendingForMesh(t) && this.getScene().depthPeelingRenderer.bind(a), this._eventInfo.subMesh = i, this._callbackPluginEventBindForSubMesh(this._eventInfo), Fc(this._activeEffect, this, r), this.bindEyePosition(a);\n } else\n r.getEngine()._features.needToAlwaysBindUniformBuffers && (this._needToBindSceneUbo = !0);\n (l || !this.isFrozen) && (r.lightsEnabled && !this._disableLighting && e0(r, t, this._activeEffect, s, this._maxSimultaneousLights), (r.fogEnabled && t.applyFog && r.fogMode !== Ot.FOGMODE_NONE || c || this.subSurface.refractionTexture || t.receiveShadows || s.PREPASS) && this.bindView(a), wc(r, t, this._activeEffect, !0), s.NUM_MORPH_INFLUENCERS && nf(t, this._activeEffect), s.BAKED_VERTEX_ANIMATION_TEXTURE && ((d = t.bakedVertexAnimationManager) == null || d.bind(a, s.INSTANCES)), this._imageProcessingConfiguration.bind(this._activeEffect), Lc(s, this._activeEffect, r)), this._afterBind(t, this._activeEffect, i), h.update();\n }\n /**\n * Returns the animatable textures.\n * If material have animatable metallic texture, then reflectivity texture will not be returned, even if it has animations.\n * @returns - Array of animatable textures.\n */\n getAnimatables() {\n const e = super.getAnimatables();\n return this._albedoTexture && this._albedoTexture.animations && this._albedoTexture.animations.length > 0 && e.push(this._albedoTexture), this._ambientTexture && this._ambientTexture.animations && this._ambientTexture.animations.length > 0 && e.push(this._ambientTexture), this._opacityTexture && this._opacityTexture.animations && this._opacityTexture.animations.length > 0 && e.push(this._opacityTexture), this._reflectionTexture && this._reflectionTexture.animations && this._reflectionTexture.animations.length > 0 && e.push(this._reflectionTexture), this._emissiveTexture && this._emissiveTexture.animations && this._emissiveTexture.animations.length > 0 && e.push(this._emissiveTexture), this._metallicTexture && this._metallicTexture.animations && this._metallicTexture.animations.length > 0 ? e.push(this._metallicTexture) : this._reflectivityTexture && this._reflectivityTexture.animations && this._reflectivityTexture.animations.length > 0 && e.push(this._reflectivityTexture), this._bumpTexture && this._bumpTexture.animations && this._bumpTexture.animations.length > 0 && e.push(this._bumpTexture), this._lightmapTexture && this._lightmapTexture.animations && this._lightmapTexture.animations.length > 0 && e.push(this._lightmapTexture), this._metallicReflectanceTexture && this._metallicReflectanceTexture.animations && this._metallicReflectanceTexture.animations.length > 0 && e.push(this._metallicReflectanceTexture), this._reflectanceTexture && this._reflectanceTexture.animations && this._reflectanceTexture.animations.length > 0 && e.push(this._reflectanceTexture), this._microSurfaceTexture && this._microSurfaceTexture.animations && this._microSurfaceTexture.animations.length > 0 && e.push(this._microSurfaceTexture), e;\n }\n /**\n * Returns the texture used for reflections.\n * @returns - Reflection texture if present. Otherwise, returns the environment texture.\n */\n _getReflectionTexture() {\n return this._reflectionTexture ? this._reflectionTexture : this.getScene().environmentTexture;\n }\n /**\n * Returns an array of the actively used textures.\n * @returns - Array of BaseTextures\n */\n getActiveTextures() {\n const e = super.getActiveTextures();\n return this._albedoTexture && e.push(this._albedoTexture), this._ambientTexture && e.push(this._ambientTexture), this._opacityTexture && e.push(this._opacityTexture), this._reflectionTexture && e.push(this._reflectionTexture), this._emissiveTexture && e.push(this._emissiveTexture), this._reflectivityTexture && e.push(this._reflectivityTexture), this._metallicTexture && e.push(this._metallicTexture), this._metallicReflectanceTexture && e.push(this._metallicReflectanceTexture), this._reflectanceTexture && e.push(this._reflectanceTexture), this._microSurfaceTexture && e.push(this._microSurfaceTexture), this._bumpTexture && e.push(this._bumpTexture), this._lightmapTexture && e.push(this._lightmapTexture), e;\n }\n /**\n * Checks to see if a texture is used in the material.\n * @param texture - Base texture to use.\n * @returns - Boolean specifying if a texture is used in the material.\n */\n hasTexture(e) {\n return !!(super.hasTexture(e) || this._albedoTexture === e || this._ambientTexture === e || this._opacityTexture === e || this._reflectionTexture === e || this._emissiveTexture === e || this._reflectivityTexture === e || this._metallicTexture === e || this._metallicReflectanceTexture === e || this._reflectanceTexture === e || this._microSurfaceTexture === e || this._bumpTexture === e || this._lightmapTexture === e);\n }\n /**\n * Sets the required values to the prepass renderer.\n * It can't be sets when subsurface scattering of this material is disabled.\n * When scene have ability to enable subsurface prepass effect, it will enable.\n * @returns - If prepass is enabled or not.\n */\n setPrePassRenderer() {\n var t;\n if (!((t = this.subSurface) != null && t.isScatteringEnabled))\n return !1;\n const e = this.getScene().enableSubSurfaceForPrePass();\n return e && (e.enabled = !0), !0;\n }\n /**\n * Disposes the resources of the material.\n * @param forceDisposeEffect - Forces the disposal of effects.\n * @param forceDisposeTextures - Forces the disposal of all textures.\n */\n dispose(e, t) {\n var i, r, s, a, o, l, c, h, u, f, d, p;\n t && (this._environmentBRDFTexture && this.getScene().environmentBRDFTexture !== this._environmentBRDFTexture && this._environmentBRDFTexture.dispose(), (i = this._albedoTexture) == null || i.dispose(), (r = this._ambientTexture) == null || r.dispose(), (s = this._opacityTexture) == null || s.dispose(), (a = this._reflectionTexture) == null || a.dispose(), (o = this._emissiveTexture) == null || o.dispose(), (l = this._metallicTexture) == null || l.dispose(), (c = this._reflectivityTexture) == null || c.dispose(), (h = this._bumpTexture) == null || h.dispose(), (u = this._lightmapTexture) == null || u.dispose(), (f = this._metallicReflectanceTexture) == null || f.dispose(), (d = this._reflectanceTexture) == null || d.dispose(), (p = this._microSurfaceTexture) == null || p.dispose()), this._renderTargets.dispose(), this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), super.dispose(e, t);\n }\n}\nNt.PBRMATERIAL_OPAQUE = ie.MATERIAL_OPAQUE;\nNt.PBRMATERIAL_ALPHATEST = ie.MATERIAL_ALPHATEST;\nNt.PBRMATERIAL_ALPHABLEND = ie.MATERIAL_ALPHABLEND;\nNt.PBRMATERIAL_ALPHATESTANDBLEND = ie.MATERIAL_ALPHATESTANDBLEND;\nNt.DEFAULT_AO_ON_ANALYTICAL_LIGHTS = 0;\nNt.LIGHTFALLOFF_PHYSICAL = 0;\nNt.LIGHTFALLOFF_GLTF = 1;\nNt.LIGHTFALLOFF_STANDARD = 2;\nP([\n Iy()\n], Nt.prototype, \"_imageProcessingConfiguration\", void 0);\nP([\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Nt.prototype, \"debugMode\", void 0);\nclass we extends Nt {\n /**\n * Stores the refracted light information in a texture.\n */\n get refractionTexture() {\n return this.subSurface.refractionTexture;\n }\n set refractionTexture(e) {\n this.subSurface.refractionTexture = e, e ? this.subSurface.isRefractionEnabled = !0 : this.subSurface.linkRefractionWithTransparency || (this.subSurface.isRefractionEnabled = !1);\n }\n /**\n * Index of refraction of the material base layer.\n * https://en.wikipedia.org/wiki/List_of_refractive_indices\n *\n * This does not only impact refraction but also the Base F0 of Dielectric Materials.\n *\n * From dielectric fresnel rules: F0 = square((iorT - iorI) / (iorT + iorI))\n */\n get indexOfRefraction() {\n return this.subSurface.indexOfRefraction;\n }\n set indexOfRefraction(e) {\n this.subSurface.indexOfRefraction = e;\n }\n /**\n * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.\n */\n get invertRefractionY() {\n return this.subSurface.invertRefractionY;\n }\n set invertRefractionY(e) {\n this.subSurface.invertRefractionY = e;\n }\n /**\n * This parameters will make the material used its opacity to control how much it is refracting against not.\n * Materials half opaque for instance using refraction could benefit from this control.\n */\n get linkRefractionWithTransparency() {\n return this.subSurface.linkRefractionWithTransparency;\n }\n set linkRefractionWithTransparency(e) {\n this.subSurface.linkRefractionWithTransparency = e, e && (this.subSurface.isRefractionEnabled = !0);\n }\n /**\n * BJS is using an hardcoded light falloff based on a manually sets up range.\n * In PBR, one way to represents the falloff is to use the inverse squared root algorithm.\n * This parameter can help you switch back to the BJS mode in order to create scenes using both materials.\n */\n get usePhysicalLightFalloff() {\n return this._lightFalloff === Nt.LIGHTFALLOFF_PHYSICAL;\n }\n /**\n * BJS is using an hardcoded light falloff based on a manually sets up range.\n * In PBR, one way to represents the falloff is to use the inverse squared root algorithm.\n * This parameter can help you switch back to the BJS mode in order to create scenes using both materials.\n */\n set usePhysicalLightFalloff(e) {\n e !== this.usePhysicalLightFalloff && (this._markAllSubMeshesAsTexturesDirty(), e ? this._lightFalloff = Nt.LIGHTFALLOFF_PHYSICAL : this._lightFalloff = Nt.LIGHTFALLOFF_STANDARD);\n }\n /**\n * In order to support the falloff compatibility with gltf, a special mode has been added\n * to reproduce the gltf light falloff.\n */\n get useGLTFLightFalloff() {\n return this._lightFalloff === Nt.LIGHTFALLOFF_GLTF;\n }\n /**\n * In order to support the falloff compatibility with gltf, a special mode has been added\n * to reproduce the gltf light falloff.\n */\n set useGLTFLightFalloff(e) {\n e !== this.useGLTFLightFalloff && (this._markAllSubMeshesAsTexturesDirty(), e ? this._lightFalloff = Nt.LIGHTFALLOFF_GLTF : this._lightFalloff = Nt.LIGHTFALLOFF_STANDARD);\n }\n /**\n * Gets the image processing configuration used either in this material.\n */\n get imageProcessingConfiguration() {\n return this._imageProcessingConfiguration;\n }\n /**\n * Sets the Default image processing configuration used either in the this material.\n *\n * If sets to null, the scene one is in use.\n */\n set imageProcessingConfiguration(e) {\n this._attachImageProcessingConfiguration(e), this._markAllSubMeshesAsTexturesDirty();\n }\n /**\n * Gets whether the color curves effect is enabled.\n */\n get cameraColorCurvesEnabled() {\n return this.imageProcessingConfiguration.colorCurvesEnabled;\n }\n /**\n * Sets whether the color curves effect is enabled.\n */\n set cameraColorCurvesEnabled(e) {\n this.imageProcessingConfiguration.colorCurvesEnabled = e;\n }\n /**\n * Gets whether the color grading effect is enabled.\n */\n get cameraColorGradingEnabled() {\n return this.imageProcessingConfiguration.colorGradingEnabled;\n }\n /**\n * Gets whether the color grading effect is enabled.\n */\n set cameraColorGradingEnabled(e) {\n this.imageProcessingConfiguration.colorGradingEnabled = e;\n }\n /**\n * Gets whether tonemapping is enabled or not.\n */\n get cameraToneMappingEnabled() {\n return this._imageProcessingConfiguration.toneMappingEnabled;\n }\n /**\n * Sets whether tonemapping is enabled or not\n */\n set cameraToneMappingEnabled(e) {\n this._imageProcessingConfiguration.toneMappingEnabled = e;\n }\n /**\n * The camera exposure used on this material.\n * This property is here and not in the camera to allow controlling exposure without full screen post process.\n * This corresponds to a photographic exposure.\n */\n get cameraExposure() {\n return this._imageProcessingConfiguration.exposure;\n }\n /**\n * The camera exposure used on this material.\n * This property is here and not in the camera to allow controlling exposure without full screen post process.\n * This corresponds to a photographic exposure.\n */\n set cameraExposure(e) {\n this._imageProcessingConfiguration.exposure = e;\n }\n /**\n * Gets The camera contrast used on this material.\n */\n get cameraContrast() {\n return this._imageProcessingConfiguration.contrast;\n }\n /**\n * Sets The camera contrast used on this material.\n */\n set cameraContrast(e) {\n this._imageProcessingConfiguration.contrast = e;\n }\n /**\n * Gets the Color Grading 2D Lookup Texture.\n */\n get cameraColorGradingTexture() {\n return this._imageProcessingConfiguration.colorGradingTexture;\n }\n /**\n * Sets the Color Grading 2D Lookup Texture.\n */\n set cameraColorGradingTexture(e) {\n this._imageProcessingConfiguration.colorGradingTexture = e;\n }\n /**\n * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT).\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\n */\n get cameraColorCurves() {\n return this._imageProcessingConfiguration.colorCurves;\n }\n /**\n * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT).\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\n */\n set cameraColorCurves(e) {\n this._imageProcessingConfiguration.colorCurves = e;\n }\n /**\n * Instantiates a new PBRMaterial instance.\n *\n * @param name The material name\n * @param scene The scene the material will be use in.\n */\n constructor(e, t) {\n super(e, t), this.directIntensity = 1, this.emissiveIntensity = 1, this.environmentIntensity = 1, this.specularIntensity = 1, this.disableBumpMap = !1, this.ambientTextureStrength = 1, this.ambientTextureImpactOnAnalyticalLights = we.DEFAULT_AO_ON_ANALYTICAL_LIGHTS, this.metallicF0Factor = 1, this.metallicReflectanceColor = Ne.White(), this.useOnlyMetallicFromMetallicReflectanceTexture = !1, this.ambientColor = new Ne(0, 0, 0), this.albedoColor = new Ne(1, 1, 1), this.reflectivityColor = new Ne(1, 1, 1), this.reflectionColor = new Ne(1, 1, 1), this.emissiveColor = new Ne(0, 0, 0), this.microSurface = 1, this.useLightmapAsShadowmap = !1, this.useAlphaFromAlbedoTexture = !1, this.forceAlphaTest = !1, this.alphaCutOff = 0.4, this.useSpecularOverAlpha = !0, this.useMicroSurfaceFromReflectivityMapAlpha = !1, this.useRoughnessFromMetallicTextureAlpha = !0, this.useRoughnessFromMetallicTextureGreen = !1, this.useMetallnessFromMetallicTextureBlue = !1, this.useAmbientOcclusionFromMetallicTextureRed = !1, this.useAmbientInGrayScale = !1, this.useAutoMicroSurfaceFromReflectivityMap = !1, this.useRadianceOverAlpha = !0, this.useObjectSpaceNormalMap = !1, this.useParallax = !1, this.useParallaxOcclusion = !1, this.parallaxScaleBias = 0.05, this.disableLighting = !1, this.forceIrradianceInFragment = !1, this.maxSimultaneousLights = 4, this.invertNormalMapX = !1, this.invertNormalMapY = !1, this.twoSidedLighting = !1, this.useAlphaFresnel = !1, this.useLinearAlphaFresnel = !1, this.environmentBRDFTexture = null, this.forceNormalForward = !1, this.enableSpecularAntiAliasing = !1, this.useHorizonOcclusion = !0, this.useRadianceOcclusion = !0, this.unlit = !1, this.applyDecalMapAfterDetailMap = !1, this._environmentBRDFTexture = b0(this.getScene());\n }\n /**\n * @returns the name of this material class.\n */\n getClassName() {\n return \"PBRMaterial\";\n }\n /**\n * Makes a duplicate of the current material.\n * @param name - name to use for the new material.\n * @param cloneTexturesOnlyOnce - if a texture is used in more than one channel (e.g diffuse and opacity), only clone it once and reuse it on the other channels. Default false.\n * @param rootUrl defines the root URL to use to load textures\n * @returns cloned material instance\n */\n clone(e, t = !0, i = \"\") {\n const r = Le.Clone(() => new we(e, this.getScene()), this, { cloneTexturesOnlyOnce: t });\n return r.id = e, r.name = e, this.stencil.copyTo(r.stencil), this._clonePlugins(r, i), r;\n }\n /**\n * Serializes this PBR Material.\n * @returns - An object with the serialized material.\n */\n serialize() {\n const e = super.serialize();\n return e.customType = \"BABYLON.PBRMaterial\", e;\n }\n // Statics\n /**\n * Parses a PBR Material from a serialized object.\n * @param source - Serialized object.\n * @param scene - BJS scene instance.\n * @param rootUrl - url for the scene object\n * @returns - PBRMaterial\n */\n static Parse(e, t, i) {\n const r = Le.Parse(() => new we(e.name, t), e, t, i);\n return e.stencil && r.stencil.parse(e.stencil, t, i), ie._ParsePlugins(e, r, t, i), e.clearCoat && r.clearCoat.parse(e.clearCoat, t, i), e.anisotropy && r.anisotropy.parse(e.anisotropy, t, i), e.brdf && r.brdf.parse(e.brdf, t, i), e.sheen && r.sheen.parse(e.sheen, t, i), e.subSurface && r.subSurface.parse(e.subSurface, t, i), e.iridescence && r.iridescence.parse(e.iridescence, t, i), r;\n }\n}\nwe.PBRMATERIAL_OPAQUE = Nt.PBRMATERIAL_OPAQUE;\nwe.PBRMATERIAL_ALPHATEST = Nt.PBRMATERIAL_ALPHATEST;\nwe.PBRMATERIAL_ALPHABLEND = Nt.PBRMATERIAL_ALPHABLEND;\nwe.PBRMATERIAL_ALPHATESTANDBLEND = Nt.PBRMATERIAL_ALPHATESTANDBLEND;\nwe.DEFAULT_AO_ON_ANALYTICAL_LIGHTS = Nt.DEFAULT_AO_ON_ANALYTICAL_LIGHTS;\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"directIntensity\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"emissiveIntensity\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"environmentIntensity\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"specularIntensity\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"disableBumpMap\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"albedoTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"ambientTexture\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"ambientTextureStrength\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"ambientTextureImpactOnAnalyticalLights\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], we.prototype, \"opacityTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"reflectionTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"emissiveTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"reflectivityTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"metallicTexture\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"metallic\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"roughness\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"metallicF0Factor\", void 0);\nP([\n $i(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"metallicReflectanceColor\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useOnlyMetallicFromMetallicReflectanceTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"metallicReflectanceTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"reflectanceTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"microSurfaceTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"bumpTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\", null)\n], we.prototype, \"lightmapTexture\", void 0);\nP([\n $i(\"ambient\"),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"ambientColor\", void 0);\nP([\n $i(\"albedo\"),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"albedoColor\", void 0);\nP([\n $i(\"reflectivity\"),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"reflectivityColor\", void 0);\nP([\n $i(\"reflection\"),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"reflectionColor\", void 0);\nP([\n $i(\"emissive\"),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"emissiveColor\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"microSurface\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useLightmapAsShadowmap\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], we.prototype, \"useAlphaFromAlbedoTexture\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], we.prototype, \"forceAlphaTest\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], we.prototype, \"alphaCutOff\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useSpecularOverAlpha\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useMicroSurfaceFromReflectivityMapAlpha\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useRoughnessFromMetallicTextureAlpha\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useRoughnessFromMetallicTextureGreen\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useMetallnessFromMetallicTextureBlue\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useAmbientOcclusionFromMetallicTextureRed\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useAmbientInGrayScale\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useAutoMicroSurfaceFromReflectivityMap\", void 0);\nP([\n U()\n], we.prototype, \"usePhysicalLightFalloff\", null);\nP([\n U()\n], we.prototype, \"useGLTFLightFalloff\", null);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useRadianceOverAlpha\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useObjectSpaceNormalMap\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useParallax\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useParallaxOcclusion\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"parallaxScaleBias\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsLightsDirty\")\n], we.prototype, \"disableLighting\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"forceIrradianceInFragment\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsLightsDirty\")\n], we.prototype, \"maxSimultaneousLights\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"invertNormalMapX\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"invertNormalMapY\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"twoSidedLighting\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useAlphaFresnel\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useLinearAlphaFresnel\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"environmentBRDFTexture\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"forceNormalForward\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"enableSpecularAntiAliasing\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useHorizonOcclusion\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useRadianceOcclusion\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], we.prototype, \"unlit\", void 0);\nP([\n U(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], we.prototype, \"applyDecalMapAfterDetailMap\", void 0);\nRe(\"BABYLON.PBRMaterial\", we);\nDe.prototype.updateRawTexture = function(n, e, t, i, r = null, s = 0, a = !1) {\n if (!n)\n return;\n const o = this._getRGBABufferInternalSizedFormat(s, t, a), l = this._getInternalFormat(t), c = this._getWebGLTextureType(s);\n this._bindTextureDirectly(this._gl.TEXTURE_2D, n, !0), this._unpackFlipY(i === void 0 ? !0 : !!i), this._doNotHandleContextLost || (n._bufferView = e, n.format = t, n.type = s, n.invertY = i, n._compression = r), n.width % 4 !== 0 && this._gl.pixelStorei(this._gl.UNPACK_ALIGNMENT, 1), r && e ? this._gl.compressedTexImage2D(this._gl.TEXTURE_2D, 0, this.getCaps().s3tc[r], n.width, n.height, 0, e) : this._gl.texImage2D(this._gl.TEXTURE_2D, 0, o, n.width, n.height, 0, l, c, e), n.generateMipMaps && this._gl.generateMipmap(this._gl.TEXTURE_2D), this._bindTextureDirectly(this._gl.TEXTURE_2D, null), n.isReady = !0;\n};\nDe.prototype.createRawTexture = function(n, e, t, i, r, s, a, o = null, l = 0, c = 0, h = !1) {\n const u = new ar(this, Dt.Raw);\n u.baseWidth = e, u.baseHeight = t, u.width = e, u.height = t, u.format = i, u.generateMipMaps = r, u.samplingMode = a, u.invertY = s, u._compression = o, u.type = l, u._useSRGBBuffer = this._getUseSRGBBuffer(h, !r), this._doNotHandleContextLost || (u._bufferView = n), this.updateRawTexture(u, n, i, s, o, l, u._useSRGBBuffer), this._bindTextureDirectly(this._gl.TEXTURE_2D, u, !0);\n const f = this._getSamplingParameters(a, r);\n return this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, f.mag), this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, f.min), r && this._gl.generateMipmap(this._gl.TEXTURE_2D), this._bindTextureDirectly(this._gl.TEXTURE_2D, null), this._internalTexturesCache.push(u), u;\n};\nDe.prototype.createRawCubeTexture = function(n, e, t, i, r, s, a, o = null) {\n const l = this._gl, c = new ar(this, Dt.CubeRaw);\n c.isCube = !0, c.format = t, c.type = i, this._doNotHandleContextLost || (c._bufferViewArray = n);\n const h = this._getWebGLTextureType(i);\n let u = this._getInternalFormat(t);\n u === l.RGB && (u = l.RGBA), h === l.FLOAT && !this._caps.textureFloatLinearFiltering ? (r = !1, a = 1, ne.Warn(\"Float texture filtering is not supported. Mipmap generation and sampling mode are forced to false and TEXTURE_NEAREST_SAMPLINGMODE, respectively.\")) : h === this._gl.HALF_FLOAT_OES && !this._caps.textureHalfFloatLinearFiltering ? (r = !1, a = 1, ne.Warn(\"Half float texture filtering is not supported. Mipmap generation and sampling mode are forced to false and TEXTURE_NEAREST_SAMPLINGMODE, respectively.\")) : h === l.FLOAT && !this._caps.textureFloatRender ? (r = !1, ne.Warn(\"Render to float textures is not supported. Mipmap generation forced to false.\")) : h === l.HALF_FLOAT && !this._caps.colorBufferFloat && (r = !1, ne.Warn(\"Render to half float textures is not supported. Mipmap generation forced to false.\"));\n const f = e, d = f;\n if (c.width = f, c.height = d, c.invertY = s, c._compression = o, !this.needPOTTextures || mo(c.width) && mo(c.height) || (r = !1), n)\n this.updateRawCubeTexture(c, n, t, i, s, o);\n else {\n const m = this._getRGBABufferInternalSizedFormat(i), v = 0;\n this._bindTextureDirectly(l.TEXTURE_CUBE_MAP, c, !0);\n for (let E = 0; E < 6; E++)\n o ? l.compressedTexImage2D(l.TEXTURE_CUBE_MAP_POSITIVE_X + E, v, this.getCaps().s3tc[o], c.width, c.height, 0, void 0) : l.texImage2D(l.TEXTURE_CUBE_MAP_POSITIVE_X + E, v, m, c.width, c.height, 0, u, h, null);\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null);\n }\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, c, !0), n && r && this._gl.generateMipmap(this._gl.TEXTURE_CUBE_MAP);\n const g = this._getSamplingParameters(a, r);\n return l.texParameteri(l.TEXTURE_CUBE_MAP, l.TEXTURE_MAG_FILTER, g.mag), l.texParameteri(l.TEXTURE_CUBE_MAP, l.TEXTURE_MIN_FILTER, g.min), l.texParameteri(l.TEXTURE_CUBE_MAP, l.TEXTURE_WRAP_S, l.CLAMP_TO_EDGE), l.texParameteri(l.TEXTURE_CUBE_MAP, l.TEXTURE_WRAP_T, l.CLAMP_TO_EDGE), this._bindTextureDirectly(l.TEXTURE_CUBE_MAP, null), c.generateMipMaps = r, c.samplingMode = a, c.isReady = !0, c;\n};\nDe.prototype.updateRawCubeTexture = function(n, e, t, i, r, s = null, a = 0) {\n n._bufferViewArray = e, n.format = t, n.type = i, n.invertY = r, n._compression = s;\n const o = this._gl, l = this._getWebGLTextureType(i);\n let c = this._getInternalFormat(t);\n const h = this._getRGBABufferInternalSizedFormat(i);\n let u = !1;\n c === o.RGB && (c = o.RGBA, u = !0), this._bindTextureDirectly(o.TEXTURE_CUBE_MAP, n, !0), this._unpackFlipY(r === void 0 ? !0 : !!r), n.width % 4 !== 0 && o.pixelStorei(o.UNPACK_ALIGNMENT, 1);\n for (let d = 0; d < 6; d++) {\n let p = e[d];\n s ? o.compressedTexImage2D(o.TEXTURE_CUBE_MAP_POSITIVE_X + d, a, this.getCaps().s3tc[s], n.width, n.height, 0, p) : (u && (p = A0(p, n.width, n.height, i)), o.texImage2D(o.TEXTURE_CUBE_MAP_POSITIVE_X + d, a, h, n.width, n.height, 0, c, l, p));\n }\n (!this.needPOTTextures || mo(n.width) && mo(n.height)) && n.generateMipMaps && a === 0 && this._gl.generateMipmap(this._gl.TEXTURE_CUBE_MAP), this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null), n.isReady = !0;\n};\nDe.prototype.createRawCubeTextureFromUrl = function(n, e, t, i, r, s, a, o, l = null, c = null, h = 3, u = !1) {\n const f = this._gl, d = this.createRawCubeTexture(null, t, i, r, !s, u, h, null);\n e == null || e.addPendingData(d), d.url = n, d.isReady = !1, this._internalTexturesCache.push(d);\n const p = (m, v) => {\n e == null || e.removePendingData(d), c && m && c(m.status + \" \" + m.statusText, v);\n }, g = (m) => {\n const v = d.width, E = a(m);\n if (E) {\n if (o) {\n const C = this._getWebGLTextureType(r);\n let T = this._getInternalFormat(i);\n const R = this._getRGBABufferInternalSizedFormat(r);\n let x = !1;\n T === f.RGB && (T = f.RGBA, x = !0), this._bindTextureDirectly(f.TEXTURE_CUBE_MAP, d, !0), this._unpackFlipY(!1);\n const S = o(E);\n for (let M = 0; M < S.length; M++) {\n const N = v >> M;\n for (let F = 0; F < 6; F++) {\n let L = S[M][F];\n x && (L = A0(L, N, N, r)), f.texImage2D(F, M, R, N, N, 0, T, C, L);\n }\n }\n this._bindTextureDirectly(f.TEXTURE_CUBE_MAP, null);\n } else\n this.updateRawCubeTexture(d, E, i, r, u);\n d.isReady = !0, e == null || e.removePendingData(d), d.onLoadedObservable.notifyObservers(d), d.onLoadedObservable.clear(), l && l();\n }\n };\n return this._loadFile(n, (m) => {\n g(m);\n }, void 0, e == null ? void 0 : e.offlineProvider, !0, p), d;\n};\nfunction A0(n, e, t, i) {\n let r, s = 1;\n i === 1 ? r = new Float32Array(e * t * 4) : i === 2 ? (r = new Uint16Array(e * t * 4), s = 15360) : i === 7 ? r = new Uint32Array(e * t * 4) : r = new Uint8Array(e * t * 4);\n for (let a = 0; a < e; a++)\n for (let o = 0; o < t; o++) {\n const l = (o * e + a) * 3, c = (o * e + a) * 4;\n r[c + 0] = n[l + 0], r[c + 1] = n[l + 1], r[c + 2] = n[l + 2], r[c + 3] = s;\n }\n return r;\n}\nfunction M0(n) {\n return function(e, t, i, r, s, a, o, l, c = null, h = 0) {\n const u = n ? this._gl.TEXTURE_3D : this._gl.TEXTURE_2D_ARRAY, f = n ? Dt.Raw3D : Dt.Raw2DArray, d = new ar(this, f);\n d.baseWidth = t, d.baseHeight = i, d.baseDepth = r, d.width = t, d.height = i, d.depth = r, d.format = s, d.type = h, d.generateMipMaps = a, d.samplingMode = l, n ? d.is3D = !0 : d.is2DArray = !0, this._doNotHandleContextLost || (d._bufferView = e), n ? this.updateRawTexture3D(d, e, s, o, c, h) : this.updateRawTexture2DArray(d, e, s, o, c, h), this._bindTextureDirectly(u, d, !0);\n const p = this._getSamplingParameters(l, a);\n return this._gl.texParameteri(u, this._gl.TEXTURE_MAG_FILTER, p.mag), this._gl.texParameteri(u, this._gl.TEXTURE_MIN_FILTER, p.min), a && this._gl.generateMipmap(u), this._bindTextureDirectly(u, null), this._internalTexturesCache.push(d), d;\n };\n}\nDe.prototype.createRawTexture2DArray = M0(!1);\nDe.prototype.createRawTexture3D = M0(!0);\nfunction P0(n) {\n return function(e, t, i, r, s = null, a = 0) {\n const o = n ? this._gl.TEXTURE_3D : this._gl.TEXTURE_2D_ARRAY, l = this._getWebGLTextureType(a), c = this._getInternalFormat(i), h = this._getRGBABufferInternalSizedFormat(a, i);\n this._bindTextureDirectly(o, e, !0), this._unpackFlipY(r === void 0 ? !0 : !!r), this._doNotHandleContextLost || (e._bufferView = t, e.format = i, e.invertY = r, e._compression = s), e.width % 4 !== 0 && this._gl.pixelStorei(this._gl.UNPACK_ALIGNMENT, 1), s && t ? this._gl.compressedTexImage3D(o, 0, this.getCaps().s3tc[s], e.width, e.height, e.depth, 0, t) : this._gl.texImage3D(o, 0, h, e.width, e.height, e.depth, 0, c, l, t), e.generateMipMaps && this._gl.generateMipmap(o), this._bindTextureDirectly(o, null), e.isReady = !0;\n };\n}\nDe.prototype.updateRawTexture2DArray = P0(!1);\nDe.prototype.updateRawTexture3D = P0(!0);\nclass rr extends le {\n /**\n * Instantiates a new RawTexture.\n * Raw texture can help creating a texture directly from an array of data.\n * This can be super useful if you either get the data from an uncompressed source or\n * if you wish to create your texture pixel by pixel.\n * @param data define the array of data to use to create the texture (null to create an empty texture)\n * @param width define the width of the texture\n * @param height define the height of the texture\n * @param format define the format of the data (RGB, RGBA... Engine.TEXTUREFORMAT_xxx)\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps define whether mip maps should be generated or not\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\n */\n constructor(e, t, i, r, s, a = !0, o = !1, l = 3, c = 0, h, u) {\n super(null, s, !a, o, void 0, void 0, void 0, void 0, void 0, void 0, void 0, void 0, h), this.format = r, this._engine && (!this._engine._caps.textureFloatLinearFiltering && c === 1 && (l = 1), !this._engine._caps.textureHalfFloatLinearFiltering && c === 2 && (l = 1), this._texture = this._engine.createRawTexture(e, t, i, r, a, o, l, null, c, h ?? 0, u ?? !1), this.wrapU = le.CLAMP_ADDRESSMODE, this.wrapV = le.CLAMP_ADDRESSMODE);\n }\n /**\n * Updates the texture underlying data.\n * @param data Define the new data of the texture\n */\n update(e) {\n this._getEngine().updateRawTexture(this._texture, e, this._texture.format, this._texture.invertY, null, this._texture.type, this._texture._useSRGBBuffer);\n }\n /**\n * Creates a luminance texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @returns the luminance texture\n */\n static CreateLuminanceTexture(e, t, i, r, s = !0, a = !1, o = 3) {\n return new rr(e, t, i, 1, r, s, a, o);\n }\n /**\n * Creates a luminance alpha texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @returns the luminance alpha texture\n */\n static CreateLuminanceAlphaTexture(e, t, i, r, s = !0, a = !1, o = 3) {\n return new rr(e, t, i, 2, r, s, a, o);\n }\n /**\n * Creates an alpha texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @returns the alpha texture\n */\n static CreateAlphaTexture(e, t, i, r, s = !0, a = !1, o = 3) {\n return new rr(e, t, i, 0, r, s, a, o);\n }\n /**\n * Creates a RGB texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\n * @returns the RGB alpha texture\n */\n static CreateRGBTexture(e, t, i, r, s = !0, a = !1, o = 3, l = 0, c = 0, h = !1) {\n return new rr(e, t, i, 4, r, s, a, o, l, c, h);\n }\n /**\n * Creates a RGBA texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\n * @returns the RGBA texture\n */\n static CreateRGBATexture(e, t, i, r, s = !0, a = !1, o = 3, l = 0, c = 0, h = !1) {\n return new rr(e, t, i, 5, r, s, a, o, l, c, h);\n }\n /**\n * Creates a RGBA storage texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\n * @returns the RGBA texture\n */\n static CreateRGBAStorageTexture(e, t, i, r, s = !0, a = !1, o = 3, l = 0, c = !1) {\n return new rr(e, t, i, 5, r, s, a, o, l, 1, c);\n }\n /**\n * Creates a R texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)\n * @returns the R texture\n */\n static CreateRTexture(e, t, i, r, s = !0, a = !1, o = le.TRILINEAR_SAMPLINGMODE, l = 1) {\n return new rr(e, t, i, 6, r, s, a, o, l);\n }\n /**\n * Creates a R storage texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)\n * @returns the R texture\n */\n static CreateRStorageTexture(e, t, i, r, s = !0, a = !1, o = le.TRILINEAR_SAMPLINGMODE, l = 1) {\n return new rr(e, t, i, 6, r, s, a, o, l, 1);\n }\n}\nclass wi {\n}\nwi.DEFAULT_COLOR = Ne.White();\nwi.DEFAULT_WIDTH_ATTENUATED = 1;\nwi.DEFAULT_WIDTH = 0.1;\nclass _t {\n /**\n * Converts GreasedLinePoints to number[][]\n * @param points GreasedLinePoints\n * @returns number[][] with x, y, z coordinates of the points, like [[x, y, z, x, y, z, ...], [x, y, z, ...]]\n */\n static ConvertPoints(e) {\n if (e.length && Array.isArray(e) && typeof e[0] == \"number\")\n return [e];\n if (e.length && Array.isArray(e[0]) && typeof e[0][0] == \"number\")\n return e;\n if (e.length && !Array.isArray(e[0]) && e[0] instanceof _) {\n const t = [];\n for (let i = 0; i < e.length; i++) {\n const r = e[i];\n t.push(r.x, r.y, r.z);\n }\n return [t];\n } else if (e.length > 0 && Array.isArray(e[0]) && e[0].length > 0 && e[0][0] instanceof _) {\n const t = [];\n return e.forEach((r) => {\n t.push(r.flatMap((s) => [s.x, s.y, s.z]));\n }), t;\n } else {\n if (e instanceof Float32Array)\n return [Array.from(e)];\n if (e.length && e[0] instanceof Float32Array) {\n const t = [];\n return e.forEach((i) => {\n t.push(Array.from(i));\n }), t;\n }\n }\n return [];\n }\n /**\n * Omit zero length lines predicate for the MeshesToLines function\n * @param p1 point1 position of the face\n * @param p2 point2 position of the face\n * @param p3 point3 position of the face\n * @returns original points or null if any edge length is zero\n */\n static OmitZeroLengthPredicate(e, t, i) {\n const r = [];\n return t.subtract(e).lengthSquared() > 0 && r.push([e, t]), i.subtract(t).lengthSquared() > 0 && r.push([t, i]), e.subtract(i).lengthSquared() > 0 && r.push([i, e]), r.length === 0 ? null : r;\n }\n /**\n * Omit duplicate lines predicate for the MeshesToLines function\n * @param p1 point1 position of the face\n * @param p2 point2 position of the face\n * @param p3 point3 position of the face\n * @param points array of points to search in\n * @returns original points or null if any edge length is zero\n */\n static OmitDuplicatesPredicate(e, t, i, r) {\n const s = [];\n return _t._SearchInPoints(e, t, r) || s.push([e, t]), _t._SearchInPoints(t, i, r) || s.push([t, i]), _t._SearchInPoints(i, e, r) || s.push([i, e]), s.length === 0 ? null : s;\n }\n static _SearchInPoints(e, t, i) {\n var r, s, a;\n for (const o of i)\n for (let l = 0; l < o.length; l++)\n if ((r = o[l]) != null && r.equals(e) && ((s = o[l + 1]) != null && s.equals(t) || (a = o[l - 1]) != null && a.equals(t)))\n return !0;\n return !1;\n }\n /**\n * Gets mesh triangles as line positions\n * @param meshes array of meshes\n * @param predicate predicate function which decides whether to include the mesh triangle/face in the ouput\n * @returns array of arrays of points\n */\n static MeshesToLines(e, t) {\n const i = [];\n return e.forEach((r, s) => {\n const a = r.getVerticesData(I.PositionKind), o = r.getIndices();\n if (a && o)\n for (let l = 0, c = 0; l < o.length; l++) {\n const h = o[c++] * 3, u = o[c++] * 3, f = o[c++] * 3, d = new _(a[h], a[h + 1], a[h + 2]), p = new _(a[u], a[u + 1], a[u + 2]), g = new _(a[f], a[f + 1], a[f + 2]);\n if (t) {\n const m = t(d, p, g, i, l, h, r, s, a, o);\n if (m)\n for (const v of m)\n i.push(v);\n } else\n i.push([d, p], [p, g], [g, d]);\n }\n }), i;\n }\n /**\n * Converts number coordinates to Vector3s\n * @param points number array of x, y, z, x, y z, ... coordinates\n * @returns Vector3 array\n */\n static ToVector3Array(e) {\n if (Array.isArray(e[0])) {\n const r = [], s = e;\n for (const a of s) {\n const o = [];\n for (let l = 0; l < a.length; l += 3)\n o.push(new _(a[l], a[l + 1], a[l + 2]));\n r.push(o);\n }\n return r;\n }\n const t = e, i = [];\n for (let r = 0; r < t.length; r += 3)\n i.push(new _(t[r], t[r + 1], t[r + 2]));\n return i;\n }\n /**\n * Gets a number array from a Vector3 array.\n * You can you for example to convert your Vector3[] offsets to the required number[] for the offsets option.\n * @param points Vector3 array\n * @returns an array of x, y, z coordinates as numbers [x, y, z, x, y, z, x, y, z, ....]\n */\n static ToNumberArray(e) {\n return e.flatMap((t) => [t.x, t.y, t.z]);\n }\n /**\n * Calculates the sum of points of every line and the number of points in each line.\n * This function is useful when you are drawing multiple lines in one mesh and you want\n * to know the counts. For example for creating an offsets table.\n * @param points point array\n * @returns points count info\n */\n static GetPointsCountInfo(e) {\n const t = new Array(e.length);\n let i = 0;\n for (let r = e.length; r--; )\n t[r] = e[r].length / 3, i += t[r];\n return { total: i, counts: t };\n }\n /**\n * Gets the length of the line counting all it's segments length\n * @param data array of line points\n * @returns length of the line\n */\n static GetLineLength(e) {\n if (e.length === 0)\n return 0;\n let t;\n typeof e[0] == \"number\" ? t = _t.ToVector3Array(e) : t = e;\n const i = z.Vector3[0];\n let r = 0;\n for (let s = 0; s < t.length - 1; s++) {\n const a = t[s], o = t[s + 1];\n r += o.subtractToRef(a, i).length();\n }\n return r;\n }\n /**\n * Gets the the length from the beginning to each point of the line as array.\n * @param data array of line points\n * @returns length array of the line\n */\n static GetLineLengthArray(e) {\n const t = new Float32Array(e.length / 3);\n let i = 0;\n for (let r = 0, s = e.length / 3 - 1; r < s; r++) {\n let a = e[r * 3 + 0], o = e[r * 3 + 1], l = e[r * 3 + 2];\n a -= e[r * 3 + 3], o -= e[r * 3 + 4], l -= e[r * 3 + 5];\n const c = Math.sqrt(a * a + o * o + l * l);\n i += c, t[r + 1] = i;\n }\n return t;\n }\n /**\n * Divides a segment into smaller segments.\n * A segment is a part of the line between it's two points.\n * @param point1 first point of the line\n * @param point2 second point of the line\n * @param segmentCount number of segments we want to have in the divided line\n * @returns\n */\n static SegmentizeSegmentByCount(e, t, i) {\n const r = [], s = t.subtract(e), a = z.Vector3[0];\n a.setAll(i);\n const o = z.Vector3[1];\n s.divideToRef(a, o);\n let l = e.clone();\n r.push(l);\n for (let c = 0; c < i; c++)\n l = l.clone(), r.push(l.addInPlace(o));\n return r;\n }\n /**\n * Divides a line into segments.\n * A segment is a part of the line between it's two points.\n * @param what line points\n * @param segmentLength length of each segment of the resulting line (distance between two line points)\n * @returns line point\n */\n static SegmentizeLineBySegmentLength(e, t) {\n const i = e[0] instanceof _ ? _t.GetLineSegments(e) : typeof e[0] == \"number\" ? _t.GetLineSegments(_t.ToVector3Array(e)) : e, r = [];\n return i.forEach((s) => {\n s.length > t ? _t.SegmentizeSegmentByCount(s.point1, s.point2, Math.ceil(s.length / t)).forEach((o) => {\n r.push(o);\n }) : (r.push(s.point1), r.push(s.point2));\n }), r;\n }\n /**\n * Divides a line into segments.\n * A segment is a part of the line between it's two points.\n * @param what line points\n * @param segmentCount number of segments\n * @returns line point\n */\n static SegmentizeLineBySegmentCount(e, t) {\n const i = typeof e[0] == \"number\" ? _t.ToVector3Array(e) : e, r = _t.GetLineLength(i) / t;\n return _t.SegmentizeLineBySegmentLength(i, r);\n }\n /**\n * Gets line segments.\n * A segment is a part of the line between it's two points.\n * @param points line points\n * @returns segments information of the line segment including starting point, ending point and the distance between them\n */\n static GetLineSegments(e) {\n const t = [];\n for (let i = 0; i < e.length - 1; i++) {\n const r = e[i], s = e[i + 1], a = s.subtract(r).length();\n t.push({ point1: r, point2: s, length: a });\n }\n return t;\n }\n /**\n * Gets the minimum and the maximum length of a line segment in the line.\n * A segment is a part of the line between it's two points.\n * @param points line points\n * @returns\n */\n static GetMinMaxSegmentLength(e) {\n const i = _t.GetLineSegments(e).sort((r) => r.length);\n return {\n min: i[0].length,\n max: i[i.length - 1].length\n };\n }\n /**\n * Finds the last visible position in world space of the line according to the visibility parameter\n * @param lineSegments segments of the line\n * @param lineLength total length of the line\n * @param visbility normalized value of visibility\n * @param localSpace if true the result will be in local space (default is false)\n * @returns world space coordinate of the last visible piece of the line\n */\n static GetPositionOnLineByVisibility(e, t, i, r = !1) {\n const s = t * i;\n let a = 0, o = 0;\n const l = e.length;\n for (let h = 0; h < l; h++) {\n if (s <= a + e[h].length) {\n o = h;\n break;\n }\n a += e[h].length;\n }\n const c = (s - a) / e[o].length;\n return e[o].point2.subtractToRef(e[o].point1, z.Vector3[0]), z.Vector3[1] = z.Vector3[0].multiplyByFloats(c, c, c), r || z.Vector3[1].addInPlace(e[o].point1), z.Vector3[1].clone();\n }\n /**\n * Creates lines in a shape of circle/arc.\n * A segment is a part of the line between it's two points.\n * @param radiusX radiusX of the circle\n * @param segments number of segments in the circle\n * @param z z coordinate of the points. Defaults to 0.\n * @param radiusY radiusY of the circle - you can draw an oval if using different values\n * @param segmentAngle angle offset of the segments. Defaults to Math.PI * 2 / segments. Change this value to draw a part of the circle.\n * @returns line points\n */\n static GetCircleLinePoints(e, t, i = 0, r = e, s = Math.PI * 2 / t) {\n const a = [];\n for (let o = 0; o <= t; o++)\n a.push(new _(Math.cos(o * s) * e, Math.sin(o * s) * r, i));\n return a;\n }\n /**\n * Gets line points in a shape of a bezier curve\n * @param p0 bezier point0\n * @param p1 bezier point1\n * @param p2 bezier point2\n * @param segments number of segments in the curve\n * @returns\n */\n static GetBezierLinePoints(e, t, i, r) {\n return Os.CreateQuadraticBezier(e, t, i, r).getPoints().flatMap((s) => [s.x, s.y, s.z]);\n }\n /**\n *\n * @param position position of the arrow cap (mainly you want to create a triangle, set widthUp and widthDown to the same value and omit widthStartUp and widthStartDown)\n * @param direction direction which the arrow points to\n * @param length length (size) of the arrow cap itself\n * @param widthUp the arrow width above the line\n * @param widthDown the arrow width belove the line\n * @param widthStartUp the arrow width at the start of the arrow above the line. In most scenarios this is 0.\n * @param widthStartDown the arrow width at the start of the arrow below the line. In most scenarios this is 0.\n * @returns\n */\n static GetArrowCap(e, t, i, r, s, a = 0, o = 0) {\n return {\n points: [e.clone(), e.add(t.multiplyByFloats(i, i, i))],\n widths: [r, s, a, o]\n };\n }\n /**\n * Gets 3D positions of points from a text and font\n * @param text Text\n * @param size Size of the font\n * @param resolution Resolution of the font\n * @param fontData defines the font data (can be generated with http://gero3.github.io/facetype.js/)\n * @param z z coordinate\n * @param includeInner include the inner parts of the font in the result. Default true. If false, only the outlines will be returned.\n * @returns number[][] of 3D positions\n */\n static GetPointsFromText(e, t, i, r, s = 0, a = !0) {\n const o = [], l = jb(e, t, i, r);\n for (const c of l) {\n for (const h of c.paths) {\n const u = [], f = h.getPoints();\n for (const d of f)\n u.push(d.x, d.y, s);\n o.push(u);\n }\n if (a)\n for (const h of c.holes) {\n const u = [], f = h.getPoints();\n for (const d of f)\n u.push(d.x, d.y, s);\n o.push(u);\n }\n }\n return o;\n }\n /**\n * Converts an array of Color3 to Uint8Array\n * @param colors Arrray of Color3\n * @returns Uin8Array of colors [r, g, b, a, r, g, b, a, ...]\n */\n static Color3toRGBAUint8(e) {\n const t = new Uint8Array(e.length * 4);\n for (let i = 0, r = 0; i < e.length; i++)\n t[r++] = e[i].r * 255, t[r++] = e[i].g * 255, t[r++] = e[i].b * 255, t[r++] = 255;\n return t;\n }\n /**\n * Creates a RawTexture from an RGBA color array and sets it on the plugin material instance.\n * @param name name of the texture\n * @param colors Uint8Array of colors\n * @param colorsSampling sampling mode of the created texture\n * @param scene Scene\n * @returns the colors texture\n */\n static CreateColorsTexture(e, t, i, r) {\n const s = _t.Color3toRGBAUint8(t), a = new rr(s, t.length, 1, se.TEXTUREFORMAT_RGBA, r, !1, !0, i);\n return a.name = e, a;\n }\n /**\n * A minimum size texture for the colors sampler2D when there is no colors texture defined yet.\n * For fast switching using the useColors property without the need to use defines.\n * @param scene Scene\n * @returns empty colors texture\n */\n static PrepareEmptyColorsTexture(e) {\n if (!wi.EmptyColorsTexture) {\n const t = new Uint8Array(4);\n wi.EmptyColorsTexture = new rr(t, 1, 1, se.TEXTUREFORMAT_RGBA, e, !1, !1, rr.NEAREST_NEAREST), wi.EmptyColorsTexture.name = \"grlEmptyColorsTexture\";\n }\n return wi.EmptyColorsTexture;\n }\n /**\n * Diposes the shared empty colors texture\n */\n static DisposeEmptyColorsTexture() {\n var e;\n (e = wi.EmptyColorsTexture) == null || e.dispose(), wi.EmptyColorsTexture = null;\n }\n /**\n * Converts boolean to number.\n * @param bool the bool value\n * @returns 1 if true, 0 if false.\n */\n static BooleanToNumber(e) {\n return e ? 1 : 0;\n }\n}\nvar _g;\n(function(n) {\n n[n.MATERIAL_TYPE_STANDARD = 0] = \"MATERIAL_TYPE_STANDARD\", n[n.MATERIAL_TYPE_PBR = 1] = \"MATERIAL_TYPE_PBR\", n[n.MATERIAL_TYPE_SIMPLE = 2] = \"MATERIAL_TYPE_SIMPLE\";\n})(_g || (_g = {}));\nvar Tr;\n(function(n) {\n n[n.COLOR_MODE_SET = 0] = \"COLOR_MODE_SET\", n[n.COLOR_MODE_ADD = 1] = \"COLOR_MODE_ADD\", n[n.COLOR_MODE_MULTIPLY = 2] = \"COLOR_MODE_MULTIPLY\";\n})(Tr || (Tr = {}));\nvar ws;\n(function(n) {\n n[n.COLOR_DISTRIBUTION_TYPE_SEGMENT = 0] = \"COLOR_DISTRIBUTION_TYPE_SEGMENT\", n[n.COLOR_DISTRIBUTION_TYPE_LINE = 1] = \"COLOR_DISTRIBUTION_TYPE_LINE\";\n})(ws || (ws = {}));\nclass DP extends es {\n constructor() {\n super(...arguments), this.GREASED_LINE_HAS_COLOR = !1, this.GREASED_LINE_SIZE_ATTENUATION = !1, this.GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE = !1, this.GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM = !1, this.GREASED_LINE_CAMERA_FACING = !0;\n }\n}\nclass Nn extends wr {\n /**\n * Creates a new instance of the GreasedLinePluginMaterial\n * @param material base material for the plugin\n * @param scene the scene\n * @param options plugin options\n */\n constructor(e, t, i) {\n i = i || {\n color: wi.DEFAULT_COLOR\n };\n const r = new DP();\n r.GREASED_LINE_HAS_COLOR = !!i.color && !i.useColors, r.GREASED_LINE_SIZE_ATTENUATION = i.sizeAttenuation ?? !1, r.GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE = i.colorDistributionType === ws.COLOR_DISTRIBUTION_TYPE_LINE, r.GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM = (t ?? e.getScene()).useRightHandedSystem, r.GREASED_LINE_CAMERA_FACING = i.cameraFacing ?? !0, super(e, Nn.GREASED_LINE_MATERIAL_NAME, 200, r), this.colorsTexture = null, this._scene = t ?? e.getScene(), this._engine = this._scene.getEngine(), this._cameraFacing = i.cameraFacing ?? !0, this.visibility = i.visibility ?? 1, this.useDash = i.useDash ?? !1, this.dashRatio = i.dashRatio ?? 0.5, this.dashOffset = i.dashOffset ?? 0, this.width = i.width ? i.width : i.sizeAttenuation ? wi.DEFAULT_WIDTH_ATTENUATED : wi.DEFAULT_WIDTH, this._sizeAttenuation = i.sizeAttenuation ?? !1, this.colorMode = i.colorMode ?? Tr.COLOR_MODE_SET, this._color = i.color ?? null, this.useColors = i.useColors ?? !1, this._colorsDistributionType = i.colorDistributionType ?? ws.COLOR_DISTRIBUTION_TYPE_SEGMENT, this.colorsSampling = i.colorsSampling ?? rr.NEAREST_NEAREST, this._colors = i.colors ?? null, this.dashCount = i.dashCount ?? 1, this.resolution = i.resolution ?? new me(this._engine.getRenderWidth(), this._engine.getRenderHeight()), i.colorsTexture ? this.colorsTexture = i.colorsTexture : this._colors ? this.colorsTexture = _t.CreateColorsTexture(`${e.name}-colors-texture`, this._colors, this.colorsSampling, this._scene) : (this._color = this._color ?? wi.DEFAULT_COLOR, _t.PrepareEmptyColorsTexture(this._scene)), this._engine.onDisposeObservable.add(() => {\n _t.DisposeEmptyColorsTexture();\n }), this._enable(!0);\n }\n /**\n * Get the shader attributes\n * @param attributes array which will be filled with the attributes\n */\n getAttributes(e) {\n e.push(\"grl_offsets\"), e.push(\"grl_widths\"), e.push(\"grl_colorPointers\"), e.push(\"grl_counters\"), this._cameraFacing ? (e.push(\"grl_previousAndSide\"), e.push(\"grl_nextAndCounters\")) : e.push(\"grl_slopes\");\n }\n /**\n * Get the shader samplers\n * @param samplers\n */\n getSamplers(e) {\n e.push(\"grl_colors\");\n }\n /**\n * Get the shader textures\n * @param activeTextures array which will be filled with the textures\n */\n getActiveTextures(e) {\n this.colorsTexture && e.push(this.colorsTexture);\n }\n /**\n * Get the shader uniforms\n * @returns uniforms\n */\n getUniforms() {\n const e = [\n { name: \"grl_singleColor\", size: 3, type: \"vec3\" },\n { name: \"grl_dashOptions\", size: 4, type: \"vec4\" },\n { name: \"grl_colorMode_visibility_colorsWidth_useColors\", size: 4, type: \"vec4\" }\n ];\n return this._cameraFacing && e.push({ name: \"grl_projection\", size: 16, type: \"mat4\" }, { name: \"grl_aspect_resolution_lineWidth\", size: 4, type: \"vec4\" }), {\n ubo: e,\n vertex: this._cameraFacing ? `\n uniform vec4 grl_aspect_resolution_lineWidth;\n uniform mat4 grl_projection;\n ` : \"\",\n fragment: `\n uniform vec4 grl_dashOptions;\n uniform vec4 grl_colorMode_visibility_colorsWidth_useColors;\n uniform vec3 grl_singleColor;\n `\n };\n }\n // only getter, it doesn't make sense to use this plugin on a mesh other than GreasedLineMesh\n // and it doesn't make sense to disable it on the mesh\n get isEnabled() {\n return !0;\n }\n /**\n * Bind the uniform buffer\n * @param uniformBuffer\n */\n bindForSubMesh(e) {\n if (this._cameraFacing) {\n const r = this._scene.activeCamera;\n if (r) {\n const a = r.getProjectionMatrix();\n e.updateMatrix(\"grl_projection\", a);\n } else\n throw Error(\"GreasedLinePluginMaterial requires an active camera.\");\n const s = z.Vector4[0];\n s.x = this._aspect, s.y = this._resolution.x, s.z = this._resolution.y, s.w = this.width, e.updateVector4(\"grl_aspect_resolution_lineWidth\", s);\n }\n const t = z.Vector4[0];\n t.x = _t.BooleanToNumber(this.useDash), t.y = this._dashArray, t.z = this.dashOffset, t.w = this.dashRatio, e.updateVector4(\"grl_dashOptions\", t);\n const i = z.Vector4[1];\n i.x = this.colorMode, i.y = this.visibility, i.z = this.colorsTexture ? this.colorsTexture.getSize().width : 0, i.w = _t.BooleanToNumber(this.useColors), e.updateVector4(\"grl_colorMode_visibility_colorsWidth_useColors\", i), this._color && e.updateColor3(\"grl_singleColor\", this._color), e.setTexture(\"grl_colors\", this.colorsTexture ?? wi.EmptyColorsTexture);\n }\n /**\n * Prepare the defines\n * @param defines\n * @param _scene\n * @param _mesh\n */\n prepareDefines(e, t, i) {\n e.GREASED_LINE_HAS_COLOR = !!this.color && !this.useColors, e.GREASED_LINE_SIZE_ATTENUATION = this._sizeAttenuation, e.GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE = this._colorsDistributionType === ws.COLOR_DISTRIBUTION_TYPE_LINE, e.GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM = t.useRightHandedSystem, e.GREASED_LINE_CAMERA_FACING = this._cameraFacing;\n }\n /**\n * Get the class name\n * @returns class name\n */\n getClassName() {\n return Nn.GREASED_LINE_MATERIAL_NAME;\n }\n /**\n * Get shader code\n * @param shaderType vertex/fragment\n * @returns shader code\n */\n getCustomCode(e) {\n if (e === \"vertex\") {\n const t = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CUSTOM_VERTEX_DEFINITIONS: `\n attribute float grl_widths;\n attribute vec3 grl_offsets;\n attribute float grl_colorPointers;\n\n varying float grlCounters;\n varying float grlColorPointer;\n\n #ifdef GREASED_LINE_CAMERA_FACING\n attribute vec4 grl_previousAndSide;\n attribute vec4 grl_nextAndCounters;\n\n vec2 grlFix( vec4 i, float aspect ) {\n vec2 res = i.xy / i.w;\n res.x *= aspect;\n return res;\n }\n #else\n attribute vec3 grl_slopes;\n attribute float grl_counters;\n #endif\n `,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CUSTOM_VERTEX_UPDATE_POSITION: `\n #ifdef GREASED_LINE_CAMERA_FACING\n vec3 grlPositionOffset = grl_offsets;\n positionUpdated += grlPositionOffset;\n #else\n positionUpdated = (positionUpdated + grl_offsets) + (grl_slopes * grl_widths);\n #endif\n `,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CUSTOM_VERTEX_MAIN_END: `\n grlColorPointer = grl_colorPointers;\n\n #ifdef GREASED_LINE_CAMERA_FACING\n\n float grlAspect = grl_aspect_resolution_lineWidth.x;\n float grlBaseWidth = grl_aspect_resolution_lineWidth.w;\n\n\n vec3 grlPrevious = grl_previousAndSide.xyz;\n float grlSide = grl_previousAndSide.w;\n\n vec3 grlNext = grl_nextAndCounters.xyz;\n grlCounters = grl_nextAndCounters.w;\n\n mat4 grlMatrix = viewProjection * finalWorld;\n vec4 grlFinalPosition = grlMatrix * vec4( positionUpdated , 1.0 );\n vec4 grlPrevPos = grlMatrix * vec4( grlPrevious + grlPositionOffset, 1.0 );\n vec4 grlNextPos = grlMatrix * vec4( grlNext + grlPositionOffset, 1.0 );\n\n vec2 grlCurrentP = grlFix( grlFinalPosition, grlAspect );\n vec2 grlPrevP = grlFix( grlPrevPos, grlAspect );\n vec2 grlNextP = grlFix( grlNextPos, grlAspect );\n\n float grlWidth = grlBaseWidth * grl_widths;\n\n vec2 grlDir;\n if( grlNextP == grlCurrentP ) grlDir = normalize( grlCurrentP - grlPrevP );\n else if( grlPrevP == grlCurrentP ) grlDir = normalize( grlNextP - grlCurrentP );\n else {\n vec2 grlDir1 = normalize( grlCurrentP - grlPrevP );\n vec2 grlDir2 = normalize( grlNextP - grlCurrentP );\n grlDir = normalize( grlDir1 + grlDir2 );\n }\n vec4 grlNormal = vec4( -grlDir.y, grlDir.x, 0., 1. );\n #ifdef GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM\n grlNormal.xy *= -.5 * grlWidth;\n #else\n grlNormal.xy *= .5 * grlWidth;\n #endif\n\n grlNormal *= grl_projection;\n\n #ifdef GREASED_LINE_SIZE_ATTENUATION\n grlNormal.xy *= grlFinalPosition.w;\n grlNormal.xy /= ( vec4( grl_aspect_resolution_lineWidth.yz, 0., 1. ) * grl_projection ).xy;\n #endif\n\n grlFinalPosition.xy += grlNormal.xy * grlSide;\n gl_Position = grlFinalPosition;\n\n vPositionW = vec3(grlFinalPosition);\n #else\n grlCounters = grl_counters;\n #endif\n `\n };\n return this._cameraFacing && (t[\"!gl_Position\\\\=viewProjection\\\\*worldPos;\"] = \"//\"), t;\n }\n return e === \"fragment\" ? {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CUSTOM_FRAGMENT_DEFINITIONS: `\n varying float grlCounters;\n varying float grlColorPointer;\n uniform sampler2D grl_colors;\n `,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CUSTOM_FRAGMENT_MAIN_END: `\n float grlColorMode = grl_colorMode_visibility_colorsWidth_useColors.x;\n float grlVisibility = grl_colorMode_visibility_colorsWidth_useColors.y;\n float grlColorsWidth = grl_colorMode_visibility_colorsWidth_useColors.z;\n float grlUseColors = grl_colorMode_visibility_colorsWidth_useColors.w;\n\n float grlUseDash = grl_dashOptions.x;\n float grlDashArray = grl_dashOptions.y;\n float grlDashOffset = grl_dashOptions.z;\n float grlDashRatio = grl_dashOptions.w;\n\n gl_FragColor.a *= step(grlCounters, grlVisibility);\n if( gl_FragColor.a == 0. ) discard;\n\n if(grlUseDash == 1.){\n gl_FragColor.a *= ceil(mod(grlCounters + grlDashOffset, grlDashArray) - (grlDashArray * grlDashRatio));\n if (gl_FragColor.a == 0.) discard;\n }\n\n #ifdef GREASED_LINE_HAS_COLOR\n if (grlColorMode == ${Tr.COLOR_MODE_SET}.) {\n gl_FragColor.rgb = grl_singleColor;\n } else if (grlColorMode == ${Tr.COLOR_MODE_ADD}.) {\n gl_FragColor.rgb += grl_singleColor;\n } else if (grlColorMode == ${Tr.COLOR_MODE_MULTIPLY}.) {\n gl_FragColor.rgb *= grl_singleColor;\n }\n #else\n if (grlUseColors == 1.) {\n #ifdef GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE\n vec4 grlColor = texture2D(grl_colors, vec2(grlCounters, 0.), 0.);\n #else\n vec4 grlColor = texture2D(grl_colors, vec2(grlColorPointer/grlColorsWidth, 0.), 0.);\n #endif\n if (grlColorMode == ${Tr.COLOR_MODE_SET}.) {\n gl_FragColor = grlColor;\n } else if (grlColorMode == ${Tr.COLOR_MODE_ADD}.) {\n gl_FragColor += grlColor;\n } else if (grlColorMode == ${Tr.COLOR_MODE_MULTIPLY}.) {\n gl_FragColor *= grlColor;\n }\n }\n #endif\n\n `\n } : null;\n }\n /**\n * Disposes the plugin material.\n */\n dispose() {\n var e;\n (e = this.colorsTexture) == null || e.dispose(), super.dispose();\n }\n /**\n * Returns the colors used to colorize the line\n */\n get colors() {\n return this._colors;\n }\n /**\n * Sets the colors used to colorize the line\n */\n set colors(e) {\n this.setColors(e);\n }\n /**\n * Creates or updates the colors texture\n * @param colors color table RGBA\n * @param lazy if lazy, the colors are not updated\n * @param forceNewTexture force creation of a new texture\n */\n setColors(e, t = !1, i = !1) {\n var s, a, o;\n const r = ((s = this._colors) == null ? void 0 : s.length) ?? 0;\n if (this._colors = e, e === null || e.length === 0) {\n (a = this.colorsTexture) == null || a.dispose();\n return;\n }\n if (!(t && !i))\n if (this.colorsTexture && r === e.length && !i) {\n const l = _t.Color3toRGBAUint8(e);\n this.colorsTexture.update(l);\n } else\n (o = this.colorsTexture) == null || o.dispose(), this.colorsTexture = _t.CreateColorsTexture(`${this._material.name}-colors-texture`, e, this.colorsSampling, this._scene);\n }\n /**\n * Updates the material. Use when material created in lazy mode.\n */\n updateLazy() {\n this._colors && this.setColors(this._colors, !1, !0);\n }\n /**\n * Gets the number of dashes in the line\n */\n get dashCount() {\n return this._dashCount;\n }\n /**\n * Sets the number of dashes in the line\n * @param value dash\n */\n set dashCount(e) {\n this._dashCount = e, this._dashArray = 1 / e;\n }\n /**\n * If set to true the line will be rendered always with the same width regardless how far it is located from the camera.\n * Not supported for non camera facing lines.\n */\n get sizeAttenuation() {\n return this._sizeAttenuation;\n }\n /**\n * Turn on/off size attenuation of the width option and widths array.\n * Not supported for non camera facing lines.\n * @param value If set to true the line will be rendered always with the same width regardless how far it is located from the camera.\n */\n set sizeAttenuation(e) {\n this._sizeAttenuation = e, this.markAllDefinesAsDirty();\n }\n /**\n * Gets the color of the line\n */\n get color() {\n return this._color;\n }\n /**\n * Sets the color of the line\n * @param value Color3 or null to clear the color. You need to clear the color if you use colors and useColors = true\n */\n set color(e) {\n this.setColor(e);\n }\n /**\n * Sets the color of the line. If set the whole line will be mixed with this color according to the colorMode option.\n * @param value color\n * @param doNotMarkDirty if true, the material will not be marked as dirty\n */\n setColor(e, t = !1) {\n this._color === null && e !== null || this._color !== null && e === null ? (this._color = e, !t && this.markAllDefinesAsDirty()) : this._color = e;\n }\n /**\n * Gets the color distributiopn type\n */\n get colorsDistributionType() {\n return this._colorsDistributionType;\n }\n /**\n * Sets the color distribution type\n * @see GreasedLineMeshColorDistributionType\n * @param value color distribution type\n */\n set colorsDistributionType(e) {\n this._colorsDistributionType = e, this.markAllDefinesAsDirty();\n }\n /**\n * Gets the resolution\n */\n get resolution() {\n return this._resolution;\n }\n /**\n * Sets the resolution\n * @param value resolution of the screen for GreasedLine\n */\n set resolution(e) {\n this._aspect = e.x / e.y, this._resolution = e;\n }\n /**\n * Serializes this plugin material\n * @returns serializationObjec\n */\n serialize() {\n const e = super.serialize(), t = {\n colorDistributionType: this._colorsDistributionType,\n colorsSampling: this.colorsSampling,\n colorMode: this.colorMode,\n dashCount: this._dashCount,\n dashOffset: this.dashOffset,\n dashRatio: this.dashRatio,\n resolution: this._resolution,\n sizeAttenuation: this._sizeAttenuation,\n useColors: this.useColors,\n useDash: this.useDash,\n visibility: this.visibility,\n width: this.width\n };\n return this._colors && (t.colors = this._colors), this._color && (t.color = this._color), e.greasedLineMaterialOptions = t, e;\n }\n /**\n * Parses a serialized objects\n * @param source serialized object\n * @param scene scene\n * @param rootUrl root url for textures\n */\n parse(e, t, i) {\n var s;\n super.parse(e, t, i);\n const r = e.greasedLineMaterialOptions;\n (s = this.colorsTexture) == null || s.dispose(), r.color && this.setColor(r.color, !0), r.colorDistributionType && (this.colorsDistributionType = r.colorDistributionType), r.colors && (this.colors = r.colors), r.colorsSampling && (this.colorsSampling = r.colorsSampling), r.colorMode && (this.colorMode = r.colorMode), r.useColors && (this.useColors = r.useColors), r.visibility && (this.visibility = r.visibility), r.useDash && (this.useDash = r.useDash), r.dashCount && (this.dashCount = r.dashCount), r.dashRatio && (this.dashRatio = r.dashRatio), r.dashOffset && (this.dashOffset = r.dashOffset), r.width && (this.width = r.width), r.sizeAttenuation && (this.sizeAttenuation = r.sizeAttenuation), r.resolution && (this.resolution = r.resolution), this.colors ? this.colorsTexture = _t.CreateColorsTexture(`${this._material.name}-colors-texture`, this.colors, this.colorsSampling, t) : _t.PrepareEmptyColorsTexture(t), this.markAllDefinesAsDirty();\n }\n /**\n * Makes a duplicate of the current configuration into another one.\n * @param plugin define the config where to copy the info\n */\n copyTo(e) {\n var i;\n const t = e;\n (i = t.colorsTexture) == null || i.dispose(), this._colors && (t.colorsTexture = _t.CreateColorsTexture(`${t._material.name}-colors-texture`, this._colors, t.colorsSampling, this._scene)), t.setColor(this.color, !0), t.colorsDistributionType = this.colorsDistributionType, t.colorsSampling = this.colorsSampling, t.colorMode = this.colorMode, t.useColors = this.useColors, t.visibility = this.visibility, t.useDash = this.useDash, t.dashCount = this.dashCount, t.dashRatio = this.dashRatio, t.dashOffset = this.dashOffset, t.width = this.width, t.sizeAttenuation = this.sizeAttenuation, t.resolution = this.resolution, t.markAllDefinesAsDirty();\n }\n}\nNn.GREASED_LINE_MATERIAL_NAME = \"GreasedLinePluginMaterial\";\nRe(`BABYLON.${Nn.GREASED_LINE_MATERIAL_NAME}`, Nn);\nconst NP = \"greasedLinePixelShader\", FP = `precision highp float;uniform sampler2D grlColors;uniform float grlUseColors;uniform float grlUseDash;uniform float grlDashArray;uniform float grlDashOffset;uniform float grlDashRatio;uniform float grlVisibility;uniform float grlColorsWidth;uniform vec2 grl_colorModeAndColorDistributionType;uniform vec3 grlColor;varying float grlCounters;varying float grlColorPointer;void main() {float grlColorMode=grl_colorModeAndColorDistributionType.x;float grlColorDistributionType=grl_colorModeAndColorDistributionType.y;gl_FragColor=vec4(grlColor,1.);gl_FragColor.a=step(grlCounters,grlVisibility);if (gl_FragColor.a==0.) discard;if( grlUseDash==1. ){gl_FragColor.a=ceil(mod(grlCounters+grlDashOffset,grlDashArray)-(grlDashArray*grlDashRatio));if (gl_FragColor.a==0.) discard;}\nif (grlUseColors==1.) {vec4 textureColor;if (grlColorDistributionType==COLOR_DISTRIBUTION_TYPE_LINE) { \ntextureColor=texture2D(grlColors,vec2(grlCounters,0.),0.);} else {textureColor=texture2D(grlColors,vec2(grlColorPointer/grlColorsWidth,0.),0.);}\nif (grlColorMode==COLOR_MODE_SET) {gl_FragColor=textureColor;} else if (grlColorMode==COLOR_MODE_ADD) {gl_FragColor+=textureColor;} else if (grlColorMode==COLOR_MODE_MULTIPLY) {gl_FragColor*=textureColor;}}}\n`;\nY.ShadersStore[NP] = FP;\nconst LP = \"greasedLineVertexShader\", wP = `precision highp float;\n#include\nattribute float grl_widths;attribute vec3 grl_offsets;attribute float grl_colorPointers;attribute vec3 position;uniform mat4 viewProjection;uniform mat4 projection;varying float grlCounters;varying float grlColorPointer;\n#ifdef GREASED_LINE_CAMERA_FACING\nattribute vec4 grl_nextAndCounters;attribute vec4 grl_previousAndSide;uniform vec2 grlResolution;uniform float grlAspect;uniform float grlWidth;uniform float grlSizeAttenuation;vec2 grlFix( vec4 i,float aspect ) {vec2 res=i.xy/i.w;res.x*=aspect;return res;}\n#else\nattribute vec3 grl_slopes;attribute float grl_counters;\n#endif\nvoid main() {\n#include\ngrlColorPointer=grl_colorPointers;\n#ifdef GREASED_LINE_CAMERA_FACING\nfloat grlBaseWidth=grlWidth;vec3 grlPrevious=grl_previousAndSide.xyz;float grlSide=grl_previousAndSide.w;vec3 grlNext=grl_nextAndCounters.xyz;grlCounters=grl_nextAndCounters.w;mat4 grlMatrix=viewProjection*finalWorld ;vec3 grlPositionOffset=grl_offsets;vec4 grlFinalPosition=grlMatrix*vec4( position+grlPositionOffset ,1.0 );vec4 grlPrevPos=grlMatrix*vec4( grlPrevious+grlPositionOffset,1.0 );vec4 grlNextPos=grlMatrix*vec4( grlNext+grlPositionOffset,1.0 );vec2 grlCurrentP=grlFix( grlFinalPosition,grlAspect );vec2 grlPrevP=grlFix( grlPrevPos,grlAspect );vec2 grlNextP=grlFix( grlNextPos,grlAspect );float grlWidth=grlBaseWidth*grl_widths;vec2 grlDir;if( grlNextP==grlCurrentP ) grlDir=normalize( grlCurrentP-grlPrevP );else if( grlPrevP==grlCurrentP ) grlDir=normalize( grlNextP-grlCurrentP );else {vec2 grlDir1=normalize( grlCurrentP-grlPrevP );vec2 grlDir2=normalize( grlNextP-grlCurrentP );grlDir=normalize( grlDir1+grlDir2 );}\nvec4 grlNormal=vec4( -grlDir.y,grlDir.x,0.,1. );\n#ifdef GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM\ngrlNormal.xy*=-.5*grlWidth;\n#else\ngrlNormal.xy*=.5*grlWidth;\n#endif\ngrlNormal*=projection;if (grlSizeAttenuation==1.) {grlNormal.xy*=grlFinalPosition.w;grlNormal.xy/=( vec4( grlResolution,0.,1. )*projection ).xy;}\ngrlFinalPosition.xy+=grlNormal.xy*grlSide;gl_Position=grlFinalPosition;\n#else\ngrlCounters=grl_counters;vec4 grlFinalPosition=worldViewProjection*vec4( (position+grl_offsets)+grl_slopes*grl_widths ,1.0 ) ;gl_Position=grlFinalPosition;\n#endif\n}\n`;\nY.ShadersStore[LP] = wP;\nclass UP extends ks {\n /**\n * GreasedLineSimple material constructor\n * @param name material name\n * @param scene the scene\n * @param options material options\n */\n constructor(e, t, i) {\n const r = [\n `COLOR_DISTRIBUTION_TYPE_LINE ${ws.COLOR_DISTRIBUTION_TYPE_LINE}.`,\n `COLOR_DISTRIBUTION_TYPE_SEGMENT ${ws.COLOR_DISTRIBUTION_TYPE_SEGMENT}.`,\n `COLOR_MODE_SET ${Tr.COLOR_MODE_SET}.`,\n `COLOR_MODE_ADD ${Tr.COLOR_MODE_ADD}.`,\n `COLOR_MODE_MULTIPLY ${Tr.COLOR_MODE_MULTIPLY}.`\n ], s = [\"position\", \"grl_widths\", \"grl_offsets\", \"grl_colorPointers\"];\n t.useRightHandedSystem && r.push(\"GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM\"), i.cameraFacing ? (r.push(\"GREASED_LINE_CAMERA_FACING\"), s.push(\"grl_previousAndSide\", \"grl_nextAndCounters\")) : (s.push(\"grl_slopes\"), s.push(\"grl_counters\")), super(e, t, {\n vertex: \"greasedLine\",\n fragment: \"greasedLine\"\n }, {\n attributes: s,\n uniforms: [\n \"world\",\n \"viewProjection\",\n \"view\",\n \"projection\",\n \"grlColorsWidth\",\n \"grlUseColors\",\n \"grlWidth\",\n \"grlColor\",\n \"grl_colorModeAndColorDistributionType\",\n \"grlResolution\",\n \"grlAspect\",\n \"grlAizeAttenuation\",\n \"grlDashArray\",\n \"grlDashOffset\",\n \"grlDashRatio\",\n \"grlUseDash\",\n \"grlVisibility\"\n ],\n samplers: [\"grlColors\"],\n defines: r\n }), this._color = Ne.White(), this._colorsDistributionType = ws.COLOR_DISTRIBUTION_TYPE_SEGMENT, this._colorsTexture = null, i = i || {\n color: wi.DEFAULT_COLOR\n };\n const a = t.getEngine();\n this.visibility = i.visibility ?? 1, this.useDash = i.useDash ?? !1, this.dashRatio = i.dashRatio ?? 0.5, this.dashOffset = i.dashOffset ?? 0, this.dashCount = i.dashCount ?? 1, this.width = i.width ? i.width : i.sizeAttenuation && i.cameraFacing ? wi.DEFAULT_WIDTH_ATTENUATED : wi.DEFAULT_WIDTH, this.sizeAttenuation = i.sizeAttenuation ?? !1, this.color = i.color ?? Ne.White(), this.useColors = i.useColors ?? !1, this.colorsDistributionType = i.colorDistributionType ?? ws.COLOR_DISTRIBUTION_TYPE_SEGMENT, this.colorsSampling = i.colorsSampling ?? rr.NEAREST_NEAREST, this.colorMode = i.colorMode ?? Tr.COLOR_MODE_SET, this._colors = i.colors ?? null, this._cameraFacing = i.cameraFacing ?? !0, this.resolution = i.resolution ?? new me(a.getRenderWidth(), a.getRenderHeight()), i.colorsTexture ? this.colorsTexture = i.colorsTexture : this.colorsTexture = _t.PrepareEmptyColorsTexture(t), this._colors && this.setColors(this._colors), a.onDisposeObservable.add(() => {\n _t.DisposeEmptyColorsTexture();\n });\n }\n /**\n * Disposes the plugin material.\n */\n dispose() {\n var e;\n (e = this._colorsTexture) == null || e.dispose(), super.dispose();\n }\n _setColorModeAndColorDistributionType() {\n this.setVector2(\"grl_colorModeAndColorDistributionType\", new me(this._colorMode, this._colorsDistributionType));\n }\n /**\n * Updates the material. Use when material created in lazy mode.\n */\n updateLazy() {\n this._colors && this.setColors(this._colors, !1, !0);\n }\n /**\n * Returns the colors used to colorize the line\n */\n get colors() {\n return this._colors;\n }\n /**\n * Sets the colors used to colorize the line\n */\n set colors(e) {\n this.setColors(e);\n }\n /**\n * Creates or updates the colors texture\n * @param colors color table RGBA\n * @param lazy if lazy, the colors are not updated\n * @param forceNewTexture force creation of a new texture\n */\n setColors(e, t = !1, i = !1) {\n var s, a, o;\n const r = ((s = this._colors) == null ? void 0 : s.length) ?? 0;\n if (this._colors = e, e === null || e.length === 0) {\n (a = this._colorsTexture) == null || a.dispose();\n return;\n }\n if (!(t && !i))\n if (this._colorsTexture && r === e.length && !i) {\n const l = _t.Color3toRGBAUint8(e);\n this._colorsTexture.update(l);\n } else\n (o = this._colorsTexture) == null || o.dispose(), this.colorsTexture = _t.CreateColorsTexture(`${this.name}-colors-texture`, e, this.colorsSampling, this.getScene());\n }\n /**\n * Gets the colors texture\n */\n get colorsTexture() {\n return this._colorsTexture ?? null;\n }\n /**\n * Sets the colorsTexture\n */\n set colorsTexture(e) {\n this._colorsTexture = e, this.setFloat(\"grlColorsWidth\", this._colorsTexture.getSize().width), this.setTexture(\"grlColors\", this._colorsTexture);\n }\n /**\n * Line base width. At each point the line width is calculated by widths[pointIndex] * width\n */\n get width() {\n return this._width;\n }\n /**\n * Line base width. At each point the line width is calculated by widths[pointIndex] * width\n */\n set width(e) {\n this._width = e, this.setFloat(\"grlWidth\", e);\n }\n /**\n * Whether to use the colors option to colorize the line\n */\n get useColors() {\n return this._useColors;\n }\n set useColors(e) {\n this._useColors = e, this.setFloat(\"grlUseColors\", _t.BooleanToNumber(e));\n }\n /**\n * The type of sampling of the colors texture. The values are the same when using with textures.\n */\n get colorsSampling() {\n return this._colorsSampling;\n }\n /**\n * The type of sampling of the colors texture. The values are the same when using with textures.\n */\n set colorsSampling(e) {\n this._colorsSampling = e;\n }\n /**\n * Normalized value of how much of the line will be visible\n * 0 - 0% of the line will be visible\n * 1 - 100% of the line will be visible\n */\n get visibility() {\n return this._visibility;\n }\n set visibility(e) {\n this._visibility = e, this.setFloat(\"grlVisibility\", e);\n }\n /**\n * Turns on/off dash mode\n */\n get useDash() {\n return this._useDash;\n }\n /**\n * Turns on/off dash mode\n */\n set useDash(e) {\n this._useDash = e, this.setFloat(\"grlUseDash\", _t.BooleanToNumber(e));\n }\n /**\n * Gets the dash offset\n */\n get dashOffset() {\n return this._dashOffset;\n }\n /**\n * Sets the dash offset\n */\n set dashOffset(e) {\n this._dashOffset = e, this.setFloat(\"grlDashOffset\", e);\n }\n /**\n * Length of the dash. 0 to 1. 0.5 means half empty, half drawn.\n */\n get dashRatio() {\n return this._dashRatio;\n }\n /**\n * Length of the dash. 0 to 1. 0.5 means half empty, half drawn.\n */\n set dashRatio(e) {\n this._dashRatio = e, this.setFloat(\"grlDashRatio\", e);\n }\n /**\n * Gets the number of dashes in the line\n */\n get dashCount() {\n return this._dashCount;\n }\n /**\n * Sets the number of dashes in the line\n * @param value dash\n */\n set dashCount(e) {\n this._dashCount = e, this._dashArray = 1 / e, this.setFloat(\"grlDashArray\", this._dashArray);\n }\n /**\n * False means 1 unit in width = 1 unit on scene, true means 1 unit in width is reduced on the screen to make better looking lines\n */\n get sizeAttenuation() {\n return this._sizeAttenuation;\n }\n /**\n * Turn on/off attenuation of the width option and widths array.\n * @param value false means 1 unit in width = 1 unit on scene, true means 1 unit in width is reduced on the screen to make better looking lines\n */\n set sizeAttenuation(e) {\n this._sizeAttenuation = e, this.setFloat(\"grlSizeAttenuation\", _t.BooleanToNumber(e));\n }\n /**\n * Gets the color of the line\n */\n get color() {\n return this.color;\n }\n /**\n * Sets the color of the line\n * @param value Color3\n */\n set color(e) {\n this.setColor(e);\n }\n /**\n * Sets the color of the line. If set the whole line will be mixed with this color according to the colorMode option.\n * The simple material always needs a color to be set. If you set it to null it will set the color to the default color (GreasedLineSimpleMaterial.DEFAULT_COLOR).\n * @param value color\n */\n setColor(e) {\n e = e ?? wi.DEFAULT_COLOR, this._color = e, this.setColor3(\"grlColor\", e);\n }\n /**\n * Gets the color distributiopn type\n */\n get colorsDistributionType() {\n return this._colorsDistributionType;\n }\n /**\n * Sets the color distribution type\n * @see GreasedLineMeshColorDistributionType\n * @param value color distribution type\n */\n set colorsDistributionType(e) {\n this._colorsDistributionType = e, this._setColorModeAndColorDistributionType();\n }\n /**\n * Gets the mixing mode of the color and colors paramaters. Default value is GreasedLineMeshColorMode.SET.\n * MATERIAL_TYPE_SIMPLE mixes the color and colors of the greased line material.\n * @see GreasedLineMeshColorMode\n */\n get colorMode() {\n return this._colorMode;\n }\n /**\n * Sets the mixing mode of the color and colors paramaters. Default value is GreasedLineMeshColorMode.SET.\n * MATERIAL_TYPE_SIMPLE mixes the color and colors of the greased line material.\n * @see GreasedLineMeshColorMode\n */\n set colorMode(e) {\n this._colorMode = e, this._setColorModeAndColorDistributionType();\n }\n /**\n * Gets the resolution\n */\n get resolution() {\n return this._resolution;\n }\n /**\n * Sets the resolution\n * @param value resolution of the screen for GreasedLine\n */\n set resolution(e) {\n this._resolution = e, this.setVector2(\"grlResolution\", e), this.setFloat(\"grlAspect\", e.x / e.y);\n }\n /**\n * Serializes this plugin material\n * @returns serializationObjec\n */\n serialize() {\n const e = super.serialize(), t = {\n colorDistributionType: this._colorsDistributionType,\n colorsSampling: this._colorsSampling,\n colorMode: this._colorMode,\n color: this._color,\n dashCount: this._dashCount,\n dashOffset: this._dashOffset,\n dashRatio: this._dashRatio,\n resolution: this._resolution,\n sizeAttenuation: this._sizeAttenuation,\n useColors: this._useColors,\n useDash: this._useDash,\n visibility: this._visibility,\n width: this._width,\n cameraFacing: this._cameraFacing\n };\n return this._colors && (t.colors = this._colors), e.greasedLineMaterialOptions = t, e;\n }\n /**\n * Parses a serialized objects\n * @param source serialized object\n * @param scene scene\n * @param _rootUrl root url for textures\n */\n parse(e, t, i) {\n var s;\n const r = e.greasedLineMaterialOptions;\n (s = this._colorsTexture) == null || s.dispose(), r.color && (this.color = r.color), r.colorDistributionType && (this.colorsDistributionType = r.colorDistributionType), r.colorsSampling && (this.colorsSampling = r.colorsSampling), r.colorMode && (this.colorMode = r.colorMode), r.useColors && (this.useColors = r.useColors), r.visibility && (this.visibility = r.visibility), r.useDash && (this.useDash = r.useDash), r.dashCount && (this.dashCount = r.dashCount), r.dashRatio && (this.dashRatio = r.dashRatio), r.dashOffset && (this.dashOffset = r.dashOffset), r.width && (this.width = r.width), r.sizeAttenuation && (this.sizeAttenuation = r.sizeAttenuation), r.resolution && (this.resolution = r.resolution), r.colors ? this.colorsTexture = _t.CreateColorsTexture(`${this.name}-colors-texture`, r.colors, this.colorsSampling, this.getScene()) : this.colorsTexture = _t.PrepareEmptyColorsTexture(t), this._cameraFacing = r.cameraFacing ?? !0, this.setDefine(\"GREASED_LINE_CAMERA_FACING\", this._cameraFacing);\n }\n}\nvar Ds;\n(function(n) {\n n[n.POINTS_MODE_POINTS = 0] = \"POINTS_MODE_POINTS\", n[n.POINTS_MODE_PATHS = 1] = \"POINTS_MODE_PATHS\";\n})(Ds || (Ds = {}));\nvar Tu;\n(function(n) {\n n[n.FACES_MODE_SINGLE_SIDED = 0] = \"FACES_MODE_SINGLE_SIDED\", n[n.FACES_MODE_SINGLE_SIDED_NO_BACKFACE_CULLING = 1] = \"FACES_MODE_SINGLE_SIDED_NO_BACKFACE_CULLING\", n[n.FACES_MODE_DOUBLE_SIDED = 2] = \"FACES_MODE_DOUBLE_SIDED\";\n})(Tu || (Tu = {}));\nvar co;\n(function(n) {\n n[n.AUTO_DIRECTIONS_FROM_FIRST_SEGMENT = 0] = \"AUTO_DIRECTIONS_FROM_FIRST_SEGMENT\", n[n.AUTO_DIRECTIONS_FROM_ALL_SEGMENTS = 1] = \"AUTO_DIRECTIONS_FROM_ALL_SEGMENTS\", n[n.AUTO_DIRECTIONS_ENHANCED = 2] = \"AUTO_DIRECTIONS_ENHANCED\", n[n.AUTO_DIRECTIONS_NONE = 99] = \"AUTO_DIRECTIONS_NONE\";\n})(co || (co = {}));\nclass O0 extends B {\n constructor(e, t, i) {\n super(e, t, null, null, !1, !1), this.name = e, this._options = i, this._lazy = !1, this._updatable = !1, this._engine = t.getEngine(), this._lazy = i.lazy ?? !1, this._updatable = i.updatable ?? !1, this._vertexPositions = [], this._indices = [], this._uvs = [], this._points = [], this._colorPointers = i.colorPointers ?? [], this._widths = i.widths ?? new Array(i.points.length).fill(1);\n }\n /**\n * \"GreasedLineMesh\"\n * @returns \"GreasedLineMesh\"\n */\n getClassName() {\n return \"GreasedLineMesh\";\n }\n _updateWidthsWithValue(e) {\n let t = 0;\n for (const r of this._points)\n t += r.length;\n const i = t / 3 * 2 - this._widths.length;\n for (let r = 0; r < i; r++)\n this._widths.push(e);\n }\n /**\n * Updated a lazy line. Rerenders the line and updates boundinfo as well.\n */\n updateLazy() {\n var e, t;\n this._setPoints(this._points), this._options.colorPointers || this._updateColorPointers(), this._createVertexBuffers((e = this._options.ribbonOptions) == null ? void 0 : e.smoothShading), this.refreshBoundingInfo(), (t = this.greasedLineMaterial) == null || t.updateLazy();\n }\n /**\n * Adds new points to the line. It doesn't rerenders the line if in lazy mode.\n * @param points points table\n * @param options optional options\n */\n addPoints(e, t) {\n for (const i of e)\n this._points.push(i);\n this._lazy || this.setPoints(this._points, t);\n }\n /**\n * Dispose the line and it's resources\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n super.dispose(e, t);\n }\n /**\n *\n * @returns true if the mesh was created in lazy mode\n */\n isLazy() {\n return this._lazy;\n }\n /**\n * Return the points offsets\n */\n get offsets() {\n return this._offsets;\n }\n /**\n * Sets point offests\n * @param offsets offset table [x,y,z, x,y,z, ....]\n */\n set offsets(e) {\n this._offsets = e, this._offsetsBuffer ? this._offsetsBuffer.update(e) : this._createOffsetsBuffer(e);\n }\n /**\n * Gets widths at each line point like [widthLower, widthUpper, widthLower, widthUpper, ...]\n */\n get widths() {\n return this._widths;\n }\n /**\n * Sets widths at each line point\n * @param widths width table [widthLower, widthUpper, widthLower, widthUpper ...]\n */\n set widths(e) {\n this._widths = e, this._lazy || this._widthsBuffer && this._widthsBuffer.update(e);\n }\n /**\n * Gets the color pointer. Each vertex need a color pointer. These color pointers points to the colors in the color table @see colors\n */\n get colorPointers() {\n return this._colorPointers;\n }\n /**\n * Sets the color pointer\n * @param colorPointers array of color pointer in the colors array. One pointer for every vertex is needed.\n */\n set colorPointers(e) {\n this._colorPointers = e, this._lazy || this._colorPointersBuffer && this._colorPointersBuffer.update(e);\n }\n /**\n * Gets the pluginMaterial associated with line\n */\n get greasedLineMaterial() {\n var t, i;\n if (this.material && this.material instanceof UP)\n return this.material;\n const e = (i = (t = this.material) == null ? void 0 : t.pluginManager) == null ? void 0 : i.getPlugin(Nn.GREASED_LINE_MATERIAL_NAME);\n if (e)\n return e;\n }\n /**\n * Return copy the points.\n */\n get points() {\n const e = [];\n return Dn.DeepCopy(this._points, e), e;\n }\n /**\n * Sets line points and rerenders the line.\n * @param points points table\n * @param options optional options\n */\n setPoints(e, t) {\n this._points = e, this._updateWidths(), t != null && t.colorPointers || this._updateColorPointers(), this._setPoints(e, t);\n }\n _initGreasedLine() {\n this._vertexPositions = [], this._indices = [], this._uvs = [];\n }\n _createLineOptions() {\n return {\n points: this._points,\n colorPointers: this._colorPointers,\n lazy: this._lazy,\n updatable: this._updatable,\n uvs: this._uvs instanceof Float32Array ? Array.from(this._uvs) : this._uvs,\n widths: this._widths,\n ribbonOptions: this._options.ribbonOptions\n };\n }\n /**\n * Serializes this GreasedLineMesh\n * @param serializationObject object to write serialization to\n */\n serialize(e) {\n super.serialize(e), e.type = this.getClassName(), e.lineOptions = this._createLineOptions();\n }\n _createVertexBuffers(e = !1) {\n const t = new re();\n return t.positions = this._vertexPositions, t.indices = this._indices, t.uvs = this._uvs, e && (t.normals = [], re.ComputeNormals(this._vertexPositions, this._indices, t.normals)), t.applyToMesh(this, this._options.updatable), t;\n }\n _createOffsetsBuffer(e) {\n const t = this._scene.getEngine(), i = new fr(t, e, this._updatable, 3);\n this.setVerticesBuffer(i.createVertexBuffer(\"grl_offsets\", 0, 3)), this._offsetsBuffer = i;\n }\n}\nB._GreasedLineMeshParser = (n, e) => xi.Parse(n, e);\nclass xi extends O0 {\n /**\n * GreasedLineMesh\n * @param name name of the mesh\n * @param scene the scene\n * @param _options mesh options\n */\n constructor(e, t, i) {\n super(e, t, i), this.name = e, this.intersectionThreshold = 0.1, this._previousAndSide = [], this._nextAndCounters = [], i.points && this.addPoints(_t.ConvertPoints(i.points));\n }\n /**\n * \"GreasedLineMesh\"\n * @returns \"GreasedLineMesh\"\n */\n getClassName() {\n return \"GreasedLineMesh\";\n }\n _updateColorPointers() {\n if (this._options.colorPointers)\n return;\n let e = 0;\n this._colorPointers = [], this._points.forEach((t) => {\n for (let i = 0; i < t.length; i += 3)\n this._colorPointers.push(e), this._colorPointers.push(e++);\n });\n }\n _updateWidths() {\n super._updateWidthsWithValue(0);\n }\n _setPoints(e) {\n this._points = e, this._options.points = e, this._initGreasedLine();\n let t = 0, i = 0, r = 0, s = 0, a = 0;\n e.forEach((v) => {\n i += v.length * 2, r += (v.length - 3) * 2, s += v.length * 4 / 3, a += v.length * 8 / 3;\n });\n const o = new Float32Array(i), l = i > 65535 ? new Uint32Array(r) : new Uint16Array(r), c = new Float32Array(s), h = new Float32Array(a), u = new Float32Array(a);\n let f = 0, d = 0, p = 0, g = 0, m = 0;\n e.forEach((v) => {\n const E = _t.GetLineLengthArray(v), C = E[E.length - 1];\n for (let F = 0, L = 0; L < v.length; F++, L += 3) {\n const K = f + L * 2;\n if (o[K + 0] = v[L + 0], o[K + 1] = v[L + 1], o[K + 2] = v[L + 2], o[K + 3] = v[L + 0], o[K + 4] = v[L + 1], o[K + 5] = v[L + 2], L < v.length - 3) {\n const q = F * 2 + t, j = d + L * 2;\n l[j + 0] = q, l[j + 1] = q + 1, l[j + 2] = q + 2, l[j + 3] = q + 2, l[j + 4] = q + 1, l[j + 5] = q + 3;\n }\n }\n t += v.length / 3 * 2;\n const T = v.length * 2, R = o.subarray(f, f + T);\n f += T, d += (v.length - 1) * 2;\n const x = new Float32Array(R.length), S = new Float32Array(R.length), M = R.length / 6;\n let N;\n xi._CompareV3(0, M - 1, R) ? N = R.subarray((M - 2) * 6, (M - 1) * 6) : N = R.subarray(0, 6), x.set(N), x.set(R.subarray(0, R.length - 6), 6), S.set(R.subarray(6)), xi._CompareV3(M - 1, 0, R) ? N = R.subarray(6, 12) : N = R.subarray((M - 1) * 6, M * 6), S.set(N, S.length - 6);\n for (let F = 0, L = R.length / 3; F < L; F++)\n h[g++] = x[F * 3], h[g++] = x[F * 3 + 1], h[g++] = x[F * 3 + 2], h[g++] = 1 - ((F & 1) << 1), u[m++] = S[F * 3], u[m++] = S[F * 3 + 1], u[m++] = S[F * 3 + 2], u[m++] = E[F >> 1] / C;\n if (this._options.uvs) {\n const F = this._options.uvs;\n for (const L of F)\n c[p++] = L;\n } else {\n for (let F = 0; F < M; F++) {\n const L = p + F * 4;\n c[L + 0] = F / (M - 1), c[L + 1] = 0, c[L + 2] = F / (M - 1), c[L + 3] = 1;\n }\n p += M * 4;\n }\n }), this._vertexPositions = o, this._indices = l, this._uvs = c, this._previousAndSide = h, this._nextAndCounters = u, this._lazy || (this._options.colorPointers || this._updateColorPointers(), this._createVertexBuffers(), this.refreshBoundingInfo());\n }\n /**\n * Clones the GreasedLineMesh.\n * @param name new line name\n * @param newParent new parent node\n * @returns cloned line\n */\n clone(e = `${this.name}-cloned`, t) {\n const i = this._createLineOptions(), r = {};\n Dn.DeepCopy(i, r, [\"instance\"], void 0, !0);\n const s = new xi(e, this._scene, r);\n return t && (s.parent = t), s.material = this.material, s;\n }\n /**\n * Serializes this GreasedLineMesh\n * @param serializationObject object to write serialization to\n */\n serialize(e) {\n super.serialize(e), e.type = this.getClassName(), e.lineOptions = this._createLineOptions();\n }\n /**\n * Parses a serialized GreasedLineMesh\n * @param parsedMesh the serialized GreasedLineMesh\n * @param scene the scene to create the GreasedLineMesh in\n * @returns the created GreasedLineMesh\n */\n static Parse(e, t) {\n const i = e.lineOptions, r = e.name;\n return new xi(r, t, i);\n }\n _initGreasedLine() {\n super._initGreasedLine(), this._previousAndSide = [], this._nextAndCounters = [];\n }\n /**\n * Checks whether a ray is intersecting this GreasedLineMesh\n * @param ray ray to check the intersection of this mesh with\n * @param fastCheck not supported\n * @param trianglePredicate not supported\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\n * @param worldToUse not supported\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\n * @returns the picking info\n */\n intersects(e, t, i, r = !1, s, a = !1) {\n const o = new ps(), l = this.findAllIntersections(e, t, i, r, s, a, !0);\n if ((l == null ? void 0 : l.length) === 1) {\n const c = l[0];\n o.hit = !0, o.distance = c.distance, o.ray = e, o.pickedMesh = this, o.pickedPoint = c.point;\n }\n return o;\n }\n /**\n * Gets all intersections of a ray and the line\n * @param ray Ray to check the intersection of this mesh with\n * @param _fastCheck not supported\n * @param _trianglePredicate not supported\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\n * @param _worldToUse not supported\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\n * @param firstOnly If true, the first and only intersection is immediatelly returned if found\n * @returns intersection(s)\n */\n findAllIntersections(e, t, i, r = !1, s, a = !1, o = !1) {\n var d;\n if (r && !a && e.intersectsSphere(this._boundingSphere, this.intersectionThreshold) === !1)\n return;\n const l = this.getIndices(), c = this.getVerticesData(I.PositionKind), h = this._widths, u = ((d = this.greasedLineMaterial) == null ? void 0 : d.width) ?? 1, f = [];\n if (l && c && h) {\n let p = 0, g = 0;\n for (p = 0, g = l.length - 1; p < g; p += 3) {\n const m = l[p], v = l[p + 1];\n xi._V_START.fromArray(c, m * 3), xi._V_END.fromArray(c, v * 3), this._offsets && (xi._V_OFFSET_START.fromArray(this._offsets, m * 3), xi._V_OFFSET_END.fromArray(this._offsets, v * 3), xi._V_START.addInPlace(xi._V_OFFSET_START), xi._V_END.addInPlace(xi._V_OFFSET_END));\n const E = Math.floor(p / 3), C = h[E] !== void 0 ? h[E] : 1, T = this.intersectionThreshold * (u * C) / 2, R = e.intersectionSegment(xi._V_START, xi._V_END, T);\n if (R !== -1 && (f.push({\n distance: R,\n point: e.direction.normalize().multiplyByFloats(R, R, R).add(e.origin)\n }), o))\n return f;\n }\n p = g;\n }\n return f;\n }\n get _boundingSphere() {\n return this.getBoundingInfo().boundingSphere;\n }\n static _CompareV3(e, t, i) {\n const r = e * 6, s = t * 6;\n return i[r] === i[s] && i[r + 1] === i[s + 1] && i[r + 2] === i[s + 2];\n }\n _createVertexBuffers() {\n const e = super._createVertexBuffers(), t = this._scene.getEngine(), i = new fr(t, this._previousAndSide, !1, 4);\n this.setVerticesBuffer(i.createVertexBuffer(\"grl_previousAndSide\", 0, 4));\n const r = new fr(t, this._nextAndCounters, !1, 4);\n this.setVerticesBuffer(r.createVertexBuffer(\"grl_nextAndCounters\", 0, 4));\n const s = new fr(t, this._widths, this._updatable, 1);\n this.setVerticesBuffer(s.createVertexBuffer(\"grl_widths\", 0, 1)), this._widthsBuffer = s;\n const a = new fr(t, this._colorPointers, this._updatable, 1);\n return this.setVerticesBuffer(a.createVertexBuffer(\"grl_colorPointers\", 0, 1)), this._colorPointersBuffer = a, e;\n }\n}\nxi._V_START = new _();\nxi._V_END = new _();\nxi._V_OFFSET_START = new _();\nxi._V_OFFSET_END = new _();\nB._GreasedLineRibbonMeshParser = (n, e) => ni.Parse(n, e);\nclass ni extends O0 {\n /**\n * GreasedLineRibbonMesh\n * @param name name of the mesh\n * @param scene the scene\n * @param _options mesh options\n * @param _pathOptions used internaly when parsing a serialized GreasedLineRibbonMesh\n */\n constructor(e, t, i, r) {\n if (super(e, t, i), this.name = e, !i.ribbonOptions)\n throw \"'GreasedLineMeshOptions.ribbonOptions' is not set.\";\n this._paths = [], this._counters = [], this._slopes = [], this._widths = i.widths ?? [], this._ribbonWidths = [], this._pathsOptions = r ?? [], i.points && this.addPoints(_t.ConvertPoints(i.points), i, !!r);\n }\n /**\n * Adds new points to the line. It doesn't rerenders the line if in lazy mode.\n * @param points points table\n * @param options mesh options\n * @param hasPathOptions defaults to false\n */\n addPoints(e, t, i = !1) {\n if (!t.ribbonOptions)\n throw \"addPoints() on GreasedLineRibbonMesh instance requires 'GreasedLineMeshOptions.ribbonOptions'.\";\n i || this._pathsOptions.push({ options: t, pathCount: e.length }), super.addPoints(e, t);\n }\n /**\n * \"GreasedLineRibbonMesh\"\n * @returns \"GreasedLineRibbonMesh\"\n */\n getClassName() {\n return \"GreasedLineRibbonMesh\";\n }\n /**\n * Return true if the line was created from two edge paths or one points path.\n * In this case the line is always flat.\n */\n get isFlatLine() {\n return this._paths.length < 3;\n }\n /**\n * Returns the slopes of the line at each point relative to the center of the line\n */\n get slopes() {\n return this._slopes;\n }\n /**\n * Set the slopes of the line at each point relative to the center of the line\n */\n set slopes(e) {\n this._slopes = e;\n }\n _updateColorPointers() {\n if (this._options.colorPointers)\n return;\n let e = 0;\n this._colorPointers = [];\n for (let t = 0; t < this._pathsOptions.length; t++) {\n const { options: i, pathCount: r } = this._pathsOptions[t], s = this._points[t];\n if (i.ribbonOptions.pointsMode === Ds.POINTS_MODE_POINTS)\n for (let a = 0; a < r; a++)\n for (let o = 0; o < s.length; o += 3)\n this._colorPointers.push(e), this._colorPointers.push(e++);\n else\n for (let a = 0; a < s.length; a += 3) {\n for (let o = 0; o < r; o++)\n this._colorPointers.push(e);\n e++;\n }\n }\n }\n _updateWidths() {\n super._updateWidthsWithValue(1);\n }\n _setPoints(e, t) {\n var s, a;\n if (!this._options.ribbonOptions)\n throw \"No 'GreasedLineMeshOptions.ribbonOptions' provided.\";\n this._points = e, this._options.points = e, this._initGreasedLine();\n let i = 0, r;\n for (let o = 0, l = 0; o < this._pathsOptions.length; o++) {\n const { options: c, pathCount: h } = this._pathsOptions[o], u = e.slice(l, l + h);\n if (l += h, ((s = c.ribbonOptions) == null ? void 0 : s.pointsMode) === Ds.POINTS_MODE_PATHS)\n i = this._preprocess(_t.ToVector3Array(u), i, c);\n else {\n if (((a = c.ribbonOptions) == null ? void 0 : a.directionsAutoMode) === co.AUTO_DIRECTIONS_NONE) {\n if (!c.ribbonOptions.directions)\n throw \"In GreasedLineRibbonAutoDirectionMode.AUTO_DIRECTIONS_NONE 'GreasedLineMeshOptions.ribbonOptions.directions' must be defined.\";\n r = ni._GetDirectionPlanesFromDirectionsOption(u.length, c.ribbonOptions.directions);\n }\n u.forEach((f, d) => {\n const p = ni._ConvertToRibbonPath(f, c.ribbonOptions, this._scene.useRightHandedSystem, r && r[d]);\n i = this._preprocess(p, i, c);\n });\n }\n }\n this._lazy || (this._createVertexBuffers(), this.refreshBoundingInfo());\n }\n static _GetDirectionPlanesFromDirectionsOption(e, t) {\n return Array.isArray(t) ? t : new Array(e).fill(t);\n }\n static _CreateRibbonVertexData(e, t) {\n var h, u;\n const i = e.length;\n if (i < 2)\n throw \"Minimum of two paths are required to create a GreasedLineRibbonMesh.\";\n const r = [], s = [], a = e[0];\n for (let f = 0; f < a.length; f++)\n for (let d = 0; d < e.length; d++) {\n const p = e[d][f];\n r.push(p.x, p.y, p.z);\n }\n const o = [1, 0, i], l = ((h = t.ribbonOptions) == null ? void 0 : h.facesMode) === Tu.FACES_MODE_DOUBLE_SIDED, c = ((u = t.ribbonOptions) == null ? void 0 : u.pointsMode) === Ds.POINTS_MODE_PATHS && t.ribbonOptions.closePath;\n if (i > 2)\n for (let f = 0; f < a.length - 1; f++) {\n o[0] = 1 + i * f, o[1] = i * f, o[2] = (f + 1) * i;\n for (let d = 0; d < (i - 1) * 2; d++)\n d % 2 !== 0 && (o[2] += 1), d % 2 === 0 && d > 0 && (o[0] += 1, o[1] += 1), s.push(o[1] + (d % 2 !== 0 ? i : 0), o[0], o[2]), l && s.push(o[0], o[1] + (d % 2 !== 0 ? i : 0), o[2]);\n }\n else\n for (let f = 0; f < r.length / 3 - 3; f += 2)\n s.push(f, f + 1, f + 2), s.push(f + 2, f + 1, f + 3), l && (s.push(f + 1, f, f + 2), s.push(f + 1, f + 2, f + 3));\n if (c) {\n let f = i * (a.length - 1);\n for (let d = 0; d < i - 1; d++)\n s.push(f, d + 1, d), s.push(f + 1, d + 1, f), l && (s.push(d, d + 1, f), s.push(f, d + 1, f + 1)), f++;\n }\n return {\n positions: r,\n indices: s\n };\n }\n _preprocess(e, t, i) {\n var d, p;\n this._paths = e;\n const r = ni._CreateRibbonVertexData(e, i), s = r.positions;\n if (!this._options.widths)\n throw \"No 'GreasedLineMeshOptions.widths' table is specified.\";\n const a = Array.isArray(this._vertexPositions) ? this._vertexPositions : Array.from(this._vertexPositions);\n this._vertexPositions = a;\n const o = Array.isArray(this._uvs) ? this._uvs : Array.from(this._uvs);\n this._uvs = o;\n const l = Array.isArray(this._indices) ? this._indices : Array.from(this._indices);\n this._indices = l;\n for (const g of s)\n a.push(g);\n let c = e;\n if (((d = i.ribbonOptions) == null ? void 0 : d.pointsMode) === Ds.POINTS_MODE_PATHS && i.ribbonOptions.closePath) {\n c = [];\n for (let g = 0; g < e.length; g++) {\n const m = e[g].slice();\n m.push(e[g][0].clone()), c.push(m);\n }\n }\n this._calculateSegmentLengths(c);\n const h = c.length, u = new Array(h).fill(0);\n for (let g = 0; g < c[0].length; g++) {\n let m = 0;\n for (let v = 0; v < h; v++) {\n const E = u[v] + this._vSegmentLengths[v][g] / this._vTotalLengths[v];\n this._counters.push(E), o.push(E, m), u[v] = E, m += this._uSegmentLengths[g][v] / this._uTotalLengths[g];\n }\n }\n for (let g = 0, m = 0; g < c[0].length; g++) {\n const v = this._uSegmentLengths[g][0] / 2, E = this._uSegmentLengths[g][h - 1] / 2;\n this._ribbonWidths.push(((this._widths[m++] ?? 1) - 1) * v);\n for (let C = 0; C < h - 2; C++)\n this._ribbonWidths.push(0);\n this._ribbonWidths.push(((this._widths[m++] ?? 1) - 1) * E);\n }\n const f = ((p = i.ribbonOptions) == null ? void 0 : p.pointsMode) === Ds.POINTS_MODE_PATHS ? new Array(c[0].length * c.length * 6).fill(0) : ni._CalculateSlopes(c);\n for (const g of f)\n this._slopes.push(g);\n if (r.indices)\n for (let g = 0; g < r.indices.length; g++)\n l.push(r.indices[g] + t);\n return t += s.length / 3, t;\n }\n static _ConvertToRibbonPath(e, t, i, r) {\n if (t.pointsMode === Ds.POINTS_MODE_POINTS && !t.width)\n throw \"'GreasedLineMeshOptions.ribbonOptiosn.width' must be specified in GreasedLineRibbonPointsMode.POINTS_MODE_POINTS.\";\n const s = [], a = [];\n if (t.pointsMode === Ds.POINTS_MODE_POINTS) {\n const o = t.width / 2, l = _t.ToVector3Array(e);\n let c = null, h = null;\n t.directionsAutoMode === co.AUTO_DIRECTIONS_FROM_FIRST_SEGMENT && (r = ni._GetDirectionFromPoints(l[0], l[1], null));\n for (let u = 0; u < l.length - (r ? 0 : 1); u++) {\n const f = l[u], d = l[u + 1];\n if (r)\n c = r;\n else if (t.directionsAutoMode === co.AUTO_DIRECTIONS_FROM_ALL_SEGMENTS)\n c = ni._GetDirectionFromPoints(f, d, c);\n else {\n const p = d.subtract(f);\n p.applyRotationQuaternionInPlace(p.x > p.y && p.x > p.z ? i ? ni._RightHandedForwardReadOnlyQuaternion : ni._LeftHandedForwardReadOnlyQuaternion : ni._LeftReadOnlyQuaternion), c = p.normalize();\n }\n h = c.multiplyByFloats(o, o, o), s.push(f.add(h)), a.push(f.subtract(h));\n }\n r || (s.push(l[l.length - 1].add(h)), a.push(l[l.length - 1].subtract(h)));\n }\n return [s, a];\n }\n static _GetDirectionFromPoints(e, t, i) {\n return e.x === t.x && (!i || (i == null ? void 0 : i.x) === 1) ? ni.DIRECTION_YZ : e.y === t.y ? ni.DIRECTION_XZ : e.z === t.z ? ni.DIRECTION_XY : ni.DIRECTION_XZ;\n }\n /**\n * Clones the GreasedLineRibbonMesh.\n * @param name new line name\n * @param newParent new parent node\n * @returns cloned line\n */\n clone(e = `${this.name}-cloned`, t) {\n const i = this._createLineOptions(), r = {}, s = [];\n Dn.DeepCopy(this._pathsOptions, s, void 0, void 0, !0), Dn.DeepCopy(i, r, [\"instance\"], void 0, !0);\n const a = new ni(e, this._scene, r, s);\n return t && (a.parent = t), a.material = this.material, a;\n }\n /**\n * Serializes this GreasedLineRibbonMesh\n * @param serializationObject object to write serialization to\n */\n serialize(e) {\n super.serialize(e), e.type = this.getClassName(), e.lineOptions = this._createLineOptions(), e.pathsOptions = this._pathsOptions;\n }\n /**\n * Parses a serialized GreasedLineRibbonMesh\n * @param parsedMesh the serialized GreasedLineRibbonMesh\n * @param scene the scene to create the GreasedLineRibbonMesh in\n * @returns the created GreasedLineRibbonMesh\n */\n static Parse(e, t) {\n const i = e.lineOptions, r = e.name, s = e.pathOptions;\n return new ni(r, t, i, s);\n }\n _initGreasedLine() {\n super._initGreasedLine(), this._paths = [], this._counters = [], this._slopes = [], this._ribbonWidths = [];\n }\n _calculateSegmentLengths(e) {\n const t = e.length;\n this._vSegmentLengths = new Array(t), this._vTotalLengths = new Array(t);\n let i = 0;\n for (let a = 0; a < t; a++) {\n const o = e[a];\n this._vSegmentLengths[a] = [0], i = 0;\n for (let l = 0; l < o.length - 1; l++) {\n const c = Math.abs(o[l].subtract(o[l + 1]).lengthSquared());\n i += c, this._vSegmentLengths[a].push(c);\n }\n this._vTotalLengths[a] = i;\n }\n const r = e[0].length;\n this._uSegmentLengths = new Array(r).fill([]), this._uTotalLengths = new Array(r).fill([]);\n const s = new _();\n for (let a = 0; a < r; a++) {\n i = 0;\n for (let o = 1; o < t; o++) {\n e[o][a].subtractToRef(e[o - 1][a], s);\n const l = s.length();\n i += l, this._uSegmentLengths[a].push(l);\n }\n this._uTotalLengths[a] = i;\n }\n }\n static _CalculateSlopes(e) {\n const t = e[0], i = e.length === 2 ? e[1] : e[e.length - 1], r = [], s = new _();\n for (let a = 0; a < t.length; a++)\n for (let o = 0; o < e.length; o++)\n o === 0 || o === e.length - 1 ? (t[a].subtract(i[a]).normalizeToRef(s), r.push(s.x, s.y, s.z), r.push(-s.x, -s.y, -s.z)) : r.push(0, 0, 0, 0, 0, 0);\n return r;\n }\n _createVertexBuffers() {\n var a;\n this._uvs = this._options.uvs ?? this._uvs;\n const e = super._createVertexBuffers((a = this._options.ribbonOptions) == null ? void 0 : a.smoothShading), t = new fr(this._engine, this._counters, this._updatable, 1);\n this.setVerticesBuffer(t.createVertexBuffer(\"grl_counters\", 0, 1));\n const i = new fr(this._engine, this._colorPointers, this._updatable, 1);\n this.setVerticesBuffer(i.createVertexBuffer(\"grl_colorPointers\", 0, 1));\n const r = new fr(this._engine, this._slopes, this._updatable, 3);\n this.setVerticesBuffer(r.createVertexBuffer(\"grl_slopes\", 0, 3));\n const s = new fr(this._engine, this._ribbonWidths, this._updatable, 1);\n return this.setVerticesBuffer(s.createVertexBuffer(\"grl_widths\", 0, 1)), this._widthsBuffer = s, e;\n }\n}\nni.DEFAULT_WIDTH = 0.1;\nni._RightHandedForwardReadOnlyQuaternion = Ce.RotationAxis(_.RightHandedForwardReadOnly, Math.PI / 2);\nni._LeftHandedForwardReadOnlyQuaternion = Ce.RotationAxis(_.LeftHandedForwardReadOnly, Math.PI / 2);\nni._LeftReadOnlyQuaternion = Ce.RotationAxis(_.LeftReadOnly, Math.PI / 2);\nni.DIRECTION_XY = _.LeftHandedForwardReadOnly;\nni.DIRECTION_XZ = _.UpReadOnly;\nni.DIRECTION_YZ = _.LeftReadOnly;\nvar Eg;\n(function(n) {\n n[n.COLOR_DISTRIBUTION_NONE = 0] = \"COLOR_DISTRIBUTION_NONE\", n[n.COLOR_DISTRIBUTION_REPEAT = 1] = \"COLOR_DISTRIBUTION_REPEAT\", n[n.COLOR_DISTRIBUTION_EVEN = 2] = \"COLOR_DISTRIBUTION_EVEN\", n[n.COLOR_DISTRIBUTION_START = 3] = \"COLOR_DISTRIBUTION_START\", n[n.COLOR_DISTRIBUTION_END = 4] = \"COLOR_DISTRIBUTION_END\", n[n.COLOR_DISTRIBUTION_START_END = 5] = \"COLOR_DISTRIBUTION_START_END\";\n})(Eg || (Eg = {}));\nvar vg;\n(function(n) {\n n[n.WIDTH_DISTRIBUTION_NONE = 0] = \"WIDTH_DISTRIBUTION_NONE\", n[n.WIDTH_DISTRIBUTION_REPEAT = 1] = \"WIDTH_DISTRIBUTION_REPEAT\", n[n.WIDTH_DISTRIBUTION_EVEN = 2] = \"WIDTH_DISTRIBUTION_EVEN\", n[n.WIDTH_DISTRIBUTION_START = 3] = \"WIDTH_DISTRIBUTION_START\", n[n.WIDTH_DISTRIBUTION_END = 4] = \"WIDTH_DISTRIBUTION_END\", n[n.WIDTH_DISTRIBUTION_START_END = 5] = \"WIDTH_DISTRIBUTION_START_END\";\n})(vg || (vg = {}));\nB.prototype.thinInstanceAdd = function(n, e = !0) {\n if (!this.getScene().getEngine().getCaps().instancedArrays)\n return ne.Error(\"Thin Instances are not supported on this device as Instanced Array extension not supported\"), -1;\n this._thinInstanceUpdateBufferSize(\"matrix\", Array.isArray(n) ? n.length : 1);\n const t = this._thinInstanceDataStorage.instancesCount;\n if (Array.isArray(n))\n for (let i = 0; i < n.length; ++i)\n this.thinInstanceSetMatrixAt(this._thinInstanceDataStorage.instancesCount++, n[i], i === n.length - 1 && e);\n else\n this.thinInstanceSetMatrixAt(this._thinInstanceDataStorage.instancesCount++, n, e);\n return t;\n};\nB.prototype.thinInstanceAddSelf = function(n = !0) {\n return this.thinInstanceAdd(w.IdentityReadOnly, n);\n};\nB.prototype.thinInstanceRegisterAttribute = function(n, e) {\n n === I.ColorKind && (n = I.ColorInstanceKind), this.removeVerticesData(n), this._thinInstanceInitializeUserStorage(), this._userThinInstanceBuffersStorage.strides[n] = e, this._userThinInstanceBuffersStorage.sizes[n] = e * Math.max(32, this._thinInstanceDataStorage.instancesCount), this._userThinInstanceBuffersStorage.data[n] = new Float32Array(this._userThinInstanceBuffersStorage.sizes[n]), this._userThinInstanceBuffersStorage.vertexBuffers[n] = new I(this.getEngine(), this._userThinInstanceBuffersStorage.data[n], n, !0, !1, e, !0), this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[n]);\n};\nB.prototype.thinInstanceSetMatrixAt = function(n, e, t = !0) {\n if (!this._thinInstanceDataStorage.matrixData || n >= this._thinInstanceDataStorage.instancesCount)\n return !1;\n const i = this._thinInstanceDataStorage.matrixData;\n return e.copyToArray(i, n * 16), this._thinInstanceDataStorage.worldMatrices && (this._thinInstanceDataStorage.worldMatrices[n] = e), t && (this.thinInstanceBufferUpdated(\"matrix\"), this.doNotSyncBoundingInfo || this.thinInstanceRefreshBoundingInfo(!1)), !0;\n};\nB.prototype.thinInstanceSetAttributeAt = function(n, e, t, i = !0) {\n return n === I.ColorKind && (n = I.ColorInstanceKind), !this._userThinInstanceBuffersStorage || !this._userThinInstanceBuffersStorage.data[n] || e >= this._thinInstanceDataStorage.instancesCount ? !1 : (this._thinInstanceUpdateBufferSize(n, 0), this._userThinInstanceBuffersStorage.data[n].set(t, e * this._userThinInstanceBuffersStorage.strides[n]), i && this.thinInstanceBufferUpdated(n), !0);\n};\nObject.defineProperty(B.prototype, \"thinInstanceCount\", {\n get: function() {\n return this._thinInstanceDataStorage.instancesCount;\n },\n set: function(n) {\n var i;\n const e = this._thinInstanceDataStorage.matrixData ?? ((i = this.source) == null ? void 0 : i._thinInstanceDataStorage.matrixData), t = e ? e.length / 16 : 0;\n n <= t && (this._thinInstanceDataStorage.instancesCount = n);\n },\n enumerable: !0,\n configurable: !0\n});\nB.prototype._thinInstanceCreateMatrixBuffer = function(n, e, t = !0) {\n const i = new fr(this.getEngine(), e, !t, 16, !1, !0);\n for (let r = 0; r < 4; r++)\n this.setVerticesBuffer(i.createVertexBuffer(n + r, r * 4, 4));\n return i;\n};\nB.prototype.thinInstanceSetBuffer = function(n, e, t = 0, i = !0) {\n var r, s, a;\n t = t || 16, n === \"matrix\" ? ((r = this._thinInstanceDataStorage.matrixBuffer) == null || r.dispose(), this._thinInstanceDataStorage.matrixBuffer = null, this._thinInstanceDataStorage.matrixBufferSize = e ? e.length : 32 * t, this._thinInstanceDataStorage.matrixData = e, this._thinInstanceDataStorage.worldMatrices = null, e !== null ? (this._thinInstanceDataStorage.instancesCount = e.length / t, this._thinInstanceDataStorage.matrixBuffer = this._thinInstanceCreateMatrixBuffer(\"world\", e, i), this.doNotSyncBoundingInfo || this.thinInstanceRefreshBoundingInfo(!1)) : (this._thinInstanceDataStorage.instancesCount = 0, this.doNotSyncBoundingInfo || this.refreshBoundingInfo())) : n === \"previousMatrix\" ? ((s = this._thinInstanceDataStorage.previousMatrixBuffer) == null || s.dispose(), this._thinInstanceDataStorage.previousMatrixBuffer = null, this._thinInstanceDataStorage.previousMatrixData = e, e !== null && (this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", e, i))) : (n === I.ColorKind && (n = I.ColorInstanceKind), e === null ? (a = this._userThinInstanceBuffersStorage) != null && a.data[n] && (this.removeVerticesData(n), delete this._userThinInstanceBuffersStorage.data[n], delete this._userThinInstanceBuffersStorage.strides[n], delete this._userThinInstanceBuffersStorage.sizes[n], delete this._userThinInstanceBuffersStorage.vertexBuffers[n]) : (this._thinInstanceInitializeUserStorage(), this._userThinInstanceBuffersStorage.data[n] = e, this._userThinInstanceBuffersStorage.strides[n] = t, this._userThinInstanceBuffersStorage.sizes[n] = e.length, this._userThinInstanceBuffersStorage.vertexBuffers[n] = new I(this.getEngine(), e, n, !i, !1, t, !0), this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[n])));\n};\nB.prototype.thinInstanceBufferUpdated = function(n) {\n var e, t, i;\n n === \"matrix\" ? (this.thinInstanceAllowAutomaticStaticBufferRecreation && this._thinInstanceDataStorage.matrixBuffer && !this._thinInstanceDataStorage.matrixBuffer.isUpdatable() && this._thinInstanceRecreateBuffer(n), (e = this._thinInstanceDataStorage.matrixBuffer) == null || e.updateDirectly(this._thinInstanceDataStorage.matrixData, 0, this._thinInstanceDataStorage.instancesCount)) : n === \"previousMatrix\" ? (this.thinInstanceAllowAutomaticStaticBufferRecreation && this._thinInstanceDataStorage.previousMatrixBuffer && !this._thinInstanceDataStorage.previousMatrixBuffer.isUpdatable() && this._thinInstanceRecreateBuffer(n), (t = this._thinInstanceDataStorage.previousMatrixBuffer) == null || t.updateDirectly(this._thinInstanceDataStorage.previousMatrixData, 0, this._thinInstanceDataStorage.instancesCount)) : (n === I.ColorKind && (n = I.ColorInstanceKind), (i = this._userThinInstanceBuffersStorage) != null && i.vertexBuffers[n] && (this.thinInstanceAllowAutomaticStaticBufferRecreation && !this._userThinInstanceBuffersStorage.vertexBuffers[n].isUpdatable() && this._thinInstanceRecreateBuffer(n), this._userThinInstanceBuffersStorage.vertexBuffers[n].updateDirectly(this._userThinInstanceBuffersStorage.data[n], 0)));\n};\nB.prototype.thinInstancePartialBufferUpdate = function(n, e, t) {\n var i;\n n === \"matrix\" ? this._thinInstanceDataStorage.matrixBuffer && this._thinInstanceDataStorage.matrixBuffer.updateDirectly(e, t) : (n === I.ColorKind && (n = I.ColorInstanceKind), (i = this._userThinInstanceBuffersStorage) != null && i.vertexBuffers[n] && this._userThinInstanceBuffersStorage.vertexBuffers[n].updateDirectly(e, t));\n};\nB.prototype.thinInstanceGetWorldMatrices = function() {\n if (!this._thinInstanceDataStorage.matrixData || !this._thinInstanceDataStorage.matrixBuffer)\n return [];\n const n = this._thinInstanceDataStorage.matrixData;\n if (!this._thinInstanceDataStorage.worldMatrices) {\n this._thinInstanceDataStorage.worldMatrices = [];\n for (let e = 0; e < this._thinInstanceDataStorage.instancesCount; ++e)\n this._thinInstanceDataStorage.worldMatrices[e] = w.FromArray(n, e * 16);\n }\n return this._thinInstanceDataStorage.worldMatrices;\n};\nB.prototype.thinInstanceRefreshBoundingInfo = function(n = !1, e = !1, t = !1) {\n if (!this._thinInstanceDataStorage.matrixData || !this._thinInstanceDataStorage.matrixBuffer)\n return;\n const i = this._thinInstanceDataStorage.boundingVectors;\n if (n || !this.rawBoundingInfo) {\n i.length = 0, this.refreshBoundingInfo(e, t);\n const a = this.getBoundingInfo();\n this.rawBoundingInfo = new Cr(a.minimum, a.maximum);\n }\n const r = this.getBoundingInfo(), s = this._thinInstanceDataStorage.matrixData;\n if (i.length === 0)\n for (let a = 0; a < r.boundingBox.vectors.length; ++a)\n i.push(r.boundingBox.vectors[a].clone());\n z.Vector3[0].setAll(Number.POSITIVE_INFINITY), z.Vector3[1].setAll(Number.NEGATIVE_INFINITY);\n for (let a = 0; a < this._thinInstanceDataStorage.instancesCount; ++a) {\n w.FromArrayToRef(s, a * 16, z.Matrix[0]);\n for (let o = 0; o < i.length; ++o)\n _.TransformCoordinatesToRef(i[o], z.Matrix[0], z.Vector3[2]), z.Vector3[0].minimizeInPlace(z.Vector3[2]), z.Vector3[1].maximizeInPlace(z.Vector3[2]);\n }\n r.reConstruct(z.Vector3[0], z.Vector3[1]), this._updateBoundingInfo();\n};\nB.prototype._thinInstanceRecreateBuffer = function(n, e = !0) {\n var t, i, r;\n n === \"matrix\" ? ((t = this._thinInstanceDataStorage.matrixBuffer) == null || t.dispose(), this._thinInstanceDataStorage.matrixBuffer = this._thinInstanceCreateMatrixBuffer(\"world\", this._thinInstanceDataStorage.matrixData, e)) : n === \"previousMatrix\" ? this._scene.needsPreviousWorldMatrices && ((i = this._thinInstanceDataStorage.previousMatrixBuffer) == null || i.dispose(), this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", this._thinInstanceDataStorage.previousMatrixData ?? this._thinInstanceDataStorage.matrixData, e)) : (n === I.ColorKind && (n = I.ColorInstanceKind), (r = this._userThinInstanceBuffersStorage.vertexBuffers[n]) == null || r.dispose(), this._userThinInstanceBuffersStorage.vertexBuffers[n] = new I(this.getEngine(), this._userThinInstanceBuffersStorage.data[n], n, !e, !1, this._userThinInstanceBuffersStorage.strides[n], !0), this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[n]));\n};\nB.prototype._thinInstanceUpdateBufferSize = function(n, e = 1) {\n var l, c, h;\n n === I.ColorKind && (n = I.ColorInstanceKind);\n const t = n === \"matrix\";\n if (!t && (!this._userThinInstanceBuffersStorage || !this._userThinInstanceBuffersStorage.strides[n]))\n return;\n const i = t ? 16 : this._userThinInstanceBuffersStorage.strides[n], r = t ? this._thinInstanceDataStorage.matrixBufferSize : this._userThinInstanceBuffersStorage.sizes[n];\n let s = t ? this._thinInstanceDataStorage.matrixData : this._userThinInstanceBuffersStorage.data[n];\n const a = (this._thinInstanceDataStorage.instancesCount + e) * i;\n let o = r;\n for (; o < a; )\n o *= 2;\n if (!s || r != o) {\n if (!s)\n s = new Float32Array(o);\n else {\n const u = new Float32Array(o);\n u.set(s, 0), s = u;\n }\n t ? ((l = this._thinInstanceDataStorage.matrixBuffer) == null || l.dispose(), this._thinInstanceDataStorage.matrixBuffer = this._thinInstanceCreateMatrixBuffer(\"world\", s, !1), this._thinInstanceDataStorage.matrixData = s, this._thinInstanceDataStorage.matrixBufferSize = o, this._scene.needsPreviousWorldMatrices && !this._thinInstanceDataStorage.previousMatrixData && ((c = this._thinInstanceDataStorage.previousMatrixBuffer) == null || c.dispose(), this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", s, !1))) : ((h = this._userThinInstanceBuffersStorage.vertexBuffers[n]) == null || h.dispose(), this._userThinInstanceBuffersStorage.data[n] = s, this._userThinInstanceBuffersStorage.sizes[n] = o, this._userThinInstanceBuffersStorage.vertexBuffers[n] = new I(this.getEngine(), s, n, !0, !1, i, !0), this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[n]));\n }\n};\nB.prototype._thinInstanceInitializeUserStorage = function() {\n this._userThinInstanceBuffersStorage || (this._userThinInstanceBuffersStorage = {\n data: {},\n sizes: {},\n vertexBuffers: {},\n strides: {}\n });\n};\nB.prototype._disposeThinInstanceSpecificData = function() {\n var n;\n (n = this._thinInstanceDataStorage) != null && n.matrixBuffer && (this._thinInstanceDataStorage.matrixBuffer.dispose(), this._thinInstanceDataStorage.matrixBuffer = null);\n};\nvar b;\n(function(n) {\n n[n.Int = 1] = \"Int\", n[n.Float = 2] = \"Float\", n[n.Vector2 = 4] = \"Vector2\", n[n.Vector3 = 8] = \"Vector3\", n[n.Vector4 = 16] = \"Vector4\", n[n.Matrix = 32] = \"Matrix\", n[n.Geometry = 64] = \"Geometry\", n[n.Texture = 128] = \"Texture\", n[n.AutoDetect = 1024] = \"AutoDetect\", n[n.BasedOnInput = 2048] = \"BasedOnInput\", n[n.Undefined = 4096] = \"Undefined\", n[n.All = 4095] = \"All\";\n})(b || (b = {}));\nvar en;\n(function(n) {\n n[n.Compatible = 0] = \"Compatible\", n[n.TypeIncompatible = 1] = \"TypeIncompatible\", n[n.HierarchyIssue = 2] = \"HierarchyIssue\";\n})(en || (en = {}));\nvar Ro;\n(function(n) {\n n[n.Input = 0] = \"Input\", n[n.Output = 1] = \"Output\";\n})(Ro || (Ro = {}));\nclass Tg {\n /** Gets the direction of the point */\n get direction() {\n return this._direction;\n }\n /**\n * Gets or sets the connection point type (default is float)\n */\n get type() {\n if (this._type === b.AutoDetect) {\n if (this._ownerBlock.isInput)\n return this._ownerBlock.type;\n if (this._connectedPoint)\n return this._connectedPoint.type;\n if (this._linkedConnectionSource && this._linkedConnectionSource.isConnected)\n return this._linkedConnectionSource.type;\n }\n if (this._type === b.BasedOnInput) {\n if (this._typeConnectionSource)\n return !this._typeConnectionSource.isConnected && this._defaultConnectionPointType ? this._defaultConnectionPointType : this._typeConnectionSource.type;\n if (this._defaultConnectionPointType)\n return this._defaultConnectionPointType;\n }\n return this._type;\n }\n set type(e) {\n this._type = e;\n }\n /**\n * Gets a boolean indicating that the current point is connected to another NodeMaterialBlock\n */\n get isConnected() {\n return this.connectedPoint !== null || this.hasEndpoints;\n }\n /** Get the other side of the connection (if any) */\n get connectedPoint() {\n return this._connectedPoint;\n }\n /** Get the block that owns this connection point */\n get ownerBlock() {\n return this._ownerBlock;\n }\n /** Get the block connected on the other side of this connection (if any) */\n get sourceBlock() {\n return this._connectedPoint ? this._connectedPoint.ownerBlock : null;\n }\n /** Get the block connected on the endpoints of this connection (if any) */\n get connectedBlocks() {\n return this._endpoints.length === 0 ? [] : this._endpoints.map((e) => e.ownerBlock);\n }\n /** Gets the list of connected endpoints */\n get endpoints() {\n return this._endpoints;\n }\n /** Gets a boolean indicating if that output point is connected to at least one input */\n get hasEndpoints() {\n return this._endpoints && this._endpoints.length > 0;\n }\n /** Get the inner type (ie AutoDetect for instance instead of the inferred one) */\n get innerType() {\n return this._linkedConnectionSource && this._linkedConnectionSource.isConnected ? this.type : this._type;\n }\n /** @internal */\n _resetCounters() {\n this._callCount = 0, this._executionCount = 0;\n }\n /**\n * Gets the number of times this point was called\n */\n get callCount() {\n return this._callCount;\n }\n /**\n * Gets the number of times this point was executed\n */\n get executionCount() {\n return this._executionCount;\n }\n /**\n * Gets the value represented by this connection point\n * @param state current evaluation state\n * @returns the connected value or the value if nothing is connected\n */\n getConnectedValue(e) {\n var t;\n return this.isConnected ? (t = this._connectedPoint) != null && t._storedFunction ? (this._connectedPoint._callCount++, this._connectedPoint._executionCount++, this._connectedPoint._storedFunction(e)) : (this._connectedPoint._callCount++, this._connectedPoint._executionCount = 1, this._connectedPoint._storedValue) : (this._callCount++, this._executionCount = 1, this.value);\n }\n /**\n * Creates a new connection point\n * @param name defines the connection point name\n * @param ownerBlock defines the block hosting this connection point\n * @param direction defines the direction of the connection point\n */\n constructor(e, t, i) {\n this._connectedPoint = null, this._storedValue = null, this._storedFunction = null, this._acceptedConnectionPointType = null, this._endpoints = new Array(), this._type = b.Geometry, this._linkedConnectionSource = null, this._typeConnectionSource = null, this._defaultConnectionPointType = null, this.acceptedConnectionPointTypes = [], this.excludedConnectionPointTypes = [], this.onConnectionObservable = new he(), this.onDisconnectionObservable = new he(), this.isExposedOnFrame = !1, this.exposedPortPosition = -1, this.defaultValue = null, this.value = null, this.valueMin = null, this.valueMax = null, this._callCount = 0, this._executionCount = 0, this._ownerBlock = t, this.name = e, this._direction = i;\n }\n /**\n * Gets the current class name e.g. \"NodeMaterialConnectionPoint\"\n * @returns the class name\n */\n getClassName() {\n return \"NodeGeometryConnectionPoint\";\n }\n /**\n * Gets a boolean indicating if the current point can be connected to another point\n * @param connectionPoint defines the other connection point\n * @returns a boolean\n */\n canConnectTo(e) {\n return this.checkCompatibilityState(e) === en.Compatible;\n }\n /**\n * Gets a number indicating if the current point can be connected to another point\n * @param connectionPoint defines the other connection point\n * @returns a number defining the compatibility state\n */\n checkCompatibilityState(e) {\n const t = this._ownerBlock, i = e.ownerBlock;\n if (this.type !== e.type && e.innerType !== b.AutoDetect)\n return e.acceptedConnectionPointTypes && e.acceptedConnectionPointTypes.indexOf(this.type) !== -1 ? en.Compatible : en.TypeIncompatible;\n if (e.excludedConnectionPointTypes && e.excludedConnectionPointTypes.indexOf(this.type) !== -1)\n return en.TypeIncompatible;\n let r = i, s = t;\n return this.direction === Ro.Input && (r = t, s = i), r.isAnAncestorOf(s) ? en.HierarchyIssue : en.Compatible;\n }\n /**\n * Connect this point to another connection point\n * @param connectionPoint defines the other connection point\n * @param ignoreConstraints defines if the system will ignore connection type constraints (default is false)\n * @returns the current connection point\n */\n connectTo(e, t = !1) {\n if (!t && !this.canConnectTo(e))\n throw \"Cannot connect these two connectors.\";\n return this._endpoints.push(e), e._connectedPoint = this, this.onConnectionObservable.notifyObservers(e), e.onConnectionObservable.notifyObservers(this), this;\n }\n /**\n * Disconnect this point from one of his endpoint\n * @param endpoint defines the other connection point\n * @returns the current connection point\n */\n disconnectFrom(e) {\n const t = this._endpoints.indexOf(e);\n return t === -1 ? this : (this._endpoints.splice(t, 1), e._connectedPoint = null, this.onDisconnectionObservable.notifyObservers(e), e.onDisconnectionObservable.notifyObservers(this), this);\n }\n /**\n * Fill the list of excluded connection point types with all types other than those passed in the parameter\n * @param mask Types (ORed values of NodeMaterialBlockConnectionPointTypes) that are allowed, and thus will not be pushed to the excluded list\n */\n addExcludedConnectionPointFromAllowedTypes(e) {\n let t = 1;\n for (; t < b.All; )\n e & t || this.excludedConnectionPointTypes.push(t), t = t << 1;\n }\n /**\n * Serializes this point in a JSON representation\n * @param isInput defines if the connection point is an input (default is true)\n * @returns the serialized point object\n */\n serialize(e = !0) {\n const t = {};\n return t.name = this.name, t.displayName = this.displayName, this.value !== void 0 && this.value !== null && (this.value.asArray ? (t.valueType = \"BABYLON.\" + this.value.getClassName(), t.value = this.value.asArray()) : (t.valueType = \"number\", t.value = this.value)), e && this.connectedPoint && (t.inputName = this.name, t.targetBlockId = this.connectedPoint.ownerBlock.uniqueId, t.targetConnectionName = this.connectedPoint.name), t;\n }\n /**\n * Release resources\n */\n dispose() {\n this.onConnectionObservable.clear(), this.onDisconnectionObservable.clear();\n }\n}\nclass Ve {\n /**\n * Gets the time spent to build this block (in ms)\n */\n get buildExecutionTime() {\n return this._buildExecutionTime;\n }\n /**\n * Gets the list of input points\n */\n get inputs() {\n return this._inputs;\n }\n /** Gets the list of output points */\n get outputs() {\n return this._outputs;\n }\n /**\n * Gets or set the name of the block\n */\n get name() {\n return this._name;\n }\n set name(e) {\n this._name = e;\n }\n /**\n * Gets a boolean indicating if this block is an input\n */\n get isInput() {\n return this._isInput;\n }\n /**\n * Gets a boolean indicating if this block is a teleport out\n */\n get isTeleportOut() {\n return this._isTeleportOut;\n }\n /**\n * Gets a boolean indicating if this block is a teleport in\n */\n get isTeleportIn() {\n return this._isTeleportIn;\n }\n /**\n * Gets a boolean indicating if this block is a debug block\n */\n get isDebug() {\n return this._isDebug;\n }\n /**\n * Gets a boolean indicating that this block can only be used once per NodeGeometry\n */\n get isUnique() {\n return this._isUnique;\n }\n /**\n * Gets the current class name e.g. \"NodeGeometryBlock\"\n * @returns the class name\n */\n getClassName() {\n return \"NodeGeometryBlock\";\n }\n _inputRename(e) {\n return e;\n }\n _outputRename(e) {\n return e;\n }\n /**\n * Checks if the current block is an ancestor of a given block\n * @param block defines the potential descendant block to check\n * @returns true if block is a descendant\n */\n isAnAncestorOf(e) {\n for (const t of this._outputs)\n if (t.hasEndpoints) {\n for (const i of t.endpoints)\n if (i.ownerBlock === e || i.ownerBlock.isAnAncestorOf(e))\n return !0;\n }\n return !1;\n }\n /**\n * Checks if the current block is an ancestor of a given type\n * @param type defines the potential type to check\n * @returns true if block is a descendant\n */\n isAnAncestorOfType(e) {\n if (this.getClassName() === e)\n return !0;\n for (const t of this._outputs)\n if (t.hasEndpoints) {\n for (const i of t.endpoints)\n if (i.ownerBlock.isAnAncestorOfType(e))\n return !0;\n }\n return !1;\n }\n /**\n * Get the first descendant using a predicate\n * @param predicate defines the predicate to check\n * @returns descendant or null if none found\n */\n getDescendantOfPredicate(e) {\n if (e(this))\n return this;\n for (const t of this._outputs)\n if (t.hasEndpoints)\n for (const i of t.endpoints) {\n const r = i.ownerBlock.getDescendantOfPredicate(e);\n if (r)\n return r;\n }\n return null;\n }\n /**\n * Creates a new NodeGeometryBlock\n * @param name defines the block name\n */\n constructor(e) {\n this._name = \"\", this._isInput = !1, this._isTeleportOut = !1, this._isTeleportIn = !1, this._isDebug = !1, this._isUnique = !1, this._buildExecutionTime = 0, this.onBuildObservable = new he(), this._inputs = new Array(), this._outputs = new Array(), this._codeVariableName = \"\", this.visibleOnFrame = !1, this._name = e, this.uniqueId = rf.UniqueId;\n }\n /**\n * Register a new input. Must be called inside a block constructor\n * @param name defines the connection point name\n * @param type defines the connection point type\n * @param isOptional defines a boolean indicating that this input can be omitted\n * @param value value to return if there is no connection\n * @param valueMin min value accepted for value\n * @param valueMax max value accepted for value\n * @returns the current block\n */\n registerInput(e, t, i = !1, r, s, a) {\n const o = new Tg(e, this, Ro.Input);\n return o.type = t, o.isOptional = i, o.defaultValue = r, o.value = r, o.valueMin = s, o.valueMax = a, this._inputs.push(o), this;\n }\n /**\n * Register a new output. Must be called inside a block constructor\n * @param name defines the connection point name\n * @param type defines the connection point type\n * @param point an already created connection point. If not provided, create a new one\n * @returns the current block\n */\n registerOutput(e, t, i) {\n return i = i ?? new Tg(e, this, Ro.Output), i.type = t, this._outputs.push(i), this;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _buildBlock(e) {\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _customBuildStep(e) {\n }\n /**\n * Build the current node and generate the vertex data\n * @param state defines the current generation state\n * @returns true if already built\n */\n build(e) {\n if (this._buildId === e.buildId)\n return !0;\n if (this._outputs.length > 0) {\n if (!this._outputs.some((i) => i.hasEndpoints) && !this.isDebug)\n return !1;\n this.outputs.forEach((i) => i._resetCounters());\n }\n this._buildId = e.buildId;\n for (const i of this._inputs) {\n if (!i.connectedPoint) {\n i.isOptional || e.notConnectedNonOptionalInputs.push(i);\n continue;\n }\n const r = i.connectedPoint.ownerBlock;\n r && r !== this && r.build(e);\n }\n this._customBuildStep(e), e.verbose && ne.Log(`Building ${this.name} [${this.getClassName()}]`);\n const t = sr.Now;\n this._buildBlock(e), this._buildExecutionTime = sr.Now - t;\n for (const i of this._outputs)\n for (const r of i.endpoints) {\n const s = r.ownerBlock;\n s && s.build(e);\n }\n return this.onBuildObservable.notifyObservers(this), !1;\n }\n _linkConnectionTypes(e, t, i = !1) {\n i ? this._inputs[t]._acceptedConnectionPointType = this._inputs[e] : this._inputs[e]._linkedConnectionSource = this._inputs[t], this._inputs[t]._linkedConnectionSource = this._inputs[e];\n }\n /**\n * Initialize the block and prepare the context for build\n */\n initialize() {\n }\n /**\n * Lets the block try to connect some inputs automatically\n */\n autoConfigure() {\n }\n /**\n * Find an input by its name\n * @param name defines the name of the input to look for\n * @returns the input or null if not found\n */\n getInputByName(e) {\n const t = this._inputs.filter((i) => i.name === e);\n return t.length ? t[0] : null;\n }\n /**\n * Find an output by its name\n * @param name defines the name of the output to look for\n * @returns the output or null if not found\n */\n getOutputByName(e) {\n const t = this._outputs.filter((i) => i.name === e);\n return t.length ? t[0] : null;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = {};\n e.customType = \"BABYLON.\" + this.getClassName(), e.id = this.uniqueId, e.name = this.name, e.inputs = [], e.outputs = [];\n for (const t of this.inputs)\n e.inputs.push(t.serialize());\n for (const t of this.outputs)\n e.outputs.push(t.serialize(!1));\n return e;\n }\n /**\n * @internal\n */\n _deserialize(e) {\n this._name = e.name, this.comments = e.comments, this.visibleOnFrame = !!e.visibleOnFrame, this._deserializePortDisplayNamesAndExposedOnFrame(e);\n }\n _deserializePortDisplayNamesAndExposedOnFrame(e) {\n const t = e.inputs, i = e.outputs;\n t && t.forEach((r) => {\n const s = this.inputs.find((a) => a.name === r.name);\n if (s && (r.displayName && (s.displayName = r.displayName), r.isExposedOnFrame && (s.isExposedOnFrame = r.isExposedOnFrame, s.exposedPortPosition = r.exposedPortPosition), r.value !== void 0 && r.value !== null))\n if (r.valueType === \"number\")\n s.value = r.value;\n else {\n const a = mr(r.valueType);\n a && (s.value = a.FromArray(r.value));\n }\n }), i && i.forEach((r, s) => {\n r.displayName && (this.outputs[s].displayName = r.displayName), r.isExposedOnFrame && (this.outputs[s].isExposedOnFrame = r.isExposedOnFrame, this.outputs[s].exposedPortPosition = r.exposedPortPosition);\n });\n }\n _dumpPropertiesCode() {\n return `${this._codeVariableName}.visibleOnFrame = ${this.visibleOnFrame};\n`;\n }\n /**\n * @internal\n */\n _dumpCodeForOutputConnections(e) {\n let t = \"\";\n if (e.indexOf(this) !== -1)\n return t;\n e.push(this);\n for (const i of this.inputs) {\n if (!i.isConnected)\n continue;\n const r = i.connectedPoint, s = r.ownerBlock;\n t += s._dumpCodeForOutputConnections(e), t += `${s._codeVariableName}.${s._outputRename(r.name)}.connectTo(${this._codeVariableName}.${this._inputRename(i.name)});\n`;\n }\n return t;\n }\n /**\n * @internal\n */\n _dumpCode(e, t) {\n t.push(this);\n const i = this.name.replace(/[^A-Za-z_]+/g, \"\");\n if (this._codeVariableName = i || `${this.getClassName()}_${this.uniqueId}`, e.indexOf(this._codeVariableName) !== -1) {\n let a = 0;\n do\n a++, this._codeVariableName = i + a;\n while (e.indexOf(this._codeVariableName) !== -1);\n }\n e.push(this._codeVariableName);\n let r = `\n// ${this.getClassName()}\n`;\n this.comments && (r += `// ${this.comments}\n`);\n const s = this.getClassName();\n if (s === \"GeometryInputBlock\") {\n const o = this.type;\n r += `var ${this._codeVariableName} = new BABYLON.GeometryInputBlock(\"${this.name}\", ${o});\n`;\n } else\n r += `var ${this._codeVariableName} = new BABYLON.${s}(\"${this.name}\");\n`;\n r += this._dumpPropertiesCode();\n for (const a of this.inputs) {\n if (!a.isConnected)\n continue;\n const l = a.connectedPoint.ownerBlock;\n t.indexOf(l) === -1 && (r += l._dumpCode(e, t));\n }\n for (const a of this.outputs)\n if (a.hasEndpoints)\n for (const o of a.endpoints) {\n const l = o.ownerBlock;\n l && t.indexOf(l) === -1 && (r += l._dumpCode(e, t));\n }\n return r;\n }\n /**\n * Clone the current block to a new identical block\n * @returns a copy of the current block\n */\n clone() {\n const e = this.serialize(), t = mr(e.customType);\n if (t) {\n const i = new t();\n return i._deserialize(e), i;\n }\n return null;\n }\n /**\n * Release resources\n */\n dispose() {\n for (const e of this.inputs)\n e.dispose();\n for (const e of this.outputs)\n e.dispose();\n this.onBuildObservable.clear();\n }\n}\nP([\n U(\"comment\")\n], Ve.prototype, \"comments\", void 0);\nclass D0 extends Ve {\n /**\n * Gets the current vertex data if the graph was successfully built\n */\n get currentVertexData() {\n return this._vertexData;\n }\n /**\n * Create a new GeometryOutputBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._vertexData = null, this._isUnique = !0, this.registerInput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryOutputBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n _buildBlock(e) {\n e.vertexData = this.geometry.getConnectedValue(e), this._vertexData = e.vertexData;\n }\n}\nRe(\"BABYLON.GeometryOutputBlock\", D0);\nvar ct;\n(function(n) {\n n[n.None = 0] = \"None\", n[n.Positions = 1] = \"Positions\", n[n.Normals = 2] = \"Normals\", n[n.Tangents = 3] = \"Tangents\", n[n.UV = 4] = \"UV\", n[n.UV2 = 5] = \"UV2\", n[n.UV3 = 6] = \"UV3\", n[n.UV4 = 7] = \"UV4\", n[n.UV5 = 8] = \"UV5\", n[n.UV6 = 9] = \"UV6\", n[n.Colors = 10] = \"Colors\", n[n.VertexID = 11] = \"VertexID\", n[n.FaceID = 12] = \"FaceID\", n[n.GeometryID = 13] = \"GeometryID\", n[n.CollectionID = 14] = \"CollectionID\", n[n.LoopID = 15] = \"LoopID\", n[n.InstanceID = 16] = \"InstanceID\";\n})(ct || (ct = {}));\nclass VP {\n constructor() {\n this._rotationMatrix = new w(), this._scalingMatrix = new w(), this._positionMatrix = new w(), this._scalingRotationMatrix = new w(), this._transformMatrix = new w(), this._tempVector3 = new _(), this.notConnectedNonOptionalInputs = [], this.noContextualData = [], this.vertexData = null, this._geometryContext = null, this._executionContext = null, this._instancingContext = null, this._geometryContextStack = [], this._executionContextStack = [], this._instancingContextStack = [];\n }\n /** Gets or sets the geometry context */\n get geometryContext() {\n return this._geometryContext;\n }\n /** Gets or sets the execution context */\n get executionContext() {\n return this._executionContext;\n }\n /** Gets or sets the instancing context */\n get instancingContext() {\n return this._instancingContext;\n }\n /**\n * Push the new active geometry context\n * @param geometryContext defines the geometry context\n */\n pushGeometryContext(e) {\n this._geometryContext = e, this._geometryContextStack.push(this._geometryContext);\n }\n /**\n * Push the new active execution context\n * @param executionContext defines the execution context\n */\n pushExecutionContext(e) {\n this._executionContext = e, this._executionContextStack.push(this._executionContext);\n }\n /**\n * Push the new active instancing context\n * @param instancingContext defines the instancing context\n */\n pushInstancingContext(e) {\n this._instancingContext = e, this._instancingContextStack.push(this._instancingContext);\n }\n /**\n * Remove current geometry context and restore the previous one\n */\n restoreGeometryContext() {\n this._geometryContextStack.pop(), this._geometryContext = this._geometryContextStack.length > 0 ? this._geometryContextStack[this._geometryContextStack.length - 1] : null;\n }\n /**\n * Remove current execution context and restore the previous one\n */\n restoreExecutionContext() {\n this._executionContextStack.pop(), this._executionContext = this._executionContextStack.length > 0 ? this._executionContextStack[this._executionContextStack.length - 1] : null;\n }\n /**\n * Remove current isntancing context and restore the previous one\n */\n restoreInstancingContext() {\n this._instancingContextStack.pop(), this._instancingContext = this._instancingContextStack.length > 0 ? this._instancingContextStack[this._instancingContextStack.length - 1] : null;\n }\n /**\n * Gets the value associated with a contextual source\n * @param source Source of the contextual value\n * @param skipWarning Do not store the warning for reporting if true\n * @returns the value associated with the source\n */\n getContextualValue(e, t = !1) {\n if (!this.executionContext)\n return t || this.noContextualData.push(e), null;\n const i = this.executionContext.getExecutionIndex();\n switch (e) {\n case ct.Positions:\n return this.executionContext.getOverridePositionsContextualValue ? this.executionContext.getOverridePositionsContextualValue() : !this.geometryContext || !this.geometryContext.positions ? _.Zero() : _.FromArray(this.geometryContext.positions, i * 3);\n case ct.Normals:\n return this.executionContext.getOverrideNormalsContextualValue ? this.executionContext.getOverrideNormalsContextualValue() : !this.geometryContext || !this.geometryContext.normals ? _.Zero() : _.FromArray(this.geometryContext.normals, i * 3);\n case ct.Colors:\n return !this.geometryContext || !this.geometryContext.colors ? Ke.Zero() : Ke.FromArray(this.geometryContext.colors, i * 4);\n case ct.Tangents:\n return !this.geometryContext || !this.geometryContext.tangents ? Ke.Zero() : Ke.FromArray(this.geometryContext.tangents, i * 4);\n case ct.UV:\n return this.executionContext.getOverrideUVs1ContextualValue ? this.executionContext.getOverrideUVs1ContextualValue() : !this.geometryContext || !this.geometryContext.uvs ? me.Zero() : me.FromArray(this.geometryContext.uvs, i * 2);\n case ct.UV2:\n return !this.geometryContext || !this.geometryContext.uvs2 ? me.Zero() : me.FromArray(this.geometryContext.uvs2, i * 2);\n case ct.UV3:\n return !this.geometryContext || !this.geometryContext.uvs3 ? me.Zero() : me.FromArray(this.geometryContext.uvs3, i * 2);\n case ct.UV4:\n return !this.geometryContext || !this.geometryContext.uvs4 ? me.Zero() : me.FromArray(this.geometryContext.uvs4, i * 2);\n case ct.UV5:\n return !this.geometryContext || !this.geometryContext.uvs5 ? me.Zero() : me.FromArray(this.geometryContext.uvs5, i * 2);\n case ct.UV6:\n return !this.geometryContext || !this.geometryContext.uvs6 ? me.Zero() : me.FromArray(this.geometryContext.uvs6, i * 2);\n case ct.VertexID:\n return i;\n case ct.FaceID:\n return this.executionContext.getExecutionFaceIndex();\n case ct.LoopID:\n return this.executionContext.getExecutionLoopIndex();\n case ct.InstanceID:\n return this.instancingContext ? this.instancingContext.getInstanceIndex() : 0;\n case ct.GeometryID:\n return this.geometryContext ? this.geometryContext.uniqueId : 0;\n case ct.CollectionID:\n return !this.geometryContext || !this.geometryContext.metadata ? 0 : this.geometryContext.metadata.collectionId || 0;\n }\n return null;\n }\n /**\n * Adapt a value to a target type\n * @param source defines the value to adapt\n * @param targetType defines the target type\n * @returns the adapted value\n */\n adapt(e, t) {\n const i = e.getConnectedValue(this) || 0;\n if (e.type === t)\n return i;\n switch (t) {\n case b.Vector2:\n return new me(i, i);\n case b.Vector3:\n return new _(i, i, i);\n case b.Vector4:\n return new Ke(i, i, i, i);\n }\n return null;\n }\n /**\n * Adapt an input value to a target type\n * @param source defines the value to adapt\n * @param targetType defines the target type\n * @param defaultValue defines the default value to use if not connected\n * @returns the adapted value\n */\n adaptInput(e, t, i) {\n var s;\n if (!e.isConnected)\n return e.value || i;\n const r = e.getConnectedValue(this);\n if (((s = e._connectedPoint) == null ? void 0 : s.type) === t)\n return r;\n switch (t) {\n case b.Vector2:\n return new me(r, r);\n case b.Vector3:\n return new _(r, r, r);\n case b.Vector4:\n return new Ke(r, r, r, r);\n }\n return null;\n }\n /**\n * Emits console errors and exceptions if there is a failing check\n */\n emitErrors() {\n let e = \"\";\n for (const t of this.notConnectedNonOptionalInputs)\n e += `input ${t.name} from block ${t.ownerBlock.name}[${t.ownerBlock.getClassName()}] is not connected and is not optional.\n`;\n for (const t of this.noContextualData)\n e += `Contextual input ${ct[t]} has no context to pull data from (must be connected to a setXXX block or a instantiateXXX block).\n`;\n if (e)\n throw `Build of NodeGeometry failed:\n` + e;\n }\n /** @internal */\n _instantiate(e, t, i, r, s) {\n w.ScalingToRef(r.x, r.y, r.z, this._scalingMatrix), w.RotationYawPitchRollToRef(i.y, i.x, i.z, this._rotationMatrix), w.TranslationToRef(t.x, t.y, t.z, this._positionMatrix), this._scalingMatrix.multiplyToRef(this._rotationMatrix, this._scalingRotationMatrix), this._scalingRotationMatrix.multiplyToRef(this._positionMatrix, this._transformMatrix);\n for (let a = 0; a < e.positions.length; a += 3)\n this._tempVector3.fromArray(e.positions, a), _.TransformCoordinatesToRef(this._tempVector3, this._transformMatrix, this._tempVector3), this._tempVector3.toArray(e.positions, a), e.normals && (this._tempVector3.fromArray(e.normals, a), _.TransformNormalToRef(this._tempVector3, this._scalingRotationMatrix, this._tempVector3), this._tempVector3.toArray(e.normals, a));\n s.push(e);\n }\n /** @internal */\n _instantiateWithMatrix(e, t, i) {\n for (let r = 0; r < e.positions.length; r += 3)\n this._tempVector3.fromArray(e.positions, r), _.TransformCoordinatesToRef(this._tempVector3, t, this._tempVector3), this._tempVector3.toArray(e.positions, r), e.normals && (this._tempVector3.fromArray(e.normals, r), _.TransformNormalToRef(this._tempVector3, t, this._tempVector3), this._tempVector3.toArray(e.normals, r));\n i.push(e);\n }\n /** @internal */\n _instantiateWithPositionAndMatrix(e, t, i, r) {\n w.TranslationToRef(t.x, t.y, t.z, this._positionMatrix), i.multiplyToRef(this._positionMatrix, this._transformMatrix);\n for (let s = 0; s < e.positions.length; s += 3)\n this._tempVector3.fromArray(e.positions, s), _.TransformCoordinatesToRef(this._tempVector3, this._transformMatrix, this._tempVector3), this._tempVector3.toArray(e.positions, s), e.normals && (this._tempVector3.fromArray(e.normals, s), _.TransformNormalToRef(this._tempVector3, this._transformMatrix, this._tempVector3), this._tempVector3.toArray(e.normals, s));\n r.push(e);\n }\n}\nclass si extends Ve {\n /**\n * Gets or sets the connection point type (default is float)\n */\n get type() {\n if (this._type === b.AutoDetect && this.value != null) {\n if (!isNaN(this.value))\n return this._type = b.Float, this._type;\n switch (this.value.getClassName()) {\n case \"Vector2\":\n return this._type = b.Vector2, this._type;\n case \"Vector3\":\n return this._type = b.Vector3, this._type;\n case \"Vector4\":\n return this._type = b.Vector4, this._type;\n case \"Matrix\":\n return this._type = b.Matrix, this._type;\n }\n }\n return this._type;\n }\n /**\n * Gets a boolean indicating that the current connection point is a contextual value\n */\n get isContextual() {\n return this._contextualSource !== ct.None;\n }\n /**\n * Gets or sets the current contextual value\n */\n get contextualValue() {\n return this._contextualSource;\n }\n set contextualValue(e) {\n switch (this._contextualSource = e, e) {\n case ct.Positions:\n case ct.Normals:\n this._type = b.Vector3;\n break;\n case ct.Colors:\n case ct.Tangents:\n this._type = b.Vector4;\n break;\n case ct.UV:\n case ct.UV2:\n case ct.UV3:\n case ct.UV4:\n case ct.UV5:\n case ct.UV6:\n this._type = b.Vector2;\n break;\n case ct.VertexID:\n case ct.GeometryID:\n case ct.CollectionID:\n case ct.FaceID:\n case ct.LoopID:\n case ct.InstanceID:\n this._type = b.Int;\n break;\n }\n this.output && (this.output.type = this._type);\n }\n /**\n * Creates a new InputBlock\n * @param name defines the block name\n * @param type defines the type of the input (can be set to NodeGeometryBlockConnectionPointTypes.AutoDetect)\n */\n constructor(e, t = b.AutoDetect) {\n super(e), this._type = b.Undefined, this._contextualSource = ct.None, this.min = 0, this.max = 0, this.groupInInspector = \"\", this.onValueChangedObservable = new he(), this._type = t, this._isInput = !0, this.setDefaultValue(), this.registerOutput(\"output\", t);\n }\n /**\n * Gets or sets the value of that point.\n * Please note that this value will be ignored if valueCallback is defined\n */\n get value() {\n return this._storedValue;\n }\n set value(e) {\n this.type === b.Float && this.min !== this.max && (e = Math.max(this.min, e), e = Math.min(this.max, e)), this._storedValue = e, this.onValueChangedObservable.notifyObservers(this);\n }\n /**\n * Gets or sets a callback used to get the value of that point.\n * Please note that setting this value will force the connection point to ignore the value property\n */\n get valueCallback() {\n return this._valueCallback;\n }\n set valueCallback(e) {\n this._valueCallback = e;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryInputBlock\";\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n /**\n * Set the input block to its default value (based on its type)\n */\n setDefaultValue() {\n switch (this.contextualValue = ct.None, this.type) {\n case b.Int:\n case b.Float:\n this.value = 0;\n break;\n case b.Vector2:\n this.value = me.Zero();\n break;\n case b.Vector3:\n this.value = _.Zero();\n break;\n case b.Vector4:\n this.value = Ke.Zero();\n break;\n case b.Matrix:\n this.value = w.Identity();\n break;\n }\n }\n _buildBlock(e) {\n super._buildBlock(e), this.isContextual ? (this.output._storedValue = null, this.output._storedFunction = (t) => t.getContextualValue(this._contextualSource)) : (this.output._storedFunction = null, this.output._storedValue = this.value);\n }\n dispose() {\n this.onValueChangedObservable.clear(), super.dispose();\n }\n _dumpPropertiesCode() {\n const e = this._codeVariableName;\n if (this.isContextual)\n return super._dumpPropertiesCode() + `${e}.contextualValue = BABYLON.NodeGeometryContextualSources.${ct[this._contextualSource]};\n`;\n const t = [];\n let i = \"\";\n switch (this.type) {\n case b.Float:\n case b.Int:\n i = `${this.value}`;\n break;\n case b.Vector2:\n i = `new BABYLON.Vector2(${this.value.x}, ${this.value.y})`;\n break;\n case b.Vector3:\n i = `new BABYLON.Vector3(${this.value.x}, ${this.value.y}, ${this.value.z})`;\n break;\n case b.Vector4:\n i = `new BABYLON.Vector4(${this.value.x}, ${this.value.y}, ${this.value.z}, ${this.value.w})`;\n break;\n }\n return t.push(`${e}.value = ${i}`), (this.type === b.Float || this.type === b.Int) && t.push(`${e}.min = ${this.min}`, `${e}.max = ${this.max}`), t.push(\"\"), super._dumpPropertiesCode() + t.join(`;\n`);\n }\n serialize() {\n const e = super.serialize();\n return e.type = this.type, e.contextualValue = this.contextualValue, e.min = this.min, e.max = this.max, e.groupInInspector = this.groupInInspector, this._storedValue !== null && !this.isContextual && (this._storedValue.asArray ? (e.valueType = \"BABYLON.\" + this._storedValue.getClassName(), e.value = this._storedValue.asArray()) : (e.valueType = \"number\", e.value = this._storedValue)), e;\n }\n _deserialize(e) {\n if (super._deserialize(e), this._type = e.type, this.contextualValue = e.contextualValue, this.min = e.min || 0, this.max = e.max || 0, this.groupInInspector = e.groupInInspector || \"\", !!e.valueType)\n if (e.valueType === \"number\")\n this._storedValue = e.value;\n else {\n const t = mr(e.valueType);\n t && (this._storedValue = t.FromArray(e.value));\n }\n }\n}\nRe(\"BABYLON.GeometryInputBlock\", si);\nvar ht;\n(function(n) {\n n[n.Boolean = 0] = \"Boolean\", n[n.Float = 1] = \"Float\", n[n.Int = 2] = \"Int\", n[n.Vector2 = 3] = \"Vector2\", n[n.List = 4] = \"List\";\n})(ht || (ht = {}));\nfunction gt(n, e = ht.Boolean, t = \"PROPERTIES\", i) {\n return (r, s) => {\n let a = r._propStore;\n a || (a = [], r._propStore = a), a.push({\n propertyName: s,\n displayName: n,\n type: e,\n groupName: t,\n options: i ?? {}\n });\n };\n}\nclass Sf extends Ve {\n /**\n * Create a new BoxBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"size\", b.Float, !0, 1), this.registerInput(\"width\", b.Float, !0, 0), this.registerInput(\"height\", b.Float, !0, 0), this.registerInput(\"depth\", b.Float, !0, 0), this.registerInput(\"subdivisions\", b.Int, !0, 1), this.registerInput(\"subdivisionsX\", b.Int, !0, 0), this.registerInput(\"subdivisionsY\", b.Int, !0, 0), this.registerInput(\"subdivisionsZ\", b.Int, !0, 0), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"BoxBlock\";\n }\n /**\n * Gets the size input component\n */\n get size() {\n return this._inputs[0];\n }\n /**\n * Gets the width input component\n */\n get width() {\n return this._inputs[1];\n }\n /**\n * Gets the height input component\n */\n get height() {\n return this._inputs[2];\n }\n /**\n * Gets the depth input component\n */\n get depth() {\n return this._inputs[3];\n }\n /**\n * Gets the subdivisions input component\n */\n get subdivisions() {\n return this._inputs[4];\n }\n /**\n * Gets the subdivisionsX input component\n */\n get subdivisionsX() {\n return this._inputs[5];\n }\n /**\n * Gets the subdivisionsY input component\n */\n get subdivisionsY() {\n return this._inputs[6];\n }\n /**\n * Gets the subdivisionsZ input component\n */\n get subdivisionsZ() {\n return this._inputs[7];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.size.isConnected) {\n if (!this.width.isConnected && !this.height.isConnected && !this.depth.isConnected) {\n const e = new si(\"Size\");\n e.value = 1, e.output.connectTo(this.size);\n return;\n }\n if (!this.width.isConnected) {\n const e = new si(\"Width\");\n e.value = 1, e.output.connectTo(this.width);\n }\n if (!this.height.isConnected) {\n const e = new si(\"Height\");\n e.value = 1, e.output.connectTo(this.height);\n }\n if (!this.depth.isConnected) {\n const e = new si(\"Depth\");\n e.value = 1, e.output.connectTo(this.depth);\n }\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => {\n t.size = this.size.getConnectedValue(r), t.width = this.width.getConnectedValue(r), t.height = this.height.getConnectedValue(r), t.depth = this.depth.getConnectedValue(r);\n const s = this.subdivisions.getConnectedValue(r), a = this.subdivisionsX.getConnectedValue(r), o = this.subdivisionsY.getConnectedValue(r), l = this.subdivisionsZ.getConnectedValue(r);\n return s && (t.segments = s), a && (t.widthSegments = a), o && (t.heightSegments = o), l && (t.depthSegments = l), Tb(t);\n };\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], Sf.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.BoxBlock\", Sf);\nclass hr {\n /** @returns the inspector from bundle or global */\n _getGlobalNodeGeometryEditor() {\n if (typeof NODEGEOMETRYEDITOR < \"u\")\n return NODEGEOMETRYEDITOR;\n if (typeof BABYLON < \"u\" && typeof BABYLON.NodeGeometryEditor < \"u\")\n return BABYLON;\n }\n /**\n * Gets the time spent to build this block (in ms)\n */\n get buildExecutionTime() {\n return this._buildExecutionTime;\n }\n /**\n * Creates a new geometry\n * @param name defines the name of the geometry\n */\n constructor(e) {\n this._buildId = hr._BuildIdGenerator++, this._buildWasSuccessful = !1, this._vertexData = null, this._buildExecutionTime = 0, this.BJSNODEGEOMETRYEDITOR = this._getGlobalNodeGeometryEditor(), this.editorData = null, this.attachedBlocks = [], this.onBuildObservable = new he(), this.outputBlock = null, this.name = e;\n }\n /**\n * Gets the current class name of the geometry e.g. \"NodeGeometry\"\n * @returns the class name\n */\n getClassName() {\n return \"NodeGeometry\";\n }\n /**\n * Get a block by its name\n * @param name defines the name of the block to retrieve\n * @returns the required block or null if not found\n */\n getBlockByName(e) {\n let t = null;\n for (const i of this.attachedBlocks)\n if (i.name === e)\n if (!t)\n t = i;\n else\n return ge.Warn(\"More than one block was found with the name `\" + e + \"`\"), t;\n return t;\n }\n /**\n * Get a block using a predicate\n * @param predicate defines the predicate used to find the good candidate\n * @returns the required block or null if not found\n */\n getBlockByPredicate(e) {\n for (const t of this.attachedBlocks)\n if (e(t))\n return t;\n return null;\n }\n /**\n * Gets the list of input blocks attached to this material\n * @returns an array of InputBlocks\n */\n getInputBlocks() {\n const e = [];\n for (const t of this.attachedBlocks)\n t.isInput && e.push(t);\n return e;\n }\n /**\n * Launch the node geometry editor\n * @param config Define the configuration of the editor\n * @returns a promise fulfilled when the node editor is visible\n */\n edit(e) {\n return new Promise((t) => {\n if (this.BJSNODEGEOMETRYEDITOR = this.BJSNODEGEOMETRYEDITOR || this._getGlobalNodeGeometryEditor(), typeof this.BJSNODEGEOMETRYEDITOR > \"u\") {\n const i = e && e.editorURL ? e.editorURL : hr.EditorURL;\n ge.LoadBabylonScript(i, () => {\n this.BJSNODEGEOMETRYEDITOR = this.BJSNODEGEOMETRYEDITOR || this._getGlobalNodeGeometryEditor(), this._createNodeEditor(e == null ? void 0 : e.nodeGeometryEditorConfig), t();\n });\n } else\n this._createNodeEditor(e == null ? void 0 : e.nodeGeometryEditorConfig), t();\n });\n }\n /**\n * Creates the node editor window.\n * @param additionalConfig Additional configuration for the NGE\n */\n _createNodeEditor(e) {\n const t = {\n nodeGeometry: this,\n ...e\n };\n this.BJSNODEGEOMETRYEDITOR.NodeGeometryEditor.Show(t);\n }\n /**\n * Build the final geometry\n * @param verbose defines if the build should log activity\n * @param updateBuildId defines if the internal build Id should be updated (default is true)\n * @param autoConfigure defines if the autoConfigure method should be called when initializing blocks (default is false)\n */\n build(e = !1, t = !0, i = !1) {\n if (this._buildWasSuccessful = !1, !this.outputBlock)\n throw \"You must define the outputBlock property before building the geometry\";\n const r = sr.Now;\n this._initializeBlock(this.outputBlock, i);\n const s = new VP();\n s.buildId = this._buildId, s.verbose = e, this.outputBlock.build(s), t && (this._buildId = hr._BuildIdGenerator++), this._buildExecutionTime = sr.Now - r, s.emitErrors(), this._buildWasSuccessful = !0, this._vertexData = s.vertexData, this.onBuildObservable.notifyObservers(this);\n }\n /**\n * Creates a mesh from the geometry blocks\n * @param name defines the name of the mesh\n * @param scene The scene the mesh is scoped to\n * @returns The new mesh\n */\n createMesh(e, t = null) {\n if (this._buildWasSuccessful || this.build(), !this._vertexData)\n return null;\n const i = new B(e, t);\n return this._vertexData.applyToMesh(i), i._internalMetadata = i._internalMetadata || {}, i._internalMetadata.nodeGeometry = this, i;\n }\n /**\n * Creates a mesh from the geometry blocks\n * @param mesh the mesh to update\n * @returns True if successfully updated\n */\n updateMesh(e) {\n return this._buildWasSuccessful || this.build(), this._vertexData ? (this._vertexData.applyToMesh(e), e._internalMetadata = e._internalMetadata || {}, e._internalMetadata.nodeGeometry = this, e) : !1;\n }\n _initializeBlock(e, t = !0) {\n e.initialize(), t && e.autoConfigure(), e._preparationId = this._buildId, this.attachedBlocks.indexOf(e) === -1 && this.attachedBlocks.push(e);\n for (const i of e.inputs) {\n const r = i.connectedPoint;\n if (r) {\n const s = r.ownerBlock;\n s !== e && this._initializeBlock(s, t);\n }\n }\n }\n /**\n * Clear the current geometry\n */\n clear() {\n this.outputBlock = null, this.attachedBlocks.length = 0;\n }\n /**\n * Remove a block from the current geometry\n * @param block defines the block to remove\n */\n removeBlock(e) {\n const t = this.attachedBlocks.indexOf(e);\n t > -1 && this.attachedBlocks.splice(t, 1), e === this.outputBlock && (this.outputBlock = null);\n }\n /**\n * Clear the current graph and load a new one from a serialization object\n * @param source defines the JSON representation of the geometry\n * @param merge defines whether or not the source must be merged or replace the current content\n */\n parseSerializedObject(e, t = !1) {\n t || this.clear();\n const i = {};\n for (const r of e.blocks) {\n const s = mr(r.customType);\n if (s) {\n const a = new s();\n a._deserialize(r), i[r.id] = a, this.attachedBlocks.push(a);\n }\n }\n for (const r of this.attachedBlocks)\n if (r.isTeleportOut) {\n const s = r, a = s._tempEntryPointUniqueId;\n if (a) {\n const o = i[a];\n o && o.attachToEndpoint(s);\n }\n }\n for (let r = 0; r < e.blocks.length; r++) {\n const s = e.blocks[r], a = i[s.id];\n a && (a.inputs.length && s.inputs.some((o) => o.targetConnectionName) && !t || this._restoreConnections(a, e, i));\n }\n if (e.outputNodeId && (this.outputBlock = i[e.outputNodeId]), e.locations || e.editorData && e.editorData.locations) {\n const r = e.locations || e.editorData.locations;\n for (const a of r)\n i[a.blockId] && (a.blockId = i[a.blockId].uniqueId);\n t && this.editorData && this.editorData.locations && r.concat(this.editorData.locations), e.locations ? this.editorData = {\n locations: r\n } : (this.editorData = e.editorData, this.editorData.locations = r);\n const s = [];\n for (const a in i)\n s[a] = i[a].uniqueId;\n this.editorData.map = s;\n }\n this.comment = e.comment;\n }\n _restoreConnections(e, t, i) {\n for (const r of e.outputs)\n for (const s of t.blocks) {\n const a = i[s.id];\n if (a) {\n for (const o of s.inputs)\n if (i[o.targetBlockId] === e && o.targetConnectionName === r.name) {\n const l = a.getInputByName(o.inputName);\n if (!l || l.isConnected)\n continue;\n r.connectTo(l, !0), this._restoreConnections(a, t, i);\n continue;\n }\n }\n }\n }\n /**\n * Generate a string containing the code declaration required to create an equivalent of this geometry\n * @returns a string\n */\n generateCode() {\n let e = [];\n const t = [], i = [\"const\", \"var\", \"let\"];\n this.outputBlock && this._gatherBlocks(this.outputBlock, t);\n let r = `let nodeGeometry = new BABYLON.NodeGeometry(\"${this.name || \"node geometry\"}\");\n`;\n for (const s of t)\n s.isInput && e.indexOf(s) === -1 && (r += s._dumpCode(i, e));\n return this.outputBlock && (e = [], r += `// Connections\n`, r += this.outputBlock._dumpCodeForOutputConnections(e), r += `// Output nodes\n`, r += `nodeGeometry.outputBlock = ${this.outputBlock._codeVariableName};\n`, r += `nodeGeometry.build();\n`), r;\n }\n _gatherBlocks(e, t) {\n if (t.indexOf(e) === -1) {\n t.push(e);\n for (const i of e.inputs) {\n const r = i.connectedPoint;\n if (r) {\n const s = r.ownerBlock;\n s !== e && this._gatherBlocks(s, t);\n }\n }\n if (e.isTeleportOut) {\n const i = e;\n i.entryPoint && this._gatherBlocks(i.entryPoint, t);\n }\n }\n }\n /**\n * Clear the current geometry and set it to a default state\n */\n setToDefault() {\n this.clear(), this.editorData = null;\n const e = new Sf(\"Box\");\n e.autoConfigure();\n const t = new D0(\"Geometry Output\");\n e.geometry.connectTo(t.geometry), this.outputBlock = t;\n }\n /**\n * Makes a duplicate of the current geometry.\n * @param name defines the name to use for the new geometry\n * @returns the new geometry\n */\n clone(e) {\n const t = this.serialize(), i = Le.Clone(() => new hr(e), this);\n return i.name = e, i.parseSerializedObject(t), i._buildId = this._buildId, i.build(!1), i;\n }\n /**\n * Serializes this geometry in a JSON representation\n * @param selectedBlocks defines the list of blocks to save (if null the whole geometry will be saved)\n * @returns the serialized geometry object\n */\n serialize(e) {\n const t = e ? {} : Le.Serialize(this);\n t.editorData = JSON.parse(JSON.stringify(this.editorData));\n let i = [];\n e ? i = e : (t.customType = \"BABYLON.NodeGeometry\", this.outputBlock && (t.outputNodeId = this.outputBlock.uniqueId)), t.blocks = [];\n for (const r of i)\n t.blocks.push(r.serialize());\n if (!e)\n for (const r of this.attachedBlocks)\n i.indexOf(r) === -1 && t.blocks.push(r.serialize());\n return t;\n }\n /**\n * Disposes the ressources\n */\n dispose() {\n for (const e of this.attachedBlocks)\n e.dispose();\n this.attachedBlocks.length = 0, this.onBuildObservable.clear();\n }\n /**\n * Creates a new node geometry set to default basic configuration\n * @param name defines the name of the geometry\n * @returns a new NodeGeometry\n */\n static CreateDefault(e) {\n const t = new hr(e);\n return t.setToDefault(), t.build(), t;\n }\n /**\n * Creates a node geometry from parsed geometry data\n * @param source defines the JSON representation of the geometry\n * @returns a new node geometry\n */\n static Parse(e) {\n const t = Le.Parse(() => new hr(e.name), e, null);\n return t.parseSerializedObject(e), t.build(), t;\n }\n /**\n * Creates a node geometry from a snippet saved by the node geometry editor\n * @param snippetId defines the snippet to load\n * @param nodeGeometry defines a node geometry to update (instead of creating a new one)\n * @param skipBuild defines whether to build the node geometry\n * @returns a promise that will resolve to the new node geometry\n */\n static ParseFromSnippetAsync(e, t, i = !1) {\n return e === \"_BLANK\" ? Promise.resolve(hr.CreateDefault(\"blank\")) : new Promise((r, s) => {\n const a = new mi();\n a.addEventListener(\"readystatechange\", () => {\n if (a.readyState == 4)\n if (a.status == 200) {\n const o = JSON.parse(JSON.parse(a.responseText).jsonPayload), l = JSON.parse(o.nodeGeometry);\n t || (t = Le.Parse(() => new hr(e), l, null)), t.parseSerializedObject(l), t.snippetId = e;\n try {\n i || t.build(), r(t);\n } catch (c) {\n s(c);\n }\n } else\n s(\"Unable to load the snippet \" + e);\n }), a.open(\"GET\", this.SnippetUrl + \"/\" + e.replace(/#/g, \"/\")), a.send();\n });\n }\n}\nhr._BuildIdGenerator = 0;\nhr.EditorURL = `${ge._DefaultCdnUrl}/v${se.Version}/nodeGeometryEditor/babylon.nodeGeometryEditor.js`;\nhr.SnippetUrl = \"https://snippet.babylonjs.com\";\nP([\n U()\n], hr.prototype, \"name\", void 0);\nP([\n U(\"comment\")\n], hr.prototype, \"comment\", void 0);\nclass yf extends Ve {\n /**\n * Creates a new GeometryOptimizeBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.epsilon = xt, this.registerInput(\"geometry\", b.Geometry), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryOptimizeBlock\";\n }\n /**\n * Gets the geometry component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (!this.geometry.isConnected)\n return null;\n const r = this.geometry.getConnectedValue(i), s = [], a = {};\n for (let l = 0; l < r.positions.length; l += 3) {\n const c = r.positions[l], h = r.positions[l + 1], u = r.positions[l + 2];\n let f = !1;\n for (let d = 0; d < s.length; d += 3)\n if (je.WithinEpsilon(c, s[d], this.epsilon) && je.WithinEpsilon(h, s[d + 1], this.epsilon) && je.WithinEpsilon(u, s[d + 2], this.epsilon)) {\n a[l / 3] = d / 3, f = !0;\n continue;\n }\n f || (a[l / 3] = s.length / 3, s.push(c, h, u));\n }\n const o = new re();\n return o.positions = s, o.indices = r.indices.map((l) => a[l]), o;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n let e = super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n return e += `${this._codeVariableName}.epsilon = ${this.epsilon};\n`, e;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e.epsilon = this.epsilon, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext, this.epsilon = e.epsilon;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], yf.prototype, \"evaluateContext\", void 0);\nP([\n gt(\"Epsilon\", ht.Float, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], yf.prototype, \"epsilon\", void 0);\nRe(\"BABYLON.GeometryOptimizeBlock\", yf);\nclass N0 extends Ve {\n /**\n * Create a new PlaneBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"size\", b.Float, !0, 1), this.registerInput(\"width\", b.Float, !0, 0), this.registerInput(\"height\", b.Float, !0, 0), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"PlaneBlock\";\n }\n /**\n * Gets the size input component\n */\n get size() {\n return this._inputs[0];\n }\n /**\n * Gets the width input component\n */\n get width() {\n return this._inputs[1];\n }\n /**\n * Gets the height input component\n */\n get height() {\n return this._inputs[2];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.size.isConnected) {\n if (!this.width.isConnected && !this.height.isConnected) {\n const e = new si(\"Size\");\n e.value = 1, e.output.connectTo(this.size);\n return;\n }\n if (!this.width.isConnected) {\n const e = new si(\"Width\");\n e.value = 1, e.output.connectTo(this.width);\n }\n if (!this.height.isConnected) {\n const e = new si(\"Height\");\n e.value = 1, e.output.connectTo(this.height);\n }\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.size = this.size.getConnectedValue(r), t.width = this.width.getConnectedValue(r), t.height = this.height.getConnectedValue(r), Tf(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], N0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.PlaneBlock\", N0);\nclass F0 extends Ve {\n /**\n * Gets or sets the mesh to use to get vertex data\n */\n get mesh() {\n return this._mesh;\n }\n set mesh(e) {\n this._mesh = e;\n }\n /**\n * Create a new MeshBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._cachedVertexData = null, this.reverseWindingOrder = !1, this.serializedCachedData = !1, this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"MeshBlock\";\n }\n /**\n * Gets a boolean indicating if the block is using cached data\n */\n get isUsingCachedData() {\n return !this.mesh && !!this._cachedVertexData;\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n /**\n * Remove stored data\n */\n cleanData() {\n this._mesh = null, this._cachedVertexData = null;\n }\n _buildBlock() {\n if (!this._mesh) {\n this._cachedVertexData ? this.geometry._storedValue = this._cachedVertexData.clone() : this.geometry._storedValue = null;\n return;\n }\n const e = re.ExtractFromMesh(this._mesh, !1, !0);\n if (this._cachedVertexData = null, this.reverseWindingOrder && e.indices)\n for (let t = 0; t < e.indices.length; t += 3) {\n const i = e.indices[t];\n e.indices[t] = e.indices[t + 2], e.indices[t + 2] = i;\n }\n this.geometry._storedFunction = () => e.clone();\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.serializedCachedData = this.serializedCachedData, this.serializedCachedData && (this._mesh ? e.cachedVertexData = re.ExtractFromMesh(this._mesh, !1, !0).serialize() : this._cachedVertexData && (e.cachedVertexData = this._cachedVertexData.serialize())), e.reverseWindingOrder = this.reverseWindingOrder, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.cachedVertexData && (this._cachedVertexData = re.Parse(e.cachedVertexData)), this.serializedCachedData = !!e.serializedCachedData, this.reverseWindingOrder = e.reverseWindingOrder;\n }\n}\nP([\n gt(\"Serialize cached data\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], F0.prototype, \"serializedCachedData\", void 0);\nRe(\"BABYLON.MeshBlock\", F0);\nclass L0 extends Ve {\n /**\n * Create a new IcoSphereBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"radius\", b.Float, !0, 1), this.registerInput(\"radiusX\", b.Float, !0, 0), this.registerInput(\"radiusY\", b.Float, !0, 0), this.registerInput(\"radiusZ\", b.Float, !0, 0), this.registerInput(\"subdivisions\", b.Int, !0, 4), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"IcoSphereBlock\";\n }\n /**\n * Gets the radius input component\n */\n get radius() {\n return this._inputs[0];\n }\n /**\n * Gets the radiusX input component\n */\n get radiusX() {\n return this._inputs[1];\n }\n /**\n * Gets the radiusY input component\n */\n get radiusY() {\n return this._inputs[2];\n }\n /**\n * Gets the radiusZ input component\n */\n get radiusZ() {\n return this._inputs[3];\n }\n /**\n * Gets the subdivisions input component\n */\n get subdivisions() {\n return this._inputs[4];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.radius.isConnected) {\n const e = new si(\"Radius\");\n e.value = 0.2, e.output.connectTo(this.radius);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.radius = this.radius.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), t.radiusX = this.radiusX.getConnectedValue(r), t.radiusY = this.radiusY.getConnectedValue(r), t.radiusZ = this.radiusZ.getConnectedValue(r), xf(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], L0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.IcoSphereBlock\", L0);\nclass w0 extends Ve {\n /**\n * Create a new SphereBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"segments\", b.Int, !0, 32), this.registerInput(\"diameter\", b.Float, !0, 1), this.registerInput(\"diameterX\", b.Float, !0, 0), this.registerInput(\"diameterY\", b.Float, !0, 0), this.registerInput(\"diameterZ\", b.Float, !0, 0), this.registerInput(\"arc\", b.Float, !0, 1), this.registerInput(\"slice\", b.Float, !0, 1), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SphereBlock\";\n }\n /**\n * Gets the segments input component\n */\n get segments() {\n return this._inputs[0];\n }\n /**\n * Gets the diameter input component\n */\n get diameter() {\n return this._inputs[1];\n }\n /**\n * Gets the diameterX input component\n */\n get diameterX() {\n return this._inputs[2];\n }\n /**\n * Gets the diameterY input component\n */\n get diameterY() {\n return this._inputs[3];\n }\n /**\n * Gets the diameterZ input component\n */\n get diameterZ() {\n return this._inputs[4];\n }\n /**\n * Gets the arc input component\n */\n get arc() {\n return this._inputs[5];\n }\n /**\n * Gets the slice input component\n */\n get slice() {\n return this._inputs[6];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.diameter.isConnected) {\n const e = new si(\"Diameter\");\n e.value = 1, e.output.connectTo(this.diameter);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.segments = this.segments.getConnectedValue(r), t.diameter = this.diameter.getConnectedValue(r), t.diameterX = this.diameterX.getConnectedValue(r), t.diameterY = this.diameterY.getConnectedValue(r), t.diameterZ = this.diameterZ.getConnectedValue(r), t.arc = this.arc.getConnectedValue(r), t.slice = this.slice.getConnectedValue(r), _f(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], w0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.SphereBlock\", w0);\nclass U0 extends Ve {\n /**\n * Create a new GridBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"width\", b.Float, !0, 1), this.registerInput(\"height\", b.Float, !0, 1), this.registerInput(\"subdivisions\", b.Int, !0, 1), this.registerInput(\"subdivisionsX\", b.Int, !0, 0), this.registerInput(\"subdivisionsY\", b.Int, !0, 0), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GridBlock\";\n }\n /**\n * Gets the width input component\n */\n get width() {\n return this._inputs[0];\n }\n /**\n * Gets the height input component\n */\n get height() {\n return this._inputs[1];\n }\n /**\n * Gets the subdivisions input component\n */\n get subdivisions() {\n return this._inputs[2];\n }\n /**\n * Gets the subdivisionsX input component\n */\n get subdivisionsX() {\n return this._inputs[3];\n }\n /**\n * Gets the subdivisionsY input component\n */\n get subdivisionsY() {\n return this._inputs[4];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.width.isConnected) {\n const e = new si(\"Width\");\n e.value = 1, e.output.connectTo(this.width);\n }\n if (!this.height.isConnected) {\n const e = new si(\"Height\");\n e.value = 1, e.output.connectTo(this.height);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.width = this.width.getConnectedValue(r), t.height = this.height.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), t.subdivisionsX = this.subdivisionsX.getConnectedValue(r), t.subdivisionsY = this.subdivisionsY.getConnectedValue(r), Ns(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], U0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.GridBlock\", U0);\nclass V0 extends Ve {\n /**\n * Create a new TorusBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"diameter\", b.Float, !0, 1), this.registerInput(\"thickness\", b.Float, !0, 0.5), this.registerInput(\"tessellation\", b.Int, !0, 16), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"TorusBlock\";\n }\n /**\n * Gets the diameter input component\n */\n get diameter() {\n return this._inputs[0];\n }\n /**\n * Gets the thickness input component\n */\n get thickness() {\n return this._inputs[1];\n }\n /**\n * Gets the tessellation input component\n */\n get tessellation() {\n return this._inputs[2];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.diameter.isConnected) {\n const e = new si(\"Diameter\");\n e.value = 1, e.output.connectTo(this.diameter);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.thickness = this.thickness.getConnectedValue(r), t.diameter = this.diameter.getConnectedValue(r), t.tessellation = this.tessellation.getConnectedValue(r), vf(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], V0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.TorusBlock\", V0);\nclass B0 extends Ve {\n /**\n * Create a new SphereBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"height\", b.Float, !0, 25), this.registerInput(\"diameter\", b.Float, !0, 1), this.registerInput(\"diameterTop\", b.Float, !0, -1), this.registerInput(\"diameterBottom\", b.Float, !0, -1), this.registerInput(\"subdivisions\", b.Int, !0, 1), this.registerInput(\"tessellation\", b.Int, !0, 24), this.registerInput(\"arc\", b.Float, !0, 1), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"CylinderBlock\";\n }\n /**\n * Gets the height input component\n */\n get height() {\n return this._inputs[0];\n }\n /**\n * Gets the diameter input component\n */\n get diameter() {\n return this._inputs[1];\n }\n /**\n * Gets the diameterTop input component\n */\n get diameterTop() {\n return this._inputs[2];\n }\n /**\n * Gets the diameterBottom input component\n */\n get diameterBottom() {\n return this._inputs[3];\n }\n /**\n * Gets the subdivisions input component\n */\n get subdivisions() {\n return this._inputs[4];\n }\n /**\n * Gets the tessellation input component\n */\n get tessellation() {\n return this._inputs[5];\n }\n /**\n * Gets the arc input component\n */\n get arc() {\n return this._inputs[6];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.diameter.isConnected) {\n const e = new si(\"Diameter\");\n e.value = 1, e.output.connectTo(this.diameter);\n }\n if (!this.height.isConnected) {\n const e = new si(\"Height\");\n e.value = 1, e.output.connectTo(this.height);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.height = this.height.getConnectedValue(r), t.diameter = this.diameter.getConnectedValue(r), t.diameterTop = this.diameterTop.getConnectedValue(r), t.diameterBottom = this.diameterBottom.getConnectedValue(r), t.diameterTop === -1 && (t.diameterTop = t.diameter), t.diameterBottom === -1 && (t.diameterBottom = t.diameter), t.tessellation = this.tessellation.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), t.arc = this.arc.getConnectedValue(r), Ef(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], B0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.CylinderBlock\", B0);\nclass k0 extends Ve {\n /**\n * Create a new CapsuleBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"height\", b.Float, !0, 1), this.registerInput(\"radius\", b.Float, !0, 0.25), this.registerInput(\"tessellation\", b.Int, !0, 16), this.registerInput(\"subdivisions\", b.Int, !0, 2), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"CapsuleBlock\";\n }\n /**\n * Gets the height input component\n */\n get height() {\n return this._inputs[0];\n }\n /**\n * Gets the radius input component\n */\n get radius() {\n return this._inputs[1];\n }\n /**\n * Gets the tessellation input component\n */\n get tessellation() {\n return this._inputs[2];\n }\n /**\n * Gets the subdivisions input component\n */\n get subdivisions() {\n return this._inputs[3];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.height.isConnected) {\n const e = new si(\"Height\");\n e.value = 1, e.output.connectTo(this.height);\n }\n if (!this.radius.isConnected) {\n const e = new si(\"Radius\");\n e.value = 0.2, e.output.connectTo(this.radius);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.height = this.height.getConnectedValue(r), t.radius = this.radius.getConnectedValue(r), t.tessellation = this.tessellation.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), Cf(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], k0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.CapsuleBlock\", k0);\nclass z0 extends Ve {\n /**\n * Create a new DiscBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"radius\", b.Float, !0, 0.5), this.registerInput(\"tessellation\", b.Int, !0, 64), this.registerInput(\"arc\", b.Float, !0, 1), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"DiscBlock\";\n }\n /**\n * Gets the radius input component\n */\n get radius() {\n return this._inputs[0];\n }\n /**\n * Gets the tessellation input component\n */\n get tessellation() {\n return this._inputs[1];\n }\n /**\n * Gets the arc input component\n */\n get arc() {\n return this._inputs[2];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.radius.isConnected) {\n const e = new si(\"Radius\");\n e.value = 0.2, e.output.connectTo(this.radius);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.radius = this.radius.getConnectedValue(r), t.tessellation = this.tessellation.getConnectedValue(r), t.arc = this.arc.getConnectedValue(r), mf(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], z0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.DiscBlock\", z0);\nclass BP extends Ve {\n /**\n * Create a new NullBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"NullBlock\";\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n _buildBlock() {\n this.geometry._storedValue = null;\n }\n}\nRe(\"BABYLON.NullBlock\", BP);\nclass W0 extends Ve {\n /**\n * Create a new SetPositionsBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"positions\", b.Vector3), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SetPositionsBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the positions input component\n */\n get positions() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), this._vertexData = this.geometry.getConnectedValue(i), this._vertexData && (this._vertexData = this._vertexData.clone()), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions || !this.positions.isConnected) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = null;\n return;\n }\n const r = this._vertexData.positions.length / 3;\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const s = this.positions.getConnectedValue(i);\n s && s.toArray(this._vertexData.positions, this._currentIndex * 3);\n }\n return i.restoreGeometryContext(), i.restoreExecutionContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], W0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.SetPositionsBlock\", W0);\nclass G0 extends Ve {\n /**\n * Create a new SetNormalsBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"normals\", b.Vector3), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SetNormalsBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the normals input component\n */\n get normals() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), this._vertexData = this.geometry.getConnectedValue(i), this._vertexData && (this._vertexData = this._vertexData.clone()), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = null;\n return;\n }\n if (!this.normals.isConnected) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = this._vertexData;\n return;\n }\n this._vertexData.normals || (this._vertexData.normals = []);\n const r = this._vertexData.positions.length / 3;\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const s = this.normals.getConnectedValue(i);\n s && s.toArray(this._vertexData.normals, this._currentIndex * 3);\n }\n return i.restoreGeometryContext(), i.restoreExecutionContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], G0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.SetNormalsBlock\", G0);\nclass If extends Ve {\n /**\n * Create a new SetUVsBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.textureCoordinateIndex = 0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"uvs\", b.Vector2), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SetUVsBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the uvs input component\n */\n get uvs() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), this._vertexData = this.geometry.getConnectedValue(i), this._vertexData && (this._vertexData = this._vertexData.clone()), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = null;\n return;\n }\n if (!this.uvs.isConnected) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = this._vertexData;\n return;\n }\n const r = [], s = this._vertexData.positions.length / 3;\n for (this._currentIndex = 0; this._currentIndex < s; this._currentIndex++) {\n const a = this.uvs.getConnectedValue(i);\n a && a.toArray(r, this._currentIndex * 2);\n }\n switch (this.textureCoordinateIndex) {\n case 0:\n this._vertexData.uvs = r;\n break;\n case 1:\n this._vertexData.uvs2 = r;\n break;\n case 2:\n this._vertexData.uvs3 = r;\n break;\n case 3:\n this._vertexData.uvs4 = r;\n break;\n case 4:\n this._vertexData.uvs5 = r;\n break;\n case 5:\n this._vertexData.uvs6 = r;\n break;\n }\n return i.restoreGeometryContext(), i.restoreExecutionContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n let e = super._dumpPropertiesCode() + `${this._codeVariableName}.textureCoordinateIndex};\n`;\n return e += `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`, e;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e.textureCoordinateIndex = this.textureCoordinateIndex, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.textureCoordinateIndex = e.textureCoordinateIndex, e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], If.prototype, \"evaluateContext\", void 0);\nP([\n gt(\"Texture coordinates index\", ht.List, \"ADVANCED\", {\n notifiers: { update: !0 },\n options: [\n { label: \"UV1\", value: 0 },\n { label: \"UV2\", value: 1 },\n { label: \"UV3\", value: 2 },\n { label: \"UV4\", value: 3 },\n { label: \"UV5\", value: 4 },\n { label: \"UV6\", value: 5 }\n ]\n })\n], If.prototype, \"textureCoordinateIndex\", void 0);\nRe(\"BABYLON.SetUVsBlock\", If);\nclass X0 extends Ve {\n /**\n * Create a new SetColorsBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"colors\", b.AutoDetect), this.registerOutput(\"output\", b.Geometry), this._inputs[1].excludedConnectionPointTypes.push(b.Int), this._inputs[1].excludedConnectionPointTypes.push(b.Float), this._inputs[1].excludedConnectionPointTypes.push(b.Vector2), this._inputs[1].excludedConnectionPointTypes.push(b.Texture), this._inputs[1].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SetColorsBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the colors input component\n */\n get colors() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n var s;\n if (i.pushExecutionContext(this), this._vertexData = this.geometry.getConnectedValue(i), this._vertexData && (this._vertexData = this._vertexData.clone()), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = null;\n return;\n }\n if (!this.colors.isConnected) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = this._vertexData;\n return;\n }\n this._vertexData.colors || (this._vertexData.colors = []);\n const r = this._vertexData.positions.length / 3;\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++)\n if (((s = this.colors.connectedPoint) == null ? void 0 : s.type) === b.Vector3) {\n const a = this.colors.getConnectedValue(i);\n a && (a.toArray(this._vertexData.colors, this._currentIndex * 4), this._vertexData.colors[this._currentIndex * 4 + 3] = 1, this._vertexData.hasVertexAlpha = !1);\n } else {\n const a = this.colors.getConnectedValue(i);\n a && (a.toArray(this._vertexData.colors, this._currentIndex * 4), this._vertexData.hasVertexAlpha = !0);\n }\n return i.restoreGeometryContext(), i.restoreExecutionContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], X0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.SetColorsBlock\", X0);\nclass H0 extends Ve {\n /**\n * Create a new SetTangentsBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"tangents\", b.Vector4), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SetTangentsBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the tangents input component\n */\n get tangents() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), this._vertexData = this.geometry.getConnectedValue(i), this._vertexData && (this._vertexData = this._vertexData.clone()), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = null;\n return;\n }\n if (!this.tangents.isConnected) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = this._vertexData;\n return;\n }\n this._vertexData.tangents || (this._vertexData.tangents = []);\n const r = this._vertexData.positions.length / 3;\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const s = this.tangents.getConnectedValue(i);\n s && s.toArray(this._vertexData.tangents, this._currentIndex * 4);\n }\n return i.restoreGeometryContext(), i.restoreExecutionContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], H0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.SetTangentsBlock\", H0);\nvar Yi;\n(function(n) {\n n[n.Add = 0] = \"Add\", n[n.Subtract = 1] = \"Subtract\", n[n.Multiply = 2] = \"Multiply\", n[n.Divide = 3] = \"Divide\", n[n.Max = 4] = \"Max\", n[n.Min = 5] = \"Min\";\n})(Yi || (Yi = {}));\nclass K0 extends Ve {\n /**\n * Create a new MathBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.operation = Yi.Add, this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this.output._typeConnectionSource = this.left;\n const t = [\n b.Matrix,\n b.Geometry,\n b.Texture\n ];\n this.left.excludedConnectionPointTypes.push(...t), this.right.excludedConnectionPointTypes.push(...t), this._linkConnectionTypes(0, 1), this._connectionObservers = [\n this.left.onConnectionObservable.add(() => this._updateInputOutputTypes()),\n this.left.onDisconnectionObservable.add(() => this._updateInputOutputTypes()),\n this.right.onConnectionObservable.add(() => this._updateInputOutputTypes()),\n this.right.onDisconnectionObservable.add(() => this._updateInputOutputTypes())\n ];\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"MathBlock\";\n }\n /**\n * Gets the left input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n let e;\n const t = this.left, i = this.right;\n if (!t.isConnected || !i.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const r = t.type === b.Float || t.type === b.Int, s = i.type === b.Float || i.type === b.Int, a = r && s;\n switch (this.operation) {\n case Yi.Add: {\n a ? e = (o) => t.getConnectedValue(o) + i.getConnectedValue(o) : r ? e = (o) => o.adapt(t, i.type).add(i.getConnectedValue(o)) : e = (o) => t.getConnectedValue(o).add(o.adapt(i, t.type));\n break;\n }\n case Yi.Subtract: {\n a ? e = (o) => t.getConnectedValue(o) - i.getConnectedValue(o) : r ? e = (o) => o.adapt(t, i.type).subtract(i.getConnectedValue(o)) : e = (o) => t.getConnectedValue(o).subtract(o.adapt(i, t.type));\n break;\n }\n case Yi.Multiply: {\n a ? e = (o) => t.getConnectedValue(o) * i.getConnectedValue(o) : r ? e = (o) => o.adapt(t, i.type).multiply(i.getConnectedValue(o)) : e = (o) => t.getConnectedValue(o).multiply(o.adapt(i, t.type));\n break;\n }\n case Yi.Divide: {\n a ? e = (o) => t.getConnectedValue(o) / i.getConnectedValue(o) : r ? e = (o) => o.adapt(t, i.type).divide(i.getConnectedValue(o)) : e = (o) => t.getConnectedValue(o).divide(o.adapt(i, t.type));\n break;\n }\n case Yi.Min: {\n if (a)\n e = (o) => Math.min(t.getConnectedValue(o), i.getConnectedValue(o));\n else {\n const [o, l] = r ? [i, t] : [t, i];\n switch (o.type) {\n case b.Vector2: {\n e = (c) => me.Minimize(o.getConnectedValue(c), c.adapt(l, o.type));\n break;\n }\n case b.Vector3: {\n e = (c) => _.Minimize(o.getConnectedValue(c), c.adapt(l, o.type));\n break;\n }\n case b.Vector4: {\n e = (c) => Ke.Minimize(o.getConnectedValue(c), c.adapt(l, o.type));\n break;\n }\n }\n }\n break;\n }\n case Yi.Max:\n if (a)\n e = (o) => Math.max(t.getConnectedValue(o), i.getConnectedValue(o));\n else {\n const [o, l] = r ? [i, t] : [t, i];\n switch (o.type) {\n case b.Vector2: {\n e = (c) => me.Maximize(o.getConnectedValue(c), c.adapt(l, o.type));\n break;\n }\n case b.Vector3: {\n e = (c) => _.Maximize(o.getConnectedValue(c), c.adapt(l, o.type));\n break;\n }\n case b.Vector4: {\n e = (c) => Ke.Maximize(o.getConnectedValue(c), c.adapt(l, o.type));\n break;\n }\n }\n break;\n }\n }\n this.output._storedFunction = (o) => t.type === b.Int ? e(o) | 0 : e(o);\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.operation = BABYLON.MathBlockOperations.${Yi[this.operation]};\n`;\n }\n _updateInputOutputTypes() {\n if (this.output._typeConnectionSource = this.left, this.left.isConnected && this.right.isConnected ? (this.left.type === b.Int || this.left.type === b.Float && this.right.type !== b.Int) && (this.output._typeConnectionSource = this.right) : this.left.isConnected !== this.right.isConnected && (this.output._typeConnectionSource = this.left.isConnected ? this.left : this.right), this.left.isConnected || this.right.isConnected)\n for (const [e, t] of [\n [this.left, this.right],\n [this.right, this.left]\n ])\n e.acceptedConnectionPointTypes = [b.Int, b.Float], t.isConnected && (e.acceptedConnectionPointTypes.push(t.type), (t.type === b.Int || t.type === b.Float) && e.acceptedConnectionPointTypes.push(b.Vector2, b.Vector3, b.Vector4));\n }\n /**\n * Release resources\n */\n dispose() {\n super.dispose(), this._connectionObservers.forEach((e) => e.remove()), this._connectionObservers.length = 0;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.operation = this.operation, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.operation = e.operation;\n }\n}\nP([\n gt(\"Operation\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"Add\", value: Yi.Add },\n { label: \"Subtract\", value: Yi.Subtract },\n { label: \"Multiply\", value: Yi.Multiply },\n { label: \"Divide\", value: Yi.Divide },\n { label: \"Max\", value: Yi.Max },\n { label: \"Min\", value: Yi.Min }\n ]\n })\n], K0.prototype, \"operation\", void 0);\nRe(\"BABYLON.MathBlock\", K0);\nclass kP extends Ve {\n /**\n * Create a new MapRangeBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"fromMin\", b.Float, !0, 0), this.registerInput(\"fromMax\", b.Float, !0, 1), this.registerInput(\"toMin\", b.Float, !0, 0), this.registerInput(\"toMax\", b.Float, !0, 1), this.registerOutput(\"output\", b.BasedOnInput), this._inputs[0].excludedConnectionPointTypes.push(b.Vector2), this._inputs[0].excludedConnectionPointTypes.push(b.Vector3), this._inputs[0].excludedConnectionPointTypes.push(b.Vector4), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture), this._outputs[0]._typeConnectionSource = this._inputs[0];\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"MapRangeBlock\";\n }\n /**\n * Gets the value input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the fromMin input component\n */\n get fromMin() {\n return this._inputs[1];\n }\n /**\n * Gets the fromMax input component\n */\n get fromMax() {\n return this._inputs[2];\n }\n /**\n * Gets the toMin input component\n */\n get toMin() {\n return this._inputs[3];\n }\n /**\n * Gets the toMax input component\n */\n get toMax() {\n return this._inputs[4];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n this.output._storedFunction = (e) => {\n const t = this.value.getConnectedValue(e), i = this.fromMin.getConnectedValue(e), r = this.fromMax.getConnectedValue(e), s = this.toMin.getConnectedValue(e), a = this.toMax.getConnectedValue(e), o = (t - i) / (r - i) * (a - s) + s;\n return this.output.type === b.Int ? Math.floor(o) : o;\n };\n }\n}\nRe(\"BABYLON.MapRangeBlock\", kP);\nvar fi;\n(function(n) {\n n[n.Equal = 0] = \"Equal\", n[n.NotEqual = 1] = \"NotEqual\", n[n.LessThan = 2] = \"LessThan\", n[n.GreaterThan = 3] = \"GreaterThan\", n[n.LessOrEqual = 4] = \"LessOrEqual\", n[n.GreaterOrEqual = 5] = \"GreaterOrEqual\", n[n.Xor = 6] = \"Xor\", n[n.Or = 7] = \"Or\", n[n.And = 8] = \"And\";\n})(fi || (fi = {}));\nclass q0 extends Ve {\n /**\n * Create a new ConditionBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.test = fi.Equal, this.registerInput(\"left\", b.Float), this.registerInput(\"right\", b.Float, !0, 0), this.registerInput(\"ifTrue\", b.AutoDetect, !0, 1), this.registerInput(\"ifFalse\", b.AutoDetect, !0, 0), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[2], this._outputs[0]._defaultConnectionPointType = b.Float, this._inputs[0].acceptedConnectionPointTypes.push(b.Int), this._inputs[1].acceptedConnectionPointTypes.push(b.Int), this._linkConnectionTypes(2, 3);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"ConditionBlock\";\n }\n /**\n * Gets the left input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the ifTrue input component\n */\n get ifTrue() {\n return this._inputs[2];\n }\n /**\n * Gets the ifFalse input component\n */\n get ifFalse() {\n return this._inputs[3];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t) => {\n const i = this.left.getConnectedValue(t), r = this.right.getConnectedValue(t);\n let s = !1;\n switch (this.test) {\n case fi.Equal:\n s = je.WithinEpsilon(i, r, xt);\n break;\n case fi.NotEqual:\n s = i !== r;\n break;\n case fi.LessThan:\n s = i < r;\n break;\n case fi.GreaterThan:\n s = i > r;\n break;\n case fi.LessOrEqual:\n s = i <= r;\n break;\n case fi.GreaterOrEqual:\n s = i >= r;\n break;\n case fi.Xor:\n s = !!i && !r || !i && !!r;\n break;\n case fi.Or:\n s = !!i || !!r;\n break;\n case fi.And:\n s = !!i && !!r;\n break;\n }\n return s;\n };\n this.output._storedFunction = (t) => e(t) ? this.ifTrue.getConnectedValue(t) : this.ifFalse.getConnectedValue(t);\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.test = BABYLON.ConditionBlockTests.${fi[this.test]};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.test = this.test, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.test = e.test;\n }\n}\nP([\n gt(\"Test\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"Equal\", value: fi.Equal },\n { label: \"NotEqual\", value: fi.NotEqual },\n { label: \"LessThan\", value: fi.LessThan },\n { label: \"GreaterThan\", value: fi.GreaterThan },\n { label: \"LessOrEqual\", value: fi.LessOrEqual },\n { label: \"GreaterOrEqual\", value: fi.GreaterOrEqual },\n { label: \"Xor\", value: fi.Xor },\n { label: \"Or\", value: fi.Or },\n { label: \"And\", value: fi.And }\n ]\n })\n], q0.prototype, \"test\", void 0);\nRe(\"BABYLON.ConditionBlock\", q0);\nvar Yr;\n(function(n) {\n n[n.None = 0] = \"None\", n[n.LoopID = 1] = \"LoopID\", n[n.InstanceID = 2] = \"InstanceID\";\n})(Yr || (Yr = {}));\nclass Y0 extends Ve {\n /**\n * Create a new RandomBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._currentLockId = -1, this.lockMode = Yr.None, this.registerInput(\"min\", b.AutoDetect), this.registerInput(\"max\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Geometry), this._inputs[1].excludedConnectionPointTypes.push(b.Texture), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"RandomBlock\";\n }\n /**\n * Gets the min input component\n */\n get min() {\n return this._inputs[0];\n }\n /**\n * Gets the max input component\n */\n get max() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.min.isConnected) {\n const e = new si(\"Min\");\n e.value = 0, e.output.connectTo(this.min);\n }\n if (!this.max.isConnected) {\n const e = new si(\"Max\");\n e.value = 1, e.output.connectTo(this.max);\n }\n }\n _buildBlock() {\n let e = null;\n switch (this._currentLockId = -1, this.min.type) {\n case b.Int:\n case b.Float: {\n e = (t) => {\n const i = this.min.getConnectedValue(t) || 0, r = this.max.getConnectedValue(t) || 0;\n return i + Math.random() * (r - i);\n };\n break;\n }\n case b.Vector2: {\n e = (t) => {\n const i = this.min.getConnectedValue(t) || me.Zero(), r = this.max.getConnectedValue(t) || me.Zero();\n return new me(i.x + Math.random() * (r.x - i.x), i.y + Math.random() * (r.y - i.y));\n };\n break;\n }\n case b.Vector3: {\n e = (t) => {\n const i = this.min.getConnectedValue(t) || _.Zero(), r = this.max.getConnectedValue(t) || _.Zero();\n return new _(i.x + Math.random() * (r.x - i.x), i.y + Math.random() * (r.y - i.y), i.z + Math.random() * (r.z - i.z));\n };\n break;\n }\n case b.Vector4: {\n e = (t) => {\n const i = this.min.getConnectedValue(t) || Ke.Zero(), r = this.max.getConnectedValue(t) || Ke.Zero();\n return new Ke(i.x + Math.random() * (r.x - i.x), i.y + Math.random() * (r.y - i.y), i.z + Math.random() * (r.z - i.z), i.w + Math.random() * (r.w - i.w));\n };\n break;\n }\n }\n this.lockMode === Yr.None || !e ? this.output._storedFunction = e : this.output._storedFunction = (t) => {\n let i = 0;\n switch (this.lockMode) {\n case Yr.InstanceID:\n i = t.getContextualValue(ct.InstanceID, !0) || 0;\n break;\n case Yr.LoopID:\n i = t.getContextualValue(ct.LoopID, !0) || 0;\n break;\n }\n return (this._currentLockId !== i || this.lockMode === Yr.None) && (this._currentLockId = i, this.output._storedValue = e(t)), this.output._storedValue;\n };\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.lockMode = BABYLON.RandomBlockLocks.${Yr[this.lockMode]};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.lockMode = this.lockMode, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.lockMode = e.lockMode;\n }\n}\nP([\n gt(\"LockMode\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"None\", value: Yr.None },\n { label: \"LoopID\", value: Yr.LoopID },\n { label: \"InstanceID\", value: Yr.InstanceID }\n ]\n })\n], Y0.prototype, \"lockMode\", void 0);\nRe(\"BABYLON.RandomBlock\", Y0);\nclass zP extends Ve {\n /**\n * Create a new NoiseBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"offset\", b.Vector3, !0, _.Zero()), this.registerInput(\"scale\", b.Float, !0, 1), this.registerInput(\"octaves\", b.Float, !0, 2, 0, 16), this.registerInput(\"roughness\", b.Float, !0, 0.5, 0, 1), this.registerOutput(\"output\", b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"NoiseBlock\";\n }\n /**\n * Gets the offset input component\n */\n get offset() {\n return this._inputs[0];\n }\n /**\n * Gets the scale input component\n */\n get scale() {\n return this._inputs[1];\n }\n /**\n * Gets the octaves input component\n */\n get octaves() {\n return this._inputs[2];\n }\n /**\n * Gets the roughtness input component\n */\n get roughness() {\n return this._inputs[3];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _negateIf(e, t) {\n return t !== 0 ? -e : e;\n }\n _noiseGrad(e, t, i, r) {\n const s = e & 15, a = s < 8 ? t : i, o = s === 12 || s == 14 ? t : r, l = s < 4 ? i : o;\n return this._negateIf(a, s & a) + this._negateIf(l, s & 2);\n }\n _fade(e) {\n return e * e * e * (e * (e * 6 - 15) + 10);\n }\n _hashBitRotate(e, t) {\n return e << t | e >> 32 - t;\n }\n _hash(e, t, i) {\n let r, s, a;\n return r = s = a = 3735928584, a += i, s += t, r += e, a ^= s, a -= this._hashBitRotate(s, 14), r ^= a, r -= this._hashBitRotate(a, 11), s ^= r, s -= this._hashBitRotate(r, 25), a ^= s, a -= this._hashBitRotate(s, 16), r ^= a, r -= this._hashBitRotate(a, 4), s ^= r, s -= this._hashBitRotate(r, 14), a ^= s, a -= this._hashBitRotate(s, 24), a;\n }\n _mix(e, t, i, r, s, a, o, l, c, h, u) {\n const f = 1 - c, d = 1 - h;\n return (1 - u) * (d * (e * f + t * c) + h * (i * f + r * c)) + u * (d * (s * f + a * c) + h * (o * f + l * c));\n }\n _perlinNoise(e) {\n const t = (e.x | 0) - (e.x < 0 ? 1 : 0), i = (e.y | 0) - (e.y < 0 ? 1 : 0), r = (e.z | 0) - (e.z < 0 ? 1 : 0), s = e.x - t, a = e.y - i, o = e.z - r, l = this._fade(s), c = this._fade(a), h = this._fade(o);\n return this._mix(this._noiseGrad(this._hash(t, i, r), s, a, o), this._noiseGrad(this._hash(t + 1, i, r), s - 1, a, o), this._noiseGrad(this._hash(t, i + 1, r), s, a - 1, o), this._noiseGrad(this._hash(t + 1, i + 1, r), s - 1, a - 1, o), this._noiseGrad(this._hash(t, i, r + 1), s, a, o - 1), this._noiseGrad(this._hash(t + 1, i, r + 1), s - 1, a, o - 1), this._noiseGrad(this._hash(t, i + 1, r + 1), s, a - 1, o - 1), this._noiseGrad(this._hash(t + 1, i + 1, r + 1), s - 1, a - 1, o - 1), l, c, h);\n }\n _perlinSigned(e) {\n return this._perlinNoise(e) * 0.982;\n }\n _perlin(e) {\n return this._perlinSigned(e) / 2 + 0.5;\n }\n /**\n * Gets a perlin noise value\n * @param octaves number of octaves\n * @param roughness roughness\n * @param _position position vector\n * @param offset offset vector\n * @param scale scale value\n * @returns a value between 0 and 1\n * @see Based on https://github.com/blender/blender/blob/main/source/blender/blenlib/intern/noise.cc#L533\n */\n noise(e, t, i, r, s) {\n const a = new _(i.x * s + r.x, i.y * s + r.y, i.z * s + r.z);\n let o = 1, l = 1, c = 0, h = 0;\n e = je.Clamp(e, 0, 15);\n const u = e | 0;\n for (let g = 0; g <= u; g++) {\n const m = this._perlin(a.scale(o));\n h += m * l, c += l, l *= je.Clamp(t, 0, 1), o *= 2;\n }\n const f = e - Math.floor(e);\n if (f == 0)\n return h / c;\n const d = this._perlin(a.scale(o));\n let p = h + d * l;\n return h /= c, p /= c + l, (1 - f) * h + f * p;\n }\n _buildBlock() {\n this.output._storedFunction = (e) => {\n const t = e.getContextualValue(ct.Positions), i = this.octaves.getConnectedValue(e), r = this.roughness.getConnectedValue(e), s = this.offset.getConnectedValue(e), a = this.scale.getConnectedValue(e);\n return this.noise(i, r, t, s, a);\n };\n }\n}\nRe(\"BABYLON.NoiseBlock\", zP);\nclass Z0 extends Ve {\n /**\n * Create a new MergeGeometryBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"geometry0\", b.Geometry), this.registerInput(\"geometry1\", b.Geometry, !0), this.registerInput(\"geometry2\", b.Geometry, !0), this.registerInput(\"geometry3\", b.Geometry, !0), this.registerInput(\"geometry4\", b.Geometry, !0), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"MergeGeometryBlock\";\n }\n /**\n * Gets the geometry0 input component\n */\n get geometry0() {\n return this._inputs[0];\n }\n /**\n * Gets the geometry1 input component\n */\n get geometry1() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry2 input component\n */\n get geometry2() {\n return this._inputs[2];\n }\n /**\n * Gets the geometry3 input component\n */\n get geometry3() {\n return this._inputs[3];\n }\n /**\n * Gets the geometry4 input component\n */\n get geometry4() {\n return this._inputs[4];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n let r = this.geometry0.getConnectedValue(i);\n const s = [];\n if (r)\n r = r.clone();\n else\n return null;\n if (this.geometry1.isConnected) {\n const a = this.geometry1.getConnectedValue(i);\n a && s.push(a);\n }\n if (this.geometry2.isConnected) {\n const a = this.geometry2.getConnectedValue(i);\n a && s.push(a);\n }\n if (this.geometry3.isConnected) {\n const a = this.geometry3.getConnectedValue(i);\n a && s.push(a);\n }\n if (this.geometry4.isConnected) {\n const a = this.geometry4.getConnectedValue(i);\n a && s.push(a);\n }\n return s.length && r && (r = r.merge(s, !0, !1, !0, !0)), r;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], Z0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.MergeGeometryBlock\", Z0);\nclass j0 extends Ve {\n /**\n * Create a new GeometryCollectionBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"geometry0\", b.Geometry, !0), this.registerInput(\"geometry1\", b.Geometry, !0), this.registerInput(\"geometry2\", b.Geometry, !0), this.registerInput(\"geometry3\", b.Geometry, !0), this.registerInput(\"geometry4\", b.Geometry, !0), this.registerInput(\"geometry5\", b.Geometry, !0), this.registerInput(\"geometry6\", b.Geometry, !0), this.registerInput(\"geometry7\", b.Geometry, !0), this.registerInput(\"geometry8\", b.Geometry, !0), this.registerInput(\"geometry9\", b.Geometry, !0), this.registerOutput(\"output\", b.Geometry), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryCollectionBlock\";\n }\n /**\n * Gets the geometry0 input component\n */\n get geometry0() {\n return this._inputs[0];\n }\n /**\n * Gets the geometry1 input component\n */\n get geometry1() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry2 input component\n */\n get geometry2() {\n return this._inputs[2];\n }\n /**\n * Gets the geometry3 input component\n */\n get geometry3() {\n return this._inputs[3];\n }\n /**\n * Gets the geometry4 input component\n */\n get geometry4() {\n return this._inputs[4];\n }\n /**\n * Gets the geometry5 input component\n */\n get geometry5() {\n return this._inputs[5];\n }\n /**\n * Gets the geometry6 input component\n */\n get geometry6() {\n return this._inputs[6];\n }\n /**\n * Gets the geometry7 input component\n */\n get geometry7() {\n return this._inputs[7];\n }\n /**\n * Gets the geometry8 input component\n */\n get geometry8() {\n return this._inputs[8];\n }\n /**\n * Gets the geometry9 input component\n */\n get geometry9() {\n return this._inputs[9];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _storeGeometry(e, t, i, r) {\n if (e.isConnected) {\n const s = e.getConnectedValue(t);\n if (!s)\n return;\n s.metadata = s.metadata || {}, s.metadata.collectionId = i, r.push(s);\n }\n }\n _buildBlock(e) {\n const t = (i) => {\n const r = [];\n return this._storeGeometry(this.geometry0, i, 0, r), this._storeGeometry(this.geometry1, i, 1, r), this._storeGeometry(this.geometry2, i, 2, r), this._storeGeometry(this.geometry3, i, 3, r), this._storeGeometry(this.geometry4, i, 4, r), this._storeGeometry(this.geometry5, i, 5, r), this._storeGeometry(this.geometry6, i, 6, r), this._storeGeometry(this.geometry7, i, 7, r), this._storeGeometry(this.geometry8, i, 8, r), this._storeGeometry(this.geometry9, i, 9, r), r.length ? r[Math.round(Math.random() * (r.length - 1))] : null;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], j0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.GeometryCollectionBlock\", j0);\nclass WP extends Ve {\n /**\n * Creates a new GeometryElbowBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"input\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0];\n }\n /**\n * Gets the time spent to build this block (in ms)\n */\n get buildExecutionTime() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryElbowBlock\";\n }\n /**\n * Gets the input component\n */\n get input() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n super._buildBlock(e);\n const t = this._outputs[0], i = this._inputs[0];\n t._storedFunction = (r) => i.getConnectedValue(r);\n }\n}\nRe(\"BABYLON.GeometryElbowBlock\", WP);\nclass GP extends Ve {\n /**\n * Creates a new ComputeNormalsBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"geometry\", b.Geometry), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"ComputeNormalsBlock\";\n }\n /**\n * Gets the geometry component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n this.output._storedFunction = (e) => {\n if (!this.geometry.isConnected)\n return null;\n const t = this.geometry.getConnectedValue(e);\n return t.normals || (t.normals = []), re.ComputeNormals(t.positions, t.indices, t.normals), t;\n };\n }\n}\nRe(\"BABYLON.ComputeNormalsBlock\", GP);\nclass XP extends Ve {\n /**\n * Create a new VectorConverterBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"xyzw \", b.Vector4, !0), this.registerInput(\"xyz \", b.Vector3, !0), this.registerInput(\"xy \", b.Vector2, !0), this.registerInput(\"zw \", b.Vector2, !0), this.registerInput(\"x \", b.Float, !0), this.registerInput(\"y \", b.Float, !0), this.registerInput(\"z \", b.Float, !0), this.registerInput(\"w \", b.Float, !0), this.registerOutput(\"xyzw\", b.Vector4), this.registerOutput(\"xyz\", b.Vector3), this.registerOutput(\"xy\", b.Vector2), this.registerOutput(\"zw\", b.Vector2), this.registerOutput(\"x\", b.Float), this.registerOutput(\"y\", b.Float), this.registerOutput(\"z\", b.Float), this.registerOutput(\"w\", b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"VectorConverterBlock\";\n }\n /**\n * Gets the xyzw component (input)\n */\n get xyzwIn() {\n return this._inputs[0];\n }\n /**\n * Gets the xyz component (input)\n */\n get xyzIn() {\n return this._inputs[1];\n }\n /**\n * Gets the xy component (input)\n */\n get xyIn() {\n return this._inputs[2];\n }\n /**\n * Gets the zw component (input)\n */\n get zwIn() {\n return this._inputs[3];\n }\n /**\n * Gets the x component (input)\n */\n get xIn() {\n return this._inputs[4];\n }\n /**\n * Gets the y component (input)\n */\n get yIn() {\n return this._inputs[5];\n }\n /**\n * Gets the z component (input)\n */\n get zIn() {\n return this._inputs[6];\n }\n /**\n * Gets the w component (input)\n */\n get wIn() {\n return this._inputs[7];\n }\n /**\n * Gets the xyzw component (output)\n */\n get xyzwOut() {\n return this._outputs[0];\n }\n /**\n * Gets the xyz component (output)\n */\n get xyzOut() {\n return this._outputs[1];\n }\n /**\n * Gets the xy component (output)\n */\n get xyOut() {\n return this._outputs[2];\n }\n /**\n * Gets the zw component (output)\n */\n get zwOut() {\n return this._outputs[3];\n }\n /**\n * Gets the x component (output)\n */\n get xOut() {\n return this._outputs[4];\n }\n /**\n * Gets the y component (output)\n */\n get yOut() {\n return this._outputs[5];\n }\n /**\n * Gets the z component (output)\n */\n get zOut() {\n return this._outputs[6];\n }\n /**\n * Gets the w component (output)\n */\n get wOut() {\n return this._outputs[7];\n }\n _inputRename(e) {\n return e === \"xyzw \" ? \"xyzwIn\" : e === \"xyz \" ? \"xyzIn\" : e === \"xy \" ? \"xyIn\" : e === \"zw \" ? \"zwIn\" : e === \"x \" ? \"xIn\" : e === \"y \" ? \"yIn\" : e === \"z \" ? \"zIn\" : e === \"w \" ? \"wIn\" : e;\n }\n _outputRename(e) {\n switch (e) {\n case \"x\":\n return \"xOut\";\n case \"y\":\n return \"yOut\";\n case \"z\":\n return \"zOut\";\n case \"w\":\n return \"wOut\";\n case \"xy\":\n return \"xyOut\";\n case \"zw\":\n return \"zwOut\";\n case \"xyz\":\n return \"xyzOut\";\n case \"xyzw\":\n return \"xyzwOut\";\n default:\n return e;\n }\n }\n _buildBlock(e) {\n super._buildBlock(e);\n const t = this.xIn, i = this.yIn, r = this.zIn, s = this.wIn, a = this.xyIn, o = this.zwIn, l = this.xyzIn, c = this.xyzwIn, h = this.xyzwOut, u = this.xyzOut, f = this.xyOut, d = this.zwOut, p = this.xOut, g = this.yOut, m = this.zOut, v = this.wOut, E = (C) => {\n if (c.isConnected)\n return c.getConnectedValue(C);\n let T = 0, R = 0, x = 0, S = 0;\n if (t.isConnected && (T = t.getConnectedValue(C)), i.isConnected && (R = i.getConnectedValue(C)), r.isConnected && (x = r.getConnectedValue(C)), s.isConnected && (S = s.getConnectedValue(C)), a.isConnected) {\n const M = a.getConnectedValue(C);\n M && (T = M.x, R = M.y);\n }\n if (o.isConnected) {\n const M = o.getConnectedValue(C);\n M && (x = M.x, S = M.y);\n }\n if (l.isConnected) {\n const M = l.getConnectedValue(C);\n M && (T = M.x, R = M.y, x = M.z);\n }\n return new Ke(T, R, x, S);\n };\n h._storedFunction = (C) => E(C), u._storedFunction = (C) => {\n const T = E(C);\n return new _(T.x, T.y, T.z);\n }, f._storedFunction = (C) => {\n const T = E(C);\n return new me(T.x, T.y);\n }, d._storedFunction = (C) => {\n const T = E(C);\n return new me(T.z, T.w);\n }, p._storedFunction = (C) => E(C).x, g._storedFunction = (C) => E(C).y, m._storedFunction = (C) => E(C).z, v._storedFunction = (C) => E(C).w;\n }\n}\nRe(\"BABYLON.VectorConverterBlock\", XP);\nclass HP extends Ve {\n /**\n * Creates a new NormalizeVectorBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"input\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture), this._outputs[0]._typeConnectionSource = this._inputs[0];\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"NormalizeVectorBlock\";\n }\n /**\n * Gets the input component\n */\n get input() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n if (super._buildBlock(e), this.output._storedFunction = null, !this.input.isConnected) {\n this.output._storedValue = null;\n return;\n }\n this.output._storedFunction = (t) => this.input.getConnectedValue(t).normalize();\n }\n}\nRe(\"BABYLON.NormalizeVectorBlock\", HP);\nclass Q0 extends Ve {\n /**\n * Create a new SetMaterialIDBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"id\", b.Int, !0, 0), this.registerOutput(\"output\", b.Geometry), this.id.acceptedConnectionPointTypes.push(b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SetMaterialIDBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the id input component\n */\n get id() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n if (!this.geometry.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const t = (i) => {\n const r = this.geometry.getConnectedValue(i);\n if (!r || !r.indices || !r.positions)\n return r;\n const s = new Gl();\n return s.materialIndex = this.id.getConnectedValue(i) | 0, s.indexStart = 0, s.indexCount = r.indices.length, s.verticesStart = 0, s.verticesCount = r.positions.length / 3, r.materialInfos = [s], r;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], Q0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.SetMaterialIDBlock\", Q0);\nvar it;\n(function(n) {\n n[n.Cos = 0] = \"Cos\", n[n.Sin = 1] = \"Sin\", n[n.Abs = 2] = \"Abs\", n[n.Exp = 3] = \"Exp\", n[n.Round = 4] = \"Round\", n[n.Floor = 5] = \"Floor\", n[n.Ceiling = 6] = \"Ceiling\", n[n.Sqrt = 7] = \"Sqrt\", n[n.Log = 8] = \"Log\", n[n.Tan = 9] = \"Tan\", n[n.ArcTan = 10] = \"ArcTan\", n[n.ArcCos = 11] = \"ArcCos\", n[n.ArcSin = 12] = \"ArcSin\", n[n.Sign = 13] = \"Sign\", n[n.Negate = 14] = \"Negate\", n[n.OneMinus = 15] = \"OneMinus\", n[n.Reciprocal = 16] = \"Reciprocal\", n[n.ToDegrees = 17] = \"ToDegrees\", n[n.ToRadians = 18] = \"ToRadians\", n[n.Fract = 19] = \"Fract\", n[n.Exp2 = 20] = \"Exp2\";\n})(it || (it = {}));\nclass J0 extends Ve {\n /**\n * Creates a new GeometryTrigonometryBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.operation = it.Cos, this.registerInput(\"input\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryTrigonometryBlock\";\n }\n /**\n * Gets the input component\n */\n get input() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n super._buildBlock(e);\n let t = null;\n switch (this.operation) {\n case it.Cos: {\n t = (i) => Math.cos(i);\n break;\n }\n case it.Sin: {\n t = (i) => Math.sin(i);\n break;\n }\n case it.Abs: {\n t = (i) => Math.abs(i);\n break;\n }\n case it.Exp: {\n t = (i) => Math.exp(i);\n break;\n }\n case it.Exp2: {\n t = (i) => Math.pow(2, i);\n break;\n }\n case it.Round: {\n t = (i) => Math.round(i);\n break;\n }\n case it.Floor: {\n t = (i) => Math.floor(i);\n break;\n }\n case it.Ceiling: {\n t = (i) => Math.ceil(i);\n break;\n }\n case it.Sqrt: {\n t = (i) => Math.sqrt(i);\n break;\n }\n case it.Log: {\n t = (i) => Math.log(i);\n break;\n }\n case it.Tan: {\n t = (i) => Math.tan(i);\n break;\n }\n case it.ArcTan: {\n t = (i) => Math.atan(i);\n break;\n }\n case it.ArcCos: {\n t = (i) => Math.acos(i);\n break;\n }\n case it.ArcSin: {\n t = (i) => Math.asin(i);\n break;\n }\n case it.Sign: {\n t = (i) => Math.sign(i);\n break;\n }\n case it.Negate: {\n t = (i) => -i;\n break;\n }\n case it.OneMinus: {\n t = (i) => 1 - i;\n break;\n }\n case it.Reciprocal: {\n t = (i) => 1 / i;\n break;\n }\n case it.ToRadians: {\n t = (i) => i * Math.PI / 180;\n break;\n }\n case it.ToDegrees: {\n t = (i) => i * 180 / Math.PI;\n break;\n }\n case it.Fract: {\n t = (i) => i >= 0 ? i - Math.floor(i) : i - Math.ceil(i);\n break;\n }\n }\n if (!t) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n switch (this.input.type) {\n case b.Int:\n case b.Float: {\n this.output._storedFunction = (i) => {\n const r = this.input.getConnectedValue(i);\n return t(r);\n };\n break;\n }\n case b.Vector2: {\n this.output._storedFunction = (i) => {\n const r = this.input.getConnectedValue(i);\n return new me(t(r.x), t(r.y));\n };\n break;\n }\n case b.Vector3: {\n this.output._storedFunction = (i) => {\n const r = this.input.getConnectedValue(i);\n return new _(t(r.x), t(r.y), t(r.z));\n };\n break;\n }\n case b.Vector4: {\n this.output._storedFunction = (i) => {\n const r = this.input.getConnectedValue(i);\n return new Ke(t(r.x), t(r.y), t(r.z), t(r.w));\n };\n break;\n }\n }\n return this;\n }\n serialize() {\n const e = super.serialize();\n return e.operation = this.operation, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.operation = e.operation;\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.operation = BABYLON.GeometryTrigonometryBlockOperations.${it[this.operation]};\n`;\n }\n}\nP([\n gt(\"Operation\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"Cos\", value: it.Cos },\n { label: \"Sin\", value: it.Sin },\n { label: \"Abs\", value: it.Abs },\n { label: \"Exp\", value: it.Exp },\n { label: \"Exp2\", value: it.Exp2 },\n { label: \"Round\", value: it.Round },\n { label: \"Floor\", value: it.Floor },\n { label: \"Ceiling\", value: it.Ceiling },\n { label: \"Sqrt\", value: it.Sqrt },\n { label: \"Log\", value: it.Log },\n { label: \"Tan\", value: it.Tan },\n { label: \"ArcTan\", value: it.ArcTan },\n { label: \"ArcCos\", value: it.ArcCos },\n { label: \"ArcSin\", value: it.ArcSin },\n { label: \"Sign\", value: it.Sign },\n { label: \"Negate\", value: it.Negate },\n { label: \"OneMinus\", value: it.OneMinus },\n { label: \"Reciprocal\", value: it.Reciprocal },\n { label: \"ToDegrees\", value: it.ToDegrees },\n { label: \"ToRadians\", value: it.ToRadians },\n { label: \"Fract\", value: it.Fract }\n ]\n })\n], J0.prototype, \"operation\", void 0);\nRe(\"BABYLON.GeometryTrigonometryBlock\", J0);\nclass $0 extends Ve {\n /**\n * Create a new GeometryTransformBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._rotationMatrix = new w(), this._scalingMatrix = new w(), this._translationMatrix = new w(), this._scalingRotationMatrix = new w(), this._transformMatrix = new w(), this.evaluateContext = !0, this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"matrix\", b.Matrix, !0), this.registerInput(\"translation\", b.Vector3, !0, _.Zero()), this.registerInput(\"rotation\", b.Vector3, !0, _.Zero()), this.registerInput(\"scaling\", b.Vector3, !0, _.One()), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryTransformBlock\";\n }\n /**\n * Gets the value input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix input component\n */\n get matrix() {\n return this._inputs[1];\n }\n /**\n * Gets the translation input component\n */\n get translation() {\n return this._inputs[2];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[3];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[4];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n if (!this.value.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const t = (i) => {\n const r = this.value.getConnectedValue(i);\n if (!r)\n return null;\n let s;\n if (this.matrix.isConnected)\n s = this.matrix.getConnectedValue(i);\n else {\n const a = this.scaling.getConnectedValue(i), o = this.rotation.getConnectedValue(i), l = this.translation.getConnectedValue(i);\n w.ScalingToRef(a.x, a.y, a.z, this._scalingMatrix), w.RotationYawPitchRollToRef(o.y, o.x, o.z, this._rotationMatrix), w.TranslationToRef(l.x, l.y, l.z, this._translationMatrix), this._scalingMatrix.multiplyToRef(this._rotationMatrix, this._scalingRotationMatrix), this._scalingRotationMatrix.multiplyToRef(this._translationMatrix, this._transformMatrix), s = this._transformMatrix;\n }\n switch (this.value.type) {\n case b.Geometry: {\n const a = r.clone();\n return a.transform(s), a;\n }\n case b.Vector2:\n return me.Transform(r, s);\n case b.Vector3:\n return _.TransformCoordinates(r, s);\n case b.Vector4:\n return Ke.TransformCoordinates(r, s);\n }\n return null;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], $0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.GeometryTransformBlock\", $0);\nclass KP extends Ve {\n /**\n * Create a new RotationXBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"angle\", b.Float, !1, 0), this.registerOutput(\"matrix\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"RotationXBlock\";\n }\n /**\n * Gets the angle input component\n */\n get angle() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix output component\n */\n get matrix() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.angle.isConnected) {\n const e = new si(\"Angle\");\n e.value = 0, e.output.connectTo(this.angle);\n }\n }\n _buildBlock(e) {\n super._buildBlock(e), this.matrix._storedFunction = (t) => w.RotationX(this.angle.getConnectedValue(t));\n }\n}\nRe(\"BABYLON.RotationXBlock\", KP);\nclass qP extends Ve {\n /**\n * Create a new RotationYBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"angle\", b.Float, !1, 0), this.registerOutput(\"matrix\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"RotationYBlock\";\n }\n /**\n * Gets the angle input component\n */\n get angle() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix output component\n */\n get matrix() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.angle.isConnected) {\n const e = new si(\"Angle\");\n e.value = 0, e.output.connectTo(this.angle);\n }\n }\n _buildBlock(e) {\n super._buildBlock(e), this.matrix._storedFunction = (t) => w.RotationY(this.angle.getConnectedValue(t));\n }\n}\nRe(\"BABYLON.RotationYBlock\", qP);\nclass YP extends Ve {\n /**\n * Create a new RotationZBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"angle\", b.Float, !1, 0), this.registerOutput(\"matrix\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"RotationZBlock\";\n }\n /**\n * Gets the angle input component\n */\n get angle() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix output component\n */\n get matrix() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.angle.isConnected) {\n const e = new si(\"Angle\");\n e.value = 0, e.output.connectTo(this.angle);\n }\n }\n _buildBlock(e) {\n super._buildBlock(e), this.matrix._storedFunction = (t) => w.RotationZ(this.angle.getConnectedValue(t));\n }\n}\nRe(\"BABYLON.RotationZBlock\", YP);\nclass ZP extends Ve {\n /**\n * Create a new ScalingBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"scale\", b.Vector3, !1, _.One()), this.registerOutput(\"matrix\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"ScalingBlock\";\n }\n /**\n * Gets the scale input component\n */\n get scale() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix output component\n */\n get matrix() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.scale.isConnected) {\n const e = new si(\"Scale\");\n e.value = new _(1, 1, 1), e.output.connectTo(this.scale);\n }\n }\n _buildBlock(e) {\n super._buildBlock(e), this.matrix._storedFunction = (t) => {\n const i = this.scale.getConnectedValue(t);\n return w.Scaling(i.x, i.y, i.z);\n };\n }\n}\nRe(\"BABYLON.ScalingBlock\", ZP);\nclass jP extends Ve {\n /**\n * Create a new AlignBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"source\", b.Vector3, !0, _.Up()), this.registerInput(\"target\", b.Vector3, !0, _.Left()), this.registerOutput(\"matrix\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"AlignBlock\";\n }\n /**\n * Gets the source input component\n */\n get source() {\n return this._inputs[0];\n }\n /**\n * Gets the target input component\n */\n get target() {\n return this._inputs[1];\n }\n /**\n * Gets the matrix output component\n */\n get matrix() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n super._buildBlock(e), this.matrix._storedFunction = (t) => {\n const i = this.source.getConnectedValue(t).clone(), r = this.target.getConnectedValue(t).clone(), s = new w();\n return i.normalize(), r.normalize(), w.RotationAlignToRef(i, r, s, !0), s;\n };\n }\n}\nRe(\"BABYLON.AlignBlock\", jP);\nclass QP extends Ve {\n /**\n * Create a new TranslationBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"translation\", b.Vector3, !1, _.Zero()), this.registerOutput(\"matrix\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"TranslationBlock\";\n }\n /**\n * Gets the translation input component\n */\n get translation() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix output component\n */\n get matrix() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.translation.isConnected) {\n const e = new si(\"Translation\");\n e.value = new _(0, 0, 0), e.output.connectTo(this.translation);\n }\n }\n _buildBlock(e) {\n super._buildBlock(e), this.matrix._storedFunction = (t) => {\n const i = this.translation.getConnectedValue(t);\n return w.Translation(i.x, i.y, i.z);\n };\n }\n}\nRe(\"BABYLON.TranslationBlock\", QP);\nclass bf extends Ve {\n /**\n * Create a new InstantiateOnVerticesBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._indexTranslation = null, this.evaluateContext = !0, this.removeDuplicatedPositions = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"instance\", b.Geometry, !0), this.registerInput(\"density\", b.Float, !0, 1, 0, 1), this.registerInput(\"matrix\", b.Matrix, !0), this.registerInput(\"rotation\", b.Vector3, !0, _.Zero()), this.registerInput(\"scaling\", b.Vector3, !0, _.One()), this.scaling.acceptedConnectionPointTypes.push(b.Float), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current instance index in the current flow\n * @returns the current index\n */\n getInstanceIndex() {\n return this._currentLoopIndex;\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._indexTranslation ? this._indexTranslation[this._currentIndex] : this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentLoopIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateOnVerticesBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the instance input component\n */\n get instance() {\n return this._inputs[1];\n }\n /**\n * Gets the density input component\n */\n get density() {\n return this._inputs[2];\n }\n /**\n * Gets the matrix input component\n */\n get matrix() {\n return this._inputs[3];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[4];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[5];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), i.pushInstancingContext(this), this._vertexData = this.geometry.getConnectedValue(i), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions || !this.instance.isConnected) {\n i.restoreExecutionContext(), i.restoreInstancingContext(), i.restoreGeometryContext(), this.output._storedValue = null;\n return;\n }\n let r = this._vertexData.positions.length / 3;\n const s = [], a = new _(), o = [];\n let l = this._vertexData.positions;\n if (this._currentLoopIndex = 0, this.removeDuplicatedPositions) {\n for (this._indexTranslation = {}, this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const c = l[this._currentIndex * 3], h = l[this._currentIndex * 3 + 1], u = l[this._currentIndex * 3 + 2];\n let f = !1;\n for (let d = 0; d < o.length; d += 3)\n if (Math.abs(o[d] - c) < xt && Math.abs(o[d + 1] - h) < xt && Math.abs(o[d + 2] - u) < xt) {\n f = !0;\n break;\n }\n f || (this._indexTranslation[o.length / 3] = this._currentIndex, o.push(c, h, u));\n }\n l = o, r = l.length / 3;\n } else\n this._indexTranslation = null;\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const c = this.instance.getConnectedValue(i);\n if (!c || !c.positions || c.positions.length === 0)\n continue;\n const h = this.density.getConnectedValue(i);\n if (h < 1 && Math.random() > h)\n continue;\n a.fromArray(l, this._currentIndex * 3);\n const u = c.clone();\n if (this.matrix.isConnected) {\n const f = this.matrix.getConnectedValue(i);\n i._instantiateWithPositionAndMatrix(u, a, f, s);\n } else {\n const f = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly), d = this.rotation.getConnectedValue(i) || _.ZeroReadOnly;\n i._instantiate(u, a, d, f, s);\n }\n this._currentLoopIndex++;\n }\n if (i.restoreGeometryContext(), i.restoreExecutionContext(), i.restoreInstancingContext(), s.length)\n if (s.length === 1)\n this._vertexData = s[0];\n else {\n const c = s.splice(0, 1)[0];\n this._vertexData = c.merge(s, !0, !1, !0, !0);\n }\n else\n return null;\n return this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n let e = super._dumpPropertiesCode() + `${this._codeVariableName}.removeDuplicatedPositions = ${this.removeDuplicatedPositions ? \"true\" : \"false\"};\n`;\n return e += `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`, e;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.removeDuplicatedPositions = this.removeDuplicatedPositions, e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.removeDuplicatedPositions = e.removeDuplicatedPositions, e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], bf.prototype, \"evaluateContext\", void 0);\nP([\n gt(\"Remove duplicated positions\", ht.Boolean, \"ADVANCED\", { notifiers: { update: !0 } })\n], bf.prototype, \"removeDuplicatedPositions\", void 0);\nRe(\"BABYLON.InstantiateOnVerticesBlock\", bf);\nclass eE extends Ve {\n /**\n * Create a new InstantiateOnFacesBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._currentPosition = new _(), this._currentUV = new me(), this._vertex0 = new _(), this._vertex1 = new _(), this._vertex2 = new _(), this._tempVector0 = new _(), this._tempVector1 = new _(), this._uv0 = new me(), this._uv1 = new me(), this._uv2 = new me(), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"instance\", b.Geometry, !0), this.registerInput(\"count\", b.Int, !0, 256), this.registerInput(\"matrix\", b.Matrix, !0), this.registerInput(\"rotation\", b.Vector3, !0, _.Zero()), this.registerInput(\"scaling\", b.Vector3, !0, _.One()), this.scaling.acceptedConnectionPointTypes.push(b.Float), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current instance index in the current flow\n * @returns the current index\n */\n getInstanceIndex() {\n return this._currentLoopIndex;\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return 0;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return this._currentFaceIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentLoopIndex;\n }\n /**\n * Gets the value associated with a contextual positions\n * @returns the value associated with the source\n */\n getOverridePositionsContextualValue() {\n return this._currentPosition;\n }\n /**\n * Gets the value associated with a contextual normals\n * @returns the value associated with the source\n */\n getOverrideNormalsContextualValue() {\n return this._vertex1.subtractToRef(this._vertex0, this._tempVector0), this._vertex2.subtractToRef(this._vertex1, this._tempVector1), this._tempVector0.normalize(), this._tempVector1.normalize(), _.Cross(this._tempVector1, this._tempVector0);\n }\n /**\n * Gets the value associated with a contextual UV1 se\n * @returns the value associated with the source\n */\n getOverrideUVs1ContextualValue() {\n return this._currentUV;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateOnFacesBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the instance input component\n */\n get instance() {\n return this._inputs[1];\n }\n /**\n * Gets the count input component\n */\n get count() {\n return this._inputs[2];\n }\n /**\n * Gets the matrix input component\n */\n get matrix() {\n return this._inputs[3];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[4];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[5];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), i.pushInstancingContext(this), this._vertexData = this.geometry.getConnectedValue(i), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions || !this._vertexData.indices || !this.instance.isConnected) {\n i.restoreExecutionContext(), i.restoreInstancingContext(), i.restoreGeometryContext(), this.output._storedValue = null;\n return;\n }\n let r = null;\n const s = this.count.getConnectedValue(i), a = this._vertexData.indices.length / 3, o = s / a;\n let l = 0;\n const c = [];\n let h = 0;\n for (this._currentLoopIndex = 0, this._currentFaceIndex = 0; this._currentFaceIndex < a; this._currentFaceIndex++) {\n l += o;\n const u = (l | 0) - h;\n if (u < 1)\n continue;\n const f = this._vertexData.indices[this._currentFaceIndex * 3], d = this._vertexData.indices[this._currentFaceIndex * 3 + 1], p = this._vertexData.indices[this._currentFaceIndex * 3 + 2];\n this._vertex0.fromArray(this._vertexData.positions, f * 3), this._vertex1.fromArray(this._vertexData.positions, d * 3), this._vertex2.fromArray(this._vertexData.positions, p * 3), this._vertexData.uvs && (this._uv0.fromArray(this._vertexData.uvs, f * 2), this._uv1.fromArray(this._vertexData.uvs, d * 2), this._uv2.fromArray(this._vertexData.uvs, p * 2));\n for (let g = 0; g < u && !(h >= s); g++) {\n let m = Math.random(), v = Math.random();\n if (m > v) {\n const x = m;\n m = v, v = x;\n }\n const E = m, C = v - m, T = 1 - E - C;\n if (this._currentPosition.set(E * this._vertex0.x + C * this._vertex1.x + T * this._vertex2.x, E * this._vertex0.y + C * this._vertex1.y + T * this._vertex2.y, E * this._vertex0.z + C * this._vertex1.z + T * this._vertex2.z), this._vertexData.uvs && this._currentUV.set(E * this._uv0.x + C * this._uv1.x + T * this._uv2.x, E * this._uv0.y + C * this._uv1.y + T * this._uv2.y), r = this.instance.getConnectedValue(i), !r || !r.positions || r.positions.length === 0) {\n l -= o;\n continue;\n }\n const R = r.clone();\n if (this.matrix.isConnected) {\n const x = this.matrix.getConnectedValue(i);\n i._instantiateWithPositionAndMatrix(R, this._currentPosition, x, c);\n } else {\n const x = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly), S = this.rotation.getConnectedValue(i) || _.ZeroReadOnly;\n i._instantiate(R, this._currentPosition, S, x, c);\n }\n h++, this._currentLoopIndex++;\n }\n }\n if (c.length)\n if (c.length === 1)\n this._vertexData = c[0];\n else {\n const u = c.splice(0, 1)[0];\n this._vertexData = u.merge(c, !0, !1, !0, !0);\n }\n return i.restoreExecutionContext(), i.restoreInstancingContext(), i.restoreGeometryContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], eE.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.InstantiateOnFacesBlock\", eE);\nclass ot {\n /**\n * Creates a new ray\n * @param origin origin point\n * @param direction direction\n * @param length length of the ray\n * @param epsilon The epsilon value to use when calculating the ray/triangle intersection (default: 0)\n */\n constructor(e, t, i = Number.MAX_VALUE, r = xt) {\n this.origin = e, this.direction = t, this.length = i, this.epsilon = r;\n }\n // Methods\n /**\n * Clone the current ray\n * @returns a new ray\n */\n clone() {\n return new ot(this.origin.clone(), this.direction.clone(), this.length);\n }\n /**\n * Checks if the ray intersects a box\n * This does not account for the ray length by design to improve perfs.\n * @param minimum bound of the box\n * @param maximum bound of the box\n * @param intersectionTreshold extra extend to be added to the box in all direction\n * @returns if the box was hit\n */\n intersectsBoxMinMax(e, t, i = 0) {\n const r = ot._TmpVector3[0].copyFromFloats(e.x - i, e.y - i, e.z - i), s = ot._TmpVector3[1].copyFromFloats(t.x + i, t.y + i, t.z + i);\n let a = 0, o = Number.MAX_VALUE, l, c, h, u;\n if (Math.abs(this.direction.x) < 1e-7) {\n if (this.origin.x < r.x || this.origin.x > s.x)\n return !1;\n } else if (l = 1 / this.direction.x, c = (r.x - this.origin.x) * l, h = (s.x - this.origin.x) * l, h === -1 / 0 && (h = 1 / 0), c > h && (u = c, c = h, h = u), a = Math.max(c, a), o = Math.min(h, o), a > o)\n return !1;\n if (Math.abs(this.direction.y) < 1e-7) {\n if (this.origin.y < r.y || this.origin.y > s.y)\n return !1;\n } else if (l = 1 / this.direction.y, c = (r.y - this.origin.y) * l, h = (s.y - this.origin.y) * l, h === -1 / 0 && (h = 1 / 0), c > h && (u = c, c = h, h = u), a = Math.max(c, a), o = Math.min(h, o), a > o)\n return !1;\n if (Math.abs(this.direction.z) < 1e-7) {\n if (this.origin.z < r.z || this.origin.z > s.z)\n return !1;\n } else if (l = 1 / this.direction.z, c = (r.z - this.origin.z) * l, h = (s.z - this.origin.z) * l, h === -1 / 0 && (h = 1 / 0), c > h && (u = c, c = h, h = u), a = Math.max(c, a), o = Math.min(h, o), a > o)\n return !1;\n return !0;\n }\n /**\n * Checks if the ray intersects a box\n * This does not account for the ray lenght by design to improve perfs.\n * @param box the bounding box to check\n * @param intersectionTreshold extra extend to be added to the BoundingBox in all direction\n * @returns if the box was hit\n */\n intersectsBox(e, t = 0) {\n return this.intersectsBoxMinMax(e.minimum, e.maximum, t);\n }\n /**\n * If the ray hits a sphere\n * @param sphere the bounding sphere to check\n * @param intersectionTreshold extra extend to be added to the BoundingSphere in all direction\n * @returns true if it hits the sphere\n */\n intersectsSphere(e, t = 0) {\n const i = e.center.x - this.origin.x, r = e.center.y - this.origin.y, s = e.center.z - this.origin.z, a = i * i + r * r + s * s, o = e.radius + t, l = o * o;\n if (a <= l)\n return !0;\n const c = i * this.direction.x + r * this.direction.y + s * this.direction.z;\n return c < 0 ? !1 : a - c * c <= l;\n }\n /**\n * If the ray hits a triange\n * @param vertex0 triangle vertex\n * @param vertex1 triangle vertex\n * @param vertex2 triangle vertex\n * @returns intersection information if hit\n */\n intersectsTriangle(e, t, i) {\n const r = ot._TmpVector3[0], s = ot._TmpVector3[1], a = ot._TmpVector3[2], o = ot._TmpVector3[3], l = ot._TmpVector3[4];\n t.subtractToRef(e, r), i.subtractToRef(e, s), _.CrossToRef(this.direction, s, a);\n const c = _.Dot(r, a);\n if (c === 0)\n return null;\n const h = 1 / c;\n this.origin.subtractToRef(e, o);\n const u = _.Dot(o, a) * h;\n if (u < -this.epsilon || u > 1 + this.epsilon)\n return null;\n _.CrossToRef(o, r, l);\n const f = _.Dot(this.direction, l) * h;\n if (f < -this.epsilon || u + f > 1 + this.epsilon)\n return null;\n const d = _.Dot(s, l) * h;\n return d > this.length ? null : new Eu(1 - u - f, u, d);\n }\n /**\n * Checks if ray intersects a plane\n * @param plane the plane to check\n * @returns the distance away it was hit\n */\n intersectsPlane(e) {\n let t;\n const i = _.Dot(e.normal, this.direction);\n if (Math.abs(i) < 999999997475243e-21)\n return null;\n {\n const r = _.Dot(e.normal, this.origin);\n return t = (-e.d - r) / i, t < 0 ? t < -999999997475243e-21 ? null : 0 : t;\n }\n }\n /**\n * Calculate the intercept of a ray on a given axis\n * @param axis to check 'x' | 'y' | 'z'\n * @param offset from axis interception (i.e. an offset of 1y is intercepted above ground)\n * @returns a vector containing the coordinates where 'axis' is equal to zero (else offset), or null if there is no intercept.\n */\n intersectsAxis(e, t = 0) {\n switch (e) {\n case \"y\": {\n const i = (this.origin.y - t) / this.direction.y;\n return i > 0 ? null : new _(this.origin.x + this.direction.x * -i, t, this.origin.z + this.direction.z * -i);\n }\n case \"x\": {\n const i = (this.origin.x - t) / this.direction.x;\n return i > 0 ? null : new _(t, this.origin.y + this.direction.y * -i, this.origin.z + this.direction.z * -i);\n }\n case \"z\": {\n const i = (this.origin.z - t) / this.direction.z;\n return i > 0 ? null : new _(this.origin.x + this.direction.x * -i, this.origin.y + this.direction.y * -i, t);\n }\n default:\n return null;\n }\n }\n /**\n * Checks if ray intersects a mesh. The ray is defined in WORLD space. A mesh triangle can be picked both from its front and back sides,\n * irrespective of orientation.\n * @param mesh the mesh to check\n * @param fastCheck defines if the first intersection will be used (and not the closest)\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\n * @param worldToUse defines the world matrix to use to get the world coordinate of the intersection point\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\n * @returns picking info of the intersection\n */\n intersectsMesh(e, t, i, r = !1, s, a = !1) {\n const o = z.Matrix[0];\n return e.getWorldMatrix().invertToRef(o), this._tmpRay ? ot.TransformToRef(this, o, this._tmpRay) : this._tmpRay = ot.Transform(this, o), e.intersects(this._tmpRay, t, i, r, s, a);\n }\n /**\n * Checks if ray intersects a mesh\n * @param meshes the meshes to check\n * @param fastCheck defines if the first intersection will be used (and not the closest)\n * @param results array to store result in\n * @returns Array of picking infos\n */\n intersectsMeshes(e, t, i) {\n i ? i.length = 0 : i = [];\n for (let r = 0; r < e.length; r++) {\n const s = this.intersectsMesh(e[r], t);\n s.hit && i.push(s);\n }\n return i.sort(this._comparePickingInfo), i;\n }\n _comparePickingInfo(e, t) {\n return e.distance < t.distance ? -1 : e.distance > t.distance ? 1 : 0;\n }\n /**\n * Intersection test between the ray and a given segment within a given tolerance (threshold)\n * @param sega the first point of the segment to test the intersection against\n * @param segb the second point of the segment to test the intersection against\n * @param threshold the tolerance margin, if the ray doesn't intersect the segment but is close to the given threshold, the intersection is successful\n * @returns the distance from the ray origin to the intersection point if there's intersection, or -1 if there's no intersection\n */\n intersectionSegment(e, t, i) {\n const r = this.origin, s = z.Vector3[0], a = z.Vector3[1], o = z.Vector3[2], l = z.Vector3[3];\n t.subtractToRef(e, s), this.direction.scaleToRef(ot._Rayl, o), r.addToRef(o, a), e.subtractToRef(r, l);\n const c = _.Dot(s, s), h = _.Dot(s, o), u = _.Dot(o, o), f = _.Dot(s, l), d = _.Dot(o, l), p = c * u - h * h;\n let g, m = p, v, E = p;\n p < ot._Smallnum ? (g = 0, m = 1, v = d, E = u) : (g = h * d - u * f, v = c * d - h * f, g < 0 ? (g = 0, v = d, E = u) : g > m && (g = m, v = d + h, E = u)), v < 0 ? (v = 0, -f < 0 ? g = 0 : -f > c ? g = m : (g = -f, m = c)) : v > E && (v = E, -f + h < 0 ? g = 0 : -f + h > c ? g = m : (g = -f + h, m = c));\n const C = Math.abs(g) < ot._Smallnum ? 0 : g / m, T = Math.abs(v) < ot._Smallnum ? 0 : v / E, R = z.Vector3[4];\n o.scaleToRef(T, R);\n const x = z.Vector3[5];\n s.scaleToRef(C, x), x.addInPlace(l);\n const S = z.Vector3[6];\n return x.subtractToRef(R, S), T > 0 && T <= this.length && S.lengthSquared() < i * i ? x.length() : -1;\n }\n /**\n * Update the ray from viewport position\n * @param x position\n * @param y y position\n * @param viewportWidth viewport width\n * @param viewportHeight viewport height\n * @param world world matrix\n * @param view view matrix\n * @param projection projection matrix\n * @param enableDistantPicking defines if picking should handle large values for mesh position/scaling (false by default)\n * @returns this ray updated\n */\n update(e, t, i, r, s, a, o, l = !1) {\n if (l) {\n ot._RayDistant || (ot._RayDistant = ot.Zero()), ot._RayDistant.unprojectRayToRef(e, t, i, r, w.IdentityReadOnly, a, o);\n const c = z.Matrix[0];\n s.invertToRef(c), ot.TransformToRef(ot._RayDistant, c, this);\n } else\n this.unprojectRayToRef(e, t, i, r, s, a, o);\n return this;\n }\n // Statics\n /**\n * Creates a ray with origin and direction of 0,0,0\n * @returns the new ray\n */\n static Zero() {\n return new ot(_.Zero(), _.Zero());\n }\n /**\n * Creates a new ray from screen space and viewport\n * @param x position\n * @param y y position\n * @param viewportWidth viewport width\n * @param viewportHeight viewport height\n * @param world world matrix\n * @param view view matrix\n * @param projection projection matrix\n * @returns new ray\n */\n static CreateNew(e, t, i, r, s, a, o) {\n return ot.Zero().update(e, t, i, r, s, a, o);\n }\n /**\n * Function will create a new transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be\n * transformed to the given world matrix.\n * @param origin The origin point\n * @param end The end point\n * @param world a matrix to transform the ray to. Default is the identity matrix.\n * @returns the new ray\n */\n static CreateNewFromTo(e, t, i = w.IdentityReadOnly) {\n const r = new ot(new _(0, 0, 0), new _(0, 0, 0));\n return ot.CreateFromToToRef(e, t, r, i);\n }\n /**\n * Function will update a transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be\n * transformed to the given world matrix.\n * @param origin The origin point\n * @param end The end point\n * @param result the object to store the result\n * @param world a matrix to transform the ray to. Default is the identity matrix.\n * @returns the ref ray\n */\n static CreateFromToToRef(e, t, i, r = w.IdentityReadOnly) {\n i.origin.copyFrom(e);\n const s = t.subtractToRef(e, i.direction), a = Math.sqrt(s.x * s.x + s.y * s.y + s.z * s.z);\n return i.length = a, i.direction.normalize(), ot.TransformToRef(i, r, i);\n }\n /**\n * Transforms a ray by a matrix\n * @param ray ray to transform\n * @param matrix matrix to apply\n * @returns the resulting new ray\n */\n static Transform(e, t) {\n const i = new ot(new _(0, 0, 0), new _(0, 0, 0));\n return ot.TransformToRef(e, t, i), i;\n }\n /**\n * Transforms a ray by a matrix\n * @param ray ray to transform\n * @param matrix matrix to apply\n * @param result ray to store result in\n * @returns the updated result ray\n */\n static TransformToRef(e, t, i) {\n _.TransformCoordinatesToRef(e.origin, t, i.origin), _.TransformNormalToRef(e.direction, t, i.direction), i.length = e.length, i.epsilon = e.epsilon;\n const r = i.direction, s = r.length();\n if (!(s === 0 || s === 1)) {\n const a = 1 / s;\n r.x *= a, r.y *= a, r.z *= a, i.length *= s;\n }\n return i;\n }\n /**\n * Unproject a ray from screen space to object space\n * @param sourceX defines the screen space x coordinate to use\n * @param sourceY defines the screen space y coordinate to use\n * @param viewportWidth defines the current width of the viewport\n * @param viewportHeight defines the current height of the viewport\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\n * @param view defines the view matrix to use\n * @param projection defines the projection matrix to use\n */\n unprojectRayToRef(e, t, i, r, s, a, o) {\n const l = z.Matrix[0];\n s.multiplyToRef(a, l), l.multiplyToRef(o, l), l.invert();\n const c = st.LastCreatedEngine, h = z.Vector3[0];\n h.x = e / i * 2 - 1, h.y = -(t / r * 2 - 1), h.z = c != null && c.useReverseDepthBuffer ? 1 : c != null && c.isNDCHalfZRange ? 0 : -1;\n const u = z.Vector3[1].copyFromFloats(h.x, h.y, 1 - 1e-8), f = z.Vector3[2], d = z.Vector3[3];\n _._UnprojectFromInvertedMatrixToRef(h, l, f), _._UnprojectFromInvertedMatrixToRef(u, l, d), this.origin.copyFrom(f), d.subtractToRef(f, this.direction), this.direction.normalize();\n }\n}\not._TmpVector3 = vi.BuildArray(6, _.Zero);\not._RayDistant = ot.Zero();\not._Smallnum = 1e-8;\not._Rayl = 1e9;\nOt.prototype.createPickingRay = function(n, e, t, i, r = !1) {\n const s = ot.Zero();\n return this.createPickingRayToRef(n, e, t, s, i, r), s;\n};\nOt.prototype.createPickingRayToRef = function(n, e, t, i, r, s = !1, a = !1) {\n const o = this.getEngine();\n if (!r && !(r = this.activeCamera))\n return this;\n const l = r.viewport, c = o.getRenderHeight(), { x: h, y: u, width: f, height: d } = l.toGlobal(o.getRenderWidth(), c), p = 1 / o.getHardwareScalingLevel();\n return n = n * p - h, e = e * p - (c - u - d), i.update(n, e, f, d, t || w.IdentityReadOnly, s ? w.IdentityReadOnly : r.getViewMatrix(), r.getProjectionMatrix(), a), this;\n};\nOt.prototype.createPickingRayInCameraSpace = function(n, e, t) {\n const i = ot.Zero();\n return this.createPickingRayInCameraSpaceToRef(n, e, i, t), i;\n};\nOt.prototype.createPickingRayInCameraSpaceToRef = function(n, e, t, i) {\n if (!ps)\n return this;\n const r = this.getEngine();\n if (!i && !(i = this.activeCamera))\n throw new Error(\"Active camera not set\");\n const s = i.viewport, a = r.getRenderHeight(), { x: o, y: l, width: c, height: h } = s.toGlobal(r.getRenderWidth(), a), u = w.Identity(), f = 1 / r.getHardwareScalingLevel();\n return n = n * f - o, e = e * f - (a - l - h), t.update(n, e, c, h, u, u, i.getProjectionMatrix()), this;\n};\nOt.prototype._internalPickForMesh = function(n, e, t, i, r, s, a, o) {\n const l = e(i, t.enableDistantPicking), c = t.intersects(l, r, a, s, i, o);\n return !c || !c.hit || !r && n != null && c.distance >= n.distance ? null : c;\n};\nOt.prototype._internalPick = function(n, e, t, i, r) {\n let s = null;\n const a = !!(this.activeCameras && this.activeCameras.length > 1 && this.cameraToUseForPointers !== this.activeCamera), o = this.cameraToUseForPointers || this.activeCamera;\n for (let l = 0; l < this.meshes.length; l++) {\n const c = this.meshes[l];\n if (e) {\n if (!e(c))\n continue;\n } else if (!c.isEnabled() || !c.isVisible || !c.isPickable)\n continue;\n const h = a && c.isWorldMatrixCameraDependent(), u = c.computeWorldMatrix(h, o);\n if (c.hasThinInstances && c.thinInstanceEnablePicking) {\n const f = this._internalPickForMesh(s, n, c, u, !0, !0, r);\n if (f) {\n if (i)\n return f;\n const d = z.Matrix[1], p = c.thinInstanceGetWorldMatrices();\n for (let g = 0; g < p.length; g++) {\n p[g].multiplyToRef(u, d);\n const v = this._internalPickForMesh(s, n, c, d, t, i, r, !0);\n if (v && (s = v, s.thinInstanceIndex = g, t))\n return s;\n }\n }\n } else {\n const f = this._internalPickForMesh(s, n, c, u, t, i, r);\n if (f && (s = f, t))\n return s;\n }\n }\n return s || new ps();\n};\nOt.prototype._internalMultiPick = function(n, e, t) {\n if (!ps)\n return null;\n const i = [], r = !!(this.activeCameras && this.activeCameras.length > 1 && this.cameraToUseForPointers !== this.activeCamera), s = this.cameraToUseForPointers || this.activeCamera;\n for (let a = 0; a < this.meshes.length; a++) {\n const o = this.meshes[a];\n if (e) {\n if (!e(o))\n continue;\n } else if (!o.isEnabled() || !o.isVisible || !o.isPickable)\n continue;\n const l = r && o.isWorldMatrixCameraDependent(), c = o.computeWorldMatrix(l, s);\n if (o.hasThinInstances && o.thinInstanceEnablePicking) {\n if (this._internalPickForMesh(null, n, o, c, !0, !0, t)) {\n const u = z.Matrix[1], f = o.thinInstanceGetWorldMatrices();\n for (let d = 0; d < f.length; d++) {\n f[d].multiplyToRef(c, u);\n const g = this._internalPickForMesh(null, n, o, u, !1, !1, t, !0);\n g && (g.thinInstanceIndex = d, i.push(g));\n }\n }\n } else {\n const h = this._internalPickForMesh(null, n, o, c, !1, !1, t);\n h && i.push(h);\n }\n }\n return i;\n};\nOt.prototype.pickWithBoundingInfo = function(n, e, t, i, r) {\n if (!ps)\n return null;\n const s = this._internalPick((a) => (this._tempPickingRay || (this._tempPickingRay = ot.Zero()), this.createPickingRayToRef(n, e, a, this._tempPickingRay, r || null), this._tempPickingRay), t, i, !0);\n return s && (s.ray = this.createPickingRay(n, e, w.Identity(), r || null)), s;\n};\nObject.defineProperty(Ot.prototype, \"_pickingAvailable\", {\n get: () => !0,\n enumerable: !1,\n configurable: !1\n});\nOt.prototype.pick = function(n, e, t, i, r, s, a = !1) {\n const o = this._internalPick((l, c) => (this._tempPickingRay || (this._tempPickingRay = ot.Zero()), this.createPickingRayToRef(n, e, l, this._tempPickingRay, r || null, !1, c), this._tempPickingRay), t, i, !1, s);\n return o && (o.ray = this.createPickingRay(n, e, w.Identity(), r || null)), o;\n};\nOt.prototype.pickWithRay = function(n, e, t, i) {\n const r = this._internalPick((s) => (this._pickWithRayInverseMatrix || (this._pickWithRayInverseMatrix = w.Identity()), s.invertToRef(this._pickWithRayInverseMatrix), this._cachedRayForTransform || (this._cachedRayForTransform = ot.Zero()), ot.TransformToRef(n, this._pickWithRayInverseMatrix, this._cachedRayForTransform), this._cachedRayForTransform), e, t, !1, i);\n return r && (r.ray = n), r;\n};\nOt.prototype.multiPick = function(n, e, t, i, r) {\n return this._internalMultiPick((s) => this.createPickingRay(n, e, s, i || null), t, r);\n};\nOt.prototype.multiPickWithRay = function(n, e, t) {\n return this._internalMultiPick((i) => (this._pickWithRayInverseMatrix || (this._pickWithRayInverseMatrix = w.Identity()), i.invertToRef(this._pickWithRayInverseMatrix), this._cachedRayForTransform || (this._cachedRayForTransform = ot.Zero()), ot.TransformToRef(n, this._pickWithRayInverseMatrix, this._cachedRayForTransform), this._cachedRayForTransform), e, t);\n};\n$e.prototype.getForwardRay = function(n = 100, e, t) {\n return this.getForwardRayToRef(new ot(_.Zero(), _.Zero(), n), n, e, t);\n};\n$e.prototype.getForwardRayToRef = function(n, e = 100, t, i) {\n t || (t = this.getWorldMatrix()), n.length = e, i ? n.origin.copyFrom(i) : n.origin.copyFrom(this.position);\n const r = z.Vector3[2];\n r.set(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\n const s = z.Vector3[3];\n return _.TransformNormalToRef(r, t, s), _.NormalizeToRef(s, n.direction), n;\n};\nclass tE extends Ve {\n /**\n * Create a new InstantiateOnVolumeBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._currentPosition = new _(), this._vertex0 = new _(), this._vertex1 = new _(), this._vertex2 = new _(), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"instance\", b.Geometry, !0), this.registerInput(\"count\", b.Int, !0, 256), this.registerInput(\"matrix\", b.Matrix, !0), this.registerInput(\"rotation\", b.Vector3, !0, _.Zero()), this.registerInput(\"scaling\", b.Vector3, !0, _.One()), this.scaling.acceptedConnectionPointTypes.push(b.Float), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current instance index in the current flow\n * @returns the current index\n */\n getInstanceIndex() {\n return this._currentLoopIndex;\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return 0;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentLoopIndex;\n }\n /**\n * Gets the value associated with a contextual positions\n * @returns the value associated with the source\n */\n getOverridePositionsContextualValue() {\n return this._currentPosition;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateOnVolumeBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the instance input component\n */\n get instance() {\n return this._inputs[1];\n }\n /**\n * Gets the count input component\n */\n get count() {\n return this._inputs[2];\n }\n /**\n * Gets the matrix input component\n */\n get matrix() {\n return this._inputs[3];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[4];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[5];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), i.pushInstancingContext(this), this._vertexData = this.geometry.getConnectedValue(i), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions || !this._vertexData.indices || !this.instance.isConnected) {\n i.restoreExecutionContext(), i.restoreInstancingContext(), i.restoreGeometryContext(), this.output._storedValue = null;\n return;\n }\n let r = null;\n const s = this.count.getConnectedValue(i), a = [], o = _o(this._vertexData.positions, 0, this._vertexData.positions.length / 3), l = o.minimum, c = o.maximum, h = new _(1, 0, 0), u = this._vertexData.indices.length / 3;\n this._currentLoopIndex = 0;\n for (let f = 0; f < s; f++) {\n this._currentPosition.set(Math.random() * (c.x - l.x) + l.x, Math.random() * (c.y - l.y) + l.y, Math.random() * (c.z - l.z) + l.z);\n const d = new ot(this._currentPosition, h);\n let p = 0;\n for (let m = 0; m < u; m++) {\n this._vertex0.fromArray(this._vertexData.positions, this._vertexData.indices[m * 3] * 3), this._vertex1.fromArray(this._vertexData.positions, this._vertexData.indices[m * 3 + 1] * 3), this._vertex2.fromArray(this._vertexData.positions, this._vertexData.indices[m * 3 + 2] * 3);\n const v = d.intersectsTriangle(this._vertex0, this._vertex1, this._vertex2);\n v && v.distance > 0 && p++;\n }\n if (p % 2 === 0) {\n f--;\n continue;\n }\n if (r = this.instance.getConnectedValue(i), !r || !r.positions || r.positions.length === 0)\n continue;\n const g = r.clone();\n if (this.matrix.isConnected) {\n const m = this.matrix.getConnectedValue(i);\n i._instantiateWithPositionAndMatrix(g, this._currentPosition, m, a);\n } else {\n const m = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly), v = this.rotation.getConnectedValue(i) || _.ZeroReadOnly;\n i._instantiate(g, this._currentPosition, v, m, a);\n }\n this._currentLoopIndex++;\n }\n if (a.length)\n if (a.length === 1)\n this._vertexData = a[0];\n else {\n const f = a.splice(0, 1)[0];\n this._vertexData = f.merge(a, !0, !1, !0, !0);\n }\n return i.restoreGeometryContext(), i.restoreExecutionContext(), i.restoreInstancingContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], tE.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.InstantiateOnVolumeBlock\", tE);\nclass Bc extends Ve {\n /**\n * Create a new InstantiateBaseBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"instance\", b.Geometry, !0), this.registerInput(\"count\", b.Int, !0, 1), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current instance index in the current flow\n * @returns the current index\n */\n getInstanceIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateBaseBlock\";\n }\n /**\n * Gets the instance input component\n */\n get instance() {\n return this._inputs[0];\n }\n /**\n * Gets the count input component\n */\n get count() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], Bc.prototype, \"evaluateContext\", void 0);\nclass JP extends Bc {\n /**\n * Create a new InstantiateBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"matrix\", b.Matrix, !0), this.registerInput(\"position\", b.Vector3, !0, _.Zero()), this.registerInput(\"rotation\", b.Vector3, !0, _.Zero()), this.registerInput(\"scaling\", b.Vector3, !0, _.One()), this.scaling.acceptedConnectionPointTypes.push(b.Float);\n }\n /**\n * Gets the current instance index in the current flow\n * @returns the current index\n */\n getInstanceIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateBlock\";\n }\n /**\n * Gets the matrix input component\n */\n get matrix() {\n return this._inputs[2];\n }\n /**\n * Gets the position input component\n */\n get position() {\n return this._inputs[3];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[4];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[5];\n }\n _buildBlock(e) {\n const t = (i) => {\n i.pushExecutionContext(this), i.pushInstancingContext(this);\n const r = this.count.getConnectedValue(i), s = [];\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const a = this.instance.getConnectedValue(i);\n if (!a || !a.positions || a.positions.length === 0)\n continue;\n const o = a.clone();\n if (this.matrix.isConnected) {\n const l = this.matrix.getConnectedValue(i);\n i._instantiateWithMatrix(o, l, s);\n } else {\n const l = this.position.getConnectedValue(i) || _.ZeroReadOnly, c = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly), h = this.rotation.getConnectedValue(i) || _.ZeroReadOnly;\n i._instantiate(o, l, h, c, s);\n }\n }\n if (s.length)\n if (s.length === 1)\n this._vertexData = s[0];\n else {\n const a = s.splice(0, 1)[0];\n this._vertexData = a.merge(s, !0, !1, !0, !0);\n }\n return i.restoreExecutionContext(), i.restoreInstancingContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n}\nRe(\"BABYLON.InstantiateBlock\", JP);\nclass $P extends Bc {\n /**\n * Create a new Instantiate Linear Block\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"direction\", b.Vector3, !0, new _(1, 0, 0)), this.registerInput(\"rotation\", b.Vector3, !0, new _(0, 0, 0)), this.registerInput(\"scaling\", b.Vector3, !0, new _(0, 0, 0)), this.scaling.acceptedConnectionPointTypes.push(b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateLinearBlock\";\n }\n /**\n * Gets the direction input component\n */\n get direction() {\n return this._inputs[2];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[3];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[4];\n }\n _buildBlock(e) {\n const t = (i) => {\n i.pushExecutionContext(this), i.pushInstancingContext(this);\n const r = this.count.getConnectedValue(i), s = [], a = w.Identity(), o = _.Zero(), l = _.Zero(), c = _.Zero();\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const h = this.instance.getConnectedValue(i);\n if (!h || !h.positions || h.positions.length === 0)\n continue;\n const u = h.clone(), f = this.direction.getConnectedValue(i), d = this.rotation.getConnectedValue(i), p = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly);\n o.copyFrom(f.clone().scale(this._currentIndex)), l.copyFrom(d.clone().scale(this._currentIndex)), c.copyFrom(p.clone().scale(this._currentIndex)), c.addInPlaceFromFloats(1, 1, 1), w.ComposeToRef(c, Ce.FromEulerAngles(l.x, l.y, l.z), o, a), i._instantiateWithMatrix(u, a, s);\n }\n if (s.length)\n if (s.length === 1)\n this._vertexData = s[0];\n else {\n const h = s.splice(0, 1)[0];\n this._vertexData = h.merge(s, !0, !1, !0, !0);\n }\n return i.restoreExecutionContext(), i.restoreInstancingContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n}\nRe(\"BABYLON.InstantiateLinearBlock\", $P);\nclass eO extends Bc {\n /**\n * Create a new InstantiateRadialBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"radius\", b.Int, !0, 0, 0), this.registerInput(\"angleStart\", b.Float, !0, 0), this.registerInput(\"angleEnd\", b.Float, !0, Math.PI * 2), this.registerInput(\"transform\", b.Vector3, !0, new _(0, 0, 0)), this.registerInput(\"rotation\", b.Vector3, !0, new _(0, 0, 0)), this.registerInput(\"scaling\", b.Vector3, !0, new _(0, 0, 0)), this.scaling.acceptedConnectionPointTypes.push(b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateRadialBlock\";\n }\n /**\n * Gets the direction input component\n */\n get radius() {\n return this._inputs[2];\n }\n /**\n * Gets the direction input component\n */\n get angleStart() {\n return this._inputs[3];\n }\n /**\n * Gets the direction input component\n */\n get angleEnd() {\n return this._inputs[4];\n }\n /**\n * Gets the transform input component\n */\n get transform() {\n return this._inputs[5];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[6];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[7];\n }\n _buildBlock(e) {\n const t = (i) => {\n i.pushExecutionContext(this), i.pushInstancingContext(this);\n const r = this.count.getConnectedValue(i), s = [], a = w.Identity(), o = w.Identity(), l = w.Identity(), c = _.Zero(), h = _.Zero(), u = _.Zero();\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const f = this.instance.getConnectedValue(i);\n if (!f || !f.positions || f.positions.length === 0)\n continue;\n const d = f.clone(), p = this.radius.getConnectedValue(i), g = this.angleStart.getConnectedValue(i), m = this.angleEnd.getConnectedValue(i), v = this.transform.getConnectedValue(i), E = this.rotation.getConnectedValue(i), C = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly), R = (m - g) / r, x = g + R * this._currentIndex, S = Ce.FromEulerAngles(0, x, 0);\n c.copyFrom(v.clone().scale(this._currentIndex)), h.copyFrom(E.clone().scale(this._currentIndex)), u.copyFrom(C.clone().scale(this._currentIndex)), u.addInPlaceFromFloats(1, 1, 1), w.RotationYawPitchRollToRef(h.y, h.x, h.z, a), o.setTranslationFromFloats(0, 0, p), w.ComposeToRef(u, S, c, l), a.multiplyToRef(o, o), o.multiplyToRef(l, l), i._instantiateWithMatrix(d, l, s);\n }\n if (s.length)\n if (s.length === 1)\n this._vertexData = s[0];\n else {\n const f = s.splice(0, 1)[0];\n this._vertexData = f.merge(s, !0, !1, !0, !0);\n }\n return i.restoreExecutionContext(), i.restoreInstancingContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n}\nRe(\"BABYLON.InstantiateRadialBlock\", eO);\nclass tO extends Ve {\n /**\n * Create a new IntFloatConverterBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"float \", b.Float, !0), this.registerInput(\"int \", b.Int, !0), this.registerOutput(\"float\", b.Float), this.registerOutput(\"int\", b.Int);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"IntFloatConverterBlock\";\n }\n /**\n * Gets the float input component\n */\n get floatIn() {\n return this._inputs[0];\n }\n /**\n * Gets the int input component\n */\n get intIn() {\n return this._inputs[1];\n }\n /**\n * Gets the float output component\n */\n get floatOut() {\n return this._outputs[0];\n }\n /**\n * Gets the int output component\n */\n get intOut() {\n return this._outputs[1];\n }\n _inputRename(e) {\n return e === \"float \" ? \"floatIn\" : e === \"int \" ? \"intIn\" : e;\n }\n _buildBlock() {\n this.floatOut._storedFunction = (e) => this.floatIn.isConnected ? this.floatIn.getConnectedValue(e) : this.intIn.isConnected ? this.intIn.getConnectedValue(e) : 0, this.intOut._storedFunction = (e) => this.floatIn.isConnected ? Math.floor(this.floatIn.getConnectedValue(e)) : this.intIn.isConnected ? Math.floor(this.intIn.getConnectedValue(e)) : 0;\n }\n}\nRe(\"BABYLON.IntFloatConverterBlock\", tO);\nfunction iO(n, e) {\n return `{X: ${n.x.toFixed(e)} Y: ${n.y.toFixed(e)}}`;\n}\nfunction rO(n, e) {\n return `{X: ${n._x.toFixed(e)} Y: ${n._y.toFixed(e)} Z: ${n._z.toFixed(e)}}`;\n}\nfunction sO(n, e) {\n return `{X: ${n.x.toFixed(e)} Y: ${n.y.toFixed(e)} Z: ${n.z.toFixed(e)} W: ${n.w.toFixed(e)}}`;\n}\nclass nO extends Ve {\n /**\n * Create a new DebugBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.log = [], this._isDebug = !0, this.registerInput(\"input\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the time spent to build this block (in ms)\n */\n get buildExecutionTime() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"DebugBlock\";\n }\n /**\n * Gets the input component\n */\n get input() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n if (!this.input.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n this.log = [];\n const t = (i) => {\n const r = this.input.getConnectedValue(i);\n if (r == null)\n return this.log.push([\"null\", \"\"]), r;\n switch (this.input.type) {\n case b.Vector2:\n this.log.push([iO(r, 4), r.toString()]);\n break;\n case b.Vector3:\n this.log.push([rO(r, 4), r.toString()]);\n break;\n case b.Vector4:\n this.log.push([sO(r, 4), r.toString()]);\n break;\n default:\n this.log.push([r.toString(), r.toString()]);\n break;\n }\n return r;\n };\n this.output.isConnected ? this.output._storedFunction = t : this.output._storedValue = t(e);\n }\n}\nRe(\"BABYLON.DebugBlock\", nO);\nclass aO extends Ve {\n /**\n * Create a new GeometryInfoBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"geometry\", b.Geometry), this.registerOutput(\"output\", b.Geometry), this.registerOutput(\"id\", b.Int), this.registerOutput(\"collectionId\", b.Int), this.registerOutput(\"verticesCount\", b.Int), this.registerOutput(\"facesCount\", b.Int);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryInfoBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n /**\n * Gets the id output component\n */\n get id() {\n return this._outputs[1];\n }\n /**\n * Gets the collectionId output component\n */\n get collectionId() {\n return this._outputs[2];\n }\n /**\n * Gets the verticesCount output component\n */\n get verticesCount() {\n return this._outputs[3];\n }\n /**\n * Gets the facesCount output component\n */\n get facesCount() {\n return this._outputs[4];\n }\n _buildBlock() {\n if (!this.geometry.isConnected) {\n this.id._storedValue = 0, this.collectionId._storedValue = 0, this.verticesCount._storedValue = 0, this.facesCount._storedValue = 0, this.output._storedValue = 0, this.id._storedFunction = null, this.collectionId._storedFunction = null, this.verticesCount._storedFunction = null, this.facesCount._storedFunction = null, this.output._storedFunction = null;\n return;\n }\n this.output._storedFunction = (e) => (this._currentVertexData = this.geometry.getConnectedValue(e), this._currentVertexData), this.id._storedFunction = (e) => (this._currentVertexData = this._currentVertexData || this.geometry.getConnectedValue(e), this._currentVertexData.uniqueId), this.collectionId._storedFunction = (e) => (this._currentVertexData = this._currentVertexData || this.geometry.getConnectedValue(e), this._currentVertexData.metadata ? this._currentVertexData.metadata.collectionId : 0), this.verticesCount._storedFunction = (e) => (this._currentVertexData = this._currentVertexData || this.geometry.getConnectedValue(e), this._currentVertexData.positions ? this._currentVertexData.positions.length / 3 : 0), this.facesCount._storedFunction = (e) => (this._currentVertexData = this._currentVertexData || this.geometry.getConnectedValue(e), this._currentVertexData.indices ? this._currentVertexData.indices.length / 3 : 0);\n }\n}\nRe(\"BABYLON.GeometryInfoBlock\", aO);\nvar ls;\n(function(n) {\n n[n.Spherical = 0] = \"Spherical\", n[n.Cylindrical = 1] = \"Cylindrical\", n[n.Cubic = 2] = \"Cubic\";\n})(ls || (ls = {}));\nclass iE extends Ve {\n /**\n * Create a new MappingBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.mapping = ls.Spherical, this.registerInput(\"position\", b.Vector3), this.registerInput(\"normal\", b.Vector3), this.registerInput(\"center\", b.Vector3, !0, _.Zero()), this.registerOutput(\"uv\", b.Vector2);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"MappingBlock\";\n }\n /**\n * Gets the position input component\n */\n get position() {\n return this._inputs[0];\n }\n /**\n * Gets the normal input component\n */\n get normal() {\n return this._inputs[1];\n }\n /**\n * Gets the center input component\n */\n get center() {\n return this._inputs[2];\n }\n /**\n * Gets the output component\n */\n get uv() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.position.isConnected) {\n this.uv._storedFunction = null, this.uv._storedValue = null;\n return;\n }\n const e = _.Zero(), t = (i) => {\n const r = this.position.getConnectedValue(i) || _.Zero(), s = this.normal.getConnectedValue(i) || _.Zero(), a = this.center.getConnectedValue(i), o = me.Zero();\n switch (this.mapping) {\n case ls.Spherical: {\n r.subtractToRef(a, e);\n const l = e.length();\n l > 0 && (o.x = Math.acos(e.y / l) / Math.PI, (e.x !== 0 || e.z !== 0) && (o.y = Math.atan2(e.x, e.z) / (Math.PI * 2)));\n break;\n }\n case ls.Cylindrical: {\n r.subtractToRef(a, e);\n const l = e.length();\n l > 0 && (o.x = Math.atan2(e.x / l, e.z / l) / (Math.PI * 2), o.y = (e.y + 1) / 2);\n break;\n }\n case ls.Cubic: {\n const l = Math.abs(s.x), c = Math.abs(s.y), h = Math.abs(s.z), u = Math.max(Math.abs(r.x), Math.abs(r.y), Math.abs(r.z));\n let f = 0, d = 0;\n l >= c && l >= h ? (f = r.y / u - a.y, d = r.z / u - a.z) : c >= l && c >= h ? (f = r.x / u - a.x, d = r.z / u - a.z) : (f = r.x / u - a.x, d = r.y / u - a.y), o.x = (f + 1) / 2, o.y = (d + 1) / 2;\n }\n }\n return o;\n };\n this.uv._storedFunction = (i) => t(i);\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.mapping = BABYLON.MappingTypes.${ls[this.mapping]};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.mapping = this.mapping, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.mapping = e.mapping;\n }\n}\nP([\n gt(\"Mapping\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"Spherical\", value: ls.Spherical },\n { label: \"Cylindrical\", value: ls.Cylindrical },\n { label: \"Cubic\", value: ls.Cubic }\n ]\n })\n], iE.prototype, \"mapping\", void 0);\nRe(\"BABYLON.MappingBlock\", iE);\nclass oO extends Ve {\n /**\n * Create a new MatrixComposeBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"matrix0\", b.Matrix), this.registerInput(\"matrix1\", b.Matrix), this.registerOutput(\"output\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"MatrixComposeBlock\";\n }\n /**\n * Gets the matrix0 input component\n */\n get matrix0() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix1 input component\n */\n get matrix1() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n this.output._storedFunction = (e) => {\n if (!this.matrix0.isConnected || !this.matrix1.isConnected)\n return null;\n const t = this.matrix0.getConnectedValue(e), i = this.matrix1.getConnectedValue(e);\n return !t || !i ? null : t.multiply(i);\n };\n }\n}\nRe(\"BABYLON.MatrixComposeBlock\", oO);\nclass lO extends Ve {\n /** Gets the list of attached endpoints */\n get endpoints() {\n return this._endpoints;\n }\n /**\n * Create a new TeleportInBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._endpoints = [], this._isTeleportIn = !0, this.registerInput(\"input\", b.AutoDetect);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"TeleportInBlock\";\n }\n /**\n * Gets the input component\n */\n get input() {\n return this._inputs[0];\n }\n _dumpCode(e, t) {\n let i = super._dumpCode(e, t);\n for (const r of this.endpoints)\n t.indexOf(r) === -1 && (i += r._dumpCode(e, t));\n return i;\n }\n /**\n * Checks if the current block is an ancestor of a given type\n * @param type defines the potential type to check\n * @returns true if block is a descendant\n */\n isAnAncestorOfType(e) {\n if (this.getClassName() === e)\n return !0;\n for (const t of this.endpoints)\n if (t.isAnAncestorOfType(e))\n return !0;\n return !1;\n }\n /**\n * Checks if the current block is an ancestor of a given block\n * @param block defines the potential descendant block to check\n * @returns true if block is a descendant\n */\n isAnAncestorOf(e) {\n for (const t of this.endpoints)\n if (t === e || t.isAnAncestorOf(e))\n return !0;\n return !1;\n }\n /**\n * Get the first descendant using a predicate\n * @param predicate defines the predicate to check\n * @returns descendant or null if none found\n */\n getDescendantOfPredicate(e) {\n if (e(this))\n return this;\n for (const t of this.endpoints) {\n const i = t.getDescendantOfPredicate(e);\n if (i)\n return i;\n }\n return null;\n }\n /**\n * Add an enpoint to this block\n * @param endpoint define the endpoint to attach to\n */\n attachToEndpoint(e) {\n e.detach(), this._endpoints.push(e), e._entryPoint = this, e._outputs[0]._typeConnectionSource = this._inputs[0], e._tempEntryPointUniqueId = null, e.name = \"> \" + this.name;\n }\n /**\n * Remove enpoint from this block\n * @param endpoint define the endpoint to remove\n */\n detachFromEndpoint(e) {\n const t = this._endpoints.indexOf(e);\n t !== -1 && (this._endpoints.splice(t, 1), e._outputs[0]._typeConnectionSource = null, e._entryPoint = null);\n }\n _buildBlock() {\n for (const e of this._endpoints)\n e.output._storedFunction = (t) => this.input.getConnectedValue(t);\n }\n}\nRe(\"BABYLON.TeleportInBlock\", lO);\nclass cO extends Ve {\n /**\n * Create a new TeleportOutBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._entryPoint = null, this._tempEntryPointUniqueId = null, this._isTeleportOut = !0, this.registerOutput(\"output\", b.BasedOnInput);\n }\n /**\n * Gets the entry point\n */\n get entryPoint() {\n return this._entryPoint;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"TeleportOutBlock\";\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n /** Detach from entry point */\n detach() {\n this._entryPoint && this._entryPoint.detachFromEndpoint(this);\n }\n _buildBlock() {\n }\n _customBuildStep(e) {\n this.entryPoint && this.entryPoint.build(e);\n }\n _dumpCode(e, t) {\n let i = \"\";\n return this.entryPoint && t.indexOf(this.entryPoint) === -1 && (i += this.entryPoint._dumpCode(e, t)), i + super._dumpCode(e, t);\n }\n _dumpCodeForOutputConnections(e) {\n let t = super._dumpCodeForOutputConnections(e);\n return this.entryPoint && (t += this.entryPoint._dumpCodeForOutputConnections(e)), t;\n }\n /**\n * Clone the current block to a new identical block\n * @returns a copy of the current block\n */\n clone() {\n const e = super.clone();\n return this.entryPoint && this.entryPoint.attachToEndpoint(e), e;\n }\n _dumpPropertiesCode() {\n let e = super._dumpPropertiesCode();\n return this.entryPoint && (e += `${this.entryPoint._codeVariableName}.attachToEndpoint(${this._codeVariableName});\n`), e;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n var t;\n const e = super.serialize();\n return e.entryPoint = ((t = this.entryPoint) == null ? void 0 : t.uniqueId) ?? \"\", e;\n }\n _deserialize(e) {\n super._deserialize(e), this._tempEntryPointUniqueId = e.entryPoint;\n }\n}\nRe(\"BABYLON.TeleportOutBlock\", cO);\nclass rE extends Ve {\n /**\n * Gets the texture data\n */\n get textureData() {\n return this._data;\n }\n /**\n * Gets the texture width\n */\n get textureWidth() {\n return this._width;\n }\n /**\n * Gets the texture height\n */\n get textureHeight() {\n return this._height;\n }\n /**\n * Creates a new GeometryTextureBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._data = null, this.serializedCachedData = !1, this.registerOutput(\"texture\", b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryTextureBlock\";\n }\n /**\n * Gets the texture component\n */\n get texture() {\n return this._outputs[0];\n }\n _prepareImgToLoadAsync(e) {\n return new Promise((t, i) => {\n const r = new Image(), s = document.createElement(\"canvas\"), a = s.getContext(\"2d\");\n r.onload = () => {\n s.width = r.width, s.height = r.height, a.drawImage(r, 0, 0);\n const l = a.getImageData(0, 0, r.width, r.height).data, c = new Float32Array(l.length);\n for (let h = 0; h < l.length; h++)\n c[h] = l[h] / 255;\n this._data = c, this._width = r.width, this._height = r.height, t();\n }, r.onerror = () => {\n this._data = null, i();\n }, r.src = e;\n });\n }\n /**\n * Remove stored data\n */\n cleanData() {\n this._data = null;\n }\n /**\n * Load the texture data\n * @param imageFile defines the file to load data from\n * @returns a promise fulfilled when image data is loaded\n */\n loadTextureFromFileAsync(e) {\n return this._prepareImgToLoadAsync(URL.createObjectURL(e));\n }\n /**\n * Load the texture data\n * @param url defines the url to load data from\n * @returns a promise fulfilled when image data is loaded\n */\n loadTextureFromUrlAsync(e) {\n return this._prepareImgToLoadAsync(e);\n }\n /**\n * Load the texture data\n * @param texture defines the source texture\n * @returns a promise fulfilled when image data is loaded\n */\n extractFromTextureAsync(e) {\n return new Promise((t, i) => {\n if (!e.isReady()) {\n e.onLoadObservable.addOnce(() => this.extractFromTextureAsync(e).then(t).catch(i));\n return;\n }\n const r = e.getSize();\n j1.GetTextureDataAsync(e, r.width, r.height).then(async (s) => {\n const a = new Float32Array(s.length);\n for (let o = 0; o < s.length; o++)\n a[o] = s[o] / 255;\n this._data = a, this._width = r.width, this._height = r.height, t();\n }).catch(i);\n });\n }\n _buildBlock() {\n if (!this._data) {\n this.texture._storedValue = null;\n return;\n }\n const e = {\n data: this._data,\n width: this._width,\n height: this._height\n };\n this.texture._storedValue = e;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.width = this._width, e.height = this._height, e.serializedCachedData = this.serializedCachedData, this._data && this.serializedCachedData && (e.data = Array.from(this._data)), e;\n }\n _deserialize(e) {\n super._deserialize(e), this._width = e.width, this._height = e.height, e.data ? (this._data = new Float32Array(e.data), this.serializedCachedData = !0) : this.serializedCachedData = !!e.serializedCachedData;\n }\n}\nP([\n gt(\"Serialize cached data\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], rE.prototype, \"serializedCachedData\", void 0);\nRe(\"BABYLON.GeometryTextureBlock\", rE);\nclass sE extends Ve {\n /**\n * Creates a new GeometryTextureFetchBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.clampCoordinates = !0, this.registerInput(\"texture\", b.Texture), this.registerInput(\"coordinates\", b.Vector2), this.registerOutput(\"rgba\", b.Vector4), this.registerOutput(\"rgb\", b.Vector3), this.registerOutput(\"r\", b.Float), this.registerOutput(\"g\", b.Float), this.registerOutput(\"b\", b.Float), this.registerOutput(\"a\", b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryTextureFetchBlock\";\n }\n /**\n * Gets the texture component\n */\n get texture() {\n return this.inputs[0];\n }\n /**\n * Gets the coordinates component\n */\n get coordinates() {\n return this.inputs[1];\n }\n /**\n * Gets the rgba component\n */\n get rgba() {\n return this._outputs[0];\n }\n /**\n * Gets the rgb component\n */\n get rgb() {\n return this._outputs[1];\n }\n /**\n * Gets the r component\n */\n get r() {\n return this._outputs[2];\n }\n /**\n * Gets the g component\n */\n get g() {\n return this._outputs[3];\n }\n /**\n * Gets the b component\n */\n get b() {\n return this._outputs[4];\n }\n /**\n * Gets the a component\n */\n get a() {\n return this._outputs[5];\n }\n _repeatClamp(e) {\n return e >= 0 ? e % 1 : 1 - Math.abs(e) % 1;\n }\n _buildBlock() {\n const e = (t) => {\n const i = this.texture.getConnectedValue(t);\n if (!i || !i.data)\n return null;\n const r = this.coordinates.getConnectedValue(t);\n if (!r)\n return null;\n const s = this.clampCoordinates ? Math.max(0, Math.min(r.x, 1)) : this._repeatClamp(r.x), a = this.clampCoordinates ? Math.max(0, Math.min(r.y, 1)) : this._repeatClamp(r.y), o = Math.floor(s * (i.width - 1)), l = Math.floor(a * (i.height - 1)), c = o + i.width * l;\n return Ke.FromArray(i.data, c * 4);\n };\n this.rgba._storedFunction = (t) => e(t), this.rgb._storedFunction = (t) => {\n const i = e(t);\n return i ? i.toVector3() : null;\n }, this.r._storedFunction = (t) => {\n const i = e(t);\n return i ? i.x : null;\n }, this.g._storedFunction = (t) => {\n const i = e(t);\n return i ? i.y : null;\n }, this.b._storedFunction = (t) => {\n const i = e(t);\n return i ? i.z : null;\n }, this.a._storedFunction = (t) => {\n const i = e(t);\n return i ? i.w : null;\n };\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.clampCoordinates = ${this.clampCoordinates};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.clampCoordinates = this.clampCoordinates, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.clampCoordinates = e.clampCoordinates;\n }\n}\nP([\n gt(\"Clamp Coordinates\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], sE.prototype, \"clampCoordinates\", void 0);\nRe(\"BABYLON.GeometryTextureFetchBlock\", sE);\nclass hO extends Ve {\n /**\n * Create a new BoundingBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"geometry\", b.Geometry), this.registerOutput(\"min\", b.Vector3), this.registerOutput(\"max\", b.Vector3);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"BoundingBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the min output component\n */\n get min() {\n return this._outputs[0];\n }\n /**\n * Gets the max output component\n */\n get max() {\n return this._outputs[1];\n }\n _buildBlock() {\n this.min._storedFunction = (e) => {\n const t = this.geometry.getConnectedValue(e);\n return t ? _o(t.positions, 0, t.positions.length / 3).minimum : null;\n }, this.max._storedFunction = (e) => {\n const t = this.geometry.getConnectedValue(e);\n return t ? _o(t.positions, 0, t.positions.length / 3).maximum : null;\n };\n }\n}\nRe(\"BABYLON.BoundingBlock\", hO);\nvar cs;\n(function(n) {\n n[n.Intersect = 0] = \"Intersect\", n[n.Subtract = 1] = \"Subtract\", n[n.Union = 2] = \"Union\";\n})(cs || (cs = {}));\nclass Af extends Ve {\n /**\n * Create a new BooleanGeometryBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.operation = cs.Intersect, this.registerInput(\"geometry0\", b.Geometry), this.registerInput(\"geometry1\", b.Geometry), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"BooleanGeometryBlock\";\n }\n /**\n * Gets the geometry0 input component\n */\n get geometry0() {\n return this._inputs[0];\n }\n /**\n * Gets the geometry1 input component\n */\n get geometry1() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n const r = this.geometry0.getConnectedValue(i), s = this.geometry1.getConnectedValue(i);\n if (!r || !s)\n return null;\n const a = r.positions.length / 3;\n !r.normals && s.normals && (r.normals = new Array(r.positions.length)), !s.normals && r.normals && (s.normals = new Array(s.positions.length)), !r.uvs && s.uvs && (r.uvs = new Array(a * 2)), !s.uvs && r.uvs && (s.uvs = new Array(a * 2)), !r.colors && s.colors && (r.colors = new Array(a * 4)), !s.colors && r.colors && (s.colors = new Array(a * 4));\n const o = ss.FromVertexData(r), l = ss.FromVertexData(s);\n let c;\n switch (this.operation) {\n case cs.Intersect:\n c = o.intersect(l);\n break;\n case cs.Subtract:\n c = o.subtract(l);\n break;\n case cs.Union:\n c = o.union(l);\n break;\n }\n return c.toVertexData();\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n let e = super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n return e += `${this._codeVariableName}.operation = BABYLON.BooleanGeometryOperations.${cs[this.operation]};\n`, e;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e.operation = this.operation, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext, e.operation && (this.operation = e.operation);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], Af.prototype, \"evaluateContext\", void 0);\nP([\n gt(\"Operation\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"Intersect\", value: cs.Intersect },\n { label: \"Subtract\", value: cs.Subtract },\n { label: \"Union\", value: cs.Union }\n ]\n })\n], Af.prototype, \"operation\", void 0);\nRe(\"BABYLON.BooleanGeometryBlock\", Af);\nclass uO extends Ve {\n /**\n * Creates a new GeometryArcTan2Block\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"x\", b.AutoDetect), this.registerInput(\"y\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryArcTan2Block\";\n }\n /**\n * Gets the x operand input component\n */\n get x() {\n return this._inputs[0];\n }\n /**\n * Gets the y operand input component\n */\n get y() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.x.isConnected || !this.y.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i) => Math.atan2(t, i);\n this.output._storedFunction = (t) => {\n const i = this.x.getConnectedValue(t), r = this.y.getConnectedValue(t);\n switch (this.x.type) {\n case b.Int:\n case b.Float:\n return e(i, r);\n case b.Vector2:\n return new me(e(i.x, r.x), e(i.y, r.y));\n case b.Vector3:\n return new _(e(i.x, r.x), e(i.y, r.y), e(i.z, r.z));\n case b.Vector4:\n return new Ke(e(i.x, r.x), e(i.y, r.y), e(i.z, r.z), e(i.w, r.w));\n }\n return 0;\n };\n }\n}\nRe(\"BABYLON.GeometryArcTan2Block\", uO);\nclass fO extends Ve {\n /**\n * Creates a new GeometryLerpBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerInput(\"gradient\", b.Float), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryLerpBlock\";\n }\n /**\n * Gets the left operand input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right operand input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the gradient operand input component\n */\n get gradient() {\n return this._inputs[2];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected || !this.right.isConnected || !this.gradient.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i, r) => (1 - t) * i + t * r;\n return this.output._storedFunction = (t) => {\n const i = this.left.getConnectedValue(t), r = this.right.getConnectedValue(t), s = this.gradient.getConnectedValue(t);\n switch (this.left.type) {\n case b.Int:\n case b.Float:\n return e(s, i, r);\n case b.Vector2:\n return new me(e(s, i.x, r.x), e(s, i.y, r.y));\n case b.Vector3:\n return new _(e(s, i.x, r.x), e(s, i.y, r.y), e(s, i.z, r.z));\n case b.Vector4:\n return new Ke(e(s, i.x, r.x), e(s, i.y, r.y), e(s, i.z, r.z), e(s, i.w, r.w));\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryLerpBlock\", fO);\nclass dO extends Ve {\n /**\n * Creates a new GeometryNLerpBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerInput(\"gradient\", b.Float), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryNLerpBlock\";\n }\n /**\n * Gets the left operand input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right operand input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the gradient operand input component\n */\n get gradient() {\n return this._inputs[2];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected || !this.right.isConnected || !this.gradient.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i, r) => (1 - t) * i + t * r;\n return this.output._storedFunction = (t) => {\n const i = this.left.getConnectedValue(t), r = this.right.getConnectedValue(t), s = this.gradient.getConnectedValue(t);\n switch (this.left.type) {\n case b.Int:\n case b.Float:\n return e(s, i, r);\n case b.Vector2: {\n const a = new me(e(s, i.x, r.x), e(s, i.y, r.y));\n return a.normalize(), a;\n }\n case b.Vector3: {\n const a = new _(e(s, i.x, r.x), e(s, i.y, r.y), e(s, i.z, r.z));\n return a.normalize(), a;\n }\n case b.Vector4: {\n const a = new Ke(e(s, i.x, r.x), e(s, i.y, r.y), e(s, i.z, r.z), e(s, i.w, r.w));\n return a.normalize(), a;\n }\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryNLerpBlock\", dO);\nclass pO extends Ve {\n /**\n * Creates a new GeometryStepBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"edge\", b.Float), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryStepBlock\";\n }\n /**\n * Gets the value operand input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the edge operand input component\n */\n get edge() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected || !this.edge.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i) => t < i ? 0 : 1;\n return this.output._storedFunction = (t) => {\n const i = this.value.getConnectedValue(t), r = this.edge.getConnectedValue(t);\n switch (this.value.type) {\n case b.Int:\n case b.Float:\n return e(i, r);\n case b.Vector2:\n return new me(e(i.x, r), e(i.y, r));\n case b.Vector3:\n return new _(e(i.x, r), e(i.y, r), e(i.z, r));\n case b.Vector4:\n return new Ke(e(i.x, r), e(i.y, r), e(i.z, r), e(i.w, r));\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryStepBlock\", pO);\nclass gO extends Ve {\n /**\n * Creates a new GeometrySmoothStepBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"edge0\", b.Float), this.registerInput(\"edge1\", b.Float), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometrySmoothStepBlock\";\n }\n /**\n * Gets the value operand input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the first edge operand input component\n */\n get edge0() {\n return this._inputs[1];\n }\n /**\n * Gets the second edge operand input component\n */\n get edge1() {\n return this._inputs[2];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected || !this.edge0.isConnected || !this.edge1.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i, r) => {\n const s = Math.max(0, Math.min((t - i) / (r - i), 1));\n return s * s * (3 - 2 * s);\n };\n return this.output._storedFunction = (t) => {\n const i = this.value.getConnectedValue(t), r = this.edge0.getConnectedValue(t), s = this.edge1.getConnectedValue(t);\n switch (this.value.type) {\n case b.Int:\n case b.Float:\n return e(i, r, s);\n case b.Vector2:\n return new me(e(i.x, r, s), e(i.y, r, s));\n case b.Vector3:\n return new _(e(i.x, r, s), e(i.y, r, s), e(i.z, r, s));\n case b.Vector4:\n return new Ke(e(i.x, r, s), e(i.y, r, s), e(i.z, r, s), e(i.w, r, s));\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometrySmoothStepBlock\", gO);\nclass mO extends Ve {\n /**\n * Creates a new GeometryModBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryModBlock\";\n }\n /**\n * Gets the left operand input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right operand input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected || !this.right.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i) => t - Math.floor(t / i) * i;\n return this.output._storedFunction = (t) => {\n const i = this.left.getConnectedValue(t), r = this.right.getConnectedValue(t);\n switch (this.left.type) {\n case b.Int:\n case b.Float:\n return e(i, r);\n case b.Vector2:\n return new me(e(i.x, r.x), e(i.y, r.y));\n case b.Vector3:\n return new _(e(i.x, r.x), e(i.y, r.y), e(i.z, r.z));\n case b.Vector4:\n return new Ke(e(i.x, r.x), e(i.y, r.y), e(i.z, r.z), e(i.w, r.w));\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryModBlock\", mO);\nclass _O extends Ve {\n /**\n * Creates a new GeometryPowBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"power\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryPowBlock\";\n }\n /**\n * Gets the value operand input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the power operand input component\n */\n get power() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected || !this.power.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i) => Math.pow(t, i);\n return this.output._storedFunction = (t) => {\n const i = this.value.getConnectedValue(t), r = this.power.getConnectedValue(t);\n switch (this.value.type) {\n case b.Int:\n case b.Float:\n return e(i, r);\n case b.Vector2:\n return new me(e(i.x, r), e(i.y, r));\n case b.Vector3:\n return new _(e(i.x, r), e(i.y, r), e(i.z, r));\n case b.Vector4:\n return new Ke(e(i.x, r), e(i.y, r), e(i.z, r), e(i.w, r));\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryPowBlock\", _O);\nclass Mf extends Ve {\n /**\n * Creates a new GeometryClampBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.minimum = 0, this.maximum = 1, this.registerInput(\"value\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryClampBlock\";\n }\n /**\n * Gets the value input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t) => Math.max(this.minimum, Math.min(t, this.maximum));\n return this.output._storedFunction = (t) => {\n const i = this.value.getConnectedValue(t);\n switch (this.value.type) {\n case b.Int:\n case b.Float:\n return e(i);\n case b.Vector2:\n return new me(e(i.x), e(i.y));\n case b.Vector3:\n return new _(e(i.x), e(i.y), e(i.z));\n case b.Vector4:\n return new Ke(e(i.x), e(i.y), e(i.z), e(i.w));\n }\n return 0;\n }, this;\n }\n _dumpPropertiesCode() {\n let e = super._dumpPropertiesCode() + `${this._codeVariableName}.minimum = ${this.minimum};\n`;\n return e += `${this._codeVariableName}.maximum = ${this.maximum};\n`, e;\n }\n serialize() {\n const e = super.serialize();\n return e.minimum = this.minimum, e.maximum = this.maximum, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.minimum = e.minimum, this.maximum = e.maximum;\n }\n}\nP([\n gt(\"Minimum\", ht.Float)\n], Mf.prototype, \"minimum\", void 0);\nP([\n gt(\"Maximum\", ht.Float)\n], Mf.prototype, \"maximum\", void 0);\nRe(\"BABYLON.GeometryClampBlock\", Mf);\nclass EO extends Ve {\n /**\n * Creates a new GeometryCrossBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerOutput(\"output\", b.Vector3), this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Int), this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Vector2), this._inputs[1].excludedConnectionPointTypes.push(b.Int), this._inputs[1].excludedConnectionPointTypes.push(b.Float), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Vector2);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryCrossBlock\";\n }\n /**\n * Gets the left operand input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right operand input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected || !this.right.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.left.getConnectedValue(e), i = this.right.getConnectedValue(e);\n switch (this.left.type) {\n case b.Vector3:\n return _.Cross(t, i);\n case b.Vector4:\n return _.Cross(t.toVector3(), i.toVector3());\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryCrossBlock\", EO);\nvar Ze;\n(function(n) {\n n[n.EaseInSine = 0] = \"EaseInSine\", n[n.EaseOutSine = 1] = \"EaseOutSine\", n[n.EaseInOutSine = 2] = \"EaseInOutSine\", n[n.EaseInQuad = 3] = \"EaseInQuad\", n[n.EaseOutQuad = 4] = \"EaseOutQuad\", n[n.EaseInOutQuad = 5] = \"EaseInOutQuad\", n[n.EaseInCubic = 6] = \"EaseInCubic\", n[n.EaseOutCubic = 7] = \"EaseOutCubic\", n[n.EaseInOutCubic = 8] = \"EaseInOutCubic\", n[n.EaseInQuart = 9] = \"EaseInQuart\", n[n.EaseOutQuart = 10] = \"EaseOutQuart\", n[n.EaseInOutQuart = 11] = \"EaseInOutQuart\", n[n.EaseInQuint = 12] = \"EaseInQuint\", n[n.EaseOutQuint = 13] = \"EaseOutQuint\", n[n.EaseInOutQuint = 14] = \"EaseInOutQuint\", n[n.EaseInExpo = 15] = \"EaseInExpo\", n[n.EaseOutExpo = 16] = \"EaseOutExpo\", n[n.EaseInOutExpo = 17] = \"EaseInOutExpo\", n[n.EaseInCirc = 18] = \"EaseInCirc\", n[n.EaseOutCirc = 19] = \"EaseOutCirc\", n[n.EaseInOutCirc = 20] = \"EaseInOutCirc\", n[n.EaseInBack = 21] = \"EaseInBack\", n[n.EaseOutBack = 22] = \"EaseOutBack\", n[n.EaseInOutBack = 23] = \"EaseInOutBack\", n[n.EaseInElastic = 24] = \"EaseInElastic\", n[n.EaseOutElastic = 25] = \"EaseOutElastic\", n[n.EaseInOutElastic = 26] = \"EaseInOutElastic\";\n})(Ze || (Ze = {}));\nclass nE extends Ve {\n /**\n * Creates a new CurveBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.type = Ze.EaseInOutSine, this.registerInput(\"input\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Int);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryCurveBlock\";\n }\n /**\n * Gets the input component\n */\n get input() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.input.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n let e;\n switch (this.type) {\n case Ze.EaseInSine:\n e = (t) => 1 - Math.cos(t * 3.1415 / 2);\n break;\n case Ze.EaseOutSine:\n e = (t) => Math.sin(t * 3.1415 / 2);\n break;\n case Ze.EaseInOutSine:\n e = (t) => -(Math.cos(t * 3.1415) - 1) / 2;\n break;\n case Ze.EaseInQuad:\n e = (t) => t * t;\n break;\n case Ze.EaseOutQuad:\n e = (t) => (1 - t) * (1 - t);\n break;\n case Ze.EaseInOutQuad: {\n e = (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;\n break;\n }\n case Ze.EaseInCubic:\n e = (t) => t * t * t;\n break;\n case Ze.EaseOutCubic: {\n e = (t) => 1 - Math.pow(1 - t, 3);\n break;\n }\n case Ze.EaseInOutCubic: {\n e = (t) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n break;\n }\n case Ze.EaseInQuart:\n e = (t) => t * t * t * t;\n break;\n case Ze.EaseOutQuart: {\n e = (t) => 1 - Math.pow(1 - t, 4);\n break;\n }\n case Ze.EaseInOutQuart: {\n e = (t) => t < 0.5 ? 8 * t * t * t * t : 1 - Math.pow(-2 * t + 2, 4) / 2;\n break;\n }\n case Ze.EaseInQuint:\n e = (t) => t * t * t * t * t;\n break;\n case Ze.EaseOutQuint: {\n e = (t) => 1 - Math.pow(1 - t, 5);\n break;\n }\n case Ze.EaseInOutQuint: {\n e = (t) => t < 0.5 ? 16 * t * t * t * t * t : 1 - Math.pow(-2 * t + 2, 5) / 2;\n break;\n }\n case Ze.EaseInExpo: {\n e = (t) => t === 0 ? 0 : Math.pow(2, 10 * t - 10);\n break;\n }\n case Ze.EaseOutExpo: {\n e = (t) => t === 1 ? 1 : 1 - Math.pow(2, -10 * t);\n break;\n }\n case Ze.EaseInOutExpo: {\n e = (t) => t === 0 ? 0 : t === 1 ? 1 : t < 0.5 ? Math.pow(2, 20 * t - 10) / 2 : (2 - Math.pow(2, -20 * t + 10)) / 2;\n break;\n }\n case Ze.EaseInCirc: {\n e = (t) => 1 - Math.sqrt(1 - Math.pow(t, 2));\n break;\n }\n case Ze.EaseOutCirc: {\n e = (t) => Math.sqrt(1 - Math.pow(t - 1, 2));\n break;\n }\n case Ze.EaseInOutCirc: {\n e = (t) => t < 0.5 ? (1 - Math.sqrt(1 - Math.pow(2 * t, 2))) / 2 : (Math.sqrt(1 - Math.pow(-2 * t + 2, 2)) + 1) / 2;\n break;\n }\n case Ze.EaseInBack: {\n e = (t) => 2.70158 * t * t * t - 1.70158 * t * t;\n break;\n }\n case Ze.EaseOutBack: {\n e = (t) => 2.70158 * Math.pow(t - 1, 3) + 1.70158 * Math.pow(t - 1, 2);\n break;\n }\n case Ze.EaseInOutBack: {\n e = (t) => t < 0.5 ? Math.pow(2 * t, 2) * (3.5949095 * 2 * t - 2.5949095) / 2 : (Math.pow(2 * t - 2, 2) * (3.5949095 * (t * 2 - 2) + 3.5949095) + 2) / 2;\n break;\n }\n case Ze.EaseInElastic: {\n e = (t) => t === 0 ? 0 : t === 1 ? 1 : -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * (2 * 3.1415 / 3));\n break;\n }\n case Ze.EaseOutElastic: {\n e = (t) => t === 0 ? 0 : t === 1 ? 1 : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * (2 * 3.1415 / 3)) + 1;\n break;\n }\n case Ze.EaseInOutElastic: {\n e = (t) => t === 0 ? 0 : t == 1 ? 1 : t < 0.5 ? -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * (2 * 3.1415 / 4.5))) / 2 : Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * (2 * 3.1415 / 4.5)) / 2 + 1;\n break;\n }\n }\n return this.output._storedFunction = (t) => {\n const i = this.input.getConnectedValue(t);\n switch (this.input.type) {\n case b.Float:\n return e(i);\n case b.Vector2:\n return new me(e(i.x), e(i.y));\n case b.Vector3:\n return new _(e(i.x), e(i.y), e(i.z));\n case b.Vector4:\n return new Ke(e(i.x), e(i.y), e(i.z), e(i.w));\n }\n return 0;\n }, this;\n }\n serialize() {\n const e = super.serialize();\n return e.curveType = this.type, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.type = e.curveType;\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.type = BABYLON.GeometryCurveBlockTypes.${Ze[this.type]};\n`;\n }\n}\nP([\n gt(\"Type\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"EaseInSine\", value: Ze.EaseInSine },\n { label: \"EaseOutSine\", value: Ze.EaseOutSine },\n { label: \"EaseInOutSine\", value: Ze.EaseInOutSine },\n { label: \"EaseInQuad\", value: Ze.EaseInQuad },\n { label: \"EaseOutQuad\", value: Ze.EaseOutQuad },\n { label: \"EaseInOutQuad\", value: Ze.EaseInOutQuad },\n { label: \"EaseInCubic\", value: Ze.EaseInCubic },\n { label: \"EaseOutCubic\", value: Ze.EaseOutCubic },\n { label: \"EaseInOutCubic\", value: Ze.EaseInOutCubic },\n { label: \"EaseInQuart\", value: Ze.EaseInQuart },\n { label: \"EaseOutQuart\", value: Ze.EaseOutQuart },\n { label: \"EaseInOutQuart\", value: Ze.EaseInOutQuart },\n { label: \"EaseInQuint\", value: Ze.EaseInQuint },\n { label: \"EaseOutQuint\", value: Ze.EaseOutQuint },\n { label: \"EaseInOutQuint\", value: Ze.EaseInOutQuint },\n { label: \"EaseInExpo\", value: Ze.EaseInExpo },\n { label: \"EaseOutExpo\", value: Ze.EaseOutExpo },\n { label: \"EaseInOutExpo\", value: Ze.EaseInOutExpo },\n { label: \"EaseInCirc\", value: Ze.EaseInCirc },\n { label: \"EaseOutCirc\", value: Ze.EaseOutCirc },\n { label: \"EaseInOutCirc\", value: Ze.EaseInOutCirc },\n { label: \"EaseInBack\", value: Ze.EaseInBack },\n { label: \"EaseOutBack\", value: Ze.EaseOutBack },\n { label: \"EaseInOutBack\", value: Ze.EaseInOutBack },\n { label: \"EaseInElastic\", value: Ze.EaseInElastic },\n { label: \"EaseOutElastic\", value: Ze.EaseOutElastic },\n { label: \"EaseInOutElastic\", value: Ze.EaseInOutElastic }\n ]\n })\n], nE.prototype, \"type\", void 0);\nRe(\"BABYLON.GeometryCurveBlock\", nE);\nclass vO extends Ve {\n /**\n * Creates a new GeometryDesaturateBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"color\", b.Vector3), this.registerInput(\"level\", b.Float, !0, 0), this.registerOutput(\"output\", b.Vector3);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryDesaturateBlock\";\n }\n /**\n * Gets the color operand input component\n */\n get color() {\n return this._inputs[0];\n }\n /**\n * Gets the level operand input component\n */\n get level() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.color.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.color.getConnectedValue(e), i = this.level.getConnectedValue(e), r = Math.min(t.x, t.y, t.z), s = Math.max(t.x, t.y, t.z), a = 0.5 * (r + s);\n return new _(t.x * (1 - i) + a * i, t.y * (1 - i) + a * i, t.z * (1 - i) + a * i);\n }, this;\n }\n}\nRe(\"BABYLON.GeometryDesaturateBlock\", vO);\nclass TO extends Ve {\n /**\n * Creates a new GeometryPosterizeBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"steps\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].acceptedConnectionPointTypes.push(b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryPosterizeBlock\";\n }\n /**\n * Gets the value input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the steps input component\n */\n get steps() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected || !this.steps.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.value.getConnectedValue(e), i = this.steps.getConnectedValue(e);\n let r = i;\n if (this.steps.type === b.Float)\n switch (this.value.type) {\n case b.Vector2:\n r = new me(i, i);\n break;\n case b.Vector3:\n r = new _(i, i, i);\n break;\n case b.Vector4:\n r = new Ke(i, i, i, i);\n break;\n }\n switch (this.value.type) {\n case b.Vector2:\n return new me(t.x / (1 / r.x) * (1 / r.x), t.y / (1 / r.y) * (1 / r.y));\n case b.Vector3:\n return new _(t.x / (1 / r.x) * (1 / r.x), t.y / (1 / r.y) * (1 / r.y), t.z / (1 / r.z) * (1 / r.z));\n case b.Vector4:\n return new Ke(t.x / (1 / r.x) * (1 / r.x), t.y / (1 / r.y) * (1 / r.y), t.z / (1 / r.z) * (1 / r.z), t.w / (1 / r.w) * (1 / r.w));\n default:\n return Math.floor(t / (1 / i) * (1 / i));\n }\n }, this;\n }\n}\nRe(\"BABYLON.GeometryPosterizeBlock\", TO);\nclass xO extends Ve {\n /**\n * Creates a new GeometryReplaceColorBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"reference\", b.AutoDetect), this.registerInput(\"distance\", b.Float), this.registerInput(\"replacement\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._linkConnectionTypes(0, 3), this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Float), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix), this._inputs[3].excludedConnectionPointTypes.push(b.Float), this._inputs[3].excludedConnectionPointTypes.push(b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryReplaceColorBlock\";\n }\n /**\n * Gets the value input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the reference input component\n */\n get reference() {\n return this._inputs[1];\n }\n /**\n * Gets the distance input component\n */\n get distance() {\n return this._inputs[2];\n }\n /**\n * Gets the replacement input component\n */\n get replacement() {\n return this._inputs[3];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected || !this.reference.isConnected || !this.distance.isConnected || !this.replacement.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.value.getConnectedValue(e), i = this.reference.getConnectedValue(e), r = this.distance.getConnectedValue(e), s = this.replacement.getConnectedValue(e);\n return t.subtract(i).length() < r ? s : t;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryReplaceColorBlock\", xO);\nclass CO extends Ve {\n /**\n * Creates a new GeometryDistanceBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerOutput(\"output\", b.Float), this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Int), this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Float), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryDistanceBlock\";\n }\n /**\n * Gets the left operand input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right operand input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected || !this.right.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.left.getConnectedValue(e), i = this.right.getConnectedValue(e);\n return t.subtract(i).length();\n }, this;\n }\n}\nRe(\"BABYLON.GeometryDistanceBlock\", CO);\nclass RO extends Ve {\n /**\n * Creates a new GeometryDotBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerOutput(\"output\", b.Float), this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Int), this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Float), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryDotBlock\";\n }\n /**\n * Gets the left operand input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right operand input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected || !this.right.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.left.getConnectedValue(e), i = this.right.getConnectedValue(e);\n return t.dot(i);\n }, this;\n }\n}\nRe(\"BABYLON.GeometryDotBlock\", RO);\nclass SO extends Ve {\n /**\n * Creates a new GeometryLengthBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerOutput(\"output\", b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Int), this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryLengthBlock\";\n }\n /**\n * Gets the value input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => this.value.getConnectedValue(e).length(), this;\n }\n}\nRe(\"BABYLON.GeometryLengthBlock\", SO);\nclass yO extends Ve {\n /**\n * Creates a new GeometryRotate2dBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"input\", b.Vector2), this.registerInput(\"angle\", b.Float), this.registerOutput(\"output\", b.Vector2);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryRotate2dBlock\";\n }\n /**\n * Gets the input vector\n */\n get input() {\n return this._inputs[0];\n }\n /**\n * Gets the input angle\n */\n get angle() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.angle.isConnected || !this.input.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.input.getConnectedValue(e), i = this.angle.getConnectedValue(e);\n return new me(Math.cos(i) * t.x - Math.sin(i) * t.y, Math.sin(i) * t.x + Math.cos(i) * t.y);\n }, this;\n }\n}\nRe(\"BABYLON.GeometryRotate2dBlock\", yO);\nconst IO = \"gaussianSplattingPixelShader\", bO = `#include\n#include\n#include\nvarying vec4 vColor;varying vec2 vPosition;void main () { \n#include\nfloat A=-dot(vPosition,vPosition);if (A<-4.0) discard;float B=exp(A)*vColor.a;\n#include\nvec3 color=vColor.rgb;\n#ifdef FOG\n#include\n#endif\ngl_FragColor=vec4(color,B);}\n`;\nY.ShadersStore[IO] = bO;\nconst AO = \"gaussianSplattingVertexDeclaration\", MO = `uniform mat4 world;uniform mat4 view;uniform mat4 projection;\n`;\nY.IncludesShadersStore[AO] = MO;\nconst PO = \"gaussianSplattingUboDeclaration\", OO = `#include\n#include\n`;\nY.IncludesShadersStore[PO] = OO;\nconst DO = \"gaussianSplattingVertexShader\", NO = `#include<__decl__gaussianSplattingVertex>\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\n#include\n#include\n#include\nattribute vec2 position;attribute float splatIndex;uniform vec2 viewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform sampler2D covariancesATexture;uniform sampler2D covariancesBTexture;uniform sampler2D centersTexture;uniform sampler2D colorsTexture;varying vec4 vColor;varying vec2 vPosition;\n#if !defined(WEBGL2) && !defined(WEBGPU) && !defined(NATIVE)\nmat3 transpose(mat3 matrix) {return mat3(matrix[0][0],matrix[1][0],matrix[2][0],\nmatrix[0][1],matrix[1][1],matrix[2][1],\nmatrix[0][2],matrix[1][2],matrix[2][2]);}\n#endif\nvec2 getDataUV(float index,vec2 textureSize) {float y=floor(index/textureSize.x);float x=index-y*textureSize.x;return vec2((x+0.5)/textureSize.x,(y+0.5)/textureSize.y);}\nvoid main () {vec2 splatUV=getDataUV(splatIndex,dataTextureSize);vec3 center=texture2D(centersTexture,splatUV).xyz;vec4 color=texture2D(colorsTexture,splatUV);vec3 covA=texture2D(covariancesATexture,splatUV).xyz;vec3 covB=texture2D(covariancesBTexture,splatUV).xyz;vec4 worldPos=world*vec4(center,1.0);mat4 modelView=view*world;vec4 camspace=view*worldPos;vec4 pos2d=projection*camspace;float bounds=1.2*pos2d.w;if (pos2d.z<-pos2d.w || pos2d.x<-bounds || pos2d.x>bounds\n|| pos2d.y<-bounds || pos2d.y>bounds) {gl_Position=vec4(0.0,0.0,2.0,1.0);return;}\nmat3 Vrk=mat3(\ncovA.x,covA.y,covA.z,\ncovA.y,covB.x,covB.y,\ncovA.z,covB.y,covB.z\n);mat3 J=mat3(\nfocal.x/camspace.z,0.,-(focal.x*camspace.x)/(camspace.z*camspace.z),\n0.,focal.y/camspace.z,-(focal.y*camspace.y)/(camspace.z*camspace.z),\n0.,0.,0.\n);mat3 invy=mat3(1,0,0,0,-1,0,0,0,1);mat3 T=invy*transpose(mat3(modelView))*J;mat3 cov2d=transpose(T)*Vrk*T;float mid=(cov2d[0][0]+cov2d[1][1])/2.0;float radius=length(vec2((cov2d[0][0]-cov2d[1][1])/2.0,cov2d[0][1]));float lambda1=mid+radius,lambda2=mid-radius;if (lambda2<0.0) return;vec2 diagonalVector=normalize(vec2(cov2d[0][1],lambda1-cov2d[0][0]));vec2 majorAxis=min(sqrt(2.0*lambda1),1024.0)*diagonalVector;vec2 minorAxis=min(sqrt(2.0*lambda2),1024.0)*vec2(diagonalVector.y,-diagonalVector.x);vColor=color;vPosition=position;vec2 vCenter=vec2(pos2d);gl_Position=vec4(\nvCenter \n+ (position.x*majorAxis*1./viewport \n+ position.y*minorAxis*1./viewport)*pos2d.w,pos2d.zw);\n#include\n#include\n#include\n}\n`;\nY.ShadersStore[DO] = NO;\nclass FO extends es {\n /**\n * Constructor of the defines.\n */\n constructor() {\n super(), this.FOG = !1, this.THIN_INSTANCES = !0, this.LOGARITHMICDEPTH = !1, this.CLIPPLANE = !1, this.CLIPPLANE2 = !1, this.CLIPPLANE3 = !1, this.CLIPPLANE4 = !1, this.CLIPPLANE5 = !1, this.CLIPPLANE6 = !1, this.rebuild();\n }\n}\nclass So extends Uc {\n /**\n * Instantiates a Gaussian Splatting Material in the given scene\n * @param name The friendly name of the material\n * @param scene The scene to add the material to\n */\n constructor(e, t) {\n super(e, t), this.backFaceCulling = !1;\n }\n /**\n * Gets a boolean indicating that current material needs to register RTT\n */\n get hasRenderTargetTextures() {\n return !1;\n }\n /**\n * Specifies whether or not this material should be rendered in alpha test mode.\n * @returns false\n */\n needAlphaTesting() {\n return !1;\n }\n /**\n * Specifies whether or not this material should be rendered in alpha blend mode.\n * @returns true\n */\n needAlphaBlending() {\n return !0;\n }\n /**\n * Checks whether the material is ready to be rendered for a given mesh.\n * @param mesh The mesh to render\n * @param subMesh The submesh to check against\n * @returns true if all the dependencies are ready (Textures, Effects...)\n */\n isReadyForSubMesh(e, t) {\n const r = t._drawWrapper;\n if (r.effect && this.isFrozen && r._wasPreviouslyReady && r._wasPreviouslyUsingInstances === !0)\n return !0;\n t.materialDefines || (t.materialDefines = new FO());\n const s = this.getScene(), a = t.materialDefines;\n if (this._isReadyForSubMesh(t))\n return !0;\n const o = s.getEngine();\n if (cf(e, s, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, !1, a), hf(s, o, this, a, !0, null, !0), uf(e, a, !1, !1), a.isDirty) {\n a.markAsProcessed(), s.resetCachedMaterial();\n const l = [I.PositionKind, \"splatIndex\"];\n lf(l, a);\n const c = [\"world\", \"view\", \"projection\", \"vFogInfos\", \"vFogColor\", \"logarithmicDepthConstant\", \"viewport\", \"dataTextureSize\", \"focal\"], h = [\"covariancesATexture\", \"covariancesBTexture\", \"centersTexture\", \"colorsTexture\"], u = [\"Scene\", \"Mesh\"];\n ff({\n uniformsNames: c,\n uniformBuffersNames: u,\n samplers: h,\n defines: a\n }), Nc(c);\n const f = a.toString(), d = s.getEngine().createEffect(\"gaussianSplatting\", {\n attributes: l,\n uniformsNames: c,\n uniformBuffersNames: u,\n samplers: h,\n defines: f,\n onCompiled: this.onCompiled,\n onError: this.onError\n }, o);\n t.setEffect(d, a, this._materialContext);\n }\n return !t.effect || !t.effect.isReady() ? !1 : (a._renderId = s.getRenderId(), r._wasPreviouslyReady = !0, r._wasPreviouslyUsingInstances = !0, !0);\n }\n /**\n * Binds the submesh to this material by preparing the effect and shader to draw\n * @param world defines the world transformation matrix\n * @param mesh defines the mesh containing the submesh\n * @param subMesh defines the submesh to bind the material to\n */\n bindForSubMesh(e, t, i) {\n const r = this.getScene(), s = i.materialDefines;\n if (!s)\n return;\n const a = i.effect;\n if (!a)\n return;\n if (this._activeEffect = a, t.getMeshUniformBuffer().bindToEffect(a, \"Mesh\"), t.transferToEffect(e), this._mustRebind(r, a, i, t.visibility)) {\n this.bindView(a), this.bindViewProjection(a);\n const l = r.getEngine(), c = this.getScene().activeCamera, h = l.getRenderWidth(), u = l.getRenderHeight();\n this._activeEffect.setFloat2(\"viewport\", h, u);\n let f = 1e3;\n c && (c.fovMode == $e.FOVMODE_VERTICAL_FIXED ? f = u / 2 / Math.tan(c.fov / 2) : f = h / 2 / Math.tan(c.fov / 2)), this._activeEffect.setFloat2(\"focal\", f, f);\n const d = t;\n if (d.covariancesATexture) {\n const p = d.covariancesATexture.getSize();\n a.setFloat2(\"dataTextureSize\", p.width, p.height), a.setTexture(\"covariancesATexture\", d.covariancesATexture), a.setTexture(\"covariancesBTexture\", d.covariancesBTexture), a.setTexture(\"centersTexture\", d.centersTexture), a.setTexture(\"colorsTexture\", d.colorsTexture);\n }\n Fc(a, this, r);\n } else\n r.getEngine()._features.needToAlwaysBindUniformBuffers && (this._needToBindSceneUbo = !0);\n wc(r, t, a), this.useLogarithmicDepth && Lc(s, a, r), this._afterBind(t, this._activeEffect, i);\n }\n /**\n * Clones the material.\n * @param name The cloned name.\n * @returns The cloned material.\n */\n clone(e) {\n return Le.Clone(() => new So(e, this.getScene()), this);\n }\n /**\n * Serializes the current material to its JSON representation.\n * @returns The JSON representation.\n */\n serialize() {\n const e = super.serialize();\n return e.customType = \"BABYLON.GaussianSplattingMaterial\", e;\n }\n /**\n * Gets the class name of the material\n * @returns \"GaussianSplattingMaterial\"\n */\n getClassName() {\n return \"GaussianSplattingMaterial\";\n }\n /**\n * Parse a JSON input to create back a Gaussian Splatting material.\n * @param source The JSON data to parse\n * @param scene The scene to create the parsed material in\n * @param rootUrl The root url of the assets the material depends upon\n * @returns the instantiated GaussianSplattingMaterial.\n */\n static Parse(e, t, i) {\n return Le.Parse(() => new So(e.name, t), e, t, i);\n }\n}\nRe(\"BABYLON.GaussianSplattingMaterial\", So);\nclass lc extends B {\n /**\n * Gets the covariancesA texture\n */\n get covariancesATexture() {\n return this._covariancesATexture;\n }\n /**\n * Gets the covariancesB texture\n */\n get covariancesBTexture() {\n return this._covariancesBTexture;\n }\n /**\n * Gets the centers texture\n */\n get centersTexture() {\n return this._centersTexture;\n }\n /**\n * Gets the colors texture\n */\n get colorsTexture() {\n return this._colorsTexture;\n }\n /**\n * Creates a new gaussian splatting mesh\n * @param name defines the name of the mesh\n * @param url defines the url to load from (optional)\n * @param scene defines the hosting scene (optional)\n */\n constructor(e, t = null, i = null) {\n super(e, i), this._vertexCount = 0, this._worker = null, this._frameIdLastUpdate = -1, this._modelViewMatrix = w.Identity(), this._material = null, this._canPostToWorker = !0, this._covariancesATexture = null, this._covariancesBTexture = null, this._centersTexture = null, this._colorsTexture = null;\n const r = new re();\n r.positions = [-2, -2, 0, 2, -2, 0, 2, 2, 0, -2, 2, 0], r.indices = [0, 1, 2, 0, 2, 3], r.applyToMesh(this), this.subMeshes = [], new bi(0, 0, 4, 0, 6, this), this.doNotSyncBoundingInfo = !0, this.setEnabled(!1), this._lastProj = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], t && this.loadFileAsync(t);\n }\n /**\n * Returns the class name\n * @returns \"GaussianSplattingMesh\"\n */\n getClassName() {\n return \"GaussianSplattingMesh\";\n }\n /**\n * Returns the total number of vertices (splats) within the mesh\n * @returns the total number of vertices\n */\n getTotalVertices() {\n return this._vertexCount;\n }\n /**\n * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager\n * @param subMesh defines the subMesh to render\n * @param enableAlphaMode defines if alpha mode can be changed\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering\n * @returns the current mesh\n */\n render(e, t, i) {\n this.material || (this._material = new So(this.name + \"_material\", this._scene), this.material = this._material);\n const r = this.getScene().getFrameId();\n if (r !== this._frameIdLastUpdate && this._worker && this._scene.activeCamera && this._canPostToWorker) {\n this.getWorldMatrix().multiplyToRef(this._scene.activeCamera.getViewMatrix(), this._modelViewMatrix);\n const s = this._lastProj[2] * this._modelViewMatrix.m[2] + this._lastProj[6] * this._modelViewMatrix.m[6] + this._lastProj[10] * this._modelViewMatrix.m[10];\n Math.abs(s - 1) >= 0.01 && (this._frameIdLastUpdate = r, this._canPostToWorker = !1, this._lastProj = this._modelViewMatrix.m.slice(0), this._worker.postMessage({ view: this._modelViewMatrix.m, depthMix: this._depthMix }, [this._depthMix.buffer]));\n }\n return super.render(e, t, i);\n }\n /**\n * Code from https://github.com/dylanebert/gsplat.js/blob/main/src/loaders/PLYLoader.ts Under MIT license\n * Converts a .ply data array buffer to splat\n * if data array buffer is not ply, returns the original buffer\n * @param data the .ply data to load\n * @returns the loaded splat buffer\n */\n static ConvertPLYToSplat(e) {\n const t = new Uint8Array(e), i = new TextDecoder().decode(t.slice(0, 1024 * 10)), r = `end_header\n`, s = i.indexOf(r);\n if (s < 0 || !i)\n return e;\n const a = parseInt(/element vertex (\\d+)\\n/.exec(i)[1]);\n let o = 0;\n const l = {\n double: 8,\n int: 4,\n uint: 4,\n float: 4,\n short: 2,\n ushort: 2,\n uchar: 1\n }, c = [], h = i.slice(0, s).split(`\n`).filter((m) => m.startsWith(\"property \"));\n for (const m of h) {\n const [, v, E] = m.split(\" \");\n if (c.push({ name: E, type: v, offset: o }), l[v])\n o += l[v];\n else\n return ne.Error(`Unsupported property type: ${v}. Are you sure it's a valid Gaussian Splatting file?`), new ArrayBuffer(0);\n }\n const u = 3 * 4 + 3 * 4 + 4 + 4, f = 0.28209479177387814, d = new DataView(e, s + r.length), p = new ArrayBuffer(u * a), g = new Ce();\n for (let m = 0; m < a; m++) {\n const v = new Float32Array(p, m * u, 3), E = new Float32Array(p, m * u + 12, 3), C = new Uint8ClampedArray(p, m * u + 24, 4), T = new Uint8ClampedArray(p, m * u + 28, 4);\n let R = 255, x = 0, S = 0, M = 0;\n for (let N = 0; N < c.length; N++) {\n const F = c[N];\n let L;\n switch (F.type) {\n case \"float\":\n L = d.getFloat32(F.offset + m * o, !0);\n break;\n case \"int\":\n L = d.getInt32(F.offset + m * o, !0);\n break;\n default:\n throw new Error(`Unsupported property type: ${F.type}`);\n }\n switch (F.name) {\n case \"x\":\n v[0] = L;\n break;\n case \"y\":\n v[1] = L;\n break;\n case \"z\":\n v[2] = L;\n break;\n case \"scale_0\":\n E[0] = Math.exp(L);\n break;\n case \"scale_1\":\n E[1] = Math.exp(L);\n break;\n case \"scale_2\":\n E[2] = Math.exp(L);\n break;\n case \"red\":\n C[0] = L;\n break;\n case \"green\":\n C[1] = L;\n break;\n case \"blue\":\n C[2] = L;\n break;\n case \"f_dc_0\":\n C[0] = (0.5 + f * L) * 255;\n break;\n case \"f_dc_1\":\n C[1] = (0.5 + f * L) * 255;\n break;\n case \"f_dc_2\":\n C[2] = (0.5 + f * L) * 255;\n break;\n case \"f_dc_3\":\n C[3] = (0.5 + f * L) * 255;\n break;\n case \"opacity\":\n C[3] = 1 / (1 + Math.exp(-L)) * 255;\n break;\n case \"rot_0\":\n R = L;\n break;\n case \"rot_1\":\n x = L;\n break;\n case \"rot_2\":\n S = L;\n break;\n case \"rot_3\":\n M = L;\n break;\n }\n }\n g.set(x, S, M, R), g.normalize(), T[0] = g.w * 128 + 128, T[1] = g.x * 128 + 128, T[2] = g.y * 128 + 128, T[3] = g.z * 128 + 128;\n }\n return p;\n }\n /**\n * Loads a .splat Gaussian Splatting array buffer asynchronously\n * @param data arraybuffer containing splat file\n * @returns a promise that resolves when the operation is complete\n */\n loadDataAsync(e) {\n return Promise.resolve(this._loadData(e));\n }\n /**\n * Loads a .splat Gaussian or .ply Splatting file asynchronously\n * @param url path to the splat file to load\n * @returns a promise that resolves when the operation is complete\n */\n loadFileAsync(e) {\n return ge.LoadFileAsync(e, !0).then((t) => {\n this._loadData(lc.ConvertPLYToSplat(t));\n });\n }\n /**\n * Releases resources associated with this mesh.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n */\n dispose(e) {\n var t, i, r, s, a, o;\n (t = this._covariancesATexture) == null || t.dispose(), (i = this._covariancesBTexture) == null || i.dispose(), (r = this._centersTexture) == null || r.dispose(), (s = this._colorsTexture) == null || s.dispose(), this._covariancesATexture = null, this._covariancesBTexture = null, this._centersTexture = null, this._colorsTexture = null, (a = this._material) == null || a.dispose(!1, !0), this._material = null, (o = this._worker) == null || o.terminate(), this._worker = null, super.dispose(e);\n }\n _loadData(e) {\n var R;\n if (!e.byteLength)\n return;\n const t = new Uint8Array(e), i = new Float32Array(t.buffer), r = 3 * 4 + 3 * 4 + 4 + 4, s = t.length / r;\n this._vertexCount = s;\n const a = this._getTextureSize(s), o = a.x * a.y, l = new Float32Array(3 * o), c = new Float32Array(3 * o), h = new Float32Array(3 * o), u = z.Matrix[0], f = z.Matrix[1], d = z.Quaternion[0], p = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), g = new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n for (let x = 0; x < s; x++) {\n const S = i[8 * x + 0], M = -i[8 * x + 1], N = i[8 * x + 2];\n l[3 * x + 0] = S, l[3 * x + 1] = M, l[3 * x + 2] = N, p.minimizeInPlaceFromFloats(S, M, N), g.maximizeInPlaceFromFloats(S, M, N), d.set((t[32 * x + 28 + 1] - 128) / 128, (t[32 * x + 28 + 2] - 128) / 128, (t[32 * x + 28 + 3] - 128) / 128, -(t[32 * x + 28 + 0] - 128) / 128), d.toRotationMatrix(u), w.ScalingToRef(i[8 * x + 3 + 0] * 2, i[8 * x + 3 + 1] * 2, i[8 * x + 3 + 2] * 2, f);\n const F = u.multiplyToRef(f, z.Matrix[0]).m;\n c[x * 3 + 0] = F[0] * F[0] + F[1] * F[1] + F[2] * F[2], c[x * 3 + 1] = F[0] * F[4] + F[1] * F[5] + F[2] * F[6], c[x * 3 + 2] = F[0] * F[8] + F[1] * F[9] + F[2] * F[10], h[x * 3 + 0] = F[4] * F[4] + F[5] * F[5] + F[6] * F[6], h[x * 3 + 1] = F[4] * F[8] + F[5] * F[9] + F[6] * F[10], h[x * 3 + 2] = F[8] * F[8] + F[9] * F[9] + F[10] * F[10];\n }\n const m = this.getBoundingInfo();\n m.reConstruct(p, g, this.getWorldMatrix()), m.isLocked = !0, this.forcedInstanceCount = this._vertexCount, this.setEnabled(!0);\n const v = new Float32Array(this._vertexCount * 1);\n this.thinInstanceSetBuffer(\"splatIndex\", v, 1, !1);\n const E = (x, S, M, N) => new rr(x, S, M, N, this._scene, !1, !1, 2, 1), C = (x) => {\n const S = x.length / 3, M = new Float32Array(S * 4);\n for (let N = 0; N < S; ++N)\n M[N * 4 + 0] = x[N * 3 + 0], M[N * 4 + 1] = x[N * 3 + 1], M[N * 4 + 2] = x[N * 3 + 2], M[N * 4 + 3] = 1;\n return M;\n }, T = new Float32Array(a.x * a.y * 4);\n for (let x = 0; x < this._vertexCount; ++x)\n T[x * 4 + 0] = t[32 * x + 24 + 0] / 255, T[x * 4 + 1] = t[32 * x + 24 + 1] / 255, T[x * 4 + 2] = t[32 * x + 24 + 2] / 255, T[x * 4 + 3] = t[32 * x + 24 + 3] / 255;\n this._covariancesATexture = E(C(c), a.x, a.y, 5), this._covariancesBTexture = E(C(h), a.x, a.y, 5), this._centersTexture = E(C(l), a.x, a.y, 5), this._colorsTexture = E(T, a.x, a.y, 5), (R = this._worker) == null || R.terminate(), this._worker = new Worker(URL.createObjectURL(new Blob([\"(\", lc._CreateWorker.toString(), \")(self)\"], {\n type: \"application/javascript\"\n }))), this._depthMix = new BigInt64Array(s), this._worker.postMessage({ positions: l, vertexCount: s }, [l.buffer]), this._worker.onmessage = (x) => {\n this._depthMix = x.data.depthMix;\n const S = new Uint32Array(x.data.depthMix.buffer);\n for (let M = 0; M < this._vertexCount; M++)\n v[M] = S[2 * M];\n this.thinInstanceBufferUpdated(\"splatIndex\"), this._canPostToWorker = !0;\n };\n }\n _getTextureSize(e) {\n const t = this._scene.getEngine(), i = t.getCaps().maxTextureSize;\n let r = 1;\n if (t.webGLVersion === 1 && !t.isWebGPU)\n for (; i * r < e; )\n r *= 2;\n else\n r = Math.ceil(e / i);\n return r > i && (ne.Error(\"GaussianSplatting texture size: (\" + i + \", \" + r + \"), maxTextureSize: \" + i), r = i), new me(i, r);\n }\n}\nlc._CreateWorker = function(n) {\n let e = 0, t, i, r, s;\n n.onmessage = (a) => {\n if (a.data.positions)\n t = a.data.positions, e = a.data.vertexCount;\n else {\n const o = a.data.view;\n if (!t || !o)\n throw new Error(\"positions or view is not defined!\");\n i = a.data.depthMix, r = new Uint32Array(i.buffer), s = new Float32Array(i.buffer);\n for (let l = 0; l < e; l++)\n r[2 * l] = l;\n for (let l = 0; l < e; l++)\n s[2 * l + 1] = 1e4 - (o[2] * t[3 * l + 0] + o[6] * t[3 * l + 1] + o[10] * t[3 * l + 2]);\n i.sort(), n.postMessage({ depthMix: i }, [i.buffer]);\n }\n };\n};\nvar Zo = Array.isArray, aE = typeof global == \"object\" && global && global.Object === Object && global, LO = typeof self == \"object\" && self && self.Object === Object && self, kc = aE || LO || Function(\"return this\")(), Da = kc.Symbol, oE = Object.prototype, wO = oE.hasOwnProperty, UO = oE.toString, eo = Da ? Da.toStringTag : void 0;\nfunction VO(n) {\n var e = wO.call(n, eo), t = n[eo];\n try {\n n[eo] = void 0;\n var i = !0;\n } catch {\n }\n var r = UO.call(n);\n return i && (e ? n[eo] = t : delete n[eo]), r;\n}\nvar BO = Object.prototype, kO = BO.toString;\nfunction zO(n) {\n return kO.call(n);\n}\nvar WO = \"[object Null]\", GO = \"[object Undefined]\", xg = Da ? Da.toStringTag : void 0;\nfunction zc(n) {\n return n == null ? n === void 0 ? GO : WO : xg && xg in Object(n) ? VO(n) : zO(n);\n}\nfunction Wc(n) {\n return n != null && typeof n == \"object\";\n}\nvar XO = \"[object Symbol]\";\nfunction Pf(n) {\n return typeof n == \"symbol\" || Wc(n) && zc(n) == XO;\n}\nvar HO = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/, KO = /^\\w*$/;\nfunction qO(n, e) {\n if (Zo(n))\n return !1;\n var t = typeof n;\n return t == \"number\" || t == \"symbol\" || t == \"boolean\" || n == null || Pf(n) ? !0 : KO.test(n) || !HO.test(n) || e != null && n in Object(e);\n}\nfunction yo(n) {\n var e = typeof n;\n return n != null && (e == \"object\" || e == \"function\");\n}\nvar YO = \"[object AsyncFunction]\", ZO = \"[object Function]\", jO = \"[object GeneratorFunction]\", QO = \"[object Proxy]\";\nfunction lE(n) {\n if (!yo(n))\n return !1;\n var e = zc(n);\n return e == ZO || e == jO || e == YO || e == QO;\n}\nvar Hh = kc[\"__core-js_shared__\"], Cg = function() {\n var n = /[^.]+$/.exec(Hh && Hh.keys && Hh.keys.IE_PROTO || \"\");\n return n ? \"Symbol(src)_1.\" + n : \"\";\n}();\nfunction JO(n) {\n return !!Cg && Cg in n;\n}\nvar $O = Function.prototype, eD = $O.toString;\nfunction tD(n) {\n if (n != null) {\n try {\n return eD.call(n);\n } catch {\n }\n try {\n return n + \"\";\n } catch {\n }\n }\n return \"\";\n}\nvar iD = /[\\\\^$.*+?()[\\]{}|]/g, rD = /^\\[object .+?Constructor\\]$/, sD = Function.prototype, nD = Object.prototype, aD = sD.toString, oD = nD.hasOwnProperty, lD = RegExp(\n \"^\" + aD.call(oD).replace(iD, \"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, \"$1.*?\") + \"$\"\n);\nfunction cD(n) {\n if (!yo(n) || JO(n))\n return !1;\n var e = lE(n) ? lD : rD;\n return e.test(tD(n));\n}\nfunction hD(n, e) {\n return n == null ? void 0 : n[e];\n}\nfunction Of(n, e) {\n var t = hD(n, e);\n return cD(t) ? t : void 0;\n}\nvar Io = Of(Object, \"create\");\nfunction uD() {\n this.__data__ = Io ? Io(null) : {}, this.size = 0;\n}\nfunction fD(n) {\n var e = this.has(n) && delete this.__data__[n];\n return this.size -= e ? 1 : 0, e;\n}\nvar dD = \"__lodash_hash_undefined__\", pD = Object.prototype, gD = pD.hasOwnProperty;\nfunction mD(n) {\n var e = this.__data__;\n if (Io) {\n var t = e[n];\n return t === dD ? void 0 : t;\n }\n return gD.call(e, n) ? e[n] : void 0;\n}\nvar _D = Object.prototype, ED = _D.hasOwnProperty;\nfunction vD(n) {\n var e = this.__data__;\n return Io ? e[n] !== void 0 : ED.call(e, n);\n}\nvar TD = \"__lodash_hash_undefined__\";\nfunction xD(n, e) {\n var t = this.__data__;\n return this.size += this.has(n) ? 0 : 1, t[n] = Io && e === void 0 ? TD : e, this;\n}\nfunction Fn(n) {\n var e = -1, t = n == null ? 0 : n.length;\n for (this.clear(); ++e < t; ) {\n var i = n[e];\n this.set(i[0], i[1]);\n }\n}\nFn.prototype.clear = uD;\nFn.prototype.delete = fD;\nFn.prototype.get = mD;\nFn.prototype.has = vD;\nFn.prototype.set = xD;\nfunction CD() {\n this.__data__ = [], this.size = 0;\n}\nfunction Df(n, e) {\n return n === e || n !== n && e !== e;\n}\nfunction Gc(n, e) {\n for (var t = n.length; t--; )\n if (Df(n[t][0], e))\n return t;\n return -1;\n}\nvar RD = Array.prototype, SD = RD.splice;\nfunction yD(n) {\n var e = this.__data__, t = Gc(e, n);\n if (t < 0)\n return !1;\n var i = e.length - 1;\n return t == i ? e.pop() : SD.call(e, t, 1), --this.size, !0;\n}\nfunction ID(n) {\n var e = this.__data__, t = Gc(e, n);\n return t < 0 ? void 0 : e[t][1];\n}\nfunction bD(n) {\n return Gc(this.__data__, n) > -1;\n}\nfunction AD(n, e) {\n var t = this.__data__, i = Gc(t, n);\n return i < 0 ? (++this.size, t.push([n, e])) : t[i][1] = e, this;\n}\nfunction Ga(n) {\n var e = -1, t = n == null ? 0 : n.length;\n for (this.clear(); ++e < t; ) {\n var i = n[e];\n this.set(i[0], i[1]);\n }\n}\nGa.prototype.clear = CD;\nGa.prototype.delete = yD;\nGa.prototype.get = ID;\nGa.prototype.has = bD;\nGa.prototype.set = AD;\nvar MD = Of(kc, \"Map\");\nfunction PD() {\n this.size = 0, this.__data__ = {\n hash: new Fn(),\n map: new (MD || Ga)(),\n string: new Fn()\n };\n}\nfunction OD(n) {\n var e = typeof n;\n return e == \"string\" || e == \"number\" || e == \"symbol\" || e == \"boolean\" ? n !== \"__proto__\" : n === null;\n}\nfunction Xc(n, e) {\n var t = n.__data__;\n return OD(e) ? t[typeof e == \"string\" ? \"string\" : \"hash\"] : t.map;\n}\nfunction DD(n) {\n var e = Xc(this, n).delete(n);\n return this.size -= e ? 1 : 0, e;\n}\nfunction ND(n) {\n return Xc(this, n).get(n);\n}\nfunction FD(n) {\n return Xc(this, n).has(n);\n}\nfunction LD(n, e) {\n var t = Xc(this, n), i = t.size;\n return t.set(n, e), this.size += t.size == i ? 0 : 1, this;\n}\nfunction Un(n) {\n var e = -1, t = n == null ? 0 : n.length;\n for (this.clear(); ++e < t; ) {\n var i = n[e];\n this.set(i[0], i[1]);\n }\n}\nUn.prototype.clear = PD;\nUn.prototype.delete = DD;\nUn.prototype.get = ND;\nUn.prototype.has = FD;\nUn.prototype.set = LD;\nvar wD = \"Expected a function\";\nfunction Nf(n, e) {\n if (typeof n != \"function\" || e != null && typeof e != \"function\")\n throw new TypeError(wD);\n var t = function() {\n var i = arguments, r = e ? e.apply(this, i) : i[0], s = t.cache;\n if (s.has(r))\n return s.get(r);\n var a = n.apply(this, i);\n return t.cache = s.set(r, a) || s, a;\n };\n return t.cache = new (Nf.Cache || Un)(), t;\n}\nNf.Cache = Un;\nvar UD = 500;\nfunction VD(n) {\n var e = Nf(n, function(i) {\n return t.size === UD && t.clear(), i;\n }), t = e.cache;\n return e;\n}\nvar BD = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g, kD = /\\\\(\\\\)?/g, zD = VD(function(n) {\n var e = [];\n return n.charCodeAt(0) === 46 && e.push(\"\"), n.replace(BD, function(t, i, r, s) {\n e.push(r ? s.replace(kD, \"$1\") : i || t);\n }), e;\n});\nfunction WD(n, e) {\n for (var t = -1, i = n == null ? 0 : n.length, r = Array(i); ++t < i; )\n r[t] = e(n[t], t, n);\n return r;\n}\nvar GD = 1 / 0, Rg = Da ? Da.prototype : void 0, Sg = Rg ? Rg.toString : void 0;\nfunction cE(n) {\n if (typeof n == \"string\")\n return n;\n if (Zo(n))\n return WD(n, cE) + \"\";\n if (Pf(n))\n return Sg ? Sg.call(n) : \"\";\n var e = n + \"\";\n return e == \"0\" && 1 / n == -GD ? \"-0\" : e;\n}\nfunction XD(n) {\n return n == null ? \"\" : cE(n);\n}\nfunction Ff(n, e) {\n return Zo(n) ? n : qO(n, e) ? [n] : zD(XD(n));\n}\nvar HD = 1 / 0;\nfunction Lf(n) {\n if (typeof n == \"string\" || Pf(n))\n return n;\n var e = n + \"\";\n return e == \"0\" && 1 / n == -HD ? \"-0\" : e;\n}\nfunction KD(n, e) {\n e = Ff(e, n);\n for (var t = 0, i = e.length; n != null && t < i; )\n n = n[Lf(e[t++])];\n return t && t == i ? n : void 0;\n}\nfunction hE(n, e, t) {\n var i = n == null ? void 0 : KD(n, e);\n return i === void 0 ? t : i;\n}\nfunction qD(n) {\n let e = [];\n return this.selected.forEach((t, i) => {\n t instanceof He ? e.push({ node: t, value: hE(t, n) }) : console.log(\"Node not a mesh, skipping.\");\n }), e;\n}\nvar yg;\n(function(n) {\n n[n.Clean = 0] = \"Clean\", n[n.Stop = 1] = \"Stop\", n[n.Sync = 2] = \"Sync\", n[n.NoSync = 3] = \"NoSync\";\n})(yg || (yg = {}));\nnew he();\nDe.prototype._createDepthStencilCubeTexture = function(n, e) {\n const t = new ar(this, Dt.DepthStencil);\n if (t.isCube = !0, this.webGLVersion === 1)\n return ne.Error(\"Depth cube texture is not supported by WebGL 1.\"), t;\n const i = {\n bilinearFiltering: !1,\n comparisonFunction: 0,\n generateStencil: !1,\n ...e\n }, r = this._gl;\n this._bindTextureDirectly(r.TEXTURE_CUBE_MAP, t, !0), this._setupDepthStencilTexture(t, n, i.generateStencil, i.bilinearFiltering, i.comparisonFunction);\n for (let s = 0; s < 6; s++)\n i.generateStencil ? r.texImage2D(r.TEXTURE_CUBE_MAP_POSITIVE_X + s, 0, r.DEPTH24_STENCIL8, n, n, 0, r.DEPTH_STENCIL, r.UNSIGNED_INT_24_8, null) : r.texImage2D(r.TEXTURE_CUBE_MAP_POSITIVE_X + s, 0, r.DEPTH_COMPONENT24, n, n, 0, r.DEPTH_COMPONENT, r.UNSIGNED_INT, null);\n return this._bindTextureDirectly(r.TEXTURE_CUBE_MAP, null), this._internalTexturesCache.push(t), t;\n};\nDe.prototype._partialLoadFile = function(n, e, t, i, r = null) {\n const s = (o) => {\n t[e] = o, t._internalCount++, t._internalCount === 6 && i(t);\n }, a = (o, l) => {\n r && o && r(o.status + \" \" + o.statusText, l);\n };\n this._loadFile(n, s, void 0, void 0, !0, a);\n};\nDe.prototype._cascadeLoadFiles = function(n, e, t, i = null) {\n const r = [];\n r._internalCount = 0;\n for (let s = 0; s < 6; s++)\n this._partialLoadFile(t[s], s, r, e, i);\n};\nDe.prototype._cascadeLoadImgs = function(n, e, t, i, r = null, s) {\n const a = [];\n a._internalCount = 0;\n for (let o = 0; o < 6; o++)\n this._partialLoadImg(i[o], o, a, n, e, t, r, s);\n};\nDe.prototype._partialLoadImg = function(n, e, t, i, r, s, a = null, o) {\n const l = tf();\n Go(n, (u) => {\n t[e] = u, t._internalCount++, i && i.removePendingData(l), t._internalCount === 6 && s && s(r, t);\n }, (u, f) => {\n i && i.removePendingData(l), a && a(u, f);\n }, i ? i.offlineProvider : null, o), i && i.addPendingData(l);\n};\nDe.prototype._setCubeMapTextureParams = function(n, e, t) {\n const i = this._gl;\n i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_MAG_FILTER, i.LINEAR), i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_MIN_FILTER, e ? i.LINEAR_MIPMAP_LINEAR : i.LINEAR), i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_WRAP_S, i.CLAMP_TO_EDGE), i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_WRAP_T, i.CLAMP_TO_EDGE), n.samplingMode = e ? 3 : 2, e && this.getCaps().textureMaxLevel && t !== void 0 && t > 0 && (i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_MAX_LEVEL, t), n._maxLodLevel = t), this._bindTextureDirectly(i.TEXTURE_CUBE_MAP, null);\n};\nDe.prototype.createCubeTextureBase = function(n, e, t, i, r = null, s = null, a, o = null, l = !1, c = 0, h = 0, u = null, f = null, d = null, p = !1) {\n const g = u || new ar(this, Dt.Cube);\n g.isCube = !0, g.url = n, g.generateMipMaps = !i, g._lodGenerationScale = c, g._lodGenerationOffset = h, g._useSRGBBuffer = !!p && this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU || !!i), g !== u && (g.label = n.substring(0, 60)), this._doNotHandleContextLost || (g._extension = o, g._files = t);\n const m = n;\n this._transformTextureUrl && !u && (n = this._transformTextureUrl(n));\n const v = n.split(\"?\")[0], E = v.lastIndexOf(\".\"), C = o || (E > -1 ? v.substring(E).toLowerCase() : \"\");\n let T = null;\n for (const x of De._TextureLoaders)\n if (x.canLoad(C)) {\n T = x;\n break;\n }\n const R = (x, S) => {\n n === m ? s && x && s(x.status + \" \" + x.statusText, S) : (ne.Warn(`Failed to load ${n}, falling back to the ${m}`), this.createCubeTextureBase(m, e, t, !!i, r, s, a, o, l, c, h, g, f, d, p));\n };\n if (T) {\n const x = (S) => {\n f && f(g, S), T.loadCubeData(S, g, l, r, s);\n };\n t && t.length === 6 ? T.supportCascades ? this._cascadeLoadFiles(e, (S) => x(S.map((M) => new Uint8Array(M))), t, s) : s ? s(\"Textures type does not support cascades.\") : ne.Warn(\"Texture loader does not support cascades.\") : this._loadFile(n, (S) => x(new Uint8Array(S)), void 0, void 0, !0, R);\n } else {\n if (!t || t.length === 0)\n throw new Error(\"Cannot load cubemap because files were not defined, or the correct loader was not found.\");\n this._cascadeLoadImgs(e, g, (x, S) => {\n d && d(x, S);\n }, t, s);\n }\n return this._internalTexturesCache.push(g), g;\n};\nDe.prototype.createCubeTexture = function(n, e, t, i, r = null, s = null, a, o = null, l = !1, c = 0, h = 0, u = null, f, d = !1) {\n const p = this._gl;\n return this.createCubeTextureBase(n, e, t, !!i, r, s, a, o, l, c, h, u, (g) => this._bindTextureDirectly(p.TEXTURE_CUBE_MAP, g, !0), (g, m) => {\n const v = this.needPOTTextures ? De.GetExponentOfTwo(m[0].width, this._caps.maxCubemapTextureSize) : m[0].width, E = v, C = [\n p.TEXTURE_CUBE_MAP_POSITIVE_X,\n p.TEXTURE_CUBE_MAP_POSITIVE_Y,\n p.TEXTURE_CUBE_MAP_POSITIVE_Z,\n p.TEXTURE_CUBE_MAP_NEGATIVE_X,\n p.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n p.TEXTURE_CUBE_MAP_NEGATIVE_Z\n ];\n this._bindTextureDirectly(p.TEXTURE_CUBE_MAP, g, !0), this._unpackFlipY(!1);\n const T = a ? this._getInternalFormat(a, g._useSRGBBuffer) : g._useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : p.RGBA;\n let R = a ? this._getInternalFormat(a) : p.RGBA;\n g._useSRGBBuffer && this.webGLVersion === 1 && (R = T);\n for (let x = 0; x < C.length; x++)\n if (m[x].width !== v || m[x].height !== E) {\n if (this._prepareWorkingCanvas(), !this._workingCanvas || !this._workingContext) {\n ne.Warn(\"Cannot create canvas to resize texture.\");\n return;\n }\n this._workingCanvas.width = v, this._workingCanvas.height = E, this._workingContext.drawImage(m[x], 0, 0, m[x].width, m[x].height, 0, 0, v, E), p.texImage2D(C[x], 0, T, R, p.UNSIGNED_BYTE, this._workingCanvas);\n } else\n p.texImage2D(C[x], 0, T, R, p.UNSIGNED_BYTE, m[x]);\n i || p.generateMipmap(p.TEXTURE_CUBE_MAP), this._setCubeMapTextureParams(g, !i), g.width = v, g.height = E, g.isReady = !0, a && (g.format = a), g.onLoadedObservable.notifyObservers(g), g.onLoadedObservable.clear(), r && r();\n }, !!d);\n};\nclass Qi extends It {\n /**\n * Gets or sets the size of the bounding box associated with the cube texture\n * When defined, the cubemap will switch to local mode\n * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity\n * @example https://www.babylonjs-playground.com/#RNASML\n */\n set boundingBoxSize(e) {\n if (this._boundingBoxSize && this._boundingBoxSize.equals(e))\n return;\n this._boundingBoxSize = e;\n const t = this.getScene();\n t && t.markAllMaterialsAsDirty(1);\n }\n /**\n * Returns the bounding box size\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#using-local-cubemap-mode\n */\n get boundingBoxSize() {\n return this._boundingBoxSize;\n }\n /**\n * Sets texture matrix rotation angle around Y axis in radians.\n */\n set rotationY(e) {\n this._rotationY = e, this.setReflectionTextureMatrix(w.RotationY(this._rotationY));\n }\n /**\n * Gets texture matrix rotation angle around Y axis radians.\n */\n get rotationY() {\n return this._rotationY;\n }\n /**\n * Are mip maps generated for this texture or not.\n */\n get noMipmap() {\n return this._noMipmap;\n }\n /**\n * Gets the forced extension (if any)\n */\n get forcedExtension() {\n return this._forcedExtension;\n }\n /**\n * Creates a cube texture from an array of image urls\n * @param files defines an array of image urls\n * @param scene defines the hosting scene\n * @param noMipmap specifies if mip maps are not used\n * @returns a cube texture\n */\n static CreateFromImages(e, t, i) {\n let r = \"\";\n return e.forEach((s) => r += s), new Qi(r, t, null, i, e);\n }\n /**\n * Creates and return a texture created from prefilterd data by tools like IBL Baker or Lys.\n * @param url defines the url of the prefiltered texture\n * @param scene defines the scene the texture is attached to\n * @param forcedExtension defines the extension of the file if different from the url\n * @param createPolynomials defines whether or not to create polynomial harmonics from the texture data if necessary\n * @returns the prefiltered texture\n */\n static CreateFromPrefilteredData(e, t, i = null, r = !0) {\n const s = t.useDelayedTextureLoading;\n t.useDelayedTextureLoading = !1;\n const a = new Qi(e, t, null, !1, null, null, null, void 0, !0, i, r);\n return t.useDelayedTextureLoading = s, a;\n }\n /**\n * Creates a cube texture to use with reflection for instance. It can be based upon dds or six images as well\n * as prefiltered data.\n * @param rootUrl defines the url of the texture or the root name of the six images\n * @param sceneOrEngine defines the scene or engine the texture is attached to\n * @param extensions defines the suffixes add to the picture name in case six images are in use like _px.jpg...\n * @param noMipmap defines if mipmaps should be created or not\n * @param files defines the six files to load for the different faces in that order: px, py, pz, nx, ny, nz\n * @param onLoad defines a callback triggered at the end of the file load if no errors occurred\n * @param onError defines a callback triggered in case of error during load\n * @param format defines the internal format to use for the texture once loaded\n * @param prefiltered defines whether or not the texture is created from prefiltered data\n * @param forcedExtension defines the extensions to use (force a special type of file to load) in case it is different from the file name\n * @param createPolynomials defines whether or not to create polynomial harmonics from the texture data if necessary\n * @param lodScale defines the scale applied to environment texture. This manages the range of LOD level used for IBL according to the roughness\n * @param lodOffset defines the offset applied to environment texture. This manages first LOD level used for IBL according to the roughness\n * @param loaderOptions options to be passed to the loader\n * @param useSRGBBuffer Defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU) (default: false)\n * @returns the cube texture\n */\n constructor(e, t, i = null, r = !1, s = null, a = null, o = null, l = 5, c = !1, h = null, u = !1, f = 0.8, d = 0, p, g) {\n var m;\n super(t), this._lodScale = 0.8, this._lodOffset = 0, this.onLoadObservable = new he(), this.boundingBoxPosition = _.Zero(), this._rotationY = 0, this._files = null, this._forcedExtension = null, this._extensions = null, this._textureMatrixRefraction = new w(), this.name = e, this.url = e, this._noMipmap = r, this.hasAlpha = !1, this._format = l, this.isCube = !0, this._textureMatrix = w.Identity(), this._createPolynomials = u, this.coordinatesMode = le.CUBIC_MODE, this._extensions = i, this._files = s, this._forcedExtension = h, this._loaderOptions = p, this._useSRGBBuffer = g, this._lodScale = f, this._lodOffset = d, !(!e && !s) && this.updateURL(e, h, a, c, o, i, (m = this.getScene()) == null ? void 0 : m.useDelayedTextureLoading, s);\n }\n /**\n * Get the current class name of the texture useful for serialization or dynamic coding.\n * @returns \"CubeTexture\"\n */\n getClassName() {\n return \"CubeTexture\";\n }\n /**\n * Update the url (and optional buffer) of this texture if url was null during construction.\n * @param url the url of the texture\n * @param forcedExtension defines the extension to use\n * @param onLoad callback called when the texture is loaded (defaults to null)\n * @param prefiltered Defines whether the updated texture is prefiltered or not\n * @param onError callback called if there was an error during the loading process (defaults to null)\n * @param extensions defines the suffixes add to the picture name in case six images are in use like _px.jpg...\n * @param delayLoad defines if the texture should be loaded now (false by default)\n * @param files defines the six files to load for the different faces in that order: px, py, pz, nx, ny, nz\n */\n updateURL(e, t, i = null, r = !1, s = null, a = null, o = !1, l = null) {\n (!this.name || this.name.startsWith(\"data:\")) && (this.name = e), this.url = e, t && (this._forcedExtension = t);\n const c = e.lastIndexOf(\".\"), h = t || (c > -1 ? e.substring(c).toLowerCase() : \"\"), u = h.indexOf(\".dds\") === 0, f = h.indexOf(\".env\") === 0, d = h.indexOf(\".basis\") === 0;\n if (f ? (this.gammaSpace = !1, this._prefiltered = !1, this.anisotropicFilteringLevel = 1) : (this._prefiltered = r, r && (this.gammaSpace = !1, this.anisotropicFilteringLevel = 1)), l)\n this._files = l;\n else if (!d && !f && !u && !a && (a = [\"_px.jpg\", \"_py.jpg\", \"_pz.jpg\", \"_nx.jpg\", \"_ny.jpg\", \"_nz.jpg\"]), this._files = this._files || [], this._files.length = 0, a) {\n for (let p = 0; p < a.length; p++)\n this._files.push(e + a[p]);\n this._extensions = a;\n }\n o ? (this.delayLoadState = 4, this._delayedOnLoad = i, this._delayedOnError = s) : this._loadTexture(i, s);\n }\n /**\n * Delays loading of the cube texture\n * @param forcedExtension defines the extension to use\n */\n delayLoad(e) {\n this.delayLoadState === 4 && (e && (this._forcedExtension = e), this.delayLoadState = 1, this._loadTexture(this._delayedOnLoad, this._delayedOnError));\n }\n /**\n * Returns the reflection texture matrix\n * @returns the reflection texture matrix\n */\n getReflectionTextureMatrix() {\n return this._textureMatrix;\n }\n /**\n * Sets the reflection texture matrix\n * @param value Reflection texture matrix\n */\n setReflectionTextureMatrix(e) {\n var s, a;\n if (e.updateFlag === this._textureMatrix.updateFlag || (e.isIdentity() !== this._textureMatrix.isIdentity() && ((s = this.getScene()) == null || s.markAllMaterialsAsDirty(1, (o) => o.getActiveTextures().indexOf(this) !== -1)), this._textureMatrix = e, !((a = this.getScene()) != null && a.useRightHandedSystem)))\n return;\n const t = z.Vector3[0], i = z.Quaternion[0], r = z.Vector3[1];\n this._textureMatrix.decompose(t, i, r), i.z *= -1, i.w *= -1, w.ComposeToRef(t, i, r, this._textureMatrixRefraction);\n }\n /**\n * Gets a suitable rotate/transform matrix when the texture is used for refraction.\n * There's a separate function from getReflectionTextureMatrix because refraction requires a special configuration of the matrix in right-handed mode.\n * @returns The refraction matrix\n */\n getRefractionTextureMatrix() {\n var e;\n return (e = this.getScene()) != null && e.useRightHandedSystem ? this._textureMatrixRefraction : this._textureMatrix;\n }\n _loadTexture(e = null, t = null) {\n var o;\n const i = this.getScene(), r = this._texture;\n this._texture = this._getFromCache(this.url, this._noMipmap, void 0, void 0, this._useSRGBBuffer, this.isCube);\n const s = () => {\n var l;\n this.onLoadObservable.notifyObservers(this), r && (r.dispose(), (l = this.getScene()) == null || l.markAllMaterialsAsDirty(1)), e && e();\n }, a = (l, c) => {\n this._loadingError = !0, this._errorObject = { message: l, exception: c }, t && t(l, c), le.OnTextureLoadErrorObservable.notifyObservers(this);\n };\n this._texture ? this._texture.isReady ? ge.SetImmediate(() => s()) : this._texture.onLoadedObservable.add(() => s()) : (this._prefiltered ? this._texture = this._getEngine().createPrefilteredCubeTexture(this.url, i, this._lodScale, this._lodOffset, e, a, this._format, this._forcedExtension, this._createPolynomials) : this._texture = this._getEngine().createCubeTexture(this.url, i, this._files, this._noMipmap, e, a, this._format, this._forcedExtension, !1, this._lodScale, this._lodOffset, null, this._loaderOptions, !!this._useSRGBBuffer), (o = this._texture) == null || o.onLoadedObservable.add(() => this.onLoadObservable.notifyObservers(this)));\n }\n /**\n * Parses text to create a cube texture\n * @param parsedTexture define the serialized text to read from\n * @param scene defines the hosting scene\n * @param rootUrl defines the root url of the cube texture\n * @returns a cube texture\n */\n static Parse(e, t, i) {\n const r = Le.Parse(() => {\n let s = !1;\n return e.prefiltered && (s = e.prefiltered), new Qi(i + (e.url ?? e.name), t, e.extensions, !1, e.files || null, null, null, void 0, s, e.forcedExtension);\n }, e, t);\n if (e.boundingBoxPosition && (r.boundingBoxPosition = _.FromArray(e.boundingBoxPosition)), e.boundingBoxSize && (r.boundingBoxSize = _.FromArray(e.boundingBoxSize)), e.animations)\n for (let s = 0; s < e.animations.length; s++) {\n const a = e.animations[s], o = mr(\"BABYLON.Animation\");\n o && r.animations.push(o.Parse(a));\n }\n return r;\n }\n /**\n * Makes a clone, or deep copy, of the cube texture\n * @returns a new cube texture\n */\n clone() {\n let e = 0;\n const t = Le.Clone(() => {\n const i = new Qi(this.url, this.getScene() || this._getEngine(), this._extensions, this._noMipmap, this._files);\n return e = i.uniqueId, i;\n }, this);\n return t.uniqueId = e, t;\n }\n}\nP([\n U()\n], Qi.prototype, \"url\", void 0);\nP([\n cn()\n], Qi.prototype, \"boundingBoxPosition\", void 0);\nP([\n cn()\n], Qi.prototype, \"boundingBoxSize\", null);\nP([\n U(\"rotationY\")\n], Qi.prototype, \"rotationY\", null);\nP([\n U(\"files\")\n], Qi.prototype, \"_files\", void 0);\nP([\n U(\"forcedExtension\")\n], Qi.prototype, \"_forcedExtension\", void 0);\nP([\n U(\"extensions\")\n], Qi.prototype, \"_extensions\", void 0);\nP([\n K_(\"textureMatrix\")\n], Qi.prototype, \"_textureMatrix\", void 0);\nP([\n K_(\"textureMatrixRefraction\")\n], Qi.prototype, \"_textureMatrixRefraction\", void 0);\nle._CubeTextureParser = Qi.Parse;\nRe(\"BABYLON.CubeTexture\", Qi);\nclass un {\n /**\n * Converts a panorama stored in RGB right to left up to down format into a cubemap (6 faces).\n *\n * @param float32Array The source data.\n * @param inputWidth The width of the input panorama.\n * @param inputHeight The height of the input panorama.\n * @param size The willing size of the generated cubemap (each faces will be size * size pixels)\n * @param supersample enable supersampling the cubemap\n * @returns The cubemap data\n */\n static ConvertPanoramaToCubemap(e, t, i, r, s = !1) {\n if (!e)\n throw \"ConvertPanoramaToCubemap: input cannot be null\";\n if (e.length != t * i * 3)\n throw \"ConvertPanoramaToCubemap: input size is wrong\";\n const a = this.CreateCubemapTexture(r, this.FACE_FRONT, e, t, i, s), o = this.CreateCubemapTexture(r, this.FACE_BACK, e, t, i, s), l = this.CreateCubemapTexture(r, this.FACE_LEFT, e, t, i, s), c = this.CreateCubemapTexture(r, this.FACE_RIGHT, e, t, i, s), h = this.CreateCubemapTexture(r, this.FACE_UP, e, t, i, s), u = this.CreateCubemapTexture(r, this.FACE_DOWN, e, t, i, s);\n return {\n front: a,\n back: o,\n left: l,\n right: c,\n up: h,\n down: u,\n size: r,\n type: 1,\n format: 4,\n gammaSpace: !1\n };\n }\n static CreateCubemapTexture(e, t, i, r, s, a = !1) {\n const o = new ArrayBuffer(e * e * 4 * 3), l = new Float32Array(o), c = a ? Math.max(1, Math.round(r / 4 / e)) : 1, h = 1 / c, u = h * h, f = t[1].subtract(t[0]).scale(h / e), d = t[3].subtract(t[2]).scale(h / e), p = 1 / e;\n let g = 0;\n for (let m = 0; m < e; m++)\n for (let v = 0; v < c; v++) {\n let E = t[0], C = t[2];\n for (let T = 0; T < e; T++)\n for (let R = 0; R < c; R++) {\n const x = C.subtract(E).scale(g).add(E);\n x.normalize();\n const S = this.CalcProjectionSpherical(x, i, r, s);\n l[m * e * 3 + T * 3 + 0] += S.r * u, l[m * e * 3 + T * 3 + 1] += S.g * u, l[m * e * 3 + T * 3 + 2] += S.b * u, E = E.add(f), C = C.add(d);\n }\n g += p * h;\n }\n return l;\n }\n static CalcProjectionSpherical(e, t, i, r) {\n let s = Math.atan2(e.z, e.x);\n const a = Math.acos(e.y);\n for (; s < -Math.PI; )\n s += 2 * Math.PI;\n for (; s > Math.PI; )\n s -= 2 * Math.PI;\n let o = s / Math.PI;\n const l = a / Math.PI;\n o = o * 0.5 + 0.5;\n let c = Math.round(o * i);\n c < 0 ? c = 0 : c >= i && (c = i - 1);\n let h = Math.round(l * r);\n h < 0 ? h = 0 : h >= r && (h = r - 1);\n const u = r - h - 1, f = t[u * i * 3 + c * 3 + 0], d = t[u * i * 3 + c * 3 + 1], p = t[u * i * 3 + c * 3 + 2];\n return {\n r: f,\n g: d,\n b: p\n };\n }\n}\nun.FACE_LEFT = [new _(-1, -1, -1), new _(1, -1, -1), new _(-1, 1, -1), new _(1, 1, -1)];\nun.FACE_RIGHT = [new _(1, -1, 1), new _(-1, -1, 1), new _(1, 1, 1), new _(-1, 1, 1)];\nun.FACE_FRONT = [new _(1, -1, -1), new _(1, -1, 1), new _(1, 1, -1), new _(1, 1, 1)];\nun.FACE_BACK = [new _(-1, -1, 1), new _(-1, -1, -1), new _(-1, 1, 1), new _(-1, 1, -1)];\nun.FACE_DOWN = [new _(1, 1, -1), new _(1, 1, 1), new _(-1, 1, -1), new _(-1, 1, 1)];\nun.FACE_UP = [new _(-1, -1, -1), new _(-1, -1, 1), new _(1, -1, -1), new _(1, -1, 1)];\nclass YD {\n static _Ldexp(e, t) {\n return t > 1023 ? e * Math.pow(2, 1023) * Math.pow(2, t - 1023) : t < -1074 ? e * Math.pow(2, -1074) * Math.pow(2, t + 1074) : e * Math.pow(2, t);\n }\n static _Rgbe2float(e, t, i, r, s, a) {\n s > 0 ? (s = this._Ldexp(1, s - 136), e[a + 0] = t * s, e[a + 1] = i * s, e[a + 2] = r * s) : (e[a + 0] = 0, e[a + 1] = 0, e[a + 2] = 0);\n }\n static _ReadStringLine(e, t) {\n let i = \"\", r = \"\";\n for (let s = t; s < e.length - t && (r = String.fromCharCode(e[s]), r != `\n`); s++)\n i += r;\n return i;\n }\n /**\n * Reads header information from an RGBE texture stored in a native array.\n * More information on this format are available here:\n * https://en.wikipedia.org/wiki/RGBE_image_format\n *\n * @param uint8array The binary file stored in native array.\n * @returns The header information.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static RGBE_ReadHeader(e) {\n let t = 0, i = 0, r = this._ReadStringLine(e, 0);\n if (r[0] != \"#\" || r[1] != \"?\")\n throw \"Bad HDR Format.\";\n let s = !1, a = !1, o = 0;\n do\n o += r.length + 1, r = this._ReadStringLine(e, o), r == \"FORMAT=32-bit_rle_rgbe\" ? a = !0 : r.length == 0 && (s = !0);\n while (!s);\n if (!a)\n throw \"HDR Bad header format, unsupported FORMAT\";\n o += r.length + 1, r = this._ReadStringLine(e, o);\n const c = /^-Y (.*) \\+X (.*)$/g.exec(r);\n if (!c || c.length < 3)\n throw \"HDR Bad header format, no size\";\n if (i = parseInt(c[2]), t = parseInt(c[1]), i < 8 || i > 32767)\n throw \"HDR Bad header format, unsupported size\";\n return o += r.length + 1, {\n height: t,\n width: i,\n dataPosition: o\n };\n }\n /**\n * Returns the cubemap information (each faces texture data) extracted from an RGBE texture.\n * This RGBE texture needs to store the information as a panorama.\n *\n * More information on this format are available here:\n * https://en.wikipedia.org/wiki/RGBE_image_format\n *\n * @param buffer The binary file stored in an array buffer.\n * @param size The expected size of the extracted cubemap.\n * @param supersample enable supersampling the cubemap (default: false)\n * @returns The Cube Map information.\n */\n static GetCubeMapTextureData(e, t, i = !1) {\n const r = new Uint8Array(e), s = this.RGBE_ReadHeader(r), a = this.RGBE_ReadPixels(r, s);\n return un.ConvertPanoramaToCubemap(a, s.width, s.height, t, i);\n }\n /**\n * Returns the pixels data extracted from an RGBE texture.\n * This pixels will be stored left to right up to down in the R G B order in one array.\n *\n * More information on this format are available here:\n * https://en.wikipedia.org/wiki/RGBE_image_format\n *\n * @param uint8array The binary file stored in an array buffer.\n * @param hdrInfo The header information of the file.\n * @returns The pixels data in RGB right to left up to down order.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static RGBE_ReadPixels(e, t) {\n return this._RGBEReadPixelsRLE(e, t);\n }\n static _RGBEReadPixelsRLE(e, t) {\n let i = t.height;\n const r = t.width;\n let s, a, o, l, c, h = t.dataPosition, u = 0, f = 0, d = 0;\n const p = new ArrayBuffer(r * 4), g = new Uint8Array(p), m = new ArrayBuffer(t.width * t.height * 4 * 3), v = new Float32Array(m);\n for (; i > 0; ) {\n if (s = e[h++], a = e[h++], o = e[h++], l = e[h++], s != 2 || a != 2 || o & 128 || t.width < 8 || t.width > 32767)\n return this._RGBEReadPixelsNOTRLE(e, t);\n if ((o << 8 | l) != r)\n throw \"HDR Bad header format, wrong scan line width\";\n for (u = 0, d = 0; d < 4; d++)\n for (f = (d + 1) * r; u < f; )\n if (s = e[h++], a = e[h++], s > 128) {\n if (c = s - 128, c == 0 || c > f - u)\n throw \"HDR Bad Format, bad scanline data (run)\";\n for (; c-- > 0; )\n g[u++] = a;\n } else {\n if (c = s, c == 0 || c > f - u)\n throw \"HDR Bad Format, bad scanline data (non-run)\";\n if (g[u++] = a, --c > 0)\n for (let E = 0; E < c; E++)\n g[u++] = e[h++];\n }\n for (d = 0; d < r; d++)\n s = g[d], a = g[d + r], o = g[d + 2 * r], l = g[d + 3 * r], this._Rgbe2float(v, s, a, o, l, (t.height - i) * r * 3 + d * 3);\n i--;\n }\n return v;\n }\n static _RGBEReadPixelsNOTRLE(e, t) {\n let i = t.height;\n const r = t.width;\n let s, a, o, l, c, h = t.dataPosition;\n const u = new ArrayBuffer(t.width * t.height * 4 * 3), f = new Float32Array(u);\n for (; i > 0; ) {\n for (c = 0; c < t.width; c++)\n s = e[h++], a = e[h++], o = e[h++], l = e[h++], this._Rgbe2float(f, s, a, o, l, (t.height - i) * r * 3 + c * 3);\n i--;\n }\n return f;\n }\n}\nconst ZD = \"hdrFilteringVertexShader\", jD = `attribute vec2 position;varying vec3 direction;uniform vec3 up;uniform vec3 right;uniform vec3 front;\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nmat3 view=mat3(up,right,front);direction=view*vec3(position,1.0);gl_Position=vec4(position,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[ZD] = jD;\nconst QD = \"hdrFilteringPixelShader\", JD = `#include\n#include\n#include\n#include\nuniform float alphaG;uniform samplerCube inputTexture;uniform vec2 vFilteringInfo;uniform float hdrScale;varying vec3 direction;void main() {vec3 color=radiance(alphaG,inputTexture,direction,vFilteringInfo);gl_FragColor=vec4(color*hdrScale,1.0);}`;\nY.ShadersStore[QD] = JD;\nclass $D {\n /**\n * Instantiates HDR filter for reflection maps\n *\n * @param engine Thin engine\n * @param options Options\n */\n constructor(e, t = {}) {\n this._lodGenerationOffset = 0, this._lodGenerationScale = 0.8, this.quality = 4096, this.hdrScale = 1, this._engine = e, this.hdrScale = t.hdrScale || this.hdrScale, this.quality = t.quality || this.quality;\n }\n _createRenderTarget(e) {\n let t = 0;\n this._engine.getCaps().textureHalfFloatRender ? t = 2 : this._engine.getCaps().textureFloatRender && (t = 1);\n const i = this._engine.createRenderTargetCubeTexture(e, {\n format: 5,\n type: t,\n createMipMaps: !0,\n generateMipMaps: !1,\n generateDepthBuffer: !1,\n generateStencilBuffer: !1,\n samplingMode: 1\n });\n return this._engine.updateTextureWrappingMode(i.texture, 0, 0, 0), this._engine.updateTextureSamplingMode(3, i.texture, !0), i;\n }\n _prefilterInternal(e) {\n const t = e.getSize().width, i = je.ILog2(t) + 1, r = this._effectWrapper.effect, s = this._createRenderTarget(t);\n this._effectRenderer.saveStates(), this._effectRenderer.setViewport();\n const a = e.getInternalTexture();\n a && this._engine.updateTextureSamplingMode(3, a, !0), this._effectRenderer.applyEffectWrapper(this._effectWrapper);\n const o = [\n [new _(0, 0, -1), new _(0, -1, 0), new _(1, 0, 0)],\n [new _(0, 0, 1), new _(0, -1, 0), new _(-1, 0, 0)],\n [new _(1, 0, 0), new _(0, 0, 1), new _(0, 1, 0)],\n [new _(1, 0, 0), new _(0, 0, -1), new _(0, -1, 0)],\n [new _(1, 0, 0), new _(0, -1, 0), new _(0, 0, 1)],\n [new _(-1, 0, 0), new _(0, -1, 0), new _(0, 0, -1)]\n // NegativeZ\n ];\n r.setFloat(\"hdrScale\", this.hdrScale), r.setFloat2(\"vFilteringInfo\", e.getSize().width, i), r.setTexture(\"inputTexture\", e);\n for (let h = 0; h < 6; h++) {\n r.setVector3(\"up\", o[h][0]), r.setVector3(\"right\", o[h][1]), r.setVector3(\"front\", o[h][2]);\n for (let u = 0; u < i; u++) {\n this._engine.bindFramebuffer(s, h, void 0, void 0, !0, u), this._effectRenderer.applyEffectWrapper(this._effectWrapper);\n let f = Math.pow(2, (u - this._lodGenerationOffset) / this._lodGenerationScale) / t;\n u === 0 && (f = 0), r.setFloat(\"alphaG\", f), this._effectRenderer.draw();\n }\n }\n this._effectRenderer.restoreStates(), this._engine.restoreDefaultFramebuffer(), this._engine._releaseTexture(e._texture);\n const l = s.texture.type, c = s.texture.format;\n return s._swapAndDie(e._texture), e._texture.type = l, e._texture.format = c, e.gammaSpace = !1, e.lodGenerationOffset = this._lodGenerationOffset, e.lodGenerationScale = this._lodGenerationScale, e._prefiltered = !0, e;\n }\n _createEffect(e, t) {\n const i = [];\n return e.gammaSpace && i.push(\"#define GAMMA_INPUT\"), i.push(\"#define NUM_SAMPLES \" + this.quality + \"u\"), new h0({\n engine: this._engine,\n name: \"hdrFiltering\",\n vertexShader: \"hdrFiltering\",\n fragmentShader: \"hdrFiltering\",\n samplerNames: [\"inputTexture\"],\n uniformNames: [\"vSampleDirections\", \"vWeights\", \"up\", \"right\", \"front\", \"vFilteringInfo\", \"hdrScale\", \"alphaG\"],\n useShaderStore: !0,\n defines: i,\n onCompiled: t\n });\n }\n /**\n * Get a value indicating if the filter is ready to be used\n * @param texture Texture to filter\n * @returns true if the filter is ready\n */\n isReady(e) {\n return e.isReady() && this._effectWrapper.effect.isReady();\n }\n /**\n * Prefilters a cube texture to have mipmap levels representing roughness values.\n * Prefiltering will be invoked at the end of next rendering pass.\n * This has to be done once the map is loaded, and has not been prefiltered by a third party software.\n * See http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf for more information\n * @param texture Texture to filter\n * @param onFinished Callback when filtering is done\n * @returns Promise called when prefiltering is done\n */\n prefilter(e, t = null) {\n return this._engine._features.allowTexturePrefiltering ? new Promise((i) => {\n this._effectRenderer = new c0(this._engine), this._effectWrapper = this._createEffect(e), this._effectWrapper.effect.executeWhenCompiled(() => {\n this._prefilterInternal(e), this._effectRenderer.dispose(), this._effectWrapper.dispose(), i(), t && t();\n });\n }) : (ne.Warn(\"HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.\"), Promise.reject(\"HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.\"));\n }\n}\nclass Ta extends It {\n /**\n * Sets whether or not the texture is blocking during loading.\n */\n set isBlocking(e) {\n this._isBlocking = e;\n }\n /**\n * Gets whether or not the texture is blocking during loading.\n */\n get isBlocking() {\n return this._isBlocking;\n }\n /**\n * Sets texture matrix rotation angle around Y axis in radians.\n */\n set rotationY(e) {\n this._rotationY = e, this.setReflectionTextureMatrix(w.RotationY(this._rotationY));\n }\n /**\n * Gets texture matrix rotation angle around Y axis radians.\n */\n get rotationY() {\n return this._rotationY;\n }\n /**\n * Gets or sets the size of the bounding box associated with the cube texture\n * When defined, the cubemap will switch to local mode\n * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity\n * @example https://www.babylonjs-playground.com/#RNASML\n */\n set boundingBoxSize(e) {\n if (this._boundingBoxSize && this._boundingBoxSize.equals(e))\n return;\n this._boundingBoxSize = e;\n const t = this.getScene();\n t && t.markAllMaterialsAsDirty(1);\n }\n get boundingBoxSize() {\n return this._boundingBoxSize;\n }\n /**\n * Instantiates an HDRTexture from the following parameters.\n *\n * @param url The location of the HDR raw data (Panorama stored in RGBE format)\n * @param sceneOrEngine The scene or engine the texture will be used in\n * @param size The cubemap desired size (the more it increases the longer the generation will be)\n * @param noMipmap Forces to not generate the mipmap if true\n * @param generateHarmonics Specifies whether you want to extract the polynomial harmonics during the generation process\n * @param gammaSpace Specifies if the texture will be use in gamma or linear space (the PBR material requires those texture in linear space, but the standard material would require them in Gamma space)\n * @param prefilterOnLoad Prefilters HDR texture to allow use of this texture as a PBR reflection texture.\n * @param onLoad on success callback function\n * @param onError on error callback function\n * @param supersample Defines if texture must be supersampled (default: false)\n */\n constructor(e, t, i, r = !1, s = !0, a = !1, o = !1, l = null, c = null, h = !1) {\n var u;\n super(t), this._generateHarmonics = !0, this._onError = null, this._isBlocking = !0, this._rotationY = 0, this.boundingBoxPosition = _.Zero(), this.onLoadObservable = new he(), e && (this._coordinatesMode = le.CUBIC_MODE, this.name = e, this.url = e, this.hasAlpha = !1, this.isCube = !0, this._textureMatrix = w.Identity(), this._prefilterOnLoad = o, this._onLoad = () => {\n this.onLoadObservable.notifyObservers(this), l && l();\n }, this._onError = c, this.gammaSpace = a, this._noMipmap = r, this._size = i, this._supersample = h, this._generateHarmonics = s, this._texture = this._getFromCache(e, this._noMipmap, void 0, void 0, void 0, this.isCube), this._texture ? this._texture.isReady ? ge.SetImmediate(() => this._onLoad()) : this._texture.onLoadedObservable.add(this._onLoad) : (u = this.getScene()) != null && u.useDelayedTextureLoading ? this.delayLoadState = 4 : this._loadTexture());\n }\n /**\n * Get the current class name of the texture useful for serialization or dynamic coding.\n * @returns \"HDRCubeTexture\"\n */\n getClassName() {\n return \"HDRCubeTexture\";\n }\n /**\n * Occurs when the file is raw .hdr file.\n */\n _loadTexture() {\n const e = this._getEngine(), t = e.getCaps();\n let i = 0;\n t.textureFloat && t.textureFloatLinearFiltering ? i = 1 : t.textureHalfFloat && t.textureHalfFloatLinearFiltering && (i = 2);\n const r = (s) => {\n this.lodGenerationOffset = 0, this.lodGenerationScale = 0.8;\n const a = YD.GetCubeMapTextureData(s, this._size, this._supersample);\n if (this._generateHarmonics) {\n const h = za.ConvertCubeMapToSphericalPolynomial(a);\n this.sphericalPolynomial = h;\n }\n const o = [];\n let l = null, c = null;\n for (let h = 0; h < 6; h++) {\n i === 2 ? c = new Uint16Array(this._size * this._size * 3) : i === 0 && (l = new Uint8Array(this._size * this._size * 3));\n const u = a[Ta._FacesMapping[h]];\n if (this.gammaSpace || c || l) {\n for (let f = 0; f < this._size * this._size; f++)\n if (this.gammaSpace && (u[f * 3 + 0] = Math.pow(u[f * 3 + 0], kl), u[f * 3 + 1] = Math.pow(u[f * 3 + 1], kl), u[f * 3 + 2] = Math.pow(u[f * 3 + 2], kl)), c && (c[f * 3 + 0] = ns(u[f * 3 + 0]), c[f * 3 + 1] = ns(u[f * 3 + 1]), c[f * 3 + 2] = ns(u[f * 3 + 2])), l) {\n let d = Math.max(u[f * 3 + 0] * 255, 0), p = Math.max(u[f * 3 + 1] * 255, 0), g = Math.max(u[f * 3 + 2] * 255, 0);\n const m = Math.max(Math.max(d, p), g);\n if (m > 255) {\n const v = 255 / m;\n d *= v, p *= v, g *= v;\n }\n l[f * 3 + 0] = d, l[f * 3 + 1] = p, l[f * 3 + 2] = g;\n }\n }\n c ? o.push(c) : l ? o.push(l) : o.push(u);\n }\n return o;\n };\n if (e._features.allowTexturePrefiltering && this._prefilterOnLoad) {\n const s = this._onLoad, a = new $D(e);\n this._onLoad = () => {\n a.prefilter(this, s);\n };\n }\n this._texture = e.createRawCubeTextureFromUrl(this.url, this.getScene(), this._size, 4, i, this._noMipmap, r, null, this._onLoad, this._onError);\n }\n clone() {\n const e = new Ta(this.url, this.getScene() || this._getEngine(), this._size, this._noMipmap, this._generateHarmonics, this.gammaSpace);\n return e.level = this.level, e.wrapU = this.wrapU, e.wrapV = this.wrapV, e.coordinatesIndex = this.coordinatesIndex, e.coordinatesMode = this.coordinatesMode, e;\n }\n // Methods\n delayLoad() {\n this.delayLoadState === 4 && (this.delayLoadState = 1, this._texture = this._getFromCache(this.url, this._noMipmap), this._texture || this._loadTexture());\n }\n /**\n * Get the texture reflection matrix used to rotate/transform the reflection.\n * @returns the reflection matrix\n */\n getReflectionTextureMatrix() {\n return this._textureMatrix;\n }\n /**\n * Set the texture reflection matrix used to rotate/transform the reflection.\n * @param value Define the reflection matrix to set\n */\n setReflectionTextureMatrix(e) {\n var t;\n this._textureMatrix = e, e.updateFlag !== this._textureMatrix.updateFlag && e.isIdentity() !== this._textureMatrix.isIdentity() && ((t = this.getScene()) == null || t.markAllMaterialsAsDirty(1, (i) => i.getActiveTextures().indexOf(this) !== -1));\n }\n /**\n * Dispose the texture and release its associated resources.\n */\n dispose() {\n this.onLoadObservable.clear(), super.dispose();\n }\n /**\n * Parses a JSON representation of an HDR Texture in order to create the texture\n * @param parsedTexture Define the JSON representation\n * @param scene Define the scene the texture should be created in\n * @param rootUrl Define the root url in case we need to load relative dependencies\n * @returns the newly created texture after parsing\n */\n static Parse(e, t, i) {\n let r = null;\n return e.name && !e.isRenderTarget && (r = new Ta(i + e.name, t, e.size, e.noMipmap, e.generateHarmonics, e.useInGammaSpace), r.name = e.name, r.hasAlpha = e.hasAlpha, r.level = e.level, r.coordinatesMode = e.coordinatesMode, r.isBlocking = e.isBlocking), r && (e.boundingBoxPosition && (r.boundingBoxPosition = _.FromArray(e.boundingBoxPosition)), e.boundingBoxSize && (r.boundingBoxSize = _.FromArray(e.boundingBoxSize)), e.rotationY && (r.rotationY = e.rotationY)), r;\n }\n serialize() {\n if (!this.name)\n return null;\n const e = {};\n return e.name = this.name, e.hasAlpha = this.hasAlpha, e.isCube = !0, e.level = this.level, e.size = this._size, e.coordinatesMode = this.coordinatesMode, e.useInGammaSpace = this.gammaSpace, e.generateHarmonics = this._generateHarmonics, e.customType = \"BABYLON.HDRCubeTexture\", e.noMipmap = this._noMipmap, e.isBlocking = this._isBlocking, e.rotationY = this._rotationY, e;\n }\n}\nTa._FacesMapping = [\"right\", \"left\", \"up\", \"down\", \"front\", \"back\"];\nRe(\"BABYLON.HDRCubeTexture\", Ta);\nclass cc extends It {\n /**\n * Instantiates an EquiRectangularCubeTexture from the following parameters.\n * @param url The location of the image\n * @param scene The scene the texture will be used in\n * @param size The cubemap desired size (the more it increases the longer the generation will be)\n * @param noMipmap Forces to not generate the mipmap if true\n * @param gammaSpace Specifies if the texture will be used in gamma or linear space\n * (the PBR material requires those textures in linear space, but the standard material would require them in Gamma space)\n * @param onLoad — defines a callback called when texture is loaded\n * @param onError — defines a callback called if there is an error\n * @param supersample — defines if texture must be supersampled (default: false)\n */\n constructor(e, t, i, r = !1, s = !0, a = null, o = null, l = !1) {\n if (super(t), this._onLoad = null, this._onError = null, !e)\n throw new Error(\"Image url is not set\");\n this._coordinatesMode = le.CUBIC_MODE, this.name = e, this.url = e, this._size = i, this._supersample = l, this._noMipmap = r, this.gammaSpace = s, this._onLoad = a, this._onError = o, this.hasAlpha = !1, this.isCube = !0, this._texture = this._getFromCache(e, this._noMipmap, void 0, void 0, void 0, this.isCube), this._texture ? a && (this._texture.isReady ? ge.SetImmediate(() => a()) : this._texture.onLoadedObservable.add(a)) : t.useDelayedTextureLoading ? this.delayLoadState = 4 : this._loadImage(() => this._loadTexture(), this._onError);\n }\n /**\n * Load the image data, by putting the image on a canvas and extracting its buffer.\n * @param loadTextureCallback\n * @param onError\n */\n _loadImage(e, t) {\n const i = this.getScene();\n if (!i)\n return;\n const r = i.getEngine().createRawCubeTexture(null, this._size, 4, i.getEngine().getCaps().textureFloat ? 1 : 7, this._noMipmap, !1, 3);\n r.generateMipMaps = !this._noMipmap, i.addPendingData(r), r.url = this.url, r.isReady = !1, i.getEngine()._internalTexturesCache.push(r), this._texture = r;\n const s = document.createElement(\"canvas\");\n Go(this.url, (a) => {\n this._width = a.width, this._height = a.height, s.width = this._width, s.height = this._height;\n const o = s.getContext(\"2d\");\n o.drawImage(a, 0, 0);\n const l = o.getImageData(0, 0, a.width, a.height);\n this._buffer = l.data.buffer, s.remove(), e();\n }, (a, o) => {\n i.removePendingData(r), t && t(`${this.getClassName()} could not be loaded`, o);\n }, i ? i.offlineProvider : null);\n }\n /**\n * Convert the image buffer into a cubemap and create a CubeTexture.\n */\n _loadTexture() {\n const e = this.getScene(), t = () => {\n const s = this._getFloat32ArrayFromArrayBuffer(this._buffer), a = un.ConvertPanoramaToCubemap(s, this._width, this._height, this._size, this._supersample), o = [];\n for (let l = 0; l < 6; l++) {\n const c = a[cc._FacesMapping[l]];\n o.push(c);\n }\n return o;\n };\n if (!e)\n return;\n const i = t(), r = this._texture;\n e.getEngine().updateRawCubeTexture(r, i, r.format, r.type, r.invertY), r.isReady = !0, e.removePendingData(r), r.onLoadedObservable.notifyObservers(r), r.onLoadedObservable.clear(), this._onLoad && this._onLoad();\n }\n /**\n * Convert the ArrayBuffer into a Float32Array and drop the transparency channel.\n * @param buffer The ArrayBuffer that should be converted.\n * @returns The buffer as Float32Array.\n */\n _getFloat32ArrayFromArrayBuffer(e) {\n const t = new DataView(e), i = new Float32Array(e.byteLength * 3 / 4);\n let r = 0;\n for (let s = 0; s < e.byteLength; s++)\n (s + 1) % 4 !== 0 && (i[r++] = t.getUint8(s) / 255);\n return i;\n }\n /**\n * Get the current class name of the texture useful for serialization or dynamic coding.\n * @returns \"EquiRectangularCubeTexture\"\n */\n getClassName() {\n return \"EquiRectangularCubeTexture\";\n }\n /**\n * Create a clone of the current EquiRectangularCubeTexture and return it.\n * @returns A clone of the current EquiRectangularCubeTexture.\n */\n clone() {\n const e = this.getScene();\n if (!e)\n return this;\n const t = new cc(this.url, e, this._size, this._noMipmap, this.gammaSpace);\n return t.level = this.level, t.wrapU = this.wrapU, t.wrapV = this.wrapV, t.coordinatesIndex = this.coordinatesIndex, t.coordinatesMode = this.coordinatesMode, t;\n }\n}\ncc._FacesMapping = [\"right\", \"left\", \"up\", \"down\", \"front\", \"back\"];\nvar Ig;\n(function(n) {\n n[n.INIT = 0] = \"INIT\", n[n.RUNNING = 1] = \"RUNNING\", n[n.DONE = 2] = \"DONE\", n[n.ERROR = 3] = \"ERROR\";\n})(Ig || (Ig = {}));\nvar bg;\n(function(n) {\n n[n.cTFETC1 = 0] = \"cTFETC1\", n[n.cTFETC2 = 1] = \"cTFETC2\", n[n.cTFBC1 = 2] = \"cTFBC1\", n[n.cTFBC3 = 3] = \"cTFBC3\", n[n.cTFBC4 = 4] = \"cTFBC4\", n[n.cTFBC5 = 5] = \"cTFBC5\", n[n.cTFBC7 = 6] = \"cTFBC7\", n[n.cTFPVRTC1_4_RGB = 8] = \"cTFPVRTC1_4_RGB\", n[n.cTFPVRTC1_4_RGBA = 9] = \"cTFPVRTC1_4_RGBA\", n[n.cTFASTC_4x4 = 10] = \"cTFASTC_4x4\", n[n.cTFATC_RGB = 11] = \"cTFATC_RGB\", n[n.cTFATC_RGBA_INTERPOLATED_ALPHA = 12] = \"cTFATC_RGBA_INTERPOLATED_ALPHA\", n[n.cTFRGBA32 = 13] = \"cTFRGBA32\", n[n.cTFRGB565 = 14] = \"cTFRGB565\", n[n.cTFBGR565 = 15] = \"cTFBGR565\", n[n.cTFRGBA4444 = 16] = \"cTFRGBA4444\", n[n.cTFFXT1_RGB = 17] = \"cTFFXT1_RGB\", n[n.cTFPVRTC2_4_RGB = 18] = \"cTFPVRTC2_4_RGB\", n[n.cTFPVRTC2_4_RGBA = 19] = \"cTFPVRTC2_4_RGBA\", n[n.cTFETC2_EAC_R11 = 20] = \"cTFETC2_EAC_R11\", n[n.cTFETC2_EAC_RG11 = 21] = \"cTFETC2_EAC_RG11\";\n})(bg || (bg = {}));\n`${ge._DefaultCdnUrl}`, `${ge._DefaultCdnUrl}`;\nconst eN = 542327876, Ag = 131072, Mg = 512, Pg = 4, Og = 64, Dg = 131072;\nfunction Hc(n) {\n return n.charCodeAt(0) + (n.charCodeAt(1) << 8) + (n.charCodeAt(2) << 16) + (n.charCodeAt(3) << 24);\n}\nfunction tN(n) {\n return String.fromCharCode(n & 255, n >> 8 & 255, n >> 16 & 255, n >> 24 & 255);\n}\nconst Ng = Hc(\"DXT1\"), Fg = Hc(\"DXT3\"), Lg = Hc(\"DXT5\"), Kh = Hc(\"DX10\"), wg = 113, Ug = 116, Vg = 2, Bg = 10, iN = 88, qh = 31, rN = 0, sN = 1, kg = 2, zg = 3, Yh = 4, Wg = 7, Zh = 20, Gg = 21, nN = 22, aN = 23, oN = 24, lN = 25, cN = 26, hN = 28, uN = 32;\nclass Lt {\n /**\n * Gets DDS information from an array buffer\n * @param data defines the array buffer view to read data from\n * @returns the DDS information\n */\n static GetDDSInfo(e) {\n const t = new Int32Array(e.buffer, e.byteOffset, qh), i = new Int32Array(e.buffer, e.byteOffset, qh + 4);\n let r = 1;\n t[kg] & Ag && (r = Math.max(1, t[Wg]));\n const s = t[Gg], a = s === Kh ? i[uN] : 0;\n let o = 0;\n switch (s) {\n case wg:\n o = 2;\n break;\n case Ug:\n o = 1;\n break;\n case Kh:\n if (a === Bg) {\n o = 2;\n break;\n }\n if (a === Vg) {\n o = 1;\n break;\n }\n }\n return {\n width: t[Yh],\n height: t[zg],\n mipmapCount: r,\n isFourCC: (t[Zh] & Pg) === Pg,\n isRGB: (t[Zh] & Og) === Og,\n isLuminance: (t[Zh] & Dg) === Dg,\n isCube: (t[hN] & Mg) === Mg,\n isCompressed: s === Ng || s === Fg || s === Lg,\n dxgiFormat: a,\n textureType: o\n };\n }\n static _GetHalfFloatAsFloatRGBAArrayBuffer(e, t, i, r, s, a) {\n const o = new Float32Array(r), l = new Uint16Array(s, i);\n let c = 0;\n for (let h = 0; h < t; h++)\n for (let u = 0; u < e; u++) {\n const f = (u + h * e) * 4;\n o[c] = Ms(l[f]), o[c + 1] = Ms(l[f + 1]), o[c + 2] = Ms(l[f + 2]), Lt.StoreLODInAlphaChannel ? o[c + 3] = a : o[c + 3] = Ms(l[f + 3]), c += 4;\n }\n return o;\n }\n static _GetHalfFloatRGBAArrayBuffer(e, t, i, r, s, a) {\n if (Lt.StoreLODInAlphaChannel) {\n const o = new Uint16Array(r), l = new Uint16Array(s, i);\n let c = 0;\n for (let h = 0; h < t; h++)\n for (let u = 0; u < e; u++) {\n const f = (u + h * e) * 4;\n o[c] = l[f], o[c + 1] = l[f + 1], o[c + 2] = l[f + 2], o[c + 3] = ns(a), c += 4;\n }\n return o;\n }\n return new Uint16Array(s, i, r);\n }\n static _GetFloatRGBAArrayBuffer(e, t, i, r, s, a) {\n if (Lt.StoreLODInAlphaChannel) {\n const o = new Float32Array(r), l = new Float32Array(s, i);\n let c = 0;\n for (let h = 0; h < t; h++)\n for (let u = 0; u < e; u++) {\n const f = (u + h * e) * 4;\n o[c] = l[f], o[c + 1] = l[f + 1], o[c + 2] = l[f + 2], o[c + 3] = a, c += 4;\n }\n return o;\n }\n return new Float32Array(s, i, r);\n }\n static _GetFloatAsHalfFloatRGBAArrayBuffer(e, t, i, r, s, a) {\n const o = new Uint16Array(r), l = new Float32Array(s, i);\n let c = 0;\n for (let h = 0; h < t; h++)\n for (let u = 0; u < e; u++)\n o[c] = ns(l[c]), o[c + 1] = ns(l[c + 1]), o[c + 2] = ns(l[c + 2]), Lt.StoreLODInAlphaChannel ? o[c + 3] = ns(a) : o[c + 3] = ns(l[c + 3]), c += 4;\n return o;\n }\n static _GetFloatAsUIntRGBAArrayBuffer(e, t, i, r, s, a) {\n const o = new Uint8Array(r), l = new Float32Array(s, i);\n let c = 0;\n for (let h = 0; h < t; h++)\n for (let u = 0; u < e; u++) {\n const f = (u + h * e) * 4;\n o[c] = je.Clamp(l[f]) * 255, o[c + 1] = je.Clamp(l[f + 1]) * 255, o[c + 2] = je.Clamp(l[f + 2]) * 255, Lt.StoreLODInAlphaChannel ? o[c + 3] = a : o[c + 3] = je.Clamp(l[f + 3]) * 255, c += 4;\n }\n return o;\n }\n static _GetHalfFloatAsUIntRGBAArrayBuffer(e, t, i, r, s, a) {\n const o = new Uint8Array(r), l = new Uint16Array(s, i);\n let c = 0;\n for (let h = 0; h < t; h++)\n for (let u = 0; u < e; u++) {\n const f = (u + h * e) * 4;\n o[c] = je.Clamp(Ms(l[f])) * 255, o[c + 1] = je.Clamp(Ms(l[f + 1])) * 255, o[c + 2] = je.Clamp(Ms(l[f + 2])) * 255, Lt.StoreLODInAlphaChannel ? o[c + 3] = a : o[c + 3] = je.Clamp(Ms(l[f + 3])) * 255, c += 4;\n }\n return o;\n }\n static _GetRGBAArrayBuffer(e, t, i, r, s, a, o, l, c) {\n const h = new Uint8Array(r), u = new Uint8Array(s, i);\n let f = 0;\n for (let d = 0; d < t; d++)\n for (let p = 0; p < e; p++) {\n const g = (p + d * e) * 4;\n h[f] = u[g + a], h[f + 1] = u[g + o], h[f + 2] = u[g + l], h[f + 3] = u[g + c], f += 4;\n }\n return h;\n }\n static _ExtractLongWordOrder(e) {\n return e === 0 || e === 255 || e === -16777216 ? 0 : 1 + Lt._ExtractLongWordOrder(e >> 8);\n }\n static _GetRGBArrayBuffer(e, t, i, r, s, a, o, l) {\n const c = new Uint8Array(r), h = new Uint8Array(s, i);\n let u = 0;\n for (let f = 0; f < t; f++)\n for (let d = 0; d < e; d++) {\n const p = (d + f * e) * 3;\n c[u] = h[p + a], c[u + 1] = h[p + o], c[u + 2] = h[p + l], u += 3;\n }\n return c;\n }\n static _GetLuminanceArrayBuffer(e, t, i, r, s) {\n const a = new Uint8Array(r), o = new Uint8Array(s, i);\n let l = 0;\n for (let c = 0; c < t; c++)\n for (let h = 0; h < e; h++) {\n const u = h + c * e;\n a[l] = o[u], l++;\n }\n return a;\n }\n /**\n * Uploads DDS Levels to a Babylon Texture\n * @internal\n */\n static UploadDDSLevels(e, t, i, r, s, a, o = -1, l, c = !0) {\n let h = null;\n r.sphericalPolynomial && (h = []);\n const u = !!e.getCaps().s3tc;\n t.generateMipMaps = s;\n const f = new Int32Array(i.buffer, i.byteOffset, qh);\n let d, p, g, m = 0, v, E, C, T, R = 0, x = 1;\n if (f[rN] !== eN) {\n ne.Error(\"Invalid magic number in DDS header\");\n return;\n }\n if (!r.isFourCC && !r.isRGB && !r.isLuminance) {\n ne.Error(\"Unsupported format, must contain a FourCC, RGB or LUMINANCE code\");\n return;\n }\n if (r.isCompressed && !u) {\n ne.Error(\"Compressed textures are not supported on this platform.\");\n return;\n }\n let S = f[nN];\n v = f[sN] + 4;\n let M = !1;\n if (r.isFourCC)\n switch (d = f[Gg], d) {\n case Ng:\n x = 8, R = 33777;\n break;\n case Fg:\n x = 16, R = 33778;\n break;\n case Lg:\n x = 16, R = 33779;\n break;\n case wg:\n M = !0, S = 64;\n break;\n case Ug:\n M = !0, S = 128;\n break;\n case Kh: {\n v += 5 * 4;\n let k = !1;\n switch (r.dxgiFormat) {\n case Bg:\n M = !0, S = 64, k = !0;\n break;\n case Vg:\n M = !0, S = 128, k = !0;\n break;\n case iN:\n r.isRGB = !0, r.isFourCC = !1, S = 32, k = !0;\n break;\n }\n if (k)\n break;\n }\n default:\n ne.Error([\"Unsupported FourCC code:\", tN(d)]);\n return;\n }\n const N = Lt._ExtractLongWordOrder(f[aN]), F = Lt._ExtractLongWordOrder(f[oN]), L = Lt._ExtractLongWordOrder(f[lN]), K = Lt._ExtractLongWordOrder(f[cN]);\n M && (R = e._getRGBABufferInternalSizedFormat(r.textureType)), C = 1, f[kg] & Ag && s !== !1 && (C = Math.max(1, f[Wg]));\n const q = l || 0, j = e.getCaps();\n for (let k = q; k < a; k++) {\n for (p = f[Yh], g = f[zg], T = 0; T < C; ++T) {\n if (o === -1 || o === T) {\n const Q = o === -1 ? T : 0;\n if (!r.isCompressed && r.isFourCC) {\n t.format = 5, m = p * g * 4;\n let ce = null;\n if (e._badOS || e._badDesktopOS || !j.textureHalfFloat && !j.textureFloat)\n S === 128 ? (ce = Lt._GetFloatAsUIntRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, Q), h && Q == 0 && h.push(Lt._GetFloatRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, Q))) : S === 64 && (ce = Lt._GetHalfFloatAsUIntRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, Q), h && Q == 0 && h.push(Lt._GetHalfFloatAsFloatRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, Q))), t.type = 0;\n else {\n const de = j.textureFloat && (c && j.textureFloatLinearFiltering || !c), Z = j.textureHalfFloat && (c && j.textureHalfFloatLinearFiltering || !c), J = (S === 128 || S === 64 && !Z) && de ? 1 : (S === 64 || S === 128 && !de) && Z ? 2 : 0;\n let O, G = null;\n switch (S) {\n case 128: {\n switch (J) {\n case 1:\n O = Lt._GetFloatRGBAArrayBuffer, G = null;\n break;\n case 2:\n O = Lt._GetFloatAsHalfFloatRGBAArrayBuffer, G = Lt._GetFloatRGBAArrayBuffer;\n break;\n case 0:\n O = Lt._GetFloatAsUIntRGBAArrayBuffer, G = Lt._GetFloatRGBAArrayBuffer;\n break;\n }\n break;\n }\n default: {\n switch (J) {\n case 1:\n O = Lt._GetHalfFloatAsFloatRGBAArrayBuffer, G = null;\n break;\n case 2:\n O = Lt._GetHalfFloatRGBAArrayBuffer, G = Lt._GetHalfFloatAsFloatRGBAArrayBuffer;\n break;\n case 0:\n O = Lt._GetHalfFloatAsUIntRGBAArrayBuffer, G = Lt._GetHalfFloatAsFloatRGBAArrayBuffer;\n break;\n }\n break;\n }\n }\n t.type = J, ce = O(p, g, i.byteOffset + v, m, i.buffer, Q), h && Q == 0 && h.push(G ? G(p, g, i.byteOffset + v, m, i.buffer, Q) : ce);\n }\n ce && e._uploadDataToTextureDirectly(t, ce, k, Q);\n } else if (r.isRGB)\n t.type = 0, S === 24 ? (t.format = 4, m = p * g * 3, E = Lt._GetRGBArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, N, F, L), e._uploadDataToTextureDirectly(t, E, k, Q)) : (t.format = 5, m = p * g * 4, E = Lt._GetRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, N, F, L, K), e._uploadDataToTextureDirectly(t, E, k, Q));\n else if (r.isLuminance) {\n const ce = e._getUnpackAlignement(), de = p;\n m = Math.floor((p + ce - 1) / ce) * ce * (g - 1) + de, E = Lt._GetLuminanceArrayBuffer(p, g, i.byteOffset + v, m, i.buffer), t.format = 1, t.type = 0, e._uploadDataToTextureDirectly(t, E, k, Q);\n } else\n m = Math.max(4, p) / 4 * Math.max(4, g) / 4 * x, E = new Uint8Array(i.buffer, i.byteOffset + v, m), t.type = 0, e._uploadCompressedDataToTextureDirectly(t, R, p, g, E, k, Q);\n }\n v += S ? p * g * (S / 8) : m, p *= 0.5, g *= 0.5, p = Math.max(1, p), g = Math.max(1, g);\n }\n if (l !== void 0)\n break;\n }\n h && h.length > 0 ? r.sphericalPolynomial = za.ConvertCubeMapToSphericalPolynomial({\n size: f[Yh],\n right: h[0],\n left: h[1],\n up: h[2],\n down: h[3],\n front: h[4],\n back: h[5],\n format: 5,\n type: 1,\n gammaSpace: !1\n }) : r.sphericalPolynomial = void 0;\n }\n}\nLt.StoreLODInAlphaChannel = !1;\nDe.prototype.createPrefilteredCubeTexture = function(n, e, t, i, r = null, s = null, a, o = null, l = !0) {\n const c = (h) => {\n if (!h) {\n r && r(null);\n return;\n }\n const u = h.texture;\n if (l ? h.info.sphericalPolynomial && (u._sphericalPolynomial = h.info.sphericalPolynomial) : u._sphericalPolynomial = new Co(), u._source = Dt.CubePrefiltered, this.getCaps().textureLOD) {\n r && r(u);\n return;\n }\n const f = 3, d = this._gl, p = h.width;\n if (!p)\n return;\n const g = [];\n for (let m = 0; m < f; m++) {\n const E = 1 - m / (f - 1), C = i, T = je.Log2(p) * t + i, R = C + (T - C) * E, x = Math.round(Math.min(Math.max(R, 0), T)), S = new ar(this, Dt.Temp);\n if (S.type = u.type, S.format = u.format, S.width = Math.pow(2, Math.max(je.Log2(p) - x, 0)), S.height = S.width, S.isCube = !0, S._cachedWrapU = 0, S._cachedWrapV = 0, this._bindTextureDirectly(d.TEXTURE_CUBE_MAP, S, !0), S.samplingMode = 2, d.texParameteri(d.TEXTURE_CUBE_MAP, d.TEXTURE_MAG_FILTER, d.LINEAR), d.texParameteri(d.TEXTURE_CUBE_MAP, d.TEXTURE_MIN_FILTER, d.LINEAR), d.texParameteri(d.TEXTURE_CUBE_MAP, d.TEXTURE_WRAP_S, d.CLAMP_TO_EDGE), d.texParameteri(d.TEXTURE_CUBE_MAP, d.TEXTURE_WRAP_T, d.CLAMP_TO_EDGE), h.isDDS) {\n const N = h.info, F = h.data;\n this._unpackFlipY(N.isCompressed), Lt.UploadDDSLevels(this, S, F, N, !0, 6, x);\n } else\n ne.Warn(\"DDS is the only prefiltered cube map supported so far.\");\n this._bindTextureDirectly(d.TEXTURE_CUBE_MAP, null);\n const M = new It(e);\n M._isCube = !0, M._texture = S, S.isReady = !0, g.push(M);\n }\n u._lodTextureHigh = g[2], u._lodTextureMid = g[1], u._lodTextureLow = g[0], r && r(u);\n };\n return this.createCubeTexture(n, e, null, !1, c, s, a, o, l, t, i);\n};\nconst fN = \"rgbdEncodePixelShader\", dN = `varying vec2 vUV;uniform sampler2D textureSampler;\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) \n{gl_FragColor=toRGBD(texture2D(textureSampler,vUV).rgb);}`;\nY.ShadersStore[fN] = dN;\nhe.prototype.notifyObserversWithPromise = async function(n, e = -1, t, i, r) {\n let s = Promise.resolve(n);\n if (!this.observers.length)\n return s;\n const a = this._eventState;\n return a.mask = e, a.target = t, a.currentTarget = i, a.skipNextObservers = !1, a.userInfo = r, this.observers.forEach((o) => {\n a.skipNextObservers || o._willBeUnregistered || o.mask & e && (o.scope ? s = s.then((l) => (a.lastReturnValue = l, o.callback.apply(o.scope, [n, a]))) : s = s.then((l) => (a.lastReturnValue = l, o.callback(n, a))), o.unregisterOnNextCall && this._deferUnregister(o));\n }), await s, n;\n};\nvar Xg;\n(function(n) {\n n[n.X = 0] = \"X\", n[n.Y = 1] = \"Y\", n[n.Z = 2] = \"Z\";\n})(Xg || (Xg = {}));\nconst pN = \"fxaaPixelShader\", gN = `#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\n#define TEXTUREFUNC(s,c,l) texture2DLodEXT(s,c,l)\n#else\n#define TEXTUREFUNC(s,c,b) texture2D(s,c,b)\n#endif\nuniform sampler2D textureSampler;uniform vec2 texelSize;varying vec2 vUV;varying vec2 sampleCoordS;varying vec2 sampleCoordE;varying vec2 sampleCoordN;varying vec2 sampleCoordW;varying vec2 sampleCoordNW;varying vec2 sampleCoordSE;varying vec2 sampleCoordNE;varying vec2 sampleCoordSW;const float fxaaQualitySubpix=1.0;const float fxaaQualityEdgeThreshold=0.166;const float fxaaQualityEdgeThresholdMin=0.0833;const vec3 kLumaCoefficients=vec3(0.2126,0.7152,0.0722);\n#define FxaaLuma(rgba) dot(rgba.rgb,kLumaCoefficients)\nvoid main(){vec2 posM;posM.x=vUV.x;posM.y=vUV.y;vec4 rgbyM=TEXTUREFUNC(textureSampler,vUV,0.0);float lumaM=FxaaLuma(rgbyM);float lumaS=FxaaLuma(TEXTUREFUNC(textureSampler,sampleCoordS,0.0));float lumaE=FxaaLuma(TEXTUREFUNC(textureSampler,sampleCoordE,0.0));float lumaN=FxaaLuma(TEXTUREFUNC(textureSampler,sampleCoordN,0.0));float lumaW=FxaaLuma(TEXTUREFUNC(textureSampler,sampleCoordW,0.0));float maxSM=max(lumaS,lumaM);float minSM=min(lumaS,lumaM);float maxESM=max(lumaE,maxSM);float minESM=min(lumaE,minSM);float maxWN=max(lumaN,lumaW);float minWN=min(lumaN,lumaW);float rangeMax=max(maxWN,maxESM);float rangeMin=min(minWN,minESM);float rangeMaxScaled=rangeMax*fxaaQualityEdgeThreshold;float range=rangeMax-rangeMin;float rangeMaxClamped=max(fxaaQualityEdgeThresholdMin,rangeMaxScaled);\n#ifndef MALI\nif(range=edgeVert;float subpixA=subpixNSWE*2.0+subpixNWSWNESE;if (!horzSpan)\n{lumaN=lumaW;}\nif (!horzSpan) \n{lumaS=lumaE;}\nif (horzSpan) \n{lengthSign=texelSize.y;}\nfloat subpixB=(subpixA*(1.0/12.0))-lumaM;float gradientN=lumaN-lumaM;float gradientS=lumaS-lumaM;float lumaNN=lumaN+lumaM;float lumaSS=lumaS+lumaM;bool pairN=abs(gradientN)>=abs(gradientS);float gradient=max(abs(gradientN),abs(gradientS));if (pairN)\n{lengthSign=-lengthSign;}\nfloat subpixC=clamp(abs(subpixB)*subpixRcpRange,0.0,1.0);vec2 posB;posB.x=posM.x;posB.y=posM.y;vec2 offNP;offNP.x=(!horzSpan) ? 0.0 : texelSize.x;offNP.y=(horzSpan) ? 0.0 : texelSize.y;if (!horzSpan) \n{posB.x+=lengthSign*0.5;}\nif (horzSpan)\n{posB.y+=lengthSign*0.5;}\nvec2 posN;posN.x=posB.x-offNP.x*1.5;posN.y=posB.y-offNP.y*1.5;vec2 posP;posP.x=posB.x+offNP.x*1.5;posP.y=posB.y+offNP.y*1.5;float subpixD=((-2.0)*subpixC)+3.0;float lumaEndN=FxaaLuma(TEXTUREFUNC(textureSampler,posN,0.0));float subpixE=subpixC*subpixC;float lumaEndP=FxaaLuma(TEXTUREFUNC(textureSampler,posP,0.0));if (!pairN) \n{lumaNN=lumaSS;}\nfloat gradientScaled=gradient*1.0/4.0;float lumaMM=lumaM-lumaNN*0.5;float subpixF=subpixD*subpixE;bool lumaMLTZero=lumaMM<0.0;lumaEndN-=lumaNN*0.5;lumaEndP-=lumaNN*0.5;bool doneN=abs(lumaEndN)>=gradientScaled;bool doneP=abs(lumaEndP)>=gradientScaled;if (!doneN) \n{posN.x-=offNP.x*3.0;}\nif (!doneN) \n{posN.y-=offNP.y*3.0;}\nbool doneNP=(!doneN) || (!doneP);if (!doneP) \n{posP.x+=offNP.x*3.0;}\nif (!doneP)\n{posP.y+=offNP.y*3.0;}\nif (doneNP)\n{if (!doneN) lumaEndN=FxaaLuma(TEXTUREFUNC(textureSampler,posN.xy,0.0));if (!doneP) lumaEndP=FxaaLuma(TEXTUREFUNC(textureSampler,posP.xy,0.0));if (!doneN) lumaEndN=lumaEndN-lumaNN*0.5;if (!doneP) lumaEndP=lumaEndP-lumaNN*0.5;doneN=abs(lumaEndN)>=gradientScaled;doneP=abs(lumaEndP)>=gradientScaled;if (!doneN) posN.x-=offNP.x*12.0;if (!doneN) posN.y-=offNP.y*12.0;doneNP=(!doneN) || (!doneP);if (!doneP) posP.x+=offNP.x*12.0;if (!doneP) posP.y+=offNP.y*12.0;}\nfloat dstN=posM.x-posN.x;float dstP=posP.x-posM.x;if (!horzSpan)\n{dstN=posM.y-posN.y;}\nif (!horzSpan) \n{dstP=posP.y-posM.y;}\nbool goodSpanN=(lumaEndN<0.0) != lumaMLTZero;float spanLength=(dstP+dstN);bool goodSpanP=(lumaEndP<0.0) != lumaMLTZero;float spanLengthRcp=1.0/spanLength;bool directionN=dstN {\n const h = this.texelSize;\n c.setFloat2(\"texelSize\", h.x, h.y);\n });\n }\n _getDefines() {\n const e = this.getEngine();\n if (!e)\n return null;\n const t = e.getGlInfo();\n return t && t.renderer && t.renderer.toLowerCase().indexOf(\"mali\") > -1 ? `#define MALI 1\n` : null;\n }\n /**\n * @internal\n */\n static _Parse(e, t, i, r) {\n return Le.Parse(() => new Kc(e.name, e.options, t, e.renderTargetSamplingMode, i.getEngine(), e.reusable), e, i, r);\n }\n}\nRe(\"BABYLON.FxaaPostProcess\", Kc);\nlet Ys = null;\nfunction uE(n, e, t, i, r = \"image/png\", s = !1, a) {\n const { height: o, width: l } = fE(n, e, t);\n if (!(o && l)) {\n ne.Error(\"Invalid 'size' parameter !\");\n return;\n }\n Ys || (Ys = document.createElement(\"canvas\")), Ys.width = l, Ys.height = o;\n const c = Ys.getContext(\"2d\"), h = n.getRenderWidth() / n.getRenderHeight();\n let u = l, f = u / h;\n f > o && (f = o, u = f * h);\n const d = Math.max(0, l - u) / 2, p = Math.max(0, o - f) / 2;\n e.getScene().activeCamera !== e ? wf(n, e, t, (m) => {\n if (s) {\n const v = new Blob([m]);\n ge.DownloadBlob(v), i && i(\"\");\n } else\n i && i(m);\n }, r, 1, n.getCreationOptions().antialias, void 0, void 0, void 0, void 0, a) : n.onEndFrameObservable.addOnce(() => {\n const m = n.getRenderingCanvas();\n c && m && c.drawImage(m, d, p, u, f), Ys && (s ? (ge.EncodeScreenshotCanvasData(Ys, void 0, r, void 0, a), i && i(\"\")) : ge.EncodeScreenshotCanvasData(Ys, i, r, void 0, a));\n });\n}\nfunction EN(n, e, t, i = \"image/png\", r) {\n return new Promise((s, a) => {\n uE(n, e, t, (o) => {\n typeof o < \"u\" ? s(o) : a(new Error(\"Data is undefined\"));\n }, i, void 0, r);\n });\n}\nfunction wf(n, e, t, i, r = \"image/png\", s = 1, a = !1, o, l = !1, c = !1, h = !0, u, f) {\n const { height: d, width: p, finalWidth: g, finalHeight: m } = fE(n, e, t), v = { width: p, height: d };\n if (!(d && p)) {\n ne.Error(\"Invalid 'size' parameter !\");\n return;\n }\n const E = { width: n.getRenderWidth(), height: n.getRenderHeight() };\n n.setSize(p, d);\n const C = e.getScene(), T = new gr(\"screenShot\", v, C, !1, !1, 0, !1, le.BILINEAR_SAMPLINGMODE, void 0, c, void 0, void 0, void 0, s);\n T.renderList = C.meshes.slice(), T.samples = s, T.renderSprites = l, T.activeCamera = e, T.forceLayerMaskCheck = h, f == null || f(T);\n const R = () => {\n T.isReadyForRendering() && e.isReady(!0) ? (n.onEndFrameObservable.addOnce(() => {\n g === p && m === d ? T.readPixels(void 0, void 0, void 0, !1).then((S) => {\n Ni.DumpData(p, d, S, i, r, o, !0, void 0, u), T.dispose();\n }) : Rf(\"pass\", T.getInternalTexture(), C, void 0, void 0, void 0, g, m).then((S) => {\n n._readTexturePixels(S, g, m, -1, 0, null, !0, !1, 0, 0).then((M) => {\n Ni.DumpData(g, m, M, i, r, o, !0, void 0, u), S.dispose();\n });\n });\n }), T.render(!0), C.incrementRenderId(), C.resetCachedMaterial(), n.setSize(E.width, E.height), e.getProjectionMatrix(!0), C.render()) : setTimeout(R, 16);\n }, x = () => {\n C.incrementRenderId(), C.resetCachedMaterial(), R();\n };\n if (a) {\n const S = new Kc(\"antialiasing\", 1, C.activeCamera);\n T.addPostProcess(S), S.getEffect().isReady() ? x() : S.getEffect().onCompiled = () => {\n x();\n };\n } else\n x();\n}\nfunction vN(n, e, t, i = \"image/png\", r = 1, s = !1, a, o = !1, l = !1, c = !0, h) {\n return new Promise((u, f) => {\n wf(n, e, t, (d) => {\n typeof d < \"u\" ? u(d) : f(new Error(\"Data is undefined\"));\n }, i, r, s, a, o, l, c, h);\n });\n}\nfunction fE(n, e, t) {\n let i = 0, r = 0, s = 0, a = 0;\n if (typeof t == \"object\") {\n const o = t.precision ? Math.abs(t.precision) : 1;\n t.width && t.height ? (i = t.height * o, r = t.width * o) : t.width && !t.height ? (r = t.width * o, i = Math.round(r / n.getAspectRatio(e))) : t.height && !t.width ? (i = t.height * o, r = Math.round(i * n.getAspectRatio(e))) : (r = Math.round(n.getRenderWidth() * o), i = Math.round(r / n.getAspectRatio(e))), t.finalWidth && t.finalHeight ? (a = t.finalHeight, s = t.finalWidth) : t.finalWidth && !t.finalHeight ? (s = t.finalWidth, a = Math.round(s / n.getAspectRatio(e))) : t.finalHeight && !t.finalWidth ? (a = t.finalHeight, s = Math.round(a * n.getAspectRatio(e))) : (s = r, a = i);\n } else\n isNaN(t) || (i = t, r = t, s = t, a = t);\n return r && (r = Math.floor(r)), i && (i = Math.floor(i)), s && (s = Math.floor(s)), a && (a = Math.floor(a)), { height: i | 0, width: r | 0, finalWidth: s | 0, finalHeight: a | 0 };\n}\nconst TN = () => {\n ge.CreateScreenshot = uE, ge.CreateScreenshotAsync = EN, ge.CreateScreenshotUsingRenderTarget = wf, ge.CreateScreenshotUsingRenderTargetAsync = vN;\n};\nTN();\nvar Hg;\n(function(n) {\n n[n.Checkbox = 0] = \"Checkbox\", n[n.Slider = 1] = \"Slider\", n[n.Vector3 = 2] = \"Vector3\", n[n.Quaternion = 3] = \"Quaternion\", n[n.Color3 = 4] = \"Color3\", n[n.String = 5] = \"String\", n[n.Button = 6] = \"Button\", n[n.Options = 7] = \"Options\", n[n.Tab = 8] = \"Tab\", n[n.FileButton = 9] = \"FileButton\", n[n.Vector2 = 10] = \"Vector2\";\n})(Hg || (Hg = {}));\nconst xN = \"minmaxReduxPixelShader\", CN = `varying vec2 vUV;uniform sampler2D textureSampler;\n#if defined(INITIAL)\nuniform sampler2D sourceTexture;uniform vec2 texSize;void main(void)\n{ivec2 coord=ivec2(vUV*(texSize-1.0));float f1=texelFetch(sourceTexture,coord,0).r;float f2=texelFetch(sourceTexture,coord+ivec2(1,0),0).r;float f3=texelFetch(sourceTexture,coord+ivec2(1,1),0).r;float f4=texelFetch(sourceTexture,coord+ivec2(0,1),0).r;float minz=min(min(min(f1,f2),f3),f4);\n#ifdef DEPTH_REDUX\nfloat maxz=max(max(max(sign(1.0-f1)*f1,sign(1.0-f2)*f2),sign(1.0-f3)*f3),sign(1.0-f4)*f4);\n#else\nfloat maxz=max(max(max(f1,f2),f3),f4);\n#endif\nglFragColor=vec4(minz,maxz,0.,0.);}\n#elif defined(MAIN)\nuniform vec2 texSize;void main(void)\n{ivec2 coord=ivec2(vUV*(texSize-1.0));vec2 f1=texelFetch(textureSampler,coord,0).rg;vec2 f2=texelFetch(textureSampler,coord+ivec2(1,0),0).rg;vec2 f3=texelFetch(textureSampler,coord+ivec2(1,1),0).rg;vec2 f4=texelFetch(textureSampler,coord+ivec2(0,1),0).rg;float minz=min(min(min(f1.x,f2.x),f3.x),f4.x);float maxz=max(max(max(f1.y,f2.y),f3.y),f4.y);glFragColor=vec4(minz,maxz,0.,0.);}\n#elif defined(ONEBEFORELAST)\nuniform ivec2 texSize;void main(void)\n{ivec2 coord=ivec2(vUV*vec2(texSize-1));vec2 f1=texelFetch(textureSampler,coord % texSize,0).rg;vec2 f2=texelFetch(textureSampler,(coord+ivec2(1,0)) % texSize,0).rg;vec2 f3=texelFetch(textureSampler,(coord+ivec2(1,1)) % texSize,0).rg;vec2 f4=texelFetch(textureSampler,(coord+ivec2(0,1)) % texSize,0).rg;float minz=min(f1.x,f2.x);float maxz=max(f1.y,f2.y);glFragColor=vec4(minz,maxz,0.,0.);}\n#elif defined(LAST)\nvoid main(void)\n{glFragColor=vec4(0.);if (true) { \ndiscard;}}\n#endif\n`;\nY.ShadersStore[xN] = CN;\nconst RN = \"packingFunctions\", SN = `vec4 pack(float depth)\n{const vec4 bit_shift=vec4(255.0*255.0*255.0,255.0*255.0,255.0,1.0);const vec4 bit_mask=vec4(0.0,1.0/255.0,1.0/255.0,1.0/255.0);vec4 res=fract(depth*bit_shift);res-=res.xxyz*bit_mask;return res;}\nfloat unpack(vec4 color)\n{const vec4 bit_shift=vec4(1.0/(255.0*255.0*255.0),1.0/(255.0*255.0),1.0/255.0,1.0);return dot(color,bit_shift);}`;\nY.IncludesShadersStore[RN] = SN;\nconst yN = \"depthPixelShader\", IN = `#ifdef ALPHATEST\nvarying vec2 vUV;uniform sampler2D diffuseSampler;\n#endif\n#include\nvarying float vDepthMetric;\n#ifdef PACKED\n#include\n#endif\n#ifdef STORE_CAMERASPACE_Z\nvarying vec4 vViewPos;\n#endif\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void)\n{\n#include\n#ifdef ALPHATEST\nif (texture2D(diffuseSampler,vUV).a<0.4)\ndiscard;\n#endif\n#ifdef STORE_CAMERASPACE_Z\n#ifdef PACKED\ngl_FragColor=pack(vViewPos.z);\n#else\ngl_FragColor=vec4(vViewPos.z,0.0,0.0,1.0);\n#endif\n#else\n#ifdef NONLINEARDEPTH\n#ifdef PACKED\ngl_FragColor=pack(gl_FragCoord.z);\n#else\ngl_FragColor=vec4(gl_FragCoord.z,0.0,0.0,0.0);\n#endif\n#else\n#ifdef PACKED\ngl_FragColor=pack(vDepthMetric);\n#else\ngl_FragColor=vec4(vDepthMetric,0.0,0.0,1.0);\n#endif\n#endif\n#endif\n}`;\nY.ShadersStore[yN] = IN;\nconst bN = \"pointCloudVertexDeclaration\", AN = `#ifdef POINTSIZE\nuniform float pointSize;\n#endif\n`;\nY.IncludesShadersStore[bN] = AN;\nconst MN = \"depthVertexShader\", PN = `attribute vec3 position;\n#include\n#include\n#include\n#include[0..maxSimultaneousMorphTargets]\n#include\n#include\nuniform mat4 viewProjection;uniform vec2 depthValues;\n#if defined(ALPHATEST) || defined(NEED_UV)\nvarying vec2 vUV;uniform mat4 diffuseMatrix;\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#ifdef UV2\nattribute vec2 uv2;\n#endif\n#endif\n#ifdef STORE_CAMERASPACE_Z\nuniform mat4 view;varying vec4 vViewPos;\n#endif\n#include\nvarying float vDepthMetric;\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void)\n{vec3 positionUpdated=position;\n#ifdef UV1\nvec2 uvUpdated=uv;\n#endif\n#include\n#include[0..maxSimultaneousMorphTargets]\n#include\n#include\n#include\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\n#include\ngl_Position=viewProjection*worldPos;\n#ifdef STORE_CAMERASPACE_Z\nvViewPos=view*worldPos;\n#else\n#ifdef USE_REVERSE_DEPTHBUFFER\nvDepthMetric=((-gl_Position.z+depthValues.x)/(depthValues.y));\n#else\nvDepthMetric=((gl_Position.z+depthValues.x)/(depthValues.y));\n#endif\n#endif\n#if defined(ALPHATEST) || defined(BASIC_RENDER)\n#ifdef UV1\nvUV=vec2(diffuseMatrix*vec4(uvUpdated,1.0,0.0));\n#endif\n#ifdef UV2\nvUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0));\n#endif\n#endif\n#include\n}\n`;\nY.ShadersStore[MN] = PN;\nclass Kg {\n static _GetStorage() {\n try {\n return localStorage.setItem(\"test\", \"\"), localStorage.removeItem(\"test\"), localStorage;\n } catch {\n const e = {};\n return {\n getItem: (t) => {\n const i = e[t];\n return i === void 0 ? null : i;\n },\n setItem: (t, i) => {\n e[t] = i;\n }\n };\n }\n }\n /**\n * Reads a string from the data storage\n * @param key The key to read\n * @param defaultValue The value if the key doesn't exist\n * @returns The string value\n */\n static ReadString(e, t) {\n const i = this._Storage.getItem(e);\n return i !== null ? i : t;\n }\n /**\n * Writes a string to the data storage\n * @param key The key to write\n * @param value The value to write\n */\n static WriteString(e, t) {\n this._Storage.setItem(e, t);\n }\n /**\n * Reads a boolean from the data storage\n * @param key The key to read\n * @param defaultValue The value if the key doesn't exist\n * @returns The boolean value\n */\n static ReadBoolean(e, t) {\n const i = this._Storage.getItem(e);\n return i !== null ? i === \"true\" : t;\n }\n /**\n * Writes a boolean to the data storage\n * @param key The key to write\n * @param value The value to write\n */\n static WriteBoolean(e, t) {\n this._Storage.setItem(e, t ? \"true\" : \"false\");\n }\n /**\n * Reads a number from the data storage\n * @param key The key to read\n * @param defaultValue The value if the key doesn't exist\n * @returns The number value\n */\n static ReadNumber(e, t) {\n const i = this._Storage.getItem(e);\n return i !== null ? parseFloat(i) : t;\n }\n /**\n * Writes a number to the data storage\n * @param key The key to write\n * @param value The value to write\n */\n static WriteNumber(e, t) {\n this._Storage.setItem(e, t.toString());\n }\n}\nKg._Storage = Kg._GetStorage();\nclass tt extends Ai {\n /**\n * Defines how far from the source the light is impacting in scene units.\n * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff.\n */\n get range() {\n return this._range;\n }\n /**\n * Defines how far from the source the light is impacting in scene units.\n * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff.\n */\n set range(e) {\n this._range = e, this._inverseSquaredRange = 1 / (this.range * this.range);\n }\n /**\n * Gets the photometric scale used to interpret the intensity.\n * This is only relevant with PBR Materials where the light intensity can be defined in a physical way.\n */\n get intensityMode() {\n return this._intensityMode;\n }\n /**\n * Sets the photometric scale used to interpret the intensity.\n * This is only relevant with PBR Materials where the light intensity can be defined in a physical way.\n */\n set intensityMode(e) {\n this._intensityMode = e, this._computePhotometricScale();\n }\n /**\n * Gets the light radius used by PBR Materials to simulate soft area lights.\n */\n get radius() {\n return this._radius;\n }\n /**\n * sets the light radius used by PBR Materials to simulate soft area lights.\n */\n set radius(e) {\n this._radius = e, this._computePhotometricScale();\n }\n /**\n * Gets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching\n * the current shadow generator.\n */\n get shadowEnabled() {\n return this._shadowEnabled;\n }\n /**\n * Sets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching\n * the current shadow generator.\n */\n set shadowEnabled(e) {\n this._shadowEnabled !== e && (this._shadowEnabled = e, this._markMeshesAsLightDirty());\n }\n /**\n * Gets the only meshes impacted by this light.\n */\n get includedOnlyMeshes() {\n return this._includedOnlyMeshes;\n }\n /**\n * Sets the only meshes impacted by this light.\n */\n set includedOnlyMeshes(e) {\n this._includedOnlyMeshes = e, this._hookArrayForIncludedOnly(e);\n }\n /**\n * Gets the meshes not impacted by this light.\n */\n get excludedMeshes() {\n return this._excludedMeshes;\n }\n /**\n * Sets the meshes not impacted by this light.\n */\n set excludedMeshes(e) {\n this._excludedMeshes = e, this._hookArrayForExcluded(e);\n }\n /**\n * Gets the layer id use to find what meshes are not impacted by the light.\n * Inactive if 0\n */\n get excludeWithLayerMask() {\n return this._excludeWithLayerMask;\n }\n /**\n * Sets the layer id use to find what meshes are not impacted by the light.\n * Inactive if 0\n */\n set excludeWithLayerMask(e) {\n this._excludeWithLayerMask = e, this._resyncMeshes();\n }\n /**\n * Gets the layer id use to find what meshes are impacted by the light.\n * Inactive if 0\n */\n get includeOnlyWithLayerMask() {\n return this._includeOnlyWithLayerMask;\n }\n /**\n * Sets the layer id use to find what meshes are impacted by the light.\n * Inactive if 0\n */\n set includeOnlyWithLayerMask(e) {\n this._includeOnlyWithLayerMask = e, this._resyncMeshes();\n }\n /**\n * Gets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x)\n */\n get lightmapMode() {\n return this._lightmapMode;\n }\n /**\n * Sets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x)\n */\n set lightmapMode(e) {\n this._lightmapMode !== e && (this._lightmapMode = e, this._markMeshesAsLightDirty());\n }\n /**\n * Returns the view matrix.\n * @param _faceIndex The index of the face for which we want to extract the view matrix. Only used for point light types.\n * @returns The view matrix. Can be null, if a view matrix cannot be defined for the type of light considered (as for a hemispherical light, for example).\n */\n getViewMatrix(e) {\n return null;\n }\n /**\n * Returns the projection matrix.\n * Note that viewMatrix and renderList are optional and are only used by lights that calculate the projection matrix from a list of meshes (e.g. directional lights with automatic extents calculation).\n * @param _viewMatrix The view transform matrix of the light (optional).\n * @param _renderList The list of meshes to take into account when calculating the projection matrix (optional).\n * @returns The projection matrix. Can be null, if a projection matrix cannot be defined for the type of light considered (as for a hemispherical light, for example).\n */\n getProjectionMatrix(e, t) {\n return null;\n }\n /**\n * Creates a Light object in the scene.\n * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction\n * @param name The friendly name of the light\n * @param scene The scene the light belongs too\n */\n constructor(e, t) {\n super(e, t), this.diffuse = new Ne(1, 1, 1), this.specular = new Ne(1, 1, 1), this.falloffType = tt.FALLOFF_DEFAULT, this.intensity = 1, this._range = Number.MAX_VALUE, this._inverseSquaredRange = 0, this._photometricScale = 1, this._intensityMode = tt.INTENSITYMODE_AUTOMATIC, this._radius = 1e-5, this.renderPriority = 0, this._shadowEnabled = !0, this._excludeWithLayerMask = 0, this._includeOnlyWithLayerMask = 0, this._lightmapMode = 0, this._shadowGenerators = null, this._excludedMeshesIds = new Array(), this._includedOnlyMeshesIds = new Array(), this._isLight = !0, this.getScene().addLight(this), this._uniformBuffer = new Ie(this.getScene().getEngine(), void 0, void 0, e), this._buildUniformLayout(), this.includedOnlyMeshes = [], this.excludedMeshes = [], this._resyncMeshes();\n }\n /**\n * Sets the passed Effect \"effect\" with the Light textures.\n * @param effect The effect to update\n * @param lightIndex The index of the light in the effect to update\n * @returns The light\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n transferTexturesToEffect(e, t) {\n return this;\n }\n /**\n * Binds the lights information from the scene to the effect for the given mesh.\n * @param lightIndex Light index\n * @param scene The scene where the light belongs to\n * @param effect The effect we are binding the data to\n * @param useSpecular Defines if specular is supported\n * @param receiveShadows Defines if the effect (mesh) we bind the light for receives shadows\n */\n _bindLight(e, t, i, r, s = !0) {\n const a = e.toString();\n let o = !1;\n if (this._uniformBuffer.bindToEffect(i, \"Light\" + a), this._renderId !== t.getRenderId() || this._lastUseSpecular !== r || !this._uniformBuffer.useUbo) {\n this._renderId = t.getRenderId(), this._lastUseSpecular = r;\n const l = this.getScaledIntensity();\n this.transferToEffect(i, a), this.diffuse.scaleToRef(l, Zr.Color3[0]), this._uniformBuffer.updateColor4(\"vLightDiffuse\", Zr.Color3[0], this.range, a), r && (this.specular.scaleToRef(l, Zr.Color3[1]), this._uniformBuffer.updateColor4(\"vLightSpecular\", Zr.Color3[1], this.radius, a)), o = !0;\n }\n if (this.transferTexturesToEffect(i, a), t.shadowsEnabled && this.shadowEnabled && s) {\n const l = this.getShadowGenerator(t.activeCamera) ?? this.getShadowGenerator();\n l && (l.bindShadowLight(a, i), o = !0);\n }\n o ? this._uniformBuffer.update() : this._uniformBuffer.bindUniformBuffer();\n }\n /**\n * Returns the string \"Light\".\n * @returns the class name\n */\n getClassName() {\n return \"Light\";\n }\n /**\n * Converts the light information to a readable string for debug purpose.\n * @param fullDetails Supports for multiple levels of logging within scene loading\n * @returns the human readable light info\n */\n toString(e) {\n let t = \"Name: \" + this.name;\n if (t += \", type: \" + [\"Point\", \"Directional\", \"Spot\", \"Hemispheric\"][this.getTypeID()], this.animations)\n for (let i = 0; i < this.animations.length; i++)\n t += \", animation[0]: \" + this.animations[i].toString(e);\n return t;\n }\n /** @internal */\n _syncParentEnabledState() {\n super._syncParentEnabledState(), this.isDisposed() || this._resyncMeshes();\n }\n /**\n * Set the enabled state of this node.\n * @param value - the new enabled state\n */\n setEnabled(e) {\n super.setEnabled(e), this._resyncMeshes();\n }\n /**\n * Returns the Light associated shadow generator if any.\n * @param camera Camera for which the shadow generator should be retrieved (default: null). If null, retrieves the default shadow generator\n * @returns the associated shadow generator.\n */\n getShadowGenerator(e = null) {\n return this._shadowGenerators === null ? null : this._shadowGenerators.get(e) ?? null;\n }\n /**\n * Returns all the shadow generators associated to this light\n * @returns\n */\n getShadowGenerators() {\n return this._shadowGenerators;\n }\n /**\n * Returns a Vector3, the absolute light position in the World.\n * @returns the world space position of the light\n */\n getAbsolutePosition() {\n return _.Zero();\n }\n /**\n * Specifies if the light will affect the passed mesh.\n * @param mesh The mesh to test against the light\n * @returns true the mesh is affected otherwise, false.\n */\n canAffectMesh(e) {\n return e ? !(this.includedOnlyMeshes && this.includedOnlyMeshes.length > 0 && this.includedOnlyMeshes.indexOf(e) === -1 || this.excludedMeshes && this.excludedMeshes.length > 0 && this.excludedMeshes.indexOf(e) !== -1 || this.includeOnlyWithLayerMask !== 0 && !(this.includeOnlyWithLayerMask & e.layerMask) || this.excludeWithLayerMask !== 0 && this.excludeWithLayerMask & e.layerMask) : !0;\n }\n /**\n * Releases resources associated with this node.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n if (this._shadowGenerators) {\n const i = this._shadowGenerators.values();\n for (let r = i.next(); r.done !== !0; r = i.next())\n r.value.dispose();\n this._shadowGenerators = null;\n }\n if (this.getScene().stopAnimation(this), this._parentContainer) {\n const i = this._parentContainer.lights.indexOf(this);\n i > -1 && this._parentContainer.lights.splice(i, 1), this._parentContainer = null;\n }\n for (const i of this.getScene().meshes)\n i._removeLightSource(this, !0);\n this._uniformBuffer.dispose(), this.getScene().removeLight(this), super.dispose(e, t);\n }\n /**\n * Returns the light type ID (integer).\n * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x\n */\n getTypeID() {\n return 0;\n }\n /**\n * Returns the intensity scaled by the Photometric Scale according to the light type and intensity mode.\n * @returns the scaled intensity in intensity mode unit\n */\n getScaledIntensity() {\n return this._photometricScale * this.intensity;\n }\n /**\n * Returns a new Light object, named \"name\", from the current one.\n * @param name The name of the cloned light\n * @param newParent The parent of this light, if it has one\n * @returns the new created light\n */\n clone(e, t = null) {\n const i = tt.GetConstructorFromName(this.getTypeID(), e, this.getScene());\n if (!i)\n return null;\n const r = Le.Clone(i, this);\n return e && (r.name = e), t && (r.parent = t), r.setEnabled(this.isEnabled()), this.onClonedObservable.notifyObservers(r), r;\n }\n /**\n * Serializes the current light into a Serialization object.\n * @returns the serialized object.\n */\n serialize() {\n const e = Le.Serialize(this);\n return e.uniqueId = this.uniqueId, e.type = this.getTypeID(), this.parent && this.parent._serializeAsParent(e), this.excludedMeshes.length > 0 && (e.excludedMeshesIds = [], this.excludedMeshes.forEach((t) => {\n e.excludedMeshesIds.push(t.id);\n })), this.includedOnlyMeshes.length > 0 && (e.includedOnlyMeshesIds = [], this.includedOnlyMeshes.forEach((t) => {\n e.includedOnlyMeshesIds.push(t.id);\n })), Le.AppendSerializedAnimations(this, e), e.ranges = this.serializeAnimationRanges(), e.isEnabled = this.isEnabled(), e;\n }\n /**\n * Creates a new typed light from the passed type (integer) : point light = 0, directional light = 1, spot light = 2, hemispheric light = 3.\n * This new light is named \"name\" and added to the passed scene.\n * @param type Type according to the types available in Light.LIGHTTYPEID_x\n * @param name The friendly name of the light\n * @param scene The scene the new light will belong to\n * @returns the constructor function\n */\n static GetConstructorFromName(e, t, i) {\n const r = Ai.Construct(\"Light_Type_\" + e, t, i);\n return r || null;\n }\n /**\n * Parses the passed \"parsedLight\" and returns a new instanced Light from this parsing.\n * @param parsedLight The JSON representation of the light\n * @param scene The scene to create the parsed light in\n * @returns the created light after parsing\n */\n static Parse(e, t) {\n const i = tt.GetConstructorFromName(e.type, e.name, t);\n if (!i)\n return null;\n const r = Le.Parse(i, e, t);\n if (e.excludedMeshesIds && (r._excludedMeshesIds = e.excludedMeshesIds), e.includedOnlyMeshesIds && (r._includedOnlyMeshesIds = e.includedOnlyMeshesIds), e.parentId !== void 0 && (r._waitingParentId = e.parentId), e.parentInstanceIndex !== void 0 && (r._waitingParentInstanceIndex = e.parentInstanceIndex), e.falloffType !== void 0 && (r.falloffType = e.falloffType), e.lightmapMode !== void 0 && (r.lightmapMode = e.lightmapMode), e.animations) {\n for (let s = 0; s < e.animations.length; s++) {\n const a = e.animations[s], o = mr(\"BABYLON.Animation\");\n o && r.animations.push(o.Parse(a));\n }\n Ai.ParseAnimationRanges(r, e, t);\n }\n return e.autoAnimate && t.beginAnimation(r, e.autoAnimateFrom, e.autoAnimateTo, e.autoAnimateLoop, e.autoAnimateSpeed || 1), e.isEnabled !== void 0 && r.setEnabled(e.isEnabled), r;\n }\n _hookArrayForExcluded(e) {\n const t = e.push;\n e.push = (...r) => {\n const s = t.apply(e, r);\n for (const a of r)\n a._resyncLightSource(this);\n return s;\n };\n const i = e.splice;\n e.splice = (r, s) => {\n const a = i.apply(e, [r, s]);\n for (const o of a)\n o._resyncLightSource(this);\n return a;\n };\n for (const r of e)\n r._resyncLightSource(this);\n }\n _hookArrayForIncludedOnly(e) {\n const t = e.push;\n e.push = (...r) => {\n const s = t.apply(e, r);\n return this._resyncMeshes(), s;\n };\n const i = e.splice;\n e.splice = (r, s) => {\n const a = i.apply(e, [r, s]);\n return this._resyncMeshes(), a;\n }, this._resyncMeshes();\n }\n _resyncMeshes() {\n for (const e of this.getScene().meshes)\n e._resyncLightSource(this);\n }\n /**\n * Forces the meshes to update their light related information in their rendering used effects\n * @internal Internal Use Only\n */\n _markMeshesAsLightDirty() {\n for (const e of this.getScene().meshes)\n e.lightSources.indexOf(this) !== -1 && e._markSubMeshesAsLightDirty();\n }\n /**\n * Recomputes the cached photometric scale if needed.\n */\n _computePhotometricScale() {\n this._photometricScale = this._getPhotometricScale(), this.getScene().resetCachedMaterial();\n }\n /**\n * @returns the Photometric Scale according to the light type and intensity mode.\n */\n _getPhotometricScale() {\n let e = 0;\n const t = this.getTypeID();\n let i = this.intensityMode;\n switch (i === tt.INTENSITYMODE_AUTOMATIC && (t === tt.LIGHTTYPEID_DIRECTIONALLIGHT ? i = tt.INTENSITYMODE_ILLUMINANCE : i = tt.INTENSITYMODE_LUMINOUSINTENSITY), t) {\n case tt.LIGHTTYPEID_POINTLIGHT:\n case tt.LIGHTTYPEID_SPOTLIGHT:\n switch (i) {\n case tt.INTENSITYMODE_LUMINOUSPOWER:\n e = 1 / (4 * Math.PI);\n break;\n case tt.INTENSITYMODE_LUMINOUSINTENSITY:\n e = 1;\n break;\n case tt.INTENSITYMODE_LUMINANCE:\n e = this.radius * this.radius;\n break;\n }\n break;\n case tt.LIGHTTYPEID_DIRECTIONALLIGHT:\n switch (i) {\n case tt.INTENSITYMODE_ILLUMINANCE:\n e = 1;\n break;\n case tt.INTENSITYMODE_LUMINANCE: {\n let r = this.radius;\n r = Math.max(r, 1e-3), e = 2 * Math.PI * (1 - Math.cos(r));\n break;\n }\n }\n break;\n case tt.LIGHTTYPEID_HEMISPHERICLIGHT:\n e = 1;\n break;\n }\n return e;\n }\n /**\n * Reorder the light in the scene according to their defined priority.\n * @internal Internal Use Only\n */\n _reorderLightsInScene() {\n const e = this.getScene();\n this._renderPriority != 0 && (e.requireLightSorting = !0), this.getScene().sortLightsByPriority();\n }\n}\ntt.FALLOFF_DEFAULT = Et.FALLOFF_DEFAULT;\ntt.FALLOFF_PHYSICAL = Et.FALLOFF_PHYSICAL;\ntt.FALLOFF_GLTF = Et.FALLOFF_GLTF;\ntt.FALLOFF_STANDARD = Et.FALLOFF_STANDARD;\ntt.LIGHTMAP_DEFAULT = Et.LIGHTMAP_DEFAULT;\ntt.LIGHTMAP_SPECULAR = Et.LIGHTMAP_SPECULAR;\ntt.LIGHTMAP_SHADOWSONLY = Et.LIGHTMAP_SHADOWSONLY;\ntt.INTENSITYMODE_AUTOMATIC = Et.INTENSITYMODE_AUTOMATIC;\ntt.INTENSITYMODE_LUMINOUSPOWER = Et.INTENSITYMODE_LUMINOUSPOWER;\ntt.INTENSITYMODE_LUMINOUSINTENSITY = Et.INTENSITYMODE_LUMINOUSINTENSITY;\ntt.INTENSITYMODE_ILLUMINANCE = Et.INTENSITYMODE_ILLUMINANCE;\ntt.INTENSITYMODE_LUMINANCE = Et.INTENSITYMODE_LUMINANCE;\ntt.LIGHTTYPEID_POINTLIGHT = Et.LIGHTTYPEID_POINTLIGHT;\ntt.LIGHTTYPEID_DIRECTIONALLIGHT = Et.LIGHTTYPEID_DIRECTIONALLIGHT;\ntt.LIGHTTYPEID_SPOTLIGHT = Et.LIGHTTYPEID_SPOTLIGHT;\ntt.LIGHTTYPEID_HEMISPHERICLIGHT = Et.LIGHTTYPEID_HEMISPHERICLIGHT;\nP([\n $i()\n], tt.prototype, \"diffuse\", void 0);\nP([\n $i()\n], tt.prototype, \"specular\", void 0);\nP([\n U()\n], tt.prototype, \"falloffType\", void 0);\nP([\n U()\n], tt.prototype, \"intensity\", void 0);\nP([\n U()\n], tt.prototype, \"range\", null);\nP([\n U()\n], tt.prototype, \"intensityMode\", null);\nP([\n U()\n], tt.prototype, \"radius\", null);\nP([\n U()\n], tt.prototype, \"_renderPriority\", void 0);\nP([\n oe(\"_reorderLightsInScene\")\n], tt.prototype, \"renderPriority\", void 0);\nP([\n U(\"shadowEnabled\")\n], tt.prototype, \"_shadowEnabled\", void 0);\nP([\n U(\"excludeWithLayerMask\")\n], tt.prototype, \"_excludeWithLayerMask\", void 0);\nP([\n U(\"includeOnlyWithLayerMask\")\n], tt.prototype, \"_includeOnlyWithLayerMask\", void 0);\nP([\n U(\"lightmapMode\")\n], tt.prototype, \"_lightmapMode\", void 0);\nclass Wt extends Ai {\n /** @internal */\n get _matrix() {\n return this._compose(), this._localMatrix;\n }\n /** @internal */\n set _matrix(e) {\n e.updateFlag === this._localMatrix.updateFlag && !this._needToCompose || (this._needToCompose = !1, this._localMatrix.copyFrom(e), this._markAsDirtyAndDecompose());\n }\n /**\n * Create a new bone\n * @param name defines the bone name\n * @param skeleton defines the parent skeleton\n * @param parentBone defines the parent (can be null if the bone is the root)\n * @param localMatrix defines the local matrix (default: identity)\n * @param restMatrix defines the rest matrix (default: localMatrix)\n * @param bindMatrix defines the bind matrix (default: localMatrix)\n * @param index defines index of the bone in the hierarchy (default: null)\n */\n constructor(e, t, i = null, r = null, s = null, a = null, o = null) {\n super(e, t.getScene()), this.name = e, this.children = [], this.animations = [], this._index = null, this._scalingDeterminant = 1, this._needToDecompose = !0, this._needToCompose = !1, this._linkedTransformNode = null, this._waitingTransformNodeId = null, this._skeleton = t, this._localMatrix = (r == null ? void 0 : r.clone()) ?? w.Identity(), this._restMatrix = s ?? this._localMatrix.clone(), this._bindMatrix = a ?? this._localMatrix.clone(), this._index = o, this._absoluteMatrix = new w(), this._absoluteBindMatrix = new w(), this._absoluteInverseBindMatrix = new w(), this._finalMatrix = new w(), t.bones.push(this), this.setParent(i, !1), this._updateAbsoluteBindMatrices();\n }\n /**\n * Gets the current object class name.\n * @returns the class name\n */\n getClassName() {\n return \"Bone\";\n }\n // Members\n /**\n * Gets the parent skeleton\n * @returns a skeleton\n */\n getSkeleton() {\n return this._skeleton;\n }\n get parent() {\n return this._parentNode;\n }\n /**\n * Gets parent bone\n * @returns a bone or null if the bone is the root of the bone hierarchy\n */\n getParent() {\n return this.parent;\n }\n /**\n * Returns an array containing the children of the bone\n * @returns an array containing the children of the bone (can be empty if the bone has no children)\n */\n getChildren() {\n return this.children;\n }\n /**\n * Gets the node index in matrix array generated for rendering\n * @returns the node index\n */\n getIndex() {\n return this._index === null ? this.getSkeleton().bones.indexOf(this) : this._index;\n }\n set parent(e) {\n this.setParent(e);\n }\n /**\n * Sets the parent bone\n * @param parent defines the parent (can be null if the bone is the root)\n * @param updateAbsoluteBindMatrices defines if the absolute bind and absolute inverse bind matrices must be updated\n */\n setParent(e, t = !0) {\n if (this.parent !== e) {\n if (this.parent) {\n const i = this.parent.children.indexOf(this);\n i !== -1 && this.parent.children.splice(i, 1);\n }\n this._parentNode = e, this.parent && this.parent.children.push(this), t && this._updateAbsoluteBindMatrices(), this.markAsDirty();\n }\n }\n /**\n * Gets the local matrix\n * @returns the local matrix\n */\n getLocalMatrix() {\n return this._compose(), this._localMatrix;\n }\n /**\n * Gets the bind matrix\n * @returns the bind matrix\n */\n getBindMatrix() {\n return this._bindMatrix;\n }\n /**\n * Gets the bind matrix.\n * @returns the bind matrix\n * @deprecated Please use getBindMatrix instead\n */\n getBaseMatrix() {\n return this.getBindMatrix();\n }\n /**\n * Gets the rest matrix\n * @returns the rest matrix\n */\n getRestMatrix() {\n return this._restMatrix;\n }\n /**\n * Gets the rest matrix\n * @returns the rest matrix\n * @deprecated Please use getRestMatrix instead\n */\n getRestPose() {\n return this.getRestMatrix();\n }\n /**\n * Sets the rest matrix\n * @param matrix the local-space rest matrix to set for this bone\n */\n setRestMatrix(e) {\n this._restMatrix.copyFrom(e);\n }\n /**\n * Sets the rest matrix\n * @param matrix the local-space rest to set for this bone\n * @deprecated Please use setRestMatrix instead\n */\n setRestPose(e) {\n this.setRestMatrix(e);\n }\n /**\n * Gets the bind matrix\n * @returns the bind matrix\n * @deprecated Please use getBindMatrix instead\n */\n getBindPose() {\n return this.getBindMatrix();\n }\n /**\n * Sets the bind matrix\n * This will trigger a recomputation of the absolute bind and absolute inverse bind matrices for this bone and its children\n * Note that the local matrix will also be set with the matrix passed in parameter!\n * @param matrix the local-space bind matrix to set for this bone\n */\n setBindMatrix(e) {\n this.updateMatrix(e);\n }\n /**\n * Sets the bind matrix\n * @param matrix the local-space bind to set for this bone\n * @deprecated Please use setBindMatrix instead\n */\n setBindPose(e) {\n this.setBindMatrix(e);\n }\n /**\n * Gets the matrix used to store the final world transformation of the bone (ie. the matrix sent to shaders)\n * @returns the final world matrix\n */\n getFinalMatrix() {\n return this._finalMatrix;\n }\n /**\n * Gets the matrix used to store the final world transformation of the bone (ie. the matrix sent to shaders)\n * @deprecated Please use getFinalMatrix instead\n * @returns the final world matrix\n */\n getWorldMatrix() {\n return this.getFinalMatrix();\n }\n /**\n * Sets the local matrix to the rest matrix\n */\n returnToRest() {\n if (this._linkedTransformNode) {\n const e = z.Vector3[0], t = z.Quaternion[0], i = z.Vector3[1];\n this.getRestMatrix().decompose(e, t, i), this._linkedTransformNode.position.copyFrom(i), this._linkedTransformNode.rotationQuaternion = this._linkedTransformNode.rotationQuaternion ?? Ce.Identity(), this._linkedTransformNode.rotationQuaternion.copyFrom(t), this._linkedTransformNode.scaling.copyFrom(e);\n } else\n this._matrix = this._restMatrix;\n }\n /**\n * Gets the inverse of the bind matrix, in world space (relative to the skeleton root)\n * @returns the inverse bind matrix, in world space\n */\n getAbsoluteInverseBindMatrix() {\n return this._absoluteInverseBindMatrix;\n }\n /**\n * Gets the inverse of the bind matrix, in world space (relative to the skeleton root)\n * @returns the inverse bind matrix, in world space\n * @deprecated Please use getAbsoluteInverseBindMatrix instead\n */\n getInvertedAbsoluteTransform() {\n return this.getAbsoluteInverseBindMatrix();\n }\n /**\n * Gets the bone matrix, in world space (relative to the skeleton root)\n * @returns the bone matrix, in world space\n */\n getAbsoluteMatrix() {\n return this._absoluteMatrix;\n }\n /**\n * Gets the bone matrix, in world space (relative to the skeleton root)\n * @returns the bone matrix, in world space\n * @deprecated Please use getAbsoluteMatrix instead\n */\n getAbsoluteTransform() {\n return this._absoluteMatrix;\n }\n /**\n * Links with the given transform node.\n * The local matrix of this bone is overwritten by the transform of the node every frame.\n * @param transformNode defines the transform node to link to\n */\n linkTransformNode(e) {\n this._linkedTransformNode && this._skeleton._numBonesWithLinkedTransformNode--, this._linkedTransformNode = e, this._linkedTransformNode && this._skeleton._numBonesWithLinkedTransformNode++;\n }\n // Properties (matches TransformNode properties)\n /**\n * Gets the node used to drive the bone's transformation\n * @returns a transform node or null\n */\n getTransformNode() {\n return this._linkedTransformNode;\n }\n /** Gets or sets current position (in local space) */\n get position() {\n return this._decompose(), this._localPosition;\n }\n set position(e) {\n this._decompose(), this._localPosition.copyFrom(e), this._markAsDirtyAndCompose();\n }\n /** Gets or sets current rotation (in local space) */\n get rotation() {\n return this.getRotation();\n }\n set rotation(e) {\n this.setRotation(e);\n }\n /** Gets or sets current rotation quaternion (in local space) */\n get rotationQuaternion() {\n return this._decompose(), this._localRotation;\n }\n set rotationQuaternion(e) {\n this.setRotationQuaternion(e);\n }\n /** Gets or sets current scaling (in local space) */\n get scaling() {\n return this.getScale();\n }\n set scaling(e) {\n this.setScale(e);\n }\n /**\n * Gets the animation properties override\n */\n get animationPropertiesOverride() {\n return this._skeleton.animationPropertiesOverride;\n }\n // Methods\n _decompose() {\n this._needToDecompose && (this._needToDecompose = !1, this._localScaling || (this._localScaling = _.Zero(), this._localRotation = Ce.Zero(), this._localPosition = _.Zero()), this._localMatrix.decompose(this._localScaling, this._localRotation, this._localPosition));\n }\n _compose() {\n if (this._needToCompose) {\n if (!this._localScaling) {\n this._needToCompose = !1;\n return;\n }\n this._needToCompose = !1, w.ComposeToRef(this._localScaling, this._localRotation, this._localPosition, this._localMatrix);\n }\n }\n /**\n * Update the bind (and optionally the local) matrix\n * @param bindMatrix defines the new matrix to set to the bind/local matrix, in local space\n * @param updateAbsoluteBindMatrices defines if the absolute bind and absolute inverse bind matrices must be recomputed (default: true)\n * @param updateLocalMatrix defines if the local matrix should also be updated with the matrix passed in parameter (default: true)\n */\n updateMatrix(e, t = !0, i = !0) {\n this._bindMatrix.copyFrom(e), t && this._updateAbsoluteBindMatrices(), i ? this._matrix = e : this.markAsDirty();\n }\n /**\n * @internal\n */\n _updateAbsoluteBindMatrices(e, t = !0) {\n if (e || (e = this._bindMatrix), this.parent ? e.multiplyToRef(this.parent._absoluteBindMatrix, this._absoluteBindMatrix) : this._absoluteBindMatrix.copyFrom(e), this._absoluteBindMatrix.invertToRef(this._absoluteInverseBindMatrix), t)\n for (let i = 0; i < this.children.length; i++)\n this.children[i]._updateAbsoluteBindMatrices();\n this._scalingDeterminant = this._absoluteBindMatrix.determinant() < 0 ? -1 : 1;\n }\n /**\n * Flag the bone as dirty (Forcing it to update everything)\n * @returns this bone\n */\n markAsDirty() {\n return this._currentRenderId++, this._childUpdateId++, this._skeleton._markAsDirty(), this;\n }\n /** @internal */\n _markAsDirtyAndCompose() {\n this.markAsDirty(), this._needToCompose = !0;\n }\n _markAsDirtyAndDecompose() {\n this.markAsDirty(), this._needToDecompose = !0;\n }\n _updatePosition(e, t = ut.LOCAL, i, r = !0) {\n const s = this.getLocalMatrix();\n if (t == ut.LOCAL)\n r ? (s.addAtIndex(12, e.x), s.addAtIndex(13, e.y), s.addAtIndex(14, e.z)) : s.setTranslationFromFloats(e.x, e.y, e.z);\n else {\n let a = null;\n i && (a = i.getWorldMatrix()), this._skeleton.computeAbsoluteMatrices();\n const o = Wt._TmpMats[0], l = Wt._TmpVecs[0];\n this.parent ? i && a ? (o.copyFrom(this.parent.getAbsoluteMatrix()), o.multiplyToRef(a, o)) : o.copyFrom(this.parent.getAbsoluteMatrix()) : w.IdentityToRef(o), r && o.setTranslationFromFloats(0, 0, 0), o.invert(), _.TransformCoordinatesToRef(e, o, l), r ? (s.addAtIndex(12, l.x), s.addAtIndex(13, l.y), s.addAtIndex(14, l.z)) : s.setTranslationFromFloats(l.x, l.y, l.z);\n }\n this._markAsDirtyAndDecompose();\n }\n /**\n * Translate the bone in local or world space\n * @param vec The amount to translate the bone\n * @param space The space that the translation is in (default: Space.LOCAL)\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n translate(e, t = ut.LOCAL, i) {\n this._updatePosition(e, t, i, !0);\n }\n /**\n * Set the position of the bone in local or world space\n * @param position The position to set the bone\n * @param space The space that the position is in (default: Space.LOCAL)\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setPosition(e, t = ut.LOCAL, i) {\n this._updatePosition(e, t, i, !1);\n }\n /**\n * Set the absolute position of the bone (world space)\n * @param position The position to set the bone\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setAbsolutePosition(e, t) {\n this.setPosition(e, ut.WORLD, t);\n }\n /**\n * Scale the bone on the x, y and z axes (in local space)\n * @param x The amount to scale the bone on the x axis\n * @param y The amount to scale the bone on the y axis\n * @param z The amount to scale the bone on the z axis\n * @param scaleChildren sets this to true if children of the bone should be scaled as well (false by default)\n */\n scale(e, t, i, r = !1) {\n const s = this.getLocalMatrix(), a = Wt._TmpMats[0];\n w.ScalingToRef(e, t, i, a), a.multiplyToRef(s, s), a.invert();\n for (const o of this.children) {\n const l = o.getLocalMatrix();\n l.multiplyToRef(a, l), l.multiplyAtIndex(12, e), l.multiplyAtIndex(13, t), l.multiplyAtIndex(14, i), o._markAsDirtyAndDecompose();\n }\n if (this._markAsDirtyAndDecompose(), r)\n for (const o of this.children)\n o.scale(e, t, i, r);\n }\n /**\n * Set the bone scaling in local space\n * @param scale defines the scaling vector\n */\n setScale(e) {\n this._decompose(), this._localScaling.copyFrom(e), this._markAsDirtyAndCompose();\n }\n /**\n * Gets the current scaling in local space\n * @returns the current scaling vector\n */\n getScale() {\n return this._decompose(), this._localScaling;\n }\n /**\n * Gets the current scaling in local space and stores it in a target vector\n * @param result defines the target vector\n */\n getScaleToRef(e) {\n this._decompose(), e.copyFrom(this._localScaling);\n }\n /**\n * Set the yaw, pitch, and roll of the bone in local or world space\n * @param yaw The rotation of the bone on the y axis\n * @param pitch The rotation of the bone on the x axis\n * @param roll The rotation of the bone on the z axis\n * @param space The space that the axes of rotation are in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setYawPitchRoll(e, t, i, r = ut.LOCAL, s) {\n if (r === ut.LOCAL) {\n const l = Wt._TmpQuat;\n Ce.RotationYawPitchRollToRef(e, t, i, l), this.setRotationQuaternion(l, r, s);\n return;\n }\n const a = Wt._TmpMats[0];\n if (!this._getAbsoluteInverseMatrixUnscaledToRef(a, s))\n return;\n const o = Wt._TmpMats[1];\n w.RotationYawPitchRollToRef(e, t, i, o), a.multiplyToRef(o, o), this._rotateWithMatrix(o, r, s);\n }\n /**\n * Add a rotation to the bone on an axis in local or world space\n * @param axis The axis to rotate the bone on\n * @param amount The amount to rotate the bone\n * @param space The space that the axis is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n rotate(e, t, i = ut.LOCAL, r) {\n const s = Wt._TmpMats[0];\n s.setTranslationFromFloats(0, 0, 0), w.RotationAxisToRef(e, t, s), this._rotateWithMatrix(s, i, r);\n }\n /**\n * Set the rotation of the bone to a particular axis angle in local or world space\n * @param axis The axis to rotate the bone on\n * @param angle The angle that the bone should be rotated to\n * @param space The space that the axis is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setAxisAngle(e, t, i = ut.LOCAL, r) {\n if (i === ut.LOCAL) {\n const o = Wt._TmpQuat;\n Ce.RotationAxisToRef(e, t, o), this.setRotationQuaternion(o, i, r);\n return;\n }\n const s = Wt._TmpMats[0];\n if (!this._getAbsoluteInverseMatrixUnscaledToRef(s, r))\n return;\n const a = Wt._TmpMats[1];\n w.RotationAxisToRef(e, t, a), s.multiplyToRef(a, a), this._rotateWithMatrix(a, i, r);\n }\n /**\n * Set the euler rotation of the bone in local or world space\n * @param rotation The euler rotation that the bone should be set to\n * @param space The space that the rotation is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setRotation(e, t = ut.LOCAL, i) {\n this.setYawPitchRoll(e.y, e.x, e.z, t, i);\n }\n /**\n * Set the quaternion rotation of the bone in local or world space\n * @param quat The quaternion rotation that the bone should be set to\n * @param space The space that the rotation is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setRotationQuaternion(e, t = ut.LOCAL, i) {\n if (t === ut.LOCAL) {\n this._decompose(), this._localRotation.copyFrom(e), this._markAsDirtyAndCompose();\n return;\n }\n const r = Wt._TmpMats[0];\n if (!this._getAbsoluteInverseMatrixUnscaledToRef(r, i))\n return;\n const s = Wt._TmpMats[1];\n w.FromQuaternionToRef(e, s), r.multiplyToRef(s, s), this._rotateWithMatrix(s, t, i);\n }\n /**\n * Set the rotation matrix of the bone in local or world space\n * @param rotMat The rotation matrix that the bone should be set to\n * @param space The space that the rotation is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setRotationMatrix(e, t = ut.LOCAL, i) {\n if (t === ut.LOCAL) {\n const a = Wt._TmpQuat;\n Ce.FromRotationMatrixToRef(e, a), this.setRotationQuaternion(a, t, i);\n return;\n }\n const r = Wt._TmpMats[0];\n if (!this._getAbsoluteInverseMatrixUnscaledToRef(r, i))\n return;\n const s = Wt._TmpMats[1];\n s.copyFrom(e), r.multiplyToRef(e, s), this._rotateWithMatrix(s, t, i);\n }\n _rotateWithMatrix(e, t = ut.LOCAL, i) {\n const r = this.getLocalMatrix(), s = r.m[12], a = r.m[13], o = r.m[14], l = this.getParent(), c = Wt._TmpMats[3], h = Wt._TmpMats[4];\n l && t == ut.WORLD ? (i ? (c.copyFrom(i.getWorldMatrix()), l.getAbsoluteMatrix().multiplyToRef(c, c)) : c.copyFrom(l.getAbsoluteMatrix()), h.copyFrom(c), h.invert(), r.multiplyToRef(c, r), r.multiplyToRef(e, r), r.multiplyToRef(h, r)) : t == ut.WORLD && i ? (c.copyFrom(i.getWorldMatrix()), h.copyFrom(c), h.invert(), r.multiplyToRef(c, r), r.multiplyToRef(e, r), r.multiplyToRef(h, r)) : r.multiplyToRef(e, r), r.setTranslationFromFloats(s, a, o), this.computeAbsoluteMatrices(), this._markAsDirtyAndDecompose();\n }\n _getAbsoluteInverseMatrixUnscaledToRef(e, t) {\n const i = Wt._TmpMats[2];\n return e.copyFrom(this.getAbsoluteMatrix()), t ? (e.multiplyToRef(t.getWorldMatrix(), e), w.ScalingToRef(t.scaling.x, t.scaling.y, t.scaling.z, i)) : w.IdentityToRef(i), e.invert(), isNaN(e.m[0]) ? !1 : (i.multiplyAtIndex(0, this._scalingDeterminant), e.multiplyToRef(i, e), !0);\n }\n /**\n * Get the position of the bone in local or world space\n * @param space The space that the returned position is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The position of the bone\n */\n getPosition(e = ut.LOCAL, t = null) {\n const i = _.Zero();\n return this.getPositionToRef(e, t, i), i;\n }\n /**\n * Copy the position of the bone to a vector3 in local or world space\n * @param space The space that the returned position is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 to copy the position to\n */\n getPositionToRef(e = ut.LOCAL, t, i) {\n if (e == ut.LOCAL) {\n const r = this.getLocalMatrix();\n i.x = r.m[12], i.y = r.m[13], i.z = r.m[14];\n } else {\n let r = null;\n t && (r = t.getWorldMatrix()), this._skeleton.computeAbsoluteMatrices();\n let s = Wt._TmpMats[0];\n t && r ? (s.copyFrom(this.getAbsoluteMatrix()), s.multiplyToRef(r, s)) : s = this.getAbsoluteMatrix(), i.x = s.m[12], i.y = s.m[13], i.z = s.m[14];\n }\n }\n /**\n * Get the absolute position of the bone (world space)\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The absolute position of the bone\n */\n getAbsolutePosition(e = null) {\n const t = _.Zero();\n return this.getPositionToRef(ut.WORLD, e, t), t;\n }\n /**\n * Copy the absolute position of the bone (world space) to the result param\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 to copy the absolute position to\n */\n getAbsolutePositionToRef(e, t) {\n this.getPositionToRef(ut.WORLD, e, t);\n }\n /**\n * Compute the absolute matrices of this bone and its children\n */\n computeAbsoluteMatrices() {\n if (this._compose(), this.parent)\n this._localMatrix.multiplyToRef(this.parent._absoluteMatrix, this._absoluteMatrix);\n else {\n this._absoluteMatrix.copyFrom(this._localMatrix);\n const i = this._skeleton.getPoseMatrix();\n i && this._absoluteMatrix.multiplyToRef(i, this._absoluteMatrix);\n }\n const e = this.children, t = e.length;\n for (let i = 0; i < t; i++)\n e[i].computeAbsoluteMatrices();\n }\n /**\n * Compute the absolute matrices of this bone and its children\n * @deprecated Please use computeAbsoluteMatrices instead\n */\n computeAbsoluteTransforms() {\n this.computeAbsoluteMatrices();\n }\n /**\n * Get the world direction from an axis that is in the local space of the bone\n * @param localAxis The local direction that is used to compute the world direction\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The world direction\n */\n getDirection(e, t = null) {\n const i = _.Zero();\n return this.getDirectionToRef(e, t, i), i;\n }\n /**\n * Copy the world direction to a vector3 from an axis that is in the local space of the bone\n * @param localAxis The local direction that is used to compute the world direction\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 that the world direction will be copied to\n */\n getDirectionToRef(e, t = null, i) {\n let r = null;\n t && (r = t.getWorldMatrix()), this._skeleton.computeAbsoluteMatrices();\n const s = Wt._TmpMats[0];\n s.copyFrom(this.getAbsoluteMatrix()), t && r && s.multiplyToRef(r, s), _.TransformNormalToRef(e, s, i), i.normalize();\n }\n /**\n * Get the euler rotation of the bone in local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The euler rotation\n */\n getRotation(e = ut.LOCAL, t = null) {\n const i = _.Zero();\n return this.getRotationToRef(e, t, i), i;\n }\n /**\n * Copy the euler rotation of the bone to a vector3. The rotation can be in either local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 that the rotation should be copied to\n */\n getRotationToRef(e = ut.LOCAL, t = null, i) {\n const r = Wt._TmpQuat;\n this.getRotationQuaternionToRef(e, t, r), r.toEulerAnglesToRef(i);\n }\n /**\n * Get the quaternion rotation of the bone in either local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The quaternion rotation\n */\n getRotationQuaternion(e = ut.LOCAL, t = null) {\n const i = Ce.Identity();\n return this.getRotationQuaternionToRef(e, t, i), i;\n }\n /**\n * Copy the quaternion rotation of the bone to a quaternion. The rotation can be in either local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The quaternion that the rotation should be copied to\n */\n getRotationQuaternionToRef(e = ut.LOCAL, t = null, i) {\n if (e == ut.LOCAL)\n this._decompose(), i.copyFrom(this._localRotation);\n else {\n const r = Wt._TmpMats[0], s = this.getAbsoluteMatrix();\n t ? s.multiplyToRef(t.getWorldMatrix(), r) : r.copyFrom(s), r.multiplyAtIndex(0, this._scalingDeterminant), r.multiplyAtIndex(1, this._scalingDeterminant), r.multiplyAtIndex(2, this._scalingDeterminant), r.decompose(void 0, i, void 0);\n }\n }\n /**\n * Get the rotation matrix of the bone in local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The rotation matrix\n */\n getRotationMatrix(e = ut.LOCAL, t) {\n const i = w.Identity();\n return this.getRotationMatrixToRef(e, t, i), i;\n }\n /**\n * Copy the rotation matrix of the bone to a matrix. The rotation can be in either local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The quaternion that the rotation should be copied to\n */\n getRotationMatrixToRef(e = ut.LOCAL, t, i) {\n if (e == ut.LOCAL)\n this.getLocalMatrix().getRotationMatrixToRef(i);\n else {\n const r = Wt._TmpMats[0], s = this.getAbsoluteMatrix();\n t ? s.multiplyToRef(t.getWorldMatrix(), r) : r.copyFrom(s), r.multiplyAtIndex(0, this._scalingDeterminant), r.multiplyAtIndex(1, this._scalingDeterminant), r.multiplyAtIndex(2, this._scalingDeterminant), r.getRotationMatrixToRef(i);\n }\n }\n /**\n * Get the world position of a point that is in the local space of the bone\n * @param position The local position\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The world position\n */\n getAbsolutePositionFromLocal(e, t = null) {\n const i = _.Zero();\n return this.getAbsolutePositionFromLocalToRef(e, t, i), i;\n }\n /**\n * Get the world position of a point that is in the local space of the bone and copy it to the result param\n * @param position The local position\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 that the world position should be copied to\n */\n getAbsolutePositionFromLocalToRef(e, t = null, i) {\n let r = null;\n t && (r = t.getWorldMatrix()), this._skeleton.computeAbsoluteMatrices();\n const s = Wt._TmpMats[0];\n s.copyFrom(this.getAbsoluteMatrix()), t && r && s.multiplyToRef(r, s), _.TransformCoordinatesToRef(e, s, i);\n }\n /**\n * Get the local position of a point that is in world space\n * @param position The world position\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The local position\n */\n getLocalPositionFromAbsolute(e, t = null) {\n const i = _.Zero();\n return this.getLocalPositionFromAbsoluteToRef(e, t, i), i;\n }\n /**\n * Get the local position of a point that is in world space and copy it to the result param\n * @param position The world position\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 that the local position should be copied to\n */\n getLocalPositionFromAbsoluteToRef(e, t = null, i) {\n let r = null;\n t && (r = t.getWorldMatrix()), this._skeleton.computeAbsoluteMatrices();\n const s = Wt._TmpMats[0];\n s.copyFrom(this.getAbsoluteMatrix()), t && r && s.multiplyToRef(r, s), s.invert(), _.TransformCoordinatesToRef(e, s, i);\n }\n /**\n * Set the current local matrix as the restMatrix for this bone.\n */\n setCurrentPoseAsRest() {\n this.setRestMatrix(this.getLocalMatrix());\n }\n}\nWt._TmpVecs = vi.BuildArray(2, _.Zero);\nWt._TmpQuat = Ce.Identity();\nWt._TmpMats = vi.BuildArray(5, w.Identity);\nvar xu;\n(function(n) {\n n[n.NONE = 0] = \"NONE\", n[n.STEP = 1] = \"STEP\";\n})(xu || (xu = {}));\nclass qc {\n /**\n * Initializes the range of an animation\n * @param name The name of the animation range\n * @param from The starting frame of the animation\n * @param to The ending frame of the animation\n */\n constructor(e, t, i) {\n this.name = e, this.from = t, this.to = i;\n }\n /**\n * Makes a copy of the animation range\n * @returns A copy of the animation range\n */\n clone() {\n return new qc(this.name, this.from, this.to);\n }\n}\nconst ON = Object.freeze(new Ce(0, 0, 0, 0)), DN = Object.freeze(_.Zero()), NN = Object.freeze(me.Zero()), FN = Object.freeze(vr.Zero()), LN = Object.freeze(Ne.Black()), wN = Object.freeze(new et(0, 0, 0, 0)), Wr = {\n key: 0,\n repeatCount: 0,\n loopMode: 2\n};\nclass ve {\n /**\n * @internal Internal use\n */\n static _PrepareAnimation(e, t, i, r, s, a, o, l) {\n let c;\n if (!isNaN(parseFloat(s)) && isFinite(s) ? c = ve.ANIMATIONTYPE_FLOAT : s instanceof Ce ? c = ve.ANIMATIONTYPE_QUATERNION : s instanceof _ ? c = ve.ANIMATIONTYPE_VECTOR3 : s instanceof me ? c = ve.ANIMATIONTYPE_VECTOR2 : s instanceof Ne ? c = ve.ANIMATIONTYPE_COLOR3 : s instanceof et ? c = ve.ANIMATIONTYPE_COLOR4 : s instanceof vr && (c = ve.ANIMATIONTYPE_SIZE), c == null)\n return null;\n const h = new ve(e, t, i, c, o), u = [\n { frame: 0, value: s },\n { frame: r, value: a }\n ];\n return h.setKeys(u), l !== void 0 && h.setEasingFunction(l), h;\n }\n /**\n * Sets up an animation\n * @param property The property to animate\n * @param animationType The animation type to apply\n * @param framePerSecond The frames per second of the animation\n * @param easingFunction The easing function used in the animation\n * @returns The created animation\n */\n static CreateAnimation(e, t, i, r) {\n const s = new ve(e + \"Animation\", e, i, t, ve.ANIMATIONLOOPMODE_CONSTANT);\n return s.setEasingFunction(r), s;\n }\n /**\n * Create and start an animation on a node\n * @param name defines the name of the global animation that will be run on all nodes\n * @param target defines the target where the animation will take place\n * @param targetProperty defines property to animate\n * @param framePerSecond defines the number of frame per second yo use\n * @param totalFrame defines the number of frames in total\n * @param from defines the initial value\n * @param to defines the final value\n * @param loopMode defines which loop mode you want to use (off by default)\n * @param easingFunction defines the easing function to use (linear by default)\n * @param onAnimationEnd defines the callback to call when animation end\n * @param scene defines the hosting scene\n * @returns the animatable created for this animation\n */\n static CreateAndStartAnimation(e, t, i, r, s, a, o, l, c, h, u) {\n const f = ve._PrepareAnimation(e, i, r, s, a, o, l, c);\n return !f || (t.getScene && (u = t.getScene()), !u) ? null : u.beginDirectAnimation(t, [f], 0, s, f.loopMode === 1, 1, h);\n }\n /**\n * Create and start an animation on a node and its descendants\n * @param name defines the name of the global animation that will be run on all nodes\n * @param node defines the root node where the animation will take place\n * @param directDescendantsOnly if true only direct descendants will be used, if false direct and also indirect (children of children, an so on in a recursive manner) descendants will be used\n * @param targetProperty defines property to animate\n * @param framePerSecond defines the number of frame per second to use\n * @param totalFrame defines the number of frames in total\n * @param from defines the initial value\n * @param to defines the final value\n * @param loopMode defines which loop mode you want to use (off by default)\n * @param easingFunction defines the easing function to use (linear by default)\n * @param onAnimationEnd defines the callback to call when an animation ends (will be called once per node)\n * @returns the list of animatables created for all nodes\n * @example https://www.babylonjs-playground.com/#MH0VLI\n */\n static CreateAndStartHierarchyAnimation(e, t, i, r, s, a, o, l, c, h, u) {\n const f = ve._PrepareAnimation(e, r, s, a, o, l, c, h);\n return f ? t.getScene().beginDirectHierarchyAnimation(t, i, [f], 0, a, f.loopMode === 1, 1, u) : null;\n }\n /**\n * Creates a new animation, merges it with the existing animations and starts it\n * @param name Name of the animation\n * @param node Node which contains the scene that begins the animations\n * @param targetProperty Specifies which property to animate\n * @param framePerSecond The frames per second of the animation\n * @param totalFrame The total number of frames\n * @param from The frame at the beginning of the animation\n * @param to The frame at the end of the animation\n * @param loopMode Specifies the loop mode of the animation\n * @param easingFunction (Optional) The easing function of the animation, which allow custom mathematical formulas for animations\n * @param onAnimationEnd Callback to run once the animation is complete\n * @returns Nullable animation\n */\n static CreateMergeAndStartAnimation(e, t, i, r, s, a, o, l, c, h) {\n const u = ve._PrepareAnimation(e, i, r, s, a, o, l, c);\n return u ? (t.animations.push(u), t.getScene().beginAnimation(t, 0, s, u.loopMode === 1, 1, h)) : null;\n }\n /** @internal */\n static MakeAnimationAdditive(e, t, i, r = !1, s) {\n let a;\n typeof t == \"object\" ? a = t : a = {\n referenceFrame: t ?? 0,\n range: i,\n cloneOriginalAnimation: r,\n clonedAnimationName: s\n };\n let o = e;\n if (a.cloneOriginalAnimation && (o = e.clone(), o.name = a.clonedAnimationName || o.name), !o._keys.length)\n return o;\n const l = a.referenceFrame && a.referenceFrame >= 0 ? a.referenceFrame : 0;\n let c = 0;\n const h = o._keys[0];\n let u = o._keys.length - 1;\n const f = o._keys[u], d = {\n referenceValue: h.value,\n referencePosition: z.Vector3[0],\n referenceQuaternion: z.Quaternion[0],\n referenceScaling: z.Vector3[1],\n keyPosition: z.Vector3[2],\n keyQuaternion: z.Quaternion[1],\n keyScaling: z.Vector3[3]\n };\n let p = h.frame, g = f.frame;\n if (a.range) {\n const E = o.getRange(a.range);\n E && (p = E.from, g = E.to);\n } else\n p = a.fromFrame ?? p, g = a.toFrame ?? g;\n if (p !== h.frame && (c = o.createKeyForFrame(p)), g !== f.frame && (u = o.createKeyForFrame(g)), o._keys.length === 1) {\n const E = o._getKeyValue(o._keys[0]);\n d.referenceValue = E.clone ? E.clone() : E;\n } else if (l <= h.frame) {\n const E = o._getKeyValue(h.value);\n d.referenceValue = E.clone ? E.clone() : E;\n } else if (l >= f.frame) {\n const E = o._getKeyValue(f.value);\n d.referenceValue = E.clone ? E.clone() : E;\n } else {\n Wr.key = 0;\n const E = o._interpolate(l, Wr);\n d.referenceValue = E.clone ? E.clone() : E;\n }\n o.dataType === ve.ANIMATIONTYPE_QUATERNION ? d.referenceValue.normalize().conjugateInPlace() : o.dataType === ve.ANIMATIONTYPE_MATRIX && (d.referenceValue.decompose(d.referenceScaling, d.referenceQuaternion, d.referencePosition), d.referenceQuaternion.normalize().conjugateInPlace());\n let m = Number.MAX_VALUE;\n const v = a.clipKeys ? [] : null;\n for (let E = c; E <= u; E++) {\n let C = o._keys[E];\n if (v && (C = {\n frame: C.frame,\n value: C.value.clone ? C.value.clone() : C.value,\n inTangent: C.inTangent,\n outTangent: C.outTangent,\n interpolation: C.interpolation,\n lockedTangent: C.lockedTangent\n }, m === Number.MAX_VALUE && (m = C.frame), C.frame -= m, v.push(C)), !(E && o.dataType !== ve.ANIMATIONTYPE_FLOAT && C.value === h.value))\n switch (o.dataType) {\n case ve.ANIMATIONTYPE_MATRIX:\n C.value.decompose(d.keyScaling, d.keyQuaternion, d.keyPosition), d.keyPosition.subtractInPlace(d.referencePosition), d.keyScaling.divideInPlace(d.referenceScaling), d.referenceQuaternion.multiplyToRef(d.keyQuaternion, d.keyQuaternion), w.ComposeToRef(d.keyScaling, d.keyQuaternion, d.keyPosition, C.value);\n break;\n case ve.ANIMATIONTYPE_QUATERNION:\n d.referenceValue.multiplyToRef(C.value, C.value);\n break;\n case ve.ANIMATIONTYPE_VECTOR2:\n case ve.ANIMATIONTYPE_VECTOR3:\n case ve.ANIMATIONTYPE_COLOR3:\n case ve.ANIMATIONTYPE_COLOR4:\n C.value.subtractToRef(d.referenceValue, C.value);\n break;\n case ve.ANIMATIONTYPE_SIZE:\n C.value.width -= d.referenceValue.width, C.value.height -= d.referenceValue.height;\n break;\n default:\n C.value -= d.referenceValue;\n }\n }\n return v && o.setKeys(v, !0), o;\n }\n /**\n * Transition property of an host to the target Value\n * @param property The property to transition\n * @param targetValue The target Value of the property\n * @param host The object where the property to animate belongs\n * @param scene Scene used to run the animation\n * @param frameRate Framerate (in frame/s) to use\n * @param transition The transition type we want to use\n * @param duration The duration of the animation, in milliseconds\n * @param onAnimationEnd Callback trigger at the end of the animation\n * @returns Nullable animation\n */\n static TransitionTo(e, t, i, r, s, a, o, l = null) {\n if (o <= 0)\n return i[e] = t, l && l(), null;\n const c = s * (o / 1e3);\n a.setKeys([\n {\n frame: 0,\n value: i[e].clone ? i[e].clone() : i[e]\n },\n {\n frame: c,\n value: t\n }\n ]), i.animations || (i.animations = []), i.animations.push(a);\n const h = r.beginAnimation(i, 0, c, !1);\n return h.onAnimationEnd = l, h;\n }\n /**\n * Return the array of runtime animations currently using this animation\n */\n get runtimeAnimations() {\n return this._runtimeAnimations;\n }\n /**\n * Specifies if any of the runtime animations are currently running\n */\n get hasRunningRuntimeAnimations() {\n for (const e of this._runtimeAnimations)\n if (!e.isStopped())\n return !0;\n return !1;\n }\n /**\n * Initializes the animation\n * @param name Name of the animation\n * @param targetProperty Property to animate\n * @param framePerSecond The frames per second of the animation\n * @param dataType The data type of the animation\n * @param loopMode The loop mode of the animation\n * @param enableBlending Specifies if blending should be enabled\n */\n constructor(e, t, i, r, s, a) {\n this.name = e, this.targetProperty = t, this.framePerSecond = i, this.dataType = r, this.loopMode = s, this.enableBlending = a, this._easingFunction = null, this._runtimeAnimations = new Array(), this._events = new Array(), this.blendingSpeed = 0.01, this._ranges = {}, this.targetPropertyPath = t.split(\".\"), this.dataType = r, this.loopMode = s === void 0 ? ve.ANIMATIONLOOPMODE_CYCLE : s, this.uniqueId = ve._UniqueIdGenerator++;\n }\n // Methods\n /**\n * Converts the animation to a string\n * @param fullDetails support for multiple levels of logging within scene loading\n * @returns String form of the animation\n */\n toString(e) {\n let t = \"Name: \" + this.name + \", property: \" + this.targetProperty;\n if (t += \", datatype: \" + [\"Float\", \"Vector3\", \"Quaternion\", \"Matrix\", \"Color3\", \"Vector2\"][this.dataType], t += \", nKeys: \" + (this._keys ? this._keys.length : \"none\"), t += \", nRanges: \" + (this._ranges ? Object.keys(this._ranges).length : \"none\"), e) {\n t += \", Ranges: {\";\n let i = !0;\n for (const r in this._ranges)\n i && (t += \", \", i = !1), t += r;\n t += \"}\";\n }\n return t;\n }\n /**\n * Add an event to this animation\n * @param event Event to add\n */\n addEvent(e) {\n this._events.push(e), this._events.sort((t, i) => t.frame - i.frame);\n }\n /**\n * Remove all events found at the given frame\n * @param frame The frame to remove events from\n */\n removeEvents(e) {\n for (let t = 0; t < this._events.length; t++)\n this._events[t].frame === e && (this._events.splice(t, 1), t--);\n }\n /**\n * Retrieves all the events from the animation\n * @returns Events from the animation\n */\n getEvents() {\n return this._events;\n }\n /**\n * Creates an animation range\n * @param name Name of the animation range\n * @param from Starting frame of the animation range\n * @param to Ending frame of the animation\n */\n createRange(e, t, i) {\n this._ranges[e] || (this._ranges[e] = new qc(e, t, i));\n }\n /**\n * Deletes an animation range by name\n * @param name Name of the animation range to delete\n * @param deleteFrames Specifies if the key frames for the range should also be deleted (true) or not (false)\n */\n deleteRange(e, t = !0) {\n const i = this._ranges[e];\n if (i) {\n if (t) {\n const r = i.from, s = i.to;\n for (let a = this._keys.length - 1; a >= 0; a--)\n this._keys[a].frame >= r && this._keys[a].frame <= s && this._keys.splice(a, 1);\n }\n this._ranges[e] = null;\n }\n }\n /**\n * Gets the animation range by name, or null if not defined\n * @param name Name of the animation range\n * @returns Nullable animation range\n */\n getRange(e) {\n return this._ranges[e];\n }\n /**\n * Gets the key frames from the animation\n * @returns The key frames of the animation\n */\n getKeys() {\n return this._keys;\n }\n /**\n * Gets the highest frame rate of the animation\n * @returns Highest frame rate of the animation\n */\n getHighestFrame() {\n let e = 0;\n for (let t = 0, i = this._keys.length; t < i; t++)\n e < this._keys[t].frame && (e = this._keys[t].frame);\n return e;\n }\n /**\n * Gets the easing function of the animation\n * @returns Easing function of the animation\n */\n getEasingFunction() {\n return this._easingFunction;\n }\n /**\n * Sets the easing function of the animation\n * @param easingFunction A custom mathematical formula for animation\n */\n setEasingFunction(e) {\n this._easingFunction = e;\n }\n /**\n * Interpolates a scalar linearly\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated scalar value\n */\n floatInterpolateFunction(e, t, i) {\n return je.Lerp(e, t, i);\n }\n /**\n * Interpolates a scalar cubically\n * @param startValue Start value of the animation curve\n * @param outTangent End tangent of the animation\n * @param endValue End value of the animation curve\n * @param inTangent Start tangent of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated scalar value\n */\n floatInterpolateFunctionWithTangents(e, t, i, r, s) {\n return je.Hermite(e, t, i, r, s);\n }\n /**\n * Interpolates a quaternion using a spherical linear interpolation\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated quaternion value\n */\n quaternionInterpolateFunction(e, t, i) {\n return Ce.Slerp(e, t, i);\n }\n /**\n * Interpolates a quaternion cubically\n * @param startValue Start value of the animation curve\n * @param outTangent End tangent of the animation curve\n * @param endValue End value of the animation curve\n * @param inTangent Start tangent of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated quaternion value\n */\n quaternionInterpolateFunctionWithTangents(e, t, i, r, s) {\n return Ce.Hermite(e, t, i, r, s).normalize();\n }\n /**\n * Interpolates a Vector3 linearly\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\n * @returns Interpolated scalar value\n */\n vector3InterpolateFunction(e, t, i) {\n return _.Lerp(e, t, i);\n }\n /**\n * Interpolates a Vector3 cubically\n * @param startValue Start value of the animation curve\n * @param outTangent End tangent of the animation\n * @param endValue End value of the animation curve\n * @param inTangent Start tangent of the animation curve\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\n * @returns InterpolatedVector3 value\n */\n vector3InterpolateFunctionWithTangents(e, t, i, r, s) {\n return _.Hermite(e, t, i, r, s);\n }\n /**\n * Interpolates a Vector2 linearly\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\n * @returns Interpolated Vector2 value\n */\n vector2InterpolateFunction(e, t, i) {\n return me.Lerp(e, t, i);\n }\n /**\n * Interpolates a Vector2 cubically\n * @param startValue Start value of the animation curve\n * @param outTangent End tangent of the animation\n * @param endValue End value of the animation curve\n * @param inTangent Start tangent of the animation curve\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\n * @returns Interpolated Vector2 value\n */\n vector2InterpolateFunctionWithTangents(e, t, i, r, s) {\n return me.Hermite(e, t, i, r, s);\n }\n /**\n * Interpolates a size linearly\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated Size value\n */\n sizeInterpolateFunction(e, t, i) {\n return vr.Lerp(e, t, i);\n }\n /**\n * Interpolates a Color3 linearly\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated Color3 value\n */\n color3InterpolateFunction(e, t, i) {\n return Ne.Lerp(e, t, i);\n }\n /**\n * Interpolates a Color3 cubically\n * @param startValue Start value of the animation curve\n * @param outTangent End tangent of the animation\n * @param endValue End value of the animation curve\n * @param inTangent Start tangent of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns interpolated value\n */\n color3InterpolateFunctionWithTangents(e, t, i, r, s) {\n return Ne.Hermite(e, t, i, r, s);\n }\n /**\n * Interpolates a Color4 linearly\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated Color3 value\n */\n color4InterpolateFunction(e, t, i) {\n return et.Lerp(e, t, i);\n }\n /**\n * Interpolates a Color4 cubically\n * @param startValue Start value of the animation curve\n * @param outTangent End tangent of the animation\n * @param endValue End value of the animation curve\n * @param inTangent Start tangent of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns interpolated value\n */\n color4InterpolateFunctionWithTangents(e, t, i, r, s) {\n return et.Hermite(e, t, i, r, s);\n }\n /**\n * @internal Internal use only\n */\n _getKeyValue(e) {\n return typeof e == \"function\" ? e() : e;\n }\n /**\n * Evaluate the animation value at a given frame\n * @param currentFrame defines the frame where we want to evaluate the animation\n * @returns the animation value\n */\n evaluate(e) {\n return Wr.key = 0, this._interpolate(e, Wr);\n }\n /**\n * @internal Internal use only\n */\n _interpolate(e, t, i = !1) {\n if (t.loopMode === ve.ANIMATIONLOOPMODE_CONSTANT && t.repeatCount > 0)\n return t.highLimitValue.clone ? t.highLimitValue.clone() : t.highLimitValue;\n const r = this._keys, s = r.length;\n let a = t.key;\n for (; a >= 0 && e < r[a].frame; )\n --a;\n for (; a + 1 <= s - 1 && e >= r[a + 1].frame; )\n ++a;\n if (t.key = a, a < 0)\n return i ? void 0 : this._getKeyValue(r[0].value);\n if (a + 1 > s - 1)\n return i ? void 0 : this._getKeyValue(r[s - 1].value);\n const o = r[a], l = r[a + 1];\n if (i && (e === o.frame || e === l.frame))\n return;\n const c = this._getKeyValue(o.value), h = this._getKeyValue(l.value);\n if (o.interpolation === xu.STEP)\n return l.frame > e ? c : h;\n const u = o.outTangent !== void 0 && l.inTangent !== void 0, f = l.frame - o.frame;\n let d = (e - o.frame) / f;\n const p = o.easingFunction || this.getEasingFunction();\n switch (p !== null && (d = p.ease(d)), this.dataType) {\n case ve.ANIMATIONTYPE_FLOAT: {\n const g = u ? this.floatInterpolateFunctionWithTangents(c, o.outTangent * f, h, l.inTangent * f, d) : this.floatInterpolateFunction(c, h, d);\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return g;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return (t.offsetValue ?? 0) * t.repeatCount + g;\n }\n break;\n }\n case ve.ANIMATIONTYPE_QUATERNION: {\n const g = u ? this.quaternionInterpolateFunctionWithTangents(c, o.outTangent.scale(f), h, l.inTangent.scale(f), d) : this.quaternionInterpolateFunction(c, h, d);\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return g;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return g.addInPlace((t.offsetValue || ON).scale(t.repeatCount));\n }\n return g;\n }\n case ve.ANIMATIONTYPE_VECTOR3: {\n const g = u ? this.vector3InterpolateFunctionWithTangents(c, o.outTangent.scale(f), h, l.inTangent.scale(f), d) : this.vector3InterpolateFunction(c, h, d);\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return g;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return g.add((t.offsetValue || DN).scale(t.repeatCount));\n }\n break;\n }\n case ve.ANIMATIONTYPE_VECTOR2: {\n const g = u ? this.vector2InterpolateFunctionWithTangents(c, o.outTangent.scale(f), h, l.inTangent.scale(f), d) : this.vector2InterpolateFunction(c, h, d);\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return g;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return g.add((t.offsetValue || NN).scale(t.repeatCount));\n }\n break;\n }\n case ve.ANIMATIONTYPE_SIZE: {\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return this.sizeInterpolateFunction(c, h, d);\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return this.sizeInterpolateFunction(c, h, d).add((t.offsetValue || FN).scale(t.repeatCount));\n }\n break;\n }\n case ve.ANIMATIONTYPE_COLOR3: {\n const g = u ? this.color3InterpolateFunctionWithTangents(c, o.outTangent.scale(f), h, l.inTangent.scale(f), d) : this.color3InterpolateFunction(c, h, d);\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return g;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return g.add((t.offsetValue || LN).scale(t.repeatCount));\n }\n break;\n }\n case ve.ANIMATIONTYPE_COLOR4: {\n const g = u ? this.color4InterpolateFunctionWithTangents(c, o.outTangent.scale(f), h, l.inTangent.scale(f), d) : this.color4InterpolateFunction(c, h, d);\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return g;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return g.add((t.offsetValue || wN).scale(t.repeatCount));\n }\n break;\n }\n case ve.ANIMATIONTYPE_MATRIX: {\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return ve.AllowMatricesInterpolation ? this.matrixInterpolateFunction(c, h, d, t.workValue) : c;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return c;\n }\n break;\n }\n }\n return 0;\n }\n /**\n * Defines the function to use to interpolate matrices\n * @param startValue defines the start matrix\n * @param endValue defines the end matrix\n * @param gradient defines the gradient between both matrices\n * @param result defines an optional target matrix where to store the interpolation\n * @returns the interpolated matrix\n */\n matrixInterpolateFunction(e, t, i, r) {\n return ve.AllowMatrixDecomposeForInterpolation ? r ? (w.DecomposeLerpToRef(e, t, i, r), r) : w.DecomposeLerp(e, t, i) : r ? (w.LerpToRef(e, t, i, r), r) : w.Lerp(e, t, i);\n }\n /**\n * Makes a copy of the animation\n * @returns Cloned animation\n */\n clone() {\n const e = new ve(this.name, this.targetPropertyPath.join(\".\"), this.framePerSecond, this.dataType, this.loopMode);\n if (e.enableBlending = this.enableBlending, e.blendingSpeed = this.blendingSpeed, this._keys && e.setKeys(this._keys), this._ranges) {\n e._ranges = {};\n for (const t in this._ranges) {\n const i = this._ranges[t];\n i && (e._ranges[t] = i.clone());\n }\n }\n return e;\n }\n /**\n * Sets the key frames of the animation\n * @param values The animation key frames to set\n * @param dontClone Whether to clone the keys or not (default is false, so the array of keys is cloned)\n */\n setKeys(e, t = !1) {\n this._keys = t ? e : e.slice(0);\n }\n /**\n * Creates a key for the frame passed as a parameter and adds it to the animation IF a key doesn't already exist for that frame\n * @param frame Frame number\n * @returns The key index if the key was added or the index of the pre existing key if the frame passed as parameter already has a corresponding key\n */\n createKeyForFrame(e) {\n Wr.key = 0;\n const t = this._interpolate(e, Wr, !0);\n if (!t)\n return this._keys[Wr.key].frame === e ? Wr.key : Wr.key + 1;\n const i = {\n frame: e,\n value: t.clone ? t.clone() : t\n };\n return this._keys.splice(Wr.key + 1, 0, i), Wr.key + 1;\n }\n /**\n * Serializes the animation to an object\n * @returns Serialized object\n */\n serialize() {\n const e = {};\n e.name = this.name, e.property = this.targetProperty, e.framePerSecond = this.framePerSecond, e.dataType = this.dataType, e.loopBehavior = this.loopMode, e.enableBlending = this.enableBlending, e.blendingSpeed = this.blendingSpeed;\n const t = this.dataType;\n e.keys = [];\n const i = this.getKeys();\n for (let r = 0; r < i.length; r++) {\n const s = i[r], a = {};\n switch (a.frame = s.frame, t) {\n case ve.ANIMATIONTYPE_FLOAT:\n a.values = [s.value], s.inTangent !== void 0 && a.values.push(s.inTangent), s.outTangent !== void 0 && (s.inTangent === void 0 && a.values.push(void 0), a.values.push(s.outTangent)), s.interpolation !== void 0 && (s.inTangent === void 0 && a.values.push(void 0), s.outTangent === void 0 && a.values.push(void 0), a.values.push(s.interpolation));\n break;\n case ve.ANIMATIONTYPE_QUATERNION:\n case ve.ANIMATIONTYPE_MATRIX:\n case ve.ANIMATIONTYPE_VECTOR3:\n case ve.ANIMATIONTYPE_COLOR3:\n case ve.ANIMATIONTYPE_COLOR4:\n a.values = s.value.asArray(), s.inTangent != null && a.values.push(s.inTangent.asArray()), s.outTangent != null && (s.inTangent === void 0 && a.values.push(void 0), a.values.push(s.outTangent.asArray())), s.interpolation !== void 0 && (s.inTangent === void 0 && a.values.push(void 0), s.outTangent === void 0 && a.values.push(void 0), a.values.push(s.interpolation));\n break;\n }\n e.keys.push(a);\n }\n e.ranges = [];\n for (const r in this._ranges) {\n const s = this._ranges[r];\n if (!s)\n continue;\n const a = {};\n a.name = r, a.from = s.from, a.to = s.to, e.ranges.push(a);\n }\n return e;\n }\n /**\n * @internal\n */\n static _UniversalLerp(e, t, i) {\n const r = e.constructor;\n return r.Lerp ? r.Lerp(e, t, i) : r.Slerp ? r.Slerp(e, t, i) : e.toFixed ? e * (1 - i) + i * t : t;\n }\n /**\n * Parses an animation object and creates an animation\n * @param parsedAnimation Parsed animation object\n * @returns Animation object\n */\n static Parse(e) {\n const t = new ve(e.name, e.property, e.framePerSecond, e.dataType, e.loopBehavior), i = e.dataType, r = [];\n let s, a;\n for (e.enableBlending && (t.enableBlending = e.enableBlending), e.blendingSpeed && (t.blendingSpeed = e.blendingSpeed), a = 0; a < e.keys.length; a++) {\n const o = e.keys[a];\n let l, c, h;\n switch (i) {\n case ve.ANIMATIONTYPE_FLOAT:\n s = o.values[0], o.values.length >= 2 && (l = o.values[1]), o.values.length >= 3 && (c = o.values[2]), o.values.length >= 4 && (h = o.values[3]);\n break;\n case ve.ANIMATIONTYPE_QUATERNION:\n if (s = Ce.FromArray(o.values), o.values.length >= 8) {\n const f = Ce.FromArray(o.values.slice(4, 8));\n f.equals(Ce.Zero()) || (l = f);\n }\n if (o.values.length >= 12) {\n const f = Ce.FromArray(o.values.slice(8, 12));\n f.equals(Ce.Zero()) || (c = f);\n }\n o.values.length >= 13 && (h = o.values[12]);\n break;\n case ve.ANIMATIONTYPE_MATRIX:\n s = w.FromArray(o.values), o.values.length >= 17 && (h = o.values[16]);\n break;\n case ve.ANIMATIONTYPE_COLOR3:\n s = Ne.FromArray(o.values), o.values[3] && (l = Ne.FromArray(o.values[3])), o.values[4] && (c = Ne.FromArray(o.values[4])), o.values[5] && (h = o.values[5]);\n break;\n case ve.ANIMATIONTYPE_COLOR4:\n s = et.FromArray(o.values), o.values[4] && (l = et.FromArray(o.values[4])), o.values[5] && (c = et.FromArray(o.values[5])), o.values[6] && (h = et.FromArray(o.values[6]));\n break;\n case ve.ANIMATIONTYPE_VECTOR3:\n default:\n s = _.FromArray(o.values), o.values[3] && (l = _.FromArray(o.values[3])), o.values[4] && (c = _.FromArray(o.values[4])), o.values[5] && (h = o.values[5]);\n break;\n }\n const u = {};\n u.frame = o.frame, u.value = s, l != null && (u.inTangent = l), c != null && (u.outTangent = c), h != null && (u.interpolation = h), r.push(u);\n }\n if (t.setKeys(r), e.ranges)\n for (a = 0; a < e.ranges.length; a++)\n s = e.ranges[a], t.createRange(s.name, s.from, s.to);\n return t;\n }\n /**\n * Appends the serialized animations from the source animations\n * @param source Source containing the animations\n * @param destination Target to store the animations\n */\n static AppendSerializedAnimations(e, t) {\n Le.AppendSerializedAnimations(e, t);\n }\n /**\n * Creates a new animation or an array of animations from a snippet saved in a remote file\n * @param name defines the name of the animation to create (can be null or empty to use the one from the json data)\n * @param url defines the url to load from\n * @returns a promise that will resolve to the new animation or an array of animations\n */\n static ParseFromFileAsync(e, t) {\n return new Promise((i, r) => {\n const s = new mi();\n s.addEventListener(\"readystatechange\", () => {\n if (s.readyState == 4)\n if (s.status == 200) {\n let a = JSON.parse(s.responseText);\n if (a.animations && (a = a.animations), a.length) {\n const o = [];\n for (const l of a)\n o.push(this.Parse(l));\n i(o);\n } else {\n const o = this.Parse(a);\n e && (o.name = e), i(o);\n }\n } else\n r(\"Unable to load the animation\");\n }), s.open(\"GET\", t), s.send();\n });\n }\n /**\n * Creates an animation or an array of animations from a snippet saved by the Inspector\n * @param snippetId defines the snippet to load\n * @returns a promise that will resolve to the new animation or a new array of animations\n */\n static ParseFromSnippetAsync(e) {\n return new Promise((t, i) => {\n const r = new mi();\n r.addEventListener(\"readystatechange\", () => {\n if (r.readyState == 4)\n if (r.status == 200) {\n const s = JSON.parse(JSON.parse(r.responseText).jsonPayload);\n if (s.animations) {\n const a = JSON.parse(s.animations), o = [];\n for (const l of a.animations) {\n const c = this.Parse(l);\n c.snippetId = e, o.push(c);\n }\n t(o);\n } else {\n const a = JSON.parse(s.animation), o = this.Parse(a);\n o.snippetId = e, t(o);\n }\n } else\n i(\"Unable to load the snippet \" + e);\n }), r.open(\"GET\", this.SnippetUrl + \"/\" + e.replace(/#/g, \"/\")), r.send();\n });\n }\n}\nve._UniqueIdGenerator = 0;\nve.AllowMatricesInterpolation = !1;\nve.AllowMatrixDecomposeForInterpolation = !0;\nve.SnippetUrl = \"https://snippet.babylonjs.com\";\nve.ANIMATIONTYPE_FLOAT = 0;\nve.ANIMATIONTYPE_VECTOR3 = 1;\nve.ANIMATIONTYPE_QUATERNION = 2;\nve.ANIMATIONTYPE_MATRIX = 3;\nve.ANIMATIONTYPE_COLOR3 = 4;\nve.ANIMATIONTYPE_COLOR4 = 7;\nve.ANIMATIONTYPE_VECTOR2 = 5;\nve.ANIMATIONTYPE_SIZE = 6;\nve.ANIMATIONLOOPMODE_RELATIVE = 0;\nve.ANIMATIONLOOPMODE_CYCLE = 1;\nve.ANIMATIONLOOPMODE_CONSTANT = 2;\nve.ANIMATIONLOOPMODE_YOYO = 4;\nve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT = 5;\nve.CreateFromSnippetAsync = ve.ParseFromSnippetAsync;\nRe(\"BABYLON.Animation\", ve);\nAi._AnimationRangeFactory = (n, e, t) => new qc(n, e, t);\nconst UN = \"particlesPixelShader\", VN = `#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\nvarying vec2 vUV;varying vec4 vColor;uniform vec4 textureMask;uniform sampler2D diffuseSampler;\n#include\n#include\n#include\n#include\n#include\n#ifdef RAMPGRADIENT\nvarying vec4 remapRanges;uniform sampler2D rampSampler;\n#endif\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include\nvec4 textureColor=texture2D(diffuseSampler,vUV);vec4 baseColor=(textureColor*textureMask+(vec4(1.,1.,1.,1.)-textureMask))*vColor;\n#ifdef RAMPGRADIENT\nfloat alpha=baseColor.a;float remappedColorIndex=clamp((alpha-remapRanges.x)/remapRanges.y,0.0,1.0);vec4 rampColor=texture2D(rampSampler,vec2(1.0-remappedColorIndex,0.));baseColor.rgb*=rampColor.rgb;float finalAlpha=baseColor.a;baseColor.a=clamp((alpha*rampColor.a-remapRanges.z)/remapRanges.w,0.0,1.0);\n#endif\n#ifdef BLENDMULTIPLYMODE\nfloat sourceAlpha=vColor.a*textureColor.a;baseColor.rgb=baseColor.rgb*sourceAlpha+vec3(1.0)*(1.0-sourceAlpha);\n#endif\n#include\n#include(color,baseColor)\n#ifdef IMAGEPROCESSINGPOSTPROCESS\nbaseColor.rgb=toLinearSpace(baseColor.rgb);\n#else\n#ifdef IMAGEPROCESSING\nbaseColor.rgb=toLinearSpace(baseColor.rgb);baseColor=applyImageProcessing(baseColor);\n#endif\n#endif\ngl_FragColor=baseColor;\n#define CUSTOM_FRAGMENT_MAIN_END\n}`;\nY.ShadersStore[UN] = VN;\nconst BN = \"particlesVertexShader\", kN = `attribute vec3 position;attribute vec4 color;attribute float angle;attribute vec2 size;\n#ifdef ANIMATESHEET\nattribute float cellIndex;\n#endif\n#ifndef BILLBOARD\nattribute vec3 direction;\n#endif\n#ifdef BILLBOARDSTRETCHED\nattribute vec3 direction;\n#endif\n#ifdef RAMPGRADIENT\nattribute vec4 remapData;\n#endif\nattribute vec2 offset;uniform mat4 view;uniform mat4 projection;uniform vec2 translationPivot;\n#ifdef ANIMATESHEET\nuniform vec3 particlesInfos; \n#endif\nvarying vec2 vUV;varying vec4 vColor;varying vec3 vPositionW;\n#ifdef RAMPGRADIENT\nvarying vec4 remapRanges;\n#endif\n#if defined(BILLBOARD) && !defined(BILLBOARDY) && !defined(BILLBOARDSTRETCHED)\nuniform mat4 invView;\n#endif\n#include\n#include\n#include\n#ifdef BILLBOARD\nuniform vec3 eyePosition;\n#endif\nvec3 rotate(vec3 yaxis,vec3 rotatedCorner) {vec3 xaxis=normalize(cross(vec3(0.,1.0,0.),yaxis));vec3 zaxis=normalize(cross(yaxis,xaxis));vec3 row0=vec3(xaxis.x,xaxis.y,xaxis.z);vec3 row1=vec3(yaxis.x,yaxis.y,yaxis.z);vec3 row2=vec3(zaxis.x,zaxis.y,zaxis.z);mat3 rotMatrix= mat3(row0,row1,row2);vec3 alignedCorner=rotMatrix*rotatedCorner;return position+alignedCorner;}\n#ifdef BILLBOARDSTRETCHED\nvec3 rotateAlign(vec3 toCamera,vec3 rotatedCorner) {vec3 normalizedToCamera=normalize(toCamera);vec3 normalizedCrossDirToCamera=normalize(cross(normalize(direction),normalizedToCamera));vec3 row0=vec3(normalizedCrossDirToCamera.x,normalizedCrossDirToCamera.y,normalizedCrossDirToCamera.z);vec3 row2=vec3(normalizedToCamera.x,normalizedToCamera.y,normalizedToCamera.z);\n#ifdef BILLBOARDSTRETCHED_LOCAL\nvec3 row1=direction;\n#else\nvec3 crossProduct=normalize(cross(normalizedToCamera,normalizedCrossDirToCamera));vec3 row1=vec3(crossProduct.x,crossProduct.y,crossProduct.z);\n#endif\nmat3 rotMatrix= mat3(row0,row1,row2);vec3 alignedCorner=rotMatrix*rotatedCorner;return position+alignedCorner;}\n#endif\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvec2 cornerPos;cornerPos=(vec2(offset.x-0.5,offset.y -0.5)-translationPivot)*size;\n#ifdef BILLBOARD\nvec3 rotatedCorner;\n#ifdef BILLBOARDY\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.z=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.y=0.;rotatedCorner.xz+=translationPivot;vec3 yaxis=position-eyePosition;yaxis.y=0.;vPositionW=rotate(normalize(yaxis),rotatedCorner);vec3 viewPos=(view*vec4(vPositionW,1.0)).xyz;\n#elif defined(BILLBOARDSTRETCHED)\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.y=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.z=0.;rotatedCorner.xy+=translationPivot;vec3 toCamera=position-eyePosition;vPositionW=rotateAlign(toCamera,rotatedCorner);vec3 viewPos=(view*vec4(vPositionW,1.0)).xyz;\n#else\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.y=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.z=0.;rotatedCorner.xy+=translationPivot;vec3 viewPos=(view*vec4(position,1.0)).xyz+rotatedCorner;vPositionW=(invView*vec4(viewPos,1)).xyz;\n#endif\n#ifdef RAMPGRADIENT\nremapRanges=remapData;\n#endif\ngl_Position=projection*vec4(viewPos,1.0);\n#else\nvec3 rotatedCorner;rotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.z=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.y=0.;rotatedCorner.xz+=translationPivot;vec3 yaxis=normalize(direction);vPositionW=rotate(yaxis,rotatedCorner);gl_Position=projection*view*vec4(vPositionW,1.0);\n#endif\nvColor=color;\n#ifdef ANIMATESHEET\nfloat rowOffset=floor(cellIndex*particlesInfos.z);float columnOffset=cellIndex-rowOffset/particlesInfos.z;vec2 uvScale=particlesInfos.xy;vec2 uvOffset=vec2(offset.x ,1.0-offset.y);vUV=(uvOffset+vec2(columnOffset,rowOffset))*uvScale;\n#else\nvUV=offset;\n#endif\n#if defined(CLIPPLANE) || defined(CLIPPLANE2) || defined(CLIPPLANE3) || defined(CLIPPLANE4) || defined(CLIPPLANE5) || defined(CLIPPLANE6) || defined(FOG)\nvec4 worldPos=vec4(vPositionW,1.0);\n#endif\n#include\n#include\n#include\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[BN] = kN;\nvar qg;\n(function(n) {\n n[n.ATTACHED = 0] = \"ATTACHED\", n[n.END = 1] = \"END\";\n})(qg || (qg = {}));\nclass ho {\n /**\n * Gets or sets the influence of this target (ie. its weight in the overall morphing)\n */\n get influence() {\n return this._influence;\n }\n set influence(e) {\n if (this._influence === e)\n return;\n const t = this._influence;\n this._influence = e, this.onInfluenceChanged.hasObservers() && this.onInfluenceChanged.notifyObservers(t === 0 || e === 0);\n }\n /**\n * Gets or sets the animation properties override\n */\n get animationPropertiesOverride() {\n return !this._animationPropertiesOverride && this._scene ? this._scene.animationPropertiesOverride : this._animationPropertiesOverride;\n }\n set animationPropertiesOverride(e) {\n this._animationPropertiesOverride = e;\n }\n /**\n * Creates a new MorphTarget\n * @param name defines the name of the target\n * @param influence defines the influence to use\n * @param scene defines the scene the morphtarget belongs to\n */\n constructor(e, t = 0, i = null) {\n this.name = e, this.animations = [], this._positions = null, this._normals = null, this._tangents = null, this._uvs = null, this._uniqueId = 0, this.onInfluenceChanged = new he(), this._onDataLayoutChanged = new he(), this._animationPropertiesOverride = null, this._scene = i || st.LastCreatedScene, this.influence = t, this._scene && (this._uniqueId = this._scene.getUniqueId());\n }\n /**\n * Gets the unique ID of this manager\n */\n get uniqueId() {\n return this._uniqueId;\n }\n /**\n * Gets a boolean defining if the target contains position data\n */\n get hasPositions() {\n return !!this._positions;\n }\n /**\n * Gets a boolean defining if the target contains normal data\n */\n get hasNormals() {\n return !!this._normals;\n }\n /**\n * Gets a boolean defining if the target contains tangent data\n */\n get hasTangents() {\n return !!this._tangents;\n }\n /**\n * Gets a boolean defining if the target contains texture coordinates data\n */\n get hasUVs() {\n return !!this._uvs;\n }\n /**\n * Affects position data to this target\n * @param data defines the position data to use\n */\n setPositions(e) {\n const t = this.hasPositions;\n this._positions = e, t !== this.hasPositions && this._onDataLayoutChanged.notifyObservers(void 0);\n }\n /**\n * Gets the position data stored in this target\n * @returns a FloatArray containing the position data (or null if not present)\n */\n getPositions() {\n return this._positions;\n }\n /**\n * Affects normal data to this target\n * @param data defines the normal data to use\n */\n setNormals(e) {\n const t = this.hasNormals;\n this._normals = e, t !== this.hasNormals && this._onDataLayoutChanged.notifyObservers(void 0);\n }\n /**\n * Gets the normal data stored in this target\n * @returns a FloatArray containing the normal data (or null if not present)\n */\n getNormals() {\n return this._normals;\n }\n /**\n * Affects tangent data to this target\n * @param data defines the tangent data to use\n */\n setTangents(e) {\n const t = this.hasTangents;\n this._tangents = e, t !== this.hasTangents && this._onDataLayoutChanged.notifyObservers(void 0);\n }\n /**\n * Gets the tangent data stored in this target\n * @returns a FloatArray containing the tangent data (or null if not present)\n */\n getTangents() {\n return this._tangents;\n }\n /**\n * Affects texture coordinates data to this target\n * @param data defines the texture coordinates data to use\n */\n setUVs(e) {\n const t = this.hasUVs;\n this._uvs = e, t !== this.hasUVs && this._onDataLayoutChanged.notifyObservers(void 0);\n }\n /**\n * Gets the texture coordinates data stored in this target\n * @returns a FloatArray containing the texture coordinates data (or null if not present)\n */\n getUVs() {\n return this._uvs;\n }\n /**\n * Clone the current target\n * @returns a new MorphTarget\n */\n clone() {\n const e = Le.Clone(() => new ho(this.name, this.influence, this._scene), this);\n return e._positions = this._positions, e._normals = this._normals, e._tangents = this._tangents, e._uvs = this._uvs, e;\n }\n /**\n * Serializes the current target into a Serialization object\n * @returns the serialized object\n */\n serialize() {\n const e = {};\n return e.name = this.name, e.influence = this.influence, e.positions = Array.prototype.slice.call(this.getPositions()), this.id != null && (e.id = this.id), this.hasNormals && (e.normals = Array.prototype.slice.call(this.getNormals())), this.hasTangents && (e.tangents = Array.prototype.slice.call(this.getTangents())), this.hasUVs && (e.uvs = Array.prototype.slice.call(this.getUVs())), Le.AppendSerializedAnimations(this, e), e;\n }\n /**\n * Returns the string \"MorphTarget\"\n * @returns \"MorphTarget\"\n */\n getClassName() {\n return \"MorphTarget\";\n }\n // Statics\n /**\n * Creates a new target from serialized data\n * @param serializationObject defines the serialized data to use\n * @param scene defines the hosting scene\n * @returns a new MorphTarget\n */\n static Parse(e, t) {\n const i = new ho(e.name, e.influence);\n if (i.setPositions(e.positions), e.id != null && (i.id = e.id), e.normals && i.setNormals(e.normals), e.tangents && i.setTangents(e.tangents), e.uvs && i.setUVs(e.uvs), e.animations) {\n for (let r = 0; r < e.animations.length; r++) {\n const s = e.animations[r], a = mr(\"BABYLON.Animation\");\n a && i.animations.push(a.Parse(s));\n }\n e.autoAnimate && t && t.beginAnimation(i, e.autoAnimateFrom, e.autoAnimateTo, e.autoAnimateLoop, e.autoAnimateSpeed || 1);\n }\n return i;\n }\n /**\n * Creates a MorphTarget from mesh data\n * @param mesh defines the source mesh\n * @param name defines the name to use for the new target\n * @param influence defines the influence to attach to the target\n * @returns a new MorphTarget\n */\n static FromMesh(e, t, i) {\n t || (t = e.name);\n const r = new ho(t, i, e.getScene());\n return r.setPositions(e.getVerticesData(I.PositionKind)), e.isVerticesDataPresent(I.NormalKind) && r.setNormals(e.getVerticesData(I.NormalKind)), e.isVerticesDataPresent(I.TangentKind) && r.setTangents(e.getVerticesData(I.TangentKind)), e.isVerticesDataPresent(I.UVKind) && r.setUVs(e.getVerticesData(I.UVKind)), r;\n }\n}\nP([\n U()\n], ho.prototype, \"id\", void 0);\nconst zN = \"kernelBlurVaryingDeclaration\", WN = \"varying vec2 sampleCoord{X};\";\nY.IncludesShadersStore[zN] = WN;\nconst GN = \"kernelBlurFragment\", XN = `#ifdef DOF\nfactor=sampleCoC(sampleCoord{X}); \ncomputedWeight=KERNEL_WEIGHT{X}*factor;sumOfWeights+=computedWeight;\n#else\ncomputedWeight=KERNEL_WEIGHT{X};\n#endif\n#ifdef PACKEDFLOAT\nblend+=unpack(texture2D(textureSampler,sampleCoord{X}))*computedWeight;\n#else\nblend+=texture2D(textureSampler,sampleCoord{X})*computedWeight;\n#endif\n`;\nY.IncludesShadersStore[GN] = XN;\nconst HN = \"kernelBlurFragment2\", KN = `#ifdef DOF\nfactor=sampleCoC(sampleCenter+delta*KERNEL_DEP_OFFSET{X});computedWeight=KERNEL_DEP_WEIGHT{X}*factor;sumOfWeights+=computedWeight;\n#else\ncomputedWeight=KERNEL_DEP_WEIGHT{X};\n#endif\n#ifdef PACKEDFLOAT\nblend+=unpack(texture2D(textureSampler,sampleCenter+delta*KERNEL_DEP_OFFSET{X}))*computedWeight;\n#else\nblend+=texture2D(textureSampler,sampleCenter+delta*KERNEL_DEP_OFFSET{X})*computedWeight;\n#endif\n`;\nY.IncludesShadersStore[HN] = KN;\nconst qN = \"kernelBlurPixelShader\", YN = `uniform sampler2D textureSampler;uniform vec2 delta;varying vec2 sampleCenter;\n#ifdef DOF\nuniform sampler2D circleOfConfusionSampler;float sampleCoC(in vec2 offset) {float coc=texture2D(circleOfConfusionSampler,offset).r;return coc; }\n#endif\n#include[0..varyingCount]\n#ifdef PACKEDFLOAT\n#include\n#endif\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void)\n{float computedWeight=0.0;\n#ifdef PACKEDFLOAT\nfloat blend=0.;\n#else\nvec4 blend=vec4(0.);\n#endif\n#ifdef DOF\nfloat sumOfWeights=CENTER_WEIGHT; \nfloat factor=0.0;\n#ifdef PACKEDFLOAT\nblend+=unpack(texture2D(textureSampler,sampleCenter))*CENTER_WEIGHT;\n#else\nblend+=texture2D(textureSampler,sampleCenter)*CENTER_WEIGHT;\n#endif\n#endif\n#include[0..varyingCount]\n#include[0..depCount]\n#ifdef PACKEDFLOAT\ngl_FragColor=pack(blend);\n#else\ngl_FragColor=blend;\n#endif\n#ifdef DOF\ngl_FragColor/=sumOfWeights;\n#endif\n}`;\nY.ShadersStore[qN] = YN;\nconst ZN = \"kernelBlurVertex\", jN = \"sampleCoord{X}=sampleCenter+delta*KERNEL_OFFSET{X};\";\nY.IncludesShadersStore[ZN] = jN;\nconst QN = \"kernelBlurVertexShader\", JN = `attribute vec2 position;uniform vec2 delta;varying vec2 sampleCenter;\n#include[0..varyingCount]\nconst vec2 madd=vec2(0.5,0.5);\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nsampleCenter=(position*madd+madd);\n#include[0..varyingCount]\ngl_Position=vec4(position,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[QN] = JN;\nclass Xa extends Pt {\n /**\n * Sets the length in pixels of the blur sample region\n */\n set kernel(e) {\n this._idealKernel !== e && (e = Math.max(e, 1), this._idealKernel = e, this._kernel = this._nearestBestKernel(e), this._blockCompilation || this._updateParameters());\n }\n /**\n * Gets the length in pixels of the blur sample region\n */\n get kernel() {\n return this._idealKernel;\n }\n /**\n * Sets whether or not the blur needs to unpack/repack floats\n */\n set packedFloat(e) {\n this._packedFloat !== e && (this._packedFloat = e, this._blockCompilation || this._updateParameters());\n }\n /**\n * Gets whether or not the blur is unpacking/repacking floats\n */\n get packedFloat() {\n return this._packedFloat;\n }\n /**\n * Gets a string identifying the name of the class\n * @returns \"BlurPostProcess\" string\n */\n getClassName() {\n return \"BlurPostProcess\";\n }\n /**\n * Creates a new instance BlurPostProcess\n * @param name The name of the effect.\n * @param direction The direction in which to blur the image.\n * @param kernel The size of the kernel to be used when computing the blur. eg. Size of 3 will blur the center pixel by 2 pixels surrounding it.\n * @param options The required width/height ratio to downsize to before computing the render pass. (Use 1.0 for full size)\n * @param camera The camera to apply the render pass to.\n * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)\n * @param engine The engine which the post process will be applied. (default: current engine)\n * @param reusable If the post process can be reused on the same frame. (default: false)\n * @param textureType Type of textures used when performing the post process. (default: 0)\n * @param defines\n * @param _blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)\n * @param textureFormat Format of textures used when performing the post process. (default: TEXTUREFORMAT_RGBA)\n */\n constructor(e, t, i, r, s, a = le.BILINEAR_SAMPLINGMODE, o, l, c = 0, h = \"\", u = !1, f = 5) {\n super(e, \"kernelBlur\", [\"delta\", \"direction\"], [\"circleOfConfusionSampler\"], r, s, a, o, l, null, c, \"kernelBlur\", { varyingCount: 0, depCount: 0 }, !0, f), this._blockCompilation = u, this._packedFloat = !1, this._staticDefines = \"\", this._staticDefines = h, this.direction = t, this.onApplyObservable.add((d) => {\n this._outputTexture ? d.setFloat2(\"delta\", 1 / this._outputTexture.width * this.direction.x, 1 / this._outputTexture.height * this.direction.y) : d.setFloat2(\"delta\", 1 / this.width * this.direction.x, 1 / this.height * this.direction.y);\n }), this.kernel = i;\n }\n /**\n * Updates the effect with the current post process compile time values and recompiles the shader.\n * @param defines Define statements that should be added at the beginning of the shader. (default: null)\n * @param uniforms Set of uniform variables that will be passed to the shader. (default: null)\n * @param samplers Set of Texture2D variables that will be passed to the shader. (default: null)\n * @param indexParameters The index parameters to be used for babylons include syntax \"#include[0..varyingCount]\". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\n * @param onCompiled Called when the shader has been compiled.\n * @param onError Called if there is an error when compiling a shader.\n */\n updateEffect(e = null, t = null, i = null, r, s, a) {\n this._updateParameters(s, a);\n }\n _updateParameters(e, t) {\n const i = this._kernel, r = (i - 1) / 2;\n let s = [], a = [], o = 0;\n for (let m = 0; m < i; m++) {\n const v = m / (i - 1), E = this._gaussianWeight(v * 2 - 1);\n s[m] = m - r, a[m] = E, o += E;\n }\n for (let m = 0; m < a.length; m++)\n a[m] /= o;\n const l = [], c = [], h = [];\n for (let m = 0; m <= r; m += 2) {\n const v = Math.min(m + 1, Math.floor(r));\n if (m === v)\n h.push({ o: s[m], w: a[m] });\n else {\n const C = v === r, T = a[m] + a[v] * (C ? 0.5 : 1), R = s[m] + 1 / (1 + a[m] / a[v]);\n R === 0 ? (h.push({ o: s[m], w: a[m] }), h.push({ o: s[m + 1], w: a[m + 1] })) : (h.push({ o: R, w: T }), h.push({ o: -R, w: T }));\n }\n }\n for (let m = 0; m < h.length; m++)\n c[m] = h[m].o, l[m] = h[m].w;\n s = c, a = l;\n const u = this.getEngine().getCaps().maxVaryingVectors, f = Math.max(u, 0) - 1;\n let d = Math.min(s.length, f), p = \"\";\n p += this._staticDefines, this._staticDefines.indexOf(\"DOF\") != -1 && (p += `#define CENTER_WEIGHT ${this._glslFloat(a[d - 1])}\n`, d--);\n for (let m = 0; m < d; m++)\n p += `#define KERNEL_OFFSET${m} ${this._glslFloat(s[m])}\n`, p += `#define KERNEL_WEIGHT${m} ${this._glslFloat(a[m])}\n`;\n let g = 0;\n for (let m = f; m < s.length; m++)\n p += `#define KERNEL_DEP_OFFSET${g} ${this._glslFloat(s[m])}\n`, p += `#define KERNEL_DEP_WEIGHT${g} ${this._glslFloat(a[m])}\n`, g++;\n this.packedFloat && (p += \"#define PACKEDFLOAT 1\"), this._blockCompilation = !1, super.updateEffect(p, null, null, {\n varyingCount: d,\n depCount: g\n }, e, t);\n }\n /**\n * Best kernels are odd numbers that when divided by 2, their integer part is even, so 5, 9 or 13.\n * Other odd kernels optimize correctly but require proportionally more samples, even kernels are\n * possible but will produce minor visual artifacts. Since each new kernel requires a new shader we\n * want to minimize kernel changes, having gaps between physical kernels is helpful in that regard.\n * The gaps between physical kernels are compensated for in the weighting of the samples\n * @param idealKernel Ideal blur kernel.\n * @returns Nearest best kernel.\n */\n _nearestBestKernel(e) {\n const t = Math.round(e);\n for (const i of [t, t - 1, t + 1, t - 2, t + 2])\n if (i % 2 !== 0 && Math.floor(i / 2) % 2 === 0 && i > 0)\n return Math.max(i, 3);\n return Math.max(t, 3);\n }\n /**\n * Calculates the value of a Gaussian distribution with sigma 3 at a given point.\n * @param x The point on the Gaussian distribution to sample.\n * @returns the value of the Gaussian function at x.\n */\n _gaussianWeight(e) {\n const t = 0.3333333333333333, i = Math.sqrt(2 * Math.PI) * t, r = -(e * e / (2 * t * t));\n return 1 / i * Math.exp(r);\n }\n /**\n * Generates a string that can be used as a floating point number in GLSL.\n * @param x Value to print.\n * @param decimalFigures Number of decimal places to print the number to (excluding trailing 0s).\n * @returns GLSL float string.\n */\n _glslFloat(e, t = 8) {\n return e.toFixed(t).replace(/0+$/, \"\");\n }\n /**\n * @internal\n */\n static _Parse(e, t, i, r) {\n return Le.Parse(() => new Xa(e.name, e.direction, e.kernel, e.options, t, e.renderTargetSamplingMode, i.getEngine(), e.reusable, e.textureType, void 0, !1), e, i, r);\n }\n}\nP([\n U(\"kernel\")\n], Xa.prototype, \"_kernel\", void 0);\nP([\n U(\"packedFloat\")\n], Xa.prototype, \"_packedFloat\", void 0);\nP([\n X_()\n], Xa.prototype, \"direction\", void 0);\nRe(\"BABYLON.BlurPostProcess\", Xa);\nconst $N = \"bayerDitherFunctions\", eF = `float bayerDither2(vec2 _P) {return mod(2.0*_P.y+_P.x+1.0,4.0);}\nfloat bayerDither4(vec2 _P) {vec2 P1=mod(_P,2.0); \nvec2 P2=floor(0.5*mod(_P,4.0)); \nreturn 4.0*bayerDither2(P1)+bayerDither2(P2);}\nfloat bayerDither8(vec2 _P) {vec2 P1=mod(_P,2.0); \nvec2 P2=floor(0.5 *mod(_P,4.0)); \nvec2 P4=floor(0.25*mod(_P,8.0)); \nreturn 4.0*(4.0*bayerDither2(P1)+bayerDither2(P2))+bayerDither2(P4);}\n`;\nY.IncludesShadersStore[$N] = eF;\nconst tF = \"shadowMapFragmentExtraDeclaration\", iF = `#if SM_FLOAT==0\n#include\n#endif\n#if SM_SOFTTRANSPARENTSHADOW==1\n#include\nuniform float softTransparentShadowSM;\n#endif\nvarying float vDepthMetricSM;\n#if SM_USEDISTANCE==1\nuniform vec3 lightDataSM;varying vec3 vPositionWSM;\n#endif\nuniform vec3 biasAndScaleSM;uniform vec2 depthValuesSM;\n#if defined(SM_DEPTHCLAMP) && SM_DEPTHCLAMP==1\nvarying float zSM;\n#endif\n`;\nY.IncludesShadersStore[tF] = iF;\nconst rF = \"shadowMapFragment\", sF = `float depthSM=vDepthMetricSM;\n#if defined(SM_DEPTHCLAMP) && SM_DEPTHCLAMP==1\n#if SM_USEDISTANCE==1\ndepthSM=(length(vPositionWSM-lightDataSM)+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x;\n#else\n#ifdef USE_REVERSE_DEPTHBUFFER\ndepthSM=(-zSM+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x;\n#else\ndepthSM=(zSM+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x;\n#endif\n#endif\n#ifdef USE_REVERSE_DEPTHBUFFER\ngl_FragDepth=clamp(1.0-depthSM,0.0,1.0);\n#else\ngl_FragDepth=clamp(depthSM,0.0,1.0); \n#endif\n#elif SM_USEDISTANCE==1\ndepthSM=(length(vPositionWSM-lightDataSM)+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x;\n#endif\n#if SM_ESM==1\ndepthSM=clamp(exp(-min(87.,biasAndScaleSM.z*depthSM)),0.,1.);\n#endif\n#if SM_FLOAT==1\ngl_FragColor=vec4(depthSM,1.0,1.0,1.0);\n#else\ngl_FragColor=pack(depthSM);\n#endif\nreturn;`;\nY.IncludesShadersStore[rF] = sF;\nconst nF = \"shadowMapPixelShader\", aF = `#include\n#ifdef ALPHATEXTURE\nvarying vec2 vUV;uniform sampler2D diffuseSampler;\n#endif\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void)\n{\n#include\n#ifdef ALPHATEXTURE\nfloat alphaFromAlphaTexture=texture2D(diffuseSampler,vUV).a;\n#ifdef ALPHATESTVALUE\nif (alphaFromAlphaTexture=softTransparentShadowSM*alphaFromAlphaTexture) discard;\n#else\nif ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM) discard;\n#endif\n#endif\n#include\n}`;\nY.ShadersStore[nF] = aF;\nconst oF = \"sceneVertexDeclaration\", lF = `uniform mat4 viewProjection;\n#ifdef MULTIVIEW\nuniform mat4 viewProjectionR;\n#endif\nuniform mat4 view;uniform mat4 projection;uniform vec4 vEyePosition;\n`;\nY.IncludesShadersStore[oF] = lF;\nconst cF = \"meshVertexDeclaration\", hF = `uniform mat4 world;uniform float visibility;\n`;\nY.IncludesShadersStore[cF] = hF;\nconst uF = \"shadowMapVertexDeclaration\", fF = `#include\n#include\n`;\nY.IncludesShadersStore[uF] = fF;\nconst dF = \"shadowMapUboDeclaration\", pF = `layout(std140,column_major) uniform;\n#include\n#include\n`;\nY.IncludesShadersStore[dF] = pF;\nconst gF = \"shadowMapVertexExtraDeclaration\", mF = `#if SM_NORMALBIAS==1\nuniform vec3 lightDataSM;\n#endif\nuniform vec3 biasAndScaleSM;uniform vec2 depthValuesSM;varying float vDepthMetricSM;\n#if SM_USEDISTANCE==1\nvarying vec3 vPositionWSM;\n#endif\n#if defined(SM_DEPTHCLAMP) && SM_DEPTHCLAMP==1\nvarying float zSM;\n#endif\n`;\nY.IncludesShadersStore[gF] = mF;\nconst _F = \"shadowMapVertexNormalBias\", EF = `#if SM_NORMALBIAS==1\n#if SM_DIRECTIONINLIGHTDATA==1\nvec3 worldLightDirSM=normalize(-lightDataSM.xyz);\n#else\nvec3 directionToLightSM=lightDataSM.xyz-worldPos.xyz;vec3 worldLightDirSM=normalize(directionToLightSM);\n#endif\nfloat ndlSM=dot(vNormalW,worldLightDirSM);float sinNLSM=sqrt(1.0-ndlSM*ndlSM);float normalBiasSM=biasAndScaleSM.y*sinNLSM;worldPos.xyz-=vNormalW*normalBiasSM;\n#endif\n`;\nY.IncludesShadersStore[_F] = EF;\nconst vF = \"shadowMapVertexMetric\", TF = `#if SM_USEDISTANCE==1\nvPositionWSM=worldPos.xyz;\n#endif\n#if SM_DEPTHTEXTURE==1\n#ifdef IS_NDC_HALF_ZRANGE\n#define BIASFACTOR 0.5\n#else\n#define BIASFACTOR 1.0\n#endif\n#ifdef USE_REVERSE_DEPTHBUFFER\ngl_Position.z-=biasAndScaleSM.x*gl_Position.w*BIASFACTOR;\n#else\ngl_Position.z+=biasAndScaleSM.x*gl_Position.w*BIASFACTOR;\n#endif\n#endif\n#if defined(SM_DEPTHCLAMP) && SM_DEPTHCLAMP==1\nzSM=gl_Position.z;gl_Position.z=0.0;\n#elif SM_USEDISTANCE==0\n#ifdef USE_REVERSE_DEPTHBUFFER\nvDepthMetricSM=(-gl_Position.z+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x;\n#else\nvDepthMetricSM=(gl_Position.z+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x;\n#endif\n#endif\n`;\nY.IncludesShadersStore[vF] = TF;\nconst xF = \"shadowMapVertexShader\", CF = `attribute vec3 position;\n#ifdef NORMAL\nattribute vec3 normal;\n#endif\n#include\n#include\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef INSTANCES\nattribute vec4 world0;attribute vec4 world1;attribute vec4 world2;attribute vec4 world3;\n#endif\n#include\n#include<__decl__shadowMapVertex>\n#ifdef ALPHATEXTURE\nvarying vec2 vUV;uniform mat4 diffuseMatrix;\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#ifdef UV2\nattribute vec2 uv2;\n#endif\n#endif\n#include\n#include\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void)\n{vec3 positionUpdated=position;\n#ifdef UV1\nvec2 uvUpdated=uv;\n#endif\n#ifdef NORMAL\nvec3 normalUpdated=normal;\n#endif\n#include\n#include[0..maxSimultaneousMorphTargets]\n#include\n#include\n#include\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\n#ifdef NORMAL\nmat3 normWorldSM=mat3(finalWorld);\n#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvec3 vNormalW=normalUpdated/vec3(dot(normWorldSM[0],normWorldSM[0]),dot(normWorldSM[1],normWorldSM[1]),dot(normWorldSM[2],normWorldSM[2]));vNormalW=normalize(normWorldSM*vNormalW);\n#else\n#ifdef NONUNIFORMSCALING\nnormWorldSM=transposeMat3(inverseMat3(normWorldSM));\n#endif\nvec3 vNormalW=normalize(normWorldSM*normalUpdated);\n#endif\n#endif\n#include\ngl_Position=viewProjection*worldPos;\n#include\n#ifdef ALPHATEXTURE\n#ifdef UV1\nvUV=vec2(diffuseMatrix*vec4(uvUpdated,1.0,0.0));\n#endif\n#ifdef UV2\nvUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0));\n#endif\n#endif\n#include\n}`;\nY.ShadersStore[xF] = CF;\nconst RF = \"depthBoxBlurPixelShader\", SF = `varying vec2 vUV;uniform sampler2D textureSampler;uniform vec2 screenSize;\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void)\n{vec4 colorDepth=vec4(0.0);for (int x=-OFFSET; x<=OFFSET; x++)\nfor (int y=-OFFSET; y<=OFFSET; y++)\ncolorDepth+=texture2D(textureSampler,vUV+vec2(x,y)/screenSize);gl_FragColor=(colorDepth/float((OFFSET*2+1)*(OFFSET*2+1)));}`;\nY.ShadersStore[RF] = SF;\nconst yF = \"shadowMapFragmentSoftTransparentShadow\", IF = `#if SM_SOFTTRANSPARENTSHADOW==1\nif ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM*alpha) discard;\n#endif\n`;\nY.IncludesShadersStore[yF] = IF;\nvar Yg;\n(function(n) {\n n[n.ETC1S = 0] = \"ETC1S\", n[n.UASTC4x4 = 1] = \"UASTC4x4\";\n})(Yg || (Yg = {}));\nvar Zg;\n(function(n) {\n n[n.ASTC_4X4_RGBA = 0] = \"ASTC_4X4_RGBA\", n[n.BC7_RGBA = 1] = \"BC7_RGBA\", n[n.BC3_RGBA = 2] = \"BC3_RGBA\", n[n.BC1_RGB = 3] = \"BC1_RGB\", n[n.PVRTC1_4_RGBA = 4] = \"PVRTC1_4_RGBA\", n[n.PVRTC1_4_RGB = 5] = \"PVRTC1_4_RGB\", n[n.ETC2_RGBA = 6] = \"ETC2_RGBA\", n[n.ETC1_RGB = 7] = \"ETC1_RGB\", n[n.RGBA32 = 8] = \"RGBA32\", n[n.R8 = 9] = \"R8\", n[n.RG8 = 10] = \"RG8\";\n})(Zg || (Zg = {}));\nvar jg;\n(function(n) {\n n[n.COMPRESSED_RGBA_BPTC_UNORM_EXT = 36492] = \"COMPRESSED_RGBA_BPTC_UNORM_EXT\", n[n.COMPRESSED_RGBA_ASTC_4X4_KHR = 37808] = \"COMPRESSED_RGBA_ASTC_4X4_KHR\", n[n.COMPRESSED_RGB_S3TC_DXT1_EXT = 33776] = \"COMPRESSED_RGB_S3TC_DXT1_EXT\", n[n.COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779] = \"COMPRESSED_RGBA_S3TC_DXT5_EXT\", n[n.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 35842] = \"COMPRESSED_RGBA_PVRTC_4BPPV1_IMG\", n[n.COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 35840] = \"COMPRESSED_RGB_PVRTC_4BPPV1_IMG\", n[n.COMPRESSED_RGBA8_ETC2_EAC = 37496] = \"COMPRESSED_RGBA8_ETC2_EAC\", n[n.COMPRESSED_RGB8_ETC2 = 37492] = \"COMPRESSED_RGB8_ETC2\", n[n.COMPRESSED_RGB_ETC1_WEBGL = 36196] = \"COMPRESSED_RGB_ETC1_WEBGL\", n[n.RGBA8Format = 32856] = \"RGBA8Format\", n[n.R8Format = 33321] = \"R8Format\", n[n.RG8Format = 33323] = \"RG8Format\";\n})(jg || (jg = {}));\nvar Qg;\n(function(n) {\n class e {\n /**\n * Serialize the Alphabet to JSON string.\n * @returns JSON serialization\n */\n serialize() {\n const r = {}, s = new Array(this._characterToIdx.size);\n return this._characterToIdx.forEach((a, o) => {\n s[a] = o;\n }), r.characters = s, r.insertionCosts = this._insertionCosts, r.deletionCosts = this._deletionCosts, r.substitutionCosts = this._substitutionCosts, JSON.stringify(r);\n }\n /**\n * Parse an Alphabet from a JSON serialization.\n * @param json JSON string to deserialize\n * @returns deserialized Alphabet\n */\n static Deserialize(r) {\n const s = JSON.parse(r), a = new e(s.characters);\n return a._insertionCosts = s.insertionCosts, a._deletionCosts = s.deletionCosts, a._substitutionCosts = s.substitutionCosts, a;\n }\n /**\n * Create a new Alphabet.\n * @param characters characters of the alphabet\n * @param charToInsertionCost function mapping characters to insertion costs\n * @param charToDeletionCost function mapping characters to deletion costs\n * @param charsToSubstitutionCost function mapping character pairs to substitution costs\n */\n constructor(r, s = null, a = null, o = null) {\n s = s ?? (() => 1), a = a ?? (() => 1), o = o ?? ((c, h) => c === h ? 0 : 1), this._characterToIdx = /* @__PURE__ */ new Map(), this._insertionCosts = new Array(r.length), this._deletionCosts = new Array(r.length), this._substitutionCosts = new Array(r.length);\n let l;\n for (let c = 0; c < r.length; ++c) {\n l = r[c], this._characterToIdx.set(l, c), this._insertionCosts[c] = s(l), this._deletionCosts[c] = a(l), this._substitutionCosts[c] = new Array(r.length);\n for (let h = c; h < r.length; ++h)\n this._substitutionCosts[c][h] = o(l, r[h]);\n }\n }\n /**\n * Get the index (internally-assigned number) for a character.\n * @param char character\n * @returns index\n */\n getCharacterIdx(r) {\n return this._characterToIdx.get(r);\n }\n /**\n * Get the insertion cost of a character from its index.\n * @param idx character index\n * @returns insertion cost\n */\n getInsertionCost(r) {\n return this._insertionCosts[r];\n }\n /**\n * Get the deletion cost of a character from its index.\n * @param idx character index\n * @returns deletion cost\n */\n getDeletionCost(r) {\n return this._deletionCosts[r];\n }\n /**\n * Gets the cost to substitute two characters. NOTE: this cost is\n * required to be bi-directional, meaning it cannot matter which of\n * the provided characters is being removed and which is being inserted.\n * @param idx1 the first character index\n * @param idx2 the second character index\n * @returns substitution cost\n */\n getSubstitutionCost(r, s) {\n const a = Math.min(r, s), o = Math.max(r, s);\n return this._substitutionCosts[a][o];\n }\n }\n n.Alphabet = e;\n class t {\n /**\n * Serialize to JSON string. JSON representation does NOT include the Alphabet\n * from which this Sequence was created; Alphabet must be independently\n * serialized.\n * @returns JSON string\n */\n serialize() {\n return JSON.stringify(this._characters);\n }\n /**\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\n * from which the Sequence was originally created, which must be serialized and\n * deserialized independently so that it can be passed in here.\n * @param json JSON string representation of Sequence\n * @param alphabet Alphabet from which Sequence was originally created\n * @returns Sequence\n */\n static Deserialize(r, s) {\n const a = new t([], s);\n return a._characters = JSON.parse(r), a;\n }\n /**\n * Create a new Sequence.\n * @param characters characters in the new Sequence\n * @param alphabet Alphabet, which must include all used characters\n */\n constructor(r, s) {\n if (r.length > t._MAX_SEQUENCE_LENGTH)\n throw new Error(\"Sequences longer than \" + t._MAX_SEQUENCE_LENGTH + \" not supported.\");\n this._alphabet = s, this._characters = r.map((a) => this._alphabet.getCharacterIdx(a));\n }\n /**\n * Get the distance between this Sequence and another.\n * @param other sequence to compare to\n * @returns Levenshtein distance\n */\n distance(r) {\n return t._Distance(this, r);\n }\n /**\n * Compute the Levenshtein distance between two Sequences.\n * @param a first Sequence\n * @param b second Sequence\n * @returns Levenshtein distance\n */\n static _Distance(r, s) {\n const a = r._alphabet;\n if (a !== s._alphabet)\n throw new Error(\"Cannot Levenshtein compare Sequences built from different alphabets.\");\n const o = r._characters, l = s._characters, c = o.length, h = l.length, u = t._CostMatrix;\n u[0][0] = 0;\n for (let f = 0; f < c; ++f)\n u[f + 1][0] = u[f][0] + a.getInsertionCost(o[f]);\n for (let f = 0; f < h; ++f)\n u[0][f + 1] = u[0][f] + a.getInsertionCost(l[f]);\n for (let f = 0; f < c; ++f)\n for (let d = 0; d < h; ++d)\n t._InsertionCost = u[f + 1][d] + a.getInsertionCost(l[d]), t._DeletionCost = u[f][d + 1] + a.getDeletionCost(o[f]), t._SubstitutionCost = u[f][d] + a.getSubstitutionCost(o[f], l[d]), u[f + 1][d + 1] = Math.min(t._InsertionCost, t._DeletionCost, t._SubstitutionCost);\n return u[c][h];\n }\n }\n t._MAX_SEQUENCE_LENGTH = 256, t._CostMatrix = [...Array(t._MAX_SEQUENCE_LENGTH + 1)].map(() => new Array(t._MAX_SEQUENCE_LENGTH + 1)), n.Sequence = t;\n})(Qg || (Qg = {}));\nnew w();\nvar Jg;\n(function(n) {\n n[n.INIT = 0] = \"INIT\", n[n.STARTED = 1] = \"STARTED\", n[n.ENDED = 2] = \"ENDED\";\n})(Jg || (Jg = {}));\nconst bF = 1.5;\nclass Zs {\n /**\n * Creates a new DynamicFloat32Array with the desired item capacity.\n * @param itemCapacity The initial item capacity you would like to set for the array.\n */\n constructor(e) {\n this._view = new Float32Array(e), this._itemLength = 0;\n }\n /**\n * The number of items currently in the array.\n */\n get itemLength() {\n return this._itemLength;\n }\n /**\n * Gets value at index, NaN if no such index exists.\n * @param index the index to get the value at.\n * @returns the value at the index provided.\n */\n at(e) {\n return e < 0 || e >= this._itemLength ? NaN : this._view[e];\n }\n /**\n * Gets a view of the original array from start to end (exclusive of end).\n * @param start starting index.\n * @param end ending index.\n * @returns a subarray of the original array.\n */\n subarray(e, t) {\n return e >= t || e < 0 ? new Float32Array(0) : (t > this._itemLength && (t = this._itemLength), this._view.subarray(e, t));\n }\n /**\n * Pushes items to the end of the array.\n * @param item The item to push into the array.\n */\n push(e) {\n this._view[this._itemLength] = e, this._itemLength++, this._itemLength >= this._view.length && this._growArray();\n }\n /**\n * Grows the array by the growth factor when necessary.\n */\n _growArray() {\n const e = Math.floor(this._view.length * bF), t = new Float32Array(e);\n t.set(this._view), this._view = t;\n }\n}\nconst js = 1800, AF = 24, MF = \"0\", $g = \"timestamp\", em = \"numPoints\", PF = /\\r/g, jh = \"@\";\nclass Xr {\n /**\n * The offset for when actual data values start appearing inside a slice.\n */\n static get SliceDataOffset() {\n return 2;\n }\n /**\n * The offset for the value of the number of points inside a slice.\n */\n static get NumberOfPointsOffset() {\n return 1;\n }\n /**\n * Handles the creation of a performance viewer collector.\n * @param _scene the scene to collect on.\n * @param _enabledStrategyCallbacks the list of data to collect with callbacks for initialization purposes.\n */\n constructor(e, t) {\n this._scene = e, this._collectDataAtFrame = () => {\n const i = sr.Now - this._startingTimestamp, r = this.datasets.ids.length, s = this.datasets.startingIndices.itemLength;\n let a = 0;\n if (s > 0) {\n const o = this.datasets.startingIndices.at(s - 1);\n a = o + this.datasets.data.at(o + Xr.NumberOfPointsOffset) + Xr.SliceDataOffset;\n }\n if (this.datasets.startingIndices.push(a), this.datasets.data.push(i), this.datasets.data.push(r), this.datasets.ids.forEach((o) => {\n const l = this._strategies.get(o);\n l && this.datasets.data.push(l.getData());\n }), this.datasetObservable.hasObservers()) {\n const o = [i, r];\n for (let l = 0; l < r; l++)\n o.push(this.datasets.data.at(a + Xr.SliceDataOffset + l));\n this.datasetObservable.notifyObservers(o);\n }\n }, this.datasets = {\n ids: [],\n data: new Zs(js),\n startingIndices: new Zs(js)\n }, this._strategies = /* @__PURE__ */ new Map(), this._datasetMeta = /* @__PURE__ */ new Map(), this._eventRestoreSet = /* @__PURE__ */ new Set(), this._customEventObservable = new he(), this.datasetObservable = new he(), this.metadataObservable = new he((i) => i.callback(this._datasetMeta, new P_(0))), t && this.addCollectionStrategies(...t);\n }\n /**\n * Registers a custom string event which will be callable via sendEvent. This method returns an event object which will contain the id of the event.\n * The user can set a value optionally, which will be used in the sendEvent method. If the value is set, we will record this value at the end of each frame,\n * if not we will increment our counter and record the value of the counter at the end of each frame. The value recorded is 0 if no sendEvent method is called, within a frame.\n * @param name The name of the event to register\n * @param forceUpdate if the code should force add an event, and replace the last one.\n * @param category the category for that event\n * @returns The event registered, used in sendEvent\n */\n registerEvent(e, t, i) {\n var a;\n if (this._strategies.has(e) && !t)\n return;\n this._strategies.has(e) && t && ((a = this._strategies.get(e)) == null || a.dispose(), this._strategies.delete(e));\n const r = (o) => {\n let l = 0, c = 0;\n const h = o.onAfterRenderObservable.add(() => {\n c = l, l = 0;\n }), u = this._customEventObservable.add((f) => {\n e === f.name && (f.value !== void 0 ? l = f.value : l++);\n });\n return {\n id: e,\n getData: () => c,\n dispose: () => {\n o.onAfterRenderObservable.remove(h), this._customEventObservable.remove(u);\n }\n };\n }, s = {\n name: e\n };\n return this._eventRestoreSet.add(e), this.addCollectionStrategies({ strategyCallback: r, category: i }), s;\n }\n /**\n * Lets the perf collector handle an event, occurences or event value depending on if the event.value params is set.\n * @param event the event to handle an occurence for\n */\n sendEvent(e) {\n this._customEventObservable.notifyObservers(e);\n }\n /**\n * This event restores all custom string events if necessary.\n */\n _restoreStringEvents() {\n this._eventRestoreSet.size !== this._customEventObservable.observers.length && this._eventRestoreSet.forEach((e) => {\n this.registerEvent(e, !0);\n });\n }\n /**\n * This method adds additional collection strategies for data collection purposes.\n * @param strategyCallbacks the list of data to collect with callbacks.\n */\n addCollectionStrategies(...e) {\n for (let { strategyCallback: t, category: i, hidden: r } of e) {\n const s = t(this._scene);\n if (this._strategies.has(s.id)) {\n s.dispose();\n continue;\n }\n this.datasets.ids.push(s.id), i && (i = i.replace(new RegExp(jh, \"g\"), \"\")), this._datasetMeta.set(s.id, {\n color: this._getHexColorFromId(s.id),\n category: i,\n hidden: r\n }), this._strategies.set(s.id, s);\n }\n this.metadataObservable.notifyObservers(this._datasetMeta);\n }\n /**\n * Gets a 6 character hexcode representing the colour from a passed in string.\n * @param id the string to get a hex code for.\n * @returns a hexcode hashed from the id.\n */\n _getHexColorFromId(e) {\n let t = 0;\n for (let r = 0; r < e.length; r++)\n t = e.charCodeAt(r) + ((t << 5) - t);\n let i = \"#\";\n for (let r = 0; r < AF; r += 8) {\n const s = t >> r & 255;\n i += (MF + s.toString(16)).substr(-2);\n }\n return i;\n }\n /**\n * Collects and then sends the latest slice to any observers by using the appropriate strategy when the user wants.\n * The slice will be of the form [timestamp, numberOfPoints, value1, value2...]\n * This method does not add onto the collected data accessible via the datasets variable.\n */\n getCurrentSlice() {\n const e = sr.Now - this._startingTimestamp, t = this.datasets.ids.length, i = [e, t];\n this.datasets.ids.forEach((r) => {\n const s = this._strategies.get(r);\n s && this.datasetObservable.hasObservers() && i.push(s.getData());\n }), this.datasetObservable.hasObservers() && this.datasetObservable.notifyObservers(i);\n }\n /**\n * Updates a property for a dataset's metadata with the value provided.\n * @param id the id of the dataset which needs its metadata updated.\n * @param prop the property to update.\n * @param value the value to update the property with.\n */\n updateMetadata(e, t, i) {\n const r = this._datasetMeta.get(e);\n r && (r[t] = i, this.metadataObservable.notifyObservers(this._datasetMeta));\n }\n /**\n * Completely clear, data, ids, and strategies saved to this performance collector.\n * @param preserveStringEventsRestore if it should preserve the string events, by default will clear string events registered when called.\n */\n clear(e) {\n this.datasets.data = new Zs(js), this.datasets.ids.length = 0, this.datasets.startingIndices = new Zs(js), this._datasetMeta.clear(), this._strategies.forEach((t) => t.dispose()), this._strategies.clear(), e || this._eventRestoreSet.clear(), this._hasLoadedData = !1;\n }\n /**\n * Accessor which lets the caller know if the performance collector has data loaded from a file or not!\n * Call clear() to reset this value.\n * @returns true if the data is loaded from a file, false otherwise.\n */\n get hasLoadedData() {\n return this._hasLoadedData;\n }\n /**\n * Given a string containing file data, this function parses the file data into the datasets object.\n * It returns a boolean to indicate if this object was successfully loaded with the data.\n * @param data string content representing the file data.\n * @param keepDatasetMeta if it should use reuse the existing dataset metadata\n * @returns true if the data was successfully loaded, false otherwise.\n */\n loadFromFileData(e, t) {\n const i = e.replace(PF, \"\").split(`\n`).map((u) => u.split(\",\").filter((f) => f.length > 0)).filter((u) => u.length > 0), r = 0, s = Xr.NumberOfPointsOffset;\n if (i.length < 2)\n return !1;\n const a = {\n ids: [],\n data: new Zs(js),\n startingIndices: new Zs(js)\n }, [o, ...l] = i;\n if (o.length < 2 || o[r] !== $g || o[s] !== em)\n return !1;\n const c = /* @__PURE__ */ new Map();\n for (let u = Xr.SliceDataOffset; u < o.length; u++) {\n const [f, d] = o[u].split(jh);\n a.ids.push(f), c.set(f, d);\n }\n let h = 0;\n for (const u of l) {\n if (u.length < 2)\n return !1;\n const f = parseFloat(u[r]), d = parseInt(u[s]);\n if (isNaN(d) || isNaN(f) || (a.data.push(f), a.data.push(d), d + Xr.SliceDataOffset !== u.length))\n return !1;\n for (let p = Xr.SliceDataOffset; p < u.length; p++) {\n const g = parseFloat(u[p]);\n if (isNaN(g))\n return !1;\n a.data.push(g);\n }\n a.startingIndices.push(h), h += u.length;\n }\n if (this.datasets.ids = a.ids, this.datasets.data = a.data, this.datasets.startingIndices = a.startingIndices, t || this._datasetMeta.clear(), this._strategies.forEach((u) => u.dispose()), this._strategies.clear(), !t)\n for (const u of this.datasets.ids) {\n const f = c.get(u);\n this._datasetMeta.set(u, { category: f, color: this._getHexColorFromId(u) });\n }\n return this.metadataObservable.notifyObservers(this._datasetMeta), this._hasLoadedData = !0, !0;\n }\n /**\n * Exports the datasets inside of the collector to a csv.\n */\n exportDataToCsv() {\n let e = \"\";\n e += `${$g},${em}`;\n for (let i = 0; i < this.datasets.ids.length; i++)\n if (e += `,${this.datasets.ids[i]}`, this._datasetMeta) {\n const r = this._datasetMeta.get(this.datasets.ids[i]);\n r != null && r.category && (e += `${jh}${r.category}`);\n }\n e += `\n`;\n for (let i = 0; i < this.datasets.startingIndices.itemLength; i++) {\n const r = this.datasets.startingIndices.at(i), s = this.datasets.data.at(r), a = this.datasets.data.at(r + Xr.NumberOfPointsOffset);\n e += `${s},${a}`;\n for (let o = 0; o < a; o++)\n e += `,${this.datasets.data.at(r + Xr.SliceDataOffset + o)}`;\n for (let o = 0; o < this.datasets.ids.length - a; o++)\n e += \",\";\n e += `\n`;\n }\n const t = `${(/* @__PURE__ */ new Date()).toISOString()}-perfdata.csv`;\n ge.Download(new Blob([e], { type: \"text/csv\" }), t);\n }\n /**\n * Starts the realtime collection of data.\n * @param shouldPreserve optional boolean param, if set will preserve the dataset between calls of start.\n */\n start(e) {\n e ? this._startingTimestamp === void 0 && (this._startingTimestamp = sr.Now) : (this.datasets.data = new Zs(js), this.datasets.startingIndices = new Zs(js), this._startingTimestamp = sr.Now), this._scene.onAfterRenderObservable.add(this._collectDataAtFrame), this._restoreStringEvents(), this._isStarted = !0;\n }\n /**\n * Stops the collection of data.\n */\n stop() {\n this._scene.onAfterRenderObservable.removeCallback(this._collectDataAtFrame), this._isStarted = !1;\n }\n /**\n * Returns if the perf collector has been started or not.\n */\n get isStarted() {\n return this._isStarted;\n }\n /**\n * Disposes of the object\n */\n dispose() {\n this._scene.onAfterRenderObservable.removeCallback(this._collectDataAtFrame), this._datasetMeta.clear(), this._strategies.forEach((e) => {\n e.dispose();\n }), this.datasetObservable.clear(), this.metadataObservable.clear(), this._isStarted = !1, this.datasets = null;\n }\n}\nOt.prototype.getPerfCollector = function() {\n return this._perfCollector || (this._perfCollector = new Xr(this)), this._perfCollector;\n};\nfunction OF(n) {\n const e = new Array(), t = new Array(), i = new Array(), r = n.add(() => {\n const a = e.length;\n for (let o = 0; o < a; o++)\n rc(e.shift(), t.shift(), i.shift());\n });\n return {\n scheduler: (a, o, l) => {\n e.push(a), t.push(o), i.push(l);\n },\n dispose: () => {\n n.remove(r);\n }\n };\n}\nhe.prototype.runCoroutineAsync = function(n) {\n if (!this._coroutineScheduler) {\n const e = OF(this);\n this._coroutineScheduler = e.scheduler, this._coroutineSchedulerDispose = e.dispose;\n }\n return j_(n, this._coroutineScheduler);\n};\nhe.prototype.cancelAllCoroutines = function() {\n this._coroutineSchedulerDispose && this._coroutineSchedulerDispose(), this._coroutineScheduler = void 0, this._coroutineSchedulerDispose = void 0;\n};\nconst DF = \"copyTextureToTexturePixelShader\", NF = `uniform float conversion;uniform sampler2D textureSampler;varying vec2 vUV;\n#include\nvoid main(void) \n{vec4 color=texture2D(textureSampler,vUV);\n#ifdef DEPTH_TEXTURE\ngl_FragDepth=color.r;\n#else\nif (conversion==1.) {color=toLinearSpace(color);} else if (conversion==2.) {color=toGammaSpace(color);}\ngl_FragColor=color;\n#endif\n}\n`;\nY.ShadersStore[DF] = NF;\nvar tm;\n(function(n) {\n n[n.None = 0] = \"None\", n[n.ToLinearSpace = 1] = \"ToLinearSpace\", n[n.ToGammaSpace = 2] = \"ToGammaSpace\";\n})(tm || (tm = {}));\nXo.prototype.removeReflectionProbe = function(n) {\n if (!this.reflectionProbes)\n return -1;\n const e = this.reflectionProbes.indexOf(n);\n return e !== -1 && this.reflectionProbes.splice(e, 1), e;\n};\nXo.prototype.addReflectionProbe = function(n) {\n this.reflectionProbes || (this.reflectionProbes = []), this.reflectionProbes.push(n);\n};\nclass Yc {\n /**\n * Creates a new reflection probe\n * @param name defines the name of the probe\n * @param size defines the texture resolution (for each face)\n * @param scene defines the hosting scene\n * @param generateMipMaps defines if mip maps should be generated automatically (true by default)\n * @param useFloat defines if HDR data (float data) should be used to store colors (false by default)\n * @param linearSpace defines if the probe should be generated in linear space or not (false by default)\n */\n constructor(e, t, i, r = !0, s = !1, a = !1) {\n if (this.name = e, this._viewMatrix = w.Identity(), this._target = _.Zero(), this._add = _.Zero(), this._invertYAxis = !1, this.position = _.Zero(), this.metadata = null, this._parentContainer = null, this._scene = i, i.getEngine().supportsUniformBuffers) {\n this._sceneUBOs = [];\n for (let h = 0; h < 6; ++h)\n this._sceneUBOs.push(i.createSceneUniformBuffer(`Scene for Reflection Probe (name \"${e}\") face #${h}`));\n }\n this._scene.reflectionProbes || (this._scene.reflectionProbes = []), this._scene.reflectionProbes.push(this);\n let o = 0;\n if (s) {\n const h = this._scene.getEngine().getCaps();\n h.textureHalfFloatRender ? o = 2 : h.textureFloatRender && (o = 1);\n }\n this._renderTargetTexture = new gr(e, t, i, r, !0, o, !0), this._renderTargetTexture.gammaSpace = !a, this._renderTargetTexture.invertZ = i.useRightHandedSystem;\n const l = i.getEngine().useReverseDepthBuffer;\n this._renderTargetTexture.onBeforeRenderObservable.add((h) => {\n switch (this._sceneUBOs && (i.setSceneUniformBuffer(this._sceneUBOs[h]), i.getSceneUniformBuffer().unbindEffect()), h) {\n case 0:\n this._add.copyFromFloats(1, 0, 0);\n break;\n case 1:\n this._add.copyFromFloats(-1, 0, 0);\n break;\n case 2:\n this._add.copyFromFloats(0, this._invertYAxis ? 1 : -1, 0);\n break;\n case 3:\n this._add.copyFromFloats(0, this._invertYAxis ? -1 : 1, 0);\n break;\n case 4:\n this._add.copyFromFloats(0, 0, i.useRightHandedSystem ? -1 : 1);\n break;\n case 5:\n this._add.copyFromFloats(0, 0, i.useRightHandedSystem ? 1 : -1);\n break;\n }\n this._attachedMesh && this.position.copyFrom(this._attachedMesh.getAbsolutePosition()), this.position.addToRef(this._add, this._target);\n const u = i.useRightHandedSystem ? w.LookAtRHToRef : w.LookAtLHToRef, f = i.useRightHandedSystem ? w.PerspectiveFovRH : w.PerspectiveFovLH;\n u(this.position, this._target, _.Up(), this._viewMatrix), i.activeCamera && (this._projectionMatrix = f(Math.PI / 2, 1, l ? i.activeCamera.maxZ : i.activeCamera.minZ, l ? i.activeCamera.minZ : i.activeCamera.maxZ, this._scene.getEngine().isNDCHalfZRange), i.setTransformMatrix(this._viewMatrix, this._projectionMatrix), i.activeCamera.isRigCamera && !this._renderTargetTexture.activeCamera && (this._renderTargetTexture.activeCamera = i.activeCamera.rigParent || null)), i._forcedViewPosition = this.position;\n });\n let c;\n this._renderTargetTexture.onBeforeBindObservable.add(() => {\n var h, u;\n this._currentSceneUBO = i.getSceneUniformBuffer(), (u = (h = i.getEngine())._debugPushGroup) == null || u.call(h, `reflection probe generation for ${e}`, 1), c = this._scene.imageProcessingConfiguration.applyByPostProcess, a && (i.imageProcessingConfiguration.applyByPostProcess = !0);\n }), this._renderTargetTexture.onAfterUnbindObservable.add(() => {\n var h, u;\n i.imageProcessingConfiguration.applyByPostProcess = c, i._forcedViewPosition = null, this._sceneUBOs && i.setSceneUniformBuffer(this._currentSceneUBO), i.updateTransformMatrix(!0), (u = (h = i.getEngine())._debugPopGroup) == null || u.call(h, 1);\n });\n }\n /** Gets or sets the number of samples to use for multi-sampling (0 by default). Required WebGL2 */\n get samples() {\n return this._renderTargetTexture.samples;\n }\n set samples(e) {\n this._renderTargetTexture.samples = e;\n }\n /** Gets or sets the refresh rate to use (on every frame by default) */\n get refreshRate() {\n return this._renderTargetTexture.refreshRate;\n }\n set refreshRate(e) {\n this._renderTargetTexture.refreshRate = e;\n }\n /**\n * Gets the hosting scene\n * @returns a Scene\n */\n getScene() {\n return this._scene;\n }\n /** Gets the internal CubeTexture used to render to */\n get cubeTexture() {\n return this._renderTargetTexture;\n }\n /** Gets or sets the list of meshes to render */\n get renderList() {\n return this._renderTargetTexture.renderList;\n }\n set renderList(e) {\n this._renderTargetTexture.renderList = e;\n }\n /**\n * Attach the probe to a specific mesh (Rendering will be done from attached mesh's position)\n * @param mesh defines the mesh to attach to\n */\n attachToMesh(e) {\n this._attachedMesh = e;\n }\n /**\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\n */\n setRenderingAutoClearDepthStencil(e, t) {\n this._renderTargetTexture.setRenderingAutoClearDepthStencil(e, t);\n }\n /**\n * Clean all associated resources\n */\n dispose() {\n const e = this._scene.reflectionProbes.indexOf(this);\n if (e !== -1 && this._scene.reflectionProbes.splice(e, 1), this._parentContainer) {\n const t = this._parentContainer.reflectionProbes.indexOf(this);\n t > -1 && this._parentContainer.reflectionProbes.splice(t, 1), this._parentContainer = null;\n }\n if (this._renderTargetTexture && (this._renderTargetTexture.dispose(), this._renderTargetTexture = null), this._sceneUBOs) {\n for (const t of this._sceneUBOs)\n t.dispose();\n this._sceneUBOs = [];\n }\n }\n /**\n * Converts the reflection probe information to a readable string for debug purpose.\n * @param fullDetails Supports for multiple levels of logging within scene loading\n * @returns the human readable reflection probe info\n */\n toString(e) {\n let t = \"Name: \" + this.name;\n return e && (t += \", position: \" + this.position.toString(), this._attachedMesh && (t += \", attached mesh: \" + this._attachedMesh.name)), t;\n }\n /**\n * Get the class name of the refection probe.\n * @returns \"ReflectionProbe\"\n */\n getClassName() {\n return \"ReflectionProbe\";\n }\n /**\n * Serialize the reflection probe to a JSON representation we can easily use in the respective Parse function.\n * @returns The JSON representation of the texture\n */\n serialize() {\n const e = Le.Serialize(this, this._renderTargetTexture.serialize());\n return e.isReflectionProbe = !0, e.metadata = this.metadata, e;\n }\n /**\n * Parse the JSON representation of a reflection probe in order to recreate the reflection probe in the given scene.\n * @param parsedReflectionProbe Define the JSON representation of the reflection probe\n * @param scene Define the scene the parsed reflection probe should be instantiated in\n * @param rootUrl Define the root url of the parsing sequence in the case of relative dependencies\n * @returns The parsed reflection probe if successful\n */\n static Parse(e, t, i) {\n let r = null;\n if (t.reflectionProbes)\n for (let s = 0; s < t.reflectionProbes.length; s++) {\n const a = t.reflectionProbes[s];\n if (a.name === e.name) {\n r = a;\n break;\n }\n }\n return r = Le.Parse(() => r || new Yc(e.name, e.renderTargetSize, t, e._generateMipMaps), e, t, i), r.cubeTexture._waitingRenderList = e.renderList, e._attachedMesh && r.attachToMesh(t.getMeshById(e._attachedMesh)), e.metadata && (r.metadata = e.metadata), r;\n }\n}\nP([\n Sy()\n], Yc.prototype, \"_attachedMesh\", void 0);\nP([\n cn()\n], Yc.prototype, \"position\", void 0);\nclass FF {\n /**\n * Creates a new instance of the component for the given scene\n * @param scene Defines the scene to register the component in\n */\n constructor(e) {\n this.name = ke.NAME_PROCEDURALTEXTURE, this.scene = e, this.scene.proceduralTextures = [];\n }\n /**\n * Registers the component in a given scene\n */\n register() {\n this.scene._beforeClearStage.registerStep(ke.STEP_BEFORECLEAR_PROCEDURALTEXTURE, this, this._beforeClear);\n }\n /**\n * Rebuilds the elements related to this component in case of\n * context lost for instance.\n */\n rebuild() {\n }\n /**\n * Disposes the component and the associated resources.\n */\n dispose() {\n }\n _beforeClear() {\n if (this.scene.proceduralTexturesEnabled) {\n ge.StartPerformanceCounter(\"Procedural textures\", this.scene.proceduralTextures.length > 0);\n for (let e = 0; e < this.scene.proceduralTextures.length; e++) {\n const t = this.scene.proceduralTextures[e];\n t._shouldRender() && t.render();\n }\n ge.EndPerformanceCounter(\"Procedural textures\", this.scene.proceduralTextures.length > 0);\n }\n }\n}\nconst LF = \"proceduralVertexShader\", wF = `attribute vec2 position;varying vec2 vPosition;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5);\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvPosition=position;vUV=position*madd+madd;gl_Position=vec4(position,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[LF] = wF;\nclass fn extends le {\n /**\n * Instantiates a new procedural texture.\n * Procedural texturing is a way to programmatically create a texture. There are 2 types of procedural textures: code-only, and code that references some classic 2D images, sometimes called 'refMaps' or 'sampler' images.\n * This is the base class of any Procedural texture and contains most of the shareable code.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures\n * @param name Define the name of the texture\n * @param size Define the size of the texture to create\n * @param fragment Define the fragment shader to use to generate the texture or null if it is defined later:\n * * object: \\{ fragmentElement: \"fragmentShaderCode\" \\}, used with shader code in script tags\n * * object: \\{ fragmentSource: \"fragment shader code string\" \\}, the string contains the shader code\n * * string: the string contains a name \"XXX\" to lookup in Effect.ShadersStore[\"XXXFragmentShader\"]\n * @param scene Define the scene the texture belongs to\n * @param fallbackTexture Define a fallback texture in case there were issues to create the custom texture\n * @param generateMipMaps Define if the texture should creates mip maps or not\n * @param isCube Define if the texture is a cube texture or not (this will render each faces of the cube)\n * @param textureType The FBO internal texture type\n */\n constructor(e, t, i, r, s = null, a = !0, o = !1, l = 0) {\n super(null, r, !a), this.isEnabled = !0, this.autoClear = !0, this.onGeneratedObservable = new he(), this.onBeforeGenerationObservable = new he(), this.nodeMaterialSource = null, this._textures = {}, this._currentRefreshId = -1, this._frameId = -1, this._refreshRate = 1, this._vertexBuffers = {}, this._uniforms = new Array(), this._samplers = new Array(), this._floats = {}, this._ints = {}, this._floatsArrays = {}, this._colors3 = {}, this._colors4 = {}, this._vectors2 = {}, this._vectors3 = {}, this._matrices = {}, this._fallbackTextureUsed = !1, this._cachedDefines = null, this._contentUpdateId = -1, this._rtWrapper = null, s !== null && !(s instanceof le) ? (this._options = s, this._fallbackTexture = s.fallbackTexture ?? null) : (this._options = {}, this._fallbackTexture = s), r = this.getScene() || st.LastCreatedScene;\n let c = r._getComponent(ke.NAME_PROCEDURALTEXTURE);\n c || (c = new FF(r), r._addComponent(c)), r.proceduralTextures.push(this), this._fullEngine = r.getEngine(), this.name = e, this.isRenderTarget = !0, this._size = t, this._textureType = l, this._generateMipMaps = a, this._drawWrapper = new ka(this._fullEngine), this.setFragment(i);\n const h = this._createRtWrapper(o, t, a, l);\n this._texture = h.texture;\n const u = [];\n u.push(1, 1), u.push(-1, 1), u.push(-1, -1), u.push(1, -1), this._vertexBuffers[I.PositionKind] = new I(this._fullEngine, u, I.PositionKind, !1, !1, 2), this._createIndexBuffer();\n }\n _createRtWrapper(e, t, i, r) {\n return e ? (this._rtWrapper = this._fullEngine.createRenderTargetCubeTexture(t, {\n generateMipMaps: i,\n generateDepthBuffer: !1,\n generateStencilBuffer: !1,\n type: r,\n ...this._options\n }), this.setFloat(\"face\", 0)) : this._rtWrapper = this._fullEngine.createRenderTargetTexture(t, {\n generateMipMaps: i,\n generateDepthBuffer: !1,\n generateStencilBuffer: !1,\n type: r,\n ...this._options\n }), this._rtWrapper;\n }\n /**\n * The effect that is created when initializing the post process.\n * @returns The created effect corresponding the postprocess.\n */\n getEffect() {\n return this._drawWrapper.effect;\n }\n /**\n * @internal\n */\n _setEffect(e) {\n this._drawWrapper.effect = e;\n }\n /**\n * Gets texture content (Use this function wisely as reading from a texture can be slow)\n * @returns an ArrayBufferView promise (Uint8Array or Float32Array)\n */\n getContent() {\n return this._contentData && this._frameId === this._contentUpdateId ? this._contentData : (this._contentData ? this._contentData.then((e) => {\n this._contentData = this.readPixels(0, 0, e), this._contentUpdateId = this._frameId;\n }) : (this._contentData = this.readPixels(0, 0), this._contentUpdateId = this._frameId), this._contentData);\n }\n _createIndexBuffer() {\n const e = this._fullEngine, t = [];\n t.push(0), t.push(1), t.push(2), t.push(0), t.push(2), t.push(3), this._indexBuffer = e.createIndexBuffer(t);\n }\n /** @internal */\n _rebuild() {\n const e = this._vertexBuffers[I.PositionKind];\n e && e._rebuild(), this._createIndexBuffer(), this.refreshRate === gr.REFRESHRATE_RENDER_ONCE && (this.refreshRate = gr.REFRESHRATE_RENDER_ONCE);\n }\n /**\n * Resets the texture in order to recreate its associated resources.\n * This can be called in case of context loss or if you change the shader code and need to regenerate the texture with the new code\n */\n reset() {\n var e;\n (e = this._drawWrapper.effect) == null || e.dispose(), this._drawWrapper.effect = null, this._cachedDefines = null;\n }\n _getDefines() {\n return \"\";\n }\n /**\n * Executes a function when the texture will be ready to be drawn.\n * @param func The callback to be used.\n */\n executeWhenReady(e) {\n if (this.isReady()) {\n e(this);\n return;\n }\n const t = this.getEffect();\n t && t.executeWhenCompiled(() => {\n e(this);\n });\n }\n /**\n * Is the texture ready to be used ? (rendered at least once)\n * @returns true if ready, otherwise, false.\n */\n isReady() {\n const e = this._fullEngine;\n if (this.nodeMaterialSource)\n return this._drawWrapper.effect.isReady();\n if (!this._fragment)\n return !1;\n if (this._fallbackTextureUsed)\n return !0;\n if (!this._texture)\n return !1;\n const t = this._getDefines();\n if (this._drawWrapper.effect && t === this._cachedDefines && this._drawWrapper.effect.isReady())\n return !0;\n const i = {\n vertex: \"procedural\",\n fragmentElement: this._fragment.fragmentElement,\n fragmentSource: this._fragment.fragmentSource,\n fragment: typeof this._fragment == \"string\" ? this._fragment : void 0\n };\n return this._cachedDefines !== t && (this._cachedDefines = t, this._drawWrapper.effect = e.createEffect(i, [I.PositionKind], this._uniforms, this._samplers, t, void 0, void 0, () => {\n var r;\n (r = this._rtWrapper) == null || r.dispose(), this._rtWrapper = this._texture = null, this._fallbackTexture && (this._texture = this._fallbackTexture._texture, this._texture && this._texture.incrementReferences()), this._fallbackTextureUsed = !0;\n })), this._drawWrapper.effect.isReady();\n }\n /**\n * Resets the refresh counter of the texture and start bak from scratch.\n * Could be useful to regenerate the texture if it is setup to render only once.\n */\n resetRefreshCounter() {\n this._currentRefreshId = -1;\n }\n /**\n * Set the fragment shader to use in order to render the texture.\n * @param fragment This can be set to a path (into the shader store) or to a json object containing a fragmentElement property.\n */\n setFragment(e) {\n this._fragment = e;\n }\n /**\n * Define the refresh rate of the texture or the rendering frequency.\n * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...\n */\n get refreshRate() {\n return this._refreshRate;\n }\n set refreshRate(e) {\n this._refreshRate = e, this.resetRefreshCounter();\n }\n /** @internal */\n _shouldRender() {\n return !this.isEnabled || !this.isReady() || !this._texture ? (this._texture && (this._texture.isReady = !1), !1) : this._fallbackTextureUsed ? !1 : this._currentRefreshId === -1 ? (this._currentRefreshId = 1, this._frameId++, !0) : this.refreshRate === this._currentRefreshId ? (this._currentRefreshId = 1, this._frameId++, !0) : (this._currentRefreshId++, !1);\n }\n /**\n * Get the size the texture is rendering at.\n * @returns the size (on cube texture it is always squared)\n */\n getRenderSize() {\n return this._size;\n }\n /**\n * Resize the texture to new value.\n * @param size Define the new size the texture should have\n * @param generateMipMaps Define whether the new texture should create mip maps\n */\n resize(e, t) {\n if (this._fallbackTextureUsed || !this._rtWrapper || !this._texture)\n return;\n const i = this._texture.isCube;\n this._rtWrapper.dispose();\n const r = this._createRtWrapper(i, e, t, this._textureType);\n this._texture = r.texture, this._size = e, this._generateMipMaps = t;\n }\n _checkUniform(e) {\n this._uniforms.indexOf(e) === -1 && this._uniforms.push(e);\n }\n /**\n * Set a texture in the shader program used to render.\n * @param name Define the name of the uniform samplers as defined in the shader\n * @param texture Define the texture to bind to this sampler\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setTexture(e, t) {\n return this._samplers.indexOf(e) === -1 && this._samplers.push(e), this._textures[e] = t, this;\n }\n /**\n * Set a float in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setFloat(e, t) {\n return this._checkUniform(e), this._floats[e] = t, this;\n }\n /**\n * Set a int in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setInt(e, t) {\n return this._checkUniform(e), this._ints[e] = t, this;\n }\n /**\n * Set an array of floats in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setFloats(e, t) {\n return this._checkUniform(e), this._floatsArrays[e] = t, this;\n }\n /**\n * Set a vec3 in the shader from a Color3.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setColor3(e, t) {\n return this._checkUniform(e), this._colors3[e] = t, this;\n }\n /**\n * Set a vec4 in the shader from a Color4.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setColor4(e, t) {\n return this._checkUniform(e), this._colors4[e] = t, this;\n }\n /**\n * Set a vec2 in the shader from a Vector2.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setVector2(e, t) {\n return this._checkUniform(e), this._vectors2[e] = t, this;\n }\n /**\n * Set a vec3 in the shader from a Vector3.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setVector3(e, t) {\n return this._checkUniform(e), this._vectors3[e] = t, this;\n }\n /**\n * Set a mat4 in the shader from a MAtrix.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setMatrix(e, t) {\n return this._checkUniform(e), this._matrices[e] = t, this;\n }\n /**\n * Render the texture to its associated render target.\n * @param useCameraPostProcess Define if camera post process should be applied to the texture\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n render(e) {\n var s, a;\n const t = this.getScene();\n if (!t)\n return;\n const i = this._fullEngine;\n if (i.enableEffect(this._drawWrapper), this.onBeforeGenerationObservable.notifyObservers(this), i.setState(!1), !this.nodeMaterialSource) {\n for (const o in this._textures)\n this._drawWrapper.effect.setTexture(o, this._textures[o]);\n for (const o in this._ints)\n this._drawWrapper.effect.setInt(o, this._ints[o]);\n for (const o in this._floats)\n this._drawWrapper.effect.setFloat(o, this._floats[o]);\n for (const o in this._floatsArrays)\n this._drawWrapper.effect.setArray(o, this._floatsArrays[o]);\n for (const o in this._colors3)\n this._drawWrapper.effect.setColor3(o, this._colors3[o]);\n for (const o in this._colors4) {\n const l = this._colors4[o];\n this._drawWrapper.effect.setFloat4(o, l.r, l.g, l.b, l.a);\n }\n for (const o in this._vectors2)\n this._drawWrapper.effect.setVector2(o, this._vectors2[o]);\n for (const o in this._vectors3)\n this._drawWrapper.effect.setVector3(o, this._vectors3[o]);\n for (const o in this._matrices)\n this._drawWrapper.effect.setMatrix(o, this._matrices[o]);\n }\n if (!this._texture || !this._rtWrapper)\n return;\n (s = i._debugPushGroup) == null || s.call(i, `procedural texture generation for ${this.name}`, 1);\n const r = i.currentViewport;\n if (this.isCube)\n for (let o = 0; o < 6; o++)\n i.bindFramebuffer(this._rtWrapper, o, void 0, void 0, !0), i.bindBuffers(this._vertexBuffers, this._indexBuffer, this._drawWrapper.effect), this._drawWrapper.effect.setFloat(\"face\", o), this.autoClear && i.clear(t.clearColor, !0, !1, !1), i.drawElementsType(ie.TriangleFillMode, 0, 6);\n else\n i.bindFramebuffer(this._rtWrapper, 0, void 0, void 0, !0), i.bindBuffers(this._vertexBuffers, this._indexBuffer, this._drawWrapper.effect), this.autoClear && i.clear(t.clearColor, !0, !1, !1), i.drawElementsType(ie.TriangleFillMode, 0, 6);\n i.unBindFramebuffer(this._rtWrapper, this.isCube), r && i.setViewport(r), this.isCube && i.generateMipMapsForCubemap(this._texture), (a = i._debugPopGroup) == null || a.call(i, 1), this.onGenerated && this.onGenerated(), this.onGeneratedObservable.notifyObservers(this);\n }\n /**\n * Clone the texture.\n * @returns the cloned texture\n */\n clone() {\n const e = this.getSize(), t = new fn(this.name, e.width, this._fragment, this.getScene(), this._fallbackTexture, this._generateMipMaps);\n return t.hasAlpha = this.hasAlpha, t.level = this.level, t.coordinatesMode = this.coordinatesMode, t;\n }\n /**\n * Dispose the texture and release its associated resources.\n */\n dispose() {\n const e = this.getScene();\n if (!e)\n return;\n const t = e.proceduralTextures.indexOf(this);\n t >= 0 && e.proceduralTextures.splice(t, 1);\n const i = this._vertexBuffers[I.PositionKind];\n i && (i.dispose(), this._vertexBuffers[I.PositionKind] = null), this._indexBuffer && this._fullEngine._releaseBuffer(this._indexBuffer) && (this._indexBuffer = null), this.onGeneratedObservable.clear(), this.onBeforeGenerationObservable.clear(), super.dispose();\n }\n}\nP([\n U()\n], fn.prototype, \"isEnabled\", void 0);\nP([\n U()\n], fn.prototype, \"autoClear\", void 0);\nP([\n U()\n], fn.prototype, \"_generateMipMaps\", void 0);\nP([\n U()\n], fn.prototype, \"_size\", void 0);\nP([\n U()\n], fn.prototype, \"refreshRate\", null);\nRe(\"BABYLON.ProceduralTexture\", fn);\nconst UF = \"equirectangularPanoramaPixelShader\", VF = `#ifdef GL_ES\nprecision highp float;\n#endif\n#define M_PI 3.1415926535897932384626433832795\nvarying vec2 vUV;uniform samplerCube cubeMap;void main(void) {vec2 uv=vUV;float longitude=uv.x*2.*M_PI-M_PI+M_PI/2.;float latitude=(1.-uv.y)*M_PI;vec3 dir=vec3(\n- sin( longitude )*sin( latitude ),\ncos( latitude ),\n- cos( longitude )*sin( latitude )\n);normalize( dir );gl_FragColor=textureCube( cubeMap,dir );}`;\nY.ShadersStore[UF] = VF;\nfunction BF(n) {\n return this.selected.forEach((e, t) => {\n let i = n instanceof Function ? n(e.metadata.data, t) : n;\n rt.AddTagsTo(e, i);\n }), this;\n}\nfunction kF(n) {\n return this.selected.forEach((e) => rt.RemoveTagsFrom(e, n)), this;\n}\nfunction zF(n) {\n let e = [];\n return this.selected.forEach((t) => {\n n === void 0 ? e.push({ node: t, value: rt.HasTags(t) }) : e.push({ node: t, value: rt.MatchesQuery(t, n) });\n }), e;\n}\nfunction WF(n) {\n return this.selected.forEach((e, t) => {\n var i, r, s;\n e instanceof LR ? n instanceof Function ? (r = e.actionManager) == null || r.registerAction(n((i = e.metadata).data ?? (i.data = {}), e, t)) : (s = e.actionManager) == null || s.registerAction(n) : console.log(\"Node not a mesh, skipping.\");\n }), this;\n}\nfunction GF(n) {\n return this.prop(\"material\", n), this;\n}\nfunction XF(n) {\n return this.prop(\"material.diffuseColor\", n), this;\n}\nfunction HF(n) {\n return this.prop(\"material.specularColor\", n), this;\n}\nfunction KF(n) {\n return this.prop(\"material.emissiveColor\", n), this;\n}\nfunction qF(n) {\n return this.prop(\"material.ambientColor\", n), this;\n}\nfunction YF(n) {\n return this.prop(\"material.diffuseTexture\", n), this;\n}\nfunction ZF(n) {\n return this.prop(\"material.specularTexture\", n), this;\n}\nfunction jF(n) {\n return this.prop(\"material.emissiveTexture\", n), this;\n}\nfunction QF(n) {\n return this.prop(\"material.ambientTexture\", n), this;\n}\nfunction JF(n, e) {\n return this.selected.forEach((t, i) => {\n t instanceof Ji ? t.registerInstancedBuffer(n, e) : console.log(\"Node not a mesh skipping\");\n }), this;\n}\nfunction $F(n, e) {\n return this.selected.forEach((t, i) => {\n t instanceof R_ ? t.instancedBuffers[n] = e instanceof Function ? e(t.metadata.data, i) : e : console.log(\"Node not a mesh, skipping.\");\n }), this;\n}\nvar hc = function() {\n try {\n var n = Of(Object, \"defineProperty\");\n return n({}, \"\", {}), n;\n } catch {\n }\n}();\nfunction dE(n, e, t) {\n e == \"__proto__\" && hc ? hc(n, e, {\n configurable: !0,\n enumerable: !0,\n value: t,\n writable: !0\n }) : n[e] = t;\n}\nvar eL = Object.prototype, tL = eL.hasOwnProperty;\nfunction Uf(n, e, t) {\n var i = n[e];\n (!(tL.call(n, e) && Df(i, t)) || t === void 0 && !(e in n)) && dE(n, e, t);\n}\nvar iL = 9007199254740991, rL = /^(?:0|[1-9]\\d*)$/;\nfunction Zc(n, e) {\n var t = typeof n;\n return e = e ?? iL, !!e && (t == \"number\" || t != \"symbol\" && rL.test(n)) && n > -1 && n % 1 == 0 && n < e;\n}\nfunction sL(n, e, t, i) {\n if (!yo(n))\n return n;\n e = Ff(e, n);\n for (var r = -1, s = e.length, a = s - 1, o = n; o != null && ++r < s; ) {\n var l = Lf(e[r]), c = t;\n if (l === \"__proto__\" || l === \"constructor\" || l === \"prototype\")\n return n;\n if (r != a) {\n var h = o[l];\n c = i ? i(h, l, o) : void 0, c === void 0 && (c = yo(h) ? h : Zc(e[r + 1]) ? [] : {});\n }\n Uf(o, l, c), o = o[l];\n }\n return n;\n}\nfunction jc(n, e, t) {\n return n == null ? n : sL(n, e, t);\n}\nfunction nL(n, e) {\n return n != null && e in Object(n);\n}\nvar aL = \"[object Arguments]\";\nfunction im(n) {\n return Wc(n) && zc(n) == aL;\n}\nvar pE = Object.prototype, oL = pE.hasOwnProperty, lL = pE.propertyIsEnumerable, cL = im(/* @__PURE__ */ function() {\n return arguments;\n}()) ? im : function(n) {\n return Wc(n) && oL.call(n, \"callee\") && !lL.call(n, \"callee\");\n};\nconst gE = cL;\nvar hL = 9007199254740991;\nfunction Vf(n) {\n return typeof n == \"number\" && n > -1 && n % 1 == 0 && n <= hL;\n}\nfunction uL(n, e, t) {\n e = Ff(e, n);\n for (var i = -1, r = e.length, s = !1; ++i < r; ) {\n var a = Lf(e[i]);\n if (!(s = n != null && t(n, a)))\n break;\n n = n[a];\n }\n return s || ++i != r ? s : (r = n == null ? 0 : n.length, !!r && Vf(r) && Zc(a, r) && (Zo(n) || gE(n)));\n}\nfunction Bf(n, e) {\n return n != null && uL(n, e, nL);\n}\nfunction fL(n, e) {\n return this.selected.forEach((t, i) => {\n t instanceof On ? hE(t, n) != null ? jc(t, n, e instanceof Function ? e(t.metadata.data, i) : e) : console.error(n + \" not a property of \" + t) : console.warn(\"Node not a mesh, skipping.\");\n }), this;\n}\nfunction dL(n, e) {\n return this.selected.forEach((t, i) => {\n var r;\n Bf(t, n) ? jc(t, n, e instanceof Function ? e((r = t.metadata).data ?? (r.data = {}), t, i) : e) : console.error(n + \" not a property of \" + t);\n }), this;\n}\nfunction pL(n) {\n return this.selected.forEach((e, t) => {\n var i;\n for (let r in n)\n Bf(e, r) ? jc(\n e,\n r,\n n[r] instanceof Function ? n[r]((i = e.metadata).data ?? (i.data = {}), e, t) : n[r]\n ) : console.log(r + \" not property of \" + e);\n }), this;\n}\nfunction gL(n) {\n return this.selected.forEach((e, t) => {\n var i;\n n((i = e.metadata).data ?? (i.data = {}), e, t);\n }), this;\n}\nfunction mL(n) {\n return this.selected.forEach((e, t) => {\n n != null ? n(e, t) && e.dispose() : e.dispose();\n }), this;\n}\nfunction rm(n) {\n return this.selected.forEach((e, t) => {\n if (e instanceof Ji && e.material !== null) {\n let i = e.material.diffuseTexture;\n i instanceof Ac ? i.scale(n instanceof Function ? n(e, t) : n) : console.log(\"Not a dynamic texture, skipping\");\n }\n }), this;\n}\nfunction _L(n, e, t = null, i = null, r = null, s = null) {\n return this.selected.forEach((a, o) => {\n if (a instanceof Ji && a.material !== null) {\n let l = a.material.diffuseTexture;\n l instanceof Ac ? l.drawText(\n n instanceof Function ? n(a, o) : n,\n t instanceof Function ? t(a, o) : t,\n i instanceof Function ? i(a, o) : i,\n e instanceof Function ? e(a, o) : e,\n r instanceof Function ? r(a, o) : r,\n s instanceof Function ? s(a, o) : s\n ) : console.log(\"Not a dynamic texture, skipping\");\n }\n }), this;\n}\nfunction EL(n = \"\") {\n let e = this.selected[0], t = e instanceof Ji ? e.getBoundingInfo().boundingBox.minimumWorld : e instanceof On ? this.selected[0].position : new Me(), i = e instanceof Ji ? e.getBoundingInfo().boundingBox.maximumWorld : e instanceof On ? this.selected[0].position : new Me();\n return this.selected.forEach((r, s) => {\n r.computeWorldMatrix(!0), (r.getChildMeshes().length > 0 ? r.getChildMeshes() : [r]).forEach((o, l) => {\n if (o.computeWorldMatrix(!0), o instanceof Ji && !pr.MatchesQuery(pr.HasTags(o) ? pr.GetTags(o) : \"\", n)) {\n let c = o.getBoundingInfo().boundingBox.minimumWorld, h = o.getBoundingInfo().boundingBox.maximumWorld;\n t = Me.Minimize(t, c), i = Me.Maximize(i, h);\n } else\n t = Me.Minimize(t, o.position), i = Me.Maximize(i, o.position);\n });\n }), new Pn(t, i);\n}\nfunction vL(n) {\n let e = [];\n return this.selected.forEach((t, i) => {\n var r;\n n((r = t.metadata).data ?? (r.data = {}), t, i) && e.push(t);\n }), new Jt(e, this.scene);\n}\nfunction TL(n) {\n return this.prop(\"name\", n), this;\n}\nfunction xL(n) {\n return this.prop(\"id\", n), this;\n}\nfunction CL(n, e) {\n return this.selected.forEach((t, i) => {\n Bf(t, \"metadata\") ? jc(\n t,\n \"metadata\",\n e instanceof Function ? { ...t.metadata, key: e(t.metadata.data, t, i) } : { ...t.metadata, key: e }\n ) : console.error(\"metadata not a property of \" + t);\n }), this;\n}\nfunction RL(n = {}) {\n return this.selected.forEach((e) => {\n let { min: t, max: i } = e.getHierarchyBoundingVectors(!0, (v) => !pr.MatchesQuery(v, \"exclude\")), r = new Pn(t, i), s = n.name || e.name + \"PositionUI\", a = n.width || r.boundingBox.extendSize.x * 0.5, o = n.radius || a * 0.05, l = n.position || new Me(0, -r.boundingBox.extendSize.y, -Math.hypot(r.boundingBox.extendSize.x, r.boundingBox.extendSize.z)), c = n.offset || new Me(0, -o * 2.5, 0), h = n.billboard || 0, u;\n n.material === void 0 ? (u = new Vs(\"PositionUIMat\", this.scene), u.diffuseColor = n.diffuseColor || pi.White()) : u = n.material;\n let f = n.visibility || 1, d;\n n.behavior === void 0 ? (d = new wR(), d.faceCameraOnDragStart = !0, d.rotateAroundYOnly = !0, d.zDragFactor = 100) : d = n.behavior;\n let p = zo(\"container\", s + \"Container\", { calculateBounds: !1 }, this.scene);\n p.setParent(e), p.setBoundingInfo(r), p.isPickable = !1, p.billboardMode = h, new Jt([p], this.scene).bind(\"capsule\", { height: a, radius: o }).name(s).position(l.addInPlace(c)).rotation(new Me(0, 0, 1.57)).material(u).prop(\"visibility\", f).action((v, E, C) => new Bs(\n Jr.OnPickDownTrigger,\n () => {\n e.addBehavior(d);\n }\n )).action((v, E, C) => new Bs(\n Jr.OnPickOutTrigger,\n () => {\n e.removeBehavior(d);\n }\n )).action((v, E, C) => new Bs(\n Jr.OnPickUpTrigger,\n () => {\n e.removeBehavior(d);\n }\n )).addTags(\"exclude\");\n }), this;\n}\nfunction SL(n = {}) {\n return this.selected.forEach((e) => {\n let { min: t, max: i } = e.getHierarchyBoundingVectors(!0, (v) => !pr.MatchesQuery(v, \"exclude\")), r = new Pn(t, i), s = n.name || e.name + \"ScaleUI\", a = n.diameter || r.boundingBox.extendSize.x * 0.5 * 0.05 * 2, o = n.position || new Me(0, -r.boundingBox.extendSize.y, -Math.hypot(r.boundingBox.extendSize.x, r.boundingBox.extendSize.z)), l = n.offset || new Me(r.boundingBox.extendSize.x * 0.5 * 1.5 / 2, -a / 2 * 2.5, 0), c = n.billboard || 0, h;\n n.material === void 0 ? (h = new Vs(\"PositionUIMat\", this.scene), h.diffuseColor = n.diffuseColor || pi.White()) : h = n.material;\n let u = n.visibility || 1, f;\n n.behavior === void 0 ? (f = new Bl({ dragAxis: new Me(0, 1, 0) }), f.moveAttached = !1) : f = n.behavior;\n let d = n.minimum || -1 / 0, p = n.maximum || 1 / 0, g = zo(\"container\", s + \"Container\", { calculateBounds: !1 }, this.scene);\n g.setParent(e), g.setBoundingInfo(r), g.isPickable = !1, g.billboardMode = c, new Jt([g], this.scene).bind(\"sphere\", { diameter: a }).name(s).position(o.addInPlace(l)).rotation(new Me(0, 0, 1.57)).material(h).prop(\"visibility\", u).addTags(\"exclude\").action((v, E, C) => new Bs(\n Jr.OnPickDownTrigger,\n () => {\n E.addBehavior(f);\n }\n )).action((v, E, C) => new Bs(\n Jr.OnPickOutTrigger,\n () => {\n E.removeBehavior(f);\n }\n )).action((v, E, C) => new Bs(\n Jr.OnPickUpTrigger,\n () => {\n E.removeBehavior(f);\n }\n )), f.onDragObservable.add((v) => {\n let E = -v.dragDistance, T = e.scaling.add(new Me(E, E, E));\n if (!(T.x < d)) {\n if (T.x > p)\n return;\n e.scaling = T;\n }\n });\n }), this;\n}\nfunction yL(n = {}) {\n return this.selected.forEach((e) => {\n let { min: t, max: i } = e.getHierarchyBoundingVectors(!0, (E) => !pr.MatchesQuery(E, \"exclude\")), r = new Pn(t, i), s = n.name || e.name + \"ScaleUI\", a = n.billboard || 0, o = n.axis || { x: !0, y: !0, z: !0 }, l = n.diameter || r.boundingBox.extendSize.x * 0.5 * 0.05 * 2, c = n.thickness || l / 2, h = n.position || new Me(0, -r.boundingBox.extendSize.y, -Math.hypot(r.boundingBox.extendSize.x, r.boundingBox.extendSize.z)), u = n.offset || new Me(0, -l * 2.5, 0), f;\n n.material === void 0 ? (f = new Vs(\"PositionUIMat\", this.scene), f.diffuseColor = n.diffuseColor || pi.White()) : f = n.material;\n let d = n.visibility || 1, p;\n p = {\n x: new Bl({ dragAxis: new Me(1, 0, 0) }),\n y: new Bl({ dragAxis: new Me(1, 0, 0) }),\n z: new Bl({ dragAxis: new Me(1, 0, 0) })\n }, p.x.moveAttached = !1, p.y.moveAttached = !1, p.z.moveAttached = !1;\n let g = [];\n Object.keys(o).forEach((E) => {\n o[E] == !0 && g.push({ axis: E });\n });\n let m = zo(\"container\", s + \"Container\", { calculateBounds: !1 }, this.scene);\n m.setParent(e), m.setBoundingInfo(r), m.isPickable = !1, m.billboardMode = a, new Jt([m], this.scene).bind(\"torus\", { diameter: l, thickness: c }, g).name((E, C, T) => n.name ?? (n.name = C.name + \"_scaleUI\")).position(\n (E) => E.axis == \"x\" ? new Me(0, 0, 0).addInPlace(h).addInPlace(u) : E.axis == \"y\" ? new Me(l * 1.5, 0, 0).addInPlace(h).addInPlace(u) : E.axis == \"z\" ? new Me(-l * 1.5, 0, 0).addInPlace(h).addInPlace(u) : new Me(0, 0, 0)\n ).rotation(\n (E) => E.axis == \"x\" ? new Me(0, 0, 1.57) : E.axis == \"y\" ? new Me(0, 0, 0) : E.axis == \"z\" ? new Me(1.57, 0, 0) : new Me(0, 0, 0)\n ).material(f).prop(\"visibility\", d).addTags(\"exclude\").action((E, C, T) => new Bs(\n Jr.OnPickDownTrigger,\n () => {\n C.addBehavior(p[E.axis]);\n }\n )).action((E, C, T) => new Bs(\n Jr.OnPickOutTrigger,\n () => {\n C.removeBehavior(p[E.axis]);\n }\n )).action((E, C, T) => new Bs(\n Jr.OnPickUpTrigger,\n () => {\n C.removeBehavior(p[E.axis]);\n }\n )), p.x.onDragObservable.add((E) => {\n e.rotate(new Me(1, 0, 0), E.dragDistance, so.LOCAL);\n }), p.y.onDragObservable.add((E) => {\n e.rotate(new Me(0, -1, 0), E.dragDistance, so.LOCAL);\n }), p.z.onDragObservable.add((E) => {\n e.rotate(new Me(0, 0, -1), E.dragDistance, so.LOCAL);\n });\n }), this;\n}\nclass Jt {\n constructor(e, t) {\n this.select = kR, this.selectName = zR, this.selectId = WR, this.selectTag = GR, this.bind = DS, this.run = gL, this.bindInstance = NS, this.position = FS, this.positionX = LS, this.positionY = wS, this.positionZ = US, this.translate = VS, this.rotation = BS, this.rotationX = kS, this.rotationY = zS, this.rotationZ = WS, this.scaling = GS, this.scalingX = XS, this.scalingY = HS, this.scalingZ = KS, this.get = qD, this.attr = fL, this.addTags = BF, this.removeTags = kF, this.hasTags = zF, this.action = WF, this.material = GF, this.diffuseColor = XF, this.specularColor = HF, this.emissiveColor = KF, this.ambientColor = qF, this.registerInstancedBuffer = JF, this.setInstancedBuffer = $F, this.dispose = mL, this.diffuseTexture = YF, this.specularTexture = ZF, this.emissiveTexture = jF, this.ambientTexture = QF, this.scaleDT = rm, this.scaleToDT = rm, this.drawTextDT = _L, this.boundingBox = EL, this.filter = vL, this.props = pL, this.prop = dL, this.name = TL, this.id = xL, this.metadata = CL, this.positionUI = RL, this.scaleUI = SL, this.rotateUI = yL, this.selected = e, this.scene = t;\n }\n}\nfunction IL(n, e, t, i) {\n var r = !t;\n t || (t = {});\n for (var s = -1, a = e.length; ++s < a; ) {\n var o = e[s], l = i ? i(t[o], n[o], o, t, n) : void 0;\n l === void 0 && (l = n[o]), r ? dE(t, o, l) : Uf(t, o, l);\n }\n return t;\n}\nfunction mE(n) {\n return n;\n}\nfunction bL(n, e, t) {\n switch (t.length) {\n case 0:\n return n.call(e);\n case 1:\n return n.call(e, t[0]);\n case 2:\n return n.call(e, t[0], t[1]);\n case 3:\n return n.call(e, t[0], t[1], t[2]);\n }\n return n.apply(e, t);\n}\nvar sm = Math.max;\nfunction AL(n, e, t) {\n return e = sm(e === void 0 ? n.length - 1 : e, 0), function() {\n for (var i = arguments, r = -1, s = sm(i.length - e, 0), a = Array(s); ++r < s; )\n a[r] = i[e + r];\n r = -1;\n for (var o = Array(e + 1); ++r < e; )\n o[r] = i[r];\n return o[e] = t(a), bL(n, this, o);\n };\n}\nfunction ML(n) {\n return function() {\n return n;\n };\n}\nvar PL = hc ? function(n, e) {\n return hc(n, \"toString\", {\n configurable: !0,\n enumerable: !1,\n value: ML(e),\n writable: !0\n });\n} : mE;\nconst OL = PL;\nvar DL = 800, NL = 16, FL = Date.now;\nfunction LL(n) {\n var e = 0, t = 0;\n return function() {\n var i = FL(), r = NL - (i - t);\n if (t = i, r > 0) {\n if (++e >= DL)\n return arguments[0];\n } else\n e = 0;\n return n.apply(void 0, arguments);\n };\n}\nvar wL = LL(OL);\nfunction UL(n, e) {\n return wL(AL(n, e, mE), n + \"\");\n}\nfunction kf(n) {\n return n != null && Vf(n.length) && !lE(n);\n}\nfunction VL(n, e, t) {\n if (!yo(t))\n return !1;\n var i = typeof e;\n return (i == \"number\" ? kf(t) && Zc(e, t.length) : i == \"string\" && e in t) ? Df(t[e], n) : !1;\n}\nfunction BL(n) {\n return UL(function(e, t) {\n var i = -1, r = t.length, s = r > 1 ? t[r - 1] : void 0, a = r > 2 ? t[2] : void 0;\n for (s = n.length > 3 && typeof s == \"function\" ? (r--, s) : void 0, a && VL(t[0], t[1], a) && (s = r < 3 ? void 0 : s, r = 1), e = Object(e); ++i < r; ) {\n var o = t[i];\n o && n(e, o, i, s);\n }\n return e;\n });\n}\nvar kL = Object.prototype;\nfunction _E(n) {\n var e = n && n.constructor, t = typeof e == \"function\" && e.prototype || kL;\n return n === t;\n}\nfunction zL(n, e) {\n for (var t = -1, i = Array(n); ++t < n; )\n i[t] = e(t);\n return i;\n}\nfunction WL() {\n return !1;\n}\nvar EE = typeof exports == \"object\" && exports && !exports.nodeType && exports, nm = EE && typeof module == \"object\" && module && !module.nodeType && module, GL = nm && nm.exports === EE, am = GL ? kc.Buffer : void 0, XL = am ? am.isBuffer : void 0, HL = XL || WL, KL = \"[object Arguments]\", qL = \"[object Array]\", YL = \"[object Boolean]\", ZL = \"[object Date]\", jL = \"[object Error]\", QL = \"[object Function]\", JL = \"[object Map]\", $L = \"[object Number]\", e2 = \"[object Object]\", t2 = \"[object RegExp]\", i2 = \"[object Set]\", r2 = \"[object String]\", s2 = \"[object WeakMap]\", n2 = \"[object ArrayBuffer]\", a2 = \"[object DataView]\", o2 = \"[object Float32Array]\", l2 = \"[object Float64Array]\", c2 = \"[object Int8Array]\", h2 = \"[object Int16Array]\", u2 = \"[object Int32Array]\", f2 = \"[object Uint8Array]\", d2 = \"[object Uint8ClampedArray]\", p2 = \"[object Uint16Array]\", g2 = \"[object Uint32Array]\", ri = {};\nri[o2] = ri[l2] = ri[c2] = ri[h2] = ri[u2] = ri[f2] = ri[d2] = ri[p2] = ri[g2] = !0;\nri[KL] = ri[qL] = ri[n2] = ri[YL] = ri[a2] = ri[ZL] = ri[jL] = ri[QL] = ri[JL] = ri[$L] = ri[e2] = ri[t2] = ri[i2] = ri[r2] = ri[s2] = !1;\nfunction m2(n) {\n return Wc(n) && Vf(n.length) && !!ri[zc(n)];\n}\nfunction _2(n) {\n return function(e) {\n return n(e);\n };\n}\nvar vE = typeof exports == \"object\" && exports && !exports.nodeType && exports, uo = vE && typeof module == \"object\" && module && !module.nodeType && module, E2 = uo && uo.exports === vE, Qh = E2 && aE.process, om = function() {\n try {\n var n = uo && uo.require && uo.require(\"util\").types;\n return n || Qh && Qh.binding && Qh.binding(\"util\");\n } catch {\n }\n}(), lm = om && om.isTypedArray, v2 = lm ? _2(lm) : m2, T2 = Object.prototype, x2 = T2.hasOwnProperty;\nfunction C2(n, e) {\n var t = Zo(n), i = !t && gE(n), r = !t && !i && HL(n), s = !t && !i && !r && v2(n), a = t || i || r || s, o = a ? zL(n.length, String) : [], l = o.length;\n for (var c in n)\n (e || x2.call(n, c)) && !(a && // Safari 9 has enumerable `arguments.length` in strict mode.\n (c == \"length\" || // Node.js 0.10 has enumerable non-index properties on buffers.\n r && (c == \"offset\" || c == \"parent\") || // PhantomJS 2 has enumerable non-index properties on typed arrays.\n s && (c == \"buffer\" || c == \"byteLength\" || c == \"byteOffset\") || // Skip index properties.\n Zc(c, l))) && o.push(c);\n return o;\n}\nfunction R2(n, e) {\n return function(t) {\n return n(e(t));\n };\n}\nvar S2 = R2(Object.keys, Object), y2 = Object.prototype, I2 = y2.hasOwnProperty;\nfunction b2(n) {\n if (!_E(n))\n return S2(n);\n var e = [];\n for (var t in Object(n))\n I2.call(n, t) && t != \"constructor\" && e.push(t);\n return e;\n}\nfunction A2(n) {\n return kf(n) ? C2(n) : b2(n);\n}\nvar M2 = Object.prototype, P2 = M2.hasOwnProperty, Zi = BL(function(n, e) {\n if (_E(e) || kf(e)) {\n IL(e, A2(e), n);\n return;\n }\n for (var t in e)\n P2.call(e, t) && Uf(n, t, e[t]);\n});\nfunction O2() {\n var u, f, d, p, g, m, v, E, C;\n let n = this.scales.x.scale, e = this.scales.x.range, t = this.scales.x.domain, i = this.scales.y.scale, r = this.scales.y.range, s = this.scales.y.domain, a = this.scales.z.scale, o = this.scales.z.range, l = this.scales.z.domain, c = {}, h = 0.02;\n if (((u = this.options.scale) == null ? void 0 : u.x) != null) {\n let T;\n if (((f = this.options.labelTicks) == null ? void 0 : f.x) != null)\n T = this.options.labelTicks.x;\n else\n try {\n T = n.ticks();\n } catch {\n T = t;\n }\n new Me(0, 0, 0);\n let R;\n ((d = this.options.labelFormat) == null ? void 0 : d.x) != null ? R = { text: (M) => {\n var N;\n return (N = this.options.labelFormat) == null ? void 0 : N.x(M.text);\n }, size: this.scales.size * h, atlas: this.options.atlas } : R = { text: (M) => M.text, size: this.scales.size * h, atlas: this.options.atlas };\n let x = {}, S = this.CoT.bind(\n \"planeText\",\n Zi({}, R, this.options.labelOptions),\n T.map((M) => ({ text: M }))\n ).prop(\"name\", this.name + \"_labelX\").position((M, N, F) => {\n let L = N.getChildMeshes()[0].getBoundingInfo().boundingBox;\n return new Me(n(M.text), r[0] - L.center.y * 1.5, o[0] - L.center.y * 1.5);\n }).props(Zi({}, x, this.options.labelProperties));\n c.x = S;\n }\n if (((p = this.options.scale) == null ? void 0 : p.y) != null) {\n let T;\n if (((g = this.options.labelTicks) == null ? void 0 : g.y) != null)\n T = this.options.labelTicks.y;\n else\n try {\n T = i.ticks();\n } catch {\n T = s;\n }\n new Me(0, 0, 0);\n let R;\n ((m = this.options.labelFormat) == null ? void 0 : m.y) != null ? R = { text: (M) => {\n var N;\n return (N = this.options.labelFormat) == null ? void 0 : N.y(M.text);\n }, size: this.scales.size * h, atlas: this.options.atlas } : R = { text: (M) => M.text, size: this.scales.size * h, atlas: this.options.atlas };\n let x = {}, S = this.CoT.bind(\n \"planeText\",\n Zi({}, R, this.options.labelOptions),\n T.map((M) => ({ text: M }))\n ).prop(\"name\", this.name + \"_labelY\").position((M, N, F) => {\n let L = N.getChildMeshes()[0].getBoundingInfo().boundingBox;\n return new Me(e[0] - L.center._x - L.center.y * 1.5, i(M.text), o[0] - L.center.y * 1.5);\n }).props(Zi({}, x, this.options.labelProperties));\n c.y = S;\n }\n if (((v = this.options.scale) == null ? void 0 : v.z) != null) {\n let T;\n if (((E = this.options.labelTicks) == null ? void 0 : E.z) != null)\n T = this.options.labelTicks.z;\n else\n try {\n T = a.ticks();\n } catch {\n T = l;\n }\n new Me(0, 0, 0);\n let R;\n ((C = this.options.labelFormat) == null ? void 0 : C.z) != null ? R = { text: (M) => {\n var N;\n return (N = this.options.labelFormat) == null ? void 0 : N.z(M.text);\n }, size: this.scales.size * h, atlas: this.options.atlas } : R = { text: (M) => M.text, size: this.scales.size * h, atlas: this.options.atlas };\n let x = { \"rotation.y\": -Math.PI / 2 }, S = this.CoT.bind(\n \"planeText\",\n Zi({}, R, this.options.labelOptions),\n T.map((M) => ({ text: M }))\n ).prop(\"name\", this.name + \"_labelZ\").position((M, N, F) => {\n let L = N.getChildMeshes()[0].getBoundingInfo().boundingBox;\n return new Me(e[1] + L.center.y * 1.5, r[0] - L.center.y * 1.5, a(M.text));\n }).props(Zi({}, x, this.options.labelProperties));\n c.z = S;\n }\n return c;\n}\nfunction D2() {\n var r, s, a, o, l, c;\n this.scales.x.scale;\n let n = this.scales.x.range;\n this.scales.x.domain, this.scales.y.scale;\n let e = this.scales.y.range;\n this.scales.y.domain, this.scales.z.scale;\n let t = this.scales.z.range;\n this.scales.z.domain;\n let i = {};\n if (((r = this.options.scale) == null ? void 0 : r.x) != null && ((s = this.options.scale) == null ? void 0 : s.y) != null) {\n let h = new Me(0, 0, 0);\n new Me(0, 0, 0);\n let u = 0, f = 0;\n u = Math.abs(n[0] - n[1]), f = Math.abs(e[0] - e[1]), h = new Me((n[0] + n[1]) / 2, (e[0] + e[1]) / 2, t[1]), new Me(0, 0, 0);\n let d = { height: f, width: u, sideOrientation: Ji.DOUBLESIDE }, p = { \"material.diffuseColor\": pi.White, \"material.alpha\": 0.2 }, g = this.CoT.bind(\"plane\", Zi({}, d, this.options.backgroundOptions)).attr(\"name\", this.name + \"_backgroundX\").position(h).material(new Vs(this.name + \"_backgroundX_material\", this.scene)).props(Zi({}, p, this.options.backgroundProperties));\n i.x = g;\n }\n if (((a = this.options.scale) == null ? void 0 : a.y) != null && ((o = this.options.scale) == null ? void 0 : o.z) != null) {\n let h = new Me(0, 0, 0), u = new Me(0, 0, 0), f = 0, d = 0;\n f = Math.abs(t[0] - t[1]), d = Math.abs(e[0] - e[1]), h = new Me(n[0], (e[0] + e[1]) / 2, (t[0] + t[1]) / 2), u = new Me(0, 1.5708, 0);\n let p = { height: d, width: f, sideOrientation: Ji.DOUBLESIDE }, g = { \"material.diffuseColor\": pi.White, \"material.alpha\": 0.2 }, m = this.CoT.bind(\"plane\", Zi({}, p, this.options.backgroundOptions)).attr(\"name\", this.name + \"_backgroundY\").position(h).rotation(u).material(new Vs(this.name + \"_backgroundY_material\", this.scene)).props(Zi({}, g, this.options.backgroundProperties));\n i.y = m;\n }\n if (((l = this.options.scale) == null ? void 0 : l.z) != null && ((c = this.options.scale) == null ? void 0 : c.x) != null) {\n let h = new Me(0, 0, 0), u = new Me(0, 0, 0), f = 0, d = 0;\n h = new Me((n[0] + n[1]) / 2, e[0], (t[0] + t[1]) / 2), u = new Me(1.5708, 0, 0), f = Math.abs(n[0] - n[1]), d = Math.abs(t[0] - t[1]);\n let p = { height: d, width: f, sideOrientation: Ji.DOUBLESIDE }, g = { \"material.diffuseColor\": pi.White, \"material.alpha\": 0.2 }, m = this.CoT.bind(\"plane\", Zi({}, p, this.options.backgroundOptions)).attr(\"name\", this.name + \"_backgroundZ\").position(h).rotation(u).material(new Vs(this.name + \"_backgroundZ_material\", this.scene)).props(Zi({}, g, this.options.backgroundProperties));\n i.z = m;\n }\n return i;\n}\nfunction N2() {\n var p, g, m, v, E, C;\n let n = this.scales.x.scale, e = this.scales.x.range, t = this.scales.x.domain, i = this.scales.y.scale, r = this.scales.y.range, s = this.scales.y.domain, a = this.scales.z.scale, o = this.scales.z.range, l = this.scales.z.domain, c = [];\n if (((p = this.options.scale) == null ? void 0 : p.x) != null) {\n let T;\n if (((g = this.options.gridTicks) == null ? void 0 : g.x) != null)\n T = this.options.gridTicks.x;\n else\n try {\n T = n.ticks();\n } catch {\n T = t;\n }\n let R = [new Me(0, 0, 0)];\n R = (x) => [\n new Me(n(x), r[0], o[0]),\n new Me(n(x), r[0], o[1]),\n new Me(n(x), r[1], o[1])\n ];\n for (var h of T)\n c.push(R(h));\n }\n if (((m = this.options.scale) == null ? void 0 : m.y) != null) {\n let T;\n if (((v = this.options.gridTicks) == null ? void 0 : v.y) != null)\n T = this.options.gridTicks.y;\n else\n try {\n T = i.ticks();\n } catch {\n T = s;\n }\n let R = [new Me(0, 0, 0)];\n R = (x) => [\n new Me(e[0], i(x), o[0]),\n new Me(e[0], i(x), o[1]),\n new Me(e[1], i(x), o[1])\n ];\n for (var h of T)\n c.push(R(h));\n }\n if (((E = this.options.scale) == null ? void 0 : E.z) != null) {\n let T;\n if (((C = this.options.gridTicks) == null ? void 0 : C.z) != null)\n T = this.options.gridTicks.z;\n else\n try {\n T = a.ticks();\n } catch {\n T = l;\n }\n let R = [new Me(0, 0, 0)];\n R = (x) => [\n new Me(e[1], r[0], a(x)),\n new Me(e[0], r[0], a(x)),\n new Me(e[0], r[1], a(x))\n ];\n for (var h of T)\n c.push(R(h));\n }\n let u = { lines: c }, f = {\n name: this.name + \"_grid\",\n alpha: 0.3,\n color: pi.White()\n };\n return this.CoT.bind(\"lineSystem\", Zi({}, u, this.options.gridOptions)).props(Zi({}, f, this.options.gridProperties));\n}\nfunction F2() {\n var l, c, h;\n this.scales.x.scale;\n let n = this.scales.x.range;\n this.scales.x.domain, this.scales.y.scale;\n let e = this.scales.y.range;\n this.scales.y.domain, this.scales.z.scale;\n let t = this.scales.z.range;\n this.scales.z.domain;\n let i = [];\n ((l = this.options.scale) == null ? void 0 : l.y) != null && i.push(new Me(n[0], e[1], t[0])), ((c = this.options.scale) == null ? void 0 : c.x) != null && i.push(new Me(n[0], e[0], t[0]), new Me(n[1], e[0], t[0])), ((h = this.options.scale) == null ? void 0 : h.z) != null && i.push(new Me(n[1], e[0], t[0]), new Me(n[1], e[0], t[1]));\n let r = {\n points: i,\n updatable: !1\n }, s = {\n createAndAssignMaterial: !0,\n width: 5,\n sizeAttenuation: !0,\n materialType: 0,\n color: pi.White(),\n colorMode: 0,\n useColors: !1,\n useDash: !1,\n visibility: 1\n }, a = C_(\n \"greasedLine\",\n Zi({}, r, this.options.domainOptions),\n Zi({}, s, this.options.domainMaterialOptions),\n this.scene\n );\n a.parent = this.CoT.selected[0];\n let o = new Jt([a], this.scene);\n return o.prop(\"name\", this.name + \"_domain\"), o;\n}\nclass L2 {\n constructor(e, t, i = {}) {\n this.setDomain = F2, this.setBackground = D2, this.setGrid = N2, this.setLabel = O2, this.name = e, this.options = i, this.scene = t, this.CoT = this.setCoT(), this.scales = this.setScales(), this.domain = this.options.domain ? this.setDomain() : new Jt([], t), this.background = this.options.background ? this.setBackground() : {}, this.grid = this.options.grid ? this.setGrid() : new Jt([], t), this.label = this.options.label ? this.setLabel() : {};\n }\n setCoT() {\n let e;\n if (this.options.parent === void 0) {\n let t = new On(this.name + \"CoT\", this.scene);\n e = new Jt([t], this.scene);\n } else\n e = this.options.parent.bind(\"cot\").prop(\"name\", this.name + \"CoT\");\n return e;\n }\n setScales() {\n var f, d, p;\n let e, t = [0, 0], i, r, s = [0, 0], a, o, l = [0, 0], c;\n if (((f = this.options.scale) == null ? void 0 : f.x) != null) {\n e = this.options.scale.x, i = e.domain();\n let g = e.range();\n t = [g[0], g.slice(-1)[0]];\n }\n if (((d = this.options.scale) == null ? void 0 : d.y) != null) {\n r = this.options.scale.y, a = r.domain();\n let g = r.range();\n s = [g[0], g.slice(-1)[0]];\n }\n if (((p = this.options.scale) == null ? void 0 : p.z) != null) {\n o = this.options.scale.z, c = o.domain();\n let g = o.range();\n l = [g[0], g.slice(-1)[0]];\n }\n let h = [t, s, l].flat().sort();\n return {\n size: Math.abs(h.slice(-1)[0] - h[0]),\n x: { scale: e, range: t, domain: i },\n y: { scale: r, range: s, domain: a },\n z: { scale: o, range: l, domain: c }\n };\n }\n}\nfunction Sk(n, e, t) {\n const i = {\n scale: t.scale,\n parent: t.parent || void 0,\n domain: t.domain || !0,\n domainOptions: t.domainOptions || {},\n domainMaterialOptions: t.domainMaterialOptions || {},\n background: t.background || !0,\n backgroundOptions: t.backgroundOptions || {},\n backgroundProperties: t.backgroundProperties || {},\n grid: t.grid || !0,\n gridOptions: t.gridOptions || {},\n gridProperties: t.gridProperties || {},\n gridTicks: t.gridTicks || {},\n label: t.label || !0,\n labelOptions: t.labelOptions || {},\n labelProperties: t.labelProperties || {},\n labelTicks: t.labelTicks || {},\n labelFormat: t.labelFormat || {},\n atlas: t.atlas || new Vl(S_, e)\n };\n return new L2(n, e, i);\n}\nclass dn {\n /**\n * @param {string} type Type.\n */\n constructor(e) {\n this.propagationStopped, this.defaultPrevented, this.type = e, this.target = null;\n }\n /**\n * Prevent default. This means that no emulated `click`, `singleclick` or `doubleclick` events\n * will be fired.\n * @api\n */\n preventDefault() {\n this.defaultPrevented = !0;\n }\n /**\n * Stop event propagation.\n * @api\n */\n stopPropagation() {\n this.propagationStopped = !0;\n }\n}\nconst bo = {\n /**\n * Triggered when a property is changed.\n * @event module:ol/Object.ObjectEvent#propertychange\n * @api\n */\n PROPERTYCHANGE: \"propertychange\"\n};\nclass zf {\n constructor() {\n this.disposed = !1;\n }\n /**\n * Clean up.\n */\n dispose() {\n this.disposed || (this.disposed = !0, this.disposeInternal());\n }\n /**\n * Extension point for disposable objects.\n * @protected\n */\n disposeInternal() {\n }\n}\nfunction Wf(n, e) {\n return n > e ? 1 : n < e ? -1 : 0;\n}\nfunction Gf(n, e, t) {\n if (n[0] <= e)\n return 0;\n const i = n.length;\n if (e <= n[i - 1])\n return i - 1;\n if (typeof t == \"function\") {\n for (let r = 1; r < i; ++r) {\n const s = n[r];\n if (s === e)\n return r;\n if (s < e)\n return t(e, n[r - 1], s) > 0 ? r - 1 : r;\n }\n return i - 1;\n }\n if (t > 0) {\n for (let r = 1; r < i; ++r)\n if (n[r] < e)\n return r - 1;\n return i - 1;\n }\n if (t < 0) {\n for (let r = 1; r < i; ++r)\n if (n[r] <= e)\n return r;\n return i - 1;\n }\n for (let r = 1; r < i; ++r) {\n if (n[r] == e)\n return r;\n if (n[r] < e)\n return n[r - 1] - e < e - n[r] ? r - 1 : r;\n }\n return i - 1;\n}\nfunction w2(n, e) {\n const t = Array.isArray(e) ? e : [e], i = t.length;\n for (let r = 0; r < i; r++)\n n[n.length] = t[r];\n}\nfunction Qc(n, e) {\n const t = n.length;\n if (t !== e.length)\n return !1;\n for (let i = 0; i < t; i++)\n if (n[i] !== e[i])\n return !1;\n return !0;\n}\nfunction U2(n, e, t) {\n const i = e || Wf;\n return n.every(function(r, s) {\n if (s === 0)\n return !0;\n const a = i(n[s - 1], r);\n return !(a > 0 || t && a === 0);\n });\n}\nfunction uc() {\n return !0;\n}\nfunction Jc() {\n return !1;\n}\nfunction fc() {\n}\nfunction V2(n) {\n let e = !1, t, i, r;\n return function() {\n const s = Array.prototype.slice.call(arguments);\n return (!e || this !== r || !Qc(s, i)) && (e = !0, r = this, i = s, t = n.apply(this, arguments)), t;\n };\n}\nfunction $c(n) {\n for (const e in n)\n delete n[e];\n}\nfunction B2(n) {\n let e;\n for (e in n)\n return !1;\n return !e;\n}\nclass Xf extends zf {\n /**\n * @param {*} [target] Default event target for dispatched events.\n */\n constructor(e) {\n super(), this.eventTarget_ = e, this.pendingRemovals_ = null, this.dispatching_ = null, this.listeners_ = null;\n }\n /**\n * @param {string} type Type.\n * @param {import(\"../events.js\").Listener} listener Listener.\n */\n addEventListener(e, t) {\n if (!e || !t)\n return;\n const i = this.listeners_ || (this.listeners_ = {}), r = i[e] || (i[e] = []);\n r.includes(t) || r.push(t);\n }\n /**\n * Dispatches an event and calls all listeners listening for events\n * of this type. The event parameter can either be a string or an\n * Object with a `type` property.\n *\n * @param {import(\"./Event.js\").default|string} event Event object.\n * @return {boolean|undefined} `false` if anyone called preventDefault on the\n * event object or if any of the listeners returned false.\n * @api\n */\n dispatchEvent(e) {\n const t = typeof e == \"string\", i = t ? e : e.type, r = this.listeners_ && this.listeners_[i];\n if (!r)\n return;\n const s = t ? new dn(e) : (\n /** @type {Event} */\n e\n );\n s.target || (s.target = this.eventTarget_ || this);\n const a = this.dispatching_ || (this.dispatching_ = {}), o = this.pendingRemovals_ || (this.pendingRemovals_ = {});\n i in a || (a[i] = 0, o[i] = 0), ++a[i];\n let l;\n for (let c = 0, h = r.length; c < h; ++c)\n if (\"handleEvent\" in r[c] ? l = /** @type {import(\"../events.js\").ListenerObject} */\n r[c].handleEvent(s) : l = /** @type {import(\"../events.js\").ListenerFunction} */\n r[c].call(this, s), l === !1 || s.propagationStopped) {\n l = !1;\n break;\n }\n if (--a[i] === 0) {\n let c = o[i];\n for (delete o[i]; c--; )\n this.removeEventListener(i, fc);\n delete a[i];\n }\n return l;\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n this.listeners_ && $c(this.listeners_);\n }\n /**\n * Get the listeners for a specified event type. Listeners are returned in the\n * order that they will be called in.\n *\n * @param {string} type Type.\n * @return {Array|undefined} Listeners.\n */\n getListeners(e) {\n return this.listeners_ && this.listeners_[e] || void 0;\n }\n /**\n * @param {string} [type] Type. If not provided,\n * `true` will be returned if this event target has any listeners.\n * @return {boolean} Has listeners.\n */\n hasListener(e) {\n return this.listeners_ ? e ? e in this.listeners_ : Object.keys(this.listeners_).length > 0 : !1;\n }\n /**\n * @param {string} type Type.\n * @param {import(\"../events.js\").Listener} listener Listener.\n */\n removeEventListener(e, t) {\n const i = this.listeners_ && this.listeners_[e];\n if (i) {\n const r = i.indexOf(t);\n r !== -1 && (this.pendingRemovals_ && e in this.pendingRemovals_ ? (i[r] = fc, ++this.pendingRemovals_[e]) : (i.splice(r, 1), i.length === 0 && delete this.listeners_[e]));\n }\n }\n}\nconst St = {\n /**\n * Generic change event. Triggered when the revision counter is increased.\n * @event module:ol/events/Event~BaseEvent#change\n * @api\n */\n CHANGE: \"change\",\n /**\n * Generic error event. Triggered when an error occurs.\n * @event module:ol/events/Event~BaseEvent#error\n * @api\n */\n ERROR: \"error\",\n BLUR: \"blur\",\n CLEAR: \"clear\",\n CONTEXTMENU: \"contextmenu\",\n CLICK: \"click\",\n DBLCLICK: \"dblclick\",\n DRAGENTER: \"dragenter\",\n DRAGOVER: \"dragover\",\n DROP: \"drop\",\n FOCUS: \"focus\",\n KEYDOWN: \"keydown\",\n KEYPRESS: \"keypress\",\n LOAD: \"load\",\n RESIZE: \"resize\",\n TOUCHMOVE: \"touchmove\",\n WHEEL: \"wheel\"\n};\nfunction Ht(n, e, t, i, r) {\n if (i && i !== n && (t = t.bind(i)), r) {\n const a = t;\n t = function() {\n n.removeEventListener(e, t), a.apply(this, arguments);\n };\n }\n const s = {\n target: n,\n type: e,\n listener: t\n };\n return n.addEventListener(e, t), s;\n}\nfunction dc(n, e, t, i) {\n return Ht(n, e, t, i, !0);\n}\nfunction Ei(n) {\n n && n.target && (n.target.removeEventListener(n.type, n.listener), $c(n));\n}\nclass jo extends Xf {\n constructor() {\n super(), this.on = /** @type {ObservableOnSignature} */\n this.onInternal, this.once = /** @type {ObservableOnSignature} */\n this.onceInternal, this.un = /** @type {ObservableOnSignature} */\n this.unInternal, this.revision_ = 0;\n }\n /**\n * Increases the revision counter and dispatches a 'change' event.\n * @api\n */\n changed() {\n ++this.revision_, this.dispatchEvent(St.CHANGE);\n }\n /**\n * Get the version number for this object. Each time the object is modified,\n * its version number will be incremented.\n * @return {number} Revision.\n * @api\n */\n getRevision() {\n return this.revision_;\n }\n /**\n * @param {string|Array} type Type.\n * @param {function((Event|import(\"./events/Event\").default)): ?} listener Listener.\n * @return {import(\"./events.js\").EventsKey|Array} Event key.\n * @protected\n */\n onInternal(e, t) {\n if (Array.isArray(e)) {\n const i = e.length, r = new Array(i);\n for (let s = 0; s < i; ++s)\n r[s] = Ht(this, e[s], t);\n return r;\n }\n return Ht(\n this,\n /** @type {string} */\n e,\n t\n );\n }\n /**\n * @param {string|Array} type Type.\n * @param {function((Event|import(\"./events/Event\").default)): ?} listener Listener.\n * @return {import(\"./events.js\").EventsKey|Array} Event key.\n * @protected\n */\n onceInternal(e, t) {\n let i;\n if (Array.isArray(e)) {\n const r = e.length;\n i = new Array(r);\n for (let s = 0; s < r; ++s)\n i[s] = dc(this, e[s], t);\n } else\n i = dc(\n this,\n /** @type {string} */\n e,\n t\n );\n return t.ol_key = i, i;\n }\n /**\n * Unlisten for a certain type of event.\n * @param {string|Array} type Type.\n * @param {function((Event|import(\"./events/Event\").default)): ?} listener Listener.\n * @protected\n */\n unInternal(e, t) {\n const i = (\n /** @type {Object} */\n t.ol_key\n );\n if (i)\n k2(i);\n else if (Array.isArray(e))\n for (let r = 0, s = e.length; r < s; ++r)\n this.removeEventListener(e[r], t);\n else\n this.removeEventListener(e, t);\n }\n}\njo.prototype.on;\njo.prototype.once;\njo.prototype.un;\nfunction k2(n) {\n if (Array.isArray(n))\n for (let e = 0, t = n.length; e < t; ++e)\n Ei(n[e]);\n else\n Ei(\n /** @type {import(\"./events.js\").EventsKey} */\n n\n );\n}\nfunction di() {\n throw new Error(\"Unimplemented abstract method.\");\n}\nlet z2 = 0;\nfunction ur(n) {\n return n.ol_uid || (n.ol_uid = String(++z2));\n}\nclass cm extends dn {\n /**\n * @param {string} type The event type.\n * @param {string} key The property name.\n * @param {*} oldValue The old value for `key`.\n */\n constructor(e, t, i) {\n super(e), this.key = t, this.oldValue = i;\n }\n}\nclass Ws extends jo {\n /**\n * @param {Object} [values] An object with key-value pairs.\n */\n constructor(e) {\n super(), this.on, this.once, this.un, ur(this), this.values_ = null, e !== void 0 && this.setProperties(e);\n }\n /**\n * Gets a value.\n * @param {string} key Key name.\n * @return {*} Value.\n * @api\n */\n get(e) {\n let t;\n return this.values_ && this.values_.hasOwnProperty(e) && (t = this.values_[e]), t;\n }\n /**\n * Get a list of object property names.\n * @return {Array} List of property names.\n * @api\n */\n getKeys() {\n return this.values_ && Object.keys(this.values_) || [];\n }\n /**\n * Get an object of all property names and values.\n * @return {Object} Object.\n * @api\n */\n getProperties() {\n return this.values_ && Object.assign({}, this.values_) || {};\n }\n /**\n * @return {boolean} The object has properties.\n */\n hasProperties() {\n return !!this.values_;\n }\n /**\n * @param {string} key Key name.\n * @param {*} oldValue Old value.\n */\n notify(e, t) {\n let i;\n i = `change:${e}`, this.hasListener(i) && this.dispatchEvent(new cm(i, e, t)), i = bo.PROPERTYCHANGE, this.hasListener(i) && this.dispatchEvent(new cm(i, e, t));\n }\n /**\n * @param {string} key Key name.\n * @param {import(\"./events.js\").Listener} listener Listener.\n */\n addChangeListener(e, t) {\n this.addEventListener(`change:${e}`, t);\n }\n /**\n * @param {string} key Key name.\n * @param {import(\"./events.js\").Listener} listener Listener.\n */\n removeChangeListener(e, t) {\n this.removeEventListener(`change:${e}`, t);\n }\n /**\n * Sets a value.\n * @param {string} key Key name.\n * @param {*} value Value.\n * @param {boolean} [silent] Update without triggering an event.\n * @api\n */\n set(e, t, i) {\n const r = this.values_ || (this.values_ = {});\n if (i)\n r[e] = t;\n else {\n const s = r[e];\n r[e] = t, s !== t && this.notify(e, s);\n }\n }\n /**\n * Sets a collection of key-value pairs. Note that this changes any existing\n * properties and adds new ones (it does not remove any existing properties).\n * @param {Object} values Values.\n * @param {boolean} [silent] Update without triggering an event.\n * @api\n */\n setProperties(e, t) {\n for (const i in e)\n this.set(i, e[i], t);\n }\n /**\n * Apply any properties from another object without triggering events.\n * @param {BaseObject} source The source object.\n * @protected\n */\n applyProperties(e) {\n e.values_ && Object.assign(this.values_ || (this.values_ = {}), e.values_);\n }\n /**\n * Unsets a property.\n * @param {string} key Key name.\n * @param {boolean} [silent] Unset without triggering an event.\n * @api\n */\n unset(e, t) {\n if (this.values_ && e in this.values_) {\n const i = this.values_[e];\n delete this.values_[e], B2(this.values_) && (this.values_ = null), t || this.notify(e, i);\n }\n }\n}\nconst W2 = {\n 1: \"The view center is not defined\",\n 2: \"The view resolution is not defined\",\n 3: \"The view rotation is not defined\",\n 4: \"`image` and `src` cannot be provided at the same time\",\n 5: \"`imgSize` must be set when `image` is provided\",\n 7: \"`format` must be set when `url` is set\",\n 8: \"Unknown `serverType` configured\",\n 9: \"`url` must be configured or set using `#setUrl()`\",\n 10: \"The default `geometryFunction` can only handle `Point` geometries\",\n 11: \"`options.featureTypes` must be an Array\",\n 12: \"`options.geometryName` must also be provided when `options.bbox` is set\",\n 13: \"Invalid corner\",\n 14: \"Invalid color\",\n 15: \"Tried to get a value for a key that does not exist in the cache\",\n 16: \"Tried to set a value for a key that is used already\",\n 17: \"`resolutions` must be sorted in descending order\",\n 18: \"Either `origin` or `origins` must be configured, never both\",\n 19: \"Number of `tileSizes` and `resolutions` must be equal\",\n 20: \"Number of `origins` and `resolutions` must be equal\",\n 22: \"Either `tileSize` or `tileSizes` must be configured, never both\",\n 24: \"Invalid extent or geometry provided as `geometry`\",\n 25: \"Cannot fit empty extent provided as `geometry`\",\n 26: \"Features must have an id set\",\n 27: \"Features must have an id set\",\n 28: '`renderMode` must be `\"hybrid\"` or `\"vector\"`',\n 30: \"The passed `feature` was already added to the source\",\n 31: \"Tried to enqueue an `element` that was already added to the queue\",\n 32: \"Transformation matrix cannot be inverted\",\n 33: \"Invalid units\",\n 34: \"Invalid geometry layout\",\n 36: \"Unknown SRS type\",\n 37: \"Unknown geometry type found\",\n 38: \"`styleMapValue` has an unknown type\",\n 39: \"Unknown geometry type\",\n 40: \"Expected `feature` to have a geometry\",\n 41: \"Expected an `ol/style/Style` or an array of `ol/style/Style.js`\",\n 42: \"Question unknown, the answer is 42\",\n 43: \"Expected `layers` to be an array or a `Collection`\",\n 47: \"Expected `controls` to be an array or an `ol/Collection`\",\n 48: \"Expected `interactions` to be an array or an `ol/Collection`\",\n 49: \"Expected `overlays` to be an array or an `ol/Collection`\",\n 50: \"`options.featureTypes` should be an Array\",\n 51: \"Either `url` or `tileJSON` options must be provided\",\n 52: \"Unknown `serverType` configured\",\n 53: \"Unknown `tierSizeCalculation` configured\",\n 55: \"The {-y} placeholder requires a tile grid with extent\",\n 56: \"mapBrowserEvent must originate from a pointer event\",\n 57: \"At least 2 conditions are required\",\n 59: \"Invalid command found in the PBF\",\n 60: \"Missing or invalid `size`\",\n 61: \"Cannot determine IIIF Image API version from provided image information JSON\",\n 62: \"A `WebGLArrayBuffer` must either be of type `ELEMENT_ARRAY_BUFFER` or `ARRAY_BUFFER`\",\n 64: \"Layer opacity must be a number\",\n 66: \"`forEachFeatureAtCoordinate` cannot be used on a WebGL layer if the hit detection logic has not been enabled. This is done by providing adequate shaders using the `hitVertexShader` and `hitFragmentShader` properties of `WebGLPointsLayerRenderer`\",\n 67: \"A layer can only be added to the map once. Use either `layer.setMap()` or `map.addLayer()`, not both\",\n 68: \"A VectorTile source can only be rendered if it has a projection compatible with the view projection\",\n 69: \"`width` or `height` cannot be provided together with `scale`\"\n};\nclass TE extends Error {\n /**\n * @param {number} code Error code.\n */\n constructor(e) {\n const t = W2[e];\n super(t), this.code = e, this.name = \"AssertionError\", this.message = t;\n }\n}\nconst Dr = {\n /**\n * Triggered when an item is added to the collection.\n * @event module:ol/Collection.CollectionEvent#add\n * @api\n */\n ADD: \"add\",\n /**\n * Triggered when an item is removed from the collection.\n * @event module:ol/Collection.CollectionEvent#remove\n * @api\n */\n REMOVE: \"remove\"\n}, hm = {\n LENGTH: \"length\"\n};\nclass vl extends dn {\n /**\n * @param {import(\"./CollectionEventType.js\").default} type Type.\n * @param {T} element Element.\n * @param {number} index The index of the added or removed element.\n */\n constructor(e, t, i) {\n super(e), this.element = t, this.index = i;\n }\n}\nclass Us extends Ws {\n /**\n * @param {Array} [array] Array.\n * @param {Options} [options] Collection options.\n */\n constructor(e, t) {\n if (super(), this.on, this.once, this.un, t = t || {}, this.unique_ = !!t.unique, this.array_ = e || [], this.unique_)\n for (let i = 0, r = this.array_.length; i < r; ++i)\n this.assertUnique_(this.array_[i], i);\n this.updateLength_();\n }\n /**\n * Remove all elements from the collection.\n * @api\n */\n clear() {\n for (; this.getLength() > 0; )\n this.pop();\n }\n /**\n * Add elements to the collection. This pushes each item in the provided array\n * to the end of the collection.\n * @param {!Array} arr Array.\n * @return {Collection} This collection.\n * @api\n */\n extend(e) {\n for (let t = 0, i = e.length; t < i; ++t)\n this.push(e[t]);\n return this;\n }\n /**\n * Iterate over each element, calling the provided callback.\n * @param {function(T, number, Array): *} f The function to call\n * for every element. This function takes 3 arguments (the element, the\n * index and the array). The return value is ignored.\n * @api\n */\n forEach(e) {\n const t = this.array_;\n for (let i = 0, r = t.length; i < r; ++i)\n e(t[i], i, t);\n }\n /**\n * Get a reference to the underlying Array object. Warning: if the array\n * is mutated, no events will be dispatched by the collection, and the\n * collection's \"length\" property won't be in sync with the actual length\n * of the array.\n * @return {!Array} Array.\n * @api\n */\n getArray() {\n return this.array_;\n }\n /**\n * Get the element at the provided index.\n * @param {number} index Index.\n * @return {T} Element.\n * @api\n */\n item(e) {\n return this.array_[e];\n }\n /**\n * Get the length of this collection.\n * @return {number} The length of the array.\n * @observable\n * @api\n */\n getLength() {\n return this.get(hm.LENGTH);\n }\n /**\n * Insert an element at the provided index.\n * @param {number} index Index.\n * @param {T} elem Element.\n * @api\n */\n insertAt(e, t) {\n if (e < 0 || e > this.getLength())\n throw new Error(\"Index out of bounds: \" + e);\n this.unique_ && this.assertUnique_(t), this.array_.splice(e, 0, t), this.updateLength_(), this.dispatchEvent(\n new vl(Dr.ADD, t, e)\n );\n }\n /**\n * Remove the last element of the collection and return it.\n * Return `undefined` if the collection is empty.\n * @return {T|undefined} Element.\n * @api\n */\n pop() {\n return this.removeAt(this.getLength() - 1);\n }\n /**\n * Insert the provided element at the end of the collection.\n * @param {T} elem Element.\n * @return {number} New length of the collection.\n * @api\n */\n push(e) {\n this.unique_ && this.assertUnique_(e);\n const t = this.getLength();\n return this.insertAt(t, e), this.getLength();\n }\n /**\n * Remove the first occurrence of an element from the collection.\n * @param {T} elem Element.\n * @return {T|undefined} The removed element or undefined if none found.\n * @api\n */\n remove(e) {\n const t = this.array_;\n for (let i = 0, r = t.length; i < r; ++i)\n if (t[i] === e)\n return this.removeAt(i);\n }\n /**\n * Remove the element at the provided index and return it.\n * Return `undefined` if the collection does not contain this index.\n * @param {number} index Index.\n * @return {T|undefined} Value.\n * @api\n */\n removeAt(e) {\n if (e < 0 || e >= this.getLength())\n return;\n const t = this.array_[e];\n return this.array_.splice(e, 1), this.updateLength_(), this.dispatchEvent(\n /** @type {CollectionEvent} */\n new vl(Dr.REMOVE, t, e)\n ), t;\n }\n /**\n * Set the element at the provided index.\n * @param {number} index Index.\n * @param {T} elem Element.\n * @api\n */\n setAt(e, t) {\n const i = this.getLength();\n if (e >= i) {\n this.insertAt(e, t);\n return;\n }\n if (e < 0)\n throw new Error(\"Index out of bounds: \" + e);\n this.unique_ && this.assertUnique_(t, e);\n const r = this.array_[e];\n this.array_[e] = t, this.dispatchEvent(\n /** @type {CollectionEvent} */\n new vl(Dr.REMOVE, r, e)\n ), this.dispatchEvent(\n /** @type {CollectionEvent} */\n new vl(Dr.ADD, t, e)\n );\n }\n /**\n * @private\n */\n updateLength_() {\n this.set(hm.LENGTH, this.array_.length);\n }\n /**\n * @private\n * @param {T} elem Element.\n * @param {number} [except] Optional index to ignore.\n */\n assertUnique_(e, t) {\n for (let i = 0, r = this.array_.length; i < r; ++i)\n if (this.array_[i] === e && i !== t)\n throw new TE(58);\n }\n}\nconst ln = typeof navigator < \"u\" && typeof navigator.userAgent < \"u\" ? navigator.userAgent.toLowerCase() : \"\", G2 = ln.includes(\"firefox\"), X2 = ln.includes(\"safari\") && !ln.includes(\"chrom\");\nX2 && (ln.includes(\"version/15.4\") || /cpu (os|iphone os) 15_4 like mac os x/.test(ln));\nconst H2 = ln.includes(\"webkit\") && !ln.includes(\"edge\"), xE = ln.includes(\"macintosh\"), CE = typeof devicePixelRatio < \"u\" ? devicePixelRatio : 1, RE = typeof WorkerGlobalScope < \"u\" && typeof OffscreenCanvas < \"u\" && self instanceof WorkerGlobalScope, K2 = typeof Image < \"u\" && Image.prototype.decode, SE = function() {\n let n = !1;\n try {\n const e = Object.defineProperty({}, \"passive\", {\n get: function() {\n n = !0;\n }\n });\n window.addEventListener(\"_\", null, e), window.removeEventListener(\"_\", null, e);\n } catch {\n }\n return n;\n}();\nfunction Kt(n, e) {\n if (!n)\n throw new TE(e);\n}\nnew Array(6);\nfunction xa() {\n return [1, 0, 0, 1, 0, 0];\n}\nfunction Ar(n, e) {\n const t = e[0], i = e[1];\n return e[0] = n[0] * t + n[2] * i + n[4], e[1] = n[1] * t + n[3] * i + n[5], e;\n}\nfunction Ao(n, e, t, i, r, s, a, o) {\n const l = Math.sin(s), c = Math.cos(s);\n return n[0] = i * c, n[1] = r * l, n[2] = -i * l, n[3] = r * c, n[4] = a * i * c - o * i * l + e, n[5] = a * r * l + o * r * c + t, n;\n}\nfunction yE(n, e) {\n const t = q2(e);\n Kt(t !== 0, 32);\n const i = e[0], r = e[1], s = e[2], a = e[3], o = e[4], l = e[5];\n return n[0] = a / t, n[1] = -r / t, n[2] = -s / t, n[3] = i / t, n[4] = (s * l - a * o) / t, n[5] = -(i * l - r * o) / t, n;\n}\nfunction q2(n) {\n return n[0] * n[3] - n[1] * n[2];\n}\nlet um;\nfunction Y2(n) {\n const e = \"matrix(\" + n.join(\", \") + \")\";\n if (RE)\n return e;\n const t = um || (um = document.createElement(\"div\"));\n return t.style.transform = e, t.style.transform;\n}\nconst Gi = {\n UNKNOWN: 0,\n INTERSECTING: 1,\n ABOVE: 2,\n RIGHT: 4,\n BELOW: 8,\n LEFT: 16\n};\nfunction fm(n) {\n const e = Vn();\n for (let t = 0, i = n.length; t < i; ++t)\n Kl(e, n[t]);\n return e;\n}\nfunction Z2(n, e, t) {\n const i = Math.min.apply(null, n), r = Math.min.apply(null, e), s = Math.max.apply(null, n), a = Math.max.apply(null, e);\n return Ha(i, r, s, a, t);\n}\nfunction j2(n, e) {\n return e ? (e[0] = n[0], e[1] = n[1], e[2] = n[2], e[3] = n[3], e) : n.slice();\n}\nfunction IE(n, e, t) {\n let i, r;\n return e < n[0] ? i = n[0] - e : n[2] < e ? i = e - n[2] : i = 0, t < n[1] ? r = n[1] - t : n[3] < t ? r = t - n[3] : r = 0, i * i + r * r;\n}\nfunction Hf(n, e) {\n return bE(n, e[0], e[1]);\n}\nfunction Q2(n, e) {\n return n[0] <= e[0] && e[2] <= n[2] && n[1] <= e[1] && e[3] <= n[3];\n}\nfunction bE(n, e, t) {\n return n[0] <= e && e <= n[2] && n[1] <= t && t <= n[3];\n}\nfunction dm(n, e) {\n const t = n[0], i = n[1], r = n[2], s = n[3], a = e[0], o = e[1];\n let l = Gi.UNKNOWN;\n return a < t ? l = l | Gi.LEFT : a > r && (l = l | Gi.RIGHT), o < i ? l = l | Gi.BELOW : o > s && (l = l | Gi.ABOVE), l === Gi.UNKNOWN && (l = Gi.INTERSECTING), l;\n}\nfunction Vn() {\n return [1 / 0, 1 / 0, -1 / 0, -1 / 0];\n}\nfunction Ha(n, e, t, i, r) {\n return r ? (r[0] = n, r[1] = e, r[2] = t, r[3] = i, r) : [n, e, t, i];\n}\nfunction Qo(n) {\n return Ha(1 / 0, 1 / 0, -1 / 0, -1 / 0, n);\n}\nfunction J2(n, e) {\n const t = n[0], i = n[1];\n return Ha(t, i, t, i, e);\n}\nfunction $2(n, e, t, i, r) {\n const s = Qo(r);\n return AE(s, n, e, t, i);\n}\nfunction Cu(n, e) {\n return n[0] == e[0] && n[2] == e[2] && n[1] == e[1] && n[3] == e[3];\n}\nfunction ew(n, e) {\n return e[0] < n[0] && (n[0] = e[0]), e[2] > n[2] && (n[2] = e[2]), e[1] < n[1] && (n[1] = e[1]), e[3] > n[3] && (n[3] = e[3]), n;\n}\nfunction Kl(n, e) {\n e[0] < n[0] && (n[0] = e[0]), e[0] > n[2] && (n[2] = e[0]), e[1] < n[1] && (n[1] = e[1]), e[1] > n[3] && (n[3] = e[1]);\n}\nfunction AE(n, e, t, i, r) {\n for (; t < i; t += r)\n tw(n, e[t], e[t + 1]);\n return n;\n}\nfunction tw(n, e, t) {\n n[0] = Math.min(n[0], e), n[1] = Math.min(n[1], t), n[2] = Math.max(n[2], e), n[3] = Math.max(n[3], t);\n}\nfunction ME(n, e) {\n let t;\n return t = e(eh(n)), t || (t = e(th(n)), t) || (t = e(ih(n)), t) || (t = e(Bn(n)), t) ? t : !1;\n}\nfunction Ru(n) {\n let e = 0;\n return $o(n) || (e = Ui(n) * gs(n)), e;\n}\nfunction eh(n) {\n return [n[0], n[1]];\n}\nfunction th(n) {\n return [n[2], n[1]];\n}\nfunction Mo(n) {\n return [(n[0] + n[2]) / 2, (n[1] + n[3]) / 2];\n}\nfunction iw(n, e) {\n let t;\n return e === \"bottom-left\" ? t = eh(n) : e === \"bottom-right\" ? t = th(n) : e === \"top-left\" ? t = Bn(n) : e === \"top-right\" ? t = ih(n) : Kt(!1, 13), t;\n}\nfunction Su(n, e, t, i, r) {\n const [s, a, o, l, c, h, u, f] = yu(\n n,\n e,\n t,\n i\n );\n return Ha(\n Math.min(s, o, c, u),\n Math.min(a, l, h, f),\n Math.max(s, o, c, u),\n Math.max(a, l, h, f),\n r\n );\n}\nfunction yu(n, e, t, i) {\n const r = e * i[0] / 2, s = e * i[1] / 2, a = Math.cos(t), o = Math.sin(t), l = r * a, c = r * o, h = s * a, u = s * o, f = n[0], d = n[1];\n return [\n f - l + u,\n d - c - h,\n f - l - u,\n d - c + h,\n f + l - u,\n d + c + h,\n f + l + u,\n d + c - h,\n f - l + u,\n d - c - h\n ];\n}\nfunction gs(n) {\n return n[3] - n[1];\n}\nfunction fo(n, e, t) {\n const i = t || Vn();\n return Jo(n, e) ? (n[0] > e[0] ? i[0] = n[0] : i[0] = e[0], n[1] > e[1] ? i[1] = n[1] : i[1] = e[1], n[2] < e[2] ? i[2] = n[2] : i[2] = e[2], n[3] < e[3] ? i[3] = n[3] : i[3] = e[3]) : Qo(i), i;\n}\nfunction Bn(n) {\n return [n[0], n[3]];\n}\nfunction ih(n) {\n return [n[2], n[3]];\n}\nfunction Ui(n) {\n return n[2] - n[0];\n}\nfunction Jo(n, e) {\n return n[0] <= e[2] && n[2] >= e[0] && n[1] <= e[3] && n[3] >= e[1];\n}\nfunction $o(n) {\n return n[2] < n[0] || n[3] < n[1];\n}\nfunction rw(n, e) {\n return e ? (e[0] = n[0], e[1] = n[1], e[2] = n[2], e[3] = n[3], e) : n;\n}\nfunction sw(n, e, t) {\n let i = !1;\n const r = dm(n, e), s = dm(n, t);\n if (r === Gi.INTERSECTING || s === Gi.INTERSECTING)\n i = !0;\n else {\n const a = n[0], o = n[1], l = n[2], c = n[3], h = e[0], u = e[1], f = t[0], d = t[1], p = (d - u) / (f - h);\n let g, m;\n s & Gi.ABOVE && !(r & Gi.ABOVE) && (g = f - (d - c) / p, i = g >= a && g <= l), !i && s & Gi.RIGHT && !(r & Gi.RIGHT) && (m = d - (f - l) * p, i = m >= o && m <= c), !i && s & Gi.BELOW && !(r & Gi.BELOW) && (g = f - (d - o) / p, i = g >= a && g <= l), !i && s & Gi.LEFT && !(r & Gi.LEFT) && (m = d - (f - a) * p, i = m >= o && m <= c);\n }\n return i;\n}\nfunction nw(n, e, t, i) {\n if ($o(n))\n return Qo(t);\n let r = [];\n if (i > 1) {\n const o = n[2] - n[0], l = n[3] - n[1];\n for (let c = 0; c < i; ++c)\n r.push(\n n[0] + o * c / i,\n n[1],\n n[2],\n n[1] + l * c / i,\n n[2] - o * c / i,\n n[3],\n n[0],\n n[3] - l * c / i\n );\n } else\n r = [\n n[0],\n n[1],\n n[2],\n n[1],\n n[2],\n n[3],\n n[0],\n n[3]\n ];\n e(r, r, 2);\n const s = [], a = [];\n for (let o = 0, l = r.length; o < l; o += 2)\n s.push(r[o]), a.push(r[o + 1]);\n return Z2(s, a, t);\n}\nfunction Vi(n, e, t) {\n return Math.min(Math.max(n, e), t);\n}\nfunction aw(n, e, t, i, r, s) {\n const a = r - t, o = s - i;\n if (a !== 0 || o !== 0) {\n const l = ((n - t) * a + (e - i) * o) / (a * a + o * o);\n l > 1 ? (t = r, i = s) : l > 0 && (t += a * l, i += o * l);\n }\n return Ca(n, e, t, i);\n}\nfunction Ca(n, e, t, i) {\n const r = t - n, s = i - e;\n return r * r + s * s;\n}\nfunction ow(n) {\n const e = n.length;\n for (let i = 0; i < e; i++) {\n let r = i, s = Math.abs(n[i][i]);\n for (let o = i + 1; o < e; o++) {\n const l = Math.abs(n[o][i]);\n l > s && (s = l, r = o);\n }\n if (s === 0)\n return null;\n const a = n[r];\n n[r] = n[i], n[i] = a;\n for (let o = i + 1; o < e; o++) {\n const l = -n[o][i] / n[i][i];\n for (let c = i; c < e + 1; c++)\n i == c ? n[o][c] = 0 : n[o][c] += l * n[i][c];\n }\n }\n const t = new Array(e);\n for (let i = e - 1; i >= 0; i--) {\n t[i] = n[i][e] / n[i][i];\n for (let r = i - 1; r >= 0; r--)\n n[r][e] -= n[r][i] * t[i];\n }\n return t;\n}\nfunction ql(n) {\n return n * Math.PI / 180;\n}\nfunction Ra(n, e) {\n const t = n % e;\n return t * e < 0 ? t + e : t;\n}\nfunction lw(n, e, t) {\n return n + t * (e - n);\n}\nfunction PE(n, e) {\n const t = Math.pow(10, e);\n return Math.round(n * t) / t;\n}\nfunction Tl(n, e) {\n return Math.floor(PE(n, e));\n}\nfunction xl(n, e) {\n return Math.ceil(PE(n, e));\n}\nconst cw = /^#([a-f0-9]{3}|[a-f0-9]{4}(?:[a-f0-9]{2}){0,2})$/i, hw = /^([a-z]*)$|^hsla?\\(.*\\)$/i;\nfunction uw(n) {\n return typeof n == \"string\" ? n : gw(n);\n}\nfunction fw(n) {\n const e = document.createElement(\"div\");\n if (e.style.color = n, e.style.color !== \"\") {\n document.body.appendChild(e);\n const t = getComputedStyle(e).color;\n return document.body.removeChild(e), t;\n }\n return \"\";\n}\nconst dw = /* @__PURE__ */ function() {\n const e = {};\n let t = 0;\n return (\n /**\n * @param {string} s String.\n * @return {Color} Color.\n */\n function(i) {\n let r;\n if (e.hasOwnProperty(i))\n r = e[i];\n else {\n if (t >= 1024) {\n let s = 0;\n for (const a in e)\n s++ & 3 || (delete e[a], --t);\n }\n r = pw(i), e[i] = r, ++t;\n }\n return r;\n }\n );\n}();\nfunction pm(n) {\n return Array.isArray(n) ? n : dw(n);\n}\nfunction pw(n) {\n let e, t, i, r, s;\n if (hw.exec(n) && (n = fw(n)), cw.exec(n)) {\n const a = n.length - 1;\n let o;\n a <= 4 ? o = 1 : o = 2;\n const l = a === 4 || a === 8;\n e = parseInt(n.substr(1 + 0 * o, o), 16), t = parseInt(n.substr(1 + 1 * o, o), 16), i = parseInt(n.substr(1 + 2 * o, o), 16), l ? r = parseInt(n.substr(1 + 3 * o, o), 16) : r = 255, o == 1 && (e = (e << 4) + e, t = (t << 4) + t, i = (i << 4) + i, l && (r = (r << 4) + r)), s = [e, t, i, r / 255];\n } else\n n.startsWith(\"rgba(\") ? (s = n.slice(5, -1).split(\",\").map(Number), gm(s)) : n.startsWith(\"rgb(\") ? (s = n.slice(4, -1).split(\",\").map(Number), s.push(1), gm(s)) : Kt(!1, 14);\n return s;\n}\nfunction gm(n) {\n return n[0] = Vi(n[0] + 0.5 | 0, 0, 255), n[1] = Vi(n[1] + 0.5 | 0, 0, 255), n[2] = Vi(n[2] + 0.5 | 0, 0, 255), n[3] = Vi(n[3], 0, 1), n;\n}\nfunction gw(n) {\n let e = n[0];\n e != (e | 0) && (e = e + 0.5 | 0);\n let t = n[1];\n t != (t | 0) && (t = t + 0.5 | 0);\n let i = n[2];\n i != (i | 0) && (i = i + 0.5 | 0);\n const r = n[3] === void 0 ? 1 : Math.round(n[3] * 100) / 100;\n return \"rgba(\" + e + \",\" + t + \",\" + i + \",\" + r + \")\";\n}\nclass mw {\n constructor() {\n this.cache_ = {}, this.cacheSize_ = 0, this.maxCacheSize_ = 32;\n }\n /**\n * FIXME empty description for jsdoc\n */\n clear() {\n this.cache_ = {}, this.cacheSize_ = 0;\n }\n /**\n * @return {boolean} Can expire cache.\n */\n canExpireCache() {\n return this.cacheSize_ > this.maxCacheSize_;\n }\n /**\n * FIXME empty description for jsdoc\n */\n expire() {\n if (this.canExpireCache()) {\n let e = 0;\n for (const t in this.cache_) {\n const i = this.cache_[t];\n !(e++ & 3) && !i.hasListener() && (delete this.cache_[t], --this.cacheSize_);\n }\n }\n }\n /**\n * @param {string} src Src.\n * @param {?string} crossOrigin Cross origin.\n * @param {import(\"../color.js\").Color} color Color.\n * @return {import(\"./IconImage.js\").default} Icon image.\n */\n get(e, t, i) {\n const r = mm(e, t, i);\n return r in this.cache_ ? this.cache_[r] : null;\n }\n /**\n * @param {string} src Src.\n * @param {?string} crossOrigin Cross origin.\n * @param {import(\"../color.js\").Color} color Color.\n * @param {import(\"./IconImage.js\").default} iconImage Icon image.\n */\n set(e, t, i, r) {\n const s = mm(e, t, i);\n this.cache_[s] = r, ++this.cacheSize_;\n }\n /**\n * Set the cache size of the icon cache. Default is `32`. Change this value when\n * your map uses more than 32 different icon images and you are not caching icon\n * styles on the application level.\n * @param {number} maxCacheSize Cache max size.\n * @api\n */\n setSize(e) {\n this.maxCacheSize_ = e, this.expire();\n }\n}\nfunction mm(n, e, t) {\n const i = t ? uw(t) : \"null\";\n return e + \":\" + n + \":\" + i;\n}\nconst OE = new mw(), Gt = {\n OPACITY: \"opacity\",\n VISIBLE: \"visible\",\n EXTENT: \"extent\",\n Z_INDEX: \"zIndex\",\n MAX_RESOLUTION: \"maxResolution\",\n MIN_RESOLUTION: \"minResolution\",\n MAX_ZOOM: \"maxZoom\",\n MIN_ZOOM: \"minZoom\",\n SOURCE: \"source\",\n MAP: \"map\"\n};\nclass DE extends Ws {\n /**\n * @param {Options} options Layer options.\n */\n constructor(e) {\n super(), this.on, this.once, this.un, this.background_ = e.background;\n const t = Object.assign({}, e);\n typeof e.properties == \"object\" && (delete t.properties, Object.assign(t, e.properties)), t[Gt.OPACITY] = e.opacity !== void 0 ? e.opacity : 1, Kt(typeof t[Gt.OPACITY] == \"number\", 64), t[Gt.VISIBLE] = e.visible !== void 0 ? e.visible : !0, t[Gt.Z_INDEX] = e.zIndex, t[Gt.MAX_RESOLUTION] = e.maxResolution !== void 0 ? e.maxResolution : 1 / 0, t[Gt.MIN_RESOLUTION] = e.minResolution !== void 0 ? e.minResolution : 0, t[Gt.MIN_ZOOM] = e.minZoom !== void 0 ? e.minZoom : -1 / 0, t[Gt.MAX_ZOOM] = e.maxZoom !== void 0 ? e.maxZoom : 1 / 0, this.className_ = t.className !== void 0 ? t.className : \"ol-layer\", delete t.className, this.setProperties(t), this.state_ = null;\n }\n /**\n * Get the background for this layer.\n * @return {BackgroundColor|false} Layer background.\n */\n getBackground() {\n return this.background_;\n }\n /**\n * @return {string} CSS class name.\n */\n getClassName() {\n return this.className_;\n }\n /**\n * This method is not meant to be called by layers or layer renderers because the state\n * is incorrect if the layer is included in a layer group.\n *\n * @param {boolean} [managed] Layer is managed.\n * @return {import(\"./Layer.js\").State} Layer state.\n */\n getLayerState(e) {\n const t = this.state_ || /** @type {?} */\n {\n layer: this,\n managed: e === void 0 ? !0 : e\n }, i = this.getZIndex();\n return t.opacity = Vi(Math.round(this.getOpacity() * 100) / 100, 0, 1), t.visible = this.getVisible(), t.extent = this.getExtent(), t.zIndex = i === void 0 && !t.managed ? 1 / 0 : i, t.maxResolution = this.getMaxResolution(), t.minResolution = Math.max(this.getMinResolution(), 0), t.minZoom = this.getMinZoom(), t.maxZoom = this.getMaxZoom(), this.state_ = t, t;\n }\n /**\n * @abstract\n * @param {Array} [array] Array of layers (to be\n * modified in place).\n * @return {Array} Array of layers.\n */\n getLayersArray(e) {\n return di();\n }\n /**\n * @abstract\n * @param {Array} [states] Optional list of layer\n * states (to be modified in place).\n * @return {Array} List of layer states.\n */\n getLayerStatesArray(e) {\n return di();\n }\n /**\n * Return the {@link module:ol/extent~Extent extent} of the layer or `undefined` if it\n * will be visible regardless of extent.\n * @return {import(\"../extent.js\").Extent|undefined} The layer extent.\n * @observable\n * @api\n */\n getExtent() {\n return (\n /** @type {import(\"../extent.js\").Extent|undefined} */\n this.get(Gt.EXTENT)\n );\n }\n /**\n * Return the maximum resolution of the layer.\n * @return {number} The maximum resolution of the layer.\n * @observable\n * @api\n */\n getMaxResolution() {\n return (\n /** @type {number} */\n this.get(Gt.MAX_RESOLUTION)\n );\n }\n /**\n * Return the minimum resolution of the layer.\n * @return {number} The minimum resolution of the layer.\n * @observable\n * @api\n */\n getMinResolution() {\n return (\n /** @type {number} */\n this.get(Gt.MIN_RESOLUTION)\n );\n }\n /**\n * Return the minimum zoom level of the layer.\n * @return {number} The minimum zoom level of the layer.\n * @observable\n * @api\n */\n getMinZoom() {\n return (\n /** @type {number} */\n this.get(Gt.MIN_ZOOM)\n );\n }\n /**\n * Return the maximum zoom level of the layer.\n * @return {number} The maximum zoom level of the layer.\n * @observable\n * @api\n */\n getMaxZoom() {\n return (\n /** @type {number} */\n this.get(Gt.MAX_ZOOM)\n );\n }\n /**\n * Return the opacity of the layer (between 0 and 1).\n * @return {number} The opacity of the layer.\n * @observable\n * @api\n */\n getOpacity() {\n return (\n /** @type {number} */\n this.get(Gt.OPACITY)\n );\n }\n /**\n * @abstract\n * @return {import(\"../source/Source.js\").State} Source state.\n */\n getSourceState() {\n return di();\n }\n /**\n * Return the value of this layer's `visible` property. To find out whether the layer\n * is visible on a map, use `isVisible()` instead.\n * @return {boolean} The value of the `visible` property of the layer.\n * @observable\n * @api\n */\n getVisible() {\n return (\n /** @type {boolean} */\n this.get(Gt.VISIBLE)\n );\n }\n /**\n * Return the Z-index of the layer, which is used to order layers before\n * rendering. The default Z-index is 0.\n * @return {number} The Z-index of the layer.\n * @observable\n * @api\n */\n getZIndex() {\n return (\n /** @type {number} */\n this.get(Gt.Z_INDEX)\n );\n }\n /**\n * Sets the background color.\n * @param {BackgroundColor} [background] Background color.\n */\n setBackground(e) {\n this.background_ = e, this.changed();\n }\n /**\n * Set the extent at which the layer is visible. If `undefined`, the layer\n * will be visible at all extents.\n * @param {import(\"../extent.js\").Extent|undefined} extent The extent of the layer.\n * @observable\n * @api\n */\n setExtent(e) {\n this.set(Gt.EXTENT, e);\n }\n /**\n * Set the maximum resolution at which the layer is visible.\n * @param {number} maxResolution The maximum resolution of the layer.\n * @observable\n * @api\n */\n setMaxResolution(e) {\n this.set(Gt.MAX_RESOLUTION, e);\n }\n /**\n * Set the minimum resolution at which the layer is visible.\n * @param {number} minResolution The minimum resolution of the layer.\n * @observable\n * @api\n */\n setMinResolution(e) {\n this.set(Gt.MIN_RESOLUTION, e);\n }\n /**\n * Set the maximum zoom (exclusive) at which the layer is visible.\n * Note that the zoom levels for layer visibility are based on the\n * view zoom level, which may be different from a tile source zoom level.\n * @param {number} maxZoom The maximum zoom of the layer.\n * @observable\n * @api\n */\n setMaxZoom(e) {\n this.set(Gt.MAX_ZOOM, e);\n }\n /**\n * Set the minimum zoom (inclusive) at which the layer is visible.\n * Note that the zoom levels for layer visibility are based on the\n * view zoom level, which may be different from a tile source zoom level.\n * @param {number} minZoom The minimum zoom of the layer.\n * @observable\n * @api\n */\n setMinZoom(e) {\n this.set(Gt.MIN_ZOOM, e);\n }\n /**\n * Set the opacity of the layer, allowed values range from 0 to 1.\n * @param {number} opacity The opacity of the layer.\n * @observable\n * @api\n */\n setOpacity(e) {\n Kt(typeof e == \"number\", 64), this.set(Gt.OPACITY, e);\n }\n /**\n * Set the visibility of the layer (`true` or `false`).\n * @param {boolean} visible The visibility of the layer.\n * @observable\n * @api\n */\n setVisible(e) {\n this.set(Gt.VISIBLE, e);\n }\n /**\n * Set Z-index of the layer, which is used to order layers before rendering.\n * The default Z-index is 0.\n * @param {number} zindex The z-index of the layer.\n * @observable\n * @api\n */\n setZIndex(e) {\n this.set(Gt.Z_INDEX, e);\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n this.state_ && (this.state_.layer = null, this.state_ = null), super.disposeInternal();\n }\n}\nconst nn = {\n /**\n * Triggered before a layer is rendered.\n * @event module:ol/render/Event~RenderEvent#prerender\n * @api\n */\n PRERENDER: \"prerender\",\n /**\n * Triggered after a layer is rendered.\n * @event module:ol/render/Event~RenderEvent#postrender\n * @api\n */\n POSTRENDER: \"postrender\",\n /**\n * Triggered before layers are composed. When dispatched by the map, the event object will not have\n * a `context` set. When dispatched by a layer, the event object will have a `context` set. Only\n * WebGL layers currently dispatch this event.\n * @event module:ol/render/Event~RenderEvent#precompose\n * @api\n */\n PRECOMPOSE: \"precompose\",\n /**\n * Triggered after layers are composed. When dispatched by the map, the event object will not have\n * a `context` set. When dispatched by a layer, the event object will have a `context` set. Only\n * WebGL layers currently dispatch this event.\n * @event module:ol/render/Event~RenderEvent#postcompose\n * @api\n */\n POSTCOMPOSE: \"postcompose\",\n /**\n * Triggered when rendering is complete, i.e. all sources and tiles have\n * finished loading for the current viewport, and all tiles are faded in.\n * The event object will not have a `context` set.\n * @event module:ol/render/Event~RenderEvent#rendercomplete\n * @api\n */\n RENDERCOMPLETE: \"rendercomplete\"\n}, Mr = {\n ANIMATING: 0,\n INTERACTING: 1\n}, Gr = {\n CENTER: \"center\",\n RESOLUTION: \"resolution\",\n ROTATION: \"rotation\"\n}, _w = 42, Kf = 256, Po = {\n // use the radius of the Normal sphere\n radians: 6370997 / (2 * Math.PI),\n degrees: 2 * Math.PI * 6370997 / 360,\n ft: 0.3048,\n m: 1,\n \"us-ft\": 1200 / 3937\n};\nclass NE {\n /**\n * @param {Options} options Projection options.\n */\n constructor(e) {\n this.code_ = e.code, this.units_ = /** @type {import(\"./Units.js\").Units} */\n e.units, this.extent_ = e.extent !== void 0 ? e.extent : null, this.worldExtent_ = e.worldExtent !== void 0 ? e.worldExtent : null, this.axisOrientation_ = e.axisOrientation !== void 0 ? e.axisOrientation : \"enu\", this.global_ = e.global !== void 0 ? e.global : !1, this.canWrapX_ = !!(this.global_ && this.extent_), this.getPointResolutionFunc_ = e.getPointResolution, this.defaultTileGrid_ = null, this.metersPerUnit_ = e.metersPerUnit;\n }\n /**\n * @return {boolean} The projection is suitable for wrapping the x-axis\n */\n canWrapX() {\n return this.canWrapX_;\n }\n /**\n * Get the code for this projection, e.g. 'EPSG:4326'.\n * @return {string} Code.\n * @api\n */\n getCode() {\n return this.code_;\n }\n /**\n * Get the validity extent for this projection.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getExtent() {\n return this.extent_;\n }\n /**\n * Get the units of this projection.\n * @return {import(\"./Units.js\").Units} Units.\n * @api\n */\n getUnits() {\n return this.units_;\n }\n /**\n * Get the amount of meters per unit of this projection. If the projection is\n * not configured with `metersPerUnit` or a units identifier, the return is\n * `undefined`.\n * @return {number|undefined} Meters.\n * @api\n */\n getMetersPerUnit() {\n return this.metersPerUnit_ || Po[this.units_];\n }\n /**\n * Get the world extent for this projection.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getWorldExtent() {\n return this.worldExtent_;\n }\n /**\n * Get the axis orientation of this projection.\n * Example values are:\n * enu - the default easting, northing, elevation.\n * neu - northing, easting, up - useful for \"lat/long\" geographic coordinates,\n * or south orientated transverse mercator.\n * wnu - westing, northing, up - some planetary coordinate systems have\n * \"west positive\" coordinate systems\n * @return {string} Axis orientation.\n * @api\n */\n getAxisOrientation() {\n return this.axisOrientation_;\n }\n /**\n * Is this projection a global projection which spans the whole world?\n * @return {boolean} Whether the projection is global.\n * @api\n */\n isGlobal() {\n return this.global_;\n }\n /**\n * Set if the projection is a global projection which spans the whole world\n * @param {boolean} global Whether the projection is global.\n * @api\n */\n setGlobal(e) {\n this.global_ = e, this.canWrapX_ = !!(e && this.extent_);\n }\n /**\n * @return {import(\"../tilegrid/TileGrid.js\").default} The default tile grid.\n */\n getDefaultTileGrid() {\n return this.defaultTileGrid_;\n }\n /**\n * @param {import(\"../tilegrid/TileGrid.js\").default} tileGrid The default tile grid.\n */\n setDefaultTileGrid(e) {\n this.defaultTileGrid_ = e;\n }\n /**\n * Set the validity extent for this projection.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @api\n */\n setExtent(e) {\n this.extent_ = e, this.canWrapX_ = !!(this.global_ && e);\n }\n /**\n * Set the world extent for this projection.\n * @param {import(\"../extent.js\").Extent} worldExtent World extent\n * [minlon, minlat, maxlon, maxlat].\n * @api\n */\n setWorldExtent(e) {\n this.worldExtent_ = e;\n }\n /**\n * Set the getPointResolution function (see {@link module:ol/proj.getPointResolution}\n * for this projection.\n * @param {function(number, import(\"../coordinate.js\").Coordinate):number} func Function\n * @api\n */\n setGetPointResolution(e) {\n this.getPointResolutionFunc_ = e;\n }\n /**\n * Get the custom point resolution function for this projection (if set).\n * @return {function(number, import(\"../coordinate.js\").Coordinate):number|undefined} The custom point\n * resolution function (if set).\n */\n getPointResolutionFunc() {\n return this.getPointResolutionFunc_;\n }\n}\nconst el = 6378137, ca = Math.PI * el, Ew = [-ca, -ca, ca, ca], vw = [-180, -85, 180, 85], Cl = el * Math.log(Math.tan(Math.PI / 2));\nclass ea extends NE {\n /**\n * @param {string} code Code.\n */\n constructor(e) {\n super({\n code: e,\n units: \"m\",\n extent: Ew,\n global: !0,\n worldExtent: vw,\n getPointResolution: function(t, i) {\n return t / Math.cosh(i[1] / el);\n }\n });\n }\n}\nconst _m = [\n new ea(\"EPSG:3857\"),\n new ea(\"EPSG:102100\"),\n new ea(\"EPSG:102113\"),\n new ea(\"EPSG:900913\"),\n new ea(\"http://www.opengis.net/def/crs/EPSG/0/3857\"),\n new ea(\"http://www.opengis.net/gml/srs/epsg.xml#3857\")\n];\nfunction Tw(n, e, t) {\n const i = n.length;\n t = t > 1 ? t : 2, e === void 0 && (t > 2 ? e = n.slice() : e = new Array(i));\n for (let r = 0; r < i; r += t) {\n e[r] = ca * n[r] / 180;\n let s = el * Math.log(Math.tan(Math.PI * (+n[r + 1] + 90) / 360));\n s > Cl ? s = Cl : s < -Cl && (s = -Cl), e[r + 1] = s;\n }\n return e;\n}\nfunction xw(n, e, t) {\n const i = n.length;\n t = t > 1 ? t : 2, e === void 0 && (t > 2 ? e = n.slice() : e = new Array(i));\n for (let r = 0; r < i; r += t)\n e[r] = 180 * n[r] / ca, e[r + 1] = 360 * Math.atan(Math.exp(n[r + 1] / el)) / Math.PI - 90;\n return e;\n}\nconst Cw = 6378137, Em = [-180, -90, 180, 90], Rw = Math.PI * Cw / 180;\nclass vn extends NE {\n /**\n * @param {string} code Code.\n * @param {string} [axisOrientation] Axis orientation.\n */\n constructor(e, t) {\n super({\n code: e,\n units: \"degrees\",\n extent: Em,\n axisOrientation: t,\n global: !0,\n metersPerUnit: Rw,\n worldExtent: Em\n });\n }\n}\nconst vm = [\n new vn(\"CRS:84\"),\n new vn(\"EPSG:4326\", \"neu\"),\n new vn(\"urn:ogc:def:crs:OGC:1.3:CRS84\"),\n new vn(\"urn:ogc:def:crs:OGC:2:84\"),\n new vn(\"http://www.opengis.net/def/crs/OGC/1.3/CRS84\"),\n new vn(\"http://www.opengis.net/gml/srs/epsg.xml#4326\", \"neu\"),\n new vn(\"http://www.opengis.net/def/crs/EPSG/0/4326\", \"neu\")\n];\nlet Iu = {};\nfunction Sw(n) {\n return Iu[n] || Iu[n.replace(/urn:(x-)?ogc:def:crs:EPSG:(.*:)?(\\w+)$/, \"EPSG:$3\")] || null;\n}\nfunction yw(n, e) {\n Iu[n] = e;\n}\nlet Sa = {};\nfunction pc(n, e, t) {\n const i = n.getCode(), r = e.getCode();\n i in Sa || (Sa[i] = {}), Sa[i][r] = t;\n}\nfunction Iw(n, e) {\n let t;\n return n in Sa && e in Sa[n] && (t = Sa[n][e]), t;\n}\nfunction bw(n, e) {\n return n[0] += +e[0], n[1] += +e[1], n;\n}\nfunction gc(n, e) {\n let t = !0;\n for (let i = n.length - 1; i >= 0; --i)\n if (n[i] != e[i]) {\n t = !1;\n break;\n }\n return t;\n}\nfunction qf(n, e) {\n const t = Math.cos(e), i = Math.sin(e), r = n[0] * t - n[1] * i, s = n[1] * t + n[0] * i;\n return n[0] = r, n[1] = s, n;\n}\nfunction Aw(n, e) {\n return n[0] *= e, n[1] *= e, n;\n}\nfunction Mw(n, e) {\n if (e.canWrapX()) {\n const t = Ui(e.getExtent()), i = Pw(n, e, t);\n i && (n[0] -= i * t);\n }\n return n;\n}\nfunction Pw(n, e, t) {\n const i = e.getExtent();\n let r = 0;\n return e.canWrapX() && (n[0] < i[0] || n[0] > i[2]) && (t = t || Ui(i), r = Math.floor(\n (n[0] - i[0]) / t\n )), r;\n}\nconst Ow = 63710088e-1;\nfunction Tm(n, e, t) {\n t = t || Ow;\n const i = ql(n[1]), r = ql(e[1]), s = (r - i) / 2, a = ql(e[0] - n[0]) / 2, o = Math.sin(s) * Math.sin(s) + Math.sin(a) * Math.sin(a) * Math.cos(i) * Math.cos(r);\n return 2 * t * Math.atan2(Math.sqrt(o), Math.sqrt(1 - o));\n}\nfunction FE(...n) {\n console.warn(...n);\n}\nlet bu = !0;\nfunction Dw(n) {\n bu = !(n === void 0 ? !0 : n);\n}\nfunction Yf(n, e) {\n if (e !== void 0) {\n for (let t = 0, i = n.length; t < i; ++t)\n e[t] = n[t];\n e = e;\n } else\n e = n.slice();\n return e;\n}\nfunction LE(n, e) {\n if (e !== void 0 && n !== e) {\n for (let t = 0, i = n.length; t < i; ++t)\n e[t] = n[t];\n n = e;\n }\n return n;\n}\nfunction Nw(n) {\n yw(n.getCode(), n), pc(n, n, Yf);\n}\nfunction Fw(n) {\n n.forEach(Nw);\n}\nfunction Fr(n) {\n return typeof n == \"string\" ? Sw(\n /** @type {string} */\n n\n ) : (\n /** @type {Projection} */\n n || null\n );\n}\nfunction xm(n, e, t, i) {\n n = Fr(n);\n let r;\n const s = n.getPointResolutionFunc();\n if (s) {\n if (r = s(e, t), i && i !== n.getUnits()) {\n const a = n.getMetersPerUnit();\n a && (r = r * a / Po[i]);\n }\n } else {\n const a = n.getUnits();\n if (a == \"degrees\" && !i || i == \"degrees\")\n r = e;\n else {\n const o = jf(\n n,\n Fr(\"EPSG:4326\")\n );\n if (o === LE && a !== \"degrees\")\n r = e * n.getMetersPerUnit();\n else {\n let c = [\n t[0] - e / 2,\n t[1],\n t[0] + e / 2,\n t[1],\n t[0],\n t[1] - e / 2,\n t[0],\n t[1] + e / 2\n ];\n c = o(c, c, 2);\n const h = Tm(c.slice(0, 2), c.slice(2, 4)), u = Tm(c.slice(4, 6), c.slice(6, 8));\n r = (h + u) / 2;\n }\n const l = i ? Po[i] : n.getMetersPerUnit();\n l !== void 0 && (r /= l);\n }\n }\n return r;\n}\nfunction Cm(n) {\n Fw(n), n.forEach(function(e) {\n n.forEach(function(t) {\n e !== t && pc(e, t, Yf);\n });\n });\n}\nfunction Lw(n, e, t, i) {\n n.forEach(function(r) {\n e.forEach(function(s) {\n pc(r, s, t), pc(s, r, i);\n });\n });\n}\nfunction Zf(n, e) {\n return n ? typeof n == \"string\" ? Fr(n) : (\n /** @type {Projection} */\n n\n ) : Fr(e);\n}\nfunction aa(n, e) {\n if (n === e)\n return !0;\n const t = n.getUnits() === e.getUnits();\n return (n.getCode() === e.getCode() || jf(n, e) === Yf) && t;\n}\nfunction jf(n, e) {\n const t = n.getCode(), i = e.getCode();\n let r = Iw(t, i);\n return r || (r = LE), r;\n}\nfunction Oo(n, e) {\n const t = Fr(n), i = Fr(e);\n return jf(t, i);\n}\nfunction Qf(n, e, t) {\n return Oo(e, t)(n, void 0, n.length);\n}\nfunction wE(n, e, t, i) {\n const r = Oo(e, t);\n return nw(n, r, void 0, i);\n}\nlet ms = null;\nfunction ww(n) {\n ms = Fr(n);\n}\nfunction Uw() {\n return ms;\n}\nfunction Vw() {\n ww(\"EPSG:4326\");\n}\nfunction Au(n, e) {\n return ms ? Qf(n, e, ms) : n;\n}\nfunction Ps(n, e) {\n return ms ? Qf(n, ms, e) : (bu && !gc(n, [0, 0]) && n[0] >= -180 && n[0] <= 180 && n[1] >= -90 && n[1] <= 90 && (bu = !1, FE(\n \"Call useGeographic() from ol/proj once to work with [longitude, latitude] coordinates.\"\n )), n);\n}\nfunction Bw(n, e) {\n return ms ? wE(n, e, ms) : n;\n}\nfunction ha(n, e) {\n return ms ? wE(n, ms, e) : n;\n}\nfunction kw() {\n Cm(_m), Cm(vm), Lw(\n vm,\n _m,\n Tw,\n xw\n );\n}\nkw();\nfunction Rm(n, e, t) {\n return (\n /**\n * @param {import(\"./coordinate.js\").Coordinate|undefined} center Center.\n * @param {number|undefined} resolution Resolution.\n * @param {import(\"./size.js\").Size} size Viewport size; unused if `onlyCenter` was specified.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @param {Array} [centerShift] Shift between map center and viewport center.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center.\n */\n function(i, r, s, a, o) {\n if (!i)\n return;\n if (!r && !e)\n return i;\n const l = e ? 0 : s[0] * r, c = e ? 0 : s[1] * r, h = o ? o[0] : 0, u = o ? o[1] : 0;\n let f = n[0] + l / 2 + h, d = n[2] - l / 2 + h, p = n[1] + c / 2 + u, g = n[3] - c / 2 + u;\n f > d && (f = (d + f) / 2, d = f), p > g && (p = (g + p) / 2, g = p);\n let m = Vi(i[0], f, d), v = Vi(i[1], p, g);\n if (a && t && r) {\n const E = 30 * r;\n m += -E * Math.log(1 + Math.max(0, f - i[0]) / E) + E * Math.log(1 + Math.max(0, i[0] - d) / E), v += -E * Math.log(1 + Math.max(0, p - i[1]) / E) + E * Math.log(1 + Math.max(0, i[1] - g) / E);\n }\n return [m, v];\n }\n );\n}\nfunction zw(n) {\n return n;\n}\nfunction Jf(n, e, t, i) {\n const r = Ui(e) / t[0], s = gs(e) / t[1];\n return i ? Math.min(n, Math.max(r, s)) : Math.min(n, Math.min(r, s));\n}\nfunction $f(n, e, t) {\n let i = Math.min(n, e);\n const r = 50;\n return i *= Math.log(1 + r * Math.max(0, n / e - 1)) / r + 1, t && (i = Math.max(i, t), i /= Math.log(1 + r * Math.max(0, t / n - 1)) / r + 1), Vi(i, t / 2, e * 2);\n}\nfunction Ww(n, e, t, i) {\n return e = e !== void 0 ? e : !0, /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import(\"./size.js\").Size} size Viewport size.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function(r, s, a, o) {\n if (r !== void 0) {\n const l = n[0], c = n[n.length - 1], h = t ? Jf(\n l,\n t,\n a,\n i\n ) : l;\n if (o)\n return e ? $f(\n r,\n h,\n c\n ) : Vi(r, c, h);\n const u = Math.min(h, r), f = Math.floor(Gf(n, u, s));\n return n[f] > h && f < n.length - 1 ? n[f + 1] : n[f];\n }\n };\n}\nfunction Gw(n, e, t, i, r, s) {\n return i = i !== void 0 ? i : !0, t = t !== void 0 ? t : 0, /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import(\"./size.js\").Size} size Viewport size.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function(a, o, l, c) {\n if (a !== void 0) {\n const h = r ? Jf(\n e,\n r,\n l,\n s\n ) : e;\n if (c)\n return i ? $f(\n a,\n h,\n t\n ) : Vi(a, t, h);\n const u = 1e-9, f = Math.ceil(\n Math.log(e / h) / Math.log(n) - u\n ), d = -o * (0.5 - u) + 0.5, p = Math.min(h, a), g = Math.floor(\n Math.log(e / p) / Math.log(n) + d\n ), m = Math.max(f, g), v = e / Math.pow(n, m);\n return Vi(v, t, h);\n }\n };\n}\nfunction Sm(n, e, t, i, r) {\n return t = t !== void 0 ? t : !0, /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import(\"./size.js\").Size} size Viewport size.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function(s, a, o, l) {\n if (s !== void 0) {\n const c = i ? Jf(\n n,\n i,\n o,\n r\n ) : n;\n return !t || !l ? Vi(s, e, c) : $f(\n s,\n c,\n e\n );\n }\n };\n}\nfunction ed(n) {\n if (n !== void 0)\n return 0;\n}\nfunction ym(n) {\n if (n !== void 0)\n return n;\n}\nfunction Xw(n) {\n const e = 2 * Math.PI / n;\n return (\n /**\n * @param {number|undefined} rotation Rotation.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Rotation.\n */\n function(t, i) {\n if (i)\n return t;\n if (t !== void 0)\n return t = Math.floor(t / e + 0.5) * e, t;\n }\n );\n}\nfunction Hw(n) {\n return n = n || ql(5), /**\n * @param {number|undefined} rotation Rotation.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Rotation.\n */\n function(e, t) {\n if (t)\n return e;\n if (e !== void 0)\n return Math.abs(e) <= n ? 0 : e;\n };\n}\nfunction UE(n) {\n return Math.pow(n, 3);\n}\nfunction Ka(n) {\n return 1 - UE(1 - n);\n}\nfunction Kw(n) {\n return 3 * n * n - 2 * n * n * n;\n}\nfunction qw(n) {\n return n;\n}\nfunction Yw(n, e, t, i, r, s) {\n s = s || [];\n let a = 0;\n for (let o = e; o < t; o += i) {\n const l = n[o], c = n[o + 1];\n s[a++] = r[0] * l + r[2] * c + r[4], s[a++] = r[1] * l + r[3] * c + r[5];\n }\n return s && s.length != a && (s.length = a), s;\n}\nfunction Zw(n, e, t, i, r, s, a) {\n a = a || [];\n const o = Math.cos(r), l = Math.sin(r), c = s[0], h = s[1];\n let u = 0;\n for (let f = e; f < t; f += i) {\n const d = n[f] - c, p = n[f + 1] - h;\n a[u++] = c + d * o - p * l, a[u++] = h + d * l + p * o;\n for (let g = f + 2; g < f + i; ++g)\n a[u++] = n[g];\n }\n return a && a.length != u && (a.length = u), a;\n}\nfunction jw(n, e, t, i, r, s, a, o) {\n o = o || [];\n const l = a[0], c = a[1];\n let h = 0;\n for (let u = e; u < t; u += i) {\n const f = n[u] - l, d = n[u + 1] - c;\n o[h++] = l + r * f, o[h++] = c + s * d;\n for (let p = u + 2; p < u + i; ++p)\n o[h++] = n[p];\n }\n return o && o.length != h && (o.length = h), o;\n}\nfunction Qw(n, e, t, i, r, s, a) {\n a = a || [];\n let o = 0;\n for (let l = e; l < t; l += i) {\n a[o++] = n[l] + r, a[o++] = n[l + 1] + s;\n for (let c = l + 2; c < l + i; ++c)\n a[o++] = n[c];\n }\n return a && a.length != o && (a.length = o), a;\n}\nconst Im = xa();\nclass Jw extends Ws {\n constructor() {\n super(), this.extent_ = Vn(), this.extentRevision_ = -1, this.simplifiedGeometryMaxMinSquaredTolerance = 0, this.simplifiedGeometryRevision = 0, this.simplifyTransformedInternal = V2(function(e, t, i) {\n if (!i)\n return this.getSimplifiedGeometry(t);\n const r = this.clone();\n return r.applyTransform(i), r.getSimplifiedGeometry(t);\n });\n }\n /**\n * Get a transformed and simplified version of the geometry.\n * @abstract\n * @param {number} squaredTolerance Squared tolerance.\n * @param {import(\"../proj.js\").TransformFunction} [transform] Optional transform function.\n * @return {Geometry} Simplified geometry.\n */\n simplifyTransformed(e, t) {\n return this.simplifyTransformedInternal(\n this.getRevision(),\n e,\n t\n );\n }\n /**\n * Make a complete copy of the geometry.\n * @abstract\n * @return {!Geometry} Clone.\n */\n clone() {\n return di();\n }\n /**\n * @abstract\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(e, t, i, r) {\n return di();\n }\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\n containsXY(e, t) {\n const i = this.getClosestPoint([e, t]);\n return i[0] === e && i[1] === t;\n }\n /**\n * Return the closest point of the geometry to the passed point as\n * {@link module:ol/coordinate~Coordinate coordinate}.\n * @param {import(\"../coordinate.js\").Coordinate} point Point.\n * @param {import(\"../coordinate.js\").Coordinate} [closestPoint] Closest point.\n * @return {import(\"../coordinate.js\").Coordinate} Closest point.\n * @api\n */\n getClosestPoint(e, t) {\n return t = t || [NaN, NaN], this.closestPointXY(e[0], e[1], t, 1 / 0), t;\n }\n /**\n * Returns true if this geometry includes the specified coordinate. If the\n * coordinate is on the boundary of the geometry, returns false.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @return {boolean} Contains coordinate.\n * @api\n */\n intersectsCoordinate(e) {\n return this.containsXY(e[0], e[1]);\n }\n /**\n * @abstract\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @protected\n * @return {import(\"../extent.js\").Extent} extent Extent.\n */\n computeExtent(e) {\n return di();\n }\n /**\n * Get the extent of the geometry.\n * @param {import(\"../extent.js\").Extent} [extent] Extent.\n * @return {import(\"../extent.js\").Extent} extent Extent.\n * @api\n */\n getExtent(e) {\n if (this.extentRevision_ != this.getRevision()) {\n const t = this.computeExtent(this.extent_);\n (isNaN(t[0]) || isNaN(t[1])) && Qo(t), this.extentRevision_ = this.getRevision();\n }\n return rw(this.extent_, e);\n }\n /**\n * Rotate the geometry around a given coordinate. This modifies the geometry\n * coordinates in place.\n * @abstract\n * @param {number} angle Rotation angle in radians.\n * @param {import(\"../coordinate.js\").Coordinate} anchor The rotation center.\n * @api\n */\n rotate(e, t) {\n di();\n }\n /**\n * Scale the geometry (with an optional origin). This modifies the geometry\n * coordinates in place.\n * @abstract\n * @param {number} sx The scaling factor in the x-direction.\n * @param {number} [sy] The scaling factor in the y-direction (defaults to sx).\n * @param {import(\"../coordinate.js\").Coordinate} [anchor] The scale origin (defaults to the center\n * of the geometry extent).\n * @api\n */\n scale(e, t, i) {\n di();\n }\n /**\n * Create a simplified version of this geometry. For linestrings, this uses\n * the [Douglas Peucker](https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm)\n * algorithm. For polygons, a quantization-based\n * simplification is used to preserve topology.\n * @param {number} tolerance The tolerance distance for simplification.\n * @return {Geometry} A new, simplified version of the original geometry.\n * @api\n */\n simplify(e) {\n return this.getSimplifiedGeometry(e * e);\n }\n /**\n * Create a simplified version of this geometry using the Douglas Peucker\n * algorithm.\n * See https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm.\n * @abstract\n * @param {number} squaredTolerance Squared tolerance.\n * @return {Geometry} Simplified geometry.\n */\n getSimplifiedGeometry(e) {\n return di();\n }\n /**\n * Get the type of this geometry.\n * @abstract\n * @return {Type} Geometry type.\n */\n getType() {\n return di();\n }\n /**\n * Apply a transform function to the coordinates of the geometry.\n * The geometry is modified in place.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n * @abstract\n * @param {import(\"../proj.js\").TransformFunction} transformFn Transform function.\n * Called with a flat array of geometry coordinates.\n */\n applyTransform(e) {\n di();\n }\n /**\n * Test if the geometry and the passed extent intersect.\n * @abstract\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n */\n intersectsExtent(e) {\n return di();\n }\n /**\n * Translate the geometry. This modifies the geometry coordinates in place. If\n * instead you want a new geometry, first `clone()` this geometry.\n * @abstract\n * @param {number} deltaX Delta X.\n * @param {number} deltaY Delta Y.\n * @api\n */\n translate(e, t) {\n di();\n }\n /**\n * Transform each coordinate of the geometry from one coordinate reference\n * system to another. The geometry is modified in place.\n * For example, a line will be transformed to a line and a circle to a circle.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n *\n * @param {import(\"../proj.js\").ProjectionLike} source The current projection. Can be a\n * string identifier or a {@link module:ol/proj/Projection~Projection} object.\n * @param {import(\"../proj.js\").ProjectionLike} destination The desired projection. Can be a\n * string identifier or a {@link module:ol/proj/Projection~Projection} object.\n * @return {Geometry} This geometry. Note that original geometry is\n * modified in place.\n * @api\n */\n transform(e, t) {\n const i = Fr(e), r = i.getUnits() == \"tile-pixels\" ? function(s, a, o) {\n const l = i.getExtent(), c = i.getWorldExtent(), h = gs(c) / gs(l);\n return Ao(\n Im,\n c[0],\n c[3],\n h,\n -h,\n 0,\n 0,\n 0\n ), Yw(\n s,\n 0,\n s.length,\n o,\n Im,\n a\n ), Oo(i, t)(\n s,\n a,\n o\n );\n } : Oo(i, t);\n return this.applyTransform(r), this;\n }\n}\nclass td extends Jw {\n constructor() {\n super(), this.layout = \"XY\", this.stride = 2, this.flatCoordinates = null;\n }\n /**\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @protected\n * @return {import(\"../extent.js\").Extent} extent Extent.\n */\n computeExtent(e) {\n return $2(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n e\n );\n }\n /**\n * @abstract\n * @return {Array<*> | null} Coordinates.\n */\n getCoordinates() {\n return di();\n }\n /**\n * Return the first coordinate of the geometry.\n * @return {import(\"../coordinate.js\").Coordinate} First coordinate.\n * @api\n */\n getFirstCoordinate() {\n return this.flatCoordinates.slice(0, this.stride);\n }\n /**\n * @return {Array} Flat coordinates.\n */\n getFlatCoordinates() {\n return this.flatCoordinates;\n }\n /**\n * Return the last coordinate of the geometry.\n * @return {import(\"../coordinate.js\").Coordinate} Last point.\n * @api\n */\n getLastCoordinate() {\n return this.flatCoordinates.slice(\n this.flatCoordinates.length - this.stride\n );\n }\n /**\n * Return the {@link import(\"./Geometry.js\").GeometryLayout layout} of the geometry.\n * @return {import(\"./Geometry.js\").GeometryLayout} Layout.\n * @api\n */\n getLayout() {\n return this.layout;\n }\n /**\n * Create a simplified version of this geometry using the Douglas Peucker algorithm.\n * @param {number} squaredTolerance Squared tolerance.\n * @return {SimpleGeometry} Simplified geometry.\n */\n getSimplifiedGeometry(e) {\n if (this.simplifiedGeometryRevision !== this.getRevision() && (this.simplifiedGeometryMaxMinSquaredTolerance = 0, this.simplifiedGeometryRevision = this.getRevision()), e < 0 || this.simplifiedGeometryMaxMinSquaredTolerance !== 0 && e <= this.simplifiedGeometryMaxMinSquaredTolerance)\n return this;\n const t = this.getSimplifiedGeometryInternal(e);\n return t.getFlatCoordinates().length < this.flatCoordinates.length ? t : (this.simplifiedGeometryMaxMinSquaredTolerance = e, this);\n }\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {SimpleGeometry} Simplified geometry.\n * @protected\n */\n getSimplifiedGeometryInternal(e) {\n return this;\n }\n /**\n * @return {number} Stride.\n */\n getStride() {\n return this.stride;\n }\n /**\n * @param {import(\"./Geometry.js\").GeometryLayout} layout Layout.\n * @param {Array} flatCoordinates Flat coordinates.\n */\n setFlatCoordinates(e, t) {\n this.stride = bm(e), this.layout = e, this.flatCoordinates = t;\n }\n /**\n * @abstract\n * @param {!Array<*>} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n */\n setCoordinates(e, t) {\n di();\n }\n /**\n * @param {import(\"./Geometry.js\").GeometryLayout|undefined} layout Layout.\n * @param {Array<*>} coordinates Coordinates.\n * @param {number} nesting Nesting.\n * @protected\n */\n setLayout(e, t, i) {\n let r;\n if (e)\n r = bm(e);\n else {\n for (let s = 0; s < i; ++s) {\n if (t.length === 0) {\n this.layout = \"XY\", this.stride = 2;\n return;\n }\n t = /** @type {Array} */\n t[0];\n }\n r = t.length, e = $w(r);\n }\n this.layout = e, this.stride = r;\n }\n /**\n * Apply a transform function to the coordinates of the geometry.\n * The geometry is modified in place.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n * @param {import(\"../proj.js\").TransformFunction} transformFn Transform function.\n * Called with a flat array of geometry coordinates.\n * @api\n */\n applyTransform(e) {\n this.flatCoordinates && (e(this.flatCoordinates, this.flatCoordinates, this.stride), this.changed());\n }\n /**\n * Rotate the geometry around a given coordinate. This modifies the geometry\n * coordinates in place.\n * @param {number} angle Rotation angle in counter-clockwise radians.\n * @param {import(\"../coordinate.js\").Coordinate} anchor The rotation center.\n * @api\n */\n rotate(e, t) {\n const i = this.getFlatCoordinates();\n if (i) {\n const r = this.getStride();\n Zw(\n i,\n 0,\n i.length,\n r,\n e,\n t,\n i\n ), this.changed();\n }\n }\n /**\n * Scale the geometry (with an optional origin). This modifies the geometry\n * coordinates in place.\n * @param {number} sx The scaling factor in the x-direction.\n * @param {number} [sy] The scaling factor in the y-direction (defaults to sx).\n * @param {import(\"../coordinate.js\").Coordinate} [anchor] The scale origin (defaults to the center\n * of the geometry extent).\n * @api\n */\n scale(e, t, i) {\n t === void 0 && (t = e), i || (i = Mo(this.getExtent()));\n const r = this.getFlatCoordinates();\n if (r) {\n const s = this.getStride();\n jw(\n r,\n 0,\n r.length,\n s,\n e,\n t,\n i,\n r\n ), this.changed();\n }\n }\n /**\n * Translate the geometry. This modifies the geometry coordinates in place. If\n * instead you want a new geometry, first `clone()` this geometry.\n * @param {number} deltaX Delta X.\n * @param {number} deltaY Delta Y.\n * @api\n */\n translate(e, t) {\n const i = this.getFlatCoordinates();\n if (i) {\n const r = this.getStride();\n Qw(\n i,\n 0,\n i.length,\n r,\n e,\n t,\n i\n ), this.changed();\n }\n }\n}\nfunction $w(n) {\n let e;\n return n == 2 ? e = \"XY\" : n == 3 ? e = \"XYZ\" : n == 4 && (e = \"XYZM\"), /** @type {import(\"./Geometry.js\").GeometryLayout} */\n e;\n}\nfunction bm(n) {\n let e;\n return n == \"XY\" ? e = 2 : n == \"XYZ\" || n == \"XYM\" ? e = 3 : n == \"XYZM\" && (e = 4), /** @type {number} */\n e;\n}\nfunction Am(n, e, t, i, r, s, a) {\n const o = n[e], l = n[e + 1], c = n[t] - o, h = n[t + 1] - l;\n let u;\n if (c === 0 && h === 0)\n u = e;\n else {\n const f = ((r - o) * c + (s - l) * h) / (c * c + h * h);\n if (f > 1)\n u = t;\n else if (f > 0) {\n for (let d = 0; d < i; ++d)\n a[d] = lw(\n n[e + d],\n n[t + d],\n f\n );\n a.length = i;\n return;\n } else\n u = e;\n }\n for (let f = 0; f < i; ++f)\n a[f] = n[u + f];\n a.length = i;\n}\nfunction VE(n, e, t, i, r) {\n let s = n[e], a = n[e + 1];\n for (e += i; e < t; e += i) {\n const o = n[e], l = n[e + 1], c = Ca(s, a, o, l);\n c > r && (r = c), s = o, a = l;\n }\n return r;\n}\nfunction eU(n, e, t, i, r) {\n for (let s = 0, a = t.length; s < a; ++s) {\n const o = t[s];\n r = VE(n, e, o, i, r), e = o;\n }\n return r;\n}\nfunction BE(n, e, t, i, r, s, a, o, l, c, h) {\n if (e == t)\n return c;\n let u, f;\n if (r === 0) {\n if (f = Ca(\n a,\n o,\n n[e],\n n[e + 1]\n ), f < c) {\n for (u = 0; u < i; ++u)\n l[u] = n[e + u];\n return l.length = i, f;\n }\n return c;\n }\n h = h || [NaN, NaN];\n let d = e + i;\n for (; d < t; )\n if (Am(\n n,\n d - i,\n d,\n i,\n a,\n o,\n h\n ), f = Ca(a, o, h[0], h[1]), f < c) {\n for (c = f, u = 0; u < i; ++u)\n l[u] = h[u];\n l.length = i, d += i;\n } else\n d += i * Math.max(\n (Math.sqrt(f) - Math.sqrt(c)) / r | 0,\n 1\n );\n if (s && (Am(\n n,\n t - i,\n e,\n i,\n a,\n o,\n h\n ), f = Ca(a, o, h[0], h[1]), f < c)) {\n for (c = f, u = 0; u < i; ++u)\n l[u] = h[u];\n l.length = i;\n }\n return c;\n}\nfunction tU(n, e, t, i, r, s, a, o, l, c, h) {\n h = h || [NaN, NaN];\n for (let u = 0, f = t.length; u < f; ++u) {\n const d = t[u];\n c = BE(\n n,\n e,\n d,\n i,\n r,\n s,\n a,\n o,\n l,\n c,\n h\n ), e = d;\n }\n return c;\n}\nfunction iU(n, e, t, i) {\n for (let r = 0, s = t.length; r < s; ++r)\n n[e++] = t[r];\n return e;\n}\nfunction kE(n, e, t, i) {\n for (let r = 0, s = t.length; r < s; ++r) {\n const a = t[r];\n for (let o = 0; o < i; ++o)\n n[e++] = a[o];\n }\n return e;\n}\nfunction rU(n, e, t, i, r) {\n r = r || [];\n let s = 0;\n for (let a = 0, o = t.length; a < o; ++a) {\n const l = kE(\n n,\n e,\n t[a],\n i\n );\n r[s++] = l, e = l;\n }\n return r.length = s, r;\n}\nfunction sU(n, e, t, i, r, s, a) {\n const o = (t - e) / i;\n if (o < 3) {\n for (; e < t; e += i)\n s[a++] = n[e], s[a++] = n[e + 1];\n return a;\n }\n const l = new Array(o);\n l[0] = 1, l[o - 1] = 1;\n const c = [e, t - i];\n let h = 0;\n for (; c.length > 0; ) {\n const u = c.pop(), f = c.pop();\n let d = 0;\n const p = n[f], g = n[f + 1], m = n[u], v = n[u + 1];\n for (let E = f + i; E < u; E += i) {\n const C = n[E], T = n[E + 1], R = aw(C, T, p, g, m, v);\n R > d && (h = E, d = R);\n }\n d > r && (l[(h - e) / i] = 1, f + i < h && c.push(f, h), h + i < u && c.push(h, u));\n }\n for (let u = 0; u < o; ++u)\n l[u] && (s[a++] = n[e + u * i], s[a++] = n[e + u * i + 1]);\n return a;\n}\nfunction ta(n, e) {\n return e * Math.round(n / e);\n}\nfunction nU(n, e, t, i, r, s, a) {\n if (e == t)\n return a;\n let o = ta(n[e], r), l = ta(n[e + 1], r);\n e += i, s[a++] = o, s[a++] = l;\n let c, h;\n do\n if (c = ta(n[e], r), h = ta(n[e + 1], r), e += i, e == t)\n return s[a++] = c, s[a++] = h, a;\n while (c == o && h == l);\n for (; e < t; ) {\n const u = ta(n[e], r), f = ta(n[e + 1], r);\n if (e += i, u == c && f == h)\n continue;\n const d = c - o, p = h - l, g = u - o, m = f - l;\n if (d * m == p * g && (d < 0 && g < d || d == g || d > 0 && g > d) && (p < 0 && m < p || p == m || p > 0 && m > p)) {\n c = u, h = f;\n continue;\n }\n s[a++] = c, s[a++] = h, o = c, l = h, c = u, h = f;\n }\n return s[a++] = c, s[a++] = h, a;\n}\nfunction aU(n, e, t, i, r, s, a, o) {\n for (let l = 0, c = t.length; l < c; ++l) {\n const h = t[l];\n a = nU(\n n,\n e,\n h,\n i,\n r,\n s,\n a\n ), o.push(a), e = h;\n }\n return a;\n}\nfunction zE(n, e, t, i, r) {\n r = r !== void 0 ? r : [];\n let s = 0;\n for (let a = e; a < t; a += i)\n r[s++] = n.slice(a, a + i);\n return r.length = s, r;\n}\nfunction oU(n, e, t, i, r) {\n r = r !== void 0 ? r : [];\n let s = 0;\n for (let a = 0, o = t.length; a < o; ++a) {\n const l = t[a];\n r[s++] = zE(\n n,\n e,\n l,\n i,\n r[s]\n ), e = l;\n }\n return r.length = s, r;\n}\nfunction WE(n, e, t, i) {\n let r = 0, s = n[t - i], a = n[t - i + 1];\n for (; e < t; e += i) {\n const o = n[e], l = n[e + 1];\n r += a * o - s * l, s = o, a = l;\n }\n return r / 2;\n}\nfunction lU(n, e, t, i) {\n let r = 0;\n for (let s = 0, a = t.length; s < a; ++s) {\n const o = t[s];\n r += WE(n, e, o, i), e = o;\n }\n return r;\n}\nclass Do extends td {\n /**\n * @param {Array|Array} coordinates Coordinates.\n * For internal use, flat coordinates in combination with `layout` are also accepted.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n */\n constructor(e, t) {\n super(), this.maxDelta_ = -1, this.maxDeltaRevision_ = -1, t !== void 0 && !Array.isArray(e[0]) ? this.setFlatCoordinates(\n t,\n /** @type {Array} */\n e\n ) : this.setCoordinates(\n /** @type {Array} */\n e,\n t\n );\n }\n /**\n * Make a complete copy of the geometry.\n * @return {!LinearRing} Clone.\n * @api\n */\n clone() {\n return new Do(this.flatCoordinates.slice(), this.layout);\n }\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(e, t, i, r) {\n return r < IE(this.getExtent(), e, t) ? r : (this.maxDeltaRevision_ != this.getRevision() && (this.maxDelta_ = Math.sqrt(\n VE(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n 0\n )\n ), this.maxDeltaRevision_ = this.getRevision()), BE(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n this.maxDelta_,\n !0,\n e,\n t,\n i,\n r\n ));\n }\n /**\n * Return the area of the linear ring on projected plane.\n * @return {number} Area (on projected plane).\n * @api\n */\n getArea() {\n return WE(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride\n );\n }\n /**\n * Return the coordinates of the linear ring.\n * @return {Array} Coordinates.\n * @api\n */\n getCoordinates() {\n return zE(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride\n );\n }\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {LinearRing} Simplified LinearRing.\n * @protected\n */\n getSimplifiedGeometryInternal(e) {\n const t = [];\n return t.length = sU(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n e,\n t,\n 0\n ), new Do(t, \"XY\");\n }\n /**\n * Get the type of this geometry.\n * @return {import(\"./Geometry.js\").Type} Geometry type.\n * @api\n */\n getType() {\n return \"LinearRing\";\n }\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n */\n intersectsExtent(e) {\n return !1;\n }\n /**\n * Set the coordinates of the linear ring.\n * @param {!Array} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @api\n */\n setCoordinates(e, t) {\n this.setLayout(t, e, 1), this.flatCoordinates || (this.flatCoordinates = []), this.flatCoordinates.length = kE(\n this.flatCoordinates,\n 0,\n e,\n this.stride\n ), this.changed();\n }\n}\nclass id extends td {\n /**\n * @param {import(\"../coordinate.js\").Coordinate} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n */\n constructor(e, t) {\n super(), this.setCoordinates(e, t);\n }\n /**\n * Make a complete copy of the geometry.\n * @return {!Point} Clone.\n * @api\n */\n clone() {\n const e = new id(this.flatCoordinates.slice(), this.layout);\n return e.applyProperties(this), e;\n }\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(e, t, i, r) {\n const s = this.flatCoordinates, a = Ca(\n e,\n t,\n s[0],\n s[1]\n );\n if (a < r) {\n const o = this.stride;\n for (let l = 0; l < o; ++l)\n i[l] = s[l];\n return i.length = o, a;\n }\n return r;\n }\n /**\n * Return the coordinate of the point.\n * @return {import(\"../coordinate.js\").Coordinate} Coordinates.\n * @api\n */\n getCoordinates() {\n return this.flatCoordinates ? this.flatCoordinates.slice() : [];\n }\n /**\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @protected\n * @return {import(\"../extent.js\").Extent} extent Extent.\n */\n computeExtent(e) {\n return J2(this.flatCoordinates, e);\n }\n /**\n * Get the type of this geometry.\n * @return {import(\"./Geometry.js\").Type} Geometry type.\n * @api\n */\n getType() {\n return \"Point\";\n }\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n */\n intersectsExtent(e) {\n return bE(e, this.flatCoordinates[0], this.flatCoordinates[1]);\n }\n /**\n * @param {!Array<*>} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @api\n */\n setCoordinates(e, t) {\n this.setLayout(t, e, 0), this.flatCoordinates || (this.flatCoordinates = []), this.flatCoordinates.length = iU(\n this.flatCoordinates,\n 0,\n e,\n this.stride\n ), this.changed();\n }\n}\nfunction cU(n, e, t, i, r) {\n return !ME(\n r,\n /**\n * @param {import(\"../../coordinate.js\").Coordinate} coordinate Coordinate.\n * @return {boolean} Contains (x, y).\n */\n function(a) {\n return !In(\n n,\n e,\n t,\n i,\n a[0],\n a[1]\n );\n }\n );\n}\nfunction In(n, e, t, i, r, s) {\n let a = 0, o = n[t - i], l = n[t - i + 1];\n for (; e < t; e += i) {\n const c = n[e], h = n[e + 1];\n l <= s ? h > s && (c - o) * (s - l) - (r - o) * (h - l) > 0 && a++ : h <= s && (c - o) * (s - l) - (r - o) * (h - l) < 0 && a--, o = c, l = h;\n }\n return a !== 0;\n}\nfunction GE(n, e, t, i, r, s) {\n if (t.length === 0 || !In(n, e, t[0], i, r, s))\n return !1;\n for (let a = 1, o = t.length; a < o; ++a)\n if (In(n, t[a - 1], t[a], i, r, s))\n return !1;\n return !0;\n}\nfunction hU(n, e, t, i, r, s, a) {\n let o, l, c, h, u, f, d;\n const p = r[s + 1], g = [];\n for (let E = 0, C = t.length; E < C; ++E) {\n const T = t[E];\n for (h = n[T - i], f = n[T - i + 1], o = e; o < T; o += i)\n u = n[o], d = n[o + 1], (p <= f && d <= p || f <= p && p <= d) && (c = (p - f) / (d - f) * (u - h) + h, g.push(c)), h = u, f = d;\n }\n let m = NaN, v = -1 / 0;\n for (g.sort(Wf), h = g[0], o = 1, l = g.length; o < l; ++o) {\n u = g[o];\n const E = Math.abs(u - h);\n E > v && (c = (h + u) / 2, GE(n, e, t, i, c, p) && (m = c, v = E)), h = u;\n }\n return isNaN(m) && (m = r[s]), a ? (a.push(m, p, v), a) : [m, p, v];\n}\nfunction uU(n, e, t, i, r) {\n let s;\n for (e += i; e < t; e += i)\n if (s = r(\n n.slice(e - i, e),\n n.slice(e, e + i)\n ), s)\n return s;\n return !1;\n}\nfunction XE(n, e, t, i, r) {\n const s = AE(\n Vn(),\n n,\n e,\n t,\n i\n );\n return Jo(r, s) ? Q2(r, s) || s[0] >= r[0] && s[2] <= r[2] || s[1] >= r[1] && s[3] <= r[3] ? !0 : uU(\n n,\n e,\n t,\n i,\n /**\n * @param {import(\"../../coordinate.js\").Coordinate} point1 Start point.\n * @param {import(\"../../coordinate.js\").Coordinate} point2 End point.\n * @return {boolean} `true` if the segment and the extent intersect,\n * `false` otherwise.\n */\n function(a, o) {\n return sw(r, a, o);\n }\n ) : !1;\n}\nfunction HE(n, e, t, i, r) {\n return !!(XE(n, e, t, i, r) || In(\n n,\n e,\n t,\n i,\n r[0],\n r[1]\n ) || In(\n n,\n e,\n t,\n i,\n r[0],\n r[3]\n ) || In(\n n,\n e,\n t,\n i,\n r[2],\n r[1]\n ) || In(\n n,\n e,\n t,\n i,\n r[2],\n r[3]\n ));\n}\nfunction fU(n, e, t, i, r) {\n if (!HE(n, e, t[0], i, r))\n return !1;\n if (t.length === 1)\n return !0;\n for (let s = 1, a = t.length; s < a; ++s)\n if (cU(\n n,\n t[s - 1],\n t[s],\n i,\n r\n ) && !XE(\n n,\n t[s - 1],\n t[s],\n i,\n r\n ))\n return !1;\n return !0;\n}\nfunction dU(n, e, t, i) {\n for (; e < t - i; ) {\n for (let r = 0; r < i; ++r) {\n const s = n[e + r];\n n[e + r] = n[t - i + r], n[t - i + r] = s;\n }\n e += i, t -= i;\n }\n}\nfunction KE(n, e, t, i) {\n let r = 0, s = n[t - i], a = n[t - i + 1];\n for (; e < t; e += i) {\n const o = n[e], l = n[e + 1];\n r += (o - s) * (l + a), s = o, a = l;\n }\n return r === 0 ? void 0 : r > 0;\n}\nfunction pU(n, e, t, i, r) {\n r = r !== void 0 ? r : !1;\n for (let s = 0, a = t.length; s < a; ++s) {\n const o = t[s], l = KE(\n n,\n e,\n o,\n i\n );\n if (s === 0) {\n if (r && l || !r && !l)\n return !1;\n } else if (r && !l || !r && l)\n return !1;\n e = o;\n }\n return !0;\n}\nfunction Mm(n, e, t, i, r) {\n r = r !== void 0 ? r : !1;\n for (let s = 0, a = t.length; s < a; ++s) {\n const o = t[s], l = KE(\n n,\n e,\n o,\n i\n );\n (s === 0 ? r && l || !r && !l : r && !l || !r && l) && dU(n, e, o, i), e = o;\n }\n return e;\n}\nclass No extends td {\n /**\n * @param {!Array>|!Array} coordinates\n * Array of linear rings that define the polygon. The first linear ring of the\n * array defines the outer-boundary or surface of the polygon. Each subsequent\n * linear ring defines a hole in the surface of the polygon. A linear ring is\n * an array of vertices' coordinates where the first coordinate and the last are\n * equivalent. (For internal use, flat coordinates in combination with\n * `layout` and `ends` are also accepted.)\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @param {Array} [ends] Ends (for internal use with flat coordinates).\n */\n constructor(e, t, i) {\n super(), this.ends_ = [], this.flatInteriorPointRevision_ = -1, this.flatInteriorPoint_ = null, this.maxDelta_ = -1, this.maxDeltaRevision_ = -1, this.orientedRevision_ = -1, this.orientedFlatCoordinates_ = null, t !== void 0 && i ? (this.setFlatCoordinates(\n t,\n /** @type {Array} */\n e\n ), this.ends_ = i) : this.setCoordinates(\n /** @type {Array>} */\n e,\n t\n );\n }\n /**\n * Append the passed linear ring to this polygon.\n * @param {LinearRing} linearRing Linear ring.\n * @api\n */\n appendLinearRing(e) {\n this.flatCoordinates ? w2(this.flatCoordinates, e.getFlatCoordinates()) : this.flatCoordinates = e.getFlatCoordinates().slice(), this.ends_.push(this.flatCoordinates.length), this.changed();\n }\n /**\n * Make a complete copy of the geometry.\n * @return {!Polygon} Clone.\n * @api\n */\n clone() {\n const e = new No(\n this.flatCoordinates.slice(),\n this.layout,\n this.ends_.slice()\n );\n return e.applyProperties(this), e;\n }\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(e, t, i, r) {\n return r < IE(this.getExtent(), e, t) ? r : (this.maxDeltaRevision_ != this.getRevision() && (this.maxDelta_ = Math.sqrt(\n eU(\n this.flatCoordinates,\n 0,\n this.ends_,\n this.stride,\n 0\n )\n ), this.maxDeltaRevision_ = this.getRevision()), tU(\n this.flatCoordinates,\n 0,\n this.ends_,\n this.stride,\n this.maxDelta_,\n !0,\n e,\n t,\n i,\n r\n ));\n }\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\n containsXY(e, t) {\n return GE(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride,\n e,\n t\n );\n }\n /**\n * Return the area of the polygon on projected plane.\n * @return {number} Area (on projected plane).\n * @api\n */\n getArea() {\n return lU(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride\n );\n }\n /**\n * Get the coordinate array for this geometry. This array has the structure\n * of a GeoJSON coordinate array for polygons.\n *\n * @param {boolean} [right] Orient coordinates according to the right-hand\n * rule (counter-clockwise for exterior and clockwise for interior rings).\n * If `false`, coordinates will be oriented according to the left-hand rule\n * (clockwise for exterior and counter-clockwise for interior rings).\n * By default, coordinate orientation will depend on how the geometry was\n * constructed.\n * @return {Array>} Coordinates.\n * @api\n */\n getCoordinates(e) {\n let t;\n return e !== void 0 ? (t = this.getOrientedFlatCoordinates().slice(), Mm(t, 0, this.ends_, this.stride, e)) : t = this.flatCoordinates, oU(t, 0, this.ends_, this.stride);\n }\n /**\n * @return {Array} Ends.\n */\n getEnds() {\n return this.ends_;\n }\n /**\n * @return {Array} Interior point.\n */\n getFlatInteriorPoint() {\n if (this.flatInteriorPointRevision_ != this.getRevision()) {\n const e = Mo(this.getExtent());\n this.flatInteriorPoint_ = hU(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride,\n e,\n 0\n ), this.flatInteriorPointRevision_ = this.getRevision();\n }\n return this.flatInteriorPoint_;\n }\n /**\n * Return an interior point of the polygon.\n * @return {Point} Interior point as XYM coordinate, where M is the\n * length of the horizontal intersection that the point belongs to.\n * @api\n */\n getInteriorPoint() {\n return new id(this.getFlatInteriorPoint(), \"XYM\");\n }\n /**\n * Return the number of rings of the polygon, this includes the exterior\n * ring and any interior rings.\n *\n * @return {number} Number of rings.\n * @api\n */\n getLinearRingCount() {\n return this.ends_.length;\n }\n /**\n * Return the Nth linear ring of the polygon geometry. Return `null` if the\n * given index is out of range.\n * The exterior linear ring is available at index `0` and the interior rings\n * at index `1` and beyond.\n *\n * @param {number} index Index.\n * @return {LinearRing|null} Linear ring.\n * @api\n */\n getLinearRing(e) {\n return e < 0 || this.ends_.length <= e ? null : new Do(\n this.flatCoordinates.slice(\n e === 0 ? 0 : this.ends_[e - 1],\n this.ends_[e]\n ),\n this.layout\n );\n }\n /**\n * Return the linear rings of the polygon.\n * @return {Array} Linear rings.\n * @api\n */\n getLinearRings() {\n const e = this.layout, t = this.flatCoordinates, i = this.ends_, r = [];\n let s = 0;\n for (let a = 0, o = i.length; a < o; ++a) {\n const l = i[a], c = new Do(\n t.slice(s, l),\n e\n );\n r.push(c), s = l;\n }\n return r;\n }\n /**\n * @return {Array} Oriented flat coordinates.\n */\n getOrientedFlatCoordinates() {\n if (this.orientedRevision_ != this.getRevision()) {\n const e = this.flatCoordinates;\n pU(e, 0, this.ends_, this.stride) ? this.orientedFlatCoordinates_ = e : (this.orientedFlatCoordinates_ = e.slice(), this.orientedFlatCoordinates_.length = Mm(\n this.orientedFlatCoordinates_,\n 0,\n this.ends_,\n this.stride\n )), this.orientedRevision_ = this.getRevision();\n }\n return this.orientedFlatCoordinates_;\n }\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {Polygon} Simplified Polygon.\n * @protected\n */\n getSimplifiedGeometryInternal(e) {\n const t = [], i = [];\n return t.length = aU(\n this.flatCoordinates,\n 0,\n this.ends_,\n this.stride,\n Math.sqrt(e),\n t,\n 0,\n i\n ), new No(t, \"XY\", i);\n }\n /**\n * Get the type of this geometry.\n * @return {import(\"./Geometry.js\").Type} Geometry type.\n * @api\n */\n getType() {\n return \"Polygon\";\n }\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n */\n intersectsExtent(e) {\n return fU(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride,\n e\n );\n }\n /**\n * Set the coordinates of the polygon.\n * @param {!Array>} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @api\n */\n setCoordinates(e, t) {\n this.setLayout(t, e, 2), this.flatCoordinates || (this.flatCoordinates = []);\n const i = rU(\n this.flatCoordinates,\n 0,\n e,\n this.stride,\n this.ends_\n );\n this.flatCoordinates.length = i.length === 0 ? 0 : i[i.length - 1], this.changed();\n }\n}\nfunction Pm(n) {\n if ($o(n))\n throw new Error(\"Cannot create polygon from empty extent\");\n const e = n[0], t = n[1], i = n[2], r = n[3], s = [\n e,\n t,\n e,\n r,\n i,\n r,\n i,\n t,\n e,\n t\n ];\n return new No(s, \"XY\", [s.length]);\n}\nconst Jh = 0;\nclass gU extends Ws {\n /**\n * @param {ViewOptions} [options] View options.\n */\n constructor(e) {\n super(), this.on, this.once, this.un, e = Object.assign({}, e), this.hints_ = [0, 0], this.animations_ = [], this.updateAnimationKey_, this.projection_ = Zf(e.projection, \"EPSG:3857\"), this.viewportSize_ = [100, 100], this.targetCenter_ = null, this.targetResolution_, this.targetRotation_, this.nextCenter_ = null, this.nextResolution_, this.nextRotation_, this.cancelAnchor_ = void 0, e.projection && Dw(), e.center && (e.center = Ps(e.center, this.projection_)), e.extent && (e.extent = ha(e.extent, this.projection_)), this.applyOptions_(e);\n }\n /**\n * Set up the view with the given options.\n * @param {ViewOptions} options View options.\n */\n applyOptions_(e) {\n const t = Object.assign({}, e);\n for (const o in Gr)\n delete t[o];\n this.setProperties(t, !0);\n const i = _U(e);\n this.maxResolution_ = i.maxResolution, this.minResolution_ = i.minResolution, this.zoomFactor_ = i.zoomFactor, this.resolutions_ = e.resolutions, this.padding_ = e.padding, this.minZoom_ = i.minZoom;\n const r = mU(e), s = i.constraint, a = EU(e);\n this.constraints_ = {\n center: r,\n resolution: s,\n rotation: a\n }, this.setRotation(e.rotation !== void 0 ? e.rotation : 0), this.setCenterInternal(\n e.center !== void 0 ? e.center : null\n ), e.resolution !== void 0 ? this.setResolution(e.resolution) : e.zoom !== void 0 && this.setZoom(e.zoom);\n }\n /**\n * Padding (in css pixels).\n * If the map viewport is partially covered with other content (overlays) along\n * its edges, this setting allows to shift the center of the viewport away from that\n * content. The order of the values in the array is top, right, bottom, left.\n * The default is no padding, which is equivalent to `[0, 0, 0, 0]`.\n * @type {Array|undefined}\n * @api\n */\n get padding() {\n return this.padding_;\n }\n set padding(e) {\n let t = this.padding_;\n this.padding_ = e;\n const i = this.getCenterInternal();\n if (i) {\n const r = e || [0, 0, 0, 0];\n t = t || [0, 0, 0, 0];\n const s = this.getResolution(), a = s / 2 * (r[3] - t[3] + t[1] - r[1]), o = s / 2 * (r[0] - t[0] + t[2] - r[2]);\n this.setCenterInternal([i[0] + a, i[1] - o]);\n }\n }\n /**\n * Get an updated version of the view options used to construct the view. The\n * current resolution (or zoom), center, and rotation are applied to any stored\n * options. The provided options can be used to apply new min/max zoom or\n * resolution limits.\n * @param {ViewOptions} newOptions New options to be applied.\n * @return {ViewOptions} New options updated with the current view state.\n */\n getUpdatedOptions_(e) {\n const t = this.getProperties();\n return t.resolution !== void 0 ? t.resolution = this.getResolution() : t.zoom = this.getZoom(), t.center = this.getCenterInternal(), t.rotation = this.getRotation(), Object.assign({}, t, e);\n }\n /**\n * Animate the view. The view's center, zoom (or resolution), and rotation\n * can be animated for smooth transitions between view states. For example,\n * to animate the view to a new zoom level:\n *\n * view.animate({zoom: view.getZoom() + 1});\n *\n * By default, the animation lasts one second and uses in-and-out easing. You\n * can customize this behavior by including `duration` (in milliseconds) and\n * `easing` options (see {@link module:ol/easing}).\n *\n * To chain together multiple animations, call the method with multiple\n * animation objects. For example, to first zoom and then pan:\n *\n * view.animate({zoom: 10}, {center: [0, 0]});\n *\n * If you provide a function as the last argument to the animate method, it\n * will get called at the end of an animation series. The callback will be\n * called with `true` if the animation series completed on its own or `false`\n * if it was cancelled.\n *\n * Animations are cancelled by user interactions (e.g. dragging the map) or by\n * calling `view.setCenter()`, `view.setResolution()`, or `view.setRotation()`\n * (or another method that calls one of these).\n *\n * @param {...(AnimationOptions|function(boolean): void)} var_args Animation\n * options. Multiple animations can be run in series by passing multiple\n * options objects. To run multiple animations in parallel, call the method\n * multiple times. An optional callback can be provided as a final\n * argument. The callback will be called with a boolean indicating whether\n * the animation completed without being cancelled.\n * @api\n */\n animate(e) {\n this.isDef() && !this.getAnimating() && this.resolveConstraints(0);\n const t = new Array(arguments.length);\n for (let i = 0; i < t.length; ++i) {\n let r = arguments[i];\n r.center && (r = Object.assign({}, r), r.center = Ps(\n r.center,\n this.getProjection()\n )), r.anchor && (r = Object.assign({}, r), r.anchor = Ps(\n r.anchor,\n this.getProjection()\n )), t[i] = r;\n }\n this.animateInternal.apply(this, t);\n }\n /**\n * @param {...(AnimationOptions|function(boolean): void)} var_args Animation options.\n */\n animateInternal(e) {\n let t = arguments.length, i;\n t > 1 && typeof arguments[t - 1] == \"function\" && (i = arguments[t - 1], --t);\n let r = 0;\n for (; r < t && !this.isDef(); ++r) {\n const h = arguments[r];\n h.center && this.setCenterInternal(h.center), h.zoom !== void 0 ? this.setZoom(h.zoom) : h.resolution && this.setResolution(h.resolution), h.rotation !== void 0 && this.setRotation(h.rotation);\n }\n if (r === t) {\n i && Rl(i, !0);\n return;\n }\n let s = Date.now(), a = this.targetCenter_.slice(), o = this.targetResolution_, l = this.targetRotation_;\n const c = [];\n for (; r < t; ++r) {\n const h = (\n /** @type {AnimationOptions} */\n arguments[r]\n ), u = {\n start: s,\n complete: !1,\n anchor: h.anchor,\n duration: h.duration !== void 0 ? h.duration : 1e3,\n easing: h.easing || Kw,\n callback: i\n };\n if (h.center && (u.sourceCenter = a, u.targetCenter = h.center.slice(), a = u.targetCenter), h.zoom !== void 0 ? (u.sourceResolution = o, u.targetResolution = this.getResolutionForZoom(h.zoom), o = u.targetResolution) : h.resolution && (u.sourceResolution = o, u.targetResolution = h.resolution, o = u.targetResolution), h.rotation !== void 0) {\n u.sourceRotation = l;\n const f = Ra(h.rotation - l + Math.PI, 2 * Math.PI) - Math.PI;\n u.targetRotation = l + f, l = u.targetRotation;\n }\n vU(u) ? u.complete = !0 : s += u.duration, c.push(u);\n }\n this.animations_.push(c), this.setHint(Mr.ANIMATING, 1), this.updateAnimations_();\n }\n /**\n * Determine if the view is being animated.\n * @return {boolean} The view is being animated.\n * @api\n */\n getAnimating() {\n return this.hints_[Mr.ANIMATING] > 0;\n }\n /**\n * Determine if the user is interacting with the view, such as panning or zooming.\n * @return {boolean} The view is being interacted with.\n * @api\n */\n getInteracting() {\n return this.hints_[Mr.INTERACTING] > 0;\n }\n /**\n * Cancel any ongoing animations.\n * @api\n */\n cancelAnimations() {\n this.setHint(Mr.ANIMATING, -this.hints_[Mr.ANIMATING]);\n let e;\n for (let t = 0, i = this.animations_.length; t < i; ++t) {\n const r = this.animations_[t];\n if (r[0].callback && Rl(r[0].callback, !1), !e)\n for (let s = 0, a = r.length; s < a; ++s) {\n const o = r[s];\n if (!o.complete) {\n e = o.anchor;\n break;\n }\n }\n }\n this.animations_.length = 0, this.cancelAnchor_ = e, this.nextCenter_ = null, this.nextResolution_ = NaN, this.nextRotation_ = NaN;\n }\n /**\n * Update all animations.\n */\n updateAnimations_() {\n if (this.updateAnimationKey_ !== void 0 && (cancelAnimationFrame(this.updateAnimationKey_), this.updateAnimationKey_ = void 0), !this.getAnimating())\n return;\n const e = Date.now();\n let t = !1;\n for (let i = this.animations_.length - 1; i >= 0; --i) {\n const r = this.animations_[i];\n let s = !0;\n for (let a = 0, o = r.length; a < o; ++a) {\n const l = r[a];\n if (l.complete)\n continue;\n const c = e - l.start;\n let h = l.duration > 0 ? c / l.duration : 1;\n h >= 1 ? (l.complete = !0, h = 1) : s = !1;\n const u = l.easing(h);\n if (l.sourceCenter) {\n const f = l.sourceCenter[0], d = l.sourceCenter[1], p = l.targetCenter[0], g = l.targetCenter[1];\n this.nextCenter_ = l.targetCenter;\n const m = f + u * (p - f), v = d + u * (g - d);\n this.targetCenter_ = [m, v];\n }\n if (l.sourceResolution && l.targetResolution) {\n const f = u === 1 ? l.targetResolution : l.sourceResolution + u * (l.targetResolution - l.sourceResolution);\n if (l.anchor) {\n const d = this.getViewportSize_(this.getRotation()), p = this.constraints_.resolution(\n f,\n 0,\n d,\n !0\n );\n this.targetCenter_ = this.calculateCenterZoom(\n p,\n l.anchor\n );\n }\n this.nextResolution_ = l.targetResolution, this.targetResolution_ = f, this.applyTargetState_(!0);\n }\n if (l.sourceRotation !== void 0 && l.targetRotation !== void 0) {\n const f = u === 1 ? Ra(l.targetRotation + Math.PI, 2 * Math.PI) - Math.PI : l.sourceRotation + u * (l.targetRotation - l.sourceRotation);\n if (l.anchor) {\n const d = this.constraints_.rotation(\n f,\n !0\n );\n this.targetCenter_ = this.calculateCenterRotate(\n d,\n l.anchor\n );\n }\n this.nextRotation_ = l.targetRotation, this.targetRotation_ = f;\n }\n if (this.applyTargetState_(!0), t = !0, !l.complete)\n break;\n }\n if (s) {\n this.animations_[i] = null, this.setHint(Mr.ANIMATING, -1), this.nextCenter_ = null, this.nextResolution_ = NaN, this.nextRotation_ = NaN;\n const a = r[0].callback;\n a && Rl(a, !0);\n }\n }\n this.animations_ = this.animations_.filter(Boolean), t && this.updateAnimationKey_ === void 0 && (this.updateAnimationKey_ = requestAnimationFrame(\n this.updateAnimations_.bind(this)\n ));\n }\n /**\n * @param {number} rotation Target rotation.\n * @param {import(\"./coordinate.js\").Coordinate} anchor Rotation anchor.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center for rotation and anchor.\n */\n calculateCenterRotate(e, t) {\n let i;\n const r = this.getCenterInternal();\n return r !== void 0 && (i = [r[0] - t[0], r[1] - t[1]], qf(i, e - this.getRotation()), bw(i, t)), i;\n }\n /**\n * @param {number} resolution Target resolution.\n * @param {import(\"./coordinate.js\").Coordinate} anchor Zoom anchor.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center for resolution and anchor.\n */\n calculateCenterZoom(e, t) {\n let i;\n const r = this.getCenterInternal(), s = this.getResolution();\n if (r !== void 0 && s !== void 0) {\n const a = t[0] - e * (t[0] - r[0]) / s, o = t[1] - e * (t[1] - r[1]) / s;\n i = [a, o];\n }\n return i;\n }\n /**\n * Returns the current viewport size.\n * @private\n * @param {number} [rotation] Take into account the rotation of the viewport when giving the size\n * @return {import(\"./size.js\").Size} Viewport size or `[100, 100]` when no viewport is found.\n */\n getViewportSize_(e) {\n const t = this.viewportSize_;\n if (e) {\n const i = t[0], r = t[1];\n return [\n Math.abs(i * Math.cos(e)) + Math.abs(r * Math.sin(e)),\n Math.abs(i * Math.sin(e)) + Math.abs(r * Math.cos(e))\n ];\n }\n return t;\n }\n /**\n * Stores the viewport size on the view. The viewport size is not read every time from the DOM\n * to avoid performance hit and layout reflow.\n * This should be done on map size change.\n * Note: the constraints are not resolved during an animation to avoid stopping it\n * @param {import(\"./size.js\").Size} [size] Viewport size; if undefined, [100, 100] is assumed\n */\n setViewportSize(e) {\n this.viewportSize_ = Array.isArray(e) ? e.slice() : [100, 100], this.getAnimating() || this.resolveConstraints(0);\n }\n /**\n * Get the view center.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} The center of the view.\n * @observable\n * @api\n */\n getCenter() {\n const e = this.getCenterInternal();\n return e && Au(e, this.getProjection());\n }\n /**\n * Get the view center without transforming to user projection.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} The center of the view.\n */\n getCenterInternal() {\n return (\n /** @type {import(\"./coordinate.js\").Coordinate|undefined} */\n this.get(Gr.CENTER)\n );\n }\n /**\n * @return {Constraints} Constraints.\n */\n getConstraints() {\n return this.constraints_;\n }\n /**\n * @return {boolean} Resolution constraint is set\n */\n getConstrainResolution() {\n return this.get(\"constrainResolution\");\n }\n /**\n * @param {Array} [hints] Destination array.\n * @return {Array} Hint.\n */\n getHints(e) {\n return e !== void 0 ? (e[0] = this.hints_[0], e[1] = this.hints_[1], e) : this.hints_.slice();\n }\n /**\n * Calculate the extent for the current view state and the passed size.\n * The size is the pixel dimensions of the box into which the calculated extent\n * should fit. In most cases you want to get the extent of the entire map,\n * that is `map.getSize()`.\n * @param {import(\"./size.js\").Size} [size] Box pixel size. If not provided, the size\n * of the map that uses this view will be used.\n * @return {import(\"./extent.js\").Extent} Extent.\n * @api\n */\n calculateExtent(e) {\n const t = this.calculateExtentInternal(e);\n return Bw(t, this.getProjection());\n }\n /**\n * @param {import(\"./size.js\").Size} [size] Box pixel size. If not provided,\n * the map's last known viewport size will be used.\n * @return {import(\"./extent.js\").Extent} Extent.\n */\n calculateExtentInternal(e) {\n e = e || this.getViewportSizeMinusPadding_();\n const t = (\n /** @type {!import(\"./coordinate.js\").Coordinate} */\n this.getCenterInternal()\n );\n Kt(t, 1);\n const i = (\n /** @type {!number} */\n this.getResolution()\n );\n Kt(i !== void 0, 2);\n const r = (\n /** @type {!number} */\n this.getRotation()\n );\n return Kt(r !== void 0, 3), Su(t, i, r, e);\n }\n /**\n * Get the maximum resolution of the view.\n * @return {number} The maximum resolution of the view.\n * @api\n */\n getMaxResolution() {\n return this.maxResolution_;\n }\n /**\n * Get the minimum resolution of the view.\n * @return {number} The minimum resolution of the view.\n * @api\n */\n getMinResolution() {\n return this.minResolution_;\n }\n /**\n * Get the maximum zoom level for the view.\n * @return {number} The maximum zoom level.\n * @api\n */\n getMaxZoom() {\n return (\n /** @type {number} */\n this.getZoomForResolution(this.minResolution_)\n );\n }\n /**\n * Set a new maximum zoom level for the view.\n * @param {number} zoom The maximum zoom level.\n * @api\n */\n setMaxZoom(e) {\n this.applyOptions_(this.getUpdatedOptions_({ maxZoom: e }));\n }\n /**\n * Get the minimum zoom level for the view.\n * @return {number} The minimum zoom level.\n * @api\n */\n getMinZoom() {\n return (\n /** @type {number} */\n this.getZoomForResolution(this.maxResolution_)\n );\n }\n /**\n * Set a new minimum zoom level for the view.\n * @param {number} zoom The minimum zoom level.\n * @api\n */\n setMinZoom(e) {\n this.applyOptions_(this.getUpdatedOptions_({ minZoom: e }));\n }\n /**\n * Set whether the view should allow intermediary zoom levels.\n * @param {boolean} enabled Whether the resolution is constrained.\n * @api\n */\n setConstrainResolution(e) {\n this.applyOptions_(this.getUpdatedOptions_({ constrainResolution: e }));\n }\n /**\n * Get the view projection.\n * @return {import(\"./proj/Projection.js\").default} The projection of the view.\n * @api\n */\n getProjection() {\n return this.projection_;\n }\n /**\n * Get the view resolution.\n * @return {number|undefined} The resolution of the view.\n * @observable\n * @api\n */\n getResolution() {\n return (\n /** @type {number|undefined} */\n this.get(Gr.RESOLUTION)\n );\n }\n /**\n * Get the resolutions for the view. This returns the array of resolutions\n * passed to the constructor of the View, or undefined if none were given.\n * @return {Array|undefined} The resolutions of the view.\n * @api\n */\n getResolutions() {\n return this.resolutions_;\n }\n /**\n * Get the resolution for a provided extent (in map units) and size (in pixels).\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {import(\"./size.js\").Size} [size] Box pixel size.\n * @return {number} The resolution at which the provided extent will render at\n * the given size.\n * @api\n */\n getResolutionForExtent(e, t) {\n return this.getResolutionForExtentInternal(\n ha(e, this.getProjection()),\n t\n );\n }\n /**\n * Get the resolution for a provided extent (in map units) and size (in pixels).\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {import(\"./size.js\").Size} [size] Box pixel size.\n * @return {number} The resolution at which the provided extent will render at\n * the given size.\n */\n getResolutionForExtentInternal(e, t) {\n t = t || this.getViewportSizeMinusPadding_();\n const i = Ui(e) / t[0], r = gs(e) / t[1];\n return Math.max(i, r);\n }\n /**\n * Return a function that returns a value between 0 and 1 for a\n * resolution. Exponential scaling is assumed.\n * @param {number} [power] Power.\n * @return {function(number): number} Resolution for value function.\n */\n getResolutionForValueFunction(e) {\n e = e || 2;\n const t = this.getConstrainedResolution(this.maxResolution_), i = this.minResolution_, r = Math.log(t / i) / Math.log(e);\n return (\n /**\n * @param {number} value Value.\n * @return {number} Resolution.\n */\n function(s) {\n return t / Math.pow(e, s * r);\n }\n );\n }\n /**\n * Get the view rotation.\n * @return {number} The rotation of the view in radians.\n * @observable\n * @api\n */\n getRotation() {\n return (\n /** @type {number} */\n this.get(Gr.ROTATION)\n );\n }\n /**\n * Return a function that returns a resolution for a value between\n * 0 and 1. Exponential scaling is assumed.\n * @param {number} [power] Power.\n * @return {function(number): number} Value for resolution function.\n */\n getValueForResolutionFunction(e) {\n const t = Math.log(e || 2), i = this.getConstrainedResolution(this.maxResolution_), r = this.minResolution_, s = Math.log(i / r) / t;\n return (\n /**\n * @param {number} resolution Resolution.\n * @return {number} Value.\n */\n function(a) {\n return Math.log(i / a) / t / s;\n }\n );\n }\n /**\n * Returns the size of the viewport minus padding.\n * @private\n * @param {number} [rotation] Take into account the rotation of the viewport when giving the size\n * @return {import(\"./size.js\").Size} Viewport size reduced by the padding.\n */\n getViewportSizeMinusPadding_(e) {\n let t = this.getViewportSize_(e);\n const i = this.padding_;\n return i && (t = [\n t[0] - i[1] - i[3],\n t[1] - i[0] - i[2]\n ]), t;\n }\n /**\n * @return {State} View state.\n */\n getState() {\n const e = this.getProjection(), t = this.getResolution(), i = this.getRotation();\n let r = (\n /** @type {import(\"./coordinate.js\").Coordinate} */\n this.getCenterInternal()\n );\n const s = this.padding_;\n if (s) {\n const a = this.getViewportSizeMinusPadding_();\n r = $h(\n r,\n this.getViewportSize_(),\n [a[0] / 2 + s[3], a[1] / 2 + s[0]],\n t,\n i\n );\n }\n return {\n center: r.slice(0),\n projection: e !== void 0 ? e : null,\n resolution: t,\n nextCenter: this.nextCenter_,\n nextResolution: this.nextResolution_,\n nextRotation: this.nextRotation_,\n rotation: i,\n zoom: this.getZoom()\n };\n }\n /**\n * @return {ViewStateLayerStateExtent} Like `FrameState`, but just `viewState` and `extent`.\n */\n getViewStateAndExtent() {\n return {\n viewState: this.getState(),\n extent: this.calculateExtent()\n };\n }\n /**\n * Get the current zoom level. This method may return non-integer zoom levels\n * if the view does not constrain the resolution, or if an interaction or\n * animation is underway.\n * @return {number|undefined} Zoom.\n * @api\n */\n getZoom() {\n let e;\n const t = this.getResolution();\n return t !== void 0 && (e = this.getZoomForResolution(t)), e;\n }\n /**\n * Get the zoom level for a resolution.\n * @param {number} resolution The resolution.\n * @return {number|undefined} The zoom level for the provided resolution.\n * @api\n */\n getZoomForResolution(e) {\n let t = this.minZoom_ || 0, i, r;\n if (this.resolutions_) {\n const s = Gf(this.resolutions_, e, 1);\n t = s, i = this.resolutions_[s], s == this.resolutions_.length - 1 ? r = 2 : r = i / this.resolutions_[s + 1];\n } else\n i = this.maxResolution_, r = this.zoomFactor_;\n return t + Math.log(i / e) / Math.log(r);\n }\n /**\n * Get the resolution for a zoom level.\n * @param {number} zoom Zoom level.\n * @return {number} The view resolution for the provided zoom level.\n * @api\n */\n getResolutionForZoom(e) {\n if (this.resolutions_) {\n if (this.resolutions_.length <= 1)\n return 0;\n const t = Vi(\n Math.floor(e),\n 0,\n this.resolutions_.length - 2\n ), i = this.resolutions_[t] / this.resolutions_[t + 1];\n return this.resolutions_[t] / Math.pow(i, Vi(e - t, 0, 1));\n }\n return this.maxResolution_ / Math.pow(this.zoomFactor_, e - this.minZoom_);\n }\n /**\n * Fit the given geometry or extent based on the given map size and border.\n * The size is pixel dimensions of the box to fit the extent into.\n * In most cases you will want to use the map size, that is `map.getSize()`.\n * Takes care of the map angle.\n * @param {import(\"./geom/SimpleGeometry.js\").default|import(\"./extent.js\").Extent} geometryOrExtent The geometry or\n * extent to fit the view to.\n * @param {FitOptions} [options] Options.\n * @api\n */\n fit(e, t) {\n let i;\n if (Kt(\n Array.isArray(e) || typeof /** @type {?} */\n e.getSimplifiedGeometry == \"function\",\n 24\n ), Array.isArray(e)) {\n Kt(!$o(e), 25);\n const r = ha(e, this.getProjection());\n i = Pm(r);\n } else if (e.getType() === \"Circle\") {\n const r = ha(\n e.getExtent(),\n this.getProjection()\n );\n i = Pm(r), i.rotate(this.getRotation(), Mo(r));\n } else {\n const r = Uw();\n r ? i = /** @type {import(\"./geom/SimpleGeometry.js\").default} */\n e.clone().transform(r, this.getProjection()) : i = e;\n }\n this.fitInternal(i, t);\n }\n /**\n * Calculate rotated extent\n * @param {import(\"./geom/SimpleGeometry.js\").default} geometry The geometry.\n * @return {import(\"./extent\").Extent} The rotated extent for the geometry.\n */\n rotatedExtentForGeometry(e) {\n const t = this.getRotation(), i = Math.cos(t), r = Math.sin(-t), s = e.getFlatCoordinates(), a = e.getStride();\n let o = 1 / 0, l = 1 / 0, c = -1 / 0, h = -1 / 0;\n for (let u = 0, f = s.length; u < f; u += a) {\n const d = s[u] * i - s[u + 1] * r, p = s[u] * r + s[u + 1] * i;\n o = Math.min(o, d), l = Math.min(l, p), c = Math.max(c, d), h = Math.max(h, p);\n }\n return [o, l, c, h];\n }\n /**\n * @param {import(\"./geom/SimpleGeometry.js\").default} geometry The geometry.\n * @param {FitOptions} [options] Options.\n */\n fitInternal(e, t) {\n t = t || {};\n let i = t.size;\n i || (i = this.getViewportSizeMinusPadding_());\n const r = t.padding !== void 0 ? t.padding : [0, 0, 0, 0], s = t.nearest !== void 0 ? t.nearest : !1;\n let a;\n t.minResolution !== void 0 ? a = t.minResolution : t.maxZoom !== void 0 ? a = this.getResolutionForZoom(t.maxZoom) : a = 0;\n const o = this.rotatedExtentForGeometry(e);\n let l = this.getResolutionForExtentInternal(o, [\n i[0] - r[1] - r[3],\n i[1] - r[0] - r[2]\n ]);\n l = isNaN(l) ? a : Math.max(l, a), l = this.getConstrainedResolution(l, s ? 0 : 1);\n const c = this.getRotation(), h = Math.sin(c), u = Math.cos(c), f = Mo(o);\n f[0] += (r[1] - r[3]) / 2 * l, f[1] += (r[0] - r[2]) / 2 * l;\n const d = f[0] * u - f[1] * h, p = f[1] * u + f[0] * h, g = this.getConstrainedCenter([d, p], l), m = t.callback ? t.callback : fc;\n t.duration !== void 0 ? this.animateInternal(\n {\n resolution: l,\n center: g,\n duration: t.duration,\n easing: t.easing\n },\n m\n ) : (this.targetResolution_ = l, this.targetCenter_ = g, this.applyTargetState_(!1, !0), Rl(m, !0));\n }\n /**\n * Center on coordinate and view position.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"./size.js\").Size} size Box pixel size.\n * @param {import(\"./pixel.js\").Pixel} position Position on the view to center on.\n * @api\n */\n centerOn(e, t, i) {\n this.centerOnInternal(\n Ps(e, this.getProjection()),\n t,\n i\n );\n }\n /**\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"./size.js\").Size} size Box pixel size.\n * @param {import(\"./pixel.js\").Pixel} position Position on the view to center on.\n */\n centerOnInternal(e, t, i) {\n this.setCenterInternal(\n $h(\n e,\n t,\n i,\n this.getResolution(),\n this.getRotation()\n )\n );\n }\n /**\n * Calculates the shift between map and viewport center.\n * @param {import(\"./coordinate.js\").Coordinate} center Center.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {import(\"./size.js\").Size} size Size.\n * @return {Array|undefined} Center shift.\n */\n calculateCenterShift(e, t, i, r) {\n let s;\n const a = this.padding_;\n if (a && e) {\n const o = this.getViewportSizeMinusPadding_(-i), l = $h(\n e,\n r,\n [o[0] / 2 + a[3], o[1] / 2 + a[0]],\n t,\n i\n );\n s = [\n e[0] - l[0],\n e[1] - l[1]\n ];\n }\n return s;\n }\n /**\n * @return {boolean} Is defined.\n */\n isDef() {\n return !!this.getCenterInternal() && this.getResolution() !== void 0;\n }\n /**\n * Adds relative coordinates to the center of the view. Any extent constraint will apply.\n * @param {import(\"./coordinate.js\").Coordinate} deltaCoordinates Relative value to add.\n * @api\n */\n adjustCenter(e) {\n const t = Au(this.targetCenter_, this.getProjection());\n this.setCenter([\n t[0] + e[0],\n t[1] + e[1]\n ]);\n }\n /**\n * Adds relative coordinates to the center of the view. Any extent constraint will apply.\n * @param {import(\"./coordinate.js\").Coordinate} deltaCoordinates Relative value to add.\n */\n adjustCenterInternal(e) {\n const t = this.targetCenter_;\n this.setCenterInternal([\n t[0] + e[0],\n t[1] + e[1]\n ]);\n }\n /**\n * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} ratio The ratio to apply on the view resolution.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n * @api\n */\n adjustResolution(e, t) {\n t = t && Ps(t, this.getProjection()), this.adjustResolutionInternal(e, t);\n }\n /**\n * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} ratio The ratio to apply on the view resolution.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n */\n adjustResolutionInternal(e, t) {\n const i = this.getAnimating() || this.getInteracting(), r = this.getViewportSize_(this.getRotation()), s = this.constraints_.resolution(\n this.targetResolution_ * e,\n 0,\n r,\n i\n );\n t && (this.targetCenter_ = this.calculateCenterZoom(s, t)), this.targetResolution_ *= e, this.applyTargetState_();\n }\n /**\n * Adds a value to the view zoom level, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} delta Relative value to add to the zoom level.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n * @api\n */\n adjustZoom(e, t) {\n this.adjustResolution(Math.pow(this.zoomFactor_, -e), t);\n }\n /**\n * Adds a value to the view rotation, optionally using an anchor. Any rotation\n * constraint will apply.\n * @param {number} delta Relative value to add to the zoom rotation, in radians.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The rotation center.\n * @api\n */\n adjustRotation(e, t) {\n t && (t = Ps(t, this.getProjection())), this.adjustRotationInternal(e, t);\n }\n /**\n * @param {number} delta Relative value to add to the zoom rotation, in radians.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The rotation center.\n */\n adjustRotationInternal(e, t) {\n const i = this.getAnimating() || this.getInteracting(), r = this.constraints_.rotation(\n this.targetRotation_ + e,\n i\n );\n t && (this.targetCenter_ = this.calculateCenterRotate(r, t)), this.targetRotation_ += e, this.applyTargetState_();\n }\n /**\n * Set the center of the current view. Any extent constraint will apply.\n * @param {import(\"./coordinate.js\").Coordinate|undefined} center The center of the view.\n * @observable\n * @api\n */\n setCenter(e) {\n this.setCenterInternal(\n e && Ps(e, this.getProjection())\n );\n }\n /**\n * Set the center using the view projection (not the user projection).\n * @param {import(\"./coordinate.js\").Coordinate|undefined} center The center of the view.\n */\n setCenterInternal(e) {\n this.targetCenter_ = e, this.applyTargetState_();\n }\n /**\n * @param {import(\"./ViewHint.js\").default} hint Hint.\n * @param {number} delta Delta.\n * @return {number} New value.\n */\n setHint(e, t) {\n return this.hints_[e] += t, this.changed(), this.hints_[e];\n }\n /**\n * Set the resolution for this view. Any resolution constraint will apply.\n * @param {number|undefined} resolution The resolution of the view.\n * @observable\n * @api\n */\n setResolution(e) {\n this.targetResolution_ = e, this.applyTargetState_();\n }\n /**\n * Set the rotation for this view. Any rotation constraint will apply.\n * @param {number} rotation The rotation of the view in radians.\n * @observable\n * @api\n */\n setRotation(e) {\n this.targetRotation_ = e, this.applyTargetState_();\n }\n /**\n * Zoom to a specific zoom level. Any resolution constrain will apply.\n * @param {number} zoom Zoom level.\n * @api\n */\n setZoom(e) {\n this.setResolution(this.getResolutionForZoom(e));\n }\n /**\n * Recompute rotation/resolution/center based on target values.\n * Note: we have to compute rotation first, then resolution and center considering that\n * parameters can influence one another in case a view extent constraint is present.\n * @param {boolean} [doNotCancelAnims] Do not cancel animations.\n * @param {boolean} [forceMoving] Apply constraints as if the view is moving.\n * @private\n */\n applyTargetState_(e, t) {\n const i = this.getAnimating() || this.getInteracting() || t, r = this.constraints_.rotation(\n this.targetRotation_,\n i\n ), s = this.getViewportSize_(r), a = this.constraints_.resolution(\n this.targetResolution_,\n 0,\n s,\n i\n ), o = this.constraints_.center(\n this.targetCenter_,\n a,\n s,\n i,\n this.calculateCenterShift(\n this.targetCenter_,\n a,\n r,\n s\n )\n );\n this.get(Gr.ROTATION) !== r && this.set(Gr.ROTATION, r), this.get(Gr.RESOLUTION) !== a && (this.set(Gr.RESOLUTION, a), this.set(\"zoom\", this.getZoom(), !0)), (!o || !this.get(Gr.CENTER) || !gc(this.get(Gr.CENTER), o)) && this.set(Gr.CENTER, o), this.getAnimating() && !e && this.cancelAnimations(), this.cancelAnchor_ = void 0;\n }\n /**\n * If any constraints need to be applied, an animation will be triggered.\n * This is typically done on interaction end.\n * Note: calling this with a duration of 0 will apply the constrained values straight away,\n * without animation.\n * @param {number} [duration] The animation duration in ms.\n * @param {number} [resolutionDirection] Which direction to zoom.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n */\n resolveConstraints(e, t, i) {\n e = e !== void 0 ? e : 200;\n const r = t || 0, s = this.constraints_.rotation(this.targetRotation_), a = this.getViewportSize_(s), o = this.constraints_.resolution(\n this.targetResolution_,\n r,\n a\n ), l = this.constraints_.center(\n this.targetCenter_,\n o,\n a,\n !1,\n this.calculateCenterShift(\n this.targetCenter_,\n o,\n s,\n a\n )\n );\n if (e === 0 && !this.cancelAnchor_) {\n this.targetResolution_ = o, this.targetRotation_ = s, this.targetCenter_ = l, this.applyTargetState_();\n return;\n }\n i = i || (e === 0 ? this.cancelAnchor_ : void 0), this.cancelAnchor_ = void 0, (this.getResolution() !== o || this.getRotation() !== s || !this.getCenterInternal() || !gc(this.getCenterInternal(), l)) && (this.getAnimating() && this.cancelAnimations(), this.animateInternal({\n rotation: s,\n center: l,\n resolution: o,\n duration: e,\n easing: Ka,\n anchor: i\n }));\n }\n /**\n * Notify the View that an interaction has started.\n * The view state will be resolved to a stable one if needed\n * (depending on its constraints).\n * @api\n */\n beginInteraction() {\n this.resolveConstraints(0), this.setHint(Mr.INTERACTING, 1);\n }\n /**\n * Notify the View that an interaction has ended. The view state will be resolved\n * to a stable one if needed (depending on its constraints).\n * @param {number} [duration] Animation duration in ms.\n * @param {number} [resolutionDirection] Which direction to zoom.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n * @api\n */\n endInteraction(e, t, i) {\n i = i && Ps(i, this.getProjection()), this.endInteractionInternal(e, t, i);\n }\n /**\n * Notify the View that an interaction has ended. The view state will be resolved\n * to a stable one if needed (depending on its constraints).\n * @param {number} [duration] Animation duration in ms.\n * @param {number} [resolutionDirection] Which direction to zoom.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n */\n endInteractionInternal(e, t, i) {\n this.getInteracting() && (this.setHint(Mr.INTERACTING, -1), this.resolveConstraints(e, t, i));\n }\n /**\n * Get a valid position for the view center according to the current constraints.\n * @param {import(\"./coordinate.js\").Coordinate|undefined} targetCenter Target center position.\n * @param {number} [targetResolution] Target resolution. If not supplied, the current one will be used.\n * This is useful to guess a valid center position at a different zoom level.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Valid center position.\n */\n getConstrainedCenter(e, t) {\n const i = this.getViewportSize_(this.getRotation());\n return this.constraints_.center(\n e,\n t || this.getResolution(),\n i\n );\n }\n /**\n * Get a valid zoom level according to the current view constraints.\n * @param {number|undefined} targetZoom Target zoom.\n * @param {number} [direction=0] Indicate which resolution should be used\n * by a renderer if the view resolution does not match any resolution of the tile source.\n * If 0, the nearest resolution will be used. If 1, the nearest lower resolution\n * will be used. If -1, the nearest higher resolution will be used.\n * @return {number|undefined} Valid zoom level.\n */\n getConstrainedZoom(e, t) {\n const i = this.getResolutionForZoom(e);\n return this.getZoomForResolution(\n this.getConstrainedResolution(i, t)\n );\n }\n /**\n * Get a valid resolution according to the current view constraints.\n * @param {number|undefined} targetResolution Target resolution.\n * @param {number} [direction=0] Indicate which resolution should be used\n * by a renderer if the view resolution does not match any resolution of the tile source.\n * If 0, the nearest resolution will be used. If 1, the nearest lower resolution\n * will be used. If -1, the nearest higher resolution will be used.\n * @return {number|undefined} Valid resolution.\n */\n getConstrainedResolution(e, t) {\n t = t || 0;\n const i = this.getViewportSize_(this.getRotation());\n return this.constraints_.resolution(e, t, i);\n }\n}\nfunction Rl(n, e) {\n setTimeout(function() {\n n(e);\n }, 0);\n}\nfunction mU(n) {\n if (n.extent !== void 0) {\n const t = n.smoothExtentConstraint !== void 0 ? n.smoothExtentConstraint : !0;\n return Rm(n.extent, n.constrainOnlyCenter, t);\n }\n const e = Zf(n.projection, \"EPSG:3857\");\n if (n.multiWorld !== !0 && e.isGlobal()) {\n const t = e.getExtent().slice();\n return t[0] = -1 / 0, t[2] = 1 / 0, Rm(t, !1, !1);\n }\n return zw;\n}\nfunction _U(n) {\n let e, t, i, a = n.minZoom !== void 0 ? n.minZoom : Jh, o = n.maxZoom !== void 0 ? n.maxZoom : 28;\n const l = n.zoomFactor !== void 0 ? n.zoomFactor : 2, c = n.multiWorld !== void 0 ? n.multiWorld : !1, h = n.smoothResolutionConstraint !== void 0 ? n.smoothResolutionConstraint : !0, u = n.showFullExtent !== void 0 ? n.showFullExtent : !1, f = Zf(n.projection, \"EPSG:3857\"), d = f.getExtent();\n let p = n.constrainOnlyCenter, g = n.extent;\n if (!c && !g && f.isGlobal() && (p = !1, g = d), n.resolutions !== void 0) {\n const m = n.resolutions;\n t = m[a], i = m[o] !== void 0 ? m[o] : m[m.length - 1], n.constrainResolution ? e = Ww(\n m,\n h,\n !p && g,\n u\n ) : e = Sm(\n t,\n i,\n h,\n !p && g,\n u\n );\n } else {\n const v = (d ? Math.max(Ui(d), gs(d)) : (\n // use an extent that can fit the whole world if need be\n 360 * Po.degrees / f.getMetersPerUnit()\n )) / Kf / Math.pow(2, Jh), E = v / Math.pow(2, 28 - Jh);\n t = n.maxResolution, t !== void 0 ? a = 0 : t = v / Math.pow(l, a), i = n.minResolution, i === void 0 && (n.maxZoom !== void 0 ? n.maxResolution !== void 0 ? i = t / Math.pow(l, o) : i = v / Math.pow(l, o) : i = E), o = a + Math.floor(\n Math.log(t / i) / Math.log(l)\n ), i = t / Math.pow(l, o - a), n.constrainResolution ? e = Gw(\n l,\n t,\n i,\n h,\n !p && g,\n u\n ) : e = Sm(\n t,\n i,\n h,\n !p && g,\n u\n );\n }\n return {\n constraint: e,\n maxResolution: t,\n minResolution: i,\n minZoom: a,\n zoomFactor: l\n };\n}\nfunction EU(n) {\n if (n.enableRotation !== void 0 ? n.enableRotation : !0) {\n const t = n.constrainRotation;\n return t === void 0 || t === !0 ? Hw() : t === !1 ? ym : typeof t == \"number\" ? Xw(t) : ym;\n }\n return ed;\n}\nfunction vU(n) {\n return !(n.sourceCenter && n.targetCenter && !gc(n.sourceCenter, n.targetCenter) || n.sourceResolution !== n.targetResolution || n.sourceRotation !== n.targetRotation);\n}\nfunction $h(n, e, t, i, r) {\n const s = Math.cos(-r);\n let a = Math.sin(-r), o = n[0] * s - n[1] * a, l = n[1] * s + n[0] * a;\n o += (e[0] / 2 - t[0]) * i, l += (t[1] - e[1] / 2) * i, a = -a;\n const c = o * s - l * a, h = l * s + o * a;\n return [c, h];\n}\nconst jr = gU;\nclass TU extends DE {\n /**\n * @param {Options} options Layer options.\n */\n constructor(e) {\n const t = Object.assign({}, e);\n delete t.source, super(t), this.on, this.once, this.un, this.mapPrecomposeKey_ = null, this.mapRenderKey_ = null, this.sourceChangeKey_ = null, this.renderer_ = null, this.sourceReady_ = !1, this.rendered = !1, e.render && (this.render = e.render), e.map && this.setMap(e.map), this.addChangeListener(\n Gt.SOURCE,\n this.handleSourcePropertyChange_\n );\n const i = e.source ? (\n /** @type {SourceType} */\n e.source\n ) : null;\n this.setSource(i);\n }\n /**\n * @param {Array} [array] Array of layers (to be modified in place).\n * @return {Array} Array of layers.\n */\n getLayersArray(e) {\n return e = e || [], e.push(this), e;\n }\n /**\n * @param {Array} [states] Optional list of layer states (to be modified in place).\n * @return {Array} List of layer states.\n */\n getLayerStatesArray(e) {\n return e = e || [], e.push(this.getLayerState()), e;\n }\n /**\n * Get the layer source.\n * @return {SourceType|null} The layer source (or `null` if not yet set).\n * @observable\n * @api\n */\n getSource() {\n return (\n /** @type {SourceType} */\n this.get(Gt.SOURCE) || null\n );\n }\n /**\n * @return {SourceType|null} The source being rendered.\n */\n getRenderSource() {\n return this.getSource();\n }\n /**\n * @return {import(\"../source/Source.js\").State} Source state.\n */\n getSourceState() {\n const e = this.getSource();\n return e ? e.getState() : \"undefined\";\n }\n /**\n * @private\n */\n handleSourceChange_() {\n this.changed(), !(this.sourceReady_ || this.getSource().getState() !== \"ready\") && (this.sourceReady_ = !0, this.dispatchEvent(\"sourceready\"));\n }\n /**\n * @private\n */\n handleSourcePropertyChange_() {\n this.sourceChangeKey_ && (Ei(this.sourceChangeKey_), this.sourceChangeKey_ = null), this.sourceReady_ = !1;\n const e = this.getSource();\n e && (this.sourceChangeKey_ = Ht(\n e,\n St.CHANGE,\n this.handleSourceChange_,\n this\n ), e.getState() === \"ready\" && (this.sourceReady_ = !0, setTimeout(() => {\n this.dispatchEvent(\"sourceready\");\n }, 0))), this.changed();\n }\n /**\n * @param {import(\"../pixel\").Pixel} pixel Pixel.\n * @return {Promise>} Promise that resolves with\n * an array of features.\n */\n getFeatures(e) {\n return this.renderer_ ? this.renderer_.getFeatures(e) : Promise.resolve([]);\n }\n /**\n * @param {import(\"../pixel\").Pixel} pixel Pixel.\n * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView|null} Pixel data.\n */\n getData(e) {\n return !this.renderer_ || !this.rendered ? null : this.renderer_.getData(e);\n }\n /**\n * The layer is visible on the map view, i.e. within its min/max resolution or zoom and\n * extent, not set to `visible: false`, and not inside a layer group that is set\n * to `visible: false`.\n * @param {View|import(\"../View.js\").ViewStateLayerStateExtent} [view] View or {@link import(\"../Map.js\").FrameState}.\n * Only required when the layer is not added to a map.\n * @return {boolean} The layer is visible in the map view.\n * @api\n */\n isVisible(e) {\n let t;\n const i = this.getMapInternal();\n !e && i && (e = i.getView()), e instanceof jr ? t = {\n viewState: e.getState(),\n extent: e.calculateExtent()\n } : t = e, !t.layerStatesArray && i && (t.layerStatesArray = i.getLayerGroup().getLayerStatesArray());\n let r;\n t.layerStatesArray ? r = t.layerStatesArray.find(\n (a) => a.layer === this\n ) : r = this.getLayerState();\n const s = this.getExtent();\n return rd(r, t.viewState) && (!s || Jo(s, t.extent));\n }\n /**\n * Get the attributions of the source of this layer for the given view.\n * @param {View|import(\"../View.js\").ViewStateLayerStateExtent} [view] View or {@link import(\"../Map.js\").FrameState}.\n * Only required when the layer is not added to a map.\n * @return {Array} Attributions for this layer at the given view.\n * @api\n */\n getAttributions(e) {\n if (!this.isVisible(e))\n return [];\n let t;\n const i = this.getSource();\n if (i && (t = i.getAttributions()), !t)\n return [];\n const r = e instanceof jr ? e.getViewStateAndExtent() : e;\n let s = t(r);\n return Array.isArray(s) || (s = [s]), s;\n }\n /**\n * In charge to manage the rendering of the layer. One layer type is\n * bounded with one layer renderer.\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n * @param {HTMLElement} target Target which the renderer may (but need not) use\n * for rendering its content.\n * @return {HTMLElement|null} The rendered element.\n */\n render(e, t) {\n const i = this.getRenderer();\n return i.prepareFrame(e) ? (this.rendered = !0, i.renderFrame(e, t)) : null;\n }\n /**\n * Called when a layer is not visible during a map render.\n */\n unrender() {\n this.rendered = !1;\n }\n /**\n * For use inside the library only.\n * @param {import(\"../Map.js\").default|null} map Map.\n */\n setMapInternal(e) {\n e || this.unrender(), this.set(Gt.MAP, e);\n }\n /**\n * For use inside the library only.\n * @return {import(\"../Map.js\").default|null} Map.\n */\n getMapInternal() {\n return this.get(Gt.MAP);\n }\n /**\n * Sets the layer to be rendered on top of other layers on a map. The map will\n * not manage this layer in its layers collection. This\n * is useful for temporary layers. To remove an unmanaged layer from the map,\n * use `#setMap(null)`.\n *\n * To add the layer to a map and have it managed by the map, use\n * {@link module:ol/Map~Map#addLayer} instead.\n * @param {import(\"../Map.js\").default|null} map Map.\n * @api\n */\n setMap(e) {\n this.mapPrecomposeKey_ && (Ei(this.mapPrecomposeKey_), this.mapPrecomposeKey_ = null), e || this.changed(), this.mapRenderKey_ && (Ei(this.mapRenderKey_), this.mapRenderKey_ = null), e && (this.mapPrecomposeKey_ = Ht(\n e,\n nn.PRECOMPOSE,\n function(t) {\n const r = /** @type {import(\"../render/Event.js\").default} */ t.frameState.layerStatesArray, s = this.getLayerState(!1);\n Kt(\n !r.some(function(a) {\n return a.layer === s.layer;\n }),\n 67\n ), r.push(s);\n },\n this\n ), this.mapRenderKey_ = Ht(this, St.CHANGE, e.render, e), this.changed());\n }\n /**\n * Set the layer source.\n * @param {SourceType|null} source The layer source.\n * @observable\n * @api\n */\n setSource(e) {\n this.set(Gt.SOURCE, e);\n }\n /**\n * Get the renderer for this layer.\n * @return {RendererType|null} The layer renderer.\n */\n getRenderer() {\n return this.renderer_ || (this.renderer_ = this.createRenderer()), this.renderer_;\n }\n /**\n * @return {boolean} The layer has a renderer.\n */\n hasRenderer() {\n return !!this.renderer_;\n }\n /**\n * Create a renderer for this layer.\n * @return {RendererType} A layer renderer.\n * @protected\n */\n createRenderer() {\n return null;\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n this.renderer_ && (this.renderer_.dispose(), delete this.renderer_), this.setSource(null), super.disposeInternal();\n }\n}\nfunction rd(n, e) {\n if (!n.visible)\n return !1;\n const t = e.resolution;\n if (t < n.minResolution || t >= n.maxResolution)\n return !1;\n const i = e.zoom;\n return i > n.minZoom && i <= n.maxZoom;\n}\nconst sd = TU;\nclass xU extends zf {\n /**\n * @param {import(\"../Map.js\").default} map Map.\n */\n constructor(e) {\n super(), this.map_ = e;\n }\n /**\n * @abstract\n * @param {import(\"../render/EventType.js\").default} type Event type.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n dispatchRenderEvent(e, t) {\n di();\n }\n /**\n * @param {import(\"../Map.js\").FrameState} frameState FrameState.\n * @protected\n */\n calculateMatrices2D(e) {\n const t = e.viewState, i = e.coordinateToPixelTransform, r = e.pixelToCoordinateTransform;\n Ao(\n i,\n e.size[0] / 2,\n e.size[1] / 2,\n 1 / t.resolution,\n -1 / t.resolution,\n -t.rotation,\n -t.center[0],\n -t.center[1]\n ), yE(r, i);\n }\n /**\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"../Map.js\").FrameState} frameState FrameState.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {boolean} checkWrapped Check for wrapped geometries.\n * @param {import(\"./vector.js\").FeatureCallback} callback Feature callback.\n * @param {S} thisArg Value to use as `this` when executing `callback`.\n * @param {function(this: U, import(\"../layer/Layer.js\").default): boolean} layerFilter Layer filter\n * function, only layers which are visible and for which this function\n * returns `true` will be tested for features. By default, all visible\n * layers will be tested.\n * @param {U} thisArg2 Value to use as `this` when executing `layerFilter`.\n * @return {T|undefined} Callback result.\n * @template S,T,U\n */\n forEachFeatureAtCoordinate(e, t, i, r, s, a, o, l) {\n let c;\n const h = t.viewState;\n function u(T, R, x, S) {\n return s.call(a, R, T ? x : null, S);\n }\n const f = h.projection, d = Mw(e.slice(), f), p = [[0, 0]];\n if (f.canWrapX() && r) {\n const T = f.getExtent(), R = Ui(T);\n p.push([-R, 0], [R, 0]);\n }\n const g = t.layerStatesArray, m = g.length, v = (\n /** @type {Array>} */\n []\n ), E = [];\n for (let T = 0; T < p.length; T++)\n for (let R = m - 1; R >= 0; --R) {\n const x = g[R], S = x.layer;\n if (S.hasRenderer() && rd(x, h) && o.call(l, S)) {\n const M = S.getRenderer(), N = S.getSource();\n if (M && N) {\n const F = N.getWrapX() ? d : e, L = u.bind(\n null,\n x.managed\n );\n E[0] = F[0] + p[T][0], E[1] = F[1] + p[T][1], c = M.forEachFeatureAtCoordinate(\n E,\n t,\n i,\n L,\n v\n );\n }\n if (c)\n return c;\n }\n }\n if (v.length === 0)\n return;\n const C = 1 / v.length;\n return v.forEach((T, R) => T.distanceSq += R * C), v.sort((T, R) => T.distanceSq - R.distanceSq), v.some((T) => c = T.callback(T.feature, T.layer, T.geometry)), c;\n }\n /**\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"../Map.js\").FrameState} frameState FrameState.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {boolean} checkWrapped Check for wrapped geometries.\n * @param {function(this: U, import(\"../layer/Layer.js\").default): boolean} layerFilter Layer filter\n * function, only layers which are visible and for which this function\n * returns `true` will be tested for features. By default, all visible\n * layers will be tested.\n * @param {U} thisArg Value to use as `this` when executing `layerFilter`.\n * @return {boolean} Is there a feature at the given coordinate?\n * @template U\n */\n hasFeatureAtCoordinate(e, t, i, r, s, a) {\n return this.forEachFeatureAtCoordinate(\n e,\n t,\n i,\n r,\n uc,\n this,\n s,\n a\n ) !== void 0;\n }\n /**\n * @return {import(\"../Map.js\").default} Map.\n */\n getMap() {\n return this.map_;\n }\n /**\n * Render.\n * @abstract\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n */\n renderFrame(e) {\n di();\n }\n /**\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n flushDeclutterItems(e) {\n }\n /**\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @protected\n */\n scheduleExpireIconCache(e) {\n OE.canExpireCache() && e.postRenderFunctions.push(CU);\n }\n}\nfunction CU(n, e) {\n OE.expire();\n}\nclass qE extends dn {\n /**\n * @param {import(\"./EventType.js\").default} type Type.\n * @param {import(\"../transform.js\").Transform} [inversePixelTransform] Transform for\n * CSS pixels to rendered pixels.\n * @param {import(\"../Map.js\").FrameState} [frameState] Frame state.\n * @param {?(CanvasRenderingContext2D|WebGLRenderingContext)} [context] Context.\n */\n constructor(e, t, i, r) {\n super(e), this.inversePixelTransform = t, this.frameState = i, this.context = r;\n }\n}\nconst Sl = \"ol-hidden\", rh = \"ol-unselectable\", nd = \"ol-control\", Om = \"ol-collapsed\";\nfunction Na(n, e, t, i) {\n let r;\n return t && t.length ? r = t.shift() : RE ? r = new OffscreenCanvas(n || 300, e || 300) : r = document.createElement(\"canvas\"), n && (r.width = n), e && (r.height = e), /** @type {CanvasRenderingContext2D} */\n r.getContext(\"2d\", i);\n}\nfunction ad(n) {\n const e = n.canvas;\n e.width = 1, e.height = 1, n.clearRect(0, 0, 1, 1);\n}\nfunction Dm(n, e) {\n const t = e.parentNode;\n t && t.replaceChild(n, e);\n}\nfunction Mu(n) {\n return n && n.parentNode ? n.parentNode.removeChild(n) : null;\n}\nfunction RU(n) {\n for (; n.lastChild; )\n n.removeChild(n.lastChild);\n}\nfunction SU(n, e) {\n const t = n.childNodes;\n for (let i = 0; ; ++i) {\n const r = t[i], s = e[i];\n if (!r && !s)\n break;\n if (r !== s) {\n if (!r) {\n n.appendChild(s);\n continue;\n }\n if (!s) {\n n.removeChild(r), --i;\n continue;\n }\n n.insertBefore(s, r);\n }\n }\n}\nconst yU = new Ws();\nclass IU extends xU {\n /**\n * @param {import(\"../Map.js\").default} map Map.\n */\n constructor(e) {\n super(e), this.fontChangeListenerKey_ = Ht(\n yU,\n bo.PROPERTYCHANGE,\n e.redrawText.bind(e)\n ), this.element_ = document.createElement(\"div\");\n const t = this.element_.style;\n t.position = \"absolute\", t.width = \"100%\", t.height = \"100%\", t.zIndex = \"0\", this.element_.className = rh + \" ol-layers\";\n const i = e.getViewport();\n i.insertBefore(this.element_, i.firstChild || null), this.children_ = [], this.renderedVisible_ = !0, this.declutterLayers_ = [];\n }\n /**\n * @param {import(\"../render/EventType.js\").default} type Event type.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n dispatchRenderEvent(e, t) {\n const i = this.getMap();\n if (i.hasListener(e)) {\n const r = new qE(e, void 0, t);\n i.dispatchEvent(r);\n }\n }\n disposeInternal() {\n Ei(this.fontChangeListenerKey_), this.element_.parentNode.removeChild(this.element_), super.disposeInternal();\n }\n /**\n * Render.\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n */\n renderFrame(e) {\n if (!e) {\n this.renderedVisible_ && (this.element_.style.display = \"none\", this.renderedVisible_ = !1);\n return;\n }\n this.calculateMatrices2D(e), this.dispatchRenderEvent(nn.PRECOMPOSE, e);\n const t = e.layerStatesArray.sort(function(a, o) {\n return a.zIndex - o.zIndex;\n }), i = e.viewState;\n this.children_.length = 0;\n const r = this.declutterLayers_;\n r.length = 0;\n let s = null;\n for (let a = 0, o = t.length; a < o; ++a) {\n const l = t[a];\n e.layerIndex = a;\n const c = l.layer, h = c.getSourceState();\n if (!rd(l, i) || h != \"ready\" && h != \"undefined\") {\n c.unrender();\n continue;\n }\n const u = c.render(e, s);\n u && (u !== s && (this.children_.push(u), s = u), \"getDeclutter\" in c && r.push(\n /** @type {import(\"../layer/BaseVector.js\").default} */\n c\n ));\n }\n this.flushDeclutterItems(e), SU(this.element_, this.children_), this.dispatchRenderEvent(nn.POSTCOMPOSE, e), this.renderedVisible_ || (this.element_.style.display = \"\", this.renderedVisible_ = !0), this.scheduleExpireIconCache(e);\n }\n /**\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n flushDeclutterItems(e) {\n const t = this.declutterLayers_;\n for (let i = t.length - 1; i >= 0; --i)\n t[i].renderDeclutter(e);\n t.length = 0;\n }\n}\nclass tn extends dn {\n /**\n * @param {EventType} type The event type.\n * @param {BaseLayer} layer The layer.\n */\n constructor(e, t) {\n super(e), this.layer = t;\n }\n}\nconst eu = {\n LAYERS: \"layers\"\n};\nclass qa extends DE {\n /**\n * @param {Options} [options] Layer options.\n */\n constructor(e) {\n e = e || {};\n const t = (\n /** @type {Options} */\n Object.assign({}, e)\n );\n delete t.layers;\n let i = e.layers;\n super(t), this.on, this.once, this.un, this.layersListenerKeys_ = [], this.listenerKeys_ = {}, this.addChangeListener(eu.LAYERS, this.handleLayersChanged_), i ? Array.isArray(i) ? i = new Us(i.slice(), { unique: !0 }) : Kt(typeof /** @type {?} */\n i.getArray == \"function\", 43) : i = new Us(void 0, { unique: !0 }), this.setLayers(i);\n }\n /**\n * @private\n */\n handleLayerChange_() {\n this.changed();\n }\n /**\n * @private\n */\n handleLayersChanged_() {\n this.layersListenerKeys_.forEach(Ei), this.layersListenerKeys_.length = 0;\n const e = this.getLayers();\n this.layersListenerKeys_.push(\n Ht(e, Dr.ADD, this.handleLayersAdd_, this),\n Ht(e, Dr.REMOVE, this.handleLayersRemove_, this)\n );\n for (const i in this.listenerKeys_)\n this.listenerKeys_[i].forEach(Ei);\n $c(this.listenerKeys_);\n const t = e.getArray();\n for (let i = 0, r = t.length; i < r; i++) {\n const s = t[i];\n this.registerLayerListeners_(s), this.dispatchEvent(new tn(\"addlayer\", s));\n }\n this.changed();\n }\n /**\n * @param {BaseLayer} layer The layer.\n */\n registerLayerListeners_(e) {\n const t = [\n Ht(\n e,\n bo.PROPERTYCHANGE,\n this.handleLayerChange_,\n this\n ),\n Ht(e, St.CHANGE, this.handleLayerChange_, this)\n ];\n e instanceof qa && t.push(\n Ht(e, \"addlayer\", this.handleLayerGroupAdd_, this),\n Ht(e, \"removelayer\", this.handleLayerGroupRemove_, this)\n ), this.listenerKeys_[ur(e)] = t;\n }\n /**\n * @param {GroupEvent} event The layer group event.\n */\n handleLayerGroupAdd_(e) {\n this.dispatchEvent(new tn(\"addlayer\", e.layer));\n }\n /**\n * @param {GroupEvent} event The layer group event.\n */\n handleLayerGroupRemove_(e) {\n this.dispatchEvent(new tn(\"removelayer\", e.layer));\n }\n /**\n * @param {import(\"../Collection.js\").CollectionEvent} collectionEvent CollectionEvent.\n * @private\n */\n handleLayersAdd_(e) {\n const t = e.element;\n this.registerLayerListeners_(t), this.dispatchEvent(new tn(\"addlayer\", t)), this.changed();\n }\n /**\n * @param {import(\"../Collection.js\").CollectionEvent} collectionEvent CollectionEvent.\n * @private\n */\n handleLayersRemove_(e) {\n const t = e.element, i = ur(t);\n this.listenerKeys_[i].forEach(Ei), delete this.listenerKeys_[i], this.dispatchEvent(new tn(\"removelayer\", t)), this.changed();\n }\n /**\n * Returns the {@link module:ol/Collection~Collection collection} of {@link module:ol/layer/Layer~Layer layers}\n * in this group.\n * @return {!Collection} Collection of\n * {@link module:ol/layer/Base~BaseLayer layers} that are part of this group.\n * @observable\n * @api\n */\n getLayers() {\n return (\n /** @type {!Collection} */\n this.get(eu.LAYERS)\n );\n }\n /**\n * Set the {@link module:ol/Collection~Collection collection} of {@link module:ol/layer/Layer~Layer layers}\n * in this group.\n * @param {!Collection} layers Collection of\n * {@link module:ol/layer/Base~BaseLayer layers} that are part of this group.\n * @observable\n * @api\n */\n setLayers(e) {\n const t = this.getLayers();\n if (t) {\n const i = t.getArray();\n for (let r = 0, s = i.length; r < s; ++r)\n this.dispatchEvent(new tn(\"removelayer\", i[r]));\n }\n this.set(eu.LAYERS, e);\n }\n /**\n * @param {Array} [array] Array of layers (to be modified in place).\n * @return {Array} Array of layers.\n */\n getLayersArray(e) {\n return e = e !== void 0 ? e : [], this.getLayers().forEach(function(t) {\n t.getLayersArray(e);\n }), e;\n }\n /**\n * Get the layer states list and use this groups z-index as the default\n * for all layers in this and nested groups, if it is unset at this point.\n * If dest is not provided and this group's z-index is undefined\n * 0 is used a the default z-index.\n * @param {Array} [dest] Optional list\n * of layer states (to be modified in place).\n * @return {Array} List of layer states.\n */\n getLayerStatesArray(e) {\n const t = e !== void 0 ? e : [], i = t.length;\n this.getLayers().forEach(function(a) {\n a.getLayerStatesArray(t);\n });\n const r = this.getLayerState();\n let s = r.zIndex;\n !e && r.zIndex === void 0 && (s = 0);\n for (let a = i, o = t.length; a < o; a++) {\n const l = t[a];\n l.opacity *= r.opacity, l.visible = l.visible && r.visible, l.maxResolution = Math.min(\n l.maxResolution,\n r.maxResolution\n ), l.minResolution = Math.max(\n l.minResolution,\n r.minResolution\n ), l.minZoom = Math.max(l.minZoom, r.minZoom), l.maxZoom = Math.min(l.maxZoom, r.maxZoom), r.extent !== void 0 && (l.extent !== void 0 ? l.extent = fo(\n l.extent,\n r.extent\n ) : l.extent = r.extent), l.zIndex === void 0 && (l.zIndex = s);\n }\n return t;\n }\n /**\n * @return {import(\"../source/Source.js\").State} Source state.\n */\n getSourceState() {\n return \"ready\";\n }\n}\nclass oa extends dn {\n /**\n * @param {string} type Event type.\n * @param {import(\"./Map.js\").default} map Map.\n * @param {?import(\"./Map.js\").FrameState} [frameState] Frame state.\n */\n constructor(e, t, i) {\n super(e), this.map = t, this.frameState = i !== void 0 ? i : null;\n }\n}\nclass Js extends oa {\n /**\n * @param {string} type Event type.\n * @param {import(\"./Map.js\").default} map Map.\n * @param {EVENT} originalEvent Original event.\n * @param {boolean} [dragging] Is the map currently being dragged?\n * @param {import(\"./Map.js\").FrameState} [frameState] Frame state.\n * @param {Array} [activePointers] Active pointers.\n */\n constructor(e, t, i, r, s, a) {\n super(e, t, s), this.originalEvent = i, this.pixel_ = null, this.coordinate_ = null, this.dragging = r !== void 0 ? r : !1, this.activePointers = a;\n }\n /**\n * The map pixel relative to the viewport corresponding to the original event.\n * @type {import(\"./pixel.js\").Pixel}\n * @api\n */\n get pixel() {\n return this.pixel_ || (this.pixel_ = this.map.getEventPixel(this.originalEvent)), this.pixel_;\n }\n set pixel(e) {\n this.pixel_ = e;\n }\n /**\n * The coordinate corresponding to the original browser event. This will be in the user\n * projection if one is set. Otherwise it will be in the view projection.\n * @type {import(\"./coordinate.js\").Coordinate}\n * @api\n */\n get coordinate() {\n return this.coordinate_ || (this.coordinate_ = this.map.getCoordinateFromPixel(this.pixel)), this.coordinate_;\n }\n set coordinate(e) {\n this.coordinate_ = e;\n }\n /**\n * Prevents the default browser action.\n * See https://developer.mozilla.org/en-US/docs/Web/API/event.preventDefault.\n * @api\n */\n preventDefault() {\n super.preventDefault(), \"preventDefault\" in this.originalEvent && this.originalEvent.preventDefault();\n }\n /**\n * Prevents further propagation of the current event.\n * See https://developer.mozilla.org/en-US/docs/Web/API/event.stopPropagation.\n * @api\n */\n stopPropagation() {\n super.stopPropagation(), \"stopPropagation\" in this.originalEvent && this.originalEvent.stopPropagation();\n }\n}\nconst ui = {\n /**\n * A true single click with no dragging and no double click. Note that this\n * event is delayed by 250 ms to ensure that it is not a double click.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#singleclick\n * @api\n */\n SINGLECLICK: \"singleclick\",\n /**\n * A click with no dragging. A double click will fire two of this.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#click\n * @api\n */\n CLICK: St.CLICK,\n /**\n * A true double click, with no dragging.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#dblclick\n * @api\n */\n DBLCLICK: St.DBLCLICK,\n /**\n * Triggered when a pointer is dragged.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointerdrag\n * @api\n */\n POINTERDRAG: \"pointerdrag\",\n /**\n * Triggered when a pointer is moved. Note that on touch devices this is\n * triggered when the map is panned, so is not the same as mousemove.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointermove\n * @api\n */\n POINTERMOVE: \"pointermove\",\n POINTERDOWN: \"pointerdown\",\n POINTERUP: \"pointerup\",\n POINTEROVER: \"pointerover\",\n POINTEROUT: \"pointerout\",\n POINTERENTER: \"pointerenter\",\n POINTERLEAVE: \"pointerleave\",\n POINTERCANCEL: \"pointercancel\"\n}, Pu = {\n POINTERMOVE: \"pointermove\",\n POINTERDOWN: \"pointerdown\",\n POINTERUP: \"pointerup\",\n POINTEROVER: \"pointerover\",\n POINTEROUT: \"pointerout\",\n POINTERENTER: \"pointerenter\",\n POINTERLEAVE: \"pointerleave\",\n POINTERCANCEL: \"pointercancel\"\n};\nclass bU extends Xf {\n /**\n * @param {import(\"./Map.js\").default} map The map with the viewport to listen to events on.\n * @param {number} [moveTolerance] The minimal distance the pointer must travel to trigger a move.\n */\n constructor(e, t) {\n super(e), this.map_ = e, this.clickTimeoutId_, this.emulateClicks_ = !1, this.dragging_ = !1, this.dragListenerKeys_ = [], this.moveTolerance_ = t === void 0 ? 1 : t, this.down_ = null;\n const i = this.map_.getViewport();\n this.activePointers_ = [], this.trackedTouches_ = {}, this.element_ = i, this.pointerdownListenerKey_ = Ht(\n i,\n Pu.POINTERDOWN,\n this.handlePointerDown_,\n this\n ), this.originalPointerMoveEvent_, this.relayedListenerKey_ = Ht(\n i,\n Pu.POINTERMOVE,\n this.relayMoveEvent_,\n this\n ), this.boundHandleTouchMove_ = this.handleTouchMove_.bind(this), this.element_.addEventListener(\n St.TOUCHMOVE,\n this.boundHandleTouchMove_,\n SE ? { passive: !1 } : !1\n );\n }\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n emulateClick_(e) {\n let t = new Js(\n ui.CLICK,\n this.map_,\n e\n );\n this.dispatchEvent(t), this.clickTimeoutId_ !== void 0 ? (clearTimeout(this.clickTimeoutId_), this.clickTimeoutId_ = void 0, t = new Js(\n ui.DBLCLICK,\n this.map_,\n e\n ), this.dispatchEvent(t)) : this.clickTimeoutId_ = setTimeout(() => {\n this.clickTimeoutId_ = void 0;\n const i = new Js(\n ui.SINGLECLICK,\n this.map_,\n e\n );\n this.dispatchEvent(i);\n }, 250);\n }\n /**\n * Keeps track on how many pointers are currently active.\n *\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n updateActivePointers_(e) {\n const t = e, i = t.pointerId;\n if (t.type == ui.POINTERUP || t.type == ui.POINTERCANCEL) {\n delete this.trackedTouches_[i];\n for (const r in this.trackedTouches_)\n if (this.trackedTouches_[r].target !== t.target) {\n delete this.trackedTouches_[r];\n break;\n }\n } else\n (t.type == ui.POINTERDOWN || t.type == ui.POINTERMOVE) && (this.trackedTouches_[i] = t);\n this.activePointers_ = Object.values(this.trackedTouches_);\n }\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n handlePointerUp_(e) {\n this.updateActivePointers_(e);\n const t = new Js(\n ui.POINTERUP,\n this.map_,\n e,\n void 0,\n void 0,\n this.activePointers_\n );\n this.dispatchEvent(t), this.emulateClicks_ && !t.defaultPrevented && !this.dragging_ && this.isMouseActionButton_(e) && this.emulateClick_(this.down_), this.activePointers_.length === 0 && (this.dragListenerKeys_.forEach(Ei), this.dragListenerKeys_.length = 0, this.dragging_ = !1, this.down_ = null);\n }\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @return {boolean} If the left mouse button was pressed.\n * @private\n */\n isMouseActionButton_(e) {\n return e.button === 0;\n }\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n handlePointerDown_(e) {\n this.emulateClicks_ = this.activePointers_.length === 0, this.updateActivePointers_(e);\n const t = new Js(\n ui.POINTERDOWN,\n this.map_,\n e,\n void 0,\n void 0,\n this.activePointers_\n );\n if (this.dispatchEvent(t), this.down_ = new PointerEvent(e.type, e), Object.defineProperty(this.down_, \"target\", {\n writable: !1,\n value: e.target\n }), this.dragListenerKeys_.length === 0) {\n const i = this.map_.getOwnerDocument();\n this.dragListenerKeys_.push(\n Ht(\n i,\n ui.POINTERMOVE,\n this.handlePointerMove_,\n this\n ),\n Ht(i, ui.POINTERUP, this.handlePointerUp_, this),\n /* Note that the listener for `pointercancel is set up on\n * `pointerEventHandler_` and not `documentPointerEventHandler_` like\n * the `pointerup` and `pointermove` listeners.\n *\n * The reason for this is the following: `TouchSource.vacuumTouches_()`\n * issues `pointercancel` events, when there was no `touchend` for a\n * `touchstart`. Now, let's say a first `touchstart` is registered on\n * `pointerEventHandler_`. The `documentPointerEventHandler_` is set up.\n * But `documentPointerEventHandler_` doesn't know about the first\n * `touchstart`. If there is no `touchend` for the `touchstart`, we can\n * only receive a `touchcancel` from `pointerEventHandler_`, because it is\n * only registered there.\n */\n Ht(\n this.element_,\n ui.POINTERCANCEL,\n this.handlePointerUp_,\n this\n )\n ), this.element_.getRootNode && this.element_.getRootNode() !== i && this.dragListenerKeys_.push(\n Ht(\n this.element_.getRootNode(),\n ui.POINTERUP,\n this.handlePointerUp_,\n this\n )\n );\n }\n }\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n handlePointerMove_(e) {\n if (this.isMoving_(e)) {\n this.updateActivePointers_(e), this.dragging_ = !0;\n const t = new Js(\n ui.POINTERDRAG,\n this.map_,\n e,\n this.dragging_,\n void 0,\n this.activePointers_\n );\n this.dispatchEvent(t);\n }\n }\n /**\n * Wrap and relay a pointermove event.\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n relayMoveEvent_(e) {\n this.originalPointerMoveEvent_ = e;\n const t = !!(this.down_ && this.isMoving_(e));\n this.dispatchEvent(\n new Js(\n ui.POINTERMOVE,\n this.map_,\n e,\n t\n )\n );\n }\n /**\n * Flexible handling of a `touch-action: none` css equivalent: because calling\n * `preventDefault()` on a `pointermove` event does not stop native page scrolling\n * and zooming, we also listen for `touchmove` and call `preventDefault()` on it\n * when an interaction (currently `DragPan` handles the event.\n * @param {TouchEvent} event Event.\n * @private\n */\n handleTouchMove_(e) {\n const t = this.originalPointerMoveEvent_;\n (!t || t.defaultPrevented) && (typeof e.cancelable != \"boolean\" || e.cancelable === !0) && e.preventDefault();\n }\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @return {boolean} Is moving.\n * @private\n */\n isMoving_(e) {\n return this.dragging_ || Math.abs(e.clientX - this.down_.clientX) > this.moveTolerance_ || Math.abs(e.clientY - this.down_.clientY) > this.moveTolerance_;\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n this.relayedListenerKey_ && (Ei(this.relayedListenerKey_), this.relayedListenerKey_ = null), this.element_.removeEventListener(\n St.TOUCHMOVE,\n this.boundHandleTouchMove_\n ), this.pointerdownListenerKey_ && (Ei(this.pointerdownListenerKey_), this.pointerdownListenerKey_ = null), this.dragListenerKeys_.forEach(Ei), this.dragListenerKeys_.length = 0, this.element_ = null, super.disposeInternal();\n }\n}\nconst $s = {\n /**\n * Triggered after a map frame is rendered.\n * @event module:ol/MapEvent~MapEvent#postrender\n * @api\n */\n POSTRENDER: \"postrender\",\n /**\n * Triggered when the map starts moving.\n * @event module:ol/MapEvent~MapEvent#movestart\n * @api\n */\n MOVESTART: \"movestart\",\n /**\n * Triggered after the map is moved.\n * @event module:ol/MapEvent~MapEvent#moveend\n * @api\n */\n MOVEEND: \"moveend\",\n /**\n * Triggered when loading of additional map data (tiles, images, features) starts.\n * @event module:ol/MapEvent~MapEvent#loadstart\n * @api\n */\n LOADSTART: \"loadstart\",\n /**\n * Triggered when loading of additional map data has completed.\n * @event module:ol/MapEvent~MapEvent#loadend\n * @api\n */\n LOADEND: \"loadend\"\n}, Ki = {\n LAYERGROUP: \"layergroup\",\n SIZE: \"size\",\n TARGET: \"target\",\n VIEW: \"view\"\n}, mc = 1 / 0;\nclass AU {\n /**\n * @param {function(T): number} priorityFunction Priority function.\n * @param {function(T): string} keyFunction Key function.\n */\n constructor(e, t) {\n this.priorityFunction_ = e, this.keyFunction_ = t, this.elements_ = [], this.priorities_ = [], this.queuedElements_ = {};\n }\n /**\n * FIXME empty description for jsdoc\n */\n clear() {\n this.elements_.length = 0, this.priorities_.length = 0, $c(this.queuedElements_);\n }\n /**\n * Remove and return the highest-priority element. O(log N).\n * @return {T} Element.\n */\n dequeue() {\n const e = this.elements_, t = this.priorities_, i = e[0];\n e.length == 1 ? (e.length = 0, t.length = 0) : (e[0] = e.pop(), t[0] = t.pop(), this.siftUp_(0));\n const r = this.keyFunction_(i);\n return delete this.queuedElements_[r], i;\n }\n /**\n * Enqueue an element. O(log N).\n * @param {T} element Element.\n * @return {boolean} The element was added to the queue.\n */\n enqueue(e) {\n Kt(!(this.keyFunction_(e) in this.queuedElements_), 31);\n const t = this.priorityFunction_(e);\n return t != mc ? (this.elements_.push(e), this.priorities_.push(t), this.queuedElements_[this.keyFunction_(e)] = !0, this.siftDown_(0, this.elements_.length - 1), !0) : !1;\n }\n /**\n * @return {number} Count.\n */\n getCount() {\n return this.elements_.length;\n }\n /**\n * Gets the index of the left child of the node at the given index.\n * @param {number} index The index of the node to get the left child for.\n * @return {number} The index of the left child.\n * @private\n */\n getLeftChildIndex_(e) {\n return e * 2 + 1;\n }\n /**\n * Gets the index of the right child of the node at the given index.\n * @param {number} index The index of the node to get the right child for.\n * @return {number} The index of the right child.\n * @private\n */\n getRightChildIndex_(e) {\n return e * 2 + 2;\n }\n /**\n * Gets the index of the parent of the node at the given index.\n * @param {number} index The index of the node to get the parent for.\n * @return {number} The index of the parent.\n * @private\n */\n getParentIndex_(e) {\n return e - 1 >> 1;\n }\n /**\n * Make this a heap. O(N).\n * @private\n */\n heapify_() {\n let e;\n for (e = (this.elements_.length >> 1) - 1; e >= 0; e--)\n this.siftUp_(e);\n }\n /**\n * @return {boolean} Is empty.\n */\n isEmpty() {\n return this.elements_.length === 0;\n }\n /**\n * @param {string} key Key.\n * @return {boolean} Is key queued.\n */\n isKeyQueued(e) {\n return e in this.queuedElements_;\n }\n /**\n * @param {T} element Element.\n * @return {boolean} Is queued.\n */\n isQueued(e) {\n return this.isKeyQueued(this.keyFunction_(e));\n }\n /**\n * @param {number} index The index of the node to move down.\n * @private\n */\n siftUp_(e) {\n const t = this.elements_, i = this.priorities_, r = t.length, s = t[e], a = i[e], o = e;\n for (; e < r >> 1; ) {\n const l = this.getLeftChildIndex_(e), c = this.getRightChildIndex_(e), h = c < r && i[c] < i[l] ? c : l;\n t[e] = t[h], i[e] = i[h], e = h;\n }\n t[e] = s, i[e] = a, this.siftDown_(o, e);\n }\n /**\n * @param {number} startIndex The index of the root.\n * @param {number} index The index of the node to move up.\n * @private\n */\n siftDown_(e, t) {\n const i = this.elements_, r = this.priorities_, s = i[t], a = r[t];\n for (; t > e; ) {\n const o = this.getParentIndex_(t);\n if (r[o] > a)\n i[t] = i[o], r[t] = r[o], t = o;\n else\n break;\n }\n i[t] = s, r[t] = a;\n }\n /**\n * FIXME empty description for jsdoc\n */\n reprioritize() {\n const e = this.priorityFunction_, t = this.elements_, i = this.priorities_;\n let r = 0;\n const s = t.length;\n let a, o, l;\n for (o = 0; o < s; ++o)\n a = t[o], l = e(a), l == mc ? delete this.queuedElements_[this.keyFunction_(a)] : (i[r] = l, t[r++] = a);\n t.length = r, i.length = r, this.heapify_();\n }\n}\nconst Qe = {\n IDLE: 0,\n LOADING: 1,\n LOADED: 2,\n /**\n * Indicates that tile loading failed\n * @type {number}\n */\n ERROR: 3,\n EMPTY: 4\n};\nclass MU extends AU {\n /**\n * @param {PriorityFunction} tilePriorityFunction Tile priority function.\n * @param {function(): ?} tileChangeCallback Function called on each tile change event.\n */\n constructor(e, t) {\n super(\n /**\n * @param {Array} element Element.\n * @return {number} Priority.\n */\n function(i) {\n return e.apply(null, i);\n },\n /**\n * @param {Array} element Element.\n * @return {string} Key.\n */\n function(i) {\n return (\n /** @type {import(\"./Tile.js\").default} */\n i[0].getKey()\n );\n }\n ), this.boundHandleTileChange_ = this.handleTileChange.bind(this), this.tileChangeCallback_ = t, this.tilesLoading_ = 0, this.tilesLoadingKeys_ = {};\n }\n /**\n * @param {Array} element Element.\n * @return {boolean} The element was added to the queue.\n */\n enqueue(e) {\n const t = super.enqueue(e);\n return t && e[0].addEventListener(St.CHANGE, this.boundHandleTileChange_), t;\n }\n /**\n * @return {number} Number of tiles loading.\n */\n getTilesLoading() {\n return this.tilesLoading_;\n }\n /**\n * @param {import(\"./events/Event.js\").default} event Event.\n * @protected\n */\n handleTileChange(e) {\n const t = (\n /** @type {import(\"./Tile.js\").default} */\n e.target\n ), i = t.getState();\n if (i === Qe.LOADED || i === Qe.ERROR || i === Qe.EMPTY) {\n i !== Qe.ERROR && t.removeEventListener(St.CHANGE, this.boundHandleTileChange_);\n const r = t.getKey();\n r in this.tilesLoadingKeys_ && (delete this.tilesLoadingKeys_[r], --this.tilesLoading_), this.tileChangeCallback_();\n }\n }\n /**\n * @param {number} maxTotalLoading Maximum number tiles to load simultaneously.\n * @param {number} maxNewLoads Maximum number of new tiles to load.\n */\n loadMoreTiles(e, t) {\n let i = 0, r, s, a;\n for (; this.tilesLoading_ < e && i < t && this.getCount() > 0; )\n s = /** @type {import(\"./Tile.js\").default} */\n this.dequeue()[0], a = s.getKey(), r = s.getState(), r === Qe.IDLE && !(a in this.tilesLoadingKeys_) && (this.tilesLoadingKeys_[a] = !0, ++this.tilesLoading_, ++i, s.load());\n }\n}\nfunction PU(n, e, t, i, r) {\n if (!n || !(t in n.wantedTiles) || !n.wantedTiles[t][e.getKey()])\n return mc;\n const s = n.viewState.center, a = i[0] - s[0], o = i[1] - s[1];\n return 65536 * Math.log(r) + Math.sqrt(a * a + o * o) / r;\n}\nclass od extends Ws {\n /**\n * @param {Options} options Control options.\n */\n constructor(e) {\n super();\n const t = e.element;\n t && !e.target && !t.style.pointerEvents && (t.style.pointerEvents = \"auto\"), this.element = t || null, this.target_ = null, this.map_ = null, this.listenerKeys = [], e.render && (this.render = e.render), e.target && this.setTarget(e.target);\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n Mu(this.element), super.disposeInternal();\n }\n /**\n * Get the map associated with this control.\n * @return {import(\"../Map.js\").default|null} Map.\n * @api\n */\n getMap() {\n return this.map_;\n }\n /**\n * Remove the control from its current map and attach it to the new map.\n * Pass `null` to just remove the control from the current map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default|null} map Map.\n * @api\n */\n setMap(e) {\n this.map_ && Mu(this.element);\n for (let t = 0, i = this.listenerKeys.length; t < i; ++t)\n Ei(this.listenerKeys[t]);\n this.listenerKeys.length = 0, this.map_ = e, e && ((this.target_ ? this.target_ : e.getOverlayContainerStopEvent()).appendChild(this.element), this.render !== fc && this.listenerKeys.push(\n Ht(e, $s.POSTRENDER, this.render, this)\n ), e.render());\n }\n /**\n * Renders the control.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @api\n */\n render(e) {\n }\n /**\n * This function is used to set a target element for the control. It has no\n * effect if it is called after the control has been added to the map (i.e.\n * after `setMap` is called on the control). If no `target` is set in the\n * options passed to the control constructor and if `setTarget` is not called\n * then the control is added to the map's overlay container.\n * @param {HTMLElement|string} target Target.\n * @api\n */\n setTarget(e) {\n this.target_ = typeof e == \"string\" ? document.getElementById(e) : e;\n }\n}\nclass OU extends od {\n /**\n * @param {Options} [options] Attribution options.\n */\n constructor(e) {\n e = e || {}, super({\n element: document.createElement(\"div\"),\n render: e.render,\n target: e.target\n }), this.ulElement_ = document.createElement(\"ul\"), this.collapsed_ = e.collapsed !== void 0 ? e.collapsed : !0, this.userCollapsed_ = this.collapsed_, this.overrideCollapsible_ = e.collapsible !== void 0, this.collapsible_ = e.collapsible !== void 0 ? e.collapsible : !0, this.collapsible_ || (this.collapsed_ = !1);\n const t = e.className !== void 0 ? e.className : \"ol-attribution\", i = e.tipLabel !== void 0 ? e.tipLabel : \"Attributions\", r = e.expandClassName !== void 0 ? e.expandClassName : t + \"-expand\", s = e.collapseLabel !== void 0 ? e.collapseLabel : \"›\", a = e.collapseClassName !== void 0 ? e.collapseClassName : t + \"-collapse\";\n typeof s == \"string\" ? (this.collapseLabel_ = document.createElement(\"span\"), this.collapseLabel_.textContent = s, this.collapseLabel_.className = a) : this.collapseLabel_ = s;\n const o = e.label !== void 0 ? e.label : \"i\";\n typeof o == \"string\" ? (this.label_ = document.createElement(\"span\"), this.label_.textContent = o, this.label_.className = r) : this.label_ = o;\n const l = this.collapsible_ && !this.collapsed_ ? this.collapseLabel_ : this.label_;\n this.toggleButton_ = document.createElement(\"button\"), this.toggleButton_.setAttribute(\"type\", \"button\"), this.toggleButton_.setAttribute(\"aria-expanded\", String(!this.collapsed_)), this.toggleButton_.title = i, this.toggleButton_.appendChild(l), this.toggleButton_.addEventListener(\n St.CLICK,\n this.handleClick_.bind(this),\n !1\n );\n const c = t + \" \" + rh + \" \" + nd + (this.collapsed_ && this.collapsible_ ? \" \" + Om : \"\") + (this.collapsible_ ? \"\" : \" ol-uncollapsible\"), h = this.element;\n h.className = c, h.appendChild(this.toggleButton_), h.appendChild(this.ulElement_), this.renderedAttributions_ = [], this.renderedVisible_ = !0;\n }\n /**\n * Collect a list of visible attributions and set the collapsible state.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @return {Array} Attributions.\n * @private\n */\n collectSourceAttributions_(e) {\n const t = Array.from(\n new Set(\n this.getMap().getAllLayers().flatMap((r) => r.getAttributions(e))\n )\n ), i = !this.getMap().getAllLayers().some(\n (r) => r.getSource() && r.getSource().getAttributionsCollapsible() === !1\n );\n return this.overrideCollapsible_ || this.setCollapsible(i), t;\n }\n /**\n * @private\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n */\n updateElement_(e) {\n if (!e) {\n this.renderedVisible_ && (this.element.style.display = \"none\", this.renderedVisible_ = !1);\n return;\n }\n const t = this.collectSourceAttributions_(e), i = t.length > 0;\n if (this.renderedVisible_ != i && (this.element.style.display = i ? \"\" : \"none\", this.renderedVisible_ = i), !Qc(t, this.renderedAttributions_)) {\n RU(this.ulElement_);\n for (let r = 0, s = t.length; r < s; ++r) {\n const a = document.createElement(\"li\");\n a.innerHTML = t[r], this.ulElement_.appendChild(a);\n }\n this.renderedAttributions_ = t;\n }\n }\n /**\n * @param {MouseEvent} event The event to handle\n * @private\n */\n handleClick_(e) {\n e.preventDefault(), this.handleToggle_(), this.userCollapsed_ = this.collapsed_;\n }\n /**\n * @private\n */\n handleToggle_() {\n this.element.classList.toggle(Om), this.collapsed_ ? Dm(this.collapseLabel_, this.label_) : Dm(this.label_, this.collapseLabel_), this.collapsed_ = !this.collapsed_, this.toggleButton_.setAttribute(\"aria-expanded\", String(!this.collapsed_));\n }\n /**\n * Return `true` if the attribution is collapsible, `false` otherwise.\n * @return {boolean} True if the widget is collapsible.\n * @api\n */\n getCollapsible() {\n return this.collapsible_;\n }\n /**\n * Set whether the attribution should be collapsible.\n * @param {boolean} collapsible True if the widget is collapsible.\n * @api\n */\n setCollapsible(e) {\n this.collapsible_ !== e && (this.collapsible_ = e, this.element.classList.toggle(\"ol-uncollapsible\"), this.userCollapsed_ && this.handleToggle_());\n }\n /**\n * Collapse or expand the attribution according to the passed parameter. Will\n * not do anything if the attribution isn't collapsible or if the current\n * collapsed state is already the one requested.\n * @param {boolean} collapsed True if the widget is collapsed.\n * @api\n */\n setCollapsed(e) {\n this.userCollapsed_ = e, !(!this.collapsible_ || this.collapsed_ === e) && this.handleToggle_();\n }\n /**\n * Return `true` when the attribution is currently collapsed or `false`\n * otherwise.\n * @return {boolean} True if the widget is collapsed.\n * @api\n */\n getCollapsed() {\n return this.collapsed_;\n }\n /**\n * Update the attribution element.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @override\n */\n render(e) {\n this.updateElement_(e.frameState);\n }\n}\nconst DU = OU;\nclass NU extends od {\n /**\n * @param {Options} [options] Rotate options.\n */\n constructor(e) {\n e = e || {}, super({\n element: document.createElement(\"div\"),\n render: e.render,\n target: e.target\n });\n const t = e.className !== void 0 ? e.className : \"ol-rotate\", i = e.label !== void 0 ? e.label : \"⇧\", r = e.compassClassName !== void 0 ? e.compassClassName : \"ol-compass\";\n this.label_ = null, typeof i == \"string\" ? (this.label_ = document.createElement(\"span\"), this.label_.className = r, this.label_.textContent = i) : (this.label_ = i, this.label_.classList.add(r));\n const s = e.tipLabel ? e.tipLabel : \"Reset rotation\", a = document.createElement(\"button\");\n a.className = t + \"-reset\", a.setAttribute(\"type\", \"button\"), a.title = s, a.appendChild(this.label_), a.addEventListener(\n St.CLICK,\n this.handleClick_.bind(this),\n !1\n );\n const o = t + \" \" + rh + \" \" + nd, l = this.element;\n l.className = o, l.appendChild(a), this.callResetNorth_ = e.resetNorth ? e.resetNorth : void 0, this.duration_ = e.duration !== void 0 ? e.duration : 250, this.autoHide_ = e.autoHide !== void 0 ? e.autoHide : !0, this.rotation_ = void 0, this.autoHide_ && this.element.classList.add(Sl);\n }\n /**\n * @param {MouseEvent} event The event to handle\n * @private\n */\n handleClick_(e) {\n e.preventDefault(), this.callResetNorth_ !== void 0 ? this.callResetNorth_() : this.resetNorth_();\n }\n /**\n * @private\n */\n resetNorth_() {\n const t = this.getMap().getView();\n if (!t)\n return;\n const i = t.getRotation();\n i !== void 0 && (this.duration_ > 0 && i % (2 * Math.PI) !== 0 ? t.animate({\n rotation: 0,\n duration: this.duration_,\n easing: Ka\n }) : t.setRotation(0));\n }\n /**\n * Update the rotate control element.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @override\n */\n render(e) {\n const t = e.frameState;\n if (!t)\n return;\n const i = t.viewState.rotation;\n if (i != this.rotation_) {\n const r = \"rotate(\" + i + \"rad)\";\n if (this.autoHide_) {\n const s = this.element.classList.contains(Sl);\n !s && i === 0 ? this.element.classList.add(Sl) : s && i !== 0 && this.element.classList.remove(Sl);\n }\n this.label_.style.transform = r;\n }\n this.rotation_ = i;\n }\n}\nconst FU = NU;\nclass LU extends od {\n /**\n * @param {Options} [options] Zoom options.\n */\n constructor(e) {\n e = e || {}, super({\n element: document.createElement(\"div\"),\n target: e.target\n });\n const t = e.className !== void 0 ? e.className : \"ol-zoom\", i = e.delta !== void 0 ? e.delta : 1, r = e.zoomInClassName !== void 0 ? e.zoomInClassName : t + \"-in\", s = e.zoomOutClassName !== void 0 ? e.zoomOutClassName : t + \"-out\", a = e.zoomInLabel !== void 0 ? e.zoomInLabel : \"+\", o = e.zoomOutLabel !== void 0 ? e.zoomOutLabel : \"–\", l = e.zoomInTipLabel !== void 0 ? e.zoomInTipLabel : \"Zoom in\", c = e.zoomOutTipLabel !== void 0 ? e.zoomOutTipLabel : \"Zoom out\", h = document.createElement(\"button\");\n h.className = r, h.setAttribute(\"type\", \"button\"), h.title = l, h.appendChild(\n typeof a == \"string\" ? document.createTextNode(a) : a\n ), h.addEventListener(\n St.CLICK,\n this.handleClick_.bind(this, i),\n !1\n );\n const u = document.createElement(\"button\");\n u.className = s, u.setAttribute(\"type\", \"button\"), u.title = c, u.appendChild(\n typeof o == \"string\" ? document.createTextNode(o) : o\n ), u.addEventListener(\n St.CLICK,\n this.handleClick_.bind(this, -i),\n !1\n );\n const f = t + \" \" + rh + \" \" + nd, d = this.element;\n d.className = f, d.appendChild(h), d.appendChild(u), this.duration_ = e.duration !== void 0 ? e.duration : 250;\n }\n /**\n * @param {number} delta Zoom delta.\n * @param {MouseEvent} event The event to handle\n * @private\n */\n handleClick_(e, t) {\n t.preventDefault(), this.zoomByDelta_(e);\n }\n /**\n * @param {number} delta Zoom delta.\n * @private\n */\n zoomByDelta_(e) {\n const i = this.getMap().getView();\n if (!i)\n return;\n const r = i.getZoom();\n if (r !== void 0) {\n const s = i.getConstrainedZoom(r + e);\n this.duration_ > 0 ? (i.getAnimating() && i.cancelAnimations(), i.animate({\n zoom: s,\n duration: this.duration_,\n easing: Ka\n })) : i.setZoom(s);\n }\n }\n}\nconst wU = LU;\nfunction UU(n) {\n n = n || {};\n const e = new Us();\n return (n.zoom !== void 0 ? n.zoom : !0) && e.push(new wU(n.zoomOptions)), (n.rotate !== void 0 ? n.rotate : !0) && e.push(new FU(n.rotateOptions)), (n.attribution !== void 0 ? n.attribution : !0) && e.push(new DU(n.attributionOptions)), e;\n}\nconst Nm = {\n ACTIVE: \"active\"\n};\nclass tl extends Ws {\n /**\n * @param {InteractionOptions} [options] Options.\n */\n constructor(e) {\n super(), this.on, this.once, this.un, e && e.handleEvent && (this.handleEvent = e.handleEvent), this.map_ = null, this.setActive(!0);\n }\n /**\n * Return whether the interaction is currently active.\n * @return {boolean} `true` if the interaction is active, `false` otherwise.\n * @observable\n * @api\n */\n getActive() {\n return (\n /** @type {boolean} */\n this.get(Nm.ACTIVE)\n );\n }\n /**\n * Get the map associated with this interaction.\n * @return {import(\"../Map.js\").default|null} Map.\n * @api\n */\n getMap() {\n return this.map_;\n }\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event}.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @api\n */\n handleEvent(e) {\n return !0;\n }\n /**\n * Activate or deactivate the interaction.\n * @param {boolean} active Active.\n * @observable\n * @api\n */\n setActive(e) {\n this.set(Nm.ACTIVE, e);\n }\n /**\n * Remove the interaction from its current map and attach it to the new map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default|null} map Map.\n */\n setMap(e) {\n this.map_ = e;\n }\n}\nfunction VU(n, e, t) {\n const i = n.getCenterInternal();\n if (i) {\n const r = [i[0] + e[0], i[1] + e[1]];\n n.animateInternal({\n duration: t !== void 0 ? t : 250,\n easing: qw,\n center: n.getConstrainedCenter(r)\n });\n }\n}\nfunction ld(n, e, t, i) {\n const r = n.getZoom();\n if (r === void 0)\n return;\n const s = n.getConstrainedZoom(r + e), a = n.getResolutionForZoom(s);\n n.getAnimating() && n.cancelAnimations(), n.animate({\n resolution: a,\n anchor: t,\n duration: i !== void 0 ? i : 250,\n easing: Ka\n });\n}\nclass BU extends tl {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n super(), e = e || {}, this.delta_ = e.delta ? e.delta : 1, this.duration_ = e.duration !== void 0 ? e.duration : 250;\n }\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} (if it was a\n * doubleclick) and eventually zooms the map.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n handleEvent(e) {\n let t = !1;\n if (e.type == ui.DBLCLICK) {\n const i = (\n /** @type {MouseEvent} */\n e.originalEvent\n ), r = e.map, s = e.coordinate, a = i.shiftKey ? -this.delta_ : this.delta_, o = r.getView();\n ld(o, a, s, this.duration_), i.preventDefault(), t = !0;\n }\n return !t;\n }\n}\nconst kU = BU;\nclass il extends tl {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n e = e || {}, super(\n /** @type {import(\"./Interaction.js\").InteractionOptions} */\n e\n ), e.handleDownEvent && (this.handleDownEvent = e.handleDownEvent), e.handleDragEvent && (this.handleDragEvent = e.handleDragEvent), e.handleMoveEvent && (this.handleMoveEvent = e.handleMoveEvent), e.handleUpEvent && (this.handleUpEvent = e.handleUpEvent), e.stopDown && (this.stopDown = e.stopDown), this.handlingDownUpSequence = !1, this.targetPointers = [];\n }\n /**\n * Returns the current number of pointers involved in the interaction,\n * e.g. `2` when two fingers are used.\n * @return {number} The number of pointers.\n * @api\n */\n getPointerCount() {\n return this.targetPointers.length;\n }\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @protected\n */\n handleDownEvent(e) {\n return !1;\n }\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @protected\n */\n handleDragEvent(e) {\n }\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} and may call into\n * other functions, if event sequences like e.g. 'drag' or 'down-up' etc. are\n * detected.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @api\n */\n handleEvent(e) {\n if (!e.originalEvent)\n return !0;\n let t = !1;\n if (this.updateTrackedPointers_(e), this.handlingDownUpSequence) {\n if (e.type == ui.POINTERDRAG)\n this.handleDragEvent(e), e.originalEvent.preventDefault();\n else if (e.type == ui.POINTERUP) {\n const i = this.handleUpEvent(e);\n this.handlingDownUpSequence = i && this.targetPointers.length > 0;\n }\n } else if (e.type == ui.POINTERDOWN) {\n const i = this.handleDownEvent(e);\n this.handlingDownUpSequence = i, t = this.stopDown(i);\n } else\n e.type == ui.POINTERMOVE && this.handleMoveEvent(e);\n return !t;\n }\n /**\n * Handle pointer move events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @protected\n */\n handleMoveEvent(e) {\n }\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @protected\n */\n handleUpEvent(e) {\n return !1;\n }\n /**\n * This function is used to determine if \"down\" events should be propagated\n * to other interactions or should be stopped.\n * @param {boolean} handled Was the event handled by the interaction?\n * @return {boolean} Should the `down` event be stopped?\n */\n stopDown(e) {\n return e;\n }\n /**\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @private\n */\n updateTrackedPointers_(e) {\n e.activePointers && (this.targetPointers = e.activePointers);\n }\n}\nfunction cd(n) {\n const e = n.length;\n let t = 0, i = 0;\n for (let r = 0; r < e; r++)\n t += n[r].clientX, i += n[r].clientY;\n return { clientX: t / e, clientY: i / e };\n}\nfunction Ou(n) {\n const e = arguments;\n return function(t) {\n let i = !0;\n for (let r = 0, s = e.length; r < s && (i = i && e[r](t), !!i); ++r)\n ;\n return i;\n };\n}\nconst zU = function(n) {\n const e = (\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n n.originalEvent\n );\n return e.altKey && !(e.metaKey || e.ctrlKey) && e.shiftKey;\n}, WU = function(n) {\n const e = n.map.getTargetElement(), t = n.map.getOwnerDocument().activeElement;\n return e.contains(t);\n}, YE = function(n) {\n return n.map.getTargetElement().hasAttribute(\"tabindex\") ? WU(n) : !0;\n}, GU = uc, ZE = function(n) {\n const e = (\n /** @type {MouseEvent} */\n n.originalEvent\n );\n return e.button == 0 && !(H2 && xE && e.ctrlKey);\n}, jE = function(n) {\n const e = (\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n n.originalEvent\n );\n return !e.altKey && !(e.metaKey || e.ctrlKey) && !e.shiftKey;\n}, XU = function(n) {\n const e = (\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n n.originalEvent\n );\n return xE ? e.metaKey : e.ctrlKey;\n}, HU = function(n) {\n const e = (\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n n.originalEvent\n );\n return !e.altKey && !(e.metaKey || e.ctrlKey) && e.shiftKey;\n}, QE = function(n) {\n const e = (\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n n.originalEvent\n ), t = (\n /** @type {Element} */\n e.target.tagName\n );\n return t !== \"INPUT\" && t !== \"SELECT\" && t !== \"TEXTAREA\" && // `isContentEditable` is only available on `HTMLElement`, but it may also be a\n // different type like `SVGElement`.\n // @ts-ignore\n !e.target.isContentEditable;\n}, tu = function(n) {\n const e = (\n /** @type {import(\"../MapBrowserEvent\").default} */\n n.originalEvent\n );\n return Kt(e !== void 0, 56), e.pointerType == \"mouse\";\n}, KU = function(n) {\n const e = (\n /** @type {import(\"../MapBrowserEvent\").default} */\n n.originalEvent\n );\n return Kt(e !== void 0, 56), e.isPrimary && e.button === 0;\n};\nclass qU extends il {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n super({\n stopDown: Jc\n }), e = e || {}, this.kinetic_ = e.kinetic, this.lastCentroid = null, this.lastPointersCount_, this.panning_ = !1;\n const t = e.condition ? e.condition : Ou(jE, KU);\n this.condition_ = e.onFocusOnly ? Ou(YE, t) : t, this.noKinetic_ = !1;\n }\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(e) {\n const t = e.map;\n this.panning_ || (this.panning_ = !0, t.getView().beginInteraction());\n const i = this.targetPointers, r = t.getEventPixel(cd(i));\n if (i.length == this.lastPointersCount_) {\n if (this.kinetic_ && this.kinetic_.update(r[0], r[1]), this.lastCentroid) {\n const s = [\n this.lastCentroid[0] - r[0],\n r[1] - this.lastCentroid[1]\n ], o = e.map.getView();\n Aw(s, o.getResolution()), qf(s, o.getRotation()), o.adjustCenterInternal(s);\n }\n } else\n this.kinetic_ && this.kinetic_.begin();\n this.lastCentroid = r, this.lastPointersCount_ = i.length, e.originalEvent.preventDefault();\n }\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(e) {\n const t = e.map, i = t.getView();\n if (this.targetPointers.length === 0) {\n if (!this.noKinetic_ && this.kinetic_ && this.kinetic_.end()) {\n const r = this.kinetic_.getDistance(), s = this.kinetic_.getAngle(), a = i.getCenterInternal(), o = t.getPixelFromCoordinateInternal(a), l = t.getCoordinateFromPixelInternal([\n o[0] - r * Math.cos(s),\n o[1] - r * Math.sin(s)\n ]);\n i.animateInternal({\n center: i.getConstrainedCenter(l),\n duration: 500,\n easing: Ka\n });\n }\n return this.panning_ && (this.panning_ = !1, i.endInteraction()), !1;\n }\n return this.kinetic_ && this.kinetic_.begin(), this.lastCentroid = null, !0;\n }\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(e) {\n if (this.targetPointers.length > 0 && this.condition_(e)) {\n const i = e.map.getView();\n return this.lastCentroid = null, i.getAnimating() && i.cancelAnimations(), this.kinetic_ && this.kinetic_.begin(), this.noKinetic_ = this.targetPointers.length > 1, !0;\n }\n return !1;\n }\n}\nconst YU = qU;\nclass ZU extends il {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n e = e || {}, super({\n stopDown: Jc\n }), this.condition_ = e.condition ? e.condition : zU, this.lastAngle_ = void 0, this.duration_ = e.duration !== void 0 ? e.duration : 250;\n }\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(e) {\n if (!tu(e))\n return;\n const t = e.map, i = t.getView();\n if (i.getConstraints().rotation === ed)\n return;\n const r = t.getSize(), s = e.pixel, a = Math.atan2(r[1] / 2 - s[1], s[0] - r[0] / 2);\n if (this.lastAngle_ !== void 0) {\n const o = a - this.lastAngle_;\n i.adjustRotationInternal(-o);\n }\n this.lastAngle_ = a;\n }\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(e) {\n return tu(e) ? (e.map.getView().endInteraction(this.duration_), !1) : !0;\n }\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(e) {\n return tu(e) && ZE(e) && this.condition_(e) ? (e.map.getView().beginInteraction(), this.lastAngle_ = void 0, !0) : !1;\n }\n}\nclass jU extends zf {\n /**\n * @param {string} className CSS class name.\n */\n constructor(e) {\n super(), this.geometry_ = null, this.element_ = document.createElement(\"div\"), this.element_.style.position = \"absolute\", this.element_.style.pointerEvents = \"auto\", this.element_.className = \"ol-box \" + e, this.map_ = null, this.startPixel_ = null, this.endPixel_ = null;\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n this.setMap(null);\n }\n /**\n * @private\n */\n render_() {\n const e = this.startPixel_, t = this.endPixel_, i = \"px\", r = this.element_.style;\n r.left = Math.min(e[0], t[0]) + i, r.top = Math.min(e[1], t[1]) + i, r.width = Math.abs(t[0] - e[0]) + i, r.height = Math.abs(t[1] - e[1]) + i;\n }\n /**\n * @param {import(\"../Map.js\").default|null} map Map.\n */\n setMap(e) {\n if (this.map_) {\n this.map_.getOverlayContainer().removeChild(this.element_);\n const t = this.element_.style;\n t.left = \"inherit\", t.top = \"inherit\", t.width = \"inherit\", t.height = \"inherit\";\n }\n this.map_ = e, this.map_ && this.map_.getOverlayContainer().appendChild(this.element_);\n }\n /**\n * @param {import(\"../pixel.js\").Pixel} startPixel Start pixel.\n * @param {import(\"../pixel.js\").Pixel} endPixel End pixel.\n */\n setPixels(e, t) {\n this.startPixel_ = e, this.endPixel_ = t, this.createOrUpdateGeometry(), this.render_();\n }\n /**\n * Creates or updates the cached geometry.\n */\n createOrUpdateGeometry() {\n const e = this.startPixel_, t = this.endPixel_, r = [\n e,\n [e[0], t[1]],\n t,\n [t[0], e[1]]\n ].map(\n this.map_.getCoordinateFromPixelInternal,\n this.map_\n );\n r[4] = r[0].slice(), this.geometry_ ? this.geometry_.setCoordinates([r]) : this.geometry_ = new No([r]);\n }\n /**\n * @return {import(\"../geom/Polygon.js\").default} Geometry.\n */\n getGeometry() {\n return this.geometry_;\n }\n}\nconst yl = {\n /**\n * Triggered upon drag box start.\n * @event DragBoxEvent#boxstart\n * @api\n */\n BOXSTART: \"boxstart\",\n /**\n * Triggered on drag when box is active.\n * @event DragBoxEvent#boxdrag\n * @api\n */\n BOXDRAG: \"boxdrag\",\n /**\n * Triggered upon drag box end.\n * @event DragBoxEvent#boxend\n * @api\n */\n BOXEND: \"boxend\",\n /**\n * Triggered upon drag box canceled.\n * @event DragBoxEvent#boxcancel\n * @api\n */\n BOXCANCEL: \"boxcancel\"\n};\nclass iu extends dn {\n /**\n * @param {string} type The event type.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate The event coordinate.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Originating event.\n */\n constructor(e, t, i) {\n super(e), this.coordinate = t, this.mapBrowserEvent = i;\n }\n}\nclass QU extends il {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n super(), this.on, this.once, this.un, e = e || {}, this.box_ = new jU(e.className || \"ol-dragbox\"), this.minArea_ = e.minArea !== void 0 ? e.minArea : 64, e.onBoxEnd && (this.onBoxEnd = e.onBoxEnd), this.startPixel_ = null, this.condition_ = e.condition ? e.condition : ZE, this.boxEndCondition_ = e.boxEndCondition ? e.boxEndCondition : this.defaultBoxEndCondition;\n }\n /**\n * The default condition for determining whether the boxend event\n * should fire.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent The originating MapBrowserEvent\n * leading to the box end.\n * @param {import(\"../pixel.js\").Pixel} startPixel The starting pixel of the box.\n * @param {import(\"../pixel.js\").Pixel} endPixel The end pixel of the box.\n * @return {boolean} Whether or not the boxend condition should be fired.\n */\n defaultBoxEndCondition(e, t, i) {\n const r = i[0] - t[0], s = i[1] - t[1];\n return r * r + s * s >= this.minArea_;\n }\n /**\n * Returns geometry of last drawn box.\n * @return {import(\"../geom/Polygon.js\").default} Geometry.\n * @api\n */\n getGeometry() {\n return this.box_.getGeometry();\n }\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(e) {\n this.box_.setPixels(this.startPixel_, e.pixel), this.dispatchEvent(\n new iu(\n yl.BOXDRAG,\n e.coordinate,\n e\n )\n );\n }\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(e) {\n this.box_.setMap(null);\n const t = this.boxEndCondition_(\n e,\n this.startPixel_,\n e.pixel\n );\n return t && this.onBoxEnd(e), this.dispatchEvent(\n new iu(\n t ? yl.BOXEND : yl.BOXCANCEL,\n e.coordinate,\n e\n )\n ), !1;\n }\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(e) {\n return this.condition_(e) ? (this.startPixel_ = e.pixel, this.box_.setMap(e.map), this.box_.setPixels(this.startPixel_, this.startPixel_), this.dispatchEvent(\n new iu(\n yl.BOXSTART,\n e.coordinate,\n e\n )\n ), !0) : !1;\n }\n /**\n * Function to execute just before `onboxend` is fired\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n */\n onBoxEnd(e) {\n }\n}\nclass JU extends QU {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n e = e || {};\n const t = e.condition ? e.condition : HU;\n super({\n condition: t,\n className: e.className || \"ol-dragzoom\",\n minArea: e.minArea\n }), this.duration_ = e.duration !== void 0 ? e.duration : 200, this.out_ = e.out !== void 0 ? e.out : !1;\n }\n /**\n * Function to execute just before `onboxend` is fired\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n */\n onBoxEnd(e) {\n const i = (\n /** @type {!import(\"../View.js\").default} */\n this.getMap().getView()\n );\n let r = this.getGeometry();\n if (this.out_) {\n const s = i.rotatedExtentForGeometry(r), a = i.getResolutionForExtentInternal(s), o = i.getResolution() / a;\n r = r.clone(), r.scale(o * o);\n }\n i.fitInternal(r, {\n duration: this.duration_,\n easing: Ka\n });\n }\n}\nconst $U = JU, Tn = {\n LEFT: \"ArrowLeft\",\n UP: \"ArrowUp\",\n RIGHT: \"ArrowRight\",\n DOWN: \"ArrowDown\"\n};\nclass e3 extends tl {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n super(), e = e || {}, this.defaultCondition_ = function(t) {\n return jE(t) && QE(t);\n }, this.condition_ = e.condition !== void 0 ? e.condition : this.defaultCondition_, this.duration_ = e.duration !== void 0 ? e.duration : 100, this.pixelDelta_ = e.pixelDelta !== void 0 ? e.pixelDelta : 128;\n }\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} if it was a\n * `KeyEvent`, and decides the direction to pan to (if an arrow key was\n * pressed).\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n handleEvent(e) {\n let t = !1;\n if (e.type == St.KEYDOWN) {\n const i = (\n /** @type {KeyboardEvent} */\n e.originalEvent\n ), r = i.key;\n if (this.condition_(e) && (r == Tn.DOWN || r == Tn.LEFT || r == Tn.RIGHT || r == Tn.UP)) {\n const a = e.map.getView(), o = a.getResolution() * this.pixelDelta_;\n let l = 0, c = 0;\n r == Tn.DOWN ? c = -o : r == Tn.LEFT ? l = -o : r == Tn.RIGHT ? l = o : c = o;\n const h = [l, c];\n qf(h, a.getRotation()), VU(a, h, this.duration_), i.preventDefault(), t = !0;\n }\n }\n return !t;\n }\n}\nclass t3 extends tl {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n super(), e = e || {}, this.condition_ = e.condition ? e.condition : function(t) {\n return !XU(t) && QE(t);\n }, this.delta_ = e.delta ? e.delta : 1, this.duration_ = e.duration !== void 0 ? e.duration : 100;\n }\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} if it was a\n * `KeyEvent`, and decides whether to zoom in or out (depending on whether the\n * key pressed was '+' or '-').\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n handleEvent(e) {\n let t = !1;\n if (e.type == St.KEYDOWN || e.type == St.KEYPRESS) {\n const i = (\n /** @type {KeyboardEvent} */\n e.originalEvent\n ), r = i.key;\n if (this.condition_(e) && (r === \"+\" || r === \"-\")) {\n const s = e.map, a = r === \"+\" ? this.delta_ : -this.delta_, o = s.getView();\n ld(o, a, void 0, this.duration_), i.preventDefault(), t = !0;\n }\n }\n return !t;\n }\n}\nconst i3 = t3;\nclass r3 {\n /**\n * @param {number} decay Rate of decay (must be negative).\n * @param {number} minVelocity Minimum velocity (pixels/millisecond).\n * @param {number} delay Delay to consider to calculate the kinetic\n * initial values (milliseconds).\n */\n constructor(e, t, i) {\n this.decay_ = e, this.minVelocity_ = t, this.delay_ = i, this.points_ = [], this.angle_ = 0, this.initialVelocity_ = 0;\n }\n /**\n * FIXME empty description for jsdoc\n */\n begin() {\n this.points_.length = 0, this.angle_ = 0, this.initialVelocity_ = 0;\n }\n /**\n * @param {number} x X.\n * @param {number} y Y.\n */\n update(e, t) {\n this.points_.push(e, t, Date.now());\n }\n /**\n * @return {boolean} Whether we should do kinetic animation.\n */\n end() {\n if (this.points_.length < 6)\n return !1;\n const e = Date.now() - this.delay_, t = this.points_.length - 3;\n if (this.points_[t + 2] < e)\n return !1;\n let i = t - 3;\n for (; i > 0 && this.points_[i + 2] > e; )\n i -= 3;\n const r = this.points_[t + 2] - this.points_[i + 2];\n if (r < 1e3 / 60)\n return !1;\n const s = this.points_[t] - this.points_[i], a = this.points_[t + 1] - this.points_[i + 1];\n return this.angle_ = Math.atan2(a, s), this.initialVelocity_ = Math.sqrt(s * s + a * a) / r, this.initialVelocity_ > this.minVelocity_;\n }\n /**\n * @return {number} Total distance travelled (pixels).\n */\n getDistance() {\n return (this.minVelocity_ - this.initialVelocity_) / this.decay_;\n }\n /**\n * @return {number} Angle of the kinetic panning animation (radians).\n */\n getAngle() {\n return this.angle_;\n }\n}\nclass s3 extends tl {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n e = e || {}, super(\n /** @type {import(\"./Interaction.js\").InteractionOptions} */\n e\n ), this.totalDelta_ = 0, this.lastDelta_ = 0, this.maxDelta_ = e.maxDelta !== void 0 ? e.maxDelta : 1, this.duration_ = e.duration !== void 0 ? e.duration : 250, this.timeout_ = e.timeout !== void 0 ? e.timeout : 80, this.useAnchor_ = e.useAnchor !== void 0 ? e.useAnchor : !0, this.constrainResolution_ = e.constrainResolution !== void 0 ? e.constrainResolution : !1;\n const t = e.condition ? e.condition : GU;\n this.condition_ = e.onFocusOnly ? Ou(YE, t) : t, this.lastAnchor_ = null, this.startTime_ = void 0, this.timeoutId_, this.mode_ = void 0, this.trackpadEventGap_ = 400, this.trackpadTimeoutId_, this.deltaPerZoom_ = 300;\n }\n /**\n * @private\n */\n endInteraction_() {\n this.trackpadTimeoutId_ = void 0;\n const e = this.getMap();\n if (!e)\n return;\n e.getView().endInteraction(\n void 0,\n this.lastDelta_ ? this.lastDelta_ > 0 ? 1 : -1 : 0,\n this.lastAnchor_\n );\n }\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} (if it was a mousewheel-event) and eventually\n * zooms the map.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n handleEvent(e) {\n if (!this.condition_(e) || e.type !== St.WHEEL)\n return !0;\n const i = e.map, r = (\n /** @type {WheelEvent} */\n e.originalEvent\n );\n r.preventDefault(), this.useAnchor_ && (this.lastAnchor_ = e.coordinate);\n let s;\n if (e.type == St.WHEEL && (s = r.deltaY, G2 && r.deltaMode === WheelEvent.DOM_DELTA_PIXEL && (s /= CE), r.deltaMode === WheelEvent.DOM_DELTA_LINE && (s *= 40)), s === 0)\n return !1;\n this.lastDelta_ = s;\n const a = Date.now();\n this.startTime_ === void 0 && (this.startTime_ = a), (!this.mode_ || a - this.startTime_ > this.trackpadEventGap_) && (this.mode_ = Math.abs(s) < 4 ? \"trackpad\" : \"wheel\");\n const o = i.getView();\n if (this.mode_ === \"trackpad\" && !(o.getConstrainResolution() || this.constrainResolution_))\n return this.trackpadTimeoutId_ ? clearTimeout(this.trackpadTimeoutId_) : (o.getAnimating() && o.cancelAnimations(), o.beginInteraction()), this.trackpadTimeoutId_ = setTimeout(\n this.endInteraction_.bind(this),\n this.timeout_\n ), o.adjustZoom(-s / this.deltaPerZoom_, this.lastAnchor_), this.startTime_ = a, !1;\n this.totalDelta_ += s;\n const l = Math.max(this.timeout_ - (a - this.startTime_), 0);\n return clearTimeout(this.timeoutId_), this.timeoutId_ = setTimeout(\n this.handleWheelZoom_.bind(this, i),\n l\n ), !1;\n }\n /**\n * @private\n * @param {import(\"../Map.js\").default} map Map.\n */\n handleWheelZoom_(e) {\n const t = e.getView();\n t.getAnimating() && t.cancelAnimations();\n let i = -Vi(\n this.totalDelta_,\n -this.maxDelta_ * this.deltaPerZoom_,\n this.maxDelta_ * this.deltaPerZoom_\n ) / this.deltaPerZoom_;\n (t.getConstrainResolution() || this.constrainResolution_) && (i = i ? i > 0 ? 1 : -1 : 0), ld(t, i, this.lastAnchor_, this.duration_), this.mode_ = void 0, this.totalDelta_ = 0, this.lastAnchor_ = null, this.startTime_ = void 0, this.timeoutId_ = void 0;\n }\n /**\n * Enable or disable using the mouse's location as an anchor when zooming\n * @param {boolean} useAnchor true to zoom to the mouse's location, false\n * to zoom to the center of the map\n * @api\n */\n setMouseAnchor(e) {\n this.useAnchor_ = e, e || (this.lastAnchor_ = null);\n }\n}\nconst n3 = s3;\nclass a3 extends il {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n e = e || {};\n const t = (\n /** @type {import(\"./Pointer.js\").Options} */\n e\n );\n t.stopDown || (t.stopDown = Jc), super(t), this.anchor_ = null, this.lastAngle_ = void 0, this.rotating_ = !1, this.rotationDelta_ = 0, this.threshold_ = e.threshold !== void 0 ? e.threshold : 0.3, this.duration_ = e.duration !== void 0 ? e.duration : 250;\n }\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(e) {\n let t = 0;\n const i = this.targetPointers[0], r = this.targetPointers[1], s = Math.atan2(\n r.clientY - i.clientY,\n r.clientX - i.clientX\n );\n if (this.lastAngle_ !== void 0) {\n const l = s - this.lastAngle_;\n this.rotationDelta_ += l, !this.rotating_ && Math.abs(this.rotationDelta_) > this.threshold_ && (this.rotating_ = !0), t = l;\n }\n this.lastAngle_ = s;\n const a = e.map, o = a.getView();\n o.getConstraints().rotation !== ed && (this.anchor_ = a.getCoordinateFromPixelInternal(\n a.getEventPixel(cd(this.targetPointers))\n ), this.rotating_ && (a.render(), o.adjustRotationInternal(t, this.anchor_)));\n }\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(e) {\n return this.targetPointers.length < 2 ? (e.map.getView().endInteraction(this.duration_), !1) : !0;\n }\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(e) {\n if (this.targetPointers.length >= 2) {\n const t = e.map;\n return this.anchor_ = null, this.lastAngle_ = void 0, this.rotating_ = !1, this.rotationDelta_ = 0, this.handlingDownUpSequence || t.getView().beginInteraction(), !0;\n }\n return !1;\n }\n}\nclass o3 extends il {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n e = e || {};\n const t = (\n /** @type {import(\"./Pointer.js\").Options} */\n e\n );\n t.stopDown || (t.stopDown = Jc), super(t), this.anchor_ = null, this.duration_ = e.duration !== void 0 ? e.duration : 400, this.lastDistance_ = void 0, this.lastScaleDelta_ = 1;\n }\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(e) {\n let t = 1;\n const i = this.targetPointers[0], r = this.targetPointers[1], s = i.clientX - r.clientX, a = i.clientY - r.clientY, o = Math.sqrt(s * s + a * a);\n this.lastDistance_ !== void 0 && (t = this.lastDistance_ / o), this.lastDistance_ = o;\n const l = e.map, c = l.getView();\n t != 1 && (this.lastScaleDelta_ = t), this.anchor_ = l.getCoordinateFromPixelInternal(\n l.getEventPixel(cd(this.targetPointers))\n ), l.render(), c.adjustResolutionInternal(t, this.anchor_);\n }\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(e) {\n if (this.targetPointers.length < 2) {\n const i = e.map.getView(), r = this.lastScaleDelta_ > 1 ? 1 : -1;\n return i.endInteraction(this.duration_, r), !1;\n }\n return !0;\n }\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(e) {\n if (this.targetPointers.length >= 2) {\n const t = e.map;\n return this.anchor_ = null, this.lastDistance_ = void 0, this.lastScaleDelta_ = 1, this.handlingDownUpSequence || t.getView().beginInteraction(), !0;\n }\n return !1;\n }\n}\nconst l3 = o3;\nfunction c3(n) {\n n = n || {};\n const e = new Us(), t = new r3(-5e-3, 0.05, 100);\n return (n.altShiftDragRotate !== void 0 ? n.altShiftDragRotate : !0) && e.push(new ZU()), (n.doubleClickZoom !== void 0 ? n.doubleClickZoom : !0) && e.push(\n new kU({\n delta: n.zoomDelta,\n duration: n.zoomDuration\n })\n ), (n.dragPan !== void 0 ? n.dragPan : !0) && e.push(\n new YU({\n onFocusOnly: n.onFocusOnly,\n kinetic: t\n })\n ), (n.pinchRotate !== void 0 ? n.pinchRotate : !0) && e.push(new a3()), (n.pinchZoom !== void 0 ? n.pinchZoom : !0) && e.push(\n new l3({\n duration: n.zoomDuration\n })\n ), (n.keyboard !== void 0 ? n.keyboard : !0) && (e.push(new e3()), e.push(\n new i3({\n delta: n.zoomDelta,\n duration: n.zoomDuration\n })\n )), (n.mouseWheelZoom !== void 0 ? n.mouseWheelZoom : !0) && e.push(\n new n3({\n onFocusOnly: n.onFocusOnly,\n duration: n.zoomDuration\n })\n ), (n.shiftDragZoom !== void 0 ? n.shiftDragZoom : !0) && e.push(\n new $U({\n duration: n.zoomDuration\n })\n ), e;\n}\nfunction Fm(n) {\n return n[0] > 0 && n[1] > 0;\n}\nfunction h3(n, e, t) {\n return t === void 0 && (t = [0, 0]), t[0] = n[0] * e + 0.5 | 0, t[1] = n[1] * e + 0.5 | 0, t;\n}\nfunction sn(n, e) {\n return Array.isArray(n) ? n : (e === void 0 ? e = [n, n] : (e[0] = n, e[1] = n), e);\n}\nfunction JE(n) {\n if (n instanceof sd) {\n n.setMapInternal(null);\n return;\n }\n n instanceof qa && n.getLayers().forEach(JE);\n}\nfunction $E(n, e) {\n if (n instanceof sd) {\n n.setMapInternal(e);\n return;\n }\n if (n instanceof qa) {\n const t = n.getLayers().getArray();\n for (let i = 0, r = t.length; i < r; ++i)\n $E(t[i], e);\n }\n}\nlet ev = class extends Ws {\n /**\n * @param {MapOptions} [options] Map options.\n */\n constructor(e) {\n super(), e = e || {}, this.on, this.once, this.un;\n const t = u3(e);\n this.renderComplete_, this.loaded_ = !0, this.boundHandleBrowserEvent_ = this.handleBrowserEvent.bind(this), this.maxTilesLoading_ = e.maxTilesLoading !== void 0 ? e.maxTilesLoading : 16, this.pixelRatio_ = e.pixelRatio !== void 0 ? e.pixelRatio : CE, this.postRenderTimeoutHandle_, this.animationDelayKey_, this.animationDelay_ = this.animationDelay_.bind(this), this.coordinateToPixelTransform_ = xa(), this.pixelToCoordinateTransform_ = xa(), this.frameIndex_ = 0, this.frameState_ = null, this.previousExtent_ = null, this.viewPropertyListenerKey_ = null, this.viewChangeListenerKey_ = null, this.layerGroupPropertyListenerKeys_ = null, this.viewport_ = document.createElement(\"div\"), this.viewport_.className = \"ol-viewport\" + (\"ontouchstart\" in window ? \" ol-touch\" : \"\"), this.viewport_.style.position = \"relative\", this.viewport_.style.overflow = \"hidden\", this.viewport_.style.width = \"100%\", this.viewport_.style.height = \"100%\", this.overlayContainer_ = document.createElement(\"div\"), this.overlayContainer_.style.position = \"absolute\", this.overlayContainer_.style.zIndex = \"0\", this.overlayContainer_.style.width = \"100%\", this.overlayContainer_.style.height = \"100%\", this.overlayContainer_.style.pointerEvents = \"none\", this.overlayContainer_.className = \"ol-overlaycontainer\", this.viewport_.appendChild(this.overlayContainer_), this.overlayContainerStopEvent_ = document.createElement(\"div\"), this.overlayContainerStopEvent_.style.position = \"absolute\", this.overlayContainerStopEvent_.style.zIndex = \"0\", this.overlayContainerStopEvent_.style.width = \"100%\", this.overlayContainerStopEvent_.style.height = \"100%\", this.overlayContainerStopEvent_.style.pointerEvents = \"none\", this.overlayContainerStopEvent_.className = \"ol-overlaycontainer-stopevent\", this.viewport_.appendChild(this.overlayContainerStopEvent_), this.mapBrowserEventHandler_ = null, this.moveTolerance_ = e.moveTolerance, this.keyboardEventTarget_ = t.keyboardEventTarget, this.targetChangeHandlerKeys_ = null, this.targetElement_ = null, this.resizeObserver_ = new ResizeObserver(() => this.updateSize()), this.controls = t.controls || UU(), this.interactions = t.interactions || c3({\n onFocusOnly: !0\n }), this.overlays_ = t.overlays, this.overlayIdIndex_ = {}, this.renderer_ = null, this.postRenderFunctions_ = [], this.tileQueue_ = new MU(\n this.getTilePriority.bind(this),\n this.handleTileChange_.bind(this)\n ), this.addChangeListener(\n Ki.LAYERGROUP,\n this.handleLayerGroupChanged_\n ), this.addChangeListener(Ki.VIEW, this.handleViewChanged_), this.addChangeListener(Ki.SIZE, this.handleSizeChanged_), this.addChangeListener(Ki.TARGET, this.handleTargetChanged_), this.setProperties(t.values);\n const i = this;\n e.view && !(e.view instanceof jr) && e.view.then(function(r) {\n i.setView(new jr(r));\n }), this.controls.addEventListener(\n Dr.ADD,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent\n */\n (r) => {\n r.element.setMap(this);\n }\n ), this.controls.addEventListener(\n Dr.REMOVE,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (r) => {\n r.element.setMap(null);\n }\n ), this.interactions.addEventListener(\n Dr.ADD,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (r) => {\n r.element.setMap(this);\n }\n ), this.interactions.addEventListener(\n Dr.REMOVE,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (r) => {\n r.element.setMap(null);\n }\n ), this.overlays_.addEventListener(\n Dr.ADD,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (r) => {\n this.addOverlayInternal_(r.element);\n }\n ), this.overlays_.addEventListener(\n Dr.REMOVE,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (r) => {\n const s = r.element.getId();\n s !== void 0 && delete this.overlayIdIndex_[s.toString()], r.element.setMap(null);\n }\n ), this.controls.forEach(\n /**\n * @param {import(\"./control/Control.js\").default} control Control.\n */\n (r) => {\n r.setMap(this);\n }\n ), this.interactions.forEach(\n /**\n * @param {import(\"./interaction/Interaction.js\").default} interaction Interaction.\n */\n (r) => {\n r.setMap(this);\n }\n ), this.overlays_.forEach(this.addOverlayInternal_.bind(this));\n }\n /**\n * Add the given control to the map.\n * @param {import(\"./control/Control.js\").default} control Control.\n * @api\n */\n addControl(e) {\n this.getControls().push(e);\n }\n /**\n * Add the given interaction to the map. If you want to add an interaction\n * at another point of the collection use `getInteractions()` and the methods\n * available on {@link module:ol/Collection~Collection}. This can be used to\n * stop the event propagation from the handleEvent function. The interactions\n * get to handle the events in the reverse order of this collection.\n * @param {import(\"./interaction/Interaction.js\").default} interaction Interaction to add.\n * @api\n */\n addInteraction(e) {\n this.getInteractions().push(e);\n }\n /**\n * Adds the given layer to the top of this map. If you want to add a layer\n * elsewhere in the stack, use `getLayers()` and the methods available on\n * {@link module:ol/Collection~Collection}.\n * @param {import(\"./layer/Base.js\").default} layer Layer.\n * @api\n */\n addLayer(e) {\n this.getLayerGroup().getLayers().push(e);\n }\n /**\n * @param {import(\"./layer/Group.js\").GroupEvent} event The layer add event.\n * @private\n */\n handleLayerAdd_(e) {\n $E(e.layer, this);\n }\n /**\n * Add the given overlay to the map.\n * @param {import(\"./Overlay.js\").default} overlay Overlay.\n * @api\n */\n addOverlay(e) {\n this.getOverlays().push(e);\n }\n /**\n * This deals with map's overlay collection changes.\n * @param {import(\"./Overlay.js\").default} overlay Overlay.\n * @private\n */\n addOverlayInternal_(e) {\n const t = e.getId();\n t !== void 0 && (this.overlayIdIndex_[t.toString()] = e), e.setMap(this);\n }\n /**\n *\n * Clean up.\n */\n disposeInternal() {\n this.controls.clear(), this.interactions.clear(), this.overlays_.clear(), this.resizeObserver_.disconnect(), this.setTarget(null), super.disposeInternal();\n }\n /**\n * Detect features that intersect a pixel on the viewport, and execute a\n * callback with each intersecting feature. Layers included in the detection can\n * be configured through the `layerFilter` option in `options`.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel.\n * @param {function(import(\"./Feature.js\").FeatureLike, import(\"./layer/Layer.js\").default, import(\"./geom/SimpleGeometry.js\").default): T} callback Feature callback. The callback will be\n * called with two arguments. The first argument is one\n * {@link module:ol/Feature~Feature feature} or\n * {@link module:ol/render/Feature~RenderFeature render feature} at the pixel, the second is\n * the {@link module:ol/layer/Layer~Layer layer} of the feature and will be null for\n * unmanaged layers. To stop detection, callback functions can return a\n * truthy value.\n * @param {AtPixelOptions} [options] Optional options.\n * @return {T|undefined} Callback result, i.e. the return value of last\n * callback execution, or the first truthy callback return value.\n * @template T\n * @api\n */\n forEachFeatureAtPixel(e, t, i) {\n if (!this.frameState_ || !this.renderer_)\n return;\n const r = this.getCoordinateFromPixelInternal(e);\n i = i !== void 0 ? i : {};\n const s = i.hitTolerance !== void 0 ? i.hitTolerance : 0, a = i.layerFilter !== void 0 ? i.layerFilter : uc, o = i.checkWrapped !== !1;\n return this.renderer_.forEachFeatureAtCoordinate(\n r,\n this.frameState_,\n s,\n o,\n t,\n null,\n a,\n null\n );\n }\n /**\n * Get all features that intersect a pixel on the viewport.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel.\n * @param {AtPixelOptions} [options] Optional options.\n * @return {Array} The detected features or\n * an empty array if none were found.\n * @api\n */\n getFeaturesAtPixel(e, t) {\n const i = [];\n return this.forEachFeatureAtPixel(\n e,\n function(r) {\n i.push(r);\n },\n t\n ), i;\n }\n /**\n * Get all layers from all layer groups.\n * @return {Array} Layers.\n * @api\n */\n getAllLayers() {\n const e = [];\n function t(i) {\n i.forEach(function(r) {\n r instanceof qa ? t(r.getLayers()) : e.push(r);\n });\n }\n return t(this.getLayers()), e;\n }\n /**\n * Detect if features intersect a pixel on the viewport. Layers included in the\n * detection can be configured through the `layerFilter` option.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel.\n * @param {AtPixelOptions} [options] Optional options.\n * @return {boolean} Is there a feature at the given pixel?\n * @api\n */\n hasFeatureAtPixel(e, t) {\n if (!this.frameState_ || !this.renderer_)\n return !1;\n const i = this.getCoordinateFromPixelInternal(e);\n t = t !== void 0 ? t : {};\n const r = t.layerFilter !== void 0 ? t.layerFilter : uc, s = t.hitTolerance !== void 0 ? t.hitTolerance : 0, a = t.checkWrapped !== !1;\n return this.renderer_.hasFeatureAtCoordinate(\n i,\n this.frameState_,\n s,\n a,\n r,\n null\n );\n }\n /**\n * Returns the coordinate in user projection for a browser event.\n * @param {MouseEvent} event Event.\n * @return {import(\"./coordinate.js\").Coordinate} Coordinate.\n * @api\n */\n getEventCoordinate(e) {\n return this.getCoordinateFromPixel(this.getEventPixel(e));\n }\n /**\n * Returns the coordinate in view projection for a browser event.\n * @param {MouseEvent} event Event.\n * @return {import(\"./coordinate.js\").Coordinate} Coordinate.\n */\n getEventCoordinateInternal(e) {\n return this.getCoordinateFromPixelInternal(this.getEventPixel(e));\n }\n /**\n * Returns the map pixel position for a browser event relative to the viewport.\n * @param {UIEvent|{clientX: number, clientY: number}} event Event.\n * @return {import(\"./pixel.js\").Pixel} Pixel.\n * @api\n */\n getEventPixel(e) {\n const i = this.viewport_.getBoundingClientRect(), r = this.getSize(), s = i.width / r[0], a = i.height / r[1], o = (\n //FIXME Are we really calling this with a TouchEvent anywhere?\n \"changedTouches\" in e ? (\n /** @type {TouchEvent} */\n e.changedTouches[0]\n ) : (\n /** @type {MouseEvent} */\n e\n )\n );\n return [\n (o.clientX - i.left) / s,\n (o.clientY - i.top) / a\n ];\n }\n /**\n * Get the target in which this map is rendered.\n * Note that this returns what is entered as an option or in setTarget:\n * if that was an element, it returns an element; if a string, it returns that.\n * @return {HTMLElement|string|undefined} The Element or id of the Element that the\n * map is rendered in.\n * @observable\n * @api\n */\n getTarget() {\n return (\n /** @type {HTMLElement|string|undefined} */\n this.get(Ki.TARGET)\n );\n }\n /**\n * Get the DOM element into which this map is rendered. In contrast to\n * `getTarget` this method always return an `Element`, or `null` if the\n * map has no target.\n * @return {HTMLElement} The element that the map is rendered in.\n * @api\n */\n getTargetElement() {\n return this.targetElement_;\n }\n /**\n * Get the coordinate for a given pixel. This returns a coordinate in the\n * user projection.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel position in the map viewport.\n * @return {import(\"./coordinate.js\").Coordinate} The coordinate for the pixel position.\n * @api\n */\n getCoordinateFromPixel(e) {\n return Au(\n this.getCoordinateFromPixelInternal(e),\n this.getView().getProjection()\n );\n }\n /**\n * Get the coordinate for a given pixel. This returns a coordinate in the\n * map view projection.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel position in the map viewport.\n * @return {import(\"./coordinate.js\").Coordinate} The coordinate for the pixel position.\n */\n getCoordinateFromPixelInternal(e) {\n const t = this.frameState_;\n return t ? Ar(t.pixelToCoordinateTransform, e.slice()) : null;\n }\n /**\n * Get the map controls. Modifying this collection changes the controls\n * associated with the map.\n * @return {Collection} Controls.\n * @api\n */\n getControls() {\n return this.controls;\n }\n /**\n * Get the map overlays. Modifying this collection changes the overlays\n * associated with the map.\n * @return {Collection} Overlays.\n * @api\n */\n getOverlays() {\n return this.overlays_;\n }\n /**\n * Get an overlay by its identifier (the value returned by overlay.getId()).\n * Note that the index treats string and numeric identifiers as the same. So\n * `map.getOverlayById(2)` will return an overlay with id `'2'` or `2`.\n * @param {string|number} id Overlay identifier.\n * @return {import(\"./Overlay.js\").default} Overlay.\n * @api\n */\n getOverlayById(e) {\n const t = this.overlayIdIndex_[e.toString()];\n return t !== void 0 ? t : null;\n }\n /**\n * Get the map interactions. Modifying this collection changes the interactions\n * associated with the map.\n *\n * Interactions are used for e.g. pan, zoom and rotate.\n * @return {Collection} Interactions.\n * @api\n */\n getInteractions() {\n return this.interactions;\n }\n /**\n * Get the layergroup associated with this map.\n * @return {LayerGroup} A layer group containing the layers in this map.\n * @observable\n * @api\n */\n getLayerGroup() {\n return (\n /** @type {LayerGroup} */\n this.get(Ki.LAYERGROUP)\n );\n }\n /**\n * Clear any existing layers and add layers to the map.\n * @param {Array|Collection} layers The layers to be added to the map.\n * @api\n */\n setLayers(e) {\n const t = this.getLayerGroup();\n if (e instanceof Us) {\n t.setLayers(e);\n return;\n }\n const i = t.getLayers();\n i.clear(), i.extend(e);\n }\n /**\n * Get the collection of layers associated with this map.\n * @return {!Collection} Layers.\n * @api\n */\n getLayers() {\n return this.getLayerGroup().getLayers();\n }\n /**\n * @return {boolean} Layers have sources that are still loading.\n */\n getLoadingOrNotReady() {\n const e = this.getLayerGroup().getLayerStatesArray();\n for (let t = 0, i = e.length; t < i; ++t) {\n const r = e[t];\n if (!r.visible)\n continue;\n const s = r.layer.getRenderer();\n if (s && !s.ready)\n return !0;\n const a = r.layer.getSource();\n if (a && a.loading)\n return !0;\n }\n return !1;\n }\n /**\n * Get the pixel for a coordinate. This takes a coordinate in the user\n * projection and returns the corresponding pixel.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate A map coordinate.\n * @return {import(\"./pixel.js\").Pixel} A pixel position in the map viewport.\n * @api\n */\n getPixelFromCoordinate(e) {\n const t = Ps(\n e,\n this.getView().getProjection()\n );\n return this.getPixelFromCoordinateInternal(t);\n }\n /**\n * Get the pixel for a coordinate. This takes a coordinate in the map view\n * projection and returns the corresponding pixel.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate A map coordinate.\n * @return {import(\"./pixel.js\").Pixel} A pixel position in the map viewport.\n */\n getPixelFromCoordinateInternal(e) {\n const t = this.frameState_;\n return t ? Ar(\n t.coordinateToPixelTransform,\n e.slice(0, 2)\n ) : null;\n }\n /**\n * Get the map renderer.\n * @return {import(\"./renderer/Map.js\").default|null} Renderer\n */\n getRenderer() {\n return this.renderer_;\n }\n /**\n * Get the size of this map.\n * @return {import(\"./size.js\").Size|undefined} The size in pixels of the map in the DOM.\n * @observable\n * @api\n */\n getSize() {\n return (\n /** @type {import(\"./size.js\").Size|undefined} */\n this.get(Ki.SIZE)\n );\n }\n /**\n * Get the view associated with this map. A view manages properties such as\n * center and resolution.\n * @return {View} The view that controls this map.\n * @observable\n * @api\n */\n getView() {\n return (\n /** @type {View} */\n this.get(Ki.VIEW)\n );\n }\n /**\n * Get the element that serves as the map viewport.\n * @return {HTMLElement} Viewport.\n * @api\n */\n getViewport() {\n return this.viewport_;\n }\n /**\n * Get the element that serves as the container for overlays. Elements added to\n * this container will let mousedown and touchstart events through to the map,\n * so clicks and gestures on an overlay will trigger {@link module:ol/MapBrowserEvent~MapBrowserEvent}\n * events.\n * @return {!HTMLElement} The map's overlay container.\n */\n getOverlayContainer() {\n return this.overlayContainer_;\n }\n /**\n * Get the element that serves as a container for overlays that don't allow\n * event propagation. Elements added to this container won't let mousedown and\n * touchstart events through to the map, so clicks and gestures on an overlay\n * don't trigger any {@link module:ol/MapBrowserEvent~MapBrowserEvent}.\n * @return {!HTMLElement} The map's overlay container that stops events.\n */\n getOverlayContainerStopEvent() {\n return this.overlayContainerStopEvent_;\n }\n /**\n * @return {!Document} The document where the map is displayed.\n */\n getOwnerDocument() {\n const e = this.getTargetElement();\n return e ? e.ownerDocument : document;\n }\n /**\n * @param {import(\"./Tile.js\").default} tile Tile.\n * @param {string} tileSourceKey Tile source key.\n * @param {import(\"./coordinate.js\").Coordinate} tileCenter Tile center.\n * @param {number} tileResolution Tile resolution.\n * @return {number} Tile priority.\n */\n getTilePriority(e, t, i, r) {\n return PU(\n this.frameState_,\n e,\n t,\n i,\n r\n );\n }\n /**\n * @param {UIEvent} browserEvent Browser event.\n * @param {string} [type] Type.\n */\n handleBrowserEvent(e, t) {\n t = t || e.type;\n const i = new Js(t, this, e);\n this.handleMapBrowserEvent(i);\n }\n /**\n * @param {MapBrowserEvent} mapBrowserEvent The event to handle.\n */\n handleMapBrowserEvent(e) {\n if (!this.frameState_)\n return;\n const t = (\n /** @type {PointerEvent} */\n e.originalEvent\n ), i = t.type;\n if (i === Pu.POINTERDOWN || i === St.WHEEL || i === St.KEYDOWN) {\n const r = this.getOwnerDocument(), s = this.viewport_.getRootNode ? this.viewport_.getRootNode() : r, a = (\n /** @type {Node} */\n t.target\n );\n if (\n // Abort if the target is a child of the container for elements whose events are not meant\n // to be handled by map interactions.\n this.overlayContainerStopEvent_.contains(a) || // Abort if the event target is a child of the container that is no longer in the page.\n // It's possible for the target to no longer be in the page if it has been removed in an\n // event listener, this might happen in a Control that recreates it's content based on\n // user interaction either manually or via a render in something like https://reactjs.org/\n !(s === r ? r.documentElement : s).contains(a)\n )\n return;\n }\n if (e.frameState = this.frameState_, this.dispatchEvent(e) !== !1) {\n const r = this.getInteractions().getArray().slice();\n for (let s = r.length - 1; s >= 0; s--) {\n const a = r[s];\n if (a.getMap() !== this || !a.getActive() || !this.getTargetElement())\n continue;\n if (!a.handleEvent(e) || e.propagationStopped)\n break;\n }\n }\n }\n /**\n * @protected\n */\n handlePostRender() {\n const e = this.frameState_, t = this.tileQueue_;\n if (!t.isEmpty()) {\n let r = this.maxTilesLoading_, s = r;\n if (e) {\n const a = e.viewHints;\n if (a[Mr.ANIMATING] || a[Mr.INTERACTING]) {\n const o = Date.now() - e.time > 8;\n r = o ? 0 : 8, s = o ? 0 : 2;\n }\n }\n t.getTilesLoading() < r && (t.reprioritize(), t.loadMoreTiles(r, s));\n }\n e && this.renderer_ && !e.animate && (this.renderComplete_ === !0 ? (this.hasListener(nn.RENDERCOMPLETE) && this.renderer_.dispatchRenderEvent(\n nn.RENDERCOMPLETE,\n e\n ), this.loaded_ === !1 && (this.loaded_ = !0, this.dispatchEvent(\n new oa($s.LOADEND, this, e)\n ))) : this.loaded_ === !0 && (this.loaded_ = !1, this.dispatchEvent(\n new oa($s.LOADSTART, this, e)\n )));\n const i = this.postRenderFunctions_;\n for (let r = 0, s = i.length; r < s; ++r)\n i[r](this, e);\n i.length = 0;\n }\n /**\n * @private\n */\n handleSizeChanged_() {\n this.getView() && !this.getView().getAnimating() && this.getView().resolveConstraints(0), this.render();\n }\n /**\n * @private\n */\n handleTargetChanged_() {\n if (this.mapBrowserEventHandler_) {\n for (let i = 0, r = this.targetChangeHandlerKeys_.length; i < r; ++i)\n Ei(this.targetChangeHandlerKeys_[i]);\n this.targetChangeHandlerKeys_ = null, this.viewport_.removeEventListener(\n St.CONTEXTMENU,\n this.boundHandleBrowserEvent_\n ), this.viewport_.removeEventListener(\n St.WHEEL,\n this.boundHandleBrowserEvent_\n ), this.mapBrowserEventHandler_.dispose(), this.mapBrowserEventHandler_ = null, Mu(this.viewport_);\n }\n if (this.targetElement_) {\n this.resizeObserver_.unobserve(this.targetElement_);\n const i = this.targetElement_.getRootNode();\n i instanceof ShadowRoot && this.resizeObserver_.unobserve(i.host), this.setSize(void 0);\n }\n const e = this.getTarget(), t = typeof e == \"string\" ? document.getElementById(e) : e;\n if (this.targetElement_ = t, !t)\n this.renderer_ && (clearTimeout(this.postRenderTimeoutHandle_), this.postRenderTimeoutHandle_ = void 0, this.postRenderFunctions_.length = 0, this.renderer_.dispose(), this.renderer_ = null), this.animationDelayKey_ && (cancelAnimationFrame(this.animationDelayKey_), this.animationDelayKey_ = void 0);\n else {\n t.appendChild(this.viewport_), this.renderer_ || (this.renderer_ = new IU(this)), this.mapBrowserEventHandler_ = new bU(\n this,\n this.moveTolerance_\n );\n for (const s in ui)\n this.mapBrowserEventHandler_.addEventListener(\n ui[s],\n this.handleMapBrowserEvent.bind(this)\n );\n this.viewport_.addEventListener(\n St.CONTEXTMENU,\n this.boundHandleBrowserEvent_,\n !1\n ), this.viewport_.addEventListener(\n St.WHEEL,\n this.boundHandleBrowserEvent_,\n SE ? { passive: !1 } : !1\n );\n const i = this.keyboardEventTarget_ ? this.keyboardEventTarget_ : t;\n this.targetChangeHandlerKeys_ = [\n Ht(\n i,\n St.KEYDOWN,\n this.handleBrowserEvent,\n this\n ),\n Ht(\n i,\n St.KEYPRESS,\n this.handleBrowserEvent,\n this\n )\n ];\n const r = t.getRootNode();\n r instanceof ShadowRoot && this.resizeObserver_.observe(r.host), this.resizeObserver_.observe(t);\n }\n this.updateSize();\n }\n /**\n * @private\n */\n handleTileChange_() {\n this.render();\n }\n /**\n * @private\n */\n handleViewPropertyChanged_() {\n this.render();\n }\n /**\n * @private\n */\n handleViewChanged_() {\n this.viewPropertyListenerKey_ && (Ei(this.viewPropertyListenerKey_), this.viewPropertyListenerKey_ = null), this.viewChangeListenerKey_ && (Ei(this.viewChangeListenerKey_), this.viewChangeListenerKey_ = null);\n const e = this.getView();\n e && (this.updateViewportSize_(), this.viewPropertyListenerKey_ = Ht(\n e,\n bo.PROPERTYCHANGE,\n this.handleViewPropertyChanged_,\n this\n ), this.viewChangeListenerKey_ = Ht(\n e,\n St.CHANGE,\n this.handleViewPropertyChanged_,\n this\n ), e.resolveConstraints(0)), this.render();\n }\n /**\n * @private\n */\n handleLayerGroupChanged_() {\n this.layerGroupPropertyListenerKeys_ && (this.layerGroupPropertyListenerKeys_.forEach(Ei), this.layerGroupPropertyListenerKeys_ = null);\n const e = this.getLayerGroup();\n e && (this.handleLayerAdd_(new tn(\"addlayer\", e)), this.layerGroupPropertyListenerKeys_ = [\n Ht(e, bo.PROPERTYCHANGE, this.render, this),\n Ht(e, St.CHANGE, this.render, this),\n Ht(e, \"addlayer\", this.handleLayerAdd_, this),\n Ht(e, \"removelayer\", this.handleLayerRemove_, this)\n ]), this.render();\n }\n /**\n * @return {boolean} Is rendered.\n */\n isRendered() {\n return !!this.frameState_;\n }\n /**\n * @private\n */\n animationDelay_() {\n this.animationDelayKey_ = void 0, this.renderFrame_(Date.now());\n }\n /**\n * Requests an immediate render in a synchronous manner.\n * @api\n */\n renderSync() {\n this.animationDelayKey_ && cancelAnimationFrame(this.animationDelayKey_), this.animationDelay_();\n }\n /**\n * Redraws all text after new fonts have loaded\n */\n redrawText() {\n const e = this.getLayerGroup().getLayerStatesArray();\n for (let t = 0, i = e.length; t < i; ++t) {\n const r = e[t].layer;\n r.hasRenderer() && r.getRenderer().handleFontsChanged();\n }\n }\n /**\n * Request a map rendering (at the next animation frame).\n * @api\n */\n render() {\n this.renderer_ && this.animationDelayKey_ === void 0 && (this.animationDelayKey_ = requestAnimationFrame(this.animationDelay_));\n }\n /**\n * This method is meant to be called in a layer's `prerender` listener. It causes all collected\n * declutter items to be decluttered and rendered on the map immediately. This is useful for\n * layers that need to appear entirely above the decluttered items of layers lower in the layer\n * stack.\n * @api\n */\n flushDeclutterItems() {\n const e = this.frameState_;\n e && this.renderer_.flushDeclutterItems(e);\n }\n /**\n * Remove the given control from the map.\n * @param {import(\"./control/Control.js\").default} control Control.\n * @return {import(\"./control/Control.js\").default|undefined} The removed control (or undefined\n * if the control was not found).\n * @api\n */\n removeControl(e) {\n return this.getControls().remove(e);\n }\n /**\n * Remove the given interaction from the map.\n * @param {import(\"./interaction/Interaction.js\").default} interaction Interaction to remove.\n * @return {import(\"./interaction/Interaction.js\").default|undefined} The removed interaction (or\n * undefined if the interaction was not found).\n * @api\n */\n removeInteraction(e) {\n return this.getInteractions().remove(e);\n }\n /**\n * Removes the given layer from the map.\n * @param {import(\"./layer/Base.js\").default} layer Layer.\n * @return {import(\"./layer/Base.js\").default|undefined} The removed layer (or undefined if the\n * layer was not found).\n * @api\n */\n removeLayer(e) {\n return this.getLayerGroup().getLayers().remove(e);\n }\n /**\n * @param {import(\"./layer/Group.js\").GroupEvent} event The layer remove event.\n * @private\n */\n handleLayerRemove_(e) {\n JE(e.layer);\n }\n /**\n * Remove the given overlay from the map.\n * @param {import(\"./Overlay.js\").default} overlay Overlay.\n * @return {import(\"./Overlay.js\").default|undefined} The removed overlay (or undefined\n * if the overlay was not found).\n * @api\n */\n removeOverlay(e) {\n return this.getOverlays().remove(e);\n }\n /**\n * @param {number} time Time.\n * @private\n */\n renderFrame_(e) {\n const t = this.getSize(), i = this.getView(), r = this.frameState_;\n let s = null;\n if (t !== void 0 && Fm(t) && i && i.isDef()) {\n const a = i.getHints(\n this.frameState_ ? this.frameState_.viewHints : void 0\n ), o = i.getState();\n if (s = {\n animate: !1,\n coordinateToPixelTransform: this.coordinateToPixelTransform_,\n declutterTree: null,\n extent: Su(\n o.center,\n o.resolution,\n o.rotation,\n t\n ),\n index: this.frameIndex_++,\n layerIndex: 0,\n layerStatesArray: this.getLayerGroup().getLayerStatesArray(),\n pixelRatio: this.pixelRatio_,\n pixelToCoordinateTransform: this.pixelToCoordinateTransform_,\n postRenderFunctions: [],\n size: t,\n tileQueue: this.tileQueue_,\n time: e,\n usedTiles: {},\n viewState: o,\n viewHints: a,\n wantedTiles: {},\n mapId: ur(this),\n renderTargets: {}\n }, o.nextCenter && o.nextResolution) {\n const l = isNaN(o.nextRotation) ? o.rotation : o.nextRotation;\n s.nextExtent = Su(\n o.nextCenter,\n o.nextResolution,\n l,\n t\n );\n }\n }\n this.frameState_ = s, this.renderer_.renderFrame(s), s && (s.animate && this.render(), Array.prototype.push.apply(\n this.postRenderFunctions_,\n s.postRenderFunctions\n ), r && (!this.previousExtent_ || !$o(this.previousExtent_) && !Cu(s.extent, this.previousExtent_)) && (this.dispatchEvent(\n new oa($s.MOVESTART, this, r)\n ), this.previousExtent_ = Qo(this.previousExtent_)), this.previousExtent_ && !s.viewHints[Mr.ANIMATING] && !s.viewHints[Mr.INTERACTING] && !Cu(s.extent, this.previousExtent_) && (this.dispatchEvent(\n new oa($s.MOVEEND, this, s)\n ), j2(s.extent, this.previousExtent_))), this.dispatchEvent(new oa($s.POSTRENDER, this, s)), this.renderComplete_ = this.hasListener($s.LOADSTART) || this.hasListener($s.LOADEND) || this.hasListener(nn.RENDERCOMPLETE) ? !this.tileQueue_.getTilesLoading() && !this.tileQueue_.getCount() && !this.getLoadingOrNotReady() : void 0, this.postRenderTimeoutHandle_ || (this.postRenderTimeoutHandle_ = setTimeout(() => {\n this.postRenderTimeoutHandle_ = void 0, this.handlePostRender();\n }, 0));\n }\n /**\n * Sets the layergroup of this map.\n * @param {LayerGroup} layerGroup A layer group containing the layers in this map.\n * @observable\n * @api\n */\n setLayerGroup(e) {\n const t = this.getLayerGroup();\n t && this.handleLayerRemove_(new tn(\"removelayer\", t)), this.set(Ki.LAYERGROUP, e);\n }\n /**\n * Set the size of this map.\n * @param {import(\"./size.js\").Size|undefined} size The size in pixels of the map in the DOM.\n * @observable\n * @api\n */\n setSize(e) {\n this.set(Ki.SIZE, e);\n }\n /**\n * Set the target element to render this map into.\n * @param {HTMLElement|string} [target] The Element or id of the Element\n * that the map is rendered in.\n * @observable\n * @api\n */\n setTarget(e) {\n this.set(Ki.TARGET, e);\n }\n /**\n * Set the view for this map.\n * @param {View|Promise} view The view that controls this map.\n * It is also possible to pass a promise that resolves to options for constructing a view. This\n * alternative allows view properties to be resolved by sources or other components that load\n * view-related metadata.\n * @observable\n * @api\n */\n setView(e) {\n if (!e || e instanceof jr) {\n this.set(Ki.VIEW, e);\n return;\n }\n this.set(Ki.VIEW, new jr());\n const t = this;\n e.then(function(i) {\n t.setView(new jr(i));\n });\n }\n /**\n * Force a recalculation of the map viewport size. This should be called when\n * third-party code changes the size of the map viewport.\n * @api\n */\n updateSize() {\n const e = this.getTargetElement();\n let t;\n if (e) {\n const r = getComputedStyle(e), s = e.offsetWidth - parseFloat(r.borderLeftWidth) - parseFloat(r.paddingLeft) - parseFloat(r.paddingRight) - parseFloat(r.borderRightWidth), a = e.offsetHeight - parseFloat(r.borderTopWidth) - parseFloat(r.paddingTop) - parseFloat(r.paddingBottom) - parseFloat(r.borderBottomWidth);\n !isNaN(s) && !isNaN(a) && (t = [s, a], !Fm(t) && (e.offsetWidth || e.offsetHeight || e.getClientRects().length) && FE(\n \"No map visible because the map container's width or height are 0.\"\n ));\n }\n const i = this.getSize();\n t && (!i || !Qc(t, i)) && (this.setSize(t), this.updateViewportSize_());\n }\n /**\n * Recomputes the viewport size and save it on the view object (if any)\n * @private\n */\n updateViewportSize_() {\n const e = this.getView();\n if (e) {\n let t;\n const i = getComputedStyle(this.viewport_);\n i.width && i.height && (t = [\n parseInt(i.width, 10),\n parseInt(i.height, 10)\n ]), e.setViewportSize(t);\n }\n }\n};\nfunction u3(n) {\n let e = null;\n n.keyboardEventTarget !== void 0 && (e = typeof n.keyboardEventTarget == \"string\" ? document.getElementById(n.keyboardEventTarget) : n.keyboardEventTarget);\n const t = {}, i = n.layers && typeof /** @type {?} */\n n.layers.getLayers == \"function\" ? (\n /** @type {LayerGroup} */\n n.layers\n ) : new qa({\n layers: (\n /** @type {Collection|Array} */\n n.layers\n )\n });\n t[Ki.LAYERGROUP] = i, t[Ki.TARGET] = n.target, t[Ki.VIEW] = n.view instanceof jr ? n.view : new jr();\n let r;\n n.controls !== void 0 && (Array.isArray(n.controls) ? r = new Us(n.controls.slice()) : (Kt(\n typeof /** @type {?} */\n n.controls.getArray == \"function\",\n 47\n ), r = n.controls));\n let s;\n n.interactions !== void 0 && (Array.isArray(n.interactions) ? s = new Us(n.interactions.slice()) : (Kt(\n typeof /** @type {?} */\n n.interactions.getArray == \"function\",\n 48\n ), s = n.interactions));\n let a;\n return n.overlays !== void 0 ? Array.isArray(n.overlays) ? a = new Us(n.overlays.slice()) : (Kt(\n typeof /** @type {?} */\n n.overlays.getArray == \"function\",\n 49\n ), a = n.overlays) : a = new Us(), {\n controls: r,\n interactions: s,\n keyboardEventTarget: e,\n overlays: a,\n values: t\n };\n}\nconst Il = {\n PRELOAD: \"preload\",\n USE_INTERIM_TILES_ON_ERROR: \"useInterimTilesOnError\"\n};\nclass f3 extends sd {\n /**\n * @param {Options} [options] Tile layer options.\n */\n constructor(e) {\n e = e || {};\n const t = Object.assign({}, e);\n delete t.preload, delete t.useInterimTilesOnError, super(t), this.on, this.once, this.un, this.setPreload(e.preload !== void 0 ? e.preload : 0), this.setUseInterimTilesOnError(\n e.useInterimTilesOnError !== void 0 ? e.useInterimTilesOnError : !0\n );\n }\n /**\n * Return the level as number to which we will preload tiles up to.\n * @return {number} The level to preload tiles up to.\n * @observable\n * @api\n */\n getPreload() {\n return (\n /** @type {number} */\n this.get(Il.PRELOAD)\n );\n }\n /**\n * Set the level as number to which we will preload tiles up to.\n * @param {number} preload The level to preload tiles up to.\n * @observable\n * @api\n */\n setPreload(e) {\n this.set(Il.PRELOAD, e);\n }\n /**\n * Whether we use interim tiles on error.\n * @return {boolean} Use interim tiles on error.\n * @observable\n * @api\n */\n getUseInterimTilesOnError() {\n return (\n /** @type {boolean} */\n this.get(Il.USE_INTERIM_TILES_ON_ERROR)\n );\n }\n /**\n * Set whether we use interim tiles on error.\n * @param {boolean} useInterimTilesOnError Use interim tiles on error.\n * @observable\n * @api\n */\n setUseInterimTilesOnError(e) {\n this.set(Il.USE_INTERIM_TILES_ON_ERROR, e);\n }\n /**\n * Get data for a pixel location. The return type depends on the source data. For image tiles,\n * a four element RGBA array will be returned. For data tiles, the array length will match the\n * number of bands in the dataset. For requests outside the layer extent, `null` will be returned.\n * Data for a image tiles can only be retrieved if the source's `crossOrigin` property is set.\n *\n * ```js\n * // display layer data on every pointer move\n * map.on('pointermove', (event) => {\n * console.log(layer.getData(event.pixel));\n * });\n * ```\n * @param {import(\"../pixel\").Pixel} pixel Pixel.\n * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView|null} Pixel data.\n * @api\n */\n getData(e) {\n return super.getData(e);\n }\n}\nconst ia = {\n IDLE: 0,\n LOADING: 1,\n LOADED: 2,\n ERROR: 3,\n EMPTY: 4\n};\nclass d3 extends jo {\n /**\n * @param {LayerType} layer Layer.\n */\n constructor(e) {\n super(), this.ready = !0, this.boundHandleImageChange_ = this.handleImageChange_.bind(this), this.layer_ = e, this.declutterExecutorGroup = null;\n }\n /**\n * Asynchronous layer level hit detection.\n * @param {import(\"../pixel.js\").Pixel} pixel Pixel.\n * @return {Promise>} Promise that resolves with\n * an array of features.\n */\n getFeatures(e) {\n return di();\n }\n /**\n * @param {import(\"../pixel.js\").Pixel} pixel Pixel.\n * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView|null} Pixel data.\n */\n getData(e) {\n return null;\n }\n /**\n * Determine whether render should be called.\n * @abstract\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @return {boolean} Layer is ready to be rendered.\n */\n prepareFrame(e) {\n return di();\n }\n /**\n * Render the layer.\n * @abstract\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @param {HTMLElement|null} target Target that may be used to render content to.\n * @return {HTMLElement|null} The rendered element.\n */\n renderFrame(e, t) {\n return di();\n }\n /**\n * @param {Object>} tiles Lookup of loaded tiles by zoom level.\n * @param {number} zoom Zoom level.\n * @param {import(\"../Tile.js\").default} tile Tile.\n * @return {boolean|void} If `false`, the tile will not be considered loaded.\n */\n loadedTileCallback(e, t, i) {\n e[t] || (e[t] = {}), e[t][i.tileCoord.toString()] = i;\n }\n /**\n * Create a function that adds loaded tiles to the tile lookup.\n * @param {import(\"../source/Tile.js\").default} source Tile source.\n * @param {import(\"../proj/Projection.js\").default} projection Projection of the tiles.\n * @param {Object>} tiles Lookup of loaded tiles by zoom level.\n * @return {function(number, import(\"../TileRange.js\").default):boolean} A function that can be\n * called with a zoom level and a tile range to add loaded tiles to the lookup.\n * @protected\n */\n createLoadedTileFinder(e, t, i) {\n return (\n /**\n * @param {number} zoom Zoom level.\n * @param {import(\"../TileRange.js\").default} tileRange Tile range.\n * @return {boolean} The tile range is fully loaded.\n */\n (r, s) => {\n const a = this.loadedTileCallback.bind(this, i, r);\n return e.forEachLoadedTile(t, r, s, a);\n }\n );\n }\n /**\n * @abstract\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {import(\"./vector.js\").FeatureCallback} callback Feature callback.\n * @param {Array>} matches The hit detected matches with tolerance.\n * @return {T|undefined} Callback result.\n * @template T\n */\n forEachFeatureAtCoordinate(e, t, i, r, s) {\n }\n /**\n * @return {LayerType} Layer.\n */\n getLayer() {\n return this.layer_;\n }\n /**\n * Perform action necessary to get the layer rendered after new fonts have loaded\n * @abstract\n */\n handleFontsChanged() {\n }\n /**\n * Handle changes in image state.\n * @param {import(\"../events/Event.js\").default} event Image change event.\n * @private\n */\n handleImageChange_(e) {\n const t = (\n /** @type {import(\"../Image.js\").default} */\n e.target\n );\n (t.getState() === ia.LOADED || t.getState() === ia.ERROR) && this.renderIfReadyAndVisible();\n }\n /**\n * Load the image if not already loaded, and register the image change\n * listener if needed.\n * @param {import(\"../ImageBase.js\").default} image Image.\n * @return {boolean} `true` if the image is already loaded, `false` otherwise.\n * @protected\n */\n loadImage(e) {\n let t = e.getState();\n return t != ia.LOADED && t != ia.ERROR && e.addEventListener(St.CHANGE, this.boundHandleImageChange_), t == ia.IDLE && (e.load(), t = e.getState()), t == ia.LOADED;\n }\n /**\n * @protected\n */\n renderIfReadyAndVisible() {\n const e = this.getLayer();\n e && e.getVisible() && e.getSourceState() === \"ready\" && e.changed();\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n delete this.layer_, super.disposeInternal();\n }\n}\nlet la = null;\nfunction p3() {\n la = Na(1, 1, void 0, {\n willReadFrequently: !0\n });\n}\nclass g3 extends d3 {\n /**\n * @param {LayerType} layer Layer.\n */\n constructor(e) {\n super(e), this.container = null, this.renderedResolution, this.tempTransform = xa(), this.pixelTransform = xa(), this.inversePixelTransform = xa(), this.context = null, this.containerReused = !1, this.pixelContext_ = null, this.frameState = null;\n }\n /**\n * @param {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} image Image.\n * @param {number} col The column index.\n * @param {number} row The row index.\n * @return {Uint8ClampedArray|null} The image data.\n */\n getImageData(e, t, i) {\n la || p3(), la.clearRect(0, 0, 1, 1);\n let r;\n try {\n la.drawImage(e, t, i, 1, 1, 0, 0, 1, 1), r = la.getImageData(0, 0, 1, 1).data;\n } catch {\n return la = null, null;\n }\n return r;\n }\n /**\n * @param {import('../../Map.js').FrameState} frameState Frame state.\n * @return {string} Background color.\n */\n getBackground(e) {\n let i = this.getLayer().getBackground();\n return typeof i == \"function\" && (i = i(e.viewState.resolution)), i || void 0;\n }\n /**\n * Get a rendering container from an existing target, if compatible.\n * @param {HTMLElement} target Potential render target.\n * @param {string} transform CSS Transform.\n * @param {string} [backgroundColor] Background color.\n */\n useContainer(e, t, i) {\n const r = this.getLayer().getClassName();\n let s, a;\n if (e && e.className === r && (!i || e && e.style.backgroundColor && Qc(\n pm(e.style.backgroundColor),\n pm(i)\n ))) {\n const o = e.firstElementChild;\n o instanceof HTMLCanvasElement && (a = o.getContext(\"2d\"));\n }\n if (a && a.canvas.style.transform === t ? (this.container = e, this.context = a, this.containerReused = !0) : this.containerReused ? (this.container = null, this.context = null, this.containerReused = !1) : this.container && (this.container.style.backgroundColor = null), !this.container) {\n s = document.createElement(\"div\"), s.className = r;\n let o = s.style;\n o.position = \"absolute\", o.width = \"100%\", o.height = \"100%\", a = Na();\n const l = a.canvas;\n s.appendChild(l), o = l.style, o.position = \"absolute\", o.left = \"0\", o.transformOrigin = \"top left\", this.container = s, this.context = a;\n }\n !this.containerReused && i && !this.container.style.backgroundColor && (this.container.style.backgroundColor = i);\n }\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {import(\"../../extent.js\").Extent} extent Clip extent.\n * @protected\n */\n clipUnrotated(e, t, i) {\n const r = Bn(i), s = ih(i), a = th(i), o = eh(i);\n Ar(t.coordinateToPixelTransform, r), Ar(t.coordinateToPixelTransform, s), Ar(t.coordinateToPixelTransform, a), Ar(t.coordinateToPixelTransform, o);\n const l = this.inversePixelTransform;\n Ar(l, r), Ar(l, s), Ar(l, a), Ar(l, o), e.save(), e.beginPath(), e.moveTo(Math.round(r[0]), Math.round(r[1])), e.lineTo(Math.round(s[0]), Math.round(s[1])), e.lineTo(Math.round(a[0]), Math.round(a[1])), e.lineTo(Math.round(o[0]), Math.round(o[1])), e.clip();\n }\n /**\n * @param {import(\"../../render/EventType.js\").default} type Event type.\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @private\n */\n dispatchRenderEvent_(e, t, i) {\n const r = this.getLayer();\n if (r.hasListener(e)) {\n const s = new qE(\n e,\n this.inversePixelTransform,\n i,\n t\n );\n r.dispatchEvent(s);\n }\n }\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @protected\n */\n preRender(e, t) {\n this.frameState = t, this.dispatchRenderEvent_(nn.PRERENDER, e, t);\n }\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @protected\n */\n postRender(e, t) {\n this.dispatchRenderEvent_(nn.POSTRENDER, e, t);\n }\n /**\n * Creates a transform for rendering to an element that will be rotated after rendering.\n * @param {import(\"../../coordinate.js\").Coordinate} center Center.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {number} pixelRatio Pixel ratio.\n * @param {number} width Width of the rendered element (in pixels).\n * @param {number} height Height of the rendered element (in pixels).\n * @param {number} offsetX Offset on the x-axis in view coordinates.\n * @protected\n * @return {!import(\"../../transform.js\").Transform} Transform.\n */\n getRenderTransform(e, t, i, r, s, a, o) {\n const l = s / 2, c = a / 2, h = r / t, u = -h, f = -e[0] + o, d = -e[1];\n return Ao(\n this.tempTransform,\n l,\n c,\n h,\n u,\n -i,\n f,\n d\n );\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n delete this.frameState, super.disposeInternal();\n }\n}\nclass tv extends Xf {\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"./TileState.js\").default} state State.\n * @param {Options} [options] Tile options.\n */\n constructor(e, t, i) {\n super(), i = i || {}, this.tileCoord = e, this.state = t, this.interimTile = null, this.key = \"\", this.transition_ = i.transition === void 0 ? 250 : i.transition, this.transitionStarts_ = {}, this.interpolate = !!i.interpolate;\n }\n /**\n * @protected\n */\n changed() {\n this.dispatchEvent(St.CHANGE);\n }\n /**\n * Called by the tile cache when the tile is removed from the cache due to expiry\n */\n release() {\n this.state === Qe.ERROR && this.setState(Qe.EMPTY);\n }\n /**\n * @return {string} Key.\n */\n getKey() {\n return this.key + \"/\" + this.tileCoord;\n }\n /**\n * Get the interim tile most suitable for rendering using the chain of interim\n * tiles. This corresponds to the most recent tile that has been loaded, if no\n * such tile exists, the original tile is returned.\n * @return {!Tile} Best tile for rendering.\n */\n getInterimTile() {\n if (!this.interimTile)\n return this;\n let e = this.interimTile;\n do {\n if (e.getState() == Qe.LOADED)\n return this.transition_ = 0, e;\n e = e.interimTile;\n } while (e);\n return this;\n }\n /**\n * Goes through the chain of interim tiles and discards sections of the chain\n * that are no longer relevant.\n */\n refreshInterimChain() {\n if (!this.interimTile)\n return;\n let e = this.interimTile, t = this;\n do {\n if (e.getState() == Qe.LOADED) {\n e.interimTile = null;\n break;\n } else\n e.getState() == Qe.LOADING ? t = e : e.getState() == Qe.IDLE ? t.interimTile = e.interimTile : t = e;\n e = t.interimTile;\n } while (e);\n }\n /**\n * Get the tile coordinate for this tile.\n * @return {import(\"./tilecoord.js\").TileCoord} The tile coordinate.\n * @api\n */\n getTileCoord() {\n return this.tileCoord;\n }\n /**\n * @return {import(\"./TileState.js\").default} State.\n */\n getState() {\n return this.state;\n }\n /**\n * Sets the state of this tile. If you write your own {@link module:ol/Tile~LoadFunction tileLoadFunction} ,\n * it is important to set the state correctly to {@link module:ol/TileState~ERROR}\n * when the tile cannot be loaded. Otherwise the tile cannot be removed from\n * the tile queue and will block other requests.\n * @param {import(\"./TileState.js\").default} state State.\n * @api\n */\n setState(e) {\n if (this.state !== Qe.ERROR && this.state > e)\n throw new Error(\"Tile load sequence violation\");\n this.state = e, this.changed();\n }\n /**\n * Load the image or retry if loading previously failed.\n * Loading is taken care of by the tile queue, and calling this method is\n * only needed for preloading or for reloading in case of an error.\n * @abstract\n * @api\n */\n load() {\n di();\n }\n /**\n * Get the alpha value for rendering.\n * @param {string} id An id for the renderer.\n * @param {number} time The render frame time.\n * @return {number} A number between 0 and 1.\n */\n getAlpha(e, t) {\n if (!this.transition_)\n return 1;\n let i = this.transitionStarts_[e];\n if (!i)\n i = t, this.transitionStarts_[e] = i;\n else if (i === -1)\n return 1;\n const r = t - i + 1e3 / 60;\n return r >= this.transition_ ? 1 : UE(r / this.transition_);\n }\n /**\n * Determine if a tile is in an alpha transition. A tile is considered in\n * transition if tile.getAlpha() has not yet been called or has been called\n * and returned 1.\n * @param {string} id An id for the renderer.\n * @return {boolean} The tile is in transition.\n */\n inTransition(e) {\n return this.transition_ ? this.transitionStarts_[e] !== -1 : !1;\n }\n /**\n * Mark a transition as complete.\n * @param {string} id An id for the renderer.\n */\n endTransition(e) {\n this.transition_ && (this.transitionStarts_[e] = -1);\n }\n}\nfunction m3(n, e, t) {\n const i = (\n /** @type {HTMLImageElement} */\n n\n );\n let r = !0, s = !1, a = !1;\n const o = [\n dc(i, St.LOAD, function() {\n a = !0, s || e();\n })\n ];\n return i.src && K2 ? (s = !0, i.decode().then(function() {\n r && e();\n }).catch(function(l) {\n r && (a ? e() : t());\n })) : o.push(dc(i, St.ERROR, t)), function() {\n r = !1, o.forEach(Ei);\n };\n}\nclass iv extends tv {\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"./TileState.js\").default} state State.\n * @param {string} src Image source URI.\n * @param {?string} crossOrigin Cross origin.\n * @param {import(\"./Tile.js\").LoadFunction} tileLoadFunction Tile load function.\n * @param {import(\"./Tile.js\").Options} [options] Tile options.\n */\n constructor(e, t, i, r, s, a) {\n super(e, t, a), this.crossOrigin_ = r, this.src_ = i, this.key = i, this.image_ = new Image(), r !== null && (this.image_.crossOrigin = r), this.unlisten_ = null, this.tileLoadFunction_ = s;\n }\n /**\n * Get the HTML image element for this tile (may be a Canvas, Image, or Video).\n * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image.\n * @api\n */\n getImage() {\n return this.image_;\n }\n /**\n * Sets an HTML image element for this tile (may be a Canvas or preloaded Image).\n * @param {HTMLCanvasElement|HTMLImageElement} element Element.\n */\n setImage(e) {\n this.image_ = e, this.state = Qe.LOADED, this.unlistenImage_(), this.changed();\n }\n /**\n * Tracks loading or read errors.\n *\n * @private\n */\n handleImageError_() {\n this.state = Qe.ERROR, this.unlistenImage_(), this.image_ = _3(), this.changed();\n }\n /**\n * Tracks successful image load.\n *\n * @private\n */\n handleImageLoad_() {\n const e = (\n /** @type {HTMLImageElement} */\n this.image_\n );\n e.naturalWidth && e.naturalHeight ? this.state = Qe.LOADED : this.state = Qe.EMPTY, this.unlistenImage_(), this.changed();\n }\n /**\n * Load the image or retry if loading previously failed.\n * Loading is taken care of by the tile queue, and calling this method is\n * only needed for preloading or for reloading in case of an error.\n *\n * To retry loading tiles on failed requests, use a custom `tileLoadFunction`\n * that checks for error status codes and reloads only when the status code is\n * 408, 429, 500, 502, 503 and 504, and only when not too many retries have been\n * made already:\n *\n * ```js\n * const retryCodes = [408, 429, 500, 502, 503, 504];\n * const retries = {};\n * source.setTileLoadFunction((tile, src) => {\n * const image = tile.getImage();\n * fetch(src)\n * .then((response) => {\n * if (retryCodes.includes(response.status)) {\n * retries[src] = (retries[src] || 0) + 1;\n * if (retries[src] <= 3) {\n * setTimeout(() => tile.load(), retries[src] * 1000);\n * }\n * return Promise.reject();\n * }\n * return response.blob();\n * })\n * .then((blob) => {\n * const imageUrl = URL.createObjectURL(blob);\n * image.src = imageUrl;\n * setTimeout(() => URL.revokeObjectURL(imageUrl), 5000);\n * })\n * .catch(() => tile.setState(3)); // error\n * });\n * ```\n *\n * @api\n */\n load() {\n this.state == Qe.ERROR && (this.state = Qe.IDLE, this.image_ = new Image(), this.crossOrigin_ !== null && (this.image_.crossOrigin = this.crossOrigin_)), this.state == Qe.IDLE && (this.state = Qe.LOADING, this.changed(), this.tileLoadFunction_(this, this.src_), this.unlisten_ = m3(\n this.image_,\n this.handleImageLoad_.bind(this),\n this.handleImageError_.bind(this)\n ));\n }\n /**\n * Discards event handlers which listen for load completion or errors.\n *\n * @private\n */\n unlistenImage_() {\n this.unlisten_ && (this.unlisten_(), this.unlisten_ = null);\n }\n}\nfunction _3() {\n const n = Na(1, 1);\n return n.fillStyle = \"rgba(0,0,0,0)\", n.fillRect(0, 0, 1, 1), n.canvas;\n}\nconst E3 = 0.5, v3 = 10, Lm = 0.25;\nclass T3 {\n /**\n * @param {import(\"../proj/Projection.js\").default} sourceProj Source projection.\n * @param {import(\"../proj/Projection.js\").default} targetProj Target projection.\n * @param {import(\"../extent.js\").Extent} targetExtent Target extent to triangulate.\n * @param {import(\"../extent.js\").Extent} maxSourceExtent Maximal source extent that can be used.\n * @param {number} errorThreshold Acceptable error (in source units).\n * @param {?number} destinationResolution The (optional) resolution of the destination.\n */\n constructor(e, t, i, r, s, a) {\n this.sourceProj_ = e, this.targetProj_ = t;\n let o = {};\n const l = Oo(this.targetProj_, this.sourceProj_);\n this.transformInv_ = function(E) {\n const C = E[0] + \"/\" + E[1];\n return o[C] || (o[C] = l(E)), o[C];\n }, this.maxSourceExtent_ = r, this.errorThresholdSquared_ = s * s, this.triangles_ = [], this.wrapsXInSource_ = !1, this.canWrapXInSource_ = this.sourceProj_.canWrapX() && !!r && !!this.sourceProj_.getExtent() && Ui(r) >= Ui(this.sourceProj_.getExtent()), this.sourceWorldWidth_ = this.sourceProj_.getExtent() ? Ui(this.sourceProj_.getExtent()) : null, this.targetWorldWidth_ = this.targetProj_.getExtent() ? Ui(this.targetProj_.getExtent()) : null;\n const c = Bn(i), h = ih(i), u = th(i), f = eh(i), d = this.transformInv_(c), p = this.transformInv_(h), g = this.transformInv_(u), m = this.transformInv_(f), v = v3 + (a ? Math.max(\n 0,\n Math.ceil(\n Math.log2(\n Ru(i) / (a * a * 256 * 256)\n )\n )\n ) : 0);\n if (this.addQuad_(\n c,\n h,\n u,\n f,\n d,\n p,\n g,\n m,\n v\n ), this.wrapsXInSource_) {\n let E = 1 / 0;\n this.triangles_.forEach(function(C, T, R) {\n E = Math.min(\n E,\n C.source[0][0],\n C.source[1][0],\n C.source[2][0]\n );\n }), this.triangles_.forEach((C) => {\n if (Math.max(\n C.source[0][0],\n C.source[1][0],\n C.source[2][0]\n ) - E > this.sourceWorldWidth_ / 2) {\n const T = [\n [C.source[0][0], C.source[0][1]],\n [C.source[1][0], C.source[1][1]],\n [C.source[2][0], C.source[2][1]]\n ];\n T[0][0] - E > this.sourceWorldWidth_ / 2 && (T[0][0] -= this.sourceWorldWidth_), T[1][0] - E > this.sourceWorldWidth_ / 2 && (T[1][0] -= this.sourceWorldWidth_), T[2][0] - E > this.sourceWorldWidth_ / 2 && (T[2][0] -= this.sourceWorldWidth_);\n const R = Math.min(\n T[0][0],\n T[1][0],\n T[2][0]\n );\n Math.max(\n T[0][0],\n T[1][0],\n T[2][0]\n ) - R < this.sourceWorldWidth_ / 2 && (C.source = T);\n }\n });\n }\n o = {};\n }\n /**\n * Adds triangle to the triangulation.\n * @param {import(\"../coordinate.js\").Coordinate} a The target a coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} b The target b coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} c The target c coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} aSrc The source a coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} bSrc The source b coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} cSrc The source c coordinate.\n * @private\n */\n addTriangle_(e, t, i, r, s, a) {\n this.triangles_.push({\n source: [r, s, a],\n target: [e, t, i]\n });\n }\n /**\n * Adds quad (points in clock-wise order) to the triangulation\n * (and reprojects the vertices) if valid.\n * Performs quad subdivision if needed to increase precision.\n *\n * @param {import(\"../coordinate.js\").Coordinate} a The target a coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} b The target b coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} c The target c coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} d The target d coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} aSrc The source a coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} bSrc The source b coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} cSrc The source c coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} dSrc The source d coordinate.\n * @param {number} maxSubdivision Maximal allowed subdivision of the quad.\n * @private\n */\n addQuad_(e, t, i, r, s, a, o, l, c) {\n const h = fm([s, a, o, l]), u = this.sourceWorldWidth_ ? Ui(h) / this.sourceWorldWidth_ : null, f = (\n /** @type {number} */\n this.sourceWorldWidth_\n ), d = this.sourceProj_.canWrapX() && u > 0.5 && u < 1;\n let p = !1;\n if (c > 0) {\n if (this.targetProj_.isGlobal() && this.targetWorldWidth_) {\n const m = fm([e, t, i, r]);\n p = Ui(m) / this.targetWorldWidth_ > Lm || p;\n }\n !d && this.sourceProj_.isGlobal() && u && (p = u > Lm || p);\n }\n if (!p && this.maxSourceExtent_ && isFinite(h[0]) && isFinite(h[1]) && isFinite(h[2]) && isFinite(h[3]) && !Jo(h, this.maxSourceExtent_))\n return;\n let g = 0;\n if (!p && (!isFinite(s[0]) || !isFinite(s[1]) || !isFinite(a[0]) || !isFinite(a[1]) || !isFinite(o[0]) || !isFinite(o[1]) || !isFinite(l[0]) || !isFinite(l[1]))) {\n if (c > 0)\n p = !0;\n else if (g = (!isFinite(s[0]) || !isFinite(s[1]) ? 8 : 0) + (!isFinite(a[0]) || !isFinite(a[1]) ? 4 : 0) + (!isFinite(o[0]) || !isFinite(o[1]) ? 2 : 0) + (!isFinite(l[0]) || !isFinite(l[1]) ? 1 : 0), g != 1 && g != 2 && g != 4 && g != 8)\n return;\n }\n if (c > 0) {\n if (!p) {\n const m = [(e[0] + i[0]) / 2, (e[1] + i[1]) / 2], v = this.transformInv_(m);\n let E;\n d ? E = (Ra(s[0], f) + Ra(o[0], f)) / 2 - Ra(v[0], f) : E = (s[0] + o[0]) / 2 - v[0];\n const C = (s[1] + o[1]) / 2 - v[1];\n p = E * E + C * C > this.errorThresholdSquared_;\n }\n if (p) {\n if (Math.abs(e[0] - i[0]) <= Math.abs(e[1] - i[1])) {\n const m = [(t[0] + i[0]) / 2, (t[1] + i[1]) / 2], v = this.transformInv_(m), E = [(r[0] + e[0]) / 2, (r[1] + e[1]) / 2], C = this.transformInv_(E);\n this.addQuad_(\n e,\n t,\n m,\n E,\n s,\n a,\n v,\n C,\n c - 1\n ), this.addQuad_(\n E,\n m,\n i,\n r,\n C,\n v,\n o,\n l,\n c - 1\n );\n } else {\n const m = [(e[0] + t[0]) / 2, (e[1] + t[1]) / 2], v = this.transformInv_(m), E = [(i[0] + r[0]) / 2, (i[1] + r[1]) / 2], C = this.transformInv_(E);\n this.addQuad_(\n e,\n m,\n E,\n r,\n s,\n v,\n C,\n l,\n c - 1\n ), this.addQuad_(\n m,\n t,\n i,\n E,\n v,\n a,\n o,\n C,\n c - 1\n );\n }\n return;\n }\n }\n if (d) {\n if (!this.canWrapXInSource_)\n return;\n this.wrapsXInSource_ = !0;\n }\n g & 11 || this.addTriangle_(e, i, r, s, o, l), g & 14 || this.addTriangle_(e, i, t, s, o, a), g && (g & 13 || this.addTriangle_(t, r, e, a, l, s), g & 7 || this.addTriangle_(t, r, i, a, l, o));\n }\n /**\n * Calculates extent of the `source` coordinates from all the triangles.\n *\n * @return {import(\"../extent.js\").Extent} Calculated extent.\n */\n calculateSourceExtent() {\n const e = Vn();\n return this.triangles_.forEach(function(t, i, r) {\n const s = t.source;\n Kl(e, s[0]), Kl(e, s[1]), Kl(e, s[2]);\n }), e;\n }\n /**\n * @return {Array} Array of the calculated triangles.\n */\n getTriangles() {\n return this.triangles_;\n }\n}\nlet ru;\nconst ya = [];\nfunction wm(n, e, t, i, r) {\n n.beginPath(), n.moveTo(0, 0), n.lineTo(e, t), n.lineTo(i, r), n.closePath(), n.save(), n.clip(), n.fillRect(0, 0, Math.max(e, i) + 1, Math.max(t, r)), n.restore();\n}\nfunction su(n, e) {\n return Math.abs(n[e * 4] - 210) > 2 || Math.abs(n[e * 4 + 3] - 0.75 * 255) > 2;\n}\nfunction x3() {\n if (ru === void 0) {\n const n = Na(6, 6, ya);\n n.globalCompositeOperation = \"lighter\", n.fillStyle = \"rgba(210, 0, 0, 0.75)\", wm(n, 4, 5, 4, 0), wm(n, 4, 5, 0, 5);\n const e = n.getImageData(0, 0, 3, 3).data;\n ru = su(e, 0) || su(e, 4) || su(e, 8), ad(n), ya.push(n.canvas);\n }\n return ru;\n}\nfunction Um(n, e, t, i) {\n const r = Qf(t, e, n);\n let s = xm(\n e,\n i,\n t\n );\n const a = e.getMetersPerUnit();\n a !== void 0 && (s *= a);\n const o = n.getMetersPerUnit();\n o !== void 0 && (s /= o);\n const l = n.getExtent();\n if (!l || Hf(l, r)) {\n const c = xm(n, s, r) / s;\n isFinite(c) && c > 0 && (s /= c);\n }\n return s;\n}\nfunction C3(n, e, t, i) {\n const r = Mo(t);\n let s = Um(\n n,\n e,\n r,\n i\n );\n return (!isFinite(s) || s <= 0) && ME(t, function(a) {\n return s = Um(\n n,\n e,\n a,\n i\n ), isFinite(s) && s > 0;\n }), s;\n}\nfunction R3(n, e, t, i, r, s, a, o, l, c, h, u) {\n const f = Na(\n Math.round(t * n),\n Math.round(t * e),\n ya\n );\n if (u || (f.imageSmoothingEnabled = !1), l.length === 0)\n return f.canvas;\n f.scale(t, t);\n function d(T) {\n return Math.round(T * t) / t;\n }\n f.globalCompositeOperation = \"lighter\";\n const p = Vn();\n l.forEach(function(T, R, x) {\n ew(p, T.extent);\n });\n const g = Ui(p), m = gs(p), v = Na(\n Math.round(t * g / i),\n Math.round(t * m / i),\n ya\n );\n u || (v.imageSmoothingEnabled = !1);\n const E = t / i;\n l.forEach(function(T, R, x) {\n const S = T.extent[0] - p[0], M = -(T.extent[3] - p[3]), N = Ui(T.extent), F = gs(T.extent);\n T.image.width > 0 && T.image.height > 0 && v.drawImage(\n T.image,\n c,\n c,\n T.image.width - 2 * c,\n T.image.height - 2 * c,\n S * E,\n M * E,\n N * E,\n F * E\n );\n });\n const C = Bn(a);\n return o.getTriangles().forEach(function(T, R, x) {\n const S = T.source, M = T.target;\n let N = S[0][0], F = S[0][1], L = S[1][0], K = S[1][1], q = S[2][0], j = S[2][1];\n const k = d((M[0][0] - C[0]) / s), Q = d(\n -(M[0][1] - C[1]) / s\n ), ce = d((M[1][0] - C[0]) / s), de = d(\n -(M[1][1] - C[1]) / s\n ), Z = d((M[2][0] - C[0]) / s), J = d(\n -(M[2][1] - C[1]) / s\n ), O = N, G = F;\n N = 0, F = 0, L -= O, K -= G, q -= O, j -= G;\n const ee = [\n [L, K, 0, 0, ce - k],\n [q, j, 0, 0, Z - k],\n [0, 0, L, K, de - Q],\n [0, 0, q, j, J - Q]\n ], _e = ow(ee);\n if (_e) {\n if (f.save(), f.beginPath(), x3() || !u) {\n f.moveTo(ce, de);\n const Oe = 4, ze = k - ce, fe = Q - de;\n for (let Te = 0; Te < Oe; Te++)\n f.lineTo(\n ce + d((Te + 1) * ze / Oe),\n de + d(Te * fe / (Oe - 1))\n ), Te != Oe - 1 && f.lineTo(\n ce + d((Te + 1) * ze / Oe),\n de + d((Te + 1) * fe / (Oe - 1))\n );\n f.lineTo(Z, J);\n } else\n f.moveTo(ce, de), f.lineTo(k, Q), f.lineTo(Z, J);\n f.clip(), f.transform(\n _e[0],\n _e[2],\n _e[1],\n _e[3],\n k,\n Q\n ), f.translate(\n p[0] - O,\n p[3] - G\n ), f.scale(\n i / t,\n -i / t\n ), f.drawImage(v.canvas, 0, 0), f.restore();\n }\n }), ad(v), ya.push(v.canvas), h && (f.save(), f.globalCompositeOperation = \"source-over\", f.strokeStyle = \"black\", f.lineWidth = 1, o.getTriangles().forEach(function(T, R, x) {\n const S = T.target, M = (S[0][0] - C[0]) / s, N = -(S[0][1] - C[1]) / s, F = (S[1][0] - C[0]) / s, L = -(S[1][1] - C[1]) / s, K = (S[2][0] - C[0]) / s, q = -(S[2][1] - C[1]) / s;\n f.beginPath(), f.moveTo(F, L), f.lineTo(M, N), f.lineTo(K, q), f.closePath(), f.stroke();\n }), f.restore()), f.canvas;\n}\nclass Du extends tv {\n /**\n * @param {import(\"../proj/Projection.js\").default} sourceProj Source projection.\n * @param {import(\"../tilegrid/TileGrid.js\").default} sourceTileGrid Source tile grid.\n * @param {import(\"../proj/Projection.js\").default} targetProj Target projection.\n * @param {import(\"../tilegrid/TileGrid.js\").default} targetTileGrid Target tile grid.\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Coordinate of the tile.\n * @param {import(\"../tilecoord.js\").TileCoord} wrappedTileCoord Coordinate of the tile wrapped in X.\n * @param {number} pixelRatio Pixel ratio.\n * @param {number} gutter Gutter of the source tiles.\n * @param {FunctionType} getTileFunction\n * Function returning source tiles (z, x, y, pixelRatio).\n * @param {number} [errorThreshold] Acceptable reprojection error (in px).\n * @param {boolean} [renderEdges] Render reprojection edges.\n * @param {boolean} [interpolate] Use linear interpolation when resampling.\n */\n constructor(e, t, i, r, s, a, o, l, c, h, u, f) {\n super(s, Qe.IDLE, { interpolate: !!f }), this.renderEdges_ = u !== void 0 ? u : !1, this.pixelRatio_ = o, this.gutter_ = l, this.canvas_ = null, this.sourceTileGrid_ = t, this.targetTileGrid_ = r, this.wrappedTileCoord_ = a || s, this.sourceTiles_ = [], this.sourcesListenerKeys_ = null, this.sourceZ_ = 0;\n const d = r.getTileCoordExtent(\n this.wrappedTileCoord_\n ), p = this.targetTileGrid_.getExtent();\n let g = this.sourceTileGrid_.getExtent();\n const m = p ? fo(d, p) : d;\n if (Ru(m) === 0) {\n this.state = Qe.EMPTY;\n return;\n }\n const v = e.getExtent();\n v && (g ? g = fo(g, v) : g = v);\n const E = r.getResolution(\n this.wrappedTileCoord_[0]\n ), C = C3(\n e,\n i,\n m,\n E\n );\n if (!isFinite(C) || C <= 0) {\n this.state = Qe.EMPTY;\n return;\n }\n const T = h !== void 0 ? h : E3;\n if (this.triangulation_ = new T3(\n e,\n i,\n m,\n g,\n C * T,\n E\n ), this.triangulation_.getTriangles().length === 0) {\n this.state = Qe.EMPTY;\n return;\n }\n this.sourceZ_ = t.getZForResolution(C);\n let R = this.triangulation_.calculateSourceExtent();\n if (g && (e.canWrapX() ? (R[1] = Vi(\n R[1],\n g[1],\n g[3]\n ), R[3] = Vi(\n R[3],\n g[1],\n g[3]\n )) : R = fo(R, g)), !Ru(R))\n this.state = Qe.EMPTY;\n else {\n const x = t.getTileRangeForExtentAndZ(\n R,\n this.sourceZ_\n );\n for (let S = x.minX; S <= x.maxX; S++)\n for (let M = x.minY; M <= x.maxY; M++) {\n const N = c(this.sourceZ_, S, M, o);\n N && this.sourceTiles_.push(N);\n }\n this.sourceTiles_.length === 0 && (this.state = Qe.EMPTY);\n }\n }\n /**\n * Get the HTML Canvas element for this tile.\n * @return {HTMLCanvasElement} Canvas.\n */\n getImage() {\n return this.canvas_;\n }\n /**\n * @private\n */\n reproject_() {\n const e = [];\n if (this.sourceTiles_.forEach((t) => {\n t && t.getState() == Qe.LOADED && e.push({\n extent: this.sourceTileGrid_.getTileCoordExtent(t.tileCoord),\n image: t.getImage()\n });\n }), this.sourceTiles_.length = 0, e.length === 0)\n this.state = Qe.ERROR;\n else {\n const t = this.wrappedTileCoord_[0], i = this.targetTileGrid_.getTileSize(t), r = typeof i == \"number\" ? i : i[0], s = typeof i == \"number\" ? i : i[1], a = this.targetTileGrid_.getResolution(t), o = this.sourceTileGrid_.getResolution(\n this.sourceZ_\n ), l = this.targetTileGrid_.getTileCoordExtent(\n this.wrappedTileCoord_\n );\n this.canvas_ = R3(\n r,\n s,\n this.pixelRatio_,\n o,\n this.sourceTileGrid_.getExtent(),\n a,\n l,\n this.triangulation_,\n e,\n this.gutter_,\n this.renderEdges_,\n this.interpolate\n ), this.state = Qe.LOADED;\n }\n this.changed();\n }\n /**\n * Load not yet loaded URI.\n */\n load() {\n if (this.state == Qe.IDLE) {\n this.state = Qe.LOADING, this.changed();\n let e = 0;\n this.sourcesListenerKeys_ = [], this.sourceTiles_.forEach((t) => {\n const i = t.getState();\n if (i == Qe.IDLE || i == Qe.LOADING) {\n e++;\n const r = Ht(\n t,\n St.CHANGE,\n function(s) {\n const a = t.getState();\n (a == Qe.LOADED || a == Qe.ERROR || a == Qe.EMPTY) && (Ei(r), e--, e === 0 && (this.unlistenSources_(), this.reproject_()));\n },\n this\n );\n this.sourcesListenerKeys_.push(r);\n }\n }), e === 0 ? setTimeout(this.reproject_.bind(this), 0) : this.sourceTiles_.forEach(function(t, i, r) {\n t.getState() == Qe.IDLE && t.load();\n });\n }\n }\n /**\n * @private\n */\n unlistenSources_() {\n this.sourcesListenerKeys_.forEach(Ei), this.sourcesListenerKeys_ = null;\n }\n /**\n * Remove from the cache due to expiry\n */\n release() {\n this.canvas_ && (ad(this.canvas_.getContext(\"2d\")), ya.push(this.canvas_), this.canvas_ = null), super.release();\n }\n}\nclass hd {\n /**\n * @param {number} minX Minimum X.\n * @param {number} maxX Maximum X.\n * @param {number} minY Minimum Y.\n * @param {number} maxY Maximum Y.\n */\n constructor(e, t, i, r) {\n this.minX = e, this.maxX = t, this.minY = i, this.maxY = r;\n }\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @return {boolean} Contains tile coordinate.\n */\n contains(e) {\n return this.containsXY(e[1], e[2]);\n }\n /**\n * @param {TileRange} tileRange Tile range.\n * @return {boolean} Contains.\n */\n containsTileRange(e) {\n return this.minX <= e.minX && e.maxX <= this.maxX && this.minY <= e.minY && e.maxY <= this.maxY;\n }\n /**\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @return {boolean} Contains coordinate.\n */\n containsXY(e, t) {\n return this.minX <= e && e <= this.maxX && this.minY <= t && t <= this.maxY;\n }\n /**\n * @param {TileRange} tileRange Tile range.\n * @return {boolean} Equals.\n */\n equals(e) {\n return this.minX == e.minX && this.minY == e.minY && this.maxX == e.maxX && this.maxY == e.maxY;\n }\n /**\n * @param {TileRange} tileRange Tile range.\n */\n extend(e) {\n e.minX < this.minX && (this.minX = e.minX), e.maxX > this.maxX && (this.maxX = e.maxX), e.minY < this.minY && (this.minY = e.minY), e.maxY > this.maxY && (this.maxY = e.maxY);\n }\n /**\n * @return {number} Height.\n */\n getHeight() {\n return this.maxY - this.minY + 1;\n }\n /**\n * @return {import(\"./size.js\").Size} Size.\n */\n getSize() {\n return [this.getWidth(), this.getHeight()];\n }\n /**\n * @return {number} Width.\n */\n getWidth() {\n return this.maxX - this.minX + 1;\n }\n /**\n * @param {TileRange} tileRange Tile range.\n * @return {boolean} Intersects.\n */\n intersects(e) {\n return this.minX <= e.maxX && this.maxX >= e.minX && this.minY <= e.maxY && this.maxY >= e.minY;\n }\n}\nfunction ra(n, e, t, i, r) {\n return r !== void 0 ? (r.minX = n, r.maxX = e, r.minY = t, r.maxY = i, r) : new hd(n, e, t, i);\n}\nclass S3 extends g3 {\n /**\n * @param {LayerType} tileLayer Tile layer.\n */\n constructor(e) {\n super(e), this.extentChanged = !0, this.renderedExtent_ = null, this.renderedPixelRatio, this.renderedProjection = null, this.renderedRevision, this.renderedTiles = [], this.newTiles_ = !1, this.tmpExtent = Vn(), this.tmpTileRange_ = new hd(0, 0, 0, 0);\n }\n /**\n * @protected\n * @param {import(\"../../Tile.js\").default} tile Tile.\n * @return {boolean} Tile is drawable.\n */\n isDrawableTile(e) {\n const t = this.getLayer(), i = e.getState(), r = t.getUseInterimTilesOnError();\n return i == Qe.LOADED || i == Qe.EMPTY || i == Qe.ERROR && !r;\n }\n /**\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @return {!import(\"../../Tile.js\").default} Tile.\n */\n getTile(e, t, i, r) {\n const s = r.pixelRatio, a = r.viewState.projection, o = this.getLayer();\n let c = o.getSource().getTile(e, t, i, s, a);\n return c.getState() == Qe.ERROR && o.getUseInterimTilesOnError() && o.getPreload() > 0 && (this.newTiles_ = !0), this.isDrawableTile(c) || (c = c.getInterimTile()), c;\n }\n /**\n * @param {import(\"../../pixel.js\").Pixel} pixel Pixel.\n * @return {Uint8ClampedArray} Data at the pixel location.\n */\n getData(e) {\n const t = this.frameState;\n if (!t)\n return null;\n const i = this.getLayer(), r = Ar(\n t.pixelToCoordinateTransform,\n e.slice()\n ), s = i.getExtent();\n if (s && !Hf(s, r))\n return null;\n const a = t.pixelRatio, o = t.viewState.projection, l = t.viewState, c = i.getRenderSource(), h = c.getTileGridForProjection(l.projection), u = c.getTilePixelRatio(t.pixelRatio);\n for (let f = h.getZForResolution(l.resolution); f >= h.getMinZoom(); --f) {\n const d = h.getTileCoordForCoordAndZ(r, f), p = c.getTile(\n f,\n d[1],\n d[2],\n a,\n o\n );\n if (!(p instanceof iv || p instanceof Du) || p instanceof Du && p.getState() === Qe.EMPTY)\n return null;\n if (p.getState() !== Qe.LOADED)\n continue;\n const g = h.getOrigin(f), m = sn(h.getTileSize(f)), v = h.getResolution(f), E = Math.floor(\n u * ((r[0] - g[0]) / v - d[1] * m[0])\n ), C = Math.floor(\n u * ((g[1] - r[1]) / v - d[2] * m[1])\n ), T = Math.round(\n u * c.getGutterForProjection(l.projection)\n );\n return this.getImageData(p.getImage(), E + T, C + T);\n }\n return null;\n }\n /**\n * @param {Object>} tiles Lookup of loaded tiles by zoom level.\n * @param {number} zoom Zoom level.\n * @param {import(\"../../Tile.js\").default} tile Tile.\n * @return {boolean|void} If `false`, the tile will not be considered loaded.\n */\n loadedTileCallback(e, t, i) {\n return this.isDrawableTile(i) ? super.loadedTileCallback(e, t, i) : !1;\n }\n /**\n * Determine whether render should be called.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @return {boolean} Layer is ready to be rendered.\n */\n prepareFrame(e) {\n return !!this.getLayer().getSource();\n }\n /**\n * Render the layer.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {HTMLElement} target Target that may be used to render content to.\n * @return {HTMLElement} The rendered element.\n */\n renderFrame(e, t) {\n const i = e.layerStatesArray[e.layerIndex], r = e.viewState, s = r.projection, a = r.resolution, o = r.center, l = r.rotation, c = e.pixelRatio, h = this.getLayer(), u = h.getSource(), f = u.getRevision(), d = u.getTileGridForProjection(s), p = d.getZForResolution(a, u.zDirection), g = d.getResolution(p);\n let m = e.extent;\n const v = e.viewState.resolution, E = u.getTilePixelRatio(c), C = Math.round(Ui(m) / v * c), T = Math.round(gs(m) / v * c), R = i.extent && ha(i.extent, s);\n R && (m = fo(\n m,\n ha(i.extent, s)\n ));\n const x = g * C / 2 / E, S = g * T / 2 / E, M = [\n o[0] - x,\n o[1] - S,\n o[0] + x,\n o[1] + S\n ], N = d.getTileRangeForExtentAndZ(m, p), F = {};\n F[p] = {};\n const L = this.createLoadedTileFinder(\n u,\n s,\n F\n ), K = this.tmpExtent, q = this.tmpTileRange_;\n this.newTiles_ = !1;\n const j = l ? yu(\n r.center,\n v,\n l,\n e.size\n ) : void 0;\n for (let ee = N.minX; ee <= N.maxX; ++ee)\n for (let _e = N.minY; _e <= N.maxY; ++_e) {\n if (l && !d.tileCoordIntersectsViewport([p, ee, _e], j))\n continue;\n const Oe = this.getTile(p, ee, _e, e);\n if (this.isDrawableTile(Oe)) {\n const Te = ur(this);\n if (Oe.getState() == Qe.LOADED) {\n F[p][Oe.tileCoord.toString()] = Oe;\n let Fe = Oe.inTransition(Te);\n Fe && i.opacity !== 1 && (Oe.endTransition(Te), Fe = !1), !this.newTiles_ && (Fe || !this.renderedTiles.includes(Oe)) && (this.newTiles_ = !0);\n }\n if (Oe.getAlpha(Te, e.time) === 1)\n continue;\n }\n const ze = d.getTileCoordChildTileRange(\n Oe.tileCoord,\n q,\n K\n );\n let fe = !1;\n ze && (fe = L(p + 1, ze)), fe || d.forEachTileCoordParentTileRange(\n Oe.tileCoord,\n L,\n q,\n K\n );\n }\n const k = g / a * c / E;\n Ao(\n this.pixelTransform,\n e.size[0] / 2,\n e.size[1] / 2,\n 1 / c,\n 1 / c,\n l,\n -C / 2,\n -T / 2\n );\n const Q = Y2(this.pixelTransform);\n this.useContainer(t, Q, this.getBackground(e));\n const ce = this.context, de = ce.canvas;\n yE(this.inversePixelTransform, this.pixelTransform), Ao(\n this.tempTransform,\n C / 2,\n T / 2,\n k,\n k,\n 0,\n -C / 2,\n -T / 2\n ), de.width != C || de.height != T ? (de.width = C, de.height = T) : this.containerReused || ce.clearRect(0, 0, C, T), R && this.clipUnrotated(ce, e, R), u.getInterpolate() || (ce.imageSmoothingEnabled = !1), this.preRender(ce, e), this.renderedTiles.length = 0;\n let Z = Object.keys(F).map(Number);\n Z.sort(Wf);\n let J, O, G;\n i.opacity === 1 && (!this.containerReused || u.getOpaque(e.viewState.projection)) ? Z = Z.reverse() : (J = [], O = []);\n for (let ee = Z.length - 1; ee >= 0; --ee) {\n const _e = Z[ee], Oe = u.getTilePixelSize(\n _e,\n c,\n s\n ), fe = d.getResolution(_e) / g, Te = Oe[0] * fe * k, Fe = Oe[1] * fe * k, Se = d.getTileCoordForCoordAndZ(\n Bn(M),\n _e\n ), qe = d.getTileCoordExtent(Se), ue = Ar(this.tempTransform, [\n E * (qe[0] - M[0]) / g,\n E * (M[3] - qe[3]) / g\n ]), Ye = E * u.getGutterForProjection(s), lt = F[_e];\n for (const Ut in lt) {\n const Ct = (\n /** @type {import(\"../../ImageTile.js\").default} */\n lt[Ut]\n ), Bi = Ct.tileCoord, hi = Se[1] - Bi[1], Es = Math.round(ue[0] - (hi - 1) * Te), Ur = Se[2] - Bi[2], vs = Math.round(ue[1] - (Ur - 1) * Fe), ki = Math.round(ue[0] - hi * Te), lr = Math.round(ue[1] - Ur * Fe), Rr = Es - ki, Sr = vs - lr, Ts = p === _e, xs = Ts && Ct.getAlpha(ur(this), e.time) !== 1;\n let yr = !1;\n if (!xs)\n if (J) {\n G = [ki, lr, ki + Rr, lr, ki + Rr, lr + Sr, ki, lr + Sr];\n for (let Vr = 0, pn = J.length; Vr < pn; ++Vr)\n if (p !== _e && _e < O[Vr]) {\n const Mi = J[Vr];\n Jo(\n [ki, lr, ki + Rr, lr + Sr],\n [Mi[0], Mi[3], Mi[4], Mi[7]]\n ) && (yr || (ce.save(), yr = !0), ce.beginPath(), ce.moveTo(G[0], G[1]), ce.lineTo(G[2], G[3]), ce.lineTo(G[4], G[5]), ce.lineTo(G[6], G[7]), ce.moveTo(Mi[6], Mi[7]), ce.lineTo(Mi[4], Mi[5]), ce.lineTo(Mi[2], Mi[3]), ce.lineTo(Mi[0], Mi[1]), ce.clip());\n }\n J.push(G), O.push(_e);\n } else\n ce.clearRect(ki, lr, Rr, Sr);\n this.drawTileImage(\n Ct,\n e,\n ki,\n lr,\n Rr,\n Sr,\n Ye,\n Ts\n ), J && !xs ? (yr && ce.restore(), this.renderedTiles.unshift(Ct)) : this.renderedTiles.push(Ct), this.updateUsedTiles(e.usedTiles, u, Ct);\n }\n }\n return this.renderedRevision = f, this.renderedResolution = g, this.extentChanged = !this.renderedExtent_ || !Cu(this.renderedExtent_, M), this.renderedExtent_ = M, this.renderedPixelRatio = c, this.renderedProjection = s, this.manageTilePyramid(\n e,\n u,\n d,\n c,\n s,\n m,\n p,\n h.getPreload()\n ), this.scheduleExpireCache(e, u), this.postRender(ce, e), i.extent && ce.restore(), ce.imageSmoothingEnabled = !0, Q !== de.style.transform && (de.style.transform = Q), this.container;\n }\n /**\n * @param {import(\"../../ImageTile.js\").default} tile Tile.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {number} x Left of the tile.\n * @param {number} y Top of the tile.\n * @param {number} w Width of the tile.\n * @param {number} h Height of the tile.\n * @param {number} gutter Tile gutter.\n * @param {boolean} transition Apply an alpha transition.\n */\n drawTileImage(e, t, i, r, s, a, o, l) {\n const c = this.getTileImage(e);\n if (!c)\n return;\n const h = ur(this), u = t.layerStatesArray[t.layerIndex], f = u.opacity * (l ? e.getAlpha(h, t.time) : 1), d = f !== this.context.globalAlpha;\n d && (this.context.save(), this.context.globalAlpha = f), this.context.drawImage(\n c,\n o,\n o,\n c.width - 2 * o,\n c.height - 2 * o,\n i,\n r,\n s,\n a\n ), d && this.context.restore(), f !== u.opacity ? t.animate = !0 : l && e.endTransition(h);\n }\n /**\n * @return {HTMLCanvasElement} Image\n */\n getImage() {\n const e = this.context;\n return e ? e.canvas : null;\n }\n /**\n * Get the image from a tile.\n * @param {import(\"../../ImageTile.js\").default} tile Tile.\n * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image.\n * @protected\n */\n getTileImage(e) {\n return e.getImage();\n }\n /**\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {import(\"../../source/Tile.js\").default} tileSource Tile source.\n * @protected\n */\n scheduleExpireCache(e, t) {\n if (t.canExpireCache()) {\n const i = (function(r, s, a) {\n const o = ur(r);\n o in a.usedTiles && r.expireCache(\n a.viewState.projection,\n a.usedTiles[o]\n );\n }).bind(null, t);\n e.postRenderFunctions.push(\n /** @type {import(\"../../Map.js\").PostRenderFunction} */\n i\n );\n }\n }\n /**\n * @param {!Object>} usedTiles Used tiles.\n * @param {import(\"../../source/Tile.js\").default} tileSource Tile source.\n * @param {import('../../Tile.js').default} tile Tile.\n * @protected\n */\n updateUsedTiles(e, t, i) {\n const r = ur(t);\n r in e || (e[r] = {}), e[r][i.getKey()] = !0;\n }\n /**\n * Manage tile pyramid.\n * This function performs a number of functions related to the tiles at the\n * current zoom and lower zoom levels:\n * - registers idle tiles in frameState.wantedTiles so that they are not\n * discarded by the tile queue\n * - enqueues missing tiles\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {import(\"../../source/Tile.js\").default} tileSource Tile source.\n * @param {import(\"../../tilegrid/TileGrid.js\").default} tileGrid Tile grid.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../../proj/Projection.js\").default} projection Projection.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @param {number} currentZ Current Z.\n * @param {number} preload Load low resolution tiles up to `preload` levels.\n * @param {function(import(\"../../Tile.js\").default):void} [tileCallback] Tile callback.\n * @protected\n */\n manageTilePyramid(e, t, i, r, s, a, o, l, c) {\n const h = ur(t);\n h in e.wantedTiles || (e.wantedTiles[h] = {});\n const u = e.wantedTiles[h], f = e.tileQueue, d = i.getMinZoom(), p = e.viewState.rotation, g = p ? yu(\n e.viewState.center,\n e.viewState.resolution,\n p,\n e.size\n ) : void 0;\n let m = 0, v, E, C, T, R, x;\n for (x = d; x <= o; ++x)\n for (E = i.getTileRangeForExtentAndZ(a, x, E), C = i.getResolution(x), T = E.minX; T <= E.maxX; ++T)\n for (R = E.minY; R <= E.maxY; ++R)\n p && !i.tileCoordIntersectsViewport([x, T, R], g) || (o - x <= l ? (++m, v = t.getTile(x, T, R, r, s), v.getState() == Qe.IDLE && (u[v.getKey()] = !0, f.isKeyQueued(v.getKey()) || f.enqueue([\n v,\n h,\n i.getTileCoordCenter(v.tileCoord),\n C\n ])), c !== void 0 && c(v)) : t.useTile(x, T, R, s));\n t.updateCacheSize(m, s);\n }\n}\nclass y3 extends f3 {\n /**\n * @param {import(\"./BaseTile.js\").Options} [options] Tile layer options.\n */\n constructor(e) {\n super(e);\n }\n createRenderer() {\n return new S3(this);\n }\n}\nconst rv = y3;\nclass I3 {\n /**\n * @param {number} [highWaterMark] High water mark.\n */\n constructor(e) {\n this.highWaterMark = e !== void 0 ? e : 2048, this.count_ = 0, this.entries_ = {}, this.oldest_ = null, this.newest_ = null;\n }\n /**\n * @return {boolean} Can expire cache.\n */\n canExpireCache() {\n return this.highWaterMark > 0 && this.getCount() > this.highWaterMark;\n }\n /**\n * Expire the cache.\n * @param {!Object} [keep] Keys to keep. To be implemented by subclasses.\n */\n expireCache(e) {\n for (; this.canExpireCache(); )\n this.pop();\n }\n /**\n * FIXME empty description for jsdoc\n */\n clear() {\n this.count_ = 0, this.entries_ = {}, this.oldest_ = null, this.newest_ = null;\n }\n /**\n * @param {string} key Key.\n * @return {boolean} Contains key.\n */\n containsKey(e) {\n return this.entries_.hasOwnProperty(e);\n }\n /**\n * @param {function(T, string, LRUCache): ?} f The function\n * to call for every entry from the oldest to the newer. This function takes\n * 3 arguments (the entry value, the entry key and the LRUCache object).\n * The return value is ignored.\n */\n forEach(e) {\n let t = this.oldest_;\n for (; t; )\n e(t.value_, t.key_, this), t = t.newer;\n }\n /**\n * @param {string} key Key.\n * @param {*} [options] Options (reserved for subclasses).\n * @return {T} Value.\n */\n get(e, t) {\n const i = this.entries_[e];\n return Kt(i !== void 0, 15), i === this.newest_ || (i === this.oldest_ ? (this.oldest_ = /** @type {Entry} */\n this.oldest_.newer, this.oldest_.older = null) : (i.newer.older = i.older, i.older.newer = i.newer), i.newer = null, i.older = this.newest_, this.newest_.newer = i, this.newest_ = i), i.value_;\n }\n /**\n * Remove an entry from the cache.\n * @param {string} key The entry key.\n * @return {T} The removed entry.\n */\n remove(e) {\n const t = this.entries_[e];\n return Kt(t !== void 0, 15), t === this.newest_ ? (this.newest_ = /** @type {Entry} */\n t.older, this.newest_ && (this.newest_.newer = null)) : t === this.oldest_ ? (this.oldest_ = /** @type {Entry} */\n t.newer, this.oldest_ && (this.oldest_.older = null)) : (t.newer.older = t.older, t.older.newer = t.newer), delete this.entries_[e], --this.count_, t.value_;\n }\n /**\n * @return {number} Count.\n */\n getCount() {\n return this.count_;\n }\n /**\n * @return {Array} Keys.\n */\n getKeys() {\n const e = new Array(this.count_);\n let t = 0, i;\n for (i = this.newest_; i; i = i.older)\n e[t++] = i.key_;\n return e;\n }\n /**\n * @return {Array} Values.\n */\n getValues() {\n const e = new Array(this.count_);\n let t = 0, i;\n for (i = this.newest_; i; i = i.older)\n e[t++] = i.value_;\n return e;\n }\n /**\n * @return {T} Last value.\n */\n peekLast() {\n return this.oldest_.value_;\n }\n /**\n * @return {string} Last key.\n */\n peekLastKey() {\n return this.oldest_.key_;\n }\n /**\n * Get the key of the newest item in the cache. Throws if the cache is empty.\n * @return {string} The newest key.\n */\n peekFirstKey() {\n return this.newest_.key_;\n }\n /**\n * Return an entry without updating least recently used time.\n * @param {string} key Key.\n * @return {T} Value.\n */\n peek(e) {\n if (this.containsKey(e))\n return this.entries_[e].value_;\n }\n /**\n * @return {T} value Value.\n */\n pop() {\n const e = this.oldest_;\n return delete this.entries_[e.key_], e.newer && (e.newer.older = null), this.oldest_ = /** @type {Entry} */\n e.newer, this.oldest_ || (this.newest_ = null), --this.count_, e.value_;\n }\n /**\n * @param {string} key Key.\n * @param {T} value Value.\n */\n replace(e, t) {\n this.get(e), this.entries_[e].value_ = t;\n }\n /**\n * @param {string} key Key.\n * @param {T} value Value.\n */\n set(e, t) {\n Kt(!(e in this.entries_), 16);\n const i = {\n key_: e,\n newer: null,\n older: this.newest_,\n value_: t\n };\n this.newest_ ? this.newest_.newer = i : this.oldest_ = i, this.newest_ = i, this.entries_[e] = i, ++this.count_;\n }\n /**\n * Set a maximum number of entries for the cache.\n * @param {number} size Cache size.\n * @api\n */\n setSize(e) {\n this.highWaterMark = e;\n }\n}\nfunction Vm(n, e, t, i) {\n return i !== void 0 ? (i[0] = n, i[1] = e, i[2] = t, i) : [n, e, t];\n}\nfunction sh(n, e, t) {\n return n + \"/\" + e + \"/\" + t;\n}\nfunction sv(n) {\n return sh(n[0], n[1], n[2]);\n}\nfunction b3(n) {\n return n.split(\"/\").map(Number);\n}\nfunction A3(n) {\n return (n[1] << n[0]) + n[2];\n}\nfunction M3(n, e) {\n const t = n[0], i = n[1], r = n[2];\n if (e.getMinZoom() > t || t > e.getMaxZoom())\n return !1;\n const s = e.getFullTileRange(t);\n return s ? s.containsXY(i, r) : !0;\n}\nclass nv extends I3 {\n clear() {\n for (; this.getCount() > 0; )\n this.pop().release();\n super.clear();\n }\n /**\n * @param {!Object} usedTiles Used tiles.\n */\n expireCache(e) {\n for (; this.canExpireCache() && !(this.peekLast().getKey() in e); )\n this.pop().release();\n }\n /**\n * Prune all tiles from the cache that don't have the same z as the newest tile.\n */\n pruneExceptNewestZ() {\n if (this.getCount() === 0)\n return;\n const e = this.peekFirstKey(), i = b3(e)[0];\n this.forEach((r) => {\n r.tileCoord[0] !== i && (this.remove(sv(r.tileCoord)), r.release());\n });\n }\n}\nconst nu = {\n /**\n * Triggered when a tile starts loading.\n * @event module:ol/source/Tile.TileSourceEvent#tileloadstart\n * @api\n */\n TILELOADSTART: \"tileloadstart\",\n /**\n * Triggered when a tile finishes loading, either when its data is loaded,\n * or when loading was aborted because the tile is no longer needed.\n * @event module:ol/source/Tile.TileSourceEvent#tileloadend\n * @api\n */\n TILELOADEND: \"tileloadend\",\n /**\n * Triggered if tile loading results in an error. Note that this is not the\n * right place to re-fetch tiles. See {@link module:ol/ImageTile~ImageTile#load}\n * for details.\n * @event module:ol/source/Tile.TileSourceEvent#tileloaderror\n * @api\n */\n TILELOADERROR: \"tileloaderror\"\n};\nclass P3 extends Ws {\n /**\n * @param {Options} options Source options.\n */\n constructor(e) {\n super(), this.projection = Fr(e.projection), this.attributions_ = Bm(e.attributions), this.attributionsCollapsible_ = e.attributionsCollapsible !== void 0 ? e.attributionsCollapsible : !0, this.loading = !1, this.state_ = e.state !== void 0 ? e.state : \"ready\", this.wrapX_ = e.wrapX !== void 0 ? e.wrapX : !1, this.interpolate_ = !!e.interpolate, this.viewResolver = null, this.viewRejector = null;\n const t = this;\n this.viewPromise_ = new Promise(function(i, r) {\n t.viewResolver = i, t.viewRejector = r;\n });\n }\n /**\n * Get the attribution function for the source.\n * @return {?Attribution} Attribution function.\n * @api\n */\n getAttributions() {\n return this.attributions_;\n }\n /**\n * @return {boolean} Attributions are collapsible.\n * @api\n */\n getAttributionsCollapsible() {\n return this.attributionsCollapsible_;\n }\n /**\n * Get the projection of the source.\n * @return {import(\"../proj/Projection.js\").default|null} Projection.\n * @api\n */\n getProjection() {\n return this.projection;\n }\n /**\n * @param {import(\"../proj/Projection\").default} [projection] Projection.\n * @return {Array|null} Resolutions.\n */\n getResolutions(e) {\n return null;\n }\n /**\n * @return {Promise} A promise for view-related properties.\n */\n getView() {\n return this.viewPromise_;\n }\n /**\n * Get the state of the source, see {@link import(\"./Source.js\").State} for possible states.\n * @return {import(\"./Source.js\").State} State.\n * @api\n */\n getState() {\n return this.state_;\n }\n /**\n * @return {boolean|undefined} Wrap X.\n */\n getWrapX() {\n return this.wrapX_;\n }\n /**\n * @return {boolean} Use linear interpolation when resampling.\n */\n getInterpolate() {\n return this.interpolate_;\n }\n /**\n * Refreshes the source. The source will be cleared, and data from the server will be reloaded.\n * @api\n */\n refresh() {\n this.changed();\n }\n /**\n * Set the attributions of the source.\n * @param {AttributionLike|undefined} attributions Attributions.\n * Can be passed as `string`, `Array`, {@link module:ol/source/Source~Attribution},\n * or `undefined`.\n * @api\n */\n setAttributions(e) {\n this.attributions_ = Bm(e), this.changed();\n }\n /**\n * Set the state of the source.\n * @param {import(\"./Source.js\").State} state State.\n */\n setState(e) {\n this.state_ = e, this.changed();\n }\n}\nfunction Bm(n) {\n return n ? Array.isArray(n) ? function(e) {\n return n;\n } : typeof n == \"function\" ? n : function(e) {\n return [n];\n } : null;\n}\nconst sa = [0, 0, 0], Qs = 5;\nclass O3 {\n /**\n * @param {Options} options Tile grid options.\n */\n constructor(e) {\n this.minZoom = e.minZoom !== void 0 ? e.minZoom : 0, this.resolutions_ = e.resolutions, Kt(\n U2(\n this.resolutions_,\n function(r, s) {\n return s - r;\n },\n !0\n ),\n 17\n );\n let t;\n if (!e.origins) {\n for (let r = 0, s = this.resolutions_.length - 1; r < s; ++r)\n if (!t)\n t = this.resolutions_[r] / this.resolutions_[r + 1];\n else if (this.resolutions_[r] / this.resolutions_[r + 1] !== t) {\n t = void 0;\n break;\n }\n }\n this.zoomFactor_ = t, this.maxZoom = this.resolutions_.length - 1, this.origin_ = e.origin !== void 0 ? e.origin : null, this.origins_ = null, e.origins !== void 0 && (this.origins_ = e.origins, Kt(this.origins_.length == this.resolutions_.length, 20));\n const i = e.extent;\n i !== void 0 && !this.origin_ && !this.origins_ && (this.origin_ = Bn(i)), Kt(\n !this.origin_ && this.origins_ || this.origin_ && !this.origins_,\n 18\n ), this.tileSizes_ = null, e.tileSizes !== void 0 && (this.tileSizes_ = e.tileSizes, Kt(this.tileSizes_.length == this.resolutions_.length, 19)), this.tileSize_ = e.tileSize !== void 0 ? e.tileSize : this.tileSizes_ ? null : Kf, Kt(\n !this.tileSize_ && this.tileSizes_ || this.tileSize_ && !this.tileSizes_,\n 22\n ), this.extent_ = i !== void 0 ? i : null, this.fullTileRanges_ = null, this.tmpSize_ = [0, 0], this.tmpExtent_ = [0, 0, 0, 0], e.sizes !== void 0 ? this.fullTileRanges_ = e.sizes.map(function(r, s) {\n const a = new hd(\n Math.min(0, r[0]),\n Math.max(r[0] - 1, -1),\n Math.min(0, r[1]),\n Math.max(r[1] - 1, -1)\n );\n if (i) {\n const o = this.getTileRangeForExtentAndZ(i, s);\n a.minX = Math.max(o.minX, a.minX), a.maxX = Math.min(o.maxX, a.maxX), a.minY = Math.max(o.minY, a.minY), a.maxY = Math.min(o.maxY, a.maxY);\n }\n return a;\n }, this) : i && this.calculateTileRanges_(i);\n }\n /**\n * Call a function with each tile coordinate for a given extent and zoom level.\n *\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {number} zoom Integer zoom level.\n * @param {function(import(\"../tilecoord.js\").TileCoord): void} callback Function called with each tile coordinate.\n * @api\n */\n forEachTileCoord(e, t, i) {\n const r = this.getTileRangeForExtentAndZ(e, t);\n for (let s = r.minX, a = r.maxX; s <= a; ++s)\n for (let o = r.minY, l = r.maxY; o <= l; ++o)\n i([t, s, o]);\n }\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {function(number, import(\"../TileRange.js\").default): boolean} callback Callback.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary import(\"../TileRange.js\").default object.\n * @param {import(\"../extent.js\").Extent} [tempExtent] Temporary import(\"../extent.js\").Extent object.\n * @return {boolean} Callback succeeded.\n */\n forEachTileCoordParentTileRange(e, t, i, r) {\n let s, a, o, l = null, c = e[0] - 1;\n for (this.zoomFactor_ === 2 ? (a = e[1], o = e[2]) : l = this.getTileCoordExtent(e, r); c >= this.minZoom; ) {\n if (this.zoomFactor_ === 2 ? (a = Math.floor(a / 2), o = Math.floor(o / 2), s = ra(a, a, o, o, i)) : s = this.getTileRangeForExtentAndZ(\n l,\n c,\n i\n ), t(c, s))\n return !0;\n --c;\n }\n return !1;\n }\n /**\n * Get the extent for this tile grid, if it was configured.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getExtent() {\n return this.extent_;\n }\n /**\n * Get the maximum zoom level for the grid.\n * @return {number} Max zoom.\n * @api\n */\n getMaxZoom() {\n return this.maxZoom;\n }\n /**\n * Get the minimum zoom level for the grid.\n * @return {number} Min zoom.\n * @api\n */\n getMinZoom() {\n return this.minZoom;\n }\n /**\n * Get the origin for the grid at the given zoom level.\n * @param {number} z Integer zoom level.\n * @return {import(\"../coordinate.js\").Coordinate} Origin.\n * @api\n */\n getOrigin(e) {\n return this.origin_ ? this.origin_ : this.origins_[e];\n }\n /**\n * Get the resolution for the given zoom level.\n * @param {number} z Integer zoom level.\n * @return {number} Resolution.\n * @api\n */\n getResolution(e) {\n return this.resolutions_[e];\n }\n /**\n * Get the list of resolutions for the tile grid.\n * @return {Array} Resolutions.\n * @api\n */\n getResolutions() {\n return this.resolutions_;\n }\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary import(\"../TileRange.js\").default object.\n * @param {import(\"../extent.js\").Extent} [tempExtent] Temporary import(\"../extent.js\").Extent object.\n * @return {import(\"../TileRange.js\").default|null} Tile range.\n */\n getTileCoordChildTileRange(e, t, i) {\n if (e[0] < this.maxZoom) {\n if (this.zoomFactor_ === 2) {\n const s = e[1] * 2, a = e[2] * 2;\n return ra(\n s,\n s + 1,\n a,\n a + 1,\n t\n );\n }\n const r = this.getTileCoordExtent(\n e,\n i || this.tmpExtent_\n );\n return this.getTileRangeForExtentAndZ(\n r,\n e[0] + 1,\n t\n );\n }\n return null;\n }\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {number} z Integer zoom level.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary import(\"../TileRange.js\").default object.\n * @return {import(\"../TileRange.js\").default|null} Tile range.\n */\n getTileRangeForTileCoordAndZ(e, t, i) {\n if (t > this.maxZoom || t < this.minZoom)\n return null;\n const r = e[0], s = e[1], a = e[2];\n if (t === r)\n return ra(\n s,\n a,\n s,\n a,\n i\n );\n if (this.zoomFactor_) {\n const l = Math.pow(this.zoomFactor_, t - r), c = Math.floor(s * l), h = Math.floor(a * l);\n if (t < r)\n return ra(c, c, h, h, i);\n const u = Math.floor(l * (s + 1)) - 1, f = Math.floor(l * (a + 1)) - 1;\n return ra(c, u, h, f, i);\n }\n const o = this.getTileCoordExtent(e, this.tmpExtent_);\n return this.getTileRangeForExtentAndZ(o, t, i);\n }\n /**\n * Get a tile range for the given extent and integer zoom level.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {number} z Integer zoom level.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary tile range object.\n * @return {import(\"../TileRange.js\").default} Tile range.\n */\n getTileRangeForExtentAndZ(e, t, i) {\n this.getTileCoordForXYAndZ_(e[0], e[3], t, !1, sa);\n const r = sa[1], s = sa[2];\n this.getTileCoordForXYAndZ_(e[2], e[1], t, !0, sa);\n const a = sa[1], o = sa[2];\n return ra(r, a, s, o, i);\n }\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @return {import(\"../coordinate.js\").Coordinate} Tile center.\n */\n getTileCoordCenter(e) {\n const t = this.getOrigin(e[0]), i = this.getResolution(e[0]), r = sn(this.getTileSize(e[0]), this.tmpSize_);\n return [\n t[0] + (e[1] + 0.5) * r[0] * i,\n t[1] - (e[2] + 0.5) * r[1] * i\n ];\n }\n /**\n * Get the extent of a tile coordinate.\n *\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"../extent.js\").Extent} [tempExtent] Temporary extent object.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getTileCoordExtent(e, t) {\n const i = this.getOrigin(e[0]), r = this.getResolution(e[0]), s = sn(this.getTileSize(e[0]), this.tmpSize_), a = i[0] + e[1] * s[0] * r, o = i[1] - (e[2] + 1) * s[1] * r, l = a + s[0] * r, c = o + s[1] * r;\n return Ha(a, o, l, c, t);\n }\n /**\n * Get the tile coordinate for the given map coordinate and resolution. This\n * method considers that coordinates that intersect tile boundaries should be\n * assigned the higher tile coordinate.\n *\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {number} resolution Resolution.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Destination import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @api\n */\n getTileCoordForCoordAndResolution(e, t, i) {\n return this.getTileCoordForXYAndResolution_(\n e[0],\n e[1],\n t,\n !1,\n i\n );\n }\n /**\n * Note that this method should not be called for resolutions that correspond\n * to an integer zoom level. Instead call the `getTileCoordForXYAndZ_` method.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {number} resolution Resolution (for a non-integer zoom level).\n * @param {boolean} reverseIntersectionPolicy Instead of letting edge\n * intersections go to the higher tile coordinate, let edge intersections\n * go to the lower tile coordinate.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Temporary import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @private\n */\n getTileCoordForXYAndResolution_(e, t, i, r, s) {\n const a = this.getZForResolution(i), o = i / this.getResolution(a), l = this.getOrigin(a), c = sn(this.getTileSize(a), this.tmpSize_);\n let h = o * (e - l[0]) / i / c[0], u = o * (l[1] - t) / i / c[1];\n return r ? (h = xl(h, Qs) - 1, u = xl(u, Qs) - 1) : (h = Tl(h, Qs), u = Tl(u, Qs)), Vm(a, h, u, s);\n }\n /**\n * Although there is repetition between this method and `getTileCoordForXYAndResolution_`,\n * they should have separate implementations. This method is for integer zoom\n * levels. The other method should only be called for resolutions corresponding\n * to non-integer zoom levels.\n * @param {number} x Map x coordinate.\n * @param {number} y Map y coordinate.\n * @param {number} z Integer zoom level.\n * @param {boolean} reverseIntersectionPolicy Instead of letting edge\n * intersections go to the higher tile coordinate, let edge intersections\n * go to the lower tile coordinate.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Temporary import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @private\n */\n getTileCoordForXYAndZ_(e, t, i, r, s) {\n const a = this.getOrigin(i), o = this.getResolution(i), l = sn(this.getTileSize(i), this.tmpSize_);\n let c = (e - a[0]) / o / l[0], h = (a[1] - t) / o / l[1];\n return r ? (c = xl(c, Qs) - 1, h = xl(h, Qs) - 1) : (c = Tl(c, Qs), h = Tl(h, Qs)), Vm(i, c, h, s);\n }\n /**\n * Get a tile coordinate given a map coordinate and zoom level.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {number} z Zoom level.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Destination import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @api\n */\n getTileCoordForCoordAndZ(e, t, i) {\n return this.getTileCoordForXYAndZ_(\n e[0],\n e[1],\n t,\n !1,\n i\n );\n }\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @return {number} Tile resolution.\n */\n getTileCoordResolution(e) {\n return this.resolutions_[e[0]];\n }\n /**\n * Get the tile size for a zoom level. The type of the return value matches the\n * `tileSize` or `tileSizes` that the tile grid was configured with. To always\n * get an {@link import(\"../size.js\").Size}, run the result through {@link module:ol/size.toSize}.\n * @param {number} z Z.\n * @return {number|import(\"../size.js\").Size} Tile size.\n * @api\n */\n getTileSize(e) {\n return this.tileSize_ ? this.tileSize_ : this.tileSizes_[e];\n }\n /**\n * @param {number} z Zoom level.\n * @return {import(\"../TileRange.js\").default} Extent tile range for the specified zoom level.\n */\n getFullTileRange(e) {\n return this.fullTileRanges_ ? this.fullTileRanges_[e] : this.extent_ ? this.getTileRangeForExtentAndZ(this.extent_, e) : null;\n }\n /**\n * @param {number} resolution Resolution.\n * @param {number|import(\"../array.js\").NearestDirectionFunction} [opt_direction]\n * If 0, the nearest resolution will be used.\n * If 1, the nearest higher resolution (lower Z) will be used. If -1, the\n * nearest lower resolution (higher Z) will be used. Default is 0.\n * Use a {@link module:ol/array~NearestDirectionFunction} for more precise control.\n *\n * For example to change tile Z at the midpoint of zoom levels\n * ```js\n * function(value, high, low) {\n * return value - low * Math.sqrt(high / low);\n * }\n * ```\n * @return {number} Z.\n * @api\n */\n getZForResolution(e, t) {\n const i = Gf(\n this.resolutions_,\n e,\n t || 0\n );\n return Vi(i, this.minZoom, this.maxZoom);\n }\n /**\n * The tile with the provided tile coordinate intersects the given viewport.\n * @param {import('../tilecoord.js').TileCoord} tileCoord Tile coordinate.\n * @param {Array} viewport Viewport as returned from {@link module:ol/extent.getRotatedViewport}.\n * @return {boolean} The tile with the provided tile coordinate intersects the given viewport.\n */\n tileCoordIntersectsViewport(e, t) {\n return HE(\n t,\n 0,\n t.length,\n 2,\n this.getTileCoordExtent(e)\n );\n }\n /**\n * @param {!import(\"../extent.js\").Extent} extent Extent for this tile grid.\n * @private\n */\n calculateTileRanges_(e) {\n const t = this.resolutions_.length, i = new Array(t);\n for (let r = this.minZoom; r < t; ++r)\n i[r] = this.getTileRangeForExtentAndZ(e, r);\n this.fullTileRanges_ = i;\n }\n}\nconst av = O3;\nfunction ov(n) {\n let e = n.getDefaultTileGrid();\n return e || (e = L3(n), n.setDefaultTileGrid(e)), e;\n}\nfunction D3(n, e, t) {\n const i = e[0], r = n.getTileCoordCenter(e), s = ud(t);\n if (!Hf(s, r)) {\n const a = Ui(s), o = Math.ceil(\n (s[0] - r[0]) / a\n );\n return r[0] += a * o, n.getTileCoordForCoordAndZ(r, i);\n }\n return e;\n}\nfunction N3(n, e, t, i) {\n i = i !== void 0 ? i : \"top-left\";\n const r = lv(n, e, t);\n return new av({\n extent: n,\n origin: iw(n, i),\n resolutions: r,\n tileSize: t\n });\n}\nfunction F3(n) {\n const e = n || {}, t = e.extent || Fr(\"EPSG:3857\").getExtent(), i = {\n extent: t,\n minZoom: e.minZoom,\n tileSize: e.tileSize,\n resolutions: lv(\n t,\n e.maxZoom,\n e.tileSize,\n e.maxResolution\n )\n };\n return new av(i);\n}\nfunction lv(n, e, t, i) {\n e = e !== void 0 ? e : _w, t = sn(t !== void 0 ? t : Kf);\n const r = gs(n), s = Ui(n);\n i = i > 0 ? i : Math.max(s / t[0], r / t[1]);\n const a = e + 1, o = new Array(a);\n for (let l = 0; l < a; ++l)\n o[l] = i / Math.pow(2, l);\n return o;\n}\nfunction L3(n, e, t, i) {\n const r = ud(n);\n return N3(r, e, t, i);\n}\nfunction ud(n) {\n n = Fr(n);\n let e = n.getExtent();\n if (!e) {\n const t = 180 * Po.degrees / n.getMetersPerUnit();\n e = Ha(-t, -t, t, t);\n }\n return e;\n}\nclass w3 extends P3 {\n /**\n * @param {Options} options SourceTile source options.\n */\n constructor(e) {\n super({\n attributions: e.attributions,\n attributionsCollapsible: e.attributionsCollapsible,\n projection: e.projection,\n state: e.state,\n wrapX: e.wrapX,\n interpolate: e.interpolate\n }), this.on, this.once, this.un, this.opaque_ = e.opaque !== void 0 ? e.opaque : !1, this.tilePixelRatio_ = e.tilePixelRatio !== void 0 ? e.tilePixelRatio : 1, this.tileGrid = e.tileGrid !== void 0 ? e.tileGrid : null;\n const t = [256, 256];\n this.tileGrid && sn(this.tileGrid.getTileSize(this.tileGrid.getMinZoom()), t), this.tileCache = new nv(e.cacheSize || 0), this.tmpSize = [0, 0], this.key_ = e.key || \"\", this.tileOptions = {\n transition: e.transition,\n interpolate: e.interpolate\n }, this.zDirection = e.zDirection ? e.zDirection : 0;\n }\n /**\n * @return {boolean} Can expire cache.\n */\n canExpireCache() {\n return this.tileCache.canExpireCache();\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @param {!Object} usedTiles Used tiles.\n */\n expireCache(e, t) {\n const i = this.getTileCacheForProjection(e);\n i && i.expireCache(t);\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @param {number} z Zoom level.\n * @param {import(\"../TileRange.js\").default} tileRange Tile range.\n * @param {function(import(\"../Tile.js\").default):(boolean|void)} callback Called with each\n * loaded tile. If the callback returns `false`, the tile will not be\n * considered loaded.\n * @return {boolean} The tile range is fully covered with loaded tiles.\n */\n forEachLoadedTile(e, t, i, r) {\n const s = this.getTileCacheForProjection(e);\n if (!s)\n return !1;\n let a = !0, o, l, c;\n for (let h = i.minX; h <= i.maxX; ++h)\n for (let u = i.minY; u <= i.maxY; ++u)\n l = sh(t, h, u), c = !1, s.containsKey(l) && (o = /** @type {!import(\"../Tile.js\").default} */\n s.get(l), c = o.getState() === Qe.LOADED, c && (c = r(o) !== !1)), c || (a = !1);\n return a;\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {number} Gutter.\n */\n getGutterForProjection(e) {\n return 0;\n }\n /**\n * Return the key to be used for all tiles in the source.\n * @return {string} The key for all tiles.\n */\n getKey() {\n return this.key_;\n }\n /**\n * Set the value to be used as the key for all tiles in the source.\n * @param {string} key The key for tiles.\n * @protected\n */\n setKey(e) {\n this.key_ !== e && (this.key_ = e, this.changed());\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {boolean} Opaque.\n */\n getOpaque(e) {\n return this.opaque_;\n }\n /**\n * @param {import(\"../proj/Projection\").default} [projection] Projection.\n * @return {Array|null} Resolutions.\n */\n getResolutions(e) {\n const t = e ? this.getTileGridForProjection(e) : this.tileGrid;\n return t ? t.getResolutions() : null;\n }\n /**\n * @abstract\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!import(\"../Tile.js\").default} Tile.\n */\n getTile(e, t, i, r, s) {\n return di();\n }\n /**\n * Return the tile grid of the tile source.\n * @return {import(\"../tilegrid/TileGrid.js\").default|null} Tile grid.\n * @api\n */\n getTileGrid() {\n return this.tileGrid;\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!import(\"../tilegrid/TileGrid.js\").default} Tile grid.\n */\n getTileGridForProjection(e) {\n return this.tileGrid ? this.tileGrid : ov(e);\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {import(\"../TileCache.js\").default} Tile cache.\n * @protected\n */\n getTileCacheForProjection(e) {\n const t = this.getProjection();\n return Kt(\n t === null || aa(t, e),\n 68\n // A VectorTile source can only be rendered if it has a projection compatible with the view projection.\n ), this.tileCache;\n }\n /**\n * Get the tile pixel ratio for this source. Subclasses may override this\n * method, which is meant to return a supported pixel ratio that matches the\n * provided `pixelRatio` as close as possible.\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} Tile pixel ratio.\n */\n getTilePixelRatio(e) {\n return this.tilePixelRatio_;\n }\n /**\n * @param {number} z Z.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {import(\"../size.js\").Size} Tile size.\n */\n getTilePixelSize(e, t, i) {\n const r = this.getTileGridForProjection(i), s = this.getTilePixelRatio(t), a = sn(r.getTileSize(e), this.tmpSize);\n return s == 1 ? a : h3(a, s, this.tmpSize);\n }\n /**\n * Returns a tile coordinate wrapped around the x-axis. When the tile coordinate\n * is outside the resolution and extent range of the tile grid, `null` will be\n * returned.\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"../proj/Projection.js\").default} [projection] Projection.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate to be passed to the tileUrlFunction or\n * null if no tile URL should be created for the passed `tileCoord`.\n */\n getTileCoordForTileUrlFunction(e, t) {\n t = t !== void 0 ? t : this.getProjection();\n const i = this.getTileGridForProjection(t);\n return this.getWrapX() && t.isGlobal() && (e = D3(i, e, t)), M3(e, i) ? e : null;\n }\n /**\n * Remove all cached tiles from the source. The next render cycle will fetch new tiles.\n * @api\n */\n clear() {\n this.tileCache.clear();\n }\n refresh() {\n this.clear(), super.refresh();\n }\n /**\n * Increases the cache size if needed\n * @param {number} tileCount Minimum number of tiles needed.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n */\n updateCacheSize(e, t) {\n const i = this.getTileCacheForProjection(t);\n e > i.highWaterMark && (i.highWaterMark = e);\n }\n /**\n * Marks a tile coord as being used, without triggering a load.\n * @abstract\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n */\n useTile(e, t, i, r) {\n }\n}\nclass U3 extends dn {\n /**\n * @param {string} type Type.\n * @param {import(\"../Tile.js\").default} tile The tile.\n */\n constructor(e, t) {\n super(e), this.tile = t;\n }\n}\nfunction V3(n, e) {\n const t = /\\{z\\}/g, i = /\\{x\\}/g, r = /\\{y\\}/g, s = /\\{-y\\}/g;\n return (\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile Coordinate.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @return {string|undefined} Tile URL.\n */\n function(a, o, l) {\n if (a)\n return n.replace(t, a[0].toString()).replace(i, a[1].toString()).replace(r, a[2].toString()).replace(s, function() {\n const c = a[0], h = e.getFullTileRange(c);\n return Kt(h, 55), (h.getHeight() - a[2] - 1).toString();\n });\n }\n );\n}\nfunction B3(n, e) {\n const t = n.length, i = new Array(t);\n for (let r = 0; r < t; ++r)\n i[r] = V3(n[r], e);\n return k3(i);\n}\nfunction k3(n) {\n return n.length === 1 ? n[0] : (\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile Coordinate.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @return {string|undefined} Tile URL.\n */\n function(e, t, i) {\n if (!e)\n return;\n const r = A3(e), s = Ra(r, n.length);\n return n[s](e, t, i);\n }\n );\n}\nfunction z3(n) {\n const e = [];\n let t = /\\{([a-z])-([a-z])\\}/.exec(n);\n if (t) {\n const i = t[1].charCodeAt(0), r = t[2].charCodeAt(0);\n let s;\n for (s = i; s <= r; ++s)\n e.push(n.replace(t[0], String.fromCharCode(s)));\n return e;\n }\n if (t = /\\{(\\d+)-(\\d+)\\}/.exec(n), t) {\n const i = parseInt(t[2], 10);\n for (let r = parseInt(t[1], 10); r <= i; r++)\n e.push(n.replace(t[0], r.toString()));\n return e;\n }\n return e.push(n), e;\n}\nclass fd extends w3 {\n /**\n * @param {Options} options Image tile options.\n */\n constructor(e) {\n super({\n attributions: e.attributions,\n cacheSize: e.cacheSize,\n opaque: e.opaque,\n projection: e.projection,\n state: e.state,\n tileGrid: e.tileGrid,\n tilePixelRatio: e.tilePixelRatio,\n wrapX: e.wrapX,\n transition: e.transition,\n interpolate: e.interpolate,\n key: e.key,\n attributionsCollapsible: e.attributionsCollapsible,\n zDirection: e.zDirection\n }), this.generateTileUrlFunction_ = this.tileUrlFunction === fd.prototype.tileUrlFunction, this.tileLoadFunction = e.tileLoadFunction, e.tileUrlFunction && (this.tileUrlFunction = e.tileUrlFunction), this.urls = null, e.urls ? this.setUrls(e.urls) : e.url && this.setUrl(e.url), this.tileLoadingKeys_ = {};\n }\n /**\n * Return the tile load function of the source.\n * @return {import(\"../Tile.js\").LoadFunction} TileLoadFunction\n * @api\n */\n getTileLoadFunction() {\n return this.tileLoadFunction;\n }\n /**\n * Return the tile URL function of the source.\n * @return {import(\"../Tile.js\").UrlFunction} TileUrlFunction\n * @api\n */\n getTileUrlFunction() {\n return Object.getPrototypeOf(this).tileUrlFunction === this.tileUrlFunction ? this.tileUrlFunction.bind(this) : this.tileUrlFunction;\n }\n /**\n * Return the URLs used for this source.\n * When a tileUrlFunction is used instead of url or urls,\n * null will be returned.\n * @return {!Array|null} URLs.\n * @api\n */\n getUrls() {\n return this.urls;\n }\n /**\n * Handle tile change events.\n * @param {import(\"../events/Event.js\").default} event Event.\n * @protected\n */\n handleTileChange(e) {\n const t = (\n /** @type {import(\"../Tile.js\").default} */\n e.target\n ), i = ur(t), r = t.getState();\n let s;\n r == Qe.LOADING ? (this.tileLoadingKeys_[i] = !0, s = nu.TILELOADSTART) : i in this.tileLoadingKeys_ && (delete this.tileLoadingKeys_[i], s = r == Qe.ERROR ? nu.TILELOADERROR : r == Qe.LOADED ? nu.TILELOADEND : void 0), s != null && this.dispatchEvent(new U3(s, t));\n }\n /**\n * Set the tile load function of the source.\n * @param {import(\"../Tile.js\").LoadFunction} tileLoadFunction Tile load function.\n * @api\n */\n setTileLoadFunction(e) {\n this.tileCache.clear(), this.tileLoadFunction = e, this.changed();\n }\n /**\n * Set the tile URL function of the source.\n * @param {import(\"../Tile.js\").UrlFunction} tileUrlFunction Tile URL function.\n * @param {string} [key] Optional new tile key for the source.\n * @api\n */\n setTileUrlFunction(e, t) {\n this.tileUrlFunction = e, this.tileCache.pruneExceptNewestZ(), typeof t < \"u\" ? this.setKey(t) : this.changed();\n }\n /**\n * Set the URL to use for requests.\n * @param {string} url URL.\n * @api\n */\n setUrl(e) {\n const t = z3(e);\n this.urls = t, this.setUrls(t);\n }\n /**\n * Set the URLs to use for requests.\n * @param {Array} urls URLs.\n * @api\n */\n setUrls(e) {\n this.urls = e;\n const t = e.join(`\n`);\n this.generateTileUrlFunction_ ? this.setTileUrlFunction(B3(e, this.tileGrid), t) : this.setKey(t);\n }\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {string|undefined} Tile URL.\n */\n tileUrlFunction(e, t, i) {\n }\n /**\n * Marks a tile coord as being used, without triggering a load.\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n */\n useTile(e, t, i) {\n const r = sh(e, t, i);\n this.tileCache.containsKey(r) && this.tileCache.get(r);\n }\n}\nclass W3 extends fd {\n /**\n * @param {!Options} options Image tile options.\n */\n constructor(e) {\n super({\n attributions: e.attributions,\n cacheSize: e.cacheSize,\n opaque: e.opaque,\n projection: e.projection,\n state: e.state,\n tileGrid: e.tileGrid,\n tileLoadFunction: e.tileLoadFunction ? e.tileLoadFunction : G3,\n tilePixelRatio: e.tilePixelRatio,\n tileUrlFunction: e.tileUrlFunction,\n url: e.url,\n urls: e.urls,\n wrapX: e.wrapX,\n transition: e.transition,\n interpolate: e.interpolate !== void 0 ? e.interpolate : !0,\n key: e.key,\n attributionsCollapsible: e.attributionsCollapsible,\n zDirection: e.zDirection\n }), this.crossOrigin = e.crossOrigin !== void 0 ? e.crossOrigin : null, this.tileClass = e.tileClass !== void 0 ? e.tileClass : iv, this.tileCacheForProjection = {}, this.tileGridForProjection = {}, this.reprojectionErrorThreshold_ = e.reprojectionErrorThreshold, this.renderReprojectionEdges_ = !1;\n }\n /**\n * @return {boolean} Can expire cache.\n */\n canExpireCache() {\n if (this.tileCache.canExpireCache())\n return !0;\n for (const e in this.tileCacheForProjection)\n if (this.tileCacheForProjection[e].canExpireCache())\n return !0;\n return !1;\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @param {!Object} usedTiles Used tiles.\n */\n expireCache(e, t) {\n const i = this.getTileCacheForProjection(e);\n this.tileCache.expireCache(\n this.tileCache == i ? t : {}\n );\n for (const r in this.tileCacheForProjection) {\n const s = this.tileCacheForProjection[r];\n s.expireCache(s == i ? t : {});\n }\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {number} Gutter.\n */\n getGutterForProjection(e) {\n return this.getProjection() && e && !aa(this.getProjection(), e) ? 0 : this.getGutter();\n }\n /**\n * @return {number} Gutter.\n */\n getGutter() {\n return 0;\n }\n /**\n * Return the key to be used for all tiles in the source.\n * @return {string} The key for all tiles.\n */\n getKey() {\n let e = super.getKey();\n return this.getInterpolate() || (e += \":disable-interpolation\"), e;\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {boolean} Opaque.\n */\n getOpaque(e) {\n return this.getProjection() && e && !aa(this.getProjection(), e) ? !1 : super.getOpaque(e);\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!import(\"../tilegrid/TileGrid.js\").default} Tile grid.\n */\n getTileGridForProjection(e) {\n const t = this.getProjection();\n if (this.tileGrid && (!t || aa(t, e)))\n return this.tileGrid;\n const i = ur(e);\n return i in this.tileGridForProjection || (this.tileGridForProjection[i] = ov(e)), this.tileGridForProjection[i];\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {import(\"../TileCache.js\").default} Tile cache.\n */\n getTileCacheForProjection(e) {\n const t = this.getProjection();\n if (!t || aa(t, e))\n return this.tileCache;\n const i = ur(e);\n return i in this.tileCacheForProjection || (this.tileCacheForProjection[i] = new nv(\n this.tileCache.highWaterMark\n )), this.tileCacheForProjection[i];\n }\n /**\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @param {string} key The key set on the tile.\n * @return {!ImageTile} Tile.\n * @private\n */\n createTile_(e, t, i, r, s, a) {\n const o = [e, t, i], l = this.getTileCoordForTileUrlFunction(\n o,\n s\n ), c = l ? this.tileUrlFunction(l, r, s) : void 0, h = new this.tileClass(\n o,\n c !== void 0 ? Qe.IDLE : Qe.EMPTY,\n c !== void 0 ? c : \"\",\n this.crossOrigin,\n this.tileLoadFunction,\n this.tileOptions\n );\n return h.key = a, h.addEventListener(St.CHANGE, this.handleTileChange.bind(this)), h;\n }\n /**\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!(ImageTile|ReprojTile)} Tile.\n */\n getTile(e, t, i, r, s) {\n const a = this.getProjection();\n if (!a || !s || aa(a, s))\n return this.getTileInternal(\n e,\n t,\n i,\n r,\n a || s\n );\n const o = this.getTileCacheForProjection(s), l = [e, t, i];\n let c;\n const h = sv(l);\n o.containsKey(h) && (c = o.get(h));\n const u = this.getKey();\n if (c && c.key == u)\n return c;\n const f = this.getTileGridForProjection(a), d = this.getTileGridForProjection(s), p = this.getTileCoordForTileUrlFunction(\n l,\n s\n ), g = new Du(\n a,\n f,\n s,\n d,\n l,\n p,\n this.getTilePixelRatio(r),\n this.getGutter(),\n (m, v, E, C) => this.getTileInternal(m, v, E, C, a),\n this.reprojectionErrorThreshold_,\n this.renderReprojectionEdges_,\n this.getInterpolate()\n );\n return g.key = u, c ? (g.interimTile = c, g.refreshInterimChain(), o.replace(h, g)) : o.set(h, g), g;\n }\n /**\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {number} pixelRatio Pixel ratio.\n * @param {!import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!ImageTile} Tile.\n * @protected\n */\n getTileInternal(e, t, i, r, s) {\n let a = null;\n const o = sh(e, t, i), l = this.getKey();\n if (!this.tileCache.containsKey(o))\n a = this.createTile_(e, t, i, r, s, l), this.tileCache.set(o, a);\n else if (a = this.tileCache.get(o), a.key != l) {\n const c = a;\n a = this.createTile_(e, t, i, r, s, l), c.getState() == Qe.IDLE ? a.interimTile = c.interimTile : a.interimTile = c, a.refreshInterimChain(), this.tileCache.replace(o, a);\n }\n return a;\n }\n /**\n * Sets whether to render reprojection edges or not (usually for debugging).\n * @param {boolean} render Render the edges.\n * @api\n */\n setRenderReprojectionEdges(e) {\n if (this.renderReprojectionEdges_ != e) {\n this.renderReprojectionEdges_ = e;\n for (const t in this.tileCacheForProjection)\n this.tileCacheForProjection[t].clear();\n this.changed();\n }\n }\n /**\n * Sets the tile grid to use when reprojecting the tiles to the given\n * projection instead of the default tile grid for the projection.\n *\n * This can be useful when the default tile grid cannot be created\n * (e.g. projection has no extent defined) or\n * for optimization reasons (custom tile size, resolutions, ...).\n *\n * @param {import(\"../proj.js\").ProjectionLike} projection Projection.\n * @param {import(\"../tilegrid/TileGrid.js\").default} tilegrid Tile grid to use for the projection.\n * @api\n */\n setTileGridForProjection(e, t) {\n const i = Fr(e);\n if (i) {\n const r = ur(i);\n r in this.tileGridForProjection || (this.tileGridForProjection[r] = t);\n }\n }\n clear() {\n super.clear();\n for (const e in this.tileCacheForProjection)\n this.tileCacheForProjection[e].clear();\n }\n}\nfunction G3(n, e) {\n n.getImage().src = e;\n}\nclass X3 extends W3 {\n /**\n * @param {Options} [options] XYZ options.\n */\n constructor(e) {\n e = e || {};\n const t = e.projection !== void 0 ? e.projection : \"EPSG:3857\", i = e.tileGrid !== void 0 ? e.tileGrid : F3({\n extent: ud(t),\n maxResolution: e.maxResolution,\n maxZoom: e.maxZoom,\n minZoom: e.minZoom,\n tileSize: e.tileSize\n });\n super({\n attributions: e.attributions,\n cacheSize: e.cacheSize,\n crossOrigin: e.crossOrigin,\n interpolate: e.interpolate,\n opaque: e.opaque,\n projection: t,\n reprojectionErrorThreshold: e.reprojectionErrorThreshold,\n tileGrid: i,\n tileLoadFunction: e.tileLoadFunction,\n tilePixelRatio: e.tilePixelRatio,\n tileUrlFunction: e.tileUrlFunction,\n url: e.url,\n urls: e.urls,\n wrapX: e.wrapX !== void 0 ? e.wrapX : !0,\n transition: e.transition,\n attributionsCollapsible: e.attributionsCollapsible,\n zDirection: e.zDirection\n }), this.gutter_ = e.gutter !== void 0 ? e.gutter : 0;\n }\n /**\n * @return {number} Gutter.\n */\n getGutter() {\n return this.gutter_;\n }\n}\nvar H3 = typeof globalThis < \"u\" ? globalThis : typeof window < \"u\" ? window : typeof global < \"u\" ? global : typeof self < \"u\" ? self : {};\nfunction cv(n) {\n return n && n.__esModule && Object.prototype.hasOwnProperty.call(n, \"default\") ? n.default : n;\n}\nconst K3 = '© OpenStreetMap contributors.';\nclass q3 extends X3 {\n /**\n * @param {Options} [options] Open Street Map options.\n */\n constructor(e) {\n e = e || {};\n let t;\n e.attributions !== void 0 ? t = e.attributions : t = [K3];\n const i = e.crossOrigin !== void 0 ? e.crossOrigin : \"anonymous\", r = e.url !== void 0 ? e.url : \"https://tile.openstreetmap.org/{z}/{x}/{y}.png\";\n super({\n attributions: t,\n attributionsCollapsible: !1,\n cacheSize: e.cacheSize,\n crossOrigin: i,\n interpolate: e.interpolate,\n maxZoom: e.maxZoom !== void 0 ? e.maxZoom : 19,\n opaque: e.opaque !== void 0 ? e.opaque : !0,\n reprojectionErrorThreshold: e.reprojectionErrorThreshold,\n tileLoadFunction: e.tileLoadFunction,\n transition: e.transition,\n url: r,\n wrapX: e.wrapX,\n zDirection: e.zDirection\n });\n }\n}\nconst hv = q3;\nclass Y3 {\n constructor(e, t, i, r, s, a) {\n this.name = e, this.scene = a, this.layers = t, this.target = \"globe\", this.view = i, this.resolution = r, this.diameter = s, this.container = this.createContainer(), this.map = this.createOLMap(), this.texture = this.createTexture(), this.context = this.texture.getContext(), this.mesh = this.createMesh(), this.lonLatToVector3 = this.createScales;\n }\n createContainer() {\n let e = document.createElement(\"div\");\n return e.style.position = \"fixed\", e.style.visibility = \"hidden\", e.style.width = this.resolution.x + \"px\", e.style.height = this.resolution.y + \"px\", e.setAttribute(\"id\", \"globe\"), document.body.appendChild(e), e;\n }\n createOLMap() {\n return new ev({\n pixelRatio: 1,\n layers: this.layers,\n target: this.target,\n view: this.view\n });\n }\n createTexture() {\n let e = this.scene, t = this.target, i = new Ac(\n \"mapTexture\",\n { width: this.resolution.x, height: this.resolution.y },\n e\n );\n return this.map.on(\"postrender\", function() {\n var r = document.getElementById(t), s = r.getElementsByTagName(\"canvas\")[0];\n i.getContext().drawImage(s, 0, 0), i.update();\n }), i;\n }\n createMesh() {\n let e = kt.CreateSphere(this.name, { diameter: this.diameter }, this.scene);\n e.rotate(Vp.X, Math.PI, so.WORLD), e.rotate(Vp.Y, Math.PI, so.WORLD);\n let t = new Vs(this.name + \"_material\", this.scene);\n return e.bakeCurrentTransformIntoVertices(), t.diffuseTexture = this.texture, t.specularColor = new pi(0, 0, 0), e.material = t, e;\n }\n createScales(e) {\n let t = e[0] * Math.PI / 180, i = e[1] * Math.PI / 180, r = this.diameter / 2, s = r * Math.cos(i) * Math.cos(t), a = r * Math.cos(i) * Math.sin(t), o = r * Math.sin(i);\n return new Me(s, o, a);\n }\n}\nfunction Ik(n, e = {}, t) {\n const i = e.layers || [\n new rv({ source: new hv(), extent: [-180, -90, 180, 90] })\n ], r = e.view || new jr({\n projection: \"EPSG:4326\",\n extent: [-180, -90, 180, 90],\n center: [0, 0],\n zoom: 0\n }), s = e.resolution || new da(1e3, 500), a = e.diameter || 1;\n return new Y3(n, i, r, s, a, t);\n}\nfunction Yl(n, e) {\n return n == null || e == null ? NaN : n < e ? -1 : n > e ? 1 : n >= e ? 0 : NaN;\n}\nfunction Z3(n, e) {\n return n == null || e == null ? NaN : e < n ? -1 : e > n ? 1 : e >= n ? 0 : NaN;\n}\nfunction uv(n) {\n let e, t, i;\n n.length !== 2 ? (e = Yl, t = (o, l) => Yl(n(o), l), i = (o, l) => n(o) - l) : (e = n === Yl || n === Z3 ? n : j3, t = n, i = n);\n function r(o, l, c = 0, h = o.length) {\n if (c < h) {\n if (e(l, l) !== 0)\n return h;\n do {\n const u = c + h >>> 1;\n t(o[u], l) < 0 ? c = u + 1 : h = u;\n } while (c < h);\n }\n return c;\n }\n function s(o, l, c = 0, h = o.length) {\n if (c < h) {\n if (e(l, l) !== 0)\n return h;\n do {\n const u = c + h >>> 1;\n t(o[u], l) <= 0 ? c = u + 1 : h = u;\n } while (c < h);\n }\n return c;\n }\n function a(o, l, c = 0, h = o.length) {\n const u = r(o, l, c, h - 1);\n return u > c && i(o[u - 1], l) > -i(o[u], l) ? u - 1 : u;\n }\n return { left: r, center: a, right: s };\n}\nfunction j3() {\n return 0;\n}\nfunction Q3(n) {\n return n === null ? NaN : +n;\n}\nconst J3 = uv(Yl), $3 = J3.right;\nuv(Q3).center;\nclass eV {\n constructor() {\n this._partials = new Float64Array(32), this._n = 0;\n }\n add(e) {\n const t = this._partials;\n let i = 0;\n for (let r = 0; r < this._n && r < 32; r++) {\n const s = t[r], a = e + s, o = Math.abs(e) < Math.abs(s) ? e - (a - s) : s - (a - e);\n o && (t[i++] = o), e = a;\n }\n return t[i] = e, this._n = i + 1, this;\n }\n valueOf() {\n const e = this._partials;\n let t = this._n, i, r, s, a = 0;\n if (t > 0) {\n for (a = e[--t]; t > 0 && (i = a, r = e[--t], a = i + r, s = r - (a - i), !s); )\n ;\n t > 0 && (s < 0 && e[t - 1] < 0 || s > 0 && e[t - 1] > 0) && (r = s * 2, i = a + r, r == i - a && (a = i));\n }\n return a;\n }\n}\nconst tV = Math.sqrt(50), iV = Math.sqrt(10), rV = Math.sqrt(2);\nfunction _c(n, e, t) {\n const i = (e - n) / Math.max(0, t), r = Math.floor(Math.log10(i)), s = i / Math.pow(10, r), a = s >= tV ? 10 : s >= iV ? 5 : s >= rV ? 2 : 1;\n let o, l, c;\n return r < 0 ? (c = Math.pow(10, -r) / a, o = Math.round(n * c), l = Math.round(e * c), o / c < n && ++o, l / c > e && --l, c = -c) : (c = Math.pow(10, r) * a, o = Math.round(n / c), l = Math.round(e / c), o * c < n && ++o, l * c > e && --l), l < o && 0.5 <= t && t < 2 ? _c(n, e, t * 2) : [o, l, c];\n}\nfunction sV(n, e, t) {\n if (e = +e, n = +n, t = +t, !(t > 0))\n return [];\n if (n === e)\n return [n];\n const i = e < n, [r, s, a] = i ? _c(e, n, t) : _c(n, e, t);\n if (!(s >= r))\n return [];\n const o = s - r + 1, l = new Array(o);\n if (i)\n if (a < 0)\n for (let c = 0; c < o; ++c)\n l[c] = (s - c) / -a;\n else\n for (let c = 0; c < o; ++c)\n l[c] = (s - c) * a;\n else if (a < 0)\n for (let c = 0; c < o; ++c)\n l[c] = (r + c) / -a;\n else\n for (let c = 0; c < o; ++c)\n l[c] = (r + c) * a;\n return l;\n}\nfunction Nu(n, e, t) {\n return e = +e, n = +n, t = +t, _c(n, e, t)[2];\n}\nfunction nV(n, e, t) {\n e = +e, n = +n, t = +t;\n const i = e < n, r = i ? Nu(e, n, t) : Nu(n, e, t);\n return (i ? -1 : 1) * (r < 0 ? 1 / -r : r);\n}\nfunction* aV(n) {\n for (const e of n)\n yield* e;\n}\nfunction fv(n) {\n return Array.from(aV(n));\n}\nfunction oV(n, e) {\n switch (arguments.length) {\n case 0:\n break;\n case 1:\n this.range(n);\n break;\n default:\n this.range(e).domain(n);\n break;\n }\n return this;\n}\nfunction dd(n, e, t) {\n n.prototype = e.prototype = t, t.constructor = n;\n}\nfunction dv(n, e) {\n var t = Object.create(n.prototype);\n for (var i in e)\n t[i] = e[i];\n return t;\n}\nfunction rl() {\n}\nvar Fo = 0.7, Ec = 1 / Fo, Ia = \"\\\\s*([+-]?\\\\d+)\\\\s*\", Lo = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", ds = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", lV = /^#([0-9a-f]{3,8})$/, cV = new RegExp(`^rgb\\\\(${Ia},${Ia},${Ia}\\\\)$`), hV = new RegExp(`^rgb\\\\(${ds},${ds},${ds}\\\\)$`), uV = new RegExp(`^rgba\\\\(${Ia},${Ia},${Ia},${Lo}\\\\)$`), fV = new RegExp(`^rgba\\\\(${ds},${ds},${ds},${Lo}\\\\)$`), dV = new RegExp(`^hsl\\\\(${Lo},${ds},${ds}\\\\)$`), pV = new RegExp(`^hsla\\\\(${Lo},${ds},${ds},${Lo}\\\\)$`), km = {\n aliceblue: 15792383,\n antiquewhite: 16444375,\n aqua: 65535,\n aquamarine: 8388564,\n azure: 15794175,\n beige: 16119260,\n bisque: 16770244,\n black: 0,\n blanchedalmond: 16772045,\n blue: 255,\n blueviolet: 9055202,\n brown: 10824234,\n burlywood: 14596231,\n cadetblue: 6266528,\n chartreuse: 8388352,\n chocolate: 13789470,\n coral: 16744272,\n cornflowerblue: 6591981,\n cornsilk: 16775388,\n crimson: 14423100,\n cyan: 65535,\n darkblue: 139,\n darkcyan: 35723,\n darkgoldenrod: 12092939,\n darkgray: 11119017,\n darkgreen: 25600,\n darkgrey: 11119017,\n darkkhaki: 12433259,\n darkmagenta: 9109643,\n darkolivegreen: 5597999,\n darkorange: 16747520,\n darkorchid: 10040012,\n darkred: 9109504,\n darksalmon: 15308410,\n darkseagreen: 9419919,\n darkslateblue: 4734347,\n darkslategray: 3100495,\n darkslategrey: 3100495,\n darkturquoise: 52945,\n darkviolet: 9699539,\n deeppink: 16716947,\n deepskyblue: 49151,\n dimgray: 6908265,\n dimgrey: 6908265,\n dodgerblue: 2003199,\n firebrick: 11674146,\n floralwhite: 16775920,\n forestgreen: 2263842,\n fuchsia: 16711935,\n gainsboro: 14474460,\n ghostwhite: 16316671,\n gold: 16766720,\n goldenrod: 14329120,\n gray: 8421504,\n green: 32768,\n greenyellow: 11403055,\n grey: 8421504,\n honeydew: 15794160,\n hotpink: 16738740,\n indianred: 13458524,\n indigo: 4915330,\n ivory: 16777200,\n khaki: 15787660,\n lavender: 15132410,\n lavenderblush: 16773365,\n lawngreen: 8190976,\n lemonchiffon: 16775885,\n lightblue: 11393254,\n lightcoral: 15761536,\n lightcyan: 14745599,\n lightgoldenrodyellow: 16448210,\n lightgray: 13882323,\n lightgreen: 9498256,\n lightgrey: 13882323,\n lightpink: 16758465,\n lightsalmon: 16752762,\n lightseagreen: 2142890,\n lightskyblue: 8900346,\n lightslategray: 7833753,\n lightslategrey: 7833753,\n lightsteelblue: 11584734,\n lightyellow: 16777184,\n lime: 65280,\n limegreen: 3329330,\n linen: 16445670,\n magenta: 16711935,\n maroon: 8388608,\n mediumaquamarine: 6737322,\n mediumblue: 205,\n mediumorchid: 12211667,\n mediumpurple: 9662683,\n mediumseagreen: 3978097,\n mediumslateblue: 8087790,\n mediumspringgreen: 64154,\n mediumturquoise: 4772300,\n mediumvioletred: 13047173,\n midnightblue: 1644912,\n mintcream: 16121850,\n mistyrose: 16770273,\n moccasin: 16770229,\n navajowhite: 16768685,\n navy: 128,\n oldlace: 16643558,\n olive: 8421376,\n olivedrab: 7048739,\n orange: 16753920,\n orangered: 16729344,\n orchid: 14315734,\n palegoldenrod: 15657130,\n palegreen: 10025880,\n paleturquoise: 11529966,\n palevioletred: 14381203,\n papayawhip: 16773077,\n peachpuff: 16767673,\n peru: 13468991,\n pink: 16761035,\n plum: 14524637,\n powderblue: 11591910,\n purple: 8388736,\n rebeccapurple: 6697881,\n red: 16711680,\n rosybrown: 12357519,\n royalblue: 4286945,\n saddlebrown: 9127187,\n salmon: 16416882,\n sandybrown: 16032864,\n seagreen: 3050327,\n seashell: 16774638,\n sienna: 10506797,\n silver: 12632256,\n skyblue: 8900331,\n slateblue: 6970061,\n slategray: 7372944,\n slategrey: 7372944,\n snow: 16775930,\n springgreen: 65407,\n steelblue: 4620980,\n tan: 13808780,\n teal: 32896,\n thistle: 14204888,\n tomato: 16737095,\n turquoise: 4251856,\n violet: 15631086,\n wheat: 16113331,\n white: 16777215,\n whitesmoke: 16119285,\n yellow: 16776960,\n yellowgreen: 10145074\n};\ndd(rl, wo, {\n copy(n) {\n return Object.assign(new this.constructor(), this, n);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: zm,\n // Deprecated! Use color.formatHex.\n formatHex: zm,\n formatHex8: gV,\n formatHsl: mV,\n formatRgb: Wm,\n toString: Wm\n});\nfunction zm() {\n return this.rgb().formatHex();\n}\nfunction gV() {\n return this.rgb().formatHex8();\n}\nfunction mV() {\n return pv(this).formatHsl();\n}\nfunction Wm() {\n return this.rgb().formatRgb();\n}\nfunction wo(n) {\n var e, t;\n return n = (n + \"\").trim().toLowerCase(), (e = lV.exec(n)) ? (t = e[1].length, e = parseInt(e[1], 16), t === 6 ? Gm(e) : t === 3 ? new dr(e >> 8 & 15 | e >> 4 & 240, e >> 4 & 15 | e & 240, (e & 15) << 4 | e & 15, 1) : t === 8 ? bl(e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, (e & 255) / 255) : t === 4 ? bl(e >> 12 & 15 | e >> 8 & 240, e >> 8 & 15 | e >> 4 & 240, e >> 4 & 15 | e & 240, ((e & 15) << 4 | e & 15) / 255) : null) : (e = cV.exec(n)) ? new dr(e[1], e[2], e[3], 1) : (e = hV.exec(n)) ? new dr(e[1] * 255 / 100, e[2] * 255 / 100, e[3] * 255 / 100, 1) : (e = uV.exec(n)) ? bl(e[1], e[2], e[3], e[4]) : (e = fV.exec(n)) ? bl(e[1] * 255 / 100, e[2] * 255 / 100, e[3] * 255 / 100, e[4]) : (e = dV.exec(n)) ? Km(e[1], e[2] / 100, e[3] / 100, 1) : (e = pV.exec(n)) ? Km(e[1], e[2] / 100, e[3] / 100, e[4]) : km.hasOwnProperty(n) ? Gm(km[n]) : n === \"transparent\" ? new dr(NaN, NaN, NaN, 0) : null;\n}\nfunction Gm(n) {\n return new dr(n >> 16 & 255, n >> 8 & 255, n & 255, 1);\n}\nfunction bl(n, e, t, i) {\n return i <= 0 && (n = e = t = NaN), new dr(n, e, t, i);\n}\nfunction _V(n) {\n return n instanceof rl || (n = wo(n)), n ? (n = n.rgb(), new dr(n.r, n.g, n.b, n.opacity)) : new dr();\n}\nfunction Fu(n, e, t, i) {\n return arguments.length === 1 ? _V(n) : new dr(n, e, t, i ?? 1);\n}\nfunction dr(n, e, t, i) {\n this.r = +n, this.g = +e, this.b = +t, this.opacity = +i;\n}\ndd(dr, Fu, dv(rl, {\n brighter(n) {\n return n = n == null ? Ec : Math.pow(Ec, n), new dr(this.r * n, this.g * n, this.b * n, this.opacity);\n },\n darker(n) {\n return n = n == null ? Fo : Math.pow(Fo, n), new dr(this.r * n, this.g * n, this.b * n, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new dr(Mn(this.r), Mn(this.g), Mn(this.b), vc(this.opacity));\n },\n displayable() {\n return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n },\n hex: Xm,\n // Deprecated! Use color.formatHex.\n formatHex: Xm,\n formatHex8: EV,\n formatRgb: Hm,\n toString: Hm\n}));\nfunction Xm() {\n return `#${bn(this.r)}${bn(this.g)}${bn(this.b)}`;\n}\nfunction EV() {\n return `#${bn(this.r)}${bn(this.g)}${bn(this.b)}${bn((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\nfunction Hm() {\n const n = vc(this.opacity);\n return `${n === 1 ? \"rgb(\" : \"rgba(\"}${Mn(this.r)}, ${Mn(this.g)}, ${Mn(this.b)}${n === 1 ? \")\" : `, ${n})`}`;\n}\nfunction vc(n) {\n return isNaN(n) ? 1 : Math.max(0, Math.min(1, n));\n}\nfunction Mn(n) {\n return Math.max(0, Math.min(255, Math.round(n) || 0));\n}\nfunction bn(n) {\n return n = Mn(n), (n < 16 ? \"0\" : \"\") + n.toString(16);\n}\nfunction Km(n, e, t, i) {\n return i <= 0 ? n = e = t = NaN : t <= 0 || t >= 1 ? n = e = NaN : e <= 0 && (n = NaN), new Qr(n, e, t, i);\n}\nfunction pv(n) {\n if (n instanceof Qr)\n return new Qr(n.h, n.s, n.l, n.opacity);\n if (n instanceof rl || (n = wo(n)), !n)\n return new Qr();\n if (n instanceof Qr)\n return n;\n n = n.rgb();\n var e = n.r / 255, t = n.g / 255, i = n.b / 255, r = Math.min(e, t, i), s = Math.max(e, t, i), a = NaN, o = s - r, l = (s + r) / 2;\n return o ? (e === s ? a = (t - i) / o + (t < i) * 6 : t === s ? a = (i - e) / o + 2 : a = (e - t) / o + 4, o /= l < 0.5 ? s + r : 2 - s - r, a *= 60) : o = l > 0 && l < 1 ? 0 : a, new Qr(a, o, l, n.opacity);\n}\nfunction vV(n, e, t, i) {\n return arguments.length === 1 ? pv(n) : new Qr(n, e, t, i ?? 1);\n}\nfunction Qr(n, e, t, i) {\n this.h = +n, this.s = +e, this.l = +t, this.opacity = +i;\n}\ndd(Qr, vV, dv(rl, {\n brighter(n) {\n return n = n == null ? Ec : Math.pow(Ec, n), new Qr(this.h, this.s, this.l * n, this.opacity);\n },\n darker(n) {\n return n = n == null ? Fo : Math.pow(Fo, n), new Qr(this.h, this.s, this.l * n, this.opacity);\n },\n rgb() {\n var n = this.h % 360 + (this.h < 0) * 360, e = isNaN(n) || isNaN(this.s) ? 0 : this.s, t = this.l, i = t + (t < 0.5 ? t : 1 - t) * e, r = 2 * t - i;\n return new dr(\n au(n >= 240 ? n - 240 : n + 120, r, i),\n au(n, r, i),\n au(n < 120 ? n + 240 : n - 120, r, i),\n this.opacity\n );\n },\n clamp() {\n return new Qr(qm(this.h), Al(this.s), Al(this.l), vc(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n },\n formatHsl() {\n const n = vc(this.opacity);\n return `${n === 1 ? \"hsl(\" : \"hsla(\"}${qm(this.h)}, ${Al(this.s) * 100}%, ${Al(this.l) * 100}%${n === 1 ? \")\" : `, ${n})`}`;\n }\n}));\nfunction qm(n) {\n return n = (n || 0) % 360, n < 0 ? n + 360 : n;\n}\nfunction Al(n) {\n return Math.max(0, Math.min(1, n || 0));\n}\nfunction au(n, e, t) {\n return (n < 60 ? e + (t - e) * n / 60 : n < 180 ? t : n < 240 ? e + (t - e) * (240 - n) / 60 : e) * 255;\n}\nconst pd = (n) => () => n;\nfunction TV(n, e) {\n return function(t) {\n return n + t * e;\n };\n}\nfunction xV(n, e, t) {\n return n = Math.pow(n, t), e = Math.pow(e, t) - n, t = 1 / t, function(i) {\n return Math.pow(n + i * e, t);\n };\n}\nfunction CV(n) {\n return (n = +n) == 1 ? gv : function(e, t) {\n return t - e ? xV(e, t, n) : pd(isNaN(e) ? t : e);\n };\n}\nfunction gv(n, e) {\n var t = e - n;\n return t ? TV(n, t) : pd(isNaN(n) ? e : n);\n}\nconst Ym = function n(e) {\n var t = CV(e);\n function i(r, s) {\n var a = t((r = Fu(r)).r, (s = Fu(s)).r), o = t(r.g, s.g), l = t(r.b, s.b), c = gv(r.opacity, s.opacity);\n return function(h) {\n return r.r = a(h), r.g = o(h), r.b = l(h), r.opacity = c(h), r + \"\";\n };\n }\n return i.gamma = n, i;\n}(1);\nfunction RV(n, e) {\n e || (e = []);\n var t = n ? Math.min(e.length, n.length) : 0, i = e.slice(), r;\n return function(s) {\n for (r = 0; r < t; ++r)\n i[r] = n[r] * (1 - s) + e[r] * s;\n return i;\n };\n}\nfunction SV(n) {\n return ArrayBuffer.isView(n) && !(n instanceof DataView);\n}\nfunction yV(n, e) {\n var t = e ? e.length : 0, i = n ? Math.min(t, n.length) : 0, r = new Array(i), s = new Array(t), a;\n for (a = 0; a < i; ++a)\n r[a] = gd(n[a], e[a]);\n for (; a < t; ++a)\n s[a] = e[a];\n return function(o) {\n for (a = 0; a < i; ++a)\n s[a] = r[a](o);\n return s;\n };\n}\nfunction IV(n, e) {\n var t = /* @__PURE__ */ new Date();\n return n = +n, e = +e, function(i) {\n return t.setTime(n * (1 - i) + e * i), t;\n };\n}\nfunction Tc(n, e) {\n return n = +n, e = +e, function(t) {\n return n * (1 - t) + e * t;\n };\n}\nfunction bV(n, e) {\n var t = {}, i = {}, r;\n (n === null || typeof n != \"object\") && (n = {}), (e === null || typeof e != \"object\") && (e = {});\n for (r in e)\n r in n ? t[r] = gd(n[r], e[r]) : i[r] = e[r];\n return function(s) {\n for (r in t)\n i[r] = t[r](s);\n return i;\n };\n}\nvar Lu = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, ou = new RegExp(Lu.source, \"g\");\nfunction AV(n) {\n return function() {\n return n;\n };\n}\nfunction MV(n) {\n return function(e) {\n return n(e) + \"\";\n };\n}\nfunction PV(n, e) {\n var t = Lu.lastIndex = ou.lastIndex = 0, i, r, s, a = -1, o = [], l = [];\n for (n = n + \"\", e = e + \"\"; (i = Lu.exec(n)) && (r = ou.exec(e)); )\n (s = r.index) > t && (s = e.slice(t, s), o[a] ? o[a] += s : o[++a] = s), (i = i[0]) === (r = r[0]) ? o[a] ? o[a] += r : o[++a] = r : (o[++a] = null, l.push({ i: a, x: Tc(i, r) })), t = ou.lastIndex;\n return t < e.length && (s = e.slice(t), o[a] ? o[a] += s : o[++a] = s), o.length < 2 ? l[0] ? MV(l[0].x) : AV(e) : (e = l.length, function(c) {\n for (var h = 0, u; h < e; ++h)\n o[(u = l[h]).i] = u.x(c);\n return o.join(\"\");\n });\n}\nfunction gd(n, e) {\n var t = typeof e, i;\n return e == null || t === \"boolean\" ? pd(e) : (t === \"number\" ? Tc : t === \"string\" ? (i = wo(e)) ? (e = i, Ym) : PV : e instanceof wo ? Ym : e instanceof Date ? IV : SV(e) ? RV : Array.isArray(e) ? yV : typeof e.valueOf != \"function\" && typeof e.toString != \"function\" || isNaN(e) ? bV : Tc)(n, e);\n}\nfunction OV(n, e) {\n return n = +n, e = +e, function(t) {\n return Math.round(n * (1 - t) + e * t);\n };\n}\nfunction DV(n) {\n return function() {\n return n;\n };\n}\nfunction NV(n) {\n return +n;\n}\nvar Zm = [0, 1];\nfunction ua(n) {\n return n;\n}\nfunction wu(n, e) {\n return (e -= n = +n) ? function(t) {\n return (t - n) / e;\n } : DV(isNaN(e) ? NaN : 0.5);\n}\nfunction FV(n, e) {\n var t;\n return n > e && (t = n, n = e, e = t), function(i) {\n return Math.max(n, Math.min(e, i));\n };\n}\nfunction LV(n, e, t) {\n var i = n[0], r = n[1], s = e[0], a = e[1];\n return r < i ? (i = wu(r, i), s = t(a, s)) : (i = wu(i, r), s = t(s, a)), function(o) {\n return s(i(o));\n };\n}\nfunction wV(n, e, t) {\n var i = Math.min(n.length, e.length) - 1, r = new Array(i), s = new Array(i), a = -1;\n for (n[i] < n[0] && (n = n.slice().reverse(), e = e.slice().reverse()); ++a < i; )\n r[a] = wu(n[a], n[a + 1]), s[a] = t(e[a], e[a + 1]);\n return function(o) {\n var l = $3(n, o, 1, i) - 1;\n return s[l](r[l](o));\n };\n}\nfunction UV(n, e) {\n return e.domain(n.domain()).range(n.range()).interpolate(n.interpolate()).clamp(n.clamp()).unknown(n.unknown());\n}\nfunction VV() {\n var n = Zm, e = Zm, t = gd, i, r, s, a = ua, o, l, c;\n function h() {\n var f = Math.min(n.length, e.length);\n return a !== ua && (a = FV(n[0], n[f - 1])), o = f > 2 ? wV : LV, l = c = null, u;\n }\n function u(f) {\n return f == null || isNaN(f = +f) ? s : (l || (l = o(n.map(i), e, t)))(i(a(f)));\n }\n return u.invert = function(f) {\n return a(r((c || (c = o(e, n.map(i), Tc)))(f)));\n }, u.domain = function(f) {\n return arguments.length ? (n = Array.from(f, NV), h()) : n.slice();\n }, u.range = function(f) {\n return arguments.length ? (e = Array.from(f), h()) : e.slice();\n }, u.rangeRound = function(f) {\n return e = Array.from(f), t = OV, h();\n }, u.clamp = function(f) {\n return arguments.length ? (a = f ? !0 : ua, h()) : a !== ua;\n }, u.interpolate = function(f) {\n return arguments.length ? (t = f, h()) : t;\n }, u.unknown = function(f) {\n return arguments.length ? (s = f, u) : s;\n }, function(f, d) {\n return i = f, r = d, h();\n };\n}\nfunction BV() {\n return VV()(ua, ua);\n}\nfunction kV(n) {\n return Math.abs(n = Math.round(n)) >= 1e21 ? n.toLocaleString(\"en\").replace(/,/g, \"\") : n.toString(10);\n}\nfunction xc(n, e) {\n if ((t = (n = e ? n.toExponential(e - 1) : n.toExponential()).indexOf(\"e\")) < 0)\n return null;\n var t, i = n.slice(0, t);\n return [\n i.length > 1 ? i[0] + i.slice(2) : i,\n +n.slice(t + 1)\n ];\n}\nfunction Fa(n) {\n return n = xc(Math.abs(n)), n ? n[1] : NaN;\n}\nfunction zV(n, e) {\n return function(t, i) {\n for (var r = t.length, s = [], a = 0, o = n[0], l = 0; r > 0 && o > 0 && (l + o + 1 > i && (o = Math.max(1, i - l)), s.push(t.substring(r -= o, r + o)), !((l += o + 1) > i)); )\n o = n[a = (a + 1) % n.length];\n return s.reverse().join(e);\n };\n}\nfunction WV(n) {\n return function(e) {\n return e.replace(/[0-9]/g, function(t) {\n return n[+t];\n });\n };\n}\nvar GV = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\nfunction Cc(n) {\n if (!(e = GV.exec(n)))\n throw new Error(\"invalid format: \" + n);\n var e;\n return new md({\n fill: e[1],\n align: e[2],\n sign: e[3],\n symbol: e[4],\n zero: e[5],\n width: e[6],\n comma: e[7],\n precision: e[8] && e[8].slice(1),\n trim: e[9],\n type: e[10]\n });\n}\nCc.prototype = md.prototype;\nfunction md(n) {\n this.fill = n.fill === void 0 ? \" \" : n.fill + \"\", this.align = n.align === void 0 ? \">\" : n.align + \"\", this.sign = n.sign === void 0 ? \"-\" : n.sign + \"\", this.symbol = n.symbol === void 0 ? \"\" : n.symbol + \"\", this.zero = !!n.zero, this.width = n.width === void 0 ? void 0 : +n.width, this.comma = !!n.comma, this.precision = n.precision === void 0 ? void 0 : +n.precision, this.trim = !!n.trim, this.type = n.type === void 0 ? \"\" : n.type + \"\";\n}\nmd.prototype.toString = function() {\n return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === void 0 ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === void 0 ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n};\nfunction XV(n) {\n e:\n for (var e = n.length, t = 1, i = -1, r; t < e; ++t)\n switch (n[t]) {\n case \".\":\n i = r = t;\n break;\n case \"0\":\n i === 0 && (i = t), r = t;\n break;\n default:\n if (!+n[t])\n break e;\n i > 0 && (i = 0);\n break;\n }\n return i > 0 ? n.slice(0, i) + n.slice(r + 1) : n;\n}\nvar mv;\nfunction HV(n, e) {\n var t = xc(n, e);\n if (!t)\n return n + \"\";\n var i = t[0], r = t[1], s = r - (mv = Math.max(-8, Math.min(8, Math.floor(r / 3))) * 3) + 1, a = i.length;\n return s === a ? i : s > a ? i + new Array(s - a + 1).join(\"0\") : s > 0 ? i.slice(0, s) + \".\" + i.slice(s) : \"0.\" + new Array(1 - s).join(\"0\") + xc(n, Math.max(0, e + s - 1))[0];\n}\nfunction jm(n, e) {\n var t = xc(n, e);\n if (!t)\n return n + \"\";\n var i = t[0], r = t[1];\n return r < 0 ? \"0.\" + new Array(-r).join(\"0\") + i : i.length > r + 1 ? i.slice(0, r + 1) + \".\" + i.slice(r + 1) : i + new Array(r - i.length + 2).join(\"0\");\n}\nconst Qm = {\n \"%\": (n, e) => (n * 100).toFixed(e),\n b: (n) => Math.round(n).toString(2),\n c: (n) => n + \"\",\n d: kV,\n e: (n, e) => n.toExponential(e),\n f: (n, e) => n.toFixed(e),\n g: (n, e) => n.toPrecision(e),\n o: (n) => Math.round(n).toString(8),\n p: (n, e) => jm(n * 100, e),\n r: jm,\n s: HV,\n X: (n) => Math.round(n).toString(16).toUpperCase(),\n x: (n) => Math.round(n).toString(16)\n};\nfunction Jm(n) {\n return n;\n}\nvar $m = Array.prototype.map, e_ = [\"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\"];\nfunction KV(n) {\n var e = n.grouping === void 0 || n.thousands === void 0 ? Jm : zV($m.call(n.grouping, Number), n.thousands + \"\"), t = n.currency === void 0 ? \"\" : n.currency[0] + \"\", i = n.currency === void 0 ? \"\" : n.currency[1] + \"\", r = n.decimal === void 0 ? \".\" : n.decimal + \"\", s = n.numerals === void 0 ? Jm : WV($m.call(n.numerals, String)), a = n.percent === void 0 ? \"%\" : n.percent + \"\", o = n.minus === void 0 ? \"−\" : n.minus + \"\", l = n.nan === void 0 ? \"NaN\" : n.nan + \"\";\n function c(u) {\n u = Cc(u);\n var f = u.fill, d = u.align, p = u.sign, g = u.symbol, m = u.zero, v = u.width, E = u.comma, C = u.precision, T = u.trim, R = u.type;\n R === \"n\" ? (E = !0, R = \"g\") : Qm[R] || (C === void 0 && (C = 12), T = !0, R = \"g\"), (m || f === \"0\" && d === \"=\") && (m = !0, f = \"0\", d = \"=\");\n var x = g === \"$\" ? t : g === \"#\" && /[boxX]/.test(R) ? \"0\" + R.toLowerCase() : \"\", S = g === \"$\" ? i : /[%p]/.test(R) ? a : \"\", M = Qm[R], N = /[defgprs%]/.test(R);\n C = C === void 0 ? 6 : /[gprs]/.test(R) ? Math.max(1, Math.min(21, C)) : Math.max(0, Math.min(20, C));\n function F(L) {\n var K = x, q = S, j, k, Q;\n if (R === \"c\")\n q = M(L) + q, L = \"\";\n else {\n L = +L;\n var ce = L < 0 || 1 / L < 0;\n if (L = isNaN(L) ? l : M(Math.abs(L), C), T && (L = XV(L)), ce && +L == 0 && p !== \"+\" && (ce = !1), K = (ce ? p === \"(\" ? p : o : p === \"-\" || p === \"(\" ? \"\" : p) + K, q = (R === \"s\" ? e_[8 + mv / 3] : \"\") + q + (ce && p === \"(\" ? \")\" : \"\"), N) {\n for (j = -1, k = L.length; ++j < k; )\n if (Q = L.charCodeAt(j), 48 > Q || Q > 57) {\n q = (Q === 46 ? r + L.slice(j + 1) : L.slice(j)) + q, L = L.slice(0, j);\n break;\n }\n }\n }\n E && !m && (L = e(L, 1 / 0));\n var de = K.length + L.length + q.length, Z = de < v ? new Array(v - de + 1).join(f) : \"\";\n switch (E && m && (L = e(Z + L, Z.length ? v - q.length : 1 / 0), Z = \"\"), d) {\n case \"<\":\n L = K + L + q + Z;\n break;\n case \"=\":\n L = K + Z + L + q;\n break;\n case \"^\":\n L = Z.slice(0, de = Z.length >> 1) + K + L + q + Z.slice(de);\n break;\n default:\n L = Z + K + L + q;\n break;\n }\n return s(L);\n }\n return F.toString = function() {\n return u + \"\";\n }, F;\n }\n function h(u, f) {\n var d = c((u = Cc(u), u.type = \"f\", u)), p = Math.max(-8, Math.min(8, Math.floor(Fa(f) / 3))) * 3, g = Math.pow(10, -p), m = e_[8 + p / 3];\n return function(v) {\n return d(g * v) + m;\n };\n }\n return {\n format: c,\n formatPrefix: h\n };\n}\nvar Ml, _v, Ev;\nqV({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\nfunction qV(n) {\n return Ml = KV(n), _v = Ml.format, Ev = Ml.formatPrefix, Ml;\n}\nfunction YV(n) {\n return Math.max(0, -Fa(Math.abs(n)));\n}\nfunction ZV(n, e) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(Fa(e) / 3))) * 3 - Fa(Math.abs(n)));\n}\nfunction jV(n, e) {\n return n = Math.abs(n), e = Math.abs(e) - n, Math.max(0, Fa(e) - Fa(n)) + 1;\n}\nfunction QV(n, e, t, i) {\n var r = nV(n, e, t), s;\n switch (i = Cc(i ?? \",f\"), i.type) {\n case \"s\": {\n var a = Math.max(Math.abs(n), Math.abs(e));\n return i.precision == null && !isNaN(s = ZV(r, a)) && (i.precision = s), Ev(i, a);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n i.precision == null && !isNaN(s = jV(r, Math.max(Math.abs(n), Math.abs(e)))) && (i.precision = s - (i.type === \"e\"));\n break;\n }\n case \"f\":\n case \"%\": {\n i.precision == null && !isNaN(s = YV(r)) && (i.precision = s - (i.type === \"%\") * 2);\n break;\n }\n }\n return _v(i);\n}\nfunction JV(n) {\n var e = n.domain;\n return n.ticks = function(t) {\n var i = e();\n return sV(i[0], i[i.length - 1], t ?? 10);\n }, n.tickFormat = function(t, i) {\n var r = e();\n return QV(r[0], r[r.length - 1], t ?? 10, i);\n }, n.nice = function(t) {\n t == null && (t = 10);\n var i = e(), r = 0, s = i.length - 1, a = i[r], o = i[s], l, c, h = 10;\n for (o < a && (c = a, a = o, o = c, c = r, r = s, s = c); h-- > 0; ) {\n if (c = Nu(a, o, t), c === l)\n return i[r] = a, i[s] = o, e(i);\n if (c > 0)\n a = Math.floor(a / c) * c, o = Math.ceil(o / c) * c;\n else if (c < 0)\n a = Math.ceil(a * c) / c, o = Math.floor(o * c) / c;\n else\n break;\n l = c;\n }\n return n;\n }, n;\n}\nfunction Uu() {\n var n = BV();\n return n.copy = function() {\n return UV(n, Uu());\n }, oV.apply(n, arguments), JV(n);\n}\nclass $V {\n constructor(e, t, i, r, s, a) {\n this.name = e, this.scene = a, this.layers = t, this.target = \"map2D\", this.view = i, this.resolution = r, this.size = s, this.container = this.createContainer(), this.map = this.createOLMap(), this.texture = this.createTexture(), this.context = this.texture.getContext(), this.mesh = this.createMesh();\n let o = this.createScales();\n this.scaleLon = (l) => o[0](this.map.getPixelFromCoordinate(l)[0]), this.scaleLat = (l) => o[1](this.map.getPixelFromCoordinate(l)[1]);\n }\n createContainer() {\n let e = document.createElement(\"div\");\n return e.style.position = \"fixed\", e.style.visibility = \"hidden\", e.style.width = this.resolution.width + \"px\", e.style.height = this.resolution.height + \"px\", e.setAttribute(\"id\", \"map2D\"), document.body.appendChild(e), e;\n }\n createOLMap() {\n return new ev({\n pixelRatio: 1,\n layers: this.layers,\n target: this.target,\n view: this.view\n });\n }\n createTexture() {\n let e = this.scene;\n this.mesh;\n let t = this.target;\n this.container;\n let i = new Ac(\n \"mapTexture\",\n { width: this.resolution.width, height: this.resolution.height },\n e\n );\n return this.map.on(\"postrender\", function() {\n var r = document.getElementById(t), s = r.getElementsByTagName(\"canvas\")[0];\n i.getContext().drawImage(s, 0, 0), i.update();\n }), i;\n }\n createMesh() {\n let e = this.resolution.width / this.resolution.height, t = kt.CreateGround(\n this.name,\n { width: this.size * e, height: this.size, subdivisions: 25 },\n this.scene\n ), i = new Vs(this.name + \"_material\", this.scene != null ? this.scene : void 0);\n return i.diffuseTexture = this.texture, i.specularColor = new pi(0, 0, 0), t.material = i, t;\n }\n createScales() {\n Vw();\n let e = this.resolution.width / this.resolution.height, t = this.size * e, i = this.size, r = Uu().domain([0, this.resolution.width]).range([-(t / 2), t / 2]), s = Uu().domain([this.resolution.height, 0]).range([-(i / 2), i / 2]);\n return [r, s];\n }\n keyboardControls(e) {\n return e.onKeyboardObservable.add((t) => {\n switch (t.type) {\n case UR.KEYDOWN:\n switch (t.event.key) {\n case \"a\":\n case \"A\":\n this.map.getView().setCenter([this.map.getView().getCenter()[0] - 1, this.map.getView().getCenter()[1]]);\n break;\n case \"d\":\n case \"D\":\n this.map.getView().setCenter([this.map.getView().getCenter()[0] + 1, this.map.getView().getCenter()[1]]);\n break;\n case \"w\":\n case \"W\":\n this.map.getView().setCenter([this.map.getView().getCenter()[0], this.map.getView().getCenter()[1] + 1]);\n break;\n case \"s\":\n case \"S\":\n this.map.getView().setCenter([this.map.getView().getCenter()[0], this.map.getView().getCenter()[1] - 1]);\n break;\n case \"=\":\n case \"+\":\n this.map.getView().animate({\n zoom: this.map.getView().getZoom() + 1,\n duration: 250\n });\n break;\n case \"-\":\n case \"_\":\n this.map.getView().animate({\n zoom: this.map.getView().getZoom() - 1,\n duration: 250\n });\n break;\n }\n break;\n }\n }), this;\n }\n}\nfunction bk(n, e = {}, t) {\n const i = e.layers || [new rv({ source: new hv() })], r = e.view || new jr({ center: [0, 0], zoom: 1 }), s = e.mapWidth || 2e3, a = e.mapHeight || 1e3, o = e.meshSize || 50;\n return new $V(n, i, r, { width: s, height: a }, o, t);\n}\nvar Qt = 1e-6, eB = 1e-12, yt = Math.PI, Nr = yt / 2, t_ = yt / 4, $r = yt * 2, br = 180 / yt, qi = yt / 180, oi = Math.abs, tB = Math.atan, La = Math.atan2, ai = Math.cos, jt = Math.sin, Zl = Math.sign || function(n) {\n return n > 0 ? 1 : n < 0 ? -1 : 0;\n}, wa = Math.sqrt;\nfunction iB(n) {\n return n > 1 ? 0 : n < -1 ? yt : Math.acos(n);\n}\nfunction Ln(n) {\n return n > 1 ? Nr : n < -1 ? -Nr : Math.asin(n);\n}\nfunction io() {\n}\nfunction Rc(n, e) {\n n && r_.hasOwnProperty(n.type) && r_[n.type](n, e);\n}\nvar i_ = {\n Feature: function(n, e) {\n Rc(n.geometry, e);\n },\n FeatureCollection: function(n, e) {\n for (var t = n.features, i = -1, r = t.length; ++i < r; )\n Rc(t[i].geometry, e);\n }\n}, r_ = {\n Sphere: function(n, e) {\n e.sphere();\n },\n Point: function(n, e) {\n n = n.coordinates, e.point(n[0], n[1], n[2]);\n },\n MultiPoint: function(n, e) {\n for (var t = n.coordinates, i = -1, r = t.length; ++i < r; )\n n = t[i], e.point(n[0], n[1], n[2]);\n },\n LineString: function(n, e) {\n Vu(n.coordinates, e, 0);\n },\n MultiLineString: function(n, e) {\n for (var t = n.coordinates, i = -1, r = t.length; ++i < r; )\n Vu(t[i], e, 0);\n },\n Polygon: function(n, e) {\n s_(n.coordinates, e);\n },\n MultiPolygon: function(n, e) {\n for (var t = n.coordinates, i = -1, r = t.length; ++i < r; )\n s_(t[i], e);\n },\n GeometryCollection: function(n, e) {\n for (var t = n.geometries, i = -1, r = t.length; ++i < r; )\n Rc(t[i], e);\n }\n};\nfunction Vu(n, e, t) {\n var i = -1, r = n.length - t, s;\n for (e.lineStart(); ++i < r; )\n s = n[i], e.point(s[0], s[1], s[2]);\n e.lineEnd();\n}\nfunction s_(n, e) {\n var t = -1, i = n.length;\n for (e.polygonStart(); ++t < i; )\n Vu(n[t], e, 1);\n e.polygonEnd();\n}\nfunction vv(n, e) {\n n && i_.hasOwnProperty(n.type) ? i_[n.type](n, e) : Rc(n, e);\n}\nfunction Bu(n) {\n return [La(n[1], n[0]), Ln(n[2])];\n}\nfunction Ua(n) {\n var e = n[0], t = n[1], i = ai(t);\n return [i * ai(e), i * jt(e), jt(t)];\n}\nfunction Pl(n, e) {\n return n[0] * e[0] + n[1] * e[1] + n[2] * e[2];\n}\nfunction Sc(n, e) {\n return [n[1] * e[2] - n[2] * e[1], n[2] * e[0] - n[0] * e[2], n[0] * e[1] - n[1] * e[0]];\n}\nfunction lu(n, e) {\n n[0] += e[0], n[1] += e[1], n[2] += e[2];\n}\nfunction Ol(n, e) {\n return [n[0] * e, n[1] * e, n[2] * e];\n}\nfunction ku(n) {\n var e = wa(n[0] * n[0] + n[1] * n[1] + n[2] * n[2]);\n n[0] /= e, n[1] /= e, n[2] /= e;\n}\nfunction zu(n, e) {\n function t(i, r) {\n return i = n(i, r), e(i[0], i[1]);\n }\n return n.invert && e.invert && (t.invert = function(i, r) {\n return i = e.invert(i, r), i && n.invert(i[0], i[1]);\n }), t;\n}\nfunction Wu(n, e) {\n return oi(n) > yt && (n -= Math.round(n / $r) * $r), [n, e];\n}\nWu.invert = Wu;\nfunction rB(n, e, t) {\n return (n %= $r) ? e || t ? zu(a_(n), o_(e, t)) : a_(n) : e || t ? o_(e, t) : Wu;\n}\nfunction n_(n) {\n return function(e, t) {\n return e += n, oi(e) > yt && (e -= Math.round(e / $r) * $r), [e, t];\n };\n}\nfunction a_(n) {\n var e = n_(n);\n return e.invert = n_(-n), e;\n}\nfunction o_(n, e) {\n var t = ai(n), i = jt(n), r = ai(e), s = jt(e);\n function a(o, l) {\n var c = ai(l), h = ai(o) * c, u = jt(o) * c, f = jt(l), d = f * t + h * i;\n return [\n La(u * r - d * s, h * t - f * i),\n Ln(d * r + u * s)\n ];\n }\n return a.invert = function(o, l) {\n var c = ai(l), h = ai(o) * c, u = jt(o) * c, f = jt(l), d = f * r - u * s;\n return [\n La(u * r + f * s, h * t + d * i),\n Ln(d * t - h * i)\n ];\n }, a;\n}\nfunction sB(n, e, t, i, r, s) {\n if (t) {\n var a = ai(e), o = jt(e), l = i * t;\n r == null ? (r = e + i * $r, s = e - l / 2) : (r = l_(a, r), s = l_(a, s), (i > 0 ? r < s : r > s) && (r += i * $r));\n for (var c, h = r; i > 0 ? h > s : h < s; h -= l)\n c = Bu([a, -o * ai(h), -o * jt(h)]), n.point(c[0], c[1]);\n }\n}\nfunction l_(n, e) {\n e = Ua(e), e[0] -= n, ku(e);\n var t = iB(-e[1]);\n return ((-e[2] < 0 ? -t : t) + $r - Qt) % $r;\n}\nfunction Tv() {\n var n = [], e;\n return {\n point: function(t, i, r) {\n e.push([t, i, r]);\n },\n lineStart: function() {\n n.push(e = []);\n },\n lineEnd: io,\n rejoin: function() {\n n.length > 1 && n.push(n.pop().concat(n.shift()));\n },\n result: function() {\n var t = n;\n return n = [], e = null, t;\n }\n };\n}\nfunction jl(n, e) {\n return oi(n[0] - e[0]) < Qt && oi(n[1] - e[1]) < Qt;\n}\nfunction Dl(n, e, t, i) {\n this.x = n, this.z = e, this.o = t, this.e = i, this.v = !1, this.n = this.p = null;\n}\nfunction xv(n, e, t, i, r) {\n var s = [], a = [], o, l;\n if (n.forEach(function(p) {\n if (!((g = p.length - 1) <= 0)) {\n var g, m = p[0], v = p[g], E;\n if (jl(m, v)) {\n if (!m[2] && !v[2]) {\n for (r.lineStart(), o = 0; o < g; ++o)\n r.point((m = p[o])[0], m[1]);\n r.lineEnd();\n return;\n }\n v[0] += 2 * Qt;\n }\n s.push(E = new Dl(m, p, null, !0)), a.push(E.o = new Dl(m, null, E, !1)), s.push(E = new Dl(v, p, null, !1)), a.push(E.o = new Dl(v, null, E, !0));\n }\n }), !!s.length) {\n for (a.sort(e), c_(s), c_(a), o = 0, l = a.length; o < l; ++o)\n a[o].e = t = !t;\n for (var c = s[0], h, u; ; ) {\n for (var f = c, d = !0; f.v; )\n if ((f = f.n) === c)\n return;\n h = f.z, r.lineStart();\n do {\n if (f.v = f.o.v = !0, f.e) {\n if (d)\n for (o = 0, l = h.length; o < l; ++o)\n r.point((u = h[o])[0], u[1]);\n else\n i(f.x, f.n.x, 1, r);\n f = f.n;\n } else {\n if (d)\n for (h = f.p.z, o = h.length - 1; o >= 0; --o)\n r.point((u = h[o])[0], u[1]);\n else\n i(f.x, f.p.x, -1, r);\n f = f.p;\n }\n f = f.o, h = f.z, d = !d;\n } while (!f.v);\n r.lineEnd();\n }\n }\n}\nfunction c_(n) {\n if (e = n.length) {\n for (var e, t = 0, i = n[0], r; ++t < e; )\n i.n = r = n[t], r.p = i, i = r;\n i.n = r = n[0], r.p = i;\n }\n}\nfunction cu(n) {\n return oi(n[0]) <= yt ? n[0] : Zl(n[0]) * ((oi(n[0]) + yt) % $r - yt);\n}\nfunction nB(n, e) {\n var t = cu(e), i = e[1], r = jt(i), s = [jt(t), -ai(t), 0], a = 0, o = 0, l = new eV();\n r === 1 ? i = Nr + Qt : r === -1 && (i = -Nr - Qt);\n for (var c = 0, h = n.length; c < h; ++c)\n if (f = (u = n[c]).length)\n for (var u, f, d = u[f - 1], p = cu(d), g = d[1] / 2 + t_, m = jt(g), v = ai(g), E = 0; E < f; ++E, p = T, m = x, v = S, d = C) {\n var C = u[E], T = cu(C), R = C[1] / 2 + t_, x = jt(R), S = ai(R), M = T - p, N = M >= 0 ? 1 : -1, F = N * M, L = F > yt, K = m * x;\n if (l.add(La(K * N * jt(F), v * S + K * ai(F))), a += L ? M + N * $r : M, L ^ p >= t ^ T >= t) {\n var q = Sc(Ua(d), Ua(C));\n ku(q);\n var j = Sc(s, q);\n ku(j);\n var k = (L ^ M >= 0 ? -1 : 1) * Ln(j[2]);\n (i > k || i === k && (q[0] || q[1])) && (o += L ^ M >= 0 ? 1 : -1);\n }\n }\n return (a < -Qt || a < Qt && l < -eB) ^ o & 1;\n}\nfunction Cv(n, e, t, i) {\n return function(r) {\n var s = e(r), a = Tv(), o = e(a), l = !1, c, h, u, f = {\n point: d,\n lineStart: g,\n lineEnd: m,\n polygonStart: function() {\n f.point = v, f.lineStart = E, f.lineEnd = C, h = [], c = [];\n },\n polygonEnd: function() {\n f.point = d, f.lineStart = g, f.lineEnd = m, h = fv(h);\n var T = nB(c, i);\n h.length ? (l || (r.polygonStart(), l = !0), xv(h, oB, T, t, r)) : T && (l || (r.polygonStart(), l = !0), r.lineStart(), t(null, null, 1, r), r.lineEnd()), l && (r.polygonEnd(), l = !1), h = c = null;\n },\n sphere: function() {\n r.polygonStart(), r.lineStart(), t(null, null, 1, r), r.lineEnd(), r.polygonEnd();\n }\n };\n function d(T, R) {\n n(T, R) && r.point(T, R);\n }\n function p(T, R) {\n s.point(T, R);\n }\n function g() {\n f.point = p, s.lineStart();\n }\n function m() {\n f.point = d, s.lineEnd();\n }\n function v(T, R) {\n u.push([T, R]), o.point(T, R);\n }\n function E() {\n o.lineStart(), u = [];\n }\n function C() {\n v(u[0][0], u[0][1]), o.lineEnd();\n var T = o.clean(), R = a.result(), x, S = R.length, M, N, F;\n if (u.pop(), c.push(u), u = null, !!S) {\n if (T & 1) {\n if (N = R[0], (M = N.length - 1) > 0) {\n for (l || (r.polygonStart(), l = !0), r.lineStart(), x = 0; x < M; ++x)\n r.point((F = N[x])[0], F[1]);\n r.lineEnd();\n }\n return;\n }\n S > 1 && T & 2 && R.push(R.pop().concat(R.shift())), h.push(R.filter(aB));\n }\n }\n return f;\n };\n}\nfunction aB(n) {\n return n.length > 1;\n}\nfunction oB(n, e) {\n return ((n = n.x)[0] < 0 ? n[1] - Nr - Qt : Nr - n[1]) - ((e = e.x)[0] < 0 ? e[1] - Nr - Qt : Nr - e[1]);\n}\nconst h_ = Cv(\n function() {\n return !0;\n },\n lB,\n hB,\n [-yt, -Nr]\n);\nfunction lB(n) {\n var e = NaN, t = NaN, i = NaN, r;\n return {\n lineStart: function() {\n n.lineStart(), r = 1;\n },\n point: function(s, a) {\n var o = s > 0 ? yt : -yt, l = oi(s - e);\n oi(l - yt) < Qt ? (n.point(e, t = (t + a) / 2 > 0 ? Nr : -Nr), n.point(i, t), n.lineEnd(), n.lineStart(), n.point(o, t), n.point(s, t), r = 0) : i !== o && l >= yt && (oi(e - i) < Qt && (e -= i * Qt), oi(s - o) < Qt && (s -= o * Qt), t = cB(e, t, s, a), n.point(i, t), n.lineEnd(), n.lineStart(), n.point(o, t), r = 0), n.point(e = s, t = a), i = o;\n },\n lineEnd: function() {\n n.lineEnd(), e = t = NaN;\n },\n clean: function() {\n return 2 - r;\n }\n };\n}\nfunction cB(n, e, t, i) {\n var r, s, a = jt(n - t);\n return oi(a) > Qt ? tB((jt(e) * (s = ai(i)) * jt(t) - jt(i) * (r = ai(e)) * jt(n)) / (r * s * a)) : (e + i) / 2;\n}\nfunction hB(n, e, t, i) {\n var r;\n if (n == null)\n r = t * Nr, i.point(-yt, r), i.point(0, r), i.point(yt, r), i.point(yt, 0), i.point(yt, -r), i.point(0, -r), i.point(-yt, -r), i.point(-yt, 0), i.point(-yt, r);\n else if (oi(n[0] - e[0]) > Qt) {\n var s = n[0] < e[0] ? yt : -yt;\n r = t * s / 2, i.point(-s, r), i.point(0, r), i.point(s, r);\n } else\n i.point(e[0], e[1]);\n}\nfunction uB(n) {\n var e = ai(n), t = 2 * qi, i = e > 0, r = oi(e) > Qt;\n function s(h, u, f, d) {\n sB(d, n, t, f, h, u);\n }\n function a(h, u) {\n return ai(h) * ai(u) > e;\n }\n function o(h) {\n var u, f, d, p, g;\n return {\n lineStart: function() {\n p = d = !1, g = 1;\n },\n point: function(m, v) {\n var E = [m, v], C, T = a(m, v), R = i ? T ? 0 : c(m, v) : T ? c(m + (m < 0 ? yt : -yt), v) : 0;\n if (!u && (p = d = T) && h.lineStart(), T !== d && (C = l(u, E), (!C || jl(u, C) || jl(E, C)) && (E[2] = 1)), T !== d)\n g = 0, T ? (h.lineStart(), C = l(E, u), h.point(C[0], C[1])) : (C = l(u, E), h.point(C[0], C[1], 2), h.lineEnd()), u = C;\n else if (r && u && i ^ T) {\n var x;\n !(R & f) && (x = l(E, u, !0)) && (g = 0, i ? (h.lineStart(), h.point(x[0][0], x[0][1]), h.point(x[1][0], x[1][1]), h.lineEnd()) : (h.point(x[1][0], x[1][1]), h.lineEnd(), h.lineStart(), h.point(x[0][0], x[0][1], 3)));\n }\n T && (!u || !jl(u, E)) && h.point(E[0], E[1]), u = E, d = T, f = R;\n },\n lineEnd: function() {\n d && h.lineEnd(), u = null;\n },\n // Rejoin first and last segments if there were intersections and the first\n // and last points were visible.\n clean: function() {\n return g | (p && d) << 1;\n }\n };\n }\n function l(h, u, f) {\n var d = Ua(h), p = Ua(u), g = [1, 0, 0], m = Sc(d, p), v = Pl(m, m), E = m[0], C = v - E * E;\n if (!C)\n return !f && h;\n var T = e * v / C, R = -e * E / C, x = Sc(g, m), S = Ol(g, T), M = Ol(m, R);\n lu(S, M);\n var N = x, F = Pl(S, N), L = Pl(N, N), K = F * F - L * (Pl(S, S) - 1);\n if (!(K < 0)) {\n var q = wa(K), j = Ol(N, (-F - q) / L);\n if (lu(j, S), j = Bu(j), !f)\n return j;\n var k = h[0], Q = u[0], ce = h[1], de = u[1], Z;\n Q < k && (Z = k, k = Q, Q = Z);\n var J = Q - k, O = oi(J - yt) < Qt, G = O || J < Qt;\n if (!O && de < ce && (Z = ce, ce = de, de = Z), G ? O ? ce + de > 0 ^ j[1] < (oi(j[0] - k) < Qt ? ce : de) : ce <= j[1] && j[1] <= de : J > yt ^ (k <= j[0] && j[0] <= Q)) {\n var ee = Ol(N, (-F + q) / L);\n return lu(ee, S), [j, Bu(ee)];\n }\n }\n }\n function c(h, u) {\n var f = i ? n : yt - n, d = 0;\n return h < -f ? d |= 1 : h > f && (d |= 2), u < -f ? d |= 4 : u > f && (d |= 8), d;\n }\n return Cv(a, o, s, i ? [0, -n] : [-yt, n - yt]);\n}\nfunction fB(n, e, t, i, r, s) {\n var a = n[0], o = n[1], l = e[0], c = e[1], h = 0, u = 1, f = l - a, d = c - o, p;\n if (p = t - a, !(!f && p > 0)) {\n if (p /= f, f < 0) {\n if (p < h)\n return;\n p < u && (u = p);\n } else if (f > 0) {\n if (p > u)\n return;\n p > h && (h = p);\n }\n if (p = r - a, !(!f && p < 0)) {\n if (p /= f, f < 0) {\n if (p > u)\n return;\n p > h && (h = p);\n } else if (f > 0) {\n if (p < h)\n return;\n p < u && (u = p);\n }\n if (p = i - o, !(!d && p > 0)) {\n if (p /= d, d < 0) {\n if (p < h)\n return;\n p < u && (u = p);\n } else if (d > 0) {\n if (p > u)\n return;\n p > h && (h = p);\n }\n if (p = s - o, !(!d && p < 0)) {\n if (p /= d, d < 0) {\n if (p > u)\n return;\n p > h && (h = p);\n } else if (d > 0) {\n if (p < h)\n return;\n p < u && (u = p);\n }\n return h > 0 && (n[0] = a + h * f, n[1] = o + h * d), u < 1 && (e[0] = a + u * f, e[1] = o + u * d), !0;\n }\n }\n }\n }\n}\nvar ro = 1e9, Nl = -ro;\nfunction Rv(n, e, t, i) {\n function r(c, h) {\n return n <= c && c <= t && e <= h && h <= i;\n }\n function s(c, h, u, f) {\n var d = 0, p = 0;\n if (c == null || (d = a(c, u)) !== (p = a(h, u)) || l(c, h) < 0 ^ u > 0)\n do\n f.point(d === 0 || d === 3 ? n : t, d > 1 ? i : e);\n while ((d = (d + u + 4) % 4) !== p);\n else\n f.point(h[0], h[1]);\n }\n function a(c, h) {\n return oi(c[0] - n) < Qt ? h > 0 ? 0 : 3 : oi(c[0] - t) < Qt ? h > 0 ? 2 : 1 : oi(c[1] - e) < Qt ? h > 0 ? 1 : 0 : h > 0 ? 3 : 2;\n }\n function o(c, h) {\n return l(c.x, h.x);\n }\n function l(c, h) {\n var u = a(c, 1), f = a(h, 1);\n return u !== f ? u - f : u === 0 ? h[1] - c[1] : u === 1 ? c[0] - h[0] : u === 2 ? c[1] - h[1] : h[0] - c[0];\n }\n return function(c) {\n var h = c, u = Tv(), f, d, p, g, m, v, E, C, T, R, x, S = {\n point: M,\n lineStart: K,\n lineEnd: q,\n polygonStart: F,\n polygonEnd: L\n };\n function M(k, Q) {\n r(k, Q) && h.point(k, Q);\n }\n function N() {\n for (var k = 0, Q = 0, ce = d.length; Q < ce; ++Q)\n for (var de = d[Q], Z = 1, J = de.length, O = de[0], G, ee, _e = O[0], Oe = O[1]; Z < J; ++Z)\n G = _e, ee = Oe, O = de[Z], _e = O[0], Oe = O[1], ee <= i ? Oe > i && (_e - G) * (i - ee) > (Oe - ee) * (n - G) && ++k : Oe <= i && (_e - G) * (i - ee) < (Oe - ee) * (n - G) && --k;\n return k;\n }\n function F() {\n h = u, f = [], d = [], x = !0;\n }\n function L() {\n var k = N(), Q = x && k, ce = (f = fv(f)).length;\n (Q || ce) && (c.polygonStart(), Q && (c.lineStart(), s(null, null, 1, c), c.lineEnd()), ce && xv(f, o, k, s, c), c.polygonEnd()), h = c, f = d = p = null;\n }\n function K() {\n S.point = j, d && d.push(p = []), R = !0, T = !1, E = C = NaN;\n }\n function q() {\n f && (j(g, m), v && T && u.rejoin(), f.push(u.result())), S.point = M, T && h.lineEnd();\n }\n function j(k, Q) {\n var ce = r(k, Q);\n if (d && p.push([k, Q]), R)\n g = k, m = Q, v = ce, R = !1, ce && (h.lineStart(), h.point(k, Q));\n else if (ce && T)\n h.point(k, Q);\n else {\n var de = [E = Math.max(Nl, Math.min(ro, E)), C = Math.max(Nl, Math.min(ro, C))], Z = [k = Math.max(Nl, Math.min(ro, k)), Q = Math.max(Nl, Math.min(ro, Q))];\n fB(de, Z, n, e, t, i) ? (T || (h.lineStart(), h.point(de[0], de[1])), h.point(Z[0], Z[1]), ce || h.lineEnd(), x = !1) : ce && (h.lineStart(), h.point(k, Q), x = !1);\n }\n E = k, C = Q, T = ce;\n }\n return S;\n };\n}\nconst yc = (n) => n;\nvar Va = 1 / 0, Ic = Va, Uo = -Va, bc = Uo, dB = {\n point: pB,\n lineStart: io,\n lineEnd: io,\n polygonStart: io,\n polygonEnd: io,\n result: function() {\n var n = [[Va, Ic], [Uo, bc]];\n return Uo = bc = -(Ic = Va = 1 / 0), n;\n }\n};\nfunction pB(n, e) {\n n < Va && (Va = n), n > Uo && (Uo = n), e < Ic && (Ic = e), e > bc && (bc = e);\n}\nconst u_ = dB;\nfunction nh(n) {\n return function(e) {\n var t = new Gu();\n for (var i in n)\n t[i] = n[i];\n return t.stream = e, t;\n };\n}\nfunction Gu() {\n}\nGu.prototype = {\n constructor: Gu,\n point: function(n, e) {\n this.stream.point(n, e);\n },\n sphere: function() {\n this.stream.sphere();\n },\n lineStart: function() {\n this.stream.lineStart();\n },\n lineEnd: function() {\n this.stream.lineEnd();\n },\n polygonStart: function() {\n this.stream.polygonStart();\n },\n polygonEnd: function() {\n this.stream.polygonEnd();\n }\n};\nfunction _d(n, e, t) {\n var i = n.clipExtent && n.clipExtent();\n return n.scale(150).translate([0, 0]), i != null && n.clipExtent(null), vv(t, n.stream(u_)), e(u_.result()), i != null && n.clipExtent(i), n;\n}\nfunction Ed(n, e, t) {\n return _d(n, function(i) {\n var r = e[1][0] - e[0][0], s = e[1][1] - e[0][1], a = Math.min(r / (i[1][0] - i[0][0]), s / (i[1][1] - i[0][1])), o = +e[0][0] + (r - a * (i[1][0] + i[0][0])) / 2, l = +e[0][1] + (s - a * (i[1][1] + i[0][1])) / 2;\n n.scale(150 * a).translate([o, l]);\n }, t);\n}\nfunction Sv(n, e, t) {\n return Ed(n, [[0, 0], e], t);\n}\nfunction yv(n, e, t) {\n return _d(n, function(i) {\n var r = +e, s = r / (i[1][0] - i[0][0]), a = (r - s * (i[1][0] + i[0][0])) / 2, o = -s * i[0][1];\n n.scale(150 * s).translate([a, o]);\n }, t);\n}\nfunction Iv(n, e, t) {\n return _d(n, function(i) {\n var r = +e, s = r / (i[1][1] - i[0][1]), a = -s * i[0][0], o = (r - s * (i[1][1] + i[0][1])) / 2;\n n.scale(150 * s).translate([a, o]);\n }, t);\n}\nvar f_ = 16, gB = ai(30 * qi);\nfunction d_(n, e) {\n return +e ? _B(n, e) : mB(n);\n}\nfunction mB(n) {\n return nh({\n point: function(e, t) {\n e = n(e, t), this.stream.point(e[0], e[1]);\n }\n });\n}\nfunction _B(n, e) {\n function t(i, r, s, a, o, l, c, h, u, f, d, p, g, m) {\n var v = c - i, E = h - r, C = v * v + E * E;\n if (C > 4 * e && g--) {\n var T = a + f, R = o + d, x = l + p, S = wa(T * T + R * R + x * x), M = Ln(x /= S), N = oi(oi(x) - 1) < Qt || oi(s - u) < Qt ? (s + u) / 2 : La(R, T), F = n(N, M), L = F[0], K = F[1], q = L - i, j = K - r, k = E * q - v * j;\n (k * k / C > e || oi((v * q + E * j) / C - 0.5) > 0.3 || a * f + o * d + l * p < gB) && (t(i, r, s, a, o, l, L, K, N, T /= S, R /= S, x, g, m), m.point(L, K), t(L, K, N, T, R, x, c, h, u, f, d, p, g, m));\n }\n }\n return function(i) {\n var r, s, a, o, l, c, h, u, f, d, p, g, m = {\n point: v,\n lineStart: E,\n lineEnd: T,\n polygonStart: function() {\n i.polygonStart(), m.lineStart = R;\n },\n polygonEnd: function() {\n i.polygonEnd(), m.lineStart = E;\n }\n };\n function v(M, N) {\n M = n(M, N), i.point(M[0], M[1]);\n }\n function E() {\n u = NaN, m.point = C, i.lineStart();\n }\n function C(M, N) {\n var F = Ua([M, N]), L = n(M, N);\n t(u, f, h, d, p, g, u = L[0], f = L[1], h = M, d = F[0], p = F[1], g = F[2], f_, i), i.point(u, f);\n }\n function T() {\n m.point = v, i.lineEnd();\n }\n function R() {\n E(), m.point = x, m.lineEnd = S;\n }\n function x(M, N) {\n C(r = M, N), s = u, a = f, o = d, l = p, c = g, m.point = C;\n }\n function S() {\n t(u, f, h, d, p, g, s, a, r, o, l, c, f_, i), m.lineEnd = T, T();\n }\n return m;\n };\n}\nvar EB = nh({\n point: function(n, e) {\n this.stream.point(n * qi, e * qi);\n }\n});\nfunction vB(n) {\n return nh({\n point: function(e, t) {\n var i = n(e, t);\n return this.stream.point(i[0], i[1]);\n }\n });\n}\nfunction TB(n, e, t, i, r) {\n function s(a, o) {\n return a *= i, o *= r, [e + n * a, t - n * o];\n }\n return s.invert = function(a, o) {\n return [(a - e) / n * i, (t - o) / n * r];\n }, s;\n}\nfunction p_(n, e, t, i, r, s) {\n if (!s)\n return TB(n, e, t, i, r);\n var a = ai(s), o = jt(s), l = a * n, c = o * n, h = a / n, u = o / n, f = (o * t - a * e) / n, d = (o * e + a * t) / n;\n function p(g, m) {\n return g *= i, m *= r, [l * g - c * m + e, t - c * g - l * m];\n }\n return p.invert = function(g, m) {\n return [i * (h * g - u * m + f), r * (d - u * g - h * m)];\n }, p;\n}\nfunction xB(n) {\n var e, t = 150, i = 480, r = 250, s = 0, a = 0, o = 0, l = 0, c = 0, h, u = 0, f = 1, d = 1, p = null, g = h_, m = null, v, E, C, T = yc, R = 0.5, x, S, M, N, F;\n function L(k) {\n return M(k[0] * qi, k[1] * qi);\n }\n function K(k) {\n return k = M.invert(k[0], k[1]), k && [k[0] * br, k[1] * br];\n }\n L.stream = function(k) {\n return N && F === k ? N : N = EB(vB(h)(g(x(T(F = k)))));\n }, L.preclip = function(k) {\n return arguments.length ? (g = k, p = void 0, j()) : g;\n }, L.postclip = function(k) {\n return arguments.length ? (T = k, m = v = E = C = null, j()) : T;\n }, L.clipAngle = function(k) {\n return arguments.length ? (g = +k ? uB(p = k * qi) : (p = null, h_), j()) : p * br;\n }, L.clipExtent = function(k) {\n return arguments.length ? (T = k == null ? (m = v = E = C = null, yc) : Rv(m = +k[0][0], v = +k[0][1], E = +k[1][0], C = +k[1][1]), j()) : m == null ? null : [[m, v], [E, C]];\n }, L.scale = function(k) {\n return arguments.length ? (t = +k, q()) : t;\n }, L.translate = function(k) {\n return arguments.length ? (i = +k[0], r = +k[1], q()) : [i, r];\n }, L.center = function(k) {\n return arguments.length ? (s = k[0] % 360 * qi, a = k[1] % 360 * qi, q()) : [s * br, a * br];\n }, L.rotate = function(k) {\n return arguments.length ? (o = k[0] % 360 * qi, l = k[1] % 360 * qi, c = k.length > 2 ? k[2] % 360 * qi : 0, q()) : [o * br, l * br, c * br];\n }, L.angle = function(k) {\n return arguments.length ? (u = k % 360 * qi, q()) : u * br;\n }, L.reflectX = function(k) {\n return arguments.length ? (f = k ? -1 : 1, q()) : f < 0;\n }, L.reflectY = function(k) {\n return arguments.length ? (d = k ? -1 : 1, q()) : d < 0;\n }, L.precision = function(k) {\n return arguments.length ? (x = d_(S, R = k * k), j()) : wa(R);\n }, L.fitExtent = function(k, Q) {\n return Ed(L, k, Q);\n }, L.fitSize = function(k, Q) {\n return Sv(L, k, Q);\n }, L.fitWidth = function(k, Q) {\n return yv(L, k, Q);\n }, L.fitHeight = function(k, Q) {\n return Iv(L, k, Q);\n };\n function q() {\n var k = p_(t, 0, 0, f, d, u).apply(null, e(s, a)), Q = p_(t, i - k[0], r - k[1], f, d, u);\n return h = rB(o, l, c), S = zu(e, Q), M = zu(h, S), x = d_(S, R), j();\n }\n function j() {\n return N = F = null, L;\n }\n return function() {\n return e = n.apply(this, arguments), L.invert = e.invert && K, q();\n };\n}\nfunction CB(n) {\n var e = 0, t = yt / 3, i = xB(n), r = i(e, t);\n return r.parallels = function(s) {\n return arguments.length ? i(e = s[0] * qi, t = s[1] * qi) : [e * br, t * br];\n }, r;\n}\nfunction RB(n) {\n var e = ai(n);\n function t(i, r) {\n return [i * e, jt(r) / e];\n }\n return t.invert = function(i, r) {\n return [i / e, Ln(r * e)];\n }, t;\n}\nfunction SB(n, e) {\n var t = jt(n), i = (t + jt(e)) / 2;\n if (oi(i) < Qt)\n return RB(n);\n var r = 1 + t * (2 * i - t), s = wa(r) / i;\n function a(o, l) {\n var c = wa(r - 2 * i * jt(l)) / i;\n return [c * jt(o *= i), s - c * ai(o)];\n }\n return a.invert = function(o, l) {\n var c = s - l, h = La(o, oi(c)) * Zl(c);\n return c * i < 0 && (h -= yt * Zl(o) * Zl(c)), [h / i, Ln((r - (o * o + c * c) * i * i) / (2 * i))];\n }, a;\n}\nfunction yB() {\n return CB(SB).scale(155.424).center([0, 33.6442]);\n}\nfunction IB() {\n return yB().parallels([29.5, 45.5]).scale(1070).translate([480, 250]).rotate([96, 0]).center([-0.6, 38.7]);\n}\nfunction bB() {\n var n = 1, e = 0, t = 0, i = 1, r = 1, s = 0, a, o, l = null, c, h, u, f = 1, d = 1, p = nh({\n point: function(T, R) {\n var x = C([T, R]);\n this.stream.point(x[0], x[1]);\n }\n }), g = yc, m, v;\n function E() {\n return f = n * i, d = n * r, m = v = null, C;\n }\n function C(T) {\n var R = T[0] * f, x = T[1] * d;\n if (s) {\n var S = x * a - R * o;\n R = R * a + x * o, x = S;\n }\n return [R + e, x + t];\n }\n return C.invert = function(T) {\n var R = T[0] - e, x = T[1] - t;\n if (s) {\n var S = x * a + R * o;\n R = R * a - x * o, x = S;\n }\n return [R / f, x / d];\n }, C.stream = function(T) {\n return m && v === T ? m : m = p(g(v = T));\n }, C.postclip = function(T) {\n return arguments.length ? (g = T, l = c = h = u = null, E()) : g;\n }, C.clipExtent = function(T) {\n return arguments.length ? (g = T == null ? (l = c = h = u = null, yc) : Rv(l = +T[0][0], c = +T[0][1], h = +T[1][0], u = +T[1][1]), E()) : l == null ? null : [[l, c], [h, u]];\n }, C.scale = function(T) {\n return arguments.length ? (n = +T, E()) : n;\n }, C.translate = function(T) {\n return arguments.length ? (e = +T[0], t = +T[1], E()) : [e, t];\n }, C.angle = function(T) {\n return arguments.length ? (s = T % 360 * qi, o = jt(s), a = ai(s), E()) : s * br;\n }, C.reflectX = function(T) {\n return arguments.length ? (i = T ? -1 : 1, E()) : i < 0;\n }, C.reflectY = function(T) {\n return arguments.length ? (r = T ? -1 : 1, E()) : r < 0;\n }, C.fitExtent = function(T, R) {\n return Ed(C, T, R);\n }, C.fitSize = function(T, R) {\n return Sv(C, T, R);\n }, C.fitWidth = function(T, R) {\n return yv(C, T, R);\n }, C.fitHeight = function(T, R) {\n return Iv(C, T, R);\n }, C;\n}\nfunction AB(n) {\n return n;\n}\nfunction bv(n) {\n if (n == null)\n return AB;\n var e, t, i = n.scale[0], r = n.scale[1], s = n.translate[0], a = n.translate[1];\n return function(o, l) {\n l || (e = t = 0);\n var c = 2, h = o.length, u = new Array(h);\n for (u[0] = (e += o[0]) * i + s, u[1] = (t += o[1]) * r + a; c < h; )\n u[c] = o[c], ++c;\n return u;\n };\n}\nfunction MB(n, e) {\n for (var t, i = n.length, r = i - e; r < --i; )\n t = n[r], n[r++] = n[i], n[i] = t;\n}\nfunction PB(n, e) {\n return typeof e == \"string\" && (e = n.objects[e]), e.type === \"GeometryCollection\" ? { type: \"FeatureCollection\", features: e.geometries.map(function(t) {\n return g_(n, t);\n }) } : g_(n, e);\n}\nfunction g_(n, e) {\n var t = e.id, i = e.bbox, r = e.properties == null ? {} : e.properties, s = OB(n, e);\n return t == null && i == null ? { type: \"Feature\", properties: r, geometry: s } : i == null ? { type: \"Feature\", id: t, properties: r, geometry: s } : { type: \"Feature\", id: t, bbox: i, properties: r, geometry: s };\n}\nfunction OB(n, e) {\n var t = bv(n.transform), i = n.arcs;\n function r(h, u) {\n u.length && u.pop();\n for (var f = i[h < 0 ? ~h : h], d = 0, p = f.length; d < p; ++d)\n u.push(t(f[d], d));\n h < 0 && MB(u, p);\n }\n function s(h) {\n return t(h);\n }\n function a(h) {\n for (var u = [], f = 0, d = h.length; f < d; ++f)\n r(h[f], u);\n return u.length < 2 && u.push(u[0]), u;\n }\n function o(h) {\n for (var u = a(h); u.length < 4; )\n u.push(u[0]);\n return u;\n }\n function l(h) {\n return h.map(o);\n }\n function c(h) {\n var u = h.type, f;\n switch (u) {\n case \"GeometryCollection\":\n return { type: u, geometries: h.geometries.map(c) };\n case \"Point\":\n f = s(h.coordinates);\n break;\n case \"MultiPoint\":\n f = h.coordinates.map(s);\n break;\n case \"LineString\":\n f = a(h.arcs);\n break;\n case \"MultiLineString\":\n f = h.arcs.map(a);\n break;\n case \"Polygon\":\n f = l(h.arcs);\n break;\n case \"MultiPolygon\":\n f = h.arcs.map(l);\n break;\n default:\n return null;\n }\n return { type: u, coordinates: f };\n }\n return c(e);\n}\nfunction DB(n) {\n var e = n[0], t = n[1], i = n[2];\n return Math.abs((e[0] - i[0]) * (t[1] - e[1]) - (e[0] - t[0]) * (i[1] - e[1])) / 2;\n}\nfunction Fl(n, e) {\n return n[1][2] - e[1][2];\n}\nfunction NB() {\n var n = {}, e = [], t = 0;\n n.push = function(s) {\n return i(e[s._ = t] = s, t++), t;\n }, n.pop = function() {\n if (!(t <= 0)) {\n var s = e[0], a;\n return --t > 0 && (a = e[t], r(e[a._ = 0] = a, 0)), s;\n }\n }, n.remove = function(s) {\n var a = s._, o;\n if (e[a] === s)\n return a !== --t && (o = e[t], (Fl(o, s) < 0 ? i : r)(e[o._ = a] = o, a)), a;\n };\n function i(s, a) {\n for (; a > 0; ) {\n var o = (a + 1 >> 1) - 1, l = e[o];\n if (Fl(s, l) >= 0)\n break;\n e[l._ = a] = l, e[s._ = a = o] = s;\n }\n }\n function r(s, a) {\n for (; ; ) {\n var o = a + 1 << 1, l = o - 1, c = a, h = e[c];\n if (l < t && Fl(e[l], h) < 0 && (h = e[c = l]), o < t && Fl(e[o], h) < 0 && (h = e[c = o]), c === a)\n break;\n e[h._ = a] = h, e[s._ = a = c] = s;\n }\n }\n return n;\n}\nfunction FB(n) {\n return [n[0], n[1], 0];\n}\nfunction LB(n, e) {\n var t = n.transform ? bv(n.transform) : FB, i = NB();\n e == null && (e = DB);\n var r = n.arcs.map(function(a) {\n var o = [], l = 0, c, h, u;\n for (a = a.map(t), h = 1, u = a.length - 1; h < u; ++h)\n c = [a[h - 1], a[h], a[h + 1]], c[1][2] = e(c), o.push(c), i.push(c);\n for (a[0][2] = a[u][2] = 1 / 0, h = 0, u = o.length; h < u; ++h)\n c = o[h], c.previous = o[h - 1], c.next = o[h + 1];\n for (; c = i.pop(); ) {\n var f = c.previous, d = c.next;\n c[1][2] < l ? c[1][2] = l : l = c[1][2], f && (f.next = d, f[2] = c[2], s(f)), d && (d.previous = f, d[0] = c[0], s(d));\n }\n return a;\n });\n function s(a) {\n i.remove(a), a[1][2] = e(a), i.push(a);\n }\n return {\n type: \"Topology\",\n bbox: n.bbox,\n objects: n.objects,\n arcs: r\n };\n}\nfunction wB(n, e) {\n e = e == null ? Number.MIN_VALUE : +e;\n var t = n.arcs.map(function(i) {\n for (var r = -1, s = 0, a = i.length, o = new Array(a), l; ++r < a; )\n (l = i[r])[2] >= e && (o[s++] = [l[0], l[1]]);\n return o.length = s, o;\n });\n return {\n type: \"Topology\",\n transform: n.transform,\n bbox: n.bbox,\n objects: n.objects,\n arcs: t\n };\n}\nvar ah = Object.prototype.hasOwnProperty;\nfunction UB(n) {\n var e = 1 / 0, t = 1 / 0, i = -1 / 0, r = -1 / 0;\n function s(u) {\n u != null && ah.call(a, u.type) && a[u.type](u);\n }\n var a = {\n GeometryCollection: function(u) {\n u.geometries.forEach(s);\n },\n Point: function(u) {\n o(u.coordinates);\n },\n MultiPoint: function(u) {\n u.coordinates.forEach(o);\n },\n LineString: function(u) {\n l(u.arcs);\n },\n MultiLineString: function(u) {\n u.arcs.forEach(l);\n },\n Polygon: function(u) {\n u.arcs.forEach(l);\n },\n MultiPolygon: function(u) {\n u.arcs.forEach(c);\n }\n };\n function o(u) {\n var f = u[0], d = u[1];\n f < e && (e = f), f > i && (i = f), d < t && (t = d), d > r && (r = d);\n }\n function l(u) {\n u.forEach(o);\n }\n function c(u) {\n u.forEach(l);\n }\n for (var h in n)\n s(n[h]);\n return i >= e && r >= t ? [e, t, i, r] : void 0;\n}\nfunction VB(n, e, t, i, r) {\n arguments.length === 3 && (i = Array, r = null);\n for (var s = new i(n = 1 << Math.max(4, Math.ceil(Math.log(n) / Math.LN2))), a = n - 1, o = 0; o < n; ++o)\n s[o] = r;\n function l(u) {\n for (var f = e(u) & a, d = s[f], p = 0; d != r; ) {\n if (t(d, u))\n return !0;\n if (++p >= n)\n throw new Error(\"full hashset\");\n d = s[f = f + 1 & a];\n }\n return s[f] = u, !0;\n }\n function c(u) {\n for (var f = e(u) & a, d = s[f], p = 0; d != r; ) {\n if (t(d, u))\n return !0;\n if (++p >= n)\n break;\n d = s[f = f + 1 & a];\n }\n return !1;\n }\n function h() {\n for (var u = [], f = 0, d = s.length; f < d; ++f) {\n var p = s[f];\n p != r && u.push(p);\n }\n return u;\n }\n return {\n add: l,\n has: c,\n values: h\n };\n}\nfunction vd(n, e, t, i, r, s) {\n arguments.length === 3 && (i = s = Array, r = null);\n for (var a = new i(n = 1 << Math.max(4, Math.ceil(Math.log(n) / Math.LN2))), o = new s(n), l = n - 1, c = 0; c < n; ++c)\n a[c] = r;\n function h(p, g) {\n for (var m = e(p) & l, v = a[m], E = 0; v != r; ) {\n if (t(v, p))\n return o[m] = g;\n if (++E >= n)\n throw new Error(\"full hashmap\");\n v = a[m = m + 1 & l];\n }\n return a[m] = p, o[m] = g, g;\n }\n function u(p, g) {\n for (var m = e(p) & l, v = a[m], E = 0; v != r; ) {\n if (t(v, p))\n return o[m];\n if (++E >= n)\n throw new Error(\"full hashmap\");\n v = a[m = m + 1 & l];\n }\n return a[m] = p, o[m] = g, g;\n }\n function f(p, g) {\n for (var m = e(p) & l, v = a[m], E = 0; v != r; ) {\n if (t(v, p))\n return o[m];\n if (++E >= n)\n break;\n v = a[m = m + 1 & l];\n }\n return g;\n }\n function d() {\n for (var p = [], g = 0, m = a.length; g < m; ++g) {\n var v = a[g];\n v != r && p.push(v);\n }\n return p;\n }\n return {\n set: h,\n maybeSet: u,\n // set if unset\n get: f,\n keys: d\n };\n}\nfunction Sn(n, e) {\n return n[0] === e[0] && n[1] === e[1];\n}\nvar Av = new ArrayBuffer(16), m_ = new Float64Array(Av), Ll = new Uint32Array(Av);\nfunction Xu(n) {\n m_[0] = n[0], m_[1] = n[1];\n var e = Ll[0] ^ Ll[1];\n return e = e << 5 ^ e >> 7 ^ Ll[2] ^ Ll[3], e & 2147483647;\n}\nfunction BB(n) {\n var e = n.coordinates, t = n.lines, i = n.rings, r = x(), s = new Int32Array(e.length), a = new Int32Array(e.length), o = new Int32Array(e.length), l = new Int8Array(e.length), c = 0, h, u, f, d, p;\n for (h = 0, u = e.length; h < u; ++h)\n s[h] = a[h] = o[h] = -1;\n for (h = 0, u = t.length; h < u; ++h) {\n var g = t[h], m = g[0], v = g[1];\n for (d = r[m], p = r[++m], ++c, l[d] = 1; ++m <= v; )\n R(h, f = d, d = p, p = r[m]);\n ++c, l[p] = 1;\n }\n for (h = 0, u = e.length; h < u; ++h)\n s[h] = -1;\n for (h = 0, u = i.length; h < u; ++h) {\n var E = i[h], C = E[0] + 1, T = E[1];\n for (f = r[T - 1], d = r[C - 1], p = r[C], R(h, f, d, p); ++C <= T; )\n R(h, f = d, d = p, p = r[C]);\n }\n function R(L, K, q, j) {\n if (s[q] !== L) {\n s[q] = L;\n var k = a[q];\n if (k >= 0) {\n var Q = o[q];\n (k !== K || Q !== j) && (k !== j || Q !== K) && (++c, l[q] = 1);\n } else\n a[q] = K, o[q] = j;\n }\n }\n function x() {\n for (var L = vd(e.length * 1.4, S, M, Int32Array, -1, Int32Array), K = new Int32Array(e.length), q = 0, j = e.length; q < j; ++q)\n K[q] = L.maybeSet(q, q);\n return K;\n }\n function S(L) {\n return Xu(e[L]);\n }\n function M(L, K) {\n return Sn(e[L], e[K]);\n }\n s = a = o = null;\n var N = VB(c * 1.4, Xu, Sn), F;\n for (h = 0, u = e.length; h < u; ++h)\n l[F = r[h]] && N.add(e[F]);\n return N;\n}\nfunction kB(n) {\n var e = BB(n), t = n.coordinates, i = n.lines, r = n.rings, s, a, o;\n for (a = 0, o = i.length; a < o; ++a)\n for (var l = i[a], c = l[0], h = l[1]; ++c < h; )\n e.has(t[c]) && (s = { 0: c, 1: l[1] }, l[1] = c, l = l.next = s);\n for (a = 0, o = r.length; a < o; ++a)\n for (var u = r[a], f = u[0], d = f, p = u[1], g = e.has(t[f]); ++d < p; )\n e.has(t[d]) && (g ? (s = { 0: d, 1: u[1] }, u[1] = d, u = u.next = s) : (zB(t, f, p, p - d), t[p] = t[f], g = !0, d = f));\n return n;\n}\nfunction zB(n, e, t, i) {\n hu(n, e, t), hu(n, e, e + i), hu(n, e + i, t);\n}\nfunction hu(n, e, t) {\n for (var i = e + (t-- - e >> 1), r; e < i; ++e, --t)\n r = n[e], n[e] = n[t], n[t] = r;\n}\nfunction WB(n) {\n var e = n.coordinates, t = n.lines, i, r = n.rings, s, a = t.length + r.length, o, l;\n for (delete n.lines, delete n.rings, o = 0, l = t.length; o < l; ++o)\n for (i = t[o]; i = i.next; )\n ++a;\n for (o = 0, l = r.length; o < l; ++o)\n for (s = r[o]; s = s.next; )\n ++a;\n var c = vd(a * 2 * 1.4, Xu, Sn), h = n.arcs = [];\n for (o = 0, l = t.length; o < l; ++o) {\n i = t[o];\n do\n u(i);\n while (i = i.next);\n }\n for (o = 0, l = r.length; o < l; ++o)\n if (s = r[o], s.next)\n do\n u(s);\n while (s = s.next);\n else\n f(s);\n function u(E) {\n var C, T, R, x, S, M, N, F;\n if (R = c.get(C = e[E[0]])) {\n for (N = 0, F = R.length; N < F; ++N)\n if (x = R[N], d(x, E)) {\n E[0] = x[0], E[1] = x[1];\n return;\n }\n }\n if (S = c.get(T = e[E[1]])) {\n for (N = 0, F = S.length; N < F; ++N)\n if (M = S[N], p(M, E)) {\n E[1] = M[0], E[0] = M[1];\n return;\n }\n }\n R ? R.push(E) : c.set(C, [E]), S ? S.push(E) : c.set(T, [E]), h.push(E);\n }\n function f(E) {\n var C, T, R, x, S;\n if (T = c.get(C = e[E[0]]))\n for (x = 0, S = T.length; x < S; ++x) {\n if (R = T[x], g(R, E)) {\n E[0] = R[0], E[1] = R[1];\n return;\n }\n if (m(R, E)) {\n E[0] = R[1], E[1] = R[0];\n return;\n }\n }\n if (T = c.get(C = e[E[0] + v(E)]))\n for (x = 0, S = T.length; x < S; ++x) {\n if (R = T[x], g(R, E)) {\n E[0] = R[0], E[1] = R[1];\n return;\n }\n if (m(R, E)) {\n E[0] = R[1], E[1] = R[0];\n return;\n }\n }\n T ? T.push(E) : c.set(C, [E]), h.push(E);\n }\n function d(E, C) {\n var T = E[0], R = C[0], x = E[1], S = C[1];\n if (T - x !== R - S)\n return !1;\n for (; T <= x; ++T, ++R)\n if (!Sn(e[T], e[R]))\n return !1;\n return !0;\n }\n function p(E, C) {\n var T = E[0], R = C[0], x = E[1], S = C[1];\n if (T - x !== R - S)\n return !1;\n for (; T <= x; ++T, --S)\n if (!Sn(e[T], e[S]))\n return !1;\n return !0;\n }\n function g(E, C) {\n var T = E[0], R = C[0], x = E[1], S = C[1], M = x - T;\n if (M !== S - R)\n return !1;\n for (var N = v(E), F = v(C), L = 0; L < M; ++L)\n if (!Sn(e[T + (L + N) % M], e[R + (L + F) % M]))\n return !1;\n return !0;\n }\n function m(E, C) {\n var T = E[0], R = C[0], x = E[1], S = C[1], M = x - T;\n if (M !== S - R)\n return !1;\n for (var N = v(E), F = M - v(C), L = 0; L < M; ++L)\n if (!Sn(e[T + (L + N) % M], e[S - (L + F) % M]))\n return !1;\n return !0;\n }\n function v(E) {\n for (var C = E[0], T = E[1], R = C, x = R, S = e[R]; ++R < T; ) {\n var M = e[R];\n (M[0] < S[0] || M[0] === S[0] && M[1] < S[1]) && (x = R, S = M);\n }\n return x - C;\n }\n return n;\n}\nfunction GB(n) {\n for (var e = -1, t = n.length; ++e < t; ) {\n for (var i = n[e], r = 0, s = 1, a = i.length, o = i[0], l = o[0], c = o[1], h, u; ++r < a; )\n o = i[r], h = o[0], u = o[1], (h !== l || u !== c) && (i[s++] = [h - l, u - c], l = h, c = u);\n s === 1 && (i[s++] = [0, 0]), i.length = s;\n }\n return n;\n}\nfunction XB(n) {\n var e = -1, t = [], i = [], r = [];\n function s(u) {\n u && ah.call(a, u.type) && a[u.type](u);\n }\n var a = {\n GeometryCollection: function(u) {\n u.geometries.forEach(s);\n },\n LineString: function(u) {\n u.arcs = o(u.arcs);\n },\n MultiLineString: function(u) {\n u.arcs = u.arcs.map(o);\n },\n Polygon: function(u) {\n u.arcs = u.arcs.map(l);\n },\n MultiPolygon: function(u) {\n u.arcs = u.arcs.map(c);\n }\n };\n function o(u) {\n for (var f = 0, d = u.length; f < d; ++f)\n r[++e] = u[f];\n var p = { 0: e - d + 1, 1: e };\n return t.push(p), p;\n }\n function l(u) {\n for (var f = 0, d = u.length; f < d; ++f)\n r[++e] = u[f];\n var p = { 0: e - d + 1, 1: e };\n return i.push(p), p;\n }\n function c(u) {\n return u.map(l);\n }\n for (var h in n)\n s(n[h]);\n return {\n type: \"Topology\",\n coordinates: r,\n lines: t,\n rings: i,\n objects: n\n };\n}\nfunction HB(n) {\n var e = {}, t;\n for (t in n)\n e[t] = KB(n[t]);\n return e;\n}\nfunction KB(n) {\n return n == null ? { type: null } : (n.type === \"FeatureCollection\" ? qB : n.type === \"Feature\" ? Mv : Td)(n);\n}\nfunction qB(n) {\n var e = { type: \"GeometryCollection\", geometries: n.features.map(Mv) };\n return n.bbox != null && (e.bbox = n.bbox), e;\n}\nfunction Mv(n) {\n var e = Td(n.geometry), t;\n n.id != null && (e.id = n.id), n.bbox != null && (e.bbox = n.bbox);\n for (t in n.properties) {\n e.properties = n.properties;\n break;\n }\n return e;\n}\nfunction Td(n) {\n if (n == null)\n return { type: null };\n var e = n.type === \"GeometryCollection\" ? { type: \"GeometryCollection\", geometries: n.geometries.map(Td) } : n.type === \"Point\" || n.type === \"MultiPoint\" ? { type: n.type, coordinates: n.coordinates } : { type: n.type, arcs: n.coordinates };\n return n.bbox != null && (e.bbox = n.bbox), e;\n}\nfunction YB(n, e, t) {\n var i = e[0], r = e[1], s = e[2], a = e[3], o = s - i ? (t - 1) / (s - i) : 1, l = a - r ? (t - 1) / (a - r) : 1;\n function c(v) {\n return [Math.round((v[0] - i) * o), Math.round((v[1] - r) * l)];\n }\n function h(v, E) {\n for (var C = -1, T = 0, R = v.length, x = new Array(R), S, M, N, F, L; ++C < R; )\n S = v[C], F = Math.round((S[0] - i) * o), L = Math.round((S[1] - r) * l), (F !== M || L !== N) && (x[T++] = [M = F, N = L]);\n for (x.length = T; T < E; )\n T = x.push([x[0][0], x[0][1]]);\n return x;\n }\n function u(v) {\n return h(v, 2);\n }\n function f(v) {\n return h(v, 4);\n }\n function d(v) {\n return v.map(f);\n }\n function p(v) {\n v != null && ah.call(g, v.type) && g[v.type](v);\n }\n var g = {\n GeometryCollection: function(v) {\n v.geometries.forEach(p);\n },\n Point: function(v) {\n v.coordinates = c(v.coordinates);\n },\n MultiPoint: function(v) {\n v.coordinates = v.coordinates.map(c);\n },\n LineString: function(v) {\n v.arcs = u(v.arcs);\n },\n MultiLineString: function(v) {\n v.arcs = v.arcs.map(u);\n },\n Polygon: function(v) {\n v.arcs = d(v.arcs);\n },\n MultiPolygon: function(v) {\n v.arcs = v.arcs.map(d);\n }\n };\n for (var m in n)\n p(n[m]);\n return {\n scale: [1 / o, 1 / l],\n translate: [i, r]\n };\n}\nfunction ZB(n, e) {\n var t = UB(n = HB(n)), i = e > 0 && t && YB(n, t, e), r = WB(kB(XB(n))), s = r.coordinates, a = vd(r.arcs.length * 1.4, jB, QB);\n n = r.objects, r.bbox = t, r.arcs = r.arcs.map(function(f, d) {\n return a.set(f, d), s.slice(f[0], f[1] + 1);\n }), delete r.coordinates, s = null;\n function o(f) {\n f && ah.call(l, f.type) && l[f.type](f);\n }\n var l = {\n GeometryCollection: function(f) {\n f.geometries.forEach(o);\n },\n LineString: function(f) {\n f.arcs = c(f.arcs);\n },\n MultiLineString: function(f) {\n f.arcs = f.arcs.map(c);\n },\n Polygon: function(f) {\n f.arcs = f.arcs.map(c);\n },\n MultiPolygon: function(f) {\n f.arcs = f.arcs.map(h);\n }\n };\n function c(f) {\n var d = [];\n do {\n var p = a.get(f);\n d.push(f[0] < f[1] ? p : ~p);\n } while (f = f.next);\n return d;\n }\n function h(f) {\n return f.map(c);\n }\n for (var u in n)\n o(n[u]);\n return i && (r.transform = i, r.arcs = GB(r.arcs)), r;\n}\nfunction jB(n) {\n var e = n[0], t = n[1], i;\n return t < e && (i = e, e = t, t = i), e + 31 * t;\n}\nfunction QB(n, e) {\n var t = n[0], i = n[1], r = e[0], s = e[1], a;\n return i < t && (a = t, t = i, i = a), s < r && (a = r, r = s, s = a), t === r && i === s;\n}\nvar xd = { exports: {} };\nxd.exports = oh;\nxd.exports.default = oh;\nfunction oh(n, e, t) {\n t = t || 2;\n var i = e && e.length, r = i ? e[0] * t : n.length, s = Pv(n, 0, r, t, !0), a = [];\n if (!s || s.next === s.prev)\n return a;\n var o, l, c, h, u, f, d;\n if (i && (s = ik(n, e, s, t)), n.length > 80 * t) {\n o = c = n[0], l = h = n[1];\n for (var p = t; p < r; p += t)\n u = n[p], f = n[p + 1], u < o && (o = u), f < l && (l = f), u > c && (c = u), f > h && (h = f);\n d = Math.max(c - o, h - l), d = d !== 0 ? 32767 / d : 0;\n }\n return Vo(s, a, t, o, l, d, 0), a;\n}\nfunction Pv(n, e, t, i, r) {\n var s, a;\n if (r === qu(n, e, t, i) > 0)\n for (s = e; s < t; s += i)\n a = __(s, n[s], n[s + 1], a);\n else\n for (s = t - i; s >= e; s -= i)\n a = __(s, n[s], n[s + 1], a);\n return a && lh(a, a.next) && (ko(a), a = a.next), a;\n}\nfunction wn(n, e) {\n if (!n)\n return n;\n e || (e = n);\n var t = n, i;\n do\n if (i = !1, !t.steiner && (lh(t, t.next) || ci(t.prev, t, t.next) === 0)) {\n if (ko(t), t = e = t.prev, t === t.next)\n break;\n i = !0;\n } else\n t = t.next;\n while (i || t !== e);\n return e;\n}\nfunction Vo(n, e, t, i, r, s, a) {\n if (n) {\n !a && s && ok(n, i, r, s);\n for (var o = n, l, c; n.prev !== n.next; ) {\n if (l = n.prev, c = n.next, s ? $B(n, i, r, s) : JB(n)) {\n e.push(l.i / t | 0), e.push(n.i / t | 0), e.push(c.i / t | 0), ko(n), n = c.next, o = c.next;\n continue;\n }\n if (n = c, n === o) {\n a ? a === 1 ? (n = ek(wn(n), e, t), Vo(n, e, t, i, r, s, 2)) : a === 2 && tk(n, e, t, i, r, s) : Vo(wn(n), e, t, i, r, s, 1);\n break;\n }\n }\n }\n}\nfunction JB(n) {\n var e = n.prev, t = n, i = n.next;\n if (ci(e, t, i) >= 0)\n return !1;\n for (var r = e.x, s = t.x, a = i.x, o = e.y, l = t.y, c = i.y, h = r < s ? r < a ? r : a : s < a ? s : a, u = o < l ? o < c ? o : c : l < c ? l : c, f = r > s ? r > a ? r : a : s > a ? s : a, d = o > l ? o > c ? o : c : l > c ? l : c, p = i.next; p !== e; ) {\n if (p.x >= h && p.x <= f && p.y >= u && p.y <= d && fa(r, o, s, l, a, c, p.x, p.y) && ci(p.prev, p, p.next) >= 0)\n return !1;\n p = p.next;\n }\n return !0;\n}\nfunction $B(n, e, t, i) {\n var r = n.prev, s = n, a = n.next;\n if (ci(r, s, a) >= 0)\n return !1;\n for (var o = r.x, l = s.x, c = a.x, h = r.y, u = s.y, f = a.y, d = o < l ? o < c ? o : c : l < c ? l : c, p = h < u ? h < f ? h : f : u < f ? u : f, g = o > l ? o > c ? o : c : l > c ? l : c, m = h > u ? h > f ? h : f : u > f ? u : f, v = Hu(d, p, e, t, i), E = Hu(g, m, e, t, i), C = n.prevZ, T = n.nextZ; C && C.z >= v && T && T.z <= E; ) {\n if (C.x >= d && C.x <= g && C.y >= p && C.y <= m && C !== r && C !== a && fa(o, h, l, u, c, f, C.x, C.y) && ci(C.prev, C, C.next) >= 0 || (C = C.prevZ, T.x >= d && T.x <= g && T.y >= p && T.y <= m && T !== r && T !== a && fa(o, h, l, u, c, f, T.x, T.y) && ci(T.prev, T, T.next) >= 0))\n return !1;\n T = T.nextZ;\n }\n for (; C && C.z >= v; ) {\n if (C.x >= d && C.x <= g && C.y >= p && C.y <= m && C !== r && C !== a && fa(o, h, l, u, c, f, C.x, C.y) && ci(C.prev, C, C.next) >= 0)\n return !1;\n C = C.prevZ;\n }\n for (; T && T.z <= E; ) {\n if (T.x >= d && T.x <= g && T.y >= p && T.y <= m && T !== r && T !== a && fa(o, h, l, u, c, f, T.x, T.y) && ci(T.prev, T, T.next) >= 0)\n return !1;\n T = T.nextZ;\n }\n return !0;\n}\nfunction ek(n, e, t) {\n var i = n;\n do {\n var r = i.prev, s = i.next.next;\n !lh(r, s) && Ov(r, i, i.next, s) && Bo(r, s) && Bo(s, r) && (e.push(r.i / t | 0), e.push(i.i / t | 0), e.push(s.i / t | 0), ko(i), ko(i.next), i = n = s), i = i.next;\n } while (i !== n);\n return wn(i);\n}\nfunction tk(n, e, t, i, r, s) {\n var a = n;\n do {\n for (var o = a.next.next; o !== a.prev; ) {\n if (a.i !== o.i && hk(a, o)) {\n var l = Dv(a, o);\n a = wn(a, a.next), l = wn(l, l.next), Vo(a, e, t, i, r, s, 0), Vo(l, e, t, i, r, s, 0);\n return;\n }\n o = o.next;\n }\n a = a.next;\n } while (a !== n);\n}\nfunction ik(n, e, t, i) {\n var r = [], s, a, o, l, c;\n for (s = 0, a = e.length; s < a; s++)\n o = e[s] * i, l = s < a - 1 ? e[s + 1] * i : n.length, c = Pv(n, o, l, i, !1), c === c.next && (c.steiner = !0), r.push(ck(c));\n for (r.sort(rk), s = 0; s < r.length; s++)\n t = sk(r[s], t);\n return t;\n}\nfunction rk(n, e) {\n return n.x - e.x;\n}\nfunction sk(n, e) {\n var t = nk(n, e);\n if (!t)\n return e;\n var i = Dv(t, n);\n return wn(i, i.next), wn(t, t.next);\n}\nfunction nk(n, e) {\n var t = e, i = n.x, r = n.y, s = -1 / 0, a;\n do {\n if (r <= t.y && r >= t.next.y && t.next.y !== t.y) {\n var o = t.x + (r - t.y) * (t.next.x - t.x) / (t.next.y - t.y);\n if (o <= i && o > s && (s = o, a = t.x < t.next.x ? t : t.next, o === i))\n return a;\n }\n t = t.next;\n } while (t !== e);\n if (!a)\n return null;\n var l = a, c = a.x, h = a.y, u = 1 / 0, f;\n t = a;\n do\n i >= t.x && t.x >= c && i !== t.x && fa(r < h ? i : s, r, c, h, r < h ? s : i, r, t.x, t.y) && (f = Math.abs(r - t.y) / (i - t.x), Bo(t, n) && (f < u || f === u && (t.x > a.x || t.x === a.x && ak(a, t))) && (a = t, u = f)), t = t.next;\n while (t !== l);\n return a;\n}\nfunction ak(n, e) {\n return ci(n.prev, n, e.prev) < 0 && ci(e.next, n, n.next) < 0;\n}\nfunction ok(n, e, t, i) {\n var r = n;\n do\n r.z === 0 && (r.z = Hu(r.x, r.y, e, t, i)), r.prevZ = r.prev, r.nextZ = r.next, r = r.next;\n while (r !== n);\n r.prevZ.nextZ = null, r.prevZ = null, lk(r);\n}\nfunction lk(n) {\n var e, t, i, r, s, a, o, l, c = 1;\n do {\n for (t = n, n = null, s = null, a = 0; t; ) {\n for (a++, i = t, o = 0, e = 0; e < c && (o++, i = i.nextZ, !!i); e++)\n ;\n for (l = c; o > 0 || l > 0 && i; )\n o !== 0 && (l === 0 || !i || t.z <= i.z) ? (r = t, t = t.nextZ, o--) : (r = i, i = i.nextZ, l--), s ? s.nextZ = r : n = r, r.prevZ = s, s = r;\n t = i;\n }\n s.nextZ = null, c *= 2;\n } while (a > 1);\n return n;\n}\nfunction Hu(n, e, t, i, r) {\n return n = (n - t) * r | 0, e = (e - i) * r | 0, n = (n | n << 8) & 16711935, n = (n | n << 4) & 252645135, n = (n | n << 2) & 858993459, n = (n | n << 1) & 1431655765, e = (e | e << 8) & 16711935, e = (e | e << 4) & 252645135, e = (e | e << 2) & 858993459, e = (e | e << 1) & 1431655765, n | e << 1;\n}\nfunction ck(n) {\n var e = n, t = n;\n do\n (e.x < t.x || e.x === t.x && e.y < t.y) && (t = e), e = e.next;\n while (e !== n);\n return t;\n}\nfunction fa(n, e, t, i, r, s, a, o) {\n return (r - a) * (e - o) >= (n - a) * (s - o) && (n - a) * (i - o) >= (t - a) * (e - o) && (t - a) * (s - o) >= (r - a) * (i - o);\n}\nfunction hk(n, e) {\n return n.next.i !== e.i && n.prev.i !== e.i && !uk(n, e) && // dones't intersect other edges\n (Bo(n, e) && Bo(e, n) && fk(n, e) && // locally visible\n (ci(n.prev, n, e.prev) || ci(n, e.prev, e)) || // does not create opposite-facing sectors\n lh(n, e) && ci(n.prev, n, n.next) > 0 && ci(e.prev, e, e.next) > 0);\n}\nfunction ci(n, e, t) {\n return (e.y - n.y) * (t.x - e.x) - (e.x - n.x) * (t.y - e.y);\n}\nfunction lh(n, e) {\n return n.x === e.x && n.y === e.y;\n}\nfunction Ov(n, e, t, i) {\n var r = Ul(ci(n, e, t)), s = Ul(ci(n, e, i)), a = Ul(ci(t, i, n)), o = Ul(ci(t, i, e));\n return !!(r !== s && a !== o || r === 0 && wl(n, t, e) || s === 0 && wl(n, i, e) || a === 0 && wl(t, n, i) || o === 0 && wl(t, e, i));\n}\nfunction wl(n, e, t) {\n return e.x <= Math.max(n.x, t.x) && e.x >= Math.min(n.x, t.x) && e.y <= Math.max(n.y, t.y) && e.y >= Math.min(n.y, t.y);\n}\nfunction Ul(n) {\n return n > 0 ? 1 : n < 0 ? -1 : 0;\n}\nfunction uk(n, e) {\n var t = n;\n do {\n if (t.i !== n.i && t.next.i !== n.i && t.i !== e.i && t.next.i !== e.i && Ov(t, t.next, n, e))\n return !0;\n t = t.next;\n } while (t !== n);\n return !1;\n}\nfunction Bo(n, e) {\n return ci(n.prev, n, n.next) < 0 ? ci(n, e, n.next) >= 0 && ci(n, n.prev, e) >= 0 : ci(n, e, n.prev) < 0 || ci(n, n.next, e) < 0;\n}\nfunction fk(n, e) {\n var t = n, i = !1, r = (n.x + e.x) / 2, s = (n.y + e.y) / 2;\n do\n t.y > s != t.next.y > s && t.next.y !== t.y && r < (t.next.x - t.x) * (s - t.y) / (t.next.y - t.y) + t.x && (i = !i), t = t.next;\n while (t !== n);\n return i;\n}\nfunction Dv(n, e) {\n var t = new Ku(n.i, n.x, n.y), i = new Ku(e.i, e.x, e.y), r = n.next, s = e.prev;\n return n.next = e, e.prev = n, t.next = r, r.prev = t, i.next = t, t.prev = i, s.next = i, i.prev = s, i;\n}\nfunction __(n, e, t, i) {\n var r = new Ku(n, e, t);\n return i ? (r.next = i.next, r.prev = i, i.next.prev = r, i.next = r) : (r.prev = r, r.next = r), r;\n}\nfunction ko(n) {\n n.next.prev = n.prev, n.prev.next = n.next, n.prevZ && (n.prevZ.nextZ = n.nextZ), n.nextZ && (n.nextZ.prevZ = n.prevZ);\n}\nfunction Ku(n, e, t) {\n this.i = n, this.x = e, this.y = t, this.prev = null, this.next = null, this.z = 0, this.prevZ = null, this.nextZ = null, this.steiner = !1;\n}\noh.deviation = function(n, e, t, i) {\n var r = e && e.length, s = r ? e[0] * t : n.length, a = Math.abs(qu(n, 0, s, t));\n if (r)\n for (var o = 0, l = e.length; o < l; o++) {\n var c = e[o] * t, h = o < l - 1 ? e[o + 1] * t : n.length;\n a -= Math.abs(qu(n, c, h, t));\n }\n var u = 0;\n for (o = 0; o < i.length; o += 3) {\n var f = i[o] * t, d = i[o + 1] * t, p = i[o + 2] * t;\n u += Math.abs(\n (n[f] - n[p]) * (n[d + 1] - n[f + 1]) - (n[f] - n[d]) * (n[p + 1] - n[f + 1])\n );\n }\n return a === 0 && u === 0 ? 0 : Math.abs((u - a) / a);\n};\nfunction qu(n, e, t, i) {\n for (var r = 0, s = e, a = t - i; s < t; s += i)\n r += (n[a] - n[s]) * (n[s + 1] + n[a + 1]), a = s;\n return r;\n}\noh.flatten = function(n) {\n for (var e = n[0][0].length, t = { vertices: [], holes: [], dimensions: e }, i = 0, r = 0; r < n.length; r++) {\n for (var s = 0; s < n[r].length; s++)\n for (var a = 0; a < e; a++)\n t.vertices.push(n[r][s][a]);\n r > 0 && (i += n[r - 1].length, t.holes.push(i));\n }\n return t;\n};\nvar dk = xd.exports;\nconst E_ = /* @__PURE__ */ cv(dk), Ql = () => {\n};\nfunction pk(n) {\n if ((t = n.length) < 4)\n return !1;\n for (var e = 0, t, i = n[t - 1][1] * n[0][0] - n[t - 1][0] * n[0][1]; ++e < t; )\n i += n[e - 1][1] * n[e][0] - n[e - 1][0] * n[e][1];\n return i <= 0;\n}\nfunction gk(n, e) {\n for (var t = e[0], i = e[1], r = !1, s = 0, a = n.length, o = a - 1; s < a; o = s++) {\n var l = n[s], c = l[0], h = l[1], u = n[o], f = u[0], d = u[1];\n h > i ^ d > i && t < (f - c) * (i - h) / (d - h) + c && (r = !r);\n }\n return r;\n}\nfunction v_(n, e) {\n var t = e.stream, i;\n if (!t)\n throw new Error(\"invalid projection\");\n switch (n && n.type) {\n case \"Feature\":\n i = Nv;\n break;\n case \"FeatureCollection\":\n i = mk;\n break;\n default:\n i = Cd;\n break;\n }\n return i(n, t);\n}\nfunction mk(n, e) {\n return {\n type: \"FeatureCollection\",\n features: n.features.map(function(t) {\n return Nv(t, e);\n })\n };\n}\nfunction Nv(n, e) {\n return {\n type: \"Feature\",\n id: n.id,\n properties: n.properties,\n geometry: Cd(n.geometry, e)\n };\n}\nfunction _k(n, e) {\n return {\n type: \"GeometryCollection\",\n geometries: n.geometries.map(function(t) {\n return Cd(t, e);\n })\n };\n}\nfunction Cd(n, e) {\n if (!n)\n return null;\n if (n.type === \"GeometryCollection\")\n return _k(n, e);\n var t;\n switch (n.type) {\n case \"Point\":\n t = T_;\n break;\n case \"MultiPoint\":\n t = T_;\n break;\n case \"LineString\":\n t = x_;\n break;\n case \"MultiLineString\":\n t = x_;\n break;\n case \"Polygon\":\n t = uu;\n break;\n case \"MultiPolygon\":\n t = uu;\n break;\n case \"Sphere\":\n t = uu;\n break;\n default:\n return null;\n }\n return vv(n, e(t)), t.result();\n}\nvar ji = [], as = [], T_ = {\n point: function(n, e) {\n ji.push([n, e]);\n },\n result: function() {\n var n = ji.length ? ji.length < 2 ? { type: \"Point\", coordinates: ji[0] } : { type: \"MultiPoint\", coordinates: ji } : null;\n return ji = [], n;\n }\n}, x_ = {\n lineStart: Ql,\n point: function(n, e) {\n ji.push([n, e]);\n },\n lineEnd: function() {\n ji.length && (as.push(ji), ji = []);\n },\n result: function() {\n var n = as.length ? as.length < 2 ? { type: \"LineString\", coordinates: as[0] } : { type: \"MultiLineString\", coordinates: as } : null;\n return as = [], n;\n }\n}, uu = {\n polygonStart: Ql,\n lineStart: Ql,\n point: function(n, e) {\n ji.push([n, e]);\n },\n lineEnd: function() {\n var n = ji.length;\n if (n) {\n do\n ji.push(ji[0].slice());\n while (++n < 4);\n as.push(ji), ji = [];\n }\n },\n polygonEnd: Ql,\n result: function() {\n if (!as.length)\n return null;\n var n = [], e = [];\n return as.forEach(function(t) {\n pk(t) ? n.push([t]) : e.push(t);\n }), e.forEach(function(t) {\n var i = t[0];\n n.some(function(r) {\n if (gk(r[0], i))\n return r.push(t), !0;\n }) || n.push([t]);\n }), as = [], n.length ? n.length > 1 ? { type: \"MultiPolygon\", coordinates: n } : { type: \"Polygon\", coordinates: n[0] } : null;\n }\n};\nclass Ek {\n constructor(e, t, i, r, s, a, o, l, c) {\n this.name = e, this.scene = c, this.geoJson = t, this.projection = i, this.size = r, this.transform = s, this.simplification = a, this.cot = l, this.depth = o, this.selection = this.createMap();\n }\n createMap() {\n let e = v_(this.geoJson, this.projection.fitSize(this.size, this.geoJson).translate(this.transform)), t = v_(e, bB()), i = ZB({ features: t }), r = LB(i), s = wB(r, this.simplification), a = PB(s, s.objects.features), o, l = [];\n return a.features.forEach((c) => {\n if (c.geometry != null) {\n if (c.geometry.type === \"Polygon\") {\n let h = [];\n c.geometry.coordinates[0].forEach((u) => h.push(new Me(u[0], 0, u[1]))), o = kt.ExtrudePolygon(\"polygon\", { shape: h, depth: this.depth, wrap: !1, sideOrientation: 2 }, this.scene, E_), o.name = \"polygon\", o.parent = this.cot, o.metadata = { ...o.metadata, data: c.properties != null ? c.properties : null }, l.push(o);\n } else if (c.geometry.type === \"MultiPolygon\") {\n let h = [];\n c.geometry.coordinates.forEach((u) => {\n u.forEach((f) => {\n let d = [];\n f.forEach((p) => d.push(new Me(p[0], 0, p[1]))), h.push(kt.ExtrudePolygon(\"polygon\", { shape: d, depth: this.depth, wrap: !1, sideOrientation: 2 }, this.scene, E_));\n });\n }), o = Ji.MergeMeshes(h, !0, !0), o.name = \"polygon\", o.parent = this.cot, o.metadata = { ...o.metadata, data: c.properties != null ? c.properties : null }, l.push(o);\n }\n }\n }), new Jt(l, this.scene);\n }\n}\nfunction Ak(n, e, t) {\n const i = e.geoJson, r = e.projection || IB(), s = e.size || [10, 10], a = e.transform || [0, 0], o = e.simplification || 0, l = e.depth || 1, c = e.cot || new On(\"meshMapCOT\", t);\n return new Ek(n, i, r, s, a, o, l, c, t);\n}\nvar Fv = { exports: {} };\n/**\n * chroma.js - JavaScript library for color conversions\n *\n * Copyright (c) 2011-2019, Gregor Aisch\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. The name Gregor Aisch may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * -------------------------------------------------------\n *\n * chroma.js includes colors from colorbrewer2.org, which are released under\n * the following license:\n *\n * Copyright (c) 2002 Cynthia Brewer, Mark Harrower,\n * and The Pennsylvania State University.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\n * either express or implied. See the License for the specific\n * language governing permissions and limitations under the License.\n *\n * ------------------------------------------------------\n *\n * Named colors are taken from X11 Color Names.\n * http://www.w3.org/TR/css3-color/#svg-color\n *\n * @preserve\n */\n(function(n, e) {\n (function(t, i) {\n n.exports = i();\n })(H3, function() {\n for (var t = function(y, A, D) {\n return A === void 0 && (A = 0), D === void 0 && (D = 1), y < A ? A : y > D ? D : y;\n }, i = t, r = function(y) {\n y._clipped = !1, y._unclipped = y.slice(0);\n for (var A = 0; A <= 3; A++)\n A < 3 ? ((y[A] < 0 || y[A] > 255) && (y._clipped = !0), y[A] = i(y[A], 0, 255)) : A === 3 && (y[A] = i(y[A], 0, 1));\n return y;\n }, s = {}, a = 0, o = [\"Boolean\", \"Number\", \"String\", \"Function\", \"Array\", \"Date\", \"RegExp\", \"Undefined\", \"Null\"]; a < o.length; a += 1) {\n var l = o[a];\n s[\"[object \" + l + \"]\"] = l.toLowerCase();\n }\n var c = function(y) {\n return s[Object.prototype.toString.call(y)] || \"object\";\n }, h = c, u = function(y, A) {\n return A === void 0 && (A = null), y.length >= 3 ? Array.prototype.slice.call(y) : h(y[0]) == \"object\" && A ? A.split(\"\").filter(function(D) {\n return y[0][D] !== void 0;\n }).map(function(D) {\n return y[0][D];\n }) : y[0];\n }, f = c, d = function(y) {\n if (y.length < 2)\n return null;\n var A = y.length - 1;\n return f(y[A]) == \"string\" ? y[A].toLowerCase() : null;\n }, p = Math.PI, g = {\n clip_rgb: r,\n limit: t,\n type: c,\n unpack: u,\n last: d,\n PI: p,\n TWOPI: p * 2,\n PITHIRD: p / 3,\n DEG2RAD: p / 180,\n RAD2DEG: 180 / p\n }, m = {\n format: {},\n autodetect: []\n }, v = g.last, E = g.clip_rgb, C = g.type, T = m, R = function() {\n for (var A = [], D = arguments.length; D--; )\n A[D] = arguments[D];\n var V = this;\n if (C(A[0]) === \"object\" && A[0].constructor && A[0].constructor === this.constructor)\n return A[0];\n var X = v(A), H = !1;\n if (!X) {\n H = !0, T.sorted || (T.autodetect = T.autodetect.sort(function(xe, Ue) {\n return Ue.p - xe.p;\n }), T.sorted = !0);\n for (var W = 0, $ = T.autodetect; W < $.length; W += 1) {\n var te = $[W];\n if (X = te.test.apply(te, A), X)\n break;\n }\n }\n if (T.format[X]) {\n var pe = T.format[X].apply(null, H ? A : A.slice(0, -1));\n V._rgb = E(pe);\n } else\n throw new Error(\"unknown format: \" + A);\n V._rgb.length === 3 && V._rgb.push(1);\n };\n R.prototype.toString = function() {\n return C(this.hex) == \"function\" ? this.hex() : \"[\" + this._rgb.join(\",\") + \"]\";\n };\n var x = R, S = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(S.Color, [null].concat(y)))();\n };\n S.Color = x, S.version = \"2.4.2\";\n var M = S, N = g.unpack, F = Math.max, L = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = N(y, \"rgb\"), V = D[0], X = D[1], H = D[2];\n V = V / 255, X = X / 255, H = H / 255;\n var W = 1 - F(V, F(X, H)), $ = W < 1 ? 1 / (1 - W) : 0, te = (1 - V - W) * $, pe = (1 - X - W) * $, xe = (1 - H - W) * $;\n return [te, pe, xe, W];\n }, K = L, q = g.unpack, j = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = q(y, \"cmyk\");\n var D = y[0], V = y[1], X = y[2], H = y[3], W = y.length > 4 ? y[4] : 1;\n return H === 1 ? [0, 0, 0, W] : [\n D >= 1 ? 0 : 255 * (1 - D) * (1 - H),\n // r\n V >= 1 ? 0 : 255 * (1 - V) * (1 - H),\n // g\n X >= 1 ? 0 : 255 * (1 - X) * (1 - H),\n // b\n W\n ];\n }, k = j, Q = M, ce = x, de = m, Z = g.unpack, J = g.type, O = K;\n ce.prototype.cmyk = function() {\n return O(this._rgb);\n }, Q.cmyk = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(ce, [null].concat(y, [\"cmyk\"])))();\n }, de.format.cmyk = k, de.autodetect.push({\n p: 2,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = Z(y, \"cmyk\"), J(y) === \"array\" && y.length === 4)\n return \"cmyk\";\n }\n });\n var G = g.unpack, ee = g.last, _e = function(y) {\n return Math.round(y * 100) / 100;\n }, Oe = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = G(y, \"hsla\"), V = ee(y) || \"lsa\";\n return D[0] = _e(D[0] || 0), D[1] = _e(D[1] * 100) + \"%\", D[2] = _e(D[2] * 100) + \"%\", V === \"hsla\" || D.length > 3 && D[3] < 1 ? (D[3] = D.length > 3 ? D[3] : 1, V = \"hsla\") : D.length = 3, V + \"(\" + D.join(\",\") + \")\";\n }, ze = Oe, fe = g.unpack, Te = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = fe(y, \"rgba\");\n var D = y[0], V = y[1], X = y[2];\n D /= 255, V /= 255, X /= 255;\n var H = Math.min(D, V, X), W = Math.max(D, V, X), $ = (W + H) / 2, te, pe;\n return W === H ? (te = 0, pe = Number.NaN) : te = $ < 0.5 ? (W - H) / (W + H) : (W - H) / (2 - W - H), D == W ? pe = (V - X) / (W - H) : V == W ? pe = 2 + (X - D) / (W - H) : X == W && (pe = 4 + (D - V) / (W - H)), pe *= 60, pe < 0 && (pe += 360), y.length > 3 && y[3] !== void 0 ? [pe, te, $, y[3]] : [pe, te, $];\n }, Fe = Te, Se = g.unpack, qe = g.last, ue = ze, Ye = Fe, lt = Math.round, Ut = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = Se(y, \"rgba\"), V = qe(y) || \"rgb\";\n return V.substr(0, 3) == \"hsl\" ? ue(Ye(D), V) : (D[0] = lt(D[0]), D[1] = lt(D[1]), D[2] = lt(D[2]), (V === \"rgba\" || D.length > 3 && D[3] < 1) && (D[3] = D.length > 3 ? D[3] : 1, V = \"rgba\"), V + \"(\" + D.slice(0, V === \"rgb\" ? 3 : 4).join(\",\") + \")\");\n }, Ct = Ut, Bi = g.unpack, hi = Math.round, Es = function() {\n for (var y, A = [], D = arguments.length; D--; )\n A[D] = arguments[D];\n A = Bi(A, \"hsl\");\n var V = A[0], X = A[1], H = A[2], W, $, te;\n if (X === 0)\n W = $ = te = H * 255;\n else {\n var pe = [0, 0, 0], xe = [0, 0, 0], Ue = H < 0.5 ? H * (1 + X) : H + X - H * X, ye = 2 * H - Ue, Xe = V / 360;\n pe[0] = Xe + 1 / 3, pe[1] = Xe, pe[2] = Xe - 1 / 3;\n for (var Ge = 0; Ge < 3; Ge++)\n pe[Ge] < 0 && (pe[Ge] += 1), pe[Ge] > 1 && (pe[Ge] -= 1), 6 * pe[Ge] < 1 ? xe[Ge] = ye + (Ue - ye) * 6 * pe[Ge] : 2 * pe[Ge] < 1 ? xe[Ge] = Ue : 3 * pe[Ge] < 2 ? xe[Ge] = ye + (Ue - ye) * (2 / 3 - pe[Ge]) * 6 : xe[Ge] = ye;\n y = [hi(xe[0] * 255), hi(xe[1] * 255), hi(xe[2] * 255)], W = y[0], $ = y[1], te = y[2];\n }\n return A.length > 3 ? [W, $, te, A[3]] : [W, $, te, 1];\n }, Ur = Es, vs = Ur, ki = m, lr = /^rgb\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*\\)$/, Rr = /^rgba\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/, Sr = /^rgb\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/, Ts = /^rgba\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/, xs = /^hsl\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/, yr = /^hsla\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/, Vr = Math.round, pn = function(y) {\n y = y.toLowerCase().trim();\n var A;\n if (ki.format.named)\n try {\n return ki.format.named(y);\n } catch {\n }\n if (A = y.match(lr)) {\n for (var D = A.slice(1, 4), V = 0; V < 3; V++)\n D[V] = +D[V];\n return D[3] = 1, D;\n }\n if (A = y.match(Rr)) {\n for (var X = A.slice(1, 5), H = 0; H < 4; H++)\n X[H] = +X[H];\n return X;\n }\n if (A = y.match(Sr)) {\n for (var W = A.slice(1, 4), $ = 0; $ < 3; $++)\n W[$] = Vr(W[$] * 2.55);\n return W[3] = 1, W;\n }\n if (A = y.match(Ts)) {\n for (var te = A.slice(1, 5), pe = 0; pe < 3; pe++)\n te[pe] = Vr(te[pe] * 2.55);\n return te[3] = +te[3], te;\n }\n if (A = y.match(xs)) {\n var xe = A.slice(1, 4);\n xe[1] *= 0.01, xe[2] *= 0.01;\n var Ue = vs(xe);\n return Ue[3] = 1, Ue;\n }\n if (A = y.match(yr)) {\n var ye = A.slice(1, 4);\n ye[1] *= 0.01, ye[2] *= 0.01;\n var Xe = vs(ye);\n return Xe[3] = +A[4], Xe;\n }\n };\n pn.test = function(y) {\n return lr.test(y) || Rr.test(y) || Sr.test(y) || Ts.test(y) || xs.test(y) || yr.test(y);\n };\n var Mi = pn, sl = M, Ya = x, ts = m, kn = g.type, _r = Ct, Gs = Mi;\n Ya.prototype.css = function(y) {\n return _r(this._rgb, y);\n }, sl.css = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(Ya, [null].concat(y, [\"css\"])))();\n }, ts.format.css = Gs, ts.autodetect.push({\n p: 5,\n test: function(y) {\n for (var A = [], D = arguments.length - 1; D-- > 0; )\n A[D] = arguments[D + 1];\n if (!A.length && kn(y) === \"string\" && Gs.test(y))\n return \"css\";\n }\n });\n var Rd = x, Uv = M, Vv = m, Bv = g.unpack;\n Vv.format.gl = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = Bv(y, \"rgba\");\n return D[0] *= 255, D[1] *= 255, D[2] *= 255, D;\n }, Uv.gl = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(Rd, [null].concat(y, [\"gl\"])))();\n }, Rd.prototype.gl = function() {\n var y = this._rgb;\n return [y[0] / 255, y[1] / 255, y[2] / 255, y[3]];\n };\n var kv = g.unpack, zv = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = kv(y, \"rgb\"), V = D[0], X = D[1], H = D[2], W = Math.min(V, X, H), $ = Math.max(V, X, H), te = $ - W, pe = te * 100 / 255, xe = W / (255 - te) * 100, Ue;\n return te === 0 ? Ue = Number.NaN : (V === $ && (Ue = (X - H) / te), X === $ && (Ue = 2 + (H - V) / te), H === $ && (Ue = 4 + (V - X) / te), Ue *= 60, Ue < 0 && (Ue += 360)), [Ue, pe, xe];\n }, Wv = zv, Gv = g.unpack, Xv = Math.floor, Hv = function() {\n for (var y, A, D, V, X, H, W = [], $ = arguments.length; $--; )\n W[$] = arguments[$];\n W = Gv(W, \"hcg\");\n var te = W[0], pe = W[1], xe = W[2], Ue, ye, Xe;\n xe = xe * 255;\n var Ge = pe * 255;\n if (pe === 0)\n Ue = ye = Xe = xe;\n else {\n te === 360 && (te = 0), te > 360 && (te -= 360), te < 0 && (te += 360), te /= 60;\n var ft = Xv(te), vt = te - ft, bt = xe * (1 - pe), Ft = bt + Ge * (1 - vt), zi = bt + Ge * vt, Oi = bt + Ge;\n switch (ft) {\n case 0:\n y = [Oi, zi, bt], Ue = y[0], ye = y[1], Xe = y[2];\n break;\n case 1:\n A = [Ft, Oi, bt], Ue = A[0], ye = A[1], Xe = A[2];\n break;\n case 2:\n D = [bt, Oi, zi], Ue = D[0], ye = D[1], Xe = D[2];\n break;\n case 3:\n V = [bt, Ft, Oi], Ue = V[0], ye = V[1], Xe = V[2];\n break;\n case 4:\n X = [zi, bt, Oi], Ue = X[0], ye = X[1], Xe = X[2];\n break;\n case 5:\n H = [Oi, bt, Ft], Ue = H[0], ye = H[1], Xe = H[2];\n break;\n }\n }\n return [Ue, ye, Xe, W.length > 3 ? W[3] : 1];\n }, Kv = Hv, qv = g.unpack, Yv = g.type, Zv = M, Sd = x, yd = m, jv = Wv;\n Sd.prototype.hcg = function() {\n return jv(this._rgb);\n }, Zv.hcg = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(Sd, [null].concat(y, [\"hcg\"])))();\n }, yd.format.hcg = Kv, yd.autodetect.push({\n p: 1,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = qv(y, \"hcg\"), Yv(y) === \"array\" && y.length === 3)\n return \"hcg\";\n }\n });\n var Qv = g.unpack, Jv = g.last, nl = Math.round, $v = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = Qv(y, \"rgba\"), V = D[0], X = D[1], H = D[2], W = D[3], $ = Jv(y) || \"auto\";\n W === void 0 && (W = 1), $ === \"auto\" && ($ = W < 1 ? \"rgba\" : \"rgb\"), V = nl(V), X = nl(X), H = nl(H);\n var te = V << 16 | X << 8 | H, pe = \"000000\" + te.toString(16);\n pe = pe.substr(pe.length - 6);\n var xe = \"0\" + nl(W * 255).toString(16);\n switch (xe = xe.substr(xe.length - 2), $.toLowerCase()) {\n case \"rgba\":\n return \"#\" + pe + xe;\n case \"argb\":\n return \"#\" + xe + pe;\n default:\n return \"#\" + pe;\n }\n }, Id = $v, eT = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/, tT = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/, iT = function(y) {\n if (y.match(eT)) {\n (y.length === 4 || y.length === 7) && (y = y.substr(1)), y.length === 3 && (y = y.split(\"\"), y = y[0] + y[0] + y[1] + y[1] + y[2] + y[2]);\n var A = parseInt(y, 16), D = A >> 16, V = A >> 8 & 255, X = A & 255;\n return [D, V, X, 1];\n }\n if (y.match(tT)) {\n (y.length === 5 || y.length === 9) && (y = y.substr(1)), y.length === 4 && (y = y.split(\"\"), y = y[0] + y[0] + y[1] + y[1] + y[2] + y[2] + y[3] + y[3]);\n var H = parseInt(y, 16), W = H >> 24 & 255, $ = H >> 16 & 255, te = H >> 8 & 255, pe = Math.round((H & 255) / 255 * 100) / 100;\n return [W, $, te, pe];\n }\n throw new Error(\"unknown hex color: \" + y);\n }, bd = iT, rT = M, Ad = x, sT = g.type, Md = m, nT = Id;\n Ad.prototype.hex = function(y) {\n return nT(this._rgb, y);\n }, rT.hex = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(Ad, [null].concat(y, [\"hex\"])))();\n }, Md.format.hex = bd, Md.autodetect.push({\n p: 4,\n test: function(y) {\n for (var A = [], D = arguments.length - 1; D-- > 0; )\n A[D] = arguments[D + 1];\n if (!A.length && sT(y) === \"string\" && [3, 4, 5, 6, 7, 8, 9].indexOf(y.length) >= 0)\n return \"hex\";\n }\n });\n var aT = g.unpack, Pd = g.TWOPI, oT = Math.min, lT = Math.sqrt, cT = Math.acos, hT = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = aT(y, \"rgb\"), V = D[0], X = D[1], H = D[2];\n V /= 255, X /= 255, H /= 255;\n var W, $ = oT(V, X, H), te = (V + X + H) / 3, pe = te > 0 ? 1 - $ / te : 0;\n return pe === 0 ? W = NaN : (W = (V - X + (V - H)) / 2, W /= lT((V - X) * (V - X) + (V - H) * (X - H)), W = cT(W), H > X && (W = Pd - W), W /= Pd), [W * 360, pe, te];\n }, uT = hT, fT = g.unpack, ch = g.limit, zn = g.TWOPI, hh = g.PITHIRD, Wn = Math.cos, dT = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = fT(y, \"hsi\");\n var D = y[0], V = y[1], X = y[2], H, W, $;\n return isNaN(D) && (D = 0), isNaN(V) && (V = 0), D > 360 && (D -= 360), D < 0 && (D += 360), D /= 360, D < 1 / 3 ? ($ = (1 - V) / 3, H = (1 + V * Wn(zn * D) / Wn(hh - zn * D)) / 3, W = 1 - ($ + H)) : D < 2 / 3 ? (D -= 1 / 3, H = (1 - V) / 3, W = (1 + V * Wn(zn * D) / Wn(hh - zn * D)) / 3, $ = 1 - (H + W)) : (D -= 2 / 3, W = (1 - V) / 3, $ = (1 + V * Wn(zn * D) / Wn(hh - zn * D)) / 3, H = 1 - (W + $)), H = ch(X * H * 3), W = ch(X * W * 3), $ = ch(X * $ * 3), [H * 255, W * 255, $ * 255, y.length > 3 ? y[3] : 1];\n }, pT = dT, gT = g.unpack, mT = g.type, _T = M, Od = x, Dd = m, ET = uT;\n Od.prototype.hsi = function() {\n return ET(this._rgb);\n }, _T.hsi = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(Od, [null].concat(y, [\"hsi\"])))();\n }, Dd.format.hsi = pT, Dd.autodetect.push({\n p: 2,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = gT(y, \"hsi\"), mT(y) === \"array\" && y.length === 3)\n return \"hsi\";\n }\n });\n var vT = g.unpack, TT = g.type, xT = M, Nd = x, Fd = m, CT = Fe;\n Nd.prototype.hsl = function() {\n return CT(this._rgb);\n }, xT.hsl = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(Nd, [null].concat(y, [\"hsl\"])))();\n }, Fd.format.hsl = Ur, Fd.autodetect.push({\n p: 2,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = vT(y, \"hsl\"), TT(y) === \"array\" && y.length === 3)\n return \"hsl\";\n }\n });\n var RT = g.unpack, ST = Math.min, yT = Math.max, IT = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = RT(y, \"rgb\");\n var D = y[0], V = y[1], X = y[2], H = ST(D, V, X), W = yT(D, V, X), $ = W - H, te, pe, xe;\n return xe = W / 255, W === 0 ? (te = Number.NaN, pe = 0) : (pe = $ / W, D === W && (te = (V - X) / $), V === W && (te = 2 + (X - D) / $), X === W && (te = 4 + (D - V) / $), te *= 60, te < 0 && (te += 360)), [te, pe, xe];\n }, bT = IT, AT = g.unpack, MT = Math.floor, PT = function() {\n for (var y, A, D, V, X, H, W = [], $ = arguments.length; $--; )\n W[$] = arguments[$];\n W = AT(W, \"hsv\");\n var te = W[0], pe = W[1], xe = W[2], Ue, ye, Xe;\n if (xe *= 255, pe === 0)\n Ue = ye = Xe = xe;\n else {\n te === 360 && (te = 0), te > 360 && (te -= 360), te < 0 && (te += 360), te /= 60;\n var Ge = MT(te), ft = te - Ge, vt = xe * (1 - pe), bt = xe * (1 - pe * ft), Ft = xe * (1 - pe * (1 - ft));\n switch (Ge) {\n case 0:\n y = [xe, Ft, vt], Ue = y[0], ye = y[1], Xe = y[2];\n break;\n case 1:\n A = [bt, xe, vt], Ue = A[0], ye = A[1], Xe = A[2];\n break;\n case 2:\n D = [vt, xe, Ft], Ue = D[0], ye = D[1], Xe = D[2];\n break;\n case 3:\n V = [vt, bt, xe], Ue = V[0], ye = V[1], Xe = V[2];\n break;\n case 4:\n X = [Ft, vt, xe], Ue = X[0], ye = X[1], Xe = X[2];\n break;\n case 5:\n H = [xe, vt, bt], Ue = H[0], ye = H[1], Xe = H[2];\n break;\n }\n }\n return [Ue, ye, Xe, W.length > 3 ? W[3] : 1];\n }, OT = PT, DT = g.unpack, NT = g.type, FT = M, Ld = x, wd = m, LT = bT;\n Ld.prototype.hsv = function() {\n return LT(this._rgb);\n }, FT.hsv = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(Ld, [null].concat(y, [\"hsv\"])))();\n }, wd.format.hsv = OT, wd.autodetect.push({\n p: 2,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = DT(y, \"hsv\"), NT(y) === \"array\" && y.length === 3)\n return \"hsv\";\n }\n });\n var al = {\n // Corresponds roughly to RGB brighter/darker\n Kn: 18,\n // D65 standard referent\n Xn: 0.95047,\n Yn: 1,\n Zn: 1.08883,\n t0: 0.137931034,\n // 4 / 29\n t1: 0.206896552,\n // 6 / 29\n t2: 0.12841855,\n // 3 * t1 * t1\n t3: 8856452e-9\n // t1 * t1 * t1\n }, Gn = al, wT = g.unpack, Ud = Math.pow, UT = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = wT(y, \"rgb\"), V = D[0], X = D[1], H = D[2], W = VT(V, X, H), $ = W[0], te = W[1], pe = W[2], xe = 116 * te - 16;\n return [xe < 0 ? 0 : xe, 500 * ($ - te), 200 * (te - pe)];\n }, uh = function(y) {\n return (y /= 255) <= 0.04045 ? y / 12.92 : Ud((y + 0.055) / 1.055, 2.4);\n }, fh = function(y) {\n return y > Gn.t3 ? Ud(y, 1 / 3) : y / Gn.t2 + Gn.t0;\n }, VT = function(y, A, D) {\n y = uh(y), A = uh(A), D = uh(D);\n var V = fh((0.4124564 * y + 0.3575761 * A + 0.1804375 * D) / Gn.Xn), X = fh((0.2126729 * y + 0.7151522 * A + 0.072175 * D) / Gn.Yn), H = fh((0.0193339 * y + 0.119192 * A + 0.9503041 * D) / Gn.Zn);\n return [V, X, H];\n }, Vd = UT, Xn = al, BT = g.unpack, kT = Math.pow, zT = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = BT(y, \"lab\");\n var D = y[0], V = y[1], X = y[2], H, W, $, te, pe, xe;\n return W = (D + 16) / 116, H = isNaN(V) ? W : W + V / 500, $ = isNaN(X) ? W : W - X / 200, W = Xn.Yn * ph(W), H = Xn.Xn * ph(H), $ = Xn.Zn * ph($), te = dh(3.2404542 * H - 1.5371385 * W - 0.4985314 * $), pe = dh(-0.969266 * H + 1.8760108 * W + 0.041556 * $), xe = dh(0.0556434 * H - 0.2040259 * W + 1.0572252 * $), [te, pe, xe, y.length > 3 ? y[3] : 1];\n }, dh = function(y) {\n return 255 * (y <= 304e-5 ? 12.92 * y : 1.055 * kT(y, 1 / 2.4) - 0.055);\n }, ph = function(y) {\n return y > Xn.t1 ? y * y * y : Xn.t2 * (y - Xn.t0);\n }, Bd = zT, WT = g.unpack, GT = g.type, XT = M, kd = x, zd = m, HT = Vd;\n kd.prototype.lab = function() {\n return HT(this._rgb);\n }, XT.lab = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(kd, [null].concat(y, [\"lab\"])))();\n }, zd.format.lab = Bd, zd.autodetect.push({\n p: 2,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = WT(y, \"lab\"), GT(y) === \"array\" && y.length === 3)\n return \"lab\";\n }\n });\n var KT = g.unpack, qT = g.RAD2DEG, YT = Math.sqrt, ZT = Math.atan2, jT = Math.round, QT = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = KT(y, \"lab\"), V = D[0], X = D[1], H = D[2], W = YT(X * X + H * H), $ = (ZT(H, X) * qT + 360) % 360;\n return jT(W * 1e4) === 0 && ($ = Number.NaN), [V, W, $];\n }, Wd = QT, JT = g.unpack, $T = Vd, ex = Wd, tx = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = JT(y, \"rgb\"), V = D[0], X = D[1], H = D[2], W = $T(V, X, H), $ = W[0], te = W[1], pe = W[2];\n return ex($, te, pe);\n }, ix = tx, rx = g.unpack, sx = g.DEG2RAD, nx = Math.sin, ax = Math.cos, ox = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = rx(y, \"lch\"), V = D[0], X = D[1], H = D[2];\n return isNaN(H) && (H = 0), H = H * sx, [V, ax(H) * X, nx(H) * X];\n }, Gd = ox, lx = g.unpack, cx = Gd, hx = Bd, ux = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = lx(y, \"lch\");\n var D = y[0], V = y[1], X = y[2], H = cx(D, V, X), W = H[0], $ = H[1], te = H[2], pe = hx(W, $, te), xe = pe[0], Ue = pe[1], ye = pe[2];\n return [xe, Ue, ye, y.length > 3 ? y[3] : 1];\n }, Xd = ux, fx = g.unpack, dx = Xd, px = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = fx(y, \"hcl\").reverse();\n return dx.apply(void 0, D);\n }, gx = px, mx = g.unpack, _x = g.type, Hd = M, ol = x, gh = m, Kd = ix;\n ol.prototype.lch = function() {\n return Kd(this._rgb);\n }, ol.prototype.hcl = function() {\n return Kd(this._rgb).reverse();\n }, Hd.lch = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(ol, [null].concat(y, [\"lch\"])))();\n }, Hd.hcl = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(ol, [null].concat(y, [\"hcl\"])))();\n }, gh.format.lch = Xd, gh.format.hcl = gx, [\"lch\", \"hcl\"].forEach(function(y) {\n return gh.autodetect.push({\n p: 2,\n test: function() {\n for (var A = [], D = arguments.length; D--; )\n A[D] = arguments[D];\n if (A = mx(A, y), _x(A) === \"array\" && A.length === 3)\n return y;\n }\n });\n });\n var Ex = {\n aliceblue: \"#f0f8ff\",\n antiquewhite: \"#faebd7\",\n aqua: \"#00ffff\",\n aquamarine: \"#7fffd4\",\n azure: \"#f0ffff\",\n beige: \"#f5f5dc\",\n bisque: \"#ffe4c4\",\n black: \"#000000\",\n blanchedalmond: \"#ffebcd\",\n blue: \"#0000ff\",\n blueviolet: \"#8a2be2\",\n brown: \"#a52a2a\",\n burlywood: \"#deb887\",\n cadetblue: \"#5f9ea0\",\n chartreuse: \"#7fff00\",\n chocolate: \"#d2691e\",\n coral: \"#ff7f50\",\n cornflower: \"#6495ed\",\n cornflowerblue: \"#6495ed\",\n cornsilk: \"#fff8dc\",\n crimson: \"#dc143c\",\n cyan: \"#00ffff\",\n darkblue: \"#00008b\",\n darkcyan: \"#008b8b\",\n darkgoldenrod: \"#b8860b\",\n darkgray: \"#a9a9a9\",\n darkgreen: \"#006400\",\n darkgrey: \"#a9a9a9\",\n darkkhaki: \"#bdb76b\",\n darkmagenta: \"#8b008b\",\n darkolivegreen: \"#556b2f\",\n darkorange: \"#ff8c00\",\n darkorchid: \"#9932cc\",\n darkred: \"#8b0000\",\n darksalmon: \"#e9967a\",\n darkseagreen: \"#8fbc8f\",\n darkslateblue: \"#483d8b\",\n darkslategray: \"#2f4f4f\",\n darkslategrey: \"#2f4f4f\",\n darkturquoise: \"#00ced1\",\n darkviolet: \"#9400d3\",\n deeppink: \"#ff1493\",\n deepskyblue: \"#00bfff\",\n dimgray: \"#696969\",\n dimgrey: \"#696969\",\n dodgerblue: \"#1e90ff\",\n firebrick: \"#b22222\",\n floralwhite: \"#fffaf0\",\n forestgreen: \"#228b22\",\n fuchsia: \"#ff00ff\",\n gainsboro: \"#dcdcdc\",\n ghostwhite: \"#f8f8ff\",\n gold: \"#ffd700\",\n goldenrod: \"#daa520\",\n gray: \"#808080\",\n green: \"#008000\",\n greenyellow: \"#adff2f\",\n grey: \"#808080\",\n honeydew: \"#f0fff0\",\n hotpink: \"#ff69b4\",\n indianred: \"#cd5c5c\",\n indigo: \"#4b0082\",\n ivory: \"#fffff0\",\n khaki: \"#f0e68c\",\n laserlemon: \"#ffff54\",\n lavender: \"#e6e6fa\",\n lavenderblush: \"#fff0f5\",\n lawngreen: \"#7cfc00\",\n lemonchiffon: \"#fffacd\",\n lightblue: \"#add8e6\",\n lightcoral: \"#f08080\",\n lightcyan: \"#e0ffff\",\n lightgoldenrod: \"#fafad2\",\n lightgoldenrodyellow: \"#fafad2\",\n lightgray: \"#d3d3d3\",\n lightgreen: \"#90ee90\",\n lightgrey: \"#d3d3d3\",\n lightpink: \"#ffb6c1\",\n lightsalmon: \"#ffa07a\",\n lightseagreen: \"#20b2aa\",\n lightskyblue: \"#87cefa\",\n lightslategray: \"#778899\",\n lightslategrey: \"#778899\",\n lightsteelblue: \"#b0c4de\",\n lightyellow: \"#ffffe0\",\n lime: \"#00ff00\",\n limegreen: \"#32cd32\",\n linen: \"#faf0e6\",\n magenta: \"#ff00ff\",\n maroon: \"#800000\",\n maroon2: \"#7f0000\",\n maroon3: \"#b03060\",\n mediumaquamarine: \"#66cdaa\",\n mediumblue: \"#0000cd\",\n mediumorchid: \"#ba55d3\",\n mediumpurple: \"#9370db\",\n mediumseagreen: \"#3cb371\",\n mediumslateblue: \"#7b68ee\",\n mediumspringgreen: \"#00fa9a\",\n mediumturquoise: \"#48d1cc\",\n mediumvioletred: \"#c71585\",\n midnightblue: \"#191970\",\n mintcream: \"#f5fffa\",\n mistyrose: \"#ffe4e1\",\n moccasin: \"#ffe4b5\",\n navajowhite: \"#ffdead\",\n navy: \"#000080\",\n oldlace: \"#fdf5e6\",\n olive: \"#808000\",\n olivedrab: \"#6b8e23\",\n orange: \"#ffa500\",\n orangered: \"#ff4500\",\n orchid: \"#da70d6\",\n palegoldenrod: \"#eee8aa\",\n palegreen: \"#98fb98\",\n paleturquoise: \"#afeeee\",\n palevioletred: \"#db7093\",\n papayawhip: \"#ffefd5\",\n peachpuff: \"#ffdab9\",\n peru: \"#cd853f\",\n pink: \"#ffc0cb\",\n plum: \"#dda0dd\",\n powderblue: \"#b0e0e6\",\n purple: \"#800080\",\n purple2: \"#7f007f\",\n purple3: \"#a020f0\",\n rebeccapurple: \"#663399\",\n red: \"#ff0000\",\n rosybrown: \"#bc8f8f\",\n royalblue: \"#4169e1\",\n saddlebrown: \"#8b4513\",\n salmon: \"#fa8072\",\n sandybrown: \"#f4a460\",\n seagreen: \"#2e8b57\",\n seashell: \"#fff5ee\",\n sienna: \"#a0522d\",\n silver: \"#c0c0c0\",\n skyblue: \"#87ceeb\",\n slateblue: \"#6a5acd\",\n slategray: \"#708090\",\n slategrey: \"#708090\",\n snow: \"#fffafa\",\n springgreen: \"#00ff7f\",\n steelblue: \"#4682b4\",\n tan: \"#d2b48c\",\n teal: \"#008080\",\n thistle: \"#d8bfd8\",\n tomato: \"#ff6347\",\n turquoise: \"#40e0d0\",\n violet: \"#ee82ee\",\n wheat: \"#f5deb3\",\n white: \"#ffffff\",\n whitesmoke: \"#f5f5f5\",\n yellow: \"#ffff00\",\n yellowgreen: \"#9acd32\"\n }, qd = Ex, vx = x, Yd = m, Tx = g.type, Za = qd, xx = bd, Cx = Id;\n vx.prototype.name = function() {\n for (var y = Cx(this._rgb, \"rgb\"), A = 0, D = Object.keys(Za); A < D.length; A += 1) {\n var V = D[A];\n if (Za[V] === y)\n return V.toLowerCase();\n }\n return y;\n }, Yd.format.named = function(y) {\n if (y = y.toLowerCase(), Za[y])\n return xx(Za[y]);\n throw new Error(\"unknown color name: \" + y);\n }, Yd.autodetect.push({\n p: 5,\n test: function(y) {\n for (var A = [], D = arguments.length - 1; D-- > 0; )\n A[D] = arguments[D + 1];\n if (!A.length && Tx(y) === \"string\" && Za[y.toLowerCase()])\n return \"named\";\n }\n });\n var Rx = g.unpack, Sx = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = Rx(y, \"rgb\"), V = D[0], X = D[1], H = D[2];\n return (V << 16) + (X << 8) + H;\n }, yx = Sx, Ix = g.type, bx = function(y) {\n if (Ix(y) == \"number\" && y >= 0 && y <= 16777215) {\n var A = y >> 16, D = y >> 8 & 255, V = y & 255;\n return [A, D, V, 1];\n }\n throw new Error(\"unknown num color: \" + y);\n }, Ax = bx, Mx = M, Zd = x, jd = m, Px = g.type, Ox = yx;\n Zd.prototype.num = function() {\n return Ox(this._rgb);\n }, Mx.num = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(Zd, [null].concat(y, [\"num\"])))();\n }, jd.format.num = Ax, jd.autodetect.push({\n p: 5,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y.length === 1 && Px(y[0]) === \"number\" && y[0] >= 0 && y[0] <= 16777215)\n return \"num\";\n }\n });\n var Dx = M, mh = x, Qd = m, Jd = g.unpack, $d = g.type, ep = Math.round;\n mh.prototype.rgb = function(y) {\n return y === void 0 && (y = !0), y === !1 ? this._rgb.slice(0, 3) : this._rgb.slice(0, 3).map(ep);\n }, mh.prototype.rgba = function(y) {\n return y === void 0 && (y = !0), this._rgb.slice(0, 4).map(function(A, D) {\n return D < 3 ? y === !1 ? A : ep(A) : A;\n });\n }, Dx.rgb = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(mh, [null].concat(y, [\"rgb\"])))();\n }, Qd.format.rgb = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = Jd(y, \"rgba\");\n return D[3] === void 0 && (D[3] = 1), D;\n }, Qd.autodetect.push({\n p: 3,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = Jd(y, \"rgba\"), $d(y) === \"array\" && (y.length === 3 || y.length === 4 && $d(y[3]) == \"number\" && y[3] >= 0 && y[3] <= 1))\n return \"rgb\";\n }\n });\n var ll = Math.log, Nx = function(y) {\n var A = y / 100, D, V, X;\n return A < 66 ? (D = 255, V = A < 6 ? 0 : -155.25485562709179 - 0.44596950469579133 * (V = A - 2) + 104.49216199393888 * ll(V), X = A < 20 ? 0 : -254.76935184120902 + 0.8274096064007395 * (X = A - 10) + 115.67994401066147 * ll(X)) : (D = 351.97690566805693 + 0.114206453784165 * (D = A - 55) - 40.25366309332127 * ll(D), V = 325.4494125711974 + 0.07943456536662342 * (V = A - 50) - 28.0852963507957 * ll(V), X = 255), [D, V, X, 1];\n }, tp = Nx, Fx = tp, Lx = g.unpack, wx = Math.round, Ux = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n for (var D = Lx(y, \"rgb\"), V = D[0], X = D[2], H = 1e3, W = 4e4, $ = 0.4, te; W - H > $; ) {\n te = (W + H) * 0.5;\n var pe = Fx(te);\n pe[2] / pe[0] >= X / V ? W = te : H = te;\n }\n return wx(te);\n }, Vx = Ux, _h = M, cl = x, Eh = m, Bx = Vx;\n cl.prototype.temp = cl.prototype.kelvin = cl.prototype.temperature = function() {\n return Bx(this._rgb);\n }, _h.temp = _h.kelvin = _h.temperature = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(cl, [null].concat(y, [\"temp\"])))();\n }, Eh.format.temp = Eh.format.kelvin = Eh.format.temperature = tp;\n var kx = g.unpack, vh = Math.cbrt, zx = Math.pow, Wx = Math.sign, Gx = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = kx(y, \"rgb\"), V = D[0], X = D[1], H = D[2], W = [Th(V / 255), Th(X / 255), Th(H / 255)], $ = W[0], te = W[1], pe = W[2], xe = vh(0.4122214708 * $ + 0.5363325363 * te + 0.0514459929 * pe), Ue = vh(0.2119034982 * $ + 0.6806995451 * te + 0.1073969566 * pe), ye = vh(0.0883024619 * $ + 0.2817188376 * te + 0.6299787005 * pe);\n return [\n 0.2104542553 * xe + 0.793617785 * Ue - 0.0040720468 * ye,\n 1.9779984951 * xe - 2.428592205 * Ue + 0.4505937099 * ye,\n 0.0259040371 * xe + 0.7827717662 * Ue - 0.808675766 * ye\n ];\n }, ip = Gx;\n function Th(y) {\n var A = Math.abs(y);\n return A < 0.04045 ? y / 12.92 : (Wx(y) || 1) * zx((A + 0.055) / 1.055, 2.4);\n }\n var Xx = g.unpack, hl = Math.pow, Hx = Math.sign, Kx = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = Xx(y, \"lab\");\n var D = y[0], V = y[1], X = y[2], H = hl(D + 0.3963377774 * V + 0.2158037573 * X, 3), W = hl(D - 0.1055613458 * V - 0.0638541728 * X, 3), $ = hl(D - 0.0894841775 * V - 1.291485548 * X, 3);\n return [\n 255 * xh(4.0767416621 * H - 3.3077115913 * W + 0.2309699292 * $),\n 255 * xh(-1.2684380046 * H + 2.6097574011 * W - 0.3413193965 * $),\n 255 * xh(-0.0041960863 * H - 0.7034186147 * W + 1.707614701 * $),\n y.length > 3 ? y[3] : 1\n ];\n }, rp = Kx;\n function xh(y) {\n var A = Math.abs(y);\n return A > 31308e-7 ? (Hx(y) || 1) * (1.055 * hl(A, 1 / 2.4) - 0.055) : y * 12.92;\n }\n var qx = g.unpack, Yx = g.type, Zx = M, sp = x, np = m, jx = ip;\n sp.prototype.oklab = function() {\n return jx(this._rgb);\n }, Zx.oklab = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(sp, [null].concat(y, [\"oklab\"])))();\n }, np.format.oklab = rp, np.autodetect.push({\n p: 3,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = qx(y, \"oklab\"), Yx(y) === \"array\" && y.length === 3)\n return \"oklab\";\n }\n });\n var Qx = g.unpack, Jx = ip, $x = Wd, eC = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = Qx(y, \"rgb\"), V = D[0], X = D[1], H = D[2], W = Jx(V, X, H), $ = W[0], te = W[1], pe = W[2];\n return $x($, te, pe);\n }, tC = eC, iC = g.unpack, rC = Gd, sC = rp, nC = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = iC(y, \"lch\");\n var D = y[0], V = y[1], X = y[2], H = rC(D, V, X), W = H[0], $ = H[1], te = H[2], pe = sC(W, $, te), xe = pe[0], Ue = pe[1], ye = pe[2];\n return [xe, Ue, ye, y.length > 3 ? y[3] : 1];\n }, aC = nC, oC = g.unpack, lC = g.type, cC = M, ap = x, op = m, hC = tC;\n ap.prototype.oklch = function() {\n return hC(this._rgb);\n }, cC.oklch = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(ap, [null].concat(y, [\"oklch\"])))();\n }, op.format.oklch = aC, op.autodetect.push({\n p: 3,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = oC(y, \"oklch\"), lC(y) === \"array\" && y.length === 3)\n return \"oklch\";\n }\n });\n var lp = x, uC = g.type;\n lp.prototype.alpha = function(y, A) {\n return A === void 0 && (A = !1), y !== void 0 && uC(y) === \"number\" ? A ? (this._rgb[3] = y, this) : new lp([this._rgb[0], this._rgb[1], this._rgb[2], y], \"rgb\") : this._rgb[3];\n };\n var fC = x;\n fC.prototype.clipped = function() {\n return this._rgb._clipped || !1;\n };\n var gn = x, dC = al;\n gn.prototype.darken = function(y) {\n y === void 0 && (y = 1);\n var A = this, D = A.lab();\n return D[0] -= dC.Kn * y, new gn(D, \"lab\").alpha(A.alpha(), !0);\n }, gn.prototype.brighten = function(y) {\n return y === void 0 && (y = 1), this.darken(-y);\n }, gn.prototype.darker = gn.prototype.darken, gn.prototype.brighter = gn.prototype.brighten;\n var pC = x;\n pC.prototype.get = function(y) {\n var A = y.split(\".\"), D = A[0], V = A[1], X = this[D]();\n if (V) {\n var H = D.indexOf(V) - (D.substr(0, 2) === \"ok\" ? 2 : 0);\n if (H > -1)\n return X[H];\n throw new Error(\"unknown channel \" + V + \" in mode \" + D);\n } else\n return X;\n };\n var Hn = x, gC = g.type, mC = Math.pow, _C = 1e-7, EC = 20;\n Hn.prototype.luminance = function(y) {\n if (y !== void 0 && gC(y) === \"number\") {\n if (y === 0)\n return new Hn([0, 0, 0, this._rgb[3]], \"rgb\");\n if (y === 1)\n return new Hn([255, 255, 255, this._rgb[3]], \"rgb\");\n var A = this.luminance(), D = \"rgb\", V = EC, X = function(W, $) {\n var te = W.interpolate($, 0.5, D), pe = te.luminance();\n return Math.abs(y - pe) < _C || !V-- ? te : pe > y ? X(W, te) : X(te, $);\n }, H = (A > y ? X(new Hn([0, 0, 0]), this) : X(this, new Hn([255, 255, 255]))).rgb();\n return new Hn(H.concat([this._rgb[3]]));\n }\n return vC.apply(void 0, this._rgb.slice(0, 3));\n };\n var vC = function(y, A, D) {\n return y = Ch(y), A = Ch(A), D = Ch(D), 0.2126 * y + 0.7152 * A + 0.0722 * D;\n }, Ch = function(y) {\n return y /= 255, y <= 0.03928 ? y / 12.92 : mC((y + 0.055) / 1.055, 2.4);\n }, Er = {}, cp = x, hp = g.type, ul = Er, up = function(y, A, D) {\n D === void 0 && (D = 0.5);\n for (var V = [], X = arguments.length - 3; X-- > 0; )\n V[X] = arguments[X + 3];\n var H = V[0] || \"lrgb\";\n if (!ul[H] && !V.length && (H = Object.keys(ul)[0]), !ul[H])\n throw new Error(\"interpolation mode \" + H + \" is not defined\");\n return hp(y) !== \"object\" && (y = new cp(y)), hp(A) !== \"object\" && (A = new cp(A)), ul[H](y, A, D).alpha(y.alpha() + D * (A.alpha() - y.alpha()));\n }, fp = x, TC = up;\n fp.prototype.mix = fp.prototype.interpolate = function(y, A) {\n A === void 0 && (A = 0.5);\n for (var D = [], V = arguments.length - 2; V-- > 0; )\n D[V] = arguments[V + 2];\n return TC.apply(void 0, [this, y, A].concat(D));\n };\n var dp = x;\n dp.prototype.premultiply = function(y) {\n y === void 0 && (y = !1);\n var A = this._rgb, D = A[3];\n return y ? (this._rgb = [A[0] * D, A[1] * D, A[2] * D, D], this) : new dp([A[0] * D, A[1] * D, A[2] * D, D], \"rgb\");\n };\n var Rh = x, xC = al;\n Rh.prototype.saturate = function(y) {\n y === void 0 && (y = 1);\n var A = this, D = A.lch();\n return D[1] += xC.Kn * y, D[1] < 0 && (D[1] = 0), new Rh(D, \"lch\").alpha(A.alpha(), !0);\n }, Rh.prototype.desaturate = function(y) {\n return y === void 0 && (y = 1), this.saturate(-y);\n };\n var pp = x, gp = g.type;\n pp.prototype.set = function(y, A, D) {\n D === void 0 && (D = !1);\n var V = y.split(\".\"), X = V[0], H = V[1], W = this[X]();\n if (H) {\n var $ = X.indexOf(H) - (X.substr(0, 2) === \"ok\" ? 2 : 0);\n if ($ > -1) {\n if (gp(A) == \"string\")\n switch (A.charAt(0)) {\n case \"+\":\n W[$] += +A;\n break;\n case \"-\":\n W[$] += +A;\n break;\n case \"*\":\n W[$] *= +A.substr(1);\n break;\n case \"/\":\n W[$] /= +A.substr(1);\n break;\n default:\n W[$] = +A;\n }\n else if (gp(A) === \"number\")\n W[$] = A;\n else\n throw new Error(\"unsupported value for Color.set\");\n var te = new pp(W, X);\n return D ? (this._rgb = te._rgb, this) : te;\n }\n throw new Error(\"unknown channel \" + H + \" in mode \" + X);\n } else\n return W;\n };\n var CC = x, RC = function(y, A, D) {\n var V = y._rgb, X = A._rgb;\n return new CC(\n V[0] + D * (X[0] - V[0]),\n V[1] + D * (X[1] - V[1]),\n V[2] + D * (X[2] - V[2]),\n \"rgb\"\n );\n };\n Er.rgb = RC;\n var SC = x, Sh = Math.sqrt, Kn = Math.pow, yC = function(y, A, D) {\n var V = y._rgb, X = V[0], H = V[1], W = V[2], $ = A._rgb, te = $[0], pe = $[1], xe = $[2];\n return new SC(\n Sh(Kn(X, 2) * (1 - D) + Kn(te, 2) * D),\n Sh(Kn(H, 2) * (1 - D) + Kn(pe, 2) * D),\n Sh(Kn(W, 2) * (1 - D) + Kn(xe, 2) * D),\n \"rgb\"\n );\n };\n Er.lrgb = yC;\n var IC = x, bC = function(y, A, D) {\n var V = y.lab(), X = A.lab();\n return new IC(\n V[0] + D * (X[0] - V[0]),\n V[1] + D * (X[1] - V[1]),\n V[2] + D * (X[2] - V[2]),\n \"lab\"\n );\n };\n Er.lab = bC;\n var mp = x, qn = function(y, A, D, V) {\n var X, H, W, $;\n V === \"hsl\" ? (W = y.hsl(), $ = A.hsl()) : V === \"hsv\" ? (W = y.hsv(), $ = A.hsv()) : V === \"hcg\" ? (W = y.hcg(), $ = A.hcg()) : V === \"hsi\" ? (W = y.hsi(), $ = A.hsi()) : V === \"lch\" || V === \"hcl\" ? (V = \"hcl\", W = y.hcl(), $ = A.hcl()) : V === \"oklch\" && (W = y.oklch().reverse(), $ = A.oklch().reverse());\n var te, pe, xe, Ue, ye, Xe;\n (V.substr(0, 1) === \"h\" || V === \"oklch\") && (X = W, te = X[0], xe = X[1], ye = X[2], H = $, pe = H[0], Ue = H[1], Xe = H[2]);\n var Ge, ft, vt, bt;\n return !isNaN(te) && !isNaN(pe) ? (pe > te && pe - te > 180 ? bt = pe - (te + 360) : pe < te && te - pe > 180 ? bt = pe + 360 - te : bt = pe - te, ft = te + D * bt) : isNaN(te) ? isNaN(pe) ? ft = Number.NaN : (ft = pe, (ye == 1 || ye == 0) && V != \"hsv\" && (Ge = Ue)) : (ft = te, (Xe == 1 || Xe == 0) && V != \"hsv\" && (Ge = xe)), Ge === void 0 && (Ge = xe + D * (Ue - xe)), vt = ye + D * (Xe - ye), V === \"oklch\" ? new mp([vt, Ge, ft], V) : new mp([ft, Ge, vt], V);\n }, AC = qn, _p = function(y, A, D) {\n return AC(y, A, D, \"lch\");\n };\n Er.lch = _p, Er.hcl = _p;\n var MC = x, PC = function(y, A, D) {\n var V = y.num(), X = A.num();\n return new MC(V + D * (X - V), \"num\");\n };\n Er.num = PC;\n var OC = qn, DC = function(y, A, D) {\n return OC(y, A, D, \"hcg\");\n };\n Er.hcg = DC;\n var NC = qn, FC = function(y, A, D) {\n return NC(y, A, D, \"hsi\");\n };\n Er.hsi = FC;\n var LC = qn, wC = function(y, A, D) {\n return LC(y, A, D, \"hsl\");\n };\n Er.hsl = wC;\n var UC = qn, VC = function(y, A, D) {\n return UC(y, A, D, \"hsv\");\n };\n Er.hsv = VC;\n var BC = x, kC = function(y, A, D) {\n var V = y.oklab(), X = A.oklab();\n return new BC(\n V[0] + D * (X[0] - V[0]),\n V[1] + D * (X[1] - V[1]),\n V[2] + D * (X[2] - V[2]),\n \"oklab\"\n );\n };\n Er.oklab = kC;\n var zC = qn, WC = function(y, A, D) {\n return zC(y, A, D, \"oklch\");\n };\n Er.oklch = WC;\n var yh = x, GC = g.clip_rgb, Ih = Math.pow, bh = Math.sqrt, Ah = Math.PI, Ep = Math.cos, vp = Math.sin, XC = Math.atan2, HC = function(y, A, D) {\n A === void 0 && (A = \"lrgb\"), D === void 0 && (D = null);\n var V = y.length;\n D || (D = Array.from(new Array(V)).map(function() {\n return 1;\n }));\n var X = V / D.reduce(function(ft, vt) {\n return ft + vt;\n });\n if (D.forEach(function(ft, vt) {\n D[vt] *= X;\n }), y = y.map(function(ft) {\n return new yh(ft);\n }), A === \"lrgb\")\n return KC(y, D);\n for (var H = y.shift(), W = H.get(A), $ = [], te = 0, pe = 0, xe = 0; xe < W.length; xe++)\n if (W[xe] = (W[xe] || 0) * D[0], $.push(isNaN(W[xe]) ? 0 : D[0]), A.charAt(xe) === \"h\" && !isNaN(W[xe])) {\n var Ue = W[xe] / 180 * Ah;\n te += Ep(Ue) * D[0], pe += vp(Ue) * D[0];\n }\n var ye = H.alpha() * D[0];\n y.forEach(function(ft, vt) {\n var bt = ft.get(A);\n ye += ft.alpha() * D[vt + 1];\n for (var Ft = 0; Ft < W.length; Ft++)\n if (!isNaN(bt[Ft]))\n if ($[Ft] += D[vt + 1], A.charAt(Ft) === \"h\") {\n var zi = bt[Ft] / 180 * Ah;\n te += Ep(zi) * D[vt + 1], pe += vp(zi) * D[vt + 1];\n } else\n W[Ft] += bt[Ft] * D[vt + 1];\n });\n for (var Xe = 0; Xe < W.length; Xe++)\n if (A.charAt(Xe) === \"h\") {\n for (var Ge = XC(pe / $[Xe], te / $[Xe]) / Ah * 180; Ge < 0; )\n Ge += 360;\n for (; Ge >= 360; )\n Ge -= 360;\n W[Xe] = Ge;\n } else\n W[Xe] = W[Xe] / $[Xe];\n return ye /= V, new yh(W, A).alpha(ye > 0.99999 ? 1 : ye, !0);\n }, KC = function(y, A) {\n for (var D = y.length, V = [0, 0, 0, 0], X = 0; X < y.length; X++) {\n var H = y[X], W = A[X] / D, $ = H._rgb;\n V[0] += Ih($[0], 2) * W, V[1] += Ih($[1], 2) * W, V[2] += Ih($[2], 2) * W, V[3] += $[3] * W;\n }\n return V[0] = bh(V[0]), V[1] = bh(V[1]), V[2] = bh(V[2]), V[3] > 0.9999999 && (V[3] = 1), new yh(GC(V));\n }, Br = M, Yn = g.type, qC = Math.pow, Mh = function(y) {\n var A = \"rgb\", D = Br(\"#ccc\"), V = 0, X = [0, 1], H = [], W = [0, 0], $ = !1, te = [], pe = !1, xe = 0, Ue = 1, ye = !1, Xe = {}, Ge = !0, ft = 1, vt = function(Ae) {\n if (Ae = Ae || [\"#fff\", \"#000\"], Ae && Yn(Ae) === \"string\" && Br.brewer && Br.brewer[Ae.toLowerCase()] && (Ae = Br.brewer[Ae.toLowerCase()]), Yn(Ae) === \"array\") {\n Ae.length === 1 && (Ae = [Ae[0], Ae[0]]), Ae = Ae.slice(0);\n for (var Je = 0; Je < Ae.length; Je++)\n Ae[Je] = Br(Ae[Je]);\n H.length = 0;\n for (var mt = 0; mt < Ae.length; mt++)\n H.push(mt / (Ae.length - 1));\n }\n return cr(), te = Ae;\n }, bt = function(Ae) {\n if ($ != null) {\n for (var Je = $.length - 1, mt = 0; mt < Je && Ae >= $[mt]; )\n mt++;\n return mt - 1;\n }\n return 0;\n }, Ft = function(Ae) {\n return Ae;\n }, zi = function(Ae) {\n return Ae;\n }, Oi = function(Ae, Je) {\n var mt, dt;\n if (Je == null && (Je = !1), isNaN(Ae) || Ae === null)\n return D;\n if (Je)\n dt = Ae;\n else if ($ && $.length > 2) {\n var Wi = bt(Ae);\n dt = Wi / ($.length - 2);\n } else\n Ue !== xe ? dt = (Ae - xe) / (Ue - xe) : dt = 1;\n dt = zi(dt), Je || (dt = Ft(dt)), ft !== 1 && (dt = qC(dt, ft)), dt = W[0] + dt * (1 - W[0] - W[1]), dt = Math.min(1, Math.max(0, dt));\n var $t = Math.floor(dt * 1e4);\n if (Ge && Xe[$t])\n mt = Xe[$t];\n else {\n if (Yn(te) === \"array\")\n for (var At = 0; At < H.length; At++) {\n var Vt = H[At];\n if (dt <= Vt) {\n mt = te[At];\n break;\n }\n if (dt >= Vt && At === H.length - 1) {\n mt = te[At];\n break;\n }\n if (dt > Vt && dt < H[At + 1]) {\n dt = (dt - Vt) / (H[At + 1] - Vt), mt = Br.interpolate(te[At], te[At + 1], dt, A);\n break;\n }\n }\n else\n Yn(te) === \"function\" && (mt = te(dt));\n Ge && (Xe[$t] = mt);\n }\n return mt;\n }, cr = function() {\n return Xe = {};\n };\n vt(y);\n var Rt = function(Ae) {\n var Je = Br(Oi(Ae));\n return pe && Je[pe] ? Je[pe]() : Je;\n };\n return Rt.classes = function(Ae) {\n if (Ae != null) {\n if (Yn(Ae) === \"array\")\n $ = Ae, X = [Ae[0], Ae[Ae.length - 1]];\n else {\n var Je = Br.analyze(X);\n Ae === 0 ? $ = [Je.min, Je.max] : $ = Br.limits(Je, \"e\", Ae);\n }\n return Rt;\n }\n return $;\n }, Rt.domain = function(Ae) {\n if (!arguments.length)\n return X;\n xe = Ae[0], Ue = Ae[Ae.length - 1], H = [];\n var Je = te.length;\n if (Ae.length === Je && xe !== Ue)\n for (var mt = 0, dt = Array.from(Ae); mt < dt.length; mt += 1) {\n var Wi = dt[mt];\n H.push((Wi - xe) / (Ue - xe));\n }\n else {\n for (var $t = 0; $t < Je; $t++)\n H.push($t / (Je - 1));\n if (Ae.length > 2) {\n var At = Ae.map(function(Bt, zt) {\n return zt / (Ae.length - 1);\n }), Vt = Ae.map(function(Bt) {\n return (Bt - xe) / (Ue - xe);\n });\n Vt.every(function(Bt, zt) {\n return At[zt] === Bt;\n }) || (zi = function(Bt) {\n if (Bt <= 0 || Bt >= 1)\n return Bt;\n for (var zt = 0; Bt >= Vt[zt + 1]; )\n zt++;\n var zr = (Bt - Vt[zt]) / (Vt[zt + 1] - Vt[zt]), Ks = At[zt] + zr * (At[zt + 1] - At[zt]);\n return Ks;\n });\n }\n }\n return X = [xe, Ue], Rt;\n }, Rt.mode = function(Ae) {\n return arguments.length ? (A = Ae, cr(), Rt) : A;\n }, Rt.range = function(Ae, Je) {\n return vt(Ae), Rt;\n }, Rt.out = function(Ae) {\n return pe = Ae, Rt;\n }, Rt.spread = function(Ae) {\n return arguments.length ? (V = Ae, Rt) : V;\n }, Rt.correctLightness = function(Ae) {\n return Ae == null && (Ae = !0), ye = Ae, cr(), ye ? Ft = function(Je) {\n for (var mt = Oi(0, !0).lab()[0], dt = Oi(1, !0).lab()[0], Wi = mt > dt, $t = Oi(Je, !0).lab()[0], At = mt + (dt - mt) * Je, Vt = $t - At, Bt = 0, zt = 1, zr = 20; Math.abs(Vt) > 0.01 && zr-- > 0; )\n (function() {\n return Wi && (Vt *= -1), Vt < 0 ? (Bt = Je, Je += (zt - Je) * 0.5) : (zt = Je, Je += (Bt - Je) * 0.5), $t = Oi(Je, !0).lab()[0], Vt = $t - At;\n })();\n return Je;\n } : Ft = function(Je) {\n return Je;\n }, Rt;\n }, Rt.padding = function(Ae) {\n return Ae != null ? (Yn(Ae) === \"number\" && (Ae = [Ae, Ae]), W = Ae, Rt) : W;\n }, Rt.colors = function(Ae, Je) {\n arguments.length < 2 && (Je = \"hex\");\n var mt = [];\n if (arguments.length === 0)\n mt = te.slice(0);\n else if (Ae === 1)\n mt = [Rt(0.5)];\n else if (Ae > 1) {\n var dt = X[0], Wi = X[1] - dt;\n mt = YC(0, Ae, !1).map(function(zt) {\n return Rt(dt + zt / (Ae - 1) * Wi);\n });\n } else {\n y = [];\n var $t = [];\n if ($ && $.length > 2)\n for (var At = 1, Vt = $.length, Bt = 1 <= Vt; Bt ? At < Vt : At > Vt; Bt ? At++ : At--)\n $t.push(($[At - 1] + $[At]) * 0.5);\n else\n $t = X;\n mt = $t.map(function(zt) {\n return Rt(zt);\n });\n }\n return Br[Je] && (mt = mt.map(function(zt) {\n return zt[Je]();\n })), mt;\n }, Rt.cache = function(Ae) {\n return Ae != null ? (Ge = Ae, Rt) : Ge;\n }, Rt.gamma = function(Ae) {\n return Ae != null ? (ft = Ae, Rt) : ft;\n }, Rt.nodata = function(Ae) {\n return Ae != null ? (D = Br(Ae), Rt) : D;\n }, Rt;\n };\n function YC(y, A, D) {\n for (var V = [], X = y < A, H = D ? X ? A + 1 : A - 1 : A, W = y; X ? W < H : W > H; X ? W++ : W--)\n V.push(W);\n return V;\n }\n var ja = x, ZC = Mh, jC = function(y) {\n for (var A = [1, 1], D = 1; D < y; D++) {\n for (var V = [1], X = 1; X <= A.length; X++)\n V[X] = (A[X] || 0) + A[X - 1];\n A = V;\n }\n return A;\n }, QC = function(y) {\n var A, D, V, X, H, W, $;\n if (y = y.map(function(ye) {\n return new ja(ye);\n }), y.length === 2)\n A = y.map(function(ye) {\n return ye.lab();\n }), H = A[0], W = A[1], X = function(ye) {\n var Xe = [0, 1, 2].map(function(Ge) {\n return H[Ge] + ye * (W[Ge] - H[Ge]);\n });\n return new ja(Xe, \"lab\");\n };\n else if (y.length === 3)\n D = y.map(function(ye) {\n return ye.lab();\n }), H = D[0], W = D[1], $ = D[2], X = function(ye) {\n var Xe = [0, 1, 2].map(function(Ge) {\n return (1 - ye) * (1 - ye) * H[Ge] + 2 * (1 - ye) * ye * W[Ge] + ye * ye * $[Ge];\n });\n return new ja(Xe, \"lab\");\n };\n else if (y.length === 4) {\n var te;\n V = y.map(function(ye) {\n return ye.lab();\n }), H = V[0], W = V[1], $ = V[2], te = V[3], X = function(ye) {\n var Xe = [0, 1, 2].map(function(Ge) {\n return (1 - ye) * (1 - ye) * (1 - ye) * H[Ge] + 3 * (1 - ye) * (1 - ye) * ye * W[Ge] + 3 * (1 - ye) * ye * ye * $[Ge] + ye * ye * ye * te[Ge];\n });\n return new ja(Xe, \"lab\");\n };\n } else if (y.length >= 5) {\n var pe, xe, Ue;\n pe = y.map(function(ye) {\n return ye.lab();\n }), Ue = y.length - 1, xe = jC(Ue), X = function(ye) {\n var Xe = 1 - ye, Ge = [0, 1, 2].map(function(ft) {\n return pe.reduce(function(vt, bt, Ft) {\n return vt + xe[Ft] * Math.pow(Xe, Ue - Ft) * Math.pow(ye, Ft) * bt[ft];\n }, 0);\n });\n return new ja(Ge, \"lab\");\n };\n } else\n throw new RangeError(\"No point in running bezier with only one color.\");\n return X;\n }, JC = function(y) {\n var A = QC(y);\n return A.scale = function() {\n return ZC(A);\n }, A;\n }, Ph = M, kr = function(y, A, D) {\n if (!kr[D])\n throw new Error(\"unknown blend mode \" + D);\n return kr[D](y, A);\n }, Xs = function(y) {\n return function(A, D) {\n var V = Ph(D).rgb(), X = Ph(A).rgb();\n return Ph.rgb(y(V, X));\n };\n }, Hs = function(y) {\n return function(A, D) {\n var V = [];\n return V[0] = y(A[0], D[0]), V[1] = y(A[1], D[1]), V[2] = y(A[2], D[2]), V;\n };\n }, $C = function(y) {\n return y;\n }, eR = function(y, A) {\n return y * A / 255;\n }, tR = function(y, A) {\n return y > A ? A : y;\n }, iR = function(y, A) {\n return y > A ? y : A;\n }, rR = function(y, A) {\n return 255 * (1 - (1 - y / 255) * (1 - A / 255));\n }, sR = function(y, A) {\n return A < 128 ? 2 * y * A / 255 : 255 * (1 - 2 * (1 - y / 255) * (1 - A / 255));\n }, nR = function(y, A) {\n return 255 * (1 - (1 - A / 255) / (y / 255));\n }, aR = function(y, A) {\n return y === 255 ? 255 : (y = 255 * (A / 255) / (1 - y / 255), y > 255 ? 255 : y);\n };\n kr.normal = Xs(Hs($C)), kr.multiply = Xs(Hs(eR)), kr.screen = Xs(Hs(rR)), kr.overlay = Xs(Hs(sR)), kr.darken = Xs(Hs(tR)), kr.lighten = Xs(Hs(iR)), kr.dodge = Xs(Hs(aR)), kr.burn = Xs(Hs(nR));\n for (var oR = kr, Oh = g.type, lR = g.clip_rgb, cR = g.TWOPI, hR = Math.pow, uR = Math.sin, fR = Math.cos, Tp = M, dR = function(y, A, D, V, X) {\n y === void 0 && (y = 300), A === void 0 && (A = -1.5), D === void 0 && (D = 1), V === void 0 && (V = 1), X === void 0 && (X = [0, 1]);\n var H = 0, W;\n Oh(X) === \"array\" ? W = X[1] - X[0] : (W = 0, X = [X, X]);\n var $ = function(te) {\n var pe = cR * ((y + 120) / 360 + A * te), xe = hR(X[0] + W * te, V), Ue = H !== 0 ? D[0] + te * H : D, ye = Ue * xe * (1 - xe) / 2, Xe = fR(pe), Ge = uR(pe), ft = xe + ye * (-0.14861 * Xe + 1.78277 * Ge), vt = xe + ye * (-0.29227 * Xe - 0.90649 * Ge), bt = xe + ye * (1.97294 * Xe);\n return Tp(lR([ft * 255, vt * 255, bt * 255, 1]));\n };\n return $.start = function(te) {\n return te == null ? y : (y = te, $);\n }, $.rotations = function(te) {\n return te == null ? A : (A = te, $);\n }, $.gamma = function(te) {\n return te == null ? V : (V = te, $);\n }, $.hue = function(te) {\n return te == null ? D : (D = te, Oh(D) === \"array\" ? (H = D[1] - D[0], H === 0 && (D = D[1])) : H = 0, $);\n }, $.lightness = function(te) {\n return te == null ? X : (Oh(te) === \"array\" ? (X = te, W = te[1] - te[0]) : (X = [te, te], W = 0), $);\n }, $.scale = function() {\n return Tp.scale($);\n }, $.hue(D), $;\n }, pR = x, gR = \"0123456789abcdef\", mR = Math.floor, _R = Math.random, ER = function() {\n for (var y = \"#\", A = 0; A < 6; A++)\n y += gR.charAt(mR(_R() * 16));\n return new pR(y, \"hex\");\n }, Dh = c, xp = Math.log, vR = Math.pow, TR = Math.floor, xR = Math.abs, Cp = function(y, A) {\n A === void 0 && (A = null);\n var D = {\n min: Number.MAX_VALUE,\n max: Number.MAX_VALUE * -1,\n sum: 0,\n values: [],\n count: 0\n };\n return Dh(y) === \"object\" && (y = Object.values(y)), y.forEach(function(V) {\n A && Dh(V) === \"object\" && (V = V[A]), V != null && !isNaN(V) && (D.values.push(V), D.sum += V, V < D.min && (D.min = V), V > D.max && (D.max = V), D.count += 1);\n }), D.domain = [D.min, D.max], D.limits = function(V, X) {\n return Rp(D, V, X);\n }, D;\n }, Rp = function(y, A, D) {\n A === void 0 && (A = \"equal\"), D === void 0 && (D = 7), Dh(y) == \"array\" && (y = Cp(y));\n var V = y.min, X = y.max, H = y.values.sort(function(Fh, Lh) {\n return Fh - Lh;\n });\n if (D === 1)\n return [V, X];\n var W = [];\n if (A.substr(0, 1) === \"c\" && (W.push(V), W.push(X)), A.substr(0, 1) === \"e\") {\n W.push(V);\n for (var $ = 1; $ < D; $++)\n W.push(V + $ / D * (X - V));\n W.push(X);\n } else if (A.substr(0, 1) === \"l\") {\n if (V <= 0)\n throw new Error(\"Logarithmic scales are only possible for values > 0\");\n var te = Math.LOG10E * xp(V), pe = Math.LOG10E * xp(X);\n W.push(V);\n for (var xe = 1; xe < D; xe++)\n W.push(vR(10, te + xe / D * (pe - te)));\n W.push(X);\n } else if (A.substr(0, 1) === \"q\") {\n W.push(V);\n for (var Ue = 1; Ue < D; Ue++) {\n var ye = (H.length - 1) * Ue / D, Xe = TR(ye);\n if (Xe === ye)\n W.push(H[Xe]);\n else {\n var Ge = ye - Xe;\n W.push(H[Xe] * (1 - Ge) + H[Xe + 1] * Ge);\n }\n }\n W.push(X);\n } else if (A.substr(0, 1) === \"k\") {\n var ft, vt = H.length, bt = new Array(vt), Ft = new Array(D), zi = !0, Oi = 0, cr = null;\n cr = [], cr.push(V);\n for (var Rt = 1; Rt < D; Rt++)\n cr.push(V + Rt / D * (X - V));\n for (cr.push(X); zi; ) {\n for (var Ae = 0; Ae < D; Ae++)\n Ft[Ae] = 0;\n for (var Je = 0; Je < vt; Je++)\n for (var mt = H[Je], dt = Number.MAX_VALUE, Wi = void 0, $t = 0; $t < D; $t++) {\n var At = xR(cr[$t] - mt);\n At < dt && (dt = At, Wi = $t), Ft[Wi]++, bt[Je] = Wi;\n }\n for (var Vt = new Array(D), Bt = 0; Bt < D; Bt++)\n Vt[Bt] = null;\n for (var zt = 0; zt < vt; zt++)\n ft = bt[zt], Vt[ft] === null ? Vt[ft] = H[zt] : Vt[ft] += H[zt];\n for (var zr = 0; zr < D; zr++)\n Vt[zr] *= 1 / Ft[zr];\n zi = !1;\n for (var Ks = 0; Ks < D; Ks++)\n if (Vt[Ks] !== cr[Ks]) {\n zi = !0;\n break;\n }\n cr = Vt, Oi++, Oi > 200 && (zi = !1);\n }\n for (var qs = {}, Zn = 0; Zn < D; Zn++)\n qs[Zn] = [];\n for (var jn = 0; jn < vt; jn++)\n ft = bt[jn], qs[ft].push(H[jn]);\n for (var Rs = [], mn = 0; mn < D; mn++)\n Rs.push(qs[mn][0]), Rs.push(qs[mn][qs[mn].length - 1]);\n Rs = Rs.sort(function(Fh, Lh) {\n return Fh - Lh;\n }), W.push(Rs[0]);\n for (var Qa = 1; Qa < Rs.length; Qa += 2) {\n var _n = Rs[Qa];\n !isNaN(_n) && W.indexOf(_n) === -1 && W.push(_n);\n }\n }\n return W;\n }, Sp = { analyze: Cp, limits: Rp }, yp = x, CR = function(y, A) {\n y = new yp(y), A = new yp(A);\n var D = y.luminance(), V = A.luminance();\n return D > V ? (D + 0.05) / (V + 0.05) : (V + 0.05) / (D + 0.05);\n }, Ip = x, Cs = Math.sqrt, Ti = Math.pow, RR = Math.min, SR = Math.max, bp = Math.atan2, Ap = Math.abs, fl = Math.cos, Mp = Math.sin, yR = Math.exp, Pp = Math.PI, IR = function(y, A, D, V, X) {\n D === void 0 && (D = 1), V === void 0 && (V = 1), X === void 0 && (X = 1);\n var H = function(_n) {\n return 360 * _n / (2 * Pp);\n }, W = function(_n) {\n return 2 * Pp * _n / 360;\n };\n y = new Ip(y), A = new Ip(A);\n var $ = Array.from(y.lab()), te = $[0], pe = $[1], xe = $[2], Ue = Array.from(A.lab()), ye = Ue[0], Xe = Ue[1], Ge = Ue[2], ft = (te + ye) / 2, vt = Cs(Ti(pe, 2) + Ti(xe, 2)), bt = Cs(Ti(Xe, 2) + Ti(Ge, 2)), Ft = (vt + bt) / 2, zi = 0.5 * (1 - Cs(Ti(Ft, 7) / (Ti(Ft, 7) + Ti(25, 7)))), Oi = pe * (1 + zi), cr = Xe * (1 + zi), Rt = Cs(Ti(Oi, 2) + Ti(xe, 2)), Ae = Cs(Ti(cr, 2) + Ti(Ge, 2)), Je = (Rt + Ae) / 2, mt = H(bp(xe, Oi)), dt = H(bp(Ge, cr)), Wi = mt >= 0 ? mt : mt + 360, $t = dt >= 0 ? dt : dt + 360, At = Ap(Wi - $t) > 180 ? (Wi + $t + 360) / 2 : (Wi + $t) / 2, Vt = 1 - 0.17 * fl(W(At - 30)) + 0.24 * fl(W(2 * At)) + 0.32 * fl(W(3 * At + 6)) - 0.2 * fl(W(4 * At - 63)), Bt = $t - Wi;\n Bt = Ap(Bt) <= 180 ? Bt : $t <= Wi ? Bt + 360 : Bt - 360, Bt = 2 * Cs(Rt * Ae) * Mp(W(Bt) / 2);\n var zt = ye - te, zr = Ae - Rt, Ks = 1 + 0.015 * Ti(ft - 50, 2) / Cs(20 + Ti(ft - 50, 2)), qs = 1 + 0.045 * Je, Zn = 1 + 0.015 * Je * Vt, jn = 30 * yR(-Ti((At - 275) / 25, 2)), Rs = 2 * Cs(Ti(Je, 7) / (Ti(Je, 7) + Ti(25, 7))), mn = -Rs * Mp(2 * W(jn)), Qa = Cs(Ti(zt / (D * Ks), 2) + Ti(zr / (V * qs), 2) + Ti(Bt / (X * Zn), 2) + mn * (zr / (V * qs)) * (Bt / (X * Zn)));\n return SR(0, RR(100, Qa));\n }, Op = x, bR = function(y, A, D) {\n D === void 0 && (D = \"lab\"), y = new Op(y), A = new Op(A);\n var V = y.get(D), X = A.get(D), H = 0;\n for (var W in V) {\n var $ = (V[W] || 0) - (X[W] || 0);\n H += $ * $;\n }\n return Math.sqrt(H);\n }, AR = x, MR = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n try {\n return new (Function.prototype.bind.apply(AR, [null].concat(y)))(), !0;\n } catch {\n return !1;\n }\n }, Dp = M, Np = Mh, PR = {\n cool: function() {\n return Np([Dp.hsl(180, 1, 0.9), Dp.hsl(250, 0.7, 0.4)]);\n },\n hot: function() {\n return Np([\"#000\", \"#f00\", \"#ff0\", \"#fff\"]).mode(\"rgb\");\n }\n }, dl = {\n // sequential\n OrRd: [\"#fff7ec\", \"#fee8c8\", \"#fdd49e\", \"#fdbb84\", \"#fc8d59\", \"#ef6548\", \"#d7301f\", \"#b30000\", \"#7f0000\"],\n PuBu: [\"#fff7fb\", \"#ece7f2\", \"#d0d1e6\", \"#a6bddb\", \"#74a9cf\", \"#3690c0\", \"#0570b0\", \"#045a8d\", \"#023858\"],\n BuPu: [\"#f7fcfd\", \"#e0ecf4\", \"#bfd3e6\", \"#9ebcda\", \"#8c96c6\", \"#8c6bb1\", \"#88419d\", \"#810f7c\", \"#4d004b\"],\n Oranges: [\"#fff5eb\", \"#fee6ce\", \"#fdd0a2\", \"#fdae6b\", \"#fd8d3c\", \"#f16913\", \"#d94801\", \"#a63603\", \"#7f2704\"],\n BuGn: [\"#f7fcfd\", \"#e5f5f9\", \"#ccece6\", \"#99d8c9\", \"#66c2a4\", \"#41ae76\", \"#238b45\", \"#006d2c\", \"#00441b\"],\n YlOrBr: [\"#ffffe5\", \"#fff7bc\", \"#fee391\", \"#fec44f\", \"#fe9929\", \"#ec7014\", \"#cc4c02\", \"#993404\", \"#662506\"],\n YlGn: [\"#ffffe5\", \"#f7fcb9\", \"#d9f0a3\", \"#addd8e\", \"#78c679\", \"#41ab5d\", \"#238443\", \"#006837\", \"#004529\"],\n Reds: [\"#fff5f0\", \"#fee0d2\", \"#fcbba1\", \"#fc9272\", \"#fb6a4a\", \"#ef3b2c\", \"#cb181d\", \"#a50f15\", \"#67000d\"],\n RdPu: [\"#fff7f3\", \"#fde0dd\", \"#fcc5c0\", \"#fa9fb5\", \"#f768a1\", \"#dd3497\", \"#ae017e\", \"#7a0177\", \"#49006a\"],\n Greens: [\"#f7fcf5\", \"#e5f5e0\", \"#c7e9c0\", \"#a1d99b\", \"#74c476\", \"#41ab5d\", \"#238b45\", \"#006d2c\", \"#00441b\"],\n YlGnBu: [\"#ffffd9\", \"#edf8b1\", \"#c7e9b4\", \"#7fcdbb\", \"#41b6c4\", \"#1d91c0\", \"#225ea8\", \"#253494\", \"#081d58\"],\n Purples: [\"#fcfbfd\", \"#efedf5\", \"#dadaeb\", \"#bcbddc\", \"#9e9ac8\", \"#807dba\", \"#6a51a3\", \"#54278f\", \"#3f007d\"],\n GnBu: [\"#f7fcf0\", \"#e0f3db\", \"#ccebc5\", \"#a8ddb5\", \"#7bccc4\", \"#4eb3d3\", \"#2b8cbe\", \"#0868ac\", \"#084081\"],\n Greys: [\"#ffffff\", \"#f0f0f0\", \"#d9d9d9\", \"#bdbdbd\", \"#969696\", \"#737373\", \"#525252\", \"#252525\", \"#000000\"],\n YlOrRd: [\"#ffffcc\", \"#ffeda0\", \"#fed976\", \"#feb24c\", \"#fd8d3c\", \"#fc4e2a\", \"#e31a1c\", \"#bd0026\", \"#800026\"],\n PuRd: [\"#f7f4f9\", \"#e7e1ef\", \"#d4b9da\", \"#c994c7\", \"#df65b0\", \"#e7298a\", \"#ce1256\", \"#980043\", \"#67001f\"],\n Blues: [\"#f7fbff\", \"#deebf7\", \"#c6dbef\", \"#9ecae1\", \"#6baed6\", \"#4292c6\", \"#2171b5\", \"#08519c\", \"#08306b\"],\n PuBuGn: [\"#fff7fb\", \"#ece2f0\", \"#d0d1e6\", \"#a6bddb\", \"#67a9cf\", \"#3690c0\", \"#02818a\", \"#016c59\", \"#014636\"],\n Viridis: [\"#440154\", \"#482777\", \"#3f4a8a\", \"#31678e\", \"#26838f\", \"#1f9d8a\", \"#6cce5a\", \"#b6de2b\", \"#fee825\"],\n // diverging\n Spectral: [\"#9e0142\", \"#d53e4f\", \"#f46d43\", \"#fdae61\", \"#fee08b\", \"#ffffbf\", \"#e6f598\", \"#abdda4\", \"#66c2a5\", \"#3288bd\", \"#5e4fa2\"],\n RdYlGn: [\"#a50026\", \"#d73027\", \"#f46d43\", \"#fdae61\", \"#fee08b\", \"#ffffbf\", \"#d9ef8b\", \"#a6d96a\", \"#66bd63\", \"#1a9850\", \"#006837\"],\n RdBu: [\"#67001f\", \"#b2182b\", \"#d6604d\", \"#f4a582\", \"#fddbc7\", \"#f7f7f7\", \"#d1e5f0\", \"#92c5de\", \"#4393c3\", \"#2166ac\", \"#053061\"],\n PiYG: [\"#8e0152\", \"#c51b7d\", \"#de77ae\", \"#f1b6da\", \"#fde0ef\", \"#f7f7f7\", \"#e6f5d0\", \"#b8e186\", \"#7fbc41\", \"#4d9221\", \"#276419\"],\n PRGn: [\"#40004b\", \"#762a83\", \"#9970ab\", \"#c2a5cf\", \"#e7d4e8\", \"#f7f7f7\", \"#d9f0d3\", \"#a6dba0\", \"#5aae61\", \"#1b7837\", \"#00441b\"],\n RdYlBu: [\"#a50026\", \"#d73027\", \"#f46d43\", \"#fdae61\", \"#fee090\", \"#ffffbf\", \"#e0f3f8\", \"#abd9e9\", \"#74add1\", \"#4575b4\", \"#313695\"],\n BrBG: [\"#543005\", \"#8c510a\", \"#bf812d\", \"#dfc27d\", \"#f6e8c3\", \"#f5f5f5\", \"#c7eae5\", \"#80cdc1\", \"#35978f\", \"#01665e\", \"#003c30\"],\n RdGy: [\"#67001f\", \"#b2182b\", \"#d6604d\", \"#f4a582\", \"#fddbc7\", \"#ffffff\", \"#e0e0e0\", \"#bababa\", \"#878787\", \"#4d4d4d\", \"#1a1a1a\"],\n PuOr: [\"#7f3b08\", \"#b35806\", \"#e08214\", \"#fdb863\", \"#fee0b6\", \"#f7f7f7\", \"#d8daeb\", \"#b2abd2\", \"#8073ac\", \"#542788\", \"#2d004b\"],\n // qualitative\n Set2: [\"#66c2a5\", \"#fc8d62\", \"#8da0cb\", \"#e78ac3\", \"#a6d854\", \"#ffd92f\", \"#e5c494\", \"#b3b3b3\"],\n Accent: [\"#7fc97f\", \"#beaed4\", \"#fdc086\", \"#ffff99\", \"#386cb0\", \"#f0027f\", \"#bf5b17\", \"#666666\"],\n Set1: [\"#e41a1c\", \"#377eb8\", \"#4daf4a\", \"#984ea3\", \"#ff7f00\", \"#ffff33\", \"#a65628\", \"#f781bf\", \"#999999\"],\n Set3: [\"#8dd3c7\", \"#ffffb3\", \"#bebada\", \"#fb8072\", \"#80b1d3\", \"#fdb462\", \"#b3de69\", \"#fccde5\", \"#d9d9d9\", \"#bc80bd\", \"#ccebc5\", \"#ffed6f\"],\n Dark2: [\"#1b9e77\", \"#d95f02\", \"#7570b3\", \"#e7298a\", \"#66a61e\", \"#e6ab02\", \"#a6761d\", \"#666666\"],\n Paired: [\"#a6cee3\", \"#1f78b4\", \"#b2df8a\", \"#33a02c\", \"#fb9a99\", \"#e31a1c\", \"#fdbf6f\", \"#ff7f00\", \"#cab2d6\", \"#6a3d9a\", \"#ffff99\", \"#b15928\"],\n Pastel2: [\"#b3e2cd\", \"#fdcdac\", \"#cbd5e8\", \"#f4cae4\", \"#e6f5c9\", \"#fff2ae\", \"#f1e2cc\", \"#cccccc\"],\n Pastel1: [\"#fbb4ae\", \"#b3cde3\", \"#ccebc5\", \"#decbe4\", \"#fed9a6\", \"#ffffcc\", \"#e5d8bd\", \"#fddaec\", \"#f2f2f2\"]\n }, Nh = 0, Fp = Object.keys(dl); Nh < Fp.length; Nh += 1) {\n var Lp = Fp[Nh];\n dl[Lp.toLowerCase()] = dl[Lp];\n }\n var OR = dl, Pi = M;\n Pi.average = HC, Pi.bezier = JC, Pi.blend = oR, Pi.cubehelix = dR, Pi.mix = Pi.interpolate = up, Pi.random = ER, Pi.scale = Mh, Pi.analyze = Sp.analyze, Pi.contrast = CR, Pi.deltaE = IR, Pi.distance = bR, Pi.limits = Sp.limits, Pi.valid = MR, Pi.scales = PR, Pi.colors = qd, Pi.brewer = OR;\n var DR = Pi;\n return DR;\n });\n})(Fv);\nvar vk = Fv.exports;\nconst Xi = /* @__PURE__ */ cv(vk);\nclass Tk {\n constructor(e) {\n this.scheme = typeof e == \"string\" ? Lv[e] : e;\n }\n toColor3(e = this.scheme.length) {\n return Xi.scale(this.scheme).colors(e).map((t) => pi.FromHexString(t));\n }\n toColor4(e = this.scheme.length) {\n return Xi.scale(this.scheme).colors(e).map((t) => fu.FromHexString(t));\n }\n toStandardMaterial(e = this.scheme.length) {\n return Xi.scale(this.scheme).colors(e).map((t) => Yu(t));\n }\n toPBRMaterialRough(e = this.scheme.length) {\n return Xi.scale(this.scheme).colors(e).map((t) => Zu(t));\n }\n toPBRMaterialGlossy(e = this.scheme.length) {\n return Xi.scale(this.scheme).colors(e).map((t) => ju(t));\n }\n}\nclass xk {\n constructor(e) {\n this.scheme = typeof e == \"string\" ? Lv[e] : e;\n }\n toColor3(e = void 0) {\n return e === void 0 ? (t) => pi.FromHexString(Xi.scale(this.scheme)(t).hex()) : (t) => pi.FromHexString(Xi.scale(this.scheme).classes(e)(t).hex());\n }\n toColor4(e = void 0) {\n return e === void 0 ? (t) => fu.FromHexString(Xi.scale(this.scheme)(t).hex()) : (t) => fu.FromHexString(Xi.scale(this.scheme).classes(e)(t).hex());\n }\n toStandardMaterial(e = void 0) {\n return e === void 0 ? (t) => Yu(Xi.scale(this.scheme)(t).hex()) : (t) => Yu(Xi.scale(this.scheme).classes(e)(t).hex());\n }\n toPBRMaterialRough(e = void 0) {\n return e === void 0 ? (t) => Zu(Xi.scale(this.scheme)(t).hex()) : (t) => Zu(Xi.scale(this.scheme).classes(e)(t).hex());\n }\n toPBRMaterialGlossy(e = void 0) {\n return e === void 0 ? (t) => ju(Xi.scale(this.scheme)(t).hex()) : (t) => ju(Xi.scale(this.scheme).classes(e)(t).hex());\n }\n}\nfunction Mk(n) {\n return new Tk(n);\n}\nfunction Pk(n) {\n return new xk(n);\n}\nlet Lv = {\n ...Xi.brewer,\n d310: [\n \"#1f77b4\",\n \"#ff7f0e\",\n \"#2ca02c\",\n \"#d62728\",\n \"#9467bd\",\n \"#8c564b\",\n \"#e377c2\",\n \"#7f7f7f\",\n \"#bcbd22\",\n \"#17becf\"\n ]\n};\n({\n ...Xi.brewer\n});\nfunction Yu(n) {\n let e = new Vs(n);\n return e.diffuseColor = pi.FromHexString(n), e;\n}\nfunction Zu(n) {\n let e = new VR(n);\n return e.baseColor = pi.FromHexString(n), e;\n}\nfunction ju(n) {\n let e = new BR(n);\n return e.diffuseColor = pi.FromHexString(n), e.specularColor = pi.FromHexString(n), e;\n}\nclass wv {\n constructor(e, t, i) {\n this.currentLayout = 0, this.name = e, this.options = t, this.scene = i, this.root = new Ji(this.name, this.scene);\n }\n planeLayout() {\n this.currentLayout = 1;\n let e = this.options.rows || 1, t = this.options.margin || new da(0, 0), i = this.options.selection.selected.length, r = this.boundingBoxLocal(this.options.selection), s = r.boundingBox.maximumWorld.x - r.boundingBox.minimumWorld.x, a = r.boundingBox.maximumWorld.y - r.boundingBox.minimumWorld.y, o = this.options.columns || i;\n return o = i % e == 0 ? i / e : Math.floor(i / e) + 1, this.options.selection.selected.forEach((l, c) => {\n l.parent = this.root, this.animatePosition(l, new Me(c % o * (s + t.x), Math.floor(c / o) * (a + t.y), 0)), this.animateRotation(l, new Me(0, 0, 0));\n }), this;\n }\n cylinderLayout() {\n this.currentLayout = 2;\n let e = this.options.rows || 1, t = this.options.margin || new da(0, 0), i = this.options.selection.selected.length, r = this.boundingBoxLocal(this.options.selection), s = this.options.radius || 5, a = r.boundingBox.maximumWorld.x - r.boundingBox.minimumWorld.x, o = r.boundingBox.maximumWorld.y - r.boundingBox.minimumWorld.y, l = this.options.columns || i;\n l = i % e == 0 ? i / e : Math.floor(i / e) + 1;\n let c = Math.atan(a / 2 / s) * 2, h = new Me(0, 0, 1);\n return new Me(0, 1, 0), this.options.selection.selected.forEach((u, f) => {\n var T;\n u.parent = this.root, this.animateRotation(u, new Me(0, 0, 0));\n let d = new Ji(\"vect\", this.scene);\n d.position = new Me(0, 0, 0);\n let p = Math.floor(f / l), g = f % l;\n d.rotate(new Me(0, 1, 0), g * (c + t.x) * Math.PI / 180);\n let v = d.getDirection(h).normalize().multiplyByFloats(s, s, s), E = new Me(v.x, p * (o + t.y), v.z);\n this.animatePosition(u, E);\n let C = ((T = d.rotationQuaternion) == null ? void 0 : T.toEulerAngles()) || new Me(0, 0, 0);\n this.animateRotation(u, C), d.dispose();\n }), this;\n }\n sphereLayout() {\n this.currentLayout = 3;\n let e = this.options.rows || 1, t = this.options.margin || new da(0, 0), i = this.options.selection.selected.length, r = this.boundingBoxLocal(this.options.selection), s = this.options.radius || 5, a = r.boundingBox.maximumWorld.x - r.boundingBox.minimumWorld.x, o = r.boundingBox.maximumWorld.y - r.boundingBox.minimumWorld.y, l = this.options.columns || i;\n l = i % e == 0 ? i / e : Math.floor(i / e) + 1;\n let c = Math.atan(a / 2 / s) * 2 * 180 / Math.PI, h = Math.atan(o / 2 / s) * 2 * 180 / Math.PI;\n return this.options.selection.selected.forEach((u, f) => {\n u.parent = this.root;\n let d = Math.floor(f / l) - Math.floor(e / 2), p = f % l - Math.floor(l / 2), g = Math.min(d * (c + t.y), 360) * Math.PI / 180, m = Math.min(Math.abs(90 - p * (h + t.x)), 180) * Math.PI / 180, v = new Me(s * Math.sin(m) * Math.cos(g), s * Math.sin(m) * Math.sin(g), s * Math.cos(m));\n this.animatePosition(u, v);\n let E = new Me(-g, m, 0);\n this.animateRotation(u, E);\n }), this;\n }\n attr(e, t) {\n switch (e) {\n case \"row\":\n this.options.rows = Number(t), this.currentLayout == 1 && this.planeLayout(), this.currentLayout == 2 && this.cylinderLayout(), this.currentLayout == 3 && this.sphereLayout();\n break;\n case \"margin\":\n let i = t;\n this.options.margin = i, this.currentLayout == 1 && this.planeLayout(), this.currentLayout == 2 && this.cylinderLayout(), this.currentLayout == 3 && this.sphereLayout();\n break;\n case \"radius\":\n this.options.radius = Number(t), this.currentLayout == 2 && this.cylinderLayout(), this.currentLayout == 3 && this.sphereLayout();\n break;\n }\n return this;\n }\n // public zalign(){\n // let boundingBox = this.boundingBoxLocal(this.options.selection)\n // let widthZ = boundingBox.boundingBox.maximumWorld.z - boundingBox.boundingBox.minimumWorld.z;\n // this.options.selection.selected.forEach((node, i) => {\n // let test = new Selection([this.options.selection.selected[i]], this.scene);\n // let zSize = this.boundingBoxLocal(test).boundingBox.maximumWorld.z - this.boundingBoxLocal(test).boundingBox.minimumWorld.z;\n // this.animatePosition((node as TransformNode), new Vector3((node as TransformNode).position.x, (node as TransformNode).position.y, zSize / 2 - widthZ / 2));\n // })\n // return this;\n // }\n update() {\n return this.currentLayout == 1 && this.planeLayout(), this.currentLayout == 2 && this.cylinderLayout(), this.currentLayout == 3 && this.sphereLayout(), this;\n }\n animatePosition(e, t) {\n var i = new Ss(\"animationBezierTorus\", \"position\", 30, Ss.ANIMATIONTYPE_VECTOR3, Ss.ANIMATIONLOOPMODE_CONSTANT), r = [];\n r.push({ frame: 0, value: e.position }), r.push({ frame: 20, value: t }), i.setKeys(r);\n var s = new wh(0.73, 0, 0.31, 1);\n i.setEasingFunction(s), e.animations.length = Math.min(e.animations.length, 2), e.animations.push(i), this.scene.beginDirectAnimation(e, [i], 0, 20, !1);\n }\n animateRotation(e, t) {\n let i = [];\n i.push({ frame: 0, value: e.rotation }), i.push({ frame: 20, value: t });\n let r = new Ss(\n \"\",\n \"rotation\",\n 20,\n Ss.ANIMATIONTYPE_VECTOR3,\n Ss.ANIMATIONLOOPMODE_CYCLE\n );\n r.setKeys(i);\n var s = new wh(0.73, 0, 0.31, 1);\n r.setEasingFunction(s), this.scene.beginDirectAnimation(e, [r], 0, 20, !1);\n }\n animateScale(e, t) {\n var i = new Ss(\"animationBezierTorus\", \"scaling\", 30, Ss.ANIMATIONTYPE_VECTOR3, Ss.ANIMATIONLOOPMODE_CONSTANT), r = [];\n r.push({ frame: 0, value: e.scaling }), r.push({ frame: 10, value: t }), i.setKeys(r);\n var s = new wh(0.73, 0, 0.31, 1);\n i.setEasingFunction(s), e.animations.length = Math.min(e.animations.length, 2), e.animations.push(i), this.scene.beginDirectAnimation(e, [i], 0, 10, !0);\n }\n boundingBoxLocal(e) {\n let t = new Me(0, 0, 0), i = new Me(0, 0, 0);\n return e.selected.forEach((r, s) => {\n r.getChildMeshes().forEach((o, l) => {\n o.computeWorldMatrix(!0);\n let c = o.getBoundingInfo().boundingBox.minimumWorld.subtract(r.getAbsolutePosition()), h = o.getBoundingInfo().boundingBox.maximumWorld.subtract(r.getAbsolutePosition());\n t = Me.Minimize(t, c), i = Me.Maximize(i, h);\n });\n }), new Pn(t, i);\n }\n}\nfunction Ok(n, e, t) {\n const i = {\n selection: e.selection,\n rows: e.rows || 1,\n columns: e.columns || e.selection.selected.length,\n margin: e.margin || new da(0, 0),\n order: e.order || []\n };\n return new wv(n, i, t).planeLayout();\n}\nfunction Dk(n, e, t) {\n const i = {\n selection: e.selection,\n rows: e.rows || 1,\n columns: e.columns || e.selection.selected.length,\n radius: e.radius || 5,\n margin: e.margin || new da(0, 0),\n order: e.order || []\n };\n return new wv(n, i, t).cylinderLayout();\n}\nfunction Nk(n, e) {\n let t = n[0], i = n.slice(1), r = [];\n return t === \".\" ? (r = e.getNodes().filter((s) => s.name == i), new Jt(r, e)) : t === \"#\" ? (r = e.getNodes().filter((s) => s.id == i), new Jt(r, e)) : t === \"$\" ? (r = e.getNodes().filter((s) => pr.MatchesQuery(s, i) == !0), new Jt(r, e)) : new Jt([], e);\n}\nfunction Fk(n, e) {\n let t = [];\n return Array.isArray(n) ? n.forEach((i, r) => t = [...t, ...e.getNodes().filter((s) => s.name == i)]) : t = e.getNodes().filter((i) => i.name == n), new Jt(t, e);\n}\nfunction Lk(n, e) {\n let t = [];\n return Array.isArray(n) ? n.forEach((i, r) => t = [...t, ...e.getNodes().filter((s) => s.name == i)]) : t = e.getNodes().filter((i) => i.id == n), new Jt(t, e);\n}\nfunction wk(n, e) {\n let t = [];\n return Array.isArray(n) ? n.forEach(\n (i, r) => t = [...t, ...e.getNodes().filter((s) => pr.MatchesQuery(s, i) == !0)]\n ) : t = e.getNodes().filter((i) => pr.MatchesQuery(i, n) == !0), new Jt(t, e);\n}\nfunction Uk(n, e, t) {\n let i = [];\n return Array.isArray(n) && Array.isArray(e) ? n.forEach(\n (r, s) => i = [\n ...i,\n ...t.getNodes().filter((a) => a.metadata != null).filter((a) => a.metadata.data[r] == e[s])\n ]\n ) : i = t.getNodes().filter((r) => r.metadata != null).filter((r) => r.metadata.data.key == e), new Jt(i, t);\n}\nfunction Vk(n, e, t = [{}], i) {\n let r = [];\n return t.forEach((s, a) => {\n var o = zo(n, n, e, s, i);\n r.push(o);\n }), new Jt(r, r[0].getScene());\n}\nexport {\n L2 as Axis,\n wv as Layout,\n Ek as MeshMap,\n Tk as OrdinalChromatic,\n IS as PlaneText,\n Jt as Selection,\n xk as SequentialChromatic,\n Y3 as TextureGlobe,\n $V as TextureMap,\n Vk as bind,\n zo as create,\n Sk as createAxes,\n Ak as createMeshMap,\n bS as createPlaneText,\n Ik as createTextureGlobe,\n bk as createTextureMap,\n Dk as cylinderLayout,\n Mk as ordinalChromatic,\n Ok as planeLayout,\n Lv as schemes,\n Nk as select,\n Uk as selectData,\n Lk as selectId,\n Fk as selectName,\n wk as selectTag,\n Pk as sequentialChromatic\n};\n"], - "mappings": "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ACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,I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C,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE;AACvW,WAAO,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IA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;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD;AAAA,IACA;AAAA;AAAA,EAEF,GAAG,IAAI;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG,IAAI;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAEF,GAAG,IAAI;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAEF,GAAG,IAAI,MAAM,MAAM,IAAI,MAAM,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,MAAM,MAAM,IAAI,KAAK,MAAM,IAAI;AAAA,IAClG;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAEF,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAChC,MAAI,IAAI;AACR,QAAM,IAAI,IAAI,MAAM,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AACvC,MAAI;AACJ,OAAK,IAAI,GAAG,IAAI,GAAG;AACjB,MAAE,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC,IAAI,GAAG,KAAK;AAClC,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,SAAK,IAAI,GAAG,IAAI,GAAG,KAAK;AACtB,YAAM,IAAI,EAAE,IAAI,IAAI,CAAC;AACrB,QAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,GAAG,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC;AAAA,IACxK;AACA,UAAM,IAAI,CAAC,GAAG,GAAG,IAAI,OAAO;AAC1B,YAAM,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,GAAG,KAAK,IAAI,EAAE;AACjH,QAAE,UAAU;AACZ,UAAI;AACJ,UAAI,GAAG;AACL,cAAM,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;AACrE,YAAI,EAAE,KAAK,IAAI,IAAI,MAAM,IAAI,GAAG;AAAA,MAClC;AACE,YAAI,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACzB,QAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,UAAU;AAC1C,YAAM,KAAK,GAAG,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,MAAM,IAAI,EAAE,CAAC,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI,EAAE;AACzH,QAAE,KAAK,EAAE,IAAI,GAAG,EAAE,IAAI,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,GAAG,GAAG,4BAA4B,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG;AAAA,IACrI;AACA,aAAS,IAAI,GAAG,IAAI,GAAG;AACrB,eAAS,IAAI,GAAG,IAAI,IAAI,GAAG;AACzB,UAAE,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,MAAM,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC;AAAA,EACvO;AACA,KAAG,cAAc,GAAG,GAAG,GAAG,GAAG,GAAGA,GAAE,UAAUA,GAAE,OAAO;AACrD,QAAM,IAAI,IAAI,GAAG;AACjB,SAAO,EAAE,UAAU,GAAG,EAAE,YAAY,GAAG,EAAE,UAAU,GAAG,EAAE,MAAM,GAAG;AACnE;AACA,SAAS,GAAGA,IAAG,IAAI,CAAC,GAAG,IAAI,MAAM;AAC/B,QAAM,IAAI,IAAI,EAAEA,IAAG,CAAC;AACpB,SAAO,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,eAAe,GAAG,EAAE,kCAAkC,EAAE,iBAAiB,GAAG,CAAC,EAAE,YAAY,GAAG,EAAE,SAAS,GAAG;AACxK;AACA,GAAG,kBAAkB;AACrB,EAAE,kBAAkB,CAACA,IAAG,GAAG,MAAM,GAAGA,IAAG,GAAG,CAAC;AAC3C,IAAM,KAAK,IAAI,EAAE,GAAG,GAAG,CAAC;AAAxB,IAA2B,KAAK,IAAI,EAAE,IAAI,GAAG,CAAC;AAA9C,IAAiD,KAAK,IAAI,EAAE,GAAG,GAAG,CAAC;AAAnE,IAAsE,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC;AAAzF,IAA4F,KAAK,IAAI,EAAE,GAAG,GAAG,CAAC;AAA9G,IAAiH,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE;AACpI,IAAM,KAAN,MAAM,IAAG;AAAA,EACP,YAAY,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM;AACzG,SAAK,WAAW,GAAG,KAAK,SAAS,GAAG,KAAK,KAAK,GAAG,KAAK,YAAY,GAAG,KAAK,oBAAoB,GAAG,KAAK,wBAAwB,GAAG,KAAK,sBAAsB,GAAG,KAAK,wBAAwB,GAAG,KAAK,wBAAwB;AAAA,EAC9N;AAAA,EACA,QAAQ;AACN,QAAI,GAAG,GAAG,GAAG;AACb,WAAO,IAAI,IAAG,KAAK,SAAS,MAAM,GAAG,KAAK,OAAO,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,WAAW,KAAK,oBAAoB,IAAI,KAAK,0BAA0B,OAAO,SAAS,EAAE,MAAM,IAAI,IAAI,KAAK,wBAAwB,OAAO,SAAS,EAAE,MAAM,IAAI,IAAI,KAAK,0BAA0B,OAAO,SAAS,EAAE,MAAM,IAAI,IAAI,KAAK,0BAA0B,OAAO,SAAS,EAAE,MAAM,CAAC;AAAA,EAC7W;AACF;AACA,SAAS,GAAGA,IAAG,GAAG,GAAG;AACnB,MAAI,IAAI,IAAI,GAAG;AACf,QAAM,IAAI,CAAC,CAAC,EAAE,UAAU,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE,oCAAoC,QAAQ,EAAE,oCAAoC,QAAQ,IAAI,EAAE,WAAW,GAAG,IAAI,IAAI,EAAE,gBAAgB,MAAI,IAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,GAAG,IAAI,IAAI,EAAE,eAAe,MAAI,IAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,GAAG,IAAI,IAAI,IAAI,EAAE,gBAAgB,EAAE,YAAY,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,EAAE,gBAAgB,EAAE,UAAU,IAAI,IAAI,MAAM,IAAI,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI,IAAI,EAAE,gBAAgB,EAAE,mBAAmB,IAAI,MAAM,IAAI,IAAI,EAAE,gBAAgB,EAAE,mBAAmB,IAAI,MAAM,IAAI,IAAI,EAAE,gBAAgB,EAAE,wBAAwB,IAAI,MAAM,IAAI,IAAI,EAAE,gBAAgB,EAAE,wBAAwB,IAAI,MAAM,IAAI,EAAE,YAAY,EAAE,KAAK;AACvsB,MAAI,IAAI,EAAE,UAAU,EAAE,GAAG;AACzB,QAAM,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,SAAS;AAC5C,MAAI,CAAC,GAAG;AACN,UAAM,IAAI,IAAI,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,SAAS,EAAE,cAAc,KAAK,EAAE,qBAAqB,GAAG,EAAE,eAAe,CAAC;AAC1G,QAAI,EAAE,eAAe,SAAS,EAAE;AAAA,EAClC;AACA,QAAM,IAAI,CAAC,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,GAAG;AACxH,IAAE,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,kBAAkB,IAAI,CAAC,IAAI,MAAM,EAAE,kBAAkB,IAAI,CAAC,IAAI,MAAM,EAAE,uBAAuB,IAAI,CAAC,IAAI,MAAM,EAAE,uBAAuB,IAAI,CAAC,IAAI;AAC9M,MAAI,IAAI;AACR,QAAM,IAAI,CAAC,GAAG,MAAM;AAClB,UAAM,KAAK,IAAI,GAAG;AAClB,QAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACf,aAAO;AACT,UAAM,KAAK,EAAE,CAAC;AACd,QAAI,GAAG,YAAY,KAAK,GAAG,GAAG,oBAAoB,KAAK,GAAG,GAAG,WAAW,IAAI,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,EAAE,0BAA0B,GAAG,UAAU,GAAG,GAAG,QAAQ,GAAG,GAAG,SAAS,IAAI,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,EAAE,qBAAqB,GAAG,QAAQ,GAAG,GAAG,MAAM,GAAG,EAAE,cAAc,GAAG;AAChT,YAAM,KAAK,EAAE,KAAK,IAAI,CAAC;AACvB,SAAG,KAAK,IAAI,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,4BAA4B,IAAI,KAAK,EAAE;AAAA,IACtE;AACA,WAAO;AAAA,EACT,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM;AACjC,QAAI,EAAE,WAAW;AACf,aAAO;AACT,UAAM,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,OAAO;AAC/D,eAAS,KAAK,GAAG,KAAK,IAAI,EAAE;AAC1B,YAAI,GAAG,KAAK,EAAE,MAAM;AAClB,iBAAO,KAAK;AAChB,aAAO;AAAA,IACT,GAAG,KAAK,CAAC,IAAI,OAAO;AAClB,YAAM,KAAK,EAAE,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,EAAE;AAC1D,UAAI,KAAK,GAAG,KAAK;AACjB,UAAI,KAAK,GAAG;AACV,cAAM,KAAK,GAAG,wBAAwB,IAAI,GAAG,mBAAmB,KAAK,GAAG,yBAAyB,GAAG,KAAK,GAAG,yBAAyB,GAAG,KAAK,GAAG,wBAAwB,IAAI,GAAG,mBAAmB,KAAK,GAAG,yBAAyB,GAAG,KAAK,GAAG,yBAAyB;AACvQ,aAAK,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;AACnC,YAAI,KAAK;AACT,iBAAS,KAAK,GAAG,KAAK,GAAG,EAAE;AACzB,cAAI,GAAG,KAAK,EAAE,IAAI,GAAG;AACnB,kBAAM,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;AACpC,eAAG,EAAE,IAAI,GAAG,KAAK,EAAE,GAAG,GAAG,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,EAAE,GAAG,MAAM,IAAI,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG;AAAA,UACjF;AACF,iBAAS,KAAK,GAAG,KAAK,KAAK,KAAK,GAAG,EAAE,IAAI;AACvC,gBAAM,KAAK,GAAG,KAAK,EAAE;AACrB,aAAG,IAAI,IAAI,IAAI,CAAC,MAAM,OAAO,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,KAAK,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG;AAAA,QAClF;AACA,cAAM,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AACvC,WAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK;AAAA,MAClD;AACA,YAAM,KAAK,GAAG,wBAAwB,GAAG,sBAAsB,CAAC,KAAK,KAAK,OAAO,SAAS,EAAE,GAAG,SAAS,MAAM,GAAG,KAAK,GAAG,wBAAwB,GAAG,sBAAsB,CAAC,KAAK,KAAK,OAAO,SAAS,EAAE,GAAG,YAAY,CAAC,MAAM,GAAG,KAAK,GAAG,wBAAwB,GAAG,sBAAsB,CAAC,KAAK,KAAK,OAAO,SAAS,EAAE,GAAG,YAAY,CAAC,MAAM,GAAG,KAAK,GAAG,wBAAwB,GAAG,sBAAsB,CAAC,KAAK,KAAK,OAAO,SAAS,EAAE,GAAG,SAAS,MAAM,GAAG,KAAK,GAAG,wBAAwB,GAAG,sBAAsB,CAAC,KAAK,KAAK,OAAO,SAAS,EAAE,GAAG,YAAY,CAAC,MAAM,GAAG,KAAK,GAAG,wBAAwB,GAAG,sBAAsB,CAAC,KAAK,KAAK,OAAO,SAAS,EAAE,GAAG,YAAY,CAAC,MAAM,GAAG,KAAK,GAAG,sBAAsB,GAAG,oBAAoB,CAAC,KAAK,KAAK,OAAO,SAAS,EAAE,GAAG,SAAS,MAAM,GAAG,KAAK,GAAG,sBAAsB,GAAG,oBAAoB,CAAC,KAAK,KAAK,OAAO,SAAS,EAAE,GAAG,YAAY,CAAC,MAAM,GAAG,KAAK,GAAG,sBAAsB,GAAG,oBAAoB,CAAC,KAAK,KAAK,OAAO,SAAS,EAAE,GAAG,YAAY,CAAC,MAAM,GAAG,KAAK,GAAG,sBAAsB,GAAG,oBAAoB,CAAC,KAAK,KAAK,OAAO,SAAS,EAAE,GAAG,SAAS,MAAM,GAAG,KAAK,GAAG,sBAAsB,GAAG,oBAAoB,CAAC,KAAK,KAAK,OAAO,SAAS,EAAE,GAAG,YAAY,CAAC,MAAM,GAAG,KAAK,GAAG,sBAAsB,GAAG,oBAAoB,CAAC,KAAK,KAAK,OAAO,SAAS,EAAE,GAAG,YAAY,CAAC,MAAM,GAAG,KAAK,MAAM,KAAK,MAAM,IAAI,KAAK,MAAM,KAAK,MAAM,IAAI,KAAK,MAAM,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAC14C,aAAO,IAAI,GAAG,EAAE,KAAK,GAAG,UAAU,GAAG,UAAU,EAAE,GAAG,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,EAAE,EAAE,UAAU,GAAG,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI;AAAA,QACvI,MAAM,KAAK,MAAM;AAAA,QACjB,MAAM,KAAK,MAAM;AAAA,QACjB,MAAM,KAAK,MAAM;AAAA,MACnB,IAAI,MAAM,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE,IAAI,MAAM,IAAI,EAAE;AAAA,IAC1D;AACA,QAAI,KAAK;AACT,MAAE,SAAS,MAAM,KAAK,CAAC;AACvB,aAAS,KAAK,GAAG,KAAK,EAAE,QAAQ,MAAM,GAAG;AACvC,UAAI,KAAK,GAAG,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAClD,YAAM,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,IAAI,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,IAAI,IAAI,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK;AAC9J,cAAQ,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI;AAAA,QAC3D,KAAK;AACH,YAAE,SAAS,KAAK,GAAG,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK;AAC/E;AAAA,QACF,KAAK;AACH,cAAI,KAAK,MAAM,IAAI,MAAM,GAAG,OAAO,KAAK,EAAE,KAAK,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,IAAI;AAC9G,iBAAK,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,KAAK,EAAE;AACvL;AAAA,UACF;AACA,iBAAO,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,MAAM,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC;AACxN;AAAA,QACF,KAAK;AACH,eAAK,MAAM,IAAI,MAAM,GAAG,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,IAAI,OAAO,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,IAAI,OAAO,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE;AAC7W;AAAA,MACJ;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,IAAI,aAAa,IAAI,IAAI,MAAM,IAAI,KAAK,OAAO,SAAS,EAAE,yBAAyB,YAAY,KAAK,KAAK,OAAO,SAAS,EAAE,sBAAsB,GAAG,IAAI,EAAE,OAAO,CAAC;AACrK,IAAE,SAAS,EAAE,gBAAgB;AAC7B,WAAS,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG;AAC1B,QAAI,KAAK,QAAQ,EAAE,oBAAoB,GAAG;AACxC,YAAM,KAAK,IAAI;AACf,QAAE,iBAAiB,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,iBAAiB,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,iBAAiB,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,iBAAiB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AAAA,IACjR;AACA,UAAM,IAAI,EAAE,qBAAqB,GAAG,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,GAAG,KAAK,EAAE,eAAe,GAAG,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,IAAI,MAAM,CAAC;AAC/K,aAAS,KAAK,GAAG,KAAK,EAAE,QAAQ,MAAM,GAAG;AACvC,UAAI,KAAK;AACT,UAAI,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AAC7W,iBAAS,KAAK,GAAG,KAAK,GAAG,QAAQ,MAAM;AACrC,gBAAM,KAAK,GAAG,EAAE;AAChB,cAAI,EAAE,QAAQ,KAAK,CAAC,GAAG,KAAK,GAAG,yBAAyB,EAAE,UAAU,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC,GAAG,EAAE,UAAU,IAAI,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC,GAAG,EAAE,UAAU,IAAI,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC,KAAK,MAAM,EAAE,UAAU,IAAI,CAAC,IAAI,EAAE,GAAG,SAAS,GAAG,EAAE,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,IAAI,GAAG,uBAAuB,EAAE,QAAQ,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC,GAAG,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC,GAAG,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC,KAAK,MAAM,EAAE,QAAQ,IAAI,CAAC,IAAI,EAAE,GAAG,SAAS,GAAG,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,OAAO,GAAG,SAAS,QAAQ,EAAE,WAAW,IAAI,CAAC,GAAG,GAAG,OAAO,QAAQ,EAAE,SAAS,IAAI,CAAC,IAAI,EAAE,mBAAmB,EAAE,oBAAoB,GAAG,yBAAyB,EAAE,gBAAgB,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,IAAI,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,IAAI,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,IAAI,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC,MAAM,MAAM,EAAE,gBAAgB,IAAI,CAAC,IAAI,EAAE,GAAG,iBAAiB,GAAG,EAAE,gBAAgB,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,oBAAoB,CAAC,IAAI,KAAK,EAAE,yBAAyB,EAAE,qBAAqB,IAAI,CAAC,IAAI,EAAE,GAAG,iBAAiB,GAAG,EAAE,qBAAqB,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,qBAAqB,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,qBAAqB,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,oBAAoB,CAAC,KAAK,GAAG,yBAAyB,EAAE,gBAAgB,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,IAAI,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,IAAI,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,IAAI,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC,MAAM,MAAM,EAAE,gBAAgB,IAAI,CAAC,IAAI,EAAE,GAAG,iBAAiB,GAAG,EAAE,gBAAgB,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,oBAAoB,CAAC,IAAI,KAAK,EAAE,yBAAyB,EAAE,qBAAqB,IAAI,CAAC,IAAI,EAAE,GAAG,iBAAiB,GAAG,EAAE,qBAAqB,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,qBAAqB,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,qBAAqB,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,oBAAoB,CAAC,MAAM,EAAE;AACh0E,eAAG,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC;AAAA,eACvB;AACH,cAAE,IAAI,KAAK,MAAM,GAAG,SAAS,IAAI,EAAE,CAAC;AACpC,kBAAM,KAAK,MAAM,GAAG,SAAS,IAAI,EAAE;AACnC,cAAE,IAAI,KAAK,GAAG,4BAA4B,IAAI,KAAK,EAAE;AAAA,UACvD;AACA;AAAA,QACF;AAAA,IACJ;AAAA,EACF;AACA,IAAE,QAAQ,WAAW,MAAM,EAAE,UAAU,OAAO,EAAE,UAAU,WAAW,MAAM,EAAE,YAAY,OAAO,EAAE,QAAQ,WAAW,MAAM,EAAE,UAAU,OAAO,EAAE,IAAI,WAAW,MAAM,EAAE,MAAM,SAAS,KAAK,EAAE,oBAAoB,OAAO,SAAS,GAAG,YAAY,MAAM,EAAE,kBAAkB,SAAS,KAAK,EAAE,oBAAoB,OAAO,SAAS,GAAG,YAAY,MAAM,EAAE,kBAAkB,SAAS,IAAI,EAAE,yBAAyB,OAAO,SAAS,EAAE,YAAY,MAAM,EAAE,uBAAuB,SAAS,IAAI,EAAE,yBAAyB,OAAO,SAAS,EAAE,YAAY,MAAM,EAAE,uBAAuB;AACjjB,QAAM,IAAI,IAAI,EAAEA,IAAG,EAAE,SAAS,CAAC;AAC/B,SAAO,EAAE,YAAY,CAAC,GAAG,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,EAAE,WAAW,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,mBAAmB,IAAE,GAAG,EAAE,oBAAoB,MAAI,IAAE,GAAG;AACzL;AACA,EAAE,cAAc,CAACA,IAAG,GAAG,GAAG,GAAG,GAAG,MAAM,GAAGA,IAAG,GAAG;AAAA,EAC7C,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AACT,CAAC;AACD,SAAS,GAAGA,KAAI;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,iBAAiB;AACnB,GAAG;AACD,QAAM,IAAI,KAAK,IAAIA,GAAE,eAAeA,GAAE,eAAe,GAAG,CAAC,IAAI,GAAG,IAAI,KAAK,IAAIA,GAAE,eAAeA,GAAE,eAAe,IAAI,CAAC,IAAI,GAAG,IAAI,KAAK,IAAIA,GAAE,SAASA,GAAE,SAAS,GAAG,CAAC,GAAG,IAAI,KAAK,IAAIA,GAAE,SAASA,GAAE,SAAS,MAAM,CAAC,GAAG,IAAI,KAAK,IAAIA,GAAE,kBAAkBA,GAAE,kBAAkB,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,IAAIA,GAAE,YAAYA,GAAE,YAAY,GAAG,CAAC,GAAG,IAAI,KAAK,IAAIA,GAAE,eAAeA,GAAE,eAAe,GAAG,CAAC,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAIA,GAAE,qBAAqBA,GAAE,qBAAqB,GAAG,CAAC,GAAG,IAAI,KAAK,IAAIA,GAAE,wBAAwBA,GAAE,wBAAwB,GAAG,CAAC,GAAG,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC;AACllB,MAAI,IAAI,CAAC;AACT,QAAM,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAC3B,MAAI,IAAI;AACR,QAAM,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK;AACzC,MAAI,GAAG;AACP,QAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,SAAS,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI;AACxK,MAAI,IAAI;AACR,OAAK,IAAI,GAAG,KAAK,GAAG,KAAK;AACvB,UAAM,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI;AAC/B,SAAK,IAAI,IAAI;AACb,UAAM,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI;AAClD,SAAK,IAAI,GAAG,KAAK,GAAG,KAAK;AACvB,YAAM,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,EAAE,GAAG,KAAK,KAAK,IAAI,EAAE;AACtE,QAAE,IAAI,KAAK,IAAI,EAAE,IAAI,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,IAAI,GAAG,4BAA4B,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG;AAAA,IACpM;AACA,MAAE,KAAK,CAAC;AAAA,EACV;AACA,QAAM,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,KAAK;AACzD,OAAK,IAAI,GAAG,KAAK,GAAG,KAAK;AACvB,UAAM,IAAI,CAAC;AACX,SAAK,IAAI;AACT,UAAM,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI;AACjC,SAAK,IAAI,GAAG,KAAK,GAAG,KAAK;AACvB,YAAM,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,EAAE,GAAG,KAAK,KAAK,IAAI,EAAE;AACpE,QAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,EAAE,UAAU,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,GAAG,4BAA4B,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG;AAAA,IACjN;AACA,MAAE,KAAK,CAAC;AAAA,EACV;AACA,OAAK,IAAI,GAAG,KAAK,GAAG,KAAK;AACvB,UAAM,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,KAAK,KAAK,MAAM,IAAI;AAC/C,SAAK,IAAI,IAAI;AACb,UAAM,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI;AAClD,SAAK,IAAI,GAAG,KAAK,GAAG,KAAK;AACvB,YAAM,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,EAAE,GAAG,KAAK,KAAK,IAAI,EAAE;AACtE,QAAE,IAAI,KAAK,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,IAAI,GAAG,4BAA4B,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG;AAAA,IACrM;AACA,MAAE,KAAK,CAAC;AAAA,EACV;AACA,OAAK,IAAI,GAAG,IAAI,GAAG;AACjB,SAAK,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK;AAC9B,YAAM,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC;AACxE,QAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE;AAAA,IACnE;AACF,MAAI,IAAI,EAAE,QAAQ,GAAGA,GAAE,eAAe,CAACA,GAAE,YAAY,OAAO,EAAE,GAAG,CAAC,GAAG;AACnE,UAAM,IAAI,IAAI,EAAE;AAChB,IAAAA,GAAE,YAAY,MAAM,EAAE,MAAM,KAAK,KAAK,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,aAAa,EAAE,iBAAiB,CAAC;AAC1F,UAAM,IAAI,EAAE,KAAK;AACjB,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,0BAA0B,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE;AAAA,EAC5H;AACA,QAAM,IAAI,IAAI,GAAG;AACjB,SAAO,EAAE,YAAY,GAAG,EAAE,UAAU,GAAG,EAAE,MAAM,GAAG,EAAE,UAAU,GAAG;AACnE;AACA,SAAS,GAAGA,IAAG,IAAI;AAAA,EACjB,aAAa,EAAE,GAAG;AAAA,EAClB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,WAAW;AACb,GAAG,IAAI,MAAM;AACX,QAAM,IAAI,IAAI,EAAEA,IAAG,CAAC;AACpB,SAAO,GAAG,CAAC,EAAE,YAAY,GAAG,EAAE,SAAS,GAAG;AAC5C;AACA,EAAE,gBAAgB,CAACA,IAAG,GAAG,MAAM,GAAGA,IAAG,GAAG,CAAC;AACzC,GAAG,gBAAgB;AACnB,IAAM,KAAN,MAAS;AAAA;AAAA;AAAA;AAAA,EAIP,YAAY,GAAG;AACb,SAAK,SAAS,CAAC,GAAG,KAAK,aAAa,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,KAAK,cAAc;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAG,GAAG;AACX,SAAK,eAAe,IAAI,GAAG,GAAG,CAAC,GAAG,KAAK,WAAW,KAAK,KAAK,YAAY;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAG,GAAG;AACX,SAAK,aAAa,UAAU,GAAG,CAAC;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,GAAG,GAAG,GAAG,GAAG;AAC3B,SAAK,aAAa,oBAAoB,GAAG,GAAG,GAAG,GAAG,KAAK,WAAW;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAc,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC9B,SAAK,aAAa,iBAAiB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,WAAW;AAAA,EACvE;AAAA;AAAA,EAEA,eAAe;AACb,eAAW,KAAK,KAAK;AACnB,QAAE,KAAK,IAAI,IAAI,KAAK,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO,KAAK,CAAC;AACzD,QAAI,CAAC,KAAK,OAAO,UAAU,KAAK,OAAO,QAAQ;AAC7C,YAAM,IAAI,KAAK;AACf,WAAK,SAAS,KAAK,QAAQ,KAAK,SAAS;AAAA,IAC3C;AACA,SAAK,WAAW,SAAS;AAAA,EAC3B;AAAA;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AACF;AACA,SAAS,GAAGA,IAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC5B,QAAM,IAAI,EAAE,OAAOA,EAAC,KAAK,EAAE,OAAO,GAAG;AACrC,MAAI,CAAC;AACH,WAAO;AACT,QAAM,IAAI,IAAI,GAAG,CAAC;AAClB,MAAI,EAAE,GAAG;AACP,UAAM,IAAI,EAAE,EAAE,MAAM,GAAG;AACvB,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAI;AAChC,cAAQ,EAAE,GAAG,GAAG;AAAA,QACd,KAAK,KAAK;AACR,gBAAM,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI;AAC/D,YAAE,OAAO,GAAG,CAAC;AACb;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,gBAAM,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI;AAC/D,YAAE,OAAO,GAAG,CAAC;AACb;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,gBAAM,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI;AAC3H,YAAE,iBAAiB,GAAG,GAAG,GAAG,CAAC;AAC7B;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,gBAAM,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI;AACvL,YAAE,cAAc,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AAAA,EACJ;AACA,SAAO,EAAE,aAAa,GAAG,EAAE,SAAS,EAAE,KAAK,GAAG,WAAW,EAAE;AAC7D;AACA,SAAS,GAAGA,IAAG,GAAG,GAAG,GAAG;AACtB,QAAM,IAAI,MAAM,KAAKA,EAAC,GAAG,IAAI,IAAI,EAAE,YAAY,KAAK,EAAE,YAAY,OAAO,EAAE,YAAY,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAAC;AAC9H,MAAI,IAAI,GAAG,IAAI;AACf,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,UAAM,IAAI,EAAE,CAAC;AACb,QAAI,MAAM;AAAA;AAER,UAAI,GAAG,KAAK;AAAA,SACT;AACH,YAAM,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC7B,YAAM,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS;AAAA,IAC1C;AAAA,EACF;AACA,SAAO;AACT;AACA,IAAM,KAAN,MAAS;AAAA;AAAA;AAAA;AAAA,EAIP,cAAc;AACZ,SAAK,UAAU,OAAI,KAAK,uBAAuB,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,GAAG;AACT,SAAK,qBAAqB,KAAK,CAAC;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAIA,cAAc;AACZ,UAAM,IAAI,KAAK,qBAAqB,IAAI;AACxC,SAAK,KAAK,UAAU,MAAI,KAAK,kBAAkB,CAAC,KAAK,KAAK,UAAU;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,GAAG;AACnB,QAAI,EAAE;AACJ,QAAE,SAAS,QAAQ,CAAC,MAAM;AACxB,aAAK,eAAe,CAAC,EAAE,SAAS,GAAG,CAAC,MAAM;AACxC,YAAE,aAAa,UAAU,EAAE,KAAK,YAAY,EAAE,UAAU,CAAC,GAAG,EAAE,YAAY,MAAI,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,SAAS,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,GAAG,KAAK,YAAY;AAAA,QACtM,CAAC;AAAA,MACH,CAAC;AAAA,SACE;AACH,YAAM,IAAI,KAAK,eAAe,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM;AAC9C,UAAE,SAAS,GAAG,CAAC,MAAM;AACnB,YAAE,aAAa,UAAU,EAAE,KAAK,YAAY,EAAE,UAAU,CAAC,GAAG,EAAE,YAAY,MAAI,EAAE;AAAA,QAClF,CAAC;AAAA,MACH;AACA,SAAG,IAAI,EAAE,SAAS,QAAQ,CAAC,MAAM;AAC/B,UAAE,EAAE,SAAS,EAAE,KAAK,GAAG,MAAM;AAC3B,YAAE,YAAY;AAAA,QAChB,CAAC;AAAA,MACH,GAAG,MAAM;AACP,UAAE,mBAAmB,EAAE,gBAAgB,GAAG,KAAK,YAAY;AAAA,MAC7D,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,eAAe,GAAG;AAChB,YAAQ,EAAE,oBAAoB;AAAA,MAC5B,KAAK,GAAG;AAAA,MACR;AACE,eAAO,IAAI,GAAG,EAAE,IAAI;AAAA,IACxB;AAAA,EACF;AACF;AACA,IAAI;AAAA,CACH,SAASA,IAAG;AACX,EAAAA,GAAEA,GAAE,YAAY,CAAC,IAAI;AACvB,GAAG,OAAO,KAAK,CAAC,EAAE;AAClB,IAAM,KAAN,MAAS;AAAA,EACP,YAAY,GAAG;AACb,SAAK,YAAY,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,KAAK,UAAU,OAAI,KAAK,UAAU,OAAI,KAAK,gBAAgB,OAAI,KAAK,eAAe;AAAA,EACpI;AACF;AACA,IAAM,KAAN,MAAS;AAAA,EACP,YAAY,GAAG,GAAG;AAChB,SAAK,WAAW,GAAG,KAAK,KAAK,GAAG,KAAK,WAAW,MAAI,KAAK,IAAI,IAAI,GAAG,GAAG,KAAK,gBAAgB,GAAG,KAAK,gBAAgB,GAAG,KAAK,kBAAkB,CAAC;AAAA,EACjJ;AAAA,EACA,eAAe,GAAG;AAChB,SAAK,SAAS,SAAS,CAAC;AAAA,EAC1B;AACF;AACA,IAAM,KAAN,MAAM,IAAG;AAAA,EACP,YAAY,GAAG;AACb,SAAK,OAAO,IAAI,MAAM,EAAE;AACxB,aAAS,IAAI,GAAG,IAAI,IAAI,EAAE;AACxB,WAAK,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;AAAA,EACrD;AAAA,EACA,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC7B,WAAO,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;AAAA,EACnR;AAAA,EACA,WAAW,GAAG;AACZ,aAAS,IAAI,GAAG,IAAI,IAAI,EAAE;AACxB,WAAK,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;AAAA,EAC5B;AAAA,EACA,gBAAgB,GAAG;AACjB,aAAS,IAAI,GAAG,IAAI,IAAI,EAAE;AACxB,WAAK,KAAK,CAAC,KAAK,EAAE,CAAC;AAAA,EACvB;AAAA,EACA,IAAI,GAAG;AACL,UAAM,IAAI,IAAI,IAAG;AACjB,aAAS,IAAI,GAAG,IAAI,IAAI,EAAE;AACxB,QAAE,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;AACrC,WAAO;AAAA,EACT;AAAA,EACA,OAAO,SAAS,GAAG,GAAG,GAAG,GAAG;AAC1B,WAAO,IAAI,IAAG,IAAG,gBAAgB,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,EAC9C;AAAA;AAAA,EAEA,OAAO,gBAAgB,GAAG,GAAG,GAAG,GAAG;AACjC,WAAO,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAAA,EAC9E;AACF;AACA,IAAM,KAAN,MAAS;AAAA,EACP,YAAY,GAAG,GAAG;AAChB,SAAK,WAAW,GAAG,KAAK,aAAa;AAAA,EACvC;AACF;AACA,IAAM,KAAN,MAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKP,YAAY,GAAG;AACb,SAAK,QAAQ,GAAG,KAAK,iBAAiB,KAAK,KAAK,iBAAiB,GAAG,KAAK,uBAAuB,KAAK,KAAK,qBAAqB;AAAA,EACjI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,GAAG,GAAG;AACb,SAAK,mBAAmB,GAAG,GAAG,IAAI,KAAK,MAAM,UAAU,QAAQ,CAAC,MAAM;AACpE,WAAK,cAAc,EAAE,OAAO,MAAM;AAChC,aAAK,eAAe,GAAG,EAAE,OAAO,MAAM;AACpC,YAAE,YAAY;AAAA,QAChB,CAAC;AAAA,MACH,GAAG,EAAE,YAAY;AAAA,IACnB,GAAG,MAAM;AACP,iBAAW,MAAM;AACf,UAAE,KAAK,kBAAkB;AAAA,MAC3B,GAAG,CAAC;AAAA,IACN,CAAC;AAAA,EACH;AAAA,EACA,eAAe,GAAG,GAAG,GAAG;AACtB,UAAM,IAAI,CAAC,EAAE,KAAK,WAAW,SAAS,EAAE;AACxC,QAAI,IAAI;AACR,UAAM,IAAI,KAAK,WAAW,QAAQ,IAAI,CAAC,GAAG,MAAM;AAC9C,iBAAW,MAAM;AACf,YAAI,MAAM,KAAK,KAAK,YAAY,MAAM,CAAC;AACvC,iBAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,EAAE;AAC5C,eAAK,WAAW,CAAC,EAAE,UAAU;AAC/B,cAAM,IAAI,OAAO,KAAK,IAAI,IAAI,GAAG,KAAK,cAAc,GAAG,IAAI,CAAC,MAAM;AAChE,gBAAM,IAAI,CAAC,GAAG,KAAK,WAAW,SAAS,IAAI,KAAK,KAAK,WAAW,SAAS,IAAI,KAAK,WAAW,CAAC;AAC9F,cAAI,KAAK,EAAE,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,WAAW,EAAE,UAAU;AACpD,qBAAS,IAAI,GAAG,IAAI,GAAG,EAAE;AACvB,kBAAI,EAAE,MAAM,CAAC,IAAI,GAAG;AAClB,sBAAM,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,GAAG,IAAI,EAAE,WAAW,IAAI,KAAK,CAAC;AACrE,oBAAI,EAAE,YAAY,EAAE;AAClB;AACF,sBAAM,IAAI,EAAE,KAAK;AACjB,qBAAK,gBAAgB,GAAG,GAAG,CAAC;AAC5B,sBAAM,IAAI,CAAC;AACX,oBAAI,KAAK,WAAW,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,KAAK,WAAW,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,QAAQ,IAAE,IAAI,KAAK,EAAE,QAAQ,IAAE,IAAI;AAC3G;AACF,sBAAM,IAAI,CAAC;AACX,oBAAI,EAAE,QAAQ,CAAC,MAAM;AACnB,oBAAE,QAAQ,CAAC,MAAM,OAAO,EAAE,gBAAgB,MAAI,EAAE,KAAK,CAAC;AAAA,gBACxD,CAAC,GAAG,EAAE,SAAS,MAAM;AACnB;AACF,kBAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,eAAe,CAAC;AACtC,sBAAM,IAAI,KAAK,YAAY;AAC3B,oBAAI,KAAK,iBAAiB,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,KAAK,iBAAiB,GAAG,GAAG,GAAG,CAAC;AAC3E,sBAAM,IAAI,KAAK,YAAY,SAAS;AACpC,oBAAI,KAAK,EAAE,eAAe;AACxB,sBAAI;AACF,6BAAS,IAAI,GAAG,IAAI,GAAG;AACrB,2BAAK,YAAY,EAAE,gBAAgB,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC;AAAA,gBACpE;AACE,oBAAE,gBAAgB;AACpB,kBAAE,gBAAgB;AAClB;AAAA,cACF;AAAA,UACJ;AAAA,QACF;AACA,WAAG,iBAAiB,KAAK,WAAW,QAAQ,KAAK,gBAAgB,GAAG,GAAG,MAAM,IAAI,KAAK,CAAC;AAAA,MACzF,GAAG,CAAC;AAAA,IACN;AACA,OAAG,IAAI,KAAK,sBAAsB,CAAC,MAAM;AACvC,UAAI,KAAK,IAAI,EAAE,UAAU,IAAI,EAAE,EAAE,OAAO,MAAM;AAC5C,UAAE,YAAY;AAAA,MAChB,CAAC;AAAA,IACH,GAAG,MAAM;AACP,iBAAW,MAAM;AACf,aAAK,iBAAiB,CAAC,GAAG,EAAE;AAAA,MAC9B,GAAG,CAAC;AAAA,IACN,CAAC;AAAA,EACH;AAAA,EACA,cAAc,GAAG,GAAG,GAAG;AACrB,SAAK,YAAY,CAAC,GAAG,KAAK,aAAa,CAAC;AACxC,UAAM,IAAI,KAAK,MAAM,gBAAgB,EAAE,YAAY,GAAG,IAAI,KAAK,MAAM,WAAW,GAAG,IAAI,KAAK,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM;AACzH,UAAI,GAAG;AACL,iBAAS,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,EAAE;AAC3C,cAAI,KAAK,UAAU,CAAC,EAAE,SAAS,kBAAkB,GAAG,IAAI;AACtD,mBAAO,KAAK,UAAU,CAAC;AAAA,MAC7B;AACA,aAAO;AAAA,IACT,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;AACpB,UAAI,CAAC;AACH;AACF,YAAM,IAAI,IAAI,EAAE,eAAe,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,GAAG,KAAK,UAAU,MAAM;AACrG,QAAE,gBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,KAAK,UAAU,UAAU,KAAK,UAAU,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;AAAA,IAClG,GAAG,IAAI,EAAE;AACT,OAAG,iBAAiB,GAAG,KAAK,iBAAiB,KAAK,GAAG,GAAG,MAAM;AAC5D,YAAM,IAAI,CAAC,MAAM;AACf,YAAI,CAAC;AACH;AACF,cAAM,KAAK,EAAE,aAAa,IAAI,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,KAAK,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,GAAG,IAAI,KAAK,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,GAAG,IAAI,KAAK,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AACxO,UAAE,iBAAiB,GAAG,KAAK,WAAW,KAAK,CAAC;AAAA,MAC9C;AACA,SAAG,iBAAiB,EAAE,aAAa,GAAG,KAAK,gBAAgB,GAAG,MAAM;AAClE,aAAK,MAAM,CAAC;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EACA,MAAM,GAAG;AACP,UAAM,IAAI,CAAC,MAAM;AACf,YAAM,IAAI,KAAK,WAAW,CAAC;AAC3B,QAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,UAAU,CAAC,EAAE,QAAQ,GAAG,EAAE,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,EAAE,UAAU;AACnJ,eAAS,IAAI,GAAG,IAAI,GAAG;AACrB,UAAE,UAAU,CAAC,EAAE,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACtI;AACA,OAAG,iBAAiB,KAAK,WAAW,QAAQ,KAAK,gBAAgB,GAAG,MAAM;AACxE,YAAM,IAAI,CAAC,MAAM;AACf,cAAM,IAAI,KAAK,WAAW,CAAC;AAC3B,iBAAS,IAAI,GAAG,IAAI,GAAG,EAAE;AACvB,YAAE,MAAM,CAAC,IAAI,KAAK,gBAAgB,EAAE,UAAU,CAAC,GAAG,EAAE,WAAW,IAAI,KAAK,CAAC,CAAC;AAC5E,UAAE,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAAA,MAC1D;AACA,SAAG,iBAAiB,KAAK,WAAW,QAAQ,KAAK,gBAAgB,GAAG,MAAM;AACxE,UAAE;AAAA,MACJ,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EACA,iBAAiB,GAAG;AAClB,UAAM,IAAI,CAAC;AACX,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,EAAE;AACvC,WAAK,UAAU,CAAC,EAAE,gBAAgB;AACpC,QAAI,GAAG;AACP,SAAK,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,EAAE;AACxC,UAAI,CAAC,KAAK,WAAW,CAAC,EAAE,SAAS;AAC/B,aAAK,IAAI,KAAK,WAAW,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE;AAC3C,YAAE,UAAU,CAAC,EAAE,gBAAgB;AACjC,UAAE,KAAK,CAAC;AAAA,MACV;AACF,UAAM,IAAI,KAAK,mBAAmB,gBAAgB,EAAE,YAAY,KAAK,CAAC,GAAG,IAAI,KAAK,mBAAmB,gBAAgB,EAAE,UAAU,KAAK,CAAC,GAAG,IAAI,KAAK,mBAAmB,gBAAgB,EAAE,MAAM,KAAK,CAAC,GAAG,IAAI,KAAK,mBAAmB,gBAAgB,EAAE,SAAS,KAAK,CAAC,GAAG,IAAI,KAAK,MAAM,gBAAgB,EAAE,UAAU,GAAG,IAAI,KAAK,MAAM,gBAAgB,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,gBAAgB,EAAE,SAAS;AACzY,QAAI,IAAI;AACR,SAAK,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,EAAE,GAAG;AAC1C,YAAM,IAAI,KAAK,UAAU,CAAC;AAC1B,QAAE,KAAK,GAAG,EAAE,iBAAiB,EAAE,gBAAgB,QAAQ,CAAC,MAAM;AAC5D,UAAE,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE;AAAA,MACzT,CAAC;AAAA,IACH;AACA,UAAM,IAAI,KAAK,mBAAmB,gBAAgB,GAAG,IAAI,KAAK,mBAAmB,iBAAiB,GAAG,IAAI,KAAK,mBAAmB;AACjI,SAAK,mBAAmB,YAAY,CAAC;AACrC,UAAM,IAAI,KAAK,mBAAmB,WAAW,GAAG,IAAI,KAAK,MAAM,WAAW;AAC1E,SAAK,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE;AAC1B,UAAI,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM;AACjC,cAAM,IAAI,EAAE,EAAE,iBAAiB,CAAC;AAChC,YAAI,IAAI,EAAE,UAAU,CAAC,EAAE,gBAAgB,QAAQ,CAAC;AAChD,YAAI,MAAM,IAAI,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MACpD,CAAC;AACH,SAAK,mBAAmB,WAAW,CAAC,GAAG,KAAK,mBAAmB,gBAAgB,EAAE,cAAc,CAAC,GAAG,EAAE,SAAS,KAAK,KAAK,mBAAmB,gBAAgB,EAAE,YAAY,CAAC,GAAG,EAAE,SAAS,KAAK,KAAK,mBAAmB,gBAAgB,EAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,KAAK,KAAK,mBAAmB,gBAAgB,EAAE,WAAW,CAAC;AACzT,UAAM,IAAI,KAAK,MAAM,UAAU,CAAC;AAChC,QAAI,MAAM,KAAK,mBAAmB,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM;AACjE,SAAG;AAAA,QACD,EAAE;AAAA,QACF,EAAE;AAAA,QACF,EAAE;AAAA;AAAA,QAEF,EAAE;AAAA,QACF,EAAE;AAAA,QACF,EAAE,QAAQ;AAAA,MACZ;AAAA,IACF,CAAC,GAAG,GAAG;AAAA,MACL,EAAE;AAAA,MACF;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA,EAAE,SAAS;AAAA,MACX,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,qBAAqB;AACnB,SAAK,qBAAqB,IAAI,EAAE,KAAK,MAAM,OAAO,aAAa,KAAK,MAAM,SAAS,CAAC,GAAG,KAAK,mBAAmB,WAAW,KAAK,MAAM,UAAU,KAAK,mBAAmB,SAAS,KAAK,MAAM,QAAQ,KAAK,mBAAmB,YAAY,OAAI,KAAK,mBAAmB,mBAAmB,KAAK,MAAM;AAAA,EACnS;AAAA,EACA,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG;AACxB,aAAS,IAAI,GAAG,IAAI,EAAE,eAAe,EAAE,GAAG;AACxC,YAAM,IAAI,KAAK,WAAW,KAAK,YAAY,EAAE,gBAAgB,CAAC,EAAE,UAAU;AAC1E,UAAI,EAAE;AACJ;AACF,YAAM,IAAI,KAAK,YAAY,EAAE,gBAAgB,CAAC,EAAE,UAAU,IAAI,EAAE,WAAW,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,WAAW,IAAI,KAAK,CAAC;AACnH,UAAI,MAAM,KAAK,MAAM,GAAG;AACtB,UAAE,CAAC,IAAI,MAAI,EAAE,KAAK,CAAC;AACnB;AAAA,MACF;AACA,UAAI,IAAI,EAAE,SAAS,SAAS,CAAC;AAC7B,UAAI,EAAE,UAAU;AAChB,UAAI,IAAI,EAAE,SAAS,SAAS,CAAC;AAC7B,UAAI,IAAI,EAAE,UAAU,GAAG,KAAK,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI;AAC7C,eAAO;AACT,YAAM,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,UAAU;AAClC,UAAI,EAAE,CAAC,IAAI,OAAI,EAAE,IAAI,GAAG,EAAE,MAAM,IAAI;AAClC,eAAO;AAAA,IACX;AACA,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB,GAAG,GAAG,GAAG,GAAG;AAC3B,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,EAAE,eAAe,EAAE,GAAG;AACxC,YAAM,IAAI,KAAK,YAAY,EAAE,gBAAgB,CAAC,GAAG,IAAI,KAAK,WAAW,EAAE,UAAU;AACjF,UAAI,CAAC,EAAE,SAAS;AACd,YAAI,EAAE,CAAC,KAAK,EAAE,eAAe;AAC3B,YAAE,UAAU,MAAI;AAChB;AAAA,QACF;AACA,UAAE,UAAU,EAAE,QAAQ,IAAI,GAAG,EAAE,UAAU,MAAI,EAAE,MAAM,CAAC,IAAI,KAAK,gBAAgB,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,eAAe,GAAG,EAAE,MAAM,CAAC,IAAI,KAAK,gBAAgB,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,eAAe,GAAG,EAAE,MAAM,CAAC,IAAI,KAAK,gBAAgB,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,eAAe,GAAG,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC;AAAA,MACzY;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EACA,kBAAkB;AAChB,aAAS,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,EAAE,GAAG;AAC9C,YAAM,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,UAAU,CAAC;AAC1C,UAAI;AACJ,WAAK,IAAI,GAAG,IAAI,EAAE,eAAe,EAAE,GAAG;AACpC,cAAM,IAAI,KAAK,WAAW,KAAK,YAAY,EAAE,gBAAgB,CAAC,EAAE,UAAU;AAC1E,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAI,IAAI;AACR,gBAAM,IAAI,EAAE,UAAU,CAAC;AACvB,iBAAO,IAAI,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE;AAChC,cAAE;AACJ,gBAAM,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC;AAAA,QAClD;AAAA,MACF;AACA,WAAK,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE;AAC1B,UAAE,CAAC,MAAM,IAAI,KAAK,UAAU,EAAE,CAAC,CAAC,EAAE,WAAW,OAAK,KAAK,UAAU,EAAE,CAAC,CAAC,EAAE,WAAW;AAAA,IACtF;AAAA,EACF;AAAA,EACA,YAAY,IAAI,OAAI;AAClB,QAAI;AACJ,QAAI,CAAC,GAAG;AACN,YAAM,IAAI,CAAC;AACX,WAAK,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,EAAE;AACxC,aAAK,WAAW,CAAC,EAAE,WAAW,EAAE,KAAK,KAAK,WAAW,CAAC,CAAC;AACzD,WAAK,aAAa;AAAA,IACpB;AACA,SAAK,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,EAAE;AACvC,WAAK,UAAU,CAAC,EAAE,gBAAgB,GAAG,KAAK,UAAU,CAAC,EAAE,gBAAgB;AACzE,QAAI,GAAG,GAAG;AACV,SAAK,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,EAAE;AACxC,WAAK,IAAI,KAAK,WAAW,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE;AAC3C,YAAI,EAAE,UAAU,CAAC,GAAG,EAAE;AAC1B,QAAI,IAAI;AACR,SAAK,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,EAAE;AACvC,WAAK,UAAU,CAAC,EAAE,gBAAgB,GAAG,KAAK,KAAK,UAAU,CAAC,EAAE,eAAe,KAAK,UAAU,CAAC,EAAE,gBAAgB;AAC/G,UAAM,IAAI,IAAI,MAAM,KAAK,WAAW,SAAS,CAAC;AAC9C,SAAK,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,EAAE;AACxC,WAAK,IAAI,KAAK,WAAW,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE;AAC3C,YAAI,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,gBAAgB,EAAE,aAAa,IAAI,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE;AAC/E,SAAK,cAAc,GAAG,KAAK,KAAK,gBAAgB;AAAA,EAClD;AAAA,EACA,aAAa,GAAG,GAAG;AACjB,UAAM,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE;AAC9B,WAAO,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC;AAAA,EACjN;AAAA,EACA,gBAAgB,GAAG,GAAG,GAAG;AACvB,UAAM,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,YAAY,EAAE;AAC5C,QAAI,IAAI;AACR,UAAM,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACzC,QAAI,MAAM,KAAK,CAAC;AACd,YAAM,IAAI,EAAE,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,KAAK,aAAa,GAAG,CAAC;AAAA,SAC9L;AACH,YAAM,IAAI,EAAE,SAAS,IAAI,EAAE,QAAQ,EAAE,OAAO,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,KAAK,aAAa,GAAG,EAAE,QAAQ,GAAG,IAAI,KAAK,aAAa,GAAG,EAAE,QAAQ,GAAG,IAAI,KAAK,aAAa,GAAG,CAAC;AACnK,UAAI,KAAK,IAAI,GAAG,GAAG,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,KAAK,EAAE,SAAS,CAAC;AAAA,IAC1H;AACA,WAAO;AAAA,EACT;AACF;AACA,OAAO,eAAe,GAAG,WAAW,uBAAuB;AAAA,EACzD,KAAK,WAAW;AACd,QAAI,CAAC,KAAK,sBAAsB;AAC9B,WAAK,uBAAuB,IAAI,GAAG;AACnC,UAAIA,KAAI,KAAK,cAAc,GAAG,wBAAwB;AACtD,MAAAA,OAAMA,KAAI,IAAI,GAAG,IAAI,GAAG,KAAK,cAAcA,EAAC;AAAA,IAC9C;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EACA,KAAK,SAASA,IAAG;AACf,SAAK,uBAAuBA;AAAA,EAC9B;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAChB,CAAC;AACD,EAAE,UAAU,WAAW,SAASA,IAAG,IAAI,MAAI,IAAI,GAAG,WAAW,GAAG;AAC9D,SAAO,KAAK,SAAS,EAAE,oBAAoB,QAAQ;AAAA,IACjD,UAAUA;AAAA,IACV,oBAAoB;AAAA,IACpB,MAAM;AAAA,IACN,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,EACnB,CAAC,GAAG;AACN;AACA,IAAM,KAAN,MAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKP,YAAY,GAAG;AACb,SAAK,OAAO,GAAG,0BAA0B,KAAK,QAAQ;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW;AACT,SAAK,MAAM,yBAAyB,aAAa,GAAG,6CAA6C,MAAM,KAAK,mBAAmB;AAAA,EACjI;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAIA,UAAU;AAAA,EACV;AAAA,EACA,sBAAsB;AACpB,SAAK,MAAM,wBAAwB,CAAC,KAAK,MAAM,qBAAqB,WAAW,KAAK,MAAM,qBAAqB,YAAY;AAAA,EAC7H;AACF;AACA,GAAG,UAAU,2BAA2B,SAASA,IAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACjE,QAAM,IAAI,EAAE,QAAQ,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC;AACvC,MAAI,IAAI,IAAI;AACZ,WAAS,IAAI,KAAK,YAAY,IAAI,KAAK,aAAa,KAAK,cAAc,IAAI,IAAI,KAAK,GAAG;AACrF,UAAM,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC;AACzC,QAAI,KAAK,MAAM,YAAY;AACzB,WAAK;AACL;AAAA,IACF;AACA,UAAM,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;AACjC,QAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACf;AACF,UAAM,IAAI,EAAE,uBAAuBA,IAAG,GAAG,GAAG,GAAG,CAAC;AAChD,QAAI,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI;AAAA,EAC/B;AACA,SAAO,EAAE,SAAS,CAAC,GAAG;AACxB;AACA,GAAG,UAAU,oCAAoC,SAASA,IAAG,GAAG,GAAG,GAAG;AACpE,QAAM,IAAI,EAAE,QAAQ,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC;AACvC,MAAI,IAAI,IAAI;AACZ,WAAS,IAAI,KAAK,eAAe,IAAI,KAAK,gBAAgB,KAAK,eAAe,KAAK,GAAG;AACpF,UAAM,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,uBAAuBA,IAAG,GAAG,GAAG,GAAG,CAAC;AACtF,QAAI,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI;AAAA,EAC/B;AACA,SAAO,EAAE,SAAS,CAAC,GAAG;AACxB;AACA,GAAG,UAAU,eAAe,SAASA,IAAG,GAAG,GAAG,GAAG;AAC/C,QAAM,IAAI,KAAK,YAAY;AAC3B,MAAI,CAAC;AACH,WAAO;AACT,MAAI,IAAI,GAAG,IAAI;AACf,UAAQ,EAAE,UAAU;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,UAAI,GAAG,IAAI;AACX;AAAA,EACJ;AACA,SAAO,EAAE,aAAa,IAAI,KAAK,CAAC,EAAE,UAAU,KAAK,MAAM,aAAa,KAAK,kCAAkCA,IAAG,GAAG,GAAG,CAAC,IAAI,KAAK,yBAAyBA,IAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACzK;AACA,SAAS,GAAGA,IAAG,IAAI,CAAC,GAAG,GAAG;AACxB,IAAE,aAAa,EAAE,WAAW,IAAI,EAAE,aAAa,EAAE,WAAW;AAC5D,QAAM,IAAI,GAAG,IAAI,EAAE,OAAO,KAAK,UAAU,EAAE,UAAU,UAAU,EAAE,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,WAAW,GAAG,cAAc,EAAE,WAAW,KAAK,IAAI,EAAE,UAAU,GAAG,CAAC;AAC1K,IAAE,SAAS,IAAI,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS;AACxC,QAAM,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,IAAE;AAClC,SAAO,EAAE,OAAOA,IAAG;AACrB;AACA,EAAE,mBAAmB,CAACA,IAAG,GAAG,GAAG,MAAM,GAAGA,IAAG;AAAA,EACzC,UAAU;AAAA,EACV,UAAU;AACZ,GAAG,CAAC;AACJ,IAAM,KAAN,MAAS;AAAA,EACP,cAAc;AACZ,SAAK,wBAAwB,CAAC,GAAG,KAAK,gBAAgB,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAY,GAAG;AACpB,MAAE,KAAK,iBAAiB,0BAA0B,gBAAgB;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,YAAY,GAAG;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,eAAe,GAAG,GAAG,GAAG,GAAG,GAAG;AAC5B,QAAI,EAAE,mBAAmB,EAAE,gBAAgB,WAAW,EAAE,gBAAgB,sBAAsB,EAAE,gBAAgB,SAAS,CAAC,MAAM,IAAI;AAClI,WAAK,sBAAsB,EAAE,QAAQ,MAAM,KAAK,sBAAsB,EAAE,QAAQ,IAAI,EAAE,MAAM,IAAI,KAAK,2BAA2B,KAAK,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,GAAG,KAAK,wBAAwB,EAAE,mBAAmB,EAAE,MAAM;AACxP,YAAM,IAAI,EAAE,UAAU;AACtB,WAAK,sBAAsB,eAAe,EAAE,mBAAmB,EAAE,cAAc,KAAK,qBAAqB,EAAE,SAAS,KAAK,uBAAuB,SAAS,KAAK,qBAAqB,GAAG,KAAK,sBAAsB,SAAS,EAAE,mBAAmB,CAAC,KAAK,KAAK,uBAAuB,EAAE,YAAY,KAAK,qBAAqB,EAAE,SAAS,KAAK,uBAAuB,SAAS,KAAK,qBAAqB,IAAI,EAAE,UAAU,iBAAiB,KAAK,sBAAsB,EAAE,QAAQ,CAAC,GAAG,EAAE,UAAU,0BAA0B,KAAK,sBAAsB,GAAG,KAAK,sBAAsB,EAAE,QAAQ,IAAI,EAAE,MAAM;AAAA,IACpkB;AAAA,EACF;AACF;AACA,IAAM,KAAN,MAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKP,YAAY,GAAG;AACb,QAAI,KAAK,QAAQ,CAAC,GAAG,KAAK,WAAW,MAAI,KAAK,kBAAkB,MAAI,KAAK,qBAAqB,OAAI,KAAK,sBAAsB,MAAI,KAAK,oBAAoB,MAAI,KAAK,mBAAmB,MAAI,KAAK,gBAAgB,MAAI,KAAK,mBAAmB,MAAI,KAAK,2BAA2B,MAAI,KAAK,WAAW,OAAI,KAAK,OAAO,OAAI,KAAK,eAAe,OAAI,KAAK,WAAW,OAAI,KAAK,sBAAsB,GAAG;AAC/X,iBAAW,KAAK;AACd,eAAO,UAAU,eAAe,KAAK,GAAG,CAAC,KAAK,KAAK,iBAAiB,CAAC;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,UAAU;AACZ,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAIA,kBAAkB;AAChB,SAAK,WAAW,OAAI,KAAK,sBAAsB,OAAI,KAAK,oBAAoB,OAAI,KAAK,mBAAmB,OAAI,KAAK,kBAAkB,OAAI,KAAK,qBAAqB,OAAI,KAAK,gBAAgB,OAAI,KAAK,mBAAmB,OAAI,KAAK,2BAA2B;AAAA,EAC5P;AAAA;AAAA;AAAA;AAAA,EAIA,oBAAoB;AAClB,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAIA,iBAAiB;AACf,SAAK,oBAAoB,MAAI,KAAK,sBAAsB,MAAI,KAAK,kBAAkB,MAAI,KAAK,mBAAmB,MAAI,KAAK,gBAAgB,MAAI,KAAK,mBAAmB,OAAI,KAAK,2BAA2B,MAAI,KAAK,WAAW;AAAA,EAC9N;AAAA;AAAA;AAAA;AAAA,EAIA,6BAA6B;AAC3B,SAAK,2BAA2B,MAAI,KAAK,WAAW;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,IAAI,OAAI;AACvB,SAAK,kBAAkB,MAAI,KAAK,qBAAqB,KAAK,sBAAsB,GAAG,KAAK,WAAW;AAAA,EACrG;AAAA;AAAA;AAAA;AAAA,EAIA,wBAAwB;AACtB,SAAK,sBAAsB,MAAI,KAAK,WAAW;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAIA,sBAAsB;AACpB,SAAK,oBAAoB,MAAI,KAAK,WAAW;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAIA,qBAAqB;AACnB,SAAK,mBAAmB,MAAI,KAAK,WAAW;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAIA,kBAAkB;AAChB,SAAK,gBAAgB,MAAI,KAAK,WAAW;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAIA,qBAAqB;AACnB,SAAK,mBAAmB,MAAI,KAAK,WAAW;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAIA,UAAU;AACR,SAAK,MAAM,SAAS;AACpB,eAAW,KAAK,OAAO,KAAK,IAAI;AAC9B,QAAE,CAAC,MAAM,OAAO,KAAK,MAAM,KAAK,CAAC;AACnC,QAAI,KAAK;AACP,iBAAW,KAAK,KAAK;AACnB,aAAK,MAAM,QAAQ,CAAC,MAAM,MAAM,KAAK,MAAM,KAAK,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,GAAG;AACT,QAAI,KAAK,MAAM,WAAW,EAAE,MAAM;AAChC,aAAO;AACT,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAC1C,YAAM,IAAI,KAAK,MAAM,CAAC;AACtB,UAAI,KAAK,CAAC,MAAM,EAAE,CAAC;AACjB,eAAO;AAAA,IACX;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,GAAG;AACT,SAAK,MAAM,WAAW,EAAE,MAAM,WAAW,EAAE,QAAQ,KAAK,MAAM,MAAM,CAAC;AACrE,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAC1C,YAAM,IAAI,KAAK,MAAM,CAAC;AACtB,QAAE,CAAC,IAAI,KAAK,CAAC;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,QAAQ;AACN,SAAK,MAAM,QAAQ,CAAC,MAAM,KAAK,iBAAiB,CAAC,CAAC;AAAA,EACpD;AAAA,EACA,iBAAiB,GAAG;AAClB,QAAI,GAAG,GAAG,GAAG;AACb,UAAM,MAAM,KAAK,IAAI,KAAK,wBAAwB,OAAO,SAAS,EAAE,CAAC,MAAM,OAAO,SAAS,EAAE,SAAS,OAAO,KAAK,CAAC,GAAG,KAAK,KAAK,IAAI,KAAK,wBAAwB,OAAO,SAAS,EAAE,CAAC,MAAM,OAAO,SAAS,EAAE;AAC5M,YAAQ,GAAG;AAAA,MACT,KAAK;AACH,aAAK,CAAC,IAAI,KAAK;AACf;AAAA,MACF,KAAK;AACH,aAAK,CAAC,IAAI,KAAK;AACf;AAAA,MACF;AACE,aAAK,CAAC,IAAI,KAAK;AACf;AAAA,IACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACT,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAC1C,YAAM,IAAI,KAAK,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC;AACnC,cAAQ,OAAO,GAAG;AAAA,QAChB,KAAK;AAAA,QACL,KAAK;AACH,eAAK,aAAa,IAAI,MAAM,IAAI;AAAA;AAEhC;AAAA,QACF;AACE,gBAAM,KAAK,aAAa,IAAI;AAAA;AAE5B;AAAA,MACJ;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AACA,IAAM,KAAN,MAAS;AAAA;AAAA;AAAA;AAAA,EAIP,WAAW,wBAAwB;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,sBAAsB,GAAG;AAClC,SAAK,2BAA2B,MAAM,KAAK,yBAAyB,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACrG;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,uBAAuB;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,qBAAqB,GAAG;AACjC,SAAK,0BAA0B,MAAM,KAAK,wBAAwB,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,kBAAkB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,gBAAgB,GAAG;AAC5B,SAAK,qBAAqB,MAAM,KAAK,mBAAmB,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,wBAAwB;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,sBAAsB,GAAG;AAClC,SAAK,2BAA2B,MAAM,KAAK,yBAAyB,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACrG;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,wBAAwB;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,sBAAsB,GAAG;AAClC,SAAK,2BAA2B,MAAM,KAAK,yBAAyB,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACrG;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,2BAA2B;AACpC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,yBAAyB,GAAG;AACrC,SAAK,8BAA8B,MAAM,KAAK,4BAA4B,GAAG,GAAG,wBAAwB,CAAC;AAAA,EAC3G;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,yBAAyB;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,uBAAuB,GAAG;AACnC,SAAK,4BAA4B,MAAM,KAAK,0BAA0B,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACvG;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,yBAAyB;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,uBAAuB,GAAG;AACnC,SAAK,4BAA4B,MAAM,KAAK,0BAA0B,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACvG;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,qBAAqB;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,mBAAmB,GAAG;AAC/B,SAAK,wBAAwB,MAAM,KAAK,sBAAsB,GAAG,GAAG,wBAAwB,CAAC;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,yBAAyB;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,uBAAuB,GAAG;AACnC,SAAK,4BAA4B,MAAM,KAAK,0BAA0B,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACvG;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,2BAA2B;AACpC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,yBAAyB,GAAG;AACrC,SAAK,8BAA8B,MAAM,KAAK,4BAA4B,GAAG,GAAG,wBAAwB,CAAC;AAAA,EAC3G;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,6BAA6B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,2BAA2B,GAAG;AACvC,SAAK,gCAAgC,MAAM,KAAK,8BAA8B,GAAG,GAAG,wBAAwB,CAAC;AAAA,EAC/G;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,iBAAiB;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,eAAe,GAAG;AAC3B,SAAK,oBAAoB,MAAM,KAAK,kBAAkB,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,0BAA0B;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,wBAAwB,GAAG;AACpC,SAAK,6BAA6B,MAAM,KAAK,2BAA2B,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACzG;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,8BAA8B;AACvC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,4BAA4B,GAAG;AACxC,SAAK,iCAAiC,MAAM,KAAK,+BAA+B,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACjH;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,8BAA8B;AACvC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,4BAA4B,GAAG;AACxC,SAAK,iCAAiC,MAAM,KAAK,+BAA+B,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACjH;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,sBAAsB;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,oBAAoB,GAAG;AAChC,SAAK,yBAAyB,MAAM,KAAK,uBAAuB,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,4BAA4B;AACrC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,0BAA0B,GAAG;AACtC,SAAK,+BAA+B,MAAM,KAAK,6BAA6B,GAAG,GAAG,wBAAwB,CAAC;AAAA,EAC7G;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,0BAA0B;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,wBAAwB,GAAG;AACpC,SAAK,6BAA6B,MAAM,KAAK,2BAA2B,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACzG;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,oCAAoC;AAC7C,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,kCAAkC,GAAG;AAC9C,SAAK,uCAAuC,MAAM,KAAK,qCAAqC,GAAG,GAAG,wBAAwB,CAAC;AAAA,EAC7H;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,sCAAsC;AAC/C,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,oCAAoC,GAAG;AAChD,SAAK,yCAAyC,MAAM,KAAK,uCAAuC,GAAG,GAAG,wBAAwB,CAAC;AAAA,EACjI;AAAA;AAAA;AAAA;AAAA,EAIA,WAAW,4BAA4B;AACrC,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,0BAA0B,GAAG;AACtC,SAAK,+BAA+B,MAAM,KAAK,6BAA6B,GAAG,GAAG,wBAAwB,CAAC;AAAA,EAC7G;AACF;AACA,GAAG,yBAAyB;AAC5B,GAAG,wBAAwB;AAC3B,GAAG,mBAAmB;AACtB,GAAG,yBAAyB;AAC5B,GAAG,yBAAyB;AAC5B,GAAG,4BAA4B;AAC/B,GAAG,0BAA0B;AAC7B,GAAG,0BAA0B;AAC7B,GAAG,sBAAsB;AACzB,GAAG,0BAA0B;AAC7B,GAAG,4BAA4B;AAC/B,GAAG,8BAA8B;AACjC,GAAG,kBAAkB;AACrB,GAAG,2BAA2B;AAC9B,GAAG,+BAA+B;AAClC,GAAG,+BAA+B;AAClC,GAAG,uBAAuB;AAC1B,GAAG,6BAA6B;AAChC,GAAG,2BAA2B;AAC9B,GAAG,qCAAqC;AACxC,GAAG,uCAAuC;AAC1C,GAAG,6BAA6B;AAChC,IAAM,KAAK;AAAX,IAAuC,KAAK;AAAA;AAAA;AAAA;AAI5C,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAyC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyE9C,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAkC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAMvC,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAiC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQtC,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAoC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOzC,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAiC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWtC,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAA6B,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQlC,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAuC,KAAK;AAAA;AAAA;AAAA;AAI5C,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAA8B,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqGnC,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAuC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+D5C,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAkC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2DvC,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAsC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkD3C,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAuC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6XtC,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAsC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW3C,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAkC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWvC,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAmC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWxC,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAmC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBxC,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAmC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUxC,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAkC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBvC,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAqC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB1C,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAyC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwF9C,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAA2C,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBhD,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAA4C,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CjD,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAsC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY3C,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAAuB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyL5B,EAAE,qBAAqB,EAAE,IAAI;AAC7B,IAAM,KAAK;AAAX,IAA6B,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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", - "names": ["n", "__", "_w", "_I", "_B"] + "sourcesContent": ["import { Tags as ar, Texture as Vl, Mesh as Ji, VertexData as Up, Vector3 as Me, Effect as Vp, ShaderMaterial as NR, Color3 as pi, VertexBuffer as FR, Matrix as LR, BoundingInfo as an, MeshBuilder as kt, TransformNode as On, CreateGreasedLine as R_, ActionManager as Fr, InstancedMesh as Qu, AbstractMesh as wR, DynamicTexture as Ac, StandardMaterial as Vs, SixDofDragBehavior as UR, ExecuteCodeAction as Bs, PointerDragBehavior as Bl, Space as so, Axis as Bp, Vector2 as da, KeyboardEventTypes as VR, Color4 as fu, PBRMetallicRoughnessMaterial as BR, PBRSpecularGlossinessMaterial as kR, Animation as Ss, BezierCurveEase as wh } from \"@babylonjs/core\";\nfunction zR(n) {\n let e = n[0], t = n.slice(1), i = [];\n return e === \".\" ? (this.selected.forEach((r) => i = i.concat(r == null ? void 0 : r.getChildren((s) => s.name == t))), new qt(i, this.scene)) : e === \"#\" ? (this.selected.forEach((r) => i = i.concat(r == null ? void 0 : r.getChildren((s) => s.id == t))), new qt(i, this.scene)) : e === \"$\" ? (this.selected.forEach((r) => i = i.concat(r == null ? void 0 : r.getChildren((s) => ar.MatchesQuery(s, t) == !0))), new qt(i, this.scene)) : new qt([], this.scene);\n}\nfunction WR(n) {\n let e = [];\n return Array.isArray(n) ? n.forEach((t, i) => this.selected.forEach((r) => e = e.concat(r == null ? void 0 : r.getChildren((s) => s.name == t)))) : this.selected.forEach((t) => e = e.concat(t == null ? void 0 : t.getChildren((i) => i.name == n))), new qt(e, this.scene);\n}\nfunction GR(n) {\n let e = [];\n return Array.isArray(n) ? n.forEach((t, i) => this.selected.forEach((r) => e = e.concat(r == null ? void 0 : r.getChildren((s) => s.id == t)))) : this.selected.forEach((t) => e = e.concat(t == null ? void 0 : t.getChildren((i) => i.id == n))), new qt(e, this.scene);\n}\nfunction XR(n) {\n let e = [];\n return Array.isArray(n) ? n.forEach((t, i) => this.selected.forEach((r) => e = e.concat(r == null ? void 0 : r.getChildren((s) => ar.MatchesQuery(s, t) == !0)))) : this.selected.forEach((t) => e = e.concat(t == null ? void 0 : t.getChildren((i) => ar.MatchesQuery(i, n) == !0))), new qt(e, this.scene);\n}\nconst HR = [\n \"roboto-regular.png\"\n], KR = [\n {\n id: 40,\n index: 12,\n char: \"(\",\n width: 25,\n height: 87,\n xoffset: 3,\n yoffset: -2,\n xadvance: 27,\n chnl: 15,\n x: 0,\n y: 0,\n page: 0\n },\n {\n id: 41,\n index: 13,\n char: \")\",\n width: 25,\n height: 87,\n xoffset: -1,\n yoffset: -2,\n xadvance: 28,\n chnl: 15,\n x: 0,\n y: 88,\n page: 0\n },\n {\n id: 91,\n index: 63,\n char: \"[\",\n width: 19,\n height: 81,\n xoffset: 4,\n yoffset: -3,\n xadvance: 21,\n chnl: 15,\n x: 0,\n y: 176,\n page: 0\n },\n {\n id: 93,\n index: 65,\n char: \"]\",\n width: 19,\n height: 81,\n xoffset: -2,\n yoffset: -3,\n xadvance: 21,\n chnl: 15,\n x: 0,\n y: 258,\n page: 0\n },\n {\n id: 123,\n index: 95,\n char: \"{\",\n width: 28,\n height: 81,\n xoffset: 1,\n yoffset: 0,\n xadvance: 27,\n chnl: 15,\n x: 0,\n y: 340,\n page: 0\n },\n {\n id: 125,\n index: 97,\n char: \"}\",\n width: 28,\n height: 81,\n xoffset: -1,\n yoffset: 0,\n xadvance: 27,\n chnl: 15,\n x: 0,\n y: 422,\n page: 0\n },\n {\n id: 106,\n index: 78,\n char: \"j\",\n width: 20,\n height: 79,\n xoffset: -5,\n yoffset: 4,\n xadvance: 19,\n chnl: 15,\n x: 20,\n y: 176,\n page: 0\n },\n {\n id: 36,\n index: 8,\n char: \"$\",\n width: 40,\n height: 78,\n xoffset: 2,\n yoffset: -4,\n xadvance: 45,\n chnl: 15,\n x: 20,\n y: 256,\n page: 0\n },\n {\n id: 64,\n index: 36,\n char: \"@\",\n width: 67,\n height: 78,\n xoffset: 3,\n yoffset: 6,\n xadvance: 72,\n chnl: 15,\n x: 26,\n y: 0,\n page: 0\n },\n {\n id: 81,\n index: 53,\n char: \"Q\",\n width: 50,\n height: 71,\n xoffset: 2,\n yoffset: 4,\n xadvance: 55,\n chnl: 15,\n x: 26,\n y: 79,\n page: 0\n },\n {\n id: 87,\n index: 59,\n char: \"W\",\n width: 71,\n height: 61,\n xoffset: 0,\n yoffset: 5,\n xadvance: 71,\n chnl: 15,\n x: 41,\n y: 151,\n page: 0\n },\n {\n id: 124,\n index: 96,\n char: \"|\",\n width: 10,\n height: 71,\n xoffset: 5,\n yoffset: 5,\n xadvance: 19,\n chnl: 15,\n x: 77,\n y: 79,\n page: 0\n },\n {\n id: 92,\n index: 64,\n char: \"\\\\\",\n width: 35,\n height: 66,\n xoffset: 0,\n yoffset: 5,\n xadvance: 33,\n chnl: 15,\n x: 88,\n y: 79,\n page: 0\n },\n {\n id: 47,\n index: 19,\n char: \"/\",\n width: 34,\n height: 66,\n xoffset: -1,\n yoffset: 5,\n xadvance: 33,\n chnl: 15,\n x: 94,\n y: 0,\n page: 0\n },\n {\n id: 162,\n index: 100,\n char: \"¢\",\n width: 40,\n height: 65,\n xoffset: 2,\n yoffset: 11,\n xadvance: 44,\n chnl: 15,\n x: 29,\n y: 335,\n page: 0\n },\n {\n id: 98,\n index: 70,\n char: \"b\",\n width: 40,\n height: 65,\n xoffset: 3,\n yoffset: 2,\n xadvance: 45,\n chnl: 15,\n x: 29,\n y: 401,\n page: 0\n },\n {\n id: 100,\n index: 72,\n char: \"d\",\n width: 40,\n height: 65,\n xoffset: 2,\n yoffset: 2,\n xadvance: 45,\n chnl: 15,\n x: 61,\n y: 213,\n page: 0\n },\n {\n id: 102,\n index: 74,\n char: \"f\",\n width: 30,\n height: 65,\n xoffset: 0,\n yoffset: 1,\n xadvance: 28,\n chnl: 15,\n x: 70,\n y: 279,\n page: 0\n },\n {\n id: 103,\n index: 75,\n char: \"g\",\n width: 40,\n height: 64,\n xoffset: 2,\n yoffset: 19,\n xadvance: 45,\n chnl: 15,\n x: 70,\n y: 345,\n page: 0\n },\n {\n id: 104,\n index: 76,\n char: \"h\",\n width: 37,\n height: 64,\n xoffset: 3,\n yoffset: 2,\n xadvance: 44,\n chnl: 15,\n x: 101,\n y: 279,\n page: 0\n },\n {\n id: 107,\n index: 79,\n char: \"k\",\n width: 39,\n height: 64,\n xoffset: 4,\n yoffset: 2,\n xadvance: 41,\n chnl: 15,\n x: 102,\n y: 213,\n page: 0\n },\n {\n id: 108,\n index: 80,\n char: \"l\",\n width: 11,\n height: 64,\n xoffset: 4,\n yoffset: 2,\n xadvance: 19,\n chnl: 15,\n x: 113,\n y: 146,\n page: 0\n },\n {\n id: 37,\n index: 9,\n char: \"%\",\n width: 55,\n height: 63,\n xoffset: 2,\n yoffset: 4,\n xadvance: 59,\n chnl: 15,\n x: 124,\n y: 67,\n page: 0\n },\n {\n id: 109,\n index: 81,\n char: \"m\",\n width: 63,\n height: 47,\n xoffset: 3,\n yoffset: 19,\n xadvance: 70,\n chnl: 15,\n x: 129,\n y: 0,\n page: 0\n },\n {\n id: 112,\n index: 84,\n char: \"p\",\n width: 40,\n height: 63,\n xoffset: 3,\n yoffset: 19,\n xadvance: 45,\n chnl: 15,\n x: 125,\n y: 131,\n page: 0\n },\n {\n id: 113,\n index: 85,\n char: \"q\",\n width: 40,\n height: 63,\n xoffset: 2,\n yoffset: 19,\n xadvance: 45,\n chnl: 15,\n x: 70,\n y: 410,\n page: 0\n },\n {\n id: 121,\n index: 93,\n char: \"y\",\n width: 40,\n height: 63,\n xoffset: -1,\n yoffset: 20,\n xadvance: 38,\n chnl: 15,\n x: 111,\n y: 344,\n page: 0\n },\n {\n id: 163,\n index: 101,\n char: \"£\",\n width: 45,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 46,\n chnl: 15,\n x: 139,\n y: 278,\n page: 0\n },\n {\n id: 38,\n index: 10,\n char: \"&\",\n width: 50,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 50,\n chnl: 15,\n x: 142,\n y: 195,\n page: 0\n },\n {\n id: 48,\n index: 20,\n char: \"0\",\n width: 40,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 45,\n chnl: 15,\n x: 166,\n y: 131,\n page: 0\n },\n {\n id: 50,\n index: 22,\n char: \"2\",\n width: 42,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 45,\n chnl: 15,\n x: 180,\n y: 48,\n page: 0\n },\n {\n id: 51,\n index: 23,\n char: \"3\",\n width: 40,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 45,\n chnl: 15,\n x: 111,\n y: 408,\n page: 0\n },\n {\n id: 53,\n index: 25,\n char: \"5\",\n width: 40,\n height: 62,\n xoffset: 4,\n yoffset: 5,\n xadvance: 45,\n chnl: 15,\n x: 152,\n y: 341,\n page: 0\n },\n {\n id: 54,\n index: 26,\n char: \"6\",\n width: 40,\n height: 62,\n xoffset: 3,\n yoffset: 5,\n xadvance: 45,\n chnl: 15,\n x: 185,\n y: 258,\n page: 0\n },\n {\n id: 56,\n index: 28,\n char: \"8\",\n width: 40,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 45,\n chnl: 15,\n x: 193,\n y: 194,\n page: 0\n },\n {\n id: 57,\n index: 29,\n char: \"9\",\n width: 40,\n height: 62,\n xoffset: 2,\n yoffset: 4,\n xadvance: 45,\n chnl: 15,\n x: 207,\n y: 111,\n page: 0\n },\n {\n id: 63,\n index: 35,\n char: \"?\",\n width: 36,\n height: 62,\n xoffset: 1,\n yoffset: 4,\n xadvance: 38,\n chnl: 15,\n x: 152,\n y: 404,\n page: 0\n },\n {\n id: 67,\n index: 39,\n char: \"C\",\n width: 48,\n height: 62,\n xoffset: 3,\n yoffset: 4,\n xadvance: 52,\n chnl: 15,\n x: 189,\n y: 404,\n page: 0\n },\n {\n id: 71,\n index: 43,\n char: \"G\",\n width: 48,\n height: 62,\n xoffset: 3,\n yoffset: 4,\n xadvance: 54,\n chnl: 15,\n x: 193,\n y: 321,\n page: 0\n },\n {\n id: 74,\n index: 46,\n char: \"J\",\n width: 40,\n height: 62,\n xoffset: 0,\n yoffset: 5,\n xadvance: 44,\n chnl: 15,\n x: 226,\n y: 257,\n page: 0\n },\n {\n id: 79,\n index: 51,\n char: \"O\",\n width: 50,\n height: 62,\n xoffset: 3,\n yoffset: 4,\n xadvance: 55,\n chnl: 15,\n x: 234,\n y: 174,\n page: 0\n },\n {\n id: 83,\n index: 55,\n char: \"S\",\n width: 45,\n height: 62,\n xoffset: 1,\n yoffset: 4,\n xadvance: 47,\n chnl: 15,\n x: 223,\n y: 0,\n page: 0\n },\n {\n id: 85,\n index: 57,\n char: \"U\",\n width: 45,\n height: 62,\n xoffset: 3,\n yoffset: 5,\n xadvance: 52,\n chnl: 15,\n x: 248,\n y: 63,\n page: 0\n },\n {\n id: 105,\n index: 77,\n char: \"i\",\n width: 13,\n height: 62,\n xoffset: 4,\n yoffset: 4,\n xadvance: 19,\n chnl: 15,\n x: 269,\n y: 0,\n page: 0\n },\n {\n id: 165,\n index: 103,\n char: \"¥\",\n width: 45,\n height: 61,\n xoffset: -1,\n yoffset: 5,\n xadvance: 42,\n chnl: 15,\n x: 283,\n y: 0,\n page: 0\n },\n {\n id: 161,\n index: 99,\n char: \"¡\",\n width: 13,\n height: 61,\n xoffset: 3,\n yoffset: 19,\n xadvance: 19,\n chnl: 15,\n x: 238,\n y: 384,\n page: 0\n },\n {\n id: 33,\n index: 5,\n char: \"!\",\n width: 13,\n height: 61,\n xoffset: 4,\n yoffset: 5,\n xadvance: 21,\n chnl: 15,\n x: 242,\n y: 320,\n page: 0\n },\n {\n id: 35,\n index: 7,\n char: \"#\",\n width: 48,\n height: 61,\n xoffset: 3,\n yoffset: 5,\n xadvance: 49,\n chnl: 15,\n x: 238,\n y: 446,\n page: 0\n },\n {\n id: 49,\n index: 21,\n char: \"1\",\n width: 26,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 45,\n chnl: 15,\n x: 252,\n y: 382,\n page: 0\n },\n {\n id: 52,\n index: 24,\n char: \"4\",\n width: 45,\n height: 61,\n xoffset: 0,\n yoffset: 5,\n xadvance: 45,\n chnl: 15,\n x: 256,\n y: 320,\n page: 0\n },\n {\n id: 55,\n index: 27,\n char: \"7\",\n width: 42,\n height: 61,\n xoffset: 1,\n yoffset: 5,\n xadvance: 45,\n chnl: 15,\n x: 279,\n y: 382,\n page: 0\n },\n {\n id: 65,\n index: 37,\n char: \"A\",\n width: 54,\n height: 61,\n xoffset: -1,\n yoffset: 5,\n xadvance: 52,\n chnl: 15,\n x: 287,\n y: 444,\n page: 0\n },\n {\n id: 66,\n index: 38,\n char: \"B\",\n width: 43,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 50,\n chnl: 15,\n x: 267,\n y: 237,\n page: 0\n },\n {\n id: 68,\n index: 40,\n char: \"D\",\n width: 45,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 52,\n chnl: 15,\n x: 302,\n y: 299,\n page: 0\n },\n {\n id: 69,\n index: 41,\n char: \"E\",\n width: 40,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 45,\n chnl: 15,\n x: 322,\n y: 361,\n page: 0\n },\n {\n id: 70,\n index: 42,\n char: \"F\",\n width: 39,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 44,\n chnl: 15,\n x: 342,\n y: 423,\n page: 0\n },\n {\n id: 72,\n index: 44,\n char: \"H\",\n width: 48,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 57,\n chnl: 15,\n x: 285,\n y: 126,\n page: 0\n },\n {\n id: 73,\n index: 45,\n char: \"I\",\n width: 12,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 22,\n chnl: 15,\n x: 294,\n y: 62,\n page: 0\n },\n {\n id: 75,\n index: 47,\n char: \"K\",\n width: 48,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 50,\n chnl: 15,\n x: 307,\n y: 62,\n page: 0\n },\n {\n id: 76,\n index: 48,\n char: \"L\",\n width: 38,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 43,\n chnl: 15,\n x: 329,\n y: 0,\n page: 0\n },\n {\n id: 77,\n index: 49,\n char: \"M\",\n width: 61,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 70,\n chnl: 15,\n x: 311,\n y: 188,\n page: 0\n },\n {\n id: 78,\n index: 50,\n char: \"N\",\n width: 48,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 57,\n chnl: 15,\n x: 334,\n y: 124,\n page: 0\n },\n {\n id: 80,\n index: 52,\n char: \"P\",\n width: 45,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 50,\n chnl: 15,\n x: 356,\n y: 62,\n page: 0\n },\n {\n id: 82,\n index: 54,\n char: \"R\",\n width: 45,\n height: 61,\n xoffset: 5,\n yoffset: 5,\n xadvance: 49,\n chnl: 15,\n x: 368,\n y: 0,\n page: 0\n },\n {\n id: 84,\n index: 56,\n char: \"T\",\n width: 48,\n height: 61,\n xoffset: 0,\n yoffset: 5,\n xadvance: 48,\n chnl: 15,\n x: 348,\n y: 250,\n page: 0\n },\n {\n id: 86,\n index: 58,\n char: \"V\",\n width: 53,\n height: 61,\n xoffset: -1,\n yoffset: 5,\n xadvance: 51,\n chnl: 15,\n x: 373,\n y: 186,\n page: 0\n },\n {\n id: 88,\n index: 60,\n char: \"X\",\n width: 50,\n height: 61,\n xoffset: 0,\n yoffset: 5,\n xadvance: 50,\n chnl: 15,\n x: 383,\n y: 124,\n page: 0\n },\n {\n id: 89,\n index: 61,\n char: \"Y\",\n width: 51,\n height: 61,\n xoffset: -1,\n yoffset: 5,\n xadvance: 48,\n chnl: 15,\n x: 402,\n y: 62,\n page: 0\n },\n {\n id: 90,\n index: 62,\n char: \"Z\",\n width: 45,\n height: 61,\n xoffset: 1,\n yoffset: 5,\n xadvance: 48,\n chnl: 15,\n x: 414,\n y: 0,\n page: 0\n },\n {\n id: 119,\n index: 91,\n char: \"w\",\n width: 61,\n height: 46,\n xoffset: 0,\n yoffset: 20,\n xadvance: 60,\n chnl: 15,\n x: 348,\n y: 312,\n page: 0\n },\n {\n id: 59,\n index: 31,\n char: \";\",\n width: 16,\n height: 58,\n xoffset: 0,\n yoffset: 19,\n xadvance: 17,\n chnl: 15,\n x: 363,\n y: 359,\n page: 0\n },\n {\n id: 116,\n index: 88,\n char: \"t\",\n width: 27,\n height: 57,\n xoffset: -2,\n yoffset: 10,\n xadvance: 26,\n chnl: 15,\n x: 397,\n y: 248,\n page: 0\n },\n {\n id: 164,\n index: 102,\n char: \"¤\",\n width: 53,\n height: 54,\n xoffset: 2,\n yoffset: 13,\n xadvance: 57,\n chnl: 15,\n x: 454,\n y: 62,\n page: 0\n },\n {\n id: 97,\n index: 69,\n char: \"a\",\n width: 39,\n height: 48,\n xoffset: 2,\n yoffset: 19,\n xadvance: 44,\n chnl: 15,\n x: 460,\n y: 0,\n page: 0\n },\n {\n id: 99,\n index: 71,\n char: \"c\",\n width: 40,\n height: 48,\n xoffset: 2,\n yoffset: 19,\n xadvance: 42,\n chnl: 15,\n x: 380,\n y: 359,\n page: 0\n },\n {\n id: 101,\n index: 73,\n char: \"e\",\n width: 40,\n height: 48,\n xoffset: 2,\n yoffset: 19,\n xadvance: 42,\n chnl: 15,\n x: 410,\n y: 306,\n page: 0\n },\n {\n id: 111,\n index: 83,\n char: \"o\",\n width: 42,\n height: 48,\n xoffset: 2,\n yoffset: 19,\n xadvance: 46,\n chnl: 15,\n x: 425,\n y: 248,\n page: 0\n },\n {\n id: 115,\n index: 87,\n char: \"s\",\n width: 38,\n height: 48,\n xoffset: 2,\n yoffset: 19,\n xadvance: 41,\n chnl: 15,\n x: 468,\n y: 117,\n page: 0\n },\n {\n id: 126,\n index: 98,\n char: \"~\",\n width: 48,\n height: 20,\n xoffset: 3,\n yoffset: 31,\n xadvance: 54,\n chnl: 15,\n x: 342,\n y: 485,\n page: 0\n },\n {\n id: 58,\n index: 30,\n char: \":\",\n width: 13,\n height: 47,\n xoffset: 3,\n yoffset: 19,\n xadvance: 19,\n chnl: 15,\n x: 193,\n y: 0,\n page: 0\n },\n {\n id: 110,\n index: 82,\n char: \"n\",\n width: 37,\n height: 47,\n xoffset: 3,\n yoffset: 19,\n xadvance: 44,\n chnl: 15,\n x: 468,\n y: 166,\n page: 0\n },\n {\n id: 114,\n index: 86,\n char: \"r\",\n width: 24,\n height: 47,\n xoffset: 3,\n yoffset: 19,\n xadvance: 27,\n chnl: 15,\n x: 223,\n y: 63,\n page: 0\n },\n {\n id: 117,\n index: 89,\n char: \"u\",\n width: 37,\n height: 47,\n xoffset: 3,\n yoffset: 20,\n xadvance: 44,\n chnl: 15,\n x: 427,\n y: 186,\n page: 0\n },\n {\n id: 118,\n index: 90,\n char: \"v\",\n width: 40,\n height: 46,\n xoffset: -1,\n yoffset: 20,\n xadvance: 39,\n chnl: 15,\n x: 468,\n y: 214,\n page: 0\n },\n {\n id: 120,\n index: 92,\n char: \"x\",\n width: 40,\n height: 46,\n xoffset: 0,\n yoffset: 20,\n xadvance: 40,\n chnl: 15,\n x: 468,\n y: 261,\n page: 0\n },\n {\n id: 122,\n index: 94,\n char: \"z\",\n width: 38,\n height: 46,\n xoffset: 1,\n yoffset: 20,\n xadvance: 40,\n chnl: 15,\n x: 451,\n y: 308,\n page: 0\n },\n {\n id: 43,\n index: 15,\n char: \"+\",\n width: 43,\n height: 45,\n xoffset: 1,\n yoffset: 15,\n xadvance: 45,\n chnl: 15,\n x: 152,\n y: 467,\n page: 0\n },\n {\n id: 95,\n index: 67,\n char: \"_\",\n width: 40,\n height: 10,\n xoffset: -2,\n yoffset: 62,\n xadvance: 36,\n chnl: 15,\n x: 29,\n y: 467,\n page: 0\n },\n {\n id: 60,\n index: 32,\n char: \"<\",\n width: 36,\n height: 39,\n xoffset: 1,\n yoffset: 19,\n xadvance: 41,\n chnl: 15,\n x: 248,\n y: 126,\n page: 0\n },\n {\n id: 62,\n index: 34,\n char: \">\",\n width: 37,\n height: 39,\n xoffset: 3,\n yoffset: 19,\n xadvance: 42,\n chnl: 15,\n x: 111,\n y: 471,\n page: 0\n },\n {\n id: 42,\n index: 14,\n char: \"*\",\n width: 36,\n height: 37,\n xoffset: -1,\n yoffset: 5,\n xadvance: 34,\n chnl: 15,\n x: 311,\n y: 250,\n page: 0\n },\n {\n id: 61,\n index: 33,\n char: \"=\",\n width: 37,\n height: 27,\n xoffset: 4,\n yoffset: 24,\n xadvance: 44,\n chnl: 15,\n x: 70,\n y: 474,\n page: 0\n },\n {\n id: 171,\n index: 109,\n char: \"«\",\n width: 34,\n height: 35,\n xoffset: 2,\n yoffset: 25,\n xadvance: 38,\n chnl: 15,\n x: 196,\n y: 467,\n page: 0\n },\n {\n id: 94,\n index: 66,\n char: \"^\",\n width: 32,\n height: 32,\n xoffset: 1,\n yoffset: 5,\n xadvance: 33,\n chnl: 15,\n x: 434,\n y: 124,\n page: 0\n },\n {\n id: 44,\n index: 16,\n char: \",\",\n width: 15,\n height: 24,\n xoffset: -1,\n yoffset: 53,\n xadvance: 16,\n chnl: 15,\n x: 207,\n y: 0,\n page: 0\n },\n {\n id: 34,\n index: 6,\n char: '\"',\n width: 20,\n height: 23,\n xoffset: 3,\n yoffset: 2,\n xadvance: 26,\n chnl: 15,\n x: 490,\n y: 308,\n page: 0\n },\n {\n id: 39,\n index: 11,\n char: \"'\",\n width: 10,\n height: 23,\n xoffset: 2,\n yoffset: 2,\n xadvance: 14,\n chnl: 15,\n x: 26,\n y: 151,\n page: 0\n },\n {\n id: 45,\n index: 17,\n char: \"-\",\n width: 23,\n height: 10,\n xoffset: -1,\n yoffset: 35,\n xadvance: 22,\n chnl: 15,\n x: 311,\n y: 288,\n page: 0\n },\n {\n id: 96,\n index: 68,\n char: \"`\",\n width: 20,\n height: 15,\n xoffset: 0,\n yoffset: 2,\n xadvance: 25,\n chnl: 15,\n x: 490,\n y: 332,\n page: 0\n },\n {\n id: 46,\n index: 18,\n char: \".\",\n width: 13,\n height: 13,\n xoffset: 4,\n yoffset: 54,\n xadvance: 21,\n chnl: 15,\n x: 427,\n y: 234,\n page: 0\n },\n {\n id: 32,\n index: 4,\n char: \" \",\n width: 0,\n height: 0,\n xoffset: -2,\n yoffset: 62,\n xadvance: 20,\n chnl: 15,\n x: 124,\n y: 131,\n page: 0\n }\n], qR = {\n face: \"Roboto-Regular\",\n size: 80,\n bold: 0,\n italic: 0,\n charset: [\n \"«\",\n \"¢\",\n \"£\",\n \"¤\",\n \"¥\",\n \"¡\",\n \"!\",\n \"\\\\\",\n '\"',\n \"#\",\n \"$\",\n \"%\",\n \"&\",\n \"'\",\n \"(\",\n \")\",\n \"*\",\n \"+\",\n \",\",\n \"-\",\n \".\",\n \"/\",\n \"0\",\n \"1\",\n \"2\",\n \"3\",\n \"4\",\n \"5\",\n \"6\",\n \"7\",\n \"8\",\n \"9\",\n \":\",\n \";\",\n \"<\",\n \"=\",\n \">\",\n \"?\",\n \"@\",\n \"A\",\n \"B\",\n \"C\",\n \"D\",\n \"E\",\n \"F\",\n \"G\",\n \"H\",\n \"I\",\n \"J\",\n \"K\",\n \"L\",\n \"M\",\n \"N\",\n \"O\",\n \"P\",\n \"Q\",\n \"R\",\n \"S\",\n \"T\",\n \"U\",\n \"V\",\n \"W\",\n \"X\",\n \"Y\",\n \"Z\",\n \"[\",\n \"]\",\n \"^\",\n \"_\",\n \"`\",\n \"a\",\n \"b\",\n \"c\",\n \"d\",\n \"e\",\n \"f\",\n \"g\",\n \"h\",\n \"i\",\n \"j\",\n \"k\",\n \"l\",\n \"m\",\n \"n\",\n \"o\",\n \"p\",\n \"q\",\n \"r\",\n \"s\",\n \"t\",\n \"u\",\n \"v\",\n \"w\",\n \"x\",\n \"y\",\n \"z\",\n \"{\",\n \"|\",\n \"}\",\n \"~\",\n \" \"\n ],\n unicode: 1,\n stretchH: 100,\n smooth: 1,\n aa: 1,\n padding: [\n 2,\n 2,\n 2,\n 2\n ],\n spacing: [\n 0,\n 0\n ]\n}, YR = {\n lineHeight: 84,\n base: 62,\n scaleW: 512,\n scaleH: 512,\n pages: 1,\n packed: 0,\n alphaChnl: 0,\n redChnl: 0,\n greenChnl: 0,\n blueChnl: 0\n}, ZR = {\n fieldType: \"msdf\",\n distanceRange: 4\n}, jR = [\n {\n first: 34,\n second: 34,\n amount: -4\n },\n {\n first: 34,\n second: 39,\n amount: -4\n },\n {\n first: 34,\n second: 65,\n amount: -5\n },\n {\n first: 34,\n second: 97,\n amount: -2\n },\n {\n first: 34,\n second: 99,\n amount: -2\n },\n {\n first: 34,\n second: 100,\n amount: -2\n },\n {\n first: 34,\n second: 101,\n amount: -2\n },\n {\n first: 34,\n second: 103,\n amount: -2\n },\n {\n first: 34,\n second: 109,\n amount: -1\n },\n {\n first: 34,\n second: 110,\n amount: -1\n },\n {\n first: 34,\n second: 111,\n amount: -2\n },\n {\n first: 34,\n second: 112,\n amount: -1\n },\n {\n first: 34,\n second: 113,\n amount: -2\n },\n {\n first: 34,\n second: 115,\n amount: -3\n },\n {\n first: 34,\n second: 119,\n amount: 0\n },\n {\n first: 39,\n second: 34,\n amount: -4\n },\n {\n first: 39,\n second: 39,\n amount: -4\n },\n {\n first: 39,\n second: 65,\n amount: -5\n },\n {\n first: 39,\n second: 97,\n amount: -2\n },\n {\n first: 39,\n second: 99,\n amount: -2\n },\n {\n first: 39,\n second: 100,\n amount: -2\n },\n {\n first: 39,\n second: 101,\n amount: -2\n },\n {\n first: 39,\n second: 103,\n amount: -2\n },\n {\n first: 39,\n second: 109,\n amount: -1\n },\n {\n first: 39,\n second: 110,\n amount: -1\n },\n {\n first: 39,\n second: 111,\n amount: -2\n },\n {\n first: 39,\n second: 112,\n amount: -1\n },\n {\n first: 39,\n second: 113,\n amount: -2\n },\n {\n first: 39,\n second: 115,\n amount: -3\n },\n {\n first: 39,\n second: 119,\n amount: 0\n },\n {\n first: 40,\n second: 86,\n amount: 1\n },\n {\n first: 40,\n second: 87,\n amount: 1\n },\n {\n first: 40,\n second: 89,\n amount: 1\n },\n {\n first: 44,\n second: 34,\n amount: -7\n },\n {\n first: 44,\n second: 39,\n amount: -7\n },\n {\n first: 46,\n second: 34,\n amount: -7\n },\n {\n first: 46,\n second: 39,\n amount: -7\n },\n {\n first: 47,\n second: 47,\n amount: -9\n },\n {\n first: 65,\n second: 34,\n amount: -5\n },\n {\n first: 65,\n second: 39,\n amount: -5\n },\n {\n first: 65,\n second: 63,\n amount: -2\n },\n {\n first: 65,\n second: 67,\n amount: 0\n },\n {\n first: 65,\n second: 71,\n amount: 0\n },\n {\n first: 65,\n second: 79,\n amount: 0\n },\n {\n first: 65,\n second: 81,\n amount: 0\n },\n {\n first: 65,\n second: 84,\n amount: -5\n },\n {\n first: 65,\n second: 85,\n amount: -1\n },\n {\n first: 65,\n second: 86,\n amount: -3\n },\n {\n first: 65,\n second: 87,\n amount: -3\n },\n {\n first: 65,\n second: 89,\n amount: -4\n },\n {\n first: 65,\n second: 111,\n amount: 0\n },\n {\n first: 65,\n second: 116,\n amount: -1\n },\n {\n first: 65,\n second: 117,\n amount: 0\n },\n {\n first: 65,\n second: 118,\n amount: -2\n },\n {\n first: 65,\n second: 119,\n amount: -1\n },\n {\n first: 65,\n second: 121,\n amount: -2\n },\n {\n first: 65,\n second: 122,\n amount: 0\n },\n {\n first: 66,\n second: 84,\n amount: -1\n },\n {\n first: 66,\n second: 86,\n amount: -1\n },\n {\n first: 66,\n second: 89,\n amount: -2\n },\n {\n first: 67,\n second: 41,\n amount: -1\n },\n {\n first: 67,\n second: 84,\n amount: -1\n },\n {\n first: 67,\n second: 93,\n amount: 0\n },\n {\n first: 67,\n second: 125,\n amount: -1\n },\n {\n first: 68,\n second: 44,\n amount: -4\n },\n {\n first: 68,\n second: 46,\n amount: -4\n },\n {\n first: 68,\n second: 65,\n amount: -1\n },\n {\n first: 68,\n second: 84,\n amount: -1\n },\n {\n first: 68,\n second: 86,\n amount: -1\n },\n {\n first: 68,\n second: 88,\n amount: -1\n },\n {\n first: 68,\n second: 89,\n amount: -2\n },\n {\n first: 68,\n second: 90,\n amount: -1\n },\n {\n first: 69,\n second: 84,\n amount: 1\n },\n {\n first: 69,\n second: 99,\n amount: -1\n },\n {\n first: 69,\n second: 100,\n amount: -1\n },\n {\n first: 69,\n second: 101,\n amount: -1\n },\n {\n first: 69,\n second: 102,\n amount: -1\n },\n {\n first: 69,\n second: 103,\n amount: -1\n },\n {\n first: 69,\n second: 111,\n amount: -1\n },\n {\n first: 69,\n second: 113,\n amount: -1\n },\n {\n first: 69,\n second: 117,\n amount: -1\n },\n {\n first: 69,\n second: 118,\n amount: -1\n },\n {\n first: 69,\n second: 119,\n amount: -1\n },\n {\n first: 69,\n second: 121,\n amount: -1\n },\n {\n first: 70,\n second: 44,\n amount: -9\n },\n {\n first: 70,\n second: 46,\n amount: -9\n },\n {\n first: 70,\n second: 65,\n amount: -7\n },\n {\n first: 70,\n second: 74,\n amount: -10\n },\n {\n first: 70,\n second: 84,\n amount: 1\n },\n {\n first: 70,\n second: 97,\n amount: -1\n },\n {\n first: 70,\n second: 99,\n amount: -1\n },\n {\n first: 70,\n second: 100,\n amount: -1\n },\n {\n first: 70,\n second: 101,\n amount: -1\n },\n {\n first: 70,\n second: 103,\n amount: -1\n },\n {\n first: 70,\n second: 111,\n amount: -1\n },\n {\n first: 70,\n second: 113,\n amount: -1\n },\n {\n first: 70,\n second: 114,\n amount: -1\n },\n {\n first: 70,\n second: 117,\n amount: -1\n },\n {\n first: 70,\n second: 118,\n amount: -1\n },\n {\n first: 70,\n second: 121,\n amount: -1\n },\n {\n first: 72,\n second: 65,\n amount: 1\n },\n {\n first: 72,\n second: 84,\n amount: -1\n },\n {\n first: 72,\n second: 88,\n amount: 1\n },\n {\n first: 72,\n second: 89,\n amount: -1\n },\n {\n first: 73,\n second: 65,\n amount: 1\n },\n {\n first: 73,\n second: 84,\n amount: -1\n },\n {\n first: 73,\n second: 88,\n amount: 1\n },\n {\n first: 73,\n second: 89,\n amount: -1\n },\n {\n first: 74,\n second: 65,\n amount: -1\n },\n {\n first: 75,\n second: 45,\n amount: -2\n },\n {\n first: 75,\n second: 67,\n amount: -1\n },\n {\n first: 75,\n second: 71,\n amount: -1\n },\n {\n first: 75,\n second: 79,\n amount: -1\n },\n {\n first: 75,\n second: 81,\n amount: -1\n },\n {\n first: 75,\n second: 99,\n amount: -1\n },\n {\n first: 75,\n second: 100,\n amount: -1\n },\n {\n first: 75,\n second: 101,\n amount: -1\n },\n {\n first: 75,\n second: 103,\n amount: -1\n },\n {\n first: 75,\n second: 109,\n amount: -1\n },\n {\n first: 75,\n second: 110,\n amount: -1\n },\n {\n first: 75,\n second: 111,\n amount: -1\n },\n {\n first: 75,\n second: 112,\n amount: -1\n },\n {\n first: 75,\n second: 113,\n amount: -1\n },\n {\n first: 75,\n second: 117,\n amount: -1\n },\n {\n first: 75,\n second: 118,\n amount: -2\n },\n {\n first: 75,\n second: 119,\n amount: -2\n },\n {\n first: 75,\n second: 121,\n amount: -2\n },\n {\n first: 76,\n second: 34,\n amount: -13\n },\n {\n first: 76,\n second: 39,\n amount: -13\n },\n {\n first: 76,\n second: 65,\n amount: 1\n },\n {\n first: 76,\n second: 67,\n amount: -3\n },\n {\n first: 76,\n second: 71,\n amount: -3\n },\n {\n first: 76,\n second: 79,\n amount: -3\n },\n {\n first: 76,\n second: 81,\n amount: -3\n },\n {\n first: 76,\n second: 84,\n amount: -11\n },\n {\n first: 76,\n second: 85,\n amount: -2\n },\n {\n first: 76,\n second: 86,\n amount: -7\n },\n {\n first: 76,\n second: 87,\n amount: -6\n },\n {\n first: 76,\n second: 89,\n amount: -9\n },\n {\n first: 76,\n second: 117,\n amount: -2\n },\n {\n first: 76,\n second: 118,\n amount: -5\n },\n {\n first: 76,\n second: 119,\n amount: -4\n },\n {\n first: 76,\n second: 121,\n amount: -5\n },\n {\n first: 77,\n second: 65,\n amount: 1\n },\n {\n first: 77,\n second: 84,\n amount: -1\n },\n {\n first: 77,\n second: 88,\n amount: 1\n },\n {\n first: 77,\n second: 89,\n amount: -1\n },\n {\n first: 78,\n second: 65,\n amount: 1\n },\n {\n first: 78,\n second: 84,\n amount: -1\n },\n {\n first: 78,\n second: 88,\n amount: 1\n },\n {\n first: 78,\n second: 89,\n amount: -1\n },\n {\n first: 79,\n second: 44,\n amount: -4\n },\n {\n first: 79,\n second: 46,\n amount: -4\n },\n {\n first: 79,\n second: 65,\n amount: -1\n },\n {\n first: 79,\n second: 84,\n amount: -1\n },\n {\n first: 79,\n second: 86,\n amount: -1\n },\n {\n first: 79,\n second: 88,\n amount: -1\n },\n {\n first: 79,\n second: 89,\n amount: -2\n },\n {\n first: 79,\n second: 90,\n amount: -1\n },\n {\n first: 80,\n second: 44,\n amount: -13\n },\n {\n first: 80,\n second: 46,\n amount: -13\n },\n {\n first: 80,\n second: 65,\n amount: -5\n },\n {\n first: 80,\n second: 74,\n amount: -8\n },\n {\n first: 80,\n second: 88,\n amount: -1\n },\n {\n first: 80,\n second: 90,\n amount: -1\n },\n {\n first: 80,\n second: 97,\n amount: 0\n },\n {\n first: 80,\n second: 99,\n amount: -1\n },\n {\n first: 80,\n second: 100,\n amount: -1\n },\n {\n first: 80,\n second: 101,\n amount: -1\n },\n {\n first: 80,\n second: 103,\n amount: -1\n },\n {\n first: 80,\n second: 111,\n amount: -1\n },\n {\n first: 80,\n second: 113,\n amount: -1\n },\n {\n first: 80,\n second: 116,\n amount: 1\n },\n {\n first: 80,\n second: 118,\n amount: 1\n },\n {\n first: 80,\n second: 121,\n amount: 1\n },\n {\n first: 81,\n second: 84,\n amount: -2\n },\n {\n first: 81,\n second: 86,\n amount: -1\n },\n {\n first: 81,\n second: 87,\n amount: -1\n },\n {\n first: 81,\n second: 89,\n amount: -1\n },\n {\n first: 82,\n second: 84,\n amount: -3\n },\n {\n first: 82,\n second: 86,\n amount: -1\n },\n {\n first: 82,\n second: 89,\n amount: -2\n },\n {\n first: 84,\n second: 171,\n amount: -13\n },\n {\n first: 84,\n second: 44,\n amount: -9\n },\n {\n first: 84,\n second: 45,\n amount: -9\n },\n {\n first: 84,\n second: 46,\n amount: -9\n },\n {\n first: 84,\n second: 65,\n amount: -3\n },\n {\n first: 84,\n second: 67,\n amount: -1\n },\n {\n first: 84,\n second: 71,\n amount: -1\n },\n {\n first: 84,\n second: 74,\n amount: -9\n },\n {\n first: 84,\n second: 79,\n amount: -1\n },\n {\n first: 84,\n second: 81,\n amount: -1\n },\n {\n first: 84,\n second: 83,\n amount: -1\n },\n {\n first: 84,\n second: 84,\n amount: 1\n },\n {\n first: 84,\n second: 86,\n amount: 1\n },\n {\n first: 84,\n second: 87,\n amount: 1\n },\n {\n first: 84,\n second: 89,\n amount: 1\n },\n {\n first: 84,\n second: 97,\n amount: -4\n },\n {\n first: 84,\n second: 99,\n amount: -4\n },\n {\n first: 84,\n second: 100,\n amount: -4\n },\n {\n first: 84,\n second: 101,\n amount: -4\n },\n {\n first: 84,\n second: 103,\n amount: -4\n },\n {\n first: 84,\n second: 109,\n amount: -4\n },\n {\n first: 84,\n second: 110,\n amount: -4\n },\n {\n first: 84,\n second: 111,\n amount: -4\n },\n {\n first: 84,\n second: 112,\n amount: -4\n },\n {\n first: 84,\n second: 113,\n amount: -4\n },\n {\n first: 84,\n second: 114,\n amount: -3\n },\n {\n first: 84,\n second: 115,\n amount: -5\n },\n {\n first: 84,\n second: 117,\n amount: -4\n },\n {\n first: 84,\n second: 118,\n amount: -3\n },\n {\n first: 84,\n second: 119,\n amount: -2\n },\n {\n first: 84,\n second: 120,\n amount: -3\n },\n {\n first: 84,\n second: 121,\n amount: -3\n },\n {\n first: 84,\n second: 122,\n amount: -2\n },\n {\n first: 84,\n second: 32,\n amount: -2\n },\n {\n first: 85,\n second: 65,\n amount: -1\n },\n {\n first: 86,\n second: 41,\n amount: 1\n },\n {\n first: 86,\n second: 44,\n amount: -9\n },\n {\n first: 86,\n second: 45,\n amount: -1\n },\n {\n first: 86,\n second: 46,\n amount: -9\n },\n {\n first: 86,\n second: 65,\n amount: -3\n },\n {\n first: 86,\n second: 67,\n amount: -1\n },\n {\n first: 86,\n second: 71,\n amount: -1\n },\n {\n first: 86,\n second: 79,\n amount: -1\n },\n {\n first: 86,\n second: 81,\n amount: -1\n },\n {\n first: 86,\n second: 93,\n amount: 1\n },\n {\n first: 86,\n second: 97,\n amount: -2\n },\n {\n first: 86,\n second: 99,\n amount: -2\n },\n {\n first: 86,\n second: 100,\n amount: -2\n },\n {\n first: 86,\n second: 101,\n amount: -2\n },\n {\n first: 86,\n second: 103,\n amount: -2\n },\n {\n first: 86,\n second: 111,\n amount: -2\n },\n {\n first: 86,\n second: 113,\n amount: -2\n },\n {\n first: 86,\n second: 114,\n amount: -1\n },\n {\n first: 86,\n second: 117,\n amount: -1\n },\n {\n first: 86,\n second: 118,\n amount: 0\n },\n {\n first: 86,\n second: 121,\n amount: 0\n },\n {\n first: 86,\n second: 125,\n amount: 1\n },\n {\n first: 87,\n second: 41,\n amount: 1\n },\n {\n first: 87,\n second: 44,\n amount: -5\n },\n {\n first: 87,\n second: 45,\n amount: -2\n },\n {\n first: 87,\n second: 46,\n amount: -5\n },\n {\n first: 87,\n second: 65,\n amount: -2\n },\n {\n first: 87,\n second: 84,\n amount: 1\n },\n {\n first: 87,\n second: 93,\n amount: 0\n },\n {\n first: 87,\n second: 97,\n amount: -1\n },\n {\n first: 87,\n second: 99,\n amount: -1\n },\n {\n first: 87,\n second: 100,\n amount: -1\n },\n {\n first: 87,\n second: 101,\n amount: -1\n },\n {\n first: 87,\n second: 103,\n amount: -1\n },\n {\n first: 87,\n second: 111,\n amount: -1\n },\n {\n first: 87,\n second: 113,\n amount: -1\n },\n {\n first: 87,\n second: 114,\n amount: -1\n },\n {\n first: 87,\n second: 117,\n amount: -1\n },\n {\n first: 87,\n second: 125,\n amount: 1\n },\n {\n first: 88,\n second: 45,\n amount: -2\n },\n {\n first: 88,\n second: 67,\n amount: -1\n },\n {\n first: 88,\n second: 71,\n amount: -1\n },\n {\n first: 88,\n second: 79,\n amount: -1\n },\n {\n first: 88,\n second: 81,\n amount: -1\n },\n {\n first: 88,\n second: 86,\n amount: 1\n },\n {\n first: 88,\n second: 99,\n amount: -1\n },\n {\n first: 88,\n second: 100,\n amount: -1\n },\n {\n first: 88,\n second: 101,\n amount: -1\n },\n {\n first: 88,\n second: 103,\n amount: -1\n },\n {\n first: 88,\n second: 111,\n amount: -1\n },\n {\n first: 88,\n second: 113,\n amount: -1\n },\n {\n first: 88,\n second: 117,\n amount: -1\n },\n {\n first: 88,\n second: 118,\n amount: -1\n },\n {\n first: 88,\n second: 121,\n amount: -1\n },\n {\n first: 89,\n second: 171,\n amount: -3\n },\n {\n first: 89,\n second: 38,\n amount: -1\n },\n {\n first: 89,\n second: 41,\n amount: 1\n },\n {\n first: 89,\n second: 42,\n amount: -2\n },\n {\n first: 89,\n second: 44,\n amount: -8\n },\n {\n first: 89,\n second: 45,\n amount: -2\n },\n {\n first: 89,\n second: 46,\n amount: -8\n },\n {\n first: 89,\n second: 65,\n amount: -4\n },\n {\n first: 89,\n second: 67,\n amount: -1\n },\n {\n first: 89,\n second: 71,\n amount: -1\n },\n {\n first: 89,\n second: 74,\n amount: -4\n },\n {\n first: 89,\n second: 79,\n amount: -1\n },\n {\n first: 89,\n second: 81,\n amount: -1\n },\n {\n first: 89,\n second: 83,\n amount: -1\n },\n {\n first: 89,\n second: 84,\n amount: 1\n },\n {\n first: 89,\n second: 85,\n amount: -4\n },\n {\n first: 89,\n second: 86,\n amount: 1\n },\n {\n first: 89,\n second: 87,\n amount: 1\n },\n {\n first: 89,\n second: 88,\n amount: 1\n },\n {\n first: 89,\n second: 89,\n amount: 1\n },\n {\n first: 89,\n second: 93,\n amount: 1\n },\n {\n first: 89,\n second: 97,\n amount: -3\n },\n {\n first: 89,\n second: 99,\n amount: -3\n },\n {\n first: 89,\n second: 100,\n amount: -3\n },\n {\n first: 89,\n second: 101,\n amount: -3\n },\n {\n first: 89,\n second: 102,\n amount: -1\n },\n {\n first: 89,\n second: 103,\n amount: -3\n },\n {\n first: 89,\n second: 109,\n amount: -2\n },\n {\n first: 89,\n second: 110,\n amount: -2\n },\n {\n first: 89,\n second: 111,\n amount: -3\n },\n {\n first: 89,\n second: 112,\n amount: -2\n },\n {\n first: 89,\n second: 113,\n amount: -3\n },\n {\n first: 89,\n second: 114,\n amount: -2\n },\n {\n first: 89,\n second: 115,\n amount: -2\n },\n {\n first: 89,\n second: 116,\n amount: -1\n },\n {\n first: 89,\n second: 117,\n amount: -2\n },\n {\n first: 89,\n second: 118,\n amount: -1\n },\n {\n first: 89,\n second: 120,\n amount: -1\n },\n {\n first: 89,\n second: 121,\n amount: -1\n },\n {\n first: 89,\n second: 122,\n amount: -1\n },\n {\n first: 89,\n second: 125,\n amount: 1\n },\n {\n first: 90,\n second: 65,\n amount: 1\n },\n {\n first: 90,\n second: 67,\n amount: -1\n },\n {\n first: 90,\n second: 71,\n amount: -1\n },\n {\n first: 90,\n second: 79,\n amount: -1\n },\n {\n first: 90,\n second: 81,\n amount: -1\n },\n {\n first: 90,\n second: 99,\n amount: -1\n },\n {\n first: 90,\n second: 100,\n amount: -1\n },\n {\n first: 90,\n second: 101,\n amount: -1\n },\n {\n first: 90,\n second: 103,\n amount: -1\n },\n {\n first: 90,\n second: 111,\n amount: -1\n },\n {\n first: 90,\n second: 113,\n amount: -1\n },\n {\n first: 90,\n second: 117,\n amount: -1\n },\n {\n first: 90,\n second: 118,\n amount: -1\n },\n {\n first: 90,\n second: 119,\n amount: -1\n },\n {\n first: 90,\n second: 121,\n amount: -1\n },\n {\n first: 91,\n second: 74,\n amount: -1\n },\n {\n first: 91,\n second: 85,\n amount: -1\n },\n {\n first: 97,\n second: 34,\n amount: -3\n },\n {\n first: 97,\n second: 39,\n amount: -3\n },\n {\n first: 97,\n second: 118,\n amount: -1\n },\n {\n first: 97,\n second: 121,\n amount: -1\n },\n {\n first: 98,\n second: 34,\n amount: -1\n },\n {\n first: 98,\n second: 39,\n amount: -1\n },\n {\n first: 98,\n second: 118,\n amount: 0\n },\n {\n first: 98,\n second: 120,\n amount: -1\n },\n {\n first: 98,\n second: 121,\n amount: 0\n },\n {\n first: 98,\n second: 122,\n amount: -1\n },\n {\n first: 99,\n second: 34,\n amount: 0\n },\n {\n first: 99,\n second: 39,\n amount: 0\n },\n {\n first: 101,\n second: 34,\n amount: -1\n },\n {\n first: 101,\n second: 39,\n amount: -1\n },\n {\n first: 101,\n second: 118,\n amount: -1\n },\n {\n first: 101,\n second: 121,\n amount: -1\n },\n {\n first: 102,\n second: 34,\n amount: 1\n },\n {\n first: 102,\n second: 39,\n amount: 1\n },\n {\n first: 102,\n second: 41,\n amount: 1\n },\n {\n first: 102,\n second: 93,\n amount: 1\n },\n {\n first: 102,\n second: 99,\n amount: -1\n },\n {\n first: 102,\n second: 100,\n amount: -1\n },\n {\n first: 102,\n second: 101,\n amount: -1\n },\n {\n first: 102,\n second: 103,\n amount: -1\n },\n {\n first: 102,\n second: 113,\n amount: -1\n },\n {\n first: 102,\n second: 125,\n amount: 1\n },\n {\n first: 104,\n second: 34,\n amount: -4\n },\n {\n first: 104,\n second: 39,\n amount: -4\n },\n {\n first: 107,\n second: 99,\n amount: -1\n },\n {\n first: 107,\n second: 100,\n amount: -1\n },\n {\n first: 107,\n second: 101,\n amount: -1\n },\n {\n first: 107,\n second: 103,\n amount: -1\n },\n {\n first: 107,\n second: 113,\n amount: -1\n },\n {\n first: 109,\n second: 34,\n amount: -4\n },\n {\n first: 109,\n second: 39,\n amount: -4\n },\n {\n first: 110,\n second: 34,\n amount: -4\n },\n {\n first: 110,\n second: 39,\n amount: -4\n },\n {\n first: 111,\n second: 34,\n amount: -5\n },\n {\n first: 111,\n second: 39,\n amount: -5\n },\n {\n first: 111,\n second: 118,\n amount: -1\n },\n {\n first: 111,\n second: 120,\n amount: -1\n },\n {\n first: 111,\n second: 121,\n amount: -1\n },\n {\n first: 111,\n second: 122,\n amount: -1\n },\n {\n first: 112,\n second: 34,\n amount: -1\n },\n {\n first: 112,\n second: 39,\n amount: -1\n },\n {\n first: 112,\n second: 118,\n amount: 0\n },\n {\n first: 112,\n second: 120,\n amount: -1\n },\n {\n first: 112,\n second: 121,\n amount: 0\n },\n {\n first: 112,\n second: 122,\n amount: -1\n },\n {\n first: 114,\n second: 34,\n amount: 1\n },\n {\n first: 114,\n second: 39,\n amount: 1\n },\n {\n first: 114,\n second: 44,\n amount: -5\n },\n {\n first: 114,\n second: 46,\n amount: -5\n },\n {\n first: 114,\n second: 97,\n amount: -2\n },\n {\n first: 114,\n second: 99,\n amount: -1\n },\n {\n first: 114,\n second: 100,\n amount: -1\n },\n {\n first: 114,\n second: 101,\n amount: -1\n },\n {\n first: 114,\n second: 102,\n amount: 1\n },\n {\n first: 114,\n second: 103,\n amount: -1\n },\n {\n first: 114,\n second: 111,\n amount: -1\n },\n {\n first: 114,\n second: 113,\n amount: -1\n },\n {\n first: 114,\n second: 116,\n amount: 2\n },\n {\n first: 114,\n second: 118,\n amount: 1\n },\n {\n first: 114,\n second: 119,\n amount: 1\n },\n {\n first: 114,\n second: 121,\n amount: 1\n },\n {\n first: 116,\n second: 111,\n amount: -1\n },\n {\n first: 118,\n second: 34,\n amount: 1\n },\n {\n first: 118,\n second: 39,\n amount: 1\n },\n {\n first: 118,\n second: 44,\n amount: -4\n },\n {\n first: 118,\n second: 46,\n amount: -4\n },\n {\n first: 118,\n second: 97,\n amount: -1\n },\n {\n first: 118,\n second: 99,\n amount: -1\n },\n {\n first: 118,\n second: 100,\n amount: -1\n },\n {\n first: 118,\n second: 101,\n amount: -1\n },\n {\n first: 118,\n second: 102,\n amount: 1\n },\n {\n first: 118,\n second: 103,\n amount: -1\n },\n {\n first: 118,\n second: 111,\n amount: -1\n },\n {\n first: 118,\n second: 113,\n amount: -1\n },\n {\n first: 119,\n second: 44,\n amount: -5\n },\n {\n first: 119,\n second: 46,\n amount: -5\n },\n {\n first: 120,\n second: 99,\n amount: -1\n },\n {\n first: 120,\n second: 100,\n amount: -1\n },\n {\n first: 120,\n second: 101,\n amount: -1\n },\n {\n first: 120,\n second: 103,\n amount: -1\n },\n {\n first: 120,\n second: 111,\n amount: -1\n },\n {\n first: 120,\n second: 113,\n amount: -1\n },\n {\n first: 121,\n second: 34,\n amount: 1\n },\n {\n first: 121,\n second: 39,\n amount: 1\n },\n {\n first: 121,\n second: 44,\n amount: -4\n },\n {\n first: 121,\n second: 46,\n amount: -4\n },\n {\n first: 121,\n second: 97,\n amount: -1\n },\n {\n first: 121,\n second: 99,\n amount: -1\n },\n {\n first: 121,\n second: 100,\n amount: -1\n },\n {\n first: 121,\n second: 101,\n amount: -1\n },\n {\n first: 121,\n second: 102,\n amount: 1\n },\n {\n first: 121,\n second: 103,\n amount: -1\n },\n {\n first: 121,\n second: 111,\n amount: -1\n },\n {\n first: 121,\n second: 113,\n amount: -1\n },\n {\n first: 122,\n second: 99,\n amount: -1\n },\n {\n first: 122,\n second: 100,\n amount: -1\n },\n {\n first: 122,\n second: 101,\n amount: -1\n },\n {\n first: 122,\n second: 103,\n amount: -1\n },\n {\n first: 122,\n second: 111,\n amount: -1\n },\n {\n first: 122,\n second: 113,\n amount: -1\n },\n {\n first: 123,\n second: 74,\n amount: -1\n },\n {\n first: 123,\n second: 85,\n amount: -1\n },\n {\n first: 32,\n second: 84,\n amount: -2\n }\n], QR = {\n pages: HR,\n chars: KR,\n info: qR,\n common: YR,\n distanceField: ZR,\n kernings: jR\n}, S_ = \"data:image/png;base64,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QiAEQiAEH6OuJ3JeJ4eu96Xb7bp//77R0VEjIyMGBwf19vb6/PPPHRscHPTNN984c+aM5eVlaZra3Ny0t7fn6OhIPp9XLBYNDw8rl8smJydNTEx40d27d926dcudO3fcu3dPvV73sbl06ZJqtapWq7l8+bLp6WknNZtNs7OzfvOb35idnXXr1i137961vr7utLa3t927d8/y8rJWq2V7e1u73faDQqFgamrKscnJSZ999pksy6ytrVldXZWmqZeZWcKSD2TG29rAjD8dk//ZJL/Cr/Ar9Hvev8e/wa/xbw7IMu9i2e9MeifjxuX9I/wK/wi/9Lw9/Bq/xq8tL/8rQ78Y8rnruI7r+Pue928wgxl+M8PRkVf57hdeqajoC9dxHdfxn3jeX2MGM7777v/2dhaw62NR8C5yaHtnOzs7vv32W2maGhsbMzQ0JJfL2d/f12q1LCwsSNPUaR0cEALr64RACJRKnokioohSiShib08iEYvFYonEU90uWUaWkWVkmTfJMlotWi2yjGrVE8PDxDFxTBwzMsLmpkgkEolEIpHnhEAIhMD6uo9ZFzmvk0PX+7K2tub27duKxaLe3l7dble73Xb58mV9fX2OjY+PGx8fd3h4aGtry/7+vqOjI/l8Xn9/v+HhYT09PV50cHDg7t27bt26ZXZ21q1bt9y+fVuapj4m4+PjLly44OLFiy5duqRarTppZ2fH7du33bx50+zsrO+//97s7Kx2u+1dbG5u+u677xwcHOh2uwqFgmKxaGhoSKlUcqxarVpdXbW8vGxpacni4qKlpSUvevjwr/HX+Kfev4fe1sPv8T3+J38Sxlev+3IVq1jFOc8bwxjGMPYdWeZd/JXfue6djBnztTGMoeL3rWAFK8yu+KtlXGcKn3uD33ij7657rQl84Q1u8J23dRs5H4uCV+oi50M5ODhw9+5dd+/e1dfXJ5fLOTg40O12vYsQCIEQCIFSyTOlElFEFFEqsboqFkskYrFY7KksI8vIMrKM3V1v0mrRapFltFrs7VEseiKOiWPimDhmc1MkUlISiUQizwmBEAiBEHzsup7IeZWcJ7reh4cPHyoUCn7Qbrft7OxYX1934cIF09PTTurp6VEqlZzGwsKCubk59+/fd+fOHbdu3TI7O2tubs7HZnp62rlz55w/f96FCxcMDAw46f79++7evev27dtu3bpl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\", ys = ({ engine: n, data: e, kind: t, stride: i, mesh: r }) => {\n const s = new FR(n, e, t, !0, !1, i);\n r.setVerticesBuffer(s);\n}, JR = `\nprecision highp float; \n\nattribute vec3 position; \nattribute vec2 uv; \nattribute vec2 center; \n\nuniform mat4 worldViewProjection; \n\nvarying vec2 vUv;\nvarying vec2 vCenter; \n\nvoid main(void) { \n gl_Position = worldViewProjection * vec4(position, 1.0); \n vUv = uv; \n vCenter = center;\n}\n`, $R = `\nprecision highp float;\n\nvarying vec2 vUv; \nvarying vec2 vCenter; \n\nuniform sampler2D uFontAtlas;\n\nuniform vec3 uStrokeColor;\nuniform vec3 uColor;\n\nuniform float uThreshold;\nuniform float uStrokeOutsetWidth;\nuniform float uStrokeInsetWidth;\nuniform float uOpacity;\nuniform float uAlphaTest;\n\nuniform int uLinesTotal;\nuniform int uWordsTotal;\nuniform int uLettersTotal;\n\nfloat median(float r, float g, float b) {\n return max(min(r, g), min(max(r, g), b));\n}\n\n\nvoid main(void) { \n\n float thickness = 0.5;\n float softness = 0.5;\n\n vec3 s = texture2D(uFontAtlas, vUv).rgb;\n float sigDist = median(s.r, s.g, s.b) - 0.5;\n float afwidth = 1.4142135623730951 / 2.0;\n\n #ifdef IS_SMALL\n float alpha = smoothstep(uThreshold - afwidth, uThreshold + afwidth, sigDist);\n #else\n float alpha = clamp(sigDist / fwidth(sigDist) + 0.5, 0.0, 1.0);\n #endif\n \n float sigDistOutset = sigDist + uStrokeOutsetWidth * 0.5;\n \n // Inset\n float sigDistInset = sigDist - uStrokeInsetWidth * 0.5;\n \n #ifdef IS_SMALL\n float outset = smoothstep(uThreshold - afwidth, uThreshold + afwidth, sigDistOutset);\n float inset = 1.0 - smoothstep(uThreshold - afwidth, uThreshold + afwidth, sigDistInset);\n #else\n float outset = clamp(sigDistOutset / fwidth(sigDistOutset) + 0.5, 0.0, 1.0);\n float inset = 1.0 - clamp(sigDistInset / fwidth(sigDistInset) + 0.5, 0.0, 1.0);\n #endif\n \n float border = outset * inset;\n \n // Alpha Test\n if (alpha < uAlphaTest) discard;\n\n // Output: Common\n vec4 filledFragColor = vec4(uColor, uOpacity * alpha);\n \n // Output: Strokes\n vec4 strokedFragColor = vec4(uStrokeColor, uOpacity * border);\n \n gl_FragColor = filledFragColor; \n}\n`;\nfunction y_(n) {\n return n && n.__esModule && Object.prototype.hasOwnProperty.call(n, \"default\") ? n.default : n;\n}\nvar eS = function(n) {\n switch (n) {\n case \"int8\":\n return Int8Array;\n case \"int16\":\n return Int16Array;\n case \"int32\":\n return Int32Array;\n case \"uint8\":\n return Uint8Array;\n case \"uint16\":\n return Uint16Array;\n case \"uint32\":\n return Uint32Array;\n case \"float32\":\n return Float32Array;\n case \"float64\":\n return Float64Array;\n case \"array\":\n return Array;\n case \"uint8_clamped\":\n return Uint8ClampedArray;\n }\n}, tS = Object.prototype.toString, iS = rS;\nfunction rS(n) {\n return n.BYTES_PER_ELEMENT && tS.call(n.buffer) === \"[object ArrayBuffer]\" || Array.isArray(n);\n}\n/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\nvar sS = function(n) {\n return n != null && (I_(n) || nS(n) || !!n._isBuffer);\n};\nfunction I_(n) {\n return !!n.constructor && typeof n.constructor.isBuffer == \"function\" && n.constructor.isBuffer(n);\n}\nfunction nS(n) {\n return typeof n.readFloatLE == \"function\" && typeof n.slice == \"function\" && I_(n.slice(0, 0));\n}\nvar aS = eS, oS = iS, lS = sS, cS = [0, 2, 3], hS = [2, 1, 3], uS = function(n, e) {\n (!n || !(oS(n) || lS(n))) && (e = n || {}, n = null), typeof e == \"number\" ? e = { count: e } : e = e || {};\n for (var t = typeof e.type == \"string\" ? e.type : \"uint16\", i = typeof e.count == \"number\" ? e.count : 1, r = e.start || 0, s = e.clockwise !== !1 ? cS : hS, a = s[0], o = s[1], l = s[2], c = i * 6, h = n || new (aS(t))(c), u = 0, f = 0; u < c; u += 6, f += 4) {\n var d = u + r;\n h[d + 0] = f + 0, h[d + 1] = f + 1, h[d + 2] = f + 2, h[d + 3] = f + a, h[d + 4] = f + o, h[d + 5] = f + l;\n }\n return h;\n};\nconst fS = /* @__PURE__ */ y_(uS);\nvar b_ = { exports: {} };\n(function(n) {\n var e = /\\n/, t = `\n`, i = /\\s/;\n n.exports = function(c, h) {\n var u = n.exports.lines(c, h);\n return u.map(function(f) {\n return c.substring(f.start, f.end);\n }).join(`\n`);\n }, n.exports.lines = function(c, h) {\n if (h = h || {}, h.width === 0 && h.mode !== \"nowrap\")\n return [];\n c = c || \"\";\n var u = typeof h.width == \"number\" ? h.width : Number.MAX_VALUE, f = Math.max(0, h.start || 0), d = typeof h.end == \"number\" ? h.end : c.length, p = h.mode, g = h.measure || l;\n return p === \"pre\" ? a(g, c, f, d, u) : o(g, c, f, d, u, p);\n };\n function r(c, h, u, f) {\n var d = c.indexOf(h, u);\n return d === -1 || d > f ? f : d;\n }\n function s(c) {\n return i.test(c);\n }\n function a(c, h, u, f, d) {\n for (var p = [], g = u, m = u; m < f && m < h.length; m++) {\n var v = h.charAt(m), E = e.test(v);\n if (E || m === f - 1) {\n var C = E ? m : m + 1, T = c(h, g, C, d);\n p.push(T), g = m + 1;\n }\n }\n return p;\n }\n function o(c, h, u, f, d, p) {\n var g = [], m = d;\n for (p === \"nowrap\" && (m = Number.MAX_VALUE); u < f && u < h.length; ) {\n for (var v = r(h, t, u, f); u < v && s(h.charAt(u)); )\n u++;\n var E = c(h, u, v, m), C = u + (E.end - E.start), T = C + t.length;\n if (C < v) {\n for (; C > u && !s(h.charAt(C)); )\n C--;\n if (C === u)\n T > u + t.length && T--, C = T;\n else\n for (T = C; C > u && s(h.charAt(C - t.length)); )\n C--;\n }\n if (C >= u) {\n var R = c(h, u, C, m);\n g.push(R);\n }\n u = T;\n }\n return g;\n }\n function l(c, h, u, f) {\n var d = Math.min(f, u - h);\n return {\n start: h,\n end: h + d\n };\n }\n})(b_);\nvar dS = b_.exports;\nconst pS = /* @__PURE__ */ y_(dS), kp = [\n \"x\",\n \"e\",\n \"a\",\n \"o\",\n \"n\",\n \"s\",\n \"r\",\n \"c\",\n \"u\",\n \"m\",\n \"v\",\n \"w\",\n \"z\"\n], zp = [\"m\", \"w\"], Wp = [\n \"H\",\n \"I\",\n \"N\",\n \"E\",\n \"F\",\n \"K\",\n \"L\",\n \"T\",\n \"U\",\n \"V\",\n \"W\",\n \"X\",\n \"Y\",\n \"Z\"\n], Gp = 9, Ja = 32, gS = 0, A_ = 1, M_ = 2;\nclass mS {\n constructor(e = {}) {\n this.glyphs = [], this._measure = this.computeMetrics.bind(this), this.update(e);\n }\n /**\n * Getters\n */\n get width() {\n return this._width;\n }\n get height() {\n return this._height;\n }\n get descender() {\n return this._descender;\n }\n get ascender() {\n return this._ascender;\n }\n get xHeight() {\n return this._xHeight;\n }\n get baseline() {\n return this._baseline;\n }\n get capHeight() {\n return this._capHeight;\n }\n get lineHeight() {\n return this._lineHeight;\n }\n get linesTotal() {\n return this._linesTotal;\n }\n get lettersTotal() {\n return this._lettersTotal;\n }\n get wordsTotal() {\n return this._wordsTotal;\n }\n update(e) {\n if (e = Object.assign({ measure: this._measure }, e), this._options = e, this._options.tabSize = CS(this._options.tabSize, 4), !e.font)\n throw new Error(\"must provide a valid bitmap font\");\n const t = this.glyphs, i = e.text || \"\", r = e.font;\n this._setupSpaceGlyphs(r);\n const s = pS.lines(i, e), a = e.width || 0, o = i.split(\" \").filter((R) => R !== `\n`).length, l = i.split(\"\").filter((R) => R !== `\n` && R !== \" \").length;\n t.length = 0;\n const c = s.reduce(function(R, x) {\n return Math.max(R, x.width, a);\n }, 0);\n let h = 0, u = 0;\n const f = e.lineHeight ? e.lineHeight : 1, d = r.common.lineHeight * Math.max(f, 1), p = r.common.base, g = d - p, m = e.letterSpacing || 0, v = d * s.length - g, E = xS(this._options.align);\n u -= v, this._width = c, this._height = v, this._descender = d - p, this._baseline = p, this._xHeight = ES(r), this._capHeight = TS(r), this._lineHeight = d, this._ascender = d - g - this._xHeight;\n let C = 0, T = 0;\n s.forEach((R, x) => {\n const S = R.start, M = R.end, N = R.width, F = i.slice(S, M).split(\" \").filter((k) => k !== \"\").length, U = i.slice(S, M).split(\" \").join(\"\").length;\n let H = 0, q = 0, Z;\n for (let k = S; k < M; k++) {\n const Q = i.charCodeAt(k), ce = this.getGlyph(r, Q);\n if (ce) {\n Z && (h += Hp(r, Z.id, ce.id));\n let de = h;\n E === A_ ? de += (c - N) / 2 : E === M_ && (de += c - N), t.push({\n position: [de, u],\n data: ce,\n index: k,\n // Line\n linesTotal: s.length,\n lineIndex: x,\n lineLettersTotal: U,\n lineLetterIndex: H,\n lineWordsTotal: F,\n lineWordIndex: q,\n // Word\n wordsTotal: o,\n wordIndex: C,\n // Letter\n lettersTotal: l,\n letterIndex: T\n }), ce.id === Ja && Z.id !== Ja && (q++, C++), ce.id !== Ja && (H++, T++), h += ce.xadvance + m, Z = ce;\n }\n }\n u += d, h = 0;\n }), this._lettersTotal = l, this._wordsTotal = o, this._linesTotal = s.length;\n }\n getGlyph(e, t) {\n return Xp(e, t) || (t === Gp ? this._fallbackTabGlyph : t === Ja ? this._fallbackSpaceGlyph : null);\n }\n computeMetrics(e, t, i, r) {\n const s = this._options.letterSpacing || 0, a = this._options.font;\n let o = 0, l = 0, c = 0, h, u;\n if (!a.chars || a.chars.length === 0)\n return {\n start: t,\n end: t,\n width: 0\n };\n i = Math.min(e.length, i);\n for (let f = t; f < i; f++) {\n const d = e.charCodeAt(f);\n if (h = this.getGlyph(a, d), h) {\n h.char = e[f], h.xoffset;\n const p = u ? Hp(a, u.id, h.id) : 0;\n o += p;\n const g = o + h.xadvance + s, m = o + h.width;\n if (m >= r || g >= r)\n break;\n o = g, l = m, u = h;\n }\n c++;\n }\n return u && (l += u.xoffset), {\n start: t,\n end: t + c,\n width: l\n };\n }\n /**\n * Private\n */\n _setupSpaceGlyphs(e) {\n if (this._fallbackSpaceGlyph = null, this._fallbackTabGlyph = null, !e.chars || e.chars.length === 0)\n return;\n const t = Xp(e, Ja) || vS(e) || e.chars[0], i = this._options.tabSize * t.xadvance;\n this._fallbackSpaceGlyph = t;\n const r = Object.assign({}, t);\n this._fallbackTabGlyph = Object.assign(r, {\n x: 0,\n y: 0,\n xadvance: i,\n id: Gp,\n xoffset: 0,\n yoffset: 0,\n width: 0,\n height: 0\n });\n }\n}\nfunction _S(n) {\n return new mS(n);\n}\nfunction Xp(n, e) {\n if (!n.chars || n.chars.length === 0)\n return null;\n const t = Mc(n.chars, e);\n return t >= 0 ? n.chars[t] : null;\n}\nfunction ES(n) {\n for (let e = 0; e < kp.length; e++) {\n const t = kp[e].charCodeAt(0), i = Mc(n.chars, t);\n if (i >= 0)\n return n.chars[i].height;\n }\n return 0;\n}\nfunction vS(n) {\n for (let e = 0; e < zp.length; e++) {\n const t = zp[e].charCodeAt(0), i = Mc(n.chars, t);\n if (i >= 0)\n return n.chars[i];\n }\n return 0;\n}\nfunction TS(n) {\n for (let e = 0; e < Wp.length; e++) {\n const t = Wp[e].charCodeAt(0), i = Mc(n.chars, t);\n if (i >= 0)\n return n.chars[i].height;\n }\n return 0;\n}\nfunction Hp(n, e, t) {\n if (!n.kernings || n.kernings.length === 0)\n return 0;\n const i = n.kernings;\n for (let r = 0; r < i.length; r++) {\n const s = i[r];\n if (s.first === e && s.second === t)\n return s.amount;\n }\n return 0;\n}\nfunction xS(n) {\n return n === \"center\" ? A_ : n === \"right\" ? M_ : gS;\n}\nfunction Mc(n, e, t) {\n t = t || 0;\n for (let i = t; i < n.length; i++)\n if (n[i].id === e)\n return i;\n return -1;\n}\nfunction CS(n, e) {\n return typeof n == \"number\" ? n : typeof e == \"number\" ? e : 0;\n}\nfunction RS(n) {\n const e = new Float32Array(n.length * 4 * 1);\n let t = 0;\n return n.forEach(function(i) {\n const r = i.data.page || 0;\n e[t++] = r, e[t++] = r, e[t++] = r, e[t++] = r;\n }), e;\n}\nfunction SS(n, e, t, i, r) {\n const s = new Float32Array(n.length * 4 * 2), a = new Float32Array(n.length * 4 * 2), o = new Float32Array(n.length * 4 * 3), l = new Float32Array(n.length * 4 * 2);\n let c = 0, h = 0, u = 0, f = 0;\n return n.forEach(function(d) {\n const p = d.data, g = p.x + p.width, m = p.y + p.height, v = p.x / e;\n let E = p.y / t;\n const C = g / e;\n let T = m / t;\n i && (E = (t - p.y) / t, T = (t - m) / t), s[c++] = v, s[c++] = E, s[c++] = v, s[c++] = T, s[c++] = C, s[c++] = T, s[c++] = C, s[c++] = E, a[f++] = d.position[0] / r.width, a[f++] = (d.position[1] + r.height) / r.height, a[f++] = d.position[0] / r.width, a[f++] = (d.position[1] + r.height + p.height) / r.height, a[f++] = (d.position[0] + p.width) / r.width, a[f++] = (d.position[1] + r.height + p.height) / r.height, a[f++] = (d.position[0] + p.width) / r.width, a[f++] = (d.position[1] + r.height) / r.height;\n const R = d.position[0] + p.xoffset, x = d.position[1] + p.yoffset, S = 0, M = p.width, N = p.height;\n o[h++] = R, o[h++] = x, o[h++] = S, o[h++] = R, o[h++] = x + N, o[h++] = S, o[h++] = R + M, o[h++] = x + N, o[h++] = S, o[h++] = R + M, o[h++] = x, o[h++] = S, l[u++] = R + M / 2, l[u++] = x + N / 2, l[u++] = R + M / 2, l[u++] = x + N / 2, l[u++] = R + M / 2, l[u++] = x + N / 2, l[u++] = R + M / 2, l[u++] = x + N / 2;\n }), { uvs: s, layoutUvs: a, positions: o, centers: l };\n}\nfunction yS(n) {\n const e = new Float32Array(n.length * 4), t = new Float32Array(n.length * 4), i = new Float32Array(n.length * 4), r = new Float32Array(n.length * 4), s = new Float32Array(n.length * 4), a = new Float32Array(n.length * 4), o = new Float32Array(n.length * 4);\n let l, c, h, u = 0, f = 0, d = 0, p = 0, g = 0, m = 0, v = 0;\n for (let E = 0; E < n.length; E++) {\n const C = n[E];\n e[u++] = C.lineIndex, e[u++] = C.lineIndex, e[u++] = C.lineIndex, e[u++] = C.lineIndex, t[f++] = C.lineLettersTotal, t[f++] = C.lineLettersTotal, t[f++] = C.lineLettersTotal, t[f++] = C.lineLettersTotal, i[d++] = C.lineLetterIndex, i[d++] = C.lineLetterIndex, i[d++] = C.lineLetterIndex, i[d++] = C.lineLetterIndex, r[p++] = C.lineWordsTotal, r[p++] = C.lineWordsTotal, r[p++] = C.lineWordsTotal, r[p++] = C.lineWordsTotal, s[g++] = C.lineWordIndex, s[g++] = C.lineWordIndex, s[g++] = C.lineWordIndex, s[g++] = C.lineWordIndex, a[m++] = C.wordIndex, a[m++] = C.wordIndex, a[m++] = C.wordIndex, a[m++] = C.wordIndex, o[v++] = C.letterIndex, o[v++] = C.letterIndex, o[v++] = C.letterIndex, o[v++] = C.letterIndex, h = C.lettersTotal, l = C.wordsTotal, c = C.linesTotal;\n }\n return {\n linesTotal: c,\n lineIndex: e,\n lineLettersTotal: t,\n lineLetterIndex: i,\n lineWordsTotal: r,\n lineWordIndex: s,\n wordsTotal: l,\n wordIndex: a,\n lettersTotal: h,\n letterIndex: o\n };\n}\nconst Kp = {\n pages: RS,\n attributes: SS,\n infos: yS\n}, IS = ({\n color: n = new pi(0, 0, 0),\n stroke: e,\n strokeColor: t = new pi(0, 0, 0),\n opacity: i = 1,\n strokeWidth: r = 0.5,\n ...s\n}) => {\n const a = _S(s), o = s.font;\n s.engine && console.warn(\n \"Warning: The engine argument is no longer required and will be ignored.\"\n ), s.atlas instanceof Vl || console.warn(\n \"Please provide the atlas as texture instead of image so each text mesh won't have a seperate texture instance\"\n );\n const l = s.scene.getEngine(), c = o.common.scaleW, h = o.common.scaleH, u = a.glyphs.filter((x) => {\n const S = x.data;\n return S.width * S.height > 0;\n }), f = Kp.attributes(\n u,\n c,\n h,\n !0,\n a\n ), d = Kp.infos(u, a), p = fS([], {\n clockwise: !0,\n type: \"uint16\",\n count: u.length\n }), g = new Ji(s.text || \"text\", s.scene), m = new Up();\n m.positions = f.positions, m.indices = p, m.uvs = f.uvs;\n const v = [];\n Up.ComputeNormals(f.positions, p, v), m.normals = v, ys({\n engine: l,\n data: f.centers,\n kind: \"center\",\n stride: 2,\n mesh: g\n }), ys({\n engine: l,\n data: f.layoutUvs,\n kind: \"layoutUv\",\n stride: 2,\n mesh: g\n }), ys({\n engine: l,\n data: d.lineIndex,\n kind: \"lineIndex\",\n stride: 1,\n mesh: g\n }), ys({\n engine: l,\n data: d.lineLettersTotal,\n kind: \"lineLettersTotal\",\n stride: 1,\n mesh: g\n }), ys({\n engine: l,\n data: d.lineLetterIndex,\n kind: \"lineLetterIndex\",\n stride: 1,\n mesh: g\n }), ys({\n engine: l,\n data: d.lineWordsTotal,\n kind: \"lineWordsTotal\",\n stride: 1,\n mesh: g\n }), ys({\n engine: l,\n data: d.lineWordIndex,\n kind: \"lineWordIndex\",\n stride: 1,\n mesh: g\n }), ys({\n engine: l,\n data: d.wordIndex,\n kind: \"wordIndex\",\n stride: 1,\n mesh: g\n }), ys({\n engine: l,\n data: d.letterIndex,\n kind: \"letterIndex\",\n stride: 1,\n mesh: g\n }), m.applyToMesh(g), g.scaling = new Me(0.5, 0.5, 0.5), g.rotation.y = 0, g.rotation.x = 3.14, Vp.ShadersStore.customVertexShader = JR, Vp.ShadersStore.customFragmentShader = $R;\n const E = new NR(\n \"shader\",\n s.scene,\n {\n vertex: \"custom\",\n fragment: \"custom\"\n },\n {\n attributes: [\n \"position\",\n \"normal\",\n \"uv\",\n \"center\",\n \"layoutUv\",\n \"lineIndex\",\n \"lineLettersTotal\",\n \"lineLetterIndex\",\n \"lineWordsTotal\",\n \"lineWordIndex\",\n \"wordIndex\",\n \"letterIndex\"\n ],\n uniforms: [\n \"world\",\n \"worldView\",\n \"worldViewProjection\",\n \"view\",\n \"projection\",\n \"uColor\",\n \"uThreshold\",\n \"uStrokeOutsetWidth\",\n \"uStrokeInsetWidth\",\n \"uOpacity\",\n \"uAlphaTest\",\n \"uStrokeColor\",\n \"uLinesTotal\",\n \"uWordsTotal\",\n \"uLettersTotal\"\n ],\n needAlphaBlending: !0\n }\n ), C = s.atlas instanceof Vl ? s.atlas : new Vl(s.atlas, s.scene);\n E.setTexture(\"uFontAtlas\", C);\n const T = new pi(n.r, n.g, n.b);\n E.setColor3(\"uColor\", T);\n const R = new pi(t.r, t.g, t.b);\n return E.setColor3(\"uStrokeColor\", R), E.setFloat(\"uThreshold\", 0.05), E.setFloat(\"uStrokeOutsetWidth\", 0), E.setFloat(\"uStrokeInsetWidth\", 0.3), E.setFloat(\"uOpacity\", i), E.setFloat(\"uAlphaTest\", 0.01), E.setInt(\"uLinesTotal\", d.linesTotal), E.setInt(\"uWordsTotal\", d.wordsTotal), E.setInt(\"uLettersTotal\", d.lettersTotal), E.backFaceCulling = !1, g.material = E, g;\n};\nclass bS {\n constructor(e, t, i) {\n this.name = e, this.options = t, this.scene = i, this.mesh = this.run();\n }\n run() {\n let e = new Ji(\"cot\"), t = IS({\n text: this.options.text.toString(),\n color: this.options.color,\n opacity: this.options.opacity,\n align: this.options.align,\n font: this.options.font,\n scene: e.getScene(),\n atlas: this.options.atlas,\n lineHeight: 1\n }), i = this.options.align == \"left\" ? 0 : this.options.align == \"center\" ? 1 : this.options.align == \"right\" ? 2 : null;\n t.scaling = new Me(0.015, 0.015, 1), t.rotation.x = 180 * Math.PI / 180, t.bakeCurrentTransformIntoVertices(), t.computeWorldMatrix(!0);\n let r = t.getBoundingInfo().boundingBox;\n const s = t.position.subtract(new Me(r.center.x * i, r.center.y, 0));\n return t.setPivotMatrix(LR.Translation(s.x, 0, 0), !1), t.setParent(e), e.scaling = new Me(this.options.size, this.options.size, 1), e;\n }\n}\nfunction AS(n, e, t) {\n const i = {\n text: e.text || \"undefined\",\n size: e.size || 1,\n opacity: e.opacity || 1,\n align: e.align || \"center\",\n color: e.color || pi.White(),\n font: e.font || QR,\n atlas: e.atlas || S_\n };\n return new bS(n, i, t).mesh;\n}\nfunction MS(n, e, t) {\n let i = e.calculateBounds || !0, r = e.exclude || void 0, s = e.childObserver || !1, a = new Ji(n, t);\n if (i) {\n let { min: o, max: l } = a.getHierarchyBoundingVectors(!0, r);\n a.setBoundingInfo(new an(o, l));\n }\n return s && a.onAfterWorldMatrixUpdateObservable.add(() => {\n setTimeout(() => {\n if (a.detectReentrancy)\n return;\n a.detectReentrancy = !0;\n let { min: o, max: l } = a.getHierarchyBoundingVectors(!0, r);\n const c = a.getWorldMatrix().clone().invert();\n Me.TransformCoordinatesToRef(o, c, o), Me.TransformCoordinatesToRef(l, c, l), a.setBoundingInfo(new an(o, l)), setTimeout(() => {\n a.detectReentrancy = !1;\n });\n });\n }), a;\n}\nfunction PS(n, e, t) {\n return new On(n, t);\n}\nfunction OS(n, e, t) {\n return R_(n, e, {}, t);\n}\nconst DS = {\n cot: PS,\n sphere: kt.CreateSphere,\n box: kt.CreateBox,\n tiledBox: kt.CreateTiledBox,\n cylinder: kt.CreateCylinder,\n capsule: kt.CreateCapsule,\n plane: kt.CreatePlane,\n tiledPlane: kt.CreateTiledPlane,\n disc: kt.CreateDisc,\n torus: kt.CreateTorus,\n torusKnot: kt.CreateTorusKnot,\n ground: kt.CreateGround,\n tiledGround: kt.CreateTiledGround,\n lines: kt.CreateLines,\n dashedLines: kt.CreateDashedLines,\n lineSystem: kt.CreateLineSystem,\n ribbon: kt.CreateRibbon,\n tube: kt.CreateTube,\n extrude: kt.ExtrudeShape,\n extrudeCustom: kt.ExtrudeShapeCustom,\n lathe: kt.CreateLathe,\n polygon: kt.CreatePolygon,\n extrudePolygon: kt.ExtrudePolygon,\n polyhedra: kt.CreatePolyhedron,\n icosphere: kt.CreateIcoSphere,\n geodesic: kt.CreateGeodesic,\n goldberg: kt.CreateGoldberg,\n planeText: AS,\n greasedLine: OS,\n container: MS\n};\nfunction zo(n, e, t = {}, i = {}, r) {\n let s = {};\n for (let [l, c] of Object.entries(t))\n c instanceof Function ? s[l] = c(i) : s[l] = c;\n let a = DS[n], o = a(e, s, r);\n return o instanceof Ji && (o.actionManager = new Fr(o.getScene())), ar.EnableFor(o), o.metadata = { ...o.metadata, data: i }, o;\n}\nfunction NS(n, e = {}, t = [{}]) {\n let i = [];\n return this.selected.forEach((r) => {\n t.forEach((s, a) => {\n var o = zo(n, n, e, s, this.scene);\n o.setParent(r), i.push(o);\n });\n }), new qt(i, this.scene);\n}\nfunction FS(n, e = [{}]) {\n let t = [];\n return this.selected.forEach((i) => {\n e.forEach((r, s) => {\n var a = n.createInstance(n.name + \"_\" + s);\n n instanceof Qu && (n.actionManager = new Fr(this.scene)), ar.EnableFor(a), a.parent = i, a.metadata = { ...n.metadata, data: r }, t.push(a);\n });\n }), new qt(t, this.scene);\n}\nfunction LS(n) {\n return this.prop(\"position\", n), this;\n}\nfunction wS(n) {\n return this.prop(\"position.x\", n), this;\n}\nfunction US(n) {\n return this.prop(\"position.y\", n), this;\n}\nfunction VS(n) {\n return this.prop(\"position.z\", n), this;\n}\nfunction BS(n, e, t) {\n return this.selected.forEach((i, r) => {\n i instanceof On ? i.translate(\n n instanceof Function ? n(i.metadata.data, r) : n,\n e instanceof Function ? e(i.metadata.data, r) : e,\n t\n ) : console.log(\"Node not a mesh, skipping.\");\n }), this;\n}\nfunction kS(n) {\n return this.prop(\"rotation\", n), this;\n}\nfunction zS(n) {\n return this.prop(\"rotation.x\", n), this;\n}\nfunction WS(n) {\n return this.prop(\"rotation.y\", n), this;\n}\nfunction GS(n) {\n return this.prop(\"rotation.z\", n), this;\n}\nfunction XS(n) {\n return this.prop(\"scaling\", n), this;\n}\nfunction HS(n) {\n return this.prop(\"scaling.x\", n), this;\n}\nfunction KS(n) {\n return this.prop(\"scaling.y\", n), this;\n}\nfunction qS(n) {\n return this.prop(\"scaling.z\", n), this;\n}\nclass P_ {\n /**\n * Create a new EventState\n * @param mask defines the mask associated with this state\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\n * @param target defines the original target of the state\n * @param currentTarget defines the current target of the state\n */\n constructor(e, t = !1, i, r) {\n this.initialize(e, t, i, r);\n }\n /**\n * Initialize the current event state\n * @param mask defines the mask associated with this state\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\n * @param target defines the original target of the state\n * @param currentTarget defines the current target of the state\n * @returns the current event state\n */\n initialize(e, t = !1, i, r) {\n return this.mask = e, this.skipNextObservers = t, this.target = i, this.currentTarget = r, this;\n }\n}\nclass YS {\n /**\n * Creates a new observer\n * @param callback defines the callback to call when the observer is notified\n * @param mask defines the mask of the observer (used to filter notifications)\n * @param scope defines the current scope used to restore the JS context\n */\n constructor(e, t, i = null) {\n this.callback = e, this.mask = t, this.scope = i, this._willBeUnregistered = !1, this.unregisterOnNextCall = !1, this._remove = null;\n }\n /**\n * Remove the observer from its observable\n * This can be used instead of using the observable's remove function.\n */\n remove() {\n this._remove && this._remove();\n }\n}\nlet he = class du {\n /**\n * Create an observable from a Promise.\n * @param promise a promise to observe for fulfillment.\n * @param onErrorObservable an observable to notify if a promise was rejected.\n * @returns the new Observable\n */\n static FromPromise(e, t) {\n const i = new du();\n return e.then((r) => {\n i.notifyObservers(r);\n }).catch((r) => {\n if (t)\n t.notifyObservers(r);\n else\n throw r;\n }), i;\n }\n /**\n * Gets the list of observers\n * Note that observers that were recently deleted may still be present in the list because they are only really deleted on the next javascript tick!\n */\n get observers() {\n return this._observers;\n }\n /**\n * Creates a new observable\n * @param onObserverAdded defines a callback to call when a new observer is added\n * @param notifyIfTriggered If set to true the observable will notify when an observer was added if the observable was already triggered.\n */\n constructor(e, t = !1) {\n this.notifyIfTriggered = t, this._observers = new Array(), this._numObserversMarkedAsDeleted = 0, this._hasNotified = !1, this._eventState = new P_(0), e && (this._onObserverAdded = e);\n }\n add(e, t = -1, i = !1, r = null, s = !1) {\n if (!e)\n return null;\n const a = new YS(e, t, r);\n return a.unregisterOnNextCall = s, i ? this._observers.unshift(a) : this._observers.push(a), this._onObserverAdded && this._onObserverAdded(a), this._hasNotified && this.notifyIfTriggered && this._lastNotifiedValue !== void 0 && this.notifyObserver(a, this._lastNotifiedValue), a._remove = () => {\n this.remove(a);\n }, a;\n }\n addOnce(e) {\n return this.add(e, void 0, void 0, void 0, !0);\n }\n /**\n * Remove an Observer from the Observable object\n * @param observer the instance of the Observer to remove\n * @returns false if it doesn't belong to this Observable\n */\n remove(e) {\n return e ? (e._remove = null, this._observers.indexOf(e) !== -1 ? (this._deferUnregister(e), !0) : !1) : !1;\n }\n /**\n * Remove a callback from the Observable object\n * @param callback the callback to remove\n * @param scope optional scope. If used only the callbacks with this scope will be removed\n * @returns false if it doesn't belong to this Observable\n */\n removeCallback(e, t) {\n for (let i = 0; i < this._observers.length; i++) {\n const r = this._observers[i];\n if (!r._willBeUnregistered && r.callback === e && (!t || t === r.scope))\n return this._deferUnregister(r), !0;\n }\n return !1;\n }\n /**\n * @internal\n */\n _deferUnregister(e) {\n e._willBeUnregistered || (this._numObserversMarkedAsDeleted++, e.unregisterOnNextCall = !1, e._willBeUnregistered = !0, setTimeout(() => {\n this._remove(e);\n }, 0));\n }\n // This should only be called when not iterating over _observers to avoid callback skipping.\n // Removes an observer from the _observer Array.\n _remove(e, t = !0) {\n if (!e)\n return !1;\n const i = this._observers.indexOf(e);\n return i !== -1 ? (t && this._numObserversMarkedAsDeleted--, this._observers.splice(i, 1), !0) : !1;\n }\n /**\n * Moves the observable to the top of the observer list making it get called first when notified\n * @param observer the observer to move\n */\n makeObserverTopPriority(e) {\n this._remove(e, !1), this._observers.unshift(e);\n }\n /**\n * Moves the observable to the bottom of the observer list making it get called last when notified\n * @param observer the observer to move\n */\n makeObserverBottomPriority(e) {\n this._remove(e, !1), this._observers.push(e);\n }\n /**\n * Notify all Observers by calling their respective callback with the given data\n * Will return true if all observers were executed, false if an observer set skipNextObservers to true, then prevent the subsequent ones to execute\n * @param eventData defines the data to send to all observers\n * @param mask defines the mask of the current notification (observers with incompatible mask (ie mask & observer.mask === 0) will not be notified)\n * @param target defines the original target of the state\n * @param currentTarget defines the current target of the state\n * @param userInfo defines any user info to send to observers\n * @returns false if the complete observer chain was not processed (because one observer set the skipNextObservers to true)\n */\n notifyObservers(e, t = -1, i, r, s) {\n if (this.notifyIfTriggered && (this._hasNotified = !0, this._lastNotifiedValue = e), !this._observers.length)\n return !0;\n const a = this._eventState;\n a.mask = t, a.target = i, a.currentTarget = r, a.skipNextObservers = !1, a.lastReturnValue = e, a.userInfo = s;\n for (const o of this._observers)\n if (!o._willBeUnregistered && (o.mask & t && (o.unregisterOnNextCall && this._deferUnregister(o), o.scope ? a.lastReturnValue = o.callback.apply(o.scope, [e, a]) : a.lastReturnValue = o.callback(e, a)), a.skipNextObservers))\n return !1;\n return !0;\n }\n /**\n * Notify a specific observer\n * @param observer defines the observer to notify\n * @param eventData defines the data to be sent to each callback\n * @param mask is used to filter observers defaults to -1\n */\n notifyObserver(e, t, i = -1) {\n if (this.notifyIfTriggered && (this._hasNotified = !0, this._lastNotifiedValue = t), e._willBeUnregistered)\n return;\n const r = this._eventState;\n r.mask = i, r.skipNextObservers = !1, e.unregisterOnNextCall && this._deferUnregister(e), e.callback(t, r);\n }\n /**\n * Gets a boolean indicating if the observable has at least one observer\n * @returns true is the Observable has at least one Observer registered\n */\n hasObservers() {\n return this._observers.length - this._numObserversMarkedAsDeleted > 0;\n }\n /**\n * Clear the list of observers\n */\n clear() {\n for (; this._observers.length; ) {\n const e = this._observers.pop();\n e && (e._remove = null);\n }\n this._onObserverAdded = null, this._numObserversMarkedAsDeleted = 0, this.cleanLastNotifiedState();\n }\n /**\n * Clean the last notified state - both the internal last value and the has-notified flag\n */\n cleanLastNotifiedState() {\n this._hasNotified = !1, this._lastNotifiedValue = void 0;\n }\n /**\n * Clone the current observable\n * @returns a new observable\n */\n clone() {\n const e = new du();\n return e._observers = this._observers.slice(0), e;\n }\n /**\n * Does this observable handles observer registered with a given mask\n * @param mask defines the mask to be tested\n * @returns whether or not one observer registered with the given mask is handled\n **/\n hasSpecificMask(e = -1) {\n for (const t of this._observers)\n if (t.mask & e || t.mask === e)\n return !0;\n return !1;\n }\n};\nfunction yi() {\n return typeof window < \"u\";\n}\nfunction to() {\n return typeof navigator < \"u\";\n}\nfunction no() {\n return typeof document < \"u\";\n}\nfunction O_(n) {\n let e = \"\", t = n.firstChild;\n for (; t; )\n t.nodeType === 3 && (e += t.textContent), t = t.nextSibling;\n return e;\n}\nclass ne {\n static _CheckLimit(e, t) {\n let i = ne._LogLimitOutputs[e];\n return i ? i.current++ : (i = { limit: t, current: 1 }, ne._LogLimitOutputs[e] = i), i.current <= i.limit;\n }\n static _GenerateLimitMessage(e, t = 1) {\n const i = ne._LogLimitOutputs[e];\n if (!i || !ne.MessageLimitReached)\n return;\n const r = this._Levels[t];\n i.current === i.limit && ne[r.name](ne.MessageLimitReached.replace(/%LIMIT%/g, \"\" + i.limit).replace(/%TYPE%/g, r.name ?? \"\"));\n }\n static _AddLogEntry(e) {\n ne._LogCache = e + ne._LogCache, ne.OnNewCacheEntry && ne.OnNewCacheEntry(e);\n }\n static _FormatMessage(e) {\n const t = (r) => r < 10 ? \"0\" + r : \"\" + r, i = /* @__PURE__ */ new Date();\n return \"[\" + t(i.getHours()) + \":\" + t(i.getMinutes()) + \":\" + t(i.getSeconds()) + \"]: \" + e;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static _LogDisabled(e, t) {\n }\n static _LogEnabled(e = 1, t, i) {\n const r = Array.isArray(t) ? t[0] : t;\n if (i !== void 0 && !ne._CheckLimit(r, i))\n return;\n const s = ne._FormatMessage(r), a = this._Levels[e], o = Array.isArray(t) ? t.slice(1) : [];\n a.logFunc && a.logFunc(\"BJS - \" + s, ...o);\n const l = `
${s}

`;\n ne._AddLogEntry(l), ne._GenerateLimitMessage(r, e);\n }\n /**\n * Gets current log cache (list of logs)\n */\n static get LogCache() {\n return ne._LogCache;\n }\n /**\n * Clears the log cache\n */\n static ClearLogCache() {\n ne._LogCache = \"\", ne._LogLimitOutputs = {}, ne.errorsCount = 0;\n }\n /**\n * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel)\n */\n static set LogLevels(e) {\n ne.Log = ne._LogDisabled, ne.Warn = ne._LogDisabled, ne.Error = ne._LogDisabled, [ne.MessageLogLevel, ne.WarningLogLevel, ne.ErrorLogLevel].forEach((t) => {\n if ((e & t) === t) {\n const i = this._Levels[t];\n ne[i.name] = ne._LogEnabled.bind(ne, t);\n }\n });\n }\n}\nne.NoneLogLevel = 0;\nne.MessageLogLevel = 1;\nne.WarningLogLevel = 2;\nne.ErrorLogLevel = 4;\nne.AllLogLevel = 7;\nne.MessageLimitReached = \"Too many %TYPE%s (%LIMIT%), no more %TYPE%s will be reported for this message.\";\nne._LogCache = \"\";\nne._LogLimitOutputs = {};\nne._Levels = [\n {},\n { color: \"white\", logFunc: console.log, name: \"Log\" },\n { color: \"orange\", logFunc: console.warn, name: \"Warn\" },\n {},\n { color: \"red\", logFunc: console.error, name: \"Error\" }\n];\nne.errorsCount = 0;\nne.Log = ne._LogEnabled.bind(ne, ne.MessageLogLevel);\nne.Warn = ne._LogEnabled.bind(ne, ne.WarningLogLevel);\nne.Error = ne._LogEnabled.bind(ne, ne.ErrorLogLevel);\nconst qp = (n, e, t) => !n || n.getClassName && n.getClassName() === \"Mesh\" ? null : n.getClassName && (n.getClassName() === \"SubMesh\" || n.getClassName() === \"PhysicsBody\") ? n.clone(e) : n.clone ? n.clone() : Array.isArray(n) ? n.slice() : t && typeof n == \"object\" ? { ...n } : null;\nfunction ZS(n) {\n const e = [];\n do\n Object.getOwnPropertyNames(n).forEach(function(t) {\n e.indexOf(t) === -1 && e.push(t);\n });\n while (n = Object.getPrototypeOf(n));\n return e;\n}\nclass Dn {\n /**\n * Tries to copy an object by duplicating every property\n * @param source defines the source object\n * @param destination defines the target object\n * @param doNotCopyList defines a list of properties to avoid\n * @param mustCopyList defines a list of properties to copy (even if they start with _)\n * @param shallowCopyValues defines wether properties referencing objects (none cloneable) must be shallow copied (false by default)\n * @remarks shallowCopyValues will not instantite the copied values which makes it only usable for \"JSON objects\"\n */\n static DeepCopy(e, t, i, r, s = !1) {\n const a = ZS(e);\n for (const o of a) {\n if (o[0] === \"_\" && (!r || r.indexOf(o) === -1) || o.endsWith(\"Observable\") || i && i.indexOf(o) !== -1)\n continue;\n const l = e[o], c = typeof l;\n if (c !== \"function\")\n try {\n if (c === \"object\")\n if (l instanceof Uint8Array)\n t[o] = Uint8Array.from(l);\n else if (l instanceof Array) {\n if (t[o] = [], l.length > 0)\n if (typeof l[0] == \"object\")\n for (let h = 0; h < l.length; h++) {\n const u = qp(l[h], t, s);\n t[o].indexOf(u) === -1 && t[o].push(u);\n }\n else\n t[o] = l.slice(0);\n } else\n t[o] = qp(l, t, s);\n else\n t[o] = l;\n } catch (h) {\n ne.Warn(h.message);\n }\n }\n }\n}\nclass sr {\n /**\n * Gets either window.performance.now() if supported or Date.now() else\n */\n static get Now() {\n return yi() && window.performance && window.performance.now ? window.performance.now() : Date.now();\n }\n}\nconst Yp = {};\nfunction We(n, e = !1) {\n if (!(e && Yp[n]))\n return Yp[n] = !0, `${n} needs to be imported before as it contains a side-effect required by your code.`;\n}\nfunction jS() {\n return typeof _native < \"u\" && _native.XMLHttpRequest ? new _native.XMLHttpRequest() : new XMLHttpRequest();\n}\nclass mi {\n constructor() {\n this._xhr = jS(), this._requestURL = \"\";\n }\n /**\n * This function can be called to check if there are request modifiers for network requests\n * @returns true if there are any custom requests available\n */\n static get IsCustomRequestAvailable() {\n return Object.keys(mi.CustomRequestHeaders).length > 0 || mi.CustomRequestModifiers.length > 0;\n }\n _injectCustomRequestHeaders() {\n if (!this._shouldSkipRequestModifications(this._requestURL))\n for (const e in mi.CustomRequestHeaders) {\n const t = mi.CustomRequestHeaders[e];\n t && this._xhr.setRequestHeader(e, t);\n }\n }\n _shouldSkipRequestModifications(e) {\n return mi.SkipRequestModificationForBabylonCDN && (e.includes(\"preview.babylonjs.com\") || e.includes(\"cdn.babylonjs.com\"));\n }\n /**\n * Gets or sets a function to be called when loading progress changes\n */\n get onprogress() {\n return this._xhr.onprogress;\n }\n set onprogress(e) {\n this._xhr.onprogress = e;\n }\n /**\n * Returns client's state\n */\n get readyState() {\n return this._xhr.readyState;\n }\n /**\n * Returns client's status\n */\n get status() {\n return this._xhr.status;\n }\n /**\n * Returns client's status as a text\n */\n get statusText() {\n return this._xhr.statusText;\n }\n /**\n * Returns client's response\n */\n get response() {\n return this._xhr.response;\n }\n /**\n * Returns client's response url\n */\n get responseURL() {\n return this._xhr.responseURL;\n }\n /**\n * Returns client's response as text\n */\n get responseText() {\n return this._xhr.responseText;\n }\n /**\n * Gets or sets the expected response type\n */\n get responseType() {\n return this._xhr.responseType;\n }\n set responseType(e) {\n this._xhr.responseType = e;\n }\n /**\n * Gets or sets the timeout value in milliseconds\n */\n get timeout() {\n return this._xhr.timeout;\n }\n set timeout(e) {\n this._xhr.timeout = e;\n }\n addEventListener(e, t, i) {\n this._xhr.addEventListener(e, t, i);\n }\n removeEventListener(e, t, i) {\n this._xhr.removeEventListener(e, t, i);\n }\n /**\n * Cancels any network activity\n */\n abort() {\n this._xhr.abort();\n }\n /**\n * Initiates the request. The optional argument provides the request body. The argument is ignored if request method is GET or HEAD\n * @param body defines an optional request body\n */\n send(e) {\n mi.CustomRequestHeaders && this._injectCustomRequestHeaders(), this._xhr.send(e);\n }\n /**\n * Sets the request method, request URL\n * @param method defines the method to use (GET, POST, etc..)\n * @param url defines the url to connect with\n */\n open(e, t) {\n for (const i of mi.CustomRequestModifiers) {\n if (this._shouldSkipRequestModifications(t))\n return;\n i(this._xhr, t);\n }\n t = t.replace(\"file:http:\", \"http:\"), t = t.replace(\"file:https:\", \"https:\"), this._requestURL = t, this._xhr.open(e, t, !0);\n }\n /**\n * Sets the value of a request header.\n * @param name The name of the header whose value is to be set\n * @param value The value to set as the body of the header\n */\n setRequestHeader(e, t) {\n this._xhr.setRequestHeader(e, t);\n }\n /**\n * Get the string containing the text of a particular header's value.\n * @param name The name of the header\n * @returns The string containing the text of the given header name\n */\n getResponseHeader(e) {\n return this._xhr.getResponseHeader(e);\n }\n}\nmi.CustomRequestHeaders = {};\nmi.CustomRequestModifiers = new Array();\nmi.SkipRequestModificationForBabylonCDN = !0;\nclass st {\n /**\n * Gets the latest created engine\n */\n static get LastCreatedEngine() {\n return this.Instances.length === 0 ? null : this.Instances[this.Instances.length - 1];\n }\n /**\n * Gets the latest created scene\n */\n static get LastCreatedScene() {\n return this._LastCreatedScene;\n }\n}\nst.Instances = [];\nst.OnEnginesDisposedObservable = new he();\nst._LastCreatedScene = null;\nst.UseFallbackTexture = !0;\nst.FallbackTexture = \"\";\nclass ao {\n}\nao.FilesToLoad = {};\nclass QS {\n /**\n * Function used to defines an exponential back off strategy\n * @param maxRetries defines the maximum number of retries (3 by default)\n * @param baseInterval defines the interval between retries\n * @returns the strategy function to use\n */\n static ExponentialBackoff(e = 3, t = 500) {\n return (i, r, s) => r.status !== 0 || s >= e || i.indexOf(\"file:\") !== -1 ? -1 : Math.pow(2, s) * t;\n }\n}\nclass ba extends Error {\n}\nba._setPrototypeOf = Object.setPrototypeOf || ((n, e) => (n.__proto__ = e, n));\nconst Pc = {\n // Mesh errors 0-999\n /** Invalid or empty mesh vertex positions. */\n MeshInvalidPositionsError: 0,\n // Texture errors 1000-1999\n /** Unsupported texture found. */\n UnsupportedTextureError: 1e3,\n // GLTFLoader errors 2000-2999\n /** Unexpected magic number found in GLTF file header. */\n GLTFLoaderUnexpectedMagicError: 2e3,\n // SceneLoader errors 3000-3999\n /** SceneLoader generic error code. Ideally wraps the inner exception. */\n SceneLoaderError: 3e3,\n // File related errors 4000-4999\n /** Load file error */\n LoadFileError: 4e3,\n /** Request file error */\n RequestFileError: 4001,\n /** Read file error */\n ReadFileError: 4002\n};\nclass Ba extends ba {\n /**\n * Creates a new RuntimeError\n * @param message defines the message of the error\n * @param errorCode the error code\n * @param innerError the error that caused the outer error\n */\n constructor(e, t, i) {\n super(e), this.errorCode = t, this.innerError = i, this.name = \"RuntimeError\", ba._setPrototypeOf(this, Ba.prototype);\n }\n}\nconst D_ = (n) => {\n const e = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n let t = \"\", i, r, s, a, o, l, c, h = 0;\n const u = ArrayBuffer.isView(n) ? new Uint8Array(n.buffer, n.byteOffset, n.byteLength) : new Uint8Array(n);\n for (; h < u.length; )\n i = u[h++], r = h < u.length ? u[h++] : Number.NaN, s = h < u.length ? u[h++] : Number.NaN, a = i >> 2, o = (i & 3) << 4 | r >> 4, l = (r & 15) << 2 | s >> 6, c = s & 63, isNaN(r) ? l = c = 64 : isNaN(s) && (c = 64), t += e.charAt(a) + e.charAt(o) + e.charAt(l) + e.charAt(c);\n return t;\n}, N_ = (n) => atob(n), JS = (n) => {\n const e = N_(n), t = e.length, i = new Uint8Array(new ArrayBuffer(t));\n for (let r = 0; r < t; r++)\n i[r] = e.charCodeAt(r);\n return i.buffer;\n}, $S = \"attribute\", ey = \"varying\";\nclass oo {\n constructor() {\n this.children = [];\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isValid(e) {\n return !0;\n }\n process(e, t) {\n var r, s, a, o, l, c;\n let i = \"\";\n if (this.line) {\n let h = this.line;\n const u = t.processor;\n if (u) {\n u.lineProcessor && (h = u.lineProcessor(h, t.isFragment, t.processingContext));\n const f = ((r = t.processor) == null ? void 0 : r.attributeKeywordName) ?? $S, d = t.isFragment && ((s = t.processor) != null && s.varyingFragmentKeywordName) ? (a = t.processor) == null ? void 0 : a.varyingFragmentKeywordName : !t.isFragment && ((o = t.processor) != null && o.varyingVertexKeywordName) ? (l = t.processor) == null ? void 0 : l.varyingVertexKeywordName : ey;\n !t.isFragment && u.attributeProcessor && this.line.startsWith(f) ? h = u.attributeProcessor(this.line, e, t.processingContext) : u.varyingProcessor && ((c = u.varyingCheck) != null && c.call(u, this.line, t.isFragment) || !u.varyingCheck && this.line.startsWith(d)) ? h = u.varyingProcessor(this.line, t.isFragment, e, t.processingContext) : u.uniformProcessor && u.uniformRegexp && u.uniformRegexp.test(this.line) ? t.lookForClosingBracketForUniformBuffer || (h = u.uniformProcessor(this.line, t.isFragment, e, t.processingContext)) : u.uniformBufferProcessor && u.uniformBufferRegexp && u.uniformBufferRegexp.test(this.line) ? t.lookForClosingBracketForUniformBuffer || (h = u.uniformBufferProcessor(this.line, t.isFragment, t.processingContext), t.lookForClosingBracketForUniformBuffer = !0) : u.textureProcessor && u.textureRegexp && u.textureRegexp.test(this.line) ? h = u.textureProcessor(this.line, t.isFragment, e, t.processingContext) : (u.uniformProcessor || u.uniformBufferProcessor) && this.line.startsWith(\"uniform\") && !t.lookForClosingBracketForUniformBuffer && (/uniform\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/.test(this.line) ? u.uniformProcessor && (h = u.uniformProcessor(this.line, t.isFragment, e, t.processingContext)) : u.uniformBufferProcessor && (h = u.uniformBufferProcessor(this.line, t.isFragment, t.processingContext), t.lookForClosingBracketForUniformBuffer = !0)), t.lookForClosingBracketForUniformBuffer && this.line.indexOf(\"}\") !== -1 && (t.lookForClosingBracketForUniformBuffer = !1, u.endOfUniformBufferProcessor && (h = u.endOfUniformBufferProcessor(this.line, t.isFragment, t.processingContext)));\n }\n i += h + `\n`;\n }\n return this.children.forEach((h) => {\n i += h.process(e, t);\n }), this.additionalDefineKey && (e[this.additionalDefineKey] = this.additionalDefineValue || \"true\"), i;\n }\n}\nclass ty {\n constructor() {\n this._lines = [];\n }\n get currentLine() {\n return this._lines[this.lineIndex];\n }\n get canRead() {\n return this.lineIndex < this._lines.length - 1;\n }\n set lines(e) {\n this._lines.length = 0;\n for (const t of e) {\n if (!t || t === \"\\r\")\n continue;\n if (t[0] === \"#\") {\n this._lines.push(t);\n continue;\n }\n const i = t.trim();\n if (!i)\n continue;\n if (i.startsWith(\"//\")) {\n this._lines.push(t);\n continue;\n }\n const r = i.indexOf(\";\");\n if (r === -1)\n this._lines.push(i);\n else if (r === i.length - 1)\n i.length > 1 && this._lines.push(i);\n else {\n const s = t.split(\";\");\n for (let a = 0; a < s.length; a++) {\n let o = s[a];\n o && (o = o.trim(), o && this._lines.push(o + (a !== s.length - 1 ? \";\" : \"\")));\n }\n }\n }\n }\n}\nclass Uh extends oo {\n process(e, t) {\n for (let i = 0; i < this.children.length; i++) {\n const r = this.children[i];\n if (r.isValid(e))\n return r.process(e, t);\n }\n return \"\";\n }\n}\nclass iy extends oo {\n isValid(e) {\n return this.testExpression.isTrue(e);\n }\n}\nclass Zt {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isTrue(e) {\n return !0;\n }\n static postfixToInfix(e) {\n const t = [];\n for (const i of e)\n if (Zt._OperatorPriority[i] === void 0)\n t.push(i);\n else {\n const r = t[t.length - 1], s = t[t.length - 2];\n t.length -= 2, t.push(`(${s}${i}${r})`);\n }\n return t[t.length - 1];\n }\n /**\n * Converts an infix expression to a postfix expression.\n *\n * This method is used to transform infix expressions, which are more human-readable,\n * into postfix expressions, also known as Reverse Polish Notation (RPN), that can be\n * evaluated more efficiently by a computer. The conversion is based on the operator\n * priority defined in _OperatorPriority.\n *\n * The function employs a stack-based algorithm for the conversion and caches the result\n * to improve performance. The cache keeps track of each converted expression's access time\n * to manage the cache size and optimize memory usage. When the cache size exceeds a specified\n * limit, the least recently accessed items in the cache are deleted.\n *\n * The cache mechanism is particularly helpful for shader compilation, where the same infix\n * expressions might be encountered repeatedly, hence the caching can speed up the process.\n *\n * @param infix - The infix expression to be converted.\n * @returns The postfix expression as an array of strings.\n */\n static infixToPostfix(e) {\n const t = Zt._InfixToPostfixCache.get(e);\n if (t)\n return t.accessTime = Date.now(), t.result;\n if (!e.includes(\"&&\") && !e.includes(\"||\") && !e.includes(\")\") && !e.includes(\"(\"))\n return [e];\n const i = [];\n let r = -1;\n const s = () => {\n h = h.trim(), h !== \"\" && (i.push(h), h = \"\");\n }, a = (u) => {\n r < Zt._Stack.length - 1 && (Zt._Stack[++r] = u);\n }, o = () => Zt._Stack[r], l = () => r === -1 ? \"!!INVALID EXPRESSION!!\" : Zt._Stack[r--];\n let c = 0, h = \"\";\n for (; c < e.length; ) {\n const u = e.charAt(c), f = c < e.length - 1 ? e.substr(c, 2) : \"\";\n if (u === \"(\")\n h = \"\", a(u);\n else if (u === \")\") {\n for (s(); r !== -1 && o() !== \"(\"; )\n i.push(l());\n l();\n } else if (Zt._OperatorPriority[f] > 1) {\n for (s(); r !== -1 && Zt._OperatorPriority[o()] >= Zt._OperatorPriority[f]; )\n i.push(l());\n a(f), c++;\n } else\n h += u;\n c++;\n }\n for (s(); r !== -1; )\n o() === \"(\" ? l() : i.push(l());\n return Zt._InfixToPostfixCache.size >= Zt.InfixToPostfixCacheLimitSize && Zt.ClearCache(), Zt._InfixToPostfixCache.set(e, { result: i, accessTime: Date.now() }), i;\n }\n static ClearCache() {\n const e = Array.from(Zt._InfixToPostfixCache.entries()).sort((t, i) => t[1].accessTime - i[1].accessTime);\n for (let t = 0; t < Zt.InfixToPostfixCacheCleanupSize; t++)\n Zt._InfixToPostfixCache.delete(e[t][0]);\n }\n}\nZt.InfixToPostfixCacheLimitSize = 5e4;\nZt.InfixToPostfixCacheCleanupSize = 25e3;\nZt._InfixToPostfixCache = /* @__PURE__ */ new Map();\nZt._OperatorPriority = {\n \")\": 0,\n \"(\": 1,\n \"||\": 2,\n \"&&\": 3\n};\nZt._Stack = [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\nclass pl extends Zt {\n constructor(e, t = !1) {\n super(), this.define = e, this.not = t;\n }\n isTrue(e) {\n let t = e[this.define] !== void 0;\n return this.not && (t = !t), t;\n }\n}\nclass ry extends Zt {\n isTrue(e) {\n return this.leftOperand.isTrue(e) || this.rightOperand.isTrue(e);\n }\n}\nclass sy extends Zt {\n isTrue(e) {\n return this.leftOperand.isTrue(e) && this.rightOperand.isTrue(e);\n }\n}\nclass ny extends Zt {\n constructor(e, t, i) {\n super(), this.define = e, this.operand = t, this.testValue = i;\n }\n isTrue(e) {\n let t = e[this.define];\n t === void 0 && (t = this.define);\n let i = !1;\n const r = parseInt(t), s = parseInt(this.testValue);\n switch (this.operand) {\n case \">\":\n i = r > s;\n break;\n case \"<\":\n i = r < s;\n break;\n case \"<=\":\n i = r <= s;\n break;\n case \">=\":\n i = r >= s;\n break;\n case \"==\":\n i = r === s;\n break;\n case \"!=\":\n i = r !== s;\n break;\n }\n return i;\n }\n}\nvar _i;\n(function(n) {\n n[n.GLSL = 0] = \"GLSL\", n[n.WGSL = 1] = \"WGSL\";\n})(_i || (_i = {}));\nconst ay = /defined\\s*?\\((.+?)\\)/g, Vh = /defined\\s*?\\[(.+?)\\]/g, oy = /#include\\s?<(.+)>(\\((.*)\\))*(\\[(.*)\\])*/g, ly = /__decl__/, Zp = /light\\{X\\}.(\\w*)/g, jp = /\\{X\\}/g, gl = [];\nclass hs {\n static Initialize(e) {\n e.processor && e.processor.initializeShaders && e.processor.initializeShaders(e.processingContext);\n }\n static Process(e, t, i, r) {\n var s;\n (s = t.processor) != null && s.preProcessShaderCode && (e = t.processor.preProcessShaderCode(e, t.isFragment)), this._ProcessIncludes(e, t, (a) => {\n t.processCodeAfterIncludes && (a = t.processCodeAfterIncludes(t.isFragment ? \"fragment\" : \"vertex\", a));\n const o = this._ProcessShaderConversion(a, t, r);\n i(o, a);\n });\n }\n static PreProcess(e, t, i, r) {\n var s;\n (s = t.processor) != null && s.preProcessShaderCode && (e = t.processor.preProcessShaderCode(e, t.isFragment)), this._ProcessIncludes(e, t, (a) => {\n t.processCodeAfterIncludes && (a = t.processCodeAfterIncludes(t.isFragment ? \"fragment\" : \"vertex\", a));\n const o = this._ApplyPreProcessing(a, t, r);\n i(o, a);\n });\n }\n static Finalize(e, t, i) {\n return !i.processor || !i.processor.finalizeShaders ? { vertexCode: e, fragmentCode: t } : i.processor.finalizeShaders(e, t, i.processingContext);\n }\n static _ProcessPrecision(e, t) {\n var r;\n if ((r = t.processor) != null && r.noPrecision)\n return e;\n const i = t.shouldUseHighPrecisionShader;\n return e.indexOf(\"precision highp float\") === -1 ? i ? e = `precision highp float;\n` + e : e = `precision mediump float;\n` + e : i || (e = e.replace(\"precision highp float\", \"precision mediump float\")), e;\n }\n static _ExtractOperation(e) {\n const i = /defined\\((.+)\\)/.exec(e);\n if (i && i.length)\n return new pl(i[1].trim(), e[0] === \"!\");\n const r = [\"==\", \"!=\", \">=\", \"<=\", \"<\", \">\"];\n let s = \"\", a = 0;\n for (s of r)\n if (a = e.indexOf(s), a > -1)\n break;\n if (a === -1)\n return new pl(e);\n const o = e.substring(0, a).trim(), l = e.substring(a + s.length).trim();\n return new ny(o, s, l);\n }\n static _BuildSubExpression(e) {\n e = e.replace(ay, \"defined[$1]\");\n const t = Zt.infixToPostfix(e), i = [];\n for (const s of t)\n if (s !== \"||\" && s !== \"&&\")\n i.push(s);\n else if (i.length >= 2) {\n let a = i[i.length - 1], o = i[i.length - 2];\n i.length -= 2;\n const l = s == \"&&\" ? new sy() : new ry();\n typeof a == \"string\" && (a = a.replace(Vh, \"defined($1)\")), typeof o == \"string\" && (o = o.replace(Vh, \"defined($1)\")), l.leftOperand = typeof o == \"string\" ? this._ExtractOperation(o) : o, l.rightOperand = typeof a == \"string\" ? this._ExtractOperation(a) : a, i.push(l);\n }\n let r = i[i.length - 1];\n return typeof r == \"string\" && (r = r.replace(Vh, \"defined($1)\")), typeof r == \"string\" ? this._ExtractOperation(r) : r;\n }\n static _BuildExpression(e, t) {\n const i = new iy(), r = e.substring(0, t);\n let s = e.substring(t);\n return s = s.substring(0, (s.indexOf(\"//\") + 1 || s.length + 1) - 1).trim(), r === \"#ifdef\" ? i.testExpression = new pl(s) : r === \"#ifndef\" ? i.testExpression = new pl(s, !0) : i.testExpression = this._BuildSubExpression(s), i;\n }\n static _MoveCursorWithinIf(e, t, i) {\n let r = e.currentLine;\n for (; this._MoveCursor(e, i); ) {\n r = e.currentLine;\n const s = r.substring(0, 5).toLowerCase();\n if (s === \"#else\") {\n const a = new oo();\n t.children.push(a), this._MoveCursor(e, a);\n return;\n } else if (s === \"#elif\") {\n const a = this._BuildExpression(r, 5);\n t.children.push(a), i = a;\n }\n }\n }\n static _MoveCursor(e, t) {\n for (; e.canRead; ) {\n e.lineIndex++;\n const i = e.currentLine;\n if (i.indexOf(\"#\") >= 0) {\n const s = hs._MoveCursorRegex.exec(i);\n if (s && s.length) {\n switch (s[0]) {\n case \"#ifdef\": {\n const o = new Uh();\n t.children.push(o);\n const l = this._BuildExpression(i, 6);\n o.children.push(l), this._MoveCursorWithinIf(e, o, l);\n break;\n }\n case \"#else\":\n case \"#elif\":\n return !0;\n case \"#endif\":\n return !1;\n case \"#ifndef\": {\n const o = new Uh();\n t.children.push(o);\n const l = this._BuildExpression(i, 7);\n o.children.push(l), this._MoveCursorWithinIf(e, o, l);\n break;\n }\n case \"#if\": {\n const o = new Uh(), l = this._BuildExpression(i, 3);\n t.children.push(o), o.children.push(l), this._MoveCursorWithinIf(e, o, l);\n break;\n }\n }\n continue;\n }\n }\n const r = new oo();\n if (r.line = i, t.children.push(r), i[0] === \"#\" && i[1] === \"d\") {\n const s = i.replace(\";\", \"\").split(\" \");\n r.additionalDefineKey = s[1], s.length === 3 && (r.additionalDefineValue = s[2]);\n }\n }\n return !1;\n }\n static _EvaluatePreProcessors(e, t, i) {\n const r = new oo(), s = new ty();\n return s.lineIndex = -1, s.lines = e.split(`\n`), this._MoveCursor(s, r), r.process(t, i);\n }\n static _PreparePreProcessors(e, t) {\n var s;\n const i = e.defines, r = {};\n for (const a of i) {\n const l = a.replace(\"#define\", \"\").replace(\";\", \"\").trim().split(\" \");\n r[l[0]] = l.length > 1 ? l[1] : \"\";\n }\n return ((s = e.processor) == null ? void 0 : s.shaderLanguage) === _i.GLSL && (r.GL_ES = \"true\"), r.__VERSION__ = e.version, r[e.platformName] = \"true\", t._getGlobalDefines(r), r;\n }\n static _ProcessShaderConversion(e, t, i) {\n let r = this._ProcessPrecision(e, t);\n if (!t.processor || t.processor.shaderLanguage === _i.GLSL && r.indexOf(\"#version 3\") !== -1 && (r = r.replace(\"#version 300 es\", \"\"), !t.processor.parseGLES3))\n return r;\n const s = t.defines, a = this._PreparePreProcessors(t, i);\n return t.processor.preProcessor && (r = t.processor.preProcessor(r, s, t.isFragment, t.processingContext)), r = this._EvaluatePreProcessors(r, a, t), t.processor.postProcessor && (r = t.processor.postProcessor(r, s, t.isFragment, t.processingContext, i)), i._features.needShaderCodeInlining && (r = i.inlineShaderCode(r)), r;\n }\n static _ApplyPreProcessing(e, t, i) {\n var o, l;\n let r = e;\n const s = t.defines, a = this._PreparePreProcessors(t, i);\n return (o = t.processor) != null && o.preProcessor && (r = t.processor.preProcessor(r, s, t.isFragment, t.processingContext)), r = this._EvaluatePreProcessors(r, a, t), (l = t.processor) != null && l.postProcessor && (r = t.processor.postProcessor(r, s, t.isFragment, t.processingContext, i)), i._features.needShaderCodeInlining && (r = i.inlineShaderCode(r)), r;\n }\n /** @internal */\n static _ProcessIncludes(e, t, i) {\n gl.length = 0;\n let r;\n for (; (r = oy.exec(e)) !== null; )\n gl.push(r);\n let s = String(e), a = [e], o = !1;\n for (const l of gl) {\n let c = l[1];\n if (c.indexOf(\"__decl__\") !== -1 && (c = c.replace(ly, \"\"), t.supportsUniformBuffers && (c = c.replace(\"Vertex\", \"Ubo\").replace(\"Fragment\", \"Ubo\")), c = c + \"Declaration\"), t.includesShadersStore[c]) {\n let h = t.includesShadersStore[c];\n if (l[2]) {\n const f = l[3].split(\",\");\n for (let d = 0; d < f.length; d += 2) {\n const p = new RegExp(f[d], \"g\"), g = f[d + 1];\n h = h.replace(p, g);\n }\n }\n if (l[4]) {\n const f = l[5];\n if (f.indexOf(\"..\") !== -1) {\n const d = f.split(\"..\"), p = parseInt(d[0]);\n let g = parseInt(d[1]), m = h.slice(0);\n h = \"\", isNaN(g) && (g = t.indexParameters[d[1]]);\n for (let v = p; v < g; v++)\n t.supportsUniformBuffers || (m = m.replace(Zp, (E, C) => C + \"{X}\")), h += m.replace(jp, v.toString()) + `\n`;\n } else\n t.supportsUniformBuffers || (h = h.replace(Zp, (d, p) => p + \"{X}\")), h = h.replace(jp, f);\n }\n const u = [];\n for (const f of a) {\n const d = f.split(l[0]);\n for (let p = 0; p < d.length - 1; p++)\n u.push(d[p]), u.push(h);\n u.push(d[d.length - 1]);\n }\n a = u, o = o || h.indexOf(\"#include<\") >= 0 || h.indexOf(\"#include <\") >= 0;\n } else {\n const h = t.shadersRepository + \"ShadersInclude/\" + c + \".fx\";\n hs._FileToolsLoadFile(h, (u) => {\n t.includesShadersStore[c] = u, this._ProcessIncludes(a.join(\"\"), t, i);\n });\n return;\n }\n }\n gl.length = 0, s = a.join(\"\"), o ? this._ProcessIncludes(s.toString(), t, i) : i(s);\n }\n /**\n * Loads a file from a url\n * @param url url to load\n * @param onSuccess callback called when the file successfully loads\n * @param onProgress callback called while file is loading (if the server supports this mode)\n * @param offlineProvider defines the offline provider for caching\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\n * @param onError callback called when the file fails to load\n * @returns a file request object\n * @internal\n */\n static _FileToolsLoadFile(e, t, i, r, s, a) {\n throw We(\"FileTools\");\n }\n}\nhs._MoveCursorRegex = /(#ifdef)|(#else)|(#elif)|(#endif)|(#ifndef)|(#if)/;\nclass Y {\n /**\n * Gets the shaders repository path for a given shader language\n * @param shaderLanguage the shader language\n * @returns the path to the shaders repository\n */\n static GetShadersRepository(e = _i.GLSL) {\n return e === _i.GLSL ? Y.ShadersRepository : Y.ShadersRepositoryWGSL;\n }\n /**\n * Gets the shaders store of a given shader language\n * @param shaderLanguage the shader language\n * @returns the shaders store\n */\n static GetShadersStore(e = _i.GLSL) {\n return e === _i.GLSL ? Y.ShadersStore : Y.ShadersStoreWGSL;\n }\n /**\n * Gets the include shaders store of a given shader language\n * @param shaderLanguage the shader language\n * @returns the include shaders store\n */\n static GetIncludesShadersStore(e = _i.GLSL) {\n return e === _i.GLSL ? Y.IncludesShadersStore : Y.IncludesShadersStoreWGSL;\n }\n}\nY.ShadersRepository = \"src/Shaders/\";\nY.ShadersStore = {};\nY.IncludesShadersStore = {};\nY.ShadersRepositoryWGSL = \"src/ShadersWGSL/\";\nY.ShadersStoreWGSL = {};\nY.IncludesShadersStoreWGSL = {};\nclass Hi {\n /**\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\n */\n static get ShadersRepository() {\n return Y.ShadersRepository;\n }\n static set ShadersRepository(e) {\n Y.ShadersRepository = e;\n }\n /**\n * Observable that will be called when effect is bound.\n */\n get onBindObservable() {\n return this._onBindObservable || (this._onBindObservable = new he()), this._onBindObservable;\n }\n /**\n * Gets the shader language type used to write vertex and fragment source code.\n */\n get shaderLanguage() {\n return this._shaderLanguage;\n }\n /**\n * Instantiates an effect.\n * An effect can be used to create/manage/execute vertex and fragment shaders.\n * @param baseName Name of the effect.\n * @param attributesNamesOrOptions List of attribute names that will be passed to the shader or set of all options to create the effect.\n * @param uniformsNamesOrEngine List of uniform variable names that will be passed to the shader or the engine that will be used to render effect.\n * @param samplers List of sampler variables that will be passed to the shader.\n * @param engine Engine to be used to render the effect\n * @param defines Define statements to be added to the shader.\n * @param fallbacks Possible fallbacks for this effect to improve performance when needed.\n * @param onCompiled Callback that will be called when the shader is compiled.\n * @param onError Callback that will be called if an error occurs during shader compilation.\n * @param indexParameters Parameters to be used with Babylons include syntax to iterate over an array (eg. \\{lights: 10\\})\n * @param key Effect Key identifying uniquely compiled shader variants\n * @param shaderLanguage the language the shader is written in (default: GLSL)\n */\n constructor(e, t, i, r = null, s, a = null, o = null, l = null, c = null, h, u = \"\", f = _i.GLSL) {\n if (this.defines = \"\", this.onCompiled = null, this.onError = null, this.onBind = null, this.uniqueId = 0, this.onCompileObservable = new he(), this.onErrorObservable = new he(), this._onBindObservable = null, this._isDisposed = !1, this._bonesComputationForcedToCPU = !1, this._uniformBuffersNames = {}, this._multiTarget = !1, this._samplers = {}, this._isReady = !1, this._compilationError = \"\", this._allFallbacksProcessed = !1, this._uniforms = {}, this._key = \"\", this._fallbacks = null, this._vertexSourceCodeOverride = \"\", this._fragmentSourceCodeOverride = \"\", this._transformFeedbackVaryings = null, this._pipelineContext = null, this._vertexSourceCode = \"\", this._fragmentSourceCode = \"\", this._vertexSourceCodeBeforeMigration = \"\", this._fragmentSourceCodeBeforeMigration = \"\", this._rawVertexSourceCode = \"\", this._rawFragmentSourceCode = \"\", this._processCodeAfterIncludes = void 0, this._processFinalCode = null, this.name = e, this._key = u, t.attributes) {\n const d = t;\n if (this._engine = i, this._attributesNames = d.attributes, this._uniformsNames = d.uniformsNames.concat(d.samplers), this._samplerList = d.samplers.slice(), this.defines = d.defines, this.onError = d.onError, this.onCompiled = d.onCompiled, this._fallbacks = d.fallbacks, this._indexParameters = d.indexParameters, this._transformFeedbackVaryings = d.transformFeedbackVaryings || null, this._multiTarget = !!d.multiTarget, this._shaderLanguage = d.shaderLanguage ?? _i.GLSL, d.uniformBuffersNames) {\n this._uniformBuffersNamesList = d.uniformBuffersNames.slice();\n for (let p = 0; p < d.uniformBuffersNames.length; p++)\n this._uniformBuffersNames[d.uniformBuffersNames[p]] = p;\n }\n this._processFinalCode = d.processFinalCode ?? null, this._processCodeAfterIncludes = d.processCodeAfterIncludes ?? void 0;\n } else\n this._engine = s, this.defines = a ?? \"\", this._uniformsNames = i.concat(r), this._samplerList = r ? r.slice() : [], this._attributesNames = t, this._uniformBuffersNamesList = [], this._shaderLanguage = f, this.onError = c, this.onCompiled = l, this._indexParameters = h, this._fallbacks = o;\n this._attributeLocationByName = {}, this.uniqueId = Hi._UniqueIdSeed++, this._processShaderCode();\n }\n /** @internal */\n _processShaderCode(e = null, t = !1) {\n let i, r;\n const s = this.name, a = yi() ? this._engine.getHostDocument() : null;\n typeof s == \"string\" ? i = s : s.vertexSource ? i = \"source:\" + s.vertexSource : s.vertexElement ? i = (a == null ? void 0 : a.getElementById(s.vertexElement)) || s.vertexElement : i = s.vertex || s, typeof s == \"string\" ? r = s : s.fragmentSource ? r = \"source:\" + s.fragmentSource : s.fragmentElement ? r = (a == null ? void 0 : a.getElementById(s.fragmentElement)) || s.fragmentElement : r = s.fragment || s, this._processingContext = this._engine._getShaderProcessingContext(this._shaderLanguage);\n let o = {\n defines: this.defines.split(`\n`),\n indexParameters: this._indexParameters,\n isFragment: !1,\n shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader,\n processor: e ?? this._engine._getShaderProcessor(this._shaderLanguage),\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\n shadersRepository: Y.GetShadersRepository(this._shaderLanguage),\n includesShadersStore: Y.GetIncludesShadersStore(this._shaderLanguage),\n version: (this._engine.version * 100).toString(),\n platformName: this._engine.shaderPlatformName,\n processingContext: this._processingContext,\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\n processCodeAfterIncludes: this._processCodeAfterIncludes\n };\n const l = [void 0, void 0], c = () => {\n if (l[0] && l[1]) {\n o.isFragment = !0;\n const [h, u] = l;\n hs.Process(u, o, (f, d) => {\n this._fragmentSourceCodeBeforeMigration = d, this._processFinalCode && (f = this._processFinalCode(\"fragment\", f));\n const p = hs.Finalize(h, f, o);\n o = null, this._useFinalCode(p.vertexCode, p.fragmentCode, s, t);\n }, this._engine);\n }\n };\n this._loadShader(i, \"Vertex\", \"\", (h) => {\n hs.Initialize(o), hs.Process(h, o, (u, f) => {\n this._rawVertexSourceCode = h, this._vertexSourceCodeBeforeMigration = f, this._processFinalCode && (u = this._processFinalCode(\"vertex\", u)), l[0] = u, c();\n }, this._engine);\n }), this._loadShader(r, \"Fragment\", \"Pixel\", (h) => {\n this._rawFragmentSourceCode = h, l[1] = h, c();\n });\n }\n _useFinalCode(e, t, i, r = !1) {\n if (i) {\n const s = i.vertexElement || i.vertex || i.spectorName || i, a = i.fragmentElement || i.fragment || i.spectorName || i;\n this._vertexSourceCode = (this._shaderLanguage === _i.WGSL ? \"//\" : \"\") + \"#define SHADER_NAME vertex:\" + s + `\n` + e, this._fragmentSourceCode = (this._shaderLanguage === _i.WGSL ? \"//\" : \"\") + \"#define SHADER_NAME fragment:\" + a + `\n` + t;\n } else\n this._vertexSourceCode = e, this._fragmentSourceCode = t;\n this._prepareEffect(r);\n }\n /**\n * Unique key for this effect\n */\n get key() {\n return this._key;\n }\n /**\n * If the effect has been compiled and prepared.\n * @returns if the effect is compiled and prepared.\n */\n isReady() {\n try {\n return this._isReadyInternal();\n } catch {\n return !1;\n }\n }\n _isReadyInternal() {\n return this._isReady ? !0 : this._pipelineContext ? this._pipelineContext.isReady : !1;\n }\n /**\n * The engine the effect was initialized with.\n * @returns the engine.\n */\n getEngine() {\n return this._engine;\n }\n /**\n * The pipeline context for this effect\n * @returns the associated pipeline context\n */\n getPipelineContext() {\n return this._pipelineContext;\n }\n /**\n * The set of names of attribute variables for the shader.\n * @returns An array of attribute names.\n */\n getAttributesNames() {\n return this._attributesNames;\n }\n /**\n * Returns the attribute at the given index.\n * @param index The index of the attribute.\n * @returns The location of the attribute.\n */\n getAttributeLocation(e) {\n return this._attributes[e];\n }\n /**\n * Returns the attribute based on the name of the variable.\n * @param name of the attribute to look up.\n * @returns the attribute location.\n */\n getAttributeLocationByName(e) {\n return this._attributeLocationByName[e];\n }\n /**\n * The number of attributes.\n * @returns the number of attributes.\n */\n getAttributesCount() {\n return this._attributes.length;\n }\n /**\n * Gets the index of a uniform variable.\n * @param uniformName of the uniform to look up.\n * @returns the index.\n */\n getUniformIndex(e) {\n return this._uniformsNames.indexOf(e);\n }\n /**\n * Returns the attribute based on the name of the variable.\n * @param uniformName of the uniform to look up.\n * @returns the location of the uniform.\n */\n getUniform(e) {\n return this._uniforms[e];\n }\n /**\n * Returns an array of sampler variable names\n * @returns The array of sampler variable names.\n */\n getSamplers() {\n return this._samplerList;\n }\n /**\n * Returns an array of uniform variable names\n * @returns The array of uniform variable names.\n */\n getUniformNames() {\n return this._uniformsNames;\n }\n /**\n * Returns an array of uniform buffer variable names\n * @returns The array of uniform buffer variable names.\n */\n getUniformBuffersNames() {\n return this._uniformBuffersNamesList;\n }\n /**\n * Returns the index parameters used to create the effect\n * @returns The index parameters object\n */\n getIndexParameters() {\n return this._indexParameters;\n }\n /**\n * The error from the last compilation.\n * @returns the error string.\n */\n getCompilationError() {\n return this._compilationError;\n }\n /**\n * Gets a boolean indicating that all fallbacks were used during compilation\n * @returns true if all fallbacks were used\n */\n allFallbacksProcessed() {\n return this._allFallbacksProcessed;\n }\n /**\n * Adds a callback to the onCompiled observable and call the callback immediately if already ready.\n * @param func The callback to be used.\n */\n executeWhenCompiled(e) {\n if (this.isReady()) {\n e(this);\n return;\n }\n this.onCompileObservable.add((t) => {\n e(t);\n }), (!this._pipelineContext || this._pipelineContext.isAsync) && setTimeout(() => {\n this._checkIsReady(null);\n }, 16);\n }\n _checkIsReady(e) {\n try {\n if (this._isReadyInternal())\n return;\n } catch (t) {\n this._processCompilationErrors(t, e);\n return;\n }\n this._isDisposed || setTimeout(() => {\n this._checkIsReady(e);\n }, 16);\n }\n _loadShader(e, t, i, r) {\n if (typeof HTMLElement < \"u\" && e instanceof HTMLElement) {\n const o = O_(e);\n r(o);\n return;\n }\n if (e.substr(0, 7) === \"source:\") {\n r(e.substr(7));\n return;\n }\n if (e.substr(0, 7) === \"base64:\") {\n const o = window.atob(e.substr(7));\n r(o);\n return;\n }\n const s = Y.GetShadersStore(this._shaderLanguage);\n if (s[e + t + \"Shader\"]) {\n r(s[e + t + \"Shader\"]);\n return;\n }\n if (i && s[e + i + \"Shader\"]) {\n r(s[e + i + \"Shader\"]);\n return;\n }\n let a;\n e[0] === \".\" || e[0] === \"/\" || e.indexOf(\"http\") > -1 ? a = e : a = Y.GetShadersRepository(this._shaderLanguage) + e, this._engine._loadFile(a + \".\" + t.toLowerCase() + \".fx\", r);\n }\n /**\n * Gets the vertex shader source code of this effect\n * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)\n */\n get vertexSourceCode() {\n var e;\n return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride ? this._vertexSourceCodeOverride : ((e = this._pipelineContext) == null ? void 0 : e._getVertexShaderCode()) ?? this._vertexSourceCode;\n }\n /**\n * Gets the fragment shader source code of this effect\n * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)\n */\n get fragmentSourceCode() {\n var e;\n return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride ? this._fragmentSourceCodeOverride : ((e = this._pipelineContext) == null ? void 0 : e._getFragmentShaderCode()) ?? this._fragmentSourceCode;\n }\n /**\n * Gets the vertex shader source code before migration.\n * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.\n * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).\n */\n get vertexSourceCodeBeforeMigration() {\n return this._vertexSourceCodeBeforeMigration;\n }\n /**\n * Gets the fragment shader source code before migration.\n * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.\n * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).\n */\n get fragmentSourceCodeBeforeMigration() {\n return this._fragmentSourceCodeBeforeMigration;\n }\n /**\n * Gets the vertex shader source code before it has been modified by any processing\n */\n get rawVertexSourceCode() {\n return this._rawVertexSourceCode;\n }\n /**\n * Gets the fragment shader source code before it has been modified by any processing\n */\n get rawFragmentSourceCode() {\n return this._rawFragmentSourceCode;\n }\n /**\n * Recompiles the webGL program\n * @param vertexSourceCode The source code for the vertex shader.\n * @param fragmentSourceCode The source code for the fragment shader.\n * @param onCompiled Callback called when completed.\n * @param onError Callback called on error.\n * @internal\n */\n _rebuildProgram(e, t, i, r) {\n this._isReady = !1, this._vertexSourceCodeOverride = e, this._fragmentSourceCodeOverride = t, this.onError = (s, a) => {\n r && r(a);\n }, this.onCompiled = () => {\n var a, o;\n const s = this.getEngine().scenes;\n if (s)\n for (let l = 0; l < s.length; l++)\n s[l].markAllMaterialsAsDirty(63);\n (o = (a = this._pipelineContext)._handlesSpectorRebuildCallback) == null || o.call(a, i);\n }, this._fallbacks = null, this._prepareEffect();\n }\n /**\n * Prepares the effect\n * @internal\n */\n _prepareEffect(e = !1) {\n const t = this._attributesNames, i = this.defines, r = this._pipelineContext;\n this._isReady = !1;\n try {\n const s = this._engine;\n this._pipelineContext = (e ? r : void 0) ?? s.createPipelineContext(this._processingContext), this._pipelineContext._name = this._key.replace(/\\r/g, \"\").replace(/\\n/g, \"|\");\n const a = (o, l, c, h) => this._rebuildProgram(o, l, c, h);\n this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride ? s._preparePipelineContext(this._pipelineContext, this._vertexSourceCodeOverride, this._fragmentSourceCodeOverride, !0, this._rawVertexSourceCode, this._rawFragmentSourceCode, a, null, this._transformFeedbackVaryings, this._key) : s._preparePipelineContext(this._pipelineContext, this._vertexSourceCode, this._fragmentSourceCode, !1, this._rawVertexSourceCode, this._rawFragmentSourceCode, a, i, this._transformFeedbackVaryings, this._key), s._executeWhenRenderingStateIsCompiled(this._pipelineContext, () => {\n if (this._attributes = [], this._pipelineContext._fillEffectInformation(this, this._uniformBuffersNames, this._uniformsNames, this._uniforms, this._samplerList, this._samplers, t, this._attributes), t)\n for (let o = 0; o < t.length; o++) {\n const l = t[o];\n this._attributeLocationByName[l] = this._attributes[o];\n }\n s.bindSamplers(this), this._compilationError = \"\", this._isReady = !0, this.onCompiled && this.onCompiled(this), this.onCompileObservable.notifyObservers(this), this.onCompileObservable.clear(), this._fallbacks && this._fallbacks.unBindMesh(), r && !e && this.getEngine()._deletePipelineContext(r);\n }), this._pipelineContext.isAsync && this._checkIsReady(r);\n } catch (s) {\n this._processCompilationErrors(s, r);\n }\n }\n _getShaderCodeAndErrorLine(e, t, i) {\n const r = i ? /FRAGMENT SHADER ERROR: 0:(\\d+?):/ : /VERTEX SHADER ERROR: 0:(\\d+?):/;\n let s = null;\n if (t && e) {\n const a = t.match(r);\n if (a && a.length === 2) {\n const o = parseInt(a[1]), l = e.split(`\n`, -1);\n l.length >= o && (s = `Offending line [${o}] in ${i ? \"fragment\" : \"vertex\"} code: ${l[o - 1]}`);\n }\n }\n return [e, s];\n }\n _processCompilationErrors(e, t = null) {\n var a, o, l;\n this._compilationError = e.message;\n const i = this._attributesNames, r = this._fallbacks;\n if (ne.Error(\"Unable to compile effect:\"), ne.Error(\"Uniforms: \" + this._uniformsNames.map(function(c) {\n return \" \" + c;\n })), ne.Error(\"Attributes: \" + i.map(function(c) {\n return \" \" + c;\n })), ne.Error(`Defines:\n` + this.defines), Hi.LogShaderCodeOnCompilationError) {\n let c = null, h = null, u = null;\n (a = this._pipelineContext) != null && a._getVertexShaderCode() && ([u, c] = this._getShaderCodeAndErrorLine(this._pipelineContext._getVertexShaderCode(), this._compilationError, !1), u && (ne.Error(\"Vertex code:\"), ne.Error(u))), (o = this._pipelineContext) != null && o._getFragmentShaderCode() && ([u, h] = this._getShaderCodeAndErrorLine((l = this._pipelineContext) == null ? void 0 : l._getFragmentShaderCode(), this._compilationError, !0), u && (ne.Error(\"Fragment code:\"), ne.Error(u))), c && ne.Error(c), h && ne.Error(h);\n }\n ne.Error(\"Error: \" + this._compilationError);\n const s = () => {\n this.onError && this.onError(this, this._compilationError), this.onErrorObservable.notifyObservers(this);\n };\n t && (this._pipelineContext = t, this._isReady = !0, s()), r ? (this._pipelineContext = null, r.hasMoreFallbacks ? (this._allFallbacksProcessed = !1, ne.Error(\"Trying next fallback.\"), this.defines = r.reduce(this.defines, this), this._prepareEffect()) : (this._allFallbacksProcessed = !0, s(), this.onErrorObservable.clear(), this._fallbacks && this._fallbacks.unBindMesh())) : (this._allFallbacksProcessed = !0, t || s());\n }\n /**\n * Checks if the effect is supported. (Must be called after compilation)\n */\n get isSupported() {\n return this._compilationError === \"\";\n }\n /**\n * Binds a texture to the engine to be used as output of the shader.\n * @param channel Name of the output variable.\n * @param texture Texture to bind.\n * @internal\n */\n _bindTexture(e, t) {\n this._engine._bindTexture(this._samplers[e], t, e);\n }\n /**\n * Sets a texture on the engine to be used in the shader.\n * @param channel Name of the sampler variable.\n * @param texture Texture to set.\n */\n setTexture(e, t) {\n this._engine.setTexture(this._samplers[e], this._uniforms[e], t, e);\n }\n /**\n * Sets a depth stencil texture from a render target on the engine to be used in the shader.\n * @param channel Name of the sampler variable.\n * @param texture Texture to set.\n */\n setDepthStencilTexture(e, t) {\n this._engine.setDepthStencilTexture(this._samplers[e], this._uniforms[e], t, e);\n }\n /**\n * Sets an array of textures on the engine to be used in the shader.\n * @param channel Name of the variable.\n * @param textures Textures to set.\n */\n setTextureArray(e, t) {\n const i = e + \"Ex\";\n if (this._samplerList.indexOf(i + \"0\") === -1) {\n const r = this._samplerList.indexOf(e);\n for (let a = 1; a < t.length; a++) {\n const o = i + (a - 1).toString();\n this._samplerList.splice(r + a, 0, o);\n }\n let s = 0;\n for (const a of this._samplerList)\n this._samplers[a] = s, s += 1;\n }\n this._engine.setTextureArray(this._samplers[e], this._uniforms[e], t, e);\n }\n /**\n * Sets a texture to be the input of the specified post process. (To use the output, pass in the next post process in the pipeline)\n * @param channel Name of the sampler variable.\n * @param postProcess Post process to get the input texture from.\n */\n setTextureFromPostProcess(e, t) {\n this._engine.setTextureFromPostProcess(this._samplers[e], t, e);\n }\n /**\n * (Warning! setTextureFromPostProcessOutput may be desired instead)\n * Sets the input texture of the passed in post process to be input of this effect. (To use the output of the passed in post process use setTextureFromPostProcessOutput)\n * @param channel Name of the sampler variable.\n * @param postProcess Post process to get the output texture from.\n */\n setTextureFromPostProcessOutput(e, t) {\n this._engine.setTextureFromPostProcessOutput(this._samplers[e], t, e);\n }\n /**\n * Binds a buffer to a uniform.\n * @param buffer Buffer to bind.\n * @param name Name of the uniform variable to bind to.\n */\n bindUniformBuffer(e, t) {\n const i = this._uniformBuffersNames[t];\n i === void 0 || Hi._BaseCache[i] === e && this._engine._features.useUBOBindingCache || (Hi._BaseCache[i] = e, this._engine.bindUniformBufferBase(e, i, t));\n }\n /**\n * Binds block to a uniform.\n * @param blockName Name of the block to bind.\n * @param index Index to bind.\n */\n bindUniformBlock(e, t) {\n this._engine.bindUniformBlock(this._pipelineContext, e, t);\n }\n /**\n * Sets an integer value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param value Value to be set.\n * @returns this effect.\n */\n setInt(e, t) {\n return this._pipelineContext.setInt(e, t), this;\n }\n /**\n * Sets an int2 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First int in int2.\n * @param y Second int in int2.\n * @returns this effect.\n */\n setInt2(e, t, i) {\n return this._pipelineContext.setInt2(e, t, i), this;\n }\n /**\n * Sets an int3 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First int in int3.\n * @param y Second int in int3.\n * @param z Third int in int3.\n * @returns this effect.\n */\n setInt3(e, t, i, r) {\n return this._pipelineContext.setInt3(e, t, i, r), this;\n }\n /**\n * Sets an int4 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First int in int4.\n * @param y Second int in int4.\n * @param z Third int in int4.\n * @param w Fourth int in int4.\n * @returns this effect.\n */\n setInt4(e, t, i, r, s) {\n return this._pipelineContext.setInt4(e, t, i, r, s), this;\n }\n /**\n * Sets an int array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setIntArray(e, t) {\n return this._pipelineContext.setIntArray(e, t), this;\n }\n /**\n * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setIntArray2(e, t) {\n return this._pipelineContext.setIntArray2(e, t), this;\n }\n /**\n * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setIntArray3(e, t) {\n return this._pipelineContext.setIntArray3(e, t), this;\n }\n /**\n * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setIntArray4(e, t) {\n return this._pipelineContext.setIntArray4(e, t), this;\n }\n /**\n * Sets an unsigned integer value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param value Value to be set.\n * @returns this effect.\n */\n setUInt(e, t) {\n return this._pipelineContext.setUInt(e, t), this;\n }\n /**\n * Sets an unsigned int2 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First unsigned int in uint2.\n * @param y Second unsigned int in uint2.\n * @returns this effect.\n */\n setUInt2(e, t, i) {\n return this._pipelineContext.setUInt2(e, t, i), this;\n }\n /**\n * Sets an unsigned int3 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First unsigned int in uint3.\n * @param y Second unsigned int in uint3.\n * @param z Third unsigned int in uint3.\n * @returns this effect.\n */\n setUInt3(e, t, i, r) {\n return this._pipelineContext.setUInt3(e, t, i, r), this;\n }\n /**\n * Sets an unsigned int4 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First unsigned int in uint4.\n * @param y Second unsigned int in uint4.\n * @param z Third unsigned int in uint4.\n * @param w Fourth unsigned int in uint4.\n * @returns this effect.\n */\n setUInt4(e, t, i, r, s) {\n return this._pipelineContext.setUInt4(e, t, i, r, s), this;\n }\n /**\n * Sets an unsigned int array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setUIntArray(e, t) {\n return this._pipelineContext.setUIntArray(e, t), this;\n }\n /**\n * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setUIntArray2(e, t) {\n return this._pipelineContext.setUIntArray2(e, t), this;\n }\n /**\n * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setUIntArray3(e, t) {\n return this._pipelineContext.setUIntArray3(e, t), this;\n }\n /**\n * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setUIntArray4(e, t) {\n return this._pipelineContext.setUIntArray4(e, t), this;\n }\n /**\n * Sets an float array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setFloatArray(e, t) {\n return this._pipelineContext.setArray(e, t), this;\n }\n /**\n * Sets an float array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setFloatArray2(e, t) {\n return this._pipelineContext.setArray2(e, t), this;\n }\n /**\n * Sets an float array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setFloatArray3(e, t) {\n return this._pipelineContext.setArray3(e, t), this;\n }\n /**\n * Sets an float array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setFloatArray4(e, t) {\n return this._pipelineContext.setArray4(e, t), this;\n }\n /**\n * Sets an array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setArray(e, t) {\n return this._pipelineContext.setArray(e, t), this;\n }\n /**\n * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setArray2(e, t) {\n return this._pipelineContext.setArray2(e, t), this;\n }\n /**\n * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setArray3(e, t) {\n return this._pipelineContext.setArray3(e, t), this;\n }\n /**\n * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n * @returns this effect.\n */\n setArray4(e, t) {\n return this._pipelineContext.setArray4(e, t), this;\n }\n /**\n * Sets matrices on a uniform variable.\n * @param uniformName Name of the variable.\n * @param matrices matrices to be set.\n * @returns this effect.\n */\n setMatrices(e, t) {\n return this._pipelineContext.setMatrices(e, t), this;\n }\n /**\n * Sets matrix on a uniform variable.\n * @param uniformName Name of the variable.\n * @param matrix matrix to be set.\n * @returns this effect.\n */\n setMatrix(e, t) {\n return this._pipelineContext.setMatrix(e, t), this;\n }\n /**\n * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix)\n * @param uniformName Name of the variable.\n * @param matrix matrix to be set.\n * @returns this effect.\n */\n setMatrix3x3(e, t) {\n return this._pipelineContext.setMatrix3x3(e, t), this;\n }\n /**\n * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix)\n * @param uniformName Name of the variable.\n * @param matrix matrix to be set.\n * @returns this effect.\n */\n setMatrix2x2(e, t) {\n return this._pipelineContext.setMatrix2x2(e, t), this;\n }\n /**\n * Sets a float on a uniform variable.\n * @param uniformName Name of the variable.\n * @param value value to be set.\n * @returns this effect.\n */\n setFloat(e, t) {\n return this._pipelineContext.setFloat(e, t), this;\n }\n /**\n * Sets a boolean on a uniform variable.\n * @param uniformName Name of the variable.\n * @param bool value to be set.\n * @returns this effect.\n */\n setBool(e, t) {\n return this._pipelineContext.setInt(e, t ? 1 : 0), this;\n }\n /**\n * Sets a Vector2 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param vector2 vector2 to be set.\n * @returns this effect.\n */\n setVector2(e, t) {\n return this._pipelineContext.setVector2(e, t), this;\n }\n /**\n * Sets a float2 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First float in float2.\n * @param y Second float in float2.\n * @returns this effect.\n */\n setFloat2(e, t, i) {\n return this._pipelineContext.setFloat2(e, t, i), this;\n }\n /**\n * Sets a Vector3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param vector3 Value to be set.\n * @returns this effect.\n */\n setVector3(e, t) {\n return this._pipelineContext.setVector3(e, t), this;\n }\n /**\n * Sets a float3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First float in float3.\n * @param y Second float in float3.\n * @param z Third float in float3.\n * @returns this effect.\n */\n setFloat3(e, t, i, r) {\n return this._pipelineContext.setFloat3(e, t, i, r), this;\n }\n /**\n * Sets a Vector4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param vector4 Value to be set.\n * @returns this effect.\n */\n setVector4(e, t) {\n return this._pipelineContext.setVector4(e, t), this;\n }\n /**\n * Sets a Quaternion on a uniform variable.\n * @param uniformName Name of the variable.\n * @param quaternion Value to be set.\n * @returns this effect.\n */\n setQuaternion(e, t) {\n return this._pipelineContext.setQuaternion(e, t), this;\n }\n /**\n * Sets a float4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First float in float4.\n * @param y Second float in float4.\n * @param z Third float in float4.\n * @param w Fourth float in float4.\n * @returns this effect.\n */\n setFloat4(e, t, i, r, s) {\n return this._pipelineContext.setFloat4(e, t, i, r, s), this;\n }\n /**\n * Sets a Color3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param color3 Value to be set.\n * @returns this effect.\n */\n setColor3(e, t) {\n return this._pipelineContext.setColor3(e, t), this;\n }\n /**\n * Sets a Color4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param color3 Value to be set.\n * @param alpha Alpha value to be set.\n * @returns this effect.\n */\n setColor4(e, t, i) {\n return this._pipelineContext.setColor4(e, t, i), this;\n }\n /**\n * Sets a Color4 on a uniform variable\n * @param uniformName defines the name of the variable\n * @param color4 defines the value to be set\n * @returns this effect.\n */\n setDirectColor4(e, t) {\n return this._pipelineContext.setDirectColor4(e, t), this;\n }\n /**\n * Release all associated resources.\n **/\n dispose() {\n this._pipelineContext && this._pipelineContext.dispose(), this._engine._releaseEffect(this), this._isDisposed = !0;\n }\n /**\n * This function will add a new shader to the shader store\n * @param name the name of the shader\n * @param pixelShader optional pixel shader content\n * @param vertexShader optional vertex shader content\n * @param shaderLanguage the language the shader is written in (default: GLSL)\n */\n static RegisterShader(e, t, i, r = _i.GLSL) {\n t && (Y.GetShadersStore(r)[`${e}PixelShader`] = t), i && (Y.GetShadersStore(r)[`${e}VertexShader`] = i);\n }\n /**\n * Resets the cache of effects.\n */\n static ResetCache() {\n Hi._BaseCache = {};\n }\n}\nHi.LogShaderCodeOnCompilationError = !0;\nHi._UniqueIdSeed = 0;\nHi._BaseCache = {};\nHi.ShadersStore = Y.ShadersStore;\nHi.IncludesShadersStore = Y.IncludesShadersStore;\nclass cy {\n /**\n * Initializes the state.\n * @param reset\n */\n constructor(e = !0) {\n this._isDepthTestDirty = !1, this._isDepthMaskDirty = !1, this._isDepthFuncDirty = !1, this._isCullFaceDirty = !1, this._isCullDirty = !1, this._isZOffsetDirty = !1, this._isFrontFaceDirty = !1, e && this.reset();\n }\n get isDirty() {\n return this._isDepthFuncDirty || this._isDepthTestDirty || this._isDepthMaskDirty || this._isCullFaceDirty || this._isCullDirty || this._isZOffsetDirty || this._isFrontFaceDirty;\n }\n get zOffset() {\n return this._zOffset;\n }\n set zOffset(e) {\n this._zOffset !== e && (this._zOffset = e, this._isZOffsetDirty = !0);\n }\n get zOffsetUnits() {\n return this._zOffsetUnits;\n }\n set zOffsetUnits(e) {\n this._zOffsetUnits !== e && (this._zOffsetUnits = e, this._isZOffsetDirty = !0);\n }\n get cullFace() {\n return this._cullFace;\n }\n set cullFace(e) {\n this._cullFace !== e && (this._cullFace = e, this._isCullFaceDirty = !0);\n }\n get cull() {\n return this._cull;\n }\n set cull(e) {\n this._cull !== e && (this._cull = e, this._isCullDirty = !0);\n }\n get depthFunc() {\n return this._depthFunc;\n }\n set depthFunc(e) {\n this._depthFunc !== e && (this._depthFunc = e, this._isDepthFuncDirty = !0);\n }\n get depthMask() {\n return this._depthMask;\n }\n set depthMask(e) {\n this._depthMask !== e && (this._depthMask = e, this._isDepthMaskDirty = !0);\n }\n get depthTest() {\n return this._depthTest;\n }\n set depthTest(e) {\n this._depthTest !== e && (this._depthTest = e, this._isDepthTestDirty = !0);\n }\n get frontFace() {\n return this._frontFace;\n }\n set frontFace(e) {\n this._frontFace !== e && (this._frontFace = e, this._isFrontFaceDirty = !0);\n }\n reset() {\n this._depthMask = !0, this._depthTest = !0, this._depthFunc = null, this._cullFace = null, this._cull = null, this._zOffset = 0, this._zOffsetUnits = 0, this._frontFace = null, this._isDepthTestDirty = !0, this._isDepthMaskDirty = !0, this._isDepthFuncDirty = !1, this._isCullFaceDirty = !1, this._isCullDirty = !1, this._isZOffsetDirty = !0, this._isFrontFaceDirty = !1;\n }\n apply(e) {\n this.isDirty && (this._isCullDirty && (this.cull ? e.enable(e.CULL_FACE) : e.disable(e.CULL_FACE), this._isCullDirty = !1), this._isCullFaceDirty && (e.cullFace(this.cullFace), this._isCullFaceDirty = !1), this._isDepthMaskDirty && (e.depthMask(this.depthMask), this._isDepthMaskDirty = !1), this._isDepthTestDirty && (this.depthTest ? e.enable(e.DEPTH_TEST) : e.disable(e.DEPTH_TEST), this._isDepthTestDirty = !1), this._isDepthFuncDirty && (e.depthFunc(this.depthFunc), this._isDepthFuncDirty = !1), this._isZOffsetDirty && (this.zOffset || this.zOffsetUnits ? (e.enable(e.POLYGON_OFFSET_FILL), e.polygonOffset(this.zOffset, this.zOffsetUnits)) : e.disable(e.POLYGON_OFFSET_FILL), this._isZOffsetDirty = !1), this._isFrontFaceDirty && (e.frontFace(this.frontFace), this._isFrontFaceDirty = !1));\n }\n}\nclass Ls {\n constructor() {\n this.reset();\n }\n reset() {\n this.enabled = !1, this.mask = 255, this.func = Ls.ALWAYS, this.funcRef = 1, this.funcMask = 255, this.opStencilFail = Ls.KEEP, this.opDepthFail = Ls.KEEP, this.opStencilDepthPass = Ls.REPLACE;\n }\n get stencilFunc() {\n return this.func;\n }\n set stencilFunc(e) {\n this.func = e;\n }\n get stencilFuncRef() {\n return this.funcRef;\n }\n set stencilFuncRef(e) {\n this.funcRef = e;\n }\n get stencilFuncMask() {\n return this.funcMask;\n }\n set stencilFuncMask(e) {\n this.funcMask = e;\n }\n get stencilOpStencilFail() {\n return this.opStencilFail;\n }\n set stencilOpStencilFail(e) {\n this.opStencilFail = e;\n }\n get stencilOpDepthFail() {\n return this.opDepthFail;\n }\n set stencilOpDepthFail(e) {\n this.opDepthFail = e;\n }\n get stencilOpStencilDepthPass() {\n return this.opStencilDepthPass;\n }\n set stencilOpStencilDepthPass(e) {\n this.opStencilDepthPass = e;\n }\n get stencilMask() {\n return this.mask;\n }\n set stencilMask(e) {\n this.mask = e;\n }\n get stencilTest() {\n return this.enabled;\n }\n set stencilTest(e) {\n this.enabled = e;\n }\n}\nLs.ALWAYS = 519;\nLs.KEEP = 7680;\nLs.REPLACE = 7681;\nclass hy {\n /**\n * Initializes the state.\n */\n constructor() {\n this._blendFunctionParameters = new Array(4), this._blendEquationParameters = new Array(2), this._blendConstants = new Array(4), this._isBlendConstantsDirty = !1, this._alphaBlend = !1, this._isAlphaBlendDirty = !1, this._isBlendFunctionParametersDirty = !1, this._isBlendEquationParametersDirty = !1, this.reset();\n }\n get isDirty() {\n return this._isAlphaBlendDirty || this._isBlendFunctionParametersDirty || this._isBlendEquationParametersDirty;\n }\n get alphaBlend() {\n return this._alphaBlend;\n }\n set alphaBlend(e) {\n this._alphaBlend !== e && (this._alphaBlend = e, this._isAlphaBlendDirty = !0);\n }\n setAlphaBlendConstants(e, t, i, r) {\n this._blendConstants[0] === e && this._blendConstants[1] === t && this._blendConstants[2] === i && this._blendConstants[3] === r || (this._blendConstants[0] = e, this._blendConstants[1] = t, this._blendConstants[2] = i, this._blendConstants[3] = r, this._isBlendConstantsDirty = !0);\n }\n setAlphaBlendFunctionParameters(e, t, i, r) {\n this._blendFunctionParameters[0] === e && this._blendFunctionParameters[1] === t && this._blendFunctionParameters[2] === i && this._blendFunctionParameters[3] === r || (this._blendFunctionParameters[0] = e, this._blendFunctionParameters[1] = t, this._blendFunctionParameters[2] = i, this._blendFunctionParameters[3] = r, this._isBlendFunctionParametersDirty = !0);\n }\n setAlphaEquationParameters(e, t) {\n this._blendEquationParameters[0] === e && this._blendEquationParameters[1] === t || (this._blendEquationParameters[0] = e, this._blendEquationParameters[1] = t, this._isBlendEquationParametersDirty = !0);\n }\n reset() {\n this._alphaBlend = !1, this._blendFunctionParameters[0] = null, this._blendFunctionParameters[1] = null, this._blendFunctionParameters[2] = null, this._blendFunctionParameters[3] = null, this._blendEquationParameters[0] = null, this._blendEquationParameters[1] = null, this._blendConstants[0] = null, this._blendConstants[1] = null, this._blendConstants[2] = null, this._blendConstants[3] = null, this._isAlphaBlendDirty = !0, this._isBlendFunctionParametersDirty = !1, this._isBlendEquationParametersDirty = !1, this._isBlendConstantsDirty = !1;\n }\n apply(e) {\n this.isDirty && (this._isAlphaBlendDirty && (this._alphaBlend ? e.enable(e.BLEND) : e.disable(e.BLEND), this._isAlphaBlendDirty = !1), this._isBlendFunctionParametersDirty && (e.blendFuncSeparate(this._blendFunctionParameters[0], this._blendFunctionParameters[1], this._blendFunctionParameters[2], this._blendFunctionParameters[3]), this._isBlendFunctionParametersDirty = !1), this._isBlendEquationParametersDirty && (e.blendEquationSeparate(this._blendEquationParameters[0], this._blendEquationParameters[1]), this._isBlendEquationParametersDirty = !1), this._isBlendConstantsDirty && (e.blendColor(this._blendConstants[0], this._blendConstants[1], this._blendConstants[2], this._blendConstants[3]), this._isBlendConstantsDirty = !1));\n }\n}\nclass uy {\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapU() {\n return this._cachedWrapU;\n }\n set wrapU(e) {\n this._cachedWrapU = e;\n }\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapV() {\n return this._cachedWrapV;\n }\n set wrapV(e) {\n this._cachedWrapV = e;\n }\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapR() {\n return this._cachedWrapR;\n }\n set wrapR(e) {\n this._cachedWrapR = e;\n }\n /**\n * With compliant hardware and browser (supporting anisotropic filtering)\n * this defines the level of anisotropic filtering in the texture.\n * The higher the better but the slower.\n */\n get anisotropicFilteringLevel() {\n return this._cachedAnisotropicFilteringLevel;\n }\n set anisotropicFilteringLevel(e) {\n this._cachedAnisotropicFilteringLevel = e;\n }\n /**\n * Gets or sets the comparison function (513, 514, etc). Set 0 to not use a comparison function\n */\n get comparisonFunction() {\n return this._comparisonFunction;\n }\n set comparisonFunction(e) {\n this._comparisonFunction = e;\n }\n /**\n * Indicates to use the mip maps (if available on the texture).\n * Thanks to this flag, you can instruct the sampler to not sample the mipmaps even if they exist (and if the sampling mode is set to a value that normally samples the mipmaps!)\n */\n get useMipMaps() {\n return this._useMipMaps;\n }\n set useMipMaps(e) {\n this._useMipMaps = e;\n }\n /**\n * Creates a Sampler instance\n */\n constructor() {\n this.samplingMode = -1, this._useMipMaps = !0, this._cachedWrapU = null, this._cachedWrapV = null, this._cachedWrapR = null, this._cachedAnisotropicFilteringLevel = null, this._comparisonFunction = 0;\n }\n /**\n * Sets all the parameters of the sampler\n * @param wrapU u address mode (default: TEXTURE_WRAP_ADDRESSMODE)\n * @param wrapV v address mode (default: TEXTURE_WRAP_ADDRESSMODE)\n * @param wrapR r address mode (default: TEXTURE_WRAP_ADDRESSMODE)\n * @param anisotropicFilteringLevel anisotropic level (default: 1)\n * @param samplingMode sampling mode (default: 2)\n * @param comparisonFunction comparison function (default: 0 - no comparison function)\n * @returns the current sampler instance\n */\n setParameters(e = 1, t = 1, i = 1, r = 1, s = 2, a = 0) {\n return this._cachedWrapU = e, this._cachedWrapV = t, this._cachedWrapR = i, this._cachedAnisotropicFilteringLevel = r, this.samplingMode = s, this._comparisonFunction = a, this;\n }\n /**\n * Compares this sampler with another one\n * @param other sampler to compare with\n * @returns true if the samplers have the same parametres, else false\n */\n compareSampler(e) {\n return this._cachedWrapU === e._cachedWrapU && this._cachedWrapV === e._cachedWrapV && this._cachedWrapR === e._cachedWrapR && this._cachedAnisotropicFilteringLevel === e._cachedAnisotropicFilteringLevel && this.samplingMode === e.samplingMode && this._comparisonFunction === e._comparisonFunction && this._useMipMaps === e._useMipMaps;\n }\n}\nvar Dt;\n(function(n) {\n n[n.Unknown = 0] = \"Unknown\", n[n.Url = 1] = \"Url\", n[n.Temp = 2] = \"Temp\", n[n.Raw = 3] = \"Raw\", n[n.Dynamic = 4] = \"Dynamic\", n[n.RenderTarget = 5] = \"RenderTarget\", n[n.MultiRenderTarget = 6] = \"MultiRenderTarget\", n[n.Cube = 7] = \"Cube\", n[n.CubeRaw = 8] = \"CubeRaw\", n[n.CubePrefiltered = 9] = \"CubePrefiltered\", n[n.Raw3D = 10] = \"Raw3D\", n[n.Raw2DArray = 11] = \"Raw2DArray\", n[n.DepthStencil = 12] = \"DepthStencil\", n[n.CubeRawRGBD = 13] = \"CubeRawRGBD\", n[n.Depth = 14] = \"Depth\";\n})(Dt || (Dt = {}));\nclass or extends uy {\n /**\n * Gets a boolean indicating if the texture uses mipmaps\n * TODO implements useMipMaps as a separate setting from generateMipMaps\n */\n get useMipMaps() {\n return this.generateMipMaps;\n }\n set useMipMaps(e) {\n this.generateMipMaps = e;\n }\n /** Gets the unique id of the internal texture */\n get uniqueId() {\n return this._uniqueId;\n }\n /** @internal */\n _setUniqueId(e) {\n this._uniqueId = e;\n }\n /**\n * Gets the Engine the texture belongs to.\n * @returns The babylon engine\n */\n getEngine() {\n return this._engine;\n }\n /**\n * Gets the data source type of the texture\n */\n get source() {\n return this._source;\n }\n /**\n * Creates a new InternalTexture\n * @param engine defines the engine to use\n * @param source defines the type of data that will be used\n * @param delayAllocation if the texture allocation should be delayed (default: false)\n */\n constructor(e, t, i = !1) {\n super(), this.isReady = !1, this.isCube = !1, this.is3D = !1, this.is2DArray = !1, this.isMultiview = !1, this.url = \"\", this.generateMipMaps = !1, this.samples = 0, this.type = -1, this.format = -1, this.onLoadedObservable = new he(), this.onErrorObservable = new he(), this.onRebuildCallback = null, this.width = 0, this.height = 0, this.depth = 0, this.baseWidth = 0, this.baseHeight = 0, this.baseDepth = 0, this.invertY = !1, this._invertVScale = !1, this._associatedChannel = -1, this._source = Dt.Unknown, this._buffer = null, this._bufferView = null, this._bufferViewArray = null, this._bufferViewArrayArray = null, this._size = 0, this._extension = \"\", this._files = null, this._workingCanvas = null, this._workingContext = null, this._cachedCoordinatesMode = null, this._isDisabled = !1, this._compression = null, this._sphericalPolynomial = null, this._sphericalPolynomialPromise = null, this._sphericalPolynomialComputed = !1, this._lodGenerationScale = 0, this._lodGenerationOffset = 0, this._useSRGBBuffer = !1, this._creationFlags = 0, this._lodTextureHigh = null, this._lodTextureMid = null, this._lodTextureLow = null, this._isRGBD = !1, this._linearSpecularLOD = !1, this._irradianceTexture = null, this._hardwareTexture = null, this._maxLodLevel = null, this._references = 1, this._gammaSpace = null, this._premulAlpha = !1, this._dynamicTextureSource = null, this._engine = e, this._source = t, this._uniqueId = or._Counter++, i || (this._hardwareTexture = e._createHardwareTexture());\n }\n /**\n * Increments the number of references (ie. the number of Texture that point to it)\n */\n incrementReferences() {\n this._references++;\n }\n /**\n * Change the size of the texture (not the size of the content)\n * @param width defines the new width\n * @param height defines the new height\n * @param depth defines the new depth (1 by default)\n */\n updateSize(e, t, i = 1) {\n this._engine.updateTextureDimensions(this, e, t, i), this.width = e, this.height = t, this.depth = i, this.baseWidth = e, this.baseHeight = t, this.baseDepth = i, this._size = e * t * i;\n }\n /** @internal */\n _rebuild() {\n if (this.isReady = !1, this._cachedCoordinatesMode = null, this._cachedWrapU = null, this._cachedWrapV = null, this._cachedWrapR = null, this._cachedAnisotropicFilteringLevel = null, this.onRebuildCallback) {\n const t = this.onRebuildCallback(this), i = (r) => {\n r._swapAndDie(this, !1), this.isReady = t.isReady;\n };\n t.isAsync ? t.proxy.then(i) : i(t.proxy);\n return;\n }\n let e;\n switch (this.source) {\n case Dt.Temp:\n break;\n case Dt.Url:\n e = this._engine.createTexture(\n this._originalUrl ?? this.url,\n !this.generateMipMaps,\n this.invertY,\n null,\n this.samplingMode,\n // Do not use Proxy here as it could be fully synchronous\n // and proxy would be undefined.\n (t) => {\n t._swapAndDie(this, !1), this.isReady = !0;\n },\n null,\n this._buffer,\n void 0,\n this.format,\n this._extension,\n void 0,\n void 0,\n void 0,\n this._useSRGBBuffer\n );\n return;\n case Dt.Raw:\n e = this._engine.createRawTexture(this._bufferView, this.baseWidth, this.baseHeight, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression, this.type, this._creationFlags, this._useSRGBBuffer), e._swapAndDie(this, !1), this.isReady = !0;\n break;\n case Dt.Raw3D:\n e = this._engine.createRawTexture3D(this._bufferView, this.baseWidth, this.baseHeight, this.baseDepth, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression, this.type), e._swapAndDie(this, !1), this.isReady = !0;\n break;\n case Dt.Raw2DArray:\n e = this._engine.createRawTexture2DArray(this._bufferView, this.baseWidth, this.baseHeight, this.baseDepth, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression, this.type), e._swapAndDie(this, !1), this.isReady = !0;\n break;\n case Dt.Dynamic:\n e = this._engine.createDynamicTexture(this.baseWidth, this.baseHeight, this.generateMipMaps, this.samplingMode), e._swapAndDie(this, !1), this._dynamicTextureSource && this._engine.updateDynamicTexture(this, this._dynamicTextureSource, this.invertY, this._premulAlpha, this.format, !0);\n break;\n case Dt.Cube:\n e = this._engine.createCubeTexture(this.url, null, this._files, !this.generateMipMaps, () => {\n e._swapAndDie(this, !1), this.isReady = !0;\n }, null, this.format, this._extension, !1, 0, 0, null, void 0, this._useSRGBBuffer);\n return;\n case Dt.CubeRaw:\n e = this._engine.createRawCubeTexture(this._bufferViewArray, this.width, this._originalFormat ?? this.format, this.type, this.generateMipMaps, this.invertY, this.samplingMode, this._compression), e._swapAndDie(this, !1), this.isReady = !0;\n break;\n case Dt.CubeRawRGBD:\n return;\n case Dt.CubePrefiltered:\n e = this._engine.createPrefilteredCubeTexture(this.url, null, this._lodGenerationScale, this._lodGenerationOffset, (t) => {\n t && t._swapAndDie(this, !1), this.isReady = !0;\n }, null, this.format, this._extension), e._sphericalPolynomial = this._sphericalPolynomial;\n return;\n case Dt.DepthStencil:\n case Dt.Depth:\n break;\n }\n }\n /**\n * @internal\n */\n _swapAndDie(e, t = !0) {\n var s;\n (s = this._hardwareTexture) == null || s.setUsage(e._source, this.generateMipMaps, this.is2DArray, this.isCube, this.is3D, this.width, this.height, this.depth), e._hardwareTexture = this._hardwareTexture, t && (e._isRGBD = this._isRGBD), this._lodTextureHigh && (e._lodTextureHigh && e._lodTextureHigh.dispose(), e._lodTextureHigh = this._lodTextureHigh), this._lodTextureMid && (e._lodTextureMid && e._lodTextureMid.dispose(), e._lodTextureMid = this._lodTextureMid), this._lodTextureLow && (e._lodTextureLow && e._lodTextureLow.dispose(), e._lodTextureLow = this._lodTextureLow), this._irradianceTexture && (e._irradianceTexture && e._irradianceTexture.dispose(), e._irradianceTexture = this._irradianceTexture);\n const i = this._engine.getLoadedTexturesCache();\n let r = i.indexOf(this);\n r !== -1 && i.splice(r, 1), r = i.indexOf(e), r === -1 && i.push(e);\n }\n /**\n * Dispose the current allocated resources\n */\n dispose() {\n this._references--, this.onLoadedObservable.clear(), this.onErrorObservable.clear(), this._references === 0 && (this._engine._releaseTexture(this), this._hardwareTexture = null, this._dynamicTextureSource = null);\n }\n}\nor._Counter = 0;\nclass fy {\n constructor() {\n this.shaderLanguage = _i.GLSL;\n }\n postProcessor(e, t, i, r, s) {\n if (!s.getCaps().drawBuffersExtension) {\n const a = /#extension.+GL_EXT_draw_buffers.+(enable|require)/g;\n e = e.replace(a, \"\");\n }\n return e;\n }\n}\nconst dy = /(flat\\s)?\\s*varying\\s*.*/;\nclass py {\n constructor() {\n this.shaderLanguage = _i.GLSL;\n }\n attributeProcessor(e) {\n return e.replace(\"attribute\", \"in\");\n }\n varyingCheck(e, t) {\n return dy.test(e);\n }\n varyingProcessor(e, t) {\n return e.replace(\"varying\", t ? \"in\" : \"out\");\n }\n postProcessor(e, t, i) {\n const r = e.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1, s = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\n if (e = e.replace(s, \"\"), e = e.replace(/texture2D\\s*\\(/g, \"texture(\"), i) {\n const a = e.search(/layout *\\(location *= *0\\) *out/g) !== -1;\n e = e.replace(/texture2DLodEXT\\s*\\(/g, \"textureLod(\"), e = e.replace(/textureCubeLodEXT\\s*\\(/g, \"textureLod(\"), e = e.replace(/textureCube\\s*\\(/g, \"texture(\"), e = e.replace(/gl_FragDepthEXT/g, \"gl_FragDepth\"), e = e.replace(/gl_FragColor/g, \"glFragColor\"), e = e.replace(/gl_FragData/g, \"glFragData\"), e = e.replace(/void\\s+?main\\s*\\(/g, (r || a ? \"\" : `layout(location = 0) out vec4 glFragColor;\n`) + \"void main(\");\n } else if (t.indexOf(\"#define MULTIVIEW\") !== -1)\n return `#extension GL_OVR_multiview2 : require\nlayout (num_views = 2) in;\n` + e;\n return e;\n }\n}\nclass Wo {\n /**\n * Gets the underlying buffer\n */\n get underlyingResource() {\n return null;\n }\n /**\n * Constructs the buffer\n */\n constructor() {\n this.references = 0, this.capacity = 0, this.is32Bits = !1, this.uniqueId = Wo._Counter++;\n }\n}\nWo._Counter = 0;\nclass po extends Wo {\n constructor(e) {\n super(), this._buffer = e;\n }\n get underlyingResource() {\n return this._buffer;\n }\n}\nclass gy {\n constructor() {\n this._valueCache = {}, this.vertexCompilationError = null, this.fragmentCompilationError = null, this.programLinkError = null, this.programValidationError = null, this._isDisposed = !1;\n }\n get isAsync() {\n return this.isParallelCompiled;\n }\n get isReady() {\n return this.program ? this.isParallelCompiled ? this.engine._isRenderingStateCompiled(this) : !0 : !1;\n }\n _handlesSpectorRebuildCallback(e) {\n e && this.program && e(this.program);\n }\n _fillEffectInformation(e, t, i, r, s, a, o, l) {\n const c = this.engine;\n if (c.supportsUniformBuffers)\n for (const f in t)\n e.bindUniformBlock(f, t[f]);\n this.engine.getUniforms(this, i).forEach((f, d) => {\n r[i[d]] = f;\n }), this._uniforms = r;\n let u;\n for (u = 0; u < s.length; u++)\n e.getUniform(s[u]) == null && (s.splice(u, 1), u--);\n s.forEach((f, d) => {\n a[f] = d;\n });\n for (const f of c.getAttributes(this, o))\n l.push(f);\n }\n /**\n * Release all associated resources.\n **/\n dispose() {\n this._uniforms = {}, this._isDisposed = !0;\n }\n /**\n * @internal\n */\n _cacheMatrix(e, t) {\n const i = this._valueCache[e], r = t.updateFlag;\n return i !== void 0 && i === r ? !1 : (this._valueCache[e] = r, !0);\n }\n /**\n * @internal\n */\n _cacheFloat2(e, t, i) {\n let r = this._valueCache[e];\n if (!r || r.length !== 2)\n return r = [t, i], this._valueCache[e] = r, !0;\n let s = !1;\n return r[0] !== t && (r[0] = t, s = !0), r[1] !== i && (r[1] = i, s = !0), s;\n }\n /**\n * @internal\n */\n _cacheFloat3(e, t, i, r) {\n let s = this._valueCache[e];\n if (!s || s.length !== 3)\n return s = [t, i, r], this._valueCache[e] = s, !0;\n let a = !1;\n return s[0] !== t && (s[0] = t, a = !0), s[1] !== i && (s[1] = i, a = !0), s[2] !== r && (s[2] = r, a = !0), a;\n }\n /**\n * @internal\n */\n _cacheFloat4(e, t, i, r, s) {\n let a = this._valueCache[e];\n if (!a || a.length !== 4)\n return a = [t, i, r, s], this._valueCache[e] = a, !0;\n let o = !1;\n return a[0] !== t && (a[0] = t, o = !0), a[1] !== i && (a[1] = i, o = !0), a[2] !== r && (a[2] = r, o = !0), a[3] !== s && (a[3] = s, o = !0), o;\n }\n /**\n * Sets an integer value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param value Value to be set.\n */\n setInt(e, t) {\n const i = this._valueCache[e];\n i !== void 0 && i === t || this.engine.setInt(this._uniforms[e], t) && (this._valueCache[e] = t);\n }\n /**\n * Sets a int2 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First int in int2.\n * @param y Second int in int2.\n */\n setInt2(e, t, i) {\n this._cacheFloat2(e, t, i) && (this.engine.setInt2(this._uniforms[e], t, i) || (this._valueCache[e] = null));\n }\n /**\n * Sets a int3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First int in int3.\n * @param y Second int in int3.\n * @param z Third int in int3.\n */\n setInt3(e, t, i, r) {\n this._cacheFloat3(e, t, i, r) && (this.engine.setInt3(this._uniforms[e], t, i, r) || (this._valueCache[e] = null));\n }\n /**\n * Sets a int4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First int in int4.\n * @param y Second int in int4.\n * @param z Third int in int4.\n * @param w Fourth int in int4.\n */\n setInt4(e, t, i, r, s) {\n this._cacheFloat4(e, t, i, r, s) && (this.engine.setInt4(this._uniforms[e], t, i, r, s) || (this._valueCache[e] = null));\n }\n /**\n * Sets an int array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setIntArray(e, t) {\n this._valueCache[e] = null, this.engine.setIntArray(this._uniforms[e], t);\n }\n /**\n * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setIntArray2(e, t) {\n this._valueCache[e] = null, this.engine.setIntArray2(this._uniforms[e], t);\n }\n /**\n * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setIntArray3(e, t) {\n this._valueCache[e] = null, this.engine.setIntArray3(this._uniforms[e], t);\n }\n /**\n * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setIntArray4(e, t) {\n this._valueCache[e] = null, this.engine.setIntArray4(this._uniforms[e], t);\n }\n /**\n * Sets an unsigned integer value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param value Value to be set.\n */\n setUInt(e, t) {\n const i = this._valueCache[e];\n i !== void 0 && i === t || this.engine.setUInt(this._uniforms[e], t) && (this._valueCache[e] = t);\n }\n /**\n * Sets an unsigned int2 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First unsigned int in uint2.\n * @param y Second unsigned int in uint2.\n */\n setUInt2(e, t, i) {\n this._cacheFloat2(e, t, i) && (this.engine.setUInt2(this._uniforms[e], t, i) || (this._valueCache[e] = null));\n }\n /**\n * Sets an unsigned int3 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First unsigned int in uint3.\n * @param y Second unsigned int in uint3.\n * @param z Third unsigned int in uint3.\n */\n setUInt3(e, t, i, r) {\n this._cacheFloat3(e, t, i, r) && (this.engine.setUInt3(this._uniforms[e], t, i, r) || (this._valueCache[e] = null));\n }\n /**\n * Sets an unsigned int4 value on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First unsigned int in uint4.\n * @param y Second unsigned int in uint4.\n * @param z Third unsigned int in uint4.\n * @param w Fourth unsigned int in uint4.\n */\n setUInt4(e, t, i, r, s) {\n this._cacheFloat4(e, t, i, r, s) && (this.engine.setUInt4(this._uniforms[e], t, i, r, s) || (this._valueCache[e] = null));\n }\n /**\n * Sets an unsigned int array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setUIntArray(e, t) {\n this._valueCache[e] = null, this.engine.setUIntArray(this._uniforms[e], t);\n }\n /**\n * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setUIntArray2(e, t) {\n this._valueCache[e] = null, this.engine.setUIntArray2(this._uniforms[e], t);\n }\n /**\n * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setUIntArray3(e, t) {\n this._valueCache[e] = null, this.engine.setUIntArray3(this._uniforms[e], t);\n }\n /**\n * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setUIntArray4(e, t) {\n this._valueCache[e] = null, this.engine.setUIntArray4(this._uniforms[e], t);\n }\n /**\n * Sets an array on a uniform variable.\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setArray(e, t) {\n this._valueCache[e] = null, this.engine.setArray(this._uniforms[e], t);\n }\n /**\n * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setArray2(e, t) {\n this._valueCache[e] = null, this.engine.setArray2(this._uniforms[e], t);\n }\n /**\n * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setArray3(e, t) {\n this._valueCache[e] = null, this.engine.setArray3(this._uniforms[e], t);\n }\n /**\n * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\n * @param uniformName Name of the variable.\n * @param array array to be set.\n */\n setArray4(e, t) {\n this._valueCache[e] = null, this.engine.setArray4(this._uniforms[e], t);\n }\n /**\n * Sets matrices on a uniform variable.\n * @param uniformName Name of the variable.\n * @param matrices matrices to be set.\n */\n setMatrices(e, t) {\n t && (this._valueCache[e] = null, this.engine.setMatrices(this._uniforms[e], t));\n }\n /**\n * Sets matrix on a uniform variable.\n * @param uniformName Name of the variable.\n * @param matrix matrix to be set.\n */\n setMatrix(e, t) {\n this._cacheMatrix(e, t) && (this.engine.setMatrices(this._uniforms[e], t.asArray()) || (this._valueCache[e] = null));\n }\n /**\n * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix)\n * @param uniformName Name of the variable.\n * @param matrix matrix to be set.\n */\n setMatrix3x3(e, t) {\n this._valueCache[e] = null, this.engine.setMatrix3x3(this._uniforms[e], t);\n }\n /**\n * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix)\n * @param uniformName Name of the variable.\n * @param matrix matrix to be set.\n */\n setMatrix2x2(e, t) {\n this._valueCache[e] = null, this.engine.setMatrix2x2(this._uniforms[e], t);\n }\n /**\n * Sets a float on a uniform variable.\n * @param uniformName Name of the variable.\n * @param value value to be set.\n */\n setFloat(e, t) {\n const i = this._valueCache[e];\n i !== void 0 && i === t || this.engine.setFloat(this._uniforms[e], t) && (this._valueCache[e] = t);\n }\n /**\n * Sets a Vector2 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param vector2 vector2 to be set.\n */\n setVector2(e, t) {\n this._cacheFloat2(e, t.x, t.y) && (this.engine.setFloat2(this._uniforms[e], t.x, t.y) || (this._valueCache[e] = null));\n }\n /**\n * Sets a float2 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First float in float2.\n * @param y Second float in float2.\n */\n setFloat2(e, t, i) {\n this._cacheFloat2(e, t, i) && (this.engine.setFloat2(this._uniforms[e], t, i) || (this._valueCache[e] = null));\n }\n /**\n * Sets a Vector3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param vector3 Value to be set.\n */\n setVector3(e, t) {\n this._cacheFloat3(e, t.x, t.y, t.z) && (this.engine.setFloat3(this._uniforms[e], t.x, t.y, t.z) || (this._valueCache[e] = null));\n }\n /**\n * Sets a float3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First float in float3.\n * @param y Second float in float3.\n * @param z Third float in float3.\n */\n setFloat3(e, t, i, r) {\n this._cacheFloat3(e, t, i, r) && (this.engine.setFloat3(this._uniforms[e], t, i, r) || (this._valueCache[e] = null));\n }\n /**\n * Sets a Vector4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param vector4 Value to be set.\n */\n setVector4(e, t) {\n this._cacheFloat4(e, t.x, t.y, t.z, t.w) && (this.engine.setFloat4(this._uniforms[e], t.x, t.y, t.z, t.w) || (this._valueCache[e] = null));\n }\n /**\n * Sets a Quaternion on a uniform variable.\n * @param uniformName Name of the variable.\n * @param quaternion Value to be set.\n */\n setQuaternion(e, t) {\n this._cacheFloat4(e, t.x, t.y, t.z, t.w) && (this.engine.setFloat4(this._uniforms[e], t.x, t.y, t.z, t.w) || (this._valueCache[e] = null));\n }\n /**\n * Sets a float4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param x First float in float4.\n * @param y Second float in float4.\n * @param z Third float in float4.\n * @param w Fourth float in float4.\n */\n setFloat4(e, t, i, r, s) {\n this._cacheFloat4(e, t, i, r, s) && (this.engine.setFloat4(this._uniforms[e], t, i, r, s) || (this._valueCache[e] = null));\n }\n /**\n * Sets a Color3 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param color3 Value to be set.\n */\n setColor3(e, t) {\n this._cacheFloat3(e, t.r, t.g, t.b) && (this.engine.setFloat3(this._uniforms[e], t.r, t.g, t.b) || (this._valueCache[e] = null));\n }\n /**\n * Sets a Color4 on a uniform variable.\n * @param uniformName Name of the variable.\n * @param color3 Value to be set.\n * @param alpha Alpha value to be set.\n */\n setColor4(e, t, i) {\n this._cacheFloat4(e, t.r, t.g, t.b, i) && (this.engine.setFloat4(this._uniforms[e], t.r, t.g, t.b, i) || (this._valueCache[e] = null));\n }\n /**\n * Sets a Color4 on a uniform variable\n * @param uniformName defines the name of the variable\n * @param color4 defines the value to be set\n */\n setDirectColor4(e, t) {\n this._cacheFloat4(e, t.r, t.g, t.b, t.a) && (this.engine.setFloat4(this._uniforms[e], t.r, t.g, t.b, t.a) || (this._valueCache[e] = null));\n }\n _getVertexShaderCode() {\n return this.vertexShader ? this.engine._getShaderSource(this.vertexShader) : null;\n }\n _getFragmentShaderCode() {\n return this.fragmentShader ? this.engine._getShaderSource(this.fragmentShader) : null;\n }\n}\nclass gi {\n /**\n * @internal\n */\n static SetMatrixPrecision(e) {\n if (gi.MatrixTrackPrecisionChange = !1, e && !gi.MatrixUse64Bits && gi.MatrixTrackedMatrices)\n for (let t = 0; t < gi.MatrixTrackedMatrices.length; ++t) {\n const i = gi.MatrixTrackedMatrices[t], r = i._m;\n i._m = new Array(16);\n for (let s = 0; s < 16; ++s)\n i._m[s] = r[s];\n }\n gi.MatrixUse64Bits = e, gi.MatrixCurrentType = gi.MatrixUse64Bits ? Array : Float32Array, gi.MatrixTrackedMatrices = null;\n }\n}\ngi.MatrixUse64Bits = !1;\ngi.MatrixTrackPrecisionChange = !0;\ngi.MatrixCurrentType = Float32Array;\ngi.MatrixTrackedMatrices = [];\nclass F_ {\n get underlyingResource() {\n return this._webGLTexture;\n }\n constructor(e = null, t) {\n if (this._MSAARenderBuffers = null, this._context = t, !e && (e = t.createTexture(), !e))\n throw new Error(\"Unable to create webGL texture\");\n this.set(e);\n }\n setUsage() {\n }\n set(e) {\n this._webGLTexture = e;\n }\n reset() {\n this._webGLTexture = null, this._MSAARenderBuffers = null;\n }\n addMSAARenderBuffer(e) {\n this._MSAARenderBuffers || (this._MSAARenderBuffers = []), this._MSAARenderBuffers.push(e);\n }\n releaseMSAARenderBuffers() {\n if (this._MSAARenderBuffers) {\n for (const e of this._MSAARenderBuffers)\n this._context.deleteRenderbuffer(e);\n this._MSAARenderBuffers = null;\n }\n }\n getMSAARenderBuffer(e = 0) {\n var t;\n return ((t = this._MSAARenderBuffers) == null ? void 0 : t[e]) ?? null;\n }\n release() {\n this.releaseMSAARenderBuffers(), this._webGLTexture && this._context.deleteTexture(this._webGLTexture), this.reset();\n }\n}\nclass ka {\n static IsWrapper(e) {\n return e.getPipelineContext === void 0;\n }\n static GetEffect(e) {\n return e.getPipelineContext === void 0 ? e.effect : e;\n }\n constructor(e, t = !0) {\n this._wasPreviouslyReady = !1, this._forceRebindOnNextCall = !0, this._wasPreviouslyUsingInstances = null, this.effect = null, this.defines = null, this.drawContext = e.createDrawContext(), t && (this.materialContext = e.createMaterialContext());\n }\n setEffect(e, t, i = !0) {\n var r;\n this.effect = e, t !== void 0 && (this.defines = t), i && ((r = this.drawContext) == null || r.reset());\n }\n dispose() {\n var e;\n (e = this.drawContext) == null || e.dispose();\n }\n}\nclass my {\n get isDirty() {\n return this._isStencilTestDirty || this._isStencilMaskDirty || this._isStencilFuncDirty || this._isStencilOpDirty;\n }\n get func() {\n return this._func;\n }\n set func(e) {\n this._func !== e && (this._func = e, this._isStencilFuncDirty = !0);\n }\n get funcRef() {\n return this._funcRef;\n }\n set funcRef(e) {\n this._funcRef !== e && (this._funcRef = e, this._isStencilFuncDirty = !0);\n }\n get funcMask() {\n return this._funcMask;\n }\n set funcMask(e) {\n this._funcMask !== e && (this._funcMask = e, this._isStencilFuncDirty = !0);\n }\n get opStencilFail() {\n return this._opStencilFail;\n }\n set opStencilFail(e) {\n this._opStencilFail !== e && (this._opStencilFail = e, this._isStencilOpDirty = !0);\n }\n get opDepthFail() {\n return this._opDepthFail;\n }\n set opDepthFail(e) {\n this._opDepthFail !== e && (this._opDepthFail = e, this._isStencilOpDirty = !0);\n }\n get opStencilDepthPass() {\n return this._opStencilDepthPass;\n }\n set opStencilDepthPass(e) {\n this._opStencilDepthPass !== e && (this._opStencilDepthPass = e, this._isStencilOpDirty = !0);\n }\n get mask() {\n return this._mask;\n }\n set mask(e) {\n this._mask !== e && (this._mask = e, this._isStencilMaskDirty = !0);\n }\n get enabled() {\n return this._enabled;\n }\n set enabled(e) {\n this._enabled !== e && (this._enabled = e, this._isStencilTestDirty = !0);\n }\n constructor(e = !0) {\n this._isStencilTestDirty = !1, this._isStencilMaskDirty = !1, this._isStencilFuncDirty = !1, this._isStencilOpDirty = !1, this.useStencilGlobalOnly = !1, e && this.reset();\n }\n reset() {\n var e;\n this.stencilMaterial = void 0, (e = this.stencilGlobal) == null || e.reset(), this._isStencilTestDirty = !0, this._isStencilMaskDirty = !0, this._isStencilFuncDirty = !0, this._isStencilOpDirty = !0;\n }\n apply(e) {\n var i;\n if (!e)\n return;\n const t = !this.useStencilGlobalOnly && !!((i = this.stencilMaterial) != null && i.enabled);\n this.enabled = t ? this.stencilMaterial.enabled : this.stencilGlobal.enabled, this.func = t ? this.stencilMaterial.func : this.stencilGlobal.func, this.funcRef = t ? this.stencilMaterial.funcRef : this.stencilGlobal.funcRef, this.funcMask = t ? this.stencilMaterial.funcMask : this.stencilGlobal.funcMask, this.opStencilFail = t ? this.stencilMaterial.opStencilFail : this.stencilGlobal.opStencilFail, this.opDepthFail = t ? this.stencilMaterial.opDepthFail : this.stencilGlobal.opDepthFail, this.opStencilDepthPass = t ? this.stencilMaterial.opStencilDepthPass : this.stencilGlobal.opStencilDepthPass, this.mask = t ? this.stencilMaterial.mask : this.stencilGlobal.mask, this.isDirty && (this._isStencilTestDirty && (this.enabled ? e.enable(e.STENCIL_TEST) : e.disable(e.STENCIL_TEST), this._isStencilTestDirty = !1), this._isStencilMaskDirty && (e.stencilMask(this.mask), this._isStencilMaskDirty = !1), this._isStencilFuncDirty && (e.stencilFunc(this.func, this.funcRef, this.funcMask), this._isStencilFuncDirty = !1), this._isStencilOpDirty && (e.stencilOp(this.opStencilFail, this.opDepthFail, this.opStencilDepthPass), this._isStencilOpDirty = !1));\n }\n}\nclass _y {\n}\nclass De {\n /**\n * Returns the current npm package of the sdk\n */\n // Not mixed with Version for tooling purpose.\n static get NpmPackage() {\n return \"babylonjs@7.1.0\";\n }\n /**\n * Returns the current version of the framework\n */\n static get Version() {\n return \"7.1.0\";\n }\n /**\n * Returns a string describing the current engine\n */\n get description() {\n let e = this.name + this.webGLVersion;\n return this._caps.parallelShaderCompile && (e += \" - Parallel shader compilation\"), e;\n }\n /**\n * Gets or sets the name of the engine\n */\n get name() {\n return this._name;\n }\n set name(e) {\n this._name = e;\n }\n /**\n * Returns the version of the engine\n */\n get version() {\n return this._webGLVersion;\n }\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\n */\n static get ShadersRepository() {\n return Hi.ShadersRepository;\n }\n static set ShadersRepository(e) {\n Hi.ShadersRepository = e;\n }\n /**\n * @internal\n */\n _getShaderProcessor(e) {\n return this._shaderProcessor;\n }\n /**\n * Gets or sets a boolean indicating if depth buffer should be reverse, going from far to near.\n * This can provide greater z depth for distant objects.\n */\n get useReverseDepthBuffer() {\n return this._useReverseDepthBuffer;\n }\n set useReverseDepthBuffer(e) {\n e !== this._useReverseDepthBuffer && (this._useReverseDepthBuffer = e, e ? this._depthCullingState.depthFunc = 518 : this._depthCullingState.depthFunc = 515);\n }\n /**\n * Gets the current frame id\n */\n get frameId() {\n return this._frameId;\n }\n /**\n * Gets a boolean indicating that the engine supports uniform buffers\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\n */\n get supportsUniformBuffers() {\n return this.webGLVersion > 1 && !this.disableUniformBuffers;\n }\n /**\n * Gets the options used for engine creation\n * @returns EngineOptions object\n */\n getCreationOptions() {\n return this._creationOptions;\n }\n /** @internal */\n get _shouldUseHighPrecisionShader() {\n return !!(this._caps.highPrecisionShaderSupported && this._highPrecisionShadersAllowed);\n }\n /**\n * Gets a boolean indicating that only power of 2 textures are supported\n * Please note that you can still use non power of 2 textures but in this case the engine will forcefully convert them\n */\n get needPOTTextures() {\n return this._webGLVersion < 2 || this.forcePOTTextures;\n }\n /**\n * Gets the list of current active render loop functions\n * @returns a read only array with the current render loop functions\n */\n get activeRenderLoops() {\n return this._activeRenderLoops;\n }\n /**\n * Gets or sets a boolean indicating if resources should be retained to be able to handle context lost events\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#handling-webgl-context-lost\n */\n get doNotHandleContextLost() {\n return this._doNotHandleContextLost;\n }\n set doNotHandleContextLost(e) {\n this._doNotHandleContextLost = e;\n }\n get _supportsHardwareTextureRescaling() {\n return !1;\n }\n /**\n * sets the object from which width and height will be taken from when getting render width and height\n * Will fallback to the gl object\n * @param dimensions the framebuffer width and height that will be used.\n */\n set framebufferDimensionsObject(e) {\n this._framebufferDimensionsObject = e;\n }\n /**\n * Gets the current viewport\n */\n get currentViewport() {\n return this._cachedViewport;\n }\n /**\n * Gets the default empty texture\n */\n get emptyTexture() {\n return this._emptyTexture || (this._emptyTexture = this.createRawTexture(new Uint8Array(4), 1, 1, 5, !1, !1, 1)), this._emptyTexture;\n }\n /**\n * Gets the default empty 3D texture\n */\n get emptyTexture3D() {\n return this._emptyTexture3D || (this._emptyTexture3D = this.createRawTexture3D(new Uint8Array(4), 1, 1, 1, 5, !1, !1, 1)), this._emptyTexture3D;\n }\n /**\n * Gets the default empty 2D array texture\n */\n get emptyTexture2DArray() {\n return this._emptyTexture2DArray || (this._emptyTexture2DArray = this.createRawTexture2DArray(new Uint8Array(4), 1, 1, 1, 5, !1, !1, 1)), this._emptyTexture2DArray;\n }\n /**\n * Gets the default empty cube texture\n */\n get emptyCubeTexture() {\n if (!this._emptyCubeTexture) {\n const e = new Uint8Array(4), t = [e, e, e, e, e, e];\n this._emptyCubeTexture = this.createRawCubeTexture(t, 1, 5, 0, !1, !1, 1);\n }\n return this._emptyCubeTexture;\n }\n /**\n * Gets a boolean indicating if the engine runs in WebGPU or not.\n */\n get isWebGPU() {\n return this._isWebGPU;\n }\n /**\n * Gets the shader platform name used by the effects.\n */\n get shaderPlatformName() {\n return this._shaderPlatformName;\n }\n /**\n * Enables or disables the snapshot rendering mode\n * Note that the WebGL engine does not support snapshot rendering so setting the value won't have any effect for this engine\n */\n get snapshotRendering() {\n return !1;\n }\n set snapshotRendering(e) {\n }\n /**\n * Gets or sets the snapshot rendering mode\n */\n get snapshotRenderingMode() {\n return this._snapshotRenderingMode;\n }\n set snapshotRenderingMode(e) {\n this._snapshotRenderingMode = e;\n }\n /**\n * Creates a new snapshot at the next frame using the current snapshotRenderingMode\n */\n snapshotRenderingReset() {\n this.snapshotRendering = !1;\n }\n static _CreateCanvas(e, t) {\n if (typeof document > \"u\")\n return new OffscreenCanvas(e, t);\n const i = document.createElement(\"canvas\");\n return i.width = e, i.height = t, i;\n }\n /**\n * Create a canvas. This method is overridden by other engines\n * @param width width\n * @param height height\n * @returns ICanvas interface\n */\n createCanvas(e, t) {\n return De._CreateCanvas(e, t);\n }\n /**\n * Create an image to use with canvas\n * @returns IImage interface\n */\n createCanvasImage() {\n return document.createElement(\"img\");\n }\n /**\n * Creates a new engine\n * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which already used the WebGL context\n * @param antialias defines enable antialiasing (default: false)\n * @param options defines further options to be sent to the getContext() function\n * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false)\n */\n constructor(e, t, i, r) {\n var c, h;\n this._name = \"WebGL\", this._isDisposed = !1, this.forcePOTTextures = !1, this.isFullscreen = !1, this.cullBackFaces = null, this.renderEvenInBackground = !0, this.preventCacheWipeBetweenFrames = !1, this.validateShaderPrograms = !1, this._useReverseDepthBuffer = !1, this.isNDCHalfZRange = !1, this.hasOriginBottomLeft = !0, this.disableUniformBuffers = !1, this.onDisposeObservable = new he(), this._frameId = 0, this._uniformBuffers = new Array(), this._storageBuffers = new Array(), this._webGLVersion = 1, this._windowIsBackground = !1, this._highPrecisionShadersAllowed = !0, this._badOS = !1, this._badDesktopOS = !1, this._activeRenderLoops = new Array(), this.onContextLostObservable = new he(), this.onContextRestoredObservable = new he(), this._contextWasLost = !1, this._doNotHandleContextLost = !1, this.disableVertexArrayObjects = !1, this._colorWrite = !0, this._colorWriteChanged = !0, this._depthCullingState = new cy(), this._stencilStateComposer = new my(), this._stencilState = new Ls(), this._alphaState = new hy(), this._alphaMode = 1, this._alphaEquation = 0, this._internalTexturesCache = new Array(), this._renderTargetWrapperCache = new Array(), this._activeChannel = 0, this._currentTextureChannel = -1, this._boundTexturesCache = {}, this._compiledEffects = {}, this._vertexAttribArraysEnabled = [], this._currentRenderTarget = null, this._uintIndicesCurrentlySet = !1, this._currentBoundBuffer = new Array(), this._currentFramebuffer = null, this._dummyFramebuffer = null, this._currentBufferPointers = new Array(), this._currentInstanceLocations = new Array(), this._currentInstanceBuffers = new Array(), this._boundRenderFunction = () => this._renderLoop(), this._vaoRecordInProgress = !1, this._mustWipeVertexAttributes = !1, this._frameHandler = 0, this._nextFreeTextureSlots = new Array(), this._maxSimultaneousTextures = 0, this._maxMSAASamplesOverride = null, this._activeRequests = new Array(), this.adaptToDeviceRatio = !1, this._lastDevicePixelRatio = 1, this._transformTextureUrl = null, this.hostInformation = {\n isMobile: !1\n }, this.premultipliedAlpha = !0, this.onBeforeTextureInitObservable = new he(), this._isWebGPU = !1, this._snapshotRenderingMode = 0, this._viewportCached = { x: 0, y: 0, z: 0, w: 0 }, this._unpackFlipYCached = null, this.enableUnpackFlipYCached = !0, this._boundUniforms = {}, this.startTime = sr.Now;\n let s = null;\n i = i || {}, this._creationOptions = i, this.adaptToDeviceRatio = r ?? !1, this._stencilStateComposer.stencilGlobal = this._stencilState, gi.SetMatrixPrecision(!!i.useHighPrecisionMatrix), i.antialias = t ?? i.antialias, i.deterministicLockstep = i.deterministicLockstep ?? !1, i.lockstepMaxSteps = i.lockstepMaxSteps ?? 4, i.timeStep = i.timeStep ?? 1 / 60, i.audioEngine = i.audioEngine ?? !0, i.stencil = i.stencil ?? !0, this._audioContext = ((c = i.audioEngineOptions) == null ? void 0 : c.audioContext) ?? null, this._audioDestination = ((h = i.audioEngineOptions) == null ? void 0 : h.audioDestination) ?? null, this.premultipliedAlpha = i.premultipliedAlpha ?? !0, this.useExactSrgbConversions = i.useExactSrgbConversions ?? !1, this._doNotHandleContextLost = !!i.doNotHandleContextLost, this._isStencilEnable = !!i.stencil, r = r || i.adaptToDeviceRatio || !1;\n const a = yi() && window.devicePixelRatio || 1, o = i.limitDeviceRatio || a;\n if (this._hardwareScalingLevel = r ? 1 / Math.min(o, a) : 1, this._lastDevicePixelRatio = a, !e)\n return;\n if (e.getContext) {\n if (s = e, this._renderingCanvas = s, i.preserveDrawingBuffer === void 0 && (i.preserveDrawingBuffer = !1), i.xrCompatible === void 0 && (i.xrCompatible = !0), navigator && navigator.userAgent) {\n this._setupMobileChecks();\n const u = navigator.userAgent;\n for (const f of De.ExceptionList) {\n const d = f.key, p = f.targets;\n if (new RegExp(d).test(u)) {\n if (f.capture && f.captureConstraint) {\n const m = f.capture, v = f.captureConstraint, C = new RegExp(m).exec(u);\n if (C && C.length > 0 && parseInt(C[C.length - 1]) >= v)\n continue;\n }\n for (const m of p)\n switch (m) {\n case \"uniformBuffer\":\n this.disableUniformBuffers = !0;\n break;\n case \"vao\":\n this.disableVertexArrayObjects = !0;\n break;\n case \"antialias\":\n i.antialias = !1;\n break;\n case \"maxMSAASamples\":\n this._maxMSAASamplesOverride = 1;\n break;\n }\n }\n }\n }\n if (this._doNotHandleContextLost || (this._onContextLost = (u) => {\n u.preventDefault(), this._contextWasLost = !0, ne.Warn(\"WebGL context lost.\"), this.onContextLostObservable.notifyObservers(this);\n }, this._onContextRestored = () => {\n this._restoreEngineAfterContextLost(() => this._initGLContext());\n }, s.addEventListener(\"webglcontextlost\", this._onContextLost, !1), s.addEventListener(\"webglcontextrestored\", this._onContextRestored, !1), i.powerPreference = i.powerPreference || \"high-performance\"), this._badDesktopOS = /^((?!chrome|android).)*safari/i.test(navigator.userAgent), this._badDesktopOS && (i.xrCompatible = !1), !i.disableWebGL2Support)\n try {\n this._gl = s.getContext(\"webgl2\", i) || s.getContext(\"experimental-webgl2\", i), this._gl && (this._webGLVersion = 2, this._shaderPlatformName = \"WEBGL2\", this._gl.deleteQuery || (this._webGLVersion = 1, this._shaderPlatformName = \"WEBGL1\"));\n } catch {\n }\n if (!this._gl) {\n if (!s)\n throw new Error(\"The provided canvas is null or undefined.\");\n try {\n this._gl = s.getContext(\"webgl\", i) || s.getContext(\"experimental-webgl\", i);\n } catch {\n throw new Error(\"WebGL not supported\");\n }\n }\n if (!this._gl)\n throw new Error(\"WebGL not supported\");\n } else {\n this._gl = e, this._renderingCanvas = this._gl.canvas, this._gl.renderbufferStorageMultisample ? (this._webGLVersion = 2, this._shaderPlatformName = \"WEBGL2\") : this._shaderPlatformName = \"WEBGL1\";\n const u = this._gl.getContextAttributes();\n u && (i.stencil = u.stencil);\n }\n this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE), i.useHighPrecisionFloats !== void 0 && (this._highPrecisionShadersAllowed = i.useHighPrecisionFloats), this.resize(), this._initGLContext(), this._initFeatures();\n for (let u = 0; u < this._caps.maxVertexAttribs; u++)\n this._currentBufferPointers[u] = new _y();\n this._shaderProcessor = this.webGLVersion > 1 ? new py() : new fy(), this._badOS = /iPad/i.test(navigator.userAgent) || /iPhone/i.test(navigator.userAgent);\n const l = `Babylon.js v${De.Version}`;\n ne.Log(l + ` - ${this.description}`), this._renderingCanvas && this._renderingCanvas.setAttribute && this._renderingCanvas.setAttribute(\"data-engine\", l);\n }\n _setupMobileChecks() {\n navigator && navigator.userAgent && (this._checkForMobile = () => {\n const e = navigator.userAgent;\n this.hostInformation.isMobile = e.indexOf(\"Mobile\") !== -1 || // Needed for iOS 13+ detection on iPad (inspired by solution from https://stackoverflow.com/questions/9038625/detect-if-device-is-ios)\n e.indexOf(\"Mac\") !== -1 && no() && \"ontouchend\" in document;\n }, this._checkForMobile(), yi() && window.addEventListener(\"resize\", this._checkForMobile));\n }\n _clearEmptyResources() {\n this._dummyFramebuffer = null, this._emptyTexture = null, this._emptyCubeTexture = null, this._emptyTexture3D = null, this._emptyTexture2DArray = null;\n }\n _rebuildGraphicsResources() {\n var e;\n this.wipeCaches(!0), this._rebuildEffects(), (e = this._rebuildComputeEffects) == null || e.call(this), this._rebuildBuffers(), this._rebuildInternalTextures(), this._rebuildTextures(), this._rebuildRenderTargetWrappers(), this.wipeCaches(!0);\n }\n _flagContextRestored() {\n ne.Warn(this.name + \" context successfully restored.\"), this.onContextRestoredObservable.notifyObservers(this), this._contextWasLost = !1;\n }\n _restoreEngineAfterContextLost(e) {\n setTimeout(async () => {\n this._clearEmptyResources();\n const t = this._depthCullingState.depthTest, i = this._depthCullingState.depthFunc, r = this._depthCullingState.depthMask, s = this._stencilState.stencilTest;\n await e(), this._rebuildGraphicsResources(), this._depthCullingState.depthTest = t, this._depthCullingState.depthFunc = i, this._depthCullingState.depthMask = r, this._stencilState.stencilTest = s, this._flagContextRestored();\n }, 0);\n }\n /**\n * Shared initialization across engines types.\n * @param canvas The canvas associated with this instance of the engine.\n */\n _sharedInit(e) {\n this._renderingCanvas = e;\n }\n /**\n * @internal\n */\n _getShaderProcessingContext(e) {\n return null;\n }\n _rebuildInternalTextures() {\n const e = this._internalTexturesCache.slice();\n for (const t of e)\n t._rebuild();\n }\n _rebuildRenderTargetWrappers() {\n const e = this._renderTargetWrapperCache.slice();\n for (const t of e)\n t._rebuild();\n }\n _rebuildEffects() {\n for (const e in this._compiledEffects) {\n const t = this._compiledEffects[e];\n t._pipelineContext = null, t._prepareEffect();\n }\n Hi.ResetCache();\n }\n /**\n * Gets a boolean indicating if all created effects are ready\n * @returns true if all effects are ready\n */\n areAllEffectsReady() {\n for (const e in this._compiledEffects)\n if (!this._compiledEffects[e].isReady())\n return !1;\n return !0;\n }\n _rebuildBuffers() {\n for (const e of this._uniformBuffers)\n e._rebuildAfterContextLost();\n }\n _rebuildTextures() {\n }\n _initGLContext() {\n this._caps = {\n maxTexturesImageUnits: this._gl.getParameter(this._gl.MAX_TEXTURE_IMAGE_UNITS),\n maxCombinedTexturesImageUnits: this._gl.getParameter(this._gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\n maxVertexTextureImageUnits: this._gl.getParameter(this._gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS),\n maxTextureSize: this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),\n maxSamples: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_SAMPLES) : 1,\n maxCubemapTextureSize: this._gl.getParameter(this._gl.MAX_CUBE_MAP_TEXTURE_SIZE),\n maxRenderTextureSize: this._gl.getParameter(this._gl.MAX_RENDERBUFFER_SIZE),\n maxVertexAttribs: this._gl.getParameter(this._gl.MAX_VERTEX_ATTRIBS),\n maxVaryingVectors: this._gl.getParameter(this._gl.MAX_VARYING_VECTORS),\n maxFragmentUniformVectors: this._gl.getParameter(this._gl.MAX_FRAGMENT_UNIFORM_VECTORS),\n maxVertexUniformVectors: this._gl.getParameter(this._gl.MAX_VERTEX_UNIFORM_VECTORS),\n parallelShaderCompile: this._gl.getExtension(\"KHR_parallel_shader_compile\") || void 0,\n standardDerivatives: this._webGLVersion > 1 || this._gl.getExtension(\"OES_standard_derivatives\") !== null,\n maxAnisotropy: 1,\n astc: this._gl.getExtension(\"WEBGL_compressed_texture_astc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_astc\"),\n bptc: this._gl.getExtension(\"EXT_texture_compression_bptc\") || this._gl.getExtension(\"WEBKIT_EXT_texture_compression_bptc\"),\n s3tc: this._gl.getExtension(\"WEBGL_compressed_texture_s3tc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc\"),\n // eslint-disable-next-line @typescript-eslint/naming-convention\n s3tc_srgb: this._gl.getExtension(\"WEBGL_compressed_texture_s3tc_srgb\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc_srgb\"),\n pvrtc: this._gl.getExtension(\"WEBGL_compressed_texture_pvrtc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_pvrtc\"),\n etc1: this._gl.getExtension(\"WEBGL_compressed_texture_etc1\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_etc1\"),\n etc2: this._gl.getExtension(\"WEBGL_compressed_texture_etc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_etc\") || this._gl.getExtension(\"WEBGL_compressed_texture_es3_0\"),\n textureAnisotropicFilterExtension: this._gl.getExtension(\"EXT_texture_filter_anisotropic\") || this._gl.getExtension(\"WEBKIT_EXT_texture_filter_anisotropic\") || this._gl.getExtension(\"MOZ_EXT_texture_filter_anisotropic\"),\n uintIndices: this._webGLVersion > 1 || this._gl.getExtension(\"OES_element_index_uint\") !== null,\n fragmentDepthSupported: this._webGLVersion > 1 || this._gl.getExtension(\"EXT_frag_depth\") !== null,\n highPrecisionShaderSupported: !1,\n timerQuery: this._gl.getExtension(\"EXT_disjoint_timer_query_webgl2\") || this._gl.getExtension(\"EXT_disjoint_timer_query\"),\n supportOcclusionQuery: this._webGLVersion > 1,\n canUseTimestampForTimerQuery: !1,\n drawBuffersExtension: !1,\n maxMSAASamples: 1,\n colorBufferFloat: !!(this._webGLVersion > 1 && this._gl.getExtension(\"EXT_color_buffer_float\")),\n supportFloatTexturesResolve: !1,\n rg11b10ufColorRenderable: !1,\n colorBufferHalfFloat: !!(this._webGLVersion > 1 && this._gl.getExtension(\"EXT_color_buffer_half_float\")),\n textureFloat: !!(this._webGLVersion > 1 || this._gl.getExtension(\"OES_texture_float\")),\n textureHalfFloat: !!(this._webGLVersion > 1 || this._gl.getExtension(\"OES_texture_half_float\")),\n textureHalfFloatRender: !1,\n textureFloatLinearFiltering: !1,\n textureFloatRender: !1,\n textureHalfFloatLinearFiltering: !1,\n vertexArrayObject: !1,\n instancedArrays: !1,\n textureLOD: !!(this._webGLVersion > 1 || this._gl.getExtension(\"EXT_shader_texture_lod\")),\n texelFetch: this._webGLVersion !== 1,\n blendMinMax: !1,\n multiview: this._gl.getExtension(\"OVR_multiview2\"),\n oculusMultiview: this._gl.getExtension(\"OCULUS_multiview\"),\n depthTextureExtension: !1,\n canUseGLInstanceID: this._webGLVersion > 1,\n canUseGLVertexID: this._webGLVersion > 1,\n supportComputeShaders: !1,\n supportSRGBBuffers: !1,\n supportTransformFeedbacks: this._webGLVersion > 1,\n textureMaxLevel: this._webGLVersion > 1,\n texture2DArrayMaxLayerCount: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_ARRAY_TEXTURE_LAYERS) : 128,\n disableMorphTargetTexture: !1\n }, this._caps.supportFloatTexturesResolve = this._caps.colorBufferFloat, this._caps.rg11b10ufColorRenderable = this._caps.colorBufferFloat, this._glVersion = this._gl.getParameter(this._gl.VERSION);\n const e = this._gl.getExtension(\"WEBGL_debug_renderer_info\");\n if (e != null && (this._glRenderer = this._gl.getParameter(e.UNMASKED_RENDERER_WEBGL), this._glVendor = this._gl.getParameter(e.UNMASKED_VENDOR_WEBGL)), this._glVendor || (this._glVendor = this._gl.getParameter(this._gl.VENDOR) || \"Unknown vendor\"), this._glRenderer || (this._glRenderer = this._gl.getParameter(this._gl.RENDERER) || \"Unknown renderer\"), this._gl.HALF_FLOAT_OES !== 36193 && (this._gl.HALF_FLOAT_OES = 36193), this._gl.RGBA16F !== 34842 && (this._gl.RGBA16F = 34842), this._gl.RGBA32F !== 34836 && (this._gl.RGBA32F = 34836), this._gl.DEPTH24_STENCIL8 !== 35056 && (this._gl.DEPTH24_STENCIL8 = 35056), this._caps.timerQuery && (this._webGLVersion === 1 && (this._gl.getQuery = this._caps.timerQuery.getQueryEXT.bind(this._caps.timerQuery)), this._caps.canUseTimestampForTimerQuery = (this._gl.getQuery(this._caps.timerQuery.TIMESTAMP_EXT, this._caps.timerQuery.QUERY_COUNTER_BITS_EXT) ?? 0) > 0), this._caps.maxAnisotropy = this._caps.textureAnisotropicFilterExtension ? this._gl.getParameter(this._caps.textureAnisotropicFilterExtension.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0, this._caps.textureFloatLinearFiltering = !!(this._caps.textureFloat && this._gl.getExtension(\"OES_texture_float_linear\")), this._caps.textureFloatRender = !!(this._caps.textureFloat && this._canRenderToFloatFramebuffer()), this._caps.textureHalfFloatLinearFiltering = !!(this._webGLVersion > 1 || this._caps.textureHalfFloat && this._gl.getExtension(\"OES_texture_half_float_linear\")), this._caps.astc && (this._gl.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = this._caps.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR), this._caps.bptc && (this._gl.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT = this._caps.bptc.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT), this._caps.s3tc_srgb && (this._gl.COMPRESSED_SRGB_S3TC_DXT1_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_S3TC_DXT1_EXT, this._gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, this._gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT), this._caps.etc2 && (this._gl.COMPRESSED_SRGB8_ETC2 = this._caps.etc2.COMPRESSED_SRGB8_ETC2, this._gl.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = this._caps.etc2.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC), this._webGLVersion > 1 && this._gl.HALF_FLOAT_OES !== 5131 && (this._gl.HALF_FLOAT_OES = 5131), this._caps.textureHalfFloatRender = this._caps.textureHalfFloat && this._canRenderToHalfFloatFramebuffer(), this._webGLVersion > 1)\n this._caps.drawBuffersExtension = !0, this._caps.maxMSAASamples = this._maxMSAASamplesOverride !== null ? this._maxMSAASamplesOverride : this._gl.getParameter(this._gl.MAX_SAMPLES);\n else {\n const t = this._gl.getExtension(\"WEBGL_draw_buffers\");\n if (t !== null) {\n this._caps.drawBuffersExtension = !0, this._gl.drawBuffers = t.drawBuffersWEBGL.bind(t), this._gl.DRAW_FRAMEBUFFER = this._gl.FRAMEBUFFER;\n for (let i = 0; i < 16; i++)\n this._gl[\"COLOR_ATTACHMENT\" + i + \"_WEBGL\"] = t[\"COLOR_ATTACHMENT\" + i + \"_WEBGL\"];\n }\n }\n if (this._webGLVersion > 1)\n this._caps.depthTextureExtension = !0;\n else {\n const t = this._gl.getExtension(\"WEBGL_depth_texture\");\n t != null && (this._caps.depthTextureExtension = !0, this._gl.UNSIGNED_INT_24_8 = t.UNSIGNED_INT_24_8_WEBGL);\n }\n if (this.disableVertexArrayObjects)\n this._caps.vertexArrayObject = !1;\n else if (this._webGLVersion > 1)\n this._caps.vertexArrayObject = !0;\n else {\n const t = this._gl.getExtension(\"OES_vertex_array_object\");\n t != null && (this._caps.vertexArrayObject = !0, this._gl.createVertexArray = t.createVertexArrayOES.bind(t), this._gl.bindVertexArray = t.bindVertexArrayOES.bind(t), this._gl.deleteVertexArray = t.deleteVertexArrayOES.bind(t));\n }\n if (this._webGLVersion > 1)\n this._caps.instancedArrays = !0;\n else {\n const t = this._gl.getExtension(\"ANGLE_instanced_arrays\");\n t != null ? (this._caps.instancedArrays = !0, this._gl.drawArraysInstanced = t.drawArraysInstancedANGLE.bind(t), this._gl.drawElementsInstanced = t.drawElementsInstancedANGLE.bind(t), this._gl.vertexAttribDivisor = t.vertexAttribDivisorANGLE.bind(t)) : this._caps.instancedArrays = !1;\n }\n if (this._gl.getShaderPrecisionFormat) {\n const t = this._gl.getShaderPrecisionFormat(this._gl.VERTEX_SHADER, this._gl.HIGH_FLOAT), i = this._gl.getShaderPrecisionFormat(this._gl.FRAGMENT_SHADER, this._gl.HIGH_FLOAT);\n t && i && (this._caps.highPrecisionShaderSupported = t.precision !== 0 && i.precision !== 0);\n }\n if (this._webGLVersion > 1)\n this._caps.blendMinMax = !0;\n else {\n const t = this._gl.getExtension(\"EXT_blend_minmax\");\n t != null && (this._caps.blendMinMax = !0, this._gl.MAX = t.MAX_EXT, this._gl.MIN = t.MIN_EXT);\n }\n if (!this._caps.supportSRGBBuffers) {\n if (this._webGLVersion > 1)\n this._caps.supportSRGBBuffers = !0, this._glSRGBExtensionValues = {\n SRGB: WebGL2RenderingContext.SRGB,\n SRGB8: WebGL2RenderingContext.SRGB8,\n SRGB8_ALPHA8: WebGL2RenderingContext.SRGB8_ALPHA8\n };\n else {\n const t = this._gl.getExtension(\"EXT_sRGB\");\n t != null && (this._caps.supportSRGBBuffers = !0, this._glSRGBExtensionValues = {\n SRGB: t.SRGB_EXT,\n SRGB8: t.SRGB_ALPHA_EXT,\n SRGB8_ALPHA8: t.SRGB_ALPHA_EXT\n });\n }\n this._caps.supportSRGBBuffers = this._caps.supportSRGBBuffers && !!(this._creationOptions && this._creationOptions.forceSRGBBufferSupportState);\n }\n this._depthCullingState.depthTest = !0, this._depthCullingState.depthFunc = this._gl.LEQUAL, this._depthCullingState.depthMask = !0, this._maxSimultaneousTextures = this._caps.maxCombinedTexturesImageUnits;\n for (let t = 0; t < this._maxSimultaneousTextures; t++)\n this._nextFreeTextureSlots.push(t);\n this._glRenderer === \"Mali-G72\" && (this._caps.disableMorphTargetTexture = !0);\n }\n _initFeatures() {\n this._features = {\n forceBitmapOverHTMLImageElement: typeof HTMLImageElement > \"u\",\n supportRenderAndCopyToLodForFloatTextures: this._webGLVersion !== 1,\n supportDepthStencilTexture: this._webGLVersion !== 1,\n supportShadowSamplers: this._webGLVersion !== 1,\n uniformBufferHardCheckMatrix: !1,\n allowTexturePrefiltering: this._webGLVersion !== 1,\n trackUbosInFrame: !1,\n checkUbosContentBeforeUpload: !1,\n supportCSM: this._webGLVersion !== 1,\n basisNeedsPOT: this._webGLVersion === 1,\n support3DTextures: this._webGLVersion !== 1,\n needTypeSuffixInShaderConstants: this._webGLVersion !== 1,\n supportMSAA: this._webGLVersion !== 1,\n supportSSAO2: this._webGLVersion !== 1,\n supportExtendedTextureFormats: this._webGLVersion !== 1,\n supportSwitchCaseInShader: this._webGLVersion !== 1,\n supportSyncTextureRead: !0,\n needsInvertingBitmap: !0,\n useUBOBindingCache: !0,\n needShaderCodeInlining: !1,\n needToAlwaysBindUniformBuffers: !1,\n supportRenderPasses: !1,\n supportSpriteInstancing: !0,\n forceVertexBufferStrideAndOffsetMultiple4Bytes: !1,\n _collectUbosUpdatedInFrame: !1\n };\n }\n /**\n * Gets version of the current webGL context\n * Keep it for back compat - use version instead\n */\n get webGLVersion() {\n return this._webGLVersion;\n }\n /**\n * Gets a string identifying the name of the class\n * @returns \"Engine\" string\n */\n getClassName() {\n return \"ThinEngine\";\n }\n /**\n * Returns true if the stencil buffer has been enabled through the creation option of the context.\n */\n get isStencilEnable() {\n return this._isStencilEnable;\n }\n /** @internal */\n _prepareWorkingCanvas() {\n if (this._workingCanvas)\n return;\n this._workingCanvas = this.createCanvas(1, 1);\n const e = this._workingCanvas.getContext(\"2d\");\n e && (this._workingContext = e);\n }\n /**\n * Reset the texture cache to empty state\n */\n resetTextureCache() {\n for (const e in this._boundTexturesCache)\n Object.prototype.hasOwnProperty.call(this._boundTexturesCache, e) && (this._boundTexturesCache[e] = null);\n this._currentTextureChannel = -1;\n }\n /**\n * Gets an object containing information about the current engine context\n * @returns an object containing the vendor, the renderer and the version of the current engine context\n */\n getInfo() {\n return this.getGlInfo();\n }\n /**\n * Gets an object containing information about the current webGL context\n * @returns an object containing the vendor, the renderer and the version of the current webGL context\n */\n getGlInfo() {\n return {\n vendor: this._glVendor,\n renderer: this._glRenderer,\n version: this._glVersion\n };\n }\n /**\n * Defines the hardware scaling level.\n * By default the hardware scaling level is computed from the window device ratio.\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\n * @param level defines the level to use\n */\n setHardwareScalingLevel(e) {\n this._hardwareScalingLevel = e, this.resize();\n }\n /**\n * Gets the current hardware scaling level.\n * By default the hardware scaling level is computed from the window device ratio.\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\n * @returns a number indicating the current hardware scaling level\n */\n getHardwareScalingLevel() {\n return this._hardwareScalingLevel;\n }\n /**\n * Gets the list of loaded textures\n * @returns an array containing all loaded textures\n */\n getLoadedTexturesCache() {\n return this._internalTexturesCache;\n }\n /**\n * Gets the object containing all engine capabilities\n * @returns the EngineCapabilities object\n */\n getCaps() {\n return this._caps;\n }\n /**\n * stop executing a render loop function and remove it from the execution array\n * @param renderFunction defines the function to be removed. If not provided all functions will be removed.\n */\n stopRenderLoop(e) {\n if (!e) {\n this._activeRenderLoops.length = 0, this._cancelFrame();\n return;\n }\n const t = this._activeRenderLoops.indexOf(e);\n t >= 0 && (this._activeRenderLoops.splice(t, 1), this._activeRenderLoops.length == 0 && this._cancelFrame());\n }\n _cancelFrame() {\n if (this._frameHandler !== 0) {\n const e = this._frameHandler;\n if (this._frameHandler = 0, yi()) {\n const { cancelAnimationFrame: t } = this.getHostWindow() || window;\n if (typeof t == \"function\")\n return t(e);\n } else if (typeof cancelAnimationFrame == \"function\")\n return cancelAnimationFrame(e);\n return clearTimeout(e);\n }\n }\n /** @internal */\n _renderLoop() {\n if (this._frameHandler = 0, !this._contextWasLost) {\n let e = !0;\n if ((this._isDisposed || !this.renderEvenInBackground && this._windowIsBackground) && (e = !1), e) {\n this.beginFrame();\n for (let t = 0; t < this._activeRenderLoops.length; t++) {\n const i = this._activeRenderLoops[t];\n i();\n }\n this.endFrame();\n }\n }\n this._frameHandler === 0 && (this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow()));\n }\n /**\n * Gets the HTML canvas attached with the current webGL context\n * @returns a HTML canvas\n */\n getRenderingCanvas() {\n return this._renderingCanvas;\n }\n /**\n * Gets the audio context specified in engine initialization options\n * @returns an Audio Context\n */\n getAudioContext() {\n return this._audioContext;\n }\n /**\n * Gets the audio destination specified in engine initialization options\n * @returns an audio destination node\n */\n getAudioDestination() {\n return this._audioDestination;\n }\n /**\n * Gets host window\n * @returns the host window object\n */\n getHostWindow() {\n return yi() ? this._renderingCanvas && this._renderingCanvas.ownerDocument && this._renderingCanvas.ownerDocument.defaultView ? this._renderingCanvas.ownerDocument.defaultView : window : null;\n }\n /**\n * Gets the current render width\n * @param useScreen defines if screen size must be used (or the current render target if any)\n * @returns a number defining the current render width\n */\n getRenderWidth(e = !1) {\n return !e && this._currentRenderTarget ? this._currentRenderTarget.width : this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferWidth : this._gl.drawingBufferWidth;\n }\n /**\n * Gets the current render height\n * @param useScreen defines if screen size must be used (or the current render target if any)\n * @returns a number defining the current render height\n */\n getRenderHeight(e = !1) {\n return !e && this._currentRenderTarget ? this._currentRenderTarget.height : this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferHeight : this._gl.drawingBufferHeight;\n }\n /**\n * Can be used to override the current requestAnimationFrame requester.\n * @internal\n */\n _queueNewFrame(e, t) {\n return De.QueueNewFrame(e, t);\n }\n /**\n * Register and execute a render loop. The engine can have more than one render function\n * @param renderFunction defines the function to continuously execute\n */\n runRenderLoop(e) {\n this._activeRenderLoops.indexOf(e) === -1 && (this._activeRenderLoops.push(e), this._activeRenderLoops.length === 1 && this._frameHandler === 0 && (this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow())));\n }\n /**\n * Clear the current render buffer or the current render target (if any is set up)\n * @param color defines the color to use\n * @param backBuffer defines if the back buffer must be cleared\n * @param depth defines if the depth buffer must be cleared\n * @param stencil defines if the stencil buffer must be cleared\n */\n clear(e, t, i, r = !1) {\n var o, l;\n const s = this.stencilStateComposer.useStencilGlobalOnly;\n this.stencilStateComposer.useStencilGlobalOnly = !0, this.applyStates(), this.stencilStateComposer.useStencilGlobalOnly = s;\n let a = 0;\n if (t && e) {\n let c = !0;\n if (this._currentRenderTarget) {\n const h = (o = this._currentRenderTarget.texture) == null ? void 0 : o.format;\n if (h === 8 || h === 9 || h === 10 || h === 11) {\n const u = (l = this._currentRenderTarget.texture) == null ? void 0 : l.type;\n u === 7 || u === 5 ? (De._TempClearColorUint32[0] = e.r * 255, De._TempClearColorUint32[1] = e.g * 255, De._TempClearColorUint32[2] = e.b * 255, De._TempClearColorUint32[3] = e.a * 255, this._gl.clearBufferuiv(this._gl.COLOR, 0, De._TempClearColorUint32), c = !1) : (De._TempClearColorInt32[0] = e.r * 255, De._TempClearColorInt32[1] = e.g * 255, De._TempClearColorInt32[2] = e.b * 255, De._TempClearColorInt32[3] = e.a * 255, this._gl.clearBufferiv(this._gl.COLOR, 0, De._TempClearColorInt32), c = !1);\n }\n }\n c && (this._gl.clearColor(e.r, e.g, e.b, e.a !== void 0 ? e.a : 1), a |= this._gl.COLOR_BUFFER_BIT);\n }\n i && (this.useReverseDepthBuffer ? (this._depthCullingState.depthFunc = this._gl.GEQUAL, this._gl.clearDepth(0)) : this._gl.clearDepth(1), a |= this._gl.DEPTH_BUFFER_BIT), r && (this._gl.clearStencil(0), a |= this._gl.STENCIL_BUFFER_BIT), this._gl.clear(a);\n }\n /**\n * @internal\n */\n _viewport(e, t, i, r) {\n (e !== this._viewportCached.x || t !== this._viewportCached.y || i !== this._viewportCached.z || r !== this._viewportCached.w) && (this._viewportCached.x = e, this._viewportCached.y = t, this._viewportCached.z = i, this._viewportCached.w = r, this._gl.viewport(e, t, i, r));\n }\n /**\n * Set the WebGL's viewport\n * @param viewport defines the viewport element to be used\n * @param requiredWidth defines the width required for rendering. If not provided the rendering canvas' width is used\n * @param requiredHeight defines the height required for rendering. If not provided the rendering canvas' height is used\n */\n setViewport(e, t, i) {\n const r = t || this.getRenderWidth(), s = i || this.getRenderHeight(), a = e.x || 0, o = e.y || 0;\n this._cachedViewport = e, this._viewport(a * r, o * s, r * e.width, s * e.height);\n }\n /**\n * Begin a new frame\n */\n beginFrame() {\n }\n /**\n * Enf the current frame\n */\n endFrame() {\n this._badOS && this.flushFramebuffer(), this._frameId++;\n }\n /**\n * Resize the view according to the canvas' size\n * @param forceSetSize true to force setting the sizes of the underlying canvas\n */\n resize(e = !1) {\n let t, i;\n if (this.adaptToDeviceRatio) {\n const r = yi() && window.devicePixelRatio || 1, s = this._lastDevicePixelRatio / r;\n this._lastDevicePixelRatio = r, this._hardwareScalingLevel *= s;\n }\n if (yi() && no())\n if (this._renderingCanvas) {\n const r = this._renderingCanvas.getBoundingClientRect ? this._renderingCanvas.getBoundingClientRect() : {\n // fallback to last solution in case the function doesn't exist\n width: this._renderingCanvas.width * this._hardwareScalingLevel,\n height: this._renderingCanvas.height * this._hardwareScalingLevel\n };\n t = this._renderingCanvas.clientWidth || r.width || this._renderingCanvas.width || 100, i = this._renderingCanvas.clientHeight || r.height || this._renderingCanvas.height || 100;\n } else\n t = window.innerWidth, i = window.innerHeight;\n else\n t = this._renderingCanvas ? this._renderingCanvas.width : 100, i = this._renderingCanvas ? this._renderingCanvas.height : 100;\n this.setSize(t / this._hardwareScalingLevel, i / this._hardwareScalingLevel, e);\n }\n /**\n * Force a specific size of the canvas\n * @param width defines the new canvas' width\n * @param height defines the new canvas' height\n * @param forceSetSize true to force setting the sizes of the underlying canvas\n * @returns true if the size was changed\n */\n setSize(e, t, i = !1) {\n return !this._renderingCanvas || (e = e | 0, t = t | 0, !i && this._renderingCanvas.width === e && this._renderingCanvas.height === t) ? !1 : (this._renderingCanvas.width = e, this._renderingCanvas.height = t, !0);\n }\n /**\n * Binds the frame buffer to the specified texture.\n * @param rtWrapper The render target wrapper to render to\n * @param faceIndex The face of the texture to render to in case of cube texture and if the render target wrapper is not a multi render target\n * @param requiredWidth The width of the target to render to\n * @param requiredHeight The height of the target to render to\n * @param forceFullscreenViewport Forces the viewport to be the entire texture/screen if true\n * @param lodLevel Defines the lod level to bind to the frame buffer\n * @param layer Defines the 2d array index to bind to the frame buffer if the render target wrapper is not a multi render target\n */\n bindFramebuffer(e, t = 0, i, r, s, a = 0, o = 0) {\n var u, f, d, p, g, m;\n const l = e;\n this._currentRenderTarget && this.unBindFramebuffer(this._currentRenderTarget), this._currentRenderTarget = e, this._bindUnboundFramebuffer(l._MSAAFramebuffer ? l._MSAAFramebuffer : l._framebuffer);\n const c = this._gl;\n e.isMulti || (e.is2DArray || e.is3D ? c.framebufferTextureLayer(c.FRAMEBUFFER, c.COLOR_ATTACHMENT0, (u = e.texture._hardwareTexture) == null ? void 0 : u.underlyingResource, a, o) : e.isCube ? c.framebufferTexture2D(c.FRAMEBUFFER, c.COLOR_ATTACHMENT0, c.TEXTURE_CUBE_MAP_POSITIVE_X + t, (f = e.texture._hardwareTexture) == null ? void 0 : f.underlyingResource, a) : l._currentLOD !== a && (c.framebufferTexture2D(c.FRAMEBUFFER, c.COLOR_ATTACHMENT0, c.TEXTURE_2D, (d = e.texture._hardwareTexture) == null ? void 0 : d.underlyingResource, a), l._currentLOD = a));\n const h = e._depthStencilTexture;\n if (h) {\n e.is3D && (e.texture.width !== h.width || e.texture.height !== h.height || e.texture.depth !== h.depth) && ne.Warn(\"Depth/Stencil attachment for 3D target must have same dimensions as color attachment\");\n const v = e._depthStencilTextureWithStencil ? c.DEPTH_STENCIL_ATTACHMENT : c.DEPTH_ATTACHMENT;\n e.is2DArray || e.is3D ? c.framebufferTextureLayer(c.FRAMEBUFFER, v, (p = h._hardwareTexture) == null ? void 0 : p.underlyingResource, a, o) : e.isCube ? c.framebufferTexture2D(c.FRAMEBUFFER, v, c.TEXTURE_CUBE_MAP_POSITIVE_X + t, (g = h._hardwareTexture) == null ? void 0 : g.underlyingResource, a) : c.framebufferTexture2D(c.FRAMEBUFFER, v, c.TEXTURE_2D, (m = h._hardwareTexture) == null ? void 0 : m.underlyingResource, a);\n }\n this._cachedViewport && !s ? this.setViewport(this._cachedViewport, i, r) : (i || (i = e.width, a && (i = i / Math.pow(2, a))), r || (r = e.height, a && (r = r / Math.pow(2, a))), this._viewport(0, 0, i, r)), this.wipeCaches();\n }\n /**\n * Set various states to the webGL context\n * @param culling defines culling state: true to enable culling, false to disable it\n * @param zOffset defines the value to apply to zOffset (0 by default)\n * @param force defines if states must be applied even if cache is up to date\n * @param reverseSide defines if culling must be reversed (CCW if false, CW if true)\n * @param cullBackFaces true to cull back faces, false to cull front faces (if culling is enabled)\n * @param stencil stencil states to set\n * @param zOffsetUnits defines the value to apply to zOffsetUnits (0 by default)\n */\n setState(e, t = 0, i, r = !1, s, a, o = 0) {\n (this._depthCullingState.cull !== e || i) && (this._depthCullingState.cull = e);\n const l = this.cullBackFaces ?? s ?? !0 ? this._gl.BACK : this._gl.FRONT;\n (this._depthCullingState.cullFace !== l || i) && (this._depthCullingState.cullFace = l), this.setZOffset(t), this.setZOffsetUnits(o);\n const c = r ? this._gl.CW : this._gl.CCW;\n (this._depthCullingState.frontFace !== c || i) && (this._depthCullingState.frontFace = c), this._stencilStateComposer.stencilMaterial = a;\n }\n /**\n * Gets a boolean indicating if depth testing is enabled\n * @returns the current state\n */\n getDepthBuffer() {\n return this._depthCullingState.depthTest;\n }\n /**\n * Enable or disable depth buffering\n * @param enable defines the state to set\n */\n setDepthBuffer(e) {\n this._depthCullingState.depthTest = e;\n }\n /**\n * Set the z offset Factor to apply to current rendering\n * @param value defines the offset to apply\n */\n setZOffset(e) {\n this._depthCullingState.zOffset = this.useReverseDepthBuffer ? -e : e;\n }\n /**\n * Gets the current value of the zOffset Factor\n * @returns the current zOffset Factor state\n */\n getZOffset() {\n const e = this._depthCullingState.zOffset;\n return this.useReverseDepthBuffer ? -e : e;\n }\n /**\n * Set the z offset Units to apply to current rendering\n * @param value defines the offset to apply\n */\n setZOffsetUnits(e) {\n this._depthCullingState.zOffsetUnits = this.useReverseDepthBuffer ? -e : e;\n }\n /**\n * Gets the current value of the zOffset Units\n * @returns the current zOffset Units state\n */\n getZOffsetUnits() {\n const e = this._depthCullingState.zOffsetUnits;\n return this.useReverseDepthBuffer ? -e : e;\n }\n /**\n * @internal\n */\n _bindUnboundFramebuffer(e) {\n this._currentFramebuffer !== e && (this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, e), this._currentFramebuffer = e);\n }\n /** @internal */\n _currentFrameBufferIsDefaultFrameBuffer() {\n return this._currentFramebuffer === null;\n }\n /**\n * Generates the mipmaps for a texture\n * @param texture texture to generate the mipmaps for\n */\n generateMipmaps(e) {\n const t = this._getTextureTarget(e);\n this._bindTextureDirectly(t, e, !0), this._gl.generateMipmap(t), this._bindTextureDirectly(t, null);\n }\n /**\n * Unbind the current render target texture from the webGL context\n * @param texture defines the render target wrapper to unbind\n * @param disableGenerateMipMaps defines a boolean indicating that mipmaps must not be generated\n * @param onBeforeUnbind defines a function which will be called before the effective unbind\n */\n unBindFramebuffer(e, t = !1, i) {\n var a;\n const r = e;\n this._currentRenderTarget = null;\n const s = this._gl;\n if (r._MSAAFramebuffer) {\n if (e.isMulti) {\n this.unBindMultiColorAttachmentFramebuffer(e, t, i);\n return;\n }\n s.bindFramebuffer(s.READ_FRAMEBUFFER, r._MSAAFramebuffer), s.bindFramebuffer(s.DRAW_FRAMEBUFFER, r._framebuffer), s.blitFramebuffer(0, 0, e.width, e.height, 0, 0, e.width, e.height, s.COLOR_BUFFER_BIT, s.NEAREST);\n }\n (a = e.texture) != null && a.generateMipMaps && !t && !e.isCube && this.generateMipmaps(e.texture), i && (r._MSAAFramebuffer && this._bindUnboundFramebuffer(r._framebuffer), i()), this._bindUnboundFramebuffer(null);\n }\n /**\n * Force a webGL flush (ie. a flush of all waiting webGL commands)\n */\n flushFramebuffer() {\n this._gl.flush();\n }\n /**\n * Unbind the current render target and bind the default framebuffer\n */\n restoreDefaultFramebuffer() {\n this._currentRenderTarget ? this.unBindFramebuffer(this._currentRenderTarget) : this._bindUnboundFramebuffer(null), this._cachedViewport && this.setViewport(this._cachedViewport), this.wipeCaches();\n }\n // VBOs\n /** @internal */\n _resetVertexBufferBinding() {\n this.bindArrayBuffer(null), this._cachedVertexBuffers = null;\n }\n /**\n * Creates a vertex buffer\n * @param data the data or size for the vertex buffer\n * @param _updatable whether the buffer should be created as updatable\n * @param _label defines the label of the buffer (for debug purpose)\n * @returns the new WebGL static buffer\n */\n createVertexBuffer(e, t, i) {\n return this._createVertexBuffer(e, this._gl.STATIC_DRAW);\n }\n _createVertexBuffer(e, t) {\n const i = this._gl.createBuffer();\n if (!i)\n throw new Error(\"Unable to create vertex buffer\");\n const r = new po(i);\n return this.bindArrayBuffer(r), typeof e != \"number\" ? e instanceof Array ? (this._gl.bufferData(this._gl.ARRAY_BUFFER, new Float32Array(e), t), r.capacity = e.length * 4) : (this._gl.bufferData(this._gl.ARRAY_BUFFER, e, t), r.capacity = e.byteLength) : (this._gl.bufferData(this._gl.ARRAY_BUFFER, new Uint8Array(e), t), r.capacity = e), this._resetVertexBufferBinding(), r.references = 1, r;\n }\n /**\n * Creates a dynamic vertex buffer\n * @param data the data for the dynamic vertex buffer\n * @param _label defines the label of the buffer (for debug purpose)\n * @returns the new WebGL dynamic buffer\n */\n createDynamicVertexBuffer(e, t) {\n return this._createVertexBuffer(e, this._gl.DYNAMIC_DRAW);\n }\n _resetIndexBufferBinding() {\n this.bindIndexBuffer(null), this._cachedIndexBuffer = null;\n }\n /**\n * Creates a new index buffer\n * @param indices defines the content of the index buffer\n * @param updatable defines if the index buffer must be updatable\n * @param _label defines the label of the buffer (for debug purpose)\n * @returns a new webGL buffer\n */\n createIndexBuffer(e, t, i) {\n const r = this._gl.createBuffer(), s = new po(r);\n if (!r)\n throw new Error(\"Unable to create index buffer\");\n this.bindIndexBuffer(s);\n const a = this._normalizeIndexData(e);\n return this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, a, t ? this._gl.DYNAMIC_DRAW : this._gl.STATIC_DRAW), this._resetIndexBufferBinding(), s.references = 1, s.is32Bits = a.BYTES_PER_ELEMENT === 4, s;\n }\n _normalizeIndexData(e) {\n if (e.BYTES_PER_ELEMENT === 2)\n return e;\n if (this._caps.uintIndices) {\n if (e instanceof Uint32Array)\n return e;\n for (let i = 0; i < e.length; i++)\n if (e[i] >= 65535)\n return new Uint32Array(e);\n return new Uint16Array(e);\n }\n return new Uint16Array(e);\n }\n /**\n * Bind a webGL buffer to the webGL context\n * @param buffer defines the buffer to bind\n */\n bindArrayBuffer(e) {\n this._vaoRecordInProgress || this._unbindVertexArrayObject(), this._bindBuffer(e, this._gl.ARRAY_BUFFER);\n }\n /**\n * Bind a specific block at a given index in a specific shader program\n * @param pipelineContext defines the pipeline context to use\n * @param blockName defines the block name\n * @param index defines the index where to bind the block\n */\n bindUniformBlock(e, t, i) {\n const r = e.program, s = this._gl.getUniformBlockIndex(r, t);\n this._gl.uniformBlockBinding(r, s, i);\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n bindIndexBuffer(e) {\n this._vaoRecordInProgress || this._unbindVertexArrayObject(), this._bindBuffer(e, this._gl.ELEMENT_ARRAY_BUFFER);\n }\n _bindBuffer(e, t) {\n (this._vaoRecordInProgress || this._currentBoundBuffer[t] !== e) && (this._gl.bindBuffer(t, e ? e.underlyingResource : null), this._currentBoundBuffer[t] = e);\n }\n /**\n * update the bound buffer with the given data\n * @param data defines the data to update\n */\n updateArrayBuffer(e) {\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, e);\n }\n _vertexAttribPointer(e, t, i, r, s, a, o) {\n const l = this._currentBufferPointers[t];\n if (!l)\n return;\n let c = !1;\n l.active ? (l.buffer !== e && (l.buffer = e, c = !0), l.size !== i && (l.size = i, c = !0), l.type !== r && (l.type = r, c = !0), l.normalized !== s && (l.normalized = s, c = !0), l.stride !== a && (l.stride = a, c = !0), l.offset !== o && (l.offset = o, c = !0)) : (c = !0, l.active = !0, l.index = t, l.size = i, l.type = r, l.normalized = s, l.stride = a, l.offset = o, l.buffer = e), (c || this._vaoRecordInProgress) && (this.bindArrayBuffer(e), r === this._gl.UNSIGNED_INT || r === this._gl.INT ? this._gl.vertexAttribIPointer(t, i, r, a, o) : this._gl.vertexAttribPointer(t, i, r, s, a, o));\n }\n /**\n * @internal\n */\n _bindIndexBufferWithCache(e) {\n e != null && this._cachedIndexBuffer !== e && (this._cachedIndexBuffer = e, this.bindIndexBuffer(e), this._uintIndicesCurrentlySet = e.is32Bits);\n }\n _bindVertexBuffersAttributes(e, t, i) {\n const r = t.getAttributesNames();\n this._vaoRecordInProgress || this._unbindVertexArrayObject(), this.unbindAllAttributes();\n for (let s = 0; s < r.length; s++) {\n const a = t.getAttributeLocation(s);\n if (a >= 0) {\n const o = r[s];\n let l = null;\n if (i && (l = i[o]), l || (l = e[o]), !l)\n continue;\n this._gl.enableVertexAttribArray(a), this._vaoRecordInProgress || (this._vertexAttribArraysEnabled[a] = !0);\n const c = l.getBuffer();\n c && (this._vertexAttribPointer(c, a, l.getSize(), l.type, l.normalized, l.byteStride, l.byteOffset), l.getIsInstanced() && (this._gl.vertexAttribDivisor(a, l.getInstanceDivisor()), this._vaoRecordInProgress || (this._currentInstanceLocations.push(a), this._currentInstanceBuffers.push(c))));\n }\n }\n }\n /**\n * Records a vertex array object\n * @see https://doc.babylonjs.com/setup/support/webGL2#vertex-array-objects\n * @param vertexBuffers defines the list of vertex buffers to store\n * @param indexBuffer defines the index buffer to store\n * @param effect defines the effect to store\n * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers\n * @returns the new vertex array object\n */\n recordVertexArrayObject(e, t, i, r) {\n const s = this._gl.createVertexArray();\n if (!s)\n throw new Error(\"Unable to create VAO\");\n return this._vaoRecordInProgress = !0, this._gl.bindVertexArray(s), this._mustWipeVertexAttributes = !0, this._bindVertexBuffersAttributes(e, i, r), this.bindIndexBuffer(t), this._vaoRecordInProgress = !1, this._gl.bindVertexArray(null), s;\n }\n /**\n * Bind a specific vertex array object\n * @see https://doc.babylonjs.com/setup/support/webGL2#vertex-array-objects\n * @param vertexArrayObject defines the vertex array object to bind\n * @param indexBuffer defines the index buffer to bind\n */\n bindVertexArrayObject(e, t) {\n this._cachedVertexArrayObject !== e && (this._cachedVertexArrayObject = e, this._gl.bindVertexArray(e), this._cachedVertexBuffers = null, this._cachedIndexBuffer = null, this._uintIndicesCurrentlySet = t != null && t.is32Bits, this._mustWipeVertexAttributes = !0);\n }\n /**\n * Bind webGl buffers directly to the webGL context\n * @param vertexBuffer defines the vertex buffer to bind\n * @param indexBuffer defines the index buffer to bind\n * @param vertexDeclaration defines the vertex declaration to use with the vertex buffer\n * @param vertexStrideSize defines the vertex stride of the vertex buffer\n * @param effect defines the effect associated with the vertex buffer\n */\n bindBuffersDirectly(e, t, i, r, s) {\n if (this._cachedVertexBuffers !== e || this._cachedEffectForVertexBuffers !== s) {\n this._cachedVertexBuffers = e, this._cachedEffectForVertexBuffers = s;\n const a = s.getAttributesCount();\n this._unbindVertexArrayObject(), this.unbindAllAttributes();\n let o = 0;\n for (let l = 0; l < a; l++)\n if (l < i.length) {\n const c = s.getAttributeLocation(l);\n c >= 0 && (this._gl.enableVertexAttribArray(c), this._vertexAttribArraysEnabled[c] = !0, this._vertexAttribPointer(e, c, i[l], this._gl.FLOAT, !1, r, o)), o += i[l] * 4;\n }\n }\n this._bindIndexBufferWithCache(t);\n }\n _unbindVertexArrayObject() {\n this._cachedVertexArrayObject && (this._cachedVertexArrayObject = null, this._gl.bindVertexArray(null));\n }\n /**\n * Bind a list of vertex buffers to the webGL context\n * @param vertexBuffers defines the list of vertex buffers to bind\n * @param indexBuffer defines the index buffer to bind\n * @param effect defines the effect associated with the vertex buffers\n * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers\n */\n bindBuffers(e, t, i, r) {\n (this._cachedVertexBuffers !== e || this._cachedEffectForVertexBuffers !== i) && (this._cachedVertexBuffers = e, this._cachedEffectForVertexBuffers = i, this._bindVertexBuffersAttributes(e, i, r)), this._bindIndexBufferWithCache(t);\n }\n /**\n * Unbind all instance attributes\n */\n unbindInstanceAttributes() {\n let e;\n for (let t = 0, i = this._currentInstanceLocations.length; t < i; t++) {\n const r = this._currentInstanceBuffers[t];\n e != r && r.references && (e = r, this.bindArrayBuffer(r));\n const s = this._currentInstanceLocations[t];\n this._gl.vertexAttribDivisor(s, 0);\n }\n this._currentInstanceBuffers.length = 0, this._currentInstanceLocations.length = 0;\n }\n /**\n * Release and free the memory of a vertex array object\n * @param vao defines the vertex array object to delete\n */\n releaseVertexArrayObject(e) {\n this._gl.deleteVertexArray(e);\n }\n /**\n * @internal\n */\n _releaseBuffer(e) {\n return e.references--, e.references === 0 ? (this._deleteBuffer(e), !0) : !1;\n }\n _deleteBuffer(e) {\n this._gl.deleteBuffer(e.underlyingResource);\n }\n /**\n * Update the content of a webGL buffer used with instantiation and bind it to the webGL context\n * @param instancesBuffer defines the webGL buffer to update and bind\n * @param data defines the data to store in the buffer\n * @param offsetLocations defines the offsets or attributes information used to determine where data must be stored in the buffer\n */\n updateAndBindInstancesBuffer(e, t, i) {\n if (this.bindArrayBuffer(e), t && this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, t), i[0].index !== void 0)\n this.bindInstancesBuffer(e, i, !0);\n else\n for (let r = 0; r < 4; r++) {\n const s = i[r];\n this._vertexAttribArraysEnabled[s] || (this._gl.enableVertexAttribArray(s), this._vertexAttribArraysEnabled[s] = !0), this._vertexAttribPointer(e, s, 4, this._gl.FLOAT, !1, 64, r * 16), this._gl.vertexAttribDivisor(s, 1), this._currentInstanceLocations.push(s), this._currentInstanceBuffers.push(e);\n }\n }\n /**\n * Bind the content of a webGL buffer used with instantiation\n * @param instancesBuffer defines the webGL buffer to bind\n * @param attributesInfo defines the offsets or attributes information used to determine where data must be stored in the buffer\n * @param computeStride defines Whether to compute the strides from the info or use the default 0\n */\n bindInstancesBuffer(e, t, i = !0) {\n this.bindArrayBuffer(e);\n let r = 0;\n if (i)\n for (let s = 0; s < t.length; s++) {\n const a = t[s];\n r += a.attributeSize * 4;\n }\n for (let s = 0; s < t.length; s++) {\n const a = t[s];\n a.index === void 0 && (a.index = this._currentEffect.getAttributeLocationByName(a.attributeName)), !(a.index < 0) && (this._vertexAttribArraysEnabled[a.index] || (this._gl.enableVertexAttribArray(a.index), this._vertexAttribArraysEnabled[a.index] = !0), this._vertexAttribPointer(e, a.index, a.attributeSize, a.attributeType || this._gl.FLOAT, a.normalized || !1, r, a.offset), this._gl.vertexAttribDivisor(a.index, a.divisor === void 0 ? 1 : a.divisor), this._currentInstanceLocations.push(a.index), this._currentInstanceBuffers.push(e));\n }\n }\n /**\n * Disable the instance attribute corresponding to the name in parameter\n * @param name defines the name of the attribute to disable\n */\n disableInstanceAttributeByName(e) {\n if (!this._currentEffect)\n return;\n const t = this._currentEffect.getAttributeLocationByName(e);\n this.disableInstanceAttribute(t);\n }\n /**\n * Disable the instance attribute corresponding to the location in parameter\n * @param attributeLocation defines the attribute location of the attribute to disable\n */\n disableInstanceAttribute(e) {\n let t = !1, i;\n for (; (i = this._currentInstanceLocations.indexOf(e)) !== -1; )\n this._currentInstanceLocations.splice(i, 1), this._currentInstanceBuffers.splice(i, 1), t = !0, i = this._currentInstanceLocations.indexOf(e);\n t && (this._gl.vertexAttribDivisor(e, 0), this.disableAttributeByIndex(e));\n }\n /**\n * Disable the attribute corresponding to the location in parameter\n * @param attributeLocation defines the attribute location of the attribute to disable\n */\n disableAttributeByIndex(e) {\n this._gl.disableVertexAttribArray(e), this._vertexAttribArraysEnabled[e] = !1, this._currentBufferPointers[e].active = !1;\n }\n /**\n * Send a draw order\n * @param useTriangles defines if triangles must be used to draw (else wireframe will be used)\n * @param indexStart defines the starting index\n * @param indexCount defines the number of index to draw\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\n */\n draw(e, t, i, r) {\n this.drawElementsType(e ? 0 : 1, t, i, r);\n }\n /**\n * Draw a list of points\n * @param verticesStart defines the index of first vertex to draw\n * @param verticesCount defines the count of vertices to draw\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\n */\n drawPointClouds(e, t, i) {\n this.drawArraysType(2, e, t, i);\n }\n /**\n * Draw a list of unindexed primitives\n * @param useTriangles defines if triangles must be used to draw (else wireframe will be used)\n * @param verticesStart defines the index of first vertex to draw\n * @param verticesCount defines the count of vertices to draw\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\n */\n drawUnIndexed(e, t, i, r) {\n this.drawArraysType(e ? 0 : 1, t, i, r);\n }\n /**\n * Draw a list of indexed primitives\n * @param fillMode defines the primitive to use\n * @param indexStart defines the starting index\n * @param indexCount defines the number of index to draw\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\n */\n drawElementsType(e, t, i, r) {\n this.applyStates(), this._reportDrawCall();\n const s = this._drawMode(e), a = this._uintIndicesCurrentlySet ? this._gl.UNSIGNED_INT : this._gl.UNSIGNED_SHORT, o = this._uintIndicesCurrentlySet ? 4 : 2;\n r ? this._gl.drawElementsInstanced(s, i, a, t * o, r) : this._gl.drawElements(s, i, a, t * o);\n }\n /**\n * Draw a list of unindexed primitives\n * @param fillMode defines the primitive to use\n * @param verticesStart defines the index of first vertex to draw\n * @param verticesCount defines the count of vertices to draw\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\n */\n drawArraysType(e, t, i, r) {\n this.applyStates(), this._reportDrawCall();\n const s = this._drawMode(e);\n r ? this._gl.drawArraysInstanced(s, t, i, r) : this._gl.drawArrays(s, t, i);\n }\n _drawMode(e) {\n switch (e) {\n case 0:\n return this._gl.TRIANGLES;\n case 2:\n return this._gl.POINTS;\n case 1:\n return this._gl.LINES;\n case 3:\n return this._gl.POINTS;\n case 4:\n return this._gl.LINES;\n case 5:\n return this._gl.LINE_LOOP;\n case 6:\n return this._gl.LINE_STRIP;\n case 7:\n return this._gl.TRIANGLE_STRIP;\n case 8:\n return this._gl.TRIANGLE_FAN;\n default:\n return this._gl.TRIANGLES;\n }\n }\n /** @internal */\n _reportDrawCall() {\n }\n // Shaders\n /**\n * @internal\n */\n _releaseEffect(e) {\n this._compiledEffects[e._key] && delete this._compiledEffects[e._key];\n const t = e.getPipelineContext();\n t && this._deletePipelineContext(t);\n }\n /**\n * @internal\n */\n _deletePipelineContext(e) {\n const t = e;\n t && t.program && (t.program.__SPECTOR_rebuildProgram = null, this._gl.deleteProgram(t.program));\n }\n /** @internal */\n _getGlobalDefines(e) {\n if (e) {\n this.isNDCHalfZRange ? e.IS_NDC_HALF_ZRANGE = \"\" : delete e.IS_NDC_HALF_ZRANGE, this.useReverseDepthBuffer ? e.USE_REVERSE_DEPTHBUFFER = \"\" : delete e.USE_REVERSE_DEPTHBUFFER, this.useExactSrgbConversions ? e.USE_EXACT_SRGB_CONVERSIONS = \"\" : delete e.USE_EXACT_SRGB_CONVERSIONS;\n return;\n } else {\n let t = \"\";\n return this.isNDCHalfZRange && (t += \"#define IS_NDC_HALF_ZRANGE\"), this.useReverseDepthBuffer && (t && (t += `\n`), t += \"#define USE_REVERSE_DEPTHBUFFER\"), this.useExactSrgbConversions && (t && (t += `\n`), t += \"#define USE_EXACT_SRGB_CONVERSIONS\"), t;\n }\n }\n /**\n * Create a new effect (used to store vertex/fragment shaders)\n * @param baseName defines the base name of the effect (The name of file without .fragment.fx or .vertex.fx)\n * @param attributesNamesOrOptions defines either a list of attribute names or an IEffectCreationOptions object\n * @param uniformsNamesOrEngine defines either a list of uniform names or the engine to use\n * @param samplers defines an array of string used to represent textures\n * @param defines defines the string containing the defines to use to compile the shaders\n * @param fallbacks defines the list of potential fallbacks to use if shader compilation fails\n * @param onCompiled defines a function to call when the effect creation is successful\n * @param onError defines a function to call when the effect creation has failed\n * @param indexParameters defines an object containing the index values to use to compile shaders (like the maximum number of simultaneous lights)\n * @param shaderLanguage the language the shader is written in (default: GLSL)\n * @returns the new Effect\n */\n createEffect(e, t, i, r, s, a, o, l, c, h = _i.GLSL) {\n const u = typeof e == \"string\" ? e : e.vertexToken || e.vertexSource || e.vertexElement || e.vertex, f = typeof e == \"string\" ? e : e.fragmentToken || e.fragmentSource || e.fragmentElement || e.fragment, d = this._getGlobalDefines();\n let p = s ?? t.defines ?? \"\";\n d && (p += d);\n const g = u + \"+\" + f + \"@\" + p;\n if (this._compiledEffects[g]) {\n const v = this._compiledEffects[g];\n return o && v.isReady() && o(v), v;\n }\n const m = new Hi(e, t, i, r, this, s, a, o, l, c, g, h);\n return this._compiledEffects[g] = m, m;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static _ConcatenateShader(e, t, i = \"\") {\n return i + (t ? t + `\n` : \"\") + e;\n }\n _compileShader(e, t, i, r) {\n return this._compileRawShader(De._ConcatenateShader(e, i, r), t);\n }\n _compileRawShader(e, t) {\n const i = this._gl, r = i.createShader(t === \"vertex\" ? i.VERTEX_SHADER : i.FRAGMENT_SHADER);\n if (!r) {\n let s = i.NO_ERROR, a = i.NO_ERROR;\n for (; (a = i.getError()) !== i.NO_ERROR; )\n s = a;\n throw new Error(`Something went wrong while creating a gl ${t} shader object. gl error=${s}, gl isContextLost=${i.isContextLost()}, _contextWasLost=${this._contextWasLost}`);\n }\n return i.shaderSource(r, e), i.compileShader(r), r;\n }\n /**\n * @internal\n */\n _getShaderSource(e) {\n return this._gl.getShaderSource(e);\n }\n /**\n * Directly creates a webGL program\n * @param pipelineContext defines the pipeline context to attach to\n * @param vertexCode defines the vertex shader code to use\n * @param fragmentCode defines the fragment shader code to use\n * @param context defines the webGL context to use (if not set, the current one will be used)\n * @param transformFeedbackVaryings defines the list of transform feedback varyings to use\n * @returns the new webGL program\n */\n createRawShaderProgram(e, t, i, r, s = null) {\n r = r || this._gl;\n const a = this._compileRawShader(t, \"vertex\"), o = this._compileRawShader(i, \"fragment\");\n return this._createShaderProgram(e, a, o, r, s);\n }\n /**\n * Creates a webGL program\n * @param pipelineContext defines the pipeline context to attach to\n * @param vertexCode defines the vertex shader code to use\n * @param fragmentCode defines the fragment shader code to use\n * @param defines defines the string containing the defines to use to compile the shaders\n * @param context defines the webGL context to use (if not set, the current one will be used)\n * @param transformFeedbackVaryings defines the list of transform feedback varyings to use\n * @returns the new webGL program\n */\n createShaderProgram(e, t, i, r, s, a = null) {\n s = s || this._gl;\n const o = this._webGLVersion > 1 ? `#version 300 es\n#define WEBGL2 \n` : \"\", l = this._compileShader(t, \"vertex\", r, o), c = this._compileShader(i, \"fragment\", r, o);\n return this._createShaderProgram(e, l, c, s, a);\n }\n /**\n * Inline functions in shader code that are marked to be inlined\n * @param code code to inline\n * @returns inlined code\n */\n inlineShaderCode(e) {\n return e;\n }\n /**\n * Creates a new pipeline context\n * @param shaderProcessingContext defines the shader processing context used during the processing if available\n * @returns the new pipeline\n */\n createPipelineContext(e) {\n const t = new gy();\n return t.engine = this, this._caps.parallelShaderCompile && (t.isParallelCompiled = !0), t;\n }\n /**\n * Creates a new material context\n * @returns the new context\n */\n createMaterialContext() {\n }\n /**\n * Creates a new draw context\n * @returns the new context\n */\n createDrawContext() {\n }\n _createShaderProgram(e, t, i, r, s = null) {\n const a = r.createProgram();\n if (e.program = a, !a)\n throw new Error(\"Unable to create program\");\n return r.attachShader(a, t), r.attachShader(a, i), r.linkProgram(a), e.context = r, e.vertexShader = t, e.fragmentShader = i, e.isParallelCompiled || this._finalizePipelineContext(e), a;\n }\n _finalizePipelineContext(e) {\n const t = e.context, i = e.vertexShader, r = e.fragmentShader, s = e.program;\n if (!t.getProgramParameter(s, t.LINK_STATUS)) {\n if (!this._gl.getShaderParameter(i, this._gl.COMPILE_STATUS)) {\n const l = this._gl.getShaderInfoLog(i);\n if (l)\n throw e.vertexCompilationError = l, new Error(\"VERTEX SHADER \" + l);\n }\n if (!this._gl.getShaderParameter(r, this._gl.COMPILE_STATUS)) {\n const l = this._gl.getShaderInfoLog(r);\n if (l)\n throw e.fragmentCompilationError = l, new Error(\"FRAGMENT SHADER \" + l);\n }\n const o = t.getProgramInfoLog(s);\n if (o)\n throw e.programLinkError = o, new Error(o);\n }\n if (this.validateShaderPrograms && (t.validateProgram(s), !t.getProgramParameter(s, t.VALIDATE_STATUS))) {\n const l = t.getProgramInfoLog(s);\n if (l)\n throw e.programValidationError = l, new Error(l);\n }\n t.deleteShader(i), t.deleteShader(r), e.vertexShader = void 0, e.fragmentShader = void 0, e.onCompiled && (e.onCompiled(), e.onCompiled = void 0);\n }\n /**\n * @internal\n */\n _preparePipelineContext(e, t, i, r, s, a, o, l, c, h) {\n const u = e;\n r ? u.program = this.createRawShaderProgram(u, t, i, void 0, c) : u.program = this.createShaderProgram(u, t, i, l, void 0, c), u.program.__SPECTOR_rebuildProgram = o;\n }\n /**\n * @internal\n */\n _isRenderingStateCompiled(e) {\n const t = e;\n return this._isDisposed || t._isDisposed ? !1 : this._gl.getProgramParameter(t.program, this._caps.parallelShaderCompile.COMPLETION_STATUS_KHR) ? (this._finalizePipelineContext(t), !0) : !1;\n }\n /**\n * @internal\n */\n _executeWhenRenderingStateIsCompiled(e, t) {\n const i = e;\n if (!i.isParallelCompiled) {\n t();\n return;\n }\n const r = i.onCompiled;\n r ? i.onCompiled = () => {\n r(), t();\n } : i.onCompiled = t;\n }\n /**\n * Gets the list of webGL uniform locations associated with a specific program based on a list of uniform names\n * @param pipelineContext defines the pipeline context to use\n * @param uniformsNames defines the list of uniform names\n * @returns an array of webGL uniform locations\n */\n getUniforms(e, t) {\n const i = new Array(), r = e;\n for (let s = 0; s < t.length; s++)\n i.push(this._gl.getUniformLocation(r.program, t[s]));\n return i;\n }\n /**\n * Gets the list of active attributes for a given webGL program\n * @param pipelineContext defines the pipeline context to use\n * @param attributesNames defines the list of attribute names to get\n * @returns an array of indices indicating the offset of each attribute\n */\n getAttributes(e, t) {\n const i = [], r = e;\n for (let s = 0; s < t.length; s++)\n try {\n i.push(this._gl.getAttribLocation(r.program, t[s]));\n } catch {\n i.push(-1);\n }\n return i;\n }\n /**\n * Activates an effect, making it the current one (ie. the one used for rendering)\n * @param effect defines the effect to activate\n */\n enableEffect(e) {\n e = e !== null && ka.IsWrapper(e) ? e.effect : e, !(!e || e === this._currentEffect) && (this._stencilStateComposer.stencilMaterial = void 0, e = e, this.bindSamplers(e), this._currentEffect = e, e.onBind && e.onBind(e), e._onBindObservable && e._onBindObservable.notifyObservers(e));\n }\n /**\n * Set the value of an uniform to a number (int)\n * @param uniform defines the webGL uniform location where to store the value\n * @param value defines the int number to store\n * @returns true if the value was set\n */\n setInt(e, t) {\n return e ? (this._gl.uniform1i(e, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to a int2\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @returns true if the value was set\n */\n setInt2(e, t, i) {\n return e ? (this._gl.uniform2i(e, t, i), !0) : !1;\n }\n /**\n * Set the value of an uniform to a int3\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @param z defines the 3rd component of the value\n * @returns true if the value was set\n */\n setInt3(e, t, i, r) {\n return e ? (this._gl.uniform3i(e, t, i, r), !0) : !1;\n }\n /**\n * Set the value of an uniform to a int4\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @param z defines the 3rd component of the value\n * @param w defines the 4th component of the value\n * @returns true if the value was set\n */\n setInt4(e, t, i, r, s) {\n return e ? (this._gl.uniform4i(e, t, i, r, s), !0) : !1;\n }\n /**\n * Set the value of an uniform to an array of int32\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of int32 to store\n * @returns true if the value was set\n */\n setIntArray(e, t) {\n return e ? (this._gl.uniform1iv(e, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to an array of int32 (stored as vec2)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of int32 to store\n * @returns true if the value was set\n */\n setIntArray2(e, t) {\n return !e || t.length % 2 !== 0 ? !1 : (this._gl.uniform2iv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of int32 (stored as vec3)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of int32 to store\n * @returns true if the value was set\n */\n setIntArray3(e, t) {\n return !e || t.length % 3 !== 0 ? !1 : (this._gl.uniform3iv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of int32 (stored as vec4)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of int32 to store\n * @returns true if the value was set\n */\n setIntArray4(e, t) {\n return !e || t.length % 4 !== 0 ? !1 : (this._gl.uniform4iv(e, t), !0);\n }\n /**\n * Set the value of an uniform to a number (unsigned int)\n * @param uniform defines the webGL uniform location where to store the value\n * @param value defines the unsigned int number to store\n * @returns true if the value was set\n */\n setUInt(e, t) {\n return e ? (this._gl.uniform1ui(e, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to a unsigned int2\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @returns true if the value was set\n */\n setUInt2(e, t, i) {\n return e ? (this._gl.uniform2ui(e, t, i), !0) : !1;\n }\n /**\n * Set the value of an uniform to a unsigned int3\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @param z defines the 3rd component of the value\n * @returns true if the value was set\n */\n setUInt3(e, t, i, r) {\n return e ? (this._gl.uniform3ui(e, t, i, r), !0) : !1;\n }\n /**\n * Set the value of an uniform to a unsigned int4\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @param z defines the 3rd component of the value\n * @param w defines the 4th component of the value\n * @returns true if the value was set\n */\n setUInt4(e, t, i, r, s) {\n return e ? (this._gl.uniform4ui(e, t, i, r, s), !0) : !1;\n }\n /**\n * Set the value of an uniform to an array of unsigned int32\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of unsigned int32 to store\n * @returns true if the value was set\n */\n setUIntArray(e, t) {\n return e ? (this._gl.uniform1uiv(e, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to an array of unsigned int32 (stored as vec2)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of unsigned int32 to store\n * @returns true if the value was set\n */\n setUIntArray2(e, t) {\n return !e || t.length % 2 !== 0 ? !1 : (this._gl.uniform2uiv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of unsigned int32 (stored as vec3)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of unsigned int32 to store\n * @returns true if the value was set\n */\n setUIntArray3(e, t) {\n return !e || t.length % 3 !== 0 ? !1 : (this._gl.uniform3uiv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of unsigned int32 (stored as vec4)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of unsigned int32 to store\n * @returns true if the value was set\n */\n setUIntArray4(e, t) {\n return !e || t.length % 4 !== 0 ? !1 : (this._gl.uniform4uiv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of number\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of number to store\n * @returns true if the value was set\n */\n setArray(e, t) {\n return !e || t.length < 1 ? !1 : (this._gl.uniform1fv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of number (stored as vec2)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of number to store\n * @returns true if the value was set\n */\n setArray2(e, t) {\n return !e || t.length % 2 !== 0 ? !1 : (this._gl.uniform2fv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of number (stored as vec3)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of number to store\n * @returns true if the value was set\n */\n setArray3(e, t) {\n return !e || t.length % 3 !== 0 ? !1 : (this._gl.uniform3fv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of number (stored as vec4)\n * @param uniform defines the webGL uniform location where to store the value\n * @param array defines the array of number to store\n * @returns true if the value was set\n */\n setArray4(e, t) {\n return !e || t.length % 4 !== 0 ? !1 : (this._gl.uniform4fv(e, t), !0);\n }\n /**\n * Set the value of an uniform to an array of float32 (stored as matrices)\n * @param uniform defines the webGL uniform location where to store the value\n * @param matrices defines the array of float32 to store\n * @returns true if the value was set\n */\n setMatrices(e, t) {\n return e ? (this._gl.uniformMatrix4fv(e, !1, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to a matrix (3x3)\n * @param uniform defines the webGL uniform location where to store the value\n * @param matrix defines the Float32Array representing the 3x3 matrix to store\n * @returns true if the value was set\n */\n setMatrix3x3(e, t) {\n return e ? (this._gl.uniformMatrix3fv(e, !1, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to a matrix (2x2)\n * @param uniform defines the webGL uniform location where to store the value\n * @param matrix defines the Float32Array representing the 2x2 matrix to store\n * @returns true if the value was set\n */\n setMatrix2x2(e, t) {\n return e ? (this._gl.uniformMatrix2fv(e, !1, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to a number (float)\n * @param uniform defines the webGL uniform location where to store the value\n * @param value defines the float number to store\n * @returns true if the value was transferred\n */\n setFloat(e, t) {\n return e ? (this._gl.uniform1f(e, t), !0) : !1;\n }\n /**\n * Set the value of an uniform to a vec2\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @returns true if the value was set\n */\n setFloat2(e, t, i) {\n return e ? (this._gl.uniform2f(e, t, i), !0) : !1;\n }\n /**\n * Set the value of an uniform to a vec3\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @param z defines the 3rd component of the value\n * @returns true if the value was set\n */\n setFloat3(e, t, i, r) {\n return e ? (this._gl.uniform3f(e, t, i, r), !0) : !1;\n }\n /**\n * Set the value of an uniform to a vec4\n * @param uniform defines the webGL uniform location where to store the value\n * @param x defines the 1st component of the value\n * @param y defines the 2nd component of the value\n * @param z defines the 3rd component of the value\n * @param w defines the 4th component of the value\n * @returns true if the value was set\n */\n setFloat4(e, t, i, r, s) {\n return e ? (this._gl.uniform4f(e, t, i, r, s), !0) : !1;\n }\n // States\n /**\n * Apply all cached states (depth, culling, stencil and alpha)\n */\n applyStates() {\n if (this._depthCullingState.apply(this._gl), this._stencilStateComposer.apply(this._gl), this._alphaState.apply(this._gl), this._colorWriteChanged) {\n this._colorWriteChanged = !1;\n const e = this._colorWrite;\n this._gl.colorMask(e, e, e, e);\n }\n }\n /**\n * Enable or disable color writing\n * @param enable defines the state to set\n */\n setColorWrite(e) {\n e !== this._colorWrite && (this._colorWriteChanged = !0, this._colorWrite = e);\n }\n /**\n * Gets a boolean indicating if color writing is enabled\n * @returns the current color writing state\n */\n getColorWrite() {\n return this._colorWrite;\n }\n /**\n * Gets the depth culling state manager\n */\n get depthCullingState() {\n return this._depthCullingState;\n }\n /**\n * Gets the alpha state manager\n */\n get alphaState() {\n return this._alphaState;\n }\n /**\n * Gets the stencil state manager\n */\n get stencilState() {\n return this._stencilState;\n }\n /**\n * Gets the stencil state composer\n */\n get stencilStateComposer() {\n return this._stencilStateComposer;\n }\n // Textures\n /**\n * Clears the list of texture accessible through engine.\n * This can help preventing texture load conflict due to name collision.\n */\n clearInternalTexturesCache() {\n this._internalTexturesCache.length = 0;\n }\n /**\n * Force the entire cache to be cleared\n * You should not have to use this function unless your engine needs to share the webGL context with another engine\n * @param bruteForce defines a boolean to force clearing ALL caches (including stencil, detoh and alpha states)\n */\n wipeCaches(e) {\n this.preventCacheWipeBetweenFrames && !e || (this._currentEffect = null, this._viewportCached.x = 0, this._viewportCached.y = 0, this._viewportCached.z = 0, this._viewportCached.w = 0, this._unbindVertexArrayObject(), e && (this._currentProgram = null, this.resetTextureCache(), this._stencilStateComposer.reset(), this._depthCullingState.reset(), this._depthCullingState.depthFunc = this._gl.LEQUAL, this._alphaState.reset(), this._alphaMode = 1, this._alphaEquation = 0, this._colorWrite = !0, this._colorWriteChanged = !0, this._unpackFlipYCached = null, this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE), this._gl.pixelStorei(this._gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0), this._mustWipeVertexAttributes = !0, this.unbindAllAttributes()), this._resetVertexBufferBinding(), this._cachedIndexBuffer = null, this._cachedEffectForVertexBuffers = null, this.bindIndexBuffer(null));\n }\n /**\n * @internal\n */\n _getSamplingParameters(e, t) {\n const i = this._gl;\n let r = i.NEAREST, s = i.NEAREST;\n switch (e) {\n case 11:\n r = i.LINEAR, t ? s = i.LINEAR_MIPMAP_NEAREST : s = i.LINEAR;\n break;\n case 3:\n r = i.LINEAR, t ? s = i.LINEAR_MIPMAP_LINEAR : s = i.LINEAR;\n break;\n case 8:\n r = i.NEAREST, t ? s = i.NEAREST_MIPMAP_LINEAR : s = i.NEAREST;\n break;\n case 4:\n r = i.NEAREST, t ? s = i.NEAREST_MIPMAP_NEAREST : s = i.NEAREST;\n break;\n case 5:\n r = i.NEAREST, t ? s = i.LINEAR_MIPMAP_NEAREST : s = i.LINEAR;\n break;\n case 6:\n r = i.NEAREST, t ? s = i.LINEAR_MIPMAP_LINEAR : s = i.LINEAR;\n break;\n case 7:\n r = i.NEAREST, s = i.LINEAR;\n break;\n case 1:\n r = i.NEAREST, s = i.NEAREST;\n break;\n case 9:\n r = i.LINEAR, t ? s = i.NEAREST_MIPMAP_NEAREST : s = i.NEAREST;\n break;\n case 10:\n r = i.LINEAR, t ? s = i.NEAREST_MIPMAP_LINEAR : s = i.NEAREST;\n break;\n case 2:\n r = i.LINEAR, s = i.LINEAR;\n break;\n case 12:\n r = i.LINEAR, s = i.NEAREST;\n break;\n }\n return {\n min: s,\n mag: r\n };\n }\n /** @internal */\n _createTexture() {\n const e = this._gl.createTexture();\n if (!e)\n throw new Error(\"Unable to create texture\");\n return e;\n }\n /** @internal */\n _createHardwareTexture() {\n return new F_(this._createTexture(), this._gl);\n }\n /**\n * Creates an internal texture without binding it to a framebuffer\n * @internal\n * @param size defines the size of the texture\n * @param options defines the options used to create the texture\n * @param delayGPUTextureCreation true to delay the texture creation the first time it is really needed. false to create it right away\n * @param source source type of the texture\n * @returns a new internal texture\n */\n _createInternalTexture(e, t, i = !0, r = Dt.Unknown) {\n let s = !1, a = 0, o = 3, l = 5, c = !1, h = 1, u;\n t !== void 0 && typeof t == \"object\" ? (s = !!t.generateMipMaps, a = t.type === void 0 ? 0 : t.type, o = t.samplingMode === void 0 ? 3 : t.samplingMode, l = t.format === void 0 ? 5 : t.format, c = t.useSRGBBuffer === void 0 ? !1 : t.useSRGBBuffer, h = t.samples ?? 1, u = t.label) : s = !!t, c && (c = this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU)), (a === 1 && !this._caps.textureFloatLinearFiltering || a === 2 && !this._caps.textureHalfFloatLinearFiltering) && (o = 1), a === 1 && !this._caps.textureFloat && (a = 0, ne.Warn(\"Float textures are not supported. Type forced to TEXTURETYPE_UNSIGNED_BYTE\"));\n const f = this._gl, d = new or(this, r), p = e.width || e, g = e.height || e, m = e.depth || 0, v = e.layers || 0, E = this._getSamplingParameters(o, s), C = v !== 0 ? f.TEXTURE_2D_ARRAY : m !== 0 ? f.TEXTURE_3D : f.TEXTURE_2D, T = this._getRGBABufferInternalSizedFormat(a, l, c), R = this._getInternalFormat(l), x = this._getWebGLTextureType(a);\n return this._bindTextureDirectly(C, d), v !== 0 ? (d.is2DArray = !0, f.texImage3D(C, 0, T, p, g, v, 0, R, x, null)) : m !== 0 ? (d.is3D = !0, f.texImage3D(C, 0, T, p, g, m, 0, R, x, null)) : f.texImage2D(C, 0, T, p, g, 0, R, x, null), f.texParameteri(C, f.TEXTURE_MAG_FILTER, E.mag), f.texParameteri(C, f.TEXTURE_MIN_FILTER, E.min), f.texParameteri(C, f.TEXTURE_WRAP_S, f.CLAMP_TO_EDGE), f.texParameteri(C, f.TEXTURE_WRAP_T, f.CLAMP_TO_EDGE), s && this._gl.generateMipmap(C), this._bindTextureDirectly(C, null), d._useSRGBBuffer = c, d.baseWidth = p, d.baseHeight = g, d.width = p, d.height = g, d.depth = v, d.isReady = !0, d.samples = h, d.generateMipMaps = s, d.samplingMode = o, d.type = a, d.format = l, d.label = u, this._internalTexturesCache.push(d), d;\n }\n /**\n * @internal\n */\n _getUseSRGBBuffer(e, t) {\n return e && this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU || t);\n }\n _createTextureBase(e, t, i, r, s = 3, a = null, o = null, l, c, h = null, u = null, f = null, d = null, p, g, m) {\n e = e || \"\";\n const v = e.substr(0, 5) === \"data:\", E = e.substr(0, 5) === \"blob:\", C = v && e.indexOf(\";base64,\") !== -1, T = u || new or(this, Dt.Url);\n T !== u && (T.label = e.substring(0, 60));\n const R = e;\n this._transformTextureUrl && !C && !u && !h && (e = this._transformTextureUrl(e)), R !== e && (T._originalUrl = R);\n const x = e.lastIndexOf(\".\");\n let S = d || (x > -1 ? e.substring(x).toLowerCase() : \"\"), M = null;\n S.indexOf(\"?\") > -1 && (S = S.split(\"?\")[0]);\n for (const H of De._TextureLoaders)\n if (H.canLoad(S, p)) {\n M = H;\n break;\n }\n r && r.addPendingData(T), T.url = e, T.generateMipMaps = !t, T.samplingMode = s, T.invertY = i, T._useSRGBBuffer = this._getUseSRGBBuffer(!!m, t), this._doNotHandleContextLost || (T._buffer = h);\n let F = null;\n a && !u && (F = T.onLoadedObservable.add(a)), u || this._internalTexturesCache.push(T);\n const U = (H, q) => {\n r && r.removePendingData(T), e === R ? (F && T.onLoadedObservable.remove(F), st.UseFallbackTexture && e !== st.FallbackTexture && this._createTextureBase(st.FallbackTexture, t, T.invertY, r, s, null, o, l, c, h, T), H = (H || \"Unknown error\") + (st.UseFallbackTexture ? \" - Fallback texture was used\" : \"\"), T.onErrorObservable.notifyObservers({ message: H, exception: q }), o && o(H, q)) : (ne.Warn(`Failed to load ${e}, falling back to ${R}`), this._createTextureBase(R, t, T.invertY, r, s, a, o, l, c, h, T, f, d, p, g, m));\n };\n if (M) {\n const H = (q) => {\n M.loadData(q, T, (Z, k, Q, ce, de, j) => {\n j ? U(\"TextureLoader failed to load data\") : l(T, S, r, { width: Z, height: k }, T.invertY, !Q, ce, () => (de(), !1), s);\n }, g);\n };\n h ? h instanceof ArrayBuffer ? H(new Uint8Array(h)) : ArrayBuffer.isView(h) ? H(h) : o && o(\"Unable to load: only ArrayBuffer or ArrayBufferView is supported\", null) : this._loadFile(e, (q) => H(new Uint8Array(q)), void 0, r ? r.offlineProvider : void 0, !0, (q, Z) => {\n U(\"Unable to load \" + (q && q.responseURL, Z));\n });\n } else {\n const H = (q) => {\n E && !this._doNotHandleContextLost && (T._buffer = q), l(T, S, r, q, T.invertY, t, !1, c, s);\n };\n !v || C ? h && (typeof h.decoding == \"string\" || h.close) ? H(h) : De._FileToolsLoadImage(e, H, U, r ? r.offlineProvider : null, p, T.invertY && this._features.needsInvertingBitmap ? { imageOrientation: \"flipY\" } : void 0) : typeof h == \"string\" || h instanceof ArrayBuffer || ArrayBuffer.isView(h) || h instanceof Blob ? De._FileToolsLoadImage(h, H, U, r ? r.offlineProvider : null, p, T.invertY && this._features.needsInvertingBitmap ? { imageOrientation: \"flipY\" } : void 0) : h && H(h);\n }\n return T;\n }\n /**\n * Usually called from Texture.ts.\n * Passed information to create a WebGLTexture\n * @param url defines a value which contains one of the following:\n * * A conventional http URL, e.g. 'http://...' or 'file://...'\n * * A base64 string of in-line texture data, e.g. 'data:image/jpg;base64,/...'\n * * An indicator that data being passed using the buffer parameter, e.g. 'data:mytexture.jpg'\n * @param noMipmap defines a boolean indicating that no mipmaps shall be generated. Ignored for compressed textures. They must be in the file\n * @param invertY when true, image is flipped when loaded. You probably want true. Certain compressed textures may invert this if their default is inverted (eg. ktx)\n * @param scene needed for loading to the correct scene\n * @param samplingMode mode with should be used sample / access the texture (Default: Texture.TRILINEAR_SAMPLINGMODE)\n * @param onLoad optional callback to be called upon successful completion\n * @param onError optional callback to be called upon failure\n * @param buffer a source of a file previously fetched as either a base64 string, an ArrayBuffer (compressed or image format), HTMLImageElement (image format), or a Blob\n * @param fallback an internal argument in case the function must be called again, due to etc1 not having alpha capabilities\n * @param format internal format. Default: RGB when extension is '.jpg' else RGBA. Ignored for compressed textures\n * @param forcedExtension defines the extension to use to pick the right loader\n * @param mimeType defines an optional mime type\n * @param loaderOptions options to be passed to the loader\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\n * @returns a InternalTexture for assignment back into BABYLON.Texture\n */\n createTexture(e, t, i, r, s = 3, a = null, o = null, l = null, c = null, h = null, u = null, f, d, p, g) {\n return this._createTextureBase(e, t, i, r, s, a, o, this._prepareWebGLTexture.bind(this), (m, v, E, C, T, R) => {\n const x = this._gl, S = E.width === m && E.height === v;\n T._creationFlags = p ?? 0;\n const M = this._getTexImageParametersForCreateTexture(h, C, T._useSRGBBuffer);\n if (S)\n return x.texImage2D(x.TEXTURE_2D, 0, M.internalFormat, M.format, M.type, E), !1;\n const N = this._caps.maxTextureSize;\n if (E.width > N || E.height > N || !this._supportsHardwareTextureRescaling)\n return this._prepareWorkingCanvas(), !this._workingCanvas || !this._workingContext || (this._workingCanvas.width = m, this._workingCanvas.height = v, this._workingContext.drawImage(E, 0, 0, E.width, E.height, 0, 0, m, v), x.texImage2D(x.TEXTURE_2D, 0, M.internalFormat, M.format, M.type, this._workingCanvas), T.width = m, T.height = v), !1;\n {\n const F = new or(this, Dt.Temp);\n this._bindTextureDirectly(x.TEXTURE_2D, F, !0), x.texImage2D(x.TEXTURE_2D, 0, M.internalFormat, M.format, M.type, E), this._rescaleTexture(F, T, r, M.format, () => {\n this._releaseTexture(F), this._bindTextureDirectly(x.TEXTURE_2D, T, !0), R();\n });\n }\n return !0;\n }, l, c, h, u, f, d, g);\n }\n /**\n * Calls to the GL texImage2D and texImage3D functions require three arguments describing the pixel format of the texture.\n * createTexture derives these from the babylonFormat and useSRGBBuffer arguments and also the file extension of the URL it's working with.\n * This function encapsulates that derivation for easy unit testing.\n * @param babylonFormat Babylon's format enum, as specified in ITextureCreationOptions.\n * @param fileExtension The file extension including the dot, e.g. .jpg.\n * @param useSRGBBuffer Use SRGB not linear.\n * @returns The options to pass to texImage2D or texImage3D calls.\n * @internal\n */\n _getTexImageParametersForCreateTexture(e, t, i) {\n e == null && (e = t === \".jpg\" && !i ? 4 : 5);\n let r, s;\n return this.webGLVersion === 1 ? (r = this._getInternalFormat(e, i), s = r) : (r = this._getInternalFormat(e, !1), s = this._getRGBABufferInternalSizedFormat(0, e, i)), {\n internalFormat: s,\n format: r,\n type: this._gl.UNSIGNED_BYTE\n };\n }\n /**\n * Loads an image as an HTMLImageElement.\n * @param input url string, ArrayBuffer, or Blob to load\n * @param onLoad callback called when the image successfully loads\n * @param onError callback called when the image fails to load\n * @param offlineProvider offline provider for caching\n * @param mimeType optional mime type\n * @param imageBitmapOptions optional the options to use when creating an ImageBitmap\n * @returns the HTMLImageElement of the loaded image\n * @internal\n */\n static _FileToolsLoadImage(e, t, i, r, s, a) {\n throw We(\"FileTools\");\n }\n /**\n * @internal\n */\n _rescaleTexture(e, t, i, r, s) {\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a raw texture\n * @param data defines the data to store in the texture\n * @param width defines the width of the texture\n * @param height defines the height of the texture\n * @param format defines the format of the data\n * @param generateMipMaps defines if the engine should generate the mip levels\n * @param invertY defines if data must be stored with Y axis inverted\n * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default)\n * @param compression defines the compression used (null by default)\n * @param type defines the type fo the data (Engine.TEXTURETYPE_UNSIGNED_INT by default)\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\n * @returns the raw texture inside an InternalTexture\n */\n createRawTexture(e, t, i, r, s, a, o, l = null, c = 0, h = 0, u = !1) {\n throw We(\"Engine.RawTexture\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a new raw cube texture\n * @param data defines the array of data to use to create each face\n * @param size defines the size of the textures\n * @param format defines the format of the data\n * @param type defines the type of the data (like Engine.TEXTURETYPE_UNSIGNED_INT)\n * @param generateMipMaps defines if the engine should generate the mip levels\n * @param invertY defines if data must be stored with Y axis inverted\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\n * @param compression defines the compression used (null by default)\n * @returns the cube texture as an InternalTexture\n */\n createRawCubeTexture(e, t, i, r, s, a, o, l = null) {\n throw We(\"Engine.RawTexture\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a new raw 3D texture\n * @param data defines the data used to create the texture\n * @param width defines the width of the texture\n * @param height defines the height of the texture\n * @param depth defines the depth of the texture\n * @param format defines the format of the texture\n * @param generateMipMaps defines if the engine must generate mip levels\n * @param invertY defines if data must be stored with Y axis inverted\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\n * @param compression defines the compressed used (can be null)\n * @param textureType defines the compressed used (can be null)\n * @returns a new raw 3D texture (stored in an InternalTexture)\n */\n createRawTexture3D(e, t, i, r, s, a, o, l, c = null, h = 0) {\n throw We(\"Engine.RawTexture\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a new raw 2D array texture\n * @param data defines the data used to create the texture\n * @param width defines the width of the texture\n * @param height defines the height of the texture\n * @param depth defines the number of layers of the texture\n * @param format defines the format of the texture\n * @param generateMipMaps defines if the engine must generate mip levels\n * @param invertY defines if data must be stored with Y axis inverted\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\n * @param compression defines the compressed used (can be null)\n * @param textureType defines the compressed used (can be null)\n * @returns a new raw 2D array texture (stored in an InternalTexture)\n */\n createRawTexture2DArray(e, t, i, r, s, a, o, l, c = null, h = 0) {\n throw We(\"Engine.RawTexture\");\n }\n /**\n * @internal\n */\n _unpackFlipY(e) {\n this._unpackFlipYCached !== e && (this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, e ? 1 : 0), this.enableUnpackFlipYCached && (this._unpackFlipYCached = e));\n }\n /** @internal */\n _getUnpackAlignement() {\n return this._gl.getParameter(this._gl.UNPACK_ALIGNMENT);\n }\n _getTextureTarget(e) {\n return e.isCube ? this._gl.TEXTURE_CUBE_MAP : e.is3D ? this._gl.TEXTURE_3D : e.is2DArray || e.isMultiview ? this._gl.TEXTURE_2D_ARRAY : this._gl.TEXTURE_2D;\n }\n /**\n * Update the sampling mode of a given texture\n * @param samplingMode defines the required sampling mode\n * @param texture defines the texture to update\n * @param generateMipMaps defines whether to generate mipmaps for the texture\n */\n updateTextureSamplingMode(e, t, i = !1) {\n const r = this._getTextureTarget(t), s = this._getSamplingParameters(e, t.useMipMaps || i);\n this._setTextureParameterInteger(r, this._gl.TEXTURE_MAG_FILTER, s.mag, t), this._setTextureParameterInteger(r, this._gl.TEXTURE_MIN_FILTER, s.min), i && (t.generateMipMaps = !0, this._gl.generateMipmap(r)), this._bindTextureDirectly(r, null), t.samplingMode = e;\n }\n /**\n * Update the dimensions of a texture\n * @param texture texture to update\n * @param width new width of the texture\n * @param height new height of the texture\n * @param depth new depth of the texture\n */\n updateTextureDimensions(e, t, i, r = 1) {\n }\n /**\n * Update the sampling mode of a given texture\n * @param texture defines the texture to update\n * @param wrapU defines the texture wrap mode of the u coordinates\n * @param wrapV defines the texture wrap mode of the v coordinates\n * @param wrapR defines the texture wrap mode of the r coordinates\n */\n updateTextureWrappingMode(e, t, i = null, r = null) {\n const s = this._getTextureTarget(e);\n t !== null && (this._setTextureParameterInteger(s, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(t), e), e._cachedWrapU = t), i !== null && (this._setTextureParameterInteger(s, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(i), e), e._cachedWrapV = i), (e.is2DArray || e.is3D) && r !== null && (this._setTextureParameterInteger(s, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(r), e), e._cachedWrapR = r), this._bindTextureDirectly(s, null);\n }\n /**\n * @internal\n */\n _setupDepthStencilTexture(e, t, i, r, s, a = 1) {\n const o = t.width || t, l = t.height || t, c = t.layers || 0, h = t.depth || 0;\n e.baseWidth = o, e.baseHeight = l, e.width = o, e.height = l, e.is2DArray = c > 0, e.depth = c || h, e.isReady = !0, e.samples = a, e.generateMipMaps = !1, e.samplingMode = r ? 2 : 1, e.type = 0, e._comparisonFunction = s;\n const u = this._gl, f = this._getTextureTarget(e), d = this._getSamplingParameters(e.samplingMode, !1);\n u.texParameteri(f, u.TEXTURE_MAG_FILTER, d.mag), u.texParameteri(f, u.TEXTURE_MIN_FILTER, d.min), u.texParameteri(f, u.TEXTURE_WRAP_S, u.CLAMP_TO_EDGE), u.texParameteri(f, u.TEXTURE_WRAP_T, u.CLAMP_TO_EDGE), this.webGLVersion > 1 && (s === 0 ? (u.texParameteri(f, u.TEXTURE_COMPARE_FUNC, 515), u.texParameteri(f, u.TEXTURE_COMPARE_MODE, u.NONE)) : (u.texParameteri(f, u.TEXTURE_COMPARE_FUNC, s), u.texParameteri(f, u.TEXTURE_COMPARE_MODE, u.COMPARE_REF_TO_TEXTURE)));\n }\n /**\n * @internal\n */\n _uploadCompressedDataToTextureDirectly(e, t, i, r, s, a = 0, o = 0) {\n const l = this._gl;\n let c = l.TEXTURE_2D;\n if (e.isCube && (c = l.TEXTURE_CUBE_MAP_POSITIVE_X + a), e._useSRGBBuffer)\n switch (t) {\n case 37492:\n case 36196:\n this._caps.etc2 ? t = l.COMPRESSED_SRGB8_ETC2 : e._useSRGBBuffer = !1;\n break;\n case 37496:\n this._caps.etc2 ? t = l.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : e._useSRGBBuffer = !1;\n break;\n case 36492:\n t = l.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT;\n break;\n case 37808:\n t = l.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;\n break;\n case 33776:\n this._caps.s3tc_srgb ? t = l.COMPRESSED_SRGB_S3TC_DXT1_EXT : e._useSRGBBuffer = !1;\n break;\n case 33777:\n this._caps.s3tc_srgb ? t = l.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT : e._useSRGBBuffer = !1;\n break;\n case 33779:\n this._caps.s3tc_srgb ? t = l.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT : e._useSRGBBuffer = !1;\n break;\n default:\n e._useSRGBBuffer = !1;\n break;\n }\n this._gl.compressedTexImage2D(c, o, t, i, r, 0, s);\n }\n /**\n * @internal\n */\n _uploadDataToTextureDirectly(e, t, i = 0, r = 0, s, a = !1) {\n const o = this._gl, l = this._getWebGLTextureType(e.type), c = this._getInternalFormat(e.format), h = s === void 0 ? this._getRGBABufferInternalSizedFormat(e.type, e.format, e._useSRGBBuffer) : this._getInternalFormat(s, e._useSRGBBuffer);\n this._unpackFlipY(e.invertY);\n let u = o.TEXTURE_2D;\n e.isCube && (u = o.TEXTURE_CUBE_MAP_POSITIVE_X + i);\n const f = Math.round(Math.log(e.width) * Math.LOG2E), d = Math.round(Math.log(e.height) * Math.LOG2E), p = a ? e.width : Math.pow(2, Math.max(f - r, 0)), g = a ? e.height : Math.pow(2, Math.max(d - r, 0));\n o.texImage2D(u, r, h, p, g, 0, c, l, t);\n }\n /**\n * Update a portion of an internal texture\n * @param texture defines the texture to update\n * @param imageData defines the data to store into the texture\n * @param xOffset defines the x coordinates of the update rectangle\n * @param yOffset defines the y coordinates of the update rectangle\n * @param width defines the width of the update rectangle\n * @param height defines the height of the update rectangle\n * @param faceIndex defines the face index if texture is a cube (0 by default)\n * @param lod defines the lod level to update (0 by default)\n * @param generateMipMaps defines whether to generate mipmaps or not\n */\n updateTextureData(e, t, i, r, s, a, o = 0, l = 0, c = !1) {\n const h = this._gl, u = this._getWebGLTextureType(e.type), f = this._getInternalFormat(e.format);\n this._unpackFlipY(e.invertY);\n let d = h.TEXTURE_2D, p = h.TEXTURE_2D;\n e.isCube && (p = h.TEXTURE_CUBE_MAP_POSITIVE_X + o, d = h.TEXTURE_CUBE_MAP), this._bindTextureDirectly(d, e, !0), h.texSubImage2D(p, l, i, r, s, a, f, u, t), c && this._gl.generateMipmap(p), this._bindTextureDirectly(d, null);\n }\n /**\n * @internal\n */\n _uploadArrayBufferViewToTexture(e, t, i = 0, r = 0) {\n const s = this._gl, a = e.isCube ? s.TEXTURE_CUBE_MAP : s.TEXTURE_2D;\n this._bindTextureDirectly(a, e, !0), this._uploadDataToTextureDirectly(e, t, i, r), this._bindTextureDirectly(a, null, !0);\n }\n _prepareWebGLTextureContinuation(e, t, i, r, s) {\n const a = this._gl;\n if (!a)\n return;\n const o = this._getSamplingParameters(s, !i);\n a.texParameteri(a.TEXTURE_2D, a.TEXTURE_MAG_FILTER, o.mag), a.texParameteri(a.TEXTURE_2D, a.TEXTURE_MIN_FILTER, o.min), !i && !r && a.generateMipmap(a.TEXTURE_2D), this._bindTextureDirectly(a.TEXTURE_2D, null), t && t.removePendingData(e), e.onLoadedObservable.notifyObservers(e), e.onLoadedObservable.clear();\n }\n _prepareWebGLTexture(e, t, i, r, s, a, o, l, c = 3) {\n const h = this.getCaps().maxTextureSize, u = Math.min(h, this.needPOTTextures ? De.GetExponentOfTwo(r.width, h) : r.width), f = Math.min(h, this.needPOTTextures ? De.GetExponentOfTwo(r.height, h) : r.height), d = this._gl;\n if (d) {\n if (!e._hardwareTexture) {\n i && i.removePendingData(e);\n return;\n }\n this._bindTextureDirectly(d.TEXTURE_2D, e, !0), this._unpackFlipY(s === void 0 ? !0 : !!s), e.baseWidth = r.width, e.baseHeight = r.height, e.width = u, e.height = f, e.isReady = !0, e.type = e.type !== -1 ? e.type : 0, e.format = e.format !== -1 ? e.format : t === \".jpg\" && !e._useSRGBBuffer ? 4 : 5, !l(u, f, r, t, e, () => {\n this._prepareWebGLTextureContinuation(e, i, a, o, c);\n }) && this._prepareWebGLTextureContinuation(e, i, a, o, c);\n }\n }\n /**\n * @internal\n */\n _setupFramebufferDepthAttachments(e, t, i, r, s = 1) {\n const a = this._gl;\n if (e && t)\n return this._createRenderBuffer(i, r, s, a.DEPTH_STENCIL, a.DEPTH24_STENCIL8, a.DEPTH_STENCIL_ATTACHMENT);\n if (t) {\n let o = a.DEPTH_COMPONENT16;\n return this._webGLVersion > 1 && (o = a.DEPTH_COMPONENT32F), this._createRenderBuffer(i, r, s, o, o, a.DEPTH_ATTACHMENT);\n }\n return e ? this._createRenderBuffer(i, r, s, a.STENCIL_INDEX8, a.STENCIL_INDEX8, a.STENCIL_ATTACHMENT) : null;\n }\n /**\n * @internal\n */\n _createRenderBuffer(e, t, i, r, s, a, o = !0) {\n const c = this._gl.createRenderbuffer();\n return this._updateRenderBuffer(c, e, t, i, r, s, a, o);\n }\n _updateRenderBuffer(e, t, i, r, s, a, o, l = !0) {\n const c = this._gl;\n return c.bindRenderbuffer(c.RENDERBUFFER, e), r > 1 && c.renderbufferStorageMultisample ? c.renderbufferStorageMultisample(c.RENDERBUFFER, r, a, t, i) : c.renderbufferStorage(c.RENDERBUFFER, s, t, i), c.framebufferRenderbuffer(c.FRAMEBUFFER, o, c.RENDERBUFFER, e), l && c.bindRenderbuffer(c.RENDERBUFFER, null), e;\n }\n /**\n * @internal\n */\n _releaseTexture(e) {\n var i;\n this._deleteTexture((i = e._hardwareTexture) == null ? void 0 : i.underlyingResource), this.unbindAllTextures();\n const t = this._internalTexturesCache.indexOf(e);\n t !== -1 && this._internalTexturesCache.splice(t, 1), e._lodTextureHigh && e._lodTextureHigh.dispose(), e._lodTextureMid && e._lodTextureMid.dispose(), e._lodTextureLow && e._lodTextureLow.dispose(), e._irradianceTexture && e._irradianceTexture.dispose();\n }\n /**\n * @internal\n */\n _releaseRenderTargetWrapper(e) {\n const t = this._renderTargetWrapperCache.indexOf(e);\n t !== -1 && this._renderTargetWrapperCache.splice(t, 1);\n }\n _deleteTexture(e) {\n e && this._gl.deleteTexture(e);\n }\n _setProgram(e) {\n this._currentProgram !== e && (this._gl.useProgram(e), this._currentProgram = e);\n }\n /**\n * Binds an effect to the webGL context\n * @param effect defines the effect to bind\n */\n bindSamplers(e) {\n const t = e.getPipelineContext();\n this._setProgram(t.program);\n const i = e.getSamplers();\n for (let r = 0; r < i.length; r++) {\n const s = e.getUniform(i[r]);\n s && (this._boundUniforms[r] = s);\n }\n this._currentEffect = null;\n }\n _activateCurrentTexture() {\n this._currentTextureChannel !== this._activeChannel && (this._gl.activeTexture(this._gl.TEXTURE0 + this._activeChannel), this._currentTextureChannel = this._activeChannel);\n }\n /**\n * @internal\n */\n _bindTextureDirectly(e, t, i = !1, r = !1) {\n var l;\n let s = !1;\n const a = t && t._associatedChannel > -1;\n if (i && a && (this._activeChannel = t._associatedChannel), this._boundTexturesCache[this._activeChannel] !== t || r) {\n if (this._activateCurrentTexture(), t && t.isMultiview)\n throw ne.Error([\"_bindTextureDirectly called with a multiview texture!\", e, t]), \"_bindTextureDirectly called with a multiview texture!\";\n this._gl.bindTexture(e, ((l = t == null ? void 0 : t._hardwareTexture) == null ? void 0 : l.underlyingResource) ?? null), this._boundTexturesCache[this._activeChannel] = t, t && (t._associatedChannel = this._activeChannel);\n } else\n i && (s = !0, this._activateCurrentTexture());\n return a && !i && this._bindSamplerUniformToChannel(t._associatedChannel, this._activeChannel), s;\n }\n /**\n * @internal\n */\n _bindTexture(e, t, i) {\n if (e === void 0)\n return;\n t && (t._associatedChannel = e), this._activeChannel = e;\n const r = t ? this._getTextureTarget(t) : this._gl.TEXTURE_2D;\n this._bindTextureDirectly(r, t);\n }\n /**\n * Unbind all textures from the webGL context\n */\n unbindAllTextures() {\n for (let e = 0; e < this._maxSimultaneousTextures; e++)\n this._activeChannel = e, this._bindTextureDirectly(this._gl.TEXTURE_2D, null), this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null), this.webGLVersion > 1 && (this._bindTextureDirectly(this._gl.TEXTURE_3D, null), this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null));\n }\n /**\n * Sets a texture to the according uniform.\n * @param channel The texture channel\n * @param uniform The uniform to set\n * @param texture The texture to apply\n * @param name The name of the uniform in the effect\n */\n setTexture(e, t, i, r) {\n e !== void 0 && (t && (this._boundUniforms[e] = t), this._setTexture(e, i));\n }\n _bindSamplerUniformToChannel(e, t) {\n const i = this._boundUniforms[e];\n !i || i._currentState === t || (this._gl.uniform1i(i, t), i._currentState = t);\n }\n _getTextureWrapMode(e) {\n switch (e) {\n case 1:\n return this._gl.REPEAT;\n case 0:\n return this._gl.CLAMP_TO_EDGE;\n case 2:\n return this._gl.MIRRORED_REPEAT;\n }\n return this._gl.REPEAT;\n }\n _setTexture(e, t, i = !1, r = !1, s = \"\") {\n if (!t)\n return this._boundTexturesCache[e] != null && (this._activeChannel = e, this._bindTextureDirectly(this._gl.TEXTURE_2D, null), this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null), this.webGLVersion > 1 && (this._bindTextureDirectly(this._gl.TEXTURE_3D, null), this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null))), !1;\n if (t.video) {\n this._activeChannel = e;\n const c = t.getInternalTexture();\n c && (c._associatedChannel = e), t.update();\n } else if (t.delayLoadState === 4)\n return t.delayLoad(), !1;\n let a;\n r ? a = t.depthStencilTexture : t.isReady() ? a = t.getInternalTexture() : t.isCube ? a = this.emptyCubeTexture : t.is3D ? a = this.emptyTexture3D : t.is2DArray ? a = this.emptyTexture2DArray : a = this.emptyTexture, !i && a && (a._associatedChannel = e);\n let o = !0;\n this._boundTexturesCache[e] === a && (i || this._bindSamplerUniformToChannel(a._associatedChannel, e), o = !1), this._activeChannel = e;\n const l = this._getTextureTarget(a);\n if (o && this._bindTextureDirectly(l, a, i), a && !a.isMultiview) {\n if (a.isCube && a._cachedCoordinatesMode !== t.coordinatesMode) {\n a._cachedCoordinatesMode = t.coordinatesMode;\n const c = t.coordinatesMode !== 3 && t.coordinatesMode !== 5 ? 1 : 0;\n t.wrapU = c, t.wrapV = c;\n }\n a._cachedWrapU !== t.wrapU && (a._cachedWrapU = t.wrapU, this._setTextureParameterInteger(l, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(t.wrapU), a)), a._cachedWrapV !== t.wrapV && (a._cachedWrapV = t.wrapV, this._setTextureParameterInteger(l, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(t.wrapV), a)), a.is3D && a._cachedWrapR !== t.wrapR && (a._cachedWrapR = t.wrapR, this._setTextureParameterInteger(l, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(t.wrapR), a)), this._setAnisotropicLevel(l, a, t.anisotropicFilteringLevel);\n }\n return !0;\n }\n /**\n * Sets an array of texture to the webGL context\n * @param channel defines the channel where the texture array must be set\n * @param uniform defines the associated uniform location\n * @param textures defines the array of textures to bind\n * @param name name of the channel\n */\n setTextureArray(e, t, i, r) {\n if (!(e === void 0 || !t)) {\n (!this._textureUnits || this._textureUnits.length !== i.length) && (this._textureUnits = new Int32Array(i.length));\n for (let s = 0; s < i.length; s++) {\n const a = i[s].getInternalTexture();\n a ? (this._textureUnits[s] = e + s, a._associatedChannel = e + s) : this._textureUnits[s] = -1;\n }\n this._gl.uniform1iv(t, this._textureUnits);\n for (let s = 0; s < i.length; s++)\n this._setTexture(this._textureUnits[s], i[s], !0);\n }\n }\n /**\n * @internal\n */\n _setAnisotropicLevel(e, t, i) {\n const r = this._caps.textureAnisotropicFilterExtension;\n t.samplingMode !== 11 && t.samplingMode !== 3 && t.samplingMode !== 2 && (i = 1), r && t._cachedAnisotropicFilteringLevel !== i && (this._setTextureParameterFloat(e, r.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(i, this._caps.maxAnisotropy), t), t._cachedAnisotropicFilteringLevel = i);\n }\n _setTextureParameterFloat(e, t, i, r) {\n this._bindTextureDirectly(e, r, !0, !0), this._gl.texParameterf(e, t, i);\n }\n _setTextureParameterInteger(e, t, i, r) {\n r && this._bindTextureDirectly(e, r, !0, !0), this._gl.texParameteri(e, t, i);\n }\n /**\n * Unbind all vertex attributes from the webGL context\n */\n unbindAllAttributes() {\n if (this._mustWipeVertexAttributes) {\n this._mustWipeVertexAttributes = !1;\n for (let e = 0; e < this._caps.maxVertexAttribs; e++)\n this.disableAttributeByIndex(e);\n return;\n }\n for (let e = 0, t = this._vertexAttribArraysEnabled.length; e < t; e++)\n e >= this._caps.maxVertexAttribs || !this._vertexAttribArraysEnabled[e] || this.disableAttributeByIndex(e);\n }\n /**\n * Force the engine to release all cached effects. This means that next effect compilation will have to be done completely even if a similar effect was already compiled\n */\n releaseEffects() {\n for (const e in this._compiledEffects) {\n const t = this._compiledEffects[e].getPipelineContext();\n this._deletePipelineContext(t);\n }\n this._compiledEffects = {};\n }\n /**\n * Dispose and release all associated resources\n */\n dispose() {\n var e, t;\n this._isDisposed = !0, this.stopRenderLoop(), this.onBeforeTextureInitObservable && this.onBeforeTextureInitObservable.clear(), this._emptyTexture && (this._releaseTexture(this._emptyTexture), this._emptyTexture = null), this._emptyCubeTexture && (this._releaseTexture(this._emptyCubeTexture), this._emptyCubeTexture = null), this._dummyFramebuffer && this._gl.deleteFramebuffer(this._dummyFramebuffer), this.releaseEffects(), (e = this.releaseComputeEffects) == null || e.call(this), this.unbindAllAttributes(), this._boundUniforms = {}, yi() && this._renderingCanvas && (this._doNotHandleContextLost || (this._renderingCanvas.removeEventListener(\"webglcontextlost\", this._onContextLost), this._renderingCanvas.removeEventListener(\"webglcontextrestored\", this._onContextRestored)), window.removeEventListener(\"resize\", this._checkForMobile)), this._workingCanvas = null, this._workingContext = null, this._currentBufferPointers.length = 0, this._renderingCanvas = null, this._currentProgram = null, this._boundRenderFunction = null, Hi.ResetCache();\n for (const i of this._activeRequests)\n i.abort();\n this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear(), this._creationOptions.loseContextOnDispose && ((t = this._gl.getExtension(\"WEBGL_lose_context\")) == null || t.loseContext());\n }\n /**\n * Attach a new callback raised when context lost event is fired\n * @param callback defines the callback to call\n */\n attachContextLostEvent(e) {\n this._renderingCanvas && this._renderingCanvas.addEventListener(\"webglcontextlost\", e, !1);\n }\n /**\n * Attach a new callback raised when context restored event is fired\n * @param callback defines the callback to call\n */\n attachContextRestoredEvent(e) {\n this._renderingCanvas && this._renderingCanvas.addEventListener(\"webglcontextrestored\", e, !1);\n }\n /**\n * Get the current error code of the webGL context\n * @returns the error code\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError\n */\n getError() {\n return this._gl.getError();\n }\n _canRenderToFloatFramebuffer() {\n return this._webGLVersion > 1 ? this._caps.colorBufferFloat : this._canRenderToFramebuffer(1);\n }\n _canRenderToHalfFloatFramebuffer() {\n return this._webGLVersion > 1 ? this._caps.colorBufferFloat : this._canRenderToFramebuffer(2);\n }\n // Thank you : http://stackoverflow.com/questions/28827511/webgl-ios-render-to-floating-point-texture\n _canRenderToFramebuffer(e) {\n const t = this._gl;\n for (; t.getError() !== t.NO_ERROR; )\n ;\n let i = !0;\n const r = t.createTexture();\n t.bindTexture(t.TEXTURE_2D, r), t.texImage2D(t.TEXTURE_2D, 0, this._getRGBABufferInternalSizedFormat(e), 1, 1, 0, t.RGBA, this._getWebGLTextureType(e), null), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MIN_FILTER, t.NEAREST), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MAG_FILTER, t.NEAREST);\n const s = t.createFramebuffer();\n t.bindFramebuffer(t.FRAMEBUFFER, s), t.framebufferTexture2D(t.FRAMEBUFFER, t.COLOR_ATTACHMENT0, t.TEXTURE_2D, r, 0);\n const a = t.checkFramebufferStatus(t.FRAMEBUFFER);\n if (i = i && a === t.FRAMEBUFFER_COMPLETE, i = i && t.getError() === t.NO_ERROR, i && (t.clear(t.COLOR_BUFFER_BIT), i = i && t.getError() === t.NO_ERROR), i) {\n t.bindFramebuffer(t.FRAMEBUFFER, null);\n const o = t.RGBA, l = t.UNSIGNED_BYTE, c = new Uint8Array(4);\n t.readPixels(0, 0, 1, 1, o, l, c), i = i && t.getError() === t.NO_ERROR;\n }\n for (t.deleteTexture(r), t.deleteFramebuffer(s), t.bindFramebuffer(t.FRAMEBUFFER, null); !i && t.getError() !== t.NO_ERROR; )\n ;\n return i;\n }\n /**\n * @internal\n */\n _getWebGLTextureType(e) {\n if (this._webGLVersion === 1) {\n switch (e) {\n case 1:\n return this._gl.FLOAT;\n case 2:\n return this._gl.HALF_FLOAT_OES;\n case 0:\n return this._gl.UNSIGNED_BYTE;\n case 8:\n return this._gl.UNSIGNED_SHORT_4_4_4_4;\n case 9:\n return this._gl.UNSIGNED_SHORT_5_5_5_1;\n case 10:\n return this._gl.UNSIGNED_SHORT_5_6_5;\n }\n return this._gl.UNSIGNED_BYTE;\n }\n switch (e) {\n case 3:\n return this._gl.BYTE;\n case 0:\n return this._gl.UNSIGNED_BYTE;\n case 4:\n return this._gl.SHORT;\n case 5:\n return this._gl.UNSIGNED_SHORT;\n case 6:\n return this._gl.INT;\n case 7:\n return this._gl.UNSIGNED_INT;\n case 1:\n return this._gl.FLOAT;\n case 2:\n return this._gl.HALF_FLOAT;\n case 8:\n return this._gl.UNSIGNED_SHORT_4_4_4_4;\n case 9:\n return this._gl.UNSIGNED_SHORT_5_5_5_1;\n case 10:\n return this._gl.UNSIGNED_SHORT_5_6_5;\n case 11:\n return this._gl.UNSIGNED_INT_2_10_10_10_REV;\n case 12:\n return this._gl.UNSIGNED_INT_24_8;\n case 13:\n return this._gl.UNSIGNED_INT_10F_11F_11F_REV;\n case 14:\n return this._gl.UNSIGNED_INT_5_9_9_9_REV;\n case 15:\n return this._gl.FLOAT_32_UNSIGNED_INT_24_8_REV;\n }\n return this._gl.UNSIGNED_BYTE;\n }\n /**\n * @internal\n */\n _getInternalFormat(e, t = !1) {\n let i = t ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA;\n switch (e) {\n case 0:\n i = this._gl.ALPHA;\n break;\n case 1:\n i = this._gl.LUMINANCE;\n break;\n case 2:\n i = this._gl.LUMINANCE_ALPHA;\n break;\n case 6:\n i = this._gl.RED;\n break;\n case 7:\n i = this._gl.RG;\n break;\n case 4:\n i = t ? this._glSRGBExtensionValues.SRGB : this._gl.RGB;\n break;\n case 5:\n i = t ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA;\n break;\n }\n if (this._webGLVersion > 1)\n switch (e) {\n case 8:\n i = this._gl.RED_INTEGER;\n break;\n case 9:\n i = this._gl.RG_INTEGER;\n break;\n case 10:\n i = this._gl.RGB_INTEGER;\n break;\n case 11:\n i = this._gl.RGBA_INTEGER;\n break;\n }\n return i;\n }\n /**\n * @internal\n */\n _getRGBABufferInternalSizedFormat(e, t, i = !1) {\n if (this._webGLVersion === 1) {\n if (t !== void 0)\n switch (t) {\n case 0:\n return this._gl.ALPHA;\n case 1:\n return this._gl.LUMINANCE;\n case 2:\n return this._gl.LUMINANCE_ALPHA;\n case 4:\n return i ? this._glSRGBExtensionValues.SRGB : this._gl.RGB;\n }\n return this._gl.RGBA;\n }\n switch (e) {\n case 3:\n switch (t) {\n case 6:\n return this._gl.R8_SNORM;\n case 7:\n return this._gl.RG8_SNORM;\n case 4:\n return this._gl.RGB8_SNORM;\n case 8:\n return this._gl.R8I;\n case 9:\n return this._gl.RG8I;\n case 10:\n return this._gl.RGB8I;\n case 11:\n return this._gl.RGBA8I;\n default:\n return this._gl.RGBA8_SNORM;\n }\n case 0:\n switch (t) {\n case 6:\n return this._gl.R8;\n case 7:\n return this._gl.RG8;\n case 4:\n return i ? this._glSRGBExtensionValues.SRGB8 : this._gl.RGB8;\n case 5:\n return i ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA8;\n case 8:\n return this._gl.R8UI;\n case 9:\n return this._gl.RG8UI;\n case 10:\n return this._gl.RGB8UI;\n case 11:\n return this._gl.RGBA8UI;\n case 0:\n return this._gl.ALPHA;\n case 1:\n return this._gl.LUMINANCE;\n case 2:\n return this._gl.LUMINANCE_ALPHA;\n default:\n return this._gl.RGBA8;\n }\n case 4:\n switch (t) {\n case 8:\n return this._gl.R16I;\n case 9:\n return this._gl.RG16I;\n case 10:\n return this._gl.RGB16I;\n case 11:\n return this._gl.RGBA16I;\n default:\n return this._gl.RGBA16I;\n }\n case 5:\n switch (t) {\n case 8:\n return this._gl.R16UI;\n case 9:\n return this._gl.RG16UI;\n case 10:\n return this._gl.RGB16UI;\n case 11:\n return this._gl.RGBA16UI;\n default:\n return this._gl.RGBA16UI;\n }\n case 6:\n switch (t) {\n case 8:\n return this._gl.R32I;\n case 9:\n return this._gl.RG32I;\n case 10:\n return this._gl.RGB32I;\n case 11:\n return this._gl.RGBA32I;\n default:\n return this._gl.RGBA32I;\n }\n case 7:\n switch (t) {\n case 8:\n return this._gl.R32UI;\n case 9:\n return this._gl.RG32UI;\n case 10:\n return this._gl.RGB32UI;\n case 11:\n return this._gl.RGBA32UI;\n default:\n return this._gl.RGBA32UI;\n }\n case 1:\n switch (t) {\n case 6:\n return this._gl.R32F;\n case 7:\n return this._gl.RG32F;\n case 4:\n return this._gl.RGB32F;\n case 5:\n return this._gl.RGBA32F;\n default:\n return this._gl.RGBA32F;\n }\n case 2:\n switch (t) {\n case 6:\n return this._gl.R16F;\n case 7:\n return this._gl.RG16F;\n case 4:\n return this._gl.RGB16F;\n case 5:\n return this._gl.RGBA16F;\n default:\n return this._gl.RGBA16F;\n }\n case 10:\n return this._gl.RGB565;\n case 13:\n return this._gl.R11F_G11F_B10F;\n case 14:\n return this._gl.RGB9_E5;\n case 8:\n return this._gl.RGBA4;\n case 9:\n return this._gl.RGB5_A1;\n case 11:\n switch (t) {\n case 5:\n return this._gl.RGB10_A2;\n case 11:\n return this._gl.RGB10_A2UI;\n default:\n return this._gl.RGB10_A2;\n }\n }\n return i ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA8;\n }\n /**\n * @internal\n */\n _loadFile(e, t, i, r, s, a) {\n const o = De._FileToolsLoadFile(e, t, i, r, s, a);\n return this._activeRequests.push(o), o.onCompleteObservable.add((l) => {\n this._activeRequests.splice(this._activeRequests.indexOf(l), 1);\n }), o;\n }\n /**\n * Loads a file from a url\n * @param url url to load\n * @param onSuccess callback called when the file successfully loads\n * @param onProgress callback called while file is loading (if the server supports this mode)\n * @param offlineProvider defines the offline provider for caching\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\n * @param onError callback called when the file fails to load\n * @returns a file request object\n * @internal\n */\n static _FileToolsLoadFile(e, t, i, r, s, a) {\n throw We(\"FileTools\");\n }\n /**\n * Reads pixels from the current frame buffer. Please note that this function can be slow\n * @param x defines the x coordinate of the rectangle where pixels must be read\n * @param y defines the y coordinate of the rectangle where pixels must be read\n * @param width defines the width of the rectangle where pixels must be read\n * @param height defines the height of the rectangle where pixels must be read\n * @param hasAlpha defines whether the output should have alpha or not (defaults to true)\n * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels\n * @returns a ArrayBufferView promise (Uint8Array) containing RGBA colors\n */\n readPixels(e, t, i, r, s = !0, a = !0) {\n const o = s ? 4 : 3, l = s ? this._gl.RGBA : this._gl.RGB, c = new Uint8Array(r * i * o);\n return a && this.flushFramebuffer(), this._gl.readPixels(e, t, i, r, l, this._gl.UNSIGNED_BYTE, c), Promise.resolve(c);\n }\n /**\n * Gets a Promise indicating if the engine can be instantiated (ie. if a webGL context can be found)\n */\n static get IsSupportedAsync() {\n return Promise.resolve(this.isSupported());\n }\n /**\n * Gets a boolean indicating if the engine can be instantiated (ie. if a webGL context can be found)\n */\n static get IsSupported() {\n return this.isSupported();\n }\n /**\n * Gets a boolean indicating if the engine can be instantiated (ie. if a webGL context can be found)\n * @returns true if the engine can be created\n * @ignorenaming\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static isSupported() {\n if (this._HasMajorPerformanceCaveat !== null)\n return !this._HasMajorPerformanceCaveat;\n if (this._IsSupported === null)\n try {\n const e = this._CreateCanvas(1, 1), t = e.getContext(\"webgl\") || e.getContext(\"experimental-webgl\");\n this._IsSupported = t != null && !!window.WebGLRenderingContext;\n } catch {\n this._IsSupported = !1;\n }\n return this._IsSupported;\n }\n /**\n * Gets a boolean indicating if the engine can be instantiated on a performant device (ie. if a webGL context can be found and it does not use a slow implementation)\n */\n static get HasMajorPerformanceCaveat() {\n if (this._HasMajorPerformanceCaveat === null)\n try {\n const e = this._CreateCanvas(1, 1), t = e.getContext(\"webgl\", { failIfMajorPerformanceCaveat: !0 }) || e.getContext(\"experimental-webgl\", { failIfMajorPerformanceCaveat: !0 });\n this._HasMajorPerformanceCaveat = !t;\n } catch {\n this._HasMajorPerformanceCaveat = !1;\n }\n return this._HasMajorPerformanceCaveat;\n }\n /**\n * Find the next highest power of two.\n * @param x Number to start search from.\n * @returns Next highest power of two.\n */\n static CeilingPOT(e) {\n return e--, e |= e >> 1, e |= e >> 2, e |= e >> 4, e |= e >> 8, e |= e >> 16, e++, e;\n }\n /**\n * Find the next lowest power of two.\n * @param x Number to start search from.\n * @returns Next lowest power of two.\n */\n static FloorPOT(e) {\n return e = e | e >> 1, e = e | e >> 2, e = e | e >> 4, e = e | e >> 8, e = e | e >> 16, e - (e >> 1);\n }\n /**\n * Find the nearest power of two.\n * @param x Number to start search from.\n * @returns Next nearest power of two.\n */\n static NearestPOT(e) {\n const t = De.CeilingPOT(e), i = De.FloorPOT(e);\n return t - e > e - i ? i : t;\n }\n /**\n * Get the closest exponent of two\n * @param value defines the value to approximate\n * @param max defines the maximum value to return\n * @param mode defines how to define the closest value\n * @returns closest exponent of two of the given value\n */\n static GetExponentOfTwo(e, t, i = 2) {\n let r;\n switch (i) {\n case 1:\n r = De.FloorPOT(e);\n break;\n case 2:\n r = De.NearestPOT(e);\n break;\n case 3:\n default:\n r = De.CeilingPOT(e);\n break;\n }\n return Math.min(r, t);\n }\n /**\n * Queue a new function into the requested animation frame pool (ie. this function will be executed by the browser (or the javascript engine) for the next frame)\n * @param func - the function to be called\n * @param requester - the object that will request the next frame. Falls back to window.\n * @returns frame number\n */\n static QueueNewFrame(e, t) {\n if (yi()) {\n const { requestAnimationFrame: i } = t || window;\n if (typeof i == \"function\")\n return i(e);\n } else if (typeof requestAnimationFrame == \"function\")\n return requestAnimationFrame(e);\n return setTimeout(e, 16);\n }\n /**\n * Gets host document\n * @returns the host document object\n */\n getHostDocument() {\n return this._renderingCanvas && this._renderingCanvas.ownerDocument ? this._renderingCanvas.ownerDocument : no() ? document : null;\n }\n}\nDe._TempClearColorUint32 = new Uint32Array(4);\nDe._TempClearColorInt32 = new Int32Array(4);\nDe.ExceptionList = [\n { key: \"Chrome/63.0\", capture: \"63\\\\.0\\\\.3239\\\\.(\\\\d+)\", captureConstraint: 108, targets: [\"uniformBuffer\"] },\n { key: \"Firefox/58\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\n { key: \"Firefox/59\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\n { key: \"Chrome/72.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\n { key: \"Chrome/73.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\n { key: \"Chrome/74.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\n { key: \"Mac OS.+Chrome/71\", capture: null, captureConstraint: null, targets: [\"vao\"] },\n { key: \"Mac OS.+Chrome/72\", capture: null, captureConstraint: null, targets: [\"vao\"] },\n { key: \"Mac OS.+Chrome\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\n { key: \"Chrome/12\\\\d\\\\..+?Mobile\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\n // desktop osx safari 15.4\n { key: \".*AppleWebKit.*(15.4).*Safari\", capture: null, captureConstraint: null, targets: [\"antialias\", \"maxMSAASamples\"] },\n // mobile browsers using safari 15.4 on ios\n { key: \".*(15.4).*AppleWebKit.*Safari\", capture: null, captureConstraint: null, targets: [\"antialias\", \"maxMSAASamples\"] }\n];\nDe._TextureLoaders = [];\nDe.CollisionsEpsilon = 1e-3;\nDe._IsSupported = null;\nDe._HasMajorPerformanceCaveat = null;\nclass Jl {\n /**\n * Polyfill for setImmediate\n * @param action defines the action to execute after the current execution block\n */\n static SetImmediate(e) {\n yi() && window.setImmediate ? window.setImmediate(e) : setTimeout(e, 1);\n }\n}\nconst L_ = new RegExp(/^data:([^,]+\\/[^,]+)?;base64,/i);\nclass $l extends Ba {\n /**\n * Creates a new LoadFileError\n * @param message defines the message of the error\n * @param object defines the optional web request\n */\n constructor(e, t) {\n super(e, Pc.LoadFileError), this.name = \"LoadFileError\", ba._setPrototypeOf(this, $l.prototype), t instanceof mi ? this.request = t : this.file = t;\n }\n}\nclass ec extends Ba {\n /**\n * Creates a new LoadFileError\n * @param message defines the message of the error\n * @param request defines the optional web request\n */\n constructor(e, t) {\n super(e, Pc.RequestFileError), this.request = t, this.name = \"RequestFileError\", ba._setPrototypeOf(this, ec.prototype);\n }\n}\nclass Ju extends Ba {\n /**\n * Creates a new ReadFileError\n * @param message defines the message of the error\n * @param file defines the optional file\n */\n constructor(e, t) {\n super(e, Pc.ReadFileError), this.file = t, this.name = \"ReadFileError\", ba._setPrototypeOf(this, Ju.prototype);\n }\n}\nconst li = {\n /**\n * Gets or sets the retry strategy to apply when an error happens while loading an asset.\n * When defining this function, return the wait time before trying again or return -1 to\n * stop retrying and error out.\n */\n DefaultRetryStrategy: QS.ExponentialBackoff(),\n /**\n * Gets or sets the base URL to use to load assets\n */\n BaseUrl: \"\",\n /**\n * Default behaviour for cors in the application.\n * It can be a string if the expected behavior is identical in the entire app.\n * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance)\n */\n CorsBehavior: \"anonymous\",\n /**\n * Gets or sets a function used to pre-process url before using them to load assets\n * @param url\n * @returns the processed url\n */\n PreprocessUrl: (n) => n,\n /**\n * Gets or sets the base URL to use to load scripts\n * Used for both JS and WASM\n */\n ScriptBaseUrl: \"\",\n /**\n * Gets or sets a function used to pre-process script url before using them to load.\n * Used for both JS and WASM\n * @param url defines the url to process\n * @returns the processed url\n */\n ScriptPreprocessUrl: (n) => n\n}, w_ = (n) => (n = n.replace(/#/gm, \"%23\"), n), $u = (n, e) => {\n if (!(n && n.indexOf(\"data:\") === 0) && li.CorsBehavior)\n if (typeof li.CorsBehavior == \"string\" || li.CorsBehavior instanceof String)\n e.crossOrigin = li.CorsBehavior;\n else {\n const t = li.CorsBehavior(n);\n t && (e.crossOrigin = t);\n }\n}, Go = (n, e, t, i, r = \"\", s) => {\n const a = st.LastCreatedEngine;\n if (typeof HTMLImageElement > \"u\" && !(a != null && a._features.forceBitmapOverHTMLImageElement))\n return t(\"LoadImage is only supported in web or BabylonNative environments.\"), null;\n let o, l = !1;\n n instanceof ArrayBuffer || ArrayBuffer.isView(n) ? typeof Blob < \"u\" && typeof URL < \"u\" ? (o = URL.createObjectURL(new Blob([n], { type: r })), l = !0) : o = `data:${r};base64,` + D_(n) : n instanceof Blob ? (o = URL.createObjectURL(n), l = !0) : (o = w_(n), o = li.PreprocessUrl(n));\n const c = (R) => {\n if (t) {\n const x = o || n.toString();\n t(`Error while trying to load image: ${x.indexOf(\"http\") === 0 || x.length <= 128 ? x : x.slice(0, 128) + \"...\"}`, R);\n }\n };\n if (a != null && a._features.forceBitmapOverHTMLImageElement)\n return on(o, (R) => {\n a.createImageBitmap(new Blob([R], { type: r }), { premultiplyAlpha: \"none\", ...s }).then((x) => {\n e(x), l && URL.revokeObjectURL(o);\n }).catch((x) => {\n t && t(\"Error while trying to load image: \" + n, x);\n });\n }, void 0, i || void 0, !0, (R, x) => {\n c(x);\n }), null;\n const h = new Image();\n $u(o, h);\n const u = [], f = () => {\n u.forEach((R) => {\n R.target.addEventListener(R.name, R.handler);\n });\n }, d = () => {\n u.forEach((R) => {\n R.target.removeEventListener(R.name, R.handler);\n }), u.length = 0;\n }, p = () => {\n d(), e(h), l && h.src && URL.revokeObjectURL(h.src);\n }, g = (R) => {\n d(), c(R), l && h.src && URL.revokeObjectURL(h.src);\n }, m = (R) => {\n if (R.blockedURI !== h.src)\n return;\n d();\n const x = new Error(`CSP violation of policy ${R.effectiveDirective} ${R.blockedURI}. Current policy is ${R.originalPolicy}`);\n st.UseFallbackTexture = !1, c(x), l && h.src && URL.revokeObjectURL(h.src), h.src = \"\";\n };\n u.push({ target: h, name: \"load\", handler: p }), u.push({ target: h, name: \"error\", handler: g }), u.push({ target: document, name: \"securitypolicyviolation\", handler: m }), f();\n const v = o.substring(0, 5) === \"blob:\", E = o.substring(0, 5) === \"data:\", C = () => {\n v || E || !mi.IsCustomRequestAvailable ? h.src = o : on(o, (R, x, S) => {\n const M = !r && S ? S : r, N = new Blob([R], { type: M }), F = URL.createObjectURL(N);\n l = !0, h.src = F;\n }, void 0, i || void 0, !0, (R, x) => {\n c(x);\n });\n }, T = () => {\n i && i.loadImage(o, h);\n };\n if (!v && !E && i && i.enableTexturesOffline)\n i.open(T, C);\n else {\n if (o.indexOf(\"file:\") !== -1) {\n const R = decodeURIComponent(o.substring(5).toLowerCase());\n if (ao.FilesToLoad[R] && typeof URL < \"u\") {\n try {\n let x;\n try {\n x = URL.createObjectURL(ao.FilesToLoad[R]);\n } catch {\n x = URL.createObjectURL(ao.FilesToLoad[R]);\n }\n h.src = x, l = !0;\n } catch {\n h.src = \"\";\n }\n return h;\n }\n }\n C();\n }\n return h;\n}, go = (n, e, t, i, r) => {\n const s = new FileReader(), a = {\n onCompleteObservable: new he(),\n abort: () => s.abort()\n };\n return s.onloadend = () => a.onCompleteObservable.notifyObservers(a), r && (s.onerror = () => {\n r(new Ju(`Unable to read ${n.name}`, n));\n }), s.onload = (o) => {\n e(o.target.result);\n }, t && (s.onprogress = t), i ? s.readAsArrayBuffer(n) : s.readAsText(n), a;\n}, on = (n, e, t, i, r, s, a) => {\n if (n.name)\n return go(n, e, t, r, s ? (h) => {\n s(void 0, h);\n } : void 0);\n const o = n;\n if (o.indexOf(\"file:\") !== -1) {\n let h = decodeURIComponent(o.substring(5).toLowerCase());\n h.indexOf(\"./\") === 0 && (h = h.substring(2));\n const u = ao.FilesToLoad[h];\n if (u)\n return go(u, e, t, r, s ? (f) => s(void 0, new $l(f.message, f.file)) : void 0);\n }\n const { match: l, type: c } = Ey(o);\n if (l) {\n const h = {\n onCompleteObservable: new he(),\n abort: () => () => {\n }\n };\n try {\n const u = r ? tf(o) : B_(o);\n e(u, void 0, c);\n } catch (u) {\n s ? s(void 0, u) : ne.Error(u.message || \"Failed to parse the Data URL\");\n }\n return Jl.SetImmediate(() => {\n h.onCompleteObservable.notifyObservers(h);\n }), h;\n }\n return ef(o, (h, u) => {\n e(h, u == null ? void 0 : u.responseURL, u == null ? void 0 : u.getResponseHeader(\"content-type\"));\n }, t, i, r, s ? (h) => {\n s(h.request, new $l(h.message, h.request));\n } : void 0, a);\n}, ef = (n, e, t, i, r, s, a) => {\n n = w_(n), n = li.PreprocessUrl(n);\n const o = li.BaseUrl + n;\n let l = !1;\n const c = {\n onCompleteObservable: new he(),\n abort: () => l = !0\n }, h = () => {\n let u = new mi(), f = null, d;\n const p = () => {\n u && (t && u.removeEventListener(\"progress\", t), d && u.removeEventListener(\"readystatechange\", d), u.removeEventListener(\"loadend\", g));\n };\n let g = () => {\n p(), c.onCompleteObservable.notifyObservers(c), c.onCompleteObservable.clear(), t = void 0, d = null, g = null, s = void 0, a = void 0, e = void 0;\n };\n c.abort = () => {\n l = !0, g && g(), u && u.readyState !== (XMLHttpRequest.DONE || 4) && u.abort(), f !== null && (clearTimeout(f), f = null), u = null;\n };\n const m = (E) => {\n const C = E.message || \"Unknown error\";\n s && u ? s(new ec(C, u)) : ne.Error(C);\n }, v = (E) => {\n if (u) {\n if (u.open(\"GET\", o), a)\n try {\n a(u);\n } catch (C) {\n m(C);\n return;\n }\n r && (u.responseType = \"arraybuffer\"), t && u.addEventListener(\"progress\", t), g && u.addEventListener(\"loadend\", g), d = () => {\n if (!(l || !u) && u.readyState === (XMLHttpRequest.DONE || 4)) {\n if (d && u.removeEventListener(\"readystatechange\", d), u.status >= 200 && u.status < 300 || u.status === 0 && (!yi() || U_())) {\n try {\n e && e(r ? u.response : u.responseText, u);\n } catch (R) {\n m(R);\n }\n return;\n }\n const C = li.DefaultRetryStrategy;\n if (C) {\n const R = C(o, u, E);\n if (R !== -1) {\n p(), u = new mi(), f = setTimeout(() => v(E + 1), R);\n return;\n }\n }\n const T = new ec(\"Error status: \" + u.status + \" \" + u.statusText + \" - Unable to load \" + o, u);\n s && s(T);\n }\n }, u.addEventListener(\"readystatechange\", d), u.send();\n }\n };\n v(0);\n };\n if (i && i.enableSceneOffline) {\n const u = (d) => {\n d && d.status > 400 ? s && s(d) : h();\n }, f = () => {\n i && i.loadFile(li.BaseUrl + n, (d) => {\n !l && e && e(d), c.onCompleteObservable.notifyObservers(c);\n }, t ? (d) => {\n !l && t && t(d);\n } : void 0, u, r);\n };\n i.open(f, u);\n } else\n h();\n return c;\n}, U_ = () => typeof location < \"u\" && location.protocol === \"file:\", V_ = (n) => L_.test(n), Ey = (n) => {\n const e = L_.exec(n);\n return e === null || e.length === 0 ? { match: !1, type: \"\" } : { match: !0, type: e[0].replace(\"data:\", \"\").replace(\"base64,\", \"\") };\n};\nfunction tf(n) {\n return JS(n.split(\",\")[1]);\n}\nconst B_ = (n) => N_(n.split(\",\")[1]), vy = () => {\n De._FileToolsLoadImage = Go, De._FileToolsLoadFile = on, hs._FileToolsLoadFile = on;\n};\nvy();\nlet $a;\nconst Ty = (n, e, t, i, r, s, a, o, l, c) => {\n $a = {\n DecodeBase64UrlToBinary: n,\n DecodeBase64UrlToString: e,\n DefaultRetryStrategy: t.DefaultRetryStrategy,\n BaseUrl: t.BaseUrl,\n CorsBehavior: t.CorsBehavior,\n PreprocessUrl: t.PreprocessUrl,\n IsBase64DataUrl: i,\n IsFileURL: r,\n LoadFile: s,\n LoadImage: a,\n ReadFile: o,\n RequestFile: l,\n SetCorsBehavior: c\n }, Object.defineProperty($a, \"DefaultRetryStrategy\", {\n get: function() {\n return t.DefaultRetryStrategy;\n },\n set: function(h) {\n t.DefaultRetryStrategy = h;\n }\n }), Object.defineProperty($a, \"BaseUrl\", {\n get: function() {\n return t.BaseUrl;\n },\n set: function(h) {\n t.BaseUrl = h;\n }\n }), Object.defineProperty($a, \"PreprocessUrl\", {\n get: function() {\n return t.PreprocessUrl;\n },\n set: function(h) {\n t.PreprocessUrl = h;\n }\n }), Object.defineProperty($a, \"CorsBehavior\", {\n get: function() {\n return t.CorsBehavior;\n },\n set: function(h) {\n t.CorsBehavior = h;\n }\n });\n};\nTy(tf, B_, li, V_, U_, on, Go, go, ef, $u);\nconst k_ = {};\nfunction Re(n, e) {\n k_[n] = e;\n}\nfunction mr(n) {\n return k_[n];\n}\nclass lo {\n /**\n * Tries to instantiate a new object from a given class name\n * @param className defines the class name to instantiate\n * @returns the new object or null if the system was not able to do the instantiation\n */\n static Instantiate(e) {\n if (this.RegisteredExternalClasses && this.RegisteredExternalClasses[e])\n return this.RegisteredExternalClasses[e];\n const t = mr(e);\n if (t)\n return t;\n ne.Warn(e + \" not found, you may have missed an import.\");\n const i = e.split(\".\");\n let r = window || this;\n for (let s = 0, a = i.length; s < a; s++)\n r = r[i[s]];\n return typeof r != \"function\" ? null : r;\n }\n}\nlo.RegisteredExternalClasses = {};\nfunction rf() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (n) => {\n const e = Math.random() * 16 | 0;\n return (n === \"x\" ? e : e & 3 | 8).toString(16);\n });\n}\nfunction mo(n) {\n let e = 1;\n do\n e *= 2;\n while (e < n);\n return e === n;\n}\nfunction pu(n, e, t) {\n return n * (1 - t) + e * t;\n}\nclass ge {\n /**\n * Gets or sets the base URL to use to load assets\n */\n static get BaseUrl() {\n return li.BaseUrl;\n }\n static set BaseUrl(e) {\n li.BaseUrl = e;\n }\n /**\n * This function checks whether a URL is absolute or not.\n * It will also detect data and blob URLs\n * @param url the url to check\n * @returns is the url absolute or relative\n */\n static IsAbsoluteUrl(e) {\n return e.indexOf(\"//\") === 0 ? !0 : e.indexOf(\"://\") === -1 || e.indexOf(\".\") === -1 || e.indexOf(\"/\") === -1 || e.indexOf(\":\") > e.indexOf(\"/\") ? !1 : e.indexOf(\"://\") < e.indexOf(\".\") || e.indexOf(\"data:\") === 0 || e.indexOf(\"blob:\") === 0;\n }\n /**\n * Sets the base URL to use to load scripts\n */\n static set ScriptBaseUrl(e) {\n li.ScriptBaseUrl = e;\n }\n static get ScriptBaseUrl() {\n return li.ScriptBaseUrl;\n }\n /**\n * Sets a preprocessing function to run on a source URL before importing it\n * Note that this function will execute AFTER the base URL is appended to the URL\n */\n static set ScriptPreprocessUrl(e) {\n li.ScriptPreprocessUrl = e;\n }\n static get ScriptPreprocessUrl() {\n return li.ScriptPreprocessUrl;\n }\n /**\n * Gets or sets the retry strategy to apply when an error happens while loading an asset\n */\n static get DefaultRetryStrategy() {\n return li.DefaultRetryStrategy;\n }\n static set DefaultRetryStrategy(e) {\n li.DefaultRetryStrategy = e;\n }\n /**\n * Default behavior for cors in the application.\n * It can be a string if the expected behavior is identical in the entire app.\n * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance)\n */\n static get CorsBehavior() {\n return li.CorsBehavior;\n }\n static set CorsBehavior(e) {\n li.CorsBehavior = e;\n }\n /**\n * Gets or sets a global variable indicating if fallback texture must be used when a texture cannot be loaded\n * @ignorenaming\n */\n static get UseFallbackTexture() {\n return st.UseFallbackTexture;\n }\n static set UseFallbackTexture(e) {\n st.UseFallbackTexture = e;\n }\n /**\n * Use this object to register external classes like custom textures or material\n * to allow the loaders to instantiate them\n */\n static get RegisteredExternalClasses() {\n return lo.RegisteredExternalClasses;\n }\n static set RegisteredExternalClasses(e) {\n lo.RegisteredExternalClasses = e;\n }\n /**\n * Texture content used if a texture cannot loaded\n * @ignorenaming\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static get fallbackTexture() {\n return st.FallbackTexture;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static set fallbackTexture(e) {\n st.FallbackTexture = e;\n }\n /**\n * Read the content of a byte array at a specified coordinates (taking in account wrapping)\n * @param u defines the coordinate on X axis\n * @param v defines the coordinate on Y axis\n * @param width defines the width of the source data\n * @param height defines the height of the source data\n * @param pixels defines the source byte array\n * @param color defines the output color\n */\n static FetchToRef(e, t, i, r, s, a) {\n const o = Math.abs(e) * i % i | 0, l = Math.abs(t) * r % r | 0, c = (o + l * i) * 4;\n a.r = s[c] / 255, a.g = s[c + 1] / 255, a.b = s[c + 2] / 255, a.a = s[c + 3] / 255;\n }\n /**\n * Interpolates between a and b via alpha\n * @param a The lower value (returned when alpha = 0)\n * @param b The upper value (returned when alpha = 1)\n * @param alpha The interpolation-factor\n * @returns The mixed value\n */\n static Mix(e, t, i) {\n return 0;\n }\n /**\n * Tries to instantiate a new object from a given class name\n * @param className defines the class name to instantiate\n * @returns the new object or null if the system was not able to do the instantiation\n */\n static Instantiate(e) {\n return lo.Instantiate(e);\n }\n /**\n * Polyfill for setImmediate\n * @param action defines the action to execute after the current execution block\n */\n static SetImmediate(e) {\n Jl.SetImmediate(e);\n }\n /**\n * Function indicating if a number is an exponent of 2\n * @param value defines the value to test\n * @returns true if the value is an exponent of 2\n */\n static IsExponentOfTwo(e) {\n return !0;\n }\n /**\n * Returns the nearest 32-bit single precision float representation of a Number\n * @param value A Number. If the parameter is of a different type, it will get converted\n * to a number or to NaN if it cannot be converted\n * @returns number\n */\n static FloatRound(e) {\n return Math.fround(e);\n }\n /**\n * Extracts the filename from a path\n * @param path defines the path to use\n * @returns the filename\n */\n static GetFilename(e) {\n const t = e.lastIndexOf(\"/\");\n return t < 0 ? e : e.substring(t + 1);\n }\n /**\n * Extracts the \"folder\" part of a path (everything before the filename).\n * @param uri The URI to extract the info from\n * @param returnUnchangedIfNoSlash Do not touch the URI if no slashes are present\n * @returns The \"folder\" part of the path\n */\n static GetFolderPath(e, t = !1) {\n const i = e.lastIndexOf(\"/\");\n return i < 0 ? t ? e : \"\" : e.substring(0, i + 1);\n }\n /**\n * Convert an angle in radians to degrees\n * @param angle defines the angle to convert\n * @returns the angle in degrees\n */\n static ToDegrees(e) {\n return e * 180 / Math.PI;\n }\n /**\n * Convert an angle in degrees to radians\n * @param angle defines the angle to convert\n * @returns the angle in radians\n */\n static ToRadians(e) {\n return e * Math.PI / 180;\n }\n /**\n * Smooth angle changes (kind of low-pass filter), in particular for device orientation \"shaking\"\n * Use trigonometric functions to avoid discontinuity (0/360, -180/180)\n * @param previousAngle defines last angle value, in degrees\n * @param newAngle defines new angle value, in degrees\n * @param smoothFactor defines smoothing sensitivity; min 0: no smoothing, max 1: new data ignored\n * @returns the angle in degrees\n */\n static SmoothAngleChange(e, t, i = 0.9) {\n const r = this.ToRadians(e), s = this.ToRadians(t);\n return this.ToDegrees(Math.atan2((1 - i) * Math.sin(s) + i * Math.sin(r), (1 - i) * Math.cos(s) + i * Math.cos(r)));\n }\n /**\n * Returns an array if obj is not an array\n * @param obj defines the object to evaluate as an array\n * @param allowsNullUndefined defines a boolean indicating if obj is allowed to be null or undefined\n * @returns either obj directly if obj is an array or a new array containing obj\n */\n static MakeArray(e, t) {\n return t !== !0 && (e === void 0 || e == null) ? null : Array.isArray(e) ? e : [e];\n }\n /**\n * Gets the pointer prefix to use\n * @param engine defines the engine we are finding the prefix for\n * @returns \"pointer\" if touch is enabled. Else returns \"mouse\"\n */\n static GetPointerPrefix(e) {\n let t = \"pointer\";\n return yi() && !window.PointerEvent && (t = \"mouse\"), e._badDesktopOS && !e._badOS && // And not ipad pros who claim to be macs...\n !(document && \"ontouchend\" in document) && (t = \"mouse\"), t;\n }\n /**\n * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element.\n * @param url define the url we are trying\n * @param element define the dom element where to configure the cors policy\n * @param element.crossOrigin\n */\n static SetCorsBehavior(e, t) {\n $u(e, t);\n }\n /**\n * Sets the referrerPolicy behavior on a dom element.\n * @param referrerPolicy define the referrer policy to use\n * @param element define the dom element where to configure the referrer policy\n * @param element.referrerPolicy\n */\n static SetReferrerPolicyBehavior(e, t) {\n t.referrerPolicy = e;\n }\n // External files\n /**\n * Removes unwanted characters from an url\n * @param url defines the url to clean\n * @returns the cleaned url\n */\n static CleanUrl(e) {\n return e = e.replace(/#/gm, \"%23\"), e;\n }\n /**\n * Gets or sets a function used to pre-process url before using them to load assets\n */\n static get PreprocessUrl() {\n return li.PreprocessUrl;\n }\n static set PreprocessUrl(e) {\n li.PreprocessUrl = e;\n }\n /**\n * Loads an image as an HTMLImageElement.\n * @param input url string, ArrayBuffer, or Blob to load\n * @param onLoad callback called when the image successfully loads\n * @param onError callback called when the image fails to load\n * @param offlineProvider offline provider for caching\n * @param mimeType optional mime type\n * @param imageBitmapOptions optional the options to use when creating an ImageBitmap\n * @returns the HTMLImageElement of the loaded image\n */\n static LoadImage(e, t, i, r, s, a) {\n return Go(e, t, i, r, s, a);\n }\n /**\n * Loads a file from a url\n * @param url url string, ArrayBuffer, or Blob to load\n * @param onSuccess callback called when the file successfully loads\n * @param onProgress callback called while file is loading (if the server supports this mode)\n * @param offlineProvider defines the offline provider for caching\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\n * @param onError callback called when the file fails to load\n * @returns a file request object\n */\n static LoadFile(e, t, i, r, s, a) {\n return on(e, t, i, r, s, a);\n }\n /**\n * Loads a file from a url\n * @param url the file url to load\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\n * @returns a promise containing an ArrayBuffer corresponding to the loaded file\n */\n static LoadFileAsync(e, t = !0) {\n return new Promise((i, r) => {\n on(e, (s) => {\n i(s);\n }, void 0, void 0, t, (s, a) => {\n r(a);\n });\n });\n }\n /**\n * Get a script URL including preprocessing\n * @param scriptUrl the script Url to process\n * @param forceAbsoluteUrl force the script to be an absolute url (adding the current base url if necessary)\n * @returns a modified URL to use\n */\n static GetBabylonScriptURL(e, t) {\n if (!e)\n return \"\";\n if (ge.ScriptBaseUrl && e.startsWith(ge._DefaultCdnUrl)) {\n const i = ge.ScriptBaseUrl[ge.ScriptBaseUrl.length - 1] === \"/\" ? ge.ScriptBaseUrl.substring(0, ge.ScriptBaseUrl.length - 1) : ge.ScriptBaseUrl;\n e = e.replace(ge._DefaultCdnUrl, i);\n }\n return e = ge.ScriptPreprocessUrl(e), t && (e = ge.GetAbsoluteUrl(e)), e;\n }\n /**\n * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the\n * content of this file is added into a new script element, attached to the DOM (body element)\n * @param scriptUrl defines the url of the script to load\n * @param onSuccess defines the callback called when the script is loaded\n * @param onError defines the callback to call if an error occurs\n * @param scriptId defines the id of the script element\n */\n static LoadBabylonScript(e, t, i, r) {\n e = ge.GetBabylonScriptURL(e), ge.LoadScript(e, t, i);\n }\n /**\n * Load an asynchronous script (identified by an url). When the url returns, the\n * content of this file is added into a new script element, attached to the DOM (body element)\n * @param scriptUrl defines the url of the script to laod\n * @returns a promise request object\n */\n static LoadBabylonScriptAsync(e) {\n return e = ge.GetBabylonScriptURL(e), ge.LoadScriptAsync(e);\n }\n /**\n * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the\n * content of this file is added into a new script element, attached to the DOM (body element)\n * @param scriptUrl defines the url of the script to load\n * @param onSuccess defines the callback called when the script is loaded\n * @param onError defines the callback to call if an error occurs\n * @param scriptId defines the id of the script element\n */\n static LoadScript(e, t, i, r) {\n if (typeof importScripts == \"function\") {\n try {\n importScripts(e), t();\n } catch (o) {\n i == null || i(`Unable to load script '${e}' in worker`, o);\n }\n return;\n } else if (!yi()) {\n i == null || i(`Cannot load script '${e}' outside of a window or a worker`);\n return;\n }\n const s = document.getElementsByTagName(\"head\")[0], a = document.createElement(\"script\");\n a.setAttribute(\"type\", \"text/javascript\"), a.setAttribute(\"src\", e), r && (a.id = r), a.onload = () => {\n t && t();\n }, a.onerror = (o) => {\n i && i(`Unable to load script '${e}'`, o);\n }, s.appendChild(a);\n }\n /**\n * Load an asynchronous script (identified by an url). When the url returns, the\n * content of this file is added into a new script element, attached to the DOM (body element)\n * @param scriptUrl defines the url of the script to load\n * @param scriptId defines the id of the script element\n * @returns a promise request object\n */\n static LoadScriptAsync(e, t) {\n return new Promise((i, r) => {\n this.LoadScript(e, () => {\n i();\n }, (s, a) => {\n r(a || new Error(s));\n }, t);\n });\n }\n /**\n * Loads a file from a blob\n * @param fileToLoad defines the blob to use\n * @param callback defines the callback to call when data is loaded\n * @param progressCallback defines the callback to call during loading process\n * @returns a file request object\n */\n static ReadFileAsDataURL(e, t, i) {\n const r = new FileReader(), s = {\n onCompleteObservable: new he(),\n abort: () => r.abort()\n };\n return r.onloadend = () => {\n s.onCompleteObservable.notifyObservers(s);\n }, r.onload = (a) => {\n t(a.target.result);\n }, r.onprogress = i, r.readAsDataURL(e), s;\n }\n /**\n * Reads a file from a File object\n * @param file defines the file to load\n * @param onSuccess defines the callback to call when data is loaded\n * @param onProgress defines the callback to call during loading process\n * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer\n * @param onError defines the callback to call when an error occurs\n * @returns a file request object\n */\n static ReadFile(e, t, i, r, s) {\n return go(e, t, i, r, s);\n }\n /**\n * Creates a data url from a given string content\n * @param content defines the content to convert\n * @returns the new data url link\n */\n static FileAsURL(e) {\n const t = new Blob([e]);\n return window.URL.createObjectURL(t);\n }\n /**\n * Format the given number to a specific decimal format\n * @param value defines the number to format\n * @param decimals defines the number of decimals to use\n * @returns the formatted string\n */\n static Format(e, t = 2) {\n return e.toFixed(t);\n }\n /**\n * Tries to copy an object by duplicating every property\n * @param source defines the source object\n * @param destination defines the target object\n * @param doNotCopyList defines a list of properties to avoid\n * @param mustCopyList defines a list of properties to copy (even if they start with _)\n */\n static DeepCopy(e, t, i, r) {\n Dn.DeepCopy(e, t, i, r);\n }\n /**\n * Gets a boolean indicating if the given object has no own property\n * @param obj defines the object to test\n * @returns true if object has no own property\n */\n static IsEmpty(e) {\n for (const t in e)\n if (Object.prototype.hasOwnProperty.call(e, t))\n return !1;\n return !0;\n }\n /**\n * Function used to register events at window level\n * @param windowElement defines the Window object to use\n * @param events defines the events to register\n */\n static RegisterTopRootEvents(e, t) {\n for (let i = 0; i < t.length; i++) {\n const r = t[i];\n e.addEventListener(r.name, r.handler, !1);\n try {\n window.parent && window.parent.addEventListener(r.name, r.handler, !1);\n } catch {\n }\n }\n }\n /**\n * Function used to unregister events from window level\n * @param windowElement defines the Window object to use\n * @param events defines the events to unregister\n */\n static UnregisterTopRootEvents(e, t) {\n for (let i = 0; i < t.length; i++) {\n const r = t[i];\n e.removeEventListener(r.name, r.handler);\n try {\n e.parent && e.parent.removeEventListener(r.name, r.handler);\n } catch {\n }\n }\n }\n /**\n * Dumps the current bound framebuffer\n * @param width defines the rendering width\n * @param height defines the rendering height\n * @param engine defines the hosting engine\n * @param successCallback defines the callback triggered once the data are available\n * @param mimeType defines the mime type of the result\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n * @returns a void promise\n */\n static async DumpFramebuffer(e, t, i, r, s = \"image/png\", a, o) {\n throw We(\"DumpTools\");\n }\n /**\n * Dumps an array buffer\n * @param width defines the rendering width\n * @param height defines the rendering height\n * @param data the data array\n * @param successCallback defines the callback triggered once the data are available\n * @param mimeType defines the mime type of the result\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\n * @param invertY true to invert the picture in the Y dimension\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n */\n static DumpData(e, t, i, r, s = \"image/png\", a, o = !1, l = !1, c) {\n throw We(\"DumpTools\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Dumps an array buffer\n * @param width defines the rendering width\n * @param height defines the rendering height\n * @param data the data array\n * @param mimeType defines the mime type of the result\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\n * @param invertY true to invert the picture in the Y dimension\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n * @returns a promise that resolve to the final data\n */\n static DumpDataAsync(e, t, i, r = \"image/png\", s, a = !1, o = !1, l) {\n throw We(\"DumpTools\");\n }\n static _IsOffScreenCanvas(e) {\n return e.convertToBlob !== void 0;\n }\n /**\n * Converts the canvas data to blob.\n * This acts as a polyfill for browsers not supporting the to blob function.\n * @param canvas Defines the canvas to extract the data from (can be an offscreen canvas)\n * @param successCallback Defines the callback triggered once the data are available\n * @param mimeType Defines the mime type of the result\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n */\n static ToBlob(e, t, i = \"image/png\", r) {\n !ge._IsOffScreenCanvas(e) && !e.toBlob && (e.toBlob = function(s, a, o) {\n setTimeout(() => {\n const l = atob(this.toDataURL(a, o).split(\",\")[1]), c = l.length, h = new Uint8Array(c);\n for (let u = 0; u < c; u++)\n h[u] = l.charCodeAt(u);\n s(new Blob([h]));\n });\n }), ge._IsOffScreenCanvas(e) ? e.convertToBlob({\n type: i,\n quality: r\n }).then((s) => t(s)) : e.toBlob(function(s) {\n t(s);\n }, i, r);\n }\n /**\n * Download a Blob object\n * @param blob the Blob object\n * @param fileName the file name to download\n */\n static DownloadBlob(e, t) {\n if (\"download\" in document.createElement(\"a\")) {\n if (!t) {\n const i = /* @__PURE__ */ new Date();\n t = \"screenshot_\" + ((i.getFullYear() + \"-\" + (i.getMonth() + 1)).slice(2) + \"-\" + i.getDate() + \"_\" + i.getHours() + \"-\" + (\"0\" + i.getMinutes()).slice(-2)) + \".png\";\n }\n ge.Download(e, t);\n } else if (e && typeof URL < \"u\") {\n const i = URL.createObjectURL(e), r = window.open(\"\");\n if (!r)\n return;\n const s = r.document.createElement(\"img\");\n s.onload = function() {\n URL.revokeObjectURL(i);\n }, s.src = i, r.document.body.appendChild(s);\n }\n }\n /**\n * Encodes the canvas data to base 64, or automatically downloads the result if `fileName` is defined.\n * @param canvas The canvas to get the data from, which can be an offscreen canvas.\n * @param successCallback The callback which is triggered once the data is available. If `fileName` is defined, the callback will be invoked after the download occurs, and the `data` argument will be an empty string.\n * @param mimeType The mime type of the result.\n * @param fileName The name of the file to download. If defined, the result will automatically be downloaded. If not defined, and `successCallback` is also not defined, the result will automatically be downloaded with an auto-generated file name.\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n */\n static EncodeScreenshotCanvasData(e, t, i = \"image/png\", r, s) {\n if (typeof r == \"string\" || !t)\n this.ToBlob(e, function(a) {\n a && ge.DownloadBlob(a, r), t && t(\"\");\n }, i, s);\n else if (t) {\n if (ge._IsOffScreenCanvas(e)) {\n e.convertToBlob({\n type: i,\n quality: s\n }).then((o) => {\n const l = new FileReader();\n l.readAsDataURL(o), l.onloadend = () => {\n const c = l.result;\n t(c);\n };\n });\n return;\n }\n const a = e.toDataURL(i, s);\n t(a);\n }\n }\n /**\n * Downloads a blob in the browser\n * @param blob defines the blob to download\n * @param fileName defines the name of the downloaded file\n */\n static Download(e, t) {\n if (typeof URL > \"u\")\n return;\n const i = window.URL.createObjectURL(e), r = document.createElement(\"a\");\n document.body.appendChild(r), r.style.display = \"none\", r.href = i, r.download = t, r.addEventListener(\"click\", () => {\n r.parentElement && r.parentElement.removeChild(r);\n }), r.click(), window.URL.revokeObjectURL(i);\n }\n /**\n * Will return the right value of the noPreventDefault variable\n * Needed to keep backwards compatibility to the old API.\n *\n * @param args arguments passed to the attachControl function\n * @returns the correct value for noPreventDefault\n */\n static BackCompatCameraNoPreventDefault(e) {\n return typeof e[0] == \"boolean\" ? e[0] : typeof e[1] == \"boolean\" ? e[1] : !1;\n }\n /**\n * Captures a screenshot of the current rendering\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\n * @param engine defines the rendering engine\n * @param camera defines the source camera\n * @param size This parameter can be set to a single number or to an object with the\n * following (optional) properties: precision, width, height. If a single number is passed,\n * it will be used for both width and height. If an object is passed, the screenshot size\n * will be derived from the parameters. The precision property is a multiplier allowing\n * rendering at a higher or lower resolution\n * @param successCallback defines the callback receives a single parameter which contains the\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\n * src parameter of an to display it\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\n * Check your browser for supported MIME types\n * @param forceDownload force the system to download the image even if a successCallback is provided\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static CreateScreenshot(e, t, i, r, s = \"image/png\", a = !1, o) {\n throw We(\"ScreenshotTools\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Captures a screenshot of the current rendering\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\n * @param engine defines the rendering engine\n * @param camera defines the source camera\n * @param size This parameter can be set to a single number or to an object with the\n * following (optional) properties: precision, width, height. If a single number is passed,\n * it will be used for both width and height. If an object is passed, the screenshot size\n * will be derived from the parameters. The precision property is a multiplier allowing\n * rendering at a higher or lower resolution\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\n * Check your browser for supported MIME types\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\n * to the src parameter of an to display it\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static CreateScreenshotAsync(e, t, i, r = \"image/png\", s) {\n throw We(\"ScreenshotTools\");\n }\n /**\n * Generates an image screenshot from the specified camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\n * @param engine The engine to use for rendering\n * @param camera The camera to use for rendering\n * @param size This parameter can be set to a single number or to an object with the\n * following (optional) properties: precision, width, height. If a single number is passed,\n * it will be used for both width and height. If an object is passed, the screenshot size\n * will be derived from the parameters. The precision property is a multiplier allowing\n * rendering at a higher or lower resolution\n * @param successCallback The callback receives a single parameter which contains the\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\n * src parameter of an to display it\n * @param mimeType The MIME type of the screenshot image (default: image/png).\n * Check your browser for supported MIME types\n * @param samples Texture samples (default: 1)\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\n * @param fileName A name for for the downloaded file.\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\n * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static CreateScreenshotUsingRenderTarget(e, t, i, r, s = \"image/png\", a = 1, o = !1, l, c = !1, h = !1, u = !0, f) {\n throw We(\"ScreenshotTools\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Generates an image screenshot from the specified camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\n * @param engine The engine to use for rendering\n * @param camera The camera to use for rendering\n * @param size This parameter can be set to a single number or to an object with the\n * following (optional) properties: precision, width, height. If a single number is passed,\n * it will be used for both width and height. If an object is passed, the screenshot size\n * will be derived from the parameters. The precision property is a multiplier allowing\n * rendering at a higher or lower resolution\n * @param mimeType The MIME type of the screenshot image (default: image/png).\n * Check your browser for supported MIME types\n * @param samples Texture samples (default: 1)\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\n * @param fileName A name for for the downloaded file.\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\n * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n * to the src parameter of an to display it\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static CreateScreenshotUsingRenderTargetAsync(e, t, i, r = \"image/png\", s = 1, a = !1, o, l = !1, c = !1, h = !0, u) {\n throw We(\"ScreenshotTools\");\n }\n /**\n * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523\n * Be aware Math.random() could cause collisions, but:\n * \"All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide\"\n * @returns a pseudo random id\n */\n static RandomId() {\n return rf();\n }\n /**\n * Test if the given uri is a base64 string\n * @deprecated Please use FileTools.IsBase64DataUrl instead.\n * @param uri The uri to test\n * @returns True if the uri is a base64 string or false otherwise\n */\n static IsBase64(e) {\n return V_(e);\n }\n /**\n * Decode the given base64 uri.\n * @deprecated Please use FileTools.DecodeBase64UrlToBinary instead.\n * @param uri The uri to decode\n * @returns The decoded base64 data.\n */\n static DecodeBase64(e) {\n return tf(e);\n }\n /**\n * Gets a value indicating the number of loading errors\n * @ignorenaming\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static get errorsCount() {\n return ne.errorsCount;\n }\n /**\n * Log a message to the console\n * @param message defines the message to log\n */\n static Log(e) {\n ne.Log(e);\n }\n /**\n * Write a warning message to the console\n * @param message defines the message to log\n */\n static Warn(e) {\n ne.Warn(e);\n }\n /**\n * Write an error message to the console\n * @param message defines the message to log\n */\n static Error(e) {\n ne.Error(e);\n }\n /**\n * Gets current log cache (list of logs)\n */\n static get LogCache() {\n return ne.LogCache;\n }\n /**\n * Clears the log cache\n */\n static ClearLogCache() {\n ne.ClearLogCache();\n }\n /**\n * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel)\n */\n static set LogLevels(e) {\n ne.LogLevels = e;\n }\n /**\n * Sets the current performance log level\n */\n static set PerformanceLogLevel(e) {\n if ((e & ge.PerformanceUserMarkLogLevel) === ge.PerformanceUserMarkLogLevel) {\n ge.StartPerformanceCounter = ge._StartUserMark, ge.EndPerformanceCounter = ge._EndUserMark;\n return;\n }\n if ((e & ge.PerformanceConsoleLogLevel) === ge.PerformanceConsoleLogLevel) {\n ge.StartPerformanceCounter = ge._StartPerformanceConsole, ge.EndPerformanceCounter = ge._EndPerformanceConsole;\n return;\n }\n ge.StartPerformanceCounter = ge._StartPerformanceCounterDisabled, ge.EndPerformanceCounter = ge._EndPerformanceCounterDisabled;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static _StartPerformanceCounterDisabled(e, t) {\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static _EndPerformanceCounterDisabled(e, t) {\n }\n static _StartUserMark(e, t = !0) {\n if (!ge._Performance) {\n if (!yi())\n return;\n ge._Performance = window.performance;\n }\n !t || !ge._Performance.mark || ge._Performance.mark(e + \"-Begin\");\n }\n static _EndUserMark(e, t = !0) {\n !t || !ge._Performance.mark || (ge._Performance.mark(e + \"-End\"), ge._Performance.measure(e, e + \"-Begin\", e + \"-End\"));\n }\n static _StartPerformanceConsole(e, t = !0) {\n t && (ge._StartUserMark(e, t), console.time && console.time(e));\n }\n static _EndPerformanceConsole(e, t = !0) {\n t && (ge._EndUserMark(e, t), console.timeEnd(e));\n }\n /**\n * Gets either window.performance.now() if supported or Date.now() else\n */\n static get Now() {\n return sr.Now;\n }\n /**\n * This method will return the name of the class used to create the instance of the given object.\n * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator.\n * @param object the object to get the class name from\n * @param isType defines if the object is actually a type\n * @returns the name of the class, will be \"object\" for a custom data type not using the @className decorator\n */\n static GetClassName(e, t = !1) {\n let i = null;\n return !t && e.getClassName ? i = e.getClassName() : (e instanceof Object && (i = (t ? e : Object.getPrototypeOf(e)).constructor.__bjsclassName__), i || (i = typeof e)), i;\n }\n /**\n * Gets the first element of an array satisfying a given predicate\n * @param array defines the array to browse\n * @param predicate defines the predicate to use\n * @returns null if not found or the element\n */\n static First(e, t) {\n for (const i of e)\n if (t(i))\n return i;\n return null;\n }\n /**\n * This method will return the name of the full name of the class, including its owning module (if any).\n * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator or implementing a method getClassName():string (in which case the module won't be specified).\n * @param object the object to get the class name from\n * @param isType defines if the object is actually a type\n * @returns a string that can have two forms: \"moduleName.className\" if module was specified when the class' Name was registered or \"className\" if there was not module specified.\n * @ignorenaming\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static getFullClassName(e, t = !1) {\n let i = null, r = null;\n if (!t && e.getClassName)\n i = e.getClassName();\n else {\n if (e instanceof Object) {\n const s = t ? e : Object.getPrototypeOf(e);\n i = s.constructor.__bjsclassName__, r = s.constructor.__bjsmoduleName__;\n }\n i || (i = typeof e);\n }\n return i ? (r != null ? r + \".\" : \"\") + i : null;\n }\n /**\n * Returns a promise that resolves after the given amount of time.\n * @param delay Number of milliseconds to delay\n * @returns Promise that resolves after the given amount of time\n */\n static DelayAsync(e) {\n return new Promise((t) => {\n setTimeout(() => {\n t();\n }, e);\n });\n }\n /**\n * Utility function to detect if the current user agent is Safari\n * @returns whether or not the current user agent is safari\n */\n static IsSafari() {\n return to() ? /^((?!chrome|android).)*safari/i.test(navigator.userAgent) : !1;\n }\n}\nge.UseCustomRequestHeaders = !1;\nge.CustomRequestHeaders = mi.CustomRequestHeaders;\nge.GetDOMTextContent = O_;\nge._DefaultCdnUrl = \"https://cdn.babylonjs.com\";\nge.GetAbsoluteUrl = typeof document == \"object\" ? (n) => {\n const e = document.createElement(\"a\");\n return e.href = n, e.href;\n} : typeof URL == \"function\" && typeof location == \"object\" ? (n) => new URL(n, location.origin).href : () => {\n throw new Error(\"Unable to get absolute URL. Override BABYLON.Tools.GetAbsoluteUrl to a custom implementation for the current context.\");\n};\nge.NoneLogLevel = ne.NoneLogLevel;\nge.MessageLogLevel = ne.MessageLogLevel;\nge.WarningLogLevel = ne.WarningLogLevel;\nge.ErrorLogLevel = ne.ErrorLogLevel;\nge.AllLogLevel = ne.AllLogLevel;\nge.IsWindowObjectExist = yi;\nge.PerformanceNoneLogLevel = 0;\nge.PerformanceUserMarkLogLevel = 1;\nge.PerformanceConsoleLogLevel = 2;\nge.StartPerformanceCounter = ge._StartPerformanceCounterDisabled;\nge.EndPerformanceCounter = ge._EndPerformanceCounterDisabled;\nclass Pr {\n /**\n * Constructor.\n * @param iterations the number of iterations.\n * @param func the function to run each iteration\n * @param successCallback the callback that will be called upon successful execution\n * @param offset starting offset.\n */\n constructor(e, t, i, r = 0) {\n this.iterations = e, this.index = r - 1, this._done = !1, this._fn = t, this._successCallback = i;\n }\n /**\n * Execute the next iteration. Must be called after the last iteration was finished.\n */\n executeNext() {\n this._done || (this.index + 1 < this.iterations ? (++this.index, this._fn(this)) : this.breakLoop());\n }\n /**\n * Break the loop and run the success callback.\n */\n breakLoop() {\n this._done = !0, this._successCallback();\n }\n /**\n * Create and run an async loop.\n * @param iterations the number of iterations.\n * @param fn the function to run each iteration\n * @param successCallback the callback that will be called upon successful execution\n * @param offset starting offset.\n * @returns the created async loop object\n */\n static Run(e, t, i, r = 0) {\n const s = new Pr(e, t, i, r);\n return s.executeNext(), s;\n }\n /**\n * A for-loop that will run a given number of iterations synchronous and the rest async.\n * @param iterations total number of iterations\n * @param syncedIterations number of synchronous iterations in each async iteration.\n * @param fn the function to call each iteration.\n * @param callback a success call back that will be called when iterating stops.\n * @param breakFunction a break condition (optional)\n * @param timeout timeout settings for the setTimeout function. default - 0.\n * @returns the created async loop object\n */\n static SyncAsyncForLoop(e, t, i, r, s, a = 0) {\n return Pr.Run(Math.ceil(e / t), (o) => {\n s && s() ? o.breakLoop() : setTimeout(() => {\n for (let l = 0; l < t; ++l) {\n const c = o.index * t + l;\n if (c >= e)\n break;\n if (i(c), s && s()) {\n o.breakLoop();\n break;\n }\n }\n o.executeNext();\n }, a);\n }, r);\n }\n}\nge.Mix = pu;\nge.IsExponentOfTwo = mo;\nst.FallbackTexture = \"data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QBmRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAAExAAIAAAAQAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQubmV0IDQuMC41AP/bAEMABAIDAwMCBAMDAwQEBAQFCQYFBQUFCwgIBgkNCw0NDQsMDA4QFBEODxMPDAwSGBITFRYXFxcOERkbGRYaFBYXFv/bAEMBBAQEBQUFCgYGChYPDA8WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFv/AABEIAQABAAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APH6KKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76CiiigD5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BQooooA+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/voKKKKAPl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76CiiigD5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BQooooA+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/voKKKKAPl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76P//Z\";\nclass Li {\n /**\n * Instantiates a Smart Array.\n * @param capacity defines the default capacity of the array.\n */\n constructor(e) {\n this.length = 0, this.data = new Array(e), this._id = Li._GlobalId++;\n }\n /**\n * Pushes a value at the end of the active data.\n * @param value defines the object to push in the array.\n */\n push(e) {\n this.data[this.length++] = e, this.length > this.data.length && (this.data.length *= 2);\n }\n /**\n * Iterates over the active data and apply the lambda to them.\n * @param func defines the action to apply on each value.\n */\n forEach(e) {\n for (let t = 0; t < this.length; t++)\n e(this.data[t]);\n }\n /**\n * Sorts the full sets of data.\n * @param compareFn defines the comparison function to apply.\n */\n sort(e) {\n this.data.sort(e);\n }\n /**\n * Resets the active data to an empty array.\n */\n reset() {\n this.length = 0;\n }\n /**\n * Releases all the data from the array as well as the array.\n */\n dispose() {\n this.reset(), this.data && (this.data.length = 0);\n }\n /**\n * Concats the active data with a given array.\n * @param array defines the data to concatenate with.\n */\n concat(e) {\n if (e.length !== 0) {\n this.length + e.length > this.data.length && (this.data.length = (this.length + e.length) * 2);\n for (let t = 0; t < e.length; t++)\n this.data[this.length++] = (e.data || e)[t];\n }\n }\n /**\n * Returns the position of a value in the active data.\n * @param value defines the value to find the index for\n * @returns the index if found in the active data otherwise -1\n */\n indexOf(e) {\n const t = this.data.indexOf(e);\n return t >= this.length ? -1 : t;\n }\n /**\n * Returns whether an element is part of the active data.\n * @param value defines the value to look for\n * @returns true if found in the active data otherwise false\n */\n contains(e) {\n return this.indexOf(e) !== -1;\n }\n}\nLi._GlobalId = 0;\nclass Cn extends Li {\n constructor() {\n super(...arguments), this._duplicateId = 0;\n }\n /**\n * Pushes a value at the end of the active data.\n * THIS DOES NOT PREVENT DUPPLICATE DATA\n * @param value defines the object to push in the array.\n */\n push(e) {\n super.push(e), e.__smartArrayFlags || (e.__smartArrayFlags = {}), e.__smartArrayFlags[this._id] = this._duplicateId;\n }\n /**\n * Pushes a value at the end of the active data.\n * If the data is already present, it won t be added again\n * @param value defines the object to push in the array.\n * @returns true if added false if it was already present\n */\n pushNoDuplicate(e) {\n return e.__smartArrayFlags && e.__smartArrayFlags[this._id] === this._duplicateId ? !1 : (this.push(e), !0);\n }\n /**\n * Resets the active data to an empty array.\n */\n reset() {\n super.reset(), this._duplicateId++;\n }\n /**\n * Concats the active data with a given array.\n * This ensures no duplicate will be present in the result.\n * @param array defines the data to concatenate with.\n */\n concatWithNoDuplicate(e) {\n if (e.length !== 0) {\n this.length + e.length > this.data.length && (this.data.length = (this.length + e.length) * 2);\n for (let t = 0; t < e.length; t++) {\n const i = (e.data || e)[t];\n this.pushNoDuplicate(i);\n }\n }\n }\n}\nclass Qp {\n constructor() {\n this._count = 0, this._data = {};\n }\n /**\n * This will clear this dictionary and copy the content from the 'source' one.\n * If the T value is a custom object, it won't be copied/cloned, the same object will be used\n * @param source the dictionary to take the content from and copy to this dictionary\n */\n copyFrom(e) {\n this.clear(), e.forEach((t, i) => this.add(t, i));\n }\n /**\n * Get a value based from its key\n * @param key the given key to get the matching value from\n * @returns the value if found, otherwise undefined is returned\n */\n get(e) {\n const t = this._data[e];\n if (t !== void 0)\n return t;\n }\n /**\n * Get a value from its key or add it if it doesn't exist.\n * This method will ensure you that a given key/data will be present in the dictionary.\n * @param key the given key to get the matching value from\n * @param factory the factory that will create the value if the key is not present in the dictionary.\n * The factory will only be invoked if there's no data for the given key.\n * @returns the value corresponding to the key.\n */\n getOrAddWithFactory(e, t) {\n let i = this.get(e);\n return i !== void 0 || (i = t(e), i && this.add(e, i)), i;\n }\n /**\n * Get a value from its key if present in the dictionary otherwise add it\n * @param key the key to get the value from\n * @param val if there's no such key/value pair in the dictionary add it with this value\n * @returns the value corresponding to the key\n */\n getOrAdd(e, t) {\n const i = this.get(e);\n return i !== void 0 ? i : (this.add(e, t), t);\n }\n /**\n * Check if there's a given key in the dictionary\n * @param key the key to check for\n * @returns true if the key is present, false otherwise\n */\n contains(e) {\n return this._data[e] !== void 0;\n }\n /**\n * Add a new key and its corresponding value\n * @param key the key to add\n * @param value the value corresponding to the key\n * @returns true if the operation completed successfully, false if we couldn't insert the key/value because there was already this key in the dictionary\n */\n add(e, t) {\n return this._data[e] !== void 0 ? !1 : (this._data[e] = t, ++this._count, !0);\n }\n /**\n * Update a specific value associated to a key\n * @param key defines the key to use\n * @param value defines the value to store\n * @returns true if the value was updated (or false if the key was not found)\n */\n set(e, t) {\n return this._data[e] === void 0 ? !1 : (this._data[e] = t, !0);\n }\n /**\n * Get the element of the given key and remove it from the dictionary\n * @param key defines the key to search\n * @returns the value associated with the key or null if not found\n */\n getAndRemove(e) {\n const t = this.get(e);\n return t !== void 0 ? (delete this._data[e], --this._count, t) : null;\n }\n /**\n * Remove a key/value from the dictionary.\n * @param key the key to remove\n * @returns true if the item was successfully deleted, false if no item with such key exist in the dictionary\n */\n remove(e) {\n return this.contains(e) ? (delete this._data[e], --this._count, !0) : !1;\n }\n /**\n * Clear the whole content of the dictionary\n */\n clear() {\n this._data = {}, this._count = 0;\n }\n /**\n * Gets the current count\n */\n get count() {\n return this._count;\n }\n /**\n * Execute a callback on each key/val of the dictionary.\n * Note that you can remove any element in this dictionary in the callback implementation\n * @param callback the callback to execute on a given key/value pair\n */\n forEach(e) {\n for (const t in this._data) {\n const i = this._data[t];\n e(t, i);\n }\n }\n /**\n * Execute a callback on every occurrence of the dictionary until it returns a valid TRes object.\n * If the callback returns null or undefined the method will iterate to the next key/value pair\n * Note that you can remove any element in this dictionary in the callback implementation\n * @param callback the callback to execute, if it return a valid T instanced object the enumeration will stop and the object will be returned\n * @returns the first item\n */\n first(e) {\n for (const t in this._data) {\n const i = this._data[t], r = e(t, i);\n if (r)\n return r;\n }\n return null;\n }\n}\nclass Sn {\n /**\n * Evaluate a query\n * @param query defines the query to evaluate\n * @param evaluateCallback defines the callback used to filter result\n * @returns true if the query matches\n */\n static Eval(e, t) {\n return e.match(/\\([^()]*\\)/g) ? e = e.replace(/\\([^()]*\\)/g, (i) => (i = i.slice(1, i.length - 1), Sn._HandleParenthesisContent(i, t))) : e = Sn._HandleParenthesisContent(e, t), e === \"true\" ? !0 : e === \"false\" ? !1 : Sn.Eval(e, t);\n }\n static _HandleParenthesisContent(e, t) {\n t = t || ((s) => s === \"true\");\n let i;\n const r = e.split(\"||\");\n for (const s in r)\n if (Object.prototype.hasOwnProperty.call(r, s)) {\n let a = Sn._SimplifyNegation(r[s].trim());\n const o = a.split(\"&&\");\n if (o.length > 1)\n for (let l = 0; l < o.length; ++l) {\n const c = Sn._SimplifyNegation(o[l].trim());\n if (c !== \"true\" && c !== \"false\" ? c[0] === \"!\" ? i = !t(c.substring(1)) : i = t(c) : i = c === \"true\", !i) {\n a = \"false\";\n break;\n }\n }\n if (i || a === \"true\") {\n i = !0;\n break;\n }\n a !== \"true\" && a !== \"false\" ? a[0] === \"!\" ? i = !t(a.substring(1)) : i = t(a) : i = a === \"true\";\n }\n return i ? \"true\" : \"false\";\n }\n static _SimplifyNegation(e) {\n return e = e.replace(/^[\\s!]+/, (t) => (t = t.replace(/[\\s]/g, () => \"\"), t.length % 2 ? \"!\" : \"\")), e = e.trim(), e === \"!true\" ? e = \"false\" : e === \"!false\" && (e = \"true\"), e;\n }\n}\nclass rt {\n /**\n * Adds support for tags on the given object\n * @param obj defines the object to use\n */\n static EnableFor(e) {\n e._tags = e._tags || {}, e.hasTags = () => rt.HasTags(e), e.addTags = (t) => rt.AddTagsTo(e, t), e.removeTags = (t) => rt.RemoveTagsFrom(e, t), e.matchesTagsQuery = (t) => rt.MatchesQuery(e, t);\n }\n /**\n * Removes tags support\n * @param obj defines the object to use\n */\n static DisableFor(e) {\n delete e._tags, delete e.hasTags, delete e.addTags, delete e.removeTags, delete e.matchesTagsQuery;\n }\n /**\n * Gets a boolean indicating if the given object has tags\n * @param obj defines the object to use\n * @returns a boolean\n */\n static HasTags(e) {\n if (!e._tags)\n return !1;\n const t = e._tags;\n for (const i in t)\n if (Object.prototype.hasOwnProperty.call(t, i))\n return !0;\n return !1;\n }\n /**\n * Gets the tags available on a given object\n * @param obj defines the object to use\n * @param asString defines if the tags must be returned as a string instead of an array of strings\n * @returns the tags\n */\n static GetTags(e, t = !0) {\n if (!e._tags)\n return null;\n if (t) {\n const i = [];\n for (const r in e._tags)\n Object.prototype.hasOwnProperty.call(e._tags, r) && e._tags[r] === !0 && i.push(r);\n return i.join(\" \");\n } else\n return e._tags;\n }\n /**\n * Adds tags to an object\n * @param obj defines the object to use\n * @param tagsString defines the tag string. The tags 'true' and 'false' are reserved and cannot be used as tags.\n * A tag cannot start with '||', '&&', and '!'. It cannot contain whitespaces\n */\n static AddTagsTo(e, t) {\n if (!t || typeof t != \"string\")\n return;\n t.split(\" \").forEach(function(r) {\n rt._AddTagTo(e, r);\n });\n }\n /**\n * @internal\n */\n static _AddTagTo(e, t) {\n t = t.trim(), !(t === \"\" || t === \"true\" || t === \"false\") && (t.match(/[\\s]/) || t.match(/^([!]|([|]|[&]){2})/) || (rt.EnableFor(e), e._tags[t] = !0));\n }\n /**\n * Removes specific tags from a specific object\n * @param obj defines the object to use\n * @param tagsString defines the tags to remove\n */\n static RemoveTagsFrom(e, t) {\n if (!rt.HasTags(e))\n return;\n const i = t.split(\" \");\n for (const r in i)\n rt._RemoveTagFrom(e, i[r]);\n }\n /**\n * @internal\n */\n static _RemoveTagFrom(e, t) {\n delete e._tags[t];\n }\n /**\n * Defines if tags hosted on an object match a given query\n * @param obj defines the object to use\n * @param tagsQuery defines the tag query\n * @returns a boolean\n */\n static MatchesQuery(e, t) {\n return t === void 0 ? !0 : t === \"\" ? rt.HasTags(e) : Sn.Eval(t, (i) => rt.HasTags(e) && e._tags[i]);\n }\n}\nconst kl = 1 / 2.2, zl = 2.2, xt = 1e-3;\nclass vi {\n /**\n * Returns an array of the given size filled with elements built from the given constructor and the parameters.\n * @param size the number of element to construct and put in the array.\n * @param itemBuilder a callback responsible for creating new instance of item. Called once per array entry.\n * @returns a new array filled with new objects.\n */\n static BuildArray(e, t) {\n const i = [];\n for (let r = 0; r < e; ++r)\n i.push(t());\n return i;\n }\n /**\n * Returns a tuple of the given size filled with elements built from the given constructor and the parameters.\n * @param size he number of element to construct and put in the tuple.\n * @param itemBuilder a callback responsible for creating new instance of item. Called once per tuple entry.\n * @returns a new tuple filled with new objects.\n */\n static BuildTuple(e, t) {\n return vi.BuildArray(e, t);\n }\n}\nfunction xy(n, e, t) {\n const i = n[e];\n if (typeof i != \"function\")\n return null;\n const r = function() {\n const s = n.length, a = r.previous.apply(n, arguments);\n return t(e, s), a;\n };\n return i.next = r, r.previous = i, n[e] = r, () => {\n const s = r.previous;\n if (!s)\n return;\n const a = r.next;\n a ? (s.next = a, a.previous = s) : (s.next = void 0, n[e] = s), r.next = void 0, r.previous = void 0;\n };\n}\nconst Cy = [\"push\", \"splice\", \"pop\", \"shift\", \"unshift\"];\nfunction z_(n, e) {\n const t = Cy.map((i) => xy(n, i, e));\n return () => {\n t.forEach((i) => {\n i == null || i();\n });\n };\n}\nfunction Ii(n, e, t = 1401298e-51) {\n return Math.abs(n - e) <= t;\n}\nfunction jt(n, e) {\n return n === e ? n : Math.random() * (e - n) + n;\n}\nfunction W_(n, e, t) {\n return n + (e - n) * t;\n}\nfunction ii(n, e = 0, t = 1) {\n return Math.min(t, Math.max(e, n));\n}\nfunction G_(n) {\n return n -= Math.PI * 2 * Math.floor((n + Math.PI) / (Math.PI * 2)), n;\n}\nfunction qr(n) {\n const e = n.toString(16);\n return n <= 15 ? (\"0\" + e).toUpperCase() : e.toUpperCase();\n}\nconst nr = (n) => parseInt(n.toString().replace(/\\W/g, \"\"));\nclass me {\n /**\n * Creates a new Vector2 from the given x and y coordinates\n * @param x defines the first coordinate\n * @param y defines the second coordinate\n */\n constructor(e = 0, t = 0) {\n this.x = e, this.y = t;\n }\n /**\n * Gets a string with the Vector2 coordinates\n * @returns a string with the Vector2 coordinates\n */\n toString() {\n return `{X: ${this.x} Y: ${this.y}}`;\n }\n /**\n * Gets class name\n * @returns the string \"Vector2\"\n */\n getClassName() {\n return \"Vector2\";\n }\n /**\n * Gets current vector hash code\n * @returns the Vector2 hash code as a number\n */\n getHashCode() {\n const e = nr(this.x), t = nr(this.y);\n let i = e;\n return i = i * 397 ^ t, i;\n }\n // Operators\n /**\n * Sets the Vector2 coordinates in the given array or Float32Array from the given index.\n * Example Playground https://playground.babylonjs.com/#QYBWV4#15\n * @param array defines the source array\n * @param index defines the offset in source array\n * @returns the current Vector2\n */\n toArray(e, t = 0) {\n return e[t] = this.x, e[t + 1] = this.y, this;\n }\n /**\n * Update the current vector from an array\n * Example Playground https://playground.babylonjs.com/#QYBWV4#39\n * @param array defines the destination array\n * @param offset defines the offset in the destination array\n * @returns the current Vector2\n */\n fromArray(e, t = 0) {\n return me.FromArrayToRef(e, t, this), this;\n }\n /**\n * Copy the current vector to an array\n * Example Playground https://playground.babylonjs.com/#QYBWV4#40\n * @returns a new array with 2 elements: the Vector2 coordinates.\n */\n asArray() {\n return [this.x, this.y];\n }\n /**\n * Sets the Vector2 coordinates with the given Vector2 coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#24\n * @param source defines the source Vector2\n * @returns the current updated Vector2\n */\n copyFrom(e) {\n return this.x = e.x, this.y = e.y, this;\n }\n /**\n * Sets the Vector2 coordinates with the given floats\n * Example Playground https://playground.babylonjs.com/#QYBWV4#25\n * @param x defines the first coordinate\n * @param y defines the second coordinate\n * @returns the current updated Vector2\n */\n copyFromFloats(e, t) {\n return this.x = e, this.y = t, this;\n }\n /**\n * Sets the Vector2 coordinates with the given floats\n * Example Playground https://playground.babylonjs.com/#QYBWV4#62\n * @param x defines the first coordinate\n * @param y defines the second coordinate\n * @returns the current updated Vector2\n */\n set(e, t) {\n return this.copyFromFloats(e, t);\n }\n /**\n * Copies the given float to the current Vector2 coordinates\n * @param v defines the x and y coordinates of the operand\n * @returns the current updated Vector2\n */\n setAll(e) {\n return this.copyFromFloats(e, e);\n }\n /**\n * Add another vector with the current one\n * Example Playground https://playground.babylonjs.com/#QYBWV4#11\n * @param otherVector defines the other vector\n * @returns a new Vector2 set with the addition of the current Vector2 and the given one coordinates\n */\n add(e) {\n return new this.constructor(this.x + e.x, this.y + e.y);\n }\n /**\n * Sets the \"result\" coordinates with the addition of the current Vector2 and the given one coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#12\n * @param otherVector defines the other vector\n * @param result defines the target vector\n * @returns result input\n */\n addToRef(e, t) {\n return t.x = this.x + e.x, t.y = this.y + e.y, t;\n }\n /**\n * Set the Vector2 coordinates by adding the given Vector2 coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#13\n * @param otherVector defines the other vector\n * @returns the current updated Vector2\n */\n addInPlace(e) {\n return this.x += e.x, this.y += e.y, this;\n }\n /**\n * Adds the given coordinates to the current Vector2\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @returns the current updated Vector2\n */\n addInPlaceFromFloats(e, t) {\n return this.x += e, this.y += t, this;\n }\n /**\n * Gets a new Vector2 by adding the current Vector2 coordinates to the given Vector3 x, y coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#14\n * @param otherVector defines the other vector\n * @returns a new Vector2\n */\n addVector3(e) {\n return new this.constructor(this.x + e.x, this.y + e.y);\n }\n /**\n * Gets a new Vector2 set with the subtracted coordinates of the given one from the current Vector2\n * Example Playground https://playground.babylonjs.com/#QYBWV4#61\n * @param otherVector defines the other vector\n * @returns a new Vector2\n */\n subtract(e) {\n return new this.constructor(this.x - e.x, this.y - e.y);\n }\n /**\n * Sets the \"result\" coordinates with the subtraction of the given one from the current Vector2 coordinates.\n * Example Playground https://playground.babylonjs.com/#QYBWV4#63\n * @param otherVector defines the other vector\n * @param result defines the target vector\n * @returns result input\n */\n subtractToRef(e, t) {\n return t.x = this.x - e.x, t.y = this.y - e.y, t;\n }\n /**\n * Sets the current Vector2 coordinates by subtracting from it the given one coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#88\n * @param otherVector defines the other vector\n * @returns the current updated Vector2\n */\n subtractInPlace(e) {\n return this.x -= e.x, this.y -= e.y, this;\n }\n /**\n * Multiplies in place the current Vector2 coordinates by the given ones\n * Example Playground https://playground.babylonjs.com/#QYBWV4#43\n * @param otherVector defines the other vector\n * @returns the current updated Vector2\n */\n multiplyInPlace(e) {\n return this.x *= e.x, this.y *= e.y, this;\n }\n /**\n * Returns a new Vector2 set with the multiplication of the current Vector2 and the given one coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#42\n * @param otherVector defines the other vector\n * @returns a new Vector2\n */\n multiply(e) {\n return new this.constructor(this.x * e.x, this.y * e.y);\n }\n /**\n * Sets \"result\" coordinates with the multiplication of the current Vector2 and the given one coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#44\n * @param otherVector defines the other vector\n * @param result defines the target vector\n * @returns result input\n */\n multiplyToRef(e, t) {\n return t.x = this.x * e.x, t.y = this.y * e.y, t;\n }\n /**\n * Gets a new Vector2 set with the Vector2 coordinates multiplied by the given floats\n * Example Playground https://playground.babylonjs.com/#QYBWV4#89\n * @param x defines the first coordinate\n * @param y defines the second coordinate\n * @returns a new Vector2\n */\n multiplyByFloats(e, t) {\n return new this.constructor(this.x * e, this.y * t);\n }\n /**\n * Returns a new Vector2 set with the Vector2 coordinates divided by the given one coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#27\n * @param otherVector defines the other vector\n * @returns a new Vector2\n */\n divide(e) {\n return new this.constructor(this.x / e.x, this.y / e.y);\n }\n /**\n * Sets the \"result\" coordinates with the Vector2 divided by the given one coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#30\n * @param otherVector defines the other vector\n * @param result defines the target vector\n * @returns result input\n */\n divideToRef(e, t) {\n return t.x = this.x / e.x, t.y = this.y / e.y, t;\n }\n /**\n * Divides the current Vector2 coordinates by the given ones\n * Example Playground https://playground.babylonjs.com/#QYBWV4#28\n * @param otherVector defines the other vector\n * @returns the current updated Vector2\n */\n divideInPlace(e) {\n return this.x = this.x / e.x, this.y = this.y / e.y, this;\n }\n /**\n * Updates the current Vector2 with the minimal coordinate values between its and the given vector ones\n * @param other defines the second operand\n * @returns the current updated Vector2\n */\n minimizeInPlace(e) {\n return this.minimizeInPlaceFromFloats(e.x, e.y);\n }\n /**\n * Updates the current Vector2 with the maximal coordinate values between its and the given vector ones.\n * @param other defines the second operand\n * @returns the current updated Vector2\n */\n maximizeInPlace(e) {\n return this.maximizeInPlaceFromFloats(e.x, e.y);\n }\n /**\n * Updates the current Vector2 with the minimal coordinate values between its and the given coordinates\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @returns the current updated Vector2\n */\n minimizeInPlaceFromFloats(e, t) {\n return this.x = Math.min(e, this.x), this.y = Math.min(t, this.y), this;\n }\n /**\n * Updates the current Vector2 with the maximal coordinate values between its and the given coordinates.\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @returns the current updated Vector2\n */\n maximizeInPlaceFromFloats(e, t) {\n return this.x = Math.max(e, this.x), this.y = Math.max(t, this.y), this;\n }\n /**\n * Returns a new Vector2 set with the subtraction of the given floats from the current Vector2 coordinates\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @returns the resulting Vector2\n */\n subtractFromFloats(e, t) {\n return new this.constructor(this.x - e, this.y - t);\n }\n /**\n * Subtracts the given floats from the current Vector2 coordinates and set the given vector \"result\" with this result\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param result defines the Vector2 object where to store the result\n * @returns the result\n */\n subtractFromFloatsToRef(e, t, i) {\n return i.copyFromFloats(this.x - e, this.y - t);\n }\n /**\n * Gets a new Vector2 with current Vector2 negated coordinates\n * @returns a new Vector2\n */\n negate() {\n return new this.constructor(-this.x, -this.y);\n }\n /**\n * Negate this vector in place\n * Example Playground https://playground.babylonjs.com/#QYBWV4#23\n * @returns this\n */\n negateInPlace() {\n return this.x *= -1, this.y *= -1, this;\n }\n /**\n * Negate the current Vector2 and stores the result in the given vector \"result\" coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#41\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n negateToRef(e) {\n return e.copyFromFloats(this.x * -1, this.y * -1);\n }\n /**\n * Multiply the Vector2 coordinates by\n * Example Playground https://playground.babylonjs.com/#QYBWV4#59\n * @param scale defines the scaling factor\n * @returns the current updated Vector2\n */\n scaleInPlace(e) {\n return this.x *= e, this.y *= e, this;\n }\n /**\n * Returns a new Vector2 scaled by \"scale\" from the current Vector2\n * Example Playground https://playground.babylonjs.com/#QYBWV4#52\n * @param scale defines the scaling factor\n * @returns a new Vector2\n */\n scale(e) {\n return new this.constructor(this.x * e, this.y * e);\n }\n /**\n * Scale the current Vector2 values by a factor to a given Vector2\n * Example Playground https://playground.babylonjs.com/#QYBWV4#57\n * @param scale defines the scale factor\n * @param result defines the Vector2 object where to store the result\n * @returns result input\n */\n scaleToRef(e, t) {\n return t.x = this.x * e, t.y = this.y * e, t;\n }\n /**\n * Scale the current Vector2 values by a factor and add the result to a given Vector2\n * Example Playground https://playground.babylonjs.com/#QYBWV4#58\n * @param scale defines the scale factor\n * @param result defines the Vector2 object where to store the result\n * @returns result input\n */\n scaleAndAddToRef(e, t) {\n return t.x += this.x * e, t.y += this.y * e, t;\n }\n /**\n * Gets a boolean if two vectors are equals\n * Example Playground https://playground.babylonjs.com/#QYBWV4#31\n * @param otherVector defines the other vector\n * @returns true if the given vector coordinates strictly equal the current Vector2 ones\n */\n equals(e) {\n return e && this.x === e.x && this.y === e.y;\n }\n /**\n * Gets a boolean if two vectors are equals (using an epsilon value)\n * Example Playground https://playground.babylonjs.com/#QYBWV4#32\n * @param otherVector defines the other vector\n * @param epsilon defines the minimal distance to consider equality\n * @returns true if the given vector coordinates are close to the current ones by a distance of epsilon.\n */\n equalsWithEpsilon(e, t = xt) {\n return e && Ii(this.x, e.x, t) && Ii(this.y, e.y, t);\n }\n /**\n * Returns true if the current Vector2 coordinates equals the given floats\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @returns true if both vectors are equal\n */\n equalsToFloats(e, t) {\n return this.x === e && this.y === t;\n }\n /**\n * Gets a new Vector2 from current Vector2 floored values\n * Example Playground https://playground.babylonjs.com/#QYBWV4#35\n * eg (1.2, 2.31) returns (1, 2)\n * @returns a new Vector2\n */\n floor() {\n return new this.constructor(Math.floor(this.x), Math.floor(this.y));\n }\n /**\n * Gets the current Vector2's floored values and stores them in result\n * @param result the Vector2 to store the result in\n * @returns the result Vector2\n */\n floorToRef(e) {\n return e.x = Math.floor(this.x), e.y = Math.floor(this.y), e;\n }\n /**\n * Gets a new Vector2 from current Vector2 fractional values\n * Example Playground https://playground.babylonjs.com/#QYBWV4#34\n * eg (1.2, 2.31) returns (0.2, 0.31)\n * @returns a new Vector2\n */\n fract() {\n return new this.constructor(this.x - Math.floor(this.x), this.y - Math.floor(this.y));\n }\n /**\n * Gets the current Vector2's fractional values and stores them in result\n * @param result the Vector2 to store the result in\n * @returns the result Vector2\n */\n fractToRef(e) {\n return e.x = this.x - Math.floor(this.x), e.y = this.y - Math.floor(this.y), e;\n }\n /**\n * Rotate the current vector into a given result vector\n * Example Playground https://playground.babylonjs.com/#QYBWV4#49\n * @param angle defines the rotation angle\n * @param result defines the result vector where to store the rotated vector\n * @returns result input\n */\n rotateToRef(e, t) {\n const i = Math.cos(e), r = Math.sin(e), s = i * this.x - r * this.y, a = r * this.x + i * this.y;\n return t.x = s, t.y = a, t;\n }\n // Properties\n /**\n * Gets the length of the vector\n * @returns the vector length (float)\n */\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n /**\n * Gets the vector squared length\n * @returns the vector squared length (float)\n */\n lengthSquared() {\n return this.x * this.x + this.y * this.y;\n }\n // Methods\n /**\n * Normalize the vector\n * Example Playground https://playground.babylonjs.com/#QYBWV4#48\n * @returns the current updated Vector2\n */\n normalize() {\n return this.normalizeFromLength(this.length());\n }\n /**\n * Normalize the current Vector2 with the given input length.\n * Please note that this is an in place operation.\n * @param len the length of the vector\n * @returns the current updated Vector2\n */\n normalizeFromLength(e) {\n return e === 0 || e === 1 ? this : this.scaleInPlace(1 / e);\n }\n /**\n * Normalize the current Vector2 to a new vector\n * @returns the new Vector2\n */\n normalizeToNew() {\n const e = new this.constructor();\n return this.normalizeToRef(e), e;\n }\n /**\n * Normalize the current Vector2 to the reference\n * @param reference define the Vector to update\n * @returns the updated Vector2\n */\n normalizeToRef(e) {\n const t = this.length();\n return t === 0 ? e.copyFrom(this) : this.scaleToRef(1 / t, e);\n }\n /**\n * Gets a new Vector2 copied from the Vector2\n * Example Playground https://playground.babylonjs.com/#QYBWV4#20\n * @returns a new Vector2\n */\n clone() {\n return new this.constructor(this.x, this.y);\n }\n /**\n * Gets the dot product of the current vector and the vector \"otherVector\"\n * @param otherVector defines second vector\n * @returns the dot product (float)\n */\n dot(e) {\n return this.x * e.x + this.y * e.y;\n }\n // Statics\n /**\n * Gets a new Vector2(0, 0)\n * @returns a new Vector2\n */\n static Zero() {\n return new me(0, 0);\n }\n /**\n * Gets a new Vector2(1, 1)\n * @returns a new Vector2\n */\n static One() {\n return new me(1, 1);\n }\n /**\n * Returns a new Vector2 with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @returns a Vector2 with random values between min and max\n */\n static Random(e = 0, t = 1) {\n return new me(jt(e, t), jt(e, t));\n }\n /**\n * Sets a Vector2 with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @param ref the ref to store the values in\n * @returns the ref with random values between min and max\n */\n static RandomToRef(e = 0, t = 1, i) {\n return i.copyFromFloats(jt(e, t), jt(e, t));\n }\n /**\n * Gets a zero Vector2 that must not be updated\n */\n static get ZeroReadOnly() {\n return me._ZeroReadOnly;\n }\n /**\n * Gets a new Vector2 set from the given index element of the given array\n * Example Playground https://playground.babylonjs.com/#QYBWV4#79\n * @param array defines the data source\n * @param offset defines the offset in the data source\n * @returns a new Vector2\n */\n static FromArray(e, t = 0) {\n return new me(e[t], e[t + 1]);\n }\n /**\n * Sets \"result\" from the given index element of the given array\n * Example Playground https://playground.babylonjs.com/#QYBWV4#80\n * @param array defines the data source\n * @param offset defines the offset in the data source\n * @param result defines the target vector\n * @returns result input\n */\n static FromArrayToRef(e, t, i) {\n return i.x = e[t], i.y = e[t + 1], i;\n }\n /**\n * Sets the given vector \"result\" with the given floats.\n * @param x defines the x coordinate of the source\n * @param y defines the y coordinate of the source\n * @param result defines the Vector2 where to store the result\n * @returns the result vector\n */\n static FromFloatsToRef(e, t, i) {\n return i.copyFromFloats(e, t), i;\n }\n /**\n * Gets a new Vector2 located for \"amount\" (float) on the CatmullRom spline defined by the given four Vector2\n * Example Playground https://playground.babylonjs.com/#QYBWV4#65\n * @param value1 defines 1st point of control\n * @param value2 defines 2nd point of control\n * @param value3 defines 3rd point of control\n * @param value4 defines 4th point of control\n * @param amount defines the interpolation factor\n * @returns a new Vector2\n */\n static CatmullRom(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 0.5 * (2 * t.x + (-e.x + i.x) * s + (2 * e.x - 5 * t.x + 4 * i.x - r.x) * a + (-e.x + 3 * t.x - 3 * i.x + r.x) * o), c = 0.5 * (2 * t.y + (-e.y + i.y) * s + (2 * e.y - 5 * t.y + 4 * i.y - r.y) * a + (-e.y + 3 * t.y - 3 * i.y + r.y) * o);\n return new e.constructor(l, c);\n }\n /**\n * Sets reference with same the coordinates than \"value\" ones if the vector \"value\" is in the square defined by \"min\" and \"max\".\n * If a coordinate of \"value\" is lower than \"min\" coordinates, the returned Vector2 is given this \"min\" coordinate.\n * If a coordinate of \"value\" is greater than \"max\" coordinates, the returned Vector2 is given this \"max\" coordinate\n * @param value defines the value to clamp\n * @param min defines the lower limit\n * @param max defines the upper limit\n * @param ref the reference\n * @returns the reference\n */\n static ClampToRef(e, t, i, r) {\n return r.x = ii(e.x, t.x, i.x), r.y = ii(e.y, t.y, i.y), r;\n }\n /**\n * Returns a new Vector2 set with same the coordinates than \"value\" ones if the vector \"value\" is in the square defined by \"min\" and \"max\".\n * If a coordinate of \"value\" is lower than \"min\" coordinates, the returned Vector2 is given this \"min\" coordinate.\n * If a coordinate of \"value\" is greater than \"max\" coordinates, the returned Vector2 is given this \"max\" coordinate\n * Example Playground https://playground.babylonjs.com/#QYBWV4#76\n * @param value defines the value to clamp\n * @param min defines the lower limit\n * @param max defines the upper limit\n * @returns a new Vector2\n */\n static Clamp(e, t, i) {\n const r = ii(e.x, t.x, i.x), s = ii(e.y, t.y, i.y);\n return new e.constructor(r, s);\n }\n /**\n * Returns a new Vector2 located for \"amount\" (float) on the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\"\n * Example Playground https://playground.babylonjs.com/#QYBWV4#81\n * @param value1 defines the 1st control point\n * @param tangent1 defines the outgoing tangent\n * @param value2 defines the 2nd control point\n * @param tangent2 defines the incoming tangent\n * @param amount defines the interpolation factor\n * @returns a new Vector2\n */\n static Hermite(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 2 * o - 3 * a + 1, c = -2 * o + 3 * a, h = o - 2 * a + s, u = o - a, f = e.x * l + i.x * c + t.x * h + r.x * u, d = e.y * l + i.y * c + t.y * h + r.y * u;\n return new e.constructor(f, d);\n }\n /**\n * Returns a new Vector2 which is the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * Example Playground https://playground.babylonjs.com/#QYBWV4#82\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @returns 1st derivative\n */\n static Hermite1stDerivative(e, t, i, r, s) {\n const a = new e.constructor();\n return this.Hermite1stDerivativeToRef(e, t, i, r, s, a), a;\n }\n /**\n * Returns a new Vector2 which is the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * Example Playground https://playground.babylonjs.com/#QYBWV4#83\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @param result define where the derivative will be stored\n * @returns result input\n */\n static Hermite1stDerivativeToRef(e, t, i, r, s, a) {\n const o = s * s;\n return a.x = (o - s) * 6 * e.x + (3 * o - 4 * s + 1) * t.x + (-o + s) * 6 * i.x + (3 * o - 2 * s) * r.x, a.y = (o - s) * 6 * e.y + (3 * o - 4 * s + 1) * t.y + (-o + s) * 6 * i.y + (3 * o - 2 * s) * r.y, a;\n }\n /**\n * Returns a new Vector2 located for \"amount\" (float) on the linear interpolation between the vector \"start\" adn the vector \"end\".\n * Example Playground https://playground.babylonjs.com/#QYBWV4#84\n * @param start defines the start vector\n * @param end defines the end vector\n * @param amount defines the interpolation factor\n * @returns a new Vector2\n */\n static Lerp(e, t, i) {\n const r = e.x + (t.x - e.x) * i, s = e.y + (t.y - e.y) * i;\n return new e.constructor(r, s);\n }\n /**\n * Gets the dot product of the vector \"left\" and the vector \"right\"\n * Example Playground https://playground.babylonjs.com/#QYBWV4#90\n * @param left defines first vector\n * @param right defines second vector\n * @returns the dot product (float)\n */\n static Dot(e, t) {\n return e.x * t.x + e.y * t.y;\n }\n /**\n * Returns a new Vector2 equal to the normalized given vector\n * Example Playground https://playground.babylonjs.com/#QYBWV4#46\n * @param vector defines the vector to normalize\n * @returns a new Vector2\n */\n static Normalize(e) {\n const t = new e.constructor();\n return me.NormalizeToRef(e, t), t;\n }\n /**\n * Normalize a given vector into a second one\n * Example Playground https://playground.babylonjs.com/#QYBWV4#50\n * @param vector defines the vector to normalize\n * @param result defines the vector where to store the result\n * @returns result input\n */\n static NormalizeToRef(e, t) {\n return e.normalizeToRef(t), t;\n }\n /**\n * Gets a new Vector2 set with the minimal coordinate values from the \"left\" and \"right\" vectors\n * Example Playground https://playground.babylonjs.com/#QYBWV4#86\n * @param left defines 1st vector\n * @param right defines 2nd vector\n * @returns a new Vector2\n */\n static Minimize(e, t) {\n const i = e.x < t.x ? e.x : t.x, r = e.y < t.y ? e.y : t.y;\n return new e.constructor(i, r);\n }\n /**\n * Gets a new Vector2 set with the maximal coordinate values from the \"left\" and \"right\" vectors\n * Example Playground https://playground.babylonjs.com/#QYBWV4#86\n * @param left defines 1st vector\n * @param right defines 2nd vector\n * @returns a new Vector2\n */\n static Maximize(e, t) {\n const i = e.x > t.x ? e.x : t.x, r = e.y > t.y ? e.y : t.y;\n return new e.constructor(i, r);\n }\n /**\n * Gets a new Vector2 set with the transformed coordinates of the given vector by the given transformation matrix\n * Example Playground https://playground.babylonjs.com/#QYBWV4#17\n * @param vector defines the vector to transform\n * @param transformation defines the matrix to apply\n * @returns a new Vector2\n */\n static Transform(e, t) {\n const i = new e.constructor();\n return me.TransformToRef(e, t, i), i;\n }\n /**\n * Transforms the given vector coordinates by the given transformation matrix and stores the result in the vector \"result\" coordinates\n * Example Playground https://playground.babylonjs.com/#QYBWV4#19\n * @param vector defines the vector to transform\n * @param transformation defines the matrix to apply\n * @param result defines the target vector\n * @returns result input\n */\n static TransformToRef(e, t, i) {\n const r = t.m, s = e.x * r[0] + e.y * r[4] + r[12], a = e.x * r[1] + e.y * r[5] + r[13];\n return i.x = s, i.y = a, i;\n }\n /**\n * Determines if a given vector is included in a triangle\n * Example Playground https://playground.babylonjs.com/#QYBWV4#87\n * @param p defines the vector to test\n * @param p0 defines 1st triangle point\n * @param p1 defines 2nd triangle point\n * @param p2 defines 3rd triangle point\n * @returns true if the point \"p\" is in the triangle defined by the vectors \"p0\", \"p1\", \"p2\"\n */\n static PointInTriangle(e, t, i, r) {\n const s = 0.5 * (-i.y * r.x + t.y * (-i.x + r.x) + t.x * (i.y - r.y) + i.x * r.y), a = s < 0 ? -1 : 1, o = (t.y * r.x - t.x * r.y + (r.y - t.y) * e.x + (t.x - r.x) * e.y) * a, l = (t.x * i.y - t.y * i.x + (t.y - i.y) * e.x + (i.x - t.x) * e.y) * a;\n return o > 0 && l > 0 && o + l < 2 * s * a;\n }\n /**\n * Gets the distance between the vectors \"value1\" and \"value2\"\n * Example Playground https://playground.babylonjs.com/#QYBWV4#71\n * @param value1 defines first vector\n * @param value2 defines second vector\n * @returns the distance between vectors\n */\n static Distance(e, t) {\n return Math.sqrt(me.DistanceSquared(e, t));\n }\n /**\n * Returns the squared distance between the vectors \"value1\" and \"value2\"\n * Example Playground https://playground.babylonjs.com/#QYBWV4#72\n * @param value1 defines first vector\n * @param value2 defines second vector\n * @returns the squared distance between vectors\n */\n static DistanceSquared(e, t) {\n const i = e.x - t.x, r = e.y - t.y;\n return i * i + r * r;\n }\n /**\n * Gets a new Vector2 located at the center of the vectors \"value1\" and \"value2\"\n * Example Playground https://playground.babylonjs.com/#QYBWV4#86\n * Example Playground https://playground.babylonjs.com/#QYBWV4#66\n * @param value1 defines first vector\n * @param value2 defines second vector\n * @returns a new Vector2\n */\n static Center(e, t) {\n const i = new e.constructor();\n return me.CenterToRef(e, t, i);\n }\n /**\n * Gets the center of the vectors \"value1\" and \"value2\" and stores the result in the vector \"ref\"\n * Example Playground https://playground.babylonjs.com/#QYBWV4#66\n * @param value1 defines first vector\n * @param value2 defines second vector\n * @param ref defines third vector\n * @returns ref\n */\n static CenterToRef(e, t, i) {\n return i.copyFromFloats((e.x + t.x) / 2, (e.y + t.y) / 2);\n }\n /**\n * Gets the shortest distance (float) between the point \"p\" and the segment defined by the two points \"segA\" and \"segB\".\n * Example Playground https://playground.babylonjs.com/#QYBWV4#77\n * @param p defines the middle point\n * @param segA defines one point of the segment\n * @param segB defines the other point of the segment\n * @returns the shortest distance\n */\n static DistanceOfPointFromSegment(e, t, i) {\n const r = me.DistanceSquared(t, i);\n if (r === 0)\n return me.Distance(e, t);\n const s = i.subtract(t), a = Math.max(0, Math.min(1, me.Dot(e.subtract(t), s) / r)), o = t.add(s.multiplyByFloats(a, a));\n return me.Distance(e, o);\n }\n}\nme._ZeroReadOnly = me.Zero();\nObject.defineProperties(me.prototype, {\n dimension: { value: [2] },\n rank: { value: 1 }\n});\nclass _ {\n /** Gets or sets the x coordinate */\n get x() {\n return this._x;\n }\n set x(e) {\n this._x = e, this._isDirty = !0;\n }\n /** Gets or sets the y coordinate */\n get y() {\n return this._y;\n }\n set y(e) {\n this._y = e, this._isDirty = !0;\n }\n /** Gets or sets the z coordinate */\n get z() {\n return this._z;\n }\n set z(e) {\n this._z = e, this._isDirty = !0;\n }\n /**\n * Creates a new Vector3 object from the given x, y, z (floats) coordinates.\n * @param x defines the first coordinates (on X axis)\n * @param y defines the second coordinates (on Y axis)\n * @param z defines the third coordinates (on Z axis)\n */\n constructor(e = 0, t = 0, i = 0) {\n this._isDirty = !0, this._x = e, this._y = t, this._z = i;\n }\n /**\n * Creates a string representation of the Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#67\n * @returns a string with the Vector3 coordinates.\n */\n toString() {\n return `{X: ${this._x} Y: ${this._y} Z: ${this._z}}`;\n }\n /**\n * Gets the class name\n * @returns the string \"Vector3\"\n */\n getClassName() {\n return \"Vector3\";\n }\n /**\n * Creates the Vector3 hash code\n * @returns a number which tends to be unique between Vector3 instances\n */\n getHashCode() {\n const e = nr(this._x), t = nr(this._y), i = nr(this._z);\n let r = e;\n return r = r * 397 ^ t, r = r * 397 ^ i, r;\n }\n // Operators\n /**\n * Creates an array containing three elements : the coordinates of the Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#10\n * @returns a new array of numbers\n */\n asArray() {\n return [this._x, this._y, this._z];\n }\n /**\n * Populates the given array or Float32Array from the given index with the successive coordinates of the Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#65\n * @param array defines the destination array\n * @param index defines the offset in the destination array\n * @returns the current Vector3\n */\n toArray(e, t = 0) {\n return e[t] = this._x, e[t + 1] = this._y, e[t + 2] = this._z, this;\n }\n /**\n * Update the current vector from an array\n * Example Playground https://playground.babylonjs.com/#R1F8YU#24\n * @param array defines the destination array\n * @param offset defines the offset in the destination array\n * @returns the current Vector3\n */\n fromArray(e, t = 0) {\n return _.FromArrayToRef(e, t, this), this;\n }\n /**\n * Converts the current Vector3 into a quaternion (considering that the Vector3 contains Euler angles representation of a rotation)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#66\n * @returns a new Quaternion object, computed from the Vector3 coordinates\n */\n toQuaternion() {\n return Ce.RotationYawPitchRoll(this._y, this._x, this._z);\n }\n /**\n * Adds the given vector to the current Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#4\n * @param otherVector defines the second operand\n * @returns the current updated Vector3\n */\n addInPlace(e) {\n return this._x += e._x, this._y += e._y, this._z += e._z, this._isDirty = !0, this;\n }\n /**\n * Adds the given coordinates to the current Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#5\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the current updated Vector3\n */\n addInPlaceFromFloats(e, t, i) {\n return this._x += e, this._y += t, this._z += i, this._isDirty = !0, this;\n }\n /**\n * Gets a new Vector3, result of the addition the current Vector3 and the given vector\n * Example Playground https://playground.babylonjs.com/#R1F8YU#3\n * @param otherVector defines the second operand\n * @returns the resulting Vector3\n */\n add(e) {\n return new this.constructor(this._x + e._x, this._y + e._y, this._z + e._z);\n }\n /**\n * Adds the current Vector3 to the given one and stores the result in the vector \"result\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#6\n * @param otherVector defines the second operand\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n addToRef(e, t) {\n return t.copyFromFloats(this._x + e._x, this._y + e._y, this._z + e._z);\n }\n /**\n * Subtract the given vector from the current Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#61\n * @param otherVector defines the second operand\n * @returns the current updated Vector3\n */\n subtractInPlace(e) {\n return this._x -= e._x, this._y -= e._y, this._z -= e._z, this._isDirty = !0, this;\n }\n /**\n * Returns a new Vector3, result of the subtraction of the given vector from the current Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#60\n * @param otherVector defines the second operand\n * @returns the resulting Vector3\n */\n subtract(e) {\n return new this.constructor(this._x - e._x, this._y - e._y, this._z - e._z);\n }\n /**\n * Subtracts the given vector from the current Vector3 and stores the result in the vector \"result\".\n * Example Playground https://playground.babylonjs.com/#R1F8YU#63\n * @param otherVector defines the second operand\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n subtractToRef(e, t) {\n return this.subtractFromFloatsToRef(e._x, e._y, e._z, t);\n }\n /**\n * Returns a new Vector3 set with the subtraction of the given floats from the current Vector3 coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#62\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the resulting Vector3\n */\n subtractFromFloats(e, t, i) {\n return new this.constructor(this._x - e, this._y - t, this._z - i);\n }\n /**\n * Subtracts the given floats from the current Vector3 coordinates and set the given vector \"result\" with this result\n * Example Playground https://playground.babylonjs.com/#R1F8YU#64\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n subtractFromFloatsToRef(e, t, i, r) {\n return r.copyFromFloats(this._x - e, this._y - t, this._z - i);\n }\n /**\n * Gets a new Vector3 set with the current Vector3 negated coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#35\n * @returns a new Vector3\n */\n negate() {\n return new this.constructor(-this._x, -this._y, -this._z);\n }\n /**\n * Negate this vector in place\n * Example Playground https://playground.babylonjs.com/#R1F8YU#36\n * @returns this\n */\n negateInPlace() {\n return this._x *= -1, this._y *= -1, this._z *= -1, this._isDirty = !0, this;\n }\n /**\n * Negate the current Vector3 and stores the result in the given vector \"result\" coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#37\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n negateToRef(e) {\n return e.copyFromFloats(this._x * -1, this._y * -1, this._z * -1);\n }\n /**\n * Multiplies the Vector3 coordinates by the float \"scale\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#56\n * @param scale defines the multiplier factor\n * @returns the current updated Vector3\n */\n scaleInPlace(e) {\n return this._x *= e, this._y *= e, this._z *= e, this._isDirty = !0, this;\n }\n /**\n * Returns a new Vector3 set with the current Vector3 coordinates multiplied by the float \"scale\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#53\n * @param scale defines the multiplier factor\n * @returns a new Vector3\n */\n scale(e) {\n return new this.constructor(this._x * e, this._y * e, this._z * e);\n }\n /**\n * Multiplies the current Vector3 coordinates by the float \"scale\" and stores the result in the given vector \"result\" coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#57\n * @param scale defines the multiplier factor\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n scaleToRef(e, t) {\n return t.copyFromFloats(this._x * e, this._y * e, this._z * e);\n }\n /**\n * Creates a vector normal (perpendicular) to the current Vector3 and stores the result in the given vector\n * Out of the infinite possibilities the normal chosen is the one formed by rotating the current vector\n * 90 degrees about an axis which lies perpendicular to the current vector\n * and its projection on the xz plane. In the case of a current vector in the xz plane\n * the normal is calculated to be along the y axis.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#230\n * Example Playground https://playground.babylonjs.com/#R1F8YU#231\n * @param result defines the Vector3 object where to store the resultant normal\n * @returns the result\n */\n getNormalToRef(e) {\n const t = this.length();\n let i = Math.acos(this.y / t);\n const r = Math.atan2(this.z, this.x);\n i > Math.PI / 2 ? i -= Math.PI / 2 : i += Math.PI / 2;\n const s = t * Math.sin(i) * Math.cos(r), a = t * Math.cos(i), o = t * Math.sin(i) * Math.sin(r);\n return e.set(s, a, o), e;\n }\n /**\n * Rotates the vector using the given unit quaternion and stores the new vector in result\n * Example Playground https://playground.babylonjs.com/#R1F8YU#9\n * @param q the unit quaternion representing the rotation\n * @param result the output vector\n * @returns the result\n */\n applyRotationQuaternionToRef(e, t) {\n const i = this._x, r = this._y, s = this._z, a = e._x, o = e._y, l = e._z, c = e._w, h = 2 * (o * s - l * r), u = 2 * (l * i - a * s), f = 2 * (a * r - o * i);\n return t._x = i + c * h + o * f - l * u, t._y = r + c * u + l * h - a * f, t._z = s + c * f + a * u - o * h, t._isDirty = !0, t;\n }\n /**\n * Rotates the vector in place using the given unit quaternion\n * Example Playground https://playground.babylonjs.com/#R1F8YU#8\n * @param q the unit quaternion representing the rotation\n * @returns the current updated Vector3\n */\n applyRotationQuaternionInPlace(e) {\n return this.applyRotationQuaternionToRef(e, this);\n }\n /**\n * Rotates the vector using the given unit quaternion and returns the new vector\n * Example Playground https://playground.babylonjs.com/#R1F8YU#7\n * @param q the unit quaternion representing the rotation\n * @returns a new Vector3\n */\n applyRotationQuaternion(e) {\n return this.applyRotationQuaternionToRef(e, new this.constructor());\n }\n /**\n * Scale the current Vector3 values by a factor and add the result to a given Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#55\n * @param scale defines the scale factor\n * @param result defines the Vector3 object where to store the result\n * @returns result input\n */\n scaleAndAddToRef(e, t) {\n return t.addInPlaceFromFloats(this._x * e, this._y * e, this._z * e);\n }\n /**\n * Projects the current point Vector3 to a plane along a ray starting from a specified origin and passing through the current point Vector3.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#48\n * @param plane defines the plane to project to\n * @param origin defines the origin of the projection ray\n * @returns the projected vector3\n */\n projectOnPlane(e, t) {\n const i = new this.constructor();\n return this.projectOnPlaneToRef(e, t, i), i;\n }\n /**\n * Projects the current point Vector3 to a plane along a ray starting from a specified origin and passing through the current point Vector3.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#49\n * @param plane defines the plane to project to\n * @param origin defines the origin of the projection ray\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n projectOnPlaneToRef(e, t, i) {\n const r = e.normal, s = e.d, a = be.Vector3[0];\n this.subtractToRef(t, a), a.normalize();\n const o = _.Dot(a, r);\n if (Math.abs(o) < 1e-10)\n i.setAll(1 / 0);\n else {\n const l = -(_.Dot(t, r) + s) / o, c = a.scaleInPlace(l);\n t.addToRef(c, i);\n }\n return i;\n }\n /**\n * Returns true if the current Vector3 and the given vector coordinates are strictly equal\n * Example Playground https://playground.babylonjs.com/#R1F8YU#19\n * @param otherVector defines the second operand\n * @returns true if both vectors are equals\n */\n equals(e) {\n return e && this._x === e._x && this._y === e._y && this._z === e._z;\n }\n /**\n * Returns true if the current Vector3 and the given vector coordinates are distant less than epsilon\n * Example Playground https://playground.babylonjs.com/#R1F8YU#21\n * @param otherVector defines the second operand\n * @param epsilon defines the minimal distance to define values as equals\n * @returns true if both vectors are distant less than epsilon\n */\n equalsWithEpsilon(e, t = xt) {\n return e && Ii(this._x, e._x, t) && Ii(this._y, e._y, t) && Ii(this._z, e._z, t);\n }\n /**\n * Returns true if the current Vector3 coordinates equals the given floats\n * Example Playground https://playground.babylonjs.com/#R1F8YU#20\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns true if both vectors are equal\n */\n equalsToFloats(e, t, i) {\n return this._x === e && this._y === t && this._z === i;\n }\n /**\n * Multiplies the current Vector3 coordinates by the given ones\n * Example Playground https://playground.babylonjs.com/#R1F8YU#32\n * @param otherVector defines the second operand\n * @returns the current updated Vector3\n */\n multiplyInPlace(e) {\n return this._x *= e._x, this._y *= e._y, this._z *= e._z, this._isDirty = !0, this;\n }\n /**\n * Returns a new Vector3, result of the multiplication of the current Vector3 by the given vector\n * Example Playground https://playground.babylonjs.com/#R1F8YU#31\n * @param otherVector defines the second operand\n * @returns the new Vector3\n */\n multiply(e) {\n return this.multiplyByFloats(e._x, e._y, e._z);\n }\n /**\n * Multiplies the current Vector3 by the given one and stores the result in the given vector \"result\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#33\n * @param otherVector defines the second operand\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n multiplyToRef(e, t) {\n return t.copyFromFloats(this._x * e._x, this._y * e._y, this._z * e._z);\n }\n /**\n * Returns a new Vector3 set with the result of the multiplication of the current Vector3 coordinates by the given floats\n * Example Playground https://playground.babylonjs.com/#R1F8YU#34\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the new Vector3\n */\n multiplyByFloats(e, t, i) {\n return new this.constructor(this._x * e, this._y * t, this._z * i);\n }\n /**\n * Returns a new Vector3 set with the result of the division of the current Vector3 coordinates by the given ones\n * Example Playground https://playground.babylonjs.com/#R1F8YU#16\n * @param otherVector defines the second operand\n * @returns the new Vector3\n */\n divide(e) {\n return new this.constructor(this._x / e._x, this._y / e._y, this._z / e._z);\n }\n /**\n * Divides the current Vector3 coordinates by the given ones and stores the result in the given vector \"result\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#18\n * @param otherVector defines the second operand\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n divideToRef(e, t) {\n return t.copyFromFloats(this._x / e._x, this._y / e._y, this._z / e._z);\n }\n /**\n * Divides the current Vector3 coordinates by the given ones.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#17\n * @param otherVector defines the second operand\n * @returns the current updated Vector3\n */\n divideInPlace(e) {\n return this._x = this._x / e._x, this._y = this._y / e._y, this._z = this._z / e._z, this._isDirty = !0, this;\n }\n /**\n * Updates the current Vector3 with the minimal coordinate values between its and the given vector ones\n * Example Playground https://playground.babylonjs.com/#R1F8YU#29\n * @param other defines the second operand\n * @returns the current updated Vector3\n */\n minimizeInPlace(e) {\n return this.minimizeInPlaceFromFloats(e._x, e._y, e._z);\n }\n /**\n * Updates the current Vector3 with the maximal coordinate values between its and the given vector ones.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#27\n * @param other defines the second operand\n * @returns the current updated Vector3\n */\n maximizeInPlace(e) {\n return this.maximizeInPlaceFromFloats(e._x, e._y, e._z);\n }\n /**\n * Updates the current Vector3 with the minimal coordinate values between its and the given coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#30\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the current updated Vector3\n */\n minimizeInPlaceFromFloats(e, t, i) {\n return e < this._x && (this.x = e), t < this._y && (this.y = t), i < this._z && (this.z = i), this;\n }\n /**\n * Updates the current Vector3 with the maximal coordinate values between its and the given coordinates.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#28\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the current updated Vector3\n */\n maximizeInPlaceFromFloats(e, t, i) {\n return e > this._x && (this.x = e), t > this._y && (this.y = t), i > this._z && (this.z = i), this;\n }\n /**\n * Due to float precision, scale of a mesh could be uniform but float values are off by a small fraction\n * Check if is non uniform within a certain amount of decimal places to account for this\n * @param epsilon the amount the values can differ\n * @returns if the vector is non uniform to a certain number of decimal places\n */\n isNonUniformWithinEpsilon(e) {\n const t = Math.abs(this._x), i = Math.abs(this._y);\n if (!Ii(t, i, e))\n return !0;\n const r = Math.abs(this._z);\n return !Ii(t, r, e) || !Ii(i, r, e);\n }\n /**\n * Gets a boolean indicating that the vector is non uniform meaning x, y or z are not all the same\n */\n get isNonUniform() {\n const e = Math.abs(this._x), t = Math.abs(this._y);\n if (e !== t)\n return !0;\n const i = Math.abs(this._z);\n return e !== i;\n }\n /**\n * Gets the current Vector3's floored values and stores them in result\n * @param result the vector to store the result in\n * @returns the result vector\n */\n floorToRef(e) {\n return e._x = Math.floor(this._x), e._y = Math.floor(this._y), e._z = Math.floor(this._z), e._isDirty = !0, e;\n }\n /**\n * Gets a new Vector3 from current Vector3 floored values\n * Example Playground https://playground.babylonjs.com/#R1F8YU#22\n * @returns a new Vector3\n */\n floor() {\n return new this.constructor(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z));\n }\n /**\n * Gets the current Vector3's fractional values and stores them in result\n * @param result the vector to store the result in\n * @returns the result vector\n */\n fractToRef(e) {\n return e._x = this.x - Math.floor(this._x), e._y = this.y - Math.floor(this._y), e._z = this.z - Math.floor(this._z), e._isDirty = !0, e;\n }\n /**\n * Gets a new Vector3 from current Vector3 fractional values\n * Example Playground https://playground.babylonjs.com/#R1F8YU#23\n * @returns a new Vector3\n */\n fract() {\n return new this.constructor(this.x - Math.floor(this._x), this.y - Math.floor(this._y), this.z - Math.floor(this._z));\n }\n // Properties\n /**\n * Gets the length of the Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#25\n * @returns the length of the Vector3\n */\n length() {\n return Math.sqrt(this.lengthSquared());\n }\n /**\n * Gets the squared length of the Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#26\n * @returns squared length of the Vector3\n */\n lengthSquared() {\n return this._x * this._x + this._y * this._y + this._z * this._z;\n }\n /**\n * Gets a boolean indicating if the vector contains a zero in one of its components\n * Example Playground https://playground.babylonjs.com/#R1F8YU#1\n */\n get hasAZeroComponent() {\n return this._x * this._y * this._z === 0;\n }\n /**\n * Normalize the current Vector3.\n * Please note that this is an in place operation.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#122\n * @returns the current updated Vector3\n */\n normalize() {\n return this.normalizeFromLength(this.length());\n }\n /**\n * Reorders the x y z properties of the vector in place\n * Example Playground https://playground.babylonjs.com/#R1F8YU#44\n * @param order new ordering of the properties (eg. for vector 1,2,3 with \"ZYX\" will produce 3,2,1)\n * @returns the current updated vector\n */\n reorderInPlace(e) {\n if (e = e.toLowerCase(), e === \"xyz\")\n return this;\n const t = be.Vector3[0].copyFrom(this);\n return this.x = t[e[0]], this.y = t[e[1]], this.z = t[e[2]], this;\n }\n /**\n * Rotates the vector around 0,0,0 by a quaternion\n * Example Playground https://playground.babylonjs.com/#R1F8YU#47\n * @param quaternion the rotation quaternion\n * @param result vector to store the result\n * @returns the resulting vector\n */\n rotateByQuaternionToRef(e, t) {\n return e.toRotationMatrix(be.Matrix[0]), _.TransformCoordinatesToRef(this, be.Matrix[0], t), t;\n }\n /**\n * Rotates a vector around a given point\n * Example Playground https://playground.babylonjs.com/#R1F8YU#46\n * @param quaternion the rotation quaternion\n * @param point the point to rotate around\n * @param result vector to store the result\n * @returns the resulting vector\n */\n rotateByQuaternionAroundPointToRef(e, t, i) {\n return this.subtractToRef(t, be.Vector3[0]), be.Vector3[0].rotateByQuaternionToRef(e, be.Vector3[0]), t.addToRef(be.Vector3[0], i), i;\n }\n /**\n * Returns a new Vector3 as the cross product of the current vector and the \"other\" one\n * The cross product is then orthogonal to both current and \"other\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#14\n * @param other defines the right operand\n * @returns the cross product\n */\n cross(e) {\n const t = new this.constructor();\n return _.CrossToRef(this, e, t);\n }\n /**\n * Normalize the current Vector3 with the given input length.\n * Please note that this is an in place operation.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#123\n * @param len the length of the vector\n * @returns the current updated Vector3\n */\n normalizeFromLength(e) {\n return e === 0 || e === 1 ? this : this.scaleInPlace(1 / e);\n }\n /**\n * Normalize the current Vector3 to a new vector\n * Example Playground https://playground.babylonjs.com/#R1F8YU#124\n * @returns the new Vector3\n */\n normalizeToNew() {\n const e = new this.constructor(0, 0, 0);\n return this.normalizeToRef(e), e;\n }\n /**\n * Normalize the current Vector3 to the reference\n * Example Playground https://playground.babylonjs.com/#R1F8YU#125\n * @param reference define the Vector3 to update\n * @returns the updated Vector3\n */\n normalizeToRef(e) {\n const t = this.length();\n return t === 0 || t === 1 ? e.copyFrom(this) : this.scaleToRef(1 / t, e);\n }\n /**\n * Creates a new Vector3 copied from the current Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#11\n * @returns the new Vector3\n */\n clone() {\n return new this.constructor(this._x, this._y, this._z);\n }\n /**\n * Copies the given vector coordinates to the current Vector3 ones\n * Example Playground https://playground.babylonjs.com/#R1F8YU#12\n * @param source defines the source Vector3\n * @returns the current updated Vector3\n */\n copyFrom(e) {\n return this.copyFromFloats(e._x, e._y, e._z);\n }\n /**\n * Copies the given floats to the current Vector3 coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#13\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the current updated Vector3\n */\n copyFromFloats(e, t, i) {\n return this._x = e, this._y = t, this._z = i, this._isDirty = !0, this;\n }\n /**\n * Copies the given floats to the current Vector3 coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#58\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @returns the current updated Vector3\n */\n set(e, t, i) {\n return this.copyFromFloats(e, t, i);\n }\n /**\n * Copies the given float to the current Vector3 coordinates\n * Example Playground https://playground.babylonjs.com/#R1F8YU#59\n * @param v defines the x, y and z coordinates of the operand\n * @returns the current updated Vector3\n */\n setAll(e) {\n return this._x = this._y = this._z = e, this._isDirty = !0, this;\n }\n // Statics\n /**\n * Get the clip factor between two vectors\n * Example Playground https://playground.babylonjs.com/#R1F8YU#126\n * @param vector0 defines the first operand\n * @param vector1 defines the second operand\n * @param axis defines the axis to use\n * @param size defines the size along the axis\n * @returns the clip factor\n */\n static GetClipFactor(e, t, i, r) {\n const s = _.Dot(e, i), a = _.Dot(t, i);\n return (s - r) / (s - a);\n }\n /**\n * Get angle between two vectors\n * Example Playground https://playground.babylonjs.com/#R1F8YU#86\n * @param vector0 the starting point\n * @param vector1 the ending point\n * @param normal direction of the normal\n * @returns the angle between vector0 and vector1\n */\n static GetAngleBetweenVectors(e, t, i) {\n const r = e.normalizeToRef(be.Vector3[1]), s = t.normalizeToRef(be.Vector3[2]);\n let a = _.Dot(r, s);\n a = ii(a, -1, 1);\n const o = Math.acos(a), l = be.Vector3[3];\n return _.CrossToRef(r, s, l), _.Dot(l, i) > 0 ? isNaN(o) ? 0 : o : isNaN(o) ? -Math.PI : -Math.acos(a);\n }\n /**\n * Get angle between two vectors projected on a plane\n * Example Playground https://playground.babylonjs.com/#R1F8YU#87\n * Expectation compute time: 0.01 ms (median) and 0.02 ms (percentile 95%)\n * @param vector0 angle between vector0 and vector1\n * @param vector1 angle between vector0 and vector1\n * @param normal Normal of the projection plane\n * @returns the angle in radians (float) between vector0 and vector1 projected on the plane with the specified normal\n */\n static GetAngleBetweenVectorsOnPlane(e, t, i) {\n be.Vector3[0].copyFrom(e);\n const r = be.Vector3[0];\n be.Vector3[1].copyFrom(t);\n const s = be.Vector3[1];\n be.Vector3[2].copyFrom(i);\n const a = be.Vector3[2], o = be.Vector3[3], l = be.Vector3[4];\n r.normalize(), s.normalize(), a.normalize(), _.CrossToRef(a, r, o), _.CrossToRef(o, a, l);\n const c = Math.atan2(_.Dot(s, o), _.Dot(s, l));\n return G_(c);\n }\n /**\n * Gets the rotation that aligns the roll axis (Y) to the line joining the start point to the target point and stores it in the ref Vector3\n * Example PG https://playground.babylonjs.com/#R1F8YU#189\n * @param start the starting point\n * @param target the target point\n * @param ref the vector3 to store the result\n * @returns ref in the form (pitch, yaw, 0)\n */\n static PitchYawRollToMoveBetweenPointsToRef(e, t, i) {\n const r = z.Vector3[0];\n return t.subtractToRef(e, r), i._y = Math.atan2(r.x, r.z) || 0, i._x = Math.atan2(Math.sqrt(r.x ** 2 + r.z ** 2), r.y) || 0, i._z = 0, i._isDirty = !0, i;\n }\n /**\n * Gets the rotation that aligns the roll axis (Y) to the line joining the start point to the target point\n * Example PG https://playground.babylonjs.com/#R1F8YU#188\n * @param start the starting point\n * @param target the target point\n * @returns the rotation in the form (pitch, yaw, 0)\n */\n static PitchYawRollToMoveBetweenPoints(e, t) {\n const i = _.Zero();\n return _.PitchYawRollToMoveBetweenPointsToRef(e, t, i);\n }\n /**\n * Slerp between two vectors. See also `SmoothToRef`\n * Slerp is a spherical linear interpolation\n * giving a slow in and out effect\n * Example Playground 1 https://playground.babylonjs.com/#R1F8YU#108\n * Example Playground 2 https://playground.babylonjs.com/#R1F8YU#109\n * @param vector0 Start vector\n * @param vector1 End vector\n * @param slerp amount (will be clamped between 0 and 1)\n * @param result The slerped vector\n * @returns The slerped vector\n */\n static SlerpToRef(e, t, i, r) {\n i = ii(i, 0, 1);\n const s = be.Vector3[0], a = be.Vector3[1];\n s.copyFrom(e);\n const o = s.length();\n s.normalizeFromLength(o), a.copyFrom(t);\n const l = a.length();\n a.normalizeFromLength(l);\n const c = _.Dot(s, a);\n let h, u;\n if (c < 1 - xt) {\n const f = Math.acos(c), d = 1 / Math.sin(f);\n h = Math.sin((1 - i) * f) * d, u = Math.sin(i * f) * d;\n } else\n h = 1 - i, u = i;\n return s.scaleInPlace(h), a.scaleInPlace(u), r.copyFrom(s).addInPlace(a), r.scaleInPlace(W_(o, l, i)), r;\n }\n /**\n * Smooth interpolation between two vectors using Slerp\n * Example Playground https://playground.babylonjs.com/#R1F8YU#110\n * @param source source vector\n * @param goal goal vector\n * @param deltaTime current interpolation frame\n * @param lerpTime total interpolation time\n * @param result the smoothed vector\n * @returns the smoothed vector\n */\n static SmoothToRef(e, t, i, r, s) {\n return _.SlerpToRef(e, t, r === 0 ? 1 : i / r, s), s;\n }\n /**\n * Returns a new Vector3 set from the index \"offset\" of the given array\n * Example Playground https://playground.babylonjs.com/#R1F8YU#83\n * @param array defines the source array\n * @param offset defines the offset in the source array\n * @returns the new Vector3\n */\n static FromArray(e, t = 0) {\n return new _(e[t], e[t + 1], e[t + 2]);\n }\n /**\n * Returns a new Vector3 set from the index \"offset\" of the given Float32Array\n * @param array defines the source array\n * @param offset defines the offset in the source array\n * @returns the new Vector3\n * @deprecated Please use FromArray instead.\n */\n static FromFloatArray(e, t) {\n return _.FromArray(e, t);\n }\n /**\n * Sets the given vector \"result\" with the element values from the index \"offset\" of the given array\n * Example Playground https://playground.babylonjs.com/#R1F8YU#84\n * @param array defines the source array\n * @param offset defines the offset in the source array\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static FromArrayToRef(e, t, i) {\n return i._x = e[t], i._y = e[t + 1], i._z = e[t + 2], i._isDirty = !0, i;\n }\n /**\n * Sets the given vector \"result\" with the element values from the index \"offset\" of the given Float32Array\n * @param array defines the source array\n * @param offset defines the offset in the source array\n * @param result defines the Vector3 where to store the result\n * @deprecated Please use FromArrayToRef instead.\n * @returns result input\n */\n static FromFloatArrayToRef(e, t, i) {\n return _.FromArrayToRef(e, t, i);\n }\n /**\n * Sets the given vector \"result\" with the given floats.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#85\n * @param x defines the x coordinate of the source\n * @param y defines the y coordinate of the source\n * @param z defines the z coordinate of the source\n * @param result defines the Vector3 where to store the result\n * @returns the result vector\n */\n static FromFloatsToRef(e, t, i, r) {\n return r.copyFromFloats(e, t, i), r;\n }\n /**\n * Returns a new Vector3 set to (0.0, 0.0, 0.0)\n * @returns a new empty Vector3\n */\n static Zero() {\n return new _(0, 0, 0);\n }\n /**\n * Returns a new Vector3 set to (1.0, 1.0, 1.0)\n * @returns a new Vector3\n */\n static One() {\n return new _(1, 1, 1);\n }\n /**\n * Returns a new Vector3 set to (0.0, 1.0, 0.0)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\n * @returns a new up Vector3\n */\n static Up() {\n return new _(0, 1, 0);\n }\n /**\n * Gets an up Vector3 that must not be updated\n */\n static get UpReadOnly() {\n return _._UpReadOnly;\n }\n /**\n * Gets a down Vector3 that must not be updated\n */\n static get DownReadOnly() {\n return _._DownReadOnly;\n }\n /**\n * Gets a right Vector3 that must not be updated\n */\n static get RightReadOnly() {\n return _._RightReadOnly;\n }\n /**\n * Gets a left Vector3 that must not be updated\n */\n static get LeftReadOnly() {\n return _._LeftReadOnly;\n }\n /**\n * Gets a forward Vector3 that must not be updated\n */\n static get LeftHandedForwardReadOnly() {\n return _._LeftHandedForwardReadOnly;\n }\n /**\n * Gets a forward Vector3 that must not be updated\n */\n static get RightHandedForwardReadOnly() {\n return _._RightHandedForwardReadOnly;\n }\n /**\n * Gets a backward Vector3 that must not be updated\n */\n static get LeftHandedBackwardReadOnly() {\n return _._LeftHandedBackwardReadOnly;\n }\n /**\n * Gets a backward Vector3 that must not be updated\n */\n static get RightHandedBackwardReadOnly() {\n return _._RightHandedBackwardReadOnly;\n }\n /**\n * Gets a zero Vector3 that must not be updated\n */\n static get ZeroReadOnly() {\n return _._ZeroReadOnly;\n }\n /**\n * Gets a one Vector3 that must not be updated\n */\n static get OneReadOnly() {\n return _._OneReadOnly;\n }\n /**\n * Returns a new Vector3 set to (0.0, -1.0, 0.0)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\n * @returns a new down Vector3\n */\n static Down() {\n return new _(0, -1, 0);\n }\n /**\n * Returns a new Vector3 set to (0.0, 0.0, 1.0)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\n * @param rightHandedSystem is the scene right-handed (negative z)\n * @returns a new forward Vector3\n */\n static Forward(e = !1) {\n return new _(0, 0, e ? -1 : 1);\n }\n /**\n * Returns a new Vector3 set to (0.0, 0.0, -1.0)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\n * @param rightHandedSystem is the scene right-handed (negative-z)\n * @returns a new Backward Vector3\n */\n static Backward(e = !1) {\n return new _(0, 0, e ? 1 : -1);\n }\n /**\n * Returns a new Vector3 set to (1.0, 0.0, 0.0)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\n * @returns a new right Vector3\n */\n static Right() {\n return new _(1, 0, 0);\n }\n /**\n * Returns a new Vector3 set to (-1.0, 0.0, 0.0)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\n * @returns a new left Vector3\n */\n static Left() {\n return new _(-1, 0, 0);\n }\n /**\n * Returns a new Vector3 with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @returns a Vector3 with random values between min and max\n */\n static Random(e = 0, t = 1) {\n return new _(jt(e, t), jt(e, t), jt(e, t));\n }\n /**\n * Sets a Vector3 with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @param ref the ref to store the values in\n * @returns the ref with random values between min and max\n */\n static RandomToRef(e = 0, t = 1, i) {\n return i.copyFromFloats(jt(e, t), jt(e, t), jt(e, t));\n }\n /**\n * Returns a new Vector3 set with the result of the transformation by the given matrix of the given vector.\n * This method computes transformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#111\n * @param vector defines the Vector3 to transform\n * @param transformation defines the transformation matrix\n * @returns the transformed Vector3\n */\n static TransformCoordinates(e, t) {\n const i = _.Zero();\n return _.TransformCoordinatesToRef(e, t, i), i;\n }\n /**\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given vector\n * This method computes transformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#113\n * @param vector defines the Vector3 to transform\n * @param transformation defines the transformation matrix\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static TransformCoordinatesToRef(e, t, i) {\n return _.TransformCoordinatesFromFloatsToRef(e._x, e._y, e._z, t, i), i;\n }\n /**\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given floats (x, y, z)\n * This method computes transformed coordinates only, not transformed direction vectors\n * Example Playground https://playground.babylonjs.com/#R1F8YU#115\n * @param x define the x coordinate of the source vector\n * @param y define the y coordinate of the source vector\n * @param z define the z coordinate of the source vector\n * @param transformation defines the transformation matrix\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static TransformCoordinatesFromFloatsToRef(e, t, i, r, s) {\n const a = r.m, o = e * a[0] + t * a[4] + i * a[8] + a[12], l = e * a[1] + t * a[5] + i * a[9] + a[13], c = e * a[2] + t * a[6] + i * a[10] + a[14], h = 1 / (e * a[3] + t * a[7] + i * a[11] + a[15]);\n return s._x = o * h, s._y = l * h, s._z = c * h, s._isDirty = !0, s;\n }\n /**\n * Returns a new Vector3 set with the result of the normal transformation by the given matrix of the given vector\n * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#112\n * @param vector defines the Vector3 to transform\n * @param transformation defines the transformation matrix\n * @returns the new Vector3\n */\n static TransformNormal(e, t) {\n const i = _.Zero();\n return _.TransformNormalToRef(e, t, i), i;\n }\n /**\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given vector\n * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#114\n * @param vector defines the Vector3 to transform\n * @param transformation defines the transformation matrix\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static TransformNormalToRef(e, t, i) {\n return this.TransformNormalFromFloatsToRef(e._x, e._y, e._z, t, i), i;\n }\n /**\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given floats (x, y, z)\n * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)\n * Example Playground https://playground.babylonjs.com/#R1F8YU#116\n * @param x define the x coordinate of the source vector\n * @param y define the y coordinate of the source vector\n * @param z define the z coordinate of the source vector\n * @param transformation defines the transformation matrix\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static TransformNormalFromFloatsToRef(e, t, i, r, s) {\n const a = r.m;\n return s._x = e * a[0] + t * a[4] + i * a[8], s._y = e * a[1] + t * a[5] + i * a[9], s._z = e * a[2] + t * a[6] + i * a[10], s._isDirty = !0, s;\n }\n /**\n * Returns a new Vector3 located for \"amount\" on the CatmullRom interpolation spline defined by the vectors \"value1\", \"value2\", \"value3\", \"value4\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#69\n * @param value1 defines the first control point\n * @param value2 defines the second control point\n * @param value3 defines the third control point\n * @param value4 defines the fourth control point\n * @param amount defines the amount on the spline to use\n * @returns the new Vector3\n */\n static CatmullRom(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 0.5 * (2 * t._x + (-e._x + i._x) * s + (2 * e._x - 5 * t._x + 4 * i._x - r._x) * a + (-e._x + 3 * t._x - 3 * i._x + r._x) * o), c = 0.5 * (2 * t._y + (-e._y + i._y) * s + (2 * e._y - 5 * t._y + 4 * i._y - r._y) * a + (-e._y + 3 * t._y - 3 * i._y + r._y) * o), h = 0.5 * (2 * t._z + (-e._z + i._z) * s + (2 * e._z - 5 * t._z + 4 * i._z - r._z) * a + (-e._z + 3 * t._z - 3 * i._z + r._z) * o);\n return new e.constructor(l, c, h);\n }\n /**\n * Returns a new Vector3 set with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\n * Example Playground https://playground.babylonjs.com/#R1F8YU#76\n * @param value defines the current value\n * @param min defines the lower range value\n * @param max defines the upper range value\n * @returns the new Vector3\n */\n static Clamp(e, t, i) {\n const r = new e.constructor();\n return _.ClampToRef(e, t, i, r), r;\n }\n /**\n * Sets the given vector \"result\" with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\n * Example Playground https://playground.babylonjs.com/#R1F8YU#77\n * @param value defines the current value\n * @param min defines the lower range value\n * @param max defines the upper range value\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static ClampToRef(e, t, i, r) {\n let s = e._x;\n s = s > i._x ? i._x : s, s = s < t._x ? t._x : s;\n let a = e._y;\n a = a > i._y ? i._y : a, a = a < t._y ? t._y : a;\n let o = e._z;\n return o = o > i._z ? i._z : o, o = o < t._z ? t._z : o, r.copyFromFloats(s, a, o), r;\n }\n /**\n * Checks if a given vector is inside a specific range\n * Example Playground https://playground.babylonjs.com/#R1F8YU#75\n * @param v defines the vector to test\n * @param min defines the minimum range\n * @param max defines the maximum range\n */\n static CheckExtends(e, t, i) {\n t.minimizeInPlace(e), i.maximizeInPlace(e);\n }\n /**\n * Returns a new Vector3 located for \"amount\" (float) on the Hermite interpolation spline defined by the vectors \"value1\", \"tangent1\", \"value2\", \"tangent2\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#89\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent vector\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent vector\n * @param amount defines the amount on the interpolation spline (between 0 and 1)\n * @returns the new Vector3\n */\n static Hermite(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 2 * o - 3 * a + 1, c = -2 * o + 3 * a, h = o - 2 * a + s, u = o - a, f = e._x * l + i._x * c + t._x * h + r._x * u, d = e._y * l + i._y * c + t._y * h + r._y * u, p = e._z * l + i._z * c + t._z * h + r._z * u;\n return new e.constructor(f, d, p);\n }\n /**\n * Returns a new Vector3 which is the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * Example Playground https://playground.babylonjs.com/#R1F8YU#90\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @returns 1st derivative\n */\n static Hermite1stDerivative(e, t, i, r, s) {\n const a = new e.constructor();\n return this.Hermite1stDerivativeToRef(e, t, i, r, s, a), a;\n }\n /**\n * Update a Vector3 with the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * Example Playground https://playground.babylonjs.com/#R1F8YU#91\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @param result define where to store the derivative\n * @returns result input\n */\n static Hermite1stDerivativeToRef(e, t, i, r, s, a) {\n const o = s * s;\n return a._x = (o - s) * 6 * e._x + (3 * o - 4 * s + 1) * t._x + (-o + s) * 6 * i._x + (3 * o - 2 * s) * r._x, a._y = (o - s) * 6 * e._y + (3 * o - 4 * s + 1) * t._y + (-o + s) * 6 * i._y + (3 * o - 2 * s) * r._y, a._z = (o - s) * 6 * e._z + (3 * o - 4 * s + 1) * t._z + (-o + s) * 6 * i._z + (3 * o - 2 * s) * r._z, a._isDirty = !0, a;\n }\n /**\n * Returns a new Vector3 located for \"amount\" (float) on the linear interpolation between the vectors \"start\" and \"end\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#95\n * @param start defines the start value\n * @param end defines the end value\n * @param amount max defines amount between both (between 0 and 1)\n * @returns the new Vector3\n */\n static Lerp(e, t, i) {\n const r = new e.constructor(0, 0, 0);\n return _.LerpToRef(e, t, i, r), r;\n }\n /**\n * Sets the given vector \"result\" with the result of the linear interpolation from the vector \"start\" for \"amount\" to the vector \"end\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#93\n * @param start defines the start value\n * @param end defines the end value\n * @param amount max defines amount between both (between 0 and 1)\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static LerpToRef(e, t, i, r) {\n return r._x = e._x + (t._x - e._x) * i, r._y = e._y + (t._y - e._y) * i, r._z = e._z + (t._z - e._z) * i, r._isDirty = !0, r;\n }\n /**\n * Returns the dot product (float) between the vectors \"left\" and \"right\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#82\n * @param left defines the left operand\n * @param right defines the right operand\n * @returns the dot product\n */\n static Dot(e, t) {\n return e._x * t._x + e._y * t._y + e._z * t._z;\n }\n /**\n * Returns the dot product (float) between the current vectors and \"otherVector\"\n * @param otherVector defines the right operand\n * @returns the dot product\n */\n dot(e) {\n return this._x * e._x + this._y * e._y + this._z * e._z;\n }\n /**\n * Returns a new Vector3 as the cross product of the vectors \"left\" and \"right\"\n * The cross product is then orthogonal to both \"left\" and \"right\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#15\n * @param left defines the left operand\n * @param right defines the right operand\n * @returns the cross product\n */\n static Cross(e, t) {\n const i = new e.constructor();\n return _.CrossToRef(e, t, i), i;\n }\n /**\n * Sets the given vector \"result\" with the cross product of \"left\" and \"right\"\n * The cross product is then orthogonal to both \"left\" and \"right\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#78\n * @param left defines the left operand\n * @param right defines the right operand\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static CrossToRef(e, t, i) {\n const r = e._y * t._z - e._z * t._y, s = e._z * t._x - e._x * t._z, a = e._x * t._y - e._y * t._x;\n return i.copyFromFloats(r, s, a), i;\n }\n /**\n * Returns a new Vector3 as the normalization of the given vector\n * Example Playground https://playground.babylonjs.com/#R1F8YU#98\n * @param vector defines the Vector3 to normalize\n * @returns the new Vector3\n */\n static Normalize(e) {\n const t = _.Zero();\n return _.NormalizeToRef(e, t), t;\n }\n /**\n * Sets the given vector \"result\" with the normalization of the given first vector\n * Example Playground https://playground.babylonjs.com/#R1F8YU#98\n * @param vector defines the Vector3 to normalize\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static NormalizeToRef(e, t) {\n return e.normalizeToRef(t), t;\n }\n /**\n * Project a Vector3 onto screen space\n * Example Playground https://playground.babylonjs.com/#R1F8YU#101\n * @param vector defines the Vector3 to project\n * @param world defines the world matrix to use\n * @param transform defines the transform (view x projection) matrix to use\n * @param viewport defines the screen viewport to use\n * @returns the new Vector3\n */\n static Project(e, t, i, r) {\n const s = new e.constructor();\n return _.ProjectToRef(e, t, i, r, s), s;\n }\n /**\n * Project a Vector3 onto screen space to reference\n * Example Playground https://playground.babylonjs.com/#R1F8YU#102\n * @param vector defines the Vector3 to project\n * @param world defines the world matrix to use\n * @param transform defines the transform (view x projection) matrix to use\n * @param viewport defines the screen viewport to use\n * @param result the vector in which the screen space will be stored\n * @returns result input\n */\n static ProjectToRef(e, t, i, r, s) {\n const a = r.width, o = r.height, l = r.x, c = r.y, h = be.Matrix[1];\n L.FromValuesToRef(a / 2, 0, 0, 0, 0, -o / 2, 0, 0, 0, 0, 0.5, 0, l + a / 2, o / 2 + c, 0.5, 1, h);\n const u = be.Matrix[0];\n return t.multiplyToRef(i, u), u.multiplyToRef(h, u), _.TransformCoordinatesToRef(e, u, s), s;\n }\n /**\n * Reflects a vector off the plane defined by a normalized normal\n * @param inDirection defines the vector direction\n * @param normal defines the normal - Must be normalized\n * @returns the resulting vector\n */\n static Reflect(e, t) {\n return this.ReflectToRef(e, t, new _());\n }\n /**\n * Reflects a vector off the plane defined by a normalized normal to reference\n * @param inDirection defines the vector direction\n * @param normal defines the normal - Must be normalized\n * @param ref defines the Vector3 where to store the result\n * @returns the resulting vector\n */\n static ReflectToRef(e, t, i) {\n const r = z.Vector3[0];\n return r.copyFrom(t).scaleInPlace(2 * _.Dot(e, t)), i.copyFrom(e).subtractInPlace(r);\n }\n /**\n * @internal\n */\n static _UnprojectFromInvertedMatrixToRef(e, t, i) {\n _.TransformCoordinatesToRef(e, t, i);\n const r = t.m, s = e._x * r[3] + e._y * r[7] + e._z * r[11] + r[15];\n return Ii(s, 1) && i.scaleInPlace(1 / s), i;\n }\n /**\n * Unproject from screen space to object space\n * Example Playground https://playground.babylonjs.com/#R1F8YU#121\n * @param source defines the screen space Vector3 to use\n * @param viewportWidth defines the current width of the viewport\n * @param viewportHeight defines the current height of the viewport\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\n * @param transform defines the transform (view x projection) matrix to use\n * @returns the new Vector3\n */\n static UnprojectFromTransform(e, t, i, r, s) {\n return this.Unproject(e, t, i, r, s, L.IdentityReadOnly);\n }\n /**\n * Unproject from screen space to object space\n * Example Playground https://playground.babylonjs.com/#R1F8YU#117\n * @param source defines the screen space Vector3 to use\n * @param viewportWidth defines the current width of the viewport\n * @param viewportHeight defines the current height of the viewport\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\n * @param view defines the view matrix to use\n * @param projection defines the projection matrix to use\n * @returns the new Vector3\n */\n static Unproject(e, t, i, r, s, a) {\n const o = new e.constructor();\n return _.UnprojectToRef(e, t, i, r, s, a, o), o;\n }\n /**\n * Unproject from screen space to object space\n * Example Playground https://playground.babylonjs.com/#R1F8YU#119\n * @param source defines the screen space Vector3 to use\n * @param viewportWidth defines the current width of the viewport\n * @param viewportHeight defines the current height of the viewport\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\n * @param view defines the view matrix to use\n * @param projection defines the projection matrix to use\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static UnprojectToRef(e, t, i, r, s, a, o) {\n return _.UnprojectFloatsToRef(e._x, e._y, e._z, t, i, r, s, a, o), o;\n }\n /**\n * Unproject from screen space to object space\n * Example Playground https://playground.babylonjs.com/#R1F8YU#120\n * @param sourceX defines the screen space x coordinate to use\n * @param sourceY defines the screen space y coordinate to use\n * @param sourceZ defines the screen space z coordinate to use\n * @param viewportWidth defines the current width of the viewport\n * @param viewportHeight defines the current height of the viewport\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\n * @param view defines the view matrix to use\n * @param projection defines the projection matrix to use\n * @param result defines the Vector3 where to store the result\n * @returns result input\n */\n static UnprojectFloatsToRef(e, t, i, r, s, a, o, l, c) {\n var f;\n const h = be.Matrix[0];\n a.multiplyToRef(o, h), h.multiplyToRef(l, h), h.invert();\n const u = be.Vector3[0];\n return u.x = e / r * 2 - 1, u.y = -(t / s * 2 - 1), (f = st.LastCreatedEngine) != null && f.isNDCHalfZRange ? u.z = i : u.z = 2 * i - 1, _._UnprojectFromInvertedMatrixToRef(u, h, c), c;\n }\n /**\n * Gets the minimal coordinate values between two Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#97\n * @param left defines the first operand\n * @param right defines the second operand\n * @returns the new Vector3\n */\n static Minimize(e, t) {\n const i = new e.constructor();\n return i.copyFrom(e), i.minimizeInPlace(t), i;\n }\n /**\n * Gets the maximal coordinate values between two Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#96\n * @param left defines the first operand\n * @param right defines the second operand\n * @returns the new Vector3\n */\n static Maximize(e, t) {\n const i = new e.constructor();\n return i.copyFrom(e), i.maximizeInPlace(t), i;\n }\n /**\n * Returns the distance between the vectors \"value1\" and \"value2\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#81\n * @param value1 defines the first operand\n * @param value2 defines the second operand\n * @returns the distance\n */\n static Distance(e, t) {\n return Math.sqrt(_.DistanceSquared(e, t));\n }\n /**\n * Returns the squared distance between the vectors \"value1\" and \"value2\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#80\n * @param value1 defines the first operand\n * @param value2 defines the second operand\n * @returns the squared distance\n */\n static DistanceSquared(e, t) {\n const i = e._x - t._x, r = e._y - t._y, s = e._z - t._z;\n return i * i + r * r + s * s;\n }\n /**\n * Projects \"vector\" on the triangle determined by its extremities \"p0\", \"p1\" and \"p2\", stores the result in \"ref\"\n * and returns the distance to the projected point.\n * Example Playground https://playground.babylonjs.com/#R1F8YU#104\n * From http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.4264&rep=rep1&type=pdf\n *\n * @param vector the vector to get distance from\n * @param p0 extremity of the triangle\n * @param p1 extremity of the triangle\n * @param p2 extremity of the triangle\n * @param ref variable to store the result to\n * @returns The distance between \"ref\" and \"vector\"\n */\n static ProjectOnTriangleToRef(e, t, i, r, s) {\n const a = be.Vector3[0], o = be.Vector3[1], l = be.Vector3[2], c = be.Vector3[3], h = be.Vector3[4];\n i.subtractToRef(t, a), r.subtractToRef(t, o), r.subtractToRef(i, l);\n const u = a.length(), f = o.length(), d = l.length();\n if (u < xt || f < xt || d < xt)\n return s.copyFrom(t), _.Distance(e, t);\n e.subtractToRef(t, h), _.CrossToRef(a, o, c);\n const p = c.length();\n if (p < xt)\n return s.copyFrom(t), _.Distance(e, t);\n c.normalizeFromLength(p);\n let g = h.length();\n if (g < xt)\n return s.copyFrom(t), 0;\n h.normalizeFromLength(g);\n const m = _.Dot(c, h), v = be.Vector3[5], E = be.Vector3[6];\n v.copyFrom(c).scaleInPlace(-g * m), E.copyFrom(e).addInPlace(v);\n const C = be.Vector3[4], T = be.Vector3[5], R = be.Vector3[7], x = be.Vector3[8];\n C.copyFrom(a).scaleInPlace(1 / u), x.copyFrom(o).scaleInPlace(1 / f), C.addInPlace(x).scaleInPlace(-1), T.copyFrom(a).scaleInPlace(-1 / u), x.copyFrom(l).scaleInPlace(1 / d), T.addInPlace(x).scaleInPlace(-1), R.copyFrom(l).scaleInPlace(-1 / d), x.copyFrom(o).scaleInPlace(-1 / f), R.addInPlace(x).scaleInPlace(-1);\n const S = be.Vector3[9];\n let M;\n S.copyFrom(E).subtractInPlace(t), _.CrossToRef(C, S, x), M = _.Dot(x, c);\n const N = M;\n S.copyFrom(E).subtractInPlace(i), _.CrossToRef(T, S, x), M = _.Dot(x, c);\n const F = M;\n S.copyFrom(E).subtractInPlace(r), _.CrossToRef(R, S, x), M = _.Dot(x, c);\n const U = M, H = be.Vector3[10];\n let q, Z;\n N > 0 && F < 0 ? (H.copyFrom(a), q = t, Z = i) : F > 0 && U < 0 ? (H.copyFrom(l), q = i, Z = r) : (H.copyFrom(o).scaleInPlace(-1), q = r, Z = t);\n const k = be.Vector3[9], Q = be.Vector3[4];\n if (q.subtractToRef(E, x), Z.subtractToRef(E, k), _.CrossToRef(x, k, Q), !(_.Dot(Q, c) < 0))\n return s.copyFrom(E), Math.abs(g * m);\n const de = be.Vector3[5];\n _.CrossToRef(H, Q, de), de.normalize();\n const j = be.Vector3[9];\n j.copyFrom(q).subtractInPlace(E);\n const J = j.length();\n if (J < xt)\n return s.copyFrom(q), _.Distance(e, q);\n j.normalizeFromLength(J);\n const O = _.Dot(de, j), G = be.Vector3[7];\n G.copyFrom(E).addInPlace(de.scaleInPlace(J * O)), x.copyFrom(G).subtractInPlace(q), g = H.length(), H.normalizeFromLength(g);\n let ee = _.Dot(x, H) / Math.max(g, xt);\n return ee = ii(ee, 0, 1), G.copyFrom(q).addInPlace(H.scaleInPlace(ee * g)), s.copyFrom(G), _.Distance(e, G);\n }\n /**\n * Returns a new Vector3 located at the center between \"value1\" and \"value2\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#72\n * @param value1 defines the first operand\n * @param value2 defines the second operand\n * @returns the new Vector3\n */\n static Center(e, t) {\n return _.CenterToRef(e, t, _.Zero());\n }\n /**\n * Gets the center of the vectors \"value1\" and \"value2\" and stores the result in the vector \"ref\"\n * Example Playground https://playground.babylonjs.com/#R1F8YU#73\n * @param value1 defines first vector\n * @param value2 defines second vector\n * @param ref defines third vector\n * @returns ref\n */\n static CenterToRef(e, t, i) {\n return i.copyFromFloats((e._x + t._x) / 2, (e._y + t._y) / 2, (e._z + t._z) / 2);\n }\n /**\n * Given three orthogonal normalized left-handed oriented Vector3 axis in space (target system),\n * RotationFromAxis() returns the rotation Euler angles (ex : rotation.x, rotation.y, rotation.z) to apply\n * to something in order to rotate it from its local system to the given target system\n * Note: axis1, axis2 and axis3 are normalized during this operation\n * Example Playground https://playground.babylonjs.com/#R1F8YU#106\n * @param axis1 defines the first axis\n * @param axis2 defines the second axis\n * @param axis3 defines the third axis\n * @returns a new Vector3\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/target_align\n */\n static RotationFromAxis(e, t, i) {\n const r = new e.constructor();\n return _.RotationFromAxisToRef(e, t, i, r), r;\n }\n /**\n * The same than RotationFromAxis but updates the given ref Vector3 parameter instead of returning a new Vector3\n * Example Playground https://playground.babylonjs.com/#R1F8YU#107\n * @param axis1 defines the first axis\n * @param axis2 defines the second axis\n * @param axis3 defines the third axis\n * @param ref defines the Vector3 where to store the result\n * @returns result input\n */\n static RotationFromAxisToRef(e, t, i, r) {\n const s = be.Quaternion[0];\n return Ce.RotationQuaternionFromAxisToRef(e, t, i, s), s.toEulerAnglesToRef(r), r;\n }\n}\n_._UpReadOnly = _.Up();\n_._DownReadOnly = _.Down();\n_._LeftHandedForwardReadOnly = _.Forward(!1);\n_._RightHandedForwardReadOnly = _.Forward(!0);\n_._LeftHandedBackwardReadOnly = _.Backward(!1);\n_._RightHandedBackwardReadOnly = _.Backward(!0);\n_._RightReadOnly = _.Right();\n_._LeftReadOnly = _.Left();\n_._ZeroReadOnly = _.Zero();\n_._OneReadOnly = _.One();\nObject.defineProperties(_.prototype, {\n dimension: { value: [3] },\n rank: { value: 1 }\n});\nclass Ke {\n /**\n * Creates a Vector4 object from the given floats.\n * @param x x value of the vector\n * @param y y value of the vector\n * @param z z value of the vector\n * @param w w value of the vector\n */\n constructor(e = 0, t = 0, i = 0, r = 0) {\n this.x = e, this.y = t, this.z = i, this.w = r;\n }\n /**\n * Returns the string with the Vector4 coordinates.\n * @returns a string containing all the vector values\n */\n toString() {\n return `{X: ${this.x} Y: ${this.y} Z: ${this.z} W: ${this.w}}`;\n }\n /**\n * Returns the string \"Vector4\".\n * @returns \"Vector4\"\n */\n getClassName() {\n return \"Vector4\";\n }\n /**\n * Returns the Vector4 hash code.\n * @returns a unique hash code\n */\n getHashCode() {\n const e = nr(this.x), t = nr(this.y), i = nr(this.z), r = nr(this.w);\n let s = e;\n return s = s * 397 ^ t, s = s * 397 ^ i, s = s * 397 ^ r, s;\n }\n // Operators\n /**\n * Returns a new array populated with 4 elements : the Vector4 coordinates.\n * @returns the resulting array\n */\n asArray() {\n return [this.x, this.y, this.z, this.w];\n }\n /**\n * Populates the given array from the given index with the Vector4 coordinates.\n * @param array array to populate\n * @param index index of the array to start at (default: 0)\n * @returns the Vector4.\n */\n toArray(e, t) {\n return t === void 0 && (t = 0), e[t] = this.x, e[t + 1] = this.y, e[t + 2] = this.z, e[t + 3] = this.w, this;\n }\n /**\n * Update the current vector from an array\n * @param array defines the destination array\n * @param offset defines the offset in the destination array\n * @returns the current Vector3\n */\n fromArray(e, t = 0) {\n return Ke.FromArrayToRef(e, t, this), this;\n }\n /**\n * Adds the given vector to the current Vector4.\n * @param otherVector the vector to add\n * @returns the updated Vector4.\n */\n addInPlace(e) {\n return this.x += e.x, this.y += e.y, this.z += e.z, this.w += e.w, this;\n }\n /**\n * Adds the given coordinates to the current Vector4\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @param w defines the w coordinate of the operand\n * @returns the current updated Vector4\n */\n addInPlaceFromFloats(e, t, i, r) {\n return this.x += e, this.y += t, this.z += i, this.w += r, this;\n }\n /**\n * Returns a new Vector4 as the result of the addition of the current Vector4 and the given one.\n * @param otherVector the vector to add\n * @returns the resulting vector\n */\n add(e) {\n return new this.constructor(this.x + e.x, this.y + e.y, this.z + e.z, this.w + e.w);\n }\n /**\n * Updates the given vector \"result\" with the result of the addition of the current Vector4 and the given one.\n * @param otherVector the vector to add\n * @param result the vector to store the result\n * @returns result input\n */\n addToRef(e, t) {\n return t.x = this.x + e.x, t.y = this.y + e.y, t.z = this.z + e.z, t.w = this.w + e.w, t;\n }\n /**\n * Subtract in place the given vector from the current Vector4.\n * @param otherVector the vector to subtract\n * @returns the updated Vector4.\n */\n subtractInPlace(e) {\n return this.x -= e.x, this.y -= e.y, this.z -= e.z, this.w -= e.w, this;\n }\n /**\n * Returns a new Vector4 with the result of the subtraction of the given vector from the current Vector4.\n * @param otherVector the vector to add\n * @returns the new vector with the result\n */\n subtract(e) {\n return new this.constructor(this.x - e.x, this.y - e.y, this.z - e.z, this.w - e.w);\n }\n /**\n * Sets the given vector \"result\" with the result of the subtraction of the given vector from the current Vector4.\n * @param otherVector the vector to subtract\n * @param result the vector to store the result\n * @returns result input\n */\n subtractToRef(e, t) {\n return t.x = this.x - e.x, t.y = this.y - e.y, t.z = this.z - e.z, t.w = this.w - e.w, t;\n }\n /**\n * Returns a new Vector4 set with the result of the subtraction of the given floats from the current Vector4 coordinates.\n * @param x value to subtract\n * @param y value to subtract\n * @param z value to subtract\n * @param w value to subtract\n * @returns new vector containing the result\n */\n subtractFromFloats(e, t, i, r) {\n return new this.constructor(this.x - e, this.y - t, this.z - i, this.w - r);\n }\n /**\n * Sets the given vector \"result\" set with the result of the subtraction of the given floats from the current Vector4 coordinates.\n * @param x value to subtract\n * @param y value to subtract\n * @param z value to subtract\n * @param w value to subtract\n * @param result the vector to store the result in\n * @returns result input\n */\n subtractFromFloatsToRef(e, t, i, r, s) {\n return s.x = this.x - e, s.y = this.y - t, s.z = this.z - i, s.w = this.w - r, s;\n }\n /**\n * Returns a new Vector4 set with the current Vector4 negated coordinates.\n * @returns a new vector with the negated values\n */\n negate() {\n return new this.constructor(-this.x, -this.y, -this.z, -this.w);\n }\n /**\n * Negate this vector in place\n * @returns this\n */\n negateInPlace() {\n return this.x *= -1, this.y *= -1, this.z *= -1, this.w *= -1, this;\n }\n /**\n * Negate the current Vector4 and stores the result in the given vector \"result\" coordinates\n * @param result defines the Vector3 object where to store the result\n * @returns the result\n */\n negateToRef(e) {\n return e.copyFromFloats(this.x * -1, this.y * -1, this.z * -1, this.w * -1);\n }\n /**\n * Multiplies the current Vector4 coordinates by scale (float).\n * @param scale the number to scale with\n * @returns the updated Vector4.\n */\n scaleInPlace(e) {\n return this.x *= e, this.y *= e, this.z *= e, this.w *= e, this;\n }\n /**\n * Returns a new Vector4 set with the current Vector4 coordinates multiplied by scale (float).\n * @param scale the number to scale with\n * @returns a new vector with the result\n */\n scale(e) {\n return new this.constructor(this.x * e, this.y * e, this.z * e, this.w * e);\n }\n /**\n * Sets the given vector \"result\" with the current Vector4 coordinates multiplied by scale (float).\n * @param scale the number to scale with\n * @param result a vector to store the result in\n * @returns result input\n */\n scaleToRef(e, t) {\n return t.x = this.x * e, t.y = this.y * e, t.z = this.z * e, t.w = this.w * e, t;\n }\n /**\n * Scale the current Vector4 values by a factor and add the result to a given Vector4\n * @param scale defines the scale factor\n * @param result defines the Vector4 object where to store the result\n * @returns result input\n */\n scaleAndAddToRef(e, t) {\n return t.x += this.x * e, t.y += this.y * e, t.z += this.z * e, t.w += this.w * e, t;\n }\n /**\n * Boolean : True if the current Vector4 coordinates are stricly equal to the given ones.\n * @param otherVector the vector to compare against\n * @returns true if they are equal\n */\n equals(e) {\n return e && this.x === e.x && this.y === e.y && this.z === e.z && this.w === e.w;\n }\n /**\n * Boolean : True if the current Vector4 coordinates are each beneath the distance \"epsilon\" from the given vector ones.\n * @param otherVector vector to compare against\n * @param epsilon (Default: very small number)\n * @returns true if they are equal\n */\n equalsWithEpsilon(e, t = xt) {\n return e && Ii(this.x, e.x, t) && Ii(this.y, e.y, t) && Ii(this.z, e.z, t) && Ii(this.w, e.w, t);\n }\n /**\n * Boolean : True if the given floats are strictly equal to the current Vector4 coordinates.\n * @param x x value to compare against\n * @param y y value to compare against\n * @param z z value to compare against\n * @param w w value to compare against\n * @returns true if equal\n */\n equalsToFloats(e, t, i, r) {\n return this.x === e && this.y === t && this.z === i && this.w === r;\n }\n /**\n * Multiplies in place the current Vector4 by the given one.\n * @param otherVector vector to multiple with\n * @returns the updated Vector4.\n */\n multiplyInPlace(e) {\n return this.x *= e.x, this.y *= e.y, this.z *= e.z, this.w *= e.w, this;\n }\n /**\n * Returns a new Vector4 set with the multiplication result of the current Vector4 and the given one.\n * @param otherVector vector to multiple with\n * @returns resulting new vector\n */\n multiply(e) {\n return new this.constructor(this.x * e.x, this.y * e.y, this.z * e.z, this.w * e.w);\n }\n /**\n * Updates the given vector \"result\" with the multiplication result of the current Vector4 and the given one.\n * @param otherVector vector to multiple with\n * @param result vector to store the result\n * @returns result input\n */\n multiplyToRef(e, t) {\n return t.x = this.x * e.x, t.y = this.y * e.y, t.z = this.z * e.z, t.w = this.w * e.w, t;\n }\n /**\n * Returns a new Vector4 set with the multiplication result of the given floats and the current Vector4 coordinates.\n * @param x x value multiply with\n * @param y y value multiply with\n * @param z z value multiply with\n * @param w w value multiply with\n * @returns resulting new vector\n */\n multiplyByFloats(e, t, i, r) {\n return new this.constructor(this.x * e, this.y * t, this.z * i, this.w * r);\n }\n /**\n * Returns a new Vector4 set with the division result of the current Vector4 by the given one.\n * @param otherVector vector to devide with\n * @returns resulting new vector\n */\n divide(e) {\n return new this.constructor(this.x / e.x, this.y / e.y, this.z / e.z, this.w / e.w);\n }\n /**\n * Updates the given vector \"result\" with the division result of the current Vector4 by the given one.\n * @param otherVector vector to devide with\n * @param result vector to store the result\n * @returns result input\n */\n divideToRef(e, t) {\n return t.x = this.x / e.x, t.y = this.y / e.y, t.z = this.z / e.z, t.w = this.w / e.w, t;\n }\n /**\n * Divides the current Vector3 coordinates by the given ones.\n * @param otherVector vector to devide with\n * @returns the updated Vector3.\n */\n divideInPlace(e) {\n return this.divideToRef(e, this);\n }\n /**\n * Updates the Vector4 coordinates with the minimum values between its own and the given vector ones\n * @param other defines the second operand\n * @returns the current updated Vector4\n */\n minimizeInPlace(e) {\n return e.x < this.x && (this.x = e.x), e.y < this.y && (this.y = e.y), e.z < this.z && (this.z = e.z), e.w < this.w && (this.w = e.w), this;\n }\n /**\n * Updates the Vector4 coordinates with the maximum values between its own and the given vector ones\n * @param other defines the second operand\n * @returns the current updated Vector4\n */\n maximizeInPlace(e) {\n return e.x > this.x && (this.x = e.x), e.y > this.y && (this.y = e.y), e.z > this.z && (this.z = e.z), e.w > this.w && (this.w = e.w), this;\n }\n /**\n * Updates the current Vector4 with the minimal coordinate values between its and the given coordinates\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @param w defines the w coordinate of the operand\n * @returns the current updated Vector4\n */\n minimizeInPlaceFromFloats(e, t, i, r) {\n return this.x = Math.min(e, this.x), this.y = Math.min(t, this.y), this.z = Math.min(i, this.z), this.w = Math.min(r, this.w), this;\n }\n /**\n * Updates the current Vector4 with the maximal coordinate values between its and the given coordinates.\n * @param x defines the x coordinate of the operand\n * @param y defines the y coordinate of the operand\n * @param z defines the z coordinate of the operand\n * @param w defines the w coordinate of the operand\n * @returns the current updated Vector4\n */\n maximizeInPlaceFromFloats(e, t, i, r) {\n return this.x = Math.max(e, this.x), this.y = Math.max(t, this.y), this.z = Math.max(i, this.z), this.w = Math.max(r, this.w), this;\n }\n /**\n * Gets the current Vector4's floored values and stores them in result\n * @param result the vector to store the result in\n * @returns the result vector\n */\n floorToRef(e) {\n return e.x = Math.floor(this.x), e.y = Math.floor(this.y), e.z = Math.floor(this.z), e.w = Math.floor(this.w), e;\n }\n /**\n * Gets a new Vector4 from current Vector4 floored values\n * @returns a new Vector4\n */\n floor() {\n return new this.constructor(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z), Math.floor(this.w));\n }\n /**\n * Gets the current Vector4's fractional values and stores them in result\n * @param result the vector to store the result in\n * @returns the result vector\n */\n fractToRef(e) {\n return e.x = this.x - Math.floor(this.x), e.y = this.y - Math.floor(this.y), e.z = this.z - Math.floor(this.z), e.w = this.w - Math.floor(this.w), e;\n }\n /**\n * Gets a new Vector4 from current Vector4 fractional values\n * @returns a new Vector4\n */\n fract() {\n return new this.constructor(this.x - Math.floor(this.x), this.y - Math.floor(this.y), this.z - Math.floor(this.z), this.w - Math.floor(this.w));\n }\n // Properties\n /**\n * Returns the Vector4 length (float).\n * @returns the length\n */\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n }\n /**\n * Returns the Vector4 squared length (float).\n * @returns the length squared\n */\n lengthSquared() {\n return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n }\n // Methods\n /**\n * Normalizes in place the Vector4.\n * @returns the updated Vector4.\n */\n normalize() {\n return this.normalizeFromLength(this.length());\n }\n /**\n * Normalize the current Vector4 with the given input length.\n * Please note that this is an in place operation.\n * @param len the length of the vector\n * @returns the current updated Vector4\n */\n normalizeFromLength(e) {\n return e === 0 || e === 1 ? this : this.scaleInPlace(1 / e);\n }\n /**\n * Normalize the current Vector4 to a new vector\n * @returns the new Vector4\n */\n normalizeToNew() {\n const e = new this.constructor();\n return this.normalizeToRef(e), e;\n }\n /**\n * Normalize the current Vector4 to the reference\n * @param reference define the Vector4 to update\n * @returns the updated Vector4\n */\n normalizeToRef(e) {\n const t = this.length();\n return t === 0 || t === 1 ? e.copyFrom(this) : this.scaleToRef(1 / t, e);\n }\n /**\n * Returns a new Vector3 from the Vector4 (x, y, z) coordinates.\n * @returns this converted to a new vector3\n */\n toVector3() {\n return new _(this.x, this.y, this.z);\n }\n /**\n * Returns a new Vector4 copied from the current one.\n * @returns the new cloned vector\n */\n clone() {\n return new this.constructor(this.x, this.y, this.z, this.w);\n }\n /**\n * Updates the current Vector4 with the given one coordinates.\n * @param source the source vector to copy from\n * @returns the updated Vector4.\n */\n copyFrom(e) {\n return this.x = e.x, this.y = e.y, this.z = e.z, this.w = e.w, this;\n }\n /**\n * Updates the current Vector4 coordinates with the given floats.\n * @param x float to copy from\n * @param y float to copy from\n * @param z float to copy from\n * @param w float to copy from\n * @returns the updated Vector4.\n */\n copyFromFloats(e, t, i, r) {\n return this.x = e, this.y = t, this.z = i, this.w = r, this;\n }\n /**\n * Updates the current Vector4 coordinates with the given floats.\n * @param x float to set from\n * @param y float to set from\n * @param z float to set from\n * @param w float to set from\n * @returns the updated Vector4.\n */\n set(e, t, i, r) {\n return this.copyFromFloats(e, t, i, r);\n }\n /**\n * Copies the given float to the current Vector4 coordinates\n * @param v defines the x, y, z and w coordinates of the operand\n * @returns the current updated Vector4\n */\n setAll(e) {\n return this.x = this.y = this.z = this.w = e, this;\n }\n /**\n * Returns the dot product (float) between the current vectors and \"otherVector\"\n * @param otherVector defines the right operand\n * @returns the dot product\n */\n dot(e) {\n return this.x * e.x + this.y * e.y + this.z * e.z + this.w * e.w;\n }\n // Statics\n /**\n * Returns a new Vector4 set from the starting index of the given array.\n * @param array the array to pull values from\n * @param offset the offset into the array to start at\n * @returns the new vector\n */\n static FromArray(e, t) {\n return t || (t = 0), new Ke(e[t], e[t + 1], e[t + 2], e[t + 3]);\n }\n /**\n * Updates the given vector \"result\" from the starting index of the given array.\n * @param array the array to pull values from\n * @param offset the offset into the array to start at\n * @param result the vector to store the result in\n * @returns result input\n */\n static FromArrayToRef(e, t, i) {\n return i.x = e[t], i.y = e[t + 1], i.z = e[t + 2], i.w = e[t + 3], i;\n }\n /**\n * Updates the given vector \"result\" from the starting index of the given Float32Array.\n * @param array the array to pull values from\n * @param offset the offset into the array to start at\n * @param result the vector to store the result in\n * @returns result input\n */\n static FromFloatArrayToRef(e, t, i) {\n return Ke.FromArrayToRef(e, t, i), i;\n }\n /**\n * Updates the given vector \"result\" coordinates from the given floats.\n * @param x float to set from\n * @param y float to set from\n * @param z float to set from\n * @param w float to set from\n * @param result the vector to the floats in\n * @returns result input\n */\n static FromFloatsToRef(e, t, i, r, s) {\n return s.x = e, s.y = t, s.z = i, s.w = r, s;\n }\n /**\n * Returns a new Vector4 set to (0.0, 0.0, 0.0, 0.0)\n * @returns the new vector\n */\n static Zero() {\n return new Ke(0, 0, 0, 0);\n }\n /**\n * Returns a new Vector4 set to (1.0, 1.0, 1.0, 1.0)\n * @returns the new vector\n */\n static One() {\n return new Ke(1, 1, 1, 1);\n }\n /**\n * Returns a new Vector4 with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @returns a Vector4 with random values between min and max\n */\n static Random(e = 0, t = 1) {\n return new Ke(jt(e, t), jt(e, t), jt(e, t), jt(e, t));\n }\n /**\n * Sets a Vector4 with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @param ref the ref to store the values in\n * @returns the ref with random values between min and max\n */\n static RandomToRef(e = 0, t = 1, i) {\n return i.copyFromFloats(jt(e, t), jt(e, t), jt(e, t), jt(e, t));\n }\n /**\n * Returns a new Vector4 set with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\n * @param value defines the current value\n * @param min defines the lower range value\n * @param max defines the upper range value\n * @returns the new Vector4\n */\n static Clamp(e, t, i) {\n const r = new e.constructor();\n return Ke.ClampToRef(e, t, i, r), r;\n }\n /**\n * Sets the given vector \"result\" with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\n * @param value defines the current value\n * @param min defines the lower range value\n * @param max defines the upper range value\n * @param result defines the Vector4 where to store the result\n * @returns result input\n */\n static ClampToRef(e, t, i, r) {\n return r.copyFromFloats(ii(e.x, t.x, i.x), ii(e.y, t.y, i.y), ii(e.z, t.z, i.z), ii(e.w, t.w, i.w));\n }\n /**\n * Checks if a given vector is inside a specific range\n * Example Playground https://playground.babylonjs.com/#R1F8YU#75\n * @param v defines the vector to test\n * @param min defines the minimum range\n * @param max defines the maximum range\n */\n static CheckExtends(e, t, i) {\n t.minimizeInPlace(e), i.maximizeInPlace(e);\n }\n /**\n * Gets a zero Vector4 that must not be updated\n */\n static get ZeroReadOnly() {\n return Ke._ZeroReadOnly;\n }\n /**\n * Returns a new normalized Vector4 from the given one.\n * @param vector the vector to normalize\n * @returns the vector\n */\n static Normalize(e) {\n const t = Ke.Zero();\n return Ke.NormalizeToRef(e, t), t;\n }\n /**\n * Updates the given vector \"result\" from the normalization of the given one.\n * @param vector the vector to normalize\n * @param result the vector to store the result in\n * @returns result input\n */\n static NormalizeToRef(e, t) {\n return e.normalizeToRef(t), t;\n }\n /**\n * Returns a vector with the minimum values from the left and right vectors\n * @param left left vector to minimize\n * @param right right vector to minimize\n * @returns a new vector with the minimum of the left and right vector values\n */\n static Minimize(e, t) {\n const i = new e.constructor();\n return i.copyFrom(e), i.minimizeInPlace(t), i;\n }\n /**\n * Returns a vector with the maximum values from the left and right vectors\n * @param left left vector to maximize\n * @param right right vector to maximize\n * @returns a new vector with the maximum of the left and right vector values\n */\n static Maximize(e, t) {\n const i = new e.constructor();\n return i.copyFrom(e), i.maximizeInPlace(t), i;\n }\n /**\n * Returns the distance (float) between the vectors \"value1\" and \"value2\".\n * @param value1 value to calulate the distance between\n * @param value2 value to calulate the distance between\n * @returns the distance between the two vectors\n */\n static Distance(e, t) {\n return Math.sqrt(Ke.DistanceSquared(e, t));\n }\n /**\n * Returns the squared distance (float) between the vectors \"value1\" and \"value2\".\n * @param value1 value to calulate the distance between\n * @param value2 value to calulate the distance between\n * @returns the distance between the two vectors squared\n */\n static DistanceSquared(e, t) {\n const i = e.x - t.x, r = e.y - t.y, s = e.z - t.z, a = e.w - t.w;\n return i * i + r * r + s * s + a * a;\n }\n /**\n * Returns a new Vector4 located at the center between the vectors \"value1\" and \"value2\".\n * @param value1 value to calulate the center between\n * @param value2 value to calulate the center between\n * @returns the center between the two vectors\n */\n static Center(e, t) {\n return Ke.CenterToRef(e, t, Ke.Zero());\n }\n /**\n * Gets the center of the vectors \"value1\" and \"value2\" and stores the result in the vector \"ref\"\n * @param value1 defines first vector\n * @param value2 defines second vector\n * @param ref defines third vector\n * @returns ref\n */\n static CenterToRef(e, t, i) {\n return i.copyFromFloats((e.x + t.x) / 2, (e.y + t.y) / 2, (e.z + t.z) / 2, (e.w + t.w) / 2);\n }\n /**\n * Returns a new Vector4 set with the result of the transformation by the given matrix of the given vector.\n * This method computes tranformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\n * The difference with Vector3.TransformCoordinates is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead\n * @param vector defines the Vector3 to transform\n * @param transformation defines the transformation matrix\n * @returns the transformed Vector4\n */\n static TransformCoordinates(e, t) {\n const i = Ke.Zero();\n return Ke.TransformCoordinatesToRef(e, t, i), i;\n }\n /**\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given vector\n * This method computes tranformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\n * The difference with Vector3.TransformCoordinatesToRef is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead\n * @param vector defines the Vector3 to transform\n * @param transformation defines the transformation matrix\n * @param result defines the Vector4 where to store the result\n * @returns result input\n */\n static TransformCoordinatesToRef(e, t, i) {\n return Ke.TransformCoordinatesFromFloatsToRef(e._x, e._y, e._z, t, i), i;\n }\n /**\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given floats (x, y, z)\n * This method computes tranformed coordinates only, not transformed direction vectors\n * The difference with Vector3.TransformCoordinatesFromFloatsToRef is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead\n * @param x define the x coordinate of the source vector\n * @param y define the y coordinate of the source vector\n * @param z define the z coordinate of the source vector\n * @param transformation defines the transformation matrix\n * @param result defines the Vector4 where to store the result\n * @returns result input\n */\n static TransformCoordinatesFromFloatsToRef(e, t, i, r, s) {\n const a = r.m, o = e * a[0] + t * a[4] + i * a[8] + a[12], l = e * a[1] + t * a[5] + i * a[9] + a[13], c = e * a[2] + t * a[6] + i * a[10] + a[14], h = e * a[3] + t * a[7] + i * a[11] + a[15];\n return s.x = o, s.y = l, s.z = c, s.w = h, s;\n }\n /**\n * Returns a new Vector4 set with the result of the normal transformation by the given matrix of the given vector.\n * This methods computes transformed normalized direction vectors only.\n * @param vector the vector to transform\n * @param transformation the transformation matrix to apply\n * @returns the new vector\n */\n static TransformNormal(e, t) {\n const i = new e.constructor();\n return Ke.TransformNormalToRef(e, t, i), i;\n }\n /**\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given vector.\n * This methods computes transformed normalized direction vectors only.\n * @param vector the vector to transform\n * @param transformation the transformation matrix to apply\n * @param result the vector to store the result in\n * @returns result input\n */\n static TransformNormalToRef(e, t, i) {\n const r = t.m, s = e.x * r[0] + e.y * r[4] + e.z * r[8], a = e.x * r[1] + e.y * r[5] + e.z * r[9], o = e.x * r[2] + e.y * r[6] + e.z * r[10];\n return i.x = s, i.y = a, i.z = o, i.w = e.w, i;\n }\n /**\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given floats (x, y, z, w).\n * This methods computes transformed normalized direction vectors only.\n * @param x value to transform\n * @param y value to transform\n * @param z value to transform\n * @param w value to transform\n * @param transformation the transformation matrix to apply\n * @param result the vector to store the results in\n * @returns result input\n */\n static TransformNormalFromFloatsToRef(e, t, i, r, s, a) {\n const o = s.m;\n return a.x = e * o[0] + t * o[4] + i * o[8], a.y = e * o[1] + t * o[5] + i * o[9], a.z = e * o[2] + t * o[6] + i * o[10], a.w = r, a;\n }\n /**\n * Creates a new Vector4 from a Vector3\n * @param source defines the source data\n * @param w defines the 4th component (default is 0)\n * @returns a new Vector4\n */\n static FromVector3(e, t = 0) {\n return new Ke(e._x, e._y, e._z, t);\n }\n /**\n * Returns the dot product (float) between the vectors \"left\" and \"right\"\n * @param left defines the left operand\n * @param right defines the right operand\n * @returns the dot product\n */\n static Dot(e, t) {\n return e.dot(t);\n }\n}\nKe._ZeroReadOnly = Ke.Zero();\nObject.defineProperties(Ke.prototype, {\n dimension: { value: [4] },\n rank: { value: 1 }\n});\nclass Ce {\n /** Gets or sets the x coordinate */\n get x() {\n return this._x;\n }\n set x(e) {\n this._x = e, this._isDirty = !0;\n }\n /** Gets or sets the y coordinate */\n get y() {\n return this._y;\n }\n set y(e) {\n this._y = e, this._isDirty = !0;\n }\n /** Gets or sets the z coordinate */\n get z() {\n return this._z;\n }\n set z(e) {\n this._z = e, this._isDirty = !0;\n }\n /** Gets or sets the w coordinate */\n get w() {\n return this._w;\n }\n set w(e) {\n this._w = e, this._isDirty = !0;\n }\n /**\n * Creates a new Quaternion from the given floats\n * @param x defines the first component (0 by default)\n * @param y defines the second component (0 by default)\n * @param z defines the third component (0 by default)\n * @param w defines the fourth component (1.0 by default)\n */\n constructor(e = 0, t = 0, i = 0, r = 1) {\n this._isDirty = !0, this._x = e, this._y = t, this._z = i, this._w = r;\n }\n /**\n * Gets a string representation for the current quaternion\n * @returns a string with the Quaternion coordinates\n */\n toString() {\n return `{X: ${this._x} Y: ${this._y} Z: ${this._z} W: ${this._w}}`;\n }\n /**\n * Gets the class name of the quaternion\n * @returns the string \"Quaternion\"\n */\n getClassName() {\n return \"Quaternion\";\n }\n /**\n * Gets a hash code for this quaternion\n * @returns the quaternion hash code\n */\n getHashCode() {\n const e = nr(this._x), t = nr(this._y), i = nr(this._z), r = nr(this._w);\n let s = e;\n return s = s * 397 ^ t, s = s * 397 ^ i, s = s * 397 ^ r, s;\n }\n /**\n * Copy the quaternion to an array\n * Example Playground https://playground.babylonjs.com/#L49EJ7#13\n * @returns a new array populated with 4 elements from the quaternion coordinates\n */\n asArray() {\n return [this._x, this._y, this._z, this._w];\n }\n /**\n * Stores from the starting index in the given array the Quaternion successive values\n * Example Playground https://playground.babylonjs.com/#L49EJ7#59\n * @param array defines the array where to store the x,y,z,w components\n * @param index defines an optional index in the target array to define where to start storing values\n * @returns the current Quaternion object\n */\n toArray(e, t = 0) {\n return e[t] = this._x, e[t + 1] = this._y, e[t + 2] = this._z, e[t + 3] = this._w, this;\n }\n fromArray(e, t = 0) {\n return Ce.FromArrayToRef(e, t, this);\n }\n /**\n * Check if two quaternions are equals\n * Example Playground https://playground.babylonjs.com/#L49EJ7#38\n * @param otherQuaternion defines the second operand\n * @returns true if the current quaternion and the given one coordinates are strictly equals\n */\n equals(e) {\n return e && this._x === e._x && this._y === e._y && this._z === e._z && this._w === e._w;\n }\n /**\n * Gets a boolean if two quaternions are equals (using an epsilon value)\n * Example Playground https://playground.babylonjs.com/#L49EJ7#37\n * @param otherQuaternion defines the other quaternion\n * @param epsilon defines the minimal distance to consider equality\n * @returns true if the given quaternion coordinates are close to the current ones by a distance of epsilon.\n */\n equalsWithEpsilon(e, t = xt) {\n return e && Ii(this._x, e._x, t) && Ii(this._y, e._y, t) && Ii(this._z, e._z, t) && Ii(this._w, e._w, t);\n }\n /**\n * Clone the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#12\n * @returns a new quaternion copied from the current one\n */\n clone() {\n return new this.constructor(this._x, this._y, this._z, this._w);\n }\n /**\n * Copy a quaternion to the current one\n * Example Playground https://playground.babylonjs.com/#L49EJ7#86\n * @param other defines the other quaternion\n * @returns the updated current quaternion\n */\n copyFrom(e) {\n return this._x = e._x, this._y = e._y, this._z = e._z, this._w = e._w, this._isDirty = !0, this;\n }\n /**\n * Updates the current quaternion with the given float coordinates\n * Example Playground https://playground.babylonjs.com/#L49EJ7#87\n * @param x defines the x coordinate\n * @param y defines the y coordinate\n * @param z defines the z coordinate\n * @param w defines the w coordinate\n * @returns the updated current quaternion\n */\n copyFromFloats(e, t, i, r) {\n return this._x = e, this._y = t, this._z = i, this._w = r, this._isDirty = !0, this;\n }\n /**\n * Updates the current quaternion from the given float coordinates\n * Example Playground https://playground.babylonjs.com/#L49EJ7#56\n * @param x defines the x coordinate\n * @param y defines the y coordinate\n * @param z defines the z coordinate\n * @param w defines the w coordinate\n * @returns the updated current quaternion\n */\n set(e, t, i, r) {\n return this.copyFromFloats(e, t, i, r);\n }\n setAll(e) {\n return this.copyFromFloats(e, e, e, e);\n }\n /**\n * Adds two quaternions\n * Example Playground https://playground.babylonjs.com/#L49EJ7#10\n * @param other defines the second operand\n * @returns a new quaternion as the addition result of the given one and the current quaternion\n */\n add(e) {\n return new this.constructor(this._x + e._x, this._y + e._y, this._z + e._z, this._w + e._w);\n }\n /**\n * Add a quaternion to the current one\n * Example Playground https://playground.babylonjs.com/#L49EJ7#11\n * @param other defines the quaternion to add\n * @returns the current quaternion\n */\n addInPlace(e) {\n return this._x += e._x, this._y += e._y, this._z += e._z, this._w += e._w, this._isDirty = !0, this;\n }\n addToRef(e, t) {\n return t._x = this._x + e._x, t._y = this._y + e._y, t._z = this._z + e._z, t._w = this._w + e._w, t._isDirty = !0, t;\n }\n addInPlaceFromFloats(e, t, i, r) {\n return this._x += e, this._y += t, this._z += i, this._w += r, this._isDirty = !0, this;\n }\n subtractToRef(e, t) {\n return t._x = this._x - e._x, t._y = this._y - e._y, t._z = this._z - e._z, t._w = this._w - e._w, t._isDirty = !0, t;\n }\n subtractFromFloats(e, t, i, r) {\n return this.subtractFromFloatsToRef(e, t, i, r, new this.constructor());\n }\n subtractFromFloatsToRef(e, t, i, r, s) {\n return s._x = this._x - e, s._y = this._y - t, s._z = this._z - i, s._w = this._w - r, s._isDirty = !0, s;\n }\n /**\n * Subtract two quaternions\n * Example Playground https://playground.babylonjs.com/#L49EJ7#57\n * @param other defines the second operand\n * @returns a new quaternion as the subtraction result of the given one from the current one\n */\n subtract(e) {\n return new this.constructor(this._x - e._x, this._y - e._y, this._z - e._z, this._w - e._w);\n }\n /**\n * Subtract a quaternion to the current one\n * Example Playground https://playground.babylonjs.com/#L49EJ7#58\n * @param other defines the quaternion to subtract\n * @returns the current quaternion\n */\n subtractInPlace(e) {\n return this._x -= e._x, this._y -= e._y, this._z -= e._z, this._w -= e._w, this._isDirty = !0, this;\n }\n /**\n * Multiplies the current quaternion by a scale factor\n * Example Playground https://playground.babylonjs.com/#L49EJ7#88\n * @param value defines the scale factor\n * @returns a new quaternion set by multiplying the current quaternion coordinates by the float \"scale\"\n */\n scale(e) {\n return new this.constructor(this._x * e, this._y * e, this._z * e, this._w * e);\n }\n /**\n * Scale the current quaternion values by a factor and stores the result to a given quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#89\n * @param scale defines the scale factor\n * @param result defines the Quaternion object where to store the result\n * @returns result input\n */\n scaleToRef(e, t) {\n return t._x = this._x * e, t._y = this._y * e, t._z = this._z * e, t._w = this._w * e, t._isDirty = !0, t;\n }\n /**\n * Multiplies in place the current quaternion by a scale factor\n * Example Playground https://playground.babylonjs.com/#L49EJ7#90\n * @param value defines the scale factor\n * @returns the current modified quaternion\n */\n scaleInPlace(e) {\n return this._x *= e, this._y *= e, this._z *= e, this._w *= e, this._isDirty = !0, this;\n }\n /**\n * Scale the current quaternion values by a factor and add the result to a given quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#91\n * @param scale defines the scale factor\n * @param result defines the Quaternion object where to store the result\n * @returns result input\n */\n scaleAndAddToRef(e, t) {\n return t._x += this._x * e, t._y += this._y * e, t._z += this._z * e, t._w += this._w * e, t._isDirty = !0, t;\n }\n /**\n * Multiplies two quaternions\n * Example Playground https://playground.babylonjs.com/#L49EJ7#43\n * @param q1 defines the second operand\n * @returns a new quaternion set as the multiplication result of the current one with the given one \"q1\"\n */\n multiply(e) {\n const t = new this.constructor(0, 0, 0, 1);\n return this.multiplyToRef(e, t), t;\n }\n /**\n * Sets the given \"result\" as the multiplication result of the current one with the given one \"q1\"\n * Example Playground https://playground.babylonjs.com/#L49EJ7#45\n * @param q1 defines the second operand\n * @param result defines the target quaternion\n * @returns the current quaternion\n */\n multiplyToRef(e, t) {\n const i = this._x * e._w + this._y * e._z - this._z * e._y + this._w * e._x, r = -this._x * e._z + this._y * e._w + this._z * e._x + this._w * e._y, s = this._x * e._y - this._y * e._x + this._z * e._w + this._w * e._z, a = -this._x * e._x - this._y * e._y - this._z * e._z + this._w * e._w;\n return t.copyFromFloats(i, r, s, a), t;\n }\n /**\n * Updates the current quaternion with the multiplication of itself with the given one \"q1\"\n * Example Playground https://playground.babylonjs.com/#L49EJ7#46\n * @param other defines the second operand\n * @returns the currentupdated quaternion\n */\n multiplyInPlace(e) {\n return this.multiplyToRef(e, this);\n }\n multiplyByFloats(e, t, i, r) {\n return this._x *= e, this._y *= t, this._z *= i, this._w *= r, this._isDirty = !0, this;\n }\n /**\n * @internal\n * Do not use\n */\n divide(e) {\n throw new ReferenceError(\"Can not divide a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n divideToRef(e, t) {\n throw new ReferenceError(\"Can not divide a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n divideInPlace(e) {\n throw new ReferenceError(\"Can not divide a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n minimizeInPlace() {\n throw new ReferenceError(\"Can not minimize a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n minimizeInPlaceFromFloats() {\n throw new ReferenceError(\"Can not minimize a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n maximizeInPlace() {\n throw new ReferenceError(\"Can not maximize a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n maximizeInPlaceFromFloats() {\n throw new ReferenceError(\"Can not maximize a quaternion\");\n }\n negate() {\n return this.negateToRef(new this.constructor());\n }\n negateInPlace() {\n return this._x = -this._x, this._y = -this._y, this._z = -this._z, this._w = -this._w, this._isDirty = !0, this;\n }\n negateToRef(e) {\n return e._x = -this._x, e._y = -this._y, e._z = -this._z, e._w = -this._w, e._isDirty = !0, e;\n }\n equalsToFloats(e, t, i, r) {\n return this._x === e && this._y === t && this._z === i && this._w === r;\n }\n /**\n * @internal\n * Do not use\n */\n floorToRef(e) {\n throw new ReferenceError(\"Can not floor a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n floor() {\n throw new ReferenceError(\"Can not floor a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n fractToRef(e) {\n throw new ReferenceError(\"Can not fract a quaternion\");\n }\n /**\n * @internal\n * Do not use\n */\n fract() {\n throw new ReferenceError(\"Can not fract a quaternion\");\n }\n /**\n * Conjugates the current quaternion and stores the result in the given quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#81\n * @param ref defines the target quaternion\n * @returns result input\n */\n conjugateToRef(e) {\n return e.copyFromFloats(-this._x, -this._y, -this._z, this._w), e;\n }\n /**\n * Conjugates in place the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#82\n * @returns the current updated quaternion\n */\n conjugateInPlace() {\n return this._x *= -1, this._y *= -1, this._z *= -1, this._isDirty = !0, this;\n }\n /**\n * Conjugates (1-q) the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#83\n * @returns a new quaternion\n */\n conjugate() {\n return new this.constructor(-this._x, -this._y, -this._z, this._w);\n }\n /**\n * Returns the inverse of the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#84\n * @returns a new quaternion\n */\n invert() {\n const e = this.conjugate(), t = this.lengthSquared();\n return t == 0 || t == 1 || e.scaleInPlace(1 / t), e;\n }\n /**\n * Invert in place the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#85\n * @returns this quaternion\n */\n invertInPlace() {\n this.conjugateInPlace();\n const e = this.lengthSquared();\n return e == 0 || e == 1 ? this : (this.scaleInPlace(1 / e), this);\n }\n /**\n * Gets squared length of current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#29\n * @returns the quaternion length (float)\n */\n lengthSquared() {\n return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n }\n /**\n * Gets length of current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#28\n * @returns the quaternion length (float)\n */\n length() {\n return Math.sqrt(this.lengthSquared());\n }\n /**\n * Normalize in place the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#54\n * @returns the current updated quaternion\n */\n normalize() {\n return this.normalizeFromLength(this.length());\n }\n /**\n * Normalize the current quaternion with the given input length.\n * Please note that this is an in place operation.\n * @param len the length of the quaternion\n * @returns the current updated Quaternion\n */\n normalizeFromLength(e) {\n return e === 0 || e === 1 ? this : this.scaleInPlace(1 / e);\n }\n /**\n * Normalize a copy of the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#55\n * @returns the normalized quaternion\n */\n normalizeToNew() {\n const e = new this.constructor(0, 0, 0, 1);\n return this.normalizeToRef(e), e;\n }\n /**\n * Normalize the current Quaternion to the reference\n * @param reference define the Quaternion to update\n * @returns the updated Quaternion\n */\n normalizeToRef(e) {\n const t = this.length();\n return t === 0 || t === 1 ? e.copyFromFloats(this._x, this._y, this._z, this._w) : this.scaleToRef(1 / t, e);\n }\n /**\n * Returns a new Vector3 set with the Euler angles translated from the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#32\n * @returns a new Vector3 containing the Euler angles\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/rotation_conventions\n */\n toEulerAngles() {\n const e = _.Zero();\n return this.toEulerAnglesToRef(e), e;\n }\n /**\n * Sets the given vector3 \"result\" with the Euler angles translated from the current quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#31\n * @param result defines the vector which will be filled with the Euler angles\n * @returns result input\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/rotation_conventions\n */\n toEulerAnglesToRef(e) {\n const t = this._z, i = this._x, r = this._y, s = this._w, a = r * t - i * s, o = 0.4999999;\n if (a < -o)\n e._y = 2 * Math.atan2(r, s), e._x = Math.PI / 2, e._z = 0, e._isDirty = !0;\n else if (a > o)\n e._y = 2 * Math.atan2(r, s), e._x = -Math.PI / 2, e._z = 0, e._isDirty = !0;\n else {\n const l = s * s, c = t * t, h = i * i, u = r * r;\n e._z = Math.atan2(2 * (i * r + t * s), -c - h + u + l), e._x = Math.asin(-2 * a), e._y = Math.atan2(2 * (t * i + r * s), c - h - u + l), e._isDirty = !0;\n }\n return e;\n }\n /**\n * Updates the given rotation matrix with the current quaternion values\n * Example Playground https://playground.babylonjs.com/#L49EJ7#67\n * @param result defines the target matrix\n * @returns the updated matrix with the rotation\n */\n toRotationMatrix(e) {\n return L.FromQuaternionToRef(this, e), e;\n }\n /**\n * Updates the current quaternion from the given rotation matrix values\n * Example Playground https://playground.babylonjs.com/#L49EJ7#41\n * @param matrix defines the source matrix\n * @returns the current updated quaternion\n */\n fromRotationMatrix(e) {\n return Ce.FromRotationMatrixToRef(e, this), this;\n }\n /**\n * Returns the dot product (float) between the current quaternions and \"other\"\n * @param other defines the right operand\n * @returns the dot product\n */\n dot(e) {\n return this._x * e._x + this._y * e._y + this._z * e._z + this._w * e._w;\n }\n // Statics\n /**\n * Creates a new quaternion from a rotation matrix\n * Example Playground https://playground.babylonjs.com/#L49EJ7#101\n * @param matrix defines the source matrix\n * @returns a new quaternion created from the given rotation matrix values\n */\n static FromRotationMatrix(e) {\n const t = new Ce();\n return Ce.FromRotationMatrixToRef(e, t), t;\n }\n /**\n * Updates the given quaternion with the given rotation matrix values\n * Example Playground https://playground.babylonjs.com/#L49EJ7#102\n * @param matrix defines the source matrix\n * @param result defines the target quaternion\n * @returns result input\n */\n static FromRotationMatrixToRef(e, t) {\n const i = e.m, r = i[0], s = i[4], a = i[8], o = i[1], l = i[5], c = i[9], h = i[2], u = i[6], f = i[10], d = r + l + f;\n let p;\n return d > 0 ? (p = 0.5 / Math.sqrt(d + 1), t._w = 0.25 / p, t._x = (u - c) * p, t._y = (a - h) * p, t._z = (o - s) * p, t._isDirty = !0) : r > l && r > f ? (p = 2 * Math.sqrt(1 + r - l - f), t._w = (u - c) / p, t._x = 0.25 * p, t._y = (s + o) / p, t._z = (a + h) / p, t._isDirty = !0) : l > f ? (p = 2 * Math.sqrt(1 + l - r - f), t._w = (a - h) / p, t._x = (s + o) / p, t._y = 0.25 * p, t._z = (c + u) / p, t._isDirty = !0) : (p = 2 * Math.sqrt(1 + f - r - l), t._w = (o - s) / p, t._x = (a + h) / p, t._y = (c + u) / p, t._z = 0.25 * p, t._isDirty = !0), t;\n }\n /**\n * Returns the dot product (float) between the quaternions \"left\" and \"right\"\n * Example Playground https://playground.babylonjs.com/#L49EJ7#61\n * @param left defines the left operand\n * @param right defines the right operand\n * @returns the dot product\n */\n static Dot(e, t) {\n return e._x * t._x + e._y * t._y + e._z * t._z + e._w * t._w;\n }\n /**\n * Checks if the orientations of two rotation quaternions are close to each other\n * Example Playground https://playground.babylonjs.com/#L49EJ7#60\n * @param quat0 defines the first quaternion to check\n * @param quat1 defines the second quaternion to check\n * @param epsilon defines closeness, 0 same orientation, 1 PI apart, default 0.1\n * @returns true if the two quaternions are close to each other within epsilon\n */\n static AreClose(e, t, i = 0.1) {\n const r = Ce.Dot(e, t);\n return 1 - r * r <= i;\n }\n /**\n * Smooth interpolation between two quaternions using Slerp\n * Example Playground https://playground.babylonjs.com/#L49EJ7#93\n * @param source source quaternion\n * @param goal goal quaternion\n * @param deltaTime current interpolation frame\n * @param lerpTime total interpolation time\n * @param result the smoothed quaternion\n * @returns the smoothed quaternion\n */\n static SmoothToRef(e, t, i, r, s) {\n let a = r === 0 ? 1 : i / r;\n return a = ii(a, 0, 1), Ce.SlerpToRef(e, t, a, s), s;\n }\n /**\n * Creates an empty quaternion\n * @returns a new quaternion set to (0.0, 0.0, 0.0)\n */\n static Zero() {\n return new Ce(0, 0, 0, 0);\n }\n /**\n * Inverse a given quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#103\n * @param q defines the source quaternion\n * @returns a new quaternion as the inverted current quaternion\n */\n static Inverse(e) {\n return new e.constructor(-e._x, -e._y, -e._z, e._w);\n }\n /**\n * Inverse a given quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#104\n * @param q defines the source quaternion\n * @param result the quaternion the result will be stored in\n * @returns the result quaternion\n */\n static InverseToRef(e, t) {\n return t.set(-e._x, -e._y, -e._z, e._w), t;\n }\n /**\n * Creates an identity quaternion\n * @returns the identity quaternion\n */\n static Identity() {\n return new Ce(0, 0, 0, 1);\n }\n /**\n * Gets a boolean indicating if the given quaternion is identity\n * @param quaternion defines the quaternion to check\n * @returns true if the quaternion is identity\n */\n static IsIdentity(e) {\n return e && e._x === 0 && e._y === 0 && e._z === 0 && e._w === 1;\n }\n /**\n * Creates a quaternion from a rotation around an axis\n * Example Playground https://playground.babylonjs.com/#L49EJ7#72\n * @param axis defines the axis to use\n * @param angle defines the angle to use\n * @returns a new quaternion created from the given axis (Vector3) and angle in radians (float)\n */\n static RotationAxis(e, t) {\n return Ce.RotationAxisToRef(e, t, new Ce());\n }\n /**\n * Creates a rotation around an axis and stores it into the given quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#73\n * @param axis defines the axis to use\n * @param angle defines the angle to use\n * @param result defines the target quaternion\n * @returns the target quaternion\n */\n static RotationAxisToRef(e, t, i) {\n const r = Math.sin(t / 2);\n return e.normalize(), i._w = Math.cos(t / 2), i._x = e._x * r, i._y = e._y * r, i._z = e._z * r, i._isDirty = !0, i;\n }\n /**\n * Creates a new quaternion from data stored into an array\n * Example Playground https://playground.babylonjs.com/#L49EJ7#63\n * @param array defines the data source\n * @param offset defines the offset in the source array where the data starts\n * @returns a new quaternion\n */\n static FromArray(e, t) {\n return t || (t = 0), new Ce(e[t], e[t + 1], e[t + 2], e[t + 3]);\n }\n /**\n * Updates the given quaternion \"result\" from the starting index of the given array.\n * Example Playground https://playground.babylonjs.com/#L49EJ7#64\n * @param array the array to pull values from\n * @param offset the offset into the array to start at\n * @param result the quaternion to store the result in\n * @returns result input\n */\n static FromArrayToRef(e, t, i) {\n return i._x = e[t], i._y = e[t + 1], i._z = e[t + 2], i._w = e[t + 3], i._isDirty = !0, i;\n }\n /**\n * Sets the given quaternion \"result\" with the given floats.\n * @param x defines the x coordinate of the source\n * @param y defines the y coordinate of the source\n * @param z defines the z coordinate of the source\n * @param w defines the w coordinate of the source\n * @param result defines the quaternion where to store the result\n * @returns the result quaternion\n */\n static FromFloatsToRef(e, t, i, r, s) {\n return s.copyFromFloats(e, t, i, r), s;\n }\n /**\n * Create a quaternion from Euler rotation angles\n * Example Playground https://playground.babylonjs.com/#L49EJ7#33\n * @param x Pitch\n * @param y Yaw\n * @param z Roll\n * @returns the new Quaternion\n */\n static FromEulerAngles(e, t, i) {\n const r = new Ce();\n return Ce.RotationYawPitchRollToRef(t, e, i, r), r;\n }\n /**\n * Updates a quaternion from Euler rotation angles\n * Example Playground https://playground.babylonjs.com/#L49EJ7#34\n * @param x Pitch\n * @param y Yaw\n * @param z Roll\n * @param result the quaternion to store the result\n * @returns the updated quaternion\n */\n static FromEulerAnglesToRef(e, t, i, r) {\n return Ce.RotationYawPitchRollToRef(t, e, i, r), r;\n }\n /**\n * Create a quaternion from Euler rotation vector\n * Example Playground https://playground.babylonjs.com/#L49EJ7#35\n * @param vec the Euler vector (x Pitch, y Yaw, z Roll)\n * @returns the new Quaternion\n */\n static FromEulerVector(e) {\n const t = new Ce();\n return Ce.RotationYawPitchRollToRef(e._y, e._x, e._z, t), t;\n }\n /**\n * Updates a quaternion from Euler rotation vector\n * Example Playground https://playground.babylonjs.com/#L49EJ7#36\n * @param vec the Euler vector (x Pitch, y Yaw, z Roll)\n * @param result the quaternion to store the result\n * @returns the updated quaternion\n */\n static FromEulerVectorToRef(e, t) {\n return Ce.RotationYawPitchRollToRef(e._y, e._x, e._z, t), t;\n }\n /**\n * Updates a quaternion so that it rotates vector vecFrom to vector vecTo\n * Example Playground - https://playground.babylonjs.com/#L49EJ7#70\n * @param vecFrom defines the direction vector from which to rotate\n * @param vecTo defines the direction vector to which to rotate\n * @param result the quaternion to store the result\n * @param epsilon defines the minimal dot value to define vecs as opposite. Default: `BABYLON.Epsilon`\n * @returns the updated quaternion\n */\n static FromUnitVectorsToRef(e, t, i, r = xt) {\n const s = _.Dot(e, t) + 1;\n return s < r ? Math.abs(e.x) > Math.abs(e.z) ? i.set(-e.y, e.x, 0, 0) : i.set(0, -e.z, e.y, 0) : (_.CrossToRef(e, t, z.Vector3[0]), i.set(z.Vector3[0].x, z.Vector3[0].y, z.Vector3[0].z, s)), i.normalize();\n }\n /**\n * Creates a new quaternion from the given Euler float angles (y, x, z)\n * Example Playground https://playground.babylonjs.com/#L49EJ7#77\n * @param yaw defines the rotation around Y axis\n * @param pitch defines the rotation around X axis\n * @param roll defines the rotation around Z axis\n * @returns the new quaternion\n */\n static RotationYawPitchRoll(e, t, i) {\n const r = new Ce();\n return Ce.RotationYawPitchRollToRef(e, t, i, r), r;\n }\n /**\n * Creates a new rotation from the given Euler float angles (y, x, z) and stores it in the target quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#78\n * @param yaw defines the rotation around Y axis\n * @param pitch defines the rotation around X axis\n * @param roll defines the rotation around Z axis\n * @param result defines the target quaternion\n * @returns result input\n */\n static RotationYawPitchRollToRef(e, t, i, r) {\n const s = i * 0.5, a = t * 0.5, o = e * 0.5, l = Math.sin(s), c = Math.cos(s), h = Math.sin(a), u = Math.cos(a), f = Math.sin(o), d = Math.cos(o);\n return r._x = d * h * c + f * u * l, r._y = f * u * c - d * h * l, r._z = d * u * l - f * h * c, r._w = d * u * c + f * h * l, r._isDirty = !0, r;\n }\n /**\n * Creates a new quaternion from the given Euler float angles expressed in z-x-z orientation\n * Example Playground https://playground.babylonjs.com/#L49EJ7#68\n * @param alpha defines the rotation around first axis\n * @param beta defines the rotation around second axis\n * @param gamma defines the rotation around third axis\n * @returns the new quaternion\n */\n static RotationAlphaBetaGamma(e, t, i) {\n const r = new Ce();\n return Ce.RotationAlphaBetaGammaToRef(e, t, i, r), r;\n }\n /**\n * Creates a new quaternion from the given Euler float angles expressed in z-x-z orientation and stores it in the target quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#69\n * @param alpha defines the rotation around first axis\n * @param beta defines the rotation around second axis\n * @param gamma defines the rotation around third axis\n * @param result defines the target quaternion\n * @returns result input\n */\n static RotationAlphaBetaGammaToRef(e, t, i, r) {\n const s = (i + e) * 0.5, a = (i - e) * 0.5, o = t * 0.5;\n return r._x = Math.cos(a) * Math.sin(o), r._y = Math.sin(a) * Math.sin(o), r._z = Math.sin(s) * Math.cos(o), r._w = Math.cos(s) * Math.cos(o), r._isDirty = !0, r;\n }\n /**\n * Creates a new quaternion containing the rotation value to reach the target (axis1, axis2, axis3) orientation as a rotated XYZ system (axis1, axis2 and axis3 are normalized during this operation)\n * Example Playground https://playground.babylonjs.com/#L49EJ7#75\n * @param axis1 defines the first axis\n * @param axis2 defines the second axis\n * @param axis3 defines the third axis\n * @returns the new quaternion\n */\n static RotationQuaternionFromAxis(e, t, i) {\n const r = new Ce(0, 0, 0, 0);\n return Ce.RotationQuaternionFromAxisToRef(e, t, i, r), r;\n }\n /**\n * Creates a rotation value to reach the target (axis1, axis2, axis3) orientation as a rotated XYZ system (axis1, axis2 and axis3 are normalized during this operation) and stores it in the target quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#76\n * @param axis1 defines the first axis\n * @param axis2 defines the second axis\n * @param axis3 defines the third axis\n * @param ref defines the target quaternion\n * @returns result input\n */\n static RotationQuaternionFromAxisToRef(e, t, i, r) {\n const s = be.Matrix[0];\n return L.FromXYZAxesToRef(e.normalize(), t.normalize(), i.normalize(), s), Ce.FromRotationMatrixToRef(s, r), r;\n }\n /**\n * Creates a new rotation value to orient an object to look towards the given forward direction, the up direction being oriented like \"up\".\n * This function works in left handed mode\n * Example Playground https://playground.babylonjs.com/#L49EJ7#96\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @returns A new quaternion oriented toward the specified forward and up.\n */\n static FromLookDirectionLH(e, t) {\n const i = new Ce();\n return Ce.FromLookDirectionLHToRef(e, t, i), i;\n }\n /**\n * Creates a new rotation value to orient an object to look towards the given forward direction with the up direction being oriented like \"up\", and stores it in the target quaternion.\n * This function works in left handed mode\n * Example Playground https://playground.babylonjs.com/#L49EJ7#97\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @param ref defines the target quaternion.\n * @returns result input\n */\n static FromLookDirectionLHToRef(e, t, i) {\n const r = be.Matrix[0];\n return L.LookDirectionLHToRef(e, t, r), Ce.FromRotationMatrixToRef(r, i), i;\n }\n /**\n * Creates a new rotation value to orient an object to look towards the given forward direction, the up direction being oriented like \"up\".\n * This function works in right handed mode\n * Example Playground https://playground.babylonjs.com/#L49EJ7#98\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @returns A new quaternion oriented toward the specified forward and up.\n */\n static FromLookDirectionRH(e, t) {\n const i = new Ce();\n return Ce.FromLookDirectionRHToRef(e, t, i), i;\n }\n /**\n * Creates a new rotation value to orient an object to look towards the given forward direction with the up direction being oriented like \"up\", and stores it in the target quaternion.\n * This function works in right handed mode\n * Example Playground https://playground.babylonjs.com/#L49EJ7#105\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @param ref defines the target quaternion.\n * @returns result input\n */\n static FromLookDirectionRHToRef(e, t, i) {\n const r = be.Matrix[0];\n return L.LookDirectionRHToRef(e, t, r), Ce.FromRotationMatrixToRef(r, i);\n }\n /**\n * Interpolates between two quaternions\n * Example Playground https://playground.babylonjs.com/#L49EJ7#79\n * @param left defines first quaternion\n * @param right defines second quaternion\n * @param amount defines the gradient to use\n * @returns the new interpolated quaternion\n */\n static Slerp(e, t, i) {\n const r = Ce.Identity();\n return Ce.SlerpToRef(e, t, i, r), r;\n }\n /**\n * Interpolates between two quaternions and stores it into a target quaternion\n * Example Playground https://playground.babylonjs.com/#L49EJ7#92\n * @param left defines first quaternion\n * @param right defines second quaternion\n * @param amount defines the gradient to use\n * @param result defines the target quaternion\n * @returns result input\n */\n static SlerpToRef(e, t, i, r) {\n let s, a, o = e._x * t._x + e._y * t._y + e._z * t._z + e._w * t._w, l = !1;\n if (o < 0 && (l = !0, o = -o), o > 0.999999)\n a = 1 - i, s = l ? -i : i;\n else {\n const c = Math.acos(o), h = 1 / Math.sin(c);\n a = Math.sin((1 - i) * c) * h, s = l ? -Math.sin(i * c) * h : Math.sin(i * c) * h;\n }\n return r._x = a * e._x + s * t._x, r._y = a * e._y + s * t._y, r._z = a * e._z + s * t._z, r._w = a * e._w + s * t._w, r._isDirty = !0, r;\n }\n /**\n * Interpolate between two quaternions using Hermite interpolation\n * Example Playground https://playground.babylonjs.com/#L49EJ7#47\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#hermite-quaternion-spline\n * @param value1 defines first quaternion\n * @param tangent1 defines the incoming tangent\n * @param value2 defines second quaternion\n * @param tangent2 defines the outgoing tangent\n * @param amount defines the target quaternion\n * @returns the new interpolated quaternion\n */\n static Hermite(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 2 * o - 3 * a + 1, c = -2 * o + 3 * a, h = o - 2 * a + s, u = o - a, f = e._x * l + i._x * c + t._x * h + r._x * u, d = e._y * l + i._y * c + t._y * h + r._y * u, p = e._z * l + i._z * c + t._z * h + r._z * u, g = e._w * l + i._w * c + t._w * h + r._w * u;\n return new e.constructor(f, d, p, g);\n }\n /**\n * Returns a new Quaternion which is the 1st derivative of the Hermite spline defined by the quaternions \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * Example Playground https://playground.babylonjs.com/#L49EJ7#48\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @returns 1st derivative\n */\n static Hermite1stDerivative(e, t, i, r, s) {\n const a = new e.constructor();\n return this.Hermite1stDerivativeToRef(e, t, i, r, s, a), a;\n }\n /**\n * Update a Quaternion with the 1st derivative of the Hermite spline defined by the quaternions \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * Example Playground https://playground.babylonjs.com/#L49EJ7#49\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @param result define where to store the derivative\n * @returns result input\n */\n static Hermite1stDerivativeToRef(e, t, i, r, s, a) {\n const o = s * s;\n return a._x = (o - s) * 6 * e._x + (3 * o - 4 * s + 1) * t._x + (-o + s) * 6 * i._x + (3 * o - 2 * s) * r._x, a._y = (o - s) * 6 * e._y + (3 * o - 4 * s + 1) * t._y + (-o + s) * 6 * i._y + (3 * o - 2 * s) * r._y, a._z = (o - s) * 6 * e._z + (3 * o - 4 * s + 1) * t._z + (-o + s) * 6 * i._z + (3 * o - 2 * s) * r._z, a._w = (o - s) * 6 * e._w + (3 * o - 4 * s + 1) * t._w + (-o + s) * 6 * i._w + (3 * o - 2 * s) * r._w, a._isDirty = !0, a;\n }\n /**\n * Returns a new Quaternion as the normalization of the given Quaternion\n * @param quat defines the Quaternion to normalize\n * @returns the new Quaternion\n */\n static Normalize(e) {\n const t = Ce.Zero();\n return Ce.NormalizeToRef(e, t), t;\n }\n /**\n * Sets the given Quaternion \"result\" with the normalization of the given first Quaternion\n * @param quat defines the Quaternion to normalize\n * @param result defines the Quaternion where to store the result\n * @returns result input\n */\n static NormalizeToRef(e, t) {\n return e.normalizeToRef(t), t;\n }\n /**\n * Returns a new Quaternion set with the coordinates of \"value\", if the quaternion \"value\" is in the cube defined by the quaternions \"min\" and \"max\"\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\n * @param value defines the current value\n * @param min defines the lower range value\n * @param max defines the upper range value\n * @returns the new Quaternion\n */\n static Clamp(e, t, i) {\n const r = new e.constructor();\n return Ce.ClampToRef(e, t, i, r), r;\n }\n /**\n * Sets the given quaternion \"result\" with the coordinates of \"value\", if the quaternion \"value\" is in the cube defined by the quaternions \"min\" and \"max\"\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\n * @param value defines the current value\n * @param min defines the lower range value\n * @param max defines the upper range value\n * @param result defines the Quaternion where to store the result\n * @returns result input\n */\n static ClampToRef(e, t, i, r) {\n return r.copyFromFloats(ii(e.x, t.x, i.x), ii(e.y, t.y, i.y), ii(e.z, t.z, i.z), ii(e.w, t.w, i.w));\n }\n /**\n * Returns a new Quaternion with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @returns a Quaternion with random values between min and max\n */\n static Random(e = 0, t = 1) {\n return new Ce(jt(e, t), jt(e, t), jt(e, t), jt(e, t));\n }\n /**\n * Sets a Quaternion with random values between min and max\n * @param min the minimum random value\n * @param max the maximum random value\n * @param ref the ref to store the values in\n * @returns the ref with random values between min and max\n */\n static RandomToRef(e = 0, t = 1, i) {\n return i.copyFromFloats(jt(e, t), jt(e, t), jt(e, t), jt(e, t));\n }\n /**\n * Do not use\n * @internal\n */\n static Minimize() {\n throw new ReferenceError(\"Quaternion.Minimize does not make sense\");\n }\n /**\n * Do not use\n * @internal\n */\n static Maximize() {\n throw new ReferenceError(\"Quaternion.Maximize does not make sense\");\n }\n /**\n * Returns the distance (float) between the quaternions \"value1\" and \"value2\".\n * @param value1 value to calulate the distance between\n * @param value2 value to calulate the distance between\n * @returns the distance between the two quaternions\n */\n static Distance(e, t) {\n return Math.sqrt(Ce.DistanceSquared(e, t));\n }\n /**\n * Returns the squared distance (float) between the quaternions \"value1\" and \"value2\".\n * @param value1 value to calulate the distance between\n * @param value2 value to calulate the distance between\n * @returns the distance between the two quaternions squared\n */\n static DistanceSquared(e, t) {\n const i = e.x - t.x, r = e.y - t.y, s = e.z - t.z, a = e.w - t.w;\n return i * i + r * r + s * s + a * a;\n }\n /**\n * Returns a new Quaternion located at the center between the quaternions \"value1\" and \"value2\".\n * @param value1 value to calulate the center between\n * @param value2 value to calulate the center between\n * @returns the center between the two quaternions\n */\n static Center(e, t) {\n return Ce.CenterToRef(e, t, Ce.Zero());\n }\n /**\n * Gets the center of the quaternions \"value1\" and \"value2\" and stores the result in the quaternion \"ref\"\n * @param value1 defines first quaternion\n * @param value2 defines second quaternion\n * @param ref defines third quaternion\n * @returns ref\n */\n static CenterToRef(e, t, i) {\n return i.copyFromFloats((e.x + t.x) / 2, (e.y + t.y) / 2, (e.z + t.z) / 2, (e.w + t.w) / 2);\n }\n}\nObject.defineProperties(Ce.prototype, {\n dimension: { value: [4] },\n rank: { value: 1 }\n});\nclass L {\n /**\n * Gets the precision of matrix computations\n */\n static get Use64Bits() {\n return gi.MatrixUse64Bits;\n }\n /**\n * Gets the internal data of the matrix\n */\n get m() {\n return this._m;\n }\n /**\n * Update the updateFlag to indicate that the matrix has been updated\n */\n markAsUpdated() {\n this.updateFlag = L._UpdateFlagSeed++, this._isIdentity = !1, this._isIdentity3x2 = !1, this._isIdentityDirty = !0, this._isIdentity3x2Dirty = !0;\n }\n _updateIdentityStatus(e, t = !1, i = !1, r = !0) {\n this._isIdentity = e, this._isIdentity3x2 = e || i, this._isIdentityDirty = this._isIdentity ? !1 : t, this._isIdentity3x2Dirty = this._isIdentity3x2 ? !1 : r;\n }\n /**\n * Creates an empty matrix (filled with zeros)\n */\n constructor() {\n this._isIdentity = !1, this._isIdentityDirty = !0, this._isIdentity3x2 = !0, this._isIdentity3x2Dirty = !0, this.updateFlag = -1, gi.MatrixTrackPrecisionChange && gi.MatrixTrackedMatrices.push(this), this._m = new gi.MatrixCurrentType(16), this.markAsUpdated();\n }\n // Properties\n /**\n * Check if the current matrix is identity\n * @returns true is the matrix is the identity matrix\n */\n isIdentity() {\n if (this._isIdentityDirty) {\n this._isIdentityDirty = !1;\n const e = this._m;\n this._isIdentity = e[0] === 1 && e[1] === 0 && e[2] === 0 && e[3] === 0 && e[4] === 0 && e[5] === 1 && e[6] === 0 && e[7] === 0 && e[8] === 0 && e[9] === 0 && e[10] === 1 && e[11] === 0 && e[12] === 0 && e[13] === 0 && e[14] === 0 && e[15] === 1;\n }\n return this._isIdentity;\n }\n /**\n * Check if the current matrix is identity as a texture matrix (3x2 store in 4x4)\n * @returns true is the matrix is the identity matrix\n */\n isIdentityAs3x2() {\n return this._isIdentity3x2Dirty && (this._isIdentity3x2Dirty = !1, this._m[0] !== 1 || this._m[5] !== 1 || this._m[15] !== 1 ? this._isIdentity3x2 = !1 : this._m[1] !== 0 || this._m[2] !== 0 || this._m[3] !== 0 || this._m[4] !== 0 || this._m[6] !== 0 || this._m[7] !== 0 || this._m[8] !== 0 || this._m[9] !== 0 || this._m[10] !== 0 || this._m[11] !== 0 || this._m[12] !== 0 || this._m[13] !== 0 || this._m[14] !== 0 ? this._isIdentity3x2 = !1 : this._isIdentity3x2 = !0), this._isIdentity3x2;\n }\n /**\n * Gets the determinant of the matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#34\n * @returns the matrix determinant\n */\n determinant() {\n if (this._isIdentity === !0)\n return 1;\n const e = this._m, t = e[0], i = e[1], r = e[2], s = e[3], a = e[4], o = e[5], l = e[6], c = e[7], h = e[8], u = e[9], f = e[10], d = e[11], p = e[12], g = e[13], m = e[14], v = e[15], E = f * v - m * d, C = u * v - g * d, T = u * m - g * f, R = h * v - p * d, x = h * m - f * p, S = h * g - p * u, M = +(o * E - l * C + c * T), N = -(a * E - l * R + c * x), F = +(a * C - o * R + c * S), U = -(a * T - o * x + l * S);\n return t * M + i * N + r * F + s * U;\n }\n // Methods\n /**\n * Gets a string with the Matrix values\n * @returns a string with the Matrix values\n */\n toString() {\n return `{${this.m[0]}, ${this.m[1]}, ${this.m[2]}, ${this.m[3]}\n${this.m[4]}, ${this.m[5]}, ${this.m[6]}, ${this.m[7]}\n${this.m[8]}, ${this.m[9]}, ${this.m[10]}, ${this.m[11]}\n${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`;\n }\n toArray(e = null, t = 0) {\n if (!e)\n return this._m;\n const i = this._m;\n for (let r = 0; r < 16; r++)\n e[t + r] = i[r];\n return this;\n }\n /**\n * Returns the matrix as a Float32Array or Array\n * Example Playground - https://playground.babylonjs.com/#AV9X17#114\n * @returns the matrix underlying array.\n */\n asArray() {\n return this._m;\n }\n fromArray(e, t = 0) {\n return L.FromArrayToRef(e, t, this);\n }\n copyFromFloats(...e) {\n return L.FromArrayToRef(e, 0, this);\n }\n set(...e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] = e[i];\n return this.markAsUpdated(), this;\n }\n setAll(e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] = e;\n return this.markAsUpdated(), this;\n }\n /**\n * Inverts the current matrix in place\n * Example Playground - https://playground.babylonjs.com/#AV9X17#118\n * @returns the current inverted matrix\n */\n invert() {\n return this.invertToRef(this), this;\n }\n /**\n * Sets all the matrix elements to zero\n * @returns the current matrix\n */\n reset() {\n return L.FromValuesToRef(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, this), this._updateIdentityStatus(!1), this;\n }\n /**\n * Adds the current matrix with a second one\n * Example Playground - https://playground.babylonjs.com/#AV9X17#44\n * @param other defines the matrix to add\n * @returns a new matrix as the addition of the current matrix and the given one\n */\n add(e) {\n const t = new this.constructor();\n return this.addToRef(e, t), t;\n }\n /**\n * Sets the given matrix \"result\" to the addition of the current matrix and the given one\n * Example Playground - https://playground.babylonjs.com/#AV9X17#45\n * @param other defines the matrix to add\n * @param result defines the target matrix\n * @returns result input\n */\n addToRef(e, t) {\n const i = this._m, r = t._m, s = e.m;\n for (let a = 0; a < 16; a++)\n r[a] = i[a] + s[a];\n return t.markAsUpdated(), t;\n }\n /**\n * Adds in place the given matrix to the current matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#46\n * @param other defines the second operand\n * @returns the current updated matrix\n */\n addToSelf(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] += i[r];\n return this.markAsUpdated(), this;\n }\n addInPlace(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] += i[r];\n return this.markAsUpdated(), this;\n }\n addInPlaceFromFloats(...e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] += e[i];\n return this.markAsUpdated(), this;\n }\n subtract(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] -= i[r];\n return this.markAsUpdated(), this;\n }\n subtractToRef(e, t) {\n const i = this._m, r = e.m, s = t._m;\n for (let a = 0; a < 16; a++)\n s[a] = i[a] - r[a];\n return t.markAsUpdated(), t;\n }\n subtractInPlace(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] -= i[r];\n return this.markAsUpdated(), this;\n }\n subtractFromFloats(...e) {\n return this.subtractFromFloatsToRef(...e, new this.constructor());\n }\n subtractFromFloatsToRef(...e) {\n const t = e.pop(), i = this._m, r = t._m, s = e;\n for (let a = 0; a < 16; a++)\n r[a] = i[a] - s[a];\n return t.markAsUpdated(), t;\n }\n /**\n * Sets the given matrix to the current inverted Matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#119\n * @param other defines the target matrix\n * @returns result input\n */\n invertToRef(e) {\n if (this._isIdentity === !0)\n return L.IdentityToRef(e), e;\n const t = this._m, i = t[0], r = t[1], s = t[2], a = t[3], o = t[4], l = t[5], c = t[6], h = t[7], u = t[8], f = t[9], d = t[10], p = t[11], g = t[12], m = t[13], v = t[14], E = t[15], C = d * E - v * p, T = f * E - m * p, R = f * v - m * d, x = u * E - g * p, S = u * v - d * g, M = u * m - g * f, N = +(l * C - c * T + h * R), F = -(o * C - c * x + h * S), U = +(o * T - l * x + h * M), H = -(o * R - l * S + c * M), q = i * N + r * F + s * U + a * H;\n if (q === 0)\n return e.copyFrom(this), e;\n const Z = 1 / q, k = c * E - v * h, Q = l * E - m * h, ce = l * v - m * c, de = o * E - g * h, j = o * v - g * c, J = o * m - g * l, O = c * p - d * h, G = l * p - f * h, ee = l * d - f * c, _e = o * p - u * h, Oe = o * d - u * c, ze = o * f - u * l, fe = -(r * C - s * T + a * R), Te = +(i * C - s * x + a * S), Fe = -(i * T - r * x + a * M), Se = +(i * R - r * S + s * M), qe = +(r * k - s * Q + a * ce), ue = -(i * k - s * de + a * j), Ye = +(i * Q - r * de + a * J), lt = -(i * ce - r * j + s * J), Ut = -(r * O - s * G + a * ee), Ct = +(i * O - s * _e + a * Oe), Bi = -(i * G - r * _e + a * ze), hi = +(i * ee - r * Oe + s * ze);\n return L.FromValuesToRef(N * Z, fe * Z, qe * Z, Ut * Z, F * Z, Te * Z, ue * Z, Ct * Z, U * Z, Fe * Z, Ye * Z, Bi * Z, H * Z, Se * Z, lt * Z, hi * Z, e), e;\n }\n /**\n * add a value at the specified position in the current Matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#47\n * @param index the index of the value within the matrix. between 0 and 15.\n * @param value the value to be added\n * @returns the current updated matrix\n */\n addAtIndex(e, t) {\n return this._m[e] += t, this.markAsUpdated(), this;\n }\n /**\n * mutiply the specified position in the current Matrix by a value\n * @param index the index of the value within the matrix. between 0 and 15.\n * @param value the value to be added\n * @returns the current updated matrix\n */\n multiplyAtIndex(e, t) {\n return this._m[e] *= t, this.markAsUpdated(), this;\n }\n /**\n * Inserts the translation vector (using 3 floats) in the current matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#120\n * @param x defines the 1st component of the translation\n * @param y defines the 2nd component of the translation\n * @param z defines the 3rd component of the translation\n * @returns the current updated matrix\n */\n setTranslationFromFloats(e, t, i) {\n return this._m[12] = e, this._m[13] = t, this._m[14] = i, this.markAsUpdated(), this;\n }\n /**\n * Adds the translation vector (using 3 floats) in the current matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#20\n * Example Playground - https://playground.babylonjs.com/#AV9X17#48\n * @param x defines the 1st component of the translation\n * @param y defines the 2nd component of the translation\n * @param z defines the 3rd component of the translation\n * @returns the current updated matrix\n */\n addTranslationFromFloats(e, t, i) {\n return this._m[12] += e, this._m[13] += t, this._m[14] += i, this.markAsUpdated(), this;\n }\n /**\n * Inserts the translation vector in the current matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#121\n * @param vector3 defines the translation to insert\n * @returns the current updated matrix\n */\n setTranslation(e) {\n return this.setTranslationFromFloats(e._x, e._y, e._z);\n }\n /**\n * Gets the translation value of the current matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#122\n * @returns a new Vector3 as the extracted translation from the matrix\n */\n getTranslation() {\n return new _(this._m[12], this._m[13], this._m[14]);\n }\n /**\n * Fill a Vector3 with the extracted translation from the matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#123\n * @param result defines the Vector3 where to store the translation\n * @returns the current matrix\n */\n getTranslationToRef(e) {\n return e.x = this._m[12], e.y = this._m[13], e.z = this._m[14], e;\n }\n /**\n * Remove rotation and scaling part from the matrix\n * @returns the updated matrix\n */\n removeRotationAndScaling() {\n const e = this.m;\n return L.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, e[12], e[13], e[14], e[15], this), this._updateIdentityStatus(e[12] === 0 && e[13] === 0 && e[14] === 0 && e[15] === 1), this;\n }\n /**\n * Copy the current matrix from the given one\n * Example Playground - https://playground.babylonjs.com/#AV9X17#21\n * @param other defines the source matrix\n * @returns the current updated matrix\n */\n copyFrom(e) {\n e.copyToArray(this._m);\n const t = e;\n return this.updateFlag = t.updateFlag, this._updateIdentityStatus(t._isIdentity, t._isIdentityDirty, t._isIdentity3x2, t._isIdentity3x2Dirty), this;\n }\n /**\n * Populates the given array from the starting index with the current matrix values\n * @param array defines the target array\n * @param offset defines the offset in the target array where to start storing values\n * @returns the current matrix\n */\n copyToArray(e, t = 0) {\n const i = this._m;\n return e[t] = i[0], e[t + 1] = i[1], e[t + 2] = i[2], e[t + 3] = i[3], e[t + 4] = i[4], e[t + 5] = i[5], e[t + 6] = i[6], e[t + 7] = i[7], e[t + 8] = i[8], e[t + 9] = i[9], e[t + 10] = i[10], e[t + 11] = i[11], e[t + 12] = i[12], e[t + 13] = i[13], e[t + 14] = i[14], e[t + 15] = i[15], this;\n }\n /**\n * Multiply two matrices\n * Example Playground - https://playground.babylonjs.com/#AV9X17#15\n * A.multiply(B) means apply B to A so result is B x A\n * @param other defines the second operand\n * @returns a new matrix set with the multiplication result of the current Matrix and the given one\n */\n multiply(e) {\n const t = new this.constructor();\n return this.multiplyToRef(e, t), t;\n }\n multiplyInPlace(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] *= i[r];\n return this.markAsUpdated(), this;\n }\n multiplyByFloats(...e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] = e[i];\n return this.markAsUpdated(), this;\n }\n /**\n * Multiples the current matrix by the given floats and stores them in the given ref\n * @param args The floats and ref\n * @returns The updated ref\n */\n multiplyByFloatsToRef(...e) {\n const t = e.pop(), i = this._m, r = t._m, s = e;\n for (let a = 0; a < 16; a++)\n r[a] = i[a] * s[a];\n return t.markAsUpdated(), t;\n }\n /**\n * Sets the given matrix \"result\" with the multiplication result of the current Matrix and the given one\n * A.multiplyToRef(B, R) means apply B to A and store in R and R = B x A\n * Example Playground - https://playground.babylonjs.com/#AV9X17#16\n * @param other defines the second operand\n * @param result defines the matrix where to store the multiplication\n * @returns result input\n */\n multiplyToRef(e, t) {\n return this._isIdentity ? (t.copyFrom(e), t) : e._isIdentity ? (t.copyFrom(this), t) : (this.multiplyToArray(e, t._m, 0), t.markAsUpdated(), t);\n }\n /**\n * Sets the Float32Array \"result\" from the given index \"offset\" with the multiplication of the current matrix and the given one\n * @param other defines the second operand\n * @param result defines the array where to store the multiplication\n * @param offset defines the offset in the target array where to start storing values\n * @returns the current matrix\n */\n multiplyToArray(e, t, i) {\n const r = this._m, s = e.m, a = r[0], o = r[1], l = r[2], c = r[3], h = r[4], u = r[5], f = r[6], d = r[7], p = r[8], g = r[9], m = r[10], v = r[11], E = r[12], C = r[13], T = r[14], R = r[15], x = s[0], S = s[1], M = s[2], N = s[3], F = s[4], U = s[5], H = s[6], q = s[7], Z = s[8], k = s[9], Q = s[10], ce = s[11], de = s[12], j = s[13], J = s[14], O = s[15];\n return t[i] = a * x + o * F + l * Z + c * de, t[i + 1] = a * S + o * U + l * k + c * j, t[i + 2] = a * M + o * H + l * Q + c * J, t[i + 3] = a * N + o * q + l * ce + c * O, t[i + 4] = h * x + u * F + f * Z + d * de, t[i + 5] = h * S + u * U + f * k + d * j, t[i + 6] = h * M + u * H + f * Q + d * J, t[i + 7] = h * N + u * q + f * ce + d * O, t[i + 8] = p * x + g * F + m * Z + v * de, t[i + 9] = p * S + g * U + m * k + v * j, t[i + 10] = p * M + g * H + m * Q + v * J, t[i + 11] = p * N + g * q + m * ce + v * O, t[i + 12] = E * x + C * F + T * Z + R * de, t[i + 13] = E * S + C * U + T * k + R * j, t[i + 14] = E * M + C * H + T * Q + R * J, t[i + 15] = E * N + C * q + T * ce + R * O, this;\n }\n divide(e) {\n return this.divideToRef(e, new this.constructor());\n }\n divideToRef(e, t) {\n const i = this._m, r = e.m, s = t._m;\n for (let a = 0; a < 16; a++)\n s[a] = i[a] / r[a];\n return t.markAsUpdated(), t;\n }\n divideInPlace(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] /= i[r];\n return this.markAsUpdated(), this;\n }\n minimizeInPlace(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] = Math.min(t[r], i[r]);\n return this.markAsUpdated(), this;\n }\n minimizeInPlaceFromFloats(...e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] = Math.min(t[i], e[i]);\n return this.markAsUpdated(), this;\n }\n maximizeInPlace(e) {\n const t = this._m, i = e.m;\n for (let r = 0; r < 16; r++)\n t[r] = Math.min(t[r], i[r]);\n return this.markAsUpdated(), this;\n }\n maximizeInPlaceFromFloats(...e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] = Math.min(t[i], e[i]);\n return this.markAsUpdated(), this;\n }\n negate() {\n return this.negateToRef(new this.constructor());\n }\n negateInPlace() {\n const e = this._m;\n for (let t = 0; t < 16; t++)\n e[t] = -e[t];\n return this.markAsUpdated(), this;\n }\n negateToRef(e) {\n const t = this._m, i = e._m;\n for (let r = 0; r < 16; r++)\n i[r] = -t[r];\n return e.markAsUpdated(), e;\n }\n /**\n * Check equality between this matrix and a second one\n * @param value defines the second matrix to compare\n * @returns true is the current matrix and the given one values are strictly equal\n */\n equals(e) {\n const t = e;\n if (!t)\n return !1;\n if ((this._isIdentity || t._isIdentity) && !this._isIdentityDirty && !t._isIdentityDirty)\n return this._isIdentity && t._isIdentity;\n const i = this.m, r = t.m;\n return i[0] === r[0] && i[1] === r[1] && i[2] === r[2] && i[3] === r[3] && i[4] === r[4] && i[5] === r[5] && i[6] === r[6] && i[7] === r[7] && i[8] === r[8] && i[9] === r[9] && i[10] === r[10] && i[11] === r[11] && i[12] === r[12] && i[13] === r[13] && i[14] === r[14] && i[15] === r[15];\n }\n equalsWithEpsilon(e, t = 0) {\n const i = this._m, r = e.m;\n for (let s = 0; s < 16; s++)\n if (!Ii(i[s], r[s], t))\n return !1;\n return !0;\n }\n equalsToFloats(...e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n if (t[i] != e[i])\n return !1;\n return !0;\n }\n floor() {\n return this.floorToRef(new this.constructor());\n }\n floorToRef(e) {\n const t = this._m, i = e._m;\n for (let r = 0; r < 16; r++)\n i[r] = Math.floor(t[r]);\n return e.markAsUpdated(), e;\n }\n fract() {\n return this.fractToRef(new this.constructor());\n }\n fractToRef(e) {\n const t = this._m, i = e._m;\n for (let r = 0; r < 16; r++)\n i[r] = t[r] - Math.floor(t[r]);\n return e.markAsUpdated(), e;\n }\n /**\n * Clone the current matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#18\n * @returns a new matrix from the current matrix\n */\n clone() {\n const e = new this.constructor();\n return e.copyFrom(this), e;\n }\n /**\n * Returns the name of the current matrix class\n * @returns the string \"Matrix\"\n */\n getClassName() {\n return \"Matrix\";\n }\n /**\n * Gets the hash code of the current matrix\n * @returns the hash code\n */\n getHashCode() {\n let e = nr(this._m[0]);\n for (let t = 1; t < 16; t++)\n e = e * 397 ^ nr(this._m[t]);\n return e;\n }\n /**\n * Decomposes the current Matrix into a translation, rotation and scaling components of the provided node\n * Example Playground - https://playground.babylonjs.com/#AV9X17#13\n * @param node the node to decompose the matrix to\n * @returns true if operation was successful\n */\n decomposeToTransformNode(e) {\n return e.rotationQuaternion = e.rotationQuaternion || new Ce(), this.decompose(e.scaling, e.rotationQuaternion, e.position);\n }\n /**\n * Decomposes the current Matrix into a translation, rotation and scaling components\n * Example Playground - https://playground.babylonjs.com/#AV9X17#12\n * @param scale defines the scale vector3 given as a reference to update\n * @param rotation defines the rotation quaternion given as a reference to update\n * @param translation defines the translation vector3 given as a reference to update\n * @param preserveScalingNode Use scaling sign coming from this node. Otherwise scaling sign might change.\n * @param useAbsoluteScaling Use scaling sign coming from this absoluteScaling when true or scaling otherwise.\n * @returns true if operation was successful\n */\n decompose(e, t, i, r, s = !0) {\n if (this._isIdentity)\n return i && i.setAll(0), e && e.setAll(1), t && t.copyFromFloats(0, 0, 0, 1), !0;\n const a = this._m;\n if (i && i.copyFromFloats(a[12], a[13], a[14]), e = e || be.Vector3[0], e.x = Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]), e.y = Math.sqrt(a[4] * a[4] + a[5] * a[5] + a[6] * a[6]), e.z = Math.sqrt(a[8] * a[8] + a[9] * a[9] + a[10] * a[10]), r) {\n const o = (s ? r.absoluteScaling.x : r.scaling.x) < 0 ? -1 : 1, l = (s ? r.absoluteScaling.y : r.scaling.y) < 0 ? -1 : 1, c = (s ? r.absoluteScaling.z : r.scaling.z) < 0 ? -1 : 1;\n e.x *= o, e.y *= l, e.z *= c;\n } else\n this.determinant() <= 0 && (e.y *= -1);\n if (e._x === 0 || e._y === 0 || e._z === 0)\n return t && t.copyFromFloats(0, 0, 0, 1), !1;\n if (t) {\n const o = 1 / e._x, l = 1 / e._y, c = 1 / e._z;\n L.FromValuesToRef(a[0] * o, a[1] * o, a[2] * o, 0, a[4] * l, a[5] * l, a[6] * l, 0, a[8] * c, a[9] * c, a[10] * c, 0, 0, 0, 0, 1, be.Matrix[0]), Ce.FromRotationMatrixToRef(be.Matrix[0], t);\n }\n return !0;\n }\n /**\n * Gets specific row of the matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\n * @param index defines the number of the row to get\n * @returns the index-th row of the current matrix as a new Vector4\n */\n getRow(e) {\n if (e < 0 || e > 3)\n return null;\n const t = e * 4;\n return new Ke(this._m[t + 0], this._m[t + 1], this._m[t + 2], this._m[t + 3]);\n }\n /**\n * Gets specific row of the matrix to ref\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\n * @param index defines the number of the row to get\n * @param rowVector vector to store the index-th row of the current matrix\n * @returns result input\n */\n getRowToRef(e, t) {\n if (e >= 0 && e <= 3) {\n const i = e * 4;\n t.x = this._m[i + 0], t.y = this._m[i + 1], t.z = this._m[i + 2], t.w = this._m[i + 3];\n }\n return t;\n }\n /**\n * Sets the index-th row of the current matrix to the vector4 values\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\n * @param index defines the number of the row to set\n * @param row defines the target vector4\n * @returns the updated current matrix\n */\n setRow(e, t) {\n return this.setRowFromFloats(e, t.x, t.y, t.z, t.w);\n }\n /**\n * Compute the transpose of the matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#40\n * @returns the new transposed matrix\n */\n transpose() {\n const e = new this.constructor();\n return L.TransposeToRef(this, e), e;\n }\n /**\n * Compute the transpose of the matrix and store it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#41\n * @param result defines the target matrix\n * @returns result input\n */\n transposeToRef(e) {\n return L.TransposeToRef(this, e), e;\n }\n /**\n * Sets the index-th row of the current matrix with the given 4 x float values\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\n * @param index defines the row index\n * @param x defines the x component to set\n * @param y defines the y component to set\n * @param z defines the z component to set\n * @param w defines the w component to set\n * @returns the updated current matrix\n */\n setRowFromFloats(e, t, i, r, s) {\n if (e < 0 || e > 3)\n return this;\n const a = e * 4;\n return this._m[a + 0] = t, this._m[a + 1] = i, this._m[a + 2] = r, this._m[a + 3] = s, this.markAsUpdated(), this;\n }\n /**\n * Compute a new matrix set with the current matrix values multiplied by scale (float)\n * @param scale defines the scale factor\n * @returns a new matrix\n */\n scale(e) {\n const t = new this.constructor();\n return this.scaleToRef(e, t), t;\n }\n /**\n * Scale the current matrix values by a factor to a given result matrix\n * @param scale defines the scale factor\n * @param result defines the matrix to store the result\n * @returns result input\n */\n scaleToRef(e, t) {\n for (let i = 0; i < 16; i++)\n t._m[i] = this._m[i] * e;\n return t.markAsUpdated(), t;\n }\n /**\n * Scale the current matrix values by a factor and add the result to a given matrix\n * @param scale defines the scale factor\n * @param result defines the Matrix to store the result\n * @returns result input\n */\n scaleAndAddToRef(e, t) {\n for (let i = 0; i < 16; i++)\n t._m[i] += this._m[i] * e;\n return t.markAsUpdated(), t;\n }\n scaleInPlace(e) {\n const t = this._m;\n for (let i = 0; i < 16; i++)\n t[i] *= e;\n return this.markAsUpdated(), this;\n }\n /**\n * Writes to the given matrix a normal matrix, computed from this one (using values from identity matrix for fourth row and column).\n * Example Playground - https://playground.babylonjs.com/#AV9X17#17\n * @param ref matrix to store the result\n * @returns the reference matrix\n */\n toNormalMatrix(e) {\n const t = be.Matrix[0];\n this.invertToRef(t), t.transposeToRef(e);\n const i = e._m;\n return L.FromValuesToRef(i[0], i[1], i[2], 0, i[4], i[5], i[6], 0, i[8], i[9], i[10], 0, 0, 0, 0, 1, e), e;\n }\n /**\n * Gets only rotation part of the current matrix\n * @returns a new matrix sets to the extracted rotation matrix from the current one\n */\n getRotationMatrix() {\n const e = new this.constructor();\n return this.getRotationMatrixToRef(e), e;\n }\n /**\n * Extracts the rotation matrix from the current one and sets it as the given \"result\"\n * @param result defines the target matrix to store data to\n * @returns result input\n */\n getRotationMatrixToRef(e) {\n const t = be.Vector3[0];\n if (!this.decompose(t))\n return L.IdentityToRef(e), e;\n const i = this._m, r = 1 / t._x, s = 1 / t._y, a = 1 / t._z;\n return L.FromValuesToRef(i[0] * r, i[1] * r, i[2] * r, 0, i[4] * s, i[5] * s, i[6] * s, 0, i[8] * a, i[9] * a, i[10] * a, 0, 0, 0, 0, 1, e), e;\n }\n /**\n * Toggles model matrix from being right handed to left handed in place and vice versa\n * @returns the current updated matrix\n */\n toggleModelMatrixHandInPlace() {\n const e = this._m;\n return e[2] *= -1, e[6] *= -1, e[8] *= -1, e[9] *= -1, e[14] *= -1, this.markAsUpdated(), this;\n }\n /**\n * Toggles projection matrix from being right handed to left handed in place and vice versa\n * @returns the current updated matrix\n */\n toggleProjectionMatrixHandInPlace() {\n const e = this._m;\n return e[8] *= -1, e[9] *= -1, e[10] *= -1, e[11] *= -1, this.markAsUpdated(), this;\n }\n // Statics\n /**\n * Creates a matrix from an array\n * Example Playground - https://playground.babylonjs.com/#AV9X17#42\n * @param array defines the source array\n * @param offset defines an offset in the source array\n * @returns a new Matrix set from the starting index of the given array\n */\n static FromArray(e, t = 0) {\n const i = new L();\n return L.FromArrayToRef(e, t, i), i;\n }\n /**\n * Copy the content of an array into a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#43\n * @param array defines the source array\n * @param offset defines an offset in the source array\n * @param result defines the target matrix\n * @returns result input\n */\n static FromArrayToRef(e, t, i) {\n for (let r = 0; r < 16; r++)\n i._m[r] = e[r + t];\n return i.markAsUpdated(), i;\n }\n /**\n * Stores an array into a matrix after having multiplied each component by a given factor\n * Example Playground - https://playground.babylonjs.com/#AV9X17#50\n * @param array defines the source array\n * @param offset defines the offset in the source array\n * @param scale defines the scaling factor\n * @param result defines the target matrix\n * @returns result input\n */\n static FromFloat32ArrayToRefScaled(e, t, i, r) {\n for (let s = 0; s < 16; s++)\n r._m[s] = e[s + t] * i;\n return r.markAsUpdated(), r;\n }\n /**\n * Gets an identity matrix that must not be updated\n */\n static get IdentityReadOnly() {\n return L._IdentityReadOnly;\n }\n /**\n * Stores a list of values (16) inside a given matrix\n * @param initialM11 defines 1st value of 1st row\n * @param initialM12 defines 2nd value of 1st row\n * @param initialM13 defines 3rd value of 1st row\n * @param initialM14 defines 4th value of 1st row\n * @param initialM21 defines 1st value of 2nd row\n * @param initialM22 defines 2nd value of 2nd row\n * @param initialM23 defines 3rd value of 2nd row\n * @param initialM24 defines 4th value of 2nd row\n * @param initialM31 defines 1st value of 3rd row\n * @param initialM32 defines 2nd value of 3rd row\n * @param initialM33 defines 3rd value of 3rd row\n * @param initialM34 defines 4th value of 3rd row\n * @param initialM41 defines 1st value of 4th row\n * @param initialM42 defines 2nd value of 4th row\n * @param initialM43 defines 3rd value of 4th row\n * @param initialM44 defines 4th value of 4th row\n * @param result defines the target matrix\n */\n static FromValuesToRef(e, t, i, r, s, a, o, l, c, h, u, f, d, p, g, m, v) {\n const E = v._m;\n E[0] = e, E[1] = t, E[2] = i, E[3] = r, E[4] = s, E[5] = a, E[6] = o, E[7] = l, E[8] = c, E[9] = h, E[10] = u, E[11] = f, E[12] = d, E[13] = p, E[14] = g, E[15] = m, v.markAsUpdated();\n }\n /**\n * Creates new matrix from a list of values (16)\n * @param initialM11 defines 1st value of 1st row\n * @param initialM12 defines 2nd value of 1st row\n * @param initialM13 defines 3rd value of 1st row\n * @param initialM14 defines 4th value of 1st row\n * @param initialM21 defines 1st value of 2nd row\n * @param initialM22 defines 2nd value of 2nd row\n * @param initialM23 defines 3rd value of 2nd row\n * @param initialM24 defines 4th value of 2nd row\n * @param initialM31 defines 1st value of 3rd row\n * @param initialM32 defines 2nd value of 3rd row\n * @param initialM33 defines 3rd value of 3rd row\n * @param initialM34 defines 4th value of 3rd row\n * @param initialM41 defines 1st value of 4th row\n * @param initialM42 defines 2nd value of 4th row\n * @param initialM43 defines 3rd value of 4th row\n * @param initialM44 defines 4th value of 4th row\n * @returns the new matrix\n */\n static FromValues(e, t, i, r, s, a, o, l, c, h, u, f, d, p, g, m) {\n const v = new L(), E = v._m;\n return E[0] = e, E[1] = t, E[2] = i, E[3] = r, E[4] = s, E[5] = a, E[6] = o, E[7] = l, E[8] = c, E[9] = h, E[10] = u, E[11] = f, E[12] = d, E[13] = p, E[14] = g, E[15] = m, v.markAsUpdated(), v;\n }\n /**\n * Creates a new matrix composed by merging scale (vector3), rotation (quaternion) and translation (vector3)\n * Example Playground - https://playground.babylonjs.com/#AV9X17#24\n * @param scale defines the scale vector3\n * @param rotation defines the rotation quaternion\n * @param translation defines the translation vector3\n * @returns a new matrix\n */\n static Compose(e, t, i) {\n const r = new L();\n return L.ComposeToRef(e, t, i, r), r;\n }\n /**\n * Sets a matrix to a value composed by merging scale (vector3), rotation (quaternion) and translation (vector3)\n * Example Playground - https://playground.babylonjs.com/#AV9X17#25\n * @param scale defines the scale vector3\n * @param rotation defines the rotation quaternion\n * @param translation defines the translation vector3\n * @param result defines the target matrix\n * @returns result input\n */\n static ComposeToRef(e, t, i, r) {\n const s = r._m, a = t._x, o = t._y, l = t._z, c = t._w, h = a + a, u = o + o, f = l + l, d = a * h, p = a * u, g = a * f, m = o * u, v = o * f, E = l * f, C = c * h, T = c * u, R = c * f, x = e._x, S = e._y, M = e._z;\n return s[0] = (1 - (m + E)) * x, s[1] = (p + R) * x, s[2] = (g - T) * x, s[3] = 0, s[4] = (p - R) * S, s[5] = (1 - (d + E)) * S, s[6] = (v + C) * S, s[7] = 0, s[8] = (g + T) * M, s[9] = (v - C) * M, s[10] = (1 - (d + m)) * M, s[11] = 0, s[12] = i._x, s[13] = i._y, s[14] = i._z, s[15] = 1, r.markAsUpdated(), r;\n }\n /**\n * Creates a new identity matrix\n * @returns a new identity matrix\n */\n static Identity() {\n const e = L.FromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n return e._updateIdentityStatus(!0), e;\n }\n /**\n * Creates a new identity matrix and stores the result in a given matrix\n * @param result defines the target matrix\n * @returns result input\n */\n static IdentityToRef(e) {\n return L.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, e), e._updateIdentityStatus(!0), e;\n }\n /**\n * Creates a new zero matrix\n * @returns a new zero matrix\n */\n static Zero() {\n const e = L.FromValues(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n return e._updateIdentityStatus(!1), e;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the X axis\n * Example Playground - https://playground.babylonjs.com/#AV9X17#97\n * @param angle defines the angle (in radians) to use\n * @returns the new matrix\n */\n static RotationX(e) {\n const t = new L();\n return L.RotationXToRef(e, t), t;\n }\n /**\n * Creates a new matrix as the invert of a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#124\n * @param source defines the source matrix\n * @returns the new matrix\n */\n static Invert(e) {\n const t = new e.constructor();\n return e.invertToRef(t), t;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the X axis and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#98\n * @param angle defines the angle (in radians) to use\n * @param result defines the target matrix\n * @returns result input\n */\n static RotationXToRef(e, t) {\n const i = Math.sin(e), r = Math.cos(e);\n return L.FromValuesToRef(1, 0, 0, 0, 0, r, i, 0, 0, -i, r, 0, 0, 0, 0, 1, t), t._updateIdentityStatus(r === 1 && i === 0), t;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the Y axis\n * Example Playground - https://playground.babylonjs.com/#AV9X17#99\n * @param angle defines the angle (in radians) to use\n * @returns the new matrix\n */\n static RotationY(e) {\n const t = new L();\n return L.RotationYToRef(e, t), t;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the Y axis and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#100\n * @param angle defines the angle (in radians) to use\n * @param result defines the target matrix\n * @returns result input\n */\n static RotationYToRef(e, t) {\n const i = Math.sin(e), r = Math.cos(e);\n return L.FromValuesToRef(r, 0, -i, 0, 0, 1, 0, 0, i, 0, r, 0, 0, 0, 0, 1, t), t._updateIdentityStatus(r === 1 && i === 0), t;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the Z axis\n * Example Playground - https://playground.babylonjs.com/#AV9X17#101\n * @param angle defines the angle (in radians) to use\n * @returns the new matrix\n */\n static RotationZ(e) {\n const t = new L();\n return L.RotationZToRef(e, t), t;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the Z axis and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#102\n * @param angle defines the angle (in radians) to use\n * @param result defines the target matrix\n * @returns result input\n */\n static RotationZToRef(e, t) {\n const i = Math.sin(e), r = Math.cos(e);\n return L.FromValuesToRef(r, i, 0, 0, -i, r, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, t), t._updateIdentityStatus(r === 1 && i === 0), t;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the given axis\n * Example Playground - https://playground.babylonjs.com/#AV9X17#96\n * @param axis defines the axis to use\n * @param angle defines the angle (in radians) to use\n * @returns the new matrix\n */\n static RotationAxis(e, t) {\n const i = new L();\n return L.RotationAxisToRef(e, t, i), i;\n }\n /**\n * Creates a new rotation matrix for \"angle\" radians around the given axis and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#94\n * @param axis defines the axis to use\n * @param angle defines the angle (in radians) to use\n * @param result defines the target matrix\n * @returns result input\n */\n static RotationAxisToRef(e, t, i) {\n const r = Math.sin(-t), s = Math.cos(-t), a = 1 - s;\n e.normalize();\n const o = i._m;\n return o[0] = e._x * e._x * a + s, o[1] = e._x * e._y * a - e._z * r, o[2] = e._x * e._z * a + e._y * r, o[3] = 0, o[4] = e._y * e._x * a + e._z * r, o[5] = e._y * e._y * a + s, o[6] = e._y * e._z * a - e._x * r, o[7] = 0, o[8] = e._z * e._x * a - e._y * r, o[9] = e._z * e._y * a + e._x * r, o[10] = e._z * e._z * a + s, o[11] = 0, o[12] = 0, o[13] = 0, o[14] = 0, o[15] = 1, i.markAsUpdated(), i;\n }\n /**\n * Takes normalised vectors and returns a rotation matrix to align \"from\" with \"to\".\n * Taken from http://www.iquilezles.org/www/articles/noacos/noacos.htm\n * Example Playground - https://playground.babylonjs.com/#AV9X17#93\n * @param from defines the vector to align\n * @param to defines the vector to align to\n * @param result defines the target matrix\n * @param useYAxisForCoplanar defines a boolean indicating that we should favor Y axis for coplanar vectors (default is false)\n * @returns result input\n */\n static RotationAlignToRef(e, t, i, r = !1) {\n const s = _.Dot(t, e), a = i._m;\n if (s < -1 + xt)\n a[0] = -1, a[1] = 0, a[2] = 0, a[3] = 0, a[4] = 0, a[5] = r ? 1 : -1, a[6] = 0, a[7] = 0, a[8] = 0, a[9] = 0, a[10] = r ? -1 : 1, a[11] = 0;\n else {\n const o = _.Cross(t, e), l = 1 / (1 + s);\n a[0] = o._x * o._x * l + s, a[1] = o._y * o._x * l - o._z, a[2] = o._z * o._x * l + o._y, a[3] = 0, a[4] = o._x * o._y * l + o._z, a[5] = o._y * o._y * l + s, a[6] = o._z * o._y * l - o._x, a[7] = 0, a[8] = o._x * o._z * l - o._y, a[9] = o._y * o._z * l + o._x, a[10] = o._z * o._z * l + s, a[11] = 0;\n }\n return a[12] = 0, a[13] = 0, a[14] = 0, a[15] = 1, i.markAsUpdated(), i;\n }\n /**\n * Creates a rotation matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#103\n * Example Playground - https://playground.babylonjs.com/#AV9X17#105\n * @param yaw defines the yaw angle in radians (Y axis)\n * @param pitch defines the pitch angle in radians (X axis)\n * @param roll defines the roll angle in radians (Z axis)\n * @returns the new rotation matrix\n */\n static RotationYawPitchRoll(e, t, i) {\n const r = new L();\n return L.RotationYawPitchRollToRef(e, t, i, r), r;\n }\n /**\n * Creates a rotation matrix and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#104\n * @param yaw defines the yaw angle in radians (Y axis)\n * @param pitch defines the pitch angle in radians (X axis)\n * @param roll defines the roll angle in radians (Z axis)\n * @param result defines the target matrix\n * @returns result input\n */\n static RotationYawPitchRollToRef(e, t, i, r) {\n return Ce.RotationYawPitchRollToRef(e, t, i, be.Quaternion[0]), be.Quaternion[0].toRotationMatrix(r), r;\n }\n /**\n * Creates a scaling matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#107\n * @param x defines the scale factor on X axis\n * @param y defines the scale factor on Y axis\n * @param z defines the scale factor on Z axis\n * @returns the new matrix\n */\n static Scaling(e, t, i) {\n const r = new L();\n return L.ScalingToRef(e, t, i, r), r;\n }\n /**\n * Creates a scaling matrix and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#108\n * @param x defines the scale factor on X axis\n * @param y defines the scale factor on Y axis\n * @param z defines the scale factor on Z axis\n * @param result defines the target matrix\n * @returns result input\n */\n static ScalingToRef(e, t, i, r) {\n return L.FromValuesToRef(e, 0, 0, 0, 0, t, 0, 0, 0, 0, i, 0, 0, 0, 0, 1, r), r._updateIdentityStatus(e === 1 && t === 1 && i === 1), r;\n }\n /**\n * Creates a translation matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#109\n * @param x defines the translation on X axis\n * @param y defines the translation on Y axis\n * @param z defines the translationon Z axis\n * @returns the new matrix\n */\n static Translation(e, t, i) {\n const r = new L();\n return L.TranslationToRef(e, t, i, r), r;\n }\n /**\n * Creates a translation matrix and stores it in a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#110\n * @param x defines the translation on X axis\n * @param y defines the translation on Y axis\n * @param z defines the translationon Z axis\n * @param result defines the target matrix\n * @returns result input\n */\n static TranslationToRef(e, t, i, r) {\n return L.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, e, t, i, 1, r), r._updateIdentityStatus(e === 0 && t === 0 && i === 0), r;\n }\n /**\n * Returns a new Matrix whose values are the interpolated values for \"gradient\" (float) between the ones of the matrices \"startValue\" and \"endValue\".\n * Example Playground - https://playground.babylonjs.com/#AV9X17#55\n * @param startValue defines the start value\n * @param endValue defines the end value\n * @param gradient defines the gradient factor\n * @returns the new matrix\n */\n static Lerp(e, t, i) {\n const r = new e.constructor();\n return L.LerpToRef(e, t, i, r), r;\n }\n /**\n * Set the given matrix \"result\" as the interpolated values for \"gradient\" (float) between the ones of the matrices \"startValue\" and \"endValue\".\n * Example Playground - https://playground.babylonjs.com/#AV9X17#54\n * @param startValue defines the start value\n * @param endValue defines the end value\n * @param gradient defines the gradient factor\n * @param result defines the Matrix object where to store data\n * @returns result input\n */\n static LerpToRef(e, t, i, r) {\n const s = r._m, a = e.m, o = t.m;\n for (let l = 0; l < 16; l++)\n s[l] = a[l] * (1 - i) + o[l] * i;\n return r.markAsUpdated(), r;\n }\n /**\n * Builds a new matrix whose values are computed by:\n * * decomposing the \"startValue\" and \"endValue\" matrices into their respective scale, rotation and translation matrices\n * * interpolating for \"gradient\" (float) the values between each of these decomposed matrices between the start and the end\n * * recomposing a new matrix from these 3 interpolated scale, rotation and translation matrices\n * Example Playground - https://playground.babylonjs.com/#AV9X17#22\n * Example Playground - https://playground.babylonjs.com/#AV9X17#51\n * @param startValue defines the first matrix\n * @param endValue defines the second matrix\n * @param gradient defines the gradient between the two matrices\n * @returns the new matrix\n */\n static DecomposeLerp(e, t, i) {\n const r = new e.constructor();\n return L.DecomposeLerpToRef(e, t, i, r), r;\n }\n /**\n * Update a matrix to values which are computed by:\n * * decomposing the \"startValue\" and \"endValue\" matrices into their respective scale, rotation and translation matrices\n * * interpolating for \"gradient\" (float) the values between each of these decomposed matrices between the start and the end\n * * recomposing a new matrix from these 3 interpolated scale, rotation and translation matrices\n * Example Playground - https://playground.babylonjs.com/#AV9X17#23\n * Example Playground - https://playground.babylonjs.com/#AV9X17#53\n * @param startValue defines the first matrix\n * @param endValue defines the second matrix\n * @param gradient defines the gradient between the two matrices\n * @param result defines the target matrix\n * @returns result input\n */\n static DecomposeLerpToRef(e, t, i, r) {\n const s = be.Vector3[0], a = be.Quaternion[0], o = be.Vector3[1];\n e.decompose(s, a, o);\n const l = be.Vector3[2], c = be.Quaternion[1], h = be.Vector3[3];\n t.decompose(l, c, h);\n const u = be.Vector3[4];\n _.LerpToRef(s, l, i, u);\n const f = be.Quaternion[2];\n Ce.SlerpToRef(a, c, i, f);\n const d = be.Vector3[5];\n return _.LerpToRef(o, h, i, d), L.ComposeToRef(u, f, d, r), r;\n }\n /**\n * Creates a new matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\n * This function generates a matrix suitable for a left handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#58\n * Example Playground - https://playground.babylonjs.com/#AV9X17#59\n * @param eye defines the final position of the entity\n * @param target defines where the entity should look at\n * @param up defines the up vector for the entity\n * @returns the new matrix\n */\n static LookAtLH(e, t, i) {\n const r = new L();\n return L.LookAtLHToRef(e, t, i, r), r;\n }\n /**\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\n * This function generates a matrix suitable for a left handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#60\n * Example Playground - https://playground.babylonjs.com/#AV9X17#61\n * @param eye defines the final position of the entity\n * @param target defines where the entity should look at\n * @param up defines the up vector for the entity\n * @param result defines the target matrix\n * @returns result input\n */\n static LookAtLHToRef(e, t, i, r) {\n const s = be.Vector3[0], a = be.Vector3[1], o = be.Vector3[2];\n t.subtractToRef(e, o), o.normalize(), _.CrossToRef(i, o, s);\n const l = s.lengthSquared();\n l === 0 ? s.x = 1 : s.normalizeFromLength(Math.sqrt(l)), _.CrossToRef(o, s, a), a.normalize();\n const c = -_.Dot(s, e), h = -_.Dot(a, e), u = -_.Dot(o, e);\n return L.FromValuesToRef(s._x, a._x, o._x, 0, s._y, a._y, o._y, 0, s._z, a._z, o._z, 0, c, h, u, 1, r), r;\n }\n /**\n * Creates a new matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\n * This function generates a matrix suitable for a right handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#62\n * Example Playground - https://playground.babylonjs.com/#AV9X17#63\n * @param eye defines the final position of the entity\n * @param target defines where the entity should look at\n * @param up defines the up vector for the entity\n * @returns the new matrix\n */\n static LookAtRH(e, t, i) {\n const r = new L();\n return L.LookAtRHToRef(e, t, i, r), r;\n }\n /**\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\n * This function generates a matrix suitable for a right handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#64\n * Example Playground - https://playground.babylonjs.com/#AV9X17#65\n * @param eye defines the final position of the entity\n * @param target defines where the entity should look at\n * @param up defines the up vector for the entity\n * @param result defines the target matrix\n * @returns result input\n */\n static LookAtRHToRef(e, t, i, r) {\n const s = be.Vector3[0], a = be.Vector3[1], o = be.Vector3[2];\n e.subtractToRef(t, o), o.normalize(), _.CrossToRef(i, o, s);\n const l = s.lengthSquared();\n l === 0 ? s.x = 1 : s.normalizeFromLength(Math.sqrt(l)), _.CrossToRef(o, s, a), a.normalize();\n const c = -_.Dot(s, e), h = -_.Dot(a, e), u = -_.Dot(o, e);\n return L.FromValuesToRef(s._x, a._x, o._x, 0, s._y, a._y, o._y, 0, s._z, a._z, o._z, 0, c, h, u, 1, r), r;\n }\n /**\n * Creates a new matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\n * This function generates a matrix suitable for a left handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#66\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @returns the new matrix\n */\n static LookDirectionLH(e, t) {\n const i = new L();\n return L.LookDirectionLHToRef(e, t, i), i;\n }\n /**\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\n * This function generates a matrix suitable for a left handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#67\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @param result defines the target matrix\n * @returns result input\n */\n static LookDirectionLHToRef(e, t, i) {\n const r = be.Vector3[0];\n r.copyFrom(e), r.scaleInPlace(-1);\n const s = be.Vector3[1];\n return _.CrossToRef(t, r, s), L.FromValuesToRef(s._x, s._y, s._z, 0, t._x, t._y, t._z, 0, r._x, r._y, r._z, 0, 0, 0, 0, 1, i), i;\n }\n /**\n * Creates a new matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\n * This function generates a matrix suitable for a right handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#68\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @returns the new matrix\n */\n static LookDirectionRH(e, t) {\n const i = new L();\n return L.LookDirectionRHToRef(e, t, i), i;\n }\n /**\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\n * This function generates a matrix suitable for a right handed coordinate system\n * Example Playground - https://playground.babylonjs.com/#AV9X17#69\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\n * @param result defines the target matrix\n * @returns result input\n */\n static LookDirectionRHToRef(e, t, i) {\n const r = be.Vector3[2];\n return _.CrossToRef(t, e, r), L.FromValuesToRef(r._x, r._y, r._z, 0, t._x, t._y, t._z, 0, e._x, e._y, e._z, 0, 0, 0, 0, 1, i), i;\n }\n /**\n * Create a left-handed orthographic projection matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#70\n * @param width defines the viewport width\n * @param height defines the viewport height\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns a new matrix as a left-handed orthographic projection matrix\n */\n static OrthoLH(e, t, i, r, s) {\n const a = new L();\n return L.OrthoLHToRef(e, t, i, r, a, s), a;\n }\n /**\n * Store a left-handed orthographic projection to a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#71\n * @param width defines the viewport width\n * @param height defines the viewport height\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param result defines the target matrix\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns result input\n */\n static OrthoLHToRef(e, t, i, r, s, a) {\n const o = i, l = r, c = 2 / e, h = 2 / t, u = 2 / (l - o), f = -(l + o) / (l - o);\n return L.FromValuesToRef(c, 0, 0, 0, 0, h, 0, 0, 0, 0, u, 0, 0, 0, f, 1, s), a && s.multiplyToRef(vn, s), s._updateIdentityStatus(c === 1 && h === 1 && u === 1 && f === 0), s;\n }\n /**\n * Create a left-handed orthographic projection matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#72\n * @param left defines the viewport left coordinate\n * @param right defines the viewport right coordinate\n * @param bottom defines the viewport bottom coordinate\n * @param top defines the viewport top coordinate\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns a new matrix as a left-handed orthographic projection matrix\n */\n static OrthoOffCenterLH(e, t, i, r, s, a, o) {\n const l = new L();\n return L.OrthoOffCenterLHToRef(e, t, i, r, s, a, l, o), l;\n }\n /**\n * Stores a left-handed orthographic projection into a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#73\n * @param left defines the viewport left coordinate\n * @param right defines the viewport right coordinate\n * @param bottom defines the viewport bottom coordinate\n * @param top defines the viewport top coordinate\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param result defines the target matrix\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns result input\n */\n static OrthoOffCenterLHToRef(e, t, i, r, s, a, o, l) {\n const c = s, h = a, u = 2 / (t - e), f = 2 / (r - i), d = 2 / (h - c), p = -(h + c) / (h - c), g = (e + t) / (e - t), m = (r + i) / (i - r);\n return L.FromValuesToRef(u, 0, 0, 0, 0, f, 0, 0, 0, 0, d, 0, g, m, p, 1, o), l && o.multiplyToRef(vn, o), o.markAsUpdated(), o;\n }\n /**\n * Stores a left-handed oblique projection into a given matrix\n * @param left defines the viewport left coordinate\n * @param right defines the viewport right coordinate\n * @param bottom defines the viewport bottom coordinate\n * @param top defines the viewport top coordinate\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param length Length of the shear\n * @param angle Angle (along X/Y Plane) to apply shear\n * @param distance Distance from shear point\n * @param result defines the target matrix\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns result input\n */\n static ObliqueOffCenterLHToRef(e, t, i, r, s, a, o, l, c, h, u) {\n const f = -o * Math.cos(l), d = -o * Math.sin(l);\n return L.TranslationToRef(0, 0, -c, be.Matrix[1]), L.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, f, d, 1, 0, 0, 0, 0, 1, be.Matrix[0]), be.Matrix[1].multiplyToRef(be.Matrix[0], be.Matrix[0]), L.TranslationToRef(0, 0, c, be.Matrix[1]), be.Matrix[0].multiplyToRef(be.Matrix[1], be.Matrix[0]), L.OrthoOffCenterLHToRef(e, t, i, r, s, a, h, u), be.Matrix[0].multiplyToRef(h, h), h;\n }\n /**\n * Creates a right-handed orthographic projection matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#76\n * @param left defines the viewport left coordinate\n * @param right defines the viewport right coordinate\n * @param bottom defines the viewport bottom coordinate\n * @param top defines the viewport top coordinate\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns a new matrix as a right-handed orthographic projection matrix\n */\n static OrthoOffCenterRH(e, t, i, r, s, a, o) {\n const l = new L();\n return L.OrthoOffCenterRHToRef(e, t, i, r, s, a, l, o), l;\n }\n /**\n * Stores a right-handed orthographic projection into a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#77\n * @param left defines the viewport left coordinate\n * @param right defines the viewport right coordinate\n * @param bottom defines the viewport bottom coordinate\n * @param top defines the viewport top coordinate\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param result defines the target matrix\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns result input\n */\n static OrthoOffCenterRHToRef(e, t, i, r, s, a, o, l) {\n return L.OrthoOffCenterLHToRef(e, t, i, r, s, a, o, l), o._m[10] *= -1, o;\n }\n /**\n * Stores a right-handed oblique projection into a given matrix\n * @param left defines the viewport left coordinate\n * @param right defines the viewport right coordinate\n * @param bottom defines the viewport bottom coordinate\n * @param top defines the viewport top coordinate\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param length Length of the shear\n * @param angle Angle (along X/Y Plane) to apply shear\n * @param distance Distance from shear point\n * @param result defines the target matrix\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @returns result input\n */\n static ObliqueOffCenterRHToRef(e, t, i, r, s, a, o, l, c, h, u) {\n const f = o * Math.cos(l), d = o * Math.sin(l);\n return L.TranslationToRef(0, 0, c, be.Matrix[1]), L.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, f, d, 1, 0, 0, 0, 0, 1, be.Matrix[0]), be.Matrix[1].multiplyToRef(be.Matrix[0], be.Matrix[0]), L.TranslationToRef(0, 0, -c, be.Matrix[1]), be.Matrix[0].multiplyToRef(be.Matrix[1], be.Matrix[0]), L.OrthoOffCenterRHToRef(e, t, i, r, s, a, h, u), be.Matrix[0].multiplyToRef(h, h), h;\n }\n /**\n * Creates a left-handed perspective projection matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#85\n * @param width defines the viewport width\n * @param height defines the viewport height\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @returns a new matrix as a left-handed perspective projection matrix\n */\n static PerspectiveLH(e, t, i, r, s, a = 0) {\n const o = new L(), l = i, c = r, h = 2 * l / e, u = 2 * l / t, f = (c + l) / (c - l), d = -2 * c * l / (c - l), p = Math.tan(a);\n return L.FromValuesToRef(h, 0, 0, 0, 0, u, 0, p, 0, 0, f, 1, 0, 0, d, 0, o), s && o.multiplyToRef(vn, o), o._updateIdentityStatus(!1), o;\n }\n /**\n * Creates a left-handed perspective projection matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#78\n * @param fov defines the horizontal field of view\n * @param aspect defines the aspect ratio\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\n * @returns a new matrix as a left-handed perspective projection matrix\n */\n static PerspectiveFovLH(e, t, i, r, s, a = 0, o = !1) {\n const l = new L();\n return L.PerspectiveFovLHToRef(e, t, i, r, l, !0, s, a, o), l;\n }\n /**\n * Stores a left-handed perspective projection into a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#81\n * @param fov defines the horizontal field of view\n * @param aspect defines the aspect ratio\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\n * @param result defines the target matrix\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\n * @returns result input\n */\n static PerspectiveFovLHToRef(e, t, i, r, s, a = !0, o, l = 0, c = !1) {\n const h = i, u = r, f = 1 / Math.tan(e * 0.5), d = a ? f / t : f, p = a ? f : f * t, g = c && h === 0 ? -1 : u !== 0 ? (u + h) / (u - h) : 1, m = c && h === 0 ? 2 * u : u !== 0 ? -2 * u * h / (u - h) : -2 * h, v = Math.tan(l);\n return L.FromValuesToRef(d, 0, 0, 0, 0, p, 0, v, 0, 0, g, 1, 0, 0, m, 0, s), o && s.multiplyToRef(vn, s), s._updateIdentityStatus(!1), s;\n }\n /**\n * Stores a left-handed perspective projection into a given matrix with depth reversed\n * Example Playground - https://playground.babylonjs.com/#AV9X17#89\n * @param fov defines the horizontal field of view\n * @param aspect defines the aspect ratio\n * @param znear defines the near clip plane\n * @param zfar not used as infinity is used as far clip\n * @param result defines the target matrix\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @returns result input\n */\n static PerspectiveFovReverseLHToRef(e, t, i, r, s, a = !0, o, l = 0) {\n const c = 1 / Math.tan(e * 0.5), h = a ? c / t : c, u = a ? c : c * t, f = Math.tan(l);\n return L.FromValuesToRef(h, 0, 0, 0, 0, u, 0, f, 0, 0, -i, 1, 0, 0, 1, 0, s), o && s.multiplyToRef(vn, s), s._updateIdentityStatus(!1), s;\n }\n /**\n * Creates a right-handed perspective projection matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#83\n * @param fov defines the horizontal field of view\n * @param aspect defines the aspect ratio\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\n * @returns a new matrix as a right-handed perspective projection matrix\n */\n static PerspectiveFovRH(e, t, i, r, s, a = 0, o = !1) {\n const l = new L();\n return L.PerspectiveFovRHToRef(e, t, i, r, l, !0, s, a, o), l;\n }\n /**\n * Stores a right-handed perspective projection into a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#84\n * @param fov defines the horizontal field of view\n * @param aspect defines the aspect ratio\n * @param znear defines the near clip plane\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\n * @param result defines the target matrix\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\n * @returns result input\n */\n static PerspectiveFovRHToRef(e, t, i, r, s, a = !0, o, l = 0, c = !1) {\n const h = i, u = r, f = 1 / Math.tan(e * 0.5), d = a ? f / t : f, p = a ? f : f * t, g = c && h === 0 ? 1 : u !== 0 ? -(u + h) / (u - h) : -1, m = c && h === 0 ? 2 * u : u !== 0 ? -2 * u * h / (u - h) : -2 * h, v = Math.tan(l);\n return L.FromValuesToRef(d, 0, 0, 0, 0, p, 0, v, 0, 0, g, -1, 0, 0, m, 0, s), o && s.multiplyToRef(vn, s), s._updateIdentityStatus(!1), s;\n }\n /**\n * Stores a right-handed perspective projection into a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#90\n * @param fov defines the horizontal field of view\n * @param aspect defines the aspect ratio\n * @param znear defines the near clip plane\n * @param zfar not used as infinity is used as far clip\n * @param result defines the target matrix\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\n * @returns result input\n */\n static PerspectiveFovReverseRHToRef(e, t, i, r, s, a = !0, o, l = 0) {\n const c = 1 / Math.tan(e * 0.5), h = a ? c / t : c, u = a ? c : c * t, f = Math.tan(l);\n return L.FromValuesToRef(h, 0, 0, 0, 0, u, 0, f, 0, 0, -i, -1, 0, 0, -1, 0, s), o && s.multiplyToRef(vn, s), s._updateIdentityStatus(!1), s;\n }\n /**\n * Computes a complete transformation matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#113\n * @param viewport defines the viewport to use\n * @param world defines the world matrix\n * @param view defines the view matrix\n * @param projection defines the projection matrix\n * @param zmin defines the near clip plane\n * @param zmax defines the far clip plane\n * @returns the transformation matrix\n */\n static GetFinalMatrix(e, t, i, r, s, a) {\n const o = e.width, l = e.height, c = e.x, h = e.y, u = L.FromValues(o / 2, 0, 0, 0, 0, -l / 2, 0, 0, 0, 0, a - s, 0, c + o / 2, l / 2 + h, s, 1), f = new t.constructor();\n return t.multiplyToRef(i, f), f.multiplyToRef(r, f), f.multiplyToRef(u, f);\n }\n /**\n * Extracts a 2x2 matrix from a given matrix and store the result in a Float32Array\n * @param matrix defines the matrix to use\n * @returns a new Float32Array array with 4 elements : the 2x2 matrix extracted from the given matrix\n */\n static GetAsMatrix2x2(e) {\n const t = e.m, i = [t[0], t[1], t[4], t[5]];\n return gi.MatrixUse64Bits ? i : new Float32Array(i);\n }\n /**\n * Extracts a 3x3 matrix from a given matrix and store the result in a Float32Array\n * @param matrix defines the matrix to use\n * @returns a new Float32Array array with 9 elements : the 3x3 matrix extracted from the given matrix\n */\n static GetAsMatrix3x3(e) {\n const t = e.m, i = [t[0], t[1], t[2], t[4], t[5], t[6], t[8], t[9], t[10]];\n return gi.MatrixUse64Bits ? i : new Float32Array(i);\n }\n /**\n * Compute the transpose of a given matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#111\n * @param matrix defines the matrix to transpose\n * @returns the new matrix\n */\n static Transpose(e) {\n const t = new e.constructor();\n return L.TransposeToRef(e, t), t;\n }\n /**\n * Compute the transpose of a matrix and store it in a target matrix\n * Example Playground - https://playground.babylonjs.com/#AV9X17#112\n * @param matrix defines the matrix to transpose\n * @param result defines the target matrix\n * @returns result input\n */\n static TransposeToRef(e, t) {\n const i = e.m, r = i[0], s = i[4], a = i[8], o = i[12], l = i[1], c = i[5], h = i[9], u = i[13], f = i[2], d = i[6], p = i[10], g = i[14], m = i[3], v = i[7], E = i[11], C = i[15], T = t._m;\n return T[0] = r, T[1] = s, T[2] = a, T[3] = o, T[4] = l, T[5] = c, T[6] = h, T[7] = u, T[8] = f, T[9] = d, T[10] = p, T[11] = g, T[12] = m, T[13] = v, T[14] = E, T[15] = C, t.markAsUpdated(), t._updateIdentityStatus(e._isIdentity, e._isIdentityDirty), t;\n }\n /**\n * Computes a reflection matrix from a plane\n * Example Playground - https://playground.babylonjs.com/#AV9X17#87\n * @param plane defines the reflection plane\n * @returns a new matrix\n */\n static Reflection(e) {\n const t = new L();\n return L.ReflectionToRef(e, t), t;\n }\n /**\n * Computes a reflection matrix from a plane\n * Example Playground - https://playground.babylonjs.com/#AV9X17#88\n * @param plane defines the reflection plane\n * @param result defines the target matrix\n * @returns result input\n */\n static ReflectionToRef(e, t) {\n e.normalize();\n const i = e.normal.x, r = e.normal.y, s = e.normal.z, a = -2 * i, o = -2 * r, l = -2 * s;\n return L.FromValuesToRef(a * i + 1, o * i, l * i, 0, a * r, o * r + 1, l * r, 0, a * s, o * s, l * s + 1, 0, a * e.d, o * e.d, l * e.d, 1, t), t;\n }\n /**\n * Sets the given matrix as a rotation matrix composed from the 3 left handed axes\n * @param xaxis defines the value of the 1st axis\n * @param yaxis defines the value of the 2nd axis\n * @param zaxis defines the value of the 3rd axis\n * @param result defines the target matrix\n * @returns result input\n */\n static FromXYZAxesToRef(e, t, i, r) {\n return L.FromValuesToRef(e._x, e._y, e._z, 0, t._x, t._y, t._z, 0, i._x, i._y, i._z, 0, 0, 0, 0, 1, r), r;\n }\n /**\n * Creates a rotation matrix from a quaternion and stores it in a target matrix\n * @param quat defines the quaternion to use\n * @param result defines the target matrix\n * @returns result input\n */\n static FromQuaternionToRef(e, t) {\n const i = e._x * e._x, r = e._y * e._y, s = e._z * e._z, a = e._x * e._y, o = e._z * e._w, l = e._z * e._x, c = e._y * e._w, h = e._y * e._z, u = e._x * e._w;\n return t._m[0] = 1 - 2 * (r + s), t._m[1] = 2 * (a + o), t._m[2] = 2 * (l - c), t._m[3] = 0, t._m[4] = 2 * (a - o), t._m[5] = 1 - 2 * (s + i), t._m[6] = 2 * (h + u), t._m[7] = 0, t._m[8] = 2 * (l + c), t._m[9] = 2 * (h - u), t._m[10] = 1 - 2 * (r + i), t._m[11] = 0, t._m[12] = 0, t._m[13] = 0, t._m[14] = 0, t._m[15] = 1, t.markAsUpdated(), t;\n }\n}\nL._UpdateFlagSeed = 0;\nL._IdentityReadOnly = L.Identity();\nObject.defineProperties(L.prototype, {\n dimension: { value: [4, 4] },\n rank: { value: 2 }\n});\nclass be {\n}\nbe.Vector3 = vi.BuildTuple(11, _.Zero);\nbe.Matrix = vi.BuildTuple(2, L.Identity);\nbe.Quaternion = vi.BuildTuple(3, Ce.Zero);\nclass z {\n}\nz.Vector2 = vi.BuildTuple(3, me.Zero);\nz.Vector3 = vi.BuildTuple(13, _.Zero);\nz.Vector4 = vi.BuildTuple(3, Ke.Zero);\nz.Quaternion = vi.BuildTuple(2, Ce.Zero);\nz.Matrix = vi.BuildTuple(8, L.Identity);\nRe(\"BABYLON.Vector2\", me);\nRe(\"BABYLON.Vector3\", _);\nRe(\"BABYLON.Vector4\", Ke);\nRe(\"BABYLON.Matrix\", L);\nconst vn = L.FromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 1);\nclass Xo {\n constructor() {\n this.rootNodes = [], this.cameras = [], this.lights = [], this.meshes = [], this.skeletons = [], this.particleSystems = [], this.animations = [], this.animationGroups = [], this.multiMaterials = [], this.materials = [], this.morphTargetManagers = [], this.geometries = [], this.transformNodes = [], this.actionManagers = [], this.textures = [], this._environmentTexture = null, this.postProcesses = [];\n }\n /**\n * Adds a parser in the list of available ones\n * @param name Defines the name of the parser\n * @param parser Defines the parser to add\n */\n static AddParser(e, t) {\n this._BabylonFileParsers[e] = t;\n }\n /**\n * Gets a general parser from the list of available ones\n * @param name Defines the name of the parser\n * @returns the requested parser or null\n */\n static GetParser(e) {\n return this._BabylonFileParsers[e] ? this._BabylonFileParsers[e] : null;\n }\n /**\n * Adds n individual parser in the list of available ones\n * @param name Defines the name of the parser\n * @param parser Defines the parser to add\n */\n static AddIndividualParser(e, t) {\n this._IndividualBabylonFileParsers[e] = t;\n }\n /**\n * Gets an individual parser from the list of available ones\n * @param name Defines the name of the parser\n * @returns the requested parser or null\n */\n static GetIndividualParser(e) {\n return this._IndividualBabylonFileParsers[e] ? this._IndividualBabylonFileParsers[e] : null;\n }\n /**\n * Parser json data and populate both a scene and its associated container object\n * @param jsonData Defines the data to parse\n * @param scene Defines the scene to parse the data for\n * @param container Defines the container attached to the parsing sequence\n * @param rootUrl Defines the root url of the data\n */\n static Parse(e, t, i, r) {\n for (const s in this._BabylonFileParsers)\n Object.prototype.hasOwnProperty.call(this._BabylonFileParsers, s) && this._BabylonFileParsers[s](e, t, i, r);\n }\n /**\n * Texture used in all pbr material as the reflection texture.\n * As in the majority of the scene they are the same (exception for multi room and so on),\n * this is easier to reference from here than from all the materials.\n */\n get environmentTexture() {\n return this._environmentTexture;\n }\n set environmentTexture(e) {\n this._environmentTexture = e;\n }\n /**\n * @returns all meshes, lights, cameras, transformNodes and bones\n */\n getNodes() {\n let e = [];\n return e = e.concat(this.meshes), e = e.concat(this.lights), e = e.concat(this.cameras), e = e.concat(this.transformNodes), this.skeletons.forEach((t) => e = e.concat(t.bones)), e;\n }\n}\nXo._BabylonFileParsers = {};\nXo._IndividualBabylonFileParsers = {};\nfunction P(n, e, t, i) {\n var r = arguments.length, s = r < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, a;\n if (typeof Reflect == \"object\" && typeof Reflect.decorate == \"function\")\n s = Reflect.decorate(n, e, t, i);\n else\n for (var o = n.length - 1; o >= 0; o--)\n (a = n[o]) && (s = (r < 3 ? a(s) : r > 3 ? a(e, t, s) : a(e, t)) || s);\n return r > 3 && s && Object.defineProperty(e, t, s), s;\n}\nconst ml = {}, Wl = {};\nfunction Ry(n) {\n const e = n.getClassName();\n return Wl[e] || (Wl[e] = {}), Wl[e];\n}\nfunction gu(n) {\n const e = n.getClassName();\n if (ml[e])\n return ml[e];\n ml[e] = {};\n const t = ml[e];\n let i = n, r = e;\n for (; r; ) {\n const s = Wl[r];\n for (const l in s)\n t[l] = s[l];\n let a, o = !1;\n do {\n if (a = Object.getPrototypeOf(i), !a.getClassName) {\n o = !0;\n break;\n }\n if (a.getClassName() !== r)\n break;\n i = a;\n } while (a);\n if (o)\n break;\n r = a.getClassName(), i = a;\n }\n return t;\n}\nfunction wr(n, e) {\n return (t, i) => {\n const r = Ry(t);\n r[i] || (r[i] = { type: n, sourceName: e });\n };\n}\nfunction Sy(n, e = null) {\n return (t, i) => {\n const r = e || \"_\" + i;\n Object.defineProperty(t, i, {\n get: function() {\n return this[r];\n },\n set: function(s) {\n typeof this.equals == \"function\" && this.equals(s) || this[r] !== s && (this[r] = s, t[n].apply(this));\n },\n enumerable: !0,\n configurable: !0\n });\n };\n}\nfunction oe(n, e = null) {\n return Sy(n, e);\n}\nfunction w(n) {\n return wr(0, n);\n}\nfunction Tt(n) {\n return wr(1, n);\n}\nfunction $i(n) {\n return wr(2, n);\n}\nfunction Ho(n) {\n return wr(3, n);\n}\nfunction X_(n) {\n return wr(4, n);\n}\nfunction hn(n) {\n return wr(5, n);\n}\nfunction yy(n) {\n return wr(6, n);\n}\nfunction Iy(n) {\n return wr(7, n);\n}\nfunction H_(n) {\n return wr(8, n);\n}\nfunction by(n) {\n return wr(9, n);\n}\nfunction Ay(n) {\n return wr(10, n);\n}\nfunction K_(n) {\n return wr(12, n);\n}\nfunction ln(n, e, t, i) {\n const r = t.value;\n t.value = (...s) => {\n let a = r;\n if (typeof _native < \"u\" && _native[e]) {\n const o = _native[e];\n i ? a = (...l) => i(...l) ? o(...l) : r(...l) : a = o;\n }\n return n[e] = a, a(...s);\n };\n}\nln.filter = function(n) {\n return (e, t, i) => ln(e, t, i, n);\n};\nclass je {\n /**\n * Returns -1 if value is negative and +1 is value is positive.\n * @param value the value\n * @returns the value itself if it's equal to zero.\n */\n static Sign(e) {\n return e = +e, e === 0 || isNaN(e) ? e : e > 0 ? 1 : -1;\n }\n /**\n * the log2 of value.\n * @param value the value to compute log2 of\n * @returns the log2 of value.\n */\n static Log2(e) {\n return Math.log(e) * Math.LOG2E;\n }\n /**\n * the floor part of a log2 value.\n * @param value the value to compute log2 of\n * @returns the log2 of value.\n */\n static ILog2(e) {\n if (Math.log2)\n return Math.floor(Math.log2(e));\n if (e < 0)\n return NaN;\n if (e === 0)\n return -1 / 0;\n let t = 0;\n if (e < 1) {\n for (; e < 1; )\n t++, e = e * 2;\n t = -t;\n } else if (e > 1)\n for (; e > 1; )\n t++, e = Math.floor(e / 2);\n return t;\n }\n /**\n * Loops the value, so that it is never larger than length and never smaller than 0.\n *\n * This is similar to the modulo operator but it works with floating point numbers.\n * For example, using 3.0 for t and 2.5 for length, the result would be 0.5.\n * With t = 5 and length = 2.5, the result would be 0.0.\n * Note, however, that the behaviour is not defined for negative numbers as it is for the modulo operator\n * @param value the value\n * @param length the length\n * @returns the looped value\n */\n static Repeat(e, t) {\n return e - Math.floor(e / t) * t;\n }\n /**\n * Normalize the value between 0.0 and 1.0 using min and max values\n * @param value value to normalize\n * @param min max to normalize between\n * @param max min to normalize between\n * @returns the normalized value\n */\n static Normalize(e, t, i) {\n return (e - t) / (i - t);\n }\n /**\n * Denormalize the value from 0.0 and 1.0 using min and max values\n * @param normalized value to denormalize\n * @param min max to denormalize between\n * @param max min to denormalize between\n * @returns the denormalized value\n */\n static Denormalize(e, t, i) {\n return e * (i - t) + t;\n }\n /**\n * Calculates the shortest difference between two given angles given in degrees.\n * @param current current angle in degrees\n * @param target target angle in degrees\n * @returns the delta\n */\n static DeltaAngle(e, t) {\n let i = je.Repeat(t - e, 360);\n return i > 180 && (i -= 360), i;\n }\n /**\n * PingPongs the value t, so that it is never larger than length and never smaller than 0.\n * @param tx value\n * @param length length\n * @returns The returned value will move back and forth between 0 and length\n */\n static PingPong(e, t) {\n const i = je.Repeat(e, t * 2);\n return t - Math.abs(i - t);\n }\n /**\n * Interpolates between min and max with smoothing at the limits.\n *\n * This function interpolates between min and max in a similar way to Lerp. However, the interpolation will gradually speed up\n * from the start and slow down toward the end. This is useful for creating natural-looking animation, fading and other transitions.\n * @param from from\n * @param to to\n * @param tx value\n * @returns the smooth stepped value\n */\n static SmoothStep(e, t, i) {\n let r = je.Clamp(i);\n return r = -2 * r * r * r + 3 * r * r, t * r + e * (1 - r);\n }\n /**\n * Moves a value current towards target.\n *\n * This is essentially the same as Mathf.Lerp but instead the function will ensure that the speed never exceeds maxDelta.\n * Negative values of maxDelta pushes the value away from target.\n * @param current current value\n * @param target target value\n * @param maxDelta max distance to move\n * @returns resulting value\n */\n static MoveTowards(e, t, i) {\n let r = 0;\n return Math.abs(t - e) <= i ? r = t : r = e + je.Sign(t - e) * i, r;\n }\n /**\n * Same as MoveTowards but makes sure the values interpolate correctly when they wrap around 360 degrees.\n *\n * Variables current and target are assumed to be in degrees. For optimization reasons, negative values of maxDelta\n * are not supported and may cause oscillation. To push current away from a target angle, add 180 to that angle instead.\n * @param current current value\n * @param target target value\n * @param maxDelta max distance to move\n * @returns resulting angle\n */\n static MoveTowardsAngle(e, t, i) {\n const r = je.DeltaAngle(e, t);\n let s = 0;\n return -i < r && r < i ? s = t : (t = e + r, s = je.MoveTowards(e, t, i)), s;\n }\n /**\n * Same as Lerp but makes sure the values interpolate correctly when they wrap around 360 degrees.\n * The parameter t is clamped to the range [0, 1]. Variables a and b are assumed to be in degrees.\n * @param start start value\n * @param end target value\n * @param amount amount to lerp between\n * @returns the lerped value\n */\n static LerpAngle(e, t, i) {\n let r = je.Repeat(t - e, 360);\n return r > 180 && (r -= 360), e + r * ii(i);\n }\n /**\n * Calculates the linear parameter t that produces the interpolant value within the range [a, b].\n * @param a start value\n * @param b target value\n * @param value value between a and b\n * @returns the inverseLerp value\n */\n static InverseLerp(e, t, i) {\n let r = 0;\n return e != t ? r = ii((i - e) / (t - e)) : r = 0, r;\n }\n /**\n * Returns a new scalar located for \"amount\" (float) on the Hermite spline defined by the scalars \"value1\", \"value3\", \"tangent1\", \"tangent2\".\n * @see http://mathworld.wolfram.com/HermitePolynomial.html\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param amount defines the amount on the interpolation spline (between 0 and 1)\n * @returns hermite result\n */\n static Hermite(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 2 * o - 3 * a + 1, c = -2 * o + 3 * a, h = o - 2 * a + s, u = o - a;\n return e * l + i * c + t * h + r * u;\n }\n /**\n * Returns a new scalar which is the 1st derivative of the Hermite spline defined by the scalars \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @returns 1st derivative\n */\n static Hermite1stDerivative(e, t, i, r, s) {\n const a = s * s;\n return (a - s) * 6 * e + (3 * a - 4 * s + 1) * t + (-a + s) * 6 * i + (3 * a - 2 * s) * r;\n }\n /**\n * This function returns percentage of a number in a given range.\n *\n * RangeToPercent(40,20,60) will return 0.5 (50%)\n * RangeToPercent(34,0,100) will return 0.34 (34%)\n * @param number to convert to percentage\n * @param min min range\n * @param max max range\n * @returns the percentage\n */\n static RangeToPercent(e, t, i) {\n return (e - t) / (i - t);\n }\n /**\n * This function returns number that corresponds to the percentage in a given range.\n *\n * PercentToRange(0.34,0,100) will return 34.\n * @param percent to convert to number\n * @param min min range\n * @param max max range\n * @returns the number\n */\n static PercentToRange(e, t, i) {\n return (i - t) * e + t;\n }\n /**\n * Returns the highest common factor of two integers.\n * @param a first parameter\n * @param b second parameter\n * @returns HCF of a and b\n */\n static HCF(e, t) {\n const i = e % t;\n return i === 0 ? t : je.HCF(t, i);\n }\n}\nje.TwoPi = Math.PI * 2;\nje.WithinEpsilon = Ii;\nje.ToHex = qr;\nje.Clamp = ii;\nje.Lerp = W_;\nje.RandomRange = jt;\nje.NormalizeRadians = G_;\nfunction pa(n) {\n return Math.pow(n, zl);\n}\nfunction ga(n) {\n return n <= 0.04045 ? 0.0773993808 * n : Math.pow(0.947867299 * (n + 0.055), 2.4);\n}\nfunction ma(n) {\n return Math.pow(n, kl);\n}\nfunction _a(n) {\n return n <= 31308e-7 ? 12.92 * n : 1.055 * Math.pow(n, 0.41666) - 0.055;\n}\nclass Ne {\n /**\n * Creates a new Color3 object from red, green, blue values, all between 0 and 1\n * @param r defines the red component (between 0 and 1, default is 0)\n * @param g defines the green component (between 0 and 1, default is 0)\n * @param b defines the blue component (between 0 and 1, default is 0)\n */\n constructor(e = 0, t = 0, i = 0) {\n this.r = e, this.g = t, this.b = i;\n }\n /**\n * Creates a string with the Color3 current values\n * @returns the string representation of the Color3 object\n */\n toString() {\n return \"{R: \" + this.r + \" G:\" + this.g + \" B:\" + this.b + \"}\";\n }\n /**\n * Returns the string \"Color3\"\n * @returns \"Color3\"\n */\n getClassName() {\n return \"Color3\";\n }\n /**\n * Compute the Color3 hash code\n * @returns an unique number that can be used to hash Color3 objects\n */\n getHashCode() {\n let e = this.r * 255 | 0;\n return e = e * 397 ^ (this.g * 255 | 0), e = e * 397 ^ (this.b * 255 | 0), e;\n }\n // Operators\n /**\n * Stores in the given array from the given starting index the red, green, blue values as successive elements\n * @param array defines the array where to store the r,g,b components\n * @param index defines an optional index in the target array to define where to start storing values\n * @returns the current Color3 object\n */\n toArray(e, t = 0) {\n return e[t] = this.r, e[t + 1] = this.g, e[t + 2] = this.b, this;\n }\n /**\n * Update the current color with values stored in an array from the starting index of the given array\n * @param array defines the source array\n * @param offset defines an offset in the source array\n * @returns the current Color3 object\n */\n fromArray(e, t = 0) {\n return Ne.FromArrayToRef(e, t, this), this;\n }\n /**\n * Returns a new Color4 object from the current Color3 and the given alpha\n * @param alpha defines the alpha component on the new Color4 object (default is 1)\n * @returns a new Color4 object\n */\n toColor4(e = 1) {\n return new et(this.r, this.g, this.b, e);\n }\n /**\n * Returns a new array populated with 3 numeric elements : red, green and blue values\n * @returns the new array\n */\n asArray() {\n return [this.r, this.g, this.b];\n }\n /**\n * Returns the luminance value\n * @returns a float value\n */\n toLuminance() {\n return this.r * 0.3 + this.g * 0.59 + this.b * 0.11;\n }\n /**\n * Multiply each Color3 rgb values by the given Color3 rgb values in a new Color3 object\n * @param otherColor defines the second operand\n * @returns the new Color3 object\n */\n multiply(e) {\n return new this.constructor(this.r * e.r, this.g * e.g, this.b * e.b);\n }\n /**\n * Multiply the rgb values of the Color3 and the given Color3 and stores the result in the object \"result\"\n * @param otherColor defines the second operand\n * @param result defines the Color3 object where to store the result\n * @returns the result Color3\n */\n multiplyToRef(e, t) {\n return t.r = this.r * e.r, t.g = this.g * e.g, t.b = this.b * e.b, t;\n }\n /**\n * Multiplies the current Color3 coordinates by the given ones\n * @param otherColor defines the second operand\n * @returns the current updated Color3\n */\n multiplyInPlace(e) {\n return this.r *= e.r, this.g *= e.g, this.b *= e.b, this;\n }\n /**\n * Returns a new Color3 set with the result of the multiplication of the current Color3 coordinates by the given floats\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @returns the new Color3\n */\n multiplyByFloats(e, t, i) {\n return new this.constructor(this.r * e, this.g * t, this.b * i);\n }\n /**\n * @internal\n * Do not use\n */\n divide(e) {\n throw new ReferenceError(\"Can not divide a color\");\n }\n /**\n * @internal\n * Do not use\n */\n divideToRef(e, t) {\n throw new ReferenceError(\"Can not divide a color\");\n }\n /**\n * @internal\n * Do not use\n */\n divideInPlace(e) {\n throw new ReferenceError(\"Can not divide a color\");\n }\n /**\n * Updates the current Color3 with the minimal coordinate values between its and the given color ones\n * @param other defines the second operand\n * @returns the current updated Color3\n */\n minimizeInPlace(e) {\n return this.minimizeInPlaceFromFloats(e.r, e.g, e.b);\n }\n /**\n * Updates the current Color3 with the maximal coordinate values between its and the given color ones.\n * @param other defines the second operand\n * @returns the current updated Color3\n */\n maximizeInPlace(e) {\n return this.maximizeInPlaceFromFloats(e.r, e.g, e.b);\n }\n /**\n * Updates the current Color3 with the minimal coordinate values between its and the given coordinates\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @returns the current updated Color3\n */\n minimizeInPlaceFromFloats(e, t, i) {\n return this.r = Math.min(e, this.r), this.g = Math.min(t, this.g), this.b = Math.min(i, this.b), this;\n }\n /**\n * Updates the current Color3 with the maximal coordinate values between its and the given coordinates.\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @returns the current updated Color3\n */\n maximizeInPlaceFromFloats(e, t, i) {\n return this.r = Math.max(e, this.r), this.g = Math.max(t, this.g), this.b = Math.max(i, this.b), this;\n }\n /**\n * @internal\n * Do not use\n */\n floorToRef(e) {\n throw new ReferenceError(\"Can not floor a color\");\n }\n /**\n * @internal\n * Do not use\n */\n floor() {\n throw new ReferenceError(\"Can not floor a color\");\n }\n /**\n * @internal\n * Do not use\n */\n fractToRef(e) {\n throw new ReferenceError(\"Can not fract a color\");\n }\n /**\n * @internal\n * Do not use\n */\n fract() {\n throw new ReferenceError(\"Can not fract a color\");\n }\n /**\n * Determines equality between Color3 objects\n * @param otherColor defines the second operand\n * @returns true if the rgb values are equal to the given ones\n */\n equals(e) {\n return e && this.r === e.r && this.g === e.g && this.b === e.b;\n }\n /**\n * Alias for equalsToFloats\n * @param r red color component\n * @param g green color component\n * @param b blue color component\n * @returns boolean\n */\n equalsFloats(e, t, i) {\n return this.equalsToFloats(e, t, i);\n }\n /**\n * Determines equality between the current Color3 object and a set of r,b,g values\n * @param r defines the red component to check\n * @param g defines the green component to check\n * @param b defines the blue component to check\n * @returns true if the rgb values are equal to the given ones\n */\n equalsToFloats(e, t, i) {\n return this.r === e && this.g === t && this.b === i;\n }\n /**\n * Returns true if the current Color3 and the given color coordinates are distant less than epsilon\n * @param otherColor defines the second operand\n * @param epsilon defines the minimal distance to define values as equals\n * @returns true if both colors are distant less than epsilon\n */\n equalsWithEpsilon(e, t = xt) {\n return je.WithinEpsilon(this.r, e.r, t) && je.WithinEpsilon(this.g, e.g, t) && je.WithinEpsilon(this.b, e.b, t);\n }\n /**\n * @internal\n * Do not use\n */\n negate() {\n throw new ReferenceError(\"Can not negate a color\");\n }\n /**\n * @internal\n * Do not use\n */\n negateInPlace() {\n throw new ReferenceError(\"Can not negate a color\");\n }\n /**\n * @internal\n * Do not use\n */\n negateToRef(e) {\n throw new ReferenceError(\"Can not negate a color\");\n }\n /**\n * Creates a new Color3 with the current Color3 values multiplied by scale\n * @param scale defines the scaling factor to apply\n * @returns a new Color3 object\n */\n scale(e) {\n return new this.constructor(this.r * e, this.g * e, this.b * e);\n }\n /**\n * Multiplies the Color3 values by the float \"scale\"\n * @param scale defines the scaling factor to apply\n * @returns the current updated Color3\n */\n scaleInPlace(e) {\n return this.r *= e, this.g *= e, this.b *= e, this;\n }\n /**\n * Multiplies the rgb values by scale and stores the result into \"result\"\n * @param scale defines the scaling factor\n * @param result defines the Color3 object where to store the result\n * @returns the result Color3\n */\n scaleToRef(e, t) {\n return t.r = this.r * e, t.g = this.g * e, t.b = this.b * e, t;\n }\n /**\n * Scale the current Color3 values by a factor and add the result to a given Color3\n * @param scale defines the scale factor\n * @param result defines color to store the result into\n * @returns the result Color3\n */\n scaleAndAddToRef(e, t) {\n return t.r += this.r * e, t.g += this.g * e, t.b += this.b * e, t;\n }\n /**\n * Clamps the rgb values by the min and max values and stores the result into \"result\"\n * @param min defines minimum clamping value (default is 0)\n * @param max defines maximum clamping value (default is 1)\n * @param result defines color to store the result into\n * @returns the result Color3\n */\n clampToRef(e = 0, t = 1, i) {\n return i.r = ii(this.r, e, t), i.g = ii(this.g, e, t), i.b = ii(this.b, e, t), i;\n }\n /**\n * Creates a new Color3 set with the added values of the current Color3 and of the given one\n * @param otherColor defines the second operand\n * @returns the new Color3\n */\n add(e) {\n return new this.constructor(this.r + e.r, this.g + e.g, this.b + e.b);\n }\n /**\n * Adds the given color to the current Color3\n * @param otherColor defines the second operand\n * @returns the current updated Color3\n */\n addInPlace(e) {\n return this.r += e.r, this.g += e.g, this.b += e.b, this;\n }\n /**\n * Adds the given coordinates to the current Color3\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @returns the current updated Color3\n */\n addInPlaceFromFloats(e, t, i) {\n return this.r += e, this.g += t, this.b += i, this;\n }\n /**\n * Stores the result of the addition of the current Color3 and given one rgb values into \"result\"\n * @param otherColor defines the second operand\n * @param result defines Color3 object to store the result into\n * @returns the unmodified current Color3\n */\n addToRef(e, t) {\n return t.r = this.r + e.r, t.g = this.g + e.g, t.b = this.b + e.b, t;\n }\n /**\n * Returns a new Color3 set with the subtracted values of the given one from the current Color3\n * @param otherColor defines the second operand\n * @returns the new Color3\n */\n subtract(e) {\n return new this.constructor(this.r - e.r, this.g - e.g, this.b - e.b);\n }\n /**\n * Stores the result of the subtraction of given one from the current Color3 rgb values into \"result\"\n * @param otherColor defines the second operand\n * @param result defines Color3 object to store the result into\n * @returns the unmodified current Color3\n */\n subtractToRef(e, t) {\n return t.r = this.r - e.r, t.g = this.g - e.g, t.b = this.b - e.b, t;\n }\n /**\n * Subtract the given color from the current Color3\n * @param otherColor defines the second operand\n * @returns the current updated Color3\n */\n subtractInPlace(e) {\n return this.r -= e.r, this.g -= e.g, this.b -= e.b, this;\n }\n /**\n * Returns a new Color3 set with the subtraction of the given floats from the current Color3 coordinates\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @returns the resulting Color3\n */\n subtractFromFloats(e, t, i) {\n return new this.constructor(this.r - e, this.g - t, this.b - i);\n }\n /**\n * Subtracts the given floats from the current Color3 coordinates and set the given color \"result\" with this result\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @param result defines the Color3 object where to store the result\n * @returns the result\n */\n subtractFromFloatsToRef(e, t, i, r) {\n return r.copyFromFloats(this.r - e, this.g - t, this.b - i);\n }\n /**\n * Copy the current object\n * @returns a new Color3 copied the current one\n */\n clone() {\n return new this.constructor(this.r, this.g, this.b);\n }\n /**\n * Copies the rgb values from the source in the current Color3\n * @param source defines the source Color3 object\n * @returns the updated Color3 object\n */\n copyFrom(e) {\n return this.r = e.r, this.g = e.g, this.b = e.b, this;\n }\n /**\n * Updates the Color3 rgb values from the given floats\n * @param r defines the red component to read from\n * @param g defines the green component to read from\n * @param b defines the blue component to read from\n * @returns the current Color3 object\n */\n copyFromFloats(e, t, i) {\n return this.r = e, this.g = t, this.b = i, this;\n }\n /**\n * Updates the Color3 rgb values from the given floats\n * @param r defines the red component to read from\n * @param g defines the green component to read from\n * @param b defines the blue component to read from\n * @returns the current Color3 object\n */\n set(e, t, i) {\n return this.copyFromFloats(e, t, i);\n }\n /**\n * Copies the given float to the current Color3 coordinates\n * @param v defines the r, g and b coordinates of the operand\n * @returns the current updated Color3\n */\n setAll(e) {\n return this.r = this.g = this.b = e, this;\n }\n /**\n * Compute the Color3 hexadecimal code as a string\n * @returns a string containing the hexadecimal representation of the Color3 object\n */\n toHexString() {\n const e = Math.round(this.r * 255), t = Math.round(this.g * 255), i = Math.round(this.b * 255);\n return \"#\" + qr(e) + qr(t) + qr(i);\n }\n /**\n * Converts current color in rgb space to HSV values\n * @returns a new color3 representing the HSV values\n */\n toHSV() {\n const e = new this.constructor();\n return this.toHSVToRef(e), e;\n }\n /**\n * Converts current color in rgb space to HSV values\n * @param result defines the Color3 where to store the HSV values\n */\n toHSVToRef(e) {\n const t = this.r, i = this.g, r = this.b, s = Math.max(t, i, r), a = Math.min(t, i, r);\n let o = 0, l = 0;\n const c = s, h = s - a;\n s !== 0 && (l = h / s), s != a && (s == t ? (o = (i - r) / h, i < r && (o += 6)) : s == i ? o = (r - t) / h + 2 : s == r && (o = (t - i) / h + 4), o *= 60), e.r = o, e.g = l, e.b = c;\n }\n /**\n * Computes a new Color3 converted from the current one to linear space\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns a new Color3 object\n */\n toLinearSpace(e = !1) {\n const t = new this.constructor();\n return this.toLinearSpaceToRef(t, e), t;\n }\n /**\n * Converts the Color3 values to linear space and stores the result in \"convertedColor\"\n * @param convertedColor defines the Color3 object where to store the linear space version\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns the unmodified Color3\n */\n toLinearSpaceToRef(e, t = !1) {\n return t ? (e.r = ga(this.r), e.g = ga(this.g), e.b = ga(this.b)) : (e.r = pa(this.r), e.g = pa(this.g), e.b = pa(this.b)), this;\n }\n /**\n * Computes a new Color3 converted from the current one to gamma space\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns a new Color3 object\n */\n toGammaSpace(e = !1) {\n const t = new this.constructor();\n return this.toGammaSpaceToRef(t, e), t;\n }\n /**\n * Converts the Color3 values to gamma space and stores the result in \"convertedColor\"\n * @param convertedColor defines the Color3 object where to store the gamma space version\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns the unmodified Color3\n */\n toGammaSpaceToRef(e, t = !1) {\n return t ? (e.r = _a(this.r), e.g = _a(this.g), e.b = _a(this.b)) : (e.r = ma(this.r), e.g = ma(this.g), e.b = ma(this.b)), this;\n }\n /**\n * Converts Hue, saturation and value to a Color3 (RGB)\n * @param hue defines the hue (value between 0 and 360)\n * @param saturation defines the saturation (value between 0 and 1)\n * @param value defines the value (value between 0 and 1)\n * @param result defines the Color3 where to store the RGB values\n */\n static HSVtoRGBToRef(e, t, i, r) {\n const s = i * t, a = e / 60, o = s * (1 - Math.abs(a % 2 - 1));\n let l = 0, c = 0, h = 0;\n a >= 0 && a <= 1 ? (l = s, c = o) : a >= 1 && a <= 2 ? (l = o, c = s) : a >= 2 && a <= 3 ? (c = s, h = o) : a >= 3 && a <= 4 ? (c = o, h = s) : a >= 4 && a <= 5 ? (l = o, h = s) : a >= 5 && a <= 6 && (l = s, h = o);\n const u = i - s;\n r.set(l + u, c + u, h + u);\n }\n /**\n * Converts Hue, saturation and value to a new Color3 (RGB)\n * @param hue defines the hue (value between 0 and 360)\n * @param saturation defines the saturation (value between 0 and 1)\n * @param value defines the value (value between 0 and 1)\n * @returns a new Color3 object\n */\n static FromHSV(e, t, i) {\n const r = new Ne(0, 0, 0);\n return Ne.HSVtoRGBToRef(e, t, i, r), r;\n }\n /**\n * Creates a new Color3 from the string containing valid hexadecimal values\n * @param hex defines a string containing valid hexadecimal values\n * @returns a new Color3 object\n */\n static FromHexString(e) {\n if (e.substring(0, 1) !== \"#\" || e.length !== 7)\n return new Ne(0, 0, 0);\n const t = parseInt(e.substring(1, 3), 16), i = parseInt(e.substring(3, 5), 16), r = parseInt(e.substring(5, 7), 16);\n return Ne.FromInts(t, i, r);\n }\n /**\n * Creates a new Color3 from the starting index of the given array\n * @param array defines the source array\n * @param offset defines an offset in the source array\n * @returns a new Color3 object\n */\n static FromArray(e, t = 0) {\n return new Ne(e[t], e[t + 1], e[t + 2]);\n }\n /**\n * Creates a new Color3 from the starting index element of the given array\n * @param array defines the source array to read from\n * @param offset defines the offset in the source array\n * @param result defines the target Color3 object\n */\n static FromArrayToRef(e, t = 0, i) {\n i.r = e[t], i.g = e[t + 1], i.b = e[t + 2];\n }\n /**\n * Creates a new Color3 from integer values (\\< 256)\n * @param r defines the red component to read from (value between 0 and 255)\n * @param g defines the green component to read from (value between 0 and 255)\n * @param b defines the blue component to read from (value between 0 and 255)\n * @returns a new Color3 object\n */\n static FromInts(e, t, i) {\n return new Ne(e / 255, t / 255, i / 255);\n }\n /**\n * Creates a new Color3 with values linearly interpolated of \"amount\" between the start Color3 and the end Color3\n * @param start defines the start Color3 value\n * @param end defines the end Color3 value\n * @param amount defines the gradient value between start and end\n * @returns a new Color3 object\n */\n static Lerp(e, t, i) {\n const r = new Ne(0, 0, 0);\n return Ne.LerpToRef(e, t, i, r), r;\n }\n /**\n * Creates a new Color3 with values linearly interpolated of \"amount\" between the start Color3 and the end Color3\n * @param left defines the start value\n * @param right defines the end value\n * @param amount defines the gradient factor\n * @param result defines the Color3 object where to store the result\n */\n static LerpToRef(e, t, i, r) {\n r.r = e.r + (t.r - e.r) * i, r.g = e.g + (t.g - e.g) * i, r.b = e.b + (t.b - e.b) * i;\n }\n /**\n * Returns a new Color3 located for \"amount\" (float) on the Hermite interpolation spline defined by the vectors \"value1\", \"tangent1\", \"value2\", \"tangent2\"\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent Color3\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent Color3\n * @param amount defines the amount on the interpolation spline (between 0 and 1)\n * @returns the new Color3\n */\n static Hermite(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 2 * o - 3 * a + 1, c = -2 * o + 3 * a, h = o - 2 * a + s, u = o - a, f = e.r * l + i.r * c + t.r * h + r.r * u, d = e.g * l + i.g * c + t.g * h + r.g * u, p = e.b * l + i.b * c + t.b * h + r.b * u;\n return new Ne(f, d, p);\n }\n /**\n * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @returns 1st derivative\n */\n static Hermite1stDerivative(e, t, i, r, s) {\n const a = Ne.Black();\n return this.Hermite1stDerivativeToRef(e, t, i, r, s, a), a;\n }\n /**\n * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @param result define where to store the derivative\n */\n static Hermite1stDerivativeToRef(e, t, i, r, s, a) {\n const o = s * s;\n a.r = (o - s) * 6 * e.r + (3 * o - 4 * s + 1) * t.r + (-o + s) * 6 * i.r + (3 * o - 2 * s) * r.r, a.g = (o - s) * 6 * e.g + (3 * o - 4 * s + 1) * t.g + (-o + s) * 6 * i.g + (3 * o - 2 * s) * r.g, a.b = (o - s) * 6 * e.b + (3 * o - 4 * s + 1) * t.b + (-o + s) * 6 * i.b + (3 * o - 2 * s) * r.b;\n }\n /**\n * Returns a Color3 value containing a red color\n * @returns a new Color3 object\n */\n static Red() {\n return new Ne(1, 0, 0);\n }\n /**\n * Returns a Color3 value containing a green color\n * @returns a new Color3 object\n */\n static Green() {\n return new Ne(0, 1, 0);\n }\n /**\n * Returns a Color3 value containing a blue color\n * @returns a new Color3 object\n */\n static Blue() {\n return new Ne(0, 0, 1);\n }\n /**\n * Returns a Color3 value containing a black color\n * @returns a new Color3 object\n */\n static Black() {\n return new Ne(0, 0, 0);\n }\n /**\n * Gets a Color3 value containing a black color that must not be updated\n */\n static get BlackReadOnly() {\n return Ne._BlackReadOnly;\n }\n /**\n * Returns a Color3 value containing a white color\n * @returns a new Color3 object\n */\n static White() {\n return new Ne(1, 1, 1);\n }\n /**\n * Returns a Color3 value containing a purple color\n * @returns a new Color3 object\n */\n static Purple() {\n return new Ne(0.5, 0, 0.5);\n }\n /**\n * Returns a Color3 value containing a magenta color\n * @returns a new Color3 object\n */\n static Magenta() {\n return new Ne(1, 0, 1);\n }\n /**\n * Returns a Color3 value containing a yellow color\n * @returns a new Color3 object\n */\n static Yellow() {\n return new Ne(1, 1, 0);\n }\n /**\n * Returns a Color3 value containing a gray color\n * @returns a new Color3 object\n */\n static Gray() {\n return new Ne(0.5, 0.5, 0.5);\n }\n /**\n * Returns a Color3 value containing a teal color\n * @returns a new Color3 object\n */\n static Teal() {\n return new Ne(0, 1, 1);\n }\n /**\n * Returns a Color3 value containing a random color\n * @returns a new Color3 object\n */\n static Random() {\n return new Ne(Math.random(), Math.random(), Math.random());\n }\n}\nNe._BlackReadOnly = Ne.Black();\nObject.defineProperties(Ne.prototype, {\n dimension: { value: [3] },\n rank: { value: 1 }\n});\nclass et {\n /**\n * Creates a new Color4 object from red, green, blue values, all between 0 and 1\n * @param r defines the red component (between 0 and 1, default is 0)\n * @param g defines the green component (between 0 and 1, default is 0)\n * @param b defines the blue component (between 0 and 1, default is 0)\n * @param a defines the alpha component (between 0 and 1, default is 1)\n */\n constructor(e = 0, t = 0, i = 0, r = 1) {\n this.r = e, this.g = t, this.b = i, this.a = r;\n }\n // Operators\n /**\n * Creates a new array populated with 4 numeric elements : red, green, blue, alpha values\n * @returns the new array\n */\n asArray() {\n return [this.r, this.g, this.b, this.a];\n }\n /**\n * Stores from the starting index in the given array the Color4 successive values\n * @param array defines the array where to store the r,g,b components\n * @param index defines an optional index in the target array to define where to start storing values\n * @returns the current Color4 object\n */\n toArray(e, t = 0) {\n return e[t] = this.r, e[t + 1] = this.g, e[t + 2] = this.b, e[t + 3] = this.a, this;\n }\n /**\n * Update the current color with values stored in an array from the starting index of the given array\n * @param array defines the source array\n * @param offset defines an offset in the source array\n * @returns the current Color4 object\n */\n fromArray(e, t = 0) {\n return this.r = e[t], this.g = e[t + 1], this.b = e[t + 2], this.a = e[t + 3], this;\n }\n /**\n * Determines equality between Color4 objects\n * @param otherColor defines the second operand\n * @returns true if the rgba values are equal to the given ones\n */\n equals(e) {\n return e && this.r === e.r && this.g === e.g && this.b === e.b && this.a === e.a;\n }\n /**\n * Creates a new Color4 set with the added values of the current Color4 and of the given one\n * @param otherColor defines the second operand\n * @returns a new Color4 object\n */\n add(e) {\n return new this.constructor(this.r + e.r, this.g + e.g, this.b + e.b, this.a + e.a);\n }\n /**\n * Updates the given color \"result\" with the result of the addition of the current Color4 and the given one.\n * @param otherColor the color to add\n * @param result the color to store the result\n * @returns result input\n */\n addToRef(e, t) {\n return t.r = this.r + e.r, t.g = this.g + e.g, t.b = this.b + e.b, t.a = this.a + e.a, t;\n }\n /**\n * Adds in place the given Color4 values to the current Color4 object\n * @param otherColor defines the second operand\n * @returns the current updated Color4 object\n */\n addInPlace(e) {\n return this.r += e.r, this.g += e.g, this.b += e.b, this.a += e.a, this;\n }\n /**\n * Adds the given coordinates to the current Color4\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @param a defines the a coordinate of the operand\n * @returns the current updated Color4\n */\n addInPlaceFromFloats(e, t, i, r) {\n return this.r += e, this.g += t, this.b += i, this.a += r, this;\n }\n /**\n * Creates a new Color4 set with the subtracted values of the given one from the current Color4\n * @param otherColor defines the second operand\n * @returns a new Color4 object\n */\n subtract(e) {\n return new this.constructor(this.r - e.r, this.g - e.g, this.b - e.b, this.a - e.a);\n }\n /**\n * Subtracts the given ones from the current Color4 values and stores the results in \"result\"\n * @param otherColor defines the second operand\n * @param result defines the Color4 object where to store the result\n * @returns the result Color4 object\n */\n subtractToRef(e, t) {\n return t.r = this.r - e.r, t.g = this.g - e.g, t.b = this.b - e.b, t.a = this.a - e.a, t;\n }\n /**\n * Subtract in place the given color from the current Color4.\n * @param otherColor the color to subtract\n * @returns the updated Color4.\n */\n subtractInPlace(e) {\n return this.r -= e.r, this.g -= e.g, this.b -= e.b, this.a -= e.a, this;\n }\n /**\n * Returns a new Color4 set with the result of the subtraction of the given floats from the current Color4 coordinates.\n * @param r value to subtract\n * @param g value to subtract\n * @param b value to subtract\n * @param a value to subtract\n * @returns new color containing the result\n */\n subtractFromFloats(e, t, i, r) {\n return new this.constructor(this.r - e, this.g - t, this.b - i, this.a - r);\n }\n /**\n * Sets the given color \"result\" set with the result of the subtraction of the given floats from the current Color4 coordinates.\n * @param r value to subtract\n * @param g value to subtract\n * @param b value to subtract\n * @param a value to subtract\n * @param result the color to store the result in\n * @returns result input\n */\n subtractFromFloatsToRef(e, t, i, r, s) {\n return s.r = this.r - e, s.g = this.g - t, s.b = this.b - i, s.a = this.a - r, s;\n }\n /**\n * Creates a new Color4 with the current Color4 values multiplied by scale\n * @param scale defines the scaling factor to apply\n * @returns a new Color4 object\n */\n scale(e) {\n return new this.constructor(this.r * e, this.g * e, this.b * e, this.a * e);\n }\n /**\n * Multiplies the Color4 values by the float \"scale\"\n * @param scale defines the scaling factor to apply\n * @returns the current updated Color4\n */\n scaleInPlace(e) {\n return this.r *= e, this.g *= e, this.b *= e, this.a *= e, this;\n }\n /**\n * Multiplies the current Color4 values by scale and stores the result in \"result\"\n * @param scale defines the scaling factor to apply\n * @param result defines the Color4 object where to store the result\n * @returns the result Color4\n */\n scaleToRef(e, t) {\n return t.r = this.r * e, t.g = this.g * e, t.b = this.b * e, t.a = this.a * e, t;\n }\n /**\n * Scale the current Color4 values by a factor and add the result to a given Color4\n * @param scale defines the scale factor\n * @param result defines the Color4 object where to store the result\n * @returns the result Color4\n */\n scaleAndAddToRef(e, t) {\n return t.r += this.r * e, t.g += this.g * e, t.b += this.b * e, t.a += this.a * e, t;\n }\n /**\n * Clamps the rgb values by the min and max values and stores the result into \"result\"\n * @param min defines minimum clamping value (default is 0)\n * @param max defines maximum clamping value (default is 1)\n * @param result defines color to store the result into.\n * @returns the result Color4\n */\n clampToRef(e = 0, t = 1, i) {\n return i.r = ii(this.r, e, t), i.g = ii(this.g, e, t), i.b = ii(this.b, e, t), i.a = ii(this.a, e, t), i;\n }\n /**\n * Multiply an Color4 value by another and return a new Color4 object\n * @param color defines the Color4 value to multiply by\n * @returns a new Color4 object\n */\n multiply(e) {\n return new this.constructor(this.r * e.r, this.g * e.g, this.b * e.b, this.a * e.a);\n }\n /**\n * Multiply a Color4 value by another and push the result in a reference value\n * @param color defines the Color4 value to multiply by\n * @param result defines the Color4 to fill the result in\n * @returns the result Color4\n */\n multiplyToRef(e, t) {\n return t.r = this.r * e.r, t.g = this.g * e.g, t.b = this.b * e.b, t.a = this.a * e.a, t;\n }\n /**\n * Multiplies in place the current Color4 by the given one.\n * @param otherColor color to multiple with\n * @returns the updated Color4.\n */\n multiplyInPlace(e) {\n return this.r *= e.r, this.g *= e.g, this.b *= e.b, this.a *= e.a, this;\n }\n /**\n * Returns a new Color4 set with the multiplication result of the given floats and the current Color4 coordinates.\n * @param r value multiply with\n * @param g value multiply with\n * @param b value multiply with\n * @param a value multiply with\n * @returns resulting new color\n */\n multiplyByFloats(e, t, i, r) {\n return new this.constructor(this.r * e, this.g * t, this.b * i, this.a * r);\n }\n /**\n * @internal\n * Do not use\n */\n divide(e) {\n throw new ReferenceError(\"Can not divide a color\");\n }\n /**\n * @internal\n * Do not use\n */\n divideToRef(e, t) {\n throw new ReferenceError(\"Can not divide a color\");\n }\n /**\n * @internal\n * Do not use\n */\n divideInPlace(e) {\n throw new ReferenceError(\"Can not divide a color\");\n }\n /**\n * Updates the Color4 coordinates with the minimum values between its own and the given color ones\n * @param other defines the second operand\n * @returns the current updated Color4\n */\n minimizeInPlace(e) {\n return this.r = Math.min(this.r, e.r), this.g = Math.min(this.g, e.g), this.b = Math.min(this.b, e.b), this.a = Math.min(this.a, e.a), this;\n }\n /**\n * Updates the Color4 coordinates with the maximum values between its own and the given color ones\n * @param other defines the second operand\n * @returns the current updated Color4\n */\n maximizeInPlace(e) {\n return this.r = Math.max(this.r, e.r), this.g = Math.max(this.g, e.g), this.b = Math.max(this.b, e.b), this.a = Math.max(this.a, e.a), this;\n }\n /**\n * Updates the current Color4 with the minimal coordinate values between its and the given coordinates\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @param a defines the a coordinate of the operand\n * @returns the current updated Color4\n */\n minimizeInPlaceFromFloats(e, t, i, r) {\n return this.r = Math.min(e, this.r), this.g = Math.min(t, this.g), this.b = Math.min(i, this.b), this.a = Math.min(r, this.a), this;\n }\n /**\n * Updates the current Color4 with the maximal coordinate values between its and the given coordinates.\n * @param r defines the r coordinate of the operand\n * @param g defines the g coordinate of the operand\n * @param b defines the b coordinate of the operand\n * @param a defines the a coordinate of the operand\n * @returns the current updated Color4\n */\n maximizeInPlaceFromFloats(e, t, i, r) {\n return this.r = Math.max(e, this.r), this.g = Math.max(t, this.g), this.b = Math.max(i, this.b), this.a = Math.max(r, this.a), this;\n }\n /**\n * @internal\n * Do not use\n */\n floorToRef(e) {\n throw new ReferenceError(\"Can not floor a color\");\n }\n /**\n * @internal\n * Do not use\n */\n floor() {\n throw new ReferenceError(\"Can not floor a color\");\n }\n /**\n * @internal\n * Do not use\n */\n fractToRef(e) {\n throw new ReferenceError(\"Can not fract a color\");\n }\n /**\n * @internal\n * Do not use\n */\n fract() {\n throw new ReferenceError(\"Can not fract a color\");\n }\n /**\n * @internal\n * Do not use\n */\n negate() {\n throw new ReferenceError(\"Can not negate a color\");\n }\n /**\n * @internal\n * Do not use\n */\n negateInPlace() {\n throw new ReferenceError(\"Can not negate a color\");\n }\n /**\n * @internal\n * Do not use\n */\n negateToRef(e) {\n throw new ReferenceError(\"Can not negate a color\");\n }\n /**\n * Boolean : True if the current Color4 coordinates are each beneath the distance \"epsilon\" from the given color ones.\n * @param otherColor color to compare against\n * @param epsilon (Default: very small number)\n * @returns true if they are equal\n */\n equalsWithEpsilon(e, t = xt) {\n return je.WithinEpsilon(this.r, e.r, t) && je.WithinEpsilon(this.g, e.g, t) && je.WithinEpsilon(this.b, e.b, t) && je.WithinEpsilon(this.a, e.a, t);\n }\n /**\n * Boolean : True if the given floats are strictly equal to the current Color4 coordinates.\n * @param x x value to compare against\n * @param y y value to compare against\n * @param z z value to compare against\n * @param w w value to compare against\n * @returns true if equal\n */\n equalsToFloats(e, t, i, r) {\n return this.r === e && this.g === t && this.b === i && this.a === r;\n }\n /**\n * Creates a string with the Color4 current values\n * @returns the string representation of the Color4 object\n */\n toString() {\n return \"{R: \" + this.r + \" G:\" + this.g + \" B:\" + this.b + \" A:\" + this.a + \"}\";\n }\n /**\n * Returns the string \"Color4\"\n * @returns \"Color4\"\n */\n getClassName() {\n return \"Color4\";\n }\n /**\n * Compute the Color4 hash code\n * @returns an unique number that can be used to hash Color4 objects\n */\n getHashCode() {\n let e = this.r * 255 | 0;\n return e = e * 397 ^ (this.g * 255 | 0), e = e * 397 ^ (this.b * 255 | 0), e = e * 397 ^ (this.a * 255 | 0), e;\n }\n /**\n * Creates a new Color4 copied from the current one\n * @returns a new Color4 object\n */\n clone() {\n return new this.constructor().copyFrom(this);\n }\n /**\n * Copies the given Color4 values into the current one\n * @param source defines the source Color4 object\n * @returns the current updated Color4 object\n */\n copyFrom(e) {\n return this.r = e.r, this.g = e.g, this.b = e.b, this.a = e.a, this;\n }\n /**\n * Copies the given float values into the current one\n * @param r defines the red component to read from\n * @param g defines the green component to read from\n * @param b defines the blue component to read from\n * @param a defines the alpha component to read from\n * @returns the current updated Color4 object\n */\n copyFromFloats(e, t, i, r) {\n return this.r = e, this.g = t, this.b = i, this.a = r, this;\n }\n /**\n * Copies the given float values into the current one\n * @param r defines the red component to read from\n * @param g defines the green component to read from\n * @param b defines the blue component to read from\n * @param a defines the alpha component to read from\n * @returns the current updated Color4 object\n */\n set(e, t, i, r) {\n return this.copyFromFloats(e, t, i, r);\n }\n /**\n * Copies the given float to the current Vector4 coordinates\n * @param v defines the r, g, b, and a coordinates of the operand\n * @returns the current updated Vector4\n */\n setAll(e) {\n return this.r = this.g = this.b = this.a = e, this;\n }\n /**\n * Compute the Color4 hexadecimal code as a string\n * @param returnAsColor3 defines if the string should only contains RGB values (off by default)\n * @returns a string containing the hexadecimal representation of the Color4 object\n */\n toHexString(e = !1) {\n const t = Math.round(this.r * 255), i = Math.round(this.g * 255), r = Math.round(this.b * 255);\n if (e)\n return \"#\" + qr(t) + qr(i) + qr(r);\n const s = Math.round(this.a * 255);\n return \"#\" + qr(t) + qr(i) + qr(r) + qr(s);\n }\n /**\n * Computes a new Color4 converted from the current one to linear space\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns a new Color4 object\n */\n toLinearSpace(e = !1) {\n const t = new et();\n return this.toLinearSpaceToRef(t, e), t;\n }\n /**\n * Converts the Color4 values to linear space and stores the result in \"convertedColor\"\n * @param convertedColor defines the Color4 object where to store the linear space version\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns the unmodified Color4\n */\n toLinearSpaceToRef(e, t = !1) {\n return t ? (e.r = ga(this.r), e.g = ga(this.g), e.b = ga(this.b)) : (e.r = pa(this.r), e.g = pa(this.g), e.b = pa(this.b)), e.a = this.a, this;\n }\n /**\n * Computes a new Color4 converted from the current one to gamma space\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns a new Color4 object\n */\n toGammaSpace(e = !1) {\n const t = new et();\n return this.toGammaSpaceToRef(t, e), t;\n }\n /**\n * Converts the Color4 values to gamma space and stores the result in \"convertedColor\"\n * @param convertedColor defines the Color4 object where to store the gamma space version\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\n * @returns the unmodified Color4\n */\n toGammaSpaceToRef(e, t = !1) {\n return t ? (e.r = _a(this.r), e.g = _a(this.g), e.b = _a(this.b)) : (e.r = ma(this.r), e.g = ma(this.g), e.b = ma(this.b)), e.a = this.a, this;\n }\n // Statics\n /**\n * Creates a new Color4 from the string containing valid hexadecimal values.\n *\n * A valid hex string is either in the format #RRGGBB or #RRGGBBAA.\n *\n * When a hex string without alpha is passed, the resulting Color4 has\n * its alpha value set to 1.0.\n *\n * An invalid string results in a Color with all its channels set to 0.0,\n * i.e. \"transparent black\".\n *\n * @param hex defines a string containing valid hexadecimal values\n * @returns a new Color4 object\n */\n static FromHexString(e) {\n if (e.substring(0, 1) !== \"#\" || e.length !== 9 && e.length !== 7)\n return new et(0, 0, 0, 0);\n const t = parseInt(e.substring(1, 3), 16), i = parseInt(e.substring(3, 5), 16), r = parseInt(e.substring(5, 7), 16), s = e.length === 9 ? parseInt(e.substring(7, 9), 16) : 255;\n return et.FromInts(t, i, r, s);\n }\n /**\n * Creates a new Color4 object set with the linearly interpolated values of \"amount\" between the left Color4 object and the right Color4 object\n * @param left defines the start value\n * @param right defines the end value\n * @param amount defines the gradient factor\n * @returns a new Color4 object\n */\n static Lerp(e, t, i) {\n const r = new et(0, 0, 0, 0);\n return et.LerpToRef(e, t, i, r), r;\n }\n /**\n * Set the given \"result\" with the linearly interpolated values of \"amount\" between the left Color4 object and the right Color4 object\n * @param left defines the start value\n * @param right defines the end value\n * @param amount defines the gradient factor\n * @param result defines the Color4 object where to store data\n */\n static LerpToRef(e, t, i, r) {\n r.r = e.r + (t.r - e.r) * i, r.g = e.g + (t.g - e.g) * i, r.b = e.b + (t.b - e.b) * i, r.a = e.a + (t.a - e.a) * i;\n }\n /**\n * Interpolate between two Color4 using Hermite interpolation\n * @param value1 defines first Color4\n * @param tangent1 defines the incoming tangent\n * @param value2 defines second Color4\n * @param tangent2 defines the outgoing tangent\n * @param amount defines the target Color4\n * @returns the new interpolated Color4\n */\n static Hermite(e, t, i, r, s) {\n const a = s * s, o = s * a, l = 2 * o - 3 * a + 1, c = -2 * o + 3 * a, h = o - 2 * a + s, u = o - a, f = e.r * l + i.r * c + t.r * h + r.r * u, d = e.g * l + i.g * c + t.g * h + r.g * u, p = e.b * l + i.b * c + t.b * h + r.b * u, g = e.a * l + i.a * c + t.a * h + r.a * u;\n return new et(f, d, p, g);\n }\n /**\n * Returns a new Color4 which is the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @returns 1st derivative\n */\n static Hermite1stDerivative(e, t, i, r, s) {\n const a = new et();\n return this.Hermite1stDerivativeToRef(e, t, i, r, s, a), a;\n }\n /**\n * Update a Color4 with the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\n * @param value1 defines the first control point\n * @param tangent1 defines the first tangent\n * @param value2 defines the second control point\n * @param tangent2 defines the second tangent\n * @param time define where the derivative must be done\n * @param result define where to store the derivative\n */\n static Hermite1stDerivativeToRef(e, t, i, r, s, a) {\n const o = s * s;\n a.r = (o - s) * 6 * e.r + (3 * o - 4 * s + 1) * t.r + (-o + s) * 6 * i.r + (3 * o - 2 * s) * r.r, a.g = (o - s) * 6 * e.g + (3 * o - 4 * s + 1) * t.g + (-o + s) * 6 * i.g + (3 * o - 2 * s) * r.g, a.b = (o - s) * 6 * e.b + (3 * o - 4 * s + 1) * t.b + (-o + s) * 6 * i.b + (3 * o - 2 * s) * r.b, a.a = (o - s) * 6 * e.a + (3 * o - 4 * s + 1) * t.a + (-o + s) * 6 * i.a + (3 * o - 2 * s) * r.a;\n }\n /**\n * Creates a new Color4 from a Color3 and an alpha value\n * @param color3 defines the source Color3 to read from\n * @param alpha defines the alpha component (1.0 by default)\n * @returns a new Color4 object\n */\n static FromColor3(e, t = 1) {\n return new et(e.r, e.g, e.b, t);\n }\n /**\n * Creates a new Color4 from the starting index element of the given array\n * @param array defines the source array to read from\n * @param offset defines the offset in the source array\n * @returns a new Color4 object\n */\n static FromArray(e, t = 0) {\n return new et(e[t], e[t + 1], e[t + 2], e[t + 3]);\n }\n /**\n * Creates a new Color4 from the starting index element of the given array\n * @param array defines the source array to read from\n * @param offset defines the offset in the source array\n * @param result defines the target Color4 object\n */\n static FromArrayToRef(e, t = 0, i) {\n i.r = e[t], i.g = e[t + 1], i.b = e[t + 2], i.a = e[t + 3];\n }\n /**\n * Creates a new Color3 from integer values (less than 256)\n * @param r defines the red component to read from (value between 0 and 255)\n * @param g defines the green component to read from (value between 0 and 255)\n * @param b defines the blue component to read from (value between 0 and 255)\n * @param a defines the alpha component to read from (value between 0 and 255)\n * @returns a new Color3 object\n */\n static FromInts(e, t, i, r) {\n return new et(e / 255, t / 255, i / 255, r / 255);\n }\n /**\n * Check the content of a given array and convert it to an array containing RGBA data\n * If the original array was already containing count * 4 values then it is returned directly\n * @param colors defines the array to check\n * @param count defines the number of RGBA data to expect\n * @returns an array containing count * 4 values (RGBA)\n */\n static CheckColors4(e, t) {\n if (e.length === t * 3) {\n const i = [];\n for (let r = 0; r < e.length; r += 3) {\n const s = r / 3 * 4;\n i[s] = e[r], i[s + 1] = e[r + 1], i[s + 2] = e[r + 2], i[s + 3] = 1;\n }\n return i;\n }\n return e;\n }\n}\nObject.defineProperties(et.prototype, {\n dimension: { value: [4] },\n rank: { value: 1 }\n});\nclass jr {\n}\njr.Color3 = vi.BuildArray(3, Ne.Black);\njr.Color4 = vi.BuildArray(3, () => new et(0, 0, 0, 0));\nRe(\"BABYLON.Color3\", Ne);\nRe(\"BABYLON.Color4\", et);\nconst Jp = function(n, e, t, i = {}) {\n const r = n();\n rt && rt.HasTags(e) && rt.AddTagsTo(r, rt.GetTags(e, !0));\n const s = gu(r), a = {};\n for (const o in s) {\n const l = s[o], c = e[o], h = l.type;\n if (c != null && (o !== \"uniqueId\" || Le.AllowLoadingUniqueId))\n switch (h) {\n case 0:\n case 6:\n case 11:\n r[o] = c;\n break;\n case 1:\n i.cloneTexturesOnlyOnce && a[c.uniqueId] ? r[o] = a[c.uniqueId] : (r[o] = t || c.isRenderTarget ? c : c.clone(), a[c.uniqueId] = r[o]);\n break;\n case 2:\n case 3:\n case 4:\n case 5:\n case 7:\n case 10:\n case 12:\n r[o] = t ? c : c.clone();\n break;\n }\n }\n return r;\n};\nclass Le {\n /**\n * Appends the serialized animations from the source animations\n * @param source Source containing the animations\n * @param destination Target to store the animations\n */\n static AppendSerializedAnimations(e, t) {\n if (e.animations) {\n t.animations = [];\n for (let i = 0; i < e.animations.length; i++) {\n const r = e.animations[i];\n t.animations.push(r.serialize());\n }\n }\n }\n /**\n * Static function used to serialized a specific entity\n * @param entity defines the entity to serialize\n * @param serializationObject defines the optional target object where serialization data will be stored\n * @returns a JSON compatible object representing the serialization of the entity\n */\n static Serialize(e, t) {\n t || (t = {}), rt && (t.tags = rt.GetTags(e));\n const i = gu(e);\n for (const r in i) {\n const s = i[r], a = s.sourceName || r, o = s.type, l = e[r];\n if (l != null && (r !== \"uniqueId\" || Le.AllowLoadingUniqueId))\n switch (o) {\n case 0:\n t[a] = l;\n break;\n case 1:\n t[a] = l.serialize();\n break;\n case 2:\n t[a] = l.asArray();\n break;\n case 3:\n t[a] = l.serialize();\n break;\n case 4:\n t[a] = l.asArray();\n break;\n case 5:\n t[a] = l.asArray();\n break;\n case 6:\n t[a] = l.id;\n break;\n case 7:\n t[a] = l.serialize();\n break;\n case 8:\n t[a] = l.asArray();\n break;\n case 9:\n t[a] = l.serialize();\n break;\n case 10:\n t[a] = l.asArray();\n break;\n case 11:\n t[a] = l.id;\n break;\n case 12:\n t[a] = l.asArray();\n break;\n }\n }\n return t;\n }\n /**\n * Given a source json and a destination object in a scene, this function will parse the source and will try to apply its content to the destination object\n * @param source the source json data\n * @param destination the destination object\n * @param scene the scene where the object is\n * @param rootUrl root url to use to load assets\n */\n static ParseProperties(e, t, i, r) {\n r || (r = \"\");\n const s = gu(t);\n for (const a in s) {\n const o = s[a], l = e[o.sourceName || a], c = o.type;\n if (l != null && (a !== \"uniqueId\" || Le.AllowLoadingUniqueId)) {\n const h = t;\n switch (c) {\n case 0:\n h[a] = l;\n break;\n case 1:\n i && (h[a] = Le._TextureParser(l, i, r));\n break;\n case 2:\n h[a] = Ne.FromArray(l);\n break;\n case 3:\n h[a] = Le._FresnelParametersParser(l);\n break;\n case 4:\n h[a] = me.FromArray(l);\n break;\n case 5:\n h[a] = _.FromArray(l);\n break;\n case 6:\n i && (h[a] = i.getLastMeshById(l));\n break;\n case 7:\n h[a] = Le._ColorCurvesParser(l);\n break;\n case 8:\n h[a] = et.FromArray(l);\n break;\n case 9:\n h[a] = Le._ImageProcessingConfigurationParser(l);\n break;\n case 10:\n h[a] = Ce.FromArray(l);\n break;\n case 11:\n i && (h[a] = i.getCameraById(l));\n break;\n case 12:\n h[a] = L.FromArray(l);\n break;\n }\n }\n }\n }\n /**\n * Creates a new entity from a serialization data object\n * @param creationFunction defines a function used to instanciated the new entity\n * @param source defines the source serialization data\n * @param scene defines the hosting scene\n * @param rootUrl defines the root url for resources\n * @returns a new entity\n */\n static Parse(e, t, i, r = null) {\n const s = e();\n return rt && rt.AddTagsTo(s, t.tags), Le.ParseProperties(t, s, i, r), s;\n }\n /**\n * Clones an object\n * @param creationFunction defines the function used to instanciate the new object\n * @param source defines the source object\n * @param options defines the options to use\n * @returns the cloned object\n */\n static Clone(e, t, i = {}) {\n return Jp(e, t, !1, i);\n }\n /**\n * Instanciates a new object based on a source one (some data will be shared between both object)\n * @param creationFunction defines the function used to instanciate the new object\n * @param source defines the source object\n * @returns the new object\n */\n static Instanciate(e, t) {\n return Jp(e, t, !0);\n }\n}\nLe.AllowLoadingUniqueId = !1;\nLe._ImageProcessingConfigurationParser = (n) => {\n throw We(\"ImageProcessingConfiguration\");\n};\nLe._FresnelParametersParser = (n) => {\n throw We(\"FresnelParameters\");\n};\nLe._ColorCurvesParser = (n) => {\n throw We(\"ColorCurves\");\n};\nLe._TextureParser = (n, e, t) => {\n throw We(\"Texture\");\n};\nfunction q_(n) {\n n.push(\"vCameraColorCurveNeutral\", \"vCameraColorCurvePositive\", \"vCameraColorCurveNegative\");\n}\nclass Xt {\n constructor() {\n this._dirty = !0, this._tempColor = new et(0, 0, 0, 0), this._globalCurve = new et(0, 0, 0, 0), this._highlightsCurve = new et(0, 0, 0, 0), this._midtonesCurve = new et(0, 0, 0, 0), this._shadowsCurve = new et(0, 0, 0, 0), this._positiveCurve = new et(0, 0, 0, 0), this._negativeCurve = new et(0, 0, 0, 0), this._globalHue = 30, this._globalDensity = 0, this._globalSaturation = 0, this._globalExposure = 0, this._highlightsHue = 30, this._highlightsDensity = 0, this._highlightsSaturation = 0, this._highlightsExposure = 0, this._midtonesHue = 30, this._midtonesDensity = 0, this._midtonesSaturation = 0, this._midtonesExposure = 0, this._shadowsHue = 30, this._shadowsDensity = 0, this._shadowsSaturation = 0, this._shadowsExposure = 0;\n }\n /**\n * Gets the global Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n get globalHue() {\n return this._globalHue;\n }\n /**\n * Sets the global Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n set globalHue(e) {\n this._globalHue = e, this._dirty = !0;\n }\n /**\n * Gets the global Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n get globalDensity() {\n return this._globalDensity;\n }\n /**\n * Sets the global Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n set globalDensity(e) {\n this._globalDensity = e, this._dirty = !0;\n }\n /**\n * Gets the global Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n get globalSaturation() {\n return this._globalSaturation;\n }\n /**\n * Sets the global Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n set globalSaturation(e) {\n this._globalSaturation = e, this._dirty = !0;\n }\n /**\n * Gets the global Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n get globalExposure() {\n return this._globalExposure;\n }\n /**\n * Sets the global Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n set globalExposure(e) {\n this._globalExposure = e, this._dirty = !0;\n }\n /**\n * Gets the highlights Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n get highlightsHue() {\n return this._highlightsHue;\n }\n /**\n * Sets the highlights Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n set highlightsHue(e) {\n this._highlightsHue = e, this._dirty = !0;\n }\n /**\n * Gets the highlights Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n get highlightsDensity() {\n return this._highlightsDensity;\n }\n /**\n * Sets the highlights Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n set highlightsDensity(e) {\n this._highlightsDensity = e, this._dirty = !0;\n }\n /**\n * Gets the highlights Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n get highlightsSaturation() {\n return this._highlightsSaturation;\n }\n /**\n * Sets the highlights Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n set highlightsSaturation(e) {\n this._highlightsSaturation = e, this._dirty = !0;\n }\n /**\n * Gets the highlights Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n get highlightsExposure() {\n return this._highlightsExposure;\n }\n /**\n * Sets the highlights Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n set highlightsExposure(e) {\n this._highlightsExposure = e, this._dirty = !0;\n }\n /**\n * Gets the midtones Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n get midtonesHue() {\n return this._midtonesHue;\n }\n /**\n * Sets the midtones Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n set midtonesHue(e) {\n this._midtonesHue = e, this._dirty = !0;\n }\n /**\n * Gets the midtones Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n get midtonesDensity() {\n return this._midtonesDensity;\n }\n /**\n * Sets the midtones Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n set midtonesDensity(e) {\n this._midtonesDensity = e, this._dirty = !0;\n }\n /**\n * Gets the midtones Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n get midtonesSaturation() {\n return this._midtonesSaturation;\n }\n /**\n * Sets the midtones Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n set midtonesSaturation(e) {\n this._midtonesSaturation = e, this._dirty = !0;\n }\n /**\n * Gets the midtones Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n get midtonesExposure() {\n return this._midtonesExposure;\n }\n /**\n * Sets the midtones Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n set midtonesExposure(e) {\n this._midtonesExposure = e, this._dirty = !0;\n }\n /**\n * Gets the shadows Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n get shadowsHue() {\n return this._shadowsHue;\n }\n /**\n * Sets the shadows Hue value.\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\n */\n set shadowsHue(e) {\n this._shadowsHue = e, this._dirty = !0;\n }\n /**\n * Gets the shadows Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n get shadowsDensity() {\n return this._shadowsDensity;\n }\n /**\n * Sets the shadows Density value.\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\n * Values less than zero provide a filter of opposite hue.\n */\n set shadowsDensity(e) {\n this._shadowsDensity = e, this._dirty = !0;\n }\n /**\n * Gets the shadows Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n get shadowsSaturation() {\n return this._shadowsSaturation;\n }\n /**\n * Sets the shadows Saturation value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\n */\n set shadowsSaturation(e) {\n this._shadowsSaturation = e, this._dirty = !0;\n }\n /**\n * Gets the shadows Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n get shadowsExposure() {\n return this._shadowsExposure;\n }\n /**\n * Sets the shadows Exposure value.\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\n */\n set shadowsExposure(e) {\n this._shadowsExposure = e, this._dirty = !0;\n }\n /**\n * Returns the class name\n * @returns The class name\n */\n getClassName() {\n return \"ColorCurves\";\n }\n /**\n * Binds the color curves to the shader.\n * @param colorCurves The color curve to bind\n * @param effect The effect to bind to\n * @param positiveUniform The positive uniform shader parameter\n * @param neutralUniform The neutral uniform shader parameter\n * @param negativeUniform The negative uniform shader parameter\n */\n static Bind(e, t, i = \"vCameraColorCurvePositive\", r = \"vCameraColorCurveNeutral\", s = \"vCameraColorCurveNegative\") {\n e._dirty && (e._dirty = !1, e._getColorGradingDataToRef(e._globalHue, e._globalDensity, e._globalSaturation, e._globalExposure, e._globalCurve), e._getColorGradingDataToRef(e._highlightsHue, e._highlightsDensity, e._highlightsSaturation, e._highlightsExposure, e._tempColor), e._tempColor.multiplyToRef(e._globalCurve, e._highlightsCurve), e._getColorGradingDataToRef(e._midtonesHue, e._midtonesDensity, e._midtonesSaturation, e._midtonesExposure, e._tempColor), e._tempColor.multiplyToRef(e._globalCurve, e._midtonesCurve), e._getColorGradingDataToRef(e._shadowsHue, e._shadowsDensity, e._shadowsSaturation, e._shadowsExposure, e._tempColor), e._tempColor.multiplyToRef(e._globalCurve, e._shadowsCurve), e._highlightsCurve.subtractToRef(e._midtonesCurve, e._positiveCurve), e._midtonesCurve.subtractToRef(e._shadowsCurve, e._negativeCurve)), t && (t.setFloat4(i, e._positiveCurve.r, e._positiveCurve.g, e._positiveCurve.b, e._positiveCurve.a), t.setFloat4(r, e._midtonesCurve.r, e._midtonesCurve.g, e._midtonesCurve.b, e._midtonesCurve.a), t.setFloat4(s, e._negativeCurve.r, e._negativeCurve.g, e._negativeCurve.b, e._negativeCurve.a));\n }\n /**\n * Returns color grading data based on a hue, density, saturation and exposure value.\n * @param hue\n * @param density\n * @param saturation The saturation.\n * @param exposure The exposure.\n * @param result The result data container.\n */\n _getColorGradingDataToRef(e, t, i, r, s) {\n e != null && (e = Xt._Clamp(e, 0, 360), t = Xt._Clamp(t, -100, 100), i = Xt._Clamp(i, -100, 100), r = Xt._Clamp(r, -100, 100), t = Xt._ApplyColorGradingSliderNonlinear(t), t *= 0.5, r = Xt._ApplyColorGradingSliderNonlinear(r), t < 0 && (t *= -1, e = (e + 180) % 360), Xt._FromHSBToRef(e, t, 50 + 0.25 * r, s), s.scaleToRef(2, s), s.a = 1 + 0.01 * i);\n }\n /**\n * Takes an input slider value and returns an adjusted value that provides extra control near the centre.\n * @param value The input slider value in range [-100,100].\n * @returns Adjusted value.\n */\n static _ApplyColorGradingSliderNonlinear(e) {\n e /= 100;\n let t = Math.abs(e);\n return t = Math.pow(t, 2), e < 0 && (t *= -1), t *= 100, t;\n }\n /**\n * Returns an RGBA Color4 based on Hue, Saturation and Brightness (also referred to as value, HSV).\n * @param hue The hue (H) input.\n * @param saturation The saturation (S) input.\n * @param brightness The brightness (B) input.\n * @param result\n * @result An RGBA color represented as Vector4.\n */\n static _FromHSBToRef(e, t, i, r) {\n let s = Xt._Clamp(e, 0, 360);\n const a = Xt._Clamp(t / 100, 0, 1), o = Xt._Clamp(i / 100, 0, 1);\n if (a === 0)\n r.r = o, r.g = o, r.b = o;\n else {\n s /= 60;\n const l = Math.floor(s), c = s - l, h = o * (1 - a), u = o * (1 - a * c), f = o * (1 - a * (1 - c));\n switch (l) {\n case 0:\n r.r = o, r.g = f, r.b = h;\n break;\n case 1:\n r.r = u, r.g = o, r.b = h;\n break;\n case 2:\n r.r = h, r.g = o, r.b = f;\n break;\n case 3:\n r.r = h, r.g = u, r.b = o;\n break;\n case 4:\n r.r = f, r.g = h, r.b = o;\n break;\n default:\n r.r = o, r.g = h, r.b = u;\n break;\n }\n }\n r.a = 1;\n }\n /**\n * Returns a value clamped between min and max\n * @param value The value to clamp\n * @param min The minimum of value\n * @param max The maximum of value\n * @returns The clamped value.\n */\n static _Clamp(e, t, i) {\n return Math.min(Math.max(e, t), i);\n }\n /**\n * Clones the current color curve instance.\n * @returns The cloned curves\n */\n clone() {\n return Le.Clone(() => new Xt(), this);\n }\n /**\n * Serializes the current color curve instance to a json representation.\n * @returns a JSON representation\n */\n serialize() {\n return Le.Serialize(this);\n }\n /**\n * Parses the color curve from a json representation.\n * @param source the JSON source to parse\n * @returns The parsed curves\n */\n static Parse(e) {\n return Le.Parse(() => new Xt(), e, null, null);\n }\n}\nXt.PrepareUniforms = q_;\nP([\n w()\n], Xt.prototype, \"_globalHue\", void 0);\nP([\n w()\n], Xt.prototype, \"_globalDensity\", void 0);\nP([\n w()\n], Xt.prototype, \"_globalSaturation\", void 0);\nP([\n w()\n], Xt.prototype, \"_globalExposure\", void 0);\nP([\n w()\n], Xt.prototype, \"_highlightsHue\", void 0);\nP([\n w()\n], Xt.prototype, \"_highlightsDensity\", void 0);\nP([\n w()\n], Xt.prototype, \"_highlightsSaturation\", void 0);\nP([\n w()\n], Xt.prototype, \"_highlightsExposure\", void 0);\nP([\n w()\n], Xt.prototype, \"_midtonesHue\", void 0);\nP([\n w()\n], Xt.prototype, \"_midtonesDensity\", void 0);\nP([\n w()\n], Xt.prototype, \"_midtonesSaturation\", void 0);\nP([\n w()\n], Xt.prototype, \"_midtonesExposure\", void 0);\nLe._ColorCurvesParser = Xt.Parse;\nfunction My(n, e) {\n e.EXPOSURE && n.push(\"exposureLinear\"), e.CONTRAST && n.push(\"contrast\"), e.COLORGRADING && n.push(\"colorTransformSettings\"), (e.VIGNETTE || e.DITHER) && n.push(\"vInverseScreenSize\"), e.VIGNETTE && (n.push(\"vignetteSettings1\"), n.push(\"vignetteSettings2\")), e.COLORCURVES && q_(n), e.DITHER && n.push(\"ditherIntensity\");\n}\nfunction Py(n, e) {\n e.COLORGRADING && n.push(\"txColorTransform\");\n}\nclass at {\n constructor() {\n this.colorCurves = new Xt(), this._colorCurvesEnabled = !1, this._colorGradingEnabled = !1, this._colorGradingWithGreenDepth = !0, this._colorGradingBGR = !0, this._exposure = 1, this._toneMappingEnabled = !1, this._toneMappingType = at.TONEMAPPING_STANDARD, this._contrast = 1, this.vignetteStretch = 0, this.vignetteCenterX = 0, this.vignetteCenterY = 0, this.vignetteWeight = 1.5, this.vignetteColor = new et(0, 0, 0, 0), this.vignetteCameraFov = 0.5, this._vignetteBlendMode = at.VIGNETTEMODE_MULTIPLY, this._vignetteEnabled = !1, this._ditheringEnabled = !1, this._ditheringIntensity = 1 / 255, this._skipFinalColorClamp = !1, this._applyByPostProcess = !1, this._isEnabled = !0, this.onUpdateParameters = new he();\n }\n /**\n * Gets whether the color curves effect is enabled.\n */\n get colorCurvesEnabled() {\n return this._colorCurvesEnabled;\n }\n /**\n * Sets whether the color curves effect is enabled.\n */\n set colorCurvesEnabled(e) {\n this._colorCurvesEnabled !== e && (this._colorCurvesEnabled = e, this._updateParameters());\n }\n /**\n * Color grading LUT texture used in the effect if colorGradingEnabled is set to true\n */\n get colorGradingTexture() {\n return this._colorGradingTexture;\n }\n /**\n * Color grading LUT texture used in the effect if colorGradingEnabled is set to true\n */\n set colorGradingTexture(e) {\n this._colorGradingTexture !== e && (this._colorGradingTexture = e, this._updateParameters());\n }\n /**\n * Gets whether the color grading effect is enabled.\n */\n get colorGradingEnabled() {\n return this._colorGradingEnabled;\n }\n /**\n * Sets whether the color grading effect is enabled.\n */\n set colorGradingEnabled(e) {\n this._colorGradingEnabled !== e && (this._colorGradingEnabled = e, this._updateParameters());\n }\n /**\n * Gets whether the color grading effect is using a green depth for the 3d Texture.\n */\n get colorGradingWithGreenDepth() {\n return this._colorGradingWithGreenDepth;\n }\n /**\n * Sets whether the color grading effect is using a green depth for the 3d Texture.\n */\n set colorGradingWithGreenDepth(e) {\n this._colorGradingWithGreenDepth !== e && (this._colorGradingWithGreenDepth = e, this._updateParameters());\n }\n /**\n * Gets whether the color grading texture contains BGR values.\n */\n get colorGradingBGR() {\n return this._colorGradingBGR;\n }\n /**\n * Sets whether the color grading texture contains BGR values.\n */\n set colorGradingBGR(e) {\n this._colorGradingBGR !== e && (this._colorGradingBGR = e, this._updateParameters());\n }\n /**\n * Gets the Exposure used in the effect.\n */\n get exposure() {\n return this._exposure;\n }\n /**\n * Sets the Exposure used in the effect.\n */\n set exposure(e) {\n this._exposure !== e && (this._exposure = e, this._updateParameters());\n }\n /**\n * Gets whether the tone mapping effect is enabled.\n */\n get toneMappingEnabled() {\n return this._toneMappingEnabled;\n }\n /**\n * Sets whether the tone mapping effect is enabled.\n */\n set toneMappingEnabled(e) {\n this._toneMappingEnabled !== e && (this._toneMappingEnabled = e, this._updateParameters());\n }\n /**\n * Gets the type of tone mapping effect.\n */\n get toneMappingType() {\n return this._toneMappingType;\n }\n /**\n * Sets the type of tone mapping effect used in BabylonJS.\n */\n set toneMappingType(e) {\n this._toneMappingType !== e && (this._toneMappingType = e, this._updateParameters());\n }\n /**\n * Gets the contrast used in the effect.\n */\n get contrast() {\n return this._contrast;\n }\n /**\n * Sets the contrast used in the effect.\n */\n set contrast(e) {\n this._contrast !== e && (this._contrast = e, this._updateParameters());\n }\n /**\n * Back Compat: Vignette center Y Offset.\n * @deprecated use vignetteCenterY instead\n */\n get vignetteCentreY() {\n return this.vignetteCenterY;\n }\n set vignetteCentreY(e) {\n this.vignetteCenterY = e;\n }\n /**\n * Back Compat: Vignette center X Offset.\n * @deprecated use vignetteCenterX instead\n */\n get vignetteCentreX() {\n return this.vignetteCenterX;\n }\n set vignetteCentreX(e) {\n this.vignetteCenterX = e;\n }\n /**\n * Gets the vignette blend mode allowing different kind of effect.\n */\n get vignetteBlendMode() {\n return this._vignetteBlendMode;\n }\n /**\n * Sets the vignette blend mode allowing different kind of effect.\n */\n set vignetteBlendMode(e) {\n this._vignetteBlendMode !== e && (this._vignetteBlendMode = e, this._updateParameters());\n }\n /**\n * Gets whether the vignette effect is enabled.\n */\n get vignetteEnabled() {\n return this._vignetteEnabled;\n }\n /**\n * Sets whether the vignette effect is enabled.\n */\n set vignetteEnabled(e) {\n this._vignetteEnabled !== e && (this._vignetteEnabled = e, this._updateParameters());\n }\n /**\n * Gets whether the dithering effect is enabled.\n * The dithering effect can be used to reduce banding.\n */\n get ditheringEnabled() {\n return this._ditheringEnabled;\n }\n /**\n * Sets whether the dithering effect is enabled.\n * The dithering effect can be used to reduce banding.\n */\n set ditheringEnabled(e) {\n this._ditheringEnabled !== e && (this._ditheringEnabled = e, this._updateParameters());\n }\n /**\n * Gets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0.\n */\n get ditheringIntensity() {\n return this._ditheringIntensity;\n }\n /**\n * Sets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0.\n */\n set ditheringIntensity(e) {\n this._ditheringIntensity !== e && (this._ditheringIntensity = e, this._updateParameters());\n }\n /**\n * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader\n * Applies to PBR materials.\n */\n get skipFinalColorClamp() {\n return this._skipFinalColorClamp;\n }\n /**\n * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader\n * Applies to PBR materials.\n */\n set skipFinalColorClamp(e) {\n this._skipFinalColorClamp !== e && (this._skipFinalColorClamp = e, this._updateParameters());\n }\n /**\n * Gets whether the image processing is applied through a post process or not.\n */\n get applyByPostProcess() {\n return this._applyByPostProcess;\n }\n /**\n * Sets whether the image processing is applied through a post process or not.\n */\n set applyByPostProcess(e) {\n this._applyByPostProcess !== e && (this._applyByPostProcess = e, this._updateParameters());\n }\n /**\n * Gets whether the image processing is enabled or not.\n */\n get isEnabled() {\n return this._isEnabled;\n }\n /**\n * Sets whether the image processing is enabled or not.\n */\n set isEnabled(e) {\n this._isEnabled !== e && (this._isEnabled = e, this._updateParameters());\n }\n /**\n * Method called each time the image processing information changes requires to recompile the effect.\n */\n _updateParameters() {\n this.onUpdateParameters.notifyObservers(this);\n }\n /**\n * Gets the current class name.\n * @returns \"ImageProcessingConfiguration\"\n */\n getClassName() {\n return \"ImageProcessingConfiguration\";\n }\n /**\n * Prepare the list of defines associated to the shader.\n * @param defines the list of defines to complete\n * @param forPostProcess Define if we are currently in post process mode or not\n */\n prepareDefines(e, t = !1) {\n if (t !== this.applyByPostProcess || !this._isEnabled) {\n e.VIGNETTE = !1, e.TONEMAPPING = !1, e.TONEMAPPING_ACES = !1, e.CONTRAST = !1, e.EXPOSURE = !1, e.COLORCURVES = !1, e.COLORGRADING = !1, e.COLORGRADING3D = !1, e.DITHER = !1, e.IMAGEPROCESSING = !1, e.SKIPFINALCOLORCLAMP = this.skipFinalColorClamp, e.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess && this._isEnabled;\n return;\n }\n switch (e.VIGNETTE = this.vignetteEnabled, e.VIGNETTEBLENDMODEMULTIPLY = this.vignetteBlendMode === at._VIGNETTEMODE_MULTIPLY, e.VIGNETTEBLENDMODEOPAQUE = !e.VIGNETTEBLENDMODEMULTIPLY, e.TONEMAPPING = this.toneMappingEnabled, this._toneMappingType) {\n case at.TONEMAPPING_ACES:\n e.TONEMAPPING_ACES = !0;\n break;\n default:\n e.TONEMAPPING_ACES = !1;\n break;\n }\n e.CONTRAST = this.contrast !== 1, e.EXPOSURE = this.exposure !== 1, e.COLORCURVES = this.colorCurvesEnabled && !!this.colorCurves, e.COLORGRADING = this.colorGradingEnabled && !!this.colorGradingTexture, e.COLORGRADING ? e.COLORGRADING3D = this.colorGradingTexture.is3D : e.COLORGRADING3D = !1, e.SAMPLER3DGREENDEPTH = this.colorGradingWithGreenDepth, e.SAMPLER3DBGRMAP = this.colorGradingBGR, e.DITHER = this._ditheringEnabled, e.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess, e.SKIPFINALCOLORCLAMP = this.skipFinalColorClamp, e.IMAGEPROCESSING = e.VIGNETTE || e.TONEMAPPING || e.CONTRAST || e.EXPOSURE || e.COLORCURVES || e.COLORGRADING || e.DITHER;\n }\n /**\n * Returns true if all the image processing information are ready.\n * @returns True if ready, otherwise, false\n */\n isReady() {\n return !this.colorGradingEnabled || !this.colorGradingTexture || this.colorGradingTexture.isReady();\n }\n /**\n * Binds the image processing to the shader.\n * @param effect The effect to bind to\n * @param overrideAspectRatio Override the aspect ratio of the effect\n */\n bind(e, t) {\n if (this._colorCurvesEnabled && this.colorCurves && Xt.Bind(this.colorCurves, e), this._vignetteEnabled || this._ditheringEnabled) {\n const i = 1 / e.getEngine().getRenderWidth(), r = 1 / e.getEngine().getRenderHeight();\n if (e.setFloat2(\"vInverseScreenSize\", i, r), this._ditheringEnabled && e.setFloat(\"ditherIntensity\", 0.5 * this._ditheringIntensity), this._vignetteEnabled) {\n const s = t ?? r / i;\n let a = Math.tan(this.vignetteCameraFov * 0.5), o = a * s;\n const l = Math.sqrt(o * a);\n o = pu(o, l, this.vignetteStretch), a = pu(a, l, this.vignetteStretch), e.setFloat4(\"vignetteSettings1\", o, a, -o * this.vignetteCenterX, -a * this.vignetteCenterY);\n const c = -2 * this.vignetteWeight;\n e.setFloat4(\"vignetteSettings2\", this.vignetteColor.r, this.vignetteColor.g, this.vignetteColor.b, c);\n }\n }\n if (e.setFloat(\"exposureLinear\", this.exposure), e.setFloat(\"contrast\", this.contrast), this.colorGradingTexture) {\n e.setTexture(\"txColorTransform\", this.colorGradingTexture);\n const i = this.colorGradingTexture.getSize().height;\n e.setFloat4(\n \"colorTransformSettings\",\n (i - 1) / i,\n // textureScale\n 0.5 / i,\n // textureOffset\n i,\n // textureSize\n this.colorGradingTexture.level\n // weight\n );\n }\n }\n /**\n * Clones the current image processing instance.\n * @returns The cloned image processing\n */\n clone() {\n return Le.Clone(() => new at(), this);\n }\n /**\n * Serializes the current image processing instance to a json representation.\n * @returns a JSON representation\n */\n serialize() {\n return Le.Serialize(this);\n }\n /**\n * Parses the image processing from a json representation.\n * @param source the JSON source to parse\n * @returns The parsed image processing\n */\n static Parse(e) {\n const t = Le.Parse(() => new at(), e, null, null);\n return e.vignetteCentreX !== void 0 && (t.vignetteCenterX = e.vignetteCentreX), e.vignetteCentreY !== void 0 && (t.vignetteCenterY = e.vignetteCentreY), t;\n }\n /**\n * Used to apply the vignette as a mix with the pixel color.\n */\n static get VIGNETTEMODE_MULTIPLY() {\n return this._VIGNETTEMODE_MULTIPLY;\n }\n /**\n * Used to apply the vignette as a replacement of the pixel color.\n */\n static get VIGNETTEMODE_OPAQUE() {\n return this._VIGNETTEMODE_OPAQUE;\n }\n}\nat.TONEMAPPING_STANDARD = 0;\nat.TONEMAPPING_ACES = 1;\nat.PrepareUniforms = My;\nat.PrepareSamplers = Py;\nat._VIGNETTEMODE_MULTIPLY = 0;\nat._VIGNETTEMODE_OPAQUE = 1;\nP([\n Iy()\n], at.prototype, \"colorCurves\", void 0);\nP([\n w()\n], at.prototype, \"_colorCurvesEnabled\", void 0);\nP([\n Tt(\"colorGradingTexture\")\n], at.prototype, \"_colorGradingTexture\", void 0);\nP([\n w()\n], at.prototype, \"_colorGradingEnabled\", void 0);\nP([\n w()\n], at.prototype, \"_colorGradingWithGreenDepth\", void 0);\nP([\n w()\n], at.prototype, \"_colorGradingBGR\", void 0);\nP([\n w()\n], at.prototype, \"_exposure\", void 0);\nP([\n w()\n], at.prototype, \"_toneMappingEnabled\", void 0);\nP([\n w()\n], at.prototype, \"_toneMappingType\", void 0);\nP([\n w()\n], at.prototype, \"_contrast\", void 0);\nP([\n w()\n], at.prototype, \"vignetteStretch\", void 0);\nP([\n w()\n], at.prototype, \"vignetteCenterX\", void 0);\nP([\n w()\n], at.prototype, \"vignetteCenterY\", void 0);\nP([\n w()\n], at.prototype, \"vignetteWeight\", void 0);\nP([\n H_()\n], at.prototype, \"vignetteColor\", void 0);\nP([\n w()\n], at.prototype, \"vignetteCameraFov\", void 0);\nP([\n w()\n], at.prototype, \"_vignetteBlendMode\", void 0);\nP([\n w()\n], at.prototype, \"_vignetteEnabled\", void 0);\nP([\n w()\n], at.prototype, \"_ditheringEnabled\", void 0);\nP([\n w()\n], at.prototype, \"_ditheringIntensity\", void 0);\nP([\n w()\n], at.prototype, \"_skipFinalColorClamp\", void 0);\nP([\n w()\n], at.prototype, \"_applyByPostProcess\", void 0);\nP([\n w()\n], at.prototype, \"_isEnabled\", void 0);\nLe._ImageProcessingConfigurationParser = at.Parse;\nDe.prototype.createUniformBuffer = function(n, e) {\n const t = this._gl.createBuffer();\n if (!t)\n throw new Error(\"Unable to create uniform buffer\");\n const i = new po(t);\n return this.bindUniformBuffer(i), n instanceof Float32Array ? this._gl.bufferData(this._gl.UNIFORM_BUFFER, n, this._gl.STATIC_DRAW) : this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(n), this._gl.STATIC_DRAW), this.bindUniformBuffer(null), i.references = 1, i;\n};\nDe.prototype.createDynamicUniformBuffer = function(n, e) {\n const t = this._gl.createBuffer();\n if (!t)\n throw new Error(\"Unable to create dynamic uniform buffer\");\n const i = new po(t);\n return this.bindUniformBuffer(i), n instanceof Float32Array ? this._gl.bufferData(this._gl.UNIFORM_BUFFER, n, this._gl.DYNAMIC_DRAW) : this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(n), this._gl.DYNAMIC_DRAW), this.bindUniformBuffer(null), i.references = 1, i;\n};\nDe.prototype.updateUniformBuffer = function(n, e, t, i) {\n this.bindUniformBuffer(n), t === void 0 && (t = 0), i === void 0 ? e instanceof Float32Array ? this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, t, e) : this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, t, new Float32Array(e)) : e instanceof Float32Array ? this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, e.subarray(t, t + i)) : this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, new Float32Array(e).subarray(t, t + i)), this.bindUniformBuffer(null);\n};\nDe.prototype.bindUniformBuffer = function(n) {\n this._gl.bindBuffer(this._gl.UNIFORM_BUFFER, n ? n.underlyingResource : null);\n};\nDe.prototype.bindUniformBufferBase = function(n, e, t) {\n this._gl.bindBufferBase(this._gl.UNIFORM_BUFFER, e, n ? n.underlyingResource : null);\n};\nDe.prototype.bindUniformBlock = function(n, e, t) {\n const i = n.program, r = this._gl.getUniformBlockIndex(i, e);\n r !== 4294967295 && this._gl.uniformBlockBinding(i, r, t);\n};\nclass Ie {\n /**\n * Instantiates a new Uniform buffer objects.\n *\n * Handles blocks of uniform on the GPU.\n *\n * If WebGL 2 is not available, this class falls back on traditional setUniformXXX calls.\n *\n * For more information, please refer to :\n * @see https://www.khronos.org/opengl/wiki/Uniform_Buffer_Object\n * @param engine Define the engine the buffer is associated with\n * @param data Define the data contained in the buffer\n * @param dynamic Define if the buffer is updatable\n * @param name to assign to the buffer (debugging purpose)\n * @param forceNoUniformBuffer define that this object must not rely on UBO objects\n */\n constructor(e, t, i, r, s = !1) {\n this._valueCache = {}, this._engine = e, this._noUBO = !e.supportsUniformBuffers || s, this._dynamic = i, this._name = r ?? \"no-name\", this._data = t || [], this._uniformLocations = {}, this._uniformSizes = {}, this._uniformArraySizes = {}, this._uniformLocationPointer = 0, this._needSync = !1, this._engine._features.trackUbosInFrame && (this._buffers = [], this._bufferIndex = -1, this._createBufferOnWrite = !1, this._currentFrameId = 0), this._noUBO ? (this.updateMatrix3x3 = this._updateMatrix3x3ForEffect, this.updateMatrix2x2 = this._updateMatrix2x2ForEffect, this.updateFloat = this._updateFloatForEffect, this.updateFloat2 = this._updateFloat2ForEffect, this.updateFloat3 = this._updateFloat3ForEffect, this.updateFloat4 = this._updateFloat4ForEffect, this.updateFloatArray = this._updateFloatArrayForEffect, this.updateArray = this._updateArrayForEffect, this.updateIntArray = this._updateIntArrayForEffect, this.updateUIntArray = this._updateUIntArrayForEffect, this.updateMatrix = this._updateMatrixForEffect, this.updateMatrices = this._updateMatricesForEffect, this.updateVector3 = this._updateVector3ForEffect, this.updateVector4 = this._updateVector4ForEffect, this.updateColor3 = this._updateColor3ForEffect, this.updateColor4 = this._updateColor4ForEffect, this.updateDirectColor4 = this._updateDirectColor4ForEffect, this.updateInt = this._updateIntForEffect, this.updateInt2 = this._updateInt2ForEffect, this.updateInt3 = this._updateInt3ForEffect, this.updateInt4 = this._updateInt4ForEffect, this.updateUInt = this._updateUIntForEffect, this.updateUInt2 = this._updateUInt2ForEffect, this.updateUInt3 = this._updateUInt3ForEffect, this.updateUInt4 = this._updateUInt4ForEffect) : (this._engine._uniformBuffers.push(this), this.updateMatrix3x3 = this._updateMatrix3x3ForUniform, this.updateMatrix2x2 = this._updateMatrix2x2ForUniform, this.updateFloat = this._updateFloatForUniform, this.updateFloat2 = this._updateFloat2ForUniform, this.updateFloat3 = this._updateFloat3ForUniform, this.updateFloat4 = this._updateFloat4ForUniform, this.updateFloatArray = this._updateFloatArrayForUniform, this.updateArray = this._updateArrayForUniform, this.updateIntArray = this._updateIntArrayForUniform, this.updateUIntArray = this._updateUIntArrayForUniform, this.updateMatrix = this._updateMatrixForUniform, this.updateMatrices = this._updateMatricesForUniform, this.updateVector3 = this._updateVector3ForUniform, this.updateVector4 = this._updateVector4ForUniform, this.updateColor3 = this._updateColor3ForUniform, this.updateColor4 = this._updateColor4ForUniform, this.updateDirectColor4 = this._updateDirectColor4ForUniform, this.updateInt = this._updateIntForUniform, this.updateInt2 = this._updateInt2ForUniform, this.updateInt3 = this._updateInt3ForUniform, this.updateInt4 = this._updateInt4ForUniform, this.updateUInt = this._updateUIntForUniform, this.updateUInt2 = this._updateUInt2ForUniform, this.updateUInt3 = this._updateUInt3ForUniform, this.updateUInt4 = this._updateUInt4ForUniform);\n }\n /**\n * Indicates if the buffer is using the WebGL2 UBO implementation,\n * or just falling back on setUniformXXX calls.\n */\n get useUbo() {\n return !this._noUBO;\n }\n /**\n * Indicates if the WebGL underlying uniform buffer is in sync\n * with the javascript cache data.\n */\n get isSync() {\n return !this._needSync;\n }\n /**\n * Indicates if the WebGL underlying uniform buffer is dynamic.\n * Also, a dynamic UniformBuffer will disable cache verification and always\n * update the underlying WebGL uniform buffer to the GPU.\n * @returns if Dynamic, otherwise false\n */\n isDynamic() {\n return this._dynamic !== void 0;\n }\n /**\n * The data cache on JS side.\n * @returns the underlying data as a float array\n */\n getData() {\n return this._bufferData;\n }\n /**\n * The underlying WebGL Uniform buffer.\n * @returns the webgl buffer\n */\n getBuffer() {\n return this._buffer;\n }\n /**\n * std140 layout specifies how to align data within an UBO structure.\n * See https://khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf#page=159\n * for specs.\n * @param size\n */\n _fillAlignment(e) {\n let t;\n if (e <= 2 ? t = e : t = 4, this._uniformLocationPointer % t !== 0) {\n const i = this._uniformLocationPointer;\n this._uniformLocationPointer += t - this._uniformLocationPointer % t;\n const r = this._uniformLocationPointer - i;\n for (let s = 0; s < r; s++)\n this._data.push(0);\n }\n }\n /**\n * Adds an uniform in the buffer.\n * Warning : the subsequents calls of this function must be in the same order as declared in the shader\n * for the layout to be correct ! The addUniform function only handles types like float, vec2, vec3, vec4, mat4,\n * meaning size=1,2,3,4 or 16. It does not handle struct types.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param size Data size, or data directly.\n * @param arraySize The number of elements in the array, 0 if not an array.\n */\n addUniform(e, t, i = 0) {\n if (this._noUBO || this._uniformLocations[e] !== void 0)\n return;\n let r;\n if (i > 0) {\n if (t instanceof Array)\n throw \"addUniform should not be use with Array in UBO: \" + e;\n if (this._fillAlignment(4), this._uniformArraySizes[e] = { strideSize: t, arraySize: i }, t == 16)\n t = t * i;\n else {\n const a = (4 - t) * i;\n t = t * i + a;\n }\n r = [];\n for (let s = 0; s < t; s++)\n r.push(0);\n } else {\n if (t instanceof Array)\n r = t, t = r.length;\n else {\n t = t, r = [];\n for (let s = 0; s < t; s++)\n r.push(0);\n }\n this._fillAlignment(t);\n }\n this._uniformSizes[e] = t, this._uniformLocations[e] = this._uniformLocationPointer, this._uniformLocationPointer += t;\n for (let s = 0; s < t; s++)\n this._data.push(r[s]);\n this._needSync = !0;\n }\n /**\n * Adds a Matrix 4x4 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param mat A 4x4 matrix.\n */\n addMatrix(e, t) {\n this.addUniform(e, Array.prototype.slice.call(t.asArray()));\n }\n /**\n * Adds a vec2 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param x Define the x component value of the vec2\n * @param y Define the y component value of the vec2\n */\n addFloat2(e, t, i) {\n const r = [t, i];\n this.addUniform(e, r);\n }\n /**\n * Adds a vec3 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param x Define the x component value of the vec3\n * @param y Define the y component value of the vec3\n * @param z Define the z component value of the vec3\n */\n addFloat3(e, t, i, r) {\n const s = [t, i, r];\n this.addUniform(e, s);\n }\n /**\n * Adds a vec3 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param color Define the vec3 from a Color\n */\n addColor3(e, t) {\n const i = [t.r, t.g, t.b];\n this.addUniform(e, i);\n }\n /**\n * Adds a vec4 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param color Define the rgb components from a Color\n * @param alpha Define the a component of the vec4\n */\n addColor4(e, t, i) {\n const r = [t.r, t.g, t.b, i];\n this.addUniform(e, r);\n }\n /**\n * Adds a vec3 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n * @param vector Define the vec3 components from a Vector\n */\n addVector3(e, t) {\n const i = [t.x, t.y, t.z];\n this.addUniform(e, i);\n }\n /**\n * Adds a Matrix 3x3 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n */\n addMatrix3x3(e) {\n this.addUniform(e, 12);\n }\n /**\n * Adds a Matrix 2x2 to the uniform buffer.\n * @param name Name of the uniform, as used in the uniform block in the shader.\n */\n addMatrix2x2(e) {\n this.addUniform(e, 8);\n }\n /**\n * Effectively creates the WebGL Uniform Buffer, once layout is completed with `addUniform`.\n */\n create() {\n this._noUBO || this._buffer || (this._fillAlignment(4), this._bufferData = new Float32Array(this._data), this._rebuild(), this._needSync = !0);\n }\n // The result of this method is used for debugging purpose, as part of the buffer name\n // It is meant to more easily know what this buffer is about when debugging\n // Some buffers can have a lot of uniforms (several dozens), so the method only returns the first 10 of them\n // (should be enough to understand what the buffer is for)\n _getNames() {\n const e = [];\n let t = 0;\n for (const i in this._uniformLocations)\n if (e.push(i), ++t === 10)\n break;\n return e.join(\",\");\n }\n /** @internal */\n _rebuild() {\n this._noUBO || !this._bufferData || (this._dynamic ? this._buffer = this._engine.createDynamicUniformBuffer(this._bufferData, this._name + \"_UniformList:\" + this._getNames()) : this._buffer = this._engine.createUniformBuffer(this._bufferData, this._name + \"_UniformList:\" + this._getNames()), this._engine._features.trackUbosInFrame && (this._buffers.push([this._buffer, this._engine._features.checkUbosContentBeforeUpload ? this._bufferData.slice() : void 0]), this._bufferIndex = this._buffers.length - 1, this._createBufferOnWrite = !1));\n }\n /** @internal */\n _rebuildAfterContextLost() {\n this._engine._features.trackUbosInFrame && (this._buffers = [], this._currentFrameId = 0), this._rebuild();\n }\n /** @internal */\n get _numBuffers() {\n return this._buffers.length;\n }\n /** @internal */\n get _indexBuffer() {\n return this._bufferIndex;\n }\n /** Gets the name of this buffer */\n get name() {\n return this._name;\n }\n /** Gets the current effect */\n get currentEffect() {\n return this._currentEffect;\n }\n _buffersEqual(e, t) {\n for (let i = 0; i < e.length; ++i)\n if (e[i] !== t[i])\n return !1;\n return !0;\n }\n _copyBuffer(e, t) {\n for (let i = 0; i < e.length; ++i)\n t[i] = e[i];\n }\n /**\n * Updates the WebGL Uniform Buffer on the GPU.\n * If the `dynamic` flag is set to true, no cache comparison is done.\n * Otherwise, the buffer will be updated only if the cache differs.\n */\n update() {\n if (!this._noUBO) {\n if (this.bindUniformBuffer(), !this._buffer) {\n this.create();\n return;\n }\n if (!this._dynamic && !this._needSync) {\n this._createBufferOnWrite = this._engine._features.trackUbosInFrame;\n return;\n }\n if (this._buffers && this._buffers.length > 1 && this._buffers[this._bufferIndex][1])\n if (this._buffersEqual(this._bufferData, this._buffers[this._bufferIndex][1])) {\n this._needSync = !1, this._createBufferOnWrite = this._engine._features.trackUbosInFrame;\n return;\n } else\n this._copyBuffer(this._bufferData, this._buffers[this._bufferIndex][1]);\n this._engine.updateUniformBuffer(this._buffer, this._bufferData), this._engine._features._collectUbosUpdatedInFrame && (Ie._UpdatedUbosInFrame[this._name] || (Ie._UpdatedUbosInFrame[this._name] = 0), Ie._UpdatedUbosInFrame[this._name]++), this._needSync = !1, this._createBufferOnWrite = this._engine._features.trackUbosInFrame;\n }\n }\n _createNewBuffer() {\n this._bufferIndex + 1 < this._buffers.length ? (this._bufferIndex++, this._buffer = this._buffers[this._bufferIndex][0], this._createBufferOnWrite = !1, this._needSync = !0) : this._rebuild();\n }\n _checkNewFrame() {\n this._engine._features.trackUbosInFrame && this._currentFrameId !== this._engine.frameId && (this._currentFrameId = this._engine.frameId, this._createBufferOnWrite = !1, this._buffers && this._buffers.length > 0 ? (this._needSync = this._bufferIndex !== 0, this._bufferIndex = 0, this._buffer = this._buffers[this._bufferIndex][0]) : this._bufferIndex = -1);\n }\n /**\n * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU.\n * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.\n * @param data Define the flattened data\n * @param size Define the size of the data.\n */\n updateUniform(e, t, i) {\n this._checkNewFrame();\n let r = this._uniformLocations[e];\n if (r === void 0) {\n if (this._buffer) {\n ne.Error(\"Cannot add an uniform after UBO has been created. uniformName=\" + e);\n return;\n }\n this.addUniform(e, i), r = this._uniformLocations[e];\n }\n if (this._buffer || this.create(), this._dynamic)\n for (let s = 0; s < i; s++)\n this._bufferData[r + s] = t[s];\n else {\n let s = !1;\n for (let a = 0; a < i; a++)\n (i === 16 && !this._engine._features.uniformBufferHardCheckMatrix || this._bufferData[r + a] !== Math.fround(t[a])) && (s = !0, this._createBufferOnWrite && this._createNewBuffer(), this._bufferData[r + a] = t[a]);\n this._needSync = this._needSync || s;\n }\n }\n /**\n * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU.\n * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.\n * @param data Define the flattened data\n * @param size Define the size of the data.\n */\n updateUniformArray(e, t, i) {\n this._checkNewFrame();\n const r = this._uniformLocations[e];\n if (r === void 0) {\n ne.Error(\"Cannot add an uniform Array dynamically. Please, add it using addUniform and make sure that uniform buffers are supported by the current engine.\");\n return;\n }\n this._buffer || this.create();\n const s = this._uniformArraySizes[e];\n if (this._dynamic)\n for (let a = 0; a < i; a++)\n this._bufferData[r + a] = t[a];\n else {\n let a = !1, o = 0, l = 0;\n for (let c = 0; c < i; c++)\n if (this._bufferData[r + l * 4 + o] !== ge.FloatRound(t[c]) && (a = !0, this._createBufferOnWrite && this._createNewBuffer(), this._bufferData[r + l * 4 + o] = t[c]), o++, o === s.strideSize) {\n for (; o < 4; o++)\n this._bufferData[r + l * 4 + o] = 0;\n o = 0, l++;\n }\n this._needSync = this._needSync || a;\n }\n }\n _cacheMatrix(e, t) {\n this._checkNewFrame();\n const i = this._valueCache[e], r = t.updateFlag;\n return i !== void 0 && i === r ? !1 : (this._valueCache[e] = r, !0);\n }\n // Update methods\n _updateMatrix3x3ForUniform(e, t) {\n for (let i = 0; i < 3; i++)\n Ie._TempBuffer[i * 4] = t[i * 3], Ie._TempBuffer[i * 4 + 1] = t[i * 3 + 1], Ie._TempBuffer[i * 4 + 2] = t[i * 3 + 2], Ie._TempBuffer[i * 4 + 3] = 0;\n this.updateUniform(e, Ie._TempBuffer, 12);\n }\n _updateMatrix3x3ForEffect(e, t) {\n this._currentEffect.setMatrix3x3(e, t);\n }\n _updateMatrix2x2ForEffect(e, t) {\n this._currentEffect.setMatrix2x2(e, t);\n }\n _updateMatrix2x2ForUniform(e, t) {\n for (let i = 0; i < 2; i++)\n Ie._TempBuffer[i * 4] = t[i * 2], Ie._TempBuffer[i * 4 + 1] = t[i * 2 + 1], Ie._TempBuffer[i * 4 + 2] = 0, Ie._TempBuffer[i * 4 + 3] = 0;\n this.updateUniform(e, Ie._TempBuffer, 8);\n }\n _updateFloatForEffect(e, t) {\n this._currentEffect.setFloat(e, t);\n }\n _updateFloatForUniform(e, t) {\n Ie._TempBuffer[0] = t, this.updateUniform(e, Ie._TempBuffer, 1);\n }\n _updateFloat2ForEffect(e, t, i, r = \"\") {\n this._currentEffect.setFloat2(e + r, t, i);\n }\n _updateFloat2ForUniform(e, t, i) {\n Ie._TempBuffer[0] = t, Ie._TempBuffer[1] = i, this.updateUniform(e, Ie._TempBuffer, 2);\n }\n _updateFloat3ForEffect(e, t, i, r, s = \"\") {\n this._currentEffect.setFloat3(e + s, t, i, r);\n }\n _updateFloat3ForUniform(e, t, i, r) {\n Ie._TempBuffer[0] = t, Ie._TempBuffer[1] = i, Ie._TempBuffer[2] = r, this.updateUniform(e, Ie._TempBuffer, 3);\n }\n _updateFloat4ForEffect(e, t, i, r, s, a = \"\") {\n this._currentEffect.setFloat4(e + a, t, i, r, s);\n }\n _updateFloat4ForUniform(e, t, i, r, s) {\n Ie._TempBuffer[0] = t, Ie._TempBuffer[1] = i, Ie._TempBuffer[2] = r, Ie._TempBuffer[3] = s, this.updateUniform(e, Ie._TempBuffer, 4);\n }\n _updateFloatArrayForEffect(e, t) {\n this._currentEffect.setFloatArray(e, t);\n }\n _updateFloatArrayForUniform(e, t) {\n this.updateUniformArray(e, t, t.length);\n }\n _updateArrayForEffect(e, t) {\n this._currentEffect.setArray(e, t);\n }\n _updateArrayForUniform(e, t) {\n this.updateUniformArray(e, t, t.length);\n }\n _updateIntArrayForEffect(e, t) {\n this._currentEffect.setIntArray(e, t);\n }\n _updateIntArrayForUniform(e, t) {\n Ie._TempBufferInt32View.set(t), this.updateUniformArray(e, Ie._TempBuffer, t.length);\n }\n _updateUIntArrayForEffect(e, t) {\n this._currentEffect.setUIntArray(e, t);\n }\n _updateUIntArrayForUniform(e, t) {\n Ie._TempBufferUInt32View.set(t), this.updateUniformArray(e, Ie._TempBuffer, t.length);\n }\n _updateMatrixForEffect(e, t) {\n this._currentEffect.setMatrix(e, t);\n }\n _updateMatrixForUniform(e, t) {\n this._cacheMatrix(e, t) && this.updateUniform(e, t.asArray(), 16);\n }\n _updateMatricesForEffect(e, t) {\n this._currentEffect.setMatrices(e, t);\n }\n _updateMatricesForUniform(e, t) {\n this.updateUniform(e, t, t.length);\n }\n _updateVector3ForEffect(e, t) {\n this._currentEffect.setVector3(e, t);\n }\n _updateVector3ForUniform(e, t) {\n Ie._TempBuffer[0] = t.x, Ie._TempBuffer[1] = t.y, Ie._TempBuffer[2] = t.z, this.updateUniform(e, Ie._TempBuffer, 3);\n }\n _updateVector4ForEffect(e, t) {\n this._currentEffect.setVector4(e, t);\n }\n _updateVector4ForUniform(e, t) {\n Ie._TempBuffer[0] = t.x, Ie._TempBuffer[1] = t.y, Ie._TempBuffer[2] = t.z, Ie._TempBuffer[3] = t.w, this.updateUniform(e, Ie._TempBuffer, 4);\n }\n _updateColor3ForEffect(e, t, i = \"\") {\n this._currentEffect.setColor3(e + i, t);\n }\n _updateColor3ForUniform(e, t) {\n Ie._TempBuffer[0] = t.r, Ie._TempBuffer[1] = t.g, Ie._TempBuffer[2] = t.b, this.updateUniform(e, Ie._TempBuffer, 3);\n }\n _updateColor4ForEffect(e, t, i, r = \"\") {\n this._currentEffect.setColor4(e + r, t, i);\n }\n _updateDirectColor4ForEffect(e, t, i = \"\") {\n this._currentEffect.setDirectColor4(e + i, t);\n }\n _updateColor4ForUniform(e, t, i) {\n Ie._TempBuffer[0] = t.r, Ie._TempBuffer[1] = t.g, Ie._TempBuffer[2] = t.b, Ie._TempBuffer[3] = i, this.updateUniform(e, Ie._TempBuffer, 4);\n }\n _updateDirectColor4ForUniform(e, t) {\n Ie._TempBuffer[0] = t.r, Ie._TempBuffer[1] = t.g, Ie._TempBuffer[2] = t.b, Ie._TempBuffer[3] = t.a, this.updateUniform(e, Ie._TempBuffer, 4);\n }\n _updateIntForEffect(e, t, i = \"\") {\n this._currentEffect.setInt(e + i, t);\n }\n _updateIntForUniform(e, t) {\n Ie._TempBufferInt32View[0] = t, this.updateUniform(e, Ie._TempBuffer, 1);\n }\n _updateInt2ForEffect(e, t, i, r = \"\") {\n this._currentEffect.setInt2(e + r, t, i);\n }\n _updateInt2ForUniform(e, t, i) {\n Ie._TempBufferInt32View[0] = t, Ie._TempBufferInt32View[1] = i, this.updateUniform(e, Ie._TempBuffer, 2);\n }\n _updateInt3ForEffect(e, t, i, r, s = \"\") {\n this._currentEffect.setInt3(e + s, t, i, r);\n }\n _updateInt3ForUniform(e, t, i, r) {\n Ie._TempBufferInt32View[0] = t, Ie._TempBufferInt32View[1] = i, Ie._TempBufferInt32View[2] = r, this.updateUniform(e, Ie._TempBuffer, 3);\n }\n _updateInt4ForEffect(e, t, i, r, s, a = \"\") {\n this._currentEffect.setInt4(e + a, t, i, r, s);\n }\n _updateInt4ForUniform(e, t, i, r, s) {\n Ie._TempBufferInt32View[0] = t, Ie._TempBufferInt32View[1] = i, Ie._TempBufferInt32View[2] = r, Ie._TempBufferInt32View[3] = s, this.updateUniform(e, Ie._TempBuffer, 4);\n }\n _updateUIntForEffect(e, t, i = \"\") {\n this._currentEffect.setUInt(e + i, t);\n }\n _updateUIntForUniform(e, t) {\n Ie._TempBufferUInt32View[0] = t, this.updateUniform(e, Ie._TempBuffer, 1);\n }\n _updateUInt2ForEffect(e, t, i, r = \"\") {\n this._currentEffect.setUInt2(e + r, t, i);\n }\n _updateUInt2ForUniform(e, t, i) {\n Ie._TempBufferUInt32View[0] = t, Ie._TempBufferUInt32View[1] = i, this.updateUniform(e, Ie._TempBuffer, 2);\n }\n _updateUInt3ForEffect(e, t, i, r, s = \"\") {\n this._currentEffect.setUInt3(e + s, t, i, r);\n }\n _updateUInt3ForUniform(e, t, i, r) {\n Ie._TempBufferUInt32View[0] = t, Ie._TempBufferUInt32View[1] = i, Ie._TempBufferUInt32View[2] = r, this.updateUniform(e, Ie._TempBuffer, 3);\n }\n _updateUInt4ForEffect(e, t, i, r, s, a = \"\") {\n this._currentEffect.setUInt4(e + a, t, i, r, s);\n }\n _updateUInt4ForUniform(e, t, i, r, s) {\n Ie._TempBufferUInt32View[0] = t, Ie._TempBufferUInt32View[1] = i, Ie._TempBufferUInt32View[2] = r, Ie._TempBufferUInt32View[3] = s, this.updateUniform(e, Ie._TempBuffer, 4);\n }\n /**\n * Sets a sampler uniform on the effect.\n * @param name Define the name of the sampler.\n * @param texture Define the texture to set in the sampler\n */\n setTexture(e, t) {\n this._currentEffect.setTexture(e, t);\n }\n /**\n * Sets a sampler uniform on the effect.\n * @param name Define the name of the sampler.\n * @param texture Define the (internal) texture to set in the sampler\n */\n bindTexture(e, t) {\n this._currentEffect._bindTexture(e, t);\n }\n /**\n * Directly updates the value of the uniform in the cache AND on the GPU.\n * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.\n * @param data Define the flattened data\n */\n updateUniformDirectly(e, t) {\n this.updateUniform(e, t, t.length), this.update();\n }\n /**\n * Associates an effect to this uniform buffer\n * @param effect Define the effect to associate the buffer to\n * @param name Name of the uniform block in the shader.\n */\n bindToEffect(e, t) {\n this._currentEffect = e, this._currentEffectName = t;\n }\n /**\n * Binds the current (GPU) buffer to the effect\n */\n bindUniformBuffer() {\n !this._noUBO && this._buffer && this._currentEffect && this._currentEffect.bindUniformBuffer(this._buffer, this._currentEffectName);\n }\n /**\n * Dissociates the current effect from this uniform buffer\n */\n unbindEffect() {\n this._currentEffect = void 0, this._currentEffectName = void 0;\n }\n /**\n * Sets the current state of the class (_bufferIndex, _buffer) to point to the data buffer passed in parameter if this buffer is one of the buffers handled by the class (meaning if it can be found in the _buffers array)\n * This method is meant to be able to update a buffer at any time: just call setDataBuffer to set the class in the right state, call some updateXXX methods and then call udpate() => that will update the GPU buffer on the graphic card\n * @param dataBuffer buffer to look for\n * @returns true if the buffer has been found and the class internal state points to it, else false\n */\n setDataBuffer(e) {\n if (!this._buffers)\n return this._buffer === e;\n for (let t = 0; t < this._buffers.length; ++t)\n if (this._buffers[t][0] === e)\n return this._bufferIndex = t, this._buffer = e, this._createBufferOnWrite = !1, this._currentEffect = void 0, !0;\n return !1;\n }\n /**\n * Disposes the uniform buffer.\n */\n dispose() {\n if (this._noUBO)\n return;\n const e = this._engine._uniformBuffers, t = e.indexOf(this);\n if (t !== -1 && (e[t] = e[e.length - 1], e.pop()), this._engine._features.trackUbosInFrame && this._buffers)\n for (let i = 0; i < this._buffers.length; ++i) {\n const r = this._buffers[i][0];\n this._engine._releaseBuffer(r);\n }\n else\n this._buffer && this._engine._releaseBuffer(this._buffer) && (this._buffer = null);\n }\n}\nIe._UpdatedUbosInFrame = {};\nIe._MAX_UNIFORM_SIZE = 256;\nIe._TempBuffer = new Float32Array(Ie._MAX_UNIFORM_SIZE);\nIe._TempBufferInt32View = new Int32Array(Ie._TempBuffer.buffer);\nIe._TempBufferUInt32View = new Uint32Array(Ie._TempBuffer.buffer);\nlet dr = class {\n /**\n * Gets a boolean indicating if the Buffer is disposed\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Constructor\n * @param engine the engine\n * @param data the data to use for this buffer\n * @param updatable whether the data is updatable\n * @param stride the stride (optional)\n * @param postponeInternalCreation whether to postpone creating the internal WebGL buffer (optional)\n * @param instanced whether the buffer is instanced (optional)\n * @param useBytes set to true if the stride in in bytes (optional)\n * @param divisor sets an optional divisor for instances (1 by default)\n * @param label defines the label of the buffer (for debug purpose)\n */\n constructor(e, t, i, r = 0, s = !1, a = !1, o = !1, l, c) {\n this._isAlreadyOwned = !1, this._isDisposed = !1, e && e.getScene ? this._engine = e.getScene().getEngine() : this._engine = e, this._updatable = i, this._instanced = a, this._divisor = l || 1, this._label = c, t instanceof Wo ? (this._data = null, this._buffer = t) : (this._data = t, this._buffer = null), this.byteStride = o ? r : r * Float32Array.BYTES_PER_ELEMENT, s || this.create();\n }\n /**\n * Create a new VertexBuffer based on the current buffer\n * @param kind defines the vertex buffer kind (position, normal, etc.)\n * @param offset defines offset in the buffer (0 by default)\n * @param size defines the size in floats of attributes (position is 3 for instance)\n * @param stride defines the stride size in floats in the buffer (the offset to apply to reach next value when data is interleaved)\n * @param instanced defines if the vertex buffer contains indexed data\n * @param useBytes defines if the offset and stride are in bytes *\n * @param divisor sets an optional divisor for instances (1 by default)\n * @returns the new vertex buffer\n */\n createVertexBuffer(e, t, i, r, s, a = !1, o) {\n const l = a ? t : t * Float32Array.BYTES_PER_ELEMENT, c = r ? a ? r : r * Float32Array.BYTES_PER_ELEMENT : this.byteStride;\n return new I(this._engine, this, e, this._updatable, !0, c, s === void 0 ? this._instanced : s, l, i, void 0, void 0, !0, this._divisor || o);\n }\n // Properties\n /**\n * Gets a boolean indicating if the Buffer is updatable?\n * @returns true if the buffer is updatable\n */\n isUpdatable() {\n return this._updatable;\n }\n /**\n * Gets current buffer's data\n * @returns a DataArray or null\n */\n getData() {\n return this._data;\n }\n /**\n * Gets underlying native buffer\n * @returns underlying native buffer\n */\n getBuffer() {\n return this._buffer;\n }\n /**\n * Gets the stride in float32 units (i.e. byte stride / 4).\n * May not be an integer if the byte stride is not divisible by 4.\n * @returns the stride in float32 units\n * @deprecated Please use byteStride instead.\n */\n getStrideSize() {\n return this.byteStride / Float32Array.BYTES_PER_ELEMENT;\n }\n // Methods\n /**\n * Store data into the buffer. Creates the buffer if not used already.\n * If the buffer was already used, it will be updated only if it is updatable, otherwise it will do nothing.\n * @param data defines the data to store\n */\n create(e = null) {\n !e && this._buffer || (e = e || this._data, e && (this._buffer ? this._updatable && (this._engine.updateDynamicVertexBuffer(this._buffer, e), this._data = e) : this._updatable ? (this._buffer = this._engine.createDynamicVertexBuffer(e, this._label), this._data = e) : this._buffer = this._engine.createVertexBuffer(e, void 0, this._label)));\n }\n /** @internal */\n _rebuild() {\n if (this._data)\n this._buffer = null, this.create(this._data);\n else {\n if (!this._buffer)\n return;\n if (this._buffer.capacity > 0) {\n this._updatable ? this._buffer = this._engine.createDynamicVertexBuffer(this._buffer.capacity, this._label) : this._buffer = this._engine.createVertexBuffer(this._buffer.capacity, void 0, this._label);\n return;\n }\n ne.Warn(`Missing data for buffer \"${this._label}\" ${this._buffer ? \"(uniqueId: \" + this._buffer.uniqueId + \")\" : \"\"}. Buffer reconstruction failed.`), this._buffer = null;\n }\n }\n /**\n * Update current buffer data\n * @param data defines the data to store\n */\n update(e) {\n this.create(e);\n }\n /**\n * Updates the data directly.\n * @param data the new data\n * @param offset the new offset\n * @param vertexCount the vertex count (optional)\n * @param useBytes set to true if the offset is in bytes\n */\n updateDirectly(e, t, i, r = !1) {\n this._buffer && this._updatable && (this._engine.updateDynamicVertexBuffer(this._buffer, e, r ? t : t * Float32Array.BYTES_PER_ELEMENT, i ? i * this.byteStride : void 0), t === 0 && i === void 0 ? this._data = e : this._data = null);\n }\n /** @internal */\n _increaseReferences() {\n if (this._buffer) {\n if (!this._isAlreadyOwned) {\n this._isAlreadyOwned = !0;\n return;\n }\n this._buffer.references++;\n }\n }\n /**\n * Release all resources\n */\n dispose() {\n this._buffer && this._engine._releaseBuffer(this._buffer) && (this._isDisposed = !0, this._data = null, this._buffer = null);\n }\n};\nclass I {\n /**\n * Gets a boolean indicating if the Buffer is disposed\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Gets or sets the instance divisor when in instanced mode\n */\n get instanceDivisor() {\n return this._instanceDivisor;\n }\n set instanceDivisor(e) {\n const t = e != 0;\n this._instanceDivisor = e, t !== this._instanced && (this._instanced = t, this._computeHashCode());\n }\n /**\n * Gets the max possible amount of vertices stored within the current vertex buffer.\n * We do not have the end offset or count so this will be too big for concatenated vertex buffers.\n * @internal\n */\n get _maxVerticesCount() {\n const e = this.getData();\n return e ? Array.isArray(e) ? e.length / (this.byteStride / 4) - this.byteOffset / 4 : (e.byteLength - this.byteOffset) / this.byteStride : 0;\n }\n /** @internal */\n constructor(e, t, i, r, s, a, o, l, c, h, u = !1, f = !1, d = 1, p = !1) {\n this._isDisposed = !1;\n let g = !1;\n if (this.engine = e, typeof r == \"object\" && r !== null ? (g = r.updatable ?? !1, s = r.postponeInternalCreation, a = r.stride, o = r.instanced, l = r.offset, c = r.size, h = r.type, u = r.normalized ?? !1, f = r.useBytes ?? !1, d = r.divisor ?? 1, p = r.takeBufferOwnership ?? !1, this._label = r.label) : g = !!r, t instanceof dr ? (this._buffer = t, this._ownsBuffer = p) : (this._buffer = new dr(e, t, g, a, s, o, f, d, this._label), this._ownsBuffer = !0), this.uniqueId = I._Counter++, this._kind = i, h === void 0) {\n const v = this.getData();\n this.type = v ? I.GetDataType(v) : I.FLOAT;\n } else\n this.type = h;\n const m = I.GetTypeByteLength(this.type);\n f ? (this._size = c || (a ? a / m : I.DeduceStride(i)), this.byteStride = a || this._buffer.byteStride || this._size * m, this.byteOffset = l || 0) : (this._size = c || a || I.DeduceStride(i), this.byteStride = a ? a * m : this._buffer.byteStride || this._size * m, this.byteOffset = (l || 0) * m), this.normalized = u, this._instanced = o !== void 0 ? o : !1, this._instanceDivisor = o ? d : 0, this._alignBuffer(), this._computeHashCode();\n }\n _computeHashCode() {\n this.hashCode = (this.type - 5120 << 0) + ((this.normalized ? 1 : 0) << 3) + (this._size << 4) + ((this._instanced ? 1 : 0) << 6) + /* keep 5 bits free */\n (this.byteStride << 12);\n }\n /** @internal */\n _rebuild() {\n var e;\n (e = this._buffer) == null || e._rebuild();\n }\n /**\n * Returns the kind of the VertexBuffer (string)\n * @returns a string\n */\n getKind() {\n return this._kind;\n }\n // Properties\n /**\n * Gets a boolean indicating if the VertexBuffer is updatable?\n * @returns true if the buffer is updatable\n */\n isUpdatable() {\n return this._buffer.isUpdatable();\n }\n /**\n * Gets current buffer's data\n * @returns a DataArray or null\n */\n getData() {\n return this._buffer.getData();\n }\n /**\n * Gets current buffer's data as a float array. Float data is constructed if the vertex buffer data cannot be returned directly.\n * @param totalVertices number of vertices in the buffer to take into account\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\n * @returns a float array containing vertex data\n */\n getFloatData(e, t) {\n const i = this.getData();\n return i ? I.GetFloatData(i, this._size, this.type, this.byteOffset, this.byteStride, this.normalized, e, t) : null;\n }\n /**\n * Gets underlying native buffer\n * @returns underlying native buffer\n */\n getBuffer() {\n return this._buffer.getBuffer();\n }\n /**\n * Gets the Buffer instance that wraps the native GPU buffer\n * @returns the wrapper buffer\n */\n getWrapperBuffer() {\n return this._buffer;\n }\n /**\n * Gets the stride in float32 units (i.e. byte stride / 4).\n * May not be an integer if the byte stride is not divisible by 4.\n * @returns the stride in float32 units\n * @deprecated Please use byteStride instead.\n */\n getStrideSize() {\n return this.byteStride / I.GetTypeByteLength(this.type);\n }\n /**\n * Returns the offset as a multiple of the type byte length.\n * @returns the offset in bytes\n * @deprecated Please use byteOffset instead.\n */\n getOffset() {\n return this.byteOffset / I.GetTypeByteLength(this.type);\n }\n /**\n * Returns the number of components or the byte size per vertex attribute\n * @param sizeInBytes If true, returns the size in bytes or else the size in number of components of the vertex attribute (default: false)\n * @returns the number of components\n */\n getSize(e = !1) {\n return e ? this._size * I.GetTypeByteLength(this.type) : this._size;\n }\n /**\n * Gets a boolean indicating is the internal buffer of the VertexBuffer is instanced\n * @returns true if this buffer is instanced\n */\n getIsInstanced() {\n return this._instanced;\n }\n /**\n * Returns the instancing divisor, zero for non-instanced (integer).\n * @returns a number\n */\n getInstanceDivisor() {\n return this._instanceDivisor;\n }\n // Methods\n /**\n * Store data into the buffer. If the buffer was already used it will be either recreated or updated depending on isUpdatable property\n * @param data defines the data to store\n */\n create(e) {\n this._buffer.create(e), this._alignBuffer();\n }\n /**\n * Updates the underlying buffer according to the passed numeric array or Float32Array.\n * This function will create a new buffer if the current one is not updatable\n * @param data defines the data to store\n */\n update(e) {\n this._buffer.update(e), this._alignBuffer();\n }\n /**\n * Updates directly the underlying WebGLBuffer according to the passed numeric array or Float32Array.\n * Returns the directly updated WebGLBuffer.\n * @param data the new data\n * @param offset the new offset\n * @param useBytes set to true if the offset is in bytes\n */\n updateDirectly(e, t, i = !1) {\n this._buffer.updateDirectly(e, t, void 0, i), this._alignBuffer();\n }\n /**\n * Disposes the VertexBuffer and the underlying WebGLBuffer.\n */\n dispose() {\n this._ownsBuffer && this._buffer.dispose(), this._isDisposed = !0;\n }\n /**\n * Enumerates each value of this vertex buffer as numbers.\n * @param count the number of values to enumerate\n * @param callback the callback function called for each value\n */\n forEach(e, t) {\n I.ForEach(this._buffer.getData(), this.byteOffset, this.byteStride, this._size, this.type, e, this.normalized, t);\n }\n /** @internal */\n _alignBuffer() {\n }\n /**\n * Deduces the stride given a kind.\n * @param kind The kind string to deduce\n * @returns The deduced stride\n */\n static DeduceStride(e) {\n switch (e) {\n case I.UVKind:\n case I.UV2Kind:\n case I.UV3Kind:\n case I.UV4Kind:\n case I.UV5Kind:\n case I.UV6Kind:\n return 2;\n case I.NormalKind:\n case I.PositionKind:\n return 3;\n case I.ColorKind:\n case I.ColorInstanceKind:\n case I.MatricesIndicesKind:\n case I.MatricesIndicesExtraKind:\n case I.MatricesWeightsKind:\n case I.MatricesWeightsExtraKind:\n case I.TangentKind:\n return 4;\n default:\n throw new Error(\"Invalid kind '\" + e + \"'\");\n }\n }\n /**\n * Gets the vertex buffer type of the given data array.\n * @param data the data array\n * @returns the vertex buffer type\n */\n static GetDataType(e) {\n return e instanceof Int8Array ? I.BYTE : e instanceof Uint8Array ? I.UNSIGNED_BYTE : e instanceof Int16Array ? I.SHORT : e instanceof Uint16Array ? I.UNSIGNED_SHORT : e instanceof Int32Array ? I.INT : e instanceof Uint32Array ? I.UNSIGNED_INT : I.FLOAT;\n }\n /**\n * Gets the byte length of the given type.\n * @param type the type\n * @returns the number of bytes\n */\n static GetTypeByteLength(e) {\n switch (e) {\n case I.BYTE:\n case I.UNSIGNED_BYTE:\n return 1;\n case I.SHORT:\n case I.UNSIGNED_SHORT:\n return 2;\n case I.INT:\n case I.UNSIGNED_INT:\n case I.FLOAT:\n return 4;\n default:\n throw new Error(`Invalid type '${e}'`);\n }\n }\n /**\n * Enumerates each value of the given parameters as numbers.\n * @param data the data to enumerate\n * @param byteOffset the byte offset of the data\n * @param byteStride the byte stride of the data\n * @param componentCount the number of components per element\n * @param componentType the type of the component\n * @param count the number of values to enumerate\n * @param normalized whether the data is normalized\n * @param callback the callback function called for each value\n */\n static ForEach(e, t, i, r, s, a, o, l) {\n if (e instanceof Array) {\n let c = t / 4;\n const h = i / 4;\n for (let u = 0; u < a; u += r) {\n for (let f = 0; f < r; f++)\n l(e[c + f], u + f);\n c += h;\n }\n } else {\n const c = e instanceof ArrayBuffer ? new DataView(e) : new DataView(e.buffer, e.byteOffset, e.byteLength), h = I.GetTypeByteLength(s);\n for (let u = 0; u < a; u += r) {\n let f = t;\n for (let d = 0; d < r; d++) {\n const p = I._GetFloatValue(c, s, f, o);\n l(p, u + d), f += h;\n }\n t += i;\n }\n }\n }\n static _GetFloatValue(e, t, i, r) {\n switch (t) {\n case I.BYTE: {\n let s = e.getInt8(i);\n return r && (s = Math.max(s / 127, -1)), s;\n }\n case I.UNSIGNED_BYTE: {\n let s = e.getUint8(i);\n return r && (s = s / 255), s;\n }\n case I.SHORT: {\n let s = e.getInt16(i, !0);\n return r && (s = Math.max(s / 32767, -1)), s;\n }\n case I.UNSIGNED_SHORT: {\n let s = e.getUint16(i, !0);\n return r && (s = s / 65535), s;\n }\n case I.INT:\n return e.getInt32(i, !0);\n case I.UNSIGNED_INT:\n return e.getUint32(i, !0);\n case I.FLOAT:\n return e.getFloat32(i, !0);\n default:\n throw new Error(`Invalid component type ${t}`);\n }\n }\n /**\n * Gets the given data array as a float array. Float data is constructed if the data array cannot be returned directly.\n * @param data the input data array\n * @param size the number of components\n * @param type the component type\n * @param byteOffset the byte offset of the data\n * @param byteStride the byte stride of the data\n * @param normalized whether the data is normalized\n * @param totalVertices number of vertices in the buffer to take into account\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\n * @returns a float array containing vertex data\n */\n static GetFloatData(e, t, i, r, s, a, o, l) {\n const c = t * I.GetTypeByteLength(i), h = o * t;\n if (i !== I.FLOAT || s !== c) {\n const u = new Float32Array(h);\n return I.ForEach(e, r, s, t, i, h, a, (f, d) => u[d] = f), u;\n }\n if (!(e instanceof Array || e instanceof Float32Array) || r !== 0 || e.length !== h)\n if (e instanceof Array) {\n const u = r / 4;\n return e.slice(u, u + h);\n } else {\n if (e instanceof ArrayBuffer)\n return new Float32Array(e, r, h);\n {\n let u = e.byteOffset + r;\n if (l) {\n const d = new Float32Array(h), p = new Float32Array(e.buffer, u, h);\n return d.set(p), d;\n }\n const f = u % 4;\n return f && (u = Math.max(0, u - f)), new Float32Array(e.buffer, u, h);\n }\n }\n return l ? e.slice() : e;\n }\n}\nI._Counter = 0;\nI.BYTE = 5120;\nI.UNSIGNED_BYTE = 5121;\nI.SHORT = 5122;\nI.UNSIGNED_SHORT = 5123;\nI.INT = 5124;\nI.UNSIGNED_INT = 5125;\nI.FLOAT = 5126;\nI.PositionKind = \"position\";\nI.NormalKind = \"normal\";\nI.TangentKind = \"tangent\";\nI.UVKind = \"uv\";\nI.UV2Kind = \"uv2\";\nI.UV3Kind = \"uv3\";\nI.UV4Kind = \"uv4\";\nI.UV5Kind = \"uv5\";\nI.UV6Kind = \"uv6\";\nI.ColorKind = \"color\";\nI.ColorInstanceKind = \"instanceColor\";\nI.MatricesIndicesKind = \"matricesIndices\";\nI.MatricesWeightsKind = \"matricesWeights\";\nI.MatricesIndicesExtraKind = \"matricesIndicesExtra\";\nI.MatricesWeightsExtraKind = \"matricesWeightsExtra\";\nclass ps {\n constructor() {\n this.hit = !1, this.distance = 0, this.pickedPoint = null, this.pickedMesh = null, this.bu = 0, this.bv = 0, this.faceId = -1, this.subMeshFaceId = -1, this.subMeshId = 0, this.pickedSprite = null, this.thinInstanceIndex = -1, this.ray = null, this.originMesh = null, this.aimTransform = null, this.gripTransform = null;\n }\n /**\n * Gets the normal corresponding to the face the pick collided with\n * @param useWorldCoordinates If the resulting normal should be relative to the world (default: false)\n * @param useVerticesNormals If the vertices normals should be used to calculate the normal instead of the normal map (default: true)\n * @returns The normal corresponding to the face the pick collided with\n * @remarks Note that the returned normal will always point towards the picking ray.\n */\n getNormal(e = !1, t = !0) {\n if (!this.pickedMesh || t && !this.pickedMesh.isVerticesDataPresent(I.NormalKind))\n return null;\n let i = this.pickedMesh.getIndices();\n (i == null ? void 0 : i.length) === 0 && (i = null);\n let r;\n const s = z.Vector3[0], a = z.Vector3[1], o = z.Vector3[2];\n if (t) {\n const c = this.pickedMesh.getVerticesData(I.NormalKind);\n let h = i ? _.FromArrayToRef(c, i[this.faceId * 3] * 3, s) : s.copyFromFloats(c[this.faceId * 3 * 3], c[this.faceId * 3 * 3 + 1], c[this.faceId * 3 * 3 + 2]), u = i ? _.FromArrayToRef(c, i[this.faceId * 3 + 1] * 3, a) : a.copyFromFloats(c[(this.faceId * 3 + 1) * 3], c[(this.faceId * 3 + 1) * 3 + 1], c[(this.faceId * 3 + 1) * 3 + 2]), f = i ? _.FromArrayToRef(c, i[this.faceId * 3 + 2] * 3, o) : o.copyFromFloats(c[(this.faceId * 3 + 2) * 3], c[(this.faceId * 3 + 2) * 3 + 1], c[(this.faceId * 3 + 2) * 3 + 2]);\n h = h.scale(this.bu), u = u.scale(this.bv), f = f.scale(1 - this.bu - this.bv), r = new _(h.x + u.x + f.x, h.y + u.y + f.y, h.z + u.z + f.z);\n } else {\n const c = this.pickedMesh.getVerticesData(I.PositionKind), h = i ? _.FromArrayToRef(c, i[this.faceId * 3] * 3, s) : s.copyFromFloats(c[this.faceId * 3 * 3], c[this.faceId * 3 * 3 + 1], c[this.faceId * 3 * 3 + 2]), u = i ? _.FromArrayToRef(c, i[this.faceId * 3 + 1] * 3, a) : a.copyFromFloats(c[(this.faceId * 3 + 1) * 3], c[(this.faceId * 3 + 1) * 3 + 1], c[(this.faceId * 3 + 1) * 3 + 2]), f = i ? _.FromArrayToRef(c, i[this.faceId * 3 + 2] * 3, o) : o.copyFromFloats(c[(this.faceId * 3 + 2) * 3], c[(this.faceId * 3 + 2) * 3 + 1], c[(this.faceId * 3 + 2) * 3 + 2]), d = h.subtract(u), p = f.subtract(u);\n r = _.Cross(d, p);\n }\n const l = (c, h) => {\n let u = c.getWorldMatrix();\n c.nonUniformScaling && (z.Matrix[0].copyFrom(u), u = z.Matrix[0], u.setTranslationFromFloats(0, 0, 0), u.invert(), u.transposeToRef(z.Matrix[1]), u = z.Matrix[1]), _.TransformNormalToRef(h, u, h);\n };\n if (e && l(this.pickedMesh, r), this.ray) {\n const c = z.Vector3[0].copyFrom(r);\n e || l(this.pickedMesh, c), _.Dot(c, this.ray.direction) > 0 && r.negateInPlace();\n }\n return r.normalize(), r;\n }\n /**\n * Gets the texture coordinates of where the pick occurred\n * @param uvSet The UV set to use to calculate the texture coordinates (default: VertexBuffer.UVKind)\n * @returns The vector containing the coordinates of the texture\n */\n getTextureCoordinates(e = I.UVKind) {\n if (!this.pickedMesh || !this.pickedMesh.isVerticesDataPresent(e))\n return null;\n const t = this.pickedMesh.getIndices();\n if (!t)\n return null;\n const i = this.pickedMesh.getVerticesData(e);\n if (!i)\n return null;\n let r = me.FromArray(i, t[this.faceId * 3] * 2), s = me.FromArray(i, t[this.faceId * 3 + 1] * 2), a = me.FromArray(i, t[this.faceId * 3 + 2] * 2);\n return r = r.scale(this.bu), s = s.scale(this.bv), a = a.scale(1 - this.bu - this.bv), new me(r.x + s.x + a.x, r.y + s.y + a.y);\n }\n}\nclass Ci {\n /**\n * Creates a new ActionEvent\n * @param source The mesh or sprite that triggered the action\n * @param pointerX The X mouse cursor position at the time of the event\n * @param pointerY The Y mouse cursor position at the time of the event\n * @param meshUnderPointer The mesh that is currently pointed at (can be null)\n * @param sourceEvent the original (browser) event that triggered the ActionEvent\n * @param additionalData additional data for the event\n */\n constructor(e, t, i, r, s, a) {\n this.source = e, this.pointerX = t, this.pointerY = i, this.meshUnderPointer = r, this.sourceEvent = s, this.additionalData = a;\n }\n /**\n * Helper function to auto-create an ActionEvent from a source mesh.\n * @param source The source mesh that triggered the event\n * @param evt The original (browser) event\n * @param additionalData additional data for the event\n * @returns the new ActionEvent\n */\n static CreateNew(e, t, i) {\n const r = e.getScene();\n return new Ci(e, r.pointerX, r.pointerY, r.meshUnderPointer || e, t, i);\n }\n /**\n * Helper function to auto-create an ActionEvent from a source sprite\n * @param source The source sprite that triggered the event\n * @param scene Scene associated with the sprite\n * @param evt The original (browser) event\n * @param additionalData additional data for the event\n * @returns the new ActionEvent\n */\n static CreateNewFromSprite(e, t, i, r) {\n return new Ci(e, t.pointerX, t.pointerY, t.meshUnderPointer, i, r);\n }\n /**\n * Helper function to auto-create an ActionEvent from a scene. If triggered by a mesh use ActionEvent.CreateNew\n * @param scene the scene where the event occurred\n * @param evt The original (browser) event\n * @returns the new ActionEvent\n */\n static CreateNewFromScene(e, t) {\n return new Ci(null, e.pointerX, e.pointerY, e.meshUnderPointer, t);\n }\n /**\n * Helper function to auto-create an ActionEvent from a primitive\n * @param prim defines the target primitive\n * @param pointerPos defines the pointer position\n * @param evt The original (browser) event\n * @param additionalData additional data for the event\n * @returns the new ActionEvent\n */\n static CreateNewFromPrimitive(e, t, i, r) {\n return new Ci(e, t.x, t.y, null, i, r);\n }\n}\nclass mu {\n /**\n * Creates a new instance PostProcess\n * @param scene The scene that the post process is associated with.\n */\n constructor(e) {\n this._vertexBuffers = {}, this._scene = e;\n }\n _prepareBuffers() {\n if (this._vertexBuffers[I.PositionKind])\n return;\n const e = [];\n e.push(1, 1), e.push(-1, 1), e.push(-1, -1), e.push(1, -1), this._vertexBuffers[I.PositionKind] = new I(this._scene.getEngine(), e, I.PositionKind, !1, !1, 2), this._buildIndexBuffer();\n }\n _buildIndexBuffer() {\n const e = [];\n e.push(0), e.push(1), e.push(2), e.push(0), e.push(2), e.push(3), this._indexBuffer = this._scene.getEngine().createIndexBuffer(e);\n }\n /**\n * Rebuilds the vertex buffers of the manager.\n * @internal\n */\n _rebuild() {\n const e = this._vertexBuffers[I.PositionKind];\n e && (e._rebuild(), this._buildIndexBuffer());\n }\n // Methods\n /**\n * Prepares a frame to be run through a post process.\n * @param sourceTexture The input texture to the post processes. (default: null)\n * @param postProcesses An array of post processes to be run. (default: null)\n * @returns True if the post processes were able to be run.\n * @internal\n */\n _prepareFrame(e = null, t = null) {\n const i = this._scene.activeCamera;\n return !i || (t = t || i._postProcesses.filter((r) => r != null), !t || t.length === 0 || !this._scene.postProcessesEnabled) ? !1 : (t[0].activate(i, e, t != null), !0);\n }\n /**\n * Manually render a set of post processes to a texture.\n * Please note, the frame buffer won't be unbound after the call in case you have more render to do.\n * @param postProcesses An array of post processes to be run.\n * @param targetTexture The render target wrapper to render to.\n * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight\n * @param faceIndex defines the face to render to if a cubemap is defined as the target\n * @param lodLevel defines which lod of the texture to render to\n * @param doNotBindFrambuffer If set to true, assumes that the framebuffer has been bound previously\n */\n directRender(e, t = null, i = !1, r = 0, s = 0, a = !1) {\n var l;\n const o = this._scene.getEngine();\n for (let c = 0; c < e.length; c++) {\n c < e.length - 1 ? e[c + 1].activate(this._scene.activeCamera, t == null ? void 0 : t.texture) : (t ? o.bindFramebuffer(t, r, void 0, void 0, i, s) : a || o.restoreDefaultFramebuffer(), (l = o._debugInsertMarker) == null || l.call(o, `post process ${e[c].name} output`));\n const h = e[c], u = h.apply();\n u && (h.onBeforeRenderObservable.notifyObservers(u), this._prepareBuffers(), o.bindBuffers(this._vertexBuffers, this._indexBuffer, u), o.drawElementsType(0, 0, 6), h.onAfterRenderObservable.notifyObservers(u));\n }\n o.setDepthBuffer(!0), o.setDepthWrite(!0);\n }\n /**\n * Finalize the result of the output of the postprocesses.\n * @param doNotPresent If true the result will not be displayed to the screen.\n * @param targetTexture The render target wrapper to render to.\n * @param faceIndex The index of the face to bind the target texture to.\n * @param postProcesses The array of post processes to render.\n * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight (default: false)\n * @internal\n */\n _finalizeFrame(e, t, i, r, s = !1) {\n var l;\n const a = this._scene.activeCamera;\n if (!a || (r = r || a._postProcesses.filter((c) => c != null), r.length === 0 || !this._scene.postProcessesEnabled))\n return;\n const o = this._scene.getEngine();\n for (let c = 0, h = r.length; c < h; c++) {\n const u = r[c];\n if (c < h - 1 ? u._outputTexture = r[c + 1].activate(a, t == null ? void 0 : t.texture) : (t ? (o.bindFramebuffer(t, i, void 0, void 0, s), u._outputTexture = t) : (o.restoreDefaultFramebuffer(), u._outputTexture = null), (l = o._debugInsertMarker) == null || l.call(o, `post process ${r[c].name} output`)), e)\n break;\n const f = u.apply();\n f && (u.onBeforeRenderObservable.notifyObservers(f), this._prepareBuffers(), o.bindBuffers(this._vertexBuffers, this._indexBuffer, f), o.drawElementsType(0, 0, 6), u.onAfterRenderObservable.notifyObservers(f));\n }\n o.setDepthBuffer(!0), o.setDepthWrite(!0), o.setAlphaMode(0);\n }\n /**\n * Disposes of the post process manager.\n */\n dispose() {\n const e = this._vertexBuffers[I.PositionKind];\n e && (e.dispose(), this._vertexBuffers[I.PositionKind] = null), this._indexBuffer && (this._scene.getEngine()._releaseBuffer(this._indexBuffer), this._indexBuffer = null);\n }\n}\nclass Kr {\n /**\n * Set the opaque sort comparison function.\n * If null the sub meshes will be render in the order they were created\n */\n set opaqueSortCompareFn(e) {\n e ? this._opaqueSortCompareFn = e : this._opaqueSortCompareFn = Kr.PainterSortCompare, this._renderOpaque = this._renderOpaqueSorted;\n }\n /**\n * Set the alpha test sort comparison function.\n * If null the sub meshes will be render in the order they were created\n */\n set alphaTestSortCompareFn(e) {\n e ? this._alphaTestSortCompareFn = e : this._alphaTestSortCompareFn = Kr.PainterSortCompare, this._renderAlphaTest = this._renderAlphaTestSorted;\n }\n /**\n * Set the transparent sort comparison function.\n * If null the sub meshes will be render in the order they were created\n */\n set transparentSortCompareFn(e) {\n e ? this._transparentSortCompareFn = e : this._transparentSortCompareFn = Kr.defaultTransparentSortCompare, this._renderTransparent = this._renderTransparentSorted;\n }\n /**\n * Creates a new rendering group.\n * @param index The rendering group index\n * @param scene\n * @param opaqueSortCompareFn The opaque sort comparison function. If null no order is applied\n * @param alphaTestSortCompareFn The alpha test sort comparison function. If null no order is applied\n * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied\n */\n constructor(e, t, i = null, r = null, s = null) {\n this.index = e, this._opaqueSubMeshes = new Li(256), this._transparentSubMeshes = new Li(256), this._alphaTestSubMeshes = new Li(256), this._depthOnlySubMeshes = new Li(256), this._particleSystems = new Li(256), this._spriteManagers = new Li(256), this._empty = !0, this._edgesRenderers = new Cn(16), this._scene = t, this.opaqueSortCompareFn = i, this.alphaTestSortCompareFn = r, this.transparentSortCompareFn = s;\n }\n /**\n * Render all the sub meshes contained in the group.\n * @param customRenderFunction Used to override the default render behaviour of the group.\n * @param renderSprites\n * @param renderParticles\n * @param activeMeshes\n */\n render(e, t, i, r) {\n if (e) {\n e(this._opaqueSubMeshes, this._alphaTestSubMeshes, this._transparentSubMeshes, this._depthOnlySubMeshes);\n return;\n }\n const s = this._scene.getEngine();\n this._depthOnlySubMeshes.length !== 0 && (s.setColorWrite(!1), this._renderAlphaTest(this._depthOnlySubMeshes), s.setColorWrite(!0)), this._opaqueSubMeshes.length !== 0 && this._renderOpaque(this._opaqueSubMeshes), this._alphaTestSubMeshes.length !== 0 && this._renderAlphaTest(this._alphaTestSubMeshes);\n const a = s.getStencilBuffer();\n if (s.setStencilBuffer(!1), t && this._renderSprites(), i && this._renderParticles(r), this.onBeforeTransparentRendering && this.onBeforeTransparentRendering(), this._transparentSubMeshes.length !== 0 || this._scene.useOrderIndependentTransparency) {\n if (s.setStencilBuffer(a), this._scene.useOrderIndependentTransparency) {\n const o = this._scene.depthPeelingRenderer.render(this._transparentSubMeshes);\n o.length && this._renderTransparent(o);\n } else\n this._renderTransparent(this._transparentSubMeshes);\n s.setAlphaMode(0);\n }\n if (s.setStencilBuffer(!1), this._edgesRenderers.length) {\n for (let o = 0; o < this._edgesRenderers.length; o++)\n this._edgesRenderers.data[o].render();\n s.setAlphaMode(0);\n }\n s.setStencilBuffer(a);\n }\n /**\n * Renders the opaque submeshes in the order from the opaqueSortCompareFn.\n * @param subMeshes The submeshes to render\n */\n _renderOpaqueSorted(e) {\n Kr._RenderSorted(e, this._opaqueSortCompareFn, this._scene.activeCamera, !1);\n }\n /**\n * Renders the opaque submeshes in the order from the alphatestSortCompareFn.\n * @param subMeshes The submeshes to render\n */\n _renderAlphaTestSorted(e) {\n Kr._RenderSorted(e, this._alphaTestSortCompareFn, this._scene.activeCamera, !1);\n }\n /**\n * Renders the opaque submeshes in the order from the transparentSortCompareFn.\n * @param subMeshes The submeshes to render\n */\n _renderTransparentSorted(e) {\n Kr._RenderSorted(e, this._transparentSortCompareFn, this._scene.activeCamera, !0);\n }\n /**\n * Renders the submeshes in a specified order.\n * @param subMeshes The submeshes to sort before render\n * @param sortCompareFn The comparison function use to sort\n * @param camera The camera position use to preprocess the submeshes to help sorting\n * @param transparent Specifies to activate blending if true\n */\n static _RenderSorted(e, t, i, r) {\n let s = 0, a;\n const o = i ? i.globalPosition : Kr._ZeroVector;\n if (r)\n for (; s < e.length; s++)\n a = e.data[s], a._alphaIndex = a.getMesh().alphaIndex, a._distanceToCamera = _.Distance(a.getBoundingInfo().boundingSphere.centerWorld, o);\n const l = e.length === e.data.length ? e.data : e.data.slice(0, e.length);\n t && l.sort(t);\n const c = l[0].getMesh().getScene();\n for (s = 0; s < l.length; s++)\n if (a = l[s], !(c._activeMeshesFrozenButKeepClipping && !a.isInFrustum(c._frustumPlanes))) {\n if (r) {\n const h = a.getMaterial();\n if (h && h.needDepthPrePass) {\n const u = h.getScene().getEngine();\n u.setColorWrite(!1), u.setAlphaMode(0), a.render(!1), u.setColorWrite(!0);\n }\n }\n a.render(r);\n }\n }\n /**\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\n * are rendered back to front if in the same alpha index.\n *\n * @param a The first submesh\n * @param b The second submesh\n * @returns The result of the comparison\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static defaultTransparentSortCompare(e, t) {\n return e._alphaIndex > t._alphaIndex ? 1 : e._alphaIndex < t._alphaIndex ? -1 : Kr.backToFrontSortCompare(e, t);\n }\n /**\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\n * are rendered back to front.\n *\n * @param a The first submesh\n * @param b The second submesh\n * @returns The result of the comparison\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static backToFrontSortCompare(e, t) {\n return e._distanceToCamera < t._distanceToCamera ? 1 : e._distanceToCamera > t._distanceToCamera ? -1 : 0;\n }\n /**\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\n * are rendered front to back (prevent overdraw).\n *\n * @param a The first submesh\n * @param b The second submesh\n * @returns The result of the comparison\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static frontToBackSortCompare(e, t) {\n return e._distanceToCamera < t._distanceToCamera ? -1 : e._distanceToCamera > t._distanceToCamera ? 1 : 0;\n }\n /**\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\n * are grouped by material then geometry.\n *\n * @param a The first submesh\n * @param b The second submesh\n * @returns The result of the comparison\n */\n static PainterSortCompare(e, t) {\n const i = e.getMesh(), r = t.getMesh();\n return i.material && r.material ? i.material.uniqueId - r.material.uniqueId : i.uniqueId - r.uniqueId;\n }\n /**\n * Resets the different lists of submeshes to prepare a new frame.\n */\n prepare() {\n this._opaqueSubMeshes.reset(), this._transparentSubMeshes.reset(), this._alphaTestSubMeshes.reset(), this._depthOnlySubMeshes.reset(), this._particleSystems.reset(), this.prepareSprites(), this._edgesRenderers.reset(), this._empty = !0;\n }\n /**\n * Resets the different lists of sprites to prepare a new frame.\n */\n prepareSprites() {\n this._spriteManagers.reset();\n }\n dispose() {\n this._opaqueSubMeshes.dispose(), this._transparentSubMeshes.dispose(), this._alphaTestSubMeshes.dispose(), this._depthOnlySubMeshes.dispose(), this._particleSystems.dispose(), this._spriteManagers.dispose(), this._edgesRenderers.dispose();\n }\n /**\n * Inserts the submesh in its correct queue depending on its material.\n * @param subMesh The submesh to dispatch\n * @param [mesh] Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.\n * @param [material] Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.\n */\n dispatch(e, t, i) {\n t === void 0 && (t = e.getMesh()), i === void 0 && (i = e.getMaterial()), i != null && (i.needAlphaBlendingForMesh(t) ? this._transparentSubMeshes.push(e) : i.needAlphaTesting() ? (i.needDepthPrePass && this._depthOnlySubMeshes.push(e), this._alphaTestSubMeshes.push(e)) : (i.needDepthPrePass && this._depthOnlySubMeshes.push(e), this._opaqueSubMeshes.push(e)), t._renderingGroup = this, t._edgesRenderer && t._edgesRenderer.isEnabled && this._edgesRenderers.pushNoDuplicate(t._edgesRenderer), this._empty = !1);\n }\n dispatchSprites(e) {\n this._spriteManagers.push(e), this._empty = !1;\n }\n dispatchParticles(e) {\n this._particleSystems.push(e), this._empty = !1;\n }\n _renderParticles(e) {\n if (this._particleSystems.length === 0)\n return;\n const t = this._scene.activeCamera;\n this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene);\n for (let i = 0; i < this._particleSystems.length; i++) {\n const r = this._particleSystems.data[i];\n if ((t && t.layerMask & r.layerMask) === 0)\n continue;\n const s = r.emitter;\n (!s.position || !e || e.indexOf(s) !== -1) && this._scene._activeParticles.addCount(r.render(), !1);\n }\n this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene);\n }\n _renderSprites() {\n if (!this._scene.spritesEnabled || this._spriteManagers.length === 0)\n return;\n const e = this._scene.activeCamera;\n this._scene.onBeforeSpritesRenderingObservable.notifyObservers(this._scene);\n for (let t = 0; t < this._spriteManagers.length; t++) {\n const i = this._spriteManagers.data[t];\n (e && e.layerMask & i.layerMask) !== 0 && i.render();\n }\n this._scene.onAfterSpritesRenderingObservable.notifyObservers(this._scene);\n }\n}\nKr._ZeroVector = _.Zero();\nclass Oy {\n}\nclass Di {\n /**\n * Gets or sets a boolean indicating that the manager will not reset between frames.\n * This means that if a mesh becomes invisible or transparent it will not be visible until this boolean is set to false again.\n * By default, the rendering manager will dispatch all active meshes per frame (moving them to the transparent, opaque or alpha testing lists).\n * By turning this property on, you will accelerate the rendering by keeping all these lists unchanged between frames.\n */\n get maintainStateBetweenFrames() {\n return this._maintainStateBetweenFrames;\n }\n set maintainStateBetweenFrames(e) {\n e !== this._maintainStateBetweenFrames && (this._maintainStateBetweenFrames = e, this._maintainStateBetweenFrames || this.restoreDispachedFlags());\n }\n /**\n * Restore wasDispatched flags on the lists of elements to render.\n */\n restoreDispachedFlags() {\n for (const e of this._scene.meshes)\n if (e.subMeshes)\n for (const t of e.subMeshes)\n t._wasDispatched = !1;\n if (this._scene.spriteManagers)\n for (const e of this._scene.spriteManagers)\n e._wasDispatched = !1;\n for (const e of this._scene.particleSystems)\n e._wasDispatched = !1;\n }\n /**\n * Instantiates a new rendering group for a particular scene\n * @param scene Defines the scene the groups belongs to\n */\n constructor(e) {\n this._useSceneAutoClearSetup = !1, this._renderingGroups = new Array(), this._autoClearDepthStencil = {}, this._customOpaqueSortCompareFn = {}, this._customAlphaTestSortCompareFn = {}, this._customTransparentSortCompareFn = {}, this._renderingGroupInfo = new Oy(), this._maintainStateBetweenFrames = !1, this._scene = e;\n for (let t = Di.MIN_RENDERINGGROUPS; t < Di.MAX_RENDERINGGROUPS; t++)\n this._autoClearDepthStencil[t] = { autoClear: !0, depth: !0, stencil: !0 };\n }\n /**\n * @returns the rendering group with the specified id.\n * @param id the id of the rendering group (0 by default)\n */\n getRenderingGroup(e) {\n const t = e || 0;\n return this._prepareRenderingGroup(t), this._renderingGroups[t];\n }\n _clearDepthStencilBuffer(e = !0, t = !0) {\n this._depthStencilBufferAlreadyCleaned || (this._scene.getEngine().clear(null, !1, e, t), this._depthStencilBufferAlreadyCleaned = !0);\n }\n /**\n * Renders the entire managed groups. This is used by the scene or the different render targets.\n * @internal\n */\n render(e, t, i, r) {\n const s = this._renderingGroupInfo;\n if (s.scene = this._scene, s.camera = this._scene.activeCamera, this._scene.spriteManagers && r)\n for (let a = 0; a < this._scene.spriteManagers.length; a++) {\n const o = this._scene.spriteManagers[a];\n this.dispatchSprites(o);\n }\n for (let a = Di.MIN_RENDERINGGROUPS; a < Di.MAX_RENDERINGGROUPS; a++) {\n this._depthStencilBufferAlreadyCleaned = a === Di.MIN_RENDERINGGROUPS;\n const o = this._renderingGroups[a];\n if (!o || o._empty)\n continue;\n const l = 1 << a;\n if (s.renderingGroupId = a, this._scene.onBeforeRenderingGroupObservable.notifyObservers(s, l), Di.AUTOCLEAR) {\n const c = this._useSceneAutoClearSetup ? this._scene.getAutoClearDepthStencilSetup(a) : this._autoClearDepthStencil[a];\n c && c.autoClear && this._clearDepthStencilBuffer(c.depth, c.stencil);\n }\n for (const c of this._scene._beforeRenderingGroupDrawStage)\n c.action(a);\n o.render(e, r, i, t);\n for (const c of this._scene._afterRenderingGroupDrawStage)\n c.action(a);\n this._scene.onAfterRenderingGroupObservable.notifyObservers(s, l);\n }\n }\n /**\n * Resets the different information of the group to prepare a new frame\n * @internal\n */\n reset() {\n if (!this.maintainStateBetweenFrames)\n for (let e = Di.MIN_RENDERINGGROUPS; e < Di.MAX_RENDERINGGROUPS; e++) {\n const t = this._renderingGroups[e];\n t && t.prepare();\n }\n }\n /**\n * Resets the sprites information of the group to prepare a new frame\n * @internal\n */\n resetSprites() {\n if (!this.maintainStateBetweenFrames)\n for (let e = Di.MIN_RENDERINGGROUPS; e < Di.MAX_RENDERINGGROUPS; e++) {\n const t = this._renderingGroups[e];\n t && t.prepareSprites();\n }\n }\n /**\n * Dispose and release the group and its associated resources.\n * @internal\n */\n dispose() {\n this.freeRenderingGroups(), this._renderingGroups.length = 0, this._renderingGroupInfo = null;\n }\n /**\n * Clear the info related to rendering groups preventing retention points during dispose.\n */\n freeRenderingGroups() {\n for (let e = Di.MIN_RENDERINGGROUPS; e < Di.MAX_RENDERINGGROUPS; e++) {\n const t = this._renderingGroups[e];\n t && t.dispose();\n }\n }\n _prepareRenderingGroup(e) {\n this._renderingGroups[e] === void 0 && (this._renderingGroups[e] = new Kr(e, this._scene, this._customOpaqueSortCompareFn[e], this._customAlphaTestSortCompareFn[e], this._customTransparentSortCompareFn[e]));\n }\n /**\n * Add a sprite manager to the rendering manager in order to render it this frame.\n * @param spriteManager Define the sprite manager to render\n */\n dispatchSprites(e) {\n this.maintainStateBetweenFrames && e._wasDispatched || (e._wasDispatched = !0, this.getRenderingGroup(e.renderingGroupId).dispatchSprites(e));\n }\n /**\n * Add a particle system to the rendering manager in order to render it this frame.\n * @param particleSystem Define the particle system to render\n */\n dispatchParticles(e) {\n this.maintainStateBetweenFrames && e._wasDispatched || (e._wasDispatched = !0, this.getRenderingGroup(e.renderingGroupId).dispatchParticles(e));\n }\n /**\n * Add a submesh to the manager in order to render it this frame\n * @param subMesh The submesh to dispatch\n * @param mesh Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.\n * @param material Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.\n */\n dispatch(e, t, i) {\n t === void 0 && (t = e.getMesh()), !(this.maintainStateBetweenFrames && e._wasDispatched) && (e._wasDispatched = !0, this.getRenderingGroup(t.renderingGroupId).dispatch(e, t, i));\n }\n /**\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\n * This allowed control for front to back rendering or reversely depending of the special needs.\n *\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\n */\n setRenderingOrder(e, t = null, i = null, r = null) {\n if (this._customOpaqueSortCompareFn[e] = t, this._customAlphaTestSortCompareFn[e] = i, this._customTransparentSortCompareFn[e] = r, this._renderingGroups[e]) {\n const s = this._renderingGroups[e];\n s.opaqueSortCompareFn = this._customOpaqueSortCompareFn[e], s.alphaTestSortCompareFn = this._customAlphaTestSortCompareFn[e], s.transparentSortCompareFn = this._customTransparentSortCompareFn[e];\n }\n }\n /**\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\n *\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\n * @param depth Automatically clears depth between groups if true and autoClear is true.\n * @param stencil Automatically clears stencil between groups if true and autoClear is true.\n */\n setRenderingAutoClearDepthStencil(e, t, i = !0, r = !0) {\n this._autoClearDepthStencil[e] = {\n autoClear: t,\n depth: i,\n stencil: r\n };\n }\n /**\n * Gets the current auto clear configuration for one rendering group of the rendering\n * manager.\n * @param index the rendering group index to get the information for\n * @returns The auto clear setup for the requested rendering group\n */\n getAutoClearDepthStencilSetup(e) {\n return this._autoClearDepthStencil[e];\n }\n}\nDi.MAX_RENDERINGGROUPS = 4;\nDi.MIN_RENDERINGGROUPS = 0;\nDi.AUTOCLEAR = !0;\nclass ke {\n}\nke.NAME_EFFECTLAYER = \"EffectLayer\";\nke.NAME_LAYER = \"Layer\";\nke.NAME_LENSFLARESYSTEM = \"LensFlareSystem\";\nke.NAME_BOUNDINGBOXRENDERER = \"BoundingBoxRenderer\";\nke.NAME_PARTICLESYSTEM = \"ParticleSystem\";\nke.NAME_GAMEPAD = \"Gamepad\";\nke.NAME_SIMPLIFICATIONQUEUE = \"SimplificationQueue\";\nke.NAME_GEOMETRYBUFFERRENDERER = \"GeometryBufferRenderer\";\nke.NAME_PREPASSRENDERER = \"PrePassRenderer\";\nke.NAME_DEPTHRENDERER = \"DepthRenderer\";\nke.NAME_DEPTHPEELINGRENDERER = \"DepthPeelingRenderer\";\nke.NAME_POSTPROCESSRENDERPIPELINEMANAGER = \"PostProcessRenderPipelineManager\";\nke.NAME_SPRITE = \"Sprite\";\nke.NAME_SUBSURFACE = \"SubSurface\";\nke.NAME_OUTLINERENDERER = \"Outline\";\nke.NAME_PROCEDURALTEXTURE = \"ProceduralTexture\";\nke.NAME_SHADOWGENERATOR = \"ShadowGenerator\";\nke.NAME_OCTREE = \"Octree\";\nke.NAME_PHYSICSENGINE = \"PhysicsEngine\";\nke.NAME_AUDIO = \"Audio\";\nke.NAME_FLUIDRENDERER = \"FluidRenderer\";\nke.STEP_ISREADYFORMESH_EFFECTLAYER = 0;\nke.STEP_BEFOREEVALUATEACTIVEMESH_BOUNDINGBOXRENDERER = 0;\nke.STEP_EVALUATESUBMESH_BOUNDINGBOXRENDERER = 0;\nke.STEP_PREACTIVEMESH_BOUNDINGBOXRENDERER = 0;\nke.STEP_CAMERADRAWRENDERTARGET_EFFECTLAYER = 1;\nke.STEP_BEFORECAMERADRAW_PREPASS = 0;\nke.STEP_BEFORECAMERADRAW_EFFECTLAYER = 1;\nke.STEP_BEFORECAMERADRAW_LAYER = 2;\nke.STEP_BEFORERENDERTARGETDRAW_PREPASS = 0;\nke.STEP_BEFORERENDERTARGETDRAW_LAYER = 1;\nke.STEP_BEFORERENDERINGMESH_PREPASS = 0;\nke.STEP_BEFORERENDERINGMESH_OUTLINE = 1;\nke.STEP_AFTERRENDERINGMESH_PREPASS = 0;\nke.STEP_AFTERRENDERINGMESH_OUTLINE = 1;\nke.STEP_AFTERRENDERINGGROUPDRAW_EFFECTLAYER_DRAW = 0;\nke.STEP_AFTERRENDERINGGROUPDRAW_BOUNDINGBOXRENDERER = 1;\nke.STEP_BEFORECAMERAUPDATE_SIMPLIFICATIONQUEUE = 0;\nke.STEP_BEFORECAMERAUPDATE_GAMEPAD = 1;\nke.STEP_BEFORECLEAR_PROCEDURALTEXTURE = 0;\nke.STEP_BEFORECLEAR_PREPASS = 1;\nke.STEP_BEFORERENDERTARGETCLEAR_PREPASS = 0;\nke.STEP_AFTERRENDERTARGETDRAW_PREPASS = 0;\nke.STEP_AFTERRENDERTARGETDRAW_LAYER = 1;\nke.STEP_AFTERCAMERADRAW_PREPASS = 0;\nke.STEP_AFTERCAMERADRAW_EFFECTLAYER = 1;\nke.STEP_AFTERCAMERADRAW_LENSFLARESYSTEM = 2;\nke.STEP_AFTERCAMERADRAW_EFFECTLAYER_DRAW = 3;\nke.STEP_AFTERCAMERADRAW_LAYER = 4;\nke.STEP_AFTERCAMERADRAW_FLUIDRENDERER = 5;\nke.STEP_AFTERCAMERAPOSTPROCESS_LAYER = 0;\nke.STEP_AFTERRENDERTARGETPOSTPROCESS_LAYER = 0;\nke.STEP_AFTERRENDER_AUDIO = 0;\nke.STEP_GATHERRENDERTARGETS_DEPTHRENDERER = 0;\nke.STEP_GATHERRENDERTARGETS_GEOMETRYBUFFERRENDERER = 1;\nke.STEP_GATHERRENDERTARGETS_SHADOWGENERATOR = 2;\nke.STEP_GATHERRENDERTARGETS_POSTPROCESSRENDERPIPELINEMANAGER = 3;\nke.STEP_GATHERACTIVECAMERARENDERTARGETS_DEPTHRENDERER = 0;\nke.STEP_GATHERACTIVECAMERARENDERTARGETS_FLUIDRENDERER = 1;\nke.STEP_POINTERMOVE_SPRITE = 0;\nke.STEP_POINTERDOWN_SPRITE = 0;\nke.STEP_POINTERUP_SPRITE = 0;\nclass ei extends Array {\n /**\n * Hide ctor from the rest of the world.\n * @param items The items to add.\n */\n constructor(e) {\n super(...e);\n }\n /**\n * Creates a new Stage.\n * @returns A new instance of a Stage\n */\n static Create() {\n return Object.create(ei.prototype);\n }\n /**\n * Registers a step in an ordered way in the targeted stage.\n * @param index Defines the position to register the step in\n * @param component Defines the component attached to the step\n * @param action Defines the action to launch during the step\n */\n registerStep(e, t, i) {\n let r = 0, s = Number.MAX_VALUE;\n for (; r < this.length && (s = this[r].index, !(e < s)); r++)\n ;\n this.splice(r, 0, { index: e, component: t, action: i.bind(t) });\n }\n /**\n * Clears all the steps from the stage.\n */\n clear() {\n this.length = 0;\n }\n}\nclass pt {\n}\npt.POINTERDOWN = 1;\npt.POINTERUP = 2;\npt.POINTERMOVE = 4;\npt.POINTERWHEEL = 8;\npt.POINTERPICK = 16;\npt.POINTERTAP = 32;\npt.POINTERDOUBLETAP = 64;\nclass Y_ {\n /**\n * Instantiates the base class of pointers info.\n * @param type Defines the type of event (PointerEventTypes)\n * @param event Defines the related dom event\n */\n constructor(e, t) {\n this.type = e, this.event = t;\n }\n}\nclass Dy extends Y_ {\n /**\n * Instantiates a PointerInfoPre to store pointer related info to the onPrePointerObservable event.\n * @param type Defines the type of event (PointerEventTypes)\n * @param event Defines the related dom event\n * @param localX Defines the local x coordinates of the pointer when the event occured\n * @param localY Defines the local y coordinates of the pointer when the event occured\n */\n constructor(e, t, i, r) {\n super(e, t), this.ray = null, this.originalPickingInfo = null, this.skipOnPointerObservable = !1, this.localPosition = new me(i, r);\n }\n}\nclass Is extends Y_ {\n /**\n * Defines the picking info associated with this PointerInfo object (if applicable)\n */\n get pickInfo() {\n return this._pickInfo || this._generatePickInfo(), this._pickInfo;\n }\n /**\n * Instantiates a PointerInfo to store pointer related info to the onPointerObservable event.\n * @param type Defines the type of event (PointerEventTypes)\n * @param event Defines the related dom event\n * @param pickInfo Defines the picking info associated to the info (if any)\n * @param inputManager Defines the InputManager to use if there is no pickInfo\n */\n constructor(e, t, i, r = null) {\n super(e, t), this._pickInfo = i, this._inputManager = r;\n }\n /**\n * Generates the picking info if needed\n */\n /** @internal */\n _generatePickInfo() {\n this._inputManager && (this._pickInfo = this._inputManager._pickMove(this.event), this._inputManager._setRayOnPointerInfo(this._pickInfo, this.event), this._inputManager = null);\n }\n}\nclass xr {\n constructor() {\n this.hoverCursor = \"\", this.actions = [], this.isRecursive = !1;\n }\n /**\n * Does exist one action manager with at least one trigger\n **/\n static get HasTriggers() {\n for (const e in xr.Triggers)\n if (Object.prototype.hasOwnProperty.call(xr.Triggers, e))\n return !0;\n return !1;\n }\n /**\n * Does exist one action manager with at least one pick trigger\n **/\n static get HasPickTriggers() {\n for (const e in xr.Triggers)\n if (Object.prototype.hasOwnProperty.call(xr.Triggers, e)) {\n const t = parseInt(e);\n if (t >= 1 && t <= 7)\n return !0;\n }\n return !1;\n }\n /**\n * Does exist one action manager that handles actions of a given trigger\n * @param trigger defines the trigger to be tested\n * @returns a boolean indicating whether the trigger is handled by at least one action manager\n **/\n static HasSpecificTrigger(e) {\n for (const t in xr.Triggers)\n if (Object.prototype.hasOwnProperty.call(xr.Triggers, t) && parseInt(t) === e)\n return !0;\n return !1;\n }\n}\nxr.Triggers = {};\nclass tc {\n}\ntc.KEYDOWN = 1;\ntc.KEYUP = 2;\nclass _u {\n /**\n * Instantiates a new keyboard info.\n * This class is used to store keyboard related info for the onKeyboardObservable event.\n * @param type Defines the type of event (KeyboardEventTypes)\n * @param event Defines the related dom event\n */\n constructor(e, t) {\n this.type = e, this.event = t;\n }\n}\nclass $p extends _u {\n /**\n * Defines whether the engine should skip the next onKeyboardObservable associated to this pre.\n * @deprecated use skipOnKeyboardObservable property instead\n */\n get skipOnPointerObservable() {\n return this.skipOnKeyboardObservable;\n }\n set skipOnPointerObservable(e) {\n this.skipOnKeyboardObservable = e;\n }\n /**\n * Instantiates a new keyboard pre info.\n * This class is used to store keyboard related info for the onPreKeyboardObservable event.\n * @param type Defines the type of event (KeyboardEventTypes)\n * @param event Defines the related dom event\n */\n constructor(e, t) {\n super(e, t), this.type = e, this.event = t, this.skipOnKeyboardObservable = !1;\n }\n}\nvar Pe;\n(function(n) {\n n[n.Generic = 0] = \"Generic\", n[n.Keyboard = 1] = \"Keyboard\", n[n.Mouse = 2] = \"Mouse\", n[n.Touch = 3] = \"Touch\", n[n.DualShock = 4] = \"DualShock\", n[n.Xbox = 5] = \"Xbox\", n[n.Switch = 6] = \"Switch\", n[n.DualSense = 7] = \"DualSense\";\n})(Pe || (Pe = {}));\nvar Be;\n(function(n) {\n n[n.Horizontal = 0] = \"Horizontal\", n[n.Vertical = 1] = \"Vertical\", n[n.LeftClick = 2] = \"LeftClick\", n[n.MiddleClick = 3] = \"MiddleClick\", n[n.RightClick = 4] = \"RightClick\", n[n.BrowserBack = 5] = \"BrowserBack\", n[n.BrowserForward = 6] = \"BrowserForward\", n[n.MouseWheelX = 7] = \"MouseWheelX\", n[n.MouseWheelY = 8] = \"MouseWheelY\", n[n.MouseWheelZ = 9] = \"MouseWheelZ\", n[n.Move = 12] = \"Move\";\n})(Be || (Be = {}));\nvar ic;\n(function(n) {\n n[n.Horizontal = 0] = \"Horizontal\", n[n.Vertical = 1] = \"Vertical\", n[n.LeftClick = 2] = \"LeftClick\", n[n.MiddleClick = 3] = \"MiddleClick\", n[n.RightClick = 4] = \"RightClick\", n[n.BrowserBack = 5] = \"BrowserBack\", n[n.BrowserForward = 6] = \"BrowserForward\", n[n.MouseWheelX = 7] = \"MouseWheelX\", n[n.MouseWheelY = 8] = \"MouseWheelY\", n[n.MouseWheelZ = 9] = \"MouseWheelZ\", n[n.DeltaHorizontal = 10] = \"DeltaHorizontal\", n[n.DeltaVertical = 11] = \"DeltaVertical\";\n})(ic || (ic = {}));\nvar eg;\n(function(n) {\n n[n.Cross = 0] = \"Cross\", n[n.Circle = 1] = \"Circle\", n[n.Square = 2] = \"Square\", n[n.Triangle = 3] = \"Triangle\", n[n.L1 = 4] = \"L1\", n[n.R1 = 5] = \"R1\", n[n.L2 = 6] = \"L2\", n[n.R2 = 7] = \"R2\", n[n.Share = 8] = \"Share\", n[n.Options = 9] = \"Options\", n[n.L3 = 10] = \"L3\", n[n.R3 = 11] = \"R3\", n[n.DPadUp = 12] = \"DPadUp\", n[n.DPadDown = 13] = \"DPadDown\", n[n.DPadLeft = 14] = \"DPadLeft\", n[n.DPadRight = 15] = \"DPadRight\", n[n.Home = 16] = \"Home\", n[n.TouchPad = 17] = \"TouchPad\", n[n.LStickXAxis = 18] = \"LStickXAxis\", n[n.LStickYAxis = 19] = \"LStickYAxis\", n[n.RStickXAxis = 20] = \"RStickXAxis\", n[n.RStickYAxis = 21] = \"RStickYAxis\";\n})(eg || (eg = {}));\nvar tg;\n(function(n) {\n n[n.Cross = 0] = \"Cross\", n[n.Circle = 1] = \"Circle\", n[n.Square = 2] = \"Square\", n[n.Triangle = 3] = \"Triangle\", n[n.L1 = 4] = \"L1\", n[n.R1 = 5] = \"R1\", n[n.L2 = 6] = \"L2\", n[n.R2 = 7] = \"R2\", n[n.Create = 8] = \"Create\", n[n.Options = 9] = \"Options\", n[n.L3 = 10] = \"L3\", n[n.R3 = 11] = \"R3\", n[n.DPadUp = 12] = \"DPadUp\", n[n.DPadDown = 13] = \"DPadDown\", n[n.DPadLeft = 14] = \"DPadLeft\", n[n.DPadRight = 15] = \"DPadRight\", n[n.Home = 16] = \"Home\", n[n.TouchPad = 17] = \"TouchPad\", n[n.LStickXAxis = 18] = \"LStickXAxis\", n[n.LStickYAxis = 19] = \"LStickYAxis\", n[n.RStickXAxis = 20] = \"RStickXAxis\", n[n.RStickYAxis = 21] = \"RStickYAxis\";\n})(tg || (tg = {}));\nvar ig;\n(function(n) {\n n[n.A = 0] = \"A\", n[n.B = 1] = \"B\", n[n.X = 2] = \"X\", n[n.Y = 3] = \"Y\", n[n.LB = 4] = \"LB\", n[n.RB = 5] = \"RB\", n[n.LT = 6] = \"LT\", n[n.RT = 7] = \"RT\", n[n.Back = 8] = \"Back\", n[n.Start = 9] = \"Start\", n[n.LS = 10] = \"LS\", n[n.RS = 11] = \"RS\", n[n.DPadUp = 12] = \"DPadUp\", n[n.DPadDown = 13] = \"DPadDown\", n[n.DPadLeft = 14] = \"DPadLeft\", n[n.DPadRight = 15] = \"DPadRight\", n[n.Home = 16] = \"Home\", n[n.LStickXAxis = 17] = \"LStickXAxis\", n[n.LStickYAxis = 18] = \"LStickYAxis\", n[n.RStickXAxis = 19] = \"RStickXAxis\", n[n.RStickYAxis = 20] = \"RStickYAxis\";\n})(ig || (ig = {}));\nvar rg;\n(function(n) {\n n[n.B = 0] = \"B\", n[n.A = 1] = \"A\", n[n.Y = 2] = \"Y\", n[n.X = 3] = \"X\", n[n.L = 4] = \"L\", n[n.R = 5] = \"R\", n[n.ZL = 6] = \"ZL\", n[n.ZR = 7] = \"ZR\", n[n.Minus = 8] = \"Minus\", n[n.Plus = 9] = \"Plus\", n[n.LS = 10] = \"LS\", n[n.RS = 11] = \"RS\", n[n.DPadUp = 12] = \"DPadUp\", n[n.DPadDown = 13] = \"DPadDown\", n[n.DPadLeft = 14] = \"DPadLeft\", n[n.DPadRight = 15] = \"DPadRight\", n[n.Home = 16] = \"Home\", n[n.Capture = 17] = \"Capture\", n[n.LStickXAxis = 18] = \"LStickXAxis\", n[n.LStickYAxis = 19] = \"LStickYAxis\", n[n.RStickXAxis = 20] = \"RStickXAxis\", n[n.RStickYAxis = 21] = \"RStickYAxis\";\n})(rg || (rg = {}));\nvar sg;\n(function(n) {\n n[n.PointerMove = 0] = \"PointerMove\", n[n.PointerDown = 1] = \"PointerDown\", n[n.PointerUp = 2] = \"PointerUp\";\n})(sg || (sg = {}));\nclass Oc {\n}\nOc.DOM_DELTA_PIXEL = 0;\nOc.DOM_DELTA_LINE = 1;\nOc.DOM_DELTA_PAGE = 2;\nclass Rn {\n /**\n * Create device input events based on provided type and slot\n *\n * @param deviceType Type of device\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n * @param currentState Current value for given input\n * @param deviceInputSystem Reference to DeviceInputSystem\n * @param elementToAttachTo HTMLElement to reference as target for inputs\n * @param pointerId PointerId to use for pointer events\n * @returns IUIEvent object\n */\n static CreateDeviceEvent(e, t, i, r, s, a, o) {\n switch (e) {\n case Pe.Keyboard:\n return this._CreateKeyboardEvent(i, r, s, a);\n case Pe.Mouse:\n if (i === Be.MouseWheelX || i === Be.MouseWheelY || i === Be.MouseWheelZ)\n return this._CreateWheelEvent(e, t, i, r, s, a);\n case Pe.Touch:\n return this._CreatePointerEvent(e, t, i, r, s, a, o);\n default:\n throw `Unable to generate event for device ${Pe[e]}`;\n }\n }\n /**\n * Creates pointer event\n *\n * @param deviceType Type of device\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n * @param currentState Current value for given input\n * @param deviceInputSystem Reference to DeviceInputSystem\n * @param elementToAttachTo HTMLElement to reference as target for inputs\n * @param pointerId PointerId to use for pointer events\n * @returns IUIEvent object (Pointer)\n */\n static _CreatePointerEvent(e, t, i, r, s, a, o) {\n const l = this._CreateMouseEvent(e, t, i, r, s, a);\n e === Pe.Mouse ? (l.deviceType = Pe.Mouse, l.pointerId = 1, l.pointerType = \"mouse\") : (l.deviceType = Pe.Touch, l.pointerId = o ?? t, l.pointerType = \"touch\");\n let c = 0;\n return c += s.pollInput(e, t, Be.LeftClick), c += s.pollInput(e, t, Be.RightClick) * 2, c += s.pollInput(e, t, Be.MiddleClick) * 4, l.buttons = c, i === Be.Move ? l.type = \"pointermove\" : i >= Be.LeftClick && i <= Be.RightClick && (l.type = r === 1 ? \"pointerdown\" : \"pointerup\", l.button = i - 2), l;\n }\n /**\n * Create Mouse Wheel Event\n * @param deviceType Type of device\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n * @param currentState Current value for given input\n * @param deviceInputSystem Reference to DeviceInputSystem\n * @param elementToAttachTo HTMLElement to reference as target for inputs\n * @returns IUIEvent object (Wheel)\n */\n static _CreateWheelEvent(e, t, i, r, s, a) {\n const o = this._CreateMouseEvent(e, t, i, r, s, a);\n switch (o.pointerId = 1, o.type = \"wheel\", o.deltaMode = Oc.DOM_DELTA_PIXEL, o.deltaX = 0, o.deltaY = 0, o.deltaZ = 0, i) {\n case Be.MouseWheelX:\n o.deltaX = r;\n break;\n case Be.MouseWheelY:\n o.deltaY = r;\n break;\n case Be.MouseWheelZ:\n o.deltaZ = r;\n break;\n }\n return o;\n }\n /**\n * Create Mouse Event\n * @param deviceType Type of device\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n * @param currentState Current value for given input\n * @param deviceInputSystem Reference to DeviceInputSystem\n * @param elementToAttachTo HTMLElement to reference as target for inputs\n * @returns IUIEvent object (Mouse)\n */\n static _CreateMouseEvent(e, t, i, r, s, a) {\n const o = this._CreateEvent(a), l = s.pollInput(e, t, Be.Horizontal), c = s.pollInput(e, t, Be.Vertical);\n return a ? (o.movementX = 0, o.movementY = 0, o.offsetX = o.movementX - a.getBoundingClientRect().x, o.offsetY = o.movementY - a.getBoundingClientRect().y) : (o.movementX = s.pollInput(e, t, ic.DeltaHorizontal), o.movementY = s.pollInput(e, t, ic.DeltaVertical), o.offsetX = 0, o.offsetY = 0), this._CheckNonCharacterKeys(o, s), o.clientX = l, o.clientY = c, o.x = l, o.y = c, o.deviceType = e, o.deviceSlot = t, o.inputIndex = i, o;\n }\n /**\n * Create Keyboard Event\n * @param inputIndex Id of input to be checked\n * @param currentState Current value for given input\n * @param deviceInputSystem Reference to DeviceInputSystem\n * @param elementToAttachTo HTMLElement to reference as target for inputs\n * @returns IEvent object (Keyboard)\n */\n static _CreateKeyboardEvent(e, t, i, r) {\n const s = this._CreateEvent(r);\n return this._CheckNonCharacterKeys(s, i), s.deviceType = Pe.Keyboard, s.deviceSlot = 0, s.inputIndex = e, s.type = t === 1 ? \"keydown\" : \"keyup\", s.key = String.fromCharCode(e), s.keyCode = e, s;\n }\n /**\n * Add parameters for non-character keys (Ctrl, Alt, Meta, Shift)\n * @param evt Event object to add parameters to\n * @param deviceInputSystem DeviceInputSystem to pull values from\n */\n static _CheckNonCharacterKeys(e, t) {\n const i = t.isDeviceAvailable(Pe.Keyboard), r = i && t.pollInput(Pe.Keyboard, 0, 18) === 1, s = i && t.pollInput(Pe.Keyboard, 0, 17) === 1, a = i && (t.pollInput(Pe.Keyboard, 0, 91) === 1 || t.pollInput(Pe.Keyboard, 0, 92) === 1 || t.pollInput(Pe.Keyboard, 0, 93) === 1), o = i && t.pollInput(Pe.Keyboard, 0, 16) === 1;\n e.altKey = r, e.ctrlKey = s, e.metaKey = a, e.shiftKey = o;\n }\n /**\n * Create base event object\n * @param elementToAttachTo Value to use as event target\n * @returns\n */\n static _CreateEvent(e) {\n const t = {};\n return t.preventDefault = () => {\n }, t.target = e, t;\n }\n}\nclass Ny {\n constructor(e, t, i) {\n this._nativeInput = _native.DeviceInputSystem ? new _native.DeviceInputSystem(e, t, (r, s, a, o) => {\n const l = Rn.CreateDeviceEvent(r, s, a, o, this);\n i(r, s, l);\n }) : this._createDummyNativeInput();\n }\n // Public functions\n /**\n * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized.\n * @param deviceType Enum specifying device type\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n * @returns Current value of input\n */\n pollInput(e, t, i) {\n return this._nativeInput.pollInput(e, t, i);\n }\n /**\n * Check for a specific device in the DeviceInputSystem\n * @param deviceType Type of device to check for\n * @returns bool with status of device's existence\n */\n isDeviceAvailable(e) {\n return e === Pe.Mouse || e === Pe.Touch;\n }\n /**\n * Dispose of all the observables\n */\n dispose() {\n this._nativeInput.dispose();\n }\n /**\n * For versions of BabylonNative that don't have the NativeInput plugin initialized, create a dummy version\n * @returns Object with dummy functions\n */\n _createDummyNativeInput() {\n return {\n pollInput: () => 0,\n isDeviceAvailable: () => !1,\n dispose: () => {\n }\n };\n }\n}\nconst ng = 255, ag = Object.keys(Be).length / 2;\nclass Fy {\n /**\n * Constructor for the WebDeviceInputSystem\n * @param engine Engine to reference\n * @param onDeviceConnected Callback to execute when device is connected\n * @param onDeviceDisconnected Callback to execute when device is disconnected\n * @param onInputChanged Callback to execute when input changes on device\n */\n constructor(e, t, i, r) {\n this._inputs = [], this._keyboardActive = !1, this._pointerActive = !1, this._usingSafari = ge.IsSafari(), this._usingMacOS = to() && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform), this._keyboardDownEvent = (s) => {\n }, this._keyboardUpEvent = (s) => {\n }, this._keyboardBlurEvent = (s) => {\n }, this._pointerMoveEvent = (s) => {\n }, this._pointerDownEvent = (s) => {\n }, this._pointerUpEvent = (s) => {\n }, this._pointerCancelEvent = (s) => {\n }, this._pointerWheelEvent = (s) => {\n }, this._pointerBlurEvent = (s) => {\n }, this._pointerMacOSChromeOutEvent = (s) => {\n }, this._eventsAttached = !1, this._mouseId = -1, this._isUsingFirefox = to() && navigator.userAgent && navigator.userAgent.indexOf(\"Firefox\") !== -1, this._isUsingChromium = to() && navigator.userAgent && navigator.userAgent.indexOf(\"Chrome\") !== -1, this._maxTouchPoints = 0, this._pointerInputClearObserver = null, this._gamepadConnectedEvent = (s) => {\n }, this._gamepadDisconnectedEvent = (s) => {\n }, this._eventPrefix = ge.GetPointerPrefix(e), this._engine = e, this._onDeviceConnected = t, this._onDeviceDisconnected = i, this._onInputChanged = r, this._mouseId = this._isUsingFirefox ? 0 : 1, this._enableEvents(), this._usingMacOS && (this._metaKeys = []), this._engine._onEngineViewChanged || (this._engine._onEngineViewChanged = () => {\n this._enableEvents();\n });\n }\n // Public functions\n /**\n * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized.\n * @param deviceType Enum specifying device type\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n * @returns Current value of input\n */\n pollInput(e, t, i) {\n const r = this._inputs[e][t];\n if (!r)\n throw `Unable to find device ${Pe[e]}`;\n e >= Pe.DualShock && e <= Pe.DualSense && this._updateDevice(e, t, i);\n const s = r[i];\n if (s === void 0)\n throw `Unable to find input ${i} for device ${Pe[e]} in slot ${t}`;\n return i === Be.Move && ge.Warn(\"Unable to provide information for PointerInput.Move. Try using PointerInput.Horizontal or PointerInput.Vertical for move data.\"), s;\n }\n /**\n * Check for a specific device in the DeviceInputSystem\n * @param deviceType Type of device to check for\n * @returns bool with status of device's existence\n */\n isDeviceAvailable(e) {\n return this._inputs[e] !== void 0;\n }\n /**\n * Dispose of all the eventlisteners\n */\n dispose() {\n this._onDeviceConnected = () => {\n }, this._onDeviceDisconnected = () => {\n }, this._onInputChanged = () => {\n }, delete this._engine._onEngineViewChanged, this._elementToAttachTo && this._disableEvents();\n }\n /**\n * Enable listening for user input events\n */\n _enableEvents() {\n const e = this == null ? void 0 : this._engine.getInputElement();\n if (e && (!this._eventsAttached || this._elementToAttachTo !== e)) {\n if (this._disableEvents(), this._inputs) {\n for (const t of this._inputs)\n if (t)\n for (const i in t) {\n const r = +i, s = t[r];\n if (s)\n for (let a = 0; a < s.length; a++)\n s[a] = 0;\n }\n }\n this._elementToAttachTo = e, this._elementToAttachTo.tabIndex = this._elementToAttachTo.tabIndex !== -1 ? this._elementToAttachTo.tabIndex : this._engine.canvasTabIndex, this._handleKeyActions(), this._handlePointerActions(), this._handleGamepadActions(), this._eventsAttached = !0, this._checkForConnectedDevices();\n }\n }\n /**\n * Disable listening for user input events\n */\n _disableEvents() {\n this._elementToAttachTo && (this._elementToAttachTo.removeEventListener(\"blur\", this._keyboardBlurEvent), this._elementToAttachTo.removeEventListener(\"blur\", this._pointerBlurEvent), this._elementToAttachTo.removeEventListener(\"keydown\", this._keyboardDownEvent), this._elementToAttachTo.removeEventListener(\"keyup\", this._keyboardUpEvent), this._elementToAttachTo.removeEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent), this._elementToAttachTo.removeEventListener(this._eventPrefix + \"down\", this._pointerDownEvent), this._elementToAttachTo.removeEventListener(this._eventPrefix + \"up\", this._pointerUpEvent), this._elementToAttachTo.removeEventListener(this._eventPrefix + \"cancel\", this._pointerCancelEvent), this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent), this._usingMacOS && this._isUsingChromium && this._elementToAttachTo.removeEventListener(\"lostpointercapture\", this._pointerMacOSChromeOutEvent), window.removeEventListener(\"gamepadconnected\", this._gamepadConnectedEvent), window.removeEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent)), this._pointerInputClearObserver && this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver), this._eventsAttached = !1;\n }\n /**\n * Checks for existing connections to devices and register them, if necessary\n * Currently handles gamepads and mouse\n */\n _checkForConnectedDevices() {\n if (navigator.getGamepads) {\n const e = navigator.getGamepads();\n for (const t of e)\n t && this._addGamePad(t);\n }\n typeof matchMedia == \"function\" && matchMedia(\"(pointer:fine)\").matches && this._addPointerDevice(Pe.Mouse, 0, 0, 0);\n }\n // Private functions\n /**\n * Add a gamepad to the DeviceInputSystem\n * @param gamepad A single DOM Gamepad object\n */\n _addGamePad(e) {\n const t = this._getGamepadDeviceType(e.id), i = e.index;\n this._gamepads = this._gamepads || new Array(e.index + 1), this._registerDevice(t, i, e.buttons.length + e.axes.length), this._gamepads[i] = t;\n }\n /**\n * Add pointer device to DeviceInputSystem\n * @param deviceType Type of Pointer to add\n * @param deviceSlot Pointer ID (0 for mouse, pointerId for Touch)\n * @param currentX Current X at point of adding\n * @param currentY Current Y at point of adding\n */\n _addPointerDevice(e, t, i, r) {\n this._pointerActive || (this._pointerActive = !0), this._registerDevice(e, t, ag);\n const s = this._inputs[e][t];\n s[0] = i, s[1] = r;\n }\n /**\n * Add device and inputs to device array\n * @param deviceType Enum specifying device type\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param numberOfInputs Number of input entries to create for given device\n */\n _registerDevice(e, t, i) {\n if (t === void 0)\n throw `Unable to register device ${Pe[e]} to undefined slot.`;\n if (this._inputs[e] || (this._inputs[e] = {}), !this._inputs[e][t]) {\n const r = new Array(i);\n r.fill(0), this._inputs[e][t] = r, this._onDeviceConnected(e, t);\n }\n }\n /**\n * Given a specific device name, remove that device from the device map\n * @param deviceType Enum specifying device type\n * @param deviceSlot \"Slot\" or index that device is referenced in\n */\n _unregisterDevice(e, t) {\n this._inputs[e][t] && (delete this._inputs[e][t], this._onDeviceDisconnected(e, t));\n }\n /**\n * Handle all actions that come from keyboard interaction\n */\n _handleKeyActions() {\n this._keyboardDownEvent = (e) => {\n this._keyboardActive || (this._keyboardActive = !0, this._registerDevice(Pe.Keyboard, 0, ng));\n const t = this._inputs[Pe.Keyboard][0];\n if (t) {\n t[e.keyCode] = 1;\n const i = e;\n i.inputIndex = e.keyCode, this._usingMacOS && e.metaKey && e.key !== \"Meta\" && (this._metaKeys.includes(e.keyCode) || this._metaKeys.push(e.keyCode)), this._onInputChanged(Pe.Keyboard, 0, i);\n }\n }, this._keyboardUpEvent = (e) => {\n this._keyboardActive || (this._keyboardActive = !0, this._registerDevice(Pe.Keyboard, 0, ng));\n const t = this._inputs[Pe.Keyboard][0];\n if (t) {\n t[e.keyCode] = 0;\n const i = e;\n if (i.inputIndex = e.keyCode, this._usingMacOS && e.key === \"Meta\" && this._metaKeys.length > 0) {\n for (const r of this._metaKeys) {\n const s = Rn.CreateDeviceEvent(Pe.Keyboard, 0, r, 0, this, this._elementToAttachTo);\n t[r] = 0, this._onInputChanged(Pe.Keyboard, 0, s);\n }\n this._metaKeys.splice(0, this._metaKeys.length);\n }\n this._onInputChanged(Pe.Keyboard, 0, i);\n }\n }, this._keyboardBlurEvent = () => {\n if (this._keyboardActive) {\n const e = this._inputs[Pe.Keyboard][0];\n for (let t = 0; t < e.length; t++)\n if (e[t] !== 0) {\n e[t] = 0;\n const i = Rn.CreateDeviceEvent(Pe.Keyboard, 0, t, 0, this, this._elementToAttachTo);\n this._onInputChanged(Pe.Keyboard, 0, i);\n }\n this._usingMacOS && this._metaKeys.splice(0, this._metaKeys.length);\n }\n }, this._elementToAttachTo.addEventListener(\"keydown\", this._keyboardDownEvent), this._elementToAttachTo.addEventListener(\"keyup\", this._keyboardUpEvent), this._elementToAttachTo.addEventListener(\"blur\", this._keyboardBlurEvent);\n }\n /**\n * Handle all actions that come from pointer interaction\n */\n _handlePointerActions() {\n this._maxTouchPoints = to() && navigator.maxTouchPoints || 2, this._activeTouchIds || (this._activeTouchIds = new Array(this._maxTouchPoints));\n for (let i = 0; i < this._maxTouchPoints; i++)\n this._activeTouchIds[i] = -1;\n this._pointerMoveEvent = (i) => {\n const r = this._getPointerType(i);\n let s = r === Pe.Mouse ? 0 : this._activeTouchIds.indexOf(i.pointerId);\n if (r === Pe.Touch && s === -1) {\n const o = this._activeTouchIds.indexOf(-1);\n if (o >= 0)\n s = o, this._activeTouchIds[o] = i.pointerId, this._onDeviceConnected(r, s);\n else {\n ge.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\n return;\n }\n }\n this._inputs[r] || (this._inputs[r] = {}), this._inputs[r][s] || this._addPointerDevice(r, s, i.clientX, i.clientY);\n const a = this._inputs[r][s];\n if (a) {\n const o = i;\n o.inputIndex = Be.Move, a[Be.Horizontal] = i.clientX, a[Be.Vertical] = i.clientY, r === Pe.Touch && a[Be.LeftClick] === 0 && (a[Be.LeftClick] = 1), i.pointerId === void 0 && (i.pointerId = this._mouseId), this._onInputChanged(r, s, o), !this._usingSafari && i.button !== -1 && (o.inputIndex = i.button + 2, a[i.button + 2] = a[i.button + 2] ? 0 : 1, this._onInputChanged(r, s, o));\n }\n }, this._pointerDownEvent = (i) => {\n const r = this._getPointerType(i);\n let s = r === Pe.Mouse ? 0 : i.pointerId;\n if (r === Pe.Touch) {\n const o = this._activeTouchIds.indexOf(-1);\n if (o >= 0)\n s = o, this._activeTouchIds[o] = i.pointerId;\n else {\n ge.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\n return;\n }\n }\n this._inputs[r] || (this._inputs[r] = {}), this._inputs[r][s] ? r === Pe.Touch && this._onDeviceConnected(r, s) : this._addPointerDevice(r, s, i.clientX, i.clientY);\n const a = this._inputs[r][s];\n if (a) {\n const o = a[Be.Horizontal], l = a[Be.Vertical];\n if (r === Pe.Mouse) {\n if (i.pointerId === void 0 && (i.pointerId = this._mouseId), !document.pointerLockElement)\n try {\n this._elementToAttachTo.setPointerCapture(this._mouseId);\n } catch {\n }\n } else if (i.pointerId && !document.pointerLockElement)\n try {\n this._elementToAttachTo.setPointerCapture(i.pointerId);\n } catch {\n }\n a[Be.Horizontal] = i.clientX, a[Be.Vertical] = i.clientY, a[i.button + 2] = 1;\n const c = i;\n c.inputIndex = i.button + 2, this._onInputChanged(r, s, c), (o !== i.clientX || l !== i.clientY) && (c.inputIndex = Be.Move, this._onInputChanged(r, s, c));\n }\n }, this._pointerUpEvent = (i) => {\n var o, l, c, h, u;\n const r = this._getPointerType(i), s = r === Pe.Mouse ? 0 : this._activeTouchIds.indexOf(i.pointerId);\n if (r === Pe.Touch) {\n if (s === -1)\n return;\n this._activeTouchIds[s] = -1;\n }\n const a = (o = this._inputs[r]) == null ? void 0 : o[s];\n if (a && a[i.button + 2] !== 0) {\n const f = a[Be.Horizontal], d = a[Be.Vertical];\n a[Be.Horizontal] = i.clientX, a[Be.Vertical] = i.clientY, a[i.button + 2] = 0;\n const p = i;\n i.pointerId === void 0 && (i.pointerId = this._mouseId), (f !== i.clientX || d !== i.clientY) && (p.inputIndex = Be.Move, this._onInputChanged(r, s, p)), p.inputIndex = i.button + 2, r === Pe.Mouse && this._mouseId >= 0 && ((c = (l = this._elementToAttachTo).hasPointerCapture) != null && c.call(l, this._mouseId)) ? this._elementToAttachTo.releasePointerCapture(this._mouseId) : i.pointerId && ((u = (h = this._elementToAttachTo).hasPointerCapture) != null && u.call(h, i.pointerId)) && this._elementToAttachTo.releasePointerCapture(i.pointerId), this._onInputChanged(r, s, p), r === Pe.Touch && this._onDeviceDisconnected(r, s);\n }\n }, this._pointerCancelEvent = (i) => {\n var r, s, a, o;\n if (i.pointerType === \"mouse\") {\n const l = this._inputs[Pe.Mouse][0];\n this._mouseId >= 0 && ((s = (r = this._elementToAttachTo).hasPointerCapture) != null && s.call(r, this._mouseId)) && this._elementToAttachTo.releasePointerCapture(this._mouseId);\n for (let c = Be.LeftClick; c <= Be.BrowserForward; c++)\n if (l[c] === 1) {\n l[c] = 0;\n const h = Rn.CreateDeviceEvent(Pe.Mouse, 0, c, 0, this, this._elementToAttachTo);\n this._onInputChanged(Pe.Mouse, 0, h);\n }\n } else {\n const l = this._activeTouchIds.indexOf(i.pointerId);\n if (l === -1)\n return;\n (o = (a = this._elementToAttachTo).hasPointerCapture) != null && o.call(a, i.pointerId) && this._elementToAttachTo.releasePointerCapture(i.pointerId), this._inputs[Pe.Touch][l][Be.LeftClick] = 0;\n const c = Rn.CreateDeviceEvent(Pe.Touch, l, Be.LeftClick, 0, this, this._elementToAttachTo, i.pointerId);\n this._onInputChanged(Pe.Touch, l, c), this._activeTouchIds[l] = -1, this._onDeviceDisconnected(Pe.Touch, l);\n }\n }, this._wheelEventName = \"onwheel\" in document.createElement(\"div\") ? \"wheel\" : document.onmousewheel !== void 0 ? \"mousewheel\" : \"DOMMouseScroll\";\n let e = !1;\n const t = function() {\n };\n try {\n const i = Object.defineProperty({}, \"passive\", {\n get: function() {\n e = !0;\n }\n });\n this._elementToAttachTo.addEventListener(\"test\", t, i), this._elementToAttachTo.removeEventListener(\"test\", t, i);\n } catch {\n }\n this._pointerBlurEvent = () => {\n var i, r, s, a, o;\n if (this.isDeviceAvailable(Pe.Mouse)) {\n const l = this._inputs[Pe.Mouse][0];\n this._mouseId >= 0 && ((r = (i = this._elementToAttachTo).hasPointerCapture) != null && r.call(i, this._mouseId)) && this._elementToAttachTo.releasePointerCapture(this._mouseId);\n for (let c = Be.LeftClick; c <= Be.BrowserForward; c++)\n if (l[c] === 1) {\n l[c] = 0;\n const h = Rn.CreateDeviceEvent(Pe.Mouse, 0, c, 0, this, this._elementToAttachTo);\n this._onInputChanged(Pe.Mouse, 0, h);\n }\n }\n if (this.isDeviceAvailable(Pe.Touch)) {\n const l = this._inputs[Pe.Touch];\n for (let c = 0; c < this._activeTouchIds.length; c++) {\n const h = this._activeTouchIds[c];\n if ((a = (s = this._elementToAttachTo).hasPointerCapture) != null && a.call(s, h) && this._elementToAttachTo.releasePointerCapture(h), h !== -1 && ((o = l[c]) == null ? void 0 : o[Be.LeftClick]) === 1) {\n l[c][Be.LeftClick] = 0;\n const u = Rn.CreateDeviceEvent(Pe.Touch, c, Be.LeftClick, 0, this, this._elementToAttachTo, h);\n this._onInputChanged(Pe.Touch, c, u), this._activeTouchIds[c] = -1, this._onDeviceDisconnected(Pe.Touch, c);\n }\n }\n }\n }, this._pointerWheelEvent = (i) => {\n const r = Pe.Mouse, s = 0;\n this._inputs[r] || (this._inputs[r] = []), this._inputs[r][s] || (this._pointerActive = !0, this._registerDevice(r, s, ag));\n const a = this._inputs[r][s];\n if (a) {\n a[Be.MouseWheelX] = i.deltaX || 0, a[Be.MouseWheelY] = i.deltaY || i.wheelDelta || 0, a[Be.MouseWheelZ] = i.deltaZ || 0;\n const o = i;\n i.pointerId === void 0 && (i.pointerId = this._mouseId), a[Be.MouseWheelX] !== 0 && (o.inputIndex = Be.MouseWheelX, this._onInputChanged(r, s, o)), a[Be.MouseWheelY] !== 0 && (o.inputIndex = Be.MouseWheelY, this._onInputChanged(r, s, o)), a[Be.MouseWheelZ] !== 0 && (o.inputIndex = Be.MouseWheelZ, this._onInputChanged(r, s, o));\n }\n }, this._usingMacOS && this._isUsingChromium && (this._pointerMacOSChromeOutEvent = (i) => {\n i.buttons > 1 && this._pointerCancelEvent(i);\n }, this._elementToAttachTo.addEventListener(\"lostpointercapture\", this._pointerMacOSChromeOutEvent)), this._elementToAttachTo.addEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent), this._elementToAttachTo.addEventListener(this._eventPrefix + \"down\", this._pointerDownEvent), this._elementToAttachTo.addEventListener(this._eventPrefix + \"up\", this._pointerUpEvent), this._elementToAttachTo.addEventListener(this._eventPrefix + \"cancel\", this._pointerCancelEvent), this._elementToAttachTo.addEventListener(\"blur\", this._pointerBlurEvent), this._elementToAttachTo.addEventListener(this._wheelEventName, this._pointerWheelEvent, e ? { passive: !1 } : !1), this._pointerInputClearObserver = this._engine.onEndFrameObservable.add(() => {\n if (this.isDeviceAvailable(Pe.Mouse)) {\n const i = this._inputs[Pe.Mouse][0];\n i[Be.MouseWheelX] = 0, i[Be.MouseWheelY] = 0, i[Be.MouseWheelZ] = 0;\n }\n });\n }\n /**\n * Handle all actions that come from gamepad interaction\n */\n _handleGamepadActions() {\n this._gamepadConnectedEvent = (e) => {\n this._addGamePad(e.gamepad);\n }, this._gamepadDisconnectedEvent = (e) => {\n if (this._gamepads) {\n const t = this._getGamepadDeviceType(e.gamepad.id), i = e.gamepad.index;\n this._unregisterDevice(t, i), delete this._gamepads[i];\n }\n }, window.addEventListener(\"gamepadconnected\", this._gamepadConnectedEvent), window.addEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\n }\n /**\n * Update all non-event based devices with each frame\n * @param deviceType Enum specifying device type\n * @param deviceSlot \"Slot\" or index that device is referenced in\n * @param inputIndex Id of input to be checked\n */\n _updateDevice(e, t, i) {\n const r = navigator.getGamepads()[t];\n if (r && e === this._gamepads[t]) {\n const s = this._inputs[e][t];\n i >= r.buttons.length ? s[i] = r.axes[i - r.buttons.length].valueOf() : s[i] = r.buttons[i].value;\n }\n }\n /**\n * Gets DeviceType from the device name\n * @param deviceName Name of Device from DeviceInputSystem\n * @returns DeviceType enum value\n */\n _getGamepadDeviceType(e) {\n return e.indexOf(\"054c\") !== -1 ? e.indexOf(\"0ce6\") !== -1 ? Pe.DualSense : Pe.DualShock : e.indexOf(\"Xbox One\") !== -1 || e.search(\"Xbox 360\") !== -1 || e.search(\"xinput\") !== -1 ? Pe.Xbox : e.indexOf(\"057e\") !== -1 ? Pe.Switch : Pe.Generic;\n }\n /**\n * Get DeviceType from a given pointer/mouse/touch event.\n * @param evt PointerEvent to evaluate\n * @returns DeviceType interpreted from event\n */\n _getPointerType(e) {\n let t = Pe.Mouse;\n return (e.pointerType === \"touch\" || e.pointerType === \"pen\" || e.touches) && (t = Pe.Touch), t;\n }\n}\nclass og {\n /**\n * Default Constructor\n * @param deviceInputSystem - Reference to DeviceInputSystem\n * @param deviceType - Type of device\n * @param deviceSlot - \"Slot\" or index that device is referenced in\n */\n constructor(e, t, i = 0) {\n this.deviceType = t, this.deviceSlot = i, this.onInputChangedObservable = new he(), this._deviceInputSystem = e;\n }\n /**\n * Get input for specific input\n * @param inputIndex - index of specific input on device\n * @returns Input value from DeviceInputSystem\n */\n getInput(e) {\n return this._deviceInputSystem.pollInput(this.deviceType, this.deviceSlot, e);\n }\n}\nclass Ly {\n constructor(e) {\n this._registeredManagers = new Array(), this._refCount = 0, this.registerManager = (a) => {\n for (let o = 0; o < this._devices.length; o++) {\n const l = this._devices[o];\n for (const c in l) {\n const h = +c;\n a._addDevice(new og(this._deviceInputSystem, o, h));\n }\n }\n this._registeredManagers.push(a);\n }, this.unregisterManager = (a) => {\n const o = this._registeredManagers.indexOf(a);\n o > -1 && this._registeredManagers.splice(o, 1);\n };\n const t = Object.keys(Pe).length / 2;\n this._devices = new Array(t);\n const i = (a, o) => {\n this._devices[a] || (this._devices[a] = new Array()), this._devices[a][o] || (this._devices[a][o] = o);\n for (const l of this._registeredManagers) {\n const c = new og(this._deviceInputSystem, a, o);\n l._addDevice(c);\n }\n }, r = (a, o) => {\n var l;\n (l = this._devices[a]) != null && l[o] && delete this._devices[a][o];\n for (const c of this._registeredManagers)\n c._removeDevice(a, o);\n }, s = (a, o, l) => {\n if (l)\n for (const c of this._registeredManagers)\n c._onInputChanged(a, o, l);\n };\n typeof _native < \"u\" ? this._deviceInputSystem = new Ny(i, r, s) : this._deviceInputSystem = new Fy(e, i, r, s);\n }\n dispose() {\n this._deviceInputSystem.dispose();\n }\n}\nclass wy {\n // Public Functions\n /**\n * Gets a DeviceSource, given a type and slot\n * @param deviceType - Type of Device\n * @param deviceSlot - Slot or ID of device\n * @returns DeviceSource\n */\n getDeviceSource(e, t) {\n if (t === void 0) {\n if (this._firstDevice[e] === void 0)\n return null;\n t = this._firstDevice[e];\n }\n return !this._devices[e] || this._devices[e][t] === void 0 ? null : this._devices[e][t];\n }\n /**\n * Gets an array of DeviceSource objects for a given device type\n * @param deviceType - Type of Device\n * @returns All available DeviceSources of a given type\n */\n getDeviceSources(e) {\n return this._devices[e] ? this._devices[e].filter((t) => !!t) : [];\n }\n /**\n * Default constructor\n * @param engine - Used to get canvas (if applicable)\n */\n constructor(e) {\n const t = Object.keys(Pe).length / 2;\n this._devices = new Array(t), this._firstDevice = new Array(t), this._engine = e, this._engine._deviceSourceManager || (this._engine._deviceSourceManager = new Ly(e)), this._engine._deviceSourceManager._refCount++, this.onDeviceConnectedObservable = new he((i) => {\n for (const r of this._devices)\n if (r)\n for (const s of r)\n s && this.onDeviceConnectedObservable.notifyObserver(i, s);\n }), this.onDeviceDisconnectedObservable = new he(), this._engine._deviceSourceManager.registerManager(this), this._onDisposeObserver = e.onDisposeObservable.add(() => {\n this.dispose();\n });\n }\n /**\n * Dispose of DeviceSourceManager\n */\n dispose() {\n this.onDeviceConnectedObservable.clear(), this.onDeviceDisconnectedObservable.clear(), this._engine._deviceSourceManager && (this._engine._deviceSourceManager.unregisterManager(this), --this._engine._deviceSourceManager._refCount < 1 && (this._engine._deviceSourceManager.dispose(), delete this._engine._deviceSourceManager)), this._engine.onDisposeObservable.remove(this._onDisposeObserver);\n }\n // Hidden Functions\n /**\n * @param deviceSource - Source to add\n * @internal\n */\n _addDevice(e) {\n this._devices[e.deviceType] || (this._devices[e.deviceType] = new Array()), this._devices[e.deviceType][e.deviceSlot] || (this._devices[e.deviceType][e.deviceSlot] = e, this._updateFirstDevices(e.deviceType)), this.onDeviceConnectedObservable.notifyObservers(e);\n }\n /**\n * @param deviceType - DeviceType\n * @param deviceSlot - DeviceSlot\n * @internal\n */\n _removeDevice(e, t) {\n var r, s;\n const i = (r = this._devices[e]) == null ? void 0 : r[t];\n this.onDeviceDisconnectedObservable.notifyObservers(i), (s = this._devices[e]) != null && s[t] && delete this._devices[e][t], this._updateFirstDevices(e);\n }\n /**\n * @param deviceType - DeviceType\n * @param deviceSlot - DeviceSlot\n * @param eventData - Event\n * @internal\n */\n _onInputChanged(e, t, i) {\n var r, s;\n (s = (r = this._devices[e]) == null ? void 0 : r[t]) == null || s.onInputChangedObservable.notifyObservers(i);\n }\n // Private Functions\n _updateFirstDevices(e) {\n switch (e) {\n case Pe.Keyboard:\n case Pe.Mouse:\n this._firstDevice[e] = 0;\n break;\n case Pe.Touch:\n case Pe.DualSense:\n case Pe.DualShock:\n case Pe.Xbox:\n case Pe.Switch:\n case Pe.Generic: {\n delete this._firstDevice[e];\n const t = this._devices[e];\n if (t) {\n for (let i = 0; i < t.length; i++)\n if (t[i]) {\n this._firstDevice[e] = i;\n break;\n }\n }\n break;\n }\n }\n }\n}\nclass lg {\n constructor() {\n this._singleClick = !1, this._doubleClick = !1, this._hasSwiped = !1, this._ignore = !1;\n }\n get singleClick() {\n return this._singleClick;\n }\n get doubleClick() {\n return this._doubleClick;\n }\n get hasSwiped() {\n return this._hasSwiped;\n }\n get ignore() {\n return this._ignore;\n }\n set singleClick(e) {\n this._singleClick = e;\n }\n set doubleClick(e) {\n this._doubleClick = e;\n }\n set hasSwiped(e) {\n this._hasSwiped = e;\n }\n set ignore(e) {\n this._ignore = e;\n }\n}\nclass ti {\n /**\n * Creates a new InputManager\n * @param scene - defines the hosting scene\n */\n constructor(e) {\n this._alreadyAttached = !1, this._meshPickProceed = !1, this._currentPickResult = null, this._previousPickResult = null, this._totalPointersPressed = 0, this._doubleClickOccured = !1, this._isSwiping = !1, this._swipeButtonPressed = -1, this._skipPointerTap = !1, this._isMultiTouchGesture = !1, this._pointerX = 0, this._pointerY = 0, this._startingPointerPosition = new me(0, 0), this._previousStartingPointerPosition = new me(0, 0), this._startingPointerTime = 0, this._previousStartingPointerTime = 0, this._pointerCaptures = {}, this._meshUnderPointerId = {}, this._movePointerInfo = null, this._cameraObserverCount = 0, this._delayedClicks = [null, null, null, null, null], this._deviceSourceManager = null, this._scene = e || st.LastCreatedScene, this._scene;\n }\n /**\n * Gets the mesh that is currently under the pointer\n * @returns Mesh that the pointer is pointer is hovering over\n */\n get meshUnderPointer() {\n return this._movePointerInfo && (this._movePointerInfo._generatePickInfo(), this._movePointerInfo = null), this._pointerOverMesh;\n }\n /**\n * When using more than one pointer (for example in XR) you can get the mesh under the specific pointer\n * @param pointerId - the pointer id to use\n * @returns The mesh under this pointer id or null if not found\n */\n getMeshUnderPointerByPointerId(e) {\n return this._meshUnderPointerId[e] || null;\n }\n /**\n * Gets the pointer coordinates in 2D without any translation (ie. straight out of the pointer event)\n * @returns Vector with X/Y values directly from pointer event\n */\n get unTranslatedPointer() {\n return new me(this._unTranslatedPointerX, this._unTranslatedPointerY);\n }\n /**\n * Gets or sets the current on-screen X position of the pointer\n * @returns Translated X with respect to screen\n */\n get pointerX() {\n return this._pointerX;\n }\n set pointerX(e) {\n this._pointerX = e;\n }\n /**\n * Gets or sets the current on-screen Y position of the pointer\n * @returns Translated Y with respect to screen\n */\n get pointerY() {\n return this._pointerY;\n }\n set pointerY(e) {\n this._pointerY = e;\n }\n _updatePointerPosition(e) {\n const t = this._scene.getEngine().getInputElementClientRect();\n t && (this._pointerX = e.clientX - t.left, this._pointerY = e.clientY - t.top, this._unTranslatedPointerX = this._pointerX, this._unTranslatedPointerY = this._pointerY);\n }\n _processPointerMove(e, t) {\n const i = this._scene, r = i.getEngine(), s = r.getInputElement();\n s && (s.tabIndex = r.canvasTabIndex, i.doNotHandleCursors || (s.style.cursor = i.defaultCursor)), this._setCursorAndPointerOverMesh(e, t, i);\n for (const l of i._pointerMoveStage) {\n e = e || this._pickMove(t);\n const c = !!(e != null && e.pickedMesh);\n e = l.action(this._unTranslatedPointerX, this._unTranslatedPointerY, e, c, s);\n }\n const a = t.inputIndex >= Be.MouseWheelX && t.inputIndex <= Be.MouseWheelZ ? pt.POINTERWHEEL : pt.POINTERMOVE;\n i.onPointerMove && (e = e || this._pickMove(t), i.onPointerMove(t, e, a));\n let o;\n e ? (o = new Is(a, t, e), this._setRayOnPointerInfo(e, t)) : (o = new Is(a, t, null, this), this._movePointerInfo = o), i.onPointerObservable.hasObservers() && i.onPointerObservable.notifyObservers(o, a);\n }\n // Pointers handling\n /** @internal */\n _setRayOnPointerInfo(e, t) {\n const i = this._scene;\n e && i._pickingAvailable && (e.ray || (e.ray = i.createPickingRay(t.offsetX, t.offsetY, L.Identity(), i.activeCamera)));\n }\n /** @internal */\n _addCameraPointerObserver(e, t) {\n return this._cameraObserverCount++, this._scene.onPointerObservable.add(e, t);\n }\n /** @internal */\n _removeCameraPointerObserver(e) {\n return this._cameraObserverCount--, this._scene.onPointerObservable.remove(e);\n }\n _checkForPicking() {\n return !!(this._scene.onPointerObservable.observers.length > this._cameraObserverCount || this._scene.onPointerPick);\n }\n _checkPrePointerObservable(e, t, i) {\n const r = this._scene, s = new Dy(i, t, this._unTranslatedPointerX, this._unTranslatedPointerY);\n return e && (s.originalPickingInfo = e, s.ray = e.ray, t.pointerType === \"xr-near\" && e.originMesh && (s.nearInteractionPickingInfo = e)), r.onPrePointerObservable.notifyObservers(s, i), !!s.skipOnPointerObservable;\n }\n /** @internal */\n _pickMove(e) {\n const t = this._scene, i = t.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, t.pointerMovePredicate, t.pointerMoveFastCheck, t.cameraToUseForPointers, t.pointerMoveTrianglePredicate);\n return this._setCursorAndPointerOverMesh(i, e, t), i;\n }\n _setCursorAndPointerOverMesh(e, t, i) {\n const s = i.getEngine().getInputElement();\n if (e != null && e.pickedMesh) {\n if (this.setPointerOverMesh(e.pickedMesh, t.pointerId, e, t), !i.doNotHandleCursors && s && this._pointerOverMesh) {\n const a = this._pointerOverMesh._getActionManagerForTrigger();\n a && a.hasPointerTriggers && (s.style.cursor = a.hoverCursor || i.hoverCursor);\n }\n } else\n this.setPointerOverMesh(null, t.pointerId, e, t);\n }\n /**\n * Use this method to simulate a pointer move on a mesh\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\n * @param pickResult - pickingInfo of the object wished to simulate pointer event on\n * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\n */\n simulatePointerMove(e, t) {\n const i = new PointerEvent(\"pointermove\", t);\n i.inputIndex = Be.Move, !this._checkPrePointerObservable(e, i, pt.POINTERMOVE) && this._processPointerMove(e, i);\n }\n /**\n * Use this method to simulate a pointer down on a mesh\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\n * @param pickResult - pickingInfo of the object wished to simulate pointer event on\n * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\n */\n simulatePointerDown(e, t) {\n const i = new PointerEvent(\"pointerdown\", t);\n i.inputIndex = i.button + 2, !this._checkPrePointerObservable(e, i, pt.POINTERDOWN) && this._processPointerDown(e, i);\n }\n _processPointerDown(e, t) {\n const i = this._scene;\n if (e != null && e.pickedMesh) {\n this._pickedDownMesh = e.pickedMesh;\n const a = e.pickedMesh._getActionManagerForTrigger();\n if (a) {\n if (a.hasPickTriggers)\n switch (a.processTrigger(5, Ci.CreateNew(e.pickedMesh, t, e)), t.button) {\n case 0:\n a.processTrigger(2, Ci.CreateNew(e.pickedMesh, t, e));\n break;\n case 1:\n a.processTrigger(4, Ci.CreateNew(e.pickedMesh, t, e));\n break;\n case 2:\n a.processTrigger(3, Ci.CreateNew(e.pickedMesh, t, e));\n break;\n }\n a.hasSpecificTrigger(8) && window.setTimeout(() => {\n const o = i.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, (l) => l.isPickable && l.isVisible && l.isReady() && l.actionManager && l.actionManager.hasSpecificTrigger(8) && l === this._pickedDownMesh, !1, i.cameraToUseForPointers);\n o != null && o.pickedMesh && a && this._totalPointersPressed !== 0 && Date.now() - this._startingPointerTime > ti.LongPressDelay && !this._isPointerSwiping() && (this._startingPointerTime = 0, a.processTrigger(8, Ci.CreateNew(o.pickedMesh, t)));\n }, ti.LongPressDelay);\n }\n } else\n for (const a of i._pointerDownStage)\n e = a.action(this._unTranslatedPointerX, this._unTranslatedPointerY, e, t, !1);\n let r;\n const s = pt.POINTERDOWN;\n e ? (i.onPointerDown && i.onPointerDown(t, e, s), r = new Is(s, t, e), this._setRayOnPointerInfo(e, t)) : r = new Is(s, t, null, this), i.onPointerObservable.hasObservers() && i.onPointerObservable.notifyObservers(r, s);\n }\n /**\n * @internal\n * @internals Boolean if delta for pointer exceeds drag movement threshold\n */\n _isPointerSwiping() {\n return this._isSwiping;\n }\n /**\n * Use this method to simulate a pointer up on a mesh\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\n * @param pickResult - pickingInfo of the object wished to simulate pointer event on\n * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\n * @param doubleTap - indicates that the pointer up event should be considered as part of a double click (false by default)\n */\n simulatePointerUp(e, t, i) {\n const r = new PointerEvent(\"pointerup\", t);\n r.inputIndex = Be.Move;\n const s = new lg();\n i ? s.doubleClick = !0 : s.singleClick = !0, !this._checkPrePointerObservable(e, r, pt.POINTERUP) && this._processPointerUp(e, r, s);\n }\n _processPointerUp(e, t, i) {\n const r = this._scene;\n if (e != null && e.pickedMesh) {\n if (this._pickedUpMesh = e.pickedMesh, this._pickedDownMesh === this._pickedUpMesh && (r.onPointerPick && r.onPointerPick(t, e), i.singleClick && !i.ignore && r.onPointerObservable.observers.length > this._cameraObserverCount)) {\n const a = pt.POINTERPICK, o = new Is(a, t, e);\n this._setRayOnPointerInfo(e, t), r.onPointerObservable.notifyObservers(o, a);\n }\n const s = e.pickedMesh._getActionManagerForTrigger();\n if (s && !i.ignore) {\n s.processTrigger(7, Ci.CreateNew(e.pickedMesh, t, e)), !i.hasSwiped && i.singleClick && s.processTrigger(1, Ci.CreateNew(e.pickedMesh, t, e));\n const a = e.pickedMesh._getActionManagerForTrigger(6);\n i.doubleClick && a && a.processTrigger(6, Ci.CreateNew(e.pickedMesh, t, e));\n }\n } else if (!i.ignore)\n for (const s of r._pointerUpStage)\n e = s.action(this._unTranslatedPointerX, this._unTranslatedPointerY, e, t, i.doubleClick);\n if (this._pickedDownMesh && this._pickedDownMesh !== this._pickedUpMesh) {\n const s = this._pickedDownMesh._getActionManagerForTrigger(16);\n s && s.processTrigger(16, Ci.CreateNew(this._pickedDownMesh, t));\n }\n if (!i.ignore) {\n const s = new Is(pt.POINTERUP, t, e);\n if (this._setRayOnPointerInfo(e, t), r.onPointerObservable.notifyObservers(s, pt.POINTERUP), r.onPointerUp && r.onPointerUp(t, e, pt.POINTERUP), !i.hasSwiped && !this._skipPointerTap && !this._isMultiTouchGesture) {\n let a = 0;\n if (i.singleClick ? a = pt.POINTERTAP : i.doubleClick && (a = pt.POINTERDOUBLETAP), a) {\n const o = new Is(a, t, e);\n r.onPointerObservable.hasObservers() && r.onPointerObservable.hasSpecificMask(a) && r.onPointerObservable.notifyObservers(o, a);\n }\n }\n }\n }\n /**\n * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down)\n * @param pointerId - defines the pointer id to use in a multi-touch scenario (0 by default)\n * @returns true if the pointer was captured\n */\n isPointerCaptured(e = 0) {\n return this._pointerCaptures[e];\n }\n /**\n * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp\n * @param attachUp - defines if you want to attach events to pointerup\n * @param attachDown - defines if you want to attach events to pointerdown\n * @param attachMove - defines if you want to attach events to pointermove\n * @param elementToAttachTo - defines the target DOM element to attach to (will use the canvas by default)\n */\n attachControl(e = !0, t = !0, i = !0, r = null) {\n const s = this._scene, a = s.getEngine();\n r || (r = a.getInputElement()), this._alreadyAttached && this.detachControl(), r && (this._alreadyAttachedTo = r), this._deviceSourceManager = new wy(a), this._initActionManager = (o) => {\n if (!this._meshPickProceed) {\n const l = s.skipPointerUpPicking || s._registeredActions === 0 && !this._checkForPicking() && !s.onPointerUp ? null : s.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, s.pointerUpPredicate, s.pointerUpFastCheck, s.cameraToUseForPointers, s.pointerUpTrianglePredicate);\n this._currentPickResult = l, l && (o = l.hit && l.pickedMesh ? l.pickedMesh._getActionManagerForTrigger() : null), this._meshPickProceed = !0;\n }\n return o;\n }, this._delayedSimpleClick = (o, l, c) => {\n if ((Date.now() - this._previousStartingPointerTime > ti.DoubleClickDelay && !this._doubleClickOccured || o !== this._previousButtonPressed) && (this._doubleClickOccured = !1, l.singleClick = !0, l.ignore = !1, this._delayedClicks[o])) {\n const h = this._delayedClicks[o].evt, u = pt.POINTERTAP, f = new Is(u, h, this._currentPickResult);\n s.onPointerObservable.hasObservers() && s.onPointerObservable.hasSpecificMask(u) && s.onPointerObservable.notifyObservers(f, u), this._delayedClicks[o] = null;\n }\n }, this._initClickEvent = (o, l, c, h) => {\n var g, m;\n const u = new lg();\n this._currentPickResult = null;\n let f = null, d = o.hasSpecificMask(pt.POINTERPICK) || l.hasSpecificMask(pt.POINTERPICK) || o.hasSpecificMask(pt.POINTERTAP) || l.hasSpecificMask(pt.POINTERTAP) || o.hasSpecificMask(pt.POINTERDOUBLETAP) || l.hasSpecificMask(pt.POINTERDOUBLETAP);\n !d && xr && (f = this._initActionManager(f, u), f && (d = f.hasPickTriggers));\n let p = !1;\n if (d) {\n const v = c.button;\n if (u.hasSwiped = this._isPointerSwiping(), !u.hasSwiped) {\n let E = !ti.ExclusiveDoubleClickMode;\n if (E || (E = !o.hasSpecificMask(pt.POINTERDOUBLETAP) && !l.hasSpecificMask(pt.POINTERDOUBLETAP), E && !xr.HasSpecificTrigger(6) && (f = this._initActionManager(f, u), f && (E = !f.hasSpecificTrigger(6)))), E)\n (Date.now() - this._previousStartingPointerTime > ti.DoubleClickDelay || v !== this._previousButtonPressed) && (u.singleClick = !0, h(u, this._currentPickResult), p = !0);\n else {\n const T = {\n evt: c,\n clickInfo: u,\n timeoutId: window.setTimeout(this._delayedSimpleClick.bind(this, v, u, h), ti.DoubleClickDelay)\n };\n this._delayedClicks[v] = T;\n }\n let C = o.hasSpecificMask(pt.POINTERDOUBLETAP) || l.hasSpecificMask(pt.POINTERDOUBLETAP);\n !C && xr.HasSpecificTrigger(6) && (f = this._initActionManager(f, u), f && (C = f.hasSpecificTrigger(6))), C && (v === this._previousButtonPressed && Date.now() - this._previousStartingPointerTime < ti.DoubleClickDelay && !this._doubleClickOccured ? (!u.hasSwiped && !this._isPointerSwiping() ? (this._previousStartingPointerTime = 0, this._doubleClickOccured = !0, u.doubleClick = !0, u.ignore = !1, ti.ExclusiveDoubleClickMode && this._delayedClicks[v] && (clearTimeout((g = this._delayedClicks[v]) == null ? void 0 : g.timeoutId), this._delayedClicks[v] = null), h(u, this._currentPickResult)) : (this._doubleClickOccured = !1, this._previousStartingPointerTime = this._startingPointerTime, this._previousStartingPointerPosition.x = this._startingPointerPosition.x, this._previousStartingPointerPosition.y = this._startingPointerPosition.y, this._previousButtonPressed = v, ti.ExclusiveDoubleClickMode ? (this._delayedClicks[v] && (clearTimeout((m = this._delayedClicks[v]) == null ? void 0 : m.timeoutId), this._delayedClicks[v] = null), h(u, this._previousPickResult)) : h(u, this._currentPickResult)), p = !0) : (this._doubleClickOccured = !1, this._previousStartingPointerTime = this._startingPointerTime, this._previousStartingPointerPosition.x = this._startingPointerPosition.x, this._previousStartingPointerPosition.y = this._startingPointerPosition.y, this._previousButtonPressed = v));\n }\n }\n p || h(u, this._currentPickResult);\n }, this._onPointerMove = (o) => {\n if (this._updatePointerPosition(o), !this._isSwiping && this._swipeButtonPressed !== -1 && (this._isSwiping = Math.abs(this._startingPointerPosition.x - this._pointerX) > ti.DragMovementThreshold || Math.abs(this._startingPointerPosition.y - this._pointerY) > ti.DragMovementThreshold), a.isPointerLock && a._verifyPointerLock(), this._checkPrePointerObservable(null, o, o.inputIndex >= Be.MouseWheelX && o.inputIndex <= Be.MouseWheelZ ? pt.POINTERWHEEL : pt.POINTERMOVE) || !s.cameraToUseForPointers && !s.activeCamera)\n return;\n if (s.skipPointerMovePicking) {\n this._processPointerMove(new ps(), o);\n return;\n }\n s.pointerMovePredicate || (s.pointerMovePredicate = (c) => c.isPickable && c.isVisible && c.isReady() && c.isEnabled() && (c.enablePointerMoveEvents || s.constantlyUpdateMeshUnderPointer || c._getActionManagerForTrigger() !== null) && (!s.cameraToUseForPointers || (s.cameraToUseForPointers.layerMask & c.layerMask) !== 0));\n const l = s._registeredActions > 0 || s.constantlyUpdateMeshUnderPointer ? this._pickMove(o) : null;\n this._processPointerMove(l, o);\n }, this._onPointerDown = (o) => {\n var c;\n if (this._totalPointersPressed++, this._pickedDownMesh = null, this._meshPickProceed = !1, ti.ExclusiveDoubleClickMode) {\n for (let h = 0; h < this._delayedClicks.length; h++)\n if (this._delayedClicks[h])\n if (o.button === h)\n clearTimeout((c = this._delayedClicks[h]) == null ? void 0 : c.timeoutId);\n else {\n const u = this._delayedClicks[h].clickInfo;\n this._doubleClickOccured = !1, u.singleClick = !0, u.ignore = !1;\n const f = this._delayedClicks[h].evt, d = pt.POINTERTAP, p = new Is(d, f, this._currentPickResult);\n s.onPointerObservable.hasObservers() && s.onPointerObservable.hasSpecificMask(d) && s.onPointerObservable.notifyObservers(p, d), this._delayedClicks[h] = null;\n }\n }\n if (this._updatePointerPosition(o), this._swipeButtonPressed === -1 && (this._swipeButtonPressed = o.button), s.preventDefaultOnPointerDown && r && (o.preventDefault(), r.focus()), this._startingPointerPosition.x = this._pointerX, this._startingPointerPosition.y = this._pointerY, this._startingPointerTime = Date.now(), this._checkPrePointerObservable(null, o, pt.POINTERDOWN) || !s.cameraToUseForPointers && !s.activeCamera)\n return;\n this._pointerCaptures[o.pointerId] = !0, s.pointerDownPredicate || (s.pointerDownPredicate = (h) => h.isPickable && h.isVisible && h.isReady() && h.isEnabled() && (!s.cameraToUseForPointers || (s.cameraToUseForPointers.layerMask & h.layerMask) !== 0)), this._pickedDownMesh = null;\n let l;\n s.skipPointerDownPicking || s._registeredActions === 0 && !this._checkForPicking() && !s.onPointerDown ? l = new ps() : l = s.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, s.pointerDownPredicate, s.pointerDownFastCheck, s.cameraToUseForPointers, s.pointerDownTrianglePredicate), this._processPointerDown(l, o);\n }, this._onPointerUp = (o) => {\n this._totalPointersPressed !== 0 && (this._totalPointersPressed--, this._pickedUpMesh = null, this._meshPickProceed = !1, this._updatePointerPosition(o), s.preventDefaultOnPointerUp && r && (o.preventDefault(), r.focus()), this._initClickEvent(s.onPrePointerObservable, s.onPointerObservable, o, (l, c) => {\n if (s.onPrePointerObservable.hasObservers() && (this._skipPointerTap = !1, !l.ignore)) {\n if (this._checkPrePointerObservable(null, o, pt.POINTERUP)) {\n this._swipeButtonPressed === o.button && (this._isSwiping = !1, this._swipeButtonPressed = -1), o.buttons === 0 && (this._pointerCaptures[o.pointerId] = !1);\n return;\n }\n l.hasSwiped || (l.singleClick && s.onPrePointerObservable.hasSpecificMask(pt.POINTERTAP) && this._checkPrePointerObservable(null, o, pt.POINTERTAP) && (this._skipPointerTap = !0), l.doubleClick && s.onPrePointerObservable.hasSpecificMask(pt.POINTERDOUBLETAP) && this._checkPrePointerObservable(null, o, pt.POINTERDOUBLETAP) && (this._skipPointerTap = !0));\n }\n if (!this._pointerCaptures[o.pointerId]) {\n this._swipeButtonPressed === o.button && (this._isSwiping = !1, this._swipeButtonPressed = -1);\n return;\n }\n o.buttons === 0 && (this._pointerCaptures[o.pointerId] = !1), !(!s.cameraToUseForPointers && !s.activeCamera) && (s.pointerUpPredicate || (s.pointerUpPredicate = (h) => h.isPickable && h.isVisible && h.isReady() && h.isEnabled() && (!s.cameraToUseForPointers || (s.cameraToUseForPointers.layerMask & h.layerMask) !== 0)), !this._meshPickProceed && (xr && xr.HasTriggers || this._checkForPicking() || s.onPointerUp) && this._initActionManager(null, l), c || (c = this._currentPickResult), this._processPointerUp(c, o, l), this._previousPickResult = this._currentPickResult, this._swipeButtonPressed === o.button && (this._isSwiping = !1, this._swipeButtonPressed = -1));\n }));\n }, this._onKeyDown = (o) => {\n const l = tc.KEYDOWN;\n if (s.onPreKeyboardObservable.hasObservers()) {\n const c = new $p(l, o);\n if (s.onPreKeyboardObservable.notifyObservers(c, l), c.skipOnKeyboardObservable)\n return;\n }\n if (s.onKeyboardObservable.hasObservers()) {\n const c = new _u(l, o);\n s.onKeyboardObservable.notifyObservers(c, l);\n }\n s.actionManager && s.actionManager.processTrigger(14, Ci.CreateNewFromScene(s, o));\n }, this._onKeyUp = (o) => {\n const l = tc.KEYUP;\n if (s.onPreKeyboardObservable.hasObservers()) {\n const c = new $p(l, o);\n if (s.onPreKeyboardObservable.notifyObservers(c, l), c.skipOnKeyboardObservable)\n return;\n }\n if (s.onKeyboardObservable.hasObservers()) {\n const c = new _u(l, o);\n s.onKeyboardObservable.notifyObservers(c, l);\n }\n s.actionManager && s.actionManager.processTrigger(15, Ci.CreateNewFromScene(s, o));\n }, this._deviceSourceManager.onDeviceConnectedObservable.add((o) => {\n o.deviceType === Pe.Mouse ? o.onInputChangedObservable.add((l) => {\n l.inputIndex === Be.LeftClick || l.inputIndex === Be.MiddleClick || l.inputIndex === Be.RightClick || l.inputIndex === Be.BrowserBack || l.inputIndex === Be.BrowserForward ? t && o.getInput(l.inputIndex) === 1 ? this._onPointerDown(l) : e && o.getInput(l.inputIndex) === 0 && this._onPointerUp(l) : i && (l.inputIndex === Be.Move ? this._onPointerMove(l) : (l.inputIndex === Be.MouseWheelX || l.inputIndex === Be.MouseWheelY || l.inputIndex === Be.MouseWheelZ) && this._onPointerMove(l));\n }) : o.deviceType === Pe.Touch ? o.onInputChangedObservable.add((l) => {\n l.inputIndex === Be.LeftClick && (t && o.getInput(l.inputIndex) === 1 ? (this._onPointerDown(l), this._totalPointersPressed > 1 && (this._isMultiTouchGesture = !0)) : e && o.getInput(l.inputIndex) === 0 && (this._onPointerUp(l), this._totalPointersPressed === 0 && (this._isMultiTouchGesture = !1))), i && l.inputIndex === Be.Move && this._onPointerMove(l);\n }) : o.deviceType === Pe.Keyboard && o.onInputChangedObservable.add((l) => {\n l.type === \"keydown\" ? this._onKeyDown(l) : l.type === \"keyup\" && this._onKeyUp(l);\n });\n }), this._alreadyAttached = !0;\n }\n /**\n * Detaches all event handlers\n */\n detachControl() {\n this._alreadyAttached && (this._deviceSourceManager.dispose(), this._deviceSourceManager = null, this._alreadyAttachedTo && !this._scene.doNotHandleCursors && (this._alreadyAttachedTo.style.cursor = this._scene.defaultCursor), this._alreadyAttached = !1, this._alreadyAttachedTo = null);\n }\n /**\n * Force the value of meshUnderPointer\n * @param mesh - defines the mesh to use\n * @param pointerId - optional pointer id when using more than one pointer. Defaults to 0\n * @param pickResult - optional pickingInfo data used to find mesh\n * @param evt - optional pointer event\n */\n setPointerOverMesh(e, t = 0, i, r) {\n if (this._meshUnderPointerId[t] === e && (!e || !e._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting))\n return;\n const s = this._meshUnderPointerId[t];\n let a;\n s && (a = s._getActionManagerForTrigger(10), a && a.processTrigger(10, Ci.CreateNew(s, r, { pointerId: t }))), e ? (this._meshUnderPointerId[t] = e, this._pointerOverMesh = e, a = e._getActionManagerForTrigger(9), a && a.processTrigger(9, Ci.CreateNew(e, r, { pointerId: t, pickResult: i }))) : (delete this._meshUnderPointerId[t], this._pointerOverMesh = null);\n }\n /**\n * Gets the mesh under the pointer\n * @returns a Mesh or null if no mesh is under the pointer\n */\n getPointerOverMesh() {\n return this.meshUnderPointer;\n }\n /**\n * @param mesh - Mesh to invalidate\n * @internal\n */\n _invalidateMesh(e) {\n this._pointerOverMesh === e && (this._pointerOverMesh = null), this._pickedDownMesh === e && (this._pickedDownMesh = null), this._pickedUpMesh === e && (this._pickedUpMesh = null);\n for (const t in this._meshUnderPointerId)\n this._meshUnderPointerId[t] === e && delete this._meshUnderPointerId[t];\n }\n}\nti.DragMovementThreshold = 10;\nti.LongPressDelay = 500;\nti.DoubleClickDelay = 300;\nti.ExclusiveDoubleClickMode = !1;\nclass us {\n /**\n * Returns the smallest value ever\n */\n get min() {\n return this._min;\n }\n /**\n * Returns the biggest value ever\n */\n get max() {\n return this._max;\n }\n /**\n * Returns the average value since the performance counter is running\n */\n get average() {\n return this._average;\n }\n /**\n * Returns the average value of the last second the counter was monitored\n */\n get lastSecAverage() {\n return this._lastSecAverage;\n }\n /**\n * Returns the current value\n */\n get current() {\n return this._current;\n }\n /**\n * Gets the accumulated total\n */\n get total() {\n return this._totalAccumulated;\n }\n /**\n * Gets the total value count\n */\n get count() {\n return this._totalValueCount;\n }\n /**\n * Creates a new counter\n */\n constructor() {\n this._startMonitoringTime = 0, this._min = 0, this._max = 0, this._average = 0, this._lastSecAverage = 0, this._current = 0, this._totalValueCount = 0, this._totalAccumulated = 0, this._lastSecAccumulated = 0, this._lastSecTime = 0, this._lastSecValueCount = 0;\n }\n /**\n * Call this method to start monitoring a new frame.\n * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the start of the frame, then beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count.\n */\n fetchNewFrame() {\n this._totalValueCount++, this._current = 0, this._lastSecValueCount++;\n }\n /**\n * Call this method to monitor a count of something (e.g. mesh drawn in viewport count)\n * @param newCount the count value to add to the monitored count\n * @param fetchResult true when it's the last time in the frame you add to the counter and you wish to update the statistics properties (min/max/average), false if you only want to update statistics.\n */\n addCount(e, t) {\n us.Enabled && (this._current += e, t && this._fetchResult());\n }\n /**\n * Start monitoring this performance counter\n */\n beginMonitoring() {\n us.Enabled && (this._startMonitoringTime = sr.Now);\n }\n /**\n * Compute the time lapsed since the previous beginMonitoring() call.\n * @param newFrame true by default to fetch the result and monitor a new frame, if false the time monitored will be added to the current frame counter\n */\n endMonitoring(e = !0) {\n if (!us.Enabled)\n return;\n e && this.fetchNewFrame();\n const t = sr.Now;\n this._current = t - this._startMonitoringTime, e && this._fetchResult();\n }\n /**\n * Call this method to end the monitoring of a frame.\n * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the end of the frame, after beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count.\n */\n endFrame() {\n this._fetchResult();\n }\n /** @internal */\n _fetchResult() {\n this._totalAccumulated += this._current, this._lastSecAccumulated += this._current, this._min = Math.min(this._min, this._current), this._max = Math.max(this._max, this._current), this._average = this._totalAccumulated / this._totalValueCount;\n const e = sr.Now;\n e - this._lastSecTime > 1e3 && (this._lastSecAverage = this._lastSecAccumulated / this._lastSecValueCount, this._lastSecTime = e, this._lastSecAccumulated = 0, this._lastSecValueCount = 0);\n }\n}\nus.Enabled = !0;\nclass Yr {\n /**\n * Creates a Plane object according to the given floats a, b, c, d and the plane equation : ax + by + cz + d = 0\n * @param a a component of the plane\n * @param b b component of the plane\n * @param c c component of the plane\n * @param d d component of the plane\n */\n constructor(e, t, i, r) {\n this.normal = new _(e, t, i), this.d = r;\n }\n /**\n * @returns the plane coordinates as a new array of 4 elements [a, b, c, d].\n */\n asArray() {\n return [this.normal.x, this.normal.y, this.normal.z, this.d];\n }\n // Methods\n /**\n * @returns a new plane copied from the current Plane.\n */\n clone() {\n return new Yr(this.normal.x, this.normal.y, this.normal.z, this.d);\n }\n /**\n * @returns the string \"Plane\".\n */\n getClassName() {\n return \"Plane\";\n }\n /**\n * @returns the Plane hash code.\n */\n getHashCode() {\n let e = this.normal.getHashCode();\n return e = e * 397 ^ (this.d | 0), e;\n }\n /**\n * Normalize the current Plane in place.\n * @returns the updated Plane.\n */\n normalize() {\n const e = Math.sqrt(this.normal.x * this.normal.x + this.normal.y * this.normal.y + this.normal.z * this.normal.z);\n let t = 0;\n return e !== 0 && (t = 1 / e), this.normal.x *= t, this.normal.y *= t, this.normal.z *= t, this.d *= t, this;\n }\n /**\n * Applies a transformation the plane and returns the result\n * @param transformation the transformation matrix to be applied to the plane\n * @returns a new Plane as the result of the transformation of the current Plane by the given matrix.\n */\n transform(e) {\n const t = Yr._TmpMatrix;\n e.invertToRef(t);\n const i = t.m, r = this.normal.x, s = this.normal.y, a = this.normal.z, o = this.d, l = r * i[0] + s * i[1] + a * i[2] + o * i[3], c = r * i[4] + s * i[5] + a * i[6] + o * i[7], h = r * i[8] + s * i[9] + a * i[10] + o * i[11], u = r * i[12] + s * i[13] + a * i[14] + o * i[15];\n return new Yr(l, c, h, u);\n }\n /**\n * Compute the dot product between the point and the plane normal\n * @param point point to calculate the dot product with\n * @returns the dot product (float) of the point coordinates and the plane normal.\n */\n dotCoordinate(e) {\n return this.normal.x * e.x + this.normal.y * e.y + this.normal.z * e.z + this.d;\n }\n /**\n * Updates the current Plane from the plane defined by the three given points.\n * @param point1 one of the points used to construct the plane\n * @param point2 one of the points used to construct the plane\n * @param point3 one of the points used to construct the plane\n * @returns the updated Plane.\n */\n copyFromPoints(e, t, i) {\n const r = t.x - e.x, s = t.y - e.y, a = t.z - e.z, o = i.x - e.x, l = i.y - e.y, c = i.z - e.z, h = s * c - a * l, u = a * o - r * c, f = r * l - s * o, d = Math.sqrt(h * h + u * u + f * f);\n let p;\n return d !== 0 ? p = 1 / d : p = 0, this.normal.x = h * p, this.normal.y = u * p, this.normal.z = f * p, this.d = -(this.normal.x * e.x + this.normal.y * e.y + this.normal.z * e.z), this;\n }\n /**\n * Checks if the plane is facing a given direction (meaning if the plane's normal is pointing in the opposite direction of the given vector).\n * Note that for this function to work as expected you should make sure that:\n * - direction and the plane normal are normalized\n * - epsilon is a number just bigger than -1, something like -0.99 for eg\n * @param direction the direction to check if the plane is facing\n * @param epsilon value the dot product is compared against (returns true if dot <= epsilon)\n * @returns True if the plane is facing the given direction\n */\n isFrontFacingTo(e, t) {\n return _.Dot(this.normal, e) <= t;\n }\n /**\n * Calculates the distance to a point\n * @param point point to calculate distance to\n * @returns the signed distance (float) from the given point to the Plane.\n */\n signedDistanceTo(e) {\n return _.Dot(e, this.normal) + this.d;\n }\n // Statics\n /**\n * Creates a plane from an array\n * @param array the array to create a plane from\n * @returns a new Plane from the given array.\n */\n static FromArray(e) {\n return new Yr(e[0], e[1], e[2], e[3]);\n }\n /**\n * Creates a plane from three points\n * @param point1 point used to create the plane\n * @param point2 point used to create the plane\n * @param point3 point used to create the plane\n * @returns a new Plane defined by the three given points.\n */\n static FromPoints(e, t, i) {\n const r = new Yr(0, 0, 0, 0);\n return r.copyFromPoints(e, t, i), r;\n }\n /**\n * Creates a plane from an origin point and a normal\n * @param origin origin of the plane to be constructed\n * @param normal normal of the plane to be constructed\n * @returns a new Plane the normal vector to this plane at the given origin point.\n */\n static FromPositionAndNormal(e, t) {\n const i = new Yr(0, 0, 0, 0);\n return this.FromPositionAndNormalToRef(e, t, i);\n }\n /**\n * Updates the given Plane \"result\" from an origin point and a normal.\n * @param origin origin of the plane to be constructed\n * @param normal the normalized normals of the plane to be constructed\n * @param result defines the Plane where to store the result\n * @returns result input\n */\n static FromPositionAndNormalToRef(e, t, i) {\n return i.normal.copyFrom(t), i.normal.normalize(), i.d = -e.dot(i.normal), i;\n }\n /**\n * Calculates the distance from a plane and a point\n * @param origin origin of the plane to be constructed\n * @param normal normal of the plane to be constructed\n * @param point point to calculate distance to\n * @returns the signed distance between the plane defined by the normal vector at the \"origin\"\" point and the given other point.\n */\n static SignedDistanceToPlaneFromPositionAndNormal(e, t, i) {\n const r = -(t.x * e.x + t.y * e.y + t.z * e.z);\n return _.Dot(i, t) + r;\n }\n}\nYr._TmpMatrix = L.Identity();\nclass Or {\n /**\n * Gets the planes representing the frustum\n * @param transform matrix to be applied to the returned planes\n * @returns a new array of 6 Frustum planes computed by the given transformation matrix.\n */\n static GetPlanes(e) {\n const t = [];\n for (let i = 0; i < 6; i++)\n t.push(new Yr(0, 0, 0, 0));\n return Or.GetPlanesToRef(e, t), t;\n }\n /**\n * Gets the near frustum plane transformed by the transform matrix\n * @param transform transformation matrix to be applied to the resulting frustum plane\n * @param frustumPlane the resulting frustum plane\n */\n static GetNearPlaneToRef(e, t) {\n const i = e.m;\n t.normal.x = i[3] + i[2], t.normal.y = i[7] + i[6], t.normal.z = i[11] + i[10], t.d = i[15] + i[14], t.normalize();\n }\n /**\n * Gets the far frustum plane transformed by the transform matrix\n * @param transform transformation matrix to be applied to the resulting frustum plane\n * @param frustumPlane the resulting frustum plane\n */\n static GetFarPlaneToRef(e, t) {\n const i = e.m;\n t.normal.x = i[3] - i[2], t.normal.y = i[7] - i[6], t.normal.z = i[11] - i[10], t.d = i[15] - i[14], t.normalize();\n }\n /**\n * Gets the left frustum plane transformed by the transform matrix\n * @param transform transformation matrix to be applied to the resulting frustum plane\n * @param frustumPlane the resulting frustum plane\n */\n static GetLeftPlaneToRef(e, t) {\n const i = e.m;\n t.normal.x = i[3] + i[0], t.normal.y = i[7] + i[4], t.normal.z = i[11] + i[8], t.d = i[15] + i[12], t.normalize();\n }\n /**\n * Gets the right frustum plane transformed by the transform matrix\n * @param transform transformation matrix to be applied to the resulting frustum plane\n * @param frustumPlane the resulting frustum plane\n */\n static GetRightPlaneToRef(e, t) {\n const i = e.m;\n t.normal.x = i[3] - i[0], t.normal.y = i[7] - i[4], t.normal.z = i[11] - i[8], t.d = i[15] - i[12], t.normalize();\n }\n /**\n * Gets the top frustum plane transformed by the transform matrix\n * @param transform transformation matrix to be applied to the resulting frustum plane\n * @param frustumPlane the resulting frustum plane\n */\n static GetTopPlaneToRef(e, t) {\n const i = e.m;\n t.normal.x = i[3] - i[1], t.normal.y = i[7] - i[5], t.normal.z = i[11] - i[9], t.d = i[15] - i[13], t.normalize();\n }\n /**\n * Gets the bottom frustum plane transformed by the transform matrix\n * @param transform transformation matrix to be applied to the resulting frustum plane\n * @param frustumPlane the resulting frustum plane\n */\n static GetBottomPlaneToRef(e, t) {\n const i = e.m;\n t.normal.x = i[3] + i[1], t.normal.y = i[7] + i[5], t.normal.z = i[11] + i[9], t.d = i[15] + i[13], t.normalize();\n }\n /**\n * Sets the given array \"frustumPlanes\" with the 6 Frustum planes computed by the given transformation matrix.\n * @param transform transformation matrix to be applied to the resulting frustum planes\n * @param frustumPlanes the resulting frustum planes\n */\n static GetPlanesToRef(e, t) {\n Or.GetNearPlaneToRef(e, t[0]), Or.GetFarPlaneToRef(e, t[1]), Or.GetLeftPlaneToRef(e, t[2]), Or.GetRightPlaneToRef(e, t[3]), Or.GetTopPlaneToRef(e, t[4]), Or.GetBottomPlaneToRef(e, t[5]);\n }\n /**\n * Tests if a point is located between the frustum planes.\n * @param point defines the point to test\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if the point is located between the frustum planes\n */\n static IsPointInFrustum(e, t) {\n for (let i = 0; i < 6; i++)\n if (t[i].dotCoordinate(e) < 0)\n return !1;\n return !0;\n }\n}\nclass sf {\n /**\n * Gets an unique (relatively to the current scene) Id\n */\n static get UniqueId() {\n const e = this._UniqueIdCounter;\n return this._UniqueIdCounter++, e;\n }\n}\nsf._UniqueIdCounter = 1;\nclass Et {\n /**\n * Sort function to order lights for rendering.\n * @param a First Light object to compare to second.\n * @param b Second Light object to compare first.\n * @returns -1 to reduce's a's index relative to be, 0 for no change, 1 to increase a's index relative to b.\n */\n static CompareLightsPriority(e, t) {\n return e.shadowEnabled !== t.shadowEnabled ? (t.shadowEnabled ? 1 : 0) - (e.shadowEnabled ? 1 : 0) : t.renderPriority - e.renderPriority;\n }\n}\nEt.FALLOFF_DEFAULT = 0;\nEt.FALLOFF_PHYSICAL = 1;\nEt.FALLOFF_GLTF = 2;\nEt.FALLOFF_STANDARD = 3;\nEt.LIGHTMAP_DEFAULT = 0;\nEt.LIGHTMAP_SPECULAR = 1;\nEt.LIGHTMAP_SHADOWSONLY = 2;\nEt.INTENSITYMODE_AUTOMATIC = 0;\nEt.INTENSITYMODE_LUMINOUSPOWER = 1;\nEt.INTENSITYMODE_LUMINOUSINTENSITY = 2;\nEt.INTENSITYMODE_ILLUMINANCE = 3;\nEt.INTENSITYMODE_LUMINANCE = 4;\nEt.LIGHTTYPEID_POINTLIGHT = 0;\nEt.LIGHTTYPEID_DIRECTIONALLIGHT = 1;\nEt.LIGHTTYPEID_SPOTLIGHT = 2;\nEt.LIGHTTYPEID_HEMISPHERICLIGHT = 3;\nclass Uy {\n constructor() {\n this.pointerDownFastCheck = !1, this.pointerUpFastCheck = !1, this.pointerMoveFastCheck = !1, this.skipPointerMovePicking = !1, this.skipPointerDownPicking = !1, this.skipPointerUpPicking = !1;\n }\n}\nvar fs;\n(function(n) {\n n[n.BackwardCompatible = 0] = \"BackwardCompatible\", n[n.Intermediate = 1] = \"Intermediate\", n[n.Aggressive = 2] = \"Aggressive\";\n})(fs || (fs = {}));\nclass Ot extends Xo {\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Factory used to create the default material.\n * @param scene The scene to create the material for\n * @returns The default material\n */\n static DefaultMaterialFactory(e) {\n throw We(\"StandardMaterial\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Factory used to create the a collision coordinator.\n * @returns The collision coordinator\n */\n static CollisionCoordinatorFactory() {\n throw We(\"DefaultCollisionCoordinator\");\n }\n /**\n * Texture used in all pbr material as the reflection texture.\n * As in the majority of the scene they are the same (exception for multi room and so on),\n * this is easier to reference from here than from all the materials.\n */\n get environmentTexture() {\n return this._environmentTexture;\n }\n /**\n * Texture used in all pbr material as the reflection texture.\n * As in the majority of the scene they are the same (exception for multi room and so on),\n * this is easier to set here than in all the materials.\n */\n set environmentTexture(e) {\n this._environmentTexture !== e && (this._environmentTexture = e, this.markAllMaterialsAsDirty(1));\n }\n /**\n * Default image processing configuration used either in the rendering\n * Forward main pass or through the imageProcessingPostProcess if present.\n * As in the majority of the scene they are the same (exception for multi camera),\n * this is easier to reference from here than from all the materials and post process.\n *\n * No setter as we it is a shared configuration, you can set the values instead.\n */\n get imageProcessingConfiguration() {\n return this._imageProcessingConfiguration;\n }\n /**\n * Gets or sets a value indicating how to treat performance relatively to ease of use and backward compatibility\n */\n get performancePriority() {\n return this._performancePriority;\n }\n set performancePriority(e) {\n if (e !== this._performancePriority) {\n switch (this._performancePriority = e, e) {\n case fs.BackwardCompatible:\n this.skipFrustumClipping = !1, this._renderingManager.maintainStateBetweenFrames = !1, this.skipPointerMovePicking = !1, this.autoClear = !0;\n break;\n case fs.Intermediate:\n this.skipFrustumClipping = !1, this._renderingManager.maintainStateBetweenFrames = !1, this.skipPointerMovePicking = !0, this.autoClear = !1;\n break;\n case fs.Aggressive:\n this.skipFrustumClipping = !0, this._renderingManager.maintainStateBetweenFrames = !0, this.skipPointerMovePicking = !0, this.autoClear = !1;\n break;\n }\n this.onScenePerformancePriorityChangedObservable.notifyObservers(e);\n }\n }\n /**\n * Gets or sets a boolean indicating if all rendering must be done in wireframe\n */\n set forceWireframe(e) {\n this._forceWireframe !== e && (this._forceWireframe = e, this.markAllMaterialsAsDirty(16));\n }\n get forceWireframe() {\n return this._forceWireframe;\n }\n /**\n * Gets or sets a boolean indicating if we should skip the frustum clipping part of the active meshes selection\n */\n set skipFrustumClipping(e) {\n this._skipFrustumClipping !== e && (this._skipFrustumClipping = e);\n }\n get skipFrustumClipping() {\n return this._skipFrustumClipping;\n }\n /**\n * Gets or sets a boolean indicating if all rendering must be done in point cloud\n */\n set forcePointsCloud(e) {\n this._forcePointsCloud !== e && (this._forcePointsCloud = e, this.markAllMaterialsAsDirty(16));\n }\n get forcePointsCloud() {\n return this._forcePointsCloud;\n }\n /**\n * Gets or sets the animation properties override\n */\n get animationPropertiesOverride() {\n return this._animationPropertiesOverride;\n }\n set animationPropertiesOverride(e) {\n this._animationPropertiesOverride = e;\n }\n /** Sets a function to be executed when this scene is disposed. */\n set onDispose(e) {\n this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e);\n }\n /** Sets a function to be executed before rendering this scene */\n set beforeRender(e) {\n this._onBeforeRenderObserver && this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver), e && (this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(e));\n }\n /** Sets a function to be executed after rendering this scene */\n set afterRender(e) {\n this._onAfterRenderObserver && this.onAfterRenderObservable.remove(this._onAfterRenderObserver), e && (this._onAfterRenderObserver = this.onAfterRenderObservable.add(e));\n }\n /** Sets a function to be executed before rendering a camera*/\n set beforeCameraRender(e) {\n this._onBeforeCameraRenderObserver && this.onBeforeCameraRenderObservable.remove(this._onBeforeCameraRenderObserver), this._onBeforeCameraRenderObserver = this.onBeforeCameraRenderObservable.add(e);\n }\n /** Sets a function to be executed after rendering a camera*/\n set afterCameraRender(e) {\n this._onAfterCameraRenderObserver && this.onAfterCameraRenderObservable.remove(this._onAfterCameraRenderObserver), this._onAfterCameraRenderObserver = this.onAfterCameraRenderObservable.add(e);\n }\n /**\n * Gets or sets a predicate used to select candidate meshes for a pointer down event\n */\n get pointerDownPredicate() {\n return this._pointerPickingConfiguration.pointerDownPredicate;\n }\n set pointerDownPredicate(e) {\n this._pointerPickingConfiguration.pointerDownPredicate = e;\n }\n /**\n * Gets or sets a predicate used to select candidate meshes for a pointer up event\n */\n get pointerUpPredicate() {\n return this._pointerPickingConfiguration.pointerUpPredicate;\n }\n set pointerUpPredicate(e) {\n this._pointerPickingConfiguration.pointerUpPredicate = e;\n }\n /**\n * Gets or sets a predicate used to select candidate meshes for a pointer move event\n */\n get pointerMovePredicate() {\n return this._pointerPickingConfiguration.pointerMovePredicate;\n }\n set pointerMovePredicate(e) {\n this._pointerPickingConfiguration.pointerMovePredicate = e;\n }\n /**\n * Gets or sets a predicate used to select candidate meshes for a pointer down event\n */\n get pointerDownFastCheck() {\n return this._pointerPickingConfiguration.pointerDownFastCheck;\n }\n set pointerDownFastCheck(e) {\n this._pointerPickingConfiguration.pointerDownFastCheck = e;\n }\n /**\n * Gets or sets a predicate used to select candidate meshes for a pointer up event\n */\n get pointerUpFastCheck() {\n return this._pointerPickingConfiguration.pointerUpFastCheck;\n }\n set pointerUpFastCheck(e) {\n this._pointerPickingConfiguration.pointerUpFastCheck = e;\n }\n /**\n * Gets or sets a predicate used to select candidate meshes for a pointer move event\n */\n get pointerMoveFastCheck() {\n return this._pointerPickingConfiguration.pointerMoveFastCheck;\n }\n set pointerMoveFastCheck(e) {\n this._pointerPickingConfiguration.pointerMoveFastCheck = e;\n }\n /**\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer move event occurs.\n */\n get skipPointerMovePicking() {\n return this._pointerPickingConfiguration.skipPointerMovePicking;\n }\n set skipPointerMovePicking(e) {\n this._pointerPickingConfiguration.skipPointerMovePicking = e;\n }\n /**\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer down event occurs.\n */\n get skipPointerDownPicking() {\n return this._pointerPickingConfiguration.skipPointerDownPicking;\n }\n set skipPointerDownPicking(e) {\n this._pointerPickingConfiguration.skipPointerDownPicking = e;\n }\n /**\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer up event occurs. Off by default.\n */\n get skipPointerUpPicking() {\n return this._pointerPickingConfiguration.skipPointerUpPicking;\n }\n set skipPointerUpPicking(e) {\n this._pointerPickingConfiguration.skipPointerUpPicking = e;\n }\n /**\n * Gets the pointer coordinates without any translation (ie. straight out of the pointer event)\n */\n get unTranslatedPointer() {\n return this._inputManager.unTranslatedPointer;\n }\n /**\n * Gets or sets the distance in pixel that you have to move to prevent some events. Default is 10 pixels\n */\n static get DragMovementThreshold() {\n return ti.DragMovementThreshold;\n }\n static set DragMovementThreshold(e) {\n ti.DragMovementThreshold = e;\n }\n /**\n * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 500 ms\n */\n static get LongPressDelay() {\n return ti.LongPressDelay;\n }\n static set LongPressDelay(e) {\n ti.LongPressDelay = e;\n }\n /**\n * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 300 ms\n */\n static get DoubleClickDelay() {\n return ti.DoubleClickDelay;\n }\n static set DoubleClickDelay(e) {\n ti.DoubleClickDelay = e;\n }\n /** If you need to check double click without raising a single click at first click, enable this flag */\n static get ExclusiveDoubleClickMode() {\n return ti.ExclusiveDoubleClickMode;\n }\n static set ExclusiveDoubleClickMode(e) {\n ti.ExclusiveDoubleClickMode = e;\n }\n /**\n * Bind the current view position to an effect.\n * @param effect The effect to be bound\n * @param variableName name of the shader variable that will hold the eye position\n * @param isVector3 true to indicates that variableName is a Vector3 and not a Vector4\n * @returns the computed eye position\n */\n bindEyePosition(e, t = \"vEyePosition\", i = !1) {\n const r = this._forcedViewPosition ? this._forcedViewPosition : this._mirroredCameraPosition ? this._mirroredCameraPosition : this.activeCamera.globalPosition, s = this.useRightHandedSystem === (this._mirroredCameraPosition != null);\n return z.Vector4[0].set(r.x, r.y, r.z, s ? -1 : 1), e && (i ? e.setFloat3(t, z.Vector4[0].x, z.Vector4[0].y, z.Vector4[0].z) : e.setVector4(t, z.Vector4[0])), z.Vector4[0];\n }\n /**\n * Update the scene ubo before it can be used in rendering processing\n * @returns the scene UniformBuffer\n */\n finalizeSceneUbo() {\n const e = this.getSceneUniformBuffer(), t = this.bindEyePosition(null);\n return e.updateFloat4(\"vEyePosition\", t.x, t.y, t.z, t.w), e.update(), e;\n }\n /**\n * Gets or sets a boolean indicating if the scene must use right-handed coordinates system\n */\n set useRightHandedSystem(e) {\n this._useRightHandedSystem !== e && (this._useRightHandedSystem = e, this.markAllMaterialsAsDirty(16));\n }\n get useRightHandedSystem() {\n return this._useRightHandedSystem;\n }\n /**\n * Sets the step Id used by deterministic lock step\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\n * @param newStepId defines the step Id\n */\n setStepId(e) {\n this._currentStepId = e;\n }\n /**\n * Gets the step Id used by deterministic lock step\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\n * @returns the step Id\n */\n getStepId() {\n return this._currentStepId;\n }\n /**\n * Gets the internal step used by deterministic lock step\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\n * @returns the internal step\n */\n getInternalStep() {\n return this._currentInternalStep;\n }\n /**\n * Gets or sets a boolean indicating if fog is enabled on this scene\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\n * (Default is true)\n */\n set fogEnabled(e) {\n this._fogEnabled !== e && (this._fogEnabled = e, this.markAllMaterialsAsDirty(16));\n }\n get fogEnabled() {\n return this._fogEnabled;\n }\n /**\n * Gets or sets the fog mode to use\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\n * | mode | value |\n * | --- | --- |\n * | FOGMODE_NONE | 0 |\n * | FOGMODE_EXP | 1 |\n * | FOGMODE_EXP2 | 2 |\n * | FOGMODE_LINEAR | 3 |\n */\n set fogMode(e) {\n this._fogMode !== e && (this._fogMode = e, this.markAllMaterialsAsDirty(16));\n }\n get fogMode() {\n return this._fogMode;\n }\n /**\n * Flag indicating that the frame buffer binding is handled by another component\n */\n get prePass() {\n return !!this.prePassRenderer && this.prePassRenderer.defaultRT.enabled;\n }\n /**\n * Gets or sets a boolean indicating if shadows are enabled on this scene\n */\n set shadowsEnabled(e) {\n this._shadowsEnabled !== e && (this._shadowsEnabled = e, this.markAllMaterialsAsDirty(2));\n }\n get shadowsEnabled() {\n return this._shadowsEnabled;\n }\n /**\n * Gets or sets a boolean indicating if lights are enabled on this scene\n */\n set lightsEnabled(e) {\n this._lightsEnabled !== e && (this._lightsEnabled = e, this.markAllMaterialsAsDirty(2));\n }\n get lightsEnabled() {\n return this._lightsEnabled;\n }\n /** All of the active cameras added to this scene. */\n get activeCameras() {\n return this._activeCameras;\n }\n set activeCameras(e) {\n this._unObserveActiveCameras && (this._unObserveActiveCameras(), this._unObserveActiveCameras = null), e && (this._unObserveActiveCameras = z_(e, () => {\n this.onActiveCamerasChanged.notifyObservers(this);\n })), this._activeCameras = e;\n }\n /** Gets or sets the current active camera */\n get activeCamera() {\n return this._activeCamera;\n }\n set activeCamera(e) {\n e !== this._activeCamera && (this._activeCamera = e, this.onActiveCameraChanged.notifyObservers(this));\n }\n /** The default material used on meshes when no material is affected */\n get defaultMaterial() {\n return this._defaultMaterial || (this._defaultMaterial = Ot.DefaultMaterialFactory(this)), this._defaultMaterial;\n }\n /** The default material used on meshes when no material is affected */\n set defaultMaterial(e) {\n this._defaultMaterial = e;\n }\n /**\n * Gets or sets a boolean indicating if textures are enabled on this scene\n */\n set texturesEnabled(e) {\n this._texturesEnabled !== e && (this._texturesEnabled = e, this.markAllMaterialsAsDirty(1));\n }\n get texturesEnabled() {\n return this._texturesEnabled;\n }\n /**\n * Gets or sets a boolean indicating if skeletons are enabled on this scene\n */\n set skeletonsEnabled(e) {\n this._skeletonsEnabled !== e && (this._skeletonsEnabled = e, this.markAllMaterialsAsDirty(8));\n }\n get skeletonsEnabled() {\n return this._skeletonsEnabled;\n }\n /** @internal */\n get collisionCoordinator() {\n return this._collisionCoordinator || (this._collisionCoordinator = Ot.CollisionCoordinatorFactory(), this._collisionCoordinator.init(this)), this._collisionCoordinator;\n }\n /**\n * Gets the scene's rendering manager\n */\n get renderingManager() {\n return this._renderingManager;\n }\n /**\n * Gets the list of frustum planes (built from the active camera)\n */\n get frustumPlanes() {\n return this._frustumPlanes;\n }\n /**\n * Registers the transient components if needed.\n */\n _registerTransientComponents() {\n if (this._transientComponents.length > 0) {\n for (const e of this._transientComponents)\n e.register();\n this._transientComponents.length = 0;\n }\n }\n /**\n * @internal\n * Add a component to the scene.\n * Note that the ccomponent could be registered on th next frame if this is called after\n * the register component stage.\n * @param component Defines the component to add to the scene\n */\n _addComponent(e) {\n this._components.push(e), this._transientComponents.push(e);\n const t = e;\n t.addFromContainer && t.serialize && this._serializableComponents.push(t);\n }\n /**\n * @internal\n * Gets a component from the scene.\n * @param name defines the name of the component to retrieve\n * @returns the component or null if not present\n */\n _getComponent(e) {\n for (const t of this._components)\n if (t.name === e)\n return t;\n return null;\n }\n /**\n * Creates a new Scene\n * @param engine defines the engine to use to render this scene\n * @param options defines the scene options\n */\n constructor(e, t) {\n super(), this._inputManager = new ti(this), this.cameraToUseForPointers = null, this._isScene = !0, this._blockEntityCollection = !1, this.autoClear = !0, this.autoClearDepthAndStencil = !0, this.clearColor = new et(0.2, 0.2, 0.3, 1), this.ambientColor = new Ne(0, 0, 0), this.environmentIntensity = 1, this._performancePriority = fs.BackwardCompatible, this.onScenePerformancePriorityChangedObservable = new he(), this._forceWireframe = !1, this._skipFrustumClipping = !1, this._forcePointsCloud = !1, this.animationsEnabled = !0, this._animationPropertiesOverride = null, this.useConstantAnimationDeltaTime = !1, this.constantlyUpdateMeshUnderPointer = !1, this.hoverCursor = \"pointer\", this.defaultCursor = \"\", this.doNotHandleCursors = !1, this.preventDefaultOnPointerDown = !0, this.preventDefaultOnPointerUp = !0, this.metadata = null, this.reservedDataStore = null, this.disableOfflineSupportExceptionRules = [], this.onDisposeObservable = new he(), this._onDisposeObserver = null, this.onBeforeRenderObservable = new he(), this._onBeforeRenderObserver = null, this.onAfterRenderObservable = new he(), this.onAfterRenderCameraObservable = new he(), this._onAfterRenderObserver = null, this.onBeforeAnimationsObservable = new he(), this.onAfterAnimationsObservable = new he(), this.onBeforeDrawPhaseObservable = new he(), this.onAfterDrawPhaseObservable = new he(), this.onReadyObservable = new he(), this.onBeforeCameraRenderObservable = new he(), this._onBeforeCameraRenderObserver = null, this.onAfterCameraRenderObservable = new he(), this._onAfterCameraRenderObserver = null, this.onBeforeActiveMeshesEvaluationObservable = new he(), this.onAfterActiveMeshesEvaluationObservable = new he(), this.onBeforeParticlesRenderingObservable = new he(), this.onAfterParticlesRenderingObservable = new he(), this.onDataLoadedObservable = new he(), this.onNewCameraAddedObservable = new he(), this.onCameraRemovedObservable = new he(), this.onNewLightAddedObservable = new he(), this.onLightRemovedObservable = new he(), this.onNewGeometryAddedObservable = new he(), this.onGeometryRemovedObservable = new he(), this.onNewTransformNodeAddedObservable = new he(), this.onTransformNodeRemovedObservable = new he(), this.onNewMeshAddedObservable = new he(), this.onMeshRemovedObservable = new he(), this.onNewSkeletonAddedObservable = new he(), this.onSkeletonRemovedObservable = new he(), this.onNewMaterialAddedObservable = new he(), this.onNewMultiMaterialAddedObservable = new he(), this.onMaterialRemovedObservable = new he(), this.onMultiMaterialRemovedObservable = new he(), this.onNewTextureAddedObservable = new he(), this.onTextureRemovedObservable = new he(), this.onBeforeRenderTargetsRenderObservable = new he(), this.onAfterRenderTargetsRenderObservable = new he(), this.onBeforeStepObservable = new he(), this.onAfterStepObservable = new he(), this.onActiveCameraChanged = new he(), this.onActiveCamerasChanged = new he(), this.onBeforeRenderingGroupObservable = new he(), this.onAfterRenderingGroupObservable = new he(), this.onMeshImportedObservable = new he(), this.onAnimationFileImportedObservable = new he(), this._registeredForLateAnimationBindings = new Cn(256), this._pointerPickingConfiguration = new Uy(), this.onPrePointerObservable = new he(), this.onPointerObservable = new he(), this.onPreKeyboardObservable = new he(), this.onKeyboardObservable = new he(), this._useRightHandedSystem = !1, this._timeAccumulator = 0, this._currentStepId = 0, this._currentInternalStep = 0, this._fogEnabled = !0, this._fogMode = Ot.FOGMODE_NONE, this.fogColor = new Ne(0.2, 0.2, 0.3), this.fogDensity = 0.1, this.fogStart = 0, this.fogEnd = 1e3, this.needsPreviousWorldMatrices = !1, this._shadowsEnabled = !0, this._lightsEnabled = !0, this._unObserveActiveCameras = null, this._texturesEnabled = !0, this.physicsEnabled = !0, this.particlesEnabled = !0, this.spritesEnabled = !0, this._skeletonsEnabled = !0, this.lensFlaresEnabled = !0, this.collisionsEnabled = !0, this.gravity = new _(0, -9.807, 0), this.postProcessesEnabled = !0, this.renderTargetsEnabled = !0, this.dumpNextRenderTargets = !1, this.customRenderTargets = [], this.importedMeshesFiles = [], this.probesEnabled = !0, this._meshesForIntersections = new Cn(256), this.proceduralTexturesEnabled = !0, this._totalVertices = new us(), this._activeIndices = new us(), this._activeParticles = new us(), this._activeBones = new us(), this._animationTime = 0, this.animationTimeScale = 1, this._renderId = 0, this._frameId = 0, this._executeWhenReadyTimeoutId = null, this._intermediateRendering = !1, this._defaultFrameBufferCleared = !1, this._viewUpdateFlag = -1, this._projectionUpdateFlag = -1, this._toBeDisposed = new Array(256), this._activeRequests = new Array(), this._pendingData = new Array(), this._isDisposed = !1, this.dispatchAllSubMeshesOfActiveMeshes = !1, this._activeMeshes = new Li(256), this._processedMaterials = new Li(256), this._renderTargets = new Cn(256), this._materialsRenderTargets = new Cn(256), this._activeParticleSystems = new Li(256), this._activeSkeletons = new Cn(32), this._softwareSkinnedMeshes = new Cn(32), this._activeAnimatables = new Array(), this._transformMatrix = L.Zero(), this.requireLightSorting = !1, this._components = [], this._serializableComponents = [], this._transientComponents = [], this._beforeCameraUpdateStage = ei.Create(), this._beforeClearStage = ei.Create(), this._beforeRenderTargetClearStage = ei.Create(), this._gatherRenderTargetsStage = ei.Create(), this._gatherActiveCameraRenderTargetsStage = ei.Create(), this._isReadyForMeshStage = ei.Create(), this._beforeEvaluateActiveMeshStage = ei.Create(), this._evaluateSubMeshStage = ei.Create(), this._preActiveMeshStage = ei.Create(), this._cameraDrawRenderTargetStage = ei.Create(), this._beforeCameraDrawStage = ei.Create(), this._beforeRenderTargetDrawStage = ei.Create(), this._beforeRenderingGroupDrawStage = ei.Create(), this._beforeRenderingMeshStage = ei.Create(), this._afterRenderingMeshStage = ei.Create(), this._afterRenderingGroupDrawStage = ei.Create(), this._afterCameraDrawStage = ei.Create(), this._afterCameraPostProcessStage = ei.Create(), this._afterRenderTargetDrawStage = ei.Create(), this._afterRenderTargetPostProcessStage = ei.Create(), this._afterRenderStage = ei.Create(), this._pointerMoveStage = ei.Create(), this._pointerDownStage = ei.Create(), this._pointerUpStage = ei.Create(), this._geometriesByUniqueId = null, this._defaultMeshCandidates = {\n data: [],\n length: 0\n }, this._defaultSubMeshCandidates = {\n data: [],\n length: 0\n }, this._preventFreeActiveMeshesAndRenderingGroups = !1, this._activeMeshesFrozen = !1, this._activeMeshesFrozenButKeepClipping = !1, this._skipEvaluateActiveMeshesCompletely = !1, this._allowPostProcessClearColor = !0, this.getDeterministicFrameTime = () => this._engine.getTimeStep(), this._registeredActions = 0, this._blockMaterialDirtyMechanism = !1, this._perfCollector = null, this.activeCameras = [];\n const i = {\n useGeometryUniqueIdsMap: !0,\n useMaterialMeshMap: !0,\n useClonedMeshMap: !0,\n virtual: !1,\n ...t\n };\n e = this._engine = e || st.LastCreatedEngine, i.virtual ? e._virtualScenes.push(this) : (st._LastCreatedScene = this, e.scenes.push(this)), this._uid = null, this._renderingManager = new Di(this), mu && (this.postProcessManager = new mu(this)), yi() && this.attachControl(), this._createUbo(), at && (this._imageProcessingConfiguration = new at()), this.setDefaultCandidateProviders(), i.useGeometryUniqueIdsMap && (this._geometriesByUniqueId = {}), this.useMaterialMeshMap = i.useMaterialMeshMap, this.useClonedMeshMap = i.useClonedMeshMap, (!t || !t.virtual) && e.onNewSceneAddedObservable.notifyObservers(this);\n }\n /**\n * Gets a string identifying the name of the class\n * @returns \"Scene\" string\n */\n getClassName() {\n return \"Scene\";\n }\n /**\n * @internal\n */\n _getDefaultMeshCandidates() {\n return this._defaultMeshCandidates.data = this.meshes, this._defaultMeshCandidates.length = this.meshes.length, this._defaultMeshCandidates;\n }\n /**\n * @internal\n */\n _getDefaultSubMeshCandidates(e) {\n return this._defaultSubMeshCandidates.data = e.subMeshes, this._defaultSubMeshCandidates.length = e.subMeshes.length, this._defaultSubMeshCandidates;\n }\n /**\n * Sets the default candidate providers for the scene.\n * This sets the getActiveMeshCandidates, getActiveSubMeshCandidates, getIntersectingSubMeshCandidates\n * and getCollidingSubMeshCandidates to their default function\n */\n setDefaultCandidateProviders() {\n this.getActiveMeshCandidates = () => this._getDefaultMeshCandidates(), this.getActiveSubMeshCandidates = (e) => this._getDefaultSubMeshCandidates(e), this.getIntersectingSubMeshCandidates = (e, t) => this._getDefaultSubMeshCandidates(e), this.getCollidingSubMeshCandidates = (e, t) => this._getDefaultSubMeshCandidates(e);\n }\n /**\n * Gets the mesh that is currently under the pointer\n */\n get meshUnderPointer() {\n return this._inputManager.meshUnderPointer;\n }\n /**\n * Gets or sets the current on-screen X position of the pointer\n */\n get pointerX() {\n return this._inputManager.pointerX;\n }\n set pointerX(e) {\n this._inputManager.pointerX = e;\n }\n /**\n * Gets or sets the current on-screen Y position of the pointer\n */\n get pointerY() {\n return this._inputManager.pointerY;\n }\n set pointerY(e) {\n this._inputManager.pointerY = e;\n }\n /**\n * Gets the cached material (ie. the latest rendered one)\n * @returns the cached material\n */\n getCachedMaterial() {\n return this._cachedMaterial;\n }\n /**\n * Gets the cached effect (ie. the latest rendered one)\n * @returns the cached effect\n */\n getCachedEffect() {\n return this._cachedEffect;\n }\n /**\n * Gets the cached visibility state (ie. the latest rendered one)\n * @returns the cached visibility state\n */\n getCachedVisibility() {\n return this._cachedVisibility;\n }\n /**\n * Gets a boolean indicating if the current material / effect / visibility must be bind again\n * @param material defines the current material\n * @param effect defines the current effect\n * @param visibility defines the current visibility state\n * @returns true if one parameter is not cached\n */\n isCachedMaterialInvalid(e, t, i = 1) {\n return this._cachedEffect !== t || this._cachedMaterial !== e || this._cachedVisibility !== i;\n }\n /**\n * Gets the engine associated with the scene\n * @returns an Engine\n */\n getEngine() {\n return this._engine;\n }\n /**\n * Gets the total number of vertices rendered per frame\n * @returns the total number of vertices rendered per frame\n */\n getTotalVertices() {\n return this._totalVertices.current;\n }\n /**\n * Gets the performance counter for total vertices\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\n */\n get totalVerticesPerfCounter() {\n return this._totalVertices;\n }\n /**\n * Gets the total number of active indices rendered per frame (You can deduce the number of rendered triangles by dividing this number by 3)\n * @returns the total number of active indices rendered per frame\n */\n getActiveIndices() {\n return this._activeIndices.current;\n }\n /**\n * Gets the performance counter for active indices\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\n */\n get totalActiveIndicesPerfCounter() {\n return this._activeIndices;\n }\n /**\n * Gets the total number of active particles rendered per frame\n * @returns the total number of active particles rendered per frame\n */\n getActiveParticles() {\n return this._activeParticles.current;\n }\n /**\n * Gets the performance counter for active particles\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\n */\n get activeParticlesPerfCounter() {\n return this._activeParticles;\n }\n /**\n * Gets the total number of active bones rendered per frame\n * @returns the total number of active bones rendered per frame\n */\n getActiveBones() {\n return this._activeBones.current;\n }\n /**\n * Gets the performance counter for active bones\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\n */\n get activeBonesPerfCounter() {\n return this._activeBones;\n }\n /**\n * Gets the array of active meshes\n * @returns an array of AbstractMesh\n */\n getActiveMeshes() {\n return this._activeMeshes;\n }\n /**\n * Gets the animation ratio (which is 1.0 is the scene renders at 60fps and 2 if the scene renders at 30fps, etc.)\n * @returns a number\n */\n getAnimationRatio() {\n return this._animationRatio !== void 0 ? this._animationRatio : 1;\n }\n /**\n * Gets an unique Id for the current render phase\n * @returns a number\n */\n getRenderId() {\n return this._renderId;\n }\n /**\n * Gets an unique Id for the current frame\n * @returns a number\n */\n getFrameId() {\n return this._frameId;\n }\n /** Call this function if you want to manually increment the render Id*/\n incrementRenderId() {\n this._renderId++;\n }\n _createUbo() {\n this.setSceneUniformBuffer(this.createSceneUniformBuffer());\n }\n /**\n * Use this method to simulate a pointer move on a mesh\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\n * @param pickResult pickingInfo of the object wished to simulate pointer event on\n * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\n * @returns the current scene\n */\n simulatePointerMove(e, t) {\n return this._inputManager.simulatePointerMove(e, t), this;\n }\n /**\n * Use this method to simulate a pointer down on a mesh\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\n * @param pickResult pickingInfo of the object wished to simulate pointer event on\n * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\n * @returns the current scene\n */\n simulatePointerDown(e, t) {\n return this._inputManager.simulatePointerDown(e, t), this;\n }\n /**\n * Use this method to simulate a pointer up on a mesh\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\n * @param pickResult pickingInfo of the object wished to simulate pointer event on\n * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\n * @param doubleTap indicates that the pointer up event should be considered as part of a double click (false by default)\n * @returns the current scene\n */\n simulatePointerUp(e, t, i) {\n return this._inputManager.simulatePointerUp(e, t, i), this;\n }\n /**\n * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down)\n * @param pointerId defines the pointer id to use in a multi-touch scenario (0 by default)\n * @returns true if the pointer was captured\n */\n isPointerCaptured(e = 0) {\n return this._inputManager.isPointerCaptured(e);\n }\n /**\n * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp\n * @param attachUp defines if you want to attach events to pointerup\n * @param attachDown defines if you want to attach events to pointerdown\n * @param attachMove defines if you want to attach events to pointermove\n */\n attachControl(e = !0, t = !0, i = !0) {\n this._inputManager.attachControl(e, t, i);\n }\n /** Detaches all event handlers*/\n detachControl() {\n this._inputManager.detachControl();\n }\n /**\n * This function will check if the scene can be rendered (textures are loaded, shaders are compiled)\n * Delay loaded resources are not taking in account\n * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: true)\n * @returns true if all required resources are ready\n */\n isReady(e = !0) {\n var a, o;\n if (this._isDisposed)\n return !1;\n let t;\n const i = this.getEngine(), r = i.currentRenderPassId;\n i.currentRenderPassId = ((a = this.activeCamera) == null ? void 0 : a.renderPassId) ?? r;\n let s = !0;\n for (this._pendingData.length > 0 && (s = !1), (o = this.prePassRenderer) == null || o.update(), this.useOrderIndependentTransparency && this.depthPeelingRenderer && s && (s = this.depthPeelingRenderer.isReady()), e && (this._processedMaterials.reset(), this._materialsRenderTargets.reset()), t = 0; t < this.meshes.length; t++) {\n const l = this.meshes[t];\n if (!l.subMeshes || l.subMeshes.length === 0)\n continue;\n if (!l.isReady(!0)) {\n s = !1;\n continue;\n }\n const c = l.hasThinInstances || l.getClassName() === \"InstancedMesh\" || l.getClassName() === \"InstancedLinesMesh\" || i.getCaps().instancedArrays && l.instances.length > 0;\n for (const u of this._isReadyForMeshStage)\n u.action(l, c) || (s = !1);\n if (!e)\n continue;\n const h = l.material || this.defaultMaterial;\n if (h)\n if (h._storeEffectOnSubMeshes)\n for (const u of l.subMeshes) {\n const f = u.getMaterial();\n f && f.hasRenderTargetTextures && f.getRenderTargetTextures != null && this._processedMaterials.indexOf(f) === -1 && (this._processedMaterials.push(f), this._materialsRenderTargets.concatWithNoDuplicate(f.getRenderTargetTextures()));\n }\n else\n h.hasRenderTargetTextures && h.getRenderTargetTextures != null && this._processedMaterials.indexOf(h) === -1 && (this._processedMaterials.push(h), this._materialsRenderTargets.concatWithNoDuplicate(h.getRenderTargetTextures()));\n }\n if (e)\n for (t = 0; t < this._materialsRenderTargets.length; ++t)\n this._materialsRenderTargets.data[t].isReadyForRendering() || (s = !1);\n for (t = 0; t < this.geometries.length; t++)\n this.geometries[t].delayLoadState === 2 && (s = !1);\n if (this.activeCameras && this.activeCameras.length > 0)\n for (const l of this.activeCameras)\n l.isReady(!0) || (s = !1);\n else\n this.activeCamera && (this.activeCamera.isReady(!0) || (s = !1));\n for (const l of this.particleSystems)\n l.isReady() || (s = !1);\n if (this.layers)\n for (const l of this.layers)\n l.isReady() || (s = !1);\n return i.areAllEffectsReady() || (s = !1), i.currentRenderPassId = r, s;\n }\n /** Resets all cached information relative to material (including effect and visibility) */\n resetCachedMaterial() {\n this._cachedMaterial = null, this._cachedEffect = null, this._cachedVisibility = null;\n }\n /**\n * Registers a function to be called before every frame render\n * @param func defines the function to register\n */\n registerBeforeRender(e) {\n this.onBeforeRenderObservable.add(e);\n }\n /**\n * Unregisters a function called before every frame render\n * @param func defines the function to unregister\n */\n unregisterBeforeRender(e) {\n this.onBeforeRenderObservable.removeCallback(e);\n }\n /**\n * Registers a function to be called after every frame render\n * @param func defines the function to register\n */\n registerAfterRender(e) {\n this.onAfterRenderObservable.add(e);\n }\n /**\n * Unregisters a function called after every frame render\n * @param func defines the function to unregister\n */\n unregisterAfterRender(e) {\n this.onAfterRenderObservable.removeCallback(e);\n }\n _executeOnceBeforeRender(e) {\n const t = () => {\n e(), setTimeout(() => {\n this.unregisterBeforeRender(t);\n });\n };\n this.registerBeforeRender(t);\n }\n /**\n * The provided function will run before render once and will be disposed afterwards.\n * A timeout delay can be provided so that the function will be executed in N ms.\n * The timeout is using the browser's native setTimeout so time percision cannot be guaranteed.\n * @param func The function to be executed.\n * @param timeout optional delay in ms\n */\n executeOnceBeforeRender(e, t) {\n t !== void 0 ? setTimeout(() => {\n this._executeOnceBeforeRender(e);\n }, t) : this._executeOnceBeforeRender(e);\n }\n /**\n * This function can help adding any object to the list of data awaited to be ready in order to check for a complete scene loading.\n * @param data defines the object to wait for\n */\n addPendingData(e) {\n this._pendingData.push(e);\n }\n /**\n * Remove a pending data from the loading list which has previously been added with addPendingData.\n * @param data defines the object to remove from the pending list\n */\n removePendingData(e) {\n const t = this.isLoading, i = this._pendingData.indexOf(e);\n i !== -1 && this._pendingData.splice(i, 1), t && !this.isLoading && this.onDataLoadedObservable.notifyObservers(this);\n }\n /**\n * Returns the number of items waiting to be loaded\n * @returns the number of items waiting to be loaded\n */\n getWaitingItemsCount() {\n return this._pendingData.length;\n }\n /**\n * Returns a boolean indicating if the scene is still loading data\n */\n get isLoading() {\n return this._pendingData.length > 0;\n }\n /**\n * Registers a function to be executed when the scene is ready\n * @param func - the function to be executed\n * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false)\n */\n executeWhenReady(e, t = !1) {\n this.onReadyObservable.addOnce(e), this._executeWhenReadyTimeoutId === null && this._checkIsReady(t);\n }\n /**\n * Returns a promise that resolves when the scene is ready\n * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false)\n * @returns A promise that resolves when the scene is ready\n */\n whenReadyAsync(e = !1) {\n return new Promise((t) => {\n this.executeWhenReady(() => {\n t();\n }, e);\n });\n }\n /**\n * @internal\n */\n _checkIsReady(e = !1) {\n if (this._registerTransientComponents(), this.isReady(e)) {\n this.onReadyObservable.notifyObservers(this), this.onReadyObservable.clear(), this._executeWhenReadyTimeoutId = null;\n return;\n }\n if (this._isDisposed) {\n this.onReadyObservable.clear(), this._executeWhenReadyTimeoutId = null;\n return;\n }\n this._executeWhenReadyTimeoutId = setTimeout(() => {\n this.incrementRenderId(), this._checkIsReady(e);\n }, 100);\n }\n /**\n * Gets all animatable attached to the scene\n */\n get animatables() {\n return this._activeAnimatables;\n }\n /**\n * Resets the last animation time frame.\n * Useful to override when animations start running when loading a scene for the first time.\n */\n resetLastAnimationTimeFrame() {\n this._animationTimeLast = sr.Now;\n }\n // Matrix\n /**\n * Gets the current view matrix\n * @returns a Matrix\n */\n getViewMatrix() {\n return this._viewMatrix;\n }\n /**\n * Gets the current projection matrix\n * @returns a Matrix\n */\n getProjectionMatrix() {\n return this._projectionMatrix;\n }\n /**\n * Gets the current transform matrix\n * @returns a Matrix made of View * Projection\n */\n getTransformMatrix() {\n return this._transformMatrix;\n }\n /**\n * Sets the current transform matrix\n * @param viewL defines the View matrix to use\n * @param projectionL defines the Projection matrix to use\n * @param viewR defines the right View matrix to use (if provided)\n * @param projectionR defines the right Projection matrix to use (if provided)\n */\n setTransformMatrix(e, t, i, r) {\n !i && !r && this._multiviewSceneUbo && (this._multiviewSceneUbo.dispose(), this._multiviewSceneUbo = null), !(this._viewUpdateFlag === e.updateFlag && this._projectionUpdateFlag === t.updateFlag) && (this._viewUpdateFlag = e.updateFlag, this._projectionUpdateFlag = t.updateFlag, this._viewMatrix = e, this._projectionMatrix = t, this._viewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix), this._frustumPlanes ? Or.GetPlanesToRef(this._transformMatrix, this._frustumPlanes) : this._frustumPlanes = Or.GetPlanes(this._transformMatrix), this._multiviewSceneUbo && this._multiviewSceneUbo.useUbo ? this._updateMultiviewUbo(i, r) : this._sceneUbo.useUbo && (this._sceneUbo.updateMatrix(\"viewProjection\", this._transformMatrix), this._sceneUbo.updateMatrix(\"view\", this._viewMatrix), this._sceneUbo.updateMatrix(\"projection\", this._projectionMatrix)));\n }\n /**\n * Gets the uniform buffer used to store scene data\n * @returns a UniformBuffer\n */\n getSceneUniformBuffer() {\n return this._multiviewSceneUbo ? this._multiviewSceneUbo : this._sceneUbo;\n }\n /**\n * Creates a scene UBO\n * @param name name of the uniform buffer (optional, for debugging purpose only)\n * @returns a new ubo\n */\n createSceneUniformBuffer(e) {\n const t = new Ie(this._engine, void 0, !1, e ?? \"scene\");\n return t.addUniform(\"viewProjection\", 16), t.addUniform(\"view\", 16), t.addUniform(\"projection\", 16), t.addUniform(\"vEyePosition\", 4), t;\n }\n /**\n * Sets the scene ubo\n * @param ubo the ubo to set for the scene\n */\n setSceneUniformBuffer(e) {\n this._sceneUbo = e, this._viewUpdateFlag = -1, this._projectionUpdateFlag = -1;\n }\n /**\n * Gets an unique (relatively to the current scene) Id\n * @returns an unique number for the scene\n */\n getUniqueId() {\n return sf.UniqueId;\n }\n /**\n * Add a mesh to the list of scene's meshes\n * @param newMesh defines the mesh to add\n * @param recursive if all child meshes should also be added to the scene\n */\n addMesh(e, t = !1) {\n this._blockEntityCollection || (this.meshes.push(e), e._resyncLightSources(), e.parent || e._addToSceneRootNodes(), this.onNewMeshAddedObservable.notifyObservers(e), t && e.getChildMeshes().forEach((i) => {\n this.addMesh(i);\n }));\n }\n /**\n * Remove a mesh for the list of scene's meshes\n * @param toRemove defines the mesh to remove\n * @param recursive if all child meshes should also be removed from the scene\n * @returns the index where the mesh was in the mesh list\n */\n removeMesh(e, t = !1) {\n const i = this.meshes.indexOf(e);\n return i !== -1 && (this.meshes[i] = this.meshes[this.meshes.length - 1], this.meshes.pop(), e.parent || e._removeFromSceneRootNodes()), this._inputManager._invalidateMesh(e), this.onMeshRemovedObservable.notifyObservers(e), t && e.getChildMeshes().forEach((r) => {\n this.removeMesh(r);\n }), i;\n }\n /**\n * Add a transform node to the list of scene's transform nodes\n * @param newTransformNode defines the transform node to add\n */\n addTransformNode(e) {\n this._blockEntityCollection || e.getScene() === this && e._indexInSceneTransformNodesArray !== -1 || (e._indexInSceneTransformNodesArray = this.transformNodes.length, this.transformNodes.push(e), e.parent || e._addToSceneRootNodes(), this.onNewTransformNodeAddedObservable.notifyObservers(e));\n }\n /**\n * Remove a transform node for the list of scene's transform nodes\n * @param toRemove defines the transform node to remove\n * @returns the index where the transform node was in the transform node list\n */\n removeTransformNode(e) {\n const t = e._indexInSceneTransformNodesArray;\n if (t !== -1) {\n if (t !== this.transformNodes.length - 1) {\n const i = this.transformNodes[this.transformNodes.length - 1];\n this.transformNodes[t] = i, i._indexInSceneTransformNodesArray = t;\n }\n e._indexInSceneTransformNodesArray = -1, this.transformNodes.pop(), e.parent || e._removeFromSceneRootNodes();\n }\n return this.onTransformNodeRemovedObservable.notifyObservers(e), t;\n }\n /**\n * Remove a skeleton for the list of scene's skeletons\n * @param toRemove defines the skeleton to remove\n * @returns the index where the skeleton was in the skeleton list\n */\n removeSkeleton(e) {\n const t = this.skeletons.indexOf(e);\n return t !== -1 && (this.skeletons.splice(t, 1), this.onSkeletonRemovedObservable.notifyObservers(e), this._executeActiveContainerCleanup(this._activeSkeletons)), t;\n }\n /**\n * Remove a morph target for the list of scene's morph targets\n * @param toRemove defines the morph target to remove\n * @returns the index where the morph target was in the morph target list\n */\n removeMorphTargetManager(e) {\n const t = this.morphTargetManagers.indexOf(e);\n return t !== -1 && this.morphTargetManagers.splice(t, 1), t;\n }\n /**\n * Remove a light for the list of scene's lights\n * @param toRemove defines the light to remove\n * @returns the index where the light was in the light list\n */\n removeLight(e) {\n const t = this.lights.indexOf(e);\n if (t !== -1) {\n for (const i of this.meshes)\n i._removeLightSource(e, !1);\n this.lights.splice(t, 1), this.sortLightsByPriority(), e.parent || e._removeFromSceneRootNodes();\n }\n return this.onLightRemovedObservable.notifyObservers(e), t;\n }\n /**\n * Remove a camera for the list of scene's cameras\n * @param toRemove defines the camera to remove\n * @returns the index where the camera was in the camera list\n */\n removeCamera(e) {\n const t = this.cameras.indexOf(e);\n if (t !== -1 && (this.cameras.splice(t, 1), e.parent || e._removeFromSceneRootNodes()), this.activeCameras) {\n const i = this.activeCameras.indexOf(e);\n i !== -1 && this.activeCameras.splice(i, 1);\n }\n return this.activeCamera === e && (this.cameras.length > 0 ? this.activeCamera = this.cameras[0] : this.activeCamera = null), this.onCameraRemovedObservable.notifyObservers(e), t;\n }\n /**\n * Remove a particle system for the list of scene's particle systems\n * @param toRemove defines the particle system to remove\n * @returns the index where the particle system was in the particle system list\n */\n removeParticleSystem(e) {\n const t = this.particleSystems.indexOf(e);\n return t !== -1 && (this.particleSystems.splice(t, 1), this._executeActiveContainerCleanup(this._activeParticleSystems)), t;\n }\n /**\n * Remove a animation for the list of scene's animations\n * @param toRemove defines the animation to remove\n * @returns the index where the animation was in the animation list\n */\n removeAnimation(e) {\n const t = this.animations.indexOf(e);\n return t !== -1 && this.animations.splice(t, 1), t;\n }\n /**\n * Will stop the animation of the given target\n * @param target - the target\n * @param animationName - the name of the animation to stop (all animations will be stopped if both this and targetMask are empty)\n * @param targetMask - a function that determines if the animation should be stopped based on its target (all animations will be stopped if both this and animationName are empty)\n */\n stopAnimation(e, t, i) {\n }\n /**\n * Removes the given animation group from this scene.\n * @param toRemove The animation group to remove\n * @returns The index of the removed animation group\n */\n removeAnimationGroup(e) {\n const t = this.animationGroups.indexOf(e);\n return t !== -1 && this.animationGroups.splice(t, 1), t;\n }\n /**\n * Removes the given multi-material from this scene.\n * @param toRemove The multi-material to remove\n * @returns The index of the removed multi-material\n */\n removeMultiMaterial(e) {\n const t = this.multiMaterials.indexOf(e);\n return t !== -1 && this.multiMaterials.splice(t, 1), this.onMultiMaterialRemovedObservable.notifyObservers(e), t;\n }\n /**\n * Removes the given material from this scene.\n * @param toRemove The material to remove\n * @returns The index of the removed material\n */\n removeMaterial(e) {\n const t = e._indexInSceneMaterialArray;\n if (t !== -1 && t < this.materials.length) {\n if (t !== this.materials.length - 1) {\n const i = this.materials[this.materials.length - 1];\n this.materials[t] = i, i._indexInSceneMaterialArray = t;\n }\n e._indexInSceneMaterialArray = -1, this.materials.pop();\n }\n return this.onMaterialRemovedObservable.notifyObservers(e), t;\n }\n /**\n * Removes the given action manager from this scene.\n * @deprecated\n * @param toRemove The action manager to remove\n * @returns The index of the removed action manager\n */\n removeActionManager(e) {\n const t = this.actionManagers.indexOf(e);\n return t !== -1 && this.actionManagers.splice(t, 1), t;\n }\n /**\n * Removes the given texture from this scene.\n * @param toRemove The texture to remove\n * @returns The index of the removed texture\n */\n removeTexture(e) {\n const t = this.textures.indexOf(e);\n return t !== -1 && this.textures.splice(t, 1), this.onTextureRemovedObservable.notifyObservers(e), t;\n }\n /**\n * Adds the given light to this scene\n * @param newLight The light to add\n */\n addLight(e) {\n if (!this._blockEntityCollection) {\n this.lights.push(e), this.sortLightsByPriority(), e.parent || e._addToSceneRootNodes();\n for (const t of this.meshes)\n t.lightSources.indexOf(e) === -1 && (t.lightSources.push(e), t._resyncLightSources());\n this.onNewLightAddedObservable.notifyObservers(e);\n }\n }\n /**\n * Sorts the list list based on light priorities\n */\n sortLightsByPriority() {\n this.requireLightSorting && this.lights.sort(Et.CompareLightsPriority);\n }\n /**\n * Adds the given camera to this scene\n * @param newCamera The camera to add\n */\n addCamera(e) {\n this._blockEntityCollection || (this.cameras.push(e), this.onNewCameraAddedObservable.notifyObservers(e), e.parent || e._addToSceneRootNodes());\n }\n /**\n * Adds the given skeleton to this scene\n * @param newSkeleton The skeleton to add\n */\n addSkeleton(e) {\n this._blockEntityCollection || (this.skeletons.push(e), this.onNewSkeletonAddedObservable.notifyObservers(e));\n }\n /**\n * Adds the given particle system to this scene\n * @param newParticleSystem The particle system to add\n */\n addParticleSystem(e) {\n this._blockEntityCollection || this.particleSystems.push(e);\n }\n /**\n * Adds the given animation to this scene\n * @param newAnimation The animation to add\n */\n addAnimation(e) {\n this._blockEntityCollection || this.animations.push(e);\n }\n /**\n * Adds the given animation group to this scene.\n * @param newAnimationGroup The animation group to add\n */\n addAnimationGroup(e) {\n this._blockEntityCollection || this.animationGroups.push(e);\n }\n /**\n * Adds the given multi-material to this scene\n * @param newMultiMaterial The multi-material to add\n */\n addMultiMaterial(e) {\n this._blockEntityCollection || (this.multiMaterials.push(e), this.onNewMultiMaterialAddedObservable.notifyObservers(e));\n }\n /**\n * Adds the given material to this scene\n * @param newMaterial The material to add\n */\n addMaterial(e) {\n this._blockEntityCollection || e.getScene() === this && e._indexInSceneMaterialArray !== -1 || (e._indexInSceneMaterialArray = this.materials.length, this.materials.push(e), this.onNewMaterialAddedObservable.notifyObservers(e));\n }\n /**\n * Adds the given morph target to this scene\n * @param newMorphTargetManager The morph target to add\n */\n addMorphTargetManager(e) {\n this._blockEntityCollection || this.morphTargetManagers.push(e);\n }\n /**\n * Adds the given geometry to this scene\n * @param newGeometry The geometry to add\n */\n addGeometry(e) {\n this._blockEntityCollection || (this._geometriesByUniqueId && (this._geometriesByUniqueId[e.uniqueId] = this.geometries.length), this.geometries.push(e));\n }\n /**\n * Adds the given action manager to this scene\n * @deprecated\n * @param newActionManager The action manager to add\n */\n addActionManager(e) {\n this.actionManagers.push(e);\n }\n /**\n * Adds the given texture to this scene.\n * @param newTexture The texture to add\n */\n addTexture(e) {\n this._blockEntityCollection || (this.textures.push(e), this.onNewTextureAddedObservable.notifyObservers(e));\n }\n /**\n * Switch active camera\n * @param newCamera defines the new active camera\n * @param attachControl defines if attachControl must be called for the new active camera (default: true)\n */\n switchActiveCamera(e, t = !0) {\n this._engine.getInputElement() && (this.activeCamera && this.activeCamera.detachControl(), this.activeCamera = e, t && e.attachControl());\n }\n /**\n * sets the active camera of the scene using its Id\n * @param id defines the camera's Id\n * @returns the new active camera or null if none found.\n */\n setActiveCameraById(e) {\n const t = this.getCameraById(e);\n return t ? (this.activeCamera = t, t) : null;\n }\n /**\n * sets the active camera of the scene using its name\n * @param name defines the camera's name\n * @returns the new active camera or null if none found.\n */\n setActiveCameraByName(e) {\n const t = this.getCameraByName(e);\n return t ? (this.activeCamera = t, t) : null;\n }\n /**\n * get an animation group using its name\n * @param name defines the material's name\n * @returns the animation group or null if none found.\n */\n getAnimationGroupByName(e) {\n for (let t = 0; t < this.animationGroups.length; t++)\n if (this.animationGroups[t].name === e)\n return this.animationGroups[t];\n return null;\n }\n _getMaterial(e, t) {\n for (let i = 0; i < this.materials.length; i++) {\n const r = this.materials[i];\n if (t(r))\n return r;\n }\n if (e)\n for (let i = 0; i < this.multiMaterials.length; i++) {\n const r = this.multiMaterials[i];\n if (t(r))\n return r;\n }\n return null;\n }\n /**\n * Get a material using its unique id\n * @param uniqueId defines the material's unique id\n * @param allowMultiMaterials determines whether multimaterials should be considered\n * @returns the material or null if none found.\n */\n getMaterialByUniqueID(e, t = !1) {\n return this._getMaterial(t, (i) => i.uniqueId === e);\n }\n /**\n * get a material using its id\n * @param id defines the material's Id\n * @param allowMultiMaterials determines whether multimaterials should be considered\n * @returns the material or null if none found.\n */\n getMaterialById(e, t = !1) {\n return this._getMaterial(t, (i) => i.id === e);\n }\n /**\n * Gets a material using its name\n * @param name defines the material's name\n * @param allowMultiMaterials determines whether multimaterials should be considered\n * @returns the material or null if none found.\n */\n getMaterialByName(e, t = !1) {\n return this._getMaterial(t, (i) => i.name === e);\n }\n /**\n * Gets a last added material using a given id\n * @param id defines the material's id\n * @param allowMultiMaterials determines whether multimaterials should be considered\n * @returns the last material with the given id or null if none found.\n */\n getLastMaterialById(e, t = !1) {\n for (let i = this.materials.length - 1; i >= 0; i--)\n if (this.materials[i].id === e)\n return this.materials[i];\n if (t) {\n for (let i = this.multiMaterials.length - 1; i >= 0; i--)\n if (this.multiMaterials[i].id === e)\n return this.multiMaterials[i];\n }\n return null;\n }\n /**\n * Get a texture using its unique id\n * @param uniqueId defines the texture's unique id\n * @returns the texture or null if none found.\n */\n getTextureByUniqueId(e) {\n for (let t = 0; t < this.textures.length; t++)\n if (this.textures[t].uniqueId === e)\n return this.textures[t];\n return null;\n }\n /**\n * Gets a texture using its name\n * @param name defines the texture's name\n * @returns the texture or null if none found.\n */\n getTextureByName(e) {\n for (let t = 0; t < this.textures.length; t++)\n if (this.textures[t].name === e)\n return this.textures[t];\n return null;\n }\n /**\n * Gets a camera using its Id\n * @param id defines the Id to look for\n * @returns the camera or null if not found\n */\n getCameraById(e) {\n for (let t = 0; t < this.cameras.length; t++)\n if (this.cameras[t].id === e)\n return this.cameras[t];\n return null;\n }\n /**\n * Gets a camera using its unique Id\n * @param uniqueId defines the unique Id to look for\n * @returns the camera or null if not found\n */\n getCameraByUniqueId(e) {\n for (let t = 0; t < this.cameras.length; t++)\n if (this.cameras[t].uniqueId === e)\n return this.cameras[t];\n return null;\n }\n /**\n * Gets a camera using its name\n * @param name defines the camera's name\n * @returns the camera or null if none found.\n */\n getCameraByName(e) {\n for (let t = 0; t < this.cameras.length; t++)\n if (this.cameras[t].name === e)\n return this.cameras[t];\n return null;\n }\n /**\n * Gets a bone using its Id\n * @param id defines the bone's Id\n * @returns the bone or null if not found\n */\n getBoneById(e) {\n for (let t = 0; t < this.skeletons.length; t++) {\n const i = this.skeletons[t];\n for (let r = 0; r < i.bones.length; r++)\n if (i.bones[r].id === e)\n return i.bones[r];\n }\n return null;\n }\n /**\n * Gets a bone using its id\n * @param name defines the bone's name\n * @returns the bone or null if not found\n */\n getBoneByName(e) {\n for (let t = 0; t < this.skeletons.length; t++) {\n const i = this.skeletons[t];\n for (let r = 0; r < i.bones.length; r++)\n if (i.bones[r].name === e)\n return i.bones[r];\n }\n return null;\n }\n /**\n * Gets a light node using its name\n * @param name defines the light's name\n * @returns the light or null if none found.\n */\n getLightByName(e) {\n for (let t = 0; t < this.lights.length; t++)\n if (this.lights[t].name === e)\n return this.lights[t];\n return null;\n }\n /**\n * Gets a light node using its Id\n * @param id defines the light's Id\n * @returns the light or null if none found.\n */\n getLightById(e) {\n for (let t = 0; t < this.lights.length; t++)\n if (this.lights[t].id === e)\n return this.lights[t];\n return null;\n }\n /**\n * Gets a light node using its scene-generated unique Id\n * @param uniqueId defines the light's unique Id\n * @returns the light or null if none found.\n */\n getLightByUniqueId(e) {\n for (let t = 0; t < this.lights.length; t++)\n if (this.lights[t].uniqueId === e)\n return this.lights[t];\n return null;\n }\n /**\n * Gets a particle system by Id\n * @param id defines the particle system Id\n * @returns the corresponding system or null if none found\n */\n getParticleSystemById(e) {\n for (let t = 0; t < this.particleSystems.length; t++)\n if (this.particleSystems[t].id === e)\n return this.particleSystems[t];\n return null;\n }\n /**\n * Gets a geometry using its Id\n * @param id defines the geometry's Id\n * @returns the geometry or null if none found.\n */\n getGeometryById(e) {\n for (let t = 0; t < this.geometries.length; t++)\n if (this.geometries[t].id === e)\n return this.geometries[t];\n return null;\n }\n _getGeometryByUniqueId(e) {\n if (this._geometriesByUniqueId) {\n const t = this._geometriesByUniqueId[e];\n if (t !== void 0)\n return this.geometries[t];\n } else\n for (let t = 0; t < this.geometries.length; t++)\n if (this.geometries[t].uniqueId === e)\n return this.geometries[t];\n return null;\n }\n /**\n * Add a new geometry to this scene\n * @param geometry defines the geometry to be added to the scene.\n * @param force defines if the geometry must be pushed even if a geometry with this id already exists\n * @returns a boolean defining if the geometry was added or not\n */\n pushGeometry(e, t) {\n return !t && this._getGeometryByUniqueId(e.uniqueId) ? !1 : (this.addGeometry(e), this.onNewGeometryAddedObservable.notifyObservers(e), !0);\n }\n /**\n * Removes an existing geometry\n * @param geometry defines the geometry to be removed from the scene\n * @returns a boolean defining if the geometry was removed or not\n */\n removeGeometry(e) {\n let t;\n if (this._geometriesByUniqueId) {\n if (t = this._geometriesByUniqueId[e.uniqueId], t === void 0)\n return !1;\n } else if (t = this.geometries.indexOf(e), t < 0)\n return !1;\n if (t !== this.geometries.length - 1) {\n const i = this.geometries[this.geometries.length - 1];\n i && (this.geometries[t] = i, this._geometriesByUniqueId && (this._geometriesByUniqueId[i.uniqueId] = t));\n }\n return this._geometriesByUniqueId && (this._geometriesByUniqueId[e.uniqueId] = void 0), this.geometries.pop(), this.onGeometryRemovedObservable.notifyObservers(e), !0;\n }\n /**\n * Gets the list of geometries attached to the scene\n * @returns an array of Geometry\n */\n getGeometries() {\n return this.geometries;\n }\n /**\n * Gets the first added mesh found of a given Id\n * @param id defines the Id to search for\n * @returns the mesh found or null if not found at all\n */\n getMeshById(e) {\n for (let t = 0; t < this.meshes.length; t++)\n if (this.meshes[t].id === e)\n return this.meshes[t];\n return null;\n }\n /**\n * Gets a list of meshes using their Id\n * @param id defines the Id to search for\n * @returns a list of meshes\n */\n getMeshesById(e) {\n return this.meshes.filter(function(t) {\n return t.id === e;\n });\n }\n /**\n * Gets the first added transform node found of a given Id\n * @param id defines the Id to search for\n * @returns the found transform node or null if not found at all.\n */\n getTransformNodeById(e) {\n for (let t = 0; t < this.transformNodes.length; t++)\n if (this.transformNodes[t].id === e)\n return this.transformNodes[t];\n return null;\n }\n /**\n * Gets a transform node with its auto-generated unique Id\n * @param uniqueId defines the unique Id to search for\n * @returns the found transform node or null if not found at all.\n */\n getTransformNodeByUniqueId(e) {\n for (let t = 0; t < this.transformNodes.length; t++)\n if (this.transformNodes[t].uniqueId === e)\n return this.transformNodes[t];\n return null;\n }\n /**\n * Gets a list of transform nodes using their Id\n * @param id defines the Id to search for\n * @returns a list of transform nodes\n */\n getTransformNodesById(e) {\n return this.transformNodes.filter(function(t) {\n return t.id === e;\n });\n }\n /**\n * Gets a mesh with its auto-generated unique Id\n * @param uniqueId defines the unique Id to search for\n * @returns the found mesh or null if not found at all.\n */\n getMeshByUniqueId(e) {\n for (let t = 0; t < this.meshes.length; t++)\n if (this.meshes[t].uniqueId === e)\n return this.meshes[t];\n return null;\n }\n /**\n * Gets a the last added mesh using a given Id\n * @param id defines the Id to search for\n * @returns the found mesh or null if not found at all.\n */\n getLastMeshById(e) {\n for (let t = this.meshes.length - 1; t >= 0; t--)\n if (this.meshes[t].id === e)\n return this.meshes[t];\n return null;\n }\n /**\n * Gets a the last transform node using a given Id\n * @param id defines the Id to search for\n * @returns the found mesh or null if not found at all.\n */\n getLastTransformNodeById(e) {\n for (let t = this.transformNodes.length - 1; t >= 0; t--)\n if (this.transformNodes[t].id === e)\n return this.transformNodes[t];\n return null;\n }\n /**\n * Gets a the last added node (Mesh, Camera, Light) using a given Id\n * @param id defines the Id to search for\n * @returns the found node or null if not found at all\n */\n getLastEntryById(e) {\n let t;\n for (t = this.meshes.length - 1; t >= 0; t--)\n if (this.meshes[t].id === e)\n return this.meshes[t];\n for (t = this.transformNodes.length - 1; t >= 0; t--)\n if (this.transformNodes[t].id === e)\n return this.transformNodes[t];\n for (t = this.cameras.length - 1; t >= 0; t--)\n if (this.cameras[t].id === e)\n return this.cameras[t];\n for (t = this.lights.length - 1; t >= 0; t--)\n if (this.lights[t].id === e)\n return this.lights[t];\n return null;\n }\n /**\n * Gets a node (Mesh, Camera, Light) using a given Id\n * @param id defines the Id to search for\n * @returns the found node or null if not found at all\n */\n getNodeById(e) {\n const t = this.getMeshById(e);\n if (t)\n return t;\n const i = this.getTransformNodeById(e);\n if (i)\n return i;\n const r = this.getLightById(e);\n if (r)\n return r;\n const s = this.getCameraById(e);\n if (s)\n return s;\n const a = this.getBoneById(e);\n return a || null;\n }\n /**\n * Gets a node (Mesh, Camera, Light) using a given name\n * @param name defines the name to search for\n * @returns the found node or null if not found at all.\n */\n getNodeByName(e) {\n const t = this.getMeshByName(e);\n if (t)\n return t;\n const i = this.getTransformNodeByName(e);\n if (i)\n return i;\n const r = this.getLightByName(e);\n if (r)\n return r;\n const s = this.getCameraByName(e);\n if (s)\n return s;\n const a = this.getBoneByName(e);\n return a || null;\n }\n /**\n * Gets a mesh using a given name\n * @param name defines the name to search for\n * @returns the found mesh or null if not found at all.\n */\n getMeshByName(e) {\n for (let t = 0; t < this.meshes.length; t++)\n if (this.meshes[t].name === e)\n return this.meshes[t];\n return null;\n }\n /**\n * Gets a transform node using a given name\n * @param name defines the name to search for\n * @returns the found transform node or null if not found at all.\n */\n getTransformNodeByName(e) {\n for (let t = 0; t < this.transformNodes.length; t++)\n if (this.transformNodes[t].name === e)\n return this.transformNodes[t];\n return null;\n }\n /**\n * Gets a skeleton using a given Id (if many are found, this function will pick the last one)\n * @param id defines the Id to search for\n * @returns the found skeleton or null if not found at all.\n */\n getLastSkeletonById(e) {\n for (let t = this.skeletons.length - 1; t >= 0; t--)\n if (this.skeletons[t].id === e)\n return this.skeletons[t];\n return null;\n }\n /**\n * Gets a skeleton using a given auto generated unique id\n * @param uniqueId defines the unique id to search for\n * @returns the found skeleton or null if not found at all.\n */\n getSkeletonByUniqueId(e) {\n for (let t = 0; t < this.skeletons.length; t++)\n if (this.skeletons[t].uniqueId === e)\n return this.skeletons[t];\n return null;\n }\n /**\n * Gets a skeleton using a given id (if many are found, this function will pick the first one)\n * @param id defines the id to search for\n * @returns the found skeleton or null if not found at all.\n */\n getSkeletonById(e) {\n for (let t = 0; t < this.skeletons.length; t++)\n if (this.skeletons[t].id === e)\n return this.skeletons[t];\n return null;\n }\n /**\n * Gets a skeleton using a given name\n * @param name defines the name to search for\n * @returns the found skeleton or null if not found at all.\n */\n getSkeletonByName(e) {\n for (let t = 0; t < this.skeletons.length; t++)\n if (this.skeletons[t].name === e)\n return this.skeletons[t];\n return null;\n }\n /**\n * Gets a morph target manager using a given id (if many are found, this function will pick the last one)\n * @param id defines the id to search for\n * @returns the found morph target manager or null if not found at all.\n */\n getMorphTargetManagerById(e) {\n for (let t = 0; t < this.morphTargetManagers.length; t++)\n if (this.morphTargetManagers[t].uniqueId === e)\n return this.morphTargetManagers[t];\n return null;\n }\n /**\n * Gets a morph target using a given id (if many are found, this function will pick the first one)\n * @param id defines the id to search for\n * @returns the found morph target or null if not found at all.\n */\n getMorphTargetById(e) {\n for (let t = 0; t < this.morphTargetManagers.length; ++t) {\n const i = this.morphTargetManagers[t];\n for (let r = 0; r < i.numTargets; ++r) {\n const s = i.getTarget(r);\n if (s.id === e)\n return s;\n }\n }\n return null;\n }\n /**\n * Gets a morph target using a given name (if many are found, this function will pick the first one)\n * @param name defines the name to search for\n * @returns the found morph target or null if not found at all.\n */\n getMorphTargetByName(e) {\n for (let t = 0; t < this.morphTargetManagers.length; ++t) {\n const i = this.morphTargetManagers[t];\n for (let r = 0; r < i.numTargets; ++r) {\n const s = i.getTarget(r);\n if (s.name === e)\n return s;\n }\n }\n return null;\n }\n /**\n * Gets a post process using a given name (if many are found, this function will pick the first one)\n * @param name defines the name to search for\n * @returns the found post process or null if not found at all.\n */\n getPostProcessByName(e) {\n for (let t = 0; t < this.postProcesses.length; ++t) {\n const i = this.postProcesses[t];\n if (i.name === e)\n return i;\n }\n return null;\n }\n /**\n * Gets a boolean indicating if the given mesh is active\n * @param mesh defines the mesh to look for\n * @returns true if the mesh is in the active list\n */\n isActiveMesh(e) {\n return this._activeMeshes.indexOf(e) !== -1;\n }\n /**\n * Return a unique id as a string which can serve as an identifier for the scene\n */\n get uid() {\n return this._uid || (this._uid = ge.RandomId()), this._uid;\n }\n /**\n * Add an externally attached data from its key.\n * This method call will fail and return false, if such key already exists.\n * If you don't care and just want to get the data no matter what, use the more convenient getOrAddExternalDataWithFactory() method.\n * @param key the unique key that identifies the data\n * @param data the data object to associate to the key for this Engine instance\n * @returns true if no such key were already present and the data was added successfully, false otherwise\n */\n addExternalData(e, t) {\n return this._externalData || (this._externalData = new Qp()), this._externalData.add(e, t);\n }\n /**\n * Get an externally attached data from its key\n * @param key the unique key that identifies the data\n * @returns the associated data, if present (can be null), or undefined if not present\n */\n getExternalData(e) {\n return this._externalData ? this._externalData.get(e) : null;\n }\n /**\n * Get an externally attached data from its key, create it using a factory if it's not already present\n * @param key the unique key that identifies the data\n * @param factory the factory that will be called to create the instance if and only if it doesn't exists\n * @returns the associated data, can be null if the factory returned null.\n */\n getOrAddExternalDataWithFactory(e, t) {\n return this._externalData || (this._externalData = new Qp()), this._externalData.getOrAddWithFactory(e, t);\n }\n /**\n * Remove an externally attached data from the Engine instance\n * @param key the unique key that identifies the data\n * @returns true if the data was successfully removed, false if it doesn't exist\n */\n removeExternalData(e) {\n return this._externalData.remove(e);\n }\n _evaluateSubMesh(e, t, i, r) {\n if (r || e.isInFrustum(this._frustumPlanes)) {\n for (const a of this._evaluateSubMeshStage)\n a.action(t, e);\n const s = e.getMaterial();\n s != null && (s.hasRenderTargetTextures && s.getRenderTargetTextures != null && this._processedMaterials.indexOf(s) === -1 && (this._processedMaterials.push(s), this._materialsRenderTargets.concatWithNoDuplicate(s.getRenderTargetTextures())), this._renderingManager.dispatch(e, t, s));\n }\n }\n /**\n * Clear the processed materials smart array preventing retention point in material dispose.\n */\n freeProcessedMaterials() {\n this._processedMaterials.dispose();\n }\n /** Gets or sets a boolean blocking all the calls to freeActiveMeshes and freeRenderingGroups\n * It can be used in order to prevent going through methods freeRenderingGroups and freeActiveMeshes several times to improve performance\n * when disposing several meshes in a row or a hierarchy of meshes.\n * When used, it is the responsibility of the user to blockfreeActiveMeshesAndRenderingGroups back to false.\n */\n get blockfreeActiveMeshesAndRenderingGroups() {\n return this._preventFreeActiveMeshesAndRenderingGroups;\n }\n set blockfreeActiveMeshesAndRenderingGroups(e) {\n this._preventFreeActiveMeshesAndRenderingGroups !== e && (e && (this.freeActiveMeshes(), this.freeRenderingGroups()), this._preventFreeActiveMeshesAndRenderingGroups = e);\n }\n /**\n * Clear the active meshes smart array preventing retention point in mesh dispose.\n */\n freeActiveMeshes() {\n if (!this.blockfreeActiveMeshesAndRenderingGroups && (this._activeMeshes.dispose(), this.activeCamera && this.activeCamera._activeMeshes && this.activeCamera._activeMeshes.dispose(), this.activeCameras))\n for (let e = 0; e < this.activeCameras.length; e++) {\n const t = this.activeCameras[e];\n t && t._activeMeshes && t._activeMeshes.dispose();\n }\n }\n /**\n * Clear the info related to rendering groups preventing retention points during dispose.\n */\n freeRenderingGroups() {\n if (!this.blockfreeActiveMeshesAndRenderingGroups && (this._renderingManager && this._renderingManager.freeRenderingGroups(), this.textures))\n for (let e = 0; e < this.textures.length; e++) {\n const t = this.textures[e];\n t && t.renderList && t.freeRenderingGroups();\n }\n }\n /** @internal */\n _isInIntermediateRendering() {\n return this._intermediateRendering;\n }\n /**\n * Use this function to stop evaluating active meshes. The current list will be keep alive between frames\n * @param skipEvaluateActiveMeshes defines an optional boolean indicating that the evaluate active meshes step must be completely skipped\n * @param onSuccess optional success callback\n * @param onError optional error callback\n * @param freezeMeshes defines if meshes should be frozen (true by default)\n * @param keepFrustumCulling defines if you want to keep running the frustum clipping (false by default)\n * @returns the current scene\n */\n freezeActiveMeshes(e = !1, t, i, r = !0, s = !1) {\n return this.executeWhenReady(() => {\n if (!this.activeCamera) {\n i && i(\"No active camera found\");\n return;\n }\n if (this._frustumPlanes || this.updateTransformMatrix(), this._evaluateActiveMeshes(), this._activeMeshesFrozen = !0, this._activeMeshesFrozenButKeepClipping = s, this._skipEvaluateActiveMeshesCompletely = e, r)\n for (let a = 0; a < this._activeMeshes.length; a++)\n this._activeMeshes.data[a]._freeze();\n t && t();\n }), this;\n }\n /**\n * Use this function to restart evaluating active meshes on every frame\n * @returns the current scene\n */\n unfreezeActiveMeshes() {\n for (let e = 0; e < this.meshes.length; e++) {\n const t = this.meshes[e];\n t._internalAbstractMeshDataInfo && (t._internalAbstractMeshDataInfo._isActive = !1);\n }\n for (let e = 0; e < this._activeMeshes.length; e++)\n this._activeMeshes.data[e]._unFreeze();\n return this._activeMeshesFrozen = !1, this;\n }\n _executeActiveContainerCleanup(e) {\n !(this._engine.snapshotRendering && this._engine.snapshotRenderingMode === 1) && this._activeMeshesFrozen && this._activeMeshes.length || this.onBeforeRenderObservable.addOnce(() => e.dispose());\n }\n _evaluateActiveMeshes() {\n var i;\n if (this._engine.snapshotRendering && this._engine.snapshotRenderingMode === 1) {\n this._activeMeshes.length > 0 && ((i = this.activeCamera) == null || i._activeMeshes.reset(), this._activeMeshes.reset(), this._renderingManager.reset(), this._processedMaterials.reset(), this._activeParticleSystems.reset(), this._activeSkeletons.reset(), this._softwareSkinnedMeshes.reset());\n return;\n }\n if (this._activeMeshesFrozen && this._activeMeshes.length) {\n if (!this._skipEvaluateActiveMeshesCompletely) {\n const r = this._activeMeshes.length;\n for (let s = 0; s < r; s++)\n this._activeMeshes.data[s].computeWorldMatrix();\n }\n if (this._activeParticleSystems) {\n const r = this._activeParticleSystems.length;\n for (let s = 0; s < r; s++)\n this._activeParticleSystems.data[s].animate();\n }\n this._renderingManager.resetSprites();\n return;\n }\n if (!this.activeCamera)\n return;\n this.onBeforeActiveMeshesEvaluationObservable.notifyObservers(this), this.activeCamera._activeMeshes.reset(), this._activeMeshes.reset(), this._renderingManager.reset(), this._processedMaterials.reset(), this._activeParticleSystems.reset(), this._activeSkeletons.reset(), this._softwareSkinnedMeshes.reset(), this._materialsRenderTargets.reset();\n for (const r of this._beforeEvaluateActiveMeshStage)\n r.action();\n const e = this.getActiveMeshCandidates(), t = e.length;\n for (let r = 0; r < t; r++) {\n const s = e.data[r];\n if (s._internalAbstractMeshDataInfo._currentLODIsUpToDate = !1, s.isBlocked || (this._totalVertices.addCount(s.getTotalVertices(), !1), !s.isReady() || !s.isEnabled() || s.scaling.hasAZeroComponent))\n continue;\n s.computeWorldMatrix(), s.actionManager && s.actionManager.hasSpecificTriggers2(12, 13) && this._meshesForIntersections.pushNoDuplicate(s);\n let a = this.customLODSelector ? this.customLODSelector(s, this.activeCamera) : s.getLOD(this.activeCamera);\n if (s._internalAbstractMeshDataInfo._currentLOD = a, s._internalAbstractMeshDataInfo._currentLODIsUpToDate = !0, a != null && (a !== s && a.billboardMode !== 0 && a.computeWorldMatrix(), s._preActivate(), s.isVisible && s.visibility > 0 && s.layerMask & this.activeCamera.layerMask && (this._skipFrustumClipping || s.alwaysSelectAsActiveMesh || s.isInFrustum(this._frustumPlanes)))) {\n this._activeMeshes.push(s), this.activeCamera._activeMeshes.push(s), a !== s && a._activate(this._renderId, !1);\n for (const o of this._preActiveMeshStage)\n o.action(s);\n s._activate(this._renderId, !1) && (s.isAnInstance ? s._internalAbstractMeshDataInfo._actAsRegularMesh && (a = s) : a._internalAbstractMeshDataInfo._onlyForInstances = !1, a._internalAbstractMeshDataInfo._isActive = !0, this._activeMesh(s, a)), s._postActivate();\n }\n }\n if (this.onAfterActiveMeshesEvaluationObservable.notifyObservers(this), this.particlesEnabled) {\n this.onBeforeParticlesRenderingObservable.notifyObservers(this);\n for (let r = 0; r < this.particleSystems.length; r++) {\n const s = this.particleSystems[r];\n if (!s.isStarted() || !s.emitter)\n continue;\n const a = s.emitter;\n (!a.position || a.isEnabled()) && (this._activeParticleSystems.push(s), s.animate(), this._renderingManager.dispatchParticles(s));\n }\n this.onAfterParticlesRenderingObservable.notifyObservers(this);\n }\n }\n _activeMesh(e, t) {\n this._skeletonsEnabled && t.skeleton !== null && t.skeleton !== void 0 && (this._activeSkeletons.pushNoDuplicate(t.skeleton) && (t.skeleton.prepare(), this._activeBones.addCount(t.skeleton.bones.length, !1)), t.computeBonesUsingShaders || this._softwareSkinnedMeshes.pushNoDuplicate(t));\n let i = e.hasInstances || e.isAnInstance || this.dispatchAllSubMeshesOfActiveMeshes || this._skipFrustumClipping || t.alwaysSelectAsActiveMesh;\n if (t && t.subMeshes && t.subMeshes.length > 0) {\n const r = this.getActiveSubMeshCandidates(t), s = r.length;\n i = i || s === 1;\n for (let a = 0; a < s; a++) {\n const o = r.data[a];\n this._evaluateSubMesh(o, t, e, i);\n }\n }\n }\n /**\n * Update the transform matrix to update from the current active camera\n * @param force defines a boolean used to force the update even if cache is up to date\n */\n updateTransformMatrix(e) {\n const t = this.activeCamera;\n if (t)\n if (t._renderingMultiview) {\n const i = t._rigCameras[0], r = t._rigCameras[1];\n this.setTransformMatrix(i.getViewMatrix(), i.getProjectionMatrix(e), r.getViewMatrix(), r.getProjectionMatrix(e));\n } else\n this.setTransformMatrix(t.getViewMatrix(), t.getProjectionMatrix(e));\n }\n _bindFrameBuffer(e, t = !0) {\n e && e._multiviewTexture ? e._multiviewTexture._bindFrameBuffer() : e && e.outputRenderTarget ? e.outputRenderTarget._bindFrameBuffer() : this._engine._currentFrameBufferIsDefaultFrameBuffer() || this._engine.restoreDefaultFramebuffer(), t && this._clearFrameBuffer(e);\n }\n _clearFrameBuffer(e) {\n if (!(e && e._multiviewTexture))\n if (e && e.outputRenderTarget && !e._renderingMultiview) {\n const t = e.outputRenderTarget;\n t.onClearObservable.hasObservers() ? t.onClearObservable.notifyObservers(this._engine) : !t.skipInitialClear && !e.isRightCamera && (this.autoClear && this._engine.clear(t.clearColor || this.clearColor, !t._cleared, !0, !0), t._cleared = !0);\n } else\n this._defaultFrameBufferCleared ? this._engine.clear(null, !1, !0, !0) : (this._defaultFrameBufferCleared = !0, this._clear());\n }\n /**\n * @internal\n */\n _renderForCamera(e, t, i = !0) {\n var a;\n if (e && e._skipRendering)\n return;\n const r = this._engine;\n if (this._activeCamera = e, !this.activeCamera)\n throw new Error(\"Active camera not set\");\n if (r.setViewport(this.activeCamera.viewport), this.resetCachedMaterial(), this._renderId++, !this.prePass && i) {\n let o = !0;\n e._renderingMultiview && e.outputRenderTarget && (o = e.outputRenderTarget.skipInitialClear, this.autoClear && (this._defaultFrameBufferCleared = !1, e.outputRenderTarget.skipInitialClear = !1)), this._bindFrameBuffer(this._activeCamera), e._renderingMultiview && e.outputRenderTarget && (e.outputRenderTarget.skipInitialClear = o);\n }\n this.updateTransformMatrix(), this.onBeforeCameraRenderObservable.notifyObservers(this.activeCamera), this._evaluateActiveMeshes();\n for (let o = 0; o < this._softwareSkinnedMeshes.length; o++) {\n const l = this._softwareSkinnedMeshes.data[o];\n l.applySkeleton(l.skeleton);\n }\n this.onBeforeRenderTargetsRenderObservable.notifyObservers(this), this._renderTargets.concatWithNoDuplicate(this._materialsRenderTargets), e.customRenderTargets && e.customRenderTargets.length > 0 && this._renderTargets.concatWithNoDuplicate(e.customRenderTargets), t && t.customRenderTargets && t.customRenderTargets.length > 0 && this._renderTargets.concatWithNoDuplicate(t.customRenderTargets), this.environmentTexture && this.environmentTexture.isRenderTarget && this._renderTargets.pushNoDuplicate(this.environmentTexture);\n for (const o of this._gatherActiveCameraRenderTargetsStage)\n o.action(this._renderTargets);\n let s = !1;\n if (this.renderTargetsEnabled) {\n if (this._intermediateRendering = !0, this._renderTargets.length > 0) {\n ge.StartPerformanceCounter(\"Render targets\", this._renderTargets.length > 0);\n for (let o = 0; o < this._renderTargets.length; o++) {\n const l = this._renderTargets.data[o];\n if (l._shouldRender()) {\n this._renderId++;\n const c = l.activeCamera && l.activeCamera !== this.activeCamera;\n l.render(c, this.dumpNextRenderTargets), s = !0;\n }\n }\n ge.EndPerformanceCounter(\"Render targets\", this._renderTargets.length > 0), this._renderId++;\n }\n for (const o of this._cameraDrawRenderTargetStage)\n s = o.action(this.activeCamera) || s;\n this._intermediateRendering = !1;\n }\n this._engine.currentRenderPassId = ((a = e.outputRenderTarget) == null ? void 0 : a.renderPassId) ?? e.renderPassId ?? 0, s && !this.prePass && (this._bindFrameBuffer(this._activeCamera, !1), this.updateTransformMatrix()), this.onAfterRenderTargetsRenderObservable.notifyObservers(this), this.postProcessManager && !e._multiviewTexture && !this.prePass && this.postProcessManager._prepareFrame();\n for (const o of this._beforeCameraDrawStage)\n o.action(this.activeCamera);\n this.onBeforeDrawPhaseObservable.notifyObservers(this), r.snapshotRendering && r.snapshotRenderingMode === 1 && this.finalizeSceneUbo(), this._renderingManager.render(null, null, !0, !0), this.onAfterDrawPhaseObservable.notifyObservers(this);\n for (const o of this._afterCameraDrawStage)\n o.action(this.activeCamera);\n if (this.postProcessManager && !e._multiviewTexture) {\n const o = e.outputRenderTarget ? e.outputRenderTarget.renderTarget : void 0;\n this.postProcessManager._finalizeFrame(e.isIntermediate, o);\n }\n for (const o of this._afterCameraPostProcessStage)\n o.action(this.activeCamera);\n this._renderTargets.reset(), this.onAfterCameraRenderObservable.notifyObservers(this.activeCamera);\n }\n _processSubCameras(e, t = !0) {\n if (e.cameraRigMode === 0 || e._renderingMultiview) {\n e._renderingMultiview && !this._multiviewSceneUbo && this._createMultiviewUbo(), this._renderForCamera(e, void 0, t), this.onAfterRenderCameraObservable.notifyObservers(e);\n return;\n }\n if (e._useMultiviewToSingleView)\n this._renderMultiviewToSingleView(e);\n else {\n this.onBeforeCameraRenderObservable.notifyObservers(e);\n for (let i = 0; i < e._rigCameras.length; i++)\n this._renderForCamera(e._rigCameras[i], e);\n }\n this._activeCamera = e, this.updateTransformMatrix(), this.onAfterRenderCameraObservable.notifyObservers(e);\n }\n _checkIntersections() {\n for (let e = 0; e < this._meshesForIntersections.length; e++) {\n const t = this._meshesForIntersections.data[e];\n if (t.actionManager)\n for (let i = 0; t.actionManager && i < t.actionManager.actions.length; i++) {\n const r = t.actionManager.actions[i];\n if (r.trigger === 12 || r.trigger === 13) {\n const s = r.getTriggerParameter(), a = s.mesh ? s.mesh : s, o = a.intersectsMesh(t, s.usePreciseIntersection), l = t._intersectionsInProgress.indexOf(a);\n o && l === -1 ? r.trigger === 12 ? (r._executeCurrent(Ci.CreateNew(t, void 0, a)), t._intersectionsInProgress.push(a)) : r.trigger === 13 && t._intersectionsInProgress.push(a) : !o && l > -1 && (r.trigger === 13 && r._executeCurrent(Ci.CreateNew(t, void 0, a)), (!t.actionManager.hasSpecificTrigger(13, (c) => {\n const h = c.mesh ? c.mesh : c;\n return a === h;\n }) || r.trigger === 13) && t._intersectionsInProgress.splice(l, 1));\n }\n }\n }\n }\n /**\n * @internal\n */\n _advancePhysicsEngineStep(e) {\n }\n /** @internal */\n _animate(e) {\n }\n /** Execute all animations (for a frame) */\n animate() {\n if (this._engine.isDeterministicLockStep()) {\n let e = Math.max(Ot.MinDeltaTime, Math.min(this._engine.getDeltaTime(), Ot.MaxDeltaTime)) + this._timeAccumulator;\n const t = this._engine.getTimeStep(), i = 1e3 / t / 1e3;\n let r = 0;\n const s = this._engine.getLockstepMaxSteps();\n let a = Math.floor(e / t);\n for (a = Math.min(a, s); e > 0 && r < a; )\n this.onBeforeStepObservable.notifyObservers(this), this._animationRatio = t * i, this._animate(t), this.onAfterAnimationsObservable.notifyObservers(this), this.physicsEnabled && this._advancePhysicsEngineStep(t), this.onAfterStepObservable.notifyObservers(this), this._currentStepId++, r++, e -= t;\n this._timeAccumulator = e < 0 ? 0 : e;\n } else {\n const e = this.useConstantAnimationDeltaTime ? 16 : Math.max(Ot.MinDeltaTime, Math.min(this._engine.getDeltaTime(), Ot.MaxDeltaTime));\n this._animationRatio = e * (60 / 1e3), this._animate(), this.onAfterAnimationsObservable.notifyObservers(this), this.physicsEnabled && this._advancePhysicsEngineStep(e);\n }\n }\n _clear() {\n (this.autoClearDepthAndStencil || this.autoClear) && this._engine.clear(this.clearColor, this.autoClear || this.forceWireframe || this.forcePointsCloud, this.autoClearDepthAndStencil, this.autoClearDepthAndStencil);\n }\n _checkCameraRenderTarget(e) {\n var t;\n if (e != null && e.outputRenderTarget && !(e != null && e.isRigCamera) && (e.outputRenderTarget._cleared = !1), (t = e == null ? void 0 : e.rigCameras) != null && t.length)\n for (let i = 0; i < e.rigCameras.length; ++i) {\n const r = e.rigCameras[i].outputRenderTarget;\n r && (r._cleared = !1);\n }\n }\n /**\n * Resets the draw wrappers cache of all meshes\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\n */\n resetDrawCache(e) {\n if (this.meshes)\n for (const t of this.meshes)\n t.resetDrawCache(e);\n }\n /**\n * Render the scene\n * @param updateCameras defines a boolean indicating if cameras must update according to their inputs (true by default)\n * @param ignoreAnimations defines a boolean indicating if animations should not be executed (false by default)\n */\n render(e = !0, t = !1) {\n var s, a;\n if (this.isDisposed)\n return;\n this.onReadyObservable.hasObservers() && this._executeWhenReadyTimeoutId === null && this._checkIsReady(), this._frameId++, this._defaultFrameBufferCleared = !1, this._checkCameraRenderTarget(this.activeCamera), (s = this.activeCameras) != null && s.length && this.activeCameras.forEach(this._checkCameraRenderTarget), this._registerTransientComponents(), this._activeParticles.fetchNewFrame(), this._totalVertices.fetchNewFrame(), this._activeIndices.fetchNewFrame(), this._activeBones.fetchNewFrame(), this._meshesForIntersections.reset(), this.resetCachedMaterial(), this.onBeforeAnimationsObservable.notifyObservers(this), this.actionManager && this.actionManager.processTrigger(11), t || this.animate();\n for (const o of this._beforeCameraUpdateStage)\n o.action();\n if (e) {\n if (this.activeCameras && this.activeCameras.length > 0)\n for (let o = 0; o < this.activeCameras.length; o++) {\n const l = this.activeCameras[o];\n if (l.update(), l.cameraRigMode !== 0)\n for (let c = 0; c < l._rigCameras.length; c++)\n l._rigCameras[c].update();\n }\n else if (this.activeCamera && (this.activeCamera.update(), this.activeCamera.cameraRigMode !== 0))\n for (let o = 0; o < this.activeCamera._rigCameras.length; o++)\n this.activeCamera._rigCameras[o].update();\n }\n this.onBeforeRenderObservable.notifyObservers(this);\n const i = this.getEngine();\n this.onBeforeRenderTargetsRenderObservable.notifyObservers(this);\n const r = (a = this.activeCameras) != null && a.length ? this.activeCameras[0] : this.activeCamera;\n if (this.renderTargetsEnabled) {\n ge.StartPerformanceCounter(\"Custom render targets\", this.customRenderTargets.length > 0), this._intermediateRendering = !0;\n for (let o = 0; o < this.customRenderTargets.length; o++) {\n const l = this.customRenderTargets[o];\n if (l._shouldRender()) {\n if (this._renderId++, this.activeCamera = l.activeCamera || this.activeCamera, !this.activeCamera)\n throw new Error(\"Active camera not set\");\n i.setViewport(this.activeCamera.viewport), this.updateTransformMatrix(), l.render(r !== this.activeCamera, this.dumpNextRenderTargets);\n }\n }\n ge.EndPerformanceCounter(\"Custom render targets\", this.customRenderTargets.length > 0), this._intermediateRendering = !1, this._renderId++;\n }\n this._engine.currentRenderPassId = (r == null ? void 0 : r.renderPassId) ?? 0, this.activeCamera = r, this._activeCamera && this._activeCamera.cameraRigMode !== 22 && !this.prePass && this._bindFrameBuffer(this._activeCamera, !1), this.onAfterRenderTargetsRenderObservable.notifyObservers(this);\n for (const o of this._beforeClearStage)\n o.action();\n this._clearFrameBuffer(this.activeCamera);\n for (const o of this._gatherRenderTargetsStage)\n o.action(this._renderTargets);\n if (this.activeCameras && this.activeCameras.length > 0)\n for (let o = 0; o < this.activeCameras.length; o++)\n this._processSubCameras(this.activeCameras[o], o > 0);\n else {\n if (!this.activeCamera)\n throw new Error(\"No camera defined\");\n this._processSubCameras(this.activeCamera, !!this.activeCamera.outputRenderTarget);\n }\n this._checkIntersections();\n for (const o of this._afterRenderStage)\n o.action();\n if (this.afterRender && this.afterRender(), this.onAfterRenderObservable.notifyObservers(this), this._toBeDisposed.length) {\n for (let o = 0; o < this._toBeDisposed.length; o++) {\n const l = this._toBeDisposed[o];\n l && l.dispose();\n }\n this._toBeDisposed.length = 0;\n }\n this.dumpNextRenderTargets && (this.dumpNextRenderTargets = !1), this._activeBones.addCount(0, !0), this._activeIndices.addCount(0, !0), this._activeParticles.addCount(0, !0), this._engine.restoreDefaultFramebuffer();\n }\n /**\n * Freeze all materials\n * A frozen material will not be updatable but should be faster to render\n * Note: multimaterials will not be frozen, but their submaterials will\n */\n freezeMaterials() {\n for (let e = 0; e < this.materials.length; e++)\n this.materials[e].freeze();\n }\n /**\n * Unfreeze all materials\n * A frozen material will not be updatable but should be faster to render\n */\n unfreezeMaterials() {\n for (let e = 0; e < this.materials.length; e++)\n this.materials[e].unfreeze();\n }\n /**\n * Releases all held resources\n */\n dispose() {\n if (this.isDisposed)\n return;\n this.beforeRender = null, this.afterRender = null, this.metadata = null, this.skeletons.length = 0, this.morphTargetManagers.length = 0, this._transientComponents.length = 0, this._isReadyForMeshStage.clear(), this._beforeEvaluateActiveMeshStage.clear(), this._evaluateSubMeshStage.clear(), this._preActiveMeshStage.clear(), this._cameraDrawRenderTargetStage.clear(), this._beforeCameraDrawStage.clear(), this._beforeRenderTargetDrawStage.clear(), this._beforeRenderingGroupDrawStage.clear(), this._beforeRenderingMeshStage.clear(), this._afterRenderingMeshStage.clear(), this._afterRenderingGroupDrawStage.clear(), this._afterCameraDrawStage.clear(), this._afterRenderTargetDrawStage.clear(), this._afterRenderStage.clear(), this._beforeCameraUpdateStage.clear(), this._beforeClearStage.clear(), this._gatherRenderTargetsStage.clear(), this._gatherActiveCameraRenderTargetsStage.clear(), this._pointerMoveStage.clear(), this._pointerDownStage.clear(), this._pointerUpStage.clear(), this.importedMeshesFiles = [], this.stopAllAnimations && (this._activeAnimatables.forEach((s) => {\n s.onAnimationEndObservable.clear(), s.onAnimationEnd = null;\n }), this.stopAllAnimations()), this.resetCachedMaterial(), this.activeCamera && (this.activeCamera._activeMeshes.dispose(), this.activeCamera = null), this.activeCameras = null, this._activeMeshes.dispose(), this._renderingManager.dispose(), this._processedMaterials.dispose(), this._activeParticleSystems.dispose(), this._activeSkeletons.dispose(), this._softwareSkinnedMeshes.dispose(), this._renderTargets.dispose(), this._materialsRenderTargets.dispose(), this._registeredForLateAnimationBindings.dispose(), this._meshesForIntersections.dispose(), this._toBeDisposed.length = 0;\n const e = this._activeRequests.slice();\n for (const s of e)\n s.abort();\n this._activeRequests.length = 0;\n try {\n this.onDisposeObservable.notifyObservers(this);\n } catch (s) {\n ne.Error(\"An error occurred while calling onDisposeObservable!\", s);\n }\n if (this.detachControl(), this._engine.getInputElement())\n for (let s = 0; s < this.cameras.length; s++)\n this.cameras[s].detachControl();\n this._disposeList(this.animationGroups), this._disposeList(this.lights), this._disposeList(this.meshes, (s) => s.dispose(!0)), this._disposeList(this.transformNodes, (s) => s.dispose(!0));\n const i = this.cameras;\n this._disposeList(i), this._defaultMaterial && this._defaultMaterial.dispose(), this._disposeList(this.multiMaterials), this._disposeList(this.materials), this._disposeList(this.particleSystems), this._disposeList(this.postProcesses), this._disposeList(this.textures), this._disposeList(this.morphTargetManagers), this._sceneUbo.dispose(), this._multiviewSceneUbo && this._multiviewSceneUbo.dispose(), this.postProcessManager.dispose(), this._disposeList(this._components);\n let r = this._engine.scenes.indexOf(this);\n r > -1 && this._engine.scenes.splice(r, 1), st._LastCreatedScene === this && (this._engine.scenes.length > 0 ? st._LastCreatedScene = this._engine.scenes[this._engine.scenes.length - 1] : st._LastCreatedScene = null), r = this._engine._virtualScenes.indexOf(this), r > -1 && this._engine._virtualScenes.splice(r, 1), this._engine.wipeCaches(!0), this.onDisposeObservable.clear(), this.onBeforeRenderObservable.clear(), this.onAfterRenderObservable.clear(), this.onBeforeRenderTargetsRenderObservable.clear(), this.onAfterRenderTargetsRenderObservable.clear(), this.onAfterStepObservable.clear(), this.onBeforeStepObservable.clear(), this.onBeforeActiveMeshesEvaluationObservable.clear(), this.onAfterActiveMeshesEvaluationObservable.clear(), this.onBeforeParticlesRenderingObservable.clear(), this.onAfterParticlesRenderingObservable.clear(), this.onBeforeDrawPhaseObservable.clear(), this.onAfterDrawPhaseObservable.clear(), this.onBeforeAnimationsObservable.clear(), this.onAfterAnimationsObservable.clear(), this.onDataLoadedObservable.clear(), this.onBeforeRenderingGroupObservable.clear(), this.onAfterRenderingGroupObservable.clear(), this.onMeshImportedObservable.clear(), this.onBeforeCameraRenderObservable.clear(), this.onAfterCameraRenderObservable.clear(), this.onAfterRenderCameraObservable.clear(), this.onReadyObservable.clear(), this.onNewCameraAddedObservable.clear(), this.onCameraRemovedObservable.clear(), this.onNewLightAddedObservable.clear(), this.onLightRemovedObservable.clear(), this.onNewGeometryAddedObservable.clear(), this.onGeometryRemovedObservable.clear(), this.onNewTransformNodeAddedObservable.clear(), this.onTransformNodeRemovedObservable.clear(), this.onNewMeshAddedObservable.clear(), this.onMeshRemovedObservable.clear(), this.onNewSkeletonAddedObservable.clear(), this.onSkeletonRemovedObservable.clear(), this.onNewMaterialAddedObservable.clear(), this.onNewMultiMaterialAddedObservable.clear(), this.onMaterialRemovedObservable.clear(), this.onMultiMaterialRemovedObservable.clear(), this.onNewTextureAddedObservable.clear(), this.onTextureRemovedObservable.clear(), this.onPrePointerObservable.clear(), this.onPointerObservable.clear(), this.onPreKeyboardObservable.clear(), this.onKeyboardObservable.clear(), this.onActiveCameraChanged.clear(), this.onScenePerformancePriorityChangedObservable.clear(), this._isDisposed = !0;\n }\n _disposeList(e, t) {\n const i = e.slice(0);\n t = t ?? ((r) => r.dispose());\n for (const r of i)\n t(r);\n e.length = 0;\n }\n /**\n * Gets if the scene is already disposed\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Call this function to reduce memory footprint of the scene.\n * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly)\n */\n clearCachedVertexData() {\n for (let e = 0; e < this.meshes.length; e++) {\n const i = this.meshes[e].geometry;\n i && i.clearCachedData();\n }\n }\n /**\n * This function will remove the local cached buffer data from texture.\n * It will save memory but will prevent the texture from being rebuilt\n */\n cleanCachedTextureBuffer() {\n for (const e of this.textures)\n e._buffer && (e._buffer = null);\n }\n /**\n * Get the world extend vectors with an optional filter\n *\n * @param filterPredicate the predicate - which meshes should be included when calculating the world size\n * @returns {{ min: Vector3; max: Vector3 }} min and max vectors\n */\n getWorldExtends(e) {\n const t = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), i = new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n return e = e || (() => !0), this.meshes.filter(e).forEach((r) => {\n if (r.computeWorldMatrix(!0), !r.subMeshes || r.subMeshes.length === 0 || r.infiniteDistance)\n return;\n const s = r.getBoundingInfo(), a = s.boundingBox.minimumWorld, o = s.boundingBox.maximumWorld;\n _.CheckExtends(a, t, i), _.CheckExtends(o, t, i);\n }), {\n min: t,\n max: i\n };\n }\n // Picking\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a ray that can be used to pick in the scene\n * @param x defines the x coordinate of the origin (on-screen)\n * @param y defines the y coordinate of the origin (on-screen)\n * @param world defines the world matrix to use if you want to pick in object space (instead of world space)\n * @param camera defines the camera to use for the picking\n * @param cameraViewSpace defines if picking will be done in view space (false by default)\n * @returns a Ray\n */\n createPickingRay(e, t, i, r, s = !1) {\n throw We(\"Ray\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a ray that can be used to pick in the scene\n * @param x defines the x coordinate of the origin (on-screen)\n * @param y defines the y coordinate of the origin (on-screen)\n * @param world defines the world matrix to use if you want to pick in object space (instead of world space)\n * @param result defines the ray where to store the picking ray\n * @param camera defines the camera to use for the picking\n * @param cameraViewSpace defines if picking will be done in view space (false by default)\n * @param enableDistantPicking defines if picking should handle large values for mesh position/scaling (false by default)\n * @returns the current scene\n */\n createPickingRayToRef(e, t, i, r, s, a = !1, o = !1) {\n throw We(\"Ray\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a ray that can be used to pick in the scene\n * @param x defines the x coordinate of the origin (on-screen)\n * @param y defines the y coordinate of the origin (on-screen)\n * @param camera defines the camera to use for the picking\n * @returns a Ray\n */\n createPickingRayInCameraSpace(e, t, i) {\n throw We(\"Ray\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Creates a ray that can be used to pick in the scene\n * @param x defines the x coordinate of the origin (on-screen)\n * @param y defines the y coordinate of the origin (on-screen)\n * @param result defines the ray where to store the picking ray\n * @param camera defines the camera to use for the picking\n * @returns the current scene\n */\n createPickingRayInCameraSpaceToRef(e, t, i, r) {\n throw We(\"Ray\");\n }\n /** @internal */\n get _pickingAvailable() {\n return !1;\n }\n /** Launch a ray to try to pick a mesh in the scene\n * @param x position on screen\n * @param y position on screen\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\n * @param fastCheck defines if the first intersection will be used (and not the closest)\n * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @returns a PickingInfo\n */\n pick(e, t, i, r, s, a) {\n const o = We(\"Ray\", !0);\n return o && ne.Warn(o), new ps();\n }\n /** Launch a ray to try to pick a mesh in the scene using only bounding information of the main mesh (not using submeshes)\n * @param x position on screen\n * @param y position on screen\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\n * @param fastCheck defines if the first intersection will be used (and not the closest)\n * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used\n * @returns a PickingInfo (Please note that some info will not be set like distance, bv, bu and everything that cannot be capture by only using bounding infos)\n */\n pickWithBoundingInfo(e, t, i, r, s) {\n const a = We(\"Ray\", !0);\n return a && ne.Warn(a), new ps();\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Use the given ray to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides,\n * irrespective of orientation.\n * @param ray The ray to use to pick meshes\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must have isPickable set to true\n * @param fastCheck defines if the first intersection will be used (and not the closest)\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @returns a PickingInfo\n */\n pickWithRay(e, t, i, r) {\n throw We(\"Ray\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Launch a ray to try to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides,\n * irrespective of orientation.\n * @param x X position on screen\n * @param y Y position on screen\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\n * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @returns an array of PickingInfo\n */\n multiPick(e, t, i, r, s) {\n throw We(\"Ray\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Launch a ray to try to pick a mesh in the scene\n * @param ray Ray to use\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @returns an array of PickingInfo\n */\n multiPickWithRay(e, t, i) {\n throw We(\"Ray\");\n }\n /**\n * Force the value of meshUnderPointer\n * @param mesh defines the mesh to use\n * @param pointerId optional pointer id when using more than one pointer\n * @param pickResult optional pickingInfo data used to find mesh\n */\n setPointerOverMesh(e, t, i) {\n this._inputManager.setPointerOverMesh(e, t, i);\n }\n /**\n * Gets the mesh under the pointer\n * @returns a Mesh or null if no mesh is under the pointer\n */\n getPointerOverMesh() {\n return this._inputManager.getPointerOverMesh();\n }\n // Misc.\n /** @internal */\n _rebuildGeometries() {\n for (const e of this.geometries)\n e._rebuild();\n for (const e of this.meshes)\n e._rebuild();\n this.postProcessManager && this.postProcessManager._rebuild();\n for (const e of this._components)\n e.rebuild();\n for (const e of this.particleSystems)\n e.rebuild();\n if (this.spriteManagers)\n for (const e of this.spriteManagers)\n e.rebuild();\n }\n /** @internal */\n _rebuildTextures() {\n for (const e of this.textures)\n e._rebuild(!0);\n this.markAllMaterialsAsDirty(1);\n }\n /**\n * Get from a list of objects by tags\n * @param list the list of objects to use\n * @param tagsQuery the query to use\n * @param filter a predicate to filter for tags\n * @returns\n */\n _getByTags(e, t, i) {\n if (t === void 0)\n return e;\n const r = [];\n for (const s in e) {\n const a = e[s];\n rt && rt.MatchesQuery(a, t) && (!i || i(a)) && r.push(a);\n }\n return r;\n }\n /**\n * Get a list of meshes by tags\n * @param tagsQuery defines the tags query to use\n * @param filter defines a predicate used to filter results\n * @returns an array of Mesh\n */\n getMeshesByTags(e, t) {\n return this._getByTags(this.meshes, e, t);\n }\n /**\n * Get a list of cameras by tags\n * @param tagsQuery defines the tags query to use\n * @param filter defines a predicate used to filter results\n * @returns an array of Camera\n */\n getCamerasByTags(e, t) {\n return this._getByTags(this.cameras, e, t);\n }\n /**\n * Get a list of lights by tags\n * @param tagsQuery defines the tags query to use\n * @param filter defines a predicate used to filter results\n * @returns an array of Light\n */\n getLightsByTags(e, t) {\n return this._getByTags(this.lights, e, t);\n }\n /**\n * Get a list of materials by tags\n * @param tagsQuery defines the tags query to use\n * @param filter defines a predicate used to filter results\n * @returns an array of Material\n */\n getMaterialByTags(e, t) {\n return this._getByTags(this.materials, e, t).concat(this._getByTags(this.multiMaterials, e, t));\n }\n /**\n * Get a list of transform nodes by tags\n * @param tagsQuery defines the tags query to use\n * @param filter defines a predicate used to filter results\n * @returns an array of TransformNode\n */\n getTransformNodesByTags(e, t) {\n return this._getByTags(this.transformNodes, e, t);\n }\n /**\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\n * This allowed control for front to back rendering or reversly depending of the special needs.\n *\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\n */\n setRenderingOrder(e, t = null, i = null, r = null) {\n this._renderingManager.setRenderingOrder(e, t, i, r);\n }\n /**\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\n *\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\n * @param depth Automatically clears depth between groups if true and autoClear is true.\n * @param stencil Automatically clears stencil between groups if true and autoClear is true.\n */\n setRenderingAutoClearDepthStencil(e, t, i = !0, r = !0) {\n this._renderingManager.setRenderingAutoClearDepthStencil(e, t, i, r);\n }\n /**\n * Gets the current auto clear configuration for one rendering group of the rendering\n * manager.\n * @param index the rendering group index to get the information for\n * @returns The auto clear setup for the requested rendering group\n */\n getAutoClearDepthStencilSetup(e) {\n return this._renderingManager.getAutoClearDepthStencilSetup(e);\n }\n /** @internal */\n _forceBlockMaterialDirtyMechanism(e) {\n this._blockMaterialDirtyMechanism = e;\n }\n /** Gets or sets a boolean blocking all the calls to markAllMaterialsAsDirty (ie. the materials won't be updated if they are out of sync) */\n get blockMaterialDirtyMechanism() {\n return this._blockMaterialDirtyMechanism;\n }\n set blockMaterialDirtyMechanism(e) {\n this._blockMaterialDirtyMechanism !== e && (this._blockMaterialDirtyMechanism = e, e || this.markAllMaterialsAsDirty(63));\n }\n /**\n * Will flag all materials as dirty to trigger new shader compilation\n * @param flag defines the flag used to specify which material part must be marked as dirty\n * @param predicate If not null, it will be used to specify if a material has to be marked as dirty\n */\n markAllMaterialsAsDirty(e, t) {\n if (!this._blockMaterialDirtyMechanism)\n for (const i of this.materials)\n t && !t(i) || i.markAsDirty(e);\n }\n /**\n * @internal\n */\n _loadFile(e, t, i, r, s, a, o) {\n const l = on(e, t, i, r ? this.offlineProvider : void 0, s, a, o);\n return this._activeRequests.push(l), l.onCompleteObservable.add((c) => {\n this._activeRequests.splice(this._activeRequests.indexOf(c), 1);\n }), l;\n }\n /**\n * @internal\n */\n _loadFileAsync(e, t, i, r, s) {\n return new Promise((a, o) => {\n this._loadFile(e, (l) => {\n a(l);\n }, t, i, r, (l, c) => {\n o(c);\n }, s);\n });\n }\n /**\n * @internal\n */\n _requestFile(e, t, i, r, s, a, o) {\n const l = ef(e, t, i, r ? this.offlineProvider : void 0, s, a, o);\n return this._activeRequests.push(l), l.onCompleteObservable.add((c) => {\n this._activeRequests.splice(this._activeRequests.indexOf(c), 1);\n }), l;\n }\n /**\n * @internal\n */\n _requestFileAsync(e, t, i, r, s) {\n return new Promise((a, o) => {\n this._requestFile(e, (l) => {\n a(l);\n }, t, i, r, (l) => {\n o(l);\n }, s);\n });\n }\n /**\n * @internal\n */\n _readFile(e, t, i, r, s) {\n const a = go(e, t, i, r, s);\n return this._activeRequests.push(a), a.onCompleteObservable.add((o) => {\n this._activeRequests.splice(this._activeRequests.indexOf(o), 1);\n }), a;\n }\n /**\n * @internal\n */\n _readFileAsync(e, t, i) {\n return new Promise((r, s) => {\n this._readFile(e, (a) => {\n r(a);\n }, t, i, (a) => {\n s(a);\n });\n });\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * This method gets the performance collector belonging to the scene, which is generally shared with the inspector.\n * @returns the perf collector belonging to the scene.\n */\n getPerfCollector() {\n throw We(\"performanceViewerSceneExtension\");\n }\n // deprecated\n /**\n * Sets the active camera of the scene using its Id\n * @param id defines the camera's Id\n * @returns the new active camera or null if none found.\n * @deprecated Please use setActiveCameraById instead\n */\n setActiveCameraByID(e) {\n return this.setActiveCameraById(e);\n }\n /**\n * Get a material using its id\n * @param id defines the material's Id\n * @returns the material or null if none found.\n * @deprecated Please use getMaterialById instead\n */\n getMaterialByID(e) {\n return this.getMaterialById(e);\n }\n /**\n * Gets a the last added material using a given id\n * @param id defines the material's Id\n * @returns the last material with the given id or null if none found.\n * @deprecated Please use getLastMaterialById instead\n */\n getLastMaterialByID(e) {\n return this.getLastMaterialById(e);\n }\n /**\n * Get a texture using its unique id\n * @param uniqueId defines the texture's unique id\n * @returns the texture or null if none found.\n * @deprecated Please use getTextureByUniqueId instead\n */\n getTextureByUniqueID(e) {\n return this.getTextureByUniqueId(e);\n }\n /**\n * Gets a camera using its Id\n * @param id defines the Id to look for\n * @returns the camera or null if not found\n * @deprecated Please use getCameraById instead\n */\n getCameraByID(e) {\n return this.getCameraById(e);\n }\n /**\n * Gets a camera using its unique Id\n * @param uniqueId defines the unique Id to look for\n * @returns the camera or null if not found\n * @deprecated Please use getCameraByUniqueId instead\n */\n getCameraByUniqueID(e) {\n return this.getCameraByUniqueId(e);\n }\n /**\n * Gets a bone using its Id\n * @param id defines the bone's Id\n * @returns the bone or null if not found\n * @deprecated Please use getBoneById instead\n */\n getBoneByID(e) {\n return this.getBoneById(e);\n }\n /**\n * Gets a light node using its Id\n * @param id defines the light's Id\n * @returns the light or null if none found.\n * @deprecated Please use getLightById instead\n */\n getLightByID(e) {\n return this.getLightById(e);\n }\n /**\n * Gets a light node using its scene-generated unique Id\n * @param uniqueId defines the light's unique Id\n * @returns the light or null if none found.\n * @deprecated Please use getLightByUniqueId instead\n */\n getLightByUniqueID(e) {\n return this.getLightByUniqueId(e);\n }\n /**\n * Gets a particle system by Id\n * @param id defines the particle system Id\n * @returns the corresponding system or null if none found\n * @deprecated Please use getParticleSystemById instead\n */\n getParticleSystemByID(e) {\n return this.getParticleSystemById(e);\n }\n /**\n * Gets a geometry using its Id\n * @param id defines the geometry's Id\n * @returns the geometry or null if none found.\n * @deprecated Please use getGeometryById instead\n */\n getGeometryByID(e) {\n return this.getGeometryById(e);\n }\n /**\n * Gets the first added mesh found of a given Id\n * @param id defines the Id to search for\n * @returns the mesh found or null if not found at all\n * @deprecated Please use getMeshById instead\n */\n getMeshByID(e) {\n return this.getMeshById(e);\n }\n /**\n * Gets a mesh with its auto-generated unique Id\n * @param uniqueId defines the unique Id to search for\n * @returns the found mesh or null if not found at all.\n * @deprecated Please use getMeshByUniqueId instead\n */\n getMeshByUniqueID(e) {\n return this.getMeshByUniqueId(e);\n }\n /**\n * Gets a the last added mesh using a given Id\n * @param id defines the Id to search for\n * @returns the found mesh or null if not found at all.\n * @deprecated Please use getLastMeshById instead\n */\n getLastMeshByID(e) {\n return this.getLastMeshById(e);\n }\n /**\n * Gets a list of meshes using their Id\n * @param id defines the Id to search for\n * @returns a list of meshes\n * @deprecated Please use getMeshesById instead\n */\n getMeshesByID(e) {\n return this.getMeshesById(e);\n }\n /**\n * Gets the first added transform node found of a given Id\n * @param id defines the Id to search for\n * @returns the found transform node or null if not found at all.\n * @deprecated Please use getTransformNodeById instead\n */\n getTransformNodeByID(e) {\n return this.getTransformNodeById(e);\n }\n /**\n * Gets a transform node with its auto-generated unique Id\n * @param uniqueId defines the unique Id to search for\n * @returns the found transform node or null if not found at all.\n * @deprecated Please use getTransformNodeByUniqueId instead\n */\n getTransformNodeByUniqueID(e) {\n return this.getTransformNodeByUniqueId(e);\n }\n /**\n * Gets a list of transform nodes using their Id\n * @param id defines the Id to search for\n * @returns a list of transform nodes\n * @deprecated Please use getTransformNodesById instead\n */\n getTransformNodesByID(e) {\n return this.getTransformNodesById(e);\n }\n /**\n * Gets a node (Mesh, Camera, Light) using a given Id\n * @param id defines the Id to search for\n * @returns the found node or null if not found at all\n * @deprecated Please use getNodeById instead\n */\n getNodeByID(e) {\n return this.getNodeById(e);\n }\n /**\n * Gets a the last added node (Mesh, Camera, Light) using a given Id\n * @param id defines the Id to search for\n * @returns the found node or null if not found at all\n * @deprecated Please use getLastEntryById instead\n */\n getLastEntryByID(e) {\n return this.getLastEntryById(e);\n }\n /**\n * Gets a skeleton using a given Id (if many are found, this function will pick the last one)\n * @param id defines the Id to search for\n * @returns the found skeleton or null if not found at all.\n * @deprecated Please use getLastSkeletonById instead\n */\n getLastSkeletonByID(e) {\n return this.getLastSkeletonById(e);\n }\n}\nOt.FOGMODE_NONE = 0;\nOt.FOGMODE_EXP = 1;\nOt.FOGMODE_EXP2 = 2;\nOt.FOGMODE_LINEAR = 3;\nOt.MinDeltaTime = 1;\nOt.MaxDeltaTime = 1e3;\nclass Vy {\n /**\n * constructor\n * @param frameSampleSize The number of samples required to saturate the sliding window\n */\n constructor(e = 30) {\n this._enabled = !0, this._rollingFrameTime = new By(e);\n }\n /**\n * Samples current frame\n * @param timeMs A timestamp in milliseconds of the current frame to compare with other frames\n */\n sampleFrame(e = sr.Now) {\n if (this._enabled) {\n if (this._lastFrameTimeMs != null) {\n const t = e - this._lastFrameTimeMs;\n this._rollingFrameTime.add(t);\n }\n this._lastFrameTimeMs = e;\n }\n }\n /**\n * Returns the average frame time in milliseconds over the sliding window (or the subset of frames sampled so far)\n */\n get averageFrameTime() {\n return this._rollingFrameTime.average;\n }\n /**\n * Returns the variance frame time in milliseconds over the sliding window (or the subset of frames sampled so far)\n */\n get averageFrameTimeVariance() {\n return this._rollingFrameTime.variance;\n }\n /**\n * Returns the frame time of the most recent frame\n */\n get instantaneousFrameTime() {\n return this._rollingFrameTime.history(0);\n }\n /**\n * Returns the average framerate in frames per second over the sliding window (or the subset of frames sampled so far)\n */\n get averageFPS() {\n return 1e3 / this._rollingFrameTime.average;\n }\n /**\n * Returns the average framerate in frames per second using the most recent frame time\n */\n get instantaneousFPS() {\n const e = this._rollingFrameTime.history(0);\n return e === 0 ? 0 : 1e3 / e;\n }\n /**\n * Returns true if enough samples have been taken to completely fill the sliding window\n */\n get isSaturated() {\n return this._rollingFrameTime.isSaturated();\n }\n /**\n * Enables contributions to the sliding window sample set\n */\n enable() {\n this._enabled = !0;\n }\n /**\n * Disables contributions to the sliding window sample set\n * Samples will not be interpolated over the disabled period\n */\n disable() {\n this._enabled = !1, this._lastFrameTimeMs = null;\n }\n /**\n * Returns true if sampling is enabled\n */\n get isEnabled() {\n return this._enabled;\n }\n /**\n * Resets performance monitor\n */\n reset() {\n this._lastFrameTimeMs = null, this._rollingFrameTime.reset();\n }\n}\nclass By {\n /**\n * constructor\n * @param length The number of samples required to saturate the sliding window\n */\n constructor(e) {\n this._samples = new Array(e), this.reset();\n }\n /**\n * Adds a sample to the sample set\n * @param v The sample value\n */\n add(e) {\n let t;\n if (this.isSaturated()) {\n const i = this._samples[this._pos];\n t = i - this.average, this.average -= t / (this._sampleCount - 1), this._m2 -= t * (i - this.average);\n } else\n this._sampleCount++;\n t = e - this.average, this.average += t / this._sampleCount, this._m2 += t * (e - this.average), this.variance = this._m2 / (this._sampleCount - 1), this._samples[this._pos] = e, this._pos++, this._pos %= this._samples.length;\n }\n /**\n * Returns previously added values or null if outside of history or outside the sliding window domain\n * @param i Index in history. For example, pass 0 for the most recent value and 1 for the value before that\n * @returns Value previously recorded with add() or null if outside of range\n */\n history(e) {\n if (e >= this._sampleCount || e >= this._samples.length)\n return 0;\n const t = this._wrapPosition(this._pos - 1);\n return this._samples[this._wrapPosition(t - e)];\n }\n /**\n * Returns true if enough samples have been taken to completely fill the sliding window\n * @returns true if sample-set saturated\n */\n isSaturated() {\n return this._sampleCount >= this._samples.length;\n }\n /**\n * Resets the rolling average (equivalent to 0 samples taken so far)\n */\n reset() {\n this.average = 0, this.variance = 0, this._sampleCount = 0, this._pos = 0, this._m2 = 0;\n }\n /**\n * Wraps a value around the sample range boundaries\n * @param i Position in sample range, for example if the sample length is 5, and i is -3, then 2 will be returned.\n * @returns Wrapped position in sample range\n */\n _wrapPosition(e) {\n const t = this._samples.length;\n return (e % t + t) % t;\n }\n}\nDe.prototype.setAlphaConstants = function(n, e, t, i) {\n this._alphaState.setAlphaBlendConstants(n, e, t, i);\n};\nDe.prototype.setAlphaMode = function(n, e = !1) {\n if (this._alphaMode === n) {\n if (!e) {\n const t = n === 0;\n this.depthCullingState.depthMask !== t && (this.depthCullingState.depthMask = t);\n }\n return;\n }\n switch (n) {\n case 0:\n this._alphaState.alphaBlend = !1;\n break;\n case 7:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 8:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA), this._alphaState.alphaBlend = !0;\n break;\n case 2:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 6:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ZERO, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 1:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 3:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ZERO, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 4:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_COLOR, this._gl.ZERO, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 5:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 9:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.CONSTANT_COLOR, this._gl.ONE_MINUS_CONSTANT_COLOR, this._gl.CONSTANT_ALPHA, this._gl.ONE_MINUS_CONSTANT_ALPHA), this._alphaState.alphaBlend = !0;\n break;\n case 10:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA), this._alphaState.alphaBlend = !0;\n break;\n case 11:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 12:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ZERO), this._alphaState.alphaBlend = !0;\n break;\n case 13:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE_MINUS_DST_COLOR, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE_MINUS_DST_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA), this._alphaState.alphaBlend = !0;\n break;\n case 14:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA), this._alphaState.alphaBlend = !0;\n break;\n case 15:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ZERO), this._alphaState.alphaBlend = !0;\n break;\n case 16:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE_MINUS_DST_COLOR, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ZERO, this._gl.ONE), this._alphaState.alphaBlend = !0;\n break;\n case 17:\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA), this._alphaState.alphaBlend = !0;\n break;\n }\n e || (this.depthCullingState.depthMask = n === 0), this._alphaMode = n;\n};\nDe.prototype.getAlphaMode = function() {\n return this._alphaMode;\n};\nDe.prototype.setAlphaEquation = function(n) {\n if (this._alphaEquation !== n) {\n switch (n) {\n case 0:\n this._alphaState.setAlphaEquationParameters(32774, 32774);\n break;\n case 1:\n this._alphaState.setAlphaEquationParameters(32778, 32778);\n break;\n case 2:\n this._alphaState.setAlphaEquationParameters(32779, 32779);\n break;\n case 3:\n this._alphaState.setAlphaEquationParameters(32776, 32776);\n break;\n case 4:\n this._alphaState.setAlphaEquationParameters(32775, 32775);\n break;\n case 5:\n this._alphaState.setAlphaEquationParameters(32775, 32774);\n break;\n }\n this._alphaEquation = n;\n }\n};\nDe.prototype.getAlphaEquation = function() {\n return this._alphaEquation;\n};\nfunction ky(n, e, t = !1, i) {\n switch (n) {\n case 3: {\n const s = e instanceof ArrayBuffer ? new Int8Array(e) : new Int8Array(e);\n return i && s.set(new Int8Array(i)), s;\n }\n case 0: {\n const s = e instanceof ArrayBuffer ? new Uint8Array(e) : new Uint8Array(e);\n return i && s.set(new Uint8Array(i)), s;\n }\n case 4: {\n const s = e instanceof ArrayBuffer ? new Int16Array(e) : new Int16Array(t ? e / 2 : e);\n return i && s.set(new Int16Array(i)), s;\n }\n case 5:\n case 8:\n case 9:\n case 10:\n case 2: {\n const s = e instanceof ArrayBuffer ? new Uint16Array(e) : new Uint16Array(t ? e / 2 : e);\n return i && s.set(new Uint16Array(i)), s;\n }\n case 6: {\n const s = e instanceof ArrayBuffer ? new Int32Array(e) : new Int32Array(t ? e / 4 : e);\n return i && s.set(new Int32Array(i)), s;\n }\n case 7:\n case 11:\n case 12:\n case 13:\n case 14:\n case 15: {\n const s = e instanceof ArrayBuffer ? new Uint32Array(e) : new Uint32Array(t ? e / 4 : e);\n return i && s.set(new Uint32Array(i)), s;\n }\n case 1: {\n const s = e instanceof ArrayBuffer ? new Float32Array(e) : new Float32Array(t ? e / 4 : e);\n return i && s.set(new Float32Array(i)), s;\n }\n }\n const r = e instanceof ArrayBuffer ? new Uint8Array(e) : new Uint8Array(e);\n return i && r.set(new Uint8Array(i)), r;\n}\nDe.prototype._readTexturePixelsSync = function(n, e, t, i = -1, r = 0, s = null, a = !0, o = !1, l = 0, c = 0) {\n var f, d;\n const h = this._gl;\n if (!h)\n throw new Error(\"Engine does not have gl rendering context.\");\n if (!this._dummyFramebuffer) {\n const p = h.createFramebuffer();\n if (!p)\n throw new Error(\"Unable to create dummy framebuffer\");\n this._dummyFramebuffer = p;\n }\n h.bindFramebuffer(h.FRAMEBUFFER, this._dummyFramebuffer), i > -1 ? h.framebufferTexture2D(h.FRAMEBUFFER, h.COLOR_ATTACHMENT0, h.TEXTURE_CUBE_MAP_POSITIVE_X + i, (f = n._hardwareTexture) == null ? void 0 : f.underlyingResource, r) : h.framebufferTexture2D(h.FRAMEBUFFER, h.COLOR_ATTACHMENT0, h.TEXTURE_2D, (d = n._hardwareTexture) == null ? void 0 : d.underlyingResource, r);\n let u = n.type !== void 0 ? this._getWebGLTextureType(n.type) : h.UNSIGNED_BYTE;\n if (o)\n s || (s = ky(n.type, 4 * e * t));\n else\n switch (u) {\n case h.UNSIGNED_BYTE:\n s || (s = new Uint8Array(4 * e * t)), u = h.UNSIGNED_BYTE;\n break;\n default:\n s || (s = new Float32Array(4 * e * t)), u = h.FLOAT;\n break;\n }\n return a && this.flushFramebuffer(), h.readPixels(l, c, e, t, h.RGBA, u, s), h.bindFramebuffer(h.FRAMEBUFFER, this._currentFramebuffer), s;\n};\nDe.prototype._readTexturePixels = function(n, e, t, i = -1, r = 0, s = null, a = !0, o = !1, l = 0, c = 0) {\n return Promise.resolve(this._readTexturePixelsSync(n, e, t, i, r, s, a, o, l, c));\n};\nDe.prototype.updateDynamicIndexBuffer = function(n, e, t = 0) {\n this._currentBoundBuffer[this._gl.ELEMENT_ARRAY_BUFFER] = null, this.bindIndexBuffer(n);\n let i;\n n.is32Bits ? i = e instanceof Uint32Array ? e : new Uint32Array(e) : i = e instanceof Uint16Array ? e : new Uint16Array(e), this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, i, this._gl.DYNAMIC_DRAW), this._resetIndexBufferBinding();\n};\nDe.prototype.updateDynamicVertexBuffer = function(n, e, t, i) {\n this.bindArrayBuffer(n), t === void 0 && (t = 0);\n const r = e.byteLength || e.length;\n i === void 0 || i >= r && t === 0 ? e instanceof Array ? this._gl.bufferSubData(this._gl.ARRAY_BUFFER, t, new Float32Array(e)) : this._gl.bufferSubData(this._gl.ARRAY_BUFFER, t, e) : e instanceof Array ? this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, new Float32Array(e).subarray(t, t + i)) : (e instanceof ArrayBuffer ? e = new Uint8Array(e, t, i) : e = new Uint8Array(e.buffer, e.byteOffset + t, i), this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, e)), this._resetVertexBufferBinding();\n};\nclass se extends De {\n /**\n * Returns the current npm package of the sdk\n */\n // Not mixed with Version for tooling purpose.\n static get NpmPackage() {\n return De.NpmPackage;\n }\n /**\n * Returns the current version of the framework\n */\n static get Version() {\n return De.Version;\n }\n /** Gets the list of created engines */\n static get Instances() {\n return st.Instances;\n }\n /**\n * Gets the latest created engine\n */\n static get LastCreatedEngine() {\n return st.LastCreatedEngine;\n }\n /**\n * Gets the latest created scene\n */\n static get LastCreatedScene() {\n return st.LastCreatedScene;\n }\n /** @internal */\n /**\n * Engine abstraction for loading and creating an image bitmap from a given source string.\n * @param imageSource source to load the image from.\n * @param options An object that sets options for the image's extraction.\n * @returns ImageBitmap.\n */\n _createImageBitmapFromSource(e, t) {\n return new Promise((r, s) => {\n const a = new Image();\n a.onload = () => {\n a.decode().then(() => {\n this.createImageBitmap(a, t).then((o) => {\n r(o);\n });\n });\n }, a.onerror = () => {\n s(`Error loading image ${a.src}`);\n }, a.src = e;\n });\n }\n /**\n * Engine abstraction for createImageBitmap\n * @param image source for image\n * @param options An object that sets options for the image's extraction.\n * @returns ImageBitmap\n */\n createImageBitmap(e, t) {\n return createImageBitmap(e, t);\n }\n /**\n * Resize an image and returns the image data as an uint8array\n * @param image image to resize\n * @param bufferWidth destination buffer width\n * @param bufferHeight destination buffer height\n * @returns an uint8array containing RGBA values of bufferWidth * bufferHeight size\n */\n resizeImageBitmap(e, t, i) {\n const s = this.createCanvas(t, i).getContext(\"2d\");\n if (!s)\n throw new Error(\"Unable to get 2d context for resizeImageBitmap\");\n return s.drawImage(e, 0, 0), s.getImageData(0, 0, t, i).data;\n }\n /**\n * Will flag all materials in all scenes in all engines as dirty to trigger new shader compilation\n * @param flag defines which part of the materials must be marked as dirty\n * @param predicate defines a predicate used to filter which materials should be affected\n */\n static MarkAllMaterialsAsDirty(e, t) {\n for (let i = 0; i < se.Instances.length; i++) {\n const r = se.Instances[i];\n for (let s = 0; s < r.scenes.length; s++)\n r.scenes[s].markAllMaterialsAsDirty(e, t);\n }\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Method called to create the default loading screen.\n * This can be overridden in your own app.\n * @param canvas The rendering canvas element\n * @returns The loading screen\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static DefaultLoadingScreenFactory(e) {\n throw We(\"LoadingScreen\");\n }\n get _supportsHardwareTextureRescaling() {\n return !!se._RescalePostProcessFactory;\n }\n /**\n * Gets the performance monitor attached to this engine\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation\n */\n get performanceMonitor() {\n return this._performanceMonitor;\n }\n /**\n * (WebGPU only) True (default) to be in compatibility mode, meaning rendering all existing scenes without artifacts (same rendering than WebGL).\n * Setting the property to false will improve performances but may not work in some scenes if some precautions are not taken.\n * See https://doc.babylonjs.com/setup/support/webGPU/webGPUOptimization/webGPUNonCompatibilityMode for more details\n */\n get compatibilityMode() {\n return this._compatibilityMode;\n }\n set compatibilityMode(e) {\n this._compatibilityMode = !0;\n }\n // Events\n /**\n * Gets the HTML element used to attach event listeners\n * @returns a HTML element\n */\n getInputElement() {\n return this._renderingCanvas;\n }\n /**\n * Creates a new engine\n * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which already used the WebGL context\n * @param antialias defines enable antialiasing (default: false)\n * @param options defines further options to be sent to the getContext() function\n * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false)\n */\n constructor(e, t, i, r = !1) {\n if (super(e, t, i, r), this.enableOfflineSupport = !1, this.disableManifestCheck = !1, this.disableContextMenu = !0, this.scenes = [], this._virtualScenes = new Array(), this.onNewSceneAddedObservable = new he(), this.postProcesses = [], this.isPointerLock = !1, this.onResizeObservable = new he(), this.onCanvasBlurObservable = new he(), this.onCanvasFocusObservable = new he(), this.onCanvasPointerOutObservable = new he(), this.onBeginFrameObservable = new he(), this.customAnimationFrameRequester = null, this.onEndFrameObservable = new he(), this.onBeforeShaderCompilationObservable = new he(), this.onAfterShaderCompilationObservable = new he(), this._deterministicLockstep = !1, this._lockstepMaxSteps = 4, this._timeStep = 1 / 60, this._fps = 60, this._deltaTime = 0, this._drawCalls = new us(), this.canvasTabIndex = 1, this.disablePerformanceMonitorInBackground = !1, this._performanceMonitor = new Vy(), this._compatibilityMode = !0, this.currentRenderPassId = 0, this._renderPassNames = [\"main\"], se.Instances.push(this), !!e && (this._features.supportRenderPasses = !0, i = this._creationOptions, e.getContext)) {\n const s = e;\n this._sharedInit(s);\n }\n }\n _initGLContext() {\n super._initGLContext(), this._rescalePostProcess = null;\n }\n /**\n * Shared initialization across engines types.\n * @param canvas The canvas associated with this instance of the engine.\n */\n _sharedInit(e) {\n super._sharedInit(e), this._onCanvasFocus = () => {\n this.onCanvasFocusObservable.notifyObservers(this);\n }, this._onCanvasBlur = () => {\n this.onCanvasBlurObservable.notifyObservers(this);\n }, this._onCanvasContextMenu = (i) => {\n this.disableContextMenu && i.preventDefault();\n }, e.addEventListener(\"focus\", this._onCanvasFocus), e.addEventListener(\"blur\", this._onCanvasBlur), e.addEventListener(\"contextmenu\", this._onCanvasContextMenu), this._onBlur = () => {\n this.disablePerformanceMonitorInBackground && this._performanceMonitor.disable(), this._windowIsBackground = !0;\n }, this._onFocus = () => {\n this.disablePerformanceMonitorInBackground && this._performanceMonitor.enable(), this._windowIsBackground = !1;\n }, this._onCanvasPointerOut = (i) => {\n document.elementFromPoint(i.clientX, i.clientY) !== e && this.onCanvasPointerOutObservable.notifyObservers(i);\n };\n const t = this.getHostWindow();\n t && typeof t.addEventListener == \"function\" && (t.addEventListener(\"blur\", this._onBlur), t.addEventListener(\"focus\", this._onFocus)), e.addEventListener(\"pointerout\", this._onCanvasPointerOut), this._creationOptions.doNotHandleTouchAction || this._disableTouchAction(), !se.audioEngine && this._creationOptions.audioEngine && se.AudioEngineFactory && (se.audioEngine = se.AudioEngineFactory(this.getRenderingCanvas(), this.getAudioContext(), this.getAudioDestination())), no() && (this._onFullscreenChange = () => {\n this.isFullscreen = !!document.fullscreenElement, this.isFullscreen && this._pointerLockRequested && e && se._RequestPointerlock(e);\n }, document.addEventListener(\"fullscreenchange\", this._onFullscreenChange, !1), document.addEventListener(\"webkitfullscreenchange\", this._onFullscreenChange, !1), this._onPointerLockChange = () => {\n this.isPointerLock = document.pointerLockElement === e;\n }, document.addEventListener(\"pointerlockchange\", this._onPointerLockChange, !1), document.addEventListener(\"webkitpointerlockchange\", this._onPointerLockChange, !1)), this.enableOfflineSupport = se.OfflineProviderFactory !== void 0, this._deterministicLockstep = !!this._creationOptions.deterministicLockstep, this._lockstepMaxSteps = this._creationOptions.lockstepMaxSteps || 0, this._timeStep = this._creationOptions.timeStep || 1 / 60;\n }\n /** @internal */\n _verifyPointerLock() {\n var e;\n (e = this._onPointerLockChange) == null || e.call(this);\n }\n /**\n * Gets current aspect ratio\n * @param viewportOwner defines the camera to use to get the aspect ratio\n * @param useScreen defines if screen size must be used (or the current render target if any)\n * @returns a number defining the aspect ratio\n */\n getAspectRatio(e, t = !1) {\n const i = e.viewport;\n return this.getRenderWidth(t) * i.width / (this.getRenderHeight(t) * i.height);\n }\n /**\n * Gets current screen aspect ratio\n * @returns a number defining the aspect ratio\n */\n getScreenAspectRatio() {\n return this.getRenderWidth(!0) / this.getRenderHeight(!0);\n }\n /**\n * Gets the client rect of the HTML canvas attached with the current webGL context\n * @returns a client rectangle\n */\n getRenderingCanvasClientRect() {\n return this._renderingCanvas ? this._renderingCanvas.getBoundingClientRect() : null;\n }\n /**\n * Gets the client rect of the HTML element used for events\n * @returns a client rectangle\n */\n getInputElementClientRect() {\n return this._renderingCanvas ? this.getInputElement().getBoundingClientRect() : null;\n }\n /**\n * Gets a boolean indicating that the engine is running in deterministic lock step mode\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\n * @returns true if engine is in deterministic lock step mode\n */\n isDeterministicLockStep() {\n return this._deterministicLockstep;\n }\n /**\n * Gets the max steps when engine is running in deterministic lock step\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\n * @returns the max steps\n */\n getLockstepMaxSteps() {\n return this._lockstepMaxSteps;\n }\n /**\n * Returns the time in ms between steps when using deterministic lock step.\n * @returns time step in (ms)\n */\n getTimeStep() {\n return this._timeStep * 1e3;\n }\n /**\n * Force the mipmap generation for the given render target texture\n * @param texture defines the render target texture to use\n * @param unbind defines whether or not to unbind the texture after generation. Defaults to true.\n */\n generateMipMapsForCubemap(e, t = !0) {\n if (e.generateMipMaps) {\n const i = this._gl;\n this._bindTextureDirectly(i.TEXTURE_CUBE_MAP, e, !0), i.generateMipmap(i.TEXTURE_CUBE_MAP), t && this._bindTextureDirectly(i.TEXTURE_CUBE_MAP, null);\n }\n }\n /** States */\n /**\n * Gets a boolean indicating if depth writing is enabled\n * @returns the current depth writing state\n */\n getDepthWrite() {\n return this._depthCullingState.depthMask;\n }\n /**\n * Enable or disable depth writing\n * @param enable defines the state to set\n */\n setDepthWrite(e) {\n this._depthCullingState.depthMask = e;\n }\n /**\n * Gets a boolean indicating if stencil buffer is enabled\n * @returns the current stencil buffer state\n */\n getStencilBuffer() {\n return this._stencilState.stencilTest;\n }\n /**\n * Enable or disable the stencil buffer\n * @param enable defines if the stencil buffer must be enabled or disabled\n */\n setStencilBuffer(e) {\n this._stencilState.stencilTest = e;\n }\n /**\n * Gets the current stencil mask\n * @returns a number defining the new stencil mask to use\n */\n getStencilMask() {\n return this._stencilState.stencilMask;\n }\n /**\n * Sets the current stencil mask\n * @param mask defines the new stencil mask to use\n */\n setStencilMask(e) {\n this._stencilState.stencilMask = e;\n }\n /**\n * Gets the current stencil function\n * @returns a number defining the stencil function to use\n */\n getStencilFunction() {\n return this._stencilState.stencilFunc;\n }\n /**\n * Gets the current stencil reference value\n * @returns a number defining the stencil reference value to use\n */\n getStencilFunctionReference() {\n return this._stencilState.stencilFuncRef;\n }\n /**\n * Gets the current stencil mask\n * @returns a number defining the stencil mask to use\n */\n getStencilFunctionMask() {\n return this._stencilState.stencilFuncMask;\n }\n /**\n * Sets the current stencil function\n * @param stencilFunc defines the new stencil function to use\n */\n setStencilFunction(e) {\n this._stencilState.stencilFunc = e;\n }\n /**\n * Sets the current stencil reference\n * @param reference defines the new stencil reference to use\n */\n setStencilFunctionReference(e) {\n this._stencilState.stencilFuncRef = e;\n }\n /**\n * Sets the current stencil mask\n * @param mask defines the new stencil mask to use\n */\n setStencilFunctionMask(e) {\n this._stencilState.stencilFuncMask = e;\n }\n /**\n * Gets the current stencil operation when stencil fails\n * @returns a number defining stencil operation to use when stencil fails\n */\n getStencilOperationFail() {\n return this._stencilState.stencilOpStencilFail;\n }\n /**\n * Gets the current stencil operation when depth fails\n * @returns a number defining stencil operation to use when depth fails\n */\n getStencilOperationDepthFail() {\n return this._stencilState.stencilOpDepthFail;\n }\n /**\n * Gets the current stencil operation when stencil passes\n * @returns a number defining stencil operation to use when stencil passes\n */\n getStencilOperationPass() {\n return this._stencilState.stencilOpStencilDepthPass;\n }\n /**\n * Sets the stencil operation to use when stencil fails\n * @param operation defines the stencil operation to use when stencil fails\n */\n setStencilOperationFail(e) {\n this._stencilState.stencilOpStencilFail = e;\n }\n /**\n * Sets the stencil operation to use when depth fails\n * @param operation defines the stencil operation to use when depth fails\n */\n setStencilOperationDepthFail(e) {\n this._stencilState.stencilOpDepthFail = e;\n }\n /**\n * Sets the stencil operation to use when stencil passes\n * @param operation defines the stencil operation to use when stencil passes\n */\n setStencilOperationPass(e) {\n this._stencilState.stencilOpStencilDepthPass = e;\n }\n /**\n * Sets a boolean indicating if the dithering state is enabled or disabled\n * @param value defines the dithering state\n */\n setDitheringState(e) {\n e ? this._gl.enable(this._gl.DITHER) : this._gl.disable(this._gl.DITHER);\n }\n /**\n * Sets a boolean indicating if the rasterizer state is enabled or disabled\n * @param value defines the rasterizer state\n */\n setRasterizerState(e) {\n e ? this._gl.disable(this._gl.RASTERIZER_DISCARD) : this._gl.enable(this._gl.RASTERIZER_DISCARD);\n }\n /**\n * Gets the current depth function\n * @returns a number defining the depth function\n */\n getDepthFunction() {\n return this._depthCullingState.depthFunc;\n }\n /**\n * Sets the current depth function\n * @param depthFunc defines the function to use\n */\n setDepthFunction(e) {\n this._depthCullingState.depthFunc = e;\n }\n /**\n * Sets the current depth function to GREATER\n */\n setDepthFunctionToGreater() {\n this.setDepthFunction(516);\n }\n /**\n * Sets the current depth function to GEQUAL\n */\n setDepthFunctionToGreaterOrEqual() {\n this.setDepthFunction(518);\n }\n /**\n * Sets the current depth function to LESS\n */\n setDepthFunctionToLess() {\n this.setDepthFunction(513);\n }\n /**\n * Sets the current depth function to LEQUAL\n */\n setDepthFunctionToLessOrEqual() {\n this.setDepthFunction(515);\n }\n /**\n * Caches the state of the stencil buffer\n */\n cacheStencilState() {\n this._cachedStencilBuffer = this.getStencilBuffer(), this._cachedStencilFunction = this.getStencilFunction(), this._cachedStencilMask = this.getStencilMask(), this._cachedStencilOperationPass = this.getStencilOperationPass(), this._cachedStencilOperationFail = this.getStencilOperationFail(), this._cachedStencilOperationDepthFail = this.getStencilOperationDepthFail(), this._cachedStencilReference = this.getStencilFunctionReference();\n }\n /**\n * Restores the state of the stencil buffer\n */\n restoreStencilState() {\n this.setStencilFunction(this._cachedStencilFunction), this.setStencilMask(this._cachedStencilMask), this.setStencilBuffer(this._cachedStencilBuffer), this.setStencilOperationPass(this._cachedStencilOperationPass), this.setStencilOperationFail(this._cachedStencilOperationFail), this.setStencilOperationDepthFail(this._cachedStencilOperationDepthFail), this.setStencilFunctionReference(this._cachedStencilReference);\n }\n /**\n * Directly set the WebGL Viewport\n * @param x defines the x coordinate of the viewport (in screen space)\n * @param y defines the y coordinate of the viewport (in screen space)\n * @param width defines the width of the viewport (in screen space)\n * @param height defines the height of the viewport (in screen space)\n * @returns the current viewport Object (if any) that is being replaced by this call. You can restore this viewport later on to go back to the original state\n */\n setDirectViewport(e, t, i, r) {\n const s = this._cachedViewport;\n return this._cachedViewport = null, this._viewport(e, t, i, r), s;\n }\n /**\n * Executes a scissor clear (ie. a clear on a specific portion of the screen)\n * @param x defines the x-coordinate of the bottom left corner of the clear rectangle\n * @param y defines the y-coordinate of the corner of the clear rectangle\n * @param width defines the width of the clear rectangle\n * @param height defines the height of the clear rectangle\n * @param clearColor defines the clear color\n */\n scissorClear(e, t, i, r, s) {\n this.enableScissor(e, t, i, r), this.clear(s, !0, !0, !0), this.disableScissor();\n }\n /**\n * Enable scissor test on a specific rectangle (ie. render will only be executed on a specific portion of the screen)\n * @param x defines the x-coordinate of the bottom left corner of the clear rectangle\n * @param y defines the y-coordinate of the corner of the clear rectangle\n * @param width defines the width of the clear rectangle\n * @param height defines the height of the clear rectangle\n */\n enableScissor(e, t, i, r) {\n const s = this._gl;\n s.enable(s.SCISSOR_TEST), s.scissor(e, t, i, r);\n }\n /**\n * Disable previously set scissor test rectangle\n */\n disableScissor() {\n const e = this._gl;\n e.disable(e.SCISSOR_TEST);\n }\n /**\n * @internal\n */\n _reportDrawCall(e = 1) {\n this._drawCalls.addCount(e, !1);\n }\n /**\n * @internal\n */\n _loadFileAsync(e, t, i) {\n return new Promise((r, s) => {\n this._loadFile(e, (a) => {\n r(a);\n }, void 0, t, i, (a, o) => {\n s(o);\n });\n });\n }\n /**\n * Gets the source code of the vertex shader associated with a specific webGL program\n * @param program defines the program to use\n * @returns a string containing the source code of the vertex shader associated with the program\n */\n getVertexShaderSource(e) {\n const t = this._gl.getAttachedShaders(e);\n return t ? this._gl.getShaderSource(t[0]) : null;\n }\n /**\n * Gets the source code of the fragment shader associated with a specific webGL program\n * @param program defines the program to use\n * @returns a string containing the source code of the fragment shader associated with the program\n */\n getFragmentShaderSource(e) {\n const t = this._gl.getAttachedShaders(e);\n return t ? this._gl.getShaderSource(t[1]) : null;\n }\n /**\n * Sets a depth stencil texture from a render target to the according uniform.\n * @param channel The texture channel\n * @param uniform The uniform to set\n * @param texture The render target texture containing the depth stencil texture to apply\n * @param name The texture name\n */\n setDepthStencilTexture(e, t, i, r) {\n e !== void 0 && (t && (this._boundUniforms[e] = t), !i || !i.depthStencilTexture ? this._setTexture(e, null, void 0, void 0, r) : this._setTexture(e, i, !1, !0, r));\n }\n /**\n * Sets a texture to the webGL context from a postprocess\n * @param channel defines the channel to use\n * @param postProcess defines the source postprocess\n * @param name name of the channel\n */\n setTextureFromPostProcess(e, t, i) {\n let r = null;\n t && (t._forcedOutputTexture ? r = t._forcedOutputTexture : t._textures.data[t._currentRenderTextureInd] && (r = t._textures.data[t._currentRenderTextureInd])), this._bindTexture(e, (r == null ? void 0 : r.texture) ?? null, i);\n }\n /**\n * Binds the output of the passed in post process to the texture channel specified\n * @param channel The channel the texture should be bound to\n * @param postProcess The post process which's output should be bound\n * @param name name of the channel\n */\n setTextureFromPostProcessOutput(e, t, i) {\n var r;\n this._bindTexture(e, ((r = t == null ? void 0 : t._outputTexture) == null ? void 0 : r.texture) ?? null, i);\n }\n /**\n * sets the object from which width and height will be taken from when getting render width and height\n * Will fallback to the gl object\n * @param dimensions the framebuffer width and height that will be used.\n */\n set framebufferDimensionsObject(e) {\n this._framebufferDimensionsObject = e, this._framebufferDimensionsObject && this.onResizeObservable.notifyObservers(this);\n }\n _rebuildBuffers() {\n for (const e of this.scenes)\n e.resetCachedMaterial(), e._rebuildGeometries();\n for (const e of this._virtualScenes)\n e.resetCachedMaterial(), e._rebuildGeometries();\n super._rebuildBuffers();\n }\n _rebuildTextures() {\n for (const e of this.scenes)\n e._rebuildTextures();\n for (const e of this._virtualScenes)\n e._rebuildTextures();\n super._rebuildTextures();\n }\n /** @internal */\n _renderFrame() {\n for (let e = 0; e < this._activeRenderLoops.length; e++) {\n const t = this._activeRenderLoops[e];\n t();\n }\n }\n _cancelFrame() {\n if (this.customAnimationFrameRequester) {\n if (this._frameHandler !== 0) {\n this._frameHandler = 0;\n const { cancelAnimationFrame: e } = this.customAnimationFrameRequester;\n e && e(this.customAnimationFrameRequester.requestID);\n }\n } else\n super._cancelFrame();\n }\n _renderLoop() {\n if (this._frameHandler = 0, !this._contextWasLost) {\n let e = !0;\n (this.isDisposed || !this.renderEvenInBackground && this._windowIsBackground) && (e = !1), e && (this.beginFrame(), this._renderViews() || this._renderFrame(), this.endFrame());\n }\n this._frameHandler === 0 && (this.customAnimationFrameRequester ? (this.customAnimationFrameRequester.requestID = this._queueNewFrame(this.customAnimationFrameRequester.renderFunction || this._boundRenderFunction, this.customAnimationFrameRequester), this._frameHandler = this.customAnimationFrameRequester.requestID) : this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow()));\n }\n /** @internal */\n _renderViews() {\n return !1;\n }\n /**\n * Toggle full screen mode\n * @param requestPointerLock defines if a pointer lock should be requested from the user\n */\n switchFullscreen(e) {\n this.isFullscreen ? this.exitFullscreen() : this.enterFullscreen(e);\n }\n /**\n * Enters full screen mode\n * @param requestPointerLock defines if a pointer lock should be requested from the user\n */\n enterFullscreen(e) {\n this.isFullscreen || (this._pointerLockRequested = e, this._renderingCanvas && se._RequestFullscreen(this._renderingCanvas));\n }\n /**\n * Exits full screen mode\n */\n exitFullscreen() {\n this.isFullscreen && se._ExitFullscreen();\n }\n /**\n * Enters Pointerlock mode\n */\n enterPointerlock() {\n this._renderingCanvas && se._RequestPointerlock(this._renderingCanvas);\n }\n /**\n * Exits Pointerlock mode\n */\n exitPointerlock() {\n se._ExitPointerlock();\n }\n /**\n * Begin a new frame\n */\n beginFrame() {\n this._measureFps(), this.onBeginFrameObservable.notifyObservers(this), super.beginFrame();\n }\n /**\n * End the current frame\n */\n endFrame() {\n super.endFrame(), this.onEndFrameObservable.notifyObservers(this);\n }\n /**\n * Force a specific size of the canvas\n * @param width defines the new canvas' width\n * @param height defines the new canvas' height\n * @param forceSetSize true to force setting the sizes of the underlying canvas\n * @returns true if the size was changed\n */\n setSize(e, t, i = !1) {\n if (!this._renderingCanvas || !super.setSize(e, t, i))\n return !1;\n if (this.scenes) {\n for (let r = 0; r < this.scenes.length; r++) {\n const s = this.scenes[r];\n for (let a = 0; a < s.cameras.length; a++) {\n const o = s.cameras[a];\n o._currentRenderId = 0;\n }\n }\n this.onResizeObservable.hasObservers() && this.onResizeObservable.notifyObservers(this);\n }\n return !0;\n }\n _deletePipelineContext(e) {\n const t = e;\n t && t.program && t.transformFeedback && (this.deleteTransformFeedback(t.transformFeedback), t.transformFeedback = null), super._deletePipelineContext(e);\n }\n createShaderProgram(e, t, i, r, s, a = null) {\n s = s || this._gl, this.onBeforeShaderCompilationObservable.notifyObservers(this);\n const o = super.createShaderProgram(e, t, i, r, s, a);\n return this.onAfterShaderCompilationObservable.notifyObservers(this), o;\n }\n _createShaderProgram(e, t, i, r, s = null) {\n const a = r.createProgram();\n if (e.program = a, !a)\n throw new Error(\"Unable to create program\");\n if (r.attachShader(a, t), r.attachShader(a, i), this.webGLVersion > 1 && s) {\n const o = this.createTransformFeedback();\n this.bindTransformFeedback(o), this.setTranformFeedbackVaryings(a, s), e.transformFeedback = o;\n }\n return r.linkProgram(a), this.webGLVersion > 1 && s && this.bindTransformFeedback(null), e.context = r, e.vertexShader = t, e.fragmentShader = i, e.isParallelCompiled || this._finalizePipelineContext(e), a;\n }\n /**\n * @internal\n */\n _releaseTexture(e) {\n super._releaseTexture(e);\n }\n /**\n * @internal\n */\n _releaseRenderTargetWrapper(e) {\n super._releaseRenderTargetWrapper(e), this.scenes.forEach((t) => {\n t.postProcesses.forEach((i) => {\n i._outputTexture === e && (i._outputTexture = null);\n }), t.cameras.forEach((i) => {\n i._postProcesses.forEach((r) => {\n r && r._outputTexture === e && (r._outputTexture = null);\n });\n });\n });\n }\n /**\n * Gets the names of the render passes that are currently created\n * @returns list of the render pass names\n */\n getRenderPassNames() {\n return this._renderPassNames;\n }\n /**\n * Gets the name of the current render pass\n * @returns name of the current render pass\n */\n getCurrentRenderPassName() {\n return this._renderPassNames[this.currentRenderPassId];\n }\n /**\n * Creates a render pass id\n * @param name Name of the render pass (for debug purpose only)\n * @returns the id of the new render pass\n */\n createRenderPassId(e) {\n const t = ++se._RenderPassIdCounter;\n return this._renderPassNames[t] = e ?? \"NONAME\", t;\n }\n /**\n * Releases a render pass id\n * @param id id of the render pass to release\n */\n releaseRenderPassId(e) {\n this._renderPassNames[e] = void 0;\n for (let t = 0; t < this.scenes.length; ++t) {\n const i = this.scenes[t];\n for (let r = 0; r < i.meshes.length; ++r) {\n const s = i.meshes[r];\n if (s.subMeshes)\n for (let a = 0; a < s.subMeshes.length; ++a)\n s.subMeshes[a]._removeDrawWrapper(e);\n }\n }\n }\n /**\n * @internal\n * Rescales a texture\n * @param source input texture\n * @param destination destination texture\n * @param scene scene to use to render the resize\n * @param internalFormat format to use when resizing\n * @param onComplete callback to be called when resize has completed\n */\n _rescaleTexture(e, t, i, r, s) {\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.LINEAR), this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.LINEAR), this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE), this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);\n const a = this.createRenderTargetTexture({\n width: t.width,\n height: t.height\n }, {\n generateMipMaps: !1,\n type: 0,\n samplingMode: 2,\n generateDepthBuffer: !1,\n generateStencilBuffer: !1\n });\n !this._rescalePostProcess && se._RescalePostProcessFactory && (this._rescalePostProcess = se._RescalePostProcessFactory(this)), this._rescalePostProcess && (this._rescalePostProcess.externalTextureSamplerBinding = !0, this._rescalePostProcess.getEffect().executeWhenCompiled(() => {\n this._rescalePostProcess.onApply = function(l) {\n l._bindTexture(\"textureSampler\", e);\n };\n let o = i;\n o || (o = this.scenes[this.scenes.length - 1]), o.postProcessManager.directRender([this._rescalePostProcess], a, !0), this._bindTextureDirectly(this._gl.TEXTURE_2D, t, !0), this._gl.copyTexImage2D(this._gl.TEXTURE_2D, 0, r, 0, 0, t.width, t.height, 0), this.unBindFramebuffer(a), a.dispose(), s && s();\n }));\n }\n // FPS\n /**\n * Gets the current framerate\n * @returns a number representing the framerate\n */\n getFps() {\n return this._fps;\n }\n /**\n * Gets the time spent between current and previous frame\n * @returns a number representing the delta time in ms\n */\n getDeltaTime() {\n return this._deltaTime;\n }\n _measureFps() {\n this._performanceMonitor.sampleFrame(), this._fps = this._performanceMonitor.averageFPS, this._deltaTime = this._performanceMonitor.instantaneousFrameTime || 0;\n }\n /**\n * Wraps an external web gl texture in a Babylon texture.\n * @param texture defines the external texture\n * @param hasMipMaps defines whether the external texture has mip maps (default: false)\n * @param samplingMode defines the sampling mode for the external texture (default: 3)\n * @param width defines the width for the external texture (default: 0)\n * @param height defines the height for the external texture (default: 0)\n * @returns the babylon internal texture\n */\n wrapWebGLTexture(e, t = !1, i = 3, r = 0, s = 0) {\n const a = new F_(e, this._gl), o = new or(this, Dt.Unknown, !0);\n return o._hardwareTexture = a, o.baseWidth = r, o.baseHeight = s, o.width = r, o.height = s, o.isReady = !0, o.useMipMaps = t, this.updateTextureSamplingMode(i, o), o;\n }\n /**\n * @internal\n */\n _uploadImageToTexture(e, t, i = 0, r = 0) {\n const s = this._gl, a = this._getWebGLTextureType(e.type), o = this._getInternalFormat(e.format), l = this._getRGBABufferInternalSizedFormat(e.type, o), c = e.isCube ? s.TEXTURE_CUBE_MAP : s.TEXTURE_2D;\n this._bindTextureDirectly(c, e, !0), this._unpackFlipY(e.invertY);\n let h = s.TEXTURE_2D;\n e.isCube && (h = s.TEXTURE_CUBE_MAP_POSITIVE_X + i), s.texImage2D(h, r, l, o, a, t), this._bindTextureDirectly(c, null, !0);\n }\n /**\n * Updates a depth texture Comparison Mode and Function.\n * If the comparison Function is equal to 0, the mode will be set to none.\n * Otherwise, this only works in webgl 2 and requires a shadow sampler in the shader.\n * @param texture The texture to set the comparison function for\n * @param comparisonFunction The comparison function to set, 0 if no comparison required\n */\n updateTextureComparisonFunction(e, t) {\n if (this.webGLVersion === 1) {\n ne.Error(\"WebGL 1 does not support texture comparison.\");\n return;\n }\n const i = this._gl;\n e.isCube ? (this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, e, !0), t === 0 ? (i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_COMPARE_FUNC, 515), i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_COMPARE_MODE, i.NONE)) : (i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_COMPARE_FUNC, t), i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_COMPARE_MODE, i.COMPARE_REF_TO_TEXTURE)), this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null)) : (this._bindTextureDirectly(this._gl.TEXTURE_2D, e, !0), t === 0 ? (i.texParameteri(i.TEXTURE_2D, i.TEXTURE_COMPARE_FUNC, 515), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_COMPARE_MODE, i.NONE)) : (i.texParameteri(i.TEXTURE_2D, i.TEXTURE_COMPARE_FUNC, t), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_COMPARE_MODE, i.COMPARE_REF_TO_TEXTURE)), this._bindTextureDirectly(this._gl.TEXTURE_2D, null)), e._comparisonFunction = t;\n }\n /**\n * Creates a webGL buffer to use with instantiation\n * @param capacity defines the size of the buffer\n * @returns the webGL buffer\n */\n createInstancesBuffer(e) {\n const t = this._gl.createBuffer();\n if (!t)\n throw new Error(\"Unable to create instance buffer\");\n const i = new po(t);\n return i.capacity = e, this.bindArrayBuffer(i), this._gl.bufferData(this._gl.ARRAY_BUFFER, e, this._gl.DYNAMIC_DRAW), i.references = 1, i;\n }\n /**\n * Delete a webGL buffer used with instantiation\n * @param buffer defines the webGL buffer to delete\n */\n deleteInstancesBuffer(e) {\n this._gl.deleteBuffer(e);\n }\n _clientWaitAsync(e, t = 0, i = 10) {\n const r = this._gl;\n return new Promise((s, a) => {\n const o = () => {\n const l = r.clientWaitSync(e, t, 0);\n if (l == r.WAIT_FAILED) {\n a();\n return;\n }\n if (l == r.TIMEOUT_EXPIRED) {\n setTimeout(o, i);\n return;\n }\n s();\n };\n o();\n });\n }\n /**\n * @internal\n */\n _readPixelsAsync(e, t, i, r, s, a, o) {\n if (this._webGLVersion < 2)\n throw new Error(\"_readPixelsAsync only work on WebGL2+\");\n const l = this._gl, c = l.createBuffer();\n l.bindBuffer(l.PIXEL_PACK_BUFFER, c), l.bufferData(l.PIXEL_PACK_BUFFER, o.byteLength, l.STREAM_READ), l.readPixels(e, t, i, r, s, a, 0), l.bindBuffer(l.PIXEL_PACK_BUFFER, null);\n const h = l.fenceSync(l.SYNC_GPU_COMMANDS_COMPLETE, 0);\n return h ? (l.flush(), this._clientWaitAsync(h, 0, 10).then(() => (l.deleteSync(h), l.bindBuffer(l.PIXEL_PACK_BUFFER, c), l.getBufferSubData(l.PIXEL_PACK_BUFFER, 0, o), l.bindBuffer(l.PIXEL_PACK_BUFFER, null), l.deleteBuffer(c), o))) : null;\n }\n dispose() {\n for (this.hideLoadingUI(), this.onNewSceneAddedObservable.clear(); this.postProcesses.length; )\n this.postProcesses[0].dispose();\n for (this._rescalePostProcess && this._rescalePostProcess.dispose(); this.scenes.length; )\n this.scenes[0].dispose();\n for (; this._virtualScenes.length; )\n this._virtualScenes[0].dispose();\n st.Instances.length === 1 && se.audioEngine && (se.audioEngine.dispose(), se.audioEngine = null);\n const e = this.getHostWindow();\n e && typeof e.removeEventListener == \"function\" && (e.removeEventListener(\"blur\", this._onBlur), e.removeEventListener(\"focus\", this._onFocus)), this._renderingCanvas && (this._renderingCanvas.removeEventListener(\"focus\", this._onCanvasFocus), this._renderingCanvas.removeEventListener(\"blur\", this._onCanvasBlur), this._renderingCanvas.removeEventListener(\"pointerout\", this._onCanvasPointerOut), this._renderingCanvas.removeEventListener(\"contextmenu\", this._onCanvasContextMenu)), no() && (document.removeEventListener(\"fullscreenchange\", this._onFullscreenChange), document.removeEventListener(\"mozfullscreenchange\", this._onFullscreenChange), document.removeEventListener(\"webkitfullscreenchange\", this._onFullscreenChange), document.removeEventListener(\"msfullscreenchange\", this._onFullscreenChange), document.removeEventListener(\"pointerlockchange\", this._onPointerLockChange), document.removeEventListener(\"mspointerlockchange\", this._onPointerLockChange), document.removeEventListener(\"mozpointerlockchange\", this._onPointerLockChange), document.removeEventListener(\"webkitpointerlockchange\", this._onPointerLockChange)), super.dispose();\n const t = st.Instances.indexOf(this);\n t >= 0 && st.Instances.splice(t, 1), se.Instances.length || st.OnEnginesDisposedObservable.notifyObservers(this), this.onResizeObservable.clear(), this.onCanvasBlurObservable.clear(), this.onCanvasFocusObservable.clear(), this.onCanvasPointerOutObservable.clear(), this.onBeginFrameObservable.clear(), this.onEndFrameObservable.clear();\n }\n _disableTouchAction() {\n !this._renderingCanvas || !this._renderingCanvas.setAttribute || (this._renderingCanvas.setAttribute(\"touch-action\", \"none\"), this._renderingCanvas.style.touchAction = \"none\", this._renderingCanvas.style.webkitTapHighlightColor = \"transparent\");\n }\n // Loading screen\n /**\n * Display the loading screen\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\n */\n displayLoadingUI() {\n if (!yi())\n return;\n const e = this.loadingScreen;\n e && e.displayLoadingUI();\n }\n /**\n * Hide the loading screen\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\n */\n hideLoadingUI() {\n if (!yi())\n return;\n const e = this._loadingScreen;\n e && e.hideLoadingUI();\n }\n /**\n * Gets the current loading screen object\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\n */\n get loadingScreen() {\n return !this._loadingScreen && this._renderingCanvas && (this._loadingScreen = se.DefaultLoadingScreenFactory(this._renderingCanvas)), this._loadingScreen;\n }\n /**\n * Sets the current loading screen object\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\n */\n set loadingScreen(e) {\n this._loadingScreen = e;\n }\n /**\n * Sets the current loading screen text\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\n */\n set loadingUIText(e) {\n this.loadingScreen.loadingUIText = e;\n }\n /**\n * Sets the current loading screen background color\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\n */\n set loadingUIBackgroundColor(e) {\n this.loadingScreen.loadingUIBackgroundColor = e;\n }\n /**\n * creates and returns a new video element\n * @param constraints video constraints\n * @returns video element\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n createVideoElement(e) {\n return document.createElement(\"video\");\n }\n /** Pointerlock and fullscreen */\n /**\n * Ask the browser to promote the current element to pointerlock mode\n * @param element defines the DOM element to promote\n */\n static _RequestPointerlock(e) {\n if (e.requestPointerLock) {\n const t = e.requestPointerLock();\n t instanceof Promise ? t.then(() => {\n e.focus();\n }).catch(() => {\n }) : e.focus();\n }\n }\n /**\n * Asks the browser to exit pointerlock mode\n */\n static _ExitPointerlock() {\n document.exitPointerLock && document.exitPointerLock();\n }\n /**\n * Ask the browser to promote the current element to fullscreen rendering mode\n * @param element defines the DOM element to promote\n */\n static _RequestFullscreen(e) {\n const t = e.requestFullscreen || e.webkitRequestFullscreen;\n t && t.call(e);\n }\n /**\n * Asks the browser to exit fullscreen mode\n */\n static _ExitFullscreen() {\n const e = document;\n document.exitFullscreen ? document.exitFullscreen() : e.webkitCancelFullScreen && e.webkitCancelFullScreen();\n }\n /**\n * Get Font size information\n * @param font font name\n * @returns an object containing ascent, height and descent\n */\n getFontOffset(e) {\n const t = document.createElement(\"span\");\n t.innerHTML = \"Hg\", t.setAttribute(\"style\", `font: ${e} !important`);\n const i = document.createElement(\"div\");\n i.style.display = \"inline-block\", i.style.width = \"1px\", i.style.height = \"0px\", i.style.verticalAlign = \"bottom\";\n const r = document.createElement(\"div\");\n r.style.whiteSpace = \"nowrap\", r.appendChild(t), r.appendChild(i), document.body.appendChild(r);\n let s = 0, a = 0;\n try {\n a = i.getBoundingClientRect().top - t.getBoundingClientRect().top, i.style.verticalAlign = \"baseline\", s = i.getBoundingClientRect().top - t.getBoundingClientRect().top;\n } finally {\n document.body.removeChild(r);\n }\n return { ascent: s, height: a, descent: a - s };\n }\n}\nse.ALPHA_DISABLE = 0;\nse.ALPHA_ADD = 1;\nse.ALPHA_COMBINE = 2;\nse.ALPHA_SUBTRACT = 3;\nse.ALPHA_MULTIPLY = 4;\nse.ALPHA_MAXIMIZED = 5;\nse.ALPHA_ONEONE = 6;\nse.ALPHA_PREMULTIPLIED = 7;\nse.ALPHA_PREMULTIPLIED_PORTERDUFF = 8;\nse.ALPHA_INTERPOLATE = 9;\nse.ALPHA_SCREENMODE = 10;\nse.DELAYLOADSTATE_NONE = 0;\nse.DELAYLOADSTATE_LOADED = 1;\nse.DELAYLOADSTATE_LOADING = 2;\nse.DELAYLOADSTATE_NOTLOADED = 4;\nse.NEVER = 512;\nse.ALWAYS = 519;\nse.LESS = 513;\nse.EQUAL = 514;\nse.LEQUAL = 515;\nse.GREATER = 516;\nse.GEQUAL = 518;\nse.NOTEQUAL = 517;\nse.KEEP = 7680;\nse.REPLACE = 7681;\nse.INCR = 7682;\nse.DECR = 7683;\nse.INVERT = 5386;\nse.INCR_WRAP = 34055;\nse.DECR_WRAP = 34056;\nse.TEXTURE_CLAMP_ADDRESSMODE = 0;\nse.TEXTURE_WRAP_ADDRESSMODE = 1;\nse.TEXTURE_MIRROR_ADDRESSMODE = 2;\nse.TEXTUREFORMAT_ALPHA = 0;\nse.TEXTUREFORMAT_LUMINANCE = 1;\nse.TEXTUREFORMAT_LUMINANCE_ALPHA = 2;\nse.TEXTUREFORMAT_RGB = 4;\nse.TEXTUREFORMAT_RGBA = 5;\nse.TEXTUREFORMAT_RED = 6;\nse.TEXTUREFORMAT_R = 6;\nse.TEXTUREFORMAT_RG = 7;\nse.TEXTUREFORMAT_RED_INTEGER = 8;\nse.TEXTUREFORMAT_R_INTEGER = 8;\nse.TEXTUREFORMAT_RG_INTEGER = 9;\nse.TEXTUREFORMAT_RGB_INTEGER = 10;\nse.TEXTUREFORMAT_RGBA_INTEGER = 11;\nse.TEXTURETYPE_UNSIGNED_BYTE = 0;\nse.TEXTURETYPE_UNSIGNED_INT = 0;\nse.TEXTURETYPE_FLOAT = 1;\nse.TEXTURETYPE_HALF_FLOAT = 2;\nse.TEXTURETYPE_BYTE = 3;\nse.TEXTURETYPE_SHORT = 4;\nse.TEXTURETYPE_UNSIGNED_SHORT = 5;\nse.TEXTURETYPE_INT = 6;\nse.TEXTURETYPE_UNSIGNED_INTEGER = 7;\nse.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4 = 8;\nse.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1 = 9;\nse.TEXTURETYPE_UNSIGNED_SHORT_5_6_5 = 10;\nse.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV = 11;\nse.TEXTURETYPE_UNSIGNED_INT_24_8 = 12;\nse.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV = 13;\nse.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV = 14;\nse.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV = 15;\nse.TEXTURE_NEAREST_SAMPLINGMODE = 1;\nse.TEXTURE_BILINEAR_SAMPLINGMODE = 2;\nse.TEXTURE_TRILINEAR_SAMPLINGMODE = 3;\nse.TEXTURE_NEAREST_NEAREST_MIPLINEAR = 8;\nse.TEXTURE_LINEAR_LINEAR_MIPNEAREST = 11;\nse.TEXTURE_LINEAR_LINEAR_MIPLINEAR = 3;\nse.TEXTURE_NEAREST_NEAREST_MIPNEAREST = 4;\nse.TEXTURE_NEAREST_LINEAR_MIPNEAREST = 5;\nse.TEXTURE_NEAREST_LINEAR_MIPLINEAR = 6;\nse.TEXTURE_NEAREST_LINEAR = 7;\nse.TEXTURE_NEAREST_NEAREST = 1;\nse.TEXTURE_LINEAR_NEAREST_MIPNEAREST = 9;\nse.TEXTURE_LINEAR_NEAREST_MIPLINEAR = 10;\nse.TEXTURE_LINEAR_LINEAR = 2;\nse.TEXTURE_LINEAR_NEAREST = 12;\nse.TEXTURE_EXPLICIT_MODE = 0;\nse.TEXTURE_SPHERICAL_MODE = 1;\nse.TEXTURE_PLANAR_MODE = 2;\nse.TEXTURE_CUBIC_MODE = 3;\nse.TEXTURE_PROJECTION_MODE = 4;\nse.TEXTURE_SKYBOX_MODE = 5;\nse.TEXTURE_INVCUBIC_MODE = 6;\nse.TEXTURE_EQUIRECTANGULAR_MODE = 7;\nse.TEXTURE_FIXED_EQUIRECTANGULAR_MODE = 8;\nse.TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9;\nse.SCALEMODE_FLOOR = 1;\nse.SCALEMODE_NEAREST = 2;\nse.SCALEMODE_CEILING = 3;\nse._RescalePostProcessFactory = null;\nse._RenderPassIdCounter = 0;\nfunction rc(n, e, t) {\n try {\n const i = n.next();\n i.done ? e(i) : i.value ? i.value.then(() => {\n i.value = void 0, e(i);\n }, t) : e(i);\n } catch (i) {\n t(i);\n }\n}\nfunction zy(n = 25) {\n let e;\n return (t, i, r) => {\n const s = performance.now();\n e === void 0 || s - e > n ? (e = s, setTimeout(() => {\n rc(t, i, r);\n }, 0)) : rc(t, i, r);\n };\n}\nfunction Z_(n, e, t, i, r) {\n const s = () => {\n let a;\n const o = (l) => {\n l.done ? t(l.value) : a === void 0 ? a = !0 : s();\n };\n do\n a = void 0, !r || !r.aborted ? e(n, o, i) : i(new Error(\"Aborted\")), a === void 0 && (a = !1);\n while (a);\n };\n s();\n}\nfunction nf(n, e) {\n let t;\n return Z_(n, rc, (i) => t = i, (i) => {\n throw i;\n }, e), t;\n}\nfunction j_(n, e, t) {\n return new Promise((i, r) => {\n Z_(n, e, i, r, t);\n });\n}\nfunction Wy(n, e) {\n return (...t) => nf(n(...t), e);\n}\nclass Eu {\n constructor(e, t, i) {\n this.bu = e, this.bv = t, this.distance = i, this.faceId = 0, this.subMeshId = 0;\n }\n}\nclass Fs {\n /**\n * Creates a new bounding box\n * @param min defines the minimum vector (in local space)\n * @param max defines the maximum vector (in local space)\n * @param worldMatrix defines the new world matrix\n */\n constructor(e, t, i) {\n this.vectors = vi.BuildArray(8, _.Zero), this.center = _.Zero(), this.centerWorld = _.Zero(), this.extendSize = _.Zero(), this.extendSizeWorld = _.Zero(), this.directions = vi.BuildArray(3, _.Zero), this.vectorsWorld = vi.BuildArray(8, _.Zero), this.minimumWorld = _.Zero(), this.maximumWorld = _.Zero(), this.minimum = _.Zero(), this.maximum = _.Zero(), this._drawWrapperFront = null, this._drawWrapperBack = null, this.reConstruct(e, t, i);\n }\n // Methods\n /**\n * Recreates the entire bounding box from scratch as if we call the constructor in place\n * @param min defines the new minimum vector (in local space)\n * @param max defines the new maximum vector (in local space)\n * @param worldMatrix defines the new world matrix\n */\n reConstruct(e, t, i) {\n const r = e.x, s = e.y, a = e.z, o = t.x, l = t.y, c = t.z, h = this.vectors;\n this.minimum.copyFromFloats(r, s, a), this.maximum.copyFromFloats(o, l, c), h[0].copyFromFloats(r, s, a), h[1].copyFromFloats(o, l, c), h[2].copyFromFloats(o, s, a), h[3].copyFromFloats(r, l, a), h[4].copyFromFloats(r, s, c), h[5].copyFromFloats(o, l, a), h[6].copyFromFloats(r, l, c), h[7].copyFromFloats(o, s, c), t.addToRef(e, this.center).scaleInPlace(0.5), t.subtractToRef(e, this.extendSize).scaleInPlace(0.5), this._worldMatrix = i || L.IdentityReadOnly, this._update(this._worldMatrix);\n }\n /**\n * Scale the current bounding box by applying a scale factor\n * @param factor defines the scale factor to apply\n * @returns the current bounding box\n */\n scale(e) {\n const t = Fs._TmpVector3, i = this.maximum.subtractToRef(this.minimum, t[0]), r = i.length();\n i.normalizeFromLength(r);\n const s = r * e, a = i.scaleInPlace(s * 0.5), o = this.center.subtractToRef(a, t[1]), l = this.center.addToRef(a, t[2]);\n return this.reConstruct(o, l, this._worldMatrix), this;\n }\n /**\n * Gets the world matrix of the bounding box\n * @returns a matrix\n */\n getWorldMatrix() {\n return this._worldMatrix;\n }\n /**\n * @internal\n */\n _update(e) {\n const t = this.minimumWorld, i = this.maximumWorld, r = this.directions, s = this.vectorsWorld, a = this.vectors;\n if (e.isIdentity()) {\n t.copyFrom(this.minimum), i.copyFrom(this.maximum);\n for (let o = 0; o < 8; ++o)\n s[o].copyFrom(a[o]);\n this.extendSizeWorld.copyFrom(this.extendSize), this.centerWorld.copyFrom(this.center);\n } else {\n t.setAll(Number.MAX_VALUE), i.setAll(-Number.MAX_VALUE);\n for (let o = 0; o < 8; ++o) {\n const l = s[o];\n _.TransformCoordinatesToRef(a[o], e, l), t.minimizeInPlace(l), i.maximizeInPlace(l);\n }\n i.subtractToRef(t, this.extendSizeWorld).scaleInPlace(0.5), i.addToRef(t, this.centerWorld).scaleInPlace(0.5);\n }\n _.FromArrayToRef(e.m, 0, r[0]), _.FromArrayToRef(e.m, 4, r[1]), _.FromArrayToRef(e.m, 8, r[2]), this._worldMatrix = e;\n }\n /**\n * Tests if the bounding box is intersecting the frustum planes\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if there is an intersection\n */\n isInFrustum(e) {\n return Fs.IsInFrustum(this.vectorsWorld, e);\n }\n /**\n * Tests if the bounding box is entirely inside the frustum planes\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if there is an inclusion\n */\n isCompletelyInFrustum(e) {\n return Fs.IsCompletelyInFrustum(this.vectorsWorld, e);\n }\n /**\n * Tests if a point is inside the bounding box\n * @param point defines the point to test\n * @returns true if the point is inside the bounding box\n */\n intersectsPoint(e) {\n const t = this.minimumWorld, i = this.maximumWorld, r = t.x, s = t.y, a = t.z, o = i.x, l = i.y, c = i.z, h = e.x, u = e.y, f = e.z, d = -xt;\n return !(o - h < d || d > h - r || l - u < d || d > u - s || c - f < d || d > f - a);\n }\n /**\n * Tests if the bounding box intersects with a bounding sphere\n * @param sphere defines the sphere to test\n * @returns true if there is an intersection\n */\n intersectsSphere(e) {\n return Fs.IntersectsSphere(this.minimumWorld, this.maximumWorld, e.centerWorld, e.radiusWorld);\n }\n /**\n * Tests if the bounding box intersects with a box defined by a min and max vectors\n * @param min defines the min vector to use\n * @param max defines the max vector to use\n * @returns true if there is an intersection\n */\n intersectsMinMax(e, t) {\n const i = this.minimumWorld, r = this.maximumWorld, s = i.x, a = i.y, o = i.z, l = r.x, c = r.y, h = r.z, u = e.x, f = e.y, d = e.z, p = t.x, g = t.y, m = t.z;\n return !(l < u || s > p || c < f || a > g || h < d || o > m);\n }\n /**\n * Disposes the resources of the class\n */\n dispose() {\n var e, t;\n (e = this._drawWrapperFront) == null || e.dispose(), (t = this._drawWrapperBack) == null || t.dispose();\n }\n // Statics\n /**\n * Tests if two bounding boxes are intersections\n * @param box0 defines the first box to test\n * @param box1 defines the second box to test\n * @returns true if there is an intersection\n */\n static Intersects(e, t) {\n return e.intersectsMinMax(t.minimumWorld, t.maximumWorld);\n }\n /**\n * Tests if a bounding box defines by a min/max vectors intersects a sphere\n * @param minPoint defines the minimum vector of the bounding box\n * @param maxPoint defines the maximum vector of the bounding box\n * @param sphereCenter defines the sphere center\n * @param sphereRadius defines the sphere radius\n * @returns true if there is an intersection\n */\n static IntersectsSphere(e, t, i, r) {\n const s = Fs._TmpVector3[0];\n return _.ClampToRef(i, e, t, s), _.DistanceSquared(i, s) <= r * r;\n }\n /**\n * Tests if a bounding box defined with 8 vectors is entirely inside frustum planes\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if there is an inclusion\n */\n static IsCompletelyInFrustum(e, t) {\n for (let i = 0; i < 6; ++i) {\n const r = t[i];\n for (let s = 0; s < 8; ++s)\n if (r.dotCoordinate(e[s]) < 0)\n return !1;\n }\n return !0;\n }\n /**\n * Tests if a bounding box defined with 8 vectors intersects frustum planes\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if there is an intersection\n */\n static IsInFrustum(e, t) {\n for (let i = 0; i < 6; ++i) {\n let r = !0;\n const s = t[i];\n for (let a = 0; a < 8; ++a)\n if (s.dotCoordinate(e[a]) >= 0) {\n r = !1;\n break;\n }\n if (r)\n return !1;\n }\n return !0;\n }\n}\nFs._TmpVector3 = vi.BuildArray(3, _.Zero);\nclass Mn {\n /**\n * Creates a new bounding sphere\n * @param min defines the minimum vector (in local space)\n * @param max defines the maximum vector (in local space)\n * @param worldMatrix defines the new world matrix\n */\n constructor(e, t, i) {\n this.center = _.Zero(), this.centerWorld = _.Zero(), this.minimum = _.Zero(), this.maximum = _.Zero(), this.reConstruct(e, t, i);\n }\n /**\n * Recreates the entire bounding sphere from scratch as if we call the constructor in place\n * @param min defines the new minimum vector (in local space)\n * @param max defines the new maximum vector (in local space)\n * @param worldMatrix defines the new world matrix\n */\n reConstruct(e, t, i) {\n this.minimum.copyFrom(e), this.maximum.copyFrom(t);\n const r = _.Distance(e, t);\n t.addToRef(e, this.center).scaleInPlace(0.5), this.radius = r * 0.5, this._update(i || L.IdentityReadOnly);\n }\n /**\n * Scale the current bounding sphere by applying a scale factor\n * @param factor defines the scale factor to apply\n * @returns the current bounding box\n */\n scale(e) {\n const t = this.radius * e, i = Mn._TmpVector3, r = i[0].setAll(t), s = this.center.subtractToRef(r, i[1]), a = this.center.addToRef(r, i[2]);\n return this.reConstruct(s, a, this._worldMatrix), this;\n }\n /**\n * Gets the world matrix of the bounding box\n * @returns a matrix\n */\n getWorldMatrix() {\n return this._worldMatrix;\n }\n // Methods\n /**\n * @internal\n */\n _update(e) {\n if (e.isIdentity())\n this.centerWorld.copyFrom(this.center), this.radiusWorld = this.radius;\n else {\n _.TransformCoordinatesToRef(this.center, e, this.centerWorld);\n const t = Mn._TmpVector3[0];\n _.TransformNormalFromFloatsToRef(1, 1, 1, e, t), this.radiusWorld = Math.max(Math.abs(t.x), Math.abs(t.y), Math.abs(t.z)) * this.radius;\n }\n }\n /**\n * Tests if the bounding sphere is intersecting the frustum planes\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if there is an intersection\n */\n isInFrustum(e) {\n const t = this.centerWorld, i = this.radiusWorld;\n for (let r = 0; r < 6; r++)\n if (e[r].dotCoordinate(t) <= -i)\n return !1;\n return !0;\n }\n /**\n * Tests if the bounding sphere center is in between the frustum planes.\n * Used for optimistic fast inclusion.\n * @param frustumPlanes defines the frustum planes to test\n * @returns true if the sphere center is in between the frustum planes\n */\n isCenterInFrustum(e) {\n const t = this.centerWorld;\n for (let i = 0; i < 6; i++)\n if (e[i].dotCoordinate(t) < 0)\n return !1;\n return !0;\n }\n /**\n * Tests if a point is inside the bounding sphere\n * @param point defines the point to test\n * @returns true if the point is inside the bounding sphere\n */\n intersectsPoint(e) {\n const t = _.DistanceSquared(this.centerWorld, e);\n return !(this.radiusWorld * this.radiusWorld < t);\n }\n // Statics\n /**\n * Checks if two sphere intersect\n * @param sphere0 sphere 0\n * @param sphere1 sphere 1\n * @returns true if the spheres intersect\n */\n static Intersects(e, t) {\n const i = _.DistanceSquared(e.centerWorld, t.centerWorld), r = e.radiusWorld + t.radiusWorld;\n return !(r * r < i);\n }\n /**\n * Creates a sphere from a center and a radius\n * @param center The center\n * @param radius radius\n * @param matrix Optional worldMatrix\n * @returns The sphere\n */\n static CreateFromCenterAndRadius(e, t, i) {\n this._TmpVector3[0].copyFrom(e), this._TmpVector3[1].copyFromFloats(0, 0, t), this._TmpVector3[2].copyFrom(e), this._TmpVector3[0].addInPlace(this._TmpVector3[1]), this._TmpVector3[2].subtractInPlace(this._TmpVector3[1]);\n const r = new Mn(this._TmpVector3[0], this._TmpVector3[2]);\n return i ? r._worldMatrix = i : r._worldMatrix = L.Identity(), r;\n }\n}\nMn._TmpVector3 = vi.BuildArray(3, _.Zero);\nconst Bh = { min: 0, max: 0 }, kh = { min: 0, max: 0 }, cg = (n, e, t) => {\n const i = _.Dot(e.centerWorld, n), r = Math.abs(_.Dot(e.directions[0], n)) * e.extendSize.x, s = Math.abs(_.Dot(e.directions[1], n)) * e.extendSize.y, a = Math.abs(_.Dot(e.directions[2], n)) * e.extendSize.z, o = r + s + a;\n t.min = i - o, t.max = i + o;\n}, tr = (n, e, t) => (cg(n, e, Bh), cg(n, t, kh), !(Bh.min > kh.max || kh.min > Bh.max));\nclass Cr {\n /**\n * Constructs bounding info\n * @param minimum min vector of the bounding box/sphere\n * @param maximum max vector of the bounding box/sphere\n * @param worldMatrix defines the new world matrix\n */\n constructor(e, t, i) {\n this._isLocked = !1, this.boundingBox = new Fs(e, t, i), this.boundingSphere = new Mn(e, t, i);\n }\n /**\n * Recreates the entire bounding info from scratch as if we call the constructor in place\n * @param min defines the new minimum vector (in local space)\n * @param max defines the new maximum vector (in local space)\n * @param worldMatrix defines the new world matrix\n */\n reConstruct(e, t, i) {\n this.boundingBox.reConstruct(e, t, i), this.boundingSphere.reConstruct(e, t, i);\n }\n /**\n * min vector of the bounding box/sphere\n */\n get minimum() {\n return this.boundingBox.minimum;\n }\n /**\n * max vector of the bounding box/sphere\n */\n get maximum() {\n return this.boundingBox.maximum;\n }\n /**\n * If the info is locked and won't be updated to avoid perf overhead\n */\n get isLocked() {\n return this._isLocked;\n }\n set isLocked(e) {\n this._isLocked = e;\n }\n // Methods\n /**\n * Updates the bounding sphere and box\n * @param world world matrix to be used to update\n */\n update(e) {\n this._isLocked || (this.boundingBox._update(e), this.boundingSphere._update(e));\n }\n /**\n * Recreate the bounding info to be centered around a specific point given a specific extend.\n * @param center New center of the bounding info\n * @param extend New extend of the bounding info\n * @returns the current bounding info\n */\n centerOn(e, t) {\n const i = Cr._TmpVector3[0].copyFrom(e).subtractInPlace(t), r = Cr._TmpVector3[1].copyFrom(e).addInPlace(t);\n return this.boundingBox.reConstruct(i, r, this.boundingBox.getWorldMatrix()), this.boundingSphere.reConstruct(i, r, this.boundingBox.getWorldMatrix()), this;\n }\n /**\n * Grows the bounding info to include the given point.\n * @param point The point that will be included in the current bounding info (in local space)\n * @returns the current bounding info\n */\n encapsulate(e) {\n const t = _.Minimize(this.minimum, e), i = _.Maximize(this.maximum, e);\n return this.reConstruct(t, i, this.boundingBox.getWorldMatrix()), this;\n }\n /**\n * Grows the bounding info to encapsulate the given bounding info.\n * @param toEncapsulate The bounding info that will be encapsulated in the current bounding info\n * @returns the current bounding info\n */\n encapsulateBoundingInfo(e) {\n const t = z.Matrix[0];\n this.boundingBox.getWorldMatrix().invertToRef(t);\n const i = z.Vector3[0];\n return _.TransformCoordinatesToRef(e.boundingBox.minimumWorld, t, i), this.encapsulate(i), _.TransformCoordinatesToRef(e.boundingBox.maximumWorld, t, i), this.encapsulate(i), this;\n }\n /**\n * Scale the current bounding info by applying a scale factor\n * @param factor defines the scale factor to apply\n * @returns the current bounding info\n */\n scale(e) {\n return this.boundingBox.scale(e), this.boundingSphere.scale(e), this;\n }\n /**\n * Returns `true` if the bounding info is within the frustum defined by the passed array of planes.\n * @param frustumPlanes defines the frustum to test\n * @param strategy defines the strategy to use for the culling (default is BABYLON.AbstractMesh.CULLINGSTRATEGY_STANDARD)\n * The different strategies available are:\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_STANDARD most accurate but slower @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_STANDARD\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY faster but less accurate @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION can be faster if always visible @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_OPTIMISTIC_INCLUSION\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY can be faster if always visible @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY\n * @returns true if the bounding info is in the frustum planes\n */\n isInFrustum(e, t = 0) {\n return (t === 2 || t === 3) && this.boundingSphere.isCenterInFrustum(e) ? !0 : this.boundingSphere.isInFrustum(e) ? t === 1 || t === 3 ? !0 : this.boundingBox.isInFrustum(e) : !1;\n }\n /**\n * Gets the world distance between the min and max points of the bounding box\n */\n get diagonalLength() {\n const e = this.boundingBox;\n return e.maximumWorld.subtractToRef(e.minimumWorld, Cr._TmpVector3[0]).length();\n }\n /**\n * Checks if a cullable object (mesh...) is in the camera frustum\n * Unlike isInFrustum this checks the full bounding box\n * @param frustumPlanes Camera near/planes\n * @returns true if the object is in frustum otherwise false\n */\n isCompletelyInFrustum(e) {\n return this.boundingBox.isCompletelyInFrustum(e);\n }\n /**\n * @internal\n */\n _checkCollision(e) {\n return e._canDoCollision(this.boundingSphere.centerWorld, this.boundingSphere.radiusWorld, this.boundingBox.minimumWorld, this.boundingBox.maximumWorld);\n }\n /**\n * Checks if a point is inside the bounding box and bounding sphere or the mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\n * @param point the point to check intersection with\n * @returns if the point intersects\n */\n intersectsPoint(e) {\n return !(!this.boundingSphere.centerWorld || !this.boundingSphere.intersectsPoint(e) || !this.boundingBox.intersectsPoint(e));\n }\n /**\n * Checks if another bounding info intersects the bounding box and bounding sphere or the mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\n * @param boundingInfo the bounding info to check intersection with\n * @param precise if the intersection should be done using OBB\n * @returns if the bounding info intersects\n */\n intersects(e, t) {\n if (!Mn.Intersects(this.boundingSphere, e.boundingSphere) || !Fs.Intersects(this.boundingBox, e.boundingBox))\n return !1;\n if (!t)\n return !0;\n const i = this.boundingBox, r = e.boundingBox;\n return !(!tr(i.directions[0], i, r) || !tr(i.directions[1], i, r) || !tr(i.directions[2], i, r) || !tr(r.directions[0], i, r) || !tr(r.directions[1], i, r) || !tr(r.directions[2], i, r) || !tr(_.Cross(i.directions[0], r.directions[0]), i, r) || !tr(_.Cross(i.directions[0], r.directions[1]), i, r) || !tr(_.Cross(i.directions[0], r.directions[2]), i, r) || !tr(_.Cross(i.directions[1], r.directions[0]), i, r) || !tr(_.Cross(i.directions[1], r.directions[1]), i, r) || !tr(_.Cross(i.directions[1], r.directions[2]), i, r) || !tr(_.Cross(i.directions[2], r.directions[0]), i, r) || !tr(_.Cross(i.directions[2], r.directions[1]), i, r) || !tr(_.Cross(i.directions[2], r.directions[2]), i, r));\n }\n}\nCr._TmpVector3 = vi.BuildArray(2, _.Zero);\nclass Dc {\n static extractMinAndMaxIndexed(e, t, i, r, s, a) {\n for (let o = i; o < i + r; o++) {\n const l = t[o] * 3, c = e[l], h = e[l + 1], u = e[l + 2];\n s.minimizeInPlaceFromFloats(c, h, u), a.maximizeInPlaceFromFloats(c, h, u);\n }\n }\n static extractMinAndMax(e, t, i, r, s, a) {\n for (let o = t, l = t * r; o < t + i; o++, l += r) {\n const c = e[l], h = e[l + 1], u = e[l + 2];\n s.minimizeInPlaceFromFloats(c, h, u), a.maximizeInPlaceFromFloats(c, h, u);\n }\n }\n}\nP([\n ln.filter((...[n, e]) => !Array.isArray(n) && !Array.isArray(e))\n // eslint-disable-next-line @typescript-eslint/naming-convention\n], Dc, \"extractMinAndMaxIndexed\", null);\nP([\n ln.filter((...[n]) => !Array.isArray(n))\n // eslint-disable-next-line @typescript-eslint/naming-convention\n], Dc, \"extractMinAndMax\", null);\nfunction Gy(n, e, t, i, r = null) {\n const s = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), a = new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n return Dc.extractMinAndMaxIndexed(n, e, t, i, s, a), r && (s.x -= s.x * r.x + r.y, s.y -= s.y * r.x + r.y, s.z -= s.z * r.x + r.y, a.x += a.x * r.x + r.y, a.y += a.y * r.x + r.y, a.z += a.z * r.x + r.y), {\n minimum: s,\n maximum: a\n };\n}\nfunction _o(n, e, t, i = null, r) {\n const s = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), a = new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n return r || (r = 3), Dc.extractMinAndMax(n, e, t, r, s, a), i && (s.x -= s.x * i.x + i.y, s.y -= s.y * i.x + i.y, s.z -= s.z * i.x + i.y, a.x += a.x * i.x + i.y, a.y += a.y * i.x + i.y, a.z += a.z * i.x + i.y), {\n minimum: s,\n maximum: a\n };\n}\nclass bi {\n /**\n * Gets material defines used by the effect associated to the sub mesh\n */\n get materialDefines() {\n var e;\n return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.defines : (e = this._getDrawWrapper()) == null ? void 0 : e.defines;\n }\n /**\n * Sets material defines used by the effect associated to the sub mesh\n */\n set materialDefines(e) {\n const t = this._mainDrawWrapperOverride ?? this._getDrawWrapper(void 0, !0);\n t.defines = e;\n }\n /**\n * @internal\n */\n _getDrawWrapper(e, t = !1) {\n e = e ?? this._engine.currentRenderPassId;\n let i = this._drawWrappers[e];\n return !i && t && (this._drawWrappers[e] = i = new ka(this._mesh.getScene().getEngine())), i;\n }\n /**\n * @internal\n */\n _removeDrawWrapper(e, t = !0) {\n var i;\n t && ((i = this._drawWrappers[e]) == null || i.dispose()), this._drawWrappers[e] = void 0;\n }\n /**\n * Gets associated (main) effect (possibly the effect override if defined)\n */\n get effect() {\n var e;\n return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : ((e = this._getDrawWrapper()) == null ? void 0 : e.effect) ?? null;\n }\n /** @internal */\n get _drawWrapper() {\n return this._mainDrawWrapperOverride ?? this._getDrawWrapper(void 0, !0);\n }\n /** @internal */\n get _drawWrapperOverride() {\n return this._mainDrawWrapperOverride;\n }\n /**\n * @internal\n */\n _setMainDrawWrapperOverride(e) {\n this._mainDrawWrapperOverride = e;\n }\n /**\n * Sets associated effect (effect used to render this submesh)\n * @param effect defines the effect to associate with\n * @param defines defines the set of defines used to compile this effect\n * @param materialContext material context associated to the effect\n * @param resetContext true to reset the draw context\n */\n setEffect(e, t = null, i, r = !0) {\n const s = this._drawWrapper;\n s.setEffect(e, t, r), i !== void 0 && (s.materialContext = i), e || (s.defines = null, s.materialContext = void 0);\n }\n /**\n * Resets the draw wrappers cache\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\n */\n resetDrawCache(e) {\n if (this._drawWrappers)\n if (e !== void 0) {\n this._removeDrawWrapper(e);\n return;\n } else\n for (const t of this._drawWrappers)\n t == null || t.dispose();\n this._drawWrappers = [];\n }\n /**\n * Add a new submesh to a mesh\n * @param materialIndex defines the material index to use\n * @param verticesStart defines vertex index start\n * @param verticesCount defines vertices count\n * @param indexStart defines index start\n * @param indexCount defines indices count\n * @param mesh defines the parent mesh\n * @param renderingMesh defines an optional rendering mesh\n * @param createBoundingBox defines if bounding box should be created for this submesh\n * @returns the new submesh\n */\n static AddToMesh(e, t, i, r, s, a, o, l = !0) {\n return new bi(e, t, i, r, s, a, o, l);\n }\n /**\n * Creates a new submesh\n * @param materialIndex defines the material index to use\n * @param verticesStart defines vertex index start\n * @param verticesCount defines vertices count\n * @param indexStart defines index start\n * @param indexCount defines indices count\n * @param mesh defines the parent mesh\n * @param renderingMesh defines an optional rendering mesh\n * @param createBoundingBox defines if bounding box should be created for this submesh\n * @param addToMesh defines a boolean indicating that the submesh must be added to the mesh.subMeshes array (true by default)\n */\n constructor(e, t, i, r, s, a, o, l = !0, c = !0) {\n this.materialIndex = e, this.verticesStart = t, this.verticesCount = i, this.indexStart = r, this.indexCount = s, this._mainDrawWrapperOverride = null, this._linesIndexCount = 0, this._linesIndexBuffer = null, this._lastColliderWorldVertices = null, this._lastColliderTransformMatrix = null, this._wasDispatched = !1, this._renderId = 0, this._alphaIndex = 0, this._distanceToCamera = 0, this._currentMaterial = null, this._mesh = a, this._renderingMesh = o || a, c && a.subMeshes.push(this), this._engine = this._mesh.getScene().getEngine(), this.resetDrawCache(), this._trianglePlanes = [], this._id = a.subMeshes.length - 1, l && (this.refreshBoundingInfo(), a.computeWorldMatrix(!0));\n }\n /**\n * Returns true if this submesh covers the entire parent mesh\n * @ignorenaming\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n get IsGlobal() {\n return this.verticesStart === 0 && this.verticesCount === this._mesh.getTotalVertices() && this.indexStart === 0 && this.indexCount === this._mesh.getTotalIndices();\n }\n /**\n * Returns the submesh BoundingInfo object\n * @returns current bounding info (or mesh's one if the submesh is global)\n */\n getBoundingInfo() {\n return this.IsGlobal || this._mesh.hasThinInstances ? this._mesh.getBoundingInfo() : this._boundingInfo;\n }\n /**\n * Sets the submesh BoundingInfo\n * @param boundingInfo defines the new bounding info to use\n * @returns the SubMesh\n */\n setBoundingInfo(e) {\n return this._boundingInfo = e, this;\n }\n /**\n * Returns the mesh of the current submesh\n * @returns the parent mesh\n */\n getMesh() {\n return this._mesh;\n }\n /**\n * Returns the rendering mesh of the submesh\n * @returns the rendering mesh (could be different from parent mesh)\n */\n getRenderingMesh() {\n return this._renderingMesh;\n }\n /**\n * Returns the replacement mesh of the submesh\n * @returns the replacement mesh (could be different from parent mesh)\n */\n getReplacementMesh() {\n return this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\n }\n /**\n * Returns the effective mesh of the submesh\n * @returns the effective mesh (could be different from parent mesh)\n */\n getEffectiveMesh() {\n const e = this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\n return e || this._renderingMesh;\n }\n /**\n * Returns the submesh material\n * @param getDefaultMaterial Defines whether or not to get the default material if nothing has been defined.\n * @returns null or the current material\n */\n getMaterial(e = !0) {\n const t = this._renderingMesh.getMaterialForRenderPass(this._engine.currentRenderPassId) ?? this._renderingMesh.material;\n if (t) {\n if (this._isMultiMaterial(t)) {\n const i = t.getSubMaterial(this.materialIndex);\n return this._currentMaterial !== i && (this._currentMaterial = i, this.resetDrawCache()), i;\n }\n } else\n return e ? this._mesh.getScene().defaultMaterial : null;\n return t;\n }\n _isMultiMaterial(e) {\n return e.getSubMaterial !== void 0;\n }\n // Methods\n /**\n * Sets a new updated BoundingInfo object to the submesh\n * @param data defines an optional position array to use to determine the bounding info\n * @returns the SubMesh\n */\n refreshBoundingInfo(e = null) {\n if (this._lastColliderWorldVertices = null, this.IsGlobal || !this._renderingMesh || !this._renderingMesh.geometry)\n return this;\n if (e || (e = this._renderingMesh.getVerticesData(I.PositionKind)), !e)\n return this._boundingInfo = this._mesh.getBoundingInfo(), this;\n const t = this._renderingMesh.getIndices();\n let i;\n if (this.indexStart === 0 && this.indexCount === t.length) {\n const r = this._renderingMesh.getBoundingInfo();\n i = { minimum: r.minimum.clone(), maximum: r.maximum.clone() };\n } else\n i = Gy(e, t, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias);\n return this._boundingInfo ? this._boundingInfo.reConstruct(i.minimum, i.maximum) : this._boundingInfo = new Cr(i.minimum, i.maximum), this;\n }\n /**\n * @internal\n */\n _checkCollision(e) {\n return this.getBoundingInfo()._checkCollision(e);\n }\n /**\n * Updates the submesh BoundingInfo\n * @param world defines the world matrix to use to update the bounding info\n * @returns the submesh\n */\n updateBoundingInfo(e) {\n let t = this.getBoundingInfo();\n return t || (this.refreshBoundingInfo(), t = this.getBoundingInfo()), t && t.update(e), this;\n }\n /**\n * True is the submesh bounding box intersects the frustum defined by the passed array of planes.\n * @param frustumPlanes defines the frustum planes\n * @returns true if the submesh is intersecting with the frustum\n */\n isInFrustum(e) {\n const t = this.getBoundingInfo();\n return t ? t.isInFrustum(e, this._mesh.cullingStrategy) : !1;\n }\n /**\n * True is the submesh bounding box is completely inside the frustum defined by the passed array of planes\n * @param frustumPlanes defines the frustum planes\n * @returns true if the submesh is inside the frustum\n */\n isCompletelyInFrustum(e) {\n const t = this.getBoundingInfo();\n return t ? t.isCompletelyInFrustum(e) : !1;\n }\n /**\n * Renders the submesh\n * @param enableAlphaMode defines if alpha needs to be used\n * @returns the submesh\n */\n render(e) {\n return this._renderingMesh.render(this, e, this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : void 0), this;\n }\n /**\n * @internal\n */\n _getLinesIndexBuffer(e, t) {\n if (!this._linesIndexBuffer) {\n const i = [];\n for (let r = this.indexStart; r < this.indexStart + this.indexCount; r += 3)\n i.push(e[r], e[r + 1], e[r + 1], e[r + 2], e[r + 2], e[r]);\n this._linesIndexBuffer = t.createIndexBuffer(i), this._linesIndexCount = i.length;\n }\n return this._linesIndexBuffer;\n }\n /**\n * Checks if the submesh intersects with a ray\n * @param ray defines the ray to test\n * @returns true is the passed ray intersects the submesh bounding box\n */\n canIntersects(e) {\n const t = this.getBoundingInfo();\n return t ? e.intersectsBox(t.boundingBox) : !1;\n }\n /**\n * Intersects current submesh with a ray\n * @param ray defines the ray to test\n * @param positions defines mesh's positions array\n * @param indices defines mesh's indices array\n * @param fastCheck defines if the first intersection will be used (and not the closest)\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @returns intersection info or null if no intersection\n */\n intersects(e, t, i, r, s) {\n const a = this.getMaterial();\n if (!a)\n return null;\n let o = 3, l = !1;\n switch (a.fillMode) {\n case 3:\n case 5:\n case 6:\n case 8:\n return null;\n case 7:\n o = 1, l = !0;\n break;\n }\n return a.fillMode === 4 ? i.length ? this._intersectLines(e, t, i, this._mesh.intersectionThreshold, r) : this._intersectUnIndexedLines(e, t, i, this._mesh.intersectionThreshold, r) : !i.length && this._mesh._unIndexed ? this._intersectUnIndexedTriangles(e, t, i, r, s) : this._intersectTriangles(e, t, i, o, l, r, s);\n }\n /**\n * @internal\n */\n _intersectLines(e, t, i, r, s) {\n let a = null;\n for (let o = this.indexStart; o < this.indexStart + this.indexCount; o += 2) {\n const l = t[i[o]], c = t[i[o + 1]], h = e.intersectionSegment(l, c, r);\n if (!(h < 0) && (s || !a || h < a.distance) && (a = new Eu(null, null, h), a.faceId = o / 2, s))\n break;\n }\n return a;\n }\n /**\n * @internal\n */\n _intersectUnIndexedLines(e, t, i, r, s) {\n let a = null;\n for (let o = this.verticesStart; o < this.verticesStart + this.verticesCount; o += 2) {\n const l = t[o], c = t[o + 1], h = e.intersectionSegment(l, c, r);\n if (!(h < 0) && (s || !a || h < a.distance) && (a = new Eu(null, null, h), a.faceId = o / 2, s))\n break;\n }\n return a;\n }\n /**\n * @internal\n */\n _intersectTriangles(e, t, i, r, s, a, o) {\n let l = null, c = -1;\n for (let h = this.indexStart; h < this.indexStart + this.indexCount - (3 - r); h += r) {\n c++;\n const u = i[h], f = i[h + 1], d = i[h + 2];\n if (s && d === 4294967295) {\n h += 2;\n continue;\n }\n const p = t[u], g = t[f], m = t[d];\n if (!p || !g || !m || o && !o(p, g, m, e, u, f, d))\n continue;\n const v = e.intersectsTriangle(p, g, m);\n if (v) {\n if (v.distance < 0)\n continue;\n if ((a || !l || v.distance < l.distance) && (l = v, l.faceId = c, a))\n break;\n }\n }\n return l;\n }\n /**\n * @internal\n */\n _intersectUnIndexedTriangles(e, t, i, r, s) {\n let a = null;\n for (let o = this.verticesStart; o < this.verticesStart + this.verticesCount; o += 3) {\n const l = t[o], c = t[o + 1], h = t[o + 2];\n if (s && !s(l, c, h, e, -1, -1, -1))\n continue;\n const u = e.intersectsTriangle(l, c, h);\n if (u) {\n if (u.distance < 0)\n continue;\n if ((r || !a || u.distance < a.distance) && (a = u, a.faceId = o / 3, r))\n break;\n }\n }\n return a;\n }\n /** @internal */\n _rebuild() {\n this._linesIndexBuffer && (this._linesIndexBuffer = null);\n }\n // Clone\n /**\n * Creates a new submesh from the passed mesh\n * @param newMesh defines the new hosting mesh\n * @param newRenderingMesh defines an optional rendering mesh\n * @returns the new submesh\n */\n clone(e, t) {\n const i = new bi(this.materialIndex, this.verticesStart, this.verticesCount, this.indexStart, this.indexCount, e, t, !1);\n if (!this.IsGlobal) {\n const r = this.getBoundingInfo();\n if (!r)\n return i;\n i._boundingInfo = new Cr(r.minimum, r.maximum);\n }\n return i;\n }\n // Dispose\n /**\n * Release associated resources\n */\n dispose() {\n this._linesIndexBuffer && (this._mesh.getScene().getEngine()._releaseBuffer(this._linesIndexBuffer), this._linesIndexBuffer = null);\n const e = this._mesh.subMeshes.indexOf(this);\n this._mesh.subMeshes.splice(e, 1), this.resetDrawCache();\n }\n /**\n * Gets the class name\n * @returns the string \"SubMesh\".\n */\n getClassName() {\n return \"SubMesh\";\n }\n // Statics\n /**\n * Creates a new submesh from indices data\n * @param materialIndex the index of the main mesh material\n * @param startIndex the index where to start the copy in the mesh indices array\n * @param indexCount the number of indices to copy then from the startIndex\n * @param mesh the main mesh to create the submesh from\n * @param renderingMesh the optional rendering mesh\n * @param createBoundingBox defines if bounding box should be created for this submesh\n * @returns a new submesh\n */\n static CreateFromIndices(e, t, i, r, s, a = !0) {\n let o = Number.MAX_VALUE, l = -Number.MAX_VALUE;\n const h = (s || r).getIndices();\n for (let u = t; u < t + i; u++) {\n const f = h[u];\n f < o && (o = f), f > l && (l = f);\n }\n return new bi(e, o, l - o + 1, t, i, r, s, a);\n }\n}\nclass Gl {\n}\nclass re {\n /**\n * Creates a new VertexData\n */\n constructor() {\n this.uniqueId = 0, this.metadata = {}, this._applyTo = Wy(this._applyToCoroutine.bind(this)), this.uniqueId = re._UniqueIDGenerator, re._UniqueIDGenerator++;\n }\n /**\n * Uses the passed data array to set the set the values for the specified kind of data\n * @param data a linear array of floating numbers\n * @param kind the type of data that is being set, eg positions, colors etc\n */\n set(e, t) {\n switch (e.length || ne.Warn(`Setting vertex data kind '${t}' with an empty array`), t) {\n case I.PositionKind:\n this.positions = e;\n break;\n case I.NormalKind:\n this.normals = e;\n break;\n case I.TangentKind:\n this.tangents = e;\n break;\n case I.UVKind:\n this.uvs = e;\n break;\n case I.UV2Kind:\n this.uvs2 = e;\n break;\n case I.UV3Kind:\n this.uvs3 = e;\n break;\n case I.UV4Kind:\n this.uvs4 = e;\n break;\n case I.UV5Kind:\n this.uvs5 = e;\n break;\n case I.UV6Kind:\n this.uvs6 = e;\n break;\n case I.ColorKind:\n this.colors = e;\n break;\n case I.MatricesIndicesKind:\n this.matricesIndices = e;\n break;\n case I.MatricesWeightsKind:\n this.matricesWeights = e;\n break;\n case I.MatricesIndicesExtraKind:\n this.matricesIndicesExtra = e;\n break;\n case I.MatricesWeightsExtraKind:\n this.matricesWeightsExtra = e;\n break;\n }\n }\n /**\n * Associates the vertexData to the passed Mesh.\n * Sets it as updatable or not (default `false`)\n * @param mesh the mesh the vertexData is applied to\n * @param updatable when used and having the value true allows new data to update the vertexData\n * @returns the VertexData\n */\n applyToMesh(e, t) {\n return this._applyTo(e, t, !1), this;\n }\n /**\n * Associates the vertexData to the passed Geometry.\n * Sets it as updatable or not (default `false`)\n * @param geometry the geometry the vertexData is applied to\n * @param updatable when used and having the value true allows new data to update the vertexData\n * @returns VertexData\n */\n applyToGeometry(e, t) {\n return this._applyTo(e, t, !1), this;\n }\n /**\n * Updates the associated mesh\n * @param mesh the mesh to be updated\n * @returns VertexData\n */\n updateMesh(e) {\n return this._update(e), this;\n }\n /**\n * Updates the associated geometry\n * @param geometry the geometry to be updated\n * @returns VertexData.\n */\n updateGeometry(e) {\n return this._update(e), this;\n }\n /**\n * @internal\n */\n *_applyToCoroutine(e, t = !1, i) {\n if (this.positions && (e.setVerticesData(I.PositionKind, this.positions, t), i && (yield)), this.normals && (e.setVerticesData(I.NormalKind, this.normals, t), i && (yield)), this.tangents && (e.setVerticesData(I.TangentKind, this.tangents, t), i && (yield)), this.uvs && (e.setVerticesData(I.UVKind, this.uvs, t), i && (yield)), this.uvs2 && (e.setVerticesData(I.UV2Kind, this.uvs2, t), i && (yield)), this.uvs3 && (e.setVerticesData(I.UV3Kind, this.uvs3, t), i && (yield)), this.uvs4 && (e.setVerticesData(I.UV4Kind, this.uvs4, t), i && (yield)), this.uvs5 && (e.setVerticesData(I.UV5Kind, this.uvs5, t), i && (yield)), this.uvs6 && (e.setVerticesData(I.UV6Kind, this.uvs6, t), i && (yield)), this.colors && (e.setVerticesData(I.ColorKind, this.colors, t), this.hasVertexAlpha && e.hasVertexAlpha !== void 0 && (e.hasVertexAlpha = !0), i && (yield)), this.matricesIndices && (e.setVerticesData(I.MatricesIndicesKind, this.matricesIndices, t), i && (yield)), this.matricesWeights && (e.setVerticesData(I.MatricesWeightsKind, this.matricesWeights, t), i && (yield)), this.matricesIndicesExtra && (e.setVerticesData(I.MatricesIndicesExtraKind, this.matricesIndicesExtra, t), i && (yield)), this.matricesWeightsExtra && (e.setVerticesData(I.MatricesWeightsExtraKind, this.matricesWeightsExtra, t), i && (yield)), this.indices ? (e.setIndices(this.indices, null, t), i && (yield)) : e.setIndices([], null), e.subMeshes && this.materialInfos && this.materialInfos.length > 1) {\n const r = e;\n r.subMeshes = [];\n for (const s of this.materialInfos)\n new bi(s.materialIndex, s.verticesStart, s.verticesCount, s.indexStart, s.indexCount, r);\n }\n return this;\n }\n _update(e, t, i) {\n return this.positions && e.updateVerticesData(I.PositionKind, this.positions, t, i), this.normals && e.updateVerticesData(I.NormalKind, this.normals, t, i), this.tangents && e.updateVerticesData(I.TangentKind, this.tangents, t, i), this.uvs && e.updateVerticesData(I.UVKind, this.uvs, t, i), this.uvs2 && e.updateVerticesData(I.UV2Kind, this.uvs2, t, i), this.uvs3 && e.updateVerticesData(I.UV3Kind, this.uvs3, t, i), this.uvs4 && e.updateVerticesData(I.UV4Kind, this.uvs4, t, i), this.uvs5 && e.updateVerticesData(I.UV5Kind, this.uvs5, t, i), this.uvs6 && e.updateVerticesData(I.UV6Kind, this.uvs6, t, i), this.colors && e.updateVerticesData(I.ColorKind, this.colors, t, i), this.matricesIndices && e.updateVerticesData(I.MatricesIndicesKind, this.matricesIndices, t, i), this.matricesWeights && e.updateVerticesData(I.MatricesWeightsKind, this.matricesWeights, t, i), this.matricesIndicesExtra && e.updateVerticesData(I.MatricesIndicesExtraKind, this.matricesIndicesExtra, t, i), this.matricesWeightsExtra && e.updateVerticesData(I.MatricesWeightsExtraKind, this.matricesWeightsExtra, t, i), this.indices && e.setIndices(this.indices, null), this;\n }\n static _TransformVector3Coordinates(e, t, i = 0, r = e.length) {\n const s = z.Vector3[0], a = z.Vector3[1];\n for (let o = i; o < i + r; o += 3)\n _.FromArrayToRef(e, o, s), _.TransformCoordinatesToRef(s, t, a), e[o] = a.x, e[o + 1] = a.y, e[o + 2] = a.z;\n }\n static _TransformVector3Normals(e, t, i = 0, r = e.length) {\n const s = z.Vector3[0], a = z.Vector3[1];\n for (let o = i; o < i + r; o += 3)\n _.FromArrayToRef(e, o, s), _.TransformNormalToRef(s, t, a), e[o] = a.x, e[o + 1] = a.y, e[o + 2] = a.z;\n }\n static _TransformVector4Normals(e, t, i = 0, r = e.length) {\n const s = z.Vector4[0], a = z.Vector4[1];\n for (let o = i; o < i + r; o += 4)\n Ke.FromArrayToRef(e, o, s), Ke.TransformNormalToRef(s, t, a), e[o] = a.x, e[o + 1] = a.y, e[o + 2] = a.z, e[o + 3] = a.w;\n }\n static _FlipFaces(e, t = 0, i = e.length) {\n for (let r = t; r < t + i; r += 3) {\n const s = e[r + 1];\n e[r + 1] = e[r + 2], e[r + 2] = s;\n }\n }\n /**\n * Transforms each position and each normal of the vertexData according to the passed Matrix\n * @param matrix the transforming matrix\n * @returns the VertexData\n */\n transform(e) {\n const t = e.determinant() < 0;\n return this.positions && re._TransformVector3Coordinates(this.positions, e), this.normals && re._TransformVector3Normals(this.normals, e), this.tangents && re._TransformVector4Normals(this.tangents, e), t && this.indices && re._FlipFaces(this.indices), this;\n }\n /**\n * Generates an array of vertex data where each vertex data only has one material info\n * @returns An array of VertexData\n */\n splitBasedOnMaterialID() {\n if (!this.materialInfos || this.materialInfos.length < 2)\n return [this];\n const e = [];\n for (const t of this.materialInfos) {\n const i = new re();\n if (this.positions && (i.positions = this.positions.slice(t.verticesStart * 3, (t.verticesCount + t.verticesStart) * 3)), this.normals && (i.normals = this.normals.slice(t.verticesStart * 3, (t.verticesCount + t.verticesStart) * 3)), this.tangents && (i.tangents = this.tangents.slice(t.verticesStart * 4, (t.verticesCount + t.verticesStart) * 4)), this.colors && (i.colors = this.colors.slice(t.verticesStart * 4, (t.verticesCount + t.verticesStart) * 4)), this.uvs && (i.uvs = this.uvs.slice(t.verticesStart * 2, (t.verticesCount + t.verticesStart) * 2)), this.uvs2 && (i.uvs2 = this.uvs2.slice(t.verticesStart * 2, (t.verticesCount + t.verticesStart) * 2)), this.uvs3 && (i.uvs3 = this.uvs3.slice(t.verticesStart * 2, (t.verticesCount + t.verticesStart) * 2)), this.uvs4 && (i.uvs4 = this.uvs4.slice(t.verticesStart * 2, (t.verticesCount + t.verticesStart) * 2)), this.uvs5 && (i.uvs5 = this.uvs5.slice(t.verticesStart * 2, (t.verticesCount + t.verticesStart) * 2)), this.uvs6 && (i.uvs6 = this.uvs6.slice(t.verticesStart * 2, (t.verticesCount + t.verticesStart) * 2)), this.matricesIndices && (i.matricesIndices = this.matricesIndices.slice(t.verticesStart * 4, (t.verticesCount + t.verticesStart) * 4)), this.matricesIndicesExtra && (i.matricesIndicesExtra = this.matricesIndicesExtra.slice(t.verticesStart * 4, (t.verticesCount + t.verticesStart) * 4)), this.matricesWeights && (i.matricesWeights = this.matricesWeights.slice(t.verticesStart * 4, (t.verticesCount + t.verticesStart) * 4)), this.matricesWeightsExtra && (i.matricesWeightsExtra = this.matricesWeightsExtra.slice(t.verticesStart * 4, (t.verticesCount + t.verticesStart) * 4)), this.indices) {\n i.indices = [];\n for (let s = t.indexStart; s < t.indexStart + t.indexCount; s++)\n i.indices.push(this.indices[s] - t.verticesStart);\n }\n const r = new Gl();\n r.indexStart = 0, r.indexCount = i.indices ? i.indices.length : 0, r.materialIndex = t.materialIndex, r.verticesStart = 0, r.verticesCount = (i.positions ? i.positions.length : 0) / 3, i.materialInfos = [r], e.push(i);\n }\n return e;\n }\n /**\n * Merges the passed VertexData into the current one\n * @param others the VertexData to be merged into the current one\n * @param use32BitsIndices defines a boolean indicating if indices must be store in a 32 bits array\n * @param forceCloneIndices defines a boolean indicating if indices are forced to be cloned\n * @param mergeMaterialIds defines a boolean indicating if we need to merge the material infos\n * @param enableCompletion defines a boolean indicating if the vertex data should be completed to be compatible\n * @returns the modified VertexData\n */\n merge(e, t = !1, i = !1, r = !1, s = !1) {\n const a = Array.isArray(e) ? e.map((o) => ({ vertexData: o })) : [{ vertexData: e }];\n return nf(this._mergeCoroutine(void 0, a, t, !1, i, r, s));\n }\n /**\n * @internal\n */\n *_mergeCoroutine(e, t, i = !1, r, s, a = !1, o = !1) {\n var d, p;\n this._validate();\n let l = t.map((g) => g.vertexData), c = this;\n if (o)\n for (const g of l)\n g && (g._validate(), !this.normals && g.normals && (this.normals = new Float32Array(this.positions.length)), !this.tangents && g.tangents && (this.tangents = new Float32Array(this.positions.length / 3 * 4)), !this.uvs && g.uvs && (this.uvs = new Float32Array(this.positions.length / 3 * 2)), !this.uvs2 && g.uvs2 && (this.uvs2 = new Float32Array(this.positions.length / 3 * 2)), !this.uvs3 && g.uvs3 && (this.uvs3 = new Float32Array(this.positions.length / 3 * 2)), !this.uvs4 && g.uvs4 && (this.uvs4 = new Float32Array(this.positions.length / 3 * 2)), !this.uvs5 && g.uvs5 && (this.uvs5 = new Float32Array(this.positions.length / 3 * 2)), !this.uvs6 && g.uvs6 && (this.uvs6 = new Float32Array(this.positions.length / 3 * 2)), !this.colors && g.colors && (this.colors = new Float32Array(this.positions.length / 3 * 4), this.colors.fill(1)), !this.matricesIndices && g.matricesIndices && (this.matricesIndices = new Float32Array(this.positions.length / 3 * 4)), !this.matricesWeights && g.matricesWeights && (this.matricesWeights = new Float32Array(this.positions.length / 3 * 4)), !this.matricesIndicesExtra && g.matricesIndicesExtra && (this.matricesIndicesExtra = new Float32Array(this.positions.length / 3 * 4)), !this.matricesWeightsExtra && g.matricesWeightsExtra && (this.matricesWeightsExtra = new Float32Array(this.positions.length / 3 * 4)));\n for (const g of l)\n if (g) {\n if (o)\n this.normals && !g.normals && (g.normals = new Float32Array(g.positions.length)), this.tangents && !g.tangents && (g.tangents = new Float32Array(g.positions.length / 3 * 4)), this.uvs && !g.uvs && (g.uvs = new Float32Array(g.positions.length / 3 * 2)), this.uvs2 && !g.uvs2 && (g.uvs2 = new Float32Array(g.positions.length / 3 * 2)), this.uvs3 && !g.uvs3 && (g.uvs3 = new Float32Array(g.positions.length / 3 * 2)), this.uvs4 && !g.uvs4 && (g.uvs4 = new Float32Array(g.positions.length / 3 * 2)), this.uvs5 && !g.uvs5 && (g.uvs5 = new Float32Array(g.positions.length / 3 * 2)), this.uvs6 && !g.uvs6 && (g.uvs6 = new Float32Array(g.positions.length / 3 * 2)), this.colors && !g.colors && (g.colors = new Float32Array(g.positions.length / 3 * 4), g.colors.fill(1)), this.matricesIndices && !g.matricesIndices && (g.matricesIndices = new Float32Array(g.positions.length / 3 * 4)), this.matricesWeights && !g.matricesWeights && (g.matricesWeights = new Float32Array(g.positions.length / 3 * 4)), this.matricesIndicesExtra && !g.matricesIndicesExtra && (g.matricesIndicesExtra = new Float32Array(g.positions.length / 3 * 4)), this.matricesWeightsExtra && !g.matricesWeightsExtra && (g.matricesWeightsExtra = new Float32Array(g.positions.length / 3 * 4));\n else if (g._validate(), !this.normals != !g.normals || !this.tangents != !g.tangents || !this.uvs != !g.uvs || !this.uvs2 != !g.uvs2 || !this.uvs3 != !g.uvs3 || !this.uvs4 != !g.uvs4 || !this.uvs5 != !g.uvs5 || !this.uvs6 != !g.uvs6 || !this.colors != !g.colors || !this.matricesIndices != !g.matricesIndices || !this.matricesWeights != !g.matricesWeights || !this.matricesIndicesExtra != !g.matricesIndicesExtra || !this.matricesWeightsExtra != !g.matricesWeightsExtra)\n throw new Error(\"Cannot merge vertex data that do not have the same set of attributes\");\n }\n if (a) {\n let g = 0, m = 0, v = 0;\n const E = [];\n let C = null;\n const T = [];\n for (const x of this.splitBasedOnMaterialID())\n T.push({ vertexData: x, transform: e });\n for (const x of t)\n if (x.vertexData)\n for (const S of x.vertexData.splitBasedOnMaterialID())\n T.push({ vertexData: S, transform: x.transform });\n T.sort((x, S) => {\n const M = x.vertexData.materialInfos ? x.vertexData.materialInfos[0].materialIndex : 0, N = S.vertexData.materialInfos ? S.vertexData.materialInfos[0].materialIndex : 0;\n return M > N ? 1 : M === N ? 0 : -1;\n });\n for (const x of T) {\n const S = x.vertexData;\n if (S.materialInfos ? g = S.materialInfos[0].materialIndex : g = 0, C && C.materialIndex === g)\n C.indexCount += S.indices.length, C.verticesCount += S.positions.length / 3;\n else {\n const M = new Gl();\n M.materialIndex = g, M.indexStart = m, M.indexCount = S.indices.length, M.verticesStart = v, M.verticesCount = S.positions.length / 3, E.push(M), C = M;\n }\n m += S.indices.length, v += S.positions.length / 3;\n }\n const R = T.splice(0, 1)[0];\n c = R.vertexData, e = R.transform, l = T.map((x) => x.vertexData), t = T, this.materialInfos = E;\n }\n const h = l.reduce((g, m) => {\n var v;\n return g + (((v = m.indices) == null ? void 0 : v.length) ?? 0);\n }, ((d = c.indices) == null ? void 0 : d.length) ?? 0);\n let f = s || l.some((g) => g.indices === c.indices) ? (p = c.indices) == null ? void 0 : p.slice() : c.indices;\n if (h > 0) {\n let g = (f == null ? void 0 : f.length) ?? 0;\n if (f || (f = new Array(h)), f.length !== h) {\n if (Array.isArray(f))\n f.length = h;\n else {\n const v = i || f instanceof Uint32Array ? new Uint32Array(h) : new Uint16Array(h);\n v.set(f), f = v;\n }\n e && e.determinant() < 0 && re._FlipFaces(f, 0, g);\n }\n let m = c.positions ? c.positions.length / 3 : 0;\n for (const { vertexData: v, transform: E } of t)\n if (v.indices) {\n for (let C = 0; C < v.indices.length; C++)\n f[g + C] = v.indices[C] + m;\n E && E.determinant() < 0 && re._FlipFaces(f, g, v.indices.length), m += v.positions.length / 3, g += v.indices.length, r && (yield);\n }\n }\n return this.indices = f, this.positions = re._MergeElement(I.PositionKind, c.positions, e, t.map((g) => [g.vertexData.positions, g.transform])), r && (yield), c.normals && (this.normals = re._MergeElement(I.NormalKind, c.normals, e, t.map((g) => [g.vertexData.normals, g.transform])), r && (yield)), c.tangents && (this.tangents = re._MergeElement(I.TangentKind, c.tangents, e, t.map((g) => [g.vertexData.tangents, g.transform])), r && (yield)), c.uvs && (this.uvs = re._MergeElement(I.UVKind, c.uvs, e, t.map((g) => [g.vertexData.uvs, g.transform])), r && (yield)), c.uvs2 && (this.uvs2 = re._MergeElement(I.UV2Kind, c.uvs2, e, t.map((g) => [g.vertexData.uvs2, g.transform])), r && (yield)), c.uvs3 && (this.uvs3 = re._MergeElement(I.UV3Kind, c.uvs3, e, t.map((g) => [g.vertexData.uvs3, g.transform])), r && (yield)), c.uvs4 && (this.uvs4 = re._MergeElement(I.UV4Kind, c.uvs4, e, t.map((g) => [g.vertexData.uvs4, g.transform])), r && (yield)), c.uvs5 && (this.uvs5 = re._MergeElement(I.UV5Kind, c.uvs5, e, t.map((g) => [g.vertexData.uvs5, g.transform])), r && (yield)), c.uvs6 && (this.uvs6 = re._MergeElement(I.UV6Kind, c.uvs6, e, t.map((g) => [g.vertexData.uvs6, g.transform])), r && (yield)), c.colors && (this.colors = re._MergeElement(I.ColorKind, c.colors, e, t.map((g) => [g.vertexData.colors, g.transform])), (c.hasVertexAlpha !== void 0 || t.some((g) => g.vertexData.hasVertexAlpha !== void 0)) && (this.hasVertexAlpha = c.hasVertexAlpha || t.some((g) => g.vertexData.hasVertexAlpha)), r && (yield)), c.matricesIndices && (this.matricesIndices = re._MergeElement(I.MatricesIndicesKind, c.matricesIndices, e, t.map((g) => [g.vertexData.matricesIndices, g.transform])), r && (yield)), c.matricesWeights && (this.matricesWeights = re._MergeElement(I.MatricesWeightsKind, c.matricesWeights, e, t.map((g) => [g.vertexData.matricesWeights, g.transform])), r && (yield)), c.matricesIndicesExtra && (this.matricesIndicesExtra = re._MergeElement(I.MatricesIndicesExtraKind, c.matricesIndicesExtra, e, t.map((g) => [g.vertexData.matricesIndicesExtra, g.transform])), r && (yield)), c.matricesWeightsExtra && (this.matricesWeightsExtra = re._MergeElement(I.MatricesWeightsExtraKind, c.matricesWeightsExtra, e, t.map((g) => [g.vertexData.matricesWeightsExtra, g.transform]))), this;\n }\n static _MergeElement(e, t, i, r) {\n const s = r.filter((l) => l[0] !== null && l[0] !== void 0);\n if (!t && s.length == 0)\n return t;\n if (!t)\n return this._MergeElement(e, s[0][0], s[0][1], s.slice(1));\n const a = s.reduce((l, c) => l + c[0].length, t.length), o = e === I.PositionKind ? re._TransformVector3Coordinates : e === I.NormalKind ? re._TransformVector3Normals : e === I.TangentKind ? re._TransformVector4Normals : () => {\n };\n if (t instanceof Float32Array) {\n const l = new Float32Array(a);\n l.set(t), i && o(l, i, 0, t.length);\n let c = t.length;\n for (const [h, u] of s)\n l.set(h, c), u && o(l, u, c, h.length), c += h.length;\n return l;\n } else {\n const l = new Array(a);\n for (let h = 0; h < t.length; h++)\n l[h] = t[h];\n i && o(l, i, 0, t.length);\n let c = t.length;\n for (const [h, u] of s) {\n for (let f = 0; f < h.length; f++)\n l[c + f] = h[f];\n u && o(l, u, c, h.length), c += h.length;\n }\n return l;\n }\n }\n _validate() {\n if (!this.positions)\n throw new Ba(\"Positions are required\", Pc.MeshInvalidPositionsError);\n const e = (r, s) => {\n const a = I.DeduceStride(r);\n if (s.length % a !== 0)\n throw new Error(\"The \" + r + \"s array count must be a multiple of \" + a);\n return s.length / a;\n }, t = e(I.PositionKind, this.positions), i = (r, s) => {\n const a = e(r, s);\n if (a !== t)\n throw new Error(\"The \" + r + \"s element count (\" + a + \") does not match the positions count (\" + t + \")\");\n };\n this.normals && i(I.NormalKind, this.normals), this.tangents && i(I.TangentKind, this.tangents), this.uvs && i(I.UVKind, this.uvs), this.uvs2 && i(I.UV2Kind, this.uvs2), this.uvs3 && i(I.UV3Kind, this.uvs3), this.uvs4 && i(I.UV4Kind, this.uvs4), this.uvs5 && i(I.UV5Kind, this.uvs5), this.uvs6 && i(I.UV6Kind, this.uvs6), this.colors && i(I.ColorKind, this.colors), this.matricesIndices && i(I.MatricesIndicesKind, this.matricesIndices), this.matricesWeights && i(I.MatricesWeightsKind, this.matricesWeights), this.matricesIndicesExtra && i(I.MatricesIndicesExtraKind, this.matricesIndicesExtra), this.matricesWeightsExtra && i(I.MatricesWeightsExtraKind, this.matricesWeightsExtra);\n }\n /**\n * Clone the current vertex data\n * @returns a copy of the current data\n */\n clone() {\n const e = this.serialize();\n return re.Parse(e);\n }\n /**\n * Serializes the VertexData\n * @returns a serialized object\n */\n serialize() {\n const e = {};\n if (this.positions && (e.positions = Array.from(this.positions)), this.normals && (e.normals = Array.from(this.normals)), this.tangents && (e.tangents = Array.from(this.tangents)), this.uvs && (e.uvs = Array.from(this.uvs)), this.uvs2 && (e.uvs2 = Array.from(this.uvs2)), this.uvs3 && (e.uvs3 = Array.from(this.uvs3)), this.uvs4 && (e.uvs4 = Array.from(this.uvs4)), this.uvs5 && (e.uvs5 = Array.from(this.uvs5)), this.uvs6 && (e.uvs6 = Array.from(this.uvs6)), this.colors && (e.colors = Array.from(this.colors), e.hasVertexAlpha = this.hasVertexAlpha), this.matricesIndices && (e.matricesIndices = Array.from(this.matricesIndices), e.matricesIndices._isExpanded = !0), this.matricesWeights && (e.matricesWeights = Array.from(this.matricesWeights)), this.matricesIndicesExtra && (e.matricesIndicesExtra = Array.from(this.matricesIndicesExtra), e.matricesIndicesExtra._isExpanded = !0), this.matricesWeightsExtra && (e.matricesWeightsExtra = Array.from(this.matricesWeightsExtra)), e.indices = Array.from(this.indices), this.materialInfos) {\n e.materialInfos = [];\n for (const t of this.materialInfos) {\n const i = {\n indexStart: t.indexStart,\n indexCount: t.indexCount,\n materialIndex: t.materialIndex,\n verticesStart: t.verticesStart,\n verticesCount: t.verticesCount\n };\n e.materialInfos.push(i);\n }\n }\n return e;\n }\n // Statics\n /**\n * Extracts the vertexData from a mesh\n * @param mesh the mesh from which to extract the VertexData\n * @param copyWhenShared defines if the VertexData must be cloned when shared between multiple meshes, optional, default false\n * @param forceCopy indicating that the VertexData must be cloned, optional, default false\n * @returns the object VertexData associated to the passed mesh\n */\n static ExtractFromMesh(e, t, i) {\n return re._ExtractFrom(e, t, i);\n }\n /**\n * Extracts the vertexData from the geometry\n * @param geometry the geometry from which to extract the VertexData\n * @param copyWhenShared defines if the VertexData must be cloned when the geometry is shared between multiple meshes, optional, default false\n * @param forceCopy indicating that the VertexData must be cloned, optional, default false\n * @returns the object VertexData associated to the passed mesh\n */\n static ExtractFromGeometry(e, t, i) {\n return re._ExtractFrom(e, t, i);\n }\n static _ExtractFrom(e, t, i) {\n const r = new re();\n return e.isVerticesDataPresent(I.PositionKind) && (r.positions = e.getVerticesData(I.PositionKind, t, i)), e.isVerticesDataPresent(I.NormalKind) && (r.normals = e.getVerticesData(I.NormalKind, t, i)), e.isVerticesDataPresent(I.TangentKind) && (r.tangents = e.getVerticesData(I.TangentKind, t, i)), e.isVerticesDataPresent(I.UVKind) && (r.uvs = e.getVerticesData(I.UVKind, t, i)), e.isVerticesDataPresent(I.UV2Kind) && (r.uvs2 = e.getVerticesData(I.UV2Kind, t, i)), e.isVerticesDataPresent(I.UV3Kind) && (r.uvs3 = e.getVerticesData(I.UV3Kind, t, i)), e.isVerticesDataPresent(I.UV4Kind) && (r.uvs4 = e.getVerticesData(I.UV4Kind, t, i)), e.isVerticesDataPresent(I.UV5Kind) && (r.uvs5 = e.getVerticesData(I.UV5Kind, t, i)), e.isVerticesDataPresent(I.UV6Kind) && (r.uvs6 = e.getVerticesData(I.UV6Kind, t, i)), e.isVerticesDataPresent(I.ColorKind) && (r.colors = e.getVerticesData(I.ColorKind, t, i)), e.isVerticesDataPresent(I.MatricesIndicesKind) && (r.matricesIndices = e.getVerticesData(I.MatricesIndicesKind, t, i)), e.isVerticesDataPresent(I.MatricesWeightsKind) && (r.matricesWeights = e.getVerticesData(I.MatricesWeightsKind, t, i)), e.isVerticesDataPresent(I.MatricesIndicesExtraKind) && (r.matricesIndicesExtra = e.getVerticesData(I.MatricesIndicesExtraKind, t, i)), e.isVerticesDataPresent(I.MatricesWeightsExtraKind) && (r.matricesWeightsExtra = e.getVerticesData(I.MatricesWeightsExtraKind, t, i)), r.indices = e.getIndices(t, i), r;\n }\n /**\n * Creates the VertexData for a Ribbon\n * @param options an object used to set the following optional parameters for the ribbon, required but can be empty\n * * pathArray array of paths, each of which an array of successive Vector3\n * * closeArray creates a seam between the first and the last paths of the pathArray, optional, default false\n * * closePath creates a seam between the first and the last points of each path of the path array, optional, default false\n * * offset a positive integer, only used when pathArray contains a single path (offset = 10 means the point 1 is joined to the point 11), default rounded half size of the pathArray length\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * * invertUV swaps in the U and V coordinates when applying a texture, optional, default false\n * * uvs a linear array, of length 2 * number of vertices, of custom UV values, optional\n * * colors a linear array, of length 4 * number of vertices, of custom color values, optional\n * @returns the VertexData of the ribbon\n * @deprecated use CreateRibbonVertexData instead\n */\n static CreateRibbon(e) {\n throw We(\"ribbonBuilder\");\n }\n /**\n * Creates the VertexData for a box\n * @param options an object used to set the following optional parameters for the box, required but can be empty\n * * size sets the width, height and depth of the box to the value of size, optional default 1\n * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size\n * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size\n * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size\n * * faceUV an array of 6 Vector4 elements used to set different images to each box side\n * * faceColors an array of 6 Color3 elements used to set different colors to each box side\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the box\n * @deprecated Please use CreateBoxVertexData from the BoxBuilder file instead\n */\n static CreateBox(e) {\n throw We(\"boxBuilder\");\n }\n /**\n * Creates the VertexData for a tiled box\n * @param options an object used to set the following optional parameters for the box, required but can be empty\n * * faceTiles sets the pattern, tile size and number of tiles for a face\n * * faceUV an array of 6 Vector4 elements used to set different images to each box side\n * * faceColors an array of 6 Color3 elements used to set different colors to each box side\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * @param options.pattern\n * @param options.width\n * @param options.height\n * @param options.depth\n * @param options.tileSize\n * @param options.tileWidth\n * @param options.tileHeight\n * @param options.alignHorizontal\n * @param options.alignVertical\n * @param options.faceUV\n * @param options.faceColors\n * @param options.sideOrientation\n * @returns the VertexData of the box\n * @deprecated Please use CreateTiledBoxVertexData instead\n */\n static CreateTiledBox(e) {\n throw We(\"tiledBoxBuilder\");\n }\n /**\n * Creates the VertexData for a tiled plane\n * @param options an object used to set the following optional parameters for the box, required but can be empty\n * * pattern a limited pattern arrangement depending on the number\n * * tileSize sets the width, height and depth of the tile to the value of size, optional default 1\n * * tileWidth sets the width (x direction) of the tile, overwrites the width set by size, optional, default size\n * * tileHeight sets the height (y direction) of the tile, overwrites the height set by size, optional, default size\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the tiled plane\n * @deprecated use CreateTiledPlaneVertexData instead\n */\n static CreateTiledPlane(e) {\n throw We(\"tiledPlaneBuilder\");\n }\n /**\n * Creates the VertexData for an ellipsoid, defaults to a sphere\n * @param options an object used to set the following optional parameters for the box, required but can be empty\n * * segments sets the number of horizontal strips optional, default 32\n * * diameter sets the axes dimensions, diameterX, diameterY and diameterZ to the value of diameter, optional default 1\n * * diameterX sets the diameterX (x direction) of the ellipsoid, overwrites the diameterX set by diameter, optional, default diameter\n * * diameterY sets the diameterY (y direction) of the ellipsoid, overwrites the diameterY set by diameter, optional, default diameter\n * * diameterZ sets the diameterZ (z direction) of the ellipsoid, overwrites the diameterZ set by diameter, optional, default diameter\n * * arc a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the circumference (latitude) given by the arc value, optional, default 1\n * * slice a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the height (latitude) given by the arc value, optional, default 1\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the ellipsoid\n * @deprecated use CreateSphereVertexData instead\n */\n static CreateSphere(e) {\n throw We(\"sphereBuilder\");\n }\n /**\n * Creates the VertexData for a cylinder, cone or prism\n * @param options an object used to set the following optional parameters for the box, required but can be empty\n * * height sets the height (y direction) of the cylinder, optional, default 2\n * * diameterTop sets the diameter of the top of the cone, overwrites diameter, optional, default diameter\n * * diameterBottom sets the diameter of the bottom of the cone, overwrites diameter, optional, default diameter\n * * diameter sets the diameter of the top and bottom of the cone, optional default 1\n * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24\n * * subdivisions` the number of rings along the cylinder height, optional, default 1\n * * arc a number from 0 to 1, to create an unclosed cylinder based on the fraction of the circumference given by the arc value, optional, default 1\n * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively\n * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively\n * * hasRings when true makes each subdivision independently treated as a face for faceUV and faceColors, optional, default false\n * * enclose when true closes an open cylinder by adding extra flat faces between the height axis and vertical edges, think cut cake\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the cylinder, cone or prism\n * @deprecated please use CreateCylinderVertexData instead\n */\n static CreateCylinder(e) {\n throw We(\"cylinderBuilder\");\n }\n /**\n * Creates the VertexData for a torus\n * @param options an object used to set the following optional parameters for the box, required but can be empty\n * * diameter the diameter of the torus, optional default 1\n * * thickness the diameter of the tube forming the torus, optional default 0.5\n * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the torus\n * @deprecated use CreateTorusVertexData instead\n */\n static CreateTorus(e) {\n throw We(\"torusBuilder\");\n }\n /**\n * Creates the VertexData of the LineSystem\n * @param options an object used to set the following optional parameters for the LineSystem, required but can be empty\n * - lines an array of lines, each line being an array of successive Vector3\n * - colors an array of line colors, each of the line colors being an array of successive Color4, one per line point\n * @returns the VertexData of the LineSystem\n * @deprecated use CreateLineSystemVertexData instead\n */\n static CreateLineSystem(e) {\n throw We(\"linesBuilder\");\n }\n /**\n * Create the VertexData for a DashedLines\n * @param options an object used to set the following optional parameters for the DashedLines, required but can be empty\n * - points an array successive Vector3\n * - dashSize the size of the dashes relative to the dash number, optional, default 3\n * - gapSize the size of the gap between two successive dashes relative to the dash number, optional, default 1\n * - dashNb the intended total number of dashes, optional, default 200\n * @returns the VertexData for the DashedLines\n * @deprecated use CreateDashedLinesVertexData instead\n */\n static CreateDashedLines(e) {\n throw We(\"linesBuilder\");\n }\n /**\n * Creates the VertexData for a Ground\n * @param options an object used to set the following optional parameters for the Ground, required but can be empty\n * - width the width (x direction) of the ground, optional, default 1\n * - height the height (z direction) of the ground, optional, default 1\n * - subdivisions the number of subdivisions per side, optional, default 1\n * @returns the VertexData of the Ground\n * @deprecated Please use CreateGroundVertexData instead\n */\n static CreateGround(e) {\n throw We(\"groundBuilder\");\n }\n /**\n * Creates the VertexData for a TiledGround by subdividing the ground into tiles\n * @param options an object used to set the following optional parameters for the Ground, required but can be empty\n * * xmin the ground minimum X coordinate, optional, default -1\n * * zmin the ground minimum Z coordinate, optional, default -1\n * * xmax the ground maximum X coordinate, optional, default 1\n * * zmax the ground maximum Z coordinate, optional, default 1\n * * subdivisions a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the ground width and height creating 'tiles', default {w: 6, h: 6}\n * * precision a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the tile width and height, default {w: 2, h: 2}\n * @returns the VertexData of the TiledGround\n * @deprecated use CreateTiledGroundVertexData instead\n */\n static CreateTiledGround(e) {\n throw We(\"groundBuilder\");\n }\n /**\n * Creates the VertexData of the Ground designed from a heightmap\n * @param options an object used to set the following parameters for the Ground, required and provided by CreateGroundFromHeightMap\n * * width the width (x direction) of the ground\n * * height the height (z direction) of the ground\n * * subdivisions the number of subdivisions per side\n * * minHeight the minimum altitude on the ground, optional, default 0\n * * maxHeight the maximum altitude on the ground, optional default 1\n * * colorFilter the filter to apply to the image pixel colors to compute the height, optional Color3, default (0.3, 0.59, 0.11)\n * * buffer the array holding the image color data\n * * bufferWidth the width of image\n * * bufferHeight the height of image\n * * alphaFilter Remove any data where the alpha channel is below this value, defaults 0 (all data visible)\n * @returns the VertexData of the Ground designed from a heightmap\n * @deprecated use CreateGroundFromHeightMapVertexData instead\n */\n static CreateGroundFromHeightMap(e) {\n throw We(\"groundBuilder\");\n }\n /**\n * Creates the VertexData for a Plane\n * @param options an object used to set the following optional parameters for the plane, required but can be empty\n * * size sets the width and height of the plane to the value of size, optional default 1\n * * width sets the width (x direction) of the plane, overwrites the width set by size, optional, default size\n * * height sets the height (y direction) of the plane, overwrites the height set by size, optional, default size\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the box\n * @deprecated use CreatePlaneVertexData instead\n */\n static CreatePlane(e) {\n throw We(\"planeBuilder\");\n }\n /**\n * Creates the VertexData of the Disc or regular Polygon\n * @param options an object used to set the following optional parameters for the disc, required but can be empty\n * * radius the radius of the disc, optional default 0.5\n * * tessellation the number of polygon sides, optional, default 64\n * * arc a number from 0 to 1, to create an unclosed polygon based on the fraction of the circumference given by the arc value, optional, default 1\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the box\n * @deprecated use CreateDiscVertexData instead\n */\n static CreateDisc(e) {\n throw We(\"discBuilder\");\n }\n /**\n * Creates the VertexData for an irregular Polygon in the XoZ plane using a mesh built by polygonTriangulation.build()\n * All parameters are provided by CreatePolygon as needed\n * @param polygon a mesh built from polygonTriangulation.build()\n * @param sideOrientation takes the values Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * @param fUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively\n * @param fColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively\n * @param frontUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * @param backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @param wrap a boolean, default false, when true and fUVs used texture is wrapped around all sides, when false texture is applied side\n * @returns the VertexData of the Polygon\n * @deprecated use CreatePolygonVertexData instead\n */\n static CreatePolygon(e, t, i, r, s, a, o) {\n throw We(\"polygonBuilder\");\n }\n /**\n * Creates the VertexData of the IcoSphere\n * @param options an object used to set the following optional parameters for the IcoSphere, required but can be empty\n * * radius the radius of the IcoSphere, optional default 1\n * * radiusX allows stretching in the x direction, optional, default radius\n * * radiusY allows stretching in the y direction, optional, default radius\n * * radiusZ allows stretching in the z direction, optional, default radius\n * * flat when true creates a flat shaded mesh, optional, default true\n * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the IcoSphere\n * @deprecated use CreateIcoSphereVertexData instead\n */\n static CreateIcoSphere(e) {\n throw We(\"icoSphereBuilder\");\n }\n // inspired from // http://stemkoski.github.io/Three.js/Polyhedra.html\n /**\n * Creates the VertexData for a Polyhedron\n * @param options an object used to set the following optional parameters for the polyhedron, required but can be empty\n * * type provided types are:\n * * 0 : Tetrahedron, 1 : Octahedron, 2 : Dodecahedron, 3 : Icosahedron, 4 : Rhombicuboctahedron, 5 : Triangular Prism, 6 : Pentagonal Prism, 7 : Hexagonal Prism, 8 : Square Pyramid (J1)\n * * 9 : Pentagonal Pyramid (J2), 10 : Triangular Dipyramid (J12), 11 : Pentagonal Dipyramid (J13), 12 : Elongated Square Dipyramid (J15), 13 : Elongated Pentagonal Dipyramid (J16), 14 : Elongated Pentagonal Cupola (J20)\n * * size the size of the IcoSphere, optional default 1\n * * sizeX allows stretching in the x direction, optional, default size\n * * sizeY allows stretching in the y direction, optional, default size\n * * sizeZ allows stretching in the z direction, optional, default size\n * * custom a number that overwrites the type to create from an extended set of polyhedron from https://www.babylonjs-playground.com/#21QRSK#15 with minimised editor\n * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively\n * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively\n * * flat when true creates a flat shaded mesh, optional, default true\n * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the Polyhedron\n * @deprecated use CreatePolyhedronVertexData instead\n */\n static CreatePolyhedron(e) {\n throw We(\"polyhedronBuilder\");\n }\n /**\n * Creates the VertexData for a Capsule, inspired from https://github.com/maximeq/three-js-capsule-geometry/blob/master/src/CapsuleBufferGeometry.js\n * @param options an object used to set the following optional parameters for the capsule, required but can be empty\n * @returns the VertexData of the Capsule\n * @deprecated Please use CreateCapsuleVertexData from the capsuleBuilder file instead\n */\n static CreateCapsule(e = {\n orientation: _.Up(),\n subdivisions: 2,\n tessellation: 16,\n height: 1,\n radius: 0.25,\n capSubdivisions: 6\n }) {\n throw We(\"capsuleBuilder\");\n }\n // based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3D/src/away3d/primitives/TorusKnot.as?spec=svn2473&r=2473\n /**\n * Creates the VertexData for a TorusKnot\n * @param options an object used to set the following optional parameters for the TorusKnot, required but can be empty\n * * radius the radius of the torus knot, optional, default 2\n * * tube the thickness of the tube, optional, default 0.5\n * * radialSegments the number of sides on each tube segments, optional, default 32\n * * tubularSegments the number of tubes to decompose the knot into, optional, default 32\n * * p the number of windings around the z axis, optional, default 2\n * * q the number of windings around the x axis, optional, default 3\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\n * @returns the VertexData of the Torus Knot\n * @deprecated use CreateTorusKnotVertexData instead\n */\n static CreateTorusKnot(e) {\n throw We(\"torusKnotBuilder\");\n }\n // Tools\n /**\n * Compute normals for given positions and indices\n * @param positions an array of vertex positions, [...., x, y, z, ......]\n * @param indices an array of indices in groups of three for each triangular facet, [...., i, j, k, ......]\n * @param normals an array of vertex normals, [...., x, y, z, ......]\n * @param options an object used to set the following optional parameters for the TorusKnot, optional\n * * facetNormals : optional array of facet normals (vector3)\n * * facetPositions : optional array of facet positions (vector3)\n * * facetPartitioning : optional partitioning array. facetPositions is required for facetPartitioning computation\n * * ratio : optional partitioning ratio / bounding box, required for facetPartitioning computation\n * * bInfo : optional bounding info, required for facetPartitioning computation\n * * bbSize : optional bounding box size data, required for facetPartitioning computation\n * * subDiv : optional partitioning data about subdivisions on each axis (int), required for facetPartitioning computation\n * * useRightHandedSystem: optional boolean to for right handed system computation\n * * depthSort : optional boolean to enable the facet depth sort computation\n * * distanceTo : optional Vector3 to compute the facet depth from this location\n * * depthSortedFacets : optional array of depthSortedFacets to store the facet distances from the reference location\n */\n static ComputeNormals(e, t, i, r) {\n let s = 0, a = 0, o = 0, l = 0, c = 0, h = 0, u = 0, f = 0, d = 0, p = 0, g = 0, m = 0, v = 0, E = 0, C = 0, T = 0, R = 0, x = 0, S = 0, M = 0, N = !1, F = !1, U = !1, H = !1, q = 1, Z = 0, k = null;\n r && (N = !!r.facetNormals, F = !!r.facetPositions, U = !!r.facetPartitioning, q = r.useRightHandedSystem === !0 ? -1 : 1, Z = r.ratio || 0, H = !!r.depthSort, k = r.distanceTo, H && k === void 0 && (k = _.Zero()));\n let Q = 0, ce = 0, de = 0, j = 0;\n for (U && r && r.bbSize && (Q = r.subDiv.X * Z / r.bbSize.x, ce = r.subDiv.Y * Z / r.bbSize.y, de = r.subDiv.Z * Z / r.bbSize.z, j = r.subDiv.max * r.subDiv.max, r.facetPartitioning.length = 0), s = 0; s < e.length; s++)\n i[s] = 0;\n const J = t.length / 3 | 0;\n for (s = 0; s < J; s++) {\n if (m = t[s * 3] * 3, v = m + 1, E = m + 2, C = t[s * 3 + 1] * 3, T = C + 1, R = C + 2, x = t[s * 3 + 2] * 3, S = x + 1, M = x + 2, a = e[m] - e[C], o = e[v] - e[T], l = e[E] - e[R], c = e[x] - e[C], h = e[S] - e[T], u = e[M] - e[R], f = q * (o * u - l * h), d = q * (l * c - a * u), p = q * (a * h - o * c), g = Math.sqrt(f * f + d * d + p * p), g = g === 0 ? 1 : g, f /= g, d /= g, p /= g, N && r && (r.facetNormals[s].x = f, r.facetNormals[s].y = d, r.facetNormals[s].z = p), F && r && (r.facetPositions[s].x = (e[m] + e[C] + e[x]) / 3, r.facetPositions[s].y = (e[v] + e[T] + e[S]) / 3, r.facetPositions[s].z = (e[E] + e[R] + e[M]) / 3), U && r) {\n const O = Math.floor((r.facetPositions[s].x - r.bInfo.minimum.x * Z) * Q), G = Math.floor((r.facetPositions[s].y - r.bInfo.minimum.y * Z) * ce), ee = Math.floor((r.facetPositions[s].z - r.bInfo.minimum.z * Z) * de), _e = Math.floor((e[m] - r.bInfo.minimum.x * Z) * Q), Oe = Math.floor((e[v] - r.bInfo.minimum.y * Z) * ce), ze = Math.floor((e[E] - r.bInfo.minimum.z * Z) * de), fe = Math.floor((e[C] - r.bInfo.minimum.x * Z) * Q), Te = Math.floor((e[T] - r.bInfo.minimum.y * Z) * ce), Fe = Math.floor((e[R] - r.bInfo.minimum.z * Z) * de), Se = Math.floor((e[x] - r.bInfo.minimum.x * Z) * Q), qe = Math.floor((e[S] - r.bInfo.minimum.y * Z) * ce), ue = Math.floor((e[M] - r.bInfo.minimum.z * Z) * de), Ye = _e + r.subDiv.max * Oe + j * ze, lt = fe + r.subDiv.max * Te + j * Fe, Ut = Se + r.subDiv.max * qe + j * ue, Ct = O + r.subDiv.max * G + j * ee;\n r.facetPartitioning[Ct] = r.facetPartitioning[Ct] ? r.facetPartitioning[Ct] : new Array(), r.facetPartitioning[Ye] = r.facetPartitioning[Ye] ? r.facetPartitioning[Ye] : new Array(), r.facetPartitioning[lt] = r.facetPartitioning[lt] ? r.facetPartitioning[lt] : new Array(), r.facetPartitioning[Ut] = r.facetPartitioning[Ut] ? r.facetPartitioning[Ut] : new Array(), r.facetPartitioning[Ye].push(s), lt != Ye && r.facetPartitioning[lt].push(s), Ut == lt || Ut == Ye || r.facetPartitioning[Ut].push(s), Ct == Ye || Ct == lt || Ct == Ut || r.facetPartitioning[Ct].push(s);\n }\n if (H && r && r.facetPositions) {\n const O = r.depthSortedFacets[s];\n O.ind = s * 3, O.sqDistance = _.DistanceSquared(r.facetPositions[s], k);\n }\n i[m] += f, i[v] += d, i[E] += p, i[C] += f, i[T] += d, i[R] += p, i[x] += f, i[S] += d, i[M] += p;\n }\n for (s = 0; s < i.length / 3; s++)\n f = i[s * 3], d = i[s * 3 + 1], p = i[s * 3 + 2], g = Math.sqrt(f * f + d * d + p * p), g = g === 0 ? 1 : g, f /= g, d /= g, p /= g, i[s * 3] = f, i[s * 3 + 1] = d, i[s * 3 + 2] = p;\n }\n /**\n * @internal\n */\n static _ComputeSides(e, t, i, r, s, a, o) {\n const l = i.length, c = r.length;\n let h, u;\n switch (e = e || re.DEFAULTSIDE, e) {\n case re.FRONTSIDE:\n break;\n case re.BACKSIDE:\n for (h = 0; h < l; h += 3) {\n const f = i[h];\n i[h] = i[h + 2], i[h + 2] = f;\n }\n for (u = 0; u < c; u++)\n r[u] = -r[u];\n break;\n case re.DOUBLESIDE: {\n const f = t.length, d = f / 3;\n for (let m = 0; m < f; m++)\n t[f + m] = t[m];\n for (h = 0; h < l; h += 3)\n i[h + l] = i[h + 2] + d, i[h + 1 + l] = i[h + 1] + d, i[h + 2 + l] = i[h] + d;\n for (u = 0; u < c; u++)\n r[c + u] = -r[u];\n const p = s.length;\n let g = 0;\n for (g = 0; g < p; g++)\n s[g + p] = s[g];\n for (a = a || new Ke(0, 0, 1, 1), o = o || new Ke(0, 0, 1, 1), g = 0, h = 0; h < p / 2; h++)\n s[g] = a.x + (a.z - a.x) * s[g], s[g + 1] = a.y + (a.w - a.y) * s[g + 1], s[g + p] = o.x + (o.z - o.x) * s[g + p], s[g + p + 1] = o.y + (o.w - o.y) * s[g + p + 1], g += 2;\n break;\n }\n }\n }\n /**\n * Creates a VertexData from serialized data\n * @param parsedVertexData the parsed data from an imported file\n * @returns a VertexData\n */\n static Parse(e) {\n const t = new re(), i = e.positions;\n i && t.set(i, I.PositionKind);\n const r = e.normals;\n r && t.set(r, I.NormalKind);\n const s = e.tangents;\n s && t.set(s, I.TangentKind);\n const a = e.uvs;\n a && t.set(a, I.UVKind);\n const o = e.uvs2;\n o && t.set(o, I.UV2Kind);\n const l = e.uvs3;\n l && t.set(l, I.UV3Kind);\n const c = e.uvs4;\n c && t.set(c, I.UV4Kind);\n const h = e.uvs5;\n h && t.set(h, I.UV5Kind);\n const u = e.uvs6;\n u && t.set(u, I.UV6Kind);\n const f = e.colors;\n f && (t.set(et.CheckColors4(f, i.length / 3), I.ColorKind), e.hasVertexAlpha !== void 0 && (t.hasVertexAlpha = e.hasVertexAlpha));\n const d = e.matricesIndices;\n d && t.set(d, I.MatricesIndicesKind);\n const p = e.matricesWeights;\n p && t.set(p, I.MatricesWeightsKind);\n const g = e.indices;\n g && (t.indices = g);\n const m = e.materialInfos;\n if (m) {\n t.materialInfos = [];\n for (const v of m) {\n const E = new Gl();\n E.indexCount = v.indexCount, E.indexStart = v.indexStart, E.verticesCount = v.verticesCount, E.verticesStart = v.verticesStart, E.materialIndex = v.materialIndex, t.materialInfos.push(E);\n }\n }\n return t;\n }\n /**\n * Applies VertexData created from the imported parameters to the geometry\n * @param parsedVertexData the parsed data from an imported file\n * @param geometry the geometry to apply the VertexData to\n */\n static ImportVertexData(e, t) {\n const i = re.Parse(e);\n t.setAllVerticesData(i, e.updatable);\n }\n}\nre.FRONTSIDE = 0;\nre.BACKSIDE = 1;\nre.DOUBLESIDE = 2;\nre.DEFAULTSIDE = 0;\nre._UniqueIDGenerator = 0;\nP([\n ln.filter((...[n]) => !Array.isArray(n))\n], re, \"_TransformVector3Coordinates\", null);\nP([\n ln.filter((...[n]) => !Array.isArray(n))\n], re, \"_TransformVector3Normals\", null);\nP([\n ln.filter((...[n]) => !Array.isArray(n))\n], re, \"_TransformVector4Normals\", null);\nP([\n ln.filter((...[n]) => !Array.isArray(n))\n], re, \"_FlipFaces\", null);\nclass Xy {\n constructor() {\n this._doNotSerialize = !1, this._isDisposed = !1, this._sceneRootNodesIndex = -1, this._isEnabled = !0, this._isParentEnabled = !0, this._isReady = !0, this._onEnabledStateChangedObservable = new he(), this._onClonedObservable = new he();\n }\n}\nlet Ai = class vu {\n /**\n * Add a new node constructor\n * @param type defines the type name of the node to construct\n * @param constructorFunc defines the constructor function\n */\n static AddNodeConstructor(e, t) {\n this._NodeConstructors[e] = t;\n }\n /**\n * Returns a node constructor based on type name\n * @param type defines the type name\n * @param name defines the new node name\n * @param scene defines the hosting scene\n * @param options defines optional options to transmit to constructors\n * @returns the new constructor or null\n */\n static Construct(e, t, i, r) {\n const s = this._NodeConstructors[e];\n return s ? s(t, i, r) : null;\n }\n /**\n * Gets or sets the accessibility tag to describe the node for accessibility purpose.\n */\n set accessibilityTag(e) {\n this._accessibilityTag = e, this.onAccessibilityTagChangedObservable.notifyObservers(e);\n }\n get accessibilityTag() {\n return this._accessibilityTag;\n }\n /**\n * Gets or sets a boolean used to define if the node must be serialized\n */\n get doNotSerialize() {\n return this._nodeDataStorage._doNotSerialize ? !0 : this._parentNode ? this._parentNode.doNotSerialize : !1;\n }\n set doNotSerialize(e) {\n this._nodeDataStorage._doNotSerialize = e;\n }\n /**\n * Gets a boolean indicating if the node has been disposed\n * @returns true if the node was disposed\n */\n isDisposed() {\n return this._nodeDataStorage._isDisposed;\n }\n /**\n * Gets or sets the parent of the node (without keeping the current position in the scene)\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/parent\n */\n set parent(e) {\n if (this._parentNode === e)\n return;\n const t = this._parentNode;\n if (this._parentNode && this._parentNode._children !== void 0 && this._parentNode._children !== null) {\n const i = this._parentNode._children.indexOf(this);\n i !== -1 && this._parentNode._children.splice(i, 1), !e && !this._nodeDataStorage._isDisposed && this._addToSceneRootNodes();\n }\n this._parentNode = e, this._isDirty = !0, this._parentNode && ((this._parentNode._children === void 0 || this._parentNode._children === null) && (this._parentNode._children = new Array()), this._parentNode._children.push(this), t || this._removeFromSceneRootNodes()), this._syncParentEnabledState();\n }\n get parent() {\n return this._parentNode;\n }\n /**\n * @internal\n */\n _serializeAsParent(e) {\n e.parentId = this.uniqueId;\n }\n /** @internal */\n _addToSceneRootNodes() {\n this._nodeDataStorage._sceneRootNodesIndex === -1 && (this._nodeDataStorage._sceneRootNodesIndex = this._scene.rootNodes.length, this._scene.rootNodes.push(this));\n }\n /** @internal */\n _removeFromSceneRootNodes() {\n if (this._nodeDataStorage._sceneRootNodesIndex !== -1) {\n const e = this._scene.rootNodes, t = e.length - 1;\n e[this._nodeDataStorage._sceneRootNodesIndex] = e[t], e[this._nodeDataStorage._sceneRootNodesIndex]._nodeDataStorage._sceneRootNodesIndex = this._nodeDataStorage._sceneRootNodesIndex, this._scene.rootNodes.pop(), this._nodeDataStorage._sceneRootNodesIndex = -1;\n }\n }\n /**\n * Gets or sets the animation properties override\n */\n get animationPropertiesOverride() {\n return this._animationPropertiesOverride ? this._animationPropertiesOverride : this._scene.animationPropertiesOverride;\n }\n set animationPropertiesOverride(e) {\n this._animationPropertiesOverride = e;\n }\n /**\n * Gets a string identifying the name of the class\n * @returns \"Node\" string\n */\n getClassName() {\n return \"Node\";\n }\n /**\n * Sets a callback that will be raised when the node will be disposed\n */\n set onDispose(e) {\n this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e);\n }\n /**\n * An event triggered when the enabled state of the node changes\n */\n get onEnabledStateChangedObservable() {\n return this._nodeDataStorage._onEnabledStateChangedObservable;\n }\n /**\n * An event triggered when the node is cloned\n */\n get onClonedObservable() {\n return this._nodeDataStorage._onClonedObservable;\n }\n /**\n * Creates a new Node\n * @param name the name and id to be given to this node\n * @param scene the scene this node will be added to\n */\n constructor(e, t = null) {\n this._isDirty = !1, this._nodeDataStorage = new Xy(), this.state = \"\", this.metadata = null, this.reservedDataStore = null, this._accessibilityTag = null, this.onAccessibilityTagChangedObservable = new he(), this._parentContainer = null, this.animations = [], this._ranges = {}, this.onReady = null, this._currentRenderId = -1, this._parentUpdateId = -1, this._childUpdateId = -1, this._waitingParentId = null, this._waitingParentInstanceIndex = null, this._waitingParsedUniqueId = null, this._cache = {}, this._parentNode = null, this._children = null, this._worldMatrix = L.Identity(), this._worldMatrixDeterminant = 0, this._worldMatrixDeterminantIsDirty = !0, this._animationPropertiesOverride = null, this._isNode = !0, this.onDisposeObservable = new he(), this._onDisposeObserver = null, this._behaviors = new Array(), this.name = e, this.id = e, this._scene = t || st.LastCreatedScene, this.uniqueId = this._scene.getUniqueId(), this._initCache();\n }\n /**\n * Gets the scene of the node\n * @returns a scene\n */\n getScene() {\n return this._scene;\n }\n /**\n * Gets the engine of the node\n * @returns a Engine\n */\n getEngine() {\n return this._scene.getEngine();\n }\n /**\n * Attach a behavior to the node\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\n * @param behavior defines the behavior to attach\n * @param attachImmediately defines that the behavior must be attached even if the scene is still loading\n * @returns the current Node\n */\n addBehavior(e, t = !1) {\n return this._behaviors.indexOf(e) !== -1 ? this : (e.init(), this._scene.isLoading && !t ? this._scene.onDataLoadedObservable.addOnce(() => {\n e.attach(this);\n }) : e.attach(this), this._behaviors.push(e), this);\n }\n /**\n * Remove an attached behavior\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\n * @param behavior defines the behavior to attach\n * @returns the current Node\n */\n removeBehavior(e) {\n const t = this._behaviors.indexOf(e);\n return t === -1 ? this : (this._behaviors[t].detach(), this._behaviors.splice(t, 1), this);\n }\n /**\n * Gets the list of attached behaviors\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\n */\n get behaviors() {\n return this._behaviors;\n }\n /**\n * Gets an attached behavior by name\n * @param name defines the name of the behavior to look for\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\n * @returns null if behavior was not found else the requested behavior\n */\n getBehaviorByName(e) {\n for (const t of this._behaviors)\n if (t.name === e)\n return t;\n return null;\n }\n /**\n * Returns the latest update of the World matrix\n * @returns a Matrix\n */\n getWorldMatrix() {\n return this._currentRenderId !== this._scene.getRenderId() && this.computeWorldMatrix(), this._worldMatrix;\n }\n /** @internal */\n _getWorldMatrixDeterminant() {\n return this._worldMatrixDeterminantIsDirty && (this._worldMatrixDeterminantIsDirty = !1, this._worldMatrixDeterminant = this._worldMatrix.determinant()), this._worldMatrixDeterminant;\n }\n /**\n * Returns directly the latest state of the mesh World matrix.\n * A Matrix is returned.\n */\n get worldMatrixFromCache() {\n return this._worldMatrix;\n }\n // override it in derived class if you add new variables to the cache\n // and call the parent class method\n /** @internal */\n _initCache() {\n this._cache = {};\n }\n /**\n * @internal\n */\n updateCache(e) {\n !e && this.isSynchronized() || this._updateCache();\n }\n /**\n * @internal\n */\n _getActionManagerForTrigger(e, t = !0) {\n return this.parent ? this.parent._getActionManagerForTrigger(e, !1) : null;\n }\n // override it in derived class if you add new variables to the cache\n // and call the parent class method if !ignoreParentClass\n /**\n * @internal\n */\n _updateCache(e) {\n }\n // override it in derived class if you add new variables to the cache\n /** @internal */\n _isSynchronized() {\n return !0;\n }\n /** @internal */\n _markSyncedWithParent() {\n this._parentNode && (this._parentUpdateId = this._parentNode._childUpdateId);\n }\n /** @internal */\n isSynchronizedWithParent() {\n return this._parentNode ? this._parentNode._isDirty || this._parentUpdateId !== this._parentNode._childUpdateId ? !1 : this._parentNode.isSynchronized() : !0;\n }\n /** @internal */\n isSynchronized() {\n return this._parentNode && !this.isSynchronizedWithParent() ? !1 : this._isSynchronized();\n }\n /**\n * Is this node ready to be used/rendered\n * @param _completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\n * @returns true if the node is ready\n */\n isReady(e = !1) {\n return this._nodeDataStorage._isReady;\n }\n /**\n * Flag the node as dirty (Forcing it to update everything)\n * @param _property helps children apply precise \"dirtyfication\"\n * @returns this node\n */\n markAsDirty(e) {\n return this._currentRenderId = Number.MAX_VALUE, this._isDirty = !0, this;\n }\n /**\n * Is this node enabled?\n * If the node has a parent, all ancestors will be checked and false will be returned if any are false (not enabled), otherwise will return true\n * @param checkAncestors indicates if this method should check the ancestors. The default is to check the ancestors. If set to false, the method will return the value of this node without checking ancestors\n * @returns whether this node (and its parent) is enabled\n */\n isEnabled(e = !0) {\n return e === !1 ? this._nodeDataStorage._isEnabled : this._nodeDataStorage._isEnabled ? this._nodeDataStorage._isParentEnabled : !1;\n }\n /** @internal */\n _syncParentEnabledState() {\n this._nodeDataStorage._isParentEnabled = this._parentNode ? this._parentNode.isEnabled() : !0, this._children && this._children.forEach((e) => {\n e._syncParentEnabledState();\n });\n }\n /**\n * Set the enabled state of this node\n * @param value defines the new enabled state\n */\n setEnabled(e) {\n this._nodeDataStorage._isEnabled !== e && (this._nodeDataStorage._isEnabled = e, this._syncParentEnabledState(), this._nodeDataStorage._onEnabledStateChangedObservable.notifyObservers(e));\n }\n /**\n * Is this node a descendant of the given node?\n * The function will iterate up the hierarchy until the ancestor was found or no more parents defined\n * @param ancestor defines the parent node to inspect\n * @returns a boolean indicating if this node is a descendant of the given node\n */\n isDescendantOf(e) {\n return this.parent ? this.parent === e ? !0 : this.parent.isDescendantOf(e) : !1;\n }\n /**\n * @internal\n */\n _getDescendants(e, t = !1, i) {\n if (this._children)\n for (let r = 0; r < this._children.length; r++) {\n const s = this._children[r];\n (!i || i(s)) && e.push(s), t || s._getDescendants(e, !1, i);\n }\n }\n /**\n * Will return all nodes that have this node as ascendant\n * @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\n * @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\n * @returns all children nodes of all types\n */\n getDescendants(e, t) {\n const i = [];\n return this._getDescendants(i, e, t), i;\n }\n /**\n * Get all child-meshes of this node\n * @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 (Default: false)\n * @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\n * @returns an array of AbstractMesh\n */\n getChildMeshes(e, t) {\n const i = [];\n return this._getDescendants(i, e, (r) => (!t || t(r)) && r.cullingStrategy !== void 0), i;\n }\n /**\n * Get all direct children of this node\n * @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\n * @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 (Default: true)\n * @returns an array of Node\n */\n getChildren(e, t = !0) {\n return this.getDescendants(t, e);\n }\n /**\n * @internal\n */\n _setReady(e) {\n if (e !== this._nodeDataStorage._isReady) {\n if (!e) {\n this._nodeDataStorage._isReady = !1;\n return;\n }\n this.onReady && this.onReady(this), this._nodeDataStorage._isReady = !0;\n }\n }\n /**\n * Get an animation by name\n * @param name defines the name of the animation to look for\n * @returns null if not found else the requested animation\n */\n getAnimationByName(e) {\n for (let t = 0; t < this.animations.length; t++) {\n const i = this.animations[t];\n if (i.name === e)\n return i;\n }\n return null;\n }\n /**\n * Creates an animation range for this node\n * @param name defines the name of the range\n * @param from defines the starting key\n * @param to defines the end key\n */\n createAnimationRange(e, t, i) {\n if (!this._ranges[e]) {\n this._ranges[e] = vu._AnimationRangeFactory(e, t, i);\n for (let r = 0, s = this.animations.length; r < s; r++)\n this.animations[r] && this.animations[r].createRange(e, t, i);\n }\n }\n /**\n * Delete a specific animation range\n * @param name defines the name of the range to delete\n * @param deleteFrames defines if animation frames from the range must be deleted as well\n */\n deleteAnimationRange(e, t = !0) {\n for (let i = 0, r = this.animations.length; i < r; i++)\n this.animations[i] && this.animations[i].deleteRange(e, t);\n this._ranges[e] = null;\n }\n /**\n * Get an animation range by name\n * @param name defines the name of the animation range to look for\n * @returns null if not found else the requested animation range\n */\n getAnimationRange(e) {\n return this._ranges[e] || null;\n }\n /**\n * Clone the current node\n * @param name Name of the new clone\n * @param newParent New parent for the clone\n * @param doNotCloneChildren Do not clone children hierarchy\n * @returns the new transform node\n */\n clone(e, t, i) {\n const r = Le.Clone(() => new vu(e, this.getScene()), this);\n if (t && (r.parent = t), !i) {\n const s = this.getDescendants(!0);\n for (let a = 0; a < s.length; a++) {\n const o = s[a];\n o.clone(e + \".\" + o.name, r);\n }\n }\n return r;\n }\n /**\n * Gets the list of all animation ranges defined on this node\n * @returns an array\n */\n getAnimationRanges() {\n const e = [];\n let t;\n for (t in this._ranges)\n e.push(this._ranges[t]);\n return e;\n }\n /**\n * Will start the animation sequence\n * @param name defines the range frames for animation sequence\n * @param loop defines if the animation should loop (false by default)\n * @param speedRatio defines the speed factor in which to run the animation (1 by default)\n * @param onAnimationEnd defines a function to be executed when the animation ended (undefined by default)\n * @returns the object created for this animation. If range does not exist, it will return null\n */\n beginAnimation(e, t, i, r) {\n const s = this.getAnimationRange(e);\n return s ? this._scene.beginAnimation(this, s.from, s.to, t, i, r) : null;\n }\n /**\n * Serialize animation ranges into a JSON compatible object\n * @returns serialization object\n */\n serializeAnimationRanges() {\n const e = [];\n for (const t in this._ranges) {\n const i = this._ranges[t];\n if (!i)\n continue;\n const r = {};\n r.name = t, r.from = i.from, r.to = i.to, e.push(r);\n }\n return e;\n }\n /**\n * Computes the world matrix of the node\n * @param _force defines if the cache version should be invalidated forcing the world matrix to be created from scratch\n * @returns the world matrix\n */\n computeWorldMatrix(e) {\n return this._worldMatrix || (this._worldMatrix = L.Identity()), this._worldMatrix;\n }\n /**\n * Releases resources associated with this node.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n if (this._nodeDataStorage._isDisposed = !0, !e) {\n const i = this.getDescendants(!0);\n for (const r of i)\n r.dispose(e, t);\n }\n this.parent ? this.parent = null : this._removeFromSceneRootNodes(), this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear(), this.onEnabledStateChangedObservable.clear(), this.onClonedObservable.clear();\n for (const i of this._behaviors)\n i.detach();\n this._behaviors.length = 0, this.metadata = null;\n }\n /**\n * Parse animation range data from a serialization object and store them into a given node\n * @param node defines where to store the animation ranges\n * @param parsedNode defines the serialization object to read data from\n * @param _scene defines the hosting scene\n */\n static ParseAnimationRanges(e, t, i) {\n if (t.ranges)\n for (let r = 0; r < t.ranges.length; r++) {\n const s = t.ranges[r];\n e.createAnimationRange(s.name, s.from, s.to);\n }\n }\n /**\n * Return the minimum and maximum world vectors of the entire hierarchy under current node\n * @param includeDescendants Include bounding info from descendants as well (true by default)\n * @param predicate defines a callback function that can be customize to filter what meshes should be included in the list used to compute the bounding vectors\n * @returns the new bounding vectors\n */\n getHierarchyBoundingVectors(e = !0, t = null) {\n this.getScene().incrementRenderId(), this.computeWorldMatrix(!0);\n let i, r;\n const s = this;\n if (s.getBoundingInfo && s.subMeshes) {\n const a = s.getBoundingInfo();\n i = a.boundingBox.minimumWorld.clone(), r = a.boundingBox.maximumWorld.clone();\n } else\n i = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), r = new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n if (e) {\n const a = this.getDescendants(!1);\n for (const o of a) {\n const l = o;\n if (l.computeWorldMatrix(!0), t && !t(l) || !l.getBoundingInfo || l.getTotalVertices() === 0)\n continue;\n const h = l.getBoundingInfo().boundingBox, u = h.minimumWorld, f = h.maximumWorld;\n _.CheckExtends(u, i, r), _.CheckExtends(f, i, r);\n }\n }\n return {\n min: i,\n max: r\n };\n }\n};\nAi._AnimationRangeFactory = (n, e, t) => {\n throw We(\"AnimationRange\");\n};\nAi._NodeConstructors = {};\nP([\n w()\n], Ai.prototype, \"name\", void 0);\nP([\n w()\n], Ai.prototype, \"id\", void 0);\nP([\n w()\n], Ai.prototype, \"uniqueId\", void 0);\nP([\n w()\n], Ai.prototype, \"state\", void 0);\nP([\n w()\n], Ai.prototype, \"metadata\", void 0);\nvar ut;\n(function(n) {\n n[n.LOCAL = 0] = \"LOCAL\", n[n.WORLD = 1] = \"WORLD\", n[n.BONE = 2] = \"BONE\";\n})(ut || (ut = {}));\nclass Ko {\n}\nKo.X = new _(1, 0, 0);\nKo.Y = new _(0, 1, 0);\nKo.Z = new _(0, 0, 1);\nvar hg;\n(function(n) {\n n[n.X = 0] = \"X\", n[n.Y = 1] = \"Y\", n[n.Z = 2] = \"Z\";\n})(hg || (hg = {}));\nconst Hy = L.Compose(_.One(), Ce.FromEulerAngles(0, Math.PI, 0), _.Zero());\nclass He extends Ai {\n /**\n * Gets or sets the billboard mode. Default is 0.\n *\n * | Value | Type | Description |\n * | --- | --- | --- |\n * | 0 | BILLBOARDMODE_NONE | |\n * | 1 | BILLBOARDMODE_X | |\n * | 2 | BILLBOARDMODE_Y | |\n * | 4 | BILLBOARDMODE_Z | |\n * | 7 | BILLBOARDMODE_ALL | |\n *\n */\n get billboardMode() {\n return this._billboardMode;\n }\n set billboardMode(e) {\n this._billboardMode !== e && (this._billboardMode = e, this._cache.useBillboardPosition = (this._billboardMode & He.BILLBOARDMODE_USE_POSITION) !== 0, this._computeUseBillboardPath());\n }\n /**\n * Gets or sets a boolean indicating that parent rotation should be preserved when using billboards.\n * This could be useful for glTF objects where parent rotation helps converting from right handed to left handed\n */\n get preserveParentRotationForBillboard() {\n return this._preserveParentRotationForBillboard;\n }\n set preserveParentRotationForBillboard(e) {\n e !== this._preserveParentRotationForBillboard && (this._preserveParentRotationForBillboard = e, this._computeUseBillboardPath());\n }\n _computeUseBillboardPath() {\n this._cache.useBillboardPath = this._billboardMode !== He.BILLBOARDMODE_NONE && !this.preserveParentRotationForBillboard;\n }\n /**\n * Gets or sets the distance of the object to max, often used by skybox\n */\n get infiniteDistance() {\n return this._infiniteDistance;\n }\n set infiniteDistance(e) {\n this._infiniteDistance !== e && (this._infiniteDistance = e);\n }\n constructor(e, t = null, i = !0) {\n super(e, t), this._forward = new _(0, 0, 1), this._up = new _(0, 1, 0), this._right = new _(1, 0, 0), this._position = _.Zero(), this._rotation = _.Zero(), this._rotationQuaternion = null, this._scaling = _.One(), this._transformToBoneReferal = null, this._isAbsoluteSynced = !1, this._billboardMode = He.BILLBOARDMODE_NONE, this._preserveParentRotationForBillboard = !1, this.scalingDeterminant = 1, this._infiniteDistance = !1, this.ignoreNonUniformScaling = !1, this.reIntegrateRotationIntoRotationQuaternion = !1, this._poseMatrix = null, this._localMatrix = L.Zero(), this._usePivotMatrix = !1, this._absolutePosition = _.Zero(), this._absoluteScaling = _.Zero(), this._absoluteRotationQuaternion = Ce.Identity(), this._pivotMatrix = L.Identity(), this._postMultiplyPivotMatrix = !1, this._isWorldMatrixFrozen = !1, this._indexInSceneTransformNodesArray = -1, this.onAfterWorldMatrixUpdateObservable = new he(), this._nonUniformScaling = !1, i && this.getScene().addTransformNode(this);\n }\n /**\n * Gets a string identifying the name of the class\n * @returns \"TransformNode\" string\n */\n getClassName() {\n return \"TransformNode\";\n }\n /**\n * Gets or set the node position (default is (0.0, 0.0, 0.0))\n */\n get position() {\n return this._position;\n }\n set position(e) {\n this._position = e, this._isDirty = !0;\n }\n /**\n * return true if a pivot has been set\n * @returns true if a pivot matrix is used\n */\n isUsingPivotMatrix() {\n return this._usePivotMatrix;\n }\n /**\n * @returns true if pivot matrix must be cancelled in the world matrix. When this parameter is set to true (default), the inverse of the pivot matrix is also applied at the end to cancel the transformation effect.\n */\n isUsingPostMultiplyPivotMatrix() {\n return this._postMultiplyPivotMatrix;\n }\n /**\n * Gets or sets the rotation property : a Vector3 defining the rotation value in radians around each local axis X, Y, Z (default is (0.0, 0.0, 0.0)).\n * If rotation quaternion is set, this Vector3 will be ignored and copy from the quaternion\n */\n get rotation() {\n return this._rotation;\n }\n set rotation(e) {\n this._rotation = e, this._rotationQuaternion = null, this._isDirty = !0;\n }\n /**\n * Gets or sets the scaling property : a Vector3 defining the node scaling along each local axis X, Y, Z (default is (1.0, 1.0, 1.0)).\n */\n get scaling() {\n return this._scaling;\n }\n set scaling(e) {\n this._scaling = e, this._isDirty = !0;\n }\n /**\n * Gets or sets the rotation Quaternion property : this a Quaternion object defining the node rotation by using a unit quaternion (undefined by default, but can be null).\n * If set, only the rotationQuaternion is then used to compute the node rotation (ie. node.rotation will be ignored)\n */\n get rotationQuaternion() {\n return this._rotationQuaternion;\n }\n set rotationQuaternion(e) {\n this._rotationQuaternion = e, e && this._rotation.setAll(0), this._isDirty = !0;\n }\n /**\n * The forward direction of that transform in world space.\n */\n get forward() {\n return _.TransformNormalFromFloatsToRef(0, 0, this.getScene().useRightHandedSystem ? -1 : 1, this.getWorldMatrix(), this._forward), this._forward.normalize();\n }\n /**\n * The up direction of that transform in world space.\n */\n get up() {\n return _.TransformNormalFromFloatsToRef(0, 1, 0, this.getWorldMatrix(), this._up), this._up.normalize();\n }\n /**\n * The right direction of that transform in world space.\n */\n get right() {\n return _.TransformNormalFromFloatsToRef(this.getScene().useRightHandedSystem ? -1 : 1, 0, 0, this.getWorldMatrix(), this._right), this._right.normalize();\n }\n /**\n * Copies the parameter passed Matrix into the mesh Pose matrix.\n * @param matrix the matrix to copy the pose from\n * @returns this TransformNode.\n */\n updatePoseMatrix(e) {\n return this._poseMatrix ? (this._poseMatrix.copyFrom(e), this) : (this._poseMatrix = e.clone(), this);\n }\n /**\n * Returns the mesh Pose matrix.\n * @returns the pose matrix\n */\n getPoseMatrix() {\n return this._poseMatrix || (this._poseMatrix = L.Identity()), this._poseMatrix;\n }\n /** @internal */\n _isSynchronized() {\n const e = this._cache;\n return !(this._billboardMode !== e.billboardMode || this._billboardMode !== He.BILLBOARDMODE_NONE || e.pivotMatrixUpdated || this._infiniteDistance || this._position._isDirty || this._scaling._isDirty || this._rotationQuaternion && this._rotationQuaternion._isDirty || this._rotation._isDirty);\n }\n /** @internal */\n _initCache() {\n super._initCache();\n const e = this._cache;\n e.localMatrixUpdated = !1, e.billboardMode = -1, e.infiniteDistance = !1, e.useBillboardPosition = !1, e.useBillboardPath = !1;\n }\n /**\n * Returns the current mesh absolute position.\n * Returns a Vector3.\n */\n get absolutePosition() {\n return this.getAbsolutePosition();\n }\n /**\n * Returns the current mesh absolute scaling.\n * Returns a Vector3.\n */\n get absoluteScaling() {\n return this._syncAbsoluteScalingAndRotation(), this._absoluteScaling;\n }\n /**\n * Returns the current mesh absolute rotation.\n * Returns a Quaternion.\n */\n get absoluteRotationQuaternion() {\n return this._syncAbsoluteScalingAndRotation(), this._absoluteRotationQuaternion;\n }\n /**\n * Sets a new matrix to apply before all other transformation\n * @param matrix defines the transform matrix\n * @returns the current TransformNode\n */\n setPreTransformMatrix(e) {\n return this.setPivotMatrix(e, !1);\n }\n /**\n * Sets a new pivot matrix to the current node\n * @param matrix defines the new pivot matrix to use\n * @param postMultiplyPivotMatrix defines if the pivot matrix must be cancelled in the world matrix. When this parameter is set to true (default), the inverse of the pivot matrix is also applied at the end to cancel the transformation effect\n * @returns the current TransformNode\n */\n setPivotMatrix(e, t = !0) {\n return this._pivotMatrix.copyFrom(e), this._usePivotMatrix = !this._pivotMatrix.isIdentity(), this._cache.pivotMatrixUpdated = !0, this._postMultiplyPivotMatrix = t, this._postMultiplyPivotMatrix && (this._pivotMatrixInverse ? this._pivotMatrix.invertToRef(this._pivotMatrixInverse) : this._pivotMatrixInverse = L.Invert(this._pivotMatrix)), this;\n }\n /**\n * Returns the mesh pivot matrix.\n * Default : Identity.\n * @returns the matrix\n */\n getPivotMatrix() {\n return this._pivotMatrix;\n }\n /**\n * Instantiate (when possible) or clone that node with its hierarchy\n * @param newParent defines the new parent to use for the instance (or clone)\n * @param options defines options to configure how copy is done\n * @param options.doNotInstantiate defines if the model must be instantiated or just cloned\n * @param onNewNodeCreated defines an option callback to call when a clone or an instance is created\n * @returns an instance (or a clone) of the current node with its hierarchy\n */\n instantiateHierarchy(e = null, t, i) {\n const r = this.clone(\"Clone of \" + (this.name || this.id), e || this.parent, !0);\n r && i && i(this, r);\n for (const s of this.getChildTransformNodes(!0))\n s.instantiateHierarchy(r, t, i);\n return r;\n }\n /**\n * Prevents the World matrix to be computed any longer\n * @param newWorldMatrix defines an optional matrix to use as world matrix\n * @param decompose defines whether to decompose the given newWorldMatrix or directly assign\n * @returns the TransformNode.\n */\n freezeWorldMatrix(e = null, t = !1) {\n return e ? t ? (this._rotation.setAll(0), this._rotationQuaternion = this._rotationQuaternion || Ce.Identity(), e.decompose(this._scaling, this._rotationQuaternion, this._position), this.computeWorldMatrix(!0)) : (this._worldMatrix = e, this._absolutePosition.copyFromFloats(this._worldMatrix.m[12], this._worldMatrix.m[13], this._worldMatrix.m[14]), this._afterComputeWorldMatrix()) : (this._isWorldMatrixFrozen = !1, this.computeWorldMatrix(!0)), this._isDirty = !1, this._isWorldMatrixFrozen = !0, this;\n }\n /**\n * Allows back the World matrix computation.\n * @returns the TransformNode.\n */\n unfreezeWorldMatrix() {\n return this._isWorldMatrixFrozen = !1, this.computeWorldMatrix(!0), this;\n }\n /**\n * True if the World matrix has been frozen.\n */\n get isWorldMatrixFrozen() {\n return this._isWorldMatrixFrozen;\n }\n /**\n * Returns the mesh absolute position in the World.\n * @returns a Vector3.\n */\n getAbsolutePosition() {\n return this.computeWorldMatrix(), this._absolutePosition;\n }\n /**\n * Sets the mesh absolute position in the World from a Vector3 or an Array(3).\n * @param absolutePosition the absolute position to set\n * @returns the TransformNode.\n */\n setAbsolutePosition(e) {\n if (!e)\n return this;\n let t, i, r;\n if (e.x === void 0) {\n if (arguments.length < 3)\n return this;\n t = arguments[0], i = arguments[1], r = arguments[2];\n } else\n t = e.x, i = e.y, r = e.z;\n if (this.parent) {\n const s = z.Matrix[0];\n this.parent.getWorldMatrix().invertToRef(s), _.TransformCoordinatesFromFloatsToRef(t, i, r, s, this.position);\n } else\n this.position.x = t, this.position.y = i, this.position.z = r;\n return this._absolutePosition.copyFrom(e), this;\n }\n /**\n * Sets the mesh position in its local space.\n * @param vector3 the position to set in localspace\n * @returns the TransformNode.\n */\n setPositionWithLocalVector(e) {\n return this.computeWorldMatrix(), this.position = _.TransformNormal(e, this._localMatrix), this;\n }\n /**\n * Returns the mesh position in the local space from the current World matrix values.\n * @returns a new Vector3.\n */\n getPositionExpressedInLocalSpace() {\n this.computeWorldMatrix();\n const e = z.Matrix[0];\n return this._localMatrix.invertToRef(e), _.TransformNormal(this.position, e);\n }\n /**\n * Translates the mesh along the passed Vector3 in its local space.\n * @param vector3 the distance to translate in localspace\n * @returns the TransformNode.\n */\n locallyTranslate(e) {\n return this.computeWorldMatrix(!0), this.position = _.TransformCoordinates(e, this._localMatrix), this;\n }\n /**\n * Orients a mesh towards a target point. Mesh must be drawn facing user.\n * @param targetPoint the position (must be in same space as current mesh) to look at\n * @param yawCor optional yaw (y-axis) correction in radians\n * @param pitchCor optional pitch (x-axis) correction in radians\n * @param rollCor optional roll (z-axis) correction in radians\n * @param space the chosen space of the target\n * @returns the TransformNode.\n */\n lookAt(e, t = 0, i = 0, r = 0, s = ut.LOCAL) {\n const a = He._LookAtVectorCache, o = s === ut.LOCAL ? this.position : this.getAbsolutePosition();\n if (e.subtractToRef(o, a), this.setDirection(a, t, i, r), s === ut.WORLD && this.parent)\n if (this.rotationQuaternion) {\n const l = z.Matrix[0];\n this.rotationQuaternion.toRotationMatrix(l);\n const c = z.Matrix[1];\n this.parent.getWorldMatrix().getRotationMatrixToRef(c), c.invert(), l.multiplyToRef(c, l), this.rotationQuaternion.fromRotationMatrix(l);\n } else {\n const l = z.Quaternion[0];\n Ce.FromEulerVectorToRef(this.rotation, l);\n const c = z.Matrix[0];\n l.toRotationMatrix(c);\n const h = z.Matrix[1];\n this.parent.getWorldMatrix().getRotationMatrixToRef(h), h.invert(), c.multiplyToRef(h, c), l.fromRotationMatrix(c), l.toEulerAnglesToRef(this.rotation);\n }\n return this;\n }\n /**\n * Returns a new Vector3 that is the localAxis, expressed in the mesh local space, rotated like the mesh.\n * This Vector3 is expressed in the World space.\n * @param localAxis axis to rotate\n * @returns a new Vector3 that is the localAxis, expressed in the mesh local space, rotated like the mesh.\n */\n getDirection(e) {\n const t = _.Zero();\n return this.getDirectionToRef(e, t), t;\n }\n /**\n * Sets the Vector3 \"result\" as the rotated Vector3 \"localAxis\" in the same rotation than the mesh.\n * localAxis is expressed in the mesh local space.\n * result is computed in the World space from the mesh World matrix.\n * @param localAxis axis to rotate\n * @param result the resulting transformnode\n * @returns this TransformNode.\n */\n getDirectionToRef(e, t) {\n return _.TransformNormalToRef(e, this.getWorldMatrix(), t), this;\n }\n /**\n * Sets this transform node rotation to the given local axis.\n * @param localAxis the axis in local space\n * @param yawCor optional yaw (y-axis) correction in radians\n * @param pitchCor optional pitch (x-axis) correction in radians\n * @param rollCor optional roll (z-axis) correction in radians\n * @returns this TransformNode\n */\n setDirection(e, t = 0, i = 0, r = 0) {\n const s = -Math.atan2(e.z, e.x) + Math.PI / 2, a = Math.sqrt(e.x * e.x + e.z * e.z), o = -Math.atan2(e.y, a);\n return this.rotationQuaternion ? Ce.RotationYawPitchRollToRef(s + t, o + i, r, this.rotationQuaternion) : (this.rotation.x = o + i, this.rotation.y = s + t, this.rotation.z = r), this;\n }\n /**\n * Sets a new pivot point to the current node\n * @param point defines the new pivot point to use\n * @param space defines if the point is in world or local space (local by default)\n * @returns the current TransformNode\n */\n setPivotPoint(e, t = ut.LOCAL) {\n this.getScene().getRenderId() == 0 && this.computeWorldMatrix(!0);\n const i = this.getWorldMatrix();\n if (t == ut.WORLD) {\n const r = z.Matrix[0];\n i.invertToRef(r), e = _.TransformCoordinates(e, r);\n }\n return this.setPivotMatrix(L.Translation(-e.x, -e.y, -e.z), !0);\n }\n /**\n * Returns a new Vector3 set with the mesh pivot point coordinates in the local space.\n * @returns the pivot point\n */\n getPivotPoint() {\n const e = _.Zero();\n return this.getPivotPointToRef(e), e;\n }\n /**\n * Sets the passed Vector3 \"result\" with the coordinates of the mesh pivot point in the local space.\n * @param result the vector3 to store the result\n * @returns this TransformNode.\n */\n getPivotPointToRef(e) {\n return e.x = -this._pivotMatrix.m[12], e.y = -this._pivotMatrix.m[13], e.z = -this._pivotMatrix.m[14], this;\n }\n /**\n * Returns a new Vector3 set with the mesh pivot point World coordinates.\n * @returns a new Vector3 set with the mesh pivot point World coordinates.\n */\n getAbsolutePivotPoint() {\n const e = _.Zero();\n return this.getAbsolutePivotPointToRef(e), e;\n }\n /**\n * Sets the Vector3 \"result\" coordinates with the mesh pivot point World coordinates.\n * @param result vector3 to store the result\n * @returns this TransformNode.\n */\n getAbsolutePivotPointToRef(e) {\n return this.getPivotPointToRef(e), _.TransformCoordinatesToRef(e, this.getWorldMatrix(), e), this;\n }\n /**\n * Flag the transform node as dirty (Forcing it to update everything)\n * @param property if set to \"rotation\" the objects rotationQuaternion will be set to null\n * @returns this node\n */\n markAsDirty(e) {\n if (this._isDirty)\n return this;\n if (this._children)\n for (const t of this._children)\n t.markAsDirty(e);\n return super.markAsDirty(e);\n }\n /**\n * Defines the passed node as the parent of the current node.\n * The node will remain exactly where it is and its position / rotation will be updated accordingly.\n * Note that if the mesh has a pivot matrix / point defined it will be applied after the parent was updated.\n * In that case the node will not remain in the same space as it is, as the pivot will be applied.\n * To avoid this, you can set updatePivot to true and the pivot will be updated to identity\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/parent\n * @param node the node ot set as the parent\n * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.\n * @param updatePivot if true, update the pivot matrix to keep the node in the same space as before\n * @returns this TransformNode.\n */\n setParent(e, t = !1, i = !1) {\n if (!e && !this.parent)\n return this;\n const r = z.Quaternion[0], s = z.Vector3[0], a = z.Vector3[1], o = z.Matrix[1];\n L.IdentityToRef(o);\n const l = z.Matrix[0];\n this.computeWorldMatrix(!0);\n let c = this.rotationQuaternion;\n return c || (c = He._TmpRotation, Ce.RotationYawPitchRollToRef(this._rotation.y, this._rotation.x, this._rotation.z, c)), L.ComposeToRef(this.scaling, c, this.position, l), this.parent && l.multiplyToRef(this.parent.computeWorldMatrix(!0), l), e && (e.computeWorldMatrix(!0).invertToRef(o), l.multiplyToRef(o, l)), l.decompose(a, r, s, t ? this : void 0), this.rotationQuaternion ? this.rotationQuaternion.copyFrom(r) : r.toEulerAnglesToRef(this.rotation), this.scaling.copyFrom(a), this.position.copyFrom(s), this.parent = e, i && this.setPivotMatrix(L.Identity()), this;\n }\n /**\n * True if the scaling property of this object is non uniform eg. (1,2,1)\n */\n get nonUniformScaling() {\n return this._nonUniformScaling;\n }\n /**\n * @internal\n */\n _updateNonUniformScalingState(e) {\n return this._nonUniformScaling === e ? !1 : (this._nonUniformScaling = e, !0);\n }\n /**\n * Attach the current TransformNode to another TransformNode associated with a bone\n * @param bone Bone affecting the TransformNode\n * @param affectedTransformNode TransformNode associated with the bone\n * @returns this object\n */\n attachToBone(e, t) {\n return this._currentParentWhenAttachingToBone = this.parent, this._transformToBoneReferal = t, this.parent = e, e.getSkeleton().prepare(!0), e.getFinalMatrix().determinant() < 0 && (this.scalingDeterminant *= -1), this;\n }\n /**\n * Detach the transform node if its associated with a bone\n * @param resetToPreviousParent Indicates if the parent that was in effect when attachToBone was called should be set back or if we should set parent to null instead (defaults to the latter)\n * @returns this object\n */\n detachFromBone(e = !1) {\n return this.parent ? (this.parent.getWorldMatrix().determinant() < 0 && (this.scalingDeterminant *= -1), this._transformToBoneReferal = null, e ? this.parent = this._currentParentWhenAttachingToBone : this.parent = null, this) : (e && (this.parent = this._currentParentWhenAttachingToBone), this);\n }\n /**\n * Rotates the mesh around the axis vector for the passed angle (amount) expressed in radians, in the given space.\n * space (default LOCAL) can be either Space.LOCAL, either Space.WORLD.\n * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.\n * The passed axis is also normalized.\n * @param axis the axis to rotate around\n * @param amount the amount to rotate in radians\n * @param space Space to rotate in (Default: local)\n * @returns the TransformNode.\n */\n rotate(e, t, i) {\n e.normalize(), this.rotationQuaternion || (this.rotationQuaternion = this.rotation.toQuaternion(), this.rotation.setAll(0));\n let r;\n if (!i || i === ut.LOCAL)\n r = Ce.RotationAxisToRef(e, t, He._RotationAxisCache), this.rotationQuaternion.multiplyToRef(r, this.rotationQuaternion);\n else {\n if (this.parent) {\n const s = this.parent.getWorldMatrix(), a = z.Matrix[0];\n s.invertToRef(a), e = _.TransformNormal(e, a), s.determinant() < 0 && (t *= -1);\n }\n r = Ce.RotationAxisToRef(e, t, He._RotationAxisCache), r.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);\n }\n return this;\n }\n /**\n * Rotates the mesh around the axis vector for the passed angle (amount) expressed in radians, in world space.\n * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.\n * The passed axis is also normalized. .\n * Method is based on http://www.euclideanspace.com/maths/geometry/affine/aroundPoint/index.htm\n * @param point the point to rotate around\n * @param axis the axis to rotate around\n * @param amount the amount to rotate in radians\n * @returns the TransformNode\n */\n rotateAround(e, t, i) {\n t.normalize(), this.rotationQuaternion || (this.rotationQuaternion = Ce.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z), this.rotation.setAll(0));\n const r = z.Vector3[0], s = z.Vector3[1], a = z.Vector3[2], o = z.Quaternion[0], l = z.Matrix[0], c = z.Matrix[1], h = z.Matrix[2], u = z.Matrix[3];\n return e.subtractToRef(this.position, r), L.TranslationToRef(r.x, r.y, r.z, l), L.TranslationToRef(-r.x, -r.y, -r.z, c), L.RotationAxisToRef(t, i, h), c.multiplyToRef(h, u), u.multiplyToRef(l, u), u.decompose(s, o, a), this.position.addInPlace(a), o.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion), this;\n }\n /**\n * Translates the mesh along the axis vector for the passed distance in the given space.\n * space (default LOCAL) can be either Space.LOCAL, either Space.WORLD.\n * @param axis the axis to translate in\n * @param distance the distance to translate\n * @param space Space to rotate in (Default: local)\n * @returns the TransformNode.\n */\n translate(e, t, i) {\n const r = e.scale(t);\n if (!i || i === ut.LOCAL) {\n const s = this.getPositionExpressedInLocalSpace().add(r);\n this.setPositionWithLocalVector(s);\n } else\n this.setAbsolutePosition(this.getAbsolutePosition().add(r));\n return this;\n }\n /**\n * Adds a rotation step to the mesh current rotation.\n * x, y, z are Euler angles expressed in radians.\n * This methods updates the current mesh rotation, either mesh.rotation, either mesh.rotationQuaternion if it's set.\n * This means this rotation is made in the mesh local space only.\n * It's useful to set a custom rotation order different from the BJS standard one YXZ.\n * Example : this rotates the mesh first around its local X axis, then around its local Z axis, finally around its local Y axis.\n * ```javascript\n * mesh.addRotation(x1, 0, 0).addRotation(0, 0, z2).addRotation(0, 0, y3);\n * ```\n * Note that `addRotation()` accumulates the passed rotation values to the current ones and computes the .rotation or .rotationQuaternion updated values.\n * Under the hood, only quaternions are used. So it's a little faster is you use .rotationQuaternion because it doesn't need to translate them back to Euler angles.\n * @param x Rotation to add\n * @param y Rotation to add\n * @param z Rotation to add\n * @returns the TransformNode.\n */\n addRotation(e, t, i) {\n let r;\n this.rotationQuaternion ? r = this.rotationQuaternion : (r = z.Quaternion[1], Ce.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, r));\n const s = z.Quaternion[0];\n return Ce.RotationYawPitchRollToRef(t, e, i, s), r.multiplyInPlace(s), this.rotationQuaternion || r.toEulerAnglesToRef(this.rotation), this;\n }\n /**\n * @internal\n */\n _getEffectiveParent() {\n return this.parent;\n }\n /**\n * Returns whether the transform node world matrix computation needs the camera information to be computed.\n * This is the case when the node is a billboard or has an infinite distance for instance.\n * @returns true if the world matrix computation needs the camera information to be computed\n */\n isWorldMatrixCameraDependent() {\n return this._infiniteDistance && !this.parent || this._billboardMode !== He.BILLBOARDMODE_NONE && !this.preserveParentRotationForBillboard;\n }\n /**\n * Computes the world matrix of the node\n * @param force defines if the cache version should be invalidated forcing the world matrix to be created from scratch\n * @param camera defines the camera used if different from the scene active camera (This is used with modes like Billboard or infinite distance)\n * @returns the world matrix\n */\n computeWorldMatrix(e = !1, t = null) {\n if (this._isWorldMatrixFrozen && !this._isDirty)\n return this._worldMatrix;\n const i = this.getScene().getRenderId();\n if (!this._isDirty && !e && (this._currentRenderId === i || this.isSynchronized()))\n return this._currentRenderId = i, this._worldMatrix;\n t = t || this.getScene().activeCamera, this._updateCache();\n const r = this._cache;\n r.pivotMatrixUpdated = !1, r.billboardMode = this.billboardMode, r.infiniteDistance = this.infiniteDistance, r.parent = this._parentNode, this._currentRenderId = i, this._childUpdateId += 1, this._isDirty = !1, this._position._isDirty = !1, this._rotation._isDirty = !1, this._scaling._isDirty = !1;\n const s = this._getEffectiveParent(), a = He._TmpScaling;\n let o = this._position;\n if (this._infiniteDistance && !this.parent && t) {\n const c = t.getWorldMatrix(), h = new _(c.m[12], c.m[13], c.m[14]);\n o = He._TmpTranslation, o.copyFromFloats(this._position.x + h.x, this._position.y + h.y, this._position.z + h.z);\n }\n a.copyFromFloats(this._scaling.x * this.scalingDeterminant, this._scaling.y * this.scalingDeterminant, this._scaling.z * this.scalingDeterminant);\n let l;\n if (this._rotationQuaternion ? (this._rotationQuaternion._isDirty = !1, l = this._rotationQuaternion, this.reIntegrateRotationIntoRotationQuaternion && this.rotation.lengthSquared() && (this._rotationQuaternion.multiplyInPlace(Ce.RotationYawPitchRoll(this._rotation.y, this._rotation.x, this._rotation.z)), this._rotation.copyFromFloats(0, 0, 0))) : (l = He._TmpRotation, Ce.RotationYawPitchRollToRef(this._rotation.y, this._rotation.x, this._rotation.z, l)), this._usePivotMatrix) {\n const c = z.Matrix[1];\n L.ScalingToRef(a.x, a.y, a.z, c);\n const h = z.Matrix[0];\n l.toRotationMatrix(h), this._pivotMatrix.multiplyToRef(c, z.Matrix[4]), z.Matrix[4].multiplyToRef(h, this._localMatrix), this._postMultiplyPivotMatrix && this._localMatrix.multiplyToRef(this._pivotMatrixInverse, this._localMatrix), this._localMatrix.addTranslationFromFloats(o.x, o.y, o.z);\n } else\n L.ComposeToRef(a, l, o, this._localMatrix);\n if (s && s.getWorldMatrix) {\n if (e && s.computeWorldMatrix(e), r.useBillboardPath) {\n if (this._transformToBoneReferal) {\n const f = this.parent;\n f.getSkeleton().prepare(), f.getFinalMatrix().multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), z.Matrix[7]);\n } else\n z.Matrix[7].copyFrom(s.getWorldMatrix());\n const c = z.Vector3[5], h = z.Vector3[6], u = z.Quaternion[0];\n z.Matrix[7].decompose(h, u, c), L.ScalingToRef(h.x, h.y, h.z, z.Matrix[7]), z.Matrix[7].setTranslation(c), He.BillboardUseParentOrientation && (this._position.applyRotationQuaternionToRef(u, c), this._localMatrix.setTranslation(c)), this._localMatrix.multiplyToRef(z.Matrix[7], this._worldMatrix);\n } else if (this._transformToBoneReferal) {\n const c = this.parent;\n c.getSkeleton().prepare(), this._localMatrix.multiplyToRef(c.getFinalMatrix(), z.Matrix[6]), z.Matrix[6].multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), this._worldMatrix);\n } else\n this._localMatrix.multiplyToRef(s.getWorldMatrix(), this._worldMatrix);\n this._markSyncedWithParent();\n } else\n this._worldMatrix.copyFrom(this._localMatrix);\n if (r.useBillboardPath && t && this.billboardMode && !r.useBillboardPosition) {\n const c = z.Vector3[0];\n if (this._worldMatrix.getTranslationToRef(c), z.Matrix[1].copyFrom(t.getViewMatrix()), this._scene.useRightHandedSystem && z.Matrix[1].multiplyToRef(Hy, z.Matrix[1]), z.Matrix[1].setTranslationFromFloats(0, 0, 0), z.Matrix[1].invertToRef(z.Matrix[0]), (this.billboardMode & He.BILLBOARDMODE_ALL) !== He.BILLBOARDMODE_ALL) {\n z.Matrix[0].decompose(void 0, z.Quaternion[0], void 0);\n const h = z.Vector3[1];\n z.Quaternion[0].toEulerAnglesToRef(h), (this.billboardMode & He.BILLBOARDMODE_X) !== He.BILLBOARDMODE_X && (h.x = 0), (this.billboardMode & He.BILLBOARDMODE_Y) !== He.BILLBOARDMODE_Y && (h.y = 0), (this.billboardMode & He.BILLBOARDMODE_Z) !== He.BILLBOARDMODE_Z && (h.z = 0), L.RotationYawPitchRollToRef(h.y, h.x, h.z, z.Matrix[0]);\n }\n this._worldMatrix.setTranslationFromFloats(0, 0, 0), this._worldMatrix.multiplyToRef(z.Matrix[0], this._worldMatrix), this._worldMatrix.setTranslation(z.Vector3[0]);\n } else if (r.useBillboardPath && t && r.useBillboardPosition) {\n const c = z.Vector3[0];\n this._worldMatrix.getTranslationToRef(c);\n const h = t.globalPosition;\n this._worldMatrix.invertToRef(z.Matrix[1]);\n const u = z.Vector3[1];\n _.TransformCoordinatesToRef(h, z.Matrix[1], u), u.normalize();\n const f = -Math.atan2(u.z, u.x) + Math.PI / 2, d = Math.sqrt(u.x * u.x + u.z * u.z), p = -Math.atan2(u.y, d);\n if (Ce.RotationYawPitchRollToRef(f, p, 0, z.Quaternion[0]), (this.billboardMode & He.BILLBOARDMODE_ALL) !== He.BILLBOARDMODE_ALL) {\n const g = z.Vector3[1];\n z.Quaternion[0].toEulerAnglesToRef(g), (this.billboardMode & He.BILLBOARDMODE_X) !== He.BILLBOARDMODE_X && (g.x = 0), (this.billboardMode & He.BILLBOARDMODE_Y) !== He.BILLBOARDMODE_Y && (g.y = 0), (this.billboardMode & He.BILLBOARDMODE_Z) !== He.BILLBOARDMODE_Z && (g.z = 0), L.RotationYawPitchRollToRef(g.y, g.x, g.z, z.Matrix[0]);\n } else\n L.FromQuaternionToRef(z.Quaternion[0], z.Matrix[0]);\n this._worldMatrix.setTranslationFromFloats(0, 0, 0), this._worldMatrix.multiplyToRef(z.Matrix[0], this._worldMatrix), this._worldMatrix.setTranslation(z.Vector3[0]);\n }\n return this.ignoreNonUniformScaling ? this._updateNonUniformScalingState(!1) : this._scaling.isNonUniformWithinEpsilon(1e-6) ? this._updateNonUniformScalingState(!0) : s && s._nonUniformScaling ? this._updateNonUniformScalingState(s._nonUniformScaling) : this._updateNonUniformScalingState(!1), this._afterComputeWorldMatrix(), this._absolutePosition.copyFromFloats(this._worldMatrix.m[12], this._worldMatrix.m[13], this._worldMatrix.m[14]), this._isAbsoluteSynced = !1, this.onAfterWorldMatrixUpdateObservable.notifyObservers(this), this._poseMatrix || (this._poseMatrix = L.Invert(this._worldMatrix)), this._worldMatrixDeterminantIsDirty = !0, this._worldMatrix;\n }\n /**\n * Resets this nodeTransform's local matrix to Matrix.Identity().\n * @param independentOfChildren indicates if all child nodeTransform's world-space transform should be preserved.\n */\n resetLocalMatrix(e = !0) {\n if (this.computeWorldMatrix(), e) {\n const t = this.getChildren();\n for (let i = 0; i < t.length; ++i) {\n const r = t[i];\n if (r) {\n r.computeWorldMatrix();\n const s = z.Matrix[0];\n r._localMatrix.multiplyToRef(this._localMatrix, s);\n const a = z.Quaternion[0];\n s.decompose(r.scaling, a, r.position), r.rotationQuaternion ? r.rotationQuaternion.copyFrom(a) : a.toEulerAnglesToRef(r.rotation);\n }\n }\n }\n this.scaling.copyFromFloats(1, 1, 1), this.position.copyFromFloats(0, 0, 0), this.rotation.copyFromFloats(0, 0, 0), this.rotationQuaternion && (this.rotationQuaternion = Ce.Identity()), this._worldMatrix = L.Identity();\n }\n _afterComputeWorldMatrix() {\n }\n /**\n * If you'd like to be called back after the mesh position, rotation or scaling has been updated.\n * @param func callback function to add\n *\n * @returns the TransformNode.\n */\n registerAfterWorldMatrixUpdate(e) {\n return this.onAfterWorldMatrixUpdateObservable.add(e), this;\n }\n /**\n * Removes a registered callback function.\n * @param func callback function to remove\n * @returns the TransformNode.\n */\n unregisterAfterWorldMatrixUpdate(e) {\n return this.onAfterWorldMatrixUpdateObservable.removeCallback(e), this;\n }\n /**\n * Gets the position of the current mesh in camera space\n * @param camera defines the camera to use\n * @returns a position\n */\n getPositionInCameraSpace(e = null) {\n return e || (e = this.getScene().activeCamera), _.TransformCoordinates(this.getAbsolutePosition(), e.getViewMatrix());\n }\n /**\n * Returns the distance from the mesh to the active camera\n * @param camera defines the camera to use\n * @returns the distance\n */\n getDistanceToCamera(e = null) {\n return e || (e = this.getScene().activeCamera), this.getAbsolutePosition().subtract(e.globalPosition).length();\n }\n /**\n * Clone the current transform node\n * @param name Name of the new clone\n * @param newParent New parent for the clone\n * @param doNotCloneChildren Do not clone children hierarchy\n * @returns the new transform node\n */\n clone(e, t, i) {\n const r = Le.Clone(() => new He(e, this.getScene()), this);\n if (r.name = e, r.id = e, t && (r.parent = t), !i) {\n const s = this.getDescendants(!0);\n for (let a = 0; a < s.length; a++) {\n const o = s[a];\n o.clone && o.clone(e + \".\" + o.name, r);\n }\n }\n return r;\n }\n /**\n * Serializes the objects information.\n * @param currentSerializationObject defines the object to serialize in\n * @returns the serialized object\n */\n serialize(e) {\n const t = Le.Serialize(this, e);\n return t.type = this.getClassName(), t.uniqueId = this.uniqueId, this.parent && this.parent._serializeAsParent(t), t.localMatrix = this.getPivotMatrix().asArray(), t.isEnabled = this.isEnabled(), Le.AppendSerializedAnimations(this, t), t.ranges = this.serializeAnimationRanges(), t;\n }\n // Statics\n /**\n * Returns a new TransformNode object parsed from the source provided.\n * @param parsedTransformNode is the source.\n * @param scene the scene the object belongs to\n * @param rootUrl is a string, it's the root URL to prefix the `delayLoadingFile` property with\n * @returns a new TransformNode object parsed from the source provided.\n */\n static Parse(e, t, i) {\n const r = Le.Parse(() => new He(e.name, t), e, t, i);\n if (e.localMatrix ? r.setPreTransformMatrix(L.FromArray(e.localMatrix)) : e.pivotMatrix && r.setPivotMatrix(L.FromArray(e.pivotMatrix)), r.setEnabled(e.isEnabled), r._waitingParsedUniqueId = e.uniqueId, e.parentId !== void 0 && (r._waitingParentId = e.parentId), e.parentInstanceIndex !== void 0 && (r._waitingParentInstanceIndex = e.parentInstanceIndex), e.animations) {\n for (let s = 0; s < e.animations.length; s++) {\n const a = e.animations[s], o = mr(\"BABYLON.Animation\");\n o && r.animations.push(o.Parse(a));\n }\n Ai.ParseAnimationRanges(r, e, t);\n }\n return e.autoAnimate && t.beginAnimation(r, e.autoAnimateFrom, e.autoAnimateTo, e.autoAnimateLoop, e.autoAnimateSpeed || 1), r;\n }\n /**\n * Get all child-transformNodes of this node\n * @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\n * @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\n * @returns an array of TransformNode\n */\n getChildTransformNodes(e, t) {\n const i = [];\n return this._getDescendants(i, e, (r) => (!t || t(r)) && r instanceof He), i;\n }\n /**\n * Releases resources associated with this transform node.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n if (this.getScene().stopAnimation(this), this.getScene().removeTransformNode(this), this._parentContainer) {\n const i = this._parentContainer.transformNodes.indexOf(this);\n i > -1 && this._parentContainer.transformNodes.splice(i, 1), this._parentContainer = null;\n }\n if (this.onAfterWorldMatrixUpdateObservable.clear(), e) {\n const i = this.getChildTransformNodes(!0);\n for (const r of i)\n r.parent = null, r.computeWorldMatrix(!0);\n }\n super.dispose(e, t);\n }\n /**\n * Uniformly scales the mesh to fit inside of a unit cube (1 X 1 X 1 units)\n * @param includeDescendants Use the hierarchy's bounding box instead of the mesh's bounding box. Default is false\n * @param ignoreRotation ignore rotation when computing the scale (ie. object will be axis aligned). Default is false\n * @param predicate predicate that is passed in to getHierarchyBoundingVectors when selecting which object should be included when scaling\n * @returns the current mesh\n */\n normalizeToUnitCube(e = !0, t = !1, i) {\n let r = null, s = null;\n t && (this.rotationQuaternion ? (s = this.rotationQuaternion.clone(), this.rotationQuaternion.copyFromFloats(0, 0, 0, 1)) : this.rotation && (r = this.rotation.clone(), this.rotation.copyFromFloats(0, 0, 0)));\n const a = this.getHierarchyBoundingVectors(e, i), o = a.max.subtract(a.min), l = Math.max(o.x, o.y, o.z);\n if (l === 0)\n return this;\n const c = 1 / l;\n return this.scaling.scaleInPlace(c), t && (this.rotationQuaternion && s ? this.rotationQuaternion.copyFrom(s) : this.rotation && r && this.rotation.copyFrom(r)), this;\n }\n _syncAbsoluteScalingAndRotation() {\n this._isAbsoluteSynced || (this._worldMatrix.decompose(this._absoluteScaling, this._absoluteRotationQuaternion), this._isAbsoluteSynced = !0);\n }\n}\nHe.BILLBOARDMODE_NONE = 0;\nHe.BILLBOARDMODE_X = 1;\nHe.BILLBOARDMODE_Y = 2;\nHe.BILLBOARDMODE_Z = 4;\nHe.BILLBOARDMODE_ALL = 7;\nHe.BILLBOARDMODE_USE_POSITION = 128;\nHe.BillboardUseParentOrientation = !1;\nHe._TmpRotation = Ce.Zero();\nHe._TmpScaling = _.Zero();\nHe._TmpTranslation = _.Zero();\nHe._LookAtVectorCache = new _(0, 0, 0);\nHe._RotationAxisCache = new Ce();\nP([\n hn(\"position\")\n], He.prototype, \"_position\", void 0);\nP([\n hn(\"rotation\")\n], He.prototype, \"_rotation\", void 0);\nP([\n Ay(\"rotationQuaternion\")\n], He.prototype, \"_rotationQuaternion\", void 0);\nP([\n hn(\"scaling\")\n], He.prototype, \"_scaling\", void 0);\nP([\n w(\"billboardMode\")\n], He.prototype, \"_billboardMode\", void 0);\nP([\n w()\n], He.prototype, \"scalingDeterminant\", void 0);\nP([\n w(\"infiniteDistance\")\n], He.prototype, \"_infiniteDistance\", void 0);\nP([\n w()\n], He.prototype, \"ignoreNonUniformScaling\", void 0);\nP([\n w()\n], He.prototype, \"reIntegrateRotationIntoRotationQuaternion\", void 0);\nclass Ky {\n constructor() {\n this._checkCollisions = !1, this._collisionMask = -1, this._collisionGroup = -1, this._surroundingMeshes = null, this._collider = null, this._oldPositionForCollisions = new _(0, 0, 0), this._diffPositionForCollisions = new _(0, 0, 0), this._collisionResponse = !0;\n }\n}\nclass qy {\n constructor() {\n this.facetNb = 0, this.partitioningSubdivisions = 10, this.partitioningBBoxRatio = 1.01, this.facetDataEnabled = !1, this.facetParameters = {}, this.bbSize = _.Zero(), this.subDiv = {\n // actual number of subdivisions per axis for ComputeNormals()\n max: 1,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n X: 1,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Y: 1,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Z: 1\n }, this.facetDepthSort = !1, this.facetDepthSortEnabled = !1;\n }\n}\nclass Yy {\n constructor() {\n this._hasVertexAlpha = !1, this._useVertexColors = !0, this._numBoneInfluencers = 4, this._applyFog = !0, this._receiveShadows = !1, this._facetData = new qy(), this._visibility = 1, this._skeleton = null, this._layerMask = 268435455, this._computeBonesUsingShaders = !0, this._isActive = !1, this._onlyForInstances = !1, this._isActiveIntermediate = !1, this._onlyForInstancesIntermediate = !1, this._actAsRegularMesh = !1, this._currentLOD = null, this._currentLODIsUpToDate = !1, this._collisionRetryCount = 3, this._morphTargetManager = null, this._renderingGroupId = 0, this._bakedVertexAnimationManager = null, this._material = null, this._positions = null, this._pointerOverDisableMeshTesting = !1, this._meshCollisionData = new Ky(), this._enableDistantPicking = !1, this._rawBoundingInfo = null;\n }\n}\nclass er extends He {\n /**\n * No billboard\n */\n static get BILLBOARDMODE_NONE() {\n return He.BILLBOARDMODE_NONE;\n }\n /** Billboard on X axis */\n static get BILLBOARDMODE_X() {\n return He.BILLBOARDMODE_X;\n }\n /** Billboard on Y axis */\n static get BILLBOARDMODE_Y() {\n return He.BILLBOARDMODE_Y;\n }\n /** Billboard on Z axis */\n static get BILLBOARDMODE_Z() {\n return He.BILLBOARDMODE_Z;\n }\n /** Billboard on all axes */\n static get BILLBOARDMODE_ALL() {\n return He.BILLBOARDMODE_ALL;\n }\n /** Billboard on using position instead of orientation */\n static get BILLBOARDMODE_USE_POSITION() {\n return He.BILLBOARDMODE_USE_POSITION;\n }\n /**\n * Gets the number of facets in the mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet\n */\n get facetNb() {\n return this._internalAbstractMeshDataInfo._facetData.facetNb;\n }\n /**\n * Gets or set the number (integer) of subdivisions per axis in the partitioning space\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning\n */\n get partitioningSubdivisions() {\n return this._internalAbstractMeshDataInfo._facetData.partitioningSubdivisions;\n }\n set partitioningSubdivisions(e) {\n this._internalAbstractMeshDataInfo._facetData.partitioningSubdivisions = e;\n }\n /**\n * The ratio (float) to apply to the bounding box size to set to the partitioning space.\n * Ex : 1.01 (default) the partitioning space is 1% bigger than the bounding box\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning\n */\n get partitioningBBoxRatio() {\n return this._internalAbstractMeshDataInfo._facetData.partitioningBBoxRatio;\n }\n set partitioningBBoxRatio(e) {\n this._internalAbstractMeshDataInfo._facetData.partitioningBBoxRatio = e;\n }\n /**\n * Gets or sets a boolean indicating that the facets must be depth sorted on next call to `updateFacetData()`.\n * Works only for updatable meshes.\n * Doesn't work with multi-materials\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort\n */\n get mustDepthSortFacets() {\n return this._internalAbstractMeshDataInfo._facetData.facetDepthSort;\n }\n set mustDepthSortFacets(e) {\n this._internalAbstractMeshDataInfo._facetData.facetDepthSort = e;\n }\n /**\n * The location (Vector3) where the facet depth sort must be computed from.\n * By default, the active camera position.\n * Used only when facet depth sort is enabled\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort\n */\n get facetDepthSortFrom() {\n return this._internalAbstractMeshDataInfo._facetData.facetDepthSortFrom;\n }\n set facetDepthSortFrom(e) {\n this._internalAbstractMeshDataInfo._facetData.facetDepthSortFrom = e;\n }\n /** number of collision detection tries. Change this value if not all collisions are detected and handled properly */\n get collisionRetryCount() {\n return this._internalAbstractMeshDataInfo._collisionRetryCount;\n }\n set collisionRetryCount(e) {\n this._internalAbstractMeshDataInfo._collisionRetryCount = e;\n }\n /**\n * gets a boolean indicating if facetData is enabled\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet\n */\n get isFacetDataEnabled() {\n return this._internalAbstractMeshDataInfo._facetData.facetDataEnabled;\n }\n /**\n * Gets or sets the morph target manager\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets\n */\n get morphTargetManager() {\n return this._internalAbstractMeshDataInfo._morphTargetManager;\n }\n set morphTargetManager(e) {\n this._internalAbstractMeshDataInfo._morphTargetManager !== e && (this._internalAbstractMeshDataInfo._morphTargetManager = e, this._syncGeometryWithMorphTargetManager());\n }\n /**\n * Gets or sets the baked vertex animation manager\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/baked_texture_animations\n */\n get bakedVertexAnimationManager() {\n return this._internalAbstractMeshDataInfo._bakedVertexAnimationManager;\n }\n set bakedVertexAnimationManager(e) {\n this._internalAbstractMeshDataInfo._bakedVertexAnimationManager !== e && (this._internalAbstractMeshDataInfo._bakedVertexAnimationManager = e, this._markSubMeshesAsAttributesDirty());\n }\n /** @internal */\n _syncGeometryWithMorphTargetManager() {\n }\n /**\n * @internal\n */\n _updateNonUniformScalingState(e) {\n return super._updateNonUniformScalingState(e) ? (this._markSubMeshesAsMiscDirty(), !0) : !1;\n }\n /** @internal */\n get rawBoundingInfo() {\n return this._internalAbstractMeshDataInfo._rawBoundingInfo;\n }\n set rawBoundingInfo(e) {\n this._internalAbstractMeshDataInfo._rawBoundingInfo = e;\n }\n /** Set a function to call when this mesh collides with another one */\n set onCollide(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver && this.onCollideObservable.remove(this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver), this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver = this.onCollideObservable.add(e);\n }\n /** Set a function to call when the collision's position changes */\n set onCollisionPositionChange(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver && this.onCollisionPositionChangeObservable.remove(this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver), this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver = this.onCollisionPositionChangeObservable.add(e);\n }\n /**\n * Gets or sets mesh visibility between 0 and 1 (default is 1)\n */\n get visibility() {\n return this._internalAbstractMeshDataInfo._visibility;\n }\n /**\n * Gets or sets mesh visibility between 0 and 1 (default is 1)\n */\n set visibility(e) {\n if (this._internalAbstractMeshDataInfo._visibility === e)\n return;\n const t = this._internalAbstractMeshDataInfo._visibility;\n this._internalAbstractMeshDataInfo._visibility = e, (t === 1 && e !== 1 || t !== 1 && e === 1) && this._markSubMeshesAsDirty((i) => {\n i.markAsMiscDirty(), i.markAsPrePassDirty();\n });\n }\n /**\n * Gets or sets the property which disables the test that is checking that the mesh under the pointer is the same than the previous time we tested for it (default: false).\n * Set this property to true if you want thin instances picking to be reported accurately when moving over the mesh.\n * Note that setting this property to true will incur some performance penalties when dealing with pointer events for this mesh so use it sparingly.\n */\n get pointerOverDisableMeshTesting() {\n return this._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting;\n }\n set pointerOverDisableMeshTesting(e) {\n this._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting = e;\n }\n /**\n * Specifies the rendering group id for this mesh (0 by default)\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#rendering-groups\n */\n get renderingGroupId() {\n return this._internalAbstractMeshDataInfo._renderingGroupId;\n }\n set renderingGroupId(e) {\n this._internalAbstractMeshDataInfo._renderingGroupId = e;\n }\n /** Gets or sets current material */\n get material() {\n return this._internalAbstractMeshDataInfo._material;\n }\n set material(e) {\n this._internalAbstractMeshDataInfo._material !== e && (this._internalAbstractMeshDataInfo._material && this._internalAbstractMeshDataInfo._material.meshMap && (this._internalAbstractMeshDataInfo._material.meshMap[this.uniqueId] = void 0), this._internalAbstractMeshDataInfo._material = e, e && e.meshMap && (e.meshMap[this.uniqueId] = this), this.onMaterialChangedObservable.hasObservers() && this.onMaterialChangedObservable.notifyObservers(this), this.subMeshes && (this.resetDrawCache(), this._unBindEffect()));\n }\n /**\n * Gets the material used to render the mesh in a specific render pass\n * @param renderPassId render pass id\n * @returns material used for the render pass. If no specific material is used for this render pass, undefined is returned (meaning mesh.material is used for this pass)\n */\n getMaterialForRenderPass(e) {\n var t;\n return (t = this._internalAbstractMeshDataInfo._materialForRenderPass) == null ? void 0 : t[e];\n }\n /**\n * Sets the material to be used to render the mesh in a specific render pass\n * @param renderPassId render pass id\n * @param material material to use for this render pass. If undefined is passed, no specific material will be used for this render pass but the regular material will be used instead (mesh.material)\n */\n setMaterialForRenderPass(e, t) {\n this.resetDrawCache(e), this._internalAbstractMeshDataInfo._materialForRenderPass || (this._internalAbstractMeshDataInfo._materialForRenderPass = []), this._internalAbstractMeshDataInfo._materialForRenderPass[e] = t;\n }\n /**\n * Gets or sets a boolean indicating that this mesh can receive realtime shadows\n * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows\n */\n get receiveShadows() {\n return this._internalAbstractMeshDataInfo._receiveShadows;\n }\n set receiveShadows(e) {\n this._internalAbstractMeshDataInfo._receiveShadows !== e && (this._internalAbstractMeshDataInfo._receiveShadows = e, this._markSubMeshesAsLightDirty());\n }\n /** Gets or sets a boolean indicating that this mesh contains vertex color data with alpha values */\n get hasVertexAlpha() {\n return this._internalAbstractMeshDataInfo._hasVertexAlpha;\n }\n set hasVertexAlpha(e) {\n this._internalAbstractMeshDataInfo._hasVertexAlpha !== e && (this._internalAbstractMeshDataInfo._hasVertexAlpha = e, this._markSubMeshesAsAttributesDirty(), this._markSubMeshesAsMiscDirty());\n }\n /** Gets or sets a boolean indicating that this mesh needs to use vertex color data to render (if this kind of vertex data is available in the geometry) */\n get useVertexColors() {\n return this._internalAbstractMeshDataInfo._useVertexColors;\n }\n set useVertexColors(e) {\n this._internalAbstractMeshDataInfo._useVertexColors !== e && (this._internalAbstractMeshDataInfo._useVertexColors = e, this._markSubMeshesAsAttributesDirty());\n }\n /**\n * Gets or sets a boolean indicating that bone animations must be computed by the GPU (true by default)\n */\n get computeBonesUsingShaders() {\n return this._internalAbstractMeshDataInfo._computeBonesUsingShaders;\n }\n set computeBonesUsingShaders(e) {\n this._internalAbstractMeshDataInfo._computeBonesUsingShaders !== e && (this._internalAbstractMeshDataInfo._computeBonesUsingShaders = e, this._markSubMeshesAsAttributesDirty());\n }\n /** Gets or sets the number of allowed bone influences per vertex (4 by default) */\n get numBoneInfluencers() {\n return this._internalAbstractMeshDataInfo._numBoneInfluencers;\n }\n set numBoneInfluencers(e) {\n this._internalAbstractMeshDataInfo._numBoneInfluencers !== e && (this._internalAbstractMeshDataInfo._numBoneInfluencers = e, this._markSubMeshesAsAttributesDirty());\n }\n /** Gets or sets a boolean indicating that this mesh will allow fog to be rendered on it (true by default) */\n get applyFog() {\n return this._internalAbstractMeshDataInfo._applyFog;\n }\n set applyFog(e) {\n this._internalAbstractMeshDataInfo._applyFog !== e && (this._internalAbstractMeshDataInfo._applyFog = e, this._markSubMeshesAsMiscDirty());\n }\n /** When enabled, decompose picking matrices for better precision with large values for mesh position and scling */\n get enableDistantPicking() {\n return this._internalAbstractMeshDataInfo._enableDistantPicking;\n }\n set enableDistantPicking(e) {\n this._internalAbstractMeshDataInfo._enableDistantPicking = e;\n }\n /**\n * Gets or sets the current layer mask (default is 0x0FFFFFFF)\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/layerMasksAndMultiCam\n */\n get layerMask() {\n return this._internalAbstractMeshDataInfo._layerMask;\n }\n set layerMask(e) {\n e !== this._internalAbstractMeshDataInfo._layerMask && (this._internalAbstractMeshDataInfo._layerMask = e, this._resyncLightSources());\n }\n /**\n * Gets or sets a collision mask used to mask collisions (default is -1).\n * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0\n */\n get collisionMask() {\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionMask;\n }\n set collisionMask(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionMask = isNaN(e) ? -1 : e;\n }\n /**\n * Gets or sets a collision response flag (default is true).\n * when collisionResponse is false, events are still triggered but colliding entity has no response\n * This helps creating trigger volume when user wants collision feedback events but not position/velocity\n * to respond to the collision.\n */\n get collisionResponse() {\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionResponse;\n }\n set collisionResponse(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionResponse = e;\n }\n /**\n * Gets or sets the current collision group mask (-1 by default).\n * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0\n */\n get collisionGroup() {\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionGroup;\n }\n set collisionGroup(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionGroup = isNaN(e) ? -1 : e;\n }\n /**\n * Gets or sets current surrounding meshes (null by default).\n *\n * By default collision detection is tested against every mesh in the scene.\n * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified\n * meshes will be tested for the collision.\n *\n * Note: if set to an empty array no collision will happen when this mesh is moved.\n */\n get surroundingMeshes() {\n return this._internalAbstractMeshDataInfo._meshCollisionData._surroundingMeshes;\n }\n set surroundingMeshes(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._surroundingMeshes = e;\n }\n /** Gets the list of lights affecting that mesh */\n get lightSources() {\n return this._lightSources;\n }\n /** @internal */\n get _positions() {\n return null;\n }\n /**\n * Gets or sets a skeleton to apply skinning transformations\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons\n */\n set skeleton(e) {\n const t = this._internalAbstractMeshDataInfo._skeleton;\n t && t.needInitialSkinMatrix && t._unregisterMeshWithPoseMatrix(this), e && e.needInitialSkinMatrix && e._registerMeshWithPoseMatrix(this), this._internalAbstractMeshDataInfo._skeleton = e, this._internalAbstractMeshDataInfo._skeleton || (this._bonesTransformMatrices = null), this._markSubMeshesAsAttributesDirty();\n }\n get skeleton() {\n return this._internalAbstractMeshDataInfo._skeleton;\n }\n // Constructor\n /**\n * Creates a new AbstractMesh\n * @param name defines the name of the mesh\n * @param scene defines the hosting scene\n */\n constructor(e, t = null) {\n switch (super(e, t, !1), this._internalAbstractMeshDataInfo = new Yy(), this._waitingMaterialId = null, this.cullingStrategy = er.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY, this.onCollideObservable = new he(), this.onCollisionPositionChangeObservable = new he(), this.onMaterialChangedObservable = new he(), this.definedFacingForward = !0, this._occlusionQuery = null, this._renderingGroup = null, this.alphaIndex = Number.MAX_VALUE, this.isVisible = !0, this.isPickable = !0, this.isNearPickable = !1, this.isNearGrabbable = !1, this.showSubMeshesBoundingBox = !1, this.isBlocker = !1, this.enablePointerMoveEvents = !1, this.outlineColor = Ne.Red(), this.outlineWidth = 0.02, this.overlayColor = Ne.Red(), this.overlayAlpha = 0.5, this.useOctreeForRenderingSelection = !0, this.useOctreeForPicking = !0, this.useOctreeForCollisions = !0, this.alwaysSelectAsActiveMesh = !1, this.doNotSyncBoundingInfo = !1, this.actionManager = null, this.ellipsoid = new _(0.5, 1, 0.5), this.ellipsoidOffset = new _(0, 0, 0), this.edgesWidth = 1, this.edgesColor = new et(1, 0, 0, 1), this._edgesRenderer = null, this._masterMesh = null, this._boundingInfo = null, this._boundingInfoIsDirty = !0, this._renderId = 0, this._intersectionsInProgress = new Array(), this._unIndexed = !1, this._lightSources = new Array(), this._waitingData = {\n lods: null,\n actions: null,\n freezeWorldMatrix: null\n }, this._bonesTransformMatrices = null, this._transformMatrixTexture = null, this.onRebuildObservable = new he(), this._onCollisionPositionChange = (i, r, s = null) => {\n r.subtractToRef(this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions, this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions), this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions.length() > se.CollisionsEpsilon && this.position.addInPlace(this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions), s && this.onCollideObservable.notifyObservers(s), this.onCollisionPositionChangeObservable.notifyObservers(this.position);\n }, t = this.getScene(), t.addMesh(this), this._resyncLightSources(), this._uniformBuffer = new Ie(this.getScene().getEngine(), void 0, void 0, e, !this.getScene().getEngine().isWebGPU), this._buildUniformLayout(), t.performancePriority) {\n case fs.Aggressive:\n this.doNotSyncBoundingInfo = !0;\n case fs.Intermediate:\n this.alwaysSelectAsActiveMesh = !0, this.isPickable = !1;\n break;\n }\n }\n _buildUniformLayout() {\n this._uniformBuffer.addUniform(\"world\", 16), this._uniformBuffer.addUniform(\"visibility\", 1), this._uniformBuffer.create();\n }\n /**\n * Transfer the mesh values to its UBO.\n * @param world The world matrix associated with the mesh\n */\n transferToEffect(e) {\n const t = this._uniformBuffer;\n t.updateMatrix(\"world\", e), t.updateFloat(\"visibility\", this._internalAbstractMeshDataInfo._visibility), t.update();\n }\n /**\n * Gets the mesh uniform buffer.\n * @returns the uniform buffer of the mesh.\n */\n getMeshUniformBuffer() {\n return this._uniformBuffer;\n }\n /**\n * Returns the string \"AbstractMesh\"\n * @returns \"AbstractMesh\"\n */\n getClassName() {\n return \"AbstractMesh\";\n }\n /**\n * Gets a string representation of the current mesh\n * @param fullDetails defines a boolean indicating if full details must be included\n * @returns a string representation of the current mesh\n */\n toString(e) {\n let t = \"Name: \" + this.name + \", isInstance: \" + (this.getClassName() !== \"InstancedMesh\" ? \"YES\" : \"NO\");\n t += \", # of submeshes: \" + (this.subMeshes ? this.subMeshes.length : 0);\n const i = this._internalAbstractMeshDataInfo._skeleton;\n return i && (t += \", skeleton: \" + i.name), e && (t += \", billboard mode: \" + [\"NONE\", \"X\", \"Y\", null, \"Z\", null, null, \"ALL\"][this.billboardMode], t += \", freeze wrld mat: \" + (this._isWorldMatrixFrozen || this._waitingData.freezeWorldMatrix ? \"YES\" : \"NO\")), t;\n }\n /**\n * @internal\n */\n _getEffectiveParent() {\n return this._masterMesh && this.billboardMode !== He.BILLBOARDMODE_NONE ? this._masterMesh : super._getEffectiveParent();\n }\n /**\n * @internal\n */\n _getActionManagerForTrigger(e, t = !0) {\n if (this.actionManager && (t || this.actionManager.isRecursive))\n if (e) {\n if (this.actionManager.hasSpecificTrigger(e))\n return this.actionManager;\n } else\n return this.actionManager;\n return this.parent ? this.parent._getActionManagerForTrigger(e, !1) : null;\n }\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _rebuild(e = !1) {\n if (this.onRebuildObservable.notifyObservers(this), this._occlusionQuery !== null && (this._occlusionQuery = null), !!this.subMeshes) {\n for (const t of this.subMeshes)\n t._rebuild();\n this.resetDrawCache();\n }\n }\n /** @internal */\n _resyncLightSources() {\n this._lightSources.length = 0;\n for (const e of this.getScene().lights)\n e.isEnabled() && e.canAffectMesh(this) && this._lightSources.push(e);\n this._markSubMeshesAsLightDirty();\n }\n /**\n * @internal\n */\n _resyncLightSource(e) {\n const t = e.isEnabled() && e.canAffectMesh(this), i = this._lightSources.indexOf(e);\n let r = !1;\n if (i === -1) {\n if (!t)\n return;\n this._lightSources.push(e);\n } else {\n if (t)\n return;\n r = !0, this._lightSources.splice(i, 1);\n }\n this._markSubMeshesAsLightDirty(r);\n }\n /** @internal */\n _unBindEffect() {\n for (const e of this.subMeshes)\n e.setEffect(null);\n }\n /**\n * @internal\n */\n _removeLightSource(e, t) {\n const i = this._lightSources.indexOf(e);\n i !== -1 && (this._lightSources.splice(i, 1), this._markSubMeshesAsLightDirty(t));\n }\n _markSubMeshesAsDirty(e) {\n if (this.subMeshes)\n for (const t of this.subMeshes)\n for (let i = 0; i < t._drawWrappers.length; ++i) {\n const r = t._drawWrappers[i];\n !r || !r.defines || !r.defines.markAllAsDirty || e(r.defines);\n }\n }\n /**\n * @internal\n */\n _markSubMeshesAsLightDirty(e = !1) {\n this._markSubMeshesAsDirty((t) => t.markAsLightDirty(e));\n }\n /** @internal */\n _markSubMeshesAsAttributesDirty() {\n this._markSubMeshesAsDirty((e) => e.markAsAttributesDirty());\n }\n /** @internal */\n _markSubMeshesAsMiscDirty() {\n this._markSubMeshesAsDirty((e) => e.markAsMiscDirty());\n }\n /**\n * Flag the AbstractMesh as dirty (Forcing it to update everything)\n * @param property if set to \"rotation\" the objects rotationQuaternion will be set to null\n * @returns this AbstractMesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n markAsDirty(e) {\n return this._currentRenderId = Number.MAX_VALUE, this._isDirty = !0, this;\n }\n /**\n * Resets the draw wrappers cache for all submeshes of this abstract mesh\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\n */\n resetDrawCache(e) {\n if (this.subMeshes)\n for (const t of this.subMeshes)\n t.resetDrawCache(e);\n }\n // Methods\n /**\n * Returns true if the mesh is blocked. Implemented by child classes\n */\n get isBlocked() {\n return !1;\n }\n /**\n * Returns the mesh itself by default. Implemented by child classes\n * @param camera defines the camera to use to pick the right LOD level\n * @returns the currentAbstractMesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getLOD(e) {\n return this;\n }\n /**\n * Returns 0 by default. Implemented by child classes\n * @returns an integer\n */\n getTotalVertices() {\n return 0;\n }\n /**\n * Returns a positive integer : the total number of indices in this mesh geometry.\n * @returns the number of indices or zero if the mesh has no geometry.\n */\n getTotalIndices() {\n return 0;\n }\n /**\n * Returns null by default. Implemented by child classes\n * @returns null\n */\n getIndices() {\n return null;\n }\n /**\n * Returns the array of the requested vertex data kind. Implemented by child classes\n * @param kind defines the vertex data kind to use\n * @returns null\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getVerticesData(e) {\n return null;\n }\n /**\n * Sets the vertex data of the mesh geometry for the requested `kind`.\n * If the mesh has no geometry, a new Geometry object is set to the mesh and then passed this vertex data.\n * Note that a new underlying VertexBuffer object is created each call.\n * If the `kind` is the `PositionKind`, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\n * @param kind defines vertex data kind:\n * * VertexBuffer.PositionKind\n * * VertexBuffer.UVKind\n * * VertexBuffer.UV2Kind\n * * VertexBuffer.UV3Kind\n * * VertexBuffer.UV4Kind\n * * VertexBuffer.UV5Kind\n * * VertexBuffer.UV6Kind\n * * VertexBuffer.ColorKind\n * * VertexBuffer.MatricesIndicesKind\n * * VertexBuffer.MatricesIndicesExtraKind\n * * VertexBuffer.MatricesWeightsKind\n * * VertexBuffer.MatricesWeightsExtraKind\n * @param data defines the data source\n * @param updatable defines if the data must be flagged as updatable (or static)\n * @param stride defines the vertex stride (size of an entire vertex). Can be null and in this case will be deduced from vertex data kind\n * @returns the current mesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setVerticesData(e, t, i, r) {\n return this;\n }\n /**\n * Updates the existing vertex data of the mesh geometry for the requested `kind`.\n * If the mesh has no geometry, it is simply returned as it is.\n * @param kind defines vertex data kind:\n * * VertexBuffer.PositionKind\n * * VertexBuffer.UVKind\n * * VertexBuffer.UV2Kind\n * * VertexBuffer.UV3Kind\n * * VertexBuffer.UV4Kind\n * * VertexBuffer.UV5Kind\n * * VertexBuffer.UV6Kind\n * * VertexBuffer.ColorKind\n * * VertexBuffer.MatricesIndicesKind\n * * VertexBuffer.MatricesIndicesExtraKind\n * * VertexBuffer.MatricesWeightsKind\n * * VertexBuffer.MatricesWeightsExtraKind\n * @param data defines the data source\n * @param updateExtends If `kind` is `PositionKind` and if `updateExtends` is true, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed\n * @param makeItUnique If true, a new global geometry is created from this data and is set to the mesh\n * @returns the current mesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n updateVerticesData(e, t, i, r) {\n return this;\n }\n /**\n * Sets the mesh indices,\n * If the mesh has no geometry, a new Geometry object is created and set to the mesh.\n * @param indices Expects an array populated with integers or a typed array (Int32Array, Uint32Array, Uint16Array)\n * @param totalVertices Defines the total number of vertices\n * @returns the current mesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setIndices(e, t) {\n return this;\n }\n /**\n * Gets a boolean indicating if specific vertex data is present\n * @param kind defines the vertex data kind to use\n * @returns true is data kind is present\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isVerticesDataPresent(e) {\n return !1;\n }\n /**\n * Returns the mesh BoundingInfo object or creates a new one and returns if it was undefined.\n * Note that it returns a shallow bounding of the mesh (i.e. it does not include children).\n * However, if the mesh contains thin instances, it will be expanded to include them. If you want the \"raw\" bounding data instead, then use `getRawBoundingInfo()`.\n * To get the full bounding of all children, call `getHierarchyBoundingVectors` instead.\n * @returns a BoundingInfo\n */\n getBoundingInfo() {\n return this._masterMesh ? this._masterMesh.getBoundingInfo() : (this._boundingInfoIsDirty && (this._boundingInfoIsDirty = !1, this._updateBoundingInfo()), this._boundingInfo);\n }\n /**\n * Returns the bounding info unnafected by instance data.\n * @returns the bounding info of the mesh unaffected by instance data.\n */\n getRawBoundingInfo() {\n return this.rawBoundingInfo ?? this.getBoundingInfo();\n }\n /**\n * Overwrite the current bounding info\n * @param boundingInfo defines the new bounding info\n * @returns the current mesh\n */\n setBoundingInfo(e) {\n return this._boundingInfo = e, this;\n }\n /**\n * Returns true if there is already a bounding info\n */\n get hasBoundingInfo() {\n return this._boundingInfo !== null;\n }\n /**\n * Creates a new bounding info for the mesh\n * @param minimum min vector of the bounding box/sphere\n * @param maximum max vector of the bounding box/sphere\n * @param worldMatrix defines the new world matrix\n * @returns the new bounding info\n */\n buildBoundingInfo(e, t, i) {\n return this._boundingInfo = new Cr(e, t, i), this._boundingInfo;\n }\n /**\n * Uniformly scales the mesh to fit inside of a unit cube (1 X 1 X 1 units)\n * @param includeDescendants Use the hierarchy's bounding box instead of the mesh's bounding box. Default is false\n * @param ignoreRotation ignore rotation when computing the scale (ie. object will be axis aligned). Default is false\n * @param predicate predicate that is passed in to getHierarchyBoundingVectors when selecting which object should be included when scaling\n * @returns the current mesh\n */\n normalizeToUnitCube(e = !0, t = !1, i) {\n return super.normalizeToUnitCube(e, t, i);\n }\n /** Gets a boolean indicating if this mesh has skinning data and an attached skeleton */\n get useBones() {\n return this.skeleton && this.getScene().skeletonsEnabled && this.isVerticesDataPresent(I.MatricesIndicesKind) && this.isVerticesDataPresent(I.MatricesWeightsKind);\n }\n /** @internal */\n _preActivate() {\n }\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _preActivateForIntermediateRendering(e) {\n }\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _activate(e, t) {\n return this._renderId = e, !0;\n }\n /** @internal */\n _postActivate() {\n }\n /** @internal */\n _freeze() {\n }\n /** @internal */\n _unFreeze() {\n }\n /**\n * Gets the current world matrix\n * @returns a Matrix\n */\n getWorldMatrix() {\n return this._masterMesh && this.billboardMode === He.BILLBOARDMODE_NONE ? this._masterMesh.getWorldMatrix() : super.getWorldMatrix();\n }\n /** @internal */\n _getWorldMatrixDeterminant() {\n return this._masterMesh ? this._masterMesh._getWorldMatrixDeterminant() : super._getWorldMatrixDeterminant();\n }\n /**\n * Gets a boolean indicating if this mesh is an instance or a regular mesh\n */\n get isAnInstance() {\n return !1;\n }\n /**\n * Gets a boolean indicating if this mesh has instances\n */\n get hasInstances() {\n return !1;\n }\n /**\n * Gets a boolean indicating if this mesh has thin instances\n */\n get hasThinInstances() {\n return !1;\n }\n // ================================== Point of View Movement =================================\n /**\n * Perform relative position change from the point of view of behind the front of the mesh.\n * This is performed taking into account the meshes current rotation, so you do not have to care.\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\n * @param amountRight defines the distance on the right axis\n * @param amountUp defines the distance on the up axis\n * @param amountForward defines the distance on the forward axis\n * @returns the current mesh\n */\n movePOV(e, t, i) {\n return this.position.addInPlace(this.calcMovePOV(e, t, i)), this;\n }\n /**\n * Calculate relative position change from the point of view of behind the front of the mesh.\n * This is performed taking into account the meshes current rotation, so you do not have to care.\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\n * @param amountRight defines the distance on the right axis\n * @param amountUp defines the distance on the up axis\n * @param amountForward defines the distance on the forward axis\n * @returns the new displacement vector\n */\n calcMovePOV(e, t, i) {\n const r = new L();\n (this.rotationQuaternion ? this.rotationQuaternion : Ce.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z)).toRotationMatrix(r);\n const a = _.Zero(), o = this.definedFacingForward ? -1 : 1;\n return _.TransformCoordinatesFromFloatsToRef(e * o, t, i * o, r, a), a;\n }\n // ================================== Point of View Rotation =================================\n /**\n * Perform relative rotation change from the point of view of behind the front of the mesh.\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\n * @param flipBack defines the flip\n * @param twirlClockwise defines the twirl\n * @param tiltRight defines the tilt\n * @returns the current mesh\n */\n rotatePOV(e, t, i) {\n return this.rotation.addInPlace(this.calcRotatePOV(e, t, i)), this;\n }\n /**\n * Calculate relative rotation change from the point of view of behind the front of the mesh.\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\n * @param flipBack defines the flip\n * @param twirlClockwise defines the twirl\n * @param tiltRight defines the tilt\n * @returns the new rotation vector\n */\n calcRotatePOV(e, t, i) {\n const r = this.definedFacingForward ? 1 : -1;\n return new _(e * r, t, i * r);\n }\n /**\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\n * This means the mesh underlying bounding box and sphere are recomputed.\n * @param applySkeleton defines whether to apply the skeleton before computing the bounding info\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\n * @returns the current mesh\n */\n refreshBoundingInfo(e = !1, t = !1) {\n return this._boundingInfo && this._boundingInfo.isLocked ? this : (this._refreshBoundingInfo(this._getPositionData(e, t), null), this);\n }\n /**\n * @internal\n */\n _refreshBoundingInfo(e, t) {\n if (e) {\n const i = _o(e, 0, this.getTotalVertices(), t);\n this._boundingInfo ? this._boundingInfo.reConstruct(i.minimum, i.maximum) : this._boundingInfo = new Cr(i.minimum, i.maximum);\n }\n if (this.subMeshes)\n for (let i = 0; i < this.subMeshes.length; i++)\n this.subMeshes[i].refreshBoundingInfo(e);\n this._updateBoundingInfo();\n }\n /**\n * Internal function to get buffer data and possibly apply morphs and normals\n * @param applySkeleton\n * @param applyMorph\n * @param data\n * @param kind the kind of data you want. Can be Normal or Position\n * @returns a FloatArray of the vertex data\n */\n _getData(e = !1, t = !1, i, r = I.PositionKind) {\n if (i = i ?? this.getVerticesData(r).slice(), i && t && this.morphTargetManager) {\n let s = 0, a = 0;\n for (let o = 0; o < i.length; o++) {\n let l = i[o];\n for (let c = 0; c < this.morphTargetManager.numTargets; c++) {\n const h = this.morphTargetManager.getTarget(c), u = h.influence;\n if (u !== 0) {\n let f = null;\n switch (r) {\n case I.PositionKind:\n f = h.getPositions();\n break;\n case I.NormalKind:\n f = h.getNormals();\n break;\n case I.TangentKind:\n f = h.getTangents();\n break;\n case I.UVKind:\n f = h.getUVs();\n break;\n }\n f && (l += (f[o] - i[o]) * u);\n }\n }\n if (i[o] = l, s++, r === I.PositionKind && this._positions && s === 3) {\n s = 0;\n const c = a * 3;\n this._positions[a++].copyFromFloats(i[c], i[c + 1], i[c + 2]);\n }\n }\n }\n if (i && e && this.skeleton) {\n const s = this.getVerticesData(I.MatricesIndicesKind), a = this.getVerticesData(I.MatricesWeightsKind);\n if (a && s) {\n const o = this.numBoneInfluencers > 4, l = o ? this.getVerticesData(I.MatricesIndicesExtraKind) : null, c = o ? this.getVerticesData(I.MatricesWeightsExtraKind) : null, h = this.skeleton.getTransformMatrices(this), u = z.Vector3[0], f = z.Matrix[0], d = z.Matrix[1];\n let p = 0;\n for (let g = 0; g < i.length; g += 3, p += 4) {\n f.reset();\n let m, v;\n for (m = 0; m < 4; m++)\n v = a[p + m], v > 0 && (L.FromFloat32ArrayToRefScaled(h, Math.floor(s[p + m] * 16), v, d), f.addToSelf(d));\n if (o)\n for (m = 0; m < 4; m++)\n v = c[p + m], v > 0 && (L.FromFloat32ArrayToRefScaled(h, Math.floor(l[p + m] * 16), v, d), f.addToSelf(d));\n r === I.NormalKind ? _.TransformNormalFromFloatsToRef(i[g], i[g + 1], i[g + 2], f, u) : _.TransformCoordinatesFromFloatsToRef(i[g], i[g + 1], i[g + 2], f, u), u.toArray(i, g), r === I.PositionKind && this._positions && this._positions[g / 3].copyFrom(u);\n }\n }\n }\n return i;\n }\n /**\n * Get the normals vertex data and optionally apply skeleton and morphing.\n * @param applySkeleton defines whether to apply the skeleton\n * @param applyMorph defines whether to apply the morph target\n * @returns the normals data\n */\n getNormalsData(e = !1, t = !1) {\n return this._getData(e, t, null, I.NormalKind);\n }\n /**\n * Get the position vertex data and optionally apply skeleton and morphing.\n * @param applySkeleton defines whether to apply the skeleton\n * @param applyMorph defines whether to apply the morph target\n * @param data defines the position data to apply the skeleton and morph to\n * @returns the position data\n */\n getPositionData(e = !1, t = !1, i) {\n return this._getData(e, t, i, I.PositionKind);\n }\n /**\n * @internal\n */\n _getPositionData(e, t) {\n var r;\n let i = this.getVerticesData(I.PositionKind);\n if (this._internalAbstractMeshDataInfo._positions && (this._internalAbstractMeshDataInfo._positions = null), i && (e && this.skeleton || t && this.morphTargetManager)) {\n if (i = i.slice(), this._generatePointsArray(), this._positions) {\n const s = this._positions;\n this._internalAbstractMeshDataInfo._positions = new Array(s.length);\n for (let a = 0; a < s.length; a++)\n this._internalAbstractMeshDataInfo._positions[a] = ((r = s[a]) == null ? void 0 : r.clone()) || new _();\n }\n return this.getPositionData(e, t, i);\n }\n return i;\n }\n /** @internal */\n _updateBoundingInfo() {\n return this._boundingInfo ? this._boundingInfo.update(this.worldMatrixFromCache) : this._boundingInfo = new Cr(_.Zero(), _.Zero(), this.worldMatrixFromCache), this._updateSubMeshesBoundingInfo(this.worldMatrixFromCache), this;\n }\n /**\n * @internal\n */\n _updateSubMeshesBoundingInfo(e) {\n if (!this.subMeshes)\n return this;\n const t = this.subMeshes.length;\n for (let i = 0; i < t; i++) {\n const r = this.subMeshes[i];\n (t > 1 || !r.IsGlobal) && r.updateBoundingInfo(e);\n }\n return this;\n }\n /** @internal */\n _afterComputeWorldMatrix() {\n this.doNotSyncBoundingInfo || (this._boundingInfoIsDirty = !0);\n }\n /**\n * Returns `true` if the mesh is within the frustum defined by the passed array of planes.\n * A mesh is in the frustum if its bounding box intersects the frustum\n * @param frustumPlanes defines the frustum to test\n * @returns true if the mesh is in the frustum planes\n */\n isInFrustum(e) {\n return this.getBoundingInfo().isInFrustum(e, this.cullingStrategy);\n }\n /**\n * Returns `true` if the mesh is completely in the frustum defined be the passed array of planes.\n * A mesh is completely in the frustum if its bounding box it completely inside the frustum.\n * @param frustumPlanes defines the frustum to test\n * @returns true if the mesh is completely in the frustum planes\n */\n isCompletelyInFrustum(e) {\n return this.getBoundingInfo().isCompletelyInFrustum(e);\n }\n /**\n * True if the mesh intersects another mesh or a SolidParticle object\n * @param mesh defines a target mesh or SolidParticle to test\n * @param precise Unless the parameter `precise` is set to `true` the intersection is computed according to Axis Aligned Bounding Boxes (AABB), else according to OBB (Oriented BBoxes)\n * @param includeDescendants Can be set to true to test if the mesh defined in parameters intersects with the current mesh or any child meshes\n * @returns true if there is an intersection\n */\n intersectsMesh(e, t = !1, i) {\n const r = this.getBoundingInfo(), s = e.getBoundingInfo();\n if (r.intersects(s, t))\n return !0;\n if (i) {\n for (const a of this.getChildMeshes())\n if (a.intersectsMesh(e, t, !0))\n return !0;\n }\n return !1;\n }\n /**\n * Returns true if the passed point (Vector3) is inside the mesh bounding box\n * @param point defines the point to test\n * @returns true if there is an intersection\n */\n intersectsPoint(e) {\n return this.getBoundingInfo().intersectsPoint(e);\n }\n // Collisions\n /**\n * Gets or sets a boolean indicating that this mesh can be used in the collision engine\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\n */\n get checkCollisions() {\n return this._internalAbstractMeshDataInfo._meshCollisionData._checkCollisions;\n }\n set checkCollisions(e) {\n this._internalAbstractMeshDataInfo._meshCollisionData._checkCollisions = e;\n }\n /**\n * Gets Collider object used to compute collisions (not physics)\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\n */\n get collider() {\n return this._internalAbstractMeshDataInfo._meshCollisionData._collider;\n }\n /**\n * Move the mesh using collision engine\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\n * @param displacement defines the requested displacement vector\n * @returns the current mesh\n */\n moveWithCollisions(e) {\n this.getAbsolutePosition().addToRef(this.ellipsoidOffset, this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions);\n const i = this.getScene().collisionCoordinator;\n return this._internalAbstractMeshDataInfo._meshCollisionData._collider || (this._internalAbstractMeshDataInfo._meshCollisionData._collider = i.createCollider()), this._internalAbstractMeshDataInfo._meshCollisionData._collider._radius = this.ellipsoid, i.getNewPosition(this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions, e, this._internalAbstractMeshDataInfo._meshCollisionData._collider, this.collisionRetryCount, this, this._onCollisionPositionChange, this.uniqueId), this;\n }\n // Collisions\n /**\n * @internal\n */\n _collideForSubMesh(e, t, i) {\n var r;\n if (this._generatePointsArray(), !this._positions)\n return this;\n if (!e._lastColliderWorldVertices || !e._lastColliderTransformMatrix.equals(t)) {\n e._lastColliderTransformMatrix = t.clone(), e._lastColliderWorldVertices = [], e._trianglePlanes = [];\n const s = e.verticesStart, a = e.verticesStart + e.verticesCount;\n for (let o = s; o < a; o++)\n e._lastColliderWorldVertices.push(_.TransformCoordinates(this._positions[o], t));\n }\n return i._collide(e._trianglePlanes, e._lastColliderWorldVertices, this.getIndices(), e.indexStart, e.indexStart + e.indexCount, e.verticesStart, !!e.getMaterial(), this, this._shouldConvertRHS(), ((r = e.getMaterial()) == null ? void 0 : r.fillMode) === 7), this;\n }\n /**\n * @internal\n */\n _processCollisionsForSubMeshes(e, t) {\n const i = this._scene.getCollidingSubMeshCandidates(this, e), r = i.length;\n for (let s = 0; s < r; s++) {\n const a = i.data[s];\n r > 1 && !a._checkCollision(e) || this._collideForSubMesh(a, t, e);\n }\n return this;\n }\n /** @internal */\n _shouldConvertRHS() {\n return !1;\n }\n /**\n * @internal\n */\n _checkCollision(e) {\n if (!this.getBoundingInfo()._checkCollision(e))\n return this;\n const t = z.Matrix[0], i = z.Matrix[1];\n return L.ScalingToRef(1 / e._radius.x, 1 / e._radius.y, 1 / e._radius.z, t), this.worldMatrixFromCache.multiplyToRef(t, i), this._processCollisionsForSubMeshes(e, i), this;\n }\n // Picking\n /** @internal */\n _generatePointsArray() {\n return !1;\n }\n /**\n * Checks if the passed Ray intersects with the mesh. A mesh triangle can be picked both from its front and back sides,\n * irrespective of orientation.\n * @param ray defines the ray to use. It should be in the mesh's LOCAL coordinate space.\n * @param fastCheck defines if fast mode (but less precise) must be used (false by default)\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\n * @param worldToUse defines the world matrix to use to get the world coordinate of the intersection point\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\n * @returns the picking info\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\n */\n intersects(e, t, i, r = !1, s, a = !1) {\n const o = new ps(), l = this.getClassName(), c = l === \"InstancedLinesMesh\" || l === \"LinesMesh\" || l === \"GreasedLineMesh\" ? this.intersectionThreshold : 0, h = this.getBoundingInfo();\n if (!this.subMeshes || !a && (!e.intersectsSphere(h.boundingSphere, c) || !e.intersectsBox(h.boundingBox, c)))\n return o;\n if (r)\n return o.hit = !a, o.pickedMesh = a ? null : this, o.distance = a ? 0 : _.Distance(e.origin, h.boundingSphere.center), o.subMeshId = 0, o;\n if (!this._generatePointsArray())\n return o;\n let u = null;\n const f = this._scene.getIntersectingSubMeshCandidates(this, e), d = f.length;\n let p = !1;\n for (let g = 0; g < d; g++) {\n const v = f.data[g].getMaterial();\n if (v && (v.fillMode == 7 || v.fillMode == 0 || v.fillMode == 1 || v.fillMode == 2 || v.fillMode == 4)) {\n p = !0;\n break;\n }\n }\n if (!p)\n return o.hit = !0, o.pickedMesh = this, o.distance = _.Distance(e.origin, h.boundingSphere.center), o.subMeshId = -1, o;\n for (let g = 0; g < d; g++) {\n const m = f.data[g];\n if (d > 1 && !a && !m.canIntersects(e))\n continue;\n const v = m.intersects(e, this._positions, this.getIndices(), t, i);\n if (v && (t || !u || v.distance < u.distance) && (u = v, u.subMeshId = g, t))\n break;\n }\n if (u) {\n const g = s ?? this.getWorldMatrix(), m = z.Vector3[0], v = z.Vector3[1];\n _.TransformCoordinatesToRef(e.origin, g, m), e.direction.scaleToRef(u.distance, v);\n const C = _.TransformNormal(v, g).addInPlace(m);\n return o.hit = !0, o.distance = _.Distance(m, C), o.pickedPoint = C, o.pickedMesh = this, o.bu = u.bu || 0, o.bv = u.bv || 0, o.subMeshFaceId = u.faceId, o.faceId = u.faceId + f.data[u.subMeshId].indexStart / (this.getClassName().indexOf(\"LinesMesh\") !== -1 ? 2 : 3), o.subMeshId = u.subMeshId, o;\n }\n return o;\n }\n /**\n * Clones the current mesh\n * @param name defines the mesh name\n * @param newParent defines the new mesh parent\n * @param doNotCloneChildren defines a boolean indicating that children must not be cloned (false by default)\n * @returns the new mesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n clone(e, t, i) {\n return null;\n }\n /**\n * Disposes all the submeshes of the current meshnp\n * @returns the current mesh\n */\n releaseSubMeshes() {\n if (this.subMeshes)\n for (; this.subMeshes.length; )\n this.subMeshes[0].dispose();\n else\n this.subMeshes = [];\n return this;\n }\n /**\n * Releases resources associated with this abstract mesh.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n let i;\n const r = this.getScene();\n for (this._scene.useMaterialMeshMap && this._internalAbstractMeshDataInfo._material && this._internalAbstractMeshDataInfo._material.meshMap && (this._internalAbstractMeshDataInfo._material.meshMap[this.uniqueId] = void 0), r.freeActiveMeshes(), r.freeRenderingGroups(), r.renderingManager.maintainStateBetweenFrames && r.renderingManager.restoreDispachedFlags(), this.actionManager !== void 0 && this.actionManager !== null && (this._scene.meshes.some((o) => o !== this && o.actionManager === this.actionManager) || this.actionManager.dispose(), this.actionManager = null), this._internalAbstractMeshDataInfo._skeleton = null, this._transformMatrixTexture && (this._transformMatrixTexture.dispose(), this._transformMatrixTexture = null), i = 0; i < this._intersectionsInProgress.length; i++) {\n const o = this._intersectionsInProgress[i], l = o._intersectionsInProgress.indexOf(this);\n o._intersectionsInProgress.splice(l, 1);\n }\n this._intersectionsInProgress.length = 0, r.lights.forEach((o) => {\n let l = o.includedOnlyMeshes.indexOf(this);\n l !== -1 && o.includedOnlyMeshes.splice(l, 1), l = o.excludedMeshes.indexOf(this), l !== -1 && o.excludedMeshes.splice(l, 1);\n const c = o.getShadowGenerators();\n if (c) {\n const h = c.values();\n for (let u = h.next(); u.done !== !0; u = h.next()) {\n const d = u.value.getShadowMap();\n d && d.renderList && (l = d.renderList.indexOf(this), l !== -1 && d.renderList.splice(l, 1));\n }\n }\n }), (this.getClassName() !== \"InstancedMesh\" || this.getClassName() !== \"InstancedLinesMesh\") && this.releaseSubMeshes();\n const a = r.getEngine();\n if (this._occlusionQuery !== null && (this.isOcclusionQueryInProgress = !1, a.deleteQuery(this._occlusionQuery), this._occlusionQuery = null), a.wipeCaches(), r.removeMesh(this), this._parentContainer) {\n const o = this._parentContainer.meshes.indexOf(this);\n o > -1 && this._parentContainer.meshes.splice(o, 1), this._parentContainer = null;\n }\n if (t && this.material && (this.material.getClassName() === \"MultiMaterial\" ? this.material.dispose(!1, !0, !0) : this.material.dispose(!1, !0)), !e)\n for (i = 0; i < r.particleSystems.length; i++)\n r.particleSystems[i].emitter === this && (r.particleSystems[i].dispose(), i--);\n this._internalAbstractMeshDataInfo._facetData.facetDataEnabled && this.disableFacetData(), this._uniformBuffer.dispose(), this.onAfterWorldMatrixUpdateObservable.clear(), this.onCollideObservable.clear(), this.onCollisionPositionChangeObservable.clear(), this.onRebuildObservable.clear(), super.dispose(e, t);\n }\n /**\n * Adds the passed mesh as a child to the current mesh\n * @param mesh defines the child mesh\n * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.\n * @returns the current mesh\n */\n addChild(e, t = !1) {\n return e.setParent(this, t), this;\n }\n /**\n * Removes the passed mesh from the current mesh children list\n * @param mesh defines the child mesh\n * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.\n * @returns the current mesh\n */\n removeChild(e, t = !1) {\n return e.setParent(null, t), this;\n }\n // Facet data\n /** @internal */\n _initFacetData() {\n const e = this._internalAbstractMeshDataInfo._facetData;\n e.facetNormals || (e.facetNormals = []), e.facetPositions || (e.facetPositions = []), e.facetPartitioning || (e.facetPartitioning = new Array()), e.facetNb = this.getIndices().length / 3 | 0, e.partitioningSubdivisions = e.partitioningSubdivisions ? e.partitioningSubdivisions : 10, e.partitioningBBoxRatio = e.partitioningBBoxRatio ? e.partitioningBBoxRatio : 1.01;\n for (let t = 0; t < e.facetNb; t++)\n e.facetNormals[t] = _.Zero(), e.facetPositions[t] = _.Zero();\n return e.facetDataEnabled = !0, this;\n }\n /**\n * Updates the mesh facetData arrays and the internal partitioning when the mesh is morphed or updated.\n * This method can be called within the render loop.\n * You don't need to call this method by yourself in the render loop when you update/morph a mesh with the methods CreateXXX() as they automatically manage this computation\n * @returns the current mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n updateFacetData() {\n const e = this._internalAbstractMeshDataInfo._facetData;\n e.facetDataEnabled || this._initFacetData();\n const t = this.getVerticesData(I.PositionKind), i = this.getIndices(), r = this.getVerticesData(I.NormalKind), s = this.getBoundingInfo();\n if (e.facetDepthSort && !e.facetDepthSortEnabled) {\n if (e.facetDepthSortEnabled = !0, i instanceof Uint16Array)\n e.depthSortedIndices = new Uint16Array(i);\n else if (i instanceof Uint32Array)\n e.depthSortedIndices = new Uint32Array(i);\n else {\n let o = !1;\n for (let l = 0; l < i.length; l++)\n if (i[l] > 65535) {\n o = !0;\n break;\n }\n o ? e.depthSortedIndices = new Uint32Array(i) : e.depthSortedIndices = new Uint16Array(i);\n }\n if (e.facetDepthSortFunction = function(o, l) {\n return l.sqDistance - o.sqDistance;\n }, !e.facetDepthSortFrom) {\n const o = this.getScene().activeCamera;\n e.facetDepthSortFrom = o ? o.position : _.Zero();\n }\n e.depthSortedFacets = [];\n for (let o = 0; o < e.facetNb; o++) {\n const l = { ind: o * 3, sqDistance: 0 };\n e.depthSortedFacets.push(l);\n }\n e.invertedMatrix = L.Identity(), e.facetDepthSortOrigin = _.Zero();\n }\n e.bbSize.x = s.maximum.x - s.minimum.x > xt ? s.maximum.x - s.minimum.x : xt, e.bbSize.y = s.maximum.y - s.minimum.y > xt ? s.maximum.y - s.minimum.y : xt, e.bbSize.z = s.maximum.z - s.minimum.z > xt ? s.maximum.z - s.minimum.z : xt;\n let a = e.bbSize.x > e.bbSize.y ? e.bbSize.x : e.bbSize.y;\n if (a = a > e.bbSize.z ? a : e.bbSize.z, e.subDiv.max = e.partitioningSubdivisions, e.subDiv.X = Math.floor(e.subDiv.max * e.bbSize.x / a), e.subDiv.Y = Math.floor(e.subDiv.max * e.bbSize.y / a), e.subDiv.Z = Math.floor(e.subDiv.max * e.bbSize.z / a), e.subDiv.X = e.subDiv.X < 1 ? 1 : e.subDiv.X, e.subDiv.Y = e.subDiv.Y < 1 ? 1 : e.subDiv.Y, e.subDiv.Z = e.subDiv.Z < 1 ? 1 : e.subDiv.Z, e.facetParameters.facetNormals = this.getFacetLocalNormals(), e.facetParameters.facetPositions = this.getFacetLocalPositions(), e.facetParameters.facetPartitioning = this.getFacetLocalPartitioning(), e.facetParameters.bInfo = s, e.facetParameters.bbSize = e.bbSize, e.facetParameters.subDiv = e.subDiv, e.facetParameters.ratio = this.partitioningBBoxRatio, e.facetParameters.depthSort = e.facetDepthSort, e.facetDepthSort && e.facetDepthSortEnabled && (this.computeWorldMatrix(!0), this._worldMatrix.invertToRef(e.invertedMatrix), _.TransformCoordinatesToRef(e.facetDepthSortFrom, e.invertedMatrix, e.facetDepthSortOrigin), e.facetParameters.distanceTo = e.facetDepthSortOrigin), e.facetParameters.depthSortedFacets = e.depthSortedFacets, r && re.ComputeNormals(t, i, r, e.facetParameters), e.facetDepthSort && e.facetDepthSortEnabled) {\n e.depthSortedFacets.sort(e.facetDepthSortFunction);\n const o = e.depthSortedIndices.length / 3 | 0;\n for (let l = 0; l < o; l++) {\n const c = e.depthSortedFacets[l].ind;\n e.depthSortedIndices[l * 3] = i[c], e.depthSortedIndices[l * 3 + 1] = i[c + 1], e.depthSortedIndices[l * 3 + 2] = i[c + 2];\n }\n this.updateIndices(e.depthSortedIndices, void 0, !0);\n }\n return this;\n }\n /**\n * Returns the facetLocalNormals array.\n * The normals are expressed in the mesh local spac\n * @returns an array of Vector3\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetLocalNormals() {\n const e = this._internalAbstractMeshDataInfo._facetData;\n return e.facetNormals || this.updateFacetData(), e.facetNormals;\n }\n /**\n * Returns the facetLocalPositions array.\n * The facet positions are expressed in the mesh local space\n * @returns an array of Vector3\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetLocalPositions() {\n const e = this._internalAbstractMeshDataInfo._facetData;\n return e.facetPositions || this.updateFacetData(), e.facetPositions;\n }\n /**\n * Returns the facetLocalPartitioning array\n * @returns an array of array of numbers\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetLocalPartitioning() {\n const e = this._internalAbstractMeshDataInfo._facetData;\n return e.facetPartitioning || this.updateFacetData(), e.facetPartitioning;\n }\n /**\n * Returns the i-th facet position in the world system.\n * This method allocates a new Vector3 per call\n * @param i defines the facet index\n * @returns a new Vector3\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetPosition(e) {\n const t = _.Zero();\n return this.getFacetPositionToRef(e, t), t;\n }\n /**\n * Sets the reference Vector3 with the i-th facet position in the world system\n * @param i defines the facet index\n * @param ref defines the target vector\n * @returns the current mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetPositionToRef(e, t) {\n const i = this.getFacetLocalPositions()[e], r = this.getWorldMatrix();\n return _.TransformCoordinatesToRef(i, r, t), this;\n }\n /**\n * Returns the i-th facet normal in the world system.\n * This method allocates a new Vector3 per call\n * @param i defines the facet index\n * @returns a new Vector3\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetNormal(e) {\n const t = _.Zero();\n return this.getFacetNormalToRef(e, t), t;\n }\n /**\n * Sets the reference Vector3 with the i-th facet normal in the world system\n * @param i defines the facet index\n * @param ref defines the target vector\n * @returns the current mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetNormalToRef(e, t) {\n const i = this.getFacetLocalNormals()[e];\n return _.TransformNormalToRef(i, this.getWorldMatrix(), t), this;\n }\n /**\n * Returns the facets (in an array) in the same partitioning block than the one the passed coordinates are located (expressed in the mesh local system)\n * @param x defines x coordinate\n * @param y defines y coordinate\n * @param z defines z coordinate\n * @returns the array of facet indexes\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetsAtLocalCoordinates(e, t, i) {\n const r = this.getBoundingInfo(), s = this._internalAbstractMeshDataInfo._facetData, a = Math.floor((e - r.minimum.x * s.partitioningBBoxRatio) * s.subDiv.X * s.partitioningBBoxRatio / s.bbSize.x), o = Math.floor((t - r.minimum.y * s.partitioningBBoxRatio) * s.subDiv.Y * s.partitioningBBoxRatio / s.bbSize.y), l = Math.floor((i - r.minimum.z * s.partitioningBBoxRatio) * s.subDiv.Z * s.partitioningBBoxRatio / s.bbSize.z);\n return a < 0 || a > s.subDiv.max || o < 0 || o > s.subDiv.max || l < 0 || l > s.subDiv.max ? null : s.facetPartitioning[a + s.subDiv.max * o + s.subDiv.max * s.subDiv.max * l];\n }\n /**\n * Returns the closest mesh facet index at (x,y,z) World coordinates, null if not found\n * @param x defines x coordinate\n * @param y defines y coordinate\n * @param z defines z coordinate\n * @param projected sets as the (x,y,z) world projection on the facet\n * @param checkFace if true (default false), only the facet \"facing\" to (x,y,z) or only the ones \"turning their backs\", according to the parameter \"facing\" are returned\n * @param facing if facing and checkFace are true, only the facet \"facing\" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet \"turning their backs\" to (x, y, z) are returned : negative dot (x, y, z) * facet position\n * @returns the face index if found (or null instead)\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getClosestFacetAtCoordinates(e, t, i, r, s = !1, a = !0) {\n const o = this.getWorldMatrix(), l = z.Matrix[5];\n o.invertToRef(l);\n const c = z.Vector3[8];\n _.TransformCoordinatesFromFloatsToRef(e, t, i, l, c);\n const h = this.getClosestFacetAtLocalCoordinates(c.x, c.y, c.z, r, s, a);\n return r && _.TransformCoordinatesFromFloatsToRef(r.x, r.y, r.z, o, r), h;\n }\n /**\n * Returns the closest mesh facet index at (x,y,z) local coordinates, null if not found\n * @param x defines x coordinate\n * @param y defines y coordinate\n * @param z defines z coordinate\n * @param projected sets as the (x,y,z) local projection on the facet\n * @param checkFace if true (default false), only the facet \"facing\" to (x,y,z) or only the ones \"turning their backs\", according to the parameter \"facing\" are returned\n * @param facing if facing and checkFace are true, only the facet \"facing\" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet \"turning their backs\" to (x, y, z) are returned : negative dot (x, y, z) * facet position\n * @returns the face index if found (or null instead)\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getClosestFacetAtLocalCoordinates(e, t, i, r, s = !1, a = !0) {\n let o = null, l = 0, c = 0, h = 0, u = 0, f = 0, d = 0, p = 0, g = 0;\n const m = this.getFacetLocalPositions(), v = this.getFacetLocalNormals(), E = this.getFacetsAtLocalCoordinates(e, t, i);\n if (!E)\n return null;\n let C = Number.MAX_VALUE, T = C, R, x, S;\n for (let M = 0; M < E.length; M++)\n R = E[M], x = v[R], S = m[R], u = (e - S.x) * x.x + (t - S.y) * x.y + (i - S.z) * x.z, (!s || s && a && u >= 0 || s && !a && u <= 0) && (u = x.x * S.x + x.y * S.y + x.z * S.z, f = -(x.x * e + x.y * t + x.z * i - u) / (x.x * x.x + x.y * x.y + x.z * x.z), d = e + x.x * f, p = t + x.y * f, g = i + x.z * f, l = d - e, c = p - t, h = g - i, T = l * l + c * c + h * h, T < C && (C = T, o = R, r && (r.x = d, r.y = p, r.z = g)));\n return o;\n }\n /**\n * Returns the object \"parameter\" set with all the expected parameters for facetData computation by ComputeNormals()\n * @returns the parameters\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n getFacetDataParameters() {\n return this._internalAbstractMeshDataInfo._facetData.facetParameters;\n }\n /**\n * Disables the feature FacetData and frees the related memory\n * @returns the current mesh\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\n */\n disableFacetData() {\n const e = this._internalAbstractMeshDataInfo._facetData;\n return e.facetDataEnabled && (e.facetDataEnabled = !1, e.facetPositions = [], e.facetNormals = [], e.facetPartitioning = new Array(), e.facetParameters = null, e.depthSortedIndices = new Uint32Array(0)), this;\n }\n /**\n * Updates the AbstractMesh indices array\n * @param indices defines the data source\n * @param offset defines the offset in the index buffer where to store the new data (can be null)\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\n * @returns the current mesh\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n updateIndices(e, t, i = !1) {\n return this;\n }\n /**\n * Creates new normals data for the mesh\n * @param updatable defines if the normal vertex buffer must be flagged as updatable\n * @returns the current mesh\n */\n createNormals(e) {\n const t = this.getVerticesData(I.PositionKind), i = this.getIndices();\n let r;\n return this.isVerticesDataPresent(I.NormalKind) ? r = this.getVerticesData(I.NormalKind) : r = [], re.ComputeNormals(t, i, r, { useRightHandedSystem: this.getScene().useRightHandedSystem }), this.setVerticesData(I.NormalKind, r, e), this;\n }\n /**\n * Align the mesh with a normal\n * @param normal defines the normal to use\n * @param upDirection can be used to redefined the up vector to use (will use the (0, 1, 0) by default)\n * @returns the current mesh\n */\n alignWithNormal(e, t) {\n t || (t = Ko.Y);\n const i = z.Vector3[0], r = z.Vector3[1];\n return _.CrossToRef(t, e, r), _.CrossToRef(e, r, i), this.rotationQuaternion ? Ce.RotationQuaternionFromAxisToRef(i, e, r, this.rotationQuaternion) : _.RotationFromAxisToRef(i, e, r, this.rotation), this;\n }\n /** @internal */\n _checkOcclusionQuery() {\n return !1;\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Disables the mesh edge rendering mode\n * @returns the currentAbstractMesh\n */\n disableEdgesRendering() {\n throw We(\"EdgesRenderer\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Enables the edge rendering mode on the mesh.\n * This mode makes the mesh edges visible\n * @param epsilon defines the maximal distance between two angles to detect a face\n * @param checkVerticesInsteadOfIndices indicates that we should check vertex list directly instead of faces\n * @param options options to the edge renderer\n * @returns the currentAbstractMesh\n * @see https://www.babylonjs-playground.com/#19O9TU#0\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n enableEdgesRendering(e, t, i) {\n throw We(\"EdgesRenderer\");\n }\n /**\n * This function returns all of the particle systems in the scene that use the mesh as an emitter.\n * @returns an array of particle systems in the scene that use the mesh as an emitter\n */\n getConnectedParticleSystems() {\n return this._scene.particleSystems.filter((e) => e.emitter === this);\n }\n}\ner.OCCLUSION_TYPE_NONE = 0;\ner.OCCLUSION_TYPE_OPTIMISTIC = 1;\ner.OCCLUSION_TYPE_STRICT = 2;\ner.OCCLUSION_ALGORITHM_TYPE_ACCURATE = 0;\ner.OCCLUSION_ALGORITHM_TYPE_CONSERVATIVE = 1;\ner.CULLINGSTRATEGY_STANDARD = 0;\ner.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY = 1;\ner.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION = 2;\ner.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY = 3;\nRe(\"BABYLON.AbstractMesh\", er);\nObject.defineProperty(er.prototype, \"decalMap\", {\n get: function() {\n return this._decalMap;\n },\n set: function(n) {\n this._decalMap = n;\n },\n enumerable: !0,\n configurable: !0\n});\nclass ir {\n /**\n * Gets or sets a boolean indicating if entire scene must be loaded even if scene contains incremental data\n */\n static get ForceFullSceneLoadingForIncremental() {\n return ir._ForceFullSceneLoadingForIncremental;\n }\n static set ForceFullSceneLoadingForIncremental(e) {\n ir._ForceFullSceneLoadingForIncremental = e;\n }\n /**\n * Gets or sets a boolean indicating if loading screen must be displayed while loading a scene\n */\n static get ShowLoadingScreen() {\n return ir._ShowLoadingScreen;\n }\n static set ShowLoadingScreen(e) {\n ir._ShowLoadingScreen = e;\n }\n /**\n * Defines the current logging level (while loading the scene)\n * @ignorenaming\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static get loggingLevel() {\n return ir._LoggingLevel;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static set loggingLevel(e) {\n ir._LoggingLevel = e;\n }\n /**\n * Gets or set a boolean indicating if matrix weights must be cleaned upon loading\n */\n static get CleanBoneMatrixWeights() {\n return ir._CleanBoneMatrixWeights;\n }\n static set CleanBoneMatrixWeights(e) {\n ir._CleanBoneMatrixWeights = e;\n }\n}\nir._ForceFullSceneLoadingForIncremental = !1;\nir._ShowLoadingScreen = !0;\nir._CleanBoneMatrixWeights = !1;\nir._LoggingLevel = 0;\nclass nt {\n}\nnt.UseOpenGLOrientationForUV = !1;\nlet is = class na {\n /**\n * Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y\n */\n get boundingBias() {\n return this._boundingBias;\n }\n /**\n * Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y\n */\n set boundingBias(e) {\n this._boundingBias ? this._boundingBias.copyFrom(e) : this._boundingBias = e.clone(), this._updateBoundingInfo(!0, null);\n }\n /**\n * Static function used to attach a new empty geometry to a mesh\n * @param mesh defines the mesh to attach the geometry to\n * @returns the new Geometry\n */\n static CreateGeometryForMesh(e) {\n const t = new na(na.RandomId(), e.getScene());\n return t.applyToMesh(e), t;\n }\n /** Get the list of meshes using this geometry */\n get meshes() {\n return this._meshes;\n }\n /**\n * Creates a new geometry\n * @param id defines the unique ID\n * @param scene defines the hosting scene\n * @param vertexData defines the VertexData used to get geometry data\n * @param updatable defines if geometry must be updatable (false by default)\n * @param mesh defines the mesh that will be associated with the geometry\n */\n constructor(e, t, i, r = !1, s = null) {\n this.delayLoadState = 0, this._totalVertices = 0, this._isDisposed = !1, this._indexBufferIsUpdatable = !1, this._positionsCache = [], this._parentContainer = null, this.useBoundingInfoFromGeometry = !1, this._scene = t || st.LastCreatedScene, this._scene && (this.id = e, this.uniqueId = this._scene.getUniqueId(), this._engine = this._scene.getEngine(), this._meshes = [], this._vertexBuffers = {}, this._indices = [], this._updatable = r, i ? this.setAllVerticesData(i, r) : this._totalVertices = 0, this._engine.getCaps().vertexArrayObject && (this._vertexArrayObjects = {}), s && (this.applyToMesh(s), s.computeWorldMatrix(!0)));\n }\n /**\n * Gets the current extend of the geometry\n */\n get extend() {\n return this._extend;\n }\n /**\n * Gets the hosting scene\n * @returns the hosting Scene\n */\n getScene() {\n return this._scene;\n }\n /**\n * Gets the hosting engine\n * @returns the hosting Engine\n */\n getEngine() {\n return this._engine;\n }\n /**\n * Defines if the geometry is ready to use\n * @returns true if the geometry is ready to be used\n */\n isReady() {\n return this.delayLoadState === 1 || this.delayLoadState === 0;\n }\n /**\n * Gets a value indicating that the geometry should not be serialized\n */\n get doNotSerialize() {\n for (let e = 0; e < this._meshes.length; e++)\n if (!this._meshes[e].doNotSerialize)\n return !1;\n return !0;\n }\n /** @internal */\n _rebuild() {\n this._vertexArrayObjects && (this._vertexArrayObjects = {}), this._meshes.length !== 0 && this._indices && (this._indexBuffer = this._engine.createIndexBuffer(this._indices, this._updatable, \"Geometry_\" + this.id + \"_IndexBuffer\"));\n const e = /* @__PURE__ */ new Set();\n for (const t in this._vertexBuffers)\n e.add(this._vertexBuffers[t].getWrapperBuffer());\n e.forEach((t) => {\n t._rebuild();\n });\n }\n /**\n * Affects all geometry data in one call\n * @param vertexData defines the geometry data\n * @param updatable defines if the geometry must be flagged as updatable (false as default)\n */\n setAllVerticesData(e, t) {\n e.applyToGeometry(this, t), this._notifyUpdate();\n }\n /**\n * Set specific vertex data\n * @param kind defines the data kind (Position, normal, etc...)\n * @param data defines the vertex data to use\n * @param updatable defines if the vertex must be flagged as updatable (false as default)\n * @param stride defines the stride to use (0 by default). This value is deduced from the kind value if not specified\n */\n setVerticesData(e, t, i = !1, r) {\n i && Array.isArray(t) && (t = new Float32Array(t));\n const s = new I(this._engine, t, e, {\n updatable: i,\n postponeInternalCreation: this._meshes.length === 0,\n stride: r,\n label: \"Geometry_\" + this.id + \"_\" + e\n });\n this.setVerticesBuffer(s);\n }\n /**\n * Removes a specific vertex data\n * @param kind defines the data kind (Position, normal, etc...)\n */\n removeVerticesData(e) {\n this._vertexBuffers[e] && (this._vertexBuffers[e].dispose(), delete this._vertexBuffers[e]), this._vertexArrayObjects && this._disposeVertexArrayObjects();\n }\n /**\n * Affect a vertex buffer to the geometry. the vertexBuffer.getKind() function is used to determine where to store the data\n * @param buffer defines the vertex buffer to use\n * @param totalVertices defines the total number of vertices for position kind (could be null)\n * @param disposeExistingBuffer disposes the existing buffer, if any (default: true)\n */\n setVerticesBuffer(e, t = null, i = !0) {\n const r = e.getKind();\n this._vertexBuffers[r] && i && this._vertexBuffers[r].dispose(), e._buffer && e._buffer._increaseReferences(), this._vertexBuffers[r] = e;\n const s = this._meshes, a = s.length;\n if (r === I.PositionKind) {\n this._totalVertices = t ?? e._maxVerticesCount, this._updateExtend(e.getFloatData(this._totalVertices)), this._resetPointsArrayCache();\n const o = this._extend && this._extend.minimum || new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE), l = this._extend && this._extend.maximum || new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n for (let c = 0; c < a; c++) {\n const h = s[c];\n h.buildBoundingInfo(o, l), h._createGlobalSubMesh(h.isUnIndexed), h.computeWorldMatrix(!0), h.synchronizeInstances();\n }\n }\n this._notifyUpdate(r);\n }\n /**\n * Update a specific vertex buffer\n * This function will directly update the underlying DataBuffer according to the passed numeric array or Float32Array\n * It will do nothing if the buffer is not updatable\n * @param kind defines the data kind (Position, normal, etc...)\n * @param data defines the data to use\n * @param offset defines the offset in the target buffer where to store the data\n * @param useBytes set to true if the offset is in bytes\n */\n updateVerticesDataDirectly(e, t, i, r = !1) {\n const s = this.getVertexBuffer(e);\n s && (s.updateDirectly(t, i, r), this._notifyUpdate(e));\n }\n /**\n * Update a specific vertex buffer\n * This function will create a new buffer if the current one is not updatable\n * @param kind defines the data kind (Position, normal, etc...)\n * @param data defines the data to use\n * @param updateExtends defines if the geometry extends must be recomputed (false by default)\n */\n updateVerticesData(e, t, i = !1) {\n const r = this.getVertexBuffer(e);\n r && (r.update(t), e === I.PositionKind && this._updateBoundingInfo(i, t), this._notifyUpdate(e));\n }\n _updateBoundingInfo(e, t) {\n if (e && this._updateExtend(t), this._resetPointsArrayCache(), e) {\n const i = this._meshes;\n for (const r of i) {\n r.hasBoundingInfo ? r.getBoundingInfo().reConstruct(this._extend.minimum, this._extend.maximum) : r.buildBoundingInfo(this._extend.minimum, this._extend.maximum);\n const s = r.subMeshes;\n for (const a of s)\n a.refreshBoundingInfo();\n }\n }\n }\n /**\n * @internal\n */\n _bind(e, t, i, r) {\n if (!e)\n return;\n t === void 0 && (t = this._indexBuffer);\n const s = this.getVertexBuffers();\n if (!s)\n return;\n if (t != this._indexBuffer || !this._vertexArrayObjects && !r) {\n this._engine.bindBuffers(s, t, e, i);\n return;\n }\n const a = r || this._vertexArrayObjects;\n a[e.key] || (a[e.key] = this._engine.recordVertexArrayObject(s, t, e, i)), this._engine.bindVertexArrayObject(a[e.key], t);\n }\n /**\n * Gets total number of vertices\n * @returns the total number of vertices\n */\n getTotalVertices() {\n return this.isReady() ? this._totalVertices : 0;\n }\n /**\n * Gets a specific vertex data attached to this geometry. Float data is constructed if the vertex buffer data cannot be returned directly.\n * @param kind defines the data kind (Position, normal, etc...)\n * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\n * @returns a float array containing vertex data\n */\n getVerticesData(e, t, i) {\n const r = this.getVertexBuffer(e);\n return r ? r.getFloatData(this._totalVertices, i || t && this._meshes.length !== 1) : null;\n }\n /**\n * Returns a boolean defining if the vertex data for the requested `kind` is updatable\n * @param kind defines the data kind (Position, normal, etc...)\n * @returns true if the vertex buffer with the specified kind is updatable\n */\n isVertexBufferUpdatable(e) {\n const t = this._vertexBuffers[e];\n return t ? t.isUpdatable() : !1;\n }\n /**\n * Gets a specific vertex buffer\n * @param kind defines the data kind (Position, normal, etc...)\n * @returns a VertexBuffer\n */\n getVertexBuffer(e) {\n return this.isReady() ? this._vertexBuffers[e] : null;\n }\n /**\n * Returns all vertex buffers\n * @returns an object holding all vertex buffers indexed by kind\n */\n getVertexBuffers() {\n return this.isReady() ? this._vertexBuffers : null;\n }\n /**\n * Gets a boolean indicating if specific vertex buffer is present\n * @param kind defines the data kind (Position, normal, etc...)\n * @returns true if data is present\n */\n isVerticesDataPresent(e) {\n return this._vertexBuffers ? this._vertexBuffers[e] !== void 0 : this._delayInfo ? this._delayInfo.indexOf(e) !== -1 : !1;\n }\n /**\n * Gets a list of all attached data kinds (Position, normal, etc...)\n * @returns a list of string containing all kinds\n */\n getVerticesDataKinds() {\n const e = [];\n let t;\n if (!this._vertexBuffers && this._delayInfo)\n for (t in this._delayInfo)\n e.push(t);\n else\n for (t in this._vertexBuffers)\n e.push(t);\n return e;\n }\n /**\n * Update index buffer\n * @param indices defines the indices to store in the index buffer\n * @param offset defines the offset in the target buffer where to store the data\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\n */\n updateIndices(e, t, i = !1) {\n if (this._indexBuffer)\n if (!this._indexBufferIsUpdatable)\n this.setIndices(e, null, !0);\n else {\n const r = e.length !== this._indices.length;\n if (i || (this._indices = e.slice()), this._engine.updateDynamicIndexBuffer(this._indexBuffer, e, t), r)\n for (const s of this._meshes)\n s._createGlobalSubMesh(!0);\n }\n }\n /**\n * Sets the index buffer for this geometry.\n * @param indexBuffer Defines the index buffer to use for this geometry\n * @param totalVertices Defines the total number of vertices used by the buffer\n * @param totalIndices Defines the total number of indices in the index buffer\n */\n setIndexBuffer(e, t, i) {\n this._indices = [], this._indexBufferIsUpdatable = !1, this._indexBuffer = e, this._totalVertices = t, this._totalIndices = i, e.is32Bits || (e.is32Bits = this._totalIndices > 65535);\n for (const r of this._meshes)\n r._createGlobalSubMesh(!0), r.synchronizeInstances();\n this._notifyUpdate();\n }\n /**\n * Creates a new index buffer\n * @param indices defines the indices to store in the index buffer\n * @param totalVertices defines the total number of vertices (could be null)\n * @param updatable defines if the index buffer must be flagged as updatable (false by default)\n */\n setIndices(e, t = null, i = !1) {\n this._indexBuffer && this._engine._releaseBuffer(this._indexBuffer), this._indices = e, this._indexBufferIsUpdatable = i, this._meshes.length !== 0 && this._indices && (this._indexBuffer = this._engine.createIndexBuffer(this._indices, i, \"Geometry_\" + this.id + \"_IndexBuffer\")), t != null && (this._totalVertices = t);\n for (const r of this._meshes)\n r._createGlobalSubMesh(!0), r.synchronizeInstances();\n this._notifyUpdate();\n }\n /**\n * Return the total number of indices\n * @returns the total number of indices\n */\n getTotalIndices() {\n return this.isReady() ? this._totalIndices !== void 0 ? this._totalIndices : this._indices.length : 0;\n }\n /**\n * Gets the index buffer array\n * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\n * @returns the index buffer array\n */\n getIndices(e, t) {\n if (!this.isReady())\n return null;\n const i = this._indices;\n return !t && (!e || this._meshes.length === 1) ? i : i.slice();\n }\n /**\n * Gets the index buffer\n * @returns the index buffer\n */\n getIndexBuffer() {\n return this.isReady() ? this._indexBuffer : null;\n }\n /**\n * @internal\n */\n _releaseVertexArrayObject(e = null) {\n !e || !this._vertexArrayObjects || this._vertexArrayObjects[e.key] && (this._engine.releaseVertexArrayObject(this._vertexArrayObjects[e.key]), delete this._vertexArrayObjects[e.key]);\n }\n /**\n * Release the associated resources for a specific mesh\n * @param mesh defines the source mesh\n * @param shouldDispose defines if the geometry must be disposed if there is no more mesh pointing to it\n */\n releaseForMesh(e, t) {\n const i = this._meshes, r = i.indexOf(e);\n r !== -1 && (i.splice(r, 1), this._vertexArrayObjects && e._invalidateInstanceVertexArrayObject(), e._geometry = null, i.length === 0 && t && this.dispose());\n }\n /**\n * Apply current geometry to a given mesh\n * @param mesh defines the mesh to apply geometry to\n */\n applyToMesh(e) {\n if (e._geometry === this)\n return;\n const t = e._geometry;\n t && t.releaseForMesh(e), this._vertexArrayObjects && e._invalidateInstanceVertexArrayObject();\n const i = this._meshes;\n e._geometry = this, e._internalAbstractMeshDataInfo._positions = null, this._scene.pushGeometry(this), i.push(e), this.isReady() ? this._applyToMesh(e) : this._boundingInfo && e.setBoundingInfo(this._boundingInfo);\n }\n _updateExtend(e = null) {\n if (this.useBoundingInfoFromGeometry && this._boundingInfo)\n this._extend = {\n minimum: this._boundingInfo.minimum.clone(),\n maximum: this._boundingInfo.maximum.clone()\n };\n else {\n if (!e && (e = this.getVerticesData(I.PositionKind), !e))\n return;\n this._extend = _o(e, 0, this._totalVertices, this.boundingBias, 3);\n }\n }\n _applyToMesh(e) {\n const t = this._meshes.length;\n for (const i in this._vertexBuffers)\n t === 1 && this._vertexBuffers[i].create(), i === I.PositionKind && (this._extend || this._updateExtend(), e.buildBoundingInfo(this._extend.minimum, this._extend.maximum), e._createGlobalSubMesh(e.isUnIndexed), e._updateBoundingInfo());\n t === 1 && this._indices && this._indices.length > 0 && (this._indexBuffer = this._engine.createIndexBuffer(this._indices, this._updatable, \"Geometry_\" + this.id + \"_IndexBuffer\")), e._syncGeometryWithMorphTargetManager(), e.synchronizeInstances();\n }\n _notifyUpdate(e) {\n this.onGeometryUpdated && this.onGeometryUpdated(this, e), this._vertexArrayObjects && this._disposeVertexArrayObjects();\n for (const t of this._meshes)\n t._markSubMeshesAsAttributesDirty();\n }\n /**\n * Load the geometry if it was flagged as delay loaded\n * @param scene defines the hosting scene\n * @param onLoaded defines a callback called when the geometry is loaded\n */\n load(e, t) {\n if (this.delayLoadState !== 2) {\n if (this.isReady()) {\n t && t();\n return;\n }\n this.delayLoadState = 2, this._queueLoad(e, t);\n }\n }\n _queueLoad(e, t) {\n this.delayLoadingFile && (e.addPendingData(this), e._loadFile(this.delayLoadingFile, (i) => {\n if (!this._delayLoadingFunction)\n return;\n this._delayLoadingFunction(JSON.parse(i), this), this.delayLoadState = 1, this._delayInfo = [], e.removePendingData(this);\n const r = this._meshes, s = r.length;\n for (let a = 0; a < s; a++)\n this._applyToMesh(r[a]);\n t && t();\n }, void 0, !0));\n }\n /**\n * Invert the geometry to move from a right handed system to a left handed one.\n */\n toLeftHanded() {\n const e = this.getIndices(!1);\n if (e != null && e.length > 0) {\n for (let r = 0; r < e.length; r += 3) {\n const s = e[r + 0];\n e[r + 0] = e[r + 2], e[r + 2] = s;\n }\n this.setIndices(e);\n }\n const t = this.getVerticesData(I.PositionKind, !1);\n if (t != null && t.length > 0) {\n for (let r = 0; r < t.length; r += 3)\n t[r + 2] = -t[r + 2];\n this.setVerticesData(I.PositionKind, t, !1);\n }\n const i = this.getVerticesData(I.NormalKind, !1);\n if (i != null && i.length > 0) {\n for (let r = 0; r < i.length; r += 3)\n i[r + 2] = -i[r + 2];\n this.setVerticesData(I.NormalKind, i, !1);\n }\n }\n // Cache\n /** @internal */\n _resetPointsArrayCache() {\n this._positions = null;\n }\n /** @internal */\n _generatePointsArray() {\n if (this._positions)\n return !0;\n const e = this.getVerticesData(I.PositionKind);\n if (!e || e.length === 0)\n return !1;\n for (let t = this._positionsCache.length * 3, i = this._positionsCache.length; t < e.length; t += 3, ++i)\n this._positionsCache[i] = _.FromArray(e, t);\n for (let t = 0, i = 0; t < e.length; t += 3, ++i)\n this._positionsCache[i].set(e[0 + t], e[1 + t], e[2 + t]);\n return this._positionsCache.length = e.length / 3, this._positions = this._positionsCache, !0;\n }\n /**\n * Gets a value indicating if the geometry is disposed\n * @returns true if the geometry was disposed\n */\n isDisposed() {\n return this._isDisposed;\n }\n _disposeVertexArrayObjects() {\n if (this._vertexArrayObjects) {\n for (const i in this._vertexArrayObjects)\n this._engine.releaseVertexArrayObject(this._vertexArrayObjects[i]);\n this._vertexArrayObjects = {};\n const e = this._meshes, t = e.length;\n for (let i = 0; i < t; i++)\n e[i]._invalidateInstanceVertexArrayObject();\n }\n }\n /**\n * Free all associated resources\n */\n dispose() {\n const e = this._meshes, t = e.length;\n let i;\n for (i = 0; i < t; i++)\n this.releaseForMesh(e[i]);\n this._meshes.length = 0, this._disposeVertexArrayObjects();\n for (const r in this._vertexBuffers)\n this._vertexBuffers[r].dispose();\n if (this._vertexBuffers = {}, this._totalVertices = 0, this._indexBuffer && this._engine._releaseBuffer(this._indexBuffer), this._indexBuffer = null, this._indices = [], this.delayLoadState = 0, this.delayLoadingFile = null, this._delayLoadingFunction = null, this._delayInfo = [], this._boundingInfo = null, this._scene.removeGeometry(this), this._parentContainer) {\n const r = this._parentContainer.geometries.indexOf(this);\n r > -1 && this._parentContainer.geometries.splice(r, 1), this._parentContainer = null;\n }\n this._isDisposed = !0;\n }\n /**\n * Clone the current geometry into a new geometry\n * @param id defines the unique ID of the new geometry\n * @returns a new geometry object\n */\n copy(e) {\n const t = new re();\n t.indices = [];\n const i = this.getIndices();\n if (i)\n for (let l = 0; l < i.length; l++)\n t.indices.push(i[l]);\n let r = !1, s = !1, a;\n for (a in this._vertexBuffers) {\n const l = this.getVerticesData(a);\n if (l && (l instanceof Float32Array ? t.set(new Float32Array(l), a) : t.set(l.slice(0), a), !s)) {\n const c = this.getVertexBuffer(a);\n c && (r = c.isUpdatable(), s = !r);\n }\n }\n const o = new na(e, this._scene, t, r);\n o.delayLoadState = this.delayLoadState, o.delayLoadingFile = this.delayLoadingFile, o._delayLoadingFunction = this._delayLoadingFunction;\n for (a in this._delayInfo)\n o._delayInfo = o._delayInfo || [], o._delayInfo.push(a);\n return o._boundingInfo = new Cr(this._extend.minimum, this._extend.maximum), o;\n }\n /**\n * Serialize the current geometry info (and not the vertices data) into a JSON object\n * @returns a JSON representation of the current geometry data (without the vertices data)\n */\n serialize() {\n const e = {};\n return e.id = this.id, e.uniqueId = this.uniqueId, e.updatable = this._updatable, rt && rt.HasTags(this) && (e.tags = rt.GetTags(this)), e;\n }\n _toNumberArray(e) {\n return Array.isArray(e) ? e : Array.prototype.slice.call(e);\n }\n /**\n * Release any memory retained by the cached data on the Geometry.\n *\n * Call this function to reduce memory footprint of the mesh.\n * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly)\n */\n clearCachedData() {\n this._indices = [], this._resetPointsArrayCache();\n for (const e in this._vertexBuffers)\n Object.prototype.hasOwnProperty.call(this._vertexBuffers, e) && (this._vertexBuffers[e]._buffer._data = null);\n }\n /**\n * Serialize all vertices data into a JSON object\n * @returns a JSON representation of the current geometry data\n */\n serializeVerticeData() {\n const e = this.serialize();\n return this.isVerticesDataPresent(I.PositionKind) && (e.positions = this._toNumberArray(this.getVerticesData(I.PositionKind)), this.isVertexBufferUpdatable(I.PositionKind) && (e.positions._updatable = !0)), this.isVerticesDataPresent(I.NormalKind) && (e.normals = this._toNumberArray(this.getVerticesData(I.NormalKind)), this.isVertexBufferUpdatable(I.NormalKind) && (e.normals._updatable = !0)), this.isVerticesDataPresent(I.TangentKind) && (e.tangents = this._toNumberArray(this.getVerticesData(I.TangentKind)), this.isVertexBufferUpdatable(I.TangentKind) && (e.tangents._updatable = !0)), this.isVerticesDataPresent(I.UVKind) && (e.uvs = this._toNumberArray(this.getVerticesData(I.UVKind)), this.isVertexBufferUpdatable(I.UVKind) && (e.uvs._updatable = !0)), this.isVerticesDataPresent(I.UV2Kind) && (e.uvs2 = this._toNumberArray(this.getVerticesData(I.UV2Kind)), this.isVertexBufferUpdatable(I.UV2Kind) && (e.uvs2._updatable = !0)), this.isVerticesDataPresent(I.UV3Kind) && (e.uvs3 = this._toNumberArray(this.getVerticesData(I.UV3Kind)), this.isVertexBufferUpdatable(I.UV3Kind) && (e.uvs3._updatable = !0)), this.isVerticesDataPresent(I.UV4Kind) && (e.uvs4 = this._toNumberArray(this.getVerticesData(I.UV4Kind)), this.isVertexBufferUpdatable(I.UV4Kind) && (e.uvs4._updatable = !0)), this.isVerticesDataPresent(I.UV5Kind) && (e.uvs5 = this._toNumberArray(this.getVerticesData(I.UV5Kind)), this.isVertexBufferUpdatable(I.UV5Kind) && (e.uvs5._updatable = !0)), this.isVerticesDataPresent(I.UV6Kind) && (e.uvs6 = this._toNumberArray(this.getVerticesData(I.UV6Kind)), this.isVertexBufferUpdatable(I.UV6Kind) && (e.uvs6._updatable = !0)), this.isVerticesDataPresent(I.ColorKind) && (e.colors = this._toNumberArray(this.getVerticesData(I.ColorKind)), this.isVertexBufferUpdatable(I.ColorKind) && (e.colors._updatable = !0)), this.isVerticesDataPresent(I.MatricesIndicesKind) && (e.matricesIndices = this._toNumberArray(this.getVerticesData(I.MatricesIndicesKind)), e.matricesIndices._isExpanded = !0, this.isVertexBufferUpdatable(I.MatricesIndicesKind) && (e.matricesIndices._updatable = !0)), this.isVerticesDataPresent(I.MatricesWeightsKind) && (e.matricesWeights = this._toNumberArray(this.getVerticesData(I.MatricesWeightsKind)), this.isVertexBufferUpdatable(I.MatricesWeightsKind) && (e.matricesWeights._updatable = !0)), e.indices = this._toNumberArray(this.getIndices()), e;\n }\n // Statics\n /**\n * Extracts a clone of a mesh geometry\n * @param mesh defines the source mesh\n * @param id defines the unique ID of the new geometry object\n * @returns the new geometry object\n */\n static ExtractFromMesh(e, t) {\n const i = e._geometry;\n return i ? i.copy(t) : null;\n }\n /**\n * You should now use Tools.RandomId(), this method is still here for legacy reasons.\n * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523\n * Be aware Math.random() could cause collisions, but:\n * \"All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide\"\n * @returns a string containing a new GUID\n */\n static RandomId() {\n return ge.RandomId();\n }\n static _GetGeometryByLoadedUniqueId(e, t) {\n for (let i = 0; i < t.geometries.length; i++)\n if (t.geometries[i]._loadedUniqueId === e)\n return t.geometries[i];\n return null;\n }\n /**\n * @internal\n */\n static _ImportGeometry(e, t) {\n const i = t.getScene(), r = e.geometryUniqueId, s = e.geometryId;\n if (r || s) {\n const a = r ? this._GetGeometryByLoadedUniqueId(r, i) : i.getGeometryById(s);\n a && a.applyToMesh(t);\n } else if (e instanceof ArrayBuffer) {\n const a = t._binaryInfo;\n if (a.positionsAttrDesc && a.positionsAttrDesc.count > 0) {\n const o = new Float32Array(e, a.positionsAttrDesc.offset, a.positionsAttrDesc.count);\n t.setVerticesData(I.PositionKind, o, !1);\n }\n if (a.normalsAttrDesc && a.normalsAttrDesc.count > 0) {\n const o = new Float32Array(e, a.normalsAttrDesc.offset, a.normalsAttrDesc.count);\n t.setVerticesData(I.NormalKind, o, !1);\n }\n if (a.tangetsAttrDesc && a.tangetsAttrDesc.count > 0) {\n const o = new Float32Array(e, a.tangetsAttrDesc.offset, a.tangetsAttrDesc.count);\n t.setVerticesData(I.TangentKind, o, !1);\n }\n if (a.uvsAttrDesc && a.uvsAttrDesc.count > 0) {\n const o = new Float32Array(e, a.uvsAttrDesc.offset, a.uvsAttrDesc.count);\n if (nt.UseOpenGLOrientationForUV)\n for (let l = 1; l < o.length; l += 2)\n o[l] = 1 - o[l];\n t.setVerticesData(I.UVKind, o, !1);\n }\n if (a.uvs2AttrDesc && a.uvs2AttrDesc.count > 0) {\n const o = new Float32Array(e, a.uvs2AttrDesc.offset, a.uvs2AttrDesc.count);\n if (nt.UseOpenGLOrientationForUV)\n for (let l = 1; l < o.length; l += 2)\n o[l] = 1 - o[l];\n t.setVerticesData(I.UV2Kind, o, !1);\n }\n if (a.uvs3AttrDesc && a.uvs3AttrDesc.count > 0) {\n const o = new Float32Array(e, a.uvs3AttrDesc.offset, a.uvs3AttrDesc.count);\n if (nt.UseOpenGLOrientationForUV)\n for (let l = 1; l < o.length; l += 2)\n o[l] = 1 - o[l];\n t.setVerticesData(I.UV3Kind, o, !1);\n }\n if (a.uvs4AttrDesc && a.uvs4AttrDesc.count > 0) {\n const o = new Float32Array(e, a.uvs4AttrDesc.offset, a.uvs4AttrDesc.count);\n if (nt.UseOpenGLOrientationForUV)\n for (let l = 1; l < o.length; l += 2)\n o[l] = 1 - o[l];\n t.setVerticesData(I.UV4Kind, o, !1);\n }\n if (a.uvs5AttrDesc && a.uvs5AttrDesc.count > 0) {\n const o = new Float32Array(e, a.uvs5AttrDesc.offset, a.uvs5AttrDesc.count);\n if (nt.UseOpenGLOrientationForUV)\n for (let l = 1; l < o.length; l += 2)\n o[l] = 1 - o[l];\n t.setVerticesData(I.UV5Kind, o, !1);\n }\n if (a.uvs6AttrDesc && a.uvs6AttrDesc.count > 0) {\n const o = new Float32Array(e, a.uvs6AttrDesc.offset, a.uvs6AttrDesc.count);\n if (nt.UseOpenGLOrientationForUV)\n for (let l = 1; l < o.length; l += 2)\n o[l] = 1 - o[l];\n t.setVerticesData(I.UV6Kind, o, !1);\n }\n if (a.colorsAttrDesc && a.colorsAttrDesc.count > 0) {\n const o = new Float32Array(e, a.colorsAttrDesc.offset, a.colorsAttrDesc.count);\n t.setVerticesData(I.ColorKind, o, !1, a.colorsAttrDesc.stride);\n }\n if (a.matricesIndicesAttrDesc && a.matricesIndicesAttrDesc.count > 0) {\n const o = new Int32Array(e, a.matricesIndicesAttrDesc.offset, a.matricesIndicesAttrDesc.count), l = [];\n for (let c = 0; c < o.length; c++) {\n const h = o[c];\n l.push(h & 255), l.push((h & 65280) >> 8), l.push((h & 16711680) >> 16), l.push(h >> 24 & 255);\n }\n t.setVerticesData(I.MatricesIndicesKind, l, !1);\n }\n if (a.matricesIndicesExtraAttrDesc && a.matricesIndicesExtraAttrDesc.count > 0) {\n const o = new Int32Array(e, a.matricesIndicesExtraAttrDesc.offset, a.matricesIndicesExtraAttrDesc.count), l = [];\n for (let c = 0; c < o.length; c++) {\n const h = o[c];\n l.push(h & 255), l.push((h & 65280) >> 8), l.push((h & 16711680) >> 16), l.push(h >> 24 & 255);\n }\n t.setVerticesData(I.MatricesIndicesExtraKind, l, !1);\n }\n if (a.matricesWeightsAttrDesc && a.matricesWeightsAttrDesc.count > 0) {\n const o = new Float32Array(e, a.matricesWeightsAttrDesc.offset, a.matricesWeightsAttrDesc.count);\n t.setVerticesData(I.MatricesWeightsKind, o, !1);\n }\n if (a.indicesAttrDesc && a.indicesAttrDesc.count > 0) {\n const o = new Int32Array(e, a.indicesAttrDesc.offset, a.indicesAttrDesc.count);\n t.setIndices(o, null);\n }\n if (a.subMeshesAttrDesc && a.subMeshesAttrDesc.count > 0) {\n const o = new Int32Array(e, a.subMeshesAttrDesc.offset, a.subMeshesAttrDesc.count * 5);\n t.subMeshes = [];\n for (let l = 0; l < a.subMeshesAttrDesc.count; l++) {\n const c = o[l * 5 + 0], h = o[l * 5 + 1], u = o[l * 5 + 2], f = o[l * 5 + 3], d = o[l * 5 + 4];\n bi.AddToMesh(c, h, u, f, d, t);\n }\n }\n } else if (e.positions && e.normals && e.indices) {\n if (t.setVerticesData(I.PositionKind, e.positions, e.positions._updatable), t.setVerticesData(I.NormalKind, e.normals, e.normals._updatable), e.tangents && t.setVerticesData(I.TangentKind, e.tangents, e.tangents._updatable), e.uvs && t.setVerticesData(I.UVKind, e.uvs, e.uvs._updatable), e.uvs2 && t.setVerticesData(I.UV2Kind, e.uvs2, e.uvs2._updatable), e.uvs3 && t.setVerticesData(I.UV3Kind, e.uvs3, e.uvs3._updatable), e.uvs4 && t.setVerticesData(I.UV4Kind, e.uvs4, e.uvs4._updatable), e.uvs5 && t.setVerticesData(I.UV5Kind, e.uvs5, e.uvs5._updatable), e.uvs6 && t.setVerticesData(I.UV6Kind, e.uvs6, e.uvs6._updatable), e.colors && t.setVerticesData(I.ColorKind, et.CheckColors4(e.colors, e.positions.length / 3), e.colors._updatable), e.matricesIndices)\n if (e.matricesIndices._isExpanded)\n delete e.matricesIndices._isExpanded, t.setVerticesData(I.MatricesIndicesKind, e.matricesIndices, e.matricesIndices._updatable);\n else {\n const a = [];\n for (let o = 0; o < e.matricesIndices.length; o++) {\n const l = e.matricesIndices[o];\n a.push(l & 255), a.push((l & 65280) >> 8), a.push((l & 16711680) >> 16), a.push(l >> 24 & 255);\n }\n t.setVerticesData(I.MatricesIndicesKind, a, e.matricesIndices._updatable);\n }\n if (e.matricesIndicesExtra)\n if (e.matricesIndicesExtra._isExpanded)\n delete e.matricesIndices._isExpanded, t.setVerticesData(I.MatricesIndicesExtraKind, e.matricesIndicesExtra, e.matricesIndicesExtra._updatable);\n else {\n const a = [];\n for (let o = 0; o < e.matricesIndicesExtra.length; o++) {\n const l = e.matricesIndicesExtra[o];\n a.push(l & 255), a.push((l & 65280) >> 8), a.push((l & 16711680) >> 16), a.push(l >> 24 & 255);\n }\n t.setVerticesData(I.MatricesIndicesExtraKind, a, e.matricesIndicesExtra._updatable);\n }\n e.matricesWeights && (na._CleanMatricesWeights(e, t), t.setVerticesData(I.MatricesWeightsKind, e.matricesWeights, e.matricesWeights._updatable)), e.matricesWeightsExtra && t.setVerticesData(I.MatricesWeightsExtraKind, e.matricesWeightsExtra, e.matricesWeights._updatable), t.setIndices(e.indices, null);\n }\n if (e.subMeshes) {\n t.subMeshes = [];\n for (let a = 0; a < e.subMeshes.length; a++) {\n const o = e.subMeshes[a];\n bi.AddToMesh(o.materialIndex, o.verticesStart, o.verticesCount, o.indexStart, o.indexCount, t);\n }\n }\n t._shouldGenerateFlatShading && (t.convertToFlatShadedMesh(), t._shouldGenerateFlatShading = !1), t.computeWorldMatrix(!0), i.onMeshImportedObservable.notifyObservers(t);\n }\n static _CleanMatricesWeights(e, t) {\n if (!ir.CleanBoneMatrixWeights)\n return;\n let r = 0;\n if (e.skeletonId > -1) {\n const u = t.getScene().getLastSkeletonById(e.skeletonId);\n if (!u)\n return;\n r = u.bones.length;\n } else\n return;\n const s = t.getVerticesData(I.MatricesIndicesKind), a = t.getVerticesData(I.MatricesIndicesExtraKind), o = e.matricesWeights, l = e.matricesWeightsExtra, c = e.numBoneInfluencer, h = o.length;\n for (let u = 0; u < h; u += 4) {\n let f = 0, d = -1;\n for (let p = 0; p < 4; p++) {\n const g = o[u + p];\n f += g, g < 1e-3 && d < 0 && (d = p);\n }\n if (l)\n for (let p = 0; p < 4; p++) {\n const g = l[u + p];\n f += g, g < 1e-3 && d < 0 && (d = p + 4);\n }\n if ((d < 0 || d > c - 1) && (d = c - 1), f > 1e-3) {\n const p = 1 / f;\n for (let g = 0; g < 4; g++)\n o[u + g] *= p;\n if (l)\n for (let g = 0; g < 4; g++)\n l[u + g] *= p;\n } else\n d >= 4 ? (l[u + d - 4] = 1 - f, a[u + d - 4] = r) : (o[u + d] = 1 - f, s[u + d] = r);\n }\n t.setVerticesData(I.MatricesIndicesKind, s), e.matricesWeightsExtra && t.setVerticesData(I.MatricesIndicesExtraKind, a);\n }\n /**\n * Create a new geometry from persisted data (Using .babylon file format)\n * @param parsedVertexData defines the persisted data\n * @param scene defines the hosting scene\n * @param rootUrl defines the root url to use to load assets (like delayed data)\n * @returns the new geometry object\n */\n static Parse(e, t, i) {\n const r = new na(e.id, t, void 0, e.updatable);\n return r._loadedUniqueId = e.uniqueId, rt && rt.AddTagsTo(r, e.tags), e.delayLoadingFile ? (r.delayLoadState = 4, r.delayLoadingFile = i + e.delayLoadingFile, r._boundingInfo = new Cr(_.FromArray(e.boundingBoxMinimum), _.FromArray(e.boundingBoxMaximum)), r._delayInfo = [], e.hasUVs && r._delayInfo.push(I.UVKind), e.hasUVs2 && r._delayInfo.push(I.UV2Kind), e.hasUVs3 && r._delayInfo.push(I.UV3Kind), e.hasUVs4 && r._delayInfo.push(I.UV4Kind), e.hasUVs5 && r._delayInfo.push(I.UV5Kind), e.hasUVs6 && r._delayInfo.push(I.UV6Kind), e.hasColors && r._delayInfo.push(I.ColorKind), e.hasMatricesIndices && r._delayInfo.push(I.MatricesIndicesKind), e.hasMatricesWeights && r._delayInfo.push(I.MatricesWeightsKind), r._delayLoadingFunction = re.ImportVertexData) : re.ImportVertexData(e, r), t.pushGeometry(r, !0), r;\n }\n};\n`${ge._DefaultCdnUrl}`, `${ge._DefaultCdnUrl}`, `${ge._DefaultCdnUrl}`;\n`${ge._DefaultCdnUrl}`;\nclass Eo {\n /**\n * Creates a Viewport object located at (x, y) and sized (width, height)\n * @param x defines viewport left coordinate\n * @param y defines viewport top coordinate\n * @param width defines the viewport width\n * @param height defines the viewport height\n */\n constructor(e, t, i, r) {\n this.x = e, this.y = t, this.width = i, this.height = r;\n }\n /**\n * Creates a new viewport using absolute sizing (from 0-> width, 0-> height instead of 0->1)\n * @param renderWidth defines the rendering width\n * @param renderHeight defines the rendering height\n * @returns a new Viewport\n */\n toGlobal(e, t) {\n return new Eo(this.x * e, this.y * t, this.width * e, this.height * t);\n }\n /**\n * Stores absolute viewport value into a target viewport (from 0-> width, 0-> height instead of 0->1)\n * @param renderWidth defines the rendering width\n * @param renderHeight defines the rendering height\n * @param ref defines the target viewport\n * @returns the current viewport\n */\n toGlobalToRef(e, t, i) {\n return i.x = this.x * e, i.y = this.y * t, i.width = this.width * e, i.height = this.height * t, this;\n }\n /**\n * Returns a new Viewport copied from the current one\n * @returns a new Viewport\n */\n clone() {\n return new Eo(this.x, this.y, this.width, this.height);\n }\n}\nclass $e extends Ai {\n /**\n * Define the current local position of the camera in the scene\n */\n get position() {\n return this._position;\n }\n set position(e) {\n this._position = e;\n }\n /**\n * The vector the camera should consider as up.\n * (default is Vector3(0, 1, 0) aka Vector3.Up())\n */\n set upVector(e) {\n this._upVector = e;\n }\n get upVector() {\n return this._upVector;\n }\n /**\n * The screen area in scene units squared\n */\n get screenArea() {\n let e = 0, t = 0;\n if (this.mode === $e.PERSPECTIVE_CAMERA)\n this.fovMode === $e.FOVMODE_VERTICAL_FIXED ? (t = this.minZ * 2 * Math.tan(this.fov / 2), e = this.getEngine().getAspectRatio(this) * t) : (e = this.minZ * 2 * Math.tan(this.fov / 2), t = e / this.getEngine().getAspectRatio(this));\n else {\n const i = this.getEngine().getRenderWidth() / 2, r = this.getEngine().getRenderHeight() / 2;\n e = (this.orthoRight ?? i) - (this.orthoLeft ?? -i), t = (this.orthoTop ?? r) - (this.orthoBottom ?? -r);\n }\n return e * t;\n }\n /**\n * Define the current limit on the left side for an orthographic camera\n * In scene unit\n */\n set orthoLeft(e) {\n this._orthoLeft = e;\n for (const t of this._rigCameras)\n t.orthoLeft = e;\n }\n get orthoLeft() {\n return this._orthoLeft;\n }\n /**\n * Define the current limit on the right side for an orthographic camera\n * In scene unit\n */\n set orthoRight(e) {\n this._orthoRight = e;\n for (const t of this._rigCameras)\n t.orthoRight = e;\n }\n get orthoRight() {\n return this._orthoRight;\n }\n /**\n * Define the current limit on the bottom side for an orthographic camera\n * In scene unit\n */\n set orthoBottom(e) {\n this._orthoBottom = e;\n for (const t of this._rigCameras)\n t.orthoBottom = e;\n }\n get orthoBottom() {\n return this._orthoBottom;\n }\n /**\n * Define the current limit on the top side for an orthographic camera\n * In scene unit\n */\n set orthoTop(e) {\n this._orthoTop = e;\n for (const t of this._rigCameras)\n t.orthoTop = e;\n }\n get orthoTop() {\n return this._orthoTop;\n }\n /**\n * Define the mode of the camera (Camera.PERSPECTIVE_CAMERA or Camera.ORTHOGRAPHIC_CAMERA)\n */\n set mode(e) {\n this._mode = e;\n for (const t of this._rigCameras)\n t.mode = e;\n }\n get mode() {\n return this._mode;\n }\n /**\n * Gets a flag indicating that the camera has moved in some way since the last call to Camera.update()\n */\n get hasMoved() {\n return this._hasMoved;\n }\n /**\n * Instantiates a new camera object.\n * This should not be used directly but through the inherited cameras: ArcRotate, Free...\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras\n * @param name Defines the name of the camera in the scene\n * @param position Defines the position of the camera\n * @param scene Defines the scene the camera belongs too\n * @param setActiveOnSceneIfNoneActive Defines if the camera should be set as active after creation if no other camera have been defined in the scene\n */\n constructor(e, t, i, r = !0) {\n super(e, i), this._position = _.Zero(), this._upVector = _.Up(), this.oblique = null, this._orthoLeft = null, this._orthoRight = null, this._orthoBottom = null, this._orthoTop = null, this.fov = 0.8, this.projectionPlaneTilt = 0, this.minZ = 1, this.maxZ = 1e4, this.inertia = 0.9, this._mode = $e.PERSPECTIVE_CAMERA, this.isIntermediate = !1, this.viewport = new Eo(0, 0, 1, 1), this.layerMask = 268435455, this.fovMode = $e.FOVMODE_VERTICAL_FIXED, this.cameraRigMode = $e.RIG_MODE_NONE, this.customRenderTargets = [], this.outputRenderTarget = null, this.onViewMatrixChangedObservable = new he(), this.onProjectionMatrixChangedObservable = new he(), this.onAfterCheckInputsObservable = new he(), this.onRestoreStateObservable = new he(), this.isRigCamera = !1, this._hasMoved = !1, this._rigCameras = new Array(), this._skipRendering = !1, this._projectionMatrix = new L(), this._postProcesses = new Array(), this._activeMeshes = new Li(256), this._globalPosition = _.Zero(), this._computedViewMatrix = L.Identity(), this._doNotComputeProjectionMatrix = !1, this._transformMatrix = L.Zero(), this._refreshFrustumPlanes = !0, this._absoluteRotation = Ce.Identity(), this._isCamera = !0, this._isLeftCamera = !1, this._isRightCamera = !1, this.getScene().addCamera(this), r && !this.getScene().activeCamera && (this.getScene().activeCamera = this), this.position = t, this.renderPassId = this.getScene().getEngine().createRenderPassId(`Camera ${e}`);\n }\n /**\n * Store current camera state (fov, position, etc..)\n * @returns the camera\n */\n storeState() {\n return this._stateStored = !0, this._storedFov = this.fov, this;\n }\n /**\n * Restores the camera state values if it has been stored. You must call storeState() first\n * @returns true if restored and false otherwise\n */\n _restoreStateValues() {\n return this._stateStored ? (this.fov = this._storedFov, !0) : !1;\n }\n /**\n * Restored camera state. You must call storeState() first.\n * @returns true if restored and false otherwise\n */\n restoreState() {\n return this._restoreStateValues() ? (this.onRestoreStateObservable.notifyObservers(this), !0) : !1;\n }\n /**\n * Gets the class name of the camera.\n * @returns the class name\n */\n getClassName() {\n return \"Camera\";\n }\n /**\n * Gets a string representation of the camera useful for debug purpose.\n * @param fullDetails Defines that a more verbose level of logging is required\n * @returns the string representation\n */\n toString(e) {\n let t = \"Name: \" + this.name;\n if (t += \", type: \" + this.getClassName(), this.animations)\n for (let i = 0; i < this.animations.length; i++)\n t += \", animation[0]: \" + this.animations[i].toString(e);\n return t;\n }\n /**\n * Automatically tilts the projection plane, using `projectionPlaneTilt`, to correct the perspective effect on vertical lines.\n */\n applyVerticalCorrection() {\n const e = this.absoluteRotation.toEulerAngles();\n this.projectionPlaneTilt = this._scene.useRightHandedSystem ? -e.x : e.x;\n }\n /**\n * Gets the current world space position of the camera.\n */\n get globalPosition() {\n return this._globalPosition;\n }\n /**\n * Gets the list of active meshes this frame (meshes no culled or excluded by lod s in the frame)\n * @returns the active meshe list\n */\n getActiveMeshes() {\n return this._activeMeshes;\n }\n /**\n * Check whether a mesh is part of the current active mesh list of the camera\n * @param mesh Defines the mesh to check\n * @returns true if active, false otherwise\n */\n isActiveMesh(e) {\n return this._activeMeshes.indexOf(e) !== -1;\n }\n /**\n * Is this camera ready to be used/rendered\n * @param completeCheck defines if a complete check (including post processes) has to be done (false by default)\n * @returns true if the camera is ready\n */\n isReady(e = !1) {\n if (e) {\n for (const t of this._postProcesses)\n if (t && !t.isReady())\n return !1;\n }\n return super.isReady(e);\n }\n /** @internal */\n _initCache() {\n super._initCache(), this._cache.position = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), this._cache.upVector = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), this._cache.mode = void 0, this._cache.minZ = void 0, this._cache.maxZ = void 0, this._cache.fov = void 0, this._cache.fovMode = void 0, this._cache.aspectRatio = void 0, this._cache.orthoLeft = void 0, this._cache.orthoRight = void 0, this._cache.orthoBottom = void 0, this._cache.orthoTop = void 0, this._cache.obliqueAngle = void 0, this._cache.obliqueLength = void 0, this._cache.obliqueOffset = void 0, this._cache.renderWidth = void 0, this._cache.renderHeight = void 0;\n }\n /**\n * @internal\n */\n _updateCache(e) {\n e || super._updateCache(), this._cache.position.copyFrom(this.position), this._cache.upVector.copyFrom(this.upVector);\n }\n /** @internal */\n _isSynchronized() {\n return this._isSynchronizedViewMatrix() && this._isSynchronizedProjectionMatrix();\n }\n /** @internal */\n _isSynchronizedViewMatrix() {\n return super._isSynchronized() ? this._cache.position.equals(this.position) && this._cache.upVector.equals(this.upVector) && this.isSynchronizedWithParent() : !1;\n }\n /** @internal */\n _isSynchronizedProjectionMatrix() {\n let e = this._cache.mode === this.mode && this._cache.minZ === this.minZ && this._cache.maxZ === this.maxZ;\n if (!e)\n return !1;\n const t = this.getEngine();\n return this.mode === $e.PERSPECTIVE_CAMERA ? e = this._cache.fov === this.fov && this._cache.fovMode === this.fovMode && this._cache.aspectRatio === t.getAspectRatio(this) && this._cache.projectionPlaneTilt === this.projectionPlaneTilt : (e = this._cache.orthoLeft === this.orthoLeft && this._cache.orthoRight === this.orthoRight && this._cache.orthoBottom === this.orthoBottom && this._cache.orthoTop === this.orthoTop && this._cache.renderWidth === t.getRenderWidth() && this._cache.renderHeight === t.getRenderHeight(), this.oblique && (e = e && this._cache.obliqueAngle === this.oblique.angle && this._cache.obliqueLength === this.oblique.length && this._cache.obliqueOffset === this.oblique.offset)), e;\n }\n /**\n * Attach the input controls to a specific dom element to get the input from.\n * This function is here because typescript removes the typing of the last function.\n * @param _ignored defines an ignored parameter kept for backward compatibility.\n * @param _noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\n */\n attachControl(e, t) {\n }\n /**\n * Detach the current controls from the specified dom element.\n * This function is here because typescript removes the typing of the last function.\n * @param _ignored defines an ignored parameter kept for backward compatibility.\n */\n detachControl(e) {\n }\n /**\n * Update the camera state according to the different inputs gathered during the frame.\n */\n update() {\n this._hasMoved = !1, this._checkInputs(), this.cameraRigMode !== $e.RIG_MODE_NONE && this._updateRigCameras(), this.getViewMatrix(), this.getProjectionMatrix();\n }\n /** @internal */\n _checkInputs() {\n this.onAfterCheckInputsObservable.notifyObservers(this);\n }\n /** @internal */\n get rigCameras() {\n return this._rigCameras;\n }\n /**\n * Gets the post process used by the rig cameras\n */\n get rigPostProcess() {\n return this._rigPostProcess;\n }\n /**\n * Internal, gets the first post process.\n * @returns the first post process to be run on this camera.\n */\n _getFirstPostProcess() {\n for (let e = 0; e < this._postProcesses.length; e++)\n if (this._postProcesses[e] !== null)\n return this._postProcesses[e];\n return null;\n }\n _cascadePostProcessesToRigCams() {\n const e = this._getFirstPostProcess();\n e && e.markTextureDirty();\n for (let t = 0, i = this._rigCameras.length; t < i; t++) {\n const r = this._rigCameras[t], s = r._rigPostProcess;\n s ? (s.getEffectName() === \"pass\" && (r.isIntermediate = this._postProcesses.length === 0), r._postProcesses = this._postProcesses.slice(0).concat(s), s.markTextureDirty()) : r._postProcesses = this._postProcesses.slice(0);\n }\n }\n /**\n * Attach a post process to the camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#attach-postprocess\n * @param postProcess The post process to attach to the camera\n * @param insertAt The position of the post process in case several of them are in use in the scene\n * @returns the position the post process has been inserted at\n */\n attachPostProcess(e, t = null) {\n return !e.isReusable() && this._postProcesses.indexOf(e) > -1 ? (ne.Error(\"You're trying to reuse a post process not defined as reusable.\"), 0) : (t == null || t < 0 ? this._postProcesses.push(e) : this._postProcesses[t] === null ? this._postProcesses[t] = e : this._postProcesses.splice(t, 0, e), this._cascadePostProcessesToRigCams(), this._scene.prePassRenderer && this._scene.prePassRenderer.markAsDirty(), this._postProcesses.indexOf(e));\n }\n /**\n * Detach a post process to the camera.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#attach-postprocess\n * @param postProcess The post process to detach from the camera\n */\n detachPostProcess(e) {\n const t = this._postProcesses.indexOf(e);\n t !== -1 && (this._postProcesses[t] = null), this._scene.prePassRenderer && this._scene.prePassRenderer.markAsDirty(), this._cascadePostProcessesToRigCams();\n }\n /**\n * Gets the current world matrix of the camera\n * @returns the world matrix\n */\n getWorldMatrix() {\n return this._isSynchronizedViewMatrix() ? this._worldMatrix : (this.getViewMatrix(), this._worldMatrix);\n }\n /** @internal */\n _getViewMatrix() {\n return L.Identity();\n }\n /**\n * Gets the current view matrix of the camera.\n * @param force forces the camera to recompute the matrix without looking at the cached state\n * @returns the view matrix\n */\n getViewMatrix(e) {\n return !e && this._isSynchronizedViewMatrix() ? this._computedViewMatrix : (this._hasMoved = !0, this.updateCache(), this._computedViewMatrix = this._getViewMatrix(), this._currentRenderId = this.getScene().getRenderId(), this._childUpdateId++, this._refreshFrustumPlanes = !0, this._cameraRigParams && this._cameraRigParams.vrPreViewMatrix && this._computedViewMatrix.multiplyToRef(this._cameraRigParams.vrPreViewMatrix, this._computedViewMatrix), this.parent && this.parent.onViewMatrixChangedObservable && this.parent.onViewMatrixChangedObservable.notifyObservers(this.parent), this.onViewMatrixChangedObservable.notifyObservers(this), this._computedViewMatrix.invertToRef(this._worldMatrix), this._computedViewMatrix);\n }\n /**\n * Freeze the projection matrix.\n * It will prevent the cache check of the camera projection compute and can speed up perf\n * if no parameter of the camera are meant to change\n * @param projection Defines manually a projection if necessary\n */\n freezeProjectionMatrix(e) {\n this._doNotComputeProjectionMatrix = !0, e !== void 0 && (this._projectionMatrix = e);\n }\n /**\n * Unfreeze the projection matrix if it has previously been freezed by freezeProjectionMatrix.\n */\n unfreezeProjectionMatrix() {\n this._doNotComputeProjectionMatrix = !1;\n }\n /**\n * Gets the current projection matrix of the camera.\n * @param force forces the camera to recompute the matrix without looking at the cached state\n * @returns the projection matrix\n */\n getProjectionMatrix(e) {\n var s, a, o;\n if (this._doNotComputeProjectionMatrix || !e && this._isSynchronizedProjectionMatrix())\n return this._projectionMatrix;\n this._cache.mode = this.mode, this._cache.minZ = this.minZ, this._cache.maxZ = this.maxZ, this._refreshFrustumPlanes = !0;\n const t = this.getEngine(), i = this.getScene(), r = t.useReverseDepthBuffer;\n if (this.mode === $e.PERSPECTIVE_CAMERA) {\n this._cache.fov = this.fov, this._cache.fovMode = this.fovMode, this._cache.aspectRatio = t.getAspectRatio(this), this._cache.projectionPlaneTilt = this.projectionPlaneTilt, this.minZ <= 0 && (this.minZ = 0.1);\n let l;\n i.useRightHandedSystem ? l = L.PerspectiveFovRHToRef : l = L.PerspectiveFovLHToRef, l(this.fov, t.getAspectRatio(this), r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this._projectionMatrix, this.fovMode === $e.FOVMODE_VERTICAL_FIXED, t.isNDCHalfZRange, this.projectionPlaneTilt, r);\n } else {\n const l = t.getRenderWidth() / 2, c = t.getRenderHeight() / 2;\n i.useRightHandedSystem ? this.oblique ? L.ObliqueOffCenterRHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this.oblique.length, this.oblique.angle, this._computeObliqueDistance(this.oblique.offset), this._projectionMatrix, t.isNDCHalfZRange) : L.OrthoOffCenterRHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this._projectionMatrix, t.isNDCHalfZRange) : this.oblique ? L.ObliqueOffCenterLHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this.oblique.length, this.oblique.angle, this._computeObliqueDistance(this.oblique.offset), this._projectionMatrix, t.isNDCHalfZRange) : L.OrthoOffCenterLHToRef(this.orthoLeft ?? -l, this.orthoRight ?? l, this.orthoBottom ?? -c, this.orthoTop ?? c, r ? this.maxZ : this.minZ, r ? this.minZ : this.maxZ, this._projectionMatrix, t.isNDCHalfZRange), this._cache.orthoLeft = this.orthoLeft, this._cache.orthoRight = this.orthoRight, this._cache.orthoBottom = this.orthoBottom, this._cache.orthoTop = this.orthoTop, this._cache.obliqueAngle = (s = this.oblique) == null ? void 0 : s.angle, this._cache.obliqueLength = (a = this.oblique) == null ? void 0 : a.length, this._cache.obliqueOffset = (o = this.oblique) == null ? void 0 : o.offset, this._cache.renderWidth = t.getRenderWidth(), this._cache.renderHeight = t.getRenderHeight();\n }\n return this.onProjectionMatrixChangedObservable.notifyObservers(this), this._projectionMatrix;\n }\n /**\n * Gets the transformation matrix (ie. the multiplication of view by projection matrices)\n * @returns a Matrix\n */\n getTransformationMatrix() {\n return this._computedViewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix), this._transformMatrix;\n }\n _computeObliqueDistance(e) {\n const t = this, i = this;\n return (t.radius || (i.target ? _.Distance(this.position, i.target) : this.position.length())) + e;\n }\n _updateFrustumPlanes() {\n this._refreshFrustumPlanes && (this.getTransformationMatrix(), this._frustumPlanes ? Or.GetPlanesToRef(this._transformMatrix, this._frustumPlanes) : this._frustumPlanes = Or.GetPlanes(this._transformMatrix), this._refreshFrustumPlanes = !1);\n }\n /**\n * Checks if a cullable object (mesh...) is in the camera frustum\n * This checks the bounding box center. See isCompletelyInFrustum for a full bounding check\n * @param target The object to check\n * @param checkRigCameras If the rig cameras should be checked (eg. with VR camera both eyes should be checked) (Default: false)\n * @returns true if the object is in frustum otherwise false\n */\n isInFrustum(e, t = !1) {\n if (this._updateFrustumPlanes(), t && this.rigCameras.length > 0) {\n let i = !1;\n return this.rigCameras.forEach((r) => {\n r._updateFrustumPlanes(), i = i || e.isInFrustum(r._frustumPlanes);\n }), i;\n } else\n return e.isInFrustum(this._frustumPlanes);\n }\n /**\n * Checks if a cullable object (mesh...) is in the camera frustum\n * Unlike isInFrustum this checks the full bounding box\n * @param target The object to check\n * @returns true if the object is in frustum otherwise false\n */\n isCompletelyInFrustum(e) {\n return this._updateFrustumPlanes(), e.isCompletelyInFrustum(this._frustumPlanes);\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Gets a ray in the forward direction from the camera.\n * @param length Defines the length of the ray to create\n * @param transform Defines the transform to apply to the ray, by default the world matrix is used to create a workd space ray\n * @param origin Defines the start point of the ray which defaults to the camera position\n * @returns the forward ray\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getForwardRay(e = 100, t, i) {\n throw We(\"Ray\");\n }\n // eslint-disable-next-line jsdoc/require-returns-check\n /**\n * Gets a ray in the forward direction from the camera.\n * @param refRay the ray to (re)use when setting the values\n * @param length Defines the length of the ray to create\n * @param transform Defines the transform to apply to the ray, by default the world matrx is used to create a workd space ray\n * @param origin Defines the start point of the ray which defaults to the camera position\n * @returns the forward ray\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getForwardRayToRef(e, t = 100, i, r) {\n throw We(\"Ray\");\n }\n /**\n * Releases resources associated with this node.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n for (this.onViewMatrixChangedObservable.clear(), this.onProjectionMatrixChangedObservable.clear(), this.onAfterCheckInputsObservable.clear(), this.onRestoreStateObservable.clear(), this.inputs && this.inputs.clear(), this.getScene().stopAnimation(this), this.getScene().removeCamera(this); this._rigCameras.length > 0; ) {\n const r = this._rigCameras.pop();\n r && r.dispose();\n }\n if (this._parentContainer) {\n const r = this._parentContainer.cameras.indexOf(this);\n r > -1 && this._parentContainer.cameras.splice(r, 1), this._parentContainer = null;\n }\n if (this._rigPostProcess)\n this._rigPostProcess.dispose(this), this._rigPostProcess = null, this._postProcesses.length = 0;\n else if (this.cameraRigMode !== $e.RIG_MODE_NONE)\n this._rigPostProcess = null, this._postProcesses.length = 0;\n else {\n let r = this._postProcesses.length;\n for (; --r >= 0; ) {\n const s = this._postProcesses[r];\n s && s.dispose(this);\n }\n }\n let i = this.customRenderTargets.length;\n for (; --i >= 0; )\n this.customRenderTargets[i].dispose();\n this.customRenderTargets.length = 0, this._activeMeshes.dispose(), this.getScene().getEngine().releaseRenderPassId(this.renderPassId), super.dispose(e, t);\n }\n /**\n * Gets the left camera of a rig setup in case of Rigged Camera\n */\n get isLeftCamera() {\n return this._isLeftCamera;\n }\n /**\n * Gets the right camera of a rig setup in case of Rigged Camera\n */\n get isRightCamera() {\n return this._isRightCamera;\n }\n /**\n * Gets the left camera of a rig setup in case of Rigged Camera\n */\n get leftCamera() {\n return this._rigCameras.length < 1 ? null : this._rigCameras[0];\n }\n /**\n * Gets the right camera of a rig setup in case of Rigged Camera\n */\n get rightCamera() {\n return this._rigCameras.length < 2 ? null : this._rigCameras[1];\n }\n /**\n * Gets the left camera target of a rig setup in case of Rigged Camera\n * @returns the target position\n */\n getLeftTarget() {\n return this._rigCameras.length < 1 ? null : this._rigCameras[0].getTarget();\n }\n /**\n * Gets the right camera target of a rig setup in case of Rigged Camera\n * @returns the target position\n */\n getRightTarget() {\n return this._rigCameras.length < 2 ? null : this._rigCameras[1].getTarget();\n }\n /**\n * @internal\n */\n setCameraRigMode(e, t) {\n if (this.cameraRigMode !== e) {\n for (; this._rigCameras.length > 0; ) {\n const i = this._rigCameras.pop();\n i && i.dispose();\n }\n if (this.cameraRigMode = e, this._cameraRigParams = {}, this._cameraRigParams.interaxialDistance = t.interaxialDistance || 0.0637, this._cameraRigParams.stereoHalfAngle = ge.ToRadians(this._cameraRigParams.interaxialDistance / 0.0637), this.cameraRigMode !== $e.RIG_MODE_NONE) {\n const i = this.createRigCamera(this.name + \"_L\", 0);\n i && (i._isLeftCamera = !0);\n const r = this.createRigCamera(this.name + \"_R\", 1);\n r && (r._isRightCamera = !0), i && r && (this._rigCameras.push(i), this._rigCameras.push(r));\n }\n this._setRigMode(t), this._cascadePostProcessesToRigCams(), this.update();\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _setRigMode(e) {\n }\n /** @internal */\n _getVRProjectionMatrix() {\n return L.PerspectiveFovLHToRef(this._cameraRigParams.vrMetrics.aspectRatioFov, this._cameraRigParams.vrMetrics.aspectRatio, this.minZ, this.maxZ, this._cameraRigParams.vrWorkMatrix, !0, this.getEngine().isNDCHalfZRange), this._cameraRigParams.vrWorkMatrix.multiplyToRef(this._cameraRigParams.vrHMatrix, this._projectionMatrix), this._projectionMatrix;\n }\n /**\n * @internal\n */\n setCameraRigParameter(e, t) {\n this._cameraRigParams || (this._cameraRigParams = {}), this._cameraRigParams[e] = t, e === \"interaxialDistance\" && (this._cameraRigParams.stereoHalfAngle = ge.ToRadians(t / 0.0637));\n }\n /**\n * needs to be overridden by children so sub has required properties to be copied\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n createRigCamera(e, t) {\n return null;\n }\n /**\n * May need to be overridden by children\n * @internal\n */\n _updateRigCameras() {\n for (let e = 0; e < this._rigCameras.length; e++)\n this._rigCameras[e].minZ = this.minZ, this._rigCameras[e].maxZ = this.maxZ, this._rigCameras[e].fov = this.fov, this._rigCameras[e].upVector.copyFrom(this.upVector);\n this.cameraRigMode === $e.RIG_MODE_STEREOSCOPIC_ANAGLYPH && (this._rigCameras[0].viewport = this._rigCameras[1].viewport = this.viewport);\n }\n /** @internal */\n _setupInputs() {\n }\n /**\n * Serialiaze the camera setup to a json representation\n * @returns the JSON representation\n */\n serialize() {\n const e = Le.Serialize(this);\n return e.uniqueId = this.uniqueId, e.type = this.getClassName(), this.parent && this.parent._serializeAsParent(e), this.inputs && this.inputs.serialize(e), Le.AppendSerializedAnimations(this, e), e.ranges = this.serializeAnimationRanges(), e.isEnabled = this.isEnabled(), e;\n }\n /**\n * Clones the current camera.\n * @param name The cloned camera name\n * @param newParent The cloned camera's new parent (none by default)\n * @returns the cloned camera\n */\n clone(e, t = null) {\n const i = Le.Clone($e.GetConstructorFromName(this.getClassName(), e, this.getScene(), this.interaxialDistance, this.isStereoscopicSideBySide), this);\n return i.name = e, i.parent = t, this.onClonedObservable.notifyObservers(i), i;\n }\n /**\n * Gets the direction of the camera relative to a given local axis.\n * @param localAxis Defines the reference axis to provide a relative direction.\n * @returns the direction\n */\n getDirection(e) {\n const t = _.Zero();\n return this.getDirectionToRef(e, t), t;\n }\n /**\n * Returns the current camera absolute rotation\n */\n get absoluteRotation() {\n return this.getWorldMatrix().decompose(void 0, this._absoluteRotation), this._absoluteRotation;\n }\n /**\n * Gets the direction of the camera relative to a given local axis into a passed vector.\n * @param localAxis Defines the reference axis to provide a relative direction.\n * @param result Defines the vector to store the result in\n */\n getDirectionToRef(e, t) {\n _.TransformNormalToRef(e, this.getWorldMatrix(), t);\n }\n /**\n * Gets a camera constructor for a given camera type\n * @param type The type of the camera to construct (should be equal to one of the camera class name)\n * @param name The name of the camera the result will be able to instantiate\n * @param scene The scene the result will construct the camera in\n * @param interaxial_distance In case of stereoscopic setup, the distance between both eyes\n * @param isStereoscopicSideBySide In case of stereoscopic setup, should the sereo be side b side\n * @returns a factory method to construct the camera\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static GetConstructorFromName(e, t, i, r = 0, s = !0) {\n const a = Ai.Construct(e, t, i, {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n interaxial_distance: r,\n isStereoscopicSideBySide: s\n });\n return a || (() => $e._CreateDefaultParsedCamera(t, i));\n }\n /**\n * Compute the world matrix of the camera.\n * @returns the camera world matrix\n */\n computeWorldMatrix() {\n return this.getWorldMatrix();\n }\n /**\n * Parse a JSON and creates the camera from the parsed information\n * @param parsedCamera The JSON to parse\n * @param scene The scene to instantiate the camera in\n * @returns the newly constructed camera\n */\n static Parse(e, t) {\n const i = e.type, r = $e.GetConstructorFromName(i, e.name, t, e.interaxial_distance, e.isStereoscopicSideBySide), s = Le.Parse(r, e, t);\n if (e.parentId !== void 0 && (s._waitingParentId = e.parentId), e.parentInstanceIndex !== void 0 && (s._waitingParentInstanceIndex = e.parentInstanceIndex), s.inputs && (s.inputs.parse(e), s._setupInputs()), e.upVector && (s.upVector = _.FromArray(e.upVector)), s.setPosition && (s.position.copyFromFloats(0, 0, 0), s.setPosition(_.FromArray(e.position))), e.target && s.setTarget && s.setTarget(_.FromArray(e.target)), e.cameraRigMode) {\n const a = e.interaxial_distance ? { interaxialDistance: e.interaxial_distance } : {};\n s.setCameraRigMode(e.cameraRigMode, a);\n }\n if (e.animations) {\n for (let a = 0; a < e.animations.length; a++) {\n const o = e.animations[a], l = mr(\"BABYLON.Animation\");\n l && s.animations.push(l.Parse(o));\n }\n Ai.ParseAnimationRanges(s, e, t);\n }\n return e.autoAnimate && t.beginAnimation(s, e.autoAnimateFrom, e.autoAnimateTo, e.autoAnimateLoop, e.autoAnimateSpeed || 1), e.isEnabled !== void 0 && s.setEnabled(e.isEnabled), s;\n }\n /** @internal */\n _calculateHandednessMultiplier() {\n let e = this.getScene().useRightHandedSystem ? -1 : 1;\n return this.parent && this.parent._getWorldMatrixDeterminant() < 0 && (e *= -1), e;\n }\n}\n$e._CreateDefaultParsedCamera = (n, e) => {\n throw We(\"UniversalCamera\");\n};\n$e.PERSPECTIVE_CAMERA = 0;\n$e.ORTHOGRAPHIC_CAMERA = 1;\n$e.FOVMODE_VERTICAL_FIXED = 0;\n$e.FOVMODE_HORIZONTAL_FIXED = 1;\n$e.RIG_MODE_NONE = 0;\n$e.RIG_MODE_STEREOSCOPIC_ANAGLYPH = 10;\n$e.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL = 11;\n$e.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED = 12;\n$e.RIG_MODE_STEREOSCOPIC_OVERUNDER = 13;\n$e.RIG_MODE_STEREOSCOPIC_INTERLACED = 14;\n$e.RIG_MODE_VR = 20;\n$e.RIG_MODE_CUSTOM = 22;\n$e.ForceAttachControlToAlwaysPreventDefault = !1;\nP([\n hn(\"position\")\n], $e.prototype, \"_position\", void 0);\nP([\n hn(\"upVector\")\n], $e.prototype, \"_upVector\", void 0);\nP([\n w()\n], $e.prototype, \"orthoLeft\", null);\nP([\n w()\n], $e.prototype, \"orthoRight\", null);\nP([\n w()\n], $e.prototype, \"orthoBottom\", null);\nP([\n w()\n], $e.prototype, \"orthoTop\", null);\nP([\n w()\n], $e.prototype, \"fov\", void 0);\nP([\n w()\n], $e.prototype, \"projectionPlaneTilt\", void 0);\nP([\n w()\n], $e.prototype, \"minZ\", void 0);\nP([\n w()\n], $e.prototype, \"maxZ\", void 0);\nP([\n w()\n], $e.prototype, \"inertia\", void 0);\nP([\n w()\n], $e.prototype, \"mode\", null);\nP([\n w()\n], $e.prototype, \"layerMask\", void 0);\nP([\n w()\n], $e.prototype, \"fovMode\", void 0);\nP([\n w()\n], $e.prototype, \"cameraRigMode\", void 0);\nP([\n w()\n], $e.prototype, \"interaxialDistance\", void 0);\nP([\n w()\n], $e.prototype, \"isStereoscopicSideBySide\", void 0);\nclass zs {\n /**\n * Creates a material stencil state instance\n */\n constructor() {\n this.reset();\n }\n /**\n * Resets all the stencil states to default values\n */\n reset() {\n this.enabled = !1, this.mask = 255, this.func = 519, this.funcRef = 1, this.funcMask = 255, this.opStencilFail = 7680, this.opDepthFail = 7680, this.opStencilDepthPass = 7681;\n }\n /**\n * Gets or sets the stencil function\n */\n get func() {\n return this._func;\n }\n set func(e) {\n this._func = e;\n }\n /**\n * Gets or sets the stencil function reference\n */\n get funcRef() {\n return this._funcRef;\n }\n set funcRef(e) {\n this._funcRef = e;\n }\n /**\n * Gets or sets the stencil function mask\n */\n get funcMask() {\n return this._funcMask;\n }\n set funcMask(e) {\n this._funcMask = e;\n }\n /**\n * Gets or sets the operation when the stencil test fails\n */\n get opStencilFail() {\n return this._opStencilFail;\n }\n set opStencilFail(e) {\n this._opStencilFail = e;\n }\n /**\n * Gets or sets the operation when the depth test fails\n */\n get opDepthFail() {\n return this._opDepthFail;\n }\n set opDepthFail(e) {\n this._opDepthFail = e;\n }\n /**\n * Gets or sets the operation when the stencil+depth test succeeds\n */\n get opStencilDepthPass() {\n return this._opStencilDepthPass;\n }\n set opStencilDepthPass(e) {\n this._opStencilDepthPass = e;\n }\n /**\n * Gets or sets the stencil mask\n */\n get mask() {\n return this._mask;\n }\n set mask(e) {\n this._mask = e;\n }\n /**\n * Enables or disables the stencil test\n */\n get enabled() {\n return this._enabled;\n }\n set enabled(e) {\n this._enabled = e;\n }\n /**\n * Get the current class name, useful for serialization or dynamic coding.\n * @returns \"MaterialStencilState\"\n */\n getClassName() {\n return \"MaterialStencilState\";\n }\n /**\n * Makes a duplicate of the current configuration into another one.\n * @param stencilState defines stencil state where to copy the info\n */\n copyTo(e) {\n Le.Clone(() => e, this);\n }\n /**\n * Serializes this stencil configuration.\n * @returns - An object with the serialized config.\n */\n serialize() {\n return Le.Serialize(this);\n }\n /**\n * Parses a stencil state configuration from a serialized object.\n * @param source - Serialized object.\n * @param scene Defines the scene we are parsing for\n * @param rootUrl Defines the rootUrl to load from\n */\n parse(e, t, i) {\n Le.Parse(() => this, e, t, i);\n }\n}\nP([\n w()\n], zs.prototype, \"func\", null);\nP([\n w()\n], zs.prototype, \"funcRef\", null);\nP([\n w()\n], zs.prototype, \"funcMask\", null);\nP([\n w()\n], zs.prototype, \"opStencilFail\", null);\nP([\n w()\n], zs.prototype, \"opDepthFail\", null);\nP([\n w()\n], zs.prototype, \"opStencilDepthPass\", null);\nP([\n w()\n], zs.prototype, \"mask\", null);\nP([\n w()\n], zs.prototype, \"enabled\", null);\nvar Ri;\n(function(n) {\n n[n.Created = 1] = \"Created\", n[n.Disposed = 2] = \"Disposed\", n[n.GetDefineNames = 4] = \"GetDefineNames\", n[n.PrepareUniformBuffer = 8] = \"PrepareUniformBuffer\", n[n.IsReadyForSubMesh = 16] = \"IsReadyForSubMesh\", n[n.PrepareDefines = 32] = \"PrepareDefines\", n[n.BindForSubMesh = 64] = \"BindForSubMesh\", n[n.PrepareEffect = 128] = \"PrepareEffect\", n[n.GetAnimatables = 256] = \"GetAnimatables\", n[n.GetActiveTextures = 512] = \"GetActiveTextures\", n[n.HasTexture = 1024] = \"HasTexture\", n[n.FillRenderTargetTextures = 2048] = \"FillRenderTargetTextures\", n[n.HasRenderTargetTextures = 4096] = \"HasRenderTargetTextures\", n[n.HardBindForSubMesh = 8192] = \"HardBindForSubMesh\";\n})(Ri || (Ri = {}));\nfunction Nc(n) {\n n.indexOf(\"vClipPlane\") === -1 && n.push(\"vClipPlane\"), n.indexOf(\"vClipPlane2\") === -1 && n.push(\"vClipPlane2\"), n.indexOf(\"vClipPlane3\") === -1 && n.push(\"vClipPlane3\"), n.indexOf(\"vClipPlane4\") === -1 && n.push(\"vClipPlane4\"), n.indexOf(\"vClipPlane5\") === -1 && n.push(\"vClipPlane5\"), n.indexOf(\"vClipPlane6\") === -1 && n.push(\"vClipPlane6\");\n}\nfunction Zy(n, e, t) {\n const i = !!(n.clipPlane ?? e.clipPlane), r = !!(n.clipPlane2 ?? e.clipPlane2), s = !!(n.clipPlane3 ?? e.clipPlane3), a = !!(n.clipPlane4 ?? e.clipPlane4), o = !!(n.clipPlane5 ?? e.clipPlane5), l = !!(n.clipPlane6 ?? e.clipPlane6);\n i && t.push(\"#define CLIPPLANE\"), r && t.push(\"#define CLIPPLANE2\"), s && t.push(\"#define CLIPPLANE3\"), a && t.push(\"#define CLIPPLANE4\"), o && t.push(\"#define CLIPPLANE5\"), l && t.push(\"#define CLIPPLANE6\");\n}\nfunction jy(n, e, t) {\n let i = !1;\n const r = !!(n.clipPlane ?? e.clipPlane), s = !!(n.clipPlane2 ?? e.clipPlane2), a = !!(n.clipPlane3 ?? e.clipPlane3), o = !!(n.clipPlane4 ?? e.clipPlane4), l = !!(n.clipPlane5 ?? e.clipPlane5), c = !!(n.clipPlane6 ?? e.clipPlane6);\n return t.CLIPPLANE !== r && (t.CLIPPLANE = r, i = !0), t.CLIPPLANE2 !== s && (t.CLIPPLANE2 = s, i = !0), t.CLIPPLANE3 !== a && (t.CLIPPLANE3 = a, i = !0), t.CLIPPLANE4 !== o && (t.CLIPPLANE4 = o, i = !0), t.CLIPPLANE5 !== l && (t.CLIPPLANE5 = l, i = !0), t.CLIPPLANE6 !== c && (t.CLIPPLANE6 = c, i = !0), i;\n}\nfunction Fc(n, e, t) {\n let i = e.clipPlane ?? t.clipPlane;\n Qn(n, \"vClipPlane\", i), i = e.clipPlane2 ?? t.clipPlane2, Qn(n, \"vClipPlane2\", i), i = e.clipPlane3 ?? t.clipPlane3, Qn(n, \"vClipPlane3\", i), i = e.clipPlane4 ?? t.clipPlane4, Qn(n, \"vClipPlane4\", i), i = e.clipPlane5 ?? t.clipPlane5, Qn(n, \"vClipPlane5\", i), i = e.clipPlane6 ?? t.clipPlane6, Qn(n, \"vClipPlane6\", i);\n}\nfunction Qn(n, e, t) {\n t && n.setFloat4(e, t.normal.x, t.normal.y, t.normal.z, t.d);\n}\nconst ug = Ne.Black();\nfunction Lc(n, e, t) {\n if (!n || n.LOGARITHMICDEPTH || n.indexOf && n.indexOf(\"LOGARITHMICDEPTH\") >= 0) {\n const i = t.activeCamera;\n i.mode === 1 && ne.Error(\"Logarithmic depth is not compatible with orthographic cameras!\", 20), e.setFloat(\"logarithmicDepthConstant\", 2 / (Math.log(i.maxZ + 1) / Math.LN2));\n }\n}\nfunction wc(n, e, t, i = !1) {\n t && n.fogEnabled && (!e || e.applyFog) && n.fogMode !== 0 && (t.setFloat4(\"vFogInfos\", n.fogMode, n.fogStart, n.fogEnd, n.fogDensity), i ? (n.fogColor.toLinearSpaceToRef(ug, n.getEngine().useExactSrgbConversions), t.setColor3(\"vFogColor\", ug)) : t.setColor3(\"vFogColor\", n.fogColor));\n}\nfunction Q_(n, e, t) {\n const i = t.NUM_MORPH_INFLUENCERS;\n if (i > 0 && st.LastCreatedEngine) {\n const r = st.LastCreatedEngine.getCaps().maxVertexAttribs, s = e.morphTargetManager;\n if (s != null && s.isUsingTextureForTargets)\n return;\n const a = s && s.supportsNormals && t.NORMAL, o = s && s.supportsTangents && t.TANGENT, l = s && s.supportsUVs && t.UV1;\n for (let c = 0; c < i; c++)\n n.push(\"position\" + c), a && n.push(\"normal\" + c), o && n.push(\"tangent\" + c), l && n.push(\"uv_\" + c), n.length > r && ne.Error(\"Cannot add more vertex attributes for mesh \" + e.name);\n }\n}\nfunction J_(n, e = !1) {\n n.push(\"world0\"), n.push(\"world1\"), n.push(\"world2\"), n.push(\"world3\"), e && (n.push(\"previousWorld0\"), n.push(\"previousWorld1\"), n.push(\"previousWorld2\"), n.push(\"previousWorld3\"));\n}\nfunction af(n, e) {\n const t = n.morphTargetManager;\n !n || !t || e.setFloatArray(\"morphTargetInfluences\", t.influences);\n}\nfunction $_(n, e) {\n e.bindToEffect(n, \"Scene\");\n}\nfunction wt(n, e, t) {\n e._needUVs = !0, e[t] = !0, n.optimizeUVAllocation && n.getTextureMatrix().isIdentityAs3x2() ? (e[t + \"DIRECTUV\"] = n.coordinatesIndex + 1, e[\"MAINUV\" + (n.coordinatesIndex + 1)] = !0) : e[t + \"DIRECTUV\"] = 0;\n}\nfunction Mt(n, e, t) {\n const i = n.getTextureMatrix();\n e.updateMatrix(t + \"Matrix\", i);\n}\nfunction of(n, e, t) {\n t.BAKED_VERTEX_ANIMATION_TEXTURE && t.INSTANCES && n.push(\"bakedVertexAnimationSettingsInstanced\");\n}\nfunction Qy(n, e) {\n return e.set(n), e;\n}\nfunction lf(n, e, t) {\n if (!(!e || !n) && (n.computeBonesUsingShaders && e._bonesComputationForcedToCPU && (n.computeBonesUsingShaders = !1), n.useBones && n.computeBonesUsingShaders && n.skeleton)) {\n const i = n.skeleton;\n if (i.isUsingTextureForMatrices && e.getUniformIndex(\"boneTextureWidth\") > -1) {\n const r = i.getTransformMatrixTexture(n);\n e.setTexture(\"boneSampler\", r), e.setFloat(\"boneTextureWidth\", 4 * (i.bones.length + 1));\n } else {\n const r = i.getTransformMatrices(n);\n r && (e.setMatrices(\"mBones\", r), t && n.getScene().prePassRenderer && n.getScene().prePassRenderer.getIndex(2) && (t.previousBones[n.uniqueId] || (t.previousBones[n.uniqueId] = r.slice()), e.setMatrices(\"mPreviousBones\", t.previousBones[n.uniqueId]), Qy(r, t.previousBones[n.uniqueId])));\n }\n }\n}\nfunction Jy(n, e, t, i, r, s = !0) {\n n._bindLight(e, t, i, r, s);\n}\nfunction e0(n, e, t, i, r = 4) {\n const s = Math.min(e.lightSources.length, r);\n for (let a = 0; a < s; a++) {\n const o = e.lightSources[a];\n Jy(o, a, n, t, typeof i == \"boolean\" ? i : i.SPECULARTERM, e.receiveShadows);\n }\n}\nfunction t0(n, e, t, i) {\n t.NUM_BONE_INFLUENCERS > 0 && (i.addCPUSkinningFallback(0, e), n.push(\"matricesIndices\"), n.push(\"matricesWeights\"), t.NUM_BONE_INFLUENCERS > 4 && (n.push(\"matricesIndicesExtra\"), n.push(\"matricesWeightsExtra\")));\n}\nfunction cf(n, e) {\n (e.INSTANCES || e.THIN_INSTANCES) && J_(n, !!e.PREPASS_VELOCITY), e.INSTANCESCOLOR && n.push(\"instanceColor\");\n}\nfunction i0(n, e, t = 4, i = 0) {\n let r = 0;\n for (let s = 0; s < t && n[\"LIGHT\" + s]; s++)\n s > 0 && (r = i + s, e.addFallback(r, \"LIGHT\" + s)), n.SHADOWS || (n[\"SHADOW\" + s] && e.addFallback(i, \"SHADOW\" + s), n[\"SHADOWPCF\" + s] && e.addFallback(i, \"SHADOWPCF\" + s), n[\"SHADOWPCSS\" + s] && e.addFallback(i, \"SHADOWPCSS\" + s), n[\"SHADOWPOISSON\" + s] && e.addFallback(i, \"SHADOWPOISSON\" + s), n[\"SHADOWESM\" + s] && e.addFallback(i, \"SHADOWESM\" + s), n[\"SHADOWCLOSEESM\" + s] && e.addFallback(i, \"SHADOWCLOSEESM\" + s));\n return r++;\n}\nfunction $y(n, e) {\n return e.fogEnabled && n.applyFog && e.fogMode !== 0;\n}\nfunction hf(n, e, t, i, r, s, a, o = !1) {\n a._areMiscDirty && (a.LOGARITHMICDEPTH = t, a.POINTSIZE = i, a.FOG = r && $y(n, e), a.NONUNIFORMSCALING = n.nonUniformScaling, a.ALPHATEST = s, a.DECAL_AFTER_DETAIL = o);\n}\nfunction r0(n, e, t, i, r = 4, s = !1) {\n if (!t._areLightsDirty)\n return t._needNormals;\n let a = 0;\n const o = {\n needNormals: t._needNormals,\n needRebuild: !1,\n lightmapMode: !1,\n shadowEnabled: !1,\n specularEnabled: !1\n };\n if (n.lightsEnabled && !s) {\n for (const c of e.lightSources)\n if (eI(n, e, c, a, t, i, o), a++, a === r)\n break;\n }\n t.SPECULARTERM = o.specularEnabled, t.SHADOWS = o.shadowEnabled;\n for (let c = a; c < r; c++)\n t[\"LIGHT\" + c] !== void 0 && (t[\"LIGHT\" + c] = !1, t[\"HEMILIGHT\" + c] = !1, t[\"POINTLIGHT\" + c] = !1, t[\"DIRLIGHT\" + c] = !1, t[\"SPOTLIGHT\" + c] = !1, t[\"SHADOW\" + c] = !1, t[\"SHADOWCSM\" + c] = !1, t[\"SHADOWCSMDEBUG\" + c] = !1, t[\"SHADOWCSMNUM_CASCADES\" + c] = !1, t[\"SHADOWCSMUSESHADOWMAXZ\" + c] = !1, t[\"SHADOWCSMNOBLEND\" + c] = !1, t[\"SHADOWCSM_RIGHTHANDED\" + c] = !1, t[\"SHADOWPCF\" + c] = !1, t[\"SHADOWPCSS\" + c] = !1, t[\"SHADOWPOISSON\" + c] = !1, t[\"SHADOWESM\" + c] = !1, t[\"SHADOWCLOSEESM\" + c] = !1, t[\"SHADOWCUBE\" + c] = !1, t[\"SHADOWLOWQUALITY\" + c] = !1, t[\"SHADOWMEDIUMQUALITY\" + c] = !1);\n const l = n.getEngine().getCaps();\n return t.SHADOWFLOAT === void 0 && (o.needRebuild = !0), t.SHADOWFLOAT = o.shadowEnabled && (l.textureFloatRender && l.textureFloatLinearFiltering || l.textureHalfFloatRender && l.textureHalfFloatLinearFiltering), t.LIGHTMAPEXCLUDED = o.lightmapMode, o.needRebuild && t.rebuild(), o.needNormals;\n}\nfunction eI(n, e, t, i, r, s, a) {\n switch (a.needNormals = !0, r[\"LIGHT\" + i] === void 0 && (a.needRebuild = !0), r[\"LIGHT\" + i] = !0, r[\"SPOTLIGHT\" + i] = !1, r[\"HEMILIGHT\" + i] = !1, r[\"POINTLIGHT\" + i] = !1, r[\"DIRLIGHT\" + i] = !1, t.prepareLightSpecificDefines(r, i), r[\"LIGHT_FALLOFF_PHYSICAL\" + i] = !1, r[\"LIGHT_FALLOFF_GLTF\" + i] = !1, r[\"LIGHT_FALLOFF_STANDARD\" + i] = !1, t.falloffType) {\n case Et.FALLOFF_GLTF:\n r[\"LIGHT_FALLOFF_GLTF\" + i] = !0;\n break;\n case Et.FALLOFF_PHYSICAL:\n r[\"LIGHT_FALLOFF_PHYSICAL\" + i] = !0;\n break;\n case Et.FALLOFF_STANDARD:\n r[\"LIGHT_FALLOFF_STANDARD\" + i] = !0;\n break;\n }\n if (s && !t.specular.equalsFloats(0, 0, 0) && (a.specularEnabled = !0), r[\"SHADOW\" + i] = !1, r[\"SHADOWCSM\" + i] = !1, r[\"SHADOWCSMDEBUG\" + i] = !1, r[\"SHADOWCSMNUM_CASCADES\" + i] = !1, r[\"SHADOWCSMUSESHADOWMAXZ\" + i] = !1, r[\"SHADOWCSMNOBLEND\" + i] = !1, r[\"SHADOWCSM_RIGHTHANDED\" + i] = !1, r[\"SHADOWPCF\" + i] = !1, r[\"SHADOWPCSS\" + i] = !1, r[\"SHADOWPOISSON\" + i] = !1, r[\"SHADOWESM\" + i] = !1, r[\"SHADOWCLOSEESM\" + i] = !1, r[\"SHADOWCUBE\" + i] = !1, r[\"SHADOWLOWQUALITY\" + i] = !1, r[\"SHADOWMEDIUMQUALITY\" + i] = !1, e && e.receiveShadows && n.shadowsEnabled && t.shadowEnabled) {\n const o = t.getShadowGenerator(n.activeCamera) ?? t.getShadowGenerator();\n if (o) {\n const l = o.getShadowMap();\n l && l.renderList && l.renderList.length > 0 && (a.shadowEnabled = !0, o.prepareDefines(r, i));\n }\n }\n t.lightmapMode != Et.LIGHTMAP_DEFAULT ? (a.lightmapMode = !0, r[\"LIGHTMAPEXCLUDED\" + i] = !0, r[\"LIGHTMAPNOSPECULAR\" + i] = t.lightmapMode == Et.LIGHTMAP_SHADOWSONLY) : (r[\"LIGHTMAPEXCLUDED\" + i] = !1, r[\"LIGHTMAPNOSPECULAR\" + i] = !1);\n}\nfunction uf(n, e, t, i, r, s = null, a = !1) {\n let o = sI(n, i);\n s !== !1 && (o = jy(t, n, i)), i.DEPTHPREPASS !== !e.getColorWrite() && (i.DEPTHPREPASS = !i.DEPTHPREPASS, o = !0), i.INSTANCES !== r && (i.INSTANCES = r, o = !0), i.THIN_INSTANCES !== a && (i.THIN_INSTANCES = a, o = !0), o && i.markAsUnprocessed();\n}\nfunction tI(n, e) {\n if (n.useBones && n.computeBonesUsingShaders && n.skeleton) {\n e.NUM_BONE_INFLUENCERS = n.numBoneInfluencers;\n const t = e.BONETEXTURE !== void 0;\n if (n.skeleton.isUsingTextureForMatrices && t)\n e.BONETEXTURE = !0;\n else {\n e.BonesPerMesh = n.skeleton.bones.length + 1, e.BONETEXTURE = t ? !1 : void 0;\n const i = n.getScene().prePassRenderer;\n if (i && i.enabled) {\n const r = i.excludedSkinnedMesh.indexOf(n) === -1;\n e.BONES_VELOCITY_ENABLED = r;\n }\n }\n } else\n e.NUM_BONE_INFLUENCERS = 0, e.BonesPerMesh = 0, e.BONETEXTURE !== void 0 && (e.BONETEXTURE = !1);\n}\nfunction iI(n, e) {\n const t = n.morphTargetManager;\n t ? (e.MORPHTARGETS_UV = t.supportsUVs && e.UV1, e.MORPHTARGETS_TANGENT = t.supportsTangents && e.TANGENT, e.MORPHTARGETS_NORMAL = t.supportsNormals && e.NORMAL, e.NUM_MORPH_INFLUENCERS = t.numMaxInfluencers || t.numInfluencers, e.MORPHTARGETS = e.NUM_MORPH_INFLUENCERS > 0, e.MORPHTARGETS_TEXTURE = t.isUsingTextureForTargets) : (e.MORPHTARGETS_UV = !1, e.MORPHTARGETS_TANGENT = !1, e.MORPHTARGETS_NORMAL = !1, e.MORPHTARGETS = !1, e.NUM_MORPH_INFLUENCERS = 0);\n}\nfunction rI(n, e) {\n const t = n.bakedVertexAnimationManager;\n e.BAKED_VERTEX_ANIMATION_TEXTURE = !!(t && t.isEnabled);\n}\nfunction ff(n, e, t, i, r = !1, s = !0, a = !0) {\n if (!e._areAttributesDirty && e._needNormals === e._normals && e._needUVs === e._uvs)\n return !1;\n e._normals = e._needNormals, e._uvs = e._needUVs, e.NORMAL = e._needNormals && n.isVerticesDataPresent(\"normal\"), e._needNormals && n.isVerticesDataPresent(\"tangent\") && (e.TANGENT = !0);\n for (let o = 1; o <= 6; ++o)\n e[\"UV\" + o] = e._needUVs ? n.isVerticesDataPresent(`uv${o === 1 ? \"\" : o}`) : !1;\n if (t) {\n const o = n.useVertexColors && n.isVerticesDataPresent(\"color\");\n e.VERTEXCOLOR = o, e.VERTEXALPHA = n.hasVertexAlpha && o && s;\n }\n return n.isVerticesDataPresent(\"instanceColor\") && (n.hasInstances || n.hasThinInstances) && (e.INSTANCESCOLOR = !0), i && tI(n, e), r && iI(n, e), a && rI(n, e), !0;\n}\nfunction s0(n, e) {\n if (n.activeCamera) {\n const t = e.MULTIVIEW;\n e.MULTIVIEW = n.activeCamera.outputRenderTarget !== null && n.activeCamera.outputRenderTarget.getViewCount() > 1, e.MULTIVIEW != t && e.markAsUnprocessed();\n }\n}\nfunction n0(n, e, t) {\n const i = e.ORDER_INDEPENDENT_TRANSPARENCY, r = e.ORDER_INDEPENDENT_TRANSPARENCY_16BITS;\n e.ORDER_INDEPENDENT_TRANSPARENCY = n.useOrderIndependentTransparency && t, e.ORDER_INDEPENDENT_TRANSPARENCY_16BITS = !n.getEngine().getCaps().textureFloatLinearFiltering, (i !== e.ORDER_INDEPENDENT_TRANSPARENCY || r !== e.ORDER_INDEPENDENT_TRANSPARENCY_16BITS) && e.markAsUnprocessed();\n}\nfunction a0(n, e, t) {\n const i = e.PREPASS;\n if (!e._arePrePassDirty)\n return;\n const r = [\n {\n type: 1,\n define: \"PREPASS_POSITION\",\n index: \"PREPASS_POSITION_INDEX\"\n },\n {\n type: 2,\n define: \"PREPASS_VELOCITY\",\n index: \"PREPASS_VELOCITY_INDEX\"\n },\n {\n type: 3,\n define: \"PREPASS_REFLECTIVITY\",\n index: \"PREPASS_REFLECTIVITY_INDEX\"\n },\n {\n type: 0,\n define: \"PREPASS_IRRADIANCE\",\n index: \"PREPASS_IRRADIANCE_INDEX\"\n },\n {\n type: 7,\n define: \"PREPASS_ALBEDO_SQRT\",\n index: \"PREPASS_ALBEDO_SQRT_INDEX\"\n },\n {\n type: 5,\n define: \"PREPASS_DEPTH\",\n index: \"PREPASS_DEPTH_INDEX\"\n },\n {\n type: 6,\n define: \"PREPASS_NORMAL\",\n index: \"PREPASS_NORMAL_INDEX\"\n }\n ];\n if (n.prePassRenderer && n.prePassRenderer.enabled && t) {\n e.PREPASS = !0, e.SCENE_MRT_COUNT = n.prePassRenderer.mrtCount, e.PREPASS_NORMAL_WORLDSPACE = n.prePassRenderer.generateNormalsInWorldSpace;\n for (let s = 0; s < r.length; s++) {\n const a = n.prePassRenderer.getIndex(r[s].type);\n a !== -1 ? (e[r[s].define] = !0, e[r[s].index] = a) : e[r[s].define] = !1;\n }\n } else {\n e.PREPASS = !1;\n for (let s = 0; s < r.length; s++)\n e[r[s].define] = !1;\n }\n e.PREPASS != i && (e.markAsUnprocessed(), e.markAsImageProcessingDirty());\n}\nfunction sI(n, e) {\n let t = !1;\n if (n.activeCamera) {\n const i = e.CAMERA_ORTHOGRAPHIC ? 1 : 0, r = e.CAMERA_PERSPECTIVE ? 1 : 0, s = n.activeCamera.mode === 1 ? 1 : 0, a = n.activeCamera.mode === 0 ? 1 : 0;\n (i ^ s || r ^ a) && (e.CAMERA_ORTHOGRAPHIC = s === 1, e.CAMERA_PERSPECTIVE = a === 1, t = !0);\n }\n return t;\n}\nfunction nI(n, e, t, i, r = null, s = !1) {\n r && r.push(\"Light\" + n), !s && (e.push(\"vLightData\" + n, \"vLightDiffuse\" + n, \"vLightSpecular\" + n, \"vLightDirection\" + n, \"vLightFalloff\" + n, \"vLightGround\" + n, \"lightMatrix\" + n, \"shadowsInfo\" + n, \"depthValues\" + n), t.push(\"shadowSampler\" + n), t.push(\"depthSampler\" + n), e.push(\"viewFrustumZ\" + n, \"cascadeBlendFactor\" + n, \"lightSizeUVCorrection\" + n, \"depthCorrection\" + n, \"penumbraDarkness\" + n, \"frustumLengths\" + n), i && (t.push(\"projectionLightSampler\" + n), e.push(\"textureProjectionMatrix\" + n)));\n}\nfunction df(n, e, t, i = 4) {\n let r, s = null;\n if (n.uniformsNames) {\n const a = n;\n r = a.uniformsNames, s = a.uniformBuffersNames, e = a.samplers, t = a.defines, i = a.maxSimultaneousLights || 0;\n } else\n r = n, e || (e = []);\n for (let a = 0; a < i && t[\"LIGHT\" + a]; a++)\n nI(a, r, e, t[\"PROJECTEDLIGHTTEXTURE\" + a], s);\n t.NUM_MORPH_INFLUENCERS && (r.push(\"morphTargetInfluences\"), r.push(\"morphTargetCount\")), t.BAKED_VERTEX_ANIMATION_TEXTURE && (r.push(\"bakedVertexAnimationSettings\"), r.push(\"bakedVertexAnimationTextureSizeInverted\"), r.push(\"bakedVertexAnimationTime\"), e.push(\"bakedVertexAnimationTexture\"));\n}\nclass ie {\n /**\n * If the material can be rendered to several textures with MRT extension\n */\n get canRenderToMRT() {\n return !1;\n }\n /**\n * Sets the alpha value of the material\n */\n set alpha(e) {\n if (this._alpha === e)\n return;\n const t = this._alpha;\n this._alpha = e, (t === 1 || e === 1) && this.markAsDirty(ie.MiscDirtyFlag + ie.PrePassDirtyFlag);\n }\n /**\n * Gets the alpha value of the material\n */\n get alpha() {\n return this._alpha;\n }\n /**\n * Sets the culling state (true to enable culling, false to disable)\n */\n set backFaceCulling(e) {\n this._backFaceCulling !== e && (this._backFaceCulling = e, this.markAsDirty(ie.TextureDirtyFlag));\n }\n /**\n * Gets the culling state\n */\n get backFaceCulling() {\n return this._backFaceCulling;\n }\n /**\n * Sets the type of faces that should be culled (true for back faces, false for front faces)\n */\n set cullBackFaces(e) {\n this._cullBackFaces !== e && (this._cullBackFaces = e, this.markAsDirty(ie.TextureDirtyFlag));\n }\n /**\n * Gets the type of faces that should be culled\n */\n get cullBackFaces() {\n return this._cullBackFaces;\n }\n /**\n * Block the dirty-mechanism for this specific material\n * When set to false after being true the material will be marked as dirty.\n */\n get blockDirtyMechanism() {\n return this._blockDirtyMechanism;\n }\n set blockDirtyMechanism(e) {\n this._blockDirtyMechanism !== e && (this._blockDirtyMechanism = e, e || this.markDirty());\n }\n /**\n * This allows you to modify the material without marking it as dirty after every change.\n * This function should be used if you need to make more than one dirty-enabling change to the material - adding a texture, setting a new fill mode and so on.\n * The callback will pass the material as an argument, so you can make your changes to it.\n * @param callback the callback to be executed that will update the material\n */\n atomicMaterialsUpdate(e) {\n this.blockDirtyMechanism = !0;\n try {\n e(this);\n } finally {\n this.blockDirtyMechanism = !1;\n }\n }\n /**\n * Gets a boolean indicating that current material needs to register RTT\n */\n get hasRenderTargetTextures() {\n return this._eventInfo.hasRenderTargetTextures = !1, this._callbackPluginEventHasRenderTargetTextures(this._eventInfo), this._eventInfo.hasRenderTargetTextures;\n }\n /**\n * Called during a dispose event\n */\n set onDispose(e) {\n this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e);\n }\n /**\n * An event triggered when the material is bound\n */\n get onBindObservable() {\n return this._onBindObservable || (this._onBindObservable = new he()), this._onBindObservable;\n }\n /**\n * Called during a bind event\n */\n set onBind(e) {\n this._onBindObserver && this.onBindObservable.remove(this._onBindObserver), this._onBindObserver = this.onBindObservable.add(e);\n }\n /**\n * An event triggered when the material is unbound\n */\n get onUnBindObservable() {\n return this._onUnBindObservable || (this._onUnBindObservable = new he()), this._onUnBindObservable;\n }\n /**\n * An event triggered when the effect is (re)created\n */\n get onEffectCreatedObservable() {\n return this._onEffectCreatedObservable || (this._onEffectCreatedObservable = new he()), this._onEffectCreatedObservable;\n }\n /**\n * Sets the value of the alpha mode.\n *\n * | Value | Type | Description |\n * | --- | --- | --- |\n * | 0 | ALPHA_DISABLE | |\n * | 1 | ALPHA_ADD | |\n * | 2 | ALPHA_COMBINE | |\n * | 3 | ALPHA_SUBTRACT | |\n * | 4 | ALPHA_MULTIPLY | |\n * | 5 | ALPHA_MAXIMIZED | |\n * | 6 | ALPHA_ONEONE | |\n * | 7 | ALPHA_PREMULTIPLIED | |\n * | 8 | ALPHA_PREMULTIPLIED_PORTERDUFF | |\n * | 9 | ALPHA_INTERPOLATE | |\n * | 10 | ALPHA_SCREENMODE | |\n *\n */\n set alphaMode(e) {\n this._alphaMode !== e && (this._alphaMode = e, this.markAsDirty(ie.TextureDirtyFlag));\n }\n /**\n * Gets the value of the alpha mode\n */\n get alphaMode() {\n return this._alphaMode;\n }\n /**\n * Sets the need depth pre-pass value\n */\n set needDepthPrePass(e) {\n this._needDepthPrePass !== e && (this._needDepthPrePass = e, this._needDepthPrePass && (this.checkReadyOnEveryCall = !0));\n }\n /**\n * Gets the depth pre-pass value\n */\n get needDepthPrePass() {\n return this._needDepthPrePass;\n }\n /**\n * Can this material render to prepass\n */\n get isPrePassCapable() {\n return !1;\n }\n /**\n * Sets the state for enabling fog\n */\n set fogEnabled(e) {\n this._fogEnabled !== e && (this._fogEnabled = e, this.markAsDirty(ie.MiscDirtyFlag));\n }\n /**\n * Gets the value of the fog enabled state\n */\n get fogEnabled() {\n return this._fogEnabled;\n }\n get wireframe() {\n switch (this._fillMode) {\n case ie.WireFrameFillMode:\n case ie.LineListDrawMode:\n case ie.LineLoopDrawMode:\n case ie.LineStripDrawMode:\n return !0;\n }\n return this._scene.forceWireframe;\n }\n /**\n * Sets the state of wireframe mode\n */\n set wireframe(e) {\n this.fillMode = e ? ie.WireFrameFillMode : ie.TriangleFillMode;\n }\n /**\n * Gets the value specifying if point clouds are enabled\n */\n get pointsCloud() {\n switch (this._fillMode) {\n case ie.PointFillMode:\n case ie.PointListDrawMode:\n return !0;\n }\n return this._scene.forcePointsCloud;\n }\n /**\n * Sets the state of point cloud mode\n */\n set pointsCloud(e) {\n this.fillMode = e ? ie.PointFillMode : ie.TriangleFillMode;\n }\n /**\n * Gets the material fill mode\n */\n get fillMode() {\n return this._fillMode;\n }\n /**\n * Sets the material fill mode\n */\n set fillMode(e) {\n this._fillMode !== e && (this._fillMode = e, this.markAsDirty(ie.MiscDirtyFlag));\n }\n /**\n * In case the depth buffer does not allow enough depth precision for your scene (might be the case in large scenes)\n * You can try switching to logarithmic depth.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/logarithmicDepthBuffer\n */\n get useLogarithmicDepth() {\n return this._useLogarithmicDepth;\n }\n set useLogarithmicDepth(e) {\n const t = this.getScene().getEngine().getCaps().fragmentDepthSupported;\n e && !t && ne.Warn(\"Logarithmic depth has been requested for a material on a device that doesn't support it.\"), this._useLogarithmicDepth = e && t, this._markAllSubMeshesAsMiscDirty();\n }\n /** @internal */\n _getDrawWrapper() {\n return this._drawWrapper;\n }\n /**\n * @internal\n */\n _setDrawWrapper(e) {\n this._drawWrapper = e;\n }\n /**\n * Creates a material instance\n * @param name defines the name of the material\n * @param scene defines the scene to reference\n * @param doNotAdd specifies if the material should be added to the scene\n */\n constructor(e, t, i) {\n this.shadowDepthWrapper = null, this.allowShaderHotSwapping = !0, this.metadata = null, this.reservedDataStore = null, this.checkReadyOnEveryCall = !1, this.checkReadyOnlyOnce = !1, this.state = \"\", this._alpha = 1, this._backFaceCulling = !0, this._cullBackFaces = !0, this._blockDirtyMechanism = !1, this.onCompiled = null, this.onError = null, this.getRenderTargetTextures = null, this.doNotSerialize = !1, this._storeEffectOnSubMeshes = !1, this.animations = null, this.onDisposeObservable = new he(), this._onDisposeObserver = null, this._onUnBindObservable = null, this._onBindObserver = null, this._alphaMode = 2, this._needDepthPrePass = !1, this.disableDepthWrite = !1, this.disableColorWrite = !1, this.forceDepthWrite = !1, this.depthFunction = 0, this.separateCullingPass = !1, this._fogEnabled = !0, this.pointSize = 1, this.zOffset = 0, this.zOffsetUnits = 0, this.stencil = new zs(), this._useUBO = !1, this._fillMode = ie.TriangleFillMode, this._cachedDepthWriteState = !1, this._cachedColorWriteState = !1, this._cachedDepthFunctionState = 0, this._indexInSceneMaterialArray = -1, this.meshMap = null, this._parentContainer = null, this._uniformBufferLayoutBuilt = !1, this._eventInfo = {}, this._callbackPluginEventGeneric = () => {\n }, this._callbackPluginEventIsReadyForSubMesh = () => {\n }, this._callbackPluginEventPrepareDefines = () => {\n }, this._callbackPluginEventPrepareDefinesBeforeAttributes = () => {\n }, this._callbackPluginEventHardBindForSubMesh = () => {\n }, this._callbackPluginEventBindForSubMesh = () => {\n }, this._callbackPluginEventHasRenderTargetTextures = () => {\n }, this._callbackPluginEventFillRenderTargetTextures = () => {\n }, this._forceAlphaTest = !1, this._transparencyMode = null, this.name = e;\n const r = t || st.LastCreatedScene;\n r && (this._scene = r, this._dirtyCallbacks = {}, this._dirtyCallbacks[1] = this._markAllSubMeshesAsTexturesDirty.bind(this), this._dirtyCallbacks[2] = this._markAllSubMeshesAsLightsDirty.bind(this), this._dirtyCallbacks[4] = this._markAllSubMeshesAsFresnelDirty.bind(this), this._dirtyCallbacks[8] = this._markAllSubMeshesAsAttributesDirty.bind(this), this._dirtyCallbacks[16] = this._markAllSubMeshesAsMiscDirty.bind(this), this._dirtyCallbacks[32] = this._markAllSubMeshesAsPrePassDirty.bind(this), this._dirtyCallbacks[63] = this._markAllSubMeshesAsAllDirty.bind(this), this.id = e || ge.RandomId(), this.uniqueId = this._scene.getUniqueId(), this._materialContext = this._scene.getEngine().createMaterialContext(), this._drawWrapper = new ka(this._scene.getEngine(), !1), this._drawWrapper.materialContext = this._materialContext, this._scene.useRightHandedSystem ? this.sideOrientation = ie.ClockWiseSideOrientation : this.sideOrientation = ie.CounterClockWiseSideOrientation, this._uniformBuffer = new Ie(this._scene.getEngine(), void 0, void 0, e), this._useUBO = this.getScene().getEngine().supportsUniformBuffers, i || this._scene.addMaterial(this), this._scene.useMaterialMeshMap && (this.meshMap = {}), ie.OnEventObservable.notifyObservers(this, Ri.Created));\n }\n /**\n * Returns a string representation of the current material\n * @param fullDetails defines a boolean indicating which levels of logging is desired\n * @returns a string with material information\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n toString(e) {\n return \"Name: \" + this.name;\n }\n /**\n * Gets the class name of the material\n * @returns a string with the class name of the material\n */\n getClassName() {\n return \"Material\";\n }\n /** @internal */\n get _isMaterial() {\n return !0;\n }\n /**\n * Specifies if updates for the material been locked\n */\n get isFrozen() {\n return this.checkReadyOnlyOnce;\n }\n /**\n * Locks updates for the material\n */\n freeze() {\n this.markDirty(), this.checkReadyOnlyOnce = !0;\n }\n /**\n * Unlocks updates for the material\n */\n unfreeze() {\n this.markDirty(), this.checkReadyOnlyOnce = !1;\n }\n /**\n * Specifies if the material is ready to be used\n * @param mesh defines the mesh to check\n * @param useInstances specifies if instances should be used\n * @returns a boolean indicating if the material is ready to be used\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isReady(e, t) {\n return !0;\n }\n /**\n * Specifies that the submesh is ready to be used\n * @param mesh defines the mesh to check\n * @param subMesh defines which submesh to check\n * @param useInstances specifies that instances should be used\n * @returns a boolean indicating that the submesh is ready or not\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isReadyForSubMesh(e, t, i) {\n const r = t.materialDefines;\n return r ? (this._eventInfo.isReadyForSubMesh = !0, this._eventInfo.defines = r, this._callbackPluginEventIsReadyForSubMesh(this._eventInfo), this._eventInfo.isReadyForSubMesh) : !1;\n }\n /**\n * Returns the material effect\n * @returns the effect associated with the material\n */\n getEffect() {\n return this._drawWrapper.effect;\n }\n /**\n * Returns the current scene\n * @returns a Scene\n */\n getScene() {\n return this._scene;\n }\n /**\n * Gets the current transparency mode.\n */\n get transparencyMode() {\n return this._transparencyMode;\n }\n /**\n * Sets the transparency mode of the material.\n *\n * | Value | Type | Description |\n * | ----- | ----------------------------------- | ----------- |\n * | 0 | OPAQUE | |\n * | 1 | ALPHATEST | |\n * | 2 | ALPHABLEND | |\n * | 3 | ALPHATESTANDBLEND | |\n *\n */\n set transparencyMode(e) {\n this._transparencyMode !== e && (this._transparencyMode = e, this._forceAlphaTest = e === ie.MATERIAL_ALPHATESTANDBLEND, this._markAllSubMeshesAsTexturesAndMiscDirty());\n }\n /**\n * Returns true if alpha blending should be disabled.\n */\n get _disableAlphaBlending() {\n return this._transparencyMode === ie.MATERIAL_OPAQUE || this._transparencyMode === ie.MATERIAL_ALPHATEST;\n }\n /**\n * Specifies whether or not this material should be rendered in alpha blend mode.\n * @returns a boolean specifying if alpha blending is needed\n */\n needAlphaBlending() {\n return this._disableAlphaBlending ? !1 : this.alpha < 1;\n }\n /**\n * Specifies if the mesh will require alpha blending\n * @param mesh defines the mesh to check\n * @returns a boolean specifying if alpha blending is needed for the mesh\n */\n needAlphaBlendingForMesh(e) {\n return e.visibility < 1 ? !0 : this._disableAlphaBlending ? !1 : e.hasVertexAlpha || this.needAlphaBlending();\n }\n /**\n * Specifies whether or not this material should be rendered in alpha test mode.\n * @returns a boolean specifying if an alpha test is needed.\n */\n needAlphaTesting() {\n return !!this._forceAlphaTest;\n }\n /**\n * Specifies if material alpha testing should be turned on for the mesh\n * @param mesh defines the mesh to check\n * @returns a boolean specifying if alpha testing should be turned on for the mesh\n */\n _shouldTurnAlphaTestOn(e) {\n return !this.needAlphaBlendingForMesh(e) && this.needAlphaTesting();\n }\n /**\n * Gets the texture used for the alpha test\n * @returns the texture to use for alpha testing\n */\n getAlphaTestTexture() {\n return null;\n }\n /**\n * Marks the material to indicate that it needs to be re-calculated\n * @param forceMaterialDirty - Forces the material to be marked as dirty for all components (same as this.markAsDirty(Material.AllDirtyFlag)). You should use this flag if the material is frozen and you want to force a recompilation.\n */\n markDirty(e = !1) {\n const t = this.getScene().meshes;\n for (const i of t)\n if (i.subMeshes) {\n for (const r of i.subMeshes)\n if (r.getMaterial() === this)\n for (const s of r._drawWrappers)\n s && this._materialContext === s.materialContext && (s._wasPreviouslyReady = !1, s._wasPreviouslyUsingInstances = null, s._forceRebindOnNextCall = e);\n }\n e && this.markAsDirty(ie.AllDirtyFlag);\n }\n /**\n * @internal\n */\n _preBind(e, t = null) {\n const i = this._scene.getEngine(), s = (t ?? this.sideOrientation) === ie.ClockWiseSideOrientation;\n return i.enableEffect(e || this._getDrawWrapper()), i.setState(this.backFaceCulling, this.zOffset, !1, s, this._scene._mirroredCameraPosition ? !this.cullBackFaces : this.cullBackFaces, this.stencil, this.zOffsetUnits), s;\n }\n /**\n * Binds the material to the mesh\n * @param world defines the world transformation matrix\n * @param mesh defines the mesh to bind the material to\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n bind(e, t) {\n }\n /**\n * Initializes the uniform buffer layout for the shader.\n */\n buildUniformLayout() {\n const e = this._uniformBuffer;\n this._eventInfo.ubo = e, this._callbackPluginEventGeneric(Ri.PrepareUniformBuffer, this._eventInfo), e.create(), this._uniformBufferLayoutBuilt = !0;\n }\n /**\n * Binds the submesh to the material\n * @param world defines the world transformation matrix\n * @param mesh defines the mesh containing the submesh\n * @param subMesh defines the submesh to bind the material to\n */\n bindForSubMesh(e, t, i) {\n const r = i._drawWrapper;\n this._eventInfo.subMesh = i, this._callbackPluginEventBindForSubMesh(this._eventInfo), r._forceRebindOnNextCall = !1;\n }\n /**\n * Binds the world matrix to the material\n * @param world defines the world transformation matrix\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n bindOnlyWorldMatrix(e) {\n }\n /**\n * Binds the view matrix to the effect\n * @param effect defines the effect to bind the view matrix to\n */\n bindView(e) {\n this._useUBO ? this._needToBindSceneUbo = !0 : e.setMatrix(\"view\", this.getScene().getViewMatrix());\n }\n /**\n * Binds the view projection and projection matrices to the effect\n * @param effect defines the effect to bind the view projection and projection matrices to\n */\n bindViewProjection(e) {\n this._useUBO ? this._needToBindSceneUbo = !0 : (e.setMatrix(\"viewProjection\", this.getScene().getTransformMatrix()), e.setMatrix(\"projection\", this.getScene().getProjectionMatrix()));\n }\n /**\n * Binds the view matrix to the effect\n * @param effect defines the effect to bind the view matrix to\n * @param variableName name of the shader variable that will hold the eye position\n */\n bindEyePosition(e, t) {\n this._useUBO ? this._needToBindSceneUbo = !0 : this._scene.bindEyePosition(e, t);\n }\n /**\n * Processes to execute after binding the material to a mesh\n * @param mesh defines the rendered mesh\n * @param effect defines the effect used to bind the material\n * @param _subMesh defines the subMesh that the material has been bound for\n */\n _afterBind(e, t = null, i) {\n if (this._scene._cachedMaterial = this, this._needToBindSceneUbo && t && (this._needToBindSceneUbo = !1, $_(t, this.getScene().getSceneUniformBuffer()), this._scene.finalizeSceneUbo()), e ? this._scene._cachedVisibility = e.visibility : this._scene._cachedVisibility = 1, this._onBindObservable && e && this._onBindObservable.notifyObservers(e), this.disableDepthWrite) {\n const r = this._scene.getEngine();\n this._cachedDepthWriteState = r.getDepthWrite(), r.setDepthWrite(!1);\n }\n if (this.disableColorWrite) {\n const r = this._scene.getEngine();\n this._cachedColorWriteState = r.getColorWrite(), r.setColorWrite(!1);\n }\n if (this.depthFunction !== 0) {\n const r = this._scene.getEngine();\n this._cachedDepthFunctionState = r.getDepthFunction() || 0, r.setDepthFunction(this.depthFunction);\n }\n }\n /**\n * Unbinds the material from the mesh\n */\n unbind() {\n this._onUnBindObservable && this._onUnBindObservable.notifyObservers(this), this.depthFunction !== 0 && this._scene.getEngine().setDepthFunction(this._cachedDepthFunctionState), this.disableDepthWrite && this._scene.getEngine().setDepthWrite(this._cachedDepthWriteState), this.disableColorWrite && this._scene.getEngine().setColorWrite(this._cachedColorWriteState);\n }\n /**\n * Returns the animatable textures.\n * @returns - Array of animatable textures.\n */\n getAnimatables() {\n return this._eventInfo.animatables = [], this._callbackPluginEventGeneric(Ri.GetAnimatables, this._eventInfo), this._eventInfo.animatables;\n }\n /**\n * Gets the active textures from the material\n * @returns an array of textures\n */\n getActiveTextures() {\n return this._eventInfo.activeTextures = [], this._callbackPluginEventGeneric(Ri.GetActiveTextures, this._eventInfo), this._eventInfo.activeTextures;\n }\n /**\n * Specifies if the material uses a texture\n * @param texture defines the texture to check against the material\n * @returns a boolean specifying if the material uses the texture\n */\n hasTexture(e) {\n return this._eventInfo.hasTexture = !1, this._eventInfo.texture = e, this._callbackPluginEventGeneric(Ri.HasTexture, this._eventInfo), this._eventInfo.hasTexture;\n }\n /**\n * Makes a duplicate of the material, and gives it a new name\n * @param name defines the new name for the duplicated material\n * @returns the cloned material\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n clone(e) {\n return null;\n }\n _clonePlugins(e, t) {\n const i = {};\n if (this._serializePlugins(i), ie._ParsePlugins(i, e, this._scene, t), this.pluginManager)\n for (const r of this.pluginManager._plugins) {\n const s = e.pluginManager.getPlugin(r.name);\n s && r.copyTo(s);\n }\n }\n /**\n * Gets the meshes bound to the material\n * @returns an array of meshes bound to the material\n */\n getBindedMeshes() {\n if (this.meshMap) {\n const e = [];\n for (const t in this.meshMap) {\n const i = this.meshMap[t];\n i && e.push(i);\n }\n return e;\n } else\n return this._scene.meshes.filter((t) => t.material === this);\n }\n /**\n * Force shader compilation\n * @param mesh defines the mesh associated with this material\n * @param onCompiled defines a function to execute once the material is compiled\n * @param options defines the options to configure the compilation\n * @param onError defines a function to execute if the material fails compiling\n */\n forceCompilation(e, t, i, r) {\n const s = {\n clipPlane: !1,\n useInstances: !1,\n ...i\n }, a = this.getScene(), o = this.allowShaderHotSwapping;\n this.allowShaderHotSwapping = !1;\n const l = () => {\n if (!this._scene || !this._scene.getEngine())\n return;\n const c = a.clipPlane;\n if (s.clipPlane && (a.clipPlane = new Yr(0, 0, 0, 1)), this._storeEffectOnSubMeshes) {\n let h = !0, u = null;\n if (e.subMeshes) {\n const f = new bi(0, 0, 0, 0, 0, e, void 0, !1, !1);\n f.materialDefines && (f.materialDefines._renderId = -1), this.isReadyForSubMesh(e, f, s.useInstances) || (f.effect && f.effect.getCompilationError() && f.effect.allFallbacksProcessed() ? u = f.effect.getCompilationError() : (h = !1, setTimeout(l, 16)));\n }\n h && (this.allowShaderHotSwapping = o, u && r && r(u), t && t(this));\n } else\n this.isReady() ? (this.allowShaderHotSwapping = o, t && t(this)) : setTimeout(l, 16);\n s.clipPlane && (a.clipPlane = c);\n };\n l();\n }\n /**\n * Force shader compilation\n * @param mesh defines the mesh that will use this material\n * @param options defines additional options for compiling the shaders\n * @returns a promise that resolves when the compilation completes\n */\n forceCompilationAsync(e, t) {\n return new Promise((i, r) => {\n this.forceCompilation(e, () => {\n i();\n }, t, (s) => {\n r(s);\n });\n });\n }\n /**\n * Marks a define in the material to indicate that it needs to be re-computed\n * @param flag defines a flag used to determine which parts of the material have to be marked as dirty\n */\n markAsDirty(e) {\n this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism || (ie._DirtyCallbackArray.length = 0, e & ie.TextureDirtyFlag && ie._DirtyCallbackArray.push(ie._TextureDirtyCallBack), e & ie.LightDirtyFlag && ie._DirtyCallbackArray.push(ie._LightsDirtyCallBack), e & ie.FresnelDirtyFlag && ie._DirtyCallbackArray.push(ie._FresnelDirtyCallBack), e & ie.AttributesDirtyFlag && ie._DirtyCallbackArray.push(ie._AttributeDirtyCallBack), e & ie.MiscDirtyFlag && ie._DirtyCallbackArray.push(ie._MiscDirtyCallBack), e & ie.PrePassDirtyFlag && ie._DirtyCallbackArray.push(ie._PrePassDirtyCallBack), ie._DirtyCallbackArray.length && this._markAllSubMeshesAsDirty(ie._RunDirtyCallBacks), this.getScene().resetCachedMaterial());\n }\n /**\n * Resets the draw wrappers cache for all submeshes that are using this material\n */\n resetDrawCache() {\n const e = this.getScene().meshes;\n for (const t of e)\n if (t.subMeshes)\n for (const i of t.subMeshes)\n i.getMaterial() === this && i.resetDrawCache();\n }\n /**\n * Marks all submeshes of a material to indicate that their material defines need to be re-calculated\n * @param func defines a function which checks material defines against the submeshes\n */\n _markAllSubMeshesAsDirty(e) {\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism)\n return;\n const t = this.getScene().meshes;\n for (const i of t)\n if (i.subMeshes) {\n for (const r of i.subMeshes)\n if (r.getMaterial(!1) === this)\n for (const s of r._drawWrappers)\n !s || !s.defines || !s.defines.markAllAsDirty || this._materialContext === s.materialContext && e(s.defines);\n }\n }\n /**\n * Indicates that the scene should check if the rendering now needs a prepass\n */\n _markScenePrePassDirty() {\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism)\n return;\n const e = this.getScene().enablePrePassRenderer();\n e && e.markAsDirty();\n }\n /**\n * Indicates that we need to re-calculated for all submeshes\n */\n _markAllSubMeshesAsAllDirty() {\n this._markAllSubMeshesAsDirty(ie._AllDirtyCallBack);\n }\n /**\n * Indicates that image processing needs to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsImageProcessingDirty() {\n this._markAllSubMeshesAsDirty(ie._ImageProcessingDirtyCallBack);\n }\n /**\n * Indicates that textures need to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsTexturesDirty() {\n this._markAllSubMeshesAsDirty(ie._TextureDirtyCallBack);\n }\n /**\n * Indicates that fresnel needs to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsFresnelDirty() {\n this._markAllSubMeshesAsDirty(ie._FresnelDirtyCallBack);\n }\n /**\n * Indicates that fresnel and misc need to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsFresnelAndMiscDirty() {\n this._markAllSubMeshesAsDirty(ie._FresnelAndMiscDirtyCallBack);\n }\n /**\n * Indicates that lights need to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsLightsDirty() {\n this._markAllSubMeshesAsDirty(ie._LightsDirtyCallBack);\n }\n /**\n * Indicates that attributes need to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsAttributesDirty() {\n this._markAllSubMeshesAsDirty(ie._AttributeDirtyCallBack);\n }\n /**\n * Indicates that misc needs to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsMiscDirty() {\n this._markAllSubMeshesAsDirty(ie._MiscDirtyCallBack);\n }\n /**\n * Indicates that prepass needs to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsPrePassDirty() {\n this._markAllSubMeshesAsDirty(ie._MiscDirtyCallBack);\n }\n /**\n * Indicates that textures and misc need to be re-calculated for all submeshes\n */\n _markAllSubMeshesAsTexturesAndMiscDirty() {\n this._markAllSubMeshesAsDirty(ie._TextureAndMiscDirtyCallBack);\n }\n _checkScenePerformancePriority() {\n if (this._scene.performancePriority !== fs.BackwardCompatible) {\n this.checkReadyOnlyOnce = !0;\n const e = this._scene.onScenePerformancePriorityChangedObservable.addOnce(() => {\n this.checkReadyOnlyOnce = !1;\n });\n this.onDisposeObservable.add(() => {\n this._scene.onScenePerformancePriorityChangedObservable.remove(e);\n });\n }\n }\n /**\n * Sets the required values to the prepass renderer.\n * @param prePassRenderer defines the prepass renderer to setup.\n * @returns true if the pre pass is needed.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setPrePassRenderer(e) {\n return !1;\n }\n /**\n * Disposes the material\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\n * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh\n */\n dispose(e, t, i) {\n const r = this.getScene();\n if (r.stopAnimation(this), r.freeProcessedMaterials(), r.removeMaterial(this), this._eventInfo.forceDisposeTextures = t, this._callbackPluginEventGeneric(Ri.Disposed, this._eventInfo), this._parentContainer) {\n const s = this._parentContainer.materials.indexOf(this);\n s > -1 && this._parentContainer.materials.splice(s, 1), this._parentContainer = null;\n }\n if (i !== !0)\n if (this.meshMap)\n for (const s in this.meshMap) {\n const a = this.meshMap[s];\n a && (a.material = null, this.releaseVertexArrayObject(a, e));\n }\n else {\n const s = r.meshes;\n for (const a of s)\n a.material === this && !a.sourceMesh && (a.material = null, this.releaseVertexArrayObject(a, e));\n }\n this._uniformBuffer.dispose(), e && this._drawWrapper.effect && (this._storeEffectOnSubMeshes || this._drawWrapper.effect.dispose(), this._drawWrapper.effect = null), this.metadata = null, this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear(), this._onBindObservable && this._onBindObservable.clear(), this._onUnBindObservable && this._onUnBindObservable.clear(), this._onEffectCreatedObservable && this._onEffectCreatedObservable.clear(), this._eventInfo && (this._eventInfo = {});\n }\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n releaseVertexArrayObject(e, t) {\n const i = e.geometry;\n if (i)\n if (this._storeEffectOnSubMeshes) {\n if (e.subMeshes)\n for (const r of e.subMeshes)\n i._releaseVertexArrayObject(r.effect), t && r.effect && r.effect.dispose();\n } else\n i._releaseVertexArrayObject(this._drawWrapper.effect);\n }\n /**\n * Serializes this material\n * @returns the serialized material object\n */\n serialize() {\n const e = Le.Serialize(this);\n return e.stencil = this.stencil.serialize(), e.uniqueId = this.uniqueId, this._serializePlugins(e), e;\n }\n _serializePlugins(e) {\n if (e.plugins = {}, this.pluginManager)\n for (const t of this.pluginManager._plugins)\n e.plugins[t.getClassName()] = t.serialize();\n }\n /**\n * Creates a material from parsed material data\n * @param parsedMaterial defines parsed material data\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures\n * @returns a new material\n */\n static Parse(e, t, i) {\n if (!e.customType)\n e.customType = \"BABYLON.StandardMaterial\";\n else if (e.customType === \"BABYLON.PBRMaterial\" && e.overloadedAlbedo && (e.customType = \"BABYLON.LegacyPBRMaterial\", !BABYLON.LegacyPBRMaterial))\n return ne.Error(\"Your scene is trying to load a legacy version of the PBRMaterial, please, include it from the materials library.\"), null;\n const s = ge.Instantiate(e.customType).Parse(e, t, i);\n return s._loadedUniqueId = e.uniqueId, s;\n }\n static _ParsePlugins(e, t, i, r) {\n var s;\n if (e.plugins)\n for (const a in e.plugins) {\n const o = e.plugins[a];\n let l = (s = t.pluginManager) == null ? void 0 : s.getPlugin(o.name);\n if (!l) {\n const c = ge.Instantiate(\"BABYLON.\" + a);\n c && (l = new c(t));\n }\n l == null || l.parse(o, i, r);\n }\n }\n}\nie.TriangleFillMode = 0;\nie.WireFrameFillMode = 1;\nie.PointFillMode = 2;\nie.PointListDrawMode = 3;\nie.LineListDrawMode = 4;\nie.LineLoopDrawMode = 5;\nie.LineStripDrawMode = 6;\nie.TriangleStripDrawMode = 7;\nie.TriangleFanDrawMode = 8;\nie.ClockWiseSideOrientation = 0;\nie.CounterClockWiseSideOrientation = 1;\nie.TextureDirtyFlag = 1;\nie.LightDirtyFlag = 2;\nie.FresnelDirtyFlag = 4;\nie.AttributesDirtyFlag = 8;\nie.MiscDirtyFlag = 16;\nie.PrePassDirtyFlag = 32;\nie.AllDirtyFlag = 63;\nie.MATERIAL_OPAQUE = 0;\nie.MATERIAL_ALPHATEST = 1;\nie.MATERIAL_ALPHABLEND = 2;\nie.MATERIAL_ALPHATESTANDBLEND = 3;\nie.MATERIAL_NORMALBLENDMETHOD_WHITEOUT = 0;\nie.MATERIAL_NORMALBLENDMETHOD_RNM = 1;\nie.OnEventObservable = new he();\nie._AllDirtyCallBack = (n) => n.markAllAsDirty();\nie._ImageProcessingDirtyCallBack = (n) => n.markAsImageProcessingDirty();\nie._TextureDirtyCallBack = (n) => n.markAsTexturesDirty();\nie._FresnelDirtyCallBack = (n) => n.markAsFresnelDirty();\nie._MiscDirtyCallBack = (n) => n.markAsMiscDirty();\nie._PrePassDirtyCallBack = (n) => n.markAsPrePassDirty();\nie._LightsDirtyCallBack = (n) => n.markAsLightDirty();\nie._AttributeDirtyCallBack = (n) => n.markAsAttributesDirty();\nie._FresnelAndMiscDirtyCallBack = (n) => {\n ie._FresnelDirtyCallBack(n), ie._MiscDirtyCallBack(n);\n};\nie._TextureAndMiscDirtyCallBack = (n) => {\n ie._TextureDirtyCallBack(n), ie._MiscDirtyCallBack(n);\n};\nie._DirtyCallbackArray = [];\nie._RunDirtyCallBacks = (n) => {\n for (const e of ie._DirtyCallbackArray)\n e(n);\n};\nP([\n w()\n], ie.prototype, \"id\", void 0);\nP([\n w()\n], ie.prototype, \"uniqueId\", void 0);\nP([\n w()\n], ie.prototype, \"name\", void 0);\nP([\n w()\n], ie.prototype, \"metadata\", void 0);\nP([\n w()\n], ie.prototype, \"checkReadyOnEveryCall\", void 0);\nP([\n w()\n], ie.prototype, \"checkReadyOnlyOnce\", void 0);\nP([\n w()\n], ie.prototype, \"state\", void 0);\nP([\n w(\"alpha\")\n], ie.prototype, \"_alpha\", void 0);\nP([\n w(\"backFaceCulling\")\n], ie.prototype, \"_backFaceCulling\", void 0);\nP([\n w(\"cullBackFaces\")\n], ie.prototype, \"_cullBackFaces\", void 0);\nP([\n w()\n], ie.prototype, \"sideOrientation\", void 0);\nP([\n w(\"alphaMode\")\n], ie.prototype, \"_alphaMode\", void 0);\nP([\n w()\n], ie.prototype, \"_needDepthPrePass\", void 0);\nP([\n w()\n], ie.prototype, \"disableDepthWrite\", void 0);\nP([\n w()\n], ie.prototype, \"disableColorWrite\", void 0);\nP([\n w()\n], ie.prototype, \"forceDepthWrite\", void 0);\nP([\n w()\n], ie.prototype, \"depthFunction\", void 0);\nP([\n w()\n], ie.prototype, \"separateCullingPass\", void 0);\nP([\n w(\"fogEnabled\")\n], ie.prototype, \"_fogEnabled\", void 0);\nP([\n w()\n], ie.prototype, \"pointSize\", void 0);\nP([\n w()\n], ie.prototype, \"zOffset\", void 0);\nP([\n w()\n], ie.prototype, \"zOffsetUnits\", void 0);\nP([\n w()\n], ie.prototype, \"pointsCloud\", null);\nP([\n w()\n], ie.prototype, \"fillMode\", null);\nP([\n w()\n], ie.prototype, \"useLogarithmicDepth\", null);\nP([\n w()\n], ie.prototype, \"transparencyMode\", null);\nclass Aa extends ie {\n /**\n * Gets or Sets the list of Materials used within the multi material.\n * They need to be ordered according to the submeshes order in the associated mesh\n */\n get subMaterials() {\n return this._subMaterials;\n }\n set subMaterials(e) {\n this._subMaterials = e, this._hookArray(e);\n }\n /**\n * Function used to align with Node.getChildren()\n * @returns the list of Materials used within the multi material\n */\n getChildren() {\n return this.subMaterials;\n }\n /**\n * Instantiates a new Multi Material\n * A multi-material is used to apply different materials to different parts of the same object without the need of\n * separate meshes. This can be use to improve performances.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials\n * @param name Define the name in the scene\n * @param scene Define the scene the material belongs to\n */\n constructor(e, t) {\n super(e, t, !0), this._waitingSubMaterialsUniqueIds = [], this.getScene().addMultiMaterial(this), this.subMaterials = [], this._storeEffectOnSubMeshes = !0;\n }\n _hookArray(e) {\n const t = e.push;\n e.push = (...r) => {\n const s = t.apply(e, r);\n return this._markAllSubMeshesAsTexturesDirty(), s;\n };\n const i = e.splice;\n e.splice = (r, s) => {\n const a = i.apply(e, [r, s]);\n return this._markAllSubMeshesAsTexturesDirty(), a;\n };\n }\n /**\n * Get one of the submaterial by its index in the submaterials array\n * @param index The index to look the sub material at\n * @returns The Material if the index has been defined\n */\n getSubMaterial(e) {\n return e < 0 || e >= this.subMaterials.length ? this.getScene().defaultMaterial : this.subMaterials[e];\n }\n /**\n * Get the list of active textures for the whole sub materials list.\n * @returns All the textures that will be used during the rendering\n */\n getActiveTextures() {\n return super.getActiveTextures().concat(...this.subMaterials.map((e) => e ? e.getActiveTextures() : []));\n }\n /**\n * Specifies if any sub-materials of this multi-material use a given texture.\n * @param texture Defines the texture to check against this multi-material's sub-materials.\n * @returns A boolean specifying if any sub-material of this multi-material uses the texture.\n */\n hasTexture(e) {\n var t;\n if (super.hasTexture(e))\n return !0;\n for (let i = 0; i < this.subMaterials.length; i++)\n if ((t = this.subMaterials[i]) != null && t.hasTexture(e))\n return !0;\n return !1;\n }\n /**\n * Gets the current class name of the material e.g. \"MultiMaterial\"\n * Mainly use in serialization.\n * @returns the class name\n */\n getClassName() {\n return \"MultiMaterial\";\n }\n /**\n * Checks if the material is ready to render the requested sub mesh\n * @param mesh Define the mesh the submesh belongs to\n * @param subMesh Define the sub mesh to look readiness for\n * @param useInstances Define whether or not the material is used with instances\n * @returns true if ready, otherwise false\n */\n isReadyForSubMesh(e, t, i) {\n for (let r = 0; r < this.subMaterials.length; r++) {\n const s = this.subMaterials[r];\n if (s) {\n if (s._storeEffectOnSubMeshes) {\n if (!s.isReadyForSubMesh(e, t, i))\n return !1;\n continue;\n }\n if (!s.isReady(e))\n return !1;\n }\n }\n return !0;\n }\n /**\n * Clones the current material and its related sub materials\n * @param name Define the name of the newly cloned material\n * @param cloneChildren Define if submaterial will be cloned or shared with the parent instance\n * @returns the cloned material\n */\n clone(e, t) {\n const i = new Aa(e, this.getScene());\n for (let r = 0; r < this.subMaterials.length; r++) {\n let s = null;\n const a = this.subMaterials[r];\n t && a ? s = a.clone(e + \"-\" + a.name) : s = this.subMaterials[r], i.subMaterials.push(s);\n }\n return i;\n }\n /**\n * Serializes the materials into a JSON representation.\n * @returns the JSON representation\n */\n serialize() {\n const e = {};\n e.name = this.name, e.id = this.id, e.uniqueId = this.uniqueId, rt && (e.tags = rt.GetTags(this)), e.materialsUniqueIds = [], e.materials = [];\n for (let t = 0; t < this.subMaterials.length; t++) {\n const i = this.subMaterials[t];\n i ? (e.materialsUniqueIds.push(i.uniqueId), e.materials.push(i.id)) : (e.materialsUniqueIds.push(null), e.materials.push(null));\n }\n return e;\n }\n /**\n * Dispose the material and release its associated resources\n * @param forceDisposeEffect Define if we want to force disposing the associated effect (if false the shader is not released and could be reuse later on)\n * @param forceDisposeTextures Define if we want to force disposing the associated textures (if false, they will not be disposed and can still be use elsewhere in the app)\n * @param forceDisposeChildren Define if we want to force disposing the associated submaterials (if false, they will not be disposed and can still be use elsewhere in the app)\n */\n dispose(e, t, i) {\n const r = this.getScene();\n if (!r)\n return;\n if (i)\n for (let a = 0; a < this.subMaterials.length; a++) {\n const o = this.subMaterials[a];\n o && o.dispose(e, t);\n }\n const s = r.multiMaterials.indexOf(this);\n s >= 0 && r.multiMaterials.splice(s, 1), super.dispose(e, t);\n }\n /**\n * Creates a MultiMaterial from parsed MultiMaterial data.\n * @param parsedMultiMaterial defines parsed MultiMaterial data.\n * @param scene defines the hosting scene\n * @returns a new MultiMaterial\n */\n static ParseMultiMaterial(e, t) {\n const i = new Aa(e.name, t);\n return i.id = e.id, i._loadedUniqueId = e.uniqueId, rt && rt.AddTagsTo(i, e.tags), e.materialsUniqueIds ? i._waitingSubMaterialsUniqueIds = e.materialsUniqueIds : e.materials.forEach((r) => i.subMaterials.push(t.getLastMaterialById(r))), i;\n }\n}\nRe(\"BABYLON.MultiMaterial\", Aa);\nclass aI {\n /**\n * Creates a new LOD level\n * @param distanceOrScreenCoverage defines either the distance or the screen coverage where this level should start being displayed\n * @param mesh defines the mesh to use to render this level\n */\n constructor(e, t) {\n this.distanceOrScreenCoverage = e, this.mesh = t;\n }\n}\nclass o0 {\n}\nclass oI {\n constructor() {\n this.visibleInstances = {}, this.batchCache = new fg(), this.batchCacheReplacementModeInFrozenMode = new fg(), this.instancesBufferSize = 32 * 16 * 4;\n }\n}\nclass fg {\n constructor() {\n this.mustReturn = !1, this.visibleInstances = new Array(), this.renderSelf = [], this.hardwareInstancedRendering = [];\n }\n}\nclass lI {\n constructor() {\n this.instancesCount = 0, this.matrixBuffer = null, this.previousMatrixBuffer = null, this.matrixBufferSize = 32 * 16, this.matrixData = null, this.boundingVectors = [], this.worldMatrices = null;\n }\n}\nclass cI {\n constructor() {\n this._areNormalsFrozen = !1, this._source = null, this.meshMap = null, this._preActivateId = -1, this._LODLevels = new Array(), this._useLODScreenCoverage = !1, this._effectiveMaterial = null, this._forcedInstanceCount = 0, this._overrideRenderingFillMode = null;\n }\n}\nclass B extends er {\n /**\n * Gets the default side orientation.\n * @param orientation the orientation to value to attempt to get\n * @returns the default orientation\n * @internal\n */\n static _GetDefaultSideOrientation(e) {\n return e || B.FRONTSIDE;\n }\n /**\n * Determines if the LOD levels are intended to be calculated using screen coverage (surface area ratio) instead of distance.\n */\n get useLODScreenCoverage() {\n return this._internalMeshDataInfo._useLODScreenCoverage;\n }\n set useLODScreenCoverage(e) {\n this._internalMeshDataInfo._useLODScreenCoverage = e, this._sortLODLevels();\n }\n get computeBonesUsingShaders() {\n return this._internalAbstractMeshDataInfo._computeBonesUsingShaders;\n }\n set computeBonesUsingShaders(e) {\n this._internalAbstractMeshDataInfo._computeBonesUsingShaders !== e && (e && this._internalMeshDataInfo._sourcePositions && (this.setVerticesData(I.PositionKind, this._internalMeshDataInfo._sourcePositions, !0), this._internalMeshDataInfo._sourceNormals && this.setVerticesData(I.NormalKind, this._internalMeshDataInfo._sourceNormals, !0), this._internalMeshDataInfo._sourcePositions = null, this._internalMeshDataInfo._sourceNormals = null), this._internalAbstractMeshDataInfo._computeBonesUsingShaders = e, this._markSubMeshesAsAttributesDirty());\n }\n /**\n * An event triggered before rendering the mesh\n */\n get onBeforeRenderObservable() {\n return this._internalMeshDataInfo._onBeforeRenderObservable || (this._internalMeshDataInfo._onBeforeRenderObservable = new he()), this._internalMeshDataInfo._onBeforeRenderObservable;\n }\n /**\n * An event triggered before binding the mesh\n */\n get onBeforeBindObservable() {\n return this._internalMeshDataInfo._onBeforeBindObservable || (this._internalMeshDataInfo._onBeforeBindObservable = new he()), this._internalMeshDataInfo._onBeforeBindObservable;\n }\n /**\n * An event triggered after rendering the mesh\n */\n get onAfterRenderObservable() {\n return this._internalMeshDataInfo._onAfterRenderObservable || (this._internalMeshDataInfo._onAfterRenderObservable = new he()), this._internalMeshDataInfo._onAfterRenderObservable;\n }\n /**\n * An event triggeredbetween rendering pass when using separateCullingPass = true\n */\n get onBetweenPassObservable() {\n return this._internalMeshDataInfo._onBetweenPassObservable || (this._internalMeshDataInfo._onBetweenPassObservable = new he()), this._internalMeshDataInfo._onBetweenPassObservable;\n }\n /**\n * An event triggered before drawing the mesh\n */\n get onBeforeDrawObservable() {\n return this._internalMeshDataInfo._onBeforeDrawObservable || (this._internalMeshDataInfo._onBeforeDrawObservable = new he()), this._internalMeshDataInfo._onBeforeDrawObservable;\n }\n /**\n * Sets a callback to call before drawing the mesh. It is recommended to use onBeforeDrawObservable instead\n */\n set onBeforeDraw(e) {\n this._onBeforeDrawObserver && this.onBeforeDrawObservable.remove(this._onBeforeDrawObserver), this._onBeforeDrawObserver = this.onBeforeDrawObservable.add(e);\n }\n get hasInstances() {\n return this.instances.length > 0;\n }\n get hasThinInstances() {\n return (this.forcedInstanceCount || this._thinInstanceDataStorage.instancesCount || 0) > 0;\n }\n /**\n * Gets or sets the forced number of instances to display.\n * If 0 (default value), the number of instances is not forced and depends on the draw type\n * (regular / instance / thin instances mesh)\n */\n get forcedInstanceCount() {\n return this._internalMeshDataInfo._forcedInstanceCount;\n }\n set forcedInstanceCount(e) {\n this._internalMeshDataInfo._forcedInstanceCount = e;\n }\n /**\n * Use this property to override the Material's fillMode value\n */\n get overrideRenderingFillMode() {\n return this._internalMeshDataInfo._overrideRenderingFillMode;\n }\n set overrideRenderingFillMode(e) {\n this._internalMeshDataInfo._overrideRenderingFillMode = e;\n }\n /**\n * Gets the source mesh (the one used to clone this one from)\n */\n get source() {\n return this._internalMeshDataInfo._source;\n }\n /**\n * Gets the list of clones of this mesh\n * The scene must have been constructed with useClonedMeshMap=true for this to work!\n * Note that useClonedMeshMap=true is the default setting\n */\n get cloneMeshMap() {\n return this._internalMeshDataInfo.meshMap;\n }\n /**\n * Gets or sets a boolean indicating that this mesh does not use index buffer\n */\n get isUnIndexed() {\n return this._unIndexed;\n }\n set isUnIndexed(e) {\n this._unIndexed !== e && (this._unIndexed = e, this._markSubMeshesAsAttributesDirty());\n }\n /** Gets the array buffer used to store the instanced buffer used for instances' world matrices */\n get worldMatrixInstancedBuffer() {\n return this._instanceDataStorage.instancesData;\n }\n /** Gets the array buffer used to store the instanced buffer used for instances' previous world matrices */\n get previousWorldMatrixInstancedBuffer() {\n return this._instanceDataStorage.instancesPreviousData;\n }\n /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */\n get manualUpdateOfWorldMatrixInstancedBuffer() {\n return this._instanceDataStorage.manualUpdate;\n }\n set manualUpdateOfWorldMatrixInstancedBuffer(e) {\n this._instanceDataStorage.manualUpdate = e;\n }\n /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */\n get manualUpdateOfPreviousWorldMatrixInstancedBuffer() {\n return this._instanceDataStorage.previousManualUpdate;\n }\n set manualUpdateOfPreviousWorldMatrixInstancedBuffer(e) {\n this._instanceDataStorage.previousManualUpdate = e;\n }\n /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices must be performed in all cases (and notably even in frozen mode) */\n get forceWorldMatrixInstancedBufferUpdate() {\n return this._instanceDataStorage.forceMatrixUpdates;\n }\n set forceWorldMatrixInstancedBufferUpdate(e) {\n this._instanceDataStorage.forceMatrixUpdates = e;\n }\n /**\n * @constructor\n * @param name The value used by scene.getMeshByName() to do a lookup.\n * @param scene The scene to add this mesh to.\n * @param parent The parent of this mesh, if it has one\n * @param source An optional Mesh from which geometry is shared, cloned.\n * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False.\n * When false, achieved by calling a clone(), also passing False.\n * This will make creation of children, recursive.\n * @param clonePhysicsImpostor When cloning, include cloning mesh physics impostor, default True.\n */\n constructor(e, t = null, i = null, r = null, s, a = !0) {\n if (super(e, t), this._internalMeshDataInfo = new cI(), this.delayLoadState = 0, this.instances = [], this._creationDataStorage = null, this._geometry = null, this._instanceDataStorage = new oI(), this._thinInstanceDataStorage = new lI(), this._shouldGenerateFlatShading = !1, this._originalBuilderSideOrientation = B.DEFAULTSIDE, this.overrideMaterialSideOrientation = null, this.ignoreCameraMaxZ = !1, t = this.getScene(), this._onBeforeDraw = (o, l, c) => {\n o && c && (this._uniformBuffer ? this.transferToEffect(l) : c.bindOnlyWorldMatrix(l));\n }, r) {\n if (r._geometry && r._geometry.applyToMesh(this), Dn.DeepCopy(r, this, [\n \"name\",\n \"material\",\n \"skeleton\",\n \"instances\",\n \"parent\",\n \"uniqueId\",\n \"source\",\n \"metadata\",\n \"morphTargetManager\",\n \"hasInstances\",\n \"worldMatrixInstancedBuffer\",\n \"previousWorldMatrixInstancedBuffer\",\n \"hasLODLevels\",\n \"geometry\",\n \"isBlocked\",\n \"areNormalsFrozen\",\n \"facetNb\",\n \"isFacetDataEnabled\",\n \"lightSources\",\n \"useBones\",\n \"isAnInstance\",\n \"collider\",\n \"edgesRenderer\",\n \"forward\",\n \"up\",\n \"right\",\n \"absolutePosition\",\n \"absoluteScaling\",\n \"absoluteRotationQuaternion\",\n \"isWorldMatrixFrozen\",\n \"nonUniformScaling\",\n \"behaviors\",\n \"worldMatrixFromCache\",\n \"hasThinInstances\",\n \"cloneMeshMap\",\n \"hasBoundingInfo\",\n \"physicsBody\",\n \"physicsImpostor\"\n ], [\"_poseMatrix\"]), this._internalMeshDataInfo._source = r, t.useClonedMeshMap && (r._internalMeshDataInfo.meshMap || (r._internalMeshDataInfo.meshMap = {}), r._internalMeshDataInfo.meshMap[this.uniqueId] = this), this._originalBuilderSideOrientation = r._originalBuilderSideOrientation, this._creationDataStorage = r._creationDataStorage, r._ranges) {\n const o = r._ranges;\n for (const l in o)\n Object.prototype.hasOwnProperty.call(o, l) && o[l] && this.createAnimationRange(l, o[l].from, o[l].to);\n }\n if (r.metadata && r.metadata.clone ? this.metadata = r.metadata.clone() : this.metadata = r.metadata, this._internalMetadata = r._internalMetadata, rt && rt.HasTags(r) && rt.AddTagsTo(this, rt.GetTags(r, !0)), this.setEnabled(r.isEnabled(!1)), this.parent = r.parent, this.setPivotMatrix(r.getPivotMatrix(), this._postMultiplyPivotMatrix), this.id = e + \".\" + r.id, this.material = r.material, !s) {\n const o = r.getDescendants(!0);\n for (let l = 0; l < o.length; l++) {\n const c = o[l];\n c.clone && c.clone(e + \".\" + c.name, this);\n }\n }\n if (r.morphTargetManager && (this.morphTargetManager = r.morphTargetManager), t.getPhysicsEngine) {\n const o = t.getPhysicsEngine();\n if (a && o)\n if (o.getPluginVersion() === 1) {\n const l = o.getImpostorForPhysicsObject(r);\n l && (this.physicsImpostor = l.clone(this));\n } else\n o.getPluginVersion() === 2 && r.physicsBody && r.physicsBody.clone(this);\n }\n for (let o = 0; o < t.particleSystems.length; o++) {\n const l = t.particleSystems[o];\n l.emitter === r && l.clone(l.name, this);\n }\n this.skeleton = r.skeleton, this.refreshBoundingInfo(!0, !0), this.computeWorldMatrix(!0);\n }\n i !== null && (this.parent = i), this._instanceDataStorage.hardwareInstancedRendering = this.getEngine().getCaps().instancedArrays, this._internalMeshDataInfo._onMeshReadyObserverAdded = (o) => {\n o.unregisterOnNextCall = !0, this.isReady(!0) ? this.onMeshReadyObservable.notifyObservers(this) : this._internalMeshDataInfo._checkReadinessObserver || (this._internalMeshDataInfo._checkReadinessObserver = this._scene.onBeforeRenderObservable.add(() => {\n this.isReady(!0) && (this._scene.onBeforeRenderObservable.remove(this._internalMeshDataInfo._checkReadinessObserver), this._internalMeshDataInfo._checkReadinessObserver = null, this.onMeshReadyObservable.notifyObservers(this));\n }));\n }, this.onMeshReadyObservable = new he(this._internalMeshDataInfo._onMeshReadyObserverAdded), r && r.onClonedObservable.notifyObservers(this);\n }\n instantiateHierarchy(e = null, t, i) {\n const r = this.getTotalVertices() === 0 || t && t.doNotInstantiate && (t.doNotInstantiate === !0 || t.doNotInstantiate(this)) ? this.clone(\"Clone of \" + (this.name || this.id), e || this.parent, !0) : this.createInstance(\"instance of \" + (this.name || this.id));\n r.parent = e || this.parent, r.position = this.position.clone(), r.scaling = this.scaling.clone(), this.rotationQuaternion ? r.rotationQuaternion = this.rotationQuaternion.clone() : r.rotation = this.rotation.clone(), i && i(this, r);\n for (const s of this.getChildTransformNodes(!0))\n s.getClassName() === \"InstancedMesh\" && r.getClassName() === \"Mesh\" && s.sourceMesh === this ? s.instantiateHierarchy(r, {\n doNotInstantiate: t && t.doNotInstantiate || !1,\n newSourcedMesh: r\n }, i) : s.instantiateHierarchy(r, t, i);\n return r;\n }\n /**\n * Gets the class name\n * @returns the string \"Mesh\".\n */\n getClassName() {\n return \"Mesh\";\n }\n /** @internal */\n get _isMesh() {\n return !0;\n }\n /**\n * Returns a description of this mesh\n * @param fullDetails define if full details about this mesh must be used\n * @returns a descriptive string representing this mesh\n */\n toString(e) {\n let t = super.toString(e);\n if (t += \", n vertices: \" + this.getTotalVertices(), t += \", parent: \" + (this._waitingParentId ? this._waitingParentId : this.parent ? this.parent.name : \"NONE\"), this.animations)\n for (let i = 0; i < this.animations.length; i++)\n t += \", animation[0]: \" + this.animations[i].toString(e);\n if (e)\n if (this._geometry) {\n const i = this.getIndices(), r = this.getVerticesData(I.PositionKind);\n r && i && (t += \", flat shading: \" + (r.length / 3 === i.length ? \"YES\" : \"NO\"));\n } else\n t += \", flat shading: UNKNOWN\";\n return t;\n }\n /** @internal */\n _unBindEffect() {\n super._unBindEffect();\n for (const e of this.instances)\n e._unBindEffect();\n }\n /**\n * Gets a boolean indicating if this mesh has LOD\n */\n get hasLODLevels() {\n return this._internalMeshDataInfo._LODLevels.length > 0;\n }\n /**\n * Gets the list of MeshLODLevel associated with the current mesh\n * @returns an array of MeshLODLevel\n */\n getLODLevels() {\n return this._internalMeshDataInfo._LODLevels;\n }\n _sortLODLevels() {\n const e = this._internalMeshDataInfo._useLODScreenCoverage ? -1 : 1;\n this._internalMeshDataInfo._LODLevels.sort((t, i) => t.distanceOrScreenCoverage < i.distanceOrScreenCoverage ? e : t.distanceOrScreenCoverage > i.distanceOrScreenCoverage ? -e : 0);\n }\n /**\n * Add a mesh as LOD level triggered at the given distance.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\n * @param distanceOrScreenCoverage Either distance from the center of the object to show this level or the screen coverage if `useScreenCoverage` is set to `true`.\n * If screen coverage, value is a fraction of the screen's total surface, between 0 and 1.\n * Example Playground for distance https://playground.babylonjs.com/#QE7KM#197\n * Example Playground for screen coverage https://playground.babylonjs.com/#QE7KM#196\n * @param mesh The mesh to be added as LOD level (can be null)\n * @returns This mesh (for chaining)\n */\n addLODLevel(e, t) {\n if (t && t._masterMesh)\n return ne.Warn(\"You cannot use a mesh as LOD level twice\"), this;\n const i = new aI(e, t);\n return this._internalMeshDataInfo._LODLevels.push(i), t && (t._masterMesh = this), this._sortLODLevels(), this;\n }\n /**\n * Returns the LOD level mesh at the passed distance or null if not found.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\n * @param distance The distance from the center of the object to show this level\n * @returns a Mesh or `null`\n */\n getLODLevelAtDistance(e) {\n const t = this._internalMeshDataInfo;\n for (let i = 0; i < t._LODLevels.length; i++) {\n const r = t._LODLevels[i];\n if (r.distanceOrScreenCoverage === e)\n return r.mesh;\n }\n return null;\n }\n /**\n * Remove a mesh from the LOD array\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\n * @param mesh defines the mesh to be removed\n * @returns This mesh (for chaining)\n */\n removeLODLevel(e) {\n const t = this._internalMeshDataInfo;\n for (let i = 0; i < t._LODLevels.length; i++)\n t._LODLevels[i].mesh === e && (t._LODLevels.splice(i, 1), e && (e._masterMesh = null));\n return this._sortLODLevels(), this;\n }\n /**\n * Returns the registered LOD mesh distant from the parameter `camera` position if any, else returns the current mesh.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\n * @param camera defines the camera to use to compute distance\n * @param boundingSphere defines a custom bounding sphere to use instead of the one from this mesh\n * @returns This mesh (for chaining)\n */\n getLOD(e, t) {\n const i = this._internalMeshDataInfo;\n if (!i._LODLevels || i._LODLevels.length === 0)\n return this;\n const r = t || this.getBoundingInfo().boundingSphere, s = e.mode === $e.ORTHOGRAPHIC_CAMERA ? e.minZ : r.centerWorld.subtract(e.globalPosition).length();\n let a = s, o = 1;\n if (i._useLODScreenCoverage) {\n const l = e.screenArea;\n let c = r.radiusWorld * e.minZ / s;\n c = c * c * Math.PI, a = c / l, o = -1;\n }\n if (o * i._LODLevels[i._LODLevels.length - 1].distanceOrScreenCoverage > o * a)\n return this.onLODLevelSelection && this.onLODLevelSelection(a, this, this), this;\n for (let l = 0; l < i._LODLevels.length; l++) {\n const c = i._LODLevels[l];\n if (o * c.distanceOrScreenCoverage < o * a) {\n if (c.mesh) {\n if (c.mesh.delayLoadState === 4)\n return c.mesh._checkDelayState(), this;\n if (c.mesh.delayLoadState === 2)\n return this;\n c.mesh._preActivate(), c.mesh._updateSubMeshesBoundingInfo(this.worldMatrixFromCache);\n }\n return this.onLODLevelSelection && this.onLODLevelSelection(a, this, c.mesh), c.mesh;\n }\n }\n return this.onLODLevelSelection && this.onLODLevelSelection(a, this, this), this;\n }\n /**\n * Gets the mesh internal Geometry object\n */\n get geometry() {\n return this._geometry;\n }\n /**\n * Returns the total number of vertices within the mesh geometry or zero if the mesh has no geometry.\n * @returns the total number of vertices\n */\n getTotalVertices() {\n return this._geometry === null || this._geometry === void 0 ? 0 : this._geometry.getTotalVertices();\n }\n /**\n * Returns the content of an associated vertex buffer\n * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param copyWhenShared defines a boolean indicating that if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one\n * @param forceCopy defines a boolean forcing the copy of the buffer no matter what the value of copyWhenShared is\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\n * @returns a FloatArray or null if the mesh has no geometry or no vertex buffer for this kind.\n */\n getVerticesData(e, t, i, r) {\n var a, o;\n if (!this._geometry)\n return null;\n let s = r || (o = (a = this._userInstancedBuffersStorage) == null ? void 0 : a.vertexBuffers[e]) == null ? void 0 : o.getFloatData(\n this.instances.length + 1,\n // +1 because the master mesh is not included in the instances array\n i || t && this._geometry.meshes.length !== 1\n );\n return s || (s = this._geometry.getVerticesData(e, t, i)), s;\n }\n /**\n * Returns the mesh VertexBuffer object from the requested `kind`\n * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.NormalKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\n * @returns a FloatArray or null if the mesh has no vertex buffer for this kind.\n */\n getVertexBuffer(e, t) {\n var i;\n return this._geometry ? (t || (i = this._userInstancedBuffersStorage) == null ? void 0 : i.vertexBuffers[e]) ?? this._geometry.getVertexBuffer(e) : null;\n }\n /**\n * Tests if a specific vertex buffer is associated with this mesh\n * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.NormalKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\n * @returns a boolean\n */\n isVerticesDataPresent(e, t) {\n var i;\n return this._geometry ? !t && ((i = this._userInstancedBuffersStorage) == null ? void 0 : i.vertexBuffers[e]) !== void 0 || this._geometry.isVerticesDataPresent(e) : this._delayInfo ? this._delayInfo.indexOf(e) !== -1 : !1;\n }\n /**\n * Returns a boolean defining if the vertex data for the requested `kind` is updatable.\n * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\n * @returns a boolean\n */\n isVertexBufferUpdatable(e, t) {\n var i;\n if (!this._geometry)\n return this._delayInfo ? this._delayInfo.indexOf(e) !== -1 : !1;\n if (!t) {\n const r = (i = this._userInstancedBuffersStorage) == null ? void 0 : i.vertexBuffers[e];\n if (r)\n return r.isUpdatable();\n }\n return this._geometry.isVertexBufferUpdatable(e);\n }\n /**\n * Returns a string which contains the list of existing `kinds` of Vertex Data associated with this mesh.\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\n * @returns an array of strings\n */\n getVerticesDataKinds(e) {\n if (!this._geometry) {\n const i = [];\n return this._delayInfo && this._delayInfo.forEach(function(r) {\n i.push(r);\n }), i;\n }\n const t = this._geometry.getVerticesDataKinds();\n if (!e && this._userInstancedBuffersStorage)\n for (const i in this._userInstancedBuffersStorage.vertexBuffers)\n t.indexOf(i) === -1 && t.push(i);\n return t;\n }\n /**\n * Returns a positive integer : the total number of indices in this mesh geometry.\n * @returns the numner of indices or zero if the mesh has no geometry.\n */\n getTotalIndices() {\n return this._geometry ? this._geometry.getTotalIndices() : 0;\n }\n /**\n * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices.\n * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one.\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\n * @returns the indices array or an empty array if the mesh has no geometry\n */\n getIndices(e, t) {\n return this._geometry ? this._geometry.getIndices(e, t) : [];\n }\n get isBlocked() {\n return this._masterMesh !== null && this._masterMesh !== void 0;\n }\n /**\n * Determine if the current mesh is ready to be rendered\n * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\n * @param forceInstanceSupport will check if the mesh will be ready when used with instances (false by default)\n * @returns true if all associated assets are ready (material, textures, shaders)\n */\n isReady(e = !1, t = !1) {\n var l, c, h, u, f;\n if (this.delayLoadState === 2 || !super.isReady(e))\n return !1;\n if (!this.subMeshes || this.subMeshes.length === 0 || !e)\n return !0;\n const i = this.getEngine(), r = this.getScene(), s = t || i.getCaps().instancedArrays && (this.instances.length > 0 || this.hasThinInstances);\n this.computeWorldMatrix();\n const a = this.material || r.defaultMaterial;\n if (a) {\n if (a._storeEffectOnSubMeshes)\n for (const d of this.subMeshes) {\n const p = d.getMaterial();\n if (p) {\n if (p._storeEffectOnSubMeshes) {\n if (!p.isReadyForSubMesh(this, d, s))\n return !1;\n } else if (!p.isReady(this, s))\n return !1;\n }\n }\n else if (!a.isReady(this, s))\n return !1;\n }\n const o = i.currentRenderPassId;\n for (const d of this.lightSources) {\n const p = d.getShadowGenerators();\n if (!p)\n continue;\n const g = p.values();\n for (let m = g.next(); m.done !== !0; m = g.next()) {\n const v = m.value;\n if (v && (!((l = v.getShadowMap()) != null && l.renderList) || (c = v.getShadowMap()) != null && c.renderList && ((u = (h = v.getShadowMap()) == null ? void 0 : h.renderList) == null ? void 0 : u.indexOf(this)) !== -1)) {\n const C = v.getShadowMap().renderPassIds ?? [i.currentRenderPassId];\n for (let T = 0; T < C.length; ++T) {\n i.currentRenderPassId = C[T];\n for (const R of this.subMeshes)\n if (!v.isReady(R, s, ((f = R.getMaterial()) == null ? void 0 : f.needAlphaBlendingForMesh(this)) ?? !1))\n return i.currentRenderPassId = o, !1;\n }\n i.currentRenderPassId = o;\n }\n }\n }\n for (const d of this._internalMeshDataInfo._LODLevels)\n if (d.mesh && !d.mesh.isReady(s))\n return !1;\n return !0;\n }\n /**\n * Gets a boolean indicating if the normals aren't to be recomputed on next mesh `positions` array update. This property is pertinent only for updatable parametric shapes.\n */\n get areNormalsFrozen() {\n return this._internalMeshDataInfo._areNormalsFrozen;\n }\n /**\n * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It prevents the mesh normals from being recomputed on next `positions` array update.\n * @returns the current mesh\n */\n freezeNormals() {\n return this._internalMeshDataInfo._areNormalsFrozen = !0, this;\n }\n /**\n * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It reactivates the mesh normals computation if it was previously frozen\n * @returns the current mesh\n */\n unfreezeNormals() {\n return this._internalMeshDataInfo._areNormalsFrozen = !1, this;\n }\n /**\n * Sets a value overriding the instance count. Only applicable when custom instanced InterleavedVertexBuffer are used rather than InstancedMeshs\n */\n set overridenInstanceCount(e) {\n this._instanceDataStorage.overridenInstanceCount = e;\n }\n // Methods\n /** @internal */\n _preActivate() {\n const e = this._internalMeshDataInfo, t = this.getScene().getRenderId();\n return e._preActivateId === t ? this : (e._preActivateId = t, this._instanceDataStorage.visibleInstances = null, this);\n }\n /**\n * @internal\n */\n _preActivateForIntermediateRendering(e) {\n return this._instanceDataStorage.visibleInstances && (this._instanceDataStorage.visibleInstances.intermediateDefaultRenderId = e), this;\n }\n /**\n * @internal\n */\n _registerInstanceForRenderId(e, t) {\n return this._instanceDataStorage.visibleInstances || (this._instanceDataStorage.visibleInstances = {\n defaultRenderId: t,\n selfDefaultRenderId: this._renderId\n }), this._instanceDataStorage.visibleInstances[t] || (this._instanceDataStorage.previousRenderId !== void 0 && this._instanceDataStorage.isFrozen && (this._instanceDataStorage.visibleInstances[this._instanceDataStorage.previousRenderId] = null), this._instanceDataStorage.previousRenderId = t, this._instanceDataStorage.visibleInstances[t] = new Array()), this._instanceDataStorage.visibleInstances[t].push(e), this;\n }\n _afterComputeWorldMatrix() {\n super._afterComputeWorldMatrix(), this.hasThinInstances && (this.doNotSyncBoundingInfo || this.thinInstanceRefreshBoundingInfo(!1));\n }\n /** @internal */\n _postActivate() {\n this.edgesShareWithInstances && this.edgesRenderer && this.edgesRenderer.isEnabled && this._renderingGroup && (this._renderingGroup._edgesRenderers.pushNoDuplicate(this.edgesRenderer), this.edgesRenderer.customInstances.push(this.getWorldMatrix()));\n }\n /**\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\n * This means the mesh underlying bounding box and sphere are recomputed.\n * @param applySkeleton defines whether to apply the skeleton before computing the bounding info\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\n * @returns the current mesh\n */\n refreshBoundingInfo(e = !1, t = !1) {\n if (this.hasBoundingInfo && this.getBoundingInfo().isLocked)\n return this;\n const i = this.geometry ? this.geometry.boundingBias : null;\n return this._refreshBoundingInfo(this._getPositionData(e, t), i), this;\n }\n /**\n * @internal\n */\n _createGlobalSubMesh(e) {\n const t = this.getTotalVertices();\n if (!t || !this.getIndices())\n return null;\n if (this.subMeshes && this.subMeshes.length > 0) {\n const i = this.getIndices();\n if (!i)\n return null;\n const r = i.length;\n let s = !1;\n if (e)\n s = !0;\n else\n for (const a of this.subMeshes) {\n if (a.indexStart + a.indexCount > r) {\n s = !0;\n break;\n }\n if (a.verticesStart + a.verticesCount > t) {\n s = !0;\n break;\n }\n }\n if (!s)\n return this.subMeshes[0];\n }\n return this.releaseSubMeshes(), new bi(0, 0, t, 0, this.getTotalIndices(), this);\n }\n /**\n * This function will subdivide the mesh into multiple submeshes\n * @param count defines the expected number of submeshes\n */\n subdivide(e) {\n if (e < 1)\n return;\n const t = this.getTotalIndices();\n let i = t / e | 0, r = 0;\n for (; i % 3 !== 0; )\n i++;\n this.releaseSubMeshes();\n for (let s = 0; s < e && !(r >= t); s++)\n bi.CreateFromIndices(0, r, s === e - 1 ? t - r : i, this, void 0, !1), r += i;\n this.refreshBoundingInfo(), this.synchronizeInstances();\n }\n /**\n * Copy a FloatArray into a specific associated vertex buffer\n * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param data defines the data source\n * @param updatable defines if the updated vertex buffer must be flagged as updatable\n * @param stride defines the data stride size (can be null)\n * @returns the current mesh\n */\n setVerticesData(e, t, i = !1, r) {\n if (this._geometry)\n this._geometry.setVerticesData(e, t, i, r);\n else {\n const s = new re();\n s.set(t, e);\n const a = this.getScene();\n new is(is.RandomId(), a, s, i, this);\n }\n return this;\n }\n /**\n * Delete a vertex buffer associated with this mesh\n * @param kind defines which buffer to delete (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n */\n removeVerticesData(e) {\n this._geometry && this._geometry.removeVerticesData(e);\n }\n /**\n * Flags an associated vertex buffer as updatable\n * @param kind defines which buffer to use (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param updatable defines if the updated vertex buffer must be flagged as updatable\n */\n markVerticesDataAsUpdatable(e, t = !0) {\n const i = this.getVertexBuffer(e);\n !i || i.isUpdatable() === t || this.setVerticesData(e, this.getVerticesData(e), t);\n }\n /**\n * Sets the mesh global Vertex Buffer\n * @param buffer defines the buffer to use\n * @param disposeExistingBuffer disposes the existing buffer, if any (default: true)\n * @returns the current mesh\n */\n setVerticesBuffer(e, t = !0) {\n return this._geometry || (this._geometry = is.CreateGeometryForMesh(this)), this._geometry.setVerticesBuffer(e, null, t), this;\n }\n /**\n * Update a specific associated vertex buffer\n * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @param data defines the data source\n * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for \"position\" kind\n * @param makeItUnique defines if the geometry associated with the mesh must be cloned to make the change only for this mesh (and not all meshes associated with the same geometry)\n * @returns the current mesh\n */\n updateVerticesData(e, t, i, r) {\n return this._geometry ? (r ? (this.makeGeometryUnique(), this.updateVerticesData(e, t, i, !1)) : this._geometry.updateVerticesData(e, t, i), this) : this;\n }\n /**\n * This method updates the vertex positions of an updatable mesh according to the `positionFunction` returned values.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#other-shapes-updatemeshpositions\n * @param positionFunction is a simple JS function what is passed the mesh `positions` array. It doesn't need to return anything\n * @param computeNormals is a boolean (default true) to enable/disable the mesh normal recomputation after the vertex position update\n * @returns the current mesh\n */\n updateMeshPositions(e, t = !0) {\n const i = this.getVerticesData(I.PositionKind);\n if (!i)\n return this;\n if (e(i), this.updateVerticesData(I.PositionKind, i, !1, !1), t) {\n const r = this.getIndices(), s = this.getVerticesData(I.NormalKind);\n if (!s)\n return this;\n re.ComputeNormals(i, r, s), this.updateVerticesData(I.NormalKind, s, !1, !1);\n }\n return this;\n }\n /**\n * Creates a un-shared specific occurence of the geometry for the mesh.\n * @returns the current mesh\n */\n makeGeometryUnique() {\n if (!this._geometry)\n return this;\n if (this._geometry.meshes.length === 1)\n return this;\n const e = this._geometry, t = this._geometry.copy(is.RandomId());\n return e.releaseForMesh(this, !0), t.applyToMesh(this), this;\n }\n /**\n * Sets the index buffer of this mesh.\n * @param indexBuffer Defines the index buffer to use for this mesh\n * @param totalVertices Defines the total number of vertices used by the buffer\n * @param totalIndices Defines the total number of indices in the index buffer\n */\n setIndexBuffer(e, t, i) {\n let r = this._geometry;\n r || (r = new is(is.RandomId(), this.getScene(), void 0, void 0, this)), r.setIndexBuffer(e, t, i);\n }\n /**\n * Set the index buffer of this mesh\n * @param indices defines the source data\n * @param totalVertices defines the total number of vertices referenced by this index data (can be null)\n * @param updatable defines if the updated index buffer must be flagged as updatable (default is false)\n * @returns the current mesh\n */\n setIndices(e, t = null, i = !1) {\n if (this._geometry)\n this._geometry.setIndices(e, t, i);\n else {\n const r = new re();\n r.indices = e;\n const s = this.getScene();\n new is(is.RandomId(), s, r, i, this);\n }\n return this;\n }\n /**\n * Update the current index buffer\n * @param indices defines the source data\n * @param offset defines the offset in the index buffer where to store the new data (can be null)\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\n * @returns the current mesh\n */\n updateIndices(e, t, i = !1) {\n return this._geometry ? (this._geometry.updateIndices(e, t, i), this) : this;\n }\n /**\n * Invert the geometry to move from a right handed system to a left handed one.\n * @returns the current mesh\n */\n toLeftHanded() {\n return this._geometry ? (this._geometry.toLeftHanded(), this) : this;\n }\n /**\n * @internal\n */\n _bind(e, t, i, r = !0) {\n if (!this._geometry)\n return this;\n const s = this.getScene().getEngine();\n this.morphTargetManager && this.morphTargetManager.isUsingTextureForTargets && this.morphTargetManager._bind(t);\n let a;\n if (this._unIndexed)\n a = null;\n else\n switch (this._getRenderingFillMode(i)) {\n case ie.PointFillMode:\n a = null;\n break;\n case ie.WireFrameFillMode:\n a = e._getLinesIndexBuffer(this.getIndices(), s);\n break;\n default:\n case ie.TriangleFillMode:\n a = this._geometry.getIndexBuffer();\n break;\n }\n return !r || !this._userInstancedBuffersStorage || this.hasThinInstances ? this._geometry._bind(t, a) : this._geometry._bind(t, a, this._userInstancedBuffersStorage.vertexBuffers, this._userInstancedBuffersStorage.vertexArrayObjects), this;\n }\n /**\n * @internal\n */\n _draw(e, t, i) {\n if (!this._geometry || !this._geometry.getVertexBuffers() || !this._unIndexed && !this._geometry.getIndexBuffer())\n return this;\n this._internalMeshDataInfo._onBeforeDrawObservable && this._internalMeshDataInfo._onBeforeDrawObservable.notifyObservers(this);\n const s = this.getScene().getEngine();\n return this._unIndexed || t == ie.PointFillMode ? s.drawArraysType(t, e.verticesStart, e.verticesCount, this.forcedInstanceCount || i) : t == ie.WireFrameFillMode ? s.drawElementsType(t, 0, e._linesIndexCount, this.forcedInstanceCount || i) : s.drawElementsType(t, e.indexStart, e.indexCount, this.forcedInstanceCount || i), this;\n }\n /**\n * Registers for this mesh a javascript function called just before the rendering process\n * @param func defines the function to call before rendering this mesh\n * @returns the current mesh\n */\n registerBeforeRender(e) {\n return this.onBeforeRenderObservable.add(e), this;\n }\n /**\n * Disposes a previously registered javascript function called before the rendering\n * @param func defines the function to remove\n * @returns the current mesh\n */\n unregisterBeforeRender(e) {\n return this.onBeforeRenderObservable.removeCallback(e), this;\n }\n /**\n * Registers for this mesh a javascript function called just after the rendering is complete\n * @param func defines the function to call after rendering this mesh\n * @returns the current mesh\n */\n registerAfterRender(e) {\n return this.onAfterRenderObservable.add(e), this;\n }\n /**\n * Disposes a previously registered javascript function called after the rendering.\n * @param func defines the function to remove\n * @returns the current mesh\n */\n unregisterAfterRender(e) {\n return this.onAfterRenderObservable.removeCallback(e), this;\n }\n /**\n * @internal\n */\n _getInstancesRenderList(e, t = !1) {\n if (this._instanceDataStorage.isFrozen) {\n if (t)\n return this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.hardwareInstancedRendering[e] = !1, this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.renderSelf[e] = !0, this._instanceDataStorage.batchCacheReplacementModeInFrozenMode;\n if (this._instanceDataStorage.previousBatch)\n return this._instanceDataStorage.previousBatch;\n }\n const i = this.getScene(), r = i._isInIntermediateRendering(), s = r ? this._internalAbstractMeshDataInfo._onlyForInstancesIntermediate : this._internalAbstractMeshDataInfo._onlyForInstances, a = this._instanceDataStorage.batchCache;\n if (a.mustReturn = !1, a.renderSelf[e] = t || !s && this.isEnabled() && this.isVisible, a.visibleInstances[e] = null, this._instanceDataStorage.visibleInstances && !t) {\n const o = this._instanceDataStorage.visibleInstances, l = i.getRenderId(), c = r ? o.intermediateDefaultRenderId : o.defaultRenderId;\n a.visibleInstances[e] = o[l], !a.visibleInstances[e] && c && (a.visibleInstances[e] = o[c]);\n }\n return a.hardwareInstancedRendering[e] = !t && this._instanceDataStorage.hardwareInstancedRendering && a.visibleInstances[e] !== null && a.visibleInstances[e] !== void 0, this._instanceDataStorage.previousBatch = a, a;\n }\n /**\n * @internal\n */\n _renderWithInstances(e, t, i, r, s) {\n var E;\n const a = i.visibleInstances[e._id], o = a ? a.length : 0, l = this._instanceDataStorage, c = l.instancesBufferSize;\n let h = l.instancesBuffer, u = l.instancesPreviousBuffer;\n const d = (o + 1) * 16 * 4;\n for (; l.instancesBufferSize < d; )\n l.instancesBufferSize *= 2;\n (!l.instancesData || c != l.instancesBufferSize) && (l.instancesData = new Float32Array(l.instancesBufferSize / 4)), (this._scene.needsPreviousWorldMatrices && !l.instancesPreviousData || c != l.instancesBufferSize) && (l.instancesPreviousData = new Float32Array(l.instancesBufferSize / 4));\n let p = 0, g = 0;\n const m = i.renderSelf[e._id], v = !h || c !== l.instancesBufferSize || this._scene.needsPreviousWorldMatrices && !l.instancesPreviousBuffer;\n if (!this._instanceDataStorage.manualUpdate && (!l.isFrozen || v)) {\n const C = this.getWorldMatrix();\n if (m && (this._scene.needsPreviousWorldMatrices && (l.masterMeshPreviousWorldMatrix ? (l.masterMeshPreviousWorldMatrix.copyToArray(l.instancesPreviousData, p), l.masterMeshPreviousWorldMatrix.copyFrom(C)) : (l.masterMeshPreviousWorldMatrix = C.clone(), l.masterMeshPreviousWorldMatrix.copyToArray(l.instancesPreviousData, p))), C.copyToArray(l.instancesData, p), p += 16, g++), a) {\n if (B.INSTANCEDMESH_SORT_TRANSPARENT && this._scene.activeCamera && ((E = e.getMaterial()) != null && E.needAlphaBlendingForMesh(e.getRenderingMesh()))) {\n const T = this._scene.activeCamera.globalPosition;\n for (let R = 0; R < a.length; R++) {\n const x = a[R];\n x._distanceToCamera = _.Distance(x.getBoundingInfo().boundingSphere.centerWorld, T);\n }\n a.sort((R, x) => R._distanceToCamera > x._distanceToCamera ? -1 : R._distanceToCamera < x._distanceToCamera ? 1 : 0);\n }\n for (let T = 0; T < a.length; T++) {\n const R = a[T], x = R.getWorldMatrix();\n x.copyToArray(l.instancesData, p), this._scene.needsPreviousWorldMatrices && (R._previousWorldMatrix ? (R._previousWorldMatrix.copyToArray(l.instancesPreviousData, p), R._previousWorldMatrix.copyFrom(x)) : (R._previousWorldMatrix = x.clone(), R._previousWorldMatrix.copyToArray(l.instancesPreviousData, p))), p += 16, g++;\n }\n }\n } else\n g = (m ? 1 : 0) + o;\n return v ? (h && h.dispose(), u && u.dispose(), h = new dr(s, l.instancesData, !0, 16, !1, !0), l.instancesBuffer = h, this._userInstancedBuffersStorage || (this._userInstancedBuffersStorage = {\n data: {},\n vertexBuffers: {},\n strides: {},\n sizes: {},\n vertexArrayObjects: this.getEngine().getCaps().vertexArrayObject ? {} : void 0\n }), this._userInstancedBuffersStorage.vertexBuffers.world0 = h.createVertexBuffer(\"world0\", 0, 4), this._userInstancedBuffersStorage.vertexBuffers.world1 = h.createVertexBuffer(\"world1\", 4, 4), this._userInstancedBuffersStorage.vertexBuffers.world2 = h.createVertexBuffer(\"world2\", 8, 4), this._userInstancedBuffersStorage.vertexBuffers.world3 = h.createVertexBuffer(\"world3\", 12, 4), this._scene.needsPreviousWorldMatrices && (u = new dr(s, l.instancesPreviousData, !0, 16, !1, !0), l.instancesPreviousBuffer = u, this._userInstancedBuffersStorage.vertexBuffers.previousWorld0 = u.createVertexBuffer(\"previousWorld0\", 0, 4), this._userInstancedBuffersStorage.vertexBuffers.previousWorld1 = u.createVertexBuffer(\"previousWorld1\", 4, 4), this._userInstancedBuffersStorage.vertexBuffers.previousWorld2 = u.createVertexBuffer(\"previousWorld2\", 8, 4), this._userInstancedBuffersStorage.vertexBuffers.previousWorld3 = u.createVertexBuffer(\"previousWorld3\", 12, 4)), this._invalidateInstanceVertexArrayObject()) : (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) && (h.updateDirectly(l.instancesData, 0, g), this._scene.needsPreviousWorldMatrices && (!this._instanceDataStorage.manualUpdate || this._instanceDataStorage.previousManualUpdate) && u.updateDirectly(l.instancesPreviousData, 0, g)), this._processInstancedBuffers(a, m), this.getScene()._activeIndices.addCount(e.indexCount * g, !1), s._currentDrawContext && (s._currentDrawContext.useInstancing = !0), this._bind(e, r, t), this._draw(e, t, g), this._scene.needsPreviousWorldMatrices && !v && this._instanceDataStorage.manualUpdate && (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) && !this._instanceDataStorage.previousManualUpdate && u.updateDirectly(l.instancesData, 0, g), s.unbindInstanceAttributes(), this;\n }\n /**\n * @internal\n */\n _renderWithThinInstances(e, t, i, r) {\n var a;\n const s = ((a = this._thinInstanceDataStorage) == null ? void 0 : a.instancesCount) ?? 0;\n this.getScene()._activeIndices.addCount(e.indexCount * s, !1), r._currentDrawContext && (r._currentDrawContext.useInstancing = !0), this._bind(e, i, t), this._draw(e, t, s), this._scene.needsPreviousWorldMatrices && !this._thinInstanceDataStorage.previousMatrixData && this._thinInstanceDataStorage.matrixData && (this._thinInstanceDataStorage.previousMatrixBuffer ? this._thinInstanceDataStorage.previousMatrixBuffer.updateDirectly(this._thinInstanceDataStorage.matrixData, 0, s) : this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", this._thinInstanceDataStorage.matrixData, !1)), r.unbindInstanceAttributes();\n }\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _processInstancedBuffers(e, t) {\n }\n /**\n * @internal\n */\n _processRendering(e, t, i, r, s, a, o, l) {\n const c = this.getScene(), h = c.getEngine();\n if (r = this._getRenderingFillMode(r), a && t.getRenderingMesh().hasThinInstances)\n return this._renderWithThinInstances(t, r, i, h), this;\n if (a)\n this._renderWithInstances(t, r, s, i, h);\n else {\n h._currentDrawContext && (h._currentDrawContext.useInstancing = !1);\n let u = 0;\n s.renderSelf[t._id] && (o && o(!1, e.getWorldMatrix(), l), u++, this._draw(t, r, this._instanceDataStorage.overridenInstanceCount));\n const f = s.visibleInstances[t._id];\n if (f) {\n const d = f.length;\n u += d;\n for (let p = 0; p < d; p++) {\n const m = f[p].getWorldMatrix();\n o && o(!0, m, l), this._draw(t, r);\n }\n }\n c._activeIndices.addCount(t.indexCount * u, !1);\n }\n return this;\n }\n /**\n * @internal\n */\n _rebuild(e = !1) {\n if (this._instanceDataStorage.instancesBuffer && (e && this._instanceDataStorage.instancesBuffer.dispose(), this._instanceDataStorage.instancesBuffer = null), this._userInstancedBuffersStorage) {\n for (const t in this._userInstancedBuffersStorage.vertexBuffers) {\n const i = this._userInstancedBuffersStorage.vertexBuffers[t];\n i && (e && i.dispose(), this._userInstancedBuffersStorage.vertexBuffers[t] = null);\n }\n this._userInstancedBuffersStorage.vertexArrayObjects && (this._userInstancedBuffersStorage.vertexArrayObjects = {});\n }\n this._internalMeshDataInfo._effectiveMaterial = null, super._rebuild(e);\n }\n /** @internal */\n _freeze() {\n if (this.subMeshes) {\n for (let e = 0; e < this.subMeshes.length; e++)\n this._getInstancesRenderList(e);\n this._internalMeshDataInfo._effectiveMaterial = null, this._instanceDataStorage.isFrozen = !0;\n }\n }\n /** @internal */\n _unFreeze() {\n this._instanceDataStorage.isFrozen = !1, this._instanceDataStorage.previousBatch = null;\n }\n /**\n * Triggers the draw call for the mesh (or a submesh), for a specific render pass id\n * @param renderPassId defines the render pass id to use to draw the mesh / submesh. If not provided, use the current renderPassId of the engine.\n * @param enableAlphaMode defines if alpha mode can be changed (default: false)\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering (default: undefined)\n * @param subMesh defines the subMesh to render. If not provided, draw all mesh submeshes (default: undefined)\n * @param checkFrustumCulling defines if frustum culling must be checked (default: true). If you know the mesh is in the frustum (or if you don't care!), you can pass false to optimize.\n * @returns the current mesh\n */\n renderWithRenderPassId(e, t, i, r, s = !0) {\n const a = this._scene.getEngine(), o = a.currentRenderPassId;\n if (e !== void 0 && (a.currentRenderPassId = e), r)\n (!s || s && r.isInFrustum(this._scene._frustumPlanes)) && this.render(r, !!t, i);\n else\n for (let l = 0; l < this.subMeshes.length; l++) {\n const c = this.subMeshes[l];\n (!s || s && c.isInFrustum(this._scene._frustumPlanes)) && this.render(c, !!t, i);\n }\n return e !== void 0 && (a.currentRenderPassId = o), this;\n }\n /**\n * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager\n * @param subMesh defines the subMesh to render\n * @param enableAlphaMode defines if alpha mode can be changed\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering\n * @returns the current mesh\n */\n render(e, t, i) {\n var S, M;\n const r = this.getScene();\n this._internalAbstractMeshDataInfo._isActiveIntermediate ? this._internalAbstractMeshDataInfo._isActiveIntermediate = !1 : this._internalAbstractMeshDataInfo._isActive = !1;\n const s = ((S = r.activeCameras) == null ? void 0 : S.length) ?? 0;\n if ((s > 1 && r.activeCamera === r.activeCameras[0] || s <= 1) && this._checkOcclusionQuery() && !this._occlusionDataStorage.forceRenderingWhenOccluded)\n return this;\n const o = this._getInstancesRenderList(e._id, !!i);\n if (o.mustReturn)\n return this;\n if (!this._geometry || !this._geometry.getVertexBuffers() || !this._unIndexed && !this._geometry.getIndexBuffer())\n return this;\n const l = r.getEngine();\n let c = 0, h = null;\n this.ignoreCameraMaxZ && r.activeCamera && !r._isInIntermediateRendering() && (c = r.activeCamera.maxZ, h = r.activeCamera, r.activeCamera.maxZ = 0, r.updateTransformMatrix(!0)), this._internalMeshDataInfo._onBeforeRenderObservable && this._internalMeshDataInfo._onBeforeRenderObservable.notifyObservers(this);\n const u = e.getRenderingMesh(), f = o.hardwareInstancedRendering[e._id] || u.hasThinInstances || !!this._userInstancedBuffersStorage && !e.getMesh()._internalAbstractMeshDataInfo._actAsRegularMesh, d = this._instanceDataStorage, p = e.getMaterial();\n if (!p)\n return h && (h.maxZ = c, r.updateTransformMatrix(!0)), this;\n if (!d.isFrozen || !this._internalMeshDataInfo._effectiveMaterial || this._internalMeshDataInfo._effectiveMaterial !== p) {\n if (p._storeEffectOnSubMeshes) {\n if (!p.isReadyForSubMesh(this, e, f))\n return h && (h.maxZ = c, r.updateTransformMatrix(!0)), this;\n } else if (!p.isReady(this, f))\n return h && (h.maxZ = c, r.updateTransformMatrix(!0)), this;\n this._internalMeshDataInfo._effectiveMaterial = p;\n } else if (p._storeEffectOnSubMeshes && !((M = e._drawWrapper) != null && M._wasPreviouslyReady) || !p._storeEffectOnSubMeshes && !p._getDrawWrapper()._wasPreviouslyReady)\n return h && (h.maxZ = c, r.updateTransformMatrix(!0)), this;\n t && l.setAlphaMode(this._internalMeshDataInfo._effectiveMaterial.alphaMode);\n let g;\n this._internalMeshDataInfo._effectiveMaterial._storeEffectOnSubMeshes ? g = e._drawWrapper : g = this._internalMeshDataInfo._effectiveMaterial._getDrawWrapper();\n const m = (g == null ? void 0 : g.effect) ?? null;\n for (const N of r._beforeRenderingMeshStage)\n N.action(this, e, o, m);\n if (!g || !m)\n return h && (h.maxZ = c, r.updateTransformMatrix(!0)), this;\n const v = i || this;\n let E;\n if (!d.isFrozen && (this._internalMeshDataInfo._effectiveMaterial.backFaceCulling || this.overrideMaterialSideOrientation !== null || this._internalMeshDataInfo._effectiveMaterial.twoSidedLighting)) {\n const N = v._getWorldMatrixDeterminant();\n E = this.overrideMaterialSideOrientation, E == null && (E = this._internalMeshDataInfo._effectiveMaterial.sideOrientation), N < 0 && (E = E === ie.ClockWiseSideOrientation ? ie.CounterClockWiseSideOrientation : ie.ClockWiseSideOrientation), d.sideOrientation = E;\n } else\n E = d.sideOrientation;\n const C = this._internalMeshDataInfo._effectiveMaterial._preBind(g, E);\n this._internalMeshDataInfo._effectiveMaterial.forceDepthWrite && l.setDepthWrite(!0);\n const T = this._internalMeshDataInfo._effectiveMaterial, R = T.fillMode;\n this._internalMeshDataInfo._onBeforeBindObservable && this._internalMeshDataInfo._onBeforeBindObservable.notifyObservers(this), f || this._bind(e, m, R, !1);\n const x = v.getWorldMatrix();\n T._storeEffectOnSubMeshes ? T.bindForSubMesh(x, this, e) : T.bind(x, this), !T.backFaceCulling && T.separateCullingPass && (l.setState(!0, T.zOffset, !1, !C, T.cullBackFaces, T.stencil, T.zOffsetUnits), this._processRendering(this, e, m, R, o, f, this._onBeforeDraw, this._internalMeshDataInfo._effectiveMaterial), l.setState(!0, T.zOffset, !1, C, T.cullBackFaces, T.stencil, T.zOffsetUnits), this._internalMeshDataInfo._onBetweenPassObservable && this._internalMeshDataInfo._onBetweenPassObservable.notifyObservers(e)), this._processRendering(this, e, m, R, o, f, this._onBeforeDraw, this._internalMeshDataInfo._effectiveMaterial), this._internalMeshDataInfo._effectiveMaterial.unbind();\n for (const N of r._afterRenderingMeshStage)\n N.action(this, e, o, m);\n return this._internalMeshDataInfo._onAfterRenderObservable && this._internalMeshDataInfo._onAfterRenderObservable.notifyObservers(this), h && (h.maxZ = c, r.updateTransformMatrix(!0)), r.performancePriority === fs.Aggressive && !d.isFrozen && this._freeze(), this;\n }\n /**\n * Renormalize the mesh and patch it up if there are no weights\n * Similar to normalization by adding the weights compute the reciprocal and multiply all elements, this wil ensure that everything adds to 1.\n * However in the case of zero weights then we set just a single influence to 1.\n * We check in the function for extra's present and if so we use the normalizeSkinWeightsWithExtras rather than the FourWeights version.\n */\n cleanMatrixWeights() {\n this.isVerticesDataPresent(I.MatricesWeightsKind) && (this.isVerticesDataPresent(I.MatricesWeightsExtraKind) ? this._normalizeSkinWeightsAndExtra() : this._normalizeSkinFourWeights());\n }\n // faster 4 weight version.\n _normalizeSkinFourWeights() {\n const e = this.getVerticesData(I.MatricesWeightsKind), t = e.length;\n for (let i = 0; i < t; i += 4) {\n const r = e[i] + e[i + 1] + e[i + 2] + e[i + 3];\n if (r === 0)\n e[i] = 1;\n else {\n const s = 1 / r;\n e[i] *= s, e[i + 1] *= s, e[i + 2] *= s, e[i + 3] *= s;\n }\n }\n this.setVerticesData(I.MatricesWeightsKind, e);\n }\n // handle special case of extra verts. (in theory gltf can handle 12 influences)\n _normalizeSkinWeightsAndExtra() {\n const e = this.getVerticesData(I.MatricesWeightsExtraKind), t = this.getVerticesData(I.MatricesWeightsKind), i = t.length;\n for (let r = 0; r < i; r += 4) {\n let s = t[r] + t[r + 1] + t[r + 2] + t[r + 3];\n if (s += e[r] + e[r + 1] + e[r + 2] + e[r + 3], s === 0)\n t[r] = 1;\n else {\n const a = 1 / s;\n t[r] *= a, t[r + 1] *= a, t[r + 2] *= a, t[r + 3] *= a, e[r] *= a, e[r + 1] *= a, e[r + 2] *= a, e[r + 3] *= a;\n }\n }\n this.setVerticesData(I.MatricesWeightsKind, t), this.setVerticesData(I.MatricesWeightsKind, e);\n }\n /**\n * ValidateSkinning is used to determine that a mesh has valid skinning data along with skin metrics, if missing weights,\n * or not normalized it is returned as invalid mesh the string can be used for console logs, or on screen messages to let\n * the user know there was an issue with importing the mesh\n * @returns a validation object with skinned, valid and report string\n */\n validateSkinning() {\n const e = this.getVerticesData(I.MatricesWeightsExtraKind), t = this.getVerticesData(I.MatricesWeightsKind);\n if (t === null || this.skeleton == null)\n return { skinned: !1, valid: !0, report: \"not skinned\" };\n const i = t.length;\n let r = 0, s = 0, a = 0, o = 0;\n const l = e === null ? 4 : 8, c = [];\n for (let m = 0; m <= l; m++)\n c[m] = 0;\n const h = 1e-3;\n for (let m = 0; m < i; m += 4) {\n let v = t[m], E = v, C = E === 0 ? 0 : 1;\n for (let T = 1; T < l; T++) {\n const R = T < 4 ? t[m + T] : e[m + T - 4];\n R > v && r++, R !== 0 && C++, E += R, v = R;\n }\n if (c[C]++, C > a && (a = C), E === 0)\n s++;\n else {\n const T = 1 / E;\n let R = 0;\n for (let x = 0; x < l; x++)\n x < 4 ? R += Math.abs(t[m + x] - t[m + x] * T) : R += Math.abs(e[m + x - 4] - e[m + x - 4] * T);\n R > h && o++;\n }\n }\n const u = this.skeleton.bones.length, f = this.getVerticesData(I.MatricesIndicesKind), d = this.getVerticesData(I.MatricesIndicesExtraKind);\n let p = 0;\n for (let m = 0; m < i; m += 4)\n for (let v = 0; v < l; v++) {\n const E = v < 4 ? f[m + v] : d[m + v - 4];\n (E >= u || E < 0) && p++;\n }\n const g = \"Number of Weights = \" + i / 4 + `\nMaximum influences = ` + a + `\nMissing Weights = ` + s + `\nNot Sorted = ` + r + `\nNot Normalized = ` + o + `\nWeightCounts = [` + c + `]\nNumber of bones = ` + u + `\nBad Bone Indices = ` + p;\n return { skinned: !0, valid: s === 0 && o === 0 && p === 0, report: g };\n }\n /** @internal */\n _checkDelayState() {\n const e = this.getScene();\n return this._geometry ? this._geometry.load(e) : this.delayLoadState === 4 && (this.delayLoadState = 2, this._queueLoad(e)), this;\n }\n _queueLoad(e) {\n e.addPendingData(this);\n const t = this.delayLoadingFile.indexOf(\".babylonbinarymeshdata\") !== -1;\n return ge.LoadFile(this.delayLoadingFile, (i) => {\n i instanceof ArrayBuffer ? this._delayLoadingFunction(i, this) : this._delayLoadingFunction(JSON.parse(i), this), this.instances.forEach((r) => {\n r.refreshBoundingInfo(), r._syncSubMeshes();\n }), this.delayLoadState = 1, e.removePendingData(this);\n }, () => {\n }, e.offlineProvider, t), this;\n }\n /**\n * Returns `true` if the mesh is within the frustum defined by the passed array of planes.\n * A mesh is in the frustum if its bounding box intersects the frustum\n * @param frustumPlanes defines the frustum to test\n * @returns true if the mesh is in the frustum planes\n */\n isInFrustum(e) {\n return this.delayLoadState === 2 || !super.isInFrustum(e) ? !1 : (this._checkDelayState(), !0);\n }\n /**\n * Sets the mesh material by the material or multiMaterial `id` property\n * @param id is a string identifying the material or the multiMaterial\n * @returns the current mesh\n */\n setMaterialById(e) {\n const t = this.getScene().materials;\n let i;\n for (i = t.length - 1; i > -1; i--)\n if (t[i].id === e)\n return this.material = t[i], this;\n const r = this.getScene().multiMaterials;\n for (i = r.length - 1; i > -1; i--)\n if (r[i].id === e)\n return this.material = r[i], this;\n return this;\n }\n /**\n * Returns as a new array populated with the mesh material and/or skeleton, if any.\n * @returns an array of IAnimatable\n */\n getAnimatables() {\n const e = [];\n return this.material && e.push(this.material), this.skeleton && e.push(this.skeleton), e;\n }\n /**\n * Modifies the mesh geometry according to the passed transformation matrix.\n * This method returns nothing, but it really modifies the mesh even if it's originally not set as updatable.\n * The mesh normals are modified using the same transformation.\n * Note that, under the hood, this method sets a new VertexBuffer each call.\n * @param transform defines the transform matrix to use\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms\n * @returns the current mesh\n */\n bakeTransformIntoVertices(e) {\n if (!this.isVerticesDataPresent(I.PositionKind))\n return this;\n const t = this.subMeshes.splice(0);\n this._resetPointsArrayCache();\n let i = this.getVerticesData(I.PositionKind);\n const r = _.Zero();\n let s;\n for (s = 0; s < i.length; s += 3)\n _.TransformCoordinatesFromFloatsToRef(i[s], i[s + 1], i[s + 2], e, r).toArray(i, s);\n if (this.setVerticesData(I.PositionKind, i, this.getVertexBuffer(I.PositionKind).isUpdatable()), this.isVerticesDataPresent(I.NormalKind)) {\n for (i = this.getVerticesData(I.NormalKind), s = 0; s < i.length; s += 3)\n _.TransformNormalFromFloatsToRef(i[s], i[s + 1], i[s + 2], e, r).normalize().toArray(i, s);\n this.setVerticesData(I.NormalKind, i, this.getVertexBuffer(I.NormalKind).isUpdatable());\n }\n if (this.isVerticesDataPresent(I.TangentKind)) {\n for (i = this.getVerticesData(I.TangentKind), s = 0; s < i.length; s += 4)\n _.TransformNormalFromFloatsToRef(i[s], i[s + 1], i[s + 2], e, r).normalize().toArray(i, s);\n this.setVerticesData(I.TangentKind, i, this.getVertexBuffer(I.TangentKind).isUpdatable());\n }\n return e.determinant() < 0 && this.flipFaces(), this.releaseSubMeshes(), this.subMeshes = t, this;\n }\n /**\n * Modifies the mesh geometry according to its own current World Matrix.\n * The mesh World Matrix is then reset.\n * This method returns nothing but really modifies the mesh even if it's originally not set as updatable.\n * Note that, under the hood, this method sets a new VertexBuffer each call.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms\n * @param bakeIndependentlyOfChildren indicates whether to preserve all child nodes' World Matrix during baking\n * @returns the current mesh\n */\n bakeCurrentTransformIntoVertices(e = !0) {\n return this.bakeTransformIntoVertices(this.computeWorldMatrix(!0)), this.resetLocalMatrix(e), this;\n }\n // Cache\n /** @internal */\n get _positions() {\n return this._internalAbstractMeshDataInfo._positions ? this._internalAbstractMeshDataInfo._positions : this._geometry ? this._geometry._positions : null;\n }\n /** @internal */\n _resetPointsArrayCache() {\n return this._geometry && this._geometry._resetPointsArrayCache(), this;\n }\n /** @internal */\n _generatePointsArray() {\n return this._geometry ? this._geometry._generatePointsArray() : !1;\n }\n /**\n * Returns a new Mesh object generated from the current mesh properties.\n * This method must not get confused with createInstance()\n * @param name is a string, the name given to the new mesh\n * @param newParent can be any Node object (default `null`)\n * @param doNotCloneChildren allows/denies the recursive cloning of the original mesh children if any (default `false`)\n * @param clonePhysicsImpostor allows/denies the cloning in the same time of the original mesh `body` used by the physics engine, if any (default `true`)\n * @returns a new mesh\n */\n clone(e = \"\", t = null, i, r = !0) {\n return new B(e, this.getScene(), t, this, i, r);\n }\n /**\n * Releases resources associated with this mesh.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n this.morphTargetManager = null, this._geometry && this._geometry.releaseForMesh(this, !0);\n const i = this._internalMeshDataInfo;\n if (i._onBeforeDrawObservable && i._onBeforeDrawObservable.clear(), i._onBeforeBindObservable && i._onBeforeBindObservable.clear(), i._onBeforeRenderObservable && i._onBeforeRenderObservable.clear(), i._onAfterRenderObservable && i._onAfterRenderObservable.clear(), i._onBetweenPassObservable && i._onBetweenPassObservable.clear(), this._scene.useClonedMeshMap) {\n if (i.meshMap)\n for (const r in i.meshMap) {\n const s = i.meshMap[r];\n s && (s._internalMeshDataInfo._source = null, i.meshMap[r] = void 0);\n }\n i._source && i._source._internalMeshDataInfo.meshMap && (i._source._internalMeshDataInfo.meshMap[this.uniqueId] = void 0);\n } else {\n const r = this.getScene().meshes;\n for (const s of r) {\n const a = s;\n a._internalMeshDataInfo && a._internalMeshDataInfo._source && a._internalMeshDataInfo._source === this && (a._internalMeshDataInfo._source = null);\n }\n }\n i._source = null, this._instanceDataStorage.visibleInstances = {}, this._disposeInstanceSpecificData(), this._disposeThinInstanceSpecificData(), this._internalMeshDataInfo._checkReadinessObserver && this._scene.onBeforeRenderObservable.remove(this._internalMeshDataInfo._checkReadinessObserver), super.dispose(e, t);\n }\n /** @internal */\n _disposeInstanceSpecificData() {\n }\n /** @internal */\n _disposeThinInstanceSpecificData() {\n }\n /** @internal */\n _invalidateInstanceVertexArrayObject() {\n }\n /**\n * Modifies the mesh geometry according to a displacement map.\n * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex.\n * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated.\n * @param url is a string, the URL from the image file is to be downloaded.\n * @param minHeight is the lower limit of the displacement.\n * @param maxHeight is the upper limit of the displacement.\n * @param onSuccess is an optional Javascript function to be called just after the mesh is modified. It is passed the modified mesh and must return nothing.\n * @param uvOffset is an optional vector2 used to offset UV.\n * @param uvScale is an optional vector2 used to scale UV.\n * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance.\n * @param onError defines a callback called when an error occurs during the processing of the request.\n * @returns the Mesh.\n */\n applyDisplacementMap(e, t, i, r, s, a, o = !1, l) {\n const c = this.getScene(), h = (u) => {\n const f = u.width, d = u.height, g = this.getEngine().createCanvas(f, d).getContext(\"2d\");\n g.drawImage(u, 0, 0);\n const m = g.getImageData(0, 0, f, d).data;\n this.applyDisplacementMapFromBuffer(m, f, d, t, i, s, a, o), r && r(this);\n };\n return ge.LoadImage(e, h, l || (() => {\n }), c.offlineProvider), this;\n }\n /**\n * Modifies the mesh geometry according to a displacementMap buffer.\n * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex.\n * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated.\n * @param buffer is a `Uint8Array` buffer containing series of `Uint8` lower than 255, the red, green, blue and alpha values of each successive pixel.\n * @param heightMapWidth is the width of the buffer image.\n * @param heightMapHeight is the height of the buffer image.\n * @param minHeight is the lower limit of the displacement.\n * @param maxHeight is the upper limit of the displacement.\n * @param uvOffset is an optional vector2 used to offset UV.\n * @param uvScale is an optional vector2 used to scale UV.\n * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance.\n * @returns the Mesh.\n */\n applyDisplacementMapFromBuffer(e, t, i, r, s, a, o, l = !1) {\n if (!this.isVerticesDataPresent(I.PositionKind) || !this.isVerticesDataPresent(I.NormalKind) || !this.isVerticesDataPresent(I.UVKind))\n return ne.Warn(\"Cannot call applyDisplacementMap: Given mesh is not complete. Position, Normal or UV are missing\"), this;\n const c = this.getVerticesData(I.PositionKind, !0, !0), h = this.getVerticesData(I.NormalKind), u = this.getVerticesData(I.UVKind);\n let f = _.Zero();\n const d = _.Zero(), p = me.Zero();\n a = a || me.Zero(), o = o || new me(1, 1);\n for (let g = 0; g < c.length; g += 3) {\n _.FromArrayToRef(c, g, f), _.FromArrayToRef(h, g, d), me.FromArrayToRef(u, g / 3 * 2, p);\n const m = Math.abs(p.x * o.x + a.x % 1) * (t - 1) % t | 0, v = Math.abs(p.y * o.y + a.y % 1) * (i - 1) % i | 0, E = (m + v * t) * 4, C = e[E] / 255, T = e[E + 1] / 255, R = e[E + 2] / 255, x = C * 0.3 + T * 0.59 + R * 0.11;\n d.normalize(), d.scaleInPlace(r + (s - r) * x), f = f.add(d), f.toArray(c, g);\n }\n return re.ComputeNormals(c, this.getIndices(), h), l ? (this.setVerticesData(I.PositionKind, c), this.setVerticesData(I.NormalKind, h), this.setVerticesData(I.UVKind, u)) : (this.updateVerticesData(I.PositionKind, c), this.updateVerticesData(I.NormalKind, h)), this;\n }\n _getFlattenedNormals(e, t) {\n const i = new Float32Array(e.length * 3);\n let r = 0;\n const s = this.overrideMaterialSideOrientation === (this._scene.useRightHandedSystem ? 1 : 0);\n for (let a = 0; a < e.length; a += 3) {\n const o = _.FromArray(t, e[a] * 3), l = _.FromArray(t, e[a + 1] * 3), c = _.FromArray(t, e[a + 2] * 3), h = o.subtract(l), u = c.subtract(l), f = _.Normalize(_.Cross(h, u));\n s && f.scaleInPlace(-1);\n for (let d = 0; d < 3; d++)\n i[r++] = f.x, i[r++] = f.y, i[r++] = f.z;\n }\n return i;\n }\n _convertToUnIndexedMesh(e = !1) {\n const t = this.getVerticesDataKinds(), i = this.getIndices(), r = {}, s = (o, l) => {\n const c = new Float32Array(i.length * l);\n let h = 0;\n for (let u = 0; u < i.length; u++)\n for (let f = 0; f < l; f++)\n c[h++] = o[i[u] * l + f];\n return c;\n }, a = this.geometry ? this.subMeshes.slice(0) : [];\n for (const o of t)\n r[o] = this.getVerticesData(o);\n for (const o of t) {\n const l = this.getVertexBuffer(o), c = l.getStrideSize();\n if (e && o === I.NormalKind) {\n const h = this._getFlattenedNormals(i, r[I.PositionKind]);\n this.setVerticesData(I.NormalKind, h, l.isUpdatable(), c);\n } else\n this.setVerticesData(o, s(r[o], c), l.isUpdatable(), c);\n }\n if (this.morphTargetManager) {\n for (let o = 0; o < this.morphTargetManager.numTargets; o++) {\n const l = this.morphTargetManager.getTarget(o), c = l.getPositions();\n l.setPositions(s(c, 3));\n const h = l.getNormals();\n h && l.setNormals(e ? this._getFlattenedNormals(i, c) : s(h, 3));\n const u = l.getTangents();\n u && l.setTangents(s(u, 3));\n const f = l.getUVs();\n f && l.setUVs(s(f, 2));\n }\n this.morphTargetManager.synchronize();\n }\n for (let o = 0; o < i.length; o++)\n i[o] = o;\n this.setIndices(i), this._unIndexed = !0, this.releaseSubMeshes();\n for (const o of a)\n bi.AddToMesh(o.materialIndex, o.indexStart, o.indexCount, o.indexStart, o.indexCount, this);\n return this.synchronizeInstances(), this;\n }\n /**\n * Modify the mesh to get a flat shading rendering.\n * This means each mesh facet will then have its own normals. Usually new vertices are added in the mesh geometry to get this result.\n * Warning : the mesh is really modified even if not set originally as updatable and, under the hood, a new VertexBuffer is allocated.\n * @returns current mesh\n */\n convertToFlatShadedMesh() {\n return this._convertToUnIndexedMesh(!0);\n }\n /**\n * This method removes all the mesh indices and add new vertices (duplication) in order to unfold facets into buffers.\n * In other words, more vertices, no more indices and a single bigger VBO.\n * The mesh is really modified even if not set originally as updatable. Under the hood, a new VertexBuffer is allocated.\n * @returns current mesh\n */\n convertToUnIndexedMesh() {\n return this._convertToUnIndexedMesh();\n }\n /**\n * Inverses facet orientations.\n * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.\n * @param flipNormals will also inverts the normals\n * @returns current mesh\n */\n flipFaces(e = !1) {\n const t = re.ExtractFromMesh(this);\n let i;\n if (e && this.isVerticesDataPresent(I.NormalKind) && t.normals)\n for (i = 0; i < t.normals.length; i++)\n t.normals[i] *= -1;\n if (t.indices) {\n let r;\n for (i = 0; i < t.indices.length; i += 3)\n r = t.indices[i + 1], t.indices[i + 1] = t.indices[i + 2], t.indices[i + 2] = r;\n }\n return t.applyToMesh(this, this.isVertexBufferUpdatable(I.PositionKind)), this;\n }\n /**\n * Increase the number of facets and hence vertices in a mesh\n * Vertex normals are interpolated from existing vertex normals\n * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.\n * @param numberPerEdge the number of new vertices to add to each edge of a facet, optional default 1\n */\n increaseVertices(e = 1) {\n const t = re.ExtractFromMesh(this), i = t.indices && !Array.isArray(t.indices) && Array.from ? Array.from(t.indices) : t.indices, r = t.positions && !Array.isArray(t.positions) && Array.from ? Array.from(t.positions) : t.positions, s = t.uvs && !Array.isArray(t.uvs) && Array.from ? Array.from(t.uvs) : t.uvs, a = t.normals && !Array.isArray(t.normals) && Array.from ? Array.from(t.normals) : t.normals;\n if (!i || !r)\n ne.Warn(\"Couldn't increase number of vertices : VertexData must contain at least indices and positions\");\n else {\n t.indices = i, t.positions = r, s && (t.uvs = s), a && (t.normals = a);\n const o = e + 1, l = new Array();\n for (let R = 0; R < o + 1; R++)\n l[R] = new Array();\n let c, h;\n const u = new _(0, 0, 0), f = new _(0, 0, 0), d = new me(0, 0), p = new Array(), g = new Array(), m = new Array();\n let v, E = r.length, C;\n s && (C = s.length);\n let T;\n a && (T = a.length);\n for (let R = 0; R < i.length; R += 3) {\n g[0] = i[R], g[1] = i[R + 1], g[2] = i[R + 2];\n for (let x = 0; x < 3; x++)\n if (c = g[x], h = g[(x + 1) % 3], m[c] === void 0 && m[h] === void 0 ? (m[c] = new Array(), m[h] = new Array()) : (m[c] === void 0 && (m[c] = new Array()), m[h] === void 0 && (m[h] = new Array())), m[c][h] === void 0 && m[h][c] === void 0) {\n m[c][h] = [], u.x = (r[3 * h] - r[3 * c]) / o, u.y = (r[3 * h + 1] - r[3 * c + 1]) / o, u.z = (r[3 * h + 2] - r[3 * c + 2]) / o, a && (f.x = (a[3 * h] - a[3 * c]) / o, f.y = (a[3 * h + 1] - a[3 * c + 1]) / o, f.z = (a[3 * h + 2] - a[3 * c + 2]) / o), s && (d.x = (s[2 * h] - s[2 * c]) / o, d.y = (s[2 * h + 1] - s[2 * c + 1]) / o), m[c][h].push(c);\n for (let S = 1; S < o; S++)\n m[c][h].push(r.length / 3), r[E++] = r[3 * c] + S * u.x, r[E++] = r[3 * c + 1] + S * u.y, r[E++] = r[3 * c + 2] + S * u.z, a && (a[T++] = a[3 * c] + S * f.x, a[T++] = a[3 * c + 1] + S * f.y, a[T++] = a[3 * c + 2] + S * f.z), s && (s[C++] = s[2 * c] + S * d.x, s[C++] = s[2 * c + 1] + S * d.y);\n m[c][h].push(h), m[h][c] = new Array(), v = m[c][h].length;\n for (let S = 0; S < v; S++)\n m[h][c][S] = m[c][h][v - 1 - S];\n }\n l[0][0] = i[R], l[1][0] = m[i[R]][i[R + 1]][1], l[1][1] = m[i[R]][i[R + 2]][1];\n for (let x = 2; x < o; x++) {\n l[x][0] = m[i[R]][i[R + 1]][x], l[x][x] = m[i[R]][i[R + 2]][x], u.x = (r[3 * l[x][x]] - r[3 * l[x][0]]) / x, u.y = (r[3 * l[x][x] + 1] - r[3 * l[x][0] + 1]) / x, u.z = (r[3 * l[x][x] + 2] - r[3 * l[x][0] + 2]) / x, a && (f.x = (a[3 * l[x][x]] - a[3 * l[x][0]]) / x, f.y = (a[3 * l[x][x] + 1] - a[3 * l[x][0] + 1]) / x, f.z = (a[3 * l[x][x] + 2] - a[3 * l[x][0] + 2]) / x), s && (d.x = (s[2 * l[x][x]] - s[2 * l[x][0]]) / x, d.y = (s[2 * l[x][x] + 1] - s[2 * l[x][0] + 1]) / x);\n for (let S = 1; S < x; S++)\n l[x][S] = r.length / 3, r[E++] = r[3 * l[x][0]] + S * u.x, r[E++] = r[3 * l[x][0] + 1] + S * u.y, r[E++] = r[3 * l[x][0] + 2] + S * u.z, a && (a[T++] = a[3 * l[x][0]] + S * f.x, a[T++] = a[3 * l[x][0] + 1] + S * f.y, a[T++] = a[3 * l[x][0] + 2] + S * f.z), s && (s[C++] = s[2 * l[x][0]] + S * d.x, s[C++] = s[2 * l[x][0] + 1] + S * d.y);\n }\n l[o] = m[i[R + 1]][i[R + 2]], p.push(l[0][0], l[1][0], l[1][1]);\n for (let x = 1; x < o; x++) {\n let S;\n for (S = 0; S < x; S++)\n p.push(l[x][S], l[x + 1][S], l[x + 1][S + 1]), p.push(l[x][S], l[x + 1][S + 1], l[x][S + 1]);\n p.push(l[x][S], l[x + 1][S], l[x + 1][S + 1]);\n }\n }\n t.indices = p, t.applyToMesh(this, this.isVertexBufferUpdatable(I.PositionKind));\n }\n }\n /**\n * Force adjacent facets to share vertices and remove any facets that have all vertices in a line\n * This will undo any application of covertToFlatShadedMesh\n * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.\n */\n forceSharedVertices() {\n const e = re.ExtractFromMesh(this), t = e.uvs, i = e.indices, r = e.positions, s = e.colors, a = e.matricesIndices, o = e.matricesWeights, l = e.matricesIndicesExtra, c = e.matricesWeightsExtra;\n if (i === void 0 || r === void 0 || i === null || r === null)\n ne.Warn(\"VertexData contains empty entries\");\n else {\n const h = new Array(), u = new Array(), f = new Array(), d = new Array(), p = new Array(), g = new Array(), m = new Array(), v = new Array();\n let E = new Array(), C = 0;\n const T = {};\n let R, x;\n for (let M = 0; M < i.length; M += 3) {\n x = [i[M], i[M + 1], i[M + 2]], E = [];\n for (let N = 0; N < 3; N++) {\n E[N] = \"\";\n for (let F = 0; F < 3; F++)\n Math.abs(r[3 * x[N] + F]) < 1e-8 && (r[3 * x[N] + F] = 0), E[N] += r[3 * x[N] + F] + \"|\";\n }\n if (!(E[0] == E[1] || E[0] == E[2] || E[1] == E[2]))\n for (let N = 0; N < 3; N++) {\n if (R = T[E[N]], R === void 0) {\n T[E[N]] = C, R = C++;\n for (let F = 0; F < 3; F++)\n h.push(r[3 * x[N] + F]);\n if (s != null)\n for (let F = 0; F < 4; F++)\n d.push(s[4 * x[N] + F]);\n if (t != null)\n for (let F = 0; F < 2; F++)\n f.push(t[2 * x[N] + F]);\n if (a != null)\n for (let F = 0; F < 4; F++)\n p.push(a[4 * x[N] + F]);\n if (o != null)\n for (let F = 0; F < 4; F++)\n g.push(o[4 * x[N] + F]);\n if (l != null)\n for (let F = 0; F < 4; F++)\n m.push(l[4 * x[N] + F]);\n if (c != null)\n for (let F = 0; F < 4; F++)\n v.push(c[4 * x[N] + F]);\n }\n u.push(R);\n }\n }\n const S = new Array();\n re.ComputeNormals(h, u, S), e.positions = h, e.indices = u, e.normals = S, t != null && (e.uvs = f), s != null && (e.colors = d), a != null && (e.matricesIndices = p), o != null && (e.matricesWeights = g), l != null && (e.matricesIndicesExtra = m), o != null && (e.matricesWeightsExtra = v), e.applyToMesh(this, this.isVertexBufferUpdatable(I.PositionKind));\n }\n }\n // Instances\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/naming-convention\n static _instancedMeshFactory(e, t) {\n throw We(\"InstancedMesh\");\n }\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static _PhysicsImpostorParser(e, t, i) {\n throw We(\"PhysicsImpostor\");\n }\n /**\n * Creates a new InstancedMesh object from the mesh model.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\n * @param name defines the name of the new instance\n * @returns a new InstancedMesh\n */\n createInstance(e) {\n return B._instancedMeshFactory(e, this);\n }\n /**\n * Synchronises all the mesh instance submeshes to the current mesh submeshes, if any.\n * After this call, all the mesh instances have the same submeshes than the current mesh.\n * @returns the current mesh\n */\n synchronizeInstances() {\n for (let e = 0; e < this.instances.length; e++)\n this.instances[e]._syncSubMeshes();\n return this;\n }\n /**\n * Optimization of the mesh's indices, in case a mesh has duplicated vertices.\n * The function will only reorder the indices and will not remove unused vertices to avoid problems with submeshes.\n * This should be used together with the simplification to avoid disappearing triangles.\n * @param successCallback an optional success callback to be called after the optimization finished.\n * @returns the current mesh\n */\n optimizeIndices(e) {\n const t = this.getIndices(), i = this.getVerticesData(I.PositionKind);\n if (!i || !t)\n return this;\n const r = [];\n for (let a = 0; a < i.length; a = a + 3)\n r.push(_.FromArray(i, a));\n const s = [];\n return Pr.SyncAsyncForLoop(r.length, 40, (a) => {\n const o = r.length - 1 - a, l = r[o];\n for (let c = 0; c < o; ++c) {\n const h = r[c];\n if (l.equals(h)) {\n s[o] = c;\n break;\n }\n }\n }, () => {\n for (let o = 0; o < t.length; ++o)\n t[o] = s[t[o]] || t[o];\n const a = this.subMeshes.slice(0);\n this.setIndices(t), this.subMeshes = a, e && e(this);\n }), this;\n }\n /**\n * Serialize current mesh\n * @param serializationObject defines the object which will receive the serialization data\n * @returns the serialized object\n */\n serialize(e = {}) {\n e.name = this.name, e.id = this.id, e.uniqueId = this.uniqueId, e.type = this.getClassName(), rt && rt.HasTags(this) && (e.tags = rt.GetTags(this)), e.position = this.position.asArray(), this.rotationQuaternion ? e.rotationQuaternion = this.rotationQuaternion.asArray() : this.rotation && (e.rotation = this.rotation.asArray()), e.scaling = this.scaling.asArray(), this._postMultiplyPivotMatrix ? e.pivotMatrix = this.getPivotMatrix().asArray() : e.localMatrix = this.getPivotMatrix().asArray(), e.isEnabled = this.isEnabled(!1), e.isVisible = this.isVisible, e.infiniteDistance = this.infiniteDistance, e.pickable = this.isPickable, e.receiveShadows = this.receiveShadows, e.billboardMode = this.billboardMode, e.visibility = this.visibility, e.alwaysSelectAsActiveMesh = this.alwaysSelectAsActiveMesh, e.checkCollisions = this.checkCollisions, e.ellipsoid = this.ellipsoid.asArray(), e.ellipsoidOffset = this.ellipsoidOffset.asArray(), e.doNotSyncBoundingInfo = this.doNotSyncBoundingInfo, e.isBlocker = this.isBlocker, e.overrideMaterialSideOrientation = this.overrideMaterialSideOrientation, this.parent && this.parent._serializeAsParent(e), e.isUnIndexed = this.isUnIndexed;\n const t = this._geometry;\n if (t && this.subMeshes) {\n e.geometryUniqueId = t.uniqueId, e.geometryId = t.id, e.subMeshes = [];\n for (let i = 0; i < this.subMeshes.length; i++) {\n const r = this.subMeshes[i];\n e.subMeshes.push({\n materialIndex: r.materialIndex,\n verticesStart: r.verticesStart,\n verticesCount: r.verticesCount,\n indexStart: r.indexStart,\n indexCount: r.indexCount\n });\n }\n }\n if (this.material ? this.material.doNotSerialize || (e.materialUniqueId = this.material.uniqueId, e.materialId = this.material.id) : (this.material = null, e.materialUniqueId = this._scene.defaultMaterial.uniqueId, e.materialId = this._scene.defaultMaterial.id), this.morphTargetManager && (e.morphTargetManagerId = this.morphTargetManager.uniqueId), this.skeleton && (e.skeletonId = this.skeleton.id, e.numBoneInfluencers = this.numBoneInfluencers), this.getScene()._getComponent(ke.NAME_PHYSICSENGINE)) {\n const i = this.getPhysicsImpostor();\n i && (e.physicsMass = i.getParam(\"mass\"), e.physicsFriction = i.getParam(\"friction\"), e.physicsRestitution = i.getParam(\"mass\"), e.physicsImpostor = i.type);\n }\n this.metadata && (e.metadata = this.metadata), e.instances = [];\n for (let i = 0; i < this.instances.length; i++) {\n const r = this.instances[i];\n if (r.doNotSerialize)\n continue;\n const s = {\n name: r.name,\n id: r.id,\n isEnabled: r.isEnabled(!1),\n isVisible: r.isVisible,\n isPickable: r.isPickable,\n checkCollisions: r.checkCollisions,\n position: r.position.asArray(),\n scaling: r.scaling.asArray()\n };\n if (r.parent && r.parent._serializeAsParent(s), r.rotationQuaternion ? s.rotationQuaternion = r.rotationQuaternion.asArray() : r.rotation && (s.rotation = r.rotation.asArray()), this.getScene()._getComponent(ke.NAME_PHYSICSENGINE)) {\n const a = r.getPhysicsImpostor();\n a && (s.physicsMass = a.getParam(\"mass\"), s.physicsFriction = a.getParam(\"friction\"), s.physicsRestitution = a.getParam(\"mass\"), s.physicsImpostor = a.type);\n }\n r.metadata && (s.metadata = r.metadata), r.actionManager && (s.actions = r.actionManager.serialize(r.name)), e.instances.push(s), Le.AppendSerializedAnimations(r, s), s.ranges = r.serializeAnimationRanges();\n }\n if (this._thinInstanceDataStorage.instancesCount && this._thinInstanceDataStorage.matrixData && (e.thinInstances = {\n instancesCount: this._thinInstanceDataStorage.instancesCount,\n matrixData: Array.from(this._thinInstanceDataStorage.matrixData),\n matrixBufferSize: this._thinInstanceDataStorage.matrixBufferSize,\n enablePicking: this.thinInstanceEnablePicking\n }, this._userThinInstanceBuffersStorage)) {\n const i = {\n data: {},\n sizes: {},\n strides: {}\n };\n for (const r in this._userThinInstanceBuffersStorage.data)\n i.data[r] = Array.from(this._userThinInstanceBuffersStorage.data[r]), i.sizes[r] = this._userThinInstanceBuffersStorage.sizes[r], i.strides[r] = this._userThinInstanceBuffersStorage.strides[r];\n e.thinInstances.userThinInstance = i;\n }\n return Le.AppendSerializedAnimations(this, e), e.ranges = this.serializeAnimationRanges(), e.layerMask = this.layerMask, e.alphaIndex = this.alphaIndex, e.hasVertexAlpha = this.hasVertexAlpha, e.overlayAlpha = this.overlayAlpha, e.overlayColor = this.overlayColor.asArray(), e.renderOverlay = this.renderOverlay, e.applyFog = this.applyFog, this.actionManager && (e.actions = this.actionManager.serialize(this.name)), e;\n }\n /** @internal */\n _syncGeometryWithMorphTargetManager() {\n if (!this.geometry)\n return;\n this._markSubMeshesAsAttributesDirty();\n const e = this._internalAbstractMeshDataInfo._morphTargetManager;\n if (e && e.vertexCount) {\n if (e.vertexCount !== this.getTotalVertices()) {\n ne.Error(\"Mesh is incompatible with morph targets. Targets and mesh must all have the same vertices count.\"), this.morphTargetManager = null;\n return;\n }\n if (e.isUsingTextureForTargets)\n return;\n for (let t = 0; t < e.numInfluencers; t++) {\n const i = e.getActiveTarget(t), r = i.getPositions();\n if (!r) {\n ne.Error(\"Invalid morph target. Target must have positions.\");\n return;\n }\n this.geometry.setVerticesData(I.PositionKind + t, r, !1, 3);\n const s = i.getNormals();\n s && this.geometry.setVerticesData(I.NormalKind + t, s, !1, 3);\n const a = i.getTangents();\n a && this.geometry.setVerticesData(I.TangentKind + t, a, !1, 3);\n const o = i.getUVs();\n o && this.geometry.setVerticesData(I.UVKind + \"_\" + t, o, !1, 2);\n }\n } else {\n let t = 0;\n for (; this.geometry.isVerticesDataPresent(I.PositionKind + t); )\n this.geometry.removeVerticesData(I.PositionKind + t), this.geometry.isVerticesDataPresent(I.NormalKind + t) && this.geometry.removeVerticesData(I.NormalKind + t), this.geometry.isVerticesDataPresent(I.TangentKind + t) && this.geometry.removeVerticesData(I.TangentKind + t), this.geometry.isVerticesDataPresent(I.UVKind + t) && this.geometry.removeVerticesData(I.UVKind + \"_\" + t), t++;\n }\n }\n /**\n * Returns a new Mesh object parsed from the source provided.\n * @param parsedMesh is the source\n * @param scene defines the hosting scene\n * @param rootUrl is the root URL to prefix the `delayLoadingFile` property with\n * @returns a new Mesh\n */\n static Parse(e, t, i) {\n let r;\n if (e.type && e.type === \"LinesMesh\" ? r = B._LinesMeshParser(e, t) : e.type && e.type === \"GroundMesh\" ? r = B._GroundMeshParser(e, t) : e.type && e.type === \"GoldbergMesh\" ? r = B._GoldbergMeshParser(e, t) : e.type && e.type === \"GreasedLineMesh\" ? r = B._GreasedLineMeshParser(e, t) : e.type && e.type === \"TrailMesh\" ? r = B._TrailMeshParser(e, t) : r = new B(e.name, t), r.id = e.id, r._waitingParsedUniqueId = e.uniqueId, rt && rt.AddTagsTo(r, e.tags), r.position = _.FromArray(e.position), e.metadata !== void 0 && (r.metadata = e.metadata), e.rotationQuaternion ? r.rotationQuaternion = Ce.FromArray(e.rotationQuaternion) : e.rotation && (r.rotation = _.FromArray(e.rotation)), r.scaling = _.FromArray(e.scaling), e.localMatrix ? r.setPreTransformMatrix(L.FromArray(e.localMatrix)) : e.pivotMatrix && r.setPivotMatrix(L.FromArray(e.pivotMatrix)), r.setEnabled(e.isEnabled), r.isVisible = e.isVisible, r.infiniteDistance = e.infiniteDistance, r.alwaysSelectAsActiveMesh = !!e.alwaysSelectAsActiveMesh, r.showBoundingBox = e.showBoundingBox, r.showSubMeshesBoundingBox = e.showSubMeshesBoundingBox, e.applyFog !== void 0 && (r.applyFog = e.applyFog), e.pickable !== void 0 && (r.isPickable = e.pickable), e.alphaIndex !== void 0 && (r.alphaIndex = e.alphaIndex), r.receiveShadows = e.receiveShadows, e.billboardMode !== void 0 && (r.billboardMode = e.billboardMode), e.visibility !== void 0 && (r.visibility = e.visibility), r.checkCollisions = e.checkCollisions, r.doNotSyncBoundingInfo = !!e.doNotSyncBoundingInfo, e.ellipsoid && (r.ellipsoid = _.FromArray(e.ellipsoid)), e.ellipsoidOffset && (r.ellipsoidOffset = _.FromArray(e.ellipsoidOffset)), e.overrideMaterialSideOrientation !== void 0 && (r.overrideMaterialSideOrientation = e.overrideMaterialSideOrientation), e.isBlocker !== void 0 && (r.isBlocker = e.isBlocker), r._shouldGenerateFlatShading = e.useFlatShading, e.freezeWorldMatrix && (r._waitingData.freezeWorldMatrix = e.freezeWorldMatrix), e.parentId !== void 0 && (r._waitingParentId = e.parentId), e.parentInstanceIndex !== void 0 && (r._waitingParentInstanceIndex = e.parentInstanceIndex), e.actions !== void 0 && (r._waitingData.actions = e.actions), e.overlayAlpha !== void 0 && (r.overlayAlpha = e.overlayAlpha), e.overlayColor !== void 0 && (r.overlayColor = Ne.FromArray(e.overlayColor)), e.renderOverlay !== void 0 && (r.renderOverlay = e.renderOverlay), r.isUnIndexed = !!e.isUnIndexed, r.hasVertexAlpha = e.hasVertexAlpha, e.delayLoadingFile ? (r.delayLoadState = 4, r.delayLoadingFile = i + e.delayLoadingFile, r.buildBoundingInfo(_.FromArray(e.boundingBoxMinimum), _.FromArray(e.boundingBoxMaximum)), e._binaryInfo && (r._binaryInfo = e._binaryInfo), r._delayInfo = [], e.hasUVs && r._delayInfo.push(I.UVKind), e.hasUVs2 && r._delayInfo.push(I.UV2Kind), e.hasUVs3 && r._delayInfo.push(I.UV3Kind), e.hasUVs4 && r._delayInfo.push(I.UV4Kind), e.hasUVs5 && r._delayInfo.push(I.UV5Kind), e.hasUVs6 && r._delayInfo.push(I.UV6Kind), e.hasColors && r._delayInfo.push(I.ColorKind), e.hasMatricesIndices && r._delayInfo.push(I.MatricesIndicesKind), e.hasMatricesWeights && r._delayInfo.push(I.MatricesWeightsKind), r._delayLoadingFunction = is._ImportGeometry, ir.ForceFullSceneLoadingForIncremental && r._checkDelayState()) : is._ImportGeometry(e, r), e.materialUniqueId ? r._waitingMaterialId = e.materialUniqueId : e.materialId && (r._waitingMaterialId = e.materialId), e.morphTargetManagerId > -1 && (r.morphTargetManager = t.getMorphTargetManagerById(e.morphTargetManagerId)), e.skeletonId !== void 0 && e.skeletonId !== null && (r.skeleton = t.getLastSkeletonById(e.skeletonId), e.numBoneInfluencers && (r.numBoneInfluencers = e.numBoneInfluencers)), e.animations) {\n for (let s = 0; s < e.animations.length; s++) {\n const a = e.animations[s], o = mr(\"BABYLON.Animation\");\n o && r.animations.push(o.Parse(a));\n }\n Ai.ParseAnimationRanges(r, e, t);\n }\n if (e.autoAnimate && t.beginAnimation(r, e.autoAnimateFrom, e.autoAnimateTo, e.autoAnimateLoop, e.autoAnimateSpeed || 1), e.layerMask && !isNaN(e.layerMask) ? r.layerMask = Math.abs(parseInt(e.layerMask)) : r.layerMask = 268435455, e.physicsImpostor && B._PhysicsImpostorParser(t, r, e), e.lodMeshIds && (r._waitingData.lods = {\n ids: e.lodMeshIds,\n distances: e.lodDistances ? e.lodDistances : null,\n coverages: e.lodCoverages ? e.lodCoverages : null\n }), e.instances)\n for (let s = 0; s < e.instances.length; s++) {\n const a = e.instances[s], o = r.createInstance(a.name);\n if (a.id && (o.id = a.id), rt && (a.tags ? rt.AddTagsTo(o, a.tags) : rt.AddTagsTo(o, e.tags)), o.position = _.FromArray(a.position), a.metadata !== void 0 && (o.metadata = a.metadata), a.parentId !== void 0 && (o._waitingParentId = a.parentId), a.parentInstanceIndex !== void 0 && (o._waitingParentInstanceIndex = a.parentInstanceIndex), a.isEnabled !== void 0 && a.isEnabled !== null && o.setEnabled(a.isEnabled), a.isVisible !== void 0 && a.isVisible !== null && (o.isVisible = a.isVisible), a.isPickable !== void 0 && a.isPickable !== null && (o.isPickable = a.isPickable), a.rotationQuaternion ? o.rotationQuaternion = Ce.FromArray(a.rotationQuaternion) : a.rotation && (o.rotation = _.FromArray(a.rotation)), o.scaling = _.FromArray(a.scaling), a.checkCollisions != null && a.checkCollisions != null && (o.checkCollisions = a.checkCollisions), a.pickable != null && a.pickable != null && (o.isPickable = a.pickable), a.showBoundingBox != null && a.showBoundingBox != null && (o.showBoundingBox = a.showBoundingBox), a.showSubMeshesBoundingBox != null && a.showSubMeshesBoundingBox != null && (o.showSubMeshesBoundingBox = a.showSubMeshesBoundingBox), a.alphaIndex != null && a.showSubMeshesBoundingBox != null && (o.alphaIndex = a.alphaIndex), a.physicsImpostor && B._PhysicsImpostorParser(t, o, a), a.actions !== void 0 && (o._waitingData.actions = a.actions), a.animations) {\n for (let l = 0; l < a.animations.length; l++) {\n const c = a.animations[l], h = mr(\"BABYLON.Animation\");\n h && o.animations.push(h.Parse(c));\n }\n Ai.ParseAnimationRanges(o, a, t), a.autoAnimate && t.beginAnimation(o, a.autoAnimateFrom, a.autoAnimateTo, a.autoAnimateLoop, a.autoAnimateSpeed || 1);\n }\n }\n if (e.thinInstances) {\n const s = e.thinInstances;\n if (r.thinInstanceEnablePicking = !!s.enablePicking, s.matrixData ? (r.thinInstanceSetBuffer(\"matrix\", new Float32Array(s.matrixData), 16, !1), r._thinInstanceDataStorage.matrixBufferSize = s.matrixBufferSize, r._thinInstanceDataStorage.instancesCount = s.instancesCount) : r._thinInstanceDataStorage.matrixBufferSize = s.matrixBufferSize, e.thinInstances.userThinInstance) {\n const a = e.thinInstances.userThinInstance;\n for (const o in a.data)\n r.thinInstanceSetBuffer(o, new Float32Array(a.data[o]), a.strides[o], !1), r._userThinInstanceBuffersStorage.sizes[o] = a.sizes[o];\n }\n }\n return r;\n }\n // Skeletons\n /**\n * Prepare internal position array for software CPU skinning\n * @returns original positions used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh\n */\n setPositionsForCPUSkinning() {\n const e = this._internalMeshDataInfo;\n if (!e._sourcePositions) {\n const t = this.getVerticesData(I.PositionKind);\n if (!t)\n return e._sourcePositions;\n e._sourcePositions = new Float32Array(t), this.isVertexBufferUpdatable(I.PositionKind) || this.setVerticesData(I.PositionKind, t, !0);\n }\n return e._sourcePositions;\n }\n /**\n * Prepare internal normal array for software CPU skinning\n * @returns original normals used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh.\n */\n setNormalsForCPUSkinning() {\n const e = this._internalMeshDataInfo;\n if (!e._sourceNormals) {\n const t = this.getVerticesData(I.NormalKind);\n if (!t)\n return e._sourceNormals;\n e._sourceNormals = new Float32Array(t), this.isVertexBufferUpdatable(I.NormalKind) || this.setVerticesData(I.NormalKind, t, !0);\n }\n return e._sourceNormals;\n }\n /**\n * Updates the vertex buffer by applying transformation from the bones\n * @param skeleton defines the skeleton to apply to current mesh\n * @returns the current mesh\n */\n applySkeleton(e) {\n if (!this.geometry)\n return this;\n if (this.geometry._softwareSkinningFrameId == this.getScene().getFrameId())\n return this;\n if (this.geometry._softwareSkinningFrameId = this.getScene().getFrameId(), !this.isVerticesDataPresent(I.PositionKind))\n return this;\n if (!this.isVerticesDataPresent(I.MatricesIndicesKind))\n return this;\n if (!this.isVerticesDataPresent(I.MatricesWeightsKind))\n return this;\n const t = this.isVerticesDataPresent(I.NormalKind), i = this._internalMeshDataInfo;\n if (!i._sourcePositions) {\n const v = this.subMeshes.slice();\n this.setPositionsForCPUSkinning(), this.subMeshes = v;\n }\n t && !i._sourceNormals && this.setNormalsForCPUSkinning();\n let r = this.getVerticesData(I.PositionKind);\n if (!r)\n return this;\n r instanceof Float32Array || (r = new Float32Array(r));\n let s = this.getVerticesData(I.NormalKind);\n if (t) {\n if (!s)\n return this;\n s instanceof Float32Array || (s = new Float32Array(s));\n }\n const a = this.getVerticesData(I.MatricesIndicesKind), o = this.getVerticesData(I.MatricesWeightsKind);\n if (!o || !a)\n return this;\n const l = this.numBoneInfluencers > 4, c = l ? this.getVerticesData(I.MatricesIndicesExtraKind) : null, h = l ? this.getVerticesData(I.MatricesWeightsExtraKind) : null, u = e.getTransformMatrices(this), f = _.Zero(), d = new L(), p = new L();\n let g = 0, m;\n for (let v = 0; v < r.length; v += 3, g += 4) {\n let E;\n for (m = 0; m < 4; m++)\n E = o[g + m], E > 0 && (L.FromFloat32ArrayToRefScaled(u, Math.floor(a[g + m] * 16), E, p), d.addToSelf(p));\n if (l)\n for (m = 0; m < 4; m++)\n E = h[g + m], E > 0 && (L.FromFloat32ArrayToRefScaled(u, Math.floor(c[g + m] * 16), E, p), d.addToSelf(p));\n _.TransformCoordinatesFromFloatsToRef(i._sourcePositions[v], i._sourcePositions[v + 1], i._sourcePositions[v + 2], d, f), f.toArray(r, v), t && (_.TransformNormalFromFloatsToRef(i._sourceNormals[v], i._sourceNormals[v + 1], i._sourceNormals[v + 2], d, f), f.toArray(s, v)), d.reset();\n }\n return this.updateVerticesData(I.PositionKind, r), t && this.updateVerticesData(I.NormalKind, s), this;\n }\n // Tools\n /**\n * Returns an object containing a min and max Vector3 which are the minimum and maximum vectors of each mesh bounding box from the passed array, in the world coordinates\n * @param meshes defines the list of meshes to scan\n * @returns an object `{min:` Vector3`, max:` Vector3`}`\n */\n static MinMax(e) {\n let t = null, i = null;\n return e.forEach(function(r) {\n const a = r.getBoundingInfo().boundingBox;\n !t || !i ? (t = a.minimumWorld, i = a.maximumWorld) : (t.minimizeInPlace(a.minimumWorld), i.maximizeInPlace(a.maximumWorld));\n }), !t || !i ? {\n min: _.Zero(),\n max: _.Zero()\n } : {\n min: t,\n max: i\n };\n }\n /**\n * Returns the center of the `{min:` Vector3`, max:` Vector3`}` or the center of MinMax vector3 computed from a mesh array\n * @param meshesOrMinMaxVector could be an array of meshes or a `{min:` Vector3`, max:` Vector3`}` object\n * @returns a vector3\n */\n static Center(e) {\n const t = e instanceof Array ? B.MinMax(e) : e;\n return _.Center(t.min, t.max);\n }\n /**\n * Merge the array of meshes into a single mesh for performance reasons.\n * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes.\n * @param disposeSource when true (default), dispose of the vertices from the source meshes.\n * @param allow32BitsIndices when the sum of the vertices > 64k, this must be set to true.\n * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted.\n * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes.\n * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes.\n * @returns a new mesh\n */\n static MergeMeshes(e, t = !0, i, r, s, a) {\n return nf(B._MergeMeshesCoroutine(e, t, i, r, s, a, !1));\n }\n /**\n * Merge the array of meshes into a single mesh for performance reasons.\n * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes.\n * @param disposeSource when true (default), dispose of the vertices from the source meshes.\n * @param allow32BitsIndices when the sum of the vertices > 64k, this must be set to true.\n * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted.\n * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes.\n * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes.\n * @returns a new mesh\n */\n static MergeMeshesAsync(e, t = !0, i, r, s, a) {\n return j_(B._MergeMeshesCoroutine(e, t, i, r, s, a, !0), zy());\n }\n static *_MergeMeshesCoroutine(e, t = !0, i, r, s, a, o) {\n if (e = e.filter(Boolean), e.length === 0)\n return null;\n let l;\n if (!i) {\n let S = 0;\n for (l = 0; l < e.length; l++)\n if (S += e[l].getTotalVertices(), S >= 65536)\n return ne.Warn(\"Cannot merge meshes because resulting mesh will have more than 65536 vertices. Please use allow32BitsIndices = true to use 32 bits indices\"), null;\n }\n a && (s = !1);\n const c = new Array(), h = new Array(), u = new Array(), f = e[0].overrideMaterialSideOrientation;\n for (l = 0; l < e.length; l++) {\n const S = e[l];\n if (S.isAnInstance)\n return ne.Warn(\"Cannot merge instance meshes.\"), null;\n if (f !== S.overrideMaterialSideOrientation)\n return ne.Warn(\"Cannot merge meshes with different overrideMaterialSideOrientation values.\"), null;\n if (s && u.push(S.getTotalIndices()), a)\n if (S.material) {\n const M = S.material;\n if (M instanceof Aa) {\n for (let N = 0; N < M.subMaterials.length; N++)\n c.indexOf(M.subMaterials[N]) < 0 && c.push(M.subMaterials[N]);\n for (let N = 0; N < S.subMeshes.length; N++)\n h.push(c.indexOf(M.subMaterials[S.subMeshes[N].materialIndex])), u.push(S.subMeshes[N].indexCount);\n } else {\n c.indexOf(M) < 0 && c.push(M);\n for (let N = 0; N < S.subMeshes.length; N++)\n h.push(c.indexOf(M)), u.push(S.subMeshes[N].indexCount);\n }\n } else\n for (let M = 0; M < S.subMeshes.length; M++)\n h.push(0), u.push(S.subMeshes[M].indexCount);\n }\n const d = e[0], p = (S) => {\n const M = S.computeWorldMatrix(!0);\n return { vertexData: re.ExtractFromMesh(S, !1, !1), transform: M };\n }, { vertexData: g, transform: m } = p(d);\n o && (yield);\n const v = new Array(e.length - 1);\n for (let S = 1; S < e.length; S++)\n v[S - 1] = p(e[S]), o && (yield);\n const E = g._mergeCoroutine(m, v, i, o, !t);\n let C = E.next();\n for (; !C.done; )\n o && (yield), C = E.next();\n const T = C.value;\n r || (r = new B(d.name + \"_merged\", d.getScene()));\n const R = T._applyToCoroutine(r, void 0, o);\n let x = R.next();\n for (; !x.done; )\n o && (yield), x = R.next();\n if (r.checkCollisions = d.checkCollisions, r.overrideMaterialSideOrientation = d.overrideMaterialSideOrientation, t)\n for (l = 0; l < e.length; l++)\n e[l].dispose();\n if (s || a) {\n r.releaseSubMeshes(), l = 0;\n let S = 0;\n for (; l < u.length; )\n bi.CreateFromIndices(0, S, u[l], r, void 0, !1), S += u[l], l++;\n for (const M of r.subMeshes)\n M.refreshBoundingInfo();\n r.computeWorldMatrix(!0);\n }\n if (a) {\n const S = new Aa(d.name + \"_merged\", d.getScene());\n S.subMaterials = c;\n for (let M = 0; M < r.subMeshes.length; M++)\n r.subMeshes[M].materialIndex = h[M];\n r.material = S;\n } else\n r.material = d.material;\n return r;\n }\n /**\n * @internal\n */\n addInstance(e) {\n e._indexInSourceMeshInstanceArray = this.instances.length, this.instances.push(e);\n }\n /**\n * @internal\n */\n removeInstance(e) {\n const t = e._indexInSourceMeshInstanceArray;\n if (t != -1) {\n if (t !== this.instances.length - 1) {\n const i = this.instances[this.instances.length - 1];\n this.instances[t] = i, i._indexInSourceMeshInstanceArray = t;\n }\n e._indexInSourceMeshInstanceArray = -1, this.instances.pop();\n }\n }\n /** @internal */\n _shouldConvertRHS() {\n return this.overrideMaterialSideOrientation === ie.CounterClockWiseSideOrientation;\n }\n /** @internal */\n _getRenderingFillMode(e) {\n const t = this.getScene();\n return t.forcePointsCloud ? ie.PointFillMode : t.forceWireframe ? ie.WireFrameFillMode : this.overrideRenderingFillMode ?? e;\n }\n // deprecated methods\n /**\n * Sets the mesh material by the material or multiMaterial `id` property\n * @param id is a string identifying the material or the multiMaterial\n * @returns the current mesh\n * @deprecated Please use MeshBuilder instead Please use setMaterialById instead\n */\n setMaterialByID(e) {\n return this.setMaterialById(e);\n }\n /**\n * Creates a ribbon mesh.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\n * @param name defines the name of the mesh to create\n * @param pathArray is a required array of paths, what are each an array of successive Vector3. The pathArray parameter depicts the ribbon geometry.\n * @param closeArray creates a seam between the first and the last paths of the path array (default is false)\n * @param closePath creates a seam between the first and the last points of each path of the path array\n * @param offset is taken in account only if the `pathArray` is containing a single path\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @param instance defines an instance of an existing Ribbon object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#ribbon)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateRibbon(e, t, i, r, s, a, o, l, c) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a plane polygonal mesh. By default, this is a disc.\n * @param name defines the name of the mesh to create\n * @param radius sets the radius size (float) of the polygon (default 0.5)\n * @param tessellation sets the number of polygon sides (positive integer, default 64). So a tessellation valued to 3 will build a triangle, to 4 a square, etc\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateDisc(e, t, i, r, s, a) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a box mesh.\n * @param name defines the name of the mesh to create\n * @param size sets the size (float) of each box side (default 1)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateBox(e, t, i, r, s) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a sphere mesh.\n * @param name defines the name of the mesh to create\n * @param segments sets the sphere number of horizontal stripes (positive integer, default 32)\n * @param diameter sets the diameter size (float) of the sphere (default 1)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateSphere(e, t, i, r, s, a) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a hemisphere mesh.\n * @param name defines the name of the mesh to create\n * @param segments sets the sphere number of horizontal stripes (positive integer, default 32)\n * @param diameter sets the diameter size (float) of the sphere (default 1)\n * @param scene defines the hosting scene\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateHemisphere(e, t, i, r) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a cylinder or a cone mesh.\n * @param name defines the name of the mesh to create\n * @param height sets the height size (float) of the cylinder/cone (float, default 2)\n * @param diameterTop set the top cap diameter (floats, default 1)\n * @param diameterBottom set the bottom cap diameter (floats, default 1). This value can't be zero\n * @param tessellation sets the number of cylinder sides (positive integer, default 24). Set it to 3 to get a prism for instance\n * @param subdivisions sets the number of rings along the cylinder height (positive integer, default 1)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateCylinder(e, t, i, r, s, a, o, l, c) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n // Torus (Code from SharpDX.org)\n /**\n * Creates a torus mesh.\n * @param name defines the name of the mesh to create\n * @param diameter sets the diameter size (float) of the torus (default 1)\n * @param thickness sets the diameter size of the tube of the torus (float, default 0.5)\n * @param tessellation sets the number of torus sides (positive integer, default 16)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateTorus(e, t, i, r, s, a, o) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a torus knot mesh.\n * @param name defines the name of the mesh to create\n * @param radius sets the global radius size (float) of the torus knot (default 2)\n * @param tube sets the diameter size of the tube of the torus (float, default 0.5)\n * @param radialSegments sets the number of sides on each tube segments (positive integer, default 32)\n * @param tubularSegments sets the number of tubes to decompose the knot into (positive integer, default 32)\n * @param p the number of windings on X axis (positive integers, default 2)\n * @param q the number of windings on Y axis (positive integers, default 3)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateTorusKnot(e, t, i, r, s, a, o, l, c, h) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a line mesh..\n * @param name defines the name of the mesh to create\n * @param points is an array successive Vector3\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines).\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateLines(e, t, i, r, s) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a dashed line mesh.\n * @param name defines the name of the mesh to create\n * @param points is an array successive Vector3\n * @param dashSize is the size of the dashes relatively the dash number (positive float, default 3)\n * @param gapSize is the size of the gap between two successive dashes relatively the dash number (positive float, default 1)\n * @param dashNb is the intended total number of dashes (positive integer, default 200)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateDashedLines(e, t, i, r, s, a, o, l) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a polygon mesh.Please consider using the same method from the MeshBuilder class instead\n * The polygon's shape will depend on the input parameters and is constructed parallel to a ground mesh.\n * The parameter `shape` is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors.\n * You can set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created.\n * Remember you can only change the shape positions, not their number when updating a polygon.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#non-regular-polygon\n * @param name defines the name of the mesh to create\n * @param shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors\n * @param scene defines the hosting scene\n * @param holes is a required array of arrays of successive Vector3 used to defines holes in the polygon\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @param earcutInjection can be used to inject your own earcut reference\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreatePolygon(e, t, i, r, s, a, o) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates an extruded polygon mesh, with depth in the Y direction..\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-non-regular-polygon\n * @param name defines the name of the mesh to create\n * @param shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors\n * @param depth defines the height of extrusion\n * @param scene defines the hosting scene\n * @param holes is a required array of arrays of successive Vector3 used to defines holes in the polygon\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @param earcutInjection can be used to inject your own earcut reference\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static ExtrudePolygon(e, t, i, r, s, a, o, l) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates an extruded shape mesh.\n * The extrusion is a parametric shape. It has no predefined shape. Its final shape will depend on the input parameters.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes\n * @param name defines the name of the mesh to create\n * @param shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis\n * @param path is a required array of successive Vector3. This is the axis curve the shape is extruded along\n * @param scale is the value to scale the shape\n * @param rotation is the angle value to rotate the shape each step (each path point), from the former step (so rotation added each step) along the curve\n * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @param instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#extruded-shape)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static ExtrudeShape(e, t, i, r, s, a, o, l, c, h) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates an custom extruded shape mesh.\n * The custom extrusion is a parametric shape.\n * It has no predefined shape. Its final shape will depend on the input parameters.\n *\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes\n * @param name defines the name of the mesh to create\n * @param shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis\n * @param path is a required array of successive Vector3. This is the axis curve the shape is extruded along\n * @param scaleFunction is a custom Javascript function called on each path point\n * @param rotationFunction is a custom Javascript function called on each path point\n * @param ribbonCloseArray forces the extrusion underlying ribbon to close all the paths in its `pathArray`\n * @param ribbonClosePath forces the extrusion underlying ribbon to close its `pathArray`\n * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @param instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#extruded-shape)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static ExtrudeShapeCustom(e, t, i, r, s, a, o, l, c, h, u, f) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates lathe mesh.\n * The lathe is a shape with a symmetry axis : a 2D model shape is rotated around this axis to design the lathe.\n * @param name defines the name of the mesh to create\n * @param shape is a required array of successive Vector3. This array depicts the shape to be rotated in its local space : the shape must be designed in the xOy plane and will be rotated around the Y axis. It's usually a 2D shape, so the Vector3 z coordinates are often set to zero\n * @param radius is the radius value of the lathe\n * @param tessellation is the side number of the lathe.\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateLathe(e, t, i, r, s, a, o) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a plane mesh.\n * @param name defines the name of the mesh to create\n * @param size sets the size (float) of both sides of the plane at once (default 1)\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreatePlane(e, t, i, r, s) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a ground mesh.\n * @param name defines the name of the mesh to create\n * @param width set the width of the ground\n * @param height set the height of the ground\n * @param subdivisions sets the number of subdivisions per side\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateGround(e, t, i, r, s, a) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a tiled ground mesh.\n * @param name defines the name of the mesh to create\n * @param xmin set the ground minimum X coordinate\n * @param zmin set the ground minimum Y coordinate\n * @param xmax set the ground maximum X coordinate\n * @param zmax set the ground maximum Z coordinate\n * @param subdivisions is an object `{w: positive integer, h: positive integer}` (default `{w: 6, h: 6}`). `w` and `h` are the numbers of subdivisions on the ground width and height. Each subdivision is called a tile\n * @param precision is an object `{w: positive integer, h: positive integer}` (default `{w: 2, h: 2}`). `w` and `h` are the numbers of subdivisions on the ground width and height of each tile\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateTiledGround(e, t, i, r, s, a, o, l, c) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a ground mesh from a height map.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/height_map\n * @param name defines the name of the mesh to create\n * @param url sets the URL of the height map image resource\n * @param width set the ground width size\n * @param height set the ground height size\n * @param subdivisions sets the number of subdivision per side\n * @param minHeight is the minimum altitude on the ground\n * @param maxHeight is the maximum altitude on the ground\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param onReady is a callback function that will be called once the mesh is built (the height map download can last some time)\n * @param alphaFilter will filter any data where the alpha channel is below this value, defaults 0 (all data visible)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateGroundFromHeightMap(e, t, i, r, s, a, o, l, c, h, u) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a tube mesh.\n * The tube is a parametric shape.\n * It has no predefined shape. Its final shape will depend on the input parameters.\n *\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\n * @param name defines the name of the mesh to create\n * @param path is a required array of successive Vector3. It is the curve used as the axis of the tube\n * @param radius sets the tube radius size\n * @param tessellation is the number of sides on the tubular surface\n * @param radiusFunction is a custom function. If it is not null, it overrides the parameter `radius`. This function is called on each point of the tube path and is passed the index `i` of the i-th point and the distance of this point from the first point of the path\n * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL\n * @param scene defines the hosting scene\n * @param updatable defines if the mesh must be flagged as updatable\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\n * @param instance is an instance of an existing Tube object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#tube)\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateTube(e, t, i, r, s, a, o, l, c, h) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a polyhedron mesh.\n *.\n * * The parameter `type` (positive integer, max 14, default 0) sets the polyhedron type to build among the 15 embedded types. Please refer to the type sheet in the tutorial to choose the wanted type\n * * The parameter `size` (positive float, default 1) sets the polygon size\n * * You can overwrite the `size` on each dimension bu using the parameters `sizeX`, `sizeY` or `sizeZ` (positive floats, default to `size` value)\n * * You can build other polyhedron types than the 15 embbeded ones by setting the parameter `custom` (`polyhedronObject`, default null). If you set the parameter `custom`, this overwrittes the parameter `type`\n * * A `polyhedronObject` is a formatted javascript object. You'll find a full file with pre-set polyhedra here : https://github.com/BabylonJS/Extensions/tree/master/Polyhedron\n * * You can set the color and the UV of each side of the polyhedron with the parameters `faceColors` (Color4, default `(1, 1, 1, 1)`) and faceUV (Vector4, default `(0, 0, 1, 1)`)\n * * To understand how to set `faceUV` or `faceColors`, please read this by considering the right number of faces of your polyhedron, instead of only 6 for the box : https://doc.babylonjs.com/features/featuresDeepDive/materials/using/texturePerBoxFace\n * * The parameter `flat` (boolean, default true). If set to false, it gives the polyhedron a single global face, so less vertices and shared normals. In this case, `faceColors` and `faceUV` are ignored\n * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\n * @param name defines the name of the mesh to create\n * @param options defines the options used to create the mesh\n * @param scene defines the hosting scene\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreatePolyhedron(e, t, i) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a sphere based upon an icosahedron with 20 triangular faces which can be subdivided\n * * The parameter `radius` sets the radius size (float) of the icosphere (default 1)\n * * You can set some different icosphere dimensions, for instance to build an ellipsoid, by using the parameters `radiusX`, `radiusY` and `radiusZ` (all by default have the same value than `radius`)\n * * The parameter `subdivisions` sets the number of subdivisions (positive integer, default 4). The more subdivisions, the more faces on the icosphere whatever its size\n * * The parameter `flat` (boolean, default true) gives each side its own normals. Set it to false to get a smooth continuous light reflection on the surface\n * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/polyhedra#icosphere\n * @param name defines the name of the mesh\n * @param options defines the options used to create the mesh\n * @param scene defines the hosting scene\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateIcoSphere(e, t, i) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Creates a decal mesh.\n *.\n * A decal is a mesh usually applied as a model onto the surface of another mesh\n * @param name defines the name of the mesh\n * @param sourceMesh defines the mesh receiving the decal\n * @param position sets the position of the decal in world coordinates\n * @param normal sets the normal of the mesh where the decal is applied onto in world coordinates\n * @param size sets the decal scaling\n * @param angle sets the angle to rotate the decal\n * @returns a new Mesh\n * @deprecated Please use MeshBuilder instead\n */\n static CreateDecal(e, t, i, r, s, a) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /** Creates a Capsule Mesh\n * @param name defines the name of the mesh.\n * @param options the constructors options used to shape the mesh.\n * @param scene defines the scene the mesh is scoped to.\n * @returns the capsule mesh\n * @see https://doc.babylonjs.com/how_to/capsule_shape\n * @deprecated Please use MeshBuilder instead\n */\n static CreateCapsule(e, t, i) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n /**\n * Extends a mesh to a Goldberg mesh\n * Warning the mesh to convert MUST be an import of a perviously exported Goldberg mesh\n * @param mesh the mesh to convert\n * @returns the extended mesh\n * @deprecated Please use ExtendMeshToGoldberg instead\n */\n static ExtendToGoldberg(e) {\n throw new Error(\"Import MeshBuilder to populate this function\");\n }\n}\nB.FRONTSIDE = re.FRONTSIDE;\nB.BACKSIDE = re.BACKSIDE;\nB.DOUBLESIDE = re.DOUBLESIDE;\nB.DEFAULTSIDE = re.DEFAULTSIDE;\nB.NO_CAP = 0;\nB.CAP_START = 1;\nB.CAP_END = 2;\nB.CAP_ALL = 3;\nB.NO_FLIP = 0;\nB.FLIP_TILE = 1;\nB.ROTATE_TILE = 2;\nB.FLIP_ROW = 3;\nB.ROTATE_ROW = 4;\nB.FLIP_N_ROTATE_TILE = 5;\nB.FLIP_N_ROTATE_ROW = 6;\nB.CENTER = 0;\nB.LEFT = 1;\nB.RIGHT = 2;\nB.TOP = 3;\nB.BOTTOM = 4;\nB.INSTANCEDMESH_SORT_TRANSPARENT = !1;\nB._GroundMeshParser = (n, e) => {\n throw We(\"GroundMesh\");\n};\nB._GoldbergMeshParser = (n, e) => {\n throw We(\"GoldbergMesh\");\n};\nB._LinesMeshParser = (n, e) => {\n throw We(\"LinesMesh\");\n};\nB._GreasedLineMeshParser = (n, e) => {\n throw We(\"GreasedLineMesh\");\n};\nB._GreasedLineRibbonMeshParser = (n, e) => {\n throw We(\"GreasedLineRibbonMesh\");\n};\nB._TrailMeshParser = (n, e) => {\n throw We(\"TrailMesh\");\n};\nRe(\"BABYLON.Mesh\", B);\nlet _l = 0;\nclass vo {\n /**\n * Initializes the vertex\n * @param pos The position of the vertex\n * @param normal The normal of the vertex\n * @param uv The texture coordinate of the vertex\n * @param vertColor The RGBA color of the vertex\n */\n constructor(e, t, i, r) {\n this.pos = e, this.normal = t, this.uv = i, this.vertColor = r;\n }\n /**\n * Make a clone, or deep copy, of the vertex\n * @returns A new Vertex\n */\n clone() {\n var e, t;\n return new vo(this.pos.clone(), this.normal.clone(), (e = this.uv) == null ? void 0 : e.clone(), (t = this.vertColor) == null ? void 0 : t.clone());\n }\n /**\n * Invert all orientation-specific data (e.g. vertex normal). Called when the\n * orientation of a polygon is flipped.\n */\n flip() {\n this.normal = this.normal.scale(-1);\n }\n /**\n * Create a new vertex between this vertex and `other` by linearly\n * interpolating all properties using a parameter of `t`. Subclasses should\n * override this to interpolate additional properties.\n * @param other the vertex to interpolate against\n * @param t The factor used to linearly interpolate between the vertices\n * @returns The new interpolated vertex\n */\n interpolate(e, t) {\n return new vo(_.Lerp(this.pos, e.pos, t), _.Lerp(this.normal, e.normal, t), this.uv && e.uv ? me.Lerp(this.uv, e.uv, t) : void 0, this.vertColor && e.vertColor ? et.Lerp(this.vertColor, e.vertColor, t) : void 0);\n }\n}\nclass In {\n /**\n * Initializes the plane\n * @param normal The normal for the plane\n * @param w\n */\n constructor(e, t) {\n this.normal = e, this.w = t;\n }\n /**\n * Construct a plane from three points\n * @param a Point a\n * @param b Point b\n * @param c Point c\n * @returns A new plane\n */\n static FromPoints(e, t, i) {\n const r = i.subtract(e), s = t.subtract(e);\n if (r.lengthSquared() === 0 || s.lengthSquared() === 0)\n return null;\n const a = _.Normalize(_.Cross(r, s));\n return new In(a, _.Dot(a, e));\n }\n /**\n * Clone, or make a deep copy of the plane\n * @returns a new Plane\n */\n clone() {\n return new In(this.normal.clone(), this.w);\n }\n /**\n * Flip the face of the plane\n */\n flip() {\n this.normal.scaleInPlace(-1), this.w = -this.w;\n }\n /**\n * Split `polygon` by this plane if needed, then put the polygon or polygon\n * fragments in the appropriate lists. Coplanar polygons go into either\n `* coplanarFront` or `coplanarBack` depending on their orientation with\n * respect to this plane. Polygons in front or in back of this plane go into\n * either `front` or `back`\n * @param polygon The polygon to be split\n * @param coplanarFront Will contain polygons coplanar with the plane that are oriented to the front of the plane\n * @param coplanarBack Will contain polygons coplanar with the plane that are oriented to the back of the plane\n * @param front Will contain the polygons in front of the plane\n * @param back Will contain the polygons begind the plane\n */\n splitPolygon(e, t, i, r, s) {\n let h = 0;\n const u = [];\n let f, d;\n for (f = 0; f < e.vertices.length; f++) {\n d = _.Dot(this.normal, e.vertices[f].pos) - this.w;\n const p = d < -In.EPSILON ? 2 : d > In.EPSILON ? 1 : 0;\n h |= p, u.push(p);\n }\n switch (h) {\n case 0:\n (_.Dot(this.normal, e.plane.normal) > 0 ? t : i).push(e);\n break;\n case 1:\n r.push(e);\n break;\n case 2:\n s.push(e);\n break;\n case 3: {\n const p = [], g = [];\n for (f = 0; f < e.vertices.length; f++) {\n const v = (f + 1) % e.vertices.length, E = u[f], C = u[v], T = e.vertices[f], R = e.vertices[v];\n if (E !== 2 && p.push(T), E !== 1 && g.push(E !== 2 ? T.clone() : T), (E | C) === 3) {\n d = (this.w - _.Dot(this.normal, T.pos)) / _.Dot(this.normal, R.pos.subtract(T.pos));\n const x = T.interpolate(R, d);\n p.push(x), g.push(x.clone());\n }\n }\n let m;\n p.length >= 3 && (m = new Ma(p, e.shared), m.plane && r.push(m)), g.length >= 3 && (m = new Ma(g, e.shared), m.plane && s.push(m));\n break;\n }\n }\n }\n}\nIn.EPSILON = 1e-5;\nclass Ma {\n /**\n * Initializes the polygon\n * @param vertices The vertices of the polygon\n * @param shared The properties shared across all polygons\n */\n constructor(e, t) {\n this.vertices = e, this.shared = t, this.plane = In.FromPoints(e[0].pos, e[1].pos, e[2].pos);\n }\n /**\n * Clones, or makes a deep copy, or the polygon\n * @returns A new CSGPolygon\n */\n clone() {\n const e = this.vertices.map((t) => t.clone());\n return new Ma(e, this.shared);\n }\n /**\n * Flips the faces of the polygon\n */\n flip() {\n this.vertices.reverse().map((e) => {\n e.flip();\n }), this.plane.flip();\n }\n}\nlet Ir = class Xl {\n /**\n * Initializes the node\n * @param polygons A collection of polygons held in the node\n */\n constructor(e) {\n this._plane = null, this._front = null, this._back = null, this._polygons = new Array(), e && this.build(e);\n }\n /**\n * Clones, or makes a deep copy, of the node\n * @returns The cloned node\n */\n clone() {\n const e = new Xl();\n return e._plane = this._plane && this._plane.clone(), e._front = this._front && this._front.clone(), e._back = this._back && this._back.clone(), e._polygons = this._polygons.map((t) => t.clone()), e;\n }\n /**\n * Convert solid space to empty space and empty space to solid space\n */\n invert() {\n for (let t = 0; t < this._polygons.length; t++)\n this._polygons[t].flip();\n this._plane && this._plane.flip(), this._front && this._front.invert(), this._back && this._back.invert();\n const e = this._front;\n this._front = this._back, this._back = e;\n }\n /**\n * Recursively remove all polygons in `polygons` that are inside this BSP\n * tree.\n * @param polygons Polygons to remove from the BSP\n * @returns Polygons clipped from the BSP\n */\n clipPolygons(e) {\n if (!this._plane)\n return e.slice();\n let t = [], i = [];\n for (let r = 0; r < e.length; r++)\n this._plane.splitPolygon(e[r], t, i, t, i);\n return this._front && (t = this._front.clipPolygons(t)), this._back ? i = this._back.clipPolygons(i) : i = [], t.concat(i);\n }\n /**\n * Remove all polygons in this BSP tree that are inside the other BSP tree\n * `bsp`.\n * @param bsp BSP containing polygons to remove from this BSP\n */\n clipTo(e) {\n this._polygons = e.clipPolygons(this._polygons), this._front && this._front.clipTo(e), this._back && this._back.clipTo(e);\n }\n /**\n * Return a list of all polygons in this BSP tree\n * @returns List of all polygons in this BSP tree\n */\n allPolygons() {\n let e = this._polygons.slice();\n return this._front && (e = e.concat(this._front.allPolygons())), this._back && (e = e.concat(this._back.allPolygons())), e;\n }\n /**\n * Build a BSP tree out of `polygons`. When called on an existing tree, the\n * new polygons are filtered down to the bottom of the tree and become new\n * nodes there. Each set of polygons is partitioned using the first polygon\n * (no heuristic is used to pick a good split)\n * @param polygons Polygons used to construct the BSP tree\n */\n build(e) {\n if (!e.length)\n return;\n this._plane || (this._plane = e[0].plane.clone());\n const t = [], i = [];\n for (let r = 0; r < e.length; r++)\n this._plane.splitPolygon(e[r], this._polygons, this._polygons, t, i);\n t.length && (this._front || (this._front = new Xl()), this._front.build(t)), i.length && (this._back || (this._back = new Xl()), this._back.build(i));\n }\n};\nclass ss {\n constructor() {\n this._polygons = new Array();\n }\n /**\n * Convert a VertexData to CSG\n * @param data defines the VertexData to convert to CSG\n * @returns the new CSG\n */\n static FromVertexData(e) {\n let t, i, r;\n const s = [], a = e.indices, o = e.positions, l = e.normals, c = e.uvs, h = e.colors;\n if (!a || !o)\n throw \"BABYLON.CSG: VertexData must at least contain positions and indices\";\n for (let f = 0; f < a.length; f += 3) {\n r = [];\n for (let d = 0; d < 3; d++) {\n const p = f + d, g = a[p], m = l ? _.FromArray(l, g * 3) : _.Zero(), v = c ? me.FromArray(c, g * 2) : void 0, E = h ? et.FromArray(h, g * 4) : void 0, C = _.FromArray(o, g * 3);\n t = new vo(C, m, v, E), r.push(t);\n }\n i = new Ma(r, { subMeshId: 0, meshId: _l, materialIndex: 0 }), i.plane && s.push(i);\n }\n const u = ss._FromPolygons(s);\n return u.matrix = L.Identity(), u.position = _.Zero(), u.rotation = _.Zero(), u.scaling = _.One(), u.rotationQuaternion = Ce.Identity(), _l++, u;\n }\n /**\n * Convert the Mesh to CSG\n * @param mesh The Mesh to convert to CSG\n * @param absolute If true, the final (local) matrix transformation is set to the identity and not to that of `mesh`. It can help when dealing with right-handed meshes (default: false)\n * @returns A new CSG from the Mesh\n */\n static FromMesh(e, t = !1) {\n let i, r, s, a, o, l, c;\n const h = [];\n let u, f, d, p = null, g, m = !1;\n if (e instanceof B)\n e.computeWorldMatrix(!0), u = e.getWorldMatrix(), f = e.position.clone(), d = e.rotation.clone(), e.rotationQuaternion && (p = e.rotationQuaternion.clone()), g = e.scaling.clone(), e.material && t && (m = e.material.sideOrientation === 0);\n else\n throw \"BABYLON.CSG: Wrong Mesh type, must be BABYLON.Mesh\";\n const v = e.getIndices(), E = e.getVerticesData(I.PositionKind), C = e.getVerticesData(I.NormalKind), T = e.getVerticesData(I.UVKind), R = e.getVerticesData(I.ColorKind), x = e.subMeshes;\n for (let M = 0, N = x.length; M < N; M++)\n for (let F = x[M].indexStart, U = x[M].indexCount + x[M].indexStart; F < U; F += 3) {\n c = [];\n for (let H = 0; H < 3; H++) {\n const q = H === 0 ? F + H : m ? F + 3 - H : F + H, Z = new _(C[v[q] * 3], C[v[q] * 3 + 1], C[v[q] * 3 + 2]);\n T && (s = new me(T[v[q] * 2], T[v[q] * 2 + 1])), R && (o = new et(R[v[q] * 4], R[v[q] * 4 + 1], R[v[q] * 4 + 2], R[v[q] * 4 + 3]));\n const k = new _(E[v[q] * 3], E[v[q] * 3 + 1], E[v[q] * 3 + 2]);\n a = _.TransformCoordinates(k, u), r = _.TransformNormal(Z, u), i = new vo(a, r, s, o), c.push(i);\n }\n l = new Ma(c, { subMeshId: M, meshId: _l, materialIndex: x[M].materialIndex }), l.plane && h.push(l);\n }\n const S = ss._FromPolygons(h);\n return S.matrix = t ? L.Identity() : u, S.position = t ? _.Zero() : f, S.rotation = t ? _.Zero() : d, S.scaling = t ? _.One() : g, S.rotationQuaternion = t && p ? Ce.Identity() : p, _l++, S;\n }\n /**\n * Construct a CSG solid from a list of `CSG.Polygon` instances.\n * @param polygons Polygons used to construct a CSG solid\n * @returns A new CSG solid\n */\n static _FromPolygons(e) {\n const t = new ss();\n return t._polygons = e, t;\n }\n /**\n * Clones, or makes a deep copy, of the CSG\n * @returns A new CSG\n */\n clone() {\n const e = new ss();\n return e._polygons = this._polygons.map((t) => t.clone()), e.copyTransformAttributes(this), e;\n }\n /**\n * Unions this CSG with another CSG\n * @param csg The CSG to union against this CSG\n * @returns The unioned CSG\n */\n union(e) {\n const t = new Ir(this.clone()._polygons), i = new Ir(e.clone()._polygons);\n return t.clipTo(i), i.clipTo(t), i.invert(), i.clipTo(t), i.invert(), t.build(i.allPolygons()), ss._FromPolygons(t.allPolygons()).copyTransformAttributes(this);\n }\n /**\n * Unions this CSG with another CSG in place\n * @param csg The CSG to union against this CSG\n */\n unionInPlace(e) {\n const t = new Ir(this._polygons), i = new Ir(e._polygons);\n t.clipTo(i), i.clipTo(t), i.invert(), i.clipTo(t), i.invert(), t.build(i.allPolygons()), this._polygons = t.allPolygons();\n }\n /**\n * Subtracts this CSG with another CSG\n * @param csg The CSG to subtract against this CSG\n * @returns A new CSG\n */\n subtract(e) {\n const t = new Ir(this.clone()._polygons), i = new Ir(e.clone()._polygons);\n return t.invert(), t.clipTo(i), i.clipTo(t), i.invert(), i.clipTo(t), i.invert(), t.build(i.allPolygons()), t.invert(), ss._FromPolygons(t.allPolygons()).copyTransformAttributes(this);\n }\n /**\n * Subtracts this CSG with another CSG in place\n * @param csg The CSG to subtract against this CSG\n */\n subtractInPlace(e) {\n const t = new Ir(this._polygons), i = new Ir(e._polygons);\n t.invert(), t.clipTo(i), i.clipTo(t), i.invert(), i.clipTo(t), i.invert(), t.build(i.allPolygons()), t.invert(), this._polygons = t.allPolygons();\n }\n /**\n * Intersect this CSG with another CSG\n * @param csg The CSG to intersect against this CSG\n * @returns A new CSG\n */\n intersect(e) {\n const t = new Ir(this.clone()._polygons), i = new Ir(e.clone()._polygons);\n return t.invert(), i.clipTo(t), i.invert(), t.clipTo(i), i.clipTo(t), t.build(i.allPolygons()), t.invert(), ss._FromPolygons(t.allPolygons()).copyTransformAttributes(this);\n }\n /**\n * Intersects this CSG with another CSG in place\n * @param csg The CSG to intersect against this CSG\n */\n intersectInPlace(e) {\n const t = new Ir(this._polygons), i = new Ir(e._polygons);\n t.invert(), i.clipTo(t), i.invert(), t.clipTo(i), i.clipTo(t), t.build(i.allPolygons()), t.invert(), this._polygons = t.allPolygons();\n }\n /**\n * Return a new CSG solid with solid and empty space switched. This solid is\n * not modified.\n * @returns A new CSG solid with solid and empty space switched\n */\n inverse() {\n const e = this.clone();\n return e.inverseInPlace(), e;\n }\n /**\n * Inverses the CSG in place\n */\n inverseInPlace() {\n this._polygons.map((e) => {\n e.flip();\n });\n }\n /**\n * This is used to keep meshes transformations so they can be restored\n * when we build back a Babylon Mesh\n * NB : All CSG operations are performed in world coordinates\n * @param csg The CSG to copy the transform attributes from\n * @returns This CSG\n */\n copyTransformAttributes(e) {\n return this.matrix = e.matrix, this.position = e.position, this.rotation = e.rotation, this.scaling = e.scaling, this.rotationQuaternion = e.rotationQuaternion, this;\n }\n /**\n * Build vertex data from CSG\n * Coordinates here are in world space\n * @param onBeforePolygonProcessing called before each polygon is being processed\n * @param onAfterPolygonProcessing called after each polygon has been processed\n * @returns the final vertex data\n */\n toVertexData(e = null, t = null) {\n const i = this.matrix.clone();\n i.invert();\n const r = this._polygons, s = [], a = [], o = [];\n let l = null, c = null;\n const h = _.Zero(), u = _.Zero(), f = me.Zero(), d = new et(0, 0, 0, 0), p = [0, 0, 0], g = {};\n let m;\n for (let E = 0, C = r.length; E < C; E++) {\n const T = r[E];\n e && e(T);\n for (let R = 2, x = T.vertices.length; R < x; R++) {\n p[0] = 0, p[1] = R - 1, p[2] = R;\n for (let S = 0; S < 3; S++) {\n h.copyFrom(T.vertices[p[S]].pos), u.copyFrom(T.vertices[p[S]].normal), T.vertices[p[S]].uv && (l || (l = []), f.copyFrom(T.vertices[p[S]].uv)), T.vertices[p[S]].vertColor && (c || (c = []), d.copyFrom(T.vertices[p[S]].vertColor));\n const M = _.TransformCoordinates(h, i), N = _.TransformNormal(u, i);\n m = g[M.x + \",\" + M.y + \",\" + M.z];\n let F = !1;\n l && !(l[m * 2] === f.x || l[m * 2 + 1] === f.y) && (F = !0);\n let U = !1;\n c && !(c[m * 4] === d.r || c[m * 4 + 1] === d.g || c[m * 4 + 2] === d.b || c[m * 4 + 3] === d.a) && (U = !0), (!(typeof m < \"u\" && o[m * 3] === N.x && o[m * 3 + 1] === N.y && o[m * 3 + 2] === N.z) || F || U) && (s.push(M.x, M.y, M.z), l && l.push(f.x, f.y), o.push(u.x, u.y, u.z), c && c.push(d.r, d.g, d.b, d.a), m = g[M.x + \",\" + M.y + \",\" + M.z] = s.length / 3 - 1), a.push(m), t && t();\n }\n }\n }\n const v = new re();\n return v.positions = s, v.normals = o, l && (v.uvs = l), c && (v.colors = c), v.indices = a, v;\n }\n /**\n * Build Raw mesh from CSG\n * Coordinates here are in world space\n * @param name The name of the mesh geometry\n * @param scene The Scene\n * @param keepSubMeshes Specifies if the submeshes should be kept\n * @returns A new Mesh\n */\n buildMeshGeometry(e, t, i) {\n const r = new B(e, t), s = this._polygons;\n let a = 0;\n const o = {};\n let l;\n if (i && s.sort((h, u) => h.shared.meshId === u.shared.meshId ? h.shared.subMeshId - u.shared.subMeshId : h.shared.meshId - u.shared.meshId), this.toVertexData((h) => {\n o[h.shared.meshId] || (o[h.shared.meshId] = {}), o[h.shared.meshId][h.shared.subMeshId] || (o[h.shared.meshId][h.shared.subMeshId] = {\n indexStart: 1 / 0,\n indexEnd: -1 / 0,\n materialIndex: h.shared.materialIndex\n }), l = o[h.shared.meshId][h.shared.subMeshId];\n }, () => {\n l.indexStart = Math.min(a, l.indexStart), l.indexEnd = Math.max(a, l.indexEnd), a++;\n }).applyToMesh(r), i) {\n let h = 0, u;\n r.subMeshes = [];\n for (const f in o) {\n u = -1;\n for (const d in o[f])\n l = o[f][d], bi.CreateFromIndices(l.materialIndex + h, l.indexStart, l.indexEnd - l.indexStart + 1, r), u = Math.max(l.materialIndex, u);\n h += ++u;\n }\n }\n return r;\n }\n /**\n * Build Mesh from CSG taking material and transforms into account\n * @param name The name of the Mesh\n * @param material The material of the Mesh\n * @param scene The Scene\n * @param keepSubMeshes Specifies if submeshes should be kept\n * @returns The new Mesh\n */\n toMesh(e, t = null, i, r) {\n const s = this.buildMeshGeometry(e, i, r);\n return s.material = t, s.position.copyFrom(this.position), s.rotation.copyFrom(this.rotation), this.rotationQuaternion && (s.rotationQuaternion = this.rotationQuaternion.clone()), s.scaling.copyFrom(this.scaling), s.computeWorldMatrix(!0), s;\n }\n}\nclass vr {\n /**\n * Creates a Size object from the given width and height (floats).\n * @param width width of the new size\n * @param height height of the new size\n */\n constructor(e, t) {\n this.width = e, this.height = t;\n }\n /**\n * Returns a string with the Size width and height\n * @returns a string with the Size width and height\n */\n toString() {\n return `{W: ${this.width}, H: ${this.height}}`;\n }\n /**\n * \"Size\"\n * @returns the string \"Size\"\n */\n getClassName() {\n return \"Size\";\n }\n /**\n * Returns the Size hash code.\n * @returns a hash code for a unique width and height\n */\n getHashCode() {\n let e = this.width | 0;\n return e = e * 397 ^ (this.height | 0), e;\n }\n /**\n * Updates the current size from the given one.\n * @param src the given size\n */\n copyFrom(e) {\n this.width = e.width, this.height = e.height;\n }\n /**\n * Updates in place the current Size from the given floats.\n * @param width width of the new size\n * @param height height of the new size\n * @returns the updated Size.\n */\n copyFromFloats(e, t) {\n return this.width = e, this.height = t, this;\n }\n /**\n * Updates in place the current Size from the given floats.\n * @param width width to set\n * @param height height to set\n * @returns the updated Size.\n */\n set(e, t) {\n return this.copyFromFloats(e, t);\n }\n /**\n * Multiplies the width and height by numbers\n * @param w factor to multiple the width by\n * @param h factor to multiple the height by\n * @returns a new Size set with the multiplication result of the current Size and the given floats.\n */\n multiplyByFloats(e, t) {\n return new vr(this.width * e, this.height * t);\n }\n /**\n * Clones the size\n * @returns a new Size copied from the given one.\n */\n clone() {\n return new vr(this.width, this.height);\n }\n /**\n * True if the current Size and the given one width and height are strictly equal.\n * @param other the other size to compare against\n * @returns True if the current Size and the given one width and height are strictly equal.\n */\n equals(e) {\n return e ? this.width === e.width && this.height === e.height : !1;\n }\n /**\n * The surface of the Size : width * height (float).\n */\n get surface() {\n return this.width * this.height;\n }\n /**\n * Create a new size of zero\n * @returns a new Size set to (0.0, 0.0)\n */\n static Zero() {\n return new vr(0, 0);\n }\n /**\n * Sums the width and height of two sizes\n * @param otherSize size to add to this size\n * @returns a new Size set as the addition result of the current Size and the given one.\n */\n add(e) {\n return new vr(this.width + e.width, this.height + e.height);\n }\n /**\n * Subtracts the width and height of two\n * @param otherSize size to subtract to this size\n * @returns a new Size set as the subtraction result of the given one from the current Size.\n */\n subtract(e) {\n return new vr(this.width - e.width, this.height - e.height);\n }\n /**\n * Scales the width and height\n * @param scale the scale to multiply the width and height by\n * @returns a new Size set with the multiplication result of the current Size and the given floats.\n */\n scale(e) {\n return new vr(this.width * e, this.height * e);\n }\n /**\n * Creates a new Size set at the linear interpolation \"amount\" between \"start\" and \"end\"\n * @param start starting size to lerp between\n * @param end end size to lerp between\n * @param amount amount to lerp between the start and end values\n * @returns a new Size set at the linear interpolation \"amount\" between \"start\" and \"end\"\n */\n static Lerp(e, t, i) {\n const r = e.width + (t.width - e.width) * i, s = e.height + (t.height - e.height) * i;\n return new vr(r, s);\n }\n}\nclass pf {\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapU() {\n return this._wrapU;\n }\n set wrapU(e) {\n this._wrapU = e;\n }\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapV() {\n return this._wrapV;\n }\n set wrapV(e) {\n this._wrapV = e;\n }\n /**\n * How a texture is mapped.\n * Unused in thin texture mode.\n */\n get coordinatesMode() {\n return 0;\n }\n /**\n * Define if the texture is a cube texture or if false a 2d texture.\n */\n get isCube() {\n return this._texture ? this._texture.isCube : !1;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n set isCube(e) {\n this._texture && (this._texture.isCube = e);\n }\n /**\n * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture.\n */\n get is3D() {\n return this._texture ? this._texture.is3D : !1;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n set is3D(e) {\n this._texture && (this._texture.is3D = e);\n }\n /**\n * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture.\n */\n get is2DArray() {\n return this._texture ? this._texture.is2DArray : !1;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n set is2DArray(e) {\n this._texture && (this._texture.is2DArray = e);\n }\n /**\n * Get the class name of the texture.\n * @returns \"ThinTexture\"\n */\n getClassName() {\n return \"ThinTexture\";\n }\n static _IsRenderTargetWrapper(e) {\n return (e == null ? void 0 : e._shareDepth) !== void 0;\n }\n /**\n * Instantiates a new ThinTexture.\n * Base class of all the textures in babylon.\n * This can be used as an internal texture wrapper in ThinEngine to benefit from the cache\n * @param internalTexture Define the internalTexture to wrap. You can also pass a RenderTargetWrapper, in which case the texture will be the render target's texture\n */\n constructor(e) {\n this._wrapU = 1, this._wrapV = 1, this.wrapR = 1, this.anisotropicFilteringLevel = 4, this.delayLoadState = 0, this._texture = null, this._engine = null, this._cachedSize = vr.Zero(), this._cachedBaseSize = vr.Zero(), this._initialSamplingMode = 2, this._texture = pf._IsRenderTargetWrapper(e) ? e.texture : e, this._texture && (this._engine = this._texture.getEngine());\n }\n /**\n * Get if the texture is ready to be used (downloaded, converted, mip mapped...).\n * @returns true if fully ready\n */\n isReady() {\n return this.delayLoadState === 4 ? (this.delayLoad(), !1) : this._texture ? this._texture.isReady : !1;\n }\n /**\n * Triggers the load sequence in delayed load mode.\n */\n delayLoad() {\n }\n /**\n * Get the underlying lower level texture from Babylon.\n * @returns the internal texture\n */\n getInternalTexture() {\n return this._texture;\n }\n /**\n * Get the size of the texture.\n * @returns the texture size.\n */\n getSize() {\n if (this._texture) {\n if (this._texture.width)\n return this._cachedSize.width = this._texture.width, this._cachedSize.height = this._texture.height, this._cachedSize;\n if (this._texture._size)\n return this._cachedSize.width = this._texture._size, this._cachedSize.height = this._texture._size, this._cachedSize;\n }\n return this._cachedSize;\n }\n /**\n * Get the base size of the texture.\n * It can be different from the size if the texture has been resized for POT for instance\n * @returns the base size\n */\n getBaseSize() {\n return !this.isReady() || !this._texture ? (this._cachedBaseSize.width = 0, this._cachedBaseSize.height = 0, this._cachedBaseSize) : this._texture._size ? (this._cachedBaseSize.width = this._texture._size, this._cachedBaseSize.height = this._texture._size, this._cachedBaseSize) : (this._cachedBaseSize.width = this._texture.baseWidth, this._cachedBaseSize.height = this._texture.baseHeight, this._cachedBaseSize);\n }\n /**\n * Get the current sampling mode associated with the texture.\n */\n get samplingMode() {\n return this._texture ? this._texture.samplingMode : this._initialSamplingMode;\n }\n /**\n * Update the sampling mode of the texture.\n * Default is Trilinear mode.\n *\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 1 | NEAREST_SAMPLINGMODE or NEAREST_NEAREST_MIPLINEAR | Nearest is: mag = nearest, min = nearest, mip = linear |\n * | 2 | BILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPNEAREST | Bilinear is: mag = linear, min = linear, mip = nearest |\n * | 3 | TRILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPLINEAR | Trilinear is: mag = linear, min = linear, mip = linear |\n * | 4 | NEAREST_NEAREST_MIPNEAREST | |\n * | 5 | NEAREST_LINEAR_MIPNEAREST | |\n * | 6 | NEAREST_LINEAR_MIPLINEAR | |\n * | 7 | NEAREST_LINEAR | |\n * | 8 | NEAREST_NEAREST | |\n * | 9 | LINEAR_NEAREST_MIPNEAREST | |\n * | 10 | LINEAR_NEAREST_MIPLINEAR | |\n * | 11 | LINEAR_LINEAR | |\n * | 12 | LINEAR_NEAREST | |\n *\n * > _mag_: magnification filter (close to the viewer)\n * > _min_: minification filter (far from the viewer)\n * > _mip_: filter used between mip map levels\n *@param samplingMode Define the new sampling mode of the texture\n */\n updateSamplingMode(e) {\n this._texture && this._engine && this._engine.updateTextureSamplingMode(e, this._texture);\n }\n /**\n * Release and destroy the underlying lower level texture aka internalTexture.\n */\n releaseInternalTexture() {\n this._texture && (this._texture.dispose(), this._texture = null);\n }\n /**\n * Dispose the texture and release its associated resources.\n */\n dispose() {\n this._texture && (this.releaseInternalTexture(), this._engine = null);\n }\n}\nclass It extends pf {\n /**\n * Define if the texture is having a usable alpha value (can be use for transparency or glossiness for instance).\n */\n set hasAlpha(e) {\n this._hasAlpha !== e && (this._hasAlpha = e, this._scene && this._scene.markAllMaterialsAsDirty(1, (t) => t.hasTexture(this)));\n }\n get hasAlpha() {\n return this._hasAlpha;\n }\n /**\n * Defines if the alpha value should be determined via the rgb values.\n * If true the luminance of the pixel might be used to find the corresponding alpha value.\n */\n set getAlphaFromRGB(e) {\n this._getAlphaFromRGB !== e && (this._getAlphaFromRGB = e, this._scene && this._scene.markAllMaterialsAsDirty(1, (t) => t.hasTexture(this)));\n }\n get getAlphaFromRGB() {\n return this._getAlphaFromRGB;\n }\n /**\n * Define the UV channel to use starting from 0 and defaulting to 0.\n * This is part of the texture as textures usually maps to one uv set.\n */\n set coordinatesIndex(e) {\n this._coordinatesIndex !== e && (this._coordinatesIndex = e, this._scene && this._scene.markAllMaterialsAsDirty(1, (t) => t.hasTexture(this)));\n }\n get coordinatesIndex() {\n return this._coordinatesIndex;\n }\n /**\n * How a texture is mapped.\n *\n * | Value | Type | Description |\n * | ----- | ----------------------------------- | ----------- |\n * | 0 | EXPLICIT_MODE | |\n * | 1 | SPHERICAL_MODE | |\n * | 2 | PLANAR_MODE | |\n * | 3 | CUBIC_MODE | |\n * | 4 | PROJECTION_MODE | |\n * | 5 | SKYBOX_MODE | |\n * | 6 | INVCUBIC_MODE | |\n * | 7 | EQUIRECTANGULAR_MODE | |\n * | 8 | FIXED_EQUIRECTANGULAR_MODE | |\n * | 9 | FIXED_EQUIRECTANGULAR_MIRRORED_MODE | |\n */\n set coordinatesMode(e) {\n this._coordinatesMode !== e && (this._coordinatesMode = e, this._scene && this._scene.markAllMaterialsAsDirty(1, (t) => t.hasTexture(this)));\n }\n get coordinatesMode() {\n return this._coordinatesMode;\n }\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapU() {\n return this._wrapU;\n }\n set wrapU(e) {\n this._wrapU = e;\n }\n /**\n * | Value | Type | Description |\n * | ----- | ------------------ | ----------- |\n * | 0 | CLAMP_ADDRESSMODE | |\n * | 1 | WRAP_ADDRESSMODE | |\n * | 2 | MIRROR_ADDRESSMODE | |\n */\n get wrapV() {\n return this._wrapV;\n }\n set wrapV(e) {\n this._wrapV = e;\n }\n /**\n * Define if the texture is a cube texture or if false a 2d texture.\n */\n get isCube() {\n return this._texture ? this._texture.isCube : this._isCube;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n set isCube(e) {\n this._texture ? this._texture.isCube = e : this._isCube = e;\n }\n /**\n * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture.\n */\n get is3D() {\n return this._texture ? this._texture.is3D : !1;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n set is3D(e) {\n this._texture && (this._texture.is3D = e);\n }\n /**\n * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture.\n */\n get is2DArray() {\n return this._texture ? this._texture.is2DArray : !1;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n set is2DArray(e) {\n this._texture && (this._texture.is2DArray = e);\n }\n /**\n * Define if the texture contains data in gamma space (most of the png/jpg aside bump).\n * HDR texture are usually stored in linear space.\n * This only impacts the PBR and Background materials\n */\n get gammaSpace() {\n if (this._texture)\n this._texture._gammaSpace === null && (this._texture._gammaSpace = this._gammaSpace);\n else\n return this._gammaSpace;\n return this._texture._gammaSpace && !this._texture._useSRGBBuffer;\n }\n set gammaSpace(e) {\n var t;\n if (this._texture) {\n if (this._texture._gammaSpace === e)\n return;\n this._texture._gammaSpace = e;\n } else {\n if (this._gammaSpace === e)\n return;\n this._gammaSpace = e;\n }\n (t = this.getScene()) == null || t.markAllMaterialsAsDirty(1, (i) => i.hasTexture(this));\n }\n /**\n * Gets or sets whether or not the texture contains RGBD data.\n */\n get isRGBD() {\n return this._texture != null && this._texture._isRGBD;\n }\n set isRGBD(e) {\n var t;\n e !== this.isRGBD && (this._texture && (this._texture._isRGBD = e), (t = this.getScene()) == null || t.markAllMaterialsAsDirty(1, (i) => i.hasTexture(this)));\n }\n /**\n * Are mip maps generated for this texture or not.\n */\n get noMipmap() {\n return !1;\n }\n /**\n * With prefiltered texture, defined the offset used during the prefiltering steps.\n */\n get lodGenerationOffset() {\n return this._texture ? this._texture._lodGenerationOffset : 0;\n }\n set lodGenerationOffset(e) {\n this._texture && (this._texture._lodGenerationOffset = e);\n }\n /**\n * With prefiltered texture, defined the scale used during the prefiltering steps.\n */\n get lodGenerationScale() {\n return this._texture ? this._texture._lodGenerationScale : 0;\n }\n set lodGenerationScale(e) {\n this._texture && (this._texture._lodGenerationScale = e);\n }\n /**\n * With prefiltered texture, defined if the specular generation is based on a linear ramp.\n * By default we are using a log2 of the linear roughness helping to keep a better resolution for\n * average roughness values.\n */\n get linearSpecularLOD() {\n return this._texture ? this._texture._linearSpecularLOD : !1;\n }\n set linearSpecularLOD(e) {\n this._texture && (this._texture._linearSpecularLOD = e);\n }\n /**\n * In case a better definition than spherical harmonics is required for the diffuse part of the environment.\n * You can set the irradiance texture to rely on a texture instead of the spherical approach.\n * This texture need to have the same characteristics than its parent (Cube vs 2d, coordinates mode, Gamma/Linear, RGBD).\n */\n get irradianceTexture() {\n return this._texture ? this._texture._irradianceTexture : null;\n }\n set irradianceTexture(e) {\n this._texture && (this._texture._irradianceTexture = e);\n }\n /**\n * Define the unique id of the texture in the scene.\n */\n get uid() {\n return this._uid || (this._uid = rf()), this._uid;\n }\n /**\n * Return a string representation of the texture.\n * @returns the texture as a string\n */\n toString() {\n return this.name;\n }\n /**\n * Get the class name of the texture.\n * @returns \"BaseTexture\"\n */\n getClassName() {\n return \"BaseTexture\";\n }\n /**\n * Callback triggered when the texture has been disposed.\n * Kept for back compatibility, you can use the onDisposeObservable instead.\n */\n set onDispose(e) {\n this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e);\n }\n /**\n * Define if the texture is preventing a material to render or not.\n * If not and the texture is not ready, the engine will use a default black texture instead.\n */\n get isBlocking() {\n return !0;\n }\n /**\n * Was there any loading error?\n */\n get loadingError() {\n return this._loadingError;\n }\n /**\n * If a loading error occurred this object will be populated with information about the error.\n */\n get errorObject() {\n return this._errorObject;\n }\n /**\n * Instantiates a new BaseTexture.\n * Base class of all the textures in babylon.\n * It groups all the common properties the materials, post process, lights... might need\n * in order to make a correct use of the texture.\n * @param sceneOrEngine Define the scene or engine the texture belongs to\n * @param internalTexture Define the internal texture associated with the texture\n */\n constructor(e, t = null) {\n super(null), this.metadata = null, this.reservedDataStore = null, this._hasAlpha = !1, this._getAlphaFromRGB = !1, this.level = 1, this._coordinatesIndex = 0, this.optimizeUVAllocation = !0, this._coordinatesMode = 0, this.wrapR = 1, this.anisotropicFilteringLevel = It.DEFAULT_ANISOTROPIC_FILTERING_LEVEL, this._isCube = !1, this._gammaSpace = !0, this.invertZ = !1, this.lodLevelInAlpha = !1, this.isRenderTarget = !1, this._prefiltered = !1, this._forceSerialize = !1, this.animations = [], this.onDisposeObservable = new he(), this._onDisposeObserver = null, this._scene = null, this._uid = null, this._parentContainer = null, this._loadingError = !1, e ? It._IsScene(e) ? this._scene = e : this._engine = e : this._scene = st.LastCreatedScene, this._scene && (this.uniqueId = this._scene.getUniqueId(), this._scene.addTexture(this), this._engine = this._scene.getEngine()), this._texture = t, this._uid = null;\n }\n /**\n * Get the scene the texture belongs to.\n * @returns the scene or null if undefined\n */\n getScene() {\n return this._scene;\n }\n /** @internal */\n _getEngine() {\n return this._engine;\n }\n /**\n * Checks if the texture has the same transform matrix than another texture\n * @param texture texture to check against\n * @returns true if the transforms are the same, else false\n */\n checkTransformsAreIdentical(e) {\n return e !== null;\n }\n /**\n * Get the texture transform matrix used to offset tile the texture for instance.\n * @returns the transformation matrix\n */\n getTextureMatrix() {\n return L.IdentityReadOnly;\n }\n /**\n * Get the texture reflection matrix used to rotate/transform the reflection.\n * @returns the reflection matrix\n */\n getReflectionTextureMatrix() {\n return L.IdentityReadOnly;\n }\n /**\n * Gets a suitable rotate/transform matrix when the texture is used for refraction.\n * There's a separate function from getReflectionTextureMatrix because refraction requires a special configuration of the matrix in right-handed mode.\n * @returns The refraction matrix\n */\n getRefractionTextureMatrix() {\n return this.getReflectionTextureMatrix();\n }\n /**\n * Get if the texture is ready to be consumed (either it is ready or it is not blocking)\n * @returns true if ready, not blocking or if there was an error loading the texture\n */\n isReadyOrNotBlocking() {\n return !this.isBlocking || this.isReady() || this.loadingError;\n }\n /**\n * Scales the texture if is `canRescale()`\n * @param ratio the resize factor we want to use to rescale\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n scale(e) {\n }\n /**\n * Get if the texture can rescale.\n */\n get canRescale() {\n return !1;\n }\n /**\n * @internal\n */\n _getFromCache(e, t, i, r, s, a) {\n const o = this._getEngine();\n if (!o)\n return null;\n const l = o._getUseSRGBBuffer(!!s, t), c = o.getLoadedTexturesCache();\n for (let h = 0; h < c.length; h++) {\n const u = c[h];\n if ((s === void 0 || l === u._useSRGBBuffer) && (r === void 0 || r === u.invertY) && u.url === e && u.generateMipMaps === !t && (!i || i === u.samplingMode) && (a === void 0 || a === u.isCube))\n return u.incrementReferences(), u;\n }\n return null;\n }\n /** @internal */\n _rebuild(e = !1) {\n }\n /**\n * Clones the texture.\n * @returns the cloned texture\n */\n clone() {\n return null;\n }\n /**\n * Get the texture underlying type (INT, FLOAT...)\n */\n get textureType() {\n return this._texture && this._texture.type !== void 0 ? this._texture.type : 0;\n }\n /**\n * Get the texture underlying format (RGB, RGBA...)\n */\n get textureFormat() {\n return this._texture && this._texture.format !== void 0 ? this._texture.format : 5;\n }\n /**\n * Indicates that textures need to be re-calculated for all materials\n */\n _markAllSubMeshesAsTexturesDirty() {\n const e = this.getScene();\n e && e.markAllMaterialsAsDirty(1);\n }\n /**\n * Reads the pixels stored in the webgl texture and returns them as an ArrayBuffer.\n * This will returns an RGBA array buffer containing either in values (0-255) or\n * float values (0-1) depending of the underlying buffer type.\n * @param faceIndex defines the face of the texture to read (in case of cube texture)\n * @param level defines the LOD level of the texture to read (in case of Mip Maps)\n * @param buffer defines a user defined buffer to fill with data (can be null)\n * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels\n * @param noDataConversion false to convert the data to Uint8Array (if texture type is UNSIGNED_BYTE) or to Float32Array (if texture type is anything but UNSIGNED_BYTE). If true, the type of the generated buffer (if buffer==null) will depend on the type of the texture\n * @param x defines the region x coordinates to start reading from (default to 0)\n * @param y defines the region y coordinates to start reading from (default to 0)\n * @param width defines the region width to read from (default to the texture size at level)\n * @param height defines the region width to read from (default to the texture size at level)\n * @returns The Array buffer promise containing the pixels data.\n */\n readPixels(e = 0, t = 0, i = null, r = !0, s = !1, a = 0, o = 0, l = Number.MAX_VALUE, c = Number.MAX_VALUE) {\n if (!this._texture)\n return null;\n const h = this._getEngine();\n if (!h)\n return null;\n const u = this.getSize();\n let f = u.width, d = u.height;\n t !== 0 && (f = f / Math.pow(2, t), d = d / Math.pow(2, t), f = Math.round(f), d = Math.round(d)), l = Math.min(f, l), c = Math.min(d, c);\n try {\n return this._texture.isCube ? h._readTexturePixels(this._texture, l, c, e, t, i, r, s, a, o) : h._readTexturePixels(this._texture, l, c, -1, t, i, r, s, a, o);\n } catch {\n return null;\n }\n }\n /**\n * @internal\n */\n _readPixelsSync(e = 0, t = 0, i = null, r = !0, s = !1) {\n if (!this._texture)\n return null;\n const a = this.getSize();\n let o = a.width, l = a.height;\n const c = this._getEngine();\n if (!c)\n return null;\n t != 0 && (o = o / Math.pow(2, t), l = l / Math.pow(2, t), o = Math.round(o), l = Math.round(l));\n try {\n return this._texture.isCube ? c._readTexturePixelsSync(this._texture, o, l, e, t, i, r, s) : c._readTexturePixelsSync(this._texture, o, l, -1, t, i, r, s);\n } catch {\n return null;\n }\n }\n /** @internal */\n get _lodTextureHigh() {\n return this._texture ? this._texture._lodTextureHigh : null;\n }\n /** @internal */\n get _lodTextureMid() {\n return this._texture ? this._texture._lodTextureMid : null;\n }\n /** @internal */\n get _lodTextureLow() {\n return this._texture ? this._texture._lodTextureLow : null;\n }\n /**\n * Dispose the texture and release its associated resources.\n */\n dispose() {\n if (this._scene) {\n this._scene.stopAnimation && this._scene.stopAnimation(this), this._scene.removePendingData(this);\n const e = this._scene.textures.indexOf(this);\n if (e >= 0 && this._scene.textures.splice(e, 1), this._scene.onTextureRemovedObservable.notifyObservers(this), this._scene = null, this._parentContainer) {\n const t = this._parentContainer.textures.indexOf(this);\n t > -1 && this._parentContainer.textures.splice(t, 1), this._parentContainer = null;\n }\n }\n this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear(), this.metadata = null, super.dispose();\n }\n /**\n * Serialize the texture into a JSON representation that can be parsed later on.\n * @param allowEmptyName True to force serialization even if name is empty. Default: false\n * @returns the JSON representation of the texture\n */\n serialize(e = !1) {\n if (!this.name && !e)\n return null;\n const t = Le.Serialize(this);\n return Le.AppendSerializedAnimations(this, t), t;\n }\n /**\n * Helper function to be called back once a list of texture contains only ready textures.\n * @param textures Define the list of textures to wait for\n * @param callback Define the callback triggered once the entire list will be ready\n */\n static WhenAllReady(e, t) {\n let i = e.length;\n if (i === 0) {\n t();\n return;\n }\n for (let r = 0; r < e.length; r++) {\n const s = e[r];\n if (s.isReady())\n --i === 0 && t();\n else {\n const a = s.onLoadObservable;\n a ? a.addOnce(() => {\n --i === 0 && t();\n }) : --i === 0 && t();\n }\n }\n }\n static _IsScene(e) {\n return e.getClassName() === \"Scene\";\n }\n}\nIt.DEFAULT_ANISOTROPIC_FILTERING_LEVEL = 4;\nP([\n w()\n], It.prototype, \"uniqueId\", void 0);\nP([\n w()\n], It.prototype, \"name\", void 0);\nP([\n w()\n], It.prototype, \"metadata\", void 0);\nP([\n w(\"hasAlpha\")\n], It.prototype, \"_hasAlpha\", void 0);\nP([\n w(\"getAlphaFromRGB\")\n], It.prototype, \"_getAlphaFromRGB\", void 0);\nP([\n w()\n], It.prototype, \"level\", void 0);\nP([\n w(\"coordinatesIndex\")\n], It.prototype, \"_coordinatesIndex\", void 0);\nP([\n w()\n], It.prototype, \"optimizeUVAllocation\", void 0);\nP([\n w(\"coordinatesMode\")\n], It.prototype, \"_coordinatesMode\", void 0);\nP([\n w()\n], It.prototype, \"wrapU\", null);\nP([\n w()\n], It.prototype, \"wrapV\", null);\nP([\n w()\n], It.prototype, \"wrapR\", void 0);\nP([\n w()\n], It.prototype, \"anisotropicFilteringLevel\", void 0);\nP([\n w()\n], It.prototype, \"isCube\", null);\nP([\n w()\n], It.prototype, \"is3D\", null);\nP([\n w()\n], It.prototype, \"is2DArray\", null);\nP([\n w()\n], It.prototype, \"gammaSpace\", null);\nP([\n w()\n], It.prototype, \"invertZ\", void 0);\nP([\n w()\n], It.prototype, \"lodLevelInAlpha\", void 0);\nP([\n w()\n], It.prototype, \"lodGenerationOffset\", null);\nP([\n w()\n], It.prototype, \"lodGenerationScale\", null);\nP([\n w()\n], It.prototype, \"linearSpecularLOD\", null);\nP([\n Tt()\n], It.prototype, \"irradianceTexture\", null);\nP([\n w()\n], It.prototype, \"isRenderTarget\", void 0);\nfunction l0(n, e, t = !1) {\n const i = e.width, r = e.height;\n if (n instanceof Float32Array) {\n let c = n.byteLength / n.BYTES_PER_ELEMENT;\n const h = new Uint8Array(c);\n for (; --c >= 0; ) {\n let u = n[c];\n u < 0 ? u = 0 : u > 1 && (u = 1), h[c] = u * 255;\n }\n n = h;\n }\n const s = document.createElement(\"canvas\");\n s.width = i, s.height = r;\n const a = s.getContext(\"2d\");\n if (!a)\n return null;\n const o = a.createImageData(i, r);\n if (o.data.set(n), a.putImageData(o, 0, 0), t) {\n const c = document.createElement(\"canvas\");\n c.width = i, c.height = r;\n const h = c.getContext(\"2d\");\n return h ? (h.translate(0, r), h.scale(1, -1), h.drawImage(s, 0, 0), c.toDataURL(\"image/png\")) : null;\n }\n return s.toDataURL(\"image/png\");\n}\nfunction hI(n, e = 0, t = 0) {\n const i = n.getInternalTexture();\n if (!i)\n return null;\n const r = n._readPixelsSync(e, t);\n return r ? l0(r, n.getSize(), i.invertY) : null;\n}\nasync function uI(n, e = 0, t = 0) {\n const i = n.getInternalTexture();\n if (!i)\n return null;\n const r = await n.readPixels(e, t);\n return r ? l0(r, n.getSize(), i.invertY) : null;\n}\nclass le extends It {\n /**\n * @internal\n */\n static _CreateVideoTexture(e, t, i, r = !1, s = !1, a = le.TRILINEAR_SAMPLINGMODE, o = {}, l, c = 5) {\n throw We(\"VideoTexture\");\n }\n /**\n * Are mip maps generated for this texture or not.\n */\n get noMipmap() {\n return this._noMipmap;\n }\n /** Returns the texture mime type if it was defined by a loader (undefined else) */\n get mimeType() {\n return this._mimeType;\n }\n /**\n * Is the texture preventing material to render while loading.\n * If false, a default texture will be used instead of the loading one during the preparation step.\n */\n set isBlocking(e) {\n this._isBlocking = e;\n }\n get isBlocking() {\n return this._isBlocking;\n }\n /**\n * Gets a boolean indicating if the texture needs to be inverted on the y axis during loading\n */\n get invertY() {\n return this._invertY;\n }\n /**\n * Instantiates a new texture.\n * This represents a texture in babylon. It can be easily loaded from a network, base64 or html input.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#texture\n * @param url defines the url of the picture to load as a texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture\n * @param invertY defines if the texture needs to be inverted on the y axis during loading\n * @param samplingMode defines the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)\n * @param onLoad defines a callback triggered when the texture has been loaded\n * @param onError defines a callback triggered when an error occurred during the loading session\n * @param buffer defines the buffer to load the texture from in case the texture is loaded from a buffer representation\n * @param deleteBuffer defines if the buffer we are loading the texture from should be deleted after load\n * @param format defines the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)\n * @param mimeType defines an optional mime type information\n * @param loaderOptions options to be passed to the loader\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param forcedExtension defines the extension to use to pick the right loader\n */\n constructor(e, t, i, r, s = le.TRILINEAR_SAMPLINGMODE, a = null, o = null, l = null, c = !1, h, u, f, d, p) {\n super(t), this.url = null, this.uOffset = 0, this.vOffset = 0, this.uScale = 1, this.vScale = 1, this.uAng = 0, this.vAng = 0, this.wAng = 0, this.uRotationCenter = 0.5, this.vRotationCenter = 0.5, this.wRotationCenter = 0.5, this.homogeneousRotationInUVTransform = !1, this.inspectableCustomProperties = null, this._noMipmap = !1, this._invertY = !1, this._rowGenerationMatrix = null, this._cachedTextureMatrix = null, this._projectionModeMatrix = null, this._t0 = null, this._t1 = null, this._t2 = null, this._cachedUOffset = -1, this._cachedVOffset = -1, this._cachedUScale = 0, this._cachedVScale = 0, this._cachedUAng = -1, this._cachedVAng = -1, this._cachedWAng = -1, this._cachedReflectionProjectionMatrixId = -1, this._cachedURotationCenter = -1, this._cachedVRotationCenter = -1, this._cachedWRotationCenter = -1, this._cachedHomogeneousRotationInUVTransform = !1, this._cachedIdentity3x2 = !0, this._cachedReflectionTextureMatrix = null, this._cachedReflectionUOffset = -1, this._cachedReflectionVOffset = -1, this._cachedReflectionUScale = 0, this._cachedReflectionVScale = 0, this._cachedReflectionCoordinatesMode = -1, this._buffer = null, this._deleteBuffer = !1, this._format = null, this._delayedOnLoad = null, this._delayedOnError = null, this.onLoadObservable = new he(), this._isBlocking = !0, this.name = e || \"\", this.url = e;\n let g, m = !1, v = null, E = !0;\n typeof i == \"object\" && i !== null ? (g = i.noMipmap ?? !1, r = i.invertY ?? !nt.UseOpenGLOrientationForUV, s = i.samplingMode ?? le.TRILINEAR_SAMPLINGMODE, a = i.onLoad ?? null, o = i.onError ?? null, l = i.buffer ?? null, c = i.deleteBuffer ?? !1, h = i.format, u = i.mimeType, f = i.loaderOptions, d = i.creationFlags, m = i.useSRGBBuffer ?? !1, v = i.internalTexture ?? null, E = i.gammaSpace ?? E) : g = !!i, this._gammaSpace = E, this._noMipmap = g, this._invertY = r === void 0 ? !nt.UseOpenGLOrientationForUV : r, this._initialSamplingMode = s, this._buffer = l, this._deleteBuffer = c, this._mimeType = u, this._loaderOptions = f, this._creationFlags = d, this._useSRGBBuffer = m, this._forcedExtension = p, h && (this._format = h);\n const C = this.getScene(), T = this._getEngine();\n if (!T)\n return;\n T.onBeforeTextureInitObservable.notifyObservers(this);\n const R = () => {\n this._texture && (this._texture._invertVScale && (this.vScale *= -1, this.vOffset += 1), this._texture._cachedWrapU !== null && (this.wrapU = this._texture._cachedWrapU, this._texture._cachedWrapU = null), this._texture._cachedWrapV !== null && (this.wrapV = this._texture._cachedWrapV, this._texture._cachedWrapV = null), this._texture._cachedWrapR !== null && (this.wrapR = this._texture._cachedWrapR, this._texture._cachedWrapR = null)), this.onLoadObservable.hasObservers() && this.onLoadObservable.notifyObservers(this), a && a(), !this.isBlocking && C && C.resetCachedMaterial();\n }, x = (S, M) => {\n this._loadingError = !0, this._errorObject = { message: S, exception: M }, o && o(S, M), le.OnTextureLoadErrorObservable.notifyObservers(this);\n };\n if (!this.url && !v) {\n this._delayedOnLoad = R, this._delayedOnError = x;\n return;\n }\n if (this._texture = v ?? this._getFromCache(this.url, g, s, this._invertY, m, this.isCube), this._texture)\n if (this._texture.isReady)\n Jl.SetImmediate(() => R());\n else {\n const S = this._texture.onLoadedObservable.add(R);\n this._texture.onErrorObservable.add((M) => {\n var N;\n x(M.message, M.exception), (N = this._texture) == null || N.onLoadedObservable.remove(S);\n });\n }\n else if (!C || !C.useDelayedTextureLoading) {\n try {\n this._texture = T.createTexture(this.url, g, this._invertY, C, s, R, x, this._buffer, void 0, this._format, this._forcedExtension, u, f, d, m);\n } catch (S) {\n throw x(\"error loading\", S), S;\n }\n c && (this._buffer = null);\n } else\n this.delayLoadState = 4, this._delayedOnLoad = R, this._delayedOnError = x;\n }\n /**\n * Update the url (and optional buffer) of this texture if url was null during construction.\n * @param url the url of the texture\n * @param buffer the buffer of the texture (defaults to null)\n * @param onLoad callback called when the texture is loaded (defaults to null)\n * @param forcedExtension defines the extension to use to pick the right loader\n */\n updateURL(e, t = null, i, r) {\n this.url && (this.releaseInternalTexture(), this.getScene().markAllMaterialsAsDirty(1, (s) => s.hasTexture(this))), (!this.name || this.name.startsWith(\"data:\")) && (this.name = e), this.url = e, this._buffer = t, this._forcedExtension = r, this.delayLoadState = 4, i && (this._delayedOnLoad = i), this.delayLoad();\n }\n /**\n * Finish the loading sequence of a texture flagged as delayed load.\n * @internal\n */\n delayLoad() {\n if (this.delayLoadState !== 4)\n return;\n const e = this.getScene();\n e && (this.delayLoadState = 1, this._texture = this._getFromCache(this.url, this._noMipmap, this.samplingMode, this._invertY, this._useSRGBBuffer, this.isCube), this._texture ? this._delayedOnLoad && (this._texture.isReady ? Jl.SetImmediate(this._delayedOnLoad) : this._texture.onLoadedObservable.add(this._delayedOnLoad)) : (this._texture = e.getEngine().createTexture(this.url, this._noMipmap, this._invertY, e, this.samplingMode, this._delayedOnLoad, this._delayedOnError, this._buffer, null, this._format, this._forcedExtension, this._mimeType, this._loaderOptions, this._creationFlags, this._useSRGBBuffer), this._deleteBuffer && (this._buffer = null)), this._delayedOnLoad = null, this._delayedOnError = null);\n }\n _prepareRowForTextureGeneration(e, t, i, r) {\n e *= this._cachedUScale, t *= this._cachedVScale, e -= this.uRotationCenter * this._cachedUScale, t -= this.vRotationCenter * this._cachedVScale, i -= this.wRotationCenter, _.TransformCoordinatesFromFloatsToRef(e, t, i, this._rowGenerationMatrix, r), r.x += this.uRotationCenter * this._cachedUScale + this._cachedUOffset, r.y += this.vRotationCenter * this._cachedVScale + this._cachedVOffset, r.z += this.wRotationCenter;\n }\n /**\n * Checks if the texture has the same transform matrix than another texture\n * @param texture texture to check against\n * @returns true if the transforms are the same, else false\n */\n checkTransformsAreIdentical(e) {\n return e !== null && this.uOffset === e.uOffset && this.vOffset === e.vOffset && this.uScale === e.uScale && this.vScale === e.vScale && this.uAng === e.uAng && this.vAng === e.vAng && this.wAng === e.wAng;\n }\n /**\n * Get the current texture matrix which includes the requested offsetting, tiling and rotation components.\n * @param uBase The horizontal base offset multiplier (1 by default)\n * @returns the transform matrix of the texture.\n */\n getTextureMatrix(e = 1) {\n if (this.uOffset === this._cachedUOffset && this.vOffset === this._cachedVOffset && this.uScale * e === this._cachedUScale && this.vScale === this._cachedVScale && this.uAng === this._cachedUAng && this.vAng === this._cachedVAng && this.wAng === this._cachedWAng && this.uRotationCenter === this._cachedURotationCenter && this.vRotationCenter === this._cachedVRotationCenter && this.wRotationCenter === this._cachedWRotationCenter && this.homogeneousRotationInUVTransform === this._cachedHomogeneousRotationInUVTransform)\n return this._cachedTextureMatrix;\n this._cachedUOffset = this.uOffset, this._cachedVOffset = this.vOffset, this._cachedUScale = this.uScale * e, this._cachedVScale = this.vScale, this._cachedUAng = this.uAng, this._cachedVAng = this.vAng, this._cachedWAng = this.wAng, this._cachedURotationCenter = this.uRotationCenter, this._cachedVRotationCenter = this.vRotationCenter, this._cachedWRotationCenter = this.wRotationCenter, this._cachedHomogeneousRotationInUVTransform = this.homogeneousRotationInUVTransform, (!this._cachedTextureMatrix || !this._rowGenerationMatrix) && (this._cachedTextureMatrix = L.Zero(), this._rowGenerationMatrix = new L(), this._t0 = _.Zero(), this._t1 = _.Zero(), this._t2 = _.Zero()), L.RotationYawPitchRollToRef(this.vAng, this.uAng, this.wAng, this._rowGenerationMatrix), this.homogeneousRotationInUVTransform ? (L.TranslationToRef(-this._cachedURotationCenter, -this._cachedVRotationCenter, -this._cachedWRotationCenter, z.Matrix[0]), L.TranslationToRef(this._cachedURotationCenter, this._cachedVRotationCenter, this._cachedWRotationCenter, z.Matrix[1]), L.ScalingToRef(this._cachedUScale, this._cachedVScale, 0, z.Matrix[2]), L.TranslationToRef(this._cachedUOffset, this._cachedVOffset, 0, z.Matrix[3]), z.Matrix[0].multiplyToRef(this._rowGenerationMatrix, this._cachedTextureMatrix), this._cachedTextureMatrix.multiplyToRef(z.Matrix[1], this._cachedTextureMatrix), this._cachedTextureMatrix.multiplyToRef(z.Matrix[2], this._cachedTextureMatrix), this._cachedTextureMatrix.multiplyToRef(z.Matrix[3], this._cachedTextureMatrix), this._cachedTextureMatrix.setRowFromFloats(2, this._cachedTextureMatrix.m[12], this._cachedTextureMatrix.m[13], this._cachedTextureMatrix.m[14], 1)) : (this._prepareRowForTextureGeneration(0, 0, 0, this._t0), this._prepareRowForTextureGeneration(1, 0, 0, this._t1), this._prepareRowForTextureGeneration(0, 1, 0, this._t2), this._t1.subtractInPlace(this._t0), this._t2.subtractInPlace(this._t0), L.FromValuesToRef(this._t1.x, this._t1.y, this._t1.z, 0, this._t2.x, this._t2.y, this._t2.z, 0, this._t0.x, this._t0.y, this._t0.z, 0, 0, 0, 0, 1, this._cachedTextureMatrix));\n const t = this.getScene();\n if (!t)\n return this._cachedTextureMatrix;\n const i = this._cachedIdentity3x2;\n return this._cachedIdentity3x2 = this._cachedTextureMatrix.isIdentityAs3x2(), this.optimizeUVAllocation && i !== this._cachedIdentity3x2 && t.markAllMaterialsAsDirty(1, (r) => r.hasTexture(this)), this._cachedTextureMatrix;\n }\n /**\n * Get the current matrix used to apply reflection. This is useful to rotate an environment texture for instance.\n * @returns The reflection texture transform\n */\n getReflectionTextureMatrix() {\n const e = this.getScene();\n if (!e)\n return this._cachedReflectionTextureMatrix;\n if (this.uOffset === this._cachedReflectionUOffset && this.vOffset === this._cachedReflectionVOffset && this.uScale === this._cachedReflectionUScale && this.vScale === this._cachedReflectionVScale && this.coordinatesMode === this._cachedReflectionCoordinatesMode)\n if (this.coordinatesMode === le.PROJECTION_MODE) {\n if (this._cachedReflectionProjectionMatrixId === e.getProjectionMatrix().updateFlag)\n return this._cachedReflectionTextureMatrix;\n } else\n return this._cachedReflectionTextureMatrix;\n this._cachedReflectionTextureMatrix || (this._cachedReflectionTextureMatrix = L.Zero()), this._projectionModeMatrix || (this._projectionModeMatrix = L.Zero());\n const t = this._cachedReflectionCoordinatesMode !== this.coordinatesMode;\n switch (this._cachedReflectionUOffset = this.uOffset, this._cachedReflectionVOffset = this.vOffset, this._cachedReflectionUScale = this.uScale, this._cachedReflectionVScale = this.vScale, this._cachedReflectionCoordinatesMode = this.coordinatesMode, this.coordinatesMode) {\n case le.PLANAR_MODE: {\n L.IdentityToRef(this._cachedReflectionTextureMatrix), this._cachedReflectionTextureMatrix[0] = this.uScale, this._cachedReflectionTextureMatrix[5] = this.vScale, this._cachedReflectionTextureMatrix[12] = this.uOffset, this._cachedReflectionTextureMatrix[13] = this.vOffset;\n break;\n }\n case le.PROJECTION_MODE: {\n L.FromValuesToRef(0.5, 0, 0, 0, 0, -0.5, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 1, 1, this._projectionModeMatrix);\n const i = e.getProjectionMatrix();\n this._cachedReflectionProjectionMatrixId = i.updateFlag, i.multiplyToRef(this._projectionModeMatrix, this._cachedReflectionTextureMatrix);\n break;\n }\n default:\n L.IdentityToRef(this._cachedReflectionTextureMatrix);\n break;\n }\n return t && e.markAllMaterialsAsDirty(1, (i) => i.hasTexture(this)), this._cachedReflectionTextureMatrix;\n }\n /**\n * Clones the texture.\n * @returns the cloned texture\n */\n clone() {\n const e = {\n noMipmap: this._noMipmap,\n invertY: this._invertY,\n samplingMode: this.samplingMode,\n onLoad: void 0,\n onError: void 0,\n buffer: this._texture ? this._texture._buffer : void 0,\n deleteBuffer: this._deleteBuffer,\n format: this.textureFormat,\n mimeType: this.mimeType,\n loaderOptions: this._loaderOptions,\n creationFlags: this._creationFlags,\n useSRGBBuffer: this._useSRGBBuffer\n };\n return Le.Clone(() => new le(this._texture ? this._texture.url : null, this.getScene(), e), this);\n }\n /**\n * Serialize the texture to a JSON representation we can easily use in the respective Parse function.\n * @returns The JSON representation of the texture\n */\n serialize() {\n var i;\n const e = this.name;\n le.SerializeBuffers || this.name.startsWith(\"data:\") && (this.name = \"\"), this.name.startsWith(\"data:\") && this.url === this.name && (this.url = \"\");\n const t = super.serialize(le._SerializeInternalTextureUniqueId);\n return t ? ((le.SerializeBuffers || le.ForceSerializeBuffers) && (typeof this._buffer == \"string\" && this._buffer.substr(0, 5) === \"data:\" ? (t.base64String = this._buffer, t.name = t.name.replace(\"data:\", \"\")) : this.url && this.url.startsWith(\"data:\") && this._buffer instanceof Uint8Array ? t.base64String = \"data:image/png;base64,\" + D_(this._buffer) : (le.ForceSerializeBuffers || this.url && this.url.startsWith(\"blob:\") || this._forceSerialize) && (t.base64String = !this._engine || this._engine._features.supportSyncTextureRead ? hI(this) : uI(this))), t.invertY = this._invertY, t.samplingMode = this.samplingMode, t._creationFlags = this._creationFlags, t._useSRGBBuffer = this._useSRGBBuffer, le._SerializeInternalTextureUniqueId && (t.internalTextureUniqueId = ((i = this._texture) == null ? void 0 : i.uniqueId) ?? void 0), t.noMipmap = this._noMipmap, this.name = e, t) : null;\n }\n /**\n * Get the current class name of the texture useful for serialization or dynamic coding.\n * @returns \"Texture\"\n */\n getClassName() {\n return \"Texture\";\n }\n /**\n * Dispose the texture and release its associated resources.\n */\n dispose() {\n super.dispose(), this.onLoadObservable.clear(), this._delayedOnLoad = null, this._delayedOnError = null, this._buffer = null;\n }\n /**\n * Parse the JSON representation of a texture in order to recreate the texture in the given scene.\n * @param parsedTexture Define the JSON representation of the texture\n * @param scene Define the scene the parsed texture should be instantiated in\n * @param rootUrl Define the root url of the parsing sequence in the case of relative dependencies\n * @returns The parsed texture if successful\n */\n static Parse(e, t, i) {\n if (e.customType) {\n const c = lo.Instantiate(e.customType).Parse(e, t, i);\n return e.samplingMode && c.updateSamplingMode && c._samplingMode && c._samplingMode !== e.samplingMode && c.updateSamplingMode(e.samplingMode), c;\n }\n if (e.isCube && !e.isRenderTarget)\n return le._CubeTextureParser(e, t, i);\n const r = e.internalTextureUniqueId !== void 0;\n if (!e.name && !e.isRenderTarget && !r)\n return null;\n let s;\n if (r) {\n const l = t.getEngine().getLoadedTexturesCache();\n for (const c of l)\n if (c.uniqueId === e.internalTextureUniqueId) {\n s = c;\n break;\n }\n }\n const a = (l) => {\n var c;\n if (l && l._texture && (l._texture._cachedWrapU = null, l._texture._cachedWrapV = null, l._texture._cachedWrapR = null), e.samplingMode) {\n const h = e.samplingMode;\n l && l.samplingMode !== h && l.updateSamplingMode(h);\n }\n if (l && e.animations)\n for (let h = 0; h < e.animations.length; h++) {\n const u = e.animations[h], f = mr(\"BABYLON.Animation\");\n f && l.animations.push(f.Parse(u));\n }\n r && !s && ((c = l == null ? void 0 : l._texture) == null || c._setUniqueId(e.internalTextureUniqueId));\n };\n return Le.Parse(() => {\n let l = !0;\n if (e.noMipmap && (l = !1), e.mirrorPlane) {\n const c = le._CreateMirror(e.name, e.renderTargetSize, t, l);\n return c._waitingRenderList = e.renderList, c.mirrorPlane = Yr.FromArray(e.mirrorPlane), a(c), c;\n } else if (e.isRenderTarget) {\n let c = null;\n if (e.isCube) {\n if (t.reflectionProbes)\n for (let h = 0; h < t.reflectionProbes.length; h++) {\n const u = t.reflectionProbes[h];\n if (u.name === e.name)\n return u.cubeTexture;\n }\n } else\n c = le._CreateRenderTargetTexture(e.name, e.renderTargetSize, t, l, e._creationFlags ?? 0), c._waitingRenderList = e.renderList;\n return a(c), c;\n } else if (e.isVideo) {\n const c = le._CreateVideoTexture(i + (e.url || e.name), i + (e.src || e.url), t, l, e.invertY, e.samplingMode, e.settings || {});\n return a(c), c;\n } else {\n let c;\n if (e.base64String && !s)\n c = le.CreateFromBase64String(e.base64String, e.base64String, t, !l, e.invertY, e.samplingMode, () => {\n a(c);\n }, e._creationFlags ?? 0, e._useSRGBBuffer ?? !1), c.name = e.name;\n else {\n let h;\n e.name && (e.name.indexOf(\"://\") > 0 || e.name.startsWith(\"data:\")) ? h = e.name : h = i + e.name, e.url && (e.url.startsWith(\"data:\") || le.UseSerializedUrlIfAny) && (h = e.url);\n const u = {\n noMipmap: !l,\n invertY: e.invertY,\n samplingMode: e.samplingMode,\n onLoad: () => {\n a(c);\n },\n internalTexture: s\n };\n c = new le(h, t, u);\n }\n return c;\n }\n }, e, t);\n }\n /**\n * Creates a texture from its base 64 representation.\n * @param data Define the base64 payload without the data: prefix\n * @param name Define the name of the texture in the scene useful fo caching purpose for instance\n * @param scene Define the scene the texture should belong to\n * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture\n * @param invertY define if the texture needs to be inverted on the y axis during loading\n * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)\n * @param onLoad define a callback triggered when the texture has been loaded\n * @param onError define a callback triggered when an error occurred during the loading session\n * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param forcedExtension defines the extension to use to pick the right loader\n * @returns the created texture\n */\n static CreateFromBase64String(e, t, i, r, s, a = le.TRILINEAR_SAMPLINGMODE, o = null, l = null, c = 5, h, u) {\n return new le(\"data:\" + t, i, r, s, a, o, l, e, !1, c, void 0, void 0, h, u);\n }\n /**\n * Creates a texture from its data: representation. (data: will be added in case only the payload has been passed in)\n * @param name Define the name of the texture in the scene useful fo caching purpose for instance\n * @param buffer define the buffer to load the texture from in case the texture is loaded from a buffer representation\n * @param scene Define the scene the texture should belong to\n * @param deleteBuffer define if the buffer we are loading the texture from should be deleted after load\n * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture\n * @param invertY define if the texture needs to be inverted on the y axis during loading\n * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)\n * @param onLoad define a callback triggered when the texture has been loaded\n * @param onError define a callback triggered when an error occurred during the loading session\n * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param forcedExtension defines the extension to use to pick the right loader\n * @returns the created texture\n */\n static LoadFromDataString(e, t, i, r = !1, s, a = !0, o = le.TRILINEAR_SAMPLINGMODE, l = null, c = null, h = 5, u, f) {\n return e.substr(0, 5) !== \"data:\" && (e = \"data:\" + e), new le(e, i, s, a, o, l, c, t, r, h, void 0, void 0, u, f);\n }\n}\nle.SerializeBuffers = !0;\nle.ForceSerializeBuffers = !1;\nle.OnTextureLoadErrorObservable = new he();\nle._SerializeInternalTextureUniqueId = !1;\nle._CubeTextureParser = (n, e, t) => {\n throw We(\"CubeTexture\");\n};\nle._CreateMirror = (n, e, t, i) => {\n throw We(\"MirrorTexture\");\n};\nle._CreateRenderTargetTexture = (n, e, t, i, r) => {\n throw We(\"RenderTargetTexture\");\n};\nle.NEAREST_SAMPLINGMODE = 1;\nle.NEAREST_NEAREST_MIPLINEAR = 8;\nle.BILINEAR_SAMPLINGMODE = 2;\nle.LINEAR_LINEAR_MIPNEAREST = 11;\nle.TRILINEAR_SAMPLINGMODE = 3;\nle.LINEAR_LINEAR_MIPLINEAR = 3;\nle.NEAREST_NEAREST_MIPNEAREST = 4;\nle.NEAREST_LINEAR_MIPNEAREST = 5;\nle.NEAREST_LINEAR_MIPLINEAR = 6;\nle.NEAREST_LINEAR = 7;\nle.NEAREST_NEAREST = 1;\nle.LINEAR_NEAREST_MIPNEAREST = 9;\nle.LINEAR_NEAREST_MIPLINEAR = 10;\nle.LINEAR_LINEAR = 2;\nle.LINEAR_NEAREST = 12;\nle.EXPLICIT_MODE = 0;\nle.SPHERICAL_MODE = 1;\nle.PLANAR_MODE = 2;\nle.CUBIC_MODE = 3;\nle.PROJECTION_MODE = 4;\nle.SKYBOX_MODE = 5;\nle.INVCUBIC_MODE = 6;\nle.EQUIRECTANGULAR_MODE = 7;\nle.FIXED_EQUIRECTANGULAR_MODE = 8;\nle.FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9;\nle.CLAMP_ADDRESSMODE = 0;\nle.WRAP_ADDRESSMODE = 1;\nle.MIRROR_ADDRESSMODE = 2;\nle.UseSerializedUrlIfAny = !1;\nP([\n w()\n], le.prototype, \"url\", void 0);\nP([\n w()\n], le.prototype, \"uOffset\", void 0);\nP([\n w()\n], le.prototype, \"vOffset\", void 0);\nP([\n w()\n], le.prototype, \"uScale\", void 0);\nP([\n w()\n], le.prototype, \"vScale\", void 0);\nP([\n w()\n], le.prototype, \"uAng\", void 0);\nP([\n w()\n], le.prototype, \"vAng\", void 0);\nP([\n w()\n], le.prototype, \"wAng\", void 0);\nP([\n w()\n], le.prototype, \"uRotationCenter\", void 0);\nP([\n w()\n], le.prototype, \"vRotationCenter\", void 0);\nP([\n w()\n], le.prototype, \"wRotationCenter\", void 0);\nP([\n w()\n], le.prototype, \"homogeneousRotationInUVTransform\", void 0);\nP([\n w()\n], le.prototype, \"isBlocking\", null);\nRe(\"BABYLON.Texture\", le);\nLe._TextureParser = le.Parse;\nclass gf {\n constructor() {\n this._defines = {}, this._currentRank = 32, this._maxRank = -1, this._mesh = null;\n }\n /**\n * Removes the fallback from the bound mesh.\n */\n unBindMesh() {\n this._mesh = null;\n }\n /**\n * Adds a fallback on the specified property.\n * @param rank The rank of the fallback (Lower ranks will be fallbacked to first)\n * @param define The name of the define in the shader\n */\n addFallback(e, t) {\n this._defines[e] || (e < this._currentRank && (this._currentRank = e), e > this._maxRank && (this._maxRank = e), this._defines[e] = new Array()), this._defines[e].push(t);\n }\n /**\n * Sets the mesh to use CPU skinning when needing to fallback.\n * @param rank The rank of the fallback (Lower ranks will be fallbacked to first)\n * @param mesh The mesh to use the fallbacks.\n */\n addCPUSkinningFallback(e, t) {\n this._mesh = t, e < this._currentRank && (this._currentRank = e), e > this._maxRank && (this._maxRank = e);\n }\n /**\n * Checks to see if more fallbacks are still available.\n */\n get hasMoreFallbacks() {\n return this._currentRank <= this._maxRank;\n }\n /**\n * Removes the defines that should be removed when falling back.\n * @param currentDefines defines the current define statements for the shader.\n * @param effect defines the current effect we try to compile\n * @returns The resulting defines with defines of the current rank removed.\n */\n reduce(e, t) {\n if (this._mesh && this._mesh.computeBonesUsingShaders && this._mesh.numBoneInfluencers > 0) {\n this._mesh.computeBonesUsingShaders = !1, e = e.replace(\"#define NUM_BONE_INFLUENCERS \" + this._mesh.numBoneInfluencers, \"#define NUM_BONE_INFLUENCERS 0\"), t._bonesComputationForcedToCPU = !0;\n const i = this._mesh.getScene();\n for (let r = 0; r < i.meshes.length; r++) {\n const s = i.meshes[r];\n if (!s.material) {\n !this._mesh.material && s.computeBonesUsingShaders && s.numBoneInfluencers > 0 && (s.computeBonesUsingShaders = !1);\n continue;\n }\n if (!(!s.computeBonesUsingShaders || s.numBoneInfluencers === 0)) {\n if (s.material.getEffect() === t)\n s.computeBonesUsingShaders = !1;\n else if (s.subMeshes) {\n for (const a of s.subMeshes)\n if (a.effect === t) {\n s.computeBonesUsingShaders = !1;\n break;\n }\n }\n }\n }\n } else {\n const i = this._defines[this._currentRank];\n if (i)\n for (let r = 0; r < i.length; r++)\n e = e.replace(\"#define \" + i[r], \"\");\n this._currentRank++;\n }\n return e;\n }\n}\nclass Uc extends ie {\n constructor(e, t, i = !0) {\n super(e, t), this._normalMatrix = new L(), this._storeEffectOnSubMeshes = i;\n }\n getEffect() {\n return this._storeEffectOnSubMeshes ? this._activeEffect : super.getEffect();\n }\n isReady(e, t) {\n return e ? !this._storeEffectOnSubMeshes || !e.subMeshes || e.subMeshes.length === 0 ? !0 : this.isReadyForSubMesh(e, e.subMeshes[0], t) : !1;\n }\n _isReadyForSubMesh(e) {\n const t = e.materialDefines;\n return !!(!this.checkReadyOnEveryCall && e.effect && t && t._renderId === this.getScene().getRenderId());\n }\n /**\n * Binds the given world matrix to the active effect\n *\n * @param world the matrix to bind\n */\n bindOnlyWorldMatrix(e) {\n this._activeEffect.setMatrix(\"world\", e);\n }\n /**\n * Binds the given normal matrix to the active effect\n *\n * @param normalMatrix the matrix to bind\n */\n bindOnlyNormalMatrix(e) {\n this._activeEffect.setMatrix(\"normalMatrix\", e);\n }\n bind(e, t) {\n t && this.bindForSubMesh(e, t, t.subMeshes[0]);\n }\n _afterBind(e, t = null, i) {\n super._afterBind(e, t, i), this.getScene()._cachedEffect = t, i ? i._drawWrapper._forceRebindOnNextCall = !1 : this._drawWrapper._forceRebindOnNextCall = !1;\n }\n _mustRebind(e, t, i, r = 1) {\n return i._drawWrapper._forceRebindOnNextCall || e.isCachedMaterialInvalid(this, t, r);\n }\n dispose(e, t, i) {\n this._activeEffect = void 0, super.dispose(e, t, i);\n }\n}\nconst zh = { effect: null, subMesh: null };\nclass ks extends Uc {\n /**\n * Instantiate a new shader material.\n * The ShaderMaterial object has the necessary methods to pass data from your scene to the Vertex and Fragment Shaders and returns a material that can be applied to any mesh.\n * This returned material effects how the mesh will look based on the code in the shaders.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/shaders/shaderMaterial\n * @param name Define the name of the material in the scene\n * @param scene Define the scene the material belongs to\n * @param shaderPath Defines the route to the shader code.\n * @param options Define the options used to create the shader\n * @param storeEffectOnSubMeshes true to store effect on submeshes, false to store the effect directly in the material class.\n */\n constructor(e, t, i, r = {}, s = !0) {\n super(e, t, s), this._textures = {}, this._textureArrays = {}, this._externalTextures = {}, this._floats = {}, this._ints = {}, this._uints = {}, this._floatsArrays = {}, this._colors3 = {}, this._colors3Arrays = {}, this._colors4 = {}, this._colors4Arrays = {}, this._vectors2 = {}, this._vectors3 = {}, this._vectors4 = {}, this._quaternions = {}, this._quaternionsArrays = {}, this._matrices = {}, this._matrixArrays = {}, this._matrices3x3 = {}, this._matrices2x2 = {}, this._vectors2Arrays = {}, this._vectors3Arrays = {}, this._vectors4Arrays = {}, this._uniformBuffers = {}, this._textureSamplers = {}, this._storageBuffers = {}, this._cachedWorldViewMatrix = new L(), this._cachedWorldViewProjectionMatrix = new L(), this._multiview = !1, this._materialHelperNeedsPreviousMatrices = !1, this._shaderPath = i, this._options = {\n needAlphaBlending: !1,\n needAlphaTesting: !1,\n attributes: [\"position\", \"normal\", \"uv\"],\n uniforms: [\"worldViewProjection\"],\n uniformBuffers: [],\n samplers: [],\n externalTextures: [],\n samplerObjects: [],\n storageBuffers: [],\n defines: [],\n useClipPlane: !1,\n ...r\n };\n }\n /**\n * Gets the shader path used to define the shader code\n * It can be modified to trigger a new compilation\n */\n get shaderPath() {\n return this._shaderPath;\n }\n /**\n * Sets the shader path used to define the shader code\n * It can be modified to trigger a new compilation\n */\n set shaderPath(e) {\n this._shaderPath = e;\n }\n /**\n * Gets the options used to compile the shader.\n * They can be modified to trigger a new compilation\n */\n get options() {\n return this._options;\n }\n /**\n * is multiview set to true?\n */\n get isMultiview() {\n return this._multiview;\n }\n /**\n * Gets the current class name of the material e.g. \"ShaderMaterial\"\n * Mainly use in serialization.\n * @returns the class name\n */\n getClassName() {\n return \"ShaderMaterial\";\n }\n /**\n * Specifies if the material will require alpha blending\n * @returns a boolean specifying if alpha blending is needed\n */\n needAlphaBlending() {\n return this.alpha < 1 || this._options.needAlphaBlending;\n }\n /**\n * Specifies if this material should be rendered in alpha test mode\n * @returns a boolean specifying if an alpha test is needed.\n */\n needAlphaTesting() {\n return this._options.needAlphaTesting;\n }\n _checkUniform(e) {\n this._options.uniforms.indexOf(e) === -1 && this._options.uniforms.push(e);\n }\n /**\n * Set a texture in the shader.\n * @param name Define the name of the uniform samplers as defined in the shader\n * @param texture Define the texture to bind to this sampler\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setTexture(e, t) {\n return this._options.samplers.indexOf(e) === -1 && this._options.samplers.push(e), this._textures[e] = t, this;\n }\n /**\n * Set a texture array in the shader.\n * @param name Define the name of the uniform sampler array as defined in the shader\n * @param textures Define the list of textures to bind to this sampler\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setTextureArray(e, t) {\n return this._options.samplers.indexOf(e) === -1 && this._options.samplers.push(e), this._checkUniform(e), this._textureArrays[e] = t, this;\n }\n /**\n * Set an internal texture in the shader.\n * @param name Define the name of the uniform samplers as defined in the shader\n * @param texture Define the texture to bind to this sampler\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setExternalTexture(e, t) {\n return this._options.externalTextures.indexOf(e) === -1 && this._options.externalTextures.push(e), this._externalTextures[e] = t, this;\n }\n /**\n * Set a float in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setFloat(e, t) {\n return this._checkUniform(e), this._floats[e] = t, this;\n }\n /**\n * Set a int in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setInt(e, t) {\n return this._checkUniform(e), this._ints[e] = t, this;\n }\n /**\n * Set a unsigned int in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setUInt(e, t) {\n return this._checkUniform(e), this._uints[e] = t, this;\n }\n /**\n * Set an array of floats in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setFloats(e, t) {\n return this._checkUniform(e), this._floatsArrays[e] = t, this;\n }\n /**\n * Set a vec3 in the shader from a Color3.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setColor3(e, t) {\n return this._checkUniform(e), this._colors3[e] = t, this;\n }\n /**\n * Set a vec3 array in the shader from a Color3 array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setColor3Array(e, t) {\n return this._checkUniform(e), this._colors3Arrays[e] = t.reduce((i, r) => (r.toArray(i, i.length), i), []), this;\n }\n /**\n * Set a vec4 in the shader from a Color4.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setColor4(e, t) {\n return this._checkUniform(e), this._colors4[e] = t, this;\n }\n /**\n * Set a vec4 array in the shader from a Color4 array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setColor4Array(e, t) {\n return this._checkUniform(e), this._colors4Arrays[e] = t.reduce((i, r) => (r.toArray(i, i.length), i), []), this;\n }\n /**\n * Set a vec2 in the shader from a Vector2.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setVector2(e, t) {\n return this._checkUniform(e), this._vectors2[e] = t, this;\n }\n /**\n * Set a vec3 in the shader from a Vector3.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setVector3(e, t) {\n return this._checkUniform(e), this._vectors3[e] = t, this;\n }\n /**\n * Set a vec4 in the shader from a Vector4.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setVector4(e, t) {\n return this._checkUniform(e), this._vectors4[e] = t, this;\n }\n /**\n * Set a vec4 in the shader from a Quaternion.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setQuaternion(e, t) {\n return this._checkUniform(e), this._quaternions[e] = t, this;\n }\n /**\n * Set a vec4 array in the shader from a Quaternion array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setQuaternionArray(e, t) {\n return this._checkUniform(e), this._quaternionsArrays[e] = t.reduce((i, r) => (r.toArray(i, i.length), i), []), this;\n }\n /**\n * Set a mat4 in the shader from a Matrix.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setMatrix(e, t) {\n return this._checkUniform(e), this._matrices[e] = t, this;\n }\n /**\n * Set a float32Array in the shader from a matrix array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setMatrices(e, t) {\n this._checkUniform(e);\n const i = new Float32Array(t.length * 16);\n for (let r = 0; r < t.length; r++)\n t[r].copyToArray(i, r * 16);\n return this._matrixArrays[e] = i, this;\n }\n /**\n * Set a mat3 in the shader from a Float32Array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setMatrix3x3(e, t) {\n return this._checkUniform(e), this._matrices3x3[e] = t, this;\n }\n /**\n * Set a mat2 in the shader from a Float32Array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setMatrix2x2(e, t) {\n return this._checkUniform(e), this._matrices2x2[e] = t, this;\n }\n /**\n * Set a vec2 array in the shader from a number array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setArray2(e, t) {\n return this._checkUniform(e), this._vectors2Arrays[e] = t, this;\n }\n /**\n * Set a vec3 array in the shader from a number array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setArray3(e, t) {\n return this._checkUniform(e), this._vectors3Arrays[e] = t, this;\n }\n /**\n * Set a vec4 array in the shader from a number array.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setArray4(e, t) {\n return this._checkUniform(e), this._vectors4Arrays[e] = t, this;\n }\n /**\n * Set a uniform buffer in the shader\n * @param name Define the name of the uniform as defined in the shader\n * @param buffer Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setUniformBuffer(e, t) {\n return this._options.uniformBuffers.indexOf(e) === -1 && this._options.uniformBuffers.push(e), this._uniformBuffers[e] = t, this;\n }\n /**\n * Set a texture sampler in the shader\n * @param name Define the name of the uniform as defined in the shader\n * @param sampler Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setTextureSampler(e, t) {\n return this._options.samplerObjects.indexOf(e) === -1 && this._options.samplerObjects.push(e), this._textureSamplers[e] = t, this;\n }\n /**\n * Set a storage buffer in the shader\n * @param name Define the name of the storage buffer as defined in the shader\n * @param buffer Define the value to give to the uniform\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setStorageBuffer(e, t) {\n return this._options.storageBuffers.indexOf(e) === -1 && this._options.storageBuffers.push(e), this._storageBuffers[e] = t, this;\n }\n /**\n * Adds, removes, or replaces the specified shader define and value.\n * * setDefine(\"MY_DEFINE\", true); // enables a boolean define\n * * setDefine(\"MY_DEFINE\", \"0.5\"); // adds \"#define MY_DEFINE 0.5\" to the shader (or sets and replaces the value of any existing define with that name)\n * * setDefine(\"MY_DEFINE\", false); // disables and removes the define\n * Note if the active defines do change, the shader will be recompiled and this can be expensive.\n * @param define the define name e.g., \"OUTPUT_TO_SRGB\" or \"#define OUTPUT_TO_SRGB\". If the define was passed into the constructor already, the version used should match that, and in either case, it should not include any appended value.\n * @param value either the value of the define (e.g. a numerical value) or for booleans, true if the define should be enabled or false if it should be disabled\n * @returns the material itself allowing \"fluent\" like uniform updates\n */\n setDefine(e, t) {\n const i = e.trimEnd() + \" \", r = this.options.defines.findIndex((s) => s === e || s.startsWith(i));\n return r >= 0 && this.options.defines.splice(r, 1), (typeof t != \"boolean\" || t) && this.options.defines.push(i + t), this;\n }\n /**\n * Specifies that the submesh is ready to be used\n * @param mesh defines the mesh to check\n * @param subMesh defines which submesh to check\n * @param useInstances specifies that instances should be used\n * @returns a boolean indicating that the submesh is ready or not\n */\n isReadyForSubMesh(e, t, i) {\n return this.isReady(e, i, t);\n }\n /**\n * Checks if the material is ready to render the requested mesh\n * @param mesh Define the mesh to render\n * @param useInstances Define whether or not the material is used with instances\n * @param subMesh defines which submesh to render\n * @returns true if ready, otherwise false\n */\n isReady(e, t, i) {\n const r = i && this._storeEffectOnSubMeshes;\n if (this.isFrozen) {\n const R = r ? i._drawWrapper : this._drawWrapper;\n if (R.effect && R._wasPreviouslyReady && R._wasPreviouslyUsingInstances === t)\n return !0;\n }\n const s = this.getScene(), a = s.getEngine(), o = [], l = [], c = new gf();\n let h = this._shaderPath, u = this._options.uniforms, f = this._options.uniformBuffers, d = this._options.samplers;\n a.getCaps().multiview && s.activeCamera && s.activeCamera.outputRenderTarget && s.activeCamera.outputRenderTarget.getViewCount() > 1 && (this._multiview = !0, o.push(\"#define MULTIVIEW\"), u.indexOf(\"viewProjection\") !== -1 && u.indexOf(\"viewProjectionR\") === -1 && u.push(\"viewProjectionR\"));\n for (let R = 0; R < this._options.defines.length; R++) {\n const x = this._options.defines[R].indexOf(\"#define\") === 0 ? this._options.defines[R] : `#define ${this._options.defines[R]}`;\n o.push(x);\n }\n for (let R = 0; R < this._options.attributes.length; R++)\n l.push(this._options.attributes[R]);\n if (e && e.isVerticesDataPresent(I.ColorKind) && (l.indexOf(I.ColorKind) === -1 && l.push(I.ColorKind), o.push(\"#define VERTEXCOLOR\")), t && (o.push(\"#define INSTANCES\"), J_(l, this._materialHelperNeedsPreviousMatrices), e != null && e.hasThinInstances && (o.push(\"#define THIN_INSTANCES\"), e && e.isVerticesDataPresent(I.ColorInstanceKind) && (l.push(I.ColorInstanceKind), o.push(\"#define INSTANCESCOLOR\")))), e && e.useBones && e.computeBonesUsingShaders && e.skeleton) {\n l.push(I.MatricesIndicesKind), l.push(I.MatricesWeightsKind), e.numBoneInfluencers > 4 && (l.push(I.MatricesIndicesExtraKind), l.push(I.MatricesWeightsExtraKind));\n const R = e.skeleton;\n o.push(\"#define NUM_BONE_INFLUENCERS \" + e.numBoneInfluencers), c.addCPUSkinningFallback(0, e), R.isUsingTextureForMatrices ? (o.push(\"#define BONETEXTURE\"), u.indexOf(\"boneTextureWidth\") === -1 && u.push(\"boneTextureWidth\"), this._options.samplers.indexOf(\"boneSampler\") === -1 && this._options.samplers.push(\"boneSampler\")) : (o.push(\"#define BonesPerMesh \" + (R.bones.length + 1)), u.indexOf(\"mBones\") === -1 && u.push(\"mBones\"));\n } else\n o.push(\"#define NUM_BONE_INFLUENCERS 0\");\n let p = 0;\n const g = e ? e.morphTargetManager : null;\n if (g) {\n const R = g.supportsUVs && o.indexOf(\"#define UV1\") !== -1, x = g.supportsTangents && o.indexOf(\"#define TANGENT\") !== -1, S = g.supportsNormals && o.indexOf(\"#define NORMAL\") !== -1;\n p = g.numMaxInfluencers || g.numInfluencers, R && o.push(\"#define MORPHTARGETS_UV\"), x && o.push(\"#define MORPHTARGETS_TANGENT\"), S && o.push(\"#define MORPHTARGETS_NORMAL\"), p > 0 && o.push(\"#define MORPHTARGETS\"), g.isUsingTextureForTargets && (o.push(\"#define MORPHTARGETS_TEXTURE\"), u.indexOf(\"morphTargetTextureIndices\") === -1 && u.push(\"morphTargetTextureIndices\"), this._options.samplers.indexOf(\"morphTargets\") === -1 && this._options.samplers.push(\"morphTargets\")), o.push(\"#define NUM_MORPH_INFLUENCERS \" + p);\n for (let M = 0; M < p; M++)\n l.push(I.PositionKind + M), S && l.push(I.NormalKind + M), x && l.push(I.TangentKind + M), R && l.push(I.UVKind + \"_\" + M);\n p > 0 && (u = u.slice(), u.push(\"morphTargetInfluences\"), u.push(\"morphTargetCount\"), u.push(\"morphTargetTextureInfo\"), u.push(\"morphTargetTextureIndices\"));\n } else\n o.push(\"#define NUM_MORPH_INFLUENCERS 0\");\n if (e) {\n const R = e.bakedVertexAnimationManager;\n R && R.isEnabled && (o.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\"), u.indexOf(\"bakedVertexAnimationSettings\") === -1 && u.push(\"bakedVertexAnimationSettings\"), u.indexOf(\"bakedVertexAnimationTextureSizeInverted\") === -1 && u.push(\"bakedVertexAnimationTextureSizeInverted\"), u.indexOf(\"bakedVertexAnimationTime\") === -1 && u.push(\"bakedVertexAnimationTime\"), this._options.samplers.indexOf(\"bakedVertexAnimationTexture\") === -1 && this._options.samplers.push(\"bakedVertexAnimationTexture\")), of(l, e, o);\n }\n for (const R in this._textures)\n if (!this._textures[R].isReady())\n return !1;\n e && this._shouldTurnAlphaTestOn(e) && o.push(\"#define ALPHATEST\"), this._options.useClipPlane !== !1 && (Nc(u), Zy(this, s, o)), s.fogEnabled && (e != null && e.applyFog) && s.fogMode !== Ot.FOGMODE_NONE && (o.push(\"#define FOG\"), u.indexOf(\"view\") === -1 && u.push(\"view\"), u.indexOf(\"vFogInfos\") === -1 && u.push(\"vFogInfos\"), u.indexOf(\"vFogColor\") === -1 && u.push(\"vFogColor\")), this._useLogarithmicDepth && (o.push(\"#define LOGARITHMICDEPTH\"), u.indexOf(\"logarithmicDepthConstant\") === -1 && u.push(\"logarithmicDepthConstant\")), this.customShaderNameResolve && (u = u.slice(), f = f.slice(), d = d.slice(), h = this.customShaderNameResolve(this.name, u, f, d, o, l));\n const m = r ? i._getDrawWrapper(void 0, !0) : this._drawWrapper, v = (m == null ? void 0 : m.effect) ?? null, E = (m == null ? void 0 : m.defines) ?? null, C = o.join(`\n`);\n let T = v;\n return E !== C && (T = a.createEffect(h, {\n attributes: l,\n uniformsNames: u,\n uniformBuffersNames: f,\n samplers: d,\n defines: C,\n fallbacks: c,\n onCompiled: this.onCompiled,\n onError: this.onError,\n indexParameters: { maxSimultaneousMorphTargets: p },\n shaderLanguage: this._options.shaderLanguage\n }, a), r ? i.setEffect(T, C, this._materialContext) : m && m.setEffect(T, C), this._onEffectCreatedObservable && (zh.effect = T, zh.subMesh = i ?? (e == null ? void 0 : e.subMeshes[0]) ?? null, this._onEffectCreatedObservable.notifyObservers(zh))), m._wasPreviouslyUsingInstances = !!t, T != null && T.isReady() ? (v !== T && s.resetCachedMaterial(), m._wasPreviouslyReady = !0, !0) : !1;\n }\n /**\n * Binds the world matrix to the material\n * @param world defines the world transformation matrix\n * @param effectOverride - If provided, use this effect instead of internal effect\n */\n bindOnlyWorldMatrix(e, t) {\n const i = this.getScene(), r = t ?? this.getEffect();\n r && (this._options.uniforms.indexOf(\"world\") !== -1 && r.setMatrix(\"world\", e), this._options.uniforms.indexOf(\"worldView\") !== -1 && (e.multiplyToRef(i.getViewMatrix(), this._cachedWorldViewMatrix), r.setMatrix(\"worldView\", this._cachedWorldViewMatrix)), this._options.uniforms.indexOf(\"worldViewProjection\") !== -1 && (e.multiplyToRef(i.getTransformMatrix(), this._cachedWorldViewProjectionMatrix), r.setMatrix(\"worldViewProjection\", this._cachedWorldViewProjectionMatrix)), this._options.uniforms.indexOf(\"view\") !== -1 && r.setMatrix(\"view\", i.getViewMatrix()));\n }\n /**\n * Binds the submesh to this material by preparing the effect and shader to draw\n * @param world defines the world transformation matrix\n * @param mesh defines the mesh containing the submesh\n * @param subMesh defines the submesh to bind the material to\n */\n bindForSubMesh(e, t, i) {\n var r;\n this.bind(e, t, (r = i._drawWrapperOverride) == null ? void 0 : r.effect, i);\n }\n /**\n * Binds the material to the mesh\n * @param world defines the world transformation matrix\n * @param mesh defines the mesh to bind the material to\n * @param effectOverride - If provided, use this effect instead of internal effect\n * @param subMesh defines the submesh to bind the material to\n */\n bind(e, t, i, r) {\n var u;\n const s = r && this._storeEffectOnSubMeshes, a = i ?? (s ? r.effect : this.getEffect());\n if (!a)\n return;\n const o = this.getScene();\n this._activeEffect = a, this.bindOnlyWorldMatrix(e, i);\n const l = this._options.uniformBuffers;\n let c = !1;\n if (a && l && l.length > 0 && o.getEngine().supportsUniformBuffers)\n for (let f = 0; f < l.length; ++f)\n switch (l[f]) {\n case \"Mesh\":\n t && (t.getMeshUniformBuffer().bindToEffect(a, \"Mesh\"), t.transferToEffect(e));\n break;\n case \"Scene\":\n $_(a, o.getSceneUniformBuffer()), o.finalizeSceneUbo(), c = !0;\n break;\n }\n const h = t && s ? this._mustRebind(o, a, r, t.visibility) : o.getCachedMaterial() !== this;\n if (a && h) {\n !c && this._options.uniforms.indexOf(\"view\") !== -1 && a.setMatrix(\"view\", o.getViewMatrix()), !c && this._options.uniforms.indexOf(\"projection\") !== -1 && a.setMatrix(\"projection\", o.getProjectionMatrix()), !c && this._options.uniforms.indexOf(\"viewProjection\") !== -1 && (a.setMatrix(\"viewProjection\", o.getTransformMatrix()), this._multiview && a.setMatrix(\"viewProjectionR\", o._transformMatrixR)), o.activeCamera && this._options.uniforms.indexOf(\"cameraPosition\") !== -1 && a.setVector3(\"cameraPosition\", o.activeCamera.globalPosition), lf(t, a), Fc(a, this, o), this._useLogarithmicDepth && Lc(s ? r.materialDefines : a.defines, a, o), t && wc(o, t, a);\n let f;\n for (f in this._textures)\n a.setTexture(f, this._textures[f]);\n for (f in this._textureArrays)\n a.setTextureArray(f, this._textureArrays[f]);\n for (f in this._externalTextures)\n a.setExternalTexture(f, this._externalTextures[f]);\n for (f in this._ints)\n a.setInt(f, this._ints[f]);\n for (f in this._uints)\n a.setUInt(f, this._uints[f]);\n for (f in this._floats)\n a.setFloat(f, this._floats[f]);\n for (f in this._floatsArrays)\n a.setArray(f, this._floatsArrays[f]);\n for (f in this._colors3)\n a.setColor3(f, this._colors3[f]);\n for (f in this._colors3Arrays)\n a.setArray3(f, this._colors3Arrays[f]);\n for (f in this._colors4) {\n const d = this._colors4[f];\n a.setFloat4(f, d.r, d.g, d.b, d.a);\n }\n for (f in this._colors4Arrays)\n a.setArray4(f, this._colors4Arrays[f]);\n for (f in this._vectors2)\n a.setVector2(f, this._vectors2[f]);\n for (f in this._vectors3)\n a.setVector3(f, this._vectors3[f]);\n for (f in this._vectors4)\n a.setVector4(f, this._vectors4[f]);\n for (f in this._quaternions)\n a.setQuaternion(f, this._quaternions[f]);\n for (f in this._matrices)\n a.setMatrix(f, this._matrices[f]);\n for (f in this._matrixArrays)\n a.setMatrices(f, this._matrixArrays[f]);\n for (f in this._matrices3x3)\n a.setMatrix3x3(f, this._matrices3x3[f]);\n for (f in this._matrices2x2)\n a.setMatrix2x2(f, this._matrices2x2[f]);\n for (f in this._vectors2Arrays)\n a.setArray2(f, this._vectors2Arrays[f]);\n for (f in this._vectors3Arrays)\n a.setArray3(f, this._vectors3Arrays[f]);\n for (f in this._vectors4Arrays)\n a.setArray4(f, this._vectors4Arrays[f]);\n for (f in this._quaternionsArrays)\n a.setArray4(f, this._quaternionsArrays[f]);\n for (f in this._uniformBuffers) {\n const d = this._uniformBuffers[f].getBuffer();\n d && a.bindUniformBuffer(d, f);\n }\n for (f in this._textureSamplers)\n a.setTextureSampler(f, this._textureSamplers[f]);\n for (f in this._storageBuffers)\n a.setStorageBuffer(f, this._storageBuffers[f]);\n }\n if (a && t && (h || !this.isFrozen)) {\n const f = t.morphTargetManager;\n f && f.numInfluencers > 0 && af(t, a);\n const d = t.bakedVertexAnimationManager;\n if (d && d.isEnabled) {\n const p = s ? r._drawWrapper : this._drawWrapper;\n (u = t.bakedVertexAnimationManager) == null || u.bind(a, !!p._wasPreviouslyUsingInstances);\n }\n }\n this._afterBind(t, a, r);\n }\n /**\n * Gets the active textures from the material\n * @returns an array of textures\n */\n getActiveTextures() {\n const e = super.getActiveTextures();\n for (const t in this._textures)\n e.push(this._textures[t]);\n for (const t in this._textureArrays) {\n const i = this._textureArrays[t];\n for (let r = 0; r < i.length; r++)\n e.push(i[r]);\n }\n return e;\n }\n /**\n * Specifies if the material uses a texture\n * @param texture defines the texture to check against the material\n * @returns a boolean specifying if the material uses the texture\n */\n hasTexture(e) {\n if (super.hasTexture(e))\n return !0;\n for (const t in this._textures)\n if (this._textures[t] === e)\n return !0;\n for (const t in this._textureArrays) {\n const i = this._textureArrays[t];\n for (let r = 0; r < i.length; r++)\n if (i[r] === e)\n return !0;\n }\n return !1;\n }\n /**\n * Makes a duplicate of the material, and gives it a new name\n * @param name defines the new name for the duplicated material\n * @returns the cloned material\n */\n clone(e) {\n const t = Le.Clone(() => new ks(e, this.getScene(), this._shaderPath, this._options, this._storeEffectOnSubMeshes), this);\n t.name = e, t.id = e, typeof t._shaderPath == \"object\" && (t._shaderPath = { ...t._shaderPath }), this._options = { ...this._options }, Object.keys(this._options).forEach((i) => {\n const r = this._options[i];\n Array.isArray(r) && (this._options[i] = r.slice(0));\n }), this.stencil.copyTo(t.stencil);\n for (const i in this._textures)\n t.setTexture(i, this._textures[i]);\n for (const i in this._textureArrays)\n t.setTextureArray(i, this._textureArrays[i]);\n for (const i in this._externalTextures)\n t.setExternalTexture(i, this._externalTextures[i]);\n for (const i in this._ints)\n t.setInt(i, this._ints[i]);\n for (const i in this._uints)\n t.setUInt(i, this._uints[i]);\n for (const i in this._floats)\n t.setFloat(i, this._floats[i]);\n for (const i in this._floatsArrays)\n t.setFloats(i, this._floatsArrays[i]);\n for (const i in this._colors3)\n t.setColor3(i, this._colors3[i]);\n for (const i in this._colors3Arrays)\n t._colors3Arrays[i] = this._colors3Arrays[i];\n for (const i in this._colors4)\n t.setColor4(i, this._colors4[i]);\n for (const i in this._colors4Arrays)\n t._colors4Arrays[i] = this._colors4Arrays[i];\n for (const i in this._vectors2)\n t.setVector2(i, this._vectors2[i]);\n for (const i in this._vectors3)\n t.setVector3(i, this._vectors3[i]);\n for (const i in this._vectors4)\n t.setVector4(i, this._vectors4[i]);\n for (const i in this._quaternions)\n t.setQuaternion(i, this._quaternions[i]);\n for (const i in this._quaternionsArrays)\n t._quaternionsArrays[i] = this._quaternionsArrays[i];\n for (const i in this._matrices)\n t.setMatrix(i, this._matrices[i]);\n for (const i in this._matrixArrays)\n t._matrixArrays[i] = this._matrixArrays[i].slice();\n for (const i in this._matrices3x3)\n t.setMatrix3x3(i, this._matrices3x3[i]);\n for (const i in this._matrices2x2)\n t.setMatrix2x2(i, this._matrices2x2[i]);\n for (const i in this._vectors2Arrays)\n t.setArray2(i, this._vectors2Arrays[i]);\n for (const i in this._vectors3Arrays)\n t.setArray3(i, this._vectors3Arrays[i]);\n for (const i in this._vectors4Arrays)\n t.setArray4(i, this._vectors4Arrays[i]);\n for (const i in this._uniformBuffers)\n t.setUniformBuffer(i, this._uniformBuffers[i]);\n for (const i in this._textureSamplers)\n t.setTextureSampler(i, this._textureSamplers[i]);\n for (const i in this._storageBuffers)\n t.setStorageBuffer(i, this._storageBuffers[i]);\n return t;\n }\n /**\n * Disposes the material\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\n * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh\n */\n dispose(e, t, i) {\n if (t) {\n let r;\n for (r in this._textures)\n this._textures[r].dispose();\n for (r in this._textureArrays) {\n const s = this._textureArrays[r];\n for (let a = 0; a < s.length; a++)\n s[a].dispose();\n }\n }\n this._textures = {}, super.dispose(e, t, i);\n }\n /**\n * Serializes this material in a JSON representation\n * @returns the serialized material object\n */\n serialize() {\n const e = Le.Serialize(this);\n e.customType = \"BABYLON.ShaderMaterial\", e.uniqueId = this.uniqueId, e.options = this._options, e.shaderPath = this._shaderPath, e.storeEffectOnSubMeshes = this._storeEffectOnSubMeshes;\n let t;\n e.stencil = this.stencil.serialize(), e.textures = {};\n for (t in this._textures)\n e.textures[t] = this._textures[t].serialize();\n e.textureArrays = {};\n for (t in this._textureArrays) {\n e.textureArrays[t] = [];\n const i = this._textureArrays[t];\n for (let r = 0; r < i.length; r++)\n e.textureArrays[t].push(i[r].serialize());\n }\n e.ints = {};\n for (t in this._ints)\n e.ints[t] = this._ints[t];\n e.uints = {};\n for (t in this._uints)\n e.uints[t] = this._uints[t];\n e.floats = {};\n for (t in this._floats)\n e.floats[t] = this._floats[t];\n e.floatsArrays = {};\n for (t in this._floatsArrays)\n e.floatsArrays[t] = this._floatsArrays[t];\n e.colors3 = {};\n for (t in this._colors3)\n e.colors3[t] = this._colors3[t].asArray();\n e.colors3Arrays = {};\n for (t in this._colors3Arrays)\n e.colors3Arrays[t] = this._colors3Arrays[t];\n e.colors4 = {};\n for (t in this._colors4)\n e.colors4[t] = this._colors4[t].asArray();\n e.colors4Arrays = {};\n for (t in this._colors4Arrays)\n e.colors4Arrays[t] = this._colors4Arrays[t];\n e.vectors2 = {};\n for (t in this._vectors2)\n e.vectors2[t] = this._vectors2[t].asArray();\n e.vectors3 = {};\n for (t in this._vectors3)\n e.vectors3[t] = this._vectors3[t].asArray();\n e.vectors4 = {};\n for (t in this._vectors4)\n e.vectors4[t] = this._vectors4[t].asArray();\n e.quaternions = {};\n for (t in this._quaternions)\n e.quaternions[t] = this._quaternions[t].asArray();\n e.matrices = {};\n for (t in this._matrices)\n e.matrices[t] = this._matrices[t].asArray();\n e.matrixArray = {};\n for (t in this._matrixArrays)\n e.matrixArray[t] = this._matrixArrays[t];\n e.matrices3x3 = {};\n for (t in this._matrices3x3)\n e.matrices3x3[t] = this._matrices3x3[t];\n e.matrices2x2 = {};\n for (t in this._matrices2x2)\n e.matrices2x2[t] = this._matrices2x2[t];\n e.vectors2Arrays = {};\n for (t in this._vectors2Arrays)\n e.vectors2Arrays[t] = this._vectors2Arrays[t];\n e.vectors3Arrays = {};\n for (t in this._vectors3Arrays)\n e.vectors3Arrays[t] = this._vectors3Arrays[t];\n e.vectors4Arrays = {};\n for (t in this._vectors4Arrays)\n e.vectors4Arrays[t] = this._vectors4Arrays[t];\n e.quaternionsArrays = {};\n for (t in this._quaternionsArrays)\n e.quaternionsArrays[t] = this._quaternionsArrays[t];\n return e;\n }\n /**\n * Creates a shader material from parsed shader material data\n * @param source defines the JSON representation of the material\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a new material\n */\n static Parse(e, t, i) {\n const r = Le.Parse(() => new ks(e.name, t, e.shaderPath, e.options, e.storeEffectOnSubMeshes), e, t, i);\n let s;\n e.stencil && r.stencil.parse(e.stencil, t, i);\n for (s in e.textures)\n r.setTexture(s, le.Parse(e.textures[s], t, i));\n for (s in e.textureArrays) {\n const a = e.textureArrays[s], o = [];\n for (let l = 0; l < a.length; l++)\n o.push(le.Parse(a[l], t, i));\n r.setTextureArray(s, o);\n }\n for (s in e.ints)\n r.setInt(s, e.ints[s]);\n for (s in e.uints)\n r.setUInt(s, e.uints[s]);\n for (s in e.floats)\n r.setFloat(s, e.floats[s]);\n for (s in e.floatsArrays)\n r.setFloats(s, e.floatsArrays[s]);\n for (s in e.colors3)\n r.setColor3(s, Ne.FromArray(e.colors3[s]));\n for (s in e.colors3Arrays) {\n const a = e.colors3Arrays[s].reduce((o, l, c) => (c % 3 === 0 ? o.push([l]) : o[o.length - 1].push(l), o), []).map((o) => Ne.FromArray(o));\n r.setColor3Array(s, a);\n }\n for (s in e.colors4)\n r.setColor4(s, et.FromArray(e.colors4[s]));\n for (s in e.colors4Arrays) {\n const a = e.colors4Arrays[s].reduce((o, l, c) => (c % 4 === 0 ? o.push([l]) : o[o.length - 1].push(l), o), []).map((o) => et.FromArray(o));\n r.setColor4Array(s, a);\n }\n for (s in e.vectors2)\n r.setVector2(s, me.FromArray(e.vectors2[s]));\n for (s in e.vectors3)\n r.setVector3(s, _.FromArray(e.vectors3[s]));\n for (s in e.vectors4)\n r.setVector4(s, Ke.FromArray(e.vectors4[s]));\n for (s in e.quaternions)\n r.setQuaternion(s, Ce.FromArray(e.quaternions[s]));\n for (s in e.matrices)\n r.setMatrix(s, L.FromArray(e.matrices[s]));\n for (s in e.matrixArray)\n r._matrixArrays[s] = new Float32Array(e.matrixArray[s]);\n for (s in e.matrices3x3)\n r.setMatrix3x3(s, e.matrices3x3[s]);\n for (s in e.matrices2x2)\n r.setMatrix2x2(s, e.matrices2x2[s]);\n for (s in e.vectors2Arrays)\n r.setArray2(s, e.vectors2Arrays[s]);\n for (s in e.vectors3Arrays)\n r.setArray3(s, e.vectors3Arrays[s]);\n for (s in e.vectors4Arrays)\n r.setArray4(s, e.vectors4Arrays[s]);\n for (s in e.quaternionsArrays)\n r.setArray4(s, e.quaternionsArrays[s]);\n return r;\n }\n /**\n * Creates a new ShaderMaterial from a snippet saved in a remote file\n * @param name defines the name of the ShaderMaterial to create (can be null or empty to use the one from the json data)\n * @param url defines the url to load from\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a promise that will resolve to the new ShaderMaterial\n */\n static ParseFromFileAsync(e, t, i, r = \"\") {\n return new Promise((s, a) => {\n const o = new mi();\n o.addEventListener(\"readystatechange\", () => {\n if (o.readyState == 4)\n if (o.status == 200) {\n const l = JSON.parse(o.responseText), c = this.Parse(l, i || st.LastCreatedScene, r);\n e && (c.name = e), s(c);\n } else\n a(\"Unable to load the ShaderMaterial\");\n }), o.open(\"GET\", t), o.send();\n });\n }\n /**\n * Creates a ShaderMaterial from a snippet saved by the Inspector\n * @param snippetId defines the snippet to load\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a promise that will resolve to the new ShaderMaterial\n */\n static ParseFromSnippetAsync(e, t, i = \"\") {\n return new Promise((r, s) => {\n const a = new mi();\n a.addEventListener(\"readystatechange\", () => {\n if (a.readyState == 4)\n if (a.status == 200) {\n const o = JSON.parse(JSON.parse(a.responseText).jsonPayload), l = JSON.parse(o.shaderMaterial), c = this.Parse(l, t || st.LastCreatedScene, i);\n c.snippetId = e, r(c);\n } else\n s(\"Unable to load the snippet \" + e);\n }), a.open(\"GET\", this.SnippetUrl + \"/\" + e.replace(/#/g, \"/\")), a.send();\n });\n }\n}\nks.SnippetUrl = \"https://snippet.babylonjs.com\";\nks.CreateFromSnippetAsync = ks.ParseFromSnippetAsync;\nRe(\"BABYLON.ShaderMaterial\", ks);\nclass fI {\n /**\n * Gets the depth/stencil texture (if created by a createDepthStencilTexture() call)\n */\n get depthStencilTexture() {\n return this._depthStencilTexture;\n }\n /**\n * Indicates if the depth/stencil texture has a stencil aspect\n */\n get depthStencilTextureWithStencil() {\n return this._depthStencilTextureWithStencil;\n }\n /**\n * Defines if the render target wrapper is for a cube texture or if false a 2d texture\n */\n get isCube() {\n return this._isCube;\n }\n /**\n * Defines if the render target wrapper is for a single or multi target render wrapper\n */\n get isMulti() {\n return this._isMulti;\n }\n /**\n * Defines if the render target wrapper is for a single or an array of textures\n */\n get is2DArray() {\n return this.layers > 0;\n }\n /**\n * Defines if the render target wrapper is for a 3D texture\n */\n get is3D() {\n return this.depth > 0;\n }\n /**\n * Gets the size of the render target wrapper (used for cubes, as width=height in this case)\n */\n get size() {\n return this.width;\n }\n /**\n * Gets the width of the render target wrapper\n */\n get width() {\n return this._size.width || this._size;\n }\n /**\n * Gets the height of the render target wrapper\n */\n get height() {\n return this._size.height || this._size;\n }\n /**\n * Gets the number of layers of the render target wrapper (only used if is2DArray is true and wrapper is not a multi render target)\n */\n get layers() {\n return this._size.layers || 0;\n }\n /**\n * Gets the depth of the render target wrapper (only used if is3D is true and wrapper is not a multi render target)\n */\n get depth() {\n return this._size.depth || 0;\n }\n /**\n * Gets the render texture. If this is a multi render target, gets the first texture\n */\n get texture() {\n var e;\n return ((e = this._textures) == null ? void 0 : e[0]) ?? null;\n }\n /**\n * Gets the list of render textures. If we are not in a multi render target, the list will be null (use the texture getter instead)\n */\n get textures() {\n return this._textures;\n }\n /**\n * Gets the face indices that correspond to the list of render textures. If we are not in a multi render target, the list will be null\n */\n get faceIndices() {\n return this._faceIndices;\n }\n /**\n * Gets the layer indices that correspond to the list of render textures. If we are not in a multi render target, the list will be null\n */\n get layerIndices() {\n return this._layerIndices;\n }\n /**\n * Gets the sample count of the render target\n */\n get samples() {\n return this._samples;\n }\n /**\n * Sets the sample count of the render target\n * @param value sample count\n * @param initializeBuffers If set to true, the engine will make an initializing call to drawBuffers (only used when isMulti=true).\n * @param force true to force calling the update sample count engine function even if the current sample count is equal to value\n * @returns the sample count that has been set\n */\n setSamples(e, t = !0, i = !1) {\n if (this.samples === e && !i)\n return e;\n const r = this._isMulti ? this._engine.updateMultipleRenderTargetTextureSampleCount(this, e, t) : this._engine.updateRenderTargetTextureSampleCount(this, e);\n return this._samples = e, r;\n }\n /**\n * Initializes the render target wrapper\n * @param isMulti true if the wrapper is a multi render target\n * @param isCube true if the wrapper should render to a cube texture\n * @param size size of the render target (width/height/layers)\n * @param engine engine used to create the render target\n * @param label defines the label to use for the wrapper (for debugging purpose only)\n */\n constructor(e, t, i, r, s) {\n this._textures = null, this._faceIndices = null, this._layerIndices = null, this._samples = 1, this._attachments = null, this._generateStencilBuffer = !1, this._generateDepthBuffer = !1, this._depthStencilTextureWithStencil = !1, this._isMulti = e, this._isCube = t, this._size = i, this._engine = r, this._depthStencilTexture = null, this.label = s;\n }\n /**\n * Sets the render target texture(s)\n * @param textures texture(s) to set\n */\n setTextures(e) {\n Array.isArray(e) ? this._textures = e : e ? this._textures = [e] : this._textures = null;\n }\n /**\n * Set a texture in the textures array\n * @param texture The texture to set\n * @param index The index in the textures array to set\n * @param disposePrevious If this function should dispose the previous texture\n */\n setTexture(e, t = 0, i = !0) {\n this._textures || (this._textures = []), this._textures[t] !== e && (this._textures[t] && i && this._textures[t].dispose(), this._textures[t] = e);\n }\n /**\n * Sets the layer and face indices of every render target texture bound to each color attachment\n * @param layers The layers of each texture to be set\n * @param faces The faces of each texture to be set\n */\n setLayerAndFaceIndices(e, t) {\n this._layerIndices = e, this._faceIndices = t;\n }\n /**\n * Sets the layer and face indices of a texture in the textures array that should be bound to each color attachment\n * @param index The index of the texture in the textures array to modify\n * @param layer The layer of the texture to be set\n * @param face The face of the texture to be set\n */\n setLayerAndFaceIndex(e = 0, t, i) {\n this._layerIndices || (this._layerIndices = []), this._faceIndices || (this._faceIndices = []), t !== void 0 && t >= 0 && (this._layerIndices[e] = t), i !== void 0 && i >= 0 && (this._faceIndices[e] = i);\n }\n /**\n * Creates the depth/stencil texture\n * @param comparisonFunction Comparison function to use for the texture\n * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture\n * @param generateStencil true if the stencil aspect should also be created\n * @param samples sample count to use when creating the texture\n * @param format format of the depth texture\n * @param label defines the label to use for the texture (for debugging purpose only)\n * @returns the depth/stencil created texture\n */\n createDepthStencilTexture(e = 0, t = !0, i = !1, r = 1, s = 14, a) {\n var o;\n return (o = this._depthStencilTexture) == null || o.dispose(), this._depthStencilTextureWithStencil = i, this._depthStencilTextureLabel = a, this._depthStencilTexture = this._engine.createDepthStencilTexture(this._size, {\n bilinearFiltering: t,\n comparisonFunction: e,\n generateStencil: i,\n isCube: this._isCube,\n samples: r,\n depthTextureFormat: s,\n label: a\n }, this), this._depthStencilTexture;\n }\n /**\n * Shares the depth buffer of this render target with another render target.\n * @internal\n * @param renderTarget Destination renderTarget\n */\n _shareDepth(e) {\n this._depthStencilTexture && (e._depthStencilTexture && e._depthStencilTexture.dispose(), e._depthStencilTexture = this._depthStencilTexture, this._depthStencilTexture.incrementReferences());\n }\n /**\n * @internal\n */\n _swapAndDie(e) {\n this.texture && this.texture._swapAndDie(e), this._textures = null, this.dispose(!0);\n }\n _cloneRenderTargetWrapper() {\n var t, i, r, s, a;\n let e = null;\n if (this._isMulti) {\n const o = this.textures;\n if (o && o.length > 0) {\n let l = !1, c = o.length, h = -1;\n const u = o[o.length - 1]._source;\n (u === Dt.Depth || u === Dt.DepthStencil) && (l = !0, h = o[o.length - 1].format, c--);\n const f = [], d = [], p = [], g = [], m = [], v = [], E = [], C = {};\n for (let x = 0; x < c; ++x) {\n const S = o[x];\n f.push(S.samplingMode), d.push(S.type), p.push(S.format), C[S.uniqueId] !== void 0 ? (g.push(-1), E.push(0)) : (C[S.uniqueId] = x, S.is2DArray ? (g.push(35866), E.push(S.depth)) : S.isCube ? (g.push(34067), E.push(0)) : S.is3D ? (g.push(32879), E.push(S.depth)) : (g.push(3553), E.push(0))), this._faceIndices && m.push(this._faceIndices[x] ?? 0), this._layerIndices && v.push(this._layerIndices[x] ?? 0);\n }\n const T = {\n samplingModes: f,\n generateMipMaps: o[0].generateMipMaps,\n generateDepthBuffer: this._generateDepthBuffer,\n generateStencilBuffer: this._generateStencilBuffer,\n generateDepthTexture: l,\n depthTextureFormat: h,\n types: d,\n formats: p,\n textureCount: c,\n targetTypes: g,\n faceIndex: m,\n layerIndex: v,\n layerCounts: E,\n label: this.label\n }, R = {\n width: this.width,\n height: this.height,\n depth: this.depth\n };\n e = this._engine.createMultipleRenderTarget(R, T);\n for (let x = 0; x < c; ++x) {\n if (g[x] !== -1)\n continue;\n const S = C[o[x].uniqueId];\n e.setTexture(e.textures[S], x);\n }\n }\n } else {\n const o = {};\n if (o.generateDepthBuffer = this._generateDepthBuffer, o.generateMipMaps = ((t = this.texture) == null ? void 0 : t.generateMipMaps) ?? !1, o.generateStencilBuffer = this._generateStencilBuffer, o.samplingMode = (i = this.texture) == null ? void 0 : i.samplingMode, o.type = (r = this.texture) == null ? void 0 : r.type, o.format = (s = this.texture) == null ? void 0 : s.format, o.noColorAttachment = !this._textures, o.label = this.label, this.isCube)\n e = this._engine.createRenderTargetCubeTexture(this.width, o);\n else {\n const l = {\n width: this.width,\n height: this.height,\n layers: this.is2DArray || this.is3D ? (a = this.texture) == null ? void 0 : a.depth : void 0\n };\n e = this._engine.createRenderTargetTexture(l, o);\n }\n e.texture && (e.texture.isReady = !0);\n }\n return e;\n }\n _swapRenderTargetWrapper(e) {\n if (this._textures && e._textures)\n for (let t = 0; t < this._textures.length; ++t)\n this._textures[t]._swapAndDie(e._textures[t], !1), e._textures[t].isReady = !0;\n this._depthStencilTexture && e._depthStencilTexture && (this._depthStencilTexture._swapAndDie(e._depthStencilTexture), e._depthStencilTexture.isReady = !0), this._textures = null, this._depthStencilTexture = null;\n }\n /** @internal */\n _rebuild() {\n const e = this._cloneRenderTargetWrapper();\n if (e) {\n if (this._depthStencilTexture) {\n const t = this._depthStencilTexture.samplingMode, i = this._depthStencilTexture.format, r = t === 2 || t === 3 || t === 11;\n e.createDepthStencilTexture(this._depthStencilTexture._comparisonFunction, r, this._depthStencilTextureWithStencil, this._depthStencilTexture.samples, i, this._depthStencilTextureLabel);\n }\n this.samples > 1 && e.setSamples(this.samples), e._swapRenderTargetWrapper(this), e.dispose();\n }\n }\n /**\n * Releases the internal render textures\n */\n releaseTextures() {\n var e;\n if (this._textures)\n for (let t = 0; t < ((e = this._textures) == null ? void 0 : e.length); ++t)\n this._textures[t].dispose();\n this._textures = null;\n }\n /**\n * Disposes the whole render target wrapper\n * @param disposeOnlyFramebuffers true if only the frame buffers should be released (used for the WebGL engine). If false, all the textures will also be released\n */\n dispose(e = !1) {\n var t;\n e || ((t = this._depthStencilTexture) == null || t.dispose(), this._depthStencilTexture = null, this.releaseTextures()), this._engine._releaseRenderTargetWrapper(this);\n }\n}\nclass dI extends fI {\n constructor(e, t, i, r, s) {\n super(e, t, i, r), this._framebuffer = null, this._depthStencilBuffer = null, this._MSAAFramebuffer = null, this._colorTextureArray = null, this._depthStencilTextureArray = null, this._disposeOnlyFramebuffers = !1, this._currentLOD = 0, this._context = s;\n }\n _cloneRenderTargetWrapper() {\n let e = null;\n return this._colorTextureArray && this._depthStencilTextureArray ? (e = this._engine.createMultiviewRenderTargetTexture(this.width, this.height), e.texture.isReady = !0) : e = super._cloneRenderTargetWrapper(), e;\n }\n _swapRenderTargetWrapper(e) {\n super._swapRenderTargetWrapper(e), e._framebuffer = this._framebuffer, e._depthStencilBuffer = this._depthStencilBuffer, e._MSAAFramebuffer = this._MSAAFramebuffer, e._colorTextureArray = this._colorTextureArray, e._depthStencilTextureArray = this._depthStencilTextureArray, this._framebuffer = this._depthStencilBuffer = this._MSAAFramebuffer = this._colorTextureArray = this._depthStencilTextureArray = null;\n }\n /**\n * Creates the depth/stencil texture\n * @param comparisonFunction Comparison function to use for the texture\n * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture\n * @param generateStencil true if the stencil aspect should also be created\n * @param samples sample count to use when creating the texture\n * @param format format of the depth texture\n * @param label defines the label to use for the texture (for debugging purpose only)\n * @returns the depth/stencil created texture\n */\n createDepthStencilTexture(e = 0, t = !0, i = !1, r = 1, s = 14, a) {\n if (this._depthStencilBuffer) {\n const o = this._engine._currentFramebuffer, l = this._context;\n this._engine._bindUnboundFramebuffer(this._framebuffer), l.framebufferRenderbuffer(l.FRAMEBUFFER, l.DEPTH_STENCIL_ATTACHMENT, l.RENDERBUFFER, null), l.framebufferRenderbuffer(l.FRAMEBUFFER, l.DEPTH_ATTACHMENT, l.RENDERBUFFER, null), l.framebufferRenderbuffer(l.FRAMEBUFFER, l.STENCIL_ATTACHMENT, l.RENDERBUFFER, null), this._engine._bindUnboundFramebuffer(o), l.deleteRenderbuffer(this._depthStencilBuffer), this._depthStencilBuffer = null;\n }\n return super.createDepthStencilTexture(e, t, i, r, s, a);\n }\n /**\n * Shares the depth buffer of this render target with another render target.\n * @internal\n * @param renderTarget Destination renderTarget\n */\n _shareDepth(e) {\n super._shareDepth(e);\n const t = this._context, i = this._depthStencilBuffer, r = e._MSAAFramebuffer || e._framebuffer;\n e._depthStencilBuffer && e._depthStencilBuffer !== i && t.deleteRenderbuffer(e._depthStencilBuffer), e._depthStencilBuffer = i;\n const s = e._generateStencilBuffer ? t.DEPTH_STENCIL_ATTACHMENT : t.DEPTH_ATTACHMENT;\n this._engine._bindUnboundFramebuffer(r), t.framebufferRenderbuffer(t.FRAMEBUFFER, s, t.RENDERBUFFER, i), this._engine._bindUnboundFramebuffer(null);\n }\n /**\n * Binds a texture to this render target on a specific attachment\n * @param texture The texture to bind to the framebuffer\n * @param attachmentIndex Index of the attachment\n * @param faceIndexOrLayer The face or layer of the texture to render to in case of cube texture or array texture\n * @param lodLevel defines the lod level to bind to the frame buffer\n */\n _bindTextureRenderTarget(e, t = 0, i, r = 0) {\n var o, l;\n if (!e._hardwareTexture)\n return;\n const s = this._framebuffer, a = this._engine._currentFramebuffer;\n if (this._engine._bindUnboundFramebuffer(s), this._engine.webGLVersion > 1) {\n const c = this._context, h = c[\"COLOR_ATTACHMENT\" + t];\n e.is2DArray || e.is3D ? (i = i ?? ((o = this.layerIndices) == null ? void 0 : o[t]) ?? 0, c.framebufferTextureLayer(c.FRAMEBUFFER, h, e._hardwareTexture.underlyingResource, r, i)) : e.isCube ? (i = i ?? ((l = this.faceIndices) == null ? void 0 : l[t]) ?? 0, c.framebufferTexture2D(c.FRAMEBUFFER, h, c.TEXTURE_CUBE_MAP_POSITIVE_X + i, e._hardwareTexture.underlyingResource, r)) : c.framebufferTexture2D(c.FRAMEBUFFER, h, c.TEXTURE_2D, e._hardwareTexture.underlyingResource, r);\n } else {\n const c = this._context, h = c[\"COLOR_ATTACHMENT\" + t + \"_WEBGL\"], u = i !== void 0 ? c.TEXTURE_CUBE_MAP_POSITIVE_X + i : c.TEXTURE_2D;\n c.framebufferTexture2D(c.FRAMEBUFFER, h, u, e._hardwareTexture.underlyingResource, r);\n }\n this._engine._bindUnboundFramebuffer(a);\n }\n /**\n * Set a texture in the textures array\n * @param texture the texture to set\n * @param index the index in the textures array to set\n * @param disposePrevious If this function should dispose the previous texture\n */\n setTexture(e, t = 0, i = !0) {\n super.setTexture(e, t, i), this._bindTextureRenderTarget(e, t);\n }\n /**\n * Sets the layer and face indices of every render target texture\n * @param layers The layer of the texture to be set (make negative to not modify)\n * @param faces The face of the texture to be set (make negative to not modify)\n */\n setLayerAndFaceIndices(e, t) {\n var r;\n if (super.setLayerAndFaceIndices(e, t), !this.textures || !this.layerIndices || !this.faceIndices)\n return;\n const i = ((r = this._attachments) == null ? void 0 : r.length) ?? this.textures.length;\n for (let s = 0; s < i; s++) {\n const a = this.textures[s];\n a && (a.is2DArray || a.is3D ? this._bindTextureRenderTarget(a, s, this.layerIndices[s]) : a.isCube ? this._bindTextureRenderTarget(a, s, this.faceIndices[s]) : this._bindTextureRenderTarget(a, s));\n }\n }\n /**\n * Set the face and layer indices of a texture in the textures array\n * @param index The index of the texture in the textures array to modify\n * @param layer The layer of the texture to be set\n * @param face The face of the texture to be set\n */\n setLayerAndFaceIndex(e = 0, t, i) {\n if (super.setLayerAndFaceIndex(e, t, i), !this.textures || !this.layerIndices || !this.faceIndices)\n return;\n const r = this.textures[e];\n r.is2DArray || r.is3D ? this._bindTextureRenderTarget(this.textures[e], e, this.layerIndices[e]) : r.isCube && this._bindTextureRenderTarget(this.textures[e], e, this.faceIndices[e]);\n }\n dispose(e = this._disposeOnlyFramebuffers) {\n const t = this._context;\n e || (this._colorTextureArray && (this._context.deleteTexture(this._colorTextureArray), this._colorTextureArray = null), this._depthStencilTextureArray && (this._context.deleteTexture(this._depthStencilTextureArray), this._depthStencilTextureArray = null)), this._framebuffer && (t.deleteFramebuffer(this._framebuffer), this._framebuffer = null), this._depthStencilBuffer && (t.deleteRenderbuffer(this._depthStencilBuffer), this._depthStencilBuffer = null), this._MSAAFramebuffer && (t.deleteFramebuffer(this._MSAAFramebuffer), this._MSAAFramebuffer = null), super.dispose(e);\n }\n}\nDe.prototype._createHardwareRenderTargetWrapper = function(n, e, t) {\n const i = new dI(n, e, t, this, this._gl);\n return this._renderTargetWrapperCache.push(i), i;\n};\nDe.prototype.createRenderTargetTexture = function(n, e) {\n const t = this._createHardwareRenderTargetWrapper(!1, !1, n);\n let i = !0, r = !1, s = !1, a, o = 1, l;\n e !== void 0 && typeof e == \"object\" && (i = e.generateDepthBuffer ?? !0, r = !!e.generateStencilBuffer, s = !!e.noColorAttachment, a = e.colorAttachment, o = e.samples ?? 1, l = e.label);\n const c = a || (s ? null : this._createInternalTexture(n, e, !0, Dt.RenderTarget)), h = n.width || n, u = n.height || n, f = this._currentFramebuffer, d = this._gl, p = d.createFramebuffer();\n return this._bindUnboundFramebuffer(p), t._depthStencilBuffer = this._setupFramebufferDepthAttachments(r, i, h, u), c && !c.is2DArray && !c.is3D && d.framebufferTexture2D(d.FRAMEBUFFER, d.COLOR_ATTACHMENT0, d.TEXTURE_2D, c._hardwareTexture.underlyingResource, 0), this._bindUnboundFramebuffer(f), t.label = l ?? \"RenderTargetWrapper\", t._framebuffer = p, t._generateDepthBuffer = i, t._generateStencilBuffer = r, t.setTextures(c), this.updateRenderTargetTextureSampleCount(t, o), t;\n};\nDe.prototype.createDepthStencilTexture = function(n, e, t) {\n if (e.isCube) {\n const i = n.width || n;\n return this._createDepthStencilCubeTexture(i, e);\n } else\n return this._createDepthStencilTexture(n, e, t);\n};\nDe.prototype._createDepthStencilTexture = function(n, e) {\n const t = this._gl, i = n.layers || 0, r = n.depth || 0;\n let s = t.TEXTURE_2D;\n i !== 0 ? s = t.TEXTURE_2D_ARRAY : r !== 0 && (s = t.TEXTURE_3D);\n const a = new or(this, Dt.DepthStencil);\n if (a.label = e.label, !this._caps.depthTextureExtension)\n return ne.Error(\"Depth texture is not supported by your browser or hardware.\"), a;\n const o = {\n bilinearFiltering: !1,\n comparisonFunction: 0,\n generateStencil: !1,\n ...e\n };\n if (this._bindTextureDirectly(s, a, !0), this._setupDepthStencilTexture(a, n, o.generateStencil, o.comparisonFunction === 0 ? !1 : o.bilinearFiltering, o.comparisonFunction, o.samples), o.depthTextureFormat !== void 0) {\n if (o.depthTextureFormat !== 15 && o.depthTextureFormat !== 16 && o.depthTextureFormat !== 17 && o.depthTextureFormat !== 13 && o.depthTextureFormat !== 14 && o.depthTextureFormat !== 18)\n return ne.Error(\"Depth texture format is not supported.\"), a;\n a.format = o.depthTextureFormat;\n } else\n a.format = o.generateStencil ? 13 : 16;\n const l = a.format === 17 || a.format === 13 || a.format === 18;\n let c = t.UNSIGNED_INT;\n a.format === 15 ? c = t.UNSIGNED_SHORT : a.format === 17 || a.format === 13 ? c = t.UNSIGNED_INT_24_8 : a.format === 14 ? c = t.FLOAT : a.format === 18 && (c = t.FLOAT_32_UNSIGNED_INT_24_8_REV);\n const h = l ? t.DEPTH_STENCIL : t.DEPTH_COMPONENT;\n let u = h;\n return this.webGLVersion > 1 && (a.format === 15 ? u = t.DEPTH_COMPONENT16 : a.format === 16 ? u = t.DEPTH_COMPONENT24 : a.format === 17 || a.format === 13 ? u = t.DEPTH24_STENCIL8 : a.format === 14 ? u = t.DEPTH_COMPONENT32F : a.format === 18 && (u = t.DEPTH32F_STENCIL8)), a.is2DArray ? t.texImage3D(s, 0, u, a.width, a.height, i, 0, h, c, null) : a.is3D ? t.texImage3D(s, 0, u, a.width, a.height, r, 0, h, c, null) : t.texImage2D(s, 0, u, a.width, a.height, 0, h, c, null), this._bindTextureDirectly(s, null), this._internalTexturesCache.push(a), a;\n};\nDe.prototype.updateRenderTargetTextureSampleCount = function(n, e) {\n if (this.webGLVersion < 2 || !n || !n.texture)\n return 1;\n if (n.samples === e)\n return e;\n const t = this._gl;\n e = Math.min(e, this.getCaps().maxMSAASamples), n._depthStencilBuffer && (t.deleteRenderbuffer(n._depthStencilBuffer), n._depthStencilBuffer = null), n._MSAAFramebuffer && (t.deleteFramebuffer(n._MSAAFramebuffer), n._MSAAFramebuffer = null);\n const i = n.texture._hardwareTexture;\n if (i.releaseMSAARenderBuffers(), e > 1 && typeof t.renderbufferStorageMultisample == \"function\") {\n const r = t.createFramebuffer();\n if (!r)\n throw new Error(\"Unable to create multi sampled framebuffer\");\n n._MSAAFramebuffer = r, this._bindUnboundFramebuffer(n._MSAAFramebuffer);\n const s = this._createRenderBuffer(n.texture.width, n.texture.height, e, -1, this._getRGBABufferInternalSizedFormat(n.texture.type, n.texture.format, n.texture._useSRGBBuffer), t.COLOR_ATTACHMENT0, !1);\n if (!s)\n throw new Error(\"Unable to create multi sampled framebuffer\");\n i.addMSAARenderBuffer(s);\n } else\n this._bindUnboundFramebuffer(n._framebuffer);\n return n.texture.samples = e, n._samples = e, n._depthStencilBuffer = this._setupFramebufferDepthAttachments(n._generateStencilBuffer, n._generateDepthBuffer, n.texture.width, n.texture.height, e), this._bindUnboundFramebuffer(null), e;\n};\nDe.prototype.createRenderTargetCubeTexture = function(n, e) {\n const t = this._createHardwareRenderTargetWrapper(!1, !0, n), i = {\n generateMipMaps: !0,\n generateDepthBuffer: !0,\n generateStencilBuffer: !1,\n type: 0,\n samplingMode: 3,\n format: 5,\n ...e\n };\n i.generateStencilBuffer = i.generateDepthBuffer && i.generateStencilBuffer, (i.type === 1 && !this._caps.textureFloatLinearFiltering || i.type === 2 && !this._caps.textureHalfFloatLinearFiltering) && (i.samplingMode = 1);\n const r = this._gl, s = new or(this, Dt.RenderTarget);\n this._bindTextureDirectly(r.TEXTURE_CUBE_MAP, s, !0);\n const a = this._getSamplingParameters(i.samplingMode, i.generateMipMaps);\n i.type === 1 && !this._caps.textureFloat && (i.type = 0, ne.Warn(\"Float textures are not supported. Cube render target forced to TEXTURETYPE_UNESIGNED_BYTE type\")), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_MAG_FILTER, a.mag), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_MIN_FILTER, a.min), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_WRAP_S, r.CLAMP_TO_EDGE), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_WRAP_T, r.CLAMP_TO_EDGE);\n for (let l = 0; l < 6; l++)\n r.texImage2D(r.TEXTURE_CUBE_MAP_POSITIVE_X + l, 0, this._getRGBABufferInternalSizedFormat(i.type, i.format), n, n, 0, this._getInternalFormat(i.format), this._getWebGLTextureType(i.type), null);\n const o = r.createFramebuffer();\n return this._bindUnboundFramebuffer(o), t._depthStencilBuffer = this._setupFramebufferDepthAttachments(i.generateStencilBuffer, i.generateDepthBuffer, n, n), i.generateMipMaps && r.generateMipmap(r.TEXTURE_CUBE_MAP), this._bindTextureDirectly(r.TEXTURE_CUBE_MAP, null), this._bindUnboundFramebuffer(null), t._framebuffer = o, t._generateDepthBuffer = i.generateDepthBuffer, t._generateStencilBuffer = i.generateStencilBuffer, s.width = n, s.height = n, s.isReady = !0, s.isCube = !0, s.samples = 1, s.generateMipMaps = i.generateMipMaps, s.samplingMode = i.samplingMode, s.type = i.type, s.format = i.format, this._internalTexturesCache.push(s), t.setTextures(s), t;\n};\nconst pI = \"postprocessVertexShader\", gI = `attribute vec2 position;uniform vec2 scale;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5);\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvUV=(position*madd+madd)*scale;gl_Position=vec4(position,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[pI] = gI;\nconst Wh = {\n positions: [1, 1, -1, 1, -1, -1, 1, -1],\n indices: [0, 1, 2, 0, 2, 3]\n};\nclass c0 {\n /**\n * Creates an effect renderer\n * @param engine the engine to use for rendering\n * @param options defines the options of the effect renderer\n */\n constructor(e, t = Wh) {\n this._fullscreenViewport = new Eo(0, 0, 1, 1);\n const i = t.positions ?? Wh.positions, r = t.indices ?? Wh.indices;\n this.engine = e, this._vertexBuffers = {\n [I.PositionKind]: new I(e, i, I.PositionKind, !1, !1, 2)\n }, this._indexBuffer = e.createIndexBuffer(r), this._onContextRestoredObserver = e.onContextRestoredObservable.add(() => {\n this._indexBuffer = e.createIndexBuffer(r);\n for (const s in this._vertexBuffers)\n this._vertexBuffers[s]._rebuild();\n });\n }\n /**\n * Sets the current viewport in normalized coordinates 0-1\n * @param viewport Defines the viewport to set (defaults to 0 0 1 1)\n */\n setViewport(e = this._fullscreenViewport) {\n this.engine.setViewport(e);\n }\n /**\n * Binds the embedded attributes buffer to the effect.\n * @param effect Defines the effect to bind the attributes for\n */\n bindBuffers(e) {\n this.engine.bindBuffers(this._vertexBuffers, this._indexBuffer, e);\n }\n /**\n * Sets the current effect wrapper to use during draw.\n * The effect needs to be ready before calling this api.\n * This also sets the default full screen position attribute.\n * @param effectWrapper Defines the effect to draw with\n */\n applyEffectWrapper(e) {\n this.engine.setState(!0), this.engine.depthCullingState.depthTest = !1, this.engine.stencilState.stencilTest = !1, this.engine.enableEffect(e._drawWrapper), this.bindBuffers(e.effect), e.onApplyObservable.notifyObservers({});\n }\n /**\n * Saves engine states\n */\n saveStates() {\n this._savedStateDepthTest = this.engine.depthCullingState.depthTest, this._savedStateStencilTest = this.engine.stencilState.stencilTest;\n }\n /**\n * Restores engine states\n */\n restoreStates() {\n this.engine.depthCullingState.depthTest = this._savedStateDepthTest, this.engine.stencilState.stencilTest = this._savedStateStencilTest;\n }\n /**\n * Draws a full screen quad.\n */\n draw() {\n this.engine.drawElementsType(0, 0, 6);\n }\n _isRenderTargetTexture(e) {\n return e.renderTarget !== void 0;\n }\n /**\n * renders one or more effects to a specified texture\n * @param effectWrapper the effect to renderer\n * @param outputTexture texture to draw to, if null it will render to the screen.\n */\n render(e, t = null) {\n if (!e.effect.isReady())\n return;\n this.saveStates(), this.setViewport();\n const i = t === null ? null : this._isRenderTargetTexture(t) ? t.renderTarget : t;\n i && this.engine.bindFramebuffer(i), this.applyEffectWrapper(e), this.draw(), i && this.engine.unBindFramebuffer(i), this.restoreStates();\n }\n /**\n * Disposes of the effect renderer\n */\n dispose() {\n const e = this._vertexBuffers[I.PositionKind];\n e && (e.dispose(), delete this._vertexBuffers[I.PositionKind]), this._indexBuffer && this.engine._releaseBuffer(this._indexBuffer), this._onContextRestoredObserver && (this.engine.onContextRestoredObservable.remove(this._onContextRestoredObserver), this._onContextRestoredObserver = null);\n }\n}\nclass h0 {\n /**\n * The underlying effect\n */\n get effect() {\n return this._drawWrapper.effect;\n }\n set effect(e) {\n this._drawWrapper.effect = e;\n }\n /**\n * Creates an effect to be renderer\n * @param creationOptions options to create the effect\n */\n constructor(e) {\n this.onApplyObservable = new he();\n let t;\n const i = e.uniformNames || [];\n e.vertexShader ? t = {\n fragmentSource: e.fragmentShader,\n vertexSource: e.vertexShader,\n spectorName: e.name || \"effectWrapper\"\n } : (i.push(\"scale\"), t = {\n fragmentSource: e.fragmentShader,\n vertex: \"postprocess\",\n spectorName: e.name || \"effectWrapper\"\n }, this.onApplyObservable.add(() => {\n this.effect.setFloat2(\"scale\", 1, 1);\n }));\n const r = e.defines ? e.defines.join(`\n`) : \"\";\n this._drawWrapper = new ka(e.engine), e.useShaderStore ? (t.fragment = t.fragmentSource, t.vertex || (t.vertex = t.vertexSource), delete t.fragmentSource, delete t.vertexSource, this.effect = e.engine.createEffect(t, e.attributeNames || [\"position\"], i, e.samplerNames, r, void 0, e.onCompiled, void 0, void 0, e.shaderLanguage)) : (this.effect = new Hi(t, e.attributeNames || [\"position\"], i, e.samplerNames, e.engine, r, void 0, e.onCompiled, void 0, void 0, void 0, e.shaderLanguage), this._onContextRestoredObserver = e.engine.onContextRestoredObservable.add(() => {\n this.effect._pipelineContext = null, this.effect._prepareEffect();\n }));\n }\n /**\n * Disposes of the effect wrapper\n */\n dispose() {\n this._onContextRestoredObserver && (this.effect.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver), this._onContextRestoredObserver = null), this.effect.dispose();\n }\n}\nconst u0 = \"passPixelShader\", f0 = `varying vec2 vUV;uniform sampler2D textureSampler;\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) \n{gl_FragColor=texture2D(textureSampler,vUV);}`;\nY.ShadersStore[u0] = f0;\nconst dg = { name: u0, shader: f0 };\nclass Ni {\n static _CreateDumpRenderer() {\n if (!Ni._DumpToolsEngine) {\n let e, t = null;\n const i = {\n preserveDrawingBuffer: !0,\n depth: !1,\n stencil: !1,\n alpha: !0,\n premultipliedAlpha: !1,\n antialias: !1,\n failIfMajorPerformanceCaveat: !1\n };\n try {\n e = new OffscreenCanvas(100, 100), t = new De(e, !1, i);\n } catch {\n e = document.createElement(\"canvas\"), t = new De(e, !1, i);\n }\n t.getCaps().parallelShaderCompile = void 0;\n const r = new c0(t), s = new h0({\n engine: t,\n name: dg.name,\n fragmentShader: dg.shader,\n samplerNames: [\"textureSampler\"]\n });\n Ni._DumpToolsEngine = {\n canvas: e,\n engine: t,\n renderer: r,\n wrapper: s\n };\n }\n return Ni._DumpToolsEngine;\n }\n /**\n * Dumps the current bound framebuffer\n * @param width defines the rendering width\n * @param height defines the rendering height\n * @param engine defines the hosting engine\n * @param successCallback defines the callback triggered once the data are available\n * @param mimeType defines the mime type of the result\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n * @returns a void promise\n */\n static async DumpFramebuffer(e, t, i, r, s = \"image/png\", a, o) {\n const l = await i.readPixels(0, 0, e, t), c = new Uint8Array(l.buffer);\n Ni.DumpData(e, t, c, r, s, a, !0, void 0, o);\n }\n /**\n * Dumps an array buffer\n * @param width defines the rendering width\n * @param height defines the rendering height\n * @param data the data array\n * @param mimeType defines the mime type of the result\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\n * @param invertY true to invert the picture in the Y dimension\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n * @returns a promise that resolve to the final data\n */\n static DumpDataAsync(e, t, i, r = \"image/png\", s, a = !1, o = !1, l) {\n return new Promise((c) => {\n Ni.DumpData(e, t, i, (h) => c(h), r, s, a, o, l);\n });\n }\n /**\n * Dumps an array buffer\n * @param width defines the rendering width\n * @param height defines the rendering height\n * @param data the data array\n * @param successCallback defines the callback triggered once the data are available\n * @param mimeType defines the mime type of the result\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\n * @param invertY true to invert the picture in the Y dimension\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\n */\n static DumpData(e, t, i, r, s = \"image/png\", a, o = !1, l = !1, c) {\n const h = Ni._CreateDumpRenderer();\n if (h.engine.setSize(e, t, !0), i instanceof Float32Array) {\n const f = new Uint8Array(i.length);\n let d = i.length;\n for (; d--; ) {\n const p = i[d];\n f[d] = Math.round(je.Clamp(p) * 255);\n }\n i = f;\n }\n const u = h.engine.createRawTexture(i, e, t, 5, !1, !o, 1);\n h.renderer.setViewport(), h.renderer.applyEffectWrapper(h.wrapper), h.wrapper.effect._bindTexture(\"textureSampler\", u), h.renderer.draw(), l ? ge.ToBlob(h.canvas, (f) => {\n const d = new FileReader();\n d.onload = (p) => {\n const g = p.target.result;\n r && r(g);\n }, d.readAsArrayBuffer(f);\n }, s, c) : ge.EncodeScreenshotCanvasData(h.canvas, r, s, a, c), u.dispose();\n }\n /**\n * Dispose the dump tools associated resources\n */\n static Dispose() {\n Ni._DumpToolsEngine && (Ni._DumpToolsEngine.wrapper.dispose(), Ni._DumpToolsEngine.renderer.dispose(), Ni._DumpToolsEngine.engine.dispose()), Ni._DumpToolsEngine = null;\n }\n}\nconst mI = () => {\n ge.DumpData = Ni.DumpData, ge.DumpDataAsync = Ni.DumpDataAsync, ge.DumpFramebuffer = Ni.DumpFramebuffer;\n};\nmI();\nclass gr extends le {\n /**\n * Use this list to define the list of mesh you want to render.\n */\n get renderList() {\n return this._renderList;\n }\n set renderList(e) {\n this._unObserveRenderList && (this._unObserveRenderList(), this._unObserveRenderList = null), e && (this._unObserveRenderList = z_(e, this._renderListHasChanged)), this._renderList = e;\n }\n /**\n * Post-processes for this render target\n */\n get postProcesses() {\n return this._postProcesses;\n }\n get _prePassEnabled() {\n return !!this._prePassRenderTarget && this._prePassRenderTarget.enabled;\n }\n /**\n * Set a after unbind callback in the texture.\n * This has been kept for backward compatibility and use of onAfterUnbindObservable is recommended.\n */\n set onAfterUnbind(e) {\n this._onAfterUnbindObserver && this.onAfterUnbindObservable.remove(this._onAfterUnbindObserver), this._onAfterUnbindObserver = this.onAfterUnbindObservable.add(e);\n }\n /**\n * Set a before render callback in the texture.\n * This has been kept for backward compatibility and use of onBeforeRenderObservable is recommended.\n */\n set onBeforeRender(e) {\n this._onBeforeRenderObserver && this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver), this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(e);\n }\n /**\n * Set a after render callback in the texture.\n * This has been kept for backward compatibility and use of onAfterRenderObservable is recommended.\n */\n set onAfterRender(e) {\n this._onAfterRenderObserver && this.onAfterRenderObservable.remove(this._onAfterRenderObserver), this._onAfterRenderObserver = this.onAfterRenderObservable.add(e);\n }\n /**\n * Set a clear callback in the texture.\n * This has been kept for backward compatibility and use of onClearObservable is recommended.\n */\n set onClear(e) {\n this._onClearObserver && this.onClearObservable.remove(this._onClearObserver), this._onClearObserver = this.onClearObservable.add(e);\n }\n /**\n * Gets the render pass ids used by the render target texture. For a single render target the array length will be 1, for a cube texture it will be 6 and for\n * a 2D texture array it will return an array of ids the size of the 2D texture array\n */\n get renderPassIds() {\n return this._renderPassIds;\n }\n /**\n * Gets the current value of the refreshId counter\n */\n get currentRefreshId() {\n return this._currentRefreshId;\n }\n /**\n * Sets a specific material to be used to render a mesh/a list of meshes in this render target texture\n * @param mesh mesh or array of meshes\n * @param material material or array of materials to use for this render pass. If undefined is passed, no specific material will be used but the regular material instead (mesh.material). It's possible to provide an array of materials to use a different material for each rendering in the case of a cube texture (6 rendering) and a 2D texture array (as many rendering as the length of the array)\n */\n setMaterialForRendering(e, t) {\n let i;\n Array.isArray(e) ? i = e : i = [e];\n for (let r = 0; r < i.length; ++r)\n for (let s = 0; s < this._renderPassIds.length; ++s)\n i[r].setMaterialForRenderPass(this._renderPassIds[s], t !== void 0 ? Array.isArray(t) ? t[s] : t : void 0);\n }\n /**\n * Define if the texture has multiple draw buffers or if false a single draw buffer.\n */\n get isMulti() {\n var e;\n return ((e = this._renderTarget) == null ? void 0 : e.isMulti) ?? !1;\n }\n /**\n * Gets render target creation options that were used.\n */\n get renderTargetOptions() {\n return this._renderTargetOptions;\n }\n /**\n * Gets the render target wrapper associated with this render target\n */\n get renderTarget() {\n return this._renderTarget;\n }\n _onRatioRescale() {\n this._sizeRatio && this.resize(this._initialSizeParameter);\n }\n /**\n * Gets or sets the size of the bounding box associated with the texture (when in cube mode)\n * When defined, the cubemap will switch to local mode\n * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity\n * @example https://www.babylonjs-playground.com/#RNASML\n */\n set boundingBoxSize(e) {\n if (this._boundingBoxSize && this._boundingBoxSize.equals(e))\n return;\n this._boundingBoxSize = e;\n const t = this.getScene();\n t && t.markAllMaterialsAsDirty(1);\n }\n get boundingBoxSize() {\n return this._boundingBoxSize;\n }\n /**\n * In case the RTT has been created with a depth texture, get the associated\n * depth texture.\n * Otherwise, return null.\n */\n get depthStencilTexture() {\n var e;\n return ((e = this._renderTarget) == null ? void 0 : e._depthStencilTexture) ?? null;\n }\n /** @internal */\n constructor(e, t, i, r = !1, s = !0, a = 0, o = !1, l = le.TRILINEAR_SAMPLINGMODE, c = !0, h = !1, u = !1, f = 5, d = !1, p, g, m = !1, v = !1) {\n let E, C = !0;\n if (typeof r == \"object\") {\n const R = r;\n r = !!R.generateMipMaps, s = R.doNotChangeAspectRatio ?? !0, a = R.type ?? 0, o = !!R.isCube, l = R.samplingMode ?? le.TRILINEAR_SAMPLINGMODE, c = R.generateDepthBuffer ?? !0, h = !!R.generateStencilBuffer, u = !!R.isMulti, f = R.format ?? 5, d = !!R.delayAllocation, p = R.samples, g = R.creationFlags, m = !!R.noColorAttachment, v = !!R.useSRGBBuffer, E = R.colorAttachment, C = R.gammaSpace ?? C;\n }\n if (super(null, i, !r, void 0, l, void 0, void 0, void 0, void 0, f), this._unObserveRenderList = null, this._renderListHasChanged = (R, x) => {\n var M;\n const S = this._renderList ? this._renderList.length : 0;\n (x === 0 && S > 0 || S === 0) && ((M = this.getScene()) == null || M.meshes.forEach((N) => {\n N._markSubMeshesAsLightDirty();\n }));\n }, this.renderParticles = !0, this.renderSprites = !1, this.forceLayerMaskCheck = !1, this.ignoreCameraViewport = !1, this.onBeforeBindObservable = new he(), this.onAfterUnbindObservable = new he(), this.onBeforeRenderObservable = new he(), this.onAfterRenderObservable = new he(), this.onClearObservable = new he(), this.onResizeObservable = new he(), this._cleared = !1, this.skipInitialClear = !1, this._currentRefreshId = -1, this._refreshRate = 1, this._samples = 1, this._canRescale = !0, this._renderTarget = null, this.boundingBoxPosition = _.Zero(), i = this.getScene(), !i)\n return;\n const T = this.getScene().getEngine();\n this._gammaSpace = C, this._coordinatesMode = le.PROJECTION_MODE, this.renderList = [], this.name = e, this.isRenderTarget = !0, this._initialSizeParameter = t, this._renderPassIds = [], this._isCubeData = o, this._processSizeParameter(t), this.renderPassId = this._renderPassIds[0], this._resizeObserver = T.onResizeObservable.add(() => {\n }), this._generateMipMaps = !!r, this._doNotChangeAspectRatio = s, this._renderingManager = new Di(i), this._renderingManager._useSceneAutoClearSetup = !0, !u && (this._renderTargetOptions = {\n generateMipMaps: r,\n type: a,\n format: this._format ?? void 0,\n samplingMode: this.samplingMode,\n generateDepthBuffer: c,\n generateStencilBuffer: h,\n samples: p,\n creationFlags: g,\n noColorAttachment: m,\n useSRGBBuffer: v,\n colorAttachment: E,\n label: this.name\n }, this.samplingMode === le.NEAREST_SAMPLINGMODE && (this.wrapU = le.CLAMP_ADDRESSMODE, this.wrapV = le.CLAMP_ADDRESSMODE), d || (o ? (this._renderTarget = i.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions), this.coordinatesMode = le.INVCUBIC_MODE, this._textureMatrix = L.Identity()) : this._renderTarget = i.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions), this._texture = this._renderTarget.texture, p !== void 0 && (this.samples = p)));\n }\n /**\n * Creates a depth stencil texture.\n * This is only available in WebGL 2 or with the depth texture extension available.\n * @param comparisonFunction Specifies the comparison function to set on the texture. If 0 or undefined, the texture is not in comparison mode (default: 0)\n * @param bilinearFiltering Specifies whether or not bilinear filtering is enable on the texture (default: true)\n * @param generateStencil Specifies whether or not a stencil should be allocated in the texture (default: false)\n * @param samples sample count of the depth/stencil texture (default: 1)\n * @param format format of the depth texture (default: 14)\n */\n createDepthStencilTexture(e = 0, t = !0, i = !1, r = 1, s = 14) {\n var a;\n (a = this._renderTarget) == null || a.createDepthStencilTexture(e, t, i, r, s);\n }\n _releaseRenderPassId() {\n if (this._scene) {\n const e = this._scene.getEngine();\n for (let t = 0; t < this._renderPassIds.length; ++t)\n e.releaseRenderPassId(this._renderPassIds[t]);\n }\n this._renderPassIds = [];\n }\n _createRenderPassId() {\n this._releaseRenderPassId();\n const e = this._scene.getEngine(), t = this._isCubeData ? 6 : this.getRenderLayers() || 1;\n for (let i = 0; i < t; ++i)\n this._renderPassIds[i] = e.createRenderPassId(`RenderTargetTexture - ${this.name}#${i}`);\n }\n _processSizeParameter(e, t = !0) {\n if (e.ratio) {\n this._sizeRatio = e.ratio;\n const i = this._getEngine();\n this._size = {\n width: this._bestReflectionRenderTargetDimension(i.getRenderWidth(), this._sizeRatio),\n height: this._bestReflectionRenderTargetDimension(i.getRenderHeight(), this._sizeRatio)\n };\n } else\n this._size = e;\n t && this._createRenderPassId();\n }\n /**\n * Define the number of samples to use in case of MSAA.\n * It defaults to one meaning no MSAA has been enabled.\n */\n get samples() {\n var e;\n return ((e = this._renderTarget) == null ? void 0 : e.samples) ?? this._samples;\n }\n set samples(e) {\n this._renderTarget && (this._samples = this._renderTarget.setSamples(e));\n }\n /**\n * Resets the refresh counter of the texture and start bak from scratch.\n * Could be useful to regenerate the texture if it is setup to render only once.\n */\n resetRefreshCounter() {\n this._currentRefreshId = -1;\n }\n /**\n * Define the refresh rate of the texture or the rendering frequency.\n * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...\n */\n get refreshRate() {\n return this._refreshRate;\n }\n set refreshRate(e) {\n this._refreshRate = e, this.resetRefreshCounter();\n }\n /**\n * Adds a post process to the render target rendering passes.\n * @param postProcess define the post process to add\n */\n addPostProcess(e) {\n if (!this._postProcessManager) {\n const t = this.getScene();\n if (!t)\n return;\n this._postProcessManager = new mu(t), this._postProcesses = new Array();\n }\n this._postProcesses.push(e), this._postProcesses[0].autoClear = !1;\n }\n /**\n * Clear all the post processes attached to the render target\n * @param dispose define if the cleared post processes should also be disposed (false by default)\n */\n clearPostProcesses(e = !1) {\n if (this._postProcesses) {\n if (e)\n for (const t of this._postProcesses)\n t.dispose();\n this._postProcesses = [];\n }\n }\n /**\n * Remove one of the post process from the list of attached post processes to the texture\n * @param postProcess define the post process to remove from the list\n */\n removePostProcess(e) {\n if (!this._postProcesses)\n return;\n const t = this._postProcesses.indexOf(e);\n t !== -1 && (this._postProcesses.splice(t, 1), this._postProcesses.length > 0 && (this._postProcesses[0].autoClear = !1));\n }\n /** @internal */\n _shouldRender() {\n return this._currentRefreshId === -1 ? (this._currentRefreshId = 1, !0) : this.refreshRate === this._currentRefreshId ? (this._currentRefreshId = 1, !0) : (this._currentRefreshId++, !1);\n }\n /**\n * Gets the actual render size of the texture.\n * @returns the width of the render size\n */\n getRenderSize() {\n return this.getRenderWidth();\n }\n /**\n * Gets the actual render width of the texture.\n * @returns the width of the render size\n */\n getRenderWidth() {\n return this._size.width ? this._size.width : this._size;\n }\n /**\n * Gets the actual render height of the texture.\n * @returns the height of the render size\n */\n getRenderHeight() {\n return this._size.width ? this._size.height : this._size;\n }\n /**\n * Gets the actual number of layers of the texture or, in the case of a 3D texture, return the depth.\n * @returns the number of layers\n */\n getRenderLayers() {\n const e = this._size.layers;\n if (e)\n return e;\n const t = this._size.depth;\n return t || 0;\n }\n /**\n * Don't allow this render target texture to rescale. Mainly used to prevent rescaling by the scene optimizer.\n */\n disableRescaling() {\n this._canRescale = !1;\n }\n /**\n * Get if the texture can be rescaled or not.\n */\n get canRescale() {\n return this._canRescale;\n }\n /**\n * Resize the texture using a ratio.\n * @param ratio the ratio to apply to the texture size in order to compute the new target size\n */\n scale(e) {\n const t = Math.max(1, this.getRenderSize() * e);\n this.resize(t);\n }\n /**\n * Get the texture reflection matrix used to rotate/transform the reflection.\n * @returns the reflection matrix\n */\n getReflectionTextureMatrix() {\n return this.isCube ? this._textureMatrix : super.getReflectionTextureMatrix();\n }\n /**\n * Resize the texture to a new desired size.\n * Be careful as it will recreate all the data in the new texture.\n * @param size Define the new size. It can be:\n * - a number for squared texture,\n * - an object containing { width: number, height: number }\n * - or an object containing a ratio { ratio: number }\n */\n resize(e) {\n var r;\n const t = this.isCube;\n (r = this._renderTarget) == null || r.dispose(), this._renderTarget = null;\n const i = this.getScene();\n i && (this._processSizeParameter(e, !1), t ? this._renderTarget = i.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions) : this._renderTarget = i.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions), this._texture = this._renderTarget.texture, this._renderTargetOptions.samples !== void 0 && (this.samples = this._renderTargetOptions.samples), this.onResizeObservable.hasObservers() && this.onResizeObservable.notifyObservers(this));\n }\n /**\n * Renders all the objects from the render list into the texture.\n * @param useCameraPostProcess Define if camera post processes should be used during the rendering\n * @param dumpForDebug Define if the rendering result should be dumped (copied) for debugging purpose\n */\n render(e = !1, t = !1) {\n this._render(e, t);\n }\n /**\n * This function will check if the render target texture can be rendered (textures are loaded, shaders are compiled)\n * @returns true if all required resources are ready\n */\n isReadyForRendering() {\n return this._render(!1, !1, !0);\n }\n _render(e = !1, t = !1, i = !1) {\n const r = this.getScene();\n if (!r)\n return i;\n const s = r.getEngine();\n if (this.useCameraPostProcesses !== void 0 && (e = this.useCameraPostProcesses), this._waitingRenderList) {\n if (!this.renderListPredicate) {\n this.renderList = [];\n for (let h = 0; h < this._waitingRenderList.length; h++) {\n const u = this._waitingRenderList[h], f = r.getMeshById(u);\n f && this.renderList.push(f);\n }\n }\n this._waitingRenderList = void 0;\n }\n if (this.renderListPredicate) {\n this.renderList ? this.renderList.length = 0 : this.renderList = [];\n const h = this.getScene();\n if (!h)\n return i;\n const u = h.meshes;\n for (let f = 0; f < u.length; f++) {\n const d = u[f];\n this.renderListPredicate(d) && this.renderList.push(d);\n }\n }\n const a = s.currentRenderPassId;\n this.onBeforeBindObservable.notifyObservers(this);\n const o = this.activeCamera ?? r.activeCamera, l = r.activeCamera;\n o && (o !== r.activeCamera && (r.setTransformMatrix(o.getViewMatrix(), o.getProjectionMatrix(!0)), r.activeCamera = o), s.setViewport(o.rigParent ? o.rigParent.viewport : o.viewport, this.getRenderWidth(), this.getRenderHeight())), this._defaultRenderListPrepared = !1;\n let c = i;\n if (i) {\n r.getViewMatrix() || r.updateTransformMatrix();\n const h = this.is2DArray || this.is3D ? this.getRenderLayers() : this.isCube ? 6 : 1;\n for (let u = 0; u < h && c; u++) {\n let f = null;\n const d = this.renderList ? this.renderList : r.getActiveMeshes().data, p = this.renderList ? this.renderList.length : r.getActiveMeshes().length;\n s.currentRenderPassId = this._renderPassIds[u], this.onBeforeRenderObservable.notifyObservers(u), this.getCustomRenderList && (f = this.getCustomRenderList(u, d, p)), f || (f = d), this._doNotChangeAspectRatio || r.updateTransformMatrix(!0);\n for (let g = 0; g < f.length && c; ++g) {\n const m = f[g];\n if (!(!m.isEnabled() || m.isBlocked || !m.isVisible || !m.subMeshes)) {\n if (this.customIsReadyFunction) {\n if (!this.customIsReadyFunction(m, this.refreshRate, i)) {\n c = !1;\n continue;\n }\n } else if (!m.isReady(!0)) {\n c = !1;\n continue;\n }\n }\n }\n this.onAfterRenderObservable.notifyObservers(u), (this.is2DArray || this.is3D || this.isCube) && (r.incrementRenderId(), r.resetCachedMaterial());\n }\n } else if ((this.is2DArray || this.is3D) && !this.isMulti)\n for (let h = 0; h < this.getRenderLayers(); h++)\n this._renderToTarget(0, e, t, h, o), r.incrementRenderId(), r.resetCachedMaterial();\n else if (this.isCube && !this.isMulti)\n for (let h = 0; h < 6; h++)\n this._renderToTarget(h, e, t, void 0, o), r.incrementRenderId(), r.resetCachedMaterial();\n else\n this._renderToTarget(0, e, t, void 0, o);\n return this.onAfterUnbindObservable.notifyObservers(this), s.currentRenderPassId = a, l && (r.activeCamera = l, this.activeCamera && this.activeCamera !== r.activeCamera && r.setTransformMatrix(r.activeCamera.getViewMatrix(), r.activeCamera.getProjectionMatrix(!0)), s.setViewport(r.activeCamera.viewport)), r.resetCachedMaterial(), c;\n }\n _bestReflectionRenderTargetDimension(e, t) {\n const r = e * t, s = se.NearestPOT(r + 128 * 128 / (128 + r));\n return Math.min(se.FloorPOT(e), s);\n }\n _prepareRenderingManager(e, t, i, r) {\n const s = this.getScene();\n if (!s)\n return;\n this._renderingManager.reset();\n const a = s.getRenderId();\n for (let o = 0; o < t; o++) {\n const l = e[o];\n if (l && !l.isBlocked) {\n if (this.customIsReadyFunction) {\n if (!this.customIsReadyFunction(l, this.refreshRate, !1)) {\n this.resetRefreshCounter();\n continue;\n }\n } else if (!l.isReady(this.refreshRate === 0)) {\n this.resetRefreshCounter();\n continue;\n }\n if (!l._internalAbstractMeshDataInfo._currentLODIsUpToDate && s.activeCamera && (l._internalAbstractMeshDataInfo._currentLOD = s.customLODSelector ? s.customLODSelector(l, this.activeCamera || s.activeCamera) : l.getLOD(this.activeCamera || s.activeCamera), l._internalAbstractMeshDataInfo._currentLODIsUpToDate = !0), !l._internalAbstractMeshDataInfo._currentLOD)\n continue;\n let c = l._internalAbstractMeshDataInfo._currentLOD;\n c._preActivateForIntermediateRendering(a);\n let h;\n if (r && i ? h = (l.layerMask & i.layerMask) === 0 : h = !1, l.isEnabled() && l.isVisible && l.subMeshes && !h && (c !== l && c._activate(a, !0), l._activate(a, !0) && l.subMeshes.length)) {\n l.isAnInstance ? l._internalAbstractMeshDataInfo._actAsRegularMesh && (c = l) : c._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = !1, c._internalAbstractMeshDataInfo._isActiveIntermediate = !0;\n for (let u = 0; u < c.subMeshes.length; u++) {\n const f = c.subMeshes[u];\n this._renderingManager.dispatch(f, c);\n }\n }\n }\n }\n for (let o = 0; o < s.particleSystems.length; o++) {\n const l = s.particleSystems[o], c = l.emitter;\n !l.isStarted() || !c || c.position && !c.isEnabled() || this._renderingManager.dispatchParticles(l);\n }\n }\n /**\n * @internal\n * @param faceIndex face index to bind to if this is a cubetexture\n * @param layer defines the index of the texture to bind in the array\n */\n _bindFrameBuffer(e = 0, t = 0) {\n const i = this.getScene();\n if (!i)\n return;\n const r = i.getEngine();\n this._renderTarget && r.bindFramebuffer(this._renderTarget, this.isCube ? e : void 0, void 0, void 0, this.ignoreCameraViewport, 0, t);\n }\n _unbindFrameBuffer(e, t) {\n this._renderTarget && e.unBindFramebuffer(this._renderTarget, this.isCube, () => {\n this.onAfterRenderObservable.notifyObservers(t);\n });\n }\n /**\n * @internal\n */\n _prepareFrame(e, t, i, r) {\n this._postProcessManager ? this._prePassEnabled || this._postProcessManager._prepareFrame(this._texture, this._postProcesses) : (!r || !e.postProcessManager._prepareFrame(this._texture)) && this._bindFrameBuffer(t, i);\n }\n _renderToTarget(e, t, i, r = 0, s = null) {\n var c, h, u;\n const a = this.getScene();\n if (!a)\n return;\n const o = a.getEngine();\n if ((c = o._debugPushGroup) == null || c.call(o, `render to face #${e} layer #${r}`, 1), this._prepareFrame(a, e, r, t), this.is2DArray || this.is3D ? (o.currentRenderPassId = this._renderPassIds[r], this.onBeforeRenderObservable.notifyObservers(r)) : (o.currentRenderPassId = this._renderPassIds[e], this.onBeforeRenderObservable.notifyObservers(e)), o.snapshotRendering && o.snapshotRenderingMode === 1)\n this.onClearObservable.hasObservers() ? this.onClearObservable.notifyObservers(o) : this.skipInitialClear || o.clear(this.clearColor || a.clearColor, !0, !0, !0);\n else {\n let f = null;\n const d = this.renderList ? this.renderList : a.getActiveMeshes().data, p = this.renderList ? this.renderList.length : a.getActiveMeshes().length;\n this.getCustomRenderList && (f = this.getCustomRenderList(this.is2DArray || this.is3D ? r : e, d, p)), f ? this._prepareRenderingManager(f, f.length, s, this.forceLayerMaskCheck) : (this._defaultRenderListPrepared || (this._prepareRenderingManager(d, p, s, !this.renderList || this.forceLayerMaskCheck), this._defaultRenderListPrepared = !0), f = d);\n for (const m of a._beforeRenderTargetClearStage)\n m.action(this, e, r);\n this.onClearObservable.hasObservers() ? this.onClearObservable.notifyObservers(o) : this.skipInitialClear || o.clear(this.clearColor || a.clearColor, !0, !0, !0), this._doNotChangeAspectRatio || a.updateTransformMatrix(!0);\n for (const m of a._beforeRenderTargetDrawStage)\n m.action(this, e, r);\n this._renderingManager.render(this.customRenderFunction, f, this.renderParticles, this.renderSprites);\n for (const m of a._afterRenderTargetDrawStage)\n m.action(this, e, r);\n const g = ((h = this._texture) == null ? void 0 : h.generateMipMaps) ?? !1;\n this._texture && (this._texture.generateMipMaps = !1), this._postProcessManager ? this._postProcessManager._finalizeFrame(!1, this._renderTarget ?? void 0, e, this._postProcesses, this.ignoreCameraViewport) : t && a.postProcessManager._finalizeFrame(!1, this._renderTarget ?? void 0, e);\n for (const m of a._afterRenderTargetPostProcessStage)\n m.action(this, e, r);\n this._texture && (this._texture.generateMipMaps = g), this._doNotChangeAspectRatio || a.updateTransformMatrix(!0), i && Ni.DumpFramebuffer(this.getRenderWidth(), this.getRenderHeight(), o);\n }\n this._unbindFrameBuffer(o, e), this._texture && this.isCube && e === 5 && o.generateMipMapsForCubemap(this._texture), (u = o._debugPopGroup) == null || u.call(o, 1);\n }\n /**\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\n * This allowed control for front to back rendering or reversely depending of the special needs.\n *\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\n */\n setRenderingOrder(e, t = null, i = null, r = null) {\n this._renderingManager.setRenderingOrder(e, t, i, r);\n }\n /**\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\n *\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\n */\n setRenderingAutoClearDepthStencil(e, t) {\n this._renderingManager.setRenderingAutoClearDepthStencil(e, t), this._renderingManager._useSceneAutoClearSetup = !1;\n }\n /**\n * Clones the texture.\n * @returns the cloned texture\n */\n clone() {\n const e = this.getSize(), t = new gr(this.name, e, this.getScene(), this._renderTargetOptions.generateMipMaps, this._doNotChangeAspectRatio, this._renderTargetOptions.type, this.isCube, this._renderTargetOptions.samplingMode, this._renderTargetOptions.generateDepthBuffer, this._renderTargetOptions.generateStencilBuffer, void 0, this._renderTargetOptions.format, void 0, this._renderTargetOptions.samples);\n return t.hasAlpha = this.hasAlpha, t.level = this.level, t.coordinatesMode = this.coordinatesMode, this.renderList && (t.renderList = this.renderList.slice(0)), t;\n }\n /**\n * Serialize the texture to a JSON representation we can easily use in the respective Parse function.\n * @returns The JSON representation of the texture\n */\n serialize() {\n if (!this.name)\n return null;\n const e = super.serialize();\n if (e.renderTargetSize = this.getRenderSize(), e.renderList = [], this.renderList)\n for (let t = 0; t < this.renderList.length; t++)\n e.renderList.push(this.renderList[t].id);\n return e;\n }\n /**\n * This will remove the attached framebuffer objects. The texture will not be able to be used as render target anymore\n */\n disposeFramebufferObjects() {\n var e;\n (e = this._renderTarget) == null || e.dispose(!0);\n }\n /**\n * Release and destroy the underlying lower level texture aka internalTexture.\n */\n releaseInternalTexture() {\n var e;\n (e = this._renderTarget) == null || e.releaseTextures(), this._texture = null;\n }\n /**\n * Dispose the texture and release its associated resources.\n */\n dispose() {\n var i;\n this.onResizeObservable.clear(), this.onClearObservable.clear(), this.onAfterRenderObservable.clear(), this.onAfterUnbindObservable.clear(), this.onBeforeBindObservable.clear(), this.onBeforeRenderObservable.clear(), this._postProcessManager && (this._postProcessManager.dispose(), this._postProcessManager = null), this._prePassRenderTarget && this._prePassRenderTarget.dispose(), this._releaseRenderPassId(), this.clearPostProcesses(!0), this._resizeObserver && (this.getScene().getEngine().onResizeObservable.remove(this._resizeObserver), this._resizeObserver = null), this.renderList = null;\n const e = this.getScene();\n if (!e)\n return;\n let t = e.customRenderTargets.indexOf(this);\n t >= 0 && e.customRenderTargets.splice(t, 1);\n for (const r of e.cameras)\n t = r.customRenderTargets.indexOf(this), t >= 0 && r.customRenderTargets.splice(t, 1);\n (i = this._renderTarget) == null || i.dispose(), this._renderTarget = null, this._texture = null, super.dispose();\n }\n /** @internal */\n _rebuild() {\n this.refreshRate === gr.REFRESHRATE_RENDER_ONCE && (this.refreshRate = gr.REFRESHRATE_RENDER_ONCE), this._postProcessManager && this._postProcessManager._rebuild();\n }\n /**\n * Clear the info related to rendering groups preventing retention point in material dispose.\n */\n freeRenderingGroups() {\n this._renderingManager && this._renderingManager.freeRenderingGroups();\n }\n /**\n * Gets the number of views the corresponding to the texture (eg. a MultiviewRenderTarget will have > 1)\n * @returns the view count\n */\n getViewCount() {\n return 1;\n }\n}\ngr.REFRESHRATE_RENDER_ONCE = 0;\ngr.REFRESHRATE_RENDER_ONEVERYFRAME = 1;\ngr.REFRESHRATE_RENDER_ONEVERYTWOFRAMES = 2;\nle._CreateRenderTargetTexture = (n, e, t, i, r) => new gr(n, e, t, i);\nclass Pt {\n /**\n * Registers a shader code processing with a post process name.\n * @param postProcessName name of the post process. Use null for the fallback shader code processing. This is the shader code processing that will be used in case no specific shader code processing has been associated to a post process name\n * @param customShaderCodeProcessing shader code processing to associate to the post process name\n */\n static RegisterShaderCodeProcessing(e, t) {\n if (!t) {\n delete Pt._CustomShaderCodeProcessing[e ?? \"\"];\n return;\n }\n Pt._CustomShaderCodeProcessing[e ?? \"\"] = t;\n }\n static _GetShaderCodeProcessing(e) {\n return Pt._CustomShaderCodeProcessing[e] ?? Pt._CustomShaderCodeProcessing[\"\"];\n }\n /**\n * Number of sample textures (default: 1)\n */\n get samples() {\n return this._samples;\n }\n set samples(e) {\n this._samples = Math.min(e, this._engine.getCaps().maxMSAASamples), this._textures.forEach((t) => {\n t.setSamples(this._samples);\n });\n }\n /**\n * Returns the fragment url or shader name used in the post process.\n * @returns the fragment url or name in the shader store.\n */\n getEffectName() {\n return this._fragmentUrl;\n }\n /**\n * A function that is added to the onActivateObservable\n */\n set onActivate(e) {\n this._onActivateObserver && this.onActivateObservable.remove(this._onActivateObserver), e && (this._onActivateObserver = this.onActivateObservable.add(e));\n }\n /**\n * A function that is added to the onSizeChangedObservable\n */\n set onSizeChanged(e) {\n this._onSizeChangedObserver && this.onSizeChangedObservable.remove(this._onSizeChangedObserver), this._onSizeChangedObserver = this.onSizeChangedObservable.add(e);\n }\n /**\n * A function that is added to the onApplyObservable\n */\n set onApply(e) {\n this._onApplyObserver && this.onApplyObservable.remove(this._onApplyObserver), this._onApplyObserver = this.onApplyObservable.add(e);\n }\n /**\n * A function that is added to the onBeforeRenderObservable\n */\n set onBeforeRender(e) {\n this._onBeforeRenderObserver && this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver), this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(e);\n }\n /**\n * A function that is added to the onAfterRenderObservable\n */\n set onAfterRender(e) {\n this._onAfterRenderObserver && this.onAfterRenderObservable.remove(this._onAfterRenderObserver), this._onAfterRenderObserver = this.onAfterRenderObservable.add(e);\n }\n /**\n * The input texture for this post process and the output texture of the previous post process. When added to a pipeline the previous post process will\n * render it's output into this texture and this texture will be used as textureSampler in the fragment shader of this post process.\n */\n get inputTexture() {\n return this._textures.data[this._currentRenderTextureInd];\n }\n set inputTexture(e) {\n this._forcedOutputTexture = e;\n }\n /**\n * Since inputTexture should always be defined, if we previously manually set `inputTexture`,\n * the only way to unset it is to use this function to restore its internal state\n */\n restoreDefaultInputTexture() {\n this._forcedOutputTexture && (this._forcedOutputTexture = null, this.markTextureDirty());\n }\n /**\n * Gets the camera which post process is applied to.\n * @returns The camera the post process is applied to.\n */\n getCamera() {\n return this._camera;\n }\n /**\n * Gets the texel size of the postprocess.\n * See https://en.wikipedia.org/wiki/Texel_(graphics)\n */\n get texelSize() {\n return this._shareOutputWithPostProcess ? this._shareOutputWithPostProcess.texelSize : (this._forcedOutputTexture && this._texelSize.copyFromFloats(1 / this._forcedOutputTexture.width, 1 / this._forcedOutputTexture.height), this._texelSize);\n }\n /** @internal */\n constructor(e, t, i, r, s, a, o = 1, l, c, h = null, u = 0, f = \"postprocess\", d, p = !1, g = 5, m = _i.GLSL) {\n this._parentContainer = null, this.width = -1, this.height = -1, this.nodeMaterialSource = null, this._outputTexture = null, this.autoClear = !0, this.forceAutoClearInAlphaMode = !1, this.alphaMode = 0, this.animations = [], this.enablePixelPerfectMode = !1, this.forceFullscreenViewport = !0, this.scaleMode = 1, this.alwaysForcePOT = !1, this._samples = 1, this.adaptScaleToCurrentViewport = !1, this._reusable = !1, this._renderId = 0, this.externalTextureSamplerBinding = !1, this._textures = new Li(2), this._textureCache = [], this._currentRenderTextureInd = 0, this._scaleRatio = new me(1, 1), this._texelSize = me.Zero(), this.onActivateObservable = new he(), this.onSizeChangedObservable = new he(), this.onApplyObservable = new he(), this.onBeforeRenderObservable = new he(), this.onAfterRenderObservable = new he(), this.name = e;\n let v = 1, E = null;\n if (i && !Array.isArray(i)) {\n const C = i;\n i = C.uniforms ?? null, r = C.samplers ?? null, v = C.size ?? 1, a = C.camera ?? null, o = C.samplingMode ?? 1, l = C.engine, c = C.reusable, h = C.defines ?? null, u = C.textureType ?? 0, f = C.vertexUrl ?? \"postprocess\", d = C.indexParameters, p = C.blockCompilation ?? !1, g = C.textureFormat ?? 5, m = C.shaderLanguage ?? _i.GLSL, E = C.uniformBuffers ?? null;\n } else\n s && (typeof s == \"number\" ? v = s : v = { width: s.width, height: s.height });\n a != null ? (this._camera = a, this._scene = a.getScene(), a.attachPostProcess(this), this._engine = this._scene.getEngine(), this._scene.postProcesses.push(this), this.uniqueId = this._scene.getUniqueId()) : l && (this._engine = l, this._engine.postProcesses.push(this)), this._options = v, this.renderTargetSamplingMode = o || 1, this._reusable = c || !1, this._textureType = u, this._textureFormat = g, this._shaderLanguage = m, this._samplers = r || [], this._samplers.push(\"textureSampler\"), this._fragmentUrl = t, this._vertexUrl = f, this._parameters = i || [], this._parameters.push(\"scale\"), this._uniformBuffers = E || [], this._indexParameters = d, this._drawWrapper = new ka(this._engine), p || this.updateEffect(h);\n }\n /**\n * Gets a string identifying the name of the class\n * @returns \"PostProcess\" string\n */\n getClassName() {\n return \"PostProcess\";\n }\n /**\n * Gets the engine which this post process belongs to.\n * @returns The engine the post process was enabled with.\n */\n getEngine() {\n return this._engine;\n }\n /**\n * The effect that is created when initializing the post process.\n * @returns The created effect corresponding the postprocess.\n */\n getEffect() {\n return this._drawWrapper.effect;\n }\n /**\n * To avoid multiple redundant textures for multiple post process, the output the output texture for this post process can be shared with another.\n * @param postProcess The post process to share the output with.\n * @returns This post process.\n */\n shareOutputWith(e) {\n return this._disposeTextures(), this._shareOutputWithPostProcess = e, this;\n }\n /**\n * Reverses the effect of calling shareOutputWith and returns the post process back to its original state.\n * This should be called if the post process that shares output with this post process is disabled/disposed.\n */\n useOwnOutput() {\n this._textures.length == 0 && (this._textures = new Li(2)), this._shareOutputWithPostProcess = null;\n }\n /**\n * Updates the effect with the current post process compile time values and recompiles the shader.\n * @param defines Define statements that should be added at the beginning of the shader. (default: null)\n * @param uniforms Set of uniform variables that will be passed to the shader. (default: null)\n * @param samplers Set of Texture2D variables that will be passed to the shader. (default: null)\n * @param indexParameters The index parameters to be used for babylons include syntax \"#include[0..varyingCount]\". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\n * @param onCompiled Called when the shader has been compiled.\n * @param onError Called if there is an error when compiling a shader.\n * @param vertexUrl The url of the vertex shader to be used (default: the one given at construction time)\n * @param fragmentUrl The url of the fragment shader to be used (default: the one given at construction time)\n */\n updateEffect(e = null, t = null, i = null, r, s, a, o, l) {\n const c = Pt._GetShaderCodeProcessing(this.name);\n if (c != null && c.defineCustomBindings) {\n const h = (t == null ? void 0 : t.slice()) ?? [];\n h.push(...this._parameters);\n const u = (i == null ? void 0 : i.slice()) ?? [];\n u.push(...this._samplers), e = c.defineCustomBindings(this.name, e, h, u), t = h, i = u;\n }\n this._postProcessDefines = e, this._drawWrapper.effect = this._engine.createEffect({ vertex: o ?? this._vertexUrl, fragment: l ?? this._fragmentUrl }, {\n attributes: [\"position\"],\n uniformsNames: t || this._parameters,\n uniformBuffersNames: this._uniformBuffers,\n samplers: i || this._samplers,\n defines: e !== null ? e : \"\",\n fallbacks: null,\n onCompiled: s ?? null,\n onError: a ?? null,\n indexParameters: r || this._indexParameters,\n processCodeAfterIncludes: c != null && c.processCodeAfterIncludes ? (h, u) => c.processCodeAfterIncludes(this.name, h, u) : null,\n processFinalCode: c != null && c.processFinalCode ? (h, u) => c.processFinalCode(this.name, h, u) : null,\n shaderLanguage: this._shaderLanguage\n }, this._engine);\n }\n /**\n * The post process is reusable if it can be used multiple times within one frame.\n * @returns If the post process is reusable\n */\n isReusable() {\n return this._reusable;\n }\n /** invalidate frameBuffer to hint the postprocess to create a depth buffer */\n markTextureDirty() {\n this.width = -1;\n }\n _createRenderTargetTexture(e, t, i = 0) {\n for (let s = 0; s < this._textureCache.length; s++)\n if (this._textureCache[s].texture.width === e.width && this._textureCache[s].texture.height === e.height && this._textureCache[s].postProcessChannel === i && this._textureCache[s].texture._generateDepthBuffer === t.generateDepthBuffer && this._textureCache[s].texture.samples === t.samples)\n return this._textureCache[s].texture;\n const r = this._engine.createRenderTargetTexture(e, t);\n return this._textureCache.push({ texture: r, postProcessChannel: i, lastUsedRenderId: -1 }), r;\n }\n _flushTextureCache() {\n const e = this._renderId;\n for (let t = this._textureCache.length - 1; t >= 0; t--)\n if (e - this._textureCache[t].lastUsedRenderId > 100) {\n let i = !1;\n for (let r = 0; r < this._textures.length; r++)\n if (this._textures.data[r] === this._textureCache[t].texture) {\n i = !0;\n break;\n }\n i || (this._textureCache[t].texture.dispose(), this._textureCache.splice(t, 1));\n }\n }\n /**\n * Resizes the post-process texture\n * @param width Width of the texture\n * @param height Height of the texture\n * @param camera The camera this post-process is applied to. Pass null if the post-process is used outside the context of a camera post-process chain (default: null)\n * @param needMipMaps True if mip maps need to be generated after render (default: false)\n * @param forceDepthStencil True to force post-process texture creation with stencil depth and buffer (default: false)\n */\n resize(e, t, i = null, r = !1, s = !1) {\n this._textures.length > 0 && this._textures.reset(), this.width = e, this.height = t;\n let a = null;\n if (i) {\n for (let c = 0; c < i._postProcesses.length; c++)\n if (i._postProcesses[c] !== null) {\n a = i._postProcesses[c];\n break;\n }\n }\n const o = { width: this.width, height: this.height }, l = {\n generateMipMaps: r,\n generateDepthBuffer: s || a === this,\n generateStencilBuffer: (s || a === this) && this._engine.isStencilEnable,\n samplingMode: this.renderTargetSamplingMode,\n type: this._textureType,\n format: this._textureFormat,\n samples: this._samples,\n label: \"PostProcessRTT-\" + this.name\n };\n this._textures.push(this._createRenderTargetTexture(o, l, 0)), this._reusable && this._textures.push(this._createRenderTargetTexture(o, l, 1)), this._texelSize.copyFromFloats(1 / this.width, 1 / this.height), this.onSizeChangedObservable.notifyObservers(this);\n }\n _getTarget() {\n let e;\n if (this._shareOutputWithPostProcess)\n e = this._shareOutputWithPostProcess.inputTexture;\n else if (this._forcedOutputTexture)\n e = this._forcedOutputTexture, this.width = this._forcedOutputTexture.width, this.height = this._forcedOutputTexture.height;\n else {\n e = this.inputTexture;\n let t;\n for (let i = 0; i < this._textureCache.length; i++)\n if (this._textureCache[i].texture === e) {\n t = this._textureCache[i];\n break;\n }\n t && (t.lastUsedRenderId = this._renderId);\n }\n return e;\n }\n /**\n * Activates the post process by intializing the textures to be used when executed. Notifies onActivateObservable.\n * When this post process is used in a pipeline, this is call will bind the input texture of this post process to the output of the previous.\n * @param camera The camera that will be used in the post process. This camera will be used when calling onActivateObservable.\n * @param sourceTexture The source texture to be inspected to get the width and height if not specified in the post process constructor. (default: null)\n * @param forceDepthStencil If true, a depth and stencil buffer will be generated. (default: false)\n * @returns The render target wrapper that was bound to be written to.\n */\n activate(e, t = null, i) {\n var d, p;\n e = e || this._camera;\n const r = e.getScene(), s = r.getEngine(), a = s.getCaps().maxTextureSize, o = (t ? t.width : this._engine.getRenderWidth(!0)) * this._options | 0, l = (t ? t.height : this._engine.getRenderHeight(!0)) * this._options | 0;\n let c = this._options.width || o, h = this._options.height || l;\n const u = this.renderTargetSamplingMode !== 7 && this.renderTargetSamplingMode !== 1 && this.renderTargetSamplingMode !== 2;\n let f = null;\n if (!this._shareOutputWithPostProcess && !this._forcedOutputTexture) {\n if (this.adaptScaleToCurrentViewport) {\n const g = s.currentViewport;\n g && (c *= g.width, h *= g.height);\n }\n (u || this.alwaysForcePOT) && (this._options.width || (c = s.needPOTTextures ? se.GetExponentOfTwo(c, a, this.scaleMode) : c), this._options.height || (h = s.needPOTTextures ? se.GetExponentOfTwo(h, a, this.scaleMode) : h)), (this.width !== c || this.height !== h || !(f = this._getTarget())) && this.resize(c, h, e, u, i), this._textures.forEach((g) => {\n g.samples !== this.samples && this._engine.updateRenderTargetTextureSampleCount(g, this.samples);\n }), this._flushTextureCache(), this._renderId++;\n }\n return f || (f = this._getTarget()), this.enablePixelPerfectMode ? (this._scaleRatio.copyFromFloats(o / c, l / h), this._engine.bindFramebuffer(f, 0, o, l, this.forceFullscreenViewport)) : (this._scaleRatio.copyFromFloats(1, 1), this._engine.bindFramebuffer(f, 0, void 0, void 0, this.forceFullscreenViewport)), (p = (d = this._engine)._debugInsertMarker) == null || p.call(d, `post process ${this.name} input`), this.onActivateObservable.notifyObservers(e), this.autoClear && (this.alphaMode === 0 || this.forceAutoClearInAlphaMode) && this._engine.clear(this.clearColor ? this.clearColor : r.clearColor, r._allowPostProcessClearColor, !0, !0), this._reusable && (this._currentRenderTextureInd = (this._currentRenderTextureInd + 1) % 2), f;\n }\n /**\n * If the post process is supported.\n */\n get isSupported() {\n return this._drawWrapper.effect.isSupported;\n }\n /**\n * The aspect ratio of the output texture.\n */\n get aspectRatio() {\n return this._shareOutputWithPostProcess ? this._shareOutputWithPostProcess.aspectRatio : this._forcedOutputTexture ? this._forcedOutputTexture.width / this._forcedOutputTexture.height : this.width / this.height;\n }\n /**\n * Get a value indicating if the post-process is ready to be used\n * @returns true if the post-process is ready (shader is compiled)\n */\n isReady() {\n var e;\n return ((e = this._drawWrapper.effect) == null ? void 0 : e.isReady()) ?? !1;\n }\n /**\n * Binds all textures and uniforms to the shader, this will be run on every pass.\n * @returns the effect corresponding to this post process. Null if not compiled or not ready.\n */\n apply() {\n var t, i, r;\n if (!((t = this._drawWrapper.effect) != null && t.isReady()))\n return null;\n this._engine.enableEffect(this._drawWrapper), this._engine.setState(!1), this._engine.setDepthBuffer(!1), this._engine.setDepthWrite(!1), this._engine.setAlphaMode(this.alphaMode), this.alphaConstants && this.getEngine().setAlphaConstants(this.alphaConstants.r, this.alphaConstants.g, this.alphaConstants.b, this.alphaConstants.a);\n let e;\n return this._shareOutputWithPostProcess ? e = this._shareOutputWithPostProcess.inputTexture : this._forcedOutputTexture ? e = this._forcedOutputTexture : e = this.inputTexture, this.externalTextureSamplerBinding || this._drawWrapper.effect._bindTexture(\"textureSampler\", e == null ? void 0 : e.texture), this._drawWrapper.effect.setVector2(\"scale\", this._scaleRatio), this.onApplyObservable.notifyObservers(this._drawWrapper.effect), (r = (i = Pt._GetShaderCodeProcessing(this.name)) == null ? void 0 : i.bindCustomBindings) == null || r.call(i, this.name, this._drawWrapper.effect), this._drawWrapper.effect;\n }\n _disposeTextures() {\n if (this._shareOutputWithPostProcess || this._forcedOutputTexture) {\n this._disposeTextureCache();\n return;\n }\n this._disposeTextureCache(), this._textures.dispose();\n }\n _disposeTextureCache() {\n for (let e = this._textureCache.length - 1; e >= 0; e--)\n this._textureCache[e].texture.dispose();\n this._textureCache.length = 0;\n }\n /**\n * Sets the required values to the prepass renderer.\n * @param prePassRenderer defines the prepass renderer to setup.\n * @returns true if the pre pass is needed.\n */\n setPrePassRenderer(e) {\n return this._prePassEffectConfiguration ? (this._prePassEffectConfiguration = e.addEffectConfiguration(this._prePassEffectConfiguration), this._prePassEffectConfiguration.enabled = !0, !0) : !1;\n }\n /**\n * Disposes the post process.\n * @param camera The camera to dispose the post process on.\n */\n dispose(e) {\n e = e || this._camera, this._disposeTextures();\n let t;\n if (this._scene && (t = this._scene.postProcesses.indexOf(this), t !== -1 && this._scene.postProcesses.splice(t, 1)), this._parentContainer) {\n const i = this._parentContainer.postProcesses.indexOf(this);\n i > -1 && this._parentContainer.postProcesses.splice(i, 1), this._parentContainer = null;\n }\n if (t = this._engine.postProcesses.indexOf(this), t !== -1 && this._engine.postProcesses.splice(t, 1), !!e) {\n if (e.detachPostProcess(this), t = e._postProcesses.indexOf(this), t === 0 && e._postProcesses.length > 0) {\n const i = this._camera._getFirstPostProcess();\n i && i.markTextureDirty();\n }\n this.onActivateObservable.clear(), this.onAfterRenderObservable.clear(), this.onApplyObservable.clear(), this.onBeforeRenderObservable.clear(), this.onSizeChangedObservable.clear();\n }\n }\n /**\n * Serializes the post process to a JSON object\n * @returns the JSON object\n */\n serialize() {\n const e = Le.Serialize(this), t = this.getCamera() || this._scene && this._scene.activeCamera;\n return e.customType = \"BABYLON.\" + this.getClassName(), e.cameraId = t ? t.id : null, e.reusable = this._reusable, e.textureType = this._textureType, e.fragmentUrl = this._fragmentUrl, e.parameters = this._parameters, e.samplers = this._samplers, e.options = this._options, e.defines = this._postProcessDefines, e.textureFormat = this._textureFormat, e.vertexUrl = this._vertexUrl, e.indexParameters = this._indexParameters, e;\n }\n /**\n * Clones this post process\n * @returns a new post process similar to this one\n */\n clone() {\n const e = this.serialize();\n e._engine = this._engine, e.cameraId = null;\n const t = Pt.Parse(e, this._scene, \"\");\n return t ? (t.onActivateObservable = this.onActivateObservable.clone(), t.onSizeChangedObservable = this.onSizeChangedObservable.clone(), t.onApplyObservable = this.onApplyObservable.clone(), t.onBeforeRenderObservable = this.onBeforeRenderObservable.clone(), t.onAfterRenderObservable = this.onAfterRenderObservable.clone(), t._prePassEffectConfiguration = this._prePassEffectConfiguration, t) : null;\n }\n /**\n * Creates a material from parsed material data\n * @param parsedPostProcess defines parsed post process data\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures\n * @returns a new post process\n */\n static Parse(e, t, i) {\n const r = mr(e.customType);\n if (!r || !r._Parse)\n return null;\n const s = t ? t.getCameraById(e.cameraId) : null;\n return r._Parse(e, s, t, i);\n }\n /**\n * @internal\n */\n static _Parse(e, t, i, r) {\n return Le.Parse(() => new Pt(e.name, e.fragmentUrl, e.parameters, e.samplers, e.options, t, e.renderTargetSamplingMode, e._engine, e.reusable, e.defines, e.textureType, e.vertexUrl, e.indexParameters, !1, e.textureFormat), e, i, r);\n }\n}\nPt._CustomShaderCodeProcessing = {};\nP([\n w()\n], Pt.prototype, \"uniqueId\", void 0);\nP([\n w()\n], Pt.prototype, \"name\", void 0);\nP([\n w()\n], Pt.prototype, \"width\", void 0);\nP([\n w()\n], Pt.prototype, \"height\", void 0);\nP([\n w()\n], Pt.prototype, \"renderTargetSamplingMode\", void 0);\nP([\n H_()\n], Pt.prototype, \"clearColor\", void 0);\nP([\n w()\n], Pt.prototype, \"autoClear\", void 0);\nP([\n w()\n], Pt.prototype, \"forceAutoClearInAlphaMode\", void 0);\nP([\n w()\n], Pt.prototype, \"alphaMode\", void 0);\nP([\n w()\n], Pt.prototype, \"alphaConstants\", void 0);\nP([\n w()\n], Pt.prototype, \"enablePixelPerfectMode\", void 0);\nP([\n w()\n], Pt.prototype, \"forceFullscreenViewport\", void 0);\nP([\n w()\n], Pt.prototype, \"scaleMode\", void 0);\nP([\n w()\n], Pt.prototype, \"alwaysForcePOT\", void 0);\nP([\n w(\"samples\")\n], Pt.prototype, \"_samples\", void 0);\nP([\n w()\n], Pt.prototype, \"adaptScaleToCurrentViewport\", void 0);\nRe(\"BABYLON.PostProcess\", Pt);\nconst _I = \"bonesDeclaration\", EI = `#if NUM_BONE_INFLUENCERS>0\nattribute vec4 matricesIndices;attribute vec4 matricesWeights;\n#if NUM_BONE_INFLUENCERS>4\nattribute vec4 matricesIndicesExtra;attribute vec4 matricesWeightsExtra;\n#endif\n#ifndef BAKED_VERTEX_ANIMATION_TEXTURE\n#ifdef BONETEXTURE\nuniform highp sampler2D boneSampler;uniform float boneTextureWidth;\n#else\nuniform mat4 mBones[BonesPerMesh];\n#endif\n#ifdef BONES_VELOCITY_ENABLED\nuniform mat4 mPreviousBones[BonesPerMesh];\n#endif\n#ifdef BONETEXTURE\n#define inline\nmat4 readMatrixFromRawSampler(sampler2D smp,float index)\n{float offset=index *4.0;float dx=1.0/boneTextureWidth;vec4 m0=texture2D(smp,vec2(dx*(offset+0.5),0.));vec4 m1=texture2D(smp,vec2(dx*(offset+1.5),0.));vec4 m2=texture2D(smp,vec2(dx*(offset+2.5),0.));vec4 m3=texture2D(smp,vec2(dx*(offset+3.5),0.));return mat4(m0,m1,m2,m3);}\n#endif\n#endif\n#endif\n`;\nY.IncludesShadersStore[_I] = EI;\nconst vI = \"bakedVertexAnimationDeclaration\", TI = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE\nuniform float bakedVertexAnimationTime;uniform vec2 bakedVertexAnimationTextureSizeInverted;uniform vec4 bakedVertexAnimationSettings;uniform sampler2D bakedVertexAnimationTexture;\n#ifdef INSTANCES\nattribute vec4 bakedVertexAnimationSettingsInstanced;\n#endif\n#define inline\nmat4 readMatrixFromRawSamplerVAT(sampler2D smp,float index,float frame)\n{float offset=index*4.0;float frameUV=(frame+0.5)*bakedVertexAnimationTextureSizeInverted.y;float dx=bakedVertexAnimationTextureSizeInverted.x;vec4 m0=texture2D(smp,vec2(dx*(offset+0.5),frameUV));vec4 m1=texture2D(smp,vec2(dx*(offset+1.5),frameUV));vec4 m2=texture2D(smp,vec2(dx*(offset+2.5),frameUV));vec4 m3=texture2D(smp,vec2(dx*(offset+3.5),frameUV));return mat4(m0,m1,m2,m3);}\n#endif\n`;\nY.IncludesShadersStore[vI] = TI;\nconst xI = \"morphTargetsVertexGlobalDeclaration\", CI = `#ifdef MORPHTARGETS\nuniform float morphTargetInfluences[NUM_MORPH_INFLUENCERS];\n#ifdef MORPHTARGETS_TEXTURE \nuniform float morphTargetTextureIndices[NUM_MORPH_INFLUENCERS];uniform vec3 morphTargetTextureInfo;uniform highp sampler2DArray morphTargets;vec3 readVector3FromRawSampler(int targetIndex,float vertexIndex)\n{ \nfloat y=floor(vertexIndex/morphTargetTextureInfo.y);float x=vertexIndex-y*morphTargetTextureInfo.y;vec3 textureUV=vec3((x+0.5)/morphTargetTextureInfo.y,(y+0.5)/morphTargetTextureInfo.z,morphTargetTextureIndices[targetIndex]);return texture(morphTargets,textureUV).xyz;}\n#endif\n#endif\n`;\nY.IncludesShadersStore[xI] = CI;\nconst RI = \"morphTargetsVertexDeclaration\", SI = `#ifdef MORPHTARGETS\n#ifndef MORPHTARGETS_TEXTURE\nattribute vec3 position{X};\n#ifdef MORPHTARGETS_NORMAL\nattribute vec3 normal{X};\n#endif\n#ifdef MORPHTARGETS_TANGENT\nattribute vec3 tangent{X};\n#endif\n#ifdef MORPHTARGETS_UV\nattribute vec2 uv_{X};\n#endif\n#elif {X}==0\nuniform int morphTargetCount;\n#endif\n#endif\n`;\nY.IncludesShadersStore[RI] = SI;\nconst yI = \"instancesDeclaration\", II = `#ifdef INSTANCES\nattribute vec4 world0;attribute vec4 world1;attribute vec4 world2;attribute vec4 world3;\n#ifdef INSTANCESCOLOR\nattribute vec4 instanceColor;\n#endif\n#if defined(THIN_INSTANCES) && !defined(WORLD_UBO)\nuniform mat4 world;\n#endif\n#if defined(VELOCITY) || defined(PREPASS_VELOCITY)\nattribute vec4 previousWorld0;attribute vec4 previousWorld1;attribute vec4 previousWorld2;attribute vec4 previousWorld3;\n#ifdef THIN_INSTANCES\nuniform mat4 previousWorld;\n#endif\n#endif\n#else\n#if !defined(WORLD_UBO)\nuniform mat4 world;\n#endif\n#if defined(VELOCITY) || defined(PREPASS_VELOCITY)\nuniform mat4 previousWorld;\n#endif\n#endif\n`;\nY.IncludesShadersStore[yI] = II;\nconst bI = \"morphTargetsVertexGlobal\", AI = `#ifdef MORPHTARGETS\n#ifdef MORPHTARGETS_TEXTURE\nfloat vertexID;\n#endif\n#endif\n`;\nY.IncludesShadersStore[bI] = AI;\nconst MI = \"morphTargetsVertex\", PI = `#ifdef MORPHTARGETS\n#ifdef MORPHTARGETS_TEXTURE\n#if {X}==0\nfor (int i=0; i=morphTargetCount) break;vertexID=float(gl_VertexID)*morphTargetTextureInfo.x;positionUpdated+=(readVector3FromRawSampler(i,vertexID)-position)*morphTargetInfluences[i];vertexID+=1.0;\n#ifdef MORPHTARGETS_NORMAL\nnormalUpdated+=(readVector3FromRawSampler(i,vertexID) -normal)*morphTargetInfluences[i];vertexID+=1.0;\n#endif\n#ifdef MORPHTARGETS_UV\nuvUpdated+=(readVector3FromRawSampler(i,vertexID).xy-uv)*morphTargetInfluences[i];vertexID+=1.0;\n#endif\n#ifdef MORPHTARGETS_TANGENT\ntangentUpdated.xyz+=(readVector3FromRawSampler(i,vertexID) -tangent.xyz)*morphTargetInfluences[i];\n#endif\n}\n#endif\n#else\npositionUpdated+=(position{X}-position)*morphTargetInfluences[{X}];\n#ifdef MORPHTARGETS_NORMAL\nnormalUpdated+=(normal{X}-normal)*morphTargetInfluences[{X}];\n#endif\n#ifdef MORPHTARGETS_TANGENT\ntangentUpdated.xyz+=(tangent{X}-tangent.xyz)*morphTargetInfluences[{X}];\n#endif\n#ifdef MORPHTARGETS_UV\nuvUpdated+=(uv_{X}-uv)*morphTargetInfluences[{X}];\n#endif\n#endif\n#endif\n`;\nY.IncludesShadersStore[MI] = PI;\nconst OI = \"instancesVertex\", DI = `#ifdef INSTANCES\nmat4 finalWorld=mat4(world0,world1,world2,world3);\n#if defined(PREPASS_VELOCITY) || defined(VELOCITY)\nmat4 finalPreviousWorld=mat4(previousWorld0,previousWorld1,previousWorld2,previousWorld3);\n#endif\n#ifdef THIN_INSTANCES\nfinalWorld=world*finalWorld;\n#if defined(PREPASS_VELOCITY) || defined(VELOCITY)\nfinalPreviousWorld=previousWorld*finalPreviousWorld;\n#endif\n#endif\n#else\nmat4 finalWorld=world;\n#if defined(PREPASS_VELOCITY) || defined(VELOCITY)\nmat4 finalPreviousWorld=previousWorld;\n#endif\n#endif\n`;\nY.IncludesShadersStore[OI] = DI;\nconst NI = \"bonesVertex\", FI = `#ifndef BAKED_VERTEX_ANIMATION_TEXTURE\n#if NUM_BONE_INFLUENCERS>0\nmat4 influence;\n#ifdef BONETEXTURE\ninfluence=readMatrixFromRawSampler(boneSampler,matricesIndices[0])*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndices[1])*matricesWeights[1];\n#endif\n#if NUM_BONE_INFLUENCERS>2\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndices[2])*matricesWeights[2];\n#endif\n#if NUM_BONE_INFLUENCERS>3\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndices[3])*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[0])*matricesWeightsExtra[0];\n#endif\n#if NUM_BONE_INFLUENCERS>5\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[1])*matricesWeightsExtra[1];\n#endif\n#if NUM_BONE_INFLUENCERS>6\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[2])*matricesWeightsExtra[2];\n#endif\n#if NUM_BONE_INFLUENCERS>7\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[3])*matricesWeightsExtra[3];\n#endif\n#else\ninfluence=mBones[int(matricesIndices[0])]*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\ninfluence+=mBones[int(matricesIndices[1])]*matricesWeights[1];\n#endif\n#if NUM_BONE_INFLUENCERS>2\ninfluence+=mBones[int(matricesIndices[2])]*matricesWeights[2];\n#endif\n#if NUM_BONE_INFLUENCERS>3\ninfluence+=mBones[int(matricesIndices[3])]*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\ninfluence+=mBones[int(matricesIndicesExtra[0])]*matricesWeightsExtra[0];\n#endif\n#if NUM_BONE_INFLUENCERS>5\ninfluence+=mBones[int(matricesIndicesExtra[1])]*matricesWeightsExtra[1];\n#endif\n#if NUM_BONE_INFLUENCERS>6\ninfluence+=mBones[int(matricesIndicesExtra[2])]*matricesWeightsExtra[2];\n#endif\n#if NUM_BONE_INFLUENCERS>7\ninfluence+=mBones[int(matricesIndicesExtra[3])]*matricesWeightsExtra[3];\n#endif\n#endif\nfinalWorld=finalWorld*influence;\n#endif\n#endif\n`;\nY.IncludesShadersStore[NI] = FI;\nconst LI = \"bakedVertexAnimation\", wI = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE\n{\n#ifdef INSTANCES\n#define BVASNAME bakedVertexAnimationSettingsInstanced\n#else\n#define BVASNAME bakedVertexAnimationSettings\n#endif\nfloat VATStartFrame=BVASNAME.x;float VATEndFrame=BVASNAME.y;float VATOffsetFrame=BVASNAME.z;float VATSpeed=BVASNAME.w;float totalFrames=VATEndFrame-VATStartFrame+1.0;float time=bakedVertexAnimationTime*VATSpeed/totalFrames;float frameCorrection=time<1.0 ? 0.0 : 1.0;float numOfFrames=totalFrames-frameCorrection;float VATFrameNum=fract(time)*numOfFrames;VATFrameNum=mod(VATFrameNum+VATOffsetFrame,numOfFrames);VATFrameNum=floor(VATFrameNum);VATFrameNum+=VATStartFrame+frameCorrection;mat4 VATInfluence;VATInfluence=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[0],VATFrameNum)*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[1],VATFrameNum)*matricesWeights[1];\n#endif\n#if NUM_BONE_INFLUENCERS>2\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[2],VATFrameNum)*matricesWeights[2];\n#endif\n#if NUM_BONE_INFLUENCERS>3\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[3],VATFrameNum)*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[0],VATFrameNum)*matricesWeightsExtra[0];\n#endif\n#if NUM_BONE_INFLUENCERS>5\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[1],VATFrameNum)*matricesWeightsExtra[1];\n#endif\n#if NUM_BONE_INFLUENCERS>6\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[2],VATFrameNum)*matricesWeightsExtra[2];\n#endif\n#if NUM_BONE_INFLUENCERS>7\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[3],VATFrameNum)*matricesWeightsExtra[3];\n#endif\nfinalWorld=finalWorld*VATInfluence;}\n#endif\n`;\nY.IncludesShadersStore[LI] = wI;\nconst UI = \"meshUVSpaceRendererVertexShader\", VI = `precision highp float;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;uniform mat4 projMatrix;varying vec2 vDecalTC;\n#include\n#include\n#include\n#include[0..maxSimultaneousMorphTargets]\n#include\nvoid main(void) {vec3 positionUpdated=position;vec3 normalUpdated=normal;\n#include\n#include[0..maxSimultaneousMorphTargets]\n#include\n#include\n#include\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);mat3 normWorldSM=mat3(finalWorld);vec3 vNormalW;\n#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvNormalW=normalUpdated/vec3(dot(normWorldSM[0],normWorldSM[0]),dot(normWorldSM[1],normWorldSM[1]),dot(normWorldSM[2],normWorldSM[2]));vNormalW=normalize(normWorldSM*vNormalW);\n#else\n#ifdef NONUNIFORMSCALING\nnormWorldSM=transposeMat3(inverseMat3(normWorldSM));\n#endif\nvNormalW=normalize(normWorldSM*normalUpdated);\n#endif\nvec3 normalView=normalize((projMatrix*vec4(vNormalW,0.0)).xyz);vec3 decalTC=(projMatrix*worldPos).xyz;vDecalTC=decalTC.xy;gl_Position=vec4(uv*2.0-1.0,normalView.z>0.0 ? 2. : decalTC.z,1.0);}`;\nY.ShadersStore[UI] = VI;\nconst BI = \"meshUVSpaceRendererPixelShader\", kI = `precision highp float;varying vec2 vDecalTC;uniform sampler2D textureSampler;void main(void) {if (vDecalTC.x<0. || vDecalTC.x>1. || vDecalTC.y<0. || vDecalTC.y>1.) {discard;}\ngl_FragColor=texture2D(textureSampler,vDecalTC);}\n`;\nY.ShadersStore[BI] = kI;\nconst zI = \"meshUVSpaceRendererMaskerVertexShader\", WI = \"attribute vec2 uv;varying vec2 vUV;void main(void) {gl_Position=vec4(vec2(uv.x,uv.y)*2.0-1.0,0.,1.0);vUV=uv;}\";\nY.ShadersStore[zI] = WI;\nconst GI = \"meshUVSpaceRendererMaskerPixelShader\", XI = `varying vec2 vUV;void main(void) {gl_FragColor=vec4(1.0,1.0,1.0,1.0);}\n`;\nY.ShadersStore[GI] = XI;\nconst HI = \"meshUVSpaceRendererFinaliserPixelShader\", KI = `precision highp float;varying vec2 vUV;uniform sampler2D textureSampler;uniform sampler2D maskTextureSampler;uniform vec2 textureSize;void main() {vec4 mask=texture2D(maskTextureSampler,vUV).rgba;if (mask.r>0.5) {gl_FragColor=texture2D(textureSampler,vUV);} else {vec2 texelSize=4.0/textureSize;vec2 uv_p01=vUV+vec2(-1.0,0.0)*texelSize;vec2 uv_p21=vUV+vec2(1.0,0.0)*texelSize;vec2 uv_p10=vUV+vec2(0.0,-1.0)*texelSize;vec2 uv_p12=vUV+vec2(0.0,1.0)*texelSize;float mask_p01=texture2D(maskTextureSampler,uv_p01).r;float mask_p21=texture2D(maskTextureSampler,uv_p21).r;float mask_p10=texture2D(maskTextureSampler,uv_p10).r;float mask_p12=texture2D(maskTextureSampler,uv_p12).r;vec4 col=vec4(0.0,0.0,0.0,0.0);float total_weight=0.0;if (mask_p01>0.5) {col+=texture2D(textureSampler,uv_p01);total_weight+=1.0;}\nif (mask_p21>0.5) {col+=texture2D(textureSampler,uv_p21);total_weight+=1.0;}\nif (mask_p10>0.5) {col+=texture2D(textureSampler,uv_p10);total_weight+=1.0;}\nif (mask_p12>0.5) {col+=texture2D(textureSampler,uv_p12);total_weight+=1.0;}\nif (total_weight>0.0) {gl_FragColor=col/total_weight;} else {gl_FragColor=col;}}}\n`;\nY.ShadersStore[HI] = KI;\nconst qI = \"meshUVSpaceRendererFinaliserVertexShader\", YI = `precision highp float;attribute vec3 position;attribute vec2 uv;uniform mat4 worldViewProjection;varying vec2 vUV;void main() {gl_Position=worldViewProjection*vec4(position,1.0);vUV=uv;}\n`;\nY.ShadersStore[qI] = YI;\nB._GroundMeshParser = (n, e) => qo.Parse(n, e);\nclass qo extends B {\n constructor(e, t) {\n super(e, t), this.generateOctree = !1;\n }\n /**\n * \"GroundMesh\"\n * @returns \"GroundMesh\"\n */\n getClassName() {\n return \"GroundMesh\";\n }\n /**\n * The minimum of x and y subdivisions\n */\n get subdivisions() {\n return Math.min(this._subdivisionsX, this._subdivisionsY);\n }\n /**\n * X subdivisions\n */\n get subdivisionsX() {\n return this._subdivisionsX;\n }\n /**\n * Y subdivisions\n */\n get subdivisionsY() {\n return this._subdivisionsY;\n }\n /**\n * This function will divide the mesh into submeshes and update an octree to help to select the right submeshes\n * for rendering, picking and collision computations. Please note that you must have a decent number of submeshes\n * to get performance improvements when using an octree.\n * @param chunksCount the number of submeshes the mesh will be divided into\n * @param octreeBlocksSize the maximum size of the octree blocks (Default: 32)\n */\n optimize(e, t = 32) {\n this._subdivisionsX = e, this._subdivisionsY = e, this.subdivide(e);\n const i = this;\n i.createOrUpdateSubmeshesOctree && i.createOrUpdateSubmeshesOctree(t);\n }\n /**\n * Returns a height (y) value in the World system :\n * the ground altitude at the coordinates (x, z) expressed in the World system.\n * @param x x coordinate\n * @param z z coordinate\n * @returns the ground y position if (x, z) are outside the ground surface.\n */\n getHeightAtCoordinates(e, t) {\n const i = this.getWorldMatrix(), r = z.Matrix[5];\n i.invertToRef(r);\n const s = z.Vector3[8];\n if (_.TransformCoordinatesFromFloatsToRef(e, 0, t, r, s), e = s.x, t = s.z, e < this._minX || e >= this._maxX || t <= this._minZ || t > this._maxZ)\n return this.position.y;\n (!this._heightQuads || this._heightQuads.length == 0) && (this._initHeightQuads(), this._computeHeightQuads());\n const a = this._getFacetAt(e, t), o = -(a.x * e + a.z * t + a.w) / a.y;\n return _.TransformCoordinatesFromFloatsToRef(0, o, 0, i, s), s.y;\n }\n /**\n * Returns a normalized vector (Vector3) orthogonal to the ground\n * at the ground coordinates (x, z) expressed in the World system.\n * @param x x coordinate\n * @param z z coordinate\n * @returns Vector3(0.0, 1.0, 0.0) if (x, z) are outside the ground surface.\n */\n getNormalAtCoordinates(e, t) {\n const i = new _(0, 1, 0);\n return this.getNormalAtCoordinatesToRef(e, t, i), i;\n }\n /**\n * Updates the Vector3 passed a reference with a normalized vector orthogonal to the ground\n * at the ground coordinates (x, z) expressed in the World system.\n * Doesn't update the reference Vector3 if (x, z) are outside the ground surface.\n * @param x x coordinate\n * @param z z coordinate\n * @param ref vector to store the result\n * @returns the GroundMesh.\n */\n getNormalAtCoordinatesToRef(e, t, i) {\n const r = this.getWorldMatrix(), s = z.Matrix[5];\n r.invertToRef(s);\n const a = z.Vector3[8];\n if (_.TransformCoordinatesFromFloatsToRef(e, 0, t, s, a), e = a.x, t = a.z, e < this._minX || e > this._maxX || t < this._minZ || t > this._maxZ)\n return this;\n (!this._heightQuads || this._heightQuads.length == 0) && (this._initHeightQuads(), this._computeHeightQuads());\n const o = this._getFacetAt(e, t);\n return _.TransformNormalFromFloatsToRef(o.x, o.y, o.z, r, i), this;\n }\n /**\n * Force the heights to be recomputed for getHeightAtCoordinates() or getNormalAtCoordinates()\n * if the ground has been updated.\n * This can be used in the render loop.\n * @returns the GroundMesh.\n */\n updateCoordinateHeights() {\n return (!this._heightQuads || this._heightQuads.length == 0) && this._initHeightQuads(), this._computeHeightQuads(), this;\n }\n // Returns the element \"facet\" from the heightQuads array relative to (x, z) local coordinates\n _getFacetAt(e, t) {\n const i = Math.floor((e + this._maxX) * this._subdivisionsX / this._width), r = Math.floor(-(t + this._maxZ) * this._subdivisionsY / this._height + this._subdivisionsY), s = this._heightQuads[r * this._subdivisionsX + i];\n let a;\n return t < s.slope.x * e + s.slope.y ? a = s.facet1 : a = s.facet2, a;\n }\n // Creates and populates the heightMap array with \"facet\" elements :\n // a quad is two triangular facets separated by a slope, so a \"facet\" element is 1 slope + 2 facets\n // slope : Vector2(c, h) = 2D diagonal line equation setting apart two triangular facets in a quad : z = cx + h\n // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0\n // facet2 : Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0\n // Returns the GroundMesh.\n _initHeightQuads() {\n const e = this._subdivisionsX, t = this._subdivisionsY;\n this._heightQuads = new Array();\n for (let i = 0; i < t; i++)\n for (let r = 0; r < e; r++) {\n const s = { slope: me.Zero(), facet1: new Ke(0, 0, 0, 0), facet2: new Ke(0, 0, 0, 0) };\n this._heightQuads[i * e + r] = s;\n }\n return this;\n }\n // Compute each quad element values and update the heightMap array :\n // slope : Vector2(c, h) = 2D diagonal line equation setting apart two triangular facets in a quad : z = cx + h\n // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0\n // facet2 : Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0\n // Returns the GroundMesh.\n _computeHeightQuads() {\n const e = this.getVerticesData(I.PositionKind);\n if (!e)\n return this;\n const t = z.Vector3[3], i = z.Vector3[2], r = z.Vector3[1], s = z.Vector3[0], a = z.Vector3[4], o = z.Vector3[5], l = z.Vector3[6], c = z.Vector3[7], h = z.Vector3[8];\n let u = 0, f = 0, d = 0, p = 0, g = 0, m = 0, v = 0;\n const E = this._subdivisionsX, C = this._subdivisionsY;\n for (let T = 0; T < C; T++)\n for (let R = 0; R < E; R++) {\n u = R * 3, f = T * (E + 1) * 3, d = (T + 1) * (E + 1) * 3, t.x = e[f + u], t.y = e[f + u + 1], t.z = e[f + u + 2], i.x = e[f + u + 3], i.y = e[f + u + 4], i.z = e[f + u + 5], r.x = e[d + u], r.y = e[d + u + 1], r.z = e[d + u + 2], s.x = e[d + u + 3], s.y = e[d + u + 4], s.z = e[d + u + 5], p = (s.z - t.z) / (s.x - t.x), g = t.z - p * t.x, i.subtractToRef(t, a), r.subtractToRef(t, o), s.subtractToRef(t, l), _.CrossToRef(l, o, c), _.CrossToRef(a, l, h), c.normalize(), h.normalize(), m = -(c.x * t.x + c.y * t.y + c.z * t.z), v = -(h.x * i.x + h.y * i.y + h.z * i.z);\n const x = this._heightQuads[T * E + R];\n x.slope.copyFromFloats(p, g), x.facet1.copyFromFloats(c.x, c.y, c.z, m), x.facet2.copyFromFloats(h.x, h.y, h.z, v);\n }\n return this;\n }\n /**\n * Serializes this ground mesh\n * @param serializationObject object to write serialization to\n */\n serialize(e) {\n super.serialize(e), e.subdivisionsX = this._subdivisionsX, e.subdivisionsY = this._subdivisionsY, e.minX = this._minX, e.maxX = this._maxX, e.minZ = this._minZ, e.maxZ = this._maxZ, e.width = this._width, e.height = this._height;\n }\n /**\n * Parses a serialized ground mesh\n * @param parsedMesh the serialized mesh\n * @param scene the scene to create the ground mesh in\n * @returns the created ground mesh\n */\n static Parse(e, t) {\n const i = new qo(e.name, t);\n return i._subdivisionsX = e.subdivisionsX || 1, i._subdivisionsY = e.subdivisionsY || 1, i._minX = e.minX, i._maxX = e.maxX, i._minZ = e.minZ, i._maxZ = e.maxZ, i._width = e.width, i._height = e.height, i;\n }\n}\nB._GoldbergMeshParser = (n, e) => mf.Parse(n, e);\nclass mf extends B {\n constructor() {\n super(...arguments), this.goldbergData = {\n faceColors: [],\n faceCenters: [],\n faceZaxis: [],\n faceXaxis: [],\n faceYaxis: [],\n nbSharedFaces: 0,\n nbUnsharedFaces: 0,\n nbFaces: 0,\n nbFacesAtPole: 0,\n adjacentFaces: []\n };\n }\n /**\n * Gets the related Goldberg face from pole infos\n * @param poleOrShared Defines the pole index or the shared face index if the fromPole parameter is passed in\n * @param fromPole Defines an optional pole index to find the related info from\n * @returns the goldberg face number\n */\n relatedGoldbergFace(e, t) {\n return t === void 0 ? (e > this.goldbergData.nbUnsharedFaces - 1 && (ne.Warn(\"Maximum number of unshared faces used\"), e = this.goldbergData.nbUnsharedFaces - 1), this.goldbergData.nbUnsharedFaces + e) : (e > 11 && (ne.Warn(\"Last pole used\"), e = 11), t > this.goldbergData.nbFacesAtPole - 1 && (ne.Warn(\"Maximum number of faces at a pole used\"), t = this.goldbergData.nbFacesAtPole - 1), 12 + e * this.goldbergData.nbFacesAtPole + t);\n }\n _changeGoldbergFaceColors(e) {\n for (let i = 0; i < e.length; i++) {\n const r = e[i][0], s = e[i][1], a = e[i][2];\n for (let o = r; o < s + 1; o++)\n this.goldbergData.faceColors[o] = a;\n }\n const t = [];\n for (let i = 0; i < 12; i++)\n for (let r = 0; r < 5; r++)\n t.push(this.goldbergData.faceColors[i].r, this.goldbergData.faceColors[i].g, this.goldbergData.faceColors[i].b, this.goldbergData.faceColors[i].a);\n for (let i = 12; i < this.goldbergData.faceColors.length; i++)\n for (let r = 0; r < 6; r++)\n t.push(this.goldbergData.faceColors[i].r, this.goldbergData.faceColors[i].g, this.goldbergData.faceColors[i].b, this.goldbergData.faceColors[i].a);\n return t;\n }\n /**\n * Set new goldberg face colors\n * @param colorRange the new color to apply to the mesh\n */\n setGoldbergFaceColors(e) {\n const t = this._changeGoldbergFaceColors(e);\n this.setVerticesData(I.ColorKind, t);\n }\n /**\n * Updates new goldberg face colors\n * @param colorRange the new color to apply to the mesh\n */\n updateGoldbergFaceColors(e) {\n const t = this._changeGoldbergFaceColors(e);\n this.updateVerticesData(I.ColorKind, t);\n }\n _changeGoldbergFaceUVs(e) {\n const t = this.getVerticesData(I.UVKind);\n for (let i = 0; i < e.length; i++) {\n const r = e[i][0], s = e[i][1], a = e[i][2], o = e[i][3], l = e[i][4], c = [], h = [];\n let u, f;\n for (let d = 0; d < 5; d++)\n u = a.x + o * Math.cos(l + d * Math.PI / 2.5), f = a.y + o * Math.sin(l + d * Math.PI / 2.5), u < 0 && (u = 0), u > 1 && (u = 1), c.push(u, f);\n for (let d = 0; d < 6; d++)\n u = a.x + o * Math.cos(l + d * Math.PI / 3), f = a.y + o * Math.sin(l + d * Math.PI / 3), u < 0 && (u = 0), u > 1 && (u = 1), h.push(u, f);\n for (let d = r; d < Math.min(12, s + 1); d++)\n for (let p = 0; p < 5; p++)\n t[10 * d + 2 * p] = c[2 * p], t[10 * d + 2 * p + 1] = c[2 * p + 1];\n for (let d = Math.max(12, r); d < s + 1; d++)\n for (let p = 0; p < 6; p++)\n t[12 * d - 24 + 2 * p] = h[2 * p], t[12 * d - 23 + 2 * p] = h[2 * p + 1];\n }\n return t;\n }\n /**\n * set new goldberg face UVs\n * @param uvRange the new UVs to apply to the mesh\n */\n setGoldbergFaceUVs(e) {\n const t = this._changeGoldbergFaceUVs(e);\n this.setVerticesData(I.UVKind, t);\n }\n /**\n * Updates new goldberg face UVs\n * @param uvRange the new UVs to apply to the mesh\n */\n updateGoldbergFaceUVs(e) {\n const t = this._changeGoldbergFaceUVs(e);\n this.updateVerticesData(I.UVKind, t);\n }\n /**\n * Places a mesh on a particular face of the goldberg polygon\n * @param mesh Defines the mesh to position\n * @param face Defines the face to position onto\n * @param position Defines the position relative to the face we are positioning the mesh onto\n */\n placeOnGoldbergFaceAt(e, t, i) {\n const r = _.RotationFromAxis(this.goldbergData.faceXaxis[t], this.goldbergData.faceYaxis[t], this.goldbergData.faceZaxis[t]);\n e.rotation = r, e.position = this.goldbergData.faceCenters[t].add(this.goldbergData.faceXaxis[t].scale(i.x)).add(this.goldbergData.faceYaxis[t].scale(i.y)).add(this.goldbergData.faceZaxis[t].scale(i.z));\n }\n /**\n * Serialize current mesh\n * @param serializationObject defines the object which will receive the serialization data\n */\n serialize(e) {\n super.serialize(e), e.type = \"GoldbergMesh\";\n const t = {};\n if (t.adjacentFaces = this.goldbergData.adjacentFaces, t.nbSharedFaces = this.goldbergData.nbSharedFaces, t.nbUnsharedFaces = this.goldbergData.nbUnsharedFaces, t.nbFaces = this.goldbergData.nbFaces, t.nbFacesAtPole = this.goldbergData.nbFacesAtPole, this.goldbergData.faceColors) {\n t.faceColors = [];\n for (const i of this.goldbergData.faceColors)\n t.faceColors.push(i.asArray());\n }\n if (this.goldbergData.faceCenters) {\n t.faceCenters = [];\n for (const i of this.goldbergData.faceCenters)\n t.faceCenters.push(i.asArray());\n }\n if (this.goldbergData.faceZaxis) {\n t.faceZaxis = [];\n for (const i of this.goldbergData.faceZaxis)\n t.faceZaxis.push(i.asArray());\n }\n if (this.goldbergData.faceYaxis) {\n t.faceYaxis = [];\n for (const i of this.goldbergData.faceYaxis)\n t.faceYaxis.push(i.asArray());\n }\n if (this.goldbergData.faceXaxis) {\n t.faceXaxis = [];\n for (const i of this.goldbergData.faceXaxis)\n t.faceXaxis.push(i.asArray());\n }\n e.goldbergData = t;\n }\n /**\n * Parses a serialized goldberg mesh\n * @param parsedMesh the serialized mesh\n * @param scene the scene to create the goldberg mesh in\n * @returns the created goldberg mesh\n */\n static Parse(e, t) {\n const i = e.goldbergData;\n i.faceColors = i.faceColors.map((s) => et.FromArray(s)), i.faceCenters = i.faceCenters.map((s) => _.FromArray(s)), i.faceZaxis = i.faceZaxis.map((s) => _.FromArray(s)), i.faceXaxis = i.faceXaxis.map((s) => _.FromArray(s)), i.faceYaxis = i.faceYaxis.map((s) => _.FromArray(s));\n const r = new mf(e.name, t);\n return r.goldbergData = i, r;\n }\n}\nB._TrailMeshParser = (n, e) => sc.Parse(n, e);\nclass sc extends B {\n /**\n * Creates a new TrailMesh.\n * @param name The value used by scene.getMeshByName() to do a lookup.\n * @param generator The mesh or transform node to generate a trail.\n * @param scene The scene to add this mesh to.\n * @param diameter Diameter of trailing mesh. Default is 1.\n * @param length Length of trailing mesh. Default is 60.\n * @param autoStart Automatically start trailing mesh. Default true.\n */\n constructor(e, t, i, r = 1, s = 60, a = !0) {\n super(e, i), this._sectionPolygonPointsCount = 4, this._running = !1, this._autoStart = a, this._generator = t, this.diameter = r, this._length = s, this._sectionVectors = [], this._sectionNormalVectors = [];\n for (let o = 0; o <= this._sectionPolygonPointsCount; o++)\n this._sectionVectors[o] = _.Zero(), this._sectionNormalVectors[o] = _.Zero();\n this._createMesh();\n }\n /**\n * \"TrailMesh\"\n * @returns \"TrailMesh\"\n */\n getClassName() {\n return \"TrailMesh\";\n }\n _createMesh() {\n const e = new re(), t = [], i = [], r = [], s = [];\n let a = _.Zero();\n this._generator instanceof er && this._generator.hasBoundingInfo ? a = this._generator.getBoundingInfo().boundingBox.centerWorld : a = this._generator.absolutePosition;\n const o = 2 * Math.PI / this._sectionPolygonPointsCount;\n for (let l = 0; l <= this._sectionPolygonPointsCount; l++) {\n const c = l !== this._sectionPolygonPointsCount ? l * o : 0;\n t.push(a.x + Math.cos(c) * this.diameter, a.y + Math.sin(c) * this.diameter, a.z), s.push(l / this._sectionPolygonPointsCount, 0);\n }\n for (let l = 1; l <= this._length; l++) {\n for (let h = 0; h <= this._sectionPolygonPointsCount; h++) {\n const u = h !== this._sectionPolygonPointsCount ? h * o : 0;\n t.push(a.x + Math.cos(u) * this.diameter, a.y + Math.sin(u) * this.diameter, a.z), s.push(h / this._sectionPolygonPointsCount, l / this._length);\n }\n const c = t.length / 3 - 2 * (this._sectionPolygonPointsCount + 1);\n for (let h = 0; h <= this._sectionPolygonPointsCount; h++)\n r.push(c + h, c + h + this._sectionPolygonPointsCount, c + h + this._sectionPolygonPointsCount + 1), r.push(c + h, c + h + this._sectionPolygonPointsCount + 1, c + h + 1);\n }\n re.ComputeNormals(t, r, i), e.positions = t, e.normals = i, e.indices = r, e.uvs = s, e.applyToMesh(this, !0), this._autoStart && this.start();\n }\n /**\n * Start trailing mesh.\n */\n start() {\n this._running || (this._running = !0, this._beforeRenderObserver = this.getScene().onBeforeRenderObservable.add(() => {\n this.update();\n }));\n }\n /**\n * Stop trailing mesh.\n */\n stop() {\n this._beforeRenderObserver && this._running && (this._running = !1, this.getScene().onBeforeRenderObservable.remove(this._beforeRenderObserver));\n }\n /**\n * Update trailing mesh geometry.\n */\n update() {\n const e = this.getVerticesData(I.PositionKind), t = this.getVerticesData(I.NormalKind), i = this._generator.getWorldMatrix();\n if (e && t) {\n for (let a = 3 * (this._sectionPolygonPointsCount + 1); a < e.length; a++)\n e[a - 3 * (this._sectionPolygonPointsCount + 1)] = e[a] - t[a] / this._length * this.diameter;\n for (let a = 3 * (this._sectionPolygonPointsCount + 1); a < t.length; a++)\n t[a - 3 * (this._sectionPolygonPointsCount + 1)] = t[a];\n const r = e.length - 3 * (this._sectionPolygonPointsCount + 1), s = 2 * Math.PI / this._sectionPolygonPointsCount;\n for (let a = 0; a <= this._sectionPolygonPointsCount; a++) {\n const o = a !== this._sectionPolygonPointsCount ? a * s : 0;\n this._sectionVectors[a].copyFromFloats(Math.cos(o) * this.diameter, Math.sin(o) * this.diameter, 0), this._sectionNormalVectors[a].copyFromFloats(Math.cos(o), Math.sin(o), 0), _.TransformCoordinatesToRef(this._sectionVectors[a], i, this._sectionVectors[a]), _.TransformNormalToRef(this._sectionNormalVectors[a], i, this._sectionNormalVectors[a]);\n }\n for (let a = 0; a <= this._sectionPolygonPointsCount; a++)\n e[r + 3 * a] = this._sectionVectors[a].x, e[r + 3 * a + 1] = this._sectionVectors[a].y, e[r + 3 * a + 2] = this._sectionVectors[a].z, t[r + 3 * a] = this._sectionNormalVectors[a].x, t[r + 3 * a + 1] = this._sectionNormalVectors[a].y, t[r + 3 * a + 2] = this._sectionNormalVectors[a].z;\n this.updateVerticesData(I.PositionKind, e, !0, !1), this.updateVerticesData(I.NormalKind, t, !0, !1);\n }\n }\n /**\n * Returns a new TrailMesh object.\n * @param name is a string, the name given to the new mesh\n * @param newGenerator use new generator object for cloned trail mesh\n * @returns a new mesh\n */\n clone(e = \"\", t) {\n return new sc(e, t ?? this._generator, this.getScene(), this.diameter, this._length, this._autoStart);\n }\n /**\n * Serializes this trail mesh\n * @param serializationObject object to write serialization to\n */\n serialize(e) {\n super.serialize(e), e.generatorId = this._generator.id;\n }\n /**\n * Parses a serialized trail mesh\n * @param parsedMesh the serialized mesh\n * @param scene the scene to create the trail mesh in\n * @returns the created trail mesh\n */\n static Parse(e, t) {\n const i = t.getLastMeshById(e.generatorId) ?? t.getLastTransformNodeById(e.generatorId);\n if (!i)\n throw new Error(\"TrailMesh: generator not found with ID \" + e.generatorId);\n return new sc(e.name, i, t, e.diameter ?? e._diameter, e._length, e._autoStart);\n }\n}\nB._instancedMeshFactory = (n, e) => {\n const t = new d0(n, e);\n if (e.instancedBuffers) {\n t.instancedBuffers = {};\n for (const i in e.instancedBuffers)\n t.instancedBuffers[i] = e.instancedBuffers[i];\n }\n return t;\n};\nclass d0 extends er {\n /**\n * Creates a new InstancedMesh object from the mesh source.\n * @param name defines the name of the instance\n * @param source the mesh to create the instance from\n */\n constructor(e, t) {\n super(e, t.getScene()), this._indexInSourceMeshInstanceArray = -1, this._distanceToCamera = 0, t.addInstance(this), this._sourceMesh = t, this._unIndexed = t._unIndexed, this.position.copyFrom(t.position), this.rotation.copyFrom(t.rotation), this.scaling.copyFrom(t.scaling), t.rotationQuaternion && (this.rotationQuaternion = t.rotationQuaternion.clone()), this.animations = t.animations.slice();\n for (const i of t.getAnimationRanges())\n i != null && this.createAnimationRange(i.name, i.from, i.to);\n this.infiniteDistance = t.infiniteDistance, this.setPivotMatrix(t.getPivotMatrix()), this.refreshBoundingInfo(!0, !0), this._syncSubMeshes();\n }\n /**\n * @returns the string \"InstancedMesh\".\n */\n getClassName() {\n return \"InstancedMesh\";\n }\n /** Gets the list of lights affecting that mesh */\n get lightSources() {\n return this._sourceMesh._lightSources;\n }\n _resyncLightSources() {\n }\n _resyncLightSource() {\n }\n _removeLightSource() {\n }\n // Methods\n /**\n * If the source mesh receives shadows\n */\n get receiveShadows() {\n return this._sourceMesh.receiveShadows;\n }\n set receiveShadows(e) {\n var t;\n ((t = this._sourceMesh) == null ? void 0 : t.receiveShadows) !== e && ge.Warn(\"Setting receiveShadows on an instanced mesh has no effect\");\n }\n /**\n * The material of the source mesh\n */\n get material() {\n return this._sourceMesh.material;\n }\n set material(e) {\n var t;\n ((t = this._sourceMesh) == null ? void 0 : t.material) !== e && ge.Warn(\"Setting material on an instanced mesh has no effect\");\n }\n /**\n * Visibility of the source mesh\n */\n get visibility() {\n return this._sourceMesh.visibility;\n }\n set visibility(e) {\n var t;\n ((t = this._sourceMesh) == null ? void 0 : t.visibility) !== e && ge.Warn(\"Setting visibility on an instanced mesh has no effect\");\n }\n /**\n * Skeleton of the source mesh\n */\n get skeleton() {\n return this._sourceMesh.skeleton;\n }\n set skeleton(e) {\n var t;\n ((t = this._sourceMesh) == null ? void 0 : t.skeleton) !== e && ge.Warn(\"Setting skeleton on an instanced mesh has no effect\");\n }\n /**\n * Rendering ground id of the source mesh\n */\n get renderingGroupId() {\n return this._sourceMesh.renderingGroupId;\n }\n set renderingGroupId(e) {\n !this._sourceMesh || e === this._sourceMesh.renderingGroupId || ne.Warn(\"Note - setting renderingGroupId of an instanced mesh has no effect on the scene\");\n }\n /**\n * @returns the total number of vertices (integer).\n */\n getTotalVertices() {\n return this._sourceMesh ? this._sourceMesh.getTotalVertices() : 0;\n }\n /**\n * Returns a positive integer : the total number of indices in this mesh geometry.\n * @returns the number of indices or zero if the mesh has no geometry.\n */\n getTotalIndices() {\n return this._sourceMesh.getTotalIndices();\n }\n /**\n * The source mesh of the instance\n */\n get sourceMesh() {\n return this._sourceMesh;\n }\n /**\n * Creates a new InstancedMesh object from the mesh model.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\n * @param name defines the name of the new instance\n * @returns a new InstancedMesh\n */\n createInstance(e) {\n return this._sourceMesh.createInstance(e);\n }\n /**\n * Is this node ready to be used/rendered\n * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\n * @returns {boolean} is it ready\n */\n isReady(e = !1) {\n return this._sourceMesh.isReady(e, !0);\n }\n /**\n * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices.\n * @param kind kind of verticies to retrieve (eg. positions, normals, uvs, etc.)\n * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one.\n * @param forceCopy defines a boolean forcing the copy of the buffer no matter what the value of copyWhenShared is\n * @returns a float array or a Float32Array of the requested kind of data : positions, normals, uvs, etc.\n */\n getVerticesData(e, t, i) {\n return this._sourceMesh.getVerticesData(e, t, i);\n }\n /**\n * Sets the vertex data of the mesh geometry for the requested `kind`.\n * If the mesh has no geometry, a new Geometry object is set to the mesh and then passed this vertex data.\n * The `data` are either a numeric array either a Float32Array.\n * The parameter `updatable` is passed as is to the underlying Geometry object constructor (if initially none) or updater.\n * The parameter `stride` is an optional positive integer, it is usually automatically deducted from the `kind` (3 for positions or normals, 2 for UV, etc).\n * Note that a new underlying VertexBuffer object is created each call.\n * If the `kind` is the `PositionKind`, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\n *\n * Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n *\n * Returns the Mesh.\n * @param kind defines vertex data kind\n * @param data defines the data source\n * @param updatable defines if the data must be flagged as updatable (false as default)\n * @param stride defines the vertex stride (optional)\n * @returns the current mesh\n */\n setVerticesData(e, t, i, r) {\n return this.sourceMesh && this.sourceMesh.setVerticesData(e, t, i, r), this.sourceMesh;\n }\n /**\n * Updates the existing vertex data of the mesh geometry for the requested `kind`.\n * If the mesh has no geometry, it is simply returned as it is.\n * The `data` are either a numeric array either a Float32Array.\n * No new underlying VertexBuffer object is created.\n * If the `kind` is the `PositionKind` and if `updateExtends` is true, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\n * If the parameter `makeItUnique` is true, a new global geometry is created from this positions and is set to the mesh.\n *\n * Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n *\n * Returns the Mesh.\n * @param kind defines vertex data kind\n * @param data defines the data source\n * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for \"position\" kind\n * @param makeItUnique defines it the updated vertex buffer must be flagged as unique (false by default)\n * @returns the source mesh\n */\n updateVerticesData(e, t, i, r) {\n return this.sourceMesh && this.sourceMesh.updateVerticesData(e, t, i, r), this.sourceMesh;\n }\n /**\n * Sets the mesh indices.\n * Expects an array populated with integers or a typed array (Int32Array, Uint32Array, Uint16Array).\n * If the mesh has no geometry, a new Geometry object is created and set to the mesh.\n * This method creates a new index buffer each call.\n * Returns the Mesh.\n * @param indices the source data\n * @param totalVertices defines the total number of vertices referenced by indices (could be null)\n * @returns source mesh\n */\n setIndices(e, t = null) {\n return this.sourceMesh && this.sourceMesh.setIndices(e, t), this.sourceMesh;\n }\n /**\n * Boolean : True if the mesh owns the requested kind of data.\n * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :\n * - VertexBuffer.PositionKind\n * - VertexBuffer.UVKind\n * - VertexBuffer.UV2Kind\n * - VertexBuffer.UV3Kind\n * - VertexBuffer.UV4Kind\n * - VertexBuffer.UV5Kind\n * - VertexBuffer.UV6Kind\n * - VertexBuffer.ColorKind\n * - VertexBuffer.MatricesIndicesKind\n * - VertexBuffer.MatricesIndicesExtraKind\n * - VertexBuffer.MatricesWeightsKind\n * - VertexBuffer.MatricesWeightsExtraKind\n * @returns true if data kind is present\n */\n isVerticesDataPresent(e) {\n return this._sourceMesh.isVerticesDataPresent(e);\n }\n /**\n * @returns an array of indices (IndicesArray).\n */\n getIndices() {\n return this._sourceMesh.getIndices();\n }\n get _positions() {\n return this._sourceMesh._positions;\n }\n /**\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\n * This means the mesh underlying bounding box and sphere are recomputed.\n * @param applySkeleton defines whether to apply the skeleton before computing the bounding info\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\n * @returns the current mesh\n */\n refreshBoundingInfo(e = !1, t = !1) {\n if (this.hasBoundingInfo && this.getBoundingInfo().isLocked)\n return this;\n const i = this._sourceMesh.geometry ? this._sourceMesh.geometry.boundingBias : null;\n return this._refreshBoundingInfo(this._sourceMesh._getPositionData(e, t), i), this;\n }\n /** @internal */\n _preActivate() {\n return this._currentLOD && this._currentLOD._preActivate(), this;\n }\n /**\n * @internal\n */\n _activate(e, t) {\n if (super._activate(e, t), this._sourceMesh.subMeshes || ne.Warn(\"Instances should only be created for meshes with geometry.\"), this._currentLOD) {\n if (this._currentLOD._getWorldMatrixDeterminant() >= 0 != this._getWorldMatrixDeterminant() >= 0)\n return this._internalAbstractMeshDataInfo._actAsRegularMesh = !0, !0;\n if (this._internalAbstractMeshDataInfo._actAsRegularMesh = !1, this._currentLOD._registerInstanceForRenderId(this, e), t) {\n if (!this._currentLOD._internalAbstractMeshDataInfo._isActiveIntermediate)\n return this._currentLOD._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = !0, !0;\n } else if (!this._currentLOD._internalAbstractMeshDataInfo._isActive)\n return this._currentLOD._internalAbstractMeshDataInfo._onlyForInstances = !0, !0;\n }\n return !1;\n }\n /** @internal */\n _postActivate() {\n this._sourceMesh.edgesShareWithInstances && this._sourceMesh._edgesRenderer && this._sourceMesh._edgesRenderer.isEnabled && this._sourceMesh._renderingGroup ? (this._sourceMesh._renderingGroup._edgesRenderers.pushNoDuplicate(this._sourceMesh._edgesRenderer), this._sourceMesh._edgesRenderer.customInstances.push(this.getWorldMatrix())) : this._edgesRenderer && this._edgesRenderer.isEnabled && this._sourceMesh._renderingGroup && this._sourceMesh._renderingGroup._edgesRenderers.push(this._edgesRenderer);\n }\n getWorldMatrix() {\n if (this._currentLOD && this._currentLOD.billboardMode !== He.BILLBOARDMODE_NONE && this._currentLOD._masterMesh !== this) {\n this._billboardWorldMatrix || (this._billboardWorldMatrix = new L());\n const e = this._currentLOD._masterMesh;\n return this._currentLOD._masterMesh = this, z.Vector3[7].copyFrom(this._currentLOD.position), this._currentLOD.position.set(0, 0, 0), this._billboardWorldMatrix.copyFrom(this._currentLOD.computeWorldMatrix(!0)), this._currentLOD.position.copyFrom(z.Vector3[7]), this._currentLOD._masterMesh = e, this._billboardWorldMatrix;\n }\n return super.getWorldMatrix();\n }\n get isAnInstance() {\n return !0;\n }\n /**\n * Returns the current associated LOD AbstractMesh.\n * @param camera defines the camera to use to pick the LOD level\n * @returns a Mesh or `null` if no LOD is associated with the AbstractMesh\n */\n getLOD(e) {\n if (!e)\n return this;\n const t = this.sourceMesh.getLODLevels();\n if (!t || t.length === 0)\n this._currentLOD = this.sourceMesh;\n else {\n const i = this.getBoundingInfo();\n this._currentLOD = this.sourceMesh.getLOD(e, i.boundingSphere);\n }\n return this._currentLOD;\n }\n /**\n * @internal\n */\n _preActivateForIntermediateRendering(e) {\n return this.sourceMesh._preActivateForIntermediateRendering(e);\n }\n /** @internal */\n _syncSubMeshes() {\n if (this.releaseSubMeshes(), this._sourceMesh.subMeshes)\n for (let e = 0; e < this._sourceMesh.subMeshes.length; e++)\n this._sourceMesh.subMeshes[e].clone(this, this._sourceMesh);\n return this;\n }\n /** @internal */\n _generatePointsArray() {\n return this._sourceMesh._generatePointsArray();\n }\n /** @internal */\n _updateBoundingInfo() {\n return this.hasBoundingInfo ? this.getBoundingInfo().update(this.worldMatrixFromCache) : this.buildBoundingInfo(this.absolutePosition, this.absolutePosition, this.worldMatrixFromCache), this._updateSubMeshesBoundingInfo(this.worldMatrixFromCache), this;\n }\n /**\n * Creates a new InstancedMesh from the current mesh.\n *\n * Returns the clone.\n * @param name the cloned mesh name\n * @param newParent the optional Node to parent the clone to.\n * @param doNotCloneChildren if `true` the model children aren't cloned.\n * @param newSourceMesh if set this mesh will be used as the source mesh instead of ths instance's one\n * @returns the clone\n */\n clone(e, t = null, i, r) {\n const s = (r || this._sourceMesh).createInstance(e);\n if (Dn.DeepCopy(this, s, [\n \"name\",\n \"subMeshes\",\n \"uniqueId\",\n \"parent\",\n \"lightSources\",\n \"receiveShadows\",\n \"material\",\n \"visibility\",\n \"skeleton\",\n \"sourceMesh\",\n \"isAnInstance\",\n \"facetNb\",\n \"isFacetDataEnabled\",\n \"isBlocked\",\n \"useBones\",\n \"hasInstances\",\n \"collider\",\n \"edgesRenderer\",\n \"forward\",\n \"up\",\n \"right\",\n \"absolutePosition\",\n \"absoluteScaling\",\n \"absoluteRotationQuaternion\",\n \"isWorldMatrixFrozen\",\n \"nonUniformScaling\",\n \"behaviors\",\n \"worldMatrixFromCache\",\n \"hasThinInstances\",\n \"hasBoundingInfo\"\n ], []), this.refreshBoundingInfo(), t && (s.parent = t), !i)\n for (let a = 0; a < this.getScene().meshes.length; a++) {\n const o = this.getScene().meshes[a];\n o.parent === this && o.clone(o.name, s);\n }\n return s.computeWorldMatrix(!0), this.onClonedObservable.notifyObservers(s), s;\n }\n /**\n * Disposes the InstancedMesh.\n * Returns nothing.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n this._sourceMesh.removeInstance(this), super.dispose(e, t);\n }\n /**\n * @internal\n */\n _serializeAsParent(e) {\n super._serializeAsParent(e), e.parentId = this._sourceMesh.uniqueId, e.parentInstanceIndex = this._indexInSourceMeshInstanceArray;\n }\n /**\n * Instantiate (when possible) or clone that node with its hierarchy\n * @param newParent defines the new parent to use for the instance (or clone)\n * @param options defines options to configure how copy is done\n * @param options.doNotInstantiate defines if the model must be instantiated or just cloned\n * @param options.newSourcedMesh newSourcedMesh the new source mesh for the instance (or clone)\n * @param onNewNodeCreated defines an option callback to call when a clone or an instance is created\n * @returns an instance (or a clone) of the current node with its hierarchy\n */\n instantiateHierarchy(e = null, t, i) {\n const r = this.clone(\"Clone of \" + (this.name || this.id), e || this.parent, !0, t && t.newSourcedMesh);\n r && i && i(this, r);\n for (const s of this.getChildTransformNodes(!0))\n s.instantiateHierarchy(r, t, i);\n return r;\n }\n}\nB.prototype.registerInstancedBuffer = function(n, e) {\n var t, i;\n if ((i = (t = this._userInstancedBuffersStorage) == null ? void 0 : t.vertexBuffers[n]) == null || i.dispose(), !this.instancedBuffers) {\n this.instancedBuffers = {};\n for (const r of this.instances)\n r.instancedBuffers = {};\n }\n this._userInstancedBuffersStorage || (this._userInstancedBuffersStorage = {\n data: {},\n vertexBuffers: {},\n strides: {},\n sizes: {},\n vertexArrayObjects: this.getEngine().getCaps().vertexArrayObject ? {} : void 0\n }), this.instancedBuffers[n] = null, this._userInstancedBuffersStorage.strides[n] = e, this._userInstancedBuffersStorage.sizes[n] = e * 32, this._userInstancedBuffersStorage.data[n] = new Float32Array(this._userInstancedBuffersStorage.sizes[n]), this._userInstancedBuffersStorage.vertexBuffers[n] = new I(this.getEngine(), this._userInstancedBuffersStorage.data[n], n, !0, !1, e, !0);\n for (const r of this.instances)\n r.instancedBuffers[n] = null;\n this._invalidateInstanceVertexArrayObject(), this._markSubMeshesAsAttributesDirty();\n};\nB.prototype._processInstancedBuffers = function(n, e) {\n const t = n ? n.length : 0;\n for (const i in this.instancedBuffers) {\n let r = this._userInstancedBuffersStorage.sizes[i];\n const s = this._userInstancedBuffersStorage.strides[i], a = (t + 1) * s;\n for (; r < a; )\n r *= 2;\n this._userInstancedBuffersStorage.data[i].length != r && (this._userInstancedBuffersStorage.data[i] = new Float32Array(r), this._userInstancedBuffersStorage.sizes[i] = r, this._userInstancedBuffersStorage.vertexBuffers[i] && (this._userInstancedBuffersStorage.vertexBuffers[i].dispose(), this._userInstancedBuffersStorage.vertexBuffers[i] = null));\n const o = this._userInstancedBuffersStorage.data[i];\n let l = 0;\n if (e) {\n const c = this.instancedBuffers[i];\n c.toArray ? c.toArray(o, l) : c.copyToArray ? c.copyToArray(o, l) : o[l] = c, l += s;\n }\n for (let c = 0; c < t; c++) {\n const u = n[c].instancedBuffers[i];\n u.toArray ? u.toArray(o, l) : u.copyToArray ? u.copyToArray(o, l) : o[l] = u, l += s;\n }\n this._userInstancedBuffersStorage.vertexBuffers[i] ? this._userInstancedBuffersStorage.vertexBuffers[i].updateDirectly(o, 0) : (this._userInstancedBuffersStorage.vertexBuffers[i] = new I(this.getEngine(), this._userInstancedBuffersStorage.data[i], i, !0, !1, s, !0), this._invalidateInstanceVertexArrayObject());\n }\n};\nB.prototype._invalidateInstanceVertexArrayObject = function() {\n if (!(!this._userInstancedBuffersStorage || this._userInstancedBuffersStorage.vertexArrayObjects === void 0)) {\n for (const n in this._userInstancedBuffersStorage.vertexArrayObjects)\n this.getEngine().releaseVertexArrayObject(this._userInstancedBuffersStorage.vertexArrayObjects[n]);\n this._userInstancedBuffersStorage.vertexArrayObjects = {};\n }\n};\nB.prototype._disposeInstanceSpecificData = function() {\n for (this._instanceDataStorage.instancesBuffer && (this._instanceDataStorage.instancesBuffer.dispose(), this._instanceDataStorage.instancesBuffer = null); this.instances.length; )\n this.instances[0].dispose();\n for (const n in this.instancedBuffers)\n this._userInstancedBuffersStorage.vertexBuffers[n] && this._userInstancedBuffersStorage.vertexBuffers[n].dispose();\n this._invalidateInstanceVertexArrayObject(), this.instancedBuffers = {};\n};\nconst ZI = \"clipPlaneFragmentDeclaration\", jI = `#ifdef CLIPPLANE\nvarying float fClipDistance;\n#endif\n#ifdef CLIPPLANE2\nvarying float fClipDistance2;\n#endif\n#ifdef CLIPPLANE3\nvarying float fClipDistance3;\n#endif\n#ifdef CLIPPLANE4\nvarying float fClipDistance4;\n#endif\n#ifdef CLIPPLANE5\nvarying float fClipDistance5;\n#endif\n#ifdef CLIPPLANE6\nvarying float fClipDistance6;\n#endif\n`;\nY.IncludesShadersStore[ZI] = jI;\nconst QI = \"fogFragmentDeclaration\", JI = `#ifdef FOG\n#define FOGMODE_NONE 0.\n#define FOGMODE_EXP 1.\n#define FOGMODE_EXP2 2.\n#define FOGMODE_LINEAR 3.\n#define E 2.71828\nuniform vec4 vFogInfos;uniform vec3 vFogColor;varying vec3 vFogDistance;float CalcFogFactor()\n{float fogCoeff=1.0;float fogStart=vFogInfos.y;float fogEnd=vFogInfos.z;float fogDensity=vFogInfos.w;float fogDistance=length(vFogDistance);if (FOGMODE_LINEAR==vFogInfos.x)\n{fogCoeff=(fogEnd-fogDistance)/(fogEnd-fogStart);}\nelse if (FOGMODE_EXP==vFogInfos.x)\n{fogCoeff=1.0/pow(E,fogDistance*fogDensity);}\nelse if (FOGMODE_EXP2==vFogInfos.x)\n{fogCoeff=1.0/pow(E,fogDistance*fogDistance*fogDensity*fogDensity);}\nreturn clamp(fogCoeff,0.0,1.0);}\n#endif\n`;\nY.IncludesShadersStore[QI] = JI;\nconst $I = \"clipPlaneFragment\", eb = `#if defined(CLIPPLANE) || defined(CLIPPLANE2) || defined(CLIPPLANE3) || defined(CLIPPLANE4) || defined(CLIPPLANE5) || defined(CLIPPLANE6)\nif (false) {}\n#endif\n#ifdef CLIPPLANE\nelse if (fClipDistance>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE2\nelse if (fClipDistance2>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE3\nelse if (fClipDistance3>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE4\nelse if (fClipDistance4>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE5\nelse if (fClipDistance5>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE6\nelse if (fClipDistance6>0.0)\n{discard;}\n#endif\n`;\nY.IncludesShadersStore[$I] = eb;\nconst tb = \"fogFragment\", ib = `#ifdef FOG\nfloat fog=CalcFogFactor();\n#ifdef PBR\nfog=toLinearSpace(fog);\n#endif\ncolor.rgb=mix(vFogColor,color.rgb,fog);\n#endif\n`;\nY.IncludesShadersStore[tb] = ib;\nconst rb = \"colorPixelShader\", sb = `#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\n#define VERTEXCOLOR\nvarying vec4 vColor;\n#else\nuniform vec4 color;\n#endif\n#include\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\ngl_FragColor=vColor;\n#else\ngl_FragColor=color;\n#endif\n#include(color,gl_FragColor)\n#define CUSTOM_FRAGMENT_MAIN_END\n}`;\nY.ShadersStore[rb] = sb;\nconst nb = \"clipPlaneVertexDeclaration\", ab = `#ifdef CLIPPLANE\nuniform vec4 vClipPlane;varying float fClipDistance;\n#endif\n#ifdef CLIPPLANE2\nuniform vec4 vClipPlane2;varying float fClipDistance2;\n#endif\n#ifdef CLIPPLANE3\nuniform vec4 vClipPlane3;varying float fClipDistance3;\n#endif\n#ifdef CLIPPLANE4\nuniform vec4 vClipPlane4;varying float fClipDistance4;\n#endif\n#ifdef CLIPPLANE5\nuniform vec4 vClipPlane5;varying float fClipDistance5;\n#endif\n#ifdef CLIPPLANE6\nuniform vec4 vClipPlane6;varying float fClipDistance6;\n#endif\n`;\nY.IncludesShadersStore[nb] = ab;\nconst ob = \"fogVertexDeclaration\", lb = `#ifdef FOG\nvarying vec3 vFogDistance;\n#endif\n`;\nY.IncludesShadersStore[ob] = lb;\nconst cb = \"clipPlaneVertex\", hb = `#ifdef CLIPPLANE\nfClipDistance=dot(worldPos,vClipPlane);\n#endif\n#ifdef CLIPPLANE2\nfClipDistance2=dot(worldPos,vClipPlane2);\n#endif\n#ifdef CLIPPLANE3\nfClipDistance3=dot(worldPos,vClipPlane3);\n#endif\n#ifdef CLIPPLANE4\nfClipDistance4=dot(worldPos,vClipPlane4);\n#endif\n#ifdef CLIPPLANE5\nfClipDistance5=dot(worldPos,vClipPlane5);\n#endif\n#ifdef CLIPPLANE6\nfClipDistance6=dot(worldPos,vClipPlane6);\n#endif\n`;\nY.IncludesShadersStore[cb] = hb;\nconst ub = \"fogVertex\", fb = `#ifdef FOG\nvFogDistance=(view*worldPos).xyz;\n#endif\n`;\nY.IncludesShadersStore[ub] = fb;\nconst db = \"vertexColorMixing\", pb = `#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvColor=vec4(1.0);\n#ifdef VERTEXCOLOR\n#ifdef VERTEXALPHA\nvColor*=color;\n#else\nvColor.rgb*=color.rgb;\n#endif\n#endif\n#ifdef INSTANCESCOLOR\nvColor*=instanceColor;\n#endif\n#endif\n`;\nY.IncludesShadersStore[db] = pb;\nconst gb = \"colorVertexShader\", mb = `attribute vec3 position;\n#ifdef VERTEXCOLOR\nattribute vec4 color;\n#endif\n#include\n#include\n#include\n#include\n#ifdef FOG\nuniform mat4 view;\n#endif\n#include\nuniform mat4 viewProjection;\n#ifdef MULTIVIEW\nuniform mat4 viewProjectionR;\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\n#include\n#include\n#include\nvec4 worldPos=finalWorld*vec4(position,1.0);\n#ifdef MULTIVIEW\nif (gl_ViewID_OVR==0u) {gl_Position=viewProjection*worldPos;} else {gl_Position=viewProjectionR*worldPos;}\n#else\ngl_Position=viewProjection*worldPos;\n#endif\n#include\n#include\n#include\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[gb] = mb;\nB._LinesMeshParser = (n, e) => Pa.Parse(n, e);\nclass Pa extends B {\n _isShaderMaterial(e) {\n return e.getClassName() === \"ShaderMaterial\";\n }\n /**\n * Creates a new LinesMesh\n * @param name defines the name\n * @param scene defines the hosting scene\n * @param parent defines the parent mesh if any\n * @param source defines the optional source LinesMesh used to clone data from\n * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False.\n * When false, achieved by calling a clone(), also passing False.\n * This will make creation of children, recursive.\n * @param useVertexColor defines if this LinesMesh supports vertex color\n * @param useVertexAlpha defines if this LinesMesh supports vertex alpha\n * @param material material to use to draw the line. If not provided, will create a new one\n */\n constructor(e, t = null, i = null, r = null, s, a, o, l) {\n super(e, t, i, r, s), this.useVertexColor = a, this.useVertexAlpha = o, this.color = new Ne(1, 1, 1), this.alpha = 1, r && (this.color = r.color.clone(), this.alpha = r.alpha, this.useVertexColor = r.useVertexColor, this.useVertexAlpha = r.useVertexAlpha), this.intersectionThreshold = 0.1;\n const c = [], h = {\n attributes: [I.PositionKind],\n uniforms: [\"world\", \"viewProjection\"],\n needAlphaBlending: !0,\n defines: c,\n useClipPlane: null\n };\n o === !1 ? h.needAlphaBlending = !1 : h.defines.push(\"#define VERTEXALPHA\"), a ? (h.defines.push(\"#define VERTEXCOLOR\"), h.attributes.push(I.ColorKind)) : (h.uniforms.push(\"color\"), this._color4 = new et()), l ? this.material = l : (this.material = new ks(\"colorShader\", this.getScene(), \"color\", h, !1), this.material.doNotSerialize = !0);\n }\n isReady() {\n return this._lineMaterial.isReady(this, !!this._userInstancedBuffersStorage || this.hasThinInstances) ? super.isReady() : !1;\n }\n /**\n * @returns the string \"LineMesh\"\n */\n getClassName() {\n return \"LinesMesh\";\n }\n /**\n * @internal\n */\n get material() {\n return this._lineMaterial;\n }\n /**\n * @internal\n */\n set material(e) {\n this._lineMaterial = e, this._lineMaterial.fillMode = ie.LineListDrawMode;\n }\n /**\n * @internal\n */\n get checkCollisions() {\n return !1;\n }\n set checkCollisions(e) {\n }\n /**\n * @internal\n */\n _bind(e, t) {\n if (!this._geometry)\n return this;\n const i = this.isUnIndexed ? null : this._geometry.getIndexBuffer();\n if (!this._userInstancedBuffersStorage || this.hasThinInstances ? this._geometry._bind(t, i) : this._geometry._bind(t, i, this._userInstancedBuffersStorage.vertexBuffers, this._userInstancedBuffersStorage.vertexArrayObjects), !this.useVertexColor && this._isShaderMaterial(this._lineMaterial)) {\n const { r, g: s, b: a } = this.color;\n this._color4.set(r, s, a, this.alpha), this._lineMaterial.setColor4(\"color\", this._color4);\n }\n return this;\n }\n /**\n * @internal\n */\n _draw(e, t, i) {\n if (!this._geometry || !this._geometry.getVertexBuffers() || !this._unIndexed && !this._geometry.getIndexBuffer())\n return this;\n const r = this.getScene().getEngine();\n return this._unIndexed ? r.drawArraysType(ie.LineListDrawMode, e.verticesStart, e.verticesCount, i) : r.drawElementsType(ie.LineListDrawMode, e.indexStart, e.indexCount, i), this;\n }\n /**\n * Disposes of the line mesh\n * @param doNotRecurse If children should be disposed\n * @param disposeMaterialAndTextures This parameter is not used by the LineMesh class\n * @param doNotDisposeMaterial If the material should not be disposed (default: false, meaning the material is disposed)\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n dispose(e, t = !1, i) {\n i || this._lineMaterial.dispose(!1, !1, !0), super.dispose(e);\n }\n /**\n * Returns a new LineMesh object cloned from the current one.\n * @param name defines the cloned mesh name\n * @param newParent defines the new mesh parent\n * @param doNotCloneChildren if set to true, none of the mesh children are cloned (false by default)\n * @returns the new mesh\n */\n clone(e, t = null, i) {\n return new Pa(e, this.getScene(), t, this, i);\n }\n /**\n * Creates a new InstancedLinesMesh object from the mesh model.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\n * @param name defines the name of the new instance\n * @returns a new InstancedLinesMesh\n */\n createInstance(e) {\n const t = new _b(e, this);\n if (this.instancedBuffers) {\n t.instancedBuffers = {};\n for (const i in this.instancedBuffers)\n t.instancedBuffers[i] = this.instancedBuffers[i];\n }\n return t;\n }\n /**\n * Serializes this ground mesh\n * @param serializationObject object to write serialization to\n */\n serialize(e) {\n super.serialize(e), e.color = this.color.asArray(), e.alpha = this.alpha;\n }\n /**\n * Parses a serialized ground mesh\n * @param parsedMesh the serialized mesh\n * @param scene the scene to create the ground mesh in\n * @returns the created ground mesh\n */\n static Parse(e, t) {\n const i = new Pa(e.name, t);\n return i.color = Ne.FromArray(e.color), i.alpha = e.alpha, i;\n }\n}\nclass _b extends d0 {\n constructor(e, t) {\n super(e, t), this.intersectionThreshold = t.intersectionThreshold;\n }\n /**\n * @returns the string \"InstancedLinesMesh\".\n */\n getClassName() {\n return \"InstancedLinesMesh\";\n }\n}\nfunction p0(n) {\n let e = n.pathArray;\n const t = n.closeArray || !1, i = n.closePath || !1, r = n.invertUV || !1, s = Math.floor(e[0].length / 2);\n let a = n.offset || s;\n a = a > s ? s : Math.floor(a);\n const o = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, l = n.uvs, c = n.colors, h = [], u = [], f = [], d = [], p = [], g = [], m = [], v = [];\n let E;\n const C = [], T = [];\n let R, x, S;\n if (e.length < 2) {\n const ue = [], Ye = [];\n for (x = 0; x < e[0].length - a; x++)\n ue.push(e[0][x]), Ye.push(e[0][x + a]);\n e = [ue, Ye];\n }\n let M = 0;\n const N = i ? 1 : 0, F = t ? 1 : 0;\n let U, H;\n E = e[0].length;\n let q, Z;\n for (R = 0; R < e.length + F; R++) {\n for (m[R] = 0, p[R] = [0], U = R === e.length ? e[0] : e[R], H = U.length, E = E < H ? E : H, S = 0; S < H; )\n h.push(U[S].x, U[S].y, U[S].z), S > 0 && (q = U[S].subtract(U[S - 1]).length(), Z = q + m[R], p[R].push(Z), m[R] = Z), S++;\n i && (S--, h.push(U[0].x, U[0].y, U[0].z), q = U[S].subtract(U[0]).length(), Z = q + m[R], p[R].push(Z), m[R] = Z), C[R] = H + N, T[R] = M, M += H + N;\n }\n let k, Q, ce = null, de = null;\n for (x = 0; x < E + N; x++)\n for (v[x] = 0, g[x] = [0], R = 0; R < e.length - 1 + F; R++)\n k = e[R], Q = R === e.length - 1 ? e[0] : e[R + 1], x === E ? (ce = k[0], de = Q[0]) : (ce = k[x], de = Q[x]), q = de.subtract(ce).length(), Z = q + v[x], g[x].push(Z), v[x] = Z;\n let j, J;\n if (l)\n for (R = 0; R < l.length; R++)\n d.push(l[R].x, nt.UseOpenGLOrientationForUV ? 1 - l[R].y : l[R].y);\n else\n for (R = 0; R < e.length + F; R++)\n for (x = 0; x < E + N; x++)\n j = m[R] != 0 ? p[R][x] / m[R] : 0, J = v[x] != 0 ? g[x][R] / v[x] : 0, r ? d.push(J, j) : d.push(j, nt.UseOpenGLOrientationForUV ? 1 - J : J);\n R = 0;\n let O = 0, G = C[R] - 1, ee = C[R + 1] - 1, _e = G < ee ? G : ee, Oe = T[1] - T[0];\n const ze = C.length - 1;\n for (; O <= _e && R < ze; )\n u.push(O, O + Oe, O + 1), u.push(O + Oe + 1, O + 1, O + Oe), O += 1, O === _e && (R++, Oe = T[R + 1] - T[R], G = C[R] - 1, ee = C[R + 1] - 1, O = T[R], _e = G < ee ? G + O : ee + O);\n if (re.ComputeNormals(h, u, f), i) {\n let ue = 0, Ye = 0;\n for (R = 0; R < e.length; R++) {\n ue = T[R] * 3, R + 1 < e.length ? Ye = (T[R + 1] - 1) * 3 : Ye = f.length - 3, f[ue] = (f[ue] + f[Ye]) * 0.5, f[ue + 1] = (f[ue + 1] + f[Ye + 1]) * 0.5, f[ue + 2] = (f[ue + 2] + f[Ye + 2]) * 0.5;\n const lt = Math.sqrt(f[ue] * f[ue] + f[ue + 1] * f[ue + 1] + f[ue + 2] * f[ue + 2]);\n f[ue] /= lt, f[ue + 1] /= lt, f[ue + 2] /= lt, f[Ye] = f[ue], f[Ye + 1] = f[ue + 1], f[Ye + 2] = f[ue + 2];\n }\n }\n if (t) {\n let ue = T[0] * 3, Ye = T[e.length] * 3;\n for (x = 0; x < E + N; x++) {\n f[ue] = (f[ue] + f[Ye]) * 0.5, f[ue + 1] = (f[ue + 1] + f[Ye + 1]) * 0.5, f[ue + 2] = (f[ue + 2] + f[Ye + 2]) * 0.5;\n const lt = Math.sqrt(f[ue] * f[ue] + f[ue + 1] * f[ue + 1] + f[ue + 2] * f[ue + 2]);\n f[ue] /= lt, f[ue + 1] /= lt, f[ue + 2] /= lt, f[Ye] = f[ue], f[Ye + 1] = f[ue + 1], f[Ye + 2] = f[ue + 2], ue += 3, Ye += 3;\n }\n }\n re._ComputeSides(o, h, u, f, d, n.frontUVs, n.backUVs);\n let fe = null;\n if (c) {\n fe = new Float32Array(c.length * 4);\n for (let ue = 0; ue < c.length; ue++)\n fe[ue * 4] = c[ue].r, fe[ue * 4 + 1] = c[ue].g, fe[ue * 4 + 2] = c[ue].b, fe[ue * 4 + 3] = c[ue].a;\n }\n const Te = new re(), Fe = new Float32Array(h), Se = new Float32Array(f), qe = new Float32Array(d);\n return Te.indices = u, Te.positions = Fe, Te.normals = Se, Te.uvs = qe, fe && Te.set(fe, I.ColorKind), i && (Te._idx = T), Te;\n}\nfunction Oa(n, e, t = null) {\n const i = e.pathArray, r = e.closeArray, s = e.closePath, a = B._GetDefaultSideOrientation(e.sideOrientation), o = e.instance, l = e.updatable;\n if (o) {\n const c = z.Vector3[0].setAll(Number.MAX_VALUE), h = z.Vector3[1].setAll(-Number.MAX_VALUE), u = (d) => {\n let p = i[0].length;\n const g = o;\n let m = 0;\n const v = g._originalBuilderSideOrientation === B.DOUBLESIDE ? 2 : 1;\n for (let E = 1; E <= v; ++E)\n for (let C = 0; C < i.length; ++C) {\n const T = i[C], R = T.length;\n p = p < R ? p : R;\n for (let x = 0; x < p; ++x) {\n const S = T[x];\n d[m] = S.x, d[m + 1] = S.y, d[m + 2] = S.z, c.minimizeInPlaceFromFloats(S.x, S.y, S.z), h.maximizeInPlaceFromFloats(S.x, S.y, S.z), m += 3;\n }\n if (g._creationDataStorage && g._creationDataStorage.closePath) {\n const x = T[0];\n d[m] = x.x, d[m + 1] = x.y, d[m + 2] = x.z, m += 3;\n }\n }\n }, f = o.getVerticesData(I.PositionKind);\n if (u(f), o.hasBoundingInfo ? o.getBoundingInfo().reConstruct(c, h, o._worldMatrix) : o.buildBoundingInfo(c, h, o._worldMatrix), o.updateVerticesData(I.PositionKind, f, !1, !1), e.colors) {\n const d = o.getVerticesData(I.ColorKind);\n for (let p = 0, g = 0; p < e.colors.length; p++, g += 4) {\n const m = e.colors[p];\n d[g] = m.r, d[g + 1] = m.g, d[g + 2] = m.b, d[g + 3] = m.a;\n }\n o.updateVerticesData(I.ColorKind, d, !1, !1);\n }\n if (e.uvs) {\n const d = o.getVerticesData(I.UVKind);\n for (let p = 0; p < e.uvs.length; p++)\n d[p * 2] = e.uvs[p].x, d[p * 2 + 1] = nt.UseOpenGLOrientationForUV ? 1 - e.uvs[p].y : e.uvs[p].y;\n o.updateVerticesData(I.UVKind, d, !1, !1);\n }\n if (!o.areNormalsFrozen || o.isFacetDataEnabled) {\n const d = o.getIndices(), p = o.getVerticesData(I.NormalKind), g = o.isFacetDataEnabled ? o.getFacetDataParameters() : null;\n if (re.ComputeNormals(f, d, p, g), o._creationDataStorage && o._creationDataStorage.closePath) {\n let m = 0, v = 0;\n for (let E = 0; E < i.length; E++)\n m = o._creationDataStorage.idx[E] * 3, E + 1 < i.length ? v = (o._creationDataStorage.idx[E + 1] - 1) * 3 : v = p.length - 3, p[m] = (p[m] + p[v]) * 0.5, p[m + 1] = (p[m + 1] + p[v + 1]) * 0.5, p[m + 2] = (p[m + 2] + p[v + 2]) * 0.5, p[v] = p[m], p[v + 1] = p[m + 1], p[v + 2] = p[m + 2];\n }\n o.areNormalsFrozen || o.updateVerticesData(I.NormalKind, p, !1, !1);\n }\n return o;\n } else {\n const c = new B(n, t);\n c._originalBuilderSideOrientation = a, c._creationDataStorage = new o0();\n const h = p0(e);\n return s && (c._creationDataStorage.idx = h._idx), c._creationDataStorage.closePath = s, c._creationDataStorage.closeArray = r, h.applyToMesh(c, l), c;\n }\n}\nre.CreateRibbon = p0;\nB.CreateRibbon = (n, e, t = !1, i, r, s, a = !1, o, l) => Oa(n, {\n pathArray: e,\n closeArray: t,\n closePath: i,\n offset: r,\n updatable: a,\n sideOrientation: o,\n instance: l\n}, s);\nfunction _f(n) {\n const e = [], t = [], i = [], r = [], s = n.radius || 0.5, a = n.tessellation || 64, o = n.arc && (n.arc <= 0 || n.arc > 1) ? 1 : n.arc || 1, l = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE;\n e.push(0, 0, 0), r.push(0.5, 0.5);\n const c = Math.PI * 2 * o, h = o === 1 ? c / a : c / (a - 1);\n let u = 0;\n for (let p = 0; p < a; p++) {\n const g = Math.cos(u), m = Math.sin(u), v = (g + 1) / 2, E = (1 - m) / 2;\n e.push(s * g, s * m, 0), r.push(v, nt.UseOpenGLOrientationForUV ? 1 - E : E), u += h;\n }\n o === 1 && (e.push(e[3], e[4], e[5]), r.push(r[2], nt.UseOpenGLOrientationForUV ? 1 - r[3] : r[3]));\n const f = e.length / 3;\n for (let p = 1; p < f - 1; p++)\n t.push(p + 1, 0, p);\n re.ComputeNormals(e, t, i), re._ComputeSides(l, e, t, i, r, n.frontUVs, n.backUVs);\n const d = new re();\n return d.indices = t, d.positions = e, d.normals = i, d.uvs = r, d;\n}\nfunction g0(n, e = {}, t = null) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, _f(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateDisc = _f;\nB.CreateDisc = (n, e, t, i = null, r, s) => g0(n, {\n radius: e,\n tessellation: t,\n sideOrientation: s,\n updatable: r\n}, i);\nfunction Ns(n) {\n const e = [], t = [], i = [], r = [];\n let s, a;\n const o = n.width || 1, l = n.height || 1, c = (n.subdivisionsX || n.subdivisions || 1) | 0, h = (n.subdivisionsY || n.subdivisions || 1) | 0;\n for (s = 0; s <= h; s++)\n for (a = 0; a <= c; a++) {\n const f = new _(a * o / c - o / 2, 0, (h - s) * l / h - l / 2), d = new _(0, 1, 0);\n t.push(f.x, f.y, f.z), i.push(d.x, d.y, d.z), r.push(a / c, nt.UseOpenGLOrientationForUV ? s / h : 1 - s / h);\n }\n for (s = 0; s < h; s++)\n for (a = 0; a < c; a++)\n e.push(a + 1 + (s + 1) * (c + 1)), e.push(a + 1 + s * (c + 1)), e.push(a + s * (c + 1)), e.push(a + (s + 1) * (c + 1)), e.push(a + 1 + (s + 1) * (c + 1)), e.push(a + s * (c + 1));\n const u = new re();\n return u.indices = e, u.positions = t, u.normals = i, u.uvs = r, u;\n}\nfunction m0(n) {\n const e = n.xmin !== void 0 && n.xmin !== null ? n.xmin : -1, t = n.zmin !== void 0 && n.zmin !== null ? n.zmin : -1, i = n.xmax !== void 0 && n.xmax !== null ? n.xmax : 1, r = n.zmax !== void 0 && n.zmax !== null ? n.zmax : 1, s = n.subdivisions || { w: 1, h: 1 }, a = n.precision || { w: 1, h: 1 }, o = [], l = [], c = [], h = [];\n let u, f, d, p;\n s.h = s.h < 1 ? 1 : s.h, s.w = s.w < 1 ? 1 : s.w, a.w = a.w < 1 ? 1 : a.w, a.h = a.h < 1 ? 1 : a.h;\n const g = {\n w: (i - e) / s.w,\n h: (r - t) / s.h\n };\n function m(E, C, T, R) {\n const x = l.length / 3, S = a.w + 1;\n for (u = 0; u < a.h; u++)\n for (f = 0; f < a.w; f++) {\n const F = [x + f + u * S, x + (f + 1) + u * S, x + (f + 1) + (u + 1) * S, x + f + (u + 1) * S];\n o.push(F[1]), o.push(F[2]), o.push(F[3]), o.push(F[0]), o.push(F[1]), o.push(F[3]);\n }\n const M = _.Zero(), N = new _(0, 1, 0);\n for (u = 0; u <= a.h; u++)\n for (M.z = u * (R - C) / a.h + C, f = 0; f <= a.w; f++)\n M.x = f * (T - E) / a.w + E, M.y = 0, l.push(M.x, M.y, M.z), c.push(N.x, N.y, N.z), h.push(f / a.w, u / a.h);\n }\n for (d = 0; d < s.h; d++)\n for (p = 0; p < s.w; p++)\n m(e + p * g.w, t + d * g.h, e + (p + 1) * g.w, t + (d + 1) * g.h);\n const v = new re();\n return v.indices = o, v.positions = l, v.normals = c, v.uvs = h, v;\n}\nfunction _0(n) {\n const e = [], t = [], i = [], r = [];\n let s, a;\n const o = n.colorFilter || new Ne(0.3, 0.59, 0.11), l = n.alphaFilter || 0;\n let c = !1;\n if (n.minHeight > n.maxHeight) {\n c = !0;\n const u = n.maxHeight;\n n.maxHeight = n.minHeight, n.minHeight = u;\n }\n for (s = 0; s <= n.subdivisions; s++)\n for (a = 0; a <= n.subdivisions; a++) {\n const u = new _(a * n.width / n.subdivisions - n.width / 2, 0, (n.subdivisions - s) * n.height / n.subdivisions - n.height / 2), f = (u.x + n.width / 2) / n.width * (n.bufferWidth - 1) | 0, d = (1 - (u.z + n.height / 2) / n.height) * (n.bufferHeight - 1) | 0, p = (f + d * n.bufferWidth) * 4;\n let g = n.buffer[p] / 255, m = n.buffer[p + 1] / 255, v = n.buffer[p + 2] / 255;\n const E = n.buffer[p + 3] / 255;\n c && (g = 1 - g, m = 1 - m, v = 1 - v);\n const C = g * o.r + m * o.g + v * o.b;\n E >= l ? u.y = n.minHeight + (n.maxHeight - n.minHeight) * C : u.y = n.minHeight - xt, n.heightBuffer && (n.heightBuffer[s * (n.subdivisions + 1) + a] = u.y), t.push(u.x, u.y, u.z), i.push(0, 0, 0), r.push(a / n.subdivisions, 1 - s / n.subdivisions);\n }\n for (s = 0; s < n.subdivisions; s++)\n for (a = 0; a < n.subdivisions; a++) {\n const u = a + 1 + (s + 1) * (n.subdivisions + 1), f = a + 1 + s * (n.subdivisions + 1), d = a + s * (n.subdivisions + 1), p = a + (s + 1) * (n.subdivisions + 1), g = t[u * 3 + 1] >= n.minHeight, m = t[f * 3 + 1] >= n.minHeight, v = t[d * 3 + 1] >= n.minHeight;\n g && m && v && (e.push(u), e.push(f), e.push(d)), t[p * 3 + 1] >= n.minHeight && g && v && (e.push(p), e.push(u), e.push(d));\n }\n re.ComputeNormals(t, e, i);\n const h = new re();\n return h.indices = e, h.positions = t, h.normals = i, h.uvs = r, h;\n}\nfunction Eb(n, e = {}, t) {\n const i = new qo(n, t);\n return i._setReady(!1), i._subdivisionsX = e.subdivisionsX || e.subdivisions || 1, i._subdivisionsY = e.subdivisionsY || e.subdivisions || 1, i._width = e.width || 1, i._height = e.height || 1, i._maxX = i._width / 2, i._maxZ = i._height / 2, i._minX = -i._maxX, i._minZ = -i._maxZ, Ns(e).applyToMesh(i, e.updatable), i._setReady(!0), i;\n}\nfunction vb(n, e, t = null) {\n const i = new B(n, t);\n return m0(e).applyToMesh(i, e.updatable), i;\n}\nfunction Tb(n, e, t = {}, i = null) {\n const r = t.width || 10, s = t.height || 10, a = t.subdivisions || 1, o = t.minHeight || 0, l = t.maxHeight || 1, c = t.colorFilter || new Ne(0.3, 0.59, 0.11), h = t.alphaFilter || 0, u = t.updatable, f = t.onReady;\n i = i || st.LastCreatedScene;\n const d = new qo(n, i);\n d._subdivisionsX = a, d._subdivisionsY = a, d._width = r, d._height = s, d._maxX = d._width / 2, d._maxZ = d._height / 2, d._minX = -d._maxX, d._minZ = -d._maxZ, d._setReady(!1);\n let p;\n t.passHeightBufferInCallback && (p = new Float32Array((a + 1) * (a + 1)));\n const g = (m, v, E) => {\n _0({\n width: r,\n height: s,\n subdivisions: a,\n minHeight: o,\n maxHeight: l,\n colorFilter: c,\n buffer: m,\n bufferWidth: v,\n bufferHeight: E,\n alphaFilter: h,\n heightBuffer: p\n }).applyToMesh(d, u), f && f(d, p), d._setReady(!0);\n };\n if (typeof e == \"string\") {\n const m = (v) => {\n const E = v.width, C = v.height;\n if (i.isDisposed)\n return;\n const T = i == null ? void 0 : i.getEngine().resizeImageBitmap(v, E, C);\n g(T, E, C);\n };\n ge.LoadImage(e, m, t.onError ? t.onError : () => {\n }, i.offlineProvider);\n } else\n g(e.data, e.width, e.height);\n return d;\n}\nre.CreateGround = Ns;\nre.CreateTiledGround = m0;\nre.CreateGroundFromHeightMap = _0;\nB.CreateGround = (n, e, t, i, r, s) => Eb(n, {\n width: e,\n height: t,\n subdivisions: i,\n updatable: s\n}, r);\nB.CreateTiledGround = (n, e, t, i, r, s, a, o, l) => vb(n, {\n xmin: e,\n zmin: t,\n xmax: i,\n zmax: r,\n subdivisions: s,\n precision: a,\n updatable: l\n}, o);\nB.CreateGroundFromHeightMap = (n, e, t, i, r, s, a, o, l, c, h) => Tb(n, e, {\n width: t,\n height: i,\n subdivisions: r,\n minHeight: s,\n maxHeight: a,\n updatable: l,\n onReady: c,\n alphaFilter: h\n}, o);\nfunction E0(n) {\n let t = [0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23];\n const i = [\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0,\n 0,\n -1,\n 0\n ], r = [];\n let s = [];\n const a = n.width || n.size || 1, o = n.height || n.size || 1, l = n.depth || n.size || 1, c = n.wrap || !1;\n let h = n.topBaseAt === void 0 ? 1 : n.topBaseAt, u = n.bottomBaseAt === void 0 ? 0 : n.bottomBaseAt;\n h = (h + 4) % 4, u = (u + 4) % 4;\n const f = [2, 0, 3, 1], d = [2, 0, 1, 3];\n let p = f[h], g = d[u], m = [\n 1,\n -1,\n 1,\n -1,\n -1,\n 1,\n -1,\n 1,\n 1,\n 1,\n 1,\n 1,\n 1,\n 1,\n -1,\n -1,\n 1,\n -1,\n -1,\n -1,\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n -1,\n 1,\n -1,\n -1,\n 1,\n -1,\n 1,\n 1,\n 1,\n 1,\n -1,\n 1,\n 1,\n -1,\n -1,\n 1,\n -1,\n -1,\n -1,\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n -1,\n 1,\n -1,\n 1,\n 1,\n -1,\n 1,\n 1,\n 1,\n 1,\n -1,\n 1,\n 1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n 1\n ];\n if (c) {\n t = [2, 3, 0, 2, 0, 1, 4, 5, 6, 4, 6, 7, 9, 10, 11, 9, 11, 8, 12, 14, 15, 12, 13, 14], m = [\n -1,\n 1,\n 1,\n 1,\n 1,\n 1,\n 1,\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n 1,\n -1,\n -1,\n 1,\n -1,\n -1,\n -1,\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n 1,\n 1,\n 1,\n -1,\n 1,\n -1,\n -1,\n 1,\n -1,\n 1,\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n -1,\n -1,\n 1,\n -1,\n -1,\n -1\n ];\n let S = [\n [1, 1, 1],\n [-1, 1, 1],\n [-1, 1, -1],\n [1, 1, -1]\n ], M = [\n [-1, -1, 1],\n [1, -1, 1],\n [1, -1, -1],\n [-1, -1, -1]\n ];\n const N = [17, 18, 19, 16], F = [22, 23, 20, 21];\n for (; p > 0; )\n S.unshift(S.pop()), N.unshift(N.pop()), p--;\n for (; g > 0; )\n M.unshift(M.pop()), F.unshift(F.pop()), g--;\n S = S.flat(), M = M.flat(), m = m.concat(S).concat(M), t.push(N[0], N[2], N[3], N[0], N[1], N[2]), t.push(F[0], F[2], F[3], F[0], F[1], F[2]);\n }\n const v = [a / 2, o / 2, l / 2];\n s = m.reduce((S, M, N) => S.concat(M * v[N % 3]), []);\n const E = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, C = n.faceUV || new Array(6), T = n.faceColors, R = [];\n for (let S = 0; S < 6; S++)\n C[S] === void 0 && (C[S] = new Ke(0, 0, 1, 1)), T && T[S] === void 0 && (T[S] = new et(1, 1, 1, 1));\n for (let S = 0; S < 6; S++)\n if (r.push(C[S].z, nt.UseOpenGLOrientationForUV ? 1 - C[S].w : C[S].w), r.push(C[S].x, nt.UseOpenGLOrientationForUV ? 1 - C[S].w : C[S].w), r.push(C[S].x, nt.UseOpenGLOrientationForUV ? 1 - C[S].y : C[S].y), r.push(C[S].z, nt.UseOpenGLOrientationForUV ? 1 - C[S].y : C[S].y), T)\n for (let M = 0; M < 4; M++)\n R.push(T[S].r, T[S].g, T[S].b, T[S].a);\n re._ComputeSides(E, s, t, i, r, n.frontUVs, n.backUVs);\n const x = new re();\n if (x.indices = t, x.positions = s, x.normals = i, x.uvs = r, T) {\n const S = E === re.DOUBLESIDE ? R.concat(R) : R;\n x.colors = S;\n }\n return x;\n}\nfunction xb(n) {\n const e = n.width || n.size || 1, t = n.height || n.size || 1, i = n.depth || n.size || 1, r = (n.widthSegments || n.segments || 1) | 0, s = (n.heightSegments || n.segments || 1) | 0, a = (n.depthSegments || n.segments || 1) | 0, o = new L(), l = new L(), c = new L(), h = Ns({ width: e, height: i, subdivisionsX: r, subdivisionsY: a });\n L.TranslationToRef(0, -t / 2, 0, l), L.RotationZToRef(Math.PI, o), o.multiplyToRef(l, c), h.transform(c);\n const u = Ns({ width: e, height: i, subdivisionsX: r, subdivisionsY: a });\n L.TranslationToRef(0, t / 2, 0, c), u.transform(c);\n const f = Ns({ width: t, height: i, subdivisionsX: s, subdivisionsY: a });\n L.TranslationToRef(-e / 2, 0, 0, l), L.RotationZToRef(Math.PI / 2, o), o.multiplyToRef(l, c), f.transform(c);\n const d = Ns({ width: t, height: i, subdivisionsX: s, subdivisionsY: a });\n L.TranslationToRef(e / 2, 0, 0, l), L.RotationZToRef(-Math.PI / 2, o), o.multiplyToRef(l, c), d.transform(c);\n const p = Ns({ width: e, height: t, subdivisionsX: r, subdivisionsY: s });\n L.TranslationToRef(0, 0, -i / 2, l), L.RotationXToRef(-Math.PI / 2, o), o.multiplyToRef(l, c), p.transform(c);\n const g = Ns({ width: e, height: t, subdivisionsX: r, subdivisionsY: s });\n return L.TranslationToRef(0, 0, i / 2, l), L.RotationXToRef(Math.PI / 2, o), o.multiplyToRef(l, c), g.transform(c), h.merge([u, d, f, p, g], !0), h;\n}\nfunction Cb(n, e = {}, t = null) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, E0(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateBox = E0;\nB.CreateBox = (n, e, t = null, i, r) => Cb(n, {\n size: e,\n sideOrientation: r,\n updatable: i\n}, t);\nfunction Hl(n) {\n const e = n.pattern || B.NO_FLIP, t = n.tileWidth || n.tileSize || 1, i = n.tileHeight || n.tileSize || 1, r = n.alignHorizontal || 0, s = n.alignVertical || 0, a = n.width || n.size || 1, o = Math.floor(a / t);\n let l = a - o * t;\n const c = n.height || n.size || 1, h = Math.floor(c / i);\n let u = c - h * i;\n const f = t * o / 2, d = i * h / 2;\n let p = 0, g = 0, m = 0, v = 0, E = 0, C = 0;\n if (l > 0 || u > 0) {\n switch (m = -f, v = -d, E = f, C = d, r) {\n case B.CENTER:\n l /= 2, m -= l, E += l;\n break;\n case B.LEFT:\n E += l, p = -l / 2;\n break;\n case B.RIGHT:\n m -= l, p = l / 2;\n break;\n }\n switch (s) {\n case B.CENTER:\n u /= 2, v -= u, C += u;\n break;\n case B.BOTTOM:\n C += u, g = -u / 2;\n break;\n case B.TOP:\n v -= u, g = u / 2;\n break;\n }\n }\n const T = [], R = [], x = [];\n x[0] = [0, 0, 1, 0, 1, 1, 0, 1], x[1] = [0, 0, 1, 0, 1, 1, 0, 1], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (x[1] = [1, 1, 0, 1, 0, 0, 1, 0]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (x[1] = [1, 0, 0, 0, 0, 1, 1, 1]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (x[1] = [0, 1, 1, 1, 1, 0, 0, 0]);\n let S = [];\n const M = [], N = [];\n let F = 0;\n for (let Z = 0; Z < h; Z++)\n for (let k = 0; k < o; k++)\n T.push(-f + k * t + p, -d + Z * i + g, 0), T.push(-f + (k + 1) * t + p, -d + Z * i + g, 0), T.push(-f + (k + 1) * t + p, -d + (Z + 1) * i + g, 0), T.push(-f + k * t + p, -d + (Z + 1) * i + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(x[(k % 2 + Z % 2) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(x[Z % 2]) : S = S.concat(x[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1), F += 4;\n if (l > 0 || u > 0) {\n const Z = u > 0 && (s === B.CENTER || s === B.TOP), k = u > 0 && (s === B.CENTER || s === B.BOTTOM), Q = l > 0 && (r === B.CENTER || r === B.RIGHT), ce = l > 0 && (r === B.CENTER || r === B.LEFT);\n let de = [], j, J, O, G;\n if (Z && Q && (T.push(m + p, v + g, 0), T.push(-f + p, v + g, 0), T.push(-f + p, v + u + g, 0), T.push(m + p, v + u + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, j = 1 - l / t, J = 1 - u / i, O = 1, G = 1, de = [j, J, O, J, O, G, j, G], e === B.ROTATE_ROW && (de = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), e === B.FLIP_ROW && (de = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), e === B.FLIP_N_ROTATE_ROW && (de = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), Z && ce && (T.push(f + p, v + g, 0), T.push(E + p, v + g, 0), T.push(E + p, v + u + g, 0), T.push(f + p, v + u + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, j = 0, J = 1 - u / i, O = l / t, G = 1, de = [j, J, O, J, O, G, j, G], (e === B.ROTATE_ROW || e === B.ROTATE_TILE && o % 2 === 0) && (de = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_ROW || e === B.FLIP_TILE && o % 2 === 0) && (de = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_ROW || e === B.FLIP_N_ROTATE_TILE && o % 2 === 0) && (de = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), k && Q && (T.push(m + p, d + g, 0), T.push(-f + p, d + g, 0), T.push(-f + p, C + g, 0), T.push(m + p, C + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, j = 1 - l / t, J = 0, O = 1, G = u / i, de = [j, J, O, J, O, G, j, G], (e === B.ROTATE_ROW && h % 2 === 1 || e === B.ROTATE_TILE && h % 1 === 0) && (de = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_ROW && h % 2 === 1 || e === B.FLIP_TILE && h % 2 === 0) && (de = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_ROW && h % 2 === 1 || e === B.FLIP_N_ROTATE_TILE && h % 2 === 0) && (de = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), k && ce && (T.push(f + p, d + g, 0), T.push(E + p, d + g, 0), T.push(E + p, C + g, 0), T.push(f + p, C + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, j = 0, J = 0, O = l / t, G = u / i, de = [j, J, O, J, O, G, j, G], (e === B.ROTATE_ROW && h % 2 === 1 || e === B.ROTATE_TILE && (h + o) % 2 === 1) && (de = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_ROW && h % 2 === 1 || e === B.FLIP_TILE && (h + o) % 2 === 1) && (de = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_ROW && h % 2 === 1 || e === B.FLIP_N_ROTATE_TILE && (h + o) % 2 === 1) && (de = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]), S = S.concat(de), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1)), Z) {\n const ee = [];\n j = 0, J = 1 - u / i, O = 1, G = 1, ee[0] = [j, J, O, J, O, G, j, G], ee[1] = [j, J, O, J, O, G, j, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]);\n for (let _e = 0; _e < o; _e++)\n T.push(-f + _e * t + p, v + g, 0), T.push(-f + (_e + 1) * t + p, v + g, 0), T.push(-f + (_e + 1) * t + p, v + u + g, 0), T.push(-f + _e * t + p, v + u + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(ee[(_e + 1) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(ee[1]) : S = S.concat(ee[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\n }\n if (k) {\n const ee = [];\n j = 0, J = 0, O = 1, G = u / i, ee[0] = [j, J, O, J, O, G, j, G], ee[1] = [j, J, O, J, O, G, j, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]);\n for (let _e = 0; _e < o; _e++)\n T.push(-f + _e * t + p, C - u + g, 0), T.push(-f + (_e + 1) * t + p, C - u + g, 0), T.push(-f + (_e + 1) * t + p, C + g, 0), T.push(-f + _e * t + p, C + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(ee[(_e + h) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(ee[h % 2]) : S = S.concat(ee[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\n }\n if (Q) {\n const ee = [];\n j = 1 - l / t, J = 0, O = 1, G = 1, ee[0] = [j, J, O, J, O, G, j, G], ee[1] = [j, J, O, J, O, G, j, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]);\n for (let _e = 0; _e < h; _e++)\n T.push(m + p, -d + _e * i + g, 0), T.push(m + l + p, -d + _e * i + g, 0), T.push(m + l + p, -d + (_e + 1) * i + g, 0), T.push(m + p, -d + (_e + 1) * i + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(ee[(_e + 1) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(ee[_e % 2]) : S = S.concat(ee[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\n }\n if (ce) {\n const ee = [];\n j = 0, J = 0, O = l / i, G = 1, ee[0] = [j, J, O, J, O, G, j, G], ee[1] = [j, J, O, J, O, G, j, G], (e === B.ROTATE_TILE || e === B.ROTATE_ROW) && (ee[1] = [1 - j, 1 - J, 1 - O, 1 - J, 1 - O, 1 - G, 1 - j, 1 - G]), (e === B.FLIP_TILE || e === B.FLIP_ROW) && (ee[1] = [1 - j, J, 1 - O, J, 1 - O, G, 1 - j, G]), (e === B.FLIP_N_ROTATE_TILE || e === B.FLIP_N_ROTATE_ROW) && (ee[1] = [j, 1 - J, O, 1 - J, O, 1 - G, j, 1 - G]);\n for (let _e = 0; _e < h; _e++)\n T.push(E - l + p, -d + _e * i + g, 0), T.push(E + p, -d + _e * i + g, 0), T.push(E + p, -d + (_e + 1) * i + g, 0), T.push(E - l + p, -d + (_e + 1) * i + g, 0), N.push(F, F + 1, F + 3, F + 1, F + 2, F + 3), F += 4, e === B.FLIP_TILE || e === B.ROTATE_TILE || e === B.FLIP_N_ROTATE_TILE ? S = S.concat(ee[(_e + o) % 2]) : e === B.FLIP_ROW || e === B.ROTATE_ROW || e === B.FLIP_N_ROTATE_ROW ? S = S.concat(ee[_e % 2]) : S = S.concat(ee[0]), M.push(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), R.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1);\n }\n }\n const U = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE;\n re._ComputeSides(U, T, N, R, S, n.frontUVs, n.backUVs);\n const H = new re();\n H.indices = N, H.positions = T, H.normals = R, H.uvs = S;\n const q = U === re.DOUBLESIDE ? M.concat(M) : M;\n return H.colors = q, H;\n}\nre.CreateTiledPlane = Hl;\nfunction Rb(n) {\n const t = n.faceUV || new Array(6), i = n.faceColors, r = n.pattern || B.NO_FLIP, s = n.width || n.size || 1, a = n.height || n.size || 1, o = n.depth || n.size || 1, l = n.tileWidth || n.tileSize || 1, c = n.tileHeight || n.tileSize || 1, h = n.alignHorizontal || 0, u = n.alignVertical || 0, f = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE;\n for (let O = 0; O < 6; O++)\n t[O] === void 0 && (t[O] = new Ke(0, 0, 1, 1)), i && i[O] === void 0 && (i[O] = new et(1, 1, 1, 1));\n const d = s / 2, p = a / 2, g = o / 2, m = [];\n for (let O = 0; O < 2; O++)\n m[O] = Hl({\n pattern: r,\n tileWidth: l,\n tileHeight: c,\n width: s,\n height: a,\n alignVertical: u,\n alignHorizontal: h,\n sideOrientation: f\n });\n for (let O = 2; O < 4; O++)\n m[O] = Hl({\n pattern: r,\n tileWidth: l,\n tileHeight: c,\n width: o,\n height: a,\n alignVertical: u,\n alignHorizontal: h,\n sideOrientation: f\n });\n let v = u;\n u === B.BOTTOM ? v = B.TOP : u === B.TOP && (v = B.BOTTOM);\n for (let O = 4; O < 6; O++)\n m[O] = Hl({\n pattern: r,\n tileWidth: l,\n tileHeight: c,\n width: s,\n height: o,\n alignVertical: v,\n alignHorizontal: h,\n sideOrientation: f\n });\n let E = [], C = [], T = [], R = [];\n const x = [], S = [], M = [], N = [];\n let F = 0, U = 0;\n for (let O = 0; O < 6; O++) {\n const G = m[O].positions.length;\n S[O] = [], M[O] = [];\n for (let ee = 0; ee < G / 3; ee++)\n S[O].push(new _(m[O].positions[3 * ee], m[O].positions[3 * ee + 1], m[O].positions[3 * ee + 2])), M[O].push(new _(m[O].normals[3 * ee], m[O].normals[3 * ee + 1], m[O].normals[3 * ee + 2]));\n F = m[O].uvs.length, N[O] = [];\n for (let ee = 0; ee < F; ee += 2)\n N[O][ee] = t[O].x + (t[O].z - t[O].x) * m[O].uvs[ee], N[O][ee + 1] = t[O].y + (t[O].w - t[O].y) * m[O].uvs[ee + 1], nt.UseOpenGLOrientationForUV && (N[O][ee + 1] = 1 - N[O][ee + 1]);\n if (T = T.concat(N[O]), R = R.concat(m[O].indices.map((ee) => ee + U)), U += S[O].length, i)\n for (let ee = 0; ee < 4; ee++)\n x.push(i[O].r, i[O].g, i[O].b, i[O].a);\n }\n const H = new _(0, 0, g), q = L.RotationY(Math.PI);\n E = S[0].map((O) => _.TransformNormal(O, q).add(H)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []), C = M[0].map((O) => _.TransformNormal(O, q)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []), E = E.concat(S[1].map((O) => O.subtract(H)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[1].map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []));\n const Z = new _(d, 0, 0), k = L.RotationY(-Math.PI / 2);\n E = E.concat(S[2].map((O) => _.TransformNormal(O, k).add(Z)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[2].map((O) => _.TransformNormal(O, k)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []));\n const Q = L.RotationY(Math.PI / 2);\n E = E.concat(S[3].map((O) => _.TransformNormal(O, Q).subtract(Z)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[3].map((O) => _.TransformNormal(O, Q)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []));\n const ce = new _(0, p, 0), de = L.RotationX(Math.PI / 2);\n E = E.concat(S[4].map((O) => _.TransformNormal(O, de).add(ce)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[4].map((O) => _.TransformNormal(O, de)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), []));\n const j = L.RotationX(-Math.PI / 2);\n E = E.concat(S[5].map((O) => _.TransformNormal(O, j).subtract(ce)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), C = C.concat(M[5].map((O) => _.TransformNormal(O, j)).map((O) => [O.x, O.y, O.z]).reduce((O, G) => O.concat(G), [])), re._ComputeSides(f, E, R, C, T);\n const J = new re();\n if (J.indices = R, J.positions = E, J.normals = C, J.uvs = T, i) {\n const O = f === re.DOUBLESIDE ? x.concat(x) : x;\n J.colors = O;\n }\n return J;\n}\nre.CreateTiledBox = Rb;\nfunction Ef(n) {\n const e = (n.segments || 32) | 0, t = n.diameterX || n.diameter || 1, i = n.diameterY || n.diameter || 1, r = n.diameterZ || n.diameter || 1, s = n.arc && (n.arc <= 0 || n.arc > 1) ? 1 : n.arc || 1, a = n.slice && n.slice <= 0 ? 1 : n.slice || 1, o = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, l = !!n.dedupTopBottomIndices, c = new _(t / 2, i / 2, r / 2), h = 2 + e, u = 2 * h, f = [], d = [], p = [], g = [];\n for (let v = 0; v <= h; v++) {\n const E = v / h, C = E * Math.PI * a;\n for (let T = 0; T <= u; T++) {\n const R = T / u, x = R * Math.PI * 2 * s, S = L.RotationZ(-C), M = L.RotationY(x), N = _.TransformCoordinates(_.Up(), S), F = _.TransformCoordinates(N, M), U = F.multiply(c), H = F.divide(c).normalize();\n d.push(U.x, U.y, U.z), p.push(H.x, H.y, H.z), g.push(R, nt.UseOpenGLOrientationForUV ? 1 - E : E);\n }\n if (v > 0) {\n const T = d.length / 3;\n for (let R = T - 2 * (u + 1); R + u + 2 < T; R++)\n l ? (v > 1 && (f.push(R), f.push(R + 1), f.push(R + u + 1)), (v < h || a < 1) && (f.push(R + u + 1), f.push(R + 1), f.push(R + u + 2))) : (f.push(R), f.push(R + 1), f.push(R + u + 1), f.push(R + u + 1), f.push(R + 1), f.push(R + u + 2));\n }\n }\n re._ComputeSides(o, d, f, p, g, n.frontUVs, n.backUVs);\n const m = new re();\n return m.indices = f, m.positions = d, m.normals = p, m.uvs = g, m;\n}\nfunction v0(n, e = {}, t = null) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, Ef(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateSphere = Ef;\nB.CreateSphere = (n, e, t, i, r, s) => v0(n, {\n segments: e,\n diameterX: t,\n diameterY: t,\n diameterZ: t,\n sideOrientation: s,\n updatable: r\n}, i);\nfunction vf(n) {\n const e = n.height || 2;\n let t = n.diameterTop === 0 ? 0 : n.diameterTop || n.diameter || 1, i = n.diameterBottom === 0 ? 0 : n.diameterBottom || n.diameter || 1;\n t = t || 1e-5, i = i || 1e-5;\n const r = (n.tessellation || 24) | 0, s = (n.subdivisions || 1) | 0, a = !!n.hasRings, o = !!n.enclose, l = n.cap === 0 ? 0 : n.cap || B.CAP_ALL, c = n.arc && (n.arc <= 0 || n.arc > 1) ? 1 : n.arc || 1, h = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, u = n.faceUV || new Array(3), f = n.faceColors, d = c !== 1 && o ? 2 : 0, p = a ? s : 1, g = 2 + (1 + d) * p;\n let m;\n for (m = 0; m < g; m++)\n f && f[m] === void 0 && (f[m] = new et(1, 1, 1, 1));\n for (m = 0; m < g; m++)\n u && u[m] === void 0 && (u[m] = new Ke(0, 0, 1, 1));\n const v = [], E = [], C = [], T = [], R = [], x = Math.PI * 2 * c / r;\n let S, M, N;\n const F = (i - t) / 2 / e, U = _.Zero(), H = _.Zero(), q = _.Zero(), Z = _.Zero(), k = _.Zero(), Q = Ko.Y;\n let ce, de, j, J = 1, O = 1, G = 0, ee = 0;\n for (ce = 0; ce <= s; ce++)\n for (M = ce / s, N = (M * (t - i) + i) / 2, J = a && ce !== 0 && ce !== s ? 2 : 1, j = 0; j < J; j++) {\n for (a && (O += j), o && (O += 2 * j), de = 0; de <= r; de++)\n S = de * x, U.x = Math.cos(-S) * N, U.y = -e / 2 + M * e, U.z = Math.sin(-S) * N, t === 0 && ce === s ? (H.x = C[C.length - (r + 1) * 3], H.y = C[C.length - (r + 1) * 3 + 1], H.z = C[C.length - (r + 1) * 3 + 2]) : (H.x = U.x, H.z = U.z, H.y = Math.sqrt(H.x * H.x + H.z * H.z) * F, H.normalize()), de === 0 && (q.copyFrom(U), Z.copyFrom(H)), E.push(U.x, U.y, U.z), C.push(H.x, H.y, H.z), a ? ee = G !== O ? u[O].y : u[O].w : ee = u[O].y + (u[O].w - u[O].y) * M, T.push(u[O].x + (u[O].z - u[O].x) * de / r, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), f && R.push(f[O].r, f[O].g, f[O].b, f[O].a);\n c !== 1 && o && (E.push(U.x, U.y, U.z), E.push(0, U.y, 0), E.push(0, U.y, 0), E.push(q.x, q.y, q.z), _.CrossToRef(Q, H, k), k.normalize(), C.push(k.x, k.y, k.z, k.x, k.y, k.z), _.CrossToRef(Z, Q, k), k.normalize(), C.push(k.x, k.y, k.z, k.x, k.y, k.z), a ? ee = G !== O ? u[O + 1].y : u[O + 1].w : ee = u[O + 1].y + (u[O + 1].w - u[O + 1].y) * M, T.push(u[O + 1].x, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), T.push(u[O + 1].z, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), a ? ee = G !== O ? u[O + 2].y : u[O + 2].w : ee = u[O + 2].y + (u[O + 2].w - u[O + 2].y) * M, T.push(u[O + 2].x, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), T.push(u[O + 2].z, nt.UseOpenGLOrientationForUV ? 1 - ee : ee), f && (R.push(f[O + 1].r, f[O + 1].g, f[O + 1].b, f[O + 1].a), R.push(f[O + 1].r, f[O + 1].g, f[O + 1].b, f[O + 1].a), R.push(f[O + 2].r, f[O + 2].g, f[O + 2].b, f[O + 2].a), R.push(f[O + 2].r, f[O + 2].g, f[O + 2].b, f[O + 2].a))), G !== O && (G = O);\n }\n const _e = c !== 1 && o ? r + 4 : r;\n for (ce = 0, O = 0; O < s; O++) {\n let fe = 0, Te = 0, Fe = 0, Se = 0;\n for (de = 0; de < r; de++)\n fe = ce * (_e + 1) + de, Te = (ce + 1) * (_e + 1) + de, Fe = ce * (_e + 1) + (de + 1), Se = (ce + 1) * (_e + 1) + (de + 1), v.push(fe, Te, Fe), v.push(Se, Fe, Te);\n c !== 1 && o && (v.push(fe + 2, Te + 2, Fe + 2), v.push(Se + 2, Fe + 2, Te + 2), v.push(fe + 4, Te + 4, Fe + 4), v.push(Se + 4, Fe + 4, Te + 4)), ce = a ? ce + 2 : ce + 1;\n }\n const Oe = (fe) => {\n const Te = fe ? t / 2 : i / 2;\n if (Te === 0)\n return;\n let Fe, Se, qe;\n const ue = fe ? u[g - 1] : u[0];\n let Ye = null;\n f && (Ye = fe ? f[g - 1] : f[0]);\n const lt = E.length / 3, Ut = fe ? e / 2 : -e / 2, Ct = new _(0, Ut, 0);\n E.push(Ct.x, Ct.y, Ct.z), C.push(0, fe ? 1 : -1, 0);\n const Bi = ue.y + (ue.w - ue.y) * 0.5;\n T.push(ue.x + (ue.z - ue.x) * 0.5, nt.UseOpenGLOrientationForUV ? 1 - Bi : Bi), Ye && R.push(Ye.r, Ye.g, Ye.b, Ye.a);\n const hi = new me(0.5, 0.5);\n for (qe = 0; qe <= r; qe++) {\n Fe = Math.PI * 2 * qe * c / r;\n const Es = Math.cos(-Fe), Vr = Math.sin(-Fe);\n Se = new _(Es * Te, Ut, Vr * Te);\n const vs = new me(Es * hi.x + 0.5, Vr * hi.y + 0.5);\n E.push(Se.x, Se.y, Se.z), C.push(0, fe ? 1 : -1, 0);\n const ki = ue.y + (ue.w - ue.y) * vs.y;\n T.push(ue.x + (ue.z - ue.x) * vs.x, nt.UseOpenGLOrientationForUV ? 1 - ki : ki), Ye && R.push(Ye.r, Ye.g, Ye.b, Ye.a);\n }\n for (qe = 0; qe < r; qe++)\n fe ? (v.push(lt), v.push(lt + (qe + 2)), v.push(lt + (qe + 1))) : (v.push(lt), v.push(lt + (qe + 1)), v.push(lt + (qe + 2)));\n };\n (l === B.CAP_START || l === B.CAP_ALL) && Oe(!1), (l === B.CAP_END || l === B.CAP_ALL) && Oe(!0), re._ComputeSides(h, E, v, C, T, n.frontUVs, n.backUVs);\n const ze = new re();\n return ze.indices = v, ze.positions = E, ze.normals = C, ze.uvs = T, f && (ze.colors = R), ze;\n}\nfunction Sb(n, e = {}, t) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, vf(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateCylinder = vf;\nB.CreateCylinder = (n, e, t, i, r, s, a, o, l) => ((a === void 0 || !(a instanceof Ot)) && (a !== void 0 && (l = o || B.DEFAULTSIDE, o = a), a = s, s = 1), Sb(n, {\n height: e,\n diameterTop: t,\n diameterBottom: i,\n tessellation: r,\n subdivisions: s,\n sideOrientation: l,\n updatable: o\n}, a));\nfunction Tf(n) {\n const e = [], t = [], i = [], r = [], s = n.diameter || 1, a = n.thickness || 0.5, o = (n.tessellation || 16) | 0, l = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, c = o + 1;\n for (let u = 0; u <= o; u++) {\n const f = u / o, d = u * Math.PI * 2 / o - Math.PI / 2, p = L.Translation(s / 2, 0, 0).multiply(L.RotationY(d));\n for (let g = 0; g <= o; g++) {\n const m = 1 - g / o, v = g * Math.PI * 2 / o + Math.PI, E = Math.cos(v), C = Math.sin(v);\n let T = new _(E, C, 0), R = T.scale(a / 2);\n const x = new me(f, m);\n R = _.TransformCoordinates(R, p), T = _.TransformNormal(T, p), t.push(R.x, R.y, R.z), i.push(T.x, T.y, T.z), r.push(x.x, nt.UseOpenGLOrientationForUV ? 1 - x.y : x.y);\n const S = (u + 1) % c, M = (g + 1) % c;\n e.push(u * c + g), e.push(u * c + M), e.push(S * c + g), e.push(u * c + M), e.push(S * c + M), e.push(S * c + g);\n }\n }\n re._ComputeSides(l, t, e, i, r, n.frontUVs, n.backUVs);\n const h = new re();\n return h.indices = e, h.positions = t, h.normals = i, h.uvs = r, h;\n}\nfunction yb(n, e = {}, t) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, Tf(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateTorus = Tf;\nB.CreateTorus = (n, e, t, i, r, s, a) => yb(n, {\n diameter: e,\n thickness: t,\n tessellation: i,\n sideOrientation: a,\n updatable: s\n}, r);\nfunction T0(n) {\n const e = [], t = [], i = [], r = [], s = n.radius || 2, a = n.tube || 0.5, o = n.radialSegments || 32, l = n.tubularSegments || 32, c = n.p || 2, h = n.q || 3, u = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, f = (m) => {\n const v = Math.cos(m), E = Math.sin(m), C = h / c * m, T = Math.cos(C), R = s * (2 + T) * 0.5 * v, x = s * (2 + T) * E * 0.5, S = s * Math.sin(C) * 0.5;\n return new _(R, x, S);\n };\n let d, p;\n for (d = 0; d <= o; d++) {\n const v = d % o / o * 2 * c * Math.PI, E = f(v), C = f(v + 0.01), T = C.subtract(E);\n let R = C.add(E);\n const x = _.Cross(T, R);\n for (R = _.Cross(x, T), x.normalize(), R.normalize(), p = 0; p < l; p++) {\n const M = p % l / l * 2 * Math.PI, N = -a * Math.cos(M), F = a * Math.sin(M);\n t.push(E.x + N * R.x + F * x.x), t.push(E.y + N * R.y + F * x.y), t.push(E.z + N * R.z + F * x.z), r.push(d / o), r.push(nt.UseOpenGLOrientationForUV ? 1 - p / l : p / l);\n }\n }\n for (d = 0; d < o; d++)\n for (p = 0; p < l; p++) {\n const m = (p + 1) % l, v = d * l + p, E = (d + 1) * l + p, C = (d + 1) * l + m, T = d * l + m;\n e.push(T), e.push(E), e.push(v), e.push(T), e.push(C), e.push(E);\n }\n re.ComputeNormals(t, e, i), re._ComputeSides(u, t, e, i, r, n.frontUVs, n.backUVs);\n const g = new re();\n return g.indices = e, g.positions = t, g.normals = i, g.uvs = r, g;\n}\nfunction Ib(n, e = {}, t) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, T0(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateTorusKnot = T0;\nB.CreateTorusKnot = (n, e, t, i, r, s, a, o, l, c) => Ib(n, {\n radius: e,\n tube: t,\n radialSegments: i,\n tubularSegments: r,\n p: s,\n q: a,\n sideOrientation: c,\n updatable: l\n}, o);\nfunction x0(n) {\n const e = [], t = [], i = n.lines, r = n.colors, s = [];\n let a = 0;\n for (let l = 0; l < i.length; l++) {\n const c = i[l];\n for (let h = 0; h < c.length; h++) {\n const { x: u, y: f, z: d } = c[h];\n if (t.push(u, f, d), r) {\n const p = r[l], { r: g, g: m, b: v, a: E } = p[h];\n s.push(g, m, v, E);\n }\n h > 0 && (e.push(a - 1), e.push(a)), a++;\n }\n }\n const o = new re();\n return o.indices = e, o.positions = t, r && (o.colors = s), o;\n}\nfunction C0(n) {\n const e = n.dashSize || 3, t = n.gapSize || 1, i = n.dashNb || 200, r = n.points, s = [], a = [], o = _.Zero();\n let l = 0, c = 0, h = 0, u = 0, f = 0, d = 0, p = 0;\n for (p = 0; p < r.length - 1; p++)\n r[p + 1].subtractToRef(r[p], o), l += o.length();\n for (h = l / i, u = e * h / (e + t), p = 0; p < r.length - 1; p++) {\n r[p + 1].subtractToRef(r[p], o), c = Math.floor(o.length() / h), o.normalize();\n for (let m = 0; m < c; m++)\n f = h * m, s.push(r[p].x + f * o.x, r[p].y + f * o.y, r[p].z + f * o.z), s.push(r[p].x + (f + u) * o.x, r[p].y + (f + u) * o.y, r[p].z + (f + u) * o.z), a.push(d, d + 1), d += 2;\n }\n const g = new re();\n return g.positions = s, g.indices = a, g;\n}\nfunction bb(n, e, t = null) {\n const i = e.instance, r = e.lines, s = e.colors;\n if (i) {\n const c = i.getVerticesData(I.PositionKind);\n let h, u;\n s && (h = i.getVerticesData(I.ColorKind));\n let f = 0, d = 0;\n for (let p = 0; p < r.length; p++) {\n const g = r[p];\n for (let m = 0; m < g.length; m++)\n c[f] = g[m].x, c[f + 1] = g[m].y, c[f + 2] = g[m].z, s && h && (u = s[p], h[d] = u[m].r, h[d + 1] = u[m].g, h[d + 2] = u[m].b, h[d + 3] = u[m].a, d += 4), f += 3;\n }\n return i.updateVerticesData(I.PositionKind, c, !1, !1), s && h && i.updateVerticesData(I.ColorKind, h, !1, !1), i;\n }\n const a = !!s, o = new Pa(n, t, null, void 0, void 0, a, e.useVertexAlpha, e.material);\n return x0(e).applyToMesh(o, e.updatable), o;\n}\nfunction Ab(n, e, t = null) {\n const i = e.colors ? [e.colors] : null;\n return bb(n, { lines: [e.points], updatable: e.updatable, instance: e.instance, colors: i, useVertexAlpha: e.useVertexAlpha, material: e.material }, t);\n}\nfunction Mb(n, e, t = null) {\n const i = e.points, r = e.instance, s = e.gapSize || 1, a = e.dashSize || 3;\n if (r) {\n const c = (h) => {\n const u = _.Zero(), f = h.length / 6;\n let d = 0, p = 0, g = 0, m = 0, v = 0, E = 0, C = 0, T = 0;\n for (C = 0; C < i.length - 1; C++)\n i[C + 1].subtractToRef(i[C], u), d += u.length();\n g = d / f;\n const R = r._creationDataStorage.dashSize, x = r._creationDataStorage.gapSize;\n for (m = R * g / (R + x), C = 0; C < i.length - 1; C++)\n for (i[C + 1].subtractToRef(i[C], u), p = Math.floor(u.length() / g), u.normalize(), T = 0; T < p && E < h.length; )\n v = g * T, h[E] = i[C].x + v * u.x, h[E + 1] = i[C].y + v * u.y, h[E + 2] = i[C].z + v * u.z, h[E + 3] = i[C].x + (v + m) * u.x, h[E + 4] = i[C].y + (v + m) * u.y, h[E + 5] = i[C].z + (v + m) * u.z, E += 6, T++;\n for (; E < h.length; )\n h[E] = i[C].x, h[E + 1] = i[C].y, h[E + 2] = i[C].z, E += 3;\n };\n return (e.dashNb || e.dashSize || e.gapSize || e.useVertexAlpha || e.material) && ne.Warn(\"You have used an option other than points with the instance option. Please be aware that these other options will be ignored.\"), r.updateMeshPositions(c, !1), r;\n }\n const o = new Pa(n, t, null, void 0, void 0, void 0, e.useVertexAlpha, e.material);\n return C0(e).applyToMesh(o, e.updatable), o._creationDataStorage = new o0(), o._creationDataStorage.dashSize = a, o._creationDataStorage.gapSize = s, o;\n}\nre.CreateLineSystem = x0;\nre.CreateDashedLines = C0;\nB.CreateLines = (n, e, t = null, i = !1, r = null) => Ab(n, {\n points: e,\n updatable: i,\n instance: r\n}, t);\nB.CreateDashedLines = (n, e, t, i, r, s = null, a, o) => Mb(n, {\n points: e,\n dashSize: t,\n gapSize: i,\n dashNb: r,\n updatable: a,\n instance: o\n}, s);\nvar Ea;\n(function(n) {\n n[n.CW = 0] = \"CW\", n[n.CCW = 1] = \"CCW\";\n})(Ea || (Ea = {}));\nclass os {\n /**\n * Creates an Angle object of \"radians\" radians (float).\n * @param radians the angle in radians\n */\n constructor(e) {\n this._radians = e, this._radians < 0 && (this._radians += 2 * Math.PI);\n }\n /**\n * Get value in degrees\n * @returns the Angle value in degrees (float)\n */\n degrees() {\n return this._radians * 180 / Math.PI;\n }\n /**\n * Get value in radians\n * @returns the Angle value in radians (float)\n */\n radians() {\n return this._radians;\n }\n /**\n * Gets a new Angle object with a value of the angle (in radians) between the line connecting the two points and the x-axis\n * @param a defines first point as the origin\n * @param b defines point\n * @returns a new Angle\n */\n static BetweenTwoPoints(e, t) {\n const i = t.subtract(e), r = Math.atan2(i.y, i.x);\n return new os(r);\n }\n /**\n * Gets the angle between the two vectors\n * @param a defines first vector\n * @param b defines vector\n * @returns Returns an new Angle between 0 and PI\n */\n static BetweenTwoVectors(e, t) {\n let i = e.lengthSquared() * t.lengthSquared();\n if (i === 0)\n return new os(Math.PI / 2);\n i = Math.sqrt(i);\n let r = e.dot(t) / i;\n r = je.Clamp(r, -1, 1);\n const s = Math.acos(r);\n return new os(s);\n }\n /**\n * Gets a new Angle object from the given float in radians\n * @param radians defines the angle value in radians\n * @returns a new Angle\n */\n static FromRadians(e) {\n return new os(e);\n }\n /**\n * Gets a new Angle object from the given float in degrees\n * @param degrees defines the angle value in degrees\n * @returns a new Angle\n */\n static FromDegrees(e) {\n return new os(e * Math.PI / 180);\n }\n}\nclass Pb {\n /**\n * Creates an Arc object from the three given points : start, middle and end.\n * @param startPoint Defines the start point of the arc\n * @param midPoint Defines the middle point of the arc\n * @param endPoint Defines the end point of the arc\n */\n constructor(e, t, i) {\n this.startPoint = e, this.midPoint = t, this.endPoint = i;\n const r = Math.pow(t.x, 2) + Math.pow(t.y, 2), s = (Math.pow(e.x, 2) + Math.pow(e.y, 2) - r) / 2, a = (r - Math.pow(i.x, 2) - Math.pow(i.y, 2)) / 2, o = (e.x - t.x) * (t.y - i.y) - (t.x - i.x) * (e.y - t.y);\n this.centerPoint = new me((s * (t.y - i.y) - a * (e.y - t.y)) / o, ((e.x - t.x) * a - (t.x - i.x) * s) / o), this.radius = this.centerPoint.subtract(this.startPoint).length(), this.startAngle = os.BetweenTwoPoints(this.centerPoint, this.startPoint);\n const l = this.startAngle.degrees();\n let c = os.BetweenTwoPoints(this.centerPoint, this.midPoint).degrees(), h = os.BetweenTwoPoints(this.centerPoint, this.endPoint).degrees();\n c - l > 180 && (c -= 360), c - l < -180 && (c += 360), h - c > 180 && (h -= 360), h - c < -180 && (h += 360), this.orientation = c - l < 0 ? Ea.CW : Ea.CCW, this.angle = os.FromDegrees(this.orientation === Ea.CW ? l - h : h - l);\n }\n}\nclass Vc {\n /**\n * Creates a Path2 object from the starting 2D coordinates x and y.\n * @param x the starting points x value\n * @param y the starting points y value\n */\n constructor(e, t) {\n this._points = new Array(), this._length = 0, this.closed = !1, this._points.push(new me(e, t));\n }\n /**\n * Adds a new segment until the given coordinates (x, y) to the current Path2.\n * @param x the added points x value\n * @param y the added points y value\n * @returns the updated Path2.\n */\n addLineTo(e, t) {\n if (this.closed)\n return this;\n const i = new me(e, t), r = this._points[this._points.length - 1];\n return this._points.push(i), this._length += i.subtract(r).length(), this;\n }\n /**\n * Adds _numberOfSegments_ segments according to the arc definition (middle point coordinates, end point coordinates, the arc start point being the current Path2 last point) to the current Path2.\n * @param midX middle point x value\n * @param midY middle point y value\n * @param endX end point x value\n * @param endY end point y value\n * @param numberOfSegments (default: 36)\n * @returns the updated Path2.\n */\n addArcTo(e, t, i, r, s = 36) {\n if (this.closed)\n return this;\n const a = this._points[this._points.length - 1], o = new me(e, t), l = new me(i, r), c = new Pb(a, o, l);\n let h = c.angle.radians() / s;\n c.orientation === Ea.CW && (h *= -1);\n let u = c.startAngle.radians() + h;\n for (let f = 0; f < s; f++) {\n const d = Math.cos(u) * c.radius + c.centerPoint.x, p = Math.sin(u) * c.radius + c.centerPoint.y;\n this.addLineTo(d, p), u += h;\n }\n return this;\n }\n /**\n * Adds _numberOfSegments_ segments according to the quadratic curve definition to the current Path2.\n * @param controlX control point x value\n * @param controlY control point y value\n * @param endX end point x value\n * @param endY end point y value\n * @param numberOfSegments (default: 36)\n * @returns the updated Path2.\n */\n addQuadraticCurveTo(e, t, i, r, s = 36) {\n if (this.closed)\n return this;\n const a = (l, c, h, u) => (1 - l) * (1 - l) * c + 2 * l * (1 - l) * h + l * l * u, o = this._points[this._points.length - 1];\n for (let l = 0; l <= s; l++) {\n const c = l / s, h = a(c, o.x, e, i), u = a(c, o.y, t, r);\n this.addLineTo(h, u);\n }\n return this;\n }\n /**\n * Adds _numberOfSegments_ segments according to the bezier curve definition to the current Path2.\n * @param originTangentX tangent vector at the origin point x value\n * @param originTangentY tangent vector at the origin point y value\n * @param destinationTangentX tangent vector at the destination point x value\n * @param destinationTangentY tangent vector at the destination point y value\n * @param endX end point x value\n * @param endY end point y value\n * @param numberOfSegments (default: 36)\n * @returns the updated Path2.\n */\n addBezierCurveTo(e, t, i, r, s, a, o = 36) {\n if (this.closed)\n return this;\n const l = (h, u, f, d, p) => (1 - h) * (1 - h) * (1 - h) * u + 3 * h * (1 - h) * (1 - h) * f + 3 * h * h * (1 - h) * d + h * h * h * p, c = this._points[this._points.length - 1];\n for (let h = 0; h <= o; h++) {\n const u = h / o, f = l(u, c.x, e, i, s), d = l(u, c.y, t, r, a);\n this.addLineTo(f, d);\n }\n return this;\n }\n /**\n * Defines if a given point is inside the polygon defines by the path\n * @param point defines the point to test\n * @returns true if the point is inside\n */\n isPointInside(e) {\n let t = !1;\n const i = this._points.length;\n for (let r = i - 1, s = 0; s < i; r = s++) {\n let a = this._points[r], o = this._points[s], l = o.x - a.x, c = o.y - a.y;\n if (Math.abs(c) > Number.EPSILON) {\n if (c < 0 && (a = this._points[s], l = -l, o = this._points[r], c = -c), e.y < a.y || e.y > o.y)\n continue;\n if (e.y === a.y && e.x === a.x)\n return !0;\n {\n const h = c * (e.x - a.x) - l * (e.y - a.y);\n if (h === 0)\n return !0;\n if (h < 0)\n continue;\n t = !t;\n }\n } else {\n if (e.y !== a.y)\n continue;\n if (o.x <= e.x && e.x <= a.x || a.x <= e.x && e.x <= o.x)\n return !0;\n }\n }\n return t;\n }\n /**\n * Closes the Path2.\n * @returns the Path2.\n */\n close() {\n return this.closed = !0, this;\n }\n /**\n * Gets the sum of the distance between each sequential point in the path\n * @returns the Path2 total length (float).\n */\n length() {\n let e = this._length;\n if (this.closed) {\n const t = this._points[this._points.length - 1], i = this._points[0];\n e += i.subtract(t).length();\n }\n return e;\n }\n /**\n * Gets the area of the polygon defined by the path\n * @returns area value\n */\n area() {\n const e = this._points.length;\n let t = 0;\n for (let i = e - 1, r = 0; r < e; i = r++)\n t += this._points[i].x * this._points[r].y - this._points[r].x * this._points[i].y;\n return t * 0.5;\n }\n /**\n * Gets the points which construct the path\n * @returns the Path2 internal array of points.\n */\n getPoints() {\n return this._points;\n }\n /**\n * Retrieves the point at the distance aways from the starting point\n * @param normalizedLengthPosition the length along the path to retrieve the point from\n * @returns a new Vector2 located at a percentage of the Path2 total length on this path.\n */\n getPointAtLengthPosition(e) {\n if (e < 0 || e > 1)\n return me.Zero();\n const t = e * this.length();\n let i = 0;\n for (let r = 0; r < this._points.length; r++) {\n const s = (r + 1) % this._points.length, a = this._points[r], l = this._points[s].subtract(a), c = l.length() + i;\n if (t >= i && t <= c) {\n const h = l.normalize(), u = t - i;\n return new me(a.x + h.x * u, a.y + h.y * u);\n }\n i = c;\n }\n return me.Zero();\n }\n /**\n * Creates a new path starting from an x and y position\n * @param x starting x value\n * @param y starting y value\n * @returns a new Path2 starting at the coordinates (x, y).\n */\n static StartingAt(e, t) {\n return new Vc(e, t);\n }\n}\nclass To {\n /**\n * new Path3D(path, normal, raw)\n * Creates a Path3D. A Path3D is a logical math object, so not a mesh.\n * please read the description in the tutorial : https://doc.babylonjs.com/features/featuresDeepDive/mesh/path3D\n * @param path an array of Vector3, the curve axis of the Path3D\n * @param firstNormal (options) Vector3, the first wanted normal to the curve. Ex (0, 1, 0) for a vertical normal.\n * @param raw (optional, default false) : boolean, if true the returned Path3D isn't normalized. Useful to depict path acceleration or speed.\n * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path.\n */\n constructor(e, t = null, i, r = !1) {\n this.path = e, this._curve = new Array(), this._distances = new Array(), this._tangents = new Array(), this._normals = new Array(), this._binormals = new Array(), this._pointAtData = {\n id: 0,\n point: _.Zero(),\n previousPointArrayIndex: 0,\n position: 0,\n subPosition: 0,\n interpolateReady: !1,\n interpolationMatrix: L.Identity()\n };\n for (let s = 0; s < e.length; s++)\n this._curve[s] = e[s].clone();\n this._raw = i || !1, this._alignTangentsWithPath = r, this._compute(t, r);\n }\n /**\n * Returns the Path3D array of successive Vector3 designing its curve.\n * @returns the Path3D array of successive Vector3 designing its curve.\n */\n getCurve() {\n return this._curve;\n }\n /**\n * Returns the Path3D array of successive Vector3 designing its curve.\n * @returns the Path3D array of successive Vector3 designing its curve.\n */\n getPoints() {\n return this._curve;\n }\n /**\n * @returns the computed length (float) of the path.\n */\n length() {\n return this._distances[this._distances.length - 1];\n }\n /**\n * Returns an array populated with tangent vectors on each Path3D curve point.\n * @returns an array populated with tangent vectors on each Path3D curve point.\n */\n getTangents() {\n return this._tangents;\n }\n /**\n * Returns an array populated with normal vectors on each Path3D curve point.\n * @returns an array populated with normal vectors on each Path3D curve point.\n */\n getNormals() {\n return this._normals;\n }\n /**\n * Returns an array populated with binormal vectors on each Path3D curve point.\n * @returns an array populated with binormal vectors on each Path3D curve point.\n */\n getBinormals() {\n return this._binormals;\n }\n /**\n * Returns an array populated with distances (float) of the i-th point from the first curve point.\n * @returns an array populated with distances (float) of the i-th point from the first curve point.\n */\n getDistances() {\n return this._distances;\n }\n /**\n * Returns an interpolated point along this path\n * @param position the position of the point along this path, from 0.0 to 1.0\n * @returns a new Vector3 as the point\n */\n getPointAt(e) {\n return this._updatePointAtData(e).point;\n }\n /**\n * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path.\n * @param position the position of the point along this path, from 0.0 to 1.0\n * @param interpolated (optional, default false) : boolean, if true returns an interpolated tangent instead of the tangent of the previous path point.\n * @returns a tangent vector corresponding to the interpolated Path3D curve point, if not interpolated, the tangent is taken from the precomputed tangents array.\n */\n getTangentAt(e, t = !1) {\n return this._updatePointAtData(e, t), t ? _.TransformCoordinates(_.Forward(), this._pointAtData.interpolationMatrix) : this._tangents[this._pointAtData.previousPointArrayIndex];\n }\n /**\n * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path.\n * @param position the position of the point along this path, from 0.0 to 1.0\n * @param interpolated (optional, default false) : boolean, if true returns an interpolated normal instead of the normal of the previous path point.\n * @returns a normal vector corresponding to the interpolated Path3D curve point, if not interpolated, the normal is taken from the precomputed normals array.\n */\n getNormalAt(e, t = !1) {\n return this._updatePointAtData(e, t), t ? _.TransformCoordinates(_.Right(), this._pointAtData.interpolationMatrix) : this._normals[this._pointAtData.previousPointArrayIndex];\n }\n /**\n * Returns the binormal vector of an interpolated Path3D curve point at the specified position along this path.\n * @param position the position of the point along this path, from 0.0 to 1.0\n * @param interpolated (optional, default false) : boolean, if true returns an interpolated binormal instead of the binormal of the previous path point.\n * @returns a binormal vector corresponding to the interpolated Path3D curve point, if not interpolated, the binormal is taken from the precomputed binormals array.\n */\n getBinormalAt(e, t = !1) {\n return this._updatePointAtData(e, t), t ? _.TransformCoordinates(_.UpReadOnly, this._pointAtData.interpolationMatrix) : this._binormals[this._pointAtData.previousPointArrayIndex];\n }\n /**\n * Returns the distance (float) of an interpolated Path3D curve point at the specified position along this path.\n * @param position the position of the point along this path, from 0.0 to 1.0\n * @returns the distance of the interpolated Path3D curve point at the specified position along this path.\n */\n getDistanceAt(e) {\n return this.length() * e;\n }\n /**\n * Returns the array index of the previous point of an interpolated point along this path\n * @param position the position of the point to interpolate along this path, from 0.0 to 1.0\n * @returns the array index\n */\n getPreviousPointIndexAt(e) {\n return this._updatePointAtData(e), this._pointAtData.previousPointArrayIndex;\n }\n /**\n * Returns the position of an interpolated point relative to the two path points it lies between, from 0.0 (point A) to 1.0 (point B)\n * @param position the position of the point to interpolate along this path, from 0.0 to 1.0\n * @returns the sub position\n */\n getSubPositionAt(e) {\n return this._updatePointAtData(e), this._pointAtData.subPosition;\n }\n /**\n * Returns the position of the closest virtual point on this path to an arbitrary Vector3, from 0.0 to 1.0\n * @param target the vector of which to get the closest position to\n * @returns the position of the closest virtual point on this path to the target vector\n */\n getClosestPositionTo(e) {\n let t = Number.MAX_VALUE, i = 0;\n for (let r = 0; r < this._curve.length - 1; r++) {\n const s = this._curve[r + 0], a = this._curve[r + 1].subtract(s).normalize(), o = this._distances[r + 1] - this._distances[r + 0], l = Math.min(Math.max(_.Dot(a, e.subtract(s).normalize()), 0) * _.Distance(s, e) / o, 1), c = _.Distance(s.add(a.scale(l * o)), e);\n c < t && (t = c, i = (this._distances[r + 0] + o * l) / this.length());\n }\n return i;\n }\n /**\n * Returns a sub path (slice) of this path\n * @param start the position of the fist path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values\n * @param end the position of the last path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values\n * @returns a sub path (slice) of this path\n */\n slice(e = 0, t = 1) {\n if (e < 0 && (e = 1 - e * -1 % 1), t < 0 && (t = 1 - t * -1 % 1), e > t) {\n const c = e;\n e = t, t = c;\n }\n const i = this.getCurve(), r = this.getPointAt(e);\n let s = this.getPreviousPointIndexAt(e);\n const a = this.getPointAt(t), o = this.getPreviousPointIndexAt(t) + 1, l = [];\n return e !== 0 && (s++, l.push(r)), l.push(...i.slice(s, o)), (t !== 1 || e === 1) && l.push(a), new To(l, this.getNormalAt(e), this._raw, this._alignTangentsWithPath);\n }\n /**\n * Forces the Path3D tangent, normal, binormal and distance recomputation.\n * @param path path which all values are copied into the curves points\n * @param firstNormal which should be projected onto the curve\n * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path\n * @returns the same object updated.\n */\n update(e, t = null, i = !1) {\n for (let r = 0; r < e.length; r++)\n this._curve[r].x = e[r].x, this._curve[r].y = e[r].y, this._curve[r].z = e[r].z;\n return this._compute(t, i), this;\n }\n // private function compute() : computes tangents, normals and binormals\n _compute(e, t = !1) {\n const i = this._curve.length;\n if (i < 2)\n return;\n this._tangents[0] = this._getFirstNonNullVector(0), this._raw || this._tangents[0].normalize(), this._tangents[i - 1] = this._curve[i - 1].subtract(this._curve[i - 2]), this._raw || this._tangents[i - 1].normalize();\n const r = this._tangents[0], s = this._normalVector(r, e);\n this._normals[0] = s, this._raw || this._normals[0].normalize(), this._binormals[0] = _.Cross(r, this._normals[0]), this._raw || this._binormals[0].normalize(), this._distances[0] = 0;\n let a, o, l, c, h;\n for (let u = 1; u < i; u++)\n a = this._getLastNonNullVector(u), u < i - 1 && (o = this._getFirstNonNullVector(u), this._tangents[u] = t ? o : a.add(o), this._tangents[u].normalize()), this._distances[u] = this._distances[u - 1] + this._curve[u].subtract(this._curve[u - 1]).length(), l = this._tangents[u], h = this._binormals[u - 1], this._normals[u] = _.Cross(h, l), this._raw || (this._normals[u].length() === 0 ? (c = this._normals[u - 1], this._normals[u] = c.clone()) : this._normals[u].normalize()), this._binormals[u] = _.Cross(l, this._normals[u]), this._raw || this._binormals[u].normalize();\n this._pointAtData.id = NaN;\n }\n // private function getFirstNonNullVector(index)\n // returns the first non null vector from index : curve[index + N].subtract(curve[index])\n _getFirstNonNullVector(e) {\n let t = 1, i = this._curve[e + t].subtract(this._curve[e]);\n for (; i.length() === 0 && e + t + 1 < this._curve.length; )\n t++, i = this._curve[e + t].subtract(this._curve[e]);\n return i;\n }\n // private function getLastNonNullVector(index)\n // returns the last non null vector from index : curve[index].subtract(curve[index - N])\n _getLastNonNullVector(e) {\n let t = 1, i = this._curve[e].subtract(this._curve[e - t]);\n for (; i.length() === 0 && e > t + 1; )\n t++, i = this._curve[e].subtract(this._curve[e - t]);\n return i;\n }\n // private function normalVector(v0, vt, va) :\n // returns an arbitrary point in the plane defined by the point v0 and the vector vt orthogonal to this plane\n // if va is passed, it returns the va projection on the plane orthogonal to vt at the point v0\n _normalVector(e, t) {\n let i, r = e.length();\n if (r === 0 && (r = 1), t == null) {\n let s;\n je.WithinEpsilon(Math.abs(e.y) / r, 1, xt) ? je.WithinEpsilon(Math.abs(e.x) / r, 1, xt) ? je.WithinEpsilon(Math.abs(e.z) / r, 1, xt) ? s = _.Zero() : s = new _(0, 0, 1) : s = new _(1, 0, 0) : s = new _(0, -1, 0), i = _.Cross(e, s);\n } else\n i = _.Cross(e, t), _.CrossToRef(i, e, i);\n return i.normalize(), i;\n }\n /**\n * Updates the point at data for an interpolated point along this curve\n * @param position the position of the point along this curve, from 0.0 to 1.0\n * @param interpolateTNB\n * @interpolateTNB whether to compute the interpolated tangent, normal and binormal\n * @returns the (updated) point at data\n */\n _updatePointAtData(e, t = !1) {\n if (this._pointAtData.id === e)\n return this._pointAtData.interpolateReady || this._updateInterpolationMatrix(), this._pointAtData;\n this._pointAtData.id = e;\n const i = this.getPoints();\n if (e <= 0)\n return this._setPointAtData(0, 0, i[0], 0, t);\n if (e >= 1)\n return this._setPointAtData(1, 1, i[i.length - 1], i.length - 1, t);\n let r = i[0], s, a = 0;\n const o = e * this.length();\n for (let l = 1; l < i.length; l++) {\n s = i[l];\n const c = _.Distance(r, s);\n if (a += c, a === o)\n return this._setPointAtData(e, 1, s, l, t);\n if (a > o) {\n const u = (a - o) / c, f = r.subtract(s), d = s.add(f.scaleInPlace(u));\n return this._setPointAtData(e, 1 - u, d, l - 1, t);\n }\n r = s;\n }\n return this._pointAtData;\n }\n /**\n * Updates the point at data from the specified parameters\n * @param position where along the path the interpolated point is, from 0.0 to 1.0\n * @param subPosition\n * @param point the interpolated point\n * @param parentIndex the index of an existing curve point that is on, or else positionally the first behind, the interpolated point\n * @param interpolateTNB whether to compute the interpolated tangent, normal and binormal\n * @returns the (updated) point at data\n */\n _setPointAtData(e, t, i, r, s) {\n return this._pointAtData.point = i, this._pointAtData.position = e, this._pointAtData.subPosition = t, this._pointAtData.previousPointArrayIndex = r, this._pointAtData.interpolateReady = s, s && this._updateInterpolationMatrix(), this._pointAtData;\n }\n /**\n * Updates the point at interpolation matrix for the tangents, normals and binormals\n */\n _updateInterpolationMatrix() {\n this._pointAtData.interpolationMatrix = L.Identity();\n const e = this._pointAtData.previousPointArrayIndex;\n if (e !== this._tangents.length - 1) {\n const t = e + 1, i = this._tangents[e].clone(), r = this._normals[e].clone(), s = this._binormals[e].clone(), a = this._tangents[t].clone(), o = this._normals[t].clone(), l = this._binormals[t].clone(), c = Ce.RotationQuaternionFromAxis(r, s, i), h = Ce.RotationQuaternionFromAxis(o, l, a);\n Ce.Slerp(c, h, this._pointAtData.subPosition).toRotationMatrix(this._pointAtData.interpolationMatrix);\n }\n }\n}\nclass Os {\n /**\n * Returns a Curve3 object along a Quadratic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#quadratic-bezier-curve\n * @param v0 (Vector3) the origin point of the Quadratic Bezier\n * @param v1 (Vector3) the control point\n * @param v2 (Vector3) the end point of the Quadratic Bezier\n * @param nbPoints (integer) the wanted number of points in the curve\n * @returns the created Curve3\n */\n static CreateQuadraticBezier(e, t, i, r) {\n r = r > 2 ? r : 3;\n const s = [], a = (o, l, c, h) => (1 - o) * (1 - o) * l + 2 * o * (1 - o) * c + o * o * h;\n for (let o = 0; o <= r; o++)\n s.push(new _(a(o / r, e.x, t.x, i.x), a(o / r, e.y, t.y, i.y), a(o / r, e.z, t.z, i.z)));\n return new Os(s);\n }\n /**\n * Returns a Curve3 object along a Cubic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#cubic-bezier-curve\n * @param v0 (Vector3) the origin point of the Cubic Bezier\n * @param v1 (Vector3) the first control point\n * @param v2 (Vector3) the second control point\n * @param v3 (Vector3) the end point of the Cubic Bezier\n * @param nbPoints (integer) the wanted number of points in the curve\n * @returns the created Curve3\n */\n static CreateCubicBezier(e, t, i, r, s) {\n s = s > 3 ? s : 4;\n const a = [], o = (l, c, h, u, f) => (1 - l) * (1 - l) * (1 - l) * c + 3 * l * (1 - l) * (1 - l) * h + 3 * l * l * (1 - l) * u + l * l * l * f;\n for (let l = 0; l <= s; l++)\n a.push(new _(o(l / s, e.x, t.x, i.x, r.x), o(l / s, e.y, t.y, i.y, r.y), o(l / s, e.z, t.z, i.z, r.z)));\n return new Os(a);\n }\n /**\n * Returns a Curve3 object along a Hermite Spline curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#hermite-spline\n * @param p1 (Vector3) the origin point of the Hermite Spline\n * @param t1 (Vector3) the tangent vector at the origin point\n * @param p2 (Vector3) the end point of the Hermite Spline\n * @param t2 (Vector3) the tangent vector at the end point\n * @param nSeg (integer) the number of curve segments or nSeg + 1 points in the array\n * @returns the created Curve3\n */\n static CreateHermiteSpline(e, t, i, r, s) {\n const a = [], o = 1 / s;\n for (let l = 0; l <= s; l++)\n a.push(_.Hermite(e, t, i, r, l * o));\n return new Os(a);\n }\n /**\n * Returns a Curve3 object along a CatmullRom Spline curve :\n * @param points (array of Vector3) the points the spline must pass through. At least, four points required\n * @param nbPoints (integer) the wanted number of points between each curve control points\n * @param closed (boolean) optional with default false, when true forms a closed loop from the points\n * @returns the created Curve3\n */\n static CreateCatmullRomSpline(e, t, i) {\n const r = [], s = 1 / t;\n let a = 0;\n if (i) {\n const o = e.length;\n for (let l = 0; l < o; l++) {\n a = 0;\n for (let c = 0; c < t; c++)\n r.push(_.CatmullRom(e[l % o], e[(l + 1) % o], e[(l + 2) % o], e[(l + 3) % o], a)), a += s;\n }\n r.push(r[0]);\n } else {\n const o = [];\n o.push(e[0].clone()), Array.prototype.push.apply(o, e), o.push(e[e.length - 1].clone());\n let l = 0;\n for (; l < o.length - 3; l++) {\n a = 0;\n for (let c = 0; c < t; c++)\n r.push(_.CatmullRom(o[l], o[l + 1], o[l + 2], o[l + 3], a)), a += s;\n }\n l--, r.push(_.CatmullRom(o[l], o[l + 1], o[l + 2], o[l + 3], a));\n }\n return new Os(r);\n }\n /**\n * Returns a Curve3 object along an arc through three vector3 points:\n * The three points should not be colinear. When they are the Curve3 is empty.\n * @param first (Vector3) the first point the arc must pass through.\n * @param second (Vector3) the second point the arc must pass through.\n * @param third (Vector3) the third point the arc must pass through.\n * @param steps (number) the larger the number of steps the more detailed the arc.\n * @param closed (boolean) optional with default false, when true forms the chord from the first and third point\n * @param fullCircle Circle (boolean) optional with default false, when true forms the complete circle through the three points\n * @returns the created Curve3\n */\n static ArcThru3Points(e, t, i, r = 32, s = !1, a = !1) {\n const o = [], l = t.subtract(e), c = i.subtract(t), h = e.subtract(i), u = _.Cross(l, c), f = u.length();\n if (f < Math.pow(10, -8))\n return new Os(o);\n const d = l.lengthSquared(), p = c.lengthSquared(), g = h.lengthSquared(), m = u.lengthSquared(), v = l.length(), E = c.length(), C = h.length(), T = 0.5 * v * E * C / f, R = _.Dot(l, h), x = _.Dot(l, c), S = _.Dot(c, h), M = -0.5 * p * R / m, N = -0.5 * g * x / m, F = -0.5 * d * S / m, U = e.scale(M).add(t.scale(N)).add(i.scale(F)), q = e.subtract(U).normalize(), Z = _.Cross(u, q).normalize();\n if (a) {\n const k = 2 * Math.PI / r;\n for (let Q = 0; Q <= 2 * Math.PI; Q += k)\n o.push(U.add(q.scale(T * Math.cos(Q)).add(Z.scale(T * Math.sin(Q)))));\n o.push(e);\n } else {\n const k = 1 / r;\n let Q = 0, ce = _.Zero();\n do\n ce = U.add(q.scale(T * Math.cos(Q)).add(Z.scale(T * Math.sin(Q)))), o.push(ce), Q += k;\n while (!ce.equalsWithEpsilon(i, T * k * 1.1));\n o.push(i), s && o.push(e);\n }\n return new Os(o);\n }\n /**\n * A Curve3 object is a logical object, so not a mesh, to handle curves in the 3D geometric space.\n * A Curve3 is designed from a series of successive Vector3.\n * Tuto : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#curve3-object\n * @param points points which make up the curve\n */\n constructor(e) {\n this._length = 0, this._points = e, this._length = this._computeLength(e);\n }\n /**\n * @returns the Curve3 stored array of successive Vector3\n */\n getPoints() {\n return this._points;\n }\n /**\n * @returns the computed length (float) of the curve.\n */\n length() {\n return this._length;\n }\n /**\n * Returns a new instance of Curve3 object : var curve = curveA.continue(curveB);\n * This new Curve3 is built by translating and sticking the curveB at the end of the curveA.\n * curveA and curveB keep unchanged.\n * @param curve the curve to continue from this curve\n * @returns the newly constructed curve\n */\n continue(e) {\n const t = this._points[this._points.length - 1], i = this._points.slice(), r = e.getPoints();\n for (let a = 1; a < r.length; a++)\n i.push(r[a].subtract(r[0]).add(t));\n return new Os(i);\n }\n _computeLength(e) {\n let t = 0;\n for (let i = 1; i < e.length; i++)\n t += e[i].subtract(e[i - 1]).length();\n return t;\n }\n}\nclass Ob extends me {\n constructor(e, t) {\n super(e.x, e.y), this.index = t;\n }\n}\nclass Gh {\n constructor() {\n this.elements = [];\n }\n add(e) {\n const t = [];\n return e.forEach((i) => {\n const r = new Ob(i, this.elements.length);\n t.push(r), this.elements.push(r);\n }), t;\n }\n computeBounds() {\n const e = new me(this.elements[0].x, this.elements[0].y), t = new me(this.elements[0].x, this.elements[0].y);\n return this.elements.forEach((i) => {\n i.x < e.x ? e.x = i.x : i.x > t.x && (t.x = i.x), i.y < e.y ? e.y = i.y : i.y > t.y && (t.y = i.y);\n }), {\n min: e,\n max: t,\n width: t.x - e.x,\n height: t.y - e.y\n };\n }\n}\nclass Db {\n _addToepoint(e) {\n for (const t of e)\n this._epoints.push(t.x, t.y);\n }\n /**\n * Creates a PolygonMeshBuilder\n * @param name name of the builder\n * @param contours Path of the polygon\n * @param scene scene to add to when creating the mesh\n * @param earcutInjection can be used to inject your own earcut reference\n */\n constructor(e, t, i, r = earcut) {\n this._points = new Gh(), this._outlinepoints = new Gh(), this._holes = new Array(), this._epoints = new Array(), this._eholes = new Array(), this.bjsEarcut = r, this._name = e, this._scene = i || st.LastCreatedScene;\n let s;\n t instanceof Vc ? s = t.getPoints() : s = t, this._addToepoint(s), this._points.add(s), this._outlinepoints.add(s), typeof this.bjsEarcut > \"u\" && ne.Warn(\"Earcut was not found, the polygon will not be built.\");\n }\n /**\n * Adds a hole within the polygon\n * @param hole Array of points defining the hole\n * @returns this\n */\n addHole(e) {\n this._points.add(e);\n const t = new Gh();\n return t.add(e), this._holes.push(t), this._eholes.push(this._epoints.length / 2), this._addToepoint(e), this;\n }\n /**\n * Creates the polygon\n * @param updatable If the mesh should be updatable\n * @param depth The depth of the mesh created\n * @param smoothingThreshold Dot product threshold for smoothed normals\n * @returns the created mesh\n */\n build(e = !1, t = 0, i = 2) {\n const r = new B(this._name, this._scene), s = this.buildVertexData(t, i);\n return r.setVerticesData(I.PositionKind, s.positions, e), r.setVerticesData(I.NormalKind, s.normals, e), r.setVerticesData(I.UVKind, s.uvs, e), r.setIndices(s.indices), r;\n }\n /**\n * Creates the polygon\n * @param depth The depth of the mesh created\n * @param smoothingThreshold Dot product threshold for smoothed normals\n * @returns the created VertexData\n */\n buildVertexData(e = 0, t = 2) {\n const i = new re(), r = [], s = [], a = [], o = this._points.computeBounds();\n this._points.elements.forEach((h) => {\n r.push(0, 1, 0), s.push(h.x, 0, h.y), a.push((h.x - o.min.x) / o.width, (h.y - o.min.y) / o.height);\n });\n const l = [], c = this.bjsEarcut(this._epoints, this._eholes, 2);\n for (let h = 0; h < c.length; h++)\n l.push(c[h]);\n if (e > 0) {\n const h = s.length / 3;\n this._points.elements.forEach((f) => {\n r.push(0, -1, 0), s.push(f.x, -e, f.y), a.push(1 - (f.x - o.min.x) / o.width, 1 - (f.y - o.min.y) / o.height);\n });\n const u = l.length;\n for (let f = 0; f < u; f += 3) {\n const d = l[f + 0], p = l[f + 1], g = l[f + 2];\n l.push(g + h), l.push(p + h), l.push(d + h);\n }\n this._addSide(s, r, a, l, o, this._outlinepoints, e, !1, t), this._holes.forEach((f) => {\n this._addSide(s, r, a, l, o, f, e, !0, t);\n });\n }\n return i.indices = l, i.positions = s, i.normals = r, i.uvs = a, i;\n }\n /**\n * Adds a side to the polygon\n * @param positions points that make the polygon\n * @param normals normals of the polygon\n * @param uvs uvs of the polygon\n * @param indices indices of the polygon\n * @param bounds bounds of the polygon\n * @param points points of the polygon\n * @param depth depth of the polygon\n * @param flip flip of the polygon\n * @param smoothingThreshold\n */\n _addSide(e, t, i, r, s, a, o, l, c) {\n let h = e.length / 3, u = 0;\n for (let f = 0; f < a.elements.length; f++) {\n const d = a.elements[f], p = a.elements[(f + 1) % a.elements.length];\n e.push(d.x, 0, d.y), e.push(d.x, -o, d.y), e.push(p.x, 0, p.y), e.push(p.x, -o, p.y);\n const g = a.elements[(f + a.elements.length - 1) % a.elements.length], m = a.elements[(f + 2) % a.elements.length];\n let v = new _(-(p.y - d.y), 0, p.x - d.x), E = new _(-(d.y - g.y), 0, d.x - g.x), C = new _(-(m.y - p.y), 0, m.x - p.x);\n l || (v = v.scale(-1), E = E.scale(-1), C = C.scale(-1));\n const T = v.normalizeToNew();\n let R = E.normalizeToNew(), x = C.normalizeToNew();\n const S = _.Dot(R, T);\n S > c ? S < xt - 1 ? R = new _(d.x, 0, d.y).subtract(new _(p.x, 0, p.y)).normalize() : R = E.add(v).normalize() : R = T;\n const M = _.Dot(C, v);\n M > c ? M < xt - 1 ? x = new _(p.x, 0, p.y).subtract(new _(d.x, 0, d.y)).normalize() : x = C.add(v).normalize() : x = T, i.push(u / s.width, 0), i.push(u / s.width, 1), u += v.length(), i.push(u / s.width, 0), i.push(u / s.width, 1), t.push(R.x, R.y, R.z), t.push(R.x, R.y, R.z), t.push(x.x, x.y, x.z), t.push(x.x, x.y, x.z), l ? (r.push(h), r.push(h + 2), r.push(h + 1), r.push(h + 1), r.push(h + 2), r.push(h + 3)) : (r.push(h), r.push(h + 1), r.push(h + 2), r.push(h + 1), r.push(h + 3), r.push(h + 2)), h += 4;\n }\n }\n}\nfunction R0(n, e, t, i, r, s, a) {\n const o = t || new Array(3), l = i, c = [], h = a || !1;\n for (let N = 0; N < 3; N++)\n o[N] === void 0 && (o[N] = new Ke(0, 0, 1, 1)), l && l[N] === void 0 && (l[N] = new et(1, 1, 1, 1));\n const u = n.getVerticesData(I.PositionKind), f = n.getVerticesData(I.NormalKind), d = n.getVerticesData(I.UVKind), p = n.getIndices(), g = u.length / 9;\n let m = 0, v = 0, E = 0, C = 0, T = 0;\n const R = [0];\n if (h)\n for (let N = g; N < u.length / 3; N += 4)\n v = u[3 * (N + 2)] - u[3 * N], E = u[3 * (N + 2) + 2] - u[3 * N + 2], C = Math.sqrt(v * v + E * E), T += C, R.push(T);\n let x = 0, S = 0;\n for (let N = 0; N < f.length; N += 3)\n Math.abs(f[N + 1]) < 1e-3 && (S = 1), Math.abs(f[N + 1] - 1) < 1e-3 && (S = 0), Math.abs(f[N + 1] + 1) < 1e-3 && (S = 2), x = N / 3, S === 1 ? (m = x - g, m % 4 < 1.5 ? h ? d[2 * x] = o[S].x + (o[S].z - o[S].x) * R[Math.floor(m / 4)] / T : d[2 * x] = o[S].x : h ? d[2 * x] = o[S].x + (o[S].z - o[S].x) * R[Math.floor(m / 4) + 1] / T : d[2 * x] = o[S].z, m % 2 === 0 ? d[2 * x + 1] = nt.UseOpenGLOrientationForUV ? 1 - o[S].w : o[S].w : d[2 * x + 1] = nt.UseOpenGLOrientationForUV ? 1 - o[S].y : o[S].y) : (d[2 * x] = (1 - d[2 * x]) * o[S].x + d[2 * x] * o[S].z, d[2 * x + 1] = (1 - d[2 * x + 1]) * o[S].y + d[2 * x + 1] * o[S].w, nt.UseOpenGLOrientationForUV && (d[2 * x + 1] = 1 - d[2 * x + 1])), l && c.push(l[S].r, l[S].g, l[S].b, l[S].a);\n re._ComputeSides(e, u, p, f, d, r, s);\n const M = new re();\n if (M.indices = p, M.positions = u, M.normals = f, M.uvs = d, l) {\n const N = e === re.DOUBLESIDE ? c.concat(c) : c;\n M.colors = N;\n }\n return M;\n}\nfunction S0(n, e, t = null, i = earcut) {\n e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation);\n const r = e.shape, s = e.holes || [], a = e.depth || 0, o = e.smoothingThreshold || 2, l = [];\n let c = [];\n for (let p = 0; p < r.length; p++)\n l[p] = new me(r[p].x, r[p].z);\n l[0].equalsWithEpsilon(l[l.length - 1], 1e-8) && l.pop();\n const u = new Db(n, l, t || st.LastCreatedScene, i);\n for (let p = 0; p < s.length; p++) {\n c = [];\n for (let g = 0; g < s[p].length; g++)\n c.push(new me(s[p][g].x, s[p][g].z));\n u.addHole(c);\n }\n const f = u.build(!1, a, o);\n return f._originalBuilderSideOrientation = e.sideOrientation, R0(f, e.sideOrientation, e.faceUV, e.faceColors, e.frontUVs, e.backUVs, e.wrap).applyToMesh(f, e.updatable), f;\n}\nfunction Nb(n, e, t = null, i = earcut) {\n return S0(n, e, t, i);\n}\nre.CreatePolygon = R0;\nB.CreatePolygon = (n, e, t, i, r, s, a = earcut) => S0(n, {\n shape: e,\n holes: i,\n updatable: r,\n sideOrientation: s\n}, t, a);\nB.ExtrudePolygon = (n, e, t, i, r, s, a, o = earcut) => Nb(n, {\n shape: e,\n holes: r,\n depth: t,\n updatable: s,\n sideOrientation: a\n}, i, o);\nfunction Fb(n, e, t = null) {\n const i = e.path, r = e.shape, s = e.scale || 1, a = e.rotation || 0, o = e.cap === 0 ? 0 : e.cap || B.NO_CAP, l = e.updatable, c = B._GetDefaultSideOrientation(e.sideOrientation), h = e.instance || null, u = e.invertUV || !1, f = e.closeShape || !1, d = e.closePath || !1;\n return y0(n, r, i, s, a, null, null, d, f, o, !1, t, !!l, c, h, u, e.frontUVs || null, e.backUVs || null, e.firstNormal || null, !!e.adjustFrame);\n}\nfunction Lb(n, e, t = null) {\n const i = e.path, r = e.shape, s = e.scaleFunction || (() => 1), a = e.rotationFunction || (() => 0), o = e.closePath || e.ribbonCloseArray || !1, l = e.closeShape || e.ribbonClosePath || !1, c = e.cap === 0 ? 0 : e.cap || B.NO_CAP, h = e.updatable, u = e.firstNormal || null, f = e.adjustFrame || !1, d = B._GetDefaultSideOrientation(e.sideOrientation), p = e.instance, g = e.invertUV || !1;\n return y0(n, r, i, null, null, s, a, o, l, c, !0, t, !!h, d, p || null, g, e.frontUVs || null, e.backUVs || null, u, f);\n}\nfunction y0(n, e, t, i, r, s, a, o, l, c, h, u, f, d, p, g, m, v, E, C) {\n const T = (N, F, U, H, q, Z, k, Q, ce, de, j) => {\n const J = U.getTangents(), O = U.getNormals(), G = U.getBinormals(), ee = U.getDistances();\n if (j) {\n for (let ue = 0; ue < J.length; ue++)\n if (J[ue].x == 0 && J[ue].y == 0 && J[ue].z == 0 && J[ue].copyFrom(J[ue - 1]), O[ue].x == 0 && O[ue].y == 0 && O[ue].z == 0 && O[ue].copyFrom(O[ue - 1]), G[ue].x == 0 && G[ue].y == 0 && G[ue].z == 0 && G[ue].copyFrom(G[ue - 1]), ue > 0) {\n let Ye = J[ue - 1];\n _.Dot(Ye, J[ue]) < 0 && J[ue].scaleInPlace(-1), Ye = O[ue - 1], _.Dot(Ye, O[ue]) < 0 && O[ue].scaleInPlace(-1), Ye = G[ue - 1], _.Dot(Ye, G[ue]) < 0 && G[ue].scaleInPlace(-1);\n }\n }\n let _e = 0;\n const Oe = () => q !== null ? q : 1, fe = de && Q ? Q : () => Z !== null ? Z : 0, Te = de && k ? k : Oe;\n let Fe = ce === B.NO_CAP || ce === B.CAP_END ? 0 : 2;\n const Se = z.Matrix[0];\n for (let ue = 0; ue < F.length; ue++) {\n const Ye = [], lt = fe(ue, ee[ue]), Ut = Te(ue, ee[ue]);\n L.RotationAxisToRef(J[ue], _e, Se);\n for (let Ct = 0; Ct < N.length; Ct++) {\n const Bi = J[ue].scale(N[Ct].z).add(O[ue].scale(N[Ct].x)).add(G[ue].scale(N[Ct].y)), hi = _.Zero();\n _.TransformCoordinatesToRef(Bi, Se, hi), hi.scaleInPlace(Ut).addInPlace(F[ue]), Ye[Ct] = hi;\n }\n H[Fe] = Ye, _e += lt, Fe++;\n }\n const qe = (ue) => {\n const Ye = Array(), lt = _.Zero();\n let Ut;\n for (Ut = 0; Ut < ue.length; Ut++)\n lt.addInPlace(ue[Ut]);\n for (lt.scaleInPlace(1 / ue.length), Ut = 0; Ut < ue.length; Ut++)\n Ye.push(lt);\n return Ye;\n };\n switch (ce) {\n case B.NO_CAP:\n break;\n case B.CAP_START:\n H[0] = qe(H[2]), H[1] = H[2];\n break;\n case B.CAP_END:\n H[Fe] = H[Fe - 1], H[Fe + 1] = qe(H[Fe - 1]);\n break;\n case B.CAP_ALL:\n H[0] = qe(H[2]), H[1] = H[2], H[Fe] = H[Fe - 1], H[Fe + 1] = qe(H[Fe - 1]);\n break;\n }\n return H;\n };\n let R, x;\n if (p) {\n const N = p._creationDataStorage;\n return R = E ? N.path3D.update(t, E) : N.path3D.update(t), x = T(e, t, N.path3D, N.pathArray, i, r, s, a, N.cap, h, C), p = Oa(\"\", { pathArray: x, closeArray: !1, closePath: !1, offset: 0, updatable: !1, sideOrientation: 0, instance: p }, u || void 0), p;\n }\n R = E ? new To(t, E) : new To(t);\n const S = new Array();\n c = c < 0 || c > 3 ? 0 : c, x = T(e, t, R, S, i, r, s, a, c, h, C);\n const M = Oa(n, {\n pathArray: x,\n closeArray: o,\n closePath: l,\n updatable: f,\n sideOrientation: d,\n invertUV: g,\n frontUVs: m || void 0,\n backUVs: v || void 0\n }, u);\n return M._creationDataStorage.pathArray = x, M._creationDataStorage.path3D = R, M._creationDataStorage.cap = c, M;\n}\nB.ExtrudeShape = (n, e, t, i, r, s, a = null, o, l, c) => {\n const h = {\n shape: e,\n path: t,\n scale: i,\n rotation: r,\n cap: s === 0 ? 0 : s || B.NO_CAP,\n sideOrientation: l,\n instance: c,\n updatable: o\n };\n return Fb(n, h, a);\n};\nB.ExtrudeShapeCustom = (n, e, t, i, r, s, a, o, l, c, h, u) => {\n const f = {\n shape: e,\n path: t,\n scaleFunction: i,\n rotationFunction: r,\n ribbonCloseArray: s,\n ribbonClosePath: a,\n cap: o === 0 ? 0 : o || B.NO_CAP,\n sideOrientation: h,\n instance: u,\n updatable: c\n };\n return Lb(n, f, l);\n};\nfunction wb(n, e, t = null) {\n const i = e.arc ? e.arc <= 0 || e.arc > 1 ? 1 : e.arc : 1, r = e.closed === void 0 ? !0 : e.closed, s = e.shape, a = e.radius || 1, o = e.tessellation || 64, l = e.clip || 0, c = e.updatable, h = B._GetDefaultSideOrientation(e.sideOrientation), u = e.cap || B.NO_CAP, f = Math.PI * 2, d = [], p = e.invertUV || !1;\n let g = 0, m = 0;\n const v = f / o * i;\n let E, C;\n for (g = 0; g <= o - l; g++) {\n for (C = [], (u == B.CAP_START || u == B.CAP_ALL) && (C.push(new _(0, s[0].y, 0)), C.push(new _(Math.cos(g * v) * s[0].x * a, s[0].y, Math.sin(g * v) * s[0].x * a))), m = 0; m < s.length; m++)\n E = new _(Math.cos(g * v) * s[m].x * a, s[m].y, Math.sin(g * v) * s[m].x * a), C.push(E);\n (u == B.CAP_END || u == B.CAP_ALL) && (C.push(new _(Math.cos(g * v) * s[s.length - 1].x * a, s[s.length - 1].y, Math.sin(g * v) * s[s.length - 1].x * a)), C.push(new _(0, s[s.length - 1].y, 0))), d.push(C);\n }\n return Oa(n, { pathArray: d, closeArray: r, sideOrientation: h, updatable: c, invertUV: p, frontUVs: e.frontUVs, backUVs: e.backUVs }, t);\n}\nB.CreateLathe = (n, e, t, i, r, s, a) => wb(n, {\n shape: e,\n radius: t,\n tessellation: i,\n sideOrientation: a,\n updatable: s\n}, r);\nfunction xf(n) {\n const e = [], t = [], i = [], r = [], s = n.width || n.size || 1, a = n.height || n.size || 1, o = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, l = s / 2, c = a / 2;\n t.push(-l, -c, 0), i.push(0, 0, -1), r.push(0, nt.UseOpenGLOrientationForUV ? 1 : 0), t.push(l, -c, 0), i.push(0, 0, -1), r.push(1, nt.UseOpenGLOrientationForUV ? 1 : 0), t.push(l, c, 0), i.push(0, 0, -1), r.push(1, nt.UseOpenGLOrientationForUV ? 0 : 1), t.push(-l, c, 0), i.push(0, 0, -1), r.push(0, nt.UseOpenGLOrientationForUV ? 0 : 1), e.push(0), e.push(1), e.push(2), e.push(0), e.push(2), e.push(3), re._ComputeSides(o, t, e, i, r, n.frontUVs, n.backUVs);\n const h = new re();\n return h.indices = e, h.positions = t, h.normals = i, h.uvs = r, h;\n}\nfunction Ub(n, e = {}, t = null) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, xf(e).applyToMesh(i, e.updatable), e.sourcePlane && (i.translate(e.sourcePlane.normal, -e.sourcePlane.d), i.setDirection(e.sourcePlane.normal.scale(-1))), i;\n}\nre.CreatePlane = xf;\nB.CreatePlane = (n, e, t, i, r) => Ub(n, {\n size: e,\n width: e,\n height: e,\n sideOrientation: r,\n updatable: i\n}, t);\nfunction Vb(n, e, t = null) {\n const i = e.path;\n let r = e.instance, s = 1;\n e.radius !== void 0 ? s = e.radius : r && (s = r._creationDataStorage.radius);\n const a = e.tessellation || 64, o = e.radiusFunction || null;\n let l = e.cap || B.NO_CAP;\n const c = e.invertUV || !1, h = e.updatable, u = B._GetDefaultSideOrientation(e.sideOrientation);\n e.arc = e.arc && (e.arc <= 0 || e.arc > 1) ? 1 : e.arc || 1;\n const f = (v, E, C, T, R, x, S, M) => {\n const N = E.getTangents(), F = E.getNormals(), U = E.getDistances(), q = Math.PI * 2 / R * M, k = x || (() => T);\n let Q, ce, de, j;\n const J = z.Matrix[0];\n let O = S === B.NO_CAP || S === B.CAP_END ? 0 : 2;\n for (let ee = 0; ee < v.length; ee++) {\n ce = k(ee, U[ee]), Q = Array(), de = F[ee];\n for (let _e = 0; _e < R; _e++)\n L.RotationAxisToRef(N[ee], q * _e, J), j = Q[_e] ? Q[_e] : _.Zero(), _.TransformCoordinatesToRef(de, J, j), j.scaleInPlace(ce).addInPlace(v[ee]), Q[_e] = j;\n C[O] = Q, O++;\n }\n const G = (ee, _e) => {\n const Oe = Array();\n for (let ze = 0; ze < ee; ze++)\n Oe.push(v[_e]);\n return Oe;\n };\n switch (S) {\n case B.NO_CAP:\n break;\n case B.CAP_START:\n C[0] = G(R, 0), C[1] = C[2].slice(0);\n break;\n case B.CAP_END:\n C[O] = C[O - 1].slice(0), C[O + 1] = G(R, v.length - 1);\n break;\n case B.CAP_ALL:\n C[0] = G(R, 0), C[1] = C[2].slice(0), C[O] = C[O - 1].slice(0), C[O + 1] = G(R, v.length - 1);\n break;\n }\n return C;\n };\n let d, p;\n if (r) {\n const v = r._creationDataStorage, E = e.arc || v.arc;\n return d = v.path3D.update(i), p = f(i, d, v.pathArray, s, v.tessellation, o, v.cap, E), r = Oa(\"\", { pathArray: p, instance: r }), v.path3D = d, v.pathArray = p, v.arc = E, v.radius = s, r;\n }\n d = new To(i);\n const g = new Array();\n l = l < 0 || l > 3 ? 0 : l, p = f(i, d, g, s, a, o, l, e.arc);\n const m = Oa(n, {\n pathArray: p,\n closePath: !0,\n closeArray: !1,\n updatable: h,\n sideOrientation: u,\n invertUV: c,\n frontUVs: e.frontUVs,\n backUVs: e.backUVs\n }, t);\n return m._creationDataStorage.pathArray = p, m._creationDataStorage.path3D = d, m._creationDataStorage.tessellation = a, m._creationDataStorage.cap = l, m._creationDataStorage.arc = e.arc, m._creationDataStorage.radius = s, m;\n}\nB.CreateTube = (n, e, t, i, r, s, a, o, l, c) => Vb(n, {\n path: e,\n radius: t,\n tessellation: i,\n radiusFunction: r,\n arc: 1,\n cap: s,\n updatable: o,\n sideOrientation: l,\n instance: c\n}, a);\nfunction I0(n) {\n const e = [];\n e[0] = {\n vertex: [\n [0, 0, 1.732051],\n [1.632993, 0, -0.5773503],\n [-0.8164966, 1.414214, -0.5773503],\n [-0.8164966, -1.414214, -0.5773503]\n ],\n face: [\n [0, 1, 2],\n [0, 2, 3],\n [0, 3, 1],\n [1, 3, 2]\n ]\n }, e[1] = {\n vertex: [\n [0, 0, 1.414214],\n [1.414214, 0, 0],\n [0, 1.414214, 0],\n [-1.414214, 0, 0],\n [0, -1.414214, 0],\n [0, 0, -1.414214]\n ],\n face: [\n [0, 1, 2],\n [0, 2, 3],\n [0, 3, 4],\n [0, 4, 1],\n [1, 4, 5],\n [1, 5, 2],\n [2, 5, 3],\n [3, 5, 4]\n ]\n }, e[2] = {\n vertex: [\n [0, 0, 1.070466],\n [0.7136442, 0, 0.7978784],\n [-0.3568221, 0.618034, 0.7978784],\n [-0.3568221, -0.618034, 0.7978784],\n [0.7978784, 0.618034, 0.3568221],\n [0.7978784, -0.618034, 0.3568221],\n [-0.9341724, 0.381966, 0.3568221],\n [0.1362939, 1, 0.3568221],\n [0.1362939, -1, 0.3568221],\n [-0.9341724, -0.381966, 0.3568221],\n [0.9341724, 0.381966, -0.3568221],\n [0.9341724, -0.381966, -0.3568221],\n [-0.7978784, 0.618034, -0.3568221],\n [-0.1362939, 1, -0.3568221],\n [-0.1362939, -1, -0.3568221],\n [-0.7978784, -0.618034, -0.3568221],\n [0.3568221, 0.618034, -0.7978784],\n [0.3568221, -0.618034, -0.7978784],\n [-0.7136442, 0, -0.7978784],\n [0, 0, -1.070466]\n ],\n face: [\n [0, 1, 4, 7, 2],\n [0, 2, 6, 9, 3],\n [0, 3, 8, 5, 1],\n [1, 5, 11, 10, 4],\n [2, 7, 13, 12, 6],\n [3, 9, 15, 14, 8],\n [4, 10, 16, 13, 7],\n [5, 8, 14, 17, 11],\n [6, 12, 18, 15, 9],\n [10, 11, 17, 19, 16],\n [12, 13, 16, 19, 18],\n [14, 15, 18, 19, 17]\n ]\n }, e[3] = {\n vertex: [\n [0, 0, 1.175571],\n [1.051462, 0, 0.5257311],\n [0.3249197, 1, 0.5257311],\n [-0.8506508, 0.618034, 0.5257311],\n [-0.8506508, -0.618034, 0.5257311],\n [0.3249197, -1, 0.5257311],\n [0.8506508, 0.618034, -0.5257311],\n [0.8506508, -0.618034, -0.5257311],\n [-0.3249197, 1, -0.5257311],\n [-1.051462, 0, -0.5257311],\n [-0.3249197, -1, -0.5257311],\n [0, 0, -1.175571]\n ],\n face: [\n [0, 1, 2],\n [0, 2, 3],\n [0, 3, 4],\n [0, 4, 5],\n [0, 5, 1],\n [1, 5, 7],\n [1, 7, 6],\n [1, 6, 2],\n [2, 6, 8],\n [2, 8, 3],\n [3, 8, 9],\n [3, 9, 4],\n [4, 9, 10],\n [4, 10, 5],\n [5, 10, 7],\n [6, 7, 11],\n [6, 11, 8],\n [7, 10, 11],\n [8, 11, 9],\n [9, 11, 10]\n ]\n }, e[4] = {\n vertex: [\n [0, 0, 1.070722],\n [0.7148135, 0, 0.7971752],\n [-0.104682, 0.7071068, 0.7971752],\n [-0.6841528, 0.2071068, 0.7971752],\n [-0.104682, -0.7071068, 0.7971752],\n [0.6101315, 0.7071068, 0.5236279],\n [1.04156, 0.2071068, 0.1367736],\n [0.6101315, -0.7071068, 0.5236279],\n [-0.3574067, 1, 0.1367736],\n [-0.7888348, -0.5, 0.5236279],\n [-0.9368776, 0.5, 0.1367736],\n [-0.3574067, -1, 0.1367736],\n [0.3574067, 1, -0.1367736],\n [0.9368776, -0.5, -0.1367736],\n [0.7888348, 0.5, -0.5236279],\n [0.3574067, -1, -0.1367736],\n [-0.6101315, 0.7071068, -0.5236279],\n [-1.04156, -0.2071068, -0.1367736],\n [-0.6101315, -0.7071068, -0.5236279],\n [0.104682, 0.7071068, -0.7971752],\n [0.6841528, -0.2071068, -0.7971752],\n [0.104682, -0.7071068, -0.7971752],\n [-0.7148135, 0, -0.7971752],\n [0, 0, -1.070722]\n ],\n face: [\n [0, 2, 3],\n [1, 6, 5],\n [4, 9, 11],\n [7, 15, 13],\n [8, 16, 10],\n [12, 14, 19],\n [17, 22, 18],\n [20, 21, 23],\n [0, 1, 5, 2],\n [0, 3, 9, 4],\n [0, 4, 7, 1],\n [1, 7, 13, 6],\n [2, 5, 12, 8],\n [2, 8, 10, 3],\n [3, 10, 17, 9],\n [4, 11, 15, 7],\n [5, 6, 14, 12],\n [6, 13, 20, 14],\n [8, 12, 19, 16],\n [9, 17, 18, 11],\n [10, 16, 22, 17],\n [11, 18, 21, 15],\n [13, 15, 21, 20],\n [14, 20, 23, 19],\n [16, 19, 23, 22],\n [18, 22, 23, 21]\n ]\n }, e[5] = {\n vertex: [\n [0, 0, 1.322876],\n [1.309307, 0, 0.1889822],\n [-0.9819805, 0.8660254, 0.1889822],\n [0.1636634, -1.299038, 0.1889822],\n [0.3273268, 0.8660254, -0.9449112],\n [-0.8183171, -0.4330127, -0.9449112]\n ],\n face: [\n [0, 3, 1],\n [2, 4, 5],\n [0, 1, 4, 2],\n [0, 2, 5, 3],\n [1, 3, 5, 4]\n ]\n }, e[6] = {\n vertex: [\n [0, 0, 1.159953],\n [1.013464, 0, 0.5642542],\n [-0.3501431, 0.9510565, 0.5642542],\n [-0.7715208, -0.6571639, 0.5642542],\n [0.6633206, 0.9510565, -0.03144481],\n [0.8682979, -0.6571639, -0.3996071],\n [-1.121664, 0.2938926, -0.03144481],\n [-0.2348831, -1.063314, -0.3996071],\n [0.5181548, 0.2938926, -0.9953061],\n [-0.5850262, -0.112257, -0.9953061]\n ],\n face: [\n [0, 1, 4, 2],\n [0, 2, 6, 3],\n [1, 5, 8, 4],\n [3, 6, 9, 7],\n [5, 7, 9, 8],\n [0, 3, 7, 5, 1],\n [2, 4, 8, 9, 6]\n ]\n }, e[7] = {\n vertex: [\n [0, 0, 1.118034],\n [0.8944272, 0, 0.6708204],\n [-0.2236068, 0.8660254, 0.6708204],\n [-0.7826238, -0.4330127, 0.6708204],\n [0.6708204, 0.8660254, 0.2236068],\n [1.006231, -0.4330127, -0.2236068],\n [-1.006231, 0.4330127, 0.2236068],\n [-0.6708204, -0.8660254, -0.2236068],\n [0.7826238, 0.4330127, -0.6708204],\n [0.2236068, -0.8660254, -0.6708204],\n [-0.8944272, 0, -0.6708204],\n [0, 0, -1.118034]\n ],\n face: [\n [0, 1, 4, 2],\n [0, 2, 6, 3],\n [1, 5, 8, 4],\n [3, 6, 10, 7],\n [5, 9, 11, 8],\n [7, 10, 11, 9],\n [0, 3, 7, 9, 5, 1],\n [2, 4, 8, 11, 10, 6]\n ]\n }, e[8] = {\n vertex: [\n [-0.729665, 0.670121, 0.319155],\n [-0.655235, -0.29213, -0.754096],\n [-0.093922, -0.607123, 0.537818],\n [0.702196, 0.595691, 0.485187],\n [0.776626, -0.36656, -0.588064]\n ],\n face: [\n [1, 4, 2],\n [0, 1, 2],\n [3, 0, 2],\n [4, 3, 2],\n [4, 1, 0, 3]\n ]\n }, e[9] = {\n vertex: [\n [-0.868849, -0.100041, 0.61257],\n [-0.329458, 0.976099, 0.28078],\n [-0.26629, -0.013796, -0.477654],\n [-0.13392, -1.034115, 0.229829],\n [0.738834, 0.707117, -0.307018],\n [0.859683, -0.535264, -0.338508]\n ],\n face: [\n [3, 0, 2],\n [5, 3, 2],\n [4, 5, 2],\n [1, 4, 2],\n [0, 1, 2],\n [0, 3, 5, 4, 1]\n ]\n }, e[10] = {\n vertex: [\n [-0.610389, 0.243975, 0.531213],\n [-0.187812, -0.48795, -0.664016],\n [-0.187812, 0.9759, -0.664016],\n [0.187812, -0.9759, 0.664016],\n [0.798201, 0.243975, 0.132803]\n ],\n face: [\n [1, 3, 0],\n [3, 4, 0],\n [3, 1, 4],\n [0, 2, 1],\n [0, 4, 2],\n [2, 4, 1]\n ]\n }, e[11] = {\n vertex: [\n [-1.028778, 0.392027, -0.048786],\n [-0.640503, -0.646161, 0.621837],\n [-0.125162, -0.395663, -0.540059],\n [4683e-6, 0.888447, -0.651988],\n [0.125161, 0.395663, 0.540059],\n [0.632925, -0.791376, 0.433102],\n [1.031672, 0.157063, -0.354165]\n ],\n face: [\n [3, 2, 0],\n [2, 1, 0],\n [2, 5, 1],\n [0, 4, 3],\n [0, 1, 4],\n [4, 1, 5],\n [2, 3, 6],\n [3, 4, 6],\n [5, 2, 6],\n [4, 5, 6]\n ]\n }, e[12] = {\n vertex: [\n [-0.669867, 0.334933, -0.529576],\n [-0.669867, 0.334933, 0.529577],\n [-0.4043, 1.212901, 0],\n [-0.334933, -0.669867, -0.529576],\n [-0.334933, -0.669867, 0.529577],\n [0.334933, 0.669867, -0.529576],\n [0.334933, 0.669867, 0.529577],\n [0.4043, -1.212901, 0],\n [0.669867, -0.334933, -0.529576],\n [0.669867, -0.334933, 0.529577]\n ],\n face: [\n [8, 9, 7],\n [6, 5, 2],\n [3, 8, 7],\n [5, 0, 2],\n [4, 3, 7],\n [0, 1, 2],\n [9, 4, 7],\n [1, 6, 2],\n [9, 8, 5, 6],\n [8, 3, 0, 5],\n [3, 4, 1, 0],\n [4, 9, 6, 1]\n ]\n }, e[13] = {\n vertex: [\n [-0.931836, 0.219976, -0.264632],\n [-0.636706, 0.318353, 0.692816],\n [-0.613483, -0.735083, -0.264632],\n [-0.326545, 0.979634, 0],\n [-0.318353, -0.636706, 0.692816],\n [-0.159176, 0.477529, -0.856368],\n [0.159176, -0.477529, -0.856368],\n [0.318353, 0.636706, 0.692816],\n [0.326545, -0.979634, 0],\n [0.613482, 0.735082, -0.264632],\n [0.636706, -0.318353, 0.692816],\n [0.931835, -0.219977, -0.264632]\n ],\n face: [\n [11, 10, 8],\n [7, 9, 3],\n [6, 11, 8],\n [9, 5, 3],\n [2, 6, 8],\n [5, 0, 3],\n [4, 2, 8],\n [0, 1, 3],\n [10, 4, 8],\n [1, 7, 3],\n [10, 11, 9, 7],\n [11, 6, 5, 9],\n [6, 2, 0, 5],\n [2, 4, 1, 0],\n [4, 10, 7, 1]\n ]\n }, e[14] = {\n vertex: [\n [-0.93465, 0.300459, -0.271185],\n [-0.838689, -0.260219, -0.516017],\n [-0.711319, 0.717591, 0.128359],\n [-0.710334, -0.156922, 0.080946],\n [-0.599799, 0.556003, -0.725148],\n [-0.503838, -4675e-6, -0.969981],\n [-0.487004, 0.26021, 0.48049],\n [-0.460089, -0.750282, -0.512622],\n [-0.376468, 0.973135, -0.325605],\n [-0.331735, -0.646985, 0.084342],\n [-0.254001, 0.831847, 0.530001],\n [-0.125239, -0.494738, -0.966586],\n [0.029622, 0.027949, 0.730817],\n [0.056536, -0.982543, -0.262295],\n [0.08085, 1.087391, 0.076037],\n [0.125583, -0.532729, 0.485984],\n [0.262625, 0.599586, 0.780328],\n [0.391387, -0.726999, -0.716259],\n [0.513854, -0.868287, 0.139347],\n [0.597475, 0.85513, 0.326364],\n [0.641224, 0.109523, 0.783723],\n [0.737185, -0.451155, 0.538891],\n [0.848705, -0.612742, -0.314616],\n [0.976075, 0.365067, 0.32976],\n [1.072036, -0.19561, 0.084927]\n ],\n face: [\n [15, 18, 21],\n [12, 20, 16],\n [6, 10, 2],\n [3, 0, 1],\n [9, 7, 13],\n [2, 8, 4, 0],\n [0, 4, 5, 1],\n [1, 5, 11, 7],\n [7, 11, 17, 13],\n [13, 17, 22, 18],\n [18, 22, 24, 21],\n [21, 24, 23, 20],\n [20, 23, 19, 16],\n [16, 19, 14, 10],\n [10, 14, 8, 2],\n [15, 9, 13, 18],\n [12, 15, 21, 20],\n [6, 12, 16, 10],\n [3, 6, 2, 0],\n [9, 3, 1, 7],\n [9, 15, 12, 6, 3],\n [22, 17, 11, 5, 4, 8, 14, 19, 23, 24]\n ]\n };\n const t = n.type && (n.type < 0 || n.type >= e.length) ? 0 : n.type || 0, i = n.size, r = n.sizeX || i || 1, s = n.sizeY || i || 1, a = n.sizeZ || i || 1, o = n.custom || e[t], l = o.face.length, c = n.faceUV || new Array(l), h = n.faceColors, u = n.flat === void 0 ? !0 : n.flat, f = n.sideOrientation === 0 ? 0 : n.sideOrientation || re.DEFAULTSIDE, d = [], p = [], g = [], m = [], v = [];\n let E = 0, C = 0;\n const T = [];\n let R = 0, x = 0, S, M, N, F, U, H;\n if (u)\n for (x = 0; x < l; x++)\n h && h[x] === void 0 && (h[x] = new et(1, 1, 1, 1)), c && c[x] === void 0 && (c[x] = new Ke(0, 0, 1, 1));\n if (u)\n for (x = 0; x < l; x++) {\n const Z = o.face[x].length;\n for (N = 2 * Math.PI / Z, F = 0.5 * Math.tan(N / 2), U = 0.5, R = 0; R < Z; R++)\n d.push(o.vertex[o.face[x][R]][0] * r, o.vertex[o.face[x][R]][1] * s, o.vertex[o.face[x][R]][2] * a), T.push(E), E++, S = c[x].x + (c[x].z - c[x].x) * (0.5 + F), M = c[x].y + (c[x].w - c[x].y) * (U - 0.5), m.push(S, nt.UseOpenGLOrientationForUV ? 1 - M : M), H = F * Math.cos(N) - U * Math.sin(N), U = F * Math.sin(N) + U * Math.cos(N), F = H, h && v.push(h[x].r, h[x].g, h[x].b, h[x].a);\n for (R = 0; R < Z - 2; R++)\n p.push(T[0 + C], T[R + 2 + C], T[R + 1 + C]);\n C += Z;\n }\n else {\n for (R = 0; R < o.vertex.length; R++)\n d.push(o.vertex[R][0] * r, o.vertex[R][1] * s, o.vertex[R][2] * a), m.push(0, nt.UseOpenGLOrientationForUV ? 1 : 0);\n for (x = 0; x < l; x++)\n for (R = 0; R < o.face[x].length - 2; R++)\n p.push(o.face[x][0], o.face[x][R + 2], o.face[x][R + 1]);\n }\n re.ComputeNormals(d, p, g), re._ComputeSides(f, d, p, g, m, n.frontUVs, n.backUVs);\n const q = new re();\n return q.positions = d, q.indices = p, q.normals = g, q.uvs = m, h && u && (q.colors = v), q;\n}\nfunction Bb(n, e = {}, t = null) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, I0(e).applyToMesh(i, e.updatable), i;\n}\nre.CreatePolyhedron = I0;\nB.CreatePolyhedron = (n, e, t) => Bb(n, e, t);\nfunction Cf(n) {\n const e = n.sideOrientation || re.DEFAULTSIDE, t = n.radius || 1, i = n.flat === void 0 ? !0 : n.flat, r = (n.subdivisions || 4) | 0, s = n.radiusX || t, a = n.radiusY || t, o = n.radiusZ || t, l = (1 + Math.sqrt(5)) / 2, c = [\n -1,\n l,\n -0,\n 1,\n l,\n 0,\n -1,\n -l,\n 0,\n 1,\n -l,\n 0,\n 0,\n -1,\n -l,\n 0,\n 1,\n -l,\n 0,\n -1,\n l,\n 0,\n 1,\n l,\n l,\n 0,\n 1,\n l,\n 0,\n -1,\n -l,\n 0,\n 1,\n -l,\n 0,\n -1\n // v8-11\n ], h = [\n 0,\n 11,\n 5,\n 0,\n 5,\n 1,\n 0,\n 1,\n 7,\n 0,\n 7,\n 10,\n 12,\n 22,\n 23,\n 1,\n 5,\n 20,\n 5,\n 11,\n 4,\n 23,\n 22,\n 13,\n 22,\n 18,\n 6,\n 7,\n 1,\n 8,\n 14,\n 21,\n 4,\n 14,\n 4,\n 2,\n 16,\n 13,\n 6,\n 15,\n 6,\n 19,\n 3,\n 8,\n 9,\n 4,\n 21,\n 5,\n 13,\n 17,\n 23,\n 6,\n 13,\n 22,\n 19,\n 6,\n 18,\n 9,\n 8,\n 1\n ], u = [\n 0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9,\n 10,\n 11,\n // vertex alias\n 0,\n 2,\n 3,\n 3,\n 3,\n 4,\n 7,\n 8,\n 9,\n 9,\n 10,\n 11\n // 23: B + 12\n ], f = [\n 5,\n 1,\n 3,\n 1,\n 6,\n 4,\n 0,\n 0,\n 5,\n 3,\n 4,\n 2,\n 2,\n 2,\n 4,\n 0,\n 2,\n 0,\n 1,\n 1,\n 6,\n 0,\n 6,\n 2,\n // vertex alias (for same vertex on different faces)\n 0,\n 4,\n 3,\n 3,\n 4,\n 4,\n 3,\n 1,\n 4,\n 2,\n 4,\n 4,\n 0,\n 2,\n 1,\n 1,\n 2,\n 2,\n 3,\n 3,\n 1,\n 3,\n 2,\n 4\n // 23: B + 12\n ], d = 138 / 1024, p = 239 / 1024, g = 60 / 1024, m = 26 / 1024, v = -40 / 1024, E = 20 / 1024, C = [\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 1,\n 0,\n 0,\n 0,\n 1,\n 1,\n 0,\n 0,\n 1,\n 1,\n 1,\n 0\n // 15 - 19\n ], T = [], R = [], x = [], S = [];\n let M = 0;\n const N = new Array(3), F = new Array(3);\n let U;\n for (U = 0; U < 3; U++)\n N[U] = _.Zero(), F[U] = me.Zero();\n for (let q = 0; q < 20; q++) {\n for (U = 0; U < 3; U++) {\n const k = h[3 * q + U];\n N[U].copyFromFloats(c[3 * u[k]], c[3 * u[k] + 1], c[3 * u[k] + 2]), N[U].normalize(), F[U].copyFromFloats(f[2 * k] * d + g + C[q] * v, f[2 * k + 1] * p + m + C[q] * E);\n }\n const Z = (k, Q, ce, de) => {\n const j = _.Lerp(N[0], N[2], Q / r), J = _.Lerp(N[1], N[2], Q / r), O = r === Q ? N[2] : _.Lerp(j, J, k / (r - Q));\n O.normalize();\n let G;\n if (i) {\n const ze = _.Lerp(N[0], N[2], de / r), fe = _.Lerp(N[1], N[2], de / r);\n G = _.Lerp(ze, fe, ce / (r - de));\n } else\n G = new _(O.x, O.y, O.z);\n G.x /= s, G.y /= a, G.z /= o, G.normalize();\n const ee = me.Lerp(F[0], F[2], Q / r), _e = me.Lerp(F[1], F[2], Q / r), Oe = r === Q ? F[2] : me.Lerp(ee, _e, k / (r - Q));\n R.push(O.x * s, O.y * a, O.z * o), x.push(G.x, G.y, G.z), S.push(Oe.x, nt.UseOpenGLOrientationForUV ? 1 - Oe.y : Oe.y), T.push(M), M++;\n };\n for (let k = 0; k < r; k++)\n for (let Q = 0; Q + k < r; Q++)\n Z(Q, k, Q + 1 / 3, k + 1 / 3), Z(Q + 1, k, Q + 1 / 3, k + 1 / 3), Z(Q, k + 1, Q + 1 / 3, k + 1 / 3), Q + k + 1 < r && (Z(Q + 1, k, Q + 2 / 3, k + 2 / 3), Z(Q + 1, k + 1, Q + 2 / 3, k + 2 / 3), Z(Q, k + 1, Q + 2 / 3, k + 2 / 3));\n }\n re._ComputeSides(e, R, T, x, S, n.frontUVs, n.backUVs);\n const H = new re();\n return H.indices = T, H.positions = R, H.normals = x, H.uvs = S, H;\n}\nfunction kb(n, e = {}, t = null) {\n const i = new B(n, t);\n return e.sideOrientation = B._GetDefaultSideOrientation(e.sideOrientation), i._originalBuilderSideOrientation = e.sideOrientation, Cf(e).applyToMesh(i, e.updatable), i;\n}\nre.CreateIcoSphere = Cf;\nB.CreateIcoSphere = (n, e, t) => kb(n, e, t);\nconst zb = new _(1, 0, 0), Wb = new _(-1, 0, 0), Gb = new _(0, 1, 0), Xb = new _(0, -1, 0), Hb = new _(0, 0, 1), Kb = new _(0, 0, -1);\nclass nc {\n constructor(e = _.Zero(), t = _.Up(), i = me.Zero(), r = 0, s = 0, a = null, o = null, l = null, c = null) {\n this.position = e, this.normal = t, this.uv = i, this.vertexIdx = r, this.vertexIdxForBones = s, this.localPositionOverride = a, this.localNormalOverride = o, this.matrixIndicesOverride = l, this.matrixWeightsOverride = c;\n }\n clone() {\n var e, t, i, r;\n return new nc(this.position.clone(), this.normal.clone(), this.uv.clone(), this.vertexIdx, this.vertexIdxForBones, (e = this.localPositionOverride) == null ? void 0 : e.slice(), (t = this.localNormalOverride) == null ? void 0 : t.slice(), (i = this.matrixIndicesOverride) == null ? void 0 : i.slice(), (r = this.matrixWeightsOverride) == null ? void 0 : r.slice());\n }\n}\nfunction qb(n, e, t) {\n var ce, de, j, J;\n const i = !!e.skeleton, r = t.localMode || i, s = e.overrideMaterialSideOrientation !== null && e.overrideMaterialSideOrientation !== void 0, a = e.getIndices(), o = i ? e.getPositionData(!0, !0) : e.getVerticesData(I.PositionKind), l = i ? e.getNormalsData(!0, !0) : e.getVerticesData(I.NormalKind), c = r ? i ? e.getVerticesData(I.PositionKind) : o : null, h = r ? i ? e.getVerticesData(I.NormalKind) : l : null, u = e.getVerticesData(I.UVKind), f = i ? e.getVerticesData(I.MatricesIndicesKind) : null, d = i ? e.getVerticesData(I.MatricesWeightsKind) : null, p = i ? e.getVerticesData(I.MatricesIndicesExtraKind) : null, g = i ? e.getVerticesData(I.MatricesWeightsExtraKind) : null, m = t.position || _.Zero();\n let v = t.normal || _.Up();\n const E = t.size || _.One(), C = t.angle || 0;\n if (!v) {\n const O = new _(0, 0, 1), G = e.getScene().activeCamera, ee = _.TransformCoordinates(O, G.getWorldMatrix());\n v = G.globalPosition.subtract(ee);\n }\n const T = -Math.atan2(v.z, v.x) - Math.PI / 2, R = Math.sqrt(v.x * v.x + v.z * v.z), x = Math.atan2(v.y, R), S = new re();\n S.indices = [], S.positions = [], S.normals = [], S.uvs = [], S.matricesIndices = i ? [] : null, S.matricesWeights = i ? [] : null, S.matricesIndicesExtra = p ? [] : null, S.matricesWeightsExtra = g ? [] : null;\n let M = 0;\n const N = (O, G) => {\n const ee = new nc();\n if (!a || !o || !l)\n return ee;\n const _e = a[O];\n if (ee.vertexIdx = _e * 3, ee.vertexIdxForBones = _e * 4, ee.position = new _(o[_e * 3], o[_e * 3 + 1], o[_e * 3 + 2]), _.TransformCoordinatesToRef(ee.position, G, ee.position), ee.normal = new _(l[_e * 3], l[_e * 3 + 1], l[_e * 3 + 2]), _.TransformNormalToRef(ee.normal, G, ee.normal), t.captureUVS && u) {\n const Oe = u[_e * 2 + 1];\n ee.uv = new me(u[_e * 2], nt.UseOpenGLOrientationForUV ? 1 - Oe : Oe);\n }\n return ee;\n }, F = [0, 0, 0, 0], U = (O, G) => {\n if (O.length === 0)\n return O;\n const ee = 0.5 * Math.abs(_.Dot(E, G)), _e = (fe, Te, Fe, Se) => {\n for (let qe = 0; qe < Se; ++qe)\n if (fe[Fe + qe] === Te)\n return Fe + qe;\n return -1;\n }, Oe = (fe, Te) => {\n const Fe = _.GetClipFactor(fe.position, Te.position, G, ee);\n let Se = F, qe = F;\n if (f && d) {\n const yr = fe.matrixIndicesOverride ? 0 : fe.vertexIdxForBones, Br = fe.matrixIndicesOverride ?? f, gn = fe.matrixWeightsOverride ?? d, Mi = Te.matrixIndicesOverride ? 0 : Te.vertexIdxForBones, sl = Te.matrixIndicesOverride ?? f, Ya = Te.matrixWeightsOverride ?? d;\n Se = [0, 0, 0, 0], qe = [0, 0, 0, 0];\n let ts = 0;\n for (let _r = 0; _r < 4; ++_r)\n if (gn[yr + _r] > 0) {\n const Gs = _e(sl, Br[yr + _r], Mi, 4);\n Se[ts] = Br[yr + _r], qe[ts] = je.Lerp(gn[yr + _r], Gs >= 0 ? Ya[Gs] : 0, Fe), ts++;\n }\n for (let _r = 0; _r < 4 && ts < 4; ++_r) {\n const Gs = sl[Mi + _r];\n _e(Br, Gs, yr, 4) === -1 && (Se[ts] = Gs, qe[ts] = je.Lerp(0, Ya[Mi + _r], Fe), ts++);\n }\n const kn = qe[0] + qe[1] + qe[2] + qe[3];\n qe[0] /= kn, qe[1] /= kn, qe[2] /= kn, qe[3] /= kn;\n }\n const ue = fe.localPositionOverride ? fe.localPositionOverride[0] : (c == null ? void 0 : c[fe.vertexIdx]) ?? 0, Ye = fe.localPositionOverride ? fe.localPositionOverride[1] : (c == null ? void 0 : c[fe.vertexIdx + 1]) ?? 0, lt = fe.localPositionOverride ? fe.localPositionOverride[2] : (c == null ? void 0 : c[fe.vertexIdx + 2]) ?? 0, Ut = Te.localPositionOverride ? Te.localPositionOverride[0] : (c == null ? void 0 : c[Te.vertexIdx]) ?? 0, Ct = Te.localPositionOverride ? Te.localPositionOverride[1] : (c == null ? void 0 : c[Te.vertexIdx + 1]) ?? 0, Bi = Te.localPositionOverride ? Te.localPositionOverride[2] : (c == null ? void 0 : c[Te.vertexIdx + 2]) ?? 0, hi = fe.localNormalOverride ? fe.localNormalOverride[0] : (h == null ? void 0 : h[fe.vertexIdx]) ?? 0, Es = fe.localNormalOverride ? fe.localNormalOverride[1] : (h == null ? void 0 : h[fe.vertexIdx + 1]) ?? 0, Vr = fe.localNormalOverride ? fe.localNormalOverride[2] : (h == null ? void 0 : h[fe.vertexIdx + 2]) ?? 0, vs = Te.localNormalOverride ? Te.localNormalOverride[0] : (h == null ? void 0 : h[Te.vertexIdx]) ?? 0, ki = Te.localNormalOverride ? Te.localNormalOverride[1] : (h == null ? void 0 : h[Te.vertexIdx + 1]) ?? 0, cr = Te.localNormalOverride ? Te.localNormalOverride[2] : (h == null ? void 0 : h[Te.vertexIdx + 2]) ?? 0, Rr = hi + (vs - hi) * Fe, Sr = Es + (ki - Es) * Fe, Ts = Vr + (cr - Vr) * Fe, xs = Math.sqrt(Rr * Rr + Sr * Sr + Ts * Ts);\n return new nc(_.Lerp(fe.position, Te.position, Fe), _.Lerp(fe.normal, Te.normal, Fe).normalize(), me.Lerp(fe.uv, Te.uv, Fe), -1, -1, c ? [\n ue + (Ut - ue) * Fe,\n Ye + (Ct - Ye) * Fe,\n lt + (Bi - lt) * Fe\n ] : null, h ? [Rr / xs, Sr / xs, Ts / xs] : null, Se, qe);\n };\n let ze = null;\n O.length > 3 && (ze = []);\n for (let fe = 0; fe < O.length; fe += 3) {\n let Te = 0, Fe = null, Se = null, qe = null, ue = null;\n const Ye = _.Dot(O[fe].position, G) - ee, lt = _.Dot(O[fe + 1].position, G) - ee, Ut = _.Dot(O[fe + 2].position, G) - ee, Ct = Ye > 0, Bi = lt > 0, hi = Ut > 0;\n switch (Te = (Ct ? 1 : 0) + (Bi ? 1 : 0) + (hi ? 1 : 0), Te) {\n case 0:\n O.length > 3 ? (ze.push(O[fe]), ze.push(O[fe + 1]), ze.push(O[fe + 2])) : ze = O;\n break;\n case 1:\n if (ze = ze ?? new Array(), Ct && (Fe = O[fe + 1], Se = O[fe + 2], qe = Oe(O[fe], Fe), ue = Oe(O[fe], Se)), Bi) {\n Fe = O[fe], Se = O[fe + 2], qe = Oe(O[fe + 1], Fe), ue = Oe(O[fe + 1], Se), ze.push(qe), ze.push(Se.clone()), ze.push(Fe.clone()), ze.push(Se.clone()), ze.push(qe.clone()), ze.push(ue);\n break;\n }\n hi && (Fe = O[fe], Se = O[fe + 1], qe = Oe(O[fe + 2], Fe), ue = Oe(O[fe + 2], Se)), Fe && Se && qe && ue && (ze.push(Fe.clone()), ze.push(Se.clone()), ze.push(qe), ze.push(ue), ze.push(qe.clone()), ze.push(Se.clone()));\n break;\n case 2:\n ze = ze ?? new Array(), Ct || (Fe = O[fe].clone(), Se = Oe(Fe, O[fe + 1]), qe = Oe(Fe, O[fe + 2]), ze.push(Fe), ze.push(Se), ze.push(qe)), Bi || (Fe = O[fe + 1].clone(), Se = Oe(Fe, O[fe + 2]), qe = Oe(Fe, O[fe]), ze.push(Fe), ze.push(Se), ze.push(qe)), hi || (Fe = O[fe + 2].clone(), Se = Oe(Fe, O[fe]), qe = Oe(Fe, O[fe + 1]), ze.push(Fe), ze.push(Se), ze.push(qe));\n break;\n }\n }\n return ze;\n }, H = e instanceof B ? e : null, q = H == null ? void 0 : H._thinInstanceDataStorage.matrixData, Z = (H == null ? void 0 : H.thinInstanceCount) || 1, k = z.Matrix[0];\n k.copyFrom(L.IdentityReadOnly);\n for (let O = 0; O < Z; ++O) {\n if (H != null && H.hasThinInstances && q) {\n const fe = O * 16;\n k.setRowFromFloats(0, q[fe + 0], q[fe + 1], q[fe + 2], q[fe + 3]), k.setRowFromFloats(1, q[fe + 4], q[fe + 5], q[fe + 6], q[fe + 7]), k.setRowFromFloats(2, q[fe + 8], q[fe + 9], q[fe + 10], q[fe + 11]), k.setRowFromFloats(3, q[fe + 12], q[fe + 13], q[fe + 14], q[fe + 15]);\n }\n const G = L.RotationYawPitchRoll(T, x, C).multiply(L.Translation(m.x, m.y, m.z)), ee = L.Invert(G), _e = e.getWorldMatrix(), Oe = k.multiply(_e).multiply(ee), ze = new Array(3);\n for (let fe = 0; fe < a.length; fe += 3) {\n let Te = ze;\n if (Te[0] = N(fe, Oe), s && r ? (Te[1] = N(fe + 2, Oe), Te[2] = N(fe + 1, Oe)) : (Te[1] = N(fe + 1, Oe), Te[2] = N(fe + 2, Oe)), !(t.cullBackFaces && -Te[0].normal.z <= 0 && -Te[1].normal.z <= 0 && -Te[2].normal.z <= 0) && (Te = U(Te, zb), !!Te && (Te = U(Te, Wb), !!Te && (Te = U(Te, Gb), !!Te && (Te = U(Te, Xb), !!Te && (Te = U(Te, Hb), !!Te && (Te = U(Te, Kb), !!Te)))))))\n for (let Fe = 0; Fe < Te.length; Fe++) {\n const Se = Te[Fe];\n if (S.indices.push(M), r ? (Se.localPositionOverride ? (S.positions[M * 3] = Se.localPositionOverride[0], S.positions[M * 3 + 1] = Se.localPositionOverride[1], S.positions[M * 3 + 2] = Se.localPositionOverride[2]) : c && (S.positions[M * 3] = c[Se.vertexIdx], S.positions[M * 3 + 1] = c[Se.vertexIdx + 1], S.positions[M * 3 + 2] = c[Se.vertexIdx + 2]), Se.localNormalOverride ? (S.normals[M * 3] = Se.localNormalOverride[0], S.normals[M * 3 + 1] = Se.localNormalOverride[1], S.normals[M * 3 + 2] = Se.localNormalOverride[2]) : h && (S.normals[M * 3] = h[Se.vertexIdx], S.normals[M * 3 + 1] = h[Se.vertexIdx + 1], S.normals[M * 3 + 2] = h[Se.vertexIdx + 2])) : (Se.position.toArray(S.positions, M * 3), Se.normal.toArray(S.normals, M * 3)), S.matricesIndices && S.matricesWeights && (Se.matrixIndicesOverride ? (S.matricesIndices[M * 4] = Se.matrixIndicesOverride[0], S.matricesIndices[M * 4 + 1] = Se.matrixIndicesOverride[1], S.matricesIndices[M * 4 + 2] = Se.matrixIndicesOverride[2], S.matricesIndices[M * 4 + 3] = Se.matrixIndicesOverride[3]) : (f && (S.matricesIndices[M * 4] = f[Se.vertexIdxForBones], S.matricesIndices[M * 4 + 1] = f[Se.vertexIdxForBones + 1], S.matricesIndices[M * 4 + 2] = f[Se.vertexIdxForBones + 2], S.matricesIndices[M * 4 + 3] = f[Se.vertexIdxForBones + 3]), p && S.matricesIndicesExtra && (S.matricesIndicesExtra[M * 4] = p[Se.vertexIdxForBones], S.matricesIndicesExtra[M * 4 + 1] = p[Se.vertexIdxForBones + 1], S.matricesIndicesExtra[M * 4 + 2] = p[Se.vertexIdxForBones + 2], S.matricesIndicesExtra[M * 4 + 3] = p[Se.vertexIdxForBones + 3])), Se.matrixWeightsOverride ? (S.matricesWeights[M * 4] = Se.matrixWeightsOverride[0], S.matricesWeights[M * 4 + 1] = Se.matrixWeightsOverride[1], S.matricesWeights[M * 4 + 2] = Se.matrixWeightsOverride[2], S.matricesWeights[M * 4 + 3] = Se.matrixWeightsOverride[3]) : (d && (S.matricesWeights[M * 4] = d[Se.vertexIdxForBones], S.matricesWeights[M * 4 + 1] = d[Se.vertexIdxForBones + 1], S.matricesWeights[M * 4 + 2] = d[Se.vertexIdxForBones + 2], S.matricesWeights[M * 4 + 3] = d[Se.vertexIdxForBones + 3]), g && S.matricesWeightsExtra && (S.matricesWeightsExtra[M * 4] = g[Se.vertexIdxForBones], S.matricesWeightsExtra[M * 4 + 1] = g[Se.vertexIdxForBones + 1], S.matricesWeightsExtra[M * 4 + 2] = g[Se.vertexIdxForBones + 2], S.matricesWeightsExtra[M * 4 + 3] = g[Se.vertexIdxForBones + 3]))), t.captureUVS)\n Se.uv.toArray(S.uvs, M * 2);\n else {\n S.uvs.push(0.5 + Se.position.x / E.x);\n const qe = 0.5 + Se.position.y / E.y;\n S.uvs.push(nt.UseOpenGLOrientationForUV ? 1 - qe : qe);\n }\n M++;\n }\n }\n }\n S.indices.length === 0 && (S.indices = null), S.positions.length === 0 && (S.positions = null), S.normals.length === 0 && (S.normals = null), S.uvs.length === 0 && (S.uvs = null), ((ce = S.matricesIndices) == null ? void 0 : ce.length) === 0 && (S.matricesIndices = null), ((de = S.matricesWeights) == null ? void 0 : de.length) === 0 && (S.matricesWeights = null), ((j = S.matricesIndicesExtra) == null ? void 0 : j.length) === 0 && (S.matricesIndicesExtra = null), ((J = S.matricesWeightsExtra) == null ? void 0 : J.length) === 0 && (S.matricesWeightsExtra = null);\n const Q = new B(n, e.getScene());\n return S.applyToMesh(Q), r ? (Q.skeleton = e.skeleton, Q.parent = e) : (Q.position = m.clone(), Q.rotation = new _(x, T, C)), Q.computeWorldMatrix(!0), Q.refreshBoundingInfo(!0, !0), Q;\n}\nB.CreateDecal = (n, e, t, i, r, s) => qb(n, e, {\n position: t,\n normal: i,\n size: r,\n angle: s\n});\nfunction Rf(n = {\n subdivisions: 2,\n tessellation: 16,\n height: 1,\n radius: 0.25,\n capSubdivisions: 6\n}) {\n const e = Math.max(n.subdivisions ? n.subdivisions : 2, 1) | 0, t = Math.max(n.tessellation ? n.tessellation : 16, 3) | 0, i = Math.max(n.height ? n.height : 1, 0), r = Math.max(n.radius ? n.radius : 0.25, 0), s = Math.max(n.capSubdivisions ? n.capSubdivisions : 6, 1) | 0, a = t, o = e, l = Math.max(n.radiusTop ? n.radiusTop : r, 0), c = Math.max(n.radiusBottom ? n.radiusBottom : r, 0), h = i - (l + c), u = 0, f = 2 * Math.PI, d = Math.max(n.topCapSubdivisions ? n.topCapSubdivisions : s, 1), p = Math.max(n.bottomCapSubdivisions ? n.bottomCapSubdivisions : s, 1), g = Math.acos((c - l) / i);\n let m = [];\n const v = [], E = [], C = [];\n let T = 0;\n const R = [], x = h * 0.5, S = Math.PI * 0.5;\n let M, N;\n const F = _.Zero(), U = _.Zero(), H = Math.cos(g), q = Math.sin(g), Z = new me(l * q, x + l * H).subtract(new me(c * q, -x + c * H)).length(), k = l * g + Z + c * (S - g);\n let Q = 0;\n for (N = 0; N <= d; N++) {\n const J = [], O = S - g * (N / d);\n Q += l * g / d;\n const G = Math.cos(O), ee = Math.sin(O), _e = G * l;\n for (M = 0; M <= a; M++) {\n const Oe = M / a, ze = Oe * f + u, fe = Math.sin(ze), Te = Math.cos(ze);\n U.x = _e * fe, U.y = x + ee * l, U.z = _e * Te, v.push(U.x, U.y, U.z), F.set(G * fe, ee, G * Te), E.push(F.x, F.y, F.z), C.push(Oe, nt.UseOpenGLOrientationForUV ? Q / k : 1 - Q / k), J.push(T), T++;\n }\n R.push(J);\n }\n const ce = i - l - c + H * l - H * c, de = q * (c - l) / ce;\n for (N = 1; N <= o; N++) {\n const J = [];\n Q += Z / o;\n const O = q * (N * (c - l) / o + l);\n for (M = 0; M <= a; M++) {\n const G = M / a, ee = G * f + u, _e = Math.sin(ee), Oe = Math.cos(ee);\n U.x = O * _e, U.y = x + H * l - N * ce / o, U.z = O * Oe, v.push(U.x, U.y, U.z), F.set(_e, de, Oe).normalize(), E.push(F.x, F.y, F.z), C.push(G, nt.UseOpenGLOrientationForUV ? Q / k : 1 - Q / k), J.push(T), T++;\n }\n R.push(J);\n }\n for (N = 1; N <= p; N++) {\n const J = [], O = S - g - (Math.PI - g) * (N / p);\n Q += c * g / p;\n const G = Math.cos(O), ee = Math.sin(O), _e = G * c;\n for (M = 0; M <= a; M++) {\n const Oe = M / a, ze = Oe * f + u, fe = Math.sin(ze), Te = Math.cos(ze);\n U.x = _e * fe, U.y = -x + ee * c, U.z = _e * Te, v.push(U.x, U.y, U.z), F.set(G * fe, ee, G * Te), E.push(F.x, F.y, F.z), C.push(Oe, nt.UseOpenGLOrientationForUV ? Q / k : 1 - Q / k), J.push(T), T++;\n }\n R.push(J);\n }\n for (M = 0; M < a; M++)\n for (N = 0; N < d + o + p; N++) {\n const J = R[N][M], O = R[N + 1][M], G = R[N + 1][M + 1], ee = R[N][M + 1];\n m.push(J), m.push(O), m.push(ee), m.push(O), m.push(G), m.push(ee);\n }\n if (m = m.reverse(), n.orientation && !n.orientation.equals(_.Up())) {\n const J = new L();\n n.orientation.clone().scale(Math.PI * 0.5).cross(_.Up()).toQuaternion().toRotationMatrix(J);\n const O = _.Zero();\n for (let G = 0; G < v.length; G += 3)\n O.set(v[G], v[G + 1], v[G + 2]), _.TransformCoordinatesToRef(O.clone(), J, O), v[G] = O.x, v[G + 1] = O.y, v[G + 2] = O.z;\n }\n const j = new re();\n return j.positions = v, j.normals = E, j.uvs = C, j.indices = m, j;\n}\nfunction Yb(n, e = {\n orientation: _.Up(),\n subdivisions: 2,\n tessellation: 16,\n height: 1,\n radius: 0.25,\n capSubdivisions: 6,\n updatable: !1\n}, t = null) {\n const i = new B(n, t);\n return Rf(e).applyToMesh(i, e.updatable), i;\n}\nB.CreateCapsule = (n, e, t) => Yb(n, e, t);\nre.CreateCapsule = Rf;\nclass Zb {\n /** Create the ShapePath used to support glyphs\n * @param resolution defines the resolution used to determine the number of points per curve (default is 4)\n */\n constructor(e) {\n this._paths = [], this._tempPaths = [], this._holes = [], this._resolution = e;\n }\n /** Move the virtual cursor to a coordinate\n * @param x defines the x coordinate\n * @param y defines the y coordinate\n */\n moveTo(e, t) {\n this._currentPath = new Vc(e, t), this._tempPaths.push(this._currentPath);\n }\n /** Draw a line from the virtual cursor to a given coordinate\n * @param x defines the x coordinate\n * @param y defines the y coordinate\n */\n lineTo(e, t) {\n this._currentPath.addLineTo(e, t);\n }\n /** Create a quadratic curve from the virtual cursor to a given coordinate\n * @param cpx defines the x coordinate of the control point\n * @param cpy defines the y coordinate of the control point\n * @param x defines the x coordinate of the end point\n * @param y defines the y coordinate of the end point\n */\n quadraticCurveTo(e, t, i, r) {\n this._currentPath.addQuadraticCurveTo(e, t, i, r, this._resolution);\n }\n /**\n * Create a bezier curve from the virtual cursor to a given coordinate\n * @param cpx1 defines the x coordinate of the first control point\n * @param cpy1 defines the y coordinate of the first control point\n * @param cpx2 defines the x coordinate of the second control point\n * @param cpy2 defines the y coordinate of the second control point\n * @param x defines the x coordinate of the end point\n * @param y defines the y coordinate of the end point\n */\n bezierCurveTo(e, t, i, r, s, a) {\n this._currentPath.addBezierCurveTo(e, t, i, r, s, a, this._resolution);\n }\n /** Extract holes based on CW / CCW */\n extractHoles() {\n for (const e of this._tempPaths)\n e.area() > 0 ? this._holes.push(e) : this._paths.push(e);\n if (!this._paths.length && this._holes.length) {\n const e = this._holes;\n this._holes = this._paths, this._paths = e;\n }\n this._tempPaths.length = 0;\n }\n /** Gets the list of paths */\n get paths() {\n return this._paths;\n }\n /** Gets the list of holes */\n get holes() {\n return this._holes;\n }\n}\nfunction jb(n, e, t, i, r, s) {\n const a = s.glyphs[n] || s.glyphs[\"?\"];\n if (!a)\n return null;\n const o = new Zb(r);\n if (a.o) {\n const l = a.o.split(\" \");\n for (let c = 0, h = l.length; c < h; )\n switch (l[c++]) {\n case \"m\": {\n const f = parseInt(l[c++]) * e + t, d = parseInt(l[c++]) * e + i;\n o.moveTo(f, d);\n break;\n }\n case \"l\": {\n const f = parseInt(l[c++]) * e + t, d = parseInt(l[c++]) * e + i;\n o.lineTo(f, d);\n break;\n }\n case \"q\": {\n const f = parseInt(l[c++]) * e + t, d = parseInt(l[c++]) * e + i, p = parseInt(l[c++]) * e + t, g = parseInt(l[c++]) * e + i;\n o.quadraticCurveTo(p, g, f, d);\n break;\n }\n case \"b\": {\n const f = parseInt(l[c++]) * e + t, d = parseInt(l[c++]) * e + i, p = parseInt(l[c++]) * e + t, g = parseInt(l[c++]) * e + i, m = parseInt(l[c++]) * e + t, v = parseInt(l[c++]) * e + i;\n o.bezierCurveTo(p, g, m, v, f, d);\n break;\n }\n }\n }\n return o.extractHoles(), { offsetX: a.ha * e, shapePath: o };\n}\nfunction Qb(n, e, t, i) {\n const r = Array.from(n), s = e / i.resolution, a = (i.boundingBox.yMax - i.boundingBox.yMin + i.underlineThickness) * s, o = [];\n let l = 0, c = 0;\n for (let h = 0; h < r.length; h++) {\n const u = r[h];\n if (u === `\n`)\n l = 0, c -= a;\n else {\n const f = jb(u, s, l, c, t, i);\n f && (l += f.offsetX, o.push(f.shapePath));\n }\n }\n return o;\n}\nclass Jb {\n /**\n * Creates a new queue\n */\n constructor() {\n this.running = !1, this._simplificationArray = [];\n }\n /**\n * Adds a new simplification task\n * @param task defines a task to add\n */\n addTask(e) {\n this._simplificationArray.push(e);\n }\n /**\n * Execute next task\n */\n executeNext() {\n const e = this._simplificationArray.pop();\n e ? (this.running = !0, this.runSimplification(e)) : this.running = !1;\n }\n /**\n * Execute a simplification task\n * @param task defines the task to run\n */\n runSimplification(e) {\n if (e.parallelProcessing)\n e.settings.forEach((t) => {\n this._getSimplifier(e).simplify(t, (r) => {\n t.distance !== void 0 && e.mesh.addLODLevel(t.distance, r), r.isVisible = !0, t.quality === e.settings[e.settings.length - 1].quality && e.successCallback && e.successCallback(), this.executeNext();\n });\n });\n else {\n const t = this._getSimplifier(e), i = (r, s) => {\n t.simplify(r, (a) => {\n r.distance !== void 0 && e.mesh.addLODLevel(r.distance, a), a.isVisible = !0, s();\n });\n };\n Pr.Run(e.settings.length, (r) => {\n i(e.settings[r.index], () => {\n r.executeNext();\n });\n }, () => {\n e.successCallback && e.successCallback(), this.executeNext();\n });\n }\n }\n _getSimplifier(e) {\n switch (e.simplificationType) {\n case ac.QUADRATIC:\n default:\n return new iA(e.mesh);\n }\n }\n}\nvar ac;\n(function(n) {\n n[n.QUADRATIC = 0] = \"QUADRATIC\";\n})(ac || (ac = {}));\nclass $b {\n constructor(e) {\n this._vertices = e, this.error = new Array(4), this.deleted = !1, this.isDirty = !1, this.deletePending = !1, this.borderFactor = 0;\n }\n}\nclass eA {\n constructor(e, t) {\n this.position = e, this.id = t, this.isBorder = !0, this.q = new va(), this.triangleCount = 0, this.triangleStart = 0, this.originalOffsets = [];\n }\n updatePosition(e) {\n this.position.copyFrom(e);\n }\n}\nclass va {\n constructor(e) {\n this.data = new Array(10);\n for (let t = 0; t < 10; ++t)\n e && e[t] ? this.data[t] = e[t] : this.data[t] = 0;\n }\n det(e, t, i, r, s, a, o, l, c) {\n return this.data[e] * this.data[s] * this.data[c] + this.data[i] * this.data[r] * this.data[l] + this.data[t] * this.data[a] * this.data[o] - this.data[i] * this.data[s] * this.data[o] - this.data[e] * this.data[a] * this.data[l] - this.data[t] * this.data[r] * this.data[c];\n }\n addInPlace(e) {\n for (let t = 0; t < 10; ++t)\n this.data[t] += e.data[t];\n }\n addArrayInPlace(e) {\n for (let t = 0; t < 10; ++t)\n this.data[t] += e[t];\n }\n add(e) {\n const t = new va();\n for (let i = 0; i < 10; ++i)\n t.data[i] = this.data[i] + e.data[i];\n return t;\n }\n static FromData(e, t, i, r) {\n return new va(va.DataFromNumbers(e, t, i, r));\n }\n //returning an array to avoid garbage collection\n static DataFromNumbers(e, t, i, r) {\n return [e * e, e * t, e * i, e * r, t * t, t * i, t * r, i * i, i * r, r * r];\n }\n}\nclass tA {\n constructor(e, t) {\n this.vertexId = e, this.triangleId = t;\n }\n}\nclass iA {\n /**\n * Creates a new QuadraticErrorSimplification\n * @param _mesh defines the target mesh\n */\n constructor(e) {\n this._mesh = e, this.syncIterations = 5e3, this.aggressiveness = 7, this.decimationIterations = 100, this.boundingBoxEpsilon = xt;\n }\n /**\n * Simplification of a given mesh according to the given settings.\n * Since this requires computation, it is assumed that the function runs async.\n * @param settings The settings of the simplification, including quality and distance\n * @param successCallback A callback that will be called after the mesh was simplified.\n */\n simplify(e, t) {\n this._initDecimatedMesh(), Pr.Run(this._mesh.subMeshes.length, (i) => {\n this._initWithMesh(i.index, () => {\n this._runDecimation(e, i.index, () => {\n i.executeNext();\n });\n }, e.optimizeMesh);\n }, () => {\n setTimeout(() => {\n t(this._reconstructedMesh);\n }, 0);\n });\n }\n _runDecimation(e, t, i) {\n const r = ~~(this._triangles.length * e.quality);\n let s = 0;\n const a = this._triangles.length, o = (l, c) => {\n setTimeout(() => {\n l % 5 === 0 && this._updateMesh(l === 0);\n for (let f = 0; f < this._triangles.length; ++f)\n this._triangles[f].isDirty = !1;\n const h = 1e-9 * Math.pow(l + 3, this.aggressiveness), u = (f) => {\n const d = ~~((this._triangles.length / 2 + f) % this._triangles.length), p = this._triangles[d];\n if (p && !(p.error[3] > h || p.deleted || p.isDirty)) {\n for (let g = 0; g < 3; ++g)\n if (p.error[g] < h) {\n const m = [], v = [], E = p._vertices[g], C = p._vertices[(g + 1) % 3];\n if (E.isBorder || C.isBorder)\n continue;\n const T = _.Zero();\n this._calculateError(E, C, T);\n const R = [];\n if (this._isFlipped(E, C, T, m, R) || this._isFlipped(C, E, T, v, R) || m.indexOf(!0) < 0 || v.indexOf(!0) < 0)\n continue;\n const x = [];\n if (R.forEach((N) => {\n x.indexOf(N) === -1 && (N.deletePending = !0, x.push(N));\n }), x.length % 2 !== 0)\n continue;\n E.q = C.q.add(E.q), E.updatePosition(T);\n const S = this._references.length;\n s = this._updateTriangles(E, E, m, s), s = this._updateTriangles(E, C, v, s);\n const M = this._references.length - S;\n if (M <= E.triangleCount) {\n if (M)\n for (let N = 0; N < M; N++)\n this._references[E.triangleStart + N] = this._references[S + N];\n } else\n E.triangleStart = S;\n E.triangleCount = M;\n break;\n }\n }\n };\n Pr.SyncAsyncForLoop(this._triangles.length, this.syncIterations, u, c, () => a - s <= r);\n }, 0);\n };\n Pr.Run(this.decimationIterations, (l) => {\n a - s <= r ? l.breakLoop() : o(l.index, () => {\n l.executeNext();\n });\n }, () => {\n setTimeout(() => {\n this._reconstructMesh(t), i();\n }, 0);\n });\n }\n _initWithMesh(e, t, i) {\n this._vertices = [], this._triangles = [];\n const r = this._mesh.getVerticesData(I.PositionKind), s = this._mesh.getIndices(), a = this._mesh.subMeshes[e], o = (u) => {\n if (i) {\n for (let f = 0; f < this._vertices.length; ++f)\n if (this._vertices[f].position.equalsWithEpsilon(u, 1e-4))\n return this._vertices[f];\n }\n return null;\n }, l = [], c = (u) => {\n if (!r)\n return;\n const f = u + a.verticesStart, d = _.FromArray(r, f * 3), p = o(d) || new eA(d, this._vertices.length);\n p.originalOffsets.push(f), p.id === this._vertices.length && this._vertices.push(p), l.push(p.id);\n }, h = a.verticesCount;\n Pr.SyncAsyncForLoop(h, this.syncIterations / 4 >> 0, c, () => {\n const u = (f) => {\n if (!s)\n return;\n const p = (a.indexStart / 3 + f) * 3, g = s[p + 0], m = s[p + 1], v = s[p + 2], E = this._vertices[l[g - a.verticesStart]], C = this._vertices[l[m - a.verticesStart]], T = this._vertices[l[v - a.verticesStart]], R = new $b([E, C, T]);\n R.originalOffset = p, this._triangles.push(R);\n };\n Pr.SyncAsyncForLoop(a.indexCount / 3, this.syncIterations, u, () => {\n this._init(t);\n });\n });\n }\n _init(e) {\n const t = (i) => {\n const r = this._triangles[i];\n r.normal = _.Cross(r._vertices[1].position.subtract(r._vertices[0].position), r._vertices[2].position.subtract(r._vertices[0].position)).normalize();\n for (let s = 0; s < 3; s++)\n r._vertices[s].q.addArrayInPlace(va.DataFromNumbers(r.normal.x, r.normal.y, r.normal.z, -_.Dot(r.normal, r._vertices[0].position)));\n };\n Pr.SyncAsyncForLoop(this._triangles.length, this.syncIterations, t, () => {\n const i = (r) => {\n const s = this._triangles[r];\n for (let a = 0; a < 3; ++a)\n s.error[a] = this._calculateError(s._vertices[a], s._vertices[(a + 1) % 3]);\n s.error[3] = Math.min(s.error[0], s.error[1], s.error[2]);\n };\n Pr.SyncAsyncForLoop(this._triangles.length, this.syncIterations, i, () => {\n e();\n });\n });\n }\n _reconstructMesh(e) {\n const t = [];\n let i;\n for (i = 0; i < this._vertices.length; ++i)\n this._vertices[i].triangleCount = 0;\n let r, s;\n for (i = 0; i < this._triangles.length; ++i)\n if (!this._triangles[i].deleted) {\n for (r = this._triangles[i], s = 0; s < 3; ++s)\n r._vertices[s].triangleCount = 1;\n t.push(r);\n }\n const a = this._reconstructedMesh.getVerticesData(I.PositionKind) || [], o = this._reconstructedMesh.getVerticesData(I.NormalKind) || [], l = this._reconstructedMesh.getVerticesData(I.UVKind) || [], c = this._reconstructedMesh.getVerticesData(I.ColorKind) || [], h = this._mesh.getVerticesData(I.NormalKind), u = this._mesh.getVerticesData(I.UVKind), f = this._mesh.getVerticesData(I.ColorKind);\n let d = 0;\n for (i = 0; i < this._vertices.length; ++i) {\n const T = this._vertices[i];\n T.id = d, T.triangleCount && T.originalOffsets.forEach((R) => {\n a.push(T.position.x), a.push(T.position.y), a.push(T.position.z), h && h.length && (o.push(h[R * 3]), o.push(h[R * 3 + 1]), o.push(h[R * 3 + 2])), u && u.length && (l.push(u[R * 2]), l.push(u[R * 2 + 1])), f && f.length && (c.push(f[R * 4]), c.push(f[R * 4 + 1]), c.push(f[R * 4 + 2]), c.push(f[R * 4 + 3])), ++d;\n });\n }\n const p = this._reconstructedMesh.getTotalIndices(), g = this._reconstructedMesh.getTotalVertices(), m = this._reconstructedMesh.subMeshes;\n this._reconstructedMesh.subMeshes = [];\n const v = this._reconstructedMesh.getIndices(), E = this._mesh.getIndices();\n for (i = 0; i < t.length; ++i)\n r = t[i], [0, 1, 2].forEach((T) => {\n const R = E[r.originalOffset + T];\n let x = r._vertices[T].originalOffsets.indexOf(R);\n x < 0 && (x = 0), v.push(r._vertices[T].id + x + g);\n });\n this._reconstructedMesh.setIndices(v), this._reconstructedMesh.setVerticesData(I.PositionKind, a), o.length > 0 && this._reconstructedMesh.setVerticesData(I.NormalKind, o), l.length > 0 && this._reconstructedMesh.setVerticesData(I.UVKind, l), c.length > 0 && this._reconstructedMesh.setVerticesData(I.ColorKind, c);\n const C = this._mesh.subMeshes[e];\n e > 0 && (this._reconstructedMesh.subMeshes = [], m.forEach((T) => {\n bi.AddToMesh(\n T.materialIndex,\n T.verticesStart,\n T.verticesCount,\n /* 0, newPositionData.length/3, */\n T.indexStart,\n T.indexCount,\n T.getMesh()\n );\n }), bi.AddToMesh(\n C.materialIndex,\n g,\n d,\n /* 0, newPositionData.length / 3, */\n p,\n t.length * 3,\n this._reconstructedMesh\n ));\n }\n _initDecimatedMesh() {\n this._reconstructedMesh = new B(this._mesh.name + \"Decimated\", this._mesh.getScene()), this._reconstructedMesh.material = this._mesh.material, this._reconstructedMesh.parent = this._mesh.parent, this._reconstructedMesh.isVisible = !1, this._reconstructedMesh.renderingGroupId = this._mesh.renderingGroupId;\n }\n _isFlipped(e, t, i, r, s) {\n for (let a = 0; a < e.triangleCount; ++a) {\n const o = this._triangles[this._references[e.triangleStart + a].triangleId];\n if (o.deleted)\n continue;\n const l = this._references[e.triangleStart + a].vertexId, c = o._vertices[(l + 1) % 3], h = o._vertices[(l + 2) % 3];\n if (c === t || h === t) {\n r[a] = !0, s.push(o);\n continue;\n }\n let u = c.position.subtract(i);\n u = u.normalize();\n let f = h.position.subtract(i);\n if (f = f.normalize(), Math.abs(_.Dot(u, f)) > 0.999)\n return !0;\n const d = _.Cross(u, f).normalize();\n if (r[a] = !1, _.Dot(d, o.normal) < 0.2)\n return !0;\n }\n return !1;\n }\n _updateTriangles(e, t, i, r) {\n let s = r;\n for (let a = 0; a < t.triangleCount; ++a) {\n const o = this._references[t.triangleStart + a], l = this._triangles[o.triangleId];\n if (!l.deleted) {\n if (i[a] && l.deletePending) {\n l.deleted = !0, s++;\n continue;\n }\n l._vertices[o.vertexId] = e, l.isDirty = !0, l.error[0] = this._calculateError(l._vertices[0], l._vertices[1]) + l.borderFactor / 2, l.error[1] = this._calculateError(l._vertices[1], l._vertices[2]) + l.borderFactor / 2, l.error[2] = this._calculateError(l._vertices[2], l._vertices[0]) + l.borderFactor / 2, l.error[3] = Math.min(l.error[0], l.error[1], l.error[2]), this._references.push(o);\n }\n }\n return s;\n }\n _identifyBorder() {\n for (let e = 0; e < this._vertices.length; ++e) {\n const t = [], i = [], r = this._vertices[e];\n let s;\n for (s = 0; s < r.triangleCount; ++s) {\n const a = this._triangles[this._references[r.triangleStart + s].triangleId];\n for (let o = 0; o < 3; o++) {\n let l = 0;\n const c = a._vertices[o];\n for (; l < t.length && i[l] !== c.id; )\n ++l;\n l === t.length ? (t.push(1), i.push(c.id)) : t[l]++;\n }\n }\n for (s = 0; s < t.length; ++s)\n t[s] === 1 ? this._vertices[i[s]].isBorder = !0 : this._vertices[i[s]].isBorder = !1;\n }\n }\n _updateMesh(e = !1) {\n let t;\n if (!e) {\n const l = [];\n for (t = 0; t < this._triangles.length; ++t)\n this._triangles[t].deleted || l.push(this._triangles[t]);\n this._triangles = l;\n }\n for (t = 0; t < this._vertices.length; ++t)\n this._vertices[t].triangleCount = 0, this._vertices[t].triangleStart = 0;\n let i, r, s;\n for (t = 0; t < this._triangles.length; ++t)\n for (i = this._triangles[t], r = 0; r < 3; ++r)\n s = i._vertices[r], s.triangleCount++;\n let a = 0;\n for (t = 0; t < this._vertices.length; ++t)\n this._vertices[t].triangleStart = a, a += this._vertices[t].triangleCount, this._vertices[t].triangleCount = 0;\n const o = new Array(this._triangles.length * 3);\n for (t = 0; t < this._triangles.length; ++t)\n for (i = this._triangles[t], r = 0; r < 3; ++r)\n s = i._vertices[r], o[s.triangleStart + s.triangleCount] = new tA(r, t), s.triangleCount++;\n this._references = o, e && this._identifyBorder();\n }\n _vertexError(e, t) {\n const i = t.x, r = t.y, s = t.z;\n return e.data[0] * i * i + 2 * e.data[1] * i * r + 2 * e.data[2] * i * s + 2 * e.data[3] * i + e.data[4] * r * r + 2 * e.data[5] * r * s + 2 * e.data[6] * r + e.data[7] * s * s + 2 * e.data[8] * s + e.data[9];\n }\n _calculateError(e, t, i) {\n const r = e.q.add(t.q), s = e.isBorder && t.isBorder;\n let a = 0;\n const o = r.det(0, 1, 2, 1, 4, 5, 2, 5, 7);\n if (o !== 0 && !s)\n i || (i = _.Zero()), i.x = -1 / o * r.det(1, 2, 3, 4, 5, 6, 5, 7, 8), i.y = 1 / o * r.det(0, 2, 3, 1, 5, 6, 2, 7, 8), i.z = -1 / o * r.det(0, 1, 3, 1, 4, 6, 2, 5, 8), a = this._vertexError(r, i);\n else {\n const l = e.position.add(t.position).divide(new _(2, 2, 2)), c = this._vertexError(r, e.position), h = this._vertexError(r, t.position), u = this._vertexError(r, l);\n a = Math.min(c, h, u), a === c ? i && i.copyFrom(e.position) : a === h ? i && i.copyFrom(t.position) : i && i.copyFrom(l);\n }\n return a;\n }\n}\nObject.defineProperty(Ot.prototype, \"simplificationQueue\", {\n get: function() {\n if (!this._simplificationQueue) {\n this._simplificationQueue = new Jb();\n let n = this._getComponent(ke.NAME_SIMPLIFICATIONQUEUE);\n n || (n = new rA(this), this._addComponent(n));\n }\n return this._simplificationQueue;\n },\n set: function(n) {\n this._simplificationQueue = n;\n },\n enumerable: !0,\n configurable: !0\n});\nB.prototype.simplify = function(n, e = !0, t = ac.QUADRATIC, i) {\n return this.getScene().simplificationQueue.addTask({\n settings: n,\n parallelProcessing: e,\n mesh: this,\n simplificationType: t,\n successCallback: i\n }), this;\n};\nclass rA {\n /**\n * Creates a new instance of the component for the given scene\n * @param scene Defines the scene to register the component in\n */\n constructor(e) {\n this.name = ke.NAME_SIMPLIFICATIONQUEUE, this.scene = e;\n }\n /**\n * Registers the component in a given scene\n */\n register() {\n this.scene._beforeCameraUpdateStage.registerStep(ke.STEP_BEFORECAMERAUPDATE_SIMPLIFICATIONQUEUE, this, this._beforeCameraUpdate);\n }\n /**\n * Rebuilds the elements related to this component in case of\n * context lost for instance.\n */\n rebuild() {\n }\n /**\n * Disposes the component and the associated resources\n */\n dispose() {\n }\n _beforeCameraUpdate() {\n this.scene._simplificationQueue && !this.scene._simplificationQueue.running && this.scene._simplificationQueue.executeNext();\n }\n}\nbi.prototype._projectOnTrianglesToRef = function(n, e, t, i, r, s) {\n const a = z.Vector3[0], o = z.Vector3[1];\n let l = 1 / 0;\n for (let c = this.indexStart; c < this.indexStart + this.indexCount - (3 - i); c += i) {\n const h = t[c], u = t[c + 1], f = t[c + 2];\n if (r && f === 4294967295) {\n c += 2;\n continue;\n }\n const d = e[h], p = e[u], g = e[f];\n if (!d || !p || !g)\n continue;\n const m = _.ProjectOnTriangleToRef(n, d, p, g, o);\n m < l && (a.copyFrom(o), l = m);\n }\n return s.copyFrom(a), l;\n};\nbi.prototype._projectOnUnIndexedTrianglesToRef = function(n, e, t, i) {\n const r = z.Vector3[0], s = z.Vector3[1];\n let a = 1 / 0;\n for (let o = this.verticesStart; o < this.verticesStart + this.verticesCount; o += 3) {\n const l = e[o], c = e[o + 1], h = e[o + 2], u = _.ProjectOnTriangleToRef(n, l, c, h, s);\n u < a && (r.copyFrom(s), a = u);\n }\n return i.copyFrom(r), a;\n};\nbi.prototype.projectToRef = function(n, e, t, i) {\n const r = this.getMaterial();\n if (!r)\n return -1;\n let s = 3, a = !1;\n switch (r.fillMode) {\n case 3:\n case 5:\n case 6:\n case 8:\n return -1;\n case 7:\n s = 1, a = !0;\n break;\n }\n return r.fillMode === 4 ? -1 : !t.length && this._mesh._unIndexed ? this._projectOnUnIndexedTrianglesToRef(n, e, t, i) : this._projectOnTrianglesToRef(n, e, t, s, a, i);\n};\nfunction sA(n, e = {}, t) {\n e.diameter || (e.diameter = 1), e.segments || (e.segments = 16);\n const i = v0(\"\", { slice: 0.5, diameter: e.diameter, segments: e.segments }, t), r = g0(\"\", { radius: e.diameter / 2, tessellation: e.segments * 3 + (4 - e.segments) }, t);\n r.rotation.x = -Math.PI / 2, r.parent = i;\n const s = B.MergeMeshes([r, i], !0);\n return s.name = n, s;\n}\nB.CreateHemisphere = (n, e, t, i) => sA(n, {\n segments: e,\n diameter: t\n}, i);\nclass oc {\n constructor() {\n this.previousWorldMatrices = {}, this.previousBones = {};\n }\n /**\n * Add the required uniforms to the current list.\n * @param uniforms defines the current uniform list.\n */\n static AddUniforms(e) {\n e.push(\"previousWorld\", \"previousViewProjection\", \"mPreviousBones\");\n }\n /**\n * Add the required samplers to the current list.\n * @param samplers defines the current sampler list.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static AddSamplers(e) {\n }\n /**\n * Binds the material data.\n * @param effect defines the effect to update\n * @param scene defines the scene the material belongs to.\n * @param mesh The mesh\n * @param world World matrix of this mesh\n * @param isFrozen Is the material frozen\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n bindForSubMesh(e, t, i, r, s) {\n if (t.prePassRenderer && t.prePassRenderer.enabled && t.prePassRenderer.currentRTisSceneRT && t.prePassRenderer.getIndex(2) !== -1) {\n this.previousWorldMatrices[i.uniqueId] || (this.previousWorldMatrices[i.uniqueId] = r.clone()), this.previousViewProjection || (this.previousViewProjection = t.getTransformMatrix().clone(), this.currentViewProjection = t.getTransformMatrix().clone());\n const a = t.getEngine();\n this.currentViewProjection.updateFlag !== t.getTransformMatrix().updateFlag ? (this._lastUpdateFrameId = a.frameId, this.previousViewProjection.copyFrom(this.currentViewProjection), this.currentViewProjection.copyFrom(t.getTransformMatrix())) : this._lastUpdateFrameId !== a.frameId && (this._lastUpdateFrameId = a.frameId, this.previousViewProjection.copyFrom(this.currentViewProjection)), e.setMatrix(\"previousWorld\", this.previousWorldMatrices[i.uniqueId]), e.setMatrix(\"previousViewProjection\", this.previousViewProjection), this.previousWorldMatrices[i.uniqueId] = r.clone();\n }\n }\n}\nclass es {\n /**\n * Creates a new instance\n * @param externalProperties list of external properties to inject into the object\n */\n constructor(e) {\n if (this._keys = [], this._isDirty = !0, this._areLightsDirty = !0, this._areLightsDisposed = !1, this._areAttributesDirty = !0, this._areTexturesDirty = !0, this._areFresnelDirty = !0, this._areMiscDirty = !0, this._arePrePassDirty = !0, this._areImageProcessingDirty = !0, this._normals = !1, this._uvs = !1, this._needNormals = !1, this._needUVs = !1, this._externalProperties = e, e)\n for (const t in e)\n Object.prototype.hasOwnProperty.call(e, t) && this._setDefaultValue(t);\n }\n /**\n * Specifies if the material needs to be re-calculated\n */\n get isDirty() {\n return this._isDirty;\n }\n /**\n * Marks the material to indicate that it has been re-calculated\n */\n markAsProcessed() {\n this._isDirty = !1, this._areAttributesDirty = !1, this._areTexturesDirty = !1, this._areFresnelDirty = !1, this._areLightsDirty = !1, this._areLightsDisposed = !1, this._areMiscDirty = !1, this._arePrePassDirty = !1, this._areImageProcessingDirty = !1;\n }\n /**\n * Marks the material to indicate that it needs to be re-calculated\n */\n markAsUnprocessed() {\n this._isDirty = !0;\n }\n /**\n * Marks the material to indicate all of its defines need to be re-calculated\n */\n markAllAsDirty() {\n this._areTexturesDirty = !0, this._areAttributesDirty = !0, this._areLightsDirty = !0, this._areFresnelDirty = !0, this._areMiscDirty = !0, this._arePrePassDirty = !1, this._areImageProcessingDirty = !0, this._isDirty = !0;\n }\n /**\n * Marks the material to indicate that image processing needs to be re-calculated\n */\n markAsImageProcessingDirty() {\n this._areImageProcessingDirty = !0, this._isDirty = !0;\n }\n /**\n * Marks the material to indicate the lights need to be re-calculated\n * @param disposed Defines whether the light is dirty due to dispose or not\n */\n markAsLightDirty(e = !1) {\n this._areLightsDirty = !0, this._areLightsDisposed = this._areLightsDisposed || e, this._isDirty = !0;\n }\n /**\n * Marks the attribute state as changed\n */\n markAsAttributesDirty() {\n this._areAttributesDirty = !0, this._isDirty = !0;\n }\n /**\n * Marks the texture state as changed\n */\n markAsTexturesDirty() {\n this._areTexturesDirty = !0, this._isDirty = !0;\n }\n /**\n * Marks the fresnel state as changed\n */\n markAsFresnelDirty() {\n this._areFresnelDirty = !0, this._isDirty = !0;\n }\n /**\n * Marks the misc state as changed\n */\n markAsMiscDirty() {\n this._areMiscDirty = !0, this._isDirty = !0;\n }\n /**\n * Marks the prepass state as changed\n */\n markAsPrePassDirty() {\n this._arePrePassDirty = !0, this._isDirty = !0;\n }\n /**\n * Rebuilds the material defines\n */\n rebuild() {\n this._keys.length = 0;\n for (const e of Object.keys(this))\n e[0] !== \"_\" && this._keys.push(e);\n if (this._externalProperties)\n for (const e in this._externalProperties)\n this._keys.indexOf(e) === -1 && this._keys.push(e);\n }\n /**\n * Specifies if two material defines are equal\n * @param other - A material define instance to compare to\n * @returns - Boolean indicating if the material defines are equal (true) or not (false)\n */\n isEqual(e) {\n if (this._keys.length !== e._keys.length)\n return !1;\n for (let t = 0; t < this._keys.length; t++) {\n const i = this._keys[t];\n if (this[i] !== e[i])\n return !1;\n }\n return !0;\n }\n /**\n * Clones this instance's defines to another instance\n * @param other - material defines to clone values to\n */\n cloneTo(e) {\n this._keys.length !== e._keys.length && (e._keys = this._keys.slice(0));\n for (let t = 0; t < this._keys.length; t++) {\n const i = this._keys[t];\n e[i] = this[i];\n }\n }\n /**\n * Resets the material define values\n */\n reset() {\n this._keys.forEach((e) => this._setDefaultValue(e));\n }\n _setDefaultValue(e) {\n var r, s, a, o;\n const t = ((s = (r = this._externalProperties) == null ? void 0 : r[e]) == null ? void 0 : s.type) ?? typeof this[e], i = (o = (a = this._externalProperties) == null ? void 0 : a[e]) == null ? void 0 : o.default;\n switch (t) {\n case \"number\":\n this[e] = i ?? 0;\n break;\n case \"string\":\n this[e] = i ?? \"\";\n break;\n default:\n this[e] = i ?? !1;\n break;\n }\n }\n /**\n * Converts the material define values to a string\n * @returns - String of material define information\n */\n toString() {\n let e = \"\";\n for (let t = 0; t < this._keys.length; t++) {\n const i = this._keys[t], r = this[i];\n switch (typeof r) {\n case \"number\":\n case \"string\":\n e += \"#define \" + i + \" \" + r + `\n`;\n break;\n default:\n r && (e += \"#define \" + i + `\n`);\n break;\n }\n }\n return e;\n }\n}\nclass ae {\n /**\n * Are diffuse textures enabled in the application.\n */\n static get DiffuseTextureEnabled() {\n return this._DiffuseTextureEnabled;\n }\n static set DiffuseTextureEnabled(e) {\n this._DiffuseTextureEnabled !== e && (this._DiffuseTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are detail textures enabled in the application.\n */\n static get DetailTextureEnabled() {\n return this._DetailTextureEnabled;\n }\n static set DetailTextureEnabled(e) {\n this._DetailTextureEnabled !== e && (this._DetailTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are decal maps enabled in the application.\n */\n static get DecalMapEnabled() {\n return this._DecalMapEnabled;\n }\n static set DecalMapEnabled(e) {\n this._DecalMapEnabled !== e && (this._DecalMapEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are ambient textures enabled in the application.\n */\n static get AmbientTextureEnabled() {\n return this._AmbientTextureEnabled;\n }\n static set AmbientTextureEnabled(e) {\n this._AmbientTextureEnabled !== e && (this._AmbientTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are opacity textures enabled in the application.\n */\n static get OpacityTextureEnabled() {\n return this._OpacityTextureEnabled;\n }\n static set OpacityTextureEnabled(e) {\n this._OpacityTextureEnabled !== e && (this._OpacityTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are reflection textures enabled in the application.\n */\n static get ReflectionTextureEnabled() {\n return this._ReflectionTextureEnabled;\n }\n static set ReflectionTextureEnabled(e) {\n this._ReflectionTextureEnabled !== e && (this._ReflectionTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are emissive textures enabled in the application.\n */\n static get EmissiveTextureEnabled() {\n return this._EmissiveTextureEnabled;\n }\n static set EmissiveTextureEnabled(e) {\n this._EmissiveTextureEnabled !== e && (this._EmissiveTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are specular textures enabled in the application.\n */\n static get SpecularTextureEnabled() {\n return this._SpecularTextureEnabled;\n }\n static set SpecularTextureEnabled(e) {\n this._SpecularTextureEnabled !== e && (this._SpecularTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are bump textures enabled in the application.\n */\n static get BumpTextureEnabled() {\n return this._BumpTextureEnabled;\n }\n static set BumpTextureEnabled(e) {\n this._BumpTextureEnabled !== e && (this._BumpTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are lightmap textures enabled in the application.\n */\n static get LightmapTextureEnabled() {\n return this._LightmapTextureEnabled;\n }\n static set LightmapTextureEnabled(e) {\n this._LightmapTextureEnabled !== e && (this._LightmapTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are refraction textures enabled in the application.\n */\n static get RefractionTextureEnabled() {\n return this._RefractionTextureEnabled;\n }\n static set RefractionTextureEnabled(e) {\n this._RefractionTextureEnabled !== e && (this._RefractionTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are color grading textures enabled in the application.\n */\n static get ColorGradingTextureEnabled() {\n return this._ColorGradingTextureEnabled;\n }\n static set ColorGradingTextureEnabled(e) {\n this._ColorGradingTextureEnabled !== e && (this._ColorGradingTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are fresnels enabled in the application.\n */\n static get FresnelEnabled() {\n return this._FresnelEnabled;\n }\n static set FresnelEnabled(e) {\n this._FresnelEnabled !== e && (this._FresnelEnabled = e, se.MarkAllMaterialsAsDirty(4));\n }\n /**\n * Are clear coat textures enabled in the application.\n */\n static get ClearCoatTextureEnabled() {\n return this._ClearCoatTextureEnabled;\n }\n static set ClearCoatTextureEnabled(e) {\n this._ClearCoatTextureEnabled !== e && (this._ClearCoatTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are clear coat bump textures enabled in the application.\n */\n static get ClearCoatBumpTextureEnabled() {\n return this._ClearCoatBumpTextureEnabled;\n }\n static set ClearCoatBumpTextureEnabled(e) {\n this._ClearCoatBumpTextureEnabled !== e && (this._ClearCoatBumpTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are clear coat tint textures enabled in the application.\n */\n static get ClearCoatTintTextureEnabled() {\n return this._ClearCoatTintTextureEnabled;\n }\n static set ClearCoatTintTextureEnabled(e) {\n this._ClearCoatTintTextureEnabled !== e && (this._ClearCoatTintTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are sheen textures enabled in the application.\n */\n static get SheenTextureEnabled() {\n return this._SheenTextureEnabled;\n }\n static set SheenTextureEnabled(e) {\n this._SheenTextureEnabled !== e && (this._SheenTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are anisotropic textures enabled in the application.\n */\n static get AnisotropicTextureEnabled() {\n return this._AnisotropicTextureEnabled;\n }\n static set AnisotropicTextureEnabled(e) {\n this._AnisotropicTextureEnabled !== e && (this._AnisotropicTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are thickness textures enabled in the application.\n */\n static get ThicknessTextureEnabled() {\n return this._ThicknessTextureEnabled;\n }\n static set ThicknessTextureEnabled(e) {\n this._ThicknessTextureEnabled !== e && (this._ThicknessTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are refraction intensity textures enabled in the application.\n */\n static get RefractionIntensityTextureEnabled() {\n return this._ThicknessTextureEnabled;\n }\n static set RefractionIntensityTextureEnabled(e) {\n this._RefractionIntensityTextureEnabled !== e && (this._RefractionIntensityTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are translucency intensity textures enabled in the application.\n */\n static get TranslucencyIntensityTextureEnabled() {\n return this._ThicknessTextureEnabled;\n }\n static set TranslucencyIntensityTextureEnabled(e) {\n this._TranslucencyIntensityTextureEnabled !== e && (this._TranslucencyIntensityTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n /**\n * Are translucency intensity textures enabled in the application.\n */\n static get IridescenceTextureEnabled() {\n return this._IridescenceTextureEnabled;\n }\n static set IridescenceTextureEnabled(e) {\n this._IridescenceTextureEnabled !== e && (this._IridescenceTextureEnabled = e, se.MarkAllMaterialsAsDirty(1));\n }\n}\nae._DiffuseTextureEnabled = !0;\nae._DetailTextureEnabled = !0;\nae._DecalMapEnabled = !0;\nae._AmbientTextureEnabled = !0;\nae._OpacityTextureEnabled = !0;\nae._ReflectionTextureEnabled = !0;\nae._EmissiveTextureEnabled = !0;\nae._SpecularTextureEnabled = !0;\nae._BumpTextureEnabled = !0;\nae._LightmapTextureEnabled = !0;\nae._RefractionTextureEnabled = !0;\nae._ColorGradingTextureEnabled = !0;\nae._FresnelEnabled = !0;\nae._ClearCoatTextureEnabled = !0;\nae._ClearCoatBumpTextureEnabled = !0;\nae._ClearCoatTintTextureEnabled = !0;\nae._SheenTextureEnabled = !0;\nae._AnisotropicTextureEnabled = !0;\nae._ThicknessTextureEnabled = !0;\nae._RefractionIntensityTextureEnabled = !0;\nae._TranslucencyIntensityTextureEnabled = !0;\nae._IridescenceTextureEnabled = !0;\nconst nA = \"decalFragmentDeclaration\", aA = `#ifdef DECAL\nuniform vec4 vDecalInfos;\n#endif\n`;\nY.IncludesShadersStore[nA] = aA;\nconst oA = \"defaultFragmentDeclaration\", lA = `uniform vec4 vEyePosition;uniform vec4 vDiffuseColor;\n#ifdef SPECULARTERM\nuniform vec4 vSpecularColor;\n#endif\nuniform vec3 vEmissiveColor;uniform vec3 vAmbientColor;uniform float visibility;\n#ifdef DIFFUSE\nuniform vec2 vDiffuseInfos;\n#endif\n#ifdef AMBIENT\nuniform vec2 vAmbientInfos;\n#endif\n#ifdef OPACITY \nuniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;uniform vec2 vTangentSpaceParams;\n#endif\n#ifdef ALPHATEST\nuniform float alphaCutOff;\n#endif\n#if defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_PROJECTION) || defined(REFRACTION) || defined(PREPASS)\nuniform mat4 view;\n#endif\n#ifdef REFRACTION\nuniform vec4 vRefractionInfos;\n#ifndef REFRACTIONMAP_3D\nuniform mat4 refractionMatrix;\n#endif\n#ifdef REFRACTIONFRESNEL\nuniform vec4 refractionLeftColor;uniform vec4 refractionRightColor;\n#endif\n#if defined(USE_LOCAL_REFRACTIONMAP_CUBIC) && defined(REFRACTIONMAP_3D)\nuniform vec3 vRefractionPosition;uniform vec3 vRefractionSize; \n#endif\n#endif\n#if defined(SPECULAR) && defined(SPECULARTERM)\nuniform vec2 vSpecularInfos;\n#endif\n#ifdef DIFFUSEFRESNEL\nuniform vec4 diffuseLeftColor;uniform vec4 diffuseRightColor;\n#endif\n#ifdef OPACITYFRESNEL\nuniform vec4 opacityParts;\n#endif\n#ifdef EMISSIVEFRESNEL\nuniform vec4 emissiveLeftColor;uniform vec4 emissiveRightColor;\n#endif\n#ifdef REFLECTION\nuniform vec2 vReflectionInfos;\n#if defined(REFLECTIONMAP_PLANAR) || defined(REFLECTIONMAP_CUBIC) || defined(REFLECTIONMAP_PROJECTION) || defined(REFLECTIONMAP_EQUIRECTANGULAR) || defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_SKYBOX)\nuniform mat4 reflectionMatrix;\n#endif\n#ifndef REFLECTIONMAP_SKYBOX\n#if defined(USE_LOCAL_REFLECTIONMAP_CUBIC) && defined(REFLECTIONMAP_CUBIC)\nuniform vec3 vReflectionPosition;uniform vec3 vReflectionSize; \n#endif\n#endif\n#ifdef REFLECTIONFRESNEL\nuniform vec4 reflectionLeftColor;uniform vec4 reflectionRightColor;\n#endif\n#endif\n#ifdef DETAIL\nuniform vec4 vDetailInfos;\n#endif\n#include\n#define ADDITIONAL_FRAGMENT_DECLARATION\n`;\nY.IncludesShadersStore[oA] = lA;\nconst cA = \"sceneUboDeclaration\", hA = `layout(std140,column_major) uniform;uniform Scene {mat4 viewProjection;\n#ifdef MULTIVIEW\nmat4 viewProjectionR;\n#endif \nmat4 view;mat4 projection;vec4 vEyePosition;};\n`;\nY.IncludesShadersStore[cA] = hA;\nconst uA = \"meshUboDeclaration\", fA = `#ifdef WEBGL2\nuniform mat4 world;uniform float visibility;\n#else\nlayout(std140,column_major) uniform;uniform Mesh\n{mat4 world;float visibility;};\n#endif\n#define WORLD_UBO\n`;\nY.IncludesShadersStore[uA] = fA;\nconst dA = \"defaultUboDeclaration\", pA = `layout(std140,column_major) uniform;uniform Material\n{vec4 diffuseLeftColor;vec4 diffuseRightColor;vec4 opacityParts;vec4 reflectionLeftColor;vec4 reflectionRightColor;vec4 refractionLeftColor;vec4 refractionRightColor;vec4 emissiveLeftColor;vec4 emissiveRightColor;vec2 vDiffuseInfos;vec2 vAmbientInfos;vec2 vOpacityInfos;vec2 vReflectionInfos;vec3 vReflectionPosition;vec3 vReflectionSize;vec2 vEmissiveInfos;vec2 vLightmapInfos;vec2 vSpecularInfos;vec3 vBumpInfos;mat4 diffuseMatrix;mat4 ambientMatrix;mat4 opacityMatrix;mat4 reflectionMatrix;mat4 emissiveMatrix;mat4 lightmapMatrix;mat4 specularMatrix;mat4 bumpMatrix;vec2 vTangentSpaceParams;float pointSize;float alphaCutOff;mat4 refractionMatrix;vec4 vRefractionInfos;vec3 vRefractionPosition;vec3 vRefractionSize;vec4 vSpecularColor;vec3 vEmissiveColor;vec4 vDiffuseColor;vec3 vAmbientColor;\n#define ADDITIONAL_UBO_DECLARATION\n};\n#include\n#include\n`;\nY.IncludesShadersStore[dA] = pA;\nconst gA = \"prePassDeclaration\", mA = `#ifdef PREPASS\n#extension GL_EXT_draw_buffers : require\nlayout(location=0) out highp vec4 glFragData[{X}];highp vec4 gl_FragColor;\n#ifdef PREPASS_DEPTH\nvarying highp vec3 vViewPos;\n#endif\n#ifdef PREPASS_VELOCITY\nvarying highp vec4 vCurrentPosition;varying highp vec4 vPreviousPosition;\n#endif\n#endif\n`;\nY.IncludesShadersStore[gA] = mA;\nconst _A = \"oitDeclaration\", EA = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY\n#extension GL_EXT_draw_buffers : require\nlayout(location=0) out vec2 depth; \nlayout(location=1) out vec4 frontColor;layout(location=2) out vec4 backColor;\n#define MAX_DEPTH 99999.0\nhighp vec4 gl_FragColor;uniform sampler2D oitDepthSampler;uniform sampler2D oitFrontColorSampler;\n#endif\n`;\nY.IncludesShadersStore[_A] = EA;\nconst vA = \"mainUVVaryingDeclaration\", TA = `#ifdef MAINUV{X}\nvarying vec2 vMainUV{X};\n#endif\n`;\nY.IncludesShadersStore[vA] = TA;\nconst xA = \"helperFunctions\", CA = `const float PI=3.1415926535897932384626433832795;const float RECIPROCAL_PI=0.3183098861837907;const float RECIPROCAL_PI2=0.15915494309189535;const float HALF_MIN=5.96046448e-08; \nconst float LinearEncodePowerApprox=2.2;const float GammaEncodePowerApprox=1.0/LinearEncodePowerApprox;const vec3 LuminanceEncodeApprox=vec3(0.2126,0.7152,0.0722);const float Epsilon=0.0000001;\n#define saturate(x) clamp(x,0.0,1.0)\n#define absEps(x) abs(x)+Epsilon\n#define maxEps(x) max(x,Epsilon)\n#define saturateEps(x) clamp(x,Epsilon,1.0)\nmat3 transposeMat3(mat3 inMatrix) {vec3 i0=inMatrix[0];vec3 i1=inMatrix[1];vec3 i2=inMatrix[2];mat3 outMatrix=mat3(\nvec3(i0.x,i1.x,i2.x),\nvec3(i0.y,i1.y,i2.y),\nvec3(i0.z,i1.z,i2.z)\n);return outMatrix;}\nmat3 inverseMat3(mat3 inMatrix) {float a00=inMatrix[0][0],a01=inMatrix[0][1],a02=inMatrix[0][2];float a10=inMatrix[1][0],a11=inMatrix[1][1],a12=inMatrix[1][2];float a20=inMatrix[2][0],a21=inMatrix[2][1],a22=inMatrix[2][2];float b01=a22*a11-a12*a21;float b11=-a22*a10+a12*a20;float b21=a21*a10-a11*a20;float det=a00*b01+a01*b11+a02*b21;return mat3(b01,(-a22*a01+a02*a21),(a12*a01-a02*a11),\nb11,(a22*a00-a02*a20),(-a12*a00+a02*a10),\nb21,(-a21*a00+a01*a20),(a11*a00-a01*a10))/det;}\n#if USE_EXACT_SRGB_CONVERSIONS\nvec3 toLinearSpaceExact(vec3 color)\n{vec3 nearZeroSection=0.0773993808*color;vec3 remainingSection=pow(0.947867299*(color+vec3(0.055)),vec3(2.4));\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nreturn mix(remainingSection,nearZeroSection,lessThanEqual(color,vec3(0.04045)));\n#else\nreturn\nvec3(\ncolor.r<=0.04045 ? nearZeroSection.r : remainingSection.r,\ncolor.g<=0.04045 ? nearZeroSection.g : remainingSection.g,\ncolor.b<=0.04045 ? nearZeroSection.b : remainingSection.b);\n#endif\n}\nvec3 toGammaSpaceExact(vec3 color)\n{vec3 nearZeroSection=12.92*color;vec3 remainingSection=1.055*pow(color,vec3(0.41666))-vec3(0.055);\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nreturn mix(remainingSection,nearZeroSection,lessThanEqual(color,vec3(0.0031308)));\n#else\nreturn\nvec3(\ncolor.r<=0.0031308 ? nearZeroSection.r : remainingSection.r,\ncolor.g<=0.0031308 ? nearZeroSection.g : remainingSection.g,\ncolor.b<=0.0031308 ? nearZeroSection.b : remainingSection.b);\n#endif\n}\n#endif\nfloat toLinearSpace(float color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nfloat nearZeroSection=0.0773993808*color;float remainingSection=pow(0.947867299*(color+0.055),2.4);return color<=0.04045 ? nearZeroSection : remainingSection;\n#else\nreturn pow(color,LinearEncodePowerApprox);\n#endif\n}\nvec3 toLinearSpace(vec3 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn toLinearSpaceExact(color);\n#else\nreturn pow(color,vec3(LinearEncodePowerApprox));\n#endif\n}\nvec4 toLinearSpace(vec4 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn vec4(toLinearSpaceExact(color.rgb),color.a);\n#else\nreturn vec4(pow(color.rgb,vec3(LinearEncodePowerApprox)),color.a);\n#endif\n}\nfloat toGammaSpace(float color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nfloat nearZeroSection=12.92*color;float remainingSection=1.055*pow(color,0.41666)-0.055;return color<=0.0031308 ? nearZeroSection : remainingSection;\n#else\nreturn pow(color,GammaEncodePowerApprox);\n#endif\n}\nvec3 toGammaSpace(vec3 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn toGammaSpaceExact(color);\n#else\nreturn pow(color,vec3(GammaEncodePowerApprox));\n#endif\n}\nvec4 toGammaSpace(vec4 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn vec4(toGammaSpaceExact(color.rgb),color.a);\n#else\nreturn vec4(pow(color.rgb,vec3(GammaEncodePowerApprox)),color.a);\n#endif\n}\nfloat square(float value)\n{return value*value;}\nvec3 square(vec3 value)\n{return value*value;}\nfloat pow5(float value) {float sq=value*value;return sq*sq*value;}\nfloat getLuminance(vec3 color)\n{return clamp(dot(color,LuminanceEncodeApprox),0.,1.);}\nfloat getRand(vec2 seed) {return fract(sin(dot(seed.xy ,vec2(12.9898,78.233)))*43758.5453);}\nfloat dither(vec2 seed,float varianceAmount) {float rand=getRand(seed);float normVariance=varianceAmount/255.0;float dither=mix(-normVariance,normVariance,rand);return dither;}\nconst float rgbdMaxRange=255.0;vec4 toRGBD(vec3 color) {float maxRGB=maxEps(max(color.r,max(color.g,color.b)));float D =max(rgbdMaxRange/maxRGB,1.);D =clamp(floor(D)/255.0,0.,1.);vec3 rgb=color.rgb*D;rgb=toGammaSpace(rgb);return vec4(clamp(rgb,0.,1.),D); }\nvec3 fromRGBD(vec4 rgbd) {rgbd.rgb=toLinearSpace(rgbd.rgb);return rgbd.rgb/rgbd.a;}\nvec3 parallaxCorrectNormal( vec3 vertexPos,vec3 origVec,vec3 cubeSize,vec3 cubePos ) {vec3 invOrigVec=vec3(1.0,1.0,1.0)/origVec;vec3 halfSize=cubeSize*0.5;vec3 intersecAtMaxPlane=(cubePos+halfSize-vertexPos)*invOrigVec;vec3 intersecAtMinPlane=(cubePos-halfSize-vertexPos)*invOrigVec;vec3 largestIntersec=max(intersecAtMaxPlane,intersecAtMinPlane);float distance=min(min(largestIntersec.x,largestIntersec.y),largestIntersec.z);vec3 intersectPositionWS=vertexPos+origVec*distance;return intersectPositionWS-cubePos;}\n`;\nY.IncludesShadersStore[xA] = CA;\nconst RA = \"lightFragmentDeclaration\", SA = `#ifdef LIGHT{X}\nuniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X};\n#ifdef SPECULARTERM\nuniform vec4 vLightSpecular{X};\n#else\nvec4 vLightSpecular{X}=vec4(0.);\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];uniform float viewFrustumZ{X}[SHADOWCSMNUM_CASCADES{X}];uniform float frustumLengths{X}[SHADOWCSMNUM_CASCADES{X}];uniform float cascadeBlendFactor{X};varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};uniform highp sampler2DArray depthSampler{X};uniform vec2 lightSizeUVCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float depthCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float penumbraDarkness{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};\n#else\nuniform highp sampler2DArray shadowSampler{X};\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nconst vec3 vCascadeColorsMultiplier{X}[8]=vec3[8]\n(\nvec3 ( 1.5,0.0,0.0 ),\nvec3 ( 0.0,1.5,0.0 ),\nvec3 ( 0.0,0.0,5.5 ),\nvec3 ( 1.5,0.0,5.5 ),\nvec3 ( 1.5,1.5,0.0 ),\nvec3 ( 1.0,1.0,1.0 ),\nvec3 ( 0.0,1.0,5.5 ),\nvec3 ( 0.5,3.5,0.75 )\n);vec3 shadowDebug{X};\n#endif\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nint index{X}=-1;\n#else\nint index{X}=SHADOWCSMNUM_CASCADES{X}-1;\n#endif\nfloat diff{X}=0.;\n#elif defined(SHADOWCUBE{X})\nuniform samplerCube shadowSampler{X};\n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DShadow shadowSampler{X};uniform highp sampler2D depthSampler{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DShadow shadowSampler{X};\n#else\nuniform sampler2D shadowSampler{X};\n#endif\nuniform mat4 lightMatrix{X};\n#endif\nuniform vec4 shadowsInfo{X};uniform vec2 depthValues{X};\n#endif\n#ifdef SPOTLIGHT{X}\nuniform vec4 vLightDirection{X};uniform vec4 vLightFalloff{X};\n#elif defined(POINTLIGHT{X})\nuniform vec4 vLightFalloff{X};\n#elif defined(HEMILIGHT{X})\nuniform vec3 vLightGround{X};\n#endif\n#ifdef PROJECTEDLIGHTTEXTURE{X}\nuniform mat4 textureProjectionMatrix{X};uniform sampler2D projectionLightSampler{X};\n#endif\n#endif\n`;\nY.IncludesShadersStore[RA] = SA;\nconst yA = \"lightUboDeclaration\", IA = `#ifdef LIGHT{X}\nuniform Light{X}\n{vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular;\n#ifdef SPOTLIGHT{X}\nvec4 vLightDirection;vec4 vLightFalloff;\n#elif defined(POINTLIGHT{X})\nvec4 vLightFalloff;\n#elif defined(HEMILIGHT{X})\nvec3 vLightGround;\n#endif\nvec4 shadowsInfo;vec2 depthValues;} light{X};\n#ifdef PROJECTEDLIGHTTEXTURE{X}\nuniform mat4 textureProjectionMatrix{X};uniform sampler2D projectionLightSampler{X};\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];uniform float viewFrustumZ{X}[SHADOWCSMNUM_CASCADES{X}];uniform float frustumLengths{X}[SHADOWCSMNUM_CASCADES{X}];uniform float cascadeBlendFactor{X};varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};uniform highp sampler2DArray depthSampler{X};uniform vec2 lightSizeUVCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float depthCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float penumbraDarkness{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};\n#else\nuniform highp sampler2DArray shadowSampler{X};\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nconst vec3 vCascadeColorsMultiplier{X}[8]=vec3[8]\n(\nvec3 ( 1.5,0.0,0.0 ),\nvec3 ( 0.0,1.5,0.0 ),\nvec3 ( 0.0,0.0,5.5 ),\nvec3 ( 1.5,0.0,5.5 ),\nvec3 ( 1.5,1.5,0.0 ),\nvec3 ( 1.0,1.0,1.0 ),\nvec3 ( 0.0,1.0,5.5 ),\nvec3 ( 0.5,3.5,0.75 )\n);vec3 shadowDebug{X};\n#endif\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nint index{X}=-1;\n#else\nint index{X}=SHADOWCSMNUM_CASCADES{X}-1;\n#endif\nfloat diff{X}=0.;\n#elif defined(SHADOWCUBE{X})\nuniform samplerCube shadowSampler{X}; \n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DShadow shadowSampler{X};uniform highp sampler2D depthSampler{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DShadow shadowSampler{X};\n#else\nuniform sampler2D shadowSampler{X};\n#endif\nuniform mat4 lightMatrix{X};\n#endif\n#endif\n#endif\n`;\nY.IncludesShadersStore[yA] = IA;\nconst bA = \"lightsFragmentFunctions\", AA = `struct lightingInfo\n{vec3 diffuse;\n#ifdef SPECULARTERM\nvec3 specular;\n#endif\n#ifdef NDOTL\nfloat ndl;\n#endif\n};lightingInfo computeLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {lightingInfo result;vec3 lightVectorW;float attenuation=1.0;if (lightData.w==0.)\n{vec3 direction=lightData.xyz-vPositionW;attenuation=max(0.,1.0-length(direction)/range);lightVectorW=normalize(direction);}\nelse\n{lightVectorW=normalize(-lightData.xyz);}\nfloat ndl=max(0.,dot(vNormal,lightVectorW));\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=ndl*diffuseColor*attenuation;\n#ifdef SPECULARTERM\nvec3 angleW=normalize(viewDirectionW+lightVectorW);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor*attenuation;\n#endif\nreturn result;}\nlightingInfo computeSpotLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec4 lightDirection,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {lightingInfo result;vec3 direction=lightData.xyz-vPositionW;vec3 lightVectorW=normalize(direction);float attenuation=max(0.,1.0-length(direction)/range);float cosAngle=max(0.,dot(lightDirection.xyz,-lightVectorW));if (cosAngle>=lightDirection.w)\n{cosAngle=max(0.,pow(cosAngle,lightData.w));attenuation*=cosAngle;float ndl=max(0.,dot(vNormal,lightVectorW));\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=ndl*diffuseColor*attenuation;\n#ifdef SPECULARTERM\nvec3 angleW=normalize(viewDirectionW+lightVectorW);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor*attenuation;\n#endif\nreturn result;}\nresult.diffuse=vec3(0.);\n#ifdef SPECULARTERM\nresult.specular=vec3(0.);\n#endif\n#ifdef NDOTL\nresult.ndl=0.;\n#endif\nreturn result;}\nlightingInfo computeHemisphericLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,vec3 groundColor,float glossiness) {lightingInfo result;float ndl=dot(vNormal,lightData.xyz)*0.5+0.5;\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=mix(groundColor,diffuseColor,ndl);\n#ifdef SPECULARTERM\nvec3 angleW=normalize(viewDirectionW+lightData.xyz);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor;\n#endif\nreturn result;}\n#define inline\nvec3 computeProjectionTextureDiffuseLighting(sampler2D projectionLightSampler,mat4 textureProjectionMatrix){vec4 strq=textureProjectionMatrix*vec4(vPositionW,1.0);strq/=strq.w;vec3 textureColor=texture2D(projectionLightSampler,strq.xy).rgb;return textureColor;}`;\nY.IncludesShadersStore[bA] = AA;\nconst MA = \"shadowsFragmentFunctions\", PA = `#ifdef SHADOWS\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\n#define TEXTUREFUNC(s,c,l) texture2DLodEXT(s,c,l)\n#else\n#define TEXTUREFUNC(s,c,b) texture2D(s,c,b)\n#endif\n#ifndef SHADOWFLOAT\nfloat unpack(vec4 color)\n{const vec4 bit_shift=vec4(1.0/(255.0*255.0*255.0),1.0/(255.0*255.0),1.0/255.0,1.0);return dot(color,bit_shift);}\n#endif\nfloat computeFallOff(float value,vec2 clipSpace,float frustumEdgeFalloff)\n{float mask=smoothstep(1.0-frustumEdgeFalloff,1.00000012,clamp(dot(clipSpace,clipSpace),0.,1.));return mix(value,1.0,mask);}\n#define inline\nfloat computeShadowCube(vec3 worldPos,vec3 lightPosition,samplerCube shadowSampler,float darkness,vec2 depthValues)\n{vec3 directionToLight=worldPos-lightPosition;float depth=length(directionToLight);depth=(depth+depthValues.x)/(depthValues.y);depth=clamp(depth,0.,1.0);directionToLight=normalize(directionToLight);directionToLight.y=-directionToLight.y;\n#ifndef SHADOWFLOAT\nfloat shadow=unpack(textureCube(shadowSampler,directionToLight));\n#else\nfloat shadow=textureCube(shadowSampler,directionToLight).x;\n#endif\nreturn depth>shadow ? darkness : 1.0;}\n#define inline\nfloat computeShadowWithPoissonSamplingCube(vec3 worldPos,vec3 lightPosition,samplerCube shadowSampler,float mapSize,float darkness,vec2 depthValues)\n{vec3 directionToLight=worldPos-lightPosition;float depth=length(directionToLight);depth=(depth+depthValues.x)/(depthValues.y);depth=clamp(depth,0.,1.0);directionToLight=normalize(directionToLight);directionToLight.y=-directionToLight.y;float visibility=1.;vec3 poissonDisk[4];poissonDisk[0]=vec3(-1.0,1.0,-1.0);poissonDisk[1]=vec3(1.0,-1.0,-1.0);poissonDisk[2]=vec3(-1.0,-1.0,-1.0);poissonDisk[3]=vec3(1.0,-1.0,1.0);\n#ifndef SHADOWFLOAT\nif (unpack(textureCube(shadowSampler,directionToLight+poissonDisk[0]*mapSize))shadow ? computeFallOff(darkness,clipSpace.xy,frustumEdgeFalloff) : 1.;}\n#endif\n#define inline\nfloat computeShadow(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0);\n#ifndef SHADOWFLOAT\nfloat shadow=unpack(TEXTUREFUNC(shadowSampler,uv,0.));\n#else\nfloat shadow=TEXTUREFUNC(shadowSampler,uv,0.).x;\n#endif\nreturn shadowPixelDepth>shadow ? computeFallOff(darkness,clipSpace.xy,frustumEdgeFalloff) : 1.;}}\n#define inline\nfloat computeShadowWithPoissonSampling(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float mapSize,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0);float visibility=1.;vec2 poissonDisk[4];poissonDisk[0]=vec2(-0.94201624,-0.39906216);poissonDisk[1]=vec2(0.94558609,-0.76890725);poissonDisk[2]=vec2(-0.094184101,-0.92938870);poissonDisk[3]=vec2(0.34495938,0.29387760);\n#ifndef SHADOWFLOAT\nif (unpack(TEXTUREFUNC(shadowSampler,uv+poissonDisk[0]*mapSize,0.))1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0);\n#ifndef SHADOWFLOAT\nfloat shadowMapSample=unpack(TEXTUREFUNC(shadowSampler,uv,0.));\n#else\nfloat shadowMapSample=TEXTUREFUNC(shadowSampler,uv,0.).x;\n#endif\nfloat esm=1.0-clamp(exp(min(87.,depthScale*shadowPixelDepth))*shadowMapSample,0.,1.-darkness);return computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);}}\n#define inline\nfloat computeShadowWithCloseESM(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float depthScale,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0); \n#ifndef SHADOWFLOAT\nfloat shadowMapSample=unpack(TEXTUREFUNC(shadowSampler,uv,0.));\n#else\nfloat shadowMapSample=TEXTUREFUNC(shadowSampler,uv,0.).x;\n#endif\nfloat esm=clamp(exp(min(87.,-depthScale*(shadowPixelDepth-shadowMapSample))),darkness,1.);return computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);}}\n#ifdef IS_NDC_HALF_ZRANGE\n#define ZINCLIP clipSpace.z\n#else\n#define ZINCLIP uvDepth.z\n#endif\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\n#define GREATEST_LESS_THAN_ONE 0.99999994\n/* disable_uniformity_analysis */\n#define inline\nfloat computeShadowWithCSMPCF1(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec4 uvDepthLayer=vec4(uvDepth.x,uvDepth.y,layer,uvDepth.z);float shadow=texture2D(shadowSampler,uvDepthLayer);shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}\n#define inline\nfloat computeShadowWithCSMPCF3(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=3.-2.*st;vec2 uvw1=1.+2.*st;vec2 u=vec2((2.-st.x)/uvw0.x-1.,st.x/uvw1.x+1.)*shadowMapSizeAndInverse.y;vec2 v=vec2((2.-st.y)/uvw0.y-1.,st.y/uvw1.y+1.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[0]),layer,uvDepth.z));shadow+=uvw1.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[0]),layer,uvDepth.z));shadow+=uvw0.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[1]),layer,uvDepth.z));shadow+=uvw1.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[1]),layer,uvDepth.z));shadow=shadow/16.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}\n#define inline\nfloat computeShadowWithCSMPCF5(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=4.-3.*st;vec2 uvw1=vec2(7.);vec2 uvw2=1.+3.*st;vec3 u=vec3((3.-2.*st.x)/uvw0.x-2.,(3.+st.x)/uvw1.x,st.x/uvw2.x+2.)*shadowMapSizeAndInverse.y;vec3 v=vec3((3.-2.*st.y)/uvw0.y-2.,(3.+st.y)/uvw1.y,st.y/uvw2.y+2.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[0]),layer,uvDepth.z));shadow+=uvw1.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[0]),layer,uvDepth.z));shadow+=uvw2.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[0]),layer,uvDepth.z));shadow+=uvw0.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[1]),layer,uvDepth.z));shadow+=uvw1.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[1]),layer,uvDepth.z));shadow+=uvw2.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[1]),layer,uvDepth.z));shadow+=uvw0.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[2]),layer,uvDepth.z));shadow+=uvw1.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[2]),layer,uvDepth.z));shadow+=uvw2.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[2]),layer,uvDepth.z));shadow=shadow/144.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}\n#define inline\nfloat computeShadowWithPCF1(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,float darkness,float frustumEdgeFalloff)\n{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;float shadow=TEXTUREFUNC(shadowSampler,uvDepth,0.);shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}}\n#define inline\nfloat computeShadowWithPCF3(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=3.-2.*st;vec2 uvw1=1.+2.*st;vec2 u=vec2((2.-st.x)/uvw0.x-1.,st.x/uvw1.x+1.)*shadowMapSizeAndInverse.y;vec2 v=vec2((2.-st.y)/uvw0.y-1.,st.y/uvw1.y+1.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[0]),uvDepth.z),0.);shadow+=uvw1.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[0]),uvDepth.z),0.);shadow+=uvw0.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[1]),uvDepth.z),0.);shadow+=uvw1.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[1]),uvDepth.z),0.);shadow=shadow/16.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}}\n#define inline\nfloat computeShadowWithPCF5(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=4.-3.*st;vec2 uvw1=vec2(7.);vec2 uvw2=1.+3.*st;vec3 u=vec3((3.-2.*st.x)/uvw0.x-2.,(3.+st.x)/uvw1.x,st.x/uvw2.x+2.)*shadowMapSizeAndInverse.y;vec3 v=vec3((3.-2.*st.y)/uvw0.y-2.,(3.+st.y)/uvw1.y,st.y/uvw2.y+2.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[0]),uvDepth.z),0.);shadow+=uvw1.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[0]),uvDepth.z),0.);shadow+=uvw2.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[0]),uvDepth.z),0.);shadow+=uvw0.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[1]),uvDepth.z),0.);shadow+=uvw1.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[1]),uvDepth.z),0.);shadow+=uvw2.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[1]),uvDepth.z),0.);shadow+=uvw0.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[2]),uvDepth.z),0.);shadow+=uvw1.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[2]),uvDepth.z),0.);shadow+=uvw2.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[2]),uvDepth.z),0.);shadow=shadow/144.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}}\nconst vec3 PoissonSamplers32[64]=vec3[64](\nvec3(0.06407013,0.05409927,0.),\nvec3(0.7366577,0.5789394,0.),\nvec3(-0.6270542,-0.5320278,0.),\nvec3(-0.4096107,0.8411095,0.),\nvec3(0.6849564,-0.4990818,0.),\nvec3(-0.874181,-0.04579735,0.),\nvec3(0.9989998,0.0009880066,0.),\nvec3(-0.004920578,-0.9151649,0.),\nvec3(0.1805763,0.9747483,0.),\nvec3(-0.2138451,0.2635818,0.),\nvec3(0.109845,0.3884785,0.),\nvec3(0.06876755,-0.3581074,0.),\nvec3(0.374073,-0.7661266,0.),\nvec3(0.3079132,-0.1216763,0.),\nvec3(-0.3794335,-0.8271583,0.),\nvec3(-0.203878,-0.07715034,0.),\nvec3(0.5912697,0.1469799,0.),\nvec3(-0.88069,0.3031784,0.),\nvec3(0.5040108,0.8283722,0.),\nvec3(-0.5844124,0.5494877,0.),\nvec3(0.6017799,-0.1726654,0.),\nvec3(-0.5554981,0.1559997,0.),\nvec3(-0.3016369,-0.3900928,0.),\nvec3(-0.5550632,-0.1723762,0.),\nvec3(0.925029,0.2995041,0.),\nvec3(-0.2473137,0.5538505,0.),\nvec3(0.9183037,-0.2862392,0.),\nvec3(0.2469421,0.6718712,0.),\nvec3(0.3916397,-0.4328209,0.),\nvec3(-0.03576927,-0.6220032,0.),\nvec3(-0.04661255,0.7995201,0.),\nvec3(0.4402924,0.3640312,0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.)\n);const vec3 PoissonSamplers64[64]=vec3[64](\nvec3(-0.613392,0.617481,0.),\nvec3(0.170019,-0.040254,0.),\nvec3(-0.299417,0.791925,0.),\nvec3(0.645680,0.493210,0.),\nvec3(-0.651784,0.717887,0.),\nvec3(0.421003,0.027070,0.),\nvec3(-0.817194,-0.271096,0.),\nvec3(-0.705374,-0.668203,0.),\nvec3(0.977050,-0.108615,0.),\nvec3(0.063326,0.142369,0.),\nvec3(0.203528,0.214331,0.),\nvec3(-0.667531,0.326090,0.),\nvec3(-0.098422,-0.295755,0.),\nvec3(-0.885922,0.215369,0.),\nvec3(0.566637,0.605213,0.),\nvec3(0.039766,-0.396100,0.),\nvec3(0.751946,0.453352,0.),\nvec3(0.078707,-0.715323,0.),\nvec3(-0.075838,-0.529344,0.),\nvec3(0.724479,-0.580798,0.),\nvec3(0.222999,-0.215125,0.),\nvec3(-0.467574,-0.405438,0.),\nvec3(-0.248268,-0.814753,0.),\nvec3(0.354411,-0.887570,0.),\nvec3(0.175817,0.382366,0.),\nvec3(0.487472,-0.063082,0.),\nvec3(-0.084078,0.898312,0.),\nvec3(0.488876,-0.783441,0.),\nvec3(0.470016,0.217933,0.),\nvec3(-0.696890,-0.549791,0.),\nvec3(-0.149693,0.605762,0.),\nvec3(0.034211,0.979980,0.),\nvec3(0.503098,-0.308878,0.),\nvec3(-0.016205,-0.872921,0.),\nvec3(0.385784,-0.393902,0.),\nvec3(-0.146886,-0.859249,0.),\nvec3(0.643361,0.164098,0.),\nvec3(0.634388,-0.049471,0.),\nvec3(-0.688894,0.007843,0.),\nvec3(0.464034,-0.188818,0.),\nvec3(-0.440840,0.137486,0.),\nvec3(0.364483,0.511704,0.),\nvec3(0.034028,0.325968,0.),\nvec3(0.099094,-0.308023,0.),\nvec3(0.693960,-0.366253,0.),\nvec3(0.678884,-0.204688,0.),\nvec3(0.001801,0.780328,0.),\nvec3(0.145177,-0.898984,0.),\nvec3(0.062655,-0.611866,0.),\nvec3(0.315226,-0.604297,0.),\nvec3(-0.780145,0.486251,0.),\nvec3(-0.371868,0.882138,0.),\nvec3(0.200476,0.494430,0.),\nvec3(-0.494552,-0.711051,0.),\nvec3(0.612476,0.705252,0.),\nvec3(-0.578845,-0.768792,0.),\nvec3(-0.772454,-0.090976,0.),\nvec3(0.504440,0.372295,0.),\nvec3(0.155736,0.065157,0.),\nvec3(0.391522,0.849605,0.),\nvec3(-0.620106,-0.328104,0.),\nvec3(0.789239,-0.419965,0.),\nvec3(-0.545396,0.538133,0.),\nvec3(-0.178564,-0.596057,0.)\n);\n#define inline\nfloat computeShadowWithCSMPCSS(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArray depthSampler,highp sampler2DArrayShadow shadowSampler,float shadowMapSizeInverse,float lightSizeUV,float darkness,float frustumEdgeFalloff,int searchTapCount,int pcfTapCount,vec3[64] poissonSamplers,vec2 lightSizeUVCorrection,float depthCorrection,float penumbraDarkness)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec4 uvDepthLayer=vec4(uvDepth.x,uvDepth.y,layer,uvDepth.z);float blockerDepth=0.0;float sumBlockerDepth=0.0;float numBlocker=0.0;for (int i=0; i1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;float blockerDepth=0.0;float sumBlockerDepth=0.0;float numBlocker=0.0;for (int i=0; i(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_SAMPLERNAME_,bump)\n#endif\n#if defined(DETAIL)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_SAMPLERNAME_,detail)\n#endif\n#if defined(BUMP) && defined(PARALLAX)\nconst float minSamples=4.;const float maxSamples=15.;const int iMaxSamples=15;vec2 parallaxOcclusion(vec3 vViewDirCoT,vec3 vNormalCoT,vec2 texCoord,float parallaxScale) {float parallaxLimit=length(vViewDirCoT.xy)/vViewDirCoT.z;parallaxLimit*=parallaxScale;vec2 vOffsetDir=normalize(vViewDirCoT.xy);vec2 vMaxOffset=vOffsetDir*parallaxLimit;float numSamples=maxSamples+(dot(vViewDirCoT,vNormalCoT)*(minSamples-maxSamples));float stepSize=1.0/numSamples;float currRayHeight=1.0;vec2 vCurrOffset=vec2(0,0);vec2 vLastOffset=vec2(0,0);float lastSampledHeight=1.0;float currSampledHeight=1.0;bool keepWorking=true;for (int i=0; icurrRayHeight)\n{float delta1=currSampledHeight-currRayHeight;float delta2=(currRayHeight+stepSize)-lastSampledHeight;float ratio=delta1/(delta1+delta2);vCurrOffset=(ratio)* vLastOffset+(1.0-ratio)*vCurrOffset;keepWorking=false;}\nelse\n{currRayHeight-=stepSize;vLastOffset=vCurrOffset;\n#ifdef PARALLAX_RHS\nvCurrOffset-=stepSize*vMaxOffset;\n#else\nvCurrOffset+=stepSize*vMaxOffset;\n#endif\nlastSampledHeight=currSampledHeight;}}\nreturn vCurrOffset;}\nvec2 parallaxOffset(vec3 viewDir,float heightScale)\n{float height=texture2D(bumpSampler,vBumpUV).w;vec2 texCoordOffset=heightScale*viewDir.xy*height;\n#ifdef PARALLAX_RHS\nreturn texCoordOffset;\n#else\nreturn -texCoordOffset;\n#endif\n}\n#endif\n`;\nY.IncludesShadersStore[GA] = XA;\nconst HA = \"logDepthDeclaration\", KA = `#ifdef LOGARITHMICDEPTH\nuniform float logarithmicDepthConstant;varying float vFragmentDepth;\n#endif\n`;\nY.IncludesShadersStore[HA] = KA;\nconst qA = \"bumpFragment\", YA = `vec2 uvOffset=vec2(0.0,0.0);\n#if defined(BUMP) || defined(PARALLAX) || defined(DETAIL)\n#ifdef NORMALXYSCALE\nfloat normalScale=1.0;\n#elif defined(BUMP)\nfloat normalScale=vBumpInfos.y;\n#else\nfloat normalScale=1.0;\n#endif\n#if defined(TANGENT) && defined(NORMAL)\nmat3 TBN=vTBN;\n#elif defined(BUMP)\nvec2 TBNUV=gl_FrontFacing ? vBumpUV : -vBumpUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vTangentSpaceParams);\n#else\nvec2 TBNUV=gl_FrontFacing ? vDetailUV : -vDetailUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vec2(1.,1.));\n#endif\n#elif defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL)\nmat3 TBN=vTBN;\n#else\nvec2 TBNUV=gl_FrontFacing ? vMainUV1 : -vMainUV1;mat3 TBN=cotangent_frame(normalW,vPositionW,TBNUV,vec2(1.,1.));\n#endif\n#endif\n#ifdef PARALLAX\nmat3 invTBN=transposeMat3(TBN);\n#ifdef PARALLAXOCCLUSION\nuvOffset=parallaxOcclusion(invTBN*-viewDirectionW,invTBN*normalW,vBumpUV,vBumpInfos.z);\n#else\nuvOffset=parallaxOffset(invTBN*viewDirectionW,vBumpInfos.z);\n#endif\n#endif\n#ifdef DETAIL\nvec4 detailColor=texture2D(detailSampler,vDetailUV+uvOffset);vec2 detailNormalRG=detailColor.wy*2.0-1.0;float detailNormalB=sqrt(1.-saturate(dot(detailNormalRG,detailNormalRG)));vec3 detailNormal=vec3(detailNormalRG,detailNormalB);\n#endif\n#ifdef BUMP\n#ifdef OBJECTSPACE_NORMALMAP\n#define CUSTOM_FRAGMENT_BUMP_FRAGMENT\nnormalW=normalize(texture2D(bumpSampler,vBumpUV).xyz *2.0-1.0);normalW=normalize(mat3(normalMatrix)*normalW);\n#elif !defined(DETAIL)\nnormalW=perturbNormal(TBN,texture2D(bumpSampler,vBumpUV+uvOffset).xyz,vBumpInfos.y);\n#else\nvec3 bumpNormal=texture2D(bumpSampler,vBumpUV+uvOffset).xyz*2.0-1.0;\n#if DETAIL_NORMALBLENDMETHOD==0 \ndetailNormal.xy*=vDetailInfos.z;vec3 blendedNormal=normalize(vec3(bumpNormal.xy+detailNormal.xy,bumpNormal.z*detailNormal.z));\n#elif DETAIL_NORMALBLENDMETHOD==1 \ndetailNormal.xy*=vDetailInfos.z;bumpNormal+=vec3(0.0,0.0,1.0);detailNormal*=vec3(-1.0,-1.0,1.0);vec3 blendedNormal=bumpNormal*dot(bumpNormal,detailNormal)/bumpNormal.z-detailNormal;\n#endif\nnormalW=perturbNormalBase(TBN,blendedNormal,vBumpInfos.y);\n#endif\n#elif defined(DETAIL)\ndetailNormal.xy*=vDetailInfos.z;normalW=perturbNormalBase(TBN,detailNormal,vDetailInfos.z);\n#endif\n`;\nY.IncludesShadersStore[qA] = YA;\nconst ZA = \"decalFragment\", jA = `#ifdef DECAL\n#ifdef GAMMADECAL\ndecalColor.rgb=toLinearSpace(decalColor.rgb);\n#endif\n#ifdef DECAL_SMOOTHALPHA\ndecalColor.a*=decalColor.a;\n#endif\nsurfaceAlbedo.rgb=mix(surfaceAlbedo.rgb,decalColor.rgb,decalColor.a);\n#endif\n`;\nY.IncludesShadersStore[ZA] = jA;\nconst QA = \"depthPrePass\", JA = `#ifdef DEPTHPREPASS\ngl_FragColor=vec4(0.,0.,0.,1.0);return;\n#endif\n`;\nY.IncludesShadersStore[QA] = JA;\nconst $A = \"lightFragment\", e1 = `#ifdef LIGHT{X}\n#if defined(SHADOWONLY) || defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X}) && defined(LIGHTMAPNOSPECULAR{X})\n#else\n#ifdef PBR\n#ifdef SPOTLIGHT{X}\npreInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(POINTLIGHT{X})\npreInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(HEMILIGHT{X})\npreInfo=computeHemisphericPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(DIRLIGHT{X})\npreInfo=computeDirectionalPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#endif\npreInfo.NdotV=NdotV;\n#ifdef SPOTLIGHT{X}\n#ifdef LIGHT_FALLOFF_GLTF{X}\npreInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff_GLTF(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);\n#elif defined(LIGHT_FALLOFF_PHYSICAL{X})\npreInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);preInfo.attenuation*=computeDirectionalLightFalloff_Physical(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w);\n#elif defined(LIGHT_FALLOFF_STANDARD{X})\npreInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);preInfo.attenuation*=computeDirectionalLightFalloff_Standard(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w);\n#else\npreInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);\n#endif\n#elif defined(POINTLIGHT{X})\n#ifdef LIGHT_FALLOFF_GLTF{X}\npreInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);\n#elif defined(LIGHT_FALLOFF_PHYSICAL{X})\npreInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);\n#elif defined(LIGHT_FALLOFF_STANDARD{X})\npreInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);\n#else\npreInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);\n#endif\n#else\npreInfo.attenuation=1.0;\n#endif\n#ifdef HEMILIGHT{X}\npreInfo.roughness=roughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(roughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\n#ifdef IRIDESCENCE\npreInfo.iridescenceIntensity=iridescenceIntensity;\n#endif\n#ifdef HEMILIGHT{X}\ninfo.diffuse=computeHemisphericDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb,light{X}.vLightGround);\n#elif defined(SS_TRANSLUCENCY)\ninfo.diffuse=computeDiffuseAndTransmittedLighting(preInfo,light{X}.vLightDiffuse.rgb,subSurfaceOut.transmittance);\n#else\ninfo.diffuse=computeDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb);\n#endif\n#ifdef SPECULARTERM\n#ifdef ANISOTROPIC\ninfo.specular=computeAnisotropicSpecularLighting(preInfo,viewDirectionW,normalW,anisotropicOut.anisotropicTangent,anisotropicOut.anisotropicBitangent,anisotropicOut.anisotropy,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);\n#else\ninfo.specular=computeSpecularLighting(preInfo,normalW,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);\n#endif\n#endif\n#ifdef SHEEN\n#ifdef SHEEN_LINKWITHALBEDO\npreInfo.roughness=sheenOut.sheenIntensity;\n#else\n#ifdef HEMILIGHT{X}\npreInfo.roughness=sheenOut.sheenRoughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(sheenOut.sheenRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\n#endif\ninfo.sheen=computeSheenLighting(preInfo,normalW,sheenOut.sheenColor,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);\n#endif\n#ifdef CLEARCOAT\n#ifdef HEMILIGHT{X}\npreInfo.roughness=clearcoatOut.clearCoatRoughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(clearcoatOut.clearCoatRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\ninfo.clearCoat=computeClearCoatLighting(preInfo,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatAARoughnessFactors.x,clearcoatOut.clearCoatIntensity,light{X}.vLightDiffuse.rgb);\n#ifdef CLEARCOAT_TINT\nabsorption=computeClearCoatLightingAbsorption(clearcoatOut.clearCoatNdotVRefract,preInfo.L,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatColor,clearcoatOut.clearCoatThickness,clearcoatOut.clearCoatIntensity);info.diffuse*=absorption;\n#ifdef SPECULARTERM\ninfo.specular*=absorption;\n#endif\n#endif\ninfo.diffuse*=info.clearCoat.w;\n#ifdef SPECULARTERM\ninfo.specular*=info.clearCoat.w;\n#endif\n#ifdef SHEEN\ninfo.sheen*=info.clearCoat.w;\n#endif\n#endif\n#else\n#ifdef SPOTLIGHT{X}\ninfo=computeSpotLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDirection,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness);\n#elif defined(HEMILIGHT{X})\ninfo=computeHemisphericLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightGround,glossiness);\n#elif defined(POINTLIGHT{X}) || defined(DIRLIGHT{X})\ninfo=computeLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness);\n#endif\n#endif\n#ifdef PROJECTEDLIGHTTEXTURE{X}\ninfo.diffuse*=computeProjectionTextureDiffuseLighting(projectionLightSampler{X},textureProjectionMatrix{X});\n#endif\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nfor (int i=0; i=0.) {index{X}=i;break;}}\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nif (index{X}>=0)\n#endif\n{\n#if defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#else\nshadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#endif\n#else\nshadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nshadowDebug{X}=vec3(shadow)*vCascadeColorsMultiplier{X}[index{X}];\n#endif\n#ifndef SHADOWCSMNOBLEND{X}\nfloat frustumLength=frustumLengths{X}[index{X}];float diffRatio=clamp(diff{X}/frustumLength,0.,1.)*cascadeBlendFactor{X};if (index{X}<(SHADOWCSMNUM_CASCADES{X}-1) && diffRatio<1.)\n{index{X}+=1;float nextShadow=0.;\n#if defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nnextShadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nnextShadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nnextShadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nnextShadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#elif defined(SHADOWMEDIUMQUALITY{X})\nnextShadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#else\nnextShadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#endif\n#else\nnextShadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\nshadow=mix(nextShadow,shadow,diffRatio);\n#ifdef SHADOWCSMDEBUG{X}\nshadowDebug{X}=mix(vec3(nextShadow)*vCascadeColorsMultiplier{X}[index{X}],shadowDebug{X},diffRatio);\n#endif\n}\n#endif\n}\n#elif defined(SHADOWCLOSEESM{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithCloseESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);\n#else\nshadow=computeShadowWithCloseESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWESM{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);\n#else\nshadow=computeShadowWithESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPOISSON{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithPoissonSamplingCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.depthValues);\n#else\nshadow=computeShadowWithPoissonSampling(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithPCF1(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithPCF3(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithPCF5(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithPCSS16(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithPCSS32(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithPCSS64(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#else\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.depthValues);\n#else\nshadow=computeShadow(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#endif\n#ifdef SHADOWONLY\n#ifndef SHADOWINUSE\n#define SHADOWINUSE\n#endif\nglobalShadow+=shadow;shadowLightCount+=1.0;\n#endif\n#else\nshadow=1.;\n#endif\naggShadow+=shadow;numLights+=1.0;\n#ifndef SHADOWONLY\n#ifdef CUSTOMUSERLIGHTING\ndiffuseBase+=computeCustomDiffuseLighting(info,diffuseBase,shadow);\n#ifdef SPECULARTERM\nspecularBase+=computeCustomSpecularLighting(info,specularBase,shadow);\n#endif\n#elif defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X})\ndiffuseBase+=lightmapColor.rgb*shadow;\n#ifdef SPECULARTERM\n#ifndef LIGHTMAPNOSPECULAR{X}\nspecularBase+=info.specular*shadow*lightmapColor.rgb;\n#endif\n#endif\n#ifdef CLEARCOAT\n#ifndef LIGHTMAPNOSPECULAR{X}\nclearCoatBase+=info.clearCoat.rgb*shadow*lightmapColor.rgb;\n#endif\n#endif\n#ifdef SHEEN\n#ifndef LIGHTMAPNOSPECULAR{X}\nsheenBase+=info.sheen.rgb*shadow;\n#endif\n#endif\n#else\n#ifdef SHADOWCSMDEBUG{X}\ndiffuseBase+=info.diffuse*shadowDebug{X};\n#else \ndiffuseBase+=info.diffuse*shadow;\n#endif\n#ifdef SPECULARTERM\nspecularBase+=info.specular*shadow;\n#endif\n#ifdef CLEARCOAT\nclearCoatBase+=info.clearCoat.rgb*shadow;\n#endif\n#ifdef SHEEN\nsheenBase+=info.sheen.rgb*shadow;\n#endif\n#endif\n#endif\n#endif\n`;\nY.IncludesShadersStore[$A] = e1;\nconst t1 = \"logDepthFragment\", i1 = `#ifdef LOGARITHMICDEPTH\ngl_FragDepthEXT=log2(vFragmentDepth)*logarithmicDepthConstant*0.5;\n#endif\n`;\nY.IncludesShadersStore[t1] = i1;\nconst r1 = \"oitFragment\", s1 = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY\nfloat fragDepth=gl_FragCoord.z; \n#ifdef ORDER_INDEPENDENT_TRANSPARENCY_16BITS\nuint halfFloat=packHalf2x16(vec2(fragDepth));vec2 full=unpackHalf2x16(halfFloat);fragDepth=full.x;\n#endif\nivec2 fragCoord=ivec2(gl_FragCoord.xy);vec2 lastDepth=texelFetch(oitDepthSampler,fragCoord,0).rg;vec4 lastFrontColor=texelFetch(oitFrontColorSampler,fragCoord,0);depth.rg=vec2(-MAX_DEPTH);frontColor=lastFrontColor;backColor=vec4(0.0);\n#ifdef USE_REVERSE_DEPTHBUFFER\nfloat furthestDepth=-lastDepth.x;float nearestDepth=lastDepth.y;\n#else\nfloat nearestDepth=-lastDepth.x;float furthestDepth=lastDepth.y;\n#endif\nfloat alphaMultiplier=1.0-lastFrontColor.a;\n#ifdef USE_REVERSE_DEPTHBUFFER\nif (fragDepth>nearestDepth || fragDepthfurthestDepth) {\n#endif\nreturn;}\n#ifdef USE_REVERSE_DEPTHBUFFER\nif (fragDepthfurthestDepth) {\n#else\nif (fragDepth>nearestDepth && fragDepth\n#if defined(BUMP) || !defined(NORMAL)\n#extension GL_OES_standard_derivatives : enable\n#endif\n#include[SCENE_MRT_COUNT]\n#include\n#define CUSTOM_FRAGMENT_BEGIN\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#include[1..7]\n#include\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n#include\n#include\n#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse,_SAMPLERNAME_,diffuse)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_SAMPLERNAME_,ambient)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_SAMPLERNAME_,opacity)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_SAMPLERNAME_,emissive)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_SAMPLERNAME_,lightmap)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_SAMPLERNAME_,decal)\n#ifdef REFRACTION\n#ifdef REFRACTIONMAP_3D\nuniform samplerCube refractionCubeSampler;\n#else\nuniform sampler2D refraction2DSampler;\n#endif\n#endif\n#if defined(SPECULARTERM)\n#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular,_SAMPLERNAME_,specular)\n#endif\n#include\n#ifdef REFLECTION\n#ifdef REFLECTIONMAP_3D\nuniform samplerCube reflectionCubeSampler;\n#else\nuniform sampler2D reflection2DSampler;\n#endif\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#else\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#endif\n#include\n#endif\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include\nvec3 viewDirectionW=normalize(vEyePosition.xyz-vPositionW);vec4 baseColor=vec4(1.,1.,1.,1.);vec3 diffuseColor=vDiffuseColor.rgb;float alpha=vDiffuseColor.a;\n#ifdef NORMAL\nvec3 normalW=normalize(vNormalW);\n#else\nvec3 normalW=normalize(-cross(dFdx(vPositionW),dFdy(vPositionW)));\n#endif\n#include\n#ifdef TWOSIDEDLIGHTING\nnormalW=gl_FrontFacing ? normalW : -normalW;\n#endif\n#ifdef DIFFUSE\nbaseColor=texture2D(diffuseSampler,vDiffuseUV+uvOffset);\n#if defined(ALPHATEST) && !defined(ALPHATEST_AFTERALLALPHACOMPUTATIONS)\nif (baseColor.a(surfaceAlbedo,baseColor,GAMMADECAL,_GAMMADECAL_NOTUSED_)\n#endif\n#include\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nbaseColor.rgb*=vColor.rgb;\n#endif\n#ifdef DETAIL\nbaseColor.rgb=baseColor.rgb*2.0*mix(0.5,detailColor.r,vDetailInfos.y);\n#endif\n#if defined(DECAL) && defined(DECAL_AFTER_DETAIL)\nvec4 decalColor=texture2D(decalSampler,vDecalUV+uvOffset);\n#include(surfaceAlbedo,baseColor,GAMMADECAL,_GAMMADECAL_NOTUSED_)\n#endif\n#define CUSTOM_FRAGMENT_UPDATE_DIFFUSE\nvec3 baseAmbientColor=vec3(1.,1.,1.);\n#ifdef AMBIENT\nbaseAmbientColor=texture2D(ambientSampler,vAmbientUV+uvOffset).rgb*vAmbientInfos.y;\n#endif\n#define CUSTOM_FRAGMENT_BEFORE_LIGHTS\n#ifdef SPECULARTERM\nfloat glossiness=vSpecularColor.a;vec3 specularColor=vSpecularColor.rgb;\n#ifdef SPECULAR\nvec4 specularMapColor=texture2D(specularSampler,vSpecularUV+uvOffset);specularColor=specularMapColor.rgb;\n#ifdef GLOSSINESS\nglossiness=glossiness*specularMapColor.a;\n#endif\n#endif\n#else\nfloat glossiness=0.;\n#endif\nvec3 diffuseBase=vec3(0.,0.,0.);lightingInfo info;\n#ifdef SPECULARTERM\nvec3 specularBase=vec3(0.,0.,0.);\n#endif\nfloat shadow=1.;float aggShadow=0.;float numLights=0.;\n#ifdef LIGHTMAP\nvec4 lightmapColor=texture2D(lightmapSampler,vLightmapUV+uvOffset);\n#ifdef RGBDLIGHTMAP\nlightmapColor.rgb=fromRGBD(lightmapColor);\n#endif\nlightmapColor.rgb*=vLightmapInfos.y;\n#endif\n#include[0..maxSimultaneousLights]\naggShadow=aggShadow/numLights;vec4 refractionColor=vec4(0.,0.,0.,1.);\n#ifdef REFRACTION\nvec3 refractionVector=normalize(refract(-viewDirectionW,normalW,vRefractionInfos.y));\n#ifdef REFRACTIONMAP_3D\n#ifdef USE_LOCAL_REFRACTIONMAP_CUBIC\nrefractionVector=parallaxCorrectNormal(vPositionW,refractionVector,vRefractionSize,vRefractionPosition);\n#endif\nrefractionVector.y=refractionVector.y*vRefractionInfos.w;vec4 refractionLookup=textureCube(refractionCubeSampler,refractionVector);if (dot(refractionVector,viewDirectionW)<1.0) {refractionColor=refractionLookup;}\n#else\nvec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*vRefractionInfos.z,1.0)));vec2 refractionCoords=vRefractionUVW.xy/vRefractionUVW.z;refractionCoords.y=1.0-refractionCoords.y;refractionColor=texture2D(refraction2DSampler,refractionCoords);\n#endif\n#ifdef RGBDREFRACTION\nrefractionColor.rgb=fromRGBD(refractionColor);\n#endif\n#ifdef IS_REFRACTION_LINEAR\nrefractionColor.rgb=toGammaSpace(refractionColor.rgb);\n#endif\nrefractionColor.rgb*=vRefractionInfos.x;\n#endif\nvec4 reflectionColor=vec4(0.,0.,0.,1.);\n#ifdef REFLECTION\nvec3 vReflectionUVW=computeReflectionCoords(vec4(vPositionW,1.0),normalW);\n#ifdef REFLECTIONMAP_OPPOSITEZ\nvReflectionUVW.z*=-1.0;\n#endif\n#ifdef REFLECTIONMAP_3D\n#ifdef ROUGHNESS\nfloat bias=vReflectionInfos.y;\n#ifdef SPECULARTERM\n#ifdef SPECULAR\n#ifdef GLOSSINESS\nbias*=(1.0-specularMapColor.a);\n#endif\n#endif\n#endif\nreflectionColor=textureCube(reflectionCubeSampler,vReflectionUVW,bias);\n#else\nreflectionColor=textureCube(reflectionCubeSampler,vReflectionUVW);\n#endif\n#else\nvec2 coords=vReflectionUVW.xy;\n#ifdef REFLECTIONMAP_PROJECTION\ncoords/=vReflectionUVW.z;\n#endif\ncoords.y=1.0-coords.y;reflectionColor=texture2D(reflection2DSampler,coords);\n#endif\n#ifdef RGBDREFLECTION\nreflectionColor.rgb=fromRGBD(reflectionColor);\n#endif\n#ifdef IS_REFLECTION_LINEAR\nreflectionColor.rgb=toGammaSpace(reflectionColor.rgb);\n#endif\nreflectionColor.rgb*=vReflectionInfos.x;\n#ifdef REFLECTIONFRESNEL\nfloat reflectionFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,reflectionRightColor.a,reflectionLeftColor.a);\n#ifdef REFLECTIONFRESNELFROMSPECULAR\n#ifdef SPECULARTERM\nreflectionColor.rgb*=specularColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#else\nreflectionColor.rgb*=reflectionLeftColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#endif\n#else\nreflectionColor.rgb*=reflectionLeftColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#endif\n#endif\n#endif\n#ifdef REFRACTIONFRESNEL\nfloat refractionFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,refractionRightColor.a,refractionLeftColor.a);refractionColor.rgb*=refractionLeftColor.rgb*(1.0-refractionFresnelTerm)+refractionFresnelTerm*refractionRightColor.rgb;\n#endif\n#ifdef OPACITY\nvec4 opacityMap=texture2D(opacitySampler,vOpacityUV+uvOffset);\n#ifdef OPACITYRGB\nopacityMap.rgb=opacityMap.rgb*vec3(0.3,0.59,0.11);alpha*=(opacityMap.x+opacityMap.y+opacityMap.z)* vOpacityInfos.y;\n#else\nalpha*=opacityMap.a*vOpacityInfos.y;\n#endif\n#endif\n#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nalpha*=vColor.a;\n#endif\n#ifdef OPACITYFRESNEL\nfloat opacityFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,opacityParts.z,opacityParts.w);alpha+=opacityParts.x*(1.0-opacityFresnelTerm)+opacityFresnelTerm*opacityParts.y;\n#endif\n#ifdef ALPHATEST\n#ifdef ALPHATEST_AFTERALLALPHACOMPUTATIONS\nif (alpha\n#include\n#ifdef IMAGEPROCESSINGPOSTPROCESS\ncolor.rgb=toLinearSpace(color.rgb);\n#else\n#ifdef IMAGEPROCESSING\ncolor.rgb=toLinearSpace(color.rgb);color=applyImageProcessing(color);\n#endif\n#endif\ncolor.a*=visibility;\n#ifdef PREMULTIPLYALPHA\ncolor.rgb*=color.a;\n#endif\n#define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\n#ifdef PREPASS\nfloat writeGeometryInfo=color.a>0.4 ? 1.0 : 0.0;gl_FragData[0]=color; \n#ifdef PREPASS_POSITION\ngl_FragData[PREPASS_POSITION_INDEX]=vec4(vPositionW,writeGeometryInfo);\n#endif\n#ifdef PREPASS_VELOCITY\nvec2 a=(vCurrentPosition.xy/vCurrentPosition.w)*0.5+0.5;vec2 b=(vPreviousPosition.xy/vPreviousPosition.w)*0.5+0.5;vec2 velocity=abs(a-b);velocity=vec2(pow(velocity.x,1.0/3.0),pow(velocity.y,1.0/3.0))*sign(a-b)*0.5+0.5;gl_FragData[PREPASS_VELOCITY_INDEX]=vec4(velocity,0.0,writeGeometryInfo);\n#endif\n#ifdef PREPASS_IRRADIANCE\ngl_FragData[PREPASS_IRRADIANCE_INDEX]=vec4(0.0,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_DEPTH\ngl_FragData[PREPASS_DEPTH_INDEX]=vec4(vViewPos.z,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_NORMAL\n#ifdef PREPASS_NORMAL_WORLDSPACE\ngl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalW,writeGeometryInfo); \n#else\ngl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalize((view*vec4(normalW,0.0)).rgb),writeGeometryInfo); \n#endif\n#endif\n#ifdef PREPASS_ALBEDO_SQRT\ngl_FragData[PREPASS_ALBEDO_SQRT_INDEX]=vec4(0.0,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_REFLECTIVITY\n#if defined(SPECULARTERM)\n#if defined(SPECULAR)\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(toLinearSpace(specularMapColor))*writeGeometryInfo; \n#else\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(toLinearSpace(specularColor),1.0)*writeGeometryInfo;\n#endif\n#else\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(0.0,0.0,0.0,1.0)*writeGeometryInfo;\n#endif\n#endif\n#endif\n#if !defined(PREPASS) || defined(WEBGL2)\ngl_FragColor=color;\n#endif\n#include\n#if ORDER_INDEPENDENT_TRANSPARENCY\nif (fragDepth==nearestDepth) {frontColor.rgb+=color.rgb*color.a*alphaMultiplier;frontColor.a=1.0-alphaMultiplier*(1.0-color.a);} else {backColor+=color;}\n#endif\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n`;\nY.ShadersStore[n1] = a1;\nconst o1 = \"decalVertexDeclaration\", l1 = `#ifdef DECAL\nuniform vec4 vDecalInfos;uniform mat4 decalMatrix;\n#endif\n`;\nY.IncludesShadersStore[o1] = l1;\nconst c1 = \"defaultVertexDeclaration\", h1 = `uniform mat4 viewProjection;uniform mat4 view;\n#ifdef DIFFUSE\nuniform mat4 diffuseMatrix;uniform vec2 vDiffuseInfos;\n#endif\n#ifdef AMBIENT\nuniform mat4 ambientMatrix;uniform vec2 vAmbientInfos;\n#endif\n#ifdef OPACITY\nuniform mat4 opacityMatrix;uniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;uniform mat4 emissiveMatrix;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;uniform mat4 lightmapMatrix;\n#endif\n#if defined(SPECULAR) && defined(SPECULARTERM)\nuniform vec2 vSpecularInfos;uniform mat4 specularMatrix;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;uniform mat4 bumpMatrix;\n#endif\n#ifdef REFLECTION\nuniform mat4 reflectionMatrix;\n#endif\n#ifdef POINTSIZE\nuniform float pointSize;\n#endif\n#ifdef DETAIL\nuniform vec4 vDetailInfos;uniform mat4 detailMatrix;\n#endif\n#include\n#define ADDITIONAL_VERTEX_DECLARATION\n`;\nY.IncludesShadersStore[c1] = h1;\nconst u1 = \"uvAttributeDeclaration\", f1 = `#ifdef UV{X}\nattribute vec2 uv{X};\n#endif\n`;\nY.IncludesShadersStore[u1] = f1;\nconst d1 = \"prePassVertexDeclaration\", p1 = `#ifdef PREPASS\n#ifdef PREPASS_DEPTH\nvarying vec3 vViewPos;\n#endif\n#ifdef PREPASS_VELOCITY\nuniform mat4 previousViewProjection;varying vec4 vCurrentPosition;varying vec4 vPreviousPosition;\n#endif\n#endif\n`;\nY.IncludesShadersStore[d1] = p1;\nconst g1 = \"samplerVertexDeclaration\", m1 = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0\nvarying vec2 v_VARYINGNAME_UV;\n#endif\n`;\nY.IncludesShadersStore[g1] = m1;\nconst _1 = \"bumpVertexDeclaration\", E1 = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL) \nvarying mat3 vTBN;\n#endif\n#endif\n`;\nY.IncludesShadersStore[_1] = E1;\nconst v1 = \"lightVxFragmentDeclaration\", T1 = `#ifdef LIGHT{X}\nuniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X};\n#ifdef SPECULARTERM\nuniform vec4 vLightSpecular{X};\n#else\nvec4 vLightSpecular{X}=vec4(0.);\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#elif defined(SHADOWCUBE{X})\n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};uniform mat4 lightMatrix{X};\n#endif\nuniform vec4 shadowsInfo{X};uniform vec2 depthValues{X};\n#endif\n#ifdef SPOTLIGHT{X}\nuniform vec4 vLightDirection{X};uniform vec4 vLightFalloff{X};\n#elif defined(POINTLIGHT{X})\nuniform vec4 vLightFalloff{X};\n#elif defined(HEMILIGHT{X})\nuniform vec3 vLightGround{X};\n#endif\n#endif\n`;\nY.IncludesShadersStore[v1] = T1;\nconst x1 = \"lightVxUboDeclaration\", C1 = `#ifdef LIGHT{X}\nuniform Light{X}\n{vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular;\n#ifdef SPOTLIGHT{X}\nvec4 vLightDirection;vec4 vLightFalloff;\n#elif defined(POINTLIGHT{X})\nvec4 vLightFalloff;\n#elif defined(HEMILIGHT{X})\nvec3 vLightGround;\n#endif\nvec4 shadowsInfo;vec2 depthValues;} light{X};\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#elif defined(SHADOWCUBE{X})\n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};uniform mat4 lightMatrix{X};\n#endif\n#endif\n#endif\n`;\nY.IncludesShadersStore[x1] = C1;\nconst R1 = \"prePassVertex\", S1 = `#ifdef PREPASS_DEPTH\nvViewPos=(view*worldPos).rgb;\n#endif\n#if defined(PREPASS_VELOCITY) && defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*worldPos;\n#if NUM_BONE_INFLUENCERS>0\nmat4 previousInfluence;previousInfluence=mPreviousBones[int(matricesIndices[0])]*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\npreviousInfluence+=mPreviousBones[int(matricesIndices[1])]*matricesWeights[1];\n#endif \n#if NUM_BONE_INFLUENCERS>2\npreviousInfluence+=mPreviousBones[int(matricesIndices[2])]*matricesWeights[2];\n#endif \n#if NUM_BONE_INFLUENCERS>3\npreviousInfluence+=mPreviousBones[int(matricesIndices[3])]*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[0])]*matricesWeightsExtra[0];\n#endif \n#if NUM_BONE_INFLUENCERS>5\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[1])]*matricesWeightsExtra[1];\n#endif \n#if NUM_BONE_INFLUENCERS>6\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[2])]*matricesWeightsExtra[2];\n#endif \n#if NUM_BONE_INFLUENCERS>7\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[3])]*matricesWeightsExtra[3];\n#endif\nvPreviousPosition=previousViewProjection*finalPreviousWorld*previousInfluence*vec4(positionUpdated,1.0);\n#else\nvPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\n#endif\n#endif\n`;\nY.IncludesShadersStore[R1] = S1;\nconst y1 = \"uvVariableDeclaration\", I1 = `#if !defined(UV{X}) && defined(MAINUV{X})\nvec2 uv{X}=vec2(0.,0.);\n#endif\n#ifdef MAINUV{X}\nvMainUV{X}=uv{X};\n#endif\n`;\nY.IncludesShadersStore[y1] = I1;\nconst b1 = \"samplerVertexImplementation\", A1 = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0\nif (v_INFONAME_==0.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uvUpdated,1.0,0.0));}\n#ifdef UV2\nelse if (v_INFONAME_==1.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv2,1.0,0.0));}\n#endif\n#ifdef UV3\nelse if (v_INFONAME_==2.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv3,1.0,0.0));}\n#endif\n#ifdef UV4\nelse if (v_INFONAME_==3.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv4,1.0,0.0));}\n#endif\n#ifdef UV5\nelse if (v_INFONAME_==4.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv5,1.0,0.0));}\n#endif\n#ifdef UV6\nelse if (v_INFONAME_==5.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv6,1.0,0.0));}\n#endif\n#endif\n`;\nY.IncludesShadersStore[b1] = A1;\nconst M1 = \"bumpVertex\", P1 = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL)\nvec3 tbnNormal=normalize(normalUpdated);vec3 tbnTangent=normalize(tangentUpdated.xyz);vec3 tbnBitangent=cross(tbnNormal,tbnTangent)*tangentUpdated.w;vTBN=mat3(finalWorld)*mat3(tbnTangent,tbnBitangent,tbnNormal);\n#endif\n#endif\n`;\nY.IncludesShadersStore[M1] = P1;\nconst O1 = \"shadowsVertex\", D1 = `#ifdef SHADOWS\n#if defined(SHADOWCSM{X})\nvPositionFromCamera{X}=view*worldPos;for (int i=0; i\n#define CUSTOM_VERTEX_BEGIN\nattribute vec3 position;\n#ifdef NORMAL\nattribute vec3 normal;\n#endif\n#ifdef TANGENT\nattribute vec4 tangent;\n#endif\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#include[2..7]\n#ifdef VERTEXCOLOR\nattribute vec4 color;\n#endif\n#include\n#include\n#include\n#include\n#include\n#include[1..7]\n#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap)\n#if defined(SPECULARTERM)\n#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular)\n#endif\n#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal)\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#include\n#include\n#include\n#include<__decl__lightVxFragment>[0..maxSimultaneousLights]\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#include\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvec3 positionUpdated=position;\n#ifdef NORMAL\nvec3 normalUpdated=normal;\n#endif\n#ifdef TANGENT\nvec4 tangentUpdated=tangent;\n#endif\n#ifdef UV1\nvec2 uvUpdated=uv;\n#endif\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvPositionUVW=positionUpdated;\n#endif\n#define CUSTOM_VERTEX_UPDATE_POSITION\n#define CUSTOM_VERTEX_UPDATE_NORMAL\n#include\n#if defined(PREPASS) && defined(PREPASS_VELOCITY) && !defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*finalWorld*vec4(positionUpdated,1.0);vPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\n#endif\n#include\n#include\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\n#ifdef NORMAL\nmat3 normalWorld=mat3(finalWorld);\n#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvNormalW=normalUpdated/vec3(dot(normalWorld[0],normalWorld[0]),dot(normalWorld[1],normalWorld[1]),dot(normalWorld[2],normalWorld[2]));vNormalW=normalize(normalWorld*vNormalW);\n#else\n#ifdef NONUNIFORMSCALING\nnormalWorld=transposeMat3(inverseMat3(normalWorld));\n#endif\nvNormalW=normalize(normalWorld*normalUpdated);\n#endif\n#endif\n#define CUSTOM_VERTEX_UPDATE_WORLDPOS\n#ifdef MULTIVIEW\nif (gl_ViewID_OVR==0u) {gl_Position=viewProjection*worldPos;} else {gl_Position=viewProjectionR*worldPos;}\n#else\ngl_Position=viewProjection*worldPos;\n#endif\nvPositionW=vec3(worldPos);\n#include\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0)));\n#endif\n#ifndef UV1\nvec2 uvUpdated=vec2(0.,0.);\n#endif\n#ifdef MAINUV1\nvMainUV1=uvUpdated;\n#endif\n#include[2..7]\n#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse,_MATRIXNAME_,diffuse,_INFONAME_,DiffuseInfos.x)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_MATRIXNAME_,emissive,_INFONAME_,EmissiveInfos.x)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_MATRIXNAME_,lightmap,_INFONAME_,LightmapInfos.x)\n#if defined(SPECULARTERM)\n#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular,_MATRIXNAME_,specular,_INFONAME_,SpecularInfos.x)\n#endif\n#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_MATRIXNAME_,bump,_INFONAME_,BumpInfos.x)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_MATRIXNAME_,decal,_INFONAME_,DecalInfos.x)\n#include\n#include\n#include\n#include[0..maxSimultaneousLights]\n#include\n#include\n#include\n#define CUSTOM_VERTEX_MAIN_END\n}\n`;\nY.ShadersStore[U1] = V1;\nconst B1 = new RegExp(\"^([gimus]+)!\");\nclass rn {\n /**\n * Creates a new instance of the plugin manager\n * @param material material that this manager will manage the plugins for\n */\n constructor(e) {\n this._plugins = [], this._activePlugins = [], this._activePluginsForExtraEvents = [], this._material = e, this._scene = e.getScene(), this._engine = this._scene.getEngine();\n }\n /**\n * @internal\n */\n _addPlugin(e) {\n for (let r = 0; r < this._plugins.length; ++r)\n if (this._plugins[r].name === e.name)\n return !1;\n if (this._material._uniformBufferLayoutBuilt)\n throw `The plugin \"${e.name}\" can't be added to the material \"${this._material.name}\" because this material has already been used for rendering! Please add plugins to materials before any rendering with this material occurs.`;\n const t = e.getClassName();\n rn._MaterialPluginClassToMainDefine[t] || (rn._MaterialPluginClassToMainDefine[t] = \"MATERIALPLUGIN_\" + ++rn._MaterialPluginCounter), this._material._callbackPluginEventGeneric = (r, s) => this._handlePluginEvent(r, s), this._plugins.push(e), this._plugins.sort((r, s) => r.priority - s.priority), this._codeInjectionPoints = {};\n const i = {};\n i[rn._MaterialPluginClassToMainDefine[t]] = {\n type: \"boolean\",\n default: !0\n };\n for (const r of this._plugins)\n r.collectDefines(i), this._collectPointNames(\"vertex\", r.getCustomCode(\"vertex\")), this._collectPointNames(\"fragment\", r.getCustomCode(\"fragment\"));\n return this._defineNamesFromPlugins = i, !0;\n }\n /**\n * @internal\n */\n _activatePlugin(e) {\n this._activePlugins.indexOf(e) === -1 && (this._activePlugins.push(e), this._activePlugins.sort((t, i) => t.priority - i.priority), this._material._callbackPluginEventIsReadyForSubMesh = this._handlePluginEventIsReadyForSubMesh.bind(this), this._material._callbackPluginEventPrepareDefinesBeforeAttributes = this._handlePluginEventPrepareDefinesBeforeAttributes.bind(this), this._material._callbackPluginEventPrepareDefines = this._handlePluginEventPrepareDefines.bind(this), this._material._callbackPluginEventBindForSubMesh = this._handlePluginEventBindForSubMesh.bind(this), e.registerForExtraEvents && (this._activePluginsForExtraEvents.push(e), this._activePluginsForExtraEvents.sort((t, i) => t.priority - i.priority), this._material._callbackPluginEventHasRenderTargetTextures = this._handlePluginEventHasRenderTargetTextures.bind(this), this._material._callbackPluginEventFillRenderTargetTextures = this._handlePluginEventFillRenderTargetTextures.bind(this), this._material._callbackPluginEventHardBindForSubMesh = this._handlePluginEventHardBindForSubMesh.bind(this)));\n }\n /**\n * Gets a plugin from the list of plugins managed by this manager\n * @param name name of the plugin\n * @returns the plugin if found, else null\n */\n getPlugin(e) {\n for (let t = 0; t < this._plugins.length; ++t)\n if (this._plugins[t].name === e)\n return this._plugins[t];\n return null;\n }\n _handlePluginEventIsReadyForSubMesh(e) {\n let t = !0;\n for (const i of this._activePlugins)\n t = t && i.isReadyForSubMesh(e.defines, this._scene, this._engine, e.subMesh);\n e.isReadyForSubMesh = t;\n }\n _handlePluginEventPrepareDefinesBeforeAttributes(e) {\n for (const t of this._activePlugins)\n t.prepareDefinesBeforeAttributes(e.defines, this._scene, e.mesh);\n }\n _handlePluginEventPrepareDefines(e) {\n for (const t of this._activePlugins)\n t.prepareDefines(e.defines, this._scene, e.mesh);\n }\n _handlePluginEventHardBindForSubMesh(e) {\n for (const t of this._activePluginsForExtraEvents)\n t.hardBindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, e.subMesh);\n }\n _handlePluginEventBindForSubMesh(e) {\n for (const t of this._activePlugins)\n t.bindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, e.subMesh);\n }\n _handlePluginEventHasRenderTargetTextures(e) {\n let t = !1;\n for (const i of this._activePluginsForExtraEvents)\n if (t = i.hasRenderTargetTextures(), t)\n break;\n e.hasRenderTargetTextures = t;\n }\n _handlePluginEventFillRenderTargetTextures(e) {\n for (const t of this._activePluginsForExtraEvents)\n t.fillRenderTargetTextures(e.renderTargets);\n }\n _handlePluginEvent(e, t) {\n switch (e) {\n case Ri.GetActiveTextures: {\n const i = t;\n for (const r of this._activePlugins)\n r.getActiveTextures(i.activeTextures);\n break;\n }\n case Ri.GetAnimatables: {\n const i = t;\n for (const r of this._activePlugins)\n r.getAnimatables(i.animatables);\n break;\n }\n case Ri.HasTexture: {\n const i = t;\n let r = !1;\n for (const s of this._activePlugins)\n if (r = s.hasTexture(i.texture), r)\n break;\n i.hasTexture = r;\n break;\n }\n case Ri.Disposed: {\n const i = t;\n for (const r of this._plugins)\n r.dispose(i.forceDisposeTextures);\n break;\n }\n case Ri.GetDefineNames: {\n const i = t;\n i.defineNames = this._defineNamesFromPlugins;\n break;\n }\n case Ri.PrepareEffect: {\n const i = t;\n for (const r of this._activePlugins)\n i.fallbackRank = r.addFallbacks(i.defines, i.fallbacks, i.fallbackRank), r.getAttributes(i.attributes, this._scene, i.mesh);\n this._uniformList.length > 0 && i.uniforms.push(...this._uniformList), this._samplerList.length > 0 && i.samplers.push(...this._samplerList), this._uboList.length > 0 && i.uniformBuffersNames.push(...this._uboList), i.customCode = this._injectCustomCode(i, i.customCode);\n break;\n }\n case Ri.PrepareUniformBuffer: {\n const i = t;\n this._uboDeclaration = \"\", this._vertexDeclaration = \"\", this._fragmentDeclaration = \"\", this._uniformList = [], this._samplerList = [], this._uboList = [];\n for (const r of this._plugins) {\n const s = r.getUniforms();\n if (s) {\n if (s.ubo)\n for (const a of s.ubo) {\n if (a.size && a.type) {\n const o = a.arraySize ?? 0;\n i.ubo.addUniform(a.name, a.size, o), this._uboDeclaration += `${a.type} ${a.name}${o > 0 ? `[${o}]` : \"\"};\n`;\n }\n this._uniformList.push(a.name);\n }\n s.vertex && (this._vertexDeclaration += s.vertex + `\n`), s.fragment && (this._fragmentDeclaration += s.fragment + `\n`);\n }\n r.getSamplers(this._samplerList), r.getUniformBuffersNames(this._uboList);\n }\n break;\n }\n }\n }\n _collectPointNames(e, t) {\n if (t)\n for (const i in t)\n this._codeInjectionPoints[e] || (this._codeInjectionPoints[e] = {}), this._codeInjectionPoints[e][i] = !0;\n }\n _injectCustomCode(e, t) {\n return (i, r) => {\n var o, l;\n t && (r = t(i, r)), this._uboDeclaration && (r = r.replace(\"#define ADDITIONAL_UBO_DECLARATION\", this._uboDeclaration)), this._vertexDeclaration && (r = r.replace(\"#define ADDITIONAL_VERTEX_DECLARATION\", this._vertexDeclaration)), this._fragmentDeclaration && (r = r.replace(\"#define ADDITIONAL_FRAGMENT_DECLARATION\", this._fragmentDeclaration));\n const s = (o = this._codeInjectionPoints) == null ? void 0 : o[i];\n if (!s)\n return r;\n let a = null;\n for (let c in s) {\n let h = \"\";\n for (const u of this._activePlugins) {\n let f = (l = u.getCustomCode(i)) == null ? void 0 : l[c];\n if (f) {\n if (u.resolveIncludes) {\n if (a === null) {\n const d = _i.GLSL;\n a = {\n defines: [],\n indexParameters: e.indexParameters,\n isFragment: !1,\n shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader,\n processor: void 0,\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\n shadersRepository: Y.GetShadersRepository(d),\n includesShadersStore: Y.GetIncludesShadersStore(d),\n version: void 0,\n platformName: this._engine.shaderPlatformName,\n processingContext: void 0,\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\n processCodeAfterIncludes: void 0\n // not used by _ProcessIncludes\n };\n }\n a.isFragment = i === \"fragment\", hs._ProcessIncludes(f, a, (d) => f = d);\n }\n h += f + `\n`;\n }\n }\n if (h.length > 0)\n if (c.charAt(0) === \"!\") {\n c = c.substring(1);\n let u = \"g\";\n if (c.charAt(0) === \"!\")\n u = \"\", c = c.substring(1);\n else {\n const g = B1.exec(c);\n g && g.length >= 2 && (u = g[1], c = c.substring(u.length + 1));\n }\n u.indexOf(\"g\") < 0 && (u += \"g\");\n const f = r, d = new RegExp(c, u);\n let p = d.exec(f);\n for (; p !== null; ) {\n let g = h;\n for (let m = 0; m < p.length; ++m)\n g = g.replace(\"$\" + m, p[m]);\n r = r.replace(p[0], g), p = d.exec(f);\n }\n } else {\n const u = \"#define \" + c;\n r = r.replace(u, `\n` + h + `\n` + u);\n }\n }\n return r;\n };\n }\n}\nrn._MaterialPluginClassToMainDefine = {};\nrn._MaterialPluginCounter = 0;\nst.OnEnginesDisposedObservable.add(() => {\n z1();\n});\nconst k1 = [];\nlet pg = null;\nfunction z1() {\n k1.length = 0, ie.OnEventObservable.remove(pg), pg = null;\n}\nclass Ur {\n _enable(e) {\n e && this._pluginManager._activatePlugin(this);\n }\n /**\n * Creates a new material plugin\n * @param material parent material of the plugin\n * @param name name of the plugin\n * @param priority priority of the plugin\n * @param defines list of defines used by the plugin. The value of the property is the default value for this property\n * @param addToPluginList true to add the plugin to the list of plugins managed by the material plugin manager of the material (default: true)\n * @param enable true to enable the plugin (it is handy if the plugin does not handle properties to switch its current activation)\n * @param resolveIncludes Indicates that any #include directive in the plugin code must be replaced by the corresponding code (default: false)\n */\n constructor(e, t, i, r, s = !0, a = !1, o = !1) {\n this.priority = 500, this.resolveIncludes = !1, this.registerForExtraEvents = !1, this._material = e, this.name = t, this.priority = i, this.resolveIncludes = o, e.pluginManager || (e.pluginManager = new rn(e), e.onDisposeObservable.add(() => {\n e.pluginManager = void 0;\n })), this._pluginDefineNames = r, this._pluginManager = e.pluginManager, s && this._pluginManager._addPlugin(this), a && this._enable(!0), this.markAllDefinesAsDirty = e._dirtyCallbacks[63];\n }\n /**\n * Gets the current class name useful for serialization or dynamic coding.\n * @returns The class name.\n */\n getClassName() {\n return \"MaterialPluginBase\";\n }\n /**\n * Specifies that the submesh is ready to be used.\n * @param defines the list of \"defines\" to update.\n * @param scene defines the scene the material belongs to.\n * @param engine the engine this scene belongs to.\n * @param subMesh the submesh to check for readiness\n * @returns - boolean indicating that the submesh is ready or not.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isReadyForSubMesh(e, t, i, r) {\n return !0;\n }\n /**\n * Binds the material data (this function is called even if mustRebind() returns false)\n * @param uniformBuffer defines the Uniform buffer to fill in.\n * @param scene defines the scene the material belongs to.\n * @param engine defines the engine the material belongs to.\n * @param subMesh the submesh to bind data for\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n hardBindForSubMesh(e, t, i, r) {\n }\n /**\n * Binds the material data.\n * @param uniformBuffer defines the Uniform buffer to fill in.\n * @param scene defines the scene the material belongs to.\n * @param engine the engine this scene belongs to.\n * @param subMesh the submesh to bind data for\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n bindForSubMesh(e, t, i, r) {\n }\n /**\n * Disposes the resources of the material.\n * @param forceDisposeTextures - Forces the disposal of all textures.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n dispose(e) {\n }\n /**\n * Returns a list of custom shader code fragments to customize the shader.\n * @param shaderType \"vertex\" or \"fragment\"\n * @returns null if no code to be added, or a list of pointName =\\> code.\n * Note that `pointName` can also be a regular expression if it starts with a `!`.\n * In that case, the string found by the regular expression (if any) will be\n * replaced by the code provided.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getCustomCode(e) {\n return null;\n }\n /**\n * Collects all defines.\n * @param defines The object to append to.\n */\n collectDefines(e) {\n if (this._pluginDefineNames)\n for (const t of Object.keys(this._pluginDefineNames)) {\n if (t[0] === \"_\")\n continue;\n const i = typeof this._pluginDefineNames[t];\n e[t] = {\n type: i === \"number\" ? \"number\" : i === \"string\" ? \"string\" : i === \"boolean\" ? \"boolean\" : \"object\",\n default: this._pluginDefineNames[t]\n };\n }\n }\n /**\n * Sets the defines for the next rendering. Called before PrepareDefinesForAttributes is called.\n * @param defines the list of \"defines\" to update.\n * @param scene defines the scene to the material belongs to.\n * @param mesh the mesh being rendered\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n prepareDefinesBeforeAttributes(e, t, i) {\n }\n /**\n * Sets the defines for the next rendering\n * @param defines the list of \"defines\" to update.\n * @param scene defines the scene to the material belongs to.\n * @param mesh the mesh being rendered\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n prepareDefines(e, t, i) {\n }\n /**\n * Checks to see if a texture is used in the material.\n * @param texture - Base texture to use.\n * @returns - Boolean specifying if a texture is used in the material.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n hasTexture(e) {\n return !1;\n }\n /**\n * Gets a boolean indicating that current material needs to register RTT\n * @returns true if this uses a render target otherwise false.\n */\n hasRenderTargetTextures() {\n return !1;\n }\n /**\n * Fills the list of render target textures.\n * @param renderTargets the list of render targets to update\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n fillRenderTargetTextures(e) {\n }\n /**\n * Returns an array of the actively used textures.\n * @param activeTextures Array of BaseTextures\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getActiveTextures(e) {\n }\n /**\n * Returns the animatable textures.\n * @param animatables Array of animatable textures.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getAnimatables(e) {\n }\n /**\n * Add fallbacks to the effect fallbacks list.\n * @param defines defines the Base texture to use.\n * @param fallbacks defines the current fallback list.\n * @param currentRank defines the current fallback rank.\n * @returns the new fallback rank.\n */\n addFallbacks(e, t, i) {\n return i;\n }\n /**\n * Gets the samplers used by the plugin.\n * @param samplers list that the sampler names should be added to.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getSamplers(e) {\n }\n /**\n * Gets the attributes used by the plugin.\n * @param attributes list that the attribute names should be added to.\n * @param scene the scene that the material belongs to.\n * @param mesh the mesh being rendered.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getAttributes(e, t, i) {\n }\n /**\n * Gets the uniform buffers names added by the plugin.\n * @param ubos list that the ubo names should be added to.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getUniformBuffersNames(e) {\n }\n /**\n * Gets the description of the uniforms to add to the ubo (if engine supports ubos) or to inject directly in the vertex/fragment shaders (if engine does not support ubos)\n * @returns the description of the uniforms\n */\n getUniforms() {\n return {};\n }\n /**\n * Makes a duplicate of the current configuration into another one.\n * @param plugin define the config where to copy the info\n */\n copyTo(e) {\n Le.Clone(() => e, this);\n }\n /**\n * Serializes this plugin configuration.\n * @returns - An object with the serialized config.\n */\n serialize() {\n return Le.Serialize(this);\n }\n /**\n * Parses a plugin configuration from a serialized object.\n * @param source - Serialized object.\n * @param scene Defines the scene we are parsing for\n * @param rootUrl Defines the rootUrl to load from\n */\n parse(e, t, i) {\n Le.Parse(() => this, e, t, i);\n }\n}\nP([\n w()\n], Ur.prototype, \"name\", void 0);\nP([\n w()\n], Ur.prototype, \"priority\", void 0);\nP([\n w()\n], Ur.prototype, \"resolveIncludes\", void 0);\nP([\n w()\n], Ur.prototype, \"registerForExtraEvents\", void 0);\nclass W1 extends es {\n constructor() {\n super(...arguments), this.DETAIL = !1, this.DETAILDIRECTUV = 0, this.DETAIL_NORMALBLENDMETHOD = 0;\n }\n}\nclass un extends Ur {\n /** @internal */\n _markAllSubMeshesAsTexturesDirty() {\n this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty();\n }\n constructor(e, t = !0) {\n super(e, \"DetailMap\", 140, new W1(), t), this._texture = null, this.diffuseBlendLevel = 1, this.roughnessBlendLevel = 1, this.bumpLevel = 1, this._normalBlendMethod = ie.MATERIAL_NORMALBLENDMETHOD_WHITEOUT, this._isEnabled = !1, this.isEnabled = !1, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1];\n }\n isReadyForSubMesh(e, t, i) {\n return this._isEnabled ? !(e._areTexturesDirty && t.texturesEnabled && i.getCaps().standardDerivatives && this._texture && ae.DetailTextureEnabled && !this._texture.isReady()) : !0;\n }\n prepareDefines(e, t) {\n if (this._isEnabled) {\n e.DETAIL_NORMALBLENDMETHOD = this._normalBlendMethod;\n const i = t.getEngine();\n e._areTexturesDirty && (i.getCaps().standardDerivatives && this._texture && ae.DetailTextureEnabled && this._isEnabled ? (wt(this._texture, e, \"DETAIL\"), e.DETAIL_NORMALBLENDMETHOD = this._normalBlendMethod) : e.DETAIL = !1);\n } else\n e.DETAIL = !1;\n }\n bindForSubMesh(e, t) {\n if (!this._isEnabled)\n return;\n const i = this._material.isFrozen;\n (!e.useUbo || !i || !e.isSync) && this._texture && ae.DetailTextureEnabled && (e.updateFloat4(\"vDetailInfos\", this._texture.coordinatesIndex, this.diffuseBlendLevel, this.bumpLevel, this.roughnessBlendLevel), Mt(this._texture, e, \"detail\")), t.texturesEnabled && this._texture && ae.DetailTextureEnabled && e.setTexture(\"detailSampler\", this._texture);\n }\n hasTexture(e) {\n return this._texture === e;\n }\n getActiveTextures(e) {\n this._texture && e.push(this._texture);\n }\n getAnimatables(e) {\n this._texture && this._texture.animations && this._texture.animations.length > 0 && e.push(this._texture);\n }\n dispose(e) {\n var t;\n e && ((t = this._texture) == null || t.dispose());\n }\n getClassName() {\n return \"DetailMapConfiguration\";\n }\n getSamplers(e) {\n e.push(\"detailSampler\");\n }\n getUniforms() {\n return {\n ubo: [\n { name: \"vDetailInfos\", size: 4, type: \"vec4\" },\n { name: \"detailMatrix\", size: 16, type: \"mat4\" }\n ]\n };\n }\n}\nP([\n Tt(\"detailTexture\"),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], un.prototype, \"texture\", void 0);\nP([\n w()\n], un.prototype, \"diffuseBlendLevel\", void 0);\nP([\n w()\n], un.prototype, \"roughnessBlendLevel\", void 0);\nP([\n w()\n], un.prototype, \"bumpLevel\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], un.prototype, \"normalBlendMethod\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], un.prototype, \"isEnabled\", void 0);\nconst Xh = { effect: null, subMesh: null };\nclass G1 extends es {\n /**\n * Initializes the Standard Material defines.\n * @param externalProperties The external properties\n */\n constructor(e) {\n super(e), this.MAINUV1 = !1, this.MAINUV2 = !1, this.MAINUV3 = !1, this.MAINUV4 = !1, this.MAINUV5 = !1, this.MAINUV6 = !1, this.DIFFUSE = !1, this.DIFFUSEDIRECTUV = 0, this.BAKED_VERTEX_ANIMATION_TEXTURE = !1, this.AMBIENT = !1, this.AMBIENTDIRECTUV = 0, this.OPACITY = !1, this.OPACITYDIRECTUV = 0, this.OPACITYRGB = !1, this.REFLECTION = !1, this.EMISSIVE = !1, this.EMISSIVEDIRECTUV = 0, this.SPECULAR = !1, this.SPECULARDIRECTUV = 0, this.BUMP = !1, this.BUMPDIRECTUV = 0, this.PARALLAX = !1, this.PARALLAX_RHS = !1, this.PARALLAXOCCLUSION = !1, this.SPECULAROVERALPHA = !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.ALPHAFROMDIFFUSE = !1, this.POINTSIZE = !1, this.FOG = !1, this.SPECULARTERM = !1, this.DIFFUSEFRESNEL = !1, this.OPACITYFRESNEL = !1, this.REFLECTIONFRESNEL = !1, this.REFRACTIONFRESNEL = !1, this.EMISSIVEFRESNEL = !1, this.FRESNEL = !1, this.NORMAL = !1, this.TANGENT = !1, this.UV1 = !1, this.UV2 = !1, this.UV3 = !1, this.UV4 = !1, this.UV5 = !1, this.UV6 = !1, this.VERTEXCOLOR = !1, this.VERTEXALPHA = !1, this.NUM_BONE_INFLUENCERS = 0, this.BonesPerMesh = 0, this.BONETEXTURE = !1, this.BONES_VELOCITY_ENABLED = !1, this.INSTANCES = !1, this.THIN_INSTANCES = !1, this.INSTANCESCOLOR = !1, this.GLOSSINESS = !1, this.ROUGHNESS = !1, this.EMISSIVEASILLUMINATION = !1, this.LINKEMISSIVEWITHDIFFUSE = !1, this.REFLECTIONFRESNELFROMSPECULAR = !1, this.LIGHTMAP = !1, this.LIGHTMAPDIRECTUV = 0, this.OBJECTSPACE_NORMALMAP = !1, this.USELIGHTMAPASSHADOWMAP = !1, this.REFLECTIONMAP_3D = !1, this.REFLECTIONMAP_SPHERICAL = !1, this.REFLECTIONMAP_PLANAR = !1, this.REFLECTIONMAP_CUBIC = !1, this.USE_LOCAL_REFLECTIONMAP_CUBIC = !1, this.USE_LOCAL_REFRACTIONMAP_CUBIC = !1, this.REFLECTIONMAP_PROJECTION = !1, this.REFLECTIONMAP_SKYBOX = !1, this.REFLECTIONMAP_EXPLICIT = !1, this.REFLECTIONMAP_EQUIRECTANGULAR = !1, this.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !1, this.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !1, this.REFLECTIONMAP_OPPOSITEZ = !1, this.INVERTCUBICMAP = !1, this.LOGARITHMICDEPTH = !1, this.REFRACTION = !1, this.REFRACTIONMAP_3D = !1, this.REFLECTIONOVERALPHA = !1, this.TWOSIDEDLIGHTING = !1, this.SHADOWFLOAT = !1, this.MORPHTARGETS = !1, this.MORPHTARGETS_NORMAL = !1, this.MORPHTARGETS_TANGENT = !1, this.MORPHTARGETS_UV = !1, this.NUM_MORPH_INFLUENCERS = 0, this.MORPHTARGETS_TEXTURE = !1, this.NONUNIFORMSCALING = !1, this.PREMULTIPLYALPHA = !1, this.ALPHATEST_AFTERALLALPHACOMPUTATIONS = !1, this.ALPHABLEND = !0, this.PREPASS = !1, this.PREPASS_IRRADIANCE = !1, this.PREPASS_IRRADIANCE_INDEX = -1, this.PREPASS_ALBEDO_SQRT = !1, this.PREPASS_ALBEDO_SQRT_INDEX = -1, this.PREPASS_DEPTH = !1, this.PREPASS_DEPTH_INDEX = -1, this.PREPASS_NORMAL = !1, this.PREPASS_NORMAL_INDEX = -1, this.PREPASS_NORMAL_WORLDSPACE = !1, this.PREPASS_POSITION = !1, this.PREPASS_POSITION_INDEX = -1, this.PREPASS_VELOCITY = !1, this.PREPASS_VELOCITY_INDEX = -1, this.PREPASS_REFLECTIVITY = !1, this.PREPASS_REFLECTIVITY_INDEX = -1, this.SCENE_MRT_COUNT = 0, this.RGBDLIGHTMAP = !1, this.RGBDREFLECTION = !1, this.RGBDREFRACTION = !1, this.IMAGEPROCESSING = !1, this.VIGNETTE = !1, this.VIGNETTEBLENDMODEMULTIPLY = !1, this.VIGNETTEBLENDMODEOPAQUE = !1, this.TONEMAPPING = !1, this.TONEMAPPING_ACES = !1, this.CONTRAST = !1, this.COLORCURVES = !1, this.COLORGRADING = !1, this.COLORGRADING3D = !1, this.SAMPLER3DGREENDEPTH = !1, this.SAMPLER3DBGRMAP = !1, this.DITHER = !1, this.IMAGEPROCESSINGPOSTPROCESS = !1, this.SKIPFINALCOLORCLAMP = !1, this.MULTIVIEW = !1, this.ORDER_INDEPENDENT_TRANSPARENCY = !1, this.ORDER_INDEPENDENT_TRANSPARENCY_16BITS = !1, this.CAMERA_ORTHOGRAPHIC = !1, this.CAMERA_PERSPECTIVE = !1, this.IS_REFLECTION_LINEAR = !1, this.IS_REFRACTION_LINEAR = !1, this.EXPOSURE = !1, this.DECAL_AFTER_DETAIL = !1, this.rebuild();\n }\n setReflectionMode(e) {\n const t = [\n \"REFLECTIONMAP_CUBIC\",\n \"REFLECTIONMAP_EXPLICIT\",\n \"REFLECTIONMAP_PLANAR\",\n \"REFLECTIONMAP_PROJECTION\",\n \"REFLECTIONMAP_PROJECTION\",\n \"REFLECTIONMAP_SKYBOX\",\n \"REFLECTIONMAP_SPHERICAL\",\n \"REFLECTIONMAP_EQUIRECTANGULAR\",\n \"REFLECTIONMAP_EQUIRECTANGULAR_FIXED\",\n \"REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED\"\n ];\n for (const i of t)\n this[i] = i === e;\n }\n}\nclass Ee extends Uc {\n /**\n * Gets the image processing configuration used either in this material.\n */\n get imageProcessingConfiguration() {\n return this._imageProcessingConfiguration;\n }\n /**\n * Sets the Default image processing configuration used either in the this material.\n *\n * If sets to null, the scene one is in use.\n */\n set imageProcessingConfiguration(e) {\n this._attachImageProcessingConfiguration(e), this._markAllSubMeshesAsTexturesDirty();\n }\n /**\n * Attaches a new image processing configuration to the Standard Material.\n * @param configuration\n */\n _attachImageProcessingConfiguration(e) {\n e !== this._imageProcessingConfiguration && (this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), e ? this._imageProcessingConfiguration = e : this._imageProcessingConfiguration = this.getScene().imageProcessingConfiguration, this._imageProcessingConfiguration && (this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add(() => {\n this._markAllSubMeshesAsImageProcessingDirty();\n })));\n }\n /**\n * Can this material render to prepass\n */\n get isPrePassCapable() {\n return !this.disableDepthWrite;\n }\n /**\n * Gets whether the color curves effect is enabled.\n */\n get cameraColorCurvesEnabled() {\n return this.imageProcessingConfiguration.colorCurvesEnabled;\n }\n /**\n * Sets whether the color curves effect is enabled.\n */\n set cameraColorCurvesEnabled(e) {\n this.imageProcessingConfiguration.colorCurvesEnabled = e;\n }\n /**\n * Gets whether the color grading effect is enabled.\n */\n get cameraColorGradingEnabled() {\n return this.imageProcessingConfiguration.colorGradingEnabled;\n }\n /**\n * Gets whether the color grading effect is enabled.\n */\n set cameraColorGradingEnabled(e) {\n this.imageProcessingConfiguration.colorGradingEnabled = e;\n }\n /**\n * Gets whether tonemapping is enabled or not.\n */\n get cameraToneMappingEnabled() {\n return this._imageProcessingConfiguration.toneMappingEnabled;\n }\n /**\n * Sets whether tonemapping is enabled or not\n */\n set cameraToneMappingEnabled(e) {\n this._imageProcessingConfiguration.toneMappingEnabled = e;\n }\n /**\n * The camera exposure used on this material.\n * This property is here and not in the camera to allow controlling exposure without full screen post process.\n * This corresponds to a photographic exposure.\n */\n get cameraExposure() {\n return this._imageProcessingConfiguration.exposure;\n }\n /**\n * The camera exposure used on this material.\n * This property is here and not in the camera to allow controlling exposure without full screen post process.\n * This corresponds to a photographic exposure.\n */\n set cameraExposure(e) {\n this._imageProcessingConfiguration.exposure = e;\n }\n /**\n * Gets The camera contrast used on this material.\n */\n get cameraContrast() {\n return this._imageProcessingConfiguration.contrast;\n }\n /**\n * Sets The camera contrast used on this material.\n */\n set cameraContrast(e) {\n this._imageProcessingConfiguration.contrast = e;\n }\n /**\n * Gets the Color Grading 2D Lookup Texture.\n */\n get cameraColorGradingTexture() {\n return this._imageProcessingConfiguration.colorGradingTexture;\n }\n /**\n * Sets the Color Grading 2D Lookup Texture.\n */\n set cameraColorGradingTexture(e) {\n this._imageProcessingConfiguration.colorGradingTexture = e;\n }\n /**\n * The color grading curves provide additional color adjustmnent that is applied after any color grading transform (3D LUT).\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\n */\n get cameraColorCurves() {\n return this._imageProcessingConfiguration.colorCurves;\n }\n /**\n * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT).\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\n */\n set cameraColorCurves(e) {\n this._imageProcessingConfiguration.colorCurves = e;\n }\n /**\n * Can this material render to several textures at once\n */\n get canRenderToMRT() {\n return !0;\n }\n /**\n * Instantiates a new standard material.\n * This is the default material used in Babylon. It is the best trade off between quality\n * and performances.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction\n * @param name Define the name of the material in the scene\n * @param scene Define the scene the material belong to\n */\n constructor(e, t) {\n super(e, t), this._diffuseTexture = null, this._ambientTexture = null, this._opacityTexture = null, this._reflectionTexture = null, this._emissiveTexture = null, this._specularTexture = null, this._bumpTexture = null, this._lightmapTexture = null, this._refractionTexture = null, this.ambientColor = new Ne(0, 0, 0), this.diffuseColor = new Ne(1, 1, 1), this.specularColor = new Ne(1, 1, 1), this.emissiveColor = new Ne(0, 0, 0), this.specularPower = 64, this._useAlphaFromDiffuseTexture = !1, this._useEmissiveAsIllumination = !1, this._linkEmissiveWithDiffuse = !1, this._useSpecularOverAlpha = !1, this._useReflectionOverAlpha = !1, this._disableLighting = !1, this._useObjectSpaceNormalMap = !1, this._useParallax = !1, this._useParallaxOcclusion = !1, this.parallaxScaleBias = 0.05, this._roughness = 0, this.indexOfRefraction = 0.98, this.invertRefractionY = !0, this.alphaCutOff = 0.4, this._useLightmapAsShadowmap = !1, this._useReflectionFresnelFromSpecular = !1, this._useGlossinessFromSpecularMapAlpha = !1, this._maxSimultaneousLights = 4, this._invertNormalMapX = !1, this._invertNormalMapY = !1, this._twoSidedLighting = !1, this._applyDecalMapAfterDetailMap = !1, this._renderTargets = new Li(16), this._worldViewProjectionMatrix = L.Zero(), this._globalAmbientColor = new Ne(0, 0, 0), this._cacheHasRenderTargetTextures = !1, this.detailMap = new un(this), this._attachImageProcessingConfiguration(null), this.prePassConfiguration = new oc(), this.getRenderTargetTextures = () => (this._renderTargets.reset(), Ee.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget && this._renderTargets.push(this._reflectionTexture), Ee.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget && this._renderTargets.push(this._refractionTexture), this._eventInfo.renderTargets = this._renderTargets, this._callbackPluginEventFillRenderTargetTextures(this._eventInfo), this._renderTargets);\n }\n /**\n * Gets a boolean indicating that current material needs to register RTT\n */\n get hasRenderTargetTextures() {\n return Ee.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget || Ee.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget ? !0 : this._cacheHasRenderTargetTextures;\n }\n /**\n * Gets the current class name of the material e.g. \"StandardMaterial\"\n * Mainly use in serialization.\n * @returns the class name\n */\n getClassName() {\n return \"StandardMaterial\";\n }\n /**\n * Specifies if the material will require alpha blending\n * @returns a boolean specifying if alpha blending is needed\n */\n needAlphaBlending() {\n return this._disableAlphaBlending ? !1 : this.alpha < 1 || this._opacityTexture != null || this._shouldUseAlphaFromDiffuseTexture() || this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled;\n }\n /**\n * Specifies if this material should be rendered in alpha test mode\n * @returns a boolean specifying if an alpha test is needed.\n */\n needAlphaTesting() {\n return this._forceAlphaTest ? !0 : this._hasAlphaChannel() && (this._transparencyMode == null || this._transparencyMode === ie.MATERIAL_ALPHATEST);\n }\n /**\n * @returns whether or not the alpha value of the diffuse texture should be used for alpha blending.\n */\n _shouldUseAlphaFromDiffuseTexture() {\n return this._diffuseTexture != null && this._diffuseTexture.hasAlpha && this._useAlphaFromDiffuseTexture && this._transparencyMode !== ie.MATERIAL_OPAQUE;\n }\n /**\n * @returns whether or not there is a usable alpha channel for transparency.\n */\n _hasAlphaChannel() {\n return this._diffuseTexture != null && this._diffuseTexture.hasAlpha || this._opacityTexture != null;\n }\n /**\n * Get the texture used for alpha test purpose.\n * @returns the diffuse texture in case of the standard material.\n */\n getAlphaTestTexture() {\n return this._diffuseTexture;\n }\n /**\n * Get if the submesh is ready to be used and all its information available.\n * Child classes can use it to update shaders\n * @param mesh defines the mesh to check\n * @param subMesh defines which submesh to check\n * @param useInstances specifies that instances should be used\n * @returns a boolean indicating that the submesh is ready or not\n */\n isReadyForSubMesh(e, t, i = !1) {\n this._uniformBufferLayoutBuilt || this.buildUniformLayout();\n const r = t._drawWrapper;\n if (r.effect && this.isFrozen && r._wasPreviouslyReady && r._wasPreviouslyUsingInstances === i)\n return !0;\n t.materialDefines || (this._callbackPluginEventGeneric(Ri.GetDefineNames, this._eventInfo), t.materialDefines = new G1(this._eventInfo.defineNames));\n const s = this.getScene(), a = t.materialDefines;\n if (this._isReadyForSubMesh(t))\n return !0;\n const o = s.getEngine();\n a._needNormals = r0(s, e, a, !0, this._maxSimultaneousLights, this._disableLighting), s0(s, a);\n const l = this.needAlphaBlendingForMesh(e) && this.getScene().useOrderIndependentTransparency;\n if (a0(s, a, this.canRenderToMRT && !l), n0(s, a, l), a._areTexturesDirty) {\n this._eventInfo.hasRenderTargetTextures = !1, this._callbackPluginEventHasRenderTargetTextures(this._eventInfo), this._cacheHasRenderTargetTextures = this._eventInfo.hasRenderTargetTextures, a._needUVs = !1;\n for (let h = 1; h <= 6; ++h)\n a[\"MAINUV\" + h] = !1;\n if (s.texturesEnabled) {\n if (a.DIFFUSEDIRECTUV = 0, a.BUMPDIRECTUV = 0, a.AMBIENTDIRECTUV = 0, a.OPACITYDIRECTUV = 0, a.EMISSIVEDIRECTUV = 0, a.SPECULARDIRECTUV = 0, a.LIGHTMAPDIRECTUV = 0, this._diffuseTexture && Ee.DiffuseTextureEnabled)\n if (this._diffuseTexture.isReadyOrNotBlocking())\n wt(this._diffuseTexture, a, \"DIFFUSE\");\n else\n return !1;\n else\n a.DIFFUSE = !1;\n if (this._ambientTexture && Ee.AmbientTextureEnabled)\n if (this._ambientTexture.isReadyOrNotBlocking())\n wt(this._ambientTexture, a, \"AMBIENT\");\n else\n return !1;\n else\n a.AMBIENT = !1;\n if (this._opacityTexture && Ee.OpacityTextureEnabled)\n if (this._opacityTexture.isReadyOrNotBlocking())\n wt(this._opacityTexture, a, \"OPACITY\"), a.OPACITYRGB = this._opacityTexture.getAlphaFromRGB;\n else\n return !1;\n else\n a.OPACITY = !1;\n if (this._reflectionTexture && Ee.ReflectionTextureEnabled)\n if (this._reflectionTexture.isReadyOrNotBlocking()) {\n switch (a._needNormals = !0, a.REFLECTION = !0, a.ROUGHNESS = this._roughness > 0, a.REFLECTIONOVERALPHA = this._useReflectionOverAlpha, a.INVERTCUBICMAP = this._reflectionTexture.coordinatesMode === le.INVCUBIC_MODE, a.REFLECTIONMAP_3D = this._reflectionTexture.isCube, a.REFLECTIONMAP_OPPOSITEZ = a.REFLECTIONMAP_3D && this.getScene().useRightHandedSystem ? !this._reflectionTexture.invertZ : this._reflectionTexture.invertZ, a.RGBDREFLECTION = this._reflectionTexture.isRGBD, this._reflectionTexture.coordinatesMode) {\n case le.EXPLICIT_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_EXPLICIT\");\n break;\n case le.PLANAR_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_PLANAR\");\n break;\n case le.PROJECTION_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_PROJECTION\");\n break;\n case le.SKYBOX_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_SKYBOX\");\n break;\n case le.SPHERICAL_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_SPHERICAL\");\n break;\n case le.EQUIRECTANGULAR_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_EQUIRECTANGULAR\");\n break;\n case le.FIXED_EQUIRECTANGULAR_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_EQUIRECTANGULAR_FIXED\");\n break;\n case le.FIXED_EQUIRECTANGULAR_MIRRORED_MODE:\n a.setReflectionMode(\"REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED\");\n break;\n case le.CUBIC_MODE:\n case le.INVCUBIC_MODE:\n default:\n a.setReflectionMode(\"REFLECTIONMAP_CUBIC\");\n break;\n }\n a.USE_LOCAL_REFLECTIONMAP_CUBIC = !!this._reflectionTexture.boundingBoxSize;\n } else\n return !1;\n else\n a.REFLECTION = !1, a.REFLECTIONMAP_OPPOSITEZ = !1;\n if (this._emissiveTexture && Ee.EmissiveTextureEnabled)\n if (this._emissiveTexture.isReadyOrNotBlocking())\n wt(this._emissiveTexture, a, \"EMISSIVE\");\n else\n return !1;\n else\n a.EMISSIVE = !1;\n if (this._lightmapTexture && Ee.LightmapTextureEnabled)\n if (this._lightmapTexture.isReadyOrNotBlocking())\n wt(this._lightmapTexture, a, \"LIGHTMAP\"), a.USELIGHTMAPASSHADOWMAP = this._useLightmapAsShadowmap, a.RGBDLIGHTMAP = this._lightmapTexture.isRGBD;\n else\n return !1;\n else\n a.LIGHTMAP = !1;\n if (this._specularTexture && Ee.SpecularTextureEnabled)\n if (this._specularTexture.isReadyOrNotBlocking())\n wt(this._specularTexture, a, \"SPECULAR\"), a.GLOSSINESS = this._useGlossinessFromSpecularMapAlpha;\n else\n return !1;\n else\n a.SPECULAR = !1;\n if (s.getEngine().getCaps().standardDerivatives && this._bumpTexture && Ee.BumpTextureEnabled) {\n if (this._bumpTexture.isReady())\n wt(this._bumpTexture, a, \"BUMP\"), a.PARALLAX = this._useParallax, a.PARALLAX_RHS = s.useRightHandedSystem, a.PARALLAXOCCLUSION = this._useParallaxOcclusion;\n else\n return !1;\n a.OBJECTSPACE_NORMALMAP = this._useObjectSpaceNormalMap;\n } else\n a.BUMP = !1, a.PARALLAX = !1, a.PARALLAX_RHS = !1, a.PARALLAXOCCLUSION = !1;\n if (this._refractionTexture && Ee.RefractionTextureEnabled)\n if (this._refractionTexture.isReadyOrNotBlocking())\n a._needUVs = !0, a.REFRACTION = !0, a.REFRACTIONMAP_3D = this._refractionTexture.isCube, a.RGBDREFRACTION = this._refractionTexture.isRGBD, a.USE_LOCAL_REFRACTIONMAP_CUBIC = !!this._refractionTexture.boundingBoxSize;\n else\n return !1;\n else\n a.REFRACTION = !1;\n a.TWOSIDEDLIGHTING = !this._backFaceCulling && this._twoSidedLighting;\n } else\n a.DIFFUSE = !1, a.AMBIENT = !1, a.OPACITY = !1, a.REFLECTION = !1, a.EMISSIVE = !1, a.LIGHTMAP = !1, a.BUMP = !1, a.REFRACTION = !1;\n a.ALPHAFROMDIFFUSE = this._shouldUseAlphaFromDiffuseTexture(), a.EMISSIVEASILLUMINATION = this._useEmissiveAsIllumination, a.LINKEMISSIVEWITHDIFFUSE = this._linkEmissiveWithDiffuse, a.SPECULAROVERALPHA = this._useSpecularOverAlpha, a.PREMULTIPLYALPHA = this.alphaMode === 7 || this.alphaMode === 8, a.ALPHATEST_AFTERALLALPHACOMPUTATIONS = this.transparencyMode !== null, a.ALPHABLEND = this.transparencyMode === null || this.needAlphaBlendingForMesh(e);\n }\n if (this._eventInfo.isReadyForSubMesh = !0, this._eventInfo.defines = a, this._eventInfo.subMesh = t, this._callbackPluginEventIsReadyForSubMesh(this._eventInfo), !this._eventInfo.isReadyForSubMesh)\n return !1;\n if (a._areImageProcessingDirty && this._imageProcessingConfiguration) {\n if (!this._imageProcessingConfiguration.isReady())\n return !1;\n this._imageProcessingConfiguration.prepareDefines(a), a.IS_REFLECTION_LINEAR = this.reflectionTexture != null && !this.reflectionTexture.gammaSpace, a.IS_REFRACTION_LINEAR = this.refractionTexture != null && !this.refractionTexture.gammaSpace;\n }\n a._areFresnelDirty && (Ee.FresnelEnabled ? (this._diffuseFresnelParameters || this._opacityFresnelParameters || this._emissiveFresnelParameters || this._refractionFresnelParameters || this._reflectionFresnelParameters) && (a.DIFFUSEFRESNEL = this._diffuseFresnelParameters && this._diffuseFresnelParameters.isEnabled, a.OPACITYFRESNEL = this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled, a.REFLECTIONFRESNEL = this._reflectionFresnelParameters && this._reflectionFresnelParameters.isEnabled, a.REFLECTIONFRESNELFROMSPECULAR = this._useReflectionFresnelFromSpecular, a.REFRACTIONFRESNEL = this._refractionFresnelParameters && this._refractionFresnelParameters.isEnabled, a.EMISSIVEFRESNEL = this._emissiveFresnelParameters && this._emissiveFresnelParameters.isEnabled, a._needNormals = !0, a.FRESNEL = !0) : a.FRESNEL = !1), hf(e, s, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, this._shouldTurnAlphaTestOn(e) || this._forceAlphaTest, a, this._applyDecalMapAfterDetailMap), uf(s, o, this, a, i, null, t.getRenderingMesh().hasThinInstances), this._eventInfo.defines = a, this._eventInfo.mesh = e, this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo), ff(e, a, !0, !0, !0), this._callbackPluginEventPrepareDefines(this._eventInfo);\n let c = !1;\n if (a.isDirty) {\n const h = a._areLightsDisposed;\n a.markAsProcessed();\n const u = new gf();\n a.REFLECTION && u.addFallback(0, \"REFLECTION\"), a.SPECULAR && u.addFallback(0, \"SPECULAR\"), a.BUMP && u.addFallback(0, \"BUMP\"), a.PARALLAX && u.addFallback(1, \"PARALLAX\"), a.PARALLAX_RHS && u.addFallback(1, \"PARALLAX_RHS\"), a.PARALLAXOCCLUSION && u.addFallback(0, \"PARALLAXOCCLUSION\"), a.SPECULAROVERALPHA && u.addFallback(0, \"SPECULAROVERALPHA\"), a.FOG && u.addFallback(1, \"FOG\"), a.POINTSIZE && u.addFallback(0, \"POINTSIZE\"), a.LOGARITHMICDEPTH && u.addFallback(0, \"LOGARITHMICDEPTH\"), i0(a, u, this._maxSimultaneousLights), a.SPECULARTERM && u.addFallback(0, \"SPECULARTERM\"), a.DIFFUSEFRESNEL && u.addFallback(1, \"DIFFUSEFRESNEL\"), a.OPACITYFRESNEL && u.addFallback(2, \"OPACITYFRESNEL\"), a.REFLECTIONFRESNEL && u.addFallback(3, \"REFLECTIONFRESNEL\"), a.EMISSIVEFRESNEL && u.addFallback(4, \"EMISSIVEFRESNEL\"), a.FRESNEL && u.addFallback(4, \"FRESNEL\"), a.MULTIVIEW && u.addFallback(0, \"MULTIVIEW\");\n const f = [I.PositionKind];\n a.NORMAL && f.push(I.NormalKind), a.TANGENT && f.push(I.TangentKind);\n for (let x = 1; x <= 6; ++x)\n a[\"UV\" + x] && f.push(`uv${x === 1 ? \"\" : x}`);\n a.VERTEXCOLOR && f.push(I.ColorKind), t0(f, e, a, u), cf(f, a), Q_(f, e, a), of(f, e, a);\n let d = \"default\";\n const p = [\n \"world\",\n \"view\",\n \"viewProjection\",\n \"vEyePosition\",\n \"vLightsType\",\n \"vAmbientColor\",\n \"vDiffuseColor\",\n \"vSpecularColor\",\n \"vEmissiveColor\",\n \"visibility\",\n \"vFogInfos\",\n \"vFogColor\",\n \"pointSize\",\n \"vDiffuseInfos\",\n \"vAmbientInfos\",\n \"vOpacityInfos\",\n \"vReflectionInfos\",\n \"vEmissiveInfos\",\n \"vSpecularInfos\",\n \"vBumpInfos\",\n \"vLightmapInfos\",\n \"vRefractionInfos\",\n \"mBones\",\n \"diffuseMatrix\",\n \"ambientMatrix\",\n \"opacityMatrix\",\n \"reflectionMatrix\",\n \"emissiveMatrix\",\n \"specularMatrix\",\n \"bumpMatrix\",\n \"normalMatrix\",\n \"lightmapMatrix\",\n \"refractionMatrix\",\n \"diffuseLeftColor\",\n \"diffuseRightColor\",\n \"opacityParts\",\n \"reflectionLeftColor\",\n \"reflectionRightColor\",\n \"emissiveLeftColor\",\n \"emissiveRightColor\",\n \"refractionLeftColor\",\n \"refractionRightColor\",\n \"vReflectionPosition\",\n \"vReflectionSize\",\n \"vRefractionPosition\",\n \"vRefractionSize\",\n \"logarithmicDepthConstant\",\n \"vTangentSpaceParams\",\n \"alphaCutOff\",\n \"boneTextureWidth\",\n \"morphTargetTextureInfo\",\n \"morphTargetTextureIndices\"\n ], g = [\n \"diffuseSampler\",\n \"ambientSampler\",\n \"opacitySampler\",\n \"reflectionCubeSampler\",\n \"reflection2DSampler\",\n \"emissiveSampler\",\n \"specularSampler\",\n \"bumpSampler\",\n \"lightmapSampler\",\n \"refractionCubeSampler\",\n \"refraction2DSampler\",\n \"boneSampler\",\n \"morphTargets\",\n \"oitDepthSampler\",\n \"oitFrontColorSampler\"\n ], m = [\"Material\", \"Scene\", \"Mesh\"], v = { maxSimultaneousLights: this._maxSimultaneousLights, maxSimultaneousMorphTargets: a.NUM_MORPH_INFLUENCERS };\n this._eventInfo.fallbacks = u, this._eventInfo.fallbackRank = 0, this._eventInfo.defines = a, this._eventInfo.uniforms = p, this._eventInfo.attributes = f, this._eventInfo.samplers = g, this._eventInfo.uniformBuffersNames = m, this._eventInfo.customCode = void 0, this._eventInfo.mesh = e, this._eventInfo.indexParameters = v, this._callbackPluginEventGeneric(Ri.PrepareEffect, this._eventInfo), oc.AddUniforms(p), at && (at.PrepareUniforms(p, a), at.PrepareSamplers(g, a)), df({\n uniformsNames: p,\n uniformBuffersNames: m,\n samplers: g,\n defines: a,\n maxSimultaneousLights: this._maxSimultaneousLights\n }), Nc(p);\n const E = {};\n this.customShaderNameResolve && (d = this.customShaderNameResolve(d, p, m, g, a, f, E));\n const C = a.toString(), T = t.effect;\n let R = s.getEngine().createEffect(d, {\n attributes: f,\n uniformsNames: p,\n uniformBuffersNames: m,\n samplers: g,\n defines: C,\n fallbacks: u,\n onCompiled: this.onCompiled,\n onError: this.onError,\n indexParameters: v,\n processFinalCode: E.processFinalCode,\n processCodeAfterIncludes: this._eventInfo.customCode,\n multiTarget: a.PREPASS\n }, o);\n if (this._eventInfo.customCode = void 0, R)\n if (this._onEffectCreatedObservable && (Xh.effect = R, Xh.subMesh = t, this._onEffectCreatedObservable.notifyObservers(Xh)), this.allowShaderHotSwapping && T && !R.isReady()) {\n if (R = T, a.markAsUnprocessed(), c = this.isFrozen, h)\n return a._areLightsDisposed = !0, !1;\n } else\n s.resetCachedMaterial(), t.setEffect(R, a, this._materialContext);\n }\n return !t.effect || !t.effect.isReady() ? !1 : (a._renderId = s.getRenderId(), r._wasPreviouslyReady = !c, r._wasPreviouslyUsingInstances = i, this._checkScenePerformancePriority(), !0);\n }\n /**\n * Builds the material UBO layouts.\n * Used internally during the effect preparation.\n */\n buildUniformLayout() {\n const e = this._uniformBuffer;\n e.addUniform(\"diffuseLeftColor\", 4), e.addUniform(\"diffuseRightColor\", 4), e.addUniform(\"opacityParts\", 4), e.addUniform(\"reflectionLeftColor\", 4), e.addUniform(\"reflectionRightColor\", 4), e.addUniform(\"refractionLeftColor\", 4), e.addUniform(\"refractionRightColor\", 4), e.addUniform(\"emissiveLeftColor\", 4), e.addUniform(\"emissiveRightColor\", 4), e.addUniform(\"vDiffuseInfos\", 2), e.addUniform(\"vAmbientInfos\", 2), e.addUniform(\"vOpacityInfos\", 2), e.addUniform(\"vReflectionInfos\", 2), e.addUniform(\"vReflectionPosition\", 3), e.addUniform(\"vReflectionSize\", 3), e.addUniform(\"vEmissiveInfos\", 2), e.addUniform(\"vLightmapInfos\", 2), e.addUniform(\"vSpecularInfos\", 2), e.addUniform(\"vBumpInfos\", 3), e.addUniform(\"diffuseMatrix\", 16), e.addUniform(\"ambientMatrix\", 16), e.addUniform(\"opacityMatrix\", 16), e.addUniform(\"reflectionMatrix\", 16), e.addUniform(\"emissiveMatrix\", 16), e.addUniform(\"lightmapMatrix\", 16), e.addUniform(\"specularMatrix\", 16), e.addUniform(\"bumpMatrix\", 16), e.addUniform(\"vTangentSpaceParams\", 2), e.addUniform(\"pointSize\", 1), e.addUniform(\"alphaCutOff\", 1), e.addUniform(\"refractionMatrix\", 16), e.addUniform(\"vRefractionInfos\", 4), e.addUniform(\"vRefractionPosition\", 3), e.addUniform(\"vRefractionSize\", 3), e.addUniform(\"vSpecularColor\", 4), e.addUniform(\"vEmissiveColor\", 3), e.addUniform(\"vDiffuseColor\", 4), e.addUniform(\"vAmbientColor\", 3), super.buildUniformLayout();\n }\n /**\n * Binds the submesh to this material by preparing the effect and shader to draw\n * @param world defines the world transformation matrix\n * @param mesh defines the mesh containing the submesh\n * @param subMesh defines the submesh to bind the material to\n */\n bindForSubMesh(e, t, i) {\n var c;\n const r = this.getScene(), s = i.materialDefines;\n if (!s)\n return;\n const a = i.effect;\n if (!a)\n return;\n this._activeEffect = a, t.getMeshUniformBuffer().bindToEffect(a, \"Mesh\"), t.transferToEffect(e), this._uniformBuffer.bindToEffect(a, \"Material\"), this.prePassConfiguration.bindForSubMesh(this._activeEffect, r, t, e, this.isFrozen), this._eventInfo.subMesh = i, this._callbackPluginEventHardBindForSubMesh(this._eventInfo), s.OBJECTSPACE_NORMALMAP && (e.toNormalMatrix(this._normalMatrix), this.bindOnlyNormalMatrix(this._normalMatrix));\n const o = this._mustRebind(r, a, i, t.visibility);\n lf(t, a);\n const l = this._uniformBuffer;\n if (o) {\n if (this.bindViewProjection(a), !l.useUbo || !this.isFrozen || !l.isSync || i._drawWrapper._forceRebindOnNextCall) {\n if (Ee.FresnelEnabled && s.FRESNEL && (this.diffuseFresnelParameters && this.diffuseFresnelParameters.isEnabled && (l.updateColor4(\"diffuseLeftColor\", this.diffuseFresnelParameters.leftColor, this.diffuseFresnelParameters.power), l.updateColor4(\"diffuseRightColor\", this.diffuseFresnelParameters.rightColor, this.diffuseFresnelParameters.bias)), this.opacityFresnelParameters && this.opacityFresnelParameters.isEnabled && l.updateColor4(\"opacityParts\", new Ne(this.opacityFresnelParameters.leftColor.toLuminance(), this.opacityFresnelParameters.rightColor.toLuminance(), this.opacityFresnelParameters.bias), this.opacityFresnelParameters.power), this.reflectionFresnelParameters && this.reflectionFresnelParameters.isEnabled && (l.updateColor4(\"reflectionLeftColor\", this.reflectionFresnelParameters.leftColor, this.reflectionFresnelParameters.power), l.updateColor4(\"reflectionRightColor\", this.reflectionFresnelParameters.rightColor, this.reflectionFresnelParameters.bias)), this.refractionFresnelParameters && this.refractionFresnelParameters.isEnabled && (l.updateColor4(\"refractionLeftColor\", this.refractionFresnelParameters.leftColor, this.refractionFresnelParameters.power), l.updateColor4(\"refractionRightColor\", this.refractionFresnelParameters.rightColor, this.refractionFresnelParameters.bias)), this.emissiveFresnelParameters && this.emissiveFresnelParameters.isEnabled && (l.updateColor4(\"emissiveLeftColor\", this.emissiveFresnelParameters.leftColor, this.emissiveFresnelParameters.power), l.updateColor4(\"emissiveRightColor\", this.emissiveFresnelParameters.rightColor, this.emissiveFresnelParameters.bias))), r.texturesEnabled) {\n if (this._diffuseTexture && Ee.DiffuseTextureEnabled && (l.updateFloat2(\"vDiffuseInfos\", this._diffuseTexture.coordinatesIndex, this._diffuseTexture.level), Mt(this._diffuseTexture, l, \"diffuse\")), this._ambientTexture && Ee.AmbientTextureEnabled && (l.updateFloat2(\"vAmbientInfos\", this._ambientTexture.coordinatesIndex, this._ambientTexture.level), Mt(this._ambientTexture, l, \"ambient\")), this._opacityTexture && Ee.OpacityTextureEnabled && (l.updateFloat2(\"vOpacityInfos\", this._opacityTexture.coordinatesIndex, this._opacityTexture.level), Mt(this._opacityTexture, l, \"opacity\")), this._hasAlphaChannel() && l.updateFloat(\"alphaCutOff\", this.alphaCutOff), this._reflectionTexture && Ee.ReflectionTextureEnabled && (l.updateFloat2(\"vReflectionInfos\", this._reflectionTexture.level, this.roughness), l.updateMatrix(\"reflectionMatrix\", this._reflectionTexture.getReflectionTextureMatrix()), this._reflectionTexture.boundingBoxSize)) {\n const h = this._reflectionTexture;\n l.updateVector3(\"vReflectionPosition\", h.boundingBoxPosition), l.updateVector3(\"vReflectionSize\", h.boundingBoxSize);\n }\n if (this._emissiveTexture && Ee.EmissiveTextureEnabled && (l.updateFloat2(\"vEmissiveInfos\", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level), Mt(this._emissiveTexture, l, \"emissive\")), this._lightmapTexture && Ee.LightmapTextureEnabled && (l.updateFloat2(\"vLightmapInfos\", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level), Mt(this._lightmapTexture, l, \"lightmap\")), this._specularTexture && Ee.SpecularTextureEnabled && (l.updateFloat2(\"vSpecularInfos\", this._specularTexture.coordinatesIndex, this._specularTexture.level), Mt(this._specularTexture, l, \"specular\")), this._bumpTexture && r.getEngine().getCaps().standardDerivatives && Ee.BumpTextureEnabled && (l.updateFloat3(\"vBumpInfos\", this._bumpTexture.coordinatesIndex, 1 / this._bumpTexture.level, this.parallaxScaleBias), Mt(this._bumpTexture, l, \"bump\"), r._mirroredCameraPosition ? l.updateFloat2(\"vTangentSpaceParams\", this._invertNormalMapX ? 1 : -1, this._invertNormalMapY ? 1 : -1) : l.updateFloat2(\"vTangentSpaceParams\", this._invertNormalMapX ? -1 : 1, this._invertNormalMapY ? -1 : 1)), this._refractionTexture && Ee.RefractionTextureEnabled) {\n let h = 1;\n if (this._refractionTexture.isCube || (l.updateMatrix(\"refractionMatrix\", this._refractionTexture.getReflectionTextureMatrix()), this._refractionTexture.depth && (h = this._refractionTexture.depth)), l.updateFloat4(\"vRefractionInfos\", this._refractionTexture.level, this.indexOfRefraction, h, this.invertRefractionY ? -1 : 1), this._refractionTexture.boundingBoxSize) {\n const u = this._refractionTexture;\n l.updateVector3(\"vRefractionPosition\", u.boundingBoxPosition), l.updateVector3(\"vRefractionSize\", u.boundingBoxSize);\n }\n }\n }\n this.pointsCloud && l.updateFloat(\"pointSize\", this.pointSize), s.SPECULARTERM && l.updateColor4(\"vSpecularColor\", this.specularColor, this.specularPower), l.updateColor3(\"vEmissiveColor\", Ee.EmissiveTextureEnabled ? this.emissiveColor : Ne.BlackReadOnly), l.updateColor4(\"vDiffuseColor\", this.diffuseColor, this.alpha), r.ambientColor.multiplyToRef(this.ambientColor, this._globalAmbientColor), l.updateColor3(\"vAmbientColor\", this._globalAmbientColor);\n }\n r.texturesEnabled && (this._diffuseTexture && Ee.DiffuseTextureEnabled && a.setTexture(\"diffuseSampler\", this._diffuseTexture), this._ambientTexture && Ee.AmbientTextureEnabled && a.setTexture(\"ambientSampler\", this._ambientTexture), this._opacityTexture && Ee.OpacityTextureEnabled && a.setTexture(\"opacitySampler\", this._opacityTexture), this._reflectionTexture && Ee.ReflectionTextureEnabled && (this._reflectionTexture.isCube ? a.setTexture(\"reflectionCubeSampler\", this._reflectionTexture) : a.setTexture(\"reflection2DSampler\", this._reflectionTexture)), this._emissiveTexture && Ee.EmissiveTextureEnabled && a.setTexture(\"emissiveSampler\", this._emissiveTexture), this._lightmapTexture && Ee.LightmapTextureEnabled && a.setTexture(\"lightmapSampler\", this._lightmapTexture), this._specularTexture && Ee.SpecularTextureEnabled && a.setTexture(\"specularSampler\", this._specularTexture), this._bumpTexture && r.getEngine().getCaps().standardDerivatives && Ee.BumpTextureEnabled && a.setTexture(\"bumpSampler\", this._bumpTexture), this._refractionTexture && Ee.RefractionTextureEnabled && (this._refractionTexture.isCube ? a.setTexture(\"refractionCubeSampler\", this._refractionTexture) : a.setTexture(\"refraction2DSampler\", this._refractionTexture))), this.getScene().useOrderIndependentTransparency && this.needAlphaBlendingForMesh(t) && this.getScene().depthPeelingRenderer.bind(a), this._eventInfo.subMesh = i, this._callbackPluginEventBindForSubMesh(this._eventInfo), Fc(a, this, r), this.bindEyePosition(a);\n } else\n r.getEngine()._features.needToAlwaysBindUniformBuffers && (this._needToBindSceneUbo = !0);\n (o || !this.isFrozen) && (r.lightsEnabled && !this._disableLighting && e0(r, t, a, s, this._maxSimultaneousLights), (r.fogEnabled && t.applyFog && r.fogMode !== Ot.FOGMODE_NONE || this._reflectionTexture || this._refractionTexture || t.receiveShadows || s.PREPASS) && this.bindView(a), wc(r, t, a), s.NUM_MORPH_INFLUENCERS && af(t, a), s.BAKED_VERTEX_ANIMATION_TEXTURE && ((c = t.bakedVertexAnimationManager) == null || c.bind(a, s.INSTANCES)), this.useLogarithmicDepth && Lc(s, a, r), this._imageProcessingConfiguration && !this._imageProcessingConfiguration.applyByPostProcess && this._imageProcessingConfiguration.bind(this._activeEffect)), this._afterBind(t, this._activeEffect, i), l.update();\n }\n /**\n * Get the list of animatables in the material.\n * @returns the list of animatables object used in the material\n */\n getAnimatables() {\n const e = super.getAnimatables();\n return this._diffuseTexture && this._diffuseTexture.animations && this._diffuseTexture.animations.length > 0 && e.push(this._diffuseTexture), this._ambientTexture && this._ambientTexture.animations && this._ambientTexture.animations.length > 0 && e.push(this._ambientTexture), this._opacityTexture && this._opacityTexture.animations && this._opacityTexture.animations.length > 0 && e.push(this._opacityTexture), this._reflectionTexture && this._reflectionTexture.animations && this._reflectionTexture.animations.length > 0 && e.push(this._reflectionTexture), this._emissiveTexture && this._emissiveTexture.animations && this._emissiveTexture.animations.length > 0 && e.push(this._emissiveTexture), this._specularTexture && this._specularTexture.animations && this._specularTexture.animations.length > 0 && e.push(this._specularTexture), this._bumpTexture && this._bumpTexture.animations && this._bumpTexture.animations.length > 0 && e.push(this._bumpTexture), this._lightmapTexture && this._lightmapTexture.animations && this._lightmapTexture.animations.length > 0 && e.push(this._lightmapTexture), this._refractionTexture && this._refractionTexture.animations && this._refractionTexture.animations.length > 0 && e.push(this._refractionTexture), e;\n }\n /**\n * Gets the active textures from the material\n * @returns an array of textures\n */\n getActiveTextures() {\n const e = super.getActiveTextures();\n return this._diffuseTexture && e.push(this._diffuseTexture), this._ambientTexture && e.push(this._ambientTexture), this._opacityTexture && e.push(this._opacityTexture), this._reflectionTexture && e.push(this._reflectionTexture), this._emissiveTexture && e.push(this._emissiveTexture), this._specularTexture && e.push(this._specularTexture), this._bumpTexture && e.push(this._bumpTexture), this._lightmapTexture && e.push(this._lightmapTexture), this._refractionTexture && e.push(this._refractionTexture), e;\n }\n /**\n * Specifies if the material uses a texture\n * @param texture defines the texture to check against the material\n * @returns a boolean specifying if the material uses the texture\n */\n hasTexture(e) {\n return !!(super.hasTexture(e) || this._diffuseTexture === e || this._ambientTexture === e || this._opacityTexture === e || this._reflectionTexture === e || this._emissiveTexture === e || this._specularTexture === e || this._bumpTexture === e || this._lightmapTexture === e || this._refractionTexture === e);\n }\n /**\n * Disposes the material\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\n */\n dispose(e, t) {\n var i, r, s, a, o, l, c, h, u;\n t && ((i = this._diffuseTexture) == null || i.dispose(), (r = this._ambientTexture) == null || r.dispose(), (s = this._opacityTexture) == null || s.dispose(), (a = this._reflectionTexture) == null || a.dispose(), (o = this._emissiveTexture) == null || o.dispose(), (l = this._specularTexture) == null || l.dispose(), (c = this._bumpTexture) == null || c.dispose(), (h = this._lightmapTexture) == null || h.dispose(), (u = this._refractionTexture) == null || u.dispose()), this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), super.dispose(e, t);\n }\n /**\n * Makes a duplicate of the material, and gives it a new name\n * @param name defines the new name for the duplicated material\n * @param cloneTexturesOnlyOnce - if a texture is used in more than one channel (e.g diffuse and opacity), only clone it once and reuse it on the other channels. Default false.\n * @param rootUrl defines the root URL to use to load textures\n * @returns the cloned material\n */\n clone(e, t = !0, i = \"\") {\n const r = Le.Clone(() => new Ee(e, this.getScene()), this, { cloneTexturesOnlyOnce: t });\n return r.name = e, r.id = e, this.stencil.copyTo(r.stencil), this._clonePlugins(r, i), r;\n }\n /**\n * Creates a standard material from parsed material data\n * @param source defines the JSON representation of the material\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a new standard material\n */\n static Parse(e, t, i) {\n const r = Le.Parse(() => new Ee(e.name, t), e, t, i);\n return e.stencil && r.stencil.parse(e.stencil, t, i), ie._ParsePlugins(e, r, t, i), r;\n }\n // Flags used to enable or disable a type of texture for all Standard Materials\n /**\n * Are diffuse textures enabled in the application.\n */\n static get DiffuseTextureEnabled() {\n return ae.DiffuseTextureEnabled;\n }\n static set DiffuseTextureEnabled(e) {\n ae.DiffuseTextureEnabled = e;\n }\n /**\n * Are detail textures enabled in the application.\n */\n static get DetailTextureEnabled() {\n return ae.DetailTextureEnabled;\n }\n static set DetailTextureEnabled(e) {\n ae.DetailTextureEnabled = e;\n }\n /**\n * Are ambient textures enabled in the application.\n */\n static get AmbientTextureEnabled() {\n return ae.AmbientTextureEnabled;\n }\n static set AmbientTextureEnabled(e) {\n ae.AmbientTextureEnabled = e;\n }\n /**\n * Are opacity textures enabled in the application.\n */\n static get OpacityTextureEnabled() {\n return ae.OpacityTextureEnabled;\n }\n static set OpacityTextureEnabled(e) {\n ae.OpacityTextureEnabled = e;\n }\n /**\n * Are reflection textures enabled in the application.\n */\n static get ReflectionTextureEnabled() {\n return ae.ReflectionTextureEnabled;\n }\n static set ReflectionTextureEnabled(e) {\n ae.ReflectionTextureEnabled = e;\n }\n /**\n * Are emissive textures enabled in the application.\n */\n static get EmissiveTextureEnabled() {\n return ae.EmissiveTextureEnabled;\n }\n static set EmissiveTextureEnabled(e) {\n ae.EmissiveTextureEnabled = e;\n }\n /**\n * Are specular textures enabled in the application.\n */\n static get SpecularTextureEnabled() {\n return ae.SpecularTextureEnabled;\n }\n static set SpecularTextureEnabled(e) {\n ae.SpecularTextureEnabled = e;\n }\n /**\n * Are bump textures enabled in the application.\n */\n static get BumpTextureEnabled() {\n return ae.BumpTextureEnabled;\n }\n static set BumpTextureEnabled(e) {\n ae.BumpTextureEnabled = e;\n }\n /**\n * Are lightmap textures enabled in the application.\n */\n static get LightmapTextureEnabled() {\n return ae.LightmapTextureEnabled;\n }\n static set LightmapTextureEnabled(e) {\n ae.LightmapTextureEnabled = e;\n }\n /**\n * Are refraction textures enabled in the application.\n */\n static get RefractionTextureEnabled() {\n return ae.RefractionTextureEnabled;\n }\n static set RefractionTextureEnabled(e) {\n ae.RefractionTextureEnabled = e;\n }\n /**\n * Are color grading textures enabled in the application.\n */\n static get ColorGradingTextureEnabled() {\n return ae.ColorGradingTextureEnabled;\n }\n static set ColorGradingTextureEnabled(e) {\n ae.ColorGradingTextureEnabled = e;\n }\n /**\n * Are fresnels enabled in the application.\n */\n static get FresnelEnabled() {\n return ae.FresnelEnabled;\n }\n static set FresnelEnabled(e) {\n ae.FresnelEnabled = e;\n }\n}\nP([\n Tt(\"diffuseTexture\")\n], Ee.prototype, \"_diffuseTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], Ee.prototype, \"diffuseTexture\", void 0);\nP([\n Tt(\"ambientTexture\")\n], Ee.prototype, \"_ambientTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"ambientTexture\", void 0);\nP([\n Tt(\"opacityTexture\")\n], Ee.prototype, \"_opacityTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], Ee.prototype, \"opacityTexture\", void 0);\nP([\n Tt(\"reflectionTexture\")\n], Ee.prototype, \"_reflectionTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"reflectionTexture\", void 0);\nP([\n Tt(\"emissiveTexture\")\n], Ee.prototype, \"_emissiveTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"emissiveTexture\", void 0);\nP([\n Tt(\"specularTexture\")\n], Ee.prototype, \"_specularTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"specularTexture\", void 0);\nP([\n Tt(\"bumpTexture\")\n], Ee.prototype, \"_bumpTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"bumpTexture\", void 0);\nP([\n Tt(\"lightmapTexture\")\n], Ee.prototype, \"_lightmapTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"lightmapTexture\", void 0);\nP([\n Tt(\"refractionTexture\")\n], Ee.prototype, \"_refractionTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"refractionTexture\", void 0);\nP([\n $i(\"ambient\")\n], Ee.prototype, \"ambientColor\", void 0);\nP([\n $i(\"diffuse\")\n], Ee.prototype, \"diffuseColor\", void 0);\nP([\n $i(\"specular\")\n], Ee.prototype, \"specularColor\", void 0);\nP([\n $i(\"emissive\")\n], Ee.prototype, \"emissiveColor\", void 0);\nP([\n w()\n], Ee.prototype, \"specularPower\", void 0);\nP([\n w(\"useAlphaFromDiffuseTexture\")\n], Ee.prototype, \"_useAlphaFromDiffuseTexture\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], Ee.prototype, \"useAlphaFromDiffuseTexture\", void 0);\nP([\n w(\"useEmissiveAsIllumination\")\n], Ee.prototype, \"_useEmissiveAsIllumination\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useEmissiveAsIllumination\", void 0);\nP([\n w(\"linkEmissiveWithDiffuse\")\n], Ee.prototype, \"_linkEmissiveWithDiffuse\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"linkEmissiveWithDiffuse\", void 0);\nP([\n w(\"useSpecularOverAlpha\")\n], Ee.prototype, \"_useSpecularOverAlpha\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useSpecularOverAlpha\", void 0);\nP([\n w(\"useReflectionOverAlpha\")\n], Ee.prototype, \"_useReflectionOverAlpha\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useReflectionOverAlpha\", void 0);\nP([\n w(\"disableLighting\")\n], Ee.prototype, \"_disableLighting\", void 0);\nP([\n oe(\"_markAllSubMeshesAsLightsDirty\")\n], Ee.prototype, \"disableLighting\", void 0);\nP([\n w(\"useObjectSpaceNormalMap\")\n], Ee.prototype, \"_useObjectSpaceNormalMap\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useObjectSpaceNormalMap\", void 0);\nP([\n w(\"useParallax\")\n], Ee.prototype, \"_useParallax\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useParallax\", void 0);\nP([\n w(\"useParallaxOcclusion\")\n], Ee.prototype, \"_useParallaxOcclusion\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useParallaxOcclusion\", void 0);\nP([\n w()\n], Ee.prototype, \"parallaxScaleBias\", void 0);\nP([\n w(\"roughness\")\n], Ee.prototype, \"_roughness\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"roughness\", void 0);\nP([\n w()\n], Ee.prototype, \"indexOfRefraction\", void 0);\nP([\n w()\n], Ee.prototype, \"invertRefractionY\", void 0);\nP([\n w()\n], Ee.prototype, \"alphaCutOff\", void 0);\nP([\n w(\"useLightmapAsShadowmap\")\n], Ee.prototype, \"_useLightmapAsShadowmap\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useLightmapAsShadowmap\", void 0);\nP([\n Ho(\"diffuseFresnelParameters\")\n], Ee.prototype, \"_diffuseFresnelParameters\", void 0);\nP([\n oe(\"_markAllSubMeshesAsFresnelDirty\")\n], Ee.prototype, \"diffuseFresnelParameters\", void 0);\nP([\n Ho(\"opacityFresnelParameters\")\n], Ee.prototype, \"_opacityFresnelParameters\", void 0);\nP([\n oe(\"_markAllSubMeshesAsFresnelAndMiscDirty\")\n], Ee.prototype, \"opacityFresnelParameters\", void 0);\nP([\n Ho(\"reflectionFresnelParameters\")\n], Ee.prototype, \"_reflectionFresnelParameters\", void 0);\nP([\n oe(\"_markAllSubMeshesAsFresnelDirty\")\n], Ee.prototype, \"reflectionFresnelParameters\", void 0);\nP([\n Ho(\"refractionFresnelParameters\")\n], Ee.prototype, \"_refractionFresnelParameters\", void 0);\nP([\n oe(\"_markAllSubMeshesAsFresnelDirty\")\n], Ee.prototype, \"refractionFresnelParameters\", void 0);\nP([\n Ho(\"emissiveFresnelParameters\")\n], Ee.prototype, \"_emissiveFresnelParameters\", void 0);\nP([\n oe(\"_markAllSubMeshesAsFresnelDirty\")\n], Ee.prototype, \"emissiveFresnelParameters\", void 0);\nP([\n w(\"useReflectionFresnelFromSpecular\")\n], Ee.prototype, \"_useReflectionFresnelFromSpecular\", void 0);\nP([\n oe(\"_markAllSubMeshesAsFresnelDirty\")\n], Ee.prototype, \"useReflectionFresnelFromSpecular\", void 0);\nP([\n w(\"useGlossinessFromSpecularMapAlpha\")\n], Ee.prototype, \"_useGlossinessFromSpecularMapAlpha\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"useGlossinessFromSpecularMapAlpha\", void 0);\nP([\n w(\"maxSimultaneousLights\")\n], Ee.prototype, \"_maxSimultaneousLights\", void 0);\nP([\n oe(\"_markAllSubMeshesAsLightsDirty\")\n], Ee.prototype, \"maxSimultaneousLights\", void 0);\nP([\n w(\"invertNormalMapX\")\n], Ee.prototype, \"_invertNormalMapX\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"invertNormalMapX\", void 0);\nP([\n w(\"invertNormalMapY\")\n], Ee.prototype, \"_invertNormalMapY\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"invertNormalMapY\", void 0);\nP([\n w(\"twoSidedLighting\")\n], Ee.prototype, \"_twoSidedLighting\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Ee.prototype, \"twoSidedLighting\", void 0);\nP([\n w(\"applyDecalMapAfterDetailMap\")\n], Ee.prototype, \"_applyDecalMapAfterDetailMap\", void 0);\nP([\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Ee.prototype, \"applyDecalMapAfterDetailMap\", void 0);\nRe(\"BABYLON.StandardMaterial\", Ee);\nOt.DefaultMaterialFactory = (n) => new Ee(\"default material\", n);\nconst X1 = \"rgbdDecodePixelShader\", H1 = `varying vec2 vUV;uniform sampler2D textureSampler;\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) \n{gl_FragColor=vec4(fromRGBD(texture2D(textureSampler,vUV)),1.0);}`;\nY.ShadersStore[X1] = H1;\nconst K1 = \"passCubePixelShader\", q1 = `varying vec2 vUV;uniform samplerCube textureSampler;\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) \n{vec2 uv=vUV*2.0-1.0;\n#ifdef POSITIVEX\ngl_FragColor=textureCube(textureSampler,vec3(1.001,uv.y,uv.x));\n#endif\n#ifdef NEGATIVEX\ngl_FragColor=textureCube(textureSampler,vec3(-1.001,uv.y,uv.x));\n#endif\n#ifdef POSITIVEY\ngl_FragColor=textureCube(textureSampler,vec3(uv.y,1.001,uv.x));\n#endif\n#ifdef NEGATIVEY\ngl_FragColor=textureCube(textureSampler,vec3(uv.y,-1.001,uv.x));\n#endif\n#ifdef POSITIVEZ\ngl_FragColor=textureCube(textureSampler,vec3(uv,1.001));\n#endif\n#ifdef NEGATIVEZ\ngl_FragColor=textureCube(textureSampler,vec3(uv,-1.001));\n#endif\n}`;\nY.ShadersStore[K1] = q1;\nclass Yo extends Pt {\n /**\n * Gets a string identifying the name of the class\n * @returns \"PassPostProcess\" string\n */\n getClassName() {\n return \"PassPostProcess\";\n }\n /**\n * Creates the PassPostProcess\n * @param name The name of the effect.\n * @param options The required width/height ratio to downsize to before computing the render pass.\n * @param camera The camera to apply the render pass to.\n * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)\n * @param engine The engine which the post process will be applied. (default: current engine)\n * @param reusable If the post process can be reused on the same frame. (default: false)\n * @param textureType The type of texture to be used when performing the post processing.\n * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)\n */\n constructor(e, t, i = null, r, s, a, o = 0, l = !1) {\n super(e, \"pass\", null, null, t, i, r, s, a, void 0, o, void 0, null, l);\n }\n /**\n * @internal\n */\n static _Parse(e, t, i, r) {\n return Le.Parse(() => new Yo(e.name, e.options, t, e.renderTargetSamplingMode, e._engine, e.reusable), e, i, r);\n }\n}\nRe(\"BABYLON.PassPostProcess\", Yo);\nse._RescalePostProcessFactory = (n) => new Yo(\"rescale\", 1, null, 2, n, !1, 0);\nfunction Y1(n, e, t, i = !0) {\n const r = n.getScene(), s = r.getEngine(), a = new gr(\"resized\" + n.name, { width: e, height: t }, r, !n.noMipmap, !0, n._texture.type, !1, n.samplingMode, !1);\n a.wrapU = n.wrapU, a.wrapV = n.wrapV, a.uOffset = n.uOffset, a.vOffset = n.vOffset, a.uScale = n.uScale, a.vScale = n.vScale, a.uAng = n.uAng, a.vAng = n.vAng, a.wAng = n.wAng, a.coordinatesIndex = n.coordinatesIndex, a.level = n.level, a.anisotropicFilteringLevel = n.anisotropicFilteringLevel, a._texture.isReady = !1, n.wrapU = le.CLAMP_ADDRESSMODE, n.wrapV = le.CLAMP_ADDRESSMODE;\n const o = new Yo(\"pass\", 1, null, i ? le.BILINEAR_SAMPLINGMODE : le.NEAREST_SAMPLINGMODE, s, !1, 0);\n return o.externalTextureSamplerBinding = !0, o.getEffect().executeWhenCompiled(() => {\n o.onApply = function(c) {\n c.setTexture(\"textureSampler\", n);\n };\n const l = a.renderTarget;\n l && (r.postProcessManager.directRender([o], l), s.unBindFramebuffer(l), a.disposeFramebufferObjects(), o.dispose(), a.getInternalTexture().isReady = !0);\n }), a;\n}\nfunction Sf(n, e, t, i, r, s, a, o) {\n const l = e.getEngine();\n return e.isReady = !1, r = r ?? e.samplingMode, i = i ?? e.type, s = s ?? e.format, a = a ?? e.width, o = o ?? e.height, i === -1 && (i = 0), new Promise((c) => {\n const h = new Pt(\"postprocess\", n, null, null, 1, null, r, l, !1, void 0, i, void 0, null, !1, s);\n h.externalTextureSamplerBinding = !0;\n const u = l.createRenderTargetTexture({ width: a, height: o }, {\n generateDepthBuffer: !1,\n generateMipMaps: !1,\n generateStencilBuffer: !1,\n samplingMode: r,\n type: i,\n format: s\n });\n h.getEffect().executeWhenCompiled(() => {\n h.onApply = (f) => {\n f._bindTexture(\"textureSampler\", e), f.setFloat2(\"scale\", 1, 1);\n }, t.postProcessManager.directRender([h], u, !0), l.restoreDefaultFramebuffer(), l._releaseTexture(e), h && h.dispose(), u._swapAndDie(e), e.type = i, e.format = 5, e.isReady = !0, c(e);\n });\n });\n}\nlet El, gg;\nfunction ns(n) {\n El || (El = new Float32Array(1), gg = new Int32Array(El.buffer)), El[0] = n;\n const e = gg[0];\n let t = e >> 16 & 32768, i = e >> 12 & 2047;\n const r = e >> 23 & 255;\n return r < 103 ? t : r > 142 ? (t |= 31744, t |= (r == 255 ? 0 : 1) && e & 8388607, t) : r < 113 ? (i |= 2048, t |= (i >> 114 - r) + (i >> 113 - r & 1), t) : (t |= r - 112 << 10 | i >> 1, t += i & 1, t);\n}\nfunction Ms(n) {\n const e = (n & 32768) >> 15, t = (n & 31744) >> 10, i = n & 1023;\n return t === 0 ? (e ? -1 : 1) * Math.pow(2, -14) * (i / Math.pow(2, 10)) : t == 31 ? i ? NaN : (e ? -1 : 1) * (1 / 0) : (e ? -1 : 1) * Math.pow(2, t - 15) * (1 + i / Math.pow(2, 10));\n}\nconst Z1 = async (n, e, t, i, r) => {\n const s = n.getScene(), a = s.getEngine();\n let o;\n if (!n.isCube)\n o = new Pt(\"lod\", \"lod\", [\"lod\", \"gamma\"], null, 1, null, le.NEAREST_NEAREST_MIPNEAREST, a);\n else {\n const h = [\"#define POSITIVEX\", \"#define NEGATIVEX\", \"#define POSITIVEY\", \"#define NEGATIVEY\", \"#define POSITIVEZ\", \"#define NEGATIVEZ\"];\n o = new Pt(\"lodCube\", \"lodCube\", [\"lod\", \"gamma\"], null, 1, null, le.NEAREST_NEAREST_MIPNEAREST, a, !1, h[i]);\n }\n await new Promise((h) => {\n o.getEffect().executeWhenCompiled(() => {\n h(0);\n });\n });\n const l = new gr(\"temp\", { width: e, height: t }, s, !1);\n o.onApply = function(h) {\n h.setTexture(\"textureSampler\", n), h.setFloat(\"lod\", r), h.setBool(\"gamma\", n.gammaSpace);\n };\n const c = n.getInternalTexture();\n try {\n if (l.renderTarget && c) {\n const h = c.samplingMode;\n r !== 0 ? n.updateSamplingMode(le.NEAREST_NEAREST_MIPNEAREST) : n.updateSamplingMode(le.NEAREST_NEAREST), s.postProcessManager.directRender([o], l.renderTarget, !0), n.updateSamplingMode(h);\n const u = await a.readPixels(0, 0, e, t), f = new Uint8Array(u.buffer, 0, u.byteLength);\n return a.unBindFramebuffer(l.renderTarget), f;\n } else\n throw Error(\"Render to texture failed.\");\n } finally {\n l.dispose(), o.dispose();\n }\n};\nasync function j1(n, e, t, i = 0, r = 0) {\n return !n.isReady() && n._texture && await new Promise((s, a) => {\n if (n._texture === null) {\n a(0);\n return;\n }\n n._texture.onLoadedObservable.addOnce(() => {\n s(0);\n });\n }), await Z1(n, e, t, i, r);\n}\nconst Q1 = {\n /**\n * Uses the GPU to create a copy texture rescaled at a given size\n * @param texture Texture to copy from\n * @param width defines the desired width\n * @param height defines the desired height\n * @param useBilinearMode defines if bilinear mode has to be used\n * @returns the generated texture\n */\n CreateResizedCopy: Y1,\n /**\n * Apply a post process to a texture\n * @param postProcessName name of the fragment post process\n * @param internalTexture the texture to encode\n * @param scene the scene hosting the texture\n * @param type type of the output texture. If not provided, use the one from internalTexture\n * @param samplingMode sampling mode to use to sample the source texture. If not provided, use the one from internalTexture\n * @param format format of the output texture. If not provided, use the one from internalTexture\n * @returns a promise with the internalTexture having its texture replaced by the result of the processing\n */\n ApplyPostProcess: Sf,\n /**\n * Converts a number to half float\n * @param value number to convert\n * @returns converted number\n */\n ToHalfFloat: ns,\n /**\n * Converts a half float to a number\n * @param value half float to convert\n * @returns converted half float\n */\n FromHalfFloat: Ms,\n /**\n * Gets the data of the specified texture by rendering it to an intermediate RGBA texture and retrieving the bytes from it.\n * This is convienent to get 8-bit RGBA values for a texture in a GPU compressed format.\n * @param texture the source texture\n * @param width the width of the result, which does not have to match the source texture width\n * @param height the height of the result, which does not have to match the source texture height\n * @param face if the texture has multiple faces, the face index to use for the source\n * @param channels a filter for which of the RGBA channels to return in the result\n * @param lod if the texture has multiple LODs, the lod index to use for the source\n * @returns the 8-bit texture data\n */\n GetTextureDataAsync: j1\n};\nclass mg {\n /**\n * Expand the RGBD Texture from RGBD to Half Float if possible.\n * @param texture the texture to expand.\n */\n static ExpandRGBDTexture(e) {\n const t = e._texture;\n if (!t || !e.isRGBD)\n return;\n const i = t.getEngine(), r = i.getCaps(), s = t.isReady;\n let a = !1;\n r.textureHalfFloatRender && r.textureHalfFloatLinearFiltering ? (a = !0, t.type = 2) : r.textureFloatRender && r.textureFloatLinearFiltering && (a = !0, t.type = 1), a && (t.isReady = !1, t._isRGBD = !1, t.invertY = !1);\n const o = () => {\n const l = new Pt(\"rgbdDecode\", \"rgbdDecode\", null, null, 1, null, 3, i, !1, void 0, t.type, void 0, null, !1);\n l.externalTextureSamplerBinding = !0;\n const c = i.createRenderTargetTexture(t.width, {\n generateDepthBuffer: !1,\n generateMipMaps: !1,\n generateStencilBuffer: !1,\n samplingMode: t.samplingMode,\n type: t.type,\n format: 5\n });\n l.getEffect().executeWhenCompiled(() => {\n l.onApply = (h) => {\n h._bindTexture(\"textureSampler\", t), h.setFloat2(\"scale\", 1, 1);\n }, e.getScene().postProcessManager.directRender([l], c, !0), i.restoreDefaultFramebuffer(), i._releaseTexture(t), l && l.dispose(), c._swapAndDie(t), t.isReady = !0;\n });\n };\n a && (s ? o() : e.onLoadObservable.addOnce(o));\n }\n /**\n * Encode the texture to RGBD if possible.\n * @param internalTexture the texture to encode\n * @param scene the scene hosting the texture\n * @param outputTextureType type of the texture in which the encoding is performed\n * @returns a promise with the internalTexture having its texture replaced by the result of the processing\n */\n static EncodeTextureToRGBD(e, t, i = 0) {\n return Sf(\"rgbdEncode\", e, t, i, 1, 5);\n }\n}\nconst J1 = \"data:image/png;base64,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\";\nlet $1 = 0;\nconst b0 = (n) => {\n if (!n.environmentBRDFTexture) {\n const e = n.useDelayedTextureLoading;\n n.useDelayedTextureLoading = !1;\n const t = n._blockEntityCollection;\n n._blockEntityCollection = !1;\n const i = le.CreateFromBase64String(J1, \"EnvironmentBRDFTexture\" + $1++, n, !0, !1, le.BILINEAR_SAMPLINGMODE);\n n._blockEntityCollection = t;\n const r = n.getEngine().getLoadedTexturesCache(), s = r.indexOf(i.getInternalTexture());\n s !== -1 && r.splice(s, 1), i.isRGBD = !0, i.wrapU = le.CLAMP_ADDRESSMODE, i.wrapV = le.CLAMP_ADDRESSMODE, n.environmentBRDFTexture = i, n.useDelayedTextureLoading = e, mg.ExpandRGBDTexture(i);\n const a = n.getEngine().onContextRestoredObservable.add(() => {\n i.isRGBD = !0;\n const o = n.onBeforeRenderObservable.add(() => {\n i.isReady() && (n.onBeforeRenderObservable.remove(o), mg.ExpandRGBDTexture(i));\n });\n });\n n.onDisposeObservable.add(() => {\n n.getEngine().onContextRestoredObservable.remove(a);\n });\n }\n return n.environmentBRDFTexture;\n};\nclass eM extends es {\n constructor() {\n super(...arguments), this.BRDF_V_HEIGHT_CORRELATED = !1, this.MS_BRDF_ENERGY_CONSERVATION = !1, this.SPHERICAL_HARMONICS = !1, this.SPECULAR_GLOSSINESS_ENERGY_CONSERVATION = !1;\n }\n}\nclass Fi extends Ur {\n /** @internal */\n _markAllSubMeshesAsMiscDirty() {\n this._internalMarkAllSubMeshesAsMiscDirty();\n }\n constructor(e, t = !0) {\n super(e, \"PBRBRDF\", 90, new eM(), t), this._useEnergyConservation = Fi.DEFAULT_USE_ENERGY_CONSERVATION, this.useEnergyConservation = Fi.DEFAULT_USE_ENERGY_CONSERVATION, this._useSmithVisibilityHeightCorrelated = Fi.DEFAULT_USE_SMITH_VISIBILITY_HEIGHT_CORRELATED, this.useSmithVisibilityHeightCorrelated = Fi.DEFAULT_USE_SMITH_VISIBILITY_HEIGHT_CORRELATED, this._useSphericalHarmonics = Fi.DEFAULT_USE_SPHERICAL_HARMONICS, this.useSphericalHarmonics = Fi.DEFAULT_USE_SPHERICAL_HARMONICS, this._useSpecularGlossinessInputEnergyConservation = Fi.DEFAULT_USE_SPECULAR_GLOSSINESS_INPUT_ENERGY_CONSERVATION, this.useSpecularGlossinessInputEnergyConservation = Fi.DEFAULT_USE_SPECULAR_GLOSSINESS_INPUT_ENERGY_CONSERVATION, this._internalMarkAllSubMeshesAsMiscDirty = e._dirtyCallbacks[16], this._enable(!0);\n }\n prepareDefines(e) {\n e.BRDF_V_HEIGHT_CORRELATED = this._useSmithVisibilityHeightCorrelated, e.MS_BRDF_ENERGY_CONSERVATION = this._useEnergyConservation && this._useSmithVisibilityHeightCorrelated, e.SPHERICAL_HARMONICS = this._useSphericalHarmonics, e.SPECULAR_GLOSSINESS_ENERGY_CONSERVATION = this._useSpecularGlossinessInputEnergyConservation;\n }\n getClassName() {\n return \"PBRBRDFConfiguration\";\n }\n}\nFi.DEFAULT_USE_ENERGY_CONSERVATION = !0;\nFi.DEFAULT_USE_SMITH_VISIBILITY_HEIGHT_CORRELATED = !0;\nFi.DEFAULT_USE_SPHERICAL_HARMONICS = !0;\nFi.DEFAULT_USE_SPECULAR_GLOSSINESS_INPUT_ENERGY_CONSERVATION = !0;\nP([\n w(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Fi.prototype, \"useEnergyConservation\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Fi.prototype, \"useSmithVisibilityHeightCorrelated\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Fi.prototype, \"useSphericalHarmonics\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Fi.prototype, \"useSpecularGlossinessInputEnergyConservation\", void 0);\nconst rs = [\n Math.sqrt(1 / (4 * Math.PI)),\n -Math.sqrt(3 / (4 * Math.PI)),\n Math.sqrt(3 / (4 * Math.PI)),\n -Math.sqrt(3 / (4 * Math.PI)),\n Math.sqrt(15 / (4 * Math.PI)),\n -Math.sqrt(15 / (4 * Math.PI)),\n Math.sqrt(5 / (16 * Math.PI)),\n -Math.sqrt(15 / (4 * Math.PI)),\n Math.sqrt(15 / (16 * Math.PI))\n // l22\n], tM = [\n () => 1,\n (n) => n.y,\n (n) => n.z,\n (n) => n.x,\n (n) => n.x * n.y,\n (n) => n.y * n.z,\n (n) => 3 * n.z * n.z - 1,\n (n) => n.x * n.z,\n (n) => n.x * n.x - n.y * n.y\n // l22\n], bs = (n, e) => rs[n] * tM[n](e), As = [Math.PI, 2 * Math.PI / 3, 2 * Math.PI / 3, 2 * Math.PI / 3, Math.PI / 4, Math.PI / 4, Math.PI / 4, Math.PI / 4, Math.PI / 4];\nclass xo {\n constructor() {\n this.preScaled = !1, this.l00 = _.Zero(), this.l1_1 = _.Zero(), this.l10 = _.Zero(), this.l11 = _.Zero(), this.l2_2 = _.Zero(), this.l2_1 = _.Zero(), this.l20 = _.Zero(), this.l21 = _.Zero(), this.l22 = _.Zero();\n }\n /**\n * Adds a light to the spherical harmonics\n * @param direction the direction of the light\n * @param color the color of the light\n * @param deltaSolidAngle the delta solid angle of the light\n */\n addLight(e, t, i) {\n z.Vector3[0].set(t.r, t.g, t.b);\n const r = z.Vector3[0], s = z.Vector3[1];\n r.scaleToRef(i, s), s.scaleToRef(bs(0, e), z.Vector3[2]), this.l00.addInPlace(z.Vector3[2]), s.scaleToRef(bs(1, e), z.Vector3[2]), this.l1_1.addInPlace(z.Vector3[2]), s.scaleToRef(bs(2, e), z.Vector3[2]), this.l10.addInPlace(z.Vector3[2]), s.scaleToRef(bs(3, e), z.Vector3[2]), this.l11.addInPlace(z.Vector3[2]), s.scaleToRef(bs(4, e), z.Vector3[2]), this.l2_2.addInPlace(z.Vector3[2]), s.scaleToRef(bs(5, e), z.Vector3[2]), this.l2_1.addInPlace(z.Vector3[2]), s.scaleToRef(bs(6, e), z.Vector3[2]), this.l20.addInPlace(z.Vector3[2]), s.scaleToRef(bs(7, e), z.Vector3[2]), this.l21.addInPlace(z.Vector3[2]), s.scaleToRef(bs(8, e), z.Vector3[2]), this.l22.addInPlace(z.Vector3[2]);\n }\n /**\n * Scales the spherical harmonics by the given amount\n * @param scale the amount to scale\n */\n scaleInPlace(e) {\n this.l00.scaleInPlace(e), this.l1_1.scaleInPlace(e), this.l10.scaleInPlace(e), this.l11.scaleInPlace(e), this.l2_2.scaleInPlace(e), this.l2_1.scaleInPlace(e), this.l20.scaleInPlace(e), this.l21.scaleInPlace(e), this.l22.scaleInPlace(e);\n }\n /**\n * Convert from incident radiance (Li) to irradiance (E) by applying convolution with the cosine-weighted hemisphere.\n *\n * ```\n * E_lm = A_l * L_lm\n * ```\n *\n * In spherical harmonics this convolution amounts to scaling factors for each frequency band.\n * This corresponds to equation 5 in \"An Efficient Representation for Irradiance Environment Maps\", where\n * the scaling factors are given in equation 9.\n */\n convertIncidentRadianceToIrradiance() {\n this.l00.scaleInPlace(As[0]), this.l1_1.scaleInPlace(As[1]), this.l10.scaleInPlace(As[2]), this.l11.scaleInPlace(As[3]), this.l2_2.scaleInPlace(As[4]), this.l2_1.scaleInPlace(As[5]), this.l20.scaleInPlace(As[6]), this.l21.scaleInPlace(As[7]), this.l22.scaleInPlace(As[8]);\n }\n /**\n * Convert from irradiance to outgoing radiance for Lambertian BDRF, suitable for efficient shader evaluation.\n *\n * ```\n * L = (1/pi) * E * rho\n * ```\n *\n * This is done by an additional scale by 1/pi, so is a fairly trivial operation but important conceptually.\n */\n convertIrradianceToLambertianRadiance() {\n this.scaleInPlace(1 / Math.PI);\n }\n /**\n * Integrates the reconstruction coefficients directly in to the SH preventing further\n * required operations at run time.\n *\n * This is simply done by scaling back the SH with Ylm constants parameter.\n * The trigonometric part being applied by the shader at run time.\n */\n preScaleForRendering() {\n this.preScaled = !0, this.l00.scaleInPlace(rs[0]), this.l1_1.scaleInPlace(rs[1]), this.l10.scaleInPlace(rs[2]), this.l11.scaleInPlace(rs[3]), this.l2_2.scaleInPlace(rs[4]), this.l2_1.scaleInPlace(rs[5]), this.l20.scaleInPlace(rs[6]), this.l21.scaleInPlace(rs[7]), this.l22.scaleInPlace(rs[8]);\n }\n /**\n * update the spherical harmonics coefficients from the given array\n * @param data defines the 9x3 coefficients (l00, l1-1, l10, l11, l2-2, l2-1, l20, l21, l22)\n * @returns the spherical harmonics (this)\n */\n updateFromArray(e) {\n return _.FromArrayToRef(e[0], 0, this.l00), _.FromArrayToRef(e[1], 0, this.l1_1), _.FromArrayToRef(e[2], 0, this.l10), _.FromArrayToRef(e[3], 0, this.l11), _.FromArrayToRef(e[4], 0, this.l2_2), _.FromArrayToRef(e[5], 0, this.l2_1), _.FromArrayToRef(e[6], 0, this.l20), _.FromArrayToRef(e[7], 0, this.l21), _.FromArrayToRef(e[8], 0, this.l22), this;\n }\n /**\n * update the spherical harmonics coefficients from the given floats array\n * @param data defines the 9x3 coefficients (l00, l1-1, l10, l11, l2-2, l2-1, l20, l21, l22)\n * @returns the spherical harmonics (this)\n */\n updateFromFloatsArray(e) {\n return _.FromFloatsToRef(e[0], e[1], e[2], this.l00), _.FromFloatsToRef(e[3], e[4], e[5], this.l1_1), _.FromFloatsToRef(e[6], e[7], e[8], this.l10), _.FromFloatsToRef(e[9], e[10], e[11], this.l11), _.FromFloatsToRef(e[12], e[13], e[14], this.l2_2), _.FromFloatsToRef(e[15], e[16], e[17], this.l2_1), _.FromFloatsToRef(e[18], e[19], e[20], this.l20), _.FromFloatsToRef(e[21], e[22], e[23], this.l21), _.FromFloatsToRef(e[24], e[25], e[26], this.l22), this;\n }\n /**\n * Constructs a spherical harmonics from an array.\n * @param data defines the 9x3 coefficients (l00, l1-1, l10, l11, l2-2, l2-1, l20, l21, l22)\n * @returns the spherical harmonics\n */\n static FromArray(e) {\n return new xo().updateFromArray(e);\n }\n // Keep for references.\n /**\n * Gets the spherical harmonics from polynomial\n * @param polynomial the spherical polynomial\n * @returns the spherical harmonics\n */\n static FromPolynomial(e) {\n const t = new xo();\n return t.l00 = e.xx.scale(0.376127).add(e.yy.scale(0.376127)).add(e.zz.scale(0.376126)), t.l1_1 = e.y.scale(0.977204), t.l10 = e.z.scale(0.977204), t.l11 = e.x.scale(0.977204), t.l2_2 = e.xy.scale(1.16538), t.l2_1 = e.yz.scale(1.16538), t.l20 = e.zz.scale(1.34567).subtract(e.xx.scale(0.672834)).subtract(e.yy.scale(0.672834)), t.l21 = e.zx.scale(1.16538), t.l22 = e.xx.scale(1.16538).subtract(e.yy.scale(1.16538)), t.l1_1.scaleInPlace(-1), t.l11.scaleInPlace(-1), t.l2_1.scaleInPlace(-1), t.l21.scaleInPlace(-1), t.scaleInPlace(Math.PI), t;\n }\n}\nclass Co {\n constructor() {\n this.x = _.Zero(), this.y = _.Zero(), this.z = _.Zero(), this.xx = _.Zero(), this.yy = _.Zero(), this.zz = _.Zero(), this.xy = _.Zero(), this.yz = _.Zero(), this.zx = _.Zero();\n }\n /**\n * The spherical harmonics used to create the polynomials.\n */\n get preScaledHarmonics() {\n return this._harmonics || (this._harmonics = xo.FromPolynomial(this)), this._harmonics.preScaled || this._harmonics.preScaleForRendering(), this._harmonics;\n }\n /**\n * Adds an ambient color to the spherical polynomial\n * @param color the color to add\n */\n addAmbient(e) {\n z.Vector3[0].copyFromFloats(e.r, e.g, e.b);\n const t = z.Vector3[0];\n this.xx.addInPlace(t), this.yy.addInPlace(t), this.zz.addInPlace(t);\n }\n /**\n * Scales the spherical polynomial by the given amount\n * @param scale the amount to scale\n */\n scaleInPlace(e) {\n this.x.scaleInPlace(e), this.y.scaleInPlace(e), this.z.scaleInPlace(e), this.xx.scaleInPlace(e), this.yy.scaleInPlace(e), this.zz.scaleInPlace(e), this.yz.scaleInPlace(e), this.zx.scaleInPlace(e), this.xy.scaleInPlace(e);\n }\n /**\n * Updates the spherical polynomial from harmonics\n * @param harmonics the spherical harmonics\n * @returns the spherical polynomial\n */\n updateFromHarmonics(e) {\n return this._harmonics = e, this.x.copyFrom(e.l11), this.x.scaleInPlace(1.02333).scaleInPlace(-1), this.y.copyFrom(e.l1_1), this.y.scaleInPlace(1.02333).scaleInPlace(-1), this.z.copyFrom(e.l10), this.z.scaleInPlace(1.02333), this.xx.copyFrom(e.l00), z.Vector3[0].copyFrom(e.l20).scaleInPlace(0.247708), z.Vector3[1].copyFrom(e.l22).scaleInPlace(0.429043), this.xx.scaleInPlace(0.886277).subtractInPlace(z.Vector3[0]).addInPlace(z.Vector3[1]), this.yy.copyFrom(e.l00), this.yy.scaleInPlace(0.886277).subtractInPlace(z.Vector3[0]).subtractInPlace(z.Vector3[1]), this.zz.copyFrom(e.l00), z.Vector3[0].copyFrom(e.l20).scaleInPlace(0.495417), this.zz.scaleInPlace(0.886277).addInPlace(z.Vector3[0]), this.yz.copyFrom(e.l2_1), this.yz.scaleInPlace(0.858086).scaleInPlace(-1), this.zx.copyFrom(e.l21), this.zx.scaleInPlace(0.858086).scaleInPlace(-1), this.xy.copyFrom(e.l2_2), this.xy.scaleInPlace(0.858086), this.scaleInPlace(1 / Math.PI), this;\n }\n /**\n * Gets the spherical polynomial from harmonics\n * @param harmonics the spherical harmonics\n * @returns the spherical polynomial\n */\n static FromHarmonics(e) {\n return new Co().updateFromHarmonics(e);\n }\n /**\n * Constructs a spherical polynomial from an array.\n * @param data defines the 9x3 coefficients (x, y, z, xx, yy, zz, yz, zx, xy)\n * @returns the spherical polynomial\n */\n static FromArray(e) {\n const t = new Co();\n return _.FromArrayToRef(e[0], 0, t.x), _.FromArrayToRef(e[1], 0, t.y), _.FromArrayToRef(e[2], 0, t.z), _.FromArrayToRef(e[3], 0, t.xx), _.FromArrayToRef(e[4], 0, t.yy), _.FromArrayToRef(e[5], 0, t.zz), _.FromArrayToRef(e[6], 0, t.yz), _.FromArrayToRef(e[7], 0, t.zx), _.FromArrayToRef(e[8], 0, t.xy), t;\n }\n}\nclass Jn {\n constructor(e, t, i, r) {\n this.name = e, this.worldAxisForNormal = t, this.worldAxisForFileX = i, this.worldAxisForFileY = r;\n }\n}\nclass za {\n /**\n * Converts a texture to the according Spherical Polynomial data.\n * This extracts the first 3 orders only as they are the only one used in the lighting.\n *\n * @param texture The texture to extract the information from.\n * @returns The Spherical Polynomial data.\n */\n static ConvertCubeMapTextureToSphericalPolynomial(e) {\n var f;\n if (!e.isCube)\n return null;\n (f = e.getScene()) == null || f.getEngine().flushFramebuffer();\n const t = e.getSize().width, i = e.readPixels(0, void 0, void 0, !1), r = e.readPixels(1, void 0, void 0, !1);\n let s, a;\n e.isRenderTarget ? (s = e.readPixels(3, void 0, void 0, !1), a = e.readPixels(2, void 0, void 0, !1)) : (s = e.readPixels(2, void 0, void 0, !1), a = e.readPixels(3, void 0, void 0, !1));\n const o = e.readPixels(4, void 0, void 0, !1), l = e.readPixels(5, void 0, void 0, !1), c = e.gammaSpace, h = 5;\n let u = 0;\n return (e.textureType == 1 || e.textureType == 2) && (u = 1), new Promise((d) => {\n Promise.all([r, i, s, a, o, l]).then(([p, g, m, v, E, C]) => {\n const T = {\n size: t,\n right: g,\n left: p,\n up: m,\n down: v,\n front: E,\n back: C,\n format: h,\n type: u,\n gammaSpace: c\n };\n d(this.ConvertCubeMapToSphericalPolynomial(T));\n });\n });\n }\n /**\n * Compute the area on the unit sphere of the rectangle defined by (x,y) and the origin\n * See https://www.rorydriscoll.com/2012/01/15/cubemap-texel-solid-angle/\n * @param x\n * @param y\n * @returns the area\n */\n static _AreaElement(e, t) {\n return Math.atan2(e * t, Math.sqrt(e * e + t * t + 1));\n }\n /**\n * Converts a cubemap to the according Spherical Polynomial data.\n * This extracts the first 3 orders only as they are the only one used in the lighting.\n *\n * @param cubeInfo The Cube map to extract the information from.\n * @returns The Spherical Polynomial data.\n */\n static ConvertCubeMapToSphericalPolynomial(e) {\n const t = new xo();\n let i = 0;\n const r = 2 / e.size, s = r, a = 0.5 * r, o = a - 1;\n for (let f = 0; f < 6; f++) {\n const d = this._FileFaces[f], p = e[d.name];\n let g = o;\n const m = e.format === 5 ? 4 : 3;\n for (let v = 0; v < e.size; v++) {\n let E = o;\n for (let C = 0; C < e.size; C++) {\n const T = d.worldAxisForFileX.scale(E).add(d.worldAxisForFileY.scale(g)).add(d.worldAxisForNormal);\n T.normalize();\n const R = this._AreaElement(E - a, g - a) - this._AreaElement(E - a, g + a) - this._AreaElement(E + a, g - a) + this._AreaElement(E + a, g + a);\n let x = p[v * e.size * m + C * m + 0], S = p[v * e.size * m + C * m + 1], M = p[v * e.size * m + C * m + 2];\n isNaN(x) && (x = 0), isNaN(S) && (S = 0), isNaN(M) && (M = 0), e.type === 0 && (x /= 255, S /= 255, M /= 255), e.gammaSpace && (x = Math.pow(je.Clamp(x), zl), S = Math.pow(je.Clamp(S), zl), M = Math.pow(je.Clamp(M), zl));\n const N = this.MAX_HDRI_VALUE;\n if (this.PRESERVE_CLAMPED_COLORS) {\n const U = Math.max(x, S, M);\n if (U > N) {\n const H = N / U;\n x *= H, S *= H, M *= H;\n }\n } else\n x = je.Clamp(x, 0, N), S = je.Clamp(S, 0, N), M = je.Clamp(M, 0, N);\n const F = new Ne(x, S, M);\n t.addLight(T, F, R), i += R, E += r;\n }\n g += s;\n }\n }\n const u = 4 * Math.PI * 6 / 6 / i;\n return t.scaleInPlace(u), t.convertIncidentRadianceToIrradiance(), t.convertIrradianceToLambertianRadiance(), Co.FromHarmonics(t);\n }\n}\nza._FileFaces = [\n new Jn(\"right\", new _(1, 0, 0), new _(0, 0, -1), new _(0, -1, 0)),\n new Jn(\"left\", new _(-1, 0, 0), new _(0, 0, 1), new _(0, -1, 0)),\n new Jn(\"up\", new _(0, 1, 0), new _(1, 0, 0), new _(0, 0, 1)),\n new Jn(\"down\", new _(0, -1, 0), new _(1, 0, 0), new _(0, 0, -1)),\n new Jn(\"front\", new _(0, 0, 1), new _(1, 0, 0), new _(0, -1, 0)),\n new Jn(\"back\", new _(0, 0, -1), new _(-1, 0, 0), new _(0, -1, 0))\n // -Z bottom\n];\nza.MAX_HDRI_VALUE = 4096;\nza.PRESERVE_CLAMPED_COLORS = !1;\nIt.prototype.forceSphericalPolynomialsRecompute = function() {\n this._texture && (this._texture._sphericalPolynomial = null, this._texture._sphericalPolynomialPromise = null, this._texture._sphericalPolynomialComputed = !1);\n};\nObject.defineProperty(It.prototype, \"sphericalPolynomial\", {\n get: function() {\n if (this._texture) {\n if (this._texture._sphericalPolynomial || this._texture._sphericalPolynomialComputed)\n return this._texture._sphericalPolynomial;\n if (this._texture.isReady)\n return this._texture._sphericalPolynomialPromise || (this._texture._sphericalPolynomialPromise = za.ConvertCubeMapTextureToSphericalPolynomial(this), this._texture._sphericalPolynomialPromise === null ? this._texture._sphericalPolynomialComputed = !0 : this._texture._sphericalPolynomialPromise.then((n) => {\n this._texture._sphericalPolynomial = n, this._texture._sphericalPolynomialComputed = !0;\n })), null;\n }\n return null;\n },\n set: function(n) {\n this._texture && (this._texture._sphericalPolynomial = n);\n },\n enumerable: !0,\n configurable: !0\n});\nconst iM = \"pbrFragmentDeclaration\", rM = `uniform vec4 vEyePosition;uniform vec3 vReflectionColor;uniform vec4 vAlbedoColor;uniform vec4 vLightingIntensity;uniform vec4 vReflectivityColor;uniform vec4 vMetallicReflectanceFactors;uniform vec3 vEmissiveColor;uniform float visibility;uniform vec3 vAmbientColor;\n#ifdef ALBEDO\nuniform vec2 vAlbedoInfos;\n#endif\n#ifdef AMBIENT\nuniform vec4 vAmbientInfos;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;uniform vec2 vTangentSpaceParams;\n#endif\n#ifdef OPACITY\nuniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;\n#endif\n#ifdef REFLECTIVITY\nuniform vec3 vReflectivityInfos;\n#endif\n#ifdef MICROSURFACEMAP\nuniform vec2 vMicroSurfaceSamplerInfos;\n#endif\n#if defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_PROJECTION) || defined(SS_REFRACTION) || defined(PREPASS)\nuniform mat4 view;\n#endif\n#ifdef REFLECTION\nuniform vec2 vReflectionInfos;\n#ifdef REALTIME_FILTERING\nuniform vec2 vReflectionFilteringInfo;\n#endif\nuniform mat4 reflectionMatrix;uniform vec3 vReflectionMicrosurfaceInfos;\n#if defined(USE_LOCAL_REFLECTIONMAP_CUBIC) && defined(REFLECTIONMAP_CUBIC)\nuniform vec3 vReflectionPosition;uniform vec3 vReflectionSize; \n#endif\n#endif\n#if defined(SS_REFRACTION) && defined(SS_USE_LOCAL_REFRACTIONMAP_CUBIC)\nuniform vec3 vRefractionPosition;uniform vec3 vRefractionSize; \n#endif\n#ifdef CLEARCOAT\nuniform vec2 vClearCoatParams;uniform vec4 vClearCoatRefractionParams;\n#if defined(CLEARCOAT_TEXTURE) || defined(CLEARCOAT_TEXTURE_ROUGHNESS)\nuniform vec4 vClearCoatInfos;\n#endif\n#ifdef CLEARCOAT_TEXTURE\nuniform mat4 clearCoatMatrix;\n#endif\n#ifdef CLEARCOAT_TEXTURE_ROUGHNESS\nuniform mat4 clearCoatRoughnessMatrix;\n#endif\n#ifdef CLEARCOAT_BUMP\nuniform vec2 vClearCoatBumpInfos;uniform vec2 vClearCoatTangentSpaceParams;uniform mat4 clearCoatBumpMatrix;\n#endif\n#ifdef CLEARCOAT_TINT\nuniform vec4 vClearCoatTintParams;uniform float clearCoatColorAtDistance;\n#ifdef CLEARCOAT_TINT_TEXTURE\nuniform vec2 vClearCoatTintInfos;uniform mat4 clearCoatTintMatrix;\n#endif\n#endif\n#endif\n#ifdef IRIDESCENCE\nuniform vec4 vIridescenceParams;\n#if defined(IRIDESCENCE_TEXTURE) || defined(IRIDESCENCE_THICKNESS_TEXTURE)\nuniform vec4 vIridescenceInfos;\n#endif\n#ifdef IRIDESCENCE_TEXTURE\nuniform mat4 iridescenceMatrix;\n#endif\n#ifdef IRIDESCENCE_THICKNESS_TEXTURE\nuniform mat4 iridescenceThicknessMatrix;\n#endif\n#endif\n#ifdef ANISOTROPIC\nuniform vec3 vAnisotropy;\n#ifdef ANISOTROPIC_TEXTURE\nuniform vec2 vAnisotropyInfos;uniform mat4 anisotropyMatrix;\n#endif\n#endif\n#ifdef SHEEN\nuniform vec4 vSheenColor;\n#ifdef SHEEN_ROUGHNESS\nuniform float vSheenRoughness;\n#endif\n#if defined(SHEEN_TEXTURE) || defined(SHEEN_TEXTURE_ROUGHNESS)\nuniform vec4 vSheenInfos;\n#endif\n#ifdef SHEEN_TEXTURE\nuniform mat4 sheenMatrix;\n#endif\n#ifdef SHEEN_TEXTURE_ROUGHNESS\nuniform mat4 sheenRoughnessMatrix;\n#endif\n#endif\n#ifdef SUBSURFACE\n#ifdef SS_REFRACTION\nuniform vec4 vRefractionMicrosurfaceInfos;uniform vec4 vRefractionInfos;uniform mat4 refractionMatrix;\n#ifdef REALTIME_FILTERING\nuniform vec2 vRefractionFilteringInfo;\n#endif\n#ifdef SS_DISPERSION\nuniform float dispersion;\n#endif\n#endif\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nuniform vec2 vThicknessInfos;uniform mat4 thicknessMatrix;\n#endif\n#ifdef SS_REFRACTIONINTENSITY_TEXTURE\nuniform vec2 vRefractionIntensityInfos;uniform mat4 refractionIntensityMatrix;\n#endif\n#ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE\nuniform vec2 vTranslucencyIntensityInfos;uniform mat4 translucencyIntensityMatrix;\n#endif\nuniform vec2 vThicknessParam;uniform vec3 vDiffusionDistance;uniform vec4 vTintColor;uniform vec3 vSubSurfaceIntensity;\n#endif\n#ifdef PREPASS\n#ifdef SS_SCATTERING\nuniform float scatteringDiffusionProfile;\n#endif\n#endif\n#if DEBUGMODE>0\nuniform vec2 vDebugMode;\n#endif\n#ifdef DETAIL\nuniform vec4 vDetailInfos;\n#endif\n#include\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#ifdef SPHERICAL_HARMONICS\nuniform vec3 vSphericalL00;uniform vec3 vSphericalL1_1;uniform vec3 vSphericalL10;uniform vec3 vSphericalL11;uniform vec3 vSphericalL2_2;uniform vec3 vSphericalL2_1;uniform vec3 vSphericalL20;uniform vec3 vSphericalL21;uniform vec3 vSphericalL22;\n#else\nuniform vec3 vSphericalX;uniform vec3 vSphericalY;uniform vec3 vSphericalZ;uniform vec3 vSphericalXX_ZZ;uniform vec3 vSphericalYY_ZZ;uniform vec3 vSphericalZZ;uniform vec3 vSphericalXY;uniform vec3 vSphericalYZ;uniform vec3 vSphericalZX;\n#endif\n#endif\n#define ADDITIONAL_FRAGMENT_DECLARATION\n`;\nY.IncludesShadersStore[iM] = rM;\nconst sM = \"pbrUboDeclaration\", nM = `layout(std140,column_major) uniform;uniform Material {vec2 vAlbedoInfos;vec4 vAmbientInfos;vec2 vOpacityInfos;vec2 vEmissiveInfos;vec2 vLightmapInfos;vec3 vReflectivityInfos;vec2 vMicroSurfaceSamplerInfos;vec2 vReflectionInfos;vec2 vReflectionFilteringInfo;vec3 vReflectionPosition;vec3 vReflectionSize;vec3 vBumpInfos;mat4 albedoMatrix;mat4 ambientMatrix;mat4 opacityMatrix;mat4 emissiveMatrix;mat4 lightmapMatrix;mat4 reflectivityMatrix;mat4 microSurfaceSamplerMatrix;mat4 bumpMatrix;vec2 vTangentSpaceParams;mat4 reflectionMatrix;vec3 vReflectionColor;vec4 vAlbedoColor;vec4 vLightingIntensity;vec3 vReflectionMicrosurfaceInfos;float pointSize;vec4 vReflectivityColor;vec3 vEmissiveColor;vec3 vAmbientColor;vec2 vDebugMode;vec4 vMetallicReflectanceFactors;vec2 vMetallicReflectanceInfos;mat4 metallicReflectanceMatrix;vec2 vReflectanceInfos;mat4 reflectanceMatrix;vec3 vSphericalL00;vec3 vSphericalL1_1;vec3 vSphericalL10;vec3 vSphericalL11;vec3 vSphericalL2_2;vec3 vSphericalL2_1;vec3 vSphericalL20;vec3 vSphericalL21;vec3 vSphericalL22;vec3 vSphericalX;vec3 vSphericalY;vec3 vSphericalZ;vec3 vSphericalXX_ZZ;vec3 vSphericalYY_ZZ;vec3 vSphericalZZ;vec3 vSphericalXY;vec3 vSphericalYZ;vec3 vSphericalZX;\n#define ADDITIONAL_UBO_DECLARATION\n};\n#include\n#include\n`;\nY.IncludesShadersStore[sM] = nM;\nconst aM = \"pbrFragmentExtraDeclaration\", oM = `varying vec3 vPositionW;\n#if DEBUGMODE>0\nvarying vec4 vClipSpacePosition;\n#endif\n#include[1..7]\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvarying vec3 vEnvironmentIrradiance;\n#endif\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n`;\nY.IncludesShadersStore[aM] = oM;\nconst lM = \"samplerFragmentAlternateDeclaration\", cM = `#ifdef _DEFINENAME_\n#if _DEFINENAME_DIRECTUV==1\n#define v_VARYINGNAME_UV vMainUV1\n#elif _DEFINENAME_DIRECTUV==2\n#define v_VARYINGNAME_UV vMainUV2\n#elif _DEFINENAME_DIRECTUV==3\n#define v_VARYINGNAME_UV vMainUV3\n#elif _DEFINENAME_DIRECTUV==4\n#define v_VARYINGNAME_UV vMainUV4\n#elif _DEFINENAME_DIRECTUV==5\n#define v_VARYINGNAME_UV vMainUV5\n#elif _DEFINENAME_DIRECTUV==6\n#define v_VARYINGNAME_UV vMainUV6\n#else\nvarying vec2 v_VARYINGNAME_UV;\n#endif\n#endif\n`;\nY.IncludesShadersStore[lM] = cM;\nconst hM = \"pbrFragmentSamplersDeclaration\", uM = `#include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_SAMPLERNAME_,albedo)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_SAMPLERNAME_,ambient)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_SAMPLERNAME_,opacity)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_SAMPLERNAME_,emissive)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_SAMPLERNAME_,lightmap)\n#include(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity,_SAMPLERNAME_,reflectivity)\n#include(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler,_SAMPLERNAME_,microSurface)\n#include(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance,_SAMPLERNAME_,metallicReflectance)\n#include(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance,_SAMPLERNAME_,reflectance)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_SAMPLERNAME_,decal)\n#ifdef CLEARCOAT\n#include(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat,_SAMPLERNAME_,clearCoat)\n#include(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness)\n#if defined(CLEARCOAT_TEXTURE_ROUGHNESS) && !defined(CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL)\nuniform sampler2D clearCoatRoughnessSampler;\n#endif\n#include(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump,_SAMPLERNAME_,clearCoatBump)\n#include(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint,_SAMPLERNAME_,clearCoatTint)\n#endif\n#ifdef IRIDESCENCE\n#include(_DEFINENAME_,IRIDESCENCE_TEXTURE,_VARYINGNAME_,Iridescence,_SAMPLERNAME_,iridescence)\n#include(_DEFINENAME_,IRIDESCENCE_THICKNESS_TEXTURE,_VARYINGNAME_,IridescenceThickness,_SAMPLERNAME_,iridescenceThickness)\n#endif\n#ifdef SHEEN\n#include(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen,_SAMPLERNAME_,sheen)\n#include(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness)\n#if defined(SHEEN_ROUGHNESS) && defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL)\nuniform sampler2D sheenRoughnessSampler;\n#endif\n#endif\n#ifdef ANISOTROPIC\n#include(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy,_SAMPLERNAME_,anisotropy)\n#endif\n#ifdef REFLECTION\n#ifdef REFLECTIONMAP_3D\n#define sampleReflection(s,c) textureCube(s,c)\nuniform samplerCube reflectionSampler;\n#ifdef LODBASEDMICROSFURACE\n#define sampleReflectionLod(s,c,l) textureCubeLodEXT(s,c,l)\n#else\nuniform samplerCube reflectionSamplerLow;uniform samplerCube reflectionSamplerHigh;\n#endif\n#ifdef USEIRRADIANCEMAP\nuniform samplerCube irradianceSampler;\n#endif\n#else\n#define sampleReflection(s,c) texture2D(s,c)\nuniform sampler2D reflectionSampler;\n#ifdef LODBASEDMICROSFURACE\n#define sampleReflectionLod(s,c,l) texture2DLodEXT(s,c,l)\n#else\nuniform sampler2D reflectionSamplerLow;uniform sampler2D reflectionSamplerHigh;\n#endif\n#ifdef USEIRRADIANCEMAP\nuniform sampler2D irradianceSampler;\n#endif\n#endif\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#else\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#endif\n#endif\n#ifdef ENVIRONMENTBRDF\nuniform sampler2D environmentBrdfSampler;\n#endif\n#ifdef SUBSURFACE\n#ifdef SS_REFRACTION\n#ifdef SS_REFRACTIONMAP_3D\n#define sampleRefraction(s,c) textureCube(s,c)\nuniform samplerCube refractionSampler;\n#ifdef LODBASEDMICROSFURACE\n#define sampleRefractionLod(s,c,l) textureCubeLodEXT(s,c,l)\n#else\nuniform samplerCube refractionSamplerLow;uniform samplerCube refractionSamplerHigh;\n#endif\n#else\n#define sampleRefraction(s,c) texture2D(s,c)\nuniform sampler2D refractionSampler;\n#ifdef LODBASEDMICROSFURACE\n#define sampleRefractionLod(s,c,l) texture2DLodEXT(s,c,l)\n#else\nuniform sampler2D refractionSamplerLow;uniform sampler2D refractionSamplerHigh;\n#endif\n#endif\n#endif\n#include(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness,_SAMPLERNAME_,thickness)\n#include(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity,_SAMPLERNAME_,refractionIntensity)\n#include(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity,_SAMPLERNAME_,translucencyIntensity)\n#endif\n`;\nY.IncludesShadersStore[hM] = uM;\nconst fM = \"subSurfaceScatteringFunctions\", dM = `bool testLightingForSSS(float diffusionProfile)\n{return diffusionProfile<1.;}`;\nY.IncludesShadersStore[fM] = dM;\nconst pM = \"importanceSampling\", gM = `vec3 hemisphereCosSample(vec2 u) {float phi=2.*PI*u.x;float cosTheta2=1.-u.y;float cosTheta=sqrt(cosTheta2);float sinTheta=sqrt(1.-cosTheta2);return vec3(sinTheta*cos(phi),sinTheta*sin(phi),cosTheta);}\nvec3 hemisphereImportanceSampleDggx(vec2 u,float a) {float phi=2.*PI*u.x;float cosTheta2=(1.-u.y)/(1.+(a+1.)*((a-1.)*u.y));float cosTheta=sqrt(cosTheta2);float sinTheta=sqrt(1.-cosTheta2);return vec3(sinTheta*cos(phi),sinTheta*sin(phi),cosTheta);}\nvec3 hemisphereImportanceSampleDCharlie(vec2 u,float a) { \nfloat phi=2.*PI*u.x;float sinTheta=pow(u.y,a/(2.*a+1.));float cosTheta=sqrt(1.-sinTheta*sinTheta);return vec3(sinTheta*cos(phi),sinTheta*sin(phi),cosTheta);}`;\nY.IncludesShadersStore[pM] = gM;\nconst mM = \"pbrHelperFunctions\", _M = `#define MINIMUMVARIANCE 0.0005\nfloat convertRoughnessToAverageSlope(float roughness)\n{return square(roughness)+MINIMUMVARIANCE;}\nfloat fresnelGrazingReflectance(float reflectance0) {float reflectance90=saturate(reflectance0*25.0);return reflectance90;}\nvec2 getAARoughnessFactors(vec3 normalVector) {\n#ifdef SPECULARAA\nvec3 nDfdx=dFdx(normalVector.xyz);vec3 nDfdy=dFdy(normalVector.xyz);float slopeSquare=max(dot(nDfdx,nDfdx),dot(nDfdy,nDfdy));float geometricRoughnessFactor=pow(saturate(slopeSquare),0.333);float geometricAlphaGFactor=sqrt(slopeSquare);geometricAlphaGFactor*=0.75;return vec2(geometricRoughnessFactor,geometricAlphaGFactor);\n#else\nreturn vec2(0.);\n#endif\n}\n#ifdef ANISOTROPIC\n#ifdef ANISOTROPIC_LEGACY\nvec2 getAnisotropicRoughness(float alphaG,float anisotropy) {float alphaT=max(alphaG*(1.0+anisotropy),MINIMUMVARIANCE);float alphaB=max(alphaG*(1.0-anisotropy),MINIMUMVARIANCE);return vec2(alphaT,alphaB);}\nvec3 getAnisotropicBentNormals(const vec3 T,const vec3 B,const vec3 N,const vec3 V,float anisotropy,float roughness) {vec3 anisotropicFrameDirection=anisotropy>=0.0 ? B : T;vec3 anisotropicFrameTangent=cross(normalize(anisotropicFrameDirection),V);vec3 anisotropicFrameNormal=cross(anisotropicFrameTangent,anisotropicFrameDirection);vec3 anisotropicNormal=normalize(mix(N,anisotropicFrameNormal,abs(anisotropy)));return anisotropicNormal;}\n#else\nvec2 getAnisotropicRoughness(float alphaG,float anisotropy) {float alphaT=max(mix(alphaG,1.0,anisotropy*anisotropy),MINIMUMVARIANCE);float alphaB=max(alphaG,MINIMUMVARIANCE);return vec2(alphaT,alphaB);}\nvec3 getAnisotropicBentNormals(const vec3 T,const vec3 B,const vec3 N,const vec3 V,float anisotropy,float roughness) {vec3 bentNormal=cross(B,V);bentNormal=normalize(cross(bentNormal,B));float a=square(square(1.0-anisotropy*(1.0-roughness)));bentNormal=normalize(mix(bentNormal,N,a));return bentNormal;}\n#endif\n#endif\n#if defined(CLEARCOAT) || defined(SS_REFRACTION)\nvec3 cocaLambert(vec3 alpha,float distance) {return exp(-alpha*distance);}\nvec3 cocaLambert(float NdotVRefract,float NdotLRefract,vec3 alpha,float thickness) {return cocaLambert(alpha,(thickness*((NdotLRefract+NdotVRefract)/(NdotLRefract*NdotVRefract))));}\nvec3 computeColorAtDistanceInMedia(vec3 color,float distance) {return -log(color)/distance;}\nvec3 computeClearCoatAbsorption(float NdotVRefract,float NdotLRefract,vec3 clearCoatColor,float clearCoatThickness,float clearCoatIntensity) {vec3 clearCoatAbsorption=mix(vec3(1.0),\ncocaLambert(NdotVRefract,NdotLRefract,clearCoatColor,clearCoatThickness),\nclearCoatIntensity);return clearCoatAbsorption;}\n#endif\n#ifdef MICROSURFACEAUTOMATIC\nfloat computeDefaultMicroSurface(float microSurface,vec3 reflectivityColor)\n{const float kReflectivityNoAlphaWorkflow_SmoothnessMax=0.95;float reflectivityLuminance=getLuminance(reflectivityColor);float reflectivityLuma=sqrt(reflectivityLuminance);microSurface=reflectivityLuma*kReflectivityNoAlphaWorkflow_SmoothnessMax;return microSurface;}\n#endif\n`;\nY.IncludesShadersStore[mM] = _M;\nconst EM = \"harmonicsFunctions\", vM = `#ifdef USESPHERICALFROMREFLECTIONMAP\n#ifdef SPHERICAL_HARMONICS\nvec3 computeEnvironmentIrradiance(vec3 normal) {return vSphericalL00\n+ vSphericalL1_1*(normal.y)\n+ vSphericalL10*(normal.z)\n+ vSphericalL11*(normal.x)\n+ vSphericalL2_2*(normal.y*normal.x)\n+ vSphericalL2_1*(normal.y*normal.z)\n+ vSphericalL20*((3.0*normal.z*normal.z)-1.0)\n+ vSphericalL21*(normal.z*normal.x)\n+ vSphericalL22*(normal.x*normal.x-(normal.y*normal.y));}\n#else\nvec3 computeEnvironmentIrradiance(vec3 normal) {float Nx=normal.x;float Ny=normal.y;float Nz=normal.z;vec3 C1=vSphericalZZ.rgb;vec3 Cx=vSphericalX.rgb;vec3 Cy=vSphericalY.rgb;vec3 Cz=vSphericalZ.rgb;vec3 Cxx_zz=vSphericalXX_ZZ.rgb;vec3 Cyy_zz=vSphericalYY_ZZ.rgb;vec3 Cxy=vSphericalXY.rgb;vec3 Cyz=vSphericalYZ.rgb;vec3 Czx=vSphericalZX.rgb;vec3 a1=Cyy_zz*Ny+Cy;vec3 a2=Cyz*Nz+a1;vec3 b1=Czx*Nz+Cx;vec3 b2=Cxy*Ny+b1;vec3 b3=Cxx_zz*Nx+b2;vec3 t1=Cz *Nz+C1;vec3 t2=a2 *Ny+t1;vec3 t3=b3 *Nx+t2;return t3;}\n#endif\n#endif\n`;\nY.IncludesShadersStore[EM] = vM;\nconst TM = \"pbrDirectLightingSetupFunctions\", xM = `struct preLightingInfo\n{vec3 lightOffset;float lightDistanceSquared;float lightDistance;float attenuation;vec3 L;vec3 H;float NdotV;float NdotLUnclamped;float NdotL;float VdotH;float roughness;\n#ifdef IRIDESCENCE\nfloat iridescenceIntensity;\n#endif\n};preLightingInfo computePointAndSpotPreLightingInfo(vec4 lightData,vec3 V,vec3 N) {preLightingInfo result;result.lightOffset=lightData.xyz-vPositionW;result.lightDistanceSquared=dot(result.lightOffset,result.lightOffset);result.lightDistance=sqrt(result.lightDistanceSquared);result.L=normalize(result.lightOffset);result.H=normalize(V+result.L);result.VdotH=saturate(dot(V,result.H));result.NdotLUnclamped=dot(N,result.L);result.NdotL=saturateEps(result.NdotLUnclamped);return result;}\npreLightingInfo computeDirectionalPreLightingInfo(vec4 lightData,vec3 V,vec3 N) {preLightingInfo result;result.lightDistance=length(-lightData.xyz);result.L=normalize(-lightData.xyz);result.H=normalize(V+result.L);result.VdotH=saturate(dot(V,result.H));result.NdotLUnclamped=dot(N,result.L);result.NdotL=saturateEps(result.NdotLUnclamped);return result;}\npreLightingInfo computeHemisphericPreLightingInfo(vec4 lightData,vec3 V,vec3 N) {preLightingInfo result;result.NdotL=dot(N,lightData.xyz)*0.5+0.5;result.NdotL=saturateEps(result.NdotL);result.NdotLUnclamped=result.NdotL;\n#ifdef SPECULARTERM\nresult.L=normalize(lightData.xyz);result.H=normalize(V+result.L);result.VdotH=saturate(dot(V,result.H));\n#endif\nreturn result;}`;\nY.IncludesShadersStore[TM] = xM;\nconst CM = \"pbrDirectLightingFalloffFunctions\", RM = `float computeDistanceLightFalloff_Standard(vec3 lightOffset,float range)\n{return max(0.,1.0-length(lightOffset)/range);}\nfloat computeDistanceLightFalloff_Physical(float lightDistanceSquared)\n{return 1.0/maxEps(lightDistanceSquared);}\nfloat computeDistanceLightFalloff_GLTF(float lightDistanceSquared,float inverseSquaredRange)\n{float lightDistanceFalloff=1.0/maxEps(lightDistanceSquared);float factor=lightDistanceSquared*inverseSquaredRange;float attenuation=saturate(1.0-factor*factor);attenuation*=attenuation;lightDistanceFalloff*=attenuation;return lightDistanceFalloff;}\nfloat computeDistanceLightFalloff(vec3 lightOffset,float lightDistanceSquared,float range,float inverseSquaredRange)\n{\n#ifdef USEPHYSICALLIGHTFALLOFF\nreturn computeDistanceLightFalloff_Physical(lightDistanceSquared);\n#elif defined(USEGLTFLIGHTFALLOFF)\nreturn computeDistanceLightFalloff_GLTF(lightDistanceSquared,inverseSquaredRange);\n#else\nreturn computeDistanceLightFalloff_Standard(lightOffset,range);\n#endif\n}\nfloat computeDirectionalLightFalloff_Standard(vec3 lightDirection,vec3 directionToLightCenterW,float cosHalfAngle,float exponent)\n{float falloff=0.0;float cosAngle=maxEps(dot(-lightDirection,directionToLightCenterW));if (cosAngle>=cosHalfAngle)\n{falloff=max(0.,pow(cosAngle,exponent));}\nreturn falloff;}\nfloat computeDirectionalLightFalloff_Physical(vec3 lightDirection,vec3 directionToLightCenterW,float cosHalfAngle)\n{const float kMinusLog2ConeAngleIntensityRatio=6.64385618977; \nfloat concentrationKappa=kMinusLog2ConeAngleIntensityRatio/(1.0-cosHalfAngle);vec4 lightDirectionSpreadSG=vec4(-lightDirection*concentrationKappa,-concentrationKappa);float falloff=exp2(dot(vec4(directionToLightCenterW,1.0),lightDirectionSpreadSG));return falloff;}\nfloat computeDirectionalLightFalloff_GLTF(vec3 lightDirection,vec3 directionToLightCenterW,float lightAngleScale,float lightAngleOffset)\n{float cd=dot(-lightDirection,directionToLightCenterW);float falloff=saturate(cd*lightAngleScale+lightAngleOffset);falloff*=falloff;return falloff;}\nfloat computeDirectionalLightFalloff(vec3 lightDirection,vec3 directionToLightCenterW,float cosHalfAngle,float exponent,float lightAngleScale,float lightAngleOffset)\n{\n#ifdef USEPHYSICALLIGHTFALLOFF\nreturn computeDirectionalLightFalloff_Physical(lightDirection,directionToLightCenterW,cosHalfAngle);\n#elif defined(USEGLTFLIGHTFALLOFF)\nreturn computeDirectionalLightFalloff_GLTF(lightDirection,directionToLightCenterW,lightAngleScale,lightAngleOffset);\n#else\nreturn computeDirectionalLightFalloff_Standard(lightDirection,directionToLightCenterW,cosHalfAngle,exponent);\n#endif\n}`;\nY.IncludesShadersStore[CM] = RM;\nconst SM = \"pbrBRDFFunctions\", yM = `#define FRESNEL_MAXIMUM_ON_ROUGH 0.25\n#ifdef MS_BRDF_ENERGY_CONSERVATION\nvec3 getEnergyConservationFactor(const vec3 specularEnvironmentR0,const vec3 environmentBrdf) {return 1.0+specularEnvironmentR0*(1.0/environmentBrdf.y-1.0);}\n#endif\n#ifdef ENVIRONMENTBRDF\nvec3 getBRDFLookup(float NdotV,float perceptualRoughness) {vec2 UV=vec2(NdotV,perceptualRoughness);vec4 brdfLookup=texture2D(environmentBrdfSampler,UV);\n#ifdef ENVIRONMENTBRDF_RGBD\nbrdfLookup.rgb=fromRGBD(brdfLookup.rgba);\n#endif\nreturn brdfLookup.rgb;}\nvec3 getReflectanceFromBRDFLookup(const vec3 specularEnvironmentR0,const vec3 specularEnvironmentR90,const vec3 environmentBrdf) {\n#ifdef BRDF_V_HEIGHT_CORRELATED\nvec3 reflectance=(specularEnvironmentR90-specularEnvironmentR0)*environmentBrdf.x+specularEnvironmentR0*environmentBrdf.y;\n#else\nvec3 reflectance=specularEnvironmentR0*environmentBrdf.x+specularEnvironmentR90*environmentBrdf.y;\n#endif\nreturn reflectance;}\nvec3 getReflectanceFromBRDFLookup(const vec3 specularEnvironmentR0,const vec3 environmentBrdf) {\n#ifdef BRDF_V_HEIGHT_CORRELATED\nvec3 reflectance=mix(environmentBrdf.xxx,environmentBrdf.yyy,specularEnvironmentR0);\n#else\nvec3 reflectance=specularEnvironmentR0*environmentBrdf.x+environmentBrdf.y;\n#endif\nreturn reflectance;}\n#endif\n/* NOT USED\n#if defined(SHEEN) && defined(SHEEN_SOFTER)\nfloat getBRDFLookupCharlieSheen(float NdotV,float perceptualRoughness)\n{float c=1.0-NdotV;float c3=c*c*c;return 0.65584461*c3+1.0/(4.16526551+exp(-7.97291361*perceptualRoughness+6.33516894));}\n#endif\n*/\n#if !defined(ENVIRONMENTBRDF) || defined(REFLECTIONMAP_SKYBOX) || defined(ALPHAFRESNEL)\nvec3 getReflectanceFromAnalyticalBRDFLookup_Jones(float VdotN,vec3 reflectance0,vec3 reflectance90,float smoothness)\n{float weight=mix(FRESNEL_MAXIMUM_ON_ROUGH,1.0,smoothness);return reflectance0+weight*(reflectance90-reflectance0)*pow5(saturate(1.0-VdotN));}\n#endif\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF)\n/**\n* The sheen BRDF not containing F can be easily stored in the blue channel of the BRDF texture.\n* The blue channel contains DCharlie*VAshikhmin*NdotL as a lokkup table\n*/\nvec3 getSheenReflectanceFromBRDFLookup(const vec3 reflectance0,const vec3 environmentBrdf) {vec3 sheenEnvironmentReflectance=reflectance0*environmentBrdf.b;return sheenEnvironmentReflectance;}\n#endif\nvec3 fresnelSchlickGGX(float VdotH,vec3 reflectance0,vec3 reflectance90)\n{return reflectance0+(reflectance90-reflectance0)*pow5(1.0-VdotH);}\nfloat fresnelSchlickGGX(float VdotH,float reflectance0,float reflectance90)\n{return reflectance0+(reflectance90-reflectance0)*pow5(1.0-VdotH);}\n#ifdef CLEARCOAT\nvec3 getR0RemappedForClearCoat(vec3 f0) {\n#ifdef CLEARCOAT_DEFAULTIOR\n#ifdef MOBILE\nreturn saturate(f0*(f0*0.526868+0.529324)-0.0482256);\n#else\nreturn saturate(f0*(f0*(0.941892-0.263008*f0)+0.346479)-0.0285998);\n#endif\n#else\nvec3 s=sqrt(f0);vec3 t=(vClearCoatRefractionParams.z+vClearCoatRefractionParams.w*s)/(vClearCoatRefractionParams.w+vClearCoatRefractionParams.z*s);return square(t);\n#endif\n}\n#endif\n#ifdef IRIDESCENCE\nconst mat3 XYZ_TO_REC709=mat3(\n3.2404542,-0.9692660, 0.0556434,\n-1.5371385, 1.8760108,-0.2040259,\n-0.4985314, 0.0415560, 1.0572252\n);vec3 getIORTfromAirToSurfaceR0(vec3 f0) {vec3 sqrtF0=sqrt(f0);return (1.+sqrtF0)/(1.-sqrtF0);}\nvec3 getR0fromIORs(vec3 iorT,float iorI) {return square((iorT-vec3(iorI))/(iorT+vec3(iorI)));}\nfloat getR0fromIORs(float iorT,float iorI) {return square((iorT-iorI)/(iorT+iorI));}\nvec3 evalSensitivity(float opd,vec3 shift) {float phase=2.0*PI*opd*1.0e-9;const vec3 val=vec3(5.4856e-13,4.4201e-13,5.2481e-13);const vec3 pos=vec3(1.6810e+06,1.7953e+06,2.2084e+06);const vec3 var=vec3(4.3278e+09,9.3046e+09,6.6121e+09);vec3 xyz=val*sqrt(2.0*PI*var)*cos(pos*phase+shift)*exp(-square(phase)*var);xyz.x+=9.7470e-14*sqrt(2.0*PI*4.5282e+09)*cos(2.2399e+06*phase+shift[0])*exp(-4.5282e+09*square(phase));xyz/=1.0685e-7;vec3 srgb=XYZ_TO_REC709*xyz;return srgb;}\nvec3 evalIridescence(float outsideIOR,float eta2,float cosTheta1,float thinFilmThickness,vec3 baseF0) {vec3 I=vec3(1.0);float iridescenceIOR=mix(outsideIOR,eta2,smoothstep(0.0,0.03,thinFilmThickness));float sinTheta2Sq=square(outsideIOR/iridescenceIOR)*(1.0-square(cosTheta1));float cosTheta2Sq=1.0-sinTheta2Sq;if (cosTheta2Sq<0.0) {return I;}\nfloat cosTheta2=sqrt(cosTheta2Sq);float R0=getR0fromIORs(iridescenceIOR,outsideIOR);float R12=fresnelSchlickGGX(cosTheta1,R0,1.);float R21=R12;float T121=1.0-R12;float phi12=0.0;if (iridescenceIOR0\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nfloat radicalInverse_VdC(uint bits) \n{bits=(bits<<16u) | (bits>>16u);bits=((bits & 0x55555555u)<<1u) | ((bits & 0xAAAAAAAAu)>>1u);bits=((bits & 0x33333333u)<<2u) | ((bits & 0xCCCCCCCCu)>>2u);bits=((bits & 0x0F0F0F0Fu)<<4u) | ((bits & 0xF0F0F0F0u)>>4u);bits=((bits & 0x00FF00FFu)<<8u) | ((bits & 0xFF00FF00u)>>8u);return float(bits)*2.3283064365386963e-10; }\nvec2 hammersley(uint i,uint N)\n{return vec2(float(i)/float(N),radicalInverse_VdC(i));}\n#else\nfloat vanDerCorpus(int n,int base)\n{float invBase=1.0/float(base);float denom =1.0;float result =0.0;for(int i=0; i<32; ++i)\n{if(n>0)\n{denom =mod(float(n),2.0);result+=denom*invBase;invBase=invBase/2.0;n =int(float(n)/2.0);}}\nreturn result;}\nvec2 hammersley(int i,int N)\n{return vec2(float(i)/float(N),vanDerCorpus(i,2));}\n#endif\nfloat log4(float x) {return log2(x)/2.;}\nconst float NUM_SAMPLES_FLOAT=float(NUM_SAMPLES);const float NUM_SAMPLES_FLOAT_INVERSED=1./NUM_SAMPLES_FLOAT;const float K=4.;\n#define inline\nvec3 irradiance(samplerCube inputTexture,vec3 inputN,vec2 filteringInfo)\n{vec3 n=normalize(inputN);vec3 result=vec3(0.0);vec3 tangent=abs(n.z)<0.999 ? vec3(0.,0.,1.) : vec3(1.,0.,0.);tangent=normalize(cross(tangent,n));vec3 bitangent=cross(n,tangent);mat3 tbn=mat3(tangent,bitangent,n);float maxLevel=filteringInfo.y;float dim0=filteringInfo.x;float omegaP=(4.*PI)/(6.*dim0*dim0);\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nfor(uint i=0u; i0.) {float pdf_inversed=PI/NoL;float omegaS=NUM_SAMPLES_FLOAT_INVERSED*pdf_inversed;float l=log4(omegaS)-log4(omegaP)+log4(K);float mipLevel=clamp(l,0.0,maxLevel);vec3 c=textureCubeLodEXT(inputTexture,tbn*Ls,mipLevel).rgb;\n#ifdef GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nresult+=c;}}\nresult=result*NUM_SAMPLES_FLOAT_INVERSED;return result;}\n#define inline\nvec3 radiance(float alphaG,samplerCube inputTexture,vec3 inputN,vec2 filteringInfo)\n{vec3 n=normalize(inputN);vec3 c=textureCube(inputTexture,n).rgb; \nif (alphaG==0.) {\n#ifdef GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nreturn c;} else {vec3 result=vec3(0.);vec3 tangent=abs(n.z)<0.999 ? vec3(0.,0.,1.) : vec3(1.,0.,0.);tangent=normalize(cross(tangent,n));vec3 bitangent=cross(n,tangent);mat3 tbn=mat3(tangent,bitangent,n);float maxLevel=filteringInfo.y;float dim0=filteringInfo.x;float omegaP=(4.*PI)/(6.*dim0*dim0);float weight=0.;\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nfor(uint i=0u; i0.) {float pdf_inversed=4./normalDistributionFunction_TrowbridgeReitzGGX(NoH,alphaG);float omegaS=NUM_SAMPLES_FLOAT_INVERSED*pdf_inversed;float l=log4(omegaS)-log4(omegaP)+log4(K);float mipLevel=clamp(float(l),0.0,maxLevel);weight+=NoL;vec3 c=textureCubeLodEXT(inputTexture,tbn*L,mipLevel).rgb;\n#ifdef GAMMA_INPUT\nc=toLinearSpace(c);\n#endif\nresult+=c*NoL;}}\nresult=result/weight;return result;}}\n#endif\n#endif\n`;\nY.IncludesShadersStore[IM] = bM;\nconst AM = \"pbrDirectLightingFunctions\", MM = `#define CLEARCOATREFLECTANCE90 1.0\nstruct lightingInfo\n{vec3 diffuse;\n#ifdef SPECULARTERM\nvec3 specular;\n#endif\n#ifdef CLEARCOAT\nvec4 clearCoat;\n#endif\n#ifdef SHEEN\nvec3 sheen;\n#endif\n};float adjustRoughnessFromLightProperties(float roughness,float lightRadius,float lightDistance) {\n#if defined(USEPHYSICALLIGHTFALLOFF) || defined(USEGLTFLIGHTFALLOFF)\nfloat lightRoughness=lightRadius/lightDistance;float totalRoughness=saturate(lightRoughness+roughness);return totalRoughness;\n#else\nreturn roughness;\n#endif\n}\nvec3 computeHemisphericDiffuseLighting(preLightingInfo info,vec3 lightColor,vec3 groundColor) {return mix(groundColor,lightColor,info.NdotL);}\nvec3 computeDiffuseLighting(preLightingInfo info,vec3 lightColor) {float diffuseTerm=diffuseBRDF_Burley(info.NdotL,info.NdotV,info.VdotH,info.roughness);return diffuseTerm*info.attenuation*info.NdotL*lightColor;}\n#define inline\nvec3 computeProjectionTextureDiffuseLighting(sampler2D projectionLightSampler,mat4 textureProjectionMatrix){vec4 strq=textureProjectionMatrix*vec4(vPositionW,1.0);strq/=strq.w;vec3 textureColor=texture2D(projectionLightSampler,strq.xy).rgb;return toLinearSpace(textureColor);}\n#ifdef SS_TRANSLUCENCY\nvec3 computeDiffuseAndTransmittedLighting(preLightingInfo info,vec3 lightColor,vec3 transmittance) {float NdotL=absEps(info.NdotLUnclamped);float wrapNdotL=computeWrappedDiffuseNdotL(NdotL,0.02);float trAdapt=step(0.,info.NdotLUnclamped);vec3 transmittanceNdotL=mix(transmittance*wrapNdotL,vec3(wrapNdotL),trAdapt);float diffuseTerm=diffuseBRDF_Burley(NdotL,info.NdotV,info.VdotH,info.roughness);return diffuseTerm*transmittanceNdotL*info.attenuation*lightColor;}\n#endif\n#ifdef SPECULARTERM\nvec3 computeSpecularLighting(preLightingInfo info,vec3 N,vec3 reflectance0,vec3 reflectance90,float geometricRoughnessFactor,vec3 lightColor) {float NdotH=saturateEps(dot(N,info.H));float roughness=max(info.roughness,geometricRoughnessFactor);float alphaG=convertRoughnessToAverageSlope(roughness);vec3 fresnel=fresnelSchlickGGX(info.VdotH,reflectance0,reflectance90);\n#ifdef IRIDESCENCE\nfresnel=mix(fresnel,reflectance0,info.iridescenceIntensity);\n#endif\nfloat distribution=normalDistributionFunction_TrowbridgeReitzGGX(NdotH,alphaG);\n#ifdef BRDF_V_HEIGHT_CORRELATED\nfloat smithVisibility=smithVisibility_GGXCorrelated(info.NdotL,info.NdotV,alphaG);\n#else\nfloat smithVisibility=smithVisibility_TrowbridgeReitzGGXFast(info.NdotL,info.NdotV,alphaG);\n#endif\nvec3 specTerm=fresnel*distribution*smithVisibility;return specTerm*info.attenuation*info.NdotL*lightColor;}\n#endif\n#ifdef ANISOTROPIC\nvec3 computeAnisotropicSpecularLighting(preLightingInfo info,vec3 V,vec3 N,vec3 T,vec3 B,float anisotropy,vec3 reflectance0,vec3 reflectance90,float geometricRoughnessFactor,vec3 lightColor) {float NdotH=saturateEps(dot(N,info.H));float TdotH=dot(T,info.H);float BdotH=dot(B,info.H);float TdotV=dot(T,V);float BdotV=dot(B,V);float TdotL=dot(T,info.L);float BdotL=dot(B,info.L);float alphaG=convertRoughnessToAverageSlope(info.roughness);vec2 alphaTB=getAnisotropicRoughness(alphaG,anisotropy);alphaTB=max(alphaTB,square(geometricRoughnessFactor));vec3 fresnel=fresnelSchlickGGX(info.VdotH,reflectance0,reflectance90);\n#ifdef IRIDESCENCE\nfresnel=mix(fresnel,reflectance0,info.iridescenceIntensity);\n#endif\nfloat distribution=normalDistributionFunction_BurleyGGX_Anisotropic(NdotH,TdotH,BdotH,alphaTB);float smithVisibility=smithVisibility_GGXCorrelated_Anisotropic(info.NdotL,info.NdotV,TdotV,BdotV,TdotL,BdotL,alphaTB);vec3 specTerm=fresnel*distribution*smithVisibility;return specTerm*info.attenuation*info.NdotL*lightColor;}\n#endif\n#ifdef CLEARCOAT\nvec4 computeClearCoatLighting(preLightingInfo info,vec3 Ncc,float geometricRoughnessFactor,float clearCoatIntensity,vec3 lightColor) {float NccdotL=saturateEps(dot(Ncc,info.L));float NccdotH=saturateEps(dot(Ncc,info.H));float clearCoatRoughness=max(info.roughness,geometricRoughnessFactor);float alphaG=convertRoughnessToAverageSlope(clearCoatRoughness);float fresnel=fresnelSchlickGGX(info.VdotH,vClearCoatRefractionParams.x,CLEARCOATREFLECTANCE90);fresnel*=clearCoatIntensity;float distribution=normalDistributionFunction_TrowbridgeReitzGGX(NccdotH,alphaG);float kelemenVisibility=visibility_Kelemen(info.VdotH);float clearCoatTerm=fresnel*distribution*kelemenVisibility;return vec4(\nclearCoatTerm*info.attenuation*NccdotL*lightColor,\n1.0-fresnel\n);}\nvec3 computeClearCoatLightingAbsorption(float NdotVRefract,vec3 L,vec3 Ncc,vec3 clearCoatColor,float clearCoatThickness,float clearCoatIntensity) {vec3 LRefract=-refract(L,Ncc,vClearCoatRefractionParams.y);float NdotLRefract=saturateEps(dot(Ncc,LRefract));vec3 absorption=computeClearCoatAbsorption(NdotVRefract,NdotLRefract,clearCoatColor,clearCoatThickness,clearCoatIntensity);return absorption;}\n#endif\n#ifdef SHEEN\nvec3 computeSheenLighting(preLightingInfo info,vec3 N,vec3 reflectance0,vec3 reflectance90,float geometricRoughnessFactor,vec3 lightColor) {float NdotH=saturateEps(dot(N,info.H));float roughness=max(info.roughness,geometricRoughnessFactor);float alphaG=convertRoughnessToAverageSlope(roughness);float fresnel=1.;float distribution=normalDistributionFunction_CharlieSheen(NdotH,alphaG);/*#ifdef SHEEN_SOFTER\nfloat visibility=visibility_CharlieSheen(info.NdotL,info.NdotV,alphaG);\n#else */\nfloat visibility=visibility_Ashikhmin(info.NdotL,info.NdotV);/* #endif */\nfloat sheenTerm=fresnel*distribution*visibility;return sheenTerm*info.attenuation*info.NdotL*lightColor;}\n#endif\n`;\nY.IncludesShadersStore[AM] = MM;\nconst PM = \"pbrIBLFunctions\", OM = `#if defined(REFLECTION) || defined(SS_REFRACTION)\nfloat getLodFromAlphaG(float cubeMapDimensionPixels,float microsurfaceAverageSlope) {float microsurfaceAverageSlopeTexels=cubeMapDimensionPixels*microsurfaceAverageSlope;float lod=log2(microsurfaceAverageSlopeTexels);return lod;}\nfloat getLinearLodFromRoughness(float cubeMapDimensionPixels,float roughness) {float lod=log2(cubeMapDimensionPixels)*roughness;return lod;}\n#endif\n#if defined(ENVIRONMENTBRDF) && defined(RADIANCEOCCLUSION)\nfloat environmentRadianceOcclusion(float ambientOcclusion,float NdotVUnclamped) {float temp=NdotVUnclamped+ambientOcclusion;return saturate(square(temp)-1.0+ambientOcclusion);}\n#endif\n#if defined(ENVIRONMENTBRDF) && defined(HORIZONOCCLUSION)\nfloat environmentHorizonOcclusion(vec3 view,vec3 normal,vec3 geometricNormal) {vec3 reflection=reflect(view,normal);float temp=saturate(1.0+1.1*dot(reflection,geometricNormal));return square(temp);}\n#endif\n#if defined(LODINREFLECTIONALPHA) || defined(SS_LODINREFRACTIONALPHA)\n#define UNPACK_LOD(x) (1.0-x)*255.0\nfloat getLodFromAlphaG(float cubeMapDimensionPixels,float alphaG,float NdotV) {float microsurfaceAverageSlope=alphaG;microsurfaceAverageSlope*=sqrt(abs(NdotV));return getLodFromAlphaG(cubeMapDimensionPixels,microsurfaceAverageSlope);}\n#endif\n`;\nY.IncludesShadersStore[PM] = OM;\nconst DM = \"pbrBlockAlbedoOpacity\", NM = `struct albedoOpacityOutParams\n{vec3 surfaceAlbedo;float alpha;};\n#define pbr_inline\nvoid albedoOpacityBlock(\nin vec4 vAlbedoColor,\n#ifdef ALBEDO\nin vec4 albedoTexture,\nin vec2 albedoInfos,\n#endif\n#ifdef OPACITY\nin vec4 opacityMap,\nin vec2 vOpacityInfos,\n#endif\n#ifdef DETAIL\nin vec4 detailColor,\nin vec4 vDetailInfos,\n#endif\n#ifdef DECAL\nin vec4 decalColor,\nin vec4 vDecalInfos,\n#endif\nout albedoOpacityOutParams outParams\n)\n{vec3 surfaceAlbedo=vAlbedoColor.rgb;float alpha=vAlbedoColor.a;\n#ifdef ALBEDO\n#if defined(ALPHAFROMALBEDO) || defined(ALPHATEST)\nalpha*=albedoTexture.a;\n#endif\n#ifdef GAMMAALBEDO\nsurfaceAlbedo*=toLinearSpace(albedoTexture.rgb);\n#else\nsurfaceAlbedo*=albedoTexture.rgb;\n#endif\nsurfaceAlbedo*=albedoInfos.y;\n#endif\n#ifndef DECAL_AFTER_DETAIL\n#include\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nsurfaceAlbedo*=vColor.rgb;\n#endif\n#ifdef DETAIL\nfloat detailAlbedo=2.0*mix(0.5,detailColor.r,vDetailInfos.y);surfaceAlbedo.rgb=surfaceAlbedo.rgb*detailAlbedo*detailAlbedo; \n#endif\n#ifdef DECAL_AFTER_DETAIL\n#include\n#endif\n#define CUSTOM_FRAGMENT_UPDATE_ALBEDO\n#ifdef OPACITY\n#ifdef OPACITYRGB\nalpha=getLuminance(opacityMap.rgb);\n#else\nalpha*=opacityMap.a;\n#endif\nalpha*=vOpacityInfos.y;\n#endif\n#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nalpha*=vColor.a;\n#endif\n#if !defined(SS_LINKREFRACTIONTOTRANSPARENCY) && !defined(ALPHAFRESNEL)\n#ifdef ALPHATEST \n#if DEBUGMODE != 88\nif (alpha0\n#ifdef METALLICWORKFLOW\nvec2 metallicRoughness;\n#ifdef REFLECTIVITY\nvec4 surfaceMetallicColorMap;\n#endif\n#ifndef FROSTBITE_REFLECTANCE\nvec3 metallicF0;\n#endif\n#else\n#ifdef REFLECTIVITY\nvec4 surfaceReflectivityColorMap;\n#endif\n#endif\n#endif\n};\n#define pbr_inline\nvoid reflectivityBlock(\nin vec4 vReflectivityColor,\n#ifdef METALLICWORKFLOW\nin vec3 surfaceAlbedo,\nin vec4 metallicReflectanceFactors,\n#endif\n#ifdef REFLECTIVITY\nin vec3 reflectivityInfos,\nin vec4 surfaceMetallicOrReflectivityColorMap,\n#endif\n#if defined(METALLICWORKFLOW) && defined(REFLECTIVITY) && defined(AOSTOREINMETALMAPRED)\nin vec3 ambientOcclusionColorIn,\n#endif\n#ifdef MICROSURFACEMAP\nin vec4 microSurfaceTexel,\n#endif\n#ifdef DETAIL\nin vec4 detailColor,\nin vec4 vDetailInfos,\n#endif\nout reflectivityOutParams outParams\n)\n{float microSurface=vReflectivityColor.a;vec3 surfaceReflectivityColor=vReflectivityColor.rgb;\n#ifdef METALLICWORKFLOW\nvec2 metallicRoughness=surfaceReflectivityColor.rg;\n#ifdef REFLECTIVITY\n#if DEBUGMODE>0\noutParams.surfaceMetallicColorMap=surfaceMetallicOrReflectivityColorMap;\n#endif\n#ifdef AOSTOREINMETALMAPRED\nvec3 aoStoreInMetalMap=vec3(surfaceMetallicOrReflectivityColorMap.r,surfaceMetallicOrReflectivityColorMap.r,surfaceMetallicOrReflectivityColorMap.r);outParams.ambientOcclusionColor=mix(ambientOcclusionColorIn,aoStoreInMetalMap,reflectivityInfos.z);\n#endif\n#ifdef METALLNESSSTOREINMETALMAPBLUE\nmetallicRoughness.r*=surfaceMetallicOrReflectivityColorMap.b;\n#else\nmetallicRoughness.r*=surfaceMetallicOrReflectivityColorMap.r;\n#endif\n#ifdef ROUGHNESSSTOREINMETALMAPALPHA\nmetallicRoughness.g*=surfaceMetallicOrReflectivityColorMap.a;\n#else\n#ifdef ROUGHNESSSTOREINMETALMAPGREEN\nmetallicRoughness.g*=surfaceMetallicOrReflectivityColorMap.g;\n#endif\n#endif\n#endif\n#ifdef DETAIL\nfloat detailRoughness=mix(0.5,detailColor.b,vDetailInfos.w);float loLerp=mix(0.,metallicRoughness.g,detailRoughness*2.);float hiLerp=mix(metallicRoughness.g,1.,(detailRoughness-0.5)*2.);metallicRoughness.g=mix(loLerp,hiLerp,step(detailRoughness,0.5));\n#endif\n#ifdef MICROSURFACEMAP\nmetallicRoughness.g*=microSurfaceTexel.r;\n#endif\n#if DEBUGMODE>0\noutParams.metallicRoughness=metallicRoughness;\n#endif\n#define CUSTOM_FRAGMENT_UPDATE_METALLICROUGHNESS\nmicroSurface=1.0-metallicRoughness.g;vec3 baseColor=surfaceAlbedo;\n#ifdef FROSTBITE_REFLECTANCE\noutParams.surfaceAlbedo=baseColor.rgb*(1.0-metallicRoughness.r);surfaceReflectivityColor=mix(0.16*reflectance*reflectance,baseColor,metallicRoughness.r);\n#else\nvec3 metallicF0=metallicReflectanceFactors.rgb;\n#if DEBUGMODE>0\noutParams.metallicF0=metallicF0;\n#endif\noutParams.surfaceAlbedo=mix(baseColor.rgb*(1.0-metallicF0),vec3(0.,0.,0.),metallicRoughness.r);surfaceReflectivityColor=mix(metallicF0,baseColor,metallicRoughness.r);\n#endif\n#else\n#ifdef REFLECTIVITY\nsurfaceReflectivityColor*=surfaceMetallicOrReflectivityColorMap.rgb;\n#if DEBUGMODE>0\noutParams.surfaceReflectivityColorMap=surfaceMetallicOrReflectivityColorMap;\n#endif\n#ifdef MICROSURFACEFROMREFLECTIVITYMAP\nmicroSurface*=surfaceMetallicOrReflectivityColorMap.a;microSurface*=reflectivityInfos.z;\n#else\n#ifdef MICROSURFACEAUTOMATIC\nmicroSurface*=computeDefaultMicroSurface(microSurface,surfaceReflectivityColor);\n#endif\n#ifdef MICROSURFACEMAP\nmicroSurface*=microSurfaceTexel.r;\n#endif\n#define CUSTOM_FRAGMENT_UPDATE_MICROSURFACE\n#endif\n#endif\n#endif\nmicroSurface=saturate(microSurface);float roughness=1.-microSurface;outParams.microSurface=microSurface;outParams.roughness=roughness;outParams.surfaceReflectivityColor=surfaceReflectivityColor;}\n`;\nY.IncludesShadersStore[FM] = LM;\nconst wM = \"pbrBlockAmbientOcclusion\", UM = `struct ambientOcclusionOutParams\n{vec3 ambientOcclusionColor;\n#if DEBUGMODE>0 && defined(AMBIENT)\nvec3 ambientOcclusionColorMap;\n#endif\n};\n#define pbr_inline\nvoid ambientOcclusionBlock(\n#ifdef AMBIENT\nin vec3 ambientOcclusionColorMap_,\nin vec4 vAmbientInfos,\n#endif\nout ambientOcclusionOutParams outParams\n)\n{vec3 ambientOcclusionColor=vec3(1.,1.,1.);\n#ifdef AMBIENT\nvec3 ambientOcclusionColorMap=ambientOcclusionColorMap_*vAmbientInfos.y;\n#ifdef AMBIENTINGRAYSCALE\nambientOcclusionColorMap=vec3(ambientOcclusionColorMap.r,ambientOcclusionColorMap.r,ambientOcclusionColorMap.r);\n#endif\nambientOcclusionColor=mix(ambientOcclusionColor,ambientOcclusionColorMap,vAmbientInfos.z);\n#if DEBUGMODE>0\noutParams.ambientOcclusionColorMap=ambientOcclusionColorMap;\n#endif\n#endif\noutParams.ambientOcclusionColor=ambientOcclusionColor;}\n`;\nY.IncludesShadersStore[wM] = UM;\nconst VM = \"pbrBlockAlphaFresnel\", BM = `#ifdef ALPHAFRESNEL\n#if defined(ALPHATEST) || defined(ALPHABLEND)\nstruct alphaFresnelOutParams\n{float alpha;};\n#define pbr_inline\nvoid alphaFresnelBlock(\nin vec3 normalW,\nin vec3 viewDirectionW,\nin float alpha,\nin float microSurface,\nout alphaFresnelOutParams outParams\n)\n{float opacityPerceptual=alpha;\n#ifdef LINEARALPHAFRESNEL\nfloat opacity0=opacityPerceptual;\n#else\nfloat opacity0=opacityPerceptual*opacityPerceptual;\n#endif\nfloat opacity90=fresnelGrazingReflectance(opacity0);vec3 normalForward=faceforward(normalW,-viewDirectionW,normalW);outParams.alpha=getReflectanceFromAnalyticalBRDFLookup_Jones(saturate(dot(viewDirectionW,normalForward)),vec3(opacity0),vec3(opacity90),sqrt(microSurface)).x;\n#ifdef ALPHATEST\nif (outParams.alpha0 && defined(ANISOTROPIC_TEXTURE)\nvec3 anisotropyMapData;\n#endif\n};\n#define pbr_inline\nvoid anisotropicBlock(\nin vec3 vAnisotropy,\nin float roughness,\n#ifdef ANISOTROPIC_TEXTURE\nin vec3 anisotropyMapData,\n#endif\nin mat3 TBN,\nin vec3 normalW,\nin vec3 viewDirectionW,\nout anisotropicOutParams outParams\n)\n{float anisotropy=vAnisotropy.b;vec3 anisotropyDirection=vec3(vAnisotropy.xy,0.);\n#ifdef ANISOTROPIC_TEXTURE\nanisotropy*=anisotropyMapData.b;\n#if DEBUGMODE>0\noutParams.anisotropyMapData=anisotropyMapData;\n#endif\nanisotropyMapData.rg=anisotropyMapData.rg*2.0-1.0;\n#ifdef ANISOTROPIC_LEGACY\nanisotropyDirection.rg*=anisotropyMapData.rg;\n#else\nanisotropyDirection.xy=mat2(anisotropyDirection.x,anisotropyDirection.y,-anisotropyDirection.y,anisotropyDirection.x)*normalize(anisotropyMapData.rg);\n#endif\n#endif\nmat3 anisoTBN=mat3(normalize(TBN[0]),normalize(TBN[1]),normalize(TBN[2]));vec3 anisotropicTangent=normalize(anisoTBN*anisotropyDirection);vec3 anisotropicBitangent=normalize(cross(anisoTBN[2],anisotropicTangent));outParams.anisotropy=anisotropy;outParams.anisotropicTangent=anisotropicTangent;outParams.anisotropicBitangent=anisotropicBitangent;outParams.anisotropicNormal=getAnisotropicBentNormals(anisotropicTangent,anisotropicBitangent,normalW,viewDirectionW,anisotropy,roughness);}\n#endif\n`;\nY.IncludesShadersStore[kM] = zM;\nconst WM = \"pbrBlockReflection\", GM = `#ifdef REFLECTION\nstruct reflectionOutParams\n{vec4 environmentRadiance;vec3 environmentIrradiance;\n#ifdef REFLECTIONMAP_3D\nvec3 reflectionCoords;\n#else\nvec2 reflectionCoords;\n#endif\n#ifdef SS_TRANSLUCENCY\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\nvec3 irradianceVector;\n#endif\n#endif\n#endif\n};\n#define pbr_inline\nvoid createReflectionCoords(\nin vec3 vPositionW,\nin vec3 normalW,\n#ifdef ANISOTROPIC\nin anisotropicOutParams anisotropicOut,\n#endif\n#ifdef REFLECTIONMAP_3D\nout vec3 reflectionCoords\n#else\nout vec2 reflectionCoords\n#endif\n)\n{\n#ifdef ANISOTROPIC\nvec3 reflectionVector=computeReflectionCoords(vec4(vPositionW,1.0),anisotropicOut.anisotropicNormal);\n#else\nvec3 reflectionVector=computeReflectionCoords(vec4(vPositionW,1.0),normalW);\n#endif\n#ifdef REFLECTIONMAP_OPPOSITEZ\nreflectionVector.z*=-1.0;\n#endif\n#ifdef REFLECTIONMAP_3D\nreflectionCoords=reflectionVector;\n#else\nreflectionCoords=reflectionVector.xy;\n#ifdef REFLECTIONMAP_PROJECTION\nreflectionCoords/=reflectionVector.z;\n#endif\nreflectionCoords.y=1.0-reflectionCoords.y;\n#endif\n}\n#define pbr_inline\n#define inline\nvoid sampleReflectionTexture(\nin float alphaG,\nin vec3 vReflectionMicrosurfaceInfos,\nin vec2 vReflectionInfos,\nin vec3 vReflectionColor,\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nin float NdotVUnclamped,\n#endif\n#ifdef LINEARSPECULARREFLECTION\nin float roughness,\n#endif\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSampler,\nconst vec3 reflectionCoords,\n#else\nin sampler2D reflectionSampler,\nconst vec2 reflectionCoords,\n#endif\n#ifndef LODBASEDMICROSFURACE\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSamplerLow,\nin samplerCube reflectionSamplerHigh,\n#else\nin sampler2D reflectionSamplerLow,\nin sampler2D reflectionSamplerHigh,\n#endif\n#endif\n#ifdef REALTIME_FILTERING\nin vec2 vReflectionFilteringInfo,\n#endif\nout vec4 environmentRadiance\n)\n{\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nfloat reflectionLOD=getLodFromAlphaG(vReflectionMicrosurfaceInfos.x,alphaG,NdotVUnclamped);\n#elif defined(LINEARSPECULARREFLECTION)\nfloat reflectionLOD=getLinearLodFromRoughness(vReflectionMicrosurfaceInfos.x,roughness);\n#else\nfloat reflectionLOD=getLodFromAlphaG(vReflectionMicrosurfaceInfos.x,alphaG);\n#endif\n#ifdef LODBASEDMICROSFURACE\nreflectionLOD=reflectionLOD*vReflectionMicrosurfaceInfos.y+vReflectionMicrosurfaceInfos.z;\n#ifdef LODINREFLECTIONALPHA\nfloat automaticReflectionLOD=UNPACK_LOD(sampleReflection(reflectionSampler,reflectionCoords).a);float requestedReflectionLOD=max(automaticReflectionLOD,reflectionLOD);\n#else\nfloat requestedReflectionLOD=reflectionLOD;\n#endif\n#ifdef REALTIME_FILTERING\nenvironmentRadiance=vec4(radiance(alphaG,reflectionSampler,reflectionCoords,vReflectionFilteringInfo),1.0);\n#else\nenvironmentRadiance=sampleReflectionLod(reflectionSampler,reflectionCoords,reflectionLOD);\n#endif\n#else\nfloat lodReflectionNormalized=saturate(reflectionLOD/log2(vReflectionMicrosurfaceInfos.x));float lodReflectionNormalizedDoubled=lodReflectionNormalized*2.0;vec4 environmentMid=sampleReflection(reflectionSampler,reflectionCoords);if (lodReflectionNormalizedDoubled<1.0){environmentRadiance=mix(\nsampleReflection(reflectionSamplerHigh,reflectionCoords),\nenvironmentMid,\nlodReflectionNormalizedDoubled\n);} else {environmentRadiance=mix(\nenvironmentMid,\nsampleReflection(reflectionSamplerLow,reflectionCoords),\nlodReflectionNormalizedDoubled-1.0\n);}\n#endif\n#ifdef RGBDREFLECTION\nenvironmentRadiance.rgb=fromRGBD(environmentRadiance);\n#endif\n#ifdef GAMMAREFLECTION\nenvironmentRadiance.rgb=toLinearSpace(environmentRadiance.rgb);\n#endif\nenvironmentRadiance.rgb*=vReflectionInfos.x;environmentRadiance.rgb*=vReflectionColor.rgb;}\n#define pbr_inline\n#define inline\nvoid reflectionBlock(\nin vec3 vPositionW,\nin vec3 normalW,\nin float alphaG,\nin vec3 vReflectionMicrosurfaceInfos,\nin vec2 vReflectionInfos,\nin vec3 vReflectionColor,\n#ifdef ANISOTROPIC\nin anisotropicOutParams anisotropicOut,\n#endif\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nin float NdotVUnclamped,\n#endif\n#ifdef LINEARSPECULARREFLECTION\nin float roughness,\n#endif\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSampler,\n#else\nin sampler2D reflectionSampler,\n#endif\n#if defined(NORMAL) && defined(USESPHERICALINVERTEX)\nin vec3 vEnvironmentIrradiance,\n#endif\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\nin mat4 reflectionMatrix,\n#endif\n#endif\n#ifdef USEIRRADIANCEMAP\n#ifdef REFLECTIONMAP_3D\nin samplerCube irradianceSampler,\n#else\nin sampler2D irradianceSampler,\n#endif\n#endif\n#ifndef LODBASEDMICROSFURACE\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSamplerLow,\nin samplerCube reflectionSamplerHigh,\n#else\nin sampler2D reflectionSamplerLow,\nin sampler2D reflectionSamplerHigh,\n#endif\n#endif\n#ifdef REALTIME_FILTERING\nin vec2 vReflectionFilteringInfo,\n#endif\nout reflectionOutParams outParams\n)\n{vec4 environmentRadiance=vec4(0.,0.,0.,0.);\n#ifdef REFLECTIONMAP_3D\nvec3 reflectionCoords=vec3(0.);\n#else\nvec2 reflectionCoords=vec2(0.);\n#endif\ncreateReflectionCoords(\nvPositionW,\nnormalW,\n#ifdef ANISOTROPIC\nanisotropicOut,\n#endif\nreflectionCoords\n);sampleReflectionTexture(\nalphaG,\nvReflectionMicrosurfaceInfos,\nvReflectionInfos,\nvReflectionColor,\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nNdotVUnclamped,\n#endif\n#ifdef LINEARSPECULARREFLECTION\nroughness,\n#endif\n#ifdef REFLECTIONMAP_3D\nreflectionSampler,\nreflectionCoords,\n#else\nreflectionSampler,\nreflectionCoords,\n#endif\n#ifndef LODBASEDMICROSFURACE\nreflectionSamplerLow,\nreflectionSamplerHigh,\n#endif\n#ifdef REALTIME_FILTERING\nvReflectionFilteringInfo,\n#endif\nenvironmentRadiance\n);vec3 environmentIrradiance=vec3(0.,0.,0.);\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#if defined(NORMAL) && defined(USESPHERICALINVERTEX)\nenvironmentIrradiance=vEnvironmentIrradiance;\n#else\n#ifdef ANISOTROPIC\nvec3 irradianceVector=vec3(reflectionMatrix*vec4(anisotropicOut.anisotropicNormal,0)).xyz;\n#else\nvec3 irradianceVector=vec3(reflectionMatrix*vec4(normalW,0)).xyz;\n#endif\n#ifdef REFLECTIONMAP_OPPOSITEZ\nirradianceVector.z*=-1.0;\n#endif\n#ifdef INVERTCUBICMAP\nirradianceVector.y*=-1.0;\n#endif\n#if defined(REALTIME_FILTERING)\nenvironmentIrradiance=irradiance(reflectionSampler,irradianceVector,vReflectionFilteringInfo);\n#else\nenvironmentIrradiance=computeEnvironmentIrradiance(irradianceVector);\n#endif\n#ifdef SS_TRANSLUCENCY\noutParams.irradianceVector=irradianceVector;\n#endif\n#endif\n#elif defined(USEIRRADIANCEMAP)\nvec4 environmentIrradiance4=sampleReflection(irradianceSampler,reflectionCoords);environmentIrradiance=environmentIrradiance4.rgb;\n#ifdef RGBDREFLECTION\nenvironmentIrradiance.rgb=fromRGBD(environmentIrradiance4);\n#endif\n#ifdef GAMMAREFLECTION\nenvironmentIrradiance.rgb=toLinearSpace(environmentIrradiance.rgb);\n#endif\n#endif\nenvironmentIrradiance*=vReflectionColor.rgb;outParams.environmentRadiance=environmentRadiance;outParams.environmentIrradiance=environmentIrradiance;outParams.reflectionCoords=reflectionCoords;}\n#endif\n`;\nY.IncludesShadersStore[WM] = GM;\nconst XM = \"pbrBlockSheen\", HM = `#ifdef SHEEN\nstruct sheenOutParams\n{float sheenIntensity;vec3 sheenColor;float sheenRoughness;\n#ifdef SHEEN_LINKWITHALBEDO\nvec3 surfaceAlbedo;\n#endif\n#if defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)\nfloat sheenAlbedoScaling;\n#endif\n#if defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nvec3 finalSheenRadianceScaled;\n#endif\n#if DEBUGMODE>0\n#ifdef SHEEN_TEXTURE\nvec4 sheenMapData;\n#endif\n#if defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nvec3 sheenEnvironmentReflectance;\n#endif\n#endif\n};\n#define pbr_inline\n#define inline\nvoid sheenBlock(\nin vec4 vSheenColor,\n#ifdef SHEEN_ROUGHNESS\nin float vSheenRoughness,\n#if defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE)\nin vec4 sheenMapRoughnessData,\n#endif\n#endif\nin float roughness,\n#ifdef SHEEN_TEXTURE\nin vec4 sheenMapData,\nin float sheenMapLevel,\n#endif\nin float reflectance,\n#ifdef SHEEN_LINKWITHALBEDO\nin vec3 baseColor,\nin vec3 surfaceAlbedo,\n#endif\n#ifdef ENVIRONMENTBRDF\nin float NdotV,\nin vec3 environmentBrdf,\n#endif\n#if defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nin vec2 AARoughnessFactors,\nin vec3 vReflectionMicrosurfaceInfos,\nin vec2 vReflectionInfos,\nin vec3 vReflectionColor,\nin vec4 vLightingIntensity,\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSampler,\nin vec3 reflectionCoords,\n#else\nin sampler2D reflectionSampler,\nin vec2 reflectionCoords,\n#endif\nin float NdotVUnclamped,\n#ifndef LODBASEDMICROSFURACE\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSamplerLow,\nin samplerCube reflectionSamplerHigh,\n#else\nin sampler2D reflectionSamplerLow,\nin sampler2D reflectionSamplerHigh,\n#endif\n#endif\n#ifdef REALTIME_FILTERING\nin vec2 vReflectionFilteringInfo,\n#endif\n#if !defined(REFLECTIONMAP_SKYBOX) && defined(RADIANCEOCCLUSION)\nin float seo,\n#endif\n#if !defined(REFLECTIONMAP_SKYBOX) && defined(HORIZONOCCLUSION) && defined(BUMP) && defined(REFLECTIONMAP_3D)\nin float eho,\n#endif\n#endif\nout sheenOutParams outParams\n)\n{float sheenIntensity=vSheenColor.a;\n#ifdef SHEEN_TEXTURE\n#if DEBUGMODE>0\noutParams.sheenMapData=sheenMapData;\n#endif\n#endif\n#ifdef SHEEN_LINKWITHALBEDO\nfloat sheenFactor=pow5(1.0-sheenIntensity);vec3 sheenColor=baseColor.rgb*(1.0-sheenFactor);float sheenRoughness=sheenIntensity;outParams.surfaceAlbedo=surfaceAlbedo*sheenFactor;\n#ifdef SHEEN_TEXTURE\nsheenIntensity*=sheenMapData.a;\n#endif\n#else\nvec3 sheenColor=vSheenColor.rgb;\n#ifdef SHEEN_TEXTURE\n#ifdef SHEEN_GAMMATEXTURE\nsheenColor.rgb*=toLinearSpace(sheenMapData.rgb);\n#else\nsheenColor.rgb*=sheenMapData.rgb;\n#endif\nsheenColor.rgb*=sheenMapLevel;\n#endif\n#ifdef SHEEN_ROUGHNESS\nfloat sheenRoughness=vSheenRoughness;\n#ifdef SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE\n#if defined(SHEEN_TEXTURE)\nsheenRoughness*=sheenMapData.a;\n#endif\n#elif defined(SHEEN_TEXTURE_ROUGHNESS)\n#ifdef SHEEN_TEXTURE_ROUGHNESS_IDENTICAL\nsheenRoughness*=sheenMapData.a;\n#else\nsheenRoughness*=sheenMapRoughnessData.a;\n#endif\n#endif\n#else\nfloat sheenRoughness=roughness;\n#ifdef SHEEN_TEXTURE\nsheenIntensity*=sheenMapData.a;\n#endif\n#endif\n#if !defined(SHEEN_ALBEDOSCALING)\nsheenIntensity*=(1.-reflectance);\n#endif\nsheenColor*=sheenIntensity;\n#endif\n#ifdef ENVIRONMENTBRDF\n/*#ifdef SHEEN_SOFTER\nvec3 environmentSheenBrdf=vec3(0.,0.,getBRDFLookupCharlieSheen(NdotV,sheenRoughness));\n#else*/\n#ifdef SHEEN_ROUGHNESS\nvec3 environmentSheenBrdf=getBRDFLookup(NdotV,sheenRoughness);\n#else\nvec3 environmentSheenBrdf=environmentBrdf;\n#endif\n/*#endif*/\n#endif\n#if defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nfloat sheenAlphaG=convertRoughnessToAverageSlope(sheenRoughness);\n#ifdef SPECULARAA\nsheenAlphaG+=AARoughnessFactors.y;\n#endif\nvec4 environmentSheenRadiance=vec4(0.,0.,0.,0.);sampleReflectionTexture(\nsheenAlphaG,\nvReflectionMicrosurfaceInfos,\nvReflectionInfos,\nvReflectionColor,\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nNdotVUnclamped,\n#endif\n#ifdef LINEARSPECULARREFLECTION\nsheenRoughness,\n#endif\nreflectionSampler,\nreflectionCoords,\n#ifndef LODBASEDMICROSFURACE\nreflectionSamplerLow,\nreflectionSamplerHigh,\n#endif\n#ifdef REALTIME_FILTERING\nvReflectionFilteringInfo,\n#endif\nenvironmentSheenRadiance\n);vec3 sheenEnvironmentReflectance=getSheenReflectanceFromBRDFLookup(sheenColor,environmentSheenBrdf);\n#if !defined(REFLECTIONMAP_SKYBOX) && defined(RADIANCEOCCLUSION)\nsheenEnvironmentReflectance*=seo;\n#endif\n#if !defined(REFLECTIONMAP_SKYBOX) && defined(HORIZONOCCLUSION) && defined(BUMP) && defined(REFLECTIONMAP_3D)\nsheenEnvironmentReflectance*=eho;\n#endif\n#if DEBUGMODE>0\noutParams.sheenEnvironmentReflectance=sheenEnvironmentReflectance;\n#endif\noutParams.finalSheenRadianceScaled=\nenvironmentSheenRadiance.rgb *\nsheenEnvironmentReflectance *\nvLightingIntensity.z;\n#endif\n#if defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)\noutParams.sheenAlbedoScaling=1.0-sheenIntensity*max(max(sheenColor.r,sheenColor.g),sheenColor.b)*environmentSheenBrdf.b;\n#endif\noutParams.sheenIntensity=sheenIntensity;outParams.sheenColor=sheenColor;outParams.sheenRoughness=sheenRoughness;}\n#endif\n`;\nY.IncludesShadersStore[XM] = HM;\nconst KM = \"pbrBlockClearcoat\", qM = `struct clearcoatOutParams\n{vec3 specularEnvironmentR0;float conservationFactor;vec3 clearCoatNormalW;vec2 clearCoatAARoughnessFactors;float clearCoatIntensity;float clearCoatRoughness;\n#ifdef REFLECTION\nvec3 finalClearCoatRadianceScaled;\n#endif\n#ifdef CLEARCOAT_TINT\nvec3 absorption;float clearCoatNdotVRefract;vec3 clearCoatColor;float clearCoatThickness;\n#endif\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nvec3 energyConservationFactorClearCoat;\n#endif\n#if DEBUGMODE>0\n#ifdef CLEARCOAT_BUMP\nmat3 TBNClearCoat;\n#endif\n#ifdef CLEARCOAT_TEXTURE\nvec2 clearCoatMapData;\n#endif\n#if defined(CLEARCOAT_TINT) && defined(CLEARCOAT_TINT_TEXTURE)\nvec4 clearCoatTintMapData;\n#endif\n#ifdef REFLECTION\nvec4 environmentClearCoatRadiance;vec3 clearCoatEnvironmentReflectance;\n#endif\nfloat clearCoatNdotV;\n#endif\n};\n#ifdef CLEARCOAT\n#define pbr_inline\n#define inline\nvoid clearcoatBlock(\nin vec3 vPositionW,\nin vec3 geometricNormalW,\nin vec3 viewDirectionW,\nin vec2 vClearCoatParams,\n#if defined(CLEARCOAT_TEXTURE_ROUGHNESS) && !defined(CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE)\nin vec4 clearCoatMapRoughnessData,\n#endif\nin vec3 specularEnvironmentR0,\n#ifdef CLEARCOAT_TEXTURE\nin vec2 clearCoatMapData,\n#endif\n#ifdef CLEARCOAT_TINT\nin vec4 vClearCoatTintParams,\nin float clearCoatColorAtDistance,\nin vec4 vClearCoatRefractionParams,\n#ifdef CLEARCOAT_TINT_TEXTURE\nin vec4 clearCoatTintMapData,\n#endif\n#endif\n#ifdef CLEARCOAT_BUMP\nin vec2 vClearCoatBumpInfos,\nin vec4 clearCoatBumpMapData,\nin vec2 vClearCoatBumpUV,\n#if defined(TANGENT) && defined(NORMAL)\nin mat3 vTBN,\n#else\nin vec2 vClearCoatTangentSpaceParams,\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\nin mat4 normalMatrix,\n#endif\n#endif\n#if defined(FORCENORMALFORWARD) && defined(NORMAL)\nin vec3 faceNormal,\n#endif\n#ifdef REFLECTION\nin vec3 vReflectionMicrosurfaceInfos,\nin vec2 vReflectionInfos,\nin vec3 vReflectionColor,\nin vec4 vLightingIntensity,\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSampler,\n#else\nin sampler2D reflectionSampler,\n#endif\n#ifndef LODBASEDMICROSFURACE\n#ifdef REFLECTIONMAP_3D\nin samplerCube reflectionSamplerLow,\nin samplerCube reflectionSamplerHigh,\n#else\nin sampler2D reflectionSamplerLow,\nin sampler2D reflectionSamplerHigh,\n#endif\n#endif\n#ifdef REALTIME_FILTERING\nin vec2 vReflectionFilteringInfo,\n#endif\n#endif\n#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\n#ifdef RADIANCEOCCLUSION\nin float ambientMonochrome,\n#endif\n#endif\n#if defined(CLEARCOAT_BUMP) || defined(TWOSIDEDLIGHTING)\nin float frontFacingMultiplier,\n#endif\nout clearcoatOutParams outParams\n)\n{float clearCoatIntensity=vClearCoatParams.x;float clearCoatRoughness=vClearCoatParams.y;\n#ifdef CLEARCOAT_TEXTURE\nclearCoatIntensity*=clearCoatMapData.x;\n#ifdef CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE\nclearCoatRoughness*=clearCoatMapData.y;\n#endif\n#if DEBUGMODE>0\noutParams.clearCoatMapData=clearCoatMapData;\n#endif\n#endif\n#if defined(CLEARCOAT_TEXTURE_ROUGHNESS) && !defined(CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE)\n#ifdef CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL\nclearCoatRoughness*=clearCoatMapData.y;\n#else\nclearCoatRoughness*=clearCoatMapRoughnessData.y;\n#endif\n#endif\noutParams.clearCoatIntensity=clearCoatIntensity;outParams.clearCoatRoughness=clearCoatRoughness;\n#ifdef CLEARCOAT_TINT\nvec3 clearCoatColor=vClearCoatTintParams.rgb;float clearCoatThickness=vClearCoatTintParams.a;\n#ifdef CLEARCOAT_TINT_TEXTURE\n#ifdef CLEARCOAT_TINT_GAMMATEXTURE\nclearCoatColor*=toLinearSpace(clearCoatTintMapData.rgb);\n#else\nclearCoatColor*=clearCoatTintMapData.rgb;\n#endif\nclearCoatThickness*=clearCoatTintMapData.a;\n#if DEBUGMODE>0\noutParams.clearCoatTintMapData=clearCoatTintMapData;\n#endif\n#endif\noutParams.clearCoatColor=computeColorAtDistanceInMedia(clearCoatColor,clearCoatColorAtDistance);outParams.clearCoatThickness=clearCoatThickness;\n#endif\n#ifdef CLEARCOAT_REMAP_F0\nvec3 specularEnvironmentR0Updated=getR0RemappedForClearCoat(specularEnvironmentR0);\n#else\nvec3 specularEnvironmentR0Updated=specularEnvironmentR0;\n#endif\noutParams.specularEnvironmentR0=mix(specularEnvironmentR0,specularEnvironmentR0Updated,clearCoatIntensity);vec3 clearCoatNormalW=geometricNormalW;\n#ifdef CLEARCOAT_BUMP\n#ifdef NORMALXYSCALE\nfloat clearCoatNormalScale=1.0;\n#else\nfloat clearCoatNormalScale=vClearCoatBumpInfos.y;\n#endif\n#if defined(TANGENT) && defined(NORMAL)\nmat3 TBNClearCoat=vTBN;\n#else\nvec2 TBNClearCoatUV=vClearCoatBumpUV*frontFacingMultiplier;mat3 TBNClearCoat=cotangent_frame(clearCoatNormalW*clearCoatNormalScale,vPositionW,TBNClearCoatUV,vClearCoatTangentSpaceParams);\n#endif\n#if DEBUGMODE>0\noutParams.TBNClearCoat=TBNClearCoat;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\nclearCoatNormalW=normalize(clearCoatBumpMapData.xyz *2.0-1.0);clearCoatNormalW=normalize(mat3(normalMatrix)*clearCoatNormalW);\n#else\nclearCoatNormalW=perturbNormal(TBNClearCoat,clearCoatBumpMapData.xyz,vClearCoatBumpInfos.y);\n#endif\n#endif\n#if defined(FORCENORMALFORWARD) && defined(NORMAL)\nclearCoatNormalW*=sign(dot(clearCoatNormalW,faceNormal));\n#endif\n#if defined(TWOSIDEDLIGHTING) && defined(NORMAL)\nclearCoatNormalW=clearCoatNormalW*frontFacingMultiplier;\n#endif\noutParams.clearCoatNormalW=clearCoatNormalW;outParams.clearCoatAARoughnessFactors=getAARoughnessFactors(clearCoatNormalW.xyz);float clearCoatNdotVUnclamped=dot(clearCoatNormalW,viewDirectionW);float clearCoatNdotV=absEps(clearCoatNdotVUnclamped);\n#if DEBUGMODE>0\noutParams.clearCoatNdotV=clearCoatNdotV;\n#endif\n#ifdef CLEARCOAT_TINT\nvec3 clearCoatVRefract=refract(-viewDirectionW,clearCoatNormalW,vClearCoatRefractionParams.y);outParams.clearCoatNdotVRefract=absEps(dot(clearCoatNormalW,clearCoatVRefract));\n#endif\n#if defined(ENVIRONMENTBRDF) && (!defined(REFLECTIONMAP_SKYBOX) || defined(MS_BRDF_ENERGY_CONSERVATION))\nvec3 environmentClearCoatBrdf=getBRDFLookup(clearCoatNdotV,clearCoatRoughness);\n#endif\n#if defined(REFLECTION)\nfloat clearCoatAlphaG=convertRoughnessToAverageSlope(clearCoatRoughness);\n#ifdef SPECULARAA\nclearCoatAlphaG+=outParams.clearCoatAARoughnessFactors.y;\n#endif\nvec4 environmentClearCoatRadiance=vec4(0.,0.,0.,0.);vec3 clearCoatReflectionVector=computeReflectionCoords(vec4(vPositionW,1.0),clearCoatNormalW);\n#ifdef REFLECTIONMAP_OPPOSITEZ\nclearCoatReflectionVector.z*=-1.0;\n#endif\n#ifdef REFLECTIONMAP_3D\nvec3 clearCoatReflectionCoords=clearCoatReflectionVector;\n#else\nvec2 clearCoatReflectionCoords=clearCoatReflectionVector.xy;\n#ifdef REFLECTIONMAP_PROJECTION\nclearCoatReflectionCoords/=clearCoatReflectionVector.z;\n#endif\nclearCoatReflectionCoords.y=1.0-clearCoatReflectionCoords.y;\n#endif\nsampleReflectionTexture(\nclearCoatAlphaG,\nvReflectionMicrosurfaceInfos,\nvReflectionInfos,\nvReflectionColor,\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nclearCoatNdotVUnclamped,\n#endif\n#ifdef LINEARSPECULARREFLECTION\nclearCoatRoughness,\n#endif\nreflectionSampler,\nclearCoatReflectionCoords,\n#ifndef LODBASEDMICROSFURACE\nreflectionSamplerLow,\nreflectionSamplerHigh,\n#endif\n#ifdef REALTIME_FILTERING\nvReflectionFilteringInfo,\n#endif\nenvironmentClearCoatRadiance\n);\n#if DEBUGMODE>0\noutParams.environmentClearCoatRadiance=environmentClearCoatRadiance;\n#endif\n#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\nvec3 clearCoatEnvironmentReflectance=getReflectanceFromBRDFLookup(vec3(vClearCoatRefractionParams.x),environmentClearCoatBrdf);\n#ifdef HORIZONOCCLUSION\n#ifdef BUMP\n#ifdef REFLECTIONMAP_3D\nfloat clearCoatEho=environmentHorizonOcclusion(-viewDirectionW,clearCoatNormalW,geometricNormalW);clearCoatEnvironmentReflectance*=clearCoatEho;\n#endif\n#endif\n#endif\n#else\nvec3 clearCoatEnvironmentReflectance=getReflectanceFromAnalyticalBRDFLookup_Jones(clearCoatNdotV,vec3(1.),vec3(1.),sqrt(1.-clearCoatRoughness));\n#endif\nclearCoatEnvironmentReflectance*=clearCoatIntensity;\n#if DEBUGMODE>0\noutParams.clearCoatEnvironmentReflectance=clearCoatEnvironmentReflectance;\n#endif\noutParams.finalClearCoatRadianceScaled=\nenvironmentClearCoatRadiance.rgb *\nclearCoatEnvironmentReflectance *\nvLightingIntensity.z;\n#endif\n#if defined(CLEARCOAT_TINT)\noutParams.absorption=computeClearCoatAbsorption(outParams.clearCoatNdotVRefract,outParams.clearCoatNdotVRefract,outParams.clearCoatColor,clearCoatThickness,clearCoatIntensity);\n#endif\nfloat fresnelIBLClearCoat=fresnelSchlickGGX(clearCoatNdotV,vClearCoatRefractionParams.x,CLEARCOATREFLECTANCE90);fresnelIBLClearCoat*=clearCoatIntensity;outParams.conservationFactor=(1.-fresnelIBLClearCoat);\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\noutParams.energyConservationFactorClearCoat=getEnergyConservationFactor(outParams.specularEnvironmentR0,environmentClearCoatBrdf);\n#endif\n}\n#endif\n`;\nY.IncludesShadersStore[KM] = qM;\nconst YM = \"pbrBlockIridescence\", ZM = `struct iridescenceOutParams\n{float iridescenceIntensity;float iridescenceIOR;float iridescenceThickness;vec3 specularEnvironmentR0;};\n#ifdef IRIDESCENCE\n#define pbr_inline\n#define inline\nvoid iridescenceBlock(\nin vec4 vIridescenceParams,\nin float viewAngle,\nin vec3 specularEnvironmentR0,\n#ifdef IRIDESCENCE_TEXTURE\nin vec2 iridescenceMapData,\n#endif\n#ifdef IRIDESCENCE_THICKNESS_TEXTURE\nin vec2 iridescenceThicknessMapData,\n#endif\n#ifdef CLEARCOAT\nin float NdotVUnclamped,\n#ifdef CLEARCOAT_TEXTURE\nin vec2 clearCoatMapData,\n#endif\n#endif\nout iridescenceOutParams outParams\n)\n{float iridescenceIntensity=vIridescenceParams.x;float iridescenceIOR=vIridescenceParams.y;float iridescenceThicknessMin=vIridescenceParams.z;float iridescenceThicknessMax=vIridescenceParams.w;float iridescenceThicknessWeight=1.;\n#ifdef IRIDESCENCE_TEXTURE\niridescenceIntensity*=iridescenceMapData.x;\n#ifdef IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE\niridescenceThicknessWeight=iridescenceMapData.g;\n#endif\n#endif\n#if defined(IRIDESCENCE_THICKNESS_TEXTURE)\niridescenceThicknessWeight=iridescenceThicknessMapData.g;\n#endif\nfloat iridescenceThickness=mix(iridescenceThicknessMin,iridescenceThicknessMax,iridescenceThicknessWeight);float topIor=1.; \n#ifdef CLEARCOAT\nfloat clearCoatIntensity=vClearCoatParams.x;\n#ifdef CLEARCOAT_TEXTURE\nclearCoatIntensity*=clearCoatMapData.x;\n#endif\ntopIor=mix(1.0,vClearCoatRefractionParams.w-1.,clearCoatIntensity);viewAngle=sqrt(1.0+square(1.0/topIor)*(square(NdotVUnclamped)-1.0));\n#endif\nvec3 iridescenceFresnel=evalIridescence(topIor,iridescenceIOR,viewAngle,iridescenceThickness,specularEnvironmentR0);outParams.specularEnvironmentR0=mix(specularEnvironmentR0,iridescenceFresnel,iridescenceIntensity);outParams.iridescenceIntensity=iridescenceIntensity;outParams.iridescenceThickness=iridescenceThickness;outParams.iridescenceIOR=iridescenceIOR;}\n#endif\n`;\nY.IncludesShadersStore[YM] = ZM;\nconst jM = \"pbrBlockSubSurface\", QM = `struct subSurfaceOutParams\n{vec3 specularEnvironmentReflectance;\n#ifdef SS_REFRACTION\nvec3 finalRefraction;vec3 surfaceAlbedo;\n#ifdef SS_LINKREFRACTIONTOTRANSPARENCY\nfloat alpha;\n#endif\n#ifdef REFLECTION\nfloat refractionFactorForIrradiance;\n#endif\n#endif\n#ifdef SS_TRANSLUCENCY\nvec3 transmittance;float translucencyIntensity;\n#ifdef REFLECTION\nvec3 refractionIrradiance;\n#endif\n#endif\n#if DEBUGMODE>0\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nvec4 thicknessMap;\n#endif\n#ifdef SS_REFRACTION\nvec4 environmentRefraction;vec3 refractionTransmittance;\n#endif\n#endif\n};\n#ifdef SUBSURFACE\n#ifdef SS_REFRACTION\n#define pbr_inline\n#define inline\nvec4 sampleEnvironmentRefraction(\nin float ior\n,in float thickness\n,in float refractionLOD\n,in vec3 normalW\n,in vec3 vPositionW\n,in vec3 viewDirectionW\n,in mat4 view\n,in vec4 vRefractionInfos\n,in mat4 refractionMatrix\n,in vec4 vRefractionMicrosurfaceInfos\n,in float alphaG\n#ifdef SS_REFRACTIONMAP_3D\n,in samplerCube refractionSampler\n#ifndef LODBASEDMICROSFURACE\n,in samplerCube refractionSamplerLow\n,in samplerCube refractionSamplerHigh\n#endif\n#else\n,in sampler2D refractionSampler\n#ifndef LODBASEDMICROSFURACE\n,in sampler2D refractionSamplerLow\n,in sampler2D refractionSamplerHigh\n#endif\n#endif\n#ifdef ANISOTROPIC\n,in anisotropicOutParams anisotropicOut\n#endif\n#ifdef REALTIME_FILTERING\n,in vec2 vRefractionFilteringInfo\n#endif\n#ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC\n,in vec3 refractionPosition\n,in vec3 refractionSize\n#endif\n) {vec4 environmentRefraction=vec4(0.,0.,0.,0.);\n#ifdef ANISOTROPIC\nvec3 refractionVector=refract(-viewDirectionW,anisotropicOut.anisotropicNormal,ior);\n#else\nvec3 refractionVector=refract(-viewDirectionW,normalW,ior);\n#endif\n#ifdef SS_REFRACTIONMAP_OPPOSITEZ\nrefractionVector.z*=-1.0;\n#endif\n#ifdef SS_REFRACTIONMAP_3D\n#ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC\nrefractionVector=parallaxCorrectNormal(vPositionW,refractionVector,refractionSize,refractionPosition);\n#endif\nrefractionVector.y=refractionVector.y*vRefractionInfos.w;vec3 refractionCoords=refractionVector;refractionCoords=vec3(refractionMatrix*vec4(refractionCoords,0));\n#else\n#ifdef SS_USE_THICKNESS_AS_DEPTH\nvec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*thickness,1.0)));\n#else\nvec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*vRefractionInfos.z,1.0)));\n#endif\nvec2 refractionCoords=vRefractionUVW.xy/vRefractionUVW.z;refractionCoords.y=1.0-refractionCoords.y;\n#endif\n#ifdef LODBASEDMICROSFURACE\nrefractionLOD=refractionLOD*vRefractionMicrosurfaceInfos.y+vRefractionMicrosurfaceInfos.z;\n#ifdef SS_LODINREFRACTIONALPHA\nfloat automaticRefractionLOD=UNPACK_LOD(sampleRefraction(refractionSampler,refractionCoords).a);float requestedRefractionLOD=max(automaticRefractionLOD,refractionLOD);\n#else\nfloat requestedRefractionLOD=refractionLOD;\n#endif\n#if defined(REALTIME_FILTERING) && defined(SS_REFRACTIONMAP_3D)\nenvironmentRefraction=vec4(radiance(alphaG,refractionSampler,refractionCoords,vRefractionFilteringInfo),1.0);\n#else\nenvironmentRefraction=sampleRefractionLod(refractionSampler,refractionCoords,requestedRefractionLOD);\n#endif\n#else\nfloat lodRefractionNormalized=saturate(refractionLOD/log2(vRefractionMicrosurfaceInfos.x));float lodRefractionNormalizedDoubled=lodRefractionNormalized*2.0;vec4 environmentRefractionMid=sampleRefraction(refractionSampler,refractionCoords);if (lodRefractionNormalizedDoubled<1.0){environmentRefraction=mix(\nsampleRefraction(refractionSamplerHigh,refractionCoords),\nenvironmentRefractionMid,\nlodRefractionNormalizedDoubled\n);} else {environmentRefraction=mix(\nenvironmentRefractionMid,\nsampleRefraction(refractionSamplerLow,refractionCoords),\nlodRefractionNormalizedDoubled-1.0\n);}\n#endif\n#ifdef SS_RGBDREFRACTION\nenvironmentRefraction.rgb=fromRGBD(environmentRefraction);\n#endif\n#ifdef SS_GAMMAREFRACTION\nenvironmentRefraction.rgb=toLinearSpace(environmentRefraction.rgb);\n#endif\nreturn environmentRefraction;}\n#endif\n#define pbr_inline\n#define inline\nvoid subSurfaceBlock(\nin vec3 vSubSurfaceIntensity,\nin vec2 vThicknessParam,\nin vec4 vTintColor,\nin vec3 normalW,\nin vec3 specularEnvironmentReflectance,\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nin vec4 thicknessMap,\n#endif\n#ifdef SS_REFRACTIONINTENSITY_TEXTURE\nin vec4 refractionIntensityMap,\n#endif\n#ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE\nin vec4 translucencyIntensityMap,\n#endif\n#ifdef REFLECTION\n#ifdef SS_TRANSLUCENCY\nin mat4 reflectionMatrix,\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\nin vec3 irradianceVector_,\n#endif\n#if defined(REALTIME_FILTERING)\nin samplerCube reflectionSampler,\nin vec2 vReflectionFilteringInfo,\n#endif\n#endif\n#ifdef USEIRRADIANCEMAP\n#ifdef REFLECTIONMAP_3D\nin samplerCube irradianceSampler,\n#else\nin sampler2D irradianceSampler,\n#endif\n#endif\n#endif\n#endif\n#if defined(SS_REFRACTION) || defined(SS_TRANSLUCENCY)\nin vec3 surfaceAlbedo,\n#endif\n#ifdef SS_REFRACTION\nin vec3 vPositionW,\nin vec3 viewDirectionW,\nin mat4 view,\nin vec4 vRefractionInfos,\nin mat4 refractionMatrix,\nin vec4 vRefractionMicrosurfaceInfos,\nin vec4 vLightingIntensity,\n#ifdef SS_LINKREFRACTIONTOTRANSPARENCY\nin float alpha,\n#endif\n#ifdef SS_LODINREFRACTIONALPHA\nin float NdotVUnclamped,\n#endif\n#ifdef SS_LINEARSPECULARREFRACTION\nin float roughness,\n#endif\nin float alphaG,\n#ifdef SS_REFRACTIONMAP_3D\nin samplerCube refractionSampler,\n#ifndef LODBASEDMICROSFURACE\nin samplerCube refractionSamplerLow,\nin samplerCube refractionSamplerHigh,\n#endif\n#else\nin sampler2D refractionSampler,\n#ifndef LODBASEDMICROSFURACE\nin sampler2D refractionSamplerLow,\nin sampler2D refractionSamplerHigh,\n#endif\n#endif\n#ifdef ANISOTROPIC\nin anisotropicOutParams anisotropicOut,\n#endif\n#ifdef REALTIME_FILTERING\nin vec2 vRefractionFilteringInfo,\n#endif\n#ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC\nin vec3 refractionPosition,\nin vec3 refractionSize,\n#endif\n#ifdef SS_DISPERSION\nin float dispersion,\n#endif\n#endif\n#ifdef SS_TRANSLUCENCY\nin vec3 vDiffusionDistance,\n#endif\nout subSurfaceOutParams outParams\n)\n{outParams.specularEnvironmentReflectance=specularEnvironmentReflectance;\n#ifdef SS_REFRACTION\nfloat refractionIntensity=vSubSurfaceIntensity.x;\n#ifdef SS_LINKREFRACTIONTOTRANSPARENCY\nrefractionIntensity*=(1.0-alpha);outParams.alpha=1.0;\n#endif\n#endif\n#ifdef SS_TRANSLUCENCY\nfloat translucencyIntensity=vSubSurfaceIntensity.y;\n#endif\n#ifdef SS_THICKNESSANDMASK_TEXTURE\n#if defined(SS_USE_GLTF_TEXTURES)\nfloat thickness=thicknessMap.g*vThicknessParam.y+vThicknessParam.x;\n#else\nfloat thickness=thicknessMap.r*vThicknessParam.y+vThicknessParam.x;\n#endif\n#if DEBUGMODE>0\noutParams.thicknessMap=thicknessMap;\n#endif\n#ifdef SS_MASK_FROM_THICKNESS_TEXTURE\n#if defined(SS_REFRACTION) && defined(SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE)\n#if defined(SS_USE_GLTF_TEXTURES)\nrefractionIntensity*=thicknessMap.r;\n#else\nrefractionIntensity*=thicknessMap.g;\n#endif\n#endif\n#if defined(SS_TRANSLUCENCY) && defined(SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE)\ntranslucencyIntensity*=thicknessMap.b;\n#endif\n#endif\n#else\nfloat thickness=vThicknessParam.y;\n#endif\n#if defined(SS_REFRACTION) && defined(SS_REFRACTIONINTENSITY_TEXTURE)\n#ifdef SS_USE_GLTF_TEXTURES\nrefractionIntensity*=refractionIntensityMap.r;\n#else\nrefractionIntensity*=refractionIntensityMap.g;\n#endif\n#endif\n#ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE\ntranslucencyIntensity*=translucencyIntensityMap.b;\n#endif\n#ifdef SS_TRANSLUCENCY\nthickness=maxEps(thickness);vec3 transmittance=transmittanceBRDF_Burley(vTintColor.rgb,vDiffusionDistance,thickness);transmittance*=translucencyIntensity;outParams.transmittance=transmittance;outParams.translucencyIntensity=translucencyIntensity;\n#endif\n#ifdef SS_REFRACTION\nvec4 environmentRefraction=vec4(0.,0.,0.,0.);\n#ifdef SS_HAS_THICKNESS\nfloat ior=vRefractionInfos.y;\n#else\nfloat ior=vRefractionMicrosurfaceInfos.w;\n#endif\n#ifdef SS_LODINREFRACTIONALPHA\nfloat refractionAlphaG=alphaG;refractionAlphaG=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLodFromAlphaG(vRefractionMicrosurfaceInfos.x,refractionAlphaG,NdotVUnclamped);\n#elif defined(SS_LINEARSPECULARREFRACTION)\nfloat refractionRoughness=alphaG;refractionRoughness=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLinearLodFromRoughness(vRefractionMicrosurfaceInfos.x,refractionRoughness);\n#else\nfloat refractionAlphaG=alphaG;refractionAlphaG=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLodFromAlphaG(vRefractionMicrosurfaceInfos.x,refractionAlphaG);\n#endif\nfloat refraction_ior=vRefractionInfos.y;\n#ifdef SS_DISPERSION\nfloat realIOR=1.0/refraction_ior;float iorDispersionSpread=0.04*dispersion*(realIOR-1.0);vec3 iors=vec3(1.0/(realIOR-iorDispersionSpread),refraction_ior,1.0/(realIOR+iorDispersionSpread));for (int i=0; i<3; i++) {refraction_ior=iors[i];\n#endif\nvec4 envSample=sampleEnvironmentRefraction(refraction_ior,thickness,refractionLOD,normalW,vPositionW,viewDirectionW,view,vRefractionInfos,refractionMatrix,vRefractionMicrosurfaceInfos,alphaG\n#ifdef SS_REFRACTIONMAP_3D\n,refractionSampler\n#ifndef LODBASEDMICROSFURACE\n,refractionSamplerLow\n,refractionSamplerHigh\n#endif\n#else\n,refractionSampler\n#ifndef LODBASEDMICROSFURACE\n,refractionSamplerLow\n,refractionSamplerHigh\n#endif\n#endif\n#ifdef ANISOTROPIC\n,anisotropicOut\n#endif\n#ifdef REALTIME_FILTERING\n,vRefractionFilteringInfo\n#endif\n#ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC\n,refractionPosition\n,refractionSize\n#endif\n);\n#ifdef SS_DISPERSION\nenvironmentRefraction[i]=envSample[i];}\n#else\nenvironmentRefraction=envSample;\n#endif\nenvironmentRefraction.rgb*=vRefractionInfos.x;\n#endif\n#ifdef SS_REFRACTION\nvec3 refractionTransmittance=vec3(refractionIntensity);\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nvec3 volumeAlbedo=computeColorAtDistanceInMedia(vTintColor.rgb,vTintColor.w);refractionTransmittance*=cocaLambert(volumeAlbedo,thickness);\n#elif defined(SS_LINKREFRACTIONTOTRANSPARENCY)\nfloat maxChannel=max(max(surfaceAlbedo.r,surfaceAlbedo.g),surfaceAlbedo.b);vec3 volumeAlbedo=saturate(maxChannel*surfaceAlbedo);environmentRefraction.rgb*=volumeAlbedo;\n#else\nvec3 volumeAlbedo=computeColorAtDistanceInMedia(vTintColor.rgb,vTintColor.w);refractionTransmittance*=cocaLambert(volumeAlbedo,vThicknessParam.y);\n#endif\n#ifdef SS_ALBEDOFORREFRACTIONTINT\nenvironmentRefraction.rgb*=surfaceAlbedo.rgb;\n#endif\noutParams.surfaceAlbedo=surfaceAlbedo*(1.-refractionIntensity);\n#ifdef REFLECTION\noutParams.refractionFactorForIrradiance=(1.-refractionIntensity);\n#endif\n#ifdef UNUSED_MULTIPLEBOUNCES\nvec3 bounceSpecularEnvironmentReflectance=(2.0*specularEnvironmentReflectance)/(1.0+specularEnvironmentReflectance);outParams.specularEnvironmentReflectance=mix(bounceSpecularEnvironmentReflectance,specularEnvironmentReflectance,refractionIntensity);\n#endif\nrefractionTransmittance*=1.0-outParams.specularEnvironmentReflectance;\n#if DEBUGMODE>0\noutParams.refractionTransmittance=refractionTransmittance;\n#endif\noutParams.finalRefraction=environmentRefraction.rgb*refractionTransmittance*vLightingIntensity.z;\n#if DEBUGMODE>0\noutParams.environmentRefraction=environmentRefraction;\n#endif\n#endif\n#if defined(REFLECTION) && defined(SS_TRANSLUCENCY)\n#if defined(NORMAL) && defined(USESPHERICALINVERTEX) || !defined(USESPHERICALFROMREFLECTIONMAP)\nvec3 irradianceVector=vec3(reflectionMatrix*vec4(normalW,0)).xyz;\n#ifdef REFLECTIONMAP_OPPOSITEZ\nirradianceVector.z*=-1.0;\n#endif\n#ifdef INVERTCUBICMAP\nirradianceVector.y*=-1.0;\n#endif\n#else\nvec3 irradianceVector=irradianceVector_;\n#endif\n#if defined(USESPHERICALFROMREFLECTIONMAP)\n#if defined(REALTIME_FILTERING)\nvec3 refractionIrradiance=irradiance(reflectionSampler,-irradianceVector,vReflectionFilteringInfo);\n#else\nvec3 refractionIrradiance=computeEnvironmentIrradiance(-irradianceVector);\n#endif\n#elif defined(USEIRRADIANCEMAP)\n#ifdef REFLECTIONMAP_3D\nvec3 irradianceCoords=irradianceVector;\n#else\nvec2 irradianceCoords=irradianceVector.xy;\n#ifdef REFLECTIONMAP_PROJECTION\nirradianceCoords/=irradianceVector.z;\n#endif\nirradianceCoords.y=1.0-irradianceCoords.y;\n#endif\nvec4 refractionIrradiance=sampleReflection(irradianceSampler,-irradianceCoords);\n#ifdef RGBDREFLECTION\nrefractionIrradiance.rgb=fromRGBD(refractionIrradiance);\n#endif\n#ifdef GAMMAREFLECTION\nrefractionIrradiance.rgb=toLinearSpace(refractionIrradiance.rgb);\n#endif\n#else\nvec4 refractionIrradiance=vec4(0.);\n#endif\nrefractionIrradiance.rgb*=transmittance;\n#ifdef SS_ALBEDOFORTRANSLUCENCYTINT\nrefractionIrradiance.rgb*=surfaceAlbedo.rgb;\n#endif\noutParams.refractionIrradiance=refractionIrradiance.rgb;\n#endif\n}\n#endif\n`;\nY.IncludesShadersStore[jM] = QM;\nconst JM = \"pbrBlockNormalGeometric\", $M = `vec3 viewDirectionW=normalize(vEyePosition.xyz-vPositionW);\n#ifdef NORMAL\nvec3 normalW=normalize(vNormalW);\n#else\nvec3 normalW=normalize(cross(dFdx(vPositionW),dFdy(vPositionW)))*vEyePosition.w;\n#endif\nvec3 geometricNormalW=normalW;\n#if defined(TWOSIDEDLIGHTING) && defined(NORMAL)\ngeometricNormalW=gl_FrontFacing ? geometricNormalW : -geometricNormalW;\n#endif\n`;\nY.IncludesShadersStore[JM] = $M;\nconst eP = \"pbrBlockNormalFinal\", tP = `#if defined(FORCENORMALFORWARD) && defined(NORMAL)\nvec3 faceNormal=normalize(cross(dFdx(vPositionW),dFdy(vPositionW)))*vEyePosition.w;\n#if defined(TWOSIDEDLIGHTING)\nfaceNormal=gl_FrontFacing ? faceNormal : -faceNormal;\n#endif\nnormalW*=sign(dot(normalW,faceNormal));\n#endif\n#if defined(TWOSIDEDLIGHTING) && defined(NORMAL)\nnormalW=gl_FrontFacing ? normalW : -normalW;\n#endif\n`;\nY.IncludesShadersStore[eP] = tP;\nconst iP = \"pbrBlockLightmapInit\", rP = `#ifdef LIGHTMAP\nvec4 lightmapColor=texture2D(lightmapSampler,vLightmapUV+uvOffset);\n#ifdef RGBDLIGHTMAP\nlightmapColor.rgb=fromRGBD(lightmapColor);\n#endif\n#ifdef GAMMALIGHTMAP\nlightmapColor.rgb=toLinearSpace(lightmapColor.rgb);\n#endif\nlightmapColor.rgb*=vLightmapInfos.y;\n#endif\n`;\nY.IncludesShadersStore[iP] = rP;\nconst sP = \"pbrBlockGeometryInfo\", nP = `float NdotVUnclamped=dot(normalW,viewDirectionW);float NdotV=absEps(NdotVUnclamped);float alphaG=convertRoughnessToAverageSlope(roughness);vec2 AARoughnessFactors=getAARoughnessFactors(normalW.xyz);\n#ifdef SPECULARAA\nalphaG+=AARoughnessFactors.y;\n#endif\n#if defined(ENVIRONMENTBRDF)\nvec3 environmentBrdf=getBRDFLookup(NdotV,roughness);\n#endif\n#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\n#ifdef RADIANCEOCCLUSION\n#ifdef AMBIENTINGRAYSCALE\nfloat ambientMonochrome=aoOut.ambientOcclusionColor.r;\n#else\nfloat ambientMonochrome=getLuminance(aoOut.ambientOcclusionColor);\n#endif\nfloat seo=environmentRadianceOcclusion(ambientMonochrome,NdotVUnclamped);\n#endif\n#ifdef HORIZONOCCLUSION\n#ifdef BUMP\n#ifdef REFLECTIONMAP_3D\nfloat eho=environmentHorizonOcclusion(-viewDirectionW,normalW,geometricNormalW);\n#endif\n#endif\n#endif\n#endif\n`;\nY.IncludesShadersStore[sP] = nP;\nconst aP = \"pbrBlockReflectance0\", oP = `float reflectance=max(max(reflectivityOut.surfaceReflectivityColor.r,reflectivityOut.surfaceReflectivityColor.g),reflectivityOut.surfaceReflectivityColor.b);vec3 specularEnvironmentR0=reflectivityOut.surfaceReflectivityColor.rgb;\n#ifdef METALLICWORKFLOW\nvec3 specularEnvironmentR90=vec3(metallicReflectanceFactors.a);\n#else \nvec3 specularEnvironmentR90=vec3(1.0,1.0,1.0);\n#endif\n#ifdef ALPHAFRESNEL\nfloat reflectance90=fresnelGrazingReflectance(reflectance);specularEnvironmentR90=specularEnvironmentR90*reflectance90;\n#endif\n`;\nY.IncludesShadersStore[aP] = oP;\nconst lP = \"pbrBlockReflectance\", cP = `#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\nvec3 specularEnvironmentReflectance=getReflectanceFromBRDFLookup(clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,environmentBrdf);\n#ifdef RADIANCEOCCLUSION\nspecularEnvironmentReflectance*=seo;\n#endif\n#ifdef HORIZONOCCLUSION\n#ifdef BUMP\n#ifdef REFLECTIONMAP_3D\nspecularEnvironmentReflectance*=eho;\n#endif\n#endif\n#endif\n#else\nvec3 specularEnvironmentReflectance=getReflectanceFromAnalyticalBRDFLookup_Jones(NdotV,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,sqrt(microSurface));\n#endif\n#ifdef CLEARCOAT\nspecularEnvironmentReflectance*=clearcoatOut.conservationFactor;\n#if defined(CLEARCOAT_TINT)\nspecularEnvironmentReflectance*=clearcoatOut.absorption;\n#endif\n#endif\n`;\nY.IncludesShadersStore[lP] = cP;\nconst hP = \"pbrBlockDirectLighting\", uP = `vec3 diffuseBase=vec3(0.,0.,0.);\n#ifdef SPECULARTERM\nvec3 specularBase=vec3(0.,0.,0.);\n#endif\n#ifdef CLEARCOAT\nvec3 clearCoatBase=vec3(0.,0.,0.);\n#endif\n#ifdef SHEEN\nvec3 sheenBase=vec3(0.,0.,0.);\n#endif\npreLightingInfo preInfo;lightingInfo info;float shadow=1.; \nfloat aggShadow=0.;float numLights=0.;\n#if defined(CLEARCOAT) && defined(CLEARCOAT_TINT)\nvec3 absorption=vec3(0.);\n#endif\n`;\nY.IncludesShadersStore[hP] = uP;\nconst fP = \"pbrBlockFinalLitComponents\", dP = `aggShadow=aggShadow/numLights;\n#if defined(ENVIRONMENTBRDF)\n#ifdef MS_BRDF_ENERGY_CONSERVATION\nvec3 energyConservationFactor=getEnergyConservationFactor(clearcoatOut.specularEnvironmentR0,environmentBrdf);\n#endif\n#endif\n#ifndef METALLICWORKFLOW\n#ifdef SPECULAR_GLOSSINESS_ENERGY_CONSERVATION\nsurfaceAlbedo.rgb=(1.-reflectance)*surfaceAlbedo.rgb;\n#endif\n#endif\n#if defined(SHEEN) && defined(SHEEN_ALBEDOSCALING) && defined(ENVIRONMENTBRDF)\nsurfaceAlbedo.rgb=sheenOut.sheenAlbedoScaling*surfaceAlbedo.rgb;\n#endif\n#ifdef REFLECTION\nvec3 finalIrradiance=reflectionOut.environmentIrradiance;\n#if defined(CLEARCOAT)\nfinalIrradiance*=clearcoatOut.conservationFactor;\n#if defined(CLEARCOAT_TINT)\nfinalIrradiance*=clearcoatOut.absorption;\n#endif\n#endif\n#if defined(SS_REFRACTION)\nfinalIrradiance*=subSurfaceOut.refractionFactorForIrradiance;\n#endif\n#if defined(SS_TRANSLUCENCY)\nfinalIrradiance*=(1.0-subSurfaceOut.translucencyIntensity);finalIrradiance+=subSurfaceOut.refractionIrradiance;\n#endif\nfinalIrradiance*=surfaceAlbedo.rgb;finalIrradiance*=vLightingIntensity.z;finalIrradiance*=aoOut.ambientOcclusionColor;\n#endif\n#ifdef SPECULARTERM\nvec3 finalSpecular=specularBase;finalSpecular=max(finalSpecular,0.0);vec3 finalSpecularScaled=finalSpecular*vLightingIntensity.x*vLightingIntensity.w;\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nfinalSpecularScaled*=energyConservationFactor;\n#endif\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)\nfinalSpecularScaled*=sheenOut.sheenAlbedoScaling;\n#endif\n#endif\n#ifdef REFLECTION\nvec3 finalRadiance=reflectionOut.environmentRadiance.rgb;finalRadiance*=subSurfaceOut.specularEnvironmentReflectance;vec3 finalRadianceScaled=finalRadiance*vLightingIntensity.z;\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nfinalRadianceScaled*=energyConservationFactor;\n#endif\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)\nfinalRadianceScaled*=sheenOut.sheenAlbedoScaling;\n#endif\n#endif\n#ifdef SHEEN\nvec3 finalSheen=sheenBase*sheenOut.sheenColor;finalSheen=max(finalSheen,0.0);vec3 finalSheenScaled=finalSheen*vLightingIntensity.x*vLightingIntensity.w;\n#if defined(CLEARCOAT) && defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nsheenOut.finalSheenRadianceScaled*=clearcoatOut.conservationFactor;\n#if defined(CLEARCOAT_TINT)\nsheenOut.finalSheenRadianceScaled*=clearcoatOut.absorption;\n#endif\n#endif\n#endif\n#ifdef CLEARCOAT\nvec3 finalClearCoat=clearCoatBase;finalClearCoat=max(finalClearCoat,0.0);vec3 finalClearCoatScaled=finalClearCoat*vLightingIntensity.x*vLightingIntensity.w;\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nfinalClearCoatScaled*=clearcoatOut.energyConservationFactorClearCoat;\n#endif\n#ifdef SS_REFRACTION\nsubSurfaceOut.finalRefraction*=clearcoatOut.conservationFactor;\n#ifdef CLEARCOAT_TINT\nsubSurfaceOut.finalRefraction*=clearcoatOut.absorption;\n#endif\n#endif\n#endif\n#ifdef ALPHABLEND\nfloat luminanceOverAlpha=0.0;\n#if defined(REFLECTION) && defined(RADIANCEOVERALPHA)\nluminanceOverAlpha+=getLuminance(finalRadianceScaled);\n#if defined(CLEARCOAT)\nluminanceOverAlpha+=getLuminance(clearcoatOut.finalClearCoatRadianceScaled);\n#endif\n#endif\n#if defined(SPECULARTERM) && defined(SPECULAROVERALPHA)\nluminanceOverAlpha+=getLuminance(finalSpecularScaled);\n#endif\n#if defined(CLEARCOAT) && defined(CLEARCOATOVERALPHA)\nluminanceOverAlpha+=getLuminance(finalClearCoatScaled);\n#endif\n#if defined(RADIANCEOVERALPHA) || defined(SPECULAROVERALPHA) || defined(CLEARCOATOVERALPHA)\nalpha=saturate(alpha+luminanceOverAlpha*luminanceOverAlpha);\n#endif\n#endif\n`;\nY.IncludesShadersStore[fP] = dP;\nconst pP = \"pbrBlockFinalUnlitComponents\", gP = `vec3 finalDiffuse=diffuseBase;finalDiffuse*=surfaceAlbedo.rgb;finalDiffuse=max(finalDiffuse,0.0);finalDiffuse*=vLightingIntensity.x;vec3 finalAmbient=vAmbientColor;finalAmbient*=surfaceAlbedo.rgb;vec3 finalEmissive=vEmissiveColor;\n#ifdef EMISSIVE\nvec3 emissiveColorTex=texture2D(emissiveSampler,vEmissiveUV+uvOffset).rgb;\n#ifdef GAMMAEMISSIVE\nfinalEmissive*=toLinearSpace(emissiveColorTex.rgb);\n#else\nfinalEmissive*=emissiveColorTex.rgb;\n#endif\nfinalEmissive*= vEmissiveInfos.y;\n#endif\nfinalEmissive*=vLightingIntensity.y;\n#ifdef AMBIENT\nvec3 ambientOcclusionForDirectDiffuse=mix(vec3(1.),aoOut.ambientOcclusionColor,vAmbientInfos.w);\n#else\nvec3 ambientOcclusionForDirectDiffuse=aoOut.ambientOcclusionColor;\n#endif\nfinalAmbient*=aoOut.ambientOcclusionColor;finalDiffuse*=ambientOcclusionForDirectDiffuse;\n`;\nY.IncludesShadersStore[pP] = gP;\nconst mP = \"pbrBlockFinalColorComposition\", _P = `vec4 finalColor=vec4(\n#ifndef UNLIT\n#ifdef REFLECTION\nfinalIrradiance +\n#endif\n#ifdef SPECULARTERM\nfinalSpecularScaled +\n#endif\n#ifdef SHEEN\nfinalSheenScaled +\n#endif\n#ifdef CLEARCOAT\nfinalClearCoatScaled +\n#endif\n#ifdef REFLECTION\nfinalRadianceScaled +\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF)\nsheenOut.finalSheenRadianceScaled +\n#endif\n#ifdef CLEARCOAT\nclearcoatOut.finalClearCoatRadianceScaled +\n#endif\n#endif\n#ifdef SS_REFRACTION\nsubSurfaceOut.finalRefraction +\n#endif\n#endif\nfinalAmbient +\nfinalDiffuse,\nalpha);\n#ifdef LIGHTMAP\n#ifndef LIGHTMAPEXCLUDED\n#ifdef USELIGHTMAPASSHADOWMAP\nfinalColor.rgb*=lightmapColor.rgb;\n#else\nfinalColor.rgb+=lightmapColor.rgb;\n#endif\n#endif\n#endif\nfinalColor.rgb+=finalEmissive;\n#define CUSTOM_FRAGMENT_BEFORE_FOG\nfinalColor=max(finalColor,0.0);\n`;\nY.IncludesShadersStore[mP] = _P;\nconst EP = \"pbrBlockImageProcessing\", vP = `#if defined(IMAGEPROCESSINGPOSTPROCESS) || defined(SS_SCATTERING)\n#if !defined(SKIPFINALCOLORCLAMP)\nfinalColor.rgb=clamp(finalColor.rgb,0.,30.0);\n#endif\n#else\nfinalColor=applyImageProcessing(finalColor);\n#endif\nfinalColor.a*=visibility;\n#ifdef PREMULTIPLYALPHA\nfinalColor.rgb*=finalColor.a;\n#endif\n`;\nY.IncludesShadersStore[EP] = vP;\nconst TP = \"pbrDebug\", xP = `#if DEBUGMODE>0\nif (vClipSpacePosition.x/vClipSpacePosition.w>=vDebugMode.x) {\n#if DEBUGMODE==1\ngl_FragColor.rgb=vPositionW.rgb;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==2 && defined(NORMAL)\ngl_FragColor.rgb=vNormalW.rgb;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==3 && defined(BUMP) || DEBUGMODE==3 && defined(PARALLAX) || DEBUGMODE==3 && defined(ANISOTROPIC)\ngl_FragColor.rgb=TBN[0];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==4 && defined(BUMP) || DEBUGMODE==4 && defined(PARALLAX) || DEBUGMODE==4 && defined(ANISOTROPIC)\ngl_FragColor.rgb=TBN[1];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==5\ngl_FragColor.rgb=normalW;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==6 && defined(MAINUV1)\ngl_FragColor.rgb=vec3(vMainUV1,0.0);\n#elif DEBUGMODE==7 && defined(MAINUV2)\ngl_FragColor.rgb=vec3(vMainUV2,0.0);\n#elif DEBUGMODE==8 && defined(CLEARCOAT) && defined(CLEARCOAT_BUMP)\ngl_FragColor.rgb=clearcoatOut.TBNClearCoat[0];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==9 && defined(CLEARCOAT) && defined(CLEARCOAT_BUMP)\ngl_FragColor.rgb=clearcoatOut.TBNClearCoat[1];\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==10 && defined(CLEARCOAT)\ngl_FragColor.rgb=clearcoatOut.clearCoatNormalW;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==11 && defined(ANISOTROPIC)\ngl_FragColor.rgb=anisotropicOut.anisotropicNormal;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==12 && defined(ANISOTROPIC)\ngl_FragColor.rgb=anisotropicOut.anisotropicTangent;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==13 && defined(ANISOTROPIC)\ngl_FragColor.rgb=anisotropicOut.anisotropicBitangent;\n#define DEBUGMODE_NORMALIZE\n#elif DEBUGMODE==20 && defined(ALBEDO)\ngl_FragColor.rgb=albedoTexture.rgb;\n#ifndef GAMMAALBEDO\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==21 && defined(AMBIENT)\ngl_FragColor.rgb=aoOut.ambientOcclusionColorMap.rgb;\n#elif DEBUGMODE==22 && defined(OPACITY)\ngl_FragColor.rgb=opacityMap.rgb;\n#elif DEBUGMODE==23 && defined(EMISSIVE)\ngl_FragColor.rgb=emissiveColorTex.rgb;\n#ifndef GAMMAEMISSIVE\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==24 && defined(LIGHTMAP)\ngl_FragColor.rgb=lightmapColor.rgb;\n#ifndef GAMMALIGHTMAP\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==25 && defined(REFLECTIVITY) && defined(METALLICWORKFLOW)\ngl_FragColor.rgb=reflectivityOut.surfaceMetallicColorMap.rgb;\n#elif DEBUGMODE==26 && defined(REFLECTIVITY) && !defined(METALLICWORKFLOW)\ngl_FragColor.rgb=reflectivityOut.surfaceReflectivityColorMap.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==27 && defined(CLEARCOAT) && defined(CLEARCOAT_TEXTURE)\ngl_FragColor.rgb=vec3(clearcoatOut.clearCoatMapData.rg,0.0);\n#elif DEBUGMODE==28 && defined(CLEARCOAT) && defined(CLEARCOAT_TINT) && defined(CLEARCOAT_TINT_TEXTURE)\ngl_FragColor.rgb=clearcoatOut.clearCoatTintMapData.rgb;\n#elif DEBUGMODE==29 && defined(SHEEN) && defined(SHEEN_TEXTURE)\ngl_FragColor.rgb=sheenOut.sheenMapData.rgb;\n#elif DEBUGMODE==30 && defined(ANISOTROPIC) && defined(ANISOTROPIC_TEXTURE)\ngl_FragColor.rgb=anisotropicOut.anisotropyMapData.rgb;\n#elif DEBUGMODE==31 && defined(SUBSURFACE) && defined(SS_THICKNESSANDMASK_TEXTURE)\ngl_FragColor.rgb=subSurfaceOut.thicknessMap.rgb;\n#elif DEBUGMODE==32 && defined(BUMP)\ngl_FragColor.rgb=texture2D(bumpSampler,vBumpUV).rgb;\n#elif DEBUGMODE==40 && defined(SS_REFRACTION)\ngl_FragColor.rgb=subSurfaceOut.environmentRefraction.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==41 && defined(REFLECTION)\ngl_FragColor.rgb=reflectionOut.environmentRadiance.rgb;\n#ifndef GAMMAREFLECTION\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==42 && defined(CLEARCOAT) && defined(REFLECTION)\ngl_FragColor.rgb=clearcoatOut.environmentClearCoatRadiance.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==50\ngl_FragColor.rgb=diffuseBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==51 && defined(SPECULARTERM)\ngl_FragColor.rgb=specularBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==52 && defined(CLEARCOAT)\ngl_FragColor.rgb=clearCoatBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==53 && defined(SHEEN)\ngl_FragColor.rgb=sheenBase.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==54 && defined(REFLECTION)\ngl_FragColor.rgb=reflectionOut.environmentIrradiance.rgb;\n#ifndef GAMMAREFLECTION\n#define DEBUGMODE_GAMMA\n#endif\n#elif DEBUGMODE==60\ngl_FragColor.rgb=surfaceAlbedo.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==61\ngl_FragColor.rgb=clearcoatOut.specularEnvironmentR0;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==62 && defined(METALLICWORKFLOW)\ngl_FragColor.rgb=vec3(reflectivityOut.metallicRoughness.r);\n#elif DEBUGMODE==71 && defined(METALLICWORKFLOW)\ngl_FragColor.rgb=reflectivityOut.metallicF0;\n#elif DEBUGMODE==63\ngl_FragColor.rgb=vec3(roughness);\n#elif DEBUGMODE==64\ngl_FragColor.rgb=vec3(alphaG);\n#elif DEBUGMODE==65\ngl_FragColor.rgb=vec3(NdotV);\n#elif DEBUGMODE==66 && defined(CLEARCOAT) && defined(CLEARCOAT_TINT)\ngl_FragColor.rgb=clearcoatOut.clearCoatColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==67 && defined(CLEARCOAT)\ngl_FragColor.rgb=vec3(clearcoatOut.clearCoatRoughness);\n#elif DEBUGMODE==68 && defined(CLEARCOAT)\ngl_FragColor.rgb=vec3(clearcoatOut.clearCoatNdotV);\n#elif DEBUGMODE==69 && defined(SUBSURFACE) && defined(SS_TRANSLUCENCY)\ngl_FragColor.rgb=subSurfaceOut.transmittance;\n#elif DEBUGMODE==70 && defined(SUBSURFACE) && defined(SS_REFRACTION)\ngl_FragColor.rgb=subSurfaceOut.refractionTransmittance;\n#elif DEBUGMODE==72\ngl_FragColor.rgb=vec3(microSurface);\n#elif DEBUGMODE==73\ngl_FragColor.rgb=vAlbedoColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==74 && !defined(METALLICWORKFLOW)\ngl_FragColor.rgb=vReflectivityColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==75\ngl_FragColor.rgb=vEmissiveColor.rgb;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==80 && defined(RADIANCEOCCLUSION)\ngl_FragColor.rgb=vec3(seo);\n#elif DEBUGMODE==81 && defined(HORIZONOCCLUSION) && defined(BUMP) && defined(REFLECTIONMAP_3D)\ngl_FragColor.rgb=vec3(eho);\n#elif DEBUGMODE==82 && defined(MS_BRDF_ENERGY_CONSERVATION)\ngl_FragColor.rgb=vec3(energyConservationFactor);\n#elif DEBUGMODE==83 && defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\ngl_FragColor.rgb=specularEnvironmentReflectance;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==84 && defined(CLEARCOAT) && defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\ngl_FragColor.rgb=clearcoatOut.clearCoatEnvironmentReflectance;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==85 && defined(SHEEN) && defined(REFLECTION)\ngl_FragColor.rgb=sheenOut.sheenEnvironmentReflectance;\n#define DEBUGMODE_GAMMA\n#elif DEBUGMODE==86 && defined(ALPHABLEND)\ngl_FragColor.rgb=vec3(luminanceOverAlpha);\n#elif DEBUGMODE==87\ngl_FragColor.rgb=vec3(alpha);\n#elif DEBUGMODE==88 && defined(ALBEDO)\ngl_FragColor.rgb=vec3(albedoTexture.a);\n#elif DEBUGMODE==89\ngl_FragColor.rgb=aoOut.ambientOcclusionColor.rgb;\n#else\nfloat stripeWidth=30.;float stripePos=floor((gl_FragCoord.x+gl_FragCoord.y)/stripeWidth);float whichColor=mod(stripePos,2.);vec3 color1=vec3(.6,.2,.2);vec3 color2=vec3(.3,.1,.1);gl_FragColor.rgb=mix(color1,color2,whichColor);\n#endif\ngl_FragColor.rgb*=vDebugMode.y;\n#ifdef DEBUGMODE_NORMALIZE\ngl_FragColor.rgb=normalize(gl_FragColor.rgb)*0.5+0.5;\n#endif\n#ifdef DEBUGMODE_GAMMA\ngl_FragColor.rgb=toGammaSpace(gl_FragColor.rgb);\n#endif\ngl_FragColor.a=1.0;\n#ifdef PREPASS\ngl_FragData[0]=toLinearSpace(gl_FragColor); \ngl_FragData[1]=vec4(0.,0.,0.,0.); \n#endif\n#ifdef DEBUGMODE_FORCERETURN\nreturn;\n#endif\n}\n#endif\n`;\nY.IncludesShadersStore[TP] = xP;\nconst CP = \"pbrPixelShader\", RP = `#if defined(BUMP) || !defined(NORMAL) || defined(FORCENORMALFORWARD) || defined(SPECULARAA) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#extension GL_OES_standard_derivatives : enable\n#endif\n#ifdef LODBASEDMICROSFURACE\n#extension GL_EXT_shader_texture_lod : enable\n#endif\n#define CUSTOM_FRAGMENT_BEGIN\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\n#include[SCENE_MRT_COUNT]\nprecision highp float;\n#include\n#ifndef FROMLINEARSPACE\n#define FROMLINEARSPACE\n#endif\n#include<__decl__pbrFragment>\n#include\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#ifdef REFLECTION\n#include\n#endif\n#define CUSTOM_FRAGMENT_DEFINITIONS\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#include\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include\n#include\n#include\n#include\nalbedoOpacityOutParams albedoOpacityOut;\n#ifdef ALBEDO\nvec4 albedoTexture=texture2D(albedoSampler,vAlbedoUV+uvOffset);\n#endif\n#ifdef OPACITY\nvec4 opacityMap=texture2D(opacitySampler,vOpacityUV+uvOffset);\n#endif\n#ifdef DECAL\nvec4 decalColor=texture2D(decalSampler,vDecalUV+uvOffset);\n#endif\nalbedoOpacityBlock(\nvAlbedoColor,\n#ifdef ALBEDO\nalbedoTexture,\nvAlbedoInfos,\n#endif\n#ifdef OPACITY\nopacityMap,\nvOpacityInfos,\n#endif\n#ifdef DETAIL\ndetailColor,\nvDetailInfos,\n#endif\n#ifdef DECAL\ndecalColor,\nvDecalInfos,\n#endif\nalbedoOpacityOut\n);vec3 surfaceAlbedo=albedoOpacityOut.surfaceAlbedo;float alpha=albedoOpacityOut.alpha;\n#define CUSTOM_FRAGMENT_UPDATE_ALPHA\n#include\n#define CUSTOM_FRAGMENT_BEFORE_LIGHTS\nambientOcclusionOutParams aoOut;\n#ifdef AMBIENT\nvec3 ambientOcclusionColorMap=texture2D(ambientSampler,vAmbientUV+uvOffset).rgb;\n#endif\nambientOcclusionBlock(\n#ifdef AMBIENT\nambientOcclusionColorMap,\nvAmbientInfos,\n#endif\naoOut\n);\n#include\n#ifdef UNLIT\nvec3 diffuseBase=vec3(1.,1.,1.);\n#else\nvec3 baseColor=surfaceAlbedo;reflectivityOutParams reflectivityOut;\n#if defined(REFLECTIVITY)\nvec4 surfaceMetallicOrReflectivityColorMap=texture2D(reflectivitySampler,vReflectivityUV+uvOffset);vec4 baseReflectivity=surfaceMetallicOrReflectivityColorMap;\n#ifndef METALLICWORKFLOW\n#ifdef REFLECTIVITY_GAMMA\nsurfaceMetallicOrReflectivityColorMap=toLinearSpace(surfaceMetallicOrReflectivityColorMap);\n#endif\nsurfaceMetallicOrReflectivityColorMap.rgb*=vReflectivityInfos.y;\n#endif\n#endif\n#if defined(MICROSURFACEMAP)\nvec4 microSurfaceTexel=texture2D(microSurfaceSampler,vMicroSurfaceSamplerUV+uvOffset)*vMicroSurfaceSamplerInfos.y;\n#endif\n#ifdef METALLICWORKFLOW\nvec4 metallicReflectanceFactors=vMetallicReflectanceFactors;\n#ifdef REFLECTANCE\nvec4 reflectanceFactorsMap=texture2D(reflectanceSampler,vReflectanceUV+uvOffset);\n#ifdef REFLECTANCE_GAMMA\nreflectanceFactorsMap=toLinearSpace(reflectanceFactorsMap);\n#endif\nmetallicReflectanceFactors.rgb*=reflectanceFactorsMap.rgb;\n#endif\n#ifdef METALLIC_REFLECTANCE\nvec4 metallicReflectanceFactorsMap=texture2D(metallicReflectanceSampler,vMetallicReflectanceUV+uvOffset);\n#ifdef METALLIC_REFLECTANCE_GAMMA\nmetallicReflectanceFactorsMap=toLinearSpace(metallicReflectanceFactorsMap);\n#endif\n#ifndef METALLIC_REFLECTANCE_USE_ALPHA_ONLY\nmetallicReflectanceFactors.rgb*=metallicReflectanceFactorsMap.rgb;\n#endif\nmetallicReflectanceFactors*=metallicReflectanceFactorsMap.a;\n#endif\n#endif\nreflectivityBlock(\nvReflectivityColor,\n#ifdef METALLICWORKFLOW\nsurfaceAlbedo,\nmetallicReflectanceFactors,\n#endif\n#ifdef REFLECTIVITY\nvReflectivityInfos,\nsurfaceMetallicOrReflectivityColorMap,\n#endif\n#if defined(METALLICWORKFLOW) && defined(REFLECTIVITY) && defined(AOSTOREINMETALMAPRED)\naoOut.ambientOcclusionColor,\n#endif\n#ifdef MICROSURFACEMAP\nmicroSurfaceTexel,\n#endif\n#ifdef DETAIL\ndetailColor,\nvDetailInfos,\n#endif\nreflectivityOut\n);float microSurface=reflectivityOut.microSurface;float roughness=reflectivityOut.roughness;\n#ifdef METALLICWORKFLOW\nsurfaceAlbedo=reflectivityOut.surfaceAlbedo;\n#endif\n#if defined(METALLICWORKFLOW) && defined(REFLECTIVITY) && defined(AOSTOREINMETALMAPRED)\naoOut.ambientOcclusionColor=reflectivityOut.ambientOcclusionColor;\n#endif\n#ifdef ALPHAFRESNEL\n#if defined(ALPHATEST) || defined(ALPHABLEND)\nalphaFresnelOutParams alphaFresnelOut;alphaFresnelBlock(\nnormalW,\nviewDirectionW,\nalpha,\nmicroSurface,\nalphaFresnelOut\n);alpha=alphaFresnelOut.alpha;\n#endif\n#endif\n#include\n#ifdef ANISOTROPIC\nanisotropicOutParams anisotropicOut;\n#ifdef ANISOTROPIC_TEXTURE\nvec3 anisotropyMapData=texture2D(anisotropySampler,vAnisotropyUV+uvOffset).rgb*vAnisotropyInfos.y;\n#endif\nanisotropicBlock(\nvAnisotropy,\nroughness,\n#ifdef ANISOTROPIC_TEXTURE\nanisotropyMapData,\n#endif\nTBN,\nnormalW,\nviewDirectionW,\nanisotropicOut\n);\n#endif\n#ifdef REFLECTION\nreflectionOutParams reflectionOut;\n#ifndef USE_CUSTOM_REFLECTION\nreflectionBlock(\nvPositionW,\nnormalW,\nalphaG,\nvReflectionMicrosurfaceInfos,\nvReflectionInfos,\nvReflectionColor,\n#ifdef ANISOTROPIC\nanisotropicOut,\n#endif\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nNdotVUnclamped,\n#endif\n#ifdef LINEARSPECULARREFLECTION\nroughness,\n#endif\nreflectionSampler,\n#if defined(NORMAL) && defined(USESPHERICALINVERTEX)\nvEnvironmentIrradiance,\n#endif\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\nreflectionMatrix,\n#endif\n#endif\n#ifdef USEIRRADIANCEMAP\nirradianceSampler,\n#endif\n#ifndef LODBASEDMICROSFURACE\nreflectionSamplerLow,\nreflectionSamplerHigh,\n#endif\n#ifdef REALTIME_FILTERING\nvReflectionFilteringInfo,\n#endif\nreflectionOut\n);\n#else\n#define CUSTOM_REFLECTION\n#endif\n#endif\n#include\n#ifdef SHEEN\nsheenOutParams sheenOut;\n#ifdef SHEEN_TEXTURE\nvec4 sheenMapData=texture2D(sheenSampler,vSheenUV+uvOffset);\n#endif\n#if defined(SHEEN_ROUGHNESS) && defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE)\nvec4 sheenMapRoughnessData=texture2D(sheenRoughnessSampler,vSheenRoughnessUV+uvOffset)*vSheenInfos.w;\n#endif\nsheenBlock(\nvSheenColor,\n#ifdef SHEEN_ROUGHNESS\nvSheenRoughness,\n#if defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE)\nsheenMapRoughnessData,\n#endif\n#endif\nroughness,\n#ifdef SHEEN_TEXTURE\nsheenMapData,\nvSheenInfos.y,\n#endif\nreflectance,\n#ifdef SHEEN_LINKWITHALBEDO\nbaseColor,\nsurfaceAlbedo,\n#endif\n#ifdef ENVIRONMENTBRDF\nNdotV,\nenvironmentBrdf,\n#endif\n#if defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nAARoughnessFactors,\nvReflectionMicrosurfaceInfos,\nvReflectionInfos,\nvReflectionColor,\nvLightingIntensity,\nreflectionSampler,\nreflectionOut.reflectionCoords,\nNdotVUnclamped,\n#ifndef LODBASEDMICROSFURACE\nreflectionSamplerLow,\nreflectionSamplerHigh,\n#endif\n#ifdef REALTIME_FILTERING\nvReflectionFilteringInfo,\n#endif\n#if !defined(REFLECTIONMAP_SKYBOX) && defined(RADIANCEOCCLUSION)\nseo,\n#endif\n#if !defined(REFLECTIONMAP_SKYBOX) && defined(HORIZONOCCLUSION) && defined(BUMP) && defined(REFLECTIONMAP_3D)\neho,\n#endif\n#endif\nsheenOut\n);\n#ifdef SHEEN_LINKWITHALBEDO\nsurfaceAlbedo=sheenOut.surfaceAlbedo;\n#endif\n#endif\n#ifdef CLEARCOAT\n#ifdef CLEARCOAT_TEXTURE\nvec2 clearCoatMapData=texture2D(clearCoatSampler,vClearCoatUV+uvOffset).rg*vClearCoatInfos.y;\n#endif\n#endif\n#ifdef IRIDESCENCE\niridescenceOutParams iridescenceOut;\n#ifdef IRIDESCENCE_TEXTURE\nvec2 iridescenceMapData=texture2D(iridescenceSampler,vIridescenceUV+uvOffset).rg*vIridescenceInfos.y;\n#endif\n#ifdef IRIDESCENCE_THICKNESS_TEXTURE\nvec2 iridescenceThicknessMapData=texture2D(iridescenceThicknessSampler,vIridescenceThicknessUV+uvOffset).rg*vIridescenceInfos.w;\n#endif\niridescenceBlock(\nvIridescenceParams,\nNdotV,\nspecularEnvironmentR0,\n#ifdef IRIDESCENCE_TEXTURE\niridescenceMapData,\n#endif\n#ifdef IRIDESCENCE_THICKNESS_TEXTURE\niridescenceThicknessMapData,\n#endif\n#ifdef CLEARCOAT\nNdotVUnclamped,\n#ifdef CLEARCOAT_TEXTURE\nclearCoatMapData,\n#endif\n#endif\niridescenceOut\n);float iridescenceIntensity=iridescenceOut.iridescenceIntensity;specularEnvironmentR0=iridescenceOut.specularEnvironmentR0;\n#endif\nclearcoatOutParams clearcoatOut;\n#ifdef CLEARCOAT\n#if defined(CLEARCOAT_TEXTURE_ROUGHNESS) && !defined(CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE)\nvec4 clearCoatMapRoughnessData=texture2D(clearCoatRoughnessSampler,vClearCoatRoughnessUV+uvOffset)*vClearCoatInfos.w;\n#endif\n#if defined(CLEARCOAT_TINT) && defined(CLEARCOAT_TINT_TEXTURE)\nvec4 clearCoatTintMapData=texture2D(clearCoatTintSampler,vClearCoatTintUV+uvOffset);\n#endif\n#ifdef CLEARCOAT_BUMP\nvec4 clearCoatBumpMapData=texture2D(clearCoatBumpSampler,vClearCoatBumpUV+uvOffset);\n#endif\nclearcoatBlock(\nvPositionW,\ngeometricNormalW,\nviewDirectionW,\nvClearCoatParams,\n#if defined(CLEARCOAT_TEXTURE_ROUGHNESS) && !defined(CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE)\nclearCoatMapRoughnessData,\n#endif\nspecularEnvironmentR0,\n#ifdef CLEARCOAT_TEXTURE\nclearCoatMapData,\n#endif\n#ifdef CLEARCOAT_TINT\nvClearCoatTintParams,\nclearCoatColorAtDistance,\nvClearCoatRefractionParams,\n#ifdef CLEARCOAT_TINT_TEXTURE\nclearCoatTintMapData,\n#endif\n#endif\n#ifdef CLEARCOAT_BUMP\nvClearCoatBumpInfos,\nclearCoatBumpMapData,\nvClearCoatBumpUV,\n#if defined(TANGENT) && defined(NORMAL)\nvTBN,\n#else\nvClearCoatTangentSpaceParams,\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\nnormalMatrix,\n#endif\n#endif\n#if defined(FORCENORMALFORWARD) && defined(NORMAL)\nfaceNormal,\n#endif\n#ifdef REFLECTION\nvReflectionMicrosurfaceInfos,\nvReflectionInfos,\nvReflectionColor,\nvLightingIntensity,\nreflectionSampler,\n#ifndef LODBASEDMICROSFURACE\nreflectionSamplerLow,\nreflectionSamplerHigh,\n#endif\n#ifdef REALTIME_FILTERING\nvReflectionFilteringInfo,\n#endif\n#endif\n#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\n#ifdef RADIANCEOCCLUSION\nambientMonochrome,\n#endif\n#endif\n#if defined(CLEARCOAT_BUMP) || defined(TWOSIDEDLIGHTING)\n(gl_FrontFacing ? 1. : -1.),\n#endif\nclearcoatOut\n);\n#else\nclearcoatOut.specularEnvironmentR0=specularEnvironmentR0;\n#endif\n#include\nsubSurfaceOutParams subSurfaceOut;\n#ifdef SUBSURFACE\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nvec4 thicknessMap=texture2D(thicknessSampler,vThicknessUV+uvOffset);\n#endif\n#ifdef SS_REFRACTIONINTENSITY_TEXTURE\nvec4 refractionIntensityMap=texture2D(refractionIntensitySampler,vRefractionIntensityUV+uvOffset);\n#endif\n#ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE\nvec4 translucencyIntensityMap=texture2D(translucencyIntensitySampler,vTranslucencyIntensityUV+uvOffset);\n#endif\nsubSurfaceBlock(\nvSubSurfaceIntensity,\nvThicknessParam,\nvTintColor,\nnormalW,\nspecularEnvironmentReflectance,\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nthicknessMap,\n#endif\n#ifdef SS_REFRACTIONINTENSITY_TEXTURE\nrefractionIntensityMap,\n#endif\n#ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE\ntranslucencyIntensityMap,\n#endif\n#ifdef REFLECTION\n#ifdef SS_TRANSLUCENCY\nreflectionMatrix,\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\nreflectionOut.irradianceVector,\n#endif\n#if defined(REALTIME_FILTERING)\nreflectionSampler,\nvReflectionFilteringInfo,\n#endif\n#endif\n#ifdef USEIRRADIANCEMAP\nirradianceSampler,\n#endif\n#endif\n#endif\n#if defined(SS_REFRACTION) || defined(SS_TRANSLUCENCY)\nsurfaceAlbedo,\n#endif\n#ifdef SS_REFRACTION\nvPositionW,\nviewDirectionW,\nview,\nvRefractionInfos,\nrefractionMatrix,\nvRefractionMicrosurfaceInfos,\nvLightingIntensity,\n#ifdef SS_LINKREFRACTIONTOTRANSPARENCY\nalpha,\n#endif\n#ifdef SS_LODINREFRACTIONALPHA\nNdotVUnclamped,\n#endif\n#ifdef SS_LINEARSPECULARREFRACTION\nroughness,\n#endif\nalphaG,\nrefractionSampler,\n#ifndef LODBASEDMICROSFURACE\nrefractionSamplerLow,\nrefractionSamplerHigh,\n#endif\n#ifdef ANISOTROPIC\nanisotropicOut,\n#endif\n#ifdef REALTIME_FILTERING\nvRefractionFilteringInfo,\n#endif\n#ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC\nvRefractionPosition,\nvRefractionSize,\n#endif\n#ifdef SS_DISPERSION\ndispersion,\n#endif\n#endif\n#ifdef SS_TRANSLUCENCY\nvDiffusionDistance,\n#endif\nsubSurfaceOut\n);\n#ifdef SS_REFRACTION\nsurfaceAlbedo=subSurfaceOut.surfaceAlbedo;\n#ifdef SS_LINKREFRACTIONTOTRANSPARENCY\nalpha=subSurfaceOut.alpha;\n#endif\n#endif\n#else\nsubSurfaceOut.specularEnvironmentReflectance=specularEnvironmentReflectance;\n#endif\n#include\n#include[0..maxSimultaneousLights]\n#include\n#endif \n#include\n#define CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\n#include\n#include\n#include(color,finalColor)\n#include\n#define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\n#ifdef PREPASS\nfloat writeGeometryInfo=finalColor.a>0.4 ? 1.0 : 0.0;\n#ifdef PREPASS_POSITION\ngl_FragData[PREPASS_POSITION_INDEX]=vec4(vPositionW,writeGeometryInfo);\n#endif\n#ifdef PREPASS_VELOCITY\nvec2 a=(vCurrentPosition.xy/vCurrentPosition.w)*0.5+0.5;vec2 b=(vPreviousPosition.xy/vPreviousPosition.w)*0.5+0.5;vec2 velocity=abs(a-b);velocity=vec2(pow(velocity.x,1.0/3.0),pow(velocity.y,1.0/3.0))*sign(a-b)*0.5+0.5;gl_FragData[PREPASS_VELOCITY_INDEX]=vec4(velocity,0.0,writeGeometryInfo);\n#endif\n#ifdef PREPASS_ALBEDO_SQRT\nvec3 sqAlbedo=sqrt(surfaceAlbedo); \n#endif\n#ifdef PREPASS_IRRADIANCE\nvec3 irradiance=finalDiffuse;\n#ifndef UNLIT\n#ifdef REFLECTION\nirradiance+=finalIrradiance;\n#endif\n#endif\n#ifdef SS_SCATTERING\ngl_FragData[0]=vec4(finalColor.rgb-irradiance,finalColor.a); \nirradiance/=sqAlbedo;\n#else\ngl_FragData[0]=finalColor; \nfloat scatteringDiffusionProfile=255.;\n#endif\ngl_FragData[PREPASS_IRRADIANCE_INDEX]=vec4(clamp(irradiance,vec3(0.),vec3(1.)),writeGeometryInfo*scatteringDiffusionProfile/255.); \n#else\ngl_FragData[0]=vec4(finalColor.rgb,finalColor.a);\n#endif\n#ifdef PREPASS_DEPTH\ngl_FragData[PREPASS_DEPTH_INDEX]=vec4(vViewPos.z,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_NORMAL\n#ifdef PREPASS_NORMAL_WORLDSPACE\ngl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalW,writeGeometryInfo); \n#else\ngl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalize((view*vec4(normalW,0.0)).rgb),writeGeometryInfo); \n#endif\n#endif\n#ifdef PREPASS_ALBEDO_SQRT\ngl_FragData[PREPASS_ALBEDO_SQRT_INDEX]=vec4(sqAlbedo,writeGeometryInfo); \n#endif\n#ifdef PREPASS_REFLECTIVITY\n#ifndef UNLIT\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(specularEnvironmentR0,microSurface)*writeGeometryInfo;\n#else\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4( 0.0,0.0,0.0,1.0 )*writeGeometryInfo;\n#endif\n#endif\n#endif\n#if !defined(PREPASS) || defined(WEBGL2)\ngl_FragColor=finalColor;\n#endif\n#include\n#if ORDER_INDEPENDENT_TRANSPARENCY\nif (fragDepth==nearestDepth) {frontColor.rgb+=finalColor.rgb*finalColor.a*alphaMultiplier;frontColor.a=1.0-alphaMultiplier*(1.0-finalColor.a);} else {backColor+=finalColor;}\n#endif\n#include\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n`;\nY.ShadersStore[CP] = RP;\nconst SP = \"pbrVertexDeclaration\", yP = `uniform mat4 view;uniform mat4 viewProjection;\n#ifdef ALBEDO\nuniform mat4 albedoMatrix;uniform vec2 vAlbedoInfos;\n#endif\n#ifdef AMBIENT\nuniform mat4 ambientMatrix;uniform vec4 vAmbientInfos;\n#endif\n#ifdef OPACITY\nuniform mat4 opacityMatrix;uniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;uniform mat4 emissiveMatrix;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;uniform mat4 lightmapMatrix;\n#endif\n#ifdef REFLECTIVITY \nuniform vec3 vReflectivityInfos;uniform mat4 reflectivityMatrix;\n#endif\n#ifdef METALLIC_REFLECTANCE\nuniform vec2 vMetallicReflectanceInfos;uniform mat4 metallicReflectanceMatrix;\n#endif\n#ifdef REFLECTANCE\nuniform vec2 vReflectanceInfos;uniform mat4 reflectanceMatrix;\n#endif\n#ifdef MICROSURFACEMAP\nuniform vec2 vMicroSurfaceSamplerInfos;uniform mat4 microSurfaceSamplerMatrix;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;uniform mat4 bumpMatrix;\n#endif\n#ifdef POINTSIZE\nuniform float pointSize;\n#endif\n#ifdef REFLECTION\nuniform vec2 vReflectionInfos;uniform mat4 reflectionMatrix;\n#endif\n#ifdef CLEARCOAT\n#if defined(CLEARCOAT_TEXTURE) || defined(CLEARCOAT_TEXTURE_ROUGHNESS)\nuniform vec4 vClearCoatInfos;\n#endif\n#ifdef CLEARCOAT_TEXTURE\nuniform mat4 clearCoatMatrix;\n#endif\n#ifdef CLEARCOAT_TEXTURE_ROUGHNESS\nuniform mat4 clearCoatRoughnessMatrix;\n#endif\n#ifdef CLEARCOAT_BUMP\nuniform vec2 vClearCoatBumpInfos;uniform mat4 clearCoatBumpMatrix;\n#endif\n#ifdef CLEARCOAT_TINT_TEXTURE\nuniform vec2 vClearCoatTintInfos;uniform mat4 clearCoatTintMatrix;\n#endif\n#endif\n#ifdef IRIDESCENCE\n#if defined(IRIDESCENCE_TEXTURE) || defined(IRIDESCENCE_THICKNESS_TEXTURE)\nuniform vec4 vIridescenceInfos;\n#endif\n#ifdef IRIDESCENCE_TEXTURE\nuniform mat4 iridescenceMatrix;\n#endif\n#ifdef IRIDESCENCE_THICKNESS_TEXTURE\nuniform mat4 iridescenceThicknessMatrix;\n#endif\n#endif\n#ifdef ANISOTROPIC\n#ifdef ANISOTROPIC_TEXTURE\nuniform vec2 vAnisotropyInfos;uniform mat4 anisotropyMatrix;\n#endif\n#endif\n#ifdef SHEEN\n#if defined(SHEEN_TEXTURE) || defined(SHEEN_TEXTURE_ROUGHNESS)\nuniform vec4 vSheenInfos;\n#endif\n#ifdef SHEEN_TEXTURE\nuniform mat4 sheenMatrix;\n#endif\n#ifdef SHEEN_TEXTURE_ROUGHNESS\nuniform mat4 sheenRoughnessMatrix;\n#endif\n#endif\n#ifdef SUBSURFACE\n#ifdef SS_REFRACTION\nuniform vec4 vRefractionInfos;uniform mat4 refractionMatrix;\n#endif\n#ifdef SS_THICKNESSANDMASK_TEXTURE\nuniform vec2 vThicknessInfos;uniform mat4 thicknessMatrix;\n#endif\n#ifdef SS_REFRACTIONINTENSITY_TEXTURE\nuniform vec2 vRefractionIntensityInfos;uniform mat4 refractionIntensityMatrix;\n#endif\n#ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE\nuniform vec2 vTranslucencyIntensityInfos;uniform mat4 translucencyIntensityMatrix;\n#endif\n#endif\n#ifdef NORMAL\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#ifdef SPHERICAL_HARMONICS\nuniform vec3 vSphericalL00;uniform vec3 vSphericalL1_1;uniform vec3 vSphericalL10;uniform vec3 vSphericalL11;uniform vec3 vSphericalL2_2;uniform vec3 vSphericalL2_1;uniform vec3 vSphericalL20;uniform vec3 vSphericalL21;uniform vec3 vSphericalL22;\n#else\nuniform vec3 vSphericalX;uniform vec3 vSphericalY;uniform vec3 vSphericalZ;uniform vec3 vSphericalXX_ZZ;uniform vec3 vSphericalYY_ZZ;uniform vec3 vSphericalZZ;uniform vec3 vSphericalXY;uniform vec3 vSphericalYZ;uniform vec3 vSphericalZX;\n#endif\n#endif\n#endif\n#endif\n#ifdef DETAIL\nuniform vec4 vDetailInfos;uniform mat4 detailMatrix;\n#endif\n#include\n#define ADDITIONAL_VERTEX_DECLARATION\n`;\nY.IncludesShadersStore[SP] = yP;\nconst IP = \"pbrVertexShader\", bP = `precision highp float;\n#include<__decl__pbrVertex>\n#define CUSTOM_VERTEX_BEGIN\nattribute vec3 position;\n#ifdef NORMAL\nattribute vec3 normal;\n#endif\n#ifdef TANGENT\nattribute vec4 tangent;\n#endif\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#include[2..7]\n#include[1..7]\n#ifdef VERTEXCOLOR\nattribute vec4 color;\n#endif\n#include\n#include\n#include\n#include\n#include\n#include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap)\n#include(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity)\n#include(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler)\n#include(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance)\n#include(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance)\n#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal)\n#ifdef CLEARCOAT\n#include(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat)\n#include(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness)\n#include(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump)\n#include(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint)\n#endif\n#ifdef IRIDESCENCE\n#include(_DEFINENAME_,IRIDESCENCE_TEXTURE,_VARYINGNAME_,Iridescence)\n#include(_DEFINENAME_,IRIDESCENCE_THICKNESS_TEXTURE,_VARYINGNAME_,IridescenceThickness)\n#endif\n#ifdef SHEEN\n#include(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen)\n#include(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness)\n#endif\n#ifdef ANISOTROPIC\n#include(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy)\n#endif\n#ifdef SUBSURFACE\n#include(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness)\n#include(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity)\n#include(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity)\n#endif\nvarying vec3 vPositionW;\n#if DEBUGMODE>0\nvarying vec4 vClipSpacePosition;\n#endif\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvarying vec3 vEnvironmentIrradiance;\n#include\n#endif\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#include\n#include\n#include\n#include<__decl__lightVxFragment>[0..maxSimultaneousLights]\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#include\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvec3 positionUpdated=position;\n#ifdef NORMAL\nvec3 normalUpdated=normal;\n#endif\n#ifdef TANGENT\nvec4 tangentUpdated=tangent;\n#endif\n#ifdef UV1\nvec2 uvUpdated=uv;\n#endif\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvPositionUVW=positionUpdated;\n#endif\n#define CUSTOM_VERTEX_UPDATE_POSITION\n#define CUSTOM_VERTEX_UPDATE_NORMAL\n#include\n#if defined(PREPASS) && defined(PREPASS_VELOCITY) && !defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*finalWorld*vec4(positionUpdated,1.0);vPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\n#endif\n#include\n#include\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);vPositionW=vec3(worldPos);\n#include\n#ifdef NORMAL\nmat3 normalWorld=mat3(finalWorld);\n#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvNormalW=normalUpdated/vec3(dot(normalWorld[0],normalWorld[0]),dot(normalWorld[1],normalWorld[1]),dot(normalWorld[2],normalWorld[2]));vNormalW=normalize(normalWorld*vNormalW);\n#else\n#ifdef NONUNIFORMSCALING\nnormalWorld=transposeMat3(inverseMat3(normalWorld));\n#endif\nvNormalW=normalize(normalWorld*normalUpdated);\n#endif\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvec3 reflectionVector=vec3(reflectionMatrix*vec4(vNormalW,0)).xyz;\n#ifdef REFLECTIONMAP_OPPOSITEZ\nreflectionVector.z*=-1.0;\n#endif\nvEnvironmentIrradiance=computeEnvironmentIrradiance(reflectionVector);\n#endif\n#endif\n#define CUSTOM_VERTEX_UPDATE_WORLDPOS\n#ifdef MULTIVIEW\nif (gl_ViewID_OVR==0u) {gl_Position=viewProjection*worldPos;} else {gl_Position=viewProjectionR*worldPos;}\n#else\ngl_Position=viewProjection*worldPos;\n#endif\n#if DEBUGMODE>0\nvClipSpacePosition=gl_Position;\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0)));\n#endif\n#ifndef UV1\nvec2 uvUpdated=vec2(0.,0.);\n#endif\n#ifdef MAINUV1\nvMainUV1=uvUpdated;\n#endif\n#include[2..7]\n#include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_MATRIXNAME_,albedo,_INFONAME_,AlbedoInfos.x)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_MATRIXNAME_,emissive,_INFONAME_,EmissiveInfos.x)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_MATRIXNAME_,lightmap,_INFONAME_,LightmapInfos.x)\n#include(_DEFINENAME_,REFLECTIVITY,_VARYINGNAME_,Reflectivity,_MATRIXNAME_,reflectivity,_INFONAME_,ReflectivityInfos.x)\n#include(_DEFINENAME_,MICROSURFACEMAP,_VARYINGNAME_,MicroSurfaceSampler,_MATRIXNAME_,microSurfaceSampler,_INFONAME_,MicroSurfaceSamplerInfos.x)\n#include(_DEFINENAME_,METALLIC_REFLECTANCE,_VARYINGNAME_,MetallicReflectance,_MATRIXNAME_,metallicReflectance,_INFONAME_,MetallicReflectanceInfos.x)\n#include(_DEFINENAME_,REFLECTANCE,_VARYINGNAME_,Reflectance,_MATRIXNAME_,reflectance,_INFONAME_,ReflectanceInfos.x)\n#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_MATRIXNAME_,bump,_INFONAME_,BumpInfos.x)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_MATRIXNAME_,decal,_INFONAME_,DecalInfos.x)\n#ifdef CLEARCOAT\n#include(_DEFINENAME_,CLEARCOAT_TEXTURE,_VARYINGNAME_,ClearCoat,_MATRIXNAME_,clearCoat,_INFONAME_,ClearCoatInfos.x)\n#include(_DEFINENAME_,CLEARCOAT_TEXTURE_ROUGHNESS,_VARYINGNAME_,ClearCoatRoughness,_MATRIXNAME_,clearCoatRoughness,_INFONAME_,ClearCoatInfos.z)\n#include(_DEFINENAME_,CLEARCOAT_BUMP,_VARYINGNAME_,ClearCoatBump,_MATRIXNAME_,clearCoatBump,_INFONAME_,ClearCoatBumpInfos.x)\n#include(_DEFINENAME_,CLEARCOAT_TINT_TEXTURE,_VARYINGNAME_,ClearCoatTint,_MATRIXNAME_,clearCoatTint,_INFONAME_,ClearCoatTintInfos.x)\n#endif\n#ifdef IRIDESCENCE\n#include(_DEFINENAME_,IRIDESCENCE_TEXTURE,_VARYINGNAME_,Iridescence,_MATRIXNAME_,iridescence,_INFONAME_,IridescenceInfos.x)\n#include(_DEFINENAME_,IRIDESCENCE_THICKNESS_TEXTURE,_VARYINGNAME_,IridescenceThickness,_MATRIXNAME_,iridescenceThickness,_INFONAME_,IridescenceInfos.z)\n#endif\n#ifdef SHEEN\n#include(_DEFINENAME_,SHEEN_TEXTURE,_VARYINGNAME_,Sheen,_MATRIXNAME_,sheen,_INFONAME_,SheenInfos.x)\n#include(_DEFINENAME_,SHEEN_TEXTURE_ROUGHNESS,_VARYINGNAME_,SheenRoughness,_MATRIXNAME_,sheenRoughness,_INFONAME_,SheenInfos.z)\n#endif\n#ifdef ANISOTROPIC\n#include(_DEFINENAME_,ANISOTROPIC_TEXTURE,_VARYINGNAME_,Anisotropy,_MATRIXNAME_,anisotropy,_INFONAME_,AnisotropyInfos.x)\n#endif\n#ifdef SUBSURFACE\n#include(_DEFINENAME_,SS_THICKNESSANDMASK_TEXTURE,_VARYINGNAME_,Thickness,_MATRIXNAME_,thickness,_INFONAME_,ThicknessInfos.x)\n#include(_DEFINENAME_,SS_REFRACTIONINTENSITY_TEXTURE,_VARYINGNAME_,RefractionIntensity,_MATRIXNAME_,refractionIntensity,_INFONAME_,RefractionIntensityInfos.x)\n#include(_DEFINENAME_,SS_TRANSLUCENCYINTENSITY_TEXTURE,_VARYINGNAME_,TranslucencyIntensity,_MATRIXNAME_,translucencyIntensity,_INFONAME_,TranslucencyIntensityInfos.x)\n#endif\n#include\n#include\n#include\n#include[0..maxSimultaneousLights]\n#include\n#if defined(POINTSIZE) && !defined(WEBGPU)\ngl_PointSize=pointSize;\n#endif\n#include\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[IP] = bP;\nclass AP extends es {\n constructor() {\n super(...arguments), this.CLEARCOAT = !1, this.CLEARCOAT_DEFAULTIOR = !1, this.CLEARCOAT_TEXTURE = !1, this.CLEARCOAT_TEXTURE_ROUGHNESS = !1, this.CLEARCOAT_TEXTUREDIRECTUV = 0, this.CLEARCOAT_TEXTURE_ROUGHNESSDIRECTUV = 0, this.CLEARCOAT_BUMP = !1, this.CLEARCOAT_BUMPDIRECTUV = 0, this.CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE = !1, this.CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL = !1, this.CLEARCOAT_REMAP_F0 = !1, this.CLEARCOAT_TINT = !1, this.CLEARCOAT_TINT_TEXTURE = !1, this.CLEARCOAT_TINT_TEXTUREDIRECTUV = 0, this.CLEARCOAT_TINT_GAMMATEXTURE = !1;\n }\n}\nclass Si extends Ur {\n /** @internal */\n _markAllSubMeshesAsTexturesDirty() {\n this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty();\n }\n constructor(e, t = !0) {\n super(e, \"PBRClearCoat\", 100, new AP(), t), this._isEnabled = !1, this.isEnabled = !1, this.intensity = 1, this.roughness = 0, this._indexOfRefraction = Si._DefaultIndexOfRefraction, this.indexOfRefraction = Si._DefaultIndexOfRefraction, this._texture = null, this.texture = null, this._useRoughnessFromMainTexture = !0, this.useRoughnessFromMainTexture = !0, this._textureRoughness = null, this.textureRoughness = null, this._remapF0OnInterfaceChange = !0, this.remapF0OnInterfaceChange = !0, this._bumpTexture = null, this.bumpTexture = null, this._isTintEnabled = !1, this.isTintEnabled = !1, this.tintColor = Ne.White(), this.tintColorAtDistance = 1, this.tintThickness = 1, this._tintTexture = null, this.tintTexture = null, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1];\n }\n isReadyForSubMesh(e, t, i) {\n if (!this._isEnabled)\n return !0;\n const r = this._material._disableBumpMap;\n return !(e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.ClearCoatTextureEnabled && !this._texture.isReadyOrNotBlocking() || this._textureRoughness && ae.ClearCoatTextureEnabled && !this._textureRoughness.isReadyOrNotBlocking() || i.getCaps().standardDerivatives && this._bumpTexture && ae.ClearCoatBumpTextureEnabled && !r && !this._bumpTexture.isReady() || this._isTintEnabled && this._tintTexture && ae.ClearCoatTintTextureEnabled && !this._tintTexture.isReadyOrNotBlocking()));\n }\n prepareDefinesBeforeAttributes(e, t) {\n var i;\n this._isEnabled ? (e.CLEARCOAT = !0, e.CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE = this._useRoughnessFromMainTexture, e.CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL = this._texture !== null && this._texture._texture === ((i = this._textureRoughness) == null ? void 0 : i._texture) && this._texture.checkTransformsAreIdentical(this._textureRoughness), e.CLEARCOAT_REMAP_F0 = this._remapF0OnInterfaceChange, e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.ClearCoatTextureEnabled ? wt(this._texture, e, \"CLEARCOAT_TEXTURE\") : e.CLEARCOAT_TEXTURE = !1, this._textureRoughness && ae.ClearCoatTextureEnabled ? wt(this._textureRoughness, e, \"CLEARCOAT_TEXTURE_ROUGHNESS\") : e.CLEARCOAT_TEXTURE_ROUGHNESS = !1, this._bumpTexture && ae.ClearCoatBumpTextureEnabled ? wt(this._bumpTexture, e, \"CLEARCOAT_BUMP\") : e.CLEARCOAT_BUMP = !1, e.CLEARCOAT_DEFAULTIOR = this._indexOfRefraction === Si._DefaultIndexOfRefraction, this._isTintEnabled ? (e.CLEARCOAT_TINT = !0, this._tintTexture && ae.ClearCoatTintTextureEnabled ? (wt(this._tintTexture, e, \"CLEARCOAT_TINT_TEXTURE\"), e.CLEARCOAT_TINT_GAMMATEXTURE = this._tintTexture.gammaSpace) : e.CLEARCOAT_TINT_TEXTURE = !1) : (e.CLEARCOAT_TINT = !1, e.CLEARCOAT_TINT_TEXTURE = !1))) : (e.CLEARCOAT = !1, e.CLEARCOAT_TEXTURE = !1, e.CLEARCOAT_TEXTURE_ROUGHNESS = !1, e.CLEARCOAT_BUMP = !1, e.CLEARCOAT_TINT = !1, e.CLEARCOAT_TINT_TEXTURE = !1, e.CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE = !1, e.CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL = !1, e.CLEARCOAT_DEFAULTIOR = !1, e.CLEARCOAT_TEXTUREDIRECTUV = 0, e.CLEARCOAT_TEXTURE_ROUGHNESSDIRECTUV = 0, e.CLEARCOAT_BUMPDIRECTUV = 0, e.CLEARCOAT_REMAP_F0 = !1, e.CLEARCOAT_TINT_TEXTUREDIRECTUV = 0, e.CLEARCOAT_TINT_GAMMATEXTURE = !1);\n }\n bindForSubMesh(e, t, i, r) {\n var u, f, d, p;\n if (!this._isEnabled)\n return;\n const s = r.materialDefines, a = this._material.isFrozen, o = this._material._disableBumpMap, l = this._material._invertNormalMapX, c = this._material._invertNormalMapY, h = s.CLEARCOAT_TEXTURE_ROUGHNESS_IDENTICAL;\n if (!e.useUbo || !a || !e.isSync) {\n h && ae.ClearCoatTextureEnabled ? (e.updateFloat4(\"vClearCoatInfos\", this._texture.coordinatesIndex, this._texture.level, -1, -1), Mt(this._texture, e, \"clearCoat\")) : (this._texture || this._textureRoughness) && ae.ClearCoatTextureEnabled && (e.updateFloat4(\"vClearCoatInfos\", ((u = this._texture) == null ? void 0 : u.coordinatesIndex) ?? 0, ((f = this._texture) == null ? void 0 : f.level) ?? 0, ((d = this._textureRoughness) == null ? void 0 : d.coordinatesIndex) ?? 0, ((p = this._textureRoughness) == null ? void 0 : p.level) ?? 0), this._texture && Mt(this._texture, e, \"clearCoat\"), this._textureRoughness && !h && !s.CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE && Mt(this._textureRoughness, e, \"clearCoatRoughness\")), this._bumpTexture && i.getCaps().standardDerivatives && ae.ClearCoatTextureEnabled && !o && (e.updateFloat2(\"vClearCoatBumpInfos\", this._bumpTexture.coordinatesIndex, this._bumpTexture.level), Mt(this._bumpTexture, e, \"clearCoatBump\"), t._mirroredCameraPosition ? e.updateFloat2(\"vClearCoatTangentSpaceParams\", l ? 1 : -1, c ? 1 : -1) : e.updateFloat2(\"vClearCoatTangentSpaceParams\", l ? -1 : 1, c ? -1 : 1)), this._tintTexture && ae.ClearCoatTintTextureEnabled && (e.updateFloat2(\"vClearCoatTintInfos\", this._tintTexture.coordinatesIndex, this._tintTexture.level), Mt(this._tintTexture, e, \"clearCoatTint\")), e.updateFloat2(\"vClearCoatParams\", this.intensity, this.roughness);\n const g = 1 - this._indexOfRefraction, m = 1 + this._indexOfRefraction, v = Math.pow(-g / m, 2), E = 1 / this._indexOfRefraction;\n e.updateFloat4(\"vClearCoatRefractionParams\", v, E, g, m), this._isTintEnabled && (e.updateFloat4(\"vClearCoatTintParams\", this.tintColor.r, this.tintColor.g, this.tintColor.b, Math.max(1e-5, this.tintThickness)), e.updateFloat(\"clearCoatColorAtDistance\", Math.max(1e-5, this.tintColorAtDistance)));\n }\n t.texturesEnabled && (this._texture && ae.ClearCoatTextureEnabled && e.setTexture(\"clearCoatSampler\", this._texture), this._textureRoughness && !h && !s.CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE && ae.ClearCoatTextureEnabled && e.setTexture(\"clearCoatRoughnessSampler\", this._textureRoughness), this._bumpTexture && i.getCaps().standardDerivatives && ae.ClearCoatBumpTextureEnabled && !o && e.setTexture(\"clearCoatBumpSampler\", this._bumpTexture), this._isTintEnabled && this._tintTexture && ae.ClearCoatTintTextureEnabled && e.setTexture(\"clearCoatTintSampler\", this._tintTexture));\n }\n hasTexture(e) {\n return this._texture === e || this._textureRoughness === e || this._bumpTexture === e || this._tintTexture === e;\n }\n getActiveTextures(e) {\n this._texture && e.push(this._texture), this._textureRoughness && e.push(this._textureRoughness), this._bumpTexture && e.push(this._bumpTexture), this._tintTexture && e.push(this._tintTexture);\n }\n getAnimatables(e) {\n this._texture && this._texture.animations && this._texture.animations.length > 0 && e.push(this._texture), this._textureRoughness && this._textureRoughness.animations && this._textureRoughness.animations.length > 0 && e.push(this._textureRoughness), this._bumpTexture && this._bumpTexture.animations && this._bumpTexture.animations.length > 0 && e.push(this._bumpTexture), this._tintTexture && this._tintTexture.animations && this._tintTexture.animations.length > 0 && e.push(this._tintTexture);\n }\n dispose(e) {\n var t, i, r, s;\n e && ((t = this._texture) == null || t.dispose(), (i = this._textureRoughness) == null || i.dispose(), (r = this._bumpTexture) == null || r.dispose(), (s = this._tintTexture) == null || s.dispose());\n }\n getClassName() {\n return \"PBRClearCoatConfiguration\";\n }\n addFallbacks(e, t, i) {\n return e.CLEARCOAT_BUMP && t.addFallback(i++, \"CLEARCOAT_BUMP\"), e.CLEARCOAT_TINT && t.addFallback(i++, \"CLEARCOAT_TINT\"), e.CLEARCOAT && t.addFallback(i++, \"CLEARCOAT\"), i;\n }\n getSamplers(e) {\n e.push(\"clearCoatSampler\", \"clearCoatRoughnessSampler\", \"clearCoatBumpSampler\", \"clearCoatTintSampler\");\n }\n getUniforms() {\n return {\n ubo: [\n { name: \"vClearCoatParams\", size: 2, type: \"vec2\" },\n { name: \"vClearCoatRefractionParams\", size: 4, type: \"vec4\" },\n { name: \"vClearCoatInfos\", size: 4, type: \"vec4\" },\n { name: \"clearCoatMatrix\", size: 16, type: \"mat4\" },\n { name: \"clearCoatRoughnessMatrix\", size: 16, type: \"mat4\" },\n { name: \"vClearCoatBumpInfos\", size: 2, type: \"vec2\" },\n { name: \"vClearCoatTangentSpaceParams\", size: 2, type: \"vec2\" },\n { name: \"clearCoatBumpMatrix\", size: 16, type: \"mat4\" },\n { name: \"vClearCoatTintParams\", size: 4, type: \"vec4\" },\n { name: \"clearCoatColorAtDistance\", size: 1, type: \"float\" },\n { name: \"vClearCoatTintInfos\", size: 2, type: \"vec2\" },\n { name: \"clearCoatTintMatrix\", size: 16, type: \"mat4\" }\n ]\n };\n }\n}\nSi._DefaultIndexOfRefraction = 1.5;\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"isEnabled\", void 0);\nP([\n w()\n], Si.prototype, \"intensity\", void 0);\nP([\n w()\n], Si.prototype, \"roughness\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"indexOfRefraction\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"texture\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"useRoughnessFromMainTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"textureRoughness\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"remapF0OnInterfaceChange\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"bumpTexture\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"isTintEnabled\", void 0);\nP([\n $i()\n], Si.prototype, \"tintColor\", void 0);\nP([\n w()\n], Si.prototype, \"tintColorAtDistance\", void 0);\nP([\n w()\n], Si.prototype, \"tintThickness\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Si.prototype, \"tintTexture\", void 0);\nclass MP extends es {\n constructor() {\n super(...arguments), this.IRIDESCENCE = !1, this.IRIDESCENCE_TEXTURE = !1, this.IRIDESCENCE_TEXTUREDIRECTUV = 0, this.IRIDESCENCE_THICKNESS_TEXTURE = !1, this.IRIDESCENCE_THICKNESS_TEXTUREDIRECTUV = 0, this.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE = !1;\n }\n}\nclass lr extends Ur {\n /** @internal */\n _markAllSubMeshesAsTexturesDirty() {\n this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty();\n }\n constructor(e, t = !0) {\n super(e, \"PBRIridescence\", 110, new MP(), t), this._isEnabled = !1, this.isEnabled = !1, this.intensity = 1, this.minimumThickness = lr._DefaultMinimumThickness, this.maximumThickness = lr._DefaultMaximumThickness, this.indexOfRefraction = lr._DefaultIndexOfRefraction, this._texture = null, this.texture = null, this._thicknessTexture = null, this.thicknessTexture = null, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1];\n }\n isReadyForSubMesh(e, t) {\n return this._isEnabled ? !(e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.IridescenceTextureEnabled && !this._texture.isReadyOrNotBlocking() || this._thicknessTexture && ae.IridescenceTextureEnabled && !this._thicknessTexture.isReadyOrNotBlocking())) : !0;\n }\n prepareDefinesBeforeAttributes(e, t) {\n var i;\n this._isEnabled ? (e.IRIDESCENCE = !0, e.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE = this._texture !== null && this._texture._texture === ((i = this._thicknessTexture) == null ? void 0 : i._texture) && this._texture.checkTransformsAreIdentical(this._thicknessTexture), e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.IridescenceTextureEnabled ? wt(this._texture, e, \"IRIDESCENCE_TEXTURE\") : e.IRIDESCENCE_TEXTURE = !1, !e.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE && this._thicknessTexture && ae.IridescenceTextureEnabled ? wt(this._thicknessTexture, e, \"IRIDESCENCE_THICKNESS_TEXTURE\") : e.IRIDESCENCE_THICKNESS_TEXTURE = !1)) : (e.IRIDESCENCE = !1, e.IRIDESCENCE_TEXTURE = !1, e.IRIDESCENCE_THICKNESS_TEXTURE = !1, e.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE = !1, e.IRIDESCENCE_TEXTUREDIRECTUV = 0, e.IRIDESCENCE_THICKNESS_TEXTUREDIRECTUV = 0);\n }\n bindForSubMesh(e, t, i, r) {\n var l, c, h, u;\n if (!this._isEnabled)\n return;\n const s = r.materialDefines, a = this._material.isFrozen, o = s.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE;\n (!e.useUbo || !a || !e.isSync) && (o && ae.IridescenceTextureEnabled ? (e.updateFloat4(\"vIridescenceInfos\", this._texture.coordinatesIndex, this._texture.level, -1, -1), Mt(this._texture, e, \"iridescence\")) : (this._texture || this._thicknessTexture) && ae.IridescenceTextureEnabled && (e.updateFloat4(\"vIridescenceInfos\", ((l = this._texture) == null ? void 0 : l.coordinatesIndex) ?? 0, ((c = this._texture) == null ? void 0 : c.level) ?? 0, ((h = this._thicknessTexture) == null ? void 0 : h.coordinatesIndex) ?? 0, ((u = this._thicknessTexture) == null ? void 0 : u.level) ?? 0), this._texture && Mt(this._texture, e, \"iridescence\"), this._thicknessTexture && !o && !s.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE && Mt(this._thicknessTexture, e, \"iridescenceThickness\")), e.updateFloat4(\"vIridescenceParams\", this.intensity, this.indexOfRefraction, this.minimumThickness, this.maximumThickness)), t.texturesEnabled && (this._texture && ae.IridescenceTextureEnabled && e.setTexture(\"iridescenceSampler\", this._texture), this._thicknessTexture && !o && !s.IRIDESCENCE_USE_THICKNESS_FROM_MAINTEXTURE && ae.IridescenceTextureEnabled && e.setTexture(\"iridescenceThicknessSampler\", this._thicknessTexture));\n }\n hasTexture(e) {\n return this._texture === e || this._thicknessTexture === e;\n }\n getActiveTextures(e) {\n this._texture && e.push(this._texture), this._thicknessTexture && e.push(this._thicknessTexture);\n }\n getAnimatables(e) {\n this._texture && this._texture.animations && this._texture.animations.length > 0 && e.push(this._texture), this._thicknessTexture && this._thicknessTexture.animations && this._thicknessTexture.animations.length > 0 && e.push(this._thicknessTexture);\n }\n dispose(e) {\n var t, i;\n e && ((t = this._texture) == null || t.dispose(), (i = this._thicknessTexture) == null || i.dispose());\n }\n getClassName() {\n return \"PBRIridescenceConfiguration\";\n }\n addFallbacks(e, t, i) {\n return e.IRIDESCENCE && t.addFallback(i++, \"IRIDESCENCE\"), i;\n }\n getSamplers(e) {\n e.push(\"iridescenceSampler\", \"iridescenceThicknessSampler\");\n }\n getUniforms() {\n return {\n ubo: [\n { name: \"vIridescenceParams\", size: 4, type: \"vec4\" },\n { name: \"vIridescenceInfos\", size: 4, type: \"vec4\" },\n { name: \"iridescenceMatrix\", size: 16, type: \"mat4\" },\n { name: \"iridescenceThicknessMatrix\", size: 16, type: \"mat4\" }\n ]\n };\n }\n}\nlr._DefaultMinimumThickness = 100;\nlr._DefaultMaximumThickness = 400;\nlr._DefaultIndexOfRefraction = 1.3;\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], lr.prototype, \"isEnabled\", void 0);\nP([\n w()\n], lr.prototype, \"intensity\", void 0);\nP([\n w()\n], lr.prototype, \"minimumThickness\", void 0);\nP([\n w()\n], lr.prototype, \"maximumThickness\", void 0);\nP([\n w()\n], lr.prototype, \"indexOfRefraction\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], lr.prototype, \"texture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], lr.prototype, \"thicknessTexture\", void 0);\nclass PP extends es {\n constructor() {\n super(...arguments), this.ANISOTROPIC = !1, this.ANISOTROPIC_TEXTURE = !1, this.ANISOTROPIC_TEXTUREDIRECTUV = 0, this.ANISOTROPIC_LEGACY = !1, this.MAINUV1 = !1;\n }\n}\nclass Wa extends Ur {\n /**\n * Sets the anisotropy direction as an angle.\n */\n set angle(e) {\n this.direction.x = Math.cos(e), this.direction.y = Math.sin(e);\n }\n /**\n * Gets the anisotropy angle value in radians.\n * @returns the anisotropy angle value in radians.\n */\n get angle() {\n return Math.atan2(this.direction.y, this.direction.x);\n }\n /** @internal */\n _markAllSubMeshesAsTexturesDirty() {\n this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty();\n }\n /** @internal */\n _markAllSubMeshesAsMiscDirty() {\n this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsMiscDirty();\n }\n constructor(e, t = !0) {\n super(e, \"PBRAnisotropic\", 110, new PP(), t), this._isEnabled = !1, this.isEnabled = !1, this.intensity = 1, this.direction = new me(1, 0), this._texture = null, this.texture = null, this._legacy = !1, this.legacy = !1, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1], this._internalMarkAllSubMeshesAsMiscDirty = e._dirtyCallbacks[16];\n }\n isReadyForSubMesh(e, t) {\n return this._isEnabled ? !(e._areTexturesDirty && t.texturesEnabled && this._texture && ae.AnisotropicTextureEnabled && !this._texture.isReadyOrNotBlocking()) : !0;\n }\n prepareDefinesBeforeAttributes(e, t, i) {\n this._isEnabled ? (e.ANISOTROPIC = this._isEnabled, this._isEnabled && !i.isVerticesDataPresent(I.TangentKind) && (e._needUVs = !0, e.MAINUV1 = !0), e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.AnisotropicTextureEnabled ? wt(this._texture, e, \"ANISOTROPIC_TEXTURE\") : e.ANISOTROPIC_TEXTURE = !1), e._areMiscDirty && (e.ANISOTROPIC_LEGACY = this._legacy)) : (e.ANISOTROPIC = !1, e.ANISOTROPIC_TEXTURE = !1, e.ANISOTROPIC_TEXTUREDIRECTUV = 0, e.ANISOTROPIC_LEGACY = !1);\n }\n bindForSubMesh(e, t) {\n if (!this._isEnabled)\n return;\n const i = this._material.isFrozen;\n (!e.useUbo || !i || !e.isSync) && (this._texture && ae.AnisotropicTextureEnabled && (e.updateFloat2(\"vAnisotropyInfos\", this._texture.coordinatesIndex, this._texture.level), Mt(this._texture, e, \"anisotropy\")), e.updateFloat3(\"vAnisotropy\", this.direction.x, this.direction.y, this.intensity)), t.texturesEnabled && this._texture && ae.AnisotropicTextureEnabled && e.setTexture(\"anisotropySampler\", this._texture);\n }\n hasTexture(e) {\n return this._texture === e;\n }\n getActiveTextures(e) {\n this._texture && e.push(this._texture);\n }\n getAnimatables(e) {\n this._texture && this._texture.animations && this._texture.animations.length > 0 && e.push(this._texture);\n }\n dispose(e) {\n e && this._texture && this._texture.dispose();\n }\n getClassName() {\n return \"PBRAnisotropicConfiguration\";\n }\n addFallbacks(e, t, i) {\n return e.ANISOTROPIC && t.addFallback(i++, \"ANISOTROPIC\"), i;\n }\n getSamplers(e) {\n e.push(\"anisotropySampler\");\n }\n getUniforms() {\n return {\n ubo: [\n { name: \"vAnisotropy\", size: 3, type: \"vec3\" },\n { name: \"vAnisotropyInfos\", size: 2, type: \"vec2\" },\n { name: \"anisotropyMatrix\", size: 16, type: \"mat4\" }\n ]\n };\n }\n /**\n * Parses a anisotropy Configuration from a serialized object.\n * @param source - Serialized object.\n * @param scene Defines the scene we are parsing for\n * @param rootUrl Defines the rootUrl to load from\n */\n parse(e, t, i) {\n super.parse(e, t, i), e.legacy === void 0 && (this.legacy = !0);\n }\n}\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Wa.prototype, \"isEnabled\", void 0);\nP([\n w()\n], Wa.prototype, \"intensity\", void 0);\nP([\n X_()\n], Wa.prototype, \"direction\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Wa.prototype, \"texture\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Wa.prototype, \"legacy\", void 0);\nclass OP extends es {\n constructor() {\n super(...arguments), this.SHEEN = !1, this.SHEEN_TEXTURE = !1, this.SHEEN_GAMMATEXTURE = !1, this.SHEEN_TEXTURE_ROUGHNESS = !1, this.SHEEN_TEXTUREDIRECTUV = 0, this.SHEEN_TEXTURE_ROUGHNESSDIRECTUV = 0, this.SHEEN_LINKWITHALBEDO = !1, this.SHEEN_ROUGHNESS = !1, this.SHEEN_ALBEDOSCALING = !1, this.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE = !1, this.SHEEN_TEXTURE_ROUGHNESS_IDENTICAL = !1;\n }\n}\nclass _s extends Ur {\n /** @internal */\n _markAllSubMeshesAsTexturesDirty() {\n this._enable(this._isEnabled), this._internalMarkAllSubMeshesAsTexturesDirty();\n }\n constructor(e, t = !0) {\n super(e, \"Sheen\", 120, new OP(), t), this._isEnabled = !1, this.isEnabled = !1, this._linkSheenWithAlbedo = !1, this.linkSheenWithAlbedo = !1, this.intensity = 1, this.color = Ne.White(), this._texture = null, this.texture = null, this._useRoughnessFromMainTexture = !0, this.useRoughnessFromMainTexture = !0, this._roughness = null, this.roughness = null, this._textureRoughness = null, this.textureRoughness = null, this._albedoScaling = !1, this.albedoScaling = !1, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1];\n }\n isReadyForSubMesh(e, t) {\n return this._isEnabled ? !(e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.SheenTextureEnabled && !this._texture.isReadyOrNotBlocking() || this._textureRoughness && ae.SheenTextureEnabled && !this._textureRoughness.isReadyOrNotBlocking())) : !0;\n }\n prepareDefinesBeforeAttributes(e, t) {\n var i;\n this._isEnabled ? (e.SHEEN = !0, e.SHEEN_LINKWITHALBEDO = this._linkSheenWithAlbedo, e.SHEEN_ROUGHNESS = this._roughness !== null, e.SHEEN_ALBEDOSCALING = this._albedoScaling, e.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE = this._useRoughnessFromMainTexture, e.SHEEN_TEXTURE_ROUGHNESS_IDENTICAL = this._texture !== null && this._texture._texture === ((i = this._textureRoughness) == null ? void 0 : i._texture) && this._texture.checkTransformsAreIdentical(this._textureRoughness), e._areTexturesDirty && t.texturesEnabled && (this._texture && ae.SheenTextureEnabled ? (wt(this._texture, e, \"SHEEN_TEXTURE\"), e.SHEEN_GAMMATEXTURE = this._texture.gammaSpace) : e.SHEEN_TEXTURE = !1, this._textureRoughness && ae.SheenTextureEnabled ? wt(this._textureRoughness, e, \"SHEEN_TEXTURE_ROUGHNESS\") : e.SHEEN_TEXTURE_ROUGHNESS = !1)) : (e.SHEEN = !1, e.SHEEN_TEXTURE = !1, e.SHEEN_TEXTURE_ROUGHNESS = !1, e.SHEEN_LINKWITHALBEDO = !1, e.SHEEN_ROUGHNESS = !1, e.SHEEN_ALBEDOSCALING = !1, e.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE = !1, e.SHEEN_TEXTURE_ROUGHNESS_IDENTICAL = !1, e.SHEEN_GAMMATEXTURE = !1, e.SHEEN_TEXTUREDIRECTUV = 0, e.SHEEN_TEXTURE_ROUGHNESSDIRECTUV = 0);\n }\n bindForSubMesh(e, t, i, r) {\n var l, c, h, u;\n if (!this._isEnabled)\n return;\n const s = r.materialDefines, a = this._material.isFrozen, o = s.SHEEN_TEXTURE_ROUGHNESS_IDENTICAL;\n (!e.useUbo || !a || !e.isSync) && (o && ae.SheenTextureEnabled ? (e.updateFloat4(\"vSheenInfos\", this._texture.coordinatesIndex, this._texture.level, -1, -1), Mt(this._texture, e, \"sheen\")) : (this._texture || this._textureRoughness) && ae.SheenTextureEnabled && (e.updateFloat4(\"vSheenInfos\", ((l = this._texture) == null ? void 0 : l.coordinatesIndex) ?? 0, ((c = this._texture) == null ? void 0 : c.level) ?? 0, ((h = this._textureRoughness) == null ? void 0 : h.coordinatesIndex) ?? 0, ((u = this._textureRoughness) == null ? void 0 : u.level) ?? 0), this._texture && Mt(this._texture, e, \"sheen\"), this._textureRoughness && !o && !s.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE && Mt(this._textureRoughness, e, \"sheenRoughness\")), e.updateFloat4(\"vSheenColor\", this.color.r, this.color.g, this.color.b, this.intensity), this._roughness !== null && e.updateFloat(\"vSheenRoughness\", this._roughness)), t.texturesEnabled && (this._texture && ae.SheenTextureEnabled && e.setTexture(\"sheenSampler\", this._texture), this._textureRoughness && !o && !s.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE && ae.SheenTextureEnabled && e.setTexture(\"sheenRoughnessSampler\", this._textureRoughness));\n }\n hasTexture(e) {\n return this._texture === e || this._textureRoughness === e;\n }\n getActiveTextures(e) {\n this._texture && e.push(this._texture), this._textureRoughness && e.push(this._textureRoughness);\n }\n getAnimatables(e) {\n this._texture && this._texture.animations && this._texture.animations.length > 0 && e.push(this._texture), this._textureRoughness && this._textureRoughness.animations && this._textureRoughness.animations.length > 0 && e.push(this._textureRoughness);\n }\n dispose(e) {\n var t, i;\n e && ((t = this._texture) == null || t.dispose(), (i = this._textureRoughness) == null || i.dispose());\n }\n getClassName() {\n return \"PBRSheenConfiguration\";\n }\n addFallbacks(e, t, i) {\n return e.SHEEN && t.addFallback(i++, \"SHEEN\"), i;\n }\n getSamplers(e) {\n e.push(\"sheenSampler\", \"sheenRoughnessSampler\");\n }\n getUniforms() {\n return {\n ubo: [\n { name: \"vSheenColor\", size: 4, type: \"vec4\" },\n { name: \"vSheenRoughness\", size: 1, type: \"float\" },\n { name: \"vSheenInfos\", size: 4, type: \"vec4\" },\n { name: \"sheenMatrix\", size: 16, type: \"mat4\" },\n { name: \"sheenRoughnessMatrix\", size: 16, type: \"mat4\" }\n ]\n };\n }\n}\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"isEnabled\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"linkSheenWithAlbedo\", void 0);\nP([\n w()\n], _s.prototype, \"intensity\", void 0);\nP([\n $i()\n], _s.prototype, \"color\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"texture\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"useRoughnessFromMainTexture\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"roughness\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"textureRoughness\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], _s.prototype, \"albedoScaling\", void 0);\nclass DP extends es {\n constructor() {\n super(...arguments), this.SUBSURFACE = !1, this.SS_REFRACTION = !1, this.SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE = !1, this.SS_TRANSLUCENCY = !1, this.SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE = !1, this.SS_SCATTERING = !1, this.SS_DISPERSION = !1, this.SS_THICKNESSANDMASK_TEXTURE = !1, this.SS_THICKNESSANDMASK_TEXTUREDIRECTUV = 0, this.SS_HAS_THICKNESS = !1, this.SS_REFRACTIONINTENSITY_TEXTURE = !1, this.SS_REFRACTIONINTENSITY_TEXTUREDIRECTUV = 0, this.SS_TRANSLUCENCYINTENSITY_TEXTURE = !1, this.SS_TRANSLUCENCYINTENSITY_TEXTUREDIRECTUV = 0, this.SS_REFRACTIONMAP_3D = !1, this.SS_REFRACTIONMAP_OPPOSITEZ = !1, this.SS_LODINREFRACTIONALPHA = !1, this.SS_GAMMAREFRACTION = !1, this.SS_RGBDREFRACTION = !1, this.SS_LINEARSPECULARREFRACTION = !1, this.SS_LINKREFRACTIONTOTRANSPARENCY = !1, this.SS_ALBEDOFORREFRACTIONTINT = !1, this.SS_ALBEDOFORTRANSLUCENCYTINT = !1, this.SS_USE_LOCAL_REFRACTIONMAP_CUBIC = !1, this.SS_USE_THICKNESS_AS_DEPTH = !1, this.SS_MASK_FROM_THICKNESS_TEXTURE = !1, this.SS_USE_GLTF_TEXTURES = !1;\n }\n}\nclass Yt extends Ur {\n /**\n * Diffusion profile for subsurface scattering.\n * Useful for better scattering in the skins or foliages.\n */\n get scatteringDiffusionProfile() {\n return this._scene.subSurfaceConfiguration ? this._scene.subSurfaceConfiguration.ssDiffusionProfileColors[this._scatteringDiffusionProfileIndex] : null;\n }\n set scatteringDiffusionProfile(e) {\n this._scene.enableSubSurfaceForPrePass() && e && (this._scatteringDiffusionProfileIndex = this._scene.subSurfaceConfiguration.addDiffusionProfile(e));\n }\n /**\n * Index of refraction of the material's volume.\n * https://en.wikipedia.org/wiki/List_of_refractive_indices\n *\n * This ONLY impacts refraction. If not provided or given a non-valid value,\n * the volume will use the same IOR as the surface.\n */\n get volumeIndexOfRefraction() {\n return this._volumeIndexOfRefraction >= 1 ? this._volumeIndexOfRefraction : this._indexOfRefraction;\n }\n set volumeIndexOfRefraction(e) {\n e >= 1 ? this._volumeIndexOfRefraction = e : this._volumeIndexOfRefraction = -1;\n }\n /** @internal */\n _markAllSubMeshesAsTexturesDirty() {\n this._enable(this._isRefractionEnabled || this._isTranslucencyEnabled || this._isScatteringEnabled), this._internalMarkAllSubMeshesAsTexturesDirty();\n }\n /** @internal */\n _markScenePrePassDirty() {\n this._internalMarkAllSubMeshesAsTexturesDirty(), this._internalMarkScenePrePassDirty();\n }\n constructor(e, t = !0) {\n super(e, \"PBRSubSurface\", 130, new DP(), t), this._isRefractionEnabled = !1, this.isRefractionEnabled = !1, this._isTranslucencyEnabled = !1, this.isTranslucencyEnabled = !1, this._isDispersionEnabled = !1, this.isDispersionEnabled = !1, this._isScatteringEnabled = !1, this.isScatteringEnabled = !1, this._scatteringDiffusionProfileIndex = 0, this.refractionIntensity = 1, this.translucencyIntensity = 1, this.useAlbedoToTintRefraction = !1, this.useAlbedoToTintTranslucency = !1, this._thicknessTexture = null, this.thicknessTexture = null, this._refractionTexture = null, this.refractionTexture = null, this._indexOfRefraction = 1.5, this.indexOfRefraction = 1.5, this._volumeIndexOfRefraction = -1, this._invertRefractionY = !1, this.invertRefractionY = !1, this._linkRefractionWithTransparency = !1, this.linkRefractionWithTransparency = !1, this.minimumThickness = 0, this.maximumThickness = 1, this.useThicknessAsDepth = !1, this.tintColor = Ne.White(), this.tintColorAtDistance = 1, this.dispersion = 0, this.diffusionDistance = Ne.White(), this._useMaskFromThicknessTexture = !1, this.useMaskFromThicknessTexture = !1, this._refractionIntensityTexture = null, this.refractionIntensityTexture = null, this._translucencyIntensityTexture = null, this.translucencyIntensityTexture = null, this._useGltfStyleTextures = !1, this.useGltfStyleTextures = !1, this._scene = e.getScene(), this.registerForExtraEvents = !0, this._internalMarkAllSubMeshesAsTexturesDirty = e._dirtyCallbacks[1], this._internalMarkScenePrePassDirty = e._dirtyCallbacks[32];\n }\n isReadyForSubMesh(e, t) {\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled)\n return !0;\n if (e._areTexturesDirty && t.texturesEnabled) {\n if (this._thicknessTexture && ae.ThicknessTextureEnabled && !this._thicknessTexture.isReadyOrNotBlocking())\n return !1;\n const i = this._getRefractionTexture(t);\n if (i && ae.RefractionTextureEnabled && !i.isReadyOrNotBlocking())\n return !1;\n }\n return !0;\n }\n prepareDefinesBeforeAttributes(e, t) {\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled) {\n e.SUBSURFACE = !1, e.SS_DISPERSION = !1, e.SS_TRANSLUCENCY = !1, e.SS_SCATTERING = !1, e.SS_REFRACTION = !1, e.SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE = !1, e.SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE = !1, e.SS_THICKNESSANDMASK_TEXTURE = !1, e.SS_THICKNESSANDMASK_TEXTUREDIRECTUV = 0, e.SS_HAS_THICKNESS = !1, e.SS_REFRACTIONINTENSITY_TEXTURE = !1, e.SS_REFRACTIONINTENSITY_TEXTUREDIRECTUV = 0, e.SS_TRANSLUCENCYINTENSITY_TEXTURE = !1, e.SS_TRANSLUCENCYINTENSITY_TEXTUREDIRECTUV = 0, e.SS_REFRACTIONMAP_3D = !1, e.SS_REFRACTIONMAP_OPPOSITEZ = !1, e.SS_LODINREFRACTIONALPHA = !1, e.SS_GAMMAREFRACTION = !1, e.SS_RGBDREFRACTION = !1, e.SS_LINEARSPECULARREFRACTION = !1, e.SS_LINKREFRACTIONTOTRANSPARENCY = !1, e.SS_ALBEDOFORREFRACTIONTINT = !1, e.SS_ALBEDOFORTRANSLUCENCYTINT = !1, e.SS_USE_LOCAL_REFRACTIONMAP_CUBIC = !1, e.SS_USE_THICKNESS_AS_DEPTH = !1, e.SS_MASK_FROM_THICKNESS_TEXTURE = !1, e.SS_USE_GLTF_TEXTURES = !1;\n return;\n }\n if (e._areTexturesDirty) {\n e.SUBSURFACE = !0, e.SS_DISPERSION = this._isDispersionEnabled, e.SS_TRANSLUCENCY = this._isTranslucencyEnabled, e.SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE = !1, e.SS_SCATTERING = this._isScatteringEnabled, e.SS_THICKNESSANDMASK_TEXTURE = !1, e.SS_REFRACTIONINTENSITY_TEXTURE = !1, e.SS_TRANSLUCENCYINTENSITY_TEXTURE = !1, e.SS_HAS_THICKNESS = !1, e.SS_MASK_FROM_THICKNESS_TEXTURE = !1, e.SS_USE_GLTF_TEXTURES = !1, e.SS_REFRACTION = !1, e.SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE = !1, e.SS_REFRACTIONMAP_3D = !1, e.SS_GAMMAREFRACTION = !1, e.SS_RGBDREFRACTION = !1, e.SS_LINEARSPECULARREFRACTION = !1, e.SS_REFRACTIONMAP_OPPOSITEZ = !1, e.SS_LODINREFRACTIONALPHA = !1, e.SS_LINKREFRACTIONTOTRANSPARENCY = !1, e.SS_ALBEDOFORREFRACTIONTINT = !1, e.SS_ALBEDOFORTRANSLUCENCYTINT = !1, e.SS_USE_LOCAL_REFRACTIONMAP_CUBIC = !1, e.SS_USE_THICKNESS_AS_DEPTH = !1;\n const i = !!this._thicknessTexture && !!this._refractionIntensityTexture && this._refractionIntensityTexture.checkTransformsAreIdentical(this._thicknessTexture) && this._refractionIntensityTexture._texture === this._thicknessTexture._texture, r = !!this._thicknessTexture && !!this._translucencyIntensityTexture && this._translucencyIntensityTexture.checkTransformsAreIdentical(this._thicknessTexture) && this._translucencyIntensityTexture._texture === this._thicknessTexture._texture, s = (i || !this._refractionIntensityTexture) && (r || !this._translucencyIntensityTexture);\n if (e._areTexturesDirty && t.texturesEnabled && (this._thicknessTexture && ae.ThicknessTextureEnabled && wt(this._thicknessTexture, e, \"SS_THICKNESSANDMASK_TEXTURE\"), this._refractionIntensityTexture && ae.RefractionIntensityTextureEnabled && !s && wt(this._refractionIntensityTexture, e, \"SS_REFRACTIONINTENSITY_TEXTURE\"), this._translucencyIntensityTexture && ae.TranslucencyIntensityTextureEnabled && !s && wt(this._translucencyIntensityTexture, e, \"SS_TRANSLUCENCYINTENSITY_TEXTURE\")), e.SS_HAS_THICKNESS = this.maximumThickness - this.minimumThickness !== 0, e.SS_MASK_FROM_THICKNESS_TEXTURE = (this._useMaskFromThicknessTexture || !!this._refractionIntensityTexture || !!this._translucencyIntensityTexture) && s, e.SS_USE_GLTF_TEXTURES = this._useGltfStyleTextures, e.SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE = (this._useMaskFromThicknessTexture || !!this._refractionIntensityTexture) && s, e.SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE = (this._useMaskFromThicknessTexture || !!this._translucencyIntensityTexture) && s, this._isRefractionEnabled && t.texturesEnabled) {\n const a = this._getRefractionTexture(t);\n a && ae.RefractionTextureEnabled && (e.SS_REFRACTION = !0, e.SS_REFRACTIONMAP_3D = a.isCube, e.SS_GAMMAREFRACTION = a.gammaSpace, e.SS_RGBDREFRACTION = a.isRGBD, e.SS_LINEARSPECULARREFRACTION = a.linearSpecularLOD, e.SS_REFRACTIONMAP_OPPOSITEZ = this._scene.useRightHandedSystem && a.isCube ? !a.invertZ : a.invertZ, e.SS_LODINREFRACTIONALPHA = a.lodLevelInAlpha, e.SS_LINKREFRACTIONTOTRANSPARENCY = this._linkRefractionWithTransparency, e.SS_ALBEDOFORREFRACTIONTINT = this.useAlbedoToTintRefraction, e.SS_USE_LOCAL_REFRACTIONMAP_CUBIC = a.isCube && a.boundingBoxSize, e.SS_USE_THICKNESS_AS_DEPTH = this.useThicknessAsDepth);\n }\n this._isTranslucencyEnabled && (e.SS_ALBEDOFORTRANSLUCENCYTINT = this.useAlbedoToTintTranslucency);\n }\n }\n /**\n * Binds the material data (this function is called even if mustRebind() returns false)\n * @param uniformBuffer defines the Uniform buffer to fill in.\n * @param scene defines the scene the material belongs to.\n * @param engine defines the engine the material belongs to.\n * @param subMesh the submesh to bind data for\n */\n hardBindForSubMesh(e, t, i, r) {\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled)\n return;\n r.getRenderingMesh().getWorldMatrix().decompose(z.Vector3[0]);\n const s = Math.max(Math.abs(z.Vector3[0].x), Math.abs(z.Vector3[0].y), Math.abs(z.Vector3[0].z));\n e.updateFloat2(\"vThicknessParam\", this.minimumThickness * s, (this.maximumThickness - this.minimumThickness) * s);\n }\n bindForSubMesh(e, t, i, r) {\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled)\n return;\n const s = r.materialDefines, a = this._material.isFrozen, o = this._material.realTimeFiltering, l = s.LODBASEDMICROSFURACE, c = this._getRefractionTexture(t);\n if (!e.useUbo || !a || !e.isSync) {\n if (this._thicknessTexture && ae.ThicknessTextureEnabled && (e.updateFloat2(\"vThicknessInfos\", this._thicknessTexture.coordinatesIndex, this._thicknessTexture.level), Mt(this._thicknessTexture, e, \"thickness\")), this._refractionIntensityTexture && ae.RefractionIntensityTextureEnabled && s.SS_REFRACTIONINTENSITY_TEXTURE && (e.updateFloat2(\"vRefractionIntensityInfos\", this._refractionIntensityTexture.coordinatesIndex, this._refractionIntensityTexture.level), Mt(this._refractionIntensityTexture, e, \"refractionIntensity\")), this._translucencyIntensityTexture && ae.TranslucencyIntensityTextureEnabled && s.SS_TRANSLUCENCYINTENSITY_TEXTURE && (e.updateFloat2(\"vTranslucencyIntensityInfos\", this._translucencyIntensityTexture.coordinatesIndex, this._translucencyIntensityTexture.level), Mt(this._translucencyIntensityTexture, e, \"translucencyIntensity\")), c && ae.RefractionTextureEnabled) {\n e.updateMatrix(\"refractionMatrix\", c.getRefractionTextureMatrix());\n let h = 1;\n c.isCube || c.depth && (h = c.depth);\n const u = c.getSize().width, f = this.volumeIndexOfRefraction;\n if (e.updateFloat4(\"vRefractionInfos\", c.level, 1 / f, h, this._invertRefractionY ? -1 : 1), e.updateFloat4(\"vRefractionMicrosurfaceInfos\", u, c.lodGenerationScale, c.lodGenerationOffset, 1 / this.indexOfRefraction), o && e.updateFloat2(\"vRefractionFilteringInfo\", u, je.Log2(u)), c.boundingBoxSize) {\n const d = c;\n e.updateVector3(\"vRefractionPosition\", d.boundingBoxPosition), e.updateVector3(\"vRefractionSize\", d.boundingBoxSize);\n }\n }\n this._isScatteringEnabled && e.updateFloat(\"scatteringDiffusionProfile\", this._scatteringDiffusionProfileIndex), e.updateColor3(\"vDiffusionDistance\", this.diffusionDistance), e.updateFloat4(\"vTintColor\", this.tintColor.r, this.tintColor.g, this.tintColor.b, Math.max(1e-5, this.tintColorAtDistance)), e.updateFloat3(\"vSubSurfaceIntensity\", this.refractionIntensity, this.translucencyIntensity, 0), e.updateFloat(\"dispersion\", this.dispersion);\n }\n t.texturesEnabled && (this._thicknessTexture && ae.ThicknessTextureEnabled && e.setTexture(\"thicknessSampler\", this._thicknessTexture), this._refractionIntensityTexture && ae.RefractionIntensityTextureEnabled && s.SS_REFRACTIONINTENSITY_TEXTURE && e.setTexture(\"refractionIntensitySampler\", this._refractionIntensityTexture), this._translucencyIntensityTexture && ae.TranslucencyIntensityTextureEnabled && s.SS_TRANSLUCENCYINTENSITY_TEXTURE && e.setTexture(\"translucencyIntensitySampler\", this._translucencyIntensityTexture), c && ae.RefractionTextureEnabled && (l ? e.setTexture(\"refractionSampler\", c) : (e.setTexture(\"refractionSampler\", c._lodTextureMid || c), e.setTexture(\"refractionSamplerLow\", c._lodTextureLow || c), e.setTexture(\"refractionSamplerHigh\", c._lodTextureHigh || c))));\n }\n /**\n * Returns the texture used for refraction or null if none is used.\n * @param scene defines the scene the material belongs to.\n * @returns - Refraction texture if present. If no refraction texture and refraction\n * is linked with transparency, returns environment texture. Otherwise, returns null.\n */\n _getRefractionTexture(e) {\n return this._refractionTexture ? this._refractionTexture : this._isRefractionEnabled ? e.environmentTexture : null;\n }\n /**\n * Returns true if alpha blending should be disabled.\n */\n get disableAlphaBlending() {\n return this._isRefractionEnabled && this._linkRefractionWithTransparency;\n }\n /**\n * Fills the list of render target textures.\n * @param renderTargets the list of render targets to update\n */\n fillRenderTargetTextures(e) {\n ae.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget && e.push(this._refractionTexture);\n }\n hasTexture(e) {\n return this._thicknessTexture === e || this._refractionTexture === e || this._refractionIntensityTexture === e || this._translucencyIntensityTexture === e;\n }\n hasRenderTargetTextures() {\n return !!(ae.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget);\n }\n getActiveTextures(e) {\n this._thicknessTexture && e.push(this._thicknessTexture), this._refractionTexture && e.push(this._refractionTexture);\n }\n getAnimatables(e) {\n this._thicknessTexture && this._thicknessTexture.animations && this._thicknessTexture.animations.length > 0 && e.push(this._thicknessTexture), this._refractionTexture && this._refractionTexture.animations && this._refractionTexture.animations.length > 0 && e.push(this._refractionTexture);\n }\n dispose(e) {\n e && (this._thicknessTexture && this._thicknessTexture.dispose(), this._refractionTexture && this._refractionTexture.dispose());\n }\n getClassName() {\n return \"PBRSubSurfaceConfiguration\";\n }\n addFallbacks(e, t, i) {\n return e.SS_SCATTERING && t.addFallback(i++, \"SS_SCATTERING\"), e.SS_TRANSLUCENCY && t.addFallback(i++, \"SS_TRANSLUCENCY\"), i;\n }\n getSamplers(e) {\n e.push(\"thicknessSampler\", \"refractionIntensitySampler\", \"translucencyIntensitySampler\", \"refractionSampler\", \"refractionSamplerLow\", \"refractionSamplerHigh\");\n }\n getUniforms() {\n return {\n ubo: [\n { name: \"vRefractionMicrosurfaceInfos\", size: 4, type: \"vec4\" },\n { name: \"vRefractionFilteringInfo\", size: 2, type: \"vec2\" },\n { name: \"vTranslucencyIntensityInfos\", size: 2, type: \"vec2\" },\n { name: \"vRefractionInfos\", size: 4, type: \"vec4\" },\n { name: \"refractionMatrix\", size: 16, type: \"mat4\" },\n { name: \"vThicknessInfos\", size: 2, type: \"vec2\" },\n { name: \"vRefractionIntensityInfos\", size: 2, type: \"vec2\" },\n { name: \"thicknessMatrix\", size: 16, type: \"mat4\" },\n { name: \"refractionIntensityMatrix\", size: 16, type: \"mat4\" },\n { name: \"translucencyIntensityMatrix\", size: 16, type: \"mat4\" },\n { name: \"vThicknessParam\", size: 2, type: \"vec2\" },\n { name: \"vDiffusionDistance\", size: 3, type: \"vec3\" },\n { name: \"vTintColor\", size: 4, type: \"vec4\" },\n { name: \"vSubSurfaceIntensity\", size: 3, type: \"vec3\" },\n { name: \"vRefractionPosition\", size: 3, type: \"vec3\" },\n { name: \"vRefractionSize\", size: 3, type: \"vec3\" },\n { name: \"scatteringDiffusionProfile\", size: 1, type: \"float\" },\n { name: \"dispersion\", size: 1, type: \"float\" }\n ]\n };\n }\n}\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Yt.prototype, \"isRefractionEnabled\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Yt.prototype, \"isTranslucencyEnabled\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Yt.prototype, \"isDispersionEnabled\", void 0);\nP([\n w(),\n oe(\"_markScenePrePassDirty\")\n], Yt.prototype, \"isScatteringEnabled\", void 0);\nP([\n w()\n], Yt.prototype, \"_scatteringDiffusionProfileIndex\", void 0);\nP([\n w()\n], Yt.prototype, \"refractionIntensity\", void 0);\nP([\n w()\n], Yt.prototype, \"translucencyIntensity\", void 0);\nP([\n w()\n], Yt.prototype, \"useAlbedoToTintRefraction\", void 0);\nP([\n w()\n], Yt.prototype, \"useAlbedoToTintTranslucency\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Yt.prototype, \"thicknessTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Yt.prototype, \"refractionTexture\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Yt.prototype, \"indexOfRefraction\", void 0);\nP([\n w()\n], Yt.prototype, \"_volumeIndexOfRefraction\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Yt.prototype, \"volumeIndexOfRefraction\", null);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Yt.prototype, \"invertRefractionY\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Yt.prototype, \"linkRefractionWithTransparency\", void 0);\nP([\n w()\n], Yt.prototype, \"minimumThickness\", void 0);\nP([\n w()\n], Yt.prototype, \"maximumThickness\", void 0);\nP([\n w()\n], Yt.prototype, \"useThicknessAsDepth\", void 0);\nP([\n $i()\n], Yt.prototype, \"tintColor\", void 0);\nP([\n w()\n], Yt.prototype, \"tintColorAtDistance\", void 0);\nP([\n w()\n], Yt.prototype, \"dispersion\", void 0);\nP([\n $i()\n], Yt.prototype, \"diffusionDistance\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Yt.prototype, \"useMaskFromThicknessTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Yt.prototype, \"refractionIntensityTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Yt.prototype, \"translucencyIntensityTexture\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], Yt.prototype, \"useGltfStyleTextures\", void 0);\nconst $n = { effect: null, subMesh: null };\nclass _g extends es {\n /**\n * Initializes the PBR Material defines.\n * @param externalProperties The external properties\n */\n constructor(e) {\n super(e), this.PBR = !0, this.NUM_SAMPLES = \"0\", this.REALTIME_FILTERING = !1, this.MAINUV1 = !1, this.MAINUV2 = !1, this.MAINUV3 = !1, this.MAINUV4 = !1, this.MAINUV5 = !1, this.MAINUV6 = !1, this.UV1 = !1, this.UV2 = !1, this.UV3 = !1, this.UV4 = !1, this.UV5 = !1, this.UV6 = !1, this.ALBEDO = !1, this.GAMMAALBEDO = !1, this.ALBEDODIRECTUV = 0, this.VERTEXCOLOR = !1, this.BAKED_VERTEX_ANIMATION_TEXTURE = !1, this.AMBIENT = !1, this.AMBIENTDIRECTUV = 0, this.AMBIENTINGRAYSCALE = !1, this.OPACITY = !1, this.VERTEXALPHA = !1, this.OPACITYDIRECTUV = 0, this.OPACITYRGB = !1, this.ALPHATEST = !1, this.DEPTHPREPASS = !1, this.ALPHABLEND = !1, this.ALPHAFROMALBEDO = !1, this.ALPHATESTVALUE = \"0.5\", this.SPECULAROVERALPHA = !1, this.RADIANCEOVERALPHA = !1, this.ALPHAFRESNEL = !1, this.LINEARALPHAFRESNEL = !1, this.PREMULTIPLYALPHA = !1, this.EMISSIVE = !1, this.EMISSIVEDIRECTUV = 0, this.GAMMAEMISSIVE = !1, this.REFLECTIVITY = !1, this.REFLECTIVITY_GAMMA = !1, this.REFLECTIVITYDIRECTUV = 0, this.SPECULARTERM = !1, this.MICROSURFACEFROMREFLECTIVITYMAP = !1, this.MICROSURFACEAUTOMATIC = !1, this.LODBASEDMICROSFURACE = !1, this.MICROSURFACEMAP = !1, this.MICROSURFACEMAPDIRECTUV = 0, this.METALLICWORKFLOW = !1, this.ROUGHNESSSTOREINMETALMAPALPHA = !1, this.ROUGHNESSSTOREINMETALMAPGREEN = !1, this.METALLNESSSTOREINMETALMAPBLUE = !1, this.AOSTOREINMETALMAPRED = !1, this.METALLIC_REFLECTANCE = !1, this.METALLIC_REFLECTANCE_GAMMA = !1, this.METALLIC_REFLECTANCEDIRECTUV = 0, this.METALLIC_REFLECTANCE_USE_ALPHA_ONLY = !1, this.REFLECTANCE = !1, this.REFLECTANCE_GAMMA = !1, this.REFLECTANCEDIRECTUV = 0, this.ENVIRONMENTBRDF = !1, this.ENVIRONMENTBRDF_RGBD = !1, this.NORMAL = !1, this.TANGENT = !1, this.BUMP = !1, this.BUMPDIRECTUV = 0, this.OBJECTSPACE_NORMALMAP = !1, this.PARALLAX = !1, this.PARALLAX_RHS = !1, this.PARALLAXOCCLUSION = !1, this.NORMALXYSCALE = !0, this.LIGHTMAP = !1, this.LIGHTMAPDIRECTUV = 0, this.USELIGHTMAPASSHADOWMAP = !1, this.GAMMALIGHTMAP = !1, this.RGBDLIGHTMAP = !1, this.REFLECTION = !1, this.REFLECTIONMAP_3D = !1, this.REFLECTIONMAP_SPHERICAL = !1, this.REFLECTIONMAP_PLANAR = !1, this.REFLECTIONMAP_CUBIC = !1, this.USE_LOCAL_REFLECTIONMAP_CUBIC = !1, this.REFLECTIONMAP_PROJECTION = !1, this.REFLECTIONMAP_SKYBOX = !1, this.REFLECTIONMAP_EXPLICIT = !1, this.REFLECTIONMAP_EQUIRECTANGULAR = !1, this.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !1, this.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !1, this.INVERTCUBICMAP = !1, this.USESPHERICALFROMREFLECTIONMAP = !1, this.USEIRRADIANCEMAP = !1, this.USESPHERICALINVERTEX = !1, this.REFLECTIONMAP_OPPOSITEZ = !1, this.LODINREFLECTIONALPHA = !1, this.GAMMAREFLECTION = !1, this.RGBDREFLECTION = !1, this.LINEARSPECULARREFLECTION = !1, this.RADIANCEOCCLUSION = !1, this.HORIZONOCCLUSION = !1, this.INSTANCES = !1, this.THIN_INSTANCES = !1, this.INSTANCESCOLOR = !1, this.PREPASS = !1, this.PREPASS_IRRADIANCE = !1, this.PREPASS_IRRADIANCE_INDEX = -1, this.PREPASS_ALBEDO_SQRT = !1, this.PREPASS_ALBEDO_SQRT_INDEX = -1, this.PREPASS_DEPTH = !1, this.PREPASS_DEPTH_INDEX = -1, this.PREPASS_NORMAL = !1, this.PREPASS_NORMAL_INDEX = -1, this.PREPASS_NORMAL_WORLDSPACE = !1, this.PREPASS_POSITION = !1, this.PREPASS_POSITION_INDEX = -1, this.PREPASS_VELOCITY = !1, this.PREPASS_VELOCITY_INDEX = -1, this.PREPASS_REFLECTIVITY = !1, this.PREPASS_REFLECTIVITY_INDEX = -1, this.SCENE_MRT_COUNT = 0, this.NUM_BONE_INFLUENCERS = 0, this.BonesPerMesh = 0, this.BONETEXTURE = !1, this.BONES_VELOCITY_ENABLED = !1, this.NONUNIFORMSCALING = !1, this.MORPHTARGETS = !1, this.MORPHTARGETS_NORMAL = !1, this.MORPHTARGETS_TANGENT = !1, this.MORPHTARGETS_UV = !1, this.NUM_MORPH_INFLUENCERS = 0, this.MORPHTARGETS_TEXTURE = !1, this.IMAGEPROCESSING = !1, this.VIGNETTE = !1, this.VIGNETTEBLENDMODEMULTIPLY = !1, this.VIGNETTEBLENDMODEOPAQUE = !1, this.TONEMAPPING = !1, this.TONEMAPPING_ACES = !1, this.CONTRAST = !1, this.COLORCURVES = !1, this.COLORGRADING = !1, this.COLORGRADING3D = !1, this.SAMPLER3DGREENDEPTH = !1, this.SAMPLER3DBGRMAP = !1, this.DITHER = !1, this.IMAGEPROCESSINGPOSTPROCESS = !1, this.SKIPFINALCOLORCLAMP = !1, this.EXPOSURE = !1, this.MULTIVIEW = !1, this.ORDER_INDEPENDENT_TRANSPARENCY = !1, this.ORDER_INDEPENDENT_TRANSPARENCY_16BITS = !1, this.USEPHYSICALLIGHTFALLOFF = !1, this.USEGLTFLIGHTFALLOFF = !1, this.TWOSIDEDLIGHTING = !1, this.SHADOWFLOAT = !1, this.CLIPPLANE = !1, this.CLIPPLANE2 = !1, this.CLIPPLANE3 = !1, this.CLIPPLANE4 = !1, this.CLIPPLANE5 = !1, this.CLIPPLANE6 = !1, this.POINTSIZE = !1, this.FOG = !1, this.LOGARITHMICDEPTH = !1, this.CAMERA_ORTHOGRAPHIC = !1, this.CAMERA_PERSPECTIVE = !1, this.FORCENORMALFORWARD = !1, this.SPECULARAA = !1, this.UNLIT = !1, this.DECAL_AFTER_DETAIL = !1, this.DEBUGMODE = 0, this.rebuild();\n }\n /**\n * Resets the PBR Material defines.\n */\n reset() {\n super.reset(), this.ALPHATESTVALUE = \"0.5\", this.PBR = !0, this.NORMALXYSCALE = !0;\n }\n}\nclass Nt extends Uc {\n /**\n * Enables realtime filtering on the texture.\n */\n get realTimeFiltering() {\n return this._realTimeFiltering;\n }\n set realTimeFiltering(e) {\n this._realTimeFiltering = e, this.markAsDirty(1);\n }\n /**\n * Quality switch for realtime filtering\n */\n get realTimeFilteringQuality() {\n return this._realTimeFilteringQuality;\n }\n set realTimeFilteringQuality(e) {\n this._realTimeFilteringQuality = e, this.markAsDirty(1);\n }\n /**\n * Can this material render to several textures at once\n */\n get canRenderToMRT() {\n return !0;\n }\n /**\n * Attaches a new image processing configuration to the PBR Material.\n * @param configuration\n */\n _attachImageProcessingConfiguration(e) {\n e !== this._imageProcessingConfiguration && (this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), e ? this._imageProcessingConfiguration = e : this._imageProcessingConfiguration = this.getScene().imageProcessingConfiguration, this._imageProcessingConfiguration && (this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add(() => {\n this._markAllSubMeshesAsImageProcessingDirty();\n })));\n }\n /**\n * Instantiates a new PBRMaterial instance.\n *\n * @param name The material name\n * @param scene The scene the material will be use in.\n */\n constructor(e, t) {\n super(e, t), this._directIntensity = 1, this._emissiveIntensity = 1, this._environmentIntensity = 1, this._specularIntensity = 1, this._lightingInfos = new Ke(this._directIntensity, this._emissiveIntensity, this._environmentIntensity, this._specularIntensity), this._disableBumpMap = !1, this._albedoTexture = null, this._ambientTexture = null, this._ambientTextureStrength = 1, this._ambientTextureImpactOnAnalyticalLights = Nt.DEFAULT_AO_ON_ANALYTICAL_LIGHTS, this._opacityTexture = null, this._reflectionTexture = null, this._emissiveTexture = null, this._reflectivityTexture = null, this._metallicTexture = null, this._metallic = null, this._roughness = null, this._metallicF0Factor = 1, this._metallicReflectanceColor = Ne.White(), this._useOnlyMetallicFromMetallicReflectanceTexture = !1, this._metallicReflectanceTexture = null, this._reflectanceTexture = null, this._microSurfaceTexture = null, this._bumpTexture = null, this._lightmapTexture = null, this._ambientColor = new Ne(0, 0, 0), this._albedoColor = new Ne(1, 1, 1), this._reflectivityColor = new Ne(1, 1, 1), this._reflectionColor = new Ne(1, 1, 1), this._emissiveColor = new Ne(0, 0, 0), this._microSurface = 0.9, this._useLightmapAsShadowmap = !1, this._useHorizonOcclusion = !0, this._useRadianceOcclusion = !0, this._useAlphaFromAlbedoTexture = !1, this._useSpecularOverAlpha = !0, this._useMicroSurfaceFromReflectivityMapAlpha = !1, this._useRoughnessFromMetallicTextureAlpha = !0, this._useRoughnessFromMetallicTextureGreen = !1, this._useMetallnessFromMetallicTextureBlue = !1, this._useAmbientOcclusionFromMetallicTextureRed = !1, this._useAmbientInGrayScale = !1, this._useAutoMicroSurfaceFromReflectivityMap = !1, this._lightFalloff = Nt.LIGHTFALLOFF_PHYSICAL, this._useRadianceOverAlpha = !0, this._useObjectSpaceNormalMap = !1, this._useParallax = !1, this._useParallaxOcclusion = !1, this._parallaxScaleBias = 0.05, this._disableLighting = !1, this._maxSimultaneousLights = 4, this._invertNormalMapX = !1, this._invertNormalMapY = !1, this._twoSidedLighting = !1, this._alphaCutOff = 0.4, this._forceAlphaTest = !1, this._useAlphaFresnel = !1, this._useLinearAlphaFresnel = !1, this._environmentBRDFTexture = null, this._forceIrradianceInFragment = !1, this._realTimeFiltering = !1, this._realTimeFilteringQuality = 8, this._forceNormalForward = !1, this._enableSpecularAntiAliasing = !1, this._imageProcessingObserver = null, this._renderTargets = new Li(16), this._globalAmbientColor = new Ne(0, 0, 0), this._unlit = !1, this._applyDecalMapAfterDetailMap = !1, this._debugMode = 0, this.debugMode = 0, this.debugLimit = -1, this.debugFactor = 1, this._cacheHasRenderTargetTextures = !1, this.brdf = new Fi(this), this.clearCoat = new Si(this), this.iridescence = new lr(this), this.anisotropy = new Wa(this), this.sheen = new _s(this), this.subSurface = new Yt(this), this.detailMap = new un(this), this._attachImageProcessingConfiguration(null), this.getRenderTargetTextures = () => (this._renderTargets.reset(), ae.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget && this._renderTargets.push(this._reflectionTexture), this._eventInfo.renderTargets = this._renderTargets, this._callbackPluginEventFillRenderTargetTextures(this._eventInfo), this._renderTargets), this._environmentBRDFTexture = b0(this.getScene()), this.prePassConfiguration = new oc();\n }\n /**\n * Gets a boolean indicating that current material needs to register RTT\n */\n get hasRenderTargetTextures() {\n return ae.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget ? !0 : this._cacheHasRenderTargetTextures;\n }\n /**\n * Can this material render to prepass\n */\n get isPrePassCapable() {\n return !this.disableDepthWrite;\n }\n /**\n * @returns the name of the material class.\n */\n getClassName() {\n return \"PBRBaseMaterial\";\n }\n /**\n * Returns true if alpha blending should be disabled.\n */\n get _disableAlphaBlending() {\n var e;\n return this._transparencyMode === Nt.PBRMATERIAL_OPAQUE || this._transparencyMode === Nt.PBRMATERIAL_ALPHATEST || ((e = this.subSurface) == null ? void 0 : e.disableAlphaBlending);\n }\n /**\n * @returns whether or not this material should be rendered in alpha blend mode.\n */\n needAlphaBlending() {\n return this._disableAlphaBlending ? !1 : this.alpha < 1 || this._opacityTexture != null || this._shouldUseAlphaFromAlbedoTexture();\n }\n /**\n * @returns whether or not this material should be rendered in alpha test mode.\n */\n needAlphaTesting() {\n var e;\n return this._forceAlphaTest ? !0 : (e = this.subSurface) != null && e.disableAlphaBlending ? !1 : this._hasAlphaChannel() && (this._transparencyMode == null || this._transparencyMode === Nt.PBRMATERIAL_ALPHATEST);\n }\n /**\n * @returns whether or not the alpha value of the albedo texture should be used for alpha blending.\n */\n _shouldUseAlphaFromAlbedoTexture() {\n return this._albedoTexture != null && this._albedoTexture.hasAlpha && this._useAlphaFromAlbedoTexture && this._transparencyMode !== Nt.PBRMATERIAL_OPAQUE;\n }\n /**\n * @returns whether or not there is a usable alpha channel for transparency.\n */\n _hasAlphaChannel() {\n return this._albedoTexture != null && this._albedoTexture.hasAlpha || this._opacityTexture != null;\n }\n /**\n * @returns the texture used for the alpha test.\n */\n getAlphaTestTexture() {\n return this._albedoTexture;\n }\n /**\n * Specifies that the submesh is ready to be used.\n * @param mesh - BJS mesh.\n * @param subMesh - A submesh of the BJS mesh. Used to check if it is ready.\n * @param useInstances - Specifies that instances should be used.\n * @returns - boolean indicating that the submesh is ready or not.\n */\n isReadyForSubMesh(e, t, i) {\n var f;\n this._uniformBufferLayoutBuilt || this.buildUniformLayout();\n const r = t._drawWrapper;\n if (r.effect && this.isFrozen && r._wasPreviouslyReady && r._wasPreviouslyUsingInstances === i)\n return !0;\n t.materialDefines || (this._callbackPluginEventGeneric(Ri.GetDefineNames, this._eventInfo), t.materialDefines = new _g(this._eventInfo.defineNames));\n const s = t.materialDefines;\n if (this._isReadyForSubMesh(t))\n return !0;\n const a = this.getScene(), o = a.getEngine();\n if (s._areTexturesDirty && (this._eventInfo.hasRenderTargetTextures = !1, this._callbackPluginEventHasRenderTargetTextures(this._eventInfo), this._cacheHasRenderTargetTextures = this._eventInfo.hasRenderTargetTextures, a.texturesEnabled)) {\n if (this._albedoTexture && ae.DiffuseTextureEnabled && !this._albedoTexture.isReadyOrNotBlocking() || this._ambientTexture && ae.AmbientTextureEnabled && !this._ambientTexture.isReadyOrNotBlocking() || this._opacityTexture && ae.OpacityTextureEnabled && !this._opacityTexture.isReadyOrNotBlocking())\n return !1;\n const d = this._getReflectionTexture();\n if (d && ae.ReflectionTextureEnabled) {\n if (!d.isReadyOrNotBlocking())\n return !1;\n if (d.irradianceTexture) {\n if (!d.irradianceTexture.isReadyOrNotBlocking())\n return !1;\n } else if (!d.sphericalPolynomial && ((f = d.getInternalTexture()) != null && f._sphericalPolynomialPromise))\n return !1;\n }\n if (this._lightmapTexture && ae.LightmapTextureEnabled && !this._lightmapTexture.isReadyOrNotBlocking() || this._emissiveTexture && ae.EmissiveTextureEnabled && !this._emissiveTexture.isReadyOrNotBlocking())\n return !1;\n if (ae.SpecularTextureEnabled) {\n if (this._metallicTexture) {\n if (!this._metallicTexture.isReadyOrNotBlocking())\n return !1;\n } else if (this._reflectivityTexture && !this._reflectivityTexture.isReadyOrNotBlocking())\n return !1;\n if (this._metallicReflectanceTexture && !this._metallicReflectanceTexture.isReadyOrNotBlocking() || this._reflectanceTexture && !this._reflectanceTexture.isReadyOrNotBlocking() || this._microSurfaceTexture && !this._microSurfaceTexture.isReadyOrNotBlocking())\n return !1;\n }\n if (o.getCaps().standardDerivatives && this._bumpTexture && ae.BumpTextureEnabled && !this._disableBumpMap && !this._bumpTexture.isReady() || this._environmentBRDFTexture && ae.ReflectionTextureEnabled && !this._environmentBRDFTexture.isReady())\n return !1;\n }\n if (this._eventInfo.isReadyForSubMesh = !0, this._eventInfo.defines = s, this._eventInfo.subMesh = t, this._callbackPluginEventIsReadyForSubMesh(this._eventInfo), !this._eventInfo.isReadyForSubMesh || s._areImageProcessingDirty && this._imageProcessingConfiguration && !this._imageProcessingConfiguration.isReady())\n return !1;\n !o.getCaps().standardDerivatives && !e.isVerticesDataPresent(I.NormalKind) && (e.createNormals(!0), ne.Warn(\"PBRMaterial: Normals have been created for the mesh: \" + e.name));\n const l = t.effect, c = s._areLightsDisposed;\n let h = this._prepareEffect(e, s, this.onCompiled, this.onError, i, null, t.getRenderingMesh().hasThinInstances), u = !1;\n if (h)\n if (this._onEffectCreatedObservable && ($n.effect = h, $n.subMesh = t, this._onEffectCreatedObservable.notifyObservers($n)), this.allowShaderHotSwapping && l && !h.isReady()) {\n if (h = l, s.markAsUnprocessed(), u = this.isFrozen, c)\n return s._areLightsDisposed = !0, !1;\n } else\n a.resetCachedMaterial(), t.setEffect(h, s, this._materialContext);\n return !t.effect || !t.effect.isReady() ? !1 : (s._renderId = a.getRenderId(), r._wasPreviouslyReady = !u, r._wasPreviouslyUsingInstances = !!i, this._checkScenePerformancePriority(), !0);\n }\n /**\n * Specifies if the material uses metallic roughness workflow.\n * @returns boolean specifying if the material uses metallic roughness workflow.\n */\n isMetallicWorkflow() {\n return !!(this._metallic != null || this._roughness != null || this._metallicTexture);\n }\n _prepareEffect(e, t, i = null, r = null, s = null, a = null, o) {\n if (this._prepareDefines(e, t, s, a, o), !t.isDirty)\n return null;\n t.markAsProcessed();\n const c = this.getScene().getEngine(), h = new gf();\n let u = 0;\n t.USESPHERICALINVERTEX && h.addFallback(u++, \"USESPHERICALINVERTEX\"), t.FOG && h.addFallback(u, \"FOG\"), t.SPECULARAA && h.addFallback(u, \"SPECULARAA\"), t.POINTSIZE && h.addFallback(u, \"POINTSIZE\"), t.LOGARITHMICDEPTH && h.addFallback(u, \"LOGARITHMICDEPTH\"), t.PARALLAX && h.addFallback(u, \"PARALLAX\"), t.PARALLAX_RHS && h.addFallback(u, \"PARALLAX_RHS\"), t.PARALLAXOCCLUSION && h.addFallback(u++, \"PARALLAXOCCLUSION\"), t.ENVIRONMENTBRDF && h.addFallback(u++, \"ENVIRONMENTBRDF\"), t.TANGENT && h.addFallback(u++, \"TANGENT\"), t.BUMP && h.addFallback(u++, \"BUMP\"), u = i0(t, h, this._maxSimultaneousLights, u++), t.SPECULARTERM && h.addFallback(u++, \"SPECULARTERM\"), t.USESPHERICALFROMREFLECTIONMAP && h.addFallback(u++, \"USESPHERICALFROMREFLECTIONMAP\"), t.USEIRRADIANCEMAP && h.addFallback(u++, \"USEIRRADIANCEMAP\"), t.LIGHTMAP && h.addFallback(u++, \"LIGHTMAP\"), t.NORMAL && h.addFallback(u++, \"NORMAL\"), t.AMBIENT && h.addFallback(u++, \"AMBIENT\"), t.EMISSIVE && h.addFallback(u++, \"EMISSIVE\"), t.VERTEXCOLOR && h.addFallback(u++, \"VERTEXCOLOR\"), t.MORPHTARGETS && h.addFallback(u++, \"MORPHTARGETS\"), t.MULTIVIEW && h.addFallback(0, \"MULTIVIEW\");\n const f = [I.PositionKind];\n t.NORMAL && f.push(I.NormalKind), t.TANGENT && f.push(I.TangentKind);\n for (let R = 1; R <= 6; ++R)\n t[\"UV\" + R] && f.push(`uv${R === 1 ? \"\" : R}`);\n t.VERTEXCOLOR && f.push(I.ColorKind), t0(f, e, t, h), cf(f, t), Q_(f, e, t), of(f, e, t);\n let d = \"pbr\";\n const p = [\n \"world\",\n \"view\",\n \"viewProjection\",\n \"vEyePosition\",\n \"vLightsType\",\n \"vAmbientColor\",\n \"vAlbedoColor\",\n \"vReflectivityColor\",\n \"vMetallicReflectanceFactors\",\n \"vEmissiveColor\",\n \"visibility\",\n \"vReflectionColor\",\n \"vFogInfos\",\n \"vFogColor\",\n \"pointSize\",\n \"vAlbedoInfos\",\n \"vAmbientInfos\",\n \"vOpacityInfos\",\n \"vReflectionInfos\",\n \"vReflectionPosition\",\n \"vReflectionSize\",\n \"vEmissiveInfos\",\n \"vReflectivityInfos\",\n \"vReflectionFilteringInfo\",\n \"vMetallicReflectanceInfos\",\n \"vReflectanceInfos\",\n \"vMicroSurfaceSamplerInfos\",\n \"vBumpInfos\",\n \"vLightmapInfos\",\n \"mBones\",\n \"albedoMatrix\",\n \"ambientMatrix\",\n \"opacityMatrix\",\n \"reflectionMatrix\",\n \"emissiveMatrix\",\n \"reflectivityMatrix\",\n \"normalMatrix\",\n \"microSurfaceSamplerMatrix\",\n \"bumpMatrix\",\n \"lightmapMatrix\",\n \"metallicReflectanceMatrix\",\n \"reflectanceMatrix\",\n \"vLightingIntensity\",\n \"logarithmicDepthConstant\",\n \"vSphericalX\",\n \"vSphericalY\",\n \"vSphericalZ\",\n \"vSphericalXX_ZZ\",\n \"vSphericalYY_ZZ\",\n \"vSphericalZZ\",\n \"vSphericalXY\",\n \"vSphericalYZ\",\n \"vSphericalZX\",\n \"vSphericalL00\",\n \"vSphericalL1_1\",\n \"vSphericalL10\",\n \"vSphericalL11\",\n \"vSphericalL2_2\",\n \"vSphericalL2_1\",\n \"vSphericalL20\",\n \"vSphericalL21\",\n \"vSphericalL22\",\n \"vReflectionMicrosurfaceInfos\",\n \"vTangentSpaceParams\",\n \"boneTextureWidth\",\n \"vDebugMode\",\n \"morphTargetTextureInfo\",\n \"morphTargetTextureIndices\"\n ], g = [\n \"albedoSampler\",\n \"reflectivitySampler\",\n \"ambientSampler\",\n \"emissiveSampler\",\n \"bumpSampler\",\n \"lightmapSampler\",\n \"opacitySampler\",\n \"reflectionSampler\",\n \"reflectionSamplerLow\",\n \"reflectionSamplerHigh\",\n \"irradianceSampler\",\n \"microSurfaceSampler\",\n \"environmentBrdfSampler\",\n \"boneSampler\",\n \"metallicReflectanceSampler\",\n \"reflectanceSampler\",\n \"morphTargets\",\n \"oitDepthSampler\",\n \"oitFrontColorSampler\"\n ], m = [\"Material\", \"Scene\", \"Mesh\"], v = { maxSimultaneousLights: this._maxSimultaneousLights, maxSimultaneousMorphTargets: t.NUM_MORPH_INFLUENCERS };\n this._eventInfo.fallbacks = h, this._eventInfo.fallbackRank = u, this._eventInfo.defines = t, this._eventInfo.uniforms = p, this._eventInfo.attributes = f, this._eventInfo.samplers = g, this._eventInfo.uniformBuffersNames = m, this._eventInfo.customCode = void 0, this._eventInfo.mesh = e, this._eventInfo.indexParameters = v, this._callbackPluginEventGeneric(Ri.PrepareEffect, this._eventInfo), oc.AddUniforms(p), Nc(p), at && (at.PrepareUniforms(p, t), at.PrepareSamplers(g, t)), df({\n uniformsNames: p,\n uniformBuffersNames: m,\n samplers: g,\n defines: t,\n maxSimultaneousLights: this._maxSimultaneousLights\n });\n const E = {};\n this.customShaderNameResolve && (d = this.customShaderNameResolve(d, p, m, g, t, f, E));\n const C = t.toString(), T = c.createEffect(d, {\n attributes: f,\n uniformsNames: p,\n uniformBuffersNames: m,\n samplers: g,\n defines: C,\n fallbacks: h,\n onCompiled: i,\n onError: r,\n indexParameters: v,\n processFinalCode: E.processFinalCode,\n processCodeAfterIncludes: this._eventInfo.customCode,\n multiTarget: t.PREPASS\n }, c);\n return this._eventInfo.customCode = void 0, T;\n }\n _prepareDefines(e, t, i = null, r = null, s = !1) {\n var c;\n const a = this.getScene(), o = a.getEngine();\n r0(a, e, t, !0, this._maxSimultaneousLights, this._disableLighting), t._needNormals = !0, s0(a, t);\n const l = this.needAlphaBlendingForMesh(e) && this.getScene().useOrderIndependentTransparency;\n if (a0(a, t, this.canRenderToMRT && !l), n0(a, t, l), t.METALLICWORKFLOW = this.isMetallicWorkflow(), t._areTexturesDirty) {\n t._needUVs = !1;\n for (let h = 1; h <= 6; ++h)\n t[\"MAINUV\" + h] = !1;\n if (a.texturesEnabled) {\n t.ALBEDODIRECTUV = 0, t.AMBIENTDIRECTUV = 0, t.OPACITYDIRECTUV = 0, t.EMISSIVEDIRECTUV = 0, t.REFLECTIVITYDIRECTUV = 0, t.MICROSURFACEMAPDIRECTUV = 0, t.METALLIC_REFLECTANCEDIRECTUV = 0, t.REFLECTANCEDIRECTUV = 0, t.BUMPDIRECTUV = 0, t.LIGHTMAPDIRECTUV = 0, o.getCaps().textureLOD && (t.LODBASEDMICROSFURACE = !0), this._albedoTexture && ae.DiffuseTextureEnabled ? (wt(this._albedoTexture, t, \"ALBEDO\"), t.GAMMAALBEDO = this._albedoTexture.gammaSpace) : t.ALBEDO = !1, this._ambientTexture && ae.AmbientTextureEnabled ? (wt(this._ambientTexture, t, \"AMBIENT\"), t.AMBIENTINGRAYSCALE = this._useAmbientInGrayScale) : t.AMBIENT = !1, this._opacityTexture && ae.OpacityTextureEnabled ? (wt(this._opacityTexture, t, \"OPACITY\"), t.OPACITYRGB = this._opacityTexture.getAlphaFromRGB) : t.OPACITY = !1;\n const h = this._getReflectionTexture();\n if (h && ae.ReflectionTextureEnabled) {\n switch (t.REFLECTION = !0, t.GAMMAREFLECTION = h.gammaSpace, t.RGBDREFLECTION = h.isRGBD, t.LODINREFLECTIONALPHA = h.lodLevelInAlpha, t.LINEARSPECULARREFLECTION = h.linearSpecularLOD, this.realTimeFiltering && this.realTimeFilteringQuality > 0 ? (t.NUM_SAMPLES = \"\" + this.realTimeFilteringQuality, o._features.needTypeSuffixInShaderConstants && (t.NUM_SAMPLES = t.NUM_SAMPLES + \"u\"), t.REALTIME_FILTERING = !0) : t.REALTIME_FILTERING = !1, t.INVERTCUBICMAP = h.coordinatesMode === le.INVCUBIC_MODE, t.REFLECTIONMAP_3D = h.isCube, t.REFLECTIONMAP_OPPOSITEZ = t.REFLECTIONMAP_3D && this.getScene().useRightHandedSystem ? !h.invertZ : h.invertZ, t.REFLECTIONMAP_CUBIC = !1, t.REFLECTIONMAP_EXPLICIT = !1, t.REFLECTIONMAP_PLANAR = !1, t.REFLECTIONMAP_PROJECTION = !1, t.REFLECTIONMAP_SKYBOX = !1, t.REFLECTIONMAP_SPHERICAL = !1, t.REFLECTIONMAP_EQUIRECTANGULAR = !1, t.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !1, t.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !1, h.coordinatesMode) {\n case le.EXPLICIT_MODE:\n t.REFLECTIONMAP_EXPLICIT = !0;\n break;\n case le.PLANAR_MODE:\n t.REFLECTIONMAP_PLANAR = !0;\n break;\n case le.PROJECTION_MODE:\n t.REFLECTIONMAP_PROJECTION = !0;\n break;\n case le.SKYBOX_MODE:\n t.REFLECTIONMAP_SKYBOX = !0;\n break;\n case le.SPHERICAL_MODE:\n t.REFLECTIONMAP_SPHERICAL = !0;\n break;\n case le.EQUIRECTANGULAR_MODE:\n t.REFLECTIONMAP_EQUIRECTANGULAR = !0;\n break;\n case le.FIXED_EQUIRECTANGULAR_MODE:\n t.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !0;\n break;\n case le.FIXED_EQUIRECTANGULAR_MIRRORED_MODE:\n t.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !0;\n break;\n case le.CUBIC_MODE:\n case le.INVCUBIC_MODE:\n default:\n t.REFLECTIONMAP_CUBIC = !0, t.USE_LOCAL_REFLECTIONMAP_CUBIC = !!h.boundingBoxSize;\n break;\n }\n h.coordinatesMode !== le.SKYBOX_MODE && (h.irradianceTexture ? (t.USEIRRADIANCEMAP = !0, t.USESPHERICALFROMREFLECTIONMAP = !1) : h.isCube && (t.USESPHERICALFROMREFLECTIONMAP = !0, t.USEIRRADIANCEMAP = !1, this._forceIrradianceInFragment || this.realTimeFiltering || this._twoSidedLighting || o.getCaps().maxVaryingVectors <= 8 ? t.USESPHERICALINVERTEX = !1 : t.USESPHERICALINVERTEX = !0));\n } else\n t.REFLECTION = !1, t.REFLECTIONMAP_3D = !1, t.REFLECTIONMAP_SPHERICAL = !1, t.REFLECTIONMAP_PLANAR = !1, t.REFLECTIONMAP_CUBIC = !1, t.USE_LOCAL_REFLECTIONMAP_CUBIC = !1, t.REFLECTIONMAP_PROJECTION = !1, t.REFLECTIONMAP_SKYBOX = !1, t.REFLECTIONMAP_EXPLICIT = !1, t.REFLECTIONMAP_EQUIRECTANGULAR = !1, t.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !1, t.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !1, t.INVERTCUBICMAP = !1, t.USESPHERICALFROMREFLECTIONMAP = !1, t.USEIRRADIANCEMAP = !1, t.USESPHERICALINVERTEX = !1, t.REFLECTIONMAP_OPPOSITEZ = !1, t.LODINREFLECTIONALPHA = !1, t.GAMMAREFLECTION = !1, t.RGBDREFLECTION = !1, t.LINEARSPECULARREFLECTION = !1;\n if (this._lightmapTexture && ae.LightmapTextureEnabled ? (wt(this._lightmapTexture, t, \"LIGHTMAP\"), t.USELIGHTMAPASSHADOWMAP = this._useLightmapAsShadowmap, t.GAMMALIGHTMAP = this._lightmapTexture.gammaSpace, t.RGBDLIGHTMAP = this._lightmapTexture.isRGBD) : t.LIGHTMAP = !1, this._emissiveTexture && ae.EmissiveTextureEnabled ? (wt(this._emissiveTexture, t, \"EMISSIVE\"), t.GAMMAEMISSIVE = this._emissiveTexture.gammaSpace) : t.EMISSIVE = !1, ae.SpecularTextureEnabled) {\n if (this._metallicTexture ? (wt(this._metallicTexture, t, \"REFLECTIVITY\"), t.ROUGHNESSSTOREINMETALMAPALPHA = this._useRoughnessFromMetallicTextureAlpha, t.ROUGHNESSSTOREINMETALMAPGREEN = !this._useRoughnessFromMetallicTextureAlpha && this._useRoughnessFromMetallicTextureGreen, t.METALLNESSSTOREINMETALMAPBLUE = this._useMetallnessFromMetallicTextureBlue, t.AOSTOREINMETALMAPRED = this._useAmbientOcclusionFromMetallicTextureRed, t.REFLECTIVITY_GAMMA = !1) : this._reflectivityTexture ? (wt(this._reflectivityTexture, t, \"REFLECTIVITY\"), t.MICROSURFACEFROMREFLECTIVITYMAP = this._useMicroSurfaceFromReflectivityMapAlpha, t.MICROSURFACEAUTOMATIC = this._useAutoMicroSurfaceFromReflectivityMap, t.REFLECTIVITY_GAMMA = this._reflectivityTexture.gammaSpace) : t.REFLECTIVITY = !1, this._metallicReflectanceTexture || this._reflectanceTexture) {\n const u = this._metallicReflectanceTexture !== null && this._metallicReflectanceTexture._texture === ((c = this._reflectanceTexture) == null ? void 0 : c._texture) && this._metallicReflectanceTexture.checkTransformsAreIdentical(this._reflectanceTexture);\n t.METALLIC_REFLECTANCE_USE_ALPHA_ONLY = this._useOnlyMetallicFromMetallicReflectanceTexture && !u, this._metallicReflectanceTexture ? (wt(this._metallicReflectanceTexture, t, \"METALLIC_REFLECTANCE\"), t.METALLIC_REFLECTANCE_GAMMA = this._metallicReflectanceTexture.gammaSpace) : t.METALLIC_REFLECTANCE = !1, this._reflectanceTexture && !u && (!this._metallicReflectanceTexture || this._metallicReflectanceTexture && this._useOnlyMetallicFromMetallicReflectanceTexture) ? (wt(this._reflectanceTexture, t, \"REFLECTANCE\"), t.REFLECTANCE_GAMMA = this._reflectanceTexture.gammaSpace) : t.REFLECTANCE = !1;\n } else\n t.METALLIC_REFLECTANCE = !1, t.REFLECTANCE = !1;\n this._microSurfaceTexture ? wt(this._microSurfaceTexture, t, \"MICROSURFACEMAP\") : t.MICROSURFACEMAP = !1;\n } else\n t.REFLECTIVITY = !1, t.MICROSURFACEMAP = !1;\n o.getCaps().standardDerivatives && this._bumpTexture && ae.BumpTextureEnabled && !this._disableBumpMap ? (wt(this._bumpTexture, t, \"BUMP\"), this._useParallax && this._albedoTexture && ae.DiffuseTextureEnabled ? (t.PARALLAX = !0, t.PARALLAX_RHS = a.useRightHandedSystem, t.PARALLAXOCCLUSION = !!this._useParallaxOcclusion) : t.PARALLAX = !1, t.OBJECTSPACE_NORMALMAP = this._useObjectSpaceNormalMap) : (t.BUMP = !1, t.PARALLAX = !1, t.PARALLAX_RHS = !1, t.PARALLAXOCCLUSION = !1, t.OBJECTSPACE_NORMALMAP = !1), this._environmentBRDFTexture && ae.ReflectionTextureEnabled ? (t.ENVIRONMENTBRDF = !0, t.ENVIRONMENTBRDF_RGBD = this._environmentBRDFTexture.isRGBD) : (t.ENVIRONMENTBRDF = !1, t.ENVIRONMENTBRDF_RGBD = !1), this._shouldUseAlphaFromAlbedoTexture() ? t.ALPHAFROMALBEDO = !0 : t.ALPHAFROMALBEDO = !1;\n }\n t.SPECULAROVERALPHA = this._useSpecularOverAlpha, this._lightFalloff === Nt.LIGHTFALLOFF_STANDARD ? (t.USEPHYSICALLIGHTFALLOFF = !1, t.USEGLTFLIGHTFALLOFF = !1) : this._lightFalloff === Nt.LIGHTFALLOFF_GLTF ? (t.USEPHYSICALLIGHTFALLOFF = !1, t.USEGLTFLIGHTFALLOFF = !0) : (t.USEPHYSICALLIGHTFALLOFF = !0, t.USEGLTFLIGHTFALLOFF = !1), t.RADIANCEOVERALPHA = this._useRadianceOverAlpha, !this.backFaceCulling && this._twoSidedLighting ? t.TWOSIDEDLIGHTING = !0 : t.TWOSIDEDLIGHTING = !1, t.SPECULARAA = o.getCaps().standardDerivatives && this._enableSpecularAntiAliasing;\n }\n (t._areTexturesDirty || t._areMiscDirty) && (t.ALPHATESTVALUE = `${this._alphaCutOff}${this._alphaCutOff % 1 === 0 ? \".\" : \"\"}`, t.PREMULTIPLYALPHA = this.alphaMode === 7 || this.alphaMode === 8, t.ALPHABLEND = this.needAlphaBlendingForMesh(e), t.ALPHAFRESNEL = this._useAlphaFresnel || this._useLinearAlphaFresnel, t.LINEARALPHAFRESNEL = this._useLinearAlphaFresnel), t._areImageProcessingDirty && this._imageProcessingConfiguration && this._imageProcessingConfiguration.prepareDefines(t), t.FORCENORMALFORWARD = this._forceNormalForward, t.RADIANCEOCCLUSION = this._useRadianceOcclusion, t.HORIZONOCCLUSION = this._useHorizonOcclusion, t._areMiscDirty && (hf(e, a, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, this._shouldTurnAlphaTestOn(e) || this._forceAlphaTest, t, this._applyDecalMapAfterDetailMap), t.UNLIT = this._unlit || (this.pointsCloud || this.wireframe) && !e.isVerticesDataPresent(I.NormalKind), t.DEBUGMODE = this._debugMode), uf(a, o, this, t, !!i, r, s), this._eventInfo.defines = t, this._eventInfo.mesh = e, this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo), ff(e, t, !0, !0, !0, this._transparencyMode !== Nt.PBRMATERIAL_OPAQUE), this._callbackPluginEventPrepareDefines(this._eventInfo);\n }\n /**\n * Force shader compilation\n * @param mesh - Define the mesh we want to force the compilation for\n * @param onCompiled - Define a callback triggered when the compilation completes\n * @param options - Define the options used to create the compilation\n */\n forceCompilation(e, t, i) {\n const r = {\n clipPlane: !1,\n useInstances: !1,\n ...i\n };\n this._uniformBufferLayoutBuilt || this.buildUniformLayout(), this._callbackPluginEventGeneric(Ri.GetDefineNames, this._eventInfo);\n const s = new _g(this._eventInfo.defineNames), a = this._prepareEffect(e, s, void 0, void 0, r.useInstances, r.clipPlane, e.hasThinInstances);\n this._onEffectCreatedObservable && ($n.effect = a, $n.subMesh = null, this._onEffectCreatedObservable.notifyObservers($n)), a.isReady() ? t && t(this) : a.onCompileObservable.add(() => {\n t && t(this);\n });\n }\n /**\n * Initializes the uniform buffer layout for the shader.\n */\n buildUniformLayout() {\n const e = this._uniformBuffer;\n e.addUniform(\"vAlbedoInfos\", 2), e.addUniform(\"vAmbientInfos\", 4), e.addUniform(\"vOpacityInfos\", 2), e.addUniform(\"vEmissiveInfos\", 2), e.addUniform(\"vLightmapInfos\", 2), e.addUniform(\"vReflectivityInfos\", 3), e.addUniform(\"vMicroSurfaceSamplerInfos\", 2), e.addUniform(\"vReflectionInfos\", 2), e.addUniform(\"vReflectionFilteringInfo\", 2), e.addUniform(\"vReflectionPosition\", 3), e.addUniform(\"vReflectionSize\", 3), e.addUniform(\"vBumpInfos\", 3), e.addUniform(\"albedoMatrix\", 16), e.addUniform(\"ambientMatrix\", 16), e.addUniform(\"opacityMatrix\", 16), e.addUniform(\"emissiveMatrix\", 16), e.addUniform(\"lightmapMatrix\", 16), e.addUniform(\"reflectivityMatrix\", 16), e.addUniform(\"microSurfaceSamplerMatrix\", 16), e.addUniform(\"bumpMatrix\", 16), e.addUniform(\"vTangentSpaceParams\", 2), e.addUniform(\"reflectionMatrix\", 16), e.addUniform(\"vReflectionColor\", 3), e.addUniform(\"vAlbedoColor\", 4), e.addUniform(\"vLightingIntensity\", 4), e.addUniform(\"vReflectionMicrosurfaceInfos\", 3), e.addUniform(\"pointSize\", 1), e.addUniform(\"vReflectivityColor\", 4), e.addUniform(\"vEmissiveColor\", 3), e.addUniform(\"vAmbientColor\", 3), e.addUniform(\"vDebugMode\", 2), e.addUniform(\"vMetallicReflectanceFactors\", 4), e.addUniform(\"vMetallicReflectanceInfos\", 2), e.addUniform(\"metallicReflectanceMatrix\", 16), e.addUniform(\"vReflectanceInfos\", 2), e.addUniform(\"reflectanceMatrix\", 16), e.addUniform(\"vSphericalL00\", 3), e.addUniform(\"vSphericalL1_1\", 3), e.addUniform(\"vSphericalL10\", 3), e.addUniform(\"vSphericalL11\", 3), e.addUniform(\"vSphericalL2_2\", 3), e.addUniform(\"vSphericalL2_1\", 3), e.addUniform(\"vSphericalL20\", 3), e.addUniform(\"vSphericalL21\", 3), e.addUniform(\"vSphericalL22\", 3), e.addUniform(\"vSphericalX\", 3), e.addUniform(\"vSphericalY\", 3), e.addUniform(\"vSphericalZ\", 3), e.addUniform(\"vSphericalXX_ZZ\", 3), e.addUniform(\"vSphericalYY_ZZ\", 3), e.addUniform(\"vSphericalZZ\", 3), e.addUniform(\"vSphericalXY\", 3), e.addUniform(\"vSphericalYZ\", 3), e.addUniform(\"vSphericalZX\", 3), super.buildUniformLayout();\n }\n /**\n * Binds the submesh data.\n * @param world - The world matrix.\n * @param mesh - The BJS mesh.\n * @param subMesh - A submesh of the BJS mesh.\n */\n bindForSubMesh(e, t, i) {\n var u, f, d;\n const r = this.getScene(), s = i.materialDefines;\n if (!s)\n return;\n const a = i.effect;\n if (!a)\n return;\n this._activeEffect = a, t.getMeshUniformBuffer().bindToEffect(a, \"Mesh\"), t.transferToEffect(e);\n const o = r.getEngine();\n this._uniformBuffer.bindToEffect(a, \"Material\"), this.prePassConfiguration.bindForSubMesh(this._activeEffect, r, t, e, this.isFrozen), this._eventInfo.subMesh = i, this._callbackPluginEventHardBindForSubMesh(this._eventInfo), s.OBJECTSPACE_NORMALMAP && (e.toNormalMatrix(this._normalMatrix), this.bindOnlyNormalMatrix(this._normalMatrix));\n const l = this._mustRebind(r, a, i, t.visibility);\n lf(t, this._activeEffect, this.prePassConfiguration);\n let c = null;\n const h = this._uniformBuffer;\n if (l) {\n if (this.bindViewProjection(a), c = this._getReflectionTexture(), !h.useUbo || !this.isFrozen || !h.isSync || i._drawWrapper._forceRebindOnNextCall) {\n if (r.texturesEnabled) {\n if (this._albedoTexture && ae.DiffuseTextureEnabled && (h.updateFloat2(\"vAlbedoInfos\", this._albedoTexture.coordinatesIndex, this._albedoTexture.level), Mt(this._albedoTexture, h, \"albedo\")), this._ambientTexture && ae.AmbientTextureEnabled && (h.updateFloat4(\"vAmbientInfos\", this._ambientTexture.coordinatesIndex, this._ambientTexture.level, this._ambientTextureStrength, this._ambientTextureImpactOnAnalyticalLights), Mt(this._ambientTexture, h, \"ambient\")), this._opacityTexture && ae.OpacityTextureEnabled && (h.updateFloat2(\"vOpacityInfos\", this._opacityTexture.coordinatesIndex, this._opacityTexture.level), Mt(this._opacityTexture, h, \"opacity\")), c && ae.ReflectionTextureEnabled) {\n if (h.updateMatrix(\"reflectionMatrix\", c.getReflectionTextureMatrix()), h.updateFloat2(\"vReflectionInfos\", c.level, 0), c.boundingBoxSize) {\n const p = c;\n h.updateVector3(\"vReflectionPosition\", p.boundingBoxPosition), h.updateVector3(\"vReflectionSize\", p.boundingBoxSize);\n }\n if (this.realTimeFiltering) {\n const p = c.getSize().width;\n h.updateFloat2(\"vReflectionFilteringInfo\", p, je.Log2(p));\n }\n if (!s.USEIRRADIANCEMAP) {\n const p = c.sphericalPolynomial;\n if (s.USESPHERICALFROMREFLECTIONMAP && p)\n if (s.SPHERICAL_HARMONICS) {\n const g = p.preScaledHarmonics;\n h.updateVector3(\"vSphericalL00\", g.l00), h.updateVector3(\"vSphericalL1_1\", g.l1_1), h.updateVector3(\"vSphericalL10\", g.l10), h.updateVector3(\"vSphericalL11\", g.l11), h.updateVector3(\"vSphericalL2_2\", g.l2_2), h.updateVector3(\"vSphericalL2_1\", g.l2_1), h.updateVector3(\"vSphericalL20\", g.l20), h.updateVector3(\"vSphericalL21\", g.l21), h.updateVector3(\"vSphericalL22\", g.l22);\n } else\n h.updateFloat3(\"vSphericalX\", p.x.x, p.x.y, p.x.z), h.updateFloat3(\"vSphericalY\", p.y.x, p.y.y, p.y.z), h.updateFloat3(\"vSphericalZ\", p.z.x, p.z.y, p.z.z), h.updateFloat3(\"vSphericalXX_ZZ\", p.xx.x - p.zz.x, p.xx.y - p.zz.y, p.xx.z - p.zz.z), h.updateFloat3(\"vSphericalYY_ZZ\", p.yy.x - p.zz.x, p.yy.y - p.zz.y, p.yy.z - p.zz.z), h.updateFloat3(\"vSphericalZZ\", p.zz.x, p.zz.y, p.zz.z), h.updateFloat3(\"vSphericalXY\", p.xy.x, p.xy.y, p.xy.z), h.updateFloat3(\"vSphericalYZ\", p.yz.x, p.yz.y, p.yz.z), h.updateFloat3(\"vSphericalZX\", p.zx.x, p.zx.y, p.zx.z);\n }\n h.updateFloat3(\"vReflectionMicrosurfaceInfos\", c.getSize().width, c.lodGenerationScale, c.lodGenerationOffset);\n }\n this._emissiveTexture && ae.EmissiveTextureEnabled && (h.updateFloat2(\"vEmissiveInfos\", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level), Mt(this._emissiveTexture, h, \"emissive\")), this._lightmapTexture && ae.LightmapTextureEnabled && (h.updateFloat2(\"vLightmapInfos\", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level), Mt(this._lightmapTexture, h, \"lightmap\")), ae.SpecularTextureEnabled && (this._metallicTexture ? (h.updateFloat3(\"vReflectivityInfos\", this._metallicTexture.coordinatesIndex, this._metallicTexture.level, this._ambientTextureStrength), Mt(this._metallicTexture, h, \"reflectivity\")) : this._reflectivityTexture && (h.updateFloat3(\"vReflectivityInfos\", this._reflectivityTexture.coordinatesIndex, this._reflectivityTexture.level, 1), Mt(this._reflectivityTexture, h, \"reflectivity\")), this._metallicReflectanceTexture && (h.updateFloat2(\"vMetallicReflectanceInfos\", this._metallicReflectanceTexture.coordinatesIndex, this._metallicReflectanceTexture.level), Mt(this._metallicReflectanceTexture, h, \"metallicReflectance\")), this._reflectanceTexture && s.REFLECTANCE && (h.updateFloat2(\"vReflectanceInfos\", this._reflectanceTexture.coordinatesIndex, this._reflectanceTexture.level), Mt(this._reflectanceTexture, h, \"reflectance\")), this._microSurfaceTexture && (h.updateFloat2(\"vMicroSurfaceSamplerInfos\", this._microSurfaceTexture.coordinatesIndex, this._microSurfaceTexture.level), Mt(this._microSurfaceTexture, h, \"microSurfaceSampler\"))), this._bumpTexture && o.getCaps().standardDerivatives && ae.BumpTextureEnabled && !this._disableBumpMap && (h.updateFloat3(\"vBumpInfos\", this._bumpTexture.coordinatesIndex, this._bumpTexture.level, this._parallaxScaleBias), Mt(this._bumpTexture, h, \"bump\"), r._mirroredCameraPosition ? h.updateFloat2(\"vTangentSpaceParams\", this._invertNormalMapX ? 1 : -1, this._invertNormalMapY ? 1 : -1) : h.updateFloat2(\"vTangentSpaceParams\", this._invertNormalMapX ? -1 : 1, this._invertNormalMapY ? -1 : 1));\n }\n if (this.pointsCloud && h.updateFloat(\"pointSize\", this.pointSize), s.METALLICWORKFLOW) {\n jr.Color3[0].r = this._metallic === void 0 || this._metallic === null ? 1 : this._metallic, jr.Color3[0].g = this._roughness === void 0 || this._roughness === null ? 1 : this._roughness, h.updateColor4(\"vReflectivityColor\", jr.Color3[0], 1);\n const p = ((u = this.subSurface) == null ? void 0 : u._indexOfRefraction) ?? 1.5, g = 1, m = Math.pow((p - g) / (p + g), 2);\n this._metallicReflectanceColor.scaleToRef(m * this._metallicF0Factor, jr.Color3[0]);\n const v = this._metallicF0Factor;\n h.updateColor4(\"vMetallicReflectanceFactors\", jr.Color3[0], v);\n } else\n h.updateColor4(\"vReflectivityColor\", this._reflectivityColor, this._microSurface);\n h.updateColor3(\"vEmissiveColor\", ae.EmissiveTextureEnabled ? this._emissiveColor : Ne.BlackReadOnly), h.updateColor3(\"vReflectionColor\", this._reflectionColor), !s.SS_REFRACTION && ((f = this.subSurface) != null && f._linkRefractionWithTransparency) ? h.updateColor4(\"vAlbedoColor\", this._albedoColor, 1) : h.updateColor4(\"vAlbedoColor\", this._albedoColor, this.alpha), this._lightingInfos.x = this._directIntensity, this._lightingInfos.y = this._emissiveIntensity, this._lightingInfos.z = this._environmentIntensity * r.environmentIntensity, this._lightingInfos.w = this._specularIntensity, h.updateVector4(\"vLightingIntensity\", this._lightingInfos), r.ambientColor.multiplyToRef(this._ambientColor, this._globalAmbientColor), h.updateColor3(\"vAmbientColor\", this._globalAmbientColor), h.updateFloat2(\"vDebugMode\", this.debugLimit, this.debugFactor);\n }\n r.texturesEnabled && (this._albedoTexture && ae.DiffuseTextureEnabled && h.setTexture(\"albedoSampler\", this._albedoTexture), this._ambientTexture && ae.AmbientTextureEnabled && h.setTexture(\"ambientSampler\", this._ambientTexture), this._opacityTexture && ae.OpacityTextureEnabled && h.setTexture(\"opacitySampler\", this._opacityTexture), c && ae.ReflectionTextureEnabled && (s.LODBASEDMICROSFURACE ? h.setTexture(\"reflectionSampler\", c) : (h.setTexture(\"reflectionSampler\", c._lodTextureMid || c), h.setTexture(\"reflectionSamplerLow\", c._lodTextureLow || c), h.setTexture(\"reflectionSamplerHigh\", c._lodTextureHigh || c)), s.USEIRRADIANCEMAP && h.setTexture(\"irradianceSampler\", c.irradianceTexture)), s.ENVIRONMENTBRDF && h.setTexture(\"environmentBrdfSampler\", this._environmentBRDFTexture), this._emissiveTexture && ae.EmissiveTextureEnabled && h.setTexture(\"emissiveSampler\", this._emissiveTexture), this._lightmapTexture && ae.LightmapTextureEnabled && h.setTexture(\"lightmapSampler\", this._lightmapTexture), ae.SpecularTextureEnabled && (this._metallicTexture ? h.setTexture(\"reflectivitySampler\", this._metallicTexture) : this._reflectivityTexture && h.setTexture(\"reflectivitySampler\", this._reflectivityTexture), this._metallicReflectanceTexture && h.setTexture(\"metallicReflectanceSampler\", this._metallicReflectanceTexture), this._reflectanceTexture && s.REFLECTANCE && h.setTexture(\"reflectanceSampler\", this._reflectanceTexture), this._microSurfaceTexture && h.setTexture(\"microSurfaceSampler\", this._microSurfaceTexture)), this._bumpTexture && o.getCaps().standardDerivatives && ae.BumpTextureEnabled && !this._disableBumpMap && h.setTexture(\"bumpSampler\", this._bumpTexture)), this.getScene().useOrderIndependentTransparency && this.needAlphaBlendingForMesh(t) && this.getScene().depthPeelingRenderer.bind(a), this._eventInfo.subMesh = i, this._callbackPluginEventBindForSubMesh(this._eventInfo), Fc(this._activeEffect, this, r), this.bindEyePosition(a);\n } else\n r.getEngine()._features.needToAlwaysBindUniformBuffers && (this._needToBindSceneUbo = !0);\n (l || !this.isFrozen) && (r.lightsEnabled && !this._disableLighting && e0(r, t, this._activeEffect, s, this._maxSimultaneousLights), (r.fogEnabled && t.applyFog && r.fogMode !== Ot.FOGMODE_NONE || c || this.subSurface.refractionTexture || t.receiveShadows || s.PREPASS) && this.bindView(a), wc(r, t, this._activeEffect, !0), s.NUM_MORPH_INFLUENCERS && af(t, this._activeEffect), s.BAKED_VERTEX_ANIMATION_TEXTURE && ((d = t.bakedVertexAnimationManager) == null || d.bind(a, s.INSTANCES)), this._imageProcessingConfiguration.bind(this._activeEffect), Lc(s, this._activeEffect, r)), this._afterBind(t, this._activeEffect, i), h.update();\n }\n /**\n * Returns the animatable textures.\n * If material have animatable metallic texture, then reflectivity texture will not be returned, even if it has animations.\n * @returns - Array of animatable textures.\n */\n getAnimatables() {\n const e = super.getAnimatables();\n return this._albedoTexture && this._albedoTexture.animations && this._albedoTexture.animations.length > 0 && e.push(this._albedoTexture), this._ambientTexture && this._ambientTexture.animations && this._ambientTexture.animations.length > 0 && e.push(this._ambientTexture), this._opacityTexture && this._opacityTexture.animations && this._opacityTexture.animations.length > 0 && e.push(this._opacityTexture), this._reflectionTexture && this._reflectionTexture.animations && this._reflectionTexture.animations.length > 0 && e.push(this._reflectionTexture), this._emissiveTexture && this._emissiveTexture.animations && this._emissiveTexture.animations.length > 0 && e.push(this._emissiveTexture), this._metallicTexture && this._metallicTexture.animations && this._metallicTexture.animations.length > 0 ? e.push(this._metallicTexture) : this._reflectivityTexture && this._reflectivityTexture.animations && this._reflectivityTexture.animations.length > 0 && e.push(this._reflectivityTexture), this._bumpTexture && this._bumpTexture.animations && this._bumpTexture.animations.length > 0 && e.push(this._bumpTexture), this._lightmapTexture && this._lightmapTexture.animations && this._lightmapTexture.animations.length > 0 && e.push(this._lightmapTexture), this._metallicReflectanceTexture && this._metallicReflectanceTexture.animations && this._metallicReflectanceTexture.animations.length > 0 && e.push(this._metallicReflectanceTexture), this._reflectanceTexture && this._reflectanceTexture.animations && this._reflectanceTexture.animations.length > 0 && e.push(this._reflectanceTexture), this._microSurfaceTexture && this._microSurfaceTexture.animations && this._microSurfaceTexture.animations.length > 0 && e.push(this._microSurfaceTexture), e;\n }\n /**\n * Returns the texture used for reflections.\n * @returns - Reflection texture if present. Otherwise, returns the environment texture.\n */\n _getReflectionTexture() {\n return this._reflectionTexture ? this._reflectionTexture : this.getScene().environmentTexture;\n }\n /**\n * Returns an array of the actively used textures.\n * @returns - Array of BaseTextures\n */\n getActiveTextures() {\n const e = super.getActiveTextures();\n return this._albedoTexture && e.push(this._albedoTexture), this._ambientTexture && e.push(this._ambientTexture), this._opacityTexture && e.push(this._opacityTexture), this._reflectionTexture && e.push(this._reflectionTexture), this._emissiveTexture && e.push(this._emissiveTexture), this._reflectivityTexture && e.push(this._reflectivityTexture), this._metallicTexture && e.push(this._metallicTexture), this._metallicReflectanceTexture && e.push(this._metallicReflectanceTexture), this._reflectanceTexture && e.push(this._reflectanceTexture), this._microSurfaceTexture && e.push(this._microSurfaceTexture), this._bumpTexture && e.push(this._bumpTexture), this._lightmapTexture && e.push(this._lightmapTexture), e;\n }\n /**\n * Checks to see if a texture is used in the material.\n * @param texture - Base texture to use.\n * @returns - Boolean specifying if a texture is used in the material.\n */\n hasTexture(e) {\n return !!(super.hasTexture(e) || this._albedoTexture === e || this._ambientTexture === e || this._opacityTexture === e || this._reflectionTexture === e || this._emissiveTexture === e || this._reflectivityTexture === e || this._metallicTexture === e || this._metallicReflectanceTexture === e || this._reflectanceTexture === e || this._microSurfaceTexture === e || this._bumpTexture === e || this._lightmapTexture === e);\n }\n /**\n * Sets the required values to the prepass renderer.\n * It can't be sets when subsurface scattering of this material is disabled.\n * When scene have ability to enable subsurface prepass effect, it will enable.\n * @returns - If prepass is enabled or not.\n */\n setPrePassRenderer() {\n var t;\n if (!((t = this.subSurface) != null && t.isScatteringEnabled))\n return !1;\n const e = this.getScene().enableSubSurfaceForPrePass();\n return e && (e.enabled = !0), !0;\n }\n /**\n * Disposes the resources of the material.\n * @param forceDisposeEffect - Forces the disposal of effects.\n * @param forceDisposeTextures - Forces the disposal of all textures.\n */\n dispose(e, t) {\n var i, r, s, a, o, l, c, h, u, f, d, p;\n t && (this._environmentBRDFTexture && this.getScene().environmentBRDFTexture !== this._environmentBRDFTexture && this._environmentBRDFTexture.dispose(), (i = this._albedoTexture) == null || i.dispose(), (r = this._ambientTexture) == null || r.dispose(), (s = this._opacityTexture) == null || s.dispose(), (a = this._reflectionTexture) == null || a.dispose(), (o = this._emissiveTexture) == null || o.dispose(), (l = this._metallicTexture) == null || l.dispose(), (c = this._reflectivityTexture) == null || c.dispose(), (h = this._bumpTexture) == null || h.dispose(), (u = this._lightmapTexture) == null || u.dispose(), (f = this._metallicReflectanceTexture) == null || f.dispose(), (d = this._reflectanceTexture) == null || d.dispose(), (p = this._microSurfaceTexture) == null || p.dispose()), this._renderTargets.dispose(), this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), super.dispose(e, t);\n }\n}\nNt.PBRMATERIAL_OPAQUE = ie.MATERIAL_OPAQUE;\nNt.PBRMATERIAL_ALPHATEST = ie.MATERIAL_ALPHATEST;\nNt.PBRMATERIAL_ALPHABLEND = ie.MATERIAL_ALPHABLEND;\nNt.PBRMATERIAL_ALPHATESTANDBLEND = ie.MATERIAL_ALPHATESTANDBLEND;\nNt.DEFAULT_AO_ON_ANALYTICAL_LIGHTS = 0;\nNt.LIGHTFALLOFF_PHYSICAL = 0;\nNt.LIGHTFALLOFF_GLTF = 1;\nNt.LIGHTFALLOFF_STANDARD = 2;\nP([\n by()\n], Nt.prototype, \"_imageProcessingConfiguration\", void 0);\nP([\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], Nt.prototype, \"debugMode\", void 0);\nclass we extends Nt {\n /**\n * Stores the refracted light information in a texture.\n */\n get refractionTexture() {\n return this.subSurface.refractionTexture;\n }\n set refractionTexture(e) {\n this.subSurface.refractionTexture = e, e ? this.subSurface.isRefractionEnabled = !0 : this.subSurface.linkRefractionWithTransparency || (this.subSurface.isRefractionEnabled = !1);\n }\n /**\n * Index of refraction of the material base layer.\n * https://en.wikipedia.org/wiki/List_of_refractive_indices\n *\n * This does not only impact refraction but also the Base F0 of Dielectric Materials.\n *\n * From dielectric fresnel rules: F0 = square((iorT - iorI) / (iorT + iorI))\n */\n get indexOfRefraction() {\n return this.subSurface.indexOfRefraction;\n }\n set indexOfRefraction(e) {\n this.subSurface.indexOfRefraction = e;\n }\n /**\n * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.\n */\n get invertRefractionY() {\n return this.subSurface.invertRefractionY;\n }\n set invertRefractionY(e) {\n this.subSurface.invertRefractionY = e;\n }\n /**\n * This parameters will make the material used its opacity to control how much it is refracting against not.\n * Materials half opaque for instance using refraction could benefit from this control.\n */\n get linkRefractionWithTransparency() {\n return this.subSurface.linkRefractionWithTransparency;\n }\n set linkRefractionWithTransparency(e) {\n this.subSurface.linkRefractionWithTransparency = e, e && (this.subSurface.isRefractionEnabled = !0);\n }\n /**\n * BJS is using an hardcoded light falloff based on a manually sets up range.\n * In PBR, one way to represents the falloff is to use the inverse squared root algorithm.\n * This parameter can help you switch back to the BJS mode in order to create scenes using both materials.\n */\n get usePhysicalLightFalloff() {\n return this._lightFalloff === Nt.LIGHTFALLOFF_PHYSICAL;\n }\n /**\n * BJS is using an hardcoded light falloff based on a manually sets up range.\n * In PBR, one way to represents the falloff is to use the inverse squared root algorithm.\n * This parameter can help you switch back to the BJS mode in order to create scenes using both materials.\n */\n set usePhysicalLightFalloff(e) {\n e !== this.usePhysicalLightFalloff && (this._markAllSubMeshesAsTexturesDirty(), e ? this._lightFalloff = Nt.LIGHTFALLOFF_PHYSICAL : this._lightFalloff = Nt.LIGHTFALLOFF_STANDARD);\n }\n /**\n * In order to support the falloff compatibility with gltf, a special mode has been added\n * to reproduce the gltf light falloff.\n */\n get useGLTFLightFalloff() {\n return this._lightFalloff === Nt.LIGHTFALLOFF_GLTF;\n }\n /**\n * In order to support the falloff compatibility with gltf, a special mode has been added\n * to reproduce the gltf light falloff.\n */\n set useGLTFLightFalloff(e) {\n e !== this.useGLTFLightFalloff && (this._markAllSubMeshesAsTexturesDirty(), e ? this._lightFalloff = Nt.LIGHTFALLOFF_GLTF : this._lightFalloff = Nt.LIGHTFALLOFF_STANDARD);\n }\n /**\n * Gets the image processing configuration used either in this material.\n */\n get imageProcessingConfiguration() {\n return this._imageProcessingConfiguration;\n }\n /**\n * Sets the Default image processing configuration used either in the this material.\n *\n * If sets to null, the scene one is in use.\n */\n set imageProcessingConfiguration(e) {\n this._attachImageProcessingConfiguration(e), this._markAllSubMeshesAsTexturesDirty();\n }\n /**\n * Gets whether the color curves effect is enabled.\n */\n get cameraColorCurvesEnabled() {\n return this.imageProcessingConfiguration.colorCurvesEnabled;\n }\n /**\n * Sets whether the color curves effect is enabled.\n */\n set cameraColorCurvesEnabled(e) {\n this.imageProcessingConfiguration.colorCurvesEnabled = e;\n }\n /**\n * Gets whether the color grading effect is enabled.\n */\n get cameraColorGradingEnabled() {\n return this.imageProcessingConfiguration.colorGradingEnabled;\n }\n /**\n * Gets whether the color grading effect is enabled.\n */\n set cameraColorGradingEnabled(e) {\n this.imageProcessingConfiguration.colorGradingEnabled = e;\n }\n /**\n * Gets whether tonemapping is enabled or not.\n */\n get cameraToneMappingEnabled() {\n return this._imageProcessingConfiguration.toneMappingEnabled;\n }\n /**\n * Sets whether tonemapping is enabled or not\n */\n set cameraToneMappingEnabled(e) {\n this._imageProcessingConfiguration.toneMappingEnabled = e;\n }\n /**\n * The camera exposure used on this material.\n * This property is here and not in the camera to allow controlling exposure without full screen post process.\n * This corresponds to a photographic exposure.\n */\n get cameraExposure() {\n return this._imageProcessingConfiguration.exposure;\n }\n /**\n * The camera exposure used on this material.\n * This property is here and not in the camera to allow controlling exposure without full screen post process.\n * This corresponds to a photographic exposure.\n */\n set cameraExposure(e) {\n this._imageProcessingConfiguration.exposure = e;\n }\n /**\n * Gets The camera contrast used on this material.\n */\n get cameraContrast() {\n return this._imageProcessingConfiguration.contrast;\n }\n /**\n * Sets The camera contrast used on this material.\n */\n set cameraContrast(e) {\n this._imageProcessingConfiguration.contrast = e;\n }\n /**\n * Gets the Color Grading 2D Lookup Texture.\n */\n get cameraColorGradingTexture() {\n return this._imageProcessingConfiguration.colorGradingTexture;\n }\n /**\n * Sets the Color Grading 2D Lookup Texture.\n */\n set cameraColorGradingTexture(e) {\n this._imageProcessingConfiguration.colorGradingTexture = e;\n }\n /**\n * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT).\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\n */\n get cameraColorCurves() {\n return this._imageProcessingConfiguration.colorCurves;\n }\n /**\n * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT).\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\n */\n set cameraColorCurves(e) {\n this._imageProcessingConfiguration.colorCurves = e;\n }\n /**\n * Instantiates a new PBRMaterial instance.\n *\n * @param name The material name\n * @param scene The scene the material will be use in.\n */\n constructor(e, t) {\n super(e, t), this.directIntensity = 1, this.emissiveIntensity = 1, this.environmentIntensity = 1, this.specularIntensity = 1, this.disableBumpMap = !1, this.ambientTextureStrength = 1, this.ambientTextureImpactOnAnalyticalLights = we.DEFAULT_AO_ON_ANALYTICAL_LIGHTS, this.metallicF0Factor = 1, this.metallicReflectanceColor = Ne.White(), this.useOnlyMetallicFromMetallicReflectanceTexture = !1, this.ambientColor = new Ne(0, 0, 0), this.albedoColor = new Ne(1, 1, 1), this.reflectivityColor = new Ne(1, 1, 1), this.reflectionColor = new Ne(1, 1, 1), this.emissiveColor = new Ne(0, 0, 0), this.microSurface = 1, this.useLightmapAsShadowmap = !1, this.useAlphaFromAlbedoTexture = !1, this.forceAlphaTest = !1, this.alphaCutOff = 0.4, this.useSpecularOverAlpha = !0, this.useMicroSurfaceFromReflectivityMapAlpha = !1, this.useRoughnessFromMetallicTextureAlpha = !0, this.useRoughnessFromMetallicTextureGreen = !1, this.useMetallnessFromMetallicTextureBlue = !1, this.useAmbientOcclusionFromMetallicTextureRed = !1, this.useAmbientInGrayScale = !1, this.useAutoMicroSurfaceFromReflectivityMap = !1, this.useRadianceOverAlpha = !0, this.useObjectSpaceNormalMap = !1, this.useParallax = !1, this.useParallaxOcclusion = !1, this.parallaxScaleBias = 0.05, this.disableLighting = !1, this.forceIrradianceInFragment = !1, this.maxSimultaneousLights = 4, this.invertNormalMapX = !1, this.invertNormalMapY = !1, this.twoSidedLighting = !1, this.useAlphaFresnel = !1, this.useLinearAlphaFresnel = !1, this.environmentBRDFTexture = null, this.forceNormalForward = !1, this.enableSpecularAntiAliasing = !1, this.useHorizonOcclusion = !0, this.useRadianceOcclusion = !0, this.unlit = !1, this.applyDecalMapAfterDetailMap = !1, this._environmentBRDFTexture = b0(this.getScene());\n }\n /**\n * @returns the name of this material class.\n */\n getClassName() {\n return \"PBRMaterial\";\n }\n /**\n * Makes a duplicate of the current material.\n * @param name - name to use for the new material.\n * @param cloneTexturesOnlyOnce - if a texture is used in more than one channel (e.g diffuse and opacity), only clone it once and reuse it on the other channels. Default false.\n * @param rootUrl defines the root URL to use to load textures\n * @returns cloned material instance\n */\n clone(e, t = !0, i = \"\") {\n const r = Le.Clone(() => new we(e, this.getScene()), this, { cloneTexturesOnlyOnce: t });\n return r.id = e, r.name = e, this.stencil.copyTo(r.stencil), this._clonePlugins(r, i), r;\n }\n /**\n * Serializes this PBR Material.\n * @returns - An object with the serialized material.\n */\n serialize() {\n const e = super.serialize();\n return e.customType = \"BABYLON.PBRMaterial\", e;\n }\n // Statics\n /**\n * Parses a PBR Material from a serialized object.\n * @param source - Serialized object.\n * @param scene - BJS scene instance.\n * @param rootUrl - url for the scene object\n * @returns - PBRMaterial\n */\n static Parse(e, t, i) {\n const r = Le.Parse(() => new we(e.name, t), e, t, i);\n return e.stencil && r.stencil.parse(e.stencil, t, i), ie._ParsePlugins(e, r, t, i), e.clearCoat && r.clearCoat.parse(e.clearCoat, t, i), e.anisotropy && r.anisotropy.parse(e.anisotropy, t, i), e.brdf && r.brdf.parse(e.brdf, t, i), e.sheen && r.sheen.parse(e.sheen, t, i), e.subSurface && r.subSurface.parse(e.subSurface, t, i), e.iridescence && r.iridescence.parse(e.iridescence, t, i), r;\n }\n}\nwe.PBRMATERIAL_OPAQUE = Nt.PBRMATERIAL_OPAQUE;\nwe.PBRMATERIAL_ALPHATEST = Nt.PBRMATERIAL_ALPHATEST;\nwe.PBRMATERIAL_ALPHABLEND = Nt.PBRMATERIAL_ALPHABLEND;\nwe.PBRMATERIAL_ALPHATESTANDBLEND = Nt.PBRMATERIAL_ALPHATESTANDBLEND;\nwe.DEFAULT_AO_ON_ANALYTICAL_LIGHTS = Nt.DEFAULT_AO_ON_ANALYTICAL_LIGHTS;\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"directIntensity\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"emissiveIntensity\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"environmentIntensity\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"specularIntensity\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"disableBumpMap\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"albedoTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"ambientTexture\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"ambientTextureStrength\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"ambientTextureImpactOnAnalyticalLights\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], we.prototype, \"opacityTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"reflectionTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"emissiveTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"reflectivityTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"metallicTexture\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"metallic\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"roughness\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"metallicF0Factor\", void 0);\nP([\n $i(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"metallicReflectanceColor\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useOnlyMetallicFromMetallicReflectanceTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"metallicReflectanceTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"reflectanceTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"microSurfaceTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"bumpTexture\", void 0);\nP([\n Tt(),\n oe(\"_markAllSubMeshesAsTexturesDirty\", null)\n], we.prototype, \"lightmapTexture\", void 0);\nP([\n $i(\"ambient\"),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"ambientColor\", void 0);\nP([\n $i(\"albedo\"),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"albedoColor\", void 0);\nP([\n $i(\"reflectivity\"),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"reflectivityColor\", void 0);\nP([\n $i(\"reflection\"),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"reflectionColor\", void 0);\nP([\n $i(\"emissive\"),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"emissiveColor\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"microSurface\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useLightmapAsShadowmap\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], we.prototype, \"useAlphaFromAlbedoTexture\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], we.prototype, \"forceAlphaTest\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\n], we.prototype, \"alphaCutOff\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useSpecularOverAlpha\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useMicroSurfaceFromReflectivityMapAlpha\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useRoughnessFromMetallicTextureAlpha\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useRoughnessFromMetallicTextureGreen\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useMetallnessFromMetallicTextureBlue\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useAmbientOcclusionFromMetallicTextureRed\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useAmbientInGrayScale\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useAutoMicroSurfaceFromReflectivityMap\", void 0);\nP([\n w()\n], we.prototype, \"usePhysicalLightFalloff\", null);\nP([\n w()\n], we.prototype, \"useGLTFLightFalloff\", null);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useRadianceOverAlpha\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useObjectSpaceNormalMap\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useParallax\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useParallaxOcclusion\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"parallaxScaleBias\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsLightsDirty\")\n], we.prototype, \"disableLighting\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"forceIrradianceInFragment\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsLightsDirty\")\n], we.prototype, \"maxSimultaneousLights\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"invertNormalMapX\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"invertNormalMapY\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"twoSidedLighting\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useAlphaFresnel\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useLinearAlphaFresnel\", void 0);\nP([\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"environmentBRDFTexture\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"forceNormalForward\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"enableSpecularAntiAliasing\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useHorizonOcclusion\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsTexturesDirty\")\n], we.prototype, \"useRadianceOcclusion\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], we.prototype, \"unlit\", void 0);\nP([\n w(),\n oe(\"_markAllSubMeshesAsMiscDirty\")\n], we.prototype, \"applyDecalMapAfterDetailMap\", void 0);\nRe(\"BABYLON.PBRMaterial\", we);\nDe.prototype.updateRawTexture = function(n, e, t, i, r = null, s = 0, a = !1) {\n if (!n)\n return;\n const o = this._getRGBABufferInternalSizedFormat(s, t, a), l = this._getInternalFormat(t), c = this._getWebGLTextureType(s);\n this._bindTextureDirectly(this._gl.TEXTURE_2D, n, !0), this._unpackFlipY(i === void 0 ? !0 : !!i), this._doNotHandleContextLost || (n._bufferView = e, n.format = t, n.type = s, n.invertY = i, n._compression = r), n.width % 4 !== 0 && this._gl.pixelStorei(this._gl.UNPACK_ALIGNMENT, 1), r && e ? this._gl.compressedTexImage2D(this._gl.TEXTURE_2D, 0, this.getCaps().s3tc[r], n.width, n.height, 0, e) : this._gl.texImage2D(this._gl.TEXTURE_2D, 0, o, n.width, n.height, 0, l, c, e), n.generateMipMaps && this._gl.generateMipmap(this._gl.TEXTURE_2D), this._bindTextureDirectly(this._gl.TEXTURE_2D, null), n.isReady = !0;\n};\nDe.prototype.createRawTexture = function(n, e, t, i, r, s, a, o = null, l = 0, c = 0, h = !1) {\n const u = new or(this, Dt.Raw);\n u.baseWidth = e, u.baseHeight = t, u.width = e, u.height = t, u.format = i, u.generateMipMaps = r, u.samplingMode = a, u.invertY = s, u._compression = o, u.type = l, u._useSRGBBuffer = this._getUseSRGBBuffer(h, !r), this._doNotHandleContextLost || (u._bufferView = n), this.updateRawTexture(u, n, i, s, o, l, u._useSRGBBuffer), this._bindTextureDirectly(this._gl.TEXTURE_2D, u, !0);\n const f = this._getSamplingParameters(a, r);\n return this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, f.mag), this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, f.min), r && this._gl.generateMipmap(this._gl.TEXTURE_2D), this._bindTextureDirectly(this._gl.TEXTURE_2D, null), this._internalTexturesCache.push(u), u;\n};\nDe.prototype.createRawCubeTexture = function(n, e, t, i, r, s, a, o = null) {\n const l = this._gl, c = new or(this, Dt.CubeRaw);\n c.isCube = !0, c.format = t, c.type = i, this._doNotHandleContextLost || (c._bufferViewArray = n);\n const h = this._getWebGLTextureType(i);\n let u = this._getInternalFormat(t);\n u === l.RGB && (u = l.RGBA), h === l.FLOAT && !this._caps.textureFloatLinearFiltering ? (r = !1, a = 1, ne.Warn(\"Float texture filtering is not supported. Mipmap generation and sampling mode are forced to false and TEXTURE_NEAREST_SAMPLINGMODE, respectively.\")) : h === this._gl.HALF_FLOAT_OES && !this._caps.textureHalfFloatLinearFiltering ? (r = !1, a = 1, ne.Warn(\"Half float texture filtering is not supported. Mipmap generation and sampling mode are forced to false and TEXTURE_NEAREST_SAMPLINGMODE, respectively.\")) : h === l.FLOAT && !this._caps.textureFloatRender ? (r = !1, ne.Warn(\"Render to float textures is not supported. Mipmap generation forced to false.\")) : h === l.HALF_FLOAT && !this._caps.colorBufferFloat && (r = !1, ne.Warn(\"Render to half float textures is not supported. Mipmap generation forced to false.\"));\n const f = e, d = f;\n if (c.width = f, c.height = d, c.invertY = s, c._compression = o, !this.needPOTTextures || mo(c.width) && mo(c.height) || (r = !1), n)\n this.updateRawCubeTexture(c, n, t, i, s, o);\n else {\n const m = this._getRGBABufferInternalSizedFormat(i), v = 0;\n this._bindTextureDirectly(l.TEXTURE_CUBE_MAP, c, !0);\n for (let E = 0; E < 6; E++)\n o ? l.compressedTexImage2D(l.TEXTURE_CUBE_MAP_POSITIVE_X + E, v, this.getCaps().s3tc[o], c.width, c.height, 0, void 0) : l.texImage2D(l.TEXTURE_CUBE_MAP_POSITIVE_X + E, v, m, c.width, c.height, 0, u, h, null);\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null);\n }\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, c, !0), n && r && this._gl.generateMipmap(this._gl.TEXTURE_CUBE_MAP);\n const g = this._getSamplingParameters(a, r);\n return l.texParameteri(l.TEXTURE_CUBE_MAP, l.TEXTURE_MAG_FILTER, g.mag), l.texParameteri(l.TEXTURE_CUBE_MAP, l.TEXTURE_MIN_FILTER, g.min), l.texParameteri(l.TEXTURE_CUBE_MAP, l.TEXTURE_WRAP_S, l.CLAMP_TO_EDGE), l.texParameteri(l.TEXTURE_CUBE_MAP, l.TEXTURE_WRAP_T, l.CLAMP_TO_EDGE), this._bindTextureDirectly(l.TEXTURE_CUBE_MAP, null), c.generateMipMaps = r, c.samplingMode = a, c.isReady = !0, c;\n};\nDe.prototype.updateRawCubeTexture = function(n, e, t, i, r, s = null, a = 0) {\n n._bufferViewArray = e, n.format = t, n.type = i, n.invertY = r, n._compression = s;\n const o = this._gl, l = this._getWebGLTextureType(i);\n let c = this._getInternalFormat(t);\n const h = this._getRGBABufferInternalSizedFormat(i);\n let u = !1;\n c === o.RGB && (c = o.RGBA, u = !0), this._bindTextureDirectly(o.TEXTURE_CUBE_MAP, n, !0), this._unpackFlipY(r === void 0 ? !0 : !!r), n.width % 4 !== 0 && o.pixelStorei(o.UNPACK_ALIGNMENT, 1);\n for (let d = 0; d < 6; d++) {\n let p = e[d];\n s ? o.compressedTexImage2D(o.TEXTURE_CUBE_MAP_POSITIVE_X + d, a, this.getCaps().s3tc[s], n.width, n.height, 0, p) : (u && (p = A0(p, n.width, n.height, i)), o.texImage2D(o.TEXTURE_CUBE_MAP_POSITIVE_X + d, a, h, n.width, n.height, 0, c, l, p));\n }\n (!this.needPOTTextures || mo(n.width) && mo(n.height)) && n.generateMipMaps && a === 0 && this._gl.generateMipmap(this._gl.TEXTURE_CUBE_MAP), this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null), n.isReady = !0;\n};\nDe.prototype.createRawCubeTextureFromUrl = function(n, e, t, i, r, s, a, o, l = null, c = null, h = 3, u = !1) {\n const f = this._gl, d = this.createRawCubeTexture(null, t, i, r, !s, u, h, null);\n e == null || e.addPendingData(d), d.url = n, d.isReady = !1, this._internalTexturesCache.push(d);\n const p = (m, v) => {\n e == null || e.removePendingData(d), c && m && c(m.status + \" \" + m.statusText, v);\n }, g = (m) => {\n const v = d.width, E = a(m);\n if (E) {\n if (o) {\n const C = this._getWebGLTextureType(r);\n let T = this._getInternalFormat(i);\n const R = this._getRGBABufferInternalSizedFormat(r);\n let x = !1;\n T === f.RGB && (T = f.RGBA, x = !0), this._bindTextureDirectly(f.TEXTURE_CUBE_MAP, d, !0), this._unpackFlipY(!1);\n const S = o(E);\n for (let M = 0; M < S.length; M++) {\n const N = v >> M;\n for (let F = 0; F < 6; F++) {\n let U = S[M][F];\n x && (U = A0(U, N, N, r)), f.texImage2D(F, M, R, N, N, 0, T, C, U);\n }\n }\n this._bindTextureDirectly(f.TEXTURE_CUBE_MAP, null);\n } else\n this.updateRawCubeTexture(d, E, i, r, u);\n d.isReady = !0, e == null || e.removePendingData(d), d.onLoadedObservable.notifyObservers(d), d.onLoadedObservable.clear(), l && l();\n }\n };\n return this._loadFile(n, (m) => {\n g(m);\n }, void 0, e == null ? void 0 : e.offlineProvider, !0, p), d;\n};\nfunction A0(n, e, t, i) {\n let r, s = 1;\n i === 1 ? r = new Float32Array(e * t * 4) : i === 2 ? (r = new Uint16Array(e * t * 4), s = 15360) : i === 7 ? r = new Uint32Array(e * t * 4) : r = new Uint8Array(e * t * 4);\n for (let a = 0; a < e; a++)\n for (let o = 0; o < t; o++) {\n const l = (o * e + a) * 3, c = (o * e + a) * 4;\n r[c + 0] = n[l + 0], r[c + 1] = n[l + 1], r[c + 2] = n[l + 2], r[c + 3] = s;\n }\n return r;\n}\nfunction M0(n) {\n return function(e, t, i, r, s, a, o, l, c = null, h = 0) {\n const u = n ? this._gl.TEXTURE_3D : this._gl.TEXTURE_2D_ARRAY, f = n ? Dt.Raw3D : Dt.Raw2DArray, d = new or(this, f);\n d.baseWidth = t, d.baseHeight = i, d.baseDepth = r, d.width = t, d.height = i, d.depth = r, d.format = s, d.type = h, d.generateMipMaps = a, d.samplingMode = l, n ? d.is3D = !0 : d.is2DArray = !0, this._doNotHandleContextLost || (d._bufferView = e), n ? this.updateRawTexture3D(d, e, s, o, c, h) : this.updateRawTexture2DArray(d, e, s, o, c, h), this._bindTextureDirectly(u, d, !0);\n const p = this._getSamplingParameters(l, a);\n return this._gl.texParameteri(u, this._gl.TEXTURE_MAG_FILTER, p.mag), this._gl.texParameteri(u, this._gl.TEXTURE_MIN_FILTER, p.min), a && this._gl.generateMipmap(u), this._bindTextureDirectly(u, null), this._internalTexturesCache.push(d), d;\n };\n}\nDe.prototype.createRawTexture2DArray = M0(!1);\nDe.prototype.createRawTexture3D = M0(!0);\nfunction P0(n) {\n return function(e, t, i, r, s = null, a = 0) {\n const o = n ? this._gl.TEXTURE_3D : this._gl.TEXTURE_2D_ARRAY, l = this._getWebGLTextureType(a), c = this._getInternalFormat(i), h = this._getRGBABufferInternalSizedFormat(a, i);\n this._bindTextureDirectly(o, e, !0), this._unpackFlipY(r === void 0 ? !0 : !!r), this._doNotHandleContextLost || (e._bufferView = t, e.format = i, e.invertY = r, e._compression = s), e.width % 4 !== 0 && this._gl.pixelStorei(this._gl.UNPACK_ALIGNMENT, 1), s && t ? this._gl.compressedTexImage3D(o, 0, this.getCaps().s3tc[s], e.width, e.height, e.depth, 0, t) : this._gl.texImage3D(o, 0, h, e.width, e.height, e.depth, 0, c, l, t), e.generateMipMaps && this._gl.generateMipmap(o), this._bindTextureDirectly(o, null), e.isReady = !0;\n };\n}\nDe.prototype.updateRawTexture2DArray = P0(!1);\nDe.prototype.updateRawTexture3D = P0(!0);\nclass rr extends le {\n /**\n * Instantiates a new RawTexture.\n * Raw texture can help creating a texture directly from an array of data.\n * This can be super useful if you either get the data from an uncompressed source or\n * if you wish to create your texture pixel by pixel.\n * @param data define the array of data to use to create the texture (null to create an empty texture)\n * @param width define the width of the texture\n * @param height define the height of the texture\n * @param format define the format of the data (RGB, RGBA... Engine.TEXTUREFORMAT_xxx)\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps define whether mip maps should be generated or not\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\n */\n constructor(e, t, i, r, s, a = !0, o = !1, l = 3, c = 0, h, u) {\n super(null, s, !a, o, void 0, void 0, void 0, void 0, void 0, void 0, void 0, void 0, h), this.format = r, this._engine && (!this._engine._caps.textureFloatLinearFiltering && c === 1 && (l = 1), !this._engine._caps.textureHalfFloatLinearFiltering && c === 2 && (l = 1), this._texture = this._engine.createRawTexture(e, t, i, r, a, o, l, null, c, h ?? 0, u ?? !1), this.wrapU = le.CLAMP_ADDRESSMODE, this.wrapV = le.CLAMP_ADDRESSMODE);\n }\n /**\n * Updates the texture underlying data.\n * @param data Define the new data of the texture\n */\n update(e) {\n this._getEngine().updateRawTexture(this._texture, e, this._texture.format, this._texture.invertY, null, this._texture.type, this._texture._useSRGBBuffer);\n }\n /**\n * Creates a luminance texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @returns the luminance texture\n */\n static CreateLuminanceTexture(e, t, i, r, s = !0, a = !1, o = 3) {\n return new rr(e, t, i, 1, r, s, a, o);\n }\n /**\n * Creates a luminance alpha texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @returns the luminance alpha texture\n */\n static CreateLuminanceAlphaTexture(e, t, i, r, s = !0, a = !1, o = 3) {\n return new rr(e, t, i, 2, r, s, a, o);\n }\n /**\n * Creates an alpha texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @returns the alpha texture\n */\n static CreateAlphaTexture(e, t, i, r, s = !0, a = !1, o = 3) {\n return new rr(e, t, i, 0, r, s, a, o);\n }\n /**\n * Creates a RGB texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\n * @returns the RGB alpha texture\n */\n static CreateRGBTexture(e, t, i, r, s = !0, a = !1, o = 3, l = 0, c = 0, h = !1) {\n return new rr(e, t, i, 4, r, s, a, o, l, c, h);\n }\n /**\n * Creates a RGBA texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)\n * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg)\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\n * @returns the RGBA texture\n */\n static CreateRGBATexture(e, t, i, r, s = !0, a = !1, o = 3, l = 0, c = 0, h = !1) {\n return new rr(e, t, i, 5, r, s, a, o, l, c, h);\n }\n /**\n * Creates a RGBA storage texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\n * @returns the RGBA texture\n */\n static CreateRGBAStorageTexture(e, t, i, r, s = !0, a = !1, o = 3, l = 0, c = !1) {\n return new rr(e, t, i, 5, r, s, a, o, l, 1, c);\n }\n /**\n * Creates a R texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)\n * @returns the R texture\n */\n static CreateRTexture(e, t, i, r, s = !0, a = !1, o = le.TRILINEAR_SAMPLINGMODE, l = 1) {\n return new rr(e, t, i, 6, r, s, a, o, l);\n }\n /**\n * Creates a R storage texture from some data.\n * @param data Define the texture data\n * @param width Define the width of the texture\n * @param height Define the height of the texture\n * @param sceneOrEngine defines the scene or engine the texture will belong to\n * @param generateMipMaps Define whether or not to create mip maps for the texture\n * @param invertY define if the data should be flipped on Y when uploaded to the GPU\n * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)\n * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)\n * @returns the R texture\n */\n static CreateRStorageTexture(e, t, i, r, s = !0, a = !1, o = le.TRILINEAR_SAMPLINGMODE, l = 1) {\n return new rr(e, t, i, 6, r, s, a, o, l, 1);\n }\n}\nclass wi {\n}\nwi.DEFAULT_COLOR = Ne.White();\nwi.DEFAULT_WIDTH_ATTENUATED = 1;\nwi.DEFAULT_WIDTH = 0.1;\nclass _t {\n /**\n * Converts GreasedLinePoints to number[][]\n * @param points GreasedLinePoints\n * @returns number[][] with x, y, z coordinates of the points, like [[x, y, z, x, y, z, ...], [x, y, z, ...]]\n */\n static ConvertPoints(e) {\n if (e.length && Array.isArray(e) && typeof e[0] == \"number\")\n return [e];\n if (e.length && Array.isArray(e[0]) && typeof e[0][0] == \"number\")\n return e;\n if (e.length && !Array.isArray(e[0]) && e[0] instanceof _) {\n const t = [];\n for (let i = 0; i < e.length; i++) {\n const r = e[i];\n t.push(r.x, r.y, r.z);\n }\n return [t];\n } else if (e.length > 0 && Array.isArray(e[0]) && e[0].length > 0 && e[0][0] instanceof _) {\n const t = [];\n return e.forEach((r) => {\n t.push(r.flatMap((s) => [s.x, s.y, s.z]));\n }), t;\n } else {\n if (e instanceof Float32Array)\n return [Array.from(e)];\n if (e.length && e[0] instanceof Float32Array) {\n const t = [];\n return e.forEach((i) => {\n t.push(Array.from(i));\n }), t;\n }\n }\n return [];\n }\n /**\n * Omit zero length lines predicate for the MeshesToLines function\n * @param p1 point1 position of the face\n * @param p2 point2 position of the face\n * @param p3 point3 position of the face\n * @returns original points or null if any edge length is zero\n */\n static OmitZeroLengthPredicate(e, t, i) {\n const r = [];\n return t.subtract(e).lengthSquared() > 0 && r.push([e, t]), i.subtract(t).lengthSquared() > 0 && r.push([t, i]), e.subtract(i).lengthSquared() > 0 && r.push([i, e]), r.length === 0 ? null : r;\n }\n /**\n * Omit duplicate lines predicate for the MeshesToLines function\n * @param p1 point1 position of the face\n * @param p2 point2 position of the face\n * @param p3 point3 position of the face\n * @param points array of points to search in\n * @returns original points or null if any edge length is zero\n */\n static OmitDuplicatesPredicate(e, t, i, r) {\n const s = [];\n return _t._SearchInPoints(e, t, r) || s.push([e, t]), _t._SearchInPoints(t, i, r) || s.push([t, i]), _t._SearchInPoints(i, e, r) || s.push([i, e]), s.length === 0 ? null : s;\n }\n static _SearchInPoints(e, t, i) {\n var r, s, a;\n for (const o of i)\n for (let l = 0; l < o.length; l++)\n if ((r = o[l]) != null && r.equals(e) && ((s = o[l + 1]) != null && s.equals(t) || (a = o[l - 1]) != null && a.equals(t)))\n return !0;\n return !1;\n }\n /**\n * Gets mesh triangles as line positions\n * @param meshes array of meshes\n * @param predicate predicate function which decides whether to include the mesh triangle/face in the ouput\n * @returns array of arrays of points\n */\n static MeshesToLines(e, t) {\n const i = [];\n return e.forEach((r, s) => {\n const a = r.getVerticesData(I.PositionKind), o = r.getIndices();\n if (a && o)\n for (let l = 0, c = 0; l < o.length; l++) {\n const h = o[c++] * 3, u = o[c++] * 3, f = o[c++] * 3, d = new _(a[h], a[h + 1], a[h + 2]), p = new _(a[u], a[u + 1], a[u + 2]), g = new _(a[f], a[f + 1], a[f + 2]);\n if (t) {\n const m = t(d, p, g, i, l, h, r, s, a, o);\n if (m)\n for (const v of m)\n i.push(v);\n } else\n i.push([d, p], [p, g], [g, d]);\n }\n }), i;\n }\n /**\n * Converts number coordinates to Vector3s\n * @param points number array of x, y, z, x, y z, ... coordinates\n * @returns Vector3 array\n */\n static ToVector3Array(e) {\n if (Array.isArray(e[0])) {\n const r = [], s = e;\n for (const a of s) {\n const o = [];\n for (let l = 0; l < a.length; l += 3)\n o.push(new _(a[l], a[l + 1], a[l + 2]));\n r.push(o);\n }\n return r;\n }\n const t = e, i = [];\n for (let r = 0; r < t.length; r += 3)\n i.push(new _(t[r], t[r + 1], t[r + 2]));\n return i;\n }\n /**\n * Gets a number array from a Vector3 array.\n * You can you for example to convert your Vector3[] offsets to the required number[] for the offsets option.\n * @param points Vector3 array\n * @returns an array of x, y, z coordinates as numbers [x, y, z, x, y, z, x, y, z, ....]\n */\n static ToNumberArray(e) {\n return e.flatMap((t) => [t.x, t.y, t.z]);\n }\n /**\n * Calculates the sum of points of every line and the number of points in each line.\n * This function is useful when you are drawing multiple lines in one mesh and you want\n * to know the counts. For example for creating an offsets table.\n * @param points point array\n * @returns points count info\n */\n static GetPointsCountInfo(e) {\n const t = new Array(e.length);\n let i = 0;\n for (let r = e.length; r--; )\n t[r] = e[r].length / 3, i += t[r];\n return { total: i, counts: t };\n }\n /**\n * Gets the length of the line counting all it's segments length\n * @param data array of line points\n * @returns length of the line\n */\n static GetLineLength(e) {\n if (e.length === 0)\n return 0;\n let t;\n typeof e[0] == \"number\" ? t = _t.ToVector3Array(e) : t = e;\n const i = z.Vector3[0];\n let r = 0;\n for (let s = 0; s < t.length - 1; s++) {\n const a = t[s], o = t[s + 1];\n r += o.subtractToRef(a, i).length();\n }\n return r;\n }\n /**\n * Gets the the length from the beginning to each point of the line as array.\n * @param data array of line points\n * @returns length array of the line\n */\n static GetLineLengthArray(e) {\n const t = new Float32Array(e.length / 3);\n let i = 0;\n for (let r = 0, s = e.length / 3 - 1; r < s; r++) {\n let a = e[r * 3 + 0], o = e[r * 3 + 1], l = e[r * 3 + 2];\n a -= e[r * 3 + 3], o -= e[r * 3 + 4], l -= e[r * 3 + 5];\n const c = Math.sqrt(a * a + o * o + l * l);\n i += c, t[r + 1] = i;\n }\n return t;\n }\n /**\n * Divides a segment into smaller segments.\n * A segment is a part of the line between it's two points.\n * @param point1 first point of the line\n * @param point2 second point of the line\n * @param segmentCount number of segments we want to have in the divided line\n * @returns\n */\n static SegmentizeSegmentByCount(e, t, i) {\n const r = [], s = t.subtract(e), a = z.Vector3[0];\n a.setAll(i);\n const o = z.Vector3[1];\n s.divideToRef(a, o);\n let l = e.clone();\n r.push(l);\n for (let c = 0; c < i; c++)\n l = l.clone(), r.push(l.addInPlace(o));\n return r;\n }\n /**\n * Divides a line into segments.\n * A segment is a part of the line between it's two points.\n * @param what line points\n * @param segmentLength length of each segment of the resulting line (distance between two line points)\n * @returns line point\n */\n static SegmentizeLineBySegmentLength(e, t) {\n const i = e[0] instanceof _ ? _t.GetLineSegments(e) : typeof e[0] == \"number\" ? _t.GetLineSegments(_t.ToVector3Array(e)) : e, r = [];\n return i.forEach((s) => {\n s.length > t ? _t.SegmentizeSegmentByCount(s.point1, s.point2, Math.ceil(s.length / t)).forEach((o) => {\n r.push(o);\n }) : (r.push(s.point1), r.push(s.point2));\n }), r;\n }\n /**\n * Divides a line into segments.\n * A segment is a part of the line between it's two points.\n * @param what line points\n * @param segmentCount number of segments\n * @returns line point\n */\n static SegmentizeLineBySegmentCount(e, t) {\n const i = typeof e[0] == \"number\" ? _t.ToVector3Array(e) : e, r = _t.GetLineLength(i) / t;\n return _t.SegmentizeLineBySegmentLength(i, r);\n }\n /**\n * Gets line segments.\n * A segment is a part of the line between it's two points.\n * @param points line points\n * @returns segments information of the line segment including starting point, ending point and the distance between them\n */\n static GetLineSegments(e) {\n const t = [];\n for (let i = 0; i < e.length - 1; i++) {\n const r = e[i], s = e[i + 1], a = s.subtract(r).length();\n t.push({ point1: r, point2: s, length: a });\n }\n return t;\n }\n /**\n * Gets the minimum and the maximum length of a line segment in the line.\n * A segment is a part of the line between it's two points.\n * @param points line points\n * @returns\n */\n static GetMinMaxSegmentLength(e) {\n const i = _t.GetLineSegments(e).sort((r) => r.length);\n return {\n min: i[0].length,\n max: i[i.length - 1].length\n };\n }\n /**\n * Finds the last visible position in world space of the line according to the visibility parameter\n * @param lineSegments segments of the line\n * @param lineLength total length of the line\n * @param visbility normalized value of visibility\n * @param localSpace if true the result will be in local space (default is false)\n * @returns world space coordinate of the last visible piece of the line\n */\n static GetPositionOnLineByVisibility(e, t, i, r = !1) {\n const s = t * i;\n let a = 0, o = 0;\n const l = e.length;\n for (let h = 0; h < l; h++) {\n if (s <= a + e[h].length) {\n o = h;\n break;\n }\n a += e[h].length;\n }\n const c = (s - a) / e[o].length;\n return e[o].point2.subtractToRef(e[o].point1, z.Vector3[0]), z.Vector3[1] = z.Vector3[0].multiplyByFloats(c, c, c), r || z.Vector3[1].addInPlace(e[o].point1), z.Vector3[1].clone();\n }\n /**\n * Creates lines in a shape of circle/arc.\n * A segment is a part of the line between it's two points.\n * @param radiusX radiusX of the circle\n * @param segments number of segments in the circle\n * @param z z coordinate of the points. Defaults to 0.\n * @param radiusY radiusY of the circle - you can draw an oval if using different values\n * @param segmentAngle angle offset of the segments. Defaults to Math.PI * 2 / segments. Change this value to draw a part of the circle.\n * @returns line points\n */\n static GetCircleLinePoints(e, t, i = 0, r = e, s = Math.PI * 2 / t) {\n const a = [];\n for (let o = 0; o <= t; o++)\n a.push(new _(Math.cos(o * s) * e, Math.sin(o * s) * r, i));\n return a;\n }\n /**\n * Gets line points in a shape of a bezier curve\n * @param p0 bezier point0\n * @param p1 bezier point1\n * @param p2 bezier point2\n * @param segments number of segments in the curve\n * @returns\n */\n static GetBezierLinePoints(e, t, i, r) {\n return Os.CreateQuadraticBezier(e, t, i, r).getPoints().flatMap((s) => [s.x, s.y, s.z]);\n }\n /**\n *\n * @param position position of the arrow cap (mainly you want to create a triangle, set widthUp and widthDown to the same value and omit widthStartUp and widthStartDown)\n * @param direction direction which the arrow points to\n * @param length length (size) of the arrow cap itself\n * @param widthUp the arrow width above the line\n * @param widthDown the arrow width belove the line\n * @param widthStartUp the arrow width at the start of the arrow above the line. In most scenarios this is 0.\n * @param widthStartDown the arrow width at the start of the arrow below the line. In most scenarios this is 0.\n * @returns\n */\n static GetArrowCap(e, t, i, r, s, a = 0, o = 0) {\n return {\n points: [e.clone(), e.add(t.multiplyByFloats(i, i, i))],\n widths: [r, s, a, o]\n };\n }\n /**\n * Gets 3D positions of points from a text and font\n * @param text Text\n * @param size Size of the font\n * @param resolution Resolution of the font\n * @param fontData defines the font data (can be generated with http://gero3.github.io/facetype.js/)\n * @param z z coordinate\n * @param includeInner include the inner parts of the font in the result. Default true. If false, only the outlines will be returned.\n * @returns number[][] of 3D positions\n */\n static GetPointsFromText(e, t, i, r, s = 0, a = !0) {\n const o = [], l = Qb(e, t, i, r);\n for (const c of l) {\n for (const h of c.paths) {\n const u = [], f = h.getPoints();\n for (const d of f)\n u.push(d.x, d.y, s);\n o.push(u);\n }\n if (a)\n for (const h of c.holes) {\n const u = [], f = h.getPoints();\n for (const d of f)\n u.push(d.x, d.y, s);\n o.push(u);\n }\n }\n return o;\n }\n /**\n * Converts an array of Color3 to Uint8Array\n * @param colors Arrray of Color3\n * @returns Uin8Array of colors [r, g, b, a, r, g, b, a, ...]\n */\n static Color3toRGBAUint8(e) {\n const t = new Uint8Array(e.length * 4);\n for (let i = 0, r = 0; i < e.length; i++)\n t[r++] = e[i].r * 255, t[r++] = e[i].g * 255, t[r++] = e[i].b * 255, t[r++] = 255;\n return t;\n }\n /**\n * Creates a RawTexture from an RGBA color array and sets it on the plugin material instance.\n * @param name name of the texture\n * @param colors Uint8Array of colors\n * @param colorsSampling sampling mode of the created texture\n * @param scene Scene\n * @returns the colors texture\n */\n static CreateColorsTexture(e, t, i, r) {\n const s = _t.Color3toRGBAUint8(t), a = new rr(s, t.length, 1, se.TEXTUREFORMAT_RGBA, r, !1, !0, i);\n return a.name = e, a;\n }\n /**\n * A minimum size texture for the colors sampler2D when there is no colors texture defined yet.\n * For fast switching using the useColors property without the need to use defines.\n * @param scene Scene\n * @returns empty colors texture\n */\n static PrepareEmptyColorsTexture(e) {\n if (!wi.EmptyColorsTexture) {\n const t = new Uint8Array(4);\n wi.EmptyColorsTexture = new rr(t, 1, 1, se.TEXTUREFORMAT_RGBA, e, !1, !1, rr.NEAREST_NEAREST), wi.EmptyColorsTexture.name = \"grlEmptyColorsTexture\";\n }\n return wi.EmptyColorsTexture;\n }\n /**\n * Diposes the shared empty colors texture\n */\n static DisposeEmptyColorsTexture() {\n var e;\n (e = wi.EmptyColorsTexture) == null || e.dispose(), wi.EmptyColorsTexture = null;\n }\n /**\n * Converts boolean to number.\n * @param bool the bool value\n * @returns 1 if true, 0 if false.\n */\n static BooleanToNumber(e) {\n return e ? 1 : 0;\n }\n}\nvar Eg;\n(function(n) {\n n[n.MATERIAL_TYPE_STANDARD = 0] = \"MATERIAL_TYPE_STANDARD\", n[n.MATERIAL_TYPE_PBR = 1] = \"MATERIAL_TYPE_PBR\", n[n.MATERIAL_TYPE_SIMPLE = 2] = \"MATERIAL_TYPE_SIMPLE\";\n})(Eg || (Eg = {}));\nvar Tr;\n(function(n) {\n n[n.COLOR_MODE_SET = 0] = \"COLOR_MODE_SET\", n[n.COLOR_MODE_ADD = 1] = \"COLOR_MODE_ADD\", n[n.COLOR_MODE_MULTIPLY = 2] = \"COLOR_MODE_MULTIPLY\";\n})(Tr || (Tr = {}));\nvar ws;\n(function(n) {\n n[n.COLOR_DISTRIBUTION_TYPE_SEGMENT = 0] = \"COLOR_DISTRIBUTION_TYPE_SEGMENT\", n[n.COLOR_DISTRIBUTION_TYPE_LINE = 1] = \"COLOR_DISTRIBUTION_TYPE_LINE\";\n})(ws || (ws = {}));\nclass NP extends es {\n constructor() {\n super(...arguments), this.GREASED_LINE_HAS_COLOR = !1, this.GREASED_LINE_SIZE_ATTENUATION = !1, this.GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE = !1, this.GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM = !1, this.GREASED_LINE_CAMERA_FACING = !0;\n }\n}\nclass Nn extends Ur {\n /**\n * Creates a new instance of the GreasedLinePluginMaterial\n * @param material base material for the plugin\n * @param scene the scene\n * @param options plugin options\n */\n constructor(e, t, i) {\n i = i || {\n color: wi.DEFAULT_COLOR\n };\n const r = new NP();\n r.GREASED_LINE_HAS_COLOR = !!i.color && !i.useColors, r.GREASED_LINE_SIZE_ATTENUATION = i.sizeAttenuation ?? !1, r.GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE = i.colorDistributionType === ws.COLOR_DISTRIBUTION_TYPE_LINE, r.GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM = (t ?? e.getScene()).useRightHandedSystem, r.GREASED_LINE_CAMERA_FACING = i.cameraFacing ?? !0, super(e, Nn.GREASED_LINE_MATERIAL_NAME, 200, r), this.colorsTexture = null, this._scene = t ?? e.getScene(), this._engine = this._scene.getEngine(), this._cameraFacing = i.cameraFacing ?? !0, this.visibility = i.visibility ?? 1, this.useDash = i.useDash ?? !1, this.dashRatio = i.dashRatio ?? 0.5, this.dashOffset = i.dashOffset ?? 0, this.width = i.width ? i.width : i.sizeAttenuation ? wi.DEFAULT_WIDTH_ATTENUATED : wi.DEFAULT_WIDTH, this._sizeAttenuation = i.sizeAttenuation ?? !1, this.colorMode = i.colorMode ?? Tr.COLOR_MODE_SET, this._color = i.color ?? null, this.useColors = i.useColors ?? !1, this._colorsDistributionType = i.colorDistributionType ?? ws.COLOR_DISTRIBUTION_TYPE_SEGMENT, this.colorsSampling = i.colorsSampling ?? rr.NEAREST_NEAREST, this._colors = i.colors ?? null, this.dashCount = i.dashCount ?? 1, this.resolution = i.resolution ?? new me(this._engine.getRenderWidth(), this._engine.getRenderHeight()), i.colorsTexture ? this.colorsTexture = i.colorsTexture : this._colors ? this.colorsTexture = _t.CreateColorsTexture(`${e.name}-colors-texture`, this._colors, this.colorsSampling, this._scene) : (this._color = this._color ?? wi.DEFAULT_COLOR, _t.PrepareEmptyColorsTexture(this._scene)), this._engine.onDisposeObservable.add(() => {\n _t.DisposeEmptyColorsTexture();\n }), this._enable(!0);\n }\n /**\n * Get the shader attributes\n * @param attributes array which will be filled with the attributes\n */\n getAttributes(e) {\n e.push(\"grl_offsets\"), e.push(\"grl_widths\"), e.push(\"grl_colorPointers\"), e.push(\"grl_counters\"), this._cameraFacing ? (e.push(\"grl_previousAndSide\"), e.push(\"grl_nextAndCounters\")) : e.push(\"grl_slopes\");\n }\n /**\n * Get the shader samplers\n * @param samplers\n */\n getSamplers(e) {\n e.push(\"grl_colors\");\n }\n /**\n * Get the shader textures\n * @param activeTextures array which will be filled with the textures\n */\n getActiveTextures(e) {\n this.colorsTexture && e.push(this.colorsTexture);\n }\n /**\n * Get the shader uniforms\n * @returns uniforms\n */\n getUniforms() {\n const e = [\n { name: \"grl_singleColor\", size: 3, type: \"vec3\" },\n { name: \"grl_dashOptions\", size: 4, type: \"vec4\" },\n { name: \"grl_colorMode_visibility_colorsWidth_useColors\", size: 4, type: \"vec4\" }\n ];\n return this._cameraFacing && e.push({ name: \"grl_projection\", size: 16, type: \"mat4\" }, { name: \"grl_aspect_resolution_lineWidth\", size: 4, type: \"vec4\" }), {\n ubo: e,\n vertex: this._cameraFacing ? `\n uniform vec4 grl_aspect_resolution_lineWidth;\n uniform mat4 grl_projection;\n ` : \"\",\n fragment: `\n uniform vec4 grl_dashOptions;\n uniform vec4 grl_colorMode_visibility_colorsWidth_useColors;\n uniform vec3 grl_singleColor;\n `\n };\n }\n // only getter, it doesn't make sense to use this plugin on a mesh other than GreasedLineMesh\n // and it doesn't make sense to disable it on the mesh\n get isEnabled() {\n return !0;\n }\n /**\n * Bind the uniform buffer\n * @param uniformBuffer\n */\n bindForSubMesh(e) {\n if (this._cameraFacing) {\n const r = this._scene.activeCamera;\n if (r) {\n const a = r.getProjectionMatrix();\n e.updateMatrix(\"grl_projection\", a);\n } else\n throw Error(\"GreasedLinePluginMaterial requires an active camera.\");\n const s = z.Vector4[0];\n s.x = this._aspect, s.y = this._resolution.x, s.z = this._resolution.y, s.w = this.width, e.updateVector4(\"grl_aspect_resolution_lineWidth\", s);\n }\n const t = z.Vector4[0];\n t.x = _t.BooleanToNumber(this.useDash), t.y = this._dashArray, t.z = this.dashOffset, t.w = this.dashRatio, e.updateVector4(\"grl_dashOptions\", t);\n const i = z.Vector4[1];\n i.x = this.colorMode, i.y = this.visibility, i.z = this.colorsTexture ? this.colorsTexture.getSize().width : 0, i.w = _t.BooleanToNumber(this.useColors), e.updateVector4(\"grl_colorMode_visibility_colorsWidth_useColors\", i), this._color && e.updateColor3(\"grl_singleColor\", this._color), e.setTexture(\"grl_colors\", this.colorsTexture ?? wi.EmptyColorsTexture);\n }\n /**\n * Prepare the defines\n * @param defines\n * @param _scene\n * @param _mesh\n */\n prepareDefines(e, t, i) {\n e.GREASED_LINE_HAS_COLOR = !!this.color && !this.useColors, e.GREASED_LINE_SIZE_ATTENUATION = this._sizeAttenuation, e.GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE = this._colorsDistributionType === ws.COLOR_DISTRIBUTION_TYPE_LINE, e.GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM = t.useRightHandedSystem, e.GREASED_LINE_CAMERA_FACING = this._cameraFacing;\n }\n /**\n * Get the class name\n * @returns class name\n */\n getClassName() {\n return Nn.GREASED_LINE_MATERIAL_NAME;\n }\n /**\n * Get shader code\n * @param shaderType vertex/fragment\n * @returns shader code\n */\n getCustomCode(e) {\n if (e === \"vertex\") {\n const t = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CUSTOM_VERTEX_DEFINITIONS: `\n attribute float grl_widths;\n attribute vec3 grl_offsets;\n attribute float grl_colorPointers;\n\n varying float grlCounters;\n varying float grlColorPointer;\n\n #ifdef GREASED_LINE_CAMERA_FACING\n attribute vec4 grl_previousAndSide;\n attribute vec4 grl_nextAndCounters;\n\n vec2 grlFix( vec4 i, float aspect ) {\n vec2 res = i.xy / i.w;\n res.x *= aspect;\n return res;\n }\n #else\n attribute vec3 grl_slopes;\n attribute float grl_counters;\n #endif\n `,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CUSTOM_VERTEX_UPDATE_POSITION: `\n #ifdef GREASED_LINE_CAMERA_FACING\n vec3 grlPositionOffset = grl_offsets;\n positionUpdated += grlPositionOffset;\n #else\n positionUpdated = (positionUpdated + grl_offsets) + (grl_slopes * grl_widths);\n #endif\n `,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CUSTOM_VERTEX_MAIN_END: `\n grlColorPointer = grl_colorPointers;\n\n #ifdef GREASED_LINE_CAMERA_FACING\n\n float grlAspect = grl_aspect_resolution_lineWidth.x;\n float grlBaseWidth = grl_aspect_resolution_lineWidth.w;\n\n\n vec3 grlPrevious = grl_previousAndSide.xyz;\n float grlSide = grl_previousAndSide.w;\n\n vec3 grlNext = grl_nextAndCounters.xyz;\n grlCounters = grl_nextAndCounters.w;\n\n mat4 grlMatrix = viewProjection * finalWorld;\n vec4 grlFinalPosition = grlMatrix * vec4( positionUpdated , 1.0 );\n vec4 grlPrevPos = grlMatrix * vec4( grlPrevious + grlPositionOffset, 1.0 );\n vec4 grlNextPos = grlMatrix * vec4( grlNext + grlPositionOffset, 1.0 );\n\n vec2 grlCurrentP = grlFix( grlFinalPosition, grlAspect );\n vec2 grlPrevP = grlFix( grlPrevPos, grlAspect );\n vec2 grlNextP = grlFix( grlNextPos, grlAspect );\n\n float grlWidth = grlBaseWidth * grl_widths;\n\n vec2 grlDir;\n if( grlNextP == grlCurrentP ) grlDir = normalize( grlCurrentP - grlPrevP );\n else if( grlPrevP == grlCurrentP ) grlDir = normalize( grlNextP - grlCurrentP );\n else {\n vec2 grlDir1 = normalize( grlCurrentP - grlPrevP );\n vec2 grlDir2 = normalize( grlNextP - grlCurrentP );\n grlDir = normalize( grlDir1 + grlDir2 );\n }\n vec4 grlNormal = vec4( -grlDir.y, grlDir.x, 0., 1. );\n #ifdef GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM\n grlNormal.xy *= -.5 * grlWidth;\n #else\n grlNormal.xy *= .5 * grlWidth;\n #endif\n\n grlNormal *= grl_projection;\n\n #ifdef GREASED_LINE_SIZE_ATTENUATION\n grlNormal.xy *= grlFinalPosition.w;\n grlNormal.xy /= ( vec4( grl_aspect_resolution_lineWidth.yz, 0., 1. ) * grl_projection ).xy;\n #endif\n\n grlFinalPosition.xy += grlNormal.xy * grlSide;\n gl_Position = grlFinalPosition;\n\n vPositionW = vec3(grlFinalPosition);\n #else\n grlCounters = grl_counters;\n #endif\n `\n };\n return this._cameraFacing && (t[\"!gl_Position\\\\=viewProjection\\\\*worldPos;\"] = \"//\"), t;\n }\n return e === \"fragment\" ? {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CUSTOM_FRAGMENT_DEFINITIONS: `\n varying float grlCounters;\n varying float grlColorPointer;\n uniform sampler2D grl_colors;\n `,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CUSTOM_FRAGMENT_MAIN_END: `\n float grlColorMode = grl_colorMode_visibility_colorsWidth_useColors.x;\n float grlVisibility = grl_colorMode_visibility_colorsWidth_useColors.y;\n float grlColorsWidth = grl_colorMode_visibility_colorsWidth_useColors.z;\n float grlUseColors = grl_colorMode_visibility_colorsWidth_useColors.w;\n\n float grlUseDash = grl_dashOptions.x;\n float grlDashArray = grl_dashOptions.y;\n float grlDashOffset = grl_dashOptions.z;\n float grlDashRatio = grl_dashOptions.w;\n\n gl_FragColor.a *= step(grlCounters, grlVisibility);\n if( gl_FragColor.a == 0. ) discard;\n\n if(grlUseDash == 1.){\n gl_FragColor.a *= ceil(mod(grlCounters + grlDashOffset, grlDashArray) - (grlDashArray * grlDashRatio));\n if (gl_FragColor.a == 0.) discard;\n }\n\n #ifdef GREASED_LINE_HAS_COLOR\n if (grlColorMode == ${Tr.COLOR_MODE_SET}.) {\n gl_FragColor.rgb = grl_singleColor;\n } else if (grlColorMode == ${Tr.COLOR_MODE_ADD}.) {\n gl_FragColor.rgb += grl_singleColor;\n } else if (grlColorMode == ${Tr.COLOR_MODE_MULTIPLY}.) {\n gl_FragColor.rgb *= grl_singleColor;\n }\n #else\n if (grlUseColors == 1.) {\n #ifdef GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE\n vec4 grlColor = texture2D(grl_colors, vec2(grlCounters, 0.), 0.);\n #else\n vec4 grlColor = texture2D(grl_colors, vec2(grlColorPointer/grlColorsWidth, 0.), 0.);\n #endif\n if (grlColorMode == ${Tr.COLOR_MODE_SET}.) {\n gl_FragColor = grlColor;\n } else if (grlColorMode == ${Tr.COLOR_MODE_ADD}.) {\n gl_FragColor += grlColor;\n } else if (grlColorMode == ${Tr.COLOR_MODE_MULTIPLY}.) {\n gl_FragColor *= grlColor;\n }\n }\n #endif\n\n `\n } : null;\n }\n /**\n * Disposes the plugin material.\n */\n dispose() {\n var e;\n (e = this.colorsTexture) == null || e.dispose(), super.dispose();\n }\n /**\n * Returns the colors used to colorize the line\n */\n get colors() {\n return this._colors;\n }\n /**\n * Sets the colors used to colorize the line\n */\n set colors(e) {\n this.setColors(e);\n }\n /**\n * Creates or updates the colors texture\n * @param colors color table RGBA\n * @param lazy if lazy, the colors are not updated\n * @param forceNewTexture force creation of a new texture\n */\n setColors(e, t = !1, i = !1) {\n var s, a, o;\n const r = ((s = this._colors) == null ? void 0 : s.length) ?? 0;\n if (this._colors = e, e === null || e.length === 0) {\n (a = this.colorsTexture) == null || a.dispose();\n return;\n }\n if (!(t && !i))\n if (this.colorsTexture && r === e.length && !i) {\n const l = _t.Color3toRGBAUint8(e);\n this.colorsTexture.update(l);\n } else\n (o = this.colorsTexture) == null || o.dispose(), this.colorsTexture = _t.CreateColorsTexture(`${this._material.name}-colors-texture`, e, this.colorsSampling, this._scene);\n }\n /**\n * Updates the material. Use when material created in lazy mode.\n */\n updateLazy() {\n this._colors && this.setColors(this._colors, !1, !0);\n }\n /**\n * Gets the number of dashes in the line\n */\n get dashCount() {\n return this._dashCount;\n }\n /**\n * Sets the number of dashes in the line\n * @param value dash\n */\n set dashCount(e) {\n this._dashCount = e, this._dashArray = 1 / e;\n }\n /**\n * If set to true the line will be rendered always with the same width regardless how far it is located from the camera.\n * Not supported for non camera facing lines.\n */\n get sizeAttenuation() {\n return this._sizeAttenuation;\n }\n /**\n * Turn on/off size attenuation of the width option and widths array.\n * Not supported for non camera facing lines.\n * @param value If set to true the line will be rendered always with the same width regardless how far it is located from the camera.\n */\n set sizeAttenuation(e) {\n this._sizeAttenuation = e, this.markAllDefinesAsDirty();\n }\n /**\n * Gets the color of the line\n */\n get color() {\n return this._color;\n }\n /**\n * Sets the color of the line\n * @param value Color3 or null to clear the color. You need to clear the color if you use colors and useColors = true\n */\n set color(e) {\n this.setColor(e);\n }\n /**\n * Sets the color of the line. If set the whole line will be mixed with this color according to the colorMode option.\n * @param value color\n * @param doNotMarkDirty if true, the material will not be marked as dirty\n */\n setColor(e, t = !1) {\n this._color === null && e !== null || this._color !== null && e === null ? (this._color = e, !t && this.markAllDefinesAsDirty()) : this._color = e;\n }\n /**\n * Gets the color distributiopn type\n */\n get colorsDistributionType() {\n return this._colorsDistributionType;\n }\n /**\n * Sets the color distribution type\n * @see GreasedLineMeshColorDistributionType\n * @param value color distribution type\n */\n set colorsDistributionType(e) {\n this._colorsDistributionType = e, this.markAllDefinesAsDirty();\n }\n /**\n * Gets the resolution\n */\n get resolution() {\n return this._resolution;\n }\n /**\n * Sets the resolution\n * @param value resolution of the screen for GreasedLine\n */\n set resolution(e) {\n this._aspect = e.x / e.y, this._resolution = e;\n }\n /**\n * Serializes this plugin material\n * @returns serializationObjec\n */\n serialize() {\n const e = super.serialize(), t = {\n colorDistributionType: this._colorsDistributionType,\n colorsSampling: this.colorsSampling,\n colorMode: this.colorMode,\n dashCount: this._dashCount,\n dashOffset: this.dashOffset,\n dashRatio: this.dashRatio,\n resolution: this._resolution,\n sizeAttenuation: this._sizeAttenuation,\n useColors: this.useColors,\n useDash: this.useDash,\n visibility: this.visibility,\n width: this.width\n };\n return this._colors && (t.colors = this._colors), this._color && (t.color = this._color), e.greasedLineMaterialOptions = t, e;\n }\n /**\n * Parses a serialized objects\n * @param source serialized object\n * @param scene scene\n * @param rootUrl root url for textures\n */\n parse(e, t, i) {\n var s;\n super.parse(e, t, i);\n const r = e.greasedLineMaterialOptions;\n (s = this.colorsTexture) == null || s.dispose(), r.color && this.setColor(r.color, !0), r.colorDistributionType && (this.colorsDistributionType = r.colorDistributionType), r.colors && (this.colors = r.colors), r.colorsSampling && (this.colorsSampling = r.colorsSampling), r.colorMode && (this.colorMode = r.colorMode), r.useColors && (this.useColors = r.useColors), r.visibility && (this.visibility = r.visibility), r.useDash && (this.useDash = r.useDash), r.dashCount && (this.dashCount = r.dashCount), r.dashRatio && (this.dashRatio = r.dashRatio), r.dashOffset && (this.dashOffset = r.dashOffset), r.width && (this.width = r.width), r.sizeAttenuation && (this.sizeAttenuation = r.sizeAttenuation), r.resolution && (this.resolution = r.resolution), this.colors ? this.colorsTexture = _t.CreateColorsTexture(`${this._material.name}-colors-texture`, this.colors, this.colorsSampling, t) : _t.PrepareEmptyColorsTexture(t), this.markAllDefinesAsDirty();\n }\n /**\n * Makes a duplicate of the current configuration into another one.\n * @param plugin define the config where to copy the info\n */\n copyTo(e) {\n var i;\n const t = e;\n (i = t.colorsTexture) == null || i.dispose(), this._colors && (t.colorsTexture = _t.CreateColorsTexture(`${t._material.name}-colors-texture`, this._colors, t.colorsSampling, this._scene)), t.setColor(this.color, !0), t.colorsDistributionType = this.colorsDistributionType, t.colorsSampling = this.colorsSampling, t.colorMode = this.colorMode, t.useColors = this.useColors, t.visibility = this.visibility, t.useDash = this.useDash, t.dashCount = this.dashCount, t.dashRatio = this.dashRatio, t.dashOffset = this.dashOffset, t.width = this.width, t.sizeAttenuation = this.sizeAttenuation, t.resolution = this.resolution, t.markAllDefinesAsDirty();\n }\n}\nNn.GREASED_LINE_MATERIAL_NAME = \"GreasedLinePluginMaterial\";\nRe(`BABYLON.${Nn.GREASED_LINE_MATERIAL_NAME}`, Nn);\nconst FP = \"greasedLinePixelShader\", LP = `precision highp float;uniform sampler2D grlColors;uniform float grlUseColors;uniform float grlUseDash;uniform float grlDashArray;uniform float grlDashOffset;uniform float grlDashRatio;uniform float grlVisibility;uniform float grlColorsWidth;uniform vec2 grl_colorModeAndColorDistributionType;uniform vec3 grlColor;varying float grlCounters;varying float grlColorPointer;void main() {float grlColorMode=grl_colorModeAndColorDistributionType.x;float grlColorDistributionType=grl_colorModeAndColorDistributionType.y;gl_FragColor=vec4(grlColor,1.);gl_FragColor.a=step(grlCounters,grlVisibility);if (gl_FragColor.a==0.) discard;if( grlUseDash==1. ){gl_FragColor.a=ceil(mod(grlCounters+grlDashOffset,grlDashArray)-(grlDashArray*grlDashRatio));if (gl_FragColor.a==0.) discard;}\nif (grlUseColors==1.) {vec4 textureColor;if (grlColorDistributionType==COLOR_DISTRIBUTION_TYPE_LINE) { \ntextureColor=texture2D(grlColors,vec2(grlCounters,0.),0.);} else {textureColor=texture2D(grlColors,vec2(grlColorPointer/grlColorsWidth,0.),0.);}\nif (grlColorMode==COLOR_MODE_SET) {gl_FragColor=textureColor;} else if (grlColorMode==COLOR_MODE_ADD) {gl_FragColor+=textureColor;} else if (grlColorMode==COLOR_MODE_MULTIPLY) {gl_FragColor*=textureColor;}}}\n`;\nY.ShadersStore[FP] = LP;\nconst wP = \"greasedLineVertexShader\", UP = `precision highp float;\n#include\nattribute float grl_widths;attribute vec3 grl_offsets;attribute float grl_colorPointers;attribute vec3 position;uniform mat4 viewProjection;uniform mat4 projection;varying float grlCounters;varying float grlColorPointer;\n#ifdef GREASED_LINE_CAMERA_FACING\nattribute vec4 grl_nextAndCounters;attribute vec4 grl_previousAndSide;uniform vec2 grlResolution;uniform float grlAspect;uniform float grlWidth;uniform float grlSizeAttenuation;vec2 grlFix( vec4 i,float aspect ) {vec2 res=i.xy/i.w;res.x*=aspect;return res;}\n#else\nattribute vec3 grl_slopes;attribute float grl_counters;\n#endif\nvoid main() {\n#include\ngrlColorPointer=grl_colorPointers;\n#ifdef GREASED_LINE_CAMERA_FACING\nfloat grlBaseWidth=grlWidth;vec3 grlPrevious=grl_previousAndSide.xyz;float grlSide=grl_previousAndSide.w;vec3 grlNext=grl_nextAndCounters.xyz;grlCounters=grl_nextAndCounters.w;mat4 grlMatrix=viewProjection*finalWorld ;vec3 grlPositionOffset=grl_offsets;vec4 grlFinalPosition=grlMatrix*vec4( position+grlPositionOffset ,1.0 );vec4 grlPrevPos=grlMatrix*vec4( grlPrevious+grlPositionOffset,1.0 );vec4 grlNextPos=grlMatrix*vec4( grlNext+grlPositionOffset,1.0 );vec2 grlCurrentP=grlFix( grlFinalPosition,grlAspect );vec2 grlPrevP=grlFix( grlPrevPos,grlAspect );vec2 grlNextP=grlFix( grlNextPos,grlAspect );float grlWidth=grlBaseWidth*grl_widths;vec2 grlDir;if( grlNextP==grlCurrentP ) grlDir=normalize( grlCurrentP-grlPrevP );else if( grlPrevP==grlCurrentP ) grlDir=normalize( grlNextP-grlCurrentP );else {vec2 grlDir1=normalize( grlCurrentP-grlPrevP );vec2 grlDir2=normalize( grlNextP-grlCurrentP );grlDir=normalize( grlDir1+grlDir2 );}\nvec4 grlNormal=vec4( -grlDir.y,grlDir.x,0.,1. );\n#ifdef GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM\ngrlNormal.xy*=-.5*grlWidth;\n#else\ngrlNormal.xy*=.5*grlWidth;\n#endif\ngrlNormal*=projection;if (grlSizeAttenuation==1.) {grlNormal.xy*=grlFinalPosition.w;grlNormal.xy/=( vec4( grlResolution,0.,1. )*projection ).xy;}\ngrlFinalPosition.xy+=grlNormal.xy*grlSide;gl_Position=grlFinalPosition;\n#else\ngrlCounters=grl_counters;vec4 grlFinalPosition=worldViewProjection*vec4( (position+grl_offsets)+grl_slopes*grl_widths ,1.0 ) ;gl_Position=grlFinalPosition;\n#endif\n}\n`;\nY.ShadersStore[wP] = UP;\nclass VP extends ks {\n /**\n * GreasedLineSimple material constructor\n * @param name material name\n * @param scene the scene\n * @param options material options\n */\n constructor(e, t, i) {\n const r = [\n `COLOR_DISTRIBUTION_TYPE_LINE ${ws.COLOR_DISTRIBUTION_TYPE_LINE}.`,\n `COLOR_DISTRIBUTION_TYPE_SEGMENT ${ws.COLOR_DISTRIBUTION_TYPE_SEGMENT}.`,\n `COLOR_MODE_SET ${Tr.COLOR_MODE_SET}.`,\n `COLOR_MODE_ADD ${Tr.COLOR_MODE_ADD}.`,\n `COLOR_MODE_MULTIPLY ${Tr.COLOR_MODE_MULTIPLY}.`\n ], s = [\"position\", \"grl_widths\", \"grl_offsets\", \"grl_colorPointers\"];\n t.useRightHandedSystem && r.push(\"GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM\"), i.cameraFacing ? (r.push(\"GREASED_LINE_CAMERA_FACING\"), s.push(\"grl_previousAndSide\", \"grl_nextAndCounters\")) : (s.push(\"grl_slopes\"), s.push(\"grl_counters\")), super(e, t, {\n vertex: \"greasedLine\",\n fragment: \"greasedLine\"\n }, {\n attributes: s,\n uniforms: [\n \"world\",\n \"viewProjection\",\n \"view\",\n \"projection\",\n \"grlColorsWidth\",\n \"grlUseColors\",\n \"grlWidth\",\n \"grlColor\",\n \"grl_colorModeAndColorDistributionType\",\n \"grlResolution\",\n \"grlAspect\",\n \"grlAizeAttenuation\",\n \"grlDashArray\",\n \"grlDashOffset\",\n \"grlDashRatio\",\n \"grlUseDash\",\n \"grlVisibility\"\n ],\n samplers: [\"grlColors\"],\n defines: r\n }), this._color = Ne.White(), this._colorsDistributionType = ws.COLOR_DISTRIBUTION_TYPE_SEGMENT, this._colorsTexture = null, i = i || {\n color: wi.DEFAULT_COLOR\n };\n const a = t.getEngine();\n this.visibility = i.visibility ?? 1, this.useDash = i.useDash ?? !1, this.dashRatio = i.dashRatio ?? 0.5, this.dashOffset = i.dashOffset ?? 0, this.dashCount = i.dashCount ?? 1, this.width = i.width ? i.width : i.sizeAttenuation && i.cameraFacing ? wi.DEFAULT_WIDTH_ATTENUATED : wi.DEFAULT_WIDTH, this.sizeAttenuation = i.sizeAttenuation ?? !1, this.color = i.color ?? Ne.White(), this.useColors = i.useColors ?? !1, this.colorsDistributionType = i.colorDistributionType ?? ws.COLOR_DISTRIBUTION_TYPE_SEGMENT, this.colorsSampling = i.colorsSampling ?? rr.NEAREST_NEAREST, this.colorMode = i.colorMode ?? Tr.COLOR_MODE_SET, this._colors = i.colors ?? null, this._cameraFacing = i.cameraFacing ?? !0, this.resolution = i.resolution ?? new me(a.getRenderWidth(), a.getRenderHeight()), i.colorsTexture ? this.colorsTexture = i.colorsTexture : this.colorsTexture = _t.PrepareEmptyColorsTexture(t), this._colors && this.setColors(this._colors), a.onDisposeObservable.add(() => {\n _t.DisposeEmptyColorsTexture();\n });\n }\n /**\n * Disposes the plugin material.\n */\n dispose() {\n var e;\n (e = this._colorsTexture) == null || e.dispose(), super.dispose();\n }\n _setColorModeAndColorDistributionType() {\n this.setVector2(\"grl_colorModeAndColorDistributionType\", new me(this._colorMode, this._colorsDistributionType));\n }\n /**\n * Updates the material. Use when material created in lazy mode.\n */\n updateLazy() {\n this._colors && this.setColors(this._colors, !1, !0);\n }\n /**\n * Returns the colors used to colorize the line\n */\n get colors() {\n return this._colors;\n }\n /**\n * Sets the colors used to colorize the line\n */\n set colors(e) {\n this.setColors(e);\n }\n /**\n * Creates or updates the colors texture\n * @param colors color table RGBA\n * @param lazy if lazy, the colors are not updated\n * @param forceNewTexture force creation of a new texture\n */\n setColors(e, t = !1, i = !1) {\n var s, a, o;\n const r = ((s = this._colors) == null ? void 0 : s.length) ?? 0;\n if (this._colors = e, e === null || e.length === 0) {\n (a = this._colorsTexture) == null || a.dispose();\n return;\n }\n if (!(t && !i))\n if (this._colorsTexture && r === e.length && !i) {\n const l = _t.Color3toRGBAUint8(e);\n this._colorsTexture.update(l);\n } else\n (o = this._colorsTexture) == null || o.dispose(), this.colorsTexture = _t.CreateColorsTexture(`${this.name}-colors-texture`, e, this.colorsSampling, this.getScene());\n }\n /**\n * Gets the colors texture\n */\n get colorsTexture() {\n return this._colorsTexture ?? null;\n }\n /**\n * Sets the colorsTexture\n */\n set colorsTexture(e) {\n this._colorsTexture = e, this.setFloat(\"grlColorsWidth\", this._colorsTexture.getSize().width), this.setTexture(\"grlColors\", this._colorsTexture);\n }\n /**\n * Line base width. At each point the line width is calculated by widths[pointIndex] * width\n */\n get width() {\n return this._width;\n }\n /**\n * Line base width. At each point the line width is calculated by widths[pointIndex] * width\n */\n set width(e) {\n this._width = e, this.setFloat(\"grlWidth\", e);\n }\n /**\n * Whether to use the colors option to colorize the line\n */\n get useColors() {\n return this._useColors;\n }\n set useColors(e) {\n this._useColors = e, this.setFloat(\"grlUseColors\", _t.BooleanToNumber(e));\n }\n /**\n * The type of sampling of the colors texture. The values are the same when using with textures.\n */\n get colorsSampling() {\n return this._colorsSampling;\n }\n /**\n * The type of sampling of the colors texture. The values are the same when using with textures.\n */\n set colorsSampling(e) {\n this._colorsSampling = e;\n }\n /**\n * Normalized value of how much of the line will be visible\n * 0 - 0% of the line will be visible\n * 1 - 100% of the line will be visible\n */\n get visibility() {\n return this._visibility;\n }\n set visibility(e) {\n this._visibility = e, this.setFloat(\"grlVisibility\", e);\n }\n /**\n * Turns on/off dash mode\n */\n get useDash() {\n return this._useDash;\n }\n /**\n * Turns on/off dash mode\n */\n set useDash(e) {\n this._useDash = e, this.setFloat(\"grlUseDash\", _t.BooleanToNumber(e));\n }\n /**\n * Gets the dash offset\n */\n get dashOffset() {\n return this._dashOffset;\n }\n /**\n * Sets the dash offset\n */\n set dashOffset(e) {\n this._dashOffset = e, this.setFloat(\"grlDashOffset\", e);\n }\n /**\n * Length of the dash. 0 to 1. 0.5 means half empty, half drawn.\n */\n get dashRatio() {\n return this._dashRatio;\n }\n /**\n * Length of the dash. 0 to 1. 0.5 means half empty, half drawn.\n */\n set dashRatio(e) {\n this._dashRatio = e, this.setFloat(\"grlDashRatio\", e);\n }\n /**\n * Gets the number of dashes in the line\n */\n get dashCount() {\n return this._dashCount;\n }\n /**\n * Sets the number of dashes in the line\n * @param value dash\n */\n set dashCount(e) {\n this._dashCount = e, this._dashArray = 1 / e, this.setFloat(\"grlDashArray\", this._dashArray);\n }\n /**\n * False means 1 unit in width = 1 unit on scene, true means 1 unit in width is reduced on the screen to make better looking lines\n */\n get sizeAttenuation() {\n return this._sizeAttenuation;\n }\n /**\n * Turn on/off attenuation of the width option and widths array.\n * @param value false means 1 unit in width = 1 unit on scene, true means 1 unit in width is reduced on the screen to make better looking lines\n */\n set sizeAttenuation(e) {\n this._sizeAttenuation = e, this.setFloat(\"grlSizeAttenuation\", _t.BooleanToNumber(e));\n }\n /**\n * Gets the color of the line\n */\n get color() {\n return this.color;\n }\n /**\n * Sets the color of the line\n * @param value Color3\n */\n set color(e) {\n this.setColor(e);\n }\n /**\n * Sets the color of the line. If set the whole line will be mixed with this color according to the colorMode option.\n * The simple material always needs a color to be set. If you set it to null it will set the color to the default color (GreasedLineSimpleMaterial.DEFAULT_COLOR).\n * @param value color\n */\n setColor(e) {\n e = e ?? wi.DEFAULT_COLOR, this._color = e, this.setColor3(\"grlColor\", e);\n }\n /**\n * Gets the color distributiopn type\n */\n get colorsDistributionType() {\n return this._colorsDistributionType;\n }\n /**\n * Sets the color distribution type\n * @see GreasedLineMeshColorDistributionType\n * @param value color distribution type\n */\n set colorsDistributionType(e) {\n this._colorsDistributionType = e, this._setColorModeAndColorDistributionType();\n }\n /**\n * Gets the mixing mode of the color and colors paramaters. Default value is GreasedLineMeshColorMode.SET.\n * MATERIAL_TYPE_SIMPLE mixes the color and colors of the greased line material.\n * @see GreasedLineMeshColorMode\n */\n get colorMode() {\n return this._colorMode;\n }\n /**\n * Sets the mixing mode of the color and colors paramaters. Default value is GreasedLineMeshColorMode.SET.\n * MATERIAL_TYPE_SIMPLE mixes the color and colors of the greased line material.\n * @see GreasedLineMeshColorMode\n */\n set colorMode(e) {\n this._colorMode = e, this._setColorModeAndColorDistributionType();\n }\n /**\n * Gets the resolution\n */\n get resolution() {\n return this._resolution;\n }\n /**\n * Sets the resolution\n * @param value resolution of the screen for GreasedLine\n */\n set resolution(e) {\n this._resolution = e, this.setVector2(\"grlResolution\", e), this.setFloat(\"grlAspect\", e.x / e.y);\n }\n /**\n * Serializes this plugin material\n * @returns serializationObjec\n */\n serialize() {\n const e = super.serialize(), t = {\n colorDistributionType: this._colorsDistributionType,\n colorsSampling: this._colorsSampling,\n colorMode: this._colorMode,\n color: this._color,\n dashCount: this._dashCount,\n dashOffset: this._dashOffset,\n dashRatio: this._dashRatio,\n resolution: this._resolution,\n sizeAttenuation: this._sizeAttenuation,\n useColors: this._useColors,\n useDash: this._useDash,\n visibility: this._visibility,\n width: this._width,\n cameraFacing: this._cameraFacing\n };\n return this._colors && (t.colors = this._colors), e.greasedLineMaterialOptions = t, e;\n }\n /**\n * Parses a serialized objects\n * @param source serialized object\n * @param scene scene\n * @param _rootUrl root url for textures\n */\n parse(e, t, i) {\n var s;\n const r = e.greasedLineMaterialOptions;\n (s = this._colorsTexture) == null || s.dispose(), r.color && (this.color = r.color), r.colorDistributionType && (this.colorsDistributionType = r.colorDistributionType), r.colorsSampling && (this.colorsSampling = r.colorsSampling), r.colorMode && (this.colorMode = r.colorMode), r.useColors && (this.useColors = r.useColors), r.visibility && (this.visibility = r.visibility), r.useDash && (this.useDash = r.useDash), r.dashCount && (this.dashCount = r.dashCount), r.dashRatio && (this.dashRatio = r.dashRatio), r.dashOffset && (this.dashOffset = r.dashOffset), r.width && (this.width = r.width), r.sizeAttenuation && (this.sizeAttenuation = r.sizeAttenuation), r.resolution && (this.resolution = r.resolution), r.colors ? this.colorsTexture = _t.CreateColorsTexture(`${this.name}-colors-texture`, r.colors, this.colorsSampling, this.getScene()) : this.colorsTexture = _t.PrepareEmptyColorsTexture(t), this._cameraFacing = r.cameraFacing ?? !0, this.setDefine(\"GREASED_LINE_CAMERA_FACING\", this._cameraFacing);\n }\n}\nvar Ds;\n(function(n) {\n n[n.POINTS_MODE_POINTS = 0] = \"POINTS_MODE_POINTS\", n[n.POINTS_MODE_PATHS = 1] = \"POINTS_MODE_PATHS\";\n})(Ds || (Ds = {}));\nvar Tu;\n(function(n) {\n n[n.FACES_MODE_SINGLE_SIDED = 0] = \"FACES_MODE_SINGLE_SIDED\", n[n.FACES_MODE_SINGLE_SIDED_NO_BACKFACE_CULLING = 1] = \"FACES_MODE_SINGLE_SIDED_NO_BACKFACE_CULLING\", n[n.FACES_MODE_DOUBLE_SIDED = 2] = \"FACES_MODE_DOUBLE_SIDED\";\n})(Tu || (Tu = {}));\nvar co;\n(function(n) {\n n[n.AUTO_DIRECTIONS_FROM_FIRST_SEGMENT = 0] = \"AUTO_DIRECTIONS_FROM_FIRST_SEGMENT\", n[n.AUTO_DIRECTIONS_FROM_ALL_SEGMENTS = 1] = \"AUTO_DIRECTIONS_FROM_ALL_SEGMENTS\", n[n.AUTO_DIRECTIONS_ENHANCED = 2] = \"AUTO_DIRECTIONS_ENHANCED\", n[n.AUTO_DIRECTIONS_NONE = 99] = \"AUTO_DIRECTIONS_NONE\";\n})(co || (co = {}));\nclass O0 extends B {\n constructor(e, t, i) {\n super(e, t, null, null, !1, !1), this.name = e, this._options = i, this._lazy = !1, this._updatable = !1, this._engine = t.getEngine(), this._lazy = i.lazy ?? !1, this._updatable = i.updatable ?? !1, this._vertexPositions = [], this._indices = [], this._uvs = [], this._points = [], this._colorPointers = i.colorPointers ?? [], this._widths = i.widths ?? new Array(i.points.length).fill(1);\n }\n /**\n * \"GreasedLineMesh\"\n * @returns \"GreasedLineMesh\"\n */\n getClassName() {\n return \"GreasedLineMesh\";\n }\n _updateWidthsWithValue(e) {\n let t = 0;\n for (const r of this._points)\n t += r.length;\n const i = t / 3 * 2 - this._widths.length;\n for (let r = 0; r < i; r++)\n this._widths.push(e);\n }\n /**\n * Updated a lazy line. Rerenders the line and updates boundinfo as well.\n */\n updateLazy() {\n var e, t;\n this._setPoints(this._points), this._options.colorPointers || this._updateColorPointers(), this._createVertexBuffers((e = this._options.ribbonOptions) == null ? void 0 : e.smoothShading), this.refreshBoundingInfo(), (t = this.greasedLineMaterial) == null || t.updateLazy();\n }\n /**\n * Adds new points to the line. It doesn't rerenders the line if in lazy mode.\n * @param points points table\n * @param options optional options\n */\n addPoints(e, t) {\n for (const i of e)\n this._points.push(i);\n this._lazy || this.setPoints(this._points, t);\n }\n /**\n * Dispose the line and it's resources\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n super.dispose(e, t);\n }\n /**\n *\n * @returns true if the mesh was created in lazy mode\n */\n isLazy() {\n return this._lazy;\n }\n /**\n * Return the points offsets\n */\n get offsets() {\n return this._offsets;\n }\n /**\n * Sets point offests\n * @param offsets offset table [x,y,z, x,y,z, ....]\n */\n set offsets(e) {\n this._offsets = e, this._offsetsBuffer ? this._offsetsBuffer.update(e) : this._createOffsetsBuffer(e);\n }\n /**\n * Gets widths at each line point like [widthLower, widthUpper, widthLower, widthUpper, ...]\n */\n get widths() {\n return this._widths;\n }\n /**\n * Sets widths at each line point\n * @param widths width table [widthLower, widthUpper, widthLower, widthUpper ...]\n */\n set widths(e) {\n this._widths = e, this._lazy || this._widthsBuffer && this._widthsBuffer.update(e);\n }\n /**\n * Gets the color pointer. Each vertex need a color pointer. These color pointers points to the colors in the color table @see colors\n */\n get colorPointers() {\n return this._colorPointers;\n }\n /**\n * Sets the color pointer\n * @param colorPointers array of color pointer in the colors array. One pointer for every vertex is needed.\n */\n set colorPointers(e) {\n this._colorPointers = e, this._lazy || this._colorPointersBuffer && this._colorPointersBuffer.update(e);\n }\n /**\n * Gets the pluginMaterial associated with line\n */\n get greasedLineMaterial() {\n var t, i;\n if (this.material && this.material instanceof VP)\n return this.material;\n const e = (i = (t = this.material) == null ? void 0 : t.pluginManager) == null ? void 0 : i.getPlugin(Nn.GREASED_LINE_MATERIAL_NAME);\n if (e)\n return e;\n }\n /**\n * Return copy the points.\n */\n get points() {\n const e = [];\n return Dn.DeepCopy(this._points, e), e;\n }\n /**\n * Sets line points and rerenders the line.\n * @param points points table\n * @param options optional options\n */\n setPoints(e, t) {\n this._points = e, this._updateWidths(), t != null && t.colorPointers || this._updateColorPointers(), this._setPoints(e, t);\n }\n _initGreasedLine() {\n this._vertexPositions = [], this._indices = [], this._uvs = [];\n }\n _createLineOptions() {\n return {\n points: this._points,\n colorPointers: this._colorPointers,\n lazy: this._lazy,\n updatable: this._updatable,\n uvs: this._uvs instanceof Float32Array ? Array.from(this._uvs) : this._uvs,\n widths: this._widths,\n ribbonOptions: this._options.ribbonOptions\n };\n }\n /**\n * Serializes this GreasedLineMesh\n * @param serializationObject object to write serialization to\n */\n serialize(e) {\n super.serialize(e), e.type = this.getClassName(), e.lineOptions = this._createLineOptions();\n }\n _createVertexBuffers(e = !1) {\n const t = new re();\n return t.positions = this._vertexPositions, t.indices = this._indices, t.uvs = this._uvs, e && (t.normals = [], re.ComputeNormals(this._vertexPositions, this._indices, t.normals)), t.applyToMesh(this, this._options.updatable), t;\n }\n _createOffsetsBuffer(e) {\n const t = this._scene.getEngine(), i = new dr(t, e, this._updatable, 3);\n this.setVerticesBuffer(i.createVertexBuffer(\"grl_offsets\", 0, 3)), this._offsetsBuffer = i;\n }\n}\nB._GreasedLineMeshParser = (n, e) => xi.Parse(n, e);\nclass xi extends O0 {\n /**\n * GreasedLineMesh\n * @param name name of the mesh\n * @param scene the scene\n * @param _options mesh options\n */\n constructor(e, t, i) {\n super(e, t, i), this.name = e, this.intersectionThreshold = 0.1, this._previousAndSide = [], this._nextAndCounters = [], i.points && this.addPoints(_t.ConvertPoints(i.points));\n }\n /**\n * \"GreasedLineMesh\"\n * @returns \"GreasedLineMesh\"\n */\n getClassName() {\n return \"GreasedLineMesh\";\n }\n _updateColorPointers() {\n if (this._options.colorPointers)\n return;\n let e = 0;\n this._colorPointers = [], this._points.forEach((t) => {\n for (let i = 0; i < t.length; i += 3)\n this._colorPointers.push(e), this._colorPointers.push(e++);\n });\n }\n _updateWidths() {\n super._updateWidthsWithValue(0);\n }\n _setPoints(e) {\n this._points = e, this._options.points = e, this._initGreasedLine();\n let t = 0, i = 0, r = 0, s = 0, a = 0;\n e.forEach((v) => {\n i += v.length * 2, r += (v.length - 3) * 2, s += v.length * 4 / 3, a += v.length * 8 / 3;\n });\n const o = new Float32Array(i), l = i > 65535 ? new Uint32Array(r) : new Uint16Array(r), c = new Float32Array(s), h = new Float32Array(a), u = new Float32Array(a);\n let f = 0, d = 0, p = 0, g = 0, m = 0;\n e.forEach((v) => {\n const E = _t.GetLineLengthArray(v), C = E[E.length - 1];\n for (let F = 0, U = 0; U < v.length; F++, U += 3) {\n const H = f + U * 2;\n if (o[H + 0] = v[U + 0], o[H + 1] = v[U + 1], o[H + 2] = v[U + 2], o[H + 3] = v[U + 0], o[H + 4] = v[U + 1], o[H + 5] = v[U + 2], U < v.length - 3) {\n const q = F * 2 + t, Z = d + U * 2;\n l[Z + 0] = q, l[Z + 1] = q + 1, l[Z + 2] = q + 2, l[Z + 3] = q + 2, l[Z + 4] = q + 1, l[Z + 5] = q + 3;\n }\n }\n t += v.length / 3 * 2;\n const T = v.length * 2, R = o.subarray(f, f + T);\n f += T, d += (v.length - 1) * 2;\n const x = new Float32Array(R.length), S = new Float32Array(R.length), M = R.length / 6;\n let N;\n xi._CompareV3(0, M - 1, R) ? N = R.subarray((M - 2) * 6, (M - 1) * 6) : N = R.subarray(0, 6), x.set(N), x.set(R.subarray(0, R.length - 6), 6), S.set(R.subarray(6)), xi._CompareV3(M - 1, 0, R) ? N = R.subarray(6, 12) : N = R.subarray((M - 1) * 6, M * 6), S.set(N, S.length - 6);\n for (let F = 0, U = R.length / 3; F < U; F++)\n h[g++] = x[F * 3], h[g++] = x[F * 3 + 1], h[g++] = x[F * 3 + 2], h[g++] = 1 - ((F & 1) << 1), u[m++] = S[F * 3], u[m++] = S[F * 3 + 1], u[m++] = S[F * 3 + 2], u[m++] = E[F >> 1] / C;\n if (this._options.uvs) {\n const F = this._options.uvs;\n for (const U of F)\n c[p++] = U;\n } else {\n for (let F = 0; F < M; F++) {\n const U = p + F * 4;\n c[U + 0] = F / (M - 1), c[U + 1] = 0, c[U + 2] = F / (M - 1), c[U + 3] = 1;\n }\n p += M * 4;\n }\n }), this._vertexPositions = o, this._indices = l, this._uvs = c, this._previousAndSide = h, this._nextAndCounters = u, this._lazy || (this._options.colorPointers || this._updateColorPointers(), this._createVertexBuffers(), this.refreshBoundingInfo());\n }\n /**\n * Clones the GreasedLineMesh.\n * @param name new line name\n * @param newParent new parent node\n * @returns cloned line\n */\n clone(e = `${this.name}-cloned`, t) {\n const i = this._createLineOptions(), r = {};\n Dn.DeepCopy(i, r, [\"instance\"], void 0, !0);\n const s = new xi(e, this._scene, r);\n return t && (s.parent = t), s.material = this.material, s;\n }\n /**\n * Serializes this GreasedLineMesh\n * @param serializationObject object to write serialization to\n */\n serialize(e) {\n super.serialize(e), e.type = this.getClassName(), e.lineOptions = this._createLineOptions();\n }\n /**\n * Parses a serialized GreasedLineMesh\n * @param parsedMesh the serialized GreasedLineMesh\n * @param scene the scene to create the GreasedLineMesh in\n * @returns the created GreasedLineMesh\n */\n static Parse(e, t) {\n const i = e.lineOptions, r = e.name;\n return new xi(r, t, i);\n }\n _initGreasedLine() {\n super._initGreasedLine(), this._previousAndSide = [], this._nextAndCounters = [];\n }\n /**\n * Checks whether a ray is intersecting this GreasedLineMesh\n * @param ray ray to check the intersection of this mesh with\n * @param fastCheck not supported\n * @param trianglePredicate not supported\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\n * @param worldToUse not supported\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\n * @returns the picking info\n */\n intersects(e, t, i, r = !1, s, a = !1) {\n const o = new ps(), l = this.findAllIntersections(e, t, i, r, s, a, !0);\n if ((l == null ? void 0 : l.length) === 1) {\n const c = l[0];\n o.hit = !0, o.distance = c.distance, o.ray = e, o.pickedMesh = this, o.pickedPoint = c.point;\n }\n return o;\n }\n /**\n * Gets all intersections of a ray and the line\n * @param ray Ray to check the intersection of this mesh with\n * @param _fastCheck not supported\n * @param _trianglePredicate not supported\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\n * @param _worldToUse not supported\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\n * @param firstOnly If true, the first and only intersection is immediatelly returned if found\n * @returns intersection(s)\n */\n findAllIntersections(e, t, i, r = !1, s, a = !1, o = !1) {\n var d;\n if (r && !a && e.intersectsSphere(this._boundingSphere, this.intersectionThreshold) === !1)\n return;\n const l = this.getIndices(), c = this.getVerticesData(I.PositionKind), h = this._widths, u = ((d = this.greasedLineMaterial) == null ? void 0 : d.width) ?? 1, f = [];\n if (l && c && h) {\n let p = 0, g = 0;\n for (p = 0, g = l.length - 1; p < g; p += 3) {\n const m = l[p], v = l[p + 1];\n xi._V_START.fromArray(c, m * 3), xi._V_END.fromArray(c, v * 3), this._offsets && (xi._V_OFFSET_START.fromArray(this._offsets, m * 3), xi._V_OFFSET_END.fromArray(this._offsets, v * 3), xi._V_START.addInPlace(xi._V_OFFSET_START), xi._V_END.addInPlace(xi._V_OFFSET_END));\n const E = Math.floor(p / 3), C = h[E] !== void 0 ? h[E] : 1, T = this.intersectionThreshold * (u * C) / 2, R = e.intersectionSegment(xi._V_START, xi._V_END, T);\n if (R !== -1 && (f.push({\n distance: R,\n point: e.direction.normalize().multiplyByFloats(R, R, R).add(e.origin)\n }), o))\n return f;\n }\n p = g;\n }\n return f;\n }\n get _boundingSphere() {\n return this.getBoundingInfo().boundingSphere;\n }\n static _CompareV3(e, t, i) {\n const r = e * 6, s = t * 6;\n return i[r] === i[s] && i[r + 1] === i[s + 1] && i[r + 2] === i[s + 2];\n }\n _createVertexBuffers() {\n const e = super._createVertexBuffers(), t = this._scene.getEngine(), i = new dr(t, this._previousAndSide, !1, 4);\n this.setVerticesBuffer(i.createVertexBuffer(\"grl_previousAndSide\", 0, 4));\n const r = new dr(t, this._nextAndCounters, !1, 4);\n this.setVerticesBuffer(r.createVertexBuffer(\"grl_nextAndCounters\", 0, 4));\n const s = new dr(t, this._widths, this._updatable, 1);\n this.setVerticesBuffer(s.createVertexBuffer(\"grl_widths\", 0, 1)), this._widthsBuffer = s;\n const a = new dr(t, this._colorPointers, this._updatable, 1);\n return this.setVerticesBuffer(a.createVertexBuffer(\"grl_colorPointers\", 0, 1)), this._colorPointersBuffer = a, e;\n }\n}\nxi._V_START = new _();\nxi._V_END = new _();\nxi._V_OFFSET_START = new _();\nxi._V_OFFSET_END = new _();\nB._GreasedLineRibbonMeshParser = (n, e) => ni.Parse(n, e);\nclass ni extends O0 {\n /**\n * GreasedLineRibbonMesh\n * @param name name of the mesh\n * @param scene the scene\n * @param _options mesh options\n * @param _pathOptions used internaly when parsing a serialized GreasedLineRibbonMesh\n */\n constructor(e, t, i, r) {\n if (super(e, t, i), this.name = e, !i.ribbonOptions)\n throw \"'GreasedLineMeshOptions.ribbonOptions' is not set.\";\n this._paths = [], this._counters = [], this._slopes = [], this._widths = i.widths ?? [], this._ribbonWidths = [], this._pathsOptions = r ?? [], i.points && this.addPoints(_t.ConvertPoints(i.points), i, !!r);\n }\n /**\n * Adds new points to the line. It doesn't rerenders the line if in lazy mode.\n * @param points points table\n * @param options mesh options\n * @param hasPathOptions defaults to false\n */\n addPoints(e, t, i = !1) {\n if (!t.ribbonOptions)\n throw \"addPoints() on GreasedLineRibbonMesh instance requires 'GreasedLineMeshOptions.ribbonOptions'.\";\n i || this._pathsOptions.push({ options: t, pathCount: e.length }), super.addPoints(e, t);\n }\n /**\n * \"GreasedLineRibbonMesh\"\n * @returns \"GreasedLineRibbonMesh\"\n */\n getClassName() {\n return \"GreasedLineRibbonMesh\";\n }\n /**\n * Return true if the line was created from two edge paths or one points path.\n * In this case the line is always flat.\n */\n get isFlatLine() {\n return this._paths.length < 3;\n }\n /**\n * Returns the slopes of the line at each point relative to the center of the line\n */\n get slopes() {\n return this._slopes;\n }\n /**\n * Set the slopes of the line at each point relative to the center of the line\n */\n set slopes(e) {\n this._slopes = e;\n }\n _updateColorPointers() {\n if (this._options.colorPointers)\n return;\n let e = 0;\n this._colorPointers = [];\n for (let t = 0; t < this._pathsOptions.length; t++) {\n const { options: i, pathCount: r } = this._pathsOptions[t], s = this._points[t];\n if (i.ribbonOptions.pointsMode === Ds.POINTS_MODE_POINTS)\n for (let a = 0; a < r; a++)\n for (let o = 0; o < s.length; o += 3)\n this._colorPointers.push(e), this._colorPointers.push(e++);\n else\n for (let a = 0; a < s.length; a += 3) {\n for (let o = 0; o < r; o++)\n this._colorPointers.push(e);\n e++;\n }\n }\n }\n _updateWidths() {\n super._updateWidthsWithValue(1);\n }\n _setPoints(e, t) {\n var s, a;\n if (!this._options.ribbonOptions)\n throw \"No 'GreasedLineMeshOptions.ribbonOptions' provided.\";\n this._points = e, this._options.points = e, this._initGreasedLine();\n let i = 0, r;\n for (let o = 0, l = 0; o < this._pathsOptions.length; o++) {\n const { options: c, pathCount: h } = this._pathsOptions[o], u = e.slice(l, l + h);\n if (l += h, ((s = c.ribbonOptions) == null ? void 0 : s.pointsMode) === Ds.POINTS_MODE_PATHS)\n i = this._preprocess(_t.ToVector3Array(u), i, c);\n else {\n if (((a = c.ribbonOptions) == null ? void 0 : a.directionsAutoMode) === co.AUTO_DIRECTIONS_NONE) {\n if (!c.ribbonOptions.directions)\n throw \"In GreasedLineRibbonAutoDirectionMode.AUTO_DIRECTIONS_NONE 'GreasedLineMeshOptions.ribbonOptions.directions' must be defined.\";\n r = ni._GetDirectionPlanesFromDirectionsOption(u.length, c.ribbonOptions.directions);\n }\n u.forEach((f, d) => {\n const p = ni._ConvertToRibbonPath(f, c.ribbonOptions, this._scene.useRightHandedSystem, r && r[d]);\n i = this._preprocess(p, i, c);\n });\n }\n }\n this._lazy || (this._createVertexBuffers(), this.refreshBoundingInfo());\n }\n static _GetDirectionPlanesFromDirectionsOption(e, t) {\n return Array.isArray(t) ? t : new Array(e).fill(t);\n }\n static _CreateRibbonVertexData(e, t) {\n var h, u;\n const i = e.length;\n if (i < 2)\n throw \"Minimum of two paths are required to create a GreasedLineRibbonMesh.\";\n const r = [], s = [], a = e[0];\n for (let f = 0; f < a.length; f++)\n for (let d = 0; d < e.length; d++) {\n const p = e[d][f];\n r.push(p.x, p.y, p.z);\n }\n const o = [1, 0, i], l = ((h = t.ribbonOptions) == null ? void 0 : h.facesMode) === Tu.FACES_MODE_DOUBLE_SIDED, c = ((u = t.ribbonOptions) == null ? void 0 : u.pointsMode) === Ds.POINTS_MODE_PATHS && t.ribbonOptions.closePath;\n if (i > 2)\n for (let f = 0; f < a.length - 1; f++) {\n o[0] = 1 + i * f, o[1] = i * f, o[2] = (f + 1) * i;\n for (let d = 0; d < (i - 1) * 2; d++)\n d % 2 !== 0 && (o[2] += 1), d % 2 === 0 && d > 0 && (o[0] += 1, o[1] += 1), s.push(o[1] + (d % 2 !== 0 ? i : 0), o[0], o[2]), l && s.push(o[0], o[1] + (d % 2 !== 0 ? i : 0), o[2]);\n }\n else\n for (let f = 0; f < r.length / 3 - 3; f += 2)\n s.push(f, f + 1, f + 2), s.push(f + 2, f + 1, f + 3), l && (s.push(f + 1, f, f + 2), s.push(f + 1, f + 2, f + 3));\n if (c) {\n let f = i * (a.length - 1);\n for (let d = 0; d < i - 1; d++)\n s.push(f, d + 1, d), s.push(f + 1, d + 1, f), l && (s.push(d, d + 1, f), s.push(f, d + 1, f + 1)), f++;\n }\n return {\n positions: r,\n indices: s\n };\n }\n _preprocess(e, t, i) {\n var d, p;\n this._paths = e;\n const r = ni._CreateRibbonVertexData(e, i), s = r.positions;\n if (!this._options.widths)\n throw \"No 'GreasedLineMeshOptions.widths' table is specified.\";\n const a = Array.isArray(this._vertexPositions) ? this._vertexPositions : Array.from(this._vertexPositions);\n this._vertexPositions = a;\n const o = Array.isArray(this._uvs) ? this._uvs : Array.from(this._uvs);\n this._uvs = o;\n const l = Array.isArray(this._indices) ? this._indices : Array.from(this._indices);\n this._indices = l;\n for (const g of s)\n a.push(g);\n let c = e;\n if (((d = i.ribbonOptions) == null ? void 0 : d.pointsMode) === Ds.POINTS_MODE_PATHS && i.ribbonOptions.closePath) {\n c = [];\n for (let g = 0; g < e.length; g++) {\n const m = e[g].slice();\n m.push(e[g][0].clone()), c.push(m);\n }\n }\n this._calculateSegmentLengths(c);\n const h = c.length, u = new Array(h).fill(0);\n for (let g = 0; g < c[0].length; g++) {\n let m = 0;\n for (let v = 0; v < h; v++) {\n const E = u[v] + this._vSegmentLengths[v][g] / this._vTotalLengths[v];\n this._counters.push(E), o.push(E, m), u[v] = E, m += this._uSegmentLengths[g][v] / this._uTotalLengths[g];\n }\n }\n for (let g = 0, m = 0; g < c[0].length; g++) {\n const v = this._uSegmentLengths[g][0] / 2, E = this._uSegmentLengths[g][h - 1] / 2;\n this._ribbonWidths.push(((this._widths[m++] ?? 1) - 1) * v);\n for (let C = 0; C < h - 2; C++)\n this._ribbonWidths.push(0);\n this._ribbonWidths.push(((this._widths[m++] ?? 1) - 1) * E);\n }\n const f = ((p = i.ribbonOptions) == null ? void 0 : p.pointsMode) === Ds.POINTS_MODE_PATHS ? new Array(c[0].length * c.length * 6).fill(0) : ni._CalculateSlopes(c);\n for (const g of f)\n this._slopes.push(g);\n if (r.indices)\n for (let g = 0; g < r.indices.length; g++)\n l.push(r.indices[g] + t);\n return t += s.length / 3, t;\n }\n static _ConvertToRibbonPath(e, t, i, r) {\n if (t.pointsMode === Ds.POINTS_MODE_POINTS && !t.width)\n throw \"'GreasedLineMeshOptions.ribbonOptiosn.width' must be specified in GreasedLineRibbonPointsMode.POINTS_MODE_POINTS.\";\n const s = [], a = [];\n if (t.pointsMode === Ds.POINTS_MODE_POINTS) {\n const o = t.width / 2, l = _t.ToVector3Array(e);\n let c = null, h = null;\n t.directionsAutoMode === co.AUTO_DIRECTIONS_FROM_FIRST_SEGMENT && (r = ni._GetDirectionFromPoints(l[0], l[1], null));\n for (let u = 0; u < l.length - (r ? 0 : 1); u++) {\n const f = l[u], d = l[u + 1];\n if (r)\n c = r;\n else if (t.directionsAutoMode === co.AUTO_DIRECTIONS_FROM_ALL_SEGMENTS)\n c = ni._GetDirectionFromPoints(f, d, c);\n else {\n const p = d.subtract(f);\n p.applyRotationQuaternionInPlace(p.x > p.y && p.x > p.z ? i ? ni._RightHandedForwardReadOnlyQuaternion : ni._LeftHandedForwardReadOnlyQuaternion : ni._LeftReadOnlyQuaternion), c = p.normalize();\n }\n h = c.multiplyByFloats(o, o, o), s.push(f.add(h)), a.push(f.subtract(h));\n }\n r || (s.push(l[l.length - 1].add(h)), a.push(l[l.length - 1].subtract(h)));\n }\n return [s, a];\n }\n static _GetDirectionFromPoints(e, t, i) {\n return e.x === t.x && (!i || (i == null ? void 0 : i.x) === 1) ? ni.DIRECTION_YZ : e.y === t.y ? ni.DIRECTION_XZ : e.z === t.z ? ni.DIRECTION_XY : ni.DIRECTION_XZ;\n }\n /**\n * Clones the GreasedLineRibbonMesh.\n * @param name new line name\n * @param newParent new parent node\n * @returns cloned line\n */\n clone(e = `${this.name}-cloned`, t) {\n const i = this._createLineOptions(), r = {}, s = [];\n Dn.DeepCopy(this._pathsOptions, s, void 0, void 0, !0), Dn.DeepCopy(i, r, [\"instance\"], void 0, !0);\n const a = new ni(e, this._scene, r, s);\n return t && (a.parent = t), a.material = this.material, a;\n }\n /**\n * Serializes this GreasedLineRibbonMesh\n * @param serializationObject object to write serialization to\n */\n serialize(e) {\n super.serialize(e), e.type = this.getClassName(), e.lineOptions = this._createLineOptions(), e.pathsOptions = this._pathsOptions;\n }\n /**\n * Parses a serialized GreasedLineRibbonMesh\n * @param parsedMesh the serialized GreasedLineRibbonMesh\n * @param scene the scene to create the GreasedLineRibbonMesh in\n * @returns the created GreasedLineRibbonMesh\n */\n static Parse(e, t) {\n const i = e.lineOptions, r = e.name, s = e.pathOptions;\n return new ni(r, t, i, s);\n }\n _initGreasedLine() {\n super._initGreasedLine(), this._paths = [], this._counters = [], this._slopes = [], this._ribbonWidths = [];\n }\n _calculateSegmentLengths(e) {\n const t = e.length;\n this._vSegmentLengths = new Array(t), this._vTotalLengths = new Array(t);\n let i = 0;\n for (let a = 0; a < t; a++) {\n const o = e[a];\n this._vSegmentLengths[a] = [0], i = 0;\n for (let l = 0; l < o.length - 1; l++) {\n const c = Math.abs(o[l].subtract(o[l + 1]).lengthSquared());\n i += c, this._vSegmentLengths[a].push(c);\n }\n this._vTotalLengths[a] = i;\n }\n const r = e[0].length;\n this._uSegmentLengths = new Array(r).fill([]), this._uTotalLengths = new Array(r).fill([]);\n const s = new _();\n for (let a = 0; a < r; a++) {\n i = 0;\n for (let o = 1; o < t; o++) {\n e[o][a].subtractToRef(e[o - 1][a], s);\n const l = s.length();\n i += l, this._uSegmentLengths[a].push(l);\n }\n this._uTotalLengths[a] = i;\n }\n }\n static _CalculateSlopes(e) {\n const t = e[0], i = e.length === 2 ? e[1] : e[e.length - 1], r = [], s = new _();\n for (let a = 0; a < t.length; a++)\n for (let o = 0; o < e.length; o++)\n o === 0 || o === e.length - 1 ? (t[a].subtract(i[a]).normalizeToRef(s), r.push(s.x, s.y, s.z), r.push(-s.x, -s.y, -s.z)) : r.push(0, 0, 0, 0, 0, 0);\n return r;\n }\n _createVertexBuffers() {\n var a;\n this._uvs = this._options.uvs ?? this._uvs;\n const e = super._createVertexBuffers((a = this._options.ribbonOptions) == null ? void 0 : a.smoothShading), t = new dr(this._engine, this._counters, this._updatable, 1);\n this.setVerticesBuffer(t.createVertexBuffer(\"grl_counters\", 0, 1));\n const i = new dr(this._engine, this._colorPointers, this._updatable, 1);\n this.setVerticesBuffer(i.createVertexBuffer(\"grl_colorPointers\", 0, 1));\n const r = new dr(this._engine, this._slopes, this._updatable, 3);\n this.setVerticesBuffer(r.createVertexBuffer(\"grl_slopes\", 0, 3));\n const s = new dr(this._engine, this._ribbonWidths, this._updatable, 1);\n return this.setVerticesBuffer(s.createVertexBuffer(\"grl_widths\", 0, 1)), this._widthsBuffer = s, e;\n }\n}\nni.DEFAULT_WIDTH = 0.1;\nni._RightHandedForwardReadOnlyQuaternion = Ce.RotationAxis(_.RightHandedForwardReadOnly, Math.PI / 2);\nni._LeftHandedForwardReadOnlyQuaternion = Ce.RotationAxis(_.LeftHandedForwardReadOnly, Math.PI / 2);\nni._LeftReadOnlyQuaternion = Ce.RotationAxis(_.LeftReadOnly, Math.PI / 2);\nni.DIRECTION_XY = _.LeftHandedForwardReadOnly;\nni.DIRECTION_XZ = _.UpReadOnly;\nni.DIRECTION_YZ = _.LeftReadOnly;\nvar vg;\n(function(n) {\n n[n.COLOR_DISTRIBUTION_NONE = 0] = \"COLOR_DISTRIBUTION_NONE\", n[n.COLOR_DISTRIBUTION_REPEAT = 1] = \"COLOR_DISTRIBUTION_REPEAT\", n[n.COLOR_DISTRIBUTION_EVEN = 2] = \"COLOR_DISTRIBUTION_EVEN\", n[n.COLOR_DISTRIBUTION_START = 3] = \"COLOR_DISTRIBUTION_START\", n[n.COLOR_DISTRIBUTION_END = 4] = \"COLOR_DISTRIBUTION_END\", n[n.COLOR_DISTRIBUTION_START_END = 5] = \"COLOR_DISTRIBUTION_START_END\";\n})(vg || (vg = {}));\nvar Tg;\n(function(n) {\n n[n.WIDTH_DISTRIBUTION_NONE = 0] = \"WIDTH_DISTRIBUTION_NONE\", n[n.WIDTH_DISTRIBUTION_REPEAT = 1] = \"WIDTH_DISTRIBUTION_REPEAT\", n[n.WIDTH_DISTRIBUTION_EVEN = 2] = \"WIDTH_DISTRIBUTION_EVEN\", n[n.WIDTH_DISTRIBUTION_START = 3] = \"WIDTH_DISTRIBUTION_START\", n[n.WIDTH_DISTRIBUTION_END = 4] = \"WIDTH_DISTRIBUTION_END\", n[n.WIDTH_DISTRIBUTION_START_END = 5] = \"WIDTH_DISTRIBUTION_START_END\";\n})(Tg || (Tg = {}));\nB.prototype.thinInstanceAdd = function(n, e = !0) {\n if (!this.getScene().getEngine().getCaps().instancedArrays)\n return ne.Error(\"Thin Instances are not supported on this device as Instanced Array extension not supported\"), -1;\n this._thinInstanceUpdateBufferSize(\"matrix\", Array.isArray(n) ? n.length : 1);\n const t = this._thinInstanceDataStorage.instancesCount;\n if (Array.isArray(n))\n for (let i = 0; i < n.length; ++i)\n this.thinInstanceSetMatrixAt(this._thinInstanceDataStorage.instancesCount++, n[i], i === n.length - 1 && e);\n else\n this.thinInstanceSetMatrixAt(this._thinInstanceDataStorage.instancesCount++, n, e);\n return t;\n};\nB.prototype.thinInstanceAddSelf = function(n = !0) {\n return this.thinInstanceAdd(L.IdentityReadOnly, n);\n};\nB.prototype.thinInstanceRegisterAttribute = function(n, e) {\n n === I.ColorKind && (n = I.ColorInstanceKind), this.removeVerticesData(n), this._thinInstanceInitializeUserStorage(), this._userThinInstanceBuffersStorage.strides[n] = e, this._userThinInstanceBuffersStorage.sizes[n] = e * Math.max(32, this._thinInstanceDataStorage.instancesCount), this._userThinInstanceBuffersStorage.data[n] = new Float32Array(this._userThinInstanceBuffersStorage.sizes[n]), this._userThinInstanceBuffersStorage.vertexBuffers[n] = new I(this.getEngine(), this._userThinInstanceBuffersStorage.data[n], n, !0, !1, e, !0), this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[n]);\n};\nB.prototype.thinInstanceSetMatrixAt = function(n, e, t = !0) {\n if (!this._thinInstanceDataStorage.matrixData || n >= this._thinInstanceDataStorage.instancesCount)\n return !1;\n const i = this._thinInstanceDataStorage.matrixData;\n return e.copyToArray(i, n * 16), this._thinInstanceDataStorage.worldMatrices && (this._thinInstanceDataStorage.worldMatrices[n] = e), t && (this.thinInstanceBufferUpdated(\"matrix\"), this.doNotSyncBoundingInfo || this.thinInstanceRefreshBoundingInfo(!1)), !0;\n};\nB.prototype.thinInstanceSetAttributeAt = function(n, e, t, i = !0) {\n return n === I.ColorKind && (n = I.ColorInstanceKind), !this._userThinInstanceBuffersStorage || !this._userThinInstanceBuffersStorage.data[n] || e >= this._thinInstanceDataStorage.instancesCount ? !1 : (this._thinInstanceUpdateBufferSize(n, 0), this._userThinInstanceBuffersStorage.data[n].set(t, e * this._userThinInstanceBuffersStorage.strides[n]), i && this.thinInstanceBufferUpdated(n), !0);\n};\nObject.defineProperty(B.prototype, \"thinInstanceCount\", {\n get: function() {\n return this._thinInstanceDataStorage.instancesCount;\n },\n set: function(n) {\n var i;\n const e = this._thinInstanceDataStorage.matrixData ?? ((i = this.source) == null ? void 0 : i._thinInstanceDataStorage.matrixData), t = e ? e.length / 16 : 0;\n n <= t && (this._thinInstanceDataStorage.instancesCount = n);\n },\n enumerable: !0,\n configurable: !0\n});\nB.prototype._thinInstanceCreateMatrixBuffer = function(n, e, t = !0) {\n const i = new dr(this.getEngine(), e, !t, 16, !1, !0);\n for (let r = 0; r < 4; r++)\n this.setVerticesBuffer(i.createVertexBuffer(n + r, r * 4, 4));\n return i;\n};\nB.prototype.thinInstanceSetBuffer = function(n, e, t = 0, i = !0) {\n var r, s, a;\n t = t || 16, n === \"matrix\" ? ((r = this._thinInstanceDataStorage.matrixBuffer) == null || r.dispose(), this._thinInstanceDataStorage.matrixBuffer = null, this._thinInstanceDataStorage.matrixBufferSize = e ? e.length : 32 * t, this._thinInstanceDataStorage.matrixData = e, this._thinInstanceDataStorage.worldMatrices = null, e !== null ? (this._thinInstanceDataStorage.instancesCount = e.length / t, this._thinInstanceDataStorage.matrixBuffer = this._thinInstanceCreateMatrixBuffer(\"world\", e, i), this.doNotSyncBoundingInfo || this.thinInstanceRefreshBoundingInfo(!1)) : (this._thinInstanceDataStorage.instancesCount = 0, this.doNotSyncBoundingInfo || this.refreshBoundingInfo())) : n === \"previousMatrix\" ? ((s = this._thinInstanceDataStorage.previousMatrixBuffer) == null || s.dispose(), this._thinInstanceDataStorage.previousMatrixBuffer = null, this._thinInstanceDataStorage.previousMatrixData = e, e !== null && (this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", e, i))) : (n === I.ColorKind && (n = I.ColorInstanceKind), e === null ? (a = this._userThinInstanceBuffersStorage) != null && a.data[n] && (this.removeVerticesData(n), delete this._userThinInstanceBuffersStorage.data[n], delete this._userThinInstanceBuffersStorage.strides[n], delete this._userThinInstanceBuffersStorage.sizes[n], delete this._userThinInstanceBuffersStorage.vertexBuffers[n]) : (this._thinInstanceInitializeUserStorage(), this._userThinInstanceBuffersStorage.data[n] = e, this._userThinInstanceBuffersStorage.strides[n] = t, this._userThinInstanceBuffersStorage.sizes[n] = e.length, this._userThinInstanceBuffersStorage.vertexBuffers[n] = new I(this.getEngine(), e, n, !i, !1, t, !0), this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[n])));\n};\nB.prototype.thinInstanceBufferUpdated = function(n) {\n var e, t, i;\n n === \"matrix\" ? (this.thinInstanceAllowAutomaticStaticBufferRecreation && this._thinInstanceDataStorage.matrixBuffer && !this._thinInstanceDataStorage.matrixBuffer.isUpdatable() && this._thinInstanceRecreateBuffer(n), (e = this._thinInstanceDataStorage.matrixBuffer) == null || e.updateDirectly(this._thinInstanceDataStorage.matrixData, 0, this._thinInstanceDataStorage.instancesCount)) : n === \"previousMatrix\" ? (this.thinInstanceAllowAutomaticStaticBufferRecreation && this._thinInstanceDataStorage.previousMatrixBuffer && !this._thinInstanceDataStorage.previousMatrixBuffer.isUpdatable() && this._thinInstanceRecreateBuffer(n), (t = this._thinInstanceDataStorage.previousMatrixBuffer) == null || t.updateDirectly(this._thinInstanceDataStorage.previousMatrixData, 0, this._thinInstanceDataStorage.instancesCount)) : (n === I.ColorKind && (n = I.ColorInstanceKind), (i = this._userThinInstanceBuffersStorage) != null && i.vertexBuffers[n] && (this.thinInstanceAllowAutomaticStaticBufferRecreation && !this._userThinInstanceBuffersStorage.vertexBuffers[n].isUpdatable() && this._thinInstanceRecreateBuffer(n), this._userThinInstanceBuffersStorage.vertexBuffers[n].updateDirectly(this._userThinInstanceBuffersStorage.data[n], 0)));\n};\nB.prototype.thinInstancePartialBufferUpdate = function(n, e, t) {\n var i;\n n === \"matrix\" ? this._thinInstanceDataStorage.matrixBuffer && this._thinInstanceDataStorage.matrixBuffer.updateDirectly(e, t) : (n === I.ColorKind && (n = I.ColorInstanceKind), (i = this._userThinInstanceBuffersStorage) != null && i.vertexBuffers[n] && this._userThinInstanceBuffersStorage.vertexBuffers[n].updateDirectly(e, t));\n};\nB.prototype.thinInstanceGetWorldMatrices = function() {\n if (!this._thinInstanceDataStorage.matrixData || !this._thinInstanceDataStorage.matrixBuffer)\n return [];\n const n = this._thinInstanceDataStorage.matrixData;\n if (!this._thinInstanceDataStorage.worldMatrices) {\n this._thinInstanceDataStorage.worldMatrices = [];\n for (let e = 0; e < this._thinInstanceDataStorage.instancesCount; ++e)\n this._thinInstanceDataStorage.worldMatrices[e] = L.FromArray(n, e * 16);\n }\n return this._thinInstanceDataStorage.worldMatrices;\n};\nB.prototype.thinInstanceRefreshBoundingInfo = function(n = !1, e = !1, t = !1) {\n if (!this._thinInstanceDataStorage.matrixData || !this._thinInstanceDataStorage.matrixBuffer)\n return;\n const i = this._thinInstanceDataStorage.boundingVectors;\n if (n || !this.rawBoundingInfo) {\n i.length = 0, this.refreshBoundingInfo(e, t);\n const a = this.getBoundingInfo();\n this.rawBoundingInfo = new Cr(a.minimum, a.maximum);\n }\n const r = this.getBoundingInfo(), s = this._thinInstanceDataStorage.matrixData;\n if (i.length === 0)\n for (let a = 0; a < r.boundingBox.vectors.length; ++a)\n i.push(r.boundingBox.vectors[a].clone());\n z.Vector3[0].setAll(Number.POSITIVE_INFINITY), z.Vector3[1].setAll(Number.NEGATIVE_INFINITY);\n for (let a = 0; a < this._thinInstanceDataStorage.instancesCount; ++a) {\n L.FromArrayToRef(s, a * 16, z.Matrix[0]);\n for (let o = 0; o < i.length; ++o)\n _.TransformCoordinatesToRef(i[o], z.Matrix[0], z.Vector3[2]), z.Vector3[0].minimizeInPlace(z.Vector3[2]), z.Vector3[1].maximizeInPlace(z.Vector3[2]);\n }\n r.reConstruct(z.Vector3[0], z.Vector3[1]), this._updateBoundingInfo();\n};\nB.prototype._thinInstanceRecreateBuffer = function(n, e = !0) {\n var t, i, r;\n n === \"matrix\" ? ((t = this._thinInstanceDataStorage.matrixBuffer) == null || t.dispose(), this._thinInstanceDataStorage.matrixBuffer = this._thinInstanceCreateMatrixBuffer(\"world\", this._thinInstanceDataStorage.matrixData, e)) : n === \"previousMatrix\" ? this._scene.needsPreviousWorldMatrices && ((i = this._thinInstanceDataStorage.previousMatrixBuffer) == null || i.dispose(), this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", this._thinInstanceDataStorage.previousMatrixData ?? this._thinInstanceDataStorage.matrixData, e)) : (n === I.ColorKind && (n = I.ColorInstanceKind), (r = this._userThinInstanceBuffersStorage.vertexBuffers[n]) == null || r.dispose(), this._userThinInstanceBuffersStorage.vertexBuffers[n] = new I(this.getEngine(), this._userThinInstanceBuffersStorage.data[n], n, !e, !1, this._userThinInstanceBuffersStorage.strides[n], !0), this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[n]));\n};\nB.prototype._thinInstanceUpdateBufferSize = function(n, e = 1) {\n var l, c, h;\n n === I.ColorKind && (n = I.ColorInstanceKind);\n const t = n === \"matrix\";\n if (!t && (!this._userThinInstanceBuffersStorage || !this._userThinInstanceBuffersStorage.strides[n]))\n return;\n const i = t ? 16 : this._userThinInstanceBuffersStorage.strides[n], r = t ? this._thinInstanceDataStorage.matrixBufferSize : this._userThinInstanceBuffersStorage.sizes[n];\n let s = t ? this._thinInstanceDataStorage.matrixData : this._userThinInstanceBuffersStorage.data[n];\n const a = (this._thinInstanceDataStorage.instancesCount + e) * i;\n let o = r;\n for (; o < a; )\n o *= 2;\n if (!s || r != o) {\n if (!s)\n s = new Float32Array(o);\n else {\n const u = new Float32Array(o);\n u.set(s, 0), s = u;\n }\n t ? ((l = this._thinInstanceDataStorage.matrixBuffer) == null || l.dispose(), this._thinInstanceDataStorage.matrixBuffer = this._thinInstanceCreateMatrixBuffer(\"world\", s, !1), this._thinInstanceDataStorage.matrixData = s, this._thinInstanceDataStorage.matrixBufferSize = o, this._scene.needsPreviousWorldMatrices && !this._thinInstanceDataStorage.previousMatrixData && ((c = this._thinInstanceDataStorage.previousMatrixBuffer) == null || c.dispose(), this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", s, !1))) : ((h = this._userThinInstanceBuffersStorage.vertexBuffers[n]) == null || h.dispose(), this._userThinInstanceBuffersStorage.data[n] = s, this._userThinInstanceBuffersStorage.sizes[n] = o, this._userThinInstanceBuffersStorage.vertexBuffers[n] = new I(this.getEngine(), s, n, !0, !1, i, !0), this.setVerticesBuffer(this._userThinInstanceBuffersStorage.vertexBuffers[n]));\n }\n};\nB.prototype._thinInstanceInitializeUserStorage = function() {\n this._userThinInstanceBuffersStorage || (this._userThinInstanceBuffersStorage = {\n data: {},\n sizes: {},\n vertexBuffers: {},\n strides: {}\n });\n};\nB.prototype._disposeThinInstanceSpecificData = function() {\n var n;\n (n = this._thinInstanceDataStorage) != null && n.matrixBuffer && (this._thinInstanceDataStorage.matrixBuffer.dispose(), this._thinInstanceDataStorage.matrixBuffer = null);\n};\nvar b;\n(function(n) {\n n[n.Int = 1] = \"Int\", n[n.Float = 2] = \"Float\", n[n.Vector2 = 4] = \"Vector2\", n[n.Vector3 = 8] = \"Vector3\", n[n.Vector4 = 16] = \"Vector4\", n[n.Matrix = 32] = \"Matrix\", n[n.Geometry = 64] = \"Geometry\", n[n.Texture = 128] = \"Texture\", n[n.AutoDetect = 1024] = \"AutoDetect\", n[n.BasedOnInput = 2048] = \"BasedOnInput\", n[n.Undefined = 4096] = \"Undefined\", n[n.All = 4095] = \"All\";\n})(b || (b = {}));\nvar en;\n(function(n) {\n n[n.Compatible = 0] = \"Compatible\", n[n.TypeIncompatible = 1] = \"TypeIncompatible\", n[n.HierarchyIssue = 2] = \"HierarchyIssue\";\n})(en || (en = {}));\nvar Ro;\n(function(n) {\n n[n.Input = 0] = \"Input\", n[n.Output = 1] = \"Output\";\n})(Ro || (Ro = {}));\nclass xg {\n /** Gets the direction of the point */\n get direction() {\n return this._direction;\n }\n /**\n * Gets or sets the connection point type (default is float)\n */\n get type() {\n if (this._type === b.AutoDetect) {\n if (this._ownerBlock.isInput)\n return this._ownerBlock.type;\n if (this._connectedPoint)\n return this._connectedPoint.type;\n if (this._linkedConnectionSource && this._linkedConnectionSource.isConnected)\n return this._linkedConnectionSource.type;\n }\n if (this._type === b.BasedOnInput) {\n if (this._typeConnectionSource)\n return !this._typeConnectionSource.isConnected && this._defaultConnectionPointType ? this._defaultConnectionPointType : this._typeConnectionSource.type;\n if (this._defaultConnectionPointType)\n return this._defaultConnectionPointType;\n }\n return this._type;\n }\n set type(e) {\n this._type = e;\n }\n /**\n * Gets a boolean indicating that the current point is connected to another NodeMaterialBlock\n */\n get isConnected() {\n return this.connectedPoint !== null || this.hasEndpoints;\n }\n /** Get the other side of the connection (if any) */\n get connectedPoint() {\n return this._connectedPoint;\n }\n /** Get the block that owns this connection point */\n get ownerBlock() {\n return this._ownerBlock;\n }\n /** Get the block connected on the other side of this connection (if any) */\n get sourceBlock() {\n return this._connectedPoint ? this._connectedPoint.ownerBlock : null;\n }\n /** Get the block connected on the endpoints of this connection (if any) */\n get connectedBlocks() {\n return this._endpoints.length === 0 ? [] : this._endpoints.map((e) => e.ownerBlock);\n }\n /** Gets the list of connected endpoints */\n get endpoints() {\n return this._endpoints;\n }\n /** Gets a boolean indicating if that output point is connected to at least one input */\n get hasEndpoints() {\n return this._endpoints && this._endpoints.length > 0;\n }\n /** Get the inner type (ie AutoDetect for instance instead of the inferred one) */\n get innerType() {\n return this._linkedConnectionSource && this._linkedConnectionSource.isConnected ? this.type : this._type;\n }\n /** @internal */\n _resetCounters() {\n this._callCount = 0, this._executionCount = 0;\n }\n /**\n * Gets the number of times this point was called\n */\n get callCount() {\n return this._callCount;\n }\n /**\n * Gets the number of times this point was executed\n */\n get executionCount() {\n return this._executionCount;\n }\n /**\n * Gets the value represented by this connection point\n * @param state current evaluation state\n * @returns the connected value or the value if nothing is connected\n */\n getConnectedValue(e) {\n var t;\n return this.isConnected ? (t = this._connectedPoint) != null && t._storedFunction ? (this._connectedPoint._callCount++, this._connectedPoint._executionCount++, this._connectedPoint._storedFunction(e)) : (this._connectedPoint._callCount++, this._connectedPoint._executionCount = 1, this._connectedPoint._storedValue) : (this._callCount++, this._executionCount = 1, this.value);\n }\n /**\n * Creates a new connection point\n * @param name defines the connection point name\n * @param ownerBlock defines the block hosting this connection point\n * @param direction defines the direction of the connection point\n */\n constructor(e, t, i) {\n this._connectedPoint = null, this._storedValue = null, this._storedFunction = null, this._acceptedConnectionPointType = null, this._endpoints = new Array(), this._type = b.Geometry, this._linkedConnectionSource = null, this._typeConnectionSource = null, this._defaultConnectionPointType = null, this.acceptedConnectionPointTypes = [], this.excludedConnectionPointTypes = [], this.onConnectionObservable = new he(), this.onDisconnectionObservable = new he(), this.isExposedOnFrame = !1, this.exposedPortPosition = -1, this.defaultValue = null, this.value = null, this.valueMin = null, this.valueMax = null, this._callCount = 0, this._executionCount = 0, this._ownerBlock = t, this.name = e, this._direction = i;\n }\n /**\n * Gets the current class name e.g. \"NodeMaterialConnectionPoint\"\n * @returns the class name\n */\n getClassName() {\n return \"NodeGeometryConnectionPoint\";\n }\n /**\n * Gets a boolean indicating if the current point can be connected to another point\n * @param connectionPoint defines the other connection point\n * @returns a boolean\n */\n canConnectTo(e) {\n return this.checkCompatibilityState(e) === en.Compatible;\n }\n /**\n * Gets a number indicating if the current point can be connected to another point\n * @param connectionPoint defines the other connection point\n * @returns a number defining the compatibility state\n */\n checkCompatibilityState(e) {\n const t = this._ownerBlock, i = e.ownerBlock;\n if (this.type !== e.type && e.innerType !== b.AutoDetect)\n return e.acceptedConnectionPointTypes && e.acceptedConnectionPointTypes.indexOf(this.type) !== -1 ? en.Compatible : en.TypeIncompatible;\n if (e.excludedConnectionPointTypes && e.excludedConnectionPointTypes.indexOf(this.type) !== -1)\n return en.TypeIncompatible;\n let r = i, s = t;\n return this.direction === Ro.Input && (r = t, s = i), r.isAnAncestorOf(s) ? en.HierarchyIssue : en.Compatible;\n }\n /**\n * Connect this point to another connection point\n * @param connectionPoint defines the other connection point\n * @param ignoreConstraints defines if the system will ignore connection type constraints (default is false)\n * @returns the current connection point\n */\n connectTo(e, t = !1) {\n if (!t && !this.canConnectTo(e))\n throw \"Cannot connect these two connectors.\";\n return this._endpoints.push(e), e._connectedPoint = this, this.onConnectionObservable.notifyObservers(e), e.onConnectionObservable.notifyObservers(this), this;\n }\n /**\n * Disconnect this point from one of his endpoint\n * @param endpoint defines the other connection point\n * @returns the current connection point\n */\n disconnectFrom(e) {\n const t = this._endpoints.indexOf(e);\n return t === -1 ? this : (this._endpoints.splice(t, 1), e._connectedPoint = null, this.onDisconnectionObservable.notifyObservers(e), e.onDisconnectionObservable.notifyObservers(this), this);\n }\n /**\n * Fill the list of excluded connection point types with all types other than those passed in the parameter\n * @param mask Types (ORed values of NodeMaterialBlockConnectionPointTypes) that are allowed, and thus will not be pushed to the excluded list\n */\n addExcludedConnectionPointFromAllowedTypes(e) {\n let t = 1;\n for (; t < b.All; )\n e & t || this.excludedConnectionPointTypes.push(t), t = t << 1;\n }\n /**\n * Serializes this point in a JSON representation\n * @param isInput defines if the connection point is an input (default is true)\n * @returns the serialized point object\n */\n serialize(e = !0) {\n const t = {};\n return t.name = this.name, t.displayName = this.displayName, this.value !== void 0 && this.value !== null && (this.value.asArray ? (t.valueType = \"BABYLON.\" + this.value.getClassName(), t.value = this.value.asArray()) : (t.valueType = \"number\", t.value = this.value)), e && this.connectedPoint && (t.inputName = this.name, t.targetBlockId = this.connectedPoint.ownerBlock.uniqueId, t.targetConnectionName = this.connectedPoint.name), t;\n }\n /**\n * Release resources\n */\n dispose() {\n this.onConnectionObservable.clear(), this.onDisconnectionObservable.clear();\n }\n}\nclass Ve {\n /**\n * Gets the time spent to build this block (in ms)\n */\n get buildExecutionTime() {\n return this._buildExecutionTime;\n }\n /**\n * Gets the list of input points\n */\n get inputs() {\n return this._inputs;\n }\n /** Gets the list of output points */\n get outputs() {\n return this._outputs;\n }\n /**\n * Gets or set the name of the block\n */\n get name() {\n return this._name;\n }\n set name(e) {\n this._name = e;\n }\n /**\n * Gets a boolean indicating if this block is an input\n */\n get isInput() {\n return this._isInput;\n }\n /**\n * Gets a boolean indicating if this block is a teleport out\n */\n get isTeleportOut() {\n return this._isTeleportOut;\n }\n /**\n * Gets a boolean indicating if this block is a teleport in\n */\n get isTeleportIn() {\n return this._isTeleportIn;\n }\n /**\n * Gets a boolean indicating if this block is a debug block\n */\n get isDebug() {\n return this._isDebug;\n }\n /**\n * Gets a boolean indicating that this block can only be used once per NodeGeometry\n */\n get isUnique() {\n return this._isUnique;\n }\n /**\n * Gets the current class name e.g. \"NodeGeometryBlock\"\n * @returns the class name\n */\n getClassName() {\n return \"NodeGeometryBlock\";\n }\n _inputRename(e) {\n return e;\n }\n _outputRename(e) {\n return e;\n }\n /**\n * Checks if the current block is an ancestor of a given block\n * @param block defines the potential descendant block to check\n * @returns true if block is a descendant\n */\n isAnAncestorOf(e) {\n for (const t of this._outputs)\n if (t.hasEndpoints) {\n for (const i of t.endpoints)\n if (i.ownerBlock === e || i.ownerBlock.isAnAncestorOf(e))\n return !0;\n }\n return !1;\n }\n /**\n * Checks if the current block is an ancestor of a given type\n * @param type defines the potential type to check\n * @returns true if block is a descendant\n */\n isAnAncestorOfType(e) {\n if (this.getClassName() === e)\n return !0;\n for (const t of this._outputs)\n if (t.hasEndpoints) {\n for (const i of t.endpoints)\n if (i.ownerBlock.isAnAncestorOfType(e))\n return !0;\n }\n return !1;\n }\n /**\n * Get the first descendant using a predicate\n * @param predicate defines the predicate to check\n * @returns descendant or null if none found\n */\n getDescendantOfPredicate(e) {\n if (e(this))\n return this;\n for (const t of this._outputs)\n if (t.hasEndpoints)\n for (const i of t.endpoints) {\n const r = i.ownerBlock.getDescendantOfPredicate(e);\n if (r)\n return r;\n }\n return null;\n }\n /**\n * Creates a new NodeGeometryBlock\n * @param name defines the block name\n */\n constructor(e) {\n this._name = \"\", this._isInput = !1, this._isTeleportOut = !1, this._isTeleportIn = !1, this._isDebug = !1, this._isUnique = !1, this._buildExecutionTime = 0, this.onBuildObservable = new he(), this._inputs = new Array(), this._outputs = new Array(), this._codeVariableName = \"\", this.visibleOnFrame = !1, this._name = e, this.uniqueId = sf.UniqueId;\n }\n /**\n * Register a new input. Must be called inside a block constructor\n * @param name defines the connection point name\n * @param type defines the connection point type\n * @param isOptional defines a boolean indicating that this input can be omitted\n * @param value value to return if there is no connection\n * @param valueMin min value accepted for value\n * @param valueMax max value accepted for value\n * @returns the current block\n */\n registerInput(e, t, i = !1, r, s, a) {\n const o = new xg(e, this, Ro.Input);\n return o.type = t, o.isOptional = i, o.defaultValue = r, o.value = r, o.valueMin = s, o.valueMax = a, this._inputs.push(o), this;\n }\n /**\n * Register a new output. Must be called inside a block constructor\n * @param name defines the connection point name\n * @param type defines the connection point type\n * @param point an already created connection point. If not provided, create a new one\n * @returns the current block\n */\n registerOutput(e, t, i) {\n return i = i ?? new xg(e, this, Ro.Output), i.type = t, this._outputs.push(i), this;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _buildBlock(e) {\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _customBuildStep(e) {\n }\n /**\n * Build the current node and generate the vertex data\n * @param state defines the current generation state\n * @returns true if already built\n */\n build(e) {\n if (this._buildId === e.buildId)\n return !0;\n if (this._outputs.length > 0) {\n if (!this._outputs.some((i) => i.hasEndpoints) && !this.isDebug)\n return !1;\n this.outputs.forEach((i) => i._resetCounters());\n }\n this._buildId = e.buildId;\n for (const i of this._inputs) {\n if (!i.connectedPoint) {\n i.isOptional || e.notConnectedNonOptionalInputs.push(i);\n continue;\n }\n const r = i.connectedPoint.ownerBlock;\n r && r !== this && r.build(e);\n }\n this._customBuildStep(e), e.verbose && ne.Log(`Building ${this.name} [${this.getClassName()}]`);\n const t = sr.Now;\n this._buildBlock(e), this._buildExecutionTime = sr.Now - t;\n for (const i of this._outputs)\n for (const r of i.endpoints) {\n const s = r.ownerBlock;\n s && s.build(e);\n }\n return this.onBuildObservable.notifyObservers(this), !1;\n }\n _linkConnectionTypes(e, t, i = !1) {\n i ? this._inputs[t]._acceptedConnectionPointType = this._inputs[e] : this._inputs[e]._linkedConnectionSource = this._inputs[t], this._inputs[t]._linkedConnectionSource = this._inputs[e];\n }\n /**\n * Initialize the block and prepare the context for build\n */\n initialize() {\n }\n /**\n * Lets the block try to connect some inputs automatically\n */\n autoConfigure() {\n }\n /**\n * Find an input by its name\n * @param name defines the name of the input to look for\n * @returns the input or null if not found\n */\n getInputByName(e) {\n const t = this._inputs.filter((i) => i.name === e);\n return t.length ? t[0] : null;\n }\n /**\n * Find an output by its name\n * @param name defines the name of the output to look for\n * @returns the output or null if not found\n */\n getOutputByName(e) {\n const t = this._outputs.filter((i) => i.name === e);\n return t.length ? t[0] : null;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = {};\n e.customType = \"BABYLON.\" + this.getClassName(), e.id = this.uniqueId, e.name = this.name, e.inputs = [], e.outputs = [];\n for (const t of this.inputs)\n e.inputs.push(t.serialize());\n for (const t of this.outputs)\n e.outputs.push(t.serialize(!1));\n return e;\n }\n /**\n * @internal\n */\n _deserialize(e) {\n this._name = e.name, this.comments = e.comments, this.visibleOnFrame = !!e.visibleOnFrame, this._deserializePortDisplayNamesAndExposedOnFrame(e);\n }\n _deserializePortDisplayNamesAndExposedOnFrame(e) {\n const t = e.inputs, i = e.outputs;\n t && t.forEach((r) => {\n const s = this.inputs.find((a) => a.name === r.name);\n if (s && (r.displayName && (s.displayName = r.displayName), r.isExposedOnFrame && (s.isExposedOnFrame = r.isExposedOnFrame, s.exposedPortPosition = r.exposedPortPosition), r.value !== void 0 && r.value !== null))\n if (r.valueType === \"number\")\n s.value = r.value;\n else {\n const a = mr(r.valueType);\n a && (s.value = a.FromArray(r.value));\n }\n }), i && i.forEach((r, s) => {\n r.displayName && (this.outputs[s].displayName = r.displayName), r.isExposedOnFrame && (this.outputs[s].isExposedOnFrame = r.isExposedOnFrame, this.outputs[s].exposedPortPosition = r.exposedPortPosition);\n });\n }\n _dumpPropertiesCode() {\n return `${this._codeVariableName}.visibleOnFrame = ${this.visibleOnFrame};\n`;\n }\n /**\n * @internal\n */\n _dumpCodeForOutputConnections(e) {\n let t = \"\";\n if (e.indexOf(this) !== -1)\n return t;\n e.push(this);\n for (const i of this.inputs) {\n if (!i.isConnected)\n continue;\n const r = i.connectedPoint, s = r.ownerBlock;\n t += s._dumpCodeForOutputConnections(e), t += `${s._codeVariableName}.${s._outputRename(r.name)}.connectTo(${this._codeVariableName}.${this._inputRename(i.name)});\n`;\n }\n return t;\n }\n /**\n * @internal\n */\n _dumpCode(e, t) {\n t.push(this);\n const i = this.name.replace(/[^A-Za-z_]+/g, \"\");\n if (this._codeVariableName = i || `${this.getClassName()}_${this.uniqueId}`, e.indexOf(this._codeVariableName) !== -1) {\n let a = 0;\n do\n a++, this._codeVariableName = i + a;\n while (e.indexOf(this._codeVariableName) !== -1);\n }\n e.push(this._codeVariableName);\n let r = `\n// ${this.getClassName()}\n`;\n this.comments && (r += `// ${this.comments}\n`);\n const s = this.getClassName();\n if (s === \"GeometryInputBlock\") {\n const o = this.type;\n r += `var ${this._codeVariableName} = new BABYLON.GeometryInputBlock(\"${this.name}\", ${o});\n`;\n } else\n r += `var ${this._codeVariableName} = new BABYLON.${s}(\"${this.name}\");\n`;\n r += this._dumpPropertiesCode();\n for (const a of this.inputs) {\n if (!a.isConnected)\n continue;\n const l = a.connectedPoint.ownerBlock;\n t.indexOf(l) === -1 && (r += l._dumpCode(e, t));\n }\n for (const a of this.outputs)\n if (a.hasEndpoints)\n for (const o of a.endpoints) {\n const l = o.ownerBlock;\n l && t.indexOf(l) === -1 && (r += l._dumpCode(e, t));\n }\n return r;\n }\n /**\n * Clone the current block to a new identical block\n * @returns a copy of the current block\n */\n clone() {\n const e = this.serialize(), t = mr(e.customType);\n if (t) {\n const i = new t();\n return i._deserialize(e), i;\n }\n return null;\n }\n /**\n * Release resources\n */\n dispose() {\n for (const e of this.inputs)\n e.dispose();\n for (const e of this.outputs)\n e.dispose();\n this.onBuildObservable.clear();\n }\n}\nP([\n w(\"comment\")\n], Ve.prototype, \"comments\", void 0);\nclass D0 extends Ve {\n /**\n * Gets the current vertex data if the graph was successfully built\n */\n get currentVertexData() {\n return this._vertexData;\n }\n /**\n * Create a new GeometryOutputBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._vertexData = null, this._isUnique = !0, this.registerInput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryOutputBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n _buildBlock(e) {\n e.vertexData = this.geometry.getConnectedValue(e), this._vertexData = e.vertexData;\n }\n}\nRe(\"BABYLON.GeometryOutputBlock\", D0);\nvar ct;\n(function(n) {\n n[n.None = 0] = \"None\", n[n.Positions = 1] = \"Positions\", n[n.Normals = 2] = \"Normals\", n[n.Tangents = 3] = \"Tangents\", n[n.UV = 4] = \"UV\", n[n.UV2 = 5] = \"UV2\", n[n.UV3 = 6] = \"UV3\", n[n.UV4 = 7] = \"UV4\", n[n.UV5 = 8] = \"UV5\", n[n.UV6 = 9] = \"UV6\", n[n.Colors = 10] = \"Colors\", n[n.VertexID = 11] = \"VertexID\", n[n.FaceID = 12] = \"FaceID\", n[n.GeometryID = 13] = \"GeometryID\", n[n.CollectionID = 14] = \"CollectionID\", n[n.LoopID = 15] = \"LoopID\", n[n.InstanceID = 16] = \"InstanceID\";\n})(ct || (ct = {}));\nclass BP {\n constructor() {\n this._rotationMatrix = new L(), this._scalingMatrix = new L(), this._positionMatrix = new L(), this._scalingRotationMatrix = new L(), this._transformMatrix = new L(), this._tempVector3 = new _(), this.notConnectedNonOptionalInputs = [], this.noContextualData = [], this.vertexData = null, this._geometryContext = null, this._executionContext = null, this._instancingContext = null, this._geometryContextStack = [], this._executionContextStack = [], this._instancingContextStack = [];\n }\n /** Gets or sets the geometry context */\n get geometryContext() {\n return this._geometryContext;\n }\n /** Gets or sets the execution context */\n get executionContext() {\n return this._executionContext;\n }\n /** Gets or sets the instancing context */\n get instancingContext() {\n return this._instancingContext;\n }\n /**\n * Push the new active geometry context\n * @param geometryContext defines the geometry context\n */\n pushGeometryContext(e) {\n this._geometryContext = e, this._geometryContextStack.push(this._geometryContext);\n }\n /**\n * Push the new active execution context\n * @param executionContext defines the execution context\n */\n pushExecutionContext(e) {\n this._executionContext = e, this._executionContextStack.push(this._executionContext);\n }\n /**\n * Push the new active instancing context\n * @param instancingContext defines the instancing context\n */\n pushInstancingContext(e) {\n this._instancingContext = e, this._instancingContextStack.push(this._instancingContext);\n }\n /**\n * Remove current geometry context and restore the previous one\n */\n restoreGeometryContext() {\n this._geometryContextStack.pop(), this._geometryContext = this._geometryContextStack.length > 0 ? this._geometryContextStack[this._geometryContextStack.length - 1] : null;\n }\n /**\n * Remove current execution context and restore the previous one\n */\n restoreExecutionContext() {\n this._executionContextStack.pop(), this._executionContext = this._executionContextStack.length > 0 ? this._executionContextStack[this._executionContextStack.length - 1] : null;\n }\n /**\n * Remove current isntancing context and restore the previous one\n */\n restoreInstancingContext() {\n this._instancingContextStack.pop(), this._instancingContext = this._instancingContextStack.length > 0 ? this._instancingContextStack[this._instancingContextStack.length - 1] : null;\n }\n /**\n * Gets the value associated with a contextual source\n * @param source Source of the contextual value\n * @param skipWarning Do not store the warning for reporting if true\n * @returns the value associated with the source\n */\n getContextualValue(e, t = !1) {\n if (!this.executionContext)\n return t || this.noContextualData.push(e), null;\n const i = this.executionContext.getExecutionIndex();\n switch (e) {\n case ct.Positions:\n return this.executionContext.getOverridePositionsContextualValue ? this.executionContext.getOverridePositionsContextualValue() : !this.geometryContext || !this.geometryContext.positions ? _.Zero() : _.FromArray(this.geometryContext.positions, i * 3);\n case ct.Normals:\n return this.executionContext.getOverrideNormalsContextualValue ? this.executionContext.getOverrideNormalsContextualValue() : !this.geometryContext || !this.geometryContext.normals ? _.Zero() : _.FromArray(this.geometryContext.normals, i * 3);\n case ct.Colors:\n return !this.geometryContext || !this.geometryContext.colors ? Ke.Zero() : Ke.FromArray(this.geometryContext.colors, i * 4);\n case ct.Tangents:\n return !this.geometryContext || !this.geometryContext.tangents ? Ke.Zero() : Ke.FromArray(this.geometryContext.tangents, i * 4);\n case ct.UV:\n return this.executionContext.getOverrideUVs1ContextualValue ? this.executionContext.getOverrideUVs1ContextualValue() : !this.geometryContext || !this.geometryContext.uvs ? me.Zero() : me.FromArray(this.geometryContext.uvs, i * 2);\n case ct.UV2:\n return !this.geometryContext || !this.geometryContext.uvs2 ? me.Zero() : me.FromArray(this.geometryContext.uvs2, i * 2);\n case ct.UV3:\n return !this.geometryContext || !this.geometryContext.uvs3 ? me.Zero() : me.FromArray(this.geometryContext.uvs3, i * 2);\n case ct.UV4:\n return !this.geometryContext || !this.geometryContext.uvs4 ? me.Zero() : me.FromArray(this.geometryContext.uvs4, i * 2);\n case ct.UV5:\n return !this.geometryContext || !this.geometryContext.uvs5 ? me.Zero() : me.FromArray(this.geometryContext.uvs5, i * 2);\n case ct.UV6:\n return !this.geometryContext || !this.geometryContext.uvs6 ? me.Zero() : me.FromArray(this.geometryContext.uvs6, i * 2);\n case ct.VertexID:\n return i;\n case ct.FaceID:\n return this.executionContext.getExecutionFaceIndex();\n case ct.LoopID:\n return this.executionContext.getExecutionLoopIndex();\n case ct.InstanceID:\n return this.instancingContext ? this.instancingContext.getInstanceIndex() : 0;\n case ct.GeometryID:\n return this.geometryContext ? this.geometryContext.uniqueId : 0;\n case ct.CollectionID:\n return !this.geometryContext || !this.geometryContext.metadata ? 0 : this.geometryContext.metadata.collectionId || 0;\n }\n return null;\n }\n /**\n * Adapt a value to a target type\n * @param source defines the value to adapt\n * @param targetType defines the target type\n * @returns the adapted value\n */\n adapt(e, t) {\n const i = e.getConnectedValue(this) || 0;\n if (e.type === t)\n return i;\n switch (t) {\n case b.Vector2:\n return new me(i, i);\n case b.Vector3:\n return new _(i, i, i);\n case b.Vector4:\n return new Ke(i, i, i, i);\n }\n return null;\n }\n /**\n * Adapt an input value to a target type\n * @param source defines the value to adapt\n * @param targetType defines the target type\n * @param defaultValue defines the default value to use if not connected\n * @returns the adapted value\n */\n adaptInput(e, t, i) {\n var s;\n if (!e.isConnected)\n return e.value || i;\n const r = e.getConnectedValue(this);\n if (((s = e._connectedPoint) == null ? void 0 : s.type) === t)\n return r;\n switch (t) {\n case b.Vector2:\n return new me(r, r);\n case b.Vector3:\n return new _(r, r, r);\n case b.Vector4:\n return new Ke(r, r, r, r);\n }\n return null;\n }\n /**\n * Emits console errors and exceptions if there is a failing check\n */\n emitErrors() {\n let e = \"\";\n for (const t of this.notConnectedNonOptionalInputs)\n e += `input ${t.name} from block ${t.ownerBlock.name}[${t.ownerBlock.getClassName()}] is not connected and is not optional.\n`;\n for (const t of this.noContextualData)\n e += `Contextual input ${ct[t]} has no context to pull data from (must be connected to a setXXX block or a instantiateXXX block).\n`;\n if (e)\n throw `Build of NodeGeometry failed:\n` + e;\n }\n /** @internal */\n _instantiate(e, t, i, r, s) {\n L.ScalingToRef(r.x, r.y, r.z, this._scalingMatrix), L.RotationYawPitchRollToRef(i.y, i.x, i.z, this._rotationMatrix), L.TranslationToRef(t.x, t.y, t.z, this._positionMatrix), this._scalingMatrix.multiplyToRef(this._rotationMatrix, this._scalingRotationMatrix), this._scalingRotationMatrix.multiplyToRef(this._positionMatrix, this._transformMatrix);\n for (let a = 0; a < e.positions.length; a += 3)\n this._tempVector3.fromArray(e.positions, a), _.TransformCoordinatesToRef(this._tempVector3, this._transformMatrix, this._tempVector3), this._tempVector3.toArray(e.positions, a), e.normals && (this._tempVector3.fromArray(e.normals, a), _.TransformNormalToRef(this._tempVector3, this._scalingRotationMatrix, this._tempVector3), this._tempVector3.toArray(e.normals, a));\n s.push(e);\n }\n /** @internal */\n _instantiateWithMatrix(e, t, i) {\n for (let r = 0; r < e.positions.length; r += 3)\n this._tempVector3.fromArray(e.positions, r), _.TransformCoordinatesToRef(this._tempVector3, t, this._tempVector3), this._tempVector3.toArray(e.positions, r), e.normals && (this._tempVector3.fromArray(e.normals, r), _.TransformNormalToRef(this._tempVector3, t, this._tempVector3), this._tempVector3.toArray(e.normals, r));\n i.push(e);\n }\n /** @internal */\n _instantiateWithPositionAndMatrix(e, t, i, r) {\n L.TranslationToRef(t.x, t.y, t.z, this._positionMatrix), i.multiplyToRef(this._positionMatrix, this._transformMatrix);\n for (let s = 0; s < e.positions.length; s += 3)\n this._tempVector3.fromArray(e.positions, s), _.TransformCoordinatesToRef(this._tempVector3, this._transformMatrix, this._tempVector3), this._tempVector3.toArray(e.positions, s), e.normals && (this._tempVector3.fromArray(e.normals, s), _.TransformNormalToRef(this._tempVector3, this._transformMatrix, this._tempVector3), this._tempVector3.toArray(e.normals, s));\n r.push(e);\n }\n}\nclass si extends Ve {\n /**\n * Gets or sets the connection point type (default is float)\n */\n get type() {\n if (this._type === b.AutoDetect && this.value != null) {\n if (!isNaN(this.value))\n return this._type = b.Float, this._type;\n switch (this.value.getClassName()) {\n case \"Vector2\":\n return this._type = b.Vector2, this._type;\n case \"Vector3\":\n return this._type = b.Vector3, this._type;\n case \"Vector4\":\n return this._type = b.Vector4, this._type;\n case \"Matrix\":\n return this._type = b.Matrix, this._type;\n }\n }\n return this._type;\n }\n /**\n * Gets a boolean indicating that the current connection point is a contextual value\n */\n get isContextual() {\n return this._contextualSource !== ct.None;\n }\n /**\n * Gets or sets the current contextual value\n */\n get contextualValue() {\n return this._contextualSource;\n }\n set contextualValue(e) {\n switch (this._contextualSource = e, e) {\n case ct.Positions:\n case ct.Normals:\n this._type = b.Vector3;\n break;\n case ct.Colors:\n case ct.Tangents:\n this._type = b.Vector4;\n break;\n case ct.UV:\n case ct.UV2:\n case ct.UV3:\n case ct.UV4:\n case ct.UV5:\n case ct.UV6:\n this._type = b.Vector2;\n break;\n case ct.VertexID:\n case ct.GeometryID:\n case ct.CollectionID:\n case ct.FaceID:\n case ct.LoopID:\n case ct.InstanceID:\n this._type = b.Int;\n break;\n }\n this.output && (this.output.type = this._type);\n }\n /**\n * Creates a new InputBlock\n * @param name defines the block name\n * @param type defines the type of the input (can be set to NodeGeometryBlockConnectionPointTypes.AutoDetect)\n */\n constructor(e, t = b.AutoDetect) {\n super(e), this._type = b.Undefined, this._contextualSource = ct.None, this.min = 0, this.max = 0, this.groupInInspector = \"\", this.onValueChangedObservable = new he(), this._type = t, this._isInput = !0, this.setDefaultValue(), this.registerOutput(\"output\", t);\n }\n /**\n * Gets or sets the value of that point.\n * Please note that this value will be ignored if valueCallback is defined\n */\n get value() {\n return this._storedValue;\n }\n set value(e) {\n this.type === b.Float && this.min !== this.max && (e = Math.max(this.min, e), e = Math.min(this.max, e)), this._storedValue = e, this.onValueChangedObservable.notifyObservers(this);\n }\n /**\n * Gets or sets a callback used to get the value of that point.\n * Please note that setting this value will force the connection point to ignore the value property\n */\n get valueCallback() {\n return this._valueCallback;\n }\n set valueCallback(e) {\n this._valueCallback = e;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryInputBlock\";\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n /**\n * Set the input block to its default value (based on its type)\n */\n setDefaultValue() {\n switch (this.contextualValue = ct.None, this.type) {\n case b.Int:\n case b.Float:\n this.value = 0;\n break;\n case b.Vector2:\n this.value = me.Zero();\n break;\n case b.Vector3:\n this.value = _.Zero();\n break;\n case b.Vector4:\n this.value = Ke.Zero();\n break;\n case b.Matrix:\n this.value = L.Identity();\n break;\n }\n }\n _buildBlock(e) {\n super._buildBlock(e), this.isContextual ? (this.output._storedValue = null, this.output._storedFunction = (t) => t.getContextualValue(this._contextualSource)) : (this.output._storedFunction = null, this.output._storedValue = this.value);\n }\n dispose() {\n this.onValueChangedObservable.clear(), super.dispose();\n }\n _dumpPropertiesCode() {\n const e = this._codeVariableName;\n if (this.isContextual)\n return super._dumpPropertiesCode() + `${e}.contextualValue = BABYLON.NodeGeometryContextualSources.${ct[this._contextualSource]};\n`;\n const t = [];\n let i = \"\";\n switch (this.type) {\n case b.Float:\n case b.Int:\n i = `${this.value}`;\n break;\n case b.Vector2:\n i = `new BABYLON.Vector2(${this.value.x}, ${this.value.y})`;\n break;\n case b.Vector3:\n i = `new BABYLON.Vector3(${this.value.x}, ${this.value.y}, ${this.value.z})`;\n break;\n case b.Vector4:\n i = `new BABYLON.Vector4(${this.value.x}, ${this.value.y}, ${this.value.z}, ${this.value.w})`;\n break;\n }\n return t.push(`${e}.value = ${i}`), (this.type === b.Float || this.type === b.Int) && t.push(`${e}.min = ${this.min}`, `${e}.max = ${this.max}`), t.push(\"\"), super._dumpPropertiesCode() + t.join(`;\n`);\n }\n serialize() {\n const e = super.serialize();\n return e.type = this.type, e.contextualValue = this.contextualValue, e.min = this.min, e.max = this.max, e.groupInInspector = this.groupInInspector, this._storedValue !== null && !this.isContextual && (this._storedValue.asArray ? (e.valueType = \"BABYLON.\" + this._storedValue.getClassName(), e.value = this._storedValue.asArray()) : (e.valueType = \"number\", e.value = this._storedValue)), e;\n }\n _deserialize(e) {\n if (super._deserialize(e), this._type = e.type, this.contextualValue = e.contextualValue, this.min = e.min || 0, this.max = e.max || 0, this.groupInInspector = e.groupInInspector || \"\", !!e.valueType)\n if (e.valueType === \"number\")\n this._storedValue = e.value;\n else {\n const t = mr(e.valueType);\n t && (this._storedValue = t.FromArray(e.value));\n }\n }\n}\nRe(\"BABYLON.GeometryInputBlock\", si);\nvar ht;\n(function(n) {\n n[n.Boolean = 0] = \"Boolean\", n[n.Float = 1] = \"Float\", n[n.Int = 2] = \"Int\", n[n.Vector2 = 3] = \"Vector2\", n[n.List = 4] = \"List\";\n})(ht || (ht = {}));\nfunction gt(n, e = ht.Boolean, t = \"PROPERTIES\", i) {\n return (r, s) => {\n let a = r._propStore;\n a || (a = [], r._propStore = a), a.push({\n propertyName: s,\n displayName: n,\n type: e,\n groupName: t,\n options: i ?? {}\n });\n };\n}\nclass yf extends Ve {\n /**\n * Create a new BoxBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"size\", b.Float, !0, 1), this.registerInput(\"width\", b.Float, !0, 0), this.registerInput(\"height\", b.Float, !0, 0), this.registerInput(\"depth\", b.Float, !0, 0), this.registerInput(\"subdivisions\", b.Int, !0, 1), this.registerInput(\"subdivisionsX\", b.Int, !0, 0), this.registerInput(\"subdivisionsY\", b.Int, !0, 0), this.registerInput(\"subdivisionsZ\", b.Int, !0, 0), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"BoxBlock\";\n }\n /**\n * Gets the size input component\n */\n get size() {\n return this._inputs[0];\n }\n /**\n * Gets the width input component\n */\n get width() {\n return this._inputs[1];\n }\n /**\n * Gets the height input component\n */\n get height() {\n return this._inputs[2];\n }\n /**\n * Gets the depth input component\n */\n get depth() {\n return this._inputs[3];\n }\n /**\n * Gets the subdivisions input component\n */\n get subdivisions() {\n return this._inputs[4];\n }\n /**\n * Gets the subdivisionsX input component\n */\n get subdivisionsX() {\n return this._inputs[5];\n }\n /**\n * Gets the subdivisionsY input component\n */\n get subdivisionsY() {\n return this._inputs[6];\n }\n /**\n * Gets the subdivisionsZ input component\n */\n get subdivisionsZ() {\n return this._inputs[7];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.size.isConnected) {\n if (!this.width.isConnected && !this.height.isConnected && !this.depth.isConnected) {\n const e = new si(\"Size\");\n e.value = 1, e.output.connectTo(this.size);\n return;\n }\n if (!this.width.isConnected) {\n const e = new si(\"Width\");\n e.value = 1, e.output.connectTo(this.width);\n }\n if (!this.height.isConnected) {\n const e = new si(\"Height\");\n e.value = 1, e.output.connectTo(this.height);\n }\n if (!this.depth.isConnected) {\n const e = new si(\"Depth\");\n e.value = 1, e.output.connectTo(this.depth);\n }\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => {\n t.size = this.size.getConnectedValue(r), t.width = this.width.getConnectedValue(r), t.height = this.height.getConnectedValue(r), t.depth = this.depth.getConnectedValue(r);\n const s = this.subdivisions.getConnectedValue(r), a = this.subdivisionsX.getConnectedValue(r), o = this.subdivisionsY.getConnectedValue(r), l = this.subdivisionsZ.getConnectedValue(r);\n return s && (t.segments = s), a && (t.widthSegments = a), o && (t.heightSegments = o), l && (t.depthSegments = l), xb(t);\n };\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], yf.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.BoxBlock\", yf);\nclass ur {\n /** @returns the inspector from bundle or global */\n _getGlobalNodeGeometryEditor() {\n if (typeof NODEGEOMETRYEDITOR < \"u\")\n return NODEGEOMETRYEDITOR;\n if (typeof BABYLON < \"u\" && typeof BABYLON.NodeGeometryEditor < \"u\")\n return BABYLON;\n }\n /**\n * Gets the time spent to build this block (in ms)\n */\n get buildExecutionTime() {\n return this._buildExecutionTime;\n }\n /**\n * Creates a new geometry\n * @param name defines the name of the geometry\n */\n constructor(e) {\n this._buildId = ur._BuildIdGenerator++, this._buildWasSuccessful = !1, this._vertexData = null, this._buildExecutionTime = 0, this.BJSNODEGEOMETRYEDITOR = this._getGlobalNodeGeometryEditor(), this.editorData = null, this.attachedBlocks = [], this.onBuildObservable = new he(), this.outputBlock = null, this.name = e;\n }\n /**\n * Gets the current class name of the geometry e.g. \"NodeGeometry\"\n * @returns the class name\n */\n getClassName() {\n return \"NodeGeometry\";\n }\n /**\n * Get a block by its name\n * @param name defines the name of the block to retrieve\n * @returns the required block or null if not found\n */\n getBlockByName(e) {\n let t = null;\n for (const i of this.attachedBlocks)\n if (i.name === e)\n if (!t)\n t = i;\n else\n return ge.Warn(\"More than one block was found with the name `\" + e + \"`\"), t;\n return t;\n }\n /**\n * Get a block using a predicate\n * @param predicate defines the predicate used to find the good candidate\n * @returns the required block or null if not found\n */\n getBlockByPredicate(e) {\n for (const t of this.attachedBlocks)\n if (e(t))\n return t;\n return null;\n }\n /**\n * Gets the list of input blocks attached to this material\n * @returns an array of InputBlocks\n */\n getInputBlocks() {\n const e = [];\n for (const t of this.attachedBlocks)\n t.isInput && e.push(t);\n return e;\n }\n /**\n * Launch the node geometry editor\n * @param config Define the configuration of the editor\n * @returns a promise fulfilled when the node editor is visible\n */\n edit(e) {\n return new Promise((t) => {\n if (this.BJSNODEGEOMETRYEDITOR = this.BJSNODEGEOMETRYEDITOR || this._getGlobalNodeGeometryEditor(), typeof this.BJSNODEGEOMETRYEDITOR > \"u\") {\n const i = e && e.editorURL ? e.editorURL : ur.EditorURL;\n ge.LoadBabylonScript(i, () => {\n this.BJSNODEGEOMETRYEDITOR = this.BJSNODEGEOMETRYEDITOR || this._getGlobalNodeGeometryEditor(), this._createNodeEditor(e == null ? void 0 : e.nodeGeometryEditorConfig), t();\n });\n } else\n this._createNodeEditor(e == null ? void 0 : e.nodeGeometryEditorConfig), t();\n });\n }\n /**\n * Creates the node editor window.\n * @param additionalConfig Additional configuration for the NGE\n */\n _createNodeEditor(e) {\n const t = {\n nodeGeometry: this,\n ...e\n };\n this.BJSNODEGEOMETRYEDITOR.NodeGeometryEditor.Show(t);\n }\n /**\n * Build the final geometry\n * @param verbose defines if the build should log activity\n * @param updateBuildId defines if the internal build Id should be updated (default is true)\n * @param autoConfigure defines if the autoConfigure method should be called when initializing blocks (default is false)\n */\n build(e = !1, t = !0, i = !1) {\n if (this._buildWasSuccessful = !1, !this.outputBlock)\n throw \"You must define the outputBlock property before building the geometry\";\n const r = sr.Now;\n this._initializeBlock(this.outputBlock, i);\n const s = new BP();\n s.buildId = this._buildId, s.verbose = e, this.outputBlock.build(s), t && (this._buildId = ur._BuildIdGenerator++), this._buildExecutionTime = sr.Now - r, s.emitErrors(), this._buildWasSuccessful = !0, this._vertexData = s.vertexData, this.onBuildObservable.notifyObservers(this);\n }\n /**\n * Creates a mesh from the geometry blocks\n * @param name defines the name of the mesh\n * @param scene The scene the mesh is scoped to\n * @returns The new mesh\n */\n createMesh(e, t = null) {\n if (this._buildWasSuccessful || this.build(), !this._vertexData)\n return null;\n const i = new B(e, t);\n return this._vertexData.applyToMesh(i), i._internalMetadata = i._internalMetadata || {}, i._internalMetadata.nodeGeometry = this, i;\n }\n /**\n * Creates a mesh from the geometry blocks\n * @param mesh the mesh to update\n * @returns True if successfully updated\n */\n updateMesh(e) {\n return this._buildWasSuccessful || this.build(), this._vertexData ? (this._vertexData.applyToMesh(e), e._internalMetadata = e._internalMetadata || {}, e._internalMetadata.nodeGeometry = this, e) : !1;\n }\n _initializeBlock(e, t = !0) {\n e.initialize(), t && e.autoConfigure(), e._preparationId = this._buildId, this.attachedBlocks.indexOf(e) === -1 && this.attachedBlocks.push(e);\n for (const i of e.inputs) {\n const r = i.connectedPoint;\n if (r) {\n const s = r.ownerBlock;\n s !== e && this._initializeBlock(s, t);\n }\n }\n }\n /**\n * Clear the current geometry\n */\n clear() {\n this.outputBlock = null, this.attachedBlocks.length = 0;\n }\n /**\n * Remove a block from the current geometry\n * @param block defines the block to remove\n */\n removeBlock(e) {\n const t = this.attachedBlocks.indexOf(e);\n t > -1 && this.attachedBlocks.splice(t, 1), e === this.outputBlock && (this.outputBlock = null);\n }\n /**\n * Clear the current graph and load a new one from a serialization object\n * @param source defines the JSON representation of the geometry\n * @param merge defines whether or not the source must be merged or replace the current content\n */\n parseSerializedObject(e, t = !1) {\n t || this.clear();\n const i = {};\n for (const r of e.blocks) {\n const s = mr(r.customType);\n if (s) {\n const a = new s();\n a._deserialize(r), i[r.id] = a, this.attachedBlocks.push(a);\n }\n }\n for (const r of this.attachedBlocks)\n if (r.isTeleportOut) {\n const s = r, a = s._tempEntryPointUniqueId;\n if (a) {\n const o = i[a];\n o && o.attachToEndpoint(s);\n }\n }\n for (let r = 0; r < e.blocks.length; r++) {\n const s = e.blocks[r], a = i[s.id];\n a && (a.inputs.length && s.inputs.some((o) => o.targetConnectionName) && !t || this._restoreConnections(a, e, i));\n }\n if (e.outputNodeId && (this.outputBlock = i[e.outputNodeId]), e.locations || e.editorData && e.editorData.locations) {\n const r = e.locations || e.editorData.locations;\n for (const a of r)\n i[a.blockId] && (a.blockId = i[a.blockId].uniqueId);\n t && this.editorData && this.editorData.locations && r.concat(this.editorData.locations), e.locations ? this.editorData = {\n locations: r\n } : (this.editorData = e.editorData, this.editorData.locations = r);\n const s = [];\n for (const a in i)\n s[a] = i[a].uniqueId;\n this.editorData.map = s;\n }\n this.comment = e.comment;\n }\n _restoreConnections(e, t, i) {\n for (const r of e.outputs)\n for (const s of t.blocks) {\n const a = i[s.id];\n if (a) {\n for (const o of s.inputs)\n if (i[o.targetBlockId] === e && o.targetConnectionName === r.name) {\n const l = a.getInputByName(o.inputName);\n if (!l || l.isConnected)\n continue;\n r.connectTo(l, !0), this._restoreConnections(a, t, i);\n continue;\n }\n }\n }\n }\n /**\n * Generate a string containing the code declaration required to create an equivalent of this geometry\n * @returns a string\n */\n generateCode() {\n let e = [];\n const t = [], i = [\"const\", \"var\", \"let\"];\n this.outputBlock && this._gatherBlocks(this.outputBlock, t);\n let r = `let nodeGeometry = new BABYLON.NodeGeometry(\"${this.name || \"node geometry\"}\");\n`;\n for (const s of t)\n s.isInput && e.indexOf(s) === -1 && (r += s._dumpCode(i, e));\n return this.outputBlock && (e = [], r += `// Connections\n`, r += this.outputBlock._dumpCodeForOutputConnections(e), r += `// Output nodes\n`, r += `nodeGeometry.outputBlock = ${this.outputBlock._codeVariableName};\n`, r += `nodeGeometry.build();\n`), r;\n }\n _gatherBlocks(e, t) {\n if (t.indexOf(e) === -1) {\n t.push(e);\n for (const i of e.inputs) {\n const r = i.connectedPoint;\n if (r) {\n const s = r.ownerBlock;\n s !== e && this._gatherBlocks(s, t);\n }\n }\n if (e.isTeleportOut) {\n const i = e;\n i.entryPoint && this._gatherBlocks(i.entryPoint, t);\n }\n }\n }\n /**\n * Clear the current geometry and set it to a default state\n */\n setToDefault() {\n this.clear(), this.editorData = null;\n const e = new yf(\"Box\");\n e.autoConfigure();\n const t = new D0(\"Geometry Output\");\n e.geometry.connectTo(t.geometry), this.outputBlock = t;\n }\n /**\n * Makes a duplicate of the current geometry.\n * @param name defines the name to use for the new geometry\n * @returns the new geometry\n */\n clone(e) {\n const t = this.serialize(), i = Le.Clone(() => new ur(e), this);\n return i.name = e, i.parseSerializedObject(t), i._buildId = this._buildId, i.build(!1), i;\n }\n /**\n * Serializes this geometry in a JSON representation\n * @param selectedBlocks defines the list of blocks to save (if null the whole geometry will be saved)\n * @returns the serialized geometry object\n */\n serialize(e) {\n const t = e ? {} : Le.Serialize(this);\n t.editorData = JSON.parse(JSON.stringify(this.editorData));\n let i = [];\n e ? i = e : (t.customType = \"BABYLON.NodeGeometry\", this.outputBlock && (t.outputNodeId = this.outputBlock.uniqueId)), t.blocks = [];\n for (const r of i)\n t.blocks.push(r.serialize());\n if (!e)\n for (const r of this.attachedBlocks)\n i.indexOf(r) === -1 && t.blocks.push(r.serialize());\n return t;\n }\n /**\n * Disposes the ressources\n */\n dispose() {\n for (const e of this.attachedBlocks)\n e.dispose();\n this.attachedBlocks.length = 0, this.onBuildObservable.clear();\n }\n /**\n * Creates a new node geometry set to default basic configuration\n * @param name defines the name of the geometry\n * @returns a new NodeGeometry\n */\n static CreateDefault(e) {\n const t = new ur(e);\n return t.setToDefault(), t.build(), t;\n }\n /**\n * Creates a node geometry from parsed geometry data\n * @param source defines the JSON representation of the geometry\n * @returns a new node geometry\n */\n static Parse(e) {\n const t = Le.Parse(() => new ur(e.name), e, null);\n return t.parseSerializedObject(e), t.build(), t;\n }\n /**\n * Creates a node geometry from a snippet saved by the node geometry editor\n * @param snippetId defines the snippet to load\n * @param nodeGeometry defines a node geometry to update (instead of creating a new one)\n * @param skipBuild defines whether to build the node geometry\n * @returns a promise that will resolve to the new node geometry\n */\n static ParseFromSnippetAsync(e, t, i = !1) {\n return e === \"_BLANK\" ? Promise.resolve(ur.CreateDefault(\"blank\")) : new Promise((r, s) => {\n const a = new mi();\n a.addEventListener(\"readystatechange\", () => {\n if (a.readyState == 4)\n if (a.status == 200) {\n const o = JSON.parse(JSON.parse(a.responseText).jsonPayload), l = JSON.parse(o.nodeGeometry);\n t || (t = Le.Parse(() => new ur(e), l, null)), t.parseSerializedObject(l), t.snippetId = e;\n try {\n i || t.build(), r(t);\n } catch (c) {\n s(c);\n }\n } else\n s(\"Unable to load the snippet \" + e);\n }), a.open(\"GET\", this.SnippetUrl + \"/\" + e.replace(/#/g, \"/\")), a.send();\n });\n }\n}\nur._BuildIdGenerator = 0;\nur.EditorURL = `${ge._DefaultCdnUrl}/v${se.Version}/nodeGeometryEditor/babylon.nodeGeometryEditor.js`;\nur.SnippetUrl = \"https://snippet.babylonjs.com\";\nP([\n w()\n], ur.prototype, \"name\", void 0);\nP([\n w(\"comment\")\n], ur.prototype, \"comment\", void 0);\nclass If extends Ve {\n /**\n * Creates a new GeometryOptimizeBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.epsilon = xt, this.registerInput(\"geometry\", b.Geometry), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryOptimizeBlock\";\n }\n /**\n * Gets the geometry component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (!this.geometry.isConnected)\n return null;\n const r = this.geometry.getConnectedValue(i), s = [], a = {};\n for (let l = 0; l < r.positions.length; l += 3) {\n const c = r.positions[l], h = r.positions[l + 1], u = r.positions[l + 2];\n let f = !1;\n for (let d = 0; d < s.length; d += 3)\n if (je.WithinEpsilon(c, s[d], this.epsilon) && je.WithinEpsilon(h, s[d + 1], this.epsilon) && je.WithinEpsilon(u, s[d + 2], this.epsilon)) {\n a[l / 3] = d / 3, f = !0;\n continue;\n }\n f || (a[l / 3] = s.length / 3, s.push(c, h, u));\n }\n const o = new re();\n return o.positions = s, o.indices = r.indices.map((l) => a[l]), o;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n let e = super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n return e += `${this._codeVariableName}.epsilon = ${this.epsilon};\n`, e;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e.epsilon = this.epsilon, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext, this.epsilon = e.epsilon;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], If.prototype, \"evaluateContext\", void 0);\nP([\n gt(\"Epsilon\", ht.Float, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], If.prototype, \"epsilon\", void 0);\nRe(\"BABYLON.GeometryOptimizeBlock\", If);\nclass N0 extends Ve {\n /**\n * Create a new PlaneBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"size\", b.Float, !0, 1), this.registerInput(\"width\", b.Float, !0, 0), this.registerInput(\"height\", b.Float, !0, 0), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"PlaneBlock\";\n }\n /**\n * Gets the size input component\n */\n get size() {\n return this._inputs[0];\n }\n /**\n * Gets the width input component\n */\n get width() {\n return this._inputs[1];\n }\n /**\n * Gets the height input component\n */\n get height() {\n return this._inputs[2];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.size.isConnected) {\n if (!this.width.isConnected && !this.height.isConnected) {\n const e = new si(\"Size\");\n e.value = 1, e.output.connectTo(this.size);\n return;\n }\n if (!this.width.isConnected) {\n const e = new si(\"Width\");\n e.value = 1, e.output.connectTo(this.width);\n }\n if (!this.height.isConnected) {\n const e = new si(\"Height\");\n e.value = 1, e.output.connectTo(this.height);\n }\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.size = this.size.getConnectedValue(r), t.width = this.width.getConnectedValue(r), t.height = this.height.getConnectedValue(r), xf(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], N0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.PlaneBlock\", N0);\nclass F0 extends Ve {\n /**\n * Gets or sets the mesh to use to get vertex data\n */\n get mesh() {\n return this._mesh;\n }\n set mesh(e) {\n this._mesh = e;\n }\n /**\n * Create a new MeshBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._cachedVertexData = null, this.reverseWindingOrder = !1, this.serializedCachedData = !1, this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"MeshBlock\";\n }\n /**\n * Gets a boolean indicating if the block is using cached data\n */\n get isUsingCachedData() {\n return !this.mesh && !!this._cachedVertexData;\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n /**\n * Remove stored data\n */\n cleanData() {\n this._mesh = null, this._cachedVertexData = null;\n }\n _buildBlock() {\n if (!this._mesh) {\n this._cachedVertexData ? this.geometry._storedValue = this._cachedVertexData.clone() : this.geometry._storedValue = null;\n return;\n }\n const e = re.ExtractFromMesh(this._mesh, !1, !0);\n if (this._cachedVertexData = null, this.reverseWindingOrder && e.indices)\n for (let t = 0; t < e.indices.length; t += 3) {\n const i = e.indices[t];\n e.indices[t] = e.indices[t + 2], e.indices[t + 2] = i;\n }\n this.geometry._storedFunction = () => e.clone();\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.serializedCachedData = this.serializedCachedData, this.serializedCachedData && (this._mesh ? e.cachedVertexData = re.ExtractFromMesh(this._mesh, !1, !0).serialize() : this._cachedVertexData && (e.cachedVertexData = this._cachedVertexData.serialize())), e.reverseWindingOrder = this.reverseWindingOrder, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.cachedVertexData && (this._cachedVertexData = re.Parse(e.cachedVertexData)), this.serializedCachedData = !!e.serializedCachedData, this.reverseWindingOrder = e.reverseWindingOrder;\n }\n}\nP([\n gt(\"Serialize cached data\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], F0.prototype, \"serializedCachedData\", void 0);\nRe(\"BABYLON.MeshBlock\", F0);\nclass L0 extends Ve {\n /**\n * Create a new IcoSphereBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"radius\", b.Float, !0, 1), this.registerInput(\"radiusX\", b.Float, !0, 0), this.registerInput(\"radiusY\", b.Float, !0, 0), this.registerInput(\"radiusZ\", b.Float, !0, 0), this.registerInput(\"subdivisions\", b.Int, !0, 4), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"IcoSphereBlock\";\n }\n /**\n * Gets the radius input component\n */\n get radius() {\n return this._inputs[0];\n }\n /**\n * Gets the radiusX input component\n */\n get radiusX() {\n return this._inputs[1];\n }\n /**\n * Gets the radiusY input component\n */\n get radiusY() {\n return this._inputs[2];\n }\n /**\n * Gets the radiusZ input component\n */\n get radiusZ() {\n return this._inputs[3];\n }\n /**\n * Gets the subdivisions input component\n */\n get subdivisions() {\n return this._inputs[4];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.radius.isConnected) {\n const e = new si(\"Radius\");\n e.value = 0.2, e.output.connectTo(this.radius);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.radius = this.radius.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), t.radiusX = this.radiusX.getConnectedValue(r), t.radiusY = this.radiusY.getConnectedValue(r), t.radiusZ = this.radiusZ.getConnectedValue(r), Cf(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], L0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.IcoSphereBlock\", L0);\nclass w0 extends Ve {\n /**\n * Create a new SphereBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"segments\", b.Int, !0, 32), this.registerInput(\"diameter\", b.Float, !0, 1), this.registerInput(\"diameterX\", b.Float, !0, 0), this.registerInput(\"diameterY\", b.Float, !0, 0), this.registerInput(\"diameterZ\", b.Float, !0, 0), this.registerInput(\"arc\", b.Float, !0, 1), this.registerInput(\"slice\", b.Float, !0, 1), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SphereBlock\";\n }\n /**\n * Gets the segments input component\n */\n get segments() {\n return this._inputs[0];\n }\n /**\n * Gets the diameter input component\n */\n get diameter() {\n return this._inputs[1];\n }\n /**\n * Gets the diameterX input component\n */\n get diameterX() {\n return this._inputs[2];\n }\n /**\n * Gets the diameterY input component\n */\n get diameterY() {\n return this._inputs[3];\n }\n /**\n * Gets the diameterZ input component\n */\n get diameterZ() {\n return this._inputs[4];\n }\n /**\n * Gets the arc input component\n */\n get arc() {\n return this._inputs[5];\n }\n /**\n * Gets the slice input component\n */\n get slice() {\n return this._inputs[6];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.diameter.isConnected) {\n const e = new si(\"Diameter\");\n e.value = 1, e.output.connectTo(this.diameter);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.segments = this.segments.getConnectedValue(r), t.diameter = this.diameter.getConnectedValue(r), t.diameterX = this.diameterX.getConnectedValue(r), t.diameterY = this.diameterY.getConnectedValue(r), t.diameterZ = this.diameterZ.getConnectedValue(r), t.arc = this.arc.getConnectedValue(r), t.slice = this.slice.getConnectedValue(r), Ef(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], w0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.SphereBlock\", w0);\nclass U0 extends Ve {\n /**\n * Create a new GridBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"width\", b.Float, !0, 1), this.registerInput(\"height\", b.Float, !0, 1), this.registerInput(\"subdivisions\", b.Int, !0, 1), this.registerInput(\"subdivisionsX\", b.Int, !0, 0), this.registerInput(\"subdivisionsY\", b.Int, !0, 0), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GridBlock\";\n }\n /**\n * Gets the width input component\n */\n get width() {\n return this._inputs[0];\n }\n /**\n * Gets the height input component\n */\n get height() {\n return this._inputs[1];\n }\n /**\n * Gets the subdivisions input component\n */\n get subdivisions() {\n return this._inputs[2];\n }\n /**\n * Gets the subdivisionsX input component\n */\n get subdivisionsX() {\n return this._inputs[3];\n }\n /**\n * Gets the subdivisionsY input component\n */\n get subdivisionsY() {\n return this._inputs[4];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.width.isConnected) {\n const e = new si(\"Width\");\n e.value = 1, e.output.connectTo(this.width);\n }\n if (!this.height.isConnected) {\n const e = new si(\"Height\");\n e.value = 1, e.output.connectTo(this.height);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.width = this.width.getConnectedValue(r), t.height = this.height.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), t.subdivisionsX = this.subdivisionsX.getConnectedValue(r), t.subdivisionsY = this.subdivisionsY.getConnectedValue(r), Ns(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], U0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.GridBlock\", U0);\nclass V0 extends Ve {\n /**\n * Create a new TorusBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"diameter\", b.Float, !0, 1), this.registerInput(\"thickness\", b.Float, !0, 0.5), this.registerInput(\"tessellation\", b.Int, !0, 16), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"TorusBlock\";\n }\n /**\n * Gets the diameter input component\n */\n get diameter() {\n return this._inputs[0];\n }\n /**\n * Gets the thickness input component\n */\n get thickness() {\n return this._inputs[1];\n }\n /**\n * Gets the tessellation input component\n */\n get tessellation() {\n return this._inputs[2];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.diameter.isConnected) {\n const e = new si(\"Diameter\");\n e.value = 1, e.output.connectTo(this.diameter);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.thickness = this.thickness.getConnectedValue(r), t.diameter = this.diameter.getConnectedValue(r), t.tessellation = this.tessellation.getConnectedValue(r), Tf(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], V0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.TorusBlock\", V0);\nclass B0 extends Ve {\n /**\n * Create a new SphereBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"height\", b.Float, !0, 25), this.registerInput(\"diameter\", b.Float, !0, 1), this.registerInput(\"diameterTop\", b.Float, !0, -1), this.registerInput(\"diameterBottom\", b.Float, !0, -1), this.registerInput(\"subdivisions\", b.Int, !0, 1), this.registerInput(\"tessellation\", b.Int, !0, 24), this.registerInput(\"arc\", b.Float, !0, 1), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"CylinderBlock\";\n }\n /**\n * Gets the height input component\n */\n get height() {\n return this._inputs[0];\n }\n /**\n * Gets the diameter input component\n */\n get diameter() {\n return this._inputs[1];\n }\n /**\n * Gets the diameterTop input component\n */\n get diameterTop() {\n return this._inputs[2];\n }\n /**\n * Gets the diameterBottom input component\n */\n get diameterBottom() {\n return this._inputs[3];\n }\n /**\n * Gets the subdivisions input component\n */\n get subdivisions() {\n return this._inputs[4];\n }\n /**\n * Gets the tessellation input component\n */\n get tessellation() {\n return this._inputs[5];\n }\n /**\n * Gets the arc input component\n */\n get arc() {\n return this._inputs[6];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.diameter.isConnected) {\n const e = new si(\"Diameter\");\n e.value = 1, e.output.connectTo(this.diameter);\n }\n if (!this.height.isConnected) {\n const e = new si(\"Height\");\n e.value = 1, e.output.connectTo(this.height);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.height = this.height.getConnectedValue(r), t.diameter = this.diameter.getConnectedValue(r), t.diameterTop = this.diameterTop.getConnectedValue(r), t.diameterBottom = this.diameterBottom.getConnectedValue(r), t.diameterTop === -1 && (t.diameterTop = t.diameter), t.diameterBottom === -1 && (t.diameterBottom = t.diameter), t.tessellation = this.tessellation.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), t.arc = this.arc.getConnectedValue(r), vf(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], B0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.CylinderBlock\", B0);\nclass k0 extends Ve {\n /**\n * Create a new CapsuleBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"height\", b.Float, !0, 1), this.registerInput(\"radius\", b.Float, !0, 0.25), this.registerInput(\"tessellation\", b.Int, !0, 16), this.registerInput(\"subdivisions\", b.Int, !0, 2), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"CapsuleBlock\";\n }\n /**\n * Gets the height input component\n */\n get height() {\n return this._inputs[0];\n }\n /**\n * Gets the radius input component\n */\n get radius() {\n return this._inputs[1];\n }\n /**\n * Gets the tessellation input component\n */\n get tessellation() {\n return this._inputs[2];\n }\n /**\n * Gets the subdivisions input component\n */\n get subdivisions() {\n return this._inputs[3];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.height.isConnected) {\n const e = new si(\"Height\");\n e.value = 1, e.output.connectTo(this.height);\n }\n if (!this.radius.isConnected) {\n const e = new si(\"Radius\");\n e.value = 0.2, e.output.connectTo(this.radius);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.height = this.height.getConnectedValue(r), t.radius = this.radius.getConnectedValue(r), t.tessellation = this.tessellation.getConnectedValue(r), t.subdivisions = this.subdivisions.getConnectedValue(r), Rf(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], k0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.CapsuleBlock\", k0);\nclass z0 extends Ve {\n /**\n * Create a new DiscBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"radius\", b.Float, !0, 0.5), this.registerInput(\"tessellation\", b.Int, !0, 64), this.registerInput(\"arc\", b.Float, !0, 1), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"DiscBlock\";\n }\n /**\n * Gets the radius input component\n */\n get radius() {\n return this._inputs[0];\n }\n /**\n * Gets the tessellation input component\n */\n get tessellation() {\n return this._inputs[1];\n }\n /**\n * Gets the arc input component\n */\n get arc() {\n return this._inputs[2];\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.radius.isConnected) {\n const e = new si(\"Radius\");\n e.value = 0.2, e.output.connectTo(this.radius);\n }\n }\n _buildBlock(e) {\n const t = {}, i = (r) => (t.radius = this.radius.getConnectedValue(r), t.tessellation = this.tessellation.getConnectedValue(r), t.arc = this.arc.getConnectedValue(r), _f(t));\n if (this.evaluateContext)\n this.geometry._storedFunction = i;\n else {\n const r = i(e);\n this.geometry._storedFunction = () => (this.geometry._executionCount = 1, r.clone());\n }\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], z0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.DiscBlock\", z0);\nclass kP extends Ve {\n /**\n * Create a new NullBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerOutput(\"geometry\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"NullBlock\";\n }\n /**\n * Gets the geometry output component\n */\n get geometry() {\n return this._outputs[0];\n }\n _buildBlock() {\n this.geometry._storedValue = null;\n }\n}\nRe(\"BABYLON.NullBlock\", kP);\nclass W0 extends Ve {\n /**\n * Create a new SetPositionsBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"positions\", b.Vector3), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SetPositionsBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the positions input component\n */\n get positions() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), this._vertexData = this.geometry.getConnectedValue(i), this._vertexData && (this._vertexData = this._vertexData.clone()), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions || !this.positions.isConnected) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = null;\n return;\n }\n const r = this._vertexData.positions.length / 3;\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const s = this.positions.getConnectedValue(i);\n s && s.toArray(this._vertexData.positions, this._currentIndex * 3);\n }\n return i.restoreGeometryContext(), i.restoreExecutionContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], W0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.SetPositionsBlock\", W0);\nclass G0 extends Ve {\n /**\n * Create a new SetNormalsBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"normals\", b.Vector3), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SetNormalsBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the normals input component\n */\n get normals() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), this._vertexData = this.geometry.getConnectedValue(i), this._vertexData && (this._vertexData = this._vertexData.clone()), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = null;\n return;\n }\n if (!this.normals.isConnected) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = this._vertexData;\n return;\n }\n this._vertexData.normals || (this._vertexData.normals = []);\n const r = this._vertexData.positions.length / 3;\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const s = this.normals.getConnectedValue(i);\n s && s.toArray(this._vertexData.normals, this._currentIndex * 3);\n }\n return i.restoreGeometryContext(), i.restoreExecutionContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], G0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.SetNormalsBlock\", G0);\nclass bf extends Ve {\n /**\n * Create a new SetUVsBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.textureCoordinateIndex = 0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"uvs\", b.Vector2), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SetUVsBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the uvs input component\n */\n get uvs() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), this._vertexData = this.geometry.getConnectedValue(i), this._vertexData && (this._vertexData = this._vertexData.clone()), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = null;\n return;\n }\n if (!this.uvs.isConnected) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = this._vertexData;\n return;\n }\n const r = [], s = this._vertexData.positions.length / 3;\n for (this._currentIndex = 0; this._currentIndex < s; this._currentIndex++) {\n const a = this.uvs.getConnectedValue(i);\n a && a.toArray(r, this._currentIndex * 2);\n }\n switch (this.textureCoordinateIndex) {\n case 0:\n this._vertexData.uvs = r;\n break;\n case 1:\n this._vertexData.uvs2 = r;\n break;\n case 2:\n this._vertexData.uvs3 = r;\n break;\n case 3:\n this._vertexData.uvs4 = r;\n break;\n case 4:\n this._vertexData.uvs5 = r;\n break;\n case 5:\n this._vertexData.uvs6 = r;\n break;\n }\n return i.restoreGeometryContext(), i.restoreExecutionContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n let e = super._dumpPropertiesCode() + `${this._codeVariableName}.textureCoordinateIndex};\n`;\n return e += `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`, e;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e.textureCoordinateIndex = this.textureCoordinateIndex, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.textureCoordinateIndex = e.textureCoordinateIndex, e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], bf.prototype, \"evaluateContext\", void 0);\nP([\n gt(\"Texture coordinates index\", ht.List, \"ADVANCED\", {\n notifiers: { update: !0 },\n options: [\n { label: \"UV1\", value: 0 },\n { label: \"UV2\", value: 1 },\n { label: \"UV3\", value: 2 },\n { label: \"UV4\", value: 3 },\n { label: \"UV5\", value: 4 },\n { label: \"UV6\", value: 5 }\n ]\n })\n], bf.prototype, \"textureCoordinateIndex\", void 0);\nRe(\"BABYLON.SetUVsBlock\", bf);\nclass X0 extends Ve {\n /**\n * Create a new SetColorsBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"colors\", b.AutoDetect), this.registerOutput(\"output\", b.Geometry), this._inputs[1].excludedConnectionPointTypes.push(b.Int), this._inputs[1].excludedConnectionPointTypes.push(b.Float), this._inputs[1].excludedConnectionPointTypes.push(b.Vector2), this._inputs[1].excludedConnectionPointTypes.push(b.Texture), this._inputs[1].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SetColorsBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the colors input component\n */\n get colors() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n var s;\n if (i.pushExecutionContext(this), this._vertexData = this.geometry.getConnectedValue(i), this._vertexData && (this._vertexData = this._vertexData.clone()), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = null;\n return;\n }\n if (!this.colors.isConnected) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = this._vertexData;\n return;\n }\n this._vertexData.colors || (this._vertexData.colors = []);\n const r = this._vertexData.positions.length / 3;\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++)\n if (((s = this.colors.connectedPoint) == null ? void 0 : s.type) === b.Vector3) {\n const a = this.colors.getConnectedValue(i);\n a && (a.toArray(this._vertexData.colors, this._currentIndex * 4), this._vertexData.colors[this._currentIndex * 4 + 3] = 1, this._vertexData.hasVertexAlpha = !1);\n } else {\n const a = this.colors.getConnectedValue(i);\n a && (a.toArray(this._vertexData.colors, this._currentIndex * 4), this._vertexData.hasVertexAlpha = !0);\n }\n return i.restoreGeometryContext(), i.restoreExecutionContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], X0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.SetColorsBlock\", X0);\nclass H0 extends Ve {\n /**\n * Create a new SetTangentsBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"tangents\", b.Vector4), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SetTangentsBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the tangents input component\n */\n get tangents() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), this._vertexData = this.geometry.getConnectedValue(i), this._vertexData && (this._vertexData = this._vertexData.clone()), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = null;\n return;\n }\n if (!this.tangents.isConnected) {\n i.restoreGeometryContext(), i.restoreExecutionContext(), this.output._storedValue = this._vertexData;\n return;\n }\n this._vertexData.tangents || (this._vertexData.tangents = []);\n const r = this._vertexData.positions.length / 3;\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const s = this.tangents.getConnectedValue(i);\n s && s.toArray(this._vertexData.tangents, this._currentIndex * 4);\n }\n return i.restoreGeometryContext(), i.restoreExecutionContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], H0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.SetTangentsBlock\", H0);\nvar Yi;\n(function(n) {\n n[n.Add = 0] = \"Add\", n[n.Subtract = 1] = \"Subtract\", n[n.Multiply = 2] = \"Multiply\", n[n.Divide = 3] = \"Divide\", n[n.Max = 4] = \"Max\", n[n.Min = 5] = \"Min\";\n})(Yi || (Yi = {}));\nclass K0 extends Ve {\n /**\n * Create a new MathBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.operation = Yi.Add, this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this.output._typeConnectionSource = this.left;\n const t = [\n b.Matrix,\n b.Geometry,\n b.Texture\n ];\n this.left.excludedConnectionPointTypes.push(...t), this.right.excludedConnectionPointTypes.push(...t), this._linkConnectionTypes(0, 1), this._connectionObservers = [\n this.left.onConnectionObservable.add(() => this._updateInputOutputTypes()),\n this.left.onDisconnectionObservable.add(() => this._updateInputOutputTypes()),\n this.right.onConnectionObservable.add(() => this._updateInputOutputTypes()),\n this.right.onDisconnectionObservable.add(() => this._updateInputOutputTypes())\n ];\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"MathBlock\";\n }\n /**\n * Gets the left input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n let e;\n const t = this.left, i = this.right;\n if (!t.isConnected || !i.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const r = t.type === b.Float || t.type === b.Int, s = i.type === b.Float || i.type === b.Int, a = r && s;\n switch (this.operation) {\n case Yi.Add: {\n a ? e = (o) => t.getConnectedValue(o) + i.getConnectedValue(o) : r ? e = (o) => o.adapt(t, i.type).add(i.getConnectedValue(o)) : e = (o) => t.getConnectedValue(o).add(o.adapt(i, t.type));\n break;\n }\n case Yi.Subtract: {\n a ? e = (o) => t.getConnectedValue(o) - i.getConnectedValue(o) : r ? e = (o) => o.adapt(t, i.type).subtract(i.getConnectedValue(o)) : e = (o) => t.getConnectedValue(o).subtract(o.adapt(i, t.type));\n break;\n }\n case Yi.Multiply: {\n a ? e = (o) => t.getConnectedValue(o) * i.getConnectedValue(o) : r ? e = (o) => o.adapt(t, i.type).multiply(i.getConnectedValue(o)) : e = (o) => t.getConnectedValue(o).multiply(o.adapt(i, t.type));\n break;\n }\n case Yi.Divide: {\n a ? e = (o) => t.getConnectedValue(o) / i.getConnectedValue(o) : r ? e = (o) => o.adapt(t, i.type).divide(i.getConnectedValue(o)) : e = (o) => t.getConnectedValue(o).divide(o.adapt(i, t.type));\n break;\n }\n case Yi.Min: {\n if (a)\n e = (o) => Math.min(t.getConnectedValue(o), i.getConnectedValue(o));\n else {\n const [o, l] = r ? [i, t] : [t, i];\n switch (o.type) {\n case b.Vector2: {\n e = (c) => me.Minimize(o.getConnectedValue(c), c.adapt(l, o.type));\n break;\n }\n case b.Vector3: {\n e = (c) => _.Minimize(o.getConnectedValue(c), c.adapt(l, o.type));\n break;\n }\n case b.Vector4: {\n e = (c) => Ke.Minimize(o.getConnectedValue(c), c.adapt(l, o.type));\n break;\n }\n }\n }\n break;\n }\n case Yi.Max:\n if (a)\n e = (o) => Math.max(t.getConnectedValue(o), i.getConnectedValue(o));\n else {\n const [o, l] = r ? [i, t] : [t, i];\n switch (o.type) {\n case b.Vector2: {\n e = (c) => me.Maximize(o.getConnectedValue(c), c.adapt(l, o.type));\n break;\n }\n case b.Vector3: {\n e = (c) => _.Maximize(o.getConnectedValue(c), c.adapt(l, o.type));\n break;\n }\n case b.Vector4: {\n e = (c) => Ke.Maximize(o.getConnectedValue(c), c.adapt(l, o.type));\n break;\n }\n }\n break;\n }\n }\n this.output._storedFunction = (o) => t.type === b.Int ? e(o) | 0 : e(o);\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.operation = BABYLON.MathBlockOperations.${Yi[this.operation]};\n`;\n }\n _updateInputOutputTypes() {\n if (this.output._typeConnectionSource = this.left, this.left.isConnected && this.right.isConnected ? (this.left.type === b.Int || this.left.type === b.Float && this.right.type !== b.Int) && (this.output._typeConnectionSource = this.right) : this.left.isConnected !== this.right.isConnected && (this.output._typeConnectionSource = this.left.isConnected ? this.left : this.right), this.left.isConnected || this.right.isConnected)\n for (const [e, t] of [\n [this.left, this.right],\n [this.right, this.left]\n ])\n e.acceptedConnectionPointTypes = [b.Int, b.Float], t.isConnected && (e.acceptedConnectionPointTypes.push(t.type), (t.type === b.Int || t.type === b.Float) && e.acceptedConnectionPointTypes.push(b.Vector2, b.Vector3, b.Vector4));\n }\n /**\n * Release resources\n */\n dispose() {\n super.dispose(), this._connectionObservers.forEach((e) => e.remove()), this._connectionObservers.length = 0;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.operation = this.operation, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.operation = e.operation;\n }\n}\nP([\n gt(\"Operation\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"Add\", value: Yi.Add },\n { label: \"Subtract\", value: Yi.Subtract },\n { label: \"Multiply\", value: Yi.Multiply },\n { label: \"Divide\", value: Yi.Divide },\n { label: \"Max\", value: Yi.Max },\n { label: \"Min\", value: Yi.Min }\n ]\n })\n], K0.prototype, \"operation\", void 0);\nRe(\"BABYLON.MathBlock\", K0);\nclass zP extends Ve {\n /**\n * Create a new MapRangeBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"fromMin\", b.Float, !0, 0), this.registerInput(\"fromMax\", b.Float, !0, 1), this.registerInput(\"toMin\", b.Float, !0, 0), this.registerInput(\"toMax\", b.Float, !0, 1), this.registerOutput(\"output\", b.BasedOnInput), this._inputs[0].excludedConnectionPointTypes.push(b.Vector2), this._inputs[0].excludedConnectionPointTypes.push(b.Vector3), this._inputs[0].excludedConnectionPointTypes.push(b.Vector4), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture), this._outputs[0]._typeConnectionSource = this._inputs[0];\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"MapRangeBlock\";\n }\n /**\n * Gets the value input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the fromMin input component\n */\n get fromMin() {\n return this._inputs[1];\n }\n /**\n * Gets the fromMax input component\n */\n get fromMax() {\n return this._inputs[2];\n }\n /**\n * Gets the toMin input component\n */\n get toMin() {\n return this._inputs[3];\n }\n /**\n * Gets the toMax input component\n */\n get toMax() {\n return this._inputs[4];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n this.output._storedFunction = (e) => {\n const t = this.value.getConnectedValue(e), i = this.fromMin.getConnectedValue(e), r = this.fromMax.getConnectedValue(e), s = this.toMin.getConnectedValue(e), a = this.toMax.getConnectedValue(e), o = (t - i) / (r - i) * (a - s) + s;\n return this.output.type === b.Int ? Math.floor(o) : o;\n };\n }\n}\nRe(\"BABYLON.MapRangeBlock\", zP);\nvar fi;\n(function(n) {\n n[n.Equal = 0] = \"Equal\", n[n.NotEqual = 1] = \"NotEqual\", n[n.LessThan = 2] = \"LessThan\", n[n.GreaterThan = 3] = \"GreaterThan\", n[n.LessOrEqual = 4] = \"LessOrEqual\", n[n.GreaterOrEqual = 5] = \"GreaterOrEqual\", n[n.Xor = 6] = \"Xor\", n[n.Or = 7] = \"Or\", n[n.And = 8] = \"And\";\n})(fi || (fi = {}));\nclass q0 extends Ve {\n /**\n * Create a new ConditionBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.test = fi.Equal, this.registerInput(\"left\", b.Float), this.registerInput(\"right\", b.Float, !0, 0), this.registerInput(\"ifTrue\", b.AutoDetect, !0, 1), this.registerInput(\"ifFalse\", b.AutoDetect, !0, 0), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[2], this._outputs[0]._defaultConnectionPointType = b.Float, this._inputs[0].acceptedConnectionPointTypes.push(b.Int), this._inputs[1].acceptedConnectionPointTypes.push(b.Int), this._linkConnectionTypes(2, 3);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"ConditionBlock\";\n }\n /**\n * Gets the left input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the ifTrue input component\n */\n get ifTrue() {\n return this._inputs[2];\n }\n /**\n * Gets the ifFalse input component\n */\n get ifFalse() {\n return this._inputs[3];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t) => {\n const i = this.left.getConnectedValue(t), r = this.right.getConnectedValue(t);\n let s = !1;\n switch (this.test) {\n case fi.Equal:\n s = je.WithinEpsilon(i, r, xt);\n break;\n case fi.NotEqual:\n s = i !== r;\n break;\n case fi.LessThan:\n s = i < r;\n break;\n case fi.GreaterThan:\n s = i > r;\n break;\n case fi.LessOrEqual:\n s = i <= r;\n break;\n case fi.GreaterOrEqual:\n s = i >= r;\n break;\n case fi.Xor:\n s = !!i && !r || !i && !!r;\n break;\n case fi.Or:\n s = !!i || !!r;\n break;\n case fi.And:\n s = !!i && !!r;\n break;\n }\n return s;\n };\n this.output._storedFunction = (t) => e(t) ? this.ifTrue.getConnectedValue(t) : this.ifFalse.getConnectedValue(t);\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.test = BABYLON.ConditionBlockTests.${fi[this.test]};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.test = this.test, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.test = e.test;\n }\n}\nP([\n gt(\"Test\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"Equal\", value: fi.Equal },\n { label: \"NotEqual\", value: fi.NotEqual },\n { label: \"LessThan\", value: fi.LessThan },\n { label: \"GreaterThan\", value: fi.GreaterThan },\n { label: \"LessOrEqual\", value: fi.LessOrEqual },\n { label: \"GreaterOrEqual\", value: fi.GreaterOrEqual },\n { label: \"Xor\", value: fi.Xor },\n { label: \"Or\", value: fi.Or },\n { label: \"And\", value: fi.And }\n ]\n })\n], q0.prototype, \"test\", void 0);\nRe(\"BABYLON.ConditionBlock\", q0);\nvar Zr;\n(function(n) {\n n[n.None = 0] = \"None\", n[n.LoopID = 1] = \"LoopID\", n[n.InstanceID = 2] = \"InstanceID\";\n})(Zr || (Zr = {}));\nclass Y0 extends Ve {\n /**\n * Create a new RandomBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._currentLockId = -1, this.lockMode = Zr.None, this.registerInput(\"min\", b.AutoDetect), this.registerInput(\"max\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Geometry), this._inputs[1].excludedConnectionPointTypes.push(b.Texture), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"RandomBlock\";\n }\n /**\n * Gets the min input component\n */\n get min() {\n return this._inputs[0];\n }\n /**\n * Gets the max input component\n */\n get max() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.min.isConnected) {\n const e = new si(\"Min\");\n e.value = 0, e.output.connectTo(this.min);\n }\n if (!this.max.isConnected) {\n const e = new si(\"Max\");\n e.value = 1, e.output.connectTo(this.max);\n }\n }\n _buildBlock() {\n let e = null;\n switch (this._currentLockId = -1, this.min.type) {\n case b.Int:\n case b.Float: {\n e = (t) => {\n const i = this.min.getConnectedValue(t) || 0, r = this.max.getConnectedValue(t) || 0;\n return i + Math.random() * (r - i);\n };\n break;\n }\n case b.Vector2: {\n e = (t) => {\n const i = this.min.getConnectedValue(t) || me.Zero(), r = this.max.getConnectedValue(t) || me.Zero();\n return new me(i.x + Math.random() * (r.x - i.x), i.y + Math.random() * (r.y - i.y));\n };\n break;\n }\n case b.Vector3: {\n e = (t) => {\n const i = this.min.getConnectedValue(t) || _.Zero(), r = this.max.getConnectedValue(t) || _.Zero();\n return new _(i.x + Math.random() * (r.x - i.x), i.y + Math.random() * (r.y - i.y), i.z + Math.random() * (r.z - i.z));\n };\n break;\n }\n case b.Vector4: {\n e = (t) => {\n const i = this.min.getConnectedValue(t) || Ke.Zero(), r = this.max.getConnectedValue(t) || Ke.Zero();\n return new Ke(i.x + Math.random() * (r.x - i.x), i.y + Math.random() * (r.y - i.y), i.z + Math.random() * (r.z - i.z), i.w + Math.random() * (r.w - i.w));\n };\n break;\n }\n }\n this.lockMode === Zr.None || !e ? this.output._storedFunction = e : this.output._storedFunction = (t) => {\n let i = 0;\n switch (this.lockMode) {\n case Zr.InstanceID:\n i = t.getContextualValue(ct.InstanceID, !0) || 0;\n break;\n case Zr.LoopID:\n i = t.getContextualValue(ct.LoopID, !0) || 0;\n break;\n }\n return (this._currentLockId !== i || this.lockMode === Zr.None) && (this._currentLockId = i, this.output._storedValue = e(t)), this.output._storedValue;\n };\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.lockMode = BABYLON.RandomBlockLocks.${Zr[this.lockMode]};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.lockMode = this.lockMode, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.lockMode = e.lockMode;\n }\n}\nP([\n gt(\"LockMode\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"None\", value: Zr.None },\n { label: \"LoopID\", value: Zr.LoopID },\n { label: \"InstanceID\", value: Zr.InstanceID }\n ]\n })\n], Y0.prototype, \"lockMode\", void 0);\nRe(\"BABYLON.RandomBlock\", Y0);\nclass WP extends Ve {\n /**\n * Create a new NoiseBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"offset\", b.Vector3, !0, _.Zero()), this.registerInput(\"scale\", b.Float, !0, 1), this.registerInput(\"octaves\", b.Float, !0, 2, 0, 16), this.registerInput(\"roughness\", b.Float, !0, 0.5, 0, 1), this.registerOutput(\"output\", b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"NoiseBlock\";\n }\n /**\n * Gets the offset input component\n */\n get offset() {\n return this._inputs[0];\n }\n /**\n * Gets the scale input component\n */\n get scale() {\n return this._inputs[1];\n }\n /**\n * Gets the octaves input component\n */\n get octaves() {\n return this._inputs[2];\n }\n /**\n * Gets the roughtness input component\n */\n get roughness() {\n return this._inputs[3];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _negateIf(e, t) {\n return t !== 0 ? -e : e;\n }\n _noiseGrad(e, t, i, r) {\n const s = e & 15, a = s < 8 ? t : i, o = s === 12 || s == 14 ? t : r, l = s < 4 ? i : o;\n return this._negateIf(a, s & a) + this._negateIf(l, s & 2);\n }\n _fade(e) {\n return e * e * e * (e * (e * 6 - 15) + 10);\n }\n _hashBitRotate(e, t) {\n return e << t | e >> 32 - t;\n }\n _hash(e, t, i) {\n let r, s, a;\n return r = s = a = 3735928584, a += i, s += t, r += e, a ^= s, a -= this._hashBitRotate(s, 14), r ^= a, r -= this._hashBitRotate(a, 11), s ^= r, s -= this._hashBitRotate(r, 25), a ^= s, a -= this._hashBitRotate(s, 16), r ^= a, r -= this._hashBitRotate(a, 4), s ^= r, s -= this._hashBitRotate(r, 14), a ^= s, a -= this._hashBitRotate(s, 24), a;\n }\n _mix(e, t, i, r, s, a, o, l, c, h, u) {\n const f = 1 - c, d = 1 - h;\n return (1 - u) * (d * (e * f + t * c) + h * (i * f + r * c)) + u * (d * (s * f + a * c) + h * (o * f + l * c));\n }\n _perlinNoise(e) {\n const t = (e.x | 0) - (e.x < 0 ? 1 : 0), i = (e.y | 0) - (e.y < 0 ? 1 : 0), r = (e.z | 0) - (e.z < 0 ? 1 : 0), s = e.x - t, a = e.y - i, o = e.z - r, l = this._fade(s), c = this._fade(a), h = this._fade(o);\n return this._mix(this._noiseGrad(this._hash(t, i, r), s, a, o), this._noiseGrad(this._hash(t + 1, i, r), s - 1, a, o), this._noiseGrad(this._hash(t, i + 1, r), s, a - 1, o), this._noiseGrad(this._hash(t + 1, i + 1, r), s - 1, a - 1, o), this._noiseGrad(this._hash(t, i, r + 1), s, a, o - 1), this._noiseGrad(this._hash(t + 1, i, r + 1), s - 1, a, o - 1), this._noiseGrad(this._hash(t, i + 1, r + 1), s, a - 1, o - 1), this._noiseGrad(this._hash(t + 1, i + 1, r + 1), s - 1, a - 1, o - 1), l, c, h);\n }\n _perlinSigned(e) {\n return this._perlinNoise(e) * 0.982;\n }\n _perlin(e) {\n return this._perlinSigned(e) / 2 + 0.5;\n }\n /**\n * Gets a perlin noise value\n * @param octaves number of octaves\n * @param roughness roughness\n * @param _position position vector\n * @param offset offset vector\n * @param scale scale value\n * @returns a value between 0 and 1\n * @see Based on https://github.com/blender/blender/blob/main/source/blender/blenlib/intern/noise.cc#L533\n */\n noise(e, t, i, r, s) {\n const a = new _(i.x * s + r.x, i.y * s + r.y, i.z * s + r.z);\n let o = 1, l = 1, c = 0, h = 0;\n e = je.Clamp(e, 0, 15);\n const u = e | 0;\n for (let g = 0; g <= u; g++) {\n const m = this._perlin(a.scale(o));\n h += m * l, c += l, l *= je.Clamp(t, 0, 1), o *= 2;\n }\n const f = e - Math.floor(e);\n if (f == 0)\n return h / c;\n const d = this._perlin(a.scale(o));\n let p = h + d * l;\n return h /= c, p /= c + l, (1 - f) * h + f * p;\n }\n _buildBlock() {\n this.output._storedFunction = (e) => {\n const t = e.getContextualValue(ct.Positions), i = this.octaves.getConnectedValue(e), r = this.roughness.getConnectedValue(e), s = this.offset.getConnectedValue(e), a = this.scale.getConnectedValue(e);\n return this.noise(i, r, t, s, a);\n };\n }\n}\nRe(\"BABYLON.NoiseBlock\", WP);\nclass Z0 extends Ve {\n /**\n * Create a new MergeGeometryBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.registerInput(\"geometry0\", b.Geometry), this.registerInput(\"geometry1\", b.Geometry, !0), this.registerInput(\"geometry2\", b.Geometry, !0), this.registerInput(\"geometry3\", b.Geometry, !0), this.registerInput(\"geometry4\", b.Geometry, !0), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"MergeGeometryBlock\";\n }\n /**\n * Gets the geometry0 input component\n */\n get geometry0() {\n return this._inputs[0];\n }\n /**\n * Gets the geometry1 input component\n */\n get geometry1() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry2 input component\n */\n get geometry2() {\n return this._inputs[2];\n }\n /**\n * Gets the geometry3 input component\n */\n get geometry3() {\n return this._inputs[3];\n }\n /**\n * Gets the geometry4 input component\n */\n get geometry4() {\n return this._inputs[4];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n let r = this.geometry0.getConnectedValue(i);\n const s = [];\n if (r)\n r = r.clone();\n else\n return null;\n if (this.geometry1.isConnected) {\n const a = this.geometry1.getConnectedValue(i);\n a && s.push(a);\n }\n if (this.geometry2.isConnected) {\n const a = this.geometry2.getConnectedValue(i);\n a && s.push(a);\n }\n if (this.geometry3.isConnected) {\n const a = this.geometry3.getConnectedValue(i);\n a && s.push(a);\n }\n if (this.geometry4.isConnected) {\n const a = this.geometry4.getConnectedValue(i);\n a && s.push(a);\n }\n return s.length && r && (r = r.merge(s, !0, !1, !0, !0)), r;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], Z0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.MergeGeometryBlock\", Z0);\nclass j0 extends Ve {\n /**\n * Create a new GeometryCollectionBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"geometry0\", b.Geometry, !0), this.registerInput(\"geometry1\", b.Geometry, !0), this.registerInput(\"geometry2\", b.Geometry, !0), this.registerInput(\"geometry3\", b.Geometry, !0), this.registerInput(\"geometry4\", b.Geometry, !0), this.registerInput(\"geometry5\", b.Geometry, !0), this.registerInput(\"geometry6\", b.Geometry, !0), this.registerInput(\"geometry7\", b.Geometry, !0), this.registerInput(\"geometry8\", b.Geometry, !0), this.registerInput(\"geometry9\", b.Geometry, !0), this.registerOutput(\"output\", b.Geometry), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryCollectionBlock\";\n }\n /**\n * Gets the geometry0 input component\n */\n get geometry0() {\n return this._inputs[0];\n }\n /**\n * Gets the geometry1 input component\n */\n get geometry1() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry2 input component\n */\n get geometry2() {\n return this._inputs[2];\n }\n /**\n * Gets the geometry3 input component\n */\n get geometry3() {\n return this._inputs[3];\n }\n /**\n * Gets the geometry4 input component\n */\n get geometry4() {\n return this._inputs[4];\n }\n /**\n * Gets the geometry5 input component\n */\n get geometry5() {\n return this._inputs[5];\n }\n /**\n * Gets the geometry6 input component\n */\n get geometry6() {\n return this._inputs[6];\n }\n /**\n * Gets the geometry7 input component\n */\n get geometry7() {\n return this._inputs[7];\n }\n /**\n * Gets the geometry8 input component\n */\n get geometry8() {\n return this._inputs[8];\n }\n /**\n * Gets the geometry9 input component\n */\n get geometry9() {\n return this._inputs[9];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _storeGeometry(e, t, i, r) {\n if (e.isConnected) {\n const s = e.getConnectedValue(t);\n if (!s)\n return;\n s.metadata = s.metadata || {}, s.metadata.collectionId = i, r.push(s);\n }\n }\n _buildBlock(e) {\n const t = (i) => {\n const r = [];\n return this._storeGeometry(this.geometry0, i, 0, r), this._storeGeometry(this.geometry1, i, 1, r), this._storeGeometry(this.geometry2, i, 2, r), this._storeGeometry(this.geometry3, i, 3, r), this._storeGeometry(this.geometry4, i, 4, r), this._storeGeometry(this.geometry5, i, 5, r), this._storeGeometry(this.geometry6, i, 6, r), this._storeGeometry(this.geometry7, i, 7, r), this._storeGeometry(this.geometry8, i, 8, r), this._storeGeometry(this.geometry9, i, 9, r), r.length ? r[Math.round(Math.random() * (r.length - 1))] : null;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext;\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], j0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.GeometryCollectionBlock\", j0);\nclass GP extends Ve {\n /**\n * Creates a new GeometryElbowBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"input\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0];\n }\n /**\n * Gets the time spent to build this block (in ms)\n */\n get buildExecutionTime() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryElbowBlock\";\n }\n /**\n * Gets the input component\n */\n get input() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n super._buildBlock(e);\n const t = this._outputs[0], i = this._inputs[0];\n t._storedFunction = (r) => i.getConnectedValue(r);\n }\n}\nRe(\"BABYLON.GeometryElbowBlock\", GP);\nclass XP extends Ve {\n /**\n * Creates a new ComputeNormalsBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"geometry\", b.Geometry), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"ComputeNormalsBlock\";\n }\n /**\n * Gets the geometry component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n this.output._storedFunction = (e) => {\n if (!this.geometry.isConnected)\n return null;\n const t = this.geometry.getConnectedValue(e);\n return t.normals || (t.normals = []), re.ComputeNormals(t.positions, t.indices, t.normals), t;\n };\n }\n}\nRe(\"BABYLON.ComputeNormalsBlock\", XP);\nclass HP extends Ve {\n /**\n * Create a new VectorConverterBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"xyzw \", b.Vector4, !0), this.registerInput(\"xyz \", b.Vector3, !0), this.registerInput(\"xy \", b.Vector2, !0), this.registerInput(\"zw \", b.Vector2, !0), this.registerInput(\"x \", b.Float, !0), this.registerInput(\"y \", b.Float, !0), this.registerInput(\"z \", b.Float, !0), this.registerInput(\"w \", b.Float, !0), this.registerOutput(\"xyzw\", b.Vector4), this.registerOutput(\"xyz\", b.Vector3), this.registerOutput(\"xy\", b.Vector2), this.registerOutput(\"zw\", b.Vector2), this.registerOutput(\"x\", b.Float), this.registerOutput(\"y\", b.Float), this.registerOutput(\"z\", b.Float), this.registerOutput(\"w\", b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"VectorConverterBlock\";\n }\n /**\n * Gets the xyzw component (input)\n */\n get xyzwIn() {\n return this._inputs[0];\n }\n /**\n * Gets the xyz component (input)\n */\n get xyzIn() {\n return this._inputs[1];\n }\n /**\n * Gets the xy component (input)\n */\n get xyIn() {\n return this._inputs[2];\n }\n /**\n * Gets the zw component (input)\n */\n get zwIn() {\n return this._inputs[3];\n }\n /**\n * Gets the x component (input)\n */\n get xIn() {\n return this._inputs[4];\n }\n /**\n * Gets the y component (input)\n */\n get yIn() {\n return this._inputs[5];\n }\n /**\n * Gets the z component (input)\n */\n get zIn() {\n return this._inputs[6];\n }\n /**\n * Gets the w component (input)\n */\n get wIn() {\n return this._inputs[7];\n }\n /**\n * Gets the xyzw component (output)\n */\n get xyzwOut() {\n return this._outputs[0];\n }\n /**\n * Gets the xyz component (output)\n */\n get xyzOut() {\n return this._outputs[1];\n }\n /**\n * Gets the xy component (output)\n */\n get xyOut() {\n return this._outputs[2];\n }\n /**\n * Gets the zw component (output)\n */\n get zwOut() {\n return this._outputs[3];\n }\n /**\n * Gets the x component (output)\n */\n get xOut() {\n return this._outputs[4];\n }\n /**\n * Gets the y component (output)\n */\n get yOut() {\n return this._outputs[5];\n }\n /**\n * Gets the z component (output)\n */\n get zOut() {\n return this._outputs[6];\n }\n /**\n * Gets the w component (output)\n */\n get wOut() {\n return this._outputs[7];\n }\n _inputRename(e) {\n return e === \"xyzw \" ? \"xyzwIn\" : e === \"xyz \" ? \"xyzIn\" : e === \"xy \" ? \"xyIn\" : e === \"zw \" ? \"zwIn\" : e === \"x \" ? \"xIn\" : e === \"y \" ? \"yIn\" : e === \"z \" ? \"zIn\" : e === \"w \" ? \"wIn\" : e;\n }\n _outputRename(e) {\n switch (e) {\n case \"x\":\n return \"xOut\";\n case \"y\":\n return \"yOut\";\n case \"z\":\n return \"zOut\";\n case \"w\":\n return \"wOut\";\n case \"xy\":\n return \"xyOut\";\n case \"zw\":\n return \"zwOut\";\n case \"xyz\":\n return \"xyzOut\";\n case \"xyzw\":\n return \"xyzwOut\";\n default:\n return e;\n }\n }\n _buildBlock(e) {\n super._buildBlock(e);\n const t = this.xIn, i = this.yIn, r = this.zIn, s = this.wIn, a = this.xyIn, o = this.zwIn, l = this.xyzIn, c = this.xyzwIn, h = this.xyzwOut, u = this.xyzOut, f = this.xyOut, d = this.zwOut, p = this.xOut, g = this.yOut, m = this.zOut, v = this.wOut, E = (C) => {\n if (c.isConnected)\n return c.getConnectedValue(C);\n let T = 0, R = 0, x = 0, S = 0;\n if (t.isConnected && (T = t.getConnectedValue(C)), i.isConnected && (R = i.getConnectedValue(C)), r.isConnected && (x = r.getConnectedValue(C)), s.isConnected && (S = s.getConnectedValue(C)), a.isConnected) {\n const M = a.getConnectedValue(C);\n M && (T = M.x, R = M.y);\n }\n if (o.isConnected) {\n const M = o.getConnectedValue(C);\n M && (x = M.x, S = M.y);\n }\n if (l.isConnected) {\n const M = l.getConnectedValue(C);\n M && (T = M.x, R = M.y, x = M.z);\n }\n return new Ke(T, R, x, S);\n };\n h._storedFunction = (C) => E(C), u._storedFunction = (C) => {\n const T = E(C);\n return new _(T.x, T.y, T.z);\n }, f._storedFunction = (C) => {\n const T = E(C);\n return new me(T.x, T.y);\n }, d._storedFunction = (C) => {\n const T = E(C);\n return new me(T.z, T.w);\n }, p._storedFunction = (C) => E(C).x, g._storedFunction = (C) => E(C).y, m._storedFunction = (C) => E(C).z, v._storedFunction = (C) => E(C).w;\n }\n}\nRe(\"BABYLON.VectorConverterBlock\", HP);\nclass KP extends Ve {\n /**\n * Creates a new NormalizeVectorBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"input\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture), this._outputs[0]._typeConnectionSource = this._inputs[0];\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"NormalizeVectorBlock\";\n }\n /**\n * Gets the input component\n */\n get input() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n if (super._buildBlock(e), this.output._storedFunction = null, !this.input.isConnected) {\n this.output._storedValue = null;\n return;\n }\n this.output._storedFunction = (t) => this.input.getConnectedValue(t).normalize();\n }\n}\nRe(\"BABYLON.NormalizeVectorBlock\", KP);\nclass Q0 extends Ve {\n /**\n * Create a new SetMaterialIDBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"id\", b.Int, !0, 0), this.registerOutput(\"output\", b.Geometry), this.id.acceptedConnectionPointTypes.push(b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"SetMaterialIDBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the id input component\n */\n get id() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n if (!this.geometry.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const t = (i) => {\n const r = this.geometry.getConnectedValue(i);\n if (!r || !r.indices || !r.positions)\n return r;\n const s = new Gl();\n return s.materialIndex = this.id.getConnectedValue(i) | 0, s.indexStart = 0, s.indexCount = r.indices.length, s.verticesStart = 0, s.verticesCount = r.positions.length / 3, r.materialInfos = [s], r;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], Q0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.SetMaterialIDBlock\", Q0);\nvar it;\n(function(n) {\n n[n.Cos = 0] = \"Cos\", n[n.Sin = 1] = \"Sin\", n[n.Abs = 2] = \"Abs\", n[n.Exp = 3] = \"Exp\", n[n.Round = 4] = \"Round\", n[n.Floor = 5] = \"Floor\", n[n.Ceiling = 6] = \"Ceiling\", n[n.Sqrt = 7] = \"Sqrt\", n[n.Log = 8] = \"Log\", n[n.Tan = 9] = \"Tan\", n[n.ArcTan = 10] = \"ArcTan\", n[n.ArcCos = 11] = \"ArcCos\", n[n.ArcSin = 12] = \"ArcSin\", n[n.Sign = 13] = \"Sign\", n[n.Negate = 14] = \"Negate\", n[n.OneMinus = 15] = \"OneMinus\", n[n.Reciprocal = 16] = \"Reciprocal\", n[n.ToDegrees = 17] = \"ToDegrees\", n[n.ToRadians = 18] = \"ToRadians\", n[n.Fract = 19] = \"Fract\", n[n.Exp2 = 20] = \"Exp2\";\n})(it || (it = {}));\nclass J0 extends Ve {\n /**\n * Creates a new GeometryTrigonometryBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.operation = it.Cos, this.registerInput(\"input\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryTrigonometryBlock\";\n }\n /**\n * Gets the input component\n */\n get input() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n super._buildBlock(e);\n let t = null;\n switch (this.operation) {\n case it.Cos: {\n t = (i) => Math.cos(i);\n break;\n }\n case it.Sin: {\n t = (i) => Math.sin(i);\n break;\n }\n case it.Abs: {\n t = (i) => Math.abs(i);\n break;\n }\n case it.Exp: {\n t = (i) => Math.exp(i);\n break;\n }\n case it.Exp2: {\n t = (i) => Math.pow(2, i);\n break;\n }\n case it.Round: {\n t = (i) => Math.round(i);\n break;\n }\n case it.Floor: {\n t = (i) => Math.floor(i);\n break;\n }\n case it.Ceiling: {\n t = (i) => Math.ceil(i);\n break;\n }\n case it.Sqrt: {\n t = (i) => Math.sqrt(i);\n break;\n }\n case it.Log: {\n t = (i) => Math.log(i);\n break;\n }\n case it.Tan: {\n t = (i) => Math.tan(i);\n break;\n }\n case it.ArcTan: {\n t = (i) => Math.atan(i);\n break;\n }\n case it.ArcCos: {\n t = (i) => Math.acos(i);\n break;\n }\n case it.ArcSin: {\n t = (i) => Math.asin(i);\n break;\n }\n case it.Sign: {\n t = (i) => Math.sign(i);\n break;\n }\n case it.Negate: {\n t = (i) => -i;\n break;\n }\n case it.OneMinus: {\n t = (i) => 1 - i;\n break;\n }\n case it.Reciprocal: {\n t = (i) => 1 / i;\n break;\n }\n case it.ToRadians: {\n t = (i) => i * Math.PI / 180;\n break;\n }\n case it.ToDegrees: {\n t = (i) => i * 180 / Math.PI;\n break;\n }\n case it.Fract: {\n t = (i) => i >= 0 ? i - Math.floor(i) : i - Math.ceil(i);\n break;\n }\n }\n if (!t) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n switch (this.input.type) {\n case b.Int:\n case b.Float: {\n this.output._storedFunction = (i) => {\n const r = this.input.getConnectedValue(i);\n return t(r);\n };\n break;\n }\n case b.Vector2: {\n this.output._storedFunction = (i) => {\n const r = this.input.getConnectedValue(i);\n return new me(t(r.x), t(r.y));\n };\n break;\n }\n case b.Vector3: {\n this.output._storedFunction = (i) => {\n const r = this.input.getConnectedValue(i);\n return new _(t(r.x), t(r.y), t(r.z));\n };\n break;\n }\n case b.Vector4: {\n this.output._storedFunction = (i) => {\n const r = this.input.getConnectedValue(i);\n return new Ke(t(r.x), t(r.y), t(r.z), t(r.w));\n };\n break;\n }\n }\n return this;\n }\n serialize() {\n const e = super.serialize();\n return e.operation = this.operation, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.operation = e.operation;\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.operation = BABYLON.GeometryTrigonometryBlockOperations.${it[this.operation]};\n`;\n }\n}\nP([\n gt(\"Operation\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"Cos\", value: it.Cos },\n { label: \"Sin\", value: it.Sin },\n { label: \"Abs\", value: it.Abs },\n { label: \"Exp\", value: it.Exp },\n { label: \"Exp2\", value: it.Exp2 },\n { label: \"Round\", value: it.Round },\n { label: \"Floor\", value: it.Floor },\n { label: \"Ceiling\", value: it.Ceiling },\n { label: \"Sqrt\", value: it.Sqrt },\n { label: \"Log\", value: it.Log },\n { label: \"Tan\", value: it.Tan },\n { label: \"ArcTan\", value: it.ArcTan },\n { label: \"ArcCos\", value: it.ArcCos },\n { label: \"ArcSin\", value: it.ArcSin },\n { label: \"Sign\", value: it.Sign },\n { label: \"Negate\", value: it.Negate },\n { label: \"OneMinus\", value: it.OneMinus },\n { label: \"Reciprocal\", value: it.Reciprocal },\n { label: \"ToDegrees\", value: it.ToDegrees },\n { label: \"ToRadians\", value: it.ToRadians },\n { label: \"Fract\", value: it.Fract }\n ]\n })\n], J0.prototype, \"operation\", void 0);\nRe(\"BABYLON.GeometryTrigonometryBlock\", J0);\nclass $0 extends Ve {\n /**\n * Create a new GeometryTransformBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._rotationMatrix = new L(), this._scalingMatrix = new L(), this._translationMatrix = new L(), this._scalingRotationMatrix = new L(), this._transformMatrix = new L(), this.evaluateContext = !0, this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"matrix\", b.Matrix, !0), this.registerInput(\"translation\", b.Vector3, !0, _.Zero()), this.registerInput(\"rotation\", b.Vector3, !0, _.Zero()), this.registerInput(\"scaling\", b.Vector3, !0, _.One()), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryTransformBlock\";\n }\n /**\n * Gets the value input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix input component\n */\n get matrix() {\n return this._inputs[1];\n }\n /**\n * Gets the translation input component\n */\n get translation() {\n return this._inputs[2];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[3];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[4];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n if (!this.value.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const t = (i) => {\n const r = this.value.getConnectedValue(i);\n if (!r)\n return null;\n let s;\n if (this.matrix.isConnected)\n s = this.matrix.getConnectedValue(i);\n else {\n const a = this.scaling.getConnectedValue(i), o = this.rotation.getConnectedValue(i), l = this.translation.getConnectedValue(i);\n L.ScalingToRef(a.x, a.y, a.z, this._scalingMatrix), L.RotationYawPitchRollToRef(o.y, o.x, o.z, this._rotationMatrix), L.TranslationToRef(l.x, l.y, l.z, this._translationMatrix), this._scalingMatrix.multiplyToRef(this._rotationMatrix, this._scalingRotationMatrix), this._scalingRotationMatrix.multiplyToRef(this._translationMatrix, this._transformMatrix), s = this._transformMatrix;\n }\n switch (this.value.type) {\n case b.Geometry: {\n const a = r.clone();\n return a.transform(s), a;\n }\n case b.Vector2:\n return me.Transform(r, s);\n case b.Vector3:\n return _.TransformCoordinates(r, s);\n case b.Vector4:\n return Ke.TransformCoordinates(r, s);\n }\n return null;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], $0.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.GeometryTransformBlock\", $0);\nclass qP extends Ve {\n /**\n * Create a new RotationXBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"angle\", b.Float, !1, 0), this.registerOutput(\"matrix\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"RotationXBlock\";\n }\n /**\n * Gets the angle input component\n */\n get angle() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix output component\n */\n get matrix() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.angle.isConnected) {\n const e = new si(\"Angle\");\n e.value = 0, e.output.connectTo(this.angle);\n }\n }\n _buildBlock(e) {\n super._buildBlock(e), this.matrix._storedFunction = (t) => L.RotationX(this.angle.getConnectedValue(t));\n }\n}\nRe(\"BABYLON.RotationXBlock\", qP);\nclass YP extends Ve {\n /**\n * Create a new RotationYBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"angle\", b.Float, !1, 0), this.registerOutput(\"matrix\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"RotationYBlock\";\n }\n /**\n * Gets the angle input component\n */\n get angle() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix output component\n */\n get matrix() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.angle.isConnected) {\n const e = new si(\"Angle\");\n e.value = 0, e.output.connectTo(this.angle);\n }\n }\n _buildBlock(e) {\n super._buildBlock(e), this.matrix._storedFunction = (t) => L.RotationY(this.angle.getConnectedValue(t));\n }\n}\nRe(\"BABYLON.RotationYBlock\", YP);\nclass ZP extends Ve {\n /**\n * Create a new RotationZBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"angle\", b.Float, !1, 0), this.registerOutput(\"matrix\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"RotationZBlock\";\n }\n /**\n * Gets the angle input component\n */\n get angle() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix output component\n */\n get matrix() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.angle.isConnected) {\n const e = new si(\"Angle\");\n e.value = 0, e.output.connectTo(this.angle);\n }\n }\n _buildBlock(e) {\n super._buildBlock(e), this.matrix._storedFunction = (t) => L.RotationZ(this.angle.getConnectedValue(t));\n }\n}\nRe(\"BABYLON.RotationZBlock\", ZP);\nclass jP extends Ve {\n /**\n * Create a new ScalingBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"scale\", b.Vector3, !1, _.One()), this.registerOutput(\"matrix\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"ScalingBlock\";\n }\n /**\n * Gets the scale input component\n */\n get scale() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix output component\n */\n get matrix() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.scale.isConnected) {\n const e = new si(\"Scale\");\n e.value = new _(1, 1, 1), e.output.connectTo(this.scale);\n }\n }\n _buildBlock(e) {\n super._buildBlock(e), this.matrix._storedFunction = (t) => {\n const i = this.scale.getConnectedValue(t);\n return L.Scaling(i.x, i.y, i.z);\n };\n }\n}\nRe(\"BABYLON.ScalingBlock\", jP);\nclass QP extends Ve {\n /**\n * Create a new AlignBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"source\", b.Vector3, !0, _.Up()), this.registerInput(\"target\", b.Vector3, !0, _.Left()), this.registerOutput(\"matrix\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"AlignBlock\";\n }\n /**\n * Gets the source input component\n */\n get source() {\n return this._inputs[0];\n }\n /**\n * Gets the target input component\n */\n get target() {\n return this._inputs[1];\n }\n /**\n * Gets the matrix output component\n */\n get matrix() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n super._buildBlock(e), this.matrix._storedFunction = (t) => {\n const i = this.source.getConnectedValue(t).clone(), r = this.target.getConnectedValue(t).clone(), s = new L();\n return i.normalize(), r.normalize(), L.RotationAlignToRef(i, r, s, !0), s;\n };\n }\n}\nRe(\"BABYLON.AlignBlock\", QP);\nclass JP extends Ve {\n /**\n * Create a new TranslationBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"translation\", b.Vector3, !1, _.Zero()), this.registerOutput(\"matrix\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"TranslationBlock\";\n }\n /**\n * Gets the translation input component\n */\n get translation() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix output component\n */\n get matrix() {\n return this._outputs[0];\n }\n autoConfigure() {\n if (!this.translation.isConnected) {\n const e = new si(\"Translation\");\n e.value = new _(0, 0, 0), e.output.connectTo(this.translation);\n }\n }\n _buildBlock(e) {\n super._buildBlock(e), this.matrix._storedFunction = (t) => {\n const i = this.translation.getConnectedValue(t);\n return L.Translation(i.x, i.y, i.z);\n };\n }\n}\nRe(\"BABYLON.TranslationBlock\", JP);\nclass Af extends Ve {\n /**\n * Create a new InstantiateOnVerticesBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._indexTranslation = null, this.evaluateContext = !0, this.removeDuplicatedPositions = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"instance\", b.Geometry, !0), this.registerInput(\"density\", b.Float, !0, 1, 0, 1), this.registerInput(\"matrix\", b.Matrix, !0), this.registerInput(\"rotation\", b.Vector3, !0, _.Zero()), this.registerInput(\"scaling\", b.Vector3, !0, _.One()), this.scaling.acceptedConnectionPointTypes.push(b.Float), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current instance index in the current flow\n * @returns the current index\n */\n getInstanceIndex() {\n return this._currentLoopIndex;\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._indexTranslation ? this._indexTranslation[this._currentIndex] : this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentLoopIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateOnVerticesBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the instance input component\n */\n get instance() {\n return this._inputs[1];\n }\n /**\n * Gets the density input component\n */\n get density() {\n return this._inputs[2];\n }\n /**\n * Gets the matrix input component\n */\n get matrix() {\n return this._inputs[3];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[4];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[5];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), i.pushInstancingContext(this), this._vertexData = this.geometry.getConnectedValue(i), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions || !this.instance.isConnected) {\n i.restoreExecutionContext(), i.restoreInstancingContext(), i.restoreGeometryContext(), this.output._storedValue = null;\n return;\n }\n let r = this._vertexData.positions.length / 3;\n const s = [], a = new _(), o = [];\n let l = this._vertexData.positions;\n if (this._currentLoopIndex = 0, this.removeDuplicatedPositions) {\n for (this._indexTranslation = {}, this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const c = l[this._currentIndex * 3], h = l[this._currentIndex * 3 + 1], u = l[this._currentIndex * 3 + 2];\n let f = !1;\n for (let d = 0; d < o.length; d += 3)\n if (Math.abs(o[d] - c) < xt && Math.abs(o[d + 1] - h) < xt && Math.abs(o[d + 2] - u) < xt) {\n f = !0;\n break;\n }\n f || (this._indexTranslation[o.length / 3] = this._currentIndex, o.push(c, h, u));\n }\n l = o, r = l.length / 3;\n } else\n this._indexTranslation = null;\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const c = this.instance.getConnectedValue(i);\n if (!c || !c.positions || c.positions.length === 0)\n continue;\n const h = this.density.getConnectedValue(i);\n if (h < 1 && Math.random() > h)\n continue;\n a.fromArray(l, this._currentIndex * 3);\n const u = c.clone();\n if (this.matrix.isConnected) {\n const f = this.matrix.getConnectedValue(i);\n i._instantiateWithPositionAndMatrix(u, a, f, s);\n } else {\n const f = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly), d = this.rotation.getConnectedValue(i) || _.ZeroReadOnly;\n i._instantiate(u, a, d, f, s);\n }\n this._currentLoopIndex++;\n }\n if (i.restoreGeometryContext(), i.restoreExecutionContext(), i.restoreInstancingContext(), s.length)\n if (s.length === 1)\n this._vertexData = s[0];\n else {\n const c = s.splice(0, 1)[0];\n this._vertexData = c.merge(s, !0, !1, !0, !0);\n }\n else\n return null;\n return this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n let e = super._dumpPropertiesCode() + `${this._codeVariableName}.removeDuplicatedPositions = ${this.removeDuplicatedPositions ? \"true\" : \"false\"};\n`;\n return e += `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`, e;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.removeDuplicatedPositions = this.removeDuplicatedPositions, e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.removeDuplicatedPositions = e.removeDuplicatedPositions, e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], Af.prototype, \"evaluateContext\", void 0);\nP([\n gt(\"Remove duplicated positions\", ht.Boolean, \"ADVANCED\", { notifiers: { update: !0 } })\n], Af.prototype, \"removeDuplicatedPositions\", void 0);\nRe(\"BABYLON.InstantiateOnVerticesBlock\", Af);\nclass eE extends Ve {\n /**\n * Create a new InstantiateOnFacesBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._currentPosition = new _(), this._currentUV = new me(), this._vertex0 = new _(), this._vertex1 = new _(), this._vertex2 = new _(), this._tempVector0 = new _(), this._tempVector1 = new _(), this._uv0 = new me(), this._uv1 = new me(), this._uv2 = new me(), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"instance\", b.Geometry, !0), this.registerInput(\"count\", b.Int, !0, 256), this.registerInput(\"matrix\", b.Matrix, !0), this.registerInput(\"rotation\", b.Vector3, !0, _.Zero()), this.registerInput(\"scaling\", b.Vector3, !0, _.One()), this.scaling.acceptedConnectionPointTypes.push(b.Float), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current instance index in the current flow\n * @returns the current index\n */\n getInstanceIndex() {\n return this._currentLoopIndex;\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return 0;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return this._currentFaceIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentLoopIndex;\n }\n /**\n * Gets the value associated with a contextual positions\n * @returns the value associated with the source\n */\n getOverridePositionsContextualValue() {\n return this._currentPosition;\n }\n /**\n * Gets the value associated with a contextual normals\n * @returns the value associated with the source\n */\n getOverrideNormalsContextualValue() {\n return this._vertex1.subtractToRef(this._vertex0, this._tempVector0), this._vertex2.subtractToRef(this._vertex1, this._tempVector1), this._tempVector0.normalize(), this._tempVector1.normalize(), _.Cross(this._tempVector1, this._tempVector0);\n }\n /**\n * Gets the value associated with a contextual UV1 se\n * @returns the value associated with the source\n */\n getOverrideUVs1ContextualValue() {\n return this._currentUV;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateOnFacesBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the instance input component\n */\n get instance() {\n return this._inputs[1];\n }\n /**\n * Gets the count input component\n */\n get count() {\n return this._inputs[2];\n }\n /**\n * Gets the matrix input component\n */\n get matrix() {\n return this._inputs[3];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[4];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[5];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), i.pushInstancingContext(this), this._vertexData = this.geometry.getConnectedValue(i), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions || !this._vertexData.indices || !this.instance.isConnected) {\n i.restoreExecutionContext(), i.restoreInstancingContext(), i.restoreGeometryContext(), this.output._storedValue = null;\n return;\n }\n let r = null;\n const s = this.count.getConnectedValue(i), a = this._vertexData.indices.length / 3, o = s / a;\n let l = 0;\n const c = [];\n let h = 0;\n for (this._currentLoopIndex = 0, this._currentFaceIndex = 0; this._currentFaceIndex < a; this._currentFaceIndex++) {\n l += o;\n const u = (l | 0) - h;\n if (u < 1)\n continue;\n const f = this._vertexData.indices[this._currentFaceIndex * 3], d = this._vertexData.indices[this._currentFaceIndex * 3 + 1], p = this._vertexData.indices[this._currentFaceIndex * 3 + 2];\n this._vertex0.fromArray(this._vertexData.positions, f * 3), this._vertex1.fromArray(this._vertexData.positions, d * 3), this._vertex2.fromArray(this._vertexData.positions, p * 3), this._vertexData.uvs && (this._uv0.fromArray(this._vertexData.uvs, f * 2), this._uv1.fromArray(this._vertexData.uvs, d * 2), this._uv2.fromArray(this._vertexData.uvs, p * 2));\n for (let g = 0; g < u && !(h >= s); g++) {\n let m = Math.random(), v = Math.random();\n if (m > v) {\n const x = m;\n m = v, v = x;\n }\n const E = m, C = v - m, T = 1 - E - C;\n if (this._currentPosition.set(E * this._vertex0.x + C * this._vertex1.x + T * this._vertex2.x, E * this._vertex0.y + C * this._vertex1.y + T * this._vertex2.y, E * this._vertex0.z + C * this._vertex1.z + T * this._vertex2.z), this._vertexData.uvs && this._currentUV.set(E * this._uv0.x + C * this._uv1.x + T * this._uv2.x, E * this._uv0.y + C * this._uv1.y + T * this._uv2.y), r = this.instance.getConnectedValue(i), !r || !r.positions || r.positions.length === 0) {\n l -= o;\n continue;\n }\n const R = r.clone();\n if (this.matrix.isConnected) {\n const x = this.matrix.getConnectedValue(i);\n i._instantiateWithPositionAndMatrix(R, this._currentPosition, x, c);\n } else {\n const x = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly), S = this.rotation.getConnectedValue(i) || _.ZeroReadOnly;\n i._instantiate(R, this._currentPosition, S, x, c);\n }\n h++, this._currentLoopIndex++;\n }\n }\n if (c.length)\n if (c.length === 1)\n this._vertexData = c[0];\n else {\n const u = c.splice(0, 1)[0];\n this._vertexData = u.merge(c, !0, !1, !0, !0);\n }\n return i.restoreExecutionContext(), i.restoreInstancingContext(), i.restoreGeometryContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], eE.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.InstantiateOnFacesBlock\", eE);\nclass ot {\n /**\n * Creates a new ray\n * @param origin origin point\n * @param direction direction\n * @param length length of the ray\n * @param epsilon The epsilon value to use when calculating the ray/triangle intersection (default: 0)\n */\n constructor(e, t, i = Number.MAX_VALUE, r = xt) {\n this.origin = e, this.direction = t, this.length = i, this.epsilon = r;\n }\n // Methods\n /**\n * Clone the current ray\n * @returns a new ray\n */\n clone() {\n return new ot(this.origin.clone(), this.direction.clone(), this.length);\n }\n /**\n * Checks if the ray intersects a box\n * This does not account for the ray length by design to improve perfs.\n * @param minimum bound of the box\n * @param maximum bound of the box\n * @param intersectionTreshold extra extend to be added to the box in all direction\n * @returns if the box was hit\n */\n intersectsBoxMinMax(e, t, i = 0) {\n const r = ot._TmpVector3[0].copyFromFloats(e.x - i, e.y - i, e.z - i), s = ot._TmpVector3[1].copyFromFloats(t.x + i, t.y + i, t.z + i);\n let a = 0, o = Number.MAX_VALUE, l, c, h, u;\n if (Math.abs(this.direction.x) < 1e-7) {\n if (this.origin.x < r.x || this.origin.x > s.x)\n return !1;\n } else if (l = 1 / this.direction.x, c = (r.x - this.origin.x) * l, h = (s.x - this.origin.x) * l, h === -1 / 0 && (h = 1 / 0), c > h && (u = c, c = h, h = u), a = Math.max(c, a), o = Math.min(h, o), a > o)\n return !1;\n if (Math.abs(this.direction.y) < 1e-7) {\n if (this.origin.y < r.y || this.origin.y > s.y)\n return !1;\n } else if (l = 1 / this.direction.y, c = (r.y - this.origin.y) * l, h = (s.y - this.origin.y) * l, h === -1 / 0 && (h = 1 / 0), c > h && (u = c, c = h, h = u), a = Math.max(c, a), o = Math.min(h, o), a > o)\n return !1;\n if (Math.abs(this.direction.z) < 1e-7) {\n if (this.origin.z < r.z || this.origin.z > s.z)\n return !1;\n } else if (l = 1 / this.direction.z, c = (r.z - this.origin.z) * l, h = (s.z - this.origin.z) * l, h === -1 / 0 && (h = 1 / 0), c > h && (u = c, c = h, h = u), a = Math.max(c, a), o = Math.min(h, o), a > o)\n return !1;\n return !0;\n }\n /**\n * Checks if the ray intersects a box\n * This does not account for the ray lenght by design to improve perfs.\n * @param box the bounding box to check\n * @param intersectionTreshold extra extend to be added to the BoundingBox in all direction\n * @returns if the box was hit\n */\n intersectsBox(e, t = 0) {\n return this.intersectsBoxMinMax(e.minimum, e.maximum, t);\n }\n /**\n * If the ray hits a sphere\n * @param sphere the bounding sphere to check\n * @param intersectionTreshold extra extend to be added to the BoundingSphere in all direction\n * @returns true if it hits the sphere\n */\n intersectsSphere(e, t = 0) {\n const i = e.center.x - this.origin.x, r = e.center.y - this.origin.y, s = e.center.z - this.origin.z, a = i * i + r * r + s * s, o = e.radius + t, l = o * o;\n if (a <= l)\n return !0;\n const c = i * this.direction.x + r * this.direction.y + s * this.direction.z;\n return c < 0 ? !1 : a - c * c <= l;\n }\n /**\n * If the ray hits a triange\n * @param vertex0 triangle vertex\n * @param vertex1 triangle vertex\n * @param vertex2 triangle vertex\n * @returns intersection information if hit\n */\n intersectsTriangle(e, t, i) {\n const r = ot._TmpVector3[0], s = ot._TmpVector3[1], a = ot._TmpVector3[2], o = ot._TmpVector3[3], l = ot._TmpVector3[4];\n t.subtractToRef(e, r), i.subtractToRef(e, s), _.CrossToRef(this.direction, s, a);\n const c = _.Dot(r, a);\n if (c === 0)\n return null;\n const h = 1 / c;\n this.origin.subtractToRef(e, o);\n const u = _.Dot(o, a) * h;\n if (u < -this.epsilon || u > 1 + this.epsilon)\n return null;\n _.CrossToRef(o, r, l);\n const f = _.Dot(this.direction, l) * h;\n if (f < -this.epsilon || u + f > 1 + this.epsilon)\n return null;\n const d = _.Dot(s, l) * h;\n return d > this.length ? null : new Eu(1 - u - f, u, d);\n }\n /**\n * Checks if ray intersects a plane\n * @param plane the plane to check\n * @returns the distance away it was hit\n */\n intersectsPlane(e) {\n let t;\n const i = _.Dot(e.normal, this.direction);\n if (Math.abs(i) < 999999997475243e-21)\n return null;\n {\n const r = _.Dot(e.normal, this.origin);\n return t = (-e.d - r) / i, t < 0 ? t < -999999997475243e-21 ? null : 0 : t;\n }\n }\n /**\n * Calculate the intercept of a ray on a given axis\n * @param axis to check 'x' | 'y' | 'z'\n * @param offset from axis interception (i.e. an offset of 1y is intercepted above ground)\n * @returns a vector containing the coordinates where 'axis' is equal to zero (else offset), or null if there is no intercept.\n */\n intersectsAxis(e, t = 0) {\n switch (e) {\n case \"y\": {\n const i = (this.origin.y - t) / this.direction.y;\n return i > 0 ? null : new _(this.origin.x + this.direction.x * -i, t, this.origin.z + this.direction.z * -i);\n }\n case \"x\": {\n const i = (this.origin.x - t) / this.direction.x;\n return i > 0 ? null : new _(t, this.origin.y + this.direction.y * -i, this.origin.z + this.direction.z * -i);\n }\n case \"z\": {\n const i = (this.origin.z - t) / this.direction.z;\n return i > 0 ? null : new _(this.origin.x + this.direction.x * -i, this.origin.y + this.direction.y * -i, t);\n }\n default:\n return null;\n }\n }\n /**\n * Checks if ray intersects a mesh. The ray is defined in WORLD space. A mesh triangle can be picked both from its front and back sides,\n * irrespective of orientation.\n * @param mesh the mesh to check\n * @param fastCheck defines if the first intersection will be used (and not the closest)\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\n * @param worldToUse defines the world matrix to use to get the world coordinate of the intersection point\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\n * @returns picking info of the intersection\n */\n intersectsMesh(e, t, i, r = !1, s, a = !1) {\n const o = z.Matrix[0];\n return e.getWorldMatrix().invertToRef(o), this._tmpRay ? ot.TransformToRef(this, o, this._tmpRay) : this._tmpRay = ot.Transform(this, o), e.intersects(this._tmpRay, t, i, r, s, a);\n }\n /**\n * Checks if ray intersects a mesh\n * @param meshes the meshes to check\n * @param fastCheck defines if the first intersection will be used (and not the closest)\n * @param results array to store result in\n * @returns Array of picking infos\n */\n intersectsMeshes(e, t, i) {\n i ? i.length = 0 : i = [];\n for (let r = 0; r < e.length; r++) {\n const s = this.intersectsMesh(e[r], t);\n s.hit && i.push(s);\n }\n return i.sort(this._comparePickingInfo), i;\n }\n _comparePickingInfo(e, t) {\n return e.distance < t.distance ? -1 : e.distance > t.distance ? 1 : 0;\n }\n /**\n * Intersection test between the ray and a given segment within a given tolerance (threshold)\n * @param sega the first point of the segment to test the intersection against\n * @param segb the second point of the segment to test the intersection against\n * @param threshold the tolerance margin, if the ray doesn't intersect the segment but is close to the given threshold, the intersection is successful\n * @returns the distance from the ray origin to the intersection point if there's intersection, or -1 if there's no intersection\n */\n intersectionSegment(e, t, i) {\n const r = this.origin, s = z.Vector3[0], a = z.Vector3[1], o = z.Vector3[2], l = z.Vector3[3];\n t.subtractToRef(e, s), this.direction.scaleToRef(ot._Rayl, o), r.addToRef(o, a), e.subtractToRef(r, l);\n const c = _.Dot(s, s), h = _.Dot(s, o), u = _.Dot(o, o), f = _.Dot(s, l), d = _.Dot(o, l), p = c * u - h * h;\n let g, m = p, v, E = p;\n p < ot._Smallnum ? (g = 0, m = 1, v = d, E = u) : (g = h * d - u * f, v = c * d - h * f, g < 0 ? (g = 0, v = d, E = u) : g > m && (g = m, v = d + h, E = u)), v < 0 ? (v = 0, -f < 0 ? g = 0 : -f > c ? g = m : (g = -f, m = c)) : v > E && (v = E, -f + h < 0 ? g = 0 : -f + h > c ? g = m : (g = -f + h, m = c));\n const C = Math.abs(g) < ot._Smallnum ? 0 : g / m, T = Math.abs(v) < ot._Smallnum ? 0 : v / E, R = z.Vector3[4];\n o.scaleToRef(T, R);\n const x = z.Vector3[5];\n s.scaleToRef(C, x), x.addInPlace(l);\n const S = z.Vector3[6];\n return x.subtractToRef(R, S), T > 0 && T <= this.length && S.lengthSquared() < i * i ? x.length() : -1;\n }\n /**\n * Update the ray from viewport position\n * @param x position\n * @param y y position\n * @param viewportWidth viewport width\n * @param viewportHeight viewport height\n * @param world world matrix\n * @param view view matrix\n * @param projection projection matrix\n * @param enableDistantPicking defines if picking should handle large values for mesh position/scaling (false by default)\n * @returns this ray updated\n */\n update(e, t, i, r, s, a, o, l = !1) {\n if (l) {\n ot._RayDistant || (ot._RayDistant = ot.Zero()), ot._RayDistant.unprojectRayToRef(e, t, i, r, L.IdentityReadOnly, a, o);\n const c = z.Matrix[0];\n s.invertToRef(c), ot.TransformToRef(ot._RayDistant, c, this);\n } else\n this.unprojectRayToRef(e, t, i, r, s, a, o);\n return this;\n }\n // Statics\n /**\n * Creates a ray with origin and direction of 0,0,0\n * @returns the new ray\n */\n static Zero() {\n return new ot(_.Zero(), _.Zero());\n }\n /**\n * Creates a new ray from screen space and viewport\n * @param x position\n * @param y y position\n * @param viewportWidth viewport width\n * @param viewportHeight viewport height\n * @param world world matrix\n * @param view view matrix\n * @param projection projection matrix\n * @returns new ray\n */\n static CreateNew(e, t, i, r, s, a, o) {\n return ot.Zero().update(e, t, i, r, s, a, o);\n }\n /**\n * Function will create a new transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be\n * transformed to the given world matrix.\n * @param origin The origin point\n * @param end The end point\n * @param world a matrix to transform the ray to. Default is the identity matrix.\n * @returns the new ray\n */\n static CreateNewFromTo(e, t, i = L.IdentityReadOnly) {\n const r = new ot(new _(0, 0, 0), new _(0, 0, 0));\n return ot.CreateFromToToRef(e, t, r, i);\n }\n /**\n * Function will update a transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be\n * transformed to the given world matrix.\n * @param origin The origin point\n * @param end The end point\n * @param result the object to store the result\n * @param world a matrix to transform the ray to. Default is the identity matrix.\n * @returns the ref ray\n */\n static CreateFromToToRef(e, t, i, r = L.IdentityReadOnly) {\n i.origin.copyFrom(e);\n const s = t.subtractToRef(e, i.direction), a = Math.sqrt(s.x * s.x + s.y * s.y + s.z * s.z);\n return i.length = a, i.direction.normalize(), ot.TransformToRef(i, r, i);\n }\n /**\n * Transforms a ray by a matrix\n * @param ray ray to transform\n * @param matrix matrix to apply\n * @returns the resulting new ray\n */\n static Transform(e, t) {\n const i = new ot(new _(0, 0, 0), new _(0, 0, 0));\n return ot.TransformToRef(e, t, i), i;\n }\n /**\n * Transforms a ray by a matrix\n * @param ray ray to transform\n * @param matrix matrix to apply\n * @param result ray to store result in\n * @returns the updated result ray\n */\n static TransformToRef(e, t, i) {\n _.TransformCoordinatesToRef(e.origin, t, i.origin), _.TransformNormalToRef(e.direction, t, i.direction), i.length = e.length, i.epsilon = e.epsilon;\n const r = i.direction, s = r.length();\n if (!(s === 0 || s === 1)) {\n const a = 1 / s;\n r.x *= a, r.y *= a, r.z *= a, i.length *= s;\n }\n return i;\n }\n /**\n * Unproject a ray from screen space to object space\n * @param sourceX defines the screen space x coordinate to use\n * @param sourceY defines the screen space y coordinate to use\n * @param viewportWidth defines the current width of the viewport\n * @param viewportHeight defines the current height of the viewport\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\n * @param view defines the view matrix to use\n * @param projection defines the projection matrix to use\n */\n unprojectRayToRef(e, t, i, r, s, a, o) {\n const l = z.Matrix[0];\n s.multiplyToRef(a, l), l.multiplyToRef(o, l), l.invert();\n const c = st.LastCreatedEngine, h = z.Vector3[0];\n h.x = e / i * 2 - 1, h.y = -(t / r * 2 - 1), h.z = c != null && c.useReverseDepthBuffer ? 1 : c != null && c.isNDCHalfZRange ? 0 : -1;\n const u = z.Vector3[1].copyFromFloats(h.x, h.y, 1 - 1e-8), f = z.Vector3[2], d = z.Vector3[3];\n _._UnprojectFromInvertedMatrixToRef(h, l, f), _._UnprojectFromInvertedMatrixToRef(u, l, d), this.origin.copyFrom(f), d.subtractToRef(f, this.direction), this.direction.normalize();\n }\n}\not._TmpVector3 = vi.BuildArray(6, _.Zero);\not._RayDistant = ot.Zero();\not._Smallnum = 1e-8;\not._Rayl = 1e9;\nOt.prototype.createPickingRay = function(n, e, t, i, r = !1) {\n const s = ot.Zero();\n return this.createPickingRayToRef(n, e, t, s, i, r), s;\n};\nOt.prototype.createPickingRayToRef = function(n, e, t, i, r, s = !1, a = !1) {\n const o = this.getEngine();\n if (!r && !(r = this.activeCamera))\n return this;\n const l = r.viewport, c = o.getRenderHeight(), { x: h, y: u, width: f, height: d } = l.toGlobal(o.getRenderWidth(), c), p = 1 / o.getHardwareScalingLevel();\n return n = n * p - h, e = e * p - (c - u - d), i.update(n, e, f, d, t || L.IdentityReadOnly, s ? L.IdentityReadOnly : r.getViewMatrix(), r.getProjectionMatrix(), a), this;\n};\nOt.prototype.createPickingRayInCameraSpace = function(n, e, t) {\n const i = ot.Zero();\n return this.createPickingRayInCameraSpaceToRef(n, e, i, t), i;\n};\nOt.prototype.createPickingRayInCameraSpaceToRef = function(n, e, t, i) {\n if (!ps)\n return this;\n const r = this.getEngine();\n if (!i && !(i = this.activeCamera))\n throw new Error(\"Active camera not set\");\n const s = i.viewport, a = r.getRenderHeight(), { x: o, y: l, width: c, height: h } = s.toGlobal(r.getRenderWidth(), a), u = L.Identity(), f = 1 / r.getHardwareScalingLevel();\n return n = n * f - o, e = e * f - (a - l - h), t.update(n, e, c, h, u, u, i.getProjectionMatrix()), this;\n};\nOt.prototype._internalPickForMesh = function(n, e, t, i, r, s, a, o) {\n const l = e(i, t.enableDistantPicking), c = t.intersects(l, r, a, s, i, o);\n return !c || !c.hit || !r && n != null && c.distance >= n.distance ? null : c;\n};\nOt.prototype._internalPick = function(n, e, t, i, r) {\n let s = null;\n const a = !!(this.activeCameras && this.activeCameras.length > 1 && this.cameraToUseForPointers !== this.activeCamera), o = this.cameraToUseForPointers || this.activeCamera;\n for (let l = 0; l < this.meshes.length; l++) {\n const c = this.meshes[l];\n if (e) {\n if (!e(c))\n continue;\n } else if (!c.isEnabled() || !c.isVisible || !c.isPickable)\n continue;\n const h = a && c.isWorldMatrixCameraDependent(), u = c.computeWorldMatrix(h, o);\n if (c.hasThinInstances && c.thinInstanceEnablePicking) {\n const f = this._internalPickForMesh(s, n, c, u, !0, !0, r);\n if (f) {\n if (i)\n return f;\n const d = z.Matrix[1], p = c.thinInstanceGetWorldMatrices();\n for (let g = 0; g < p.length; g++) {\n p[g].multiplyToRef(u, d);\n const v = this._internalPickForMesh(s, n, c, d, t, i, r, !0);\n if (v && (s = v, s.thinInstanceIndex = g, t))\n return s;\n }\n }\n } else {\n const f = this._internalPickForMesh(s, n, c, u, t, i, r);\n if (f && (s = f, t))\n return s;\n }\n }\n return s || new ps();\n};\nOt.prototype._internalMultiPick = function(n, e, t) {\n if (!ps)\n return null;\n const i = [], r = !!(this.activeCameras && this.activeCameras.length > 1 && this.cameraToUseForPointers !== this.activeCamera), s = this.cameraToUseForPointers || this.activeCamera;\n for (let a = 0; a < this.meshes.length; a++) {\n const o = this.meshes[a];\n if (e) {\n if (!e(o))\n continue;\n } else if (!o.isEnabled() || !o.isVisible || !o.isPickable)\n continue;\n const l = r && o.isWorldMatrixCameraDependent(), c = o.computeWorldMatrix(l, s);\n if (o.hasThinInstances && o.thinInstanceEnablePicking) {\n if (this._internalPickForMesh(null, n, o, c, !0, !0, t)) {\n const u = z.Matrix[1], f = o.thinInstanceGetWorldMatrices();\n for (let d = 0; d < f.length; d++) {\n f[d].multiplyToRef(c, u);\n const g = this._internalPickForMesh(null, n, o, u, !1, !1, t, !0);\n g && (g.thinInstanceIndex = d, i.push(g));\n }\n }\n } else {\n const h = this._internalPickForMesh(null, n, o, c, !1, !1, t);\n h && i.push(h);\n }\n }\n return i;\n};\nOt.prototype.pickWithBoundingInfo = function(n, e, t, i, r) {\n if (!ps)\n return null;\n const s = this._internalPick((a) => (this._tempPickingRay || (this._tempPickingRay = ot.Zero()), this.createPickingRayToRef(n, e, a, this._tempPickingRay, r || null), this._tempPickingRay), t, i, !0);\n return s && (s.ray = this.createPickingRay(n, e, L.Identity(), r || null)), s;\n};\nObject.defineProperty(Ot.prototype, \"_pickingAvailable\", {\n get: () => !0,\n enumerable: !1,\n configurable: !1\n});\nOt.prototype.pick = function(n, e, t, i, r, s, a = !1) {\n const o = this._internalPick((l, c) => (this._tempPickingRay || (this._tempPickingRay = ot.Zero()), this.createPickingRayToRef(n, e, l, this._tempPickingRay, r || null, !1, c), this._tempPickingRay), t, i, !1, s);\n return o && (o.ray = this.createPickingRay(n, e, L.Identity(), r || null)), o;\n};\nOt.prototype.pickWithRay = function(n, e, t, i) {\n const r = this._internalPick((s) => (this._pickWithRayInverseMatrix || (this._pickWithRayInverseMatrix = L.Identity()), s.invertToRef(this._pickWithRayInverseMatrix), this._cachedRayForTransform || (this._cachedRayForTransform = ot.Zero()), ot.TransformToRef(n, this._pickWithRayInverseMatrix, this._cachedRayForTransform), this._cachedRayForTransform), e, t, !1, i);\n return r && (r.ray = n), r;\n};\nOt.prototype.multiPick = function(n, e, t, i, r) {\n return this._internalMultiPick((s) => this.createPickingRay(n, e, s, i || null), t, r);\n};\nOt.prototype.multiPickWithRay = function(n, e, t) {\n return this._internalMultiPick((i) => (this._pickWithRayInverseMatrix || (this._pickWithRayInverseMatrix = L.Identity()), i.invertToRef(this._pickWithRayInverseMatrix), this._cachedRayForTransform || (this._cachedRayForTransform = ot.Zero()), ot.TransformToRef(n, this._pickWithRayInverseMatrix, this._cachedRayForTransform), this._cachedRayForTransform), e, t);\n};\n$e.prototype.getForwardRay = function(n = 100, e, t) {\n return this.getForwardRayToRef(new ot(_.Zero(), _.Zero(), n), n, e, t);\n};\n$e.prototype.getForwardRayToRef = function(n, e = 100, t, i) {\n t || (t = this.getWorldMatrix()), n.length = e, i ? n.origin.copyFrom(i) : n.origin.copyFrom(this.position);\n const r = z.Vector3[2];\n r.set(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\n const s = z.Vector3[3];\n return _.TransformNormalToRef(r, t, s), _.NormalizeToRef(s, n.direction), n;\n};\nclass tE extends Ve {\n /**\n * Create a new InstantiateOnVolumeBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._currentPosition = new _(), this._vertex0 = new _(), this._vertex1 = new _(), this._vertex2 = new _(), this.evaluateContext = !0, this.registerInput(\"geometry\", b.Geometry), this.registerInput(\"instance\", b.Geometry, !0), this.registerInput(\"count\", b.Int, !0, 256), this.registerInput(\"matrix\", b.Matrix, !0), this.registerInput(\"rotation\", b.Vector3, !0, _.Zero()), this.registerInput(\"scaling\", b.Vector3, !0, _.One()), this.scaling.acceptedConnectionPointTypes.push(b.Float), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current instance index in the current flow\n * @returns the current index\n */\n getInstanceIndex() {\n return this._currentLoopIndex;\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return 0;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentLoopIndex;\n }\n /**\n * Gets the value associated with a contextual positions\n * @returns the value associated with the source\n */\n getOverridePositionsContextualValue() {\n return this._currentPosition;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateOnVolumeBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the instance input component\n */\n get instance() {\n return this._inputs[1];\n }\n /**\n * Gets the count input component\n */\n get count() {\n return this._inputs[2];\n }\n /**\n * Gets the matrix input component\n */\n get matrix() {\n return this._inputs[3];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[4];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[5];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n if (i.pushExecutionContext(this), i.pushInstancingContext(this), this._vertexData = this.geometry.getConnectedValue(i), i.pushGeometryContext(this._vertexData), !this._vertexData || !this._vertexData.positions || !this._vertexData.indices || !this.instance.isConnected) {\n i.restoreExecutionContext(), i.restoreInstancingContext(), i.restoreGeometryContext(), this.output._storedValue = null;\n return;\n }\n let r = null;\n const s = this.count.getConnectedValue(i), a = [], o = _o(this._vertexData.positions, 0, this._vertexData.positions.length / 3), l = o.minimum, c = o.maximum, h = new _(1, 0, 0), u = this._vertexData.indices.length / 3;\n this._currentLoopIndex = 0;\n for (let f = 0; f < s; f++) {\n this._currentPosition.set(Math.random() * (c.x - l.x) + l.x, Math.random() * (c.y - l.y) + l.y, Math.random() * (c.z - l.z) + l.z);\n const d = new ot(this._currentPosition, h);\n let p = 0;\n for (let m = 0; m < u; m++) {\n this._vertex0.fromArray(this._vertexData.positions, this._vertexData.indices[m * 3] * 3), this._vertex1.fromArray(this._vertexData.positions, this._vertexData.indices[m * 3 + 1] * 3), this._vertex2.fromArray(this._vertexData.positions, this._vertexData.indices[m * 3 + 2] * 3);\n const v = d.intersectsTriangle(this._vertex0, this._vertex1, this._vertex2);\n v && v.distance > 0 && p++;\n }\n if (p % 2 === 0) {\n f--;\n continue;\n }\n if (r = this.instance.getConnectedValue(i), !r || !r.positions || r.positions.length === 0)\n continue;\n const g = r.clone();\n if (this.matrix.isConnected) {\n const m = this.matrix.getConnectedValue(i);\n i._instantiateWithPositionAndMatrix(g, this._currentPosition, m, a);\n } else {\n const m = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly), v = this.rotation.getConnectedValue(i) || _.ZeroReadOnly;\n i._instantiate(g, this._currentPosition, v, m, a);\n }\n this._currentLoopIndex++;\n }\n if (a.length)\n if (a.length === 1)\n this._vertexData = a[0];\n else {\n const f = a.splice(0, 1)[0];\n this._vertexData = f.merge(a, !0, !1, !0, !0);\n }\n return i.restoreGeometryContext(), i.restoreExecutionContext(), i.restoreInstancingContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], tE.prototype, \"evaluateContext\", void 0);\nRe(\"BABYLON.InstantiateOnVolumeBlock\", tE);\nclass Bc extends Ve {\n /**\n * Create a new InstantiateBaseBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !0, this.registerInput(\"instance\", b.Geometry, !0), this.registerInput(\"count\", b.Int, !0, 1), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current instance index in the current flow\n * @returns the current index\n */\n getInstanceIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateBaseBlock\";\n }\n /**\n * Gets the instance input component\n */\n get instance() {\n return this._inputs[0];\n }\n /**\n * Gets the count input component\n */\n get count() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e;\n }\n _deserialize(e) {\n super._deserialize(e), e.evaluateContext !== void 0 && (this.evaluateContext = e.evaluateContext);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], Bc.prototype, \"evaluateContext\", void 0);\nclass $P extends Bc {\n /**\n * Create a new InstantiateBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"matrix\", b.Matrix, !0), this.registerInput(\"position\", b.Vector3, !0, _.Zero()), this.registerInput(\"rotation\", b.Vector3, !0, _.Zero()), this.registerInput(\"scaling\", b.Vector3, !0, _.One()), this.scaling.acceptedConnectionPointTypes.push(b.Float);\n }\n /**\n * Gets the current instance index in the current flow\n * @returns the current index\n */\n getInstanceIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current index in the current flow\n * @returns the current index\n */\n getExecutionIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current loop index in the current flow\n * @returns the current loop index\n */\n getExecutionLoopIndex() {\n return this._currentIndex;\n }\n /**\n * Gets the current face index in the current flow\n * @returns the current face index\n */\n getExecutionFaceIndex() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateBlock\";\n }\n /**\n * Gets the matrix input component\n */\n get matrix() {\n return this._inputs[2];\n }\n /**\n * Gets the position input component\n */\n get position() {\n return this._inputs[3];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[4];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[5];\n }\n _buildBlock(e) {\n const t = (i) => {\n i.pushExecutionContext(this), i.pushInstancingContext(this);\n const r = this.count.getConnectedValue(i), s = [];\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const a = this.instance.getConnectedValue(i);\n if (!a || !a.positions || a.positions.length === 0)\n continue;\n const o = a.clone();\n if (this.matrix.isConnected) {\n const l = this.matrix.getConnectedValue(i);\n i._instantiateWithMatrix(o, l, s);\n } else {\n const l = this.position.getConnectedValue(i) || _.ZeroReadOnly, c = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly), h = this.rotation.getConnectedValue(i) || _.ZeroReadOnly;\n i._instantiate(o, l, h, c, s);\n }\n }\n if (s.length)\n if (s.length === 1)\n this._vertexData = s[0];\n else {\n const a = s.splice(0, 1)[0];\n this._vertexData = a.merge(s, !0, !1, !0, !0);\n }\n return i.restoreExecutionContext(), i.restoreInstancingContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n}\nRe(\"BABYLON.InstantiateBlock\", $P);\nclass eO extends Bc {\n /**\n * Create a new Instantiate Linear Block\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"direction\", b.Vector3, !0, new _(1, 0, 0)), this.registerInput(\"rotation\", b.Vector3, !0, new _(0, 0, 0)), this.registerInput(\"scaling\", b.Vector3, !0, new _(0, 0, 0)), this.scaling.acceptedConnectionPointTypes.push(b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateLinearBlock\";\n }\n /**\n * Gets the direction input component\n */\n get direction() {\n return this._inputs[2];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[3];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[4];\n }\n _buildBlock(e) {\n const t = (i) => {\n i.pushExecutionContext(this), i.pushInstancingContext(this);\n const r = this.count.getConnectedValue(i), s = [], a = L.Identity(), o = _.Zero(), l = _.Zero(), c = _.Zero();\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const h = this.instance.getConnectedValue(i);\n if (!h || !h.positions || h.positions.length === 0)\n continue;\n const u = h.clone(), f = this.direction.getConnectedValue(i), d = this.rotation.getConnectedValue(i), p = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly);\n o.copyFrom(f.clone().scale(this._currentIndex)), l.copyFrom(d.clone().scale(this._currentIndex)), c.copyFrom(p.clone().scale(this._currentIndex)), c.addInPlaceFromFloats(1, 1, 1), L.ComposeToRef(c, Ce.FromEulerAngles(l.x, l.y, l.z), o, a), i._instantiateWithMatrix(u, a, s);\n }\n if (s.length)\n if (s.length === 1)\n this._vertexData = s[0];\n else {\n const h = s.splice(0, 1)[0];\n this._vertexData = h.merge(s, !0, !1, !0, !0);\n }\n return i.restoreExecutionContext(), i.restoreInstancingContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n}\nRe(\"BABYLON.InstantiateLinearBlock\", eO);\nclass tO extends Bc {\n /**\n * Create a new InstantiateRadialBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"radius\", b.Int, !0, 0, 0), this.registerInput(\"angleStart\", b.Float, !0, 0), this.registerInput(\"angleEnd\", b.Float, !0, Math.PI * 2), this.registerInput(\"transform\", b.Vector3, !0, new _(0, 0, 0)), this.registerInput(\"rotation\", b.Vector3, !0, new _(0, 0, 0)), this.registerInput(\"scaling\", b.Vector3, !0, new _(0, 0, 0)), this.scaling.acceptedConnectionPointTypes.push(b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"InstantiateRadialBlock\";\n }\n /**\n * Gets the direction input component\n */\n get radius() {\n return this._inputs[2];\n }\n /**\n * Gets the direction input component\n */\n get angleStart() {\n return this._inputs[3];\n }\n /**\n * Gets the direction input component\n */\n get angleEnd() {\n return this._inputs[4];\n }\n /**\n * Gets the transform input component\n */\n get transform() {\n return this._inputs[5];\n }\n /**\n * Gets the rotation input component\n */\n get rotation() {\n return this._inputs[6];\n }\n /**\n * Gets the scaling input component\n */\n get scaling() {\n return this._inputs[7];\n }\n _buildBlock(e) {\n const t = (i) => {\n i.pushExecutionContext(this), i.pushInstancingContext(this);\n const r = this.count.getConnectedValue(i), s = [], a = L.Identity(), o = L.Identity(), l = L.Identity(), c = _.Zero(), h = _.Zero(), u = _.Zero();\n for (this._currentIndex = 0; this._currentIndex < r; this._currentIndex++) {\n const f = this.instance.getConnectedValue(i);\n if (!f || !f.positions || f.positions.length === 0)\n continue;\n const d = f.clone(), p = this.radius.getConnectedValue(i), g = this.angleStart.getConnectedValue(i), m = this.angleEnd.getConnectedValue(i), v = this.transform.getConnectedValue(i), E = this.rotation.getConnectedValue(i), C = i.adaptInput(this.scaling, b.Vector3, _.OneReadOnly), R = (m - g) / r, x = g + R * this._currentIndex, S = Ce.FromEulerAngles(0, x, 0);\n c.copyFrom(v.clone().scale(this._currentIndex)), h.copyFrom(E.clone().scale(this._currentIndex)), u.copyFrom(C.clone().scale(this._currentIndex)), u.addInPlaceFromFloats(1, 1, 1), L.RotationYawPitchRollToRef(h.y, h.x, h.z, a), o.setTranslationFromFloats(0, 0, p), L.ComposeToRef(u, S, c, l), a.multiplyToRef(o, o), o.multiplyToRef(l, l), i._instantiateWithMatrix(d, l, s);\n }\n if (s.length)\n if (s.length === 1)\n this._vertexData = s[0];\n else {\n const f = s.splice(0, 1)[0];\n this._vertexData = f.merge(s, !0, !1, !0, !0);\n }\n return i.restoreExecutionContext(), i.restoreInstancingContext(), this._vertexData;\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n}\nRe(\"BABYLON.InstantiateRadialBlock\", tO);\nclass iO extends Ve {\n /**\n * Create a new IntFloatConverterBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"float \", b.Float, !0), this.registerInput(\"int \", b.Int, !0), this.registerOutput(\"float\", b.Float), this.registerOutput(\"int\", b.Int);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"IntFloatConverterBlock\";\n }\n /**\n * Gets the float input component\n */\n get floatIn() {\n return this._inputs[0];\n }\n /**\n * Gets the int input component\n */\n get intIn() {\n return this._inputs[1];\n }\n /**\n * Gets the float output component\n */\n get floatOut() {\n return this._outputs[0];\n }\n /**\n * Gets the int output component\n */\n get intOut() {\n return this._outputs[1];\n }\n _inputRename(e) {\n return e === \"float \" ? \"floatIn\" : e === \"int \" ? \"intIn\" : e;\n }\n _buildBlock() {\n this.floatOut._storedFunction = (e) => this.floatIn.isConnected ? this.floatIn.getConnectedValue(e) : this.intIn.isConnected ? this.intIn.getConnectedValue(e) : 0, this.intOut._storedFunction = (e) => this.floatIn.isConnected ? Math.floor(this.floatIn.getConnectedValue(e)) : this.intIn.isConnected ? Math.floor(this.intIn.getConnectedValue(e)) : 0;\n }\n}\nRe(\"BABYLON.IntFloatConverterBlock\", iO);\nfunction rO(n, e) {\n return `{X: ${n.x.toFixed(e)} Y: ${n.y.toFixed(e)}}`;\n}\nfunction sO(n, e) {\n return `{X: ${n._x.toFixed(e)} Y: ${n._y.toFixed(e)} Z: ${n._z.toFixed(e)}}`;\n}\nfunction nO(n, e) {\n return `{X: ${n.x.toFixed(e)} Y: ${n.y.toFixed(e)} Z: ${n.z.toFixed(e)} W: ${n.w.toFixed(e)}}`;\n}\nclass aO extends Ve {\n /**\n * Create a new DebugBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.log = [], this._isDebug = !0, this.registerInput(\"input\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the time spent to build this block (in ms)\n */\n get buildExecutionTime() {\n return 0;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"DebugBlock\";\n }\n /**\n * Gets the input component\n */\n get input() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n if (!this.input.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n this.log = [];\n const t = (i) => {\n const r = this.input.getConnectedValue(i);\n if (r == null)\n return this.log.push([\"null\", \"\"]), r;\n switch (this.input.type) {\n case b.Vector2:\n this.log.push([rO(r, 4), r.toString()]);\n break;\n case b.Vector3:\n this.log.push([sO(r, 4), r.toString()]);\n break;\n case b.Vector4:\n this.log.push([nO(r, 4), r.toString()]);\n break;\n default:\n this.log.push([r.toString(), r.toString()]);\n break;\n }\n return r;\n };\n this.output.isConnected ? this.output._storedFunction = t : this.output._storedValue = t(e);\n }\n}\nRe(\"BABYLON.DebugBlock\", aO);\nclass oO extends Ve {\n /**\n * Create a new GeometryInfoBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"geometry\", b.Geometry), this.registerOutput(\"output\", b.Geometry), this.registerOutput(\"id\", b.Int), this.registerOutput(\"collectionId\", b.Int), this.registerOutput(\"verticesCount\", b.Int), this.registerOutput(\"facesCount\", b.Int);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryInfoBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n /**\n * Gets the id output component\n */\n get id() {\n return this._outputs[1];\n }\n /**\n * Gets the collectionId output component\n */\n get collectionId() {\n return this._outputs[2];\n }\n /**\n * Gets the verticesCount output component\n */\n get verticesCount() {\n return this._outputs[3];\n }\n /**\n * Gets the facesCount output component\n */\n get facesCount() {\n return this._outputs[4];\n }\n _buildBlock() {\n if (!this.geometry.isConnected) {\n this.id._storedValue = 0, this.collectionId._storedValue = 0, this.verticesCount._storedValue = 0, this.facesCount._storedValue = 0, this.output._storedValue = 0, this.id._storedFunction = null, this.collectionId._storedFunction = null, this.verticesCount._storedFunction = null, this.facesCount._storedFunction = null, this.output._storedFunction = null;\n return;\n }\n this.output._storedFunction = (e) => (this._currentVertexData = this.geometry.getConnectedValue(e), this._currentVertexData), this.id._storedFunction = (e) => (this._currentVertexData = this._currentVertexData || this.geometry.getConnectedValue(e), this._currentVertexData.uniqueId), this.collectionId._storedFunction = (e) => (this._currentVertexData = this._currentVertexData || this.geometry.getConnectedValue(e), this._currentVertexData.metadata ? this._currentVertexData.metadata.collectionId : 0), this.verticesCount._storedFunction = (e) => (this._currentVertexData = this._currentVertexData || this.geometry.getConnectedValue(e), this._currentVertexData.positions ? this._currentVertexData.positions.length / 3 : 0), this.facesCount._storedFunction = (e) => (this._currentVertexData = this._currentVertexData || this.geometry.getConnectedValue(e), this._currentVertexData.indices ? this._currentVertexData.indices.length / 3 : 0);\n }\n}\nRe(\"BABYLON.GeometryInfoBlock\", oO);\nvar ls;\n(function(n) {\n n[n.Spherical = 0] = \"Spherical\", n[n.Cylindrical = 1] = \"Cylindrical\", n[n.Cubic = 2] = \"Cubic\";\n})(ls || (ls = {}));\nclass iE extends Ve {\n /**\n * Create a new MappingBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.mapping = ls.Spherical, this.registerInput(\"position\", b.Vector3), this.registerInput(\"normal\", b.Vector3), this.registerInput(\"center\", b.Vector3, !0, _.Zero()), this.registerOutput(\"uv\", b.Vector2);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"MappingBlock\";\n }\n /**\n * Gets the position input component\n */\n get position() {\n return this._inputs[0];\n }\n /**\n * Gets the normal input component\n */\n get normal() {\n return this._inputs[1];\n }\n /**\n * Gets the center input component\n */\n get center() {\n return this._inputs[2];\n }\n /**\n * Gets the output component\n */\n get uv() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.position.isConnected) {\n this.uv._storedFunction = null, this.uv._storedValue = null;\n return;\n }\n const e = _.Zero(), t = (i) => {\n const r = this.position.getConnectedValue(i) || _.Zero(), s = this.normal.getConnectedValue(i) || _.Zero(), a = this.center.getConnectedValue(i), o = me.Zero();\n switch (this.mapping) {\n case ls.Spherical: {\n r.subtractToRef(a, e);\n const l = e.length();\n l > 0 && (o.x = Math.acos(e.y / l) / Math.PI, (e.x !== 0 || e.z !== 0) && (o.y = Math.atan2(e.x, e.z) / (Math.PI * 2)));\n break;\n }\n case ls.Cylindrical: {\n r.subtractToRef(a, e);\n const l = e.length();\n l > 0 && (o.x = Math.atan2(e.x / l, e.z / l) / (Math.PI * 2), o.y = (e.y + 1) / 2);\n break;\n }\n case ls.Cubic: {\n const l = Math.abs(s.x), c = Math.abs(s.y), h = Math.abs(s.z), u = Math.max(Math.abs(r.x), Math.abs(r.y), Math.abs(r.z));\n let f = 0, d = 0;\n l >= c && l >= h ? (f = r.y / u - a.y, d = r.z / u - a.z) : c >= l && c >= h ? (f = r.x / u - a.x, d = r.z / u - a.z) : (f = r.x / u - a.x, d = r.y / u - a.y), o.x = (f + 1) / 2, o.y = (d + 1) / 2;\n }\n }\n return o;\n };\n this.uv._storedFunction = (i) => t(i);\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.mapping = BABYLON.MappingTypes.${ls[this.mapping]};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.mapping = this.mapping, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.mapping = e.mapping;\n }\n}\nP([\n gt(\"Mapping\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"Spherical\", value: ls.Spherical },\n { label: \"Cylindrical\", value: ls.Cylindrical },\n { label: \"Cubic\", value: ls.Cubic }\n ]\n })\n], iE.prototype, \"mapping\", void 0);\nRe(\"BABYLON.MappingBlock\", iE);\nclass lO extends Ve {\n /**\n * Create a new MatrixComposeBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"matrix0\", b.Matrix), this.registerInput(\"matrix1\", b.Matrix), this.registerOutput(\"output\", b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"MatrixComposeBlock\";\n }\n /**\n * Gets the matrix0 input component\n */\n get matrix0() {\n return this._inputs[0];\n }\n /**\n * Gets the matrix1 input component\n */\n get matrix1() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n this.output._storedFunction = (e) => {\n if (!this.matrix0.isConnected || !this.matrix1.isConnected)\n return null;\n const t = this.matrix0.getConnectedValue(e), i = this.matrix1.getConnectedValue(e);\n return !t || !i ? null : t.multiply(i);\n };\n }\n}\nRe(\"BABYLON.MatrixComposeBlock\", lO);\nclass cO extends Ve {\n /** Gets the list of attached endpoints */\n get endpoints() {\n return this._endpoints;\n }\n /**\n * Create a new TeleportInBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._endpoints = [], this._isTeleportIn = !0, this.registerInput(\"input\", b.AutoDetect);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"TeleportInBlock\";\n }\n /**\n * Gets the input component\n */\n get input() {\n return this._inputs[0];\n }\n _dumpCode(e, t) {\n let i = super._dumpCode(e, t);\n for (const r of this.endpoints)\n t.indexOf(r) === -1 && (i += r._dumpCode(e, t));\n return i;\n }\n /**\n * Checks if the current block is an ancestor of a given type\n * @param type defines the potential type to check\n * @returns true if block is a descendant\n */\n isAnAncestorOfType(e) {\n if (this.getClassName() === e)\n return !0;\n for (const t of this.endpoints)\n if (t.isAnAncestorOfType(e))\n return !0;\n return !1;\n }\n /**\n * Checks if the current block is an ancestor of a given block\n * @param block defines the potential descendant block to check\n * @returns true if block is a descendant\n */\n isAnAncestorOf(e) {\n for (const t of this.endpoints)\n if (t === e || t.isAnAncestorOf(e))\n return !0;\n return !1;\n }\n /**\n * Get the first descendant using a predicate\n * @param predicate defines the predicate to check\n * @returns descendant or null if none found\n */\n getDescendantOfPredicate(e) {\n if (e(this))\n return this;\n for (const t of this.endpoints) {\n const i = t.getDescendantOfPredicate(e);\n if (i)\n return i;\n }\n return null;\n }\n /**\n * Add an enpoint to this block\n * @param endpoint define the endpoint to attach to\n */\n attachToEndpoint(e) {\n e.detach(), this._endpoints.push(e), e._entryPoint = this, e._outputs[0]._typeConnectionSource = this._inputs[0], e._tempEntryPointUniqueId = null, e.name = \"> \" + this.name;\n }\n /**\n * Remove enpoint from this block\n * @param endpoint define the endpoint to remove\n */\n detachFromEndpoint(e) {\n const t = this._endpoints.indexOf(e);\n t !== -1 && (this._endpoints.splice(t, 1), e._outputs[0]._typeConnectionSource = null, e._entryPoint = null);\n }\n _buildBlock() {\n for (const e of this._endpoints)\n e.output._storedFunction = (t) => this.input.getConnectedValue(t);\n }\n}\nRe(\"BABYLON.TeleportInBlock\", cO);\nclass hO extends Ve {\n /**\n * Create a new TeleportOutBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._entryPoint = null, this._tempEntryPointUniqueId = null, this._isTeleportOut = !0, this.registerOutput(\"output\", b.BasedOnInput);\n }\n /**\n * Gets the entry point\n */\n get entryPoint() {\n return this._entryPoint;\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"TeleportOutBlock\";\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n /** Detach from entry point */\n detach() {\n this._entryPoint && this._entryPoint.detachFromEndpoint(this);\n }\n _buildBlock() {\n }\n _customBuildStep(e) {\n this.entryPoint && this.entryPoint.build(e);\n }\n _dumpCode(e, t) {\n let i = \"\";\n return this.entryPoint && t.indexOf(this.entryPoint) === -1 && (i += this.entryPoint._dumpCode(e, t)), i + super._dumpCode(e, t);\n }\n _dumpCodeForOutputConnections(e) {\n let t = super._dumpCodeForOutputConnections(e);\n return this.entryPoint && (t += this.entryPoint._dumpCodeForOutputConnections(e)), t;\n }\n /**\n * Clone the current block to a new identical block\n * @returns a copy of the current block\n */\n clone() {\n const e = super.clone();\n return this.entryPoint && this.entryPoint.attachToEndpoint(e), e;\n }\n _dumpPropertiesCode() {\n let e = super._dumpPropertiesCode();\n return this.entryPoint && (e += `${this.entryPoint._codeVariableName}.attachToEndpoint(${this._codeVariableName});\n`), e;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n var t;\n const e = super.serialize();\n return e.entryPoint = ((t = this.entryPoint) == null ? void 0 : t.uniqueId) ?? \"\", e;\n }\n _deserialize(e) {\n super._deserialize(e), this._tempEntryPointUniqueId = e.entryPoint;\n }\n}\nRe(\"BABYLON.TeleportOutBlock\", hO);\nclass rE extends Ve {\n /**\n * Gets the texture data\n */\n get textureData() {\n return this._data;\n }\n /**\n * Gets the texture width\n */\n get textureWidth() {\n return this._width;\n }\n /**\n * Gets the texture height\n */\n get textureHeight() {\n return this._height;\n }\n /**\n * Creates a new GeometryTextureBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this._data = null, this.serializedCachedData = !1, this.registerOutput(\"texture\", b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryTextureBlock\";\n }\n /**\n * Gets the texture component\n */\n get texture() {\n return this._outputs[0];\n }\n _prepareImgToLoadAsync(e) {\n return new Promise((t, i) => {\n const r = new Image(), s = document.createElement(\"canvas\"), a = s.getContext(\"2d\");\n r.onload = () => {\n s.width = r.width, s.height = r.height, a.drawImage(r, 0, 0);\n const l = a.getImageData(0, 0, r.width, r.height).data, c = new Float32Array(l.length);\n for (let h = 0; h < l.length; h++)\n c[h] = l[h] / 255;\n this._data = c, this._width = r.width, this._height = r.height, t();\n }, r.onerror = () => {\n this._data = null, i();\n }, r.src = e;\n });\n }\n /**\n * Remove stored data\n */\n cleanData() {\n this._data = null;\n }\n /**\n * Load the texture data\n * @param imageFile defines the file to load data from\n * @returns a promise fulfilled when image data is loaded\n */\n loadTextureFromFileAsync(e) {\n return this._prepareImgToLoadAsync(URL.createObjectURL(e));\n }\n /**\n * Load the texture data\n * @param url defines the url to load data from\n * @returns a promise fulfilled when image data is loaded\n */\n loadTextureFromUrlAsync(e) {\n return this._prepareImgToLoadAsync(e);\n }\n /**\n * Load the texture data\n * @param texture defines the source texture\n * @returns a promise fulfilled when image data is loaded\n */\n extractFromTextureAsync(e) {\n return new Promise((t, i) => {\n if (!e.isReady()) {\n e.onLoadObservable.addOnce(() => this.extractFromTextureAsync(e).then(t).catch(i));\n return;\n }\n const r = e.getSize();\n Q1.GetTextureDataAsync(e, r.width, r.height).then(async (s) => {\n const a = new Float32Array(s.length);\n for (let o = 0; o < s.length; o++)\n a[o] = s[o] / 255;\n this._data = a, this._width = r.width, this._height = r.height, t();\n }).catch(i);\n });\n }\n _buildBlock() {\n if (!this._data) {\n this.texture._storedValue = null;\n return;\n }\n const e = {\n data: this._data,\n width: this._width,\n height: this._height\n };\n this.texture._storedValue = e;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.width = this._width, e.height = this._height, e.serializedCachedData = this.serializedCachedData, this._data && this.serializedCachedData && (e.data = Array.from(this._data)), e;\n }\n _deserialize(e) {\n super._deserialize(e), this._width = e.width, this._height = e.height, e.data ? (this._data = new Float32Array(e.data), this.serializedCachedData = !0) : this.serializedCachedData = !!e.serializedCachedData;\n }\n}\nP([\n gt(\"Serialize cached data\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], rE.prototype, \"serializedCachedData\", void 0);\nRe(\"BABYLON.GeometryTextureBlock\", rE);\nclass sE extends Ve {\n /**\n * Creates a new GeometryTextureFetchBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.clampCoordinates = !0, this.registerInput(\"texture\", b.Texture), this.registerInput(\"coordinates\", b.Vector2), this.registerOutput(\"rgba\", b.Vector4), this.registerOutput(\"rgb\", b.Vector3), this.registerOutput(\"r\", b.Float), this.registerOutput(\"g\", b.Float), this.registerOutput(\"b\", b.Float), this.registerOutput(\"a\", b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryTextureFetchBlock\";\n }\n /**\n * Gets the texture component\n */\n get texture() {\n return this.inputs[0];\n }\n /**\n * Gets the coordinates component\n */\n get coordinates() {\n return this.inputs[1];\n }\n /**\n * Gets the rgba component\n */\n get rgba() {\n return this._outputs[0];\n }\n /**\n * Gets the rgb component\n */\n get rgb() {\n return this._outputs[1];\n }\n /**\n * Gets the r component\n */\n get r() {\n return this._outputs[2];\n }\n /**\n * Gets the g component\n */\n get g() {\n return this._outputs[3];\n }\n /**\n * Gets the b component\n */\n get b() {\n return this._outputs[4];\n }\n /**\n * Gets the a component\n */\n get a() {\n return this._outputs[5];\n }\n _repeatClamp(e) {\n return e >= 0 ? e % 1 : 1 - Math.abs(e) % 1;\n }\n _buildBlock() {\n const e = (t) => {\n const i = this.texture.getConnectedValue(t);\n if (!i || !i.data)\n return null;\n const r = this.coordinates.getConnectedValue(t);\n if (!r)\n return null;\n const s = this.clampCoordinates ? Math.max(0, Math.min(r.x, 1)) : this._repeatClamp(r.x), a = this.clampCoordinates ? Math.max(0, Math.min(r.y, 1)) : this._repeatClamp(r.y), o = Math.floor(s * (i.width - 1)), l = Math.floor(a * (i.height - 1)), c = o + i.width * l;\n return Ke.FromArray(i.data, c * 4);\n };\n this.rgba._storedFunction = (t) => e(t), this.rgb._storedFunction = (t) => {\n const i = e(t);\n return i ? i.toVector3() : null;\n }, this.r._storedFunction = (t) => {\n const i = e(t);\n return i ? i.x : null;\n }, this.g._storedFunction = (t) => {\n const i = e(t);\n return i ? i.y : null;\n }, this.b._storedFunction = (t) => {\n const i = e(t);\n return i ? i.z : null;\n }, this.a._storedFunction = (t) => {\n const i = e(t);\n return i ? i.w : null;\n };\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.clampCoordinates = ${this.clampCoordinates};\n`;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.clampCoordinates = this.clampCoordinates, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.clampCoordinates = e.clampCoordinates;\n }\n}\nP([\n gt(\"Clamp Coordinates\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], sE.prototype, \"clampCoordinates\", void 0);\nRe(\"BABYLON.GeometryTextureFetchBlock\", sE);\nclass uO extends Ve {\n /**\n * Create a new BoundingBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"geometry\", b.Geometry), this.registerOutput(\"min\", b.Vector3), this.registerOutput(\"max\", b.Vector3);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"BoundingBlock\";\n }\n /**\n * Gets the geometry input component\n */\n get geometry() {\n return this._inputs[0];\n }\n /**\n * Gets the min output component\n */\n get min() {\n return this._outputs[0];\n }\n /**\n * Gets the max output component\n */\n get max() {\n return this._outputs[1];\n }\n _buildBlock() {\n this.min._storedFunction = (e) => {\n const t = this.geometry.getConnectedValue(e);\n return t ? _o(t.positions, 0, t.positions.length / 3).minimum : null;\n }, this.max._storedFunction = (e) => {\n const t = this.geometry.getConnectedValue(e);\n return t ? _o(t.positions, 0, t.positions.length / 3).maximum : null;\n };\n }\n}\nRe(\"BABYLON.BoundingBlock\", uO);\nvar cs;\n(function(n) {\n n[n.Intersect = 0] = \"Intersect\", n[n.Subtract = 1] = \"Subtract\", n[n.Union = 2] = \"Union\";\n})(cs || (cs = {}));\nclass Mf extends Ve {\n /**\n * Create a new BooleanGeometryBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.evaluateContext = !1, this.operation = cs.Intersect, this.registerInput(\"geometry0\", b.Geometry), this.registerInput(\"geometry1\", b.Geometry), this.registerOutput(\"output\", b.Geometry);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"BooleanGeometryBlock\";\n }\n /**\n * Gets the geometry0 input component\n */\n get geometry0() {\n return this._inputs[0];\n }\n /**\n * Gets the geometry1 input component\n */\n get geometry1() {\n return this._inputs[1];\n }\n /**\n * Gets the geometry output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock(e) {\n const t = (i) => {\n const r = this.geometry0.getConnectedValue(i), s = this.geometry1.getConnectedValue(i);\n if (!r || !s)\n return null;\n const a = r.positions.length / 3;\n !r.normals && s.normals && (r.normals = new Array(r.positions.length)), !s.normals && r.normals && (s.normals = new Array(s.positions.length)), !r.uvs && s.uvs && (r.uvs = new Array(a * 2)), !s.uvs && r.uvs && (s.uvs = new Array(a * 2)), !r.colors && s.colors && (r.colors = new Array(a * 4)), !s.colors && r.colors && (s.colors = new Array(a * 4));\n const o = ss.FromVertexData(r), l = ss.FromVertexData(s);\n let c;\n switch (this.operation) {\n case cs.Intersect:\n c = o.intersect(l);\n break;\n case cs.Subtract:\n c = o.subtract(l);\n break;\n case cs.Union:\n c = o.union(l);\n break;\n }\n return c.toVertexData();\n };\n this.evaluateContext ? this.output._storedFunction = t : (this.output._storedFunction = null, this.output._storedValue = t(e));\n }\n _dumpPropertiesCode() {\n let e = super._dumpPropertiesCode() + `${this._codeVariableName}.evaluateContext = ${this.evaluateContext ? \"true\" : \"false\"};\n`;\n return e += `${this._codeVariableName}.operation = BABYLON.BooleanGeometryOperations.${cs[this.operation]};\n`, e;\n }\n /**\n * Serializes this block in a JSON representation\n * @returns the serialized block object\n */\n serialize() {\n const e = super.serialize();\n return e.evaluateContext = this.evaluateContext, e.operation = this.operation, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.evaluateContext = e.evaluateContext, e.operation && (this.operation = e.operation);\n }\n}\nP([\n gt(\"Evaluate context\", ht.Boolean, \"ADVANCED\", { notifiers: { rebuild: !0 } })\n], Mf.prototype, \"evaluateContext\", void 0);\nP([\n gt(\"Operation\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"Intersect\", value: cs.Intersect },\n { label: \"Subtract\", value: cs.Subtract },\n { label: \"Union\", value: cs.Union }\n ]\n })\n], Mf.prototype, \"operation\", void 0);\nRe(\"BABYLON.BooleanGeometryBlock\", Mf);\nclass fO extends Ve {\n /**\n * Creates a new GeometryArcTan2Block\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"x\", b.AutoDetect), this.registerInput(\"y\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryArcTan2Block\";\n }\n /**\n * Gets the x operand input component\n */\n get x() {\n return this._inputs[0];\n }\n /**\n * Gets the y operand input component\n */\n get y() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.x.isConnected || !this.y.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i) => Math.atan2(t, i);\n this.output._storedFunction = (t) => {\n const i = this.x.getConnectedValue(t), r = this.y.getConnectedValue(t);\n switch (this.x.type) {\n case b.Int:\n case b.Float:\n return e(i, r);\n case b.Vector2:\n return new me(e(i.x, r.x), e(i.y, r.y));\n case b.Vector3:\n return new _(e(i.x, r.x), e(i.y, r.y), e(i.z, r.z));\n case b.Vector4:\n return new Ke(e(i.x, r.x), e(i.y, r.y), e(i.z, r.z), e(i.w, r.w));\n }\n return 0;\n };\n }\n}\nRe(\"BABYLON.GeometryArcTan2Block\", fO);\nclass dO extends Ve {\n /**\n * Creates a new GeometryLerpBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerInput(\"gradient\", b.Float), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryLerpBlock\";\n }\n /**\n * Gets the left operand input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right operand input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the gradient operand input component\n */\n get gradient() {\n return this._inputs[2];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected || !this.right.isConnected || !this.gradient.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i, r) => (1 - t) * i + t * r;\n return this.output._storedFunction = (t) => {\n const i = this.left.getConnectedValue(t), r = this.right.getConnectedValue(t), s = this.gradient.getConnectedValue(t);\n switch (this.left.type) {\n case b.Int:\n case b.Float:\n return e(s, i, r);\n case b.Vector2:\n return new me(e(s, i.x, r.x), e(s, i.y, r.y));\n case b.Vector3:\n return new _(e(s, i.x, r.x), e(s, i.y, r.y), e(s, i.z, r.z));\n case b.Vector4:\n return new Ke(e(s, i.x, r.x), e(s, i.y, r.y), e(s, i.z, r.z), e(s, i.w, r.w));\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryLerpBlock\", dO);\nclass pO extends Ve {\n /**\n * Creates a new GeometryNLerpBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerInput(\"gradient\", b.Float), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryNLerpBlock\";\n }\n /**\n * Gets the left operand input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right operand input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the gradient operand input component\n */\n get gradient() {\n return this._inputs[2];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected || !this.right.isConnected || !this.gradient.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i, r) => (1 - t) * i + t * r;\n return this.output._storedFunction = (t) => {\n const i = this.left.getConnectedValue(t), r = this.right.getConnectedValue(t), s = this.gradient.getConnectedValue(t);\n switch (this.left.type) {\n case b.Int:\n case b.Float:\n return e(s, i, r);\n case b.Vector2: {\n const a = new me(e(s, i.x, r.x), e(s, i.y, r.y));\n return a.normalize(), a;\n }\n case b.Vector3: {\n const a = new _(e(s, i.x, r.x), e(s, i.y, r.y), e(s, i.z, r.z));\n return a.normalize(), a;\n }\n case b.Vector4: {\n const a = new Ke(e(s, i.x, r.x), e(s, i.y, r.y), e(s, i.z, r.z), e(s, i.w, r.w));\n return a.normalize(), a;\n }\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryNLerpBlock\", pO);\nclass gO extends Ve {\n /**\n * Creates a new GeometryStepBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"edge\", b.Float), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryStepBlock\";\n }\n /**\n * Gets the value operand input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the edge operand input component\n */\n get edge() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected || !this.edge.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i) => t < i ? 0 : 1;\n return this.output._storedFunction = (t) => {\n const i = this.value.getConnectedValue(t), r = this.edge.getConnectedValue(t);\n switch (this.value.type) {\n case b.Int:\n case b.Float:\n return e(i, r);\n case b.Vector2:\n return new me(e(i.x, r), e(i.y, r));\n case b.Vector3:\n return new _(e(i.x, r), e(i.y, r), e(i.z, r));\n case b.Vector4:\n return new Ke(e(i.x, r), e(i.y, r), e(i.z, r), e(i.w, r));\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryStepBlock\", gO);\nclass mO extends Ve {\n /**\n * Creates a new GeometrySmoothStepBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"edge0\", b.Float), this.registerInput(\"edge1\", b.Float), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometrySmoothStepBlock\";\n }\n /**\n * Gets the value operand input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the first edge operand input component\n */\n get edge0() {\n return this._inputs[1];\n }\n /**\n * Gets the second edge operand input component\n */\n get edge1() {\n return this._inputs[2];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected || !this.edge0.isConnected || !this.edge1.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i, r) => {\n const s = Math.max(0, Math.min((t - i) / (r - i), 1));\n return s * s * (3 - 2 * s);\n };\n return this.output._storedFunction = (t) => {\n const i = this.value.getConnectedValue(t), r = this.edge0.getConnectedValue(t), s = this.edge1.getConnectedValue(t);\n switch (this.value.type) {\n case b.Int:\n case b.Float:\n return e(i, r, s);\n case b.Vector2:\n return new me(e(i.x, r, s), e(i.y, r, s));\n case b.Vector3:\n return new _(e(i.x, r, s), e(i.y, r, s), e(i.z, r, s));\n case b.Vector4:\n return new Ke(e(i.x, r, s), e(i.y, r, s), e(i.z, r, s), e(i.w, r, s));\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometrySmoothStepBlock\", mO);\nclass _O extends Ve {\n /**\n * Creates a new GeometryModBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryModBlock\";\n }\n /**\n * Gets the left operand input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right operand input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected || !this.right.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i) => t - Math.floor(t / i) * i;\n return this.output._storedFunction = (t) => {\n const i = this.left.getConnectedValue(t), r = this.right.getConnectedValue(t);\n switch (this.left.type) {\n case b.Int:\n case b.Float:\n return e(i, r);\n case b.Vector2:\n return new me(e(i.x, r.x), e(i.y, r.y));\n case b.Vector3:\n return new _(e(i.x, r.x), e(i.y, r.y), e(i.z, r.z));\n case b.Vector4:\n return new Ke(e(i.x, r.x), e(i.y, r.y), e(i.z, r.z), e(i.w, r.w));\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryModBlock\", _O);\nclass EO extends Ve {\n /**\n * Creates a new GeometryPowBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"power\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryPowBlock\";\n }\n /**\n * Gets the value operand input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the power operand input component\n */\n get power() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected || !this.power.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t, i) => Math.pow(t, i);\n return this.output._storedFunction = (t) => {\n const i = this.value.getConnectedValue(t), r = this.power.getConnectedValue(t);\n switch (this.value.type) {\n case b.Int:\n case b.Float:\n return e(i, r);\n case b.Vector2:\n return new me(e(i.x, r), e(i.y, r));\n case b.Vector3:\n return new _(e(i.x, r), e(i.y, r), e(i.z, r));\n case b.Vector4:\n return new Ke(e(i.x, r), e(i.y, r), e(i.z, r), e(i.w, r));\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryPowBlock\", EO);\nclass Pf extends Ve {\n /**\n * Creates a new GeometryClampBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.minimum = 0, this.maximum = 1, this.registerInput(\"value\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Geometry), this._inputs[0].excludedConnectionPointTypes.push(b.Texture);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryClampBlock\";\n }\n /**\n * Gets the value input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n const e = (t) => Math.max(this.minimum, Math.min(t, this.maximum));\n return this.output._storedFunction = (t) => {\n const i = this.value.getConnectedValue(t);\n switch (this.value.type) {\n case b.Int:\n case b.Float:\n return e(i);\n case b.Vector2:\n return new me(e(i.x), e(i.y));\n case b.Vector3:\n return new _(e(i.x), e(i.y), e(i.z));\n case b.Vector4:\n return new Ke(e(i.x), e(i.y), e(i.z), e(i.w));\n }\n return 0;\n }, this;\n }\n _dumpPropertiesCode() {\n let e = super._dumpPropertiesCode() + `${this._codeVariableName}.minimum = ${this.minimum};\n`;\n return e += `${this._codeVariableName}.maximum = ${this.maximum};\n`, e;\n }\n serialize() {\n const e = super.serialize();\n return e.minimum = this.minimum, e.maximum = this.maximum, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.minimum = e.minimum, this.maximum = e.maximum;\n }\n}\nP([\n gt(\"Minimum\", ht.Float)\n], Pf.prototype, \"minimum\", void 0);\nP([\n gt(\"Maximum\", ht.Float)\n], Pf.prototype, \"maximum\", void 0);\nRe(\"BABYLON.GeometryClampBlock\", Pf);\nclass vO extends Ve {\n /**\n * Creates a new GeometryCrossBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerOutput(\"output\", b.Vector3), this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Int), this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Vector2), this._inputs[1].excludedConnectionPointTypes.push(b.Int), this._inputs[1].excludedConnectionPointTypes.push(b.Float), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Vector2);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryCrossBlock\";\n }\n /**\n * Gets the left operand input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right operand input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected || !this.right.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.left.getConnectedValue(e), i = this.right.getConnectedValue(e);\n switch (this.left.type) {\n case b.Vector3:\n return _.Cross(t, i);\n case b.Vector4:\n return _.Cross(t.toVector3(), i.toVector3());\n }\n return 0;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryCrossBlock\", vO);\nvar Ze;\n(function(n) {\n n[n.EaseInSine = 0] = \"EaseInSine\", n[n.EaseOutSine = 1] = \"EaseOutSine\", n[n.EaseInOutSine = 2] = \"EaseInOutSine\", n[n.EaseInQuad = 3] = \"EaseInQuad\", n[n.EaseOutQuad = 4] = \"EaseOutQuad\", n[n.EaseInOutQuad = 5] = \"EaseInOutQuad\", n[n.EaseInCubic = 6] = \"EaseInCubic\", n[n.EaseOutCubic = 7] = \"EaseOutCubic\", n[n.EaseInOutCubic = 8] = \"EaseInOutCubic\", n[n.EaseInQuart = 9] = \"EaseInQuart\", n[n.EaseOutQuart = 10] = \"EaseOutQuart\", n[n.EaseInOutQuart = 11] = \"EaseInOutQuart\", n[n.EaseInQuint = 12] = \"EaseInQuint\", n[n.EaseOutQuint = 13] = \"EaseOutQuint\", n[n.EaseInOutQuint = 14] = \"EaseInOutQuint\", n[n.EaseInExpo = 15] = \"EaseInExpo\", n[n.EaseOutExpo = 16] = \"EaseOutExpo\", n[n.EaseInOutExpo = 17] = \"EaseInOutExpo\", n[n.EaseInCirc = 18] = \"EaseInCirc\", n[n.EaseOutCirc = 19] = \"EaseOutCirc\", n[n.EaseInOutCirc = 20] = \"EaseInOutCirc\", n[n.EaseInBack = 21] = \"EaseInBack\", n[n.EaseOutBack = 22] = \"EaseOutBack\", n[n.EaseInOutBack = 23] = \"EaseInOutBack\", n[n.EaseInElastic = 24] = \"EaseInElastic\", n[n.EaseOutElastic = 25] = \"EaseOutElastic\", n[n.EaseInOutElastic = 26] = \"EaseInOutElastic\";\n})(Ze || (Ze = {}));\nclass nE extends Ve {\n /**\n * Creates a new CurveBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.type = Ze.EaseInOutSine, this.registerInput(\"input\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[0].excludedConnectionPointTypes.push(b.Int);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryCurveBlock\";\n }\n /**\n * Gets the input component\n */\n get input() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.input.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n let e;\n switch (this.type) {\n case Ze.EaseInSine:\n e = (t) => 1 - Math.cos(t * 3.1415 / 2);\n break;\n case Ze.EaseOutSine:\n e = (t) => Math.sin(t * 3.1415 / 2);\n break;\n case Ze.EaseInOutSine:\n e = (t) => -(Math.cos(t * 3.1415) - 1) / 2;\n break;\n case Ze.EaseInQuad:\n e = (t) => t * t;\n break;\n case Ze.EaseOutQuad:\n e = (t) => (1 - t) * (1 - t);\n break;\n case Ze.EaseInOutQuad: {\n e = (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;\n break;\n }\n case Ze.EaseInCubic:\n e = (t) => t * t * t;\n break;\n case Ze.EaseOutCubic: {\n e = (t) => 1 - Math.pow(1 - t, 3);\n break;\n }\n case Ze.EaseInOutCubic: {\n e = (t) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n break;\n }\n case Ze.EaseInQuart:\n e = (t) => t * t * t * t;\n break;\n case Ze.EaseOutQuart: {\n e = (t) => 1 - Math.pow(1 - t, 4);\n break;\n }\n case Ze.EaseInOutQuart: {\n e = (t) => t < 0.5 ? 8 * t * t * t * t : 1 - Math.pow(-2 * t + 2, 4) / 2;\n break;\n }\n case Ze.EaseInQuint:\n e = (t) => t * t * t * t * t;\n break;\n case Ze.EaseOutQuint: {\n e = (t) => 1 - Math.pow(1 - t, 5);\n break;\n }\n case Ze.EaseInOutQuint: {\n e = (t) => t < 0.5 ? 16 * t * t * t * t * t : 1 - Math.pow(-2 * t + 2, 5) / 2;\n break;\n }\n case Ze.EaseInExpo: {\n e = (t) => t === 0 ? 0 : Math.pow(2, 10 * t - 10);\n break;\n }\n case Ze.EaseOutExpo: {\n e = (t) => t === 1 ? 1 : 1 - Math.pow(2, -10 * t);\n break;\n }\n case Ze.EaseInOutExpo: {\n e = (t) => t === 0 ? 0 : t === 1 ? 1 : t < 0.5 ? Math.pow(2, 20 * t - 10) / 2 : (2 - Math.pow(2, -20 * t + 10)) / 2;\n break;\n }\n case Ze.EaseInCirc: {\n e = (t) => 1 - Math.sqrt(1 - Math.pow(t, 2));\n break;\n }\n case Ze.EaseOutCirc: {\n e = (t) => Math.sqrt(1 - Math.pow(t - 1, 2));\n break;\n }\n case Ze.EaseInOutCirc: {\n e = (t) => t < 0.5 ? (1 - Math.sqrt(1 - Math.pow(2 * t, 2))) / 2 : (Math.sqrt(1 - Math.pow(-2 * t + 2, 2)) + 1) / 2;\n break;\n }\n case Ze.EaseInBack: {\n e = (t) => 2.70158 * t * t * t - 1.70158 * t * t;\n break;\n }\n case Ze.EaseOutBack: {\n e = (t) => 2.70158 * Math.pow(t - 1, 3) + 1.70158 * Math.pow(t - 1, 2);\n break;\n }\n case Ze.EaseInOutBack: {\n e = (t) => t < 0.5 ? Math.pow(2 * t, 2) * (3.5949095 * 2 * t - 2.5949095) / 2 : (Math.pow(2 * t - 2, 2) * (3.5949095 * (t * 2 - 2) + 3.5949095) + 2) / 2;\n break;\n }\n case Ze.EaseInElastic: {\n e = (t) => t === 0 ? 0 : t === 1 ? 1 : -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * (2 * 3.1415 / 3));\n break;\n }\n case Ze.EaseOutElastic: {\n e = (t) => t === 0 ? 0 : t === 1 ? 1 : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * (2 * 3.1415 / 3)) + 1;\n break;\n }\n case Ze.EaseInOutElastic: {\n e = (t) => t === 0 ? 0 : t == 1 ? 1 : t < 0.5 ? -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * (2 * 3.1415 / 4.5))) / 2 : Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * (2 * 3.1415 / 4.5)) / 2 + 1;\n break;\n }\n }\n return this.output._storedFunction = (t) => {\n const i = this.input.getConnectedValue(t);\n switch (this.input.type) {\n case b.Float:\n return e(i);\n case b.Vector2:\n return new me(e(i.x), e(i.y));\n case b.Vector3:\n return new _(e(i.x), e(i.y), e(i.z));\n case b.Vector4:\n return new Ke(e(i.x), e(i.y), e(i.z), e(i.w));\n }\n return 0;\n }, this;\n }\n serialize() {\n const e = super.serialize();\n return e.curveType = this.type, e;\n }\n _deserialize(e) {\n super._deserialize(e), this.type = e.curveType;\n }\n _dumpPropertiesCode() {\n return super._dumpPropertiesCode() + `${this._codeVariableName}.type = BABYLON.GeometryCurveBlockTypes.${Ze[this.type]};\n`;\n }\n}\nP([\n gt(\"Type\", ht.List, \"ADVANCED\", {\n notifiers: { rebuild: !0 },\n options: [\n { label: \"EaseInSine\", value: Ze.EaseInSine },\n { label: \"EaseOutSine\", value: Ze.EaseOutSine },\n { label: \"EaseInOutSine\", value: Ze.EaseInOutSine },\n { label: \"EaseInQuad\", value: Ze.EaseInQuad },\n { label: \"EaseOutQuad\", value: Ze.EaseOutQuad },\n { label: \"EaseInOutQuad\", value: Ze.EaseInOutQuad },\n { label: \"EaseInCubic\", value: Ze.EaseInCubic },\n { label: \"EaseOutCubic\", value: Ze.EaseOutCubic },\n { label: \"EaseInOutCubic\", value: Ze.EaseInOutCubic },\n { label: \"EaseInQuart\", value: Ze.EaseInQuart },\n { label: \"EaseOutQuart\", value: Ze.EaseOutQuart },\n { label: \"EaseInOutQuart\", value: Ze.EaseInOutQuart },\n { label: \"EaseInQuint\", value: Ze.EaseInQuint },\n { label: \"EaseOutQuint\", value: Ze.EaseOutQuint },\n { label: \"EaseInOutQuint\", value: Ze.EaseInOutQuint },\n { label: \"EaseInExpo\", value: Ze.EaseInExpo },\n { label: \"EaseOutExpo\", value: Ze.EaseOutExpo },\n { label: \"EaseInOutExpo\", value: Ze.EaseInOutExpo },\n { label: \"EaseInCirc\", value: Ze.EaseInCirc },\n { label: \"EaseOutCirc\", value: Ze.EaseOutCirc },\n { label: \"EaseInOutCirc\", value: Ze.EaseInOutCirc },\n { label: \"EaseInBack\", value: Ze.EaseInBack },\n { label: \"EaseOutBack\", value: Ze.EaseOutBack },\n { label: \"EaseInOutBack\", value: Ze.EaseInOutBack },\n { label: \"EaseInElastic\", value: Ze.EaseInElastic },\n { label: \"EaseOutElastic\", value: Ze.EaseOutElastic },\n { label: \"EaseInOutElastic\", value: Ze.EaseInOutElastic }\n ]\n })\n], nE.prototype, \"type\", void 0);\nRe(\"BABYLON.GeometryCurveBlock\", nE);\nclass TO extends Ve {\n /**\n * Creates a new GeometryDesaturateBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"color\", b.Vector3), this.registerInput(\"level\", b.Float, !0, 0), this.registerOutput(\"output\", b.Vector3);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryDesaturateBlock\";\n }\n /**\n * Gets the color operand input component\n */\n get color() {\n return this._inputs[0];\n }\n /**\n * Gets the level operand input component\n */\n get level() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.color.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.color.getConnectedValue(e), i = this.level.getConnectedValue(e), r = Math.min(t.x, t.y, t.z), s = Math.max(t.x, t.y, t.z), a = 0.5 * (r + s);\n return new _(t.x * (1 - i) + a * i, t.y * (1 - i) + a * i, t.z * (1 - i) + a * i);\n }, this;\n }\n}\nRe(\"BABYLON.GeometryDesaturateBlock\", TO);\nclass xO extends Ve {\n /**\n * Creates a new GeometryPosterizeBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"steps\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].acceptedConnectionPointTypes.push(b.Float);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryPosterizeBlock\";\n }\n /**\n * Gets the value input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the steps input component\n */\n get steps() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected || !this.steps.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.value.getConnectedValue(e), i = this.steps.getConnectedValue(e);\n let r = i;\n if (this.steps.type === b.Float)\n switch (this.value.type) {\n case b.Vector2:\n r = new me(i, i);\n break;\n case b.Vector3:\n r = new _(i, i, i);\n break;\n case b.Vector4:\n r = new Ke(i, i, i, i);\n break;\n }\n switch (this.value.type) {\n case b.Vector2:\n return new me(t.x / (1 / r.x) * (1 / r.x), t.y / (1 / r.y) * (1 / r.y));\n case b.Vector3:\n return new _(t.x / (1 / r.x) * (1 / r.x), t.y / (1 / r.y) * (1 / r.y), t.z / (1 / r.z) * (1 / r.z));\n case b.Vector4:\n return new Ke(t.x / (1 / r.x) * (1 / r.x), t.y / (1 / r.y) * (1 / r.y), t.z / (1 / r.z) * (1 / r.z), t.w / (1 / r.w) * (1 / r.w));\n default:\n return Math.floor(t / (1 / i) * (1 / i));\n }\n }, this;\n }\n}\nRe(\"BABYLON.GeometryPosterizeBlock\", xO);\nclass CO extends Ve {\n /**\n * Creates a new GeometryReplaceColorBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerInput(\"reference\", b.AutoDetect), this.registerInput(\"distance\", b.Float), this.registerInput(\"replacement\", b.AutoDetect), this.registerOutput(\"output\", b.BasedOnInput), this._outputs[0]._typeConnectionSource = this._inputs[0], this._linkConnectionTypes(0, 1), this._linkConnectionTypes(0, 3), this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Float), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix), this._inputs[3].excludedConnectionPointTypes.push(b.Float), this._inputs[3].excludedConnectionPointTypes.push(b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryReplaceColorBlock\";\n }\n /**\n * Gets the value input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the reference input component\n */\n get reference() {\n return this._inputs[1];\n }\n /**\n * Gets the distance input component\n */\n get distance() {\n return this._inputs[2];\n }\n /**\n * Gets the replacement input component\n */\n get replacement() {\n return this._inputs[3];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected || !this.reference.isConnected || !this.distance.isConnected || !this.replacement.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.value.getConnectedValue(e), i = this.reference.getConnectedValue(e), r = this.distance.getConnectedValue(e), s = this.replacement.getConnectedValue(e);\n return t.subtract(i).length() < r ? s : t;\n }, this;\n }\n}\nRe(\"BABYLON.GeometryReplaceColorBlock\", CO);\nclass RO extends Ve {\n /**\n * Creates a new GeometryDistanceBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerOutput(\"output\", b.Float), this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Int), this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Float), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryDistanceBlock\";\n }\n /**\n * Gets the left operand input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right operand input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected || !this.right.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.left.getConnectedValue(e), i = this.right.getConnectedValue(e);\n return t.subtract(i).length();\n }, this;\n }\n}\nRe(\"BABYLON.GeometryDistanceBlock\", RO);\nclass SO extends Ve {\n /**\n * Creates a new GeometryDotBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"left\", b.AutoDetect), this.registerInput(\"right\", b.AutoDetect), this.registerOutput(\"output\", b.Float), this._linkConnectionTypes(0, 1), this._inputs[0].excludedConnectionPointTypes.push(b.Int), this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix), this._inputs[1].excludedConnectionPointTypes.push(b.Float), this._inputs[1].excludedConnectionPointTypes.push(b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryDotBlock\";\n }\n /**\n * Gets the left operand input component\n */\n get left() {\n return this._inputs[0];\n }\n /**\n * Gets the right operand input component\n */\n get right() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.left.isConnected || !this.right.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.left.getConnectedValue(e), i = this.right.getConnectedValue(e);\n return t.dot(i);\n }, this;\n }\n}\nRe(\"BABYLON.GeometryDotBlock\", SO);\nclass yO extends Ve {\n /**\n * Creates a new GeometryLengthBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"value\", b.AutoDetect), this.registerOutput(\"output\", b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Int), this._inputs[0].excludedConnectionPointTypes.push(b.Float), this._inputs[0].excludedConnectionPointTypes.push(b.Matrix);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryLengthBlock\";\n }\n /**\n * Gets the value input component\n */\n get value() {\n return this._inputs[0];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.value.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => this.value.getConnectedValue(e).length(), this;\n }\n}\nRe(\"BABYLON.GeometryLengthBlock\", yO);\nclass IO extends Ve {\n /**\n * Creates a new GeometryRotate2dBlock\n * @param name defines the block name\n */\n constructor(e) {\n super(e), this.registerInput(\"input\", b.Vector2), this.registerInput(\"angle\", b.Float), this.registerOutput(\"output\", b.Vector2);\n }\n /**\n * Gets the current class name\n * @returns the class name\n */\n getClassName() {\n return \"GeometryRotate2dBlock\";\n }\n /**\n * Gets the input vector\n */\n get input() {\n return this._inputs[0];\n }\n /**\n * Gets the input angle\n */\n get angle() {\n return this._inputs[1];\n }\n /**\n * Gets the output component\n */\n get output() {\n return this._outputs[0];\n }\n _buildBlock() {\n if (!this.angle.isConnected || !this.input.isConnected) {\n this.output._storedFunction = null, this.output._storedValue = null;\n return;\n }\n return this.output._storedFunction = (e) => {\n const t = this.input.getConnectedValue(e), i = this.angle.getConnectedValue(e);\n return new me(Math.cos(i) * t.x - Math.sin(i) * t.y, Math.sin(i) * t.x + Math.cos(i) * t.y);\n }, this;\n }\n}\nRe(\"BABYLON.GeometryRotate2dBlock\", IO);\nconst bO = \"gaussianSplattingPixelShader\", AO = `#include\n#include\n#include\nvarying vec4 vColor;varying vec2 vPosition;void main () { \n#include\nfloat A=-dot(vPosition,vPosition);if (A<-4.0) discard;float B=exp(A)*vColor.a;\n#include\nvec3 color=vColor.rgb;\n#ifdef FOG\n#include\n#endif\ngl_FragColor=vec4(color,B);}\n`;\nY.ShadersStore[bO] = AO;\nconst MO = \"gaussianSplattingVertexDeclaration\", PO = `uniform mat4 world;uniform mat4 view;uniform mat4 projection;\n`;\nY.IncludesShadersStore[MO] = PO;\nconst OO = \"gaussianSplattingUboDeclaration\", DO = `#include\n#include\n`;\nY.IncludesShadersStore[OO] = DO;\nconst NO = \"gaussianSplattingVertexShader\", FO = `#include<__decl__gaussianSplattingVertex>\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\n#include\n#include\n#include\nattribute vec2 position;attribute float splatIndex;uniform vec2 viewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform sampler2D covariancesATexture;uniform sampler2D covariancesBTexture;uniform sampler2D centersTexture;uniform sampler2D colorsTexture;varying vec4 vColor;varying vec2 vPosition;\n#if !defined(WEBGL2) && !defined(WEBGPU) && !defined(NATIVE)\nmat3 transpose(mat3 matrix) {return mat3(matrix[0][0],matrix[1][0],matrix[2][0],\nmatrix[0][1],matrix[1][1],matrix[2][1],\nmatrix[0][2],matrix[1][2],matrix[2][2]);}\n#endif\nvec2 getDataUV(float index,vec2 textureSize) {float y=floor(index/textureSize.x);float x=index-y*textureSize.x;return vec2((x+0.5)/textureSize.x,(y+0.5)/textureSize.y);}\nvoid main () {vec2 splatUV=getDataUV(splatIndex,dataTextureSize);vec3 center=texture2D(centersTexture,splatUV).xyz;vec4 color=texture2D(colorsTexture,splatUV);vec3 covA=texture2D(covariancesATexture,splatUV).xyz;vec3 covB=texture2D(covariancesBTexture,splatUV).xyz;vec4 worldPos=world*vec4(center,1.0);mat4 modelView=view*world;vec4 camspace=view*worldPos;vec4 pos2d=projection*camspace;float bounds=1.2*pos2d.w;if (pos2d.z<-pos2d.w || pos2d.x<-bounds || pos2d.x>bounds\n|| pos2d.y<-bounds || pos2d.y>bounds) {gl_Position=vec4(0.0,0.0,2.0,1.0);return;}\nmat3 Vrk=mat3(\ncovA.x,covA.y,covA.z,\ncovA.y,covB.x,covB.y,\ncovA.z,covB.y,covB.z\n);mat3 J=mat3(\nfocal.x/camspace.z,0.,-(focal.x*camspace.x)/(camspace.z*camspace.z),\n0.,focal.y/camspace.z,-(focal.y*camspace.y)/(camspace.z*camspace.z),\n0.,0.,0.\n);mat3 invy=mat3(1,0,0,0,-1,0,0,0,1);mat3 T=invy*transpose(mat3(modelView))*J;mat3 cov2d=transpose(T)*Vrk*T;float mid=(cov2d[0][0]+cov2d[1][1])/2.0;float radius=length(vec2((cov2d[0][0]-cov2d[1][1])/2.0,cov2d[0][1]));float lambda1=mid+radius,lambda2=mid-radius;if (lambda2<0.0) return;vec2 diagonalVector=normalize(vec2(cov2d[0][1],lambda1-cov2d[0][0]));vec2 majorAxis=min(sqrt(2.0*lambda1),1024.0)*diagonalVector;vec2 minorAxis=min(sqrt(2.0*lambda2),1024.0)*vec2(diagonalVector.y,-diagonalVector.x);vColor=color;vPosition=position;vec2 vCenter=vec2(pos2d);gl_Position=vec4(\nvCenter \n+ (position.x*majorAxis*1./viewport \n+ position.y*minorAxis*1./viewport)*pos2d.w,pos2d.zw);\n#include\n#include\n#include\n}\n`;\nY.ShadersStore[NO] = FO;\nclass LO extends es {\n /**\n * Constructor of the defines.\n */\n constructor() {\n super(), this.FOG = !1, this.THIN_INSTANCES = !0, this.LOGARITHMICDEPTH = !1, this.CLIPPLANE = !1, this.CLIPPLANE2 = !1, this.CLIPPLANE3 = !1, this.CLIPPLANE4 = !1, this.CLIPPLANE5 = !1, this.CLIPPLANE6 = !1, this.rebuild();\n }\n}\nclass So extends Uc {\n /**\n * Instantiates a Gaussian Splatting Material in the given scene\n * @param name The friendly name of the material\n * @param scene The scene to add the material to\n */\n constructor(e, t) {\n super(e, t), this.backFaceCulling = !1;\n }\n /**\n * Gets a boolean indicating that current material needs to register RTT\n */\n get hasRenderTargetTextures() {\n return !1;\n }\n /**\n * Specifies whether or not this material should be rendered in alpha test mode.\n * @returns false\n */\n needAlphaTesting() {\n return !1;\n }\n /**\n * Specifies whether or not this material should be rendered in alpha blend mode.\n * @returns true\n */\n needAlphaBlending() {\n return !0;\n }\n /**\n * Checks whether the material is ready to be rendered for a given mesh.\n * @param mesh The mesh to render\n * @param subMesh The submesh to check against\n * @returns true if all the dependencies are ready (Textures, Effects...)\n */\n isReadyForSubMesh(e, t) {\n const r = t._drawWrapper;\n if (r.effect && this.isFrozen && r._wasPreviouslyReady && r._wasPreviouslyUsingInstances === !0)\n return !0;\n t.materialDefines || (t.materialDefines = new LO());\n const s = this.getScene(), a = t.materialDefines;\n if (this._isReadyForSubMesh(t))\n return !0;\n const o = s.getEngine();\n if (hf(e, s, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, !1, a), uf(s, o, this, a, !0, null, !0), ff(e, a, !1, !1), a.isDirty) {\n a.markAsProcessed(), s.resetCachedMaterial();\n const l = [I.PositionKind, \"splatIndex\"];\n cf(l, a);\n const c = [\"world\", \"view\", \"projection\", \"vFogInfos\", \"vFogColor\", \"logarithmicDepthConstant\", \"viewport\", \"dataTextureSize\", \"focal\"], h = [\"covariancesATexture\", \"covariancesBTexture\", \"centersTexture\", \"colorsTexture\"], u = [\"Scene\", \"Mesh\"];\n df({\n uniformsNames: c,\n uniformBuffersNames: u,\n samplers: h,\n defines: a\n }), Nc(c);\n const f = a.toString(), d = s.getEngine().createEffect(\"gaussianSplatting\", {\n attributes: l,\n uniformsNames: c,\n uniformBuffersNames: u,\n samplers: h,\n defines: f,\n onCompiled: this.onCompiled,\n onError: this.onError\n }, o);\n t.setEffect(d, a, this._materialContext);\n }\n return !t.effect || !t.effect.isReady() ? !1 : (a._renderId = s.getRenderId(), r._wasPreviouslyReady = !0, r._wasPreviouslyUsingInstances = !0, !0);\n }\n /**\n * Binds the submesh to this material by preparing the effect and shader to draw\n * @param world defines the world transformation matrix\n * @param mesh defines the mesh containing the submesh\n * @param subMesh defines the submesh to bind the material to\n */\n bindForSubMesh(e, t, i) {\n const r = this.getScene(), s = i.materialDefines;\n if (!s)\n return;\n const a = i.effect;\n if (!a)\n return;\n if (this._activeEffect = a, t.getMeshUniformBuffer().bindToEffect(a, \"Mesh\"), t.transferToEffect(e), this._mustRebind(r, a, i, t.visibility)) {\n this.bindView(a), this.bindViewProjection(a);\n const l = r.getEngine(), c = this.getScene().activeCamera, h = l.getRenderWidth(), u = l.getRenderHeight();\n this._activeEffect.setFloat2(\"viewport\", h, u);\n let f = 1e3;\n c && (c.fovMode == $e.FOVMODE_VERTICAL_FIXED ? f = u / 2 / Math.tan(c.fov / 2) : f = h / 2 / Math.tan(c.fov / 2)), this._activeEffect.setFloat2(\"focal\", f, f);\n const d = t;\n if (d.covariancesATexture) {\n const p = d.covariancesATexture.getSize();\n a.setFloat2(\"dataTextureSize\", p.width, p.height), a.setTexture(\"covariancesATexture\", d.covariancesATexture), a.setTexture(\"covariancesBTexture\", d.covariancesBTexture), a.setTexture(\"centersTexture\", d.centersTexture), a.setTexture(\"colorsTexture\", d.colorsTexture);\n }\n Fc(a, this, r);\n } else\n r.getEngine()._features.needToAlwaysBindUniformBuffers && (this._needToBindSceneUbo = !0);\n wc(r, t, a), this.useLogarithmicDepth && Lc(s, a, r), this._afterBind(t, this._activeEffect, i);\n }\n /**\n * Clones the material.\n * @param name The cloned name.\n * @returns The cloned material.\n */\n clone(e) {\n return Le.Clone(() => new So(e, this.getScene()), this);\n }\n /**\n * Serializes the current material to its JSON representation.\n * @returns The JSON representation.\n */\n serialize() {\n const e = super.serialize();\n return e.customType = \"BABYLON.GaussianSplattingMaterial\", e;\n }\n /**\n * Gets the class name of the material\n * @returns \"GaussianSplattingMaterial\"\n */\n getClassName() {\n return \"GaussianSplattingMaterial\";\n }\n /**\n * Parse a JSON input to create back a Gaussian Splatting material.\n * @param source The JSON data to parse\n * @param scene The scene to create the parsed material in\n * @param rootUrl The root url of the assets the material depends upon\n * @returns the instantiated GaussianSplattingMaterial.\n */\n static Parse(e, t, i) {\n return Le.Parse(() => new So(e.name, t), e, t, i);\n }\n}\nRe(\"BABYLON.GaussianSplattingMaterial\", So);\nclass lc extends B {\n /**\n * Gets the covariancesA texture\n */\n get covariancesATexture() {\n return this._covariancesATexture;\n }\n /**\n * Gets the covariancesB texture\n */\n get covariancesBTexture() {\n return this._covariancesBTexture;\n }\n /**\n * Gets the centers texture\n */\n get centersTexture() {\n return this._centersTexture;\n }\n /**\n * Gets the colors texture\n */\n get colorsTexture() {\n return this._colorsTexture;\n }\n /**\n * Creates a new gaussian splatting mesh\n * @param name defines the name of the mesh\n * @param url defines the url to load from (optional)\n * @param scene defines the hosting scene (optional)\n */\n constructor(e, t = null, i = null) {\n super(e, i), this._vertexCount = 0, this._worker = null, this._frameIdLastUpdate = -1, this._modelViewMatrix = L.Identity(), this._material = null, this._canPostToWorker = !0, this._covariancesATexture = null, this._covariancesBTexture = null, this._centersTexture = null, this._colorsTexture = null;\n const r = new re();\n r.positions = [-2, -2, 0, 2, -2, 0, 2, 2, 0, -2, 2, 0], r.indices = [0, 1, 2, 0, 2, 3], r.applyToMesh(this), this.subMeshes = [], new bi(0, 0, 4, 0, 6, this), this.doNotSyncBoundingInfo = !0, this.setEnabled(!1), this._lastProj = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], t && this.loadFileAsync(t);\n }\n /**\n * Returns the class name\n * @returns \"GaussianSplattingMesh\"\n */\n getClassName() {\n return \"GaussianSplattingMesh\";\n }\n /**\n * Returns the total number of vertices (splats) within the mesh\n * @returns the total number of vertices\n */\n getTotalVertices() {\n return this._vertexCount;\n }\n /**\n * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager\n * @param subMesh defines the subMesh to render\n * @param enableAlphaMode defines if alpha mode can be changed\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering\n * @returns the current mesh\n */\n render(e, t, i) {\n this.material || (this._material = new So(this.name + \"_material\", this._scene), this.material = this._material);\n const r = this.getScene().getFrameId();\n if (r !== this._frameIdLastUpdate && this._worker && this._scene.activeCamera && this._canPostToWorker) {\n this.getWorldMatrix().multiplyToRef(this._scene.activeCamera.getViewMatrix(), this._modelViewMatrix);\n const s = this._lastProj[2] * this._modelViewMatrix.m[2] + this._lastProj[6] * this._modelViewMatrix.m[6] + this._lastProj[10] * this._modelViewMatrix.m[10];\n Math.abs(s - 1) >= 0.01 && (this._frameIdLastUpdate = r, this._canPostToWorker = !1, this._lastProj = this._modelViewMatrix.m.slice(0), this._worker.postMessage({ view: this._modelViewMatrix.m, depthMix: this._depthMix }, [this._depthMix.buffer]));\n }\n return super.render(e, t, i);\n }\n /**\n * Code from https://github.com/dylanebert/gsplat.js/blob/main/src/loaders/PLYLoader.ts Under MIT license\n * Converts a .ply data array buffer to splat\n * if data array buffer is not ply, returns the original buffer\n * @param data the .ply data to load\n * @returns the loaded splat buffer\n */\n static ConvertPLYToSplat(e) {\n const t = new Uint8Array(e), i = new TextDecoder().decode(t.slice(0, 1024 * 10)), r = `end_header\n`, s = i.indexOf(r);\n if (s < 0 || !i)\n return e;\n const a = parseInt(/element vertex (\\d+)\\n/.exec(i)[1]);\n let o = 0;\n const l = {\n double: 8,\n int: 4,\n uint: 4,\n float: 4,\n short: 2,\n ushort: 2,\n uchar: 1\n }, c = [], h = i.slice(0, s).split(`\n`).filter((m) => m.startsWith(\"property \"));\n for (const m of h) {\n const [, v, E] = m.split(\" \");\n if (c.push({ name: E, type: v, offset: o }), l[v])\n o += l[v];\n else\n return ne.Error(`Unsupported property type: ${v}. Are you sure it's a valid Gaussian Splatting file?`), new ArrayBuffer(0);\n }\n const u = 3 * 4 + 3 * 4 + 4 + 4, f = 0.28209479177387814, d = new DataView(e, s + r.length), p = new ArrayBuffer(u * a), g = new Ce();\n for (let m = 0; m < a; m++) {\n const v = new Float32Array(p, m * u, 3), E = new Float32Array(p, m * u + 12, 3), C = new Uint8ClampedArray(p, m * u + 24, 4), T = new Uint8ClampedArray(p, m * u + 28, 4);\n let R = 255, x = 0, S = 0, M = 0;\n for (let N = 0; N < c.length; N++) {\n const F = c[N];\n let U;\n switch (F.type) {\n case \"float\":\n U = d.getFloat32(F.offset + m * o, !0);\n break;\n case \"int\":\n U = d.getInt32(F.offset + m * o, !0);\n break;\n default:\n throw new Error(`Unsupported property type: ${F.type}`);\n }\n switch (F.name) {\n case \"x\":\n v[0] = U;\n break;\n case \"y\":\n v[1] = U;\n break;\n case \"z\":\n v[2] = U;\n break;\n case \"scale_0\":\n E[0] = Math.exp(U);\n break;\n case \"scale_1\":\n E[1] = Math.exp(U);\n break;\n case \"scale_2\":\n E[2] = Math.exp(U);\n break;\n case \"red\":\n C[0] = U;\n break;\n case \"green\":\n C[1] = U;\n break;\n case \"blue\":\n C[2] = U;\n break;\n case \"f_dc_0\":\n C[0] = (0.5 + f * U) * 255;\n break;\n case \"f_dc_1\":\n C[1] = (0.5 + f * U) * 255;\n break;\n case \"f_dc_2\":\n C[2] = (0.5 + f * U) * 255;\n break;\n case \"f_dc_3\":\n C[3] = (0.5 + f * U) * 255;\n break;\n case \"opacity\":\n C[3] = 1 / (1 + Math.exp(-U)) * 255;\n break;\n case \"rot_0\":\n R = U;\n break;\n case \"rot_1\":\n x = U;\n break;\n case \"rot_2\":\n S = U;\n break;\n case \"rot_3\":\n M = U;\n break;\n }\n }\n g.set(x, S, M, R), g.normalize(), T[0] = g.w * 128 + 128, T[1] = g.x * 128 + 128, T[2] = g.y * 128 + 128, T[3] = g.z * 128 + 128;\n }\n return p;\n }\n /**\n * Loads a .splat Gaussian Splatting array buffer asynchronously\n * @param data arraybuffer containing splat file\n * @returns a promise that resolves when the operation is complete\n */\n loadDataAsync(e) {\n return Promise.resolve(this._loadData(e));\n }\n /**\n * Loads a .splat Gaussian or .ply Splatting file asynchronously\n * @param url path to the splat file to load\n * @returns a promise that resolves when the operation is complete\n */\n loadFileAsync(e) {\n return ge.LoadFileAsync(e, !0).then((t) => {\n this._loadData(lc.ConvertPLYToSplat(t));\n });\n }\n /**\n * Releases resources associated with this mesh.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n */\n dispose(e) {\n var t, i, r, s, a, o;\n (t = this._covariancesATexture) == null || t.dispose(), (i = this._covariancesBTexture) == null || i.dispose(), (r = this._centersTexture) == null || r.dispose(), (s = this._colorsTexture) == null || s.dispose(), this._covariancesATexture = null, this._covariancesBTexture = null, this._centersTexture = null, this._colorsTexture = null, (a = this._material) == null || a.dispose(!1, !0), this._material = null, (o = this._worker) == null || o.terminate(), this._worker = null, super.dispose(e);\n }\n _loadData(e) {\n var R;\n if (!e.byteLength)\n return;\n const t = new Uint8Array(e), i = new Float32Array(t.buffer), r = 3 * 4 + 3 * 4 + 4 + 4, s = t.length / r;\n this._vertexCount = s;\n const a = this._getTextureSize(s), o = a.x * a.y, l = new Float32Array(3 * o), c = new Float32Array(3 * o), h = new Float32Array(3 * o), u = z.Matrix[0], f = z.Matrix[1], d = z.Quaternion[0], p = new _(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), g = new _(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n for (let x = 0; x < s; x++) {\n const S = i[8 * x + 0], M = -i[8 * x + 1], N = i[8 * x + 2];\n l[3 * x + 0] = S, l[3 * x + 1] = M, l[3 * x + 2] = N, p.minimizeInPlaceFromFloats(S, M, N), g.maximizeInPlaceFromFloats(S, M, N), d.set((t[32 * x + 28 + 1] - 128) / 128, (t[32 * x + 28 + 2] - 128) / 128, (t[32 * x + 28 + 3] - 128) / 128, -(t[32 * x + 28 + 0] - 128) / 128), d.toRotationMatrix(u), L.ScalingToRef(i[8 * x + 3 + 0] * 2, i[8 * x + 3 + 1] * 2, i[8 * x + 3 + 2] * 2, f);\n const F = u.multiplyToRef(f, z.Matrix[0]).m;\n c[x * 3 + 0] = F[0] * F[0] + F[1] * F[1] + F[2] * F[2], c[x * 3 + 1] = F[0] * F[4] + F[1] * F[5] + F[2] * F[6], c[x * 3 + 2] = F[0] * F[8] + F[1] * F[9] + F[2] * F[10], h[x * 3 + 0] = F[4] * F[4] + F[5] * F[5] + F[6] * F[6], h[x * 3 + 1] = F[4] * F[8] + F[5] * F[9] + F[6] * F[10], h[x * 3 + 2] = F[8] * F[8] + F[9] * F[9] + F[10] * F[10];\n }\n const m = this.getBoundingInfo();\n m.reConstruct(p, g, this.getWorldMatrix()), m.isLocked = !0, this.forcedInstanceCount = this._vertexCount, this.setEnabled(!0);\n const v = new Float32Array(this._vertexCount * 1);\n this.thinInstanceSetBuffer(\"splatIndex\", v, 1, !1);\n const E = (x, S, M, N) => new rr(x, S, M, N, this._scene, !1, !1, 2, 1), C = (x) => {\n const S = x.length / 3, M = new Float32Array(S * 4);\n for (let N = 0; N < S; ++N)\n M[N * 4 + 0] = x[N * 3 + 0], M[N * 4 + 1] = x[N * 3 + 1], M[N * 4 + 2] = x[N * 3 + 2], M[N * 4 + 3] = 1;\n return M;\n }, T = new Float32Array(a.x * a.y * 4);\n for (let x = 0; x < this._vertexCount; ++x)\n T[x * 4 + 0] = t[32 * x + 24 + 0] / 255, T[x * 4 + 1] = t[32 * x + 24 + 1] / 255, T[x * 4 + 2] = t[32 * x + 24 + 2] / 255, T[x * 4 + 3] = t[32 * x + 24 + 3] / 255;\n this._covariancesATexture = E(C(c), a.x, a.y, 5), this._covariancesBTexture = E(C(h), a.x, a.y, 5), this._centersTexture = E(C(l), a.x, a.y, 5), this._colorsTexture = E(T, a.x, a.y, 5), (R = this._worker) == null || R.terminate(), this._worker = new Worker(URL.createObjectURL(new Blob([\"(\", lc._CreateWorker.toString(), \")(self)\"], {\n type: \"application/javascript\"\n }))), this._depthMix = new BigInt64Array(s), this._worker.postMessage({ positions: l, vertexCount: s }, [l.buffer]), this._worker.onmessage = (x) => {\n this._depthMix = x.data.depthMix;\n const S = new Uint32Array(x.data.depthMix.buffer);\n for (let M = 0; M < this._vertexCount; M++)\n v[M] = S[2 * M];\n this.thinInstanceBufferUpdated(\"splatIndex\"), this._canPostToWorker = !0;\n };\n }\n _getTextureSize(e) {\n const t = this._scene.getEngine(), i = t.getCaps().maxTextureSize;\n let r = 1;\n if (t.webGLVersion === 1 && !t.isWebGPU)\n for (; i * r < e; )\n r *= 2;\n else\n r = Math.ceil(e / i);\n return r > i && (ne.Error(\"GaussianSplatting texture size: (\" + i + \", \" + r + \"), maxTextureSize: \" + i), r = i), new me(i, r);\n }\n}\nlc._CreateWorker = function(n) {\n let e = 0, t, i, r, s;\n n.onmessage = (a) => {\n if (a.data.positions)\n t = a.data.positions, e = a.data.vertexCount;\n else {\n const o = a.data.view;\n if (!t || !o)\n throw new Error(\"positions or view is not defined!\");\n i = a.data.depthMix, r = new Uint32Array(i.buffer), s = new Float32Array(i.buffer);\n for (let l = 0; l < e; l++)\n r[2 * l] = l;\n for (let l = 0; l < e; l++)\n s[2 * l + 1] = 1e4 - (o[2] * t[3 * l + 0] + o[6] * t[3 * l + 1] + o[10] * t[3 * l + 2]);\n i.sort(), n.postMessage({ depthMix: i }, [i.buffer]);\n }\n };\n};\nvar Zo = Array.isArray, aE = typeof global == \"object\" && global && global.Object === Object && global, wO = typeof self == \"object\" && self && self.Object === Object && self, kc = aE || wO || Function(\"return this\")(), Da = kc.Symbol, oE = Object.prototype, UO = oE.hasOwnProperty, VO = oE.toString, eo = Da ? Da.toStringTag : void 0;\nfunction BO(n) {\n var e = UO.call(n, eo), t = n[eo];\n try {\n n[eo] = void 0;\n var i = !0;\n } catch {\n }\n var r = VO.call(n);\n return i && (e ? n[eo] = t : delete n[eo]), r;\n}\nvar kO = Object.prototype, zO = kO.toString;\nfunction WO(n) {\n return zO.call(n);\n}\nvar GO = \"[object Null]\", XO = \"[object Undefined]\", Cg = Da ? Da.toStringTag : void 0;\nfunction zc(n) {\n return n == null ? n === void 0 ? XO : GO : Cg && Cg in Object(n) ? BO(n) : WO(n);\n}\nfunction Wc(n) {\n return n != null && typeof n == \"object\";\n}\nvar HO = \"[object Symbol]\";\nfunction Of(n) {\n return typeof n == \"symbol\" || Wc(n) && zc(n) == HO;\n}\nvar KO = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/, qO = /^\\w*$/;\nfunction YO(n, e) {\n if (Zo(n))\n return !1;\n var t = typeof n;\n return t == \"number\" || t == \"symbol\" || t == \"boolean\" || n == null || Of(n) ? !0 : qO.test(n) || !KO.test(n) || e != null && n in Object(e);\n}\nfunction yo(n) {\n var e = typeof n;\n return n != null && (e == \"object\" || e == \"function\");\n}\nvar ZO = \"[object AsyncFunction]\", jO = \"[object Function]\", QO = \"[object GeneratorFunction]\", JO = \"[object Proxy]\";\nfunction lE(n) {\n if (!yo(n))\n return !1;\n var e = zc(n);\n return e == jO || e == QO || e == ZO || e == JO;\n}\nvar Hh = kc[\"__core-js_shared__\"], Rg = function() {\n var n = /[^.]+$/.exec(Hh && Hh.keys && Hh.keys.IE_PROTO || \"\");\n return n ? \"Symbol(src)_1.\" + n : \"\";\n}();\nfunction $O(n) {\n return !!Rg && Rg in n;\n}\nvar eD = Function.prototype, tD = eD.toString;\nfunction iD(n) {\n if (n != null) {\n try {\n return tD.call(n);\n } catch {\n }\n try {\n return n + \"\";\n } catch {\n }\n }\n return \"\";\n}\nvar rD = /[\\\\^$.*+?()[\\]{}|]/g, sD = /^\\[object .+?Constructor\\]$/, nD = Function.prototype, aD = Object.prototype, oD = nD.toString, lD = aD.hasOwnProperty, cD = RegExp(\n \"^\" + oD.call(lD).replace(rD, \"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, \"$1.*?\") + \"$\"\n);\nfunction hD(n) {\n if (!yo(n) || $O(n))\n return !1;\n var e = lE(n) ? cD : sD;\n return e.test(iD(n));\n}\nfunction uD(n, e) {\n return n == null ? void 0 : n[e];\n}\nfunction Df(n, e) {\n var t = uD(n, e);\n return hD(t) ? t : void 0;\n}\nvar Io = Df(Object, \"create\");\nfunction fD() {\n this.__data__ = Io ? Io(null) : {}, this.size = 0;\n}\nfunction dD(n) {\n var e = this.has(n) && delete this.__data__[n];\n return this.size -= e ? 1 : 0, e;\n}\nvar pD = \"__lodash_hash_undefined__\", gD = Object.prototype, mD = gD.hasOwnProperty;\nfunction _D(n) {\n var e = this.__data__;\n if (Io) {\n var t = e[n];\n return t === pD ? void 0 : t;\n }\n return mD.call(e, n) ? e[n] : void 0;\n}\nvar ED = Object.prototype, vD = ED.hasOwnProperty;\nfunction TD(n) {\n var e = this.__data__;\n return Io ? e[n] !== void 0 : vD.call(e, n);\n}\nvar xD = \"__lodash_hash_undefined__\";\nfunction CD(n, e) {\n var t = this.__data__;\n return this.size += this.has(n) ? 0 : 1, t[n] = Io && e === void 0 ? xD : e, this;\n}\nfunction Fn(n) {\n var e = -1, t = n == null ? 0 : n.length;\n for (this.clear(); ++e < t; ) {\n var i = n[e];\n this.set(i[0], i[1]);\n }\n}\nFn.prototype.clear = fD;\nFn.prototype.delete = dD;\nFn.prototype.get = _D;\nFn.prototype.has = TD;\nFn.prototype.set = CD;\nfunction RD() {\n this.__data__ = [], this.size = 0;\n}\nfunction Nf(n, e) {\n return n === e || n !== n && e !== e;\n}\nfunction Gc(n, e) {\n for (var t = n.length; t--; )\n if (Nf(n[t][0], e))\n return t;\n return -1;\n}\nvar SD = Array.prototype, yD = SD.splice;\nfunction ID(n) {\n var e = this.__data__, t = Gc(e, n);\n if (t < 0)\n return !1;\n var i = e.length - 1;\n return t == i ? e.pop() : yD.call(e, t, 1), --this.size, !0;\n}\nfunction bD(n) {\n var e = this.__data__, t = Gc(e, n);\n return t < 0 ? void 0 : e[t][1];\n}\nfunction AD(n) {\n return Gc(this.__data__, n) > -1;\n}\nfunction MD(n, e) {\n var t = this.__data__, i = Gc(t, n);\n return i < 0 ? (++this.size, t.push([n, e])) : t[i][1] = e, this;\n}\nfunction Ga(n) {\n var e = -1, t = n == null ? 0 : n.length;\n for (this.clear(); ++e < t; ) {\n var i = n[e];\n this.set(i[0], i[1]);\n }\n}\nGa.prototype.clear = RD;\nGa.prototype.delete = ID;\nGa.prototype.get = bD;\nGa.prototype.has = AD;\nGa.prototype.set = MD;\nvar PD = Df(kc, \"Map\");\nfunction OD() {\n this.size = 0, this.__data__ = {\n hash: new Fn(),\n map: new (PD || Ga)(),\n string: new Fn()\n };\n}\nfunction DD(n) {\n var e = typeof n;\n return e == \"string\" || e == \"number\" || e == \"symbol\" || e == \"boolean\" ? n !== \"__proto__\" : n === null;\n}\nfunction Xc(n, e) {\n var t = n.__data__;\n return DD(e) ? t[typeof e == \"string\" ? \"string\" : \"hash\"] : t.map;\n}\nfunction ND(n) {\n var e = Xc(this, n).delete(n);\n return this.size -= e ? 1 : 0, e;\n}\nfunction FD(n) {\n return Xc(this, n).get(n);\n}\nfunction LD(n) {\n return Xc(this, n).has(n);\n}\nfunction wD(n, e) {\n var t = Xc(this, n), i = t.size;\n return t.set(n, e), this.size += t.size == i ? 0 : 1, this;\n}\nfunction Un(n) {\n var e = -1, t = n == null ? 0 : n.length;\n for (this.clear(); ++e < t; ) {\n var i = n[e];\n this.set(i[0], i[1]);\n }\n}\nUn.prototype.clear = OD;\nUn.prototype.delete = ND;\nUn.prototype.get = FD;\nUn.prototype.has = LD;\nUn.prototype.set = wD;\nvar UD = \"Expected a function\";\nfunction Ff(n, e) {\n if (typeof n != \"function\" || e != null && typeof e != \"function\")\n throw new TypeError(UD);\n var t = function() {\n var i = arguments, r = e ? e.apply(this, i) : i[0], s = t.cache;\n if (s.has(r))\n return s.get(r);\n var a = n.apply(this, i);\n return t.cache = s.set(r, a) || s, a;\n };\n return t.cache = new (Ff.Cache || Un)(), t;\n}\nFf.Cache = Un;\nvar VD = 500;\nfunction BD(n) {\n var e = Ff(n, function(i) {\n return t.size === VD && t.clear(), i;\n }), t = e.cache;\n return e;\n}\nvar kD = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g, zD = /\\\\(\\\\)?/g, WD = BD(function(n) {\n var e = [];\n return n.charCodeAt(0) === 46 && e.push(\"\"), n.replace(kD, function(t, i, r, s) {\n e.push(r ? s.replace(zD, \"$1\") : i || t);\n }), e;\n});\nfunction GD(n, e) {\n for (var t = -1, i = n == null ? 0 : n.length, r = Array(i); ++t < i; )\n r[t] = e(n[t], t, n);\n return r;\n}\nvar XD = 1 / 0, Sg = Da ? Da.prototype : void 0, yg = Sg ? Sg.toString : void 0;\nfunction cE(n) {\n if (typeof n == \"string\")\n return n;\n if (Zo(n))\n return GD(n, cE) + \"\";\n if (Of(n))\n return yg ? yg.call(n) : \"\";\n var e = n + \"\";\n return e == \"0\" && 1 / n == -XD ? \"-0\" : e;\n}\nfunction HD(n) {\n return n == null ? \"\" : cE(n);\n}\nfunction Lf(n, e) {\n return Zo(n) ? n : YO(n, e) ? [n] : WD(HD(n));\n}\nvar KD = 1 / 0;\nfunction wf(n) {\n if (typeof n == \"string\" || Of(n))\n return n;\n var e = n + \"\";\n return e == \"0\" && 1 / n == -KD ? \"-0\" : e;\n}\nfunction qD(n, e) {\n e = Lf(e, n);\n for (var t = 0, i = e.length; n != null && t < i; )\n n = n[wf(e[t++])];\n return t && t == i ? n : void 0;\n}\nfunction hE(n, e, t) {\n var i = n == null ? void 0 : qD(n, e);\n return i === void 0 ? t : i;\n}\nfunction YD(n) {\n let e = [];\n return this.selected.forEach((t, i) => {\n t instanceof He ? e.push({ node: t, value: hE(t, n) }) : console.log(\"Node not a mesh, skipping.\");\n }), e;\n}\nvar Ig;\n(function(n) {\n n[n.Clean = 0] = \"Clean\", n[n.Stop = 1] = \"Stop\", n[n.Sync = 2] = \"Sync\", n[n.NoSync = 3] = \"NoSync\";\n})(Ig || (Ig = {}));\nnew he();\nDe.prototype._createDepthStencilCubeTexture = function(n, e) {\n const t = new or(this, Dt.DepthStencil);\n if (t.isCube = !0, this.webGLVersion === 1)\n return ne.Error(\"Depth cube texture is not supported by WebGL 1.\"), t;\n const i = {\n bilinearFiltering: !1,\n comparisonFunction: 0,\n generateStencil: !1,\n ...e\n }, r = this._gl;\n this._bindTextureDirectly(r.TEXTURE_CUBE_MAP, t, !0), this._setupDepthStencilTexture(t, n, i.generateStencil, i.bilinearFiltering, i.comparisonFunction);\n for (let s = 0; s < 6; s++)\n i.generateStencil ? r.texImage2D(r.TEXTURE_CUBE_MAP_POSITIVE_X + s, 0, r.DEPTH24_STENCIL8, n, n, 0, r.DEPTH_STENCIL, r.UNSIGNED_INT_24_8, null) : r.texImage2D(r.TEXTURE_CUBE_MAP_POSITIVE_X + s, 0, r.DEPTH_COMPONENT24, n, n, 0, r.DEPTH_COMPONENT, r.UNSIGNED_INT, null);\n return this._bindTextureDirectly(r.TEXTURE_CUBE_MAP, null), this._internalTexturesCache.push(t), t;\n};\nDe.prototype._partialLoadFile = function(n, e, t, i, r = null) {\n const s = (o) => {\n t[e] = o, t._internalCount++, t._internalCount === 6 && i(t);\n }, a = (o, l) => {\n r && o && r(o.status + \" \" + o.statusText, l);\n };\n this._loadFile(n, s, void 0, void 0, !0, a);\n};\nDe.prototype._cascadeLoadFiles = function(n, e, t, i = null) {\n const r = [];\n r._internalCount = 0;\n for (let s = 0; s < 6; s++)\n this._partialLoadFile(t[s], s, r, e, i);\n};\nDe.prototype._cascadeLoadImgs = function(n, e, t, i, r = null, s) {\n const a = [];\n a._internalCount = 0;\n for (let o = 0; o < 6; o++)\n this._partialLoadImg(i[o], o, a, n, e, t, r, s);\n};\nDe.prototype._partialLoadImg = function(n, e, t, i, r, s, a = null, o) {\n const l = rf();\n Go(n, (u) => {\n t[e] = u, t._internalCount++, i && i.removePendingData(l), t._internalCount === 6 && s && s(r, t);\n }, (u, f) => {\n i && i.removePendingData(l), a && a(u, f);\n }, i ? i.offlineProvider : null, o), i && i.addPendingData(l);\n};\nDe.prototype._setCubeMapTextureParams = function(n, e, t) {\n const i = this._gl;\n i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_MAG_FILTER, i.LINEAR), i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_MIN_FILTER, e ? i.LINEAR_MIPMAP_LINEAR : i.LINEAR), i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_WRAP_S, i.CLAMP_TO_EDGE), i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_WRAP_T, i.CLAMP_TO_EDGE), n.samplingMode = e ? 3 : 2, e && this.getCaps().textureMaxLevel && t !== void 0 && t > 0 && (i.texParameteri(i.TEXTURE_CUBE_MAP, i.TEXTURE_MAX_LEVEL, t), n._maxLodLevel = t), this._bindTextureDirectly(i.TEXTURE_CUBE_MAP, null);\n};\nDe.prototype.createCubeTextureBase = function(n, e, t, i, r = null, s = null, a, o = null, l = !1, c = 0, h = 0, u = null, f = null, d = null, p = !1) {\n const g = u || new or(this, Dt.Cube);\n g.isCube = !0, g.url = n, g.generateMipMaps = !i, g._lodGenerationScale = c, g._lodGenerationOffset = h, g._useSRGBBuffer = !!p && this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU || !!i), g !== u && (g.label = n.substring(0, 60)), this._doNotHandleContextLost || (g._extension = o, g._files = t);\n const m = n;\n this._transformTextureUrl && !u && (n = this._transformTextureUrl(n));\n const v = n.split(\"?\")[0], E = v.lastIndexOf(\".\"), C = o || (E > -1 ? v.substring(E).toLowerCase() : \"\");\n let T = null;\n for (const x of De._TextureLoaders)\n if (x.canLoad(C)) {\n T = x;\n break;\n }\n const R = (x, S) => {\n n === m ? s && x && s(x.status + \" \" + x.statusText, S) : (ne.Warn(`Failed to load ${n}, falling back to the ${m}`), this.createCubeTextureBase(m, e, t, !!i, r, s, a, o, l, c, h, g, f, d, p));\n };\n if (T) {\n const x = (S) => {\n f && f(g, S), T.loadCubeData(S, g, l, r, s);\n };\n t && t.length === 6 ? T.supportCascades ? this._cascadeLoadFiles(e, (S) => x(S.map((M) => new Uint8Array(M))), t, s) : s ? s(\"Textures type does not support cascades.\") : ne.Warn(\"Texture loader does not support cascades.\") : this._loadFile(n, (S) => x(new Uint8Array(S)), void 0, void 0, !0, R);\n } else {\n if (!t || t.length === 0)\n throw new Error(\"Cannot load cubemap because files were not defined, or the correct loader was not found.\");\n this._cascadeLoadImgs(e, g, (x, S) => {\n d && d(x, S);\n }, t, s);\n }\n return this._internalTexturesCache.push(g), g;\n};\nDe.prototype.createCubeTexture = function(n, e, t, i, r = null, s = null, a, o = null, l = !1, c = 0, h = 0, u = null, f, d = !1) {\n const p = this._gl;\n return this.createCubeTextureBase(n, e, t, !!i, r, s, a, o, l, c, h, u, (g) => this._bindTextureDirectly(p.TEXTURE_CUBE_MAP, g, !0), (g, m) => {\n const v = this.needPOTTextures ? De.GetExponentOfTwo(m[0].width, this._caps.maxCubemapTextureSize) : m[0].width, E = v, C = [\n p.TEXTURE_CUBE_MAP_POSITIVE_X,\n p.TEXTURE_CUBE_MAP_POSITIVE_Y,\n p.TEXTURE_CUBE_MAP_POSITIVE_Z,\n p.TEXTURE_CUBE_MAP_NEGATIVE_X,\n p.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n p.TEXTURE_CUBE_MAP_NEGATIVE_Z\n ];\n this._bindTextureDirectly(p.TEXTURE_CUBE_MAP, g, !0), this._unpackFlipY(!1);\n const T = a ? this._getInternalFormat(a, g._useSRGBBuffer) : g._useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : p.RGBA;\n let R = a ? this._getInternalFormat(a) : p.RGBA;\n g._useSRGBBuffer && this.webGLVersion === 1 && (R = T);\n for (let x = 0; x < C.length; x++)\n if (m[x].width !== v || m[x].height !== E) {\n if (this._prepareWorkingCanvas(), !this._workingCanvas || !this._workingContext) {\n ne.Warn(\"Cannot create canvas to resize texture.\");\n return;\n }\n this._workingCanvas.width = v, this._workingCanvas.height = E, this._workingContext.drawImage(m[x], 0, 0, m[x].width, m[x].height, 0, 0, v, E), p.texImage2D(C[x], 0, T, R, p.UNSIGNED_BYTE, this._workingCanvas);\n } else\n p.texImage2D(C[x], 0, T, R, p.UNSIGNED_BYTE, m[x]);\n i || p.generateMipmap(p.TEXTURE_CUBE_MAP), this._setCubeMapTextureParams(g, !i), g.width = v, g.height = E, g.isReady = !0, a && (g.format = a), g.onLoadedObservable.notifyObservers(g), g.onLoadedObservable.clear(), r && r();\n }, !!d);\n};\nclass Qi extends It {\n /**\n * Gets or sets the size of the bounding box associated with the cube texture\n * When defined, the cubemap will switch to local mode\n * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity\n * @example https://www.babylonjs-playground.com/#RNASML\n */\n set boundingBoxSize(e) {\n if (this._boundingBoxSize && this._boundingBoxSize.equals(e))\n return;\n this._boundingBoxSize = e;\n const t = this.getScene();\n t && t.markAllMaterialsAsDirty(1);\n }\n /**\n * Returns the bounding box size\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#using-local-cubemap-mode\n */\n get boundingBoxSize() {\n return this._boundingBoxSize;\n }\n /**\n * Sets texture matrix rotation angle around Y axis in radians.\n */\n set rotationY(e) {\n this._rotationY = e, this.setReflectionTextureMatrix(L.RotationY(this._rotationY));\n }\n /**\n * Gets texture matrix rotation angle around Y axis radians.\n */\n get rotationY() {\n return this._rotationY;\n }\n /**\n * Are mip maps generated for this texture or not.\n */\n get noMipmap() {\n return this._noMipmap;\n }\n /**\n * Gets the forced extension (if any)\n */\n get forcedExtension() {\n return this._forcedExtension;\n }\n /**\n * Creates a cube texture from an array of image urls\n * @param files defines an array of image urls\n * @param scene defines the hosting scene\n * @param noMipmap specifies if mip maps are not used\n * @returns a cube texture\n */\n static CreateFromImages(e, t, i) {\n let r = \"\";\n return e.forEach((s) => r += s), new Qi(r, t, null, i, e);\n }\n /**\n * Creates and return a texture created from prefilterd data by tools like IBL Baker or Lys.\n * @param url defines the url of the prefiltered texture\n * @param scene defines the scene the texture is attached to\n * @param forcedExtension defines the extension of the file if different from the url\n * @param createPolynomials defines whether or not to create polynomial harmonics from the texture data if necessary\n * @returns the prefiltered texture\n */\n static CreateFromPrefilteredData(e, t, i = null, r = !0) {\n const s = t.useDelayedTextureLoading;\n t.useDelayedTextureLoading = !1;\n const a = new Qi(e, t, null, !1, null, null, null, void 0, !0, i, r);\n return t.useDelayedTextureLoading = s, a;\n }\n /**\n * Creates a cube texture to use with reflection for instance. It can be based upon dds or six images as well\n * as prefiltered data.\n * @param rootUrl defines the url of the texture or the root name of the six images\n * @param sceneOrEngine defines the scene or engine the texture is attached to\n * @param extensions defines the suffixes add to the picture name in case six images are in use like _px.jpg...\n * @param noMipmap defines if mipmaps should be created or not\n * @param files defines the six files to load for the different faces in that order: px, py, pz, nx, ny, nz\n * @param onLoad defines a callback triggered at the end of the file load if no errors occurred\n * @param onError defines a callback triggered in case of error during load\n * @param format defines the internal format to use for the texture once loaded\n * @param prefiltered defines whether or not the texture is created from prefiltered data\n * @param forcedExtension defines the extensions to use (force a special type of file to load) in case it is different from the file name\n * @param createPolynomials defines whether or not to create polynomial harmonics from the texture data if necessary\n * @param lodScale defines the scale applied to environment texture. This manages the range of LOD level used for IBL according to the roughness\n * @param lodOffset defines the offset applied to environment texture. This manages first LOD level used for IBL according to the roughness\n * @param loaderOptions options to be passed to the loader\n * @param useSRGBBuffer Defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU) (default: false)\n * @returns the cube texture\n */\n constructor(e, t, i = null, r = !1, s = null, a = null, o = null, l = 5, c = !1, h = null, u = !1, f = 0.8, d = 0, p, g) {\n var m;\n super(t), this._lodScale = 0.8, this._lodOffset = 0, this.onLoadObservable = new he(), this.boundingBoxPosition = _.Zero(), this._rotationY = 0, this._files = null, this._forcedExtension = null, this._extensions = null, this._textureMatrixRefraction = new L(), this.name = e, this.url = e, this._noMipmap = r, this.hasAlpha = !1, this._format = l, this.isCube = !0, this._textureMatrix = L.Identity(), this._createPolynomials = u, this.coordinatesMode = le.CUBIC_MODE, this._extensions = i, this._files = s, this._forcedExtension = h, this._loaderOptions = p, this._useSRGBBuffer = g, this._lodScale = f, this._lodOffset = d, !(!e && !s) && this.updateURL(e, h, a, c, o, i, (m = this.getScene()) == null ? void 0 : m.useDelayedTextureLoading, s);\n }\n /**\n * Get the current class name of the texture useful for serialization or dynamic coding.\n * @returns \"CubeTexture\"\n */\n getClassName() {\n return \"CubeTexture\";\n }\n /**\n * Update the url (and optional buffer) of this texture if url was null during construction.\n * @param url the url of the texture\n * @param forcedExtension defines the extension to use\n * @param onLoad callback called when the texture is loaded (defaults to null)\n * @param prefiltered Defines whether the updated texture is prefiltered or not\n * @param onError callback called if there was an error during the loading process (defaults to null)\n * @param extensions defines the suffixes add to the picture name in case six images are in use like _px.jpg...\n * @param delayLoad defines if the texture should be loaded now (false by default)\n * @param files defines the six files to load for the different faces in that order: px, py, pz, nx, ny, nz\n */\n updateURL(e, t, i = null, r = !1, s = null, a = null, o = !1, l = null) {\n (!this.name || this.name.startsWith(\"data:\")) && (this.name = e), this.url = e, t && (this._forcedExtension = t);\n const c = e.lastIndexOf(\".\"), h = t || (c > -1 ? e.substring(c).toLowerCase() : \"\"), u = h.indexOf(\".dds\") === 0, f = h.indexOf(\".env\") === 0, d = h.indexOf(\".basis\") === 0;\n if (f ? (this.gammaSpace = !1, this._prefiltered = !1, this.anisotropicFilteringLevel = 1) : (this._prefiltered = r, r && (this.gammaSpace = !1, this.anisotropicFilteringLevel = 1)), l)\n this._files = l;\n else if (!d && !f && !u && !a && (a = [\"_px.jpg\", \"_py.jpg\", \"_pz.jpg\", \"_nx.jpg\", \"_ny.jpg\", \"_nz.jpg\"]), this._files = this._files || [], this._files.length = 0, a) {\n for (let p = 0; p < a.length; p++)\n this._files.push(e + a[p]);\n this._extensions = a;\n }\n o ? (this.delayLoadState = 4, this._delayedOnLoad = i, this._delayedOnError = s) : this._loadTexture(i, s);\n }\n /**\n * Delays loading of the cube texture\n * @param forcedExtension defines the extension to use\n */\n delayLoad(e) {\n this.delayLoadState === 4 && (e && (this._forcedExtension = e), this.delayLoadState = 1, this._loadTexture(this._delayedOnLoad, this._delayedOnError));\n }\n /**\n * Returns the reflection texture matrix\n * @returns the reflection texture matrix\n */\n getReflectionTextureMatrix() {\n return this._textureMatrix;\n }\n /**\n * Sets the reflection texture matrix\n * @param value Reflection texture matrix\n */\n setReflectionTextureMatrix(e) {\n var s, a;\n if (e.updateFlag === this._textureMatrix.updateFlag || (e.isIdentity() !== this._textureMatrix.isIdentity() && ((s = this.getScene()) == null || s.markAllMaterialsAsDirty(1, (o) => o.getActiveTextures().indexOf(this) !== -1)), this._textureMatrix = e, !((a = this.getScene()) != null && a.useRightHandedSystem)))\n return;\n const t = z.Vector3[0], i = z.Quaternion[0], r = z.Vector3[1];\n this._textureMatrix.decompose(t, i, r), i.z *= -1, i.w *= -1, L.ComposeToRef(t, i, r, this._textureMatrixRefraction);\n }\n /**\n * Gets a suitable rotate/transform matrix when the texture is used for refraction.\n * There's a separate function from getReflectionTextureMatrix because refraction requires a special configuration of the matrix in right-handed mode.\n * @returns The refraction matrix\n */\n getRefractionTextureMatrix() {\n var e;\n return (e = this.getScene()) != null && e.useRightHandedSystem ? this._textureMatrixRefraction : this._textureMatrix;\n }\n _loadTexture(e = null, t = null) {\n var o;\n const i = this.getScene(), r = this._texture;\n this._texture = this._getFromCache(this.url, this._noMipmap, void 0, void 0, this._useSRGBBuffer, this.isCube);\n const s = () => {\n var l;\n this.onLoadObservable.notifyObservers(this), r && (r.dispose(), (l = this.getScene()) == null || l.markAllMaterialsAsDirty(1)), e && e();\n }, a = (l, c) => {\n this._loadingError = !0, this._errorObject = { message: l, exception: c }, t && t(l, c), le.OnTextureLoadErrorObservable.notifyObservers(this);\n };\n this._texture ? this._texture.isReady ? ge.SetImmediate(() => s()) : this._texture.onLoadedObservable.add(() => s()) : (this._prefiltered ? this._texture = this._getEngine().createPrefilteredCubeTexture(this.url, i, this._lodScale, this._lodOffset, e, a, this._format, this._forcedExtension, this._createPolynomials) : this._texture = this._getEngine().createCubeTexture(this.url, i, this._files, this._noMipmap, e, a, this._format, this._forcedExtension, !1, this._lodScale, this._lodOffset, null, this._loaderOptions, !!this._useSRGBBuffer), (o = this._texture) == null || o.onLoadedObservable.add(() => this.onLoadObservable.notifyObservers(this)));\n }\n /**\n * Parses text to create a cube texture\n * @param parsedTexture define the serialized text to read from\n * @param scene defines the hosting scene\n * @param rootUrl defines the root url of the cube texture\n * @returns a cube texture\n */\n static Parse(e, t, i) {\n const r = Le.Parse(() => {\n let s = !1;\n return e.prefiltered && (s = e.prefiltered), new Qi(i + (e.url ?? e.name), t, e.extensions, !1, e.files || null, null, null, void 0, s, e.forcedExtension);\n }, e, t);\n if (e.boundingBoxPosition && (r.boundingBoxPosition = _.FromArray(e.boundingBoxPosition)), e.boundingBoxSize && (r.boundingBoxSize = _.FromArray(e.boundingBoxSize)), e.animations)\n for (let s = 0; s < e.animations.length; s++) {\n const a = e.animations[s], o = mr(\"BABYLON.Animation\");\n o && r.animations.push(o.Parse(a));\n }\n return r;\n }\n /**\n * Makes a clone, or deep copy, of the cube texture\n * @returns a new cube texture\n */\n clone() {\n let e = 0;\n const t = Le.Clone(() => {\n const i = new Qi(this.url, this.getScene() || this._getEngine(), this._extensions, this._noMipmap, this._files);\n return e = i.uniqueId, i;\n }, this);\n return t.uniqueId = e, t;\n }\n}\nP([\n w()\n], Qi.prototype, \"url\", void 0);\nP([\n hn()\n], Qi.prototype, \"boundingBoxPosition\", void 0);\nP([\n hn()\n], Qi.prototype, \"boundingBoxSize\", null);\nP([\n w(\"rotationY\")\n], Qi.prototype, \"rotationY\", null);\nP([\n w(\"files\")\n], Qi.prototype, \"_files\", void 0);\nP([\n w(\"forcedExtension\")\n], Qi.prototype, \"_forcedExtension\", void 0);\nP([\n w(\"extensions\")\n], Qi.prototype, \"_extensions\", void 0);\nP([\n K_(\"textureMatrix\")\n], Qi.prototype, \"_textureMatrix\", void 0);\nP([\n K_(\"textureMatrixRefraction\")\n], Qi.prototype, \"_textureMatrixRefraction\", void 0);\nle._CubeTextureParser = Qi.Parse;\nRe(\"BABYLON.CubeTexture\", Qi);\nclass fn {\n /**\n * Converts a panorama stored in RGB right to left up to down format into a cubemap (6 faces).\n *\n * @param float32Array The source data.\n * @param inputWidth The width of the input panorama.\n * @param inputHeight The height of the input panorama.\n * @param size The willing size of the generated cubemap (each faces will be size * size pixels)\n * @param supersample enable supersampling the cubemap\n * @returns The cubemap data\n */\n static ConvertPanoramaToCubemap(e, t, i, r, s = !1) {\n if (!e)\n throw \"ConvertPanoramaToCubemap: input cannot be null\";\n if (e.length != t * i * 3)\n throw \"ConvertPanoramaToCubemap: input size is wrong\";\n const a = this.CreateCubemapTexture(r, this.FACE_FRONT, e, t, i, s), o = this.CreateCubemapTexture(r, this.FACE_BACK, e, t, i, s), l = this.CreateCubemapTexture(r, this.FACE_LEFT, e, t, i, s), c = this.CreateCubemapTexture(r, this.FACE_RIGHT, e, t, i, s), h = this.CreateCubemapTexture(r, this.FACE_UP, e, t, i, s), u = this.CreateCubemapTexture(r, this.FACE_DOWN, e, t, i, s);\n return {\n front: a,\n back: o,\n left: l,\n right: c,\n up: h,\n down: u,\n size: r,\n type: 1,\n format: 4,\n gammaSpace: !1\n };\n }\n static CreateCubemapTexture(e, t, i, r, s, a = !1) {\n const o = new ArrayBuffer(e * e * 4 * 3), l = new Float32Array(o), c = a ? Math.max(1, Math.round(r / 4 / e)) : 1, h = 1 / c, u = h * h, f = t[1].subtract(t[0]).scale(h / e), d = t[3].subtract(t[2]).scale(h / e), p = 1 / e;\n let g = 0;\n for (let m = 0; m < e; m++)\n for (let v = 0; v < c; v++) {\n let E = t[0], C = t[2];\n for (let T = 0; T < e; T++)\n for (let R = 0; R < c; R++) {\n const x = C.subtract(E).scale(g).add(E);\n x.normalize();\n const S = this.CalcProjectionSpherical(x, i, r, s);\n l[m * e * 3 + T * 3 + 0] += S.r * u, l[m * e * 3 + T * 3 + 1] += S.g * u, l[m * e * 3 + T * 3 + 2] += S.b * u, E = E.add(f), C = C.add(d);\n }\n g += p * h;\n }\n return l;\n }\n static CalcProjectionSpherical(e, t, i, r) {\n let s = Math.atan2(e.z, e.x);\n const a = Math.acos(e.y);\n for (; s < -Math.PI; )\n s += 2 * Math.PI;\n for (; s > Math.PI; )\n s -= 2 * Math.PI;\n let o = s / Math.PI;\n const l = a / Math.PI;\n o = o * 0.5 + 0.5;\n let c = Math.round(o * i);\n c < 0 ? c = 0 : c >= i && (c = i - 1);\n let h = Math.round(l * r);\n h < 0 ? h = 0 : h >= r && (h = r - 1);\n const u = r - h - 1, f = t[u * i * 3 + c * 3 + 0], d = t[u * i * 3 + c * 3 + 1], p = t[u * i * 3 + c * 3 + 2];\n return {\n r: f,\n g: d,\n b: p\n };\n }\n}\nfn.FACE_LEFT = [new _(-1, -1, -1), new _(1, -1, -1), new _(-1, 1, -1), new _(1, 1, -1)];\nfn.FACE_RIGHT = [new _(1, -1, 1), new _(-1, -1, 1), new _(1, 1, 1), new _(-1, 1, 1)];\nfn.FACE_FRONT = [new _(1, -1, -1), new _(1, -1, 1), new _(1, 1, -1), new _(1, 1, 1)];\nfn.FACE_BACK = [new _(-1, -1, 1), new _(-1, -1, -1), new _(-1, 1, 1), new _(-1, 1, -1)];\nfn.FACE_DOWN = [new _(1, 1, -1), new _(1, 1, 1), new _(-1, 1, -1), new _(-1, 1, 1)];\nfn.FACE_UP = [new _(-1, -1, -1), new _(-1, -1, 1), new _(1, -1, -1), new _(1, -1, 1)];\nclass ZD {\n static _Ldexp(e, t) {\n return t > 1023 ? e * Math.pow(2, 1023) * Math.pow(2, t - 1023) : t < -1074 ? e * Math.pow(2, -1074) * Math.pow(2, t + 1074) : e * Math.pow(2, t);\n }\n static _Rgbe2float(e, t, i, r, s, a) {\n s > 0 ? (s = this._Ldexp(1, s - 136), e[a + 0] = t * s, e[a + 1] = i * s, e[a + 2] = r * s) : (e[a + 0] = 0, e[a + 1] = 0, e[a + 2] = 0);\n }\n static _ReadStringLine(e, t) {\n let i = \"\", r = \"\";\n for (let s = t; s < e.length - t && (r = String.fromCharCode(e[s]), r != `\n`); s++)\n i += r;\n return i;\n }\n /**\n * Reads header information from an RGBE texture stored in a native array.\n * More information on this format are available here:\n * https://en.wikipedia.org/wiki/RGBE_image_format\n *\n * @param uint8array The binary file stored in native array.\n * @returns The header information.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static RGBE_ReadHeader(e) {\n let t = 0, i = 0, r = this._ReadStringLine(e, 0);\n if (r[0] != \"#\" || r[1] != \"?\")\n throw \"Bad HDR Format.\";\n let s = !1, a = !1, o = 0;\n do\n o += r.length + 1, r = this._ReadStringLine(e, o), r == \"FORMAT=32-bit_rle_rgbe\" ? a = !0 : r.length == 0 && (s = !0);\n while (!s);\n if (!a)\n throw \"HDR Bad header format, unsupported FORMAT\";\n o += r.length + 1, r = this._ReadStringLine(e, o);\n const c = /^-Y (.*) \\+X (.*)$/g.exec(r);\n if (!c || c.length < 3)\n throw \"HDR Bad header format, no size\";\n if (i = parseInt(c[2]), t = parseInt(c[1]), i < 8 || i > 32767)\n throw \"HDR Bad header format, unsupported size\";\n return o += r.length + 1, {\n height: t,\n width: i,\n dataPosition: o\n };\n }\n /**\n * Returns the cubemap information (each faces texture data) extracted from an RGBE texture.\n * This RGBE texture needs to store the information as a panorama.\n *\n * More information on this format are available here:\n * https://en.wikipedia.org/wiki/RGBE_image_format\n *\n * @param buffer The binary file stored in an array buffer.\n * @param size The expected size of the extracted cubemap.\n * @param supersample enable supersampling the cubemap (default: false)\n * @returns The Cube Map information.\n */\n static GetCubeMapTextureData(e, t, i = !1) {\n const r = new Uint8Array(e), s = this.RGBE_ReadHeader(r), a = this.RGBE_ReadPixels(r, s);\n return fn.ConvertPanoramaToCubemap(a, s.width, s.height, t, i);\n }\n /**\n * Returns the pixels data extracted from an RGBE texture.\n * This pixels will be stored left to right up to down in the R G B order in one array.\n *\n * More information on this format are available here:\n * https://en.wikipedia.org/wiki/RGBE_image_format\n *\n * @param uint8array The binary file stored in an array buffer.\n * @param hdrInfo The header information of the file.\n * @returns The pixels data in RGB right to left up to down order.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static RGBE_ReadPixels(e, t) {\n return this._RGBEReadPixelsRLE(e, t);\n }\n static _RGBEReadPixelsRLE(e, t) {\n let i = t.height;\n const r = t.width;\n let s, a, o, l, c, h = t.dataPosition, u = 0, f = 0, d = 0;\n const p = new ArrayBuffer(r * 4), g = new Uint8Array(p), m = new ArrayBuffer(t.width * t.height * 4 * 3), v = new Float32Array(m);\n for (; i > 0; ) {\n if (s = e[h++], a = e[h++], o = e[h++], l = e[h++], s != 2 || a != 2 || o & 128 || t.width < 8 || t.width > 32767)\n return this._RGBEReadPixelsNOTRLE(e, t);\n if ((o << 8 | l) != r)\n throw \"HDR Bad header format, wrong scan line width\";\n for (u = 0, d = 0; d < 4; d++)\n for (f = (d + 1) * r; u < f; )\n if (s = e[h++], a = e[h++], s > 128) {\n if (c = s - 128, c == 0 || c > f - u)\n throw \"HDR Bad Format, bad scanline data (run)\";\n for (; c-- > 0; )\n g[u++] = a;\n } else {\n if (c = s, c == 0 || c > f - u)\n throw \"HDR Bad Format, bad scanline data (non-run)\";\n if (g[u++] = a, --c > 0)\n for (let E = 0; E < c; E++)\n g[u++] = e[h++];\n }\n for (d = 0; d < r; d++)\n s = g[d], a = g[d + r], o = g[d + 2 * r], l = g[d + 3 * r], this._Rgbe2float(v, s, a, o, l, (t.height - i) * r * 3 + d * 3);\n i--;\n }\n return v;\n }\n static _RGBEReadPixelsNOTRLE(e, t) {\n let i = t.height;\n const r = t.width;\n let s, a, o, l, c, h = t.dataPosition;\n const u = new ArrayBuffer(t.width * t.height * 4 * 3), f = new Float32Array(u);\n for (; i > 0; ) {\n for (c = 0; c < t.width; c++)\n s = e[h++], a = e[h++], o = e[h++], l = e[h++], this._Rgbe2float(f, s, a, o, l, (t.height - i) * r * 3 + c * 3);\n i--;\n }\n return f;\n }\n}\nconst jD = \"hdrFilteringVertexShader\", QD = `attribute vec2 position;varying vec3 direction;uniform vec3 up;uniform vec3 right;uniform vec3 front;\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nmat3 view=mat3(up,right,front);direction=view*vec3(position,1.0);gl_Position=vec4(position,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[jD] = QD;\nconst JD = \"hdrFilteringPixelShader\", $D = `#include\n#include\n#include\n#include\nuniform float alphaG;uniform samplerCube inputTexture;uniform vec2 vFilteringInfo;uniform float hdrScale;varying vec3 direction;void main() {vec3 color=radiance(alphaG,inputTexture,direction,vFilteringInfo);gl_FragColor=vec4(color*hdrScale,1.0);}`;\nY.ShadersStore[JD] = $D;\nclass eN {\n /**\n * Instantiates HDR filter for reflection maps\n *\n * @param engine Thin engine\n * @param options Options\n */\n constructor(e, t = {}) {\n this._lodGenerationOffset = 0, this._lodGenerationScale = 0.8, this.quality = 4096, this.hdrScale = 1, this._engine = e, this.hdrScale = t.hdrScale || this.hdrScale, this.quality = t.quality || this.quality;\n }\n _createRenderTarget(e) {\n let t = 0;\n this._engine.getCaps().textureHalfFloatRender ? t = 2 : this._engine.getCaps().textureFloatRender && (t = 1);\n const i = this._engine.createRenderTargetCubeTexture(e, {\n format: 5,\n type: t,\n createMipMaps: !0,\n generateMipMaps: !1,\n generateDepthBuffer: !1,\n generateStencilBuffer: !1,\n samplingMode: 1\n });\n return this._engine.updateTextureWrappingMode(i.texture, 0, 0, 0), this._engine.updateTextureSamplingMode(3, i.texture, !0), i;\n }\n _prefilterInternal(e) {\n const t = e.getSize().width, i = je.ILog2(t) + 1, r = this._effectWrapper.effect, s = this._createRenderTarget(t);\n this._effectRenderer.saveStates(), this._effectRenderer.setViewport();\n const a = e.getInternalTexture();\n a && this._engine.updateTextureSamplingMode(3, a, !0), this._effectRenderer.applyEffectWrapper(this._effectWrapper);\n const o = [\n [new _(0, 0, -1), new _(0, -1, 0), new _(1, 0, 0)],\n [new _(0, 0, 1), new _(0, -1, 0), new _(-1, 0, 0)],\n [new _(1, 0, 0), new _(0, 0, 1), new _(0, 1, 0)],\n [new _(1, 0, 0), new _(0, 0, -1), new _(0, -1, 0)],\n [new _(1, 0, 0), new _(0, -1, 0), new _(0, 0, 1)],\n [new _(-1, 0, 0), new _(0, -1, 0), new _(0, 0, -1)]\n // NegativeZ\n ];\n r.setFloat(\"hdrScale\", this.hdrScale), r.setFloat2(\"vFilteringInfo\", e.getSize().width, i), r.setTexture(\"inputTexture\", e);\n for (let h = 0; h < 6; h++) {\n r.setVector3(\"up\", o[h][0]), r.setVector3(\"right\", o[h][1]), r.setVector3(\"front\", o[h][2]);\n for (let u = 0; u < i; u++) {\n this._engine.bindFramebuffer(s, h, void 0, void 0, !0, u), this._effectRenderer.applyEffectWrapper(this._effectWrapper);\n let f = Math.pow(2, (u - this._lodGenerationOffset) / this._lodGenerationScale) / t;\n u === 0 && (f = 0), r.setFloat(\"alphaG\", f), this._effectRenderer.draw();\n }\n }\n this._effectRenderer.restoreStates(), this._engine.restoreDefaultFramebuffer(), this._engine._releaseTexture(e._texture);\n const l = s.texture.type, c = s.texture.format;\n return s._swapAndDie(e._texture), e._texture.type = l, e._texture.format = c, e.gammaSpace = !1, e.lodGenerationOffset = this._lodGenerationOffset, e.lodGenerationScale = this._lodGenerationScale, e._prefiltered = !0, e;\n }\n _createEffect(e, t) {\n const i = [];\n return e.gammaSpace && i.push(\"#define GAMMA_INPUT\"), i.push(\"#define NUM_SAMPLES \" + this.quality + \"u\"), new h0({\n engine: this._engine,\n name: \"hdrFiltering\",\n vertexShader: \"hdrFiltering\",\n fragmentShader: \"hdrFiltering\",\n samplerNames: [\"inputTexture\"],\n uniformNames: [\"vSampleDirections\", \"vWeights\", \"up\", \"right\", \"front\", \"vFilteringInfo\", \"hdrScale\", \"alphaG\"],\n useShaderStore: !0,\n defines: i,\n onCompiled: t\n });\n }\n /**\n * Get a value indicating if the filter is ready to be used\n * @param texture Texture to filter\n * @returns true if the filter is ready\n */\n isReady(e) {\n return e.isReady() && this._effectWrapper.effect.isReady();\n }\n /**\n * Prefilters a cube texture to have mipmap levels representing roughness values.\n * Prefiltering will be invoked at the end of next rendering pass.\n * This has to be done once the map is loaded, and has not been prefiltered by a third party software.\n * See http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf for more information\n * @param texture Texture to filter\n * @param onFinished Callback when filtering is done\n * @returns Promise called when prefiltering is done\n */\n prefilter(e, t = null) {\n return this._engine._features.allowTexturePrefiltering ? new Promise((i) => {\n this._effectRenderer = new c0(this._engine), this._effectWrapper = this._createEffect(e), this._effectWrapper.effect.executeWhenCompiled(() => {\n this._prefilterInternal(e), this._effectRenderer.dispose(), this._effectWrapper.dispose(), i(), t && t();\n });\n }) : (ne.Warn(\"HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.\"), Promise.reject(\"HDR prefiltering is not available in WebGL 1., you can use real time filtering instead.\"));\n }\n}\nclass Ta extends It {\n /**\n * Sets whether or not the texture is blocking during loading.\n */\n set isBlocking(e) {\n this._isBlocking = e;\n }\n /**\n * Gets whether or not the texture is blocking during loading.\n */\n get isBlocking() {\n return this._isBlocking;\n }\n /**\n * Sets texture matrix rotation angle around Y axis in radians.\n */\n set rotationY(e) {\n this._rotationY = e, this.setReflectionTextureMatrix(L.RotationY(this._rotationY));\n }\n /**\n * Gets texture matrix rotation angle around Y axis radians.\n */\n get rotationY() {\n return this._rotationY;\n }\n /**\n * Gets or sets the size of the bounding box associated with the cube texture\n * When defined, the cubemap will switch to local mode\n * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity\n * @example https://www.babylonjs-playground.com/#RNASML\n */\n set boundingBoxSize(e) {\n if (this._boundingBoxSize && this._boundingBoxSize.equals(e))\n return;\n this._boundingBoxSize = e;\n const t = this.getScene();\n t && t.markAllMaterialsAsDirty(1);\n }\n get boundingBoxSize() {\n return this._boundingBoxSize;\n }\n /**\n * Instantiates an HDRTexture from the following parameters.\n *\n * @param url The location of the HDR raw data (Panorama stored in RGBE format)\n * @param sceneOrEngine The scene or engine the texture will be used in\n * @param size The cubemap desired size (the more it increases the longer the generation will be)\n * @param noMipmap Forces to not generate the mipmap if true\n * @param generateHarmonics Specifies whether you want to extract the polynomial harmonics during the generation process\n * @param gammaSpace Specifies if the texture will be use in gamma or linear space (the PBR material requires those texture in linear space, but the standard material would require them in Gamma space)\n * @param prefilterOnLoad Prefilters HDR texture to allow use of this texture as a PBR reflection texture.\n * @param onLoad on success callback function\n * @param onError on error callback function\n * @param supersample Defines if texture must be supersampled (default: false)\n */\n constructor(e, t, i, r = !1, s = !0, a = !1, o = !1, l = null, c = null, h = !1) {\n var u;\n super(t), this._generateHarmonics = !0, this._onError = null, this._isBlocking = !0, this._rotationY = 0, this.boundingBoxPosition = _.Zero(), this.onLoadObservable = new he(), e && (this._coordinatesMode = le.CUBIC_MODE, this.name = e, this.url = e, this.hasAlpha = !1, this.isCube = !0, this._textureMatrix = L.Identity(), this._prefilterOnLoad = o, this._onLoad = () => {\n this.onLoadObservable.notifyObservers(this), l && l();\n }, this._onError = c, this.gammaSpace = a, this._noMipmap = r, this._size = i, this._supersample = h, this._generateHarmonics = s, this._texture = this._getFromCache(e, this._noMipmap, void 0, void 0, void 0, this.isCube), this._texture ? this._texture.isReady ? ge.SetImmediate(() => this._onLoad()) : this._texture.onLoadedObservable.add(this._onLoad) : (u = this.getScene()) != null && u.useDelayedTextureLoading ? this.delayLoadState = 4 : this._loadTexture());\n }\n /**\n * Get the current class name of the texture useful for serialization or dynamic coding.\n * @returns \"HDRCubeTexture\"\n */\n getClassName() {\n return \"HDRCubeTexture\";\n }\n /**\n * Occurs when the file is raw .hdr file.\n */\n _loadTexture() {\n const e = this._getEngine(), t = e.getCaps();\n let i = 0;\n t.textureFloat && t.textureFloatLinearFiltering ? i = 1 : t.textureHalfFloat && t.textureHalfFloatLinearFiltering && (i = 2);\n const r = (s) => {\n this.lodGenerationOffset = 0, this.lodGenerationScale = 0.8;\n const a = ZD.GetCubeMapTextureData(s, this._size, this._supersample);\n if (this._generateHarmonics) {\n const h = za.ConvertCubeMapToSphericalPolynomial(a);\n this.sphericalPolynomial = h;\n }\n const o = [];\n let l = null, c = null;\n for (let h = 0; h < 6; h++) {\n i === 2 ? c = new Uint16Array(this._size * this._size * 3) : i === 0 && (l = new Uint8Array(this._size * this._size * 3));\n const u = a[Ta._FacesMapping[h]];\n if (this.gammaSpace || c || l) {\n for (let f = 0; f < this._size * this._size; f++)\n if (this.gammaSpace && (u[f * 3 + 0] = Math.pow(u[f * 3 + 0], kl), u[f * 3 + 1] = Math.pow(u[f * 3 + 1], kl), u[f * 3 + 2] = Math.pow(u[f * 3 + 2], kl)), c && (c[f * 3 + 0] = ns(u[f * 3 + 0]), c[f * 3 + 1] = ns(u[f * 3 + 1]), c[f * 3 + 2] = ns(u[f * 3 + 2])), l) {\n let d = Math.max(u[f * 3 + 0] * 255, 0), p = Math.max(u[f * 3 + 1] * 255, 0), g = Math.max(u[f * 3 + 2] * 255, 0);\n const m = Math.max(Math.max(d, p), g);\n if (m > 255) {\n const v = 255 / m;\n d *= v, p *= v, g *= v;\n }\n l[f * 3 + 0] = d, l[f * 3 + 1] = p, l[f * 3 + 2] = g;\n }\n }\n c ? o.push(c) : l ? o.push(l) : o.push(u);\n }\n return o;\n };\n if (e._features.allowTexturePrefiltering && this._prefilterOnLoad) {\n const s = this._onLoad, a = new eN(e);\n this._onLoad = () => {\n a.prefilter(this, s);\n };\n }\n this._texture = e.createRawCubeTextureFromUrl(this.url, this.getScene(), this._size, 4, i, this._noMipmap, r, null, this._onLoad, this._onError);\n }\n clone() {\n const e = new Ta(this.url, this.getScene() || this._getEngine(), this._size, this._noMipmap, this._generateHarmonics, this.gammaSpace);\n return e.level = this.level, e.wrapU = this.wrapU, e.wrapV = this.wrapV, e.coordinatesIndex = this.coordinatesIndex, e.coordinatesMode = this.coordinatesMode, e;\n }\n // Methods\n delayLoad() {\n this.delayLoadState === 4 && (this.delayLoadState = 1, this._texture = this._getFromCache(this.url, this._noMipmap), this._texture || this._loadTexture());\n }\n /**\n * Get the texture reflection matrix used to rotate/transform the reflection.\n * @returns the reflection matrix\n */\n getReflectionTextureMatrix() {\n return this._textureMatrix;\n }\n /**\n * Set the texture reflection matrix used to rotate/transform the reflection.\n * @param value Define the reflection matrix to set\n */\n setReflectionTextureMatrix(e) {\n var t;\n this._textureMatrix = e, e.updateFlag !== this._textureMatrix.updateFlag && e.isIdentity() !== this._textureMatrix.isIdentity() && ((t = this.getScene()) == null || t.markAllMaterialsAsDirty(1, (i) => i.getActiveTextures().indexOf(this) !== -1));\n }\n /**\n * Dispose the texture and release its associated resources.\n */\n dispose() {\n this.onLoadObservable.clear(), super.dispose();\n }\n /**\n * Parses a JSON representation of an HDR Texture in order to create the texture\n * @param parsedTexture Define the JSON representation\n * @param scene Define the scene the texture should be created in\n * @param rootUrl Define the root url in case we need to load relative dependencies\n * @returns the newly created texture after parsing\n */\n static Parse(e, t, i) {\n let r = null;\n return e.name && !e.isRenderTarget && (r = new Ta(i + e.name, t, e.size, e.noMipmap, e.generateHarmonics, e.useInGammaSpace), r.name = e.name, r.hasAlpha = e.hasAlpha, r.level = e.level, r.coordinatesMode = e.coordinatesMode, r.isBlocking = e.isBlocking), r && (e.boundingBoxPosition && (r.boundingBoxPosition = _.FromArray(e.boundingBoxPosition)), e.boundingBoxSize && (r.boundingBoxSize = _.FromArray(e.boundingBoxSize)), e.rotationY && (r.rotationY = e.rotationY)), r;\n }\n serialize() {\n if (!this.name)\n return null;\n const e = {};\n return e.name = this.name, e.hasAlpha = this.hasAlpha, e.isCube = !0, e.level = this.level, e.size = this._size, e.coordinatesMode = this.coordinatesMode, e.useInGammaSpace = this.gammaSpace, e.generateHarmonics = this._generateHarmonics, e.customType = \"BABYLON.HDRCubeTexture\", e.noMipmap = this._noMipmap, e.isBlocking = this._isBlocking, e.rotationY = this._rotationY, e;\n }\n}\nTa._FacesMapping = [\"right\", \"left\", \"up\", \"down\", \"front\", \"back\"];\nRe(\"BABYLON.HDRCubeTexture\", Ta);\nclass cc extends It {\n /**\n * Instantiates an EquiRectangularCubeTexture from the following parameters.\n * @param url The location of the image\n * @param scene The scene the texture will be used in\n * @param size The cubemap desired size (the more it increases the longer the generation will be)\n * @param noMipmap Forces to not generate the mipmap if true\n * @param gammaSpace Specifies if the texture will be used in gamma or linear space\n * (the PBR material requires those textures in linear space, but the standard material would require them in Gamma space)\n * @param onLoad — defines a callback called when texture is loaded\n * @param onError — defines a callback called if there is an error\n * @param supersample — defines if texture must be supersampled (default: false)\n */\n constructor(e, t, i, r = !1, s = !0, a = null, o = null, l = !1) {\n if (super(t), this._onLoad = null, this._onError = null, !e)\n throw new Error(\"Image url is not set\");\n this._coordinatesMode = le.CUBIC_MODE, this.name = e, this.url = e, this._size = i, this._supersample = l, this._noMipmap = r, this.gammaSpace = s, this._onLoad = a, this._onError = o, this.hasAlpha = !1, this.isCube = !0, this._texture = this._getFromCache(e, this._noMipmap, void 0, void 0, void 0, this.isCube), this._texture ? a && (this._texture.isReady ? ge.SetImmediate(() => a()) : this._texture.onLoadedObservable.add(a)) : t.useDelayedTextureLoading ? this.delayLoadState = 4 : this._loadImage(() => this._loadTexture(), this._onError);\n }\n /**\n * Load the image data, by putting the image on a canvas and extracting its buffer.\n * @param loadTextureCallback\n * @param onError\n */\n _loadImage(e, t) {\n const i = this.getScene();\n if (!i)\n return;\n const r = i.getEngine().createRawCubeTexture(null, this._size, 4, i.getEngine().getCaps().textureFloat ? 1 : 7, this._noMipmap, !1, 3);\n r.generateMipMaps = !this._noMipmap, i.addPendingData(r), r.url = this.url, r.isReady = !1, i.getEngine()._internalTexturesCache.push(r), this._texture = r;\n const s = document.createElement(\"canvas\");\n Go(this.url, (a) => {\n this._width = a.width, this._height = a.height, s.width = this._width, s.height = this._height;\n const o = s.getContext(\"2d\");\n o.drawImage(a, 0, 0);\n const l = o.getImageData(0, 0, a.width, a.height);\n this._buffer = l.data.buffer, s.remove(), e();\n }, (a, o) => {\n i.removePendingData(r), t && t(`${this.getClassName()} could not be loaded`, o);\n }, i ? i.offlineProvider : null);\n }\n /**\n * Convert the image buffer into a cubemap and create a CubeTexture.\n */\n _loadTexture() {\n const e = this.getScene(), t = () => {\n const s = this._getFloat32ArrayFromArrayBuffer(this._buffer), a = fn.ConvertPanoramaToCubemap(s, this._width, this._height, this._size, this._supersample), o = [];\n for (let l = 0; l < 6; l++) {\n const c = a[cc._FacesMapping[l]];\n o.push(c);\n }\n return o;\n };\n if (!e)\n return;\n const i = t(), r = this._texture;\n e.getEngine().updateRawCubeTexture(r, i, r.format, r.type, r.invertY), r.isReady = !0, e.removePendingData(r), r.onLoadedObservable.notifyObservers(r), r.onLoadedObservable.clear(), this._onLoad && this._onLoad();\n }\n /**\n * Convert the ArrayBuffer into a Float32Array and drop the transparency channel.\n * @param buffer The ArrayBuffer that should be converted.\n * @returns The buffer as Float32Array.\n */\n _getFloat32ArrayFromArrayBuffer(e) {\n const t = new DataView(e), i = new Float32Array(e.byteLength * 3 / 4);\n let r = 0;\n for (let s = 0; s < e.byteLength; s++)\n (s + 1) % 4 !== 0 && (i[r++] = t.getUint8(s) / 255);\n return i;\n }\n /**\n * Get the current class name of the texture useful for serialization or dynamic coding.\n * @returns \"EquiRectangularCubeTexture\"\n */\n getClassName() {\n return \"EquiRectangularCubeTexture\";\n }\n /**\n * Create a clone of the current EquiRectangularCubeTexture and return it.\n * @returns A clone of the current EquiRectangularCubeTexture.\n */\n clone() {\n const e = this.getScene();\n if (!e)\n return this;\n const t = new cc(this.url, e, this._size, this._noMipmap, this.gammaSpace);\n return t.level = this.level, t.wrapU = this.wrapU, t.wrapV = this.wrapV, t.coordinatesIndex = this.coordinatesIndex, t.coordinatesMode = this.coordinatesMode, t;\n }\n}\ncc._FacesMapping = [\"right\", \"left\", \"up\", \"down\", \"front\", \"back\"];\nvar bg;\n(function(n) {\n n[n.INIT = 0] = \"INIT\", n[n.RUNNING = 1] = \"RUNNING\", n[n.DONE = 2] = \"DONE\", n[n.ERROR = 3] = \"ERROR\";\n})(bg || (bg = {}));\nvar Ag;\n(function(n) {\n n[n.cTFETC1 = 0] = \"cTFETC1\", n[n.cTFETC2 = 1] = \"cTFETC2\", n[n.cTFBC1 = 2] = \"cTFBC1\", n[n.cTFBC3 = 3] = \"cTFBC3\", n[n.cTFBC4 = 4] = \"cTFBC4\", n[n.cTFBC5 = 5] = \"cTFBC5\", n[n.cTFBC7 = 6] = \"cTFBC7\", n[n.cTFPVRTC1_4_RGB = 8] = \"cTFPVRTC1_4_RGB\", n[n.cTFPVRTC1_4_RGBA = 9] = \"cTFPVRTC1_4_RGBA\", n[n.cTFASTC_4x4 = 10] = \"cTFASTC_4x4\", n[n.cTFATC_RGB = 11] = \"cTFATC_RGB\", n[n.cTFATC_RGBA_INTERPOLATED_ALPHA = 12] = \"cTFATC_RGBA_INTERPOLATED_ALPHA\", n[n.cTFRGBA32 = 13] = \"cTFRGBA32\", n[n.cTFRGB565 = 14] = \"cTFRGB565\", n[n.cTFBGR565 = 15] = \"cTFBGR565\", n[n.cTFRGBA4444 = 16] = \"cTFRGBA4444\", n[n.cTFFXT1_RGB = 17] = \"cTFFXT1_RGB\", n[n.cTFPVRTC2_4_RGB = 18] = \"cTFPVRTC2_4_RGB\", n[n.cTFPVRTC2_4_RGBA = 19] = \"cTFPVRTC2_4_RGBA\", n[n.cTFETC2_EAC_R11 = 20] = \"cTFETC2_EAC_R11\", n[n.cTFETC2_EAC_RG11 = 21] = \"cTFETC2_EAC_RG11\";\n})(Ag || (Ag = {}));\n`${ge._DefaultCdnUrl}`, `${ge._DefaultCdnUrl}`;\nconst tN = 542327876, Mg = 131072, Pg = 512, Og = 4, Dg = 64, Ng = 131072;\nfunction Hc(n) {\n return n.charCodeAt(0) + (n.charCodeAt(1) << 8) + (n.charCodeAt(2) << 16) + (n.charCodeAt(3) << 24);\n}\nfunction iN(n) {\n return String.fromCharCode(n & 255, n >> 8 & 255, n >> 16 & 255, n >> 24 & 255);\n}\nconst Fg = Hc(\"DXT1\"), Lg = Hc(\"DXT3\"), wg = Hc(\"DXT5\"), Kh = Hc(\"DX10\"), Ug = 113, Vg = 116, Bg = 2, kg = 10, rN = 88, qh = 31, sN = 0, nN = 1, zg = 2, Wg = 3, Yh = 4, Gg = 7, Zh = 20, Xg = 21, aN = 22, oN = 23, lN = 24, cN = 25, hN = 26, uN = 28, fN = 32;\nclass Lt {\n /**\n * Gets DDS information from an array buffer\n * @param data defines the array buffer view to read data from\n * @returns the DDS information\n */\n static GetDDSInfo(e) {\n const t = new Int32Array(e.buffer, e.byteOffset, qh), i = new Int32Array(e.buffer, e.byteOffset, qh + 4);\n let r = 1;\n t[zg] & Mg && (r = Math.max(1, t[Gg]));\n const s = t[Xg], a = s === Kh ? i[fN] : 0;\n let o = 0;\n switch (s) {\n case Ug:\n o = 2;\n break;\n case Vg:\n o = 1;\n break;\n case Kh:\n if (a === kg) {\n o = 2;\n break;\n }\n if (a === Bg) {\n o = 1;\n break;\n }\n }\n return {\n width: t[Yh],\n height: t[Wg],\n mipmapCount: r,\n isFourCC: (t[Zh] & Og) === Og,\n isRGB: (t[Zh] & Dg) === Dg,\n isLuminance: (t[Zh] & Ng) === Ng,\n isCube: (t[uN] & Pg) === Pg,\n isCompressed: s === Fg || s === Lg || s === wg,\n dxgiFormat: a,\n textureType: o\n };\n }\n static _GetHalfFloatAsFloatRGBAArrayBuffer(e, t, i, r, s, a) {\n const o = new Float32Array(r), l = new Uint16Array(s, i);\n let c = 0;\n for (let h = 0; h < t; h++)\n for (let u = 0; u < e; u++) {\n const f = (u + h * e) * 4;\n o[c] = Ms(l[f]), o[c + 1] = Ms(l[f + 1]), o[c + 2] = Ms(l[f + 2]), Lt.StoreLODInAlphaChannel ? o[c + 3] = a : o[c + 3] = Ms(l[f + 3]), c += 4;\n }\n return o;\n }\n static _GetHalfFloatRGBAArrayBuffer(e, t, i, r, s, a) {\n if (Lt.StoreLODInAlphaChannel) {\n const o = new Uint16Array(r), l = new Uint16Array(s, i);\n let c = 0;\n for (let h = 0; h < t; h++)\n for (let u = 0; u < e; u++) {\n const f = (u + h * e) * 4;\n o[c] = l[f], o[c + 1] = l[f + 1], o[c + 2] = l[f + 2], o[c + 3] = ns(a), c += 4;\n }\n return o;\n }\n return new Uint16Array(s, i, r);\n }\n static _GetFloatRGBAArrayBuffer(e, t, i, r, s, a) {\n if (Lt.StoreLODInAlphaChannel) {\n const o = new Float32Array(r), l = new Float32Array(s, i);\n let c = 0;\n for (let h = 0; h < t; h++)\n for (let u = 0; u < e; u++) {\n const f = (u + h * e) * 4;\n o[c] = l[f], o[c + 1] = l[f + 1], o[c + 2] = l[f + 2], o[c + 3] = a, c += 4;\n }\n return o;\n }\n return new Float32Array(s, i, r);\n }\n static _GetFloatAsHalfFloatRGBAArrayBuffer(e, t, i, r, s, a) {\n const o = new Uint16Array(r), l = new Float32Array(s, i);\n let c = 0;\n for (let h = 0; h < t; h++)\n for (let u = 0; u < e; u++)\n o[c] = ns(l[c]), o[c + 1] = ns(l[c + 1]), o[c + 2] = ns(l[c + 2]), Lt.StoreLODInAlphaChannel ? o[c + 3] = ns(a) : o[c + 3] = ns(l[c + 3]), c += 4;\n return o;\n }\n static _GetFloatAsUIntRGBAArrayBuffer(e, t, i, r, s, a) {\n const o = new Uint8Array(r), l = new Float32Array(s, i);\n let c = 0;\n for (let h = 0; h < t; h++)\n for (let u = 0; u < e; u++) {\n const f = (u + h * e) * 4;\n o[c] = je.Clamp(l[f]) * 255, o[c + 1] = je.Clamp(l[f + 1]) * 255, o[c + 2] = je.Clamp(l[f + 2]) * 255, Lt.StoreLODInAlphaChannel ? o[c + 3] = a : o[c + 3] = je.Clamp(l[f + 3]) * 255, c += 4;\n }\n return o;\n }\n static _GetHalfFloatAsUIntRGBAArrayBuffer(e, t, i, r, s, a) {\n const o = new Uint8Array(r), l = new Uint16Array(s, i);\n let c = 0;\n for (let h = 0; h < t; h++)\n for (let u = 0; u < e; u++) {\n const f = (u + h * e) * 4;\n o[c] = je.Clamp(Ms(l[f])) * 255, o[c + 1] = je.Clamp(Ms(l[f + 1])) * 255, o[c + 2] = je.Clamp(Ms(l[f + 2])) * 255, Lt.StoreLODInAlphaChannel ? o[c + 3] = a : o[c + 3] = je.Clamp(Ms(l[f + 3])) * 255, c += 4;\n }\n return o;\n }\n static _GetRGBAArrayBuffer(e, t, i, r, s, a, o, l, c) {\n const h = new Uint8Array(r), u = new Uint8Array(s, i);\n let f = 0;\n for (let d = 0; d < t; d++)\n for (let p = 0; p < e; p++) {\n const g = (p + d * e) * 4;\n h[f] = u[g + a], h[f + 1] = u[g + o], h[f + 2] = u[g + l], h[f + 3] = u[g + c], f += 4;\n }\n return h;\n }\n static _ExtractLongWordOrder(e) {\n return e === 0 || e === 255 || e === -16777216 ? 0 : 1 + Lt._ExtractLongWordOrder(e >> 8);\n }\n static _GetRGBArrayBuffer(e, t, i, r, s, a, o, l) {\n const c = new Uint8Array(r), h = new Uint8Array(s, i);\n let u = 0;\n for (let f = 0; f < t; f++)\n for (let d = 0; d < e; d++) {\n const p = (d + f * e) * 3;\n c[u] = h[p + a], c[u + 1] = h[p + o], c[u + 2] = h[p + l], u += 3;\n }\n return c;\n }\n static _GetLuminanceArrayBuffer(e, t, i, r, s) {\n const a = new Uint8Array(r), o = new Uint8Array(s, i);\n let l = 0;\n for (let c = 0; c < t; c++)\n for (let h = 0; h < e; h++) {\n const u = h + c * e;\n a[l] = o[u], l++;\n }\n return a;\n }\n /**\n * Uploads DDS Levels to a Babylon Texture\n * @internal\n */\n static UploadDDSLevels(e, t, i, r, s, a, o = -1, l, c = !0) {\n let h = null;\n r.sphericalPolynomial && (h = []);\n const u = !!e.getCaps().s3tc;\n t.generateMipMaps = s;\n const f = new Int32Array(i.buffer, i.byteOffset, qh);\n let d, p, g, m = 0, v, E, C, T, R = 0, x = 1;\n if (f[sN] !== tN) {\n ne.Error(\"Invalid magic number in DDS header\");\n return;\n }\n if (!r.isFourCC && !r.isRGB && !r.isLuminance) {\n ne.Error(\"Unsupported format, must contain a FourCC, RGB or LUMINANCE code\");\n return;\n }\n if (r.isCompressed && !u) {\n ne.Error(\"Compressed textures are not supported on this platform.\");\n return;\n }\n let S = f[aN];\n v = f[nN] + 4;\n let M = !1;\n if (r.isFourCC)\n switch (d = f[Xg], d) {\n case Fg:\n x = 8, R = 33777;\n break;\n case Lg:\n x = 16, R = 33778;\n break;\n case wg:\n x = 16, R = 33779;\n break;\n case Ug:\n M = !0, S = 64;\n break;\n case Vg:\n M = !0, S = 128;\n break;\n case Kh: {\n v += 5 * 4;\n let k = !1;\n switch (r.dxgiFormat) {\n case kg:\n M = !0, S = 64, k = !0;\n break;\n case Bg:\n M = !0, S = 128, k = !0;\n break;\n case rN:\n r.isRGB = !0, r.isFourCC = !1, S = 32, k = !0;\n break;\n }\n if (k)\n break;\n }\n default:\n ne.Error([\"Unsupported FourCC code:\", iN(d)]);\n return;\n }\n const N = Lt._ExtractLongWordOrder(f[oN]), F = Lt._ExtractLongWordOrder(f[lN]), U = Lt._ExtractLongWordOrder(f[cN]), H = Lt._ExtractLongWordOrder(f[hN]);\n M && (R = e._getRGBABufferInternalSizedFormat(r.textureType)), C = 1, f[zg] & Mg && s !== !1 && (C = Math.max(1, f[Gg]));\n const q = l || 0, Z = e.getCaps();\n for (let k = q; k < a; k++) {\n for (p = f[Yh], g = f[Wg], T = 0; T < C; ++T) {\n if (o === -1 || o === T) {\n const Q = o === -1 ? T : 0;\n if (!r.isCompressed && r.isFourCC) {\n t.format = 5, m = p * g * 4;\n let ce = null;\n if (e._badOS || e._badDesktopOS || !Z.textureHalfFloat && !Z.textureFloat)\n S === 128 ? (ce = Lt._GetFloatAsUIntRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, Q), h && Q == 0 && h.push(Lt._GetFloatRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, Q))) : S === 64 && (ce = Lt._GetHalfFloatAsUIntRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, Q), h && Q == 0 && h.push(Lt._GetHalfFloatAsFloatRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, Q))), t.type = 0;\n else {\n const de = Z.textureFloat && (c && Z.textureFloatLinearFiltering || !c), j = Z.textureHalfFloat && (c && Z.textureHalfFloatLinearFiltering || !c), J = (S === 128 || S === 64 && !j) && de ? 1 : (S === 64 || S === 128 && !de) && j ? 2 : 0;\n let O, G = null;\n switch (S) {\n case 128: {\n switch (J) {\n case 1:\n O = Lt._GetFloatRGBAArrayBuffer, G = null;\n break;\n case 2:\n O = Lt._GetFloatAsHalfFloatRGBAArrayBuffer, G = Lt._GetFloatRGBAArrayBuffer;\n break;\n case 0:\n O = Lt._GetFloatAsUIntRGBAArrayBuffer, G = Lt._GetFloatRGBAArrayBuffer;\n break;\n }\n break;\n }\n default: {\n switch (J) {\n case 1:\n O = Lt._GetHalfFloatAsFloatRGBAArrayBuffer, G = null;\n break;\n case 2:\n O = Lt._GetHalfFloatRGBAArrayBuffer, G = Lt._GetHalfFloatAsFloatRGBAArrayBuffer;\n break;\n case 0:\n O = Lt._GetHalfFloatAsUIntRGBAArrayBuffer, G = Lt._GetHalfFloatAsFloatRGBAArrayBuffer;\n break;\n }\n break;\n }\n }\n t.type = J, ce = O(p, g, i.byteOffset + v, m, i.buffer, Q), h && Q == 0 && h.push(G ? G(p, g, i.byteOffset + v, m, i.buffer, Q) : ce);\n }\n ce && e._uploadDataToTextureDirectly(t, ce, k, Q);\n } else if (r.isRGB)\n t.type = 0, S === 24 ? (t.format = 4, m = p * g * 3, E = Lt._GetRGBArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, N, F, U), e._uploadDataToTextureDirectly(t, E, k, Q)) : (t.format = 5, m = p * g * 4, E = Lt._GetRGBAArrayBuffer(p, g, i.byteOffset + v, m, i.buffer, N, F, U, H), e._uploadDataToTextureDirectly(t, E, k, Q));\n else if (r.isLuminance) {\n const ce = e._getUnpackAlignement(), de = p;\n m = Math.floor((p + ce - 1) / ce) * ce * (g - 1) + de, E = Lt._GetLuminanceArrayBuffer(p, g, i.byteOffset + v, m, i.buffer), t.format = 1, t.type = 0, e._uploadDataToTextureDirectly(t, E, k, Q);\n } else\n m = Math.max(4, p) / 4 * Math.max(4, g) / 4 * x, E = new Uint8Array(i.buffer, i.byteOffset + v, m), t.type = 0, e._uploadCompressedDataToTextureDirectly(t, R, p, g, E, k, Q);\n }\n v += S ? p * g * (S / 8) : m, p *= 0.5, g *= 0.5, p = Math.max(1, p), g = Math.max(1, g);\n }\n if (l !== void 0)\n break;\n }\n h && h.length > 0 ? r.sphericalPolynomial = za.ConvertCubeMapToSphericalPolynomial({\n size: f[Yh],\n right: h[0],\n left: h[1],\n up: h[2],\n down: h[3],\n front: h[4],\n back: h[5],\n format: 5,\n type: 1,\n gammaSpace: !1\n }) : r.sphericalPolynomial = void 0;\n }\n}\nLt.StoreLODInAlphaChannel = !1;\nDe.prototype.createPrefilteredCubeTexture = function(n, e, t, i, r = null, s = null, a, o = null, l = !0) {\n const c = (h) => {\n if (!h) {\n r && r(null);\n return;\n }\n const u = h.texture;\n if (l ? h.info.sphericalPolynomial && (u._sphericalPolynomial = h.info.sphericalPolynomial) : u._sphericalPolynomial = new Co(), u._source = Dt.CubePrefiltered, this.getCaps().textureLOD) {\n r && r(u);\n return;\n }\n const f = 3, d = this._gl, p = h.width;\n if (!p)\n return;\n const g = [];\n for (let m = 0; m < f; m++) {\n const E = 1 - m / (f - 1), C = i, T = je.Log2(p) * t + i, R = C + (T - C) * E, x = Math.round(Math.min(Math.max(R, 0), T)), S = new or(this, Dt.Temp);\n if (S.type = u.type, S.format = u.format, S.width = Math.pow(2, Math.max(je.Log2(p) - x, 0)), S.height = S.width, S.isCube = !0, S._cachedWrapU = 0, S._cachedWrapV = 0, this._bindTextureDirectly(d.TEXTURE_CUBE_MAP, S, !0), S.samplingMode = 2, d.texParameteri(d.TEXTURE_CUBE_MAP, d.TEXTURE_MAG_FILTER, d.LINEAR), d.texParameteri(d.TEXTURE_CUBE_MAP, d.TEXTURE_MIN_FILTER, d.LINEAR), d.texParameteri(d.TEXTURE_CUBE_MAP, d.TEXTURE_WRAP_S, d.CLAMP_TO_EDGE), d.texParameteri(d.TEXTURE_CUBE_MAP, d.TEXTURE_WRAP_T, d.CLAMP_TO_EDGE), h.isDDS) {\n const N = h.info, F = h.data;\n this._unpackFlipY(N.isCompressed), Lt.UploadDDSLevels(this, S, F, N, !0, 6, x);\n } else\n ne.Warn(\"DDS is the only prefiltered cube map supported so far.\");\n this._bindTextureDirectly(d.TEXTURE_CUBE_MAP, null);\n const M = new It(e);\n M._isCube = !0, M._texture = S, S.isReady = !0, g.push(M);\n }\n u._lodTextureHigh = g[2], u._lodTextureMid = g[1], u._lodTextureLow = g[0], r && r(u);\n };\n return this.createCubeTexture(n, e, null, !1, c, s, a, o, l, t, i);\n};\nconst dN = \"rgbdEncodePixelShader\", pN = `varying vec2 vUV;uniform sampler2D textureSampler;\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) \n{gl_FragColor=toRGBD(texture2D(textureSampler,vUV).rgb);}`;\nY.ShadersStore[dN] = pN;\nhe.prototype.notifyObserversWithPromise = async function(n, e = -1, t, i, r) {\n let s = Promise.resolve(n);\n if (!this.observers.length)\n return s;\n const a = this._eventState;\n return a.mask = e, a.target = t, a.currentTarget = i, a.skipNextObservers = !1, a.userInfo = r, this.observers.forEach((o) => {\n a.skipNextObservers || o._willBeUnregistered || o.mask & e && (o.scope ? s = s.then((l) => (a.lastReturnValue = l, o.callback.apply(o.scope, [n, a]))) : s = s.then((l) => (a.lastReturnValue = l, o.callback(n, a))), o.unregisterOnNextCall && this._deferUnregister(o));\n }), await s, n;\n};\nvar Hg;\n(function(n) {\n n[n.X = 0] = \"X\", n[n.Y = 1] = \"Y\", n[n.Z = 2] = \"Z\";\n})(Hg || (Hg = {}));\nconst gN = \"fxaaPixelShader\", mN = `#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\n#define TEXTUREFUNC(s,c,l) texture2DLodEXT(s,c,l)\n#else\n#define TEXTUREFUNC(s,c,b) texture2D(s,c,b)\n#endif\nuniform sampler2D textureSampler;uniform vec2 texelSize;varying vec2 vUV;varying vec2 sampleCoordS;varying vec2 sampleCoordE;varying vec2 sampleCoordN;varying vec2 sampleCoordW;varying vec2 sampleCoordNW;varying vec2 sampleCoordSE;varying vec2 sampleCoordNE;varying vec2 sampleCoordSW;const float fxaaQualitySubpix=1.0;const float fxaaQualityEdgeThreshold=0.166;const float fxaaQualityEdgeThresholdMin=0.0833;const vec3 kLumaCoefficients=vec3(0.2126,0.7152,0.0722);\n#define FxaaLuma(rgba) dot(rgba.rgb,kLumaCoefficients)\nvoid main(){vec2 posM;posM.x=vUV.x;posM.y=vUV.y;vec4 rgbyM=TEXTUREFUNC(textureSampler,vUV,0.0);float lumaM=FxaaLuma(rgbyM);float lumaS=FxaaLuma(TEXTUREFUNC(textureSampler,sampleCoordS,0.0));float lumaE=FxaaLuma(TEXTUREFUNC(textureSampler,sampleCoordE,0.0));float lumaN=FxaaLuma(TEXTUREFUNC(textureSampler,sampleCoordN,0.0));float lumaW=FxaaLuma(TEXTUREFUNC(textureSampler,sampleCoordW,0.0));float maxSM=max(lumaS,lumaM);float minSM=min(lumaS,lumaM);float maxESM=max(lumaE,maxSM);float minESM=min(lumaE,minSM);float maxWN=max(lumaN,lumaW);float minWN=min(lumaN,lumaW);float rangeMax=max(maxWN,maxESM);float rangeMin=min(minWN,minESM);float rangeMaxScaled=rangeMax*fxaaQualityEdgeThreshold;float range=rangeMax-rangeMin;float rangeMaxClamped=max(fxaaQualityEdgeThresholdMin,rangeMaxScaled);\n#ifndef MALI\nif(range=edgeVert;float subpixA=subpixNSWE*2.0+subpixNWSWNESE;if (!horzSpan)\n{lumaN=lumaW;}\nif (!horzSpan) \n{lumaS=lumaE;}\nif (horzSpan) \n{lengthSign=texelSize.y;}\nfloat subpixB=(subpixA*(1.0/12.0))-lumaM;float gradientN=lumaN-lumaM;float gradientS=lumaS-lumaM;float lumaNN=lumaN+lumaM;float lumaSS=lumaS+lumaM;bool pairN=abs(gradientN)>=abs(gradientS);float gradient=max(abs(gradientN),abs(gradientS));if (pairN)\n{lengthSign=-lengthSign;}\nfloat subpixC=clamp(abs(subpixB)*subpixRcpRange,0.0,1.0);vec2 posB;posB.x=posM.x;posB.y=posM.y;vec2 offNP;offNP.x=(!horzSpan) ? 0.0 : texelSize.x;offNP.y=(horzSpan) ? 0.0 : texelSize.y;if (!horzSpan) \n{posB.x+=lengthSign*0.5;}\nif (horzSpan)\n{posB.y+=lengthSign*0.5;}\nvec2 posN;posN.x=posB.x-offNP.x*1.5;posN.y=posB.y-offNP.y*1.5;vec2 posP;posP.x=posB.x+offNP.x*1.5;posP.y=posB.y+offNP.y*1.5;float subpixD=((-2.0)*subpixC)+3.0;float lumaEndN=FxaaLuma(TEXTUREFUNC(textureSampler,posN,0.0));float subpixE=subpixC*subpixC;float lumaEndP=FxaaLuma(TEXTUREFUNC(textureSampler,posP,0.0));if (!pairN) \n{lumaNN=lumaSS;}\nfloat gradientScaled=gradient*1.0/4.0;float lumaMM=lumaM-lumaNN*0.5;float subpixF=subpixD*subpixE;bool lumaMLTZero=lumaMM<0.0;lumaEndN-=lumaNN*0.5;lumaEndP-=lumaNN*0.5;bool doneN=abs(lumaEndN)>=gradientScaled;bool doneP=abs(lumaEndP)>=gradientScaled;if (!doneN) \n{posN.x-=offNP.x*3.0;}\nif (!doneN) \n{posN.y-=offNP.y*3.0;}\nbool doneNP=(!doneN) || (!doneP);if (!doneP) \n{posP.x+=offNP.x*3.0;}\nif (!doneP)\n{posP.y+=offNP.y*3.0;}\nif (doneNP)\n{if (!doneN) lumaEndN=FxaaLuma(TEXTUREFUNC(textureSampler,posN.xy,0.0));if (!doneP) lumaEndP=FxaaLuma(TEXTUREFUNC(textureSampler,posP.xy,0.0));if (!doneN) lumaEndN=lumaEndN-lumaNN*0.5;if (!doneP) lumaEndP=lumaEndP-lumaNN*0.5;doneN=abs(lumaEndN)>=gradientScaled;doneP=abs(lumaEndP)>=gradientScaled;if (!doneN) posN.x-=offNP.x*12.0;if (!doneN) posN.y-=offNP.y*12.0;doneNP=(!doneN) || (!doneP);if (!doneP) posP.x+=offNP.x*12.0;if (!doneP) posP.y+=offNP.y*12.0;}\nfloat dstN=posM.x-posN.x;float dstP=posP.x-posM.x;if (!horzSpan)\n{dstN=posM.y-posN.y;}\nif (!horzSpan) \n{dstP=posP.y-posM.y;}\nbool goodSpanN=(lumaEndN<0.0) != lumaMLTZero;float spanLength=(dstP+dstN);bool goodSpanP=(lumaEndP<0.0) != lumaMLTZero;float spanLengthRcp=1.0/spanLength;bool directionN=dstN {\n const h = this.texelSize;\n c.setFloat2(\"texelSize\", h.x, h.y);\n });\n }\n _getDefines() {\n const e = this.getEngine();\n if (!e)\n return null;\n const t = e.getGlInfo();\n return t && t.renderer && t.renderer.toLowerCase().indexOf(\"mali\") > -1 ? `#define MALI 1\n` : null;\n }\n /**\n * @internal\n */\n static _Parse(e, t, i, r) {\n return Le.Parse(() => new Kc(e.name, e.options, t, e.renderTargetSamplingMode, i.getEngine(), e.reusable), e, i, r);\n }\n}\nRe(\"BABYLON.FxaaPostProcess\", Kc);\nlet Ys = null;\nfunction uE(n, e, t, i, r = \"image/png\", s = !1, a) {\n const { height: o, width: l } = fE(n, e, t);\n if (!(o && l)) {\n ne.Error(\"Invalid 'size' parameter !\");\n return;\n }\n Ys || (Ys = document.createElement(\"canvas\")), Ys.width = l, Ys.height = o;\n const c = Ys.getContext(\"2d\"), h = n.getRenderWidth() / n.getRenderHeight();\n let u = l, f = u / h;\n f > o && (f = o, u = f * h);\n const d = Math.max(0, l - u) / 2, p = Math.max(0, o - f) / 2;\n e.getScene().activeCamera !== e ? Uf(n, e, t, (m) => {\n if (s) {\n const v = new Blob([m]);\n ge.DownloadBlob(v), i && i(\"\");\n } else\n i && i(m);\n }, r, 1, n.getCreationOptions().antialias, void 0, void 0, void 0, void 0, a) : n.onEndFrameObservable.addOnce(() => {\n const m = n.getRenderingCanvas();\n c && m && c.drawImage(m, d, p, u, f), Ys && (s ? (ge.EncodeScreenshotCanvasData(Ys, void 0, r, void 0, a), i && i(\"\")) : ge.EncodeScreenshotCanvasData(Ys, i, r, void 0, a));\n });\n}\nfunction vN(n, e, t, i = \"image/png\", r) {\n return new Promise((s, a) => {\n uE(n, e, t, (o) => {\n typeof o < \"u\" ? s(o) : a(new Error(\"Data is undefined\"));\n }, i, void 0, r);\n });\n}\nfunction Uf(n, e, t, i, r = \"image/png\", s = 1, a = !1, o, l = !1, c = !1, h = !0, u, f) {\n const { height: d, width: p, finalWidth: g, finalHeight: m } = fE(n, e, t), v = { width: p, height: d };\n if (!(d && p)) {\n ne.Error(\"Invalid 'size' parameter !\");\n return;\n }\n const E = { width: n.getRenderWidth(), height: n.getRenderHeight() };\n n.setSize(p, d);\n const C = e.getScene(), T = new gr(\"screenShot\", v, C, !1, !1, 0, !1, le.BILINEAR_SAMPLINGMODE, void 0, c, void 0, void 0, void 0, s);\n T.renderList = C.meshes.slice(), T.samples = s, T.renderSprites = l, T.activeCamera = e, T.forceLayerMaskCheck = h, f == null || f(T);\n const R = () => {\n T.isReadyForRendering() && e.isReady(!0) ? (n.onEndFrameObservable.addOnce(() => {\n g === p && m === d ? T.readPixels(void 0, void 0, void 0, !1).then((S) => {\n Ni.DumpData(p, d, S, i, r, o, !0, void 0, u), T.dispose();\n }) : Sf(\"pass\", T.getInternalTexture(), C, void 0, void 0, void 0, g, m).then((S) => {\n n._readTexturePixels(S, g, m, -1, 0, null, !0, !1, 0, 0).then((M) => {\n Ni.DumpData(g, m, M, i, r, o, !0, void 0, u), S.dispose();\n });\n });\n }), T.render(!0), C.incrementRenderId(), C.resetCachedMaterial(), n.setSize(E.width, E.height), e.getProjectionMatrix(!0), C.render()) : setTimeout(R, 16);\n }, x = () => {\n C.incrementRenderId(), C.resetCachedMaterial(), R();\n };\n if (a) {\n const S = new Kc(\"antialiasing\", 1, C.activeCamera);\n T.addPostProcess(S), S.getEffect().isReady() ? x() : S.getEffect().onCompiled = () => {\n x();\n };\n } else\n x();\n}\nfunction TN(n, e, t, i = \"image/png\", r = 1, s = !1, a, o = !1, l = !1, c = !0, h) {\n return new Promise((u, f) => {\n Uf(n, e, t, (d) => {\n typeof d < \"u\" ? u(d) : f(new Error(\"Data is undefined\"));\n }, i, r, s, a, o, l, c, h);\n });\n}\nfunction fE(n, e, t) {\n let i = 0, r = 0, s = 0, a = 0;\n if (typeof t == \"object\") {\n const o = t.precision ? Math.abs(t.precision) : 1;\n t.width && t.height ? (i = t.height * o, r = t.width * o) : t.width && !t.height ? (r = t.width * o, i = Math.round(r / n.getAspectRatio(e))) : t.height && !t.width ? (i = t.height * o, r = Math.round(i * n.getAspectRatio(e))) : (r = Math.round(n.getRenderWidth() * o), i = Math.round(r / n.getAspectRatio(e))), t.finalWidth && t.finalHeight ? (a = t.finalHeight, s = t.finalWidth) : t.finalWidth && !t.finalHeight ? (s = t.finalWidth, a = Math.round(s / n.getAspectRatio(e))) : t.finalHeight && !t.finalWidth ? (a = t.finalHeight, s = Math.round(a * n.getAspectRatio(e))) : (s = r, a = i);\n } else\n isNaN(t) || (i = t, r = t, s = t, a = t);\n return r && (r = Math.floor(r)), i && (i = Math.floor(i)), s && (s = Math.floor(s)), a && (a = Math.floor(a)), { height: i | 0, width: r | 0, finalWidth: s | 0, finalHeight: a | 0 };\n}\nconst xN = () => {\n ge.CreateScreenshot = uE, ge.CreateScreenshotAsync = vN, ge.CreateScreenshotUsingRenderTarget = Uf, ge.CreateScreenshotUsingRenderTargetAsync = TN;\n};\nxN();\nvar Kg;\n(function(n) {\n n[n.Checkbox = 0] = \"Checkbox\", n[n.Slider = 1] = \"Slider\", n[n.Vector3 = 2] = \"Vector3\", n[n.Quaternion = 3] = \"Quaternion\", n[n.Color3 = 4] = \"Color3\", n[n.String = 5] = \"String\", n[n.Button = 6] = \"Button\", n[n.Options = 7] = \"Options\", n[n.Tab = 8] = \"Tab\", n[n.FileButton = 9] = \"FileButton\", n[n.Vector2 = 10] = \"Vector2\";\n})(Kg || (Kg = {}));\nconst CN = \"minmaxReduxPixelShader\", RN = `varying vec2 vUV;uniform sampler2D textureSampler;\n#if defined(INITIAL)\nuniform sampler2D sourceTexture;uniform vec2 texSize;void main(void)\n{ivec2 coord=ivec2(vUV*(texSize-1.0));float f1=texelFetch(sourceTexture,coord,0).r;float f2=texelFetch(sourceTexture,coord+ivec2(1,0),0).r;float f3=texelFetch(sourceTexture,coord+ivec2(1,1),0).r;float f4=texelFetch(sourceTexture,coord+ivec2(0,1),0).r;float minz=min(min(min(f1,f2),f3),f4);\n#ifdef DEPTH_REDUX\nfloat maxz=max(max(max(sign(1.0-f1)*f1,sign(1.0-f2)*f2),sign(1.0-f3)*f3),sign(1.0-f4)*f4);\n#else\nfloat maxz=max(max(max(f1,f2),f3),f4);\n#endif\nglFragColor=vec4(minz,maxz,0.,0.);}\n#elif defined(MAIN)\nuniform vec2 texSize;void main(void)\n{ivec2 coord=ivec2(vUV*(texSize-1.0));vec2 f1=texelFetch(textureSampler,coord,0).rg;vec2 f2=texelFetch(textureSampler,coord+ivec2(1,0),0).rg;vec2 f3=texelFetch(textureSampler,coord+ivec2(1,1),0).rg;vec2 f4=texelFetch(textureSampler,coord+ivec2(0,1),0).rg;float minz=min(min(min(f1.x,f2.x),f3.x),f4.x);float maxz=max(max(max(f1.y,f2.y),f3.y),f4.y);glFragColor=vec4(minz,maxz,0.,0.);}\n#elif defined(ONEBEFORELAST)\nuniform ivec2 texSize;void main(void)\n{ivec2 coord=ivec2(vUV*vec2(texSize-1));vec2 f1=texelFetch(textureSampler,coord % texSize,0).rg;vec2 f2=texelFetch(textureSampler,(coord+ivec2(1,0)) % texSize,0).rg;vec2 f3=texelFetch(textureSampler,(coord+ivec2(1,1)) % texSize,0).rg;vec2 f4=texelFetch(textureSampler,(coord+ivec2(0,1)) % texSize,0).rg;float minz=min(f1.x,f2.x);float maxz=max(f1.y,f2.y);glFragColor=vec4(minz,maxz,0.,0.);}\n#elif defined(LAST)\nvoid main(void)\n{glFragColor=vec4(0.);if (true) { \ndiscard;}}\n#endif\n`;\nY.ShadersStore[CN] = RN;\nconst SN = \"packingFunctions\", yN = `vec4 pack(float depth)\n{const vec4 bit_shift=vec4(255.0*255.0*255.0,255.0*255.0,255.0,1.0);const vec4 bit_mask=vec4(0.0,1.0/255.0,1.0/255.0,1.0/255.0);vec4 res=fract(depth*bit_shift);res-=res.xxyz*bit_mask;return res;}\nfloat unpack(vec4 color)\n{const vec4 bit_shift=vec4(1.0/(255.0*255.0*255.0),1.0/(255.0*255.0),1.0/255.0,1.0);return dot(color,bit_shift);}`;\nY.IncludesShadersStore[SN] = yN;\nconst IN = \"depthPixelShader\", bN = `#ifdef ALPHATEST\nvarying vec2 vUV;uniform sampler2D diffuseSampler;\n#endif\n#include\nvarying float vDepthMetric;\n#ifdef PACKED\n#include\n#endif\n#ifdef STORE_CAMERASPACE_Z\nvarying vec4 vViewPos;\n#endif\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void)\n{\n#include\n#ifdef ALPHATEST\nif (texture2D(diffuseSampler,vUV).a<0.4)\ndiscard;\n#endif\n#ifdef STORE_CAMERASPACE_Z\n#ifdef PACKED\ngl_FragColor=pack(vViewPos.z);\n#else\ngl_FragColor=vec4(vViewPos.z,0.0,0.0,1.0);\n#endif\n#else\n#ifdef NONLINEARDEPTH\n#ifdef PACKED\ngl_FragColor=pack(gl_FragCoord.z);\n#else\ngl_FragColor=vec4(gl_FragCoord.z,0.0,0.0,0.0);\n#endif\n#else\n#ifdef PACKED\ngl_FragColor=pack(vDepthMetric);\n#else\ngl_FragColor=vec4(vDepthMetric,0.0,0.0,1.0);\n#endif\n#endif\n#endif\n}`;\nY.ShadersStore[IN] = bN;\nconst AN = \"pointCloudVertexDeclaration\", MN = `#ifdef POINTSIZE\nuniform float pointSize;\n#endif\n`;\nY.IncludesShadersStore[AN] = MN;\nconst PN = \"depthVertexShader\", ON = `attribute vec3 position;\n#include\n#include\n#include\n#include[0..maxSimultaneousMorphTargets]\n#include\n#include\nuniform mat4 viewProjection;uniform vec2 depthValues;\n#if defined(ALPHATEST) || defined(NEED_UV)\nvarying vec2 vUV;uniform mat4 diffuseMatrix;\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#ifdef UV2\nattribute vec2 uv2;\n#endif\n#endif\n#ifdef STORE_CAMERASPACE_Z\nuniform mat4 view;varying vec4 vViewPos;\n#endif\n#include\nvarying float vDepthMetric;\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void)\n{vec3 positionUpdated=position;\n#ifdef UV1\nvec2 uvUpdated=uv;\n#endif\n#include\n#include[0..maxSimultaneousMorphTargets]\n#include\n#include\n#include\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\n#include\ngl_Position=viewProjection*worldPos;\n#ifdef STORE_CAMERASPACE_Z\nvViewPos=view*worldPos;\n#else\n#ifdef USE_REVERSE_DEPTHBUFFER\nvDepthMetric=((-gl_Position.z+depthValues.x)/(depthValues.y));\n#else\nvDepthMetric=((gl_Position.z+depthValues.x)/(depthValues.y));\n#endif\n#endif\n#if defined(ALPHATEST) || defined(BASIC_RENDER)\n#ifdef UV1\nvUV=vec2(diffuseMatrix*vec4(uvUpdated,1.0,0.0));\n#endif\n#ifdef UV2\nvUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0));\n#endif\n#endif\n#include\n}\n`;\nY.ShadersStore[PN] = ON;\nclass qg {\n static _GetStorage() {\n try {\n return localStorage.setItem(\"test\", \"\"), localStorage.removeItem(\"test\"), localStorage;\n } catch {\n const e = {};\n return {\n getItem: (t) => {\n const i = e[t];\n return i === void 0 ? null : i;\n },\n setItem: (t, i) => {\n e[t] = i;\n }\n };\n }\n }\n /**\n * Reads a string from the data storage\n * @param key The key to read\n * @param defaultValue The value if the key doesn't exist\n * @returns The string value\n */\n static ReadString(e, t) {\n const i = this._Storage.getItem(e);\n return i !== null ? i : t;\n }\n /**\n * Writes a string to the data storage\n * @param key The key to write\n * @param value The value to write\n */\n static WriteString(e, t) {\n this._Storage.setItem(e, t);\n }\n /**\n * Reads a boolean from the data storage\n * @param key The key to read\n * @param defaultValue The value if the key doesn't exist\n * @returns The boolean value\n */\n static ReadBoolean(e, t) {\n const i = this._Storage.getItem(e);\n return i !== null ? i === \"true\" : t;\n }\n /**\n * Writes a boolean to the data storage\n * @param key The key to write\n * @param value The value to write\n */\n static WriteBoolean(e, t) {\n this._Storage.setItem(e, t ? \"true\" : \"false\");\n }\n /**\n * Reads a number from the data storage\n * @param key The key to read\n * @param defaultValue The value if the key doesn't exist\n * @returns The number value\n */\n static ReadNumber(e, t) {\n const i = this._Storage.getItem(e);\n return i !== null ? parseFloat(i) : t;\n }\n /**\n * Writes a number to the data storage\n * @param key The key to write\n * @param value The value to write\n */\n static WriteNumber(e, t) {\n this._Storage.setItem(e, t.toString());\n }\n}\nqg._Storage = qg._GetStorage();\nclass tt extends Ai {\n /**\n * Defines how far from the source the light is impacting in scene units.\n * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff.\n */\n get range() {\n return this._range;\n }\n /**\n * Defines how far from the source the light is impacting in scene units.\n * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff.\n */\n set range(e) {\n this._range = e, this._inverseSquaredRange = 1 / (this.range * this.range);\n }\n /**\n * Gets the photometric scale used to interpret the intensity.\n * This is only relevant with PBR Materials where the light intensity can be defined in a physical way.\n */\n get intensityMode() {\n return this._intensityMode;\n }\n /**\n * Sets the photometric scale used to interpret the intensity.\n * This is only relevant with PBR Materials where the light intensity can be defined in a physical way.\n */\n set intensityMode(e) {\n this._intensityMode = e, this._computePhotometricScale();\n }\n /**\n * Gets the light radius used by PBR Materials to simulate soft area lights.\n */\n get radius() {\n return this._radius;\n }\n /**\n * sets the light radius used by PBR Materials to simulate soft area lights.\n */\n set radius(e) {\n this._radius = e, this._computePhotometricScale();\n }\n /**\n * Gets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching\n * the current shadow generator.\n */\n get shadowEnabled() {\n return this._shadowEnabled;\n }\n /**\n * Sets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching\n * the current shadow generator.\n */\n set shadowEnabled(e) {\n this._shadowEnabled !== e && (this._shadowEnabled = e, this._markMeshesAsLightDirty());\n }\n /**\n * Gets the only meshes impacted by this light.\n */\n get includedOnlyMeshes() {\n return this._includedOnlyMeshes;\n }\n /**\n * Sets the only meshes impacted by this light.\n */\n set includedOnlyMeshes(e) {\n this._includedOnlyMeshes = e, this._hookArrayForIncludedOnly(e);\n }\n /**\n * Gets the meshes not impacted by this light.\n */\n get excludedMeshes() {\n return this._excludedMeshes;\n }\n /**\n * Sets the meshes not impacted by this light.\n */\n set excludedMeshes(e) {\n this._excludedMeshes = e, this._hookArrayForExcluded(e);\n }\n /**\n * Gets the layer id use to find what meshes are not impacted by the light.\n * Inactive if 0\n */\n get excludeWithLayerMask() {\n return this._excludeWithLayerMask;\n }\n /**\n * Sets the layer id use to find what meshes are not impacted by the light.\n * Inactive if 0\n */\n set excludeWithLayerMask(e) {\n this._excludeWithLayerMask = e, this._resyncMeshes();\n }\n /**\n * Gets the layer id use to find what meshes are impacted by the light.\n * Inactive if 0\n */\n get includeOnlyWithLayerMask() {\n return this._includeOnlyWithLayerMask;\n }\n /**\n * Sets the layer id use to find what meshes are impacted by the light.\n * Inactive if 0\n */\n set includeOnlyWithLayerMask(e) {\n this._includeOnlyWithLayerMask = e, this._resyncMeshes();\n }\n /**\n * Gets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x)\n */\n get lightmapMode() {\n return this._lightmapMode;\n }\n /**\n * Sets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x)\n */\n set lightmapMode(e) {\n this._lightmapMode !== e && (this._lightmapMode = e, this._markMeshesAsLightDirty());\n }\n /**\n * Returns the view matrix.\n * @param _faceIndex The index of the face for which we want to extract the view matrix. Only used for point light types.\n * @returns The view matrix. Can be null, if a view matrix cannot be defined for the type of light considered (as for a hemispherical light, for example).\n */\n getViewMatrix(e) {\n return null;\n }\n /**\n * Returns the projection matrix.\n * Note that viewMatrix and renderList are optional and are only used by lights that calculate the projection matrix from a list of meshes (e.g. directional lights with automatic extents calculation).\n * @param _viewMatrix The view transform matrix of the light (optional).\n * @param _renderList The list of meshes to take into account when calculating the projection matrix (optional).\n * @returns The projection matrix. Can be null, if a projection matrix cannot be defined for the type of light considered (as for a hemispherical light, for example).\n */\n getProjectionMatrix(e, t) {\n return null;\n }\n /**\n * Creates a Light object in the scene.\n * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction\n * @param name The friendly name of the light\n * @param scene The scene the light belongs too\n */\n constructor(e, t) {\n super(e, t), this.diffuse = new Ne(1, 1, 1), this.specular = new Ne(1, 1, 1), this.falloffType = tt.FALLOFF_DEFAULT, this.intensity = 1, this._range = Number.MAX_VALUE, this._inverseSquaredRange = 0, this._photometricScale = 1, this._intensityMode = tt.INTENSITYMODE_AUTOMATIC, this._radius = 1e-5, this.renderPriority = 0, this._shadowEnabled = !0, this._excludeWithLayerMask = 0, this._includeOnlyWithLayerMask = 0, this._lightmapMode = 0, this._shadowGenerators = null, this._excludedMeshesIds = new Array(), this._includedOnlyMeshesIds = new Array(), this._isLight = !0, this.getScene().addLight(this), this._uniformBuffer = new Ie(this.getScene().getEngine(), void 0, void 0, e), this._buildUniformLayout(), this.includedOnlyMeshes = [], this.excludedMeshes = [], this._resyncMeshes();\n }\n /**\n * Sets the passed Effect \"effect\" with the Light textures.\n * @param effect The effect to update\n * @param lightIndex The index of the light in the effect to update\n * @returns The light\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n transferTexturesToEffect(e, t) {\n return this;\n }\n /**\n * Binds the lights information from the scene to the effect for the given mesh.\n * @param lightIndex Light index\n * @param scene The scene where the light belongs to\n * @param effect The effect we are binding the data to\n * @param useSpecular Defines if specular is supported\n * @param receiveShadows Defines if the effect (mesh) we bind the light for receives shadows\n */\n _bindLight(e, t, i, r, s = !0) {\n const a = e.toString();\n let o = !1;\n if (this._uniformBuffer.bindToEffect(i, \"Light\" + a), this._renderId !== t.getRenderId() || this._lastUseSpecular !== r || !this._uniformBuffer.useUbo) {\n this._renderId = t.getRenderId(), this._lastUseSpecular = r;\n const l = this.getScaledIntensity();\n this.transferToEffect(i, a), this.diffuse.scaleToRef(l, jr.Color3[0]), this._uniformBuffer.updateColor4(\"vLightDiffuse\", jr.Color3[0], this.range, a), r && (this.specular.scaleToRef(l, jr.Color3[1]), this._uniformBuffer.updateColor4(\"vLightSpecular\", jr.Color3[1], this.radius, a)), o = !0;\n }\n if (this.transferTexturesToEffect(i, a), t.shadowsEnabled && this.shadowEnabled && s) {\n const l = this.getShadowGenerator(t.activeCamera) ?? this.getShadowGenerator();\n l && (l.bindShadowLight(a, i), o = !0);\n }\n o ? this._uniformBuffer.update() : this._uniformBuffer.bindUniformBuffer();\n }\n /**\n * Returns the string \"Light\".\n * @returns the class name\n */\n getClassName() {\n return \"Light\";\n }\n /**\n * Converts the light information to a readable string for debug purpose.\n * @param fullDetails Supports for multiple levels of logging within scene loading\n * @returns the human readable light info\n */\n toString(e) {\n let t = \"Name: \" + this.name;\n if (t += \", type: \" + [\"Point\", \"Directional\", \"Spot\", \"Hemispheric\"][this.getTypeID()], this.animations)\n for (let i = 0; i < this.animations.length; i++)\n t += \", animation[0]: \" + this.animations[i].toString(e);\n return t;\n }\n /** @internal */\n _syncParentEnabledState() {\n super._syncParentEnabledState(), this.isDisposed() || this._resyncMeshes();\n }\n /**\n * Set the enabled state of this node.\n * @param value - the new enabled state\n */\n setEnabled(e) {\n super.setEnabled(e), this._resyncMeshes();\n }\n /**\n * Returns the Light associated shadow generator if any.\n * @param camera Camera for which the shadow generator should be retrieved (default: null). If null, retrieves the default shadow generator\n * @returns the associated shadow generator.\n */\n getShadowGenerator(e = null) {\n return this._shadowGenerators === null ? null : this._shadowGenerators.get(e) ?? null;\n }\n /**\n * Returns all the shadow generators associated to this light\n * @returns\n */\n getShadowGenerators() {\n return this._shadowGenerators;\n }\n /**\n * Returns a Vector3, the absolute light position in the World.\n * @returns the world space position of the light\n */\n getAbsolutePosition() {\n return _.Zero();\n }\n /**\n * Specifies if the light will affect the passed mesh.\n * @param mesh The mesh to test against the light\n * @returns true the mesh is affected otherwise, false.\n */\n canAffectMesh(e) {\n return e ? !(this.includedOnlyMeshes && this.includedOnlyMeshes.length > 0 && this.includedOnlyMeshes.indexOf(e) === -1 || this.excludedMeshes && this.excludedMeshes.length > 0 && this.excludedMeshes.indexOf(e) !== -1 || this.includeOnlyWithLayerMask !== 0 && !(this.includeOnlyWithLayerMask & e.layerMask) || this.excludeWithLayerMask !== 0 && this.excludeWithLayerMask & e.layerMask) : !0;\n }\n /**\n * Releases resources associated with this node.\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\n */\n dispose(e, t = !1) {\n if (this._shadowGenerators) {\n const i = this._shadowGenerators.values();\n for (let r = i.next(); r.done !== !0; r = i.next())\n r.value.dispose();\n this._shadowGenerators = null;\n }\n if (this.getScene().stopAnimation(this), this._parentContainer) {\n const i = this._parentContainer.lights.indexOf(this);\n i > -1 && this._parentContainer.lights.splice(i, 1), this._parentContainer = null;\n }\n for (const i of this.getScene().meshes)\n i._removeLightSource(this, !0);\n this._uniformBuffer.dispose(), this.getScene().removeLight(this), super.dispose(e, t);\n }\n /**\n * Returns the light type ID (integer).\n * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x\n */\n getTypeID() {\n return 0;\n }\n /**\n * Returns the intensity scaled by the Photometric Scale according to the light type and intensity mode.\n * @returns the scaled intensity in intensity mode unit\n */\n getScaledIntensity() {\n return this._photometricScale * this.intensity;\n }\n /**\n * Returns a new Light object, named \"name\", from the current one.\n * @param name The name of the cloned light\n * @param newParent The parent of this light, if it has one\n * @returns the new created light\n */\n clone(e, t = null) {\n const i = tt.GetConstructorFromName(this.getTypeID(), e, this.getScene());\n if (!i)\n return null;\n const r = Le.Clone(i, this);\n return e && (r.name = e), t && (r.parent = t), r.setEnabled(this.isEnabled()), this.onClonedObservable.notifyObservers(r), r;\n }\n /**\n * Serializes the current light into a Serialization object.\n * @returns the serialized object.\n */\n serialize() {\n const e = Le.Serialize(this);\n return e.uniqueId = this.uniqueId, e.type = this.getTypeID(), this.parent && this.parent._serializeAsParent(e), this.excludedMeshes.length > 0 && (e.excludedMeshesIds = [], this.excludedMeshes.forEach((t) => {\n e.excludedMeshesIds.push(t.id);\n })), this.includedOnlyMeshes.length > 0 && (e.includedOnlyMeshesIds = [], this.includedOnlyMeshes.forEach((t) => {\n e.includedOnlyMeshesIds.push(t.id);\n })), Le.AppendSerializedAnimations(this, e), e.ranges = this.serializeAnimationRanges(), e.isEnabled = this.isEnabled(), e;\n }\n /**\n * Creates a new typed light from the passed type (integer) : point light = 0, directional light = 1, spot light = 2, hemispheric light = 3.\n * This new light is named \"name\" and added to the passed scene.\n * @param type Type according to the types available in Light.LIGHTTYPEID_x\n * @param name The friendly name of the light\n * @param scene The scene the new light will belong to\n * @returns the constructor function\n */\n static GetConstructorFromName(e, t, i) {\n const r = Ai.Construct(\"Light_Type_\" + e, t, i);\n return r || null;\n }\n /**\n * Parses the passed \"parsedLight\" and returns a new instanced Light from this parsing.\n * @param parsedLight The JSON representation of the light\n * @param scene The scene to create the parsed light in\n * @returns the created light after parsing\n */\n static Parse(e, t) {\n const i = tt.GetConstructorFromName(e.type, e.name, t);\n if (!i)\n return null;\n const r = Le.Parse(i, e, t);\n if (e.excludedMeshesIds && (r._excludedMeshesIds = e.excludedMeshesIds), e.includedOnlyMeshesIds && (r._includedOnlyMeshesIds = e.includedOnlyMeshesIds), e.parentId !== void 0 && (r._waitingParentId = e.parentId), e.parentInstanceIndex !== void 0 && (r._waitingParentInstanceIndex = e.parentInstanceIndex), e.falloffType !== void 0 && (r.falloffType = e.falloffType), e.lightmapMode !== void 0 && (r.lightmapMode = e.lightmapMode), e.animations) {\n for (let s = 0; s < e.animations.length; s++) {\n const a = e.animations[s], o = mr(\"BABYLON.Animation\");\n o && r.animations.push(o.Parse(a));\n }\n Ai.ParseAnimationRanges(r, e, t);\n }\n return e.autoAnimate && t.beginAnimation(r, e.autoAnimateFrom, e.autoAnimateTo, e.autoAnimateLoop, e.autoAnimateSpeed || 1), e.isEnabled !== void 0 && r.setEnabled(e.isEnabled), r;\n }\n _hookArrayForExcluded(e) {\n const t = e.push;\n e.push = (...r) => {\n const s = t.apply(e, r);\n for (const a of r)\n a._resyncLightSource(this);\n return s;\n };\n const i = e.splice;\n e.splice = (r, s) => {\n const a = i.apply(e, [r, s]);\n for (const o of a)\n o._resyncLightSource(this);\n return a;\n };\n for (const r of e)\n r._resyncLightSource(this);\n }\n _hookArrayForIncludedOnly(e) {\n const t = e.push;\n e.push = (...r) => {\n const s = t.apply(e, r);\n return this._resyncMeshes(), s;\n };\n const i = e.splice;\n e.splice = (r, s) => {\n const a = i.apply(e, [r, s]);\n return this._resyncMeshes(), a;\n }, this._resyncMeshes();\n }\n _resyncMeshes() {\n for (const e of this.getScene().meshes)\n e._resyncLightSource(this);\n }\n /**\n * Forces the meshes to update their light related information in their rendering used effects\n * @internal Internal Use Only\n */\n _markMeshesAsLightDirty() {\n for (const e of this.getScene().meshes)\n e.lightSources.indexOf(this) !== -1 && e._markSubMeshesAsLightDirty();\n }\n /**\n * Recomputes the cached photometric scale if needed.\n */\n _computePhotometricScale() {\n this._photometricScale = this._getPhotometricScale(), this.getScene().resetCachedMaterial();\n }\n /**\n * @returns the Photometric Scale according to the light type and intensity mode.\n */\n _getPhotometricScale() {\n let e = 0;\n const t = this.getTypeID();\n let i = this.intensityMode;\n switch (i === tt.INTENSITYMODE_AUTOMATIC && (t === tt.LIGHTTYPEID_DIRECTIONALLIGHT ? i = tt.INTENSITYMODE_ILLUMINANCE : i = tt.INTENSITYMODE_LUMINOUSINTENSITY), t) {\n case tt.LIGHTTYPEID_POINTLIGHT:\n case tt.LIGHTTYPEID_SPOTLIGHT:\n switch (i) {\n case tt.INTENSITYMODE_LUMINOUSPOWER:\n e = 1 / (4 * Math.PI);\n break;\n case tt.INTENSITYMODE_LUMINOUSINTENSITY:\n e = 1;\n break;\n case tt.INTENSITYMODE_LUMINANCE:\n e = this.radius * this.radius;\n break;\n }\n break;\n case tt.LIGHTTYPEID_DIRECTIONALLIGHT:\n switch (i) {\n case tt.INTENSITYMODE_ILLUMINANCE:\n e = 1;\n break;\n case tt.INTENSITYMODE_LUMINANCE: {\n let r = this.radius;\n r = Math.max(r, 1e-3), e = 2 * Math.PI * (1 - Math.cos(r));\n break;\n }\n }\n break;\n case tt.LIGHTTYPEID_HEMISPHERICLIGHT:\n e = 1;\n break;\n }\n return e;\n }\n /**\n * Reorder the light in the scene according to their defined priority.\n * @internal Internal Use Only\n */\n _reorderLightsInScene() {\n const e = this.getScene();\n this._renderPriority != 0 && (e.requireLightSorting = !0), this.getScene().sortLightsByPriority();\n }\n}\ntt.FALLOFF_DEFAULT = Et.FALLOFF_DEFAULT;\ntt.FALLOFF_PHYSICAL = Et.FALLOFF_PHYSICAL;\ntt.FALLOFF_GLTF = Et.FALLOFF_GLTF;\ntt.FALLOFF_STANDARD = Et.FALLOFF_STANDARD;\ntt.LIGHTMAP_DEFAULT = Et.LIGHTMAP_DEFAULT;\ntt.LIGHTMAP_SPECULAR = Et.LIGHTMAP_SPECULAR;\ntt.LIGHTMAP_SHADOWSONLY = Et.LIGHTMAP_SHADOWSONLY;\ntt.INTENSITYMODE_AUTOMATIC = Et.INTENSITYMODE_AUTOMATIC;\ntt.INTENSITYMODE_LUMINOUSPOWER = Et.INTENSITYMODE_LUMINOUSPOWER;\ntt.INTENSITYMODE_LUMINOUSINTENSITY = Et.INTENSITYMODE_LUMINOUSINTENSITY;\ntt.INTENSITYMODE_ILLUMINANCE = Et.INTENSITYMODE_ILLUMINANCE;\ntt.INTENSITYMODE_LUMINANCE = Et.INTENSITYMODE_LUMINANCE;\ntt.LIGHTTYPEID_POINTLIGHT = Et.LIGHTTYPEID_POINTLIGHT;\ntt.LIGHTTYPEID_DIRECTIONALLIGHT = Et.LIGHTTYPEID_DIRECTIONALLIGHT;\ntt.LIGHTTYPEID_SPOTLIGHT = Et.LIGHTTYPEID_SPOTLIGHT;\ntt.LIGHTTYPEID_HEMISPHERICLIGHT = Et.LIGHTTYPEID_HEMISPHERICLIGHT;\nP([\n $i()\n], tt.prototype, \"diffuse\", void 0);\nP([\n $i()\n], tt.prototype, \"specular\", void 0);\nP([\n w()\n], tt.prototype, \"falloffType\", void 0);\nP([\n w()\n], tt.prototype, \"intensity\", void 0);\nP([\n w()\n], tt.prototype, \"range\", null);\nP([\n w()\n], tt.prototype, \"intensityMode\", null);\nP([\n w()\n], tt.prototype, \"radius\", null);\nP([\n w()\n], tt.prototype, \"_renderPriority\", void 0);\nP([\n oe(\"_reorderLightsInScene\")\n], tt.prototype, \"renderPriority\", void 0);\nP([\n w(\"shadowEnabled\")\n], tt.prototype, \"_shadowEnabled\", void 0);\nP([\n w(\"excludeWithLayerMask\")\n], tt.prototype, \"_excludeWithLayerMask\", void 0);\nP([\n w(\"includeOnlyWithLayerMask\")\n], tt.prototype, \"_includeOnlyWithLayerMask\", void 0);\nP([\n w(\"lightmapMode\")\n], tt.prototype, \"_lightmapMode\", void 0);\nclass Wt extends Ai {\n /** @internal */\n get _matrix() {\n return this._compose(), this._localMatrix;\n }\n /** @internal */\n set _matrix(e) {\n e.updateFlag === this._localMatrix.updateFlag && !this._needToCompose || (this._needToCompose = !1, this._localMatrix.copyFrom(e), this._markAsDirtyAndDecompose());\n }\n /**\n * Create a new bone\n * @param name defines the bone name\n * @param skeleton defines the parent skeleton\n * @param parentBone defines the parent (can be null if the bone is the root)\n * @param localMatrix defines the local matrix (default: identity)\n * @param restMatrix defines the rest matrix (default: localMatrix)\n * @param bindMatrix defines the bind matrix (default: localMatrix)\n * @param index defines index of the bone in the hierarchy (default: null)\n */\n constructor(e, t, i = null, r = null, s = null, a = null, o = null) {\n super(e, t.getScene()), this.name = e, this.children = [], this.animations = [], this._index = null, this._scalingDeterminant = 1, this._needToDecompose = !0, this._needToCompose = !1, this._linkedTransformNode = null, this._waitingTransformNodeId = null, this._skeleton = t, this._localMatrix = (r == null ? void 0 : r.clone()) ?? L.Identity(), this._restMatrix = s ?? this._localMatrix.clone(), this._bindMatrix = a ?? this._localMatrix.clone(), this._index = o, this._absoluteMatrix = new L(), this._absoluteBindMatrix = new L(), this._absoluteInverseBindMatrix = new L(), this._finalMatrix = new L(), t.bones.push(this), this.setParent(i, !1), this._updateAbsoluteBindMatrices();\n }\n /**\n * Gets the current object class name.\n * @returns the class name\n */\n getClassName() {\n return \"Bone\";\n }\n // Members\n /**\n * Gets the parent skeleton\n * @returns a skeleton\n */\n getSkeleton() {\n return this._skeleton;\n }\n get parent() {\n return this._parentNode;\n }\n /**\n * Gets parent bone\n * @returns a bone or null if the bone is the root of the bone hierarchy\n */\n getParent() {\n return this.parent;\n }\n /**\n * Returns an array containing the children of the bone\n * @returns an array containing the children of the bone (can be empty if the bone has no children)\n */\n getChildren() {\n return this.children;\n }\n /**\n * Gets the node index in matrix array generated for rendering\n * @returns the node index\n */\n getIndex() {\n return this._index === null ? this.getSkeleton().bones.indexOf(this) : this._index;\n }\n set parent(e) {\n this.setParent(e);\n }\n /**\n * Sets the parent bone\n * @param parent defines the parent (can be null if the bone is the root)\n * @param updateAbsoluteBindMatrices defines if the absolute bind and absolute inverse bind matrices must be updated\n */\n setParent(e, t = !0) {\n if (this.parent !== e) {\n if (this.parent) {\n const i = this.parent.children.indexOf(this);\n i !== -1 && this.parent.children.splice(i, 1);\n }\n this._parentNode = e, this.parent && this.parent.children.push(this), t && this._updateAbsoluteBindMatrices(), this.markAsDirty();\n }\n }\n /**\n * Gets the local matrix\n * @returns the local matrix\n */\n getLocalMatrix() {\n return this._compose(), this._localMatrix;\n }\n /**\n * Gets the bind matrix\n * @returns the bind matrix\n */\n getBindMatrix() {\n return this._bindMatrix;\n }\n /**\n * Gets the bind matrix.\n * @returns the bind matrix\n * @deprecated Please use getBindMatrix instead\n */\n getBaseMatrix() {\n return this.getBindMatrix();\n }\n /**\n * Gets the rest matrix\n * @returns the rest matrix\n */\n getRestMatrix() {\n return this._restMatrix;\n }\n /**\n * Gets the rest matrix\n * @returns the rest matrix\n * @deprecated Please use getRestMatrix instead\n */\n getRestPose() {\n return this.getRestMatrix();\n }\n /**\n * Sets the rest matrix\n * @param matrix the local-space rest matrix to set for this bone\n */\n setRestMatrix(e) {\n this._restMatrix.copyFrom(e);\n }\n /**\n * Sets the rest matrix\n * @param matrix the local-space rest to set for this bone\n * @deprecated Please use setRestMatrix instead\n */\n setRestPose(e) {\n this.setRestMatrix(e);\n }\n /**\n * Gets the bind matrix\n * @returns the bind matrix\n * @deprecated Please use getBindMatrix instead\n */\n getBindPose() {\n return this.getBindMatrix();\n }\n /**\n * Sets the bind matrix\n * This will trigger a recomputation of the absolute bind and absolute inverse bind matrices for this bone and its children\n * Note that the local matrix will also be set with the matrix passed in parameter!\n * @param matrix the local-space bind matrix to set for this bone\n */\n setBindMatrix(e) {\n this.updateMatrix(e);\n }\n /**\n * Sets the bind matrix\n * @param matrix the local-space bind to set for this bone\n * @deprecated Please use setBindMatrix instead\n */\n setBindPose(e) {\n this.setBindMatrix(e);\n }\n /**\n * Gets the matrix used to store the final world transformation of the bone (ie. the matrix sent to shaders)\n * @returns the final world matrix\n */\n getFinalMatrix() {\n return this._finalMatrix;\n }\n /**\n * Gets the matrix used to store the final world transformation of the bone (ie. the matrix sent to shaders)\n * @deprecated Please use getFinalMatrix instead\n * @returns the final world matrix\n */\n getWorldMatrix() {\n return this.getFinalMatrix();\n }\n /**\n * Sets the local matrix to the rest matrix\n */\n returnToRest() {\n if (this._linkedTransformNode) {\n const e = z.Vector3[0], t = z.Quaternion[0], i = z.Vector3[1];\n this.getRestMatrix().decompose(e, t, i), this._linkedTransformNode.position.copyFrom(i), this._linkedTransformNode.rotationQuaternion = this._linkedTransformNode.rotationQuaternion ?? Ce.Identity(), this._linkedTransformNode.rotationQuaternion.copyFrom(t), this._linkedTransformNode.scaling.copyFrom(e);\n } else\n this._matrix = this._restMatrix;\n }\n /**\n * Gets the inverse of the bind matrix, in world space (relative to the skeleton root)\n * @returns the inverse bind matrix, in world space\n */\n getAbsoluteInverseBindMatrix() {\n return this._absoluteInverseBindMatrix;\n }\n /**\n * Gets the inverse of the bind matrix, in world space (relative to the skeleton root)\n * @returns the inverse bind matrix, in world space\n * @deprecated Please use getAbsoluteInverseBindMatrix instead\n */\n getInvertedAbsoluteTransform() {\n return this.getAbsoluteInverseBindMatrix();\n }\n /**\n * Gets the bone matrix, in world space (relative to the skeleton root)\n * @returns the bone matrix, in world space\n */\n getAbsoluteMatrix() {\n return this._absoluteMatrix;\n }\n /**\n * Gets the bone matrix, in world space (relative to the skeleton root)\n * @returns the bone matrix, in world space\n * @deprecated Please use getAbsoluteMatrix instead\n */\n getAbsoluteTransform() {\n return this._absoluteMatrix;\n }\n /**\n * Links with the given transform node.\n * The local matrix of this bone is overwritten by the transform of the node every frame.\n * @param transformNode defines the transform node to link to\n */\n linkTransformNode(e) {\n this._linkedTransformNode && this._skeleton._numBonesWithLinkedTransformNode--, this._linkedTransformNode = e, this._linkedTransformNode && this._skeleton._numBonesWithLinkedTransformNode++;\n }\n // Properties (matches TransformNode properties)\n /**\n * Gets the node used to drive the bone's transformation\n * @returns a transform node or null\n */\n getTransformNode() {\n return this._linkedTransformNode;\n }\n /** Gets or sets current position (in local space) */\n get position() {\n return this._decompose(), this._localPosition;\n }\n set position(e) {\n this._decompose(), this._localPosition.copyFrom(e), this._markAsDirtyAndCompose();\n }\n /** Gets or sets current rotation (in local space) */\n get rotation() {\n return this.getRotation();\n }\n set rotation(e) {\n this.setRotation(e);\n }\n /** Gets or sets current rotation quaternion (in local space) */\n get rotationQuaternion() {\n return this._decompose(), this._localRotation;\n }\n set rotationQuaternion(e) {\n this.setRotationQuaternion(e);\n }\n /** Gets or sets current scaling (in local space) */\n get scaling() {\n return this.getScale();\n }\n set scaling(e) {\n this.setScale(e);\n }\n /**\n * Gets the animation properties override\n */\n get animationPropertiesOverride() {\n return this._skeleton.animationPropertiesOverride;\n }\n // Methods\n _decompose() {\n this._needToDecompose && (this._needToDecompose = !1, this._localScaling || (this._localScaling = _.Zero(), this._localRotation = Ce.Zero(), this._localPosition = _.Zero()), this._localMatrix.decompose(this._localScaling, this._localRotation, this._localPosition));\n }\n _compose() {\n if (this._needToCompose) {\n if (!this._localScaling) {\n this._needToCompose = !1;\n return;\n }\n this._needToCompose = !1, L.ComposeToRef(this._localScaling, this._localRotation, this._localPosition, this._localMatrix);\n }\n }\n /**\n * Update the bind (and optionally the local) matrix\n * @param bindMatrix defines the new matrix to set to the bind/local matrix, in local space\n * @param updateAbsoluteBindMatrices defines if the absolute bind and absolute inverse bind matrices must be recomputed (default: true)\n * @param updateLocalMatrix defines if the local matrix should also be updated with the matrix passed in parameter (default: true)\n */\n updateMatrix(e, t = !0, i = !0) {\n this._bindMatrix.copyFrom(e), t && this._updateAbsoluteBindMatrices(), i ? this._matrix = e : this.markAsDirty();\n }\n /**\n * @internal\n */\n _updateAbsoluteBindMatrices(e, t = !0) {\n if (e || (e = this._bindMatrix), this.parent ? e.multiplyToRef(this.parent._absoluteBindMatrix, this._absoluteBindMatrix) : this._absoluteBindMatrix.copyFrom(e), this._absoluteBindMatrix.invertToRef(this._absoluteInverseBindMatrix), t)\n for (let i = 0; i < this.children.length; i++)\n this.children[i]._updateAbsoluteBindMatrices();\n this._scalingDeterminant = this._absoluteBindMatrix.determinant() < 0 ? -1 : 1;\n }\n /**\n * Flag the bone as dirty (Forcing it to update everything)\n * @returns this bone\n */\n markAsDirty() {\n return this._currentRenderId++, this._childUpdateId++, this._skeleton._markAsDirty(), this;\n }\n /** @internal */\n _markAsDirtyAndCompose() {\n this.markAsDirty(), this._needToCompose = !0;\n }\n _markAsDirtyAndDecompose() {\n this.markAsDirty(), this._needToDecompose = !0;\n }\n _updatePosition(e, t = ut.LOCAL, i, r = !0) {\n const s = this.getLocalMatrix();\n if (t == ut.LOCAL)\n r ? (s.addAtIndex(12, e.x), s.addAtIndex(13, e.y), s.addAtIndex(14, e.z)) : s.setTranslationFromFloats(e.x, e.y, e.z);\n else {\n let a = null;\n i && (a = i.getWorldMatrix()), this._skeleton.computeAbsoluteMatrices();\n const o = Wt._TmpMats[0], l = Wt._TmpVecs[0];\n this.parent ? i && a ? (o.copyFrom(this.parent.getAbsoluteMatrix()), o.multiplyToRef(a, o)) : o.copyFrom(this.parent.getAbsoluteMatrix()) : L.IdentityToRef(o), r && o.setTranslationFromFloats(0, 0, 0), o.invert(), _.TransformCoordinatesToRef(e, o, l), r ? (s.addAtIndex(12, l.x), s.addAtIndex(13, l.y), s.addAtIndex(14, l.z)) : s.setTranslationFromFloats(l.x, l.y, l.z);\n }\n this._markAsDirtyAndDecompose();\n }\n /**\n * Translate the bone in local or world space\n * @param vec The amount to translate the bone\n * @param space The space that the translation is in (default: Space.LOCAL)\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n translate(e, t = ut.LOCAL, i) {\n this._updatePosition(e, t, i, !0);\n }\n /**\n * Set the position of the bone in local or world space\n * @param position The position to set the bone\n * @param space The space that the position is in (default: Space.LOCAL)\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setPosition(e, t = ut.LOCAL, i) {\n this._updatePosition(e, t, i, !1);\n }\n /**\n * Set the absolute position of the bone (world space)\n * @param position The position to set the bone\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setAbsolutePosition(e, t) {\n this.setPosition(e, ut.WORLD, t);\n }\n /**\n * Scale the bone on the x, y and z axes (in local space)\n * @param x The amount to scale the bone on the x axis\n * @param y The amount to scale the bone on the y axis\n * @param z The amount to scale the bone on the z axis\n * @param scaleChildren sets this to true if children of the bone should be scaled as well (false by default)\n */\n scale(e, t, i, r = !1) {\n const s = this.getLocalMatrix(), a = Wt._TmpMats[0];\n L.ScalingToRef(e, t, i, a), a.multiplyToRef(s, s), a.invert();\n for (const o of this.children) {\n const l = o.getLocalMatrix();\n l.multiplyToRef(a, l), l.multiplyAtIndex(12, e), l.multiplyAtIndex(13, t), l.multiplyAtIndex(14, i), o._markAsDirtyAndDecompose();\n }\n if (this._markAsDirtyAndDecompose(), r)\n for (const o of this.children)\n o.scale(e, t, i, r);\n }\n /**\n * Set the bone scaling in local space\n * @param scale defines the scaling vector\n */\n setScale(e) {\n this._decompose(), this._localScaling.copyFrom(e), this._markAsDirtyAndCompose();\n }\n /**\n * Gets the current scaling in local space\n * @returns the current scaling vector\n */\n getScale() {\n return this._decompose(), this._localScaling;\n }\n /**\n * Gets the current scaling in local space and stores it in a target vector\n * @param result defines the target vector\n */\n getScaleToRef(e) {\n this._decompose(), e.copyFrom(this._localScaling);\n }\n /**\n * Set the yaw, pitch, and roll of the bone in local or world space\n * @param yaw The rotation of the bone on the y axis\n * @param pitch The rotation of the bone on the x axis\n * @param roll The rotation of the bone on the z axis\n * @param space The space that the axes of rotation are in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setYawPitchRoll(e, t, i, r = ut.LOCAL, s) {\n if (r === ut.LOCAL) {\n const l = Wt._TmpQuat;\n Ce.RotationYawPitchRollToRef(e, t, i, l), this.setRotationQuaternion(l, r, s);\n return;\n }\n const a = Wt._TmpMats[0];\n if (!this._getAbsoluteInverseMatrixUnscaledToRef(a, s))\n return;\n const o = Wt._TmpMats[1];\n L.RotationYawPitchRollToRef(e, t, i, o), a.multiplyToRef(o, o), this._rotateWithMatrix(o, r, s);\n }\n /**\n * Add a rotation to the bone on an axis in local or world space\n * @param axis The axis to rotate the bone on\n * @param amount The amount to rotate the bone\n * @param space The space that the axis is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n rotate(e, t, i = ut.LOCAL, r) {\n const s = Wt._TmpMats[0];\n s.setTranslationFromFloats(0, 0, 0), L.RotationAxisToRef(e, t, s), this._rotateWithMatrix(s, i, r);\n }\n /**\n * Set the rotation of the bone to a particular axis angle in local or world space\n * @param axis The axis to rotate the bone on\n * @param angle The angle that the bone should be rotated to\n * @param space The space that the axis is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setAxisAngle(e, t, i = ut.LOCAL, r) {\n if (i === ut.LOCAL) {\n const o = Wt._TmpQuat;\n Ce.RotationAxisToRef(e, t, o), this.setRotationQuaternion(o, i, r);\n return;\n }\n const s = Wt._TmpMats[0];\n if (!this._getAbsoluteInverseMatrixUnscaledToRef(s, r))\n return;\n const a = Wt._TmpMats[1];\n L.RotationAxisToRef(e, t, a), s.multiplyToRef(a, a), this._rotateWithMatrix(a, i, r);\n }\n /**\n * Set the euler rotation of the bone in local or world space\n * @param rotation The euler rotation that the bone should be set to\n * @param space The space that the rotation is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setRotation(e, t = ut.LOCAL, i) {\n this.setYawPitchRoll(e.y, e.x, e.z, t, i);\n }\n /**\n * Set the quaternion rotation of the bone in local or world space\n * @param quat The quaternion rotation that the bone should be set to\n * @param space The space that the rotation is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setRotationQuaternion(e, t = ut.LOCAL, i) {\n if (t === ut.LOCAL) {\n this._decompose(), this._localRotation.copyFrom(e), this._markAsDirtyAndCompose();\n return;\n }\n const r = Wt._TmpMats[0];\n if (!this._getAbsoluteInverseMatrixUnscaledToRef(r, i))\n return;\n const s = Wt._TmpMats[1];\n L.FromQuaternionToRef(e, s), r.multiplyToRef(s, s), this._rotateWithMatrix(s, t, i);\n }\n /**\n * Set the rotation matrix of the bone in local or world space\n * @param rotMat The rotation matrix that the bone should be set to\n * @param space The space that the rotation is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n */\n setRotationMatrix(e, t = ut.LOCAL, i) {\n if (t === ut.LOCAL) {\n const a = Wt._TmpQuat;\n Ce.FromRotationMatrixToRef(e, a), this.setRotationQuaternion(a, t, i);\n return;\n }\n const r = Wt._TmpMats[0];\n if (!this._getAbsoluteInverseMatrixUnscaledToRef(r, i))\n return;\n const s = Wt._TmpMats[1];\n s.copyFrom(e), r.multiplyToRef(e, s), this._rotateWithMatrix(s, t, i);\n }\n _rotateWithMatrix(e, t = ut.LOCAL, i) {\n const r = this.getLocalMatrix(), s = r.m[12], a = r.m[13], o = r.m[14], l = this.getParent(), c = Wt._TmpMats[3], h = Wt._TmpMats[4];\n l && t == ut.WORLD ? (i ? (c.copyFrom(i.getWorldMatrix()), l.getAbsoluteMatrix().multiplyToRef(c, c)) : c.copyFrom(l.getAbsoluteMatrix()), h.copyFrom(c), h.invert(), r.multiplyToRef(c, r), r.multiplyToRef(e, r), r.multiplyToRef(h, r)) : t == ut.WORLD && i ? (c.copyFrom(i.getWorldMatrix()), h.copyFrom(c), h.invert(), r.multiplyToRef(c, r), r.multiplyToRef(e, r), r.multiplyToRef(h, r)) : r.multiplyToRef(e, r), r.setTranslationFromFloats(s, a, o), this.computeAbsoluteMatrices(), this._markAsDirtyAndDecompose();\n }\n _getAbsoluteInverseMatrixUnscaledToRef(e, t) {\n const i = Wt._TmpMats[2];\n return e.copyFrom(this.getAbsoluteMatrix()), t ? (e.multiplyToRef(t.getWorldMatrix(), e), L.ScalingToRef(t.scaling.x, t.scaling.y, t.scaling.z, i)) : L.IdentityToRef(i), e.invert(), isNaN(e.m[0]) ? !1 : (i.multiplyAtIndex(0, this._scalingDeterminant), e.multiplyToRef(i, e), !0);\n }\n /**\n * Get the position of the bone in local or world space\n * @param space The space that the returned position is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The position of the bone\n */\n getPosition(e = ut.LOCAL, t = null) {\n const i = _.Zero();\n return this.getPositionToRef(e, t, i), i;\n }\n /**\n * Copy the position of the bone to a vector3 in local or world space\n * @param space The space that the returned position is in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 to copy the position to\n */\n getPositionToRef(e = ut.LOCAL, t, i) {\n if (e == ut.LOCAL) {\n const r = this.getLocalMatrix();\n i.x = r.m[12], i.y = r.m[13], i.z = r.m[14];\n } else {\n let r = null;\n t && (r = t.getWorldMatrix()), this._skeleton.computeAbsoluteMatrices();\n let s = Wt._TmpMats[0];\n t && r ? (s.copyFrom(this.getAbsoluteMatrix()), s.multiplyToRef(r, s)) : s = this.getAbsoluteMatrix(), i.x = s.m[12], i.y = s.m[13], i.z = s.m[14];\n }\n }\n /**\n * Get the absolute position of the bone (world space)\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The absolute position of the bone\n */\n getAbsolutePosition(e = null) {\n const t = _.Zero();\n return this.getPositionToRef(ut.WORLD, e, t), t;\n }\n /**\n * Copy the absolute position of the bone (world space) to the result param\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 to copy the absolute position to\n */\n getAbsolutePositionToRef(e, t) {\n this.getPositionToRef(ut.WORLD, e, t);\n }\n /**\n * Compute the absolute matrices of this bone and its children\n */\n computeAbsoluteMatrices() {\n if (this._compose(), this.parent)\n this._localMatrix.multiplyToRef(this.parent._absoluteMatrix, this._absoluteMatrix);\n else {\n this._absoluteMatrix.copyFrom(this._localMatrix);\n const i = this._skeleton.getPoseMatrix();\n i && this._absoluteMatrix.multiplyToRef(i, this._absoluteMatrix);\n }\n const e = this.children, t = e.length;\n for (let i = 0; i < t; i++)\n e[i].computeAbsoluteMatrices();\n }\n /**\n * Compute the absolute matrices of this bone and its children\n * @deprecated Please use computeAbsoluteMatrices instead\n */\n computeAbsoluteTransforms() {\n this.computeAbsoluteMatrices();\n }\n /**\n * Get the world direction from an axis that is in the local space of the bone\n * @param localAxis The local direction that is used to compute the world direction\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The world direction\n */\n getDirection(e, t = null) {\n const i = _.Zero();\n return this.getDirectionToRef(e, t, i), i;\n }\n /**\n * Copy the world direction to a vector3 from an axis that is in the local space of the bone\n * @param localAxis The local direction that is used to compute the world direction\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 that the world direction will be copied to\n */\n getDirectionToRef(e, t = null, i) {\n let r = null;\n t && (r = t.getWorldMatrix()), this._skeleton.computeAbsoluteMatrices();\n const s = Wt._TmpMats[0];\n s.copyFrom(this.getAbsoluteMatrix()), t && r && s.multiplyToRef(r, s), _.TransformNormalToRef(e, s, i), i.normalize();\n }\n /**\n * Get the euler rotation of the bone in local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The euler rotation\n */\n getRotation(e = ut.LOCAL, t = null) {\n const i = _.Zero();\n return this.getRotationToRef(e, t, i), i;\n }\n /**\n * Copy the euler rotation of the bone to a vector3. The rotation can be in either local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 that the rotation should be copied to\n */\n getRotationToRef(e = ut.LOCAL, t = null, i) {\n const r = Wt._TmpQuat;\n this.getRotationQuaternionToRef(e, t, r), r.toEulerAnglesToRef(i);\n }\n /**\n * Get the quaternion rotation of the bone in either local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The quaternion rotation\n */\n getRotationQuaternion(e = ut.LOCAL, t = null) {\n const i = Ce.Identity();\n return this.getRotationQuaternionToRef(e, t, i), i;\n }\n /**\n * Copy the quaternion rotation of the bone to a quaternion. The rotation can be in either local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The quaternion that the rotation should be copied to\n */\n getRotationQuaternionToRef(e = ut.LOCAL, t = null, i) {\n if (e == ut.LOCAL)\n this._decompose(), i.copyFrom(this._localRotation);\n else {\n const r = Wt._TmpMats[0], s = this.getAbsoluteMatrix();\n t ? s.multiplyToRef(t.getWorldMatrix(), r) : r.copyFrom(s), r.multiplyAtIndex(0, this._scalingDeterminant), r.multiplyAtIndex(1, this._scalingDeterminant), r.multiplyAtIndex(2, this._scalingDeterminant), r.decompose(void 0, i, void 0);\n }\n }\n /**\n * Get the rotation matrix of the bone in local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The rotation matrix\n */\n getRotationMatrix(e = ut.LOCAL, t) {\n const i = L.Identity();\n return this.getRotationMatrixToRef(e, t, i), i;\n }\n /**\n * Copy the rotation matrix of the bone to a matrix. The rotation can be in either local or world space\n * @param space The space that the rotation should be in\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The quaternion that the rotation should be copied to\n */\n getRotationMatrixToRef(e = ut.LOCAL, t, i) {\n if (e == ut.LOCAL)\n this.getLocalMatrix().getRotationMatrixToRef(i);\n else {\n const r = Wt._TmpMats[0], s = this.getAbsoluteMatrix();\n t ? s.multiplyToRef(t.getWorldMatrix(), r) : r.copyFrom(s), r.multiplyAtIndex(0, this._scalingDeterminant), r.multiplyAtIndex(1, this._scalingDeterminant), r.multiplyAtIndex(2, this._scalingDeterminant), r.getRotationMatrixToRef(i);\n }\n }\n /**\n * Get the world position of a point that is in the local space of the bone\n * @param position The local position\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The world position\n */\n getAbsolutePositionFromLocal(e, t = null) {\n const i = _.Zero();\n return this.getAbsolutePositionFromLocalToRef(e, t, i), i;\n }\n /**\n * Get the world position of a point that is in the local space of the bone and copy it to the result param\n * @param position The local position\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 that the world position should be copied to\n */\n getAbsolutePositionFromLocalToRef(e, t = null, i) {\n let r = null;\n t && (r = t.getWorldMatrix()), this._skeleton.computeAbsoluteMatrices();\n const s = Wt._TmpMats[0];\n s.copyFrom(this.getAbsoluteMatrix()), t && r && s.multiplyToRef(r, s), _.TransformCoordinatesToRef(e, s, i);\n }\n /**\n * Get the local position of a point that is in world space\n * @param position The world position\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @returns The local position\n */\n getLocalPositionFromAbsolute(e, t = null) {\n const i = _.Zero();\n return this.getLocalPositionFromAbsoluteToRef(e, t, i), i;\n }\n /**\n * Get the local position of a point that is in world space and copy it to the result param\n * @param position The world position\n * @param tNode A TransformNode whose world matrix is to be applied to the calculated absolute matrix. In most cases, you'll want to pass the mesh associated with the skeleton from which this bone comes. Used only when space=Space.WORLD\n * @param result The vector3 that the local position should be copied to\n */\n getLocalPositionFromAbsoluteToRef(e, t = null, i) {\n let r = null;\n t && (r = t.getWorldMatrix()), this._skeleton.computeAbsoluteMatrices();\n const s = Wt._TmpMats[0];\n s.copyFrom(this.getAbsoluteMatrix()), t && r && s.multiplyToRef(r, s), s.invert(), _.TransformCoordinatesToRef(e, s, i);\n }\n /**\n * Set the current local matrix as the restMatrix for this bone.\n */\n setCurrentPoseAsRest() {\n this.setRestMatrix(this.getLocalMatrix());\n }\n}\nWt._TmpVecs = vi.BuildArray(2, _.Zero);\nWt._TmpQuat = Ce.Identity();\nWt._TmpMats = vi.BuildArray(5, L.Identity);\nvar xu;\n(function(n) {\n n[n.NONE = 0] = \"NONE\", n[n.STEP = 1] = \"STEP\";\n})(xu || (xu = {}));\nclass qc {\n /**\n * Initializes the range of an animation\n * @param name The name of the animation range\n * @param from The starting frame of the animation\n * @param to The ending frame of the animation\n */\n constructor(e, t, i) {\n this.name = e, this.from = t, this.to = i;\n }\n /**\n * Makes a copy of the animation range\n * @returns A copy of the animation range\n */\n clone() {\n return new qc(this.name, this.from, this.to);\n }\n}\nconst DN = Object.freeze(new Ce(0, 0, 0, 0)), NN = Object.freeze(_.Zero()), FN = Object.freeze(me.Zero()), LN = Object.freeze(vr.Zero()), wN = Object.freeze(Ne.Black()), UN = Object.freeze(new et(0, 0, 0, 0)), Gr = {\n key: 0,\n repeatCount: 0,\n loopMode: 2\n};\nclass ve {\n /**\n * @internal Internal use\n */\n static _PrepareAnimation(e, t, i, r, s, a, o, l) {\n let c;\n if (!isNaN(parseFloat(s)) && isFinite(s) ? c = ve.ANIMATIONTYPE_FLOAT : s instanceof Ce ? c = ve.ANIMATIONTYPE_QUATERNION : s instanceof _ ? c = ve.ANIMATIONTYPE_VECTOR3 : s instanceof me ? c = ve.ANIMATIONTYPE_VECTOR2 : s instanceof Ne ? c = ve.ANIMATIONTYPE_COLOR3 : s instanceof et ? c = ve.ANIMATIONTYPE_COLOR4 : s instanceof vr && (c = ve.ANIMATIONTYPE_SIZE), c == null)\n return null;\n const h = new ve(e, t, i, c, o), u = [\n { frame: 0, value: s },\n { frame: r, value: a }\n ];\n return h.setKeys(u), l !== void 0 && h.setEasingFunction(l), h;\n }\n /**\n * Sets up an animation\n * @param property The property to animate\n * @param animationType The animation type to apply\n * @param framePerSecond The frames per second of the animation\n * @param easingFunction The easing function used in the animation\n * @returns The created animation\n */\n static CreateAnimation(e, t, i, r) {\n const s = new ve(e + \"Animation\", e, i, t, ve.ANIMATIONLOOPMODE_CONSTANT);\n return s.setEasingFunction(r), s;\n }\n /**\n * Create and start an animation on a node\n * @param name defines the name of the global animation that will be run on all nodes\n * @param target defines the target where the animation will take place\n * @param targetProperty defines property to animate\n * @param framePerSecond defines the number of frame per second yo use\n * @param totalFrame defines the number of frames in total\n * @param from defines the initial value\n * @param to defines the final value\n * @param loopMode defines which loop mode you want to use (off by default)\n * @param easingFunction defines the easing function to use (linear by default)\n * @param onAnimationEnd defines the callback to call when animation end\n * @param scene defines the hosting scene\n * @returns the animatable created for this animation\n */\n static CreateAndStartAnimation(e, t, i, r, s, a, o, l, c, h, u) {\n const f = ve._PrepareAnimation(e, i, r, s, a, o, l, c);\n return !f || (t.getScene && (u = t.getScene()), !u) ? null : u.beginDirectAnimation(t, [f], 0, s, f.loopMode === 1, 1, h);\n }\n /**\n * Create and start an animation on a node and its descendants\n * @param name defines the name of the global animation that will be run on all nodes\n * @param node defines the root node where the animation will take place\n * @param directDescendantsOnly if true only direct descendants will be used, if false direct and also indirect (children of children, an so on in a recursive manner) descendants will be used\n * @param targetProperty defines property to animate\n * @param framePerSecond defines the number of frame per second to use\n * @param totalFrame defines the number of frames in total\n * @param from defines the initial value\n * @param to defines the final value\n * @param loopMode defines which loop mode you want to use (off by default)\n * @param easingFunction defines the easing function to use (linear by default)\n * @param onAnimationEnd defines the callback to call when an animation ends (will be called once per node)\n * @returns the list of animatables created for all nodes\n * @example https://www.babylonjs-playground.com/#MH0VLI\n */\n static CreateAndStartHierarchyAnimation(e, t, i, r, s, a, o, l, c, h, u) {\n const f = ve._PrepareAnimation(e, r, s, a, o, l, c, h);\n return f ? t.getScene().beginDirectHierarchyAnimation(t, i, [f], 0, a, f.loopMode === 1, 1, u) : null;\n }\n /**\n * Creates a new animation, merges it with the existing animations and starts it\n * @param name Name of the animation\n * @param node Node which contains the scene that begins the animations\n * @param targetProperty Specifies which property to animate\n * @param framePerSecond The frames per second of the animation\n * @param totalFrame The total number of frames\n * @param from The frame at the beginning of the animation\n * @param to The frame at the end of the animation\n * @param loopMode Specifies the loop mode of the animation\n * @param easingFunction (Optional) The easing function of the animation, which allow custom mathematical formulas for animations\n * @param onAnimationEnd Callback to run once the animation is complete\n * @returns Nullable animation\n */\n static CreateMergeAndStartAnimation(e, t, i, r, s, a, o, l, c, h) {\n const u = ve._PrepareAnimation(e, i, r, s, a, o, l, c);\n return u ? (t.animations.push(u), t.getScene().beginAnimation(t, 0, s, u.loopMode === 1, 1, h)) : null;\n }\n /** @internal */\n static MakeAnimationAdditive(e, t, i, r = !1, s) {\n let a;\n typeof t == \"object\" ? a = t : a = {\n referenceFrame: t ?? 0,\n range: i,\n cloneOriginalAnimation: r,\n clonedAnimationName: s\n };\n let o = e;\n if (a.cloneOriginalAnimation && (o = e.clone(), o.name = a.clonedAnimationName || o.name), !o._keys.length)\n return o;\n const l = a.referenceFrame && a.referenceFrame >= 0 ? a.referenceFrame : 0;\n let c = 0;\n const h = o._keys[0];\n let u = o._keys.length - 1;\n const f = o._keys[u], d = {\n referenceValue: h.value,\n referencePosition: z.Vector3[0],\n referenceQuaternion: z.Quaternion[0],\n referenceScaling: z.Vector3[1],\n keyPosition: z.Vector3[2],\n keyQuaternion: z.Quaternion[1],\n keyScaling: z.Vector3[3]\n };\n let p = h.frame, g = f.frame;\n if (a.range) {\n const E = o.getRange(a.range);\n E && (p = E.from, g = E.to);\n } else\n p = a.fromFrame ?? p, g = a.toFrame ?? g;\n if (p !== h.frame && (c = o.createKeyForFrame(p)), g !== f.frame && (u = o.createKeyForFrame(g)), o._keys.length === 1) {\n const E = o._getKeyValue(o._keys[0]);\n d.referenceValue = E.clone ? E.clone() : E;\n } else if (l <= h.frame) {\n const E = o._getKeyValue(h.value);\n d.referenceValue = E.clone ? E.clone() : E;\n } else if (l >= f.frame) {\n const E = o._getKeyValue(f.value);\n d.referenceValue = E.clone ? E.clone() : E;\n } else {\n Gr.key = 0;\n const E = o._interpolate(l, Gr);\n d.referenceValue = E.clone ? E.clone() : E;\n }\n o.dataType === ve.ANIMATIONTYPE_QUATERNION ? d.referenceValue.normalize().conjugateInPlace() : o.dataType === ve.ANIMATIONTYPE_MATRIX && (d.referenceValue.decompose(d.referenceScaling, d.referenceQuaternion, d.referencePosition), d.referenceQuaternion.normalize().conjugateInPlace());\n let m = Number.MAX_VALUE;\n const v = a.clipKeys ? [] : null;\n for (let E = c; E <= u; E++) {\n let C = o._keys[E];\n if (v && (C = {\n frame: C.frame,\n value: C.value.clone ? C.value.clone() : C.value,\n inTangent: C.inTangent,\n outTangent: C.outTangent,\n interpolation: C.interpolation,\n lockedTangent: C.lockedTangent\n }, m === Number.MAX_VALUE && (m = C.frame), C.frame -= m, v.push(C)), !(E && o.dataType !== ve.ANIMATIONTYPE_FLOAT && C.value === h.value))\n switch (o.dataType) {\n case ve.ANIMATIONTYPE_MATRIX:\n C.value.decompose(d.keyScaling, d.keyQuaternion, d.keyPosition), d.keyPosition.subtractInPlace(d.referencePosition), d.keyScaling.divideInPlace(d.referenceScaling), d.referenceQuaternion.multiplyToRef(d.keyQuaternion, d.keyQuaternion), L.ComposeToRef(d.keyScaling, d.keyQuaternion, d.keyPosition, C.value);\n break;\n case ve.ANIMATIONTYPE_QUATERNION:\n d.referenceValue.multiplyToRef(C.value, C.value);\n break;\n case ve.ANIMATIONTYPE_VECTOR2:\n case ve.ANIMATIONTYPE_VECTOR3:\n case ve.ANIMATIONTYPE_COLOR3:\n case ve.ANIMATIONTYPE_COLOR4:\n C.value.subtractToRef(d.referenceValue, C.value);\n break;\n case ve.ANIMATIONTYPE_SIZE:\n C.value.width -= d.referenceValue.width, C.value.height -= d.referenceValue.height;\n break;\n default:\n C.value -= d.referenceValue;\n }\n }\n return v && o.setKeys(v, !0), o;\n }\n /**\n * Transition property of an host to the target Value\n * @param property The property to transition\n * @param targetValue The target Value of the property\n * @param host The object where the property to animate belongs\n * @param scene Scene used to run the animation\n * @param frameRate Framerate (in frame/s) to use\n * @param transition The transition type we want to use\n * @param duration The duration of the animation, in milliseconds\n * @param onAnimationEnd Callback trigger at the end of the animation\n * @returns Nullable animation\n */\n static TransitionTo(e, t, i, r, s, a, o, l = null) {\n if (o <= 0)\n return i[e] = t, l && l(), null;\n const c = s * (o / 1e3);\n a.setKeys([\n {\n frame: 0,\n value: i[e].clone ? i[e].clone() : i[e]\n },\n {\n frame: c,\n value: t\n }\n ]), i.animations || (i.animations = []), i.animations.push(a);\n const h = r.beginAnimation(i, 0, c, !1);\n return h.onAnimationEnd = l, h;\n }\n /**\n * Return the array of runtime animations currently using this animation\n */\n get runtimeAnimations() {\n return this._runtimeAnimations;\n }\n /**\n * Specifies if any of the runtime animations are currently running\n */\n get hasRunningRuntimeAnimations() {\n for (const e of this._runtimeAnimations)\n if (!e.isStopped())\n return !0;\n return !1;\n }\n /**\n * Initializes the animation\n * @param name Name of the animation\n * @param targetProperty Property to animate\n * @param framePerSecond The frames per second of the animation\n * @param dataType The data type of the animation\n * @param loopMode The loop mode of the animation\n * @param enableBlending Specifies if blending should be enabled\n */\n constructor(e, t, i, r, s, a) {\n this.name = e, this.targetProperty = t, this.framePerSecond = i, this.dataType = r, this.loopMode = s, this.enableBlending = a, this._easingFunction = null, this._runtimeAnimations = new Array(), this._events = new Array(), this.blendingSpeed = 0.01, this._ranges = {}, this.targetPropertyPath = t.split(\".\"), this.dataType = r, this.loopMode = s === void 0 ? ve.ANIMATIONLOOPMODE_CYCLE : s, this.uniqueId = ve._UniqueIdGenerator++;\n }\n // Methods\n /**\n * Converts the animation to a string\n * @param fullDetails support for multiple levels of logging within scene loading\n * @returns String form of the animation\n */\n toString(e) {\n let t = \"Name: \" + this.name + \", property: \" + this.targetProperty;\n if (t += \", datatype: \" + [\"Float\", \"Vector3\", \"Quaternion\", \"Matrix\", \"Color3\", \"Vector2\"][this.dataType], t += \", nKeys: \" + (this._keys ? this._keys.length : \"none\"), t += \", nRanges: \" + (this._ranges ? Object.keys(this._ranges).length : \"none\"), e) {\n t += \", Ranges: {\";\n let i = !0;\n for (const r in this._ranges)\n i && (t += \", \", i = !1), t += r;\n t += \"}\";\n }\n return t;\n }\n /**\n * Add an event to this animation\n * @param event Event to add\n */\n addEvent(e) {\n this._events.push(e), this._events.sort((t, i) => t.frame - i.frame);\n }\n /**\n * Remove all events found at the given frame\n * @param frame The frame to remove events from\n */\n removeEvents(e) {\n for (let t = 0; t < this._events.length; t++)\n this._events[t].frame === e && (this._events.splice(t, 1), t--);\n }\n /**\n * Retrieves all the events from the animation\n * @returns Events from the animation\n */\n getEvents() {\n return this._events;\n }\n /**\n * Creates an animation range\n * @param name Name of the animation range\n * @param from Starting frame of the animation range\n * @param to Ending frame of the animation\n */\n createRange(e, t, i) {\n this._ranges[e] || (this._ranges[e] = new qc(e, t, i));\n }\n /**\n * Deletes an animation range by name\n * @param name Name of the animation range to delete\n * @param deleteFrames Specifies if the key frames for the range should also be deleted (true) or not (false)\n */\n deleteRange(e, t = !0) {\n const i = this._ranges[e];\n if (i) {\n if (t) {\n const r = i.from, s = i.to;\n for (let a = this._keys.length - 1; a >= 0; a--)\n this._keys[a].frame >= r && this._keys[a].frame <= s && this._keys.splice(a, 1);\n }\n this._ranges[e] = null;\n }\n }\n /**\n * Gets the animation range by name, or null if not defined\n * @param name Name of the animation range\n * @returns Nullable animation range\n */\n getRange(e) {\n return this._ranges[e];\n }\n /**\n * Gets the key frames from the animation\n * @returns The key frames of the animation\n */\n getKeys() {\n return this._keys;\n }\n /**\n * Gets the highest frame rate of the animation\n * @returns Highest frame rate of the animation\n */\n getHighestFrame() {\n let e = 0;\n for (let t = 0, i = this._keys.length; t < i; t++)\n e < this._keys[t].frame && (e = this._keys[t].frame);\n return e;\n }\n /**\n * Gets the easing function of the animation\n * @returns Easing function of the animation\n */\n getEasingFunction() {\n return this._easingFunction;\n }\n /**\n * Sets the easing function of the animation\n * @param easingFunction A custom mathematical formula for animation\n */\n setEasingFunction(e) {\n this._easingFunction = e;\n }\n /**\n * Interpolates a scalar linearly\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated scalar value\n */\n floatInterpolateFunction(e, t, i) {\n return je.Lerp(e, t, i);\n }\n /**\n * Interpolates a scalar cubically\n * @param startValue Start value of the animation curve\n * @param outTangent End tangent of the animation\n * @param endValue End value of the animation curve\n * @param inTangent Start tangent of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated scalar value\n */\n floatInterpolateFunctionWithTangents(e, t, i, r, s) {\n return je.Hermite(e, t, i, r, s);\n }\n /**\n * Interpolates a quaternion using a spherical linear interpolation\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated quaternion value\n */\n quaternionInterpolateFunction(e, t, i) {\n return Ce.Slerp(e, t, i);\n }\n /**\n * Interpolates a quaternion cubically\n * @param startValue Start value of the animation curve\n * @param outTangent End tangent of the animation curve\n * @param endValue End value of the animation curve\n * @param inTangent Start tangent of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated quaternion value\n */\n quaternionInterpolateFunctionWithTangents(e, t, i, r, s) {\n return Ce.Hermite(e, t, i, r, s).normalize();\n }\n /**\n * Interpolates a Vector3 linearly\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\n * @returns Interpolated scalar value\n */\n vector3InterpolateFunction(e, t, i) {\n return _.Lerp(e, t, i);\n }\n /**\n * Interpolates a Vector3 cubically\n * @param startValue Start value of the animation curve\n * @param outTangent End tangent of the animation\n * @param endValue End value of the animation curve\n * @param inTangent Start tangent of the animation curve\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\n * @returns InterpolatedVector3 value\n */\n vector3InterpolateFunctionWithTangents(e, t, i, r, s) {\n return _.Hermite(e, t, i, r, s);\n }\n /**\n * Interpolates a Vector2 linearly\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\n * @returns Interpolated Vector2 value\n */\n vector2InterpolateFunction(e, t, i) {\n return me.Lerp(e, t, i);\n }\n /**\n * Interpolates a Vector2 cubically\n * @param startValue Start value of the animation curve\n * @param outTangent End tangent of the animation\n * @param endValue End value of the animation curve\n * @param inTangent Start tangent of the animation curve\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\n * @returns Interpolated Vector2 value\n */\n vector2InterpolateFunctionWithTangents(e, t, i, r, s) {\n return me.Hermite(e, t, i, r, s);\n }\n /**\n * Interpolates a size linearly\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated Size value\n */\n sizeInterpolateFunction(e, t, i) {\n return vr.Lerp(e, t, i);\n }\n /**\n * Interpolates a Color3 linearly\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated Color3 value\n */\n color3InterpolateFunction(e, t, i) {\n return Ne.Lerp(e, t, i);\n }\n /**\n * Interpolates a Color3 cubically\n * @param startValue Start value of the animation curve\n * @param outTangent End tangent of the animation\n * @param endValue End value of the animation curve\n * @param inTangent Start tangent of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns interpolated value\n */\n color3InterpolateFunctionWithTangents(e, t, i, r, s) {\n return Ne.Hermite(e, t, i, r, s);\n }\n /**\n * Interpolates a Color4 linearly\n * @param startValue Start value of the animation curve\n * @param endValue End value of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns Interpolated Color3 value\n */\n color4InterpolateFunction(e, t, i) {\n return et.Lerp(e, t, i);\n }\n /**\n * Interpolates a Color4 cubically\n * @param startValue Start value of the animation curve\n * @param outTangent End tangent of the animation\n * @param endValue End value of the animation curve\n * @param inTangent Start tangent of the animation curve\n * @param gradient Scalar amount to interpolate\n * @returns interpolated value\n */\n color4InterpolateFunctionWithTangents(e, t, i, r, s) {\n return et.Hermite(e, t, i, r, s);\n }\n /**\n * @internal Internal use only\n */\n _getKeyValue(e) {\n return typeof e == \"function\" ? e() : e;\n }\n /**\n * Evaluate the animation value at a given frame\n * @param currentFrame defines the frame where we want to evaluate the animation\n * @returns the animation value\n */\n evaluate(e) {\n return Gr.key = 0, this._interpolate(e, Gr);\n }\n /**\n * @internal Internal use only\n */\n _interpolate(e, t, i = !1) {\n if (t.loopMode === ve.ANIMATIONLOOPMODE_CONSTANT && t.repeatCount > 0)\n return t.highLimitValue.clone ? t.highLimitValue.clone() : t.highLimitValue;\n const r = this._keys, s = r.length;\n let a = t.key;\n for (; a >= 0 && e < r[a].frame; )\n --a;\n for (; a + 1 <= s - 1 && e >= r[a + 1].frame; )\n ++a;\n if (t.key = a, a < 0)\n return i ? void 0 : this._getKeyValue(r[0].value);\n if (a + 1 > s - 1)\n return i ? void 0 : this._getKeyValue(r[s - 1].value);\n const o = r[a], l = r[a + 1];\n if (i && (e === o.frame || e === l.frame))\n return;\n const c = this._getKeyValue(o.value), h = this._getKeyValue(l.value);\n if (o.interpolation === xu.STEP)\n return l.frame > e ? c : h;\n const u = o.outTangent !== void 0 && l.inTangent !== void 0, f = l.frame - o.frame;\n let d = (e - o.frame) / f;\n const p = o.easingFunction || this.getEasingFunction();\n switch (p !== null && (d = p.ease(d)), this.dataType) {\n case ve.ANIMATIONTYPE_FLOAT: {\n const g = u ? this.floatInterpolateFunctionWithTangents(c, o.outTangent * f, h, l.inTangent * f, d) : this.floatInterpolateFunction(c, h, d);\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return g;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return (t.offsetValue ?? 0) * t.repeatCount + g;\n }\n break;\n }\n case ve.ANIMATIONTYPE_QUATERNION: {\n const g = u ? this.quaternionInterpolateFunctionWithTangents(c, o.outTangent.scale(f), h, l.inTangent.scale(f), d) : this.quaternionInterpolateFunction(c, h, d);\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return g;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return g.addInPlace((t.offsetValue || DN).scale(t.repeatCount));\n }\n return g;\n }\n case ve.ANIMATIONTYPE_VECTOR3: {\n const g = u ? this.vector3InterpolateFunctionWithTangents(c, o.outTangent.scale(f), h, l.inTangent.scale(f), d) : this.vector3InterpolateFunction(c, h, d);\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return g;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return g.add((t.offsetValue || NN).scale(t.repeatCount));\n }\n break;\n }\n case ve.ANIMATIONTYPE_VECTOR2: {\n const g = u ? this.vector2InterpolateFunctionWithTangents(c, o.outTangent.scale(f), h, l.inTangent.scale(f), d) : this.vector2InterpolateFunction(c, h, d);\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return g;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return g.add((t.offsetValue || FN).scale(t.repeatCount));\n }\n break;\n }\n case ve.ANIMATIONTYPE_SIZE: {\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return this.sizeInterpolateFunction(c, h, d);\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return this.sizeInterpolateFunction(c, h, d).add((t.offsetValue || LN).scale(t.repeatCount));\n }\n break;\n }\n case ve.ANIMATIONTYPE_COLOR3: {\n const g = u ? this.color3InterpolateFunctionWithTangents(c, o.outTangent.scale(f), h, l.inTangent.scale(f), d) : this.color3InterpolateFunction(c, h, d);\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return g;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return g.add((t.offsetValue || wN).scale(t.repeatCount));\n }\n break;\n }\n case ve.ANIMATIONTYPE_COLOR4: {\n const g = u ? this.color4InterpolateFunctionWithTangents(c, o.outTangent.scale(f), h, l.inTangent.scale(f), d) : this.color4InterpolateFunction(c, h, d);\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return g;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return g.add((t.offsetValue || UN).scale(t.repeatCount));\n }\n break;\n }\n case ve.ANIMATIONTYPE_MATRIX: {\n switch (t.loopMode) {\n case ve.ANIMATIONLOOPMODE_CYCLE:\n case ve.ANIMATIONLOOPMODE_CONSTANT:\n case ve.ANIMATIONLOOPMODE_YOYO:\n return ve.AllowMatricesInterpolation ? this.matrixInterpolateFunction(c, h, d, t.workValue) : c;\n case ve.ANIMATIONLOOPMODE_RELATIVE:\n case ve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\n return c;\n }\n break;\n }\n }\n return 0;\n }\n /**\n * Defines the function to use to interpolate matrices\n * @param startValue defines the start matrix\n * @param endValue defines the end matrix\n * @param gradient defines the gradient between both matrices\n * @param result defines an optional target matrix where to store the interpolation\n * @returns the interpolated matrix\n */\n matrixInterpolateFunction(e, t, i, r) {\n return ve.AllowMatrixDecomposeForInterpolation ? r ? (L.DecomposeLerpToRef(e, t, i, r), r) : L.DecomposeLerp(e, t, i) : r ? (L.LerpToRef(e, t, i, r), r) : L.Lerp(e, t, i);\n }\n /**\n * Makes a copy of the animation\n * @returns Cloned animation\n */\n clone() {\n const e = new ve(this.name, this.targetPropertyPath.join(\".\"), this.framePerSecond, this.dataType, this.loopMode);\n if (e.enableBlending = this.enableBlending, e.blendingSpeed = this.blendingSpeed, this._keys && e.setKeys(this._keys), this._ranges) {\n e._ranges = {};\n for (const t in this._ranges) {\n const i = this._ranges[t];\n i && (e._ranges[t] = i.clone());\n }\n }\n return e;\n }\n /**\n * Sets the key frames of the animation\n * @param values The animation key frames to set\n * @param dontClone Whether to clone the keys or not (default is false, so the array of keys is cloned)\n */\n setKeys(e, t = !1) {\n this._keys = t ? e : e.slice(0);\n }\n /**\n * Creates a key for the frame passed as a parameter and adds it to the animation IF a key doesn't already exist for that frame\n * @param frame Frame number\n * @returns The key index if the key was added or the index of the pre existing key if the frame passed as parameter already has a corresponding key\n */\n createKeyForFrame(e) {\n Gr.key = 0;\n const t = this._interpolate(e, Gr, !0);\n if (!t)\n return this._keys[Gr.key].frame === e ? Gr.key : Gr.key + 1;\n const i = {\n frame: e,\n value: t.clone ? t.clone() : t\n };\n return this._keys.splice(Gr.key + 1, 0, i), Gr.key + 1;\n }\n /**\n * Serializes the animation to an object\n * @returns Serialized object\n */\n serialize() {\n const e = {};\n e.name = this.name, e.property = this.targetProperty, e.framePerSecond = this.framePerSecond, e.dataType = this.dataType, e.loopBehavior = this.loopMode, e.enableBlending = this.enableBlending, e.blendingSpeed = this.blendingSpeed;\n const t = this.dataType;\n e.keys = [];\n const i = this.getKeys();\n for (let r = 0; r < i.length; r++) {\n const s = i[r], a = {};\n switch (a.frame = s.frame, t) {\n case ve.ANIMATIONTYPE_FLOAT:\n a.values = [s.value], s.inTangent !== void 0 && a.values.push(s.inTangent), s.outTangent !== void 0 && (s.inTangent === void 0 && a.values.push(void 0), a.values.push(s.outTangent)), s.interpolation !== void 0 && (s.inTangent === void 0 && a.values.push(void 0), s.outTangent === void 0 && a.values.push(void 0), a.values.push(s.interpolation));\n break;\n case ve.ANIMATIONTYPE_QUATERNION:\n case ve.ANIMATIONTYPE_MATRIX:\n case ve.ANIMATIONTYPE_VECTOR3:\n case ve.ANIMATIONTYPE_COLOR3:\n case ve.ANIMATIONTYPE_COLOR4:\n a.values = s.value.asArray(), s.inTangent != null && a.values.push(s.inTangent.asArray()), s.outTangent != null && (s.inTangent === void 0 && a.values.push(void 0), a.values.push(s.outTangent.asArray())), s.interpolation !== void 0 && (s.inTangent === void 0 && a.values.push(void 0), s.outTangent === void 0 && a.values.push(void 0), a.values.push(s.interpolation));\n break;\n }\n e.keys.push(a);\n }\n e.ranges = [];\n for (const r in this._ranges) {\n const s = this._ranges[r];\n if (!s)\n continue;\n const a = {};\n a.name = r, a.from = s.from, a.to = s.to, e.ranges.push(a);\n }\n return e;\n }\n /**\n * @internal\n */\n static _UniversalLerp(e, t, i) {\n const r = e.constructor;\n return r.Lerp ? r.Lerp(e, t, i) : r.Slerp ? r.Slerp(e, t, i) : e.toFixed ? e * (1 - i) + i * t : t;\n }\n /**\n * Parses an animation object and creates an animation\n * @param parsedAnimation Parsed animation object\n * @returns Animation object\n */\n static Parse(e) {\n const t = new ve(e.name, e.property, e.framePerSecond, e.dataType, e.loopBehavior), i = e.dataType, r = [];\n let s, a;\n for (e.enableBlending && (t.enableBlending = e.enableBlending), e.blendingSpeed && (t.blendingSpeed = e.blendingSpeed), a = 0; a < e.keys.length; a++) {\n const o = e.keys[a];\n let l, c, h;\n switch (i) {\n case ve.ANIMATIONTYPE_FLOAT:\n s = o.values[0], o.values.length >= 2 && (l = o.values[1]), o.values.length >= 3 && (c = o.values[2]), o.values.length >= 4 && (h = o.values[3]);\n break;\n case ve.ANIMATIONTYPE_QUATERNION:\n if (s = Ce.FromArray(o.values), o.values.length >= 8) {\n const f = Ce.FromArray(o.values.slice(4, 8));\n f.equals(Ce.Zero()) || (l = f);\n }\n if (o.values.length >= 12) {\n const f = Ce.FromArray(o.values.slice(8, 12));\n f.equals(Ce.Zero()) || (c = f);\n }\n o.values.length >= 13 && (h = o.values[12]);\n break;\n case ve.ANIMATIONTYPE_MATRIX:\n s = L.FromArray(o.values), o.values.length >= 17 && (h = o.values[16]);\n break;\n case ve.ANIMATIONTYPE_COLOR3:\n s = Ne.FromArray(o.values), o.values[3] && (l = Ne.FromArray(o.values[3])), o.values[4] && (c = Ne.FromArray(o.values[4])), o.values[5] && (h = o.values[5]);\n break;\n case ve.ANIMATIONTYPE_COLOR4:\n s = et.FromArray(o.values), o.values[4] && (l = et.FromArray(o.values[4])), o.values[5] && (c = et.FromArray(o.values[5])), o.values[6] && (h = et.FromArray(o.values[6]));\n break;\n case ve.ANIMATIONTYPE_VECTOR3:\n default:\n s = _.FromArray(o.values), o.values[3] && (l = _.FromArray(o.values[3])), o.values[4] && (c = _.FromArray(o.values[4])), o.values[5] && (h = o.values[5]);\n break;\n }\n const u = {};\n u.frame = o.frame, u.value = s, l != null && (u.inTangent = l), c != null && (u.outTangent = c), h != null && (u.interpolation = h), r.push(u);\n }\n if (t.setKeys(r), e.ranges)\n for (a = 0; a < e.ranges.length; a++)\n s = e.ranges[a], t.createRange(s.name, s.from, s.to);\n return t;\n }\n /**\n * Appends the serialized animations from the source animations\n * @param source Source containing the animations\n * @param destination Target to store the animations\n */\n static AppendSerializedAnimations(e, t) {\n Le.AppendSerializedAnimations(e, t);\n }\n /**\n * Creates a new animation or an array of animations from a snippet saved in a remote file\n * @param name defines the name of the animation to create (can be null or empty to use the one from the json data)\n * @param url defines the url to load from\n * @returns a promise that will resolve to the new animation or an array of animations\n */\n static ParseFromFileAsync(e, t) {\n return new Promise((i, r) => {\n const s = new mi();\n s.addEventListener(\"readystatechange\", () => {\n if (s.readyState == 4)\n if (s.status == 200) {\n let a = JSON.parse(s.responseText);\n if (a.animations && (a = a.animations), a.length) {\n const o = [];\n for (const l of a)\n o.push(this.Parse(l));\n i(o);\n } else {\n const o = this.Parse(a);\n e && (o.name = e), i(o);\n }\n } else\n r(\"Unable to load the animation\");\n }), s.open(\"GET\", t), s.send();\n });\n }\n /**\n * Creates an animation or an array of animations from a snippet saved by the Inspector\n * @param snippetId defines the snippet to load\n * @returns a promise that will resolve to the new animation or a new array of animations\n */\n static ParseFromSnippetAsync(e) {\n return new Promise((t, i) => {\n const r = new mi();\n r.addEventListener(\"readystatechange\", () => {\n if (r.readyState == 4)\n if (r.status == 200) {\n const s = JSON.parse(JSON.parse(r.responseText).jsonPayload);\n if (s.animations) {\n const a = JSON.parse(s.animations), o = [];\n for (const l of a.animations) {\n const c = this.Parse(l);\n c.snippetId = e, o.push(c);\n }\n t(o);\n } else {\n const a = JSON.parse(s.animation), o = this.Parse(a);\n o.snippetId = e, t(o);\n }\n } else\n i(\"Unable to load the snippet \" + e);\n }), r.open(\"GET\", this.SnippetUrl + \"/\" + e.replace(/#/g, \"/\")), r.send();\n });\n }\n}\nve._UniqueIdGenerator = 0;\nve.AllowMatricesInterpolation = !1;\nve.AllowMatrixDecomposeForInterpolation = !0;\nve.SnippetUrl = \"https://snippet.babylonjs.com\";\nve.ANIMATIONTYPE_FLOAT = 0;\nve.ANIMATIONTYPE_VECTOR3 = 1;\nve.ANIMATIONTYPE_QUATERNION = 2;\nve.ANIMATIONTYPE_MATRIX = 3;\nve.ANIMATIONTYPE_COLOR3 = 4;\nve.ANIMATIONTYPE_COLOR4 = 7;\nve.ANIMATIONTYPE_VECTOR2 = 5;\nve.ANIMATIONTYPE_SIZE = 6;\nve.ANIMATIONLOOPMODE_RELATIVE = 0;\nve.ANIMATIONLOOPMODE_CYCLE = 1;\nve.ANIMATIONLOOPMODE_CONSTANT = 2;\nve.ANIMATIONLOOPMODE_YOYO = 4;\nve.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT = 5;\nve.CreateFromSnippetAsync = ve.ParseFromSnippetAsync;\nRe(\"BABYLON.Animation\", ve);\nAi._AnimationRangeFactory = (n, e, t) => new qc(n, e, t);\nconst VN = \"particlesPixelShader\", BN = `#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\nvarying vec2 vUV;varying vec4 vColor;uniform vec4 textureMask;uniform sampler2D diffuseSampler;\n#include\n#include\n#include\n#include\n#include\n#ifdef RAMPGRADIENT\nvarying vec4 remapRanges;uniform sampler2D rampSampler;\n#endif\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include\nvec4 textureColor=texture2D(diffuseSampler,vUV);vec4 baseColor=(textureColor*textureMask+(vec4(1.,1.,1.,1.)-textureMask))*vColor;\n#ifdef RAMPGRADIENT\nfloat alpha=baseColor.a;float remappedColorIndex=clamp((alpha-remapRanges.x)/remapRanges.y,0.0,1.0);vec4 rampColor=texture2D(rampSampler,vec2(1.0-remappedColorIndex,0.));baseColor.rgb*=rampColor.rgb;float finalAlpha=baseColor.a;baseColor.a=clamp((alpha*rampColor.a-remapRanges.z)/remapRanges.w,0.0,1.0);\n#endif\n#ifdef BLENDMULTIPLYMODE\nfloat sourceAlpha=vColor.a*textureColor.a;baseColor.rgb=baseColor.rgb*sourceAlpha+vec3(1.0)*(1.0-sourceAlpha);\n#endif\n#include\n#include(color,baseColor)\n#ifdef IMAGEPROCESSINGPOSTPROCESS\nbaseColor.rgb=toLinearSpace(baseColor.rgb);\n#else\n#ifdef IMAGEPROCESSING\nbaseColor.rgb=toLinearSpace(baseColor.rgb);baseColor=applyImageProcessing(baseColor);\n#endif\n#endif\ngl_FragColor=baseColor;\n#define CUSTOM_FRAGMENT_MAIN_END\n}`;\nY.ShadersStore[VN] = BN;\nconst kN = \"particlesVertexShader\", zN = `attribute vec3 position;attribute vec4 color;attribute float angle;attribute vec2 size;\n#ifdef ANIMATESHEET\nattribute float cellIndex;\n#endif\n#ifndef BILLBOARD\nattribute vec3 direction;\n#endif\n#ifdef BILLBOARDSTRETCHED\nattribute vec3 direction;\n#endif\n#ifdef RAMPGRADIENT\nattribute vec4 remapData;\n#endif\nattribute vec2 offset;uniform mat4 view;uniform mat4 projection;uniform vec2 translationPivot;\n#ifdef ANIMATESHEET\nuniform vec3 particlesInfos; \n#endif\nvarying vec2 vUV;varying vec4 vColor;varying vec3 vPositionW;\n#ifdef RAMPGRADIENT\nvarying vec4 remapRanges;\n#endif\n#if defined(BILLBOARD) && !defined(BILLBOARDY) && !defined(BILLBOARDSTRETCHED)\nuniform mat4 invView;\n#endif\n#include\n#include\n#include\n#ifdef BILLBOARD\nuniform vec3 eyePosition;\n#endif\nvec3 rotate(vec3 yaxis,vec3 rotatedCorner) {vec3 xaxis=normalize(cross(vec3(0.,1.0,0.),yaxis));vec3 zaxis=normalize(cross(yaxis,xaxis));vec3 row0=vec3(xaxis.x,xaxis.y,xaxis.z);vec3 row1=vec3(yaxis.x,yaxis.y,yaxis.z);vec3 row2=vec3(zaxis.x,zaxis.y,zaxis.z);mat3 rotMatrix= mat3(row0,row1,row2);vec3 alignedCorner=rotMatrix*rotatedCorner;return position+alignedCorner;}\n#ifdef BILLBOARDSTRETCHED\nvec3 rotateAlign(vec3 toCamera,vec3 rotatedCorner) {vec3 normalizedToCamera=normalize(toCamera);vec3 normalizedCrossDirToCamera=normalize(cross(normalize(direction),normalizedToCamera));vec3 row0=vec3(normalizedCrossDirToCamera.x,normalizedCrossDirToCamera.y,normalizedCrossDirToCamera.z);vec3 row2=vec3(normalizedToCamera.x,normalizedToCamera.y,normalizedToCamera.z);\n#ifdef BILLBOARDSTRETCHED_LOCAL\nvec3 row1=direction;\n#else\nvec3 crossProduct=normalize(cross(normalizedToCamera,normalizedCrossDirToCamera));vec3 row1=vec3(crossProduct.x,crossProduct.y,crossProduct.z);\n#endif\nmat3 rotMatrix= mat3(row0,row1,row2);vec3 alignedCorner=rotMatrix*rotatedCorner;return position+alignedCorner;}\n#endif\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvec2 cornerPos;cornerPos=(vec2(offset.x-0.5,offset.y -0.5)-translationPivot)*size;\n#ifdef BILLBOARD\nvec3 rotatedCorner;\n#ifdef BILLBOARDY\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.z=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.y=0.;rotatedCorner.xz+=translationPivot;vec3 yaxis=position-eyePosition;yaxis.y=0.;vPositionW=rotate(normalize(yaxis),rotatedCorner);vec3 viewPos=(view*vec4(vPositionW,1.0)).xyz;\n#elif defined(BILLBOARDSTRETCHED)\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.y=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.z=0.;rotatedCorner.xy+=translationPivot;vec3 toCamera=position-eyePosition;vPositionW=rotateAlign(toCamera,rotatedCorner);vec3 viewPos=(view*vec4(vPositionW,1.0)).xyz;\n#else\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.y=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.z=0.;rotatedCorner.xy+=translationPivot;vec3 viewPos=(view*vec4(position,1.0)).xyz+rotatedCorner;vPositionW=(invView*vec4(viewPos,1)).xyz;\n#endif\n#ifdef RAMPGRADIENT\nremapRanges=remapData;\n#endif\ngl_Position=projection*vec4(viewPos,1.0);\n#else\nvec3 rotatedCorner;rotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.z=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.y=0.;rotatedCorner.xz+=translationPivot;vec3 yaxis=normalize(direction);vPositionW=rotate(yaxis,rotatedCorner);gl_Position=projection*view*vec4(vPositionW,1.0);\n#endif\nvColor=color;\n#ifdef ANIMATESHEET\nfloat rowOffset=floor(cellIndex*particlesInfos.z);float columnOffset=cellIndex-rowOffset/particlesInfos.z;vec2 uvScale=particlesInfos.xy;vec2 uvOffset=vec2(offset.x ,1.0-offset.y);vUV=(uvOffset+vec2(columnOffset,rowOffset))*uvScale;\n#else\nvUV=offset;\n#endif\n#if defined(CLIPPLANE) || defined(CLIPPLANE2) || defined(CLIPPLANE3) || defined(CLIPPLANE4) || defined(CLIPPLANE5) || defined(CLIPPLANE6) || defined(FOG)\nvec4 worldPos=vec4(vPositionW,1.0);\n#endif\n#include\n#include\n#include\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[kN] = zN;\nvar Yg;\n(function(n) {\n n[n.ATTACHED = 0] = \"ATTACHED\", n[n.END = 1] = \"END\";\n})(Yg || (Yg = {}));\nclass ho {\n /**\n * Gets or sets the influence of this target (ie. its weight in the overall morphing)\n */\n get influence() {\n return this._influence;\n }\n set influence(e) {\n if (this._influence === e)\n return;\n const t = this._influence;\n this._influence = e, this.onInfluenceChanged.hasObservers() && this.onInfluenceChanged.notifyObservers(t === 0 || e === 0);\n }\n /**\n * Gets or sets the animation properties override\n */\n get animationPropertiesOverride() {\n return !this._animationPropertiesOverride && this._scene ? this._scene.animationPropertiesOverride : this._animationPropertiesOverride;\n }\n set animationPropertiesOverride(e) {\n this._animationPropertiesOverride = e;\n }\n /**\n * Creates a new MorphTarget\n * @param name defines the name of the target\n * @param influence defines the influence to use\n * @param scene defines the scene the morphtarget belongs to\n */\n constructor(e, t = 0, i = null) {\n this.name = e, this.animations = [], this._positions = null, this._normals = null, this._tangents = null, this._uvs = null, this._uniqueId = 0, this.onInfluenceChanged = new he(), this._onDataLayoutChanged = new he(), this._animationPropertiesOverride = null, this._scene = i || st.LastCreatedScene, this.influence = t, this._scene && (this._uniqueId = this._scene.getUniqueId());\n }\n /**\n * Gets the unique ID of this manager\n */\n get uniqueId() {\n return this._uniqueId;\n }\n /**\n * Gets a boolean defining if the target contains position data\n */\n get hasPositions() {\n return !!this._positions;\n }\n /**\n * Gets a boolean defining if the target contains normal data\n */\n get hasNormals() {\n return !!this._normals;\n }\n /**\n * Gets a boolean defining if the target contains tangent data\n */\n get hasTangents() {\n return !!this._tangents;\n }\n /**\n * Gets a boolean defining if the target contains texture coordinates data\n */\n get hasUVs() {\n return !!this._uvs;\n }\n /**\n * Affects position data to this target\n * @param data defines the position data to use\n */\n setPositions(e) {\n const t = this.hasPositions;\n this._positions = e, t !== this.hasPositions && this._onDataLayoutChanged.notifyObservers(void 0);\n }\n /**\n * Gets the position data stored in this target\n * @returns a FloatArray containing the position data (or null if not present)\n */\n getPositions() {\n return this._positions;\n }\n /**\n * Affects normal data to this target\n * @param data defines the normal data to use\n */\n setNormals(e) {\n const t = this.hasNormals;\n this._normals = e, t !== this.hasNormals && this._onDataLayoutChanged.notifyObservers(void 0);\n }\n /**\n * Gets the normal data stored in this target\n * @returns a FloatArray containing the normal data (or null if not present)\n */\n getNormals() {\n return this._normals;\n }\n /**\n * Affects tangent data to this target\n * @param data defines the tangent data to use\n */\n setTangents(e) {\n const t = this.hasTangents;\n this._tangents = e, t !== this.hasTangents && this._onDataLayoutChanged.notifyObservers(void 0);\n }\n /**\n * Gets the tangent data stored in this target\n * @returns a FloatArray containing the tangent data (or null if not present)\n */\n getTangents() {\n return this._tangents;\n }\n /**\n * Affects texture coordinates data to this target\n * @param data defines the texture coordinates data to use\n */\n setUVs(e) {\n const t = this.hasUVs;\n this._uvs = e, t !== this.hasUVs && this._onDataLayoutChanged.notifyObservers(void 0);\n }\n /**\n * Gets the texture coordinates data stored in this target\n * @returns a FloatArray containing the texture coordinates data (or null if not present)\n */\n getUVs() {\n return this._uvs;\n }\n /**\n * Clone the current target\n * @returns a new MorphTarget\n */\n clone() {\n const e = Le.Clone(() => new ho(this.name, this.influence, this._scene), this);\n return e._positions = this._positions, e._normals = this._normals, e._tangents = this._tangents, e._uvs = this._uvs, e;\n }\n /**\n * Serializes the current target into a Serialization object\n * @returns the serialized object\n */\n serialize() {\n const e = {};\n return e.name = this.name, e.influence = this.influence, e.positions = Array.prototype.slice.call(this.getPositions()), this.id != null && (e.id = this.id), this.hasNormals && (e.normals = Array.prototype.slice.call(this.getNormals())), this.hasTangents && (e.tangents = Array.prototype.slice.call(this.getTangents())), this.hasUVs && (e.uvs = Array.prototype.slice.call(this.getUVs())), Le.AppendSerializedAnimations(this, e), e;\n }\n /**\n * Returns the string \"MorphTarget\"\n * @returns \"MorphTarget\"\n */\n getClassName() {\n return \"MorphTarget\";\n }\n // Statics\n /**\n * Creates a new target from serialized data\n * @param serializationObject defines the serialized data to use\n * @param scene defines the hosting scene\n * @returns a new MorphTarget\n */\n static Parse(e, t) {\n const i = new ho(e.name, e.influence);\n if (i.setPositions(e.positions), e.id != null && (i.id = e.id), e.normals && i.setNormals(e.normals), e.tangents && i.setTangents(e.tangents), e.uvs && i.setUVs(e.uvs), e.animations) {\n for (let r = 0; r < e.animations.length; r++) {\n const s = e.animations[r], a = mr(\"BABYLON.Animation\");\n a && i.animations.push(a.Parse(s));\n }\n e.autoAnimate && t && t.beginAnimation(i, e.autoAnimateFrom, e.autoAnimateTo, e.autoAnimateLoop, e.autoAnimateSpeed || 1);\n }\n return i;\n }\n /**\n * Creates a MorphTarget from mesh data\n * @param mesh defines the source mesh\n * @param name defines the name to use for the new target\n * @param influence defines the influence to attach to the target\n * @returns a new MorphTarget\n */\n static FromMesh(e, t, i) {\n t || (t = e.name);\n const r = new ho(t, i, e.getScene());\n return r.setPositions(e.getVerticesData(I.PositionKind)), e.isVerticesDataPresent(I.NormalKind) && r.setNormals(e.getVerticesData(I.NormalKind)), e.isVerticesDataPresent(I.TangentKind) && r.setTangents(e.getVerticesData(I.TangentKind)), e.isVerticesDataPresent(I.UVKind) && r.setUVs(e.getVerticesData(I.UVKind)), r;\n }\n}\nP([\n w()\n], ho.prototype, \"id\", void 0);\nconst WN = \"kernelBlurVaryingDeclaration\", GN = \"varying vec2 sampleCoord{X};\";\nY.IncludesShadersStore[WN] = GN;\nconst XN = \"kernelBlurFragment\", HN = `#ifdef DOF\nfactor=sampleCoC(sampleCoord{X}); \ncomputedWeight=KERNEL_WEIGHT{X}*factor;sumOfWeights+=computedWeight;\n#else\ncomputedWeight=KERNEL_WEIGHT{X};\n#endif\n#ifdef PACKEDFLOAT\nblend+=unpack(texture2D(textureSampler,sampleCoord{X}))*computedWeight;\n#else\nblend+=texture2D(textureSampler,sampleCoord{X})*computedWeight;\n#endif\n`;\nY.IncludesShadersStore[XN] = HN;\nconst KN = \"kernelBlurFragment2\", qN = `#ifdef DOF\nfactor=sampleCoC(sampleCenter+delta*KERNEL_DEP_OFFSET{X});computedWeight=KERNEL_DEP_WEIGHT{X}*factor;sumOfWeights+=computedWeight;\n#else\ncomputedWeight=KERNEL_DEP_WEIGHT{X};\n#endif\n#ifdef PACKEDFLOAT\nblend+=unpack(texture2D(textureSampler,sampleCenter+delta*KERNEL_DEP_OFFSET{X}))*computedWeight;\n#else\nblend+=texture2D(textureSampler,sampleCenter+delta*KERNEL_DEP_OFFSET{X})*computedWeight;\n#endif\n`;\nY.IncludesShadersStore[KN] = qN;\nconst YN = \"kernelBlurPixelShader\", ZN = `uniform sampler2D textureSampler;uniform vec2 delta;varying vec2 sampleCenter;\n#ifdef DOF\nuniform sampler2D circleOfConfusionSampler;float sampleCoC(in vec2 offset) {float coc=texture2D(circleOfConfusionSampler,offset).r;return coc; }\n#endif\n#include[0..varyingCount]\n#ifdef PACKEDFLOAT\n#include\n#endif\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void)\n{float computedWeight=0.0;\n#ifdef PACKEDFLOAT\nfloat blend=0.;\n#else\nvec4 blend=vec4(0.);\n#endif\n#ifdef DOF\nfloat sumOfWeights=CENTER_WEIGHT; \nfloat factor=0.0;\n#ifdef PACKEDFLOAT\nblend+=unpack(texture2D(textureSampler,sampleCenter))*CENTER_WEIGHT;\n#else\nblend+=texture2D(textureSampler,sampleCenter)*CENTER_WEIGHT;\n#endif\n#endif\n#include[0..varyingCount]\n#include[0..depCount]\n#ifdef PACKEDFLOAT\ngl_FragColor=pack(blend);\n#else\ngl_FragColor=blend;\n#endif\n#ifdef DOF\ngl_FragColor/=sumOfWeights;\n#endif\n}`;\nY.ShadersStore[YN] = ZN;\nconst jN = \"kernelBlurVertex\", QN = \"sampleCoord{X}=sampleCenter+delta*KERNEL_OFFSET{X};\";\nY.IncludesShadersStore[jN] = QN;\nconst JN = \"kernelBlurVertexShader\", $N = `attribute vec2 position;uniform vec2 delta;varying vec2 sampleCenter;\n#include[0..varyingCount]\nconst vec2 madd=vec2(0.5,0.5);\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nsampleCenter=(position*madd+madd);\n#include[0..varyingCount]\ngl_Position=vec4(position,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[JN] = $N;\nclass Xa extends Pt {\n /**\n * Sets the length in pixels of the blur sample region\n */\n set kernel(e) {\n this._idealKernel !== e && (e = Math.max(e, 1), this._idealKernel = e, this._kernel = this._nearestBestKernel(e), this._blockCompilation || this._updateParameters());\n }\n /**\n * Gets the length in pixels of the blur sample region\n */\n get kernel() {\n return this._idealKernel;\n }\n /**\n * Sets whether or not the blur needs to unpack/repack floats\n */\n set packedFloat(e) {\n this._packedFloat !== e && (this._packedFloat = e, this._blockCompilation || this._updateParameters());\n }\n /**\n * Gets whether or not the blur is unpacking/repacking floats\n */\n get packedFloat() {\n return this._packedFloat;\n }\n /**\n * Gets a string identifying the name of the class\n * @returns \"BlurPostProcess\" string\n */\n getClassName() {\n return \"BlurPostProcess\";\n }\n /**\n * Creates a new instance BlurPostProcess\n * @param name The name of the effect.\n * @param direction The direction in which to blur the image.\n * @param kernel The size of the kernel to be used when computing the blur. eg. Size of 3 will blur the center pixel by 2 pixels surrounding it.\n * @param options The required width/height ratio to downsize to before computing the render pass. (Use 1.0 for full size)\n * @param camera The camera to apply the render pass to.\n * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)\n * @param engine The engine which the post process will be applied. (default: current engine)\n * @param reusable If the post process can be reused on the same frame. (default: false)\n * @param textureType Type of textures used when performing the post process. (default: 0)\n * @param defines\n * @param _blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)\n * @param textureFormat Format of textures used when performing the post process. (default: TEXTUREFORMAT_RGBA)\n */\n constructor(e, t, i, r, s, a = le.BILINEAR_SAMPLINGMODE, o, l, c = 0, h = \"\", u = !1, f = 5) {\n super(e, \"kernelBlur\", [\"delta\", \"direction\"], [\"circleOfConfusionSampler\"], r, s, a, o, l, null, c, \"kernelBlur\", { varyingCount: 0, depCount: 0 }, !0, f), this._blockCompilation = u, this._packedFloat = !1, this._staticDefines = \"\", this._staticDefines = h, this.direction = t, this.onApplyObservable.add((d) => {\n this._outputTexture ? d.setFloat2(\"delta\", 1 / this._outputTexture.width * this.direction.x, 1 / this._outputTexture.height * this.direction.y) : d.setFloat2(\"delta\", 1 / this.width * this.direction.x, 1 / this.height * this.direction.y);\n }), this.kernel = i;\n }\n /**\n * Updates the effect with the current post process compile time values and recompiles the shader.\n * @param defines Define statements that should be added at the beginning of the shader. (default: null)\n * @param uniforms Set of uniform variables that will be passed to the shader. (default: null)\n * @param samplers Set of Texture2D variables that will be passed to the shader. (default: null)\n * @param indexParameters The index parameters to be used for babylons include syntax \"#include[0..varyingCount]\". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\n * @param onCompiled Called when the shader has been compiled.\n * @param onError Called if there is an error when compiling a shader.\n */\n updateEffect(e = null, t = null, i = null, r, s, a) {\n this._updateParameters(s, a);\n }\n _updateParameters(e, t) {\n const i = this._kernel, r = (i - 1) / 2;\n let s = [], a = [], o = 0;\n for (let m = 0; m < i; m++) {\n const v = m / (i - 1), E = this._gaussianWeight(v * 2 - 1);\n s[m] = m - r, a[m] = E, o += E;\n }\n for (let m = 0; m < a.length; m++)\n a[m] /= o;\n const l = [], c = [], h = [];\n for (let m = 0; m <= r; m += 2) {\n const v = Math.min(m + 1, Math.floor(r));\n if (m === v)\n h.push({ o: s[m], w: a[m] });\n else {\n const C = v === r, T = a[m] + a[v] * (C ? 0.5 : 1), R = s[m] + 1 / (1 + a[m] / a[v]);\n R === 0 ? (h.push({ o: s[m], w: a[m] }), h.push({ o: s[m + 1], w: a[m + 1] })) : (h.push({ o: R, w: T }), h.push({ o: -R, w: T }));\n }\n }\n for (let m = 0; m < h.length; m++)\n c[m] = h[m].o, l[m] = h[m].w;\n s = c, a = l;\n const u = this.getEngine().getCaps().maxVaryingVectors, f = Math.max(u, 0) - 1;\n let d = Math.min(s.length, f), p = \"\";\n p += this._staticDefines, this._staticDefines.indexOf(\"DOF\") != -1 && (p += `#define CENTER_WEIGHT ${this._glslFloat(a[d - 1])}\n`, d--);\n for (let m = 0; m < d; m++)\n p += `#define KERNEL_OFFSET${m} ${this._glslFloat(s[m])}\n`, p += `#define KERNEL_WEIGHT${m} ${this._glslFloat(a[m])}\n`;\n let g = 0;\n for (let m = f; m < s.length; m++)\n p += `#define KERNEL_DEP_OFFSET${g} ${this._glslFloat(s[m])}\n`, p += `#define KERNEL_DEP_WEIGHT${g} ${this._glslFloat(a[m])}\n`, g++;\n this.packedFloat && (p += \"#define PACKEDFLOAT 1\"), this._blockCompilation = !1, super.updateEffect(p, null, null, {\n varyingCount: d,\n depCount: g\n }, e, t);\n }\n /**\n * Best kernels are odd numbers that when divided by 2, their integer part is even, so 5, 9 or 13.\n * Other odd kernels optimize correctly but require proportionally more samples, even kernels are\n * possible but will produce minor visual artifacts. Since each new kernel requires a new shader we\n * want to minimize kernel changes, having gaps between physical kernels is helpful in that regard.\n * The gaps between physical kernels are compensated for in the weighting of the samples\n * @param idealKernel Ideal blur kernel.\n * @returns Nearest best kernel.\n */\n _nearestBestKernel(e) {\n const t = Math.round(e);\n for (const i of [t, t - 1, t + 1, t - 2, t + 2])\n if (i % 2 !== 0 && Math.floor(i / 2) % 2 === 0 && i > 0)\n return Math.max(i, 3);\n return Math.max(t, 3);\n }\n /**\n * Calculates the value of a Gaussian distribution with sigma 3 at a given point.\n * @param x The point on the Gaussian distribution to sample.\n * @returns the value of the Gaussian function at x.\n */\n _gaussianWeight(e) {\n const t = 0.3333333333333333, i = Math.sqrt(2 * Math.PI) * t, r = -(e * e / (2 * t * t));\n return 1 / i * Math.exp(r);\n }\n /**\n * Generates a string that can be used as a floating point number in GLSL.\n * @param x Value to print.\n * @param decimalFigures Number of decimal places to print the number to (excluding trailing 0s).\n * @returns GLSL float string.\n */\n _glslFloat(e, t = 8) {\n return e.toFixed(t).replace(/0+$/, \"\");\n }\n /**\n * @internal\n */\n static _Parse(e, t, i, r) {\n return Le.Parse(() => new Xa(e.name, e.direction, e.kernel, e.options, t, e.renderTargetSamplingMode, i.getEngine(), e.reusable, e.textureType, void 0, !1), e, i, r);\n }\n}\nP([\n w(\"kernel\")\n], Xa.prototype, \"_kernel\", void 0);\nP([\n w(\"packedFloat\")\n], Xa.prototype, \"_packedFloat\", void 0);\nP([\n X_()\n], Xa.prototype, \"direction\", void 0);\nRe(\"BABYLON.BlurPostProcess\", Xa);\nconst eF = \"bayerDitherFunctions\", tF = `float bayerDither2(vec2 _P) {return mod(2.0*_P.y+_P.x+1.0,4.0);}\nfloat bayerDither4(vec2 _P) {vec2 P1=mod(_P,2.0); \nvec2 P2=floor(0.5*mod(_P,4.0)); \nreturn 4.0*bayerDither2(P1)+bayerDither2(P2);}\nfloat bayerDither8(vec2 _P) {vec2 P1=mod(_P,2.0); \nvec2 P2=floor(0.5 *mod(_P,4.0)); \nvec2 P4=floor(0.25*mod(_P,8.0)); \nreturn 4.0*(4.0*bayerDither2(P1)+bayerDither2(P2))+bayerDither2(P4);}\n`;\nY.IncludesShadersStore[eF] = tF;\nconst iF = \"shadowMapFragmentExtraDeclaration\", rF = `#if SM_FLOAT==0\n#include\n#endif\n#if SM_SOFTTRANSPARENTSHADOW==1\n#include\nuniform float softTransparentShadowSM;\n#endif\nvarying float vDepthMetricSM;\n#if SM_USEDISTANCE==1\nuniform vec3 lightDataSM;varying vec3 vPositionWSM;\n#endif\nuniform vec3 biasAndScaleSM;uniform vec2 depthValuesSM;\n#if defined(SM_DEPTHCLAMP) && SM_DEPTHCLAMP==1\nvarying float zSM;\n#endif\n`;\nY.IncludesShadersStore[iF] = rF;\nconst sF = \"shadowMapFragment\", nF = `float depthSM=vDepthMetricSM;\n#if defined(SM_DEPTHCLAMP) && SM_DEPTHCLAMP==1\n#if SM_USEDISTANCE==1\ndepthSM=(length(vPositionWSM-lightDataSM)+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x;\n#else\n#ifdef USE_REVERSE_DEPTHBUFFER\ndepthSM=(-zSM+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x;\n#else\ndepthSM=(zSM+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x;\n#endif\n#endif\n#ifdef USE_REVERSE_DEPTHBUFFER\ngl_FragDepth=clamp(1.0-depthSM,0.0,1.0);\n#else\ngl_FragDepth=clamp(depthSM,0.0,1.0); \n#endif\n#elif SM_USEDISTANCE==1\ndepthSM=(length(vPositionWSM-lightDataSM)+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x;\n#endif\n#if SM_ESM==1\ndepthSM=clamp(exp(-min(87.,biasAndScaleSM.z*depthSM)),0.,1.);\n#endif\n#if SM_FLOAT==1\ngl_FragColor=vec4(depthSM,1.0,1.0,1.0);\n#else\ngl_FragColor=pack(depthSM);\n#endif\nreturn;`;\nY.IncludesShadersStore[sF] = nF;\nconst aF = \"shadowMapPixelShader\", oF = `#include\n#ifdef ALPHATEXTURE\nvarying vec2 vUV;uniform sampler2D diffuseSampler;\n#endif\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void)\n{\n#include\n#ifdef ALPHATEXTURE\nfloat alphaFromAlphaTexture=texture2D(diffuseSampler,vUV).a;\n#ifdef ALPHATESTVALUE\nif (alphaFromAlphaTexture=softTransparentShadowSM*alphaFromAlphaTexture) discard;\n#else\nif ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM) discard;\n#endif\n#endif\n#include\n}`;\nY.ShadersStore[aF] = oF;\nconst lF = \"sceneVertexDeclaration\", cF = `uniform mat4 viewProjection;\n#ifdef MULTIVIEW\nuniform mat4 viewProjectionR;\n#endif\nuniform mat4 view;uniform mat4 projection;uniform vec4 vEyePosition;\n`;\nY.IncludesShadersStore[lF] = cF;\nconst hF = \"meshVertexDeclaration\", uF = `uniform mat4 world;uniform float visibility;\n`;\nY.IncludesShadersStore[hF] = uF;\nconst fF = \"shadowMapVertexDeclaration\", dF = `#include\n#include\n`;\nY.IncludesShadersStore[fF] = dF;\nconst pF = \"shadowMapUboDeclaration\", gF = `layout(std140,column_major) uniform;\n#include\n#include\n`;\nY.IncludesShadersStore[pF] = gF;\nconst mF = \"shadowMapVertexExtraDeclaration\", _F = `#if SM_NORMALBIAS==1\nuniform vec3 lightDataSM;\n#endif\nuniform vec3 biasAndScaleSM;uniform vec2 depthValuesSM;varying float vDepthMetricSM;\n#if SM_USEDISTANCE==1\nvarying vec3 vPositionWSM;\n#endif\n#if defined(SM_DEPTHCLAMP) && SM_DEPTHCLAMP==1\nvarying float zSM;\n#endif\n`;\nY.IncludesShadersStore[mF] = _F;\nconst EF = \"shadowMapVertexNormalBias\", vF = `#if SM_NORMALBIAS==1\n#if SM_DIRECTIONINLIGHTDATA==1\nvec3 worldLightDirSM=normalize(-lightDataSM.xyz);\n#else\nvec3 directionToLightSM=lightDataSM.xyz-worldPos.xyz;vec3 worldLightDirSM=normalize(directionToLightSM);\n#endif\nfloat ndlSM=dot(vNormalW,worldLightDirSM);float sinNLSM=sqrt(1.0-ndlSM*ndlSM);float normalBiasSM=biasAndScaleSM.y*sinNLSM;worldPos.xyz-=vNormalW*normalBiasSM;\n#endif\n`;\nY.IncludesShadersStore[EF] = vF;\nconst TF = \"shadowMapVertexMetric\", xF = `#if SM_USEDISTANCE==1\nvPositionWSM=worldPos.xyz;\n#endif\n#if SM_DEPTHTEXTURE==1\n#ifdef IS_NDC_HALF_ZRANGE\n#define BIASFACTOR 0.5\n#else\n#define BIASFACTOR 1.0\n#endif\n#ifdef USE_REVERSE_DEPTHBUFFER\ngl_Position.z-=biasAndScaleSM.x*gl_Position.w*BIASFACTOR;\n#else\ngl_Position.z+=biasAndScaleSM.x*gl_Position.w*BIASFACTOR;\n#endif\n#endif\n#if defined(SM_DEPTHCLAMP) && SM_DEPTHCLAMP==1\nzSM=gl_Position.z;gl_Position.z=0.0;\n#elif SM_USEDISTANCE==0\n#ifdef USE_REVERSE_DEPTHBUFFER\nvDepthMetricSM=(-gl_Position.z+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x;\n#else\nvDepthMetricSM=(gl_Position.z+depthValuesSM.x)/depthValuesSM.y+biasAndScaleSM.x;\n#endif\n#endif\n`;\nY.IncludesShadersStore[TF] = xF;\nconst CF = \"shadowMapVertexShader\", RF = `attribute vec3 position;\n#ifdef NORMAL\nattribute vec3 normal;\n#endif\n#include\n#include\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef INSTANCES\nattribute vec4 world0;attribute vec4 world1;attribute vec4 world2;attribute vec4 world3;\n#endif\n#include\n#include<__decl__shadowMapVertex>\n#ifdef ALPHATEXTURE\nvarying vec2 vUV;uniform mat4 diffuseMatrix;\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#ifdef UV2\nattribute vec2 uv2;\n#endif\n#endif\n#include\n#include\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void)\n{vec3 positionUpdated=position;\n#ifdef UV1\nvec2 uvUpdated=uv;\n#endif\n#ifdef NORMAL\nvec3 normalUpdated=normal;\n#endif\n#include\n#include[0..maxSimultaneousMorphTargets]\n#include\n#include\n#include\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\n#ifdef NORMAL\nmat3 normWorldSM=mat3(finalWorld);\n#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvec3 vNormalW=normalUpdated/vec3(dot(normWorldSM[0],normWorldSM[0]),dot(normWorldSM[1],normWorldSM[1]),dot(normWorldSM[2],normWorldSM[2]));vNormalW=normalize(normWorldSM*vNormalW);\n#else\n#ifdef NONUNIFORMSCALING\nnormWorldSM=transposeMat3(inverseMat3(normWorldSM));\n#endif\nvec3 vNormalW=normalize(normWorldSM*normalUpdated);\n#endif\n#endif\n#include\ngl_Position=viewProjection*worldPos;\n#include\n#ifdef ALPHATEXTURE\n#ifdef UV1\nvUV=vec2(diffuseMatrix*vec4(uvUpdated,1.0,0.0));\n#endif\n#ifdef UV2\nvUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0));\n#endif\n#endif\n#include\n}`;\nY.ShadersStore[CF] = RF;\nconst SF = \"depthBoxBlurPixelShader\", yF = `varying vec2 vUV;uniform sampler2D textureSampler;uniform vec2 screenSize;\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void)\n{vec4 colorDepth=vec4(0.0);for (int x=-OFFSET; x<=OFFSET; x++)\nfor (int y=-OFFSET; y<=OFFSET; y++)\ncolorDepth+=texture2D(textureSampler,vUV+vec2(x,y)/screenSize);gl_FragColor=(colorDepth/float((OFFSET*2+1)*(OFFSET*2+1)));}`;\nY.ShadersStore[SF] = yF;\nconst IF = \"shadowMapFragmentSoftTransparentShadow\", bF = `#if SM_SOFTTRANSPARENTSHADOW==1\nif ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM*alpha) discard;\n#endif\n`;\nY.IncludesShadersStore[IF] = bF;\nvar Zg;\n(function(n) {\n n[n.ETC1S = 0] = \"ETC1S\", n[n.UASTC4x4 = 1] = \"UASTC4x4\";\n})(Zg || (Zg = {}));\nvar jg;\n(function(n) {\n n[n.ASTC_4X4_RGBA = 0] = \"ASTC_4X4_RGBA\", n[n.BC7_RGBA = 1] = \"BC7_RGBA\", n[n.BC3_RGBA = 2] = \"BC3_RGBA\", n[n.BC1_RGB = 3] = \"BC1_RGB\", n[n.PVRTC1_4_RGBA = 4] = \"PVRTC1_4_RGBA\", n[n.PVRTC1_4_RGB = 5] = \"PVRTC1_4_RGB\", n[n.ETC2_RGBA = 6] = \"ETC2_RGBA\", n[n.ETC1_RGB = 7] = \"ETC1_RGB\", n[n.RGBA32 = 8] = \"RGBA32\", n[n.R8 = 9] = \"R8\", n[n.RG8 = 10] = \"RG8\";\n})(jg || (jg = {}));\nvar Qg;\n(function(n) {\n n[n.COMPRESSED_RGBA_BPTC_UNORM_EXT = 36492] = \"COMPRESSED_RGBA_BPTC_UNORM_EXT\", n[n.COMPRESSED_RGBA_ASTC_4X4_KHR = 37808] = \"COMPRESSED_RGBA_ASTC_4X4_KHR\", n[n.COMPRESSED_RGB_S3TC_DXT1_EXT = 33776] = \"COMPRESSED_RGB_S3TC_DXT1_EXT\", n[n.COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779] = \"COMPRESSED_RGBA_S3TC_DXT5_EXT\", n[n.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 35842] = \"COMPRESSED_RGBA_PVRTC_4BPPV1_IMG\", n[n.COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 35840] = \"COMPRESSED_RGB_PVRTC_4BPPV1_IMG\", n[n.COMPRESSED_RGBA8_ETC2_EAC = 37496] = \"COMPRESSED_RGBA8_ETC2_EAC\", n[n.COMPRESSED_RGB8_ETC2 = 37492] = \"COMPRESSED_RGB8_ETC2\", n[n.COMPRESSED_RGB_ETC1_WEBGL = 36196] = \"COMPRESSED_RGB_ETC1_WEBGL\", n[n.RGBA8Format = 32856] = \"RGBA8Format\", n[n.R8Format = 33321] = \"R8Format\", n[n.RG8Format = 33323] = \"RG8Format\";\n})(Qg || (Qg = {}));\nvar Jg;\n(function(n) {\n class e {\n /**\n * Serialize the Alphabet to JSON string.\n * @returns JSON serialization\n */\n serialize() {\n const r = {}, s = new Array(this._characterToIdx.size);\n return this._characterToIdx.forEach((a, o) => {\n s[a] = o;\n }), r.characters = s, r.insertionCosts = this._insertionCosts, r.deletionCosts = this._deletionCosts, r.substitutionCosts = this._substitutionCosts, JSON.stringify(r);\n }\n /**\n * Parse an Alphabet from a JSON serialization.\n * @param json JSON string to deserialize\n * @returns deserialized Alphabet\n */\n static Deserialize(r) {\n const s = JSON.parse(r), a = new e(s.characters);\n return a._insertionCosts = s.insertionCosts, a._deletionCosts = s.deletionCosts, a._substitutionCosts = s.substitutionCosts, a;\n }\n /**\n * Create a new Alphabet.\n * @param characters characters of the alphabet\n * @param charToInsertionCost function mapping characters to insertion costs\n * @param charToDeletionCost function mapping characters to deletion costs\n * @param charsToSubstitutionCost function mapping character pairs to substitution costs\n */\n constructor(r, s = null, a = null, o = null) {\n s = s ?? (() => 1), a = a ?? (() => 1), o = o ?? ((c, h) => c === h ? 0 : 1), this._characterToIdx = /* @__PURE__ */ new Map(), this._insertionCosts = new Array(r.length), this._deletionCosts = new Array(r.length), this._substitutionCosts = new Array(r.length);\n let l;\n for (let c = 0; c < r.length; ++c) {\n l = r[c], this._characterToIdx.set(l, c), this._insertionCosts[c] = s(l), this._deletionCosts[c] = a(l), this._substitutionCosts[c] = new Array(r.length);\n for (let h = c; h < r.length; ++h)\n this._substitutionCosts[c][h] = o(l, r[h]);\n }\n }\n /**\n * Get the index (internally-assigned number) for a character.\n * @param char character\n * @returns index\n */\n getCharacterIdx(r) {\n return this._characterToIdx.get(r);\n }\n /**\n * Get the insertion cost of a character from its index.\n * @param idx character index\n * @returns insertion cost\n */\n getInsertionCost(r) {\n return this._insertionCosts[r];\n }\n /**\n * Get the deletion cost of a character from its index.\n * @param idx character index\n * @returns deletion cost\n */\n getDeletionCost(r) {\n return this._deletionCosts[r];\n }\n /**\n * Gets the cost to substitute two characters. NOTE: this cost is\n * required to be bi-directional, meaning it cannot matter which of\n * the provided characters is being removed and which is being inserted.\n * @param idx1 the first character index\n * @param idx2 the second character index\n * @returns substitution cost\n */\n getSubstitutionCost(r, s) {\n const a = Math.min(r, s), o = Math.max(r, s);\n return this._substitutionCosts[a][o];\n }\n }\n n.Alphabet = e;\n class t {\n /**\n * Serialize to JSON string. JSON representation does NOT include the Alphabet\n * from which this Sequence was created; Alphabet must be independently\n * serialized.\n * @returns JSON string\n */\n serialize() {\n return JSON.stringify(this._characters);\n }\n /**\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\n * from which the Sequence was originally created, which must be serialized and\n * deserialized independently so that it can be passed in here.\n * @param json JSON string representation of Sequence\n * @param alphabet Alphabet from which Sequence was originally created\n * @returns Sequence\n */\n static Deserialize(r, s) {\n const a = new t([], s);\n return a._characters = JSON.parse(r), a;\n }\n /**\n * Create a new Sequence.\n * @param characters characters in the new Sequence\n * @param alphabet Alphabet, which must include all used characters\n */\n constructor(r, s) {\n if (r.length > t._MAX_SEQUENCE_LENGTH)\n throw new Error(\"Sequences longer than \" + t._MAX_SEQUENCE_LENGTH + \" not supported.\");\n this._alphabet = s, this._characters = r.map((a) => this._alphabet.getCharacterIdx(a));\n }\n /**\n * Get the distance between this Sequence and another.\n * @param other sequence to compare to\n * @returns Levenshtein distance\n */\n distance(r) {\n return t._Distance(this, r);\n }\n /**\n * Compute the Levenshtein distance between two Sequences.\n * @param a first Sequence\n * @param b second Sequence\n * @returns Levenshtein distance\n */\n static _Distance(r, s) {\n const a = r._alphabet;\n if (a !== s._alphabet)\n throw new Error(\"Cannot Levenshtein compare Sequences built from different alphabets.\");\n const o = r._characters, l = s._characters, c = o.length, h = l.length, u = t._CostMatrix;\n u[0][0] = 0;\n for (let f = 0; f < c; ++f)\n u[f + 1][0] = u[f][0] + a.getInsertionCost(o[f]);\n for (let f = 0; f < h; ++f)\n u[0][f + 1] = u[0][f] + a.getInsertionCost(l[f]);\n for (let f = 0; f < c; ++f)\n for (let d = 0; d < h; ++d)\n t._InsertionCost = u[f + 1][d] + a.getInsertionCost(l[d]), t._DeletionCost = u[f][d + 1] + a.getDeletionCost(o[f]), t._SubstitutionCost = u[f][d] + a.getSubstitutionCost(o[f], l[d]), u[f + 1][d + 1] = Math.min(t._InsertionCost, t._DeletionCost, t._SubstitutionCost);\n return u[c][h];\n }\n }\n t._MAX_SEQUENCE_LENGTH = 256, t._CostMatrix = [...Array(t._MAX_SEQUENCE_LENGTH + 1)].map(() => new Array(t._MAX_SEQUENCE_LENGTH + 1)), n.Sequence = t;\n})(Jg || (Jg = {}));\nnew L();\nvar $g;\n(function(n) {\n n[n.INIT = 0] = \"INIT\", n[n.STARTED = 1] = \"STARTED\", n[n.ENDED = 2] = \"ENDED\";\n})($g || ($g = {}));\nconst AF = 1.5;\nclass Zs {\n /**\n * Creates a new DynamicFloat32Array with the desired item capacity.\n * @param itemCapacity The initial item capacity you would like to set for the array.\n */\n constructor(e) {\n this._view = new Float32Array(e), this._itemLength = 0;\n }\n /**\n * The number of items currently in the array.\n */\n get itemLength() {\n return this._itemLength;\n }\n /**\n * Gets value at index, NaN if no such index exists.\n * @param index the index to get the value at.\n * @returns the value at the index provided.\n */\n at(e) {\n return e < 0 || e >= this._itemLength ? NaN : this._view[e];\n }\n /**\n * Gets a view of the original array from start to end (exclusive of end).\n * @param start starting index.\n * @param end ending index.\n * @returns a subarray of the original array.\n */\n subarray(e, t) {\n return e >= t || e < 0 ? new Float32Array(0) : (t > this._itemLength && (t = this._itemLength), this._view.subarray(e, t));\n }\n /**\n * Pushes items to the end of the array.\n * @param item The item to push into the array.\n */\n push(e) {\n this._view[this._itemLength] = e, this._itemLength++, this._itemLength >= this._view.length && this._growArray();\n }\n /**\n * Grows the array by the growth factor when necessary.\n */\n _growArray() {\n const e = Math.floor(this._view.length * AF), t = new Float32Array(e);\n t.set(this._view), this._view = t;\n }\n}\nconst js = 1800, MF = 24, PF = \"0\", em = \"timestamp\", tm = \"numPoints\", OF = /\\r/g, jh = \"@\";\nclass Hr {\n /**\n * The offset for when actual data values start appearing inside a slice.\n */\n static get SliceDataOffset() {\n return 2;\n }\n /**\n * The offset for the value of the number of points inside a slice.\n */\n static get NumberOfPointsOffset() {\n return 1;\n }\n /**\n * Handles the creation of a performance viewer collector.\n * @param _scene the scene to collect on.\n * @param _enabledStrategyCallbacks the list of data to collect with callbacks for initialization purposes.\n */\n constructor(e, t) {\n this._scene = e, this._collectDataAtFrame = () => {\n const i = sr.Now - this._startingTimestamp, r = this.datasets.ids.length, s = this.datasets.startingIndices.itemLength;\n let a = 0;\n if (s > 0) {\n const o = this.datasets.startingIndices.at(s - 1);\n a = o + this.datasets.data.at(o + Hr.NumberOfPointsOffset) + Hr.SliceDataOffset;\n }\n if (this.datasets.startingIndices.push(a), this.datasets.data.push(i), this.datasets.data.push(r), this.datasets.ids.forEach((o) => {\n const l = this._strategies.get(o);\n l && this.datasets.data.push(l.getData());\n }), this.datasetObservable.hasObservers()) {\n const o = [i, r];\n for (let l = 0; l < r; l++)\n o.push(this.datasets.data.at(a + Hr.SliceDataOffset + l));\n this.datasetObservable.notifyObservers(o);\n }\n }, this.datasets = {\n ids: [],\n data: new Zs(js),\n startingIndices: new Zs(js)\n }, this._strategies = /* @__PURE__ */ new Map(), this._datasetMeta = /* @__PURE__ */ new Map(), this._eventRestoreSet = /* @__PURE__ */ new Set(), this._customEventObservable = new he(), this.datasetObservable = new he(), this.metadataObservable = new he((i) => i.callback(this._datasetMeta, new P_(0))), t && this.addCollectionStrategies(...t);\n }\n /**\n * Registers a custom string event which will be callable via sendEvent. This method returns an event object which will contain the id of the event.\n * The user can set a value optionally, which will be used in the sendEvent method. If the value is set, we will record this value at the end of each frame,\n * if not we will increment our counter and record the value of the counter at the end of each frame. The value recorded is 0 if no sendEvent method is called, within a frame.\n * @param name The name of the event to register\n * @param forceUpdate if the code should force add an event, and replace the last one.\n * @param category the category for that event\n * @returns The event registered, used in sendEvent\n */\n registerEvent(e, t, i) {\n var a;\n if (this._strategies.has(e) && !t)\n return;\n this._strategies.has(e) && t && ((a = this._strategies.get(e)) == null || a.dispose(), this._strategies.delete(e));\n const r = (o) => {\n let l = 0, c = 0;\n const h = o.onAfterRenderObservable.add(() => {\n c = l, l = 0;\n }), u = this._customEventObservable.add((f) => {\n e === f.name && (f.value !== void 0 ? l = f.value : l++);\n });\n return {\n id: e,\n getData: () => c,\n dispose: () => {\n o.onAfterRenderObservable.remove(h), this._customEventObservable.remove(u);\n }\n };\n }, s = {\n name: e\n };\n return this._eventRestoreSet.add(e), this.addCollectionStrategies({ strategyCallback: r, category: i }), s;\n }\n /**\n * Lets the perf collector handle an event, occurences or event value depending on if the event.value params is set.\n * @param event the event to handle an occurence for\n */\n sendEvent(e) {\n this._customEventObservable.notifyObservers(e);\n }\n /**\n * This event restores all custom string events if necessary.\n */\n _restoreStringEvents() {\n this._eventRestoreSet.size !== this._customEventObservable.observers.length && this._eventRestoreSet.forEach((e) => {\n this.registerEvent(e, !0);\n });\n }\n /**\n * This method adds additional collection strategies for data collection purposes.\n * @param strategyCallbacks the list of data to collect with callbacks.\n */\n addCollectionStrategies(...e) {\n for (let { strategyCallback: t, category: i, hidden: r } of e) {\n const s = t(this._scene);\n if (this._strategies.has(s.id)) {\n s.dispose();\n continue;\n }\n this.datasets.ids.push(s.id), i && (i = i.replace(new RegExp(jh, \"g\"), \"\")), this._datasetMeta.set(s.id, {\n color: this._getHexColorFromId(s.id),\n category: i,\n hidden: r\n }), this._strategies.set(s.id, s);\n }\n this.metadataObservable.notifyObservers(this._datasetMeta);\n }\n /**\n * Gets a 6 character hexcode representing the colour from a passed in string.\n * @param id the string to get a hex code for.\n * @returns a hexcode hashed from the id.\n */\n _getHexColorFromId(e) {\n let t = 0;\n for (let r = 0; r < e.length; r++)\n t = e.charCodeAt(r) + ((t << 5) - t);\n let i = \"#\";\n for (let r = 0; r < MF; r += 8) {\n const s = t >> r & 255;\n i += (PF + s.toString(16)).substr(-2);\n }\n return i;\n }\n /**\n * Collects and then sends the latest slice to any observers by using the appropriate strategy when the user wants.\n * The slice will be of the form [timestamp, numberOfPoints, value1, value2...]\n * This method does not add onto the collected data accessible via the datasets variable.\n */\n getCurrentSlice() {\n const e = sr.Now - this._startingTimestamp, t = this.datasets.ids.length, i = [e, t];\n this.datasets.ids.forEach((r) => {\n const s = this._strategies.get(r);\n s && this.datasetObservable.hasObservers() && i.push(s.getData());\n }), this.datasetObservable.hasObservers() && this.datasetObservable.notifyObservers(i);\n }\n /**\n * Updates a property for a dataset's metadata with the value provided.\n * @param id the id of the dataset which needs its metadata updated.\n * @param prop the property to update.\n * @param value the value to update the property with.\n */\n updateMetadata(e, t, i) {\n const r = this._datasetMeta.get(e);\n r && (r[t] = i, this.metadataObservable.notifyObservers(this._datasetMeta));\n }\n /**\n * Completely clear, data, ids, and strategies saved to this performance collector.\n * @param preserveStringEventsRestore if it should preserve the string events, by default will clear string events registered when called.\n */\n clear(e) {\n this.datasets.data = new Zs(js), this.datasets.ids.length = 0, this.datasets.startingIndices = new Zs(js), this._datasetMeta.clear(), this._strategies.forEach((t) => t.dispose()), this._strategies.clear(), e || this._eventRestoreSet.clear(), this._hasLoadedData = !1;\n }\n /**\n * Accessor which lets the caller know if the performance collector has data loaded from a file or not!\n * Call clear() to reset this value.\n * @returns true if the data is loaded from a file, false otherwise.\n */\n get hasLoadedData() {\n return this._hasLoadedData;\n }\n /**\n * Given a string containing file data, this function parses the file data into the datasets object.\n * It returns a boolean to indicate if this object was successfully loaded with the data.\n * @param data string content representing the file data.\n * @param keepDatasetMeta if it should use reuse the existing dataset metadata\n * @returns true if the data was successfully loaded, false otherwise.\n */\n loadFromFileData(e, t) {\n const i = e.replace(OF, \"\").split(`\n`).map((u) => u.split(\",\").filter((f) => f.length > 0)).filter((u) => u.length > 0), r = 0, s = Hr.NumberOfPointsOffset;\n if (i.length < 2)\n return !1;\n const a = {\n ids: [],\n data: new Zs(js),\n startingIndices: new Zs(js)\n }, [o, ...l] = i;\n if (o.length < 2 || o[r] !== em || o[s] !== tm)\n return !1;\n const c = /* @__PURE__ */ new Map();\n for (let u = Hr.SliceDataOffset; u < o.length; u++) {\n const [f, d] = o[u].split(jh);\n a.ids.push(f), c.set(f, d);\n }\n let h = 0;\n for (const u of l) {\n if (u.length < 2)\n return !1;\n const f = parseFloat(u[r]), d = parseInt(u[s]);\n if (isNaN(d) || isNaN(f) || (a.data.push(f), a.data.push(d), d + Hr.SliceDataOffset !== u.length))\n return !1;\n for (let p = Hr.SliceDataOffset; p < u.length; p++) {\n const g = parseFloat(u[p]);\n if (isNaN(g))\n return !1;\n a.data.push(g);\n }\n a.startingIndices.push(h), h += u.length;\n }\n if (this.datasets.ids = a.ids, this.datasets.data = a.data, this.datasets.startingIndices = a.startingIndices, t || this._datasetMeta.clear(), this._strategies.forEach((u) => u.dispose()), this._strategies.clear(), !t)\n for (const u of this.datasets.ids) {\n const f = c.get(u);\n this._datasetMeta.set(u, { category: f, color: this._getHexColorFromId(u) });\n }\n return this.metadataObservable.notifyObservers(this._datasetMeta), this._hasLoadedData = !0, !0;\n }\n /**\n * Exports the datasets inside of the collector to a csv.\n */\n exportDataToCsv() {\n let e = \"\";\n e += `${em},${tm}`;\n for (let i = 0; i < this.datasets.ids.length; i++)\n if (e += `,${this.datasets.ids[i]}`, this._datasetMeta) {\n const r = this._datasetMeta.get(this.datasets.ids[i]);\n r != null && r.category && (e += `${jh}${r.category}`);\n }\n e += `\n`;\n for (let i = 0; i < this.datasets.startingIndices.itemLength; i++) {\n const r = this.datasets.startingIndices.at(i), s = this.datasets.data.at(r), a = this.datasets.data.at(r + Hr.NumberOfPointsOffset);\n e += `${s},${a}`;\n for (let o = 0; o < a; o++)\n e += `,${this.datasets.data.at(r + Hr.SliceDataOffset + o)}`;\n for (let o = 0; o < this.datasets.ids.length - a; o++)\n e += \",\";\n e += `\n`;\n }\n const t = `${(/* @__PURE__ */ new Date()).toISOString()}-perfdata.csv`;\n ge.Download(new Blob([e], { type: \"text/csv\" }), t);\n }\n /**\n * Starts the realtime collection of data.\n * @param shouldPreserve optional boolean param, if set will preserve the dataset between calls of start.\n */\n start(e) {\n e ? this._startingTimestamp === void 0 && (this._startingTimestamp = sr.Now) : (this.datasets.data = new Zs(js), this.datasets.startingIndices = new Zs(js), this._startingTimestamp = sr.Now), this._scene.onAfterRenderObservable.add(this._collectDataAtFrame), this._restoreStringEvents(), this._isStarted = !0;\n }\n /**\n * Stops the collection of data.\n */\n stop() {\n this._scene.onAfterRenderObservable.removeCallback(this._collectDataAtFrame), this._isStarted = !1;\n }\n /**\n * Returns if the perf collector has been started or not.\n */\n get isStarted() {\n return this._isStarted;\n }\n /**\n * Disposes of the object\n */\n dispose() {\n this._scene.onAfterRenderObservable.removeCallback(this._collectDataAtFrame), this._datasetMeta.clear(), this._strategies.forEach((e) => {\n e.dispose();\n }), this.datasetObservable.clear(), this.metadataObservable.clear(), this._isStarted = !1, this.datasets = null;\n }\n}\nOt.prototype.getPerfCollector = function() {\n return this._perfCollector || (this._perfCollector = new Hr(this)), this._perfCollector;\n};\nfunction DF(n) {\n const e = new Array(), t = new Array(), i = new Array(), r = n.add(() => {\n const a = e.length;\n for (let o = 0; o < a; o++)\n rc(e.shift(), t.shift(), i.shift());\n });\n return {\n scheduler: (a, o, l) => {\n e.push(a), t.push(o), i.push(l);\n },\n dispose: () => {\n n.remove(r);\n }\n };\n}\nhe.prototype.runCoroutineAsync = function(n) {\n if (!this._coroutineScheduler) {\n const e = DF(this);\n this._coroutineScheduler = e.scheduler, this._coroutineSchedulerDispose = e.dispose;\n }\n return j_(n, this._coroutineScheduler);\n};\nhe.prototype.cancelAllCoroutines = function() {\n this._coroutineSchedulerDispose && this._coroutineSchedulerDispose(), this._coroutineScheduler = void 0, this._coroutineSchedulerDispose = void 0;\n};\nconst NF = \"copyTextureToTexturePixelShader\", FF = `uniform float conversion;uniform sampler2D textureSampler;varying vec2 vUV;\n#include\nvoid main(void) \n{vec4 color=texture2D(textureSampler,vUV);\n#ifdef DEPTH_TEXTURE\ngl_FragDepth=color.r;\n#else\nif (conversion==1.) {color=toLinearSpace(color);} else if (conversion==2.) {color=toGammaSpace(color);}\ngl_FragColor=color;\n#endif\n}\n`;\nY.ShadersStore[NF] = FF;\nvar im;\n(function(n) {\n n[n.None = 0] = \"None\", n[n.ToLinearSpace = 1] = \"ToLinearSpace\", n[n.ToGammaSpace = 2] = \"ToGammaSpace\";\n})(im || (im = {}));\nXo.prototype.removeReflectionProbe = function(n) {\n if (!this.reflectionProbes)\n return -1;\n const e = this.reflectionProbes.indexOf(n);\n return e !== -1 && this.reflectionProbes.splice(e, 1), e;\n};\nXo.prototype.addReflectionProbe = function(n) {\n this.reflectionProbes || (this.reflectionProbes = []), this.reflectionProbes.push(n);\n};\nclass Yc {\n /**\n * Creates a new reflection probe\n * @param name defines the name of the probe\n * @param size defines the texture resolution (for each face)\n * @param scene defines the hosting scene\n * @param generateMipMaps defines if mip maps should be generated automatically (true by default)\n * @param useFloat defines if HDR data (float data) should be used to store colors (false by default)\n * @param linearSpace defines if the probe should be generated in linear space or not (false by default)\n */\n constructor(e, t, i, r = !0, s = !1, a = !1) {\n if (this.name = e, this._viewMatrix = L.Identity(), this._target = _.Zero(), this._add = _.Zero(), this._invertYAxis = !1, this.position = _.Zero(), this.metadata = null, this._parentContainer = null, this._scene = i, i.getEngine().supportsUniformBuffers) {\n this._sceneUBOs = [];\n for (let h = 0; h < 6; ++h)\n this._sceneUBOs.push(i.createSceneUniformBuffer(`Scene for Reflection Probe (name \"${e}\") face #${h}`));\n }\n this._scene.reflectionProbes || (this._scene.reflectionProbes = []), this._scene.reflectionProbes.push(this);\n let o = 0;\n if (s) {\n const h = this._scene.getEngine().getCaps();\n h.textureHalfFloatRender ? o = 2 : h.textureFloatRender && (o = 1);\n }\n this._renderTargetTexture = new gr(e, t, i, r, !0, o, !0), this._renderTargetTexture.gammaSpace = !a, this._renderTargetTexture.invertZ = i.useRightHandedSystem;\n const l = i.getEngine().useReverseDepthBuffer;\n this._renderTargetTexture.onBeforeRenderObservable.add((h) => {\n switch (this._sceneUBOs && (i.setSceneUniformBuffer(this._sceneUBOs[h]), i.getSceneUniformBuffer().unbindEffect()), h) {\n case 0:\n this._add.copyFromFloats(1, 0, 0);\n break;\n case 1:\n this._add.copyFromFloats(-1, 0, 0);\n break;\n case 2:\n this._add.copyFromFloats(0, this._invertYAxis ? 1 : -1, 0);\n break;\n case 3:\n this._add.copyFromFloats(0, this._invertYAxis ? -1 : 1, 0);\n break;\n case 4:\n this._add.copyFromFloats(0, 0, i.useRightHandedSystem ? -1 : 1);\n break;\n case 5:\n this._add.copyFromFloats(0, 0, i.useRightHandedSystem ? 1 : -1);\n break;\n }\n this._attachedMesh && this.position.copyFrom(this._attachedMesh.getAbsolutePosition()), this.position.addToRef(this._add, this._target);\n const u = i.useRightHandedSystem ? L.LookAtRHToRef : L.LookAtLHToRef, f = i.useRightHandedSystem ? L.PerspectiveFovRH : L.PerspectiveFovLH;\n u(this.position, this._target, _.Up(), this._viewMatrix), i.activeCamera && (this._projectionMatrix = f(Math.PI / 2, 1, l ? i.activeCamera.maxZ : i.activeCamera.minZ, l ? i.activeCamera.minZ : i.activeCamera.maxZ, this._scene.getEngine().isNDCHalfZRange), i.setTransformMatrix(this._viewMatrix, this._projectionMatrix), i.activeCamera.isRigCamera && !this._renderTargetTexture.activeCamera && (this._renderTargetTexture.activeCamera = i.activeCamera.rigParent || null)), i._forcedViewPosition = this.position;\n });\n let c;\n this._renderTargetTexture.onBeforeBindObservable.add(() => {\n var h, u;\n this._currentSceneUBO = i.getSceneUniformBuffer(), (u = (h = i.getEngine())._debugPushGroup) == null || u.call(h, `reflection probe generation for ${e}`, 1), c = this._scene.imageProcessingConfiguration.applyByPostProcess, a && (i.imageProcessingConfiguration.applyByPostProcess = !0);\n }), this._renderTargetTexture.onAfterUnbindObservable.add(() => {\n var h, u;\n i.imageProcessingConfiguration.applyByPostProcess = c, i._forcedViewPosition = null, this._sceneUBOs && i.setSceneUniformBuffer(this._currentSceneUBO), i.updateTransformMatrix(!0), (u = (h = i.getEngine())._debugPopGroup) == null || u.call(h, 1);\n });\n }\n /** Gets or sets the number of samples to use for multi-sampling (0 by default). Required WebGL2 */\n get samples() {\n return this._renderTargetTexture.samples;\n }\n set samples(e) {\n this._renderTargetTexture.samples = e;\n }\n /** Gets or sets the refresh rate to use (on every frame by default) */\n get refreshRate() {\n return this._renderTargetTexture.refreshRate;\n }\n set refreshRate(e) {\n this._renderTargetTexture.refreshRate = e;\n }\n /**\n * Gets the hosting scene\n * @returns a Scene\n */\n getScene() {\n return this._scene;\n }\n /** Gets the internal CubeTexture used to render to */\n get cubeTexture() {\n return this._renderTargetTexture;\n }\n /** Gets or sets the list of meshes to render */\n get renderList() {\n return this._renderTargetTexture.renderList;\n }\n set renderList(e) {\n this._renderTargetTexture.renderList = e;\n }\n /**\n * Attach the probe to a specific mesh (Rendering will be done from attached mesh's position)\n * @param mesh defines the mesh to attach to\n */\n attachToMesh(e) {\n this._attachedMesh = e;\n }\n /**\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups\n * @param renderingGroupId The rendering group id corresponding to its index\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\n */\n setRenderingAutoClearDepthStencil(e, t) {\n this._renderTargetTexture.setRenderingAutoClearDepthStencil(e, t);\n }\n /**\n * Clean all associated resources\n */\n dispose() {\n const e = this._scene.reflectionProbes.indexOf(this);\n if (e !== -1 && this._scene.reflectionProbes.splice(e, 1), this._parentContainer) {\n const t = this._parentContainer.reflectionProbes.indexOf(this);\n t > -1 && this._parentContainer.reflectionProbes.splice(t, 1), this._parentContainer = null;\n }\n if (this._renderTargetTexture && (this._renderTargetTexture.dispose(), this._renderTargetTexture = null), this._sceneUBOs) {\n for (const t of this._sceneUBOs)\n t.dispose();\n this._sceneUBOs = [];\n }\n }\n /**\n * Converts the reflection probe information to a readable string for debug purpose.\n * @param fullDetails Supports for multiple levels of logging within scene loading\n * @returns the human readable reflection probe info\n */\n toString(e) {\n let t = \"Name: \" + this.name;\n return e && (t += \", position: \" + this.position.toString(), this._attachedMesh && (t += \", attached mesh: \" + this._attachedMesh.name)), t;\n }\n /**\n * Get the class name of the refection probe.\n * @returns \"ReflectionProbe\"\n */\n getClassName() {\n return \"ReflectionProbe\";\n }\n /**\n * Serialize the reflection probe to a JSON representation we can easily use in the respective Parse function.\n * @returns The JSON representation of the texture\n */\n serialize() {\n const e = Le.Serialize(this, this._renderTargetTexture.serialize());\n return e.isReflectionProbe = !0, e.metadata = this.metadata, e;\n }\n /**\n * Parse the JSON representation of a reflection probe in order to recreate the reflection probe in the given scene.\n * @param parsedReflectionProbe Define the JSON representation of the reflection probe\n * @param scene Define the scene the parsed reflection probe should be instantiated in\n * @param rootUrl Define the root url of the parsing sequence in the case of relative dependencies\n * @returns The parsed reflection probe if successful\n */\n static Parse(e, t, i) {\n let r = null;\n if (t.reflectionProbes)\n for (let s = 0; s < t.reflectionProbes.length; s++) {\n const a = t.reflectionProbes[s];\n if (a.name === e.name) {\n r = a;\n break;\n }\n }\n return r = Le.Parse(() => r || new Yc(e.name, e.renderTargetSize, t, e._generateMipMaps), e, t, i), r.cubeTexture._waitingRenderList = e.renderList, e._attachedMesh && r.attachToMesh(t.getMeshById(e._attachedMesh)), e.metadata && (r.metadata = e.metadata), r;\n }\n}\nP([\n yy()\n], Yc.prototype, \"_attachedMesh\", void 0);\nP([\n hn()\n], Yc.prototype, \"position\", void 0);\nclass LF {\n /**\n * Creates a new instance of the component for the given scene\n * @param scene Defines the scene to register the component in\n */\n constructor(e) {\n this.name = ke.NAME_PROCEDURALTEXTURE, this.scene = e, this.scene.proceduralTextures = [];\n }\n /**\n * Registers the component in a given scene\n */\n register() {\n this.scene._beforeClearStage.registerStep(ke.STEP_BEFORECLEAR_PROCEDURALTEXTURE, this, this._beforeClear);\n }\n /**\n * Rebuilds the elements related to this component in case of\n * context lost for instance.\n */\n rebuild() {\n }\n /**\n * Disposes the component and the associated resources.\n */\n dispose() {\n }\n _beforeClear() {\n if (this.scene.proceduralTexturesEnabled) {\n ge.StartPerformanceCounter(\"Procedural textures\", this.scene.proceduralTextures.length > 0);\n for (let e = 0; e < this.scene.proceduralTextures.length; e++) {\n const t = this.scene.proceduralTextures[e];\n t._shouldRender() && t.render();\n }\n ge.EndPerformanceCounter(\"Procedural textures\", this.scene.proceduralTextures.length > 0);\n }\n }\n}\nconst wF = \"proceduralVertexShader\", UF = `attribute vec2 position;varying vec2 vPosition;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5);\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvPosition=position;vUV=position*madd+madd;gl_Position=vec4(position,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\nY.ShadersStore[wF] = UF;\nclass dn extends le {\n /**\n * Instantiates a new procedural texture.\n * Procedural texturing is a way to programmatically create a texture. There are 2 types of procedural textures: code-only, and code that references some classic 2D images, sometimes called 'refMaps' or 'sampler' images.\n * This is the base class of any Procedural texture and contains most of the shareable code.\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures\n * @param name Define the name of the texture\n * @param size Define the size of the texture to create\n * @param fragment Define the fragment shader to use to generate the texture or null if it is defined later:\n * * object: \\{ fragmentElement: \"fragmentShaderCode\" \\}, used with shader code in script tags\n * * object: \\{ fragmentSource: \"fragment shader code string\" \\}, the string contains the shader code\n * * string: the string contains a name \"XXX\" to lookup in Effect.ShadersStore[\"XXXFragmentShader\"]\n * @param scene Define the scene the texture belongs to\n * @param fallbackTexture Define a fallback texture in case there were issues to create the custom texture\n * @param generateMipMaps Define if the texture should creates mip maps or not\n * @param isCube Define if the texture is a cube texture or not (this will render each faces of the cube)\n * @param textureType The FBO internal texture type\n */\n constructor(e, t, i, r, s = null, a = !0, o = !1, l = 0) {\n super(null, r, !a), this.isEnabled = !0, this.autoClear = !0, this.onGeneratedObservable = new he(), this.onBeforeGenerationObservable = new he(), this.nodeMaterialSource = null, this._textures = {}, this._currentRefreshId = -1, this._frameId = -1, this._refreshRate = 1, this._vertexBuffers = {}, this._uniforms = new Array(), this._samplers = new Array(), this._floats = {}, this._ints = {}, this._floatsArrays = {}, this._colors3 = {}, this._colors4 = {}, this._vectors2 = {}, this._vectors3 = {}, this._matrices = {}, this._fallbackTextureUsed = !1, this._cachedDefines = null, this._contentUpdateId = -1, this._rtWrapper = null, s !== null && !(s instanceof le) ? (this._options = s, this._fallbackTexture = s.fallbackTexture ?? null) : (this._options = {}, this._fallbackTexture = s), r = this.getScene() || st.LastCreatedScene;\n let c = r._getComponent(ke.NAME_PROCEDURALTEXTURE);\n c || (c = new LF(r), r._addComponent(c)), r.proceduralTextures.push(this), this._fullEngine = r.getEngine(), this.name = e, this.isRenderTarget = !0, this._size = t, this._textureType = l, this._generateMipMaps = a, this._drawWrapper = new ka(this._fullEngine), this.setFragment(i);\n const h = this._createRtWrapper(o, t, a, l);\n this._texture = h.texture;\n const u = [];\n u.push(1, 1), u.push(-1, 1), u.push(-1, -1), u.push(1, -1), this._vertexBuffers[I.PositionKind] = new I(this._fullEngine, u, I.PositionKind, !1, !1, 2), this._createIndexBuffer();\n }\n _createRtWrapper(e, t, i, r) {\n return e ? (this._rtWrapper = this._fullEngine.createRenderTargetCubeTexture(t, {\n generateMipMaps: i,\n generateDepthBuffer: !1,\n generateStencilBuffer: !1,\n type: r,\n ...this._options\n }), this.setFloat(\"face\", 0)) : this._rtWrapper = this._fullEngine.createRenderTargetTexture(t, {\n generateMipMaps: i,\n generateDepthBuffer: !1,\n generateStencilBuffer: !1,\n type: r,\n ...this._options\n }), this._rtWrapper;\n }\n /**\n * The effect that is created when initializing the post process.\n * @returns The created effect corresponding the postprocess.\n */\n getEffect() {\n return this._drawWrapper.effect;\n }\n /**\n * @internal\n */\n _setEffect(e) {\n this._drawWrapper.effect = e;\n }\n /**\n * Gets texture content (Use this function wisely as reading from a texture can be slow)\n * @returns an ArrayBufferView promise (Uint8Array or Float32Array)\n */\n getContent() {\n return this._contentData && this._frameId === this._contentUpdateId ? this._contentData : (this._contentData ? this._contentData.then((e) => {\n this._contentData = this.readPixels(0, 0, e), this._contentUpdateId = this._frameId;\n }) : (this._contentData = this.readPixels(0, 0), this._contentUpdateId = this._frameId), this._contentData);\n }\n _createIndexBuffer() {\n const e = this._fullEngine, t = [];\n t.push(0), t.push(1), t.push(2), t.push(0), t.push(2), t.push(3), this._indexBuffer = e.createIndexBuffer(t);\n }\n /** @internal */\n _rebuild() {\n const e = this._vertexBuffers[I.PositionKind];\n e && e._rebuild(), this._createIndexBuffer(), this.refreshRate === gr.REFRESHRATE_RENDER_ONCE && (this.refreshRate = gr.REFRESHRATE_RENDER_ONCE);\n }\n /**\n * Resets the texture in order to recreate its associated resources.\n * This can be called in case of context loss or if you change the shader code and need to regenerate the texture with the new code\n */\n reset() {\n var e;\n (e = this._drawWrapper.effect) == null || e.dispose(), this._drawWrapper.effect = null, this._cachedDefines = null;\n }\n _getDefines() {\n return \"\";\n }\n /**\n * Executes a function when the texture will be ready to be drawn.\n * @param func The callback to be used.\n */\n executeWhenReady(e) {\n if (this.isReady()) {\n e(this);\n return;\n }\n const t = this.getEffect();\n t && t.executeWhenCompiled(() => {\n e(this);\n });\n }\n /**\n * Is the texture ready to be used ? (rendered at least once)\n * @returns true if ready, otherwise, false.\n */\n isReady() {\n const e = this._fullEngine;\n if (this.nodeMaterialSource)\n return this._drawWrapper.effect.isReady();\n if (!this._fragment)\n return !1;\n if (this._fallbackTextureUsed)\n return !0;\n if (!this._texture)\n return !1;\n const t = this._getDefines();\n if (this._drawWrapper.effect && t === this._cachedDefines && this._drawWrapper.effect.isReady())\n return !0;\n const i = {\n vertex: \"procedural\",\n fragmentElement: this._fragment.fragmentElement,\n fragmentSource: this._fragment.fragmentSource,\n fragment: typeof this._fragment == \"string\" ? this._fragment : void 0\n };\n return this._cachedDefines !== t && (this._cachedDefines = t, this._drawWrapper.effect = e.createEffect(i, [I.PositionKind], this._uniforms, this._samplers, t, void 0, void 0, () => {\n var r;\n (r = this._rtWrapper) == null || r.dispose(), this._rtWrapper = this._texture = null, this._fallbackTexture && (this._texture = this._fallbackTexture._texture, this._texture && this._texture.incrementReferences()), this._fallbackTextureUsed = !0;\n })), this._drawWrapper.effect.isReady();\n }\n /**\n * Resets the refresh counter of the texture and start bak from scratch.\n * Could be useful to regenerate the texture if it is setup to render only once.\n */\n resetRefreshCounter() {\n this._currentRefreshId = -1;\n }\n /**\n * Set the fragment shader to use in order to render the texture.\n * @param fragment This can be set to a path (into the shader store) or to a json object containing a fragmentElement property.\n */\n setFragment(e) {\n this._fragment = e;\n }\n /**\n * Define the refresh rate of the texture or the rendering frequency.\n * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...\n */\n get refreshRate() {\n return this._refreshRate;\n }\n set refreshRate(e) {\n this._refreshRate = e, this.resetRefreshCounter();\n }\n /** @internal */\n _shouldRender() {\n return !this.isEnabled || !this.isReady() || !this._texture ? (this._texture && (this._texture.isReady = !1), !1) : this._fallbackTextureUsed ? !1 : this._currentRefreshId === -1 ? (this._currentRefreshId = 1, this._frameId++, !0) : this.refreshRate === this._currentRefreshId ? (this._currentRefreshId = 1, this._frameId++, !0) : (this._currentRefreshId++, !1);\n }\n /**\n * Get the size the texture is rendering at.\n * @returns the size (on cube texture it is always squared)\n */\n getRenderSize() {\n return this._size;\n }\n /**\n * Resize the texture to new value.\n * @param size Define the new size the texture should have\n * @param generateMipMaps Define whether the new texture should create mip maps\n */\n resize(e, t) {\n if (this._fallbackTextureUsed || !this._rtWrapper || !this._texture)\n return;\n const i = this._texture.isCube;\n this._rtWrapper.dispose();\n const r = this._createRtWrapper(i, e, t, this._textureType);\n this._texture = r.texture, this._size = e, this._generateMipMaps = t;\n }\n _checkUniform(e) {\n this._uniforms.indexOf(e) === -1 && this._uniforms.push(e);\n }\n /**\n * Set a texture in the shader program used to render.\n * @param name Define the name of the uniform samplers as defined in the shader\n * @param texture Define the texture to bind to this sampler\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setTexture(e, t) {\n return this._samplers.indexOf(e) === -1 && this._samplers.push(e), this._textures[e] = t, this;\n }\n /**\n * Set a float in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setFloat(e, t) {\n return this._checkUniform(e), this._floats[e] = t, this;\n }\n /**\n * Set a int in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setInt(e, t) {\n return this._checkUniform(e), this._ints[e] = t, this;\n }\n /**\n * Set an array of floats in the shader.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setFloats(e, t) {\n return this._checkUniform(e), this._floatsArrays[e] = t, this;\n }\n /**\n * Set a vec3 in the shader from a Color3.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setColor3(e, t) {\n return this._checkUniform(e), this._colors3[e] = t, this;\n }\n /**\n * Set a vec4 in the shader from a Color4.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setColor4(e, t) {\n return this._checkUniform(e), this._colors4[e] = t, this;\n }\n /**\n * Set a vec2 in the shader from a Vector2.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setVector2(e, t) {\n return this._checkUniform(e), this._vectors2[e] = t, this;\n }\n /**\n * Set a vec3 in the shader from a Vector3.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setVector3(e, t) {\n return this._checkUniform(e), this._vectors3[e] = t, this;\n }\n /**\n * Set a mat4 in the shader from a MAtrix.\n * @param name Define the name of the uniform as defined in the shader\n * @param value Define the value to give to the uniform\n * @returns the texture itself allowing \"fluent\" like uniform updates\n */\n setMatrix(e, t) {\n return this._checkUniform(e), this._matrices[e] = t, this;\n }\n /**\n * Render the texture to its associated render target.\n * @param useCameraPostProcess Define if camera post process should be applied to the texture\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n render(e) {\n var s, a;\n const t = this.getScene();\n if (!t)\n return;\n const i = this._fullEngine;\n if (i.enableEffect(this._drawWrapper), this.onBeforeGenerationObservable.notifyObservers(this), i.setState(!1), !this.nodeMaterialSource) {\n for (const o in this._textures)\n this._drawWrapper.effect.setTexture(o, this._textures[o]);\n for (const o in this._ints)\n this._drawWrapper.effect.setInt(o, this._ints[o]);\n for (const o in this._floats)\n this._drawWrapper.effect.setFloat(o, this._floats[o]);\n for (const o in this._floatsArrays)\n this._drawWrapper.effect.setArray(o, this._floatsArrays[o]);\n for (const o in this._colors3)\n this._drawWrapper.effect.setColor3(o, this._colors3[o]);\n for (const o in this._colors4) {\n const l = this._colors4[o];\n this._drawWrapper.effect.setFloat4(o, l.r, l.g, l.b, l.a);\n }\n for (const o in this._vectors2)\n this._drawWrapper.effect.setVector2(o, this._vectors2[o]);\n for (const o in this._vectors3)\n this._drawWrapper.effect.setVector3(o, this._vectors3[o]);\n for (const o in this._matrices)\n this._drawWrapper.effect.setMatrix(o, this._matrices[o]);\n }\n if (!this._texture || !this._rtWrapper)\n return;\n (s = i._debugPushGroup) == null || s.call(i, `procedural texture generation for ${this.name}`, 1);\n const r = i.currentViewport;\n if (this.isCube)\n for (let o = 0; o < 6; o++)\n i.bindFramebuffer(this._rtWrapper, o, void 0, void 0, !0), i.bindBuffers(this._vertexBuffers, this._indexBuffer, this._drawWrapper.effect), this._drawWrapper.effect.setFloat(\"face\", o), this.autoClear && i.clear(t.clearColor, !0, !1, !1), i.drawElementsType(ie.TriangleFillMode, 0, 6);\n else\n i.bindFramebuffer(this._rtWrapper, 0, void 0, void 0, !0), i.bindBuffers(this._vertexBuffers, this._indexBuffer, this._drawWrapper.effect), this.autoClear && i.clear(t.clearColor, !0, !1, !1), i.drawElementsType(ie.TriangleFillMode, 0, 6);\n i.unBindFramebuffer(this._rtWrapper, this.isCube), r && i.setViewport(r), this.isCube && i.generateMipMapsForCubemap(this._texture), (a = i._debugPopGroup) == null || a.call(i, 1), this.onGenerated && this.onGenerated(), this.onGeneratedObservable.notifyObservers(this);\n }\n /**\n * Clone the texture.\n * @returns the cloned texture\n */\n clone() {\n const e = this.getSize(), t = new dn(this.name, e.width, this._fragment, this.getScene(), this._fallbackTexture, this._generateMipMaps);\n return t.hasAlpha = this.hasAlpha, t.level = this.level, t.coordinatesMode = this.coordinatesMode, t;\n }\n /**\n * Dispose the texture and release its associated resources.\n */\n dispose() {\n const e = this.getScene();\n if (!e)\n return;\n const t = e.proceduralTextures.indexOf(this);\n t >= 0 && e.proceduralTextures.splice(t, 1);\n const i = this._vertexBuffers[I.PositionKind];\n i && (i.dispose(), this._vertexBuffers[I.PositionKind] = null), this._indexBuffer && this._fullEngine._releaseBuffer(this._indexBuffer) && (this._indexBuffer = null), this.onGeneratedObservable.clear(), this.onBeforeGenerationObservable.clear(), super.dispose();\n }\n}\nP([\n w()\n], dn.prototype, \"isEnabled\", void 0);\nP([\n w()\n], dn.prototype, \"autoClear\", void 0);\nP([\n w()\n], dn.prototype, \"_generateMipMaps\", void 0);\nP([\n w()\n], dn.prototype, \"_size\", void 0);\nP([\n w()\n], dn.prototype, \"refreshRate\", null);\nRe(\"BABYLON.ProceduralTexture\", dn);\nconst VF = \"equirectangularPanoramaPixelShader\", BF = `#ifdef GL_ES\nprecision highp float;\n#endif\n#define M_PI 3.1415926535897932384626433832795\nvarying vec2 vUV;uniform samplerCube cubeMap;void main(void) {vec2 uv=vUV;float longitude=uv.x*2.*M_PI-M_PI+M_PI/2.;float latitude=(1.-uv.y)*M_PI;vec3 dir=vec3(\n- sin( longitude )*sin( latitude ),\ncos( latitude ),\n- cos( longitude )*sin( latitude )\n);normalize( dir );gl_FragColor=textureCube( cubeMap,dir );}`;\nY.ShadersStore[VF] = BF;\nfunction kF(n) {\n return this.selected.forEach((e, t) => {\n let i = n instanceof Function ? n(e.metadata.data, t) : n;\n rt.AddTagsTo(e, i);\n }), this;\n}\nfunction zF(n) {\n return this.selected.forEach((e) => rt.RemoveTagsFrom(e, n)), this;\n}\nfunction WF(n) {\n let e = [];\n return this.selected.forEach((t) => {\n n === void 0 ? e.push({ node: t, value: rt.HasTags(t) }) : e.push({ node: t, value: rt.MatchesQuery(t, n) });\n }), e;\n}\nfunction GF(n) {\n return this.selected.forEach((e, t) => {\n var i, r, s;\n e instanceof wR ? n instanceof Function ? (r = e.actionManager) == null || r.registerAction(n((i = e.metadata).data ?? (i.data = {}), e, t)) : (s = e.actionManager) == null || s.registerAction(n) : console.log(\"Node not a mesh, skipping.\");\n }), this;\n}\nfunction XF(n) {\n return this.prop(\"material\", n), this;\n}\nfunction HF(n) {\n return this.prop(\"material.diffuseColor\", n), this;\n}\nfunction KF(n) {\n return this.prop(\"material.specularColor\", n), this;\n}\nfunction qF(n) {\n return this.prop(\"material.emissiveColor\", n), this;\n}\nfunction YF(n) {\n return this.prop(\"material.ambientColor\", n), this;\n}\nfunction ZF(n) {\n return this.prop(\"material.diffuseTexture\", n), this;\n}\nfunction jF(n) {\n return this.prop(\"material.specularTexture\", n), this;\n}\nfunction QF(n) {\n return this.prop(\"material.emissiveTexture\", n), this;\n}\nfunction JF(n) {\n return this.prop(\"material.ambientTexture\", n), this;\n}\nfunction $F(n, e) {\n return this.selected.forEach((t, i) => {\n t instanceof Ji ? t.registerInstancedBuffer(n, e) : console.log(\"Node not a mesh skipping\");\n }), this;\n}\nfunction eL(n, e) {\n return this.selected.forEach((t, i) => {\n t instanceof Qu ? t.instancedBuffers[n] = e instanceof Function ? e(t.metadata.data, i) : e : console.log(\"Node not a mesh, skipping.\");\n }), this;\n}\nvar hc = function() {\n try {\n var n = Df(Object, \"defineProperty\");\n return n({}, \"\", {}), n;\n } catch {\n }\n}();\nfunction dE(n, e, t) {\n e == \"__proto__\" && hc ? hc(n, e, {\n configurable: !0,\n enumerable: !0,\n value: t,\n writable: !0\n }) : n[e] = t;\n}\nvar tL = Object.prototype, iL = tL.hasOwnProperty;\nfunction Vf(n, e, t) {\n var i = n[e];\n (!(iL.call(n, e) && Nf(i, t)) || t === void 0 && !(e in n)) && dE(n, e, t);\n}\nvar rL = 9007199254740991, sL = /^(?:0|[1-9]\\d*)$/;\nfunction Zc(n, e) {\n var t = typeof n;\n return e = e ?? rL, !!e && (t == \"number\" || t != \"symbol\" && sL.test(n)) && n > -1 && n % 1 == 0 && n < e;\n}\nfunction nL(n, e, t, i) {\n if (!yo(n))\n return n;\n e = Lf(e, n);\n for (var r = -1, s = e.length, a = s - 1, o = n; o != null && ++r < s; ) {\n var l = wf(e[r]), c = t;\n if (l === \"__proto__\" || l === \"constructor\" || l === \"prototype\")\n return n;\n if (r != a) {\n var h = o[l];\n c = i ? i(h, l, o) : void 0, c === void 0 && (c = yo(h) ? h : Zc(e[r + 1]) ? [] : {});\n }\n Vf(o, l, c), o = o[l];\n }\n return n;\n}\nfunction jc(n, e, t) {\n return n == null ? n : nL(n, e, t);\n}\nfunction aL(n, e) {\n return n != null && e in Object(n);\n}\nvar oL = \"[object Arguments]\";\nfunction rm(n) {\n return Wc(n) && zc(n) == oL;\n}\nvar pE = Object.prototype, lL = pE.hasOwnProperty, cL = pE.propertyIsEnumerable, hL = rm(/* @__PURE__ */ function() {\n return arguments;\n}()) ? rm : function(n) {\n return Wc(n) && lL.call(n, \"callee\") && !cL.call(n, \"callee\");\n};\nconst gE = hL;\nvar uL = 9007199254740991;\nfunction Bf(n) {\n return typeof n == \"number\" && n > -1 && n % 1 == 0 && n <= uL;\n}\nfunction fL(n, e, t) {\n e = Lf(e, n);\n for (var i = -1, r = e.length, s = !1; ++i < r; ) {\n var a = wf(e[i]);\n if (!(s = n != null && t(n, a)))\n break;\n n = n[a];\n }\n return s || ++i != r ? s : (r = n == null ? 0 : n.length, !!r && Bf(r) && Zc(a, r) && (Zo(n) || gE(n)));\n}\nfunction kf(n, e) {\n return n != null && fL(n, e, aL);\n}\nfunction dL(n, e) {\n return this.selected.forEach((t, i) => {\n t instanceof On ? hE(t, n) != null ? jc(t, n, e instanceof Function ? e(t.metadata.data, i) : e) : console.error(n + \" not a property of \" + t) : console.warn(\"Node not a mesh, skipping.\");\n }), this;\n}\nfunction pL(n, e) {\n return this.selected.forEach((t, i) => {\n var r;\n kf(t, n) ? jc(t, n, e instanceof Function ? e((r = t.metadata).data ?? (r.data = {}), t, i) : e) : console.error(n + \" not a property of \" + t);\n }), this;\n}\nfunction gL(n) {\n return this.selected.forEach((e, t) => {\n var i;\n for (let r in n)\n kf(e, r) ? jc(\n e,\n r,\n n[r] instanceof Function ? n[r]((i = e.metadata).data ?? (i.data = {}), e, t) : n[r]\n ) : console.log(r + \" not property of \" + e);\n }), this;\n}\nfunction mL(n) {\n return this.selected.forEach((e, t) => {\n var i;\n n((i = e.metadata).data ?? (i.data = {}), e, t);\n }), this;\n}\nfunction _L(n) {\n return this.selected.forEach((e, t) => {\n n != null ? n(e, t) && e.dispose() : e.dispose();\n }), this;\n}\nfunction sm(n) {\n return this.selected.forEach((e, t) => {\n if (e instanceof Ji && e.material !== null) {\n let i = e.material.diffuseTexture;\n i instanceof Ac ? i.scale(n instanceof Function ? n(e, t) : n) : console.log(\"Not a dynamic texture, skipping\");\n }\n }), this;\n}\nfunction EL(n, e, t = null, i = null, r = null, s = null) {\n return this.selected.forEach((a, o) => {\n if (a instanceof Ji && a.material !== null) {\n let l = a.material.diffuseTexture;\n l instanceof Ac ? l.drawText(\n n instanceof Function ? n(a, o) : n,\n t instanceof Function ? t(a, o) : t,\n i instanceof Function ? i(a, o) : i,\n e instanceof Function ? e(a, o) : e,\n r instanceof Function ? r(a, o) : r,\n s instanceof Function ? s(a, o) : s\n ) : console.log(\"Not a dynamic texture, skipping\");\n }\n }), this;\n}\nfunction vL(n = \"\") {\n let e = this.selected[0], t = e instanceof Ji ? e.getBoundingInfo().boundingBox.minimumWorld : e instanceof On ? this.selected[0].position : new Me(), i = e instanceof Ji ? e.getBoundingInfo().boundingBox.maximumWorld : e instanceof On ? this.selected[0].position : new Me();\n return this.selected.forEach((r, s) => {\n r.computeWorldMatrix(!0), (r.getChildMeshes().length > 0 ? r.getChildMeshes() : [r]).forEach((o, l) => {\n if (o.computeWorldMatrix(!0), o instanceof Ji && !ar.MatchesQuery(ar.HasTags(o) ? ar.GetTags(o) : \"\", n)) {\n let c = o.getBoundingInfo().boundingBox.minimumWorld, h = o.getBoundingInfo().boundingBox.maximumWorld;\n t = Me.Minimize(t, c), i = Me.Maximize(i, h);\n } else\n t = Me.Minimize(t, o.position), i = Me.Maximize(i, o.position);\n });\n }), new an(t, i);\n}\nfunction TL(n) {\n let e = [];\n return this.selected.forEach((t, i) => {\n var r;\n n((r = t.metadata).data ?? (r.data = {}), t, i) && e.push(t);\n }), new qt(e, this.scene);\n}\nfunction xL(n) {\n return this.prop(\"name\", n), this;\n}\nfunction CL(n) {\n return this.prop(\"id\", n), this;\n}\nfunction RL(n, e) {\n return this.selected.forEach((t, i) => {\n kf(t, \"metadata\") ? jc(\n t,\n \"metadata\",\n e instanceof Function ? { ...t.metadata, key: e(t.metadata.data, t, i) } : { ...t.metadata, key: e }\n ) : console.error(\"metadata not a property of \" + t);\n }), this;\n}\nfunction SL(n = {}) {\n return this.selected.forEach((e) => {\n let { min: t, max: i } = e.getHierarchyBoundingVectors(!0, (v) => !ar.MatchesQuery(v, \"exclude\")), r = new an(t, i), s = n.name || e.name + \"PositionUI\", a = n.width || r.boundingBox.extendSize.x * 0.5, o = n.radius || a * 0.05, l = n.position || new Me(0, -r.boundingBox.extendSize.y, -Math.hypot(r.boundingBox.extendSize.x, r.boundingBox.extendSize.z)), c = n.offset || new Me(0, -o * 2.5, 0), h = n.billboard || 0, u;\n n.material === void 0 ? (u = new Vs(\"PositionUIMat\", this.scene), u.diffuseColor = n.diffuseColor || pi.White()) : u = n.material;\n let f = n.visibility || 1, d;\n n.behavior === void 0 ? (d = new UR(), d.faceCameraOnDragStart = !0, d.rotateAroundYOnly = !0, d.zDragFactor = 100) : d = n.behavior;\n let p = zo(\"container\", s + \"Container\", { calculateBounds: !1 }, this.scene);\n p.setParent(e), p.setBoundingInfo(r), p.isPickable = !1, p.billboardMode = h, new qt([p], this.scene).bind(\"capsule\", { height: a, radius: o }).name(s).position(l.addInPlace(c)).rotation(new Me(0, 0, 1.57)).material(u).prop(\"visibility\", f).action((v, E, C) => new Bs(\n Fr.OnPickDownTrigger,\n () => {\n e.addBehavior(d);\n }\n )).action((v, E, C) => new Bs(\n Fr.OnPickOutTrigger,\n () => {\n e.removeBehavior(d);\n }\n )).action((v, E, C) => new Bs(\n Fr.OnPickUpTrigger,\n () => {\n e.removeBehavior(d);\n }\n )).addTags(\"exclude\");\n }), this;\n}\nfunction yL(n = {}) {\n return this.selected.forEach((e) => {\n let { min: t, max: i } = e.getHierarchyBoundingVectors(!0, (v) => !ar.MatchesQuery(v, \"exclude\")), r = new an(t, i), s = n.name || e.name + \"ScaleUI\", a = n.diameter || r.boundingBox.extendSize.x * 0.5 * 0.05 * 2, o = n.position || new Me(0, -r.boundingBox.extendSize.y, -Math.hypot(r.boundingBox.extendSize.x, r.boundingBox.extendSize.z)), l = n.offset || new Me(r.boundingBox.extendSize.x * 0.5 * 1.5 / 2, -a / 2 * 2.5, 0), c = n.billboard || 0, h;\n n.material === void 0 ? (h = new Vs(\"PositionUIMat\", this.scene), h.diffuseColor = n.diffuseColor || pi.White()) : h = n.material;\n let u = n.visibility || 1, f;\n n.behavior === void 0 ? (f = new Bl({ dragAxis: new Me(0, 1, 0) }), f.moveAttached = !1) : f = n.behavior;\n let d = n.minimum || -1 / 0, p = n.maximum || 1 / 0, g = zo(\"container\", s + \"Container\", { calculateBounds: !1 }, this.scene);\n g.setParent(e), g.setBoundingInfo(r), g.isPickable = !1, g.billboardMode = c, new qt([g], this.scene).bind(\"sphere\", { diameter: a }).name(s).position(o.addInPlace(l)).rotation(new Me(0, 0, 1.57)).material(h).prop(\"visibility\", u).addTags(\"exclude\").action((v, E, C) => new Bs(\n Fr.OnPickDownTrigger,\n () => {\n E.addBehavior(f);\n }\n )).action((v, E, C) => new Bs(\n Fr.OnPickOutTrigger,\n () => {\n E.removeBehavior(f);\n }\n )).action((v, E, C) => new Bs(\n Fr.OnPickUpTrigger,\n () => {\n E.removeBehavior(f);\n }\n )), f.onDragObservable.add((v) => {\n let E = -v.dragDistance, T = e.scaling.add(new Me(E, E, E));\n if (!(T.x < d)) {\n if (T.x > p)\n return;\n e.scaling = T;\n }\n });\n }), this;\n}\nfunction IL(n = {}) {\n return this.selected.forEach((e) => {\n let { min: t, max: i } = e.getHierarchyBoundingVectors(!0, (E) => !ar.MatchesQuery(E, \"exclude\")), r = new an(t, i), s = n.name || e.name + \"ScaleUI\", a = n.billboard || 0, o = n.axis || { x: !0, y: !0, z: !0 }, l = n.diameter || r.boundingBox.extendSize.x * 0.5 * 0.05 * 2, c = n.thickness || l / 2, h = n.position || new Me(0, -r.boundingBox.extendSize.y, -Math.hypot(r.boundingBox.extendSize.x, r.boundingBox.extendSize.z)), u = n.offset || new Me(0, -l * 2.5, 0), f;\n n.material === void 0 ? (f = new Vs(\"PositionUIMat\", this.scene), f.diffuseColor = n.diffuseColor || pi.White()) : f = n.material;\n let d = n.visibility || 1, p;\n p = {\n x: new Bl({ dragAxis: new Me(1, 0, 0) }),\n y: new Bl({ dragAxis: new Me(1, 0, 0) }),\n z: new Bl({ dragAxis: new Me(1, 0, 0) })\n }, p.x.moveAttached = !1, p.y.moveAttached = !1, p.z.moveAttached = !1;\n let g = [];\n Object.keys(o).forEach((E) => {\n o[E] == !0 && g.push({ axis: E });\n });\n let m = zo(\"container\", s + \"Container\", { calculateBounds: !1 }, this.scene);\n m.setParent(e), m.setBoundingInfo(r), m.isPickable = !1, m.billboardMode = a, new qt([m], this.scene).bind(\"torus\", { diameter: l, thickness: c }, g).name((E, C, T) => n.name ?? (n.name = C.name + \"_scaleUI\")).position(\n (E) => E.axis == \"x\" ? new Me(0, 0, 0).addInPlace(h).addInPlace(u) : E.axis == \"y\" ? new Me(l * 1.5, 0, 0).addInPlace(h).addInPlace(u) : E.axis == \"z\" ? new Me(-l * 1.5, 0, 0).addInPlace(h).addInPlace(u) : new Me(0, 0, 0)\n ).rotation(\n (E) => E.axis == \"x\" ? new Me(0, 0, 1.57) : E.axis == \"y\" ? new Me(0, 0, 0) : E.axis == \"z\" ? new Me(1.57, 0, 0) : new Me(0, 0, 0)\n ).material(f).prop(\"visibility\", d).addTags(\"exclude\").action((E, C, T) => new Bs(\n Fr.OnPickDownTrigger,\n () => {\n C.addBehavior(p[E.axis]);\n }\n )).action((E, C, T) => new Bs(\n Fr.OnPickOutTrigger,\n () => {\n C.removeBehavior(p[E.axis]);\n }\n )).action((E, C, T) => new Bs(\n Fr.OnPickUpTrigger,\n () => {\n C.removeBehavior(p[E.axis]);\n }\n )), p.x.onDragObservable.add((E) => {\n e.rotate(new Me(1, 0, 0), E.dragDistance, so.LOCAL);\n }), p.y.onDragObservable.add((E) => {\n e.rotate(new Me(0, -1, 0), E.dragDistance, so.LOCAL);\n }), p.z.onDragObservable.add((E) => {\n e.rotate(new Me(0, 0, -1), E.dragDistance, so.LOCAL);\n });\n }), this;\n}\nclass qt {\n constructor(e, t) {\n this.select = zR, this.selectName = WR, this.selectId = GR, this.selectTag = XR, this.bind = NS, this.run = mL, this.bindInstance = FS, this.position = LS, this.positionX = wS, this.positionY = US, this.positionZ = VS, this.translate = BS, this.rotation = kS, this.rotationX = zS, this.rotationY = WS, this.rotationZ = GS, this.scaling = XS, this.scalingX = HS, this.scalingY = KS, this.scalingZ = qS, this.get = YD, this.attr = dL, this.addTags = kF, this.removeTags = zF, this.hasTags = WF, this.action = GF, this.material = XF, this.diffuseColor = HF, this.specularColor = KF, this.emissiveColor = qF, this.ambientColor = YF, this.registerInstancedBuffer = $F, this.setInstancedBuffer = eL, this.dispose = _L, this.diffuseTexture = ZF, this.specularTexture = jF, this.emissiveTexture = QF, this.ambientTexture = JF, this.scaleDT = sm, this.scaleToDT = sm, this.drawTextDT = EL, this.boundingBox = vL, this.filter = TL, this.props = gL, this.prop = pL, this.name = xL, this.id = CL, this.metadata = RL, this.positionUI = SL, this.scaleUI = yL, this.rotateUI = IL, this.selected = e, this.scene = t;\n }\n}\nfunction bL(n, e, t, i) {\n var r = !t;\n t || (t = {});\n for (var s = -1, a = e.length; ++s < a; ) {\n var o = e[s], l = i ? i(t[o], n[o], o, t, n) : void 0;\n l === void 0 && (l = n[o]), r ? dE(t, o, l) : Vf(t, o, l);\n }\n return t;\n}\nfunction mE(n) {\n return n;\n}\nfunction AL(n, e, t) {\n switch (t.length) {\n case 0:\n return n.call(e);\n case 1:\n return n.call(e, t[0]);\n case 2:\n return n.call(e, t[0], t[1]);\n case 3:\n return n.call(e, t[0], t[1], t[2]);\n }\n return n.apply(e, t);\n}\nvar nm = Math.max;\nfunction ML(n, e, t) {\n return e = nm(e === void 0 ? n.length - 1 : e, 0), function() {\n for (var i = arguments, r = -1, s = nm(i.length - e, 0), a = Array(s); ++r < s; )\n a[r] = i[e + r];\n r = -1;\n for (var o = Array(e + 1); ++r < e; )\n o[r] = i[r];\n return o[e] = t(a), AL(n, this, o);\n };\n}\nfunction PL(n) {\n return function() {\n return n;\n };\n}\nvar OL = hc ? function(n, e) {\n return hc(n, \"toString\", {\n configurable: !0,\n enumerable: !1,\n value: PL(e),\n writable: !0\n });\n} : mE;\nconst DL = OL;\nvar NL = 800, FL = 16, LL = Date.now;\nfunction wL(n) {\n var e = 0, t = 0;\n return function() {\n var i = LL(), r = FL - (i - t);\n if (t = i, r > 0) {\n if (++e >= NL)\n return arguments[0];\n } else\n e = 0;\n return n.apply(void 0, arguments);\n };\n}\nvar UL = wL(DL);\nfunction VL(n, e) {\n return UL(ML(n, e, mE), n + \"\");\n}\nfunction zf(n) {\n return n != null && Bf(n.length) && !lE(n);\n}\nfunction BL(n, e, t) {\n if (!yo(t))\n return !1;\n var i = typeof e;\n return (i == \"number\" ? zf(t) && Zc(e, t.length) : i == \"string\" && e in t) ? Nf(t[e], n) : !1;\n}\nfunction kL(n) {\n return VL(function(e, t) {\n var i = -1, r = t.length, s = r > 1 ? t[r - 1] : void 0, a = r > 2 ? t[2] : void 0;\n for (s = n.length > 3 && typeof s == \"function\" ? (r--, s) : void 0, a && BL(t[0], t[1], a) && (s = r < 3 ? void 0 : s, r = 1), e = Object(e); ++i < r; ) {\n var o = t[i];\n o && n(e, o, i, s);\n }\n return e;\n });\n}\nvar zL = Object.prototype;\nfunction _E(n) {\n var e = n && n.constructor, t = typeof e == \"function\" && e.prototype || zL;\n return n === t;\n}\nfunction WL(n, e) {\n for (var t = -1, i = Array(n); ++t < n; )\n i[t] = e(t);\n return i;\n}\nfunction GL() {\n return !1;\n}\nvar EE = typeof exports == \"object\" && exports && !exports.nodeType && exports, am = EE && typeof module == \"object\" && module && !module.nodeType && module, XL = am && am.exports === EE, om = XL ? kc.Buffer : void 0, HL = om ? om.isBuffer : void 0, KL = HL || GL, qL = \"[object Arguments]\", YL = \"[object Array]\", ZL = \"[object Boolean]\", jL = \"[object Date]\", QL = \"[object Error]\", JL = \"[object Function]\", $L = \"[object Map]\", e2 = \"[object Number]\", t2 = \"[object Object]\", i2 = \"[object RegExp]\", r2 = \"[object Set]\", s2 = \"[object String]\", n2 = \"[object WeakMap]\", a2 = \"[object ArrayBuffer]\", o2 = \"[object DataView]\", l2 = \"[object Float32Array]\", c2 = \"[object Float64Array]\", h2 = \"[object Int8Array]\", u2 = \"[object Int16Array]\", f2 = \"[object Int32Array]\", d2 = \"[object Uint8Array]\", p2 = \"[object Uint8ClampedArray]\", g2 = \"[object Uint16Array]\", m2 = \"[object Uint32Array]\", ri = {};\nri[l2] = ri[c2] = ri[h2] = ri[u2] = ri[f2] = ri[d2] = ri[p2] = ri[g2] = ri[m2] = !0;\nri[qL] = ri[YL] = ri[a2] = ri[ZL] = ri[o2] = ri[jL] = ri[QL] = ri[JL] = ri[$L] = ri[e2] = ri[t2] = ri[i2] = ri[r2] = ri[s2] = ri[n2] = !1;\nfunction _2(n) {\n return Wc(n) && Bf(n.length) && !!ri[zc(n)];\n}\nfunction E2(n) {\n return function(e) {\n return n(e);\n };\n}\nvar vE = typeof exports == \"object\" && exports && !exports.nodeType && exports, uo = vE && typeof module == \"object\" && module && !module.nodeType && module, v2 = uo && uo.exports === vE, Qh = v2 && aE.process, lm = function() {\n try {\n var n = uo && uo.require && uo.require(\"util\").types;\n return n || Qh && Qh.binding && Qh.binding(\"util\");\n } catch {\n }\n}(), cm = lm && lm.isTypedArray, T2 = cm ? E2(cm) : _2, x2 = Object.prototype, C2 = x2.hasOwnProperty;\nfunction R2(n, e) {\n var t = Zo(n), i = !t && gE(n), r = !t && !i && KL(n), s = !t && !i && !r && T2(n), a = t || i || r || s, o = a ? WL(n.length, String) : [], l = o.length;\n for (var c in n)\n (e || C2.call(n, c)) && !(a && // Safari 9 has enumerable `arguments.length` in strict mode.\n (c == \"length\" || // Node.js 0.10 has enumerable non-index properties on buffers.\n r && (c == \"offset\" || c == \"parent\") || // PhantomJS 2 has enumerable non-index properties on typed arrays.\n s && (c == \"buffer\" || c == \"byteLength\" || c == \"byteOffset\") || // Skip index properties.\n Zc(c, l))) && o.push(c);\n return o;\n}\nfunction S2(n, e) {\n return function(t) {\n return n(e(t));\n };\n}\nvar y2 = S2(Object.keys, Object), I2 = Object.prototype, b2 = I2.hasOwnProperty;\nfunction A2(n) {\n if (!_E(n))\n return y2(n);\n var e = [];\n for (var t in Object(n))\n b2.call(n, t) && t != \"constructor\" && e.push(t);\n return e;\n}\nfunction M2(n) {\n return zf(n) ? R2(n) : A2(n);\n}\nvar P2 = Object.prototype, O2 = P2.hasOwnProperty, Zi = kL(function(n, e) {\n if (_E(e) || zf(e)) {\n bL(e, M2(e), n);\n return;\n }\n for (var t in e)\n O2.call(e, t) && Vf(n, t, e[t]);\n});\nfunction D2() {\n var g, m, v, E, C, T, R, x, S;\n let n = this.scales.x.scale, e = this.scales.x.range, t = this.scales.x.domain, i = this.scales.y.scale, r = this.scales.y.range, s = this.scales.y.domain, a = this.scales.z.scale, o = this.scales.z.range, l = this.scales.z.domain, c = {}, { min: h, max: u } = this.CoT.selected[0].getHierarchyBoundingVectors(), f = new an(h, u).boundingBox, d = f.extendSize.y + f.extendSize.x + f.extendSize.z, p = d * 0.025;\n if (console.log(d, f), ((g = this.options.scale) == null ? void 0 : g.x) != null) {\n let M;\n if (((m = this.options.labelTicks) == null ? void 0 : m.x) != null)\n M = this.options.labelTicks.x;\n else\n try {\n M = n.ticks();\n } catch {\n M = t;\n }\n new Me(0, 0, 0);\n let N;\n ((v = this.options.labelFormat) == null ? void 0 : v.x) != null ? N = { text: (H) => {\n var q;\n return (q = this.options.labelFormat) == null ? void 0 : q.x(H.text);\n }, size: p, atlas: this.options.atlas } : N = { text: (H) => H.text, size: p, atlas: this.options.atlas };\n let F = {}, U = this.CoT.bind(\n \"planeText\",\n Zi({}, N, this.options.labelOptions),\n M.map((H) => ({ text: H }))\n ).prop(\"name\", this.name + \"_labelX\").position((H, q, Z) => new Me(n(H.text), r[0] - p, o[0])).props(Zi({}, F, this.options.labelProperties));\n c.x = U;\n }\n if (((E = this.options.scale) == null ? void 0 : E.y) != null) {\n let M;\n if (((C = this.options.labelTicks) == null ? void 0 : C.y) != null)\n M = this.options.labelTicks.y;\n else\n try {\n M = i.ticks();\n } catch {\n M = s;\n }\n new Me(0, 0, 0);\n let N;\n ((T = this.options.labelFormat) == null ? void 0 : T.y) != null ? N = { text: (H) => {\n var q;\n return (q = this.options.labelFormat) == null ? void 0 : q.y(H.text);\n }, align: \"right\", size: p, atlas: this.options.atlas } : N = { text: (H) => H.text, align: \"right\", size: p, atlas: this.options.atlas };\n let F = {}, U = this.CoT.bind(\n \"planeText\",\n Zi({}, N, this.options.labelOptions),\n M.map((H) => ({ text: H }))\n ).prop(\"name\", this.name + \"_labelY\").position((H, q, Z) => new Me(e[0] - 0.05, i(H.text) - p / 2, o[0])).props(Zi({}, F, this.options.labelProperties));\n c.y = U;\n }\n if (((R = this.options.scale) == null ? void 0 : R.z) != null) {\n let M;\n if (((x = this.options.labelTicks) == null ? void 0 : x.z) != null)\n M = this.options.labelTicks.z;\n else\n try {\n M = a.ticks();\n } catch {\n M = l;\n }\n new Me(0, 0, 0);\n let N;\n ((S = this.options.labelFormat) == null ? void 0 : S.z) != null ? N = { text: (H) => {\n var q;\n return (q = this.options.labelFormat) == null ? void 0 : q.z(H.text);\n }, size: p, atlas: this.options.atlas } : N = { text: (H) => H.text, size: p, atlas: this.options.atlas };\n let F = { \"rotation.y\": -Math.PI / 2 }, U = this.CoT.bind(\n \"planeText\",\n Zi({}, N, this.options.labelOptions),\n M.map((H) => ({ text: H }))\n ).prop(\"name\", this.name + \"_labelZ\").position((H, q, Z) => new Me(e[1], r[0] - p, a(H.text))).props(Zi({}, F, this.options.labelProperties));\n c.z = U;\n }\n return c;\n}\nfunction N2() {\n var r, s, a, o, l, c;\n this.scales.x.scale;\n let n = this.scales.x.range;\n this.scales.x.domain, this.scales.y.scale;\n let e = this.scales.y.range;\n this.scales.y.domain, this.scales.z.scale;\n let t = this.scales.z.range;\n this.scales.z.domain;\n let i = {};\n if (((r = this.options.scale) == null ? void 0 : r.x) != null && ((s = this.options.scale) == null ? void 0 : s.y) != null) {\n let h = new Me(0, 0, 0);\n new Me(0, 0, 0);\n let u = 0, f = 0;\n u = Math.abs(n[0] - n[1]), f = Math.abs(e[0] - e[1]), h = new Me((n[0] + n[1]) / 2, (e[0] + e[1]) / 2, t[1]), new Me(0, 0, 0);\n let d = { height: f, width: u, sideOrientation: Ji.DOUBLESIDE }, p = { \"material.diffuseColor\": pi.White, \"material.alpha\": 0.2 }, g = this.CoT.bind(\"plane\", Zi({}, d, this.options.backgroundOptions)).attr(\"name\", this.name + \"_backgroundX\").position(h).material(new Vs(this.name + \"_backgroundX_material\", this.scene)).props(Zi({}, p, this.options.backgroundProperties));\n i.x = g;\n }\n if (((a = this.options.scale) == null ? void 0 : a.y) != null && ((o = this.options.scale) == null ? void 0 : o.z) != null) {\n let h = new Me(0, 0, 0), u = new Me(0, 0, 0), f = 0, d = 0;\n f = Math.abs(t[0] - t[1]), d = Math.abs(e[0] - e[1]), h = new Me(n[0], (e[0] + e[1]) / 2, (t[0] + t[1]) / 2), u = new Me(0, 1.5708, 0);\n let p = { height: d, width: f, sideOrientation: Ji.DOUBLESIDE }, g = { \"material.diffuseColor\": pi.White, \"material.alpha\": 0.2 }, m = this.CoT.bind(\"plane\", Zi({}, p, this.options.backgroundOptions)).attr(\"name\", this.name + \"_backgroundY\").position(h).rotation(u).material(new Vs(this.name + \"_backgroundY_material\", this.scene)).props(Zi({}, g, this.options.backgroundProperties));\n i.y = m;\n }\n if (((l = this.options.scale) == null ? void 0 : l.z) != null && ((c = this.options.scale) == null ? void 0 : c.x) != null) {\n let h = new Me(0, 0, 0), u = new Me(0, 0, 0), f = 0, d = 0;\n h = new Me((n[0] + n[1]) / 2, e[0], (t[0] + t[1]) / 2), u = new Me(1.5708, 0, 0), f = Math.abs(n[0] - n[1]), d = Math.abs(t[0] - t[1]);\n let p = { height: d, width: f, sideOrientation: Ji.DOUBLESIDE }, g = { \"material.diffuseColor\": pi.White, \"material.alpha\": 0.2 }, m = this.CoT.bind(\"plane\", Zi({}, p, this.options.backgroundOptions)).attr(\"name\", this.name + \"_backgroundZ\").position(h).rotation(u).material(new Vs(this.name + \"_backgroundZ_material\", this.scene)).props(Zi({}, g, this.options.backgroundProperties));\n i.z = m;\n }\n return i;\n}\nfunction F2() {\n var p, g, m, v, E, C;\n let n = this.scales.x.scale, e = this.scales.x.range, t = this.scales.x.domain, i = this.scales.y.scale, r = this.scales.y.range, s = this.scales.y.domain, a = this.scales.z.scale, o = this.scales.z.range, l = this.scales.z.domain, c = [];\n if (((p = this.options.scale) == null ? void 0 : p.x) != null) {\n let T;\n if (((g = this.options.gridTicks) == null ? void 0 : g.x) != null)\n T = this.options.gridTicks.x;\n else\n try {\n T = n.ticks();\n } catch {\n T = t;\n }\n let R = [new Me(0, 0, 0)];\n R = (x) => [\n new Me(n(x), r[0], o[0]),\n new Me(n(x), r[0], o[1]),\n new Me(n(x), r[1], o[1])\n ];\n for (var h of T)\n c.push(R(h));\n }\n if (((m = this.options.scale) == null ? void 0 : m.y) != null) {\n let T;\n if (((v = this.options.gridTicks) == null ? void 0 : v.y) != null)\n T = this.options.gridTicks.y;\n else\n try {\n T = i.ticks();\n } catch {\n T = s;\n }\n let R = [new Me(0, 0, 0)];\n R = (x) => [\n new Me(e[0], i(x), o[0]),\n new Me(e[0], i(x), o[1]),\n new Me(e[1], i(x), o[1])\n ];\n for (var h of T)\n c.push(R(h));\n }\n if (((E = this.options.scale) == null ? void 0 : E.z) != null) {\n let T;\n if (((C = this.options.gridTicks) == null ? void 0 : C.z) != null)\n T = this.options.gridTicks.z;\n else\n try {\n T = a.ticks();\n } catch {\n T = l;\n }\n let R = [new Me(0, 0, 0)];\n R = (x) => [\n new Me(e[1], r[0], a(x)),\n new Me(e[0], r[0], a(x)),\n new Me(e[0], r[1], a(x))\n ];\n for (var h of T)\n c.push(R(h));\n }\n let u = { lines: c }, f = {\n name: this.name + \"_grid\",\n alpha: 0.3,\n color: pi.White()\n };\n return this.CoT.bind(\"lineSystem\", Zi({}, u, this.options.gridOptions)).props(Zi({}, f, this.options.gridProperties));\n}\nfunction L2() {\n var l, c, h;\n this.scales.x.scale;\n let n = this.scales.x.range;\n this.scales.x.domain, this.scales.y.scale;\n let e = this.scales.y.range;\n this.scales.y.domain, this.scales.z.scale;\n let t = this.scales.z.range;\n this.scales.z.domain;\n let i = [];\n ((l = this.options.scale) == null ? void 0 : l.y) != null && i.push(new Me(n[0], e[1], t[0])), ((c = this.options.scale) == null ? void 0 : c.x) != null && i.push(new Me(n[0], e[0], t[0]), new Me(n[1], e[0], t[0])), ((h = this.options.scale) == null ? void 0 : h.z) != null && i.push(new Me(n[1], e[0], t[0]), new Me(n[1], e[0], t[1]));\n let r = {\n points: i,\n updatable: !1\n }, s = {\n createAndAssignMaterial: !0,\n width: 5,\n sizeAttenuation: !0,\n materialType: 0,\n color: pi.White(),\n colorMode: 0,\n useColors: !1,\n useDash: !1,\n visibility: 1\n }, a = R_(\n \"greasedLine\",\n Zi({}, r, this.options.domainOptions),\n Zi({}, s, this.options.domainMaterialOptions),\n this.scene\n );\n a.parent = this.CoT.selected[0];\n let o = new qt([a], this.scene);\n return o.prop(\"name\", this.name + \"_domain\"), o;\n}\nclass w2 {\n constructor(e, t, i = {}) {\n this.setDomain = L2, this.setBackground = N2, this.setGrid = F2, this.setLabel = D2, this.name = e, this.options = i, this.scene = t, this.CoT = this.setCoT(), this.scales = this.setScales(), this.domain = this.options.domain ? this.setDomain() : new qt([], t), this.background = this.options.background ? this.setBackground() : {}, this.grid = this.options.grid ? this.setGrid() : new qt([], t), this.label = this.options.label ? this.setLabel() : {};\n }\n setCoT() {\n let e;\n if (this.options.parent === void 0) {\n let t = new On(this.name + \"CoT\", this.scene);\n e = new qt([t], this.scene);\n } else\n e = this.options.parent.bind(\"cot\").prop(\"name\", this.name + \"CoT\");\n return e;\n }\n setScales() {\n var f, d, p;\n let e, t = [0, 0], i, r, s = [0, 0], a, o, l = [0, 0], c;\n if (((f = this.options.scale) == null ? void 0 : f.x) != null) {\n e = this.options.scale.x, i = e.domain();\n let g = e.range();\n t = [g[0], g.slice(-1)[0]];\n }\n if (((d = this.options.scale) == null ? void 0 : d.y) != null) {\n r = this.options.scale.y, a = r.domain();\n let g = r.range();\n s = [g[0], g.slice(-1)[0]];\n }\n if (((p = this.options.scale) == null ? void 0 : p.z) != null) {\n o = this.options.scale.z, c = o.domain();\n let g = o.range();\n l = [g[0], g.slice(-1)[0]];\n }\n let h = [t, s, l].flat().sort();\n return {\n size: Math.abs(h.slice(-1)[0] - h[0]),\n x: { scale: e, range: t, domain: i },\n y: { scale: r, range: s, domain: a },\n z: { scale: o, range: l, domain: c }\n };\n }\n}\nfunction yk(n, e, t) {\n const i = {\n scale: t.scale,\n parent: t.parent || void 0,\n domain: t.domain || !0,\n domainOptions: t.domainOptions || {},\n domainMaterialOptions: t.domainMaterialOptions || {},\n background: t.background || !0,\n backgroundOptions: t.backgroundOptions || {},\n backgroundProperties: t.backgroundProperties || {},\n grid: t.grid || !0,\n gridOptions: t.gridOptions || {},\n gridProperties: t.gridProperties || {},\n gridTicks: t.gridTicks || {},\n label: t.label || !0,\n labelOptions: t.labelOptions || {},\n labelProperties: t.labelProperties || {},\n labelTicks: t.labelTicks || {},\n labelFormat: t.labelFormat || {},\n atlas: t.atlas || new Vl(S_, e)\n };\n return new w2(n, e, i);\n}\nclass pn {\n /**\n * @param {string} type Type.\n */\n constructor(e) {\n this.propagationStopped, this.defaultPrevented, this.type = e, this.target = null;\n }\n /**\n * Prevent default. This means that no emulated `click`, `singleclick` or `doubleclick` events\n * will be fired.\n * @api\n */\n preventDefault() {\n this.defaultPrevented = !0;\n }\n /**\n * Stop event propagation.\n * @api\n */\n stopPropagation() {\n this.propagationStopped = !0;\n }\n}\nconst bo = {\n /**\n * Triggered when a property is changed.\n * @event module:ol/Object.ObjectEvent#propertychange\n * @api\n */\n PROPERTYCHANGE: \"propertychange\"\n};\nclass Wf {\n constructor() {\n this.disposed = !1;\n }\n /**\n * Clean up.\n */\n dispose() {\n this.disposed || (this.disposed = !0, this.disposeInternal());\n }\n /**\n * Extension point for disposable objects.\n * @protected\n */\n disposeInternal() {\n }\n}\nfunction Gf(n, e) {\n return n > e ? 1 : n < e ? -1 : 0;\n}\nfunction Xf(n, e, t) {\n if (n[0] <= e)\n return 0;\n const i = n.length;\n if (e <= n[i - 1])\n return i - 1;\n if (typeof t == \"function\") {\n for (let r = 1; r < i; ++r) {\n const s = n[r];\n if (s === e)\n return r;\n if (s < e)\n return t(e, n[r - 1], s) > 0 ? r - 1 : r;\n }\n return i - 1;\n }\n if (t > 0) {\n for (let r = 1; r < i; ++r)\n if (n[r] < e)\n return r - 1;\n return i - 1;\n }\n if (t < 0) {\n for (let r = 1; r < i; ++r)\n if (n[r] <= e)\n return r;\n return i - 1;\n }\n for (let r = 1; r < i; ++r) {\n if (n[r] == e)\n return r;\n if (n[r] < e)\n return n[r - 1] - e < e - n[r] ? r - 1 : r;\n }\n return i - 1;\n}\nfunction U2(n, e) {\n const t = Array.isArray(e) ? e : [e], i = t.length;\n for (let r = 0; r < i; r++)\n n[n.length] = t[r];\n}\nfunction Qc(n, e) {\n const t = n.length;\n if (t !== e.length)\n return !1;\n for (let i = 0; i < t; i++)\n if (n[i] !== e[i])\n return !1;\n return !0;\n}\nfunction V2(n, e, t) {\n const i = e || Gf;\n return n.every(function(r, s) {\n if (s === 0)\n return !0;\n const a = i(n[s - 1], r);\n return !(a > 0 || t && a === 0);\n });\n}\nfunction uc() {\n return !0;\n}\nfunction Jc() {\n return !1;\n}\nfunction fc() {\n}\nfunction B2(n) {\n let e = !1, t, i, r;\n return function() {\n const s = Array.prototype.slice.call(arguments);\n return (!e || this !== r || !Qc(s, i)) && (e = !0, r = this, i = s, t = n.apply(this, arguments)), t;\n };\n}\nfunction $c(n) {\n for (const e in n)\n delete n[e];\n}\nfunction k2(n) {\n let e;\n for (e in n)\n return !1;\n return !e;\n}\nclass Hf extends Wf {\n /**\n * @param {*} [target] Default event target for dispatched events.\n */\n constructor(e) {\n super(), this.eventTarget_ = e, this.pendingRemovals_ = null, this.dispatching_ = null, this.listeners_ = null;\n }\n /**\n * @param {string} type Type.\n * @param {import(\"../events.js\").Listener} listener Listener.\n */\n addEventListener(e, t) {\n if (!e || !t)\n return;\n const i = this.listeners_ || (this.listeners_ = {}), r = i[e] || (i[e] = []);\n r.includes(t) || r.push(t);\n }\n /**\n * Dispatches an event and calls all listeners listening for events\n * of this type. The event parameter can either be a string or an\n * Object with a `type` property.\n *\n * @param {import(\"./Event.js\").default|string} event Event object.\n * @return {boolean|undefined} `false` if anyone called preventDefault on the\n * event object or if any of the listeners returned false.\n * @api\n */\n dispatchEvent(e) {\n const t = typeof e == \"string\", i = t ? e : e.type, r = this.listeners_ && this.listeners_[i];\n if (!r)\n return;\n const s = t ? new pn(e) : (\n /** @type {Event} */\n e\n );\n s.target || (s.target = this.eventTarget_ || this);\n const a = this.dispatching_ || (this.dispatching_ = {}), o = this.pendingRemovals_ || (this.pendingRemovals_ = {});\n i in a || (a[i] = 0, o[i] = 0), ++a[i];\n let l;\n for (let c = 0, h = r.length; c < h; ++c)\n if (\"handleEvent\" in r[c] ? l = /** @type {import(\"../events.js\").ListenerObject} */\n r[c].handleEvent(s) : l = /** @type {import(\"../events.js\").ListenerFunction} */\n r[c].call(this, s), l === !1 || s.propagationStopped) {\n l = !1;\n break;\n }\n if (--a[i] === 0) {\n let c = o[i];\n for (delete o[i]; c--; )\n this.removeEventListener(i, fc);\n delete a[i];\n }\n return l;\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n this.listeners_ && $c(this.listeners_);\n }\n /**\n * Get the listeners for a specified event type. Listeners are returned in the\n * order that they will be called in.\n *\n * @param {string} type Type.\n * @return {Array|undefined} Listeners.\n */\n getListeners(e) {\n return this.listeners_ && this.listeners_[e] || void 0;\n }\n /**\n * @param {string} [type] Type. If not provided,\n * `true` will be returned if this event target has any listeners.\n * @return {boolean} Has listeners.\n */\n hasListener(e) {\n return this.listeners_ ? e ? e in this.listeners_ : Object.keys(this.listeners_).length > 0 : !1;\n }\n /**\n * @param {string} type Type.\n * @param {import(\"../events.js\").Listener} listener Listener.\n */\n removeEventListener(e, t) {\n const i = this.listeners_ && this.listeners_[e];\n if (i) {\n const r = i.indexOf(t);\n r !== -1 && (this.pendingRemovals_ && e in this.pendingRemovals_ ? (i[r] = fc, ++this.pendingRemovals_[e]) : (i.splice(r, 1), i.length === 0 && delete this.listeners_[e]));\n }\n }\n}\nconst St = {\n /**\n * Generic change event. Triggered when the revision counter is increased.\n * @event module:ol/events/Event~BaseEvent#change\n * @api\n */\n CHANGE: \"change\",\n /**\n * Generic error event. Triggered when an error occurs.\n * @event module:ol/events/Event~BaseEvent#error\n * @api\n */\n ERROR: \"error\",\n BLUR: \"blur\",\n CLEAR: \"clear\",\n CONTEXTMENU: \"contextmenu\",\n CLICK: \"click\",\n DBLCLICK: \"dblclick\",\n DRAGENTER: \"dragenter\",\n DRAGOVER: \"dragover\",\n DROP: \"drop\",\n FOCUS: \"focus\",\n KEYDOWN: \"keydown\",\n KEYPRESS: \"keypress\",\n LOAD: \"load\",\n RESIZE: \"resize\",\n TOUCHMOVE: \"touchmove\",\n WHEEL: \"wheel\"\n};\nfunction Ht(n, e, t, i, r) {\n if (i && i !== n && (t = t.bind(i)), r) {\n const a = t;\n t = function() {\n n.removeEventListener(e, t), a.apply(this, arguments);\n };\n }\n const s = {\n target: n,\n type: e,\n listener: t\n };\n return n.addEventListener(e, t), s;\n}\nfunction dc(n, e, t, i) {\n return Ht(n, e, t, i, !0);\n}\nfunction Ei(n) {\n n && n.target && (n.target.removeEventListener(n.type, n.listener), $c(n));\n}\nclass jo extends Hf {\n constructor() {\n super(), this.on = /** @type {ObservableOnSignature} */\n this.onInternal, this.once = /** @type {ObservableOnSignature} */\n this.onceInternal, this.un = /** @type {ObservableOnSignature} */\n this.unInternal, this.revision_ = 0;\n }\n /**\n * Increases the revision counter and dispatches a 'change' event.\n * @api\n */\n changed() {\n ++this.revision_, this.dispatchEvent(St.CHANGE);\n }\n /**\n * Get the version number for this object. Each time the object is modified,\n * its version number will be incremented.\n * @return {number} Revision.\n * @api\n */\n getRevision() {\n return this.revision_;\n }\n /**\n * @param {string|Array} type Type.\n * @param {function((Event|import(\"./events/Event\").default)): ?} listener Listener.\n * @return {import(\"./events.js\").EventsKey|Array} Event key.\n * @protected\n */\n onInternal(e, t) {\n if (Array.isArray(e)) {\n const i = e.length, r = new Array(i);\n for (let s = 0; s < i; ++s)\n r[s] = Ht(this, e[s], t);\n return r;\n }\n return Ht(\n this,\n /** @type {string} */\n e,\n t\n );\n }\n /**\n * @param {string|Array} type Type.\n * @param {function((Event|import(\"./events/Event\").default)): ?} listener Listener.\n * @return {import(\"./events.js\").EventsKey|Array} Event key.\n * @protected\n */\n onceInternal(e, t) {\n let i;\n if (Array.isArray(e)) {\n const r = e.length;\n i = new Array(r);\n for (let s = 0; s < r; ++s)\n i[s] = dc(this, e[s], t);\n } else\n i = dc(\n this,\n /** @type {string} */\n e,\n t\n );\n return t.ol_key = i, i;\n }\n /**\n * Unlisten for a certain type of event.\n * @param {string|Array} type Type.\n * @param {function((Event|import(\"./events/Event\").default)): ?} listener Listener.\n * @protected\n */\n unInternal(e, t) {\n const i = (\n /** @type {Object} */\n t.ol_key\n );\n if (i)\n z2(i);\n else if (Array.isArray(e))\n for (let r = 0, s = e.length; r < s; ++r)\n this.removeEventListener(e[r], t);\n else\n this.removeEventListener(e, t);\n }\n}\njo.prototype.on;\njo.prototype.once;\njo.prototype.un;\nfunction z2(n) {\n if (Array.isArray(n))\n for (let e = 0, t = n.length; e < t; ++e)\n Ei(n[e]);\n else\n Ei(\n /** @type {import(\"./events.js\").EventsKey} */\n n\n );\n}\nfunction di() {\n throw new Error(\"Unimplemented abstract method.\");\n}\nlet W2 = 0;\nfunction fr(n) {\n return n.ol_uid || (n.ol_uid = String(++W2));\n}\nclass hm extends pn {\n /**\n * @param {string} type The event type.\n * @param {string} key The property name.\n * @param {*} oldValue The old value for `key`.\n */\n constructor(e, t, i) {\n super(e), this.key = t, this.oldValue = i;\n }\n}\nclass Ws extends jo {\n /**\n * @param {Object} [values] An object with key-value pairs.\n */\n constructor(e) {\n super(), this.on, this.once, this.un, fr(this), this.values_ = null, e !== void 0 && this.setProperties(e);\n }\n /**\n * Gets a value.\n * @param {string} key Key name.\n * @return {*} Value.\n * @api\n */\n get(e) {\n let t;\n return this.values_ && this.values_.hasOwnProperty(e) && (t = this.values_[e]), t;\n }\n /**\n * Get a list of object property names.\n * @return {Array} List of property names.\n * @api\n */\n getKeys() {\n return this.values_ && Object.keys(this.values_) || [];\n }\n /**\n * Get an object of all property names and values.\n * @return {Object} Object.\n * @api\n */\n getProperties() {\n return this.values_ && Object.assign({}, this.values_) || {};\n }\n /**\n * @return {boolean} The object has properties.\n */\n hasProperties() {\n return !!this.values_;\n }\n /**\n * @param {string} key Key name.\n * @param {*} oldValue Old value.\n */\n notify(e, t) {\n let i;\n i = `change:${e}`, this.hasListener(i) && this.dispatchEvent(new hm(i, e, t)), i = bo.PROPERTYCHANGE, this.hasListener(i) && this.dispatchEvent(new hm(i, e, t));\n }\n /**\n * @param {string} key Key name.\n * @param {import(\"./events.js\").Listener} listener Listener.\n */\n addChangeListener(e, t) {\n this.addEventListener(`change:${e}`, t);\n }\n /**\n * @param {string} key Key name.\n * @param {import(\"./events.js\").Listener} listener Listener.\n */\n removeChangeListener(e, t) {\n this.removeEventListener(`change:${e}`, t);\n }\n /**\n * Sets a value.\n * @param {string} key Key name.\n * @param {*} value Value.\n * @param {boolean} [silent] Update without triggering an event.\n * @api\n */\n set(e, t, i) {\n const r = this.values_ || (this.values_ = {});\n if (i)\n r[e] = t;\n else {\n const s = r[e];\n r[e] = t, s !== t && this.notify(e, s);\n }\n }\n /**\n * Sets a collection of key-value pairs. Note that this changes any existing\n * properties and adds new ones (it does not remove any existing properties).\n * @param {Object} values Values.\n * @param {boolean} [silent] Update without triggering an event.\n * @api\n */\n setProperties(e, t) {\n for (const i in e)\n this.set(i, e[i], t);\n }\n /**\n * Apply any properties from another object without triggering events.\n * @param {BaseObject} source The source object.\n * @protected\n */\n applyProperties(e) {\n e.values_ && Object.assign(this.values_ || (this.values_ = {}), e.values_);\n }\n /**\n * Unsets a property.\n * @param {string} key Key name.\n * @param {boolean} [silent] Unset without triggering an event.\n * @api\n */\n unset(e, t) {\n if (this.values_ && e in this.values_) {\n const i = this.values_[e];\n delete this.values_[e], k2(this.values_) && (this.values_ = null), t || this.notify(e, i);\n }\n }\n}\nconst G2 = {\n 1: \"The view center is not defined\",\n 2: \"The view resolution is not defined\",\n 3: \"The view rotation is not defined\",\n 4: \"`image` and `src` cannot be provided at the same time\",\n 5: \"`imgSize` must be set when `image` is provided\",\n 7: \"`format` must be set when `url` is set\",\n 8: \"Unknown `serverType` configured\",\n 9: \"`url` must be configured or set using `#setUrl()`\",\n 10: \"The default `geometryFunction` can only handle `Point` geometries\",\n 11: \"`options.featureTypes` must be an Array\",\n 12: \"`options.geometryName` must also be provided when `options.bbox` is set\",\n 13: \"Invalid corner\",\n 14: \"Invalid color\",\n 15: \"Tried to get a value for a key that does not exist in the cache\",\n 16: \"Tried to set a value for a key that is used already\",\n 17: \"`resolutions` must be sorted in descending order\",\n 18: \"Either `origin` or `origins` must be configured, never both\",\n 19: \"Number of `tileSizes` and `resolutions` must be equal\",\n 20: \"Number of `origins` and `resolutions` must be equal\",\n 22: \"Either `tileSize` or `tileSizes` must be configured, never both\",\n 24: \"Invalid extent or geometry provided as `geometry`\",\n 25: \"Cannot fit empty extent provided as `geometry`\",\n 26: \"Features must have an id set\",\n 27: \"Features must have an id set\",\n 28: '`renderMode` must be `\"hybrid\"` or `\"vector\"`',\n 30: \"The passed `feature` was already added to the source\",\n 31: \"Tried to enqueue an `element` that was already added to the queue\",\n 32: \"Transformation matrix cannot be inverted\",\n 33: \"Invalid units\",\n 34: \"Invalid geometry layout\",\n 36: \"Unknown SRS type\",\n 37: \"Unknown geometry type found\",\n 38: \"`styleMapValue` has an unknown type\",\n 39: \"Unknown geometry type\",\n 40: \"Expected `feature` to have a geometry\",\n 41: \"Expected an `ol/style/Style` or an array of `ol/style/Style.js`\",\n 42: \"Question unknown, the answer is 42\",\n 43: \"Expected `layers` to be an array or a `Collection`\",\n 47: \"Expected `controls` to be an array or an `ol/Collection`\",\n 48: \"Expected `interactions` to be an array or an `ol/Collection`\",\n 49: \"Expected `overlays` to be an array or an `ol/Collection`\",\n 50: \"`options.featureTypes` should be an Array\",\n 51: \"Either `url` or `tileJSON` options must be provided\",\n 52: \"Unknown `serverType` configured\",\n 53: \"Unknown `tierSizeCalculation` configured\",\n 55: \"The {-y} placeholder requires a tile grid with extent\",\n 56: \"mapBrowserEvent must originate from a pointer event\",\n 57: \"At least 2 conditions are required\",\n 59: \"Invalid command found in the PBF\",\n 60: \"Missing or invalid `size`\",\n 61: \"Cannot determine IIIF Image API version from provided image information JSON\",\n 62: \"A `WebGLArrayBuffer` must either be of type `ELEMENT_ARRAY_BUFFER` or `ARRAY_BUFFER`\",\n 64: \"Layer opacity must be a number\",\n 66: \"`forEachFeatureAtCoordinate` cannot be used on a WebGL layer if the hit detection logic has not been enabled. This is done by providing adequate shaders using the `hitVertexShader` and `hitFragmentShader` properties of `WebGLPointsLayerRenderer`\",\n 67: \"A layer can only be added to the map once. Use either `layer.setMap()` or `map.addLayer()`, not both\",\n 68: \"A VectorTile source can only be rendered if it has a projection compatible with the view projection\",\n 69: \"`width` or `height` cannot be provided together with `scale`\"\n};\nclass TE extends Error {\n /**\n * @param {number} code Error code.\n */\n constructor(e) {\n const t = G2[e];\n super(t), this.code = e, this.name = \"AssertionError\", this.message = t;\n }\n}\nconst Dr = {\n /**\n * Triggered when an item is added to the collection.\n * @event module:ol/Collection.CollectionEvent#add\n * @api\n */\n ADD: \"add\",\n /**\n * Triggered when an item is removed from the collection.\n * @event module:ol/Collection.CollectionEvent#remove\n * @api\n */\n REMOVE: \"remove\"\n}, um = {\n LENGTH: \"length\"\n};\nclass vl extends pn {\n /**\n * @param {import(\"./CollectionEventType.js\").default} type Type.\n * @param {T} element Element.\n * @param {number} index The index of the added or removed element.\n */\n constructor(e, t, i) {\n super(e), this.element = t, this.index = i;\n }\n}\nclass Us extends Ws {\n /**\n * @param {Array} [array] Array.\n * @param {Options} [options] Collection options.\n */\n constructor(e, t) {\n if (super(), this.on, this.once, this.un, t = t || {}, this.unique_ = !!t.unique, this.array_ = e || [], this.unique_)\n for (let i = 0, r = this.array_.length; i < r; ++i)\n this.assertUnique_(this.array_[i], i);\n this.updateLength_();\n }\n /**\n * Remove all elements from the collection.\n * @api\n */\n clear() {\n for (; this.getLength() > 0; )\n this.pop();\n }\n /**\n * Add elements to the collection. This pushes each item in the provided array\n * to the end of the collection.\n * @param {!Array} arr Array.\n * @return {Collection} This collection.\n * @api\n */\n extend(e) {\n for (let t = 0, i = e.length; t < i; ++t)\n this.push(e[t]);\n return this;\n }\n /**\n * Iterate over each element, calling the provided callback.\n * @param {function(T, number, Array): *} f The function to call\n * for every element. This function takes 3 arguments (the element, the\n * index and the array). The return value is ignored.\n * @api\n */\n forEach(e) {\n const t = this.array_;\n for (let i = 0, r = t.length; i < r; ++i)\n e(t[i], i, t);\n }\n /**\n * Get a reference to the underlying Array object. Warning: if the array\n * is mutated, no events will be dispatched by the collection, and the\n * collection's \"length\" property won't be in sync with the actual length\n * of the array.\n * @return {!Array} Array.\n * @api\n */\n getArray() {\n return this.array_;\n }\n /**\n * Get the element at the provided index.\n * @param {number} index Index.\n * @return {T} Element.\n * @api\n */\n item(e) {\n return this.array_[e];\n }\n /**\n * Get the length of this collection.\n * @return {number} The length of the array.\n * @observable\n * @api\n */\n getLength() {\n return this.get(um.LENGTH);\n }\n /**\n * Insert an element at the provided index.\n * @param {number} index Index.\n * @param {T} elem Element.\n * @api\n */\n insertAt(e, t) {\n if (e < 0 || e > this.getLength())\n throw new Error(\"Index out of bounds: \" + e);\n this.unique_ && this.assertUnique_(t), this.array_.splice(e, 0, t), this.updateLength_(), this.dispatchEvent(\n new vl(Dr.ADD, t, e)\n );\n }\n /**\n * Remove the last element of the collection and return it.\n * Return `undefined` if the collection is empty.\n * @return {T|undefined} Element.\n * @api\n */\n pop() {\n return this.removeAt(this.getLength() - 1);\n }\n /**\n * Insert the provided element at the end of the collection.\n * @param {T} elem Element.\n * @return {number} New length of the collection.\n * @api\n */\n push(e) {\n this.unique_ && this.assertUnique_(e);\n const t = this.getLength();\n return this.insertAt(t, e), this.getLength();\n }\n /**\n * Remove the first occurrence of an element from the collection.\n * @param {T} elem Element.\n * @return {T|undefined} The removed element or undefined if none found.\n * @api\n */\n remove(e) {\n const t = this.array_;\n for (let i = 0, r = t.length; i < r; ++i)\n if (t[i] === e)\n return this.removeAt(i);\n }\n /**\n * Remove the element at the provided index and return it.\n * Return `undefined` if the collection does not contain this index.\n * @param {number} index Index.\n * @return {T|undefined} Value.\n * @api\n */\n removeAt(e) {\n if (e < 0 || e >= this.getLength())\n return;\n const t = this.array_[e];\n return this.array_.splice(e, 1), this.updateLength_(), this.dispatchEvent(\n /** @type {CollectionEvent} */\n new vl(Dr.REMOVE, t, e)\n ), t;\n }\n /**\n * Set the element at the provided index.\n * @param {number} index Index.\n * @param {T} elem Element.\n * @api\n */\n setAt(e, t) {\n const i = this.getLength();\n if (e >= i) {\n this.insertAt(e, t);\n return;\n }\n if (e < 0)\n throw new Error(\"Index out of bounds: \" + e);\n this.unique_ && this.assertUnique_(t, e);\n const r = this.array_[e];\n this.array_[e] = t, this.dispatchEvent(\n /** @type {CollectionEvent} */\n new vl(Dr.REMOVE, r, e)\n ), this.dispatchEvent(\n /** @type {CollectionEvent} */\n new vl(Dr.ADD, t, e)\n );\n }\n /**\n * @private\n */\n updateLength_() {\n this.set(um.LENGTH, this.array_.length);\n }\n /**\n * @private\n * @param {T} elem Element.\n * @param {number} [except] Optional index to ignore.\n */\n assertUnique_(e, t) {\n for (let i = 0, r = this.array_.length; i < r; ++i)\n if (this.array_[i] === e && i !== t)\n throw new TE(58);\n }\n}\nconst cn = typeof navigator < \"u\" && typeof navigator.userAgent < \"u\" ? navigator.userAgent.toLowerCase() : \"\", X2 = cn.includes(\"firefox\"), H2 = cn.includes(\"safari\") && !cn.includes(\"chrom\");\nH2 && (cn.includes(\"version/15.4\") || /cpu (os|iphone os) 15_4 like mac os x/.test(cn));\nconst K2 = cn.includes(\"webkit\") && !cn.includes(\"edge\"), xE = cn.includes(\"macintosh\"), CE = typeof devicePixelRatio < \"u\" ? devicePixelRatio : 1, RE = typeof WorkerGlobalScope < \"u\" && typeof OffscreenCanvas < \"u\" && self instanceof WorkerGlobalScope, q2 = typeof Image < \"u\" && Image.prototype.decode, SE = function() {\n let n = !1;\n try {\n const e = Object.defineProperty({}, \"passive\", {\n get: function() {\n n = !0;\n }\n });\n window.addEventListener(\"_\", null, e), window.removeEventListener(\"_\", null, e);\n } catch {\n }\n return n;\n}();\nfunction Kt(n, e) {\n if (!n)\n throw new TE(e);\n}\nnew Array(6);\nfunction xa() {\n return [1, 0, 0, 1, 0, 0];\n}\nfunction Ar(n, e) {\n const t = e[0], i = e[1];\n return e[0] = n[0] * t + n[2] * i + n[4], e[1] = n[1] * t + n[3] * i + n[5], e;\n}\nfunction Ao(n, e, t, i, r, s, a, o) {\n const l = Math.sin(s), c = Math.cos(s);\n return n[0] = i * c, n[1] = r * l, n[2] = -i * l, n[3] = r * c, n[4] = a * i * c - o * i * l + e, n[5] = a * r * l + o * r * c + t, n;\n}\nfunction yE(n, e) {\n const t = Y2(e);\n Kt(t !== 0, 32);\n const i = e[0], r = e[1], s = e[2], a = e[3], o = e[4], l = e[5];\n return n[0] = a / t, n[1] = -r / t, n[2] = -s / t, n[3] = i / t, n[4] = (s * l - a * o) / t, n[5] = -(i * l - r * o) / t, n;\n}\nfunction Y2(n) {\n return n[0] * n[3] - n[1] * n[2];\n}\nlet fm;\nfunction Z2(n) {\n const e = \"matrix(\" + n.join(\", \") + \")\";\n if (RE)\n return e;\n const t = fm || (fm = document.createElement(\"div\"));\n return t.style.transform = e, t.style.transform;\n}\nconst Gi = {\n UNKNOWN: 0,\n INTERSECTING: 1,\n ABOVE: 2,\n RIGHT: 4,\n BELOW: 8,\n LEFT: 16\n};\nfunction dm(n) {\n const e = Vn();\n for (let t = 0, i = n.length; t < i; ++t)\n Kl(e, n[t]);\n return e;\n}\nfunction j2(n, e, t) {\n const i = Math.min.apply(null, n), r = Math.min.apply(null, e), s = Math.max.apply(null, n), a = Math.max.apply(null, e);\n return Ha(i, r, s, a, t);\n}\nfunction Q2(n, e) {\n return e ? (e[0] = n[0], e[1] = n[1], e[2] = n[2], e[3] = n[3], e) : n.slice();\n}\nfunction IE(n, e, t) {\n let i, r;\n return e < n[0] ? i = n[0] - e : n[2] < e ? i = e - n[2] : i = 0, t < n[1] ? r = n[1] - t : n[3] < t ? r = t - n[3] : r = 0, i * i + r * r;\n}\nfunction Kf(n, e) {\n return bE(n, e[0], e[1]);\n}\nfunction J2(n, e) {\n return n[0] <= e[0] && e[2] <= n[2] && n[1] <= e[1] && e[3] <= n[3];\n}\nfunction bE(n, e, t) {\n return n[0] <= e && e <= n[2] && n[1] <= t && t <= n[3];\n}\nfunction pm(n, e) {\n const t = n[0], i = n[1], r = n[2], s = n[3], a = e[0], o = e[1];\n let l = Gi.UNKNOWN;\n return a < t ? l = l | Gi.LEFT : a > r && (l = l | Gi.RIGHT), o < i ? l = l | Gi.BELOW : o > s && (l = l | Gi.ABOVE), l === Gi.UNKNOWN && (l = Gi.INTERSECTING), l;\n}\nfunction Vn() {\n return [1 / 0, 1 / 0, -1 / 0, -1 / 0];\n}\nfunction Ha(n, e, t, i, r) {\n return r ? (r[0] = n, r[1] = e, r[2] = t, r[3] = i, r) : [n, e, t, i];\n}\nfunction Qo(n) {\n return Ha(1 / 0, 1 / 0, -1 / 0, -1 / 0, n);\n}\nfunction $2(n, e) {\n const t = n[0], i = n[1];\n return Ha(t, i, t, i, e);\n}\nfunction ew(n, e, t, i, r) {\n const s = Qo(r);\n return AE(s, n, e, t, i);\n}\nfunction Cu(n, e) {\n return n[0] == e[0] && n[2] == e[2] && n[1] == e[1] && n[3] == e[3];\n}\nfunction tw(n, e) {\n return e[0] < n[0] && (n[0] = e[0]), e[2] > n[2] && (n[2] = e[2]), e[1] < n[1] && (n[1] = e[1]), e[3] > n[3] && (n[3] = e[3]), n;\n}\nfunction Kl(n, e) {\n e[0] < n[0] && (n[0] = e[0]), e[0] > n[2] && (n[2] = e[0]), e[1] < n[1] && (n[1] = e[1]), e[1] > n[3] && (n[3] = e[1]);\n}\nfunction AE(n, e, t, i, r) {\n for (; t < i; t += r)\n iw(n, e[t], e[t + 1]);\n return n;\n}\nfunction iw(n, e, t) {\n n[0] = Math.min(n[0], e), n[1] = Math.min(n[1], t), n[2] = Math.max(n[2], e), n[3] = Math.max(n[3], t);\n}\nfunction ME(n, e) {\n let t;\n return t = e(eh(n)), t || (t = e(th(n)), t) || (t = e(ih(n)), t) || (t = e(Bn(n)), t) ? t : !1;\n}\nfunction Ru(n) {\n let e = 0;\n return $o(n) || (e = Ui(n) * gs(n)), e;\n}\nfunction eh(n) {\n return [n[0], n[1]];\n}\nfunction th(n) {\n return [n[2], n[1]];\n}\nfunction Mo(n) {\n return [(n[0] + n[2]) / 2, (n[1] + n[3]) / 2];\n}\nfunction rw(n, e) {\n let t;\n return e === \"bottom-left\" ? t = eh(n) : e === \"bottom-right\" ? t = th(n) : e === \"top-left\" ? t = Bn(n) : e === \"top-right\" ? t = ih(n) : Kt(!1, 13), t;\n}\nfunction Su(n, e, t, i, r) {\n const [s, a, o, l, c, h, u, f] = yu(\n n,\n e,\n t,\n i\n );\n return Ha(\n Math.min(s, o, c, u),\n Math.min(a, l, h, f),\n Math.max(s, o, c, u),\n Math.max(a, l, h, f),\n r\n );\n}\nfunction yu(n, e, t, i) {\n const r = e * i[0] / 2, s = e * i[1] / 2, a = Math.cos(t), o = Math.sin(t), l = r * a, c = r * o, h = s * a, u = s * o, f = n[0], d = n[1];\n return [\n f - l + u,\n d - c - h,\n f - l - u,\n d - c + h,\n f + l - u,\n d + c + h,\n f + l + u,\n d + c - h,\n f - l + u,\n d - c - h\n ];\n}\nfunction gs(n) {\n return n[3] - n[1];\n}\nfunction fo(n, e, t) {\n const i = t || Vn();\n return Jo(n, e) ? (n[0] > e[0] ? i[0] = n[0] : i[0] = e[0], n[1] > e[1] ? i[1] = n[1] : i[1] = e[1], n[2] < e[2] ? i[2] = n[2] : i[2] = e[2], n[3] < e[3] ? i[3] = n[3] : i[3] = e[3]) : Qo(i), i;\n}\nfunction Bn(n) {\n return [n[0], n[3]];\n}\nfunction ih(n) {\n return [n[2], n[3]];\n}\nfunction Ui(n) {\n return n[2] - n[0];\n}\nfunction Jo(n, e) {\n return n[0] <= e[2] && n[2] >= e[0] && n[1] <= e[3] && n[3] >= e[1];\n}\nfunction $o(n) {\n return n[2] < n[0] || n[3] < n[1];\n}\nfunction sw(n, e) {\n return e ? (e[0] = n[0], e[1] = n[1], e[2] = n[2], e[3] = n[3], e) : n;\n}\nfunction nw(n, e, t) {\n let i = !1;\n const r = pm(n, e), s = pm(n, t);\n if (r === Gi.INTERSECTING || s === Gi.INTERSECTING)\n i = !0;\n else {\n const a = n[0], o = n[1], l = n[2], c = n[3], h = e[0], u = e[1], f = t[0], d = t[1], p = (d - u) / (f - h);\n let g, m;\n s & Gi.ABOVE && !(r & Gi.ABOVE) && (g = f - (d - c) / p, i = g >= a && g <= l), !i && s & Gi.RIGHT && !(r & Gi.RIGHT) && (m = d - (f - l) * p, i = m >= o && m <= c), !i && s & Gi.BELOW && !(r & Gi.BELOW) && (g = f - (d - o) / p, i = g >= a && g <= l), !i && s & Gi.LEFT && !(r & Gi.LEFT) && (m = d - (f - a) * p, i = m >= o && m <= c);\n }\n return i;\n}\nfunction aw(n, e, t, i) {\n if ($o(n))\n return Qo(t);\n let r = [];\n if (i > 1) {\n const o = n[2] - n[0], l = n[3] - n[1];\n for (let c = 0; c < i; ++c)\n r.push(\n n[0] + o * c / i,\n n[1],\n n[2],\n n[1] + l * c / i,\n n[2] - o * c / i,\n n[3],\n n[0],\n n[3] - l * c / i\n );\n } else\n r = [\n n[0],\n n[1],\n n[2],\n n[1],\n n[2],\n n[3],\n n[0],\n n[3]\n ];\n e(r, r, 2);\n const s = [], a = [];\n for (let o = 0, l = r.length; o < l; o += 2)\n s.push(r[o]), a.push(r[o + 1]);\n return j2(s, a, t);\n}\nfunction Vi(n, e, t) {\n return Math.min(Math.max(n, e), t);\n}\nfunction ow(n, e, t, i, r, s) {\n const a = r - t, o = s - i;\n if (a !== 0 || o !== 0) {\n const l = ((n - t) * a + (e - i) * o) / (a * a + o * o);\n l > 1 ? (t = r, i = s) : l > 0 && (t += a * l, i += o * l);\n }\n return Ca(n, e, t, i);\n}\nfunction Ca(n, e, t, i) {\n const r = t - n, s = i - e;\n return r * r + s * s;\n}\nfunction lw(n) {\n const e = n.length;\n for (let i = 0; i < e; i++) {\n let r = i, s = Math.abs(n[i][i]);\n for (let o = i + 1; o < e; o++) {\n const l = Math.abs(n[o][i]);\n l > s && (s = l, r = o);\n }\n if (s === 0)\n return null;\n const a = n[r];\n n[r] = n[i], n[i] = a;\n for (let o = i + 1; o < e; o++) {\n const l = -n[o][i] / n[i][i];\n for (let c = i; c < e + 1; c++)\n i == c ? n[o][c] = 0 : n[o][c] += l * n[i][c];\n }\n }\n const t = new Array(e);\n for (let i = e - 1; i >= 0; i--) {\n t[i] = n[i][e] / n[i][i];\n for (let r = i - 1; r >= 0; r--)\n n[r][e] -= n[r][i] * t[i];\n }\n return t;\n}\nfunction ql(n) {\n return n * Math.PI / 180;\n}\nfunction Ra(n, e) {\n const t = n % e;\n return t * e < 0 ? t + e : t;\n}\nfunction cw(n, e, t) {\n return n + t * (e - n);\n}\nfunction PE(n, e) {\n const t = Math.pow(10, e);\n return Math.round(n * t) / t;\n}\nfunction Tl(n, e) {\n return Math.floor(PE(n, e));\n}\nfunction xl(n, e) {\n return Math.ceil(PE(n, e));\n}\nconst hw = /^#([a-f0-9]{3}|[a-f0-9]{4}(?:[a-f0-9]{2}){0,2})$/i, uw = /^([a-z]*)$|^hsla?\\(.*\\)$/i;\nfunction fw(n) {\n return typeof n == \"string\" ? n : mw(n);\n}\nfunction dw(n) {\n const e = document.createElement(\"div\");\n if (e.style.color = n, e.style.color !== \"\") {\n document.body.appendChild(e);\n const t = getComputedStyle(e).color;\n return document.body.removeChild(e), t;\n }\n return \"\";\n}\nconst pw = /* @__PURE__ */ function() {\n const e = {};\n let t = 0;\n return (\n /**\n * @param {string} s String.\n * @return {Color} Color.\n */\n function(i) {\n let r;\n if (e.hasOwnProperty(i))\n r = e[i];\n else {\n if (t >= 1024) {\n let s = 0;\n for (const a in e)\n s++ & 3 || (delete e[a], --t);\n }\n r = gw(i), e[i] = r, ++t;\n }\n return r;\n }\n );\n}();\nfunction gm(n) {\n return Array.isArray(n) ? n : pw(n);\n}\nfunction gw(n) {\n let e, t, i, r, s;\n if (uw.exec(n) && (n = dw(n)), hw.exec(n)) {\n const a = n.length - 1;\n let o;\n a <= 4 ? o = 1 : o = 2;\n const l = a === 4 || a === 8;\n e = parseInt(n.substr(1 + 0 * o, o), 16), t = parseInt(n.substr(1 + 1 * o, o), 16), i = parseInt(n.substr(1 + 2 * o, o), 16), l ? r = parseInt(n.substr(1 + 3 * o, o), 16) : r = 255, o == 1 && (e = (e << 4) + e, t = (t << 4) + t, i = (i << 4) + i, l && (r = (r << 4) + r)), s = [e, t, i, r / 255];\n } else\n n.startsWith(\"rgba(\") ? (s = n.slice(5, -1).split(\",\").map(Number), mm(s)) : n.startsWith(\"rgb(\") ? (s = n.slice(4, -1).split(\",\").map(Number), s.push(1), mm(s)) : Kt(!1, 14);\n return s;\n}\nfunction mm(n) {\n return n[0] = Vi(n[0] + 0.5 | 0, 0, 255), n[1] = Vi(n[1] + 0.5 | 0, 0, 255), n[2] = Vi(n[2] + 0.5 | 0, 0, 255), n[3] = Vi(n[3], 0, 1), n;\n}\nfunction mw(n) {\n let e = n[0];\n e != (e | 0) && (e = e + 0.5 | 0);\n let t = n[1];\n t != (t | 0) && (t = t + 0.5 | 0);\n let i = n[2];\n i != (i | 0) && (i = i + 0.5 | 0);\n const r = n[3] === void 0 ? 1 : Math.round(n[3] * 100) / 100;\n return \"rgba(\" + e + \",\" + t + \",\" + i + \",\" + r + \")\";\n}\nclass _w {\n constructor() {\n this.cache_ = {}, this.cacheSize_ = 0, this.maxCacheSize_ = 32;\n }\n /**\n * FIXME empty description for jsdoc\n */\n clear() {\n this.cache_ = {}, this.cacheSize_ = 0;\n }\n /**\n * @return {boolean} Can expire cache.\n */\n canExpireCache() {\n return this.cacheSize_ > this.maxCacheSize_;\n }\n /**\n * FIXME empty description for jsdoc\n */\n expire() {\n if (this.canExpireCache()) {\n let e = 0;\n for (const t in this.cache_) {\n const i = this.cache_[t];\n !(e++ & 3) && !i.hasListener() && (delete this.cache_[t], --this.cacheSize_);\n }\n }\n }\n /**\n * @param {string} src Src.\n * @param {?string} crossOrigin Cross origin.\n * @param {import(\"../color.js\").Color} color Color.\n * @return {import(\"./IconImage.js\").default} Icon image.\n */\n get(e, t, i) {\n const r = _m(e, t, i);\n return r in this.cache_ ? this.cache_[r] : null;\n }\n /**\n * @param {string} src Src.\n * @param {?string} crossOrigin Cross origin.\n * @param {import(\"../color.js\").Color} color Color.\n * @param {import(\"./IconImage.js\").default} iconImage Icon image.\n */\n set(e, t, i, r) {\n const s = _m(e, t, i);\n this.cache_[s] = r, ++this.cacheSize_;\n }\n /**\n * Set the cache size of the icon cache. Default is `32`. Change this value when\n * your map uses more than 32 different icon images and you are not caching icon\n * styles on the application level.\n * @param {number} maxCacheSize Cache max size.\n * @api\n */\n setSize(e) {\n this.maxCacheSize_ = e, this.expire();\n }\n}\nfunction _m(n, e, t) {\n const i = t ? fw(t) : \"null\";\n return e + \":\" + n + \":\" + i;\n}\nconst OE = new _w(), Gt = {\n OPACITY: \"opacity\",\n VISIBLE: \"visible\",\n EXTENT: \"extent\",\n Z_INDEX: \"zIndex\",\n MAX_RESOLUTION: \"maxResolution\",\n MIN_RESOLUTION: \"minResolution\",\n MAX_ZOOM: \"maxZoom\",\n MIN_ZOOM: \"minZoom\",\n SOURCE: \"source\",\n MAP: \"map\"\n};\nclass DE extends Ws {\n /**\n * @param {Options} options Layer options.\n */\n constructor(e) {\n super(), this.on, this.once, this.un, this.background_ = e.background;\n const t = Object.assign({}, e);\n typeof e.properties == \"object\" && (delete t.properties, Object.assign(t, e.properties)), t[Gt.OPACITY] = e.opacity !== void 0 ? e.opacity : 1, Kt(typeof t[Gt.OPACITY] == \"number\", 64), t[Gt.VISIBLE] = e.visible !== void 0 ? e.visible : !0, t[Gt.Z_INDEX] = e.zIndex, t[Gt.MAX_RESOLUTION] = e.maxResolution !== void 0 ? e.maxResolution : 1 / 0, t[Gt.MIN_RESOLUTION] = e.minResolution !== void 0 ? e.minResolution : 0, t[Gt.MIN_ZOOM] = e.minZoom !== void 0 ? e.minZoom : -1 / 0, t[Gt.MAX_ZOOM] = e.maxZoom !== void 0 ? e.maxZoom : 1 / 0, this.className_ = t.className !== void 0 ? t.className : \"ol-layer\", delete t.className, this.setProperties(t), this.state_ = null;\n }\n /**\n * Get the background for this layer.\n * @return {BackgroundColor|false} Layer background.\n */\n getBackground() {\n return this.background_;\n }\n /**\n * @return {string} CSS class name.\n */\n getClassName() {\n return this.className_;\n }\n /**\n * This method is not meant to be called by layers or layer renderers because the state\n * is incorrect if the layer is included in a layer group.\n *\n * @param {boolean} [managed] Layer is managed.\n * @return {import(\"./Layer.js\").State} Layer state.\n */\n getLayerState(e) {\n const t = this.state_ || /** @type {?} */\n {\n layer: this,\n managed: e === void 0 ? !0 : e\n }, i = this.getZIndex();\n return t.opacity = Vi(Math.round(this.getOpacity() * 100) / 100, 0, 1), t.visible = this.getVisible(), t.extent = this.getExtent(), t.zIndex = i === void 0 && !t.managed ? 1 / 0 : i, t.maxResolution = this.getMaxResolution(), t.minResolution = Math.max(this.getMinResolution(), 0), t.minZoom = this.getMinZoom(), t.maxZoom = this.getMaxZoom(), this.state_ = t, t;\n }\n /**\n * @abstract\n * @param {Array} [array] Array of layers (to be\n * modified in place).\n * @return {Array} Array of layers.\n */\n getLayersArray(e) {\n return di();\n }\n /**\n * @abstract\n * @param {Array} [states] Optional list of layer\n * states (to be modified in place).\n * @return {Array} List of layer states.\n */\n getLayerStatesArray(e) {\n return di();\n }\n /**\n * Return the {@link module:ol/extent~Extent extent} of the layer or `undefined` if it\n * will be visible regardless of extent.\n * @return {import(\"../extent.js\").Extent|undefined} The layer extent.\n * @observable\n * @api\n */\n getExtent() {\n return (\n /** @type {import(\"../extent.js\").Extent|undefined} */\n this.get(Gt.EXTENT)\n );\n }\n /**\n * Return the maximum resolution of the layer.\n * @return {number} The maximum resolution of the layer.\n * @observable\n * @api\n */\n getMaxResolution() {\n return (\n /** @type {number} */\n this.get(Gt.MAX_RESOLUTION)\n );\n }\n /**\n * Return the minimum resolution of the layer.\n * @return {number} The minimum resolution of the layer.\n * @observable\n * @api\n */\n getMinResolution() {\n return (\n /** @type {number} */\n this.get(Gt.MIN_RESOLUTION)\n );\n }\n /**\n * Return the minimum zoom level of the layer.\n * @return {number} The minimum zoom level of the layer.\n * @observable\n * @api\n */\n getMinZoom() {\n return (\n /** @type {number} */\n this.get(Gt.MIN_ZOOM)\n );\n }\n /**\n * Return the maximum zoom level of the layer.\n * @return {number} The maximum zoom level of the layer.\n * @observable\n * @api\n */\n getMaxZoom() {\n return (\n /** @type {number} */\n this.get(Gt.MAX_ZOOM)\n );\n }\n /**\n * Return the opacity of the layer (between 0 and 1).\n * @return {number} The opacity of the layer.\n * @observable\n * @api\n */\n getOpacity() {\n return (\n /** @type {number} */\n this.get(Gt.OPACITY)\n );\n }\n /**\n * @abstract\n * @return {import(\"../source/Source.js\").State} Source state.\n */\n getSourceState() {\n return di();\n }\n /**\n * Return the value of this layer's `visible` property. To find out whether the layer\n * is visible on a map, use `isVisible()` instead.\n * @return {boolean} The value of the `visible` property of the layer.\n * @observable\n * @api\n */\n getVisible() {\n return (\n /** @type {boolean} */\n this.get(Gt.VISIBLE)\n );\n }\n /**\n * Return the Z-index of the layer, which is used to order layers before\n * rendering. The default Z-index is 0.\n * @return {number} The Z-index of the layer.\n * @observable\n * @api\n */\n getZIndex() {\n return (\n /** @type {number} */\n this.get(Gt.Z_INDEX)\n );\n }\n /**\n * Sets the background color.\n * @param {BackgroundColor} [background] Background color.\n */\n setBackground(e) {\n this.background_ = e, this.changed();\n }\n /**\n * Set the extent at which the layer is visible. If `undefined`, the layer\n * will be visible at all extents.\n * @param {import(\"../extent.js\").Extent|undefined} extent The extent of the layer.\n * @observable\n * @api\n */\n setExtent(e) {\n this.set(Gt.EXTENT, e);\n }\n /**\n * Set the maximum resolution at which the layer is visible.\n * @param {number} maxResolution The maximum resolution of the layer.\n * @observable\n * @api\n */\n setMaxResolution(e) {\n this.set(Gt.MAX_RESOLUTION, e);\n }\n /**\n * Set the minimum resolution at which the layer is visible.\n * @param {number} minResolution The minimum resolution of the layer.\n * @observable\n * @api\n */\n setMinResolution(e) {\n this.set(Gt.MIN_RESOLUTION, e);\n }\n /**\n * Set the maximum zoom (exclusive) at which the layer is visible.\n * Note that the zoom levels for layer visibility are based on the\n * view zoom level, which may be different from a tile source zoom level.\n * @param {number} maxZoom The maximum zoom of the layer.\n * @observable\n * @api\n */\n setMaxZoom(e) {\n this.set(Gt.MAX_ZOOM, e);\n }\n /**\n * Set the minimum zoom (inclusive) at which the layer is visible.\n * Note that the zoom levels for layer visibility are based on the\n * view zoom level, which may be different from a tile source zoom level.\n * @param {number} minZoom The minimum zoom of the layer.\n * @observable\n * @api\n */\n setMinZoom(e) {\n this.set(Gt.MIN_ZOOM, e);\n }\n /**\n * Set the opacity of the layer, allowed values range from 0 to 1.\n * @param {number} opacity The opacity of the layer.\n * @observable\n * @api\n */\n setOpacity(e) {\n Kt(typeof e == \"number\", 64), this.set(Gt.OPACITY, e);\n }\n /**\n * Set the visibility of the layer (`true` or `false`).\n * @param {boolean} visible The visibility of the layer.\n * @observable\n * @api\n */\n setVisible(e) {\n this.set(Gt.VISIBLE, e);\n }\n /**\n * Set Z-index of the layer, which is used to order layers before rendering.\n * The default Z-index is 0.\n * @param {number} zindex The z-index of the layer.\n * @observable\n * @api\n */\n setZIndex(e) {\n this.set(Gt.Z_INDEX, e);\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n this.state_ && (this.state_.layer = null, this.state_ = null), super.disposeInternal();\n }\n}\nconst nn = {\n /**\n * Triggered before a layer is rendered.\n * @event module:ol/render/Event~RenderEvent#prerender\n * @api\n */\n PRERENDER: \"prerender\",\n /**\n * Triggered after a layer is rendered.\n * @event module:ol/render/Event~RenderEvent#postrender\n * @api\n */\n POSTRENDER: \"postrender\",\n /**\n * Triggered before layers are composed. When dispatched by the map, the event object will not have\n * a `context` set. When dispatched by a layer, the event object will have a `context` set. Only\n * WebGL layers currently dispatch this event.\n * @event module:ol/render/Event~RenderEvent#precompose\n * @api\n */\n PRECOMPOSE: \"precompose\",\n /**\n * Triggered after layers are composed. When dispatched by the map, the event object will not have\n * a `context` set. When dispatched by a layer, the event object will have a `context` set. Only\n * WebGL layers currently dispatch this event.\n * @event module:ol/render/Event~RenderEvent#postcompose\n * @api\n */\n POSTCOMPOSE: \"postcompose\",\n /**\n * Triggered when rendering is complete, i.e. all sources and tiles have\n * finished loading for the current viewport, and all tiles are faded in.\n * The event object will not have a `context` set.\n * @event module:ol/render/Event~RenderEvent#rendercomplete\n * @api\n */\n RENDERCOMPLETE: \"rendercomplete\"\n}, Mr = {\n ANIMATING: 0,\n INTERACTING: 1\n}, Xr = {\n CENTER: \"center\",\n RESOLUTION: \"resolution\",\n ROTATION: \"rotation\"\n}, Ew = 42, qf = 256, Po = {\n // use the radius of the Normal sphere\n radians: 6370997 / (2 * Math.PI),\n degrees: 2 * Math.PI * 6370997 / 360,\n ft: 0.3048,\n m: 1,\n \"us-ft\": 1200 / 3937\n};\nclass NE {\n /**\n * @param {Options} options Projection options.\n */\n constructor(e) {\n this.code_ = e.code, this.units_ = /** @type {import(\"./Units.js\").Units} */\n e.units, this.extent_ = e.extent !== void 0 ? e.extent : null, this.worldExtent_ = e.worldExtent !== void 0 ? e.worldExtent : null, this.axisOrientation_ = e.axisOrientation !== void 0 ? e.axisOrientation : \"enu\", this.global_ = e.global !== void 0 ? e.global : !1, this.canWrapX_ = !!(this.global_ && this.extent_), this.getPointResolutionFunc_ = e.getPointResolution, this.defaultTileGrid_ = null, this.metersPerUnit_ = e.metersPerUnit;\n }\n /**\n * @return {boolean} The projection is suitable for wrapping the x-axis\n */\n canWrapX() {\n return this.canWrapX_;\n }\n /**\n * Get the code for this projection, e.g. 'EPSG:4326'.\n * @return {string} Code.\n * @api\n */\n getCode() {\n return this.code_;\n }\n /**\n * Get the validity extent for this projection.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getExtent() {\n return this.extent_;\n }\n /**\n * Get the units of this projection.\n * @return {import(\"./Units.js\").Units} Units.\n * @api\n */\n getUnits() {\n return this.units_;\n }\n /**\n * Get the amount of meters per unit of this projection. If the projection is\n * not configured with `metersPerUnit` or a units identifier, the return is\n * `undefined`.\n * @return {number|undefined} Meters.\n * @api\n */\n getMetersPerUnit() {\n return this.metersPerUnit_ || Po[this.units_];\n }\n /**\n * Get the world extent for this projection.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getWorldExtent() {\n return this.worldExtent_;\n }\n /**\n * Get the axis orientation of this projection.\n * Example values are:\n * enu - the default easting, northing, elevation.\n * neu - northing, easting, up - useful for \"lat/long\" geographic coordinates,\n * or south orientated transverse mercator.\n * wnu - westing, northing, up - some planetary coordinate systems have\n * \"west positive\" coordinate systems\n * @return {string} Axis orientation.\n * @api\n */\n getAxisOrientation() {\n return this.axisOrientation_;\n }\n /**\n * Is this projection a global projection which spans the whole world?\n * @return {boolean} Whether the projection is global.\n * @api\n */\n isGlobal() {\n return this.global_;\n }\n /**\n * Set if the projection is a global projection which spans the whole world\n * @param {boolean} global Whether the projection is global.\n * @api\n */\n setGlobal(e) {\n this.global_ = e, this.canWrapX_ = !!(e && this.extent_);\n }\n /**\n * @return {import(\"../tilegrid/TileGrid.js\").default} The default tile grid.\n */\n getDefaultTileGrid() {\n return this.defaultTileGrid_;\n }\n /**\n * @param {import(\"../tilegrid/TileGrid.js\").default} tileGrid The default tile grid.\n */\n setDefaultTileGrid(e) {\n this.defaultTileGrid_ = e;\n }\n /**\n * Set the validity extent for this projection.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @api\n */\n setExtent(e) {\n this.extent_ = e, this.canWrapX_ = !!(this.global_ && e);\n }\n /**\n * Set the world extent for this projection.\n * @param {import(\"../extent.js\").Extent} worldExtent World extent\n * [minlon, minlat, maxlon, maxlat].\n * @api\n */\n setWorldExtent(e) {\n this.worldExtent_ = e;\n }\n /**\n * Set the getPointResolution function (see {@link module:ol/proj.getPointResolution}\n * for this projection.\n * @param {function(number, import(\"../coordinate.js\").Coordinate):number} func Function\n * @api\n */\n setGetPointResolution(e) {\n this.getPointResolutionFunc_ = e;\n }\n /**\n * Get the custom point resolution function for this projection (if set).\n * @return {function(number, import(\"../coordinate.js\").Coordinate):number|undefined} The custom point\n * resolution function (if set).\n */\n getPointResolutionFunc() {\n return this.getPointResolutionFunc_;\n }\n}\nconst el = 6378137, ca = Math.PI * el, vw = [-ca, -ca, ca, ca], Tw = [-180, -85, 180, 85], Cl = el * Math.log(Math.tan(Math.PI / 2));\nclass ea extends NE {\n /**\n * @param {string} code Code.\n */\n constructor(e) {\n super({\n code: e,\n units: \"m\",\n extent: vw,\n global: !0,\n worldExtent: Tw,\n getPointResolution: function(t, i) {\n return t / Math.cosh(i[1] / el);\n }\n });\n }\n}\nconst Em = [\n new ea(\"EPSG:3857\"),\n new ea(\"EPSG:102100\"),\n new ea(\"EPSG:102113\"),\n new ea(\"EPSG:900913\"),\n new ea(\"http://www.opengis.net/def/crs/EPSG/0/3857\"),\n new ea(\"http://www.opengis.net/gml/srs/epsg.xml#3857\")\n];\nfunction xw(n, e, t) {\n const i = n.length;\n t = t > 1 ? t : 2, e === void 0 && (t > 2 ? e = n.slice() : e = new Array(i));\n for (let r = 0; r < i; r += t) {\n e[r] = ca * n[r] / 180;\n let s = el * Math.log(Math.tan(Math.PI * (+n[r + 1] + 90) / 360));\n s > Cl ? s = Cl : s < -Cl && (s = -Cl), e[r + 1] = s;\n }\n return e;\n}\nfunction Cw(n, e, t) {\n const i = n.length;\n t = t > 1 ? t : 2, e === void 0 && (t > 2 ? e = n.slice() : e = new Array(i));\n for (let r = 0; r < i; r += t)\n e[r] = 180 * n[r] / ca, e[r + 1] = 360 * Math.atan(Math.exp(n[r + 1] / el)) / Math.PI - 90;\n return e;\n}\nconst Rw = 6378137, vm = [-180, -90, 180, 90], Sw = Math.PI * Rw / 180;\nclass Tn extends NE {\n /**\n * @param {string} code Code.\n * @param {string} [axisOrientation] Axis orientation.\n */\n constructor(e, t) {\n super({\n code: e,\n units: \"degrees\",\n extent: vm,\n axisOrientation: t,\n global: !0,\n metersPerUnit: Sw,\n worldExtent: vm\n });\n }\n}\nconst Tm = [\n new Tn(\"CRS:84\"),\n new Tn(\"EPSG:4326\", \"neu\"),\n new Tn(\"urn:ogc:def:crs:OGC:1.3:CRS84\"),\n new Tn(\"urn:ogc:def:crs:OGC:2:84\"),\n new Tn(\"http://www.opengis.net/def/crs/OGC/1.3/CRS84\"),\n new Tn(\"http://www.opengis.net/gml/srs/epsg.xml#4326\", \"neu\"),\n new Tn(\"http://www.opengis.net/def/crs/EPSG/0/4326\", \"neu\")\n];\nlet Iu = {};\nfunction yw(n) {\n return Iu[n] || Iu[n.replace(/urn:(x-)?ogc:def:crs:EPSG:(.*:)?(\\w+)$/, \"EPSG:$3\")] || null;\n}\nfunction Iw(n, e) {\n Iu[n] = e;\n}\nlet Sa = {};\nfunction pc(n, e, t) {\n const i = n.getCode(), r = e.getCode();\n i in Sa || (Sa[i] = {}), Sa[i][r] = t;\n}\nfunction bw(n, e) {\n let t;\n return n in Sa && e in Sa[n] && (t = Sa[n][e]), t;\n}\nfunction Aw(n, e) {\n return n[0] += +e[0], n[1] += +e[1], n;\n}\nfunction gc(n, e) {\n let t = !0;\n for (let i = n.length - 1; i >= 0; --i)\n if (n[i] != e[i]) {\n t = !1;\n break;\n }\n return t;\n}\nfunction Yf(n, e) {\n const t = Math.cos(e), i = Math.sin(e), r = n[0] * t - n[1] * i, s = n[1] * t + n[0] * i;\n return n[0] = r, n[1] = s, n;\n}\nfunction Mw(n, e) {\n return n[0] *= e, n[1] *= e, n;\n}\nfunction Pw(n, e) {\n if (e.canWrapX()) {\n const t = Ui(e.getExtent()), i = Ow(n, e, t);\n i && (n[0] -= i * t);\n }\n return n;\n}\nfunction Ow(n, e, t) {\n const i = e.getExtent();\n let r = 0;\n return e.canWrapX() && (n[0] < i[0] || n[0] > i[2]) && (t = t || Ui(i), r = Math.floor(\n (n[0] - i[0]) / t\n )), r;\n}\nconst Dw = 63710088e-1;\nfunction xm(n, e, t) {\n t = t || Dw;\n const i = ql(n[1]), r = ql(e[1]), s = (r - i) / 2, a = ql(e[0] - n[0]) / 2, o = Math.sin(s) * Math.sin(s) + Math.sin(a) * Math.sin(a) * Math.cos(i) * Math.cos(r);\n return 2 * t * Math.atan2(Math.sqrt(o), Math.sqrt(1 - o));\n}\nfunction FE(...n) {\n console.warn(...n);\n}\nlet bu = !0;\nfunction Nw(n) {\n bu = !(n === void 0 ? !0 : n);\n}\nfunction Zf(n, e) {\n if (e !== void 0) {\n for (let t = 0, i = n.length; t < i; ++t)\n e[t] = n[t];\n e = e;\n } else\n e = n.slice();\n return e;\n}\nfunction LE(n, e) {\n if (e !== void 0 && n !== e) {\n for (let t = 0, i = n.length; t < i; ++t)\n e[t] = n[t];\n n = e;\n }\n return n;\n}\nfunction Fw(n) {\n Iw(n.getCode(), n), pc(n, n, Zf);\n}\nfunction Lw(n) {\n n.forEach(Fw);\n}\nfunction Lr(n) {\n return typeof n == \"string\" ? yw(\n /** @type {string} */\n n\n ) : (\n /** @type {Projection} */\n n || null\n );\n}\nfunction Cm(n, e, t, i) {\n n = Lr(n);\n let r;\n const s = n.getPointResolutionFunc();\n if (s) {\n if (r = s(e, t), i && i !== n.getUnits()) {\n const a = n.getMetersPerUnit();\n a && (r = r * a / Po[i]);\n }\n } else {\n const a = n.getUnits();\n if (a == \"degrees\" && !i || i == \"degrees\")\n r = e;\n else {\n const o = Qf(\n n,\n Lr(\"EPSG:4326\")\n );\n if (o === LE && a !== \"degrees\")\n r = e * n.getMetersPerUnit();\n else {\n let c = [\n t[0] - e / 2,\n t[1],\n t[0] + e / 2,\n t[1],\n t[0],\n t[1] - e / 2,\n t[0],\n t[1] + e / 2\n ];\n c = o(c, c, 2);\n const h = xm(c.slice(0, 2), c.slice(2, 4)), u = xm(c.slice(4, 6), c.slice(6, 8));\n r = (h + u) / 2;\n }\n const l = i ? Po[i] : n.getMetersPerUnit();\n l !== void 0 && (r /= l);\n }\n }\n return r;\n}\nfunction Rm(n) {\n Lw(n), n.forEach(function(e) {\n n.forEach(function(t) {\n e !== t && pc(e, t, Zf);\n });\n });\n}\nfunction ww(n, e, t, i) {\n n.forEach(function(r) {\n e.forEach(function(s) {\n pc(r, s, t), pc(s, r, i);\n });\n });\n}\nfunction jf(n, e) {\n return n ? typeof n == \"string\" ? Lr(n) : (\n /** @type {Projection} */\n n\n ) : Lr(e);\n}\nfunction aa(n, e) {\n if (n === e)\n return !0;\n const t = n.getUnits() === e.getUnits();\n return (n.getCode() === e.getCode() || Qf(n, e) === Zf) && t;\n}\nfunction Qf(n, e) {\n const t = n.getCode(), i = e.getCode();\n let r = bw(t, i);\n return r || (r = LE), r;\n}\nfunction Oo(n, e) {\n const t = Lr(n), i = Lr(e);\n return Qf(t, i);\n}\nfunction Jf(n, e, t) {\n return Oo(e, t)(n, void 0, n.length);\n}\nfunction wE(n, e, t, i) {\n const r = Oo(e, t);\n return aw(n, r, void 0, i);\n}\nlet ms = null;\nfunction Uw(n) {\n ms = Lr(n);\n}\nfunction Vw() {\n return ms;\n}\nfunction Bw() {\n Uw(\"EPSG:4326\");\n}\nfunction Au(n, e) {\n return ms ? Jf(n, e, ms) : n;\n}\nfunction Ps(n, e) {\n return ms ? Jf(n, ms, e) : (bu && !gc(n, [0, 0]) && n[0] >= -180 && n[0] <= 180 && n[1] >= -90 && n[1] <= 90 && (bu = !1, FE(\n \"Call useGeographic() from ol/proj once to work with [longitude, latitude] coordinates.\"\n )), n);\n}\nfunction kw(n, e) {\n return ms ? wE(n, e, ms) : n;\n}\nfunction ha(n, e) {\n return ms ? wE(n, ms, e) : n;\n}\nfunction zw() {\n Rm(Em), Rm(Tm), ww(\n Tm,\n Em,\n xw,\n Cw\n );\n}\nzw();\nfunction Sm(n, e, t) {\n return (\n /**\n * @param {import(\"./coordinate.js\").Coordinate|undefined} center Center.\n * @param {number|undefined} resolution Resolution.\n * @param {import(\"./size.js\").Size} size Viewport size; unused if `onlyCenter` was specified.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @param {Array} [centerShift] Shift between map center and viewport center.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center.\n */\n function(i, r, s, a, o) {\n if (!i)\n return;\n if (!r && !e)\n return i;\n const l = e ? 0 : s[0] * r, c = e ? 0 : s[1] * r, h = o ? o[0] : 0, u = o ? o[1] : 0;\n let f = n[0] + l / 2 + h, d = n[2] - l / 2 + h, p = n[1] + c / 2 + u, g = n[3] - c / 2 + u;\n f > d && (f = (d + f) / 2, d = f), p > g && (p = (g + p) / 2, g = p);\n let m = Vi(i[0], f, d), v = Vi(i[1], p, g);\n if (a && t && r) {\n const E = 30 * r;\n m += -E * Math.log(1 + Math.max(0, f - i[0]) / E) + E * Math.log(1 + Math.max(0, i[0] - d) / E), v += -E * Math.log(1 + Math.max(0, p - i[1]) / E) + E * Math.log(1 + Math.max(0, i[1] - g) / E);\n }\n return [m, v];\n }\n );\n}\nfunction Ww(n) {\n return n;\n}\nfunction $f(n, e, t, i) {\n const r = Ui(e) / t[0], s = gs(e) / t[1];\n return i ? Math.min(n, Math.max(r, s)) : Math.min(n, Math.min(r, s));\n}\nfunction ed(n, e, t) {\n let i = Math.min(n, e);\n const r = 50;\n return i *= Math.log(1 + r * Math.max(0, n / e - 1)) / r + 1, t && (i = Math.max(i, t), i /= Math.log(1 + r * Math.max(0, t / n - 1)) / r + 1), Vi(i, t / 2, e * 2);\n}\nfunction Gw(n, e, t, i) {\n return e = e !== void 0 ? e : !0, /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import(\"./size.js\").Size} size Viewport size.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function(r, s, a, o) {\n if (r !== void 0) {\n const l = n[0], c = n[n.length - 1], h = t ? $f(\n l,\n t,\n a,\n i\n ) : l;\n if (o)\n return e ? ed(\n r,\n h,\n c\n ) : Vi(r, c, h);\n const u = Math.min(h, r), f = Math.floor(Xf(n, u, s));\n return n[f] > h && f < n.length - 1 ? n[f + 1] : n[f];\n }\n };\n}\nfunction Xw(n, e, t, i, r, s) {\n return i = i !== void 0 ? i : !0, t = t !== void 0 ? t : 0, /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import(\"./size.js\").Size} size Viewport size.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function(a, o, l, c) {\n if (a !== void 0) {\n const h = r ? $f(\n e,\n r,\n l,\n s\n ) : e;\n if (c)\n return i ? ed(\n a,\n h,\n t\n ) : Vi(a, t, h);\n const u = 1e-9, f = Math.ceil(\n Math.log(e / h) / Math.log(n) - u\n ), d = -o * (0.5 - u) + 0.5, p = Math.min(h, a), g = Math.floor(\n Math.log(e / p) / Math.log(n) + d\n ), m = Math.max(f, g), v = e / Math.pow(n, m);\n return Vi(v, t, h);\n }\n };\n}\nfunction ym(n, e, t, i, r) {\n return t = t !== void 0 ? t : !0, /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import(\"./size.js\").Size} size Viewport size.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function(s, a, o, l) {\n if (s !== void 0) {\n const c = i ? $f(\n n,\n i,\n o,\n r\n ) : n;\n return !t || !l ? Vi(s, e, c) : ed(\n s,\n c,\n e\n );\n }\n };\n}\nfunction td(n) {\n if (n !== void 0)\n return 0;\n}\nfunction Im(n) {\n if (n !== void 0)\n return n;\n}\nfunction Hw(n) {\n const e = 2 * Math.PI / n;\n return (\n /**\n * @param {number|undefined} rotation Rotation.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Rotation.\n */\n function(t, i) {\n if (i)\n return t;\n if (t !== void 0)\n return t = Math.floor(t / e + 0.5) * e, t;\n }\n );\n}\nfunction Kw(n) {\n return n = n || ql(5), /**\n * @param {number|undefined} rotation Rotation.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Rotation.\n */\n function(e, t) {\n if (t)\n return e;\n if (e !== void 0)\n return Math.abs(e) <= n ? 0 : e;\n };\n}\nfunction UE(n) {\n return Math.pow(n, 3);\n}\nfunction Ka(n) {\n return 1 - UE(1 - n);\n}\nfunction qw(n) {\n return 3 * n * n - 2 * n * n * n;\n}\nfunction Yw(n) {\n return n;\n}\nfunction Zw(n, e, t, i, r, s) {\n s = s || [];\n let a = 0;\n for (let o = e; o < t; o += i) {\n const l = n[o], c = n[o + 1];\n s[a++] = r[0] * l + r[2] * c + r[4], s[a++] = r[1] * l + r[3] * c + r[5];\n }\n return s && s.length != a && (s.length = a), s;\n}\nfunction jw(n, e, t, i, r, s, a) {\n a = a || [];\n const o = Math.cos(r), l = Math.sin(r), c = s[0], h = s[1];\n let u = 0;\n for (let f = e; f < t; f += i) {\n const d = n[f] - c, p = n[f + 1] - h;\n a[u++] = c + d * o - p * l, a[u++] = h + d * l + p * o;\n for (let g = f + 2; g < f + i; ++g)\n a[u++] = n[g];\n }\n return a && a.length != u && (a.length = u), a;\n}\nfunction Qw(n, e, t, i, r, s, a, o) {\n o = o || [];\n const l = a[0], c = a[1];\n let h = 0;\n for (let u = e; u < t; u += i) {\n const f = n[u] - l, d = n[u + 1] - c;\n o[h++] = l + r * f, o[h++] = c + s * d;\n for (let p = u + 2; p < u + i; ++p)\n o[h++] = n[p];\n }\n return o && o.length != h && (o.length = h), o;\n}\nfunction Jw(n, e, t, i, r, s, a) {\n a = a || [];\n let o = 0;\n for (let l = e; l < t; l += i) {\n a[o++] = n[l] + r, a[o++] = n[l + 1] + s;\n for (let c = l + 2; c < l + i; ++c)\n a[o++] = n[c];\n }\n return a && a.length != o && (a.length = o), a;\n}\nconst bm = xa();\nclass $w extends Ws {\n constructor() {\n super(), this.extent_ = Vn(), this.extentRevision_ = -1, this.simplifiedGeometryMaxMinSquaredTolerance = 0, this.simplifiedGeometryRevision = 0, this.simplifyTransformedInternal = B2(function(e, t, i) {\n if (!i)\n return this.getSimplifiedGeometry(t);\n const r = this.clone();\n return r.applyTransform(i), r.getSimplifiedGeometry(t);\n });\n }\n /**\n * Get a transformed and simplified version of the geometry.\n * @abstract\n * @param {number} squaredTolerance Squared tolerance.\n * @param {import(\"../proj.js\").TransformFunction} [transform] Optional transform function.\n * @return {Geometry} Simplified geometry.\n */\n simplifyTransformed(e, t) {\n return this.simplifyTransformedInternal(\n this.getRevision(),\n e,\n t\n );\n }\n /**\n * Make a complete copy of the geometry.\n * @abstract\n * @return {!Geometry} Clone.\n */\n clone() {\n return di();\n }\n /**\n * @abstract\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(e, t, i, r) {\n return di();\n }\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\n containsXY(e, t) {\n const i = this.getClosestPoint([e, t]);\n return i[0] === e && i[1] === t;\n }\n /**\n * Return the closest point of the geometry to the passed point as\n * {@link module:ol/coordinate~Coordinate coordinate}.\n * @param {import(\"../coordinate.js\").Coordinate} point Point.\n * @param {import(\"../coordinate.js\").Coordinate} [closestPoint] Closest point.\n * @return {import(\"../coordinate.js\").Coordinate} Closest point.\n * @api\n */\n getClosestPoint(e, t) {\n return t = t || [NaN, NaN], this.closestPointXY(e[0], e[1], t, 1 / 0), t;\n }\n /**\n * Returns true if this geometry includes the specified coordinate. If the\n * coordinate is on the boundary of the geometry, returns false.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @return {boolean} Contains coordinate.\n * @api\n */\n intersectsCoordinate(e) {\n return this.containsXY(e[0], e[1]);\n }\n /**\n * @abstract\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @protected\n * @return {import(\"../extent.js\").Extent} extent Extent.\n */\n computeExtent(e) {\n return di();\n }\n /**\n * Get the extent of the geometry.\n * @param {import(\"../extent.js\").Extent} [extent] Extent.\n * @return {import(\"../extent.js\").Extent} extent Extent.\n * @api\n */\n getExtent(e) {\n if (this.extentRevision_ != this.getRevision()) {\n const t = this.computeExtent(this.extent_);\n (isNaN(t[0]) || isNaN(t[1])) && Qo(t), this.extentRevision_ = this.getRevision();\n }\n return sw(this.extent_, e);\n }\n /**\n * Rotate the geometry around a given coordinate. This modifies the geometry\n * coordinates in place.\n * @abstract\n * @param {number} angle Rotation angle in radians.\n * @param {import(\"../coordinate.js\").Coordinate} anchor The rotation center.\n * @api\n */\n rotate(e, t) {\n di();\n }\n /**\n * Scale the geometry (with an optional origin). This modifies the geometry\n * coordinates in place.\n * @abstract\n * @param {number} sx The scaling factor in the x-direction.\n * @param {number} [sy] The scaling factor in the y-direction (defaults to sx).\n * @param {import(\"../coordinate.js\").Coordinate} [anchor] The scale origin (defaults to the center\n * of the geometry extent).\n * @api\n */\n scale(e, t, i) {\n di();\n }\n /**\n * Create a simplified version of this geometry. For linestrings, this uses\n * the [Douglas Peucker](https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm)\n * algorithm. For polygons, a quantization-based\n * simplification is used to preserve topology.\n * @param {number} tolerance The tolerance distance for simplification.\n * @return {Geometry} A new, simplified version of the original geometry.\n * @api\n */\n simplify(e) {\n return this.getSimplifiedGeometry(e * e);\n }\n /**\n * Create a simplified version of this geometry using the Douglas Peucker\n * algorithm.\n * See https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm.\n * @abstract\n * @param {number} squaredTolerance Squared tolerance.\n * @return {Geometry} Simplified geometry.\n */\n getSimplifiedGeometry(e) {\n return di();\n }\n /**\n * Get the type of this geometry.\n * @abstract\n * @return {Type} Geometry type.\n */\n getType() {\n return di();\n }\n /**\n * Apply a transform function to the coordinates of the geometry.\n * The geometry is modified in place.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n * @abstract\n * @param {import(\"../proj.js\").TransformFunction} transformFn Transform function.\n * Called with a flat array of geometry coordinates.\n */\n applyTransform(e) {\n di();\n }\n /**\n * Test if the geometry and the passed extent intersect.\n * @abstract\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n */\n intersectsExtent(e) {\n return di();\n }\n /**\n * Translate the geometry. This modifies the geometry coordinates in place. If\n * instead you want a new geometry, first `clone()` this geometry.\n * @abstract\n * @param {number} deltaX Delta X.\n * @param {number} deltaY Delta Y.\n * @api\n */\n translate(e, t) {\n di();\n }\n /**\n * Transform each coordinate of the geometry from one coordinate reference\n * system to another. The geometry is modified in place.\n * For example, a line will be transformed to a line and a circle to a circle.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n *\n * @param {import(\"../proj.js\").ProjectionLike} source The current projection. Can be a\n * string identifier or a {@link module:ol/proj/Projection~Projection} object.\n * @param {import(\"../proj.js\").ProjectionLike} destination The desired projection. Can be a\n * string identifier or a {@link module:ol/proj/Projection~Projection} object.\n * @return {Geometry} This geometry. Note that original geometry is\n * modified in place.\n * @api\n */\n transform(e, t) {\n const i = Lr(e), r = i.getUnits() == \"tile-pixels\" ? function(s, a, o) {\n const l = i.getExtent(), c = i.getWorldExtent(), h = gs(c) / gs(l);\n return Ao(\n bm,\n c[0],\n c[3],\n h,\n -h,\n 0,\n 0,\n 0\n ), Zw(\n s,\n 0,\n s.length,\n o,\n bm,\n a\n ), Oo(i, t)(\n s,\n a,\n o\n );\n } : Oo(i, t);\n return this.applyTransform(r), this;\n }\n}\nclass id extends $w {\n constructor() {\n super(), this.layout = \"XY\", this.stride = 2, this.flatCoordinates = null;\n }\n /**\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @protected\n * @return {import(\"../extent.js\").Extent} extent Extent.\n */\n computeExtent(e) {\n return ew(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n e\n );\n }\n /**\n * @abstract\n * @return {Array<*> | null} Coordinates.\n */\n getCoordinates() {\n return di();\n }\n /**\n * Return the first coordinate of the geometry.\n * @return {import(\"../coordinate.js\").Coordinate} First coordinate.\n * @api\n */\n getFirstCoordinate() {\n return this.flatCoordinates.slice(0, this.stride);\n }\n /**\n * @return {Array} Flat coordinates.\n */\n getFlatCoordinates() {\n return this.flatCoordinates;\n }\n /**\n * Return the last coordinate of the geometry.\n * @return {import(\"../coordinate.js\").Coordinate} Last point.\n * @api\n */\n getLastCoordinate() {\n return this.flatCoordinates.slice(\n this.flatCoordinates.length - this.stride\n );\n }\n /**\n * Return the {@link import(\"./Geometry.js\").GeometryLayout layout} of the geometry.\n * @return {import(\"./Geometry.js\").GeometryLayout} Layout.\n * @api\n */\n getLayout() {\n return this.layout;\n }\n /**\n * Create a simplified version of this geometry using the Douglas Peucker algorithm.\n * @param {number} squaredTolerance Squared tolerance.\n * @return {SimpleGeometry} Simplified geometry.\n */\n getSimplifiedGeometry(e) {\n if (this.simplifiedGeometryRevision !== this.getRevision() && (this.simplifiedGeometryMaxMinSquaredTolerance = 0, this.simplifiedGeometryRevision = this.getRevision()), e < 0 || this.simplifiedGeometryMaxMinSquaredTolerance !== 0 && e <= this.simplifiedGeometryMaxMinSquaredTolerance)\n return this;\n const t = this.getSimplifiedGeometryInternal(e);\n return t.getFlatCoordinates().length < this.flatCoordinates.length ? t : (this.simplifiedGeometryMaxMinSquaredTolerance = e, this);\n }\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {SimpleGeometry} Simplified geometry.\n * @protected\n */\n getSimplifiedGeometryInternal(e) {\n return this;\n }\n /**\n * @return {number} Stride.\n */\n getStride() {\n return this.stride;\n }\n /**\n * @param {import(\"./Geometry.js\").GeometryLayout} layout Layout.\n * @param {Array} flatCoordinates Flat coordinates.\n */\n setFlatCoordinates(e, t) {\n this.stride = Am(e), this.layout = e, this.flatCoordinates = t;\n }\n /**\n * @abstract\n * @param {!Array<*>} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n */\n setCoordinates(e, t) {\n di();\n }\n /**\n * @param {import(\"./Geometry.js\").GeometryLayout|undefined} layout Layout.\n * @param {Array<*>} coordinates Coordinates.\n * @param {number} nesting Nesting.\n * @protected\n */\n setLayout(e, t, i) {\n let r;\n if (e)\n r = Am(e);\n else {\n for (let s = 0; s < i; ++s) {\n if (t.length === 0) {\n this.layout = \"XY\", this.stride = 2;\n return;\n }\n t = /** @type {Array} */\n t[0];\n }\n r = t.length, e = eU(r);\n }\n this.layout = e, this.stride = r;\n }\n /**\n * Apply a transform function to the coordinates of the geometry.\n * The geometry is modified in place.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n * @param {import(\"../proj.js\").TransformFunction} transformFn Transform function.\n * Called with a flat array of geometry coordinates.\n * @api\n */\n applyTransform(e) {\n this.flatCoordinates && (e(this.flatCoordinates, this.flatCoordinates, this.stride), this.changed());\n }\n /**\n * Rotate the geometry around a given coordinate. This modifies the geometry\n * coordinates in place.\n * @param {number} angle Rotation angle in counter-clockwise radians.\n * @param {import(\"../coordinate.js\").Coordinate} anchor The rotation center.\n * @api\n */\n rotate(e, t) {\n const i = this.getFlatCoordinates();\n if (i) {\n const r = this.getStride();\n jw(\n i,\n 0,\n i.length,\n r,\n e,\n t,\n i\n ), this.changed();\n }\n }\n /**\n * Scale the geometry (with an optional origin). This modifies the geometry\n * coordinates in place.\n * @param {number} sx The scaling factor in the x-direction.\n * @param {number} [sy] The scaling factor in the y-direction (defaults to sx).\n * @param {import(\"../coordinate.js\").Coordinate} [anchor] The scale origin (defaults to the center\n * of the geometry extent).\n * @api\n */\n scale(e, t, i) {\n t === void 0 && (t = e), i || (i = Mo(this.getExtent()));\n const r = this.getFlatCoordinates();\n if (r) {\n const s = this.getStride();\n Qw(\n r,\n 0,\n r.length,\n s,\n e,\n t,\n i,\n r\n ), this.changed();\n }\n }\n /**\n * Translate the geometry. This modifies the geometry coordinates in place. If\n * instead you want a new geometry, first `clone()` this geometry.\n * @param {number} deltaX Delta X.\n * @param {number} deltaY Delta Y.\n * @api\n */\n translate(e, t) {\n const i = this.getFlatCoordinates();\n if (i) {\n const r = this.getStride();\n Jw(\n i,\n 0,\n i.length,\n r,\n e,\n t,\n i\n ), this.changed();\n }\n }\n}\nfunction eU(n) {\n let e;\n return n == 2 ? e = \"XY\" : n == 3 ? e = \"XYZ\" : n == 4 && (e = \"XYZM\"), /** @type {import(\"./Geometry.js\").GeometryLayout} */\n e;\n}\nfunction Am(n) {\n let e;\n return n == \"XY\" ? e = 2 : n == \"XYZ\" || n == \"XYM\" ? e = 3 : n == \"XYZM\" && (e = 4), /** @type {number} */\n e;\n}\nfunction Mm(n, e, t, i, r, s, a) {\n const o = n[e], l = n[e + 1], c = n[t] - o, h = n[t + 1] - l;\n let u;\n if (c === 0 && h === 0)\n u = e;\n else {\n const f = ((r - o) * c + (s - l) * h) / (c * c + h * h);\n if (f > 1)\n u = t;\n else if (f > 0) {\n for (let d = 0; d < i; ++d)\n a[d] = cw(\n n[e + d],\n n[t + d],\n f\n );\n a.length = i;\n return;\n } else\n u = e;\n }\n for (let f = 0; f < i; ++f)\n a[f] = n[u + f];\n a.length = i;\n}\nfunction VE(n, e, t, i, r) {\n let s = n[e], a = n[e + 1];\n for (e += i; e < t; e += i) {\n const o = n[e], l = n[e + 1], c = Ca(s, a, o, l);\n c > r && (r = c), s = o, a = l;\n }\n return r;\n}\nfunction tU(n, e, t, i, r) {\n for (let s = 0, a = t.length; s < a; ++s) {\n const o = t[s];\n r = VE(n, e, o, i, r), e = o;\n }\n return r;\n}\nfunction BE(n, e, t, i, r, s, a, o, l, c, h) {\n if (e == t)\n return c;\n let u, f;\n if (r === 0) {\n if (f = Ca(\n a,\n o,\n n[e],\n n[e + 1]\n ), f < c) {\n for (u = 0; u < i; ++u)\n l[u] = n[e + u];\n return l.length = i, f;\n }\n return c;\n }\n h = h || [NaN, NaN];\n let d = e + i;\n for (; d < t; )\n if (Mm(\n n,\n d - i,\n d,\n i,\n a,\n o,\n h\n ), f = Ca(a, o, h[0], h[1]), f < c) {\n for (c = f, u = 0; u < i; ++u)\n l[u] = h[u];\n l.length = i, d += i;\n } else\n d += i * Math.max(\n (Math.sqrt(f) - Math.sqrt(c)) / r | 0,\n 1\n );\n if (s && (Mm(\n n,\n t - i,\n e,\n i,\n a,\n o,\n h\n ), f = Ca(a, o, h[0], h[1]), f < c)) {\n for (c = f, u = 0; u < i; ++u)\n l[u] = h[u];\n l.length = i;\n }\n return c;\n}\nfunction iU(n, e, t, i, r, s, a, o, l, c, h) {\n h = h || [NaN, NaN];\n for (let u = 0, f = t.length; u < f; ++u) {\n const d = t[u];\n c = BE(\n n,\n e,\n d,\n i,\n r,\n s,\n a,\n o,\n l,\n c,\n h\n ), e = d;\n }\n return c;\n}\nfunction rU(n, e, t, i) {\n for (let r = 0, s = t.length; r < s; ++r)\n n[e++] = t[r];\n return e;\n}\nfunction kE(n, e, t, i) {\n for (let r = 0, s = t.length; r < s; ++r) {\n const a = t[r];\n for (let o = 0; o < i; ++o)\n n[e++] = a[o];\n }\n return e;\n}\nfunction sU(n, e, t, i, r) {\n r = r || [];\n let s = 0;\n for (let a = 0, o = t.length; a < o; ++a) {\n const l = kE(\n n,\n e,\n t[a],\n i\n );\n r[s++] = l, e = l;\n }\n return r.length = s, r;\n}\nfunction nU(n, e, t, i, r, s, a) {\n const o = (t - e) / i;\n if (o < 3) {\n for (; e < t; e += i)\n s[a++] = n[e], s[a++] = n[e + 1];\n return a;\n }\n const l = new Array(o);\n l[0] = 1, l[o - 1] = 1;\n const c = [e, t - i];\n let h = 0;\n for (; c.length > 0; ) {\n const u = c.pop(), f = c.pop();\n let d = 0;\n const p = n[f], g = n[f + 1], m = n[u], v = n[u + 1];\n for (let E = f + i; E < u; E += i) {\n const C = n[E], T = n[E + 1], R = ow(C, T, p, g, m, v);\n R > d && (h = E, d = R);\n }\n d > r && (l[(h - e) / i] = 1, f + i < h && c.push(f, h), h + i < u && c.push(h, u));\n }\n for (let u = 0; u < o; ++u)\n l[u] && (s[a++] = n[e + u * i], s[a++] = n[e + u * i + 1]);\n return a;\n}\nfunction ta(n, e) {\n return e * Math.round(n / e);\n}\nfunction aU(n, e, t, i, r, s, a) {\n if (e == t)\n return a;\n let o = ta(n[e], r), l = ta(n[e + 1], r);\n e += i, s[a++] = o, s[a++] = l;\n let c, h;\n do\n if (c = ta(n[e], r), h = ta(n[e + 1], r), e += i, e == t)\n return s[a++] = c, s[a++] = h, a;\n while (c == o && h == l);\n for (; e < t; ) {\n const u = ta(n[e], r), f = ta(n[e + 1], r);\n if (e += i, u == c && f == h)\n continue;\n const d = c - o, p = h - l, g = u - o, m = f - l;\n if (d * m == p * g && (d < 0 && g < d || d == g || d > 0 && g > d) && (p < 0 && m < p || p == m || p > 0 && m > p)) {\n c = u, h = f;\n continue;\n }\n s[a++] = c, s[a++] = h, o = c, l = h, c = u, h = f;\n }\n return s[a++] = c, s[a++] = h, a;\n}\nfunction oU(n, e, t, i, r, s, a, o) {\n for (let l = 0, c = t.length; l < c; ++l) {\n const h = t[l];\n a = aU(\n n,\n e,\n h,\n i,\n r,\n s,\n a\n ), o.push(a), e = h;\n }\n return a;\n}\nfunction zE(n, e, t, i, r) {\n r = r !== void 0 ? r : [];\n let s = 0;\n for (let a = e; a < t; a += i)\n r[s++] = n.slice(a, a + i);\n return r.length = s, r;\n}\nfunction lU(n, e, t, i, r) {\n r = r !== void 0 ? r : [];\n let s = 0;\n for (let a = 0, o = t.length; a < o; ++a) {\n const l = t[a];\n r[s++] = zE(\n n,\n e,\n l,\n i,\n r[s]\n ), e = l;\n }\n return r.length = s, r;\n}\nfunction WE(n, e, t, i) {\n let r = 0, s = n[t - i], a = n[t - i + 1];\n for (; e < t; e += i) {\n const o = n[e], l = n[e + 1];\n r += a * o - s * l, s = o, a = l;\n }\n return r / 2;\n}\nfunction cU(n, e, t, i) {\n let r = 0;\n for (let s = 0, a = t.length; s < a; ++s) {\n const o = t[s];\n r += WE(n, e, o, i), e = o;\n }\n return r;\n}\nclass Do extends id {\n /**\n * @param {Array|Array} coordinates Coordinates.\n * For internal use, flat coordinates in combination with `layout` are also accepted.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n */\n constructor(e, t) {\n super(), this.maxDelta_ = -1, this.maxDeltaRevision_ = -1, t !== void 0 && !Array.isArray(e[0]) ? this.setFlatCoordinates(\n t,\n /** @type {Array} */\n e\n ) : this.setCoordinates(\n /** @type {Array} */\n e,\n t\n );\n }\n /**\n * Make a complete copy of the geometry.\n * @return {!LinearRing} Clone.\n * @api\n */\n clone() {\n return new Do(this.flatCoordinates.slice(), this.layout);\n }\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(e, t, i, r) {\n return r < IE(this.getExtent(), e, t) ? r : (this.maxDeltaRevision_ != this.getRevision() && (this.maxDelta_ = Math.sqrt(\n VE(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n 0\n )\n ), this.maxDeltaRevision_ = this.getRevision()), BE(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n this.maxDelta_,\n !0,\n e,\n t,\n i,\n r\n ));\n }\n /**\n * Return the area of the linear ring on projected plane.\n * @return {number} Area (on projected plane).\n * @api\n */\n getArea() {\n return WE(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride\n );\n }\n /**\n * Return the coordinates of the linear ring.\n * @return {Array} Coordinates.\n * @api\n */\n getCoordinates() {\n return zE(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride\n );\n }\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {LinearRing} Simplified LinearRing.\n * @protected\n */\n getSimplifiedGeometryInternal(e) {\n const t = [];\n return t.length = nU(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n e,\n t,\n 0\n ), new Do(t, \"XY\");\n }\n /**\n * Get the type of this geometry.\n * @return {import(\"./Geometry.js\").Type} Geometry type.\n * @api\n */\n getType() {\n return \"LinearRing\";\n }\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n */\n intersectsExtent(e) {\n return !1;\n }\n /**\n * Set the coordinates of the linear ring.\n * @param {!Array} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @api\n */\n setCoordinates(e, t) {\n this.setLayout(t, e, 1), this.flatCoordinates || (this.flatCoordinates = []), this.flatCoordinates.length = kE(\n this.flatCoordinates,\n 0,\n e,\n this.stride\n ), this.changed();\n }\n}\nclass rd extends id {\n /**\n * @param {import(\"../coordinate.js\").Coordinate} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n */\n constructor(e, t) {\n super(), this.setCoordinates(e, t);\n }\n /**\n * Make a complete copy of the geometry.\n * @return {!Point} Clone.\n * @api\n */\n clone() {\n const e = new rd(this.flatCoordinates.slice(), this.layout);\n return e.applyProperties(this), e;\n }\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(e, t, i, r) {\n const s = this.flatCoordinates, a = Ca(\n e,\n t,\n s[0],\n s[1]\n );\n if (a < r) {\n const o = this.stride;\n for (let l = 0; l < o; ++l)\n i[l] = s[l];\n return i.length = o, a;\n }\n return r;\n }\n /**\n * Return the coordinate of the point.\n * @return {import(\"../coordinate.js\").Coordinate} Coordinates.\n * @api\n */\n getCoordinates() {\n return this.flatCoordinates ? this.flatCoordinates.slice() : [];\n }\n /**\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @protected\n * @return {import(\"../extent.js\").Extent} extent Extent.\n */\n computeExtent(e) {\n return $2(this.flatCoordinates, e);\n }\n /**\n * Get the type of this geometry.\n * @return {import(\"./Geometry.js\").Type} Geometry type.\n * @api\n */\n getType() {\n return \"Point\";\n }\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n */\n intersectsExtent(e) {\n return bE(e, this.flatCoordinates[0], this.flatCoordinates[1]);\n }\n /**\n * @param {!Array<*>} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @api\n */\n setCoordinates(e, t) {\n this.setLayout(t, e, 0), this.flatCoordinates || (this.flatCoordinates = []), this.flatCoordinates.length = rU(\n this.flatCoordinates,\n 0,\n e,\n this.stride\n ), this.changed();\n }\n}\nfunction hU(n, e, t, i, r) {\n return !ME(\n r,\n /**\n * @param {import(\"../../coordinate.js\").Coordinate} coordinate Coordinate.\n * @return {boolean} Contains (x, y).\n */\n function(a) {\n return !bn(\n n,\n e,\n t,\n i,\n a[0],\n a[1]\n );\n }\n );\n}\nfunction bn(n, e, t, i, r, s) {\n let a = 0, o = n[t - i], l = n[t - i + 1];\n for (; e < t; e += i) {\n const c = n[e], h = n[e + 1];\n l <= s ? h > s && (c - o) * (s - l) - (r - o) * (h - l) > 0 && a++ : h <= s && (c - o) * (s - l) - (r - o) * (h - l) < 0 && a--, o = c, l = h;\n }\n return a !== 0;\n}\nfunction GE(n, e, t, i, r, s) {\n if (t.length === 0 || !bn(n, e, t[0], i, r, s))\n return !1;\n for (let a = 1, o = t.length; a < o; ++a)\n if (bn(n, t[a - 1], t[a], i, r, s))\n return !1;\n return !0;\n}\nfunction uU(n, e, t, i, r, s, a) {\n let o, l, c, h, u, f, d;\n const p = r[s + 1], g = [];\n for (let E = 0, C = t.length; E < C; ++E) {\n const T = t[E];\n for (h = n[T - i], f = n[T - i + 1], o = e; o < T; o += i)\n u = n[o], d = n[o + 1], (p <= f && d <= p || f <= p && p <= d) && (c = (p - f) / (d - f) * (u - h) + h, g.push(c)), h = u, f = d;\n }\n let m = NaN, v = -1 / 0;\n for (g.sort(Gf), h = g[0], o = 1, l = g.length; o < l; ++o) {\n u = g[o];\n const E = Math.abs(u - h);\n E > v && (c = (h + u) / 2, GE(n, e, t, i, c, p) && (m = c, v = E)), h = u;\n }\n return isNaN(m) && (m = r[s]), a ? (a.push(m, p, v), a) : [m, p, v];\n}\nfunction fU(n, e, t, i, r) {\n let s;\n for (e += i; e < t; e += i)\n if (s = r(\n n.slice(e - i, e),\n n.slice(e, e + i)\n ), s)\n return s;\n return !1;\n}\nfunction XE(n, e, t, i, r) {\n const s = AE(\n Vn(),\n n,\n e,\n t,\n i\n );\n return Jo(r, s) ? J2(r, s) || s[0] >= r[0] && s[2] <= r[2] || s[1] >= r[1] && s[3] <= r[3] ? !0 : fU(\n n,\n e,\n t,\n i,\n /**\n * @param {import(\"../../coordinate.js\").Coordinate} point1 Start point.\n * @param {import(\"../../coordinate.js\").Coordinate} point2 End point.\n * @return {boolean} `true` if the segment and the extent intersect,\n * `false` otherwise.\n */\n function(a, o) {\n return nw(r, a, o);\n }\n ) : !1;\n}\nfunction HE(n, e, t, i, r) {\n return !!(XE(n, e, t, i, r) || bn(\n n,\n e,\n t,\n i,\n r[0],\n r[1]\n ) || bn(\n n,\n e,\n t,\n i,\n r[0],\n r[3]\n ) || bn(\n n,\n e,\n t,\n i,\n r[2],\n r[1]\n ) || bn(\n n,\n e,\n t,\n i,\n r[2],\n r[3]\n ));\n}\nfunction dU(n, e, t, i, r) {\n if (!HE(n, e, t[0], i, r))\n return !1;\n if (t.length === 1)\n return !0;\n for (let s = 1, a = t.length; s < a; ++s)\n if (hU(\n n,\n t[s - 1],\n t[s],\n i,\n r\n ) && !XE(\n n,\n t[s - 1],\n t[s],\n i,\n r\n ))\n return !1;\n return !0;\n}\nfunction pU(n, e, t, i) {\n for (; e < t - i; ) {\n for (let r = 0; r < i; ++r) {\n const s = n[e + r];\n n[e + r] = n[t - i + r], n[t - i + r] = s;\n }\n e += i, t -= i;\n }\n}\nfunction KE(n, e, t, i) {\n let r = 0, s = n[t - i], a = n[t - i + 1];\n for (; e < t; e += i) {\n const o = n[e], l = n[e + 1];\n r += (o - s) * (l + a), s = o, a = l;\n }\n return r === 0 ? void 0 : r > 0;\n}\nfunction gU(n, e, t, i, r) {\n r = r !== void 0 ? r : !1;\n for (let s = 0, a = t.length; s < a; ++s) {\n const o = t[s], l = KE(\n n,\n e,\n o,\n i\n );\n if (s === 0) {\n if (r && l || !r && !l)\n return !1;\n } else if (r && !l || !r && l)\n return !1;\n e = o;\n }\n return !0;\n}\nfunction Pm(n, e, t, i, r) {\n r = r !== void 0 ? r : !1;\n for (let s = 0, a = t.length; s < a; ++s) {\n const o = t[s], l = KE(\n n,\n e,\n o,\n i\n );\n (s === 0 ? r && l || !r && !l : r && !l || !r && l) && pU(n, e, o, i), e = o;\n }\n return e;\n}\nclass No extends id {\n /**\n * @param {!Array>|!Array} coordinates\n * Array of linear rings that define the polygon. The first linear ring of the\n * array defines the outer-boundary or surface of the polygon. Each subsequent\n * linear ring defines a hole in the surface of the polygon. A linear ring is\n * an array of vertices' coordinates where the first coordinate and the last are\n * equivalent. (For internal use, flat coordinates in combination with\n * `layout` and `ends` are also accepted.)\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @param {Array} [ends] Ends (for internal use with flat coordinates).\n */\n constructor(e, t, i) {\n super(), this.ends_ = [], this.flatInteriorPointRevision_ = -1, this.flatInteriorPoint_ = null, this.maxDelta_ = -1, this.maxDeltaRevision_ = -1, this.orientedRevision_ = -1, this.orientedFlatCoordinates_ = null, t !== void 0 && i ? (this.setFlatCoordinates(\n t,\n /** @type {Array} */\n e\n ), this.ends_ = i) : this.setCoordinates(\n /** @type {Array>} */\n e,\n t\n );\n }\n /**\n * Append the passed linear ring to this polygon.\n * @param {LinearRing} linearRing Linear ring.\n * @api\n */\n appendLinearRing(e) {\n this.flatCoordinates ? U2(this.flatCoordinates, e.getFlatCoordinates()) : this.flatCoordinates = e.getFlatCoordinates().slice(), this.ends_.push(this.flatCoordinates.length), this.changed();\n }\n /**\n * Make a complete copy of the geometry.\n * @return {!Polygon} Clone.\n * @api\n */\n clone() {\n const e = new No(\n this.flatCoordinates.slice(),\n this.layout,\n this.ends_.slice()\n );\n return e.applyProperties(this), e;\n }\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(e, t, i, r) {\n return r < IE(this.getExtent(), e, t) ? r : (this.maxDeltaRevision_ != this.getRevision() && (this.maxDelta_ = Math.sqrt(\n tU(\n this.flatCoordinates,\n 0,\n this.ends_,\n this.stride,\n 0\n )\n ), this.maxDeltaRevision_ = this.getRevision()), iU(\n this.flatCoordinates,\n 0,\n this.ends_,\n this.stride,\n this.maxDelta_,\n !0,\n e,\n t,\n i,\n r\n ));\n }\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\n containsXY(e, t) {\n return GE(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride,\n e,\n t\n );\n }\n /**\n * Return the area of the polygon on projected plane.\n * @return {number} Area (on projected plane).\n * @api\n */\n getArea() {\n return cU(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride\n );\n }\n /**\n * Get the coordinate array for this geometry. This array has the structure\n * of a GeoJSON coordinate array for polygons.\n *\n * @param {boolean} [right] Orient coordinates according to the right-hand\n * rule (counter-clockwise for exterior and clockwise for interior rings).\n * If `false`, coordinates will be oriented according to the left-hand rule\n * (clockwise for exterior and counter-clockwise for interior rings).\n * By default, coordinate orientation will depend on how the geometry was\n * constructed.\n * @return {Array>} Coordinates.\n * @api\n */\n getCoordinates(e) {\n let t;\n return e !== void 0 ? (t = this.getOrientedFlatCoordinates().slice(), Pm(t, 0, this.ends_, this.stride, e)) : t = this.flatCoordinates, lU(t, 0, this.ends_, this.stride);\n }\n /**\n * @return {Array} Ends.\n */\n getEnds() {\n return this.ends_;\n }\n /**\n * @return {Array} Interior point.\n */\n getFlatInteriorPoint() {\n if (this.flatInteriorPointRevision_ != this.getRevision()) {\n const e = Mo(this.getExtent());\n this.flatInteriorPoint_ = uU(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride,\n e,\n 0\n ), this.flatInteriorPointRevision_ = this.getRevision();\n }\n return this.flatInteriorPoint_;\n }\n /**\n * Return an interior point of the polygon.\n * @return {Point} Interior point as XYM coordinate, where M is the\n * length of the horizontal intersection that the point belongs to.\n * @api\n */\n getInteriorPoint() {\n return new rd(this.getFlatInteriorPoint(), \"XYM\");\n }\n /**\n * Return the number of rings of the polygon, this includes the exterior\n * ring and any interior rings.\n *\n * @return {number} Number of rings.\n * @api\n */\n getLinearRingCount() {\n return this.ends_.length;\n }\n /**\n * Return the Nth linear ring of the polygon geometry. Return `null` if the\n * given index is out of range.\n * The exterior linear ring is available at index `0` and the interior rings\n * at index `1` and beyond.\n *\n * @param {number} index Index.\n * @return {LinearRing|null} Linear ring.\n * @api\n */\n getLinearRing(e) {\n return e < 0 || this.ends_.length <= e ? null : new Do(\n this.flatCoordinates.slice(\n e === 0 ? 0 : this.ends_[e - 1],\n this.ends_[e]\n ),\n this.layout\n );\n }\n /**\n * Return the linear rings of the polygon.\n * @return {Array} Linear rings.\n * @api\n */\n getLinearRings() {\n const e = this.layout, t = this.flatCoordinates, i = this.ends_, r = [];\n let s = 0;\n for (let a = 0, o = i.length; a < o; ++a) {\n const l = i[a], c = new Do(\n t.slice(s, l),\n e\n );\n r.push(c), s = l;\n }\n return r;\n }\n /**\n * @return {Array} Oriented flat coordinates.\n */\n getOrientedFlatCoordinates() {\n if (this.orientedRevision_ != this.getRevision()) {\n const e = this.flatCoordinates;\n gU(e, 0, this.ends_, this.stride) ? this.orientedFlatCoordinates_ = e : (this.orientedFlatCoordinates_ = e.slice(), this.orientedFlatCoordinates_.length = Pm(\n this.orientedFlatCoordinates_,\n 0,\n this.ends_,\n this.stride\n )), this.orientedRevision_ = this.getRevision();\n }\n return this.orientedFlatCoordinates_;\n }\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {Polygon} Simplified Polygon.\n * @protected\n */\n getSimplifiedGeometryInternal(e) {\n const t = [], i = [];\n return t.length = oU(\n this.flatCoordinates,\n 0,\n this.ends_,\n this.stride,\n Math.sqrt(e),\n t,\n 0,\n i\n ), new No(t, \"XY\", i);\n }\n /**\n * Get the type of this geometry.\n * @return {import(\"./Geometry.js\").Type} Geometry type.\n * @api\n */\n getType() {\n return \"Polygon\";\n }\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n */\n intersectsExtent(e) {\n return dU(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride,\n e\n );\n }\n /**\n * Set the coordinates of the polygon.\n * @param {!Array>} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @api\n */\n setCoordinates(e, t) {\n this.setLayout(t, e, 2), this.flatCoordinates || (this.flatCoordinates = []);\n const i = sU(\n this.flatCoordinates,\n 0,\n e,\n this.stride,\n this.ends_\n );\n this.flatCoordinates.length = i.length === 0 ? 0 : i[i.length - 1], this.changed();\n }\n}\nfunction Om(n) {\n if ($o(n))\n throw new Error(\"Cannot create polygon from empty extent\");\n const e = n[0], t = n[1], i = n[2], r = n[3], s = [\n e,\n t,\n e,\n r,\n i,\n r,\n i,\n t,\n e,\n t\n ];\n return new No(s, \"XY\", [s.length]);\n}\nconst Jh = 0;\nclass mU extends Ws {\n /**\n * @param {ViewOptions} [options] View options.\n */\n constructor(e) {\n super(), this.on, this.once, this.un, e = Object.assign({}, e), this.hints_ = [0, 0], this.animations_ = [], this.updateAnimationKey_, this.projection_ = jf(e.projection, \"EPSG:3857\"), this.viewportSize_ = [100, 100], this.targetCenter_ = null, this.targetResolution_, this.targetRotation_, this.nextCenter_ = null, this.nextResolution_, this.nextRotation_, this.cancelAnchor_ = void 0, e.projection && Nw(), e.center && (e.center = Ps(e.center, this.projection_)), e.extent && (e.extent = ha(e.extent, this.projection_)), this.applyOptions_(e);\n }\n /**\n * Set up the view with the given options.\n * @param {ViewOptions} options View options.\n */\n applyOptions_(e) {\n const t = Object.assign({}, e);\n for (const o in Xr)\n delete t[o];\n this.setProperties(t, !0);\n const i = EU(e);\n this.maxResolution_ = i.maxResolution, this.minResolution_ = i.minResolution, this.zoomFactor_ = i.zoomFactor, this.resolutions_ = e.resolutions, this.padding_ = e.padding, this.minZoom_ = i.minZoom;\n const r = _U(e), s = i.constraint, a = vU(e);\n this.constraints_ = {\n center: r,\n resolution: s,\n rotation: a\n }, this.setRotation(e.rotation !== void 0 ? e.rotation : 0), this.setCenterInternal(\n e.center !== void 0 ? e.center : null\n ), e.resolution !== void 0 ? this.setResolution(e.resolution) : e.zoom !== void 0 && this.setZoom(e.zoom);\n }\n /**\n * Padding (in css pixels).\n * If the map viewport is partially covered with other content (overlays) along\n * its edges, this setting allows to shift the center of the viewport away from that\n * content. The order of the values in the array is top, right, bottom, left.\n * The default is no padding, which is equivalent to `[0, 0, 0, 0]`.\n * @type {Array|undefined}\n * @api\n */\n get padding() {\n return this.padding_;\n }\n set padding(e) {\n let t = this.padding_;\n this.padding_ = e;\n const i = this.getCenterInternal();\n if (i) {\n const r = e || [0, 0, 0, 0];\n t = t || [0, 0, 0, 0];\n const s = this.getResolution(), a = s / 2 * (r[3] - t[3] + t[1] - r[1]), o = s / 2 * (r[0] - t[0] + t[2] - r[2]);\n this.setCenterInternal([i[0] + a, i[1] - o]);\n }\n }\n /**\n * Get an updated version of the view options used to construct the view. The\n * current resolution (or zoom), center, and rotation are applied to any stored\n * options. The provided options can be used to apply new min/max zoom or\n * resolution limits.\n * @param {ViewOptions} newOptions New options to be applied.\n * @return {ViewOptions} New options updated with the current view state.\n */\n getUpdatedOptions_(e) {\n const t = this.getProperties();\n return t.resolution !== void 0 ? t.resolution = this.getResolution() : t.zoom = this.getZoom(), t.center = this.getCenterInternal(), t.rotation = this.getRotation(), Object.assign({}, t, e);\n }\n /**\n * Animate the view. The view's center, zoom (or resolution), and rotation\n * can be animated for smooth transitions between view states. For example,\n * to animate the view to a new zoom level:\n *\n * view.animate({zoom: view.getZoom() + 1});\n *\n * By default, the animation lasts one second and uses in-and-out easing. You\n * can customize this behavior by including `duration` (in milliseconds) and\n * `easing` options (see {@link module:ol/easing}).\n *\n * To chain together multiple animations, call the method with multiple\n * animation objects. For example, to first zoom and then pan:\n *\n * view.animate({zoom: 10}, {center: [0, 0]});\n *\n * If you provide a function as the last argument to the animate method, it\n * will get called at the end of an animation series. The callback will be\n * called with `true` if the animation series completed on its own or `false`\n * if it was cancelled.\n *\n * Animations are cancelled by user interactions (e.g. dragging the map) or by\n * calling `view.setCenter()`, `view.setResolution()`, or `view.setRotation()`\n * (or another method that calls one of these).\n *\n * @param {...(AnimationOptions|function(boolean): void)} var_args Animation\n * options. Multiple animations can be run in series by passing multiple\n * options objects. To run multiple animations in parallel, call the method\n * multiple times. An optional callback can be provided as a final\n * argument. The callback will be called with a boolean indicating whether\n * the animation completed without being cancelled.\n * @api\n */\n animate(e) {\n this.isDef() && !this.getAnimating() && this.resolveConstraints(0);\n const t = new Array(arguments.length);\n for (let i = 0; i < t.length; ++i) {\n let r = arguments[i];\n r.center && (r = Object.assign({}, r), r.center = Ps(\n r.center,\n this.getProjection()\n )), r.anchor && (r = Object.assign({}, r), r.anchor = Ps(\n r.anchor,\n this.getProjection()\n )), t[i] = r;\n }\n this.animateInternal.apply(this, t);\n }\n /**\n * @param {...(AnimationOptions|function(boolean): void)} var_args Animation options.\n */\n animateInternal(e) {\n let t = arguments.length, i;\n t > 1 && typeof arguments[t - 1] == \"function\" && (i = arguments[t - 1], --t);\n let r = 0;\n for (; r < t && !this.isDef(); ++r) {\n const h = arguments[r];\n h.center && this.setCenterInternal(h.center), h.zoom !== void 0 ? this.setZoom(h.zoom) : h.resolution && this.setResolution(h.resolution), h.rotation !== void 0 && this.setRotation(h.rotation);\n }\n if (r === t) {\n i && Rl(i, !0);\n return;\n }\n let s = Date.now(), a = this.targetCenter_.slice(), o = this.targetResolution_, l = this.targetRotation_;\n const c = [];\n for (; r < t; ++r) {\n const h = (\n /** @type {AnimationOptions} */\n arguments[r]\n ), u = {\n start: s,\n complete: !1,\n anchor: h.anchor,\n duration: h.duration !== void 0 ? h.duration : 1e3,\n easing: h.easing || qw,\n callback: i\n };\n if (h.center && (u.sourceCenter = a, u.targetCenter = h.center.slice(), a = u.targetCenter), h.zoom !== void 0 ? (u.sourceResolution = o, u.targetResolution = this.getResolutionForZoom(h.zoom), o = u.targetResolution) : h.resolution && (u.sourceResolution = o, u.targetResolution = h.resolution, o = u.targetResolution), h.rotation !== void 0) {\n u.sourceRotation = l;\n const f = Ra(h.rotation - l + Math.PI, 2 * Math.PI) - Math.PI;\n u.targetRotation = l + f, l = u.targetRotation;\n }\n TU(u) ? u.complete = !0 : s += u.duration, c.push(u);\n }\n this.animations_.push(c), this.setHint(Mr.ANIMATING, 1), this.updateAnimations_();\n }\n /**\n * Determine if the view is being animated.\n * @return {boolean} The view is being animated.\n * @api\n */\n getAnimating() {\n return this.hints_[Mr.ANIMATING] > 0;\n }\n /**\n * Determine if the user is interacting with the view, such as panning or zooming.\n * @return {boolean} The view is being interacted with.\n * @api\n */\n getInteracting() {\n return this.hints_[Mr.INTERACTING] > 0;\n }\n /**\n * Cancel any ongoing animations.\n * @api\n */\n cancelAnimations() {\n this.setHint(Mr.ANIMATING, -this.hints_[Mr.ANIMATING]);\n let e;\n for (let t = 0, i = this.animations_.length; t < i; ++t) {\n const r = this.animations_[t];\n if (r[0].callback && Rl(r[0].callback, !1), !e)\n for (let s = 0, a = r.length; s < a; ++s) {\n const o = r[s];\n if (!o.complete) {\n e = o.anchor;\n break;\n }\n }\n }\n this.animations_.length = 0, this.cancelAnchor_ = e, this.nextCenter_ = null, this.nextResolution_ = NaN, this.nextRotation_ = NaN;\n }\n /**\n * Update all animations.\n */\n updateAnimations_() {\n if (this.updateAnimationKey_ !== void 0 && (cancelAnimationFrame(this.updateAnimationKey_), this.updateAnimationKey_ = void 0), !this.getAnimating())\n return;\n const e = Date.now();\n let t = !1;\n for (let i = this.animations_.length - 1; i >= 0; --i) {\n const r = this.animations_[i];\n let s = !0;\n for (let a = 0, o = r.length; a < o; ++a) {\n const l = r[a];\n if (l.complete)\n continue;\n const c = e - l.start;\n let h = l.duration > 0 ? c / l.duration : 1;\n h >= 1 ? (l.complete = !0, h = 1) : s = !1;\n const u = l.easing(h);\n if (l.sourceCenter) {\n const f = l.sourceCenter[0], d = l.sourceCenter[1], p = l.targetCenter[0], g = l.targetCenter[1];\n this.nextCenter_ = l.targetCenter;\n const m = f + u * (p - f), v = d + u * (g - d);\n this.targetCenter_ = [m, v];\n }\n if (l.sourceResolution && l.targetResolution) {\n const f = u === 1 ? l.targetResolution : l.sourceResolution + u * (l.targetResolution - l.sourceResolution);\n if (l.anchor) {\n const d = this.getViewportSize_(this.getRotation()), p = this.constraints_.resolution(\n f,\n 0,\n d,\n !0\n );\n this.targetCenter_ = this.calculateCenterZoom(\n p,\n l.anchor\n );\n }\n this.nextResolution_ = l.targetResolution, this.targetResolution_ = f, this.applyTargetState_(!0);\n }\n if (l.sourceRotation !== void 0 && l.targetRotation !== void 0) {\n const f = u === 1 ? Ra(l.targetRotation + Math.PI, 2 * Math.PI) - Math.PI : l.sourceRotation + u * (l.targetRotation - l.sourceRotation);\n if (l.anchor) {\n const d = this.constraints_.rotation(\n f,\n !0\n );\n this.targetCenter_ = this.calculateCenterRotate(\n d,\n l.anchor\n );\n }\n this.nextRotation_ = l.targetRotation, this.targetRotation_ = f;\n }\n if (this.applyTargetState_(!0), t = !0, !l.complete)\n break;\n }\n if (s) {\n this.animations_[i] = null, this.setHint(Mr.ANIMATING, -1), this.nextCenter_ = null, this.nextResolution_ = NaN, this.nextRotation_ = NaN;\n const a = r[0].callback;\n a && Rl(a, !0);\n }\n }\n this.animations_ = this.animations_.filter(Boolean), t && this.updateAnimationKey_ === void 0 && (this.updateAnimationKey_ = requestAnimationFrame(\n this.updateAnimations_.bind(this)\n ));\n }\n /**\n * @param {number} rotation Target rotation.\n * @param {import(\"./coordinate.js\").Coordinate} anchor Rotation anchor.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center for rotation and anchor.\n */\n calculateCenterRotate(e, t) {\n let i;\n const r = this.getCenterInternal();\n return r !== void 0 && (i = [r[0] - t[0], r[1] - t[1]], Yf(i, e - this.getRotation()), Aw(i, t)), i;\n }\n /**\n * @param {number} resolution Target resolution.\n * @param {import(\"./coordinate.js\").Coordinate} anchor Zoom anchor.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center for resolution and anchor.\n */\n calculateCenterZoom(e, t) {\n let i;\n const r = this.getCenterInternal(), s = this.getResolution();\n if (r !== void 0 && s !== void 0) {\n const a = t[0] - e * (t[0] - r[0]) / s, o = t[1] - e * (t[1] - r[1]) / s;\n i = [a, o];\n }\n return i;\n }\n /**\n * Returns the current viewport size.\n * @private\n * @param {number} [rotation] Take into account the rotation of the viewport when giving the size\n * @return {import(\"./size.js\").Size} Viewport size or `[100, 100]` when no viewport is found.\n */\n getViewportSize_(e) {\n const t = this.viewportSize_;\n if (e) {\n const i = t[0], r = t[1];\n return [\n Math.abs(i * Math.cos(e)) + Math.abs(r * Math.sin(e)),\n Math.abs(i * Math.sin(e)) + Math.abs(r * Math.cos(e))\n ];\n }\n return t;\n }\n /**\n * Stores the viewport size on the view. The viewport size is not read every time from the DOM\n * to avoid performance hit and layout reflow.\n * This should be done on map size change.\n * Note: the constraints are not resolved during an animation to avoid stopping it\n * @param {import(\"./size.js\").Size} [size] Viewport size; if undefined, [100, 100] is assumed\n */\n setViewportSize(e) {\n this.viewportSize_ = Array.isArray(e) ? e.slice() : [100, 100], this.getAnimating() || this.resolveConstraints(0);\n }\n /**\n * Get the view center.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} The center of the view.\n * @observable\n * @api\n */\n getCenter() {\n const e = this.getCenterInternal();\n return e && Au(e, this.getProjection());\n }\n /**\n * Get the view center without transforming to user projection.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} The center of the view.\n */\n getCenterInternal() {\n return (\n /** @type {import(\"./coordinate.js\").Coordinate|undefined} */\n this.get(Xr.CENTER)\n );\n }\n /**\n * @return {Constraints} Constraints.\n */\n getConstraints() {\n return this.constraints_;\n }\n /**\n * @return {boolean} Resolution constraint is set\n */\n getConstrainResolution() {\n return this.get(\"constrainResolution\");\n }\n /**\n * @param {Array} [hints] Destination array.\n * @return {Array} Hint.\n */\n getHints(e) {\n return e !== void 0 ? (e[0] = this.hints_[0], e[1] = this.hints_[1], e) : this.hints_.slice();\n }\n /**\n * Calculate the extent for the current view state and the passed size.\n * The size is the pixel dimensions of the box into which the calculated extent\n * should fit. In most cases you want to get the extent of the entire map,\n * that is `map.getSize()`.\n * @param {import(\"./size.js\").Size} [size] Box pixel size. If not provided, the size\n * of the map that uses this view will be used.\n * @return {import(\"./extent.js\").Extent} Extent.\n * @api\n */\n calculateExtent(e) {\n const t = this.calculateExtentInternal(e);\n return kw(t, this.getProjection());\n }\n /**\n * @param {import(\"./size.js\").Size} [size] Box pixel size. If not provided,\n * the map's last known viewport size will be used.\n * @return {import(\"./extent.js\").Extent} Extent.\n */\n calculateExtentInternal(e) {\n e = e || this.getViewportSizeMinusPadding_();\n const t = (\n /** @type {!import(\"./coordinate.js\").Coordinate} */\n this.getCenterInternal()\n );\n Kt(t, 1);\n const i = (\n /** @type {!number} */\n this.getResolution()\n );\n Kt(i !== void 0, 2);\n const r = (\n /** @type {!number} */\n this.getRotation()\n );\n return Kt(r !== void 0, 3), Su(t, i, r, e);\n }\n /**\n * Get the maximum resolution of the view.\n * @return {number} The maximum resolution of the view.\n * @api\n */\n getMaxResolution() {\n return this.maxResolution_;\n }\n /**\n * Get the minimum resolution of the view.\n * @return {number} The minimum resolution of the view.\n * @api\n */\n getMinResolution() {\n return this.minResolution_;\n }\n /**\n * Get the maximum zoom level for the view.\n * @return {number} The maximum zoom level.\n * @api\n */\n getMaxZoom() {\n return (\n /** @type {number} */\n this.getZoomForResolution(this.minResolution_)\n );\n }\n /**\n * Set a new maximum zoom level for the view.\n * @param {number} zoom The maximum zoom level.\n * @api\n */\n setMaxZoom(e) {\n this.applyOptions_(this.getUpdatedOptions_({ maxZoom: e }));\n }\n /**\n * Get the minimum zoom level for the view.\n * @return {number} The minimum zoom level.\n * @api\n */\n getMinZoom() {\n return (\n /** @type {number} */\n this.getZoomForResolution(this.maxResolution_)\n );\n }\n /**\n * Set a new minimum zoom level for the view.\n * @param {number} zoom The minimum zoom level.\n * @api\n */\n setMinZoom(e) {\n this.applyOptions_(this.getUpdatedOptions_({ minZoom: e }));\n }\n /**\n * Set whether the view should allow intermediary zoom levels.\n * @param {boolean} enabled Whether the resolution is constrained.\n * @api\n */\n setConstrainResolution(e) {\n this.applyOptions_(this.getUpdatedOptions_({ constrainResolution: e }));\n }\n /**\n * Get the view projection.\n * @return {import(\"./proj/Projection.js\").default} The projection of the view.\n * @api\n */\n getProjection() {\n return this.projection_;\n }\n /**\n * Get the view resolution.\n * @return {number|undefined} The resolution of the view.\n * @observable\n * @api\n */\n getResolution() {\n return (\n /** @type {number|undefined} */\n this.get(Xr.RESOLUTION)\n );\n }\n /**\n * Get the resolutions for the view. This returns the array of resolutions\n * passed to the constructor of the View, or undefined if none were given.\n * @return {Array|undefined} The resolutions of the view.\n * @api\n */\n getResolutions() {\n return this.resolutions_;\n }\n /**\n * Get the resolution for a provided extent (in map units) and size (in pixels).\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {import(\"./size.js\").Size} [size] Box pixel size.\n * @return {number} The resolution at which the provided extent will render at\n * the given size.\n * @api\n */\n getResolutionForExtent(e, t) {\n return this.getResolutionForExtentInternal(\n ha(e, this.getProjection()),\n t\n );\n }\n /**\n * Get the resolution for a provided extent (in map units) and size (in pixels).\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {import(\"./size.js\").Size} [size] Box pixel size.\n * @return {number} The resolution at which the provided extent will render at\n * the given size.\n */\n getResolutionForExtentInternal(e, t) {\n t = t || this.getViewportSizeMinusPadding_();\n const i = Ui(e) / t[0], r = gs(e) / t[1];\n return Math.max(i, r);\n }\n /**\n * Return a function that returns a value between 0 and 1 for a\n * resolution. Exponential scaling is assumed.\n * @param {number} [power] Power.\n * @return {function(number): number} Resolution for value function.\n */\n getResolutionForValueFunction(e) {\n e = e || 2;\n const t = this.getConstrainedResolution(this.maxResolution_), i = this.minResolution_, r = Math.log(t / i) / Math.log(e);\n return (\n /**\n * @param {number} value Value.\n * @return {number} Resolution.\n */\n function(s) {\n return t / Math.pow(e, s * r);\n }\n );\n }\n /**\n * Get the view rotation.\n * @return {number} The rotation of the view in radians.\n * @observable\n * @api\n */\n getRotation() {\n return (\n /** @type {number} */\n this.get(Xr.ROTATION)\n );\n }\n /**\n * Return a function that returns a resolution for a value between\n * 0 and 1. Exponential scaling is assumed.\n * @param {number} [power] Power.\n * @return {function(number): number} Value for resolution function.\n */\n getValueForResolutionFunction(e) {\n const t = Math.log(e || 2), i = this.getConstrainedResolution(this.maxResolution_), r = this.minResolution_, s = Math.log(i / r) / t;\n return (\n /**\n * @param {number} resolution Resolution.\n * @return {number} Value.\n */\n function(a) {\n return Math.log(i / a) / t / s;\n }\n );\n }\n /**\n * Returns the size of the viewport minus padding.\n * @private\n * @param {number} [rotation] Take into account the rotation of the viewport when giving the size\n * @return {import(\"./size.js\").Size} Viewport size reduced by the padding.\n */\n getViewportSizeMinusPadding_(e) {\n let t = this.getViewportSize_(e);\n const i = this.padding_;\n return i && (t = [\n t[0] - i[1] - i[3],\n t[1] - i[0] - i[2]\n ]), t;\n }\n /**\n * @return {State} View state.\n */\n getState() {\n const e = this.getProjection(), t = this.getResolution(), i = this.getRotation();\n let r = (\n /** @type {import(\"./coordinate.js\").Coordinate} */\n this.getCenterInternal()\n );\n const s = this.padding_;\n if (s) {\n const a = this.getViewportSizeMinusPadding_();\n r = $h(\n r,\n this.getViewportSize_(),\n [a[0] / 2 + s[3], a[1] / 2 + s[0]],\n t,\n i\n );\n }\n return {\n center: r.slice(0),\n projection: e !== void 0 ? e : null,\n resolution: t,\n nextCenter: this.nextCenter_,\n nextResolution: this.nextResolution_,\n nextRotation: this.nextRotation_,\n rotation: i,\n zoom: this.getZoom()\n };\n }\n /**\n * @return {ViewStateLayerStateExtent} Like `FrameState`, but just `viewState` and `extent`.\n */\n getViewStateAndExtent() {\n return {\n viewState: this.getState(),\n extent: this.calculateExtent()\n };\n }\n /**\n * Get the current zoom level. This method may return non-integer zoom levels\n * if the view does not constrain the resolution, or if an interaction or\n * animation is underway.\n * @return {number|undefined} Zoom.\n * @api\n */\n getZoom() {\n let e;\n const t = this.getResolution();\n return t !== void 0 && (e = this.getZoomForResolution(t)), e;\n }\n /**\n * Get the zoom level for a resolution.\n * @param {number} resolution The resolution.\n * @return {number|undefined} The zoom level for the provided resolution.\n * @api\n */\n getZoomForResolution(e) {\n let t = this.minZoom_ || 0, i, r;\n if (this.resolutions_) {\n const s = Xf(this.resolutions_, e, 1);\n t = s, i = this.resolutions_[s], s == this.resolutions_.length - 1 ? r = 2 : r = i / this.resolutions_[s + 1];\n } else\n i = this.maxResolution_, r = this.zoomFactor_;\n return t + Math.log(i / e) / Math.log(r);\n }\n /**\n * Get the resolution for a zoom level.\n * @param {number} zoom Zoom level.\n * @return {number} The view resolution for the provided zoom level.\n * @api\n */\n getResolutionForZoom(e) {\n if (this.resolutions_) {\n if (this.resolutions_.length <= 1)\n return 0;\n const t = Vi(\n Math.floor(e),\n 0,\n this.resolutions_.length - 2\n ), i = this.resolutions_[t] / this.resolutions_[t + 1];\n return this.resolutions_[t] / Math.pow(i, Vi(e - t, 0, 1));\n }\n return this.maxResolution_ / Math.pow(this.zoomFactor_, e - this.minZoom_);\n }\n /**\n * Fit the given geometry or extent based on the given map size and border.\n * The size is pixel dimensions of the box to fit the extent into.\n * In most cases you will want to use the map size, that is `map.getSize()`.\n * Takes care of the map angle.\n * @param {import(\"./geom/SimpleGeometry.js\").default|import(\"./extent.js\").Extent} geometryOrExtent The geometry or\n * extent to fit the view to.\n * @param {FitOptions} [options] Options.\n * @api\n */\n fit(e, t) {\n let i;\n if (Kt(\n Array.isArray(e) || typeof /** @type {?} */\n e.getSimplifiedGeometry == \"function\",\n 24\n ), Array.isArray(e)) {\n Kt(!$o(e), 25);\n const r = ha(e, this.getProjection());\n i = Om(r);\n } else if (e.getType() === \"Circle\") {\n const r = ha(\n e.getExtent(),\n this.getProjection()\n );\n i = Om(r), i.rotate(this.getRotation(), Mo(r));\n } else {\n const r = Vw();\n r ? i = /** @type {import(\"./geom/SimpleGeometry.js\").default} */\n e.clone().transform(r, this.getProjection()) : i = e;\n }\n this.fitInternal(i, t);\n }\n /**\n * Calculate rotated extent\n * @param {import(\"./geom/SimpleGeometry.js\").default} geometry The geometry.\n * @return {import(\"./extent\").Extent} The rotated extent for the geometry.\n */\n rotatedExtentForGeometry(e) {\n const t = this.getRotation(), i = Math.cos(t), r = Math.sin(-t), s = e.getFlatCoordinates(), a = e.getStride();\n let o = 1 / 0, l = 1 / 0, c = -1 / 0, h = -1 / 0;\n for (let u = 0, f = s.length; u < f; u += a) {\n const d = s[u] * i - s[u + 1] * r, p = s[u] * r + s[u + 1] * i;\n o = Math.min(o, d), l = Math.min(l, p), c = Math.max(c, d), h = Math.max(h, p);\n }\n return [o, l, c, h];\n }\n /**\n * @param {import(\"./geom/SimpleGeometry.js\").default} geometry The geometry.\n * @param {FitOptions} [options] Options.\n */\n fitInternal(e, t) {\n t = t || {};\n let i = t.size;\n i || (i = this.getViewportSizeMinusPadding_());\n const r = t.padding !== void 0 ? t.padding : [0, 0, 0, 0], s = t.nearest !== void 0 ? t.nearest : !1;\n let a;\n t.minResolution !== void 0 ? a = t.minResolution : t.maxZoom !== void 0 ? a = this.getResolutionForZoom(t.maxZoom) : a = 0;\n const o = this.rotatedExtentForGeometry(e);\n let l = this.getResolutionForExtentInternal(o, [\n i[0] - r[1] - r[3],\n i[1] - r[0] - r[2]\n ]);\n l = isNaN(l) ? a : Math.max(l, a), l = this.getConstrainedResolution(l, s ? 0 : 1);\n const c = this.getRotation(), h = Math.sin(c), u = Math.cos(c), f = Mo(o);\n f[0] += (r[1] - r[3]) / 2 * l, f[1] += (r[0] - r[2]) / 2 * l;\n const d = f[0] * u - f[1] * h, p = f[1] * u + f[0] * h, g = this.getConstrainedCenter([d, p], l), m = t.callback ? t.callback : fc;\n t.duration !== void 0 ? this.animateInternal(\n {\n resolution: l,\n center: g,\n duration: t.duration,\n easing: t.easing\n },\n m\n ) : (this.targetResolution_ = l, this.targetCenter_ = g, this.applyTargetState_(!1, !0), Rl(m, !0));\n }\n /**\n * Center on coordinate and view position.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"./size.js\").Size} size Box pixel size.\n * @param {import(\"./pixel.js\").Pixel} position Position on the view to center on.\n * @api\n */\n centerOn(e, t, i) {\n this.centerOnInternal(\n Ps(e, this.getProjection()),\n t,\n i\n );\n }\n /**\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"./size.js\").Size} size Box pixel size.\n * @param {import(\"./pixel.js\").Pixel} position Position on the view to center on.\n */\n centerOnInternal(e, t, i) {\n this.setCenterInternal(\n $h(\n e,\n t,\n i,\n this.getResolution(),\n this.getRotation()\n )\n );\n }\n /**\n * Calculates the shift between map and viewport center.\n * @param {import(\"./coordinate.js\").Coordinate} center Center.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {import(\"./size.js\").Size} size Size.\n * @return {Array|undefined} Center shift.\n */\n calculateCenterShift(e, t, i, r) {\n let s;\n const a = this.padding_;\n if (a && e) {\n const o = this.getViewportSizeMinusPadding_(-i), l = $h(\n e,\n r,\n [o[0] / 2 + a[3], o[1] / 2 + a[0]],\n t,\n i\n );\n s = [\n e[0] - l[0],\n e[1] - l[1]\n ];\n }\n return s;\n }\n /**\n * @return {boolean} Is defined.\n */\n isDef() {\n return !!this.getCenterInternal() && this.getResolution() !== void 0;\n }\n /**\n * Adds relative coordinates to the center of the view. Any extent constraint will apply.\n * @param {import(\"./coordinate.js\").Coordinate} deltaCoordinates Relative value to add.\n * @api\n */\n adjustCenter(e) {\n const t = Au(this.targetCenter_, this.getProjection());\n this.setCenter([\n t[0] + e[0],\n t[1] + e[1]\n ]);\n }\n /**\n * Adds relative coordinates to the center of the view. Any extent constraint will apply.\n * @param {import(\"./coordinate.js\").Coordinate} deltaCoordinates Relative value to add.\n */\n adjustCenterInternal(e) {\n const t = this.targetCenter_;\n this.setCenterInternal([\n t[0] + e[0],\n t[1] + e[1]\n ]);\n }\n /**\n * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} ratio The ratio to apply on the view resolution.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n * @api\n */\n adjustResolution(e, t) {\n t = t && Ps(t, this.getProjection()), this.adjustResolutionInternal(e, t);\n }\n /**\n * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} ratio The ratio to apply on the view resolution.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n */\n adjustResolutionInternal(e, t) {\n const i = this.getAnimating() || this.getInteracting(), r = this.getViewportSize_(this.getRotation()), s = this.constraints_.resolution(\n this.targetResolution_ * e,\n 0,\n r,\n i\n );\n t && (this.targetCenter_ = this.calculateCenterZoom(s, t)), this.targetResolution_ *= e, this.applyTargetState_();\n }\n /**\n * Adds a value to the view zoom level, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} delta Relative value to add to the zoom level.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n * @api\n */\n adjustZoom(e, t) {\n this.adjustResolution(Math.pow(this.zoomFactor_, -e), t);\n }\n /**\n * Adds a value to the view rotation, optionally using an anchor. Any rotation\n * constraint will apply.\n * @param {number} delta Relative value to add to the zoom rotation, in radians.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The rotation center.\n * @api\n */\n adjustRotation(e, t) {\n t && (t = Ps(t, this.getProjection())), this.adjustRotationInternal(e, t);\n }\n /**\n * @param {number} delta Relative value to add to the zoom rotation, in radians.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The rotation center.\n */\n adjustRotationInternal(e, t) {\n const i = this.getAnimating() || this.getInteracting(), r = this.constraints_.rotation(\n this.targetRotation_ + e,\n i\n );\n t && (this.targetCenter_ = this.calculateCenterRotate(r, t)), this.targetRotation_ += e, this.applyTargetState_();\n }\n /**\n * Set the center of the current view. Any extent constraint will apply.\n * @param {import(\"./coordinate.js\").Coordinate|undefined} center The center of the view.\n * @observable\n * @api\n */\n setCenter(e) {\n this.setCenterInternal(\n e && Ps(e, this.getProjection())\n );\n }\n /**\n * Set the center using the view projection (not the user projection).\n * @param {import(\"./coordinate.js\").Coordinate|undefined} center The center of the view.\n */\n setCenterInternal(e) {\n this.targetCenter_ = e, this.applyTargetState_();\n }\n /**\n * @param {import(\"./ViewHint.js\").default} hint Hint.\n * @param {number} delta Delta.\n * @return {number} New value.\n */\n setHint(e, t) {\n return this.hints_[e] += t, this.changed(), this.hints_[e];\n }\n /**\n * Set the resolution for this view. Any resolution constraint will apply.\n * @param {number|undefined} resolution The resolution of the view.\n * @observable\n * @api\n */\n setResolution(e) {\n this.targetResolution_ = e, this.applyTargetState_();\n }\n /**\n * Set the rotation for this view. Any rotation constraint will apply.\n * @param {number} rotation The rotation of the view in radians.\n * @observable\n * @api\n */\n setRotation(e) {\n this.targetRotation_ = e, this.applyTargetState_();\n }\n /**\n * Zoom to a specific zoom level. Any resolution constrain will apply.\n * @param {number} zoom Zoom level.\n * @api\n */\n setZoom(e) {\n this.setResolution(this.getResolutionForZoom(e));\n }\n /**\n * Recompute rotation/resolution/center based on target values.\n * Note: we have to compute rotation first, then resolution and center considering that\n * parameters can influence one another in case a view extent constraint is present.\n * @param {boolean} [doNotCancelAnims] Do not cancel animations.\n * @param {boolean} [forceMoving] Apply constraints as if the view is moving.\n * @private\n */\n applyTargetState_(e, t) {\n const i = this.getAnimating() || this.getInteracting() || t, r = this.constraints_.rotation(\n this.targetRotation_,\n i\n ), s = this.getViewportSize_(r), a = this.constraints_.resolution(\n this.targetResolution_,\n 0,\n s,\n i\n ), o = this.constraints_.center(\n this.targetCenter_,\n a,\n s,\n i,\n this.calculateCenterShift(\n this.targetCenter_,\n a,\n r,\n s\n )\n );\n this.get(Xr.ROTATION) !== r && this.set(Xr.ROTATION, r), this.get(Xr.RESOLUTION) !== a && (this.set(Xr.RESOLUTION, a), this.set(\"zoom\", this.getZoom(), !0)), (!o || !this.get(Xr.CENTER) || !gc(this.get(Xr.CENTER), o)) && this.set(Xr.CENTER, o), this.getAnimating() && !e && this.cancelAnimations(), this.cancelAnchor_ = void 0;\n }\n /**\n * If any constraints need to be applied, an animation will be triggered.\n * This is typically done on interaction end.\n * Note: calling this with a duration of 0 will apply the constrained values straight away,\n * without animation.\n * @param {number} [duration] The animation duration in ms.\n * @param {number} [resolutionDirection] Which direction to zoom.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n */\n resolveConstraints(e, t, i) {\n e = e !== void 0 ? e : 200;\n const r = t || 0, s = this.constraints_.rotation(this.targetRotation_), a = this.getViewportSize_(s), o = this.constraints_.resolution(\n this.targetResolution_,\n r,\n a\n ), l = this.constraints_.center(\n this.targetCenter_,\n o,\n a,\n !1,\n this.calculateCenterShift(\n this.targetCenter_,\n o,\n s,\n a\n )\n );\n if (e === 0 && !this.cancelAnchor_) {\n this.targetResolution_ = o, this.targetRotation_ = s, this.targetCenter_ = l, this.applyTargetState_();\n return;\n }\n i = i || (e === 0 ? this.cancelAnchor_ : void 0), this.cancelAnchor_ = void 0, (this.getResolution() !== o || this.getRotation() !== s || !this.getCenterInternal() || !gc(this.getCenterInternal(), l)) && (this.getAnimating() && this.cancelAnimations(), this.animateInternal({\n rotation: s,\n center: l,\n resolution: o,\n duration: e,\n easing: Ka,\n anchor: i\n }));\n }\n /**\n * Notify the View that an interaction has started.\n * The view state will be resolved to a stable one if needed\n * (depending on its constraints).\n * @api\n */\n beginInteraction() {\n this.resolveConstraints(0), this.setHint(Mr.INTERACTING, 1);\n }\n /**\n * Notify the View that an interaction has ended. The view state will be resolved\n * to a stable one if needed (depending on its constraints).\n * @param {number} [duration] Animation duration in ms.\n * @param {number} [resolutionDirection] Which direction to zoom.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n * @api\n */\n endInteraction(e, t, i) {\n i = i && Ps(i, this.getProjection()), this.endInteractionInternal(e, t, i);\n }\n /**\n * Notify the View that an interaction has ended. The view state will be resolved\n * to a stable one if needed (depending on its constraints).\n * @param {number} [duration] Animation duration in ms.\n * @param {number} [resolutionDirection] Which direction to zoom.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n */\n endInteractionInternal(e, t, i) {\n this.getInteracting() && (this.setHint(Mr.INTERACTING, -1), this.resolveConstraints(e, t, i));\n }\n /**\n * Get a valid position for the view center according to the current constraints.\n * @param {import(\"./coordinate.js\").Coordinate|undefined} targetCenter Target center position.\n * @param {number} [targetResolution] Target resolution. If not supplied, the current one will be used.\n * This is useful to guess a valid center position at a different zoom level.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Valid center position.\n */\n getConstrainedCenter(e, t) {\n const i = this.getViewportSize_(this.getRotation());\n return this.constraints_.center(\n e,\n t || this.getResolution(),\n i\n );\n }\n /**\n * Get a valid zoom level according to the current view constraints.\n * @param {number|undefined} targetZoom Target zoom.\n * @param {number} [direction=0] Indicate which resolution should be used\n * by a renderer if the view resolution does not match any resolution of the tile source.\n * If 0, the nearest resolution will be used. If 1, the nearest lower resolution\n * will be used. If -1, the nearest higher resolution will be used.\n * @return {number|undefined} Valid zoom level.\n */\n getConstrainedZoom(e, t) {\n const i = this.getResolutionForZoom(e);\n return this.getZoomForResolution(\n this.getConstrainedResolution(i, t)\n );\n }\n /**\n * Get a valid resolution according to the current view constraints.\n * @param {number|undefined} targetResolution Target resolution.\n * @param {number} [direction=0] Indicate which resolution should be used\n * by a renderer if the view resolution does not match any resolution of the tile source.\n * If 0, the nearest resolution will be used. If 1, the nearest lower resolution\n * will be used. If -1, the nearest higher resolution will be used.\n * @return {number|undefined} Valid resolution.\n */\n getConstrainedResolution(e, t) {\n t = t || 0;\n const i = this.getViewportSize_(this.getRotation());\n return this.constraints_.resolution(e, t, i);\n }\n}\nfunction Rl(n, e) {\n setTimeout(function() {\n n(e);\n }, 0);\n}\nfunction _U(n) {\n if (n.extent !== void 0) {\n const t = n.smoothExtentConstraint !== void 0 ? n.smoothExtentConstraint : !0;\n return Sm(n.extent, n.constrainOnlyCenter, t);\n }\n const e = jf(n.projection, \"EPSG:3857\");\n if (n.multiWorld !== !0 && e.isGlobal()) {\n const t = e.getExtent().slice();\n return t[0] = -1 / 0, t[2] = 1 / 0, Sm(t, !1, !1);\n }\n return Ww;\n}\nfunction EU(n) {\n let e, t, i, a = n.minZoom !== void 0 ? n.minZoom : Jh, o = n.maxZoom !== void 0 ? n.maxZoom : 28;\n const l = n.zoomFactor !== void 0 ? n.zoomFactor : 2, c = n.multiWorld !== void 0 ? n.multiWorld : !1, h = n.smoothResolutionConstraint !== void 0 ? n.smoothResolutionConstraint : !0, u = n.showFullExtent !== void 0 ? n.showFullExtent : !1, f = jf(n.projection, \"EPSG:3857\"), d = f.getExtent();\n let p = n.constrainOnlyCenter, g = n.extent;\n if (!c && !g && f.isGlobal() && (p = !1, g = d), n.resolutions !== void 0) {\n const m = n.resolutions;\n t = m[a], i = m[o] !== void 0 ? m[o] : m[m.length - 1], n.constrainResolution ? e = Gw(\n m,\n h,\n !p && g,\n u\n ) : e = ym(\n t,\n i,\n h,\n !p && g,\n u\n );\n } else {\n const v = (d ? Math.max(Ui(d), gs(d)) : (\n // use an extent that can fit the whole world if need be\n 360 * Po.degrees / f.getMetersPerUnit()\n )) / qf / Math.pow(2, Jh), E = v / Math.pow(2, 28 - Jh);\n t = n.maxResolution, t !== void 0 ? a = 0 : t = v / Math.pow(l, a), i = n.minResolution, i === void 0 && (n.maxZoom !== void 0 ? n.maxResolution !== void 0 ? i = t / Math.pow(l, o) : i = v / Math.pow(l, o) : i = E), o = a + Math.floor(\n Math.log(t / i) / Math.log(l)\n ), i = t / Math.pow(l, o - a), n.constrainResolution ? e = Xw(\n l,\n t,\n i,\n h,\n !p && g,\n u\n ) : e = ym(\n t,\n i,\n h,\n !p && g,\n u\n );\n }\n return {\n constraint: e,\n maxResolution: t,\n minResolution: i,\n minZoom: a,\n zoomFactor: l\n };\n}\nfunction vU(n) {\n if (n.enableRotation !== void 0 ? n.enableRotation : !0) {\n const t = n.constrainRotation;\n return t === void 0 || t === !0 ? Kw() : t === !1 ? Im : typeof t == \"number\" ? Hw(t) : Im;\n }\n return td;\n}\nfunction TU(n) {\n return !(n.sourceCenter && n.targetCenter && !gc(n.sourceCenter, n.targetCenter) || n.sourceResolution !== n.targetResolution || n.sourceRotation !== n.targetRotation);\n}\nfunction $h(n, e, t, i, r) {\n const s = Math.cos(-r);\n let a = Math.sin(-r), o = n[0] * s - n[1] * a, l = n[1] * s + n[0] * a;\n o += (e[0] / 2 - t[0]) * i, l += (t[1] - e[1] / 2) * i, a = -a;\n const c = o * s - l * a, h = l * s + o * a;\n return [c, h];\n}\nconst Qr = mU;\nclass xU extends DE {\n /**\n * @param {Options} options Layer options.\n */\n constructor(e) {\n const t = Object.assign({}, e);\n delete t.source, super(t), this.on, this.once, this.un, this.mapPrecomposeKey_ = null, this.mapRenderKey_ = null, this.sourceChangeKey_ = null, this.renderer_ = null, this.sourceReady_ = !1, this.rendered = !1, e.render && (this.render = e.render), e.map && this.setMap(e.map), this.addChangeListener(\n Gt.SOURCE,\n this.handleSourcePropertyChange_\n );\n const i = e.source ? (\n /** @type {SourceType} */\n e.source\n ) : null;\n this.setSource(i);\n }\n /**\n * @param {Array} [array] Array of layers (to be modified in place).\n * @return {Array} Array of layers.\n */\n getLayersArray(e) {\n return e = e || [], e.push(this), e;\n }\n /**\n * @param {Array} [states] Optional list of layer states (to be modified in place).\n * @return {Array} List of layer states.\n */\n getLayerStatesArray(e) {\n return e = e || [], e.push(this.getLayerState()), e;\n }\n /**\n * Get the layer source.\n * @return {SourceType|null} The layer source (or `null` if not yet set).\n * @observable\n * @api\n */\n getSource() {\n return (\n /** @type {SourceType} */\n this.get(Gt.SOURCE) || null\n );\n }\n /**\n * @return {SourceType|null} The source being rendered.\n */\n getRenderSource() {\n return this.getSource();\n }\n /**\n * @return {import(\"../source/Source.js\").State} Source state.\n */\n getSourceState() {\n const e = this.getSource();\n return e ? e.getState() : \"undefined\";\n }\n /**\n * @private\n */\n handleSourceChange_() {\n this.changed(), !(this.sourceReady_ || this.getSource().getState() !== \"ready\") && (this.sourceReady_ = !0, this.dispatchEvent(\"sourceready\"));\n }\n /**\n * @private\n */\n handleSourcePropertyChange_() {\n this.sourceChangeKey_ && (Ei(this.sourceChangeKey_), this.sourceChangeKey_ = null), this.sourceReady_ = !1;\n const e = this.getSource();\n e && (this.sourceChangeKey_ = Ht(\n e,\n St.CHANGE,\n this.handleSourceChange_,\n this\n ), e.getState() === \"ready\" && (this.sourceReady_ = !0, setTimeout(() => {\n this.dispatchEvent(\"sourceready\");\n }, 0))), this.changed();\n }\n /**\n * @param {import(\"../pixel\").Pixel} pixel Pixel.\n * @return {Promise>} Promise that resolves with\n * an array of features.\n */\n getFeatures(e) {\n return this.renderer_ ? this.renderer_.getFeatures(e) : Promise.resolve([]);\n }\n /**\n * @param {import(\"../pixel\").Pixel} pixel Pixel.\n * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView|null} Pixel data.\n */\n getData(e) {\n return !this.renderer_ || !this.rendered ? null : this.renderer_.getData(e);\n }\n /**\n * The layer is visible on the map view, i.e. within its min/max resolution or zoom and\n * extent, not set to `visible: false`, and not inside a layer group that is set\n * to `visible: false`.\n * @param {View|import(\"../View.js\").ViewStateLayerStateExtent} [view] View or {@link import(\"../Map.js\").FrameState}.\n * Only required when the layer is not added to a map.\n * @return {boolean} The layer is visible in the map view.\n * @api\n */\n isVisible(e) {\n let t;\n const i = this.getMapInternal();\n !e && i && (e = i.getView()), e instanceof Qr ? t = {\n viewState: e.getState(),\n extent: e.calculateExtent()\n } : t = e, !t.layerStatesArray && i && (t.layerStatesArray = i.getLayerGroup().getLayerStatesArray());\n let r;\n t.layerStatesArray ? r = t.layerStatesArray.find(\n (a) => a.layer === this\n ) : r = this.getLayerState();\n const s = this.getExtent();\n return sd(r, t.viewState) && (!s || Jo(s, t.extent));\n }\n /**\n * Get the attributions of the source of this layer for the given view.\n * @param {View|import(\"../View.js\").ViewStateLayerStateExtent} [view] View or {@link import(\"../Map.js\").FrameState}.\n * Only required when the layer is not added to a map.\n * @return {Array} Attributions for this layer at the given view.\n * @api\n */\n getAttributions(e) {\n if (!this.isVisible(e))\n return [];\n let t;\n const i = this.getSource();\n if (i && (t = i.getAttributions()), !t)\n return [];\n const r = e instanceof Qr ? e.getViewStateAndExtent() : e;\n let s = t(r);\n return Array.isArray(s) || (s = [s]), s;\n }\n /**\n * In charge to manage the rendering of the layer. One layer type is\n * bounded with one layer renderer.\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n * @param {HTMLElement} target Target which the renderer may (but need not) use\n * for rendering its content.\n * @return {HTMLElement|null} The rendered element.\n */\n render(e, t) {\n const i = this.getRenderer();\n return i.prepareFrame(e) ? (this.rendered = !0, i.renderFrame(e, t)) : null;\n }\n /**\n * Called when a layer is not visible during a map render.\n */\n unrender() {\n this.rendered = !1;\n }\n /**\n * For use inside the library only.\n * @param {import(\"../Map.js\").default|null} map Map.\n */\n setMapInternal(e) {\n e || this.unrender(), this.set(Gt.MAP, e);\n }\n /**\n * For use inside the library only.\n * @return {import(\"../Map.js\").default|null} Map.\n */\n getMapInternal() {\n return this.get(Gt.MAP);\n }\n /**\n * Sets the layer to be rendered on top of other layers on a map. The map will\n * not manage this layer in its layers collection. This\n * is useful for temporary layers. To remove an unmanaged layer from the map,\n * use `#setMap(null)`.\n *\n * To add the layer to a map and have it managed by the map, use\n * {@link module:ol/Map~Map#addLayer} instead.\n * @param {import(\"../Map.js\").default|null} map Map.\n * @api\n */\n setMap(e) {\n this.mapPrecomposeKey_ && (Ei(this.mapPrecomposeKey_), this.mapPrecomposeKey_ = null), e || this.changed(), this.mapRenderKey_ && (Ei(this.mapRenderKey_), this.mapRenderKey_ = null), e && (this.mapPrecomposeKey_ = Ht(\n e,\n nn.PRECOMPOSE,\n function(t) {\n const r = /** @type {import(\"../render/Event.js\").default} */ t.frameState.layerStatesArray, s = this.getLayerState(!1);\n Kt(\n !r.some(function(a) {\n return a.layer === s.layer;\n }),\n 67\n ), r.push(s);\n },\n this\n ), this.mapRenderKey_ = Ht(this, St.CHANGE, e.render, e), this.changed());\n }\n /**\n * Set the layer source.\n * @param {SourceType|null} source The layer source.\n * @observable\n * @api\n */\n setSource(e) {\n this.set(Gt.SOURCE, e);\n }\n /**\n * Get the renderer for this layer.\n * @return {RendererType|null} The layer renderer.\n */\n getRenderer() {\n return this.renderer_ || (this.renderer_ = this.createRenderer()), this.renderer_;\n }\n /**\n * @return {boolean} The layer has a renderer.\n */\n hasRenderer() {\n return !!this.renderer_;\n }\n /**\n * Create a renderer for this layer.\n * @return {RendererType} A layer renderer.\n * @protected\n */\n createRenderer() {\n return null;\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n this.renderer_ && (this.renderer_.dispose(), delete this.renderer_), this.setSource(null), super.disposeInternal();\n }\n}\nfunction sd(n, e) {\n if (!n.visible)\n return !1;\n const t = e.resolution;\n if (t < n.minResolution || t >= n.maxResolution)\n return !1;\n const i = e.zoom;\n return i > n.minZoom && i <= n.maxZoom;\n}\nconst nd = xU;\nclass CU extends Wf {\n /**\n * @param {import(\"../Map.js\").default} map Map.\n */\n constructor(e) {\n super(), this.map_ = e;\n }\n /**\n * @abstract\n * @param {import(\"../render/EventType.js\").default} type Event type.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n dispatchRenderEvent(e, t) {\n di();\n }\n /**\n * @param {import(\"../Map.js\").FrameState} frameState FrameState.\n * @protected\n */\n calculateMatrices2D(e) {\n const t = e.viewState, i = e.coordinateToPixelTransform, r = e.pixelToCoordinateTransform;\n Ao(\n i,\n e.size[0] / 2,\n e.size[1] / 2,\n 1 / t.resolution,\n -1 / t.resolution,\n -t.rotation,\n -t.center[0],\n -t.center[1]\n ), yE(r, i);\n }\n /**\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"../Map.js\").FrameState} frameState FrameState.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {boolean} checkWrapped Check for wrapped geometries.\n * @param {import(\"./vector.js\").FeatureCallback} callback Feature callback.\n * @param {S} thisArg Value to use as `this` when executing `callback`.\n * @param {function(this: U, import(\"../layer/Layer.js\").default): boolean} layerFilter Layer filter\n * function, only layers which are visible and for which this function\n * returns `true` will be tested for features. By default, all visible\n * layers will be tested.\n * @param {U} thisArg2 Value to use as `this` when executing `layerFilter`.\n * @return {T|undefined} Callback result.\n * @template S,T,U\n */\n forEachFeatureAtCoordinate(e, t, i, r, s, a, o, l) {\n let c;\n const h = t.viewState;\n function u(T, R, x, S) {\n return s.call(a, R, T ? x : null, S);\n }\n const f = h.projection, d = Pw(e.slice(), f), p = [[0, 0]];\n if (f.canWrapX() && r) {\n const T = f.getExtent(), R = Ui(T);\n p.push([-R, 0], [R, 0]);\n }\n const g = t.layerStatesArray, m = g.length, v = (\n /** @type {Array>} */\n []\n ), E = [];\n for (let T = 0; T < p.length; T++)\n for (let R = m - 1; R >= 0; --R) {\n const x = g[R], S = x.layer;\n if (S.hasRenderer() && sd(x, h) && o.call(l, S)) {\n const M = S.getRenderer(), N = S.getSource();\n if (M && N) {\n const F = N.getWrapX() ? d : e, U = u.bind(\n null,\n x.managed\n );\n E[0] = F[0] + p[T][0], E[1] = F[1] + p[T][1], c = M.forEachFeatureAtCoordinate(\n E,\n t,\n i,\n U,\n v\n );\n }\n if (c)\n return c;\n }\n }\n if (v.length === 0)\n return;\n const C = 1 / v.length;\n return v.forEach((T, R) => T.distanceSq += R * C), v.sort((T, R) => T.distanceSq - R.distanceSq), v.some((T) => c = T.callback(T.feature, T.layer, T.geometry)), c;\n }\n /**\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"../Map.js\").FrameState} frameState FrameState.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {boolean} checkWrapped Check for wrapped geometries.\n * @param {function(this: U, import(\"../layer/Layer.js\").default): boolean} layerFilter Layer filter\n * function, only layers which are visible and for which this function\n * returns `true` will be tested for features. By default, all visible\n * layers will be tested.\n * @param {U} thisArg Value to use as `this` when executing `layerFilter`.\n * @return {boolean} Is there a feature at the given coordinate?\n * @template U\n */\n hasFeatureAtCoordinate(e, t, i, r, s, a) {\n return this.forEachFeatureAtCoordinate(\n e,\n t,\n i,\n r,\n uc,\n this,\n s,\n a\n ) !== void 0;\n }\n /**\n * @return {import(\"../Map.js\").default} Map.\n */\n getMap() {\n return this.map_;\n }\n /**\n * Render.\n * @abstract\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n */\n renderFrame(e) {\n di();\n }\n /**\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n flushDeclutterItems(e) {\n }\n /**\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @protected\n */\n scheduleExpireIconCache(e) {\n OE.canExpireCache() && e.postRenderFunctions.push(RU);\n }\n}\nfunction RU(n, e) {\n OE.expire();\n}\nclass qE extends pn {\n /**\n * @param {import(\"./EventType.js\").default} type Type.\n * @param {import(\"../transform.js\").Transform} [inversePixelTransform] Transform for\n * CSS pixels to rendered pixels.\n * @param {import(\"../Map.js\").FrameState} [frameState] Frame state.\n * @param {?(CanvasRenderingContext2D|WebGLRenderingContext)} [context] Context.\n */\n constructor(e, t, i, r) {\n super(e), this.inversePixelTransform = t, this.frameState = i, this.context = r;\n }\n}\nconst Sl = \"ol-hidden\", rh = \"ol-unselectable\", ad = \"ol-control\", Dm = \"ol-collapsed\";\nfunction Na(n, e, t, i) {\n let r;\n return t && t.length ? r = t.shift() : RE ? r = new OffscreenCanvas(n || 300, e || 300) : r = document.createElement(\"canvas\"), n && (r.width = n), e && (r.height = e), /** @type {CanvasRenderingContext2D} */\n r.getContext(\"2d\", i);\n}\nfunction od(n) {\n const e = n.canvas;\n e.width = 1, e.height = 1, n.clearRect(0, 0, 1, 1);\n}\nfunction Nm(n, e) {\n const t = e.parentNode;\n t && t.replaceChild(n, e);\n}\nfunction Mu(n) {\n return n && n.parentNode ? n.parentNode.removeChild(n) : null;\n}\nfunction SU(n) {\n for (; n.lastChild; )\n n.removeChild(n.lastChild);\n}\nfunction yU(n, e) {\n const t = n.childNodes;\n for (let i = 0; ; ++i) {\n const r = t[i], s = e[i];\n if (!r && !s)\n break;\n if (r !== s) {\n if (!r) {\n n.appendChild(s);\n continue;\n }\n if (!s) {\n n.removeChild(r), --i;\n continue;\n }\n n.insertBefore(s, r);\n }\n }\n}\nconst IU = new Ws();\nclass bU extends CU {\n /**\n * @param {import(\"../Map.js\").default} map Map.\n */\n constructor(e) {\n super(e), this.fontChangeListenerKey_ = Ht(\n IU,\n bo.PROPERTYCHANGE,\n e.redrawText.bind(e)\n ), this.element_ = document.createElement(\"div\");\n const t = this.element_.style;\n t.position = \"absolute\", t.width = \"100%\", t.height = \"100%\", t.zIndex = \"0\", this.element_.className = rh + \" ol-layers\";\n const i = e.getViewport();\n i.insertBefore(this.element_, i.firstChild || null), this.children_ = [], this.renderedVisible_ = !0, this.declutterLayers_ = [];\n }\n /**\n * @param {import(\"../render/EventType.js\").default} type Event type.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n dispatchRenderEvent(e, t) {\n const i = this.getMap();\n if (i.hasListener(e)) {\n const r = new qE(e, void 0, t);\n i.dispatchEvent(r);\n }\n }\n disposeInternal() {\n Ei(this.fontChangeListenerKey_), this.element_.parentNode.removeChild(this.element_), super.disposeInternal();\n }\n /**\n * Render.\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n */\n renderFrame(e) {\n if (!e) {\n this.renderedVisible_ && (this.element_.style.display = \"none\", this.renderedVisible_ = !1);\n return;\n }\n this.calculateMatrices2D(e), this.dispatchRenderEvent(nn.PRECOMPOSE, e);\n const t = e.layerStatesArray.sort(function(a, o) {\n return a.zIndex - o.zIndex;\n }), i = e.viewState;\n this.children_.length = 0;\n const r = this.declutterLayers_;\n r.length = 0;\n let s = null;\n for (let a = 0, o = t.length; a < o; ++a) {\n const l = t[a];\n e.layerIndex = a;\n const c = l.layer, h = c.getSourceState();\n if (!sd(l, i) || h != \"ready\" && h != \"undefined\") {\n c.unrender();\n continue;\n }\n const u = c.render(e, s);\n u && (u !== s && (this.children_.push(u), s = u), \"getDeclutter\" in c && r.push(\n /** @type {import(\"../layer/BaseVector.js\").default} */\n c\n ));\n }\n this.flushDeclutterItems(e), yU(this.element_, this.children_), this.dispatchRenderEvent(nn.POSTCOMPOSE, e), this.renderedVisible_ || (this.element_.style.display = \"\", this.renderedVisible_ = !0), this.scheduleExpireIconCache(e);\n }\n /**\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n flushDeclutterItems(e) {\n const t = this.declutterLayers_;\n for (let i = t.length - 1; i >= 0; --i)\n t[i].renderDeclutter(e);\n t.length = 0;\n }\n}\nclass tn extends pn {\n /**\n * @param {EventType} type The event type.\n * @param {BaseLayer} layer The layer.\n */\n constructor(e, t) {\n super(e), this.layer = t;\n }\n}\nconst eu = {\n LAYERS: \"layers\"\n};\nclass qa extends DE {\n /**\n * @param {Options} [options] Layer options.\n */\n constructor(e) {\n e = e || {};\n const t = (\n /** @type {Options} */\n Object.assign({}, e)\n );\n delete t.layers;\n let i = e.layers;\n super(t), this.on, this.once, this.un, this.layersListenerKeys_ = [], this.listenerKeys_ = {}, this.addChangeListener(eu.LAYERS, this.handleLayersChanged_), i ? Array.isArray(i) ? i = new Us(i.slice(), { unique: !0 }) : Kt(typeof /** @type {?} */\n i.getArray == \"function\", 43) : i = new Us(void 0, { unique: !0 }), this.setLayers(i);\n }\n /**\n * @private\n */\n handleLayerChange_() {\n this.changed();\n }\n /**\n * @private\n */\n handleLayersChanged_() {\n this.layersListenerKeys_.forEach(Ei), this.layersListenerKeys_.length = 0;\n const e = this.getLayers();\n this.layersListenerKeys_.push(\n Ht(e, Dr.ADD, this.handleLayersAdd_, this),\n Ht(e, Dr.REMOVE, this.handleLayersRemove_, this)\n );\n for (const i in this.listenerKeys_)\n this.listenerKeys_[i].forEach(Ei);\n $c(this.listenerKeys_);\n const t = e.getArray();\n for (let i = 0, r = t.length; i < r; i++) {\n const s = t[i];\n this.registerLayerListeners_(s), this.dispatchEvent(new tn(\"addlayer\", s));\n }\n this.changed();\n }\n /**\n * @param {BaseLayer} layer The layer.\n */\n registerLayerListeners_(e) {\n const t = [\n Ht(\n e,\n bo.PROPERTYCHANGE,\n this.handleLayerChange_,\n this\n ),\n Ht(e, St.CHANGE, this.handleLayerChange_, this)\n ];\n e instanceof qa && t.push(\n Ht(e, \"addlayer\", this.handleLayerGroupAdd_, this),\n Ht(e, \"removelayer\", this.handleLayerGroupRemove_, this)\n ), this.listenerKeys_[fr(e)] = t;\n }\n /**\n * @param {GroupEvent} event The layer group event.\n */\n handleLayerGroupAdd_(e) {\n this.dispatchEvent(new tn(\"addlayer\", e.layer));\n }\n /**\n * @param {GroupEvent} event The layer group event.\n */\n handleLayerGroupRemove_(e) {\n this.dispatchEvent(new tn(\"removelayer\", e.layer));\n }\n /**\n * @param {import(\"../Collection.js\").CollectionEvent} collectionEvent CollectionEvent.\n * @private\n */\n handleLayersAdd_(e) {\n const t = e.element;\n this.registerLayerListeners_(t), this.dispatchEvent(new tn(\"addlayer\", t)), this.changed();\n }\n /**\n * @param {import(\"../Collection.js\").CollectionEvent} collectionEvent CollectionEvent.\n * @private\n */\n handleLayersRemove_(e) {\n const t = e.element, i = fr(t);\n this.listenerKeys_[i].forEach(Ei), delete this.listenerKeys_[i], this.dispatchEvent(new tn(\"removelayer\", t)), this.changed();\n }\n /**\n * Returns the {@link module:ol/Collection~Collection collection} of {@link module:ol/layer/Layer~Layer layers}\n * in this group.\n * @return {!Collection} Collection of\n * {@link module:ol/layer/Base~BaseLayer layers} that are part of this group.\n * @observable\n * @api\n */\n getLayers() {\n return (\n /** @type {!Collection} */\n this.get(eu.LAYERS)\n );\n }\n /**\n * Set the {@link module:ol/Collection~Collection collection} of {@link module:ol/layer/Layer~Layer layers}\n * in this group.\n * @param {!Collection} layers Collection of\n * {@link module:ol/layer/Base~BaseLayer layers} that are part of this group.\n * @observable\n * @api\n */\n setLayers(e) {\n const t = this.getLayers();\n if (t) {\n const i = t.getArray();\n for (let r = 0, s = i.length; r < s; ++r)\n this.dispatchEvent(new tn(\"removelayer\", i[r]));\n }\n this.set(eu.LAYERS, e);\n }\n /**\n * @param {Array} [array] Array of layers (to be modified in place).\n * @return {Array} Array of layers.\n */\n getLayersArray(e) {\n return e = e !== void 0 ? e : [], this.getLayers().forEach(function(t) {\n t.getLayersArray(e);\n }), e;\n }\n /**\n * Get the layer states list and use this groups z-index as the default\n * for all layers in this and nested groups, if it is unset at this point.\n * If dest is not provided and this group's z-index is undefined\n * 0 is used a the default z-index.\n * @param {Array} [dest] Optional list\n * of layer states (to be modified in place).\n * @return {Array} List of layer states.\n */\n getLayerStatesArray(e) {\n const t = e !== void 0 ? e : [], i = t.length;\n this.getLayers().forEach(function(a) {\n a.getLayerStatesArray(t);\n });\n const r = this.getLayerState();\n let s = r.zIndex;\n !e && r.zIndex === void 0 && (s = 0);\n for (let a = i, o = t.length; a < o; a++) {\n const l = t[a];\n l.opacity *= r.opacity, l.visible = l.visible && r.visible, l.maxResolution = Math.min(\n l.maxResolution,\n r.maxResolution\n ), l.minResolution = Math.max(\n l.minResolution,\n r.minResolution\n ), l.minZoom = Math.max(l.minZoom, r.minZoom), l.maxZoom = Math.min(l.maxZoom, r.maxZoom), r.extent !== void 0 && (l.extent !== void 0 ? l.extent = fo(\n l.extent,\n r.extent\n ) : l.extent = r.extent), l.zIndex === void 0 && (l.zIndex = s);\n }\n return t;\n }\n /**\n * @return {import(\"../source/Source.js\").State} Source state.\n */\n getSourceState() {\n return \"ready\";\n }\n}\nclass oa extends pn {\n /**\n * @param {string} type Event type.\n * @param {import(\"./Map.js\").default} map Map.\n * @param {?import(\"./Map.js\").FrameState} [frameState] Frame state.\n */\n constructor(e, t, i) {\n super(e), this.map = t, this.frameState = i !== void 0 ? i : null;\n }\n}\nclass Js extends oa {\n /**\n * @param {string} type Event type.\n * @param {import(\"./Map.js\").default} map Map.\n * @param {EVENT} originalEvent Original event.\n * @param {boolean} [dragging] Is the map currently being dragged?\n * @param {import(\"./Map.js\").FrameState} [frameState] Frame state.\n * @param {Array} [activePointers] Active pointers.\n */\n constructor(e, t, i, r, s, a) {\n super(e, t, s), this.originalEvent = i, this.pixel_ = null, this.coordinate_ = null, this.dragging = r !== void 0 ? r : !1, this.activePointers = a;\n }\n /**\n * The map pixel relative to the viewport corresponding to the original event.\n * @type {import(\"./pixel.js\").Pixel}\n * @api\n */\n get pixel() {\n return this.pixel_ || (this.pixel_ = this.map.getEventPixel(this.originalEvent)), this.pixel_;\n }\n set pixel(e) {\n this.pixel_ = e;\n }\n /**\n * The coordinate corresponding to the original browser event. This will be in the user\n * projection if one is set. Otherwise it will be in the view projection.\n * @type {import(\"./coordinate.js\").Coordinate}\n * @api\n */\n get coordinate() {\n return this.coordinate_ || (this.coordinate_ = this.map.getCoordinateFromPixel(this.pixel)), this.coordinate_;\n }\n set coordinate(e) {\n this.coordinate_ = e;\n }\n /**\n * Prevents the default browser action.\n * See https://developer.mozilla.org/en-US/docs/Web/API/event.preventDefault.\n * @api\n */\n preventDefault() {\n super.preventDefault(), \"preventDefault\" in this.originalEvent && this.originalEvent.preventDefault();\n }\n /**\n * Prevents further propagation of the current event.\n * See https://developer.mozilla.org/en-US/docs/Web/API/event.stopPropagation.\n * @api\n */\n stopPropagation() {\n super.stopPropagation(), \"stopPropagation\" in this.originalEvent && this.originalEvent.stopPropagation();\n }\n}\nconst ui = {\n /**\n * A true single click with no dragging and no double click. Note that this\n * event is delayed by 250 ms to ensure that it is not a double click.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#singleclick\n * @api\n */\n SINGLECLICK: \"singleclick\",\n /**\n * A click with no dragging. A double click will fire two of this.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#click\n * @api\n */\n CLICK: St.CLICK,\n /**\n * A true double click, with no dragging.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#dblclick\n * @api\n */\n DBLCLICK: St.DBLCLICK,\n /**\n * Triggered when a pointer is dragged.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointerdrag\n * @api\n */\n POINTERDRAG: \"pointerdrag\",\n /**\n * Triggered when a pointer is moved. Note that on touch devices this is\n * triggered when the map is panned, so is not the same as mousemove.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointermove\n * @api\n */\n POINTERMOVE: \"pointermove\",\n POINTERDOWN: \"pointerdown\",\n POINTERUP: \"pointerup\",\n POINTEROVER: \"pointerover\",\n POINTEROUT: \"pointerout\",\n POINTERENTER: \"pointerenter\",\n POINTERLEAVE: \"pointerleave\",\n POINTERCANCEL: \"pointercancel\"\n}, Pu = {\n POINTERMOVE: \"pointermove\",\n POINTERDOWN: \"pointerdown\",\n POINTERUP: \"pointerup\",\n POINTEROVER: \"pointerover\",\n POINTEROUT: \"pointerout\",\n POINTERENTER: \"pointerenter\",\n POINTERLEAVE: \"pointerleave\",\n POINTERCANCEL: \"pointercancel\"\n};\nclass AU extends Hf {\n /**\n * @param {import(\"./Map.js\").default} map The map with the viewport to listen to events on.\n * @param {number} [moveTolerance] The minimal distance the pointer must travel to trigger a move.\n */\n constructor(e, t) {\n super(e), this.map_ = e, this.clickTimeoutId_, this.emulateClicks_ = !1, this.dragging_ = !1, this.dragListenerKeys_ = [], this.moveTolerance_ = t === void 0 ? 1 : t, this.down_ = null;\n const i = this.map_.getViewport();\n this.activePointers_ = [], this.trackedTouches_ = {}, this.element_ = i, this.pointerdownListenerKey_ = Ht(\n i,\n Pu.POINTERDOWN,\n this.handlePointerDown_,\n this\n ), this.originalPointerMoveEvent_, this.relayedListenerKey_ = Ht(\n i,\n Pu.POINTERMOVE,\n this.relayMoveEvent_,\n this\n ), this.boundHandleTouchMove_ = this.handleTouchMove_.bind(this), this.element_.addEventListener(\n St.TOUCHMOVE,\n this.boundHandleTouchMove_,\n SE ? { passive: !1 } : !1\n );\n }\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n emulateClick_(e) {\n let t = new Js(\n ui.CLICK,\n this.map_,\n e\n );\n this.dispatchEvent(t), this.clickTimeoutId_ !== void 0 ? (clearTimeout(this.clickTimeoutId_), this.clickTimeoutId_ = void 0, t = new Js(\n ui.DBLCLICK,\n this.map_,\n e\n ), this.dispatchEvent(t)) : this.clickTimeoutId_ = setTimeout(() => {\n this.clickTimeoutId_ = void 0;\n const i = new Js(\n ui.SINGLECLICK,\n this.map_,\n e\n );\n this.dispatchEvent(i);\n }, 250);\n }\n /**\n * Keeps track on how many pointers are currently active.\n *\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n updateActivePointers_(e) {\n const t = e, i = t.pointerId;\n if (t.type == ui.POINTERUP || t.type == ui.POINTERCANCEL) {\n delete this.trackedTouches_[i];\n for (const r in this.trackedTouches_)\n if (this.trackedTouches_[r].target !== t.target) {\n delete this.trackedTouches_[r];\n break;\n }\n } else\n (t.type == ui.POINTERDOWN || t.type == ui.POINTERMOVE) && (this.trackedTouches_[i] = t);\n this.activePointers_ = Object.values(this.trackedTouches_);\n }\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n handlePointerUp_(e) {\n this.updateActivePointers_(e);\n const t = new Js(\n ui.POINTERUP,\n this.map_,\n e,\n void 0,\n void 0,\n this.activePointers_\n );\n this.dispatchEvent(t), this.emulateClicks_ && !t.defaultPrevented && !this.dragging_ && this.isMouseActionButton_(e) && this.emulateClick_(this.down_), this.activePointers_.length === 0 && (this.dragListenerKeys_.forEach(Ei), this.dragListenerKeys_.length = 0, this.dragging_ = !1, this.down_ = null);\n }\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @return {boolean} If the left mouse button was pressed.\n * @private\n */\n isMouseActionButton_(e) {\n return e.button === 0;\n }\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n handlePointerDown_(e) {\n this.emulateClicks_ = this.activePointers_.length === 0, this.updateActivePointers_(e);\n const t = new Js(\n ui.POINTERDOWN,\n this.map_,\n e,\n void 0,\n void 0,\n this.activePointers_\n );\n if (this.dispatchEvent(t), this.down_ = new PointerEvent(e.type, e), Object.defineProperty(this.down_, \"target\", {\n writable: !1,\n value: e.target\n }), this.dragListenerKeys_.length === 0) {\n const i = this.map_.getOwnerDocument();\n this.dragListenerKeys_.push(\n Ht(\n i,\n ui.POINTERMOVE,\n this.handlePointerMove_,\n this\n ),\n Ht(i, ui.POINTERUP, this.handlePointerUp_, this),\n /* Note that the listener for `pointercancel is set up on\n * `pointerEventHandler_` and not `documentPointerEventHandler_` like\n * the `pointerup` and `pointermove` listeners.\n *\n * The reason for this is the following: `TouchSource.vacuumTouches_()`\n * issues `pointercancel` events, when there was no `touchend` for a\n * `touchstart`. Now, let's say a first `touchstart` is registered on\n * `pointerEventHandler_`. The `documentPointerEventHandler_` is set up.\n * But `documentPointerEventHandler_` doesn't know about the first\n * `touchstart`. If there is no `touchend` for the `touchstart`, we can\n * only receive a `touchcancel` from `pointerEventHandler_`, because it is\n * only registered there.\n */\n Ht(\n this.element_,\n ui.POINTERCANCEL,\n this.handlePointerUp_,\n this\n )\n ), this.element_.getRootNode && this.element_.getRootNode() !== i && this.dragListenerKeys_.push(\n Ht(\n this.element_.getRootNode(),\n ui.POINTERUP,\n this.handlePointerUp_,\n this\n )\n );\n }\n }\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n handlePointerMove_(e) {\n if (this.isMoving_(e)) {\n this.updateActivePointers_(e), this.dragging_ = !0;\n const t = new Js(\n ui.POINTERDRAG,\n this.map_,\n e,\n this.dragging_,\n void 0,\n this.activePointers_\n );\n this.dispatchEvent(t);\n }\n }\n /**\n * Wrap and relay a pointermove event.\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n relayMoveEvent_(e) {\n this.originalPointerMoveEvent_ = e;\n const t = !!(this.down_ && this.isMoving_(e));\n this.dispatchEvent(\n new Js(\n ui.POINTERMOVE,\n this.map_,\n e,\n t\n )\n );\n }\n /**\n * Flexible handling of a `touch-action: none` css equivalent: because calling\n * `preventDefault()` on a `pointermove` event does not stop native page scrolling\n * and zooming, we also listen for `touchmove` and call `preventDefault()` on it\n * when an interaction (currently `DragPan` handles the event.\n * @param {TouchEvent} event Event.\n * @private\n */\n handleTouchMove_(e) {\n const t = this.originalPointerMoveEvent_;\n (!t || t.defaultPrevented) && (typeof e.cancelable != \"boolean\" || e.cancelable === !0) && e.preventDefault();\n }\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @return {boolean} Is moving.\n * @private\n */\n isMoving_(e) {\n return this.dragging_ || Math.abs(e.clientX - this.down_.clientX) > this.moveTolerance_ || Math.abs(e.clientY - this.down_.clientY) > this.moveTolerance_;\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n this.relayedListenerKey_ && (Ei(this.relayedListenerKey_), this.relayedListenerKey_ = null), this.element_.removeEventListener(\n St.TOUCHMOVE,\n this.boundHandleTouchMove_\n ), this.pointerdownListenerKey_ && (Ei(this.pointerdownListenerKey_), this.pointerdownListenerKey_ = null), this.dragListenerKeys_.forEach(Ei), this.dragListenerKeys_.length = 0, this.element_ = null, super.disposeInternal();\n }\n}\nconst $s = {\n /**\n * Triggered after a map frame is rendered.\n * @event module:ol/MapEvent~MapEvent#postrender\n * @api\n */\n POSTRENDER: \"postrender\",\n /**\n * Triggered when the map starts moving.\n * @event module:ol/MapEvent~MapEvent#movestart\n * @api\n */\n MOVESTART: \"movestart\",\n /**\n * Triggered after the map is moved.\n * @event module:ol/MapEvent~MapEvent#moveend\n * @api\n */\n MOVEEND: \"moveend\",\n /**\n * Triggered when loading of additional map data (tiles, images, features) starts.\n * @event module:ol/MapEvent~MapEvent#loadstart\n * @api\n */\n LOADSTART: \"loadstart\",\n /**\n * Triggered when loading of additional map data has completed.\n * @event module:ol/MapEvent~MapEvent#loadend\n * @api\n */\n LOADEND: \"loadend\"\n}, Ki = {\n LAYERGROUP: \"layergroup\",\n SIZE: \"size\",\n TARGET: \"target\",\n VIEW: \"view\"\n}, mc = 1 / 0;\nclass MU {\n /**\n * @param {function(T): number} priorityFunction Priority function.\n * @param {function(T): string} keyFunction Key function.\n */\n constructor(e, t) {\n this.priorityFunction_ = e, this.keyFunction_ = t, this.elements_ = [], this.priorities_ = [], this.queuedElements_ = {};\n }\n /**\n * FIXME empty description for jsdoc\n */\n clear() {\n this.elements_.length = 0, this.priorities_.length = 0, $c(this.queuedElements_);\n }\n /**\n * Remove and return the highest-priority element. O(log N).\n * @return {T} Element.\n */\n dequeue() {\n const e = this.elements_, t = this.priorities_, i = e[0];\n e.length == 1 ? (e.length = 0, t.length = 0) : (e[0] = e.pop(), t[0] = t.pop(), this.siftUp_(0));\n const r = this.keyFunction_(i);\n return delete this.queuedElements_[r], i;\n }\n /**\n * Enqueue an element. O(log N).\n * @param {T} element Element.\n * @return {boolean} The element was added to the queue.\n */\n enqueue(e) {\n Kt(!(this.keyFunction_(e) in this.queuedElements_), 31);\n const t = this.priorityFunction_(e);\n return t != mc ? (this.elements_.push(e), this.priorities_.push(t), this.queuedElements_[this.keyFunction_(e)] = !0, this.siftDown_(0, this.elements_.length - 1), !0) : !1;\n }\n /**\n * @return {number} Count.\n */\n getCount() {\n return this.elements_.length;\n }\n /**\n * Gets the index of the left child of the node at the given index.\n * @param {number} index The index of the node to get the left child for.\n * @return {number} The index of the left child.\n * @private\n */\n getLeftChildIndex_(e) {\n return e * 2 + 1;\n }\n /**\n * Gets the index of the right child of the node at the given index.\n * @param {number} index The index of the node to get the right child for.\n * @return {number} The index of the right child.\n * @private\n */\n getRightChildIndex_(e) {\n return e * 2 + 2;\n }\n /**\n * Gets the index of the parent of the node at the given index.\n * @param {number} index The index of the node to get the parent for.\n * @return {number} The index of the parent.\n * @private\n */\n getParentIndex_(e) {\n return e - 1 >> 1;\n }\n /**\n * Make this a heap. O(N).\n * @private\n */\n heapify_() {\n let e;\n for (e = (this.elements_.length >> 1) - 1; e >= 0; e--)\n this.siftUp_(e);\n }\n /**\n * @return {boolean} Is empty.\n */\n isEmpty() {\n return this.elements_.length === 0;\n }\n /**\n * @param {string} key Key.\n * @return {boolean} Is key queued.\n */\n isKeyQueued(e) {\n return e in this.queuedElements_;\n }\n /**\n * @param {T} element Element.\n * @return {boolean} Is queued.\n */\n isQueued(e) {\n return this.isKeyQueued(this.keyFunction_(e));\n }\n /**\n * @param {number} index The index of the node to move down.\n * @private\n */\n siftUp_(e) {\n const t = this.elements_, i = this.priorities_, r = t.length, s = t[e], a = i[e], o = e;\n for (; e < r >> 1; ) {\n const l = this.getLeftChildIndex_(e), c = this.getRightChildIndex_(e), h = c < r && i[c] < i[l] ? c : l;\n t[e] = t[h], i[e] = i[h], e = h;\n }\n t[e] = s, i[e] = a, this.siftDown_(o, e);\n }\n /**\n * @param {number} startIndex The index of the root.\n * @param {number} index The index of the node to move up.\n * @private\n */\n siftDown_(e, t) {\n const i = this.elements_, r = this.priorities_, s = i[t], a = r[t];\n for (; t > e; ) {\n const o = this.getParentIndex_(t);\n if (r[o] > a)\n i[t] = i[o], r[t] = r[o], t = o;\n else\n break;\n }\n i[t] = s, r[t] = a;\n }\n /**\n * FIXME empty description for jsdoc\n */\n reprioritize() {\n const e = this.priorityFunction_, t = this.elements_, i = this.priorities_;\n let r = 0;\n const s = t.length;\n let a, o, l;\n for (o = 0; o < s; ++o)\n a = t[o], l = e(a), l == mc ? delete this.queuedElements_[this.keyFunction_(a)] : (i[r] = l, t[r++] = a);\n t.length = r, i.length = r, this.heapify_();\n }\n}\nconst Qe = {\n IDLE: 0,\n LOADING: 1,\n LOADED: 2,\n /**\n * Indicates that tile loading failed\n * @type {number}\n */\n ERROR: 3,\n EMPTY: 4\n};\nclass PU extends MU {\n /**\n * @param {PriorityFunction} tilePriorityFunction Tile priority function.\n * @param {function(): ?} tileChangeCallback Function called on each tile change event.\n */\n constructor(e, t) {\n super(\n /**\n * @param {Array} element Element.\n * @return {number} Priority.\n */\n function(i) {\n return e.apply(null, i);\n },\n /**\n * @param {Array} element Element.\n * @return {string} Key.\n */\n function(i) {\n return (\n /** @type {import(\"./Tile.js\").default} */\n i[0].getKey()\n );\n }\n ), this.boundHandleTileChange_ = this.handleTileChange.bind(this), this.tileChangeCallback_ = t, this.tilesLoading_ = 0, this.tilesLoadingKeys_ = {};\n }\n /**\n * @param {Array} element Element.\n * @return {boolean} The element was added to the queue.\n */\n enqueue(e) {\n const t = super.enqueue(e);\n return t && e[0].addEventListener(St.CHANGE, this.boundHandleTileChange_), t;\n }\n /**\n * @return {number} Number of tiles loading.\n */\n getTilesLoading() {\n return this.tilesLoading_;\n }\n /**\n * @param {import(\"./events/Event.js\").default} event Event.\n * @protected\n */\n handleTileChange(e) {\n const t = (\n /** @type {import(\"./Tile.js\").default} */\n e.target\n ), i = t.getState();\n if (i === Qe.LOADED || i === Qe.ERROR || i === Qe.EMPTY) {\n i !== Qe.ERROR && t.removeEventListener(St.CHANGE, this.boundHandleTileChange_);\n const r = t.getKey();\n r in this.tilesLoadingKeys_ && (delete this.tilesLoadingKeys_[r], --this.tilesLoading_), this.tileChangeCallback_();\n }\n }\n /**\n * @param {number} maxTotalLoading Maximum number tiles to load simultaneously.\n * @param {number} maxNewLoads Maximum number of new tiles to load.\n */\n loadMoreTiles(e, t) {\n let i = 0, r, s, a;\n for (; this.tilesLoading_ < e && i < t && this.getCount() > 0; )\n s = /** @type {import(\"./Tile.js\").default} */\n this.dequeue()[0], a = s.getKey(), r = s.getState(), r === Qe.IDLE && !(a in this.tilesLoadingKeys_) && (this.tilesLoadingKeys_[a] = !0, ++this.tilesLoading_, ++i, s.load());\n }\n}\nfunction OU(n, e, t, i, r) {\n if (!n || !(t in n.wantedTiles) || !n.wantedTiles[t][e.getKey()])\n return mc;\n const s = n.viewState.center, a = i[0] - s[0], o = i[1] - s[1];\n return 65536 * Math.log(r) + Math.sqrt(a * a + o * o) / r;\n}\nclass ld extends Ws {\n /**\n * @param {Options} options Control options.\n */\n constructor(e) {\n super();\n const t = e.element;\n t && !e.target && !t.style.pointerEvents && (t.style.pointerEvents = \"auto\"), this.element = t || null, this.target_ = null, this.map_ = null, this.listenerKeys = [], e.render && (this.render = e.render), e.target && this.setTarget(e.target);\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n Mu(this.element), super.disposeInternal();\n }\n /**\n * Get the map associated with this control.\n * @return {import(\"../Map.js\").default|null} Map.\n * @api\n */\n getMap() {\n return this.map_;\n }\n /**\n * Remove the control from its current map and attach it to the new map.\n * Pass `null` to just remove the control from the current map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default|null} map Map.\n * @api\n */\n setMap(e) {\n this.map_ && Mu(this.element);\n for (let t = 0, i = this.listenerKeys.length; t < i; ++t)\n Ei(this.listenerKeys[t]);\n this.listenerKeys.length = 0, this.map_ = e, e && ((this.target_ ? this.target_ : e.getOverlayContainerStopEvent()).appendChild(this.element), this.render !== fc && this.listenerKeys.push(\n Ht(e, $s.POSTRENDER, this.render, this)\n ), e.render());\n }\n /**\n * Renders the control.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @api\n */\n render(e) {\n }\n /**\n * This function is used to set a target element for the control. It has no\n * effect if it is called after the control has been added to the map (i.e.\n * after `setMap` is called on the control). If no `target` is set in the\n * options passed to the control constructor and if `setTarget` is not called\n * then the control is added to the map's overlay container.\n * @param {HTMLElement|string} target Target.\n * @api\n */\n setTarget(e) {\n this.target_ = typeof e == \"string\" ? document.getElementById(e) : e;\n }\n}\nclass DU extends ld {\n /**\n * @param {Options} [options] Attribution options.\n */\n constructor(e) {\n e = e || {}, super({\n element: document.createElement(\"div\"),\n render: e.render,\n target: e.target\n }), this.ulElement_ = document.createElement(\"ul\"), this.collapsed_ = e.collapsed !== void 0 ? e.collapsed : !0, this.userCollapsed_ = this.collapsed_, this.overrideCollapsible_ = e.collapsible !== void 0, this.collapsible_ = e.collapsible !== void 0 ? e.collapsible : !0, this.collapsible_ || (this.collapsed_ = !1);\n const t = e.className !== void 0 ? e.className : \"ol-attribution\", i = e.tipLabel !== void 0 ? e.tipLabel : \"Attributions\", r = e.expandClassName !== void 0 ? e.expandClassName : t + \"-expand\", s = e.collapseLabel !== void 0 ? e.collapseLabel : \"›\", a = e.collapseClassName !== void 0 ? e.collapseClassName : t + \"-collapse\";\n typeof s == \"string\" ? (this.collapseLabel_ = document.createElement(\"span\"), this.collapseLabel_.textContent = s, this.collapseLabel_.className = a) : this.collapseLabel_ = s;\n const o = e.label !== void 0 ? e.label : \"i\";\n typeof o == \"string\" ? (this.label_ = document.createElement(\"span\"), this.label_.textContent = o, this.label_.className = r) : this.label_ = o;\n const l = this.collapsible_ && !this.collapsed_ ? this.collapseLabel_ : this.label_;\n this.toggleButton_ = document.createElement(\"button\"), this.toggleButton_.setAttribute(\"type\", \"button\"), this.toggleButton_.setAttribute(\"aria-expanded\", String(!this.collapsed_)), this.toggleButton_.title = i, this.toggleButton_.appendChild(l), this.toggleButton_.addEventListener(\n St.CLICK,\n this.handleClick_.bind(this),\n !1\n );\n const c = t + \" \" + rh + \" \" + ad + (this.collapsed_ && this.collapsible_ ? \" \" + Dm : \"\") + (this.collapsible_ ? \"\" : \" ol-uncollapsible\"), h = this.element;\n h.className = c, h.appendChild(this.toggleButton_), h.appendChild(this.ulElement_), this.renderedAttributions_ = [], this.renderedVisible_ = !0;\n }\n /**\n * Collect a list of visible attributions and set the collapsible state.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @return {Array} Attributions.\n * @private\n */\n collectSourceAttributions_(e) {\n const t = Array.from(\n new Set(\n this.getMap().getAllLayers().flatMap((r) => r.getAttributions(e))\n )\n ), i = !this.getMap().getAllLayers().some(\n (r) => r.getSource() && r.getSource().getAttributionsCollapsible() === !1\n );\n return this.overrideCollapsible_ || this.setCollapsible(i), t;\n }\n /**\n * @private\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n */\n updateElement_(e) {\n if (!e) {\n this.renderedVisible_ && (this.element.style.display = \"none\", this.renderedVisible_ = !1);\n return;\n }\n const t = this.collectSourceAttributions_(e), i = t.length > 0;\n if (this.renderedVisible_ != i && (this.element.style.display = i ? \"\" : \"none\", this.renderedVisible_ = i), !Qc(t, this.renderedAttributions_)) {\n SU(this.ulElement_);\n for (let r = 0, s = t.length; r < s; ++r) {\n const a = document.createElement(\"li\");\n a.innerHTML = t[r], this.ulElement_.appendChild(a);\n }\n this.renderedAttributions_ = t;\n }\n }\n /**\n * @param {MouseEvent} event The event to handle\n * @private\n */\n handleClick_(e) {\n e.preventDefault(), this.handleToggle_(), this.userCollapsed_ = this.collapsed_;\n }\n /**\n * @private\n */\n handleToggle_() {\n this.element.classList.toggle(Dm), this.collapsed_ ? Nm(this.collapseLabel_, this.label_) : Nm(this.label_, this.collapseLabel_), this.collapsed_ = !this.collapsed_, this.toggleButton_.setAttribute(\"aria-expanded\", String(!this.collapsed_));\n }\n /**\n * Return `true` if the attribution is collapsible, `false` otherwise.\n * @return {boolean} True if the widget is collapsible.\n * @api\n */\n getCollapsible() {\n return this.collapsible_;\n }\n /**\n * Set whether the attribution should be collapsible.\n * @param {boolean} collapsible True if the widget is collapsible.\n * @api\n */\n setCollapsible(e) {\n this.collapsible_ !== e && (this.collapsible_ = e, this.element.classList.toggle(\"ol-uncollapsible\"), this.userCollapsed_ && this.handleToggle_());\n }\n /**\n * Collapse or expand the attribution according to the passed parameter. Will\n * not do anything if the attribution isn't collapsible or if the current\n * collapsed state is already the one requested.\n * @param {boolean} collapsed True if the widget is collapsed.\n * @api\n */\n setCollapsed(e) {\n this.userCollapsed_ = e, !(!this.collapsible_ || this.collapsed_ === e) && this.handleToggle_();\n }\n /**\n * Return `true` when the attribution is currently collapsed or `false`\n * otherwise.\n * @return {boolean} True if the widget is collapsed.\n * @api\n */\n getCollapsed() {\n return this.collapsed_;\n }\n /**\n * Update the attribution element.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @override\n */\n render(e) {\n this.updateElement_(e.frameState);\n }\n}\nconst NU = DU;\nclass FU extends ld {\n /**\n * @param {Options} [options] Rotate options.\n */\n constructor(e) {\n e = e || {}, super({\n element: document.createElement(\"div\"),\n render: e.render,\n target: e.target\n });\n const t = e.className !== void 0 ? e.className : \"ol-rotate\", i = e.label !== void 0 ? e.label : \"⇧\", r = e.compassClassName !== void 0 ? e.compassClassName : \"ol-compass\";\n this.label_ = null, typeof i == \"string\" ? (this.label_ = document.createElement(\"span\"), this.label_.className = r, this.label_.textContent = i) : (this.label_ = i, this.label_.classList.add(r));\n const s = e.tipLabel ? e.tipLabel : \"Reset rotation\", a = document.createElement(\"button\");\n a.className = t + \"-reset\", a.setAttribute(\"type\", \"button\"), a.title = s, a.appendChild(this.label_), a.addEventListener(\n St.CLICK,\n this.handleClick_.bind(this),\n !1\n );\n const o = t + \" \" + rh + \" \" + ad, l = this.element;\n l.className = o, l.appendChild(a), this.callResetNorth_ = e.resetNorth ? e.resetNorth : void 0, this.duration_ = e.duration !== void 0 ? e.duration : 250, this.autoHide_ = e.autoHide !== void 0 ? e.autoHide : !0, this.rotation_ = void 0, this.autoHide_ && this.element.classList.add(Sl);\n }\n /**\n * @param {MouseEvent} event The event to handle\n * @private\n */\n handleClick_(e) {\n e.preventDefault(), this.callResetNorth_ !== void 0 ? this.callResetNorth_() : this.resetNorth_();\n }\n /**\n * @private\n */\n resetNorth_() {\n const t = this.getMap().getView();\n if (!t)\n return;\n const i = t.getRotation();\n i !== void 0 && (this.duration_ > 0 && i % (2 * Math.PI) !== 0 ? t.animate({\n rotation: 0,\n duration: this.duration_,\n easing: Ka\n }) : t.setRotation(0));\n }\n /**\n * Update the rotate control element.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @override\n */\n render(e) {\n const t = e.frameState;\n if (!t)\n return;\n const i = t.viewState.rotation;\n if (i != this.rotation_) {\n const r = \"rotate(\" + i + \"rad)\";\n if (this.autoHide_) {\n const s = this.element.classList.contains(Sl);\n !s && i === 0 ? this.element.classList.add(Sl) : s && i !== 0 && this.element.classList.remove(Sl);\n }\n this.label_.style.transform = r;\n }\n this.rotation_ = i;\n }\n}\nconst LU = FU;\nclass wU extends ld {\n /**\n * @param {Options} [options] Zoom options.\n */\n constructor(e) {\n e = e || {}, super({\n element: document.createElement(\"div\"),\n target: e.target\n });\n const t = e.className !== void 0 ? e.className : \"ol-zoom\", i = e.delta !== void 0 ? e.delta : 1, r = e.zoomInClassName !== void 0 ? e.zoomInClassName : t + \"-in\", s = e.zoomOutClassName !== void 0 ? e.zoomOutClassName : t + \"-out\", a = e.zoomInLabel !== void 0 ? e.zoomInLabel : \"+\", o = e.zoomOutLabel !== void 0 ? e.zoomOutLabel : \"–\", l = e.zoomInTipLabel !== void 0 ? e.zoomInTipLabel : \"Zoom in\", c = e.zoomOutTipLabel !== void 0 ? e.zoomOutTipLabel : \"Zoom out\", h = document.createElement(\"button\");\n h.className = r, h.setAttribute(\"type\", \"button\"), h.title = l, h.appendChild(\n typeof a == \"string\" ? document.createTextNode(a) : a\n ), h.addEventListener(\n St.CLICK,\n this.handleClick_.bind(this, i),\n !1\n );\n const u = document.createElement(\"button\");\n u.className = s, u.setAttribute(\"type\", \"button\"), u.title = c, u.appendChild(\n typeof o == \"string\" ? document.createTextNode(o) : o\n ), u.addEventListener(\n St.CLICK,\n this.handleClick_.bind(this, -i),\n !1\n );\n const f = t + \" \" + rh + \" \" + ad, d = this.element;\n d.className = f, d.appendChild(h), d.appendChild(u), this.duration_ = e.duration !== void 0 ? e.duration : 250;\n }\n /**\n * @param {number} delta Zoom delta.\n * @param {MouseEvent} event The event to handle\n * @private\n */\n handleClick_(e, t) {\n t.preventDefault(), this.zoomByDelta_(e);\n }\n /**\n * @param {number} delta Zoom delta.\n * @private\n */\n zoomByDelta_(e) {\n const i = this.getMap().getView();\n if (!i)\n return;\n const r = i.getZoom();\n if (r !== void 0) {\n const s = i.getConstrainedZoom(r + e);\n this.duration_ > 0 ? (i.getAnimating() && i.cancelAnimations(), i.animate({\n zoom: s,\n duration: this.duration_,\n easing: Ka\n })) : i.setZoom(s);\n }\n }\n}\nconst UU = wU;\nfunction VU(n) {\n n = n || {};\n const e = new Us();\n return (n.zoom !== void 0 ? n.zoom : !0) && e.push(new UU(n.zoomOptions)), (n.rotate !== void 0 ? n.rotate : !0) && e.push(new LU(n.rotateOptions)), (n.attribution !== void 0 ? n.attribution : !0) && e.push(new NU(n.attributionOptions)), e;\n}\nconst Fm = {\n ACTIVE: \"active\"\n};\nclass tl extends Ws {\n /**\n * @param {InteractionOptions} [options] Options.\n */\n constructor(e) {\n super(), this.on, this.once, this.un, e && e.handleEvent && (this.handleEvent = e.handleEvent), this.map_ = null, this.setActive(!0);\n }\n /**\n * Return whether the interaction is currently active.\n * @return {boolean} `true` if the interaction is active, `false` otherwise.\n * @observable\n * @api\n */\n getActive() {\n return (\n /** @type {boolean} */\n this.get(Fm.ACTIVE)\n );\n }\n /**\n * Get the map associated with this interaction.\n * @return {import(\"../Map.js\").default|null} Map.\n * @api\n */\n getMap() {\n return this.map_;\n }\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event}.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @api\n */\n handleEvent(e) {\n return !0;\n }\n /**\n * Activate or deactivate the interaction.\n * @param {boolean} active Active.\n * @observable\n * @api\n */\n setActive(e) {\n this.set(Fm.ACTIVE, e);\n }\n /**\n * Remove the interaction from its current map and attach it to the new map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default|null} map Map.\n */\n setMap(e) {\n this.map_ = e;\n }\n}\nfunction BU(n, e, t) {\n const i = n.getCenterInternal();\n if (i) {\n const r = [i[0] + e[0], i[1] + e[1]];\n n.animateInternal({\n duration: t !== void 0 ? t : 250,\n easing: Yw,\n center: n.getConstrainedCenter(r)\n });\n }\n}\nfunction cd(n, e, t, i) {\n const r = n.getZoom();\n if (r === void 0)\n return;\n const s = n.getConstrainedZoom(r + e), a = n.getResolutionForZoom(s);\n n.getAnimating() && n.cancelAnimations(), n.animate({\n resolution: a,\n anchor: t,\n duration: i !== void 0 ? i : 250,\n easing: Ka\n });\n}\nclass kU extends tl {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n super(), e = e || {}, this.delta_ = e.delta ? e.delta : 1, this.duration_ = e.duration !== void 0 ? e.duration : 250;\n }\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} (if it was a\n * doubleclick) and eventually zooms the map.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n handleEvent(e) {\n let t = !1;\n if (e.type == ui.DBLCLICK) {\n const i = (\n /** @type {MouseEvent} */\n e.originalEvent\n ), r = e.map, s = e.coordinate, a = i.shiftKey ? -this.delta_ : this.delta_, o = r.getView();\n cd(o, a, s, this.duration_), i.preventDefault(), t = !0;\n }\n return !t;\n }\n}\nconst zU = kU;\nclass il extends tl {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n e = e || {}, super(\n /** @type {import(\"./Interaction.js\").InteractionOptions} */\n e\n ), e.handleDownEvent && (this.handleDownEvent = e.handleDownEvent), e.handleDragEvent && (this.handleDragEvent = e.handleDragEvent), e.handleMoveEvent && (this.handleMoveEvent = e.handleMoveEvent), e.handleUpEvent && (this.handleUpEvent = e.handleUpEvent), e.stopDown && (this.stopDown = e.stopDown), this.handlingDownUpSequence = !1, this.targetPointers = [];\n }\n /**\n * Returns the current number of pointers involved in the interaction,\n * e.g. `2` when two fingers are used.\n * @return {number} The number of pointers.\n * @api\n */\n getPointerCount() {\n return this.targetPointers.length;\n }\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @protected\n */\n handleDownEvent(e) {\n return !1;\n }\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @protected\n */\n handleDragEvent(e) {\n }\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} and may call into\n * other functions, if event sequences like e.g. 'drag' or 'down-up' etc. are\n * detected.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @api\n */\n handleEvent(e) {\n if (!e.originalEvent)\n return !0;\n let t = !1;\n if (this.updateTrackedPointers_(e), this.handlingDownUpSequence) {\n if (e.type == ui.POINTERDRAG)\n this.handleDragEvent(e), e.originalEvent.preventDefault();\n else if (e.type == ui.POINTERUP) {\n const i = this.handleUpEvent(e);\n this.handlingDownUpSequence = i && this.targetPointers.length > 0;\n }\n } else if (e.type == ui.POINTERDOWN) {\n const i = this.handleDownEvent(e);\n this.handlingDownUpSequence = i, t = this.stopDown(i);\n } else\n e.type == ui.POINTERMOVE && this.handleMoveEvent(e);\n return !t;\n }\n /**\n * Handle pointer move events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @protected\n */\n handleMoveEvent(e) {\n }\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @protected\n */\n handleUpEvent(e) {\n return !1;\n }\n /**\n * This function is used to determine if \"down\" events should be propagated\n * to other interactions or should be stopped.\n * @param {boolean} handled Was the event handled by the interaction?\n * @return {boolean} Should the `down` event be stopped?\n */\n stopDown(e) {\n return e;\n }\n /**\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @private\n */\n updateTrackedPointers_(e) {\n e.activePointers && (this.targetPointers = e.activePointers);\n }\n}\nfunction hd(n) {\n const e = n.length;\n let t = 0, i = 0;\n for (let r = 0; r < e; r++)\n t += n[r].clientX, i += n[r].clientY;\n return { clientX: t / e, clientY: i / e };\n}\nfunction Ou(n) {\n const e = arguments;\n return function(t) {\n let i = !0;\n for (let r = 0, s = e.length; r < s && (i = i && e[r](t), !!i); ++r)\n ;\n return i;\n };\n}\nconst WU = function(n) {\n const e = (\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n n.originalEvent\n );\n return e.altKey && !(e.metaKey || e.ctrlKey) && e.shiftKey;\n}, GU = function(n) {\n const e = n.map.getTargetElement(), t = n.map.getOwnerDocument().activeElement;\n return e.contains(t);\n}, YE = function(n) {\n return n.map.getTargetElement().hasAttribute(\"tabindex\") ? GU(n) : !0;\n}, XU = uc, ZE = function(n) {\n const e = (\n /** @type {MouseEvent} */\n n.originalEvent\n );\n return e.button == 0 && !(K2 && xE && e.ctrlKey);\n}, jE = function(n) {\n const e = (\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n n.originalEvent\n );\n return !e.altKey && !(e.metaKey || e.ctrlKey) && !e.shiftKey;\n}, HU = function(n) {\n const e = (\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n n.originalEvent\n );\n return xE ? e.metaKey : e.ctrlKey;\n}, KU = function(n) {\n const e = (\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n n.originalEvent\n );\n return !e.altKey && !(e.metaKey || e.ctrlKey) && e.shiftKey;\n}, QE = function(n) {\n const e = (\n /** @type {KeyboardEvent|MouseEvent|TouchEvent} */\n n.originalEvent\n ), t = (\n /** @type {Element} */\n e.target.tagName\n );\n return t !== \"INPUT\" && t !== \"SELECT\" && t !== \"TEXTAREA\" && // `isContentEditable` is only available on `HTMLElement`, but it may also be a\n // different type like `SVGElement`.\n // @ts-ignore\n !e.target.isContentEditable;\n}, tu = function(n) {\n const e = (\n /** @type {import(\"../MapBrowserEvent\").default} */\n n.originalEvent\n );\n return Kt(e !== void 0, 56), e.pointerType == \"mouse\";\n}, qU = function(n) {\n const e = (\n /** @type {import(\"../MapBrowserEvent\").default} */\n n.originalEvent\n );\n return Kt(e !== void 0, 56), e.isPrimary && e.button === 0;\n};\nclass YU extends il {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n super({\n stopDown: Jc\n }), e = e || {}, this.kinetic_ = e.kinetic, this.lastCentroid = null, this.lastPointersCount_, this.panning_ = !1;\n const t = e.condition ? e.condition : Ou(jE, qU);\n this.condition_ = e.onFocusOnly ? Ou(YE, t) : t, this.noKinetic_ = !1;\n }\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(e) {\n const t = e.map;\n this.panning_ || (this.panning_ = !0, t.getView().beginInteraction());\n const i = this.targetPointers, r = t.getEventPixel(hd(i));\n if (i.length == this.lastPointersCount_) {\n if (this.kinetic_ && this.kinetic_.update(r[0], r[1]), this.lastCentroid) {\n const s = [\n this.lastCentroid[0] - r[0],\n r[1] - this.lastCentroid[1]\n ], o = e.map.getView();\n Mw(s, o.getResolution()), Yf(s, o.getRotation()), o.adjustCenterInternal(s);\n }\n } else\n this.kinetic_ && this.kinetic_.begin();\n this.lastCentroid = r, this.lastPointersCount_ = i.length, e.originalEvent.preventDefault();\n }\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(e) {\n const t = e.map, i = t.getView();\n if (this.targetPointers.length === 0) {\n if (!this.noKinetic_ && this.kinetic_ && this.kinetic_.end()) {\n const r = this.kinetic_.getDistance(), s = this.kinetic_.getAngle(), a = i.getCenterInternal(), o = t.getPixelFromCoordinateInternal(a), l = t.getCoordinateFromPixelInternal([\n o[0] - r * Math.cos(s),\n o[1] - r * Math.sin(s)\n ]);\n i.animateInternal({\n center: i.getConstrainedCenter(l),\n duration: 500,\n easing: Ka\n });\n }\n return this.panning_ && (this.panning_ = !1, i.endInteraction()), !1;\n }\n return this.kinetic_ && this.kinetic_.begin(), this.lastCentroid = null, !0;\n }\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(e) {\n if (this.targetPointers.length > 0 && this.condition_(e)) {\n const i = e.map.getView();\n return this.lastCentroid = null, i.getAnimating() && i.cancelAnimations(), this.kinetic_ && this.kinetic_.begin(), this.noKinetic_ = this.targetPointers.length > 1, !0;\n }\n return !1;\n }\n}\nconst ZU = YU;\nclass jU extends il {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n e = e || {}, super({\n stopDown: Jc\n }), this.condition_ = e.condition ? e.condition : WU, this.lastAngle_ = void 0, this.duration_ = e.duration !== void 0 ? e.duration : 250;\n }\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(e) {\n if (!tu(e))\n return;\n const t = e.map, i = t.getView();\n if (i.getConstraints().rotation === td)\n return;\n const r = t.getSize(), s = e.pixel, a = Math.atan2(r[1] / 2 - s[1], s[0] - r[0] / 2);\n if (this.lastAngle_ !== void 0) {\n const o = a - this.lastAngle_;\n i.adjustRotationInternal(-o);\n }\n this.lastAngle_ = a;\n }\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(e) {\n return tu(e) ? (e.map.getView().endInteraction(this.duration_), !1) : !0;\n }\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(e) {\n return tu(e) && ZE(e) && this.condition_(e) ? (e.map.getView().beginInteraction(), this.lastAngle_ = void 0, !0) : !1;\n }\n}\nclass QU extends Wf {\n /**\n * @param {string} className CSS class name.\n */\n constructor(e) {\n super(), this.geometry_ = null, this.element_ = document.createElement(\"div\"), this.element_.style.position = \"absolute\", this.element_.style.pointerEvents = \"auto\", this.element_.className = \"ol-box \" + e, this.map_ = null, this.startPixel_ = null, this.endPixel_ = null;\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n this.setMap(null);\n }\n /**\n * @private\n */\n render_() {\n const e = this.startPixel_, t = this.endPixel_, i = \"px\", r = this.element_.style;\n r.left = Math.min(e[0], t[0]) + i, r.top = Math.min(e[1], t[1]) + i, r.width = Math.abs(t[0] - e[0]) + i, r.height = Math.abs(t[1] - e[1]) + i;\n }\n /**\n * @param {import(\"../Map.js\").default|null} map Map.\n */\n setMap(e) {\n if (this.map_) {\n this.map_.getOverlayContainer().removeChild(this.element_);\n const t = this.element_.style;\n t.left = \"inherit\", t.top = \"inherit\", t.width = \"inherit\", t.height = \"inherit\";\n }\n this.map_ = e, this.map_ && this.map_.getOverlayContainer().appendChild(this.element_);\n }\n /**\n * @param {import(\"../pixel.js\").Pixel} startPixel Start pixel.\n * @param {import(\"../pixel.js\").Pixel} endPixel End pixel.\n */\n setPixels(e, t) {\n this.startPixel_ = e, this.endPixel_ = t, this.createOrUpdateGeometry(), this.render_();\n }\n /**\n * Creates or updates the cached geometry.\n */\n createOrUpdateGeometry() {\n const e = this.startPixel_, t = this.endPixel_, r = [\n e,\n [e[0], t[1]],\n t,\n [t[0], e[1]]\n ].map(\n this.map_.getCoordinateFromPixelInternal,\n this.map_\n );\n r[4] = r[0].slice(), this.geometry_ ? this.geometry_.setCoordinates([r]) : this.geometry_ = new No([r]);\n }\n /**\n * @return {import(\"../geom/Polygon.js\").default} Geometry.\n */\n getGeometry() {\n return this.geometry_;\n }\n}\nconst yl = {\n /**\n * Triggered upon drag box start.\n * @event DragBoxEvent#boxstart\n * @api\n */\n BOXSTART: \"boxstart\",\n /**\n * Triggered on drag when box is active.\n * @event DragBoxEvent#boxdrag\n * @api\n */\n BOXDRAG: \"boxdrag\",\n /**\n * Triggered upon drag box end.\n * @event DragBoxEvent#boxend\n * @api\n */\n BOXEND: \"boxend\",\n /**\n * Triggered upon drag box canceled.\n * @event DragBoxEvent#boxcancel\n * @api\n */\n BOXCANCEL: \"boxcancel\"\n};\nclass iu extends pn {\n /**\n * @param {string} type The event type.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate The event coordinate.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Originating event.\n */\n constructor(e, t, i) {\n super(e), this.coordinate = t, this.mapBrowserEvent = i;\n }\n}\nclass JU extends il {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n super(), this.on, this.once, this.un, e = e || {}, this.box_ = new QU(e.className || \"ol-dragbox\"), this.minArea_ = e.minArea !== void 0 ? e.minArea : 64, e.onBoxEnd && (this.onBoxEnd = e.onBoxEnd), this.startPixel_ = null, this.condition_ = e.condition ? e.condition : ZE, this.boxEndCondition_ = e.boxEndCondition ? e.boxEndCondition : this.defaultBoxEndCondition;\n }\n /**\n * The default condition for determining whether the boxend event\n * should fire.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent The originating MapBrowserEvent\n * leading to the box end.\n * @param {import(\"../pixel.js\").Pixel} startPixel The starting pixel of the box.\n * @param {import(\"../pixel.js\").Pixel} endPixel The end pixel of the box.\n * @return {boolean} Whether or not the boxend condition should be fired.\n */\n defaultBoxEndCondition(e, t, i) {\n const r = i[0] - t[0], s = i[1] - t[1];\n return r * r + s * s >= this.minArea_;\n }\n /**\n * Returns geometry of last drawn box.\n * @return {import(\"../geom/Polygon.js\").default} Geometry.\n * @api\n */\n getGeometry() {\n return this.box_.getGeometry();\n }\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(e) {\n this.box_.setPixels(this.startPixel_, e.pixel), this.dispatchEvent(\n new iu(\n yl.BOXDRAG,\n e.coordinate,\n e\n )\n );\n }\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(e) {\n this.box_.setMap(null);\n const t = this.boxEndCondition_(\n e,\n this.startPixel_,\n e.pixel\n );\n return t && this.onBoxEnd(e), this.dispatchEvent(\n new iu(\n t ? yl.BOXEND : yl.BOXCANCEL,\n e.coordinate,\n e\n )\n ), !1;\n }\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(e) {\n return this.condition_(e) ? (this.startPixel_ = e.pixel, this.box_.setMap(e.map), this.box_.setPixels(this.startPixel_, this.startPixel_), this.dispatchEvent(\n new iu(\n yl.BOXSTART,\n e.coordinate,\n e\n )\n ), !0) : !1;\n }\n /**\n * Function to execute just before `onboxend` is fired\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n */\n onBoxEnd(e) {\n }\n}\nclass $U extends JU {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n e = e || {};\n const t = e.condition ? e.condition : KU;\n super({\n condition: t,\n className: e.className || \"ol-dragzoom\",\n minArea: e.minArea\n }), this.duration_ = e.duration !== void 0 ? e.duration : 200, this.out_ = e.out !== void 0 ? e.out : !1;\n }\n /**\n * Function to execute just before `onboxend` is fired\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n */\n onBoxEnd(e) {\n const i = (\n /** @type {!import(\"../View.js\").default} */\n this.getMap().getView()\n );\n let r = this.getGeometry();\n if (this.out_) {\n const s = i.rotatedExtentForGeometry(r), a = i.getResolutionForExtentInternal(s), o = i.getResolution() / a;\n r = r.clone(), r.scale(o * o);\n }\n i.fitInternal(r, {\n duration: this.duration_,\n easing: Ka\n });\n }\n}\nconst e3 = $U, xn = {\n LEFT: \"ArrowLeft\",\n UP: \"ArrowUp\",\n RIGHT: \"ArrowRight\",\n DOWN: \"ArrowDown\"\n};\nclass t3 extends tl {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n super(), e = e || {}, this.defaultCondition_ = function(t) {\n return jE(t) && QE(t);\n }, this.condition_ = e.condition !== void 0 ? e.condition : this.defaultCondition_, this.duration_ = e.duration !== void 0 ? e.duration : 100, this.pixelDelta_ = e.pixelDelta !== void 0 ? e.pixelDelta : 128;\n }\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} if it was a\n * `KeyEvent`, and decides the direction to pan to (if an arrow key was\n * pressed).\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n handleEvent(e) {\n let t = !1;\n if (e.type == St.KEYDOWN) {\n const i = (\n /** @type {KeyboardEvent} */\n e.originalEvent\n ), r = i.key;\n if (this.condition_(e) && (r == xn.DOWN || r == xn.LEFT || r == xn.RIGHT || r == xn.UP)) {\n const a = e.map.getView(), o = a.getResolution() * this.pixelDelta_;\n let l = 0, c = 0;\n r == xn.DOWN ? c = -o : r == xn.LEFT ? l = -o : r == xn.RIGHT ? l = o : c = o;\n const h = [l, c];\n Yf(h, a.getRotation()), BU(a, h, this.duration_), i.preventDefault(), t = !0;\n }\n }\n return !t;\n }\n}\nclass i3 extends tl {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n super(), e = e || {}, this.condition_ = e.condition ? e.condition : function(t) {\n return !HU(t) && QE(t);\n }, this.delta_ = e.delta ? e.delta : 1, this.duration_ = e.duration !== void 0 ? e.duration : 100;\n }\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} if it was a\n * `KeyEvent`, and decides whether to zoom in or out (depending on whether the\n * key pressed was '+' or '-').\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n handleEvent(e) {\n let t = !1;\n if (e.type == St.KEYDOWN || e.type == St.KEYPRESS) {\n const i = (\n /** @type {KeyboardEvent} */\n e.originalEvent\n ), r = i.key;\n if (this.condition_(e) && (r === \"+\" || r === \"-\")) {\n const s = e.map, a = r === \"+\" ? this.delta_ : -this.delta_, o = s.getView();\n cd(o, a, void 0, this.duration_), i.preventDefault(), t = !0;\n }\n }\n return !t;\n }\n}\nconst r3 = i3;\nclass s3 {\n /**\n * @param {number} decay Rate of decay (must be negative).\n * @param {number} minVelocity Minimum velocity (pixels/millisecond).\n * @param {number} delay Delay to consider to calculate the kinetic\n * initial values (milliseconds).\n */\n constructor(e, t, i) {\n this.decay_ = e, this.minVelocity_ = t, this.delay_ = i, this.points_ = [], this.angle_ = 0, this.initialVelocity_ = 0;\n }\n /**\n * FIXME empty description for jsdoc\n */\n begin() {\n this.points_.length = 0, this.angle_ = 0, this.initialVelocity_ = 0;\n }\n /**\n * @param {number} x X.\n * @param {number} y Y.\n */\n update(e, t) {\n this.points_.push(e, t, Date.now());\n }\n /**\n * @return {boolean} Whether we should do kinetic animation.\n */\n end() {\n if (this.points_.length < 6)\n return !1;\n const e = Date.now() - this.delay_, t = this.points_.length - 3;\n if (this.points_[t + 2] < e)\n return !1;\n let i = t - 3;\n for (; i > 0 && this.points_[i + 2] > e; )\n i -= 3;\n const r = this.points_[t + 2] - this.points_[i + 2];\n if (r < 1e3 / 60)\n return !1;\n const s = this.points_[t] - this.points_[i], a = this.points_[t + 1] - this.points_[i + 1];\n return this.angle_ = Math.atan2(a, s), this.initialVelocity_ = Math.sqrt(s * s + a * a) / r, this.initialVelocity_ > this.minVelocity_;\n }\n /**\n * @return {number} Total distance travelled (pixels).\n */\n getDistance() {\n return (this.minVelocity_ - this.initialVelocity_) / this.decay_;\n }\n /**\n * @return {number} Angle of the kinetic panning animation (radians).\n */\n getAngle() {\n return this.angle_;\n }\n}\nclass n3 extends tl {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n e = e || {}, super(\n /** @type {import(\"./Interaction.js\").InteractionOptions} */\n e\n ), this.totalDelta_ = 0, this.lastDelta_ = 0, this.maxDelta_ = e.maxDelta !== void 0 ? e.maxDelta : 1, this.duration_ = e.duration !== void 0 ? e.duration : 250, this.timeout_ = e.timeout !== void 0 ? e.timeout : 80, this.useAnchor_ = e.useAnchor !== void 0 ? e.useAnchor : !0, this.constrainResolution_ = e.constrainResolution !== void 0 ? e.constrainResolution : !1;\n const t = e.condition ? e.condition : XU;\n this.condition_ = e.onFocusOnly ? Ou(YE, t) : t, this.lastAnchor_ = null, this.startTime_ = void 0, this.timeoutId_, this.mode_ = void 0, this.trackpadEventGap_ = 400, this.trackpadTimeoutId_, this.deltaPerZoom_ = 300;\n }\n /**\n * @private\n */\n endInteraction_() {\n this.trackpadTimeoutId_ = void 0;\n const e = this.getMap();\n if (!e)\n return;\n e.getView().endInteraction(\n void 0,\n this.lastDelta_ ? this.lastDelta_ > 0 ? 1 : -1 : 0,\n this.lastAnchor_\n );\n }\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} (if it was a mousewheel-event) and eventually\n * zooms the map.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n handleEvent(e) {\n if (!this.condition_(e) || e.type !== St.WHEEL)\n return !0;\n const i = e.map, r = (\n /** @type {WheelEvent} */\n e.originalEvent\n );\n r.preventDefault(), this.useAnchor_ && (this.lastAnchor_ = e.coordinate);\n let s;\n if (e.type == St.WHEEL && (s = r.deltaY, X2 && r.deltaMode === WheelEvent.DOM_DELTA_PIXEL && (s /= CE), r.deltaMode === WheelEvent.DOM_DELTA_LINE && (s *= 40)), s === 0)\n return !1;\n this.lastDelta_ = s;\n const a = Date.now();\n this.startTime_ === void 0 && (this.startTime_ = a), (!this.mode_ || a - this.startTime_ > this.trackpadEventGap_) && (this.mode_ = Math.abs(s) < 4 ? \"trackpad\" : \"wheel\");\n const o = i.getView();\n if (this.mode_ === \"trackpad\" && !(o.getConstrainResolution() || this.constrainResolution_))\n return this.trackpadTimeoutId_ ? clearTimeout(this.trackpadTimeoutId_) : (o.getAnimating() && o.cancelAnimations(), o.beginInteraction()), this.trackpadTimeoutId_ = setTimeout(\n this.endInteraction_.bind(this),\n this.timeout_\n ), o.adjustZoom(-s / this.deltaPerZoom_, this.lastAnchor_), this.startTime_ = a, !1;\n this.totalDelta_ += s;\n const l = Math.max(this.timeout_ - (a - this.startTime_), 0);\n return clearTimeout(this.timeoutId_), this.timeoutId_ = setTimeout(\n this.handleWheelZoom_.bind(this, i),\n l\n ), !1;\n }\n /**\n * @private\n * @param {import(\"../Map.js\").default} map Map.\n */\n handleWheelZoom_(e) {\n const t = e.getView();\n t.getAnimating() && t.cancelAnimations();\n let i = -Vi(\n this.totalDelta_,\n -this.maxDelta_ * this.deltaPerZoom_,\n this.maxDelta_ * this.deltaPerZoom_\n ) / this.deltaPerZoom_;\n (t.getConstrainResolution() || this.constrainResolution_) && (i = i ? i > 0 ? 1 : -1 : 0), cd(t, i, this.lastAnchor_, this.duration_), this.mode_ = void 0, this.totalDelta_ = 0, this.lastAnchor_ = null, this.startTime_ = void 0, this.timeoutId_ = void 0;\n }\n /**\n * Enable or disable using the mouse's location as an anchor when zooming\n * @param {boolean} useAnchor true to zoom to the mouse's location, false\n * to zoom to the center of the map\n * @api\n */\n setMouseAnchor(e) {\n this.useAnchor_ = e, e || (this.lastAnchor_ = null);\n }\n}\nconst a3 = n3;\nclass o3 extends il {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n e = e || {};\n const t = (\n /** @type {import(\"./Pointer.js\").Options} */\n e\n );\n t.stopDown || (t.stopDown = Jc), super(t), this.anchor_ = null, this.lastAngle_ = void 0, this.rotating_ = !1, this.rotationDelta_ = 0, this.threshold_ = e.threshold !== void 0 ? e.threshold : 0.3, this.duration_ = e.duration !== void 0 ? e.duration : 250;\n }\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(e) {\n let t = 0;\n const i = this.targetPointers[0], r = this.targetPointers[1], s = Math.atan2(\n r.clientY - i.clientY,\n r.clientX - i.clientX\n );\n if (this.lastAngle_ !== void 0) {\n const l = s - this.lastAngle_;\n this.rotationDelta_ += l, !this.rotating_ && Math.abs(this.rotationDelta_) > this.threshold_ && (this.rotating_ = !0), t = l;\n }\n this.lastAngle_ = s;\n const a = e.map, o = a.getView();\n o.getConstraints().rotation !== td && (this.anchor_ = a.getCoordinateFromPixelInternal(\n a.getEventPixel(hd(this.targetPointers))\n ), this.rotating_ && (a.render(), o.adjustRotationInternal(t, this.anchor_)));\n }\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(e) {\n return this.targetPointers.length < 2 ? (e.map.getView().endInteraction(this.duration_), !1) : !0;\n }\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(e) {\n if (this.targetPointers.length >= 2) {\n const t = e.map;\n return this.anchor_ = null, this.lastAngle_ = void 0, this.rotating_ = !1, this.rotationDelta_ = 0, this.handlingDownUpSequence || t.getView().beginInteraction(), !0;\n }\n return !1;\n }\n}\nclass l3 extends il {\n /**\n * @param {Options} [options] Options.\n */\n constructor(e) {\n e = e || {};\n const t = (\n /** @type {import(\"./Pointer.js\").Options} */\n e\n );\n t.stopDown || (t.stopDown = Jc), super(t), this.anchor_ = null, this.duration_ = e.duration !== void 0 ? e.duration : 400, this.lastDistance_ = void 0, this.lastScaleDelta_ = 1;\n }\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(e) {\n let t = 1;\n const i = this.targetPointers[0], r = this.targetPointers[1], s = i.clientX - r.clientX, a = i.clientY - r.clientY, o = Math.sqrt(s * s + a * a);\n this.lastDistance_ !== void 0 && (t = this.lastDistance_ / o), this.lastDistance_ = o;\n const l = e.map, c = l.getView();\n t != 1 && (this.lastScaleDelta_ = t), this.anchor_ = l.getCoordinateFromPixelInternal(\n l.getEventPixel(hd(this.targetPointers))\n ), l.render(), c.adjustResolutionInternal(t, this.anchor_);\n }\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(e) {\n if (this.targetPointers.length < 2) {\n const i = e.map.getView(), r = this.lastScaleDelta_ > 1 ? 1 : -1;\n return i.endInteraction(this.duration_, r), !1;\n }\n return !0;\n }\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(e) {\n if (this.targetPointers.length >= 2) {\n const t = e.map;\n return this.anchor_ = null, this.lastDistance_ = void 0, this.lastScaleDelta_ = 1, this.handlingDownUpSequence || t.getView().beginInteraction(), !0;\n }\n return !1;\n }\n}\nconst c3 = l3;\nfunction h3(n) {\n n = n || {};\n const e = new Us(), t = new s3(-5e-3, 0.05, 100);\n return (n.altShiftDragRotate !== void 0 ? n.altShiftDragRotate : !0) && e.push(new jU()), (n.doubleClickZoom !== void 0 ? n.doubleClickZoom : !0) && e.push(\n new zU({\n delta: n.zoomDelta,\n duration: n.zoomDuration\n })\n ), (n.dragPan !== void 0 ? n.dragPan : !0) && e.push(\n new ZU({\n onFocusOnly: n.onFocusOnly,\n kinetic: t\n })\n ), (n.pinchRotate !== void 0 ? n.pinchRotate : !0) && e.push(new o3()), (n.pinchZoom !== void 0 ? n.pinchZoom : !0) && e.push(\n new c3({\n duration: n.zoomDuration\n })\n ), (n.keyboard !== void 0 ? n.keyboard : !0) && (e.push(new t3()), e.push(\n new r3({\n delta: n.zoomDelta,\n duration: n.zoomDuration\n })\n )), (n.mouseWheelZoom !== void 0 ? n.mouseWheelZoom : !0) && e.push(\n new a3({\n onFocusOnly: n.onFocusOnly,\n duration: n.zoomDuration\n })\n ), (n.shiftDragZoom !== void 0 ? n.shiftDragZoom : !0) && e.push(\n new e3({\n duration: n.zoomDuration\n })\n ), e;\n}\nfunction Lm(n) {\n return n[0] > 0 && n[1] > 0;\n}\nfunction u3(n, e, t) {\n return t === void 0 && (t = [0, 0]), t[0] = n[0] * e + 0.5 | 0, t[1] = n[1] * e + 0.5 | 0, t;\n}\nfunction sn(n, e) {\n return Array.isArray(n) ? n : (e === void 0 ? e = [n, n] : (e[0] = n, e[1] = n), e);\n}\nfunction JE(n) {\n if (n instanceof nd) {\n n.setMapInternal(null);\n return;\n }\n n instanceof qa && n.getLayers().forEach(JE);\n}\nfunction $E(n, e) {\n if (n instanceof nd) {\n n.setMapInternal(e);\n return;\n }\n if (n instanceof qa) {\n const t = n.getLayers().getArray();\n for (let i = 0, r = t.length; i < r; ++i)\n $E(t[i], e);\n }\n}\nlet ev = class extends Ws {\n /**\n * @param {MapOptions} [options] Map options.\n */\n constructor(e) {\n super(), e = e || {}, this.on, this.once, this.un;\n const t = f3(e);\n this.renderComplete_, this.loaded_ = !0, this.boundHandleBrowserEvent_ = this.handleBrowserEvent.bind(this), this.maxTilesLoading_ = e.maxTilesLoading !== void 0 ? e.maxTilesLoading : 16, this.pixelRatio_ = e.pixelRatio !== void 0 ? e.pixelRatio : CE, this.postRenderTimeoutHandle_, this.animationDelayKey_, this.animationDelay_ = this.animationDelay_.bind(this), this.coordinateToPixelTransform_ = xa(), this.pixelToCoordinateTransform_ = xa(), this.frameIndex_ = 0, this.frameState_ = null, this.previousExtent_ = null, this.viewPropertyListenerKey_ = null, this.viewChangeListenerKey_ = null, this.layerGroupPropertyListenerKeys_ = null, this.viewport_ = document.createElement(\"div\"), this.viewport_.className = \"ol-viewport\" + (\"ontouchstart\" in window ? \" ol-touch\" : \"\"), this.viewport_.style.position = \"relative\", this.viewport_.style.overflow = \"hidden\", this.viewport_.style.width = \"100%\", this.viewport_.style.height = \"100%\", this.overlayContainer_ = document.createElement(\"div\"), this.overlayContainer_.style.position = \"absolute\", this.overlayContainer_.style.zIndex = \"0\", this.overlayContainer_.style.width = \"100%\", this.overlayContainer_.style.height = \"100%\", this.overlayContainer_.style.pointerEvents = \"none\", this.overlayContainer_.className = \"ol-overlaycontainer\", this.viewport_.appendChild(this.overlayContainer_), this.overlayContainerStopEvent_ = document.createElement(\"div\"), this.overlayContainerStopEvent_.style.position = \"absolute\", this.overlayContainerStopEvent_.style.zIndex = \"0\", this.overlayContainerStopEvent_.style.width = \"100%\", this.overlayContainerStopEvent_.style.height = \"100%\", this.overlayContainerStopEvent_.style.pointerEvents = \"none\", this.overlayContainerStopEvent_.className = \"ol-overlaycontainer-stopevent\", this.viewport_.appendChild(this.overlayContainerStopEvent_), this.mapBrowserEventHandler_ = null, this.moveTolerance_ = e.moveTolerance, this.keyboardEventTarget_ = t.keyboardEventTarget, this.targetChangeHandlerKeys_ = null, this.targetElement_ = null, this.resizeObserver_ = new ResizeObserver(() => this.updateSize()), this.controls = t.controls || VU(), this.interactions = t.interactions || h3({\n onFocusOnly: !0\n }), this.overlays_ = t.overlays, this.overlayIdIndex_ = {}, this.renderer_ = null, this.postRenderFunctions_ = [], this.tileQueue_ = new PU(\n this.getTilePriority.bind(this),\n this.handleTileChange_.bind(this)\n ), this.addChangeListener(\n Ki.LAYERGROUP,\n this.handleLayerGroupChanged_\n ), this.addChangeListener(Ki.VIEW, this.handleViewChanged_), this.addChangeListener(Ki.SIZE, this.handleSizeChanged_), this.addChangeListener(Ki.TARGET, this.handleTargetChanged_), this.setProperties(t.values);\n const i = this;\n e.view && !(e.view instanceof Qr) && e.view.then(function(r) {\n i.setView(new Qr(r));\n }), this.controls.addEventListener(\n Dr.ADD,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent\n */\n (r) => {\n r.element.setMap(this);\n }\n ), this.controls.addEventListener(\n Dr.REMOVE,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (r) => {\n r.element.setMap(null);\n }\n ), this.interactions.addEventListener(\n Dr.ADD,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (r) => {\n r.element.setMap(this);\n }\n ), this.interactions.addEventListener(\n Dr.REMOVE,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (r) => {\n r.element.setMap(null);\n }\n ), this.overlays_.addEventListener(\n Dr.ADD,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (r) => {\n this.addOverlayInternal_(r.element);\n }\n ), this.overlays_.addEventListener(\n Dr.REMOVE,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (r) => {\n const s = r.element.getId();\n s !== void 0 && delete this.overlayIdIndex_[s.toString()], r.element.setMap(null);\n }\n ), this.controls.forEach(\n /**\n * @param {import(\"./control/Control.js\").default} control Control.\n */\n (r) => {\n r.setMap(this);\n }\n ), this.interactions.forEach(\n /**\n * @param {import(\"./interaction/Interaction.js\").default} interaction Interaction.\n */\n (r) => {\n r.setMap(this);\n }\n ), this.overlays_.forEach(this.addOverlayInternal_.bind(this));\n }\n /**\n * Add the given control to the map.\n * @param {import(\"./control/Control.js\").default} control Control.\n * @api\n */\n addControl(e) {\n this.getControls().push(e);\n }\n /**\n * Add the given interaction to the map. If you want to add an interaction\n * at another point of the collection use `getInteractions()` and the methods\n * available on {@link module:ol/Collection~Collection}. This can be used to\n * stop the event propagation from the handleEvent function. The interactions\n * get to handle the events in the reverse order of this collection.\n * @param {import(\"./interaction/Interaction.js\").default} interaction Interaction to add.\n * @api\n */\n addInteraction(e) {\n this.getInteractions().push(e);\n }\n /**\n * Adds the given layer to the top of this map. If you want to add a layer\n * elsewhere in the stack, use `getLayers()` and the methods available on\n * {@link module:ol/Collection~Collection}.\n * @param {import(\"./layer/Base.js\").default} layer Layer.\n * @api\n */\n addLayer(e) {\n this.getLayerGroup().getLayers().push(e);\n }\n /**\n * @param {import(\"./layer/Group.js\").GroupEvent} event The layer add event.\n * @private\n */\n handleLayerAdd_(e) {\n $E(e.layer, this);\n }\n /**\n * Add the given overlay to the map.\n * @param {import(\"./Overlay.js\").default} overlay Overlay.\n * @api\n */\n addOverlay(e) {\n this.getOverlays().push(e);\n }\n /**\n * This deals with map's overlay collection changes.\n * @param {import(\"./Overlay.js\").default} overlay Overlay.\n * @private\n */\n addOverlayInternal_(e) {\n const t = e.getId();\n t !== void 0 && (this.overlayIdIndex_[t.toString()] = e), e.setMap(this);\n }\n /**\n *\n * Clean up.\n */\n disposeInternal() {\n this.controls.clear(), this.interactions.clear(), this.overlays_.clear(), this.resizeObserver_.disconnect(), this.setTarget(null), super.disposeInternal();\n }\n /**\n * Detect features that intersect a pixel on the viewport, and execute a\n * callback with each intersecting feature. Layers included in the detection can\n * be configured through the `layerFilter` option in `options`.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel.\n * @param {function(import(\"./Feature.js\").FeatureLike, import(\"./layer/Layer.js\").default, import(\"./geom/SimpleGeometry.js\").default): T} callback Feature callback. The callback will be\n * called with two arguments. The first argument is one\n * {@link module:ol/Feature~Feature feature} or\n * {@link module:ol/render/Feature~RenderFeature render feature} at the pixel, the second is\n * the {@link module:ol/layer/Layer~Layer layer} of the feature and will be null for\n * unmanaged layers. To stop detection, callback functions can return a\n * truthy value.\n * @param {AtPixelOptions} [options] Optional options.\n * @return {T|undefined} Callback result, i.e. the return value of last\n * callback execution, or the first truthy callback return value.\n * @template T\n * @api\n */\n forEachFeatureAtPixel(e, t, i) {\n if (!this.frameState_ || !this.renderer_)\n return;\n const r = this.getCoordinateFromPixelInternal(e);\n i = i !== void 0 ? i : {};\n const s = i.hitTolerance !== void 0 ? i.hitTolerance : 0, a = i.layerFilter !== void 0 ? i.layerFilter : uc, o = i.checkWrapped !== !1;\n return this.renderer_.forEachFeatureAtCoordinate(\n r,\n this.frameState_,\n s,\n o,\n t,\n null,\n a,\n null\n );\n }\n /**\n * Get all features that intersect a pixel on the viewport.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel.\n * @param {AtPixelOptions} [options] Optional options.\n * @return {Array} The detected features or\n * an empty array if none were found.\n * @api\n */\n getFeaturesAtPixel(e, t) {\n const i = [];\n return this.forEachFeatureAtPixel(\n e,\n function(r) {\n i.push(r);\n },\n t\n ), i;\n }\n /**\n * Get all layers from all layer groups.\n * @return {Array} Layers.\n * @api\n */\n getAllLayers() {\n const e = [];\n function t(i) {\n i.forEach(function(r) {\n r instanceof qa ? t(r.getLayers()) : e.push(r);\n });\n }\n return t(this.getLayers()), e;\n }\n /**\n * Detect if features intersect a pixel on the viewport. Layers included in the\n * detection can be configured through the `layerFilter` option.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel.\n * @param {AtPixelOptions} [options] Optional options.\n * @return {boolean} Is there a feature at the given pixel?\n * @api\n */\n hasFeatureAtPixel(e, t) {\n if (!this.frameState_ || !this.renderer_)\n return !1;\n const i = this.getCoordinateFromPixelInternal(e);\n t = t !== void 0 ? t : {};\n const r = t.layerFilter !== void 0 ? t.layerFilter : uc, s = t.hitTolerance !== void 0 ? t.hitTolerance : 0, a = t.checkWrapped !== !1;\n return this.renderer_.hasFeatureAtCoordinate(\n i,\n this.frameState_,\n s,\n a,\n r,\n null\n );\n }\n /**\n * Returns the coordinate in user projection for a browser event.\n * @param {MouseEvent} event Event.\n * @return {import(\"./coordinate.js\").Coordinate} Coordinate.\n * @api\n */\n getEventCoordinate(e) {\n return this.getCoordinateFromPixel(this.getEventPixel(e));\n }\n /**\n * Returns the coordinate in view projection for a browser event.\n * @param {MouseEvent} event Event.\n * @return {import(\"./coordinate.js\").Coordinate} Coordinate.\n */\n getEventCoordinateInternal(e) {\n return this.getCoordinateFromPixelInternal(this.getEventPixel(e));\n }\n /**\n * Returns the map pixel position for a browser event relative to the viewport.\n * @param {UIEvent|{clientX: number, clientY: number}} event Event.\n * @return {import(\"./pixel.js\").Pixel} Pixel.\n * @api\n */\n getEventPixel(e) {\n const i = this.viewport_.getBoundingClientRect(), r = this.getSize(), s = i.width / r[0], a = i.height / r[1], o = (\n //FIXME Are we really calling this with a TouchEvent anywhere?\n \"changedTouches\" in e ? (\n /** @type {TouchEvent} */\n e.changedTouches[0]\n ) : (\n /** @type {MouseEvent} */\n e\n )\n );\n return [\n (o.clientX - i.left) / s,\n (o.clientY - i.top) / a\n ];\n }\n /**\n * Get the target in which this map is rendered.\n * Note that this returns what is entered as an option or in setTarget:\n * if that was an element, it returns an element; if a string, it returns that.\n * @return {HTMLElement|string|undefined} The Element or id of the Element that the\n * map is rendered in.\n * @observable\n * @api\n */\n getTarget() {\n return (\n /** @type {HTMLElement|string|undefined} */\n this.get(Ki.TARGET)\n );\n }\n /**\n * Get the DOM element into which this map is rendered. In contrast to\n * `getTarget` this method always return an `Element`, or `null` if the\n * map has no target.\n * @return {HTMLElement} The element that the map is rendered in.\n * @api\n */\n getTargetElement() {\n return this.targetElement_;\n }\n /**\n * Get the coordinate for a given pixel. This returns a coordinate in the\n * user projection.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel position in the map viewport.\n * @return {import(\"./coordinate.js\").Coordinate} The coordinate for the pixel position.\n * @api\n */\n getCoordinateFromPixel(e) {\n return Au(\n this.getCoordinateFromPixelInternal(e),\n this.getView().getProjection()\n );\n }\n /**\n * Get the coordinate for a given pixel. This returns a coordinate in the\n * map view projection.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel position in the map viewport.\n * @return {import(\"./coordinate.js\").Coordinate} The coordinate for the pixel position.\n */\n getCoordinateFromPixelInternal(e) {\n const t = this.frameState_;\n return t ? Ar(t.pixelToCoordinateTransform, e.slice()) : null;\n }\n /**\n * Get the map controls. Modifying this collection changes the controls\n * associated with the map.\n * @return {Collection} Controls.\n * @api\n */\n getControls() {\n return this.controls;\n }\n /**\n * Get the map overlays. Modifying this collection changes the overlays\n * associated with the map.\n * @return {Collection} Overlays.\n * @api\n */\n getOverlays() {\n return this.overlays_;\n }\n /**\n * Get an overlay by its identifier (the value returned by overlay.getId()).\n * Note that the index treats string and numeric identifiers as the same. So\n * `map.getOverlayById(2)` will return an overlay with id `'2'` or `2`.\n * @param {string|number} id Overlay identifier.\n * @return {import(\"./Overlay.js\").default} Overlay.\n * @api\n */\n getOverlayById(e) {\n const t = this.overlayIdIndex_[e.toString()];\n return t !== void 0 ? t : null;\n }\n /**\n * Get the map interactions. Modifying this collection changes the interactions\n * associated with the map.\n *\n * Interactions are used for e.g. pan, zoom and rotate.\n * @return {Collection} Interactions.\n * @api\n */\n getInteractions() {\n return this.interactions;\n }\n /**\n * Get the layergroup associated with this map.\n * @return {LayerGroup} A layer group containing the layers in this map.\n * @observable\n * @api\n */\n getLayerGroup() {\n return (\n /** @type {LayerGroup} */\n this.get(Ki.LAYERGROUP)\n );\n }\n /**\n * Clear any existing layers and add layers to the map.\n * @param {Array|Collection} layers The layers to be added to the map.\n * @api\n */\n setLayers(e) {\n const t = this.getLayerGroup();\n if (e instanceof Us) {\n t.setLayers(e);\n return;\n }\n const i = t.getLayers();\n i.clear(), i.extend(e);\n }\n /**\n * Get the collection of layers associated with this map.\n * @return {!Collection} Layers.\n * @api\n */\n getLayers() {\n return this.getLayerGroup().getLayers();\n }\n /**\n * @return {boolean} Layers have sources that are still loading.\n */\n getLoadingOrNotReady() {\n const e = this.getLayerGroup().getLayerStatesArray();\n for (let t = 0, i = e.length; t < i; ++t) {\n const r = e[t];\n if (!r.visible)\n continue;\n const s = r.layer.getRenderer();\n if (s && !s.ready)\n return !0;\n const a = r.layer.getSource();\n if (a && a.loading)\n return !0;\n }\n return !1;\n }\n /**\n * Get the pixel for a coordinate. This takes a coordinate in the user\n * projection and returns the corresponding pixel.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate A map coordinate.\n * @return {import(\"./pixel.js\").Pixel} A pixel position in the map viewport.\n * @api\n */\n getPixelFromCoordinate(e) {\n const t = Ps(\n e,\n this.getView().getProjection()\n );\n return this.getPixelFromCoordinateInternal(t);\n }\n /**\n * Get the pixel for a coordinate. This takes a coordinate in the map view\n * projection and returns the corresponding pixel.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate A map coordinate.\n * @return {import(\"./pixel.js\").Pixel} A pixel position in the map viewport.\n */\n getPixelFromCoordinateInternal(e) {\n const t = this.frameState_;\n return t ? Ar(\n t.coordinateToPixelTransform,\n e.slice(0, 2)\n ) : null;\n }\n /**\n * Get the map renderer.\n * @return {import(\"./renderer/Map.js\").default|null} Renderer\n */\n getRenderer() {\n return this.renderer_;\n }\n /**\n * Get the size of this map.\n * @return {import(\"./size.js\").Size|undefined} The size in pixels of the map in the DOM.\n * @observable\n * @api\n */\n getSize() {\n return (\n /** @type {import(\"./size.js\").Size|undefined} */\n this.get(Ki.SIZE)\n );\n }\n /**\n * Get the view associated with this map. A view manages properties such as\n * center and resolution.\n * @return {View} The view that controls this map.\n * @observable\n * @api\n */\n getView() {\n return (\n /** @type {View} */\n this.get(Ki.VIEW)\n );\n }\n /**\n * Get the element that serves as the map viewport.\n * @return {HTMLElement} Viewport.\n * @api\n */\n getViewport() {\n return this.viewport_;\n }\n /**\n * Get the element that serves as the container for overlays. Elements added to\n * this container will let mousedown and touchstart events through to the map,\n * so clicks and gestures on an overlay will trigger {@link module:ol/MapBrowserEvent~MapBrowserEvent}\n * events.\n * @return {!HTMLElement} The map's overlay container.\n */\n getOverlayContainer() {\n return this.overlayContainer_;\n }\n /**\n * Get the element that serves as a container for overlays that don't allow\n * event propagation. Elements added to this container won't let mousedown and\n * touchstart events through to the map, so clicks and gestures on an overlay\n * don't trigger any {@link module:ol/MapBrowserEvent~MapBrowserEvent}.\n * @return {!HTMLElement} The map's overlay container that stops events.\n */\n getOverlayContainerStopEvent() {\n return this.overlayContainerStopEvent_;\n }\n /**\n * @return {!Document} The document where the map is displayed.\n */\n getOwnerDocument() {\n const e = this.getTargetElement();\n return e ? e.ownerDocument : document;\n }\n /**\n * @param {import(\"./Tile.js\").default} tile Tile.\n * @param {string} tileSourceKey Tile source key.\n * @param {import(\"./coordinate.js\").Coordinate} tileCenter Tile center.\n * @param {number} tileResolution Tile resolution.\n * @return {number} Tile priority.\n */\n getTilePriority(e, t, i, r) {\n return OU(\n this.frameState_,\n e,\n t,\n i,\n r\n );\n }\n /**\n * @param {UIEvent} browserEvent Browser event.\n * @param {string} [type] Type.\n */\n handleBrowserEvent(e, t) {\n t = t || e.type;\n const i = new Js(t, this, e);\n this.handleMapBrowserEvent(i);\n }\n /**\n * @param {MapBrowserEvent} mapBrowserEvent The event to handle.\n */\n handleMapBrowserEvent(e) {\n if (!this.frameState_)\n return;\n const t = (\n /** @type {PointerEvent} */\n e.originalEvent\n ), i = t.type;\n if (i === Pu.POINTERDOWN || i === St.WHEEL || i === St.KEYDOWN) {\n const r = this.getOwnerDocument(), s = this.viewport_.getRootNode ? this.viewport_.getRootNode() : r, a = (\n /** @type {Node} */\n t.target\n );\n if (\n // Abort if the target is a child of the container for elements whose events are not meant\n // to be handled by map interactions.\n this.overlayContainerStopEvent_.contains(a) || // Abort if the event target is a child of the container that is no longer in the page.\n // It's possible for the target to no longer be in the page if it has been removed in an\n // event listener, this might happen in a Control that recreates it's content based on\n // user interaction either manually or via a render in something like https://reactjs.org/\n !(s === r ? r.documentElement : s).contains(a)\n )\n return;\n }\n if (e.frameState = this.frameState_, this.dispatchEvent(e) !== !1) {\n const r = this.getInteractions().getArray().slice();\n for (let s = r.length - 1; s >= 0; s--) {\n const a = r[s];\n if (a.getMap() !== this || !a.getActive() || !this.getTargetElement())\n continue;\n if (!a.handleEvent(e) || e.propagationStopped)\n break;\n }\n }\n }\n /**\n * @protected\n */\n handlePostRender() {\n const e = this.frameState_, t = this.tileQueue_;\n if (!t.isEmpty()) {\n let r = this.maxTilesLoading_, s = r;\n if (e) {\n const a = e.viewHints;\n if (a[Mr.ANIMATING] || a[Mr.INTERACTING]) {\n const o = Date.now() - e.time > 8;\n r = o ? 0 : 8, s = o ? 0 : 2;\n }\n }\n t.getTilesLoading() < r && (t.reprioritize(), t.loadMoreTiles(r, s));\n }\n e && this.renderer_ && !e.animate && (this.renderComplete_ === !0 ? (this.hasListener(nn.RENDERCOMPLETE) && this.renderer_.dispatchRenderEvent(\n nn.RENDERCOMPLETE,\n e\n ), this.loaded_ === !1 && (this.loaded_ = !0, this.dispatchEvent(\n new oa($s.LOADEND, this, e)\n ))) : this.loaded_ === !0 && (this.loaded_ = !1, this.dispatchEvent(\n new oa($s.LOADSTART, this, e)\n )));\n const i = this.postRenderFunctions_;\n for (let r = 0, s = i.length; r < s; ++r)\n i[r](this, e);\n i.length = 0;\n }\n /**\n * @private\n */\n handleSizeChanged_() {\n this.getView() && !this.getView().getAnimating() && this.getView().resolveConstraints(0), this.render();\n }\n /**\n * @private\n */\n handleTargetChanged_() {\n if (this.mapBrowserEventHandler_) {\n for (let i = 0, r = this.targetChangeHandlerKeys_.length; i < r; ++i)\n Ei(this.targetChangeHandlerKeys_[i]);\n this.targetChangeHandlerKeys_ = null, this.viewport_.removeEventListener(\n St.CONTEXTMENU,\n this.boundHandleBrowserEvent_\n ), this.viewport_.removeEventListener(\n St.WHEEL,\n this.boundHandleBrowserEvent_\n ), this.mapBrowserEventHandler_.dispose(), this.mapBrowserEventHandler_ = null, Mu(this.viewport_);\n }\n if (this.targetElement_) {\n this.resizeObserver_.unobserve(this.targetElement_);\n const i = this.targetElement_.getRootNode();\n i instanceof ShadowRoot && this.resizeObserver_.unobserve(i.host), this.setSize(void 0);\n }\n const e = this.getTarget(), t = typeof e == \"string\" ? document.getElementById(e) : e;\n if (this.targetElement_ = t, !t)\n this.renderer_ && (clearTimeout(this.postRenderTimeoutHandle_), this.postRenderTimeoutHandle_ = void 0, this.postRenderFunctions_.length = 0, this.renderer_.dispose(), this.renderer_ = null), this.animationDelayKey_ && (cancelAnimationFrame(this.animationDelayKey_), this.animationDelayKey_ = void 0);\n else {\n t.appendChild(this.viewport_), this.renderer_ || (this.renderer_ = new bU(this)), this.mapBrowserEventHandler_ = new AU(\n this,\n this.moveTolerance_\n );\n for (const s in ui)\n this.mapBrowserEventHandler_.addEventListener(\n ui[s],\n this.handleMapBrowserEvent.bind(this)\n );\n this.viewport_.addEventListener(\n St.CONTEXTMENU,\n this.boundHandleBrowserEvent_,\n !1\n ), this.viewport_.addEventListener(\n St.WHEEL,\n this.boundHandleBrowserEvent_,\n SE ? { passive: !1 } : !1\n );\n const i = this.keyboardEventTarget_ ? this.keyboardEventTarget_ : t;\n this.targetChangeHandlerKeys_ = [\n Ht(\n i,\n St.KEYDOWN,\n this.handleBrowserEvent,\n this\n ),\n Ht(\n i,\n St.KEYPRESS,\n this.handleBrowserEvent,\n this\n )\n ];\n const r = t.getRootNode();\n r instanceof ShadowRoot && this.resizeObserver_.observe(r.host), this.resizeObserver_.observe(t);\n }\n this.updateSize();\n }\n /**\n * @private\n */\n handleTileChange_() {\n this.render();\n }\n /**\n * @private\n */\n handleViewPropertyChanged_() {\n this.render();\n }\n /**\n * @private\n */\n handleViewChanged_() {\n this.viewPropertyListenerKey_ && (Ei(this.viewPropertyListenerKey_), this.viewPropertyListenerKey_ = null), this.viewChangeListenerKey_ && (Ei(this.viewChangeListenerKey_), this.viewChangeListenerKey_ = null);\n const e = this.getView();\n e && (this.updateViewportSize_(), this.viewPropertyListenerKey_ = Ht(\n e,\n bo.PROPERTYCHANGE,\n this.handleViewPropertyChanged_,\n this\n ), this.viewChangeListenerKey_ = Ht(\n e,\n St.CHANGE,\n this.handleViewPropertyChanged_,\n this\n ), e.resolveConstraints(0)), this.render();\n }\n /**\n * @private\n */\n handleLayerGroupChanged_() {\n this.layerGroupPropertyListenerKeys_ && (this.layerGroupPropertyListenerKeys_.forEach(Ei), this.layerGroupPropertyListenerKeys_ = null);\n const e = this.getLayerGroup();\n e && (this.handleLayerAdd_(new tn(\"addlayer\", e)), this.layerGroupPropertyListenerKeys_ = [\n Ht(e, bo.PROPERTYCHANGE, this.render, this),\n Ht(e, St.CHANGE, this.render, this),\n Ht(e, \"addlayer\", this.handleLayerAdd_, this),\n Ht(e, \"removelayer\", this.handleLayerRemove_, this)\n ]), this.render();\n }\n /**\n * @return {boolean} Is rendered.\n */\n isRendered() {\n return !!this.frameState_;\n }\n /**\n * @private\n */\n animationDelay_() {\n this.animationDelayKey_ = void 0, this.renderFrame_(Date.now());\n }\n /**\n * Requests an immediate render in a synchronous manner.\n * @api\n */\n renderSync() {\n this.animationDelayKey_ && cancelAnimationFrame(this.animationDelayKey_), this.animationDelay_();\n }\n /**\n * Redraws all text after new fonts have loaded\n */\n redrawText() {\n const e = this.getLayerGroup().getLayerStatesArray();\n for (let t = 0, i = e.length; t < i; ++t) {\n const r = e[t].layer;\n r.hasRenderer() && r.getRenderer().handleFontsChanged();\n }\n }\n /**\n * Request a map rendering (at the next animation frame).\n * @api\n */\n render() {\n this.renderer_ && this.animationDelayKey_ === void 0 && (this.animationDelayKey_ = requestAnimationFrame(this.animationDelay_));\n }\n /**\n * This method is meant to be called in a layer's `prerender` listener. It causes all collected\n * declutter items to be decluttered and rendered on the map immediately. This is useful for\n * layers that need to appear entirely above the decluttered items of layers lower in the layer\n * stack.\n * @api\n */\n flushDeclutterItems() {\n const e = this.frameState_;\n e && this.renderer_.flushDeclutterItems(e);\n }\n /**\n * Remove the given control from the map.\n * @param {import(\"./control/Control.js\").default} control Control.\n * @return {import(\"./control/Control.js\").default|undefined} The removed control (or undefined\n * if the control was not found).\n * @api\n */\n removeControl(e) {\n return this.getControls().remove(e);\n }\n /**\n * Remove the given interaction from the map.\n * @param {import(\"./interaction/Interaction.js\").default} interaction Interaction to remove.\n * @return {import(\"./interaction/Interaction.js\").default|undefined} The removed interaction (or\n * undefined if the interaction was not found).\n * @api\n */\n removeInteraction(e) {\n return this.getInteractions().remove(e);\n }\n /**\n * Removes the given layer from the map.\n * @param {import(\"./layer/Base.js\").default} layer Layer.\n * @return {import(\"./layer/Base.js\").default|undefined} The removed layer (or undefined if the\n * layer was not found).\n * @api\n */\n removeLayer(e) {\n return this.getLayerGroup().getLayers().remove(e);\n }\n /**\n * @param {import(\"./layer/Group.js\").GroupEvent} event The layer remove event.\n * @private\n */\n handleLayerRemove_(e) {\n JE(e.layer);\n }\n /**\n * Remove the given overlay from the map.\n * @param {import(\"./Overlay.js\").default} overlay Overlay.\n * @return {import(\"./Overlay.js\").default|undefined} The removed overlay (or undefined\n * if the overlay was not found).\n * @api\n */\n removeOverlay(e) {\n return this.getOverlays().remove(e);\n }\n /**\n * @param {number} time Time.\n * @private\n */\n renderFrame_(e) {\n const t = this.getSize(), i = this.getView(), r = this.frameState_;\n let s = null;\n if (t !== void 0 && Lm(t) && i && i.isDef()) {\n const a = i.getHints(\n this.frameState_ ? this.frameState_.viewHints : void 0\n ), o = i.getState();\n if (s = {\n animate: !1,\n coordinateToPixelTransform: this.coordinateToPixelTransform_,\n declutterTree: null,\n extent: Su(\n o.center,\n o.resolution,\n o.rotation,\n t\n ),\n index: this.frameIndex_++,\n layerIndex: 0,\n layerStatesArray: this.getLayerGroup().getLayerStatesArray(),\n pixelRatio: this.pixelRatio_,\n pixelToCoordinateTransform: this.pixelToCoordinateTransform_,\n postRenderFunctions: [],\n size: t,\n tileQueue: this.tileQueue_,\n time: e,\n usedTiles: {},\n viewState: o,\n viewHints: a,\n wantedTiles: {},\n mapId: fr(this),\n renderTargets: {}\n }, o.nextCenter && o.nextResolution) {\n const l = isNaN(o.nextRotation) ? o.rotation : o.nextRotation;\n s.nextExtent = Su(\n o.nextCenter,\n o.nextResolution,\n l,\n t\n );\n }\n }\n this.frameState_ = s, this.renderer_.renderFrame(s), s && (s.animate && this.render(), Array.prototype.push.apply(\n this.postRenderFunctions_,\n s.postRenderFunctions\n ), r && (!this.previousExtent_ || !$o(this.previousExtent_) && !Cu(s.extent, this.previousExtent_)) && (this.dispatchEvent(\n new oa($s.MOVESTART, this, r)\n ), this.previousExtent_ = Qo(this.previousExtent_)), this.previousExtent_ && !s.viewHints[Mr.ANIMATING] && !s.viewHints[Mr.INTERACTING] && !Cu(s.extent, this.previousExtent_) && (this.dispatchEvent(\n new oa($s.MOVEEND, this, s)\n ), Q2(s.extent, this.previousExtent_))), this.dispatchEvent(new oa($s.POSTRENDER, this, s)), this.renderComplete_ = this.hasListener($s.LOADSTART) || this.hasListener($s.LOADEND) || this.hasListener(nn.RENDERCOMPLETE) ? !this.tileQueue_.getTilesLoading() && !this.tileQueue_.getCount() && !this.getLoadingOrNotReady() : void 0, this.postRenderTimeoutHandle_ || (this.postRenderTimeoutHandle_ = setTimeout(() => {\n this.postRenderTimeoutHandle_ = void 0, this.handlePostRender();\n }, 0));\n }\n /**\n * Sets the layergroup of this map.\n * @param {LayerGroup} layerGroup A layer group containing the layers in this map.\n * @observable\n * @api\n */\n setLayerGroup(e) {\n const t = this.getLayerGroup();\n t && this.handleLayerRemove_(new tn(\"removelayer\", t)), this.set(Ki.LAYERGROUP, e);\n }\n /**\n * Set the size of this map.\n * @param {import(\"./size.js\").Size|undefined} size The size in pixels of the map in the DOM.\n * @observable\n * @api\n */\n setSize(e) {\n this.set(Ki.SIZE, e);\n }\n /**\n * Set the target element to render this map into.\n * @param {HTMLElement|string} [target] The Element or id of the Element\n * that the map is rendered in.\n * @observable\n * @api\n */\n setTarget(e) {\n this.set(Ki.TARGET, e);\n }\n /**\n * Set the view for this map.\n * @param {View|Promise} view The view that controls this map.\n * It is also possible to pass a promise that resolves to options for constructing a view. This\n * alternative allows view properties to be resolved by sources or other components that load\n * view-related metadata.\n * @observable\n * @api\n */\n setView(e) {\n if (!e || e instanceof Qr) {\n this.set(Ki.VIEW, e);\n return;\n }\n this.set(Ki.VIEW, new Qr());\n const t = this;\n e.then(function(i) {\n t.setView(new Qr(i));\n });\n }\n /**\n * Force a recalculation of the map viewport size. This should be called when\n * third-party code changes the size of the map viewport.\n * @api\n */\n updateSize() {\n const e = this.getTargetElement();\n let t;\n if (e) {\n const r = getComputedStyle(e), s = e.offsetWidth - parseFloat(r.borderLeftWidth) - parseFloat(r.paddingLeft) - parseFloat(r.paddingRight) - parseFloat(r.borderRightWidth), a = e.offsetHeight - parseFloat(r.borderTopWidth) - parseFloat(r.paddingTop) - parseFloat(r.paddingBottom) - parseFloat(r.borderBottomWidth);\n !isNaN(s) && !isNaN(a) && (t = [s, a], !Lm(t) && (e.offsetWidth || e.offsetHeight || e.getClientRects().length) && FE(\n \"No map visible because the map container's width or height are 0.\"\n ));\n }\n const i = this.getSize();\n t && (!i || !Qc(t, i)) && (this.setSize(t), this.updateViewportSize_());\n }\n /**\n * Recomputes the viewport size and save it on the view object (if any)\n * @private\n */\n updateViewportSize_() {\n const e = this.getView();\n if (e) {\n let t;\n const i = getComputedStyle(this.viewport_);\n i.width && i.height && (t = [\n parseInt(i.width, 10),\n parseInt(i.height, 10)\n ]), e.setViewportSize(t);\n }\n }\n};\nfunction f3(n) {\n let e = null;\n n.keyboardEventTarget !== void 0 && (e = typeof n.keyboardEventTarget == \"string\" ? document.getElementById(n.keyboardEventTarget) : n.keyboardEventTarget);\n const t = {}, i = n.layers && typeof /** @type {?} */\n n.layers.getLayers == \"function\" ? (\n /** @type {LayerGroup} */\n n.layers\n ) : new qa({\n layers: (\n /** @type {Collection|Array} */\n n.layers\n )\n });\n t[Ki.LAYERGROUP] = i, t[Ki.TARGET] = n.target, t[Ki.VIEW] = n.view instanceof Qr ? n.view : new Qr();\n let r;\n n.controls !== void 0 && (Array.isArray(n.controls) ? r = new Us(n.controls.slice()) : (Kt(\n typeof /** @type {?} */\n n.controls.getArray == \"function\",\n 47\n ), r = n.controls));\n let s;\n n.interactions !== void 0 && (Array.isArray(n.interactions) ? s = new Us(n.interactions.slice()) : (Kt(\n typeof /** @type {?} */\n n.interactions.getArray == \"function\",\n 48\n ), s = n.interactions));\n let a;\n return n.overlays !== void 0 ? Array.isArray(n.overlays) ? a = new Us(n.overlays.slice()) : (Kt(\n typeof /** @type {?} */\n n.overlays.getArray == \"function\",\n 49\n ), a = n.overlays) : a = new Us(), {\n controls: r,\n interactions: s,\n keyboardEventTarget: e,\n overlays: a,\n values: t\n };\n}\nconst Il = {\n PRELOAD: \"preload\",\n USE_INTERIM_TILES_ON_ERROR: \"useInterimTilesOnError\"\n};\nclass d3 extends nd {\n /**\n * @param {Options} [options] Tile layer options.\n */\n constructor(e) {\n e = e || {};\n const t = Object.assign({}, e);\n delete t.preload, delete t.useInterimTilesOnError, super(t), this.on, this.once, this.un, this.setPreload(e.preload !== void 0 ? e.preload : 0), this.setUseInterimTilesOnError(\n e.useInterimTilesOnError !== void 0 ? e.useInterimTilesOnError : !0\n );\n }\n /**\n * Return the level as number to which we will preload tiles up to.\n * @return {number} The level to preload tiles up to.\n * @observable\n * @api\n */\n getPreload() {\n return (\n /** @type {number} */\n this.get(Il.PRELOAD)\n );\n }\n /**\n * Set the level as number to which we will preload tiles up to.\n * @param {number} preload The level to preload tiles up to.\n * @observable\n * @api\n */\n setPreload(e) {\n this.set(Il.PRELOAD, e);\n }\n /**\n * Whether we use interim tiles on error.\n * @return {boolean} Use interim tiles on error.\n * @observable\n * @api\n */\n getUseInterimTilesOnError() {\n return (\n /** @type {boolean} */\n this.get(Il.USE_INTERIM_TILES_ON_ERROR)\n );\n }\n /**\n * Set whether we use interim tiles on error.\n * @param {boolean} useInterimTilesOnError Use interim tiles on error.\n * @observable\n * @api\n */\n setUseInterimTilesOnError(e) {\n this.set(Il.USE_INTERIM_TILES_ON_ERROR, e);\n }\n /**\n * Get data for a pixel location. The return type depends on the source data. For image tiles,\n * a four element RGBA array will be returned. For data tiles, the array length will match the\n * number of bands in the dataset. For requests outside the layer extent, `null` will be returned.\n * Data for a image tiles can only be retrieved if the source's `crossOrigin` property is set.\n *\n * ```js\n * // display layer data on every pointer move\n * map.on('pointermove', (event) => {\n * console.log(layer.getData(event.pixel));\n * });\n * ```\n * @param {import(\"../pixel\").Pixel} pixel Pixel.\n * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView|null} Pixel data.\n * @api\n */\n getData(e) {\n return super.getData(e);\n }\n}\nconst ia = {\n IDLE: 0,\n LOADING: 1,\n LOADED: 2,\n ERROR: 3,\n EMPTY: 4\n};\nclass p3 extends jo {\n /**\n * @param {LayerType} layer Layer.\n */\n constructor(e) {\n super(), this.ready = !0, this.boundHandleImageChange_ = this.handleImageChange_.bind(this), this.layer_ = e, this.declutterExecutorGroup = null;\n }\n /**\n * Asynchronous layer level hit detection.\n * @param {import(\"../pixel.js\").Pixel} pixel Pixel.\n * @return {Promise>} Promise that resolves with\n * an array of features.\n */\n getFeatures(e) {\n return di();\n }\n /**\n * @param {import(\"../pixel.js\").Pixel} pixel Pixel.\n * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView|null} Pixel data.\n */\n getData(e) {\n return null;\n }\n /**\n * Determine whether render should be called.\n * @abstract\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @return {boolean} Layer is ready to be rendered.\n */\n prepareFrame(e) {\n return di();\n }\n /**\n * Render the layer.\n * @abstract\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @param {HTMLElement|null} target Target that may be used to render content to.\n * @return {HTMLElement|null} The rendered element.\n */\n renderFrame(e, t) {\n return di();\n }\n /**\n * @param {Object>} tiles Lookup of loaded tiles by zoom level.\n * @param {number} zoom Zoom level.\n * @param {import(\"../Tile.js\").default} tile Tile.\n * @return {boolean|void} If `false`, the tile will not be considered loaded.\n */\n loadedTileCallback(e, t, i) {\n e[t] || (e[t] = {}), e[t][i.tileCoord.toString()] = i;\n }\n /**\n * Create a function that adds loaded tiles to the tile lookup.\n * @param {import(\"../source/Tile.js\").default} source Tile source.\n * @param {import(\"../proj/Projection.js\").default} projection Projection of the tiles.\n * @param {Object>} tiles Lookup of loaded tiles by zoom level.\n * @return {function(number, import(\"../TileRange.js\").default):boolean} A function that can be\n * called with a zoom level and a tile range to add loaded tiles to the lookup.\n * @protected\n */\n createLoadedTileFinder(e, t, i) {\n return (\n /**\n * @param {number} zoom Zoom level.\n * @param {import(\"../TileRange.js\").default} tileRange Tile range.\n * @return {boolean} The tile range is fully loaded.\n */\n (r, s) => {\n const a = this.loadedTileCallback.bind(this, i, r);\n return e.forEachLoadedTile(t, r, s, a);\n }\n );\n }\n /**\n * @abstract\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {import(\"./vector.js\").FeatureCallback} callback Feature callback.\n * @param {Array>} matches The hit detected matches with tolerance.\n * @return {T|undefined} Callback result.\n * @template T\n */\n forEachFeatureAtCoordinate(e, t, i, r, s) {\n }\n /**\n * @return {LayerType} Layer.\n */\n getLayer() {\n return this.layer_;\n }\n /**\n * Perform action necessary to get the layer rendered after new fonts have loaded\n * @abstract\n */\n handleFontsChanged() {\n }\n /**\n * Handle changes in image state.\n * @param {import(\"../events/Event.js\").default} event Image change event.\n * @private\n */\n handleImageChange_(e) {\n const t = (\n /** @type {import(\"../Image.js\").default} */\n e.target\n );\n (t.getState() === ia.LOADED || t.getState() === ia.ERROR) && this.renderIfReadyAndVisible();\n }\n /**\n * Load the image if not already loaded, and register the image change\n * listener if needed.\n * @param {import(\"../ImageBase.js\").default} image Image.\n * @return {boolean} `true` if the image is already loaded, `false` otherwise.\n * @protected\n */\n loadImage(e) {\n let t = e.getState();\n return t != ia.LOADED && t != ia.ERROR && e.addEventListener(St.CHANGE, this.boundHandleImageChange_), t == ia.IDLE && (e.load(), t = e.getState()), t == ia.LOADED;\n }\n /**\n * @protected\n */\n renderIfReadyAndVisible() {\n const e = this.getLayer();\n e && e.getVisible() && e.getSourceState() === \"ready\" && e.changed();\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n delete this.layer_, super.disposeInternal();\n }\n}\nlet la = null;\nfunction g3() {\n la = Na(1, 1, void 0, {\n willReadFrequently: !0\n });\n}\nclass m3 extends p3 {\n /**\n * @param {LayerType} layer Layer.\n */\n constructor(e) {\n super(e), this.container = null, this.renderedResolution, this.tempTransform = xa(), this.pixelTransform = xa(), this.inversePixelTransform = xa(), this.context = null, this.containerReused = !1, this.pixelContext_ = null, this.frameState = null;\n }\n /**\n * @param {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} image Image.\n * @param {number} col The column index.\n * @param {number} row The row index.\n * @return {Uint8ClampedArray|null} The image data.\n */\n getImageData(e, t, i) {\n la || g3(), la.clearRect(0, 0, 1, 1);\n let r;\n try {\n la.drawImage(e, t, i, 1, 1, 0, 0, 1, 1), r = la.getImageData(0, 0, 1, 1).data;\n } catch {\n return la = null, null;\n }\n return r;\n }\n /**\n * @param {import('../../Map.js').FrameState} frameState Frame state.\n * @return {string} Background color.\n */\n getBackground(e) {\n let i = this.getLayer().getBackground();\n return typeof i == \"function\" && (i = i(e.viewState.resolution)), i || void 0;\n }\n /**\n * Get a rendering container from an existing target, if compatible.\n * @param {HTMLElement} target Potential render target.\n * @param {string} transform CSS Transform.\n * @param {string} [backgroundColor] Background color.\n */\n useContainer(e, t, i) {\n const r = this.getLayer().getClassName();\n let s, a;\n if (e && e.className === r && (!i || e && e.style.backgroundColor && Qc(\n gm(e.style.backgroundColor),\n gm(i)\n ))) {\n const o = e.firstElementChild;\n o instanceof HTMLCanvasElement && (a = o.getContext(\"2d\"));\n }\n if (a && a.canvas.style.transform === t ? (this.container = e, this.context = a, this.containerReused = !0) : this.containerReused ? (this.container = null, this.context = null, this.containerReused = !1) : this.container && (this.container.style.backgroundColor = null), !this.container) {\n s = document.createElement(\"div\"), s.className = r;\n let o = s.style;\n o.position = \"absolute\", o.width = \"100%\", o.height = \"100%\", a = Na();\n const l = a.canvas;\n s.appendChild(l), o = l.style, o.position = \"absolute\", o.left = \"0\", o.transformOrigin = \"top left\", this.container = s, this.context = a;\n }\n !this.containerReused && i && !this.container.style.backgroundColor && (this.container.style.backgroundColor = i);\n }\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {import(\"../../extent.js\").Extent} extent Clip extent.\n * @protected\n */\n clipUnrotated(e, t, i) {\n const r = Bn(i), s = ih(i), a = th(i), o = eh(i);\n Ar(t.coordinateToPixelTransform, r), Ar(t.coordinateToPixelTransform, s), Ar(t.coordinateToPixelTransform, a), Ar(t.coordinateToPixelTransform, o);\n const l = this.inversePixelTransform;\n Ar(l, r), Ar(l, s), Ar(l, a), Ar(l, o), e.save(), e.beginPath(), e.moveTo(Math.round(r[0]), Math.round(r[1])), e.lineTo(Math.round(s[0]), Math.round(s[1])), e.lineTo(Math.round(a[0]), Math.round(a[1])), e.lineTo(Math.round(o[0]), Math.round(o[1])), e.clip();\n }\n /**\n * @param {import(\"../../render/EventType.js\").default} type Event type.\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @private\n */\n dispatchRenderEvent_(e, t, i) {\n const r = this.getLayer();\n if (r.hasListener(e)) {\n const s = new qE(\n e,\n this.inversePixelTransform,\n i,\n t\n );\n r.dispatchEvent(s);\n }\n }\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @protected\n */\n preRender(e, t) {\n this.frameState = t, this.dispatchRenderEvent_(nn.PRERENDER, e, t);\n }\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @protected\n */\n postRender(e, t) {\n this.dispatchRenderEvent_(nn.POSTRENDER, e, t);\n }\n /**\n * Creates a transform for rendering to an element that will be rotated after rendering.\n * @param {import(\"../../coordinate.js\").Coordinate} center Center.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {number} pixelRatio Pixel ratio.\n * @param {number} width Width of the rendered element (in pixels).\n * @param {number} height Height of the rendered element (in pixels).\n * @param {number} offsetX Offset on the x-axis in view coordinates.\n * @protected\n * @return {!import(\"../../transform.js\").Transform} Transform.\n */\n getRenderTransform(e, t, i, r, s, a, o) {\n const l = s / 2, c = a / 2, h = r / t, u = -h, f = -e[0] + o, d = -e[1];\n return Ao(\n this.tempTransform,\n l,\n c,\n h,\n u,\n -i,\n f,\n d\n );\n }\n /**\n * Clean up.\n */\n disposeInternal() {\n delete this.frameState, super.disposeInternal();\n }\n}\nclass tv extends Hf {\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"./TileState.js\").default} state State.\n * @param {Options} [options] Tile options.\n */\n constructor(e, t, i) {\n super(), i = i || {}, this.tileCoord = e, this.state = t, this.interimTile = null, this.key = \"\", this.transition_ = i.transition === void 0 ? 250 : i.transition, this.transitionStarts_ = {}, this.interpolate = !!i.interpolate;\n }\n /**\n * @protected\n */\n changed() {\n this.dispatchEvent(St.CHANGE);\n }\n /**\n * Called by the tile cache when the tile is removed from the cache due to expiry\n */\n release() {\n this.state === Qe.ERROR && this.setState(Qe.EMPTY);\n }\n /**\n * @return {string} Key.\n */\n getKey() {\n return this.key + \"/\" + this.tileCoord;\n }\n /**\n * Get the interim tile most suitable for rendering using the chain of interim\n * tiles. This corresponds to the most recent tile that has been loaded, if no\n * such tile exists, the original tile is returned.\n * @return {!Tile} Best tile for rendering.\n */\n getInterimTile() {\n if (!this.interimTile)\n return this;\n let e = this.interimTile;\n do {\n if (e.getState() == Qe.LOADED)\n return this.transition_ = 0, e;\n e = e.interimTile;\n } while (e);\n return this;\n }\n /**\n * Goes through the chain of interim tiles and discards sections of the chain\n * that are no longer relevant.\n */\n refreshInterimChain() {\n if (!this.interimTile)\n return;\n let e = this.interimTile, t = this;\n do {\n if (e.getState() == Qe.LOADED) {\n e.interimTile = null;\n break;\n } else\n e.getState() == Qe.LOADING ? t = e : e.getState() == Qe.IDLE ? t.interimTile = e.interimTile : t = e;\n e = t.interimTile;\n } while (e);\n }\n /**\n * Get the tile coordinate for this tile.\n * @return {import(\"./tilecoord.js\").TileCoord} The tile coordinate.\n * @api\n */\n getTileCoord() {\n return this.tileCoord;\n }\n /**\n * @return {import(\"./TileState.js\").default} State.\n */\n getState() {\n return this.state;\n }\n /**\n * Sets the state of this tile. If you write your own {@link module:ol/Tile~LoadFunction tileLoadFunction} ,\n * it is important to set the state correctly to {@link module:ol/TileState~ERROR}\n * when the tile cannot be loaded. Otherwise the tile cannot be removed from\n * the tile queue and will block other requests.\n * @param {import(\"./TileState.js\").default} state State.\n * @api\n */\n setState(e) {\n if (this.state !== Qe.ERROR && this.state > e)\n throw new Error(\"Tile load sequence violation\");\n this.state = e, this.changed();\n }\n /**\n * Load the image or retry if loading previously failed.\n * Loading is taken care of by the tile queue, and calling this method is\n * only needed for preloading or for reloading in case of an error.\n * @abstract\n * @api\n */\n load() {\n di();\n }\n /**\n * Get the alpha value for rendering.\n * @param {string} id An id for the renderer.\n * @param {number} time The render frame time.\n * @return {number} A number between 0 and 1.\n */\n getAlpha(e, t) {\n if (!this.transition_)\n return 1;\n let i = this.transitionStarts_[e];\n if (!i)\n i = t, this.transitionStarts_[e] = i;\n else if (i === -1)\n return 1;\n const r = t - i + 1e3 / 60;\n return r >= this.transition_ ? 1 : UE(r / this.transition_);\n }\n /**\n * Determine if a tile is in an alpha transition. A tile is considered in\n * transition if tile.getAlpha() has not yet been called or has been called\n * and returned 1.\n * @param {string} id An id for the renderer.\n * @return {boolean} The tile is in transition.\n */\n inTransition(e) {\n return this.transition_ ? this.transitionStarts_[e] !== -1 : !1;\n }\n /**\n * Mark a transition as complete.\n * @param {string} id An id for the renderer.\n */\n endTransition(e) {\n this.transition_ && (this.transitionStarts_[e] = -1);\n }\n}\nfunction _3(n, e, t) {\n const i = (\n /** @type {HTMLImageElement} */\n n\n );\n let r = !0, s = !1, a = !1;\n const o = [\n dc(i, St.LOAD, function() {\n a = !0, s || e();\n })\n ];\n return i.src && q2 ? (s = !0, i.decode().then(function() {\n r && e();\n }).catch(function(l) {\n r && (a ? e() : t());\n })) : o.push(dc(i, St.ERROR, t)), function() {\n r = !1, o.forEach(Ei);\n };\n}\nclass iv extends tv {\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"./TileState.js\").default} state State.\n * @param {string} src Image source URI.\n * @param {?string} crossOrigin Cross origin.\n * @param {import(\"./Tile.js\").LoadFunction} tileLoadFunction Tile load function.\n * @param {import(\"./Tile.js\").Options} [options] Tile options.\n */\n constructor(e, t, i, r, s, a) {\n super(e, t, a), this.crossOrigin_ = r, this.src_ = i, this.key = i, this.image_ = new Image(), r !== null && (this.image_.crossOrigin = r), this.unlisten_ = null, this.tileLoadFunction_ = s;\n }\n /**\n * Get the HTML image element for this tile (may be a Canvas, Image, or Video).\n * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image.\n * @api\n */\n getImage() {\n return this.image_;\n }\n /**\n * Sets an HTML image element for this tile (may be a Canvas or preloaded Image).\n * @param {HTMLCanvasElement|HTMLImageElement} element Element.\n */\n setImage(e) {\n this.image_ = e, this.state = Qe.LOADED, this.unlistenImage_(), this.changed();\n }\n /**\n * Tracks loading or read errors.\n *\n * @private\n */\n handleImageError_() {\n this.state = Qe.ERROR, this.unlistenImage_(), this.image_ = E3(), this.changed();\n }\n /**\n * Tracks successful image load.\n *\n * @private\n */\n handleImageLoad_() {\n const e = (\n /** @type {HTMLImageElement} */\n this.image_\n );\n e.naturalWidth && e.naturalHeight ? this.state = Qe.LOADED : this.state = Qe.EMPTY, this.unlistenImage_(), this.changed();\n }\n /**\n * Load the image or retry if loading previously failed.\n * Loading is taken care of by the tile queue, and calling this method is\n * only needed for preloading or for reloading in case of an error.\n *\n * To retry loading tiles on failed requests, use a custom `tileLoadFunction`\n * that checks for error status codes and reloads only when the status code is\n * 408, 429, 500, 502, 503 and 504, and only when not too many retries have been\n * made already:\n *\n * ```js\n * const retryCodes = [408, 429, 500, 502, 503, 504];\n * const retries = {};\n * source.setTileLoadFunction((tile, src) => {\n * const image = tile.getImage();\n * fetch(src)\n * .then((response) => {\n * if (retryCodes.includes(response.status)) {\n * retries[src] = (retries[src] || 0) + 1;\n * if (retries[src] <= 3) {\n * setTimeout(() => tile.load(), retries[src] * 1000);\n * }\n * return Promise.reject();\n * }\n * return response.blob();\n * })\n * .then((blob) => {\n * const imageUrl = URL.createObjectURL(blob);\n * image.src = imageUrl;\n * setTimeout(() => URL.revokeObjectURL(imageUrl), 5000);\n * })\n * .catch(() => tile.setState(3)); // error\n * });\n * ```\n *\n * @api\n */\n load() {\n this.state == Qe.ERROR && (this.state = Qe.IDLE, this.image_ = new Image(), this.crossOrigin_ !== null && (this.image_.crossOrigin = this.crossOrigin_)), this.state == Qe.IDLE && (this.state = Qe.LOADING, this.changed(), this.tileLoadFunction_(this, this.src_), this.unlisten_ = _3(\n this.image_,\n this.handleImageLoad_.bind(this),\n this.handleImageError_.bind(this)\n ));\n }\n /**\n * Discards event handlers which listen for load completion or errors.\n *\n * @private\n */\n unlistenImage_() {\n this.unlisten_ && (this.unlisten_(), this.unlisten_ = null);\n }\n}\nfunction E3() {\n const n = Na(1, 1);\n return n.fillStyle = \"rgba(0,0,0,0)\", n.fillRect(0, 0, 1, 1), n.canvas;\n}\nconst v3 = 0.5, T3 = 10, wm = 0.25;\nclass x3 {\n /**\n * @param {import(\"../proj/Projection.js\").default} sourceProj Source projection.\n * @param {import(\"../proj/Projection.js\").default} targetProj Target projection.\n * @param {import(\"../extent.js\").Extent} targetExtent Target extent to triangulate.\n * @param {import(\"../extent.js\").Extent} maxSourceExtent Maximal source extent that can be used.\n * @param {number} errorThreshold Acceptable error (in source units).\n * @param {?number} destinationResolution The (optional) resolution of the destination.\n */\n constructor(e, t, i, r, s, a) {\n this.sourceProj_ = e, this.targetProj_ = t;\n let o = {};\n const l = Oo(this.targetProj_, this.sourceProj_);\n this.transformInv_ = function(E) {\n const C = E[0] + \"/\" + E[1];\n return o[C] || (o[C] = l(E)), o[C];\n }, this.maxSourceExtent_ = r, this.errorThresholdSquared_ = s * s, this.triangles_ = [], this.wrapsXInSource_ = !1, this.canWrapXInSource_ = this.sourceProj_.canWrapX() && !!r && !!this.sourceProj_.getExtent() && Ui(r) >= Ui(this.sourceProj_.getExtent()), this.sourceWorldWidth_ = this.sourceProj_.getExtent() ? Ui(this.sourceProj_.getExtent()) : null, this.targetWorldWidth_ = this.targetProj_.getExtent() ? Ui(this.targetProj_.getExtent()) : null;\n const c = Bn(i), h = ih(i), u = th(i), f = eh(i), d = this.transformInv_(c), p = this.transformInv_(h), g = this.transformInv_(u), m = this.transformInv_(f), v = T3 + (a ? Math.max(\n 0,\n Math.ceil(\n Math.log2(\n Ru(i) / (a * a * 256 * 256)\n )\n )\n ) : 0);\n if (this.addQuad_(\n c,\n h,\n u,\n f,\n d,\n p,\n g,\n m,\n v\n ), this.wrapsXInSource_) {\n let E = 1 / 0;\n this.triangles_.forEach(function(C, T, R) {\n E = Math.min(\n E,\n C.source[0][0],\n C.source[1][0],\n C.source[2][0]\n );\n }), this.triangles_.forEach((C) => {\n if (Math.max(\n C.source[0][0],\n C.source[1][0],\n C.source[2][0]\n ) - E > this.sourceWorldWidth_ / 2) {\n const T = [\n [C.source[0][0], C.source[0][1]],\n [C.source[1][0], C.source[1][1]],\n [C.source[2][0], C.source[2][1]]\n ];\n T[0][0] - E > this.sourceWorldWidth_ / 2 && (T[0][0] -= this.sourceWorldWidth_), T[1][0] - E > this.sourceWorldWidth_ / 2 && (T[1][0] -= this.sourceWorldWidth_), T[2][0] - E > this.sourceWorldWidth_ / 2 && (T[2][0] -= this.sourceWorldWidth_);\n const R = Math.min(\n T[0][0],\n T[1][0],\n T[2][0]\n );\n Math.max(\n T[0][0],\n T[1][0],\n T[2][0]\n ) - R < this.sourceWorldWidth_ / 2 && (C.source = T);\n }\n });\n }\n o = {};\n }\n /**\n * Adds triangle to the triangulation.\n * @param {import(\"../coordinate.js\").Coordinate} a The target a coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} b The target b coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} c The target c coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} aSrc The source a coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} bSrc The source b coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} cSrc The source c coordinate.\n * @private\n */\n addTriangle_(e, t, i, r, s, a) {\n this.triangles_.push({\n source: [r, s, a],\n target: [e, t, i]\n });\n }\n /**\n * Adds quad (points in clock-wise order) to the triangulation\n * (and reprojects the vertices) if valid.\n * Performs quad subdivision if needed to increase precision.\n *\n * @param {import(\"../coordinate.js\").Coordinate} a The target a coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} b The target b coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} c The target c coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} d The target d coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} aSrc The source a coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} bSrc The source b coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} cSrc The source c coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} dSrc The source d coordinate.\n * @param {number} maxSubdivision Maximal allowed subdivision of the quad.\n * @private\n */\n addQuad_(e, t, i, r, s, a, o, l, c) {\n const h = dm([s, a, o, l]), u = this.sourceWorldWidth_ ? Ui(h) / this.sourceWorldWidth_ : null, f = (\n /** @type {number} */\n this.sourceWorldWidth_\n ), d = this.sourceProj_.canWrapX() && u > 0.5 && u < 1;\n let p = !1;\n if (c > 0) {\n if (this.targetProj_.isGlobal() && this.targetWorldWidth_) {\n const m = dm([e, t, i, r]);\n p = Ui(m) / this.targetWorldWidth_ > wm || p;\n }\n !d && this.sourceProj_.isGlobal() && u && (p = u > wm || p);\n }\n if (!p && this.maxSourceExtent_ && isFinite(h[0]) && isFinite(h[1]) && isFinite(h[2]) && isFinite(h[3]) && !Jo(h, this.maxSourceExtent_))\n return;\n let g = 0;\n if (!p && (!isFinite(s[0]) || !isFinite(s[1]) || !isFinite(a[0]) || !isFinite(a[1]) || !isFinite(o[0]) || !isFinite(o[1]) || !isFinite(l[0]) || !isFinite(l[1]))) {\n if (c > 0)\n p = !0;\n else if (g = (!isFinite(s[0]) || !isFinite(s[1]) ? 8 : 0) + (!isFinite(a[0]) || !isFinite(a[1]) ? 4 : 0) + (!isFinite(o[0]) || !isFinite(o[1]) ? 2 : 0) + (!isFinite(l[0]) || !isFinite(l[1]) ? 1 : 0), g != 1 && g != 2 && g != 4 && g != 8)\n return;\n }\n if (c > 0) {\n if (!p) {\n const m = [(e[0] + i[0]) / 2, (e[1] + i[1]) / 2], v = this.transformInv_(m);\n let E;\n d ? E = (Ra(s[0], f) + Ra(o[0], f)) / 2 - Ra(v[0], f) : E = (s[0] + o[0]) / 2 - v[0];\n const C = (s[1] + o[1]) / 2 - v[1];\n p = E * E + C * C > this.errorThresholdSquared_;\n }\n if (p) {\n if (Math.abs(e[0] - i[0]) <= Math.abs(e[1] - i[1])) {\n const m = [(t[0] + i[0]) / 2, (t[1] + i[1]) / 2], v = this.transformInv_(m), E = [(r[0] + e[0]) / 2, (r[1] + e[1]) / 2], C = this.transformInv_(E);\n this.addQuad_(\n e,\n t,\n m,\n E,\n s,\n a,\n v,\n C,\n c - 1\n ), this.addQuad_(\n E,\n m,\n i,\n r,\n C,\n v,\n o,\n l,\n c - 1\n );\n } else {\n const m = [(e[0] + t[0]) / 2, (e[1] + t[1]) / 2], v = this.transformInv_(m), E = [(i[0] + r[0]) / 2, (i[1] + r[1]) / 2], C = this.transformInv_(E);\n this.addQuad_(\n e,\n m,\n E,\n r,\n s,\n v,\n C,\n l,\n c - 1\n ), this.addQuad_(\n m,\n t,\n i,\n E,\n v,\n a,\n o,\n C,\n c - 1\n );\n }\n return;\n }\n }\n if (d) {\n if (!this.canWrapXInSource_)\n return;\n this.wrapsXInSource_ = !0;\n }\n g & 11 || this.addTriangle_(e, i, r, s, o, l), g & 14 || this.addTriangle_(e, i, t, s, o, a), g && (g & 13 || this.addTriangle_(t, r, e, a, l, s), g & 7 || this.addTriangle_(t, r, i, a, l, o));\n }\n /**\n * Calculates extent of the `source` coordinates from all the triangles.\n *\n * @return {import(\"../extent.js\").Extent} Calculated extent.\n */\n calculateSourceExtent() {\n const e = Vn();\n return this.triangles_.forEach(function(t, i, r) {\n const s = t.source;\n Kl(e, s[0]), Kl(e, s[1]), Kl(e, s[2]);\n }), e;\n }\n /**\n * @return {Array} Array of the calculated triangles.\n */\n getTriangles() {\n return this.triangles_;\n }\n}\nlet ru;\nconst ya = [];\nfunction Um(n, e, t, i, r) {\n n.beginPath(), n.moveTo(0, 0), n.lineTo(e, t), n.lineTo(i, r), n.closePath(), n.save(), n.clip(), n.fillRect(0, 0, Math.max(e, i) + 1, Math.max(t, r)), n.restore();\n}\nfunction su(n, e) {\n return Math.abs(n[e * 4] - 210) > 2 || Math.abs(n[e * 4 + 3] - 0.75 * 255) > 2;\n}\nfunction C3() {\n if (ru === void 0) {\n const n = Na(6, 6, ya);\n n.globalCompositeOperation = \"lighter\", n.fillStyle = \"rgba(210, 0, 0, 0.75)\", Um(n, 4, 5, 4, 0), Um(n, 4, 5, 0, 5);\n const e = n.getImageData(0, 0, 3, 3).data;\n ru = su(e, 0) || su(e, 4) || su(e, 8), od(n), ya.push(n.canvas);\n }\n return ru;\n}\nfunction Vm(n, e, t, i) {\n const r = Jf(t, e, n);\n let s = Cm(\n e,\n i,\n t\n );\n const a = e.getMetersPerUnit();\n a !== void 0 && (s *= a);\n const o = n.getMetersPerUnit();\n o !== void 0 && (s /= o);\n const l = n.getExtent();\n if (!l || Kf(l, r)) {\n const c = Cm(n, s, r) / s;\n isFinite(c) && c > 0 && (s /= c);\n }\n return s;\n}\nfunction R3(n, e, t, i) {\n const r = Mo(t);\n let s = Vm(\n n,\n e,\n r,\n i\n );\n return (!isFinite(s) || s <= 0) && ME(t, function(a) {\n return s = Vm(\n n,\n e,\n a,\n i\n ), isFinite(s) && s > 0;\n }), s;\n}\nfunction S3(n, e, t, i, r, s, a, o, l, c, h, u) {\n const f = Na(\n Math.round(t * n),\n Math.round(t * e),\n ya\n );\n if (u || (f.imageSmoothingEnabled = !1), l.length === 0)\n return f.canvas;\n f.scale(t, t);\n function d(T) {\n return Math.round(T * t) / t;\n }\n f.globalCompositeOperation = \"lighter\";\n const p = Vn();\n l.forEach(function(T, R, x) {\n tw(p, T.extent);\n });\n const g = Ui(p), m = gs(p), v = Na(\n Math.round(t * g / i),\n Math.round(t * m / i),\n ya\n );\n u || (v.imageSmoothingEnabled = !1);\n const E = t / i;\n l.forEach(function(T, R, x) {\n const S = T.extent[0] - p[0], M = -(T.extent[3] - p[3]), N = Ui(T.extent), F = gs(T.extent);\n T.image.width > 0 && T.image.height > 0 && v.drawImage(\n T.image,\n c,\n c,\n T.image.width - 2 * c,\n T.image.height - 2 * c,\n S * E,\n M * E,\n N * E,\n F * E\n );\n });\n const C = Bn(a);\n return o.getTriangles().forEach(function(T, R, x) {\n const S = T.source, M = T.target;\n let N = S[0][0], F = S[0][1], U = S[1][0], H = S[1][1], q = S[2][0], Z = S[2][1];\n const k = d((M[0][0] - C[0]) / s), Q = d(\n -(M[0][1] - C[1]) / s\n ), ce = d((M[1][0] - C[0]) / s), de = d(\n -(M[1][1] - C[1]) / s\n ), j = d((M[2][0] - C[0]) / s), J = d(\n -(M[2][1] - C[1]) / s\n ), O = N, G = F;\n N = 0, F = 0, U -= O, H -= G, q -= O, Z -= G;\n const ee = [\n [U, H, 0, 0, ce - k],\n [q, Z, 0, 0, j - k],\n [0, 0, U, H, de - Q],\n [0, 0, q, Z, J - Q]\n ], _e = lw(ee);\n if (_e) {\n if (f.save(), f.beginPath(), C3() || !u) {\n f.moveTo(ce, de);\n const Oe = 4, ze = k - ce, fe = Q - de;\n for (let Te = 0; Te < Oe; Te++)\n f.lineTo(\n ce + d((Te + 1) * ze / Oe),\n de + d(Te * fe / (Oe - 1))\n ), Te != Oe - 1 && f.lineTo(\n ce + d((Te + 1) * ze / Oe),\n de + d((Te + 1) * fe / (Oe - 1))\n );\n f.lineTo(j, J);\n } else\n f.moveTo(ce, de), f.lineTo(k, Q), f.lineTo(j, J);\n f.clip(), f.transform(\n _e[0],\n _e[2],\n _e[1],\n _e[3],\n k,\n Q\n ), f.translate(\n p[0] - O,\n p[3] - G\n ), f.scale(\n i / t,\n -i / t\n ), f.drawImage(v.canvas, 0, 0), f.restore();\n }\n }), od(v), ya.push(v.canvas), h && (f.save(), f.globalCompositeOperation = \"source-over\", f.strokeStyle = \"black\", f.lineWidth = 1, o.getTriangles().forEach(function(T, R, x) {\n const S = T.target, M = (S[0][0] - C[0]) / s, N = -(S[0][1] - C[1]) / s, F = (S[1][0] - C[0]) / s, U = -(S[1][1] - C[1]) / s, H = (S[2][0] - C[0]) / s, q = -(S[2][1] - C[1]) / s;\n f.beginPath(), f.moveTo(F, U), f.lineTo(M, N), f.lineTo(H, q), f.closePath(), f.stroke();\n }), f.restore()), f.canvas;\n}\nclass Du extends tv {\n /**\n * @param {import(\"../proj/Projection.js\").default} sourceProj Source projection.\n * @param {import(\"../tilegrid/TileGrid.js\").default} sourceTileGrid Source tile grid.\n * @param {import(\"../proj/Projection.js\").default} targetProj Target projection.\n * @param {import(\"../tilegrid/TileGrid.js\").default} targetTileGrid Target tile grid.\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Coordinate of the tile.\n * @param {import(\"../tilecoord.js\").TileCoord} wrappedTileCoord Coordinate of the tile wrapped in X.\n * @param {number} pixelRatio Pixel ratio.\n * @param {number} gutter Gutter of the source tiles.\n * @param {FunctionType} getTileFunction\n * Function returning source tiles (z, x, y, pixelRatio).\n * @param {number} [errorThreshold] Acceptable reprojection error (in px).\n * @param {boolean} [renderEdges] Render reprojection edges.\n * @param {boolean} [interpolate] Use linear interpolation when resampling.\n */\n constructor(e, t, i, r, s, a, o, l, c, h, u, f) {\n super(s, Qe.IDLE, { interpolate: !!f }), this.renderEdges_ = u !== void 0 ? u : !1, this.pixelRatio_ = o, this.gutter_ = l, this.canvas_ = null, this.sourceTileGrid_ = t, this.targetTileGrid_ = r, this.wrappedTileCoord_ = a || s, this.sourceTiles_ = [], this.sourcesListenerKeys_ = null, this.sourceZ_ = 0;\n const d = r.getTileCoordExtent(\n this.wrappedTileCoord_\n ), p = this.targetTileGrid_.getExtent();\n let g = this.sourceTileGrid_.getExtent();\n const m = p ? fo(d, p) : d;\n if (Ru(m) === 0) {\n this.state = Qe.EMPTY;\n return;\n }\n const v = e.getExtent();\n v && (g ? g = fo(g, v) : g = v);\n const E = r.getResolution(\n this.wrappedTileCoord_[0]\n ), C = R3(\n e,\n i,\n m,\n E\n );\n if (!isFinite(C) || C <= 0) {\n this.state = Qe.EMPTY;\n return;\n }\n const T = h !== void 0 ? h : v3;\n if (this.triangulation_ = new x3(\n e,\n i,\n m,\n g,\n C * T,\n E\n ), this.triangulation_.getTriangles().length === 0) {\n this.state = Qe.EMPTY;\n return;\n }\n this.sourceZ_ = t.getZForResolution(C);\n let R = this.triangulation_.calculateSourceExtent();\n if (g && (e.canWrapX() ? (R[1] = Vi(\n R[1],\n g[1],\n g[3]\n ), R[3] = Vi(\n R[3],\n g[1],\n g[3]\n )) : R = fo(R, g)), !Ru(R))\n this.state = Qe.EMPTY;\n else {\n const x = t.getTileRangeForExtentAndZ(\n R,\n this.sourceZ_\n );\n for (let S = x.minX; S <= x.maxX; S++)\n for (let M = x.minY; M <= x.maxY; M++) {\n const N = c(this.sourceZ_, S, M, o);\n N && this.sourceTiles_.push(N);\n }\n this.sourceTiles_.length === 0 && (this.state = Qe.EMPTY);\n }\n }\n /**\n * Get the HTML Canvas element for this tile.\n * @return {HTMLCanvasElement} Canvas.\n */\n getImage() {\n return this.canvas_;\n }\n /**\n * @private\n */\n reproject_() {\n const e = [];\n if (this.sourceTiles_.forEach((t) => {\n t && t.getState() == Qe.LOADED && e.push({\n extent: this.sourceTileGrid_.getTileCoordExtent(t.tileCoord),\n image: t.getImage()\n });\n }), this.sourceTiles_.length = 0, e.length === 0)\n this.state = Qe.ERROR;\n else {\n const t = this.wrappedTileCoord_[0], i = this.targetTileGrid_.getTileSize(t), r = typeof i == \"number\" ? i : i[0], s = typeof i == \"number\" ? i : i[1], a = this.targetTileGrid_.getResolution(t), o = this.sourceTileGrid_.getResolution(\n this.sourceZ_\n ), l = this.targetTileGrid_.getTileCoordExtent(\n this.wrappedTileCoord_\n );\n this.canvas_ = S3(\n r,\n s,\n this.pixelRatio_,\n o,\n this.sourceTileGrid_.getExtent(),\n a,\n l,\n this.triangulation_,\n e,\n this.gutter_,\n this.renderEdges_,\n this.interpolate\n ), this.state = Qe.LOADED;\n }\n this.changed();\n }\n /**\n * Load not yet loaded URI.\n */\n load() {\n if (this.state == Qe.IDLE) {\n this.state = Qe.LOADING, this.changed();\n let e = 0;\n this.sourcesListenerKeys_ = [], this.sourceTiles_.forEach((t) => {\n const i = t.getState();\n if (i == Qe.IDLE || i == Qe.LOADING) {\n e++;\n const r = Ht(\n t,\n St.CHANGE,\n function(s) {\n const a = t.getState();\n (a == Qe.LOADED || a == Qe.ERROR || a == Qe.EMPTY) && (Ei(r), e--, e === 0 && (this.unlistenSources_(), this.reproject_()));\n },\n this\n );\n this.sourcesListenerKeys_.push(r);\n }\n }), e === 0 ? setTimeout(this.reproject_.bind(this), 0) : this.sourceTiles_.forEach(function(t, i, r) {\n t.getState() == Qe.IDLE && t.load();\n });\n }\n }\n /**\n * @private\n */\n unlistenSources_() {\n this.sourcesListenerKeys_.forEach(Ei), this.sourcesListenerKeys_ = null;\n }\n /**\n * Remove from the cache due to expiry\n */\n release() {\n this.canvas_ && (od(this.canvas_.getContext(\"2d\")), ya.push(this.canvas_), this.canvas_ = null), super.release();\n }\n}\nclass ud {\n /**\n * @param {number} minX Minimum X.\n * @param {number} maxX Maximum X.\n * @param {number} minY Minimum Y.\n * @param {number} maxY Maximum Y.\n */\n constructor(e, t, i, r) {\n this.minX = e, this.maxX = t, this.minY = i, this.maxY = r;\n }\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @return {boolean} Contains tile coordinate.\n */\n contains(e) {\n return this.containsXY(e[1], e[2]);\n }\n /**\n * @param {TileRange} tileRange Tile range.\n * @return {boolean} Contains.\n */\n containsTileRange(e) {\n return this.minX <= e.minX && e.maxX <= this.maxX && this.minY <= e.minY && e.maxY <= this.maxY;\n }\n /**\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @return {boolean} Contains coordinate.\n */\n containsXY(e, t) {\n return this.minX <= e && e <= this.maxX && this.minY <= t && t <= this.maxY;\n }\n /**\n * @param {TileRange} tileRange Tile range.\n * @return {boolean} Equals.\n */\n equals(e) {\n return this.minX == e.minX && this.minY == e.minY && this.maxX == e.maxX && this.maxY == e.maxY;\n }\n /**\n * @param {TileRange} tileRange Tile range.\n */\n extend(e) {\n e.minX < this.minX && (this.minX = e.minX), e.maxX > this.maxX && (this.maxX = e.maxX), e.minY < this.minY && (this.minY = e.minY), e.maxY > this.maxY && (this.maxY = e.maxY);\n }\n /**\n * @return {number} Height.\n */\n getHeight() {\n return this.maxY - this.minY + 1;\n }\n /**\n * @return {import(\"./size.js\").Size} Size.\n */\n getSize() {\n return [this.getWidth(), this.getHeight()];\n }\n /**\n * @return {number} Width.\n */\n getWidth() {\n return this.maxX - this.minX + 1;\n }\n /**\n * @param {TileRange} tileRange Tile range.\n * @return {boolean} Intersects.\n */\n intersects(e) {\n return this.minX <= e.maxX && this.maxX >= e.minX && this.minY <= e.maxY && this.maxY >= e.minY;\n }\n}\nfunction ra(n, e, t, i, r) {\n return r !== void 0 ? (r.minX = n, r.maxX = e, r.minY = t, r.maxY = i, r) : new ud(n, e, t, i);\n}\nclass y3 extends m3 {\n /**\n * @param {LayerType} tileLayer Tile layer.\n */\n constructor(e) {\n super(e), this.extentChanged = !0, this.renderedExtent_ = null, this.renderedPixelRatio, this.renderedProjection = null, this.renderedRevision, this.renderedTiles = [], this.newTiles_ = !1, this.tmpExtent = Vn(), this.tmpTileRange_ = new ud(0, 0, 0, 0);\n }\n /**\n * @protected\n * @param {import(\"../../Tile.js\").default} tile Tile.\n * @return {boolean} Tile is drawable.\n */\n isDrawableTile(e) {\n const t = this.getLayer(), i = e.getState(), r = t.getUseInterimTilesOnError();\n return i == Qe.LOADED || i == Qe.EMPTY || i == Qe.ERROR && !r;\n }\n /**\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @return {!import(\"../../Tile.js\").default} Tile.\n */\n getTile(e, t, i, r) {\n const s = r.pixelRatio, a = r.viewState.projection, o = this.getLayer();\n let c = o.getSource().getTile(e, t, i, s, a);\n return c.getState() == Qe.ERROR && o.getUseInterimTilesOnError() && o.getPreload() > 0 && (this.newTiles_ = !0), this.isDrawableTile(c) || (c = c.getInterimTile()), c;\n }\n /**\n * @param {import(\"../../pixel.js\").Pixel} pixel Pixel.\n * @return {Uint8ClampedArray} Data at the pixel location.\n */\n getData(e) {\n const t = this.frameState;\n if (!t)\n return null;\n const i = this.getLayer(), r = Ar(\n t.pixelToCoordinateTransform,\n e.slice()\n ), s = i.getExtent();\n if (s && !Kf(s, r))\n return null;\n const a = t.pixelRatio, o = t.viewState.projection, l = t.viewState, c = i.getRenderSource(), h = c.getTileGridForProjection(l.projection), u = c.getTilePixelRatio(t.pixelRatio);\n for (let f = h.getZForResolution(l.resolution); f >= h.getMinZoom(); --f) {\n const d = h.getTileCoordForCoordAndZ(r, f), p = c.getTile(\n f,\n d[1],\n d[2],\n a,\n o\n );\n if (!(p instanceof iv || p instanceof Du) || p instanceof Du && p.getState() === Qe.EMPTY)\n return null;\n if (p.getState() !== Qe.LOADED)\n continue;\n const g = h.getOrigin(f), m = sn(h.getTileSize(f)), v = h.getResolution(f), E = Math.floor(\n u * ((r[0] - g[0]) / v - d[1] * m[0])\n ), C = Math.floor(\n u * ((g[1] - r[1]) / v - d[2] * m[1])\n ), T = Math.round(\n u * c.getGutterForProjection(l.projection)\n );\n return this.getImageData(p.getImage(), E + T, C + T);\n }\n return null;\n }\n /**\n * @param {Object>} tiles Lookup of loaded tiles by zoom level.\n * @param {number} zoom Zoom level.\n * @param {import(\"../../Tile.js\").default} tile Tile.\n * @return {boolean|void} If `false`, the tile will not be considered loaded.\n */\n loadedTileCallback(e, t, i) {\n return this.isDrawableTile(i) ? super.loadedTileCallback(e, t, i) : !1;\n }\n /**\n * Determine whether render should be called.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @return {boolean} Layer is ready to be rendered.\n */\n prepareFrame(e) {\n return !!this.getLayer().getSource();\n }\n /**\n * Render the layer.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {HTMLElement} target Target that may be used to render content to.\n * @return {HTMLElement} The rendered element.\n */\n renderFrame(e, t) {\n const i = e.layerStatesArray[e.layerIndex], r = e.viewState, s = r.projection, a = r.resolution, o = r.center, l = r.rotation, c = e.pixelRatio, h = this.getLayer(), u = h.getSource(), f = u.getRevision(), d = u.getTileGridForProjection(s), p = d.getZForResolution(a, u.zDirection), g = d.getResolution(p);\n let m = e.extent;\n const v = e.viewState.resolution, E = u.getTilePixelRatio(c), C = Math.round(Ui(m) / v * c), T = Math.round(gs(m) / v * c), R = i.extent && ha(i.extent, s);\n R && (m = fo(\n m,\n ha(i.extent, s)\n ));\n const x = g * C / 2 / E, S = g * T / 2 / E, M = [\n o[0] - x,\n o[1] - S,\n o[0] + x,\n o[1] + S\n ], N = d.getTileRangeForExtentAndZ(m, p), F = {};\n F[p] = {};\n const U = this.createLoadedTileFinder(\n u,\n s,\n F\n ), H = this.tmpExtent, q = this.tmpTileRange_;\n this.newTiles_ = !1;\n const Z = l ? yu(\n r.center,\n v,\n l,\n e.size\n ) : void 0;\n for (let ee = N.minX; ee <= N.maxX; ++ee)\n for (let _e = N.minY; _e <= N.maxY; ++_e) {\n if (l && !d.tileCoordIntersectsViewport([p, ee, _e], Z))\n continue;\n const Oe = this.getTile(p, ee, _e, e);\n if (this.isDrawableTile(Oe)) {\n const Te = fr(this);\n if (Oe.getState() == Qe.LOADED) {\n F[p][Oe.tileCoord.toString()] = Oe;\n let Fe = Oe.inTransition(Te);\n Fe && i.opacity !== 1 && (Oe.endTransition(Te), Fe = !1), !this.newTiles_ && (Fe || !this.renderedTiles.includes(Oe)) && (this.newTiles_ = !0);\n }\n if (Oe.getAlpha(Te, e.time) === 1)\n continue;\n }\n const ze = d.getTileCoordChildTileRange(\n Oe.tileCoord,\n q,\n H\n );\n let fe = !1;\n ze && (fe = U(p + 1, ze)), fe || d.forEachTileCoordParentTileRange(\n Oe.tileCoord,\n U,\n q,\n H\n );\n }\n const k = g / a * c / E;\n Ao(\n this.pixelTransform,\n e.size[0] / 2,\n e.size[1] / 2,\n 1 / c,\n 1 / c,\n l,\n -C / 2,\n -T / 2\n );\n const Q = Z2(this.pixelTransform);\n this.useContainer(t, Q, this.getBackground(e));\n const ce = this.context, de = ce.canvas;\n yE(this.inversePixelTransform, this.pixelTransform), Ao(\n this.tempTransform,\n C / 2,\n T / 2,\n k,\n k,\n 0,\n -C / 2,\n -T / 2\n ), de.width != C || de.height != T ? (de.width = C, de.height = T) : this.containerReused || ce.clearRect(0, 0, C, T), R && this.clipUnrotated(ce, e, R), u.getInterpolate() || (ce.imageSmoothingEnabled = !1), this.preRender(ce, e), this.renderedTiles.length = 0;\n let j = Object.keys(F).map(Number);\n j.sort(Gf);\n let J, O, G;\n i.opacity === 1 && (!this.containerReused || u.getOpaque(e.viewState.projection)) ? j = j.reverse() : (J = [], O = []);\n for (let ee = j.length - 1; ee >= 0; --ee) {\n const _e = j[ee], Oe = u.getTilePixelSize(\n _e,\n c,\n s\n ), fe = d.getResolution(_e) / g, Te = Oe[0] * fe * k, Fe = Oe[1] * fe * k, Se = d.getTileCoordForCoordAndZ(\n Bn(M),\n _e\n ), qe = d.getTileCoordExtent(Se), ue = Ar(this.tempTransform, [\n E * (qe[0] - M[0]) / g,\n E * (M[3] - qe[3]) / g\n ]), Ye = E * u.getGutterForProjection(s), lt = F[_e];\n for (const Ut in lt) {\n const Ct = (\n /** @type {import(\"../../ImageTile.js\").default} */\n lt[Ut]\n ), Bi = Ct.tileCoord, hi = Se[1] - Bi[1], Es = Math.round(ue[0] - (hi - 1) * Te), Vr = Se[2] - Bi[2], vs = Math.round(ue[1] - (Vr - 1) * Fe), ki = Math.round(ue[0] - hi * Te), cr = Math.round(ue[1] - Vr * Fe), Rr = Es - ki, Sr = vs - cr, Ts = p === _e, xs = Ts && Ct.getAlpha(fr(this), e.time) !== 1;\n let yr = !1;\n if (!xs)\n if (J) {\n G = [ki, cr, ki + Rr, cr, ki + Rr, cr + Sr, ki, cr + Sr];\n for (let Br = 0, gn = J.length; Br < gn; ++Br)\n if (p !== _e && _e < O[Br]) {\n const Mi = J[Br];\n Jo(\n [ki, cr, ki + Rr, cr + Sr],\n [Mi[0], Mi[3], Mi[4], Mi[7]]\n ) && (yr || (ce.save(), yr = !0), ce.beginPath(), ce.moveTo(G[0], G[1]), ce.lineTo(G[2], G[3]), ce.lineTo(G[4], G[5]), ce.lineTo(G[6], G[7]), ce.moveTo(Mi[6], Mi[7]), ce.lineTo(Mi[4], Mi[5]), ce.lineTo(Mi[2], Mi[3]), ce.lineTo(Mi[0], Mi[1]), ce.clip());\n }\n J.push(G), O.push(_e);\n } else\n ce.clearRect(ki, cr, Rr, Sr);\n this.drawTileImage(\n Ct,\n e,\n ki,\n cr,\n Rr,\n Sr,\n Ye,\n Ts\n ), J && !xs ? (yr && ce.restore(), this.renderedTiles.unshift(Ct)) : this.renderedTiles.push(Ct), this.updateUsedTiles(e.usedTiles, u, Ct);\n }\n }\n return this.renderedRevision = f, this.renderedResolution = g, this.extentChanged = !this.renderedExtent_ || !Cu(this.renderedExtent_, M), this.renderedExtent_ = M, this.renderedPixelRatio = c, this.renderedProjection = s, this.manageTilePyramid(\n e,\n u,\n d,\n c,\n s,\n m,\n p,\n h.getPreload()\n ), this.scheduleExpireCache(e, u), this.postRender(ce, e), i.extent && ce.restore(), ce.imageSmoothingEnabled = !0, Q !== de.style.transform && (de.style.transform = Q), this.container;\n }\n /**\n * @param {import(\"../../ImageTile.js\").default} tile Tile.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {number} x Left of the tile.\n * @param {number} y Top of the tile.\n * @param {number} w Width of the tile.\n * @param {number} h Height of the tile.\n * @param {number} gutter Tile gutter.\n * @param {boolean} transition Apply an alpha transition.\n */\n drawTileImage(e, t, i, r, s, a, o, l) {\n const c = this.getTileImage(e);\n if (!c)\n return;\n const h = fr(this), u = t.layerStatesArray[t.layerIndex], f = u.opacity * (l ? e.getAlpha(h, t.time) : 1), d = f !== this.context.globalAlpha;\n d && (this.context.save(), this.context.globalAlpha = f), this.context.drawImage(\n c,\n o,\n o,\n c.width - 2 * o,\n c.height - 2 * o,\n i,\n r,\n s,\n a\n ), d && this.context.restore(), f !== u.opacity ? t.animate = !0 : l && e.endTransition(h);\n }\n /**\n * @return {HTMLCanvasElement} Image\n */\n getImage() {\n const e = this.context;\n return e ? e.canvas : null;\n }\n /**\n * Get the image from a tile.\n * @param {import(\"../../ImageTile.js\").default} tile Tile.\n * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image.\n * @protected\n */\n getTileImage(e) {\n return e.getImage();\n }\n /**\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {import(\"../../source/Tile.js\").default} tileSource Tile source.\n * @protected\n */\n scheduleExpireCache(e, t) {\n if (t.canExpireCache()) {\n const i = (function(r, s, a) {\n const o = fr(r);\n o in a.usedTiles && r.expireCache(\n a.viewState.projection,\n a.usedTiles[o]\n );\n }).bind(null, t);\n e.postRenderFunctions.push(\n /** @type {import(\"../../Map.js\").PostRenderFunction} */\n i\n );\n }\n }\n /**\n * @param {!Object>} usedTiles Used tiles.\n * @param {import(\"../../source/Tile.js\").default} tileSource Tile source.\n * @param {import('../../Tile.js').default} tile Tile.\n * @protected\n */\n updateUsedTiles(e, t, i) {\n const r = fr(t);\n r in e || (e[r] = {}), e[r][i.getKey()] = !0;\n }\n /**\n * Manage tile pyramid.\n * This function performs a number of functions related to the tiles at the\n * current zoom and lower zoom levels:\n * - registers idle tiles in frameState.wantedTiles so that they are not\n * discarded by the tile queue\n * - enqueues missing tiles\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {import(\"../../source/Tile.js\").default} tileSource Tile source.\n * @param {import(\"../../tilegrid/TileGrid.js\").default} tileGrid Tile grid.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../../proj/Projection.js\").default} projection Projection.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @param {number} currentZ Current Z.\n * @param {number} preload Load low resolution tiles up to `preload` levels.\n * @param {function(import(\"../../Tile.js\").default):void} [tileCallback] Tile callback.\n * @protected\n */\n manageTilePyramid(e, t, i, r, s, a, o, l, c) {\n const h = fr(t);\n h in e.wantedTiles || (e.wantedTiles[h] = {});\n const u = e.wantedTiles[h], f = e.tileQueue, d = i.getMinZoom(), p = e.viewState.rotation, g = p ? yu(\n e.viewState.center,\n e.viewState.resolution,\n p,\n e.size\n ) : void 0;\n let m = 0, v, E, C, T, R, x;\n for (x = d; x <= o; ++x)\n for (E = i.getTileRangeForExtentAndZ(a, x, E), C = i.getResolution(x), T = E.minX; T <= E.maxX; ++T)\n for (R = E.minY; R <= E.maxY; ++R)\n p && !i.tileCoordIntersectsViewport([x, T, R], g) || (o - x <= l ? (++m, v = t.getTile(x, T, R, r, s), v.getState() == Qe.IDLE && (u[v.getKey()] = !0, f.isKeyQueued(v.getKey()) || f.enqueue([\n v,\n h,\n i.getTileCoordCenter(v.tileCoord),\n C\n ])), c !== void 0 && c(v)) : t.useTile(x, T, R, s));\n t.updateCacheSize(m, s);\n }\n}\nclass I3 extends d3 {\n /**\n * @param {import(\"./BaseTile.js\").Options} [options] Tile layer options.\n */\n constructor(e) {\n super(e);\n }\n createRenderer() {\n return new y3(this);\n }\n}\nconst rv = I3;\nclass b3 {\n /**\n * @param {number} [highWaterMark] High water mark.\n */\n constructor(e) {\n this.highWaterMark = e !== void 0 ? e : 2048, this.count_ = 0, this.entries_ = {}, this.oldest_ = null, this.newest_ = null;\n }\n /**\n * @return {boolean} Can expire cache.\n */\n canExpireCache() {\n return this.highWaterMark > 0 && this.getCount() > this.highWaterMark;\n }\n /**\n * Expire the cache.\n * @param {!Object} [keep] Keys to keep. To be implemented by subclasses.\n */\n expireCache(e) {\n for (; this.canExpireCache(); )\n this.pop();\n }\n /**\n * FIXME empty description for jsdoc\n */\n clear() {\n this.count_ = 0, this.entries_ = {}, this.oldest_ = null, this.newest_ = null;\n }\n /**\n * @param {string} key Key.\n * @return {boolean} Contains key.\n */\n containsKey(e) {\n return this.entries_.hasOwnProperty(e);\n }\n /**\n * @param {function(T, string, LRUCache): ?} f The function\n * to call for every entry from the oldest to the newer. This function takes\n * 3 arguments (the entry value, the entry key and the LRUCache object).\n * The return value is ignored.\n */\n forEach(e) {\n let t = this.oldest_;\n for (; t; )\n e(t.value_, t.key_, this), t = t.newer;\n }\n /**\n * @param {string} key Key.\n * @param {*} [options] Options (reserved for subclasses).\n * @return {T} Value.\n */\n get(e, t) {\n const i = this.entries_[e];\n return Kt(i !== void 0, 15), i === this.newest_ || (i === this.oldest_ ? (this.oldest_ = /** @type {Entry} */\n this.oldest_.newer, this.oldest_.older = null) : (i.newer.older = i.older, i.older.newer = i.newer), i.newer = null, i.older = this.newest_, this.newest_.newer = i, this.newest_ = i), i.value_;\n }\n /**\n * Remove an entry from the cache.\n * @param {string} key The entry key.\n * @return {T} The removed entry.\n */\n remove(e) {\n const t = this.entries_[e];\n return Kt(t !== void 0, 15), t === this.newest_ ? (this.newest_ = /** @type {Entry} */\n t.older, this.newest_ && (this.newest_.newer = null)) : t === this.oldest_ ? (this.oldest_ = /** @type {Entry} */\n t.newer, this.oldest_ && (this.oldest_.older = null)) : (t.newer.older = t.older, t.older.newer = t.newer), delete this.entries_[e], --this.count_, t.value_;\n }\n /**\n * @return {number} Count.\n */\n getCount() {\n return this.count_;\n }\n /**\n * @return {Array} Keys.\n */\n getKeys() {\n const e = new Array(this.count_);\n let t = 0, i;\n for (i = this.newest_; i; i = i.older)\n e[t++] = i.key_;\n return e;\n }\n /**\n * @return {Array} Values.\n */\n getValues() {\n const e = new Array(this.count_);\n let t = 0, i;\n for (i = this.newest_; i; i = i.older)\n e[t++] = i.value_;\n return e;\n }\n /**\n * @return {T} Last value.\n */\n peekLast() {\n return this.oldest_.value_;\n }\n /**\n * @return {string} Last key.\n */\n peekLastKey() {\n return this.oldest_.key_;\n }\n /**\n * Get the key of the newest item in the cache. Throws if the cache is empty.\n * @return {string} The newest key.\n */\n peekFirstKey() {\n return this.newest_.key_;\n }\n /**\n * Return an entry without updating least recently used time.\n * @param {string} key Key.\n * @return {T} Value.\n */\n peek(e) {\n if (this.containsKey(e))\n return this.entries_[e].value_;\n }\n /**\n * @return {T} value Value.\n */\n pop() {\n const e = this.oldest_;\n return delete this.entries_[e.key_], e.newer && (e.newer.older = null), this.oldest_ = /** @type {Entry} */\n e.newer, this.oldest_ || (this.newest_ = null), --this.count_, e.value_;\n }\n /**\n * @param {string} key Key.\n * @param {T} value Value.\n */\n replace(e, t) {\n this.get(e), this.entries_[e].value_ = t;\n }\n /**\n * @param {string} key Key.\n * @param {T} value Value.\n */\n set(e, t) {\n Kt(!(e in this.entries_), 16);\n const i = {\n key_: e,\n newer: null,\n older: this.newest_,\n value_: t\n };\n this.newest_ ? this.newest_.newer = i : this.oldest_ = i, this.newest_ = i, this.entries_[e] = i, ++this.count_;\n }\n /**\n * Set a maximum number of entries for the cache.\n * @param {number} size Cache size.\n * @api\n */\n setSize(e) {\n this.highWaterMark = e;\n }\n}\nfunction Bm(n, e, t, i) {\n return i !== void 0 ? (i[0] = n, i[1] = e, i[2] = t, i) : [n, e, t];\n}\nfunction sh(n, e, t) {\n return n + \"/\" + e + \"/\" + t;\n}\nfunction sv(n) {\n return sh(n[0], n[1], n[2]);\n}\nfunction A3(n) {\n return n.split(\"/\").map(Number);\n}\nfunction M3(n) {\n return (n[1] << n[0]) + n[2];\n}\nfunction P3(n, e) {\n const t = n[0], i = n[1], r = n[2];\n if (e.getMinZoom() > t || t > e.getMaxZoom())\n return !1;\n const s = e.getFullTileRange(t);\n return s ? s.containsXY(i, r) : !0;\n}\nclass nv extends b3 {\n clear() {\n for (; this.getCount() > 0; )\n this.pop().release();\n super.clear();\n }\n /**\n * @param {!Object} usedTiles Used tiles.\n */\n expireCache(e) {\n for (; this.canExpireCache() && !(this.peekLast().getKey() in e); )\n this.pop().release();\n }\n /**\n * Prune all tiles from the cache that don't have the same z as the newest tile.\n */\n pruneExceptNewestZ() {\n if (this.getCount() === 0)\n return;\n const e = this.peekFirstKey(), i = A3(e)[0];\n this.forEach((r) => {\n r.tileCoord[0] !== i && (this.remove(sv(r.tileCoord)), r.release());\n });\n }\n}\nconst nu = {\n /**\n * Triggered when a tile starts loading.\n * @event module:ol/source/Tile.TileSourceEvent#tileloadstart\n * @api\n */\n TILELOADSTART: \"tileloadstart\",\n /**\n * Triggered when a tile finishes loading, either when its data is loaded,\n * or when loading was aborted because the tile is no longer needed.\n * @event module:ol/source/Tile.TileSourceEvent#tileloadend\n * @api\n */\n TILELOADEND: \"tileloadend\",\n /**\n * Triggered if tile loading results in an error. Note that this is not the\n * right place to re-fetch tiles. See {@link module:ol/ImageTile~ImageTile#load}\n * for details.\n * @event module:ol/source/Tile.TileSourceEvent#tileloaderror\n * @api\n */\n TILELOADERROR: \"tileloaderror\"\n};\nclass O3 extends Ws {\n /**\n * @param {Options} options Source options.\n */\n constructor(e) {\n super(), this.projection = Lr(e.projection), this.attributions_ = km(e.attributions), this.attributionsCollapsible_ = e.attributionsCollapsible !== void 0 ? e.attributionsCollapsible : !0, this.loading = !1, this.state_ = e.state !== void 0 ? e.state : \"ready\", this.wrapX_ = e.wrapX !== void 0 ? e.wrapX : !1, this.interpolate_ = !!e.interpolate, this.viewResolver = null, this.viewRejector = null;\n const t = this;\n this.viewPromise_ = new Promise(function(i, r) {\n t.viewResolver = i, t.viewRejector = r;\n });\n }\n /**\n * Get the attribution function for the source.\n * @return {?Attribution} Attribution function.\n * @api\n */\n getAttributions() {\n return this.attributions_;\n }\n /**\n * @return {boolean} Attributions are collapsible.\n * @api\n */\n getAttributionsCollapsible() {\n return this.attributionsCollapsible_;\n }\n /**\n * Get the projection of the source.\n * @return {import(\"../proj/Projection.js\").default|null} Projection.\n * @api\n */\n getProjection() {\n return this.projection;\n }\n /**\n * @param {import(\"../proj/Projection\").default} [projection] Projection.\n * @return {Array|null} Resolutions.\n */\n getResolutions(e) {\n return null;\n }\n /**\n * @return {Promise} A promise for view-related properties.\n */\n getView() {\n return this.viewPromise_;\n }\n /**\n * Get the state of the source, see {@link import(\"./Source.js\").State} for possible states.\n * @return {import(\"./Source.js\").State} State.\n * @api\n */\n getState() {\n return this.state_;\n }\n /**\n * @return {boolean|undefined} Wrap X.\n */\n getWrapX() {\n return this.wrapX_;\n }\n /**\n * @return {boolean} Use linear interpolation when resampling.\n */\n getInterpolate() {\n return this.interpolate_;\n }\n /**\n * Refreshes the source. The source will be cleared, and data from the server will be reloaded.\n * @api\n */\n refresh() {\n this.changed();\n }\n /**\n * Set the attributions of the source.\n * @param {AttributionLike|undefined} attributions Attributions.\n * Can be passed as `string`, `Array`, {@link module:ol/source/Source~Attribution},\n * or `undefined`.\n * @api\n */\n setAttributions(e) {\n this.attributions_ = km(e), this.changed();\n }\n /**\n * Set the state of the source.\n * @param {import(\"./Source.js\").State} state State.\n */\n setState(e) {\n this.state_ = e, this.changed();\n }\n}\nfunction km(n) {\n return n ? Array.isArray(n) ? function(e) {\n return n;\n } : typeof n == \"function\" ? n : function(e) {\n return [n];\n } : null;\n}\nconst sa = [0, 0, 0], Qs = 5;\nclass D3 {\n /**\n * @param {Options} options Tile grid options.\n */\n constructor(e) {\n this.minZoom = e.minZoom !== void 0 ? e.minZoom : 0, this.resolutions_ = e.resolutions, Kt(\n V2(\n this.resolutions_,\n function(r, s) {\n return s - r;\n },\n !0\n ),\n 17\n );\n let t;\n if (!e.origins) {\n for (let r = 0, s = this.resolutions_.length - 1; r < s; ++r)\n if (!t)\n t = this.resolutions_[r] / this.resolutions_[r + 1];\n else if (this.resolutions_[r] / this.resolutions_[r + 1] !== t) {\n t = void 0;\n break;\n }\n }\n this.zoomFactor_ = t, this.maxZoom = this.resolutions_.length - 1, this.origin_ = e.origin !== void 0 ? e.origin : null, this.origins_ = null, e.origins !== void 0 && (this.origins_ = e.origins, Kt(this.origins_.length == this.resolutions_.length, 20));\n const i = e.extent;\n i !== void 0 && !this.origin_ && !this.origins_ && (this.origin_ = Bn(i)), Kt(\n !this.origin_ && this.origins_ || this.origin_ && !this.origins_,\n 18\n ), this.tileSizes_ = null, e.tileSizes !== void 0 && (this.tileSizes_ = e.tileSizes, Kt(this.tileSizes_.length == this.resolutions_.length, 19)), this.tileSize_ = e.tileSize !== void 0 ? e.tileSize : this.tileSizes_ ? null : qf, Kt(\n !this.tileSize_ && this.tileSizes_ || this.tileSize_ && !this.tileSizes_,\n 22\n ), this.extent_ = i !== void 0 ? i : null, this.fullTileRanges_ = null, this.tmpSize_ = [0, 0], this.tmpExtent_ = [0, 0, 0, 0], e.sizes !== void 0 ? this.fullTileRanges_ = e.sizes.map(function(r, s) {\n const a = new ud(\n Math.min(0, r[0]),\n Math.max(r[0] - 1, -1),\n Math.min(0, r[1]),\n Math.max(r[1] - 1, -1)\n );\n if (i) {\n const o = this.getTileRangeForExtentAndZ(i, s);\n a.minX = Math.max(o.minX, a.minX), a.maxX = Math.min(o.maxX, a.maxX), a.minY = Math.max(o.minY, a.minY), a.maxY = Math.min(o.maxY, a.maxY);\n }\n return a;\n }, this) : i && this.calculateTileRanges_(i);\n }\n /**\n * Call a function with each tile coordinate for a given extent and zoom level.\n *\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {number} zoom Integer zoom level.\n * @param {function(import(\"../tilecoord.js\").TileCoord): void} callback Function called with each tile coordinate.\n * @api\n */\n forEachTileCoord(e, t, i) {\n const r = this.getTileRangeForExtentAndZ(e, t);\n for (let s = r.minX, a = r.maxX; s <= a; ++s)\n for (let o = r.minY, l = r.maxY; o <= l; ++o)\n i([t, s, o]);\n }\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {function(number, import(\"../TileRange.js\").default): boolean} callback Callback.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary import(\"../TileRange.js\").default object.\n * @param {import(\"../extent.js\").Extent} [tempExtent] Temporary import(\"../extent.js\").Extent object.\n * @return {boolean} Callback succeeded.\n */\n forEachTileCoordParentTileRange(e, t, i, r) {\n let s, a, o, l = null, c = e[0] - 1;\n for (this.zoomFactor_ === 2 ? (a = e[1], o = e[2]) : l = this.getTileCoordExtent(e, r); c >= this.minZoom; ) {\n if (this.zoomFactor_ === 2 ? (a = Math.floor(a / 2), o = Math.floor(o / 2), s = ra(a, a, o, o, i)) : s = this.getTileRangeForExtentAndZ(\n l,\n c,\n i\n ), t(c, s))\n return !0;\n --c;\n }\n return !1;\n }\n /**\n * Get the extent for this tile grid, if it was configured.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getExtent() {\n return this.extent_;\n }\n /**\n * Get the maximum zoom level for the grid.\n * @return {number} Max zoom.\n * @api\n */\n getMaxZoom() {\n return this.maxZoom;\n }\n /**\n * Get the minimum zoom level for the grid.\n * @return {number} Min zoom.\n * @api\n */\n getMinZoom() {\n return this.minZoom;\n }\n /**\n * Get the origin for the grid at the given zoom level.\n * @param {number} z Integer zoom level.\n * @return {import(\"../coordinate.js\").Coordinate} Origin.\n * @api\n */\n getOrigin(e) {\n return this.origin_ ? this.origin_ : this.origins_[e];\n }\n /**\n * Get the resolution for the given zoom level.\n * @param {number} z Integer zoom level.\n * @return {number} Resolution.\n * @api\n */\n getResolution(e) {\n return this.resolutions_[e];\n }\n /**\n * Get the list of resolutions for the tile grid.\n * @return {Array} Resolutions.\n * @api\n */\n getResolutions() {\n return this.resolutions_;\n }\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary import(\"../TileRange.js\").default object.\n * @param {import(\"../extent.js\").Extent} [tempExtent] Temporary import(\"../extent.js\").Extent object.\n * @return {import(\"../TileRange.js\").default|null} Tile range.\n */\n getTileCoordChildTileRange(e, t, i) {\n if (e[0] < this.maxZoom) {\n if (this.zoomFactor_ === 2) {\n const s = e[1] * 2, a = e[2] * 2;\n return ra(\n s,\n s + 1,\n a,\n a + 1,\n t\n );\n }\n const r = this.getTileCoordExtent(\n e,\n i || this.tmpExtent_\n );\n return this.getTileRangeForExtentAndZ(\n r,\n e[0] + 1,\n t\n );\n }\n return null;\n }\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {number} z Integer zoom level.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary import(\"../TileRange.js\").default object.\n * @return {import(\"../TileRange.js\").default|null} Tile range.\n */\n getTileRangeForTileCoordAndZ(e, t, i) {\n if (t > this.maxZoom || t < this.minZoom)\n return null;\n const r = e[0], s = e[1], a = e[2];\n if (t === r)\n return ra(\n s,\n a,\n s,\n a,\n i\n );\n if (this.zoomFactor_) {\n const l = Math.pow(this.zoomFactor_, t - r), c = Math.floor(s * l), h = Math.floor(a * l);\n if (t < r)\n return ra(c, c, h, h, i);\n const u = Math.floor(l * (s + 1)) - 1, f = Math.floor(l * (a + 1)) - 1;\n return ra(c, u, h, f, i);\n }\n const o = this.getTileCoordExtent(e, this.tmpExtent_);\n return this.getTileRangeForExtentAndZ(o, t, i);\n }\n /**\n * Get a tile range for the given extent and integer zoom level.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {number} z Integer zoom level.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary tile range object.\n * @return {import(\"../TileRange.js\").default} Tile range.\n */\n getTileRangeForExtentAndZ(e, t, i) {\n this.getTileCoordForXYAndZ_(e[0], e[3], t, !1, sa);\n const r = sa[1], s = sa[2];\n this.getTileCoordForXYAndZ_(e[2], e[1], t, !0, sa);\n const a = sa[1], o = sa[2];\n return ra(r, a, s, o, i);\n }\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @return {import(\"../coordinate.js\").Coordinate} Tile center.\n */\n getTileCoordCenter(e) {\n const t = this.getOrigin(e[0]), i = this.getResolution(e[0]), r = sn(this.getTileSize(e[0]), this.tmpSize_);\n return [\n t[0] + (e[1] + 0.5) * r[0] * i,\n t[1] - (e[2] + 0.5) * r[1] * i\n ];\n }\n /**\n * Get the extent of a tile coordinate.\n *\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"../extent.js\").Extent} [tempExtent] Temporary extent object.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getTileCoordExtent(e, t) {\n const i = this.getOrigin(e[0]), r = this.getResolution(e[0]), s = sn(this.getTileSize(e[0]), this.tmpSize_), a = i[0] + e[1] * s[0] * r, o = i[1] - (e[2] + 1) * s[1] * r, l = a + s[0] * r, c = o + s[1] * r;\n return Ha(a, o, l, c, t);\n }\n /**\n * Get the tile coordinate for the given map coordinate and resolution. This\n * method considers that coordinates that intersect tile boundaries should be\n * assigned the higher tile coordinate.\n *\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {number} resolution Resolution.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Destination import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @api\n */\n getTileCoordForCoordAndResolution(e, t, i) {\n return this.getTileCoordForXYAndResolution_(\n e[0],\n e[1],\n t,\n !1,\n i\n );\n }\n /**\n * Note that this method should not be called for resolutions that correspond\n * to an integer zoom level. Instead call the `getTileCoordForXYAndZ_` method.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {number} resolution Resolution (for a non-integer zoom level).\n * @param {boolean} reverseIntersectionPolicy Instead of letting edge\n * intersections go to the higher tile coordinate, let edge intersections\n * go to the lower tile coordinate.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Temporary import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @private\n */\n getTileCoordForXYAndResolution_(e, t, i, r, s) {\n const a = this.getZForResolution(i), o = i / this.getResolution(a), l = this.getOrigin(a), c = sn(this.getTileSize(a), this.tmpSize_);\n let h = o * (e - l[0]) / i / c[0], u = o * (l[1] - t) / i / c[1];\n return r ? (h = xl(h, Qs) - 1, u = xl(u, Qs) - 1) : (h = Tl(h, Qs), u = Tl(u, Qs)), Bm(a, h, u, s);\n }\n /**\n * Although there is repetition between this method and `getTileCoordForXYAndResolution_`,\n * they should have separate implementations. This method is for integer zoom\n * levels. The other method should only be called for resolutions corresponding\n * to non-integer zoom levels.\n * @param {number} x Map x coordinate.\n * @param {number} y Map y coordinate.\n * @param {number} z Integer zoom level.\n * @param {boolean} reverseIntersectionPolicy Instead of letting edge\n * intersections go to the higher tile coordinate, let edge intersections\n * go to the lower tile coordinate.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Temporary import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @private\n */\n getTileCoordForXYAndZ_(e, t, i, r, s) {\n const a = this.getOrigin(i), o = this.getResolution(i), l = sn(this.getTileSize(i), this.tmpSize_);\n let c = (e - a[0]) / o / l[0], h = (a[1] - t) / o / l[1];\n return r ? (c = xl(c, Qs) - 1, h = xl(h, Qs) - 1) : (c = Tl(c, Qs), h = Tl(h, Qs)), Bm(i, c, h, s);\n }\n /**\n * Get a tile coordinate given a map coordinate and zoom level.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {number} z Zoom level.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Destination import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @api\n */\n getTileCoordForCoordAndZ(e, t, i) {\n return this.getTileCoordForXYAndZ_(\n e[0],\n e[1],\n t,\n !1,\n i\n );\n }\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @return {number} Tile resolution.\n */\n getTileCoordResolution(e) {\n return this.resolutions_[e[0]];\n }\n /**\n * Get the tile size for a zoom level. The type of the return value matches the\n * `tileSize` or `tileSizes` that the tile grid was configured with. To always\n * get an {@link import(\"../size.js\").Size}, run the result through {@link module:ol/size.toSize}.\n * @param {number} z Z.\n * @return {number|import(\"../size.js\").Size} Tile size.\n * @api\n */\n getTileSize(e) {\n return this.tileSize_ ? this.tileSize_ : this.tileSizes_[e];\n }\n /**\n * @param {number} z Zoom level.\n * @return {import(\"../TileRange.js\").default} Extent tile range for the specified zoom level.\n */\n getFullTileRange(e) {\n return this.fullTileRanges_ ? this.fullTileRanges_[e] : this.extent_ ? this.getTileRangeForExtentAndZ(this.extent_, e) : null;\n }\n /**\n * @param {number} resolution Resolution.\n * @param {number|import(\"../array.js\").NearestDirectionFunction} [opt_direction]\n * If 0, the nearest resolution will be used.\n * If 1, the nearest higher resolution (lower Z) will be used. If -1, the\n * nearest lower resolution (higher Z) will be used. Default is 0.\n * Use a {@link module:ol/array~NearestDirectionFunction} for more precise control.\n *\n * For example to change tile Z at the midpoint of zoom levels\n * ```js\n * function(value, high, low) {\n * return value - low * Math.sqrt(high / low);\n * }\n * ```\n * @return {number} Z.\n * @api\n */\n getZForResolution(e, t) {\n const i = Xf(\n this.resolutions_,\n e,\n t || 0\n );\n return Vi(i, this.minZoom, this.maxZoom);\n }\n /**\n * The tile with the provided tile coordinate intersects the given viewport.\n * @param {import('../tilecoord.js').TileCoord} tileCoord Tile coordinate.\n * @param {Array} viewport Viewport as returned from {@link module:ol/extent.getRotatedViewport}.\n * @return {boolean} The tile with the provided tile coordinate intersects the given viewport.\n */\n tileCoordIntersectsViewport(e, t) {\n return HE(\n t,\n 0,\n t.length,\n 2,\n this.getTileCoordExtent(e)\n );\n }\n /**\n * @param {!import(\"../extent.js\").Extent} extent Extent for this tile grid.\n * @private\n */\n calculateTileRanges_(e) {\n const t = this.resolutions_.length, i = new Array(t);\n for (let r = this.minZoom; r < t; ++r)\n i[r] = this.getTileRangeForExtentAndZ(e, r);\n this.fullTileRanges_ = i;\n }\n}\nconst av = D3;\nfunction ov(n) {\n let e = n.getDefaultTileGrid();\n return e || (e = w3(n), n.setDefaultTileGrid(e)), e;\n}\nfunction N3(n, e, t) {\n const i = e[0], r = n.getTileCoordCenter(e), s = fd(t);\n if (!Kf(s, r)) {\n const a = Ui(s), o = Math.ceil(\n (s[0] - r[0]) / a\n );\n return r[0] += a * o, n.getTileCoordForCoordAndZ(r, i);\n }\n return e;\n}\nfunction F3(n, e, t, i) {\n i = i !== void 0 ? i : \"top-left\";\n const r = lv(n, e, t);\n return new av({\n extent: n,\n origin: rw(n, i),\n resolutions: r,\n tileSize: t\n });\n}\nfunction L3(n) {\n const e = n || {}, t = e.extent || Lr(\"EPSG:3857\").getExtent(), i = {\n extent: t,\n minZoom: e.minZoom,\n tileSize: e.tileSize,\n resolutions: lv(\n t,\n e.maxZoom,\n e.tileSize,\n e.maxResolution\n )\n };\n return new av(i);\n}\nfunction lv(n, e, t, i) {\n e = e !== void 0 ? e : Ew, t = sn(t !== void 0 ? t : qf);\n const r = gs(n), s = Ui(n);\n i = i > 0 ? i : Math.max(s / t[0], r / t[1]);\n const a = e + 1, o = new Array(a);\n for (let l = 0; l < a; ++l)\n o[l] = i / Math.pow(2, l);\n return o;\n}\nfunction w3(n, e, t, i) {\n const r = fd(n);\n return F3(r, e, t, i);\n}\nfunction fd(n) {\n n = Lr(n);\n let e = n.getExtent();\n if (!e) {\n const t = 180 * Po.degrees / n.getMetersPerUnit();\n e = Ha(-t, -t, t, t);\n }\n return e;\n}\nclass U3 extends O3 {\n /**\n * @param {Options} options SourceTile source options.\n */\n constructor(e) {\n super({\n attributions: e.attributions,\n attributionsCollapsible: e.attributionsCollapsible,\n projection: e.projection,\n state: e.state,\n wrapX: e.wrapX,\n interpolate: e.interpolate\n }), this.on, this.once, this.un, this.opaque_ = e.opaque !== void 0 ? e.opaque : !1, this.tilePixelRatio_ = e.tilePixelRatio !== void 0 ? e.tilePixelRatio : 1, this.tileGrid = e.tileGrid !== void 0 ? e.tileGrid : null;\n const t = [256, 256];\n this.tileGrid && sn(this.tileGrid.getTileSize(this.tileGrid.getMinZoom()), t), this.tileCache = new nv(e.cacheSize || 0), this.tmpSize = [0, 0], this.key_ = e.key || \"\", this.tileOptions = {\n transition: e.transition,\n interpolate: e.interpolate\n }, this.zDirection = e.zDirection ? e.zDirection : 0;\n }\n /**\n * @return {boolean} Can expire cache.\n */\n canExpireCache() {\n return this.tileCache.canExpireCache();\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @param {!Object} usedTiles Used tiles.\n */\n expireCache(e, t) {\n const i = this.getTileCacheForProjection(e);\n i && i.expireCache(t);\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @param {number} z Zoom level.\n * @param {import(\"../TileRange.js\").default} tileRange Tile range.\n * @param {function(import(\"../Tile.js\").default):(boolean|void)} callback Called with each\n * loaded tile. If the callback returns `false`, the tile will not be\n * considered loaded.\n * @return {boolean} The tile range is fully covered with loaded tiles.\n */\n forEachLoadedTile(e, t, i, r) {\n const s = this.getTileCacheForProjection(e);\n if (!s)\n return !1;\n let a = !0, o, l, c;\n for (let h = i.minX; h <= i.maxX; ++h)\n for (let u = i.minY; u <= i.maxY; ++u)\n l = sh(t, h, u), c = !1, s.containsKey(l) && (o = /** @type {!import(\"../Tile.js\").default} */\n s.get(l), c = o.getState() === Qe.LOADED, c && (c = r(o) !== !1)), c || (a = !1);\n return a;\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {number} Gutter.\n */\n getGutterForProjection(e) {\n return 0;\n }\n /**\n * Return the key to be used for all tiles in the source.\n * @return {string} The key for all tiles.\n */\n getKey() {\n return this.key_;\n }\n /**\n * Set the value to be used as the key for all tiles in the source.\n * @param {string} key The key for tiles.\n * @protected\n */\n setKey(e) {\n this.key_ !== e && (this.key_ = e, this.changed());\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {boolean} Opaque.\n */\n getOpaque(e) {\n return this.opaque_;\n }\n /**\n * @param {import(\"../proj/Projection\").default} [projection] Projection.\n * @return {Array|null} Resolutions.\n */\n getResolutions(e) {\n const t = e ? this.getTileGridForProjection(e) : this.tileGrid;\n return t ? t.getResolutions() : null;\n }\n /**\n * @abstract\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!import(\"../Tile.js\").default} Tile.\n */\n getTile(e, t, i, r, s) {\n return di();\n }\n /**\n * Return the tile grid of the tile source.\n * @return {import(\"../tilegrid/TileGrid.js\").default|null} Tile grid.\n * @api\n */\n getTileGrid() {\n return this.tileGrid;\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!import(\"../tilegrid/TileGrid.js\").default} Tile grid.\n */\n getTileGridForProjection(e) {\n return this.tileGrid ? this.tileGrid : ov(e);\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {import(\"../TileCache.js\").default} Tile cache.\n * @protected\n */\n getTileCacheForProjection(e) {\n const t = this.getProjection();\n return Kt(\n t === null || aa(t, e),\n 68\n // A VectorTile source can only be rendered if it has a projection compatible with the view projection.\n ), this.tileCache;\n }\n /**\n * Get the tile pixel ratio for this source. Subclasses may override this\n * method, which is meant to return a supported pixel ratio that matches the\n * provided `pixelRatio` as close as possible.\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} Tile pixel ratio.\n */\n getTilePixelRatio(e) {\n return this.tilePixelRatio_;\n }\n /**\n * @param {number} z Z.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {import(\"../size.js\").Size} Tile size.\n */\n getTilePixelSize(e, t, i) {\n const r = this.getTileGridForProjection(i), s = this.getTilePixelRatio(t), a = sn(r.getTileSize(e), this.tmpSize);\n return s == 1 ? a : u3(a, s, this.tmpSize);\n }\n /**\n * Returns a tile coordinate wrapped around the x-axis. When the tile coordinate\n * is outside the resolution and extent range of the tile grid, `null` will be\n * returned.\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"../proj/Projection.js\").default} [projection] Projection.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate to be passed to the tileUrlFunction or\n * null if no tile URL should be created for the passed `tileCoord`.\n */\n getTileCoordForTileUrlFunction(e, t) {\n t = t !== void 0 ? t : this.getProjection();\n const i = this.getTileGridForProjection(t);\n return this.getWrapX() && t.isGlobal() && (e = N3(i, e, t)), P3(e, i) ? e : null;\n }\n /**\n * Remove all cached tiles from the source. The next render cycle will fetch new tiles.\n * @api\n */\n clear() {\n this.tileCache.clear();\n }\n refresh() {\n this.clear(), super.refresh();\n }\n /**\n * Increases the cache size if needed\n * @param {number} tileCount Minimum number of tiles needed.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n */\n updateCacheSize(e, t) {\n const i = this.getTileCacheForProjection(t);\n e > i.highWaterMark && (i.highWaterMark = e);\n }\n /**\n * Marks a tile coord as being used, without triggering a load.\n * @abstract\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n */\n useTile(e, t, i, r) {\n }\n}\nclass V3 extends pn {\n /**\n * @param {string} type Type.\n * @param {import(\"../Tile.js\").default} tile The tile.\n */\n constructor(e, t) {\n super(e), this.tile = t;\n }\n}\nfunction B3(n, e) {\n const t = /\\{z\\}/g, i = /\\{x\\}/g, r = /\\{y\\}/g, s = /\\{-y\\}/g;\n return (\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile Coordinate.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @return {string|undefined} Tile URL.\n */\n function(a, o, l) {\n if (a)\n return n.replace(t, a[0].toString()).replace(i, a[1].toString()).replace(r, a[2].toString()).replace(s, function() {\n const c = a[0], h = e.getFullTileRange(c);\n return Kt(h, 55), (h.getHeight() - a[2] - 1).toString();\n });\n }\n );\n}\nfunction k3(n, e) {\n const t = n.length, i = new Array(t);\n for (let r = 0; r < t; ++r)\n i[r] = B3(n[r], e);\n return z3(i);\n}\nfunction z3(n) {\n return n.length === 1 ? n[0] : (\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile Coordinate.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @return {string|undefined} Tile URL.\n */\n function(e, t, i) {\n if (!e)\n return;\n const r = M3(e), s = Ra(r, n.length);\n return n[s](e, t, i);\n }\n );\n}\nfunction W3(n) {\n const e = [];\n let t = /\\{([a-z])-([a-z])\\}/.exec(n);\n if (t) {\n const i = t[1].charCodeAt(0), r = t[2].charCodeAt(0);\n let s;\n for (s = i; s <= r; ++s)\n e.push(n.replace(t[0], String.fromCharCode(s)));\n return e;\n }\n if (t = /\\{(\\d+)-(\\d+)\\}/.exec(n), t) {\n const i = parseInt(t[2], 10);\n for (let r = parseInt(t[1], 10); r <= i; r++)\n e.push(n.replace(t[0], r.toString()));\n return e;\n }\n return e.push(n), e;\n}\nclass dd extends U3 {\n /**\n * @param {Options} options Image tile options.\n */\n constructor(e) {\n super({\n attributions: e.attributions,\n cacheSize: e.cacheSize,\n opaque: e.opaque,\n projection: e.projection,\n state: e.state,\n tileGrid: e.tileGrid,\n tilePixelRatio: e.tilePixelRatio,\n wrapX: e.wrapX,\n transition: e.transition,\n interpolate: e.interpolate,\n key: e.key,\n attributionsCollapsible: e.attributionsCollapsible,\n zDirection: e.zDirection\n }), this.generateTileUrlFunction_ = this.tileUrlFunction === dd.prototype.tileUrlFunction, this.tileLoadFunction = e.tileLoadFunction, e.tileUrlFunction && (this.tileUrlFunction = e.tileUrlFunction), this.urls = null, e.urls ? this.setUrls(e.urls) : e.url && this.setUrl(e.url), this.tileLoadingKeys_ = {};\n }\n /**\n * Return the tile load function of the source.\n * @return {import(\"../Tile.js\").LoadFunction} TileLoadFunction\n * @api\n */\n getTileLoadFunction() {\n return this.tileLoadFunction;\n }\n /**\n * Return the tile URL function of the source.\n * @return {import(\"../Tile.js\").UrlFunction} TileUrlFunction\n * @api\n */\n getTileUrlFunction() {\n return Object.getPrototypeOf(this).tileUrlFunction === this.tileUrlFunction ? this.tileUrlFunction.bind(this) : this.tileUrlFunction;\n }\n /**\n * Return the URLs used for this source.\n * When a tileUrlFunction is used instead of url or urls,\n * null will be returned.\n * @return {!Array|null} URLs.\n * @api\n */\n getUrls() {\n return this.urls;\n }\n /**\n * Handle tile change events.\n * @param {import(\"../events/Event.js\").default} event Event.\n * @protected\n */\n handleTileChange(e) {\n const t = (\n /** @type {import(\"../Tile.js\").default} */\n e.target\n ), i = fr(t), r = t.getState();\n let s;\n r == Qe.LOADING ? (this.tileLoadingKeys_[i] = !0, s = nu.TILELOADSTART) : i in this.tileLoadingKeys_ && (delete this.tileLoadingKeys_[i], s = r == Qe.ERROR ? nu.TILELOADERROR : r == Qe.LOADED ? nu.TILELOADEND : void 0), s != null && this.dispatchEvent(new V3(s, t));\n }\n /**\n * Set the tile load function of the source.\n * @param {import(\"../Tile.js\").LoadFunction} tileLoadFunction Tile load function.\n * @api\n */\n setTileLoadFunction(e) {\n this.tileCache.clear(), this.tileLoadFunction = e, this.changed();\n }\n /**\n * Set the tile URL function of the source.\n * @param {import(\"../Tile.js\").UrlFunction} tileUrlFunction Tile URL function.\n * @param {string} [key] Optional new tile key for the source.\n * @api\n */\n setTileUrlFunction(e, t) {\n this.tileUrlFunction = e, this.tileCache.pruneExceptNewestZ(), typeof t < \"u\" ? this.setKey(t) : this.changed();\n }\n /**\n * Set the URL to use for requests.\n * @param {string} url URL.\n * @api\n */\n setUrl(e) {\n const t = W3(e);\n this.urls = t, this.setUrls(t);\n }\n /**\n * Set the URLs to use for requests.\n * @param {Array} urls URLs.\n * @api\n */\n setUrls(e) {\n this.urls = e;\n const t = e.join(`\n`);\n this.generateTileUrlFunction_ ? this.setTileUrlFunction(k3(e, this.tileGrid), t) : this.setKey(t);\n }\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {string|undefined} Tile URL.\n */\n tileUrlFunction(e, t, i) {\n }\n /**\n * Marks a tile coord as being used, without triggering a load.\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n */\n useTile(e, t, i) {\n const r = sh(e, t, i);\n this.tileCache.containsKey(r) && this.tileCache.get(r);\n }\n}\nclass G3 extends dd {\n /**\n * @param {!Options} options Image tile options.\n */\n constructor(e) {\n super({\n attributions: e.attributions,\n cacheSize: e.cacheSize,\n opaque: e.opaque,\n projection: e.projection,\n state: e.state,\n tileGrid: e.tileGrid,\n tileLoadFunction: e.tileLoadFunction ? e.tileLoadFunction : X3,\n tilePixelRatio: e.tilePixelRatio,\n tileUrlFunction: e.tileUrlFunction,\n url: e.url,\n urls: e.urls,\n wrapX: e.wrapX,\n transition: e.transition,\n interpolate: e.interpolate !== void 0 ? e.interpolate : !0,\n key: e.key,\n attributionsCollapsible: e.attributionsCollapsible,\n zDirection: e.zDirection\n }), this.crossOrigin = e.crossOrigin !== void 0 ? e.crossOrigin : null, this.tileClass = e.tileClass !== void 0 ? e.tileClass : iv, this.tileCacheForProjection = {}, this.tileGridForProjection = {}, this.reprojectionErrorThreshold_ = e.reprojectionErrorThreshold, this.renderReprojectionEdges_ = !1;\n }\n /**\n * @return {boolean} Can expire cache.\n */\n canExpireCache() {\n if (this.tileCache.canExpireCache())\n return !0;\n for (const e in this.tileCacheForProjection)\n if (this.tileCacheForProjection[e].canExpireCache())\n return !0;\n return !1;\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @param {!Object} usedTiles Used tiles.\n */\n expireCache(e, t) {\n const i = this.getTileCacheForProjection(e);\n this.tileCache.expireCache(\n this.tileCache == i ? t : {}\n );\n for (const r in this.tileCacheForProjection) {\n const s = this.tileCacheForProjection[r];\n s.expireCache(s == i ? t : {});\n }\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {number} Gutter.\n */\n getGutterForProjection(e) {\n return this.getProjection() && e && !aa(this.getProjection(), e) ? 0 : this.getGutter();\n }\n /**\n * @return {number} Gutter.\n */\n getGutter() {\n return 0;\n }\n /**\n * Return the key to be used for all tiles in the source.\n * @return {string} The key for all tiles.\n */\n getKey() {\n let e = super.getKey();\n return this.getInterpolate() || (e += \":disable-interpolation\"), e;\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {boolean} Opaque.\n */\n getOpaque(e) {\n return this.getProjection() && e && !aa(this.getProjection(), e) ? !1 : super.getOpaque(e);\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!import(\"../tilegrid/TileGrid.js\").default} Tile grid.\n */\n getTileGridForProjection(e) {\n const t = this.getProjection();\n if (this.tileGrid && (!t || aa(t, e)))\n return this.tileGrid;\n const i = fr(e);\n return i in this.tileGridForProjection || (this.tileGridForProjection[i] = ov(e)), this.tileGridForProjection[i];\n }\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {import(\"../TileCache.js\").default} Tile cache.\n */\n getTileCacheForProjection(e) {\n const t = this.getProjection();\n if (!t || aa(t, e))\n return this.tileCache;\n const i = fr(e);\n return i in this.tileCacheForProjection || (this.tileCacheForProjection[i] = new nv(\n this.tileCache.highWaterMark\n )), this.tileCacheForProjection[i];\n }\n /**\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @param {string} key The key set on the tile.\n * @return {!ImageTile} Tile.\n * @private\n */\n createTile_(e, t, i, r, s, a) {\n const o = [e, t, i], l = this.getTileCoordForTileUrlFunction(\n o,\n s\n ), c = l ? this.tileUrlFunction(l, r, s) : void 0, h = new this.tileClass(\n o,\n c !== void 0 ? Qe.IDLE : Qe.EMPTY,\n c !== void 0 ? c : \"\",\n this.crossOrigin,\n this.tileLoadFunction,\n this.tileOptions\n );\n return h.key = a, h.addEventListener(St.CHANGE, this.handleTileChange.bind(this)), h;\n }\n /**\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!(ImageTile|ReprojTile)} Tile.\n */\n getTile(e, t, i, r, s) {\n const a = this.getProjection();\n if (!a || !s || aa(a, s))\n return this.getTileInternal(\n e,\n t,\n i,\n r,\n a || s\n );\n const o = this.getTileCacheForProjection(s), l = [e, t, i];\n let c;\n const h = sv(l);\n o.containsKey(h) && (c = o.get(h));\n const u = this.getKey();\n if (c && c.key == u)\n return c;\n const f = this.getTileGridForProjection(a), d = this.getTileGridForProjection(s), p = this.getTileCoordForTileUrlFunction(\n l,\n s\n ), g = new Du(\n a,\n f,\n s,\n d,\n l,\n p,\n this.getTilePixelRatio(r),\n this.getGutter(),\n (m, v, E, C) => this.getTileInternal(m, v, E, C, a),\n this.reprojectionErrorThreshold_,\n this.renderReprojectionEdges_,\n this.getInterpolate()\n );\n return g.key = u, c ? (g.interimTile = c, g.refreshInterimChain(), o.replace(h, g)) : o.set(h, g), g;\n }\n /**\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {number} pixelRatio Pixel ratio.\n * @param {!import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!ImageTile} Tile.\n * @protected\n */\n getTileInternal(e, t, i, r, s) {\n let a = null;\n const o = sh(e, t, i), l = this.getKey();\n if (!this.tileCache.containsKey(o))\n a = this.createTile_(e, t, i, r, s, l), this.tileCache.set(o, a);\n else if (a = this.tileCache.get(o), a.key != l) {\n const c = a;\n a = this.createTile_(e, t, i, r, s, l), c.getState() == Qe.IDLE ? a.interimTile = c.interimTile : a.interimTile = c, a.refreshInterimChain(), this.tileCache.replace(o, a);\n }\n return a;\n }\n /**\n * Sets whether to render reprojection edges or not (usually for debugging).\n * @param {boolean} render Render the edges.\n * @api\n */\n setRenderReprojectionEdges(e) {\n if (this.renderReprojectionEdges_ != e) {\n this.renderReprojectionEdges_ = e;\n for (const t in this.tileCacheForProjection)\n this.tileCacheForProjection[t].clear();\n this.changed();\n }\n }\n /**\n * Sets the tile grid to use when reprojecting the tiles to the given\n * projection instead of the default tile grid for the projection.\n *\n * This can be useful when the default tile grid cannot be created\n * (e.g. projection has no extent defined) or\n * for optimization reasons (custom tile size, resolutions, ...).\n *\n * @param {import(\"../proj.js\").ProjectionLike} projection Projection.\n * @param {import(\"../tilegrid/TileGrid.js\").default} tilegrid Tile grid to use for the projection.\n * @api\n */\n setTileGridForProjection(e, t) {\n const i = Lr(e);\n if (i) {\n const r = fr(i);\n r in this.tileGridForProjection || (this.tileGridForProjection[r] = t);\n }\n }\n clear() {\n super.clear();\n for (const e in this.tileCacheForProjection)\n this.tileCacheForProjection[e].clear();\n }\n}\nfunction X3(n, e) {\n n.getImage().src = e;\n}\nclass H3 extends G3 {\n /**\n * @param {Options} [options] XYZ options.\n */\n constructor(e) {\n e = e || {};\n const t = e.projection !== void 0 ? e.projection : \"EPSG:3857\", i = e.tileGrid !== void 0 ? e.tileGrid : L3({\n extent: fd(t),\n maxResolution: e.maxResolution,\n maxZoom: e.maxZoom,\n minZoom: e.minZoom,\n tileSize: e.tileSize\n });\n super({\n attributions: e.attributions,\n cacheSize: e.cacheSize,\n crossOrigin: e.crossOrigin,\n interpolate: e.interpolate,\n opaque: e.opaque,\n projection: t,\n reprojectionErrorThreshold: e.reprojectionErrorThreshold,\n tileGrid: i,\n tileLoadFunction: e.tileLoadFunction,\n tilePixelRatio: e.tilePixelRatio,\n tileUrlFunction: e.tileUrlFunction,\n url: e.url,\n urls: e.urls,\n wrapX: e.wrapX !== void 0 ? e.wrapX : !0,\n transition: e.transition,\n attributionsCollapsible: e.attributionsCollapsible,\n zDirection: e.zDirection\n }), this.gutter_ = e.gutter !== void 0 ? e.gutter : 0;\n }\n /**\n * @return {number} Gutter.\n */\n getGutter() {\n return this.gutter_;\n }\n}\nvar K3 = typeof globalThis < \"u\" ? globalThis : typeof window < \"u\" ? window : typeof global < \"u\" ? global : typeof self < \"u\" ? self : {};\nfunction cv(n) {\n return n && n.__esModule && Object.prototype.hasOwnProperty.call(n, \"default\") ? n.default : n;\n}\nconst q3 = '© OpenStreetMap contributors.';\nclass Y3 extends H3 {\n /**\n * @param {Options} [options] Open Street Map options.\n */\n constructor(e) {\n e = e || {};\n let t;\n e.attributions !== void 0 ? t = e.attributions : t = [q3];\n const i = e.crossOrigin !== void 0 ? e.crossOrigin : \"anonymous\", r = e.url !== void 0 ? e.url : \"https://tile.openstreetmap.org/{z}/{x}/{y}.png\";\n super({\n attributions: t,\n attributionsCollapsible: !1,\n cacheSize: e.cacheSize,\n crossOrigin: i,\n interpolate: e.interpolate,\n maxZoom: e.maxZoom !== void 0 ? e.maxZoom : 19,\n opaque: e.opaque !== void 0 ? e.opaque : !0,\n reprojectionErrorThreshold: e.reprojectionErrorThreshold,\n tileLoadFunction: e.tileLoadFunction,\n transition: e.transition,\n url: r,\n wrapX: e.wrapX,\n zDirection: e.zDirection\n });\n }\n}\nconst hv = Y3;\nclass Z3 {\n constructor(e, t, i, r, s, a) {\n this.name = e, this.scene = a, this.layers = t, this.target = \"globe\", this.view = i, this.resolution = r, this.diameter = s, this.container = this.createContainer(), this.map = this.createOLMap(), this.texture = this.createTexture(), this.context = this.texture.getContext(), this.mesh = this.createMesh(), this.lonLatToVector3 = this.createScales;\n }\n createContainer() {\n let e = document.createElement(\"div\");\n return e.style.position = \"fixed\", e.style.visibility = \"hidden\", e.style.width = this.resolution.x + \"px\", e.style.height = this.resolution.y + \"px\", e.setAttribute(\"id\", \"globe\"), document.body.appendChild(e), e;\n }\n createOLMap() {\n return new ev({\n pixelRatio: 1,\n layers: this.layers,\n target: this.target,\n view: this.view\n });\n }\n createTexture() {\n let e = this.scene, t = this.target, i = new Ac(\n \"mapTexture\",\n { width: this.resolution.x, height: this.resolution.y },\n e\n );\n return this.map.on(\"postrender\", function() {\n var r = document.getElementById(t), s = r.getElementsByTagName(\"canvas\")[0];\n i.getContext().drawImage(s, 0, 0), i.update();\n }), i;\n }\n createMesh() {\n let e = kt.CreateSphere(this.name, { diameter: this.diameter }, this.scene);\n e.rotate(Bp.X, Math.PI, so.WORLD), e.rotate(Bp.Y, Math.PI, so.WORLD);\n let t = new Vs(this.name + \"_material\", this.scene);\n return e.bakeCurrentTransformIntoVertices(), t.diffuseTexture = this.texture, t.specularColor = new pi(0, 0, 0), e.material = t, e;\n }\n createScales(e) {\n let t = e[0] * Math.PI / 180, i = e[1] * Math.PI / 180, r = this.diameter / 2, s = r * Math.cos(i) * Math.cos(t), a = r * Math.cos(i) * Math.sin(t), o = r * Math.sin(i);\n return new Me(s, o, a);\n }\n}\nfunction bk(n, e = {}, t) {\n const i = e.layers || [\n new rv({ source: new hv(), extent: [-180, -90, 180, 90] })\n ], r = e.view || new Qr({\n projection: \"EPSG:4326\",\n extent: [-180, -90, 180, 90],\n center: [0, 0],\n zoom: 0\n }), s = e.resolution || new da(1e3, 500), a = e.diameter || 1;\n return new Z3(n, i, r, s, a, t);\n}\nfunction Yl(n, e) {\n return n == null || e == null ? NaN : n < e ? -1 : n > e ? 1 : n >= e ? 0 : NaN;\n}\nfunction j3(n, e) {\n return n == null || e == null ? NaN : e < n ? -1 : e > n ? 1 : e >= n ? 0 : NaN;\n}\nfunction uv(n) {\n let e, t, i;\n n.length !== 2 ? (e = Yl, t = (o, l) => Yl(n(o), l), i = (o, l) => n(o) - l) : (e = n === Yl || n === j3 ? n : Q3, t = n, i = n);\n function r(o, l, c = 0, h = o.length) {\n if (c < h) {\n if (e(l, l) !== 0)\n return h;\n do {\n const u = c + h >>> 1;\n t(o[u], l) < 0 ? c = u + 1 : h = u;\n } while (c < h);\n }\n return c;\n }\n function s(o, l, c = 0, h = o.length) {\n if (c < h) {\n if (e(l, l) !== 0)\n return h;\n do {\n const u = c + h >>> 1;\n t(o[u], l) <= 0 ? c = u + 1 : h = u;\n } while (c < h);\n }\n return c;\n }\n function a(o, l, c = 0, h = o.length) {\n const u = r(o, l, c, h - 1);\n return u > c && i(o[u - 1], l) > -i(o[u], l) ? u - 1 : u;\n }\n return { left: r, center: a, right: s };\n}\nfunction Q3() {\n return 0;\n}\nfunction J3(n) {\n return n === null ? NaN : +n;\n}\nconst $3 = uv(Yl), eV = $3.right;\nuv(J3).center;\nclass tV {\n constructor() {\n this._partials = new Float64Array(32), this._n = 0;\n }\n add(e) {\n const t = this._partials;\n let i = 0;\n for (let r = 0; r < this._n && r < 32; r++) {\n const s = t[r], a = e + s, o = Math.abs(e) < Math.abs(s) ? e - (a - s) : s - (a - e);\n o && (t[i++] = o), e = a;\n }\n return t[i] = e, this._n = i + 1, this;\n }\n valueOf() {\n const e = this._partials;\n let t = this._n, i, r, s, a = 0;\n if (t > 0) {\n for (a = e[--t]; t > 0 && (i = a, r = e[--t], a = i + r, s = r - (a - i), !s); )\n ;\n t > 0 && (s < 0 && e[t - 1] < 0 || s > 0 && e[t - 1] > 0) && (r = s * 2, i = a + r, r == i - a && (a = i));\n }\n return a;\n }\n}\nconst iV = Math.sqrt(50), rV = Math.sqrt(10), sV = Math.sqrt(2);\nfunction _c(n, e, t) {\n const i = (e - n) / Math.max(0, t), r = Math.floor(Math.log10(i)), s = i / Math.pow(10, r), a = s >= iV ? 10 : s >= rV ? 5 : s >= sV ? 2 : 1;\n let o, l, c;\n return r < 0 ? (c = Math.pow(10, -r) / a, o = Math.round(n * c), l = Math.round(e * c), o / c < n && ++o, l / c > e && --l, c = -c) : (c = Math.pow(10, r) * a, o = Math.round(n / c), l = Math.round(e / c), o * c < n && ++o, l * c > e && --l), l < o && 0.5 <= t && t < 2 ? _c(n, e, t * 2) : [o, l, c];\n}\nfunction nV(n, e, t) {\n if (e = +e, n = +n, t = +t, !(t > 0))\n return [];\n if (n === e)\n return [n];\n const i = e < n, [r, s, a] = i ? _c(e, n, t) : _c(n, e, t);\n if (!(s >= r))\n return [];\n const o = s - r + 1, l = new Array(o);\n if (i)\n if (a < 0)\n for (let c = 0; c < o; ++c)\n l[c] = (s - c) / -a;\n else\n for (let c = 0; c < o; ++c)\n l[c] = (s - c) * a;\n else if (a < 0)\n for (let c = 0; c < o; ++c)\n l[c] = (r + c) / -a;\n else\n for (let c = 0; c < o; ++c)\n l[c] = (r + c) * a;\n return l;\n}\nfunction Nu(n, e, t) {\n return e = +e, n = +n, t = +t, _c(n, e, t)[2];\n}\nfunction aV(n, e, t) {\n e = +e, n = +n, t = +t;\n const i = e < n, r = i ? Nu(e, n, t) : Nu(n, e, t);\n return (i ? -1 : 1) * (r < 0 ? 1 / -r : r);\n}\nfunction* oV(n) {\n for (const e of n)\n yield* e;\n}\nfunction fv(n) {\n return Array.from(oV(n));\n}\nfunction lV(n, e) {\n switch (arguments.length) {\n case 0:\n break;\n case 1:\n this.range(n);\n break;\n default:\n this.range(e).domain(n);\n break;\n }\n return this;\n}\nfunction pd(n, e, t) {\n n.prototype = e.prototype = t, t.constructor = n;\n}\nfunction dv(n, e) {\n var t = Object.create(n.prototype);\n for (var i in e)\n t[i] = e[i];\n return t;\n}\nfunction rl() {\n}\nvar Fo = 0.7, Ec = 1 / Fo, Ia = \"\\\\s*([+-]?\\\\d+)\\\\s*\", Lo = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", ds = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", cV = /^#([0-9a-f]{3,8})$/, hV = new RegExp(`^rgb\\\\(${Ia},${Ia},${Ia}\\\\)$`), uV = new RegExp(`^rgb\\\\(${ds},${ds},${ds}\\\\)$`), fV = new RegExp(`^rgba\\\\(${Ia},${Ia},${Ia},${Lo}\\\\)$`), dV = new RegExp(`^rgba\\\\(${ds},${ds},${ds},${Lo}\\\\)$`), pV = new RegExp(`^hsl\\\\(${Lo},${ds},${ds}\\\\)$`), gV = new RegExp(`^hsla\\\\(${Lo},${ds},${ds},${Lo}\\\\)$`), zm = {\n aliceblue: 15792383,\n antiquewhite: 16444375,\n aqua: 65535,\n aquamarine: 8388564,\n azure: 15794175,\n beige: 16119260,\n bisque: 16770244,\n black: 0,\n blanchedalmond: 16772045,\n blue: 255,\n blueviolet: 9055202,\n brown: 10824234,\n burlywood: 14596231,\n cadetblue: 6266528,\n chartreuse: 8388352,\n chocolate: 13789470,\n coral: 16744272,\n cornflowerblue: 6591981,\n cornsilk: 16775388,\n crimson: 14423100,\n cyan: 65535,\n darkblue: 139,\n darkcyan: 35723,\n darkgoldenrod: 12092939,\n darkgray: 11119017,\n darkgreen: 25600,\n darkgrey: 11119017,\n darkkhaki: 12433259,\n darkmagenta: 9109643,\n darkolivegreen: 5597999,\n darkorange: 16747520,\n darkorchid: 10040012,\n darkred: 9109504,\n darksalmon: 15308410,\n darkseagreen: 9419919,\n darkslateblue: 4734347,\n darkslategray: 3100495,\n darkslategrey: 3100495,\n darkturquoise: 52945,\n darkviolet: 9699539,\n deeppink: 16716947,\n deepskyblue: 49151,\n dimgray: 6908265,\n dimgrey: 6908265,\n dodgerblue: 2003199,\n firebrick: 11674146,\n floralwhite: 16775920,\n forestgreen: 2263842,\n fuchsia: 16711935,\n gainsboro: 14474460,\n ghostwhite: 16316671,\n gold: 16766720,\n goldenrod: 14329120,\n gray: 8421504,\n green: 32768,\n greenyellow: 11403055,\n grey: 8421504,\n honeydew: 15794160,\n hotpink: 16738740,\n indianred: 13458524,\n indigo: 4915330,\n ivory: 16777200,\n khaki: 15787660,\n lavender: 15132410,\n lavenderblush: 16773365,\n lawngreen: 8190976,\n lemonchiffon: 16775885,\n lightblue: 11393254,\n lightcoral: 15761536,\n lightcyan: 14745599,\n lightgoldenrodyellow: 16448210,\n lightgray: 13882323,\n lightgreen: 9498256,\n lightgrey: 13882323,\n lightpink: 16758465,\n lightsalmon: 16752762,\n lightseagreen: 2142890,\n lightskyblue: 8900346,\n lightslategray: 7833753,\n lightslategrey: 7833753,\n lightsteelblue: 11584734,\n lightyellow: 16777184,\n lime: 65280,\n limegreen: 3329330,\n linen: 16445670,\n magenta: 16711935,\n maroon: 8388608,\n mediumaquamarine: 6737322,\n mediumblue: 205,\n mediumorchid: 12211667,\n mediumpurple: 9662683,\n mediumseagreen: 3978097,\n mediumslateblue: 8087790,\n mediumspringgreen: 64154,\n mediumturquoise: 4772300,\n mediumvioletred: 13047173,\n midnightblue: 1644912,\n mintcream: 16121850,\n mistyrose: 16770273,\n moccasin: 16770229,\n navajowhite: 16768685,\n navy: 128,\n oldlace: 16643558,\n olive: 8421376,\n olivedrab: 7048739,\n orange: 16753920,\n orangered: 16729344,\n orchid: 14315734,\n palegoldenrod: 15657130,\n palegreen: 10025880,\n paleturquoise: 11529966,\n palevioletred: 14381203,\n papayawhip: 16773077,\n peachpuff: 16767673,\n peru: 13468991,\n pink: 16761035,\n plum: 14524637,\n powderblue: 11591910,\n purple: 8388736,\n rebeccapurple: 6697881,\n red: 16711680,\n rosybrown: 12357519,\n royalblue: 4286945,\n saddlebrown: 9127187,\n salmon: 16416882,\n sandybrown: 16032864,\n seagreen: 3050327,\n seashell: 16774638,\n sienna: 10506797,\n silver: 12632256,\n skyblue: 8900331,\n slateblue: 6970061,\n slategray: 7372944,\n slategrey: 7372944,\n snow: 16775930,\n springgreen: 65407,\n steelblue: 4620980,\n tan: 13808780,\n teal: 32896,\n thistle: 14204888,\n tomato: 16737095,\n turquoise: 4251856,\n violet: 15631086,\n wheat: 16113331,\n white: 16777215,\n whitesmoke: 16119285,\n yellow: 16776960,\n yellowgreen: 10145074\n};\npd(rl, wo, {\n copy(n) {\n return Object.assign(new this.constructor(), this, n);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: Wm,\n // Deprecated! Use color.formatHex.\n formatHex: Wm,\n formatHex8: mV,\n formatHsl: _V,\n formatRgb: Gm,\n toString: Gm\n});\nfunction Wm() {\n return this.rgb().formatHex();\n}\nfunction mV() {\n return this.rgb().formatHex8();\n}\nfunction _V() {\n return pv(this).formatHsl();\n}\nfunction Gm() {\n return this.rgb().formatRgb();\n}\nfunction wo(n) {\n var e, t;\n return n = (n + \"\").trim().toLowerCase(), (e = cV.exec(n)) ? (t = e[1].length, e = parseInt(e[1], 16), t === 6 ? Xm(e) : t === 3 ? new pr(e >> 8 & 15 | e >> 4 & 240, e >> 4 & 15 | e & 240, (e & 15) << 4 | e & 15, 1) : t === 8 ? bl(e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, (e & 255) / 255) : t === 4 ? bl(e >> 12 & 15 | e >> 8 & 240, e >> 8 & 15 | e >> 4 & 240, e >> 4 & 15 | e & 240, ((e & 15) << 4 | e & 15) / 255) : null) : (e = hV.exec(n)) ? new pr(e[1], e[2], e[3], 1) : (e = uV.exec(n)) ? new pr(e[1] * 255 / 100, e[2] * 255 / 100, e[3] * 255 / 100, 1) : (e = fV.exec(n)) ? bl(e[1], e[2], e[3], e[4]) : (e = dV.exec(n)) ? bl(e[1] * 255 / 100, e[2] * 255 / 100, e[3] * 255 / 100, e[4]) : (e = pV.exec(n)) ? qm(e[1], e[2] / 100, e[3] / 100, 1) : (e = gV.exec(n)) ? qm(e[1], e[2] / 100, e[3] / 100, e[4]) : zm.hasOwnProperty(n) ? Xm(zm[n]) : n === \"transparent\" ? new pr(NaN, NaN, NaN, 0) : null;\n}\nfunction Xm(n) {\n return new pr(n >> 16 & 255, n >> 8 & 255, n & 255, 1);\n}\nfunction bl(n, e, t, i) {\n return i <= 0 && (n = e = t = NaN), new pr(n, e, t, i);\n}\nfunction EV(n) {\n return n instanceof rl || (n = wo(n)), n ? (n = n.rgb(), new pr(n.r, n.g, n.b, n.opacity)) : new pr();\n}\nfunction Fu(n, e, t, i) {\n return arguments.length === 1 ? EV(n) : new pr(n, e, t, i ?? 1);\n}\nfunction pr(n, e, t, i) {\n this.r = +n, this.g = +e, this.b = +t, this.opacity = +i;\n}\npd(pr, Fu, dv(rl, {\n brighter(n) {\n return n = n == null ? Ec : Math.pow(Ec, n), new pr(this.r * n, this.g * n, this.b * n, this.opacity);\n },\n darker(n) {\n return n = n == null ? Fo : Math.pow(Fo, n), new pr(this.r * n, this.g * n, this.b * n, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new pr(Pn(this.r), Pn(this.g), Pn(this.b), vc(this.opacity));\n },\n displayable() {\n return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n },\n hex: Hm,\n // Deprecated! Use color.formatHex.\n formatHex: Hm,\n formatHex8: vV,\n formatRgb: Km,\n toString: Km\n}));\nfunction Hm() {\n return `#${An(this.r)}${An(this.g)}${An(this.b)}`;\n}\nfunction vV() {\n return `#${An(this.r)}${An(this.g)}${An(this.b)}${An((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\nfunction Km() {\n const n = vc(this.opacity);\n return `${n === 1 ? \"rgb(\" : \"rgba(\"}${Pn(this.r)}, ${Pn(this.g)}, ${Pn(this.b)}${n === 1 ? \")\" : `, ${n})`}`;\n}\nfunction vc(n) {\n return isNaN(n) ? 1 : Math.max(0, Math.min(1, n));\n}\nfunction Pn(n) {\n return Math.max(0, Math.min(255, Math.round(n) || 0));\n}\nfunction An(n) {\n return n = Pn(n), (n < 16 ? \"0\" : \"\") + n.toString(16);\n}\nfunction qm(n, e, t, i) {\n return i <= 0 ? n = e = t = NaN : t <= 0 || t >= 1 ? n = e = NaN : e <= 0 && (n = NaN), new Jr(n, e, t, i);\n}\nfunction pv(n) {\n if (n instanceof Jr)\n return new Jr(n.h, n.s, n.l, n.opacity);\n if (n instanceof rl || (n = wo(n)), !n)\n return new Jr();\n if (n instanceof Jr)\n return n;\n n = n.rgb();\n var e = n.r / 255, t = n.g / 255, i = n.b / 255, r = Math.min(e, t, i), s = Math.max(e, t, i), a = NaN, o = s - r, l = (s + r) / 2;\n return o ? (e === s ? a = (t - i) / o + (t < i) * 6 : t === s ? a = (i - e) / o + 2 : a = (e - t) / o + 4, o /= l < 0.5 ? s + r : 2 - s - r, a *= 60) : o = l > 0 && l < 1 ? 0 : a, new Jr(a, o, l, n.opacity);\n}\nfunction TV(n, e, t, i) {\n return arguments.length === 1 ? pv(n) : new Jr(n, e, t, i ?? 1);\n}\nfunction Jr(n, e, t, i) {\n this.h = +n, this.s = +e, this.l = +t, this.opacity = +i;\n}\npd(Jr, TV, dv(rl, {\n brighter(n) {\n return n = n == null ? Ec : Math.pow(Ec, n), new Jr(this.h, this.s, this.l * n, this.opacity);\n },\n darker(n) {\n return n = n == null ? Fo : Math.pow(Fo, n), new Jr(this.h, this.s, this.l * n, this.opacity);\n },\n rgb() {\n var n = this.h % 360 + (this.h < 0) * 360, e = isNaN(n) || isNaN(this.s) ? 0 : this.s, t = this.l, i = t + (t < 0.5 ? t : 1 - t) * e, r = 2 * t - i;\n return new pr(\n au(n >= 240 ? n - 240 : n + 120, r, i),\n au(n, r, i),\n au(n < 120 ? n + 240 : n - 120, r, i),\n this.opacity\n );\n },\n clamp() {\n return new Jr(Ym(this.h), Al(this.s), Al(this.l), vc(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n },\n formatHsl() {\n const n = vc(this.opacity);\n return `${n === 1 ? \"hsl(\" : \"hsla(\"}${Ym(this.h)}, ${Al(this.s) * 100}%, ${Al(this.l) * 100}%${n === 1 ? \")\" : `, ${n})`}`;\n }\n}));\nfunction Ym(n) {\n return n = (n || 0) % 360, n < 0 ? n + 360 : n;\n}\nfunction Al(n) {\n return Math.max(0, Math.min(1, n || 0));\n}\nfunction au(n, e, t) {\n return (n < 60 ? e + (t - e) * n / 60 : n < 180 ? t : n < 240 ? e + (t - e) * (240 - n) / 60 : e) * 255;\n}\nconst gd = (n) => () => n;\nfunction xV(n, e) {\n return function(t) {\n return n + t * e;\n };\n}\nfunction CV(n, e, t) {\n return n = Math.pow(n, t), e = Math.pow(e, t) - n, t = 1 / t, function(i) {\n return Math.pow(n + i * e, t);\n };\n}\nfunction RV(n) {\n return (n = +n) == 1 ? gv : function(e, t) {\n return t - e ? CV(e, t, n) : gd(isNaN(e) ? t : e);\n };\n}\nfunction gv(n, e) {\n var t = e - n;\n return t ? xV(n, t) : gd(isNaN(n) ? e : n);\n}\nconst Zm = function n(e) {\n var t = RV(e);\n function i(r, s) {\n var a = t((r = Fu(r)).r, (s = Fu(s)).r), o = t(r.g, s.g), l = t(r.b, s.b), c = gv(r.opacity, s.opacity);\n return function(h) {\n return r.r = a(h), r.g = o(h), r.b = l(h), r.opacity = c(h), r + \"\";\n };\n }\n return i.gamma = n, i;\n}(1);\nfunction SV(n, e) {\n e || (e = []);\n var t = n ? Math.min(e.length, n.length) : 0, i = e.slice(), r;\n return function(s) {\n for (r = 0; r < t; ++r)\n i[r] = n[r] * (1 - s) + e[r] * s;\n return i;\n };\n}\nfunction yV(n) {\n return ArrayBuffer.isView(n) && !(n instanceof DataView);\n}\nfunction IV(n, e) {\n var t = e ? e.length : 0, i = n ? Math.min(t, n.length) : 0, r = new Array(i), s = new Array(t), a;\n for (a = 0; a < i; ++a)\n r[a] = md(n[a], e[a]);\n for (; a < t; ++a)\n s[a] = e[a];\n return function(o) {\n for (a = 0; a < i; ++a)\n s[a] = r[a](o);\n return s;\n };\n}\nfunction bV(n, e) {\n var t = /* @__PURE__ */ new Date();\n return n = +n, e = +e, function(i) {\n return t.setTime(n * (1 - i) + e * i), t;\n };\n}\nfunction Tc(n, e) {\n return n = +n, e = +e, function(t) {\n return n * (1 - t) + e * t;\n };\n}\nfunction AV(n, e) {\n var t = {}, i = {}, r;\n (n === null || typeof n != \"object\") && (n = {}), (e === null || typeof e != \"object\") && (e = {});\n for (r in e)\n r in n ? t[r] = md(n[r], e[r]) : i[r] = e[r];\n return function(s) {\n for (r in t)\n i[r] = t[r](s);\n return i;\n };\n}\nvar Lu = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, ou = new RegExp(Lu.source, \"g\");\nfunction MV(n) {\n return function() {\n return n;\n };\n}\nfunction PV(n) {\n return function(e) {\n return n(e) + \"\";\n };\n}\nfunction OV(n, e) {\n var t = Lu.lastIndex = ou.lastIndex = 0, i, r, s, a = -1, o = [], l = [];\n for (n = n + \"\", e = e + \"\"; (i = Lu.exec(n)) && (r = ou.exec(e)); )\n (s = r.index) > t && (s = e.slice(t, s), o[a] ? o[a] += s : o[++a] = s), (i = i[0]) === (r = r[0]) ? o[a] ? o[a] += r : o[++a] = r : (o[++a] = null, l.push({ i: a, x: Tc(i, r) })), t = ou.lastIndex;\n return t < e.length && (s = e.slice(t), o[a] ? o[a] += s : o[++a] = s), o.length < 2 ? l[0] ? PV(l[0].x) : MV(e) : (e = l.length, function(c) {\n for (var h = 0, u; h < e; ++h)\n o[(u = l[h]).i] = u.x(c);\n return o.join(\"\");\n });\n}\nfunction md(n, e) {\n var t = typeof e, i;\n return e == null || t === \"boolean\" ? gd(e) : (t === \"number\" ? Tc : t === \"string\" ? (i = wo(e)) ? (e = i, Zm) : OV : e instanceof wo ? Zm : e instanceof Date ? bV : yV(e) ? SV : Array.isArray(e) ? IV : typeof e.valueOf != \"function\" && typeof e.toString != \"function\" || isNaN(e) ? AV : Tc)(n, e);\n}\nfunction DV(n, e) {\n return n = +n, e = +e, function(t) {\n return Math.round(n * (1 - t) + e * t);\n };\n}\nfunction NV(n) {\n return function() {\n return n;\n };\n}\nfunction FV(n) {\n return +n;\n}\nvar jm = [0, 1];\nfunction ua(n) {\n return n;\n}\nfunction wu(n, e) {\n return (e -= n = +n) ? function(t) {\n return (t - n) / e;\n } : NV(isNaN(e) ? NaN : 0.5);\n}\nfunction LV(n, e) {\n var t;\n return n > e && (t = n, n = e, e = t), function(i) {\n return Math.max(n, Math.min(e, i));\n };\n}\nfunction wV(n, e, t) {\n var i = n[0], r = n[1], s = e[0], a = e[1];\n return r < i ? (i = wu(r, i), s = t(a, s)) : (i = wu(i, r), s = t(s, a)), function(o) {\n return s(i(o));\n };\n}\nfunction UV(n, e, t) {\n var i = Math.min(n.length, e.length) - 1, r = new Array(i), s = new Array(i), a = -1;\n for (n[i] < n[0] && (n = n.slice().reverse(), e = e.slice().reverse()); ++a < i; )\n r[a] = wu(n[a], n[a + 1]), s[a] = t(e[a], e[a + 1]);\n return function(o) {\n var l = eV(n, o, 1, i) - 1;\n return s[l](r[l](o));\n };\n}\nfunction VV(n, e) {\n return e.domain(n.domain()).range(n.range()).interpolate(n.interpolate()).clamp(n.clamp()).unknown(n.unknown());\n}\nfunction BV() {\n var n = jm, e = jm, t = md, i, r, s, a = ua, o, l, c;\n function h() {\n var f = Math.min(n.length, e.length);\n return a !== ua && (a = LV(n[0], n[f - 1])), o = f > 2 ? UV : wV, l = c = null, u;\n }\n function u(f) {\n return f == null || isNaN(f = +f) ? s : (l || (l = o(n.map(i), e, t)))(i(a(f)));\n }\n return u.invert = function(f) {\n return a(r((c || (c = o(e, n.map(i), Tc)))(f)));\n }, u.domain = function(f) {\n return arguments.length ? (n = Array.from(f, FV), h()) : n.slice();\n }, u.range = function(f) {\n return arguments.length ? (e = Array.from(f), h()) : e.slice();\n }, u.rangeRound = function(f) {\n return e = Array.from(f), t = DV, h();\n }, u.clamp = function(f) {\n return arguments.length ? (a = f ? !0 : ua, h()) : a !== ua;\n }, u.interpolate = function(f) {\n return arguments.length ? (t = f, h()) : t;\n }, u.unknown = function(f) {\n return arguments.length ? (s = f, u) : s;\n }, function(f, d) {\n return i = f, r = d, h();\n };\n}\nfunction kV() {\n return BV()(ua, ua);\n}\nfunction zV(n) {\n return Math.abs(n = Math.round(n)) >= 1e21 ? n.toLocaleString(\"en\").replace(/,/g, \"\") : n.toString(10);\n}\nfunction xc(n, e) {\n if ((t = (n = e ? n.toExponential(e - 1) : n.toExponential()).indexOf(\"e\")) < 0)\n return null;\n var t, i = n.slice(0, t);\n return [\n i.length > 1 ? i[0] + i.slice(2) : i,\n +n.slice(t + 1)\n ];\n}\nfunction Fa(n) {\n return n = xc(Math.abs(n)), n ? n[1] : NaN;\n}\nfunction WV(n, e) {\n return function(t, i) {\n for (var r = t.length, s = [], a = 0, o = n[0], l = 0; r > 0 && o > 0 && (l + o + 1 > i && (o = Math.max(1, i - l)), s.push(t.substring(r -= o, r + o)), !((l += o + 1) > i)); )\n o = n[a = (a + 1) % n.length];\n return s.reverse().join(e);\n };\n}\nfunction GV(n) {\n return function(e) {\n return e.replace(/[0-9]/g, function(t) {\n return n[+t];\n });\n };\n}\nvar XV = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\nfunction Cc(n) {\n if (!(e = XV.exec(n)))\n throw new Error(\"invalid format: \" + n);\n var e;\n return new _d({\n fill: e[1],\n align: e[2],\n sign: e[3],\n symbol: e[4],\n zero: e[5],\n width: e[6],\n comma: e[7],\n precision: e[8] && e[8].slice(1),\n trim: e[9],\n type: e[10]\n });\n}\nCc.prototype = _d.prototype;\nfunction _d(n) {\n this.fill = n.fill === void 0 ? \" \" : n.fill + \"\", this.align = n.align === void 0 ? \">\" : n.align + \"\", this.sign = n.sign === void 0 ? \"-\" : n.sign + \"\", this.symbol = n.symbol === void 0 ? \"\" : n.symbol + \"\", this.zero = !!n.zero, this.width = n.width === void 0 ? void 0 : +n.width, this.comma = !!n.comma, this.precision = n.precision === void 0 ? void 0 : +n.precision, this.trim = !!n.trim, this.type = n.type === void 0 ? \"\" : n.type + \"\";\n}\n_d.prototype.toString = function() {\n return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === void 0 ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === void 0 ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n};\nfunction HV(n) {\n e:\n for (var e = n.length, t = 1, i = -1, r; t < e; ++t)\n switch (n[t]) {\n case \".\":\n i = r = t;\n break;\n case \"0\":\n i === 0 && (i = t), r = t;\n break;\n default:\n if (!+n[t])\n break e;\n i > 0 && (i = 0);\n break;\n }\n return i > 0 ? n.slice(0, i) + n.slice(r + 1) : n;\n}\nvar mv;\nfunction KV(n, e) {\n var t = xc(n, e);\n if (!t)\n return n + \"\";\n var i = t[0], r = t[1], s = r - (mv = Math.max(-8, Math.min(8, Math.floor(r / 3))) * 3) + 1, a = i.length;\n return s === a ? i : s > a ? i + new Array(s - a + 1).join(\"0\") : s > 0 ? i.slice(0, s) + \".\" + i.slice(s) : \"0.\" + new Array(1 - s).join(\"0\") + xc(n, Math.max(0, e + s - 1))[0];\n}\nfunction Qm(n, e) {\n var t = xc(n, e);\n if (!t)\n return n + \"\";\n var i = t[0], r = t[1];\n return r < 0 ? \"0.\" + new Array(-r).join(\"0\") + i : i.length > r + 1 ? i.slice(0, r + 1) + \".\" + i.slice(r + 1) : i + new Array(r - i.length + 2).join(\"0\");\n}\nconst Jm = {\n \"%\": (n, e) => (n * 100).toFixed(e),\n b: (n) => Math.round(n).toString(2),\n c: (n) => n + \"\",\n d: zV,\n e: (n, e) => n.toExponential(e),\n f: (n, e) => n.toFixed(e),\n g: (n, e) => n.toPrecision(e),\n o: (n) => Math.round(n).toString(8),\n p: (n, e) => Qm(n * 100, e),\n r: Qm,\n s: KV,\n X: (n) => Math.round(n).toString(16).toUpperCase(),\n x: (n) => Math.round(n).toString(16)\n};\nfunction $m(n) {\n return n;\n}\nvar e_ = Array.prototype.map, t_ = [\"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\"];\nfunction qV(n) {\n var e = n.grouping === void 0 || n.thousands === void 0 ? $m : WV(e_.call(n.grouping, Number), n.thousands + \"\"), t = n.currency === void 0 ? \"\" : n.currency[0] + \"\", i = n.currency === void 0 ? \"\" : n.currency[1] + \"\", r = n.decimal === void 0 ? \".\" : n.decimal + \"\", s = n.numerals === void 0 ? $m : GV(e_.call(n.numerals, String)), a = n.percent === void 0 ? \"%\" : n.percent + \"\", o = n.minus === void 0 ? \"−\" : n.minus + \"\", l = n.nan === void 0 ? \"NaN\" : n.nan + \"\";\n function c(u) {\n u = Cc(u);\n var f = u.fill, d = u.align, p = u.sign, g = u.symbol, m = u.zero, v = u.width, E = u.comma, C = u.precision, T = u.trim, R = u.type;\n R === \"n\" ? (E = !0, R = \"g\") : Jm[R] || (C === void 0 && (C = 12), T = !0, R = \"g\"), (m || f === \"0\" && d === \"=\") && (m = !0, f = \"0\", d = \"=\");\n var x = g === \"$\" ? t : g === \"#\" && /[boxX]/.test(R) ? \"0\" + R.toLowerCase() : \"\", S = g === \"$\" ? i : /[%p]/.test(R) ? a : \"\", M = Jm[R], N = /[defgprs%]/.test(R);\n C = C === void 0 ? 6 : /[gprs]/.test(R) ? Math.max(1, Math.min(21, C)) : Math.max(0, Math.min(20, C));\n function F(U) {\n var H = x, q = S, Z, k, Q;\n if (R === \"c\")\n q = M(U) + q, U = \"\";\n else {\n U = +U;\n var ce = U < 0 || 1 / U < 0;\n if (U = isNaN(U) ? l : M(Math.abs(U), C), T && (U = HV(U)), ce && +U == 0 && p !== \"+\" && (ce = !1), H = (ce ? p === \"(\" ? p : o : p === \"-\" || p === \"(\" ? \"\" : p) + H, q = (R === \"s\" ? t_[8 + mv / 3] : \"\") + q + (ce && p === \"(\" ? \")\" : \"\"), N) {\n for (Z = -1, k = U.length; ++Z < k; )\n if (Q = U.charCodeAt(Z), 48 > Q || Q > 57) {\n q = (Q === 46 ? r + U.slice(Z + 1) : U.slice(Z)) + q, U = U.slice(0, Z);\n break;\n }\n }\n }\n E && !m && (U = e(U, 1 / 0));\n var de = H.length + U.length + q.length, j = de < v ? new Array(v - de + 1).join(f) : \"\";\n switch (E && m && (U = e(j + U, j.length ? v - q.length : 1 / 0), j = \"\"), d) {\n case \"<\":\n U = H + U + q + j;\n break;\n case \"=\":\n U = H + j + U + q;\n break;\n case \"^\":\n U = j.slice(0, de = j.length >> 1) + H + U + q + j.slice(de);\n break;\n default:\n U = j + H + U + q;\n break;\n }\n return s(U);\n }\n return F.toString = function() {\n return u + \"\";\n }, F;\n }\n function h(u, f) {\n var d = c((u = Cc(u), u.type = \"f\", u)), p = Math.max(-8, Math.min(8, Math.floor(Fa(f) / 3))) * 3, g = Math.pow(10, -p), m = t_[8 + p / 3];\n return function(v) {\n return d(g * v) + m;\n };\n }\n return {\n format: c,\n formatPrefix: h\n };\n}\nvar Ml, _v, Ev;\nYV({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\nfunction YV(n) {\n return Ml = qV(n), _v = Ml.format, Ev = Ml.formatPrefix, Ml;\n}\nfunction ZV(n) {\n return Math.max(0, -Fa(Math.abs(n)));\n}\nfunction jV(n, e) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(Fa(e) / 3))) * 3 - Fa(Math.abs(n)));\n}\nfunction QV(n, e) {\n return n = Math.abs(n), e = Math.abs(e) - n, Math.max(0, Fa(e) - Fa(n)) + 1;\n}\nfunction JV(n, e, t, i) {\n var r = aV(n, e, t), s;\n switch (i = Cc(i ?? \",f\"), i.type) {\n case \"s\": {\n var a = Math.max(Math.abs(n), Math.abs(e));\n return i.precision == null && !isNaN(s = jV(r, a)) && (i.precision = s), Ev(i, a);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n i.precision == null && !isNaN(s = QV(r, Math.max(Math.abs(n), Math.abs(e)))) && (i.precision = s - (i.type === \"e\"));\n break;\n }\n case \"f\":\n case \"%\": {\n i.precision == null && !isNaN(s = ZV(r)) && (i.precision = s - (i.type === \"%\") * 2);\n break;\n }\n }\n return _v(i);\n}\nfunction $V(n) {\n var e = n.domain;\n return n.ticks = function(t) {\n var i = e();\n return nV(i[0], i[i.length - 1], t ?? 10);\n }, n.tickFormat = function(t, i) {\n var r = e();\n return JV(r[0], r[r.length - 1], t ?? 10, i);\n }, n.nice = function(t) {\n t == null && (t = 10);\n var i = e(), r = 0, s = i.length - 1, a = i[r], o = i[s], l, c, h = 10;\n for (o < a && (c = a, a = o, o = c, c = r, r = s, s = c); h-- > 0; ) {\n if (c = Nu(a, o, t), c === l)\n return i[r] = a, i[s] = o, e(i);\n if (c > 0)\n a = Math.floor(a / c) * c, o = Math.ceil(o / c) * c;\n else if (c < 0)\n a = Math.ceil(a * c) / c, o = Math.floor(o * c) / c;\n else\n break;\n l = c;\n }\n return n;\n }, n;\n}\nfunction Uu() {\n var n = kV();\n return n.copy = function() {\n return VV(n, Uu());\n }, lV.apply(n, arguments), $V(n);\n}\nclass eB {\n constructor(e, t, i, r, s, a) {\n this.name = e, this.scene = a, this.layers = t, this.target = \"map2D\", this.view = i, this.resolution = r, this.size = s, this.container = this.createContainer(), this.map = this.createOLMap(), this.texture = this.createTexture(), this.context = this.texture.getContext(), this.mesh = this.createMesh();\n let o = this.createScales();\n this.scaleLon = (l) => o[0](this.map.getPixelFromCoordinate(l)[0]), this.scaleLat = (l) => o[1](this.map.getPixelFromCoordinate(l)[1]);\n }\n createContainer() {\n let e = document.createElement(\"div\");\n return e.style.position = \"fixed\", e.style.visibility = \"hidden\", e.style.width = this.resolution.width + \"px\", e.style.height = this.resolution.height + \"px\", e.setAttribute(\"id\", \"map2D\"), document.body.appendChild(e), e;\n }\n createOLMap() {\n return new ev({\n pixelRatio: 1,\n layers: this.layers,\n target: this.target,\n view: this.view\n });\n }\n createTexture() {\n let e = this.scene;\n this.mesh;\n let t = this.target;\n this.container;\n let i = new Ac(\n \"mapTexture\",\n { width: this.resolution.width, height: this.resolution.height },\n e\n );\n return this.map.on(\"postrender\", function() {\n var r = document.getElementById(t), s = r.getElementsByTagName(\"canvas\")[0];\n i.getContext().drawImage(s, 0, 0), i.update();\n }), i;\n }\n createMesh() {\n let e = this.resolution.width / this.resolution.height, t = kt.CreateGround(\n this.name,\n { width: this.size * e, height: this.size, subdivisions: 25 },\n this.scene\n ), i = new Vs(this.name + \"_material\", this.scene != null ? this.scene : void 0);\n return i.diffuseTexture = this.texture, i.specularColor = new pi(0, 0, 0), t.material = i, t;\n }\n createScales() {\n Bw();\n let e = this.resolution.width / this.resolution.height, t = this.size * e, i = this.size, r = Uu().domain([0, this.resolution.width]).range([-(t / 2), t / 2]), s = Uu().domain([this.resolution.height, 0]).range([-(i / 2), i / 2]);\n return [r, s];\n }\n keyboardControls(e) {\n return e.onKeyboardObservable.add((t) => {\n switch (t.type) {\n case VR.KEYDOWN:\n switch (t.event.key) {\n case \"a\":\n case \"A\":\n this.map.getView().setCenter([this.map.getView().getCenter()[0] - 1, this.map.getView().getCenter()[1]]);\n break;\n case \"d\":\n case \"D\":\n this.map.getView().setCenter([this.map.getView().getCenter()[0] + 1, this.map.getView().getCenter()[1]]);\n break;\n case \"w\":\n case \"W\":\n this.map.getView().setCenter([this.map.getView().getCenter()[0], this.map.getView().getCenter()[1] + 1]);\n break;\n case \"s\":\n case \"S\":\n this.map.getView().setCenter([this.map.getView().getCenter()[0], this.map.getView().getCenter()[1] - 1]);\n break;\n case \"=\":\n case \"+\":\n this.map.getView().animate({\n zoom: this.map.getView().getZoom() + 1,\n duration: 250\n });\n break;\n case \"-\":\n case \"_\":\n this.map.getView().animate({\n zoom: this.map.getView().getZoom() - 1,\n duration: 250\n });\n break;\n }\n break;\n }\n }), this;\n }\n}\nfunction Ak(n, e = {}, t) {\n const i = e.layers || [new rv({ source: new hv() })], r = e.view || new Qr({ center: [0, 0], zoom: 1 }), s = e.mapWidth || 2e3, a = e.mapHeight || 1e3, o = e.meshSize || 50;\n return new eB(n, i, r, { width: s, height: a }, o, t);\n}\nvar Jt = 1e-6, tB = 1e-12, yt = Math.PI, Nr = yt / 2, i_ = yt / 4, $r = yt * 2, br = 180 / yt, qi = yt / 180, oi = Math.abs, iB = Math.atan, La = Math.atan2, ai = Math.cos, Qt = Math.sin, Zl = Math.sign || function(n) {\n return n > 0 ? 1 : n < 0 ? -1 : 0;\n}, wa = Math.sqrt;\nfunction rB(n) {\n return n > 1 ? 0 : n < -1 ? yt : Math.acos(n);\n}\nfunction Ln(n) {\n return n > 1 ? Nr : n < -1 ? -Nr : Math.asin(n);\n}\nfunction io() {\n}\nfunction Rc(n, e) {\n n && s_.hasOwnProperty(n.type) && s_[n.type](n, e);\n}\nvar r_ = {\n Feature: function(n, e) {\n Rc(n.geometry, e);\n },\n FeatureCollection: function(n, e) {\n for (var t = n.features, i = -1, r = t.length; ++i < r; )\n Rc(t[i].geometry, e);\n }\n}, s_ = {\n Sphere: function(n, e) {\n e.sphere();\n },\n Point: function(n, e) {\n n = n.coordinates, e.point(n[0], n[1], n[2]);\n },\n MultiPoint: function(n, e) {\n for (var t = n.coordinates, i = -1, r = t.length; ++i < r; )\n n = t[i], e.point(n[0], n[1], n[2]);\n },\n LineString: function(n, e) {\n Vu(n.coordinates, e, 0);\n },\n MultiLineString: function(n, e) {\n for (var t = n.coordinates, i = -1, r = t.length; ++i < r; )\n Vu(t[i], e, 0);\n },\n Polygon: function(n, e) {\n n_(n.coordinates, e);\n },\n MultiPolygon: function(n, e) {\n for (var t = n.coordinates, i = -1, r = t.length; ++i < r; )\n n_(t[i], e);\n },\n GeometryCollection: function(n, e) {\n for (var t = n.geometries, i = -1, r = t.length; ++i < r; )\n Rc(t[i], e);\n }\n};\nfunction Vu(n, e, t) {\n var i = -1, r = n.length - t, s;\n for (e.lineStart(); ++i < r; )\n s = n[i], e.point(s[0], s[1], s[2]);\n e.lineEnd();\n}\nfunction n_(n, e) {\n var t = -1, i = n.length;\n for (e.polygonStart(); ++t < i; )\n Vu(n[t], e, 1);\n e.polygonEnd();\n}\nfunction vv(n, e) {\n n && r_.hasOwnProperty(n.type) ? r_[n.type](n, e) : Rc(n, e);\n}\nfunction Bu(n) {\n return [La(n[1], n[0]), Ln(n[2])];\n}\nfunction Ua(n) {\n var e = n[0], t = n[1], i = ai(t);\n return [i * ai(e), i * Qt(e), Qt(t)];\n}\nfunction Pl(n, e) {\n return n[0] * e[0] + n[1] * e[1] + n[2] * e[2];\n}\nfunction Sc(n, e) {\n return [n[1] * e[2] - n[2] * e[1], n[2] * e[0] - n[0] * e[2], n[0] * e[1] - n[1] * e[0]];\n}\nfunction lu(n, e) {\n n[0] += e[0], n[1] += e[1], n[2] += e[2];\n}\nfunction Ol(n, e) {\n return [n[0] * e, n[1] * e, n[2] * e];\n}\nfunction ku(n) {\n var e = wa(n[0] * n[0] + n[1] * n[1] + n[2] * n[2]);\n n[0] /= e, n[1] /= e, n[2] /= e;\n}\nfunction zu(n, e) {\n function t(i, r) {\n return i = n(i, r), e(i[0], i[1]);\n }\n return n.invert && e.invert && (t.invert = function(i, r) {\n return i = e.invert(i, r), i && n.invert(i[0], i[1]);\n }), t;\n}\nfunction Wu(n, e) {\n return oi(n) > yt && (n -= Math.round(n / $r) * $r), [n, e];\n}\nWu.invert = Wu;\nfunction sB(n, e, t) {\n return (n %= $r) ? e || t ? zu(o_(n), l_(e, t)) : o_(n) : e || t ? l_(e, t) : Wu;\n}\nfunction a_(n) {\n return function(e, t) {\n return e += n, oi(e) > yt && (e -= Math.round(e / $r) * $r), [e, t];\n };\n}\nfunction o_(n) {\n var e = a_(n);\n return e.invert = a_(-n), e;\n}\nfunction l_(n, e) {\n var t = ai(n), i = Qt(n), r = ai(e), s = Qt(e);\n function a(o, l) {\n var c = ai(l), h = ai(o) * c, u = Qt(o) * c, f = Qt(l), d = f * t + h * i;\n return [\n La(u * r - d * s, h * t - f * i),\n Ln(d * r + u * s)\n ];\n }\n return a.invert = function(o, l) {\n var c = ai(l), h = ai(o) * c, u = Qt(o) * c, f = Qt(l), d = f * r - u * s;\n return [\n La(u * r + f * s, h * t + d * i),\n Ln(d * t - h * i)\n ];\n }, a;\n}\nfunction nB(n, e, t, i, r, s) {\n if (t) {\n var a = ai(e), o = Qt(e), l = i * t;\n r == null ? (r = e + i * $r, s = e - l / 2) : (r = c_(a, r), s = c_(a, s), (i > 0 ? r < s : r > s) && (r += i * $r));\n for (var c, h = r; i > 0 ? h > s : h < s; h -= l)\n c = Bu([a, -o * ai(h), -o * Qt(h)]), n.point(c[0], c[1]);\n }\n}\nfunction c_(n, e) {\n e = Ua(e), e[0] -= n, ku(e);\n var t = rB(-e[1]);\n return ((-e[2] < 0 ? -t : t) + $r - Jt) % $r;\n}\nfunction Tv() {\n var n = [], e;\n return {\n point: function(t, i, r) {\n e.push([t, i, r]);\n },\n lineStart: function() {\n n.push(e = []);\n },\n lineEnd: io,\n rejoin: function() {\n n.length > 1 && n.push(n.pop().concat(n.shift()));\n },\n result: function() {\n var t = n;\n return n = [], e = null, t;\n }\n };\n}\nfunction jl(n, e) {\n return oi(n[0] - e[0]) < Jt && oi(n[1] - e[1]) < Jt;\n}\nfunction Dl(n, e, t, i) {\n this.x = n, this.z = e, this.o = t, this.e = i, this.v = !1, this.n = this.p = null;\n}\nfunction xv(n, e, t, i, r) {\n var s = [], a = [], o, l;\n if (n.forEach(function(p) {\n if (!((g = p.length - 1) <= 0)) {\n var g, m = p[0], v = p[g], E;\n if (jl(m, v)) {\n if (!m[2] && !v[2]) {\n for (r.lineStart(), o = 0; o < g; ++o)\n r.point((m = p[o])[0], m[1]);\n r.lineEnd();\n return;\n }\n v[0] += 2 * Jt;\n }\n s.push(E = new Dl(m, p, null, !0)), a.push(E.o = new Dl(m, null, E, !1)), s.push(E = new Dl(v, p, null, !1)), a.push(E.o = new Dl(v, null, E, !0));\n }\n }), !!s.length) {\n for (a.sort(e), h_(s), h_(a), o = 0, l = a.length; o < l; ++o)\n a[o].e = t = !t;\n for (var c = s[0], h, u; ; ) {\n for (var f = c, d = !0; f.v; )\n if ((f = f.n) === c)\n return;\n h = f.z, r.lineStart();\n do {\n if (f.v = f.o.v = !0, f.e) {\n if (d)\n for (o = 0, l = h.length; o < l; ++o)\n r.point((u = h[o])[0], u[1]);\n else\n i(f.x, f.n.x, 1, r);\n f = f.n;\n } else {\n if (d)\n for (h = f.p.z, o = h.length - 1; o >= 0; --o)\n r.point((u = h[o])[0], u[1]);\n else\n i(f.x, f.p.x, -1, r);\n f = f.p;\n }\n f = f.o, h = f.z, d = !d;\n } while (!f.v);\n r.lineEnd();\n }\n }\n}\nfunction h_(n) {\n if (e = n.length) {\n for (var e, t = 0, i = n[0], r; ++t < e; )\n i.n = r = n[t], r.p = i, i = r;\n i.n = r = n[0], r.p = i;\n }\n}\nfunction cu(n) {\n return oi(n[0]) <= yt ? n[0] : Zl(n[0]) * ((oi(n[0]) + yt) % $r - yt);\n}\nfunction aB(n, e) {\n var t = cu(e), i = e[1], r = Qt(i), s = [Qt(t), -ai(t), 0], a = 0, o = 0, l = new tV();\n r === 1 ? i = Nr + Jt : r === -1 && (i = -Nr - Jt);\n for (var c = 0, h = n.length; c < h; ++c)\n if (f = (u = n[c]).length)\n for (var u, f, d = u[f - 1], p = cu(d), g = d[1] / 2 + i_, m = Qt(g), v = ai(g), E = 0; E < f; ++E, p = T, m = x, v = S, d = C) {\n var C = u[E], T = cu(C), R = C[1] / 2 + i_, x = Qt(R), S = ai(R), M = T - p, N = M >= 0 ? 1 : -1, F = N * M, U = F > yt, H = m * x;\n if (l.add(La(H * N * Qt(F), v * S + H * ai(F))), a += U ? M + N * $r : M, U ^ p >= t ^ T >= t) {\n var q = Sc(Ua(d), Ua(C));\n ku(q);\n var Z = Sc(s, q);\n ku(Z);\n var k = (U ^ M >= 0 ? -1 : 1) * Ln(Z[2]);\n (i > k || i === k && (q[0] || q[1])) && (o += U ^ M >= 0 ? 1 : -1);\n }\n }\n return (a < -Jt || a < Jt && l < -tB) ^ o & 1;\n}\nfunction Cv(n, e, t, i) {\n return function(r) {\n var s = e(r), a = Tv(), o = e(a), l = !1, c, h, u, f = {\n point: d,\n lineStart: g,\n lineEnd: m,\n polygonStart: function() {\n f.point = v, f.lineStart = E, f.lineEnd = C, h = [], c = [];\n },\n polygonEnd: function() {\n f.point = d, f.lineStart = g, f.lineEnd = m, h = fv(h);\n var T = aB(c, i);\n h.length ? (l || (r.polygonStart(), l = !0), xv(h, lB, T, t, r)) : T && (l || (r.polygonStart(), l = !0), r.lineStart(), t(null, null, 1, r), r.lineEnd()), l && (r.polygonEnd(), l = !1), h = c = null;\n },\n sphere: function() {\n r.polygonStart(), r.lineStart(), t(null, null, 1, r), r.lineEnd(), r.polygonEnd();\n }\n };\n function d(T, R) {\n n(T, R) && r.point(T, R);\n }\n function p(T, R) {\n s.point(T, R);\n }\n function g() {\n f.point = p, s.lineStart();\n }\n function m() {\n f.point = d, s.lineEnd();\n }\n function v(T, R) {\n u.push([T, R]), o.point(T, R);\n }\n function E() {\n o.lineStart(), u = [];\n }\n function C() {\n v(u[0][0], u[0][1]), o.lineEnd();\n var T = o.clean(), R = a.result(), x, S = R.length, M, N, F;\n if (u.pop(), c.push(u), u = null, !!S) {\n if (T & 1) {\n if (N = R[0], (M = N.length - 1) > 0) {\n for (l || (r.polygonStart(), l = !0), r.lineStart(), x = 0; x < M; ++x)\n r.point((F = N[x])[0], F[1]);\n r.lineEnd();\n }\n return;\n }\n S > 1 && T & 2 && R.push(R.pop().concat(R.shift())), h.push(R.filter(oB));\n }\n }\n return f;\n };\n}\nfunction oB(n) {\n return n.length > 1;\n}\nfunction lB(n, e) {\n return ((n = n.x)[0] < 0 ? n[1] - Nr - Jt : Nr - n[1]) - ((e = e.x)[0] < 0 ? e[1] - Nr - Jt : Nr - e[1]);\n}\nconst u_ = Cv(\n function() {\n return !0;\n },\n cB,\n uB,\n [-yt, -Nr]\n);\nfunction cB(n) {\n var e = NaN, t = NaN, i = NaN, r;\n return {\n lineStart: function() {\n n.lineStart(), r = 1;\n },\n point: function(s, a) {\n var o = s > 0 ? yt : -yt, l = oi(s - e);\n oi(l - yt) < Jt ? (n.point(e, t = (t + a) / 2 > 0 ? Nr : -Nr), n.point(i, t), n.lineEnd(), n.lineStart(), n.point(o, t), n.point(s, t), r = 0) : i !== o && l >= yt && (oi(e - i) < Jt && (e -= i * Jt), oi(s - o) < Jt && (s -= o * Jt), t = hB(e, t, s, a), n.point(i, t), n.lineEnd(), n.lineStart(), n.point(o, t), r = 0), n.point(e = s, t = a), i = o;\n },\n lineEnd: function() {\n n.lineEnd(), e = t = NaN;\n },\n clean: function() {\n return 2 - r;\n }\n };\n}\nfunction hB(n, e, t, i) {\n var r, s, a = Qt(n - t);\n return oi(a) > Jt ? iB((Qt(e) * (s = ai(i)) * Qt(t) - Qt(i) * (r = ai(e)) * Qt(n)) / (r * s * a)) : (e + i) / 2;\n}\nfunction uB(n, e, t, i) {\n var r;\n if (n == null)\n r = t * Nr, i.point(-yt, r), i.point(0, r), i.point(yt, r), i.point(yt, 0), i.point(yt, -r), i.point(0, -r), i.point(-yt, -r), i.point(-yt, 0), i.point(-yt, r);\n else if (oi(n[0] - e[0]) > Jt) {\n var s = n[0] < e[0] ? yt : -yt;\n r = t * s / 2, i.point(-s, r), i.point(0, r), i.point(s, r);\n } else\n i.point(e[0], e[1]);\n}\nfunction fB(n) {\n var e = ai(n), t = 2 * qi, i = e > 0, r = oi(e) > Jt;\n function s(h, u, f, d) {\n nB(d, n, t, f, h, u);\n }\n function a(h, u) {\n return ai(h) * ai(u) > e;\n }\n function o(h) {\n var u, f, d, p, g;\n return {\n lineStart: function() {\n p = d = !1, g = 1;\n },\n point: function(m, v) {\n var E = [m, v], C, T = a(m, v), R = i ? T ? 0 : c(m, v) : T ? c(m + (m < 0 ? yt : -yt), v) : 0;\n if (!u && (p = d = T) && h.lineStart(), T !== d && (C = l(u, E), (!C || jl(u, C) || jl(E, C)) && (E[2] = 1)), T !== d)\n g = 0, T ? (h.lineStart(), C = l(E, u), h.point(C[0], C[1])) : (C = l(u, E), h.point(C[0], C[1], 2), h.lineEnd()), u = C;\n else if (r && u && i ^ T) {\n var x;\n !(R & f) && (x = l(E, u, !0)) && (g = 0, i ? (h.lineStart(), h.point(x[0][0], x[0][1]), h.point(x[1][0], x[1][1]), h.lineEnd()) : (h.point(x[1][0], x[1][1]), h.lineEnd(), h.lineStart(), h.point(x[0][0], x[0][1], 3)));\n }\n T && (!u || !jl(u, E)) && h.point(E[0], E[1]), u = E, d = T, f = R;\n },\n lineEnd: function() {\n d && h.lineEnd(), u = null;\n },\n // Rejoin first and last segments if there were intersections and the first\n // and last points were visible.\n clean: function() {\n return g | (p && d) << 1;\n }\n };\n }\n function l(h, u, f) {\n var d = Ua(h), p = Ua(u), g = [1, 0, 0], m = Sc(d, p), v = Pl(m, m), E = m[0], C = v - E * E;\n if (!C)\n return !f && h;\n var T = e * v / C, R = -e * E / C, x = Sc(g, m), S = Ol(g, T), M = Ol(m, R);\n lu(S, M);\n var N = x, F = Pl(S, N), U = Pl(N, N), H = F * F - U * (Pl(S, S) - 1);\n if (!(H < 0)) {\n var q = wa(H), Z = Ol(N, (-F - q) / U);\n if (lu(Z, S), Z = Bu(Z), !f)\n return Z;\n var k = h[0], Q = u[0], ce = h[1], de = u[1], j;\n Q < k && (j = k, k = Q, Q = j);\n var J = Q - k, O = oi(J - yt) < Jt, G = O || J < Jt;\n if (!O && de < ce && (j = ce, ce = de, de = j), G ? O ? ce + de > 0 ^ Z[1] < (oi(Z[0] - k) < Jt ? ce : de) : ce <= Z[1] && Z[1] <= de : J > yt ^ (k <= Z[0] && Z[0] <= Q)) {\n var ee = Ol(N, (-F + q) / U);\n return lu(ee, S), [Z, Bu(ee)];\n }\n }\n }\n function c(h, u) {\n var f = i ? n : yt - n, d = 0;\n return h < -f ? d |= 1 : h > f && (d |= 2), u < -f ? d |= 4 : u > f && (d |= 8), d;\n }\n return Cv(a, o, s, i ? [0, -n] : [-yt, n - yt]);\n}\nfunction dB(n, e, t, i, r, s) {\n var a = n[0], o = n[1], l = e[0], c = e[1], h = 0, u = 1, f = l - a, d = c - o, p;\n if (p = t - a, !(!f && p > 0)) {\n if (p /= f, f < 0) {\n if (p < h)\n return;\n p < u && (u = p);\n } else if (f > 0) {\n if (p > u)\n return;\n p > h && (h = p);\n }\n if (p = r - a, !(!f && p < 0)) {\n if (p /= f, f < 0) {\n if (p > u)\n return;\n p > h && (h = p);\n } else if (f > 0) {\n if (p < h)\n return;\n p < u && (u = p);\n }\n if (p = i - o, !(!d && p > 0)) {\n if (p /= d, d < 0) {\n if (p < h)\n return;\n p < u && (u = p);\n } else if (d > 0) {\n if (p > u)\n return;\n p > h && (h = p);\n }\n if (p = s - o, !(!d && p < 0)) {\n if (p /= d, d < 0) {\n if (p > u)\n return;\n p > h && (h = p);\n } else if (d > 0) {\n if (p < h)\n return;\n p < u && (u = p);\n }\n return h > 0 && (n[0] = a + h * f, n[1] = o + h * d), u < 1 && (e[0] = a + u * f, e[1] = o + u * d), !0;\n }\n }\n }\n }\n}\nvar ro = 1e9, Nl = -ro;\nfunction Rv(n, e, t, i) {\n function r(c, h) {\n return n <= c && c <= t && e <= h && h <= i;\n }\n function s(c, h, u, f) {\n var d = 0, p = 0;\n if (c == null || (d = a(c, u)) !== (p = a(h, u)) || l(c, h) < 0 ^ u > 0)\n do\n f.point(d === 0 || d === 3 ? n : t, d > 1 ? i : e);\n while ((d = (d + u + 4) % 4) !== p);\n else\n f.point(h[0], h[1]);\n }\n function a(c, h) {\n return oi(c[0] - n) < Jt ? h > 0 ? 0 : 3 : oi(c[0] - t) < Jt ? h > 0 ? 2 : 1 : oi(c[1] - e) < Jt ? h > 0 ? 1 : 0 : h > 0 ? 3 : 2;\n }\n function o(c, h) {\n return l(c.x, h.x);\n }\n function l(c, h) {\n var u = a(c, 1), f = a(h, 1);\n return u !== f ? u - f : u === 0 ? h[1] - c[1] : u === 1 ? c[0] - h[0] : u === 2 ? c[1] - h[1] : h[0] - c[0];\n }\n return function(c) {\n var h = c, u = Tv(), f, d, p, g, m, v, E, C, T, R, x, S = {\n point: M,\n lineStart: H,\n lineEnd: q,\n polygonStart: F,\n polygonEnd: U\n };\n function M(k, Q) {\n r(k, Q) && h.point(k, Q);\n }\n function N() {\n for (var k = 0, Q = 0, ce = d.length; Q < ce; ++Q)\n for (var de = d[Q], j = 1, J = de.length, O = de[0], G, ee, _e = O[0], Oe = O[1]; j < J; ++j)\n G = _e, ee = Oe, O = de[j], _e = O[0], Oe = O[1], ee <= i ? Oe > i && (_e - G) * (i - ee) > (Oe - ee) * (n - G) && ++k : Oe <= i && (_e - G) * (i - ee) < (Oe - ee) * (n - G) && --k;\n return k;\n }\n function F() {\n h = u, f = [], d = [], x = !0;\n }\n function U() {\n var k = N(), Q = x && k, ce = (f = fv(f)).length;\n (Q || ce) && (c.polygonStart(), Q && (c.lineStart(), s(null, null, 1, c), c.lineEnd()), ce && xv(f, o, k, s, c), c.polygonEnd()), h = c, f = d = p = null;\n }\n function H() {\n S.point = Z, d && d.push(p = []), R = !0, T = !1, E = C = NaN;\n }\n function q() {\n f && (Z(g, m), v && T && u.rejoin(), f.push(u.result())), S.point = M, T && h.lineEnd();\n }\n function Z(k, Q) {\n var ce = r(k, Q);\n if (d && p.push([k, Q]), R)\n g = k, m = Q, v = ce, R = !1, ce && (h.lineStart(), h.point(k, Q));\n else if (ce && T)\n h.point(k, Q);\n else {\n var de = [E = Math.max(Nl, Math.min(ro, E)), C = Math.max(Nl, Math.min(ro, C))], j = [k = Math.max(Nl, Math.min(ro, k)), Q = Math.max(Nl, Math.min(ro, Q))];\n dB(de, j, n, e, t, i) ? (T || (h.lineStart(), h.point(de[0], de[1])), h.point(j[0], j[1]), ce || h.lineEnd(), x = !1) : ce && (h.lineStart(), h.point(k, Q), x = !1);\n }\n E = k, C = Q, T = ce;\n }\n return S;\n };\n}\nconst yc = (n) => n;\nvar Va = 1 / 0, Ic = Va, Uo = -Va, bc = Uo, pB = {\n point: gB,\n lineStart: io,\n lineEnd: io,\n polygonStart: io,\n polygonEnd: io,\n result: function() {\n var n = [[Va, Ic], [Uo, bc]];\n return Uo = bc = -(Ic = Va = 1 / 0), n;\n }\n};\nfunction gB(n, e) {\n n < Va && (Va = n), n > Uo && (Uo = n), e < Ic && (Ic = e), e > bc && (bc = e);\n}\nconst f_ = pB;\nfunction nh(n) {\n return function(e) {\n var t = new Gu();\n for (var i in n)\n t[i] = n[i];\n return t.stream = e, t;\n };\n}\nfunction Gu() {\n}\nGu.prototype = {\n constructor: Gu,\n point: function(n, e) {\n this.stream.point(n, e);\n },\n sphere: function() {\n this.stream.sphere();\n },\n lineStart: function() {\n this.stream.lineStart();\n },\n lineEnd: function() {\n this.stream.lineEnd();\n },\n polygonStart: function() {\n this.stream.polygonStart();\n },\n polygonEnd: function() {\n this.stream.polygonEnd();\n }\n};\nfunction Ed(n, e, t) {\n var i = n.clipExtent && n.clipExtent();\n return n.scale(150).translate([0, 0]), i != null && n.clipExtent(null), vv(t, n.stream(f_)), e(f_.result()), i != null && n.clipExtent(i), n;\n}\nfunction vd(n, e, t) {\n return Ed(n, function(i) {\n var r = e[1][0] - e[0][0], s = e[1][1] - e[0][1], a = Math.min(r / (i[1][0] - i[0][0]), s / (i[1][1] - i[0][1])), o = +e[0][0] + (r - a * (i[1][0] + i[0][0])) / 2, l = +e[0][1] + (s - a * (i[1][1] + i[0][1])) / 2;\n n.scale(150 * a).translate([o, l]);\n }, t);\n}\nfunction Sv(n, e, t) {\n return vd(n, [[0, 0], e], t);\n}\nfunction yv(n, e, t) {\n return Ed(n, function(i) {\n var r = +e, s = r / (i[1][0] - i[0][0]), a = (r - s * (i[1][0] + i[0][0])) / 2, o = -s * i[0][1];\n n.scale(150 * s).translate([a, o]);\n }, t);\n}\nfunction Iv(n, e, t) {\n return Ed(n, function(i) {\n var r = +e, s = r / (i[1][1] - i[0][1]), a = -s * i[0][0], o = (r - s * (i[1][1] + i[0][1])) / 2;\n n.scale(150 * s).translate([a, o]);\n }, t);\n}\nvar d_ = 16, mB = ai(30 * qi);\nfunction p_(n, e) {\n return +e ? EB(n, e) : _B(n);\n}\nfunction _B(n) {\n return nh({\n point: function(e, t) {\n e = n(e, t), this.stream.point(e[0], e[1]);\n }\n });\n}\nfunction EB(n, e) {\n function t(i, r, s, a, o, l, c, h, u, f, d, p, g, m) {\n var v = c - i, E = h - r, C = v * v + E * E;\n if (C > 4 * e && g--) {\n var T = a + f, R = o + d, x = l + p, S = wa(T * T + R * R + x * x), M = Ln(x /= S), N = oi(oi(x) - 1) < Jt || oi(s - u) < Jt ? (s + u) / 2 : La(R, T), F = n(N, M), U = F[0], H = F[1], q = U - i, Z = H - r, k = E * q - v * Z;\n (k * k / C > e || oi((v * q + E * Z) / C - 0.5) > 0.3 || a * f + o * d + l * p < mB) && (t(i, r, s, a, o, l, U, H, N, T /= S, R /= S, x, g, m), m.point(U, H), t(U, H, N, T, R, x, c, h, u, f, d, p, g, m));\n }\n }\n return function(i) {\n var r, s, a, o, l, c, h, u, f, d, p, g, m = {\n point: v,\n lineStart: E,\n lineEnd: T,\n polygonStart: function() {\n i.polygonStart(), m.lineStart = R;\n },\n polygonEnd: function() {\n i.polygonEnd(), m.lineStart = E;\n }\n };\n function v(M, N) {\n M = n(M, N), i.point(M[0], M[1]);\n }\n function E() {\n u = NaN, m.point = C, i.lineStart();\n }\n function C(M, N) {\n var F = Ua([M, N]), U = n(M, N);\n t(u, f, h, d, p, g, u = U[0], f = U[1], h = M, d = F[0], p = F[1], g = F[2], d_, i), i.point(u, f);\n }\n function T() {\n m.point = v, i.lineEnd();\n }\n function R() {\n E(), m.point = x, m.lineEnd = S;\n }\n function x(M, N) {\n C(r = M, N), s = u, a = f, o = d, l = p, c = g, m.point = C;\n }\n function S() {\n t(u, f, h, d, p, g, s, a, r, o, l, c, d_, i), m.lineEnd = T, T();\n }\n return m;\n };\n}\nvar vB = nh({\n point: function(n, e) {\n this.stream.point(n * qi, e * qi);\n }\n});\nfunction TB(n) {\n return nh({\n point: function(e, t) {\n var i = n(e, t);\n return this.stream.point(i[0], i[1]);\n }\n });\n}\nfunction xB(n, e, t, i, r) {\n function s(a, o) {\n return a *= i, o *= r, [e + n * a, t - n * o];\n }\n return s.invert = function(a, o) {\n return [(a - e) / n * i, (t - o) / n * r];\n }, s;\n}\nfunction g_(n, e, t, i, r, s) {\n if (!s)\n return xB(n, e, t, i, r);\n var a = ai(s), o = Qt(s), l = a * n, c = o * n, h = a / n, u = o / n, f = (o * t - a * e) / n, d = (o * e + a * t) / n;\n function p(g, m) {\n return g *= i, m *= r, [l * g - c * m + e, t - c * g - l * m];\n }\n return p.invert = function(g, m) {\n return [i * (h * g - u * m + f), r * (d - u * g - h * m)];\n }, p;\n}\nfunction CB(n) {\n var e, t = 150, i = 480, r = 250, s = 0, a = 0, o = 0, l = 0, c = 0, h, u = 0, f = 1, d = 1, p = null, g = u_, m = null, v, E, C, T = yc, R = 0.5, x, S, M, N, F;\n function U(k) {\n return M(k[0] * qi, k[1] * qi);\n }\n function H(k) {\n return k = M.invert(k[0], k[1]), k && [k[0] * br, k[1] * br];\n }\n U.stream = function(k) {\n return N && F === k ? N : N = vB(TB(h)(g(x(T(F = k)))));\n }, U.preclip = function(k) {\n return arguments.length ? (g = k, p = void 0, Z()) : g;\n }, U.postclip = function(k) {\n return arguments.length ? (T = k, m = v = E = C = null, Z()) : T;\n }, U.clipAngle = function(k) {\n return arguments.length ? (g = +k ? fB(p = k * qi) : (p = null, u_), Z()) : p * br;\n }, U.clipExtent = function(k) {\n return arguments.length ? (T = k == null ? (m = v = E = C = null, yc) : Rv(m = +k[0][0], v = +k[0][1], E = +k[1][0], C = +k[1][1]), Z()) : m == null ? null : [[m, v], [E, C]];\n }, U.scale = function(k) {\n return arguments.length ? (t = +k, q()) : t;\n }, U.translate = function(k) {\n return arguments.length ? (i = +k[0], r = +k[1], q()) : [i, r];\n }, U.center = function(k) {\n return arguments.length ? (s = k[0] % 360 * qi, a = k[1] % 360 * qi, q()) : [s * br, a * br];\n }, U.rotate = function(k) {\n return arguments.length ? (o = k[0] % 360 * qi, l = k[1] % 360 * qi, c = k.length > 2 ? k[2] % 360 * qi : 0, q()) : [o * br, l * br, c * br];\n }, U.angle = function(k) {\n return arguments.length ? (u = k % 360 * qi, q()) : u * br;\n }, U.reflectX = function(k) {\n return arguments.length ? (f = k ? -1 : 1, q()) : f < 0;\n }, U.reflectY = function(k) {\n return arguments.length ? (d = k ? -1 : 1, q()) : d < 0;\n }, U.precision = function(k) {\n return arguments.length ? (x = p_(S, R = k * k), Z()) : wa(R);\n }, U.fitExtent = function(k, Q) {\n return vd(U, k, Q);\n }, U.fitSize = function(k, Q) {\n return Sv(U, k, Q);\n }, U.fitWidth = function(k, Q) {\n return yv(U, k, Q);\n }, U.fitHeight = function(k, Q) {\n return Iv(U, k, Q);\n };\n function q() {\n var k = g_(t, 0, 0, f, d, u).apply(null, e(s, a)), Q = g_(t, i - k[0], r - k[1], f, d, u);\n return h = sB(o, l, c), S = zu(e, Q), M = zu(h, S), x = p_(S, R), Z();\n }\n function Z() {\n return N = F = null, U;\n }\n return function() {\n return e = n.apply(this, arguments), U.invert = e.invert && H, q();\n };\n}\nfunction RB(n) {\n var e = 0, t = yt / 3, i = CB(n), r = i(e, t);\n return r.parallels = function(s) {\n return arguments.length ? i(e = s[0] * qi, t = s[1] * qi) : [e * br, t * br];\n }, r;\n}\nfunction SB(n) {\n var e = ai(n);\n function t(i, r) {\n return [i * e, Qt(r) / e];\n }\n return t.invert = function(i, r) {\n return [i / e, Ln(r * e)];\n }, t;\n}\nfunction yB(n, e) {\n var t = Qt(n), i = (t + Qt(e)) / 2;\n if (oi(i) < Jt)\n return SB(n);\n var r = 1 + t * (2 * i - t), s = wa(r) / i;\n function a(o, l) {\n var c = wa(r - 2 * i * Qt(l)) / i;\n return [c * Qt(o *= i), s - c * ai(o)];\n }\n return a.invert = function(o, l) {\n var c = s - l, h = La(o, oi(c)) * Zl(c);\n return c * i < 0 && (h -= yt * Zl(o) * Zl(c)), [h / i, Ln((r - (o * o + c * c) * i * i) / (2 * i))];\n }, a;\n}\nfunction IB() {\n return RB(yB).scale(155.424).center([0, 33.6442]);\n}\nfunction bB() {\n return IB().parallels([29.5, 45.5]).scale(1070).translate([480, 250]).rotate([96, 0]).center([-0.6, 38.7]);\n}\nfunction AB() {\n var n = 1, e = 0, t = 0, i = 1, r = 1, s = 0, a, o, l = null, c, h, u, f = 1, d = 1, p = nh({\n point: function(T, R) {\n var x = C([T, R]);\n this.stream.point(x[0], x[1]);\n }\n }), g = yc, m, v;\n function E() {\n return f = n * i, d = n * r, m = v = null, C;\n }\n function C(T) {\n var R = T[0] * f, x = T[1] * d;\n if (s) {\n var S = x * a - R * o;\n R = R * a + x * o, x = S;\n }\n return [R + e, x + t];\n }\n return C.invert = function(T) {\n var R = T[0] - e, x = T[1] - t;\n if (s) {\n var S = x * a + R * o;\n R = R * a - x * o, x = S;\n }\n return [R / f, x / d];\n }, C.stream = function(T) {\n return m && v === T ? m : m = p(g(v = T));\n }, C.postclip = function(T) {\n return arguments.length ? (g = T, l = c = h = u = null, E()) : g;\n }, C.clipExtent = function(T) {\n return arguments.length ? (g = T == null ? (l = c = h = u = null, yc) : Rv(l = +T[0][0], c = +T[0][1], h = +T[1][0], u = +T[1][1]), E()) : l == null ? null : [[l, c], [h, u]];\n }, C.scale = function(T) {\n return arguments.length ? (n = +T, E()) : n;\n }, C.translate = function(T) {\n return arguments.length ? (e = +T[0], t = +T[1], E()) : [e, t];\n }, C.angle = function(T) {\n return arguments.length ? (s = T % 360 * qi, o = Qt(s), a = ai(s), E()) : s * br;\n }, C.reflectX = function(T) {\n return arguments.length ? (i = T ? -1 : 1, E()) : i < 0;\n }, C.reflectY = function(T) {\n return arguments.length ? (r = T ? -1 : 1, E()) : r < 0;\n }, C.fitExtent = function(T, R) {\n return vd(C, T, R);\n }, C.fitSize = function(T, R) {\n return Sv(C, T, R);\n }, C.fitWidth = function(T, R) {\n return yv(C, T, R);\n }, C.fitHeight = function(T, R) {\n return Iv(C, T, R);\n }, C;\n}\nfunction MB(n) {\n return n;\n}\nfunction bv(n) {\n if (n == null)\n return MB;\n var e, t, i = n.scale[0], r = n.scale[1], s = n.translate[0], a = n.translate[1];\n return function(o, l) {\n l || (e = t = 0);\n var c = 2, h = o.length, u = new Array(h);\n for (u[0] = (e += o[0]) * i + s, u[1] = (t += o[1]) * r + a; c < h; )\n u[c] = o[c], ++c;\n return u;\n };\n}\nfunction PB(n, e) {\n for (var t, i = n.length, r = i - e; r < --i; )\n t = n[r], n[r++] = n[i], n[i] = t;\n}\nfunction OB(n, e) {\n return typeof e == \"string\" && (e = n.objects[e]), e.type === \"GeometryCollection\" ? { type: \"FeatureCollection\", features: e.geometries.map(function(t) {\n return m_(n, t);\n }) } : m_(n, e);\n}\nfunction m_(n, e) {\n var t = e.id, i = e.bbox, r = e.properties == null ? {} : e.properties, s = DB(n, e);\n return t == null && i == null ? { type: \"Feature\", properties: r, geometry: s } : i == null ? { type: \"Feature\", id: t, properties: r, geometry: s } : { type: \"Feature\", id: t, bbox: i, properties: r, geometry: s };\n}\nfunction DB(n, e) {\n var t = bv(n.transform), i = n.arcs;\n function r(h, u) {\n u.length && u.pop();\n for (var f = i[h < 0 ? ~h : h], d = 0, p = f.length; d < p; ++d)\n u.push(t(f[d], d));\n h < 0 && PB(u, p);\n }\n function s(h) {\n return t(h);\n }\n function a(h) {\n for (var u = [], f = 0, d = h.length; f < d; ++f)\n r(h[f], u);\n return u.length < 2 && u.push(u[0]), u;\n }\n function o(h) {\n for (var u = a(h); u.length < 4; )\n u.push(u[0]);\n return u;\n }\n function l(h) {\n return h.map(o);\n }\n function c(h) {\n var u = h.type, f;\n switch (u) {\n case \"GeometryCollection\":\n return { type: u, geometries: h.geometries.map(c) };\n case \"Point\":\n f = s(h.coordinates);\n break;\n case \"MultiPoint\":\n f = h.coordinates.map(s);\n break;\n case \"LineString\":\n f = a(h.arcs);\n break;\n case \"MultiLineString\":\n f = h.arcs.map(a);\n break;\n case \"Polygon\":\n f = l(h.arcs);\n break;\n case \"MultiPolygon\":\n f = h.arcs.map(l);\n break;\n default:\n return null;\n }\n return { type: u, coordinates: f };\n }\n return c(e);\n}\nfunction NB(n) {\n var e = n[0], t = n[1], i = n[2];\n return Math.abs((e[0] - i[0]) * (t[1] - e[1]) - (e[0] - t[0]) * (i[1] - e[1])) / 2;\n}\nfunction Fl(n, e) {\n return n[1][2] - e[1][2];\n}\nfunction FB() {\n var n = {}, e = [], t = 0;\n n.push = function(s) {\n return i(e[s._ = t] = s, t++), t;\n }, n.pop = function() {\n if (!(t <= 0)) {\n var s = e[0], a;\n return --t > 0 && (a = e[t], r(e[a._ = 0] = a, 0)), s;\n }\n }, n.remove = function(s) {\n var a = s._, o;\n if (e[a] === s)\n return a !== --t && (o = e[t], (Fl(o, s) < 0 ? i : r)(e[o._ = a] = o, a)), a;\n };\n function i(s, a) {\n for (; a > 0; ) {\n var o = (a + 1 >> 1) - 1, l = e[o];\n if (Fl(s, l) >= 0)\n break;\n e[l._ = a] = l, e[s._ = a = o] = s;\n }\n }\n function r(s, a) {\n for (; ; ) {\n var o = a + 1 << 1, l = o - 1, c = a, h = e[c];\n if (l < t && Fl(e[l], h) < 0 && (h = e[c = l]), o < t && Fl(e[o], h) < 0 && (h = e[c = o]), c === a)\n break;\n e[h._ = a] = h, e[s._ = a = c] = s;\n }\n }\n return n;\n}\nfunction LB(n) {\n return [n[0], n[1], 0];\n}\nfunction wB(n, e) {\n var t = n.transform ? bv(n.transform) : LB, i = FB();\n e == null && (e = NB);\n var r = n.arcs.map(function(a) {\n var o = [], l = 0, c, h, u;\n for (a = a.map(t), h = 1, u = a.length - 1; h < u; ++h)\n c = [a[h - 1], a[h], a[h + 1]], c[1][2] = e(c), o.push(c), i.push(c);\n for (a[0][2] = a[u][2] = 1 / 0, h = 0, u = o.length; h < u; ++h)\n c = o[h], c.previous = o[h - 1], c.next = o[h + 1];\n for (; c = i.pop(); ) {\n var f = c.previous, d = c.next;\n c[1][2] < l ? c[1][2] = l : l = c[1][2], f && (f.next = d, f[2] = c[2], s(f)), d && (d.previous = f, d[0] = c[0], s(d));\n }\n return a;\n });\n function s(a) {\n i.remove(a), a[1][2] = e(a), i.push(a);\n }\n return {\n type: \"Topology\",\n bbox: n.bbox,\n objects: n.objects,\n arcs: r\n };\n}\nfunction UB(n, e) {\n e = e == null ? Number.MIN_VALUE : +e;\n var t = n.arcs.map(function(i) {\n for (var r = -1, s = 0, a = i.length, o = new Array(a), l; ++r < a; )\n (l = i[r])[2] >= e && (o[s++] = [l[0], l[1]]);\n return o.length = s, o;\n });\n return {\n type: \"Topology\",\n transform: n.transform,\n bbox: n.bbox,\n objects: n.objects,\n arcs: t\n };\n}\nvar ah = Object.prototype.hasOwnProperty;\nfunction VB(n) {\n var e = 1 / 0, t = 1 / 0, i = -1 / 0, r = -1 / 0;\n function s(u) {\n u != null && ah.call(a, u.type) && a[u.type](u);\n }\n var a = {\n GeometryCollection: function(u) {\n u.geometries.forEach(s);\n },\n Point: function(u) {\n o(u.coordinates);\n },\n MultiPoint: function(u) {\n u.coordinates.forEach(o);\n },\n LineString: function(u) {\n l(u.arcs);\n },\n MultiLineString: function(u) {\n u.arcs.forEach(l);\n },\n Polygon: function(u) {\n u.arcs.forEach(l);\n },\n MultiPolygon: function(u) {\n u.arcs.forEach(c);\n }\n };\n function o(u) {\n var f = u[0], d = u[1];\n f < e && (e = f), f > i && (i = f), d < t && (t = d), d > r && (r = d);\n }\n function l(u) {\n u.forEach(o);\n }\n function c(u) {\n u.forEach(l);\n }\n for (var h in n)\n s(n[h]);\n return i >= e && r >= t ? [e, t, i, r] : void 0;\n}\nfunction BB(n, e, t, i, r) {\n arguments.length === 3 && (i = Array, r = null);\n for (var s = new i(n = 1 << Math.max(4, Math.ceil(Math.log(n) / Math.LN2))), a = n - 1, o = 0; o < n; ++o)\n s[o] = r;\n function l(u) {\n for (var f = e(u) & a, d = s[f], p = 0; d != r; ) {\n if (t(d, u))\n return !0;\n if (++p >= n)\n throw new Error(\"full hashset\");\n d = s[f = f + 1 & a];\n }\n return s[f] = u, !0;\n }\n function c(u) {\n for (var f = e(u) & a, d = s[f], p = 0; d != r; ) {\n if (t(d, u))\n return !0;\n if (++p >= n)\n break;\n d = s[f = f + 1 & a];\n }\n return !1;\n }\n function h() {\n for (var u = [], f = 0, d = s.length; f < d; ++f) {\n var p = s[f];\n p != r && u.push(p);\n }\n return u;\n }\n return {\n add: l,\n has: c,\n values: h\n };\n}\nfunction Td(n, e, t, i, r, s) {\n arguments.length === 3 && (i = s = Array, r = null);\n for (var a = new i(n = 1 << Math.max(4, Math.ceil(Math.log(n) / Math.LN2))), o = new s(n), l = n - 1, c = 0; c < n; ++c)\n a[c] = r;\n function h(p, g) {\n for (var m = e(p) & l, v = a[m], E = 0; v != r; ) {\n if (t(v, p))\n return o[m] = g;\n if (++E >= n)\n throw new Error(\"full hashmap\");\n v = a[m = m + 1 & l];\n }\n return a[m] = p, o[m] = g, g;\n }\n function u(p, g) {\n for (var m = e(p) & l, v = a[m], E = 0; v != r; ) {\n if (t(v, p))\n return o[m];\n if (++E >= n)\n throw new Error(\"full hashmap\");\n v = a[m = m + 1 & l];\n }\n return a[m] = p, o[m] = g, g;\n }\n function f(p, g) {\n for (var m = e(p) & l, v = a[m], E = 0; v != r; ) {\n if (t(v, p))\n return o[m];\n if (++E >= n)\n break;\n v = a[m = m + 1 & l];\n }\n return g;\n }\n function d() {\n for (var p = [], g = 0, m = a.length; g < m; ++g) {\n var v = a[g];\n v != r && p.push(v);\n }\n return p;\n }\n return {\n set: h,\n maybeSet: u,\n // set if unset\n get: f,\n keys: d\n };\n}\nfunction yn(n, e) {\n return n[0] === e[0] && n[1] === e[1];\n}\nvar Av = new ArrayBuffer(16), __ = new Float64Array(Av), Ll = new Uint32Array(Av);\nfunction Xu(n) {\n __[0] = n[0], __[1] = n[1];\n var e = Ll[0] ^ Ll[1];\n return e = e << 5 ^ e >> 7 ^ Ll[2] ^ Ll[3], e & 2147483647;\n}\nfunction kB(n) {\n var e = n.coordinates, t = n.lines, i = n.rings, r = x(), s = new Int32Array(e.length), a = new Int32Array(e.length), o = new Int32Array(e.length), l = new Int8Array(e.length), c = 0, h, u, f, d, p;\n for (h = 0, u = e.length; h < u; ++h)\n s[h] = a[h] = o[h] = -1;\n for (h = 0, u = t.length; h < u; ++h) {\n var g = t[h], m = g[0], v = g[1];\n for (d = r[m], p = r[++m], ++c, l[d] = 1; ++m <= v; )\n R(h, f = d, d = p, p = r[m]);\n ++c, l[p] = 1;\n }\n for (h = 0, u = e.length; h < u; ++h)\n s[h] = -1;\n for (h = 0, u = i.length; h < u; ++h) {\n var E = i[h], C = E[0] + 1, T = E[1];\n for (f = r[T - 1], d = r[C - 1], p = r[C], R(h, f, d, p); ++C <= T; )\n R(h, f = d, d = p, p = r[C]);\n }\n function R(U, H, q, Z) {\n if (s[q] !== U) {\n s[q] = U;\n var k = a[q];\n if (k >= 0) {\n var Q = o[q];\n (k !== H || Q !== Z) && (k !== Z || Q !== H) && (++c, l[q] = 1);\n } else\n a[q] = H, o[q] = Z;\n }\n }\n function x() {\n for (var U = Td(e.length * 1.4, S, M, Int32Array, -1, Int32Array), H = new Int32Array(e.length), q = 0, Z = e.length; q < Z; ++q)\n H[q] = U.maybeSet(q, q);\n return H;\n }\n function S(U) {\n return Xu(e[U]);\n }\n function M(U, H) {\n return yn(e[U], e[H]);\n }\n s = a = o = null;\n var N = BB(c * 1.4, Xu, yn), F;\n for (h = 0, u = e.length; h < u; ++h)\n l[F = r[h]] && N.add(e[F]);\n return N;\n}\nfunction zB(n) {\n var e = kB(n), t = n.coordinates, i = n.lines, r = n.rings, s, a, o;\n for (a = 0, o = i.length; a < o; ++a)\n for (var l = i[a], c = l[0], h = l[1]; ++c < h; )\n e.has(t[c]) && (s = { 0: c, 1: l[1] }, l[1] = c, l = l.next = s);\n for (a = 0, o = r.length; a < o; ++a)\n for (var u = r[a], f = u[0], d = f, p = u[1], g = e.has(t[f]); ++d < p; )\n e.has(t[d]) && (g ? (s = { 0: d, 1: u[1] }, u[1] = d, u = u.next = s) : (WB(t, f, p, p - d), t[p] = t[f], g = !0, d = f));\n return n;\n}\nfunction WB(n, e, t, i) {\n hu(n, e, t), hu(n, e, e + i), hu(n, e + i, t);\n}\nfunction hu(n, e, t) {\n for (var i = e + (t-- - e >> 1), r; e < i; ++e, --t)\n r = n[e], n[e] = n[t], n[t] = r;\n}\nfunction GB(n) {\n var e = n.coordinates, t = n.lines, i, r = n.rings, s, a = t.length + r.length, o, l;\n for (delete n.lines, delete n.rings, o = 0, l = t.length; o < l; ++o)\n for (i = t[o]; i = i.next; )\n ++a;\n for (o = 0, l = r.length; o < l; ++o)\n for (s = r[o]; s = s.next; )\n ++a;\n var c = Td(a * 2 * 1.4, Xu, yn), h = n.arcs = [];\n for (o = 0, l = t.length; o < l; ++o) {\n i = t[o];\n do\n u(i);\n while (i = i.next);\n }\n for (o = 0, l = r.length; o < l; ++o)\n if (s = r[o], s.next)\n do\n u(s);\n while (s = s.next);\n else\n f(s);\n function u(E) {\n var C, T, R, x, S, M, N, F;\n if (R = c.get(C = e[E[0]])) {\n for (N = 0, F = R.length; N < F; ++N)\n if (x = R[N], d(x, E)) {\n E[0] = x[0], E[1] = x[1];\n return;\n }\n }\n if (S = c.get(T = e[E[1]])) {\n for (N = 0, F = S.length; N < F; ++N)\n if (M = S[N], p(M, E)) {\n E[1] = M[0], E[0] = M[1];\n return;\n }\n }\n R ? R.push(E) : c.set(C, [E]), S ? S.push(E) : c.set(T, [E]), h.push(E);\n }\n function f(E) {\n var C, T, R, x, S;\n if (T = c.get(C = e[E[0]]))\n for (x = 0, S = T.length; x < S; ++x) {\n if (R = T[x], g(R, E)) {\n E[0] = R[0], E[1] = R[1];\n return;\n }\n if (m(R, E)) {\n E[0] = R[1], E[1] = R[0];\n return;\n }\n }\n if (T = c.get(C = e[E[0] + v(E)]))\n for (x = 0, S = T.length; x < S; ++x) {\n if (R = T[x], g(R, E)) {\n E[0] = R[0], E[1] = R[1];\n return;\n }\n if (m(R, E)) {\n E[0] = R[1], E[1] = R[0];\n return;\n }\n }\n T ? T.push(E) : c.set(C, [E]), h.push(E);\n }\n function d(E, C) {\n var T = E[0], R = C[0], x = E[1], S = C[1];\n if (T - x !== R - S)\n return !1;\n for (; T <= x; ++T, ++R)\n if (!yn(e[T], e[R]))\n return !1;\n return !0;\n }\n function p(E, C) {\n var T = E[0], R = C[0], x = E[1], S = C[1];\n if (T - x !== R - S)\n return !1;\n for (; T <= x; ++T, --S)\n if (!yn(e[T], e[S]))\n return !1;\n return !0;\n }\n function g(E, C) {\n var T = E[0], R = C[0], x = E[1], S = C[1], M = x - T;\n if (M !== S - R)\n return !1;\n for (var N = v(E), F = v(C), U = 0; U < M; ++U)\n if (!yn(e[T + (U + N) % M], e[R + (U + F) % M]))\n return !1;\n return !0;\n }\n function m(E, C) {\n var T = E[0], R = C[0], x = E[1], S = C[1], M = x - T;\n if (M !== S - R)\n return !1;\n for (var N = v(E), F = M - v(C), U = 0; U < M; ++U)\n if (!yn(e[T + (U + N) % M], e[S - (U + F) % M]))\n return !1;\n return !0;\n }\n function v(E) {\n for (var C = E[0], T = E[1], R = C, x = R, S = e[R]; ++R < T; ) {\n var M = e[R];\n (M[0] < S[0] || M[0] === S[0] && M[1] < S[1]) && (x = R, S = M);\n }\n return x - C;\n }\n return n;\n}\nfunction XB(n) {\n for (var e = -1, t = n.length; ++e < t; ) {\n for (var i = n[e], r = 0, s = 1, a = i.length, o = i[0], l = o[0], c = o[1], h, u; ++r < a; )\n o = i[r], h = o[0], u = o[1], (h !== l || u !== c) && (i[s++] = [h - l, u - c], l = h, c = u);\n s === 1 && (i[s++] = [0, 0]), i.length = s;\n }\n return n;\n}\nfunction HB(n) {\n var e = -1, t = [], i = [], r = [];\n function s(u) {\n u && ah.call(a, u.type) && a[u.type](u);\n }\n var a = {\n GeometryCollection: function(u) {\n u.geometries.forEach(s);\n },\n LineString: function(u) {\n u.arcs = o(u.arcs);\n },\n MultiLineString: function(u) {\n u.arcs = u.arcs.map(o);\n },\n Polygon: function(u) {\n u.arcs = u.arcs.map(l);\n },\n MultiPolygon: function(u) {\n u.arcs = u.arcs.map(c);\n }\n };\n function o(u) {\n for (var f = 0, d = u.length; f < d; ++f)\n r[++e] = u[f];\n var p = { 0: e - d + 1, 1: e };\n return t.push(p), p;\n }\n function l(u) {\n for (var f = 0, d = u.length; f < d; ++f)\n r[++e] = u[f];\n var p = { 0: e - d + 1, 1: e };\n return i.push(p), p;\n }\n function c(u) {\n return u.map(l);\n }\n for (var h in n)\n s(n[h]);\n return {\n type: \"Topology\",\n coordinates: r,\n lines: t,\n rings: i,\n objects: n\n };\n}\nfunction KB(n) {\n var e = {}, t;\n for (t in n)\n e[t] = qB(n[t]);\n return e;\n}\nfunction qB(n) {\n return n == null ? { type: null } : (n.type === \"FeatureCollection\" ? YB : n.type === \"Feature\" ? Mv : xd)(n);\n}\nfunction YB(n) {\n var e = { type: \"GeometryCollection\", geometries: n.features.map(Mv) };\n return n.bbox != null && (e.bbox = n.bbox), e;\n}\nfunction Mv(n) {\n var e = xd(n.geometry), t;\n n.id != null && (e.id = n.id), n.bbox != null && (e.bbox = n.bbox);\n for (t in n.properties) {\n e.properties = n.properties;\n break;\n }\n return e;\n}\nfunction xd(n) {\n if (n == null)\n return { type: null };\n var e = n.type === \"GeometryCollection\" ? { type: \"GeometryCollection\", geometries: n.geometries.map(xd) } : n.type === \"Point\" || n.type === \"MultiPoint\" ? { type: n.type, coordinates: n.coordinates } : { type: n.type, arcs: n.coordinates };\n return n.bbox != null && (e.bbox = n.bbox), e;\n}\nfunction ZB(n, e, t) {\n var i = e[0], r = e[1], s = e[2], a = e[3], o = s - i ? (t - 1) / (s - i) : 1, l = a - r ? (t - 1) / (a - r) : 1;\n function c(v) {\n return [Math.round((v[0] - i) * o), Math.round((v[1] - r) * l)];\n }\n function h(v, E) {\n for (var C = -1, T = 0, R = v.length, x = new Array(R), S, M, N, F, U; ++C < R; )\n S = v[C], F = Math.round((S[0] - i) * o), U = Math.round((S[1] - r) * l), (F !== M || U !== N) && (x[T++] = [M = F, N = U]);\n for (x.length = T; T < E; )\n T = x.push([x[0][0], x[0][1]]);\n return x;\n }\n function u(v) {\n return h(v, 2);\n }\n function f(v) {\n return h(v, 4);\n }\n function d(v) {\n return v.map(f);\n }\n function p(v) {\n v != null && ah.call(g, v.type) && g[v.type](v);\n }\n var g = {\n GeometryCollection: function(v) {\n v.geometries.forEach(p);\n },\n Point: function(v) {\n v.coordinates = c(v.coordinates);\n },\n MultiPoint: function(v) {\n v.coordinates = v.coordinates.map(c);\n },\n LineString: function(v) {\n v.arcs = u(v.arcs);\n },\n MultiLineString: function(v) {\n v.arcs = v.arcs.map(u);\n },\n Polygon: function(v) {\n v.arcs = d(v.arcs);\n },\n MultiPolygon: function(v) {\n v.arcs = v.arcs.map(d);\n }\n };\n for (var m in n)\n p(n[m]);\n return {\n scale: [1 / o, 1 / l],\n translate: [i, r]\n };\n}\nfunction jB(n, e) {\n var t = VB(n = KB(n)), i = e > 0 && t && ZB(n, t, e), r = GB(zB(HB(n))), s = r.coordinates, a = Td(r.arcs.length * 1.4, QB, JB);\n n = r.objects, r.bbox = t, r.arcs = r.arcs.map(function(f, d) {\n return a.set(f, d), s.slice(f[0], f[1] + 1);\n }), delete r.coordinates, s = null;\n function o(f) {\n f && ah.call(l, f.type) && l[f.type](f);\n }\n var l = {\n GeometryCollection: function(f) {\n f.geometries.forEach(o);\n },\n LineString: function(f) {\n f.arcs = c(f.arcs);\n },\n MultiLineString: function(f) {\n f.arcs = f.arcs.map(c);\n },\n Polygon: function(f) {\n f.arcs = f.arcs.map(c);\n },\n MultiPolygon: function(f) {\n f.arcs = f.arcs.map(h);\n }\n };\n function c(f) {\n var d = [];\n do {\n var p = a.get(f);\n d.push(f[0] < f[1] ? p : ~p);\n } while (f = f.next);\n return d;\n }\n function h(f) {\n return f.map(c);\n }\n for (var u in n)\n o(n[u]);\n return i && (r.transform = i, r.arcs = XB(r.arcs)), r;\n}\nfunction QB(n) {\n var e = n[0], t = n[1], i;\n return t < e && (i = e, e = t, t = i), e + 31 * t;\n}\nfunction JB(n, e) {\n var t = n[0], i = n[1], r = e[0], s = e[1], a;\n return i < t && (a = t, t = i, i = a), s < r && (a = r, r = s, s = a), t === r && i === s;\n}\nvar Cd = { exports: {} };\nCd.exports = oh;\nCd.exports.default = oh;\nfunction oh(n, e, t) {\n t = t || 2;\n var i = e && e.length, r = i ? e[0] * t : n.length, s = Pv(n, 0, r, t, !0), a = [];\n if (!s || s.next === s.prev)\n return a;\n var o, l, c, h, u, f, d;\n if (i && (s = rk(n, e, s, t)), n.length > 80 * t) {\n o = c = n[0], l = h = n[1];\n for (var p = t; p < r; p += t)\n u = n[p], f = n[p + 1], u < o && (o = u), f < l && (l = f), u > c && (c = u), f > h && (h = f);\n d = Math.max(c - o, h - l), d = d !== 0 ? 32767 / d : 0;\n }\n return Vo(s, a, t, o, l, d, 0), a;\n}\nfunction Pv(n, e, t, i, r) {\n var s, a;\n if (r === qu(n, e, t, i) > 0)\n for (s = e; s < t; s += i)\n a = E_(s, n[s], n[s + 1], a);\n else\n for (s = t - i; s >= e; s -= i)\n a = E_(s, n[s], n[s + 1], a);\n return a && lh(a, a.next) && (ko(a), a = a.next), a;\n}\nfunction wn(n, e) {\n if (!n)\n return n;\n e || (e = n);\n var t = n, i;\n do\n if (i = !1, !t.steiner && (lh(t, t.next) || ci(t.prev, t, t.next) === 0)) {\n if (ko(t), t = e = t.prev, t === t.next)\n break;\n i = !0;\n } else\n t = t.next;\n while (i || t !== e);\n return e;\n}\nfunction Vo(n, e, t, i, r, s, a) {\n if (n) {\n !a && s && lk(n, i, r, s);\n for (var o = n, l, c; n.prev !== n.next; ) {\n if (l = n.prev, c = n.next, s ? ek(n, i, r, s) : $B(n)) {\n e.push(l.i / t | 0), e.push(n.i / t | 0), e.push(c.i / t | 0), ko(n), n = c.next, o = c.next;\n continue;\n }\n if (n = c, n === o) {\n a ? a === 1 ? (n = tk(wn(n), e, t), Vo(n, e, t, i, r, s, 2)) : a === 2 && ik(n, e, t, i, r, s) : Vo(wn(n), e, t, i, r, s, 1);\n break;\n }\n }\n }\n}\nfunction $B(n) {\n var e = n.prev, t = n, i = n.next;\n if (ci(e, t, i) >= 0)\n return !1;\n for (var r = e.x, s = t.x, a = i.x, o = e.y, l = t.y, c = i.y, h = r < s ? r < a ? r : a : s < a ? s : a, u = o < l ? o < c ? o : c : l < c ? l : c, f = r > s ? r > a ? r : a : s > a ? s : a, d = o > l ? o > c ? o : c : l > c ? l : c, p = i.next; p !== e; ) {\n if (p.x >= h && p.x <= f && p.y >= u && p.y <= d && fa(r, o, s, l, a, c, p.x, p.y) && ci(p.prev, p, p.next) >= 0)\n return !1;\n p = p.next;\n }\n return !0;\n}\nfunction ek(n, e, t, i) {\n var r = n.prev, s = n, a = n.next;\n if (ci(r, s, a) >= 0)\n return !1;\n for (var o = r.x, l = s.x, c = a.x, h = r.y, u = s.y, f = a.y, d = o < l ? o < c ? o : c : l < c ? l : c, p = h < u ? h < f ? h : f : u < f ? u : f, g = o > l ? o > c ? o : c : l > c ? l : c, m = h > u ? h > f ? h : f : u > f ? u : f, v = Hu(d, p, e, t, i), E = Hu(g, m, e, t, i), C = n.prevZ, T = n.nextZ; C && C.z >= v && T && T.z <= E; ) {\n if (C.x >= d && C.x <= g && C.y >= p && C.y <= m && C !== r && C !== a && fa(o, h, l, u, c, f, C.x, C.y) && ci(C.prev, C, C.next) >= 0 || (C = C.prevZ, T.x >= d && T.x <= g && T.y >= p && T.y <= m && T !== r && T !== a && fa(o, h, l, u, c, f, T.x, T.y) && ci(T.prev, T, T.next) >= 0))\n return !1;\n T = T.nextZ;\n }\n for (; C && C.z >= v; ) {\n if (C.x >= d && C.x <= g && C.y >= p && C.y <= m && C !== r && C !== a && fa(o, h, l, u, c, f, C.x, C.y) && ci(C.prev, C, C.next) >= 0)\n return !1;\n C = C.prevZ;\n }\n for (; T && T.z <= E; ) {\n if (T.x >= d && T.x <= g && T.y >= p && T.y <= m && T !== r && T !== a && fa(o, h, l, u, c, f, T.x, T.y) && ci(T.prev, T, T.next) >= 0)\n return !1;\n T = T.nextZ;\n }\n return !0;\n}\nfunction tk(n, e, t) {\n var i = n;\n do {\n var r = i.prev, s = i.next.next;\n !lh(r, s) && Ov(r, i, i.next, s) && Bo(r, s) && Bo(s, r) && (e.push(r.i / t | 0), e.push(i.i / t | 0), e.push(s.i / t | 0), ko(i), ko(i.next), i = n = s), i = i.next;\n } while (i !== n);\n return wn(i);\n}\nfunction ik(n, e, t, i, r, s) {\n var a = n;\n do {\n for (var o = a.next.next; o !== a.prev; ) {\n if (a.i !== o.i && uk(a, o)) {\n var l = Dv(a, o);\n a = wn(a, a.next), l = wn(l, l.next), Vo(a, e, t, i, r, s, 0), Vo(l, e, t, i, r, s, 0);\n return;\n }\n o = o.next;\n }\n a = a.next;\n } while (a !== n);\n}\nfunction rk(n, e, t, i) {\n var r = [], s, a, o, l, c;\n for (s = 0, a = e.length; s < a; s++)\n o = e[s] * i, l = s < a - 1 ? e[s + 1] * i : n.length, c = Pv(n, o, l, i, !1), c === c.next && (c.steiner = !0), r.push(hk(c));\n for (r.sort(sk), s = 0; s < r.length; s++)\n t = nk(r[s], t);\n return t;\n}\nfunction sk(n, e) {\n return n.x - e.x;\n}\nfunction nk(n, e) {\n var t = ak(n, e);\n if (!t)\n return e;\n var i = Dv(t, n);\n return wn(i, i.next), wn(t, t.next);\n}\nfunction ak(n, e) {\n var t = e, i = n.x, r = n.y, s = -1 / 0, a;\n do {\n if (r <= t.y && r >= t.next.y && t.next.y !== t.y) {\n var o = t.x + (r - t.y) * (t.next.x - t.x) / (t.next.y - t.y);\n if (o <= i && o > s && (s = o, a = t.x < t.next.x ? t : t.next, o === i))\n return a;\n }\n t = t.next;\n } while (t !== e);\n if (!a)\n return null;\n var l = a, c = a.x, h = a.y, u = 1 / 0, f;\n t = a;\n do\n i >= t.x && t.x >= c && i !== t.x && fa(r < h ? i : s, r, c, h, r < h ? s : i, r, t.x, t.y) && (f = Math.abs(r - t.y) / (i - t.x), Bo(t, n) && (f < u || f === u && (t.x > a.x || t.x === a.x && ok(a, t))) && (a = t, u = f)), t = t.next;\n while (t !== l);\n return a;\n}\nfunction ok(n, e) {\n return ci(n.prev, n, e.prev) < 0 && ci(e.next, n, n.next) < 0;\n}\nfunction lk(n, e, t, i) {\n var r = n;\n do\n r.z === 0 && (r.z = Hu(r.x, r.y, e, t, i)), r.prevZ = r.prev, r.nextZ = r.next, r = r.next;\n while (r !== n);\n r.prevZ.nextZ = null, r.prevZ = null, ck(r);\n}\nfunction ck(n) {\n var e, t, i, r, s, a, o, l, c = 1;\n do {\n for (t = n, n = null, s = null, a = 0; t; ) {\n for (a++, i = t, o = 0, e = 0; e < c && (o++, i = i.nextZ, !!i); e++)\n ;\n for (l = c; o > 0 || l > 0 && i; )\n o !== 0 && (l === 0 || !i || t.z <= i.z) ? (r = t, t = t.nextZ, o--) : (r = i, i = i.nextZ, l--), s ? s.nextZ = r : n = r, r.prevZ = s, s = r;\n t = i;\n }\n s.nextZ = null, c *= 2;\n } while (a > 1);\n return n;\n}\nfunction Hu(n, e, t, i, r) {\n return n = (n - t) * r | 0, e = (e - i) * r | 0, n = (n | n << 8) & 16711935, n = (n | n << 4) & 252645135, n = (n | n << 2) & 858993459, n = (n | n << 1) & 1431655765, e = (e | e << 8) & 16711935, e = (e | e << 4) & 252645135, e = (e | e << 2) & 858993459, e = (e | e << 1) & 1431655765, n | e << 1;\n}\nfunction hk(n) {\n var e = n, t = n;\n do\n (e.x < t.x || e.x === t.x && e.y < t.y) && (t = e), e = e.next;\n while (e !== n);\n return t;\n}\nfunction fa(n, e, t, i, r, s, a, o) {\n return (r - a) * (e - o) >= (n - a) * (s - o) && (n - a) * (i - o) >= (t - a) * (e - o) && (t - a) * (s - o) >= (r - a) * (i - o);\n}\nfunction uk(n, e) {\n return n.next.i !== e.i && n.prev.i !== e.i && !fk(n, e) && // dones't intersect other edges\n (Bo(n, e) && Bo(e, n) && dk(n, e) && // locally visible\n (ci(n.prev, n, e.prev) || ci(n, e.prev, e)) || // does not create opposite-facing sectors\n lh(n, e) && ci(n.prev, n, n.next) > 0 && ci(e.prev, e, e.next) > 0);\n}\nfunction ci(n, e, t) {\n return (e.y - n.y) * (t.x - e.x) - (e.x - n.x) * (t.y - e.y);\n}\nfunction lh(n, e) {\n return n.x === e.x && n.y === e.y;\n}\nfunction Ov(n, e, t, i) {\n var r = Ul(ci(n, e, t)), s = Ul(ci(n, e, i)), a = Ul(ci(t, i, n)), o = Ul(ci(t, i, e));\n return !!(r !== s && a !== o || r === 0 && wl(n, t, e) || s === 0 && wl(n, i, e) || a === 0 && wl(t, n, i) || o === 0 && wl(t, e, i));\n}\nfunction wl(n, e, t) {\n return e.x <= Math.max(n.x, t.x) && e.x >= Math.min(n.x, t.x) && e.y <= Math.max(n.y, t.y) && e.y >= Math.min(n.y, t.y);\n}\nfunction Ul(n) {\n return n > 0 ? 1 : n < 0 ? -1 : 0;\n}\nfunction fk(n, e) {\n var t = n;\n do {\n if (t.i !== n.i && t.next.i !== n.i && t.i !== e.i && t.next.i !== e.i && Ov(t, t.next, n, e))\n return !0;\n t = t.next;\n } while (t !== n);\n return !1;\n}\nfunction Bo(n, e) {\n return ci(n.prev, n, n.next) < 0 ? ci(n, e, n.next) >= 0 && ci(n, n.prev, e) >= 0 : ci(n, e, n.prev) < 0 || ci(n, n.next, e) < 0;\n}\nfunction dk(n, e) {\n var t = n, i = !1, r = (n.x + e.x) / 2, s = (n.y + e.y) / 2;\n do\n t.y > s != t.next.y > s && t.next.y !== t.y && r < (t.next.x - t.x) * (s - t.y) / (t.next.y - t.y) + t.x && (i = !i), t = t.next;\n while (t !== n);\n return i;\n}\nfunction Dv(n, e) {\n var t = new Ku(n.i, n.x, n.y), i = new Ku(e.i, e.x, e.y), r = n.next, s = e.prev;\n return n.next = e, e.prev = n, t.next = r, r.prev = t, i.next = t, t.prev = i, s.next = i, i.prev = s, i;\n}\nfunction E_(n, e, t, i) {\n var r = new Ku(n, e, t);\n return i ? (r.next = i.next, r.prev = i, i.next.prev = r, i.next = r) : (r.prev = r, r.next = r), r;\n}\nfunction ko(n) {\n n.next.prev = n.prev, n.prev.next = n.next, n.prevZ && (n.prevZ.nextZ = n.nextZ), n.nextZ && (n.nextZ.prevZ = n.prevZ);\n}\nfunction Ku(n, e, t) {\n this.i = n, this.x = e, this.y = t, this.prev = null, this.next = null, this.z = 0, this.prevZ = null, this.nextZ = null, this.steiner = !1;\n}\noh.deviation = function(n, e, t, i) {\n var r = e && e.length, s = r ? e[0] * t : n.length, a = Math.abs(qu(n, 0, s, t));\n if (r)\n for (var o = 0, l = e.length; o < l; o++) {\n var c = e[o] * t, h = o < l - 1 ? e[o + 1] * t : n.length;\n a -= Math.abs(qu(n, c, h, t));\n }\n var u = 0;\n for (o = 0; o < i.length; o += 3) {\n var f = i[o] * t, d = i[o + 1] * t, p = i[o + 2] * t;\n u += Math.abs(\n (n[f] - n[p]) * (n[d + 1] - n[f + 1]) - (n[f] - n[d]) * (n[p + 1] - n[f + 1])\n );\n }\n return a === 0 && u === 0 ? 0 : Math.abs((u - a) / a);\n};\nfunction qu(n, e, t, i) {\n for (var r = 0, s = e, a = t - i; s < t; s += i)\n r += (n[a] - n[s]) * (n[s + 1] + n[a + 1]), a = s;\n return r;\n}\noh.flatten = function(n) {\n for (var e = n[0][0].length, t = { vertices: [], holes: [], dimensions: e }, i = 0, r = 0; r < n.length; r++) {\n for (var s = 0; s < n[r].length; s++)\n for (var a = 0; a < e; a++)\n t.vertices.push(n[r][s][a]);\n r > 0 && (i += n[r - 1].length, t.holes.push(i));\n }\n return t;\n};\nvar pk = Cd.exports;\nconst v_ = /* @__PURE__ */ cv(pk), Ql = () => {\n};\nfunction gk(n) {\n if ((t = n.length) < 4)\n return !1;\n for (var e = 0, t, i = n[t - 1][1] * n[0][0] - n[t - 1][0] * n[0][1]; ++e < t; )\n i += n[e - 1][1] * n[e][0] - n[e - 1][0] * n[e][1];\n return i <= 0;\n}\nfunction mk(n, e) {\n for (var t = e[0], i = e[1], r = !1, s = 0, a = n.length, o = a - 1; s < a; o = s++) {\n var l = n[s], c = l[0], h = l[1], u = n[o], f = u[0], d = u[1];\n h > i ^ d > i && t < (f - c) * (i - h) / (d - h) + c && (r = !r);\n }\n return r;\n}\nfunction T_(n, e) {\n var t = e.stream, i;\n if (!t)\n throw new Error(\"invalid projection\");\n switch (n && n.type) {\n case \"Feature\":\n i = Nv;\n break;\n case \"FeatureCollection\":\n i = _k;\n break;\n default:\n i = Rd;\n break;\n }\n return i(n, t);\n}\nfunction _k(n, e) {\n return {\n type: \"FeatureCollection\",\n features: n.features.map(function(t) {\n return Nv(t, e);\n })\n };\n}\nfunction Nv(n, e) {\n return {\n type: \"Feature\",\n id: n.id,\n properties: n.properties,\n geometry: Rd(n.geometry, e)\n };\n}\nfunction Ek(n, e) {\n return {\n type: \"GeometryCollection\",\n geometries: n.geometries.map(function(t) {\n return Rd(t, e);\n })\n };\n}\nfunction Rd(n, e) {\n if (!n)\n return null;\n if (n.type === \"GeometryCollection\")\n return Ek(n, e);\n var t;\n switch (n.type) {\n case \"Point\":\n t = x_;\n break;\n case \"MultiPoint\":\n t = x_;\n break;\n case \"LineString\":\n t = C_;\n break;\n case \"MultiLineString\":\n t = C_;\n break;\n case \"Polygon\":\n t = uu;\n break;\n case \"MultiPolygon\":\n t = uu;\n break;\n case \"Sphere\":\n t = uu;\n break;\n default:\n return null;\n }\n return vv(n, e(t)), t.result();\n}\nvar ji = [], as = [], x_ = {\n point: function(n, e) {\n ji.push([n, e]);\n },\n result: function() {\n var n = ji.length ? ji.length < 2 ? { type: \"Point\", coordinates: ji[0] } : { type: \"MultiPoint\", coordinates: ji } : null;\n return ji = [], n;\n }\n}, C_ = {\n lineStart: Ql,\n point: function(n, e) {\n ji.push([n, e]);\n },\n lineEnd: function() {\n ji.length && (as.push(ji), ji = []);\n },\n result: function() {\n var n = as.length ? as.length < 2 ? { type: \"LineString\", coordinates: as[0] } : { type: \"MultiLineString\", coordinates: as } : null;\n return as = [], n;\n }\n}, uu = {\n polygonStart: Ql,\n lineStart: Ql,\n point: function(n, e) {\n ji.push([n, e]);\n },\n lineEnd: function() {\n var n = ji.length;\n if (n) {\n do\n ji.push(ji[0].slice());\n while (++n < 4);\n as.push(ji), ji = [];\n }\n },\n polygonEnd: Ql,\n result: function() {\n if (!as.length)\n return null;\n var n = [], e = [];\n return as.forEach(function(t) {\n gk(t) ? n.push([t]) : e.push(t);\n }), e.forEach(function(t) {\n var i = t[0];\n n.some(function(r) {\n if (mk(r[0], i))\n return r.push(t), !0;\n }) || n.push([t]);\n }), as = [], n.length ? n.length > 1 ? { type: \"MultiPolygon\", coordinates: n } : { type: \"Polygon\", coordinates: n[0] } : null;\n }\n};\nclass vk {\n constructor(e, t, i, r, s, a, o, l, c) {\n this.name = e, this.scene = c, this.geoJson = t, this.projection = i, this.size = r, this.transform = s, this.simplification = a, this.cot = l, this.depth = o, this.selection = this.createMap();\n }\n createMap() {\n let e = T_(this.geoJson, this.projection.fitSize(this.size, this.geoJson).translate(this.transform)), t = T_(e, AB()), i = jB({ features: t }), r = wB(i), s = UB(r, this.simplification), a = OB(s, s.objects.features), o, l = [];\n return a.features.forEach((c) => {\n if (c.geometry != null) {\n if (c.geometry.type === \"Polygon\") {\n let h = [];\n c.geometry.coordinates[0].forEach((u) => h.push(new Me(u[0], 0, u[1]))), o = kt.ExtrudePolygon(\"polygon\", { shape: h, depth: this.depth, wrap: !1, sideOrientation: 2 }, this.scene, v_), o.name = \"polygon\", o.parent = this.cot, o.metadata = { ...o.metadata, data: c.properties != null ? c.properties : null }, l.push(o);\n } else if (c.geometry.type === \"MultiPolygon\") {\n let h = [];\n c.geometry.coordinates.forEach((u) => {\n u.forEach((f) => {\n let d = [];\n f.forEach((p) => d.push(new Me(p[0], 0, p[1]))), h.push(kt.ExtrudePolygon(\"polygon\", { shape: d, depth: this.depth, wrap: !1, sideOrientation: 2 }, this.scene, v_));\n });\n }), o = Ji.MergeMeshes(h, !0, !0), o.name = \"polygon\", o.parent = this.cot, o.metadata = { ...o.metadata, data: c.properties != null ? c.properties : null }, l.push(o);\n }\n }\n }), new qt(l, this.scene);\n }\n}\nfunction Mk(n, e, t) {\n const i = e.geoJson, r = e.projection || bB(), s = e.size || [10, 10], a = e.transform || [0, 0], o = e.simplification || 0, l = e.depth || 1, c = e.cot || new On(\"meshMapCOT\", t);\n return new vk(n, i, r, s, a, o, l, c, t);\n}\nvar Fv = { exports: {} };\n/**\n * chroma.js - JavaScript library for color conversions\n *\n * Copyright (c) 2011-2019, Gregor Aisch\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. The name Gregor Aisch may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * -------------------------------------------------------\n *\n * chroma.js includes colors from colorbrewer2.org, which are released under\n * the following license:\n *\n * Copyright (c) 2002 Cynthia Brewer, Mark Harrower,\n * and The Pennsylvania State University.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\n * either express or implied. See the License for the specific\n * language governing permissions and limitations under the License.\n *\n * ------------------------------------------------------\n *\n * Named colors are taken from X11 Color Names.\n * http://www.w3.org/TR/css3-color/#svg-color\n *\n * @preserve\n */\n(function(n, e) {\n (function(t, i) {\n n.exports = i();\n })(K3, function() {\n for (var t = function(y, A, D) {\n return A === void 0 && (A = 0), D === void 0 && (D = 1), y < A ? A : y > D ? D : y;\n }, i = t, r = function(y) {\n y._clipped = !1, y._unclipped = y.slice(0);\n for (var A = 0; A <= 3; A++)\n A < 3 ? ((y[A] < 0 || y[A] > 255) && (y._clipped = !0), y[A] = i(y[A], 0, 255)) : A === 3 && (y[A] = i(y[A], 0, 1));\n return y;\n }, s = {}, a = 0, o = [\"Boolean\", \"Number\", \"String\", \"Function\", \"Array\", \"Date\", \"RegExp\", \"Undefined\", \"Null\"]; a < o.length; a += 1) {\n var l = o[a];\n s[\"[object \" + l + \"]\"] = l.toLowerCase();\n }\n var c = function(y) {\n return s[Object.prototype.toString.call(y)] || \"object\";\n }, h = c, u = function(y, A) {\n return A === void 0 && (A = null), y.length >= 3 ? Array.prototype.slice.call(y) : h(y[0]) == \"object\" && A ? A.split(\"\").filter(function(D) {\n return y[0][D] !== void 0;\n }).map(function(D) {\n return y[0][D];\n }) : y[0];\n }, f = c, d = function(y) {\n if (y.length < 2)\n return null;\n var A = y.length - 1;\n return f(y[A]) == \"string\" ? y[A].toLowerCase() : null;\n }, p = Math.PI, g = {\n clip_rgb: r,\n limit: t,\n type: c,\n unpack: u,\n last: d,\n PI: p,\n TWOPI: p * 2,\n PITHIRD: p / 3,\n DEG2RAD: p / 180,\n RAD2DEG: 180 / p\n }, m = {\n format: {},\n autodetect: []\n }, v = g.last, E = g.clip_rgb, C = g.type, T = m, R = function() {\n for (var A = [], D = arguments.length; D--; )\n A[D] = arguments[D];\n var V = this;\n if (C(A[0]) === \"object\" && A[0].constructor && A[0].constructor === this.constructor)\n return A[0];\n var X = v(A), K = !1;\n if (!X) {\n K = !0, T.sorted || (T.autodetect = T.autodetect.sort(function(xe, Ue) {\n return Ue.p - xe.p;\n }), T.sorted = !0);\n for (var W = 0, $ = T.autodetect; W < $.length; W += 1) {\n var te = $[W];\n if (X = te.test.apply(te, A), X)\n break;\n }\n }\n if (T.format[X]) {\n var pe = T.format[X].apply(null, K ? A : A.slice(0, -1));\n V._rgb = E(pe);\n } else\n throw new Error(\"unknown format: \" + A);\n V._rgb.length === 3 && V._rgb.push(1);\n };\n R.prototype.toString = function() {\n return C(this.hex) == \"function\" ? this.hex() : \"[\" + this._rgb.join(\",\") + \"]\";\n };\n var x = R, S = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(S.Color, [null].concat(y)))();\n };\n S.Color = x, S.version = \"2.4.2\";\n var M = S, N = g.unpack, F = Math.max, U = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = N(y, \"rgb\"), V = D[0], X = D[1], K = D[2];\n V = V / 255, X = X / 255, K = K / 255;\n var W = 1 - F(V, F(X, K)), $ = W < 1 ? 1 / (1 - W) : 0, te = (1 - V - W) * $, pe = (1 - X - W) * $, xe = (1 - K - W) * $;\n return [te, pe, xe, W];\n }, H = U, q = g.unpack, Z = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = q(y, \"cmyk\");\n var D = y[0], V = y[1], X = y[2], K = y[3], W = y.length > 4 ? y[4] : 1;\n return K === 1 ? [0, 0, 0, W] : [\n D >= 1 ? 0 : 255 * (1 - D) * (1 - K),\n // r\n V >= 1 ? 0 : 255 * (1 - V) * (1 - K),\n // g\n X >= 1 ? 0 : 255 * (1 - X) * (1 - K),\n // b\n W\n ];\n }, k = Z, Q = M, ce = x, de = m, j = g.unpack, J = g.type, O = H;\n ce.prototype.cmyk = function() {\n return O(this._rgb);\n }, Q.cmyk = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(ce, [null].concat(y, [\"cmyk\"])))();\n }, de.format.cmyk = k, de.autodetect.push({\n p: 2,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = j(y, \"cmyk\"), J(y) === \"array\" && y.length === 4)\n return \"cmyk\";\n }\n });\n var G = g.unpack, ee = g.last, _e = function(y) {\n return Math.round(y * 100) / 100;\n }, Oe = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = G(y, \"hsla\"), V = ee(y) || \"lsa\";\n return D[0] = _e(D[0] || 0), D[1] = _e(D[1] * 100) + \"%\", D[2] = _e(D[2] * 100) + \"%\", V === \"hsla\" || D.length > 3 && D[3] < 1 ? (D[3] = D.length > 3 ? D[3] : 1, V = \"hsla\") : D.length = 3, V + \"(\" + D.join(\",\") + \")\";\n }, ze = Oe, fe = g.unpack, Te = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = fe(y, \"rgba\");\n var D = y[0], V = y[1], X = y[2];\n D /= 255, V /= 255, X /= 255;\n var K = Math.min(D, V, X), W = Math.max(D, V, X), $ = (W + K) / 2, te, pe;\n return W === K ? (te = 0, pe = Number.NaN) : te = $ < 0.5 ? (W - K) / (W + K) : (W - K) / (2 - W - K), D == W ? pe = (V - X) / (W - K) : V == W ? pe = 2 + (X - D) / (W - K) : X == W && (pe = 4 + (D - V) / (W - K)), pe *= 60, pe < 0 && (pe += 360), y.length > 3 && y[3] !== void 0 ? [pe, te, $, y[3]] : [pe, te, $];\n }, Fe = Te, Se = g.unpack, qe = g.last, ue = ze, Ye = Fe, lt = Math.round, Ut = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = Se(y, \"rgba\"), V = qe(y) || \"rgb\";\n return V.substr(0, 3) == \"hsl\" ? ue(Ye(D), V) : (D[0] = lt(D[0]), D[1] = lt(D[1]), D[2] = lt(D[2]), (V === \"rgba\" || D.length > 3 && D[3] < 1) && (D[3] = D.length > 3 ? D[3] : 1, V = \"rgba\"), V + \"(\" + D.slice(0, V === \"rgb\" ? 3 : 4).join(\",\") + \")\");\n }, Ct = Ut, Bi = g.unpack, hi = Math.round, Es = function() {\n for (var y, A = [], D = arguments.length; D--; )\n A[D] = arguments[D];\n A = Bi(A, \"hsl\");\n var V = A[0], X = A[1], K = A[2], W, $, te;\n if (X === 0)\n W = $ = te = K * 255;\n else {\n var pe = [0, 0, 0], xe = [0, 0, 0], Ue = K < 0.5 ? K * (1 + X) : K + X - K * X, ye = 2 * K - Ue, Xe = V / 360;\n pe[0] = Xe + 1 / 3, pe[1] = Xe, pe[2] = Xe - 1 / 3;\n for (var Ge = 0; Ge < 3; Ge++)\n pe[Ge] < 0 && (pe[Ge] += 1), pe[Ge] > 1 && (pe[Ge] -= 1), 6 * pe[Ge] < 1 ? xe[Ge] = ye + (Ue - ye) * 6 * pe[Ge] : 2 * pe[Ge] < 1 ? xe[Ge] = Ue : 3 * pe[Ge] < 2 ? xe[Ge] = ye + (Ue - ye) * (2 / 3 - pe[Ge]) * 6 : xe[Ge] = ye;\n y = [hi(xe[0] * 255), hi(xe[1] * 255), hi(xe[2] * 255)], W = y[0], $ = y[1], te = y[2];\n }\n return A.length > 3 ? [W, $, te, A[3]] : [W, $, te, 1];\n }, Vr = Es, vs = Vr, ki = m, cr = /^rgb\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*\\)$/, Rr = /^rgba\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/, Sr = /^rgb\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/, Ts = /^rgba\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/, xs = /^hsl\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/, yr = /^hsla\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/, Br = Math.round, gn = function(y) {\n y = y.toLowerCase().trim();\n var A;\n if (ki.format.named)\n try {\n return ki.format.named(y);\n } catch {\n }\n if (A = y.match(cr)) {\n for (var D = A.slice(1, 4), V = 0; V < 3; V++)\n D[V] = +D[V];\n return D[3] = 1, D;\n }\n if (A = y.match(Rr)) {\n for (var X = A.slice(1, 5), K = 0; K < 4; K++)\n X[K] = +X[K];\n return X;\n }\n if (A = y.match(Sr)) {\n for (var W = A.slice(1, 4), $ = 0; $ < 3; $++)\n W[$] = Br(W[$] * 2.55);\n return W[3] = 1, W;\n }\n if (A = y.match(Ts)) {\n for (var te = A.slice(1, 5), pe = 0; pe < 3; pe++)\n te[pe] = Br(te[pe] * 2.55);\n return te[3] = +te[3], te;\n }\n if (A = y.match(xs)) {\n var xe = A.slice(1, 4);\n xe[1] *= 0.01, xe[2] *= 0.01;\n var Ue = vs(xe);\n return Ue[3] = 1, Ue;\n }\n if (A = y.match(yr)) {\n var ye = A.slice(1, 4);\n ye[1] *= 0.01, ye[2] *= 0.01;\n var Xe = vs(ye);\n return Xe[3] = +A[4], Xe;\n }\n };\n gn.test = function(y) {\n return cr.test(y) || Rr.test(y) || Sr.test(y) || Ts.test(y) || xs.test(y) || yr.test(y);\n };\n var Mi = gn, sl = M, Ya = x, ts = m, kn = g.type, _r = Ct, Gs = Mi;\n Ya.prototype.css = function(y) {\n return _r(this._rgb, y);\n }, sl.css = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(Ya, [null].concat(y, [\"css\"])))();\n }, ts.format.css = Gs, ts.autodetect.push({\n p: 5,\n test: function(y) {\n for (var A = [], D = arguments.length - 1; D-- > 0; )\n A[D] = arguments[D + 1];\n if (!A.length && kn(y) === \"string\" && Gs.test(y))\n return \"css\";\n }\n });\n var Sd = x, Uv = M, Vv = m, Bv = g.unpack;\n Vv.format.gl = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = Bv(y, \"rgba\");\n return D[0] *= 255, D[1] *= 255, D[2] *= 255, D;\n }, Uv.gl = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(Sd, [null].concat(y, [\"gl\"])))();\n }, Sd.prototype.gl = function() {\n var y = this._rgb;\n return [y[0] / 255, y[1] / 255, y[2] / 255, y[3]];\n };\n var kv = g.unpack, zv = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = kv(y, \"rgb\"), V = D[0], X = D[1], K = D[2], W = Math.min(V, X, K), $ = Math.max(V, X, K), te = $ - W, pe = te * 100 / 255, xe = W / (255 - te) * 100, Ue;\n return te === 0 ? Ue = Number.NaN : (V === $ && (Ue = (X - K) / te), X === $ && (Ue = 2 + (K - V) / te), K === $ && (Ue = 4 + (V - X) / te), Ue *= 60, Ue < 0 && (Ue += 360)), [Ue, pe, xe];\n }, Wv = zv, Gv = g.unpack, Xv = Math.floor, Hv = function() {\n for (var y, A, D, V, X, K, W = [], $ = arguments.length; $--; )\n W[$] = arguments[$];\n W = Gv(W, \"hcg\");\n var te = W[0], pe = W[1], xe = W[2], Ue, ye, Xe;\n xe = xe * 255;\n var Ge = pe * 255;\n if (pe === 0)\n Ue = ye = Xe = xe;\n else {\n te === 360 && (te = 0), te > 360 && (te -= 360), te < 0 && (te += 360), te /= 60;\n var ft = Xv(te), vt = te - ft, bt = xe * (1 - pe), Ft = bt + Ge * (1 - vt), zi = bt + Ge * vt, Oi = bt + Ge;\n switch (ft) {\n case 0:\n y = [Oi, zi, bt], Ue = y[0], ye = y[1], Xe = y[2];\n break;\n case 1:\n A = [Ft, Oi, bt], Ue = A[0], ye = A[1], Xe = A[2];\n break;\n case 2:\n D = [bt, Oi, zi], Ue = D[0], ye = D[1], Xe = D[2];\n break;\n case 3:\n V = [bt, Ft, Oi], Ue = V[0], ye = V[1], Xe = V[2];\n break;\n case 4:\n X = [zi, bt, Oi], Ue = X[0], ye = X[1], Xe = X[2];\n break;\n case 5:\n K = [Oi, bt, Ft], Ue = K[0], ye = K[1], Xe = K[2];\n break;\n }\n }\n return [Ue, ye, Xe, W.length > 3 ? W[3] : 1];\n }, Kv = Hv, qv = g.unpack, Yv = g.type, Zv = M, yd = x, Id = m, jv = Wv;\n yd.prototype.hcg = function() {\n return jv(this._rgb);\n }, Zv.hcg = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(yd, [null].concat(y, [\"hcg\"])))();\n }, Id.format.hcg = Kv, Id.autodetect.push({\n p: 1,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = qv(y, \"hcg\"), Yv(y) === \"array\" && y.length === 3)\n return \"hcg\";\n }\n });\n var Qv = g.unpack, Jv = g.last, nl = Math.round, $v = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = Qv(y, \"rgba\"), V = D[0], X = D[1], K = D[2], W = D[3], $ = Jv(y) || \"auto\";\n W === void 0 && (W = 1), $ === \"auto\" && ($ = W < 1 ? \"rgba\" : \"rgb\"), V = nl(V), X = nl(X), K = nl(K);\n var te = V << 16 | X << 8 | K, pe = \"000000\" + te.toString(16);\n pe = pe.substr(pe.length - 6);\n var xe = \"0\" + nl(W * 255).toString(16);\n switch (xe = xe.substr(xe.length - 2), $.toLowerCase()) {\n case \"rgba\":\n return \"#\" + pe + xe;\n case \"argb\":\n return \"#\" + xe + pe;\n default:\n return \"#\" + pe;\n }\n }, bd = $v, eT = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/, tT = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/, iT = function(y) {\n if (y.match(eT)) {\n (y.length === 4 || y.length === 7) && (y = y.substr(1)), y.length === 3 && (y = y.split(\"\"), y = y[0] + y[0] + y[1] + y[1] + y[2] + y[2]);\n var A = parseInt(y, 16), D = A >> 16, V = A >> 8 & 255, X = A & 255;\n return [D, V, X, 1];\n }\n if (y.match(tT)) {\n (y.length === 5 || y.length === 9) && (y = y.substr(1)), y.length === 4 && (y = y.split(\"\"), y = y[0] + y[0] + y[1] + y[1] + y[2] + y[2] + y[3] + y[3]);\n var K = parseInt(y, 16), W = K >> 24 & 255, $ = K >> 16 & 255, te = K >> 8 & 255, pe = Math.round((K & 255) / 255 * 100) / 100;\n return [W, $, te, pe];\n }\n throw new Error(\"unknown hex color: \" + y);\n }, Ad = iT, rT = M, Md = x, sT = g.type, Pd = m, nT = bd;\n Md.prototype.hex = function(y) {\n return nT(this._rgb, y);\n }, rT.hex = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(Md, [null].concat(y, [\"hex\"])))();\n }, Pd.format.hex = Ad, Pd.autodetect.push({\n p: 4,\n test: function(y) {\n for (var A = [], D = arguments.length - 1; D-- > 0; )\n A[D] = arguments[D + 1];\n if (!A.length && sT(y) === \"string\" && [3, 4, 5, 6, 7, 8, 9].indexOf(y.length) >= 0)\n return \"hex\";\n }\n });\n var aT = g.unpack, Od = g.TWOPI, oT = Math.min, lT = Math.sqrt, cT = Math.acos, hT = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = aT(y, \"rgb\"), V = D[0], X = D[1], K = D[2];\n V /= 255, X /= 255, K /= 255;\n var W, $ = oT(V, X, K), te = (V + X + K) / 3, pe = te > 0 ? 1 - $ / te : 0;\n return pe === 0 ? W = NaN : (W = (V - X + (V - K)) / 2, W /= lT((V - X) * (V - X) + (V - K) * (X - K)), W = cT(W), K > X && (W = Od - W), W /= Od), [W * 360, pe, te];\n }, uT = hT, fT = g.unpack, ch = g.limit, zn = g.TWOPI, hh = g.PITHIRD, Wn = Math.cos, dT = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = fT(y, \"hsi\");\n var D = y[0], V = y[1], X = y[2], K, W, $;\n return isNaN(D) && (D = 0), isNaN(V) && (V = 0), D > 360 && (D -= 360), D < 0 && (D += 360), D /= 360, D < 1 / 3 ? ($ = (1 - V) / 3, K = (1 + V * Wn(zn * D) / Wn(hh - zn * D)) / 3, W = 1 - ($ + K)) : D < 2 / 3 ? (D -= 1 / 3, K = (1 - V) / 3, W = (1 + V * Wn(zn * D) / Wn(hh - zn * D)) / 3, $ = 1 - (K + W)) : (D -= 2 / 3, W = (1 - V) / 3, $ = (1 + V * Wn(zn * D) / Wn(hh - zn * D)) / 3, K = 1 - (W + $)), K = ch(X * K * 3), W = ch(X * W * 3), $ = ch(X * $ * 3), [K * 255, W * 255, $ * 255, y.length > 3 ? y[3] : 1];\n }, pT = dT, gT = g.unpack, mT = g.type, _T = M, Dd = x, Nd = m, ET = uT;\n Dd.prototype.hsi = function() {\n return ET(this._rgb);\n }, _T.hsi = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(Dd, [null].concat(y, [\"hsi\"])))();\n }, Nd.format.hsi = pT, Nd.autodetect.push({\n p: 2,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = gT(y, \"hsi\"), mT(y) === \"array\" && y.length === 3)\n return \"hsi\";\n }\n });\n var vT = g.unpack, TT = g.type, xT = M, Fd = x, Ld = m, CT = Fe;\n Fd.prototype.hsl = function() {\n return CT(this._rgb);\n }, xT.hsl = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(Fd, [null].concat(y, [\"hsl\"])))();\n }, Ld.format.hsl = Vr, Ld.autodetect.push({\n p: 2,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = vT(y, \"hsl\"), TT(y) === \"array\" && y.length === 3)\n return \"hsl\";\n }\n });\n var RT = g.unpack, ST = Math.min, yT = Math.max, IT = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = RT(y, \"rgb\");\n var D = y[0], V = y[1], X = y[2], K = ST(D, V, X), W = yT(D, V, X), $ = W - K, te, pe, xe;\n return xe = W / 255, W === 0 ? (te = Number.NaN, pe = 0) : (pe = $ / W, D === W && (te = (V - X) / $), V === W && (te = 2 + (X - D) / $), X === W && (te = 4 + (D - V) / $), te *= 60, te < 0 && (te += 360)), [te, pe, xe];\n }, bT = IT, AT = g.unpack, MT = Math.floor, PT = function() {\n for (var y, A, D, V, X, K, W = [], $ = arguments.length; $--; )\n W[$] = arguments[$];\n W = AT(W, \"hsv\");\n var te = W[0], pe = W[1], xe = W[2], Ue, ye, Xe;\n if (xe *= 255, pe === 0)\n Ue = ye = Xe = xe;\n else {\n te === 360 && (te = 0), te > 360 && (te -= 360), te < 0 && (te += 360), te /= 60;\n var Ge = MT(te), ft = te - Ge, vt = xe * (1 - pe), bt = xe * (1 - pe * ft), Ft = xe * (1 - pe * (1 - ft));\n switch (Ge) {\n case 0:\n y = [xe, Ft, vt], Ue = y[0], ye = y[1], Xe = y[2];\n break;\n case 1:\n A = [bt, xe, vt], Ue = A[0], ye = A[1], Xe = A[2];\n break;\n case 2:\n D = [vt, xe, Ft], Ue = D[0], ye = D[1], Xe = D[2];\n break;\n case 3:\n V = [vt, bt, xe], Ue = V[0], ye = V[1], Xe = V[2];\n break;\n case 4:\n X = [Ft, vt, xe], Ue = X[0], ye = X[1], Xe = X[2];\n break;\n case 5:\n K = [xe, vt, bt], Ue = K[0], ye = K[1], Xe = K[2];\n break;\n }\n }\n return [Ue, ye, Xe, W.length > 3 ? W[3] : 1];\n }, OT = PT, DT = g.unpack, NT = g.type, FT = M, wd = x, Ud = m, LT = bT;\n wd.prototype.hsv = function() {\n return LT(this._rgb);\n }, FT.hsv = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(wd, [null].concat(y, [\"hsv\"])))();\n }, Ud.format.hsv = OT, Ud.autodetect.push({\n p: 2,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = DT(y, \"hsv\"), NT(y) === \"array\" && y.length === 3)\n return \"hsv\";\n }\n });\n var al = {\n // Corresponds roughly to RGB brighter/darker\n Kn: 18,\n // D65 standard referent\n Xn: 0.95047,\n Yn: 1,\n Zn: 1.08883,\n t0: 0.137931034,\n // 4 / 29\n t1: 0.206896552,\n // 6 / 29\n t2: 0.12841855,\n // 3 * t1 * t1\n t3: 8856452e-9\n // t1 * t1 * t1\n }, Gn = al, wT = g.unpack, Vd = Math.pow, UT = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = wT(y, \"rgb\"), V = D[0], X = D[1], K = D[2], W = VT(V, X, K), $ = W[0], te = W[1], pe = W[2], xe = 116 * te - 16;\n return [xe < 0 ? 0 : xe, 500 * ($ - te), 200 * (te - pe)];\n }, uh = function(y) {\n return (y /= 255) <= 0.04045 ? y / 12.92 : Vd((y + 0.055) / 1.055, 2.4);\n }, fh = function(y) {\n return y > Gn.t3 ? Vd(y, 1 / 3) : y / Gn.t2 + Gn.t0;\n }, VT = function(y, A, D) {\n y = uh(y), A = uh(A), D = uh(D);\n var V = fh((0.4124564 * y + 0.3575761 * A + 0.1804375 * D) / Gn.Xn), X = fh((0.2126729 * y + 0.7151522 * A + 0.072175 * D) / Gn.Yn), K = fh((0.0193339 * y + 0.119192 * A + 0.9503041 * D) / Gn.Zn);\n return [V, X, K];\n }, Bd = UT, Xn = al, BT = g.unpack, kT = Math.pow, zT = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = BT(y, \"lab\");\n var D = y[0], V = y[1], X = y[2], K, W, $, te, pe, xe;\n return W = (D + 16) / 116, K = isNaN(V) ? W : W + V / 500, $ = isNaN(X) ? W : W - X / 200, W = Xn.Yn * ph(W), K = Xn.Xn * ph(K), $ = Xn.Zn * ph($), te = dh(3.2404542 * K - 1.5371385 * W - 0.4985314 * $), pe = dh(-0.969266 * K + 1.8760108 * W + 0.041556 * $), xe = dh(0.0556434 * K - 0.2040259 * W + 1.0572252 * $), [te, pe, xe, y.length > 3 ? y[3] : 1];\n }, dh = function(y) {\n return 255 * (y <= 304e-5 ? 12.92 * y : 1.055 * kT(y, 1 / 2.4) - 0.055);\n }, ph = function(y) {\n return y > Xn.t1 ? y * y * y : Xn.t2 * (y - Xn.t0);\n }, kd = zT, WT = g.unpack, GT = g.type, XT = M, zd = x, Wd = m, HT = Bd;\n zd.prototype.lab = function() {\n return HT(this._rgb);\n }, XT.lab = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(zd, [null].concat(y, [\"lab\"])))();\n }, Wd.format.lab = kd, Wd.autodetect.push({\n p: 2,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = WT(y, \"lab\"), GT(y) === \"array\" && y.length === 3)\n return \"lab\";\n }\n });\n var KT = g.unpack, qT = g.RAD2DEG, YT = Math.sqrt, ZT = Math.atan2, jT = Math.round, QT = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = KT(y, \"lab\"), V = D[0], X = D[1], K = D[2], W = YT(X * X + K * K), $ = (ZT(K, X) * qT + 360) % 360;\n return jT(W * 1e4) === 0 && ($ = Number.NaN), [V, W, $];\n }, Gd = QT, JT = g.unpack, $T = Bd, ex = Gd, tx = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = JT(y, \"rgb\"), V = D[0], X = D[1], K = D[2], W = $T(V, X, K), $ = W[0], te = W[1], pe = W[2];\n return ex($, te, pe);\n }, ix = tx, rx = g.unpack, sx = g.DEG2RAD, nx = Math.sin, ax = Math.cos, ox = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = rx(y, \"lch\"), V = D[0], X = D[1], K = D[2];\n return isNaN(K) && (K = 0), K = K * sx, [V, ax(K) * X, nx(K) * X];\n }, Xd = ox, lx = g.unpack, cx = Xd, hx = kd, ux = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = lx(y, \"lch\");\n var D = y[0], V = y[1], X = y[2], K = cx(D, V, X), W = K[0], $ = K[1], te = K[2], pe = hx(W, $, te), xe = pe[0], Ue = pe[1], ye = pe[2];\n return [xe, Ue, ye, y.length > 3 ? y[3] : 1];\n }, Hd = ux, fx = g.unpack, dx = Hd, px = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = fx(y, \"hcl\").reverse();\n return dx.apply(void 0, D);\n }, gx = px, mx = g.unpack, _x = g.type, Kd = M, ol = x, gh = m, qd = ix;\n ol.prototype.lch = function() {\n return qd(this._rgb);\n }, ol.prototype.hcl = function() {\n return qd(this._rgb).reverse();\n }, Kd.lch = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(ol, [null].concat(y, [\"lch\"])))();\n }, Kd.hcl = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(ol, [null].concat(y, [\"hcl\"])))();\n }, gh.format.lch = Hd, gh.format.hcl = gx, [\"lch\", \"hcl\"].forEach(function(y) {\n return gh.autodetect.push({\n p: 2,\n test: function() {\n for (var A = [], D = arguments.length; D--; )\n A[D] = arguments[D];\n if (A = mx(A, y), _x(A) === \"array\" && A.length === 3)\n return y;\n }\n });\n });\n var Ex = {\n aliceblue: \"#f0f8ff\",\n antiquewhite: \"#faebd7\",\n aqua: \"#00ffff\",\n aquamarine: \"#7fffd4\",\n azure: \"#f0ffff\",\n beige: \"#f5f5dc\",\n bisque: \"#ffe4c4\",\n black: \"#000000\",\n blanchedalmond: \"#ffebcd\",\n blue: \"#0000ff\",\n blueviolet: \"#8a2be2\",\n brown: \"#a52a2a\",\n burlywood: \"#deb887\",\n cadetblue: \"#5f9ea0\",\n chartreuse: \"#7fff00\",\n chocolate: \"#d2691e\",\n coral: \"#ff7f50\",\n cornflower: \"#6495ed\",\n cornflowerblue: \"#6495ed\",\n cornsilk: \"#fff8dc\",\n crimson: \"#dc143c\",\n cyan: \"#00ffff\",\n darkblue: \"#00008b\",\n darkcyan: \"#008b8b\",\n darkgoldenrod: \"#b8860b\",\n darkgray: \"#a9a9a9\",\n darkgreen: \"#006400\",\n darkgrey: \"#a9a9a9\",\n darkkhaki: \"#bdb76b\",\n darkmagenta: \"#8b008b\",\n darkolivegreen: \"#556b2f\",\n darkorange: \"#ff8c00\",\n darkorchid: \"#9932cc\",\n darkred: \"#8b0000\",\n darksalmon: \"#e9967a\",\n darkseagreen: \"#8fbc8f\",\n darkslateblue: \"#483d8b\",\n darkslategray: \"#2f4f4f\",\n darkslategrey: \"#2f4f4f\",\n darkturquoise: \"#00ced1\",\n darkviolet: \"#9400d3\",\n deeppink: \"#ff1493\",\n deepskyblue: \"#00bfff\",\n dimgray: \"#696969\",\n dimgrey: \"#696969\",\n dodgerblue: \"#1e90ff\",\n firebrick: \"#b22222\",\n floralwhite: \"#fffaf0\",\n forestgreen: \"#228b22\",\n fuchsia: \"#ff00ff\",\n gainsboro: \"#dcdcdc\",\n ghostwhite: \"#f8f8ff\",\n gold: \"#ffd700\",\n goldenrod: \"#daa520\",\n gray: \"#808080\",\n green: \"#008000\",\n greenyellow: \"#adff2f\",\n grey: \"#808080\",\n honeydew: \"#f0fff0\",\n hotpink: \"#ff69b4\",\n indianred: \"#cd5c5c\",\n indigo: \"#4b0082\",\n ivory: \"#fffff0\",\n khaki: \"#f0e68c\",\n laserlemon: \"#ffff54\",\n lavender: \"#e6e6fa\",\n lavenderblush: \"#fff0f5\",\n lawngreen: \"#7cfc00\",\n lemonchiffon: \"#fffacd\",\n lightblue: \"#add8e6\",\n lightcoral: \"#f08080\",\n lightcyan: \"#e0ffff\",\n lightgoldenrod: \"#fafad2\",\n lightgoldenrodyellow: \"#fafad2\",\n lightgray: \"#d3d3d3\",\n lightgreen: \"#90ee90\",\n lightgrey: \"#d3d3d3\",\n lightpink: \"#ffb6c1\",\n lightsalmon: \"#ffa07a\",\n lightseagreen: \"#20b2aa\",\n lightskyblue: \"#87cefa\",\n lightslategray: \"#778899\",\n lightslategrey: \"#778899\",\n lightsteelblue: \"#b0c4de\",\n lightyellow: \"#ffffe0\",\n lime: \"#00ff00\",\n limegreen: \"#32cd32\",\n linen: \"#faf0e6\",\n magenta: \"#ff00ff\",\n maroon: \"#800000\",\n maroon2: \"#7f0000\",\n maroon3: \"#b03060\",\n mediumaquamarine: \"#66cdaa\",\n mediumblue: \"#0000cd\",\n mediumorchid: \"#ba55d3\",\n mediumpurple: \"#9370db\",\n mediumseagreen: \"#3cb371\",\n mediumslateblue: \"#7b68ee\",\n mediumspringgreen: \"#00fa9a\",\n mediumturquoise: \"#48d1cc\",\n mediumvioletred: \"#c71585\",\n midnightblue: \"#191970\",\n mintcream: \"#f5fffa\",\n mistyrose: \"#ffe4e1\",\n moccasin: \"#ffe4b5\",\n navajowhite: \"#ffdead\",\n navy: \"#000080\",\n oldlace: \"#fdf5e6\",\n olive: \"#808000\",\n olivedrab: \"#6b8e23\",\n orange: \"#ffa500\",\n orangered: \"#ff4500\",\n orchid: \"#da70d6\",\n palegoldenrod: \"#eee8aa\",\n palegreen: \"#98fb98\",\n paleturquoise: \"#afeeee\",\n palevioletred: \"#db7093\",\n papayawhip: \"#ffefd5\",\n peachpuff: \"#ffdab9\",\n peru: \"#cd853f\",\n pink: \"#ffc0cb\",\n plum: \"#dda0dd\",\n powderblue: \"#b0e0e6\",\n purple: \"#800080\",\n purple2: \"#7f007f\",\n purple3: \"#a020f0\",\n rebeccapurple: \"#663399\",\n red: \"#ff0000\",\n rosybrown: \"#bc8f8f\",\n royalblue: \"#4169e1\",\n saddlebrown: \"#8b4513\",\n salmon: \"#fa8072\",\n sandybrown: \"#f4a460\",\n seagreen: \"#2e8b57\",\n seashell: \"#fff5ee\",\n sienna: \"#a0522d\",\n silver: \"#c0c0c0\",\n skyblue: \"#87ceeb\",\n slateblue: \"#6a5acd\",\n slategray: \"#708090\",\n slategrey: \"#708090\",\n snow: \"#fffafa\",\n springgreen: \"#00ff7f\",\n steelblue: \"#4682b4\",\n tan: \"#d2b48c\",\n teal: \"#008080\",\n thistle: \"#d8bfd8\",\n tomato: \"#ff6347\",\n turquoise: \"#40e0d0\",\n violet: \"#ee82ee\",\n wheat: \"#f5deb3\",\n white: \"#ffffff\",\n whitesmoke: \"#f5f5f5\",\n yellow: \"#ffff00\",\n yellowgreen: \"#9acd32\"\n }, Yd = Ex, vx = x, Zd = m, Tx = g.type, Za = Yd, xx = Ad, Cx = bd;\n vx.prototype.name = function() {\n for (var y = Cx(this._rgb, \"rgb\"), A = 0, D = Object.keys(Za); A < D.length; A += 1) {\n var V = D[A];\n if (Za[V] === y)\n return V.toLowerCase();\n }\n return y;\n }, Zd.format.named = function(y) {\n if (y = y.toLowerCase(), Za[y])\n return xx(Za[y]);\n throw new Error(\"unknown color name: \" + y);\n }, Zd.autodetect.push({\n p: 5,\n test: function(y) {\n for (var A = [], D = arguments.length - 1; D-- > 0; )\n A[D] = arguments[D + 1];\n if (!A.length && Tx(y) === \"string\" && Za[y.toLowerCase()])\n return \"named\";\n }\n });\n var Rx = g.unpack, Sx = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = Rx(y, \"rgb\"), V = D[0], X = D[1], K = D[2];\n return (V << 16) + (X << 8) + K;\n }, yx = Sx, Ix = g.type, bx = function(y) {\n if (Ix(y) == \"number\" && y >= 0 && y <= 16777215) {\n var A = y >> 16, D = y >> 8 & 255, V = y & 255;\n return [A, D, V, 1];\n }\n throw new Error(\"unknown num color: \" + y);\n }, Ax = bx, Mx = M, jd = x, Qd = m, Px = g.type, Ox = yx;\n jd.prototype.num = function() {\n return Ox(this._rgb);\n }, Mx.num = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(jd, [null].concat(y, [\"num\"])))();\n }, Qd.format.num = Ax, Qd.autodetect.push({\n p: 5,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y.length === 1 && Px(y[0]) === \"number\" && y[0] >= 0 && y[0] <= 16777215)\n return \"num\";\n }\n });\n var Dx = M, mh = x, Jd = m, $d = g.unpack, ep = g.type, tp = Math.round;\n mh.prototype.rgb = function(y) {\n return y === void 0 && (y = !0), y === !1 ? this._rgb.slice(0, 3) : this._rgb.slice(0, 3).map(tp);\n }, mh.prototype.rgba = function(y) {\n return y === void 0 && (y = !0), this._rgb.slice(0, 4).map(function(A, D) {\n return D < 3 ? y === !1 ? A : tp(A) : A;\n });\n }, Dx.rgb = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(mh, [null].concat(y, [\"rgb\"])))();\n }, Jd.format.rgb = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = $d(y, \"rgba\");\n return D[3] === void 0 && (D[3] = 1), D;\n }, Jd.autodetect.push({\n p: 3,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = $d(y, \"rgba\"), ep(y) === \"array\" && (y.length === 3 || y.length === 4 && ep(y[3]) == \"number\" && y[3] >= 0 && y[3] <= 1))\n return \"rgb\";\n }\n });\n var ll = Math.log, Nx = function(y) {\n var A = y / 100, D, V, X;\n return A < 66 ? (D = 255, V = A < 6 ? 0 : -155.25485562709179 - 0.44596950469579133 * (V = A - 2) + 104.49216199393888 * ll(V), X = A < 20 ? 0 : -254.76935184120902 + 0.8274096064007395 * (X = A - 10) + 115.67994401066147 * ll(X)) : (D = 351.97690566805693 + 0.114206453784165 * (D = A - 55) - 40.25366309332127 * ll(D), V = 325.4494125711974 + 0.07943456536662342 * (V = A - 50) - 28.0852963507957 * ll(V), X = 255), [D, V, X, 1];\n }, ip = Nx, Fx = ip, Lx = g.unpack, wx = Math.round, Ux = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n for (var D = Lx(y, \"rgb\"), V = D[0], X = D[2], K = 1e3, W = 4e4, $ = 0.4, te; W - K > $; ) {\n te = (W + K) * 0.5;\n var pe = Fx(te);\n pe[2] / pe[0] >= X / V ? W = te : K = te;\n }\n return wx(te);\n }, Vx = Ux, _h = M, cl = x, Eh = m, Bx = Vx;\n cl.prototype.temp = cl.prototype.kelvin = cl.prototype.temperature = function() {\n return Bx(this._rgb);\n }, _h.temp = _h.kelvin = _h.temperature = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(cl, [null].concat(y, [\"temp\"])))();\n }, Eh.format.temp = Eh.format.kelvin = Eh.format.temperature = ip;\n var kx = g.unpack, vh = Math.cbrt, zx = Math.pow, Wx = Math.sign, Gx = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = kx(y, \"rgb\"), V = D[0], X = D[1], K = D[2], W = [Th(V / 255), Th(X / 255), Th(K / 255)], $ = W[0], te = W[1], pe = W[2], xe = vh(0.4122214708 * $ + 0.5363325363 * te + 0.0514459929 * pe), Ue = vh(0.2119034982 * $ + 0.6806995451 * te + 0.1073969566 * pe), ye = vh(0.0883024619 * $ + 0.2817188376 * te + 0.6299787005 * pe);\n return [\n 0.2104542553 * xe + 0.793617785 * Ue - 0.0040720468 * ye,\n 1.9779984951 * xe - 2.428592205 * Ue + 0.4505937099 * ye,\n 0.0259040371 * xe + 0.7827717662 * Ue - 0.808675766 * ye\n ];\n }, rp = Gx;\n function Th(y) {\n var A = Math.abs(y);\n return A < 0.04045 ? y / 12.92 : (Wx(y) || 1) * zx((A + 0.055) / 1.055, 2.4);\n }\n var Xx = g.unpack, hl = Math.pow, Hx = Math.sign, Kx = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = Xx(y, \"lab\");\n var D = y[0], V = y[1], X = y[2], K = hl(D + 0.3963377774 * V + 0.2158037573 * X, 3), W = hl(D - 0.1055613458 * V - 0.0638541728 * X, 3), $ = hl(D - 0.0894841775 * V - 1.291485548 * X, 3);\n return [\n 255 * xh(4.0767416621 * K - 3.3077115913 * W + 0.2309699292 * $),\n 255 * xh(-1.2684380046 * K + 2.6097574011 * W - 0.3413193965 * $),\n 255 * xh(-0.0041960863 * K - 0.7034186147 * W + 1.707614701 * $),\n y.length > 3 ? y[3] : 1\n ];\n }, sp = Kx;\n function xh(y) {\n var A = Math.abs(y);\n return A > 31308e-7 ? (Hx(y) || 1) * (1.055 * hl(A, 1 / 2.4) - 0.055) : y * 12.92;\n }\n var qx = g.unpack, Yx = g.type, Zx = M, np = x, ap = m, jx = rp;\n np.prototype.oklab = function() {\n return jx(this._rgb);\n }, Zx.oklab = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(np, [null].concat(y, [\"oklab\"])))();\n }, ap.format.oklab = sp, ap.autodetect.push({\n p: 3,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = qx(y, \"oklab\"), Yx(y) === \"array\" && y.length === 3)\n return \"oklab\";\n }\n });\n var Qx = g.unpack, Jx = rp, $x = Gd, eC = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n var D = Qx(y, \"rgb\"), V = D[0], X = D[1], K = D[2], W = Jx(V, X, K), $ = W[0], te = W[1], pe = W[2];\n return $x($, te, pe);\n }, tC = eC, iC = g.unpack, rC = Xd, sC = sp, nC = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n y = iC(y, \"lch\");\n var D = y[0], V = y[1], X = y[2], K = rC(D, V, X), W = K[0], $ = K[1], te = K[2], pe = sC(W, $, te), xe = pe[0], Ue = pe[1], ye = pe[2];\n return [xe, Ue, ye, y.length > 3 ? y[3] : 1];\n }, aC = nC, oC = g.unpack, lC = g.type, cC = M, op = x, lp = m, hC = tC;\n op.prototype.oklch = function() {\n return hC(this._rgb);\n }, cC.oklch = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n return new (Function.prototype.bind.apply(op, [null].concat(y, [\"oklch\"])))();\n }, lp.format.oklch = aC, lp.autodetect.push({\n p: 3,\n test: function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n if (y = oC(y, \"oklch\"), lC(y) === \"array\" && y.length === 3)\n return \"oklch\";\n }\n });\n var cp = x, uC = g.type;\n cp.prototype.alpha = function(y, A) {\n return A === void 0 && (A = !1), y !== void 0 && uC(y) === \"number\" ? A ? (this._rgb[3] = y, this) : new cp([this._rgb[0], this._rgb[1], this._rgb[2], y], \"rgb\") : this._rgb[3];\n };\n var fC = x;\n fC.prototype.clipped = function() {\n return this._rgb._clipped || !1;\n };\n var mn = x, dC = al;\n mn.prototype.darken = function(y) {\n y === void 0 && (y = 1);\n var A = this, D = A.lab();\n return D[0] -= dC.Kn * y, new mn(D, \"lab\").alpha(A.alpha(), !0);\n }, mn.prototype.brighten = function(y) {\n return y === void 0 && (y = 1), this.darken(-y);\n }, mn.prototype.darker = mn.prototype.darken, mn.prototype.brighter = mn.prototype.brighten;\n var pC = x;\n pC.prototype.get = function(y) {\n var A = y.split(\".\"), D = A[0], V = A[1], X = this[D]();\n if (V) {\n var K = D.indexOf(V) - (D.substr(0, 2) === \"ok\" ? 2 : 0);\n if (K > -1)\n return X[K];\n throw new Error(\"unknown channel \" + V + \" in mode \" + D);\n } else\n return X;\n };\n var Hn = x, gC = g.type, mC = Math.pow, _C = 1e-7, EC = 20;\n Hn.prototype.luminance = function(y) {\n if (y !== void 0 && gC(y) === \"number\") {\n if (y === 0)\n return new Hn([0, 0, 0, this._rgb[3]], \"rgb\");\n if (y === 1)\n return new Hn([255, 255, 255, this._rgb[3]], \"rgb\");\n var A = this.luminance(), D = \"rgb\", V = EC, X = function(W, $) {\n var te = W.interpolate($, 0.5, D), pe = te.luminance();\n return Math.abs(y - pe) < _C || !V-- ? te : pe > y ? X(W, te) : X(te, $);\n }, K = (A > y ? X(new Hn([0, 0, 0]), this) : X(this, new Hn([255, 255, 255]))).rgb();\n return new Hn(K.concat([this._rgb[3]]));\n }\n return vC.apply(void 0, this._rgb.slice(0, 3));\n };\n var vC = function(y, A, D) {\n return y = Ch(y), A = Ch(A), D = Ch(D), 0.2126 * y + 0.7152 * A + 0.0722 * D;\n }, Ch = function(y) {\n return y /= 255, y <= 0.03928 ? y / 12.92 : mC((y + 0.055) / 1.055, 2.4);\n }, Er = {}, hp = x, up = g.type, ul = Er, fp = function(y, A, D) {\n D === void 0 && (D = 0.5);\n for (var V = [], X = arguments.length - 3; X-- > 0; )\n V[X] = arguments[X + 3];\n var K = V[0] || \"lrgb\";\n if (!ul[K] && !V.length && (K = Object.keys(ul)[0]), !ul[K])\n throw new Error(\"interpolation mode \" + K + \" is not defined\");\n return up(y) !== \"object\" && (y = new hp(y)), up(A) !== \"object\" && (A = new hp(A)), ul[K](y, A, D).alpha(y.alpha() + D * (A.alpha() - y.alpha()));\n }, dp = x, TC = fp;\n dp.prototype.mix = dp.prototype.interpolate = function(y, A) {\n A === void 0 && (A = 0.5);\n for (var D = [], V = arguments.length - 2; V-- > 0; )\n D[V] = arguments[V + 2];\n return TC.apply(void 0, [this, y, A].concat(D));\n };\n var pp = x;\n pp.prototype.premultiply = function(y) {\n y === void 0 && (y = !1);\n var A = this._rgb, D = A[3];\n return y ? (this._rgb = [A[0] * D, A[1] * D, A[2] * D, D], this) : new pp([A[0] * D, A[1] * D, A[2] * D, D], \"rgb\");\n };\n var Rh = x, xC = al;\n Rh.prototype.saturate = function(y) {\n y === void 0 && (y = 1);\n var A = this, D = A.lch();\n return D[1] += xC.Kn * y, D[1] < 0 && (D[1] = 0), new Rh(D, \"lch\").alpha(A.alpha(), !0);\n }, Rh.prototype.desaturate = function(y) {\n return y === void 0 && (y = 1), this.saturate(-y);\n };\n var gp = x, mp = g.type;\n gp.prototype.set = function(y, A, D) {\n D === void 0 && (D = !1);\n var V = y.split(\".\"), X = V[0], K = V[1], W = this[X]();\n if (K) {\n var $ = X.indexOf(K) - (X.substr(0, 2) === \"ok\" ? 2 : 0);\n if ($ > -1) {\n if (mp(A) == \"string\")\n switch (A.charAt(0)) {\n case \"+\":\n W[$] += +A;\n break;\n case \"-\":\n W[$] += +A;\n break;\n case \"*\":\n W[$] *= +A.substr(1);\n break;\n case \"/\":\n W[$] /= +A.substr(1);\n break;\n default:\n W[$] = +A;\n }\n else if (mp(A) === \"number\")\n W[$] = A;\n else\n throw new Error(\"unsupported value for Color.set\");\n var te = new gp(W, X);\n return D ? (this._rgb = te._rgb, this) : te;\n }\n throw new Error(\"unknown channel \" + K + \" in mode \" + X);\n } else\n return W;\n };\n var CC = x, RC = function(y, A, D) {\n var V = y._rgb, X = A._rgb;\n return new CC(\n V[0] + D * (X[0] - V[0]),\n V[1] + D * (X[1] - V[1]),\n V[2] + D * (X[2] - V[2]),\n \"rgb\"\n );\n };\n Er.rgb = RC;\n var SC = x, Sh = Math.sqrt, Kn = Math.pow, yC = function(y, A, D) {\n var V = y._rgb, X = V[0], K = V[1], W = V[2], $ = A._rgb, te = $[0], pe = $[1], xe = $[2];\n return new SC(\n Sh(Kn(X, 2) * (1 - D) + Kn(te, 2) * D),\n Sh(Kn(K, 2) * (1 - D) + Kn(pe, 2) * D),\n Sh(Kn(W, 2) * (1 - D) + Kn(xe, 2) * D),\n \"rgb\"\n );\n };\n Er.lrgb = yC;\n var IC = x, bC = function(y, A, D) {\n var V = y.lab(), X = A.lab();\n return new IC(\n V[0] + D * (X[0] - V[0]),\n V[1] + D * (X[1] - V[1]),\n V[2] + D * (X[2] - V[2]),\n \"lab\"\n );\n };\n Er.lab = bC;\n var _p = x, qn = function(y, A, D, V) {\n var X, K, W, $;\n V === \"hsl\" ? (W = y.hsl(), $ = A.hsl()) : V === \"hsv\" ? (W = y.hsv(), $ = A.hsv()) : V === \"hcg\" ? (W = y.hcg(), $ = A.hcg()) : V === \"hsi\" ? (W = y.hsi(), $ = A.hsi()) : V === \"lch\" || V === \"hcl\" ? (V = \"hcl\", W = y.hcl(), $ = A.hcl()) : V === \"oklch\" && (W = y.oklch().reverse(), $ = A.oklch().reverse());\n var te, pe, xe, Ue, ye, Xe;\n (V.substr(0, 1) === \"h\" || V === \"oklch\") && (X = W, te = X[0], xe = X[1], ye = X[2], K = $, pe = K[0], Ue = K[1], Xe = K[2]);\n var Ge, ft, vt, bt;\n return !isNaN(te) && !isNaN(pe) ? (pe > te && pe - te > 180 ? bt = pe - (te + 360) : pe < te && te - pe > 180 ? bt = pe + 360 - te : bt = pe - te, ft = te + D * bt) : isNaN(te) ? isNaN(pe) ? ft = Number.NaN : (ft = pe, (ye == 1 || ye == 0) && V != \"hsv\" && (Ge = Ue)) : (ft = te, (Xe == 1 || Xe == 0) && V != \"hsv\" && (Ge = xe)), Ge === void 0 && (Ge = xe + D * (Ue - xe)), vt = ye + D * (Xe - ye), V === \"oklch\" ? new _p([vt, Ge, ft], V) : new _p([ft, Ge, vt], V);\n }, AC = qn, Ep = function(y, A, D) {\n return AC(y, A, D, \"lch\");\n };\n Er.lch = Ep, Er.hcl = Ep;\n var MC = x, PC = function(y, A, D) {\n var V = y.num(), X = A.num();\n return new MC(V + D * (X - V), \"num\");\n };\n Er.num = PC;\n var OC = qn, DC = function(y, A, D) {\n return OC(y, A, D, \"hcg\");\n };\n Er.hcg = DC;\n var NC = qn, FC = function(y, A, D) {\n return NC(y, A, D, \"hsi\");\n };\n Er.hsi = FC;\n var LC = qn, wC = function(y, A, D) {\n return LC(y, A, D, \"hsl\");\n };\n Er.hsl = wC;\n var UC = qn, VC = function(y, A, D) {\n return UC(y, A, D, \"hsv\");\n };\n Er.hsv = VC;\n var BC = x, kC = function(y, A, D) {\n var V = y.oklab(), X = A.oklab();\n return new BC(\n V[0] + D * (X[0] - V[0]),\n V[1] + D * (X[1] - V[1]),\n V[2] + D * (X[2] - V[2]),\n \"oklab\"\n );\n };\n Er.oklab = kC;\n var zC = qn, WC = function(y, A, D) {\n return zC(y, A, D, \"oklch\");\n };\n Er.oklch = WC;\n var yh = x, GC = g.clip_rgb, Ih = Math.pow, bh = Math.sqrt, Ah = Math.PI, vp = Math.cos, Tp = Math.sin, XC = Math.atan2, HC = function(y, A, D) {\n A === void 0 && (A = \"lrgb\"), D === void 0 && (D = null);\n var V = y.length;\n D || (D = Array.from(new Array(V)).map(function() {\n return 1;\n }));\n var X = V / D.reduce(function(ft, vt) {\n return ft + vt;\n });\n if (D.forEach(function(ft, vt) {\n D[vt] *= X;\n }), y = y.map(function(ft) {\n return new yh(ft);\n }), A === \"lrgb\")\n return KC(y, D);\n for (var K = y.shift(), W = K.get(A), $ = [], te = 0, pe = 0, xe = 0; xe < W.length; xe++)\n if (W[xe] = (W[xe] || 0) * D[0], $.push(isNaN(W[xe]) ? 0 : D[0]), A.charAt(xe) === \"h\" && !isNaN(W[xe])) {\n var Ue = W[xe] / 180 * Ah;\n te += vp(Ue) * D[0], pe += Tp(Ue) * D[0];\n }\n var ye = K.alpha() * D[0];\n y.forEach(function(ft, vt) {\n var bt = ft.get(A);\n ye += ft.alpha() * D[vt + 1];\n for (var Ft = 0; Ft < W.length; Ft++)\n if (!isNaN(bt[Ft]))\n if ($[Ft] += D[vt + 1], A.charAt(Ft) === \"h\") {\n var zi = bt[Ft] / 180 * Ah;\n te += vp(zi) * D[vt + 1], pe += Tp(zi) * D[vt + 1];\n } else\n W[Ft] += bt[Ft] * D[vt + 1];\n });\n for (var Xe = 0; Xe < W.length; Xe++)\n if (A.charAt(Xe) === \"h\") {\n for (var Ge = XC(pe / $[Xe], te / $[Xe]) / Ah * 180; Ge < 0; )\n Ge += 360;\n for (; Ge >= 360; )\n Ge -= 360;\n W[Xe] = Ge;\n } else\n W[Xe] = W[Xe] / $[Xe];\n return ye /= V, new yh(W, A).alpha(ye > 0.99999 ? 1 : ye, !0);\n }, KC = function(y, A) {\n for (var D = y.length, V = [0, 0, 0, 0], X = 0; X < y.length; X++) {\n var K = y[X], W = A[X] / D, $ = K._rgb;\n V[0] += Ih($[0], 2) * W, V[1] += Ih($[1], 2) * W, V[2] += Ih($[2], 2) * W, V[3] += $[3] * W;\n }\n return V[0] = bh(V[0]), V[1] = bh(V[1]), V[2] = bh(V[2]), V[3] > 0.9999999 && (V[3] = 1), new yh(GC(V));\n }, kr = M, Yn = g.type, qC = Math.pow, Mh = function(y) {\n var A = \"rgb\", D = kr(\"#ccc\"), V = 0, X = [0, 1], K = [], W = [0, 0], $ = !1, te = [], pe = !1, xe = 0, Ue = 1, ye = !1, Xe = {}, Ge = !0, ft = 1, vt = function(Ae) {\n if (Ae = Ae || [\"#fff\", \"#000\"], Ae && Yn(Ae) === \"string\" && kr.brewer && kr.brewer[Ae.toLowerCase()] && (Ae = kr.brewer[Ae.toLowerCase()]), Yn(Ae) === \"array\") {\n Ae.length === 1 && (Ae = [Ae[0], Ae[0]]), Ae = Ae.slice(0);\n for (var Je = 0; Je < Ae.length; Je++)\n Ae[Je] = kr(Ae[Je]);\n K.length = 0;\n for (var mt = 0; mt < Ae.length; mt++)\n K.push(mt / (Ae.length - 1));\n }\n return hr(), te = Ae;\n }, bt = function(Ae) {\n if ($ != null) {\n for (var Je = $.length - 1, mt = 0; mt < Je && Ae >= $[mt]; )\n mt++;\n return mt - 1;\n }\n return 0;\n }, Ft = function(Ae) {\n return Ae;\n }, zi = function(Ae) {\n return Ae;\n }, Oi = function(Ae, Je) {\n var mt, dt;\n if (Je == null && (Je = !1), isNaN(Ae) || Ae === null)\n return D;\n if (Je)\n dt = Ae;\n else if ($ && $.length > 2) {\n var Wi = bt(Ae);\n dt = Wi / ($.length - 2);\n } else\n Ue !== xe ? dt = (Ae - xe) / (Ue - xe) : dt = 1;\n dt = zi(dt), Je || (dt = Ft(dt)), ft !== 1 && (dt = qC(dt, ft)), dt = W[0] + dt * (1 - W[0] - W[1]), dt = Math.min(1, Math.max(0, dt));\n var $t = Math.floor(dt * 1e4);\n if (Ge && Xe[$t])\n mt = Xe[$t];\n else {\n if (Yn(te) === \"array\")\n for (var At = 0; At < K.length; At++) {\n var Vt = K[At];\n if (dt <= Vt) {\n mt = te[At];\n break;\n }\n if (dt >= Vt && At === K.length - 1) {\n mt = te[At];\n break;\n }\n if (dt > Vt && dt < K[At + 1]) {\n dt = (dt - Vt) / (K[At + 1] - Vt), mt = kr.interpolate(te[At], te[At + 1], dt, A);\n break;\n }\n }\n else\n Yn(te) === \"function\" && (mt = te(dt));\n Ge && (Xe[$t] = mt);\n }\n return mt;\n }, hr = function() {\n return Xe = {};\n };\n vt(y);\n var Rt = function(Ae) {\n var Je = kr(Oi(Ae));\n return pe && Je[pe] ? Je[pe]() : Je;\n };\n return Rt.classes = function(Ae) {\n if (Ae != null) {\n if (Yn(Ae) === \"array\")\n $ = Ae, X = [Ae[0], Ae[Ae.length - 1]];\n else {\n var Je = kr.analyze(X);\n Ae === 0 ? $ = [Je.min, Je.max] : $ = kr.limits(Je, \"e\", Ae);\n }\n return Rt;\n }\n return $;\n }, Rt.domain = function(Ae) {\n if (!arguments.length)\n return X;\n xe = Ae[0], Ue = Ae[Ae.length - 1], K = [];\n var Je = te.length;\n if (Ae.length === Je && xe !== Ue)\n for (var mt = 0, dt = Array.from(Ae); mt < dt.length; mt += 1) {\n var Wi = dt[mt];\n K.push((Wi - xe) / (Ue - xe));\n }\n else {\n for (var $t = 0; $t < Je; $t++)\n K.push($t / (Je - 1));\n if (Ae.length > 2) {\n var At = Ae.map(function(Bt, zt) {\n return zt / (Ae.length - 1);\n }), Vt = Ae.map(function(Bt) {\n return (Bt - xe) / (Ue - xe);\n });\n Vt.every(function(Bt, zt) {\n return At[zt] === Bt;\n }) || (zi = function(Bt) {\n if (Bt <= 0 || Bt >= 1)\n return Bt;\n for (var zt = 0; Bt >= Vt[zt + 1]; )\n zt++;\n var Wr = (Bt - Vt[zt]) / (Vt[zt + 1] - Vt[zt]), Ks = At[zt] + Wr * (At[zt + 1] - At[zt]);\n return Ks;\n });\n }\n }\n return X = [xe, Ue], Rt;\n }, Rt.mode = function(Ae) {\n return arguments.length ? (A = Ae, hr(), Rt) : A;\n }, Rt.range = function(Ae, Je) {\n return vt(Ae), Rt;\n }, Rt.out = function(Ae) {\n return pe = Ae, Rt;\n }, Rt.spread = function(Ae) {\n return arguments.length ? (V = Ae, Rt) : V;\n }, Rt.correctLightness = function(Ae) {\n return Ae == null && (Ae = !0), ye = Ae, hr(), ye ? Ft = function(Je) {\n for (var mt = Oi(0, !0).lab()[0], dt = Oi(1, !0).lab()[0], Wi = mt > dt, $t = Oi(Je, !0).lab()[0], At = mt + (dt - mt) * Je, Vt = $t - At, Bt = 0, zt = 1, Wr = 20; Math.abs(Vt) > 0.01 && Wr-- > 0; )\n (function() {\n return Wi && (Vt *= -1), Vt < 0 ? (Bt = Je, Je += (zt - Je) * 0.5) : (zt = Je, Je += (Bt - Je) * 0.5), $t = Oi(Je, !0).lab()[0], Vt = $t - At;\n })();\n return Je;\n } : Ft = function(Je) {\n return Je;\n }, Rt;\n }, Rt.padding = function(Ae) {\n return Ae != null ? (Yn(Ae) === \"number\" && (Ae = [Ae, Ae]), W = Ae, Rt) : W;\n }, Rt.colors = function(Ae, Je) {\n arguments.length < 2 && (Je = \"hex\");\n var mt = [];\n if (arguments.length === 0)\n mt = te.slice(0);\n else if (Ae === 1)\n mt = [Rt(0.5)];\n else if (Ae > 1) {\n var dt = X[0], Wi = X[1] - dt;\n mt = YC(0, Ae, !1).map(function(zt) {\n return Rt(dt + zt / (Ae - 1) * Wi);\n });\n } else {\n y = [];\n var $t = [];\n if ($ && $.length > 2)\n for (var At = 1, Vt = $.length, Bt = 1 <= Vt; Bt ? At < Vt : At > Vt; Bt ? At++ : At--)\n $t.push(($[At - 1] + $[At]) * 0.5);\n else\n $t = X;\n mt = $t.map(function(zt) {\n return Rt(zt);\n });\n }\n return kr[Je] && (mt = mt.map(function(zt) {\n return zt[Je]();\n })), mt;\n }, Rt.cache = function(Ae) {\n return Ae != null ? (Ge = Ae, Rt) : Ge;\n }, Rt.gamma = function(Ae) {\n return Ae != null ? (ft = Ae, Rt) : ft;\n }, Rt.nodata = function(Ae) {\n return Ae != null ? (D = kr(Ae), Rt) : D;\n }, Rt;\n };\n function YC(y, A, D) {\n for (var V = [], X = y < A, K = D ? X ? A + 1 : A - 1 : A, W = y; X ? W < K : W > K; X ? W++ : W--)\n V.push(W);\n return V;\n }\n var ja = x, ZC = Mh, jC = function(y) {\n for (var A = [1, 1], D = 1; D < y; D++) {\n for (var V = [1], X = 1; X <= A.length; X++)\n V[X] = (A[X] || 0) + A[X - 1];\n A = V;\n }\n return A;\n }, QC = function(y) {\n var A, D, V, X, K, W, $;\n if (y = y.map(function(ye) {\n return new ja(ye);\n }), y.length === 2)\n A = y.map(function(ye) {\n return ye.lab();\n }), K = A[0], W = A[1], X = function(ye) {\n var Xe = [0, 1, 2].map(function(Ge) {\n return K[Ge] + ye * (W[Ge] - K[Ge]);\n });\n return new ja(Xe, \"lab\");\n };\n else if (y.length === 3)\n D = y.map(function(ye) {\n return ye.lab();\n }), K = D[0], W = D[1], $ = D[2], X = function(ye) {\n var Xe = [0, 1, 2].map(function(Ge) {\n return (1 - ye) * (1 - ye) * K[Ge] + 2 * (1 - ye) * ye * W[Ge] + ye * ye * $[Ge];\n });\n return new ja(Xe, \"lab\");\n };\n else if (y.length === 4) {\n var te;\n V = y.map(function(ye) {\n return ye.lab();\n }), K = V[0], W = V[1], $ = V[2], te = V[3], X = function(ye) {\n var Xe = [0, 1, 2].map(function(Ge) {\n return (1 - ye) * (1 - ye) * (1 - ye) * K[Ge] + 3 * (1 - ye) * (1 - ye) * ye * W[Ge] + 3 * (1 - ye) * ye * ye * $[Ge] + ye * ye * ye * te[Ge];\n });\n return new ja(Xe, \"lab\");\n };\n } else if (y.length >= 5) {\n var pe, xe, Ue;\n pe = y.map(function(ye) {\n return ye.lab();\n }), Ue = y.length - 1, xe = jC(Ue), X = function(ye) {\n var Xe = 1 - ye, Ge = [0, 1, 2].map(function(ft) {\n return pe.reduce(function(vt, bt, Ft) {\n return vt + xe[Ft] * Math.pow(Xe, Ue - Ft) * Math.pow(ye, Ft) * bt[ft];\n }, 0);\n });\n return new ja(Ge, \"lab\");\n };\n } else\n throw new RangeError(\"No point in running bezier with only one color.\");\n return X;\n }, JC = function(y) {\n var A = QC(y);\n return A.scale = function() {\n return ZC(A);\n }, A;\n }, Ph = M, zr = function(y, A, D) {\n if (!zr[D])\n throw new Error(\"unknown blend mode \" + D);\n return zr[D](y, A);\n }, Xs = function(y) {\n return function(A, D) {\n var V = Ph(D).rgb(), X = Ph(A).rgb();\n return Ph.rgb(y(V, X));\n };\n }, Hs = function(y) {\n return function(A, D) {\n var V = [];\n return V[0] = y(A[0], D[0]), V[1] = y(A[1], D[1]), V[2] = y(A[2], D[2]), V;\n };\n }, $C = function(y) {\n return y;\n }, eR = function(y, A) {\n return y * A / 255;\n }, tR = function(y, A) {\n return y > A ? A : y;\n }, iR = function(y, A) {\n return y > A ? y : A;\n }, rR = function(y, A) {\n return 255 * (1 - (1 - y / 255) * (1 - A / 255));\n }, sR = function(y, A) {\n return A < 128 ? 2 * y * A / 255 : 255 * (1 - 2 * (1 - y / 255) * (1 - A / 255));\n }, nR = function(y, A) {\n return 255 * (1 - (1 - A / 255) / (y / 255));\n }, aR = function(y, A) {\n return y === 255 ? 255 : (y = 255 * (A / 255) / (1 - y / 255), y > 255 ? 255 : y);\n };\n zr.normal = Xs(Hs($C)), zr.multiply = Xs(Hs(eR)), zr.screen = Xs(Hs(rR)), zr.overlay = Xs(Hs(sR)), zr.darken = Xs(Hs(tR)), zr.lighten = Xs(Hs(iR)), zr.dodge = Xs(Hs(aR)), zr.burn = Xs(Hs(nR));\n for (var oR = zr, Oh = g.type, lR = g.clip_rgb, cR = g.TWOPI, hR = Math.pow, uR = Math.sin, fR = Math.cos, xp = M, dR = function(y, A, D, V, X) {\n y === void 0 && (y = 300), A === void 0 && (A = -1.5), D === void 0 && (D = 1), V === void 0 && (V = 1), X === void 0 && (X = [0, 1]);\n var K = 0, W;\n Oh(X) === \"array\" ? W = X[1] - X[0] : (W = 0, X = [X, X]);\n var $ = function(te) {\n var pe = cR * ((y + 120) / 360 + A * te), xe = hR(X[0] + W * te, V), Ue = K !== 0 ? D[0] + te * K : D, ye = Ue * xe * (1 - xe) / 2, Xe = fR(pe), Ge = uR(pe), ft = xe + ye * (-0.14861 * Xe + 1.78277 * Ge), vt = xe + ye * (-0.29227 * Xe - 0.90649 * Ge), bt = xe + ye * (1.97294 * Xe);\n return xp(lR([ft * 255, vt * 255, bt * 255, 1]));\n };\n return $.start = function(te) {\n return te == null ? y : (y = te, $);\n }, $.rotations = function(te) {\n return te == null ? A : (A = te, $);\n }, $.gamma = function(te) {\n return te == null ? V : (V = te, $);\n }, $.hue = function(te) {\n return te == null ? D : (D = te, Oh(D) === \"array\" ? (K = D[1] - D[0], K === 0 && (D = D[1])) : K = 0, $);\n }, $.lightness = function(te) {\n return te == null ? X : (Oh(te) === \"array\" ? (X = te, W = te[1] - te[0]) : (X = [te, te], W = 0), $);\n }, $.scale = function() {\n return xp.scale($);\n }, $.hue(D), $;\n }, pR = x, gR = \"0123456789abcdef\", mR = Math.floor, _R = Math.random, ER = function() {\n for (var y = \"#\", A = 0; A < 6; A++)\n y += gR.charAt(mR(_R() * 16));\n return new pR(y, \"hex\");\n }, Dh = c, Cp = Math.log, vR = Math.pow, TR = Math.floor, xR = Math.abs, Rp = function(y, A) {\n A === void 0 && (A = null);\n var D = {\n min: Number.MAX_VALUE,\n max: Number.MAX_VALUE * -1,\n sum: 0,\n values: [],\n count: 0\n };\n return Dh(y) === \"object\" && (y = Object.values(y)), y.forEach(function(V) {\n A && Dh(V) === \"object\" && (V = V[A]), V != null && !isNaN(V) && (D.values.push(V), D.sum += V, V < D.min && (D.min = V), V > D.max && (D.max = V), D.count += 1);\n }), D.domain = [D.min, D.max], D.limits = function(V, X) {\n return Sp(D, V, X);\n }, D;\n }, Sp = function(y, A, D) {\n A === void 0 && (A = \"equal\"), D === void 0 && (D = 7), Dh(y) == \"array\" && (y = Rp(y));\n var V = y.min, X = y.max, K = y.values.sort(function(Fh, Lh) {\n return Fh - Lh;\n });\n if (D === 1)\n return [V, X];\n var W = [];\n if (A.substr(0, 1) === \"c\" && (W.push(V), W.push(X)), A.substr(0, 1) === \"e\") {\n W.push(V);\n for (var $ = 1; $ < D; $++)\n W.push(V + $ / D * (X - V));\n W.push(X);\n } else if (A.substr(0, 1) === \"l\") {\n if (V <= 0)\n throw new Error(\"Logarithmic scales are only possible for values > 0\");\n var te = Math.LOG10E * Cp(V), pe = Math.LOG10E * Cp(X);\n W.push(V);\n for (var xe = 1; xe < D; xe++)\n W.push(vR(10, te + xe / D * (pe - te)));\n W.push(X);\n } else if (A.substr(0, 1) === \"q\") {\n W.push(V);\n for (var Ue = 1; Ue < D; Ue++) {\n var ye = (K.length - 1) * Ue / D, Xe = TR(ye);\n if (Xe === ye)\n W.push(K[Xe]);\n else {\n var Ge = ye - Xe;\n W.push(K[Xe] * (1 - Ge) + K[Xe + 1] * Ge);\n }\n }\n W.push(X);\n } else if (A.substr(0, 1) === \"k\") {\n var ft, vt = K.length, bt = new Array(vt), Ft = new Array(D), zi = !0, Oi = 0, hr = null;\n hr = [], hr.push(V);\n for (var Rt = 1; Rt < D; Rt++)\n hr.push(V + Rt / D * (X - V));\n for (hr.push(X); zi; ) {\n for (var Ae = 0; Ae < D; Ae++)\n Ft[Ae] = 0;\n for (var Je = 0; Je < vt; Je++)\n for (var mt = K[Je], dt = Number.MAX_VALUE, Wi = void 0, $t = 0; $t < D; $t++) {\n var At = xR(hr[$t] - mt);\n At < dt && (dt = At, Wi = $t), Ft[Wi]++, bt[Je] = Wi;\n }\n for (var Vt = new Array(D), Bt = 0; Bt < D; Bt++)\n Vt[Bt] = null;\n for (var zt = 0; zt < vt; zt++)\n ft = bt[zt], Vt[ft] === null ? Vt[ft] = K[zt] : Vt[ft] += K[zt];\n for (var Wr = 0; Wr < D; Wr++)\n Vt[Wr] *= 1 / Ft[Wr];\n zi = !1;\n for (var Ks = 0; Ks < D; Ks++)\n if (Vt[Ks] !== hr[Ks]) {\n zi = !0;\n break;\n }\n hr = Vt, Oi++, Oi > 200 && (zi = !1);\n }\n for (var qs = {}, Zn = 0; Zn < D; Zn++)\n qs[Zn] = [];\n for (var jn = 0; jn < vt; jn++)\n ft = bt[jn], qs[ft].push(K[jn]);\n for (var Rs = [], _n = 0; _n < D; _n++)\n Rs.push(qs[_n][0]), Rs.push(qs[_n][qs[_n].length - 1]);\n Rs = Rs.sort(function(Fh, Lh) {\n return Fh - Lh;\n }), W.push(Rs[0]);\n for (var Qa = 1; Qa < Rs.length; Qa += 2) {\n var En = Rs[Qa];\n !isNaN(En) && W.indexOf(En) === -1 && W.push(En);\n }\n }\n return W;\n }, yp = { analyze: Rp, limits: Sp }, Ip = x, CR = function(y, A) {\n y = new Ip(y), A = new Ip(A);\n var D = y.luminance(), V = A.luminance();\n return D > V ? (D + 0.05) / (V + 0.05) : (V + 0.05) / (D + 0.05);\n }, bp = x, Cs = Math.sqrt, Ti = Math.pow, RR = Math.min, SR = Math.max, Ap = Math.atan2, Mp = Math.abs, fl = Math.cos, Pp = Math.sin, yR = Math.exp, Op = Math.PI, IR = function(y, A, D, V, X) {\n D === void 0 && (D = 1), V === void 0 && (V = 1), X === void 0 && (X = 1);\n var K = function(En) {\n return 360 * En / (2 * Op);\n }, W = function(En) {\n return 2 * Op * En / 360;\n };\n y = new bp(y), A = new bp(A);\n var $ = Array.from(y.lab()), te = $[0], pe = $[1], xe = $[2], Ue = Array.from(A.lab()), ye = Ue[0], Xe = Ue[1], Ge = Ue[2], ft = (te + ye) / 2, vt = Cs(Ti(pe, 2) + Ti(xe, 2)), bt = Cs(Ti(Xe, 2) + Ti(Ge, 2)), Ft = (vt + bt) / 2, zi = 0.5 * (1 - Cs(Ti(Ft, 7) / (Ti(Ft, 7) + Ti(25, 7)))), Oi = pe * (1 + zi), hr = Xe * (1 + zi), Rt = Cs(Ti(Oi, 2) + Ti(xe, 2)), Ae = Cs(Ti(hr, 2) + Ti(Ge, 2)), Je = (Rt + Ae) / 2, mt = K(Ap(xe, Oi)), dt = K(Ap(Ge, hr)), Wi = mt >= 0 ? mt : mt + 360, $t = dt >= 0 ? dt : dt + 360, At = Mp(Wi - $t) > 180 ? (Wi + $t + 360) / 2 : (Wi + $t) / 2, Vt = 1 - 0.17 * fl(W(At - 30)) + 0.24 * fl(W(2 * At)) + 0.32 * fl(W(3 * At + 6)) - 0.2 * fl(W(4 * At - 63)), Bt = $t - Wi;\n Bt = Mp(Bt) <= 180 ? Bt : $t <= Wi ? Bt + 360 : Bt - 360, Bt = 2 * Cs(Rt * Ae) * Pp(W(Bt) / 2);\n var zt = ye - te, Wr = Ae - Rt, Ks = 1 + 0.015 * Ti(ft - 50, 2) / Cs(20 + Ti(ft - 50, 2)), qs = 1 + 0.045 * Je, Zn = 1 + 0.015 * Je * Vt, jn = 30 * yR(-Ti((At - 275) / 25, 2)), Rs = 2 * Cs(Ti(Je, 7) / (Ti(Je, 7) + Ti(25, 7))), _n = -Rs * Pp(2 * W(jn)), Qa = Cs(Ti(zt / (D * Ks), 2) + Ti(Wr / (V * qs), 2) + Ti(Bt / (X * Zn), 2) + _n * (Wr / (V * qs)) * (Bt / (X * Zn)));\n return SR(0, RR(100, Qa));\n }, Dp = x, bR = function(y, A, D) {\n D === void 0 && (D = \"lab\"), y = new Dp(y), A = new Dp(A);\n var V = y.get(D), X = A.get(D), K = 0;\n for (var W in V) {\n var $ = (V[W] || 0) - (X[W] || 0);\n K += $ * $;\n }\n return Math.sqrt(K);\n }, AR = x, MR = function() {\n for (var y = [], A = arguments.length; A--; )\n y[A] = arguments[A];\n try {\n return new (Function.prototype.bind.apply(AR, [null].concat(y)))(), !0;\n } catch {\n return !1;\n }\n }, Np = M, Fp = Mh, PR = {\n cool: function() {\n return Fp([Np.hsl(180, 1, 0.9), Np.hsl(250, 0.7, 0.4)]);\n },\n hot: function() {\n return Fp([\"#000\", \"#f00\", \"#ff0\", \"#fff\"]).mode(\"rgb\");\n }\n }, dl = {\n // sequential\n OrRd: [\"#fff7ec\", \"#fee8c8\", \"#fdd49e\", \"#fdbb84\", \"#fc8d59\", \"#ef6548\", \"#d7301f\", \"#b30000\", \"#7f0000\"],\n PuBu: [\"#fff7fb\", \"#ece7f2\", \"#d0d1e6\", \"#a6bddb\", \"#74a9cf\", \"#3690c0\", \"#0570b0\", \"#045a8d\", \"#023858\"],\n BuPu: [\"#f7fcfd\", \"#e0ecf4\", \"#bfd3e6\", \"#9ebcda\", \"#8c96c6\", \"#8c6bb1\", \"#88419d\", \"#810f7c\", \"#4d004b\"],\n Oranges: [\"#fff5eb\", \"#fee6ce\", \"#fdd0a2\", \"#fdae6b\", \"#fd8d3c\", \"#f16913\", \"#d94801\", \"#a63603\", \"#7f2704\"],\n BuGn: [\"#f7fcfd\", \"#e5f5f9\", \"#ccece6\", \"#99d8c9\", \"#66c2a4\", \"#41ae76\", \"#238b45\", \"#006d2c\", \"#00441b\"],\n YlOrBr: [\"#ffffe5\", \"#fff7bc\", \"#fee391\", \"#fec44f\", \"#fe9929\", \"#ec7014\", \"#cc4c02\", \"#993404\", \"#662506\"],\n YlGn: [\"#ffffe5\", \"#f7fcb9\", \"#d9f0a3\", \"#addd8e\", \"#78c679\", \"#41ab5d\", \"#238443\", \"#006837\", \"#004529\"],\n Reds: [\"#fff5f0\", \"#fee0d2\", \"#fcbba1\", \"#fc9272\", \"#fb6a4a\", \"#ef3b2c\", \"#cb181d\", \"#a50f15\", \"#67000d\"],\n RdPu: [\"#fff7f3\", \"#fde0dd\", \"#fcc5c0\", \"#fa9fb5\", \"#f768a1\", \"#dd3497\", \"#ae017e\", \"#7a0177\", \"#49006a\"],\n Greens: [\"#f7fcf5\", \"#e5f5e0\", \"#c7e9c0\", \"#a1d99b\", \"#74c476\", \"#41ab5d\", \"#238b45\", \"#006d2c\", \"#00441b\"],\n YlGnBu: [\"#ffffd9\", \"#edf8b1\", \"#c7e9b4\", \"#7fcdbb\", \"#41b6c4\", \"#1d91c0\", \"#225ea8\", \"#253494\", \"#081d58\"],\n Purples: [\"#fcfbfd\", \"#efedf5\", \"#dadaeb\", \"#bcbddc\", \"#9e9ac8\", \"#807dba\", \"#6a51a3\", \"#54278f\", \"#3f007d\"],\n GnBu: [\"#f7fcf0\", \"#e0f3db\", \"#ccebc5\", \"#a8ddb5\", \"#7bccc4\", \"#4eb3d3\", \"#2b8cbe\", \"#0868ac\", \"#084081\"],\n Greys: [\"#ffffff\", \"#f0f0f0\", \"#d9d9d9\", \"#bdbdbd\", \"#969696\", \"#737373\", \"#525252\", \"#252525\", \"#000000\"],\n YlOrRd: [\"#ffffcc\", \"#ffeda0\", \"#fed976\", \"#feb24c\", \"#fd8d3c\", \"#fc4e2a\", \"#e31a1c\", \"#bd0026\", \"#800026\"],\n PuRd: [\"#f7f4f9\", \"#e7e1ef\", \"#d4b9da\", \"#c994c7\", \"#df65b0\", \"#e7298a\", \"#ce1256\", \"#980043\", \"#67001f\"],\n Blues: [\"#f7fbff\", \"#deebf7\", \"#c6dbef\", \"#9ecae1\", \"#6baed6\", \"#4292c6\", \"#2171b5\", \"#08519c\", \"#08306b\"],\n PuBuGn: [\"#fff7fb\", \"#ece2f0\", \"#d0d1e6\", \"#a6bddb\", \"#67a9cf\", \"#3690c0\", \"#02818a\", \"#016c59\", \"#014636\"],\n Viridis: [\"#440154\", \"#482777\", \"#3f4a8a\", \"#31678e\", \"#26838f\", \"#1f9d8a\", \"#6cce5a\", \"#b6de2b\", \"#fee825\"],\n // diverging\n Spectral: [\"#9e0142\", \"#d53e4f\", \"#f46d43\", \"#fdae61\", \"#fee08b\", \"#ffffbf\", \"#e6f598\", \"#abdda4\", \"#66c2a5\", \"#3288bd\", \"#5e4fa2\"],\n RdYlGn: [\"#a50026\", \"#d73027\", \"#f46d43\", \"#fdae61\", \"#fee08b\", \"#ffffbf\", \"#d9ef8b\", \"#a6d96a\", \"#66bd63\", \"#1a9850\", \"#006837\"],\n RdBu: [\"#67001f\", \"#b2182b\", \"#d6604d\", \"#f4a582\", \"#fddbc7\", \"#f7f7f7\", \"#d1e5f0\", \"#92c5de\", \"#4393c3\", \"#2166ac\", \"#053061\"],\n PiYG: [\"#8e0152\", \"#c51b7d\", \"#de77ae\", \"#f1b6da\", \"#fde0ef\", \"#f7f7f7\", \"#e6f5d0\", \"#b8e186\", \"#7fbc41\", \"#4d9221\", \"#276419\"],\n PRGn: [\"#40004b\", \"#762a83\", \"#9970ab\", \"#c2a5cf\", \"#e7d4e8\", \"#f7f7f7\", \"#d9f0d3\", \"#a6dba0\", \"#5aae61\", \"#1b7837\", \"#00441b\"],\n RdYlBu: [\"#a50026\", \"#d73027\", \"#f46d43\", \"#fdae61\", \"#fee090\", \"#ffffbf\", \"#e0f3f8\", \"#abd9e9\", \"#74add1\", \"#4575b4\", \"#313695\"],\n BrBG: [\"#543005\", \"#8c510a\", \"#bf812d\", \"#dfc27d\", \"#f6e8c3\", \"#f5f5f5\", \"#c7eae5\", \"#80cdc1\", \"#35978f\", \"#01665e\", \"#003c30\"],\n RdGy: [\"#67001f\", \"#b2182b\", \"#d6604d\", \"#f4a582\", \"#fddbc7\", \"#ffffff\", \"#e0e0e0\", \"#bababa\", \"#878787\", \"#4d4d4d\", \"#1a1a1a\"],\n PuOr: [\"#7f3b08\", \"#b35806\", \"#e08214\", \"#fdb863\", \"#fee0b6\", \"#f7f7f7\", \"#d8daeb\", \"#b2abd2\", \"#8073ac\", \"#542788\", \"#2d004b\"],\n // qualitative\n Set2: [\"#66c2a5\", \"#fc8d62\", \"#8da0cb\", \"#e78ac3\", \"#a6d854\", \"#ffd92f\", \"#e5c494\", \"#b3b3b3\"],\n Accent: [\"#7fc97f\", \"#beaed4\", \"#fdc086\", \"#ffff99\", \"#386cb0\", \"#f0027f\", \"#bf5b17\", \"#666666\"],\n Set1: [\"#e41a1c\", \"#377eb8\", \"#4daf4a\", \"#984ea3\", \"#ff7f00\", \"#ffff33\", \"#a65628\", \"#f781bf\", \"#999999\"],\n Set3: [\"#8dd3c7\", \"#ffffb3\", \"#bebada\", \"#fb8072\", \"#80b1d3\", \"#fdb462\", \"#b3de69\", \"#fccde5\", \"#d9d9d9\", \"#bc80bd\", \"#ccebc5\", \"#ffed6f\"],\n Dark2: [\"#1b9e77\", \"#d95f02\", \"#7570b3\", \"#e7298a\", \"#66a61e\", \"#e6ab02\", \"#a6761d\", \"#666666\"],\n Paired: [\"#a6cee3\", \"#1f78b4\", \"#b2df8a\", \"#33a02c\", \"#fb9a99\", \"#e31a1c\", \"#fdbf6f\", \"#ff7f00\", \"#cab2d6\", \"#6a3d9a\", \"#ffff99\", \"#b15928\"],\n Pastel2: [\"#b3e2cd\", \"#fdcdac\", \"#cbd5e8\", \"#f4cae4\", \"#e6f5c9\", \"#fff2ae\", \"#f1e2cc\", \"#cccccc\"],\n Pastel1: [\"#fbb4ae\", \"#b3cde3\", \"#ccebc5\", \"#decbe4\", \"#fed9a6\", \"#ffffcc\", \"#e5d8bd\", \"#fddaec\", \"#f2f2f2\"]\n }, Nh = 0, Lp = Object.keys(dl); Nh < Lp.length; Nh += 1) {\n var wp = Lp[Nh];\n dl[wp.toLowerCase()] = dl[wp];\n }\n var OR = dl, Pi = M;\n Pi.average = HC, Pi.bezier = JC, Pi.blend = oR, Pi.cubehelix = dR, Pi.mix = Pi.interpolate = fp, Pi.random = ER, Pi.scale = Mh, Pi.analyze = yp.analyze, Pi.contrast = CR, Pi.deltaE = IR, Pi.distance = bR, Pi.limits = yp.limits, Pi.valid = MR, Pi.scales = PR, Pi.colors = Yd, Pi.brewer = OR;\n var DR = Pi;\n return DR;\n });\n})(Fv);\nvar Tk = Fv.exports;\nconst Xi = /* @__PURE__ */ cv(Tk);\nclass xk {\n constructor(e) {\n this.scheme = typeof e == \"string\" ? Lv[e] : e;\n }\n toColor3(e = this.scheme.length) {\n return Xi.scale(this.scheme).colors(e).map((t) => pi.FromHexString(t));\n }\n toColor4(e = this.scheme.length) {\n return Xi.scale(this.scheme).colors(e).map((t) => fu.FromHexString(t));\n }\n toStandardMaterial(e = this.scheme.length) {\n return Xi.scale(this.scheme).colors(e).map((t) => Yu(t));\n }\n toPBRMaterialRough(e = this.scheme.length) {\n return Xi.scale(this.scheme).colors(e).map((t) => Zu(t));\n }\n toPBRMaterialGlossy(e = this.scheme.length) {\n return Xi.scale(this.scheme).colors(e).map((t) => ju(t));\n }\n}\nclass Ck {\n constructor(e) {\n this.scheme = typeof e == \"string\" ? Lv[e] : e;\n }\n toColor3(e = void 0) {\n return e === void 0 ? (t) => pi.FromHexString(Xi.scale(this.scheme)(t).hex()) : (t) => pi.FromHexString(Xi.scale(this.scheme).classes(e)(t).hex());\n }\n toColor4(e = void 0) {\n return e === void 0 ? (t) => fu.FromHexString(Xi.scale(this.scheme)(t).hex()) : (t) => fu.FromHexString(Xi.scale(this.scheme).classes(e)(t).hex());\n }\n toStandardMaterial(e = void 0) {\n return e === void 0 ? (t) => Yu(Xi.scale(this.scheme)(t).hex()) : (t) => Yu(Xi.scale(this.scheme).classes(e)(t).hex());\n }\n toPBRMaterialRough(e = void 0) {\n return e === void 0 ? (t) => Zu(Xi.scale(this.scheme)(t).hex()) : (t) => Zu(Xi.scale(this.scheme).classes(e)(t).hex());\n }\n toPBRMaterialGlossy(e = void 0) {\n return e === void 0 ? (t) => ju(Xi.scale(this.scheme)(t).hex()) : (t) => ju(Xi.scale(this.scheme).classes(e)(t).hex());\n }\n}\nfunction Pk(n) {\n return new xk(n);\n}\nfunction Ok(n) {\n return new Ck(n);\n}\nlet Lv = {\n ...Xi.brewer,\n d310: [\n \"#1f77b4\",\n \"#ff7f0e\",\n \"#2ca02c\",\n \"#d62728\",\n \"#9467bd\",\n \"#8c564b\",\n \"#e377c2\",\n \"#7f7f7f\",\n \"#bcbd22\",\n \"#17becf\"\n ]\n};\n({\n ...Xi.brewer\n});\nfunction Yu(n) {\n let e = new Vs(n);\n return e.diffuseColor = pi.FromHexString(n), e;\n}\nfunction Zu(n) {\n let e = new BR(n);\n return e.baseColor = pi.FromHexString(n), e;\n}\nfunction ju(n) {\n let e = new kR(n);\n return e.diffuseColor = pi.FromHexString(n), e.specularColor = pi.FromHexString(n), e;\n}\nclass wv {\n constructor(e, t, i) {\n this.currentLayout = 0, this.name = e, this.options = t, this.scene = i, this.root = new Ji(this.name, this.scene);\n }\n planeLayout() {\n this.currentLayout = 1;\n let e = this.options.rows || 1, t = this.options.margin || new da(0, 0), i = this.options.selection.selected.length, r = this.boundingBoxLocal(this.options.selection), s = r.boundingBox.maximumWorld.x - r.boundingBox.minimumWorld.x, a = r.boundingBox.maximumWorld.y - r.boundingBox.minimumWorld.y, o = this.options.columns || i;\n return o = i % e == 0 ? i / e : Math.floor(i / e) + 1, this.options.selection.selected.forEach((l, c) => {\n l.parent = this.root, this.animatePosition(l, new Me((c % o - (o - 1) / 2) * (s + t.x), Math.floor(c / o) * (a + t.y), 0)), this.animateRotation(l, new Me(0, 0, 0));\n }), this;\n }\n cylinderLayout() {\n this.currentLayout = 2;\n let e = this.options.rows || 1, t = this.options.margin || new da(0, 0), i = this.options.selection.selected.length, r = this.boundingBoxLocal(this.options.selection), s = this.options.radius || 5, a = r.boundingBox.maximumWorld.x - r.boundingBox.minimumWorld.x, o = r.boundingBox.maximumWorld.y - r.boundingBox.minimumWorld.y, l = this.options.columns || i;\n l = i % e == 0 ? i / e : Math.floor(i / e) + 1;\n let c = Math.atan(a / 2 / s) * 2 / Math.PI * 180, h = new Me(0, 0, 1);\n return new Me(0, 1, 0), this.options.selection.selected.forEach((u, f) => {\n var T;\n u.parent = this.root, this.animateRotation(u, new Me(0, 0, 0));\n let d = new Ji(\"vect\", this.scene);\n d.position = new Me(0, 0, 0);\n let p = Math.floor(f / l), g = f % l;\n d.rotate(new Me(0, 1, 0), g * (c + t.x) * Math.PI / 180);\n let v = d.getDirection(h).normalize().multiplyByFloats(s, s, s), E = new Me(v.x, p * (o + t.y), v.z);\n this.animatePosition(u, E);\n let C = ((T = d.rotationQuaternion) == null ? void 0 : T.toEulerAngles()) || new Me(0, 0, 0);\n this.animateRotation(u, C), d.dispose();\n }), this;\n }\n sphereLayout() {\n this.currentLayout = 3;\n let e = this.options.rows || 1, t = this.options.margin || new da(0, 0), i = this.options.selection.selected.length, r = this.boundingBoxLocal(this.options.selection), s = this.options.radius || 5, a = r.boundingBox.maximumWorld.x - r.boundingBox.minimumWorld.x, o = r.boundingBox.maximumWorld.y - r.boundingBox.minimumWorld.y, l = this.options.columns || i;\n l = i % e == 0 ? i / e : Math.floor(i / e) + 1;\n let c = Math.atan(a / 2 / s) * 2 * 180 / Math.PI, h = Math.atan(o / 2 / s) * 2 * 180 / Math.PI;\n return this.options.selection.selected.forEach((u, f) => {\n u.parent = this.root;\n let d = Math.floor(f / l) - Math.floor(e / 2), p = f % l - Math.floor(l / 2), g = Math.min(d * (c + t.y), 360) * Math.PI / 180, m = Math.min(Math.abs(90 - p * (h + t.x)), 180) * Math.PI / 180, v = new Me(s * Math.sin(m) * Math.cos(g), s * Math.sin(m) * Math.sin(g), s * Math.cos(m));\n this.animatePosition(u, v);\n let E = new Me(-g, m, 0);\n this.animateRotation(u, E);\n }), this;\n }\n attr(e, t) {\n switch (e) {\n case \"row\":\n this.options.rows = Number(t), this.currentLayout == 1 && this.planeLayout(), this.currentLayout == 2 && this.cylinderLayout(), this.currentLayout == 3 && this.sphereLayout();\n break;\n case \"margin\":\n let i = t;\n this.options.margin = i, this.currentLayout == 1 && this.planeLayout(), this.currentLayout == 2 && this.cylinderLayout(), this.currentLayout == 3 && this.sphereLayout();\n break;\n case \"radius\":\n this.options.radius = Number(t), this.currentLayout == 2 && this.cylinderLayout(), this.currentLayout == 3 && this.sphereLayout();\n break;\n }\n return this;\n }\n // public zalign(){\n // let boundingBox = this.boundingBoxLocal(this.options.selection)\n // let widthZ = boundingBox.boundingBox.maximumWorld.z - boundingBox.boundingBox.minimumWorld.z;\n // this.options.selection.selected.forEach((node, i) => {\n // let test = new Selection([this.options.selection.selected[i]], this.scene);\n // let zSize = this.boundingBoxLocal(test).boundingBox.maximumWorld.z - this.boundingBoxLocal(test).boundingBox.minimumWorld.z;\n // this.animatePosition((node as TransformNode), new Vector3((node as TransformNode).position.x, (node as TransformNode).position.y, zSize / 2 - widthZ / 2));\n // })\n // return this;\n // }\n update() {\n return this.currentLayout == 1 && this.planeLayout(), this.currentLayout == 2 && this.cylinderLayout(), this.currentLayout == 3 && this.sphereLayout(), this;\n }\n animatePosition(e, t) {\n var i = new Ss(\"animationBezierTorus\", \"position\", 30, Ss.ANIMATIONTYPE_VECTOR3, Ss.ANIMATIONLOOPMODE_CONSTANT), r = [];\n r.push({ frame: 0, value: e.position }), r.push({ frame: 20, value: t }), i.setKeys(r);\n var s = new wh(0.73, 0, 0.31, 1);\n i.setEasingFunction(s), e.animations.length = Math.min(e.animations.length, 2), e.animations.push(i), this.scene.beginDirectAnimation(e, [i], 0, 20, !1);\n }\n animateRotation(e, t) {\n let i = [];\n i.push({ frame: 0, value: e.rotation }), i.push({ frame: 20, value: t });\n let r = new Ss(\n \"\",\n \"rotation\",\n 20,\n Ss.ANIMATIONTYPE_VECTOR3,\n Ss.ANIMATIONLOOPMODE_CYCLE\n );\n r.setKeys(i);\n var s = new wh(0.73, 0, 0.31, 1);\n r.setEasingFunction(s), this.scene.beginDirectAnimation(e, [r], 0, 20, !1);\n }\n animateScale(e, t) {\n var i = new Ss(\"animationBezierTorus\", \"scaling\", 30, Ss.ANIMATIONTYPE_VECTOR3, Ss.ANIMATIONLOOPMODE_CONSTANT), r = [];\n r.push({ frame: 0, value: e.scaling }), r.push({ frame: 10, value: t }), i.setKeys(r);\n var s = new wh(0.73, 0, 0.31, 1);\n i.setEasingFunction(s), e.animations.length = Math.min(e.animations.length, 2), e.animations.push(i), this.scene.beginDirectAnimation(e, [i], 0, 10, !0);\n }\n boundingBoxLocal(e) {\n let t = new Me(0, 0, 0), i = new Me(0, 0, 0);\n return e.selected.forEach((r, s) => {\n r.getChildMeshes().forEach((o, l) => {\n o.computeWorldMatrix(!0);\n let c = o.getBoundingInfo().boundingBox.minimumWorld.subtract(r.getAbsolutePosition()), h = o.getBoundingInfo().boundingBox.maximumWorld.subtract(r.getAbsolutePosition());\n t = Me.Minimize(t, c), i = Me.Maximize(i, h);\n });\n }), new an(t, i);\n }\n}\nfunction Dk(n, e, t) {\n const i = {\n selection: e.selection,\n rows: e.rows || 1,\n columns: e.columns || e.selection.selected.length,\n margin: e.margin || new da(0, 0),\n order: e.order || []\n };\n return new wv(n, i, t).planeLayout();\n}\nfunction Nk(n, e, t) {\n const i = {\n selection: e.selection,\n rows: e.rows || 1,\n columns: e.columns || e.selection.selected.length,\n radius: e.radius || 5,\n margin: e.margin || new da(0, 0),\n order: e.order || []\n };\n return new wv(n, i, t).cylinderLayout();\n}\nfunction Fk(n, e) {\n let t = n[0], i = n.slice(1), r = [];\n return t === \".\" ? (r = e.getNodes().filter((s) => s.name == i), new qt(r, e)) : t === \"#\" ? (r = e.getNodes().filter((s) => s.id == i), new qt(r, e)) : t === \"$\" ? (r = e.getNodes().filter((s) => ar.MatchesQuery(s, i) == !0), new qt(r, e)) : new qt([], e);\n}\nfunction Lk(n, e) {\n let t = [];\n return Array.isArray(n) ? n.forEach((i, r) => t = [...t, ...e.getNodes().filter((s) => s.name == i)]) : t = e.getNodes().filter((i) => i.name == n), new qt(t, e);\n}\nfunction wk(n, e) {\n let t = [];\n return Array.isArray(n) ? n.forEach((i, r) => t = [...t, ...e.getNodes().filter((s) => s.name == i)]) : t = e.getNodes().filter((i) => i.id == n), new qt(t, e);\n}\nfunction Uk(n, e) {\n let t = [];\n return Array.isArray(n) ? n.forEach(\n (i, r) => t = [...t, ...e.getNodes().filter((s) => ar.MatchesQuery(s, i) == !0)]\n ) : t = e.getNodes().filter((i) => ar.MatchesQuery(i, n) == !0), new qt(t, e);\n}\nfunction Vk(n, e, t) {\n let i = [];\n return Array.isArray(n) && Array.isArray(e) ? n.forEach(\n (r, s) => i = [\n ...i,\n ...t.getNodes().filter((a) => a.metadata != null).filter((a) => a.metadata.data[r] == e[s])\n ]\n ) : i = t.getNodes().filter((r) => r.metadata != null).filter((r) => r.metadata.data.key == e), new qt(i, t);\n}\nfunction Bk(n, e, t = [{}], i) {\n let r = [];\n return t.forEach((s, a) => {\n var o = zo(n, n, e, s, i);\n r.push(o);\n }), new qt(r, r[0].getScene());\n}\nfunction kk(n, e = [{}], t) {\n t = t ?? n.getScene();\n let i = [];\n return e.forEach((r, s) => {\n var a = n.createInstance(n.name + \"_\" + s);\n n instanceof Qu && (n.actionManager = new Fr(t)), ar.EnableFor(a), a.metadata = { ...n.metadata, data: r }, i.push(a);\n }), new qt(i, t);\n}\nexport {\n w2 as Axis,\n wv as Layout,\n vk as MeshMap,\n xk as OrdinalChromatic,\n bS as PlaneText,\n qt as Selection,\n Ck as SequentialChromatic,\n Z3 as TextureGlobe,\n eB as TextureMap,\n Bk as bind,\n kk as bindInstance,\n zo as create,\n yk as createAxes,\n Mk as createMeshMap,\n AS as createPlaneText,\n bk as createTextureGlobe,\n Ak as createTextureMap,\n Nk as cylinderLayout,\n Pk as ordinalChromatic,\n Dk as planeLayout,\n Lv as schemes,\n Fk as select,\n Vk as selectData,\n wk as selectId,\n Lk as selectName,\n Uk as selectTag,\n Ok as sequentialChromatic\n};\n"], + "mappings": "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EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,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GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE;AACvW,WAAO,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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AAC7B,IAAM,KAAK;AAAX,IAA6B,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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", + "names": ["n", "__", "_L", "_I", "_B"] } diff --git a/docs/.vitepress/cache/deps/_metadata.json b/docs/.vitepress/cache/deps/_metadata.json index 1e754bab..f2515fae 100644 --- a/docs/.vitepress/cache/deps/_metadata.json +++ b/docs/.vitepress/cache/deps/_metadata.json @@ -1,61 +1,61 @@ { - "hash": "fb0a178b", + "hash": "791e0254", "configHash": "6daf2d15", - "lockfileHash": "c627af27", - "browserHash": "5acb7264", + "lockfileHash": "b2afab01", + "browserHash": "f8aa63f7", "optimized": { "vue": { "src": "../../../node_modules/vue/dist/vue.runtime.esm-bundler.js", "file": "vue.js", - "fileHash": "0e18bad4", + "fileHash": "d2e2dab2", "needsInterop": false }, "vitepress > @vue/devtools-api": { "src": "../../../node_modules/@vue/devtools-api/dist/index.js", "file": "vitepress___@vue_devtools-api.js", - "fileHash": "695c8c73", + "fileHash": "95341ce3", "needsInterop": false }, "vitepress > @vueuse/core": { "src": "../../../node_modules/@vueuse/core/index.mjs", "file": "vitepress___@vueuse_core.js", - "fileHash": "64b3e66b", + "fileHash": "679c761b", "needsInterop": false }, "@babylonjs/core": { "src": "../../../node_modules/@babylonjs/core/index.js", "file": "@babylonjs_core.js", - "fileHash": "f42f1808", + "fileHash": "69bc6eb8", "needsInterop": false }, "@jpmorganchase/anu": { "src": "../../../node_modules/@jpmorganchase/anu/dist/anu.js", "file": "@jpmorganchase_anu.js", - "fileHash": "fa254463", + "fileHash": "1e030317", "needsInterop": false }, "d3": { "src": "../../../node_modules/d3/src/index.js", "file": "d3.js", - "fileHash": "9fb48b37", + "fileHash": "c7dde194", "needsInterop": false }, "@babylonjs/gui": { "src": "../../../node_modules/@babylonjs/gui/index.js", "file": "@babylonjs_gui.js", - "fileHash": "b497a774", + "fileHash": "14c0e92a", "needsInterop": false }, "chroma-js": { "src": "../../../node_modules/chroma-js/chroma.js", "file": "chroma-js.js", - "fileHash": "1089af10", + "fileHash": "45787807", "needsInterop": true }, "d3-force-3d": { "src": "../../../node_modules/d3-force-3d/src/index.js", "file": "d3-force-3d.js", - "fileHash": "eca27821", + "fileHash": "4273fbe1", "needsInterop": false } }, @@ -63,14 +63,14 @@ "chunk-EXUDKIXA": { "file": "chunk-EXUDKIXA.js" }, - "chunk-Z6B2QTD3": { - "file": "chunk-Z6B2QTD3.js" + "chunk-3EX2ZL37": { + "file": "chunk-3EX2ZL37.js" }, - "chunk-AT2PKA3F": { - "file": "chunk-AT2PKA3F.js" + "chunk-F43E4K3S": { + "file": "chunk-F43E4K3S.js" }, - "chunk-A56RIS75": { - "file": "chunk-A56RIS75.js" + "chunk-Z6B2QTD3": { + "file": "chunk-Z6B2QTD3.js" }, "chunk-Y2F7D3TJ": { "file": "chunk-Y2F7D3TJ.js" diff --git a/docs/.vitepress/cache/deps/chunk-AT2PKA3F.js b/docs/.vitepress/cache/deps/chunk-3EX2ZL37.js similarity index 99% rename from docs/.vitepress/cache/deps/chunk-AT2PKA3F.js rename to docs/.vitepress/cache/deps/chunk-3EX2ZL37.js index ec91d4ac..ebb93dda 100644 --- a/docs/.vitepress/cache/deps/chunk-AT2PKA3F.js +++ b/docs/.vitepress/cache/deps/chunk-3EX2ZL37.js @@ -230,7 +230,7 @@ import { serializeAsTexture, serializeAsVector2, serializeAsVector3 -} from "./chunk-A56RIS75.js"; +} from "./chunk-F43E4K3S.js"; // node_modules/@babylonjs/core/Actions/action.js var Action = class { @@ -160873,4 +160873,4 @@ export { FlowGraphReceiveCustomEventBlock, FlowGraphSceneTickEventBlock }; -//# sourceMappingURL=chunk-AT2PKA3F.js.map +//# sourceMappingURL=chunk-3EX2ZL37.js.map diff --git a/docs/.vitepress/cache/deps/chunk-AT2PKA3F.js.map b/docs/.vitepress/cache/deps/chunk-3EX2ZL37.js.map similarity index 100% rename from docs/.vitepress/cache/deps/chunk-AT2PKA3F.js.map rename to docs/.vitepress/cache/deps/chunk-3EX2ZL37.js.map diff --git a/docs/.vitepress/cache/deps/chunk-A56RIS75.js.map b/docs/.vitepress/cache/deps/chunk-A56RIS75.js.map deleted file mode 100644 index 6c2cdfca..00000000 --- a/docs/.vitepress/cache/deps/chunk-A56RIS75.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../../dev/core/src/abstractScene.ts", "../../../dev/core/src/Actions/abstractActionManager.ts", "../../../dev/core/src/Misc/observable.ts", "../../../dev/core/src/Maths/math.constants.ts", "../../../dev/core/src/Misc/typeStore.ts", "../../../dev/core/src/Engines/performanceConfigurator.ts", "../../../dev/core/src/Engines/engineStore.ts", "../../../dev/core/src/Misc/arrayTools.ts", "../../../dev/core/src/Maths/math.scalar.functions.ts", "../../../dev/core/src/Maths/math.vector.ts", "../../../dev/core/src/Maths/math.scalar.ts", "../../../dev/core/src/Maths/math.color.ts", "../../../dev/core/src/Actions/actionEvent.ts", "../../../dev/core/src/Misc/logger.ts", "../../../dev/core/src/Misc/deepCopier.ts", "../../../dev/core/src/Animations/animationKey.ts", "../../../dev/core/src/Animations/animationRange.ts", "../../../dev/core/src/Misc/decorators.functions.ts", "../../../dev/core/src/Misc/decorators.ts", "../../../dev/core/src/Misc/andOrNotEvaluator.ts", "../../../dev/core/src/Misc/tags.ts", "../../../dev/core/src/Misc/devTools.ts", "../../../dev/core/src/Misc/decorators.serialization.ts", "../../../node_modules/@babylonjs/core/tslib.es6.js", "../../../dev/core/src/node.ts", "../../../dev/core/src/Maths/math.size.ts", "../../../dev/core/src/Misc/webRequest.ts", "../../../dev/core/src/Animations/animation.ts", "../../../dev/core/src/Misc/domManagement.ts", "../../../dev/core/src/Misc/precisionDate.ts", "../../../dev/core/src/Misc/filesInputStore.ts", "../../../dev/core/src/Misc/retryStrategy.ts", "../../../dev/core/src/Misc/error.ts", "../../../dev/core/src/Misc/stringTools.ts", "../../../dev/core/src/Materials/shaderLanguage.ts", "../../../dev/core/src/Engines/shaderStore.ts", "../../../dev/core/src/Engines/Processors/shaderCodeNode.ts", "../../../dev/core/src/Engines/Processors/shaderCodeCursor.ts", "../../../dev/core/src/Engines/Processors/shaderCodeConditionNode.ts", "../../../dev/core/src/Engines/Processors/shaderCodeTestNode.ts", "../../../dev/core/src/Engines/Processors/Expressions/shaderDefineExpression.ts", "../../../dev/core/src/Engines/Processors/Expressions/Operators/shaderDefineIsDefinedOperator.ts", "../../../dev/core/src/Engines/Processors/Expressions/Operators/shaderDefineOrOperator.ts", "../../../dev/core/src/Engines/Processors/Expressions/Operators/shaderDefineAndOperator.ts", "../../../dev/core/src/Engines/Processors/Expressions/Operators/shaderDefineArithmeticOperator.ts", "../../../dev/core/src/Engines/Processors/shaderProcessor.ts", "../../../dev/core/src/Materials/effect.ts", "../../../dev/core/src/States/depthCullingState.ts", "../../../dev/core/src/States/stencilState.ts", "../../../dev/core/src/States/alphaCullingState.ts", "../../../dev/core/src/Materials/Textures/textureSampler.ts", "../../../dev/core/src/Materials/Textures/internalTexture.ts", "../../../dev/core/src/Engines/WebGL/webGL2ShaderProcessors.ts", "../../../dev/core/src/Buffers/dataBuffer.ts", "../../../dev/core/src/Meshes/WebGL/webGLDataBuffer.ts", "../../../dev/core/src/Engines/WebGL/webGLPipelineContext.ts", "../../../dev/core/src/Engines/WebGL/webGLHardwareTexture.ts", "../../../dev/core/src/Materials/drawWrapper.ts", "../../../dev/core/src/States/stencilStateComposer.ts", "../../../dev/core/src/Engines/WebGL/webGLShaderProcessors.ts", "../../../dev/core/src/Engines/thinEngine.ts", "../../../dev/core/src/Misc/timingTools.ts", "../../../dev/core/src/Misc/fileTools.ts", "../../../dev/core/src/Misc/guid.ts", "../../../dev/core/src/Misc/instantiationTools.ts", "../../../dev/core/src/Misc/tools.functions.ts", "../../../dev/core/src/Misc/tools.ts", "../../../dev/core/src/Misc/smartArray.ts", "../../../dev/core/src/Misc/stringDictionary.ts", "../../../dev/core/src/Materials/colorCurves.functions.ts", "../../../dev/core/src/Materials/colorCurves.ts", "../../../dev/core/src/Materials/imageProcessingConfiguration.functions.ts", "../../../dev/core/src/Materials/imageProcessingConfiguration.ts", "../../../dev/core/src/Engines/Extensions/engine.uniformBuffer.ts", "../../../dev/core/src/Materials/uniformBuffer.ts", "../../../dev/core/src/Buffers/buffer.ts", "../../../dev/core/src/Collisions/pickingInfo.ts", "../../../dev/core/src/PostProcesses/postProcessManager.ts", "../../../dev/core/src/Rendering/renderingGroup.ts", "../../../dev/core/src/Rendering/renderingManager.ts", "../../../dev/core/src/sceneComponent.ts", "../../../dev/core/src/Events/pointerEvents.ts", "../../../dev/core/src/Events/keyboardEvents.ts", "../../../dev/core/src/DeviceInput/InputDevices/deviceEnums.ts", "../../../dev/core/src/Events/deviceInputEvents.ts", "../../../dev/core/src/DeviceInput/InputDevices/deviceSource.ts", "../../../dev/core/src/DeviceInput/eventFactory.ts", "../../../dev/core/src/DeviceInput/nativeDeviceInputSystem.ts", "../../../dev/core/src/DeviceInput/webDeviceInputSystem.ts", "../../../dev/core/src/DeviceInput/internalDeviceSourceManager.ts", "../../../dev/core/src/DeviceInput/InputDevices/deviceSourceManager.ts", "../../../dev/core/src/Misc/perfCounter.ts", "../../../dev/core/src/Maths/math.plane.ts", "../../../dev/core/src/Maths/math.frustum.ts", "../../../dev/core/src/Inputs/scene.inputManager.ts", "../../../dev/core/src/Misc/uniqueIdGenerator.ts", "../../../dev/core/src/Lights/lightConstants.ts", "../../../dev/core/src/Inputs/pointerPickingConfiguration.ts", "../../../dev/core/src/scene.ts", "../../../dev/core/src/Maths/math.axis.ts", "../../../dev/core/src/Maths/math.path.ts", "../../../dev/core/src/Animations/animationGroup.ts", "../../../dev/core/src/Misc/coroutine.ts", "../../../dev/core/src/Maths/math.viewport.ts", "../../../dev/core/src/Cameras/camera.ts", "../../../dev/core/src/Collisions/intersectionInfo.ts", "../../../dev/core/src/Culling/boundingBox.ts", "../../../dev/core/src/Culling/boundingSphere.ts", "../../../dev/core/src/Culling/boundingInfo.ts", "../../../dev/core/src/Maths/math.functions.ts", "../../../dev/core/src/Meshes/subMesh.ts", "../../../dev/core/src/Meshes/mesh.vertexData.ts", "../../../dev/core/src/Loading/sceneLoaderFlags.ts", "../../../dev/core/src/Compat/compatibilityOptions.ts", "../../../dev/core/src/Meshes/geometry.ts", "../../../dev/core/src/Misc/performanceMonitor.ts", "../../../dev/core/src/Engines/Extensions/engine.readTexture.ts", "../../../dev/core/src/Engines/Extensions/engine.alpha.ts", "../../../dev/core/src/Engines/Extensions/engine.dynamicBuffer.ts", "../../../dev/core/src/Engines/engine.ts", "../../../dev/core/src/Meshes/transformNode.ts", "../../../dev/core/src/Collisions/meshCollisionData.ts", "../../../dev/core/src/Meshes/abstractMesh.ts", "../../../dev/core/src/Materials/materialPluginEvent.ts", "../../../dev/core/src/Materials/clipPlaneMaterialHelper.ts", "../../../dev/core/src/Materials/materialHelper.functions.ts", "../../../dev/core/src/Materials/materialStencilState.ts", "../../../dev/core/src/Materials/material.ts", "../../../dev/core/src/Materials/multiMaterial.ts", "../../../dev/core/src/Meshes/meshLODLevel.ts", "../../../dev/core/src/Meshes/mesh.ts", "../../../dev/core/src/Lights/light.ts", "../../../dev/core/src/Materials/Textures/thinTexture.ts", "../../../dev/core/src/Materials/Textures/baseTexture.ts", "../../../dev/core/src/Misc/copyTools.ts", "../../../dev/core/src/Materials/Textures/texture.ts", "../../../dev/core/src/Behaviors/Meshes/fadeInOutBehavior.ts", "../../../dev/core/src/Culling/ray.ts", "../../../dev/core/src/Misc/pivotTools.ts", "../../../dev/core/src/Meshes/Builders/planeBuilder.ts", "../../../dev/core/src/Behaviors/Meshes/pointerDragBehavior.ts", "../../../dev/core/src/Behaviors/Meshes/baseSixDofDragBehavior.ts", "../../../dev/core/src/Behaviors/Meshes/sixDofDragBehavior.ts", "../../../dev/core/src/Behaviors/Meshes/surfaceMagnetismBehavior.ts", "../../../dev/core/src/Behaviors/Meshes/followBehavior.ts", "../../../dev/core/src/XR/webXRFeaturesManager.ts", "../../../dev/core/src/XR/features/WebXRAbstractFeature.ts", "../../../dev/core/src/Physics/v1/physicsJoint.ts", "../../../dev/core/src/Physics/v1/physicsImpostor.ts", "../../../dev/core/src/Loading/sceneLoader.ts", "../../../dev/core/src/Materials/pushMaterial.ts", "../../../dev/core/src/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes.ts", "../../../dev/core/src/Materials/Node/Enums/nodeMaterialBlockTargets.ts", "../../../dev/core/src/Materials/materialDefines.ts", "../../../dev/core/src/Materials/Node/nodeMaterialBlockConnectionPoint.ts", "../../../dev/core/src/Materials/Node/nodeMaterialBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/transformBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/Vertex/vertexOutputBlock.ts", "../../../dev/core/src/Decorators/nodeDecorator.ts", "../../../dev/core/src/Materials/Node/Blocks/Fragment/fragmentOutputBlock.ts", "../../../dev/core/src/Materials/Node/Enums/nodeMaterialBlockConnectionPointMode.ts", "../../../dev/core/src/Materials/Node/Enums/nodeMaterialSystemValues.ts", "../../../dev/core/src/Maths/math.vertexFormat.ts", "../../../dev/core/src/Materials/Node/Blocks/Input/animatedInputBlockTypes.ts", "../../../dev/core/src/Materials/Node/Blocks/Input/inputBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/Dual/currentScreenBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/Particle/particleTextureBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/Particle/particleRampGradientBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/Particle/particleBlendMultiplyBlock.ts", "../../../dev/core/src/Materials/effectFallbacks.ts", "../../../dev/core/src/Engines/renderTargetWrapper.ts", "../../../dev/core/src/Shaders/postprocess.vertex.ts", "../../../dev/core/src/Engines/WebGL/webGLRenderTargetWrapper.ts", "../../../dev/core/src/Engines/Extensions/engine.renderTarget.ts", "../../../dev/core/src/PostProcesses/postProcess.ts", "../../../dev/core/src/Materials/Node/Blocks/vectorMergerBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/remapBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/baseMathBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/multiplyBlock.ts", "../../../dev/core/src/Materials/Node/Enums/nodeMaterialModes.ts", "../../../dev/core/src/Materials/imageProcessingConfiguration.defines.ts", "../../../dev/core/src/Particles/baseParticleSystem.ts", "../../../dev/core/src/Materials/Node/Blocks/colorSplitterBlock.ts", "../../../dev/core/src/Materials/effectRenderer.ts", "../../../dev/core/src/Shaders/pass.fragment.ts", "../../../dev/core/src/Misc/dumpTools.ts", "../../../dev/core/src/Engines/Extensions/engine.renderTargetCube.ts", "../../../dev/core/src/Materials/Textures/renderTargetTexture.ts", "../../../dev/core/src/Materials/Textures/Procedurals/proceduralTextureSceneComponent.ts", "../../../dev/core/src/Shaders/procedural.vertex.ts", "../../../dev/core/src/Materials/Textures/Procedurals/proceduralTexture.ts", "../../../dev/core/src/Materials/Node/Blocks/trigonometryBlock.ts", "../../../dev/core/src/Materials/Node/nodeMaterialBuildState.ts", "../../../dev/core/src/Materials/Node/nodeMaterialBuildStateSharedData.ts", "../../../dev/core/src/Materials/Node/nodeMaterial.ts", "../../../dev/core/src/Meshes/Builders/icoSphereBuilder.ts", "../../../dev/core/src/XR/features/WebXRHandTracking.ts", "../../../dev/core/src/Behaviors/Meshes/handConstraintBehavior.ts", "../../../dev/core/src/Materials/materialFlags.ts", "../../../dev/core/src/Materials/materialPluginManager.ts", "../../../dev/core/src/Materials/materialPluginBase.ts", "../../../dev/core/src/Materials/material.detailMapConfiguration.ts", "../../../dev/core/src/Materials/prePassConfiguration.ts", "../../../dev/core/src/Shaders/ShadersInclude/decalFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/defaultFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/sceneUboDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/meshUboDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/defaultUboDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/prePassDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/oitDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/mainUVVaryingDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/helperFunctions.ts", "../../../dev/core/src/Shaders/ShadersInclude/lightFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/lightUboDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/lightsFragmentFunctions.ts", "../../../dev/core/src/Shaders/ShadersInclude/shadowsFragmentFunctions.ts", "../../../dev/core/src/Shaders/ShadersInclude/samplerFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/fresnelFunction.ts", "../../../dev/core/src/Shaders/ShadersInclude/reflectionFunction.ts", "../../../dev/core/src/Shaders/ShadersInclude/imageProcessingDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/imageProcessingFunctions.ts", "../../../dev/core/src/Shaders/ShadersInclude/bumpFragmentMainFunctions.ts", "../../../dev/core/src/Shaders/ShadersInclude/bumpFragmentFunctions.ts", "../../../dev/core/src/Shaders/ShadersInclude/clipPlaneFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/logDepthDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/fogFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/clipPlaneFragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/bumpFragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/decalFragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/depthPrePass.ts", "../../../dev/core/src/Shaders/ShadersInclude/lightFragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/logDepthFragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/fogFragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/oitFragment.ts", "../../../dev/core/src/Shaders/default.fragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/decalVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/defaultVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/uvAttributeDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/bonesDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/bakedVertexAnimationDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/instancesDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/prePassVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/samplerVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/bumpVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/clipPlaneVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/fogVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/lightVxFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/lightVxUboDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/morphTargetsVertexGlobalDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/morphTargetsVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/morphTargetsVertexGlobal.ts", "../../../dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/instancesVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/bonesVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/bakedVertexAnimation.ts", "../../../dev/core/src/Shaders/ShadersInclude/prePassVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/uvVariableDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/samplerVertexImplementation.ts", "../../../dev/core/src/Shaders/ShadersInclude/bumpVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/clipPlaneVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/fogVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/shadowsVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/vertexColorMixing.ts", "../../../dev/core/src/Shaders/ShadersInclude/pointCloudVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/logDepthVertex.ts", "../../../dev/core/src/Shaders/default.vertex.ts", "../../../dev/core/src/Materials/standardMaterial.ts", "../../../dev/core/src/Engines/Extensions/engine.dynamicTexture.ts", "../../../dev/core/src/Materials/Textures/dynamicTexture.ts", "../../../dev/core/src/Meshes/groundMesh.ts", "../../../dev/core/src/Meshes/Builders/groundBuilder.ts", "../../../dev/core/src/Lights/hemisphericLight.ts", "../../../dev/core/src/Rendering/utilityLayerRenderer.ts", "../../../dev/core/src/Gizmos/gizmo.ts", "../../../dev/core/src/Meshes/Builders/boxBuilder.ts", "../../../dev/core/src/Materials/shaderMaterial.ts", "../../../dev/core/src/Engines/constants.ts", "../../../dev/core/src/Events/clipboardEvents.ts", "../../../dev/core/src/Layers/layerSceneComponent.ts", "../../../dev/core/src/Shaders/layer.fragment.ts", "../../../dev/core/src/Shaders/layer.vertex.ts", "../../../dev/core/src/Layers/layer.ts"], - "sourcesContent": ["import type { Scene } from \"./scene\";\r\nimport type { Nullable } from \"./types\";\r\nimport type { AbstractMesh } from \"./Meshes/abstractMesh\";\r\nimport type { TransformNode } from \"./Meshes/transformNode\";\r\nimport type { Geometry } from \"./Meshes/geometry\";\r\nimport type { Skeleton } from \"./Bones/skeleton\";\r\nimport type { MorphTargetManager } from \"./Morph/morphTargetManager\";\r\nimport type { AssetContainer } from \"./assetContainer\";\r\nimport type { IParticleSystem } from \"./Particles/IParticleSystem\";\r\nimport type { AnimationGroup } from \"./Animations/animationGroup\";\r\nimport type { BaseTexture } from \"./Materials/Textures/baseTexture\";\r\nimport type { Material } from \"./Materials/material\";\r\nimport type { MultiMaterial } from \"./Materials/multiMaterial\";\r\nimport type { AbstractActionManager } from \"./Actions/abstractActionManager\";\r\nimport type { Camera } from \"./Cameras/camera\";\r\nimport type { Light } from \"./Lights/light\";\r\nimport type { Node } from \"./node\";\r\nimport type { PostProcess } from \"./PostProcesses/postProcess\";\r\nimport type { Animation } from \"./Animations/animation\";\r\n\r\n/**\r\n * Defines how the parser contract is defined.\r\n * These parsers are used to parse a list of specific assets (like particle systems, etc..)\r\n */\r\nexport type BabylonFileParser = (parsedData: any, scene: Scene, container: AssetContainer, rootUrl: string) => void;\r\n\r\n/**\r\n * Defines how the individual parser contract is defined.\r\n * These parser can parse an individual asset\r\n */\r\nexport type IndividualBabylonFileParser = (parsedData: any, scene: Scene, rootUrl: string) => any;\r\n\r\n/**\r\n * Base class of the scene acting as a container for the different elements composing a scene.\r\n * This class is dynamically extended by the different components of the scene increasing\r\n * flexibility and reducing coupling\r\n */\r\nexport abstract class AbstractScene {\r\n /**\r\n * Stores the list of available parsers in the application.\r\n */\r\n private static _BabylonFileParsers: { [key: string]: BabylonFileParser } = {};\r\n\r\n /**\r\n * Stores the list of available individual parsers in the application.\r\n */\r\n private static _IndividualBabylonFileParsers: { [key: string]: IndividualBabylonFileParser } = {};\r\n\r\n /**\r\n * Adds a parser in the list of available ones\r\n * @param name Defines the name of the parser\r\n * @param parser Defines the parser to add\r\n */\r\n public static AddParser(name: string, parser: BabylonFileParser): void {\r\n this._BabylonFileParsers[name] = parser;\r\n }\r\n\r\n /**\r\n * Gets a general parser from the list of available ones\r\n * @param name Defines the name of the parser\r\n * @returns the requested parser or null\r\n */\r\n public static GetParser(name: string): Nullable {\r\n if (this._BabylonFileParsers[name]) {\r\n return this._BabylonFileParsers[name];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Adds n individual parser in the list of available ones\r\n * @param name Defines the name of the parser\r\n * @param parser Defines the parser to add\r\n */\r\n public static AddIndividualParser(name: string, parser: IndividualBabylonFileParser): void {\r\n this._IndividualBabylonFileParsers[name] = parser;\r\n }\r\n\r\n /**\r\n * Gets an individual parser from the list of available ones\r\n * @param name Defines the name of the parser\r\n * @returns the requested parser or null\r\n */\r\n public static GetIndividualParser(name: string): Nullable {\r\n if (this._IndividualBabylonFileParsers[name]) {\r\n return this._IndividualBabylonFileParsers[name];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Parser json data and populate both a scene and its associated container object\r\n * @param jsonData Defines the data to parse\r\n * @param scene Defines the scene to parse the data for\r\n * @param container Defines the container attached to the parsing sequence\r\n * @param rootUrl Defines the root url of the data\r\n */\r\n public static Parse(jsonData: any, scene: Scene, container: AssetContainer, rootUrl: string): void {\r\n for (const parserName in this._BabylonFileParsers) {\r\n if (Object.prototype.hasOwnProperty.call(this._BabylonFileParsers, parserName)) {\r\n this._BabylonFileParsers[parserName](jsonData, scene, container, rootUrl);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the list of root nodes (ie. nodes with no parent)\r\n */\r\n public rootNodes: Node[] = [];\r\n\r\n /** All of the cameras added to this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras\r\n */\r\n public cameras: Camera[] = [];\r\n\r\n /**\r\n * All of the lights added to this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction\r\n */\r\n public lights: Light[] = [];\r\n\r\n /**\r\n * All of the (abstract) meshes added to this scene\r\n */\r\n public meshes: AbstractMesh[] = [];\r\n\r\n /**\r\n * The list of skeletons added to the scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons\r\n */\r\n public skeletons: Skeleton[] = [];\r\n\r\n /**\r\n * All of the particle systems added to this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro\r\n */\r\n public particleSystems: IParticleSystem[] = [];\r\n\r\n /**\r\n * Gets a list of Animations associated with the scene\r\n */\r\n public animations: Animation[] = [];\r\n\r\n /**\r\n * All of the animation groups added to this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/groupAnimations\r\n */\r\n public animationGroups: AnimationGroup[] = [];\r\n\r\n /**\r\n * All of the multi-materials added to this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials\r\n */\r\n public multiMaterials: MultiMaterial[] = [];\r\n\r\n /**\r\n * All of the materials added to this scene\r\n * In the context of a Scene, it is not supposed to be modified manually.\r\n * Any addition or removal should be done using the addMaterial and removeMaterial Scene methods.\r\n * Note also that the order of the Material within the array is not significant and might change.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction\r\n */\r\n public materials: Material[] = [];\r\n\r\n /**\r\n * The list of morph target managers added to the scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph\r\n */\r\n public morphTargetManagers: MorphTargetManager[] = [];\r\n\r\n /**\r\n * The list of geometries used in the scene.\r\n */\r\n public geometries: Geometry[] = [];\r\n\r\n /**\r\n * All of the transform nodes added to this scene\r\n * In the context of a Scene, it is not supposed to be modified manually.\r\n * Any addition or removal should be done using the addTransformNode and removeTransformNode Scene methods.\r\n * Note also that the order of the TransformNode within the array is not significant and might change.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/transform_node\r\n */\r\n public transformNodes: TransformNode[] = [];\r\n\r\n /**\r\n * ActionManagers available on the scene.\r\n * @deprecated\r\n */\r\n public actionManagers: AbstractActionManager[] = [];\r\n\r\n /**\r\n * Textures to keep.\r\n */\r\n public textures: BaseTexture[] = [];\r\n\r\n /** @internal */\r\n protected _environmentTexture: Nullable = null;\r\n /**\r\n * Texture used in all pbr material as the reflection texture.\r\n * As in the majority of the scene they are the same (exception for multi room and so on),\r\n * this is easier to reference from here than from all the materials.\r\n */\r\n public get environmentTexture(): Nullable {\r\n return this._environmentTexture;\r\n }\r\n\r\n public set environmentTexture(value: Nullable) {\r\n this._environmentTexture = value;\r\n }\r\n\r\n /**\r\n * The list of postprocesses added to the scene\r\n */\r\n public postProcesses: PostProcess[] = [];\r\n\r\n /**\r\n * @returns all meshes, lights, cameras, transformNodes and bones\r\n */\r\n public getNodes(): Array {\r\n let nodes: Node[] = [];\r\n nodes = nodes.concat(this.meshes);\r\n nodes = nodes.concat(this.lights);\r\n nodes = nodes.concat(this.cameras);\r\n nodes = nodes.concat(this.transformNodes); // dummies\r\n this.skeletons.forEach((skeleton) => (nodes = nodes.concat(skeleton.bones)));\r\n return nodes;\r\n }\r\n}\r\n", "import type { IDisposable } from \"../scene\";\r\nimport type { IActionEvent } from \"./actionEvent\";\r\nimport type { IAction } from \"./action\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Nullable } from \"../types\";\r\n\r\n/**\r\n * Abstract class used to decouple action Manager from scene and meshes.\r\n * Do not instantiate.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions\r\n */\r\nexport abstract class AbstractActionManager implements IDisposable {\r\n /** Gets the list of active triggers */\r\n public static Triggers: { [key: string]: number } = {};\r\n\r\n /** Gets the cursor to use when hovering items */\r\n public hoverCursor: string = \"\";\r\n\r\n /** Gets the list of actions */\r\n public actions: IAction[] = [];\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the manager is recursive meaning that it can trigger action from children\r\n */\r\n public isRecursive = false;\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public abstract dispose(): void;\r\n\r\n /**\r\n * Does this action manager has pointer triggers\r\n */\r\n public abstract get hasPointerTriggers(): boolean;\r\n\r\n /**\r\n * Does this action manager has pick triggers\r\n */\r\n public abstract get hasPickTriggers(): boolean;\r\n\r\n /**\r\n * Process a specific trigger\r\n * @param trigger defines the trigger to process\r\n * @param evt defines the event details to be processed\r\n */\r\n public abstract processTrigger(trigger: number, evt?: IActionEvent): void;\r\n\r\n /**\r\n * Does this action manager handles actions of any of the given triggers\r\n * @param triggers defines the triggers to be tested\r\n * @returns a boolean indicating whether one (or more) of the triggers is handled\r\n */\r\n public abstract hasSpecificTriggers(triggers: number[]): boolean;\r\n\r\n /**\r\n * Does this action manager handles actions of any of the given triggers. This function takes two arguments for\r\n * speed.\r\n * @param triggerA defines the trigger to be tested\r\n * @param triggerB defines the trigger to be tested\r\n * @returns a boolean indicating whether one (or more) of the triggers is handled\r\n */\r\n public abstract hasSpecificTriggers2(triggerA: number, triggerB: number): boolean;\r\n\r\n /**\r\n * Does this action manager handles actions of a given trigger\r\n * @param trigger defines the trigger to be tested\r\n * @param parameterPredicate defines an optional predicate to filter triggers by parameter\r\n * @returns whether the trigger is handled\r\n */\r\n public abstract hasSpecificTrigger(trigger: number, parameterPredicate?: (parameter: any) => boolean): boolean;\r\n\r\n /**\r\n * Serialize this manager to a JSON object\r\n * @param name defines the property name to store this manager\r\n * @returns a JSON representation of this manager\r\n */\r\n public abstract serialize(name: string): any;\r\n\r\n /**\r\n * Registers an action to this action manager\r\n * @param action defines the action to be registered\r\n * @returns the action amended (prepared) after registration\r\n */\r\n public abstract registerAction(action: IAction): Nullable;\r\n\r\n /**\r\n * Unregisters an action to this action manager\r\n * @param action defines the action to be unregistered\r\n * @returns a boolean indicating whether the action has been unregistered\r\n */\r\n public abstract unregisterAction(action: IAction): Boolean;\r\n\r\n /**\r\n * Does exist one action manager with at least one trigger\r\n **/\r\n public static get HasTriggers(): boolean {\r\n for (const t in AbstractActionManager.Triggers) {\r\n if (Object.prototype.hasOwnProperty.call(AbstractActionManager.Triggers, t)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Does exist one action manager with at least one pick trigger\r\n **/\r\n public static get HasPickTriggers(): boolean {\r\n for (const t in AbstractActionManager.Triggers) {\r\n if (Object.prototype.hasOwnProperty.call(AbstractActionManager.Triggers, t)) {\r\n const tAsInt = parseInt(t);\r\n if (tAsInt >= Constants.ACTION_OnPickTrigger && tAsInt <= Constants.ACTION_OnPickUpTrigger) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Does exist one action manager that handles actions of a given trigger\r\n * @param trigger defines the trigger to be tested\r\n * @returns a boolean indicating whether the trigger is handled by at least one action manager\r\n **/\r\n public static HasSpecificTrigger(trigger: number): boolean {\r\n for (const t in AbstractActionManager.Triggers) {\r\n if (Object.prototype.hasOwnProperty.call(AbstractActionManager.Triggers, t)) {\r\n const tAsInt = parseInt(t);\r\n if (tAsInt === trigger) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * A class serves as a medium between the observable and its observers\r\n */\r\nexport class EventState {\r\n /**\r\n * Create a new EventState\r\n * @param mask defines the mask associated with this state\r\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n */\r\n constructor(mask: number, skipNextObservers = false, target?: any, currentTarget?: any) {\r\n this.initialize(mask, skipNextObservers, target, currentTarget);\r\n }\r\n\r\n /**\r\n * Initialize the current event state\r\n * @param mask defines the mask associated with this state\r\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n * @returns the current event state\r\n */\r\n public initialize(mask: number, skipNextObservers = false, target?: any, currentTarget?: any): EventState {\r\n this.mask = mask;\r\n this.skipNextObservers = skipNextObservers;\r\n this.target = target;\r\n this.currentTarget = currentTarget;\r\n return this;\r\n }\r\n\r\n /**\r\n * An Observer can set this property to true to prevent subsequent observers of being notified\r\n */\r\n public skipNextObservers: boolean;\r\n\r\n /**\r\n * Get the mask value that were used to trigger the event corresponding to this EventState object\r\n */\r\n public mask: number;\r\n\r\n /**\r\n * The object that originally notified the event\r\n */\r\n public target?: any;\r\n\r\n /**\r\n * The current object in the bubbling phase\r\n */\r\n public currentTarget?: any;\r\n\r\n /**\r\n * This will be populated with the return value of the last function that was executed.\r\n * If it is the first function in the callback chain it will be the event data.\r\n */\r\n public lastReturnValue?: any;\r\n\r\n /**\r\n * User defined information that will be sent to observers\r\n */\r\n public userInfo?: any;\r\n}\r\n\r\n/**\r\n * Represent an Observer registered to a given Observable object.\r\n */\r\nexport class Observer {\r\n /** @internal */\r\n public _willBeUnregistered = false;\r\n /**\r\n * Gets or sets a property defining that the observer as to be unregistered after the next notification\r\n */\r\n public unregisterOnNextCall = false;\r\n\r\n /**\r\n * this function can be used to remove the observer from the observable.\r\n * It will be set by the observable that the observer belongs to.\r\n * @internal\r\n */\r\n public _remove: Nullable<() => void> = null;\r\n\r\n /**\r\n * Creates a new observer\r\n * @param callback defines the callback to call when the observer is notified\r\n * @param mask defines the mask of the observer (used to filter notifications)\r\n * @param scope defines the current scope used to restore the JS context\r\n */\r\n constructor(\r\n /**\r\n * Defines the callback to call when the observer is notified\r\n */\r\n public callback: (eventData: T, eventState: EventState) => void,\r\n /**\r\n * Defines the mask of the observer (used to filter notifications)\r\n */\r\n public mask: number,\r\n /**\r\n * Defines the current scope used to restore the JS context\r\n */\r\n public scope: any = null\r\n ) {}\r\n\r\n /**\r\n * Remove the observer from its observable\r\n * This can be used instead of using the observable's remove function.\r\n */\r\n public remove() {\r\n if (this._remove) {\r\n this._remove();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The Observable class is a simple implementation of the Observable pattern.\r\n *\r\n * There's one slight particularity though: a given Observable can notify its observer using a particular mask value, only the Observers registered with this mask value will be notified.\r\n * This enable a more fine grained execution without having to rely on multiple different Observable objects.\r\n * For instance you may have a given Observable that have four different types of notifications: Move (mask = 0x01), Stop (mask = 0x02), Turn Right (mask = 0X04), Turn Left (mask = 0X08).\r\n * A given observer can register itself with only Move and Stop (mask = 0x03), then it will only be notified when one of these two occurs and will never be for Turn Left/Right.\r\n */\r\nexport class Observable {\r\n private _observers = new Array>();\r\n private _numObserversMarkedAsDeleted = 0;\r\n private _hasNotified = false;\r\n private _lastNotifiedValue?: T;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _eventState: EventState;\r\n\r\n private _onObserverAdded: Nullable<(observer: Observer) => void>;\r\n\r\n /**\r\n * Create an observable from a Promise.\r\n * @param promise a promise to observe for fulfillment.\r\n * @param onErrorObservable an observable to notify if a promise was rejected.\r\n * @returns the new Observable\r\n */\r\n public static FromPromise(promise: Promise, onErrorObservable?: Observable): Observable {\r\n const observable = new Observable();\r\n\r\n promise\r\n .then((ret: T) => {\r\n observable.notifyObservers(ret);\r\n })\r\n .catch((err) => {\r\n if (onErrorObservable) {\r\n onErrorObservable.notifyObservers(err as E);\r\n } else {\r\n throw err;\r\n }\r\n });\r\n\r\n return observable;\r\n }\r\n\r\n /**\r\n * Gets the list of observers\r\n * Note that observers that were recently deleted may still be present in the list because they are only really deleted on the next javascript tick!\r\n */\r\n public get observers(): Array> {\r\n return this._observers;\r\n }\r\n\r\n /**\r\n * Creates a new observable\r\n * @param onObserverAdded defines a callback to call when a new observer is added\r\n * @param notifyIfTriggered If set to true the observable will notify when an observer was added if the observable was already triggered.\r\n */\r\n constructor(\r\n onObserverAdded?: (observer: Observer) => void,\r\n /**\r\n * If set to true the observable will notify when an observer was added if the observable was already triggered.\r\n * This is helpful to single-state observables like the scene onReady or the dispose observable.\r\n */\r\n public notifyIfTriggered = false\r\n ) {\r\n this._eventState = new EventState(0);\r\n\r\n if (onObserverAdded) {\r\n this._onObserverAdded = onObserverAdded;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new Observer with the specified callback\r\n * @param callback the callback that will be executed for that Observer\r\n * @param mask the mask used to filter observers\r\n * @param insertFirst if true the callback will be inserted at the first position, hence executed before the others ones. If false (default behavior) the callback will be inserted at the last position, executed after all the others already present.\r\n * @param scope optional scope for the callback to be called from\r\n * @param unregisterOnFirstCall defines if the observer as to be unregistered after the next notification\r\n * @returns the new observer created for the callback\r\n */\r\n public add(callback?: null | undefined, mask?: number, insertFirst?: boolean, scope?: any, unregisterOnFirstCall?: boolean): null;\r\n public add(callback: (eventData: T, eventState: EventState) => void, mask?: number, insertFirst?: boolean, scope?: any, unregisterOnFirstCall?: boolean): Observer;\r\n public add(\r\n callback?: ((eventData: T, eventState: EventState) => void) | null | undefined,\r\n mask?: number,\r\n insertFirst?: boolean,\r\n scope?: any,\r\n unregisterOnFirstCall?: boolean\r\n ): Nullable>;\r\n public add(\r\n callback?: ((eventData: T, eventState: EventState) => void) | null | undefined,\r\n mask: number = -1,\r\n insertFirst = false,\r\n scope: any = null,\r\n unregisterOnFirstCall = false\r\n ): Nullable> {\r\n if (!callback) {\r\n return null;\r\n }\r\n\r\n const observer = new Observer(callback, mask, scope);\r\n observer.unregisterOnNextCall = unregisterOnFirstCall;\r\n\r\n if (insertFirst) {\r\n this._observers.unshift(observer);\r\n } else {\r\n this._observers.push(observer);\r\n }\r\n\r\n if (this._onObserverAdded) {\r\n this._onObserverAdded(observer);\r\n }\r\n\r\n // If the observable was already triggered and the observable is set to notify if triggered, notify the new observer\r\n if (this._hasNotified && this.notifyIfTriggered) {\r\n if (this._lastNotifiedValue !== undefined) {\r\n this.notifyObserver(observer, this._lastNotifiedValue);\r\n }\r\n }\r\n // attach the remove function to the observer\r\n observer._remove = () => {\r\n this.remove(observer);\r\n };\r\n\r\n return observer;\r\n }\r\n\r\n /**\r\n * Create a new Observer with the specified callback and unregisters after the next notification\r\n * @param callback the callback that will be executed for that Observer\r\n * @returns the new observer created for the callback\r\n */\r\n public addOnce(callback?: null | undefined): null;\r\n public addOnce(callback: (eventData: T, eventState: EventState) => void): Observer;\r\n public addOnce(callback?: ((eventData: T, eventState: EventState) => void) | null | undefined): Nullable>;\r\n public addOnce(callback?: ((eventData: T, eventState: EventState) => void) | null | undefined): Nullable> {\r\n return this.add(callback, undefined, undefined, undefined, true);\r\n }\r\n\r\n /**\r\n * Remove an Observer from the Observable object\r\n * @param observer the instance of the Observer to remove\r\n * @returns false if it doesn't belong to this Observable\r\n */\r\n public remove(observer: Nullable>): boolean {\r\n if (!observer) {\r\n return false;\r\n }\r\n\r\n observer._remove = null;\r\n const index = this._observers.indexOf(observer);\r\n\r\n if (index !== -1) {\r\n this._deferUnregister(observer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Remove a callback from the Observable object\r\n * @param callback the callback to remove\r\n * @param scope optional scope. If used only the callbacks with this scope will be removed\r\n * @returns false if it doesn't belong to this Observable\r\n */\r\n public removeCallback(callback: (eventData: T, eventState: EventState) => void, scope?: any): boolean {\r\n for (let index = 0; index < this._observers.length; index++) {\r\n const observer = this._observers[index];\r\n if (observer._willBeUnregistered) {\r\n continue;\r\n }\r\n if (observer.callback === callback && (!scope || scope === observer.scope)) {\r\n this._deferUnregister(observer);\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _deferUnregister(observer: Observer): void {\r\n if (observer._willBeUnregistered) {\r\n return;\r\n }\r\n this._numObserversMarkedAsDeleted++;\r\n observer.unregisterOnNextCall = false;\r\n observer._willBeUnregistered = true;\r\n setTimeout(() => {\r\n this._remove(observer);\r\n }, 0);\r\n }\r\n\r\n // This should only be called when not iterating over _observers to avoid callback skipping.\r\n // Removes an observer from the _observer Array.\r\n private _remove(observer: Nullable>, updateCounter = true): boolean {\r\n if (!observer) {\r\n return false;\r\n }\r\n\r\n const index = this._observers.indexOf(observer);\r\n\r\n if (index !== -1) {\r\n if (updateCounter) {\r\n this._numObserversMarkedAsDeleted--;\r\n }\r\n this._observers.splice(index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Moves the observable to the top of the observer list making it get called first when notified\r\n * @param observer the observer to move\r\n */\r\n public makeObserverTopPriority(observer: Observer) {\r\n this._remove(observer, false);\r\n this._observers.unshift(observer);\r\n }\r\n\r\n /**\r\n * Moves the observable to the bottom of the observer list making it get called last when notified\r\n * @param observer the observer to move\r\n */\r\n public makeObserverBottomPriority(observer: Observer) {\r\n this._remove(observer, false);\r\n this._observers.push(observer);\r\n }\r\n\r\n /**\r\n * Notify all Observers by calling their respective callback with the given data\r\n * Will return true if all observers were executed, false if an observer set skipNextObservers to true, then prevent the subsequent ones to execute\r\n * @param eventData defines the data to send to all observers\r\n * @param mask defines the mask of the current notification (observers with incompatible mask (ie mask & observer.mask === 0) will not be notified)\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n * @param userInfo defines any user info to send to observers\r\n * @returns false if the complete observer chain was not processed (because one observer set the skipNextObservers to true)\r\n */\r\n public notifyObservers(eventData: T, mask: number = -1, target?: any, currentTarget?: any, userInfo?: any): boolean {\r\n // this prevents potential memory leaks - if an object is disposed but the observable doesn't get cleared.\r\n if (this.notifyIfTriggered) {\r\n this._hasNotified = true;\r\n this._lastNotifiedValue = eventData;\r\n }\r\n if (!this._observers.length) {\r\n return true;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.target = target;\r\n state.currentTarget = currentTarget;\r\n state.skipNextObservers = false;\r\n state.lastReturnValue = eventData;\r\n state.userInfo = userInfo;\r\n\r\n for (const obs of this._observers) {\r\n if (obs._willBeUnregistered) {\r\n continue;\r\n }\r\n\r\n if (obs.mask & mask) {\r\n if (obs.unregisterOnNextCall) {\r\n this._deferUnregister(obs);\r\n }\r\n\r\n if (obs.scope) {\r\n state.lastReturnValue = obs.callback.apply(obs.scope, [eventData, state]);\r\n } else {\r\n state.lastReturnValue = obs.callback(eventData, state);\r\n }\r\n }\r\n if (state.skipNextObservers) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Notify a specific observer\r\n * @param observer defines the observer to notify\r\n * @param eventData defines the data to be sent to each callback\r\n * @param mask is used to filter observers defaults to -1\r\n */\r\n public notifyObserver(observer: Observer, eventData: T, mask: number = -1): void {\r\n // this prevents potential memory leaks - if an object is disposed but the observable doesn't get cleared.\r\n if (this.notifyIfTriggered) {\r\n this._hasNotified = true;\r\n this._lastNotifiedValue = eventData;\r\n }\r\n if (observer._willBeUnregistered) {\r\n return;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.skipNextObservers = false;\r\n\r\n if (observer.unregisterOnNextCall) {\r\n this._deferUnregister(observer);\r\n }\r\n\r\n observer.callback(eventData, state);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the observable has at least one observer\r\n * @returns true is the Observable has at least one Observer registered\r\n */\r\n public hasObservers(): boolean {\r\n return this._observers.length - this._numObserversMarkedAsDeleted > 0;\r\n }\r\n\r\n /**\r\n * Clear the list of observers\r\n */\r\n public clear(): void {\r\n while (this._observers.length) {\r\n const o = this._observers.pop();\r\n if (o) {\r\n o._remove = null;\r\n }\r\n }\r\n this._onObserverAdded = null;\r\n this._numObserversMarkedAsDeleted = 0;\r\n this.cleanLastNotifiedState();\r\n }\r\n\r\n /**\r\n * Clean the last notified state - both the internal last value and the has-notified flag\r\n */\r\n public cleanLastNotifiedState(): void {\r\n this._hasNotified = false;\r\n this._lastNotifiedValue = undefined;\r\n }\r\n\r\n /**\r\n * Clone the current observable\r\n * @returns a new observable\r\n */\r\n public clone(): Observable {\r\n const result = new Observable();\r\n\r\n result._observers = this._observers.slice(0);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Does this observable handles observer registered with a given mask\r\n * @param mask defines the mask to be tested\r\n * @returns whether or not one observer registered with the given mask is handled\r\n **/\r\n public hasSpecificMask(mask: number = -1): boolean {\r\n for (const obs of this._observers) {\r\n if (obs.mask & mask || obs.mask === mask) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n", "/**\r\n * Constant used to convert a value to gamma space\r\n * @ignorenaming\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const ToGammaSpace = 1 / 2.2;\r\n\r\n/**\r\n * Constant used to convert a value to linear space\r\n * @ignorenaming\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const ToLinearSpace = 2.2;\r\n\r\n/**\r\n * Constant Golden Ratio value in Babylon.js\r\n * @ignorenaming\r\n */\r\nexport const PHI = (1 + Math.sqrt(5)) / 2;\r\n\r\n/**\r\n * Constant used to define the minimal number value in Babylon.js\r\n * @ignorenaming\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst Epsilon = 0.001;\r\nexport { Epsilon };\r\n", "/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst _RegisteredTypes: { [key: string]: Object } = {};\r\n\r\n/**\r\n * @internal\r\n */\r\nexport function RegisterClass(className: string, type: Object) {\r\n _RegisteredTypes[className] = type;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport function GetClass(fqdn: string): any {\r\n return _RegisteredTypes[fqdn];\r\n}\r\n", "/** @internal */\r\nexport class PerformanceConfigurator {\r\n /** @internal */\r\n public static MatrixUse64Bits = false;\r\n /** @internal */\r\n public static MatrixTrackPrecisionChange = true;\r\n /** @internal */\r\n public static MatrixCurrentType: any = Float32Array;\r\n /** @internal */\r\n public static MatrixTrackedMatrices: Array | null = [];\r\n\r\n /**\r\n * @internal\r\n */\r\n public static SetMatrixPrecision(use64bits: boolean) {\r\n PerformanceConfigurator.MatrixTrackPrecisionChange = false;\r\n\r\n if (use64bits && !PerformanceConfigurator.MatrixUse64Bits) {\r\n if (PerformanceConfigurator.MatrixTrackedMatrices) {\r\n for (let m = 0; m < PerformanceConfigurator.MatrixTrackedMatrices.length; ++m) {\r\n const matrix = PerformanceConfigurator.MatrixTrackedMatrices[m];\r\n const values = matrix._m;\r\n\r\n matrix._m = new Array(16);\r\n\r\n for (let i = 0; i < 16; ++i) {\r\n matrix._m[i] = values[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n PerformanceConfigurator.MatrixUse64Bits = use64bits;\r\n PerformanceConfigurator.MatrixCurrentType = PerformanceConfigurator.MatrixUse64Bits ? Array : Float32Array;\r\n PerformanceConfigurator.MatrixTrackedMatrices = null; // reclaim some memory, as we don't need _TrackedMatrices anymore\r\n }\r\n}\r\n", "import { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\n\r\nimport type { Engine } from \"./engine\";\r\nimport type { Scene } from \"../scene\";\r\n\r\n/**\r\n * The engine store class is responsible to hold all the instances of Engine and Scene created\r\n * during the life time of the application.\r\n */\r\nexport class EngineStore {\r\n /** Gets the list of created engines */\r\n public static Instances: Engine[] = [];\r\n\r\n /**\r\n * Notifies when an engine was disposed.\r\n * Mainly used for static/cache cleanup\r\n */\r\n public static OnEnginesDisposedObservable = new Observable();\r\n\r\n /** @internal */\r\n public static _LastCreatedScene: Nullable = null;\r\n\r\n /**\r\n * Gets the latest created engine\r\n */\r\n public static get LastCreatedEngine(): Nullable {\r\n if (this.Instances.length === 0) {\r\n return null;\r\n }\r\n\r\n return this.Instances[this.Instances.length - 1];\r\n }\r\n\r\n /**\r\n * Gets the latest created scene\r\n */\r\n public static get LastCreatedScene(): Nullable {\r\n return this._LastCreatedScene;\r\n }\r\n\r\n /**\r\n * Gets or sets a global variable indicating if fallback texture must be used when a texture cannot be loaded\r\n * @ignorenaming\r\n */\r\n public static UseFallbackTexture = true;\r\n\r\n /**\r\n * Texture content used if a texture cannot loaded\r\n * @ignorenaming\r\n */\r\n public static FallbackTexture = \"\";\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n\r\nimport type { Nullable, Tuple } from \"../types\";\r\n\r\n/**\r\n * Class containing a set of static utilities functions for arrays.\r\n */\r\nexport class ArrayTools {\r\n /**\r\n * Returns an array of the given size filled with elements built from the given constructor and the parameters.\r\n * @param size the number of element to construct and put in the array.\r\n * @param itemBuilder a callback responsible for creating new instance of item. Called once per array entry.\r\n * @returns a new array filled with new objects.\r\n */\r\n public static BuildArray(size: number, itemBuilder: () => T): Array {\r\n const a: T[] = [];\r\n for (let i = 0; i < size; ++i) {\r\n a.push(itemBuilder());\r\n }\r\n return a;\r\n }\r\n\r\n /**\r\n * Returns a tuple of the given size filled with elements built from the given constructor and the parameters.\r\n * @param size he number of element to construct and put in the tuple.\r\n * @param itemBuilder a callback responsible for creating new instance of item. Called once per tuple entry.\r\n * @returns a new tuple filled with new objects.\r\n */\r\n public static BuildTuple(size: N, itemBuilder: () => T): Tuple {\r\n return ArrayTools.BuildArray(size, itemBuilder) as any;\r\n }\r\n}\r\n\r\n/**\r\n * Defines the callback type used when an observed array function is triggered.\r\n * @internal\r\n */\r\nexport type _ObserveCallback = (functionName: string, previousLength: number) => void;\r\n\r\n/**\r\n * Observes a function and calls the given callback when it is called.\r\n * @param object Defines the object the function to observe belongs to.\r\n * @param functionName Defines the name of the function to observe.\r\n * @param callback Defines the callback to call when the function is called.\r\n * @returns A function to call to stop observing\r\n */\r\nfunction _observeArrayfunction(object: { [key: string]: any }, functionName: string, callback: _ObserveCallback): Nullable<() => void> {\r\n // Finds the function to observe\r\n const oldFunction = object[functionName];\r\n if (typeof oldFunction !== \"function\") {\r\n return null;\r\n }\r\n\r\n // Creates a new function that calls the callback and the old function\r\n const newFunction = function () {\r\n const previousLength = object.length;\r\n const returnValue = newFunction.previous.apply(object, arguments);\r\n callback(functionName, previousLength);\r\n return returnValue;\r\n } as any;\r\n\r\n // Doublishly links the new function and the old function\r\n oldFunction.next = newFunction;\r\n newFunction.previous = oldFunction;\r\n\r\n // Replaces the old function with the new function\r\n object[functionName] = newFunction;\r\n\r\n // Returns a function to disable the hook\r\n return () => {\r\n // Only unhook if the function is still hooked\r\n const previous = newFunction.previous;\r\n if (!previous) {\r\n return;\r\n }\r\n\r\n // Finds the ref to the next function in the chain\r\n const next = newFunction.next;\r\n\r\n // If in the middle of the chain, link the previous and next functions\r\n if (next) {\r\n previous.next = next;\r\n next.previous = previous;\r\n }\r\n // If at the end of the chain, remove the reference to the previous function\r\n // and restore the previous function\r\n else {\r\n previous.next = undefined;\r\n object[functionName] = previous;\r\n }\r\n\r\n // Lose reference to the previous and next functions\r\n newFunction.next = undefined;\r\n newFunction.previous = undefined;\r\n };\r\n}\r\n\r\n/**\r\n * Defines the list of functions to proxy when observing an array.\r\n * The scope is currently reduced to the common functions used in the render target render list and the scene cameras.\r\n */\r\nconst observedArrayFunctions = [\"push\", \"splice\", \"pop\", \"shift\", \"unshift\"];\r\n\r\n/**\r\n * Observes an array and notifies the given observer when the array is modified.\r\n * @param array Defines the array to observe\r\n * @param callback Defines the function to call when the array is modified (in the limit of the observed array functions)\r\n * @returns A function to call to stop observing the array\r\n * @internal\r\n */\r\nexport function _ObserveArray(array: T[], callback: _ObserveCallback) {\r\n // Observes all the required array functions and stores the unhook functions\r\n const unObserveFunctions = observedArrayFunctions.map((name) => {\r\n return _observeArrayfunction(array, name, callback);\r\n });\r\n\r\n // Returns a function that unhook all the observed functions\r\n return () => {\r\n unObserveFunctions.forEach((unObserveFunction) => {\r\n unObserveFunction?.();\r\n });\r\n };\r\n}\r\n", "/**\r\n * Extract int value\r\n * @param value number value\r\n * @returns int value\r\n */\r\nexport function ExtractAsInt(value: number) {\r\n return parseInt(value.toString().replace(/\\W/g, \"\"));\r\n}\r\n\r\n/**\r\n * Boolean : true if the absolute difference between a and b is lower than epsilon (default = 1.401298E-45)\r\n * @param a number\r\n * @param b number\r\n * @param epsilon (default = 1.401298E-45)\r\n * @returns true if the absolute difference between a and b is lower than epsilon (default = 1.401298E-45)\r\n */\r\nexport function WithinEpsilon(a: number, b: number, epsilon: number = 1.401298e-45): boolean {\r\n return Math.abs(a - b) <= epsilon;\r\n}\r\n\r\n/**\r\n * Returns a random float number between and min and max values\r\n * @param min min value of random\r\n * @param max max value of random\r\n * @returns random value\r\n */\r\nexport function RandomRange(min: number, max: number): number {\r\n if (min === max) {\r\n return min;\r\n }\r\n return Math.random() * (max - min) + min;\r\n}\r\n\r\n/**\r\n * Creates a new scalar with values linearly interpolated of \"amount\" between the start scalar and the end scalar.\r\n * @param start start value\r\n * @param end target value\r\n * @param amount amount to lerp between\r\n * @returns the lerped value\r\n */\r\nexport function Lerp(start: number, end: number, amount: number): number {\r\n return start + (end - start) * amount;\r\n}\r\n\r\n/**\r\n * Returns the value itself if it's between min and max.\r\n * Returns min if the value is lower than min.\r\n * Returns max if the value is greater than max.\r\n * @param value the value to clmap\r\n * @param min the min value to clamp to (default: 0)\r\n * @param max the max value to clamp to (default: 1)\r\n * @returns the clamped value\r\n */\r\nexport function Clamp(value: number, min = 0, max = 1): number {\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n\r\n/**\r\n * Returns the angle converted to equivalent value between -Math.PI and Math.PI radians.\r\n * @param angle The angle to normalize in radian.\r\n * @returns The converted angle.\r\n */\r\nexport function NormalizeRadians(angle: number): number {\r\n // More precise but slower version kept for reference.\r\n // angle = angle % Tools.TwoPi;\r\n // angle = (angle + Tools.TwoPi) % Tools.TwoPi;\r\n\r\n //if (angle > Math.PI) {\r\n //\tangle -= Tools.TwoPi;\r\n //}\r\n\r\n angle -= Math.PI * 2 * Math.floor((angle + Math.PI) / (Math.PI * 2));\r\n\r\n return angle;\r\n}\r\n\r\n/**\r\n * Returns a string : the upper case translation of the number i to hexadecimal.\r\n * @param i number\r\n * @returns the upper case translation of the number i to hexadecimal.\r\n */\r\nexport function ToHex(i: number): string {\r\n const str = i.toString(16);\r\n\r\n if (i <= 15) {\r\n return (\"0\" + str).toUpperCase();\r\n }\r\n\r\n return str.toUpperCase();\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Epsilon } from \"./math.constants\";\r\nimport type { Viewport } from \"./math.viewport\";\r\nimport type { DeepImmutable, Nullable, FloatArray, float, Constructor, Tuple } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport type { Plane } from \"./math.plane\";\r\nimport { PerformanceConfigurator } from \"../Engines/performanceConfigurator\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { Dimension, Tensor, TensorStatic } from \"./tensor\";\r\nimport type { IVector2Like, IVector3Like, IVector4Like, IQuaternionLike, IMatrixLike, IPlaneLike } from \"./math.like\";\r\nimport { Clamp, Lerp, NormalizeRadians, RandomRange, WithinEpsilon } from \"./math.scalar.functions\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst _ExtractAsInt = (value: number) => {\r\n return parseInt(value.toString().replace(/\\W/g, \"\"));\r\n};\r\n\r\n/**\r\n * Represents a vector of any dimension\r\n */\r\nexport interface Vector extends Tensor {\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n readonly dimension: Readonly>;\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n readonly rank: 1;\r\n\r\n /**\r\n * Gets the length of the vector\r\n * @returns the vector length (float)\r\n */\r\n length(): number;\r\n\r\n /**\r\n * Gets the vector squared length\r\n * @returns the vector squared length (float)\r\n */\r\n lengthSquared(): number;\r\n\r\n /**\r\n * Normalize the vector\r\n * @returns the current updated Vector\r\n */\r\n normalize(): this;\r\n\r\n /**\r\n * Normalize the current Vector with the given input length.\r\n * Please note that this is an in place operation.\r\n * @param len the length of the vector\r\n * @returns the current updated Vector\r\n */\r\n normalizeFromLength(len: number): this;\r\n\r\n /**\r\n * Normalize the current Vector to a new vector\r\n * @returns the new Vector\r\n */\r\n normalizeToNew(): this;\r\n\r\n /**\r\n * Normalize the current Vector to the reference\r\n * @param reference define the Vector to update\r\n * @returns the updated Vector\r\n */\r\n normalizeToRef(reference: this): this;\r\n}\r\n\r\n/**\r\n * Static side of Vector\r\n */\r\nexport interface VectorStatic extends TensorStatic {\r\n /**\r\n * Checks if a given vector is inside a specific range\r\n * @param v defines the vector to test\r\n * @param min defines the minimum range\r\n * @param max defines the maximum range\r\n */\r\n CheckExtends(v: T, min: T, max: T): void;\r\n\r\n /**\r\n * Returns a new Vector equal to the normalized given vector\r\n * @param vector defines the vector to normalize\r\n * @returns a new Vector\r\n */\r\n Normalize(vector: DeepImmutable): T;\r\n\r\n /**\r\n * Normalize a given vector into a second one\r\n * @param vector defines the vector to normalize\r\n * @param result defines the vector where to store the result\r\n * @returns result input\r\n */\r\n NormalizeToRef(vector: DeepImmutable, result: T): T;\r\n}\r\n\r\n/**\r\n * Class representing a vector containing 2 coordinates\r\n * Example Playground - Overview - https://playground.babylonjs.com/#QYBWV4#9\r\n */\r\nexport class Vector2 implements Vector>, IVector2Like {\r\n private static _ZeroReadOnly = Vector2.Zero() as DeepImmutable;\r\n\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: Readonly<[2]>;\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 1;\r\n\r\n /**\r\n * Creates a new Vector2 from the given x and y coordinates\r\n * @param x defines the first coordinate\r\n * @param y defines the second coordinate\r\n */\r\n constructor(\r\n /** defines the first coordinate */\r\n public x: number = 0,\r\n /** defines the second coordinate */\r\n public y: number = 0\r\n ) {}\r\n\r\n /**\r\n * Gets a string with the Vector2 coordinates\r\n * @returns a string with the Vector2 coordinates\r\n */\r\n public toString(): string {\r\n return `{X: ${this.x} Y: ${this.y}}`;\r\n }\r\n\r\n /**\r\n * Gets class name\r\n * @returns the string \"Vector2\"\r\n */\r\n public getClassName(): string {\r\n return \"Vector2\";\r\n }\r\n\r\n /**\r\n * Gets current vector hash code\r\n * @returns the Vector2 hash code as a number\r\n */\r\n public getHashCode(): number {\r\n const x = _ExtractAsInt(this.x);\r\n const y = _ExtractAsInt(this.y);\r\n let hash = x;\r\n hash = (hash * 397) ^ y;\r\n return hash;\r\n }\r\n\r\n // Operators\r\n\r\n /**\r\n * Sets the Vector2 coordinates in the given array or Float32Array from the given index.\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#15\r\n * @param array defines the source array\r\n * @param index defines the offset in source array\r\n * @returns the current Vector2\r\n */\r\n public toArray(array: FloatArray, index: number = 0): this {\r\n array[index] = this.x;\r\n array[index + 1] = this.y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Update the current vector from an array\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#39\r\n * @param array defines the destination array\r\n * @param offset defines the offset in the destination array\r\n * @returns the current Vector2\r\n */\r\n public fromArray(array: FloatArray, offset: number = 0): this {\r\n Vector2.FromArrayToRef(array, offset, this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Copy the current vector to an array\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#40\r\n * @returns a new array with 2 elements: the Vector2 coordinates.\r\n */\r\n public asArray(): [number, number] {\r\n return [this.x, this.y];\r\n }\r\n\r\n /**\r\n * Sets the Vector2 coordinates with the given Vector2 coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#24\r\n * @param source defines the source Vector2\r\n * @returns the current updated Vector2\r\n */\r\n public copyFrom(source: DeepImmutable): this {\r\n this.x = source.x;\r\n this.y = source.y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the Vector2 coordinates with the given floats\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#25\r\n * @param x defines the first coordinate\r\n * @param y defines the second coordinate\r\n * @returns the current updated Vector2\r\n */\r\n public copyFromFloats(x: number, y: number): this {\r\n this.x = x;\r\n this.y = y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the Vector2 coordinates with the given floats\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#62\r\n * @param x defines the first coordinate\r\n * @param y defines the second coordinate\r\n * @returns the current updated Vector2\r\n */\r\n public set(x: number, y: number): this {\r\n return this.copyFromFloats(x, y);\r\n }\r\n\r\n /**\r\n * Copies the given float to the current Vector2 coordinates\r\n * @param v defines the x and y coordinates of the operand\r\n * @returns the current updated Vector2\r\n */\r\n public setAll(v: number): this {\r\n return this.copyFromFloats(v, v);\r\n }\r\n\r\n /**\r\n * Add another vector with the current one\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#11\r\n * @param otherVector defines the other vector\r\n * @returns a new Vector2 set with the addition of the current Vector2 and the given one coordinates\r\n */\r\n public add(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x + otherVector.x, this.y + otherVector.y);\r\n }\r\n\r\n /**\r\n * Sets the \"result\" coordinates with the addition of the current Vector2 and the given one coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#12\r\n * @param otherVector defines the other vector\r\n * @param result defines the target vector\r\n * @returns result input\r\n */\r\n public addToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x + otherVector.x;\r\n result.y = this.y + otherVector.y;\r\n return result;\r\n }\r\n\r\n /**\r\n * Set the Vector2 coordinates by adding the given Vector2 coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#13\r\n * @param otherVector defines the other vector\r\n * @returns the current updated Vector2\r\n */\r\n public addInPlace(otherVector: DeepImmutable): this {\r\n this.x += otherVector.x;\r\n this.y += otherVector.y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the given coordinates to the current Vector2\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @returns the current updated Vector2\r\n */\r\n public addInPlaceFromFloats(x: number, y: number): this {\r\n this.x += x;\r\n this.y += y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 by adding the current Vector2 coordinates to the given Vector3 x, y coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#14\r\n * @param otherVector defines the other vector\r\n * @returns a new Vector2\r\n */\r\n public addVector3(otherVector: Vector3): this {\r\n return new (this.constructor as Constructor)(this.x + otherVector.x, this.y + otherVector.y);\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 set with the subtracted coordinates of the given one from the current Vector2\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#61\r\n * @param otherVector defines the other vector\r\n * @returns a new Vector2\r\n */\r\n public subtract(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x - otherVector.x, this.y - otherVector.y);\r\n }\r\n\r\n /**\r\n * Sets the \"result\" coordinates with the subtraction of the given one from the current Vector2 coordinates.\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#63\r\n * @param otherVector defines the other vector\r\n * @param result defines the target vector\r\n * @returns result input\r\n */\r\n public subtractToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x - otherVector.x;\r\n result.y = this.y - otherVector.y;\r\n return result;\r\n }\r\n /**\r\n * Sets the current Vector2 coordinates by subtracting from it the given one coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#88\r\n * @param otherVector defines the other vector\r\n * @returns the current updated Vector2\r\n */\r\n public subtractInPlace(otherVector: DeepImmutable): this {\r\n this.x -= otherVector.x;\r\n this.y -= otherVector.y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiplies in place the current Vector2 coordinates by the given ones\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#43\r\n * @param otherVector defines the other vector\r\n * @returns the current updated Vector2\r\n */\r\n public multiplyInPlace(otherVector: DeepImmutable): this {\r\n this.x *= otherVector.x;\r\n this.y *= otherVector.y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 set with the multiplication of the current Vector2 and the given one coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#42\r\n * @param otherVector defines the other vector\r\n * @returns a new Vector2\r\n */\r\n public multiply(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x * otherVector.x, this.y * otherVector.y);\r\n }\r\n\r\n /**\r\n * Sets \"result\" coordinates with the multiplication of the current Vector2 and the given one coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#44\r\n * @param otherVector defines the other vector\r\n * @param result defines the target vector\r\n * @returns result input\r\n */\r\n public multiplyToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x * otherVector.x;\r\n result.y = this.y * otherVector.y;\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 set with the Vector2 coordinates multiplied by the given floats\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#89\r\n * @param x defines the first coordinate\r\n * @param y defines the second coordinate\r\n * @returns a new Vector2\r\n */\r\n public multiplyByFloats(x: number, y: number): this {\r\n return new (this.constructor as Constructor)(this.x * x, this.y * y);\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 set with the Vector2 coordinates divided by the given one coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#27\r\n * @param otherVector defines the other vector\r\n * @returns a new Vector2\r\n */\r\n public divide(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x / otherVector.x, this.y / otherVector.y);\r\n }\r\n\r\n /**\r\n * Sets the \"result\" coordinates with the Vector2 divided by the given one coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#30\r\n * @param otherVector defines the other vector\r\n * @param result defines the target vector\r\n * @returns result input\r\n */\r\n public divideToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x / otherVector.x;\r\n result.y = this.y / otherVector.y;\r\n return result;\r\n }\r\n\r\n /**\r\n * Divides the current Vector2 coordinates by the given ones\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#28\r\n * @param otherVector defines the other vector\r\n * @returns the current updated Vector2\r\n */\r\n public divideInPlace(otherVector: DeepImmutable): this {\r\n this.x = this.x / otherVector.x;\r\n this.y = this.y / otherVector.y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Vector2 with the minimal coordinate values between its and the given vector ones\r\n * @param other defines the second operand\r\n * @returns the current updated Vector2\r\n */\r\n public minimizeInPlace(other: DeepImmutable): this {\r\n return this.minimizeInPlaceFromFloats(other.x, other.y);\r\n }\r\n\r\n /**\r\n * Updates the current Vector2 with the maximal coordinate values between its and the given vector ones.\r\n * @param other defines the second operand\r\n * @returns the current updated Vector2\r\n */\r\n public maximizeInPlace(other: DeepImmutable): this {\r\n return this.maximizeInPlaceFromFloats(other.x, other.y);\r\n }\r\n\r\n /**\r\n * Updates the current Vector2 with the minimal coordinate values between its and the given coordinates\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @returns the current updated Vector2\r\n */\r\n public minimizeInPlaceFromFloats(x: number, y: number): this {\r\n this.x = Math.min(x, this.x);\r\n this.y = Math.min(y, this.y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Vector2 with the maximal coordinate values between its and the given coordinates.\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @returns the current updated Vector2\r\n */\r\n public maximizeInPlaceFromFloats(x: number, y: number): this {\r\n this.x = Math.max(x, this.x);\r\n this.y = Math.max(y, this.y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 set with the subtraction of the given floats from the current Vector2 coordinates\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @returns the resulting Vector2\r\n */\r\n public subtractFromFloats(x: number, y: number): this {\r\n return new (this.constructor as Constructor)(this.x - x, this.y - y);\r\n }\r\n\r\n /**\r\n * Subtracts the given floats from the current Vector2 coordinates and set the given vector \"result\" with this result\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param result defines the Vector2 object where to store the result\r\n * @returns the result\r\n */\r\n public subtractFromFloatsToRef(x: number, y: number, result: T): T {\r\n return result.copyFromFloats(this.x - x, this.y - y);\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 with current Vector2 negated coordinates\r\n * @returns a new Vector2\r\n */\r\n public negate(): this {\r\n return new (this.constructor as Constructor)(-this.x, -this.y);\r\n }\r\n\r\n /**\r\n * Negate this vector in place\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#23\r\n * @returns this\r\n */\r\n public negateInPlace(): this {\r\n this.x *= -1;\r\n this.y *= -1;\r\n return this;\r\n }\r\n\r\n /**\r\n * Negate the current Vector2 and stores the result in the given vector \"result\" coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#41\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public negateToRef(result: T): T {\r\n return result.copyFromFloats(this.x * -1, this.y * -1);\r\n }\r\n\r\n /**\r\n * Multiply the Vector2 coordinates by\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#59\r\n * @param scale defines the scaling factor\r\n * @returns the current updated Vector2\r\n */\r\n public scaleInPlace(scale: number): this {\r\n this.x *= scale;\r\n this.y *= scale;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 scaled by \"scale\" from the current Vector2\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#52\r\n * @param scale defines the scaling factor\r\n * @returns a new Vector2\r\n */\r\n public scale(scale: number): this {\r\n return new (this.constructor as Constructor)(this.x * scale, this.y * scale);\r\n }\r\n\r\n /**\r\n * Scale the current Vector2 values by a factor to a given Vector2\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#57\r\n * @param scale defines the scale factor\r\n * @param result defines the Vector2 object where to store the result\r\n * @returns result input\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n result.x = this.x * scale;\r\n result.y = this.y * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Scale the current Vector2 values by a factor and add the result to a given Vector2\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#58\r\n * @param scale defines the scale factor\r\n * @param result defines the Vector2 object where to store the result\r\n * @returns result input\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n result.x += this.x * scale;\r\n result.y += this.y * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a boolean if two vectors are equals\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#31\r\n * @param otherVector defines the other vector\r\n * @returns true if the given vector coordinates strictly equal the current Vector2 ones\r\n */\r\n public equals(otherVector: DeepImmutable): boolean {\r\n return otherVector && this.x === otherVector.x && this.y === otherVector.y;\r\n }\r\n\r\n /**\r\n * Gets a boolean if two vectors are equals (using an epsilon value)\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#32\r\n * @param otherVector defines the other vector\r\n * @param epsilon defines the minimal distance to consider equality\r\n * @returns true if the given vector coordinates are close to the current ones by a distance of epsilon.\r\n */\r\n public equalsWithEpsilon(otherVector: DeepImmutable, epsilon: number = Epsilon): boolean {\r\n return otherVector && WithinEpsilon(this.x, otherVector.x, epsilon) && WithinEpsilon(this.y, otherVector.y, epsilon);\r\n }\r\n\r\n /**\r\n * Returns true if the current Vector2 coordinates equals the given floats\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @returns true if both vectors are equal\r\n */\r\n public equalsToFloats(x: number, y: number): boolean {\r\n return this.x === x && this.y === y;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 from current Vector2 floored values\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#35\r\n * eg (1.2, 2.31) returns (1, 2)\r\n * @returns a new Vector2\r\n */\r\n public floor(): this {\r\n return new (this.constructor as Constructor)(Math.floor(this.x), Math.floor(this.y));\r\n }\r\n\r\n /**\r\n * Gets the current Vector2's floored values and stores them in result\r\n * @param result the Vector2 to store the result in\r\n * @returns the result Vector2\r\n */\r\n public floorToRef(result: T): T {\r\n result.x = Math.floor(this.x);\r\n result.y = Math.floor(this.y);\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 from current Vector2 fractional values\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#34\r\n * eg (1.2, 2.31) returns (0.2, 0.31)\r\n * @returns a new Vector2\r\n */\r\n public fract(): this {\r\n return new (this.constructor as Constructor)(this.x - Math.floor(this.x), this.y - Math.floor(this.y));\r\n }\r\n\r\n /**\r\n * Gets the current Vector2's fractional values and stores them in result\r\n * @param result the Vector2 to store the result in\r\n * @returns the result Vector2\r\n */\r\n public fractToRef(result: T): T {\r\n result.x = this.x - Math.floor(this.x);\r\n result.y = this.y - Math.floor(this.y);\r\n return result;\r\n }\r\n\r\n /**\r\n * Rotate the current vector into a given result vector\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#49\r\n * @param angle defines the rotation angle\r\n * @param result defines the result vector where to store the rotated vector\r\n * @returns result input\r\n */\r\n public rotateToRef(angle: number, result: T): T {\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n const x = cos * this.x - sin * this.y;\r\n const y = sin * this.x + cos * this.y;\r\n result.x = x;\r\n result.y = y;\r\n return result;\r\n }\r\n\r\n // Properties\r\n\r\n /**\r\n * Gets the length of the vector\r\n * @returns the vector length (float)\r\n */\r\n public length(): number {\r\n return Math.sqrt(this.x * this.x + this.y * this.y);\r\n }\r\n\r\n /**\r\n * Gets the vector squared length\r\n * @returns the vector squared length (float)\r\n */\r\n public lengthSquared(): number {\r\n return this.x * this.x + this.y * this.y;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Normalize the vector\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#48\r\n * @returns the current updated Vector2\r\n */\r\n public normalize(): this {\r\n return this.normalizeFromLength(this.length());\r\n }\r\n\r\n /**\r\n * Normalize the current Vector2 with the given input length.\r\n * Please note that this is an in place operation.\r\n * @param len the length of the vector\r\n * @returns the current updated Vector2\r\n */\r\n public normalizeFromLength(len: number): this {\r\n if (len === 0 || len === 1.0) {\r\n return this;\r\n }\r\n\r\n return this.scaleInPlace(1.0 / len);\r\n }\r\n\r\n /**\r\n * Normalize the current Vector2 to a new vector\r\n * @returns the new Vector2\r\n */\r\n public normalizeToNew(): this {\r\n const normalized = new (this.constructor as Constructor)();\r\n this.normalizeToRef(normalized);\r\n return normalized;\r\n }\r\n\r\n /**\r\n * Normalize the current Vector2 to the reference\r\n * @param reference define the Vector to update\r\n * @returns the updated Vector2\r\n */\r\n public normalizeToRef(reference: T): T {\r\n const len = this.length();\r\n if (len === 0) {\r\n return reference.copyFrom(this as DeepImmutable);\r\n }\r\n return this.scaleToRef(1.0 / len, reference);\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 copied from the Vector2\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#20\r\n * @returns a new Vector2\r\n */\r\n public clone(): this {\r\n return new (this.constructor as Constructor)(this.x, this.y);\r\n }\r\n\r\n /**\r\n * Gets the dot product of the current vector and the vector \"otherVector\"\r\n * @param otherVector defines second vector\r\n * @returns the dot product (float)\r\n */\r\n public dot(otherVector: DeepImmutable): number {\r\n return this.x * otherVector.x + this.y * otherVector.y;\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Gets a new Vector2(0, 0)\r\n * @returns a new Vector2\r\n */\r\n public static Zero(): Vector2 {\r\n return new Vector2(0, 0);\r\n }\r\n\r\n /**\r\n * Gets a new Vector2(1, 1)\r\n * @returns a new Vector2\r\n */\r\n public static One(): Vector2 {\r\n return new Vector2(1, 1);\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @returns a Vector2 with random values between min and max\r\n */\r\n public static Random(min: number = 0, max: number = 1): Vector2 {\r\n return new Vector2(RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Sets a Vector2 with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @param ref the ref to store the values in\r\n * @returns the ref with random values between min and max\r\n */\r\n public static RandomToRef(min: number = 0, max: number = 1, ref: T): T {\r\n return ref.copyFromFloats(RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Gets a zero Vector2 that must not be updated\r\n */\r\n public static get ZeroReadOnly(): DeepImmutable {\r\n return Vector2._ZeroReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 set from the given index element of the given array\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#79\r\n * @param array defines the data source\r\n * @param offset defines the offset in the data source\r\n * @returns a new Vector2\r\n */\r\n public static FromArray(array: DeepImmutable>, offset: number = 0): Vector2 {\r\n return new Vector2(array[offset], array[offset + 1]);\r\n }\r\n\r\n /**\r\n * Sets \"result\" from the given index element of the given array\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#80\r\n * @param array defines the data source\r\n * @param offset defines the offset in the data source\r\n * @param result defines the target vector\r\n * @returns result input\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number, result: T): T {\r\n result.x = array[offset];\r\n result.y = array[offset + 1];\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the given floats.\r\n * @param x defines the x coordinate of the source\r\n * @param y defines the y coordinate of the source\r\n * @param result defines the Vector2 where to store the result\r\n * @returns the result vector\r\n */\r\n public static FromFloatsToRef(x: number, y: number, result: T): T {\r\n result.copyFromFloats(x, y);\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 located for \"amount\" (float) on the CatmullRom spline defined by the given four Vector2\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#65\r\n * @param value1 defines 1st point of control\r\n * @param value2 defines 2nd point of control\r\n * @param value3 defines 3rd point of control\r\n * @param value4 defines 4th point of control\r\n * @param amount defines the interpolation factor\r\n * @returns a new Vector2\r\n */\r\n public static CatmullRom(\r\n value1: DeepImmutable,\r\n value2: DeepImmutable,\r\n value3: DeepImmutable,\r\n value4: DeepImmutable,\r\n amount: number\r\n ): T {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n\r\n const x =\r\n 0.5 *\r\n (2.0 * value2.x +\r\n (-value1.x + value3.x) * amount +\r\n (2.0 * value1.x - 5.0 * value2.x + 4.0 * value3.x - value4.x) * squared +\r\n (-value1.x + 3.0 * value2.x - 3.0 * value3.x + value4.x) * cubed);\r\n\r\n const y =\r\n 0.5 *\r\n (2.0 * value2.y +\r\n (-value1.y + value3.y) * amount +\r\n (2.0 * value1.y - 5.0 * value2.y + 4.0 * value3.y - value4.y) * squared +\r\n (-value1.y + 3.0 * value2.y - 3.0 * value3.y + value4.y) * cubed);\r\n\r\n return new (value1.constructor as Constructor)(x, y);\r\n }\r\n\r\n /**\r\n * Sets reference with same the coordinates than \"value\" ones if the vector \"value\" is in the square defined by \"min\" and \"max\".\r\n * If a coordinate of \"value\" is lower than \"min\" coordinates, the returned Vector2 is given this \"min\" coordinate.\r\n * If a coordinate of \"value\" is greater than \"max\" coordinates, the returned Vector2 is given this \"max\" coordinate\r\n * @param value defines the value to clamp\r\n * @param min defines the lower limit\r\n * @param max defines the upper limit\r\n * @param ref the reference\r\n * @returns the reference\r\n */\r\n public static ClampToRef(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable, ref: T): T {\r\n ref.x = Clamp(value.x, min.x, max.x);\r\n ref.y = Clamp(value.y, min.y, max.y);\r\n return ref;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 set with same the coordinates than \"value\" ones if the vector \"value\" is in the square defined by \"min\" and \"max\".\r\n * If a coordinate of \"value\" is lower than \"min\" coordinates, the returned Vector2 is given this \"min\" coordinate.\r\n * If a coordinate of \"value\" is greater than \"max\" coordinates, the returned Vector2 is given this \"max\" coordinate\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#76\r\n * @param value defines the value to clamp\r\n * @param min defines the lower limit\r\n * @param max defines the upper limit\r\n * @returns a new Vector2\r\n */\r\n public static Clamp(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable): T {\r\n const x = Clamp(value.x, min.x, max.x);\r\n const y = Clamp(value.y, min.y, max.y);\r\n return new (value.constructor as Constructor)(x, y);\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 located for \"amount\" (float) on the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\"\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#81\r\n * @param value1 defines the 1st control point\r\n * @param tangent1 defines the outgoing tangent\r\n * @param value2 defines the 2nd control point\r\n * @param tangent2 defines the incoming tangent\r\n * @param amount defines the interpolation factor\r\n * @returns a new Vector2\r\n */\r\n public static Hermite(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n amount: number\r\n ): T {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n const part1 = 2.0 * cubed - 3.0 * squared + 1.0;\r\n const part2 = -2.0 * cubed + 3.0 * squared;\r\n const part3 = cubed - 2.0 * squared + amount;\r\n const part4 = cubed - squared;\r\n\r\n const x = value1.x * part1 + value2.x * part2 + tangent1.x * part3 + tangent2.x * part4;\r\n const y = value1.y * part1 + value2.y * part2 + tangent1.y * part3 + tangent2.y * part4;\r\n\r\n return new (value1.constructor as Constructor)(x, y);\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 which is the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#82\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @returns 1st derivative\r\n */\r\n public static Hermite1stDerivative(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number\r\n ): T {\r\n const result = new (value1.constructor as Constructor)();\r\n\r\n this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 which is the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#83\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @param result define where the derivative will be stored\r\n * @returns result input\r\n */\r\n public static Hermite1stDerivativeToRef(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number,\r\n result: T\r\n ): T {\r\n const t2 = time * time;\r\n\r\n result.x = (t2 - time) * 6 * value1.x + (3 * t2 - 4 * time + 1) * tangent1.x + (-t2 + time) * 6 * value2.x + (3 * t2 - 2 * time) * tangent2.x;\r\n result.y = (t2 - time) * 6 * value1.y + (3 * t2 - 4 * time + 1) * tangent1.y + (-t2 + time) * 6 * value2.y + (3 * t2 - 2 * time) * tangent2.y;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 located for \"amount\" (float) on the linear interpolation between the vector \"start\" adn the vector \"end\".\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#84\r\n * @param start defines the start vector\r\n * @param end defines the end vector\r\n * @param amount defines the interpolation factor\r\n * @returns a new Vector2\r\n */\r\n public static Lerp(start: DeepImmutable, end: DeepImmutable, amount: number): Vector2 {\r\n const x = start.x + (end.x - start.x) * amount;\r\n const y = start.y + (end.y - start.y) * amount;\r\n return new (start.constructor as Constructor)(x, y);\r\n }\r\n\r\n /**\r\n * Gets the dot product of the vector \"left\" and the vector \"right\"\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#90\r\n * @param left defines first vector\r\n * @param right defines second vector\r\n * @returns the dot product (float)\r\n */\r\n public static Dot(left: DeepImmutable, right: DeepImmutable): number {\r\n return left.x * right.x + left.y * right.y;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 equal to the normalized given vector\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#46\r\n * @param vector defines the vector to normalize\r\n * @returns a new Vector2\r\n */\r\n public static Normalize(vector: DeepImmutable): T {\r\n const result = new (vector.constructor as Constructor)();\r\n Vector2.NormalizeToRef(vector, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Normalize a given vector into a second one\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#50\r\n * @param vector defines the vector to normalize\r\n * @param result defines the vector where to store the result\r\n * @returns result input\r\n */\r\n public static NormalizeToRef(vector: DeepImmutable, result: T): T {\r\n vector.normalizeToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 set with the minimal coordinate values from the \"left\" and \"right\" vectors\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#86\r\n * @param left defines 1st vector\r\n * @param right defines 2nd vector\r\n * @returns a new Vector2\r\n */\r\n public static Minimize(left: DeepImmutable, right: DeepImmutable): T {\r\n const x = left.x < right.x ? left.x : right.x;\r\n const y = left.y < right.y ? left.y : right.y;\r\n return new (left.constructor as Constructor)(x, y);\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 set with the maximal coordinate values from the \"left\" and \"right\" vectors\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#86\r\n * @param left defines 1st vector\r\n * @param right defines 2nd vector\r\n * @returns a new Vector2\r\n */\r\n public static Maximize(left: DeepImmutable, right: DeepImmutable): T {\r\n const x = left.x > right.x ? left.x : right.x;\r\n const y = left.y > right.y ? left.y : right.y;\r\n return new (left.constructor as Constructor)(x, y);\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 set with the transformed coordinates of the given vector by the given transformation matrix\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#17\r\n * @param vector defines the vector to transform\r\n * @param transformation defines the matrix to apply\r\n * @returns a new Vector2\r\n */\r\n public static Transform(vector: DeepImmutable, transformation: DeepImmutable): T {\r\n const result = new (vector.constructor as Constructor)();\r\n Vector2.TransformToRef(vector, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Transforms the given vector coordinates by the given transformation matrix and stores the result in the vector \"result\" coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#19\r\n * @param vector defines the vector to transform\r\n * @param transformation defines the matrix to apply\r\n * @param result defines the target vector\r\n * @returns result input\r\n */\r\n public static TransformToRef(vector: DeepImmutable, transformation: DeepImmutable, result: T): T {\r\n const m = transformation.m;\r\n const x = vector.x * m[0] + vector.y * m[4] + m[12];\r\n const y = vector.x * m[1] + vector.y * m[5] + m[13];\r\n result.x = x;\r\n result.y = y;\r\n return result;\r\n }\r\n\r\n /**\r\n * Determines if a given vector is included in a triangle\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#87\r\n * @param p defines the vector to test\r\n * @param p0 defines 1st triangle point\r\n * @param p1 defines 2nd triangle point\r\n * @param p2 defines 3rd triangle point\r\n * @returns true if the point \"p\" is in the triangle defined by the vectors \"p0\", \"p1\", \"p2\"\r\n */\r\n public static PointInTriangle(p: DeepImmutable, p0: DeepImmutable, p1: DeepImmutable, p2: DeepImmutable): boolean {\r\n const a = (1 / 2) * (-p1.y * p2.x + p0.y * (-p1.x + p2.x) + p0.x * (p1.y - p2.y) + p1.x * p2.y);\r\n const sign = a < 0 ? -1 : 1;\r\n const s = (p0.y * p2.x - p0.x * p2.y + (p2.y - p0.y) * p.x + (p0.x - p2.x) * p.y) * sign;\r\n const t = (p0.x * p1.y - p0.y * p1.x + (p0.y - p1.y) * p.x + (p1.x - p0.x) * p.y) * sign;\r\n\r\n return s > 0 && t > 0 && s + t < 2 * a * sign;\r\n }\r\n\r\n /**\r\n * Gets the distance between the vectors \"value1\" and \"value2\"\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#71\r\n * @param value1 defines first vector\r\n * @param value2 defines second vector\r\n * @returns the distance between vectors\r\n */\r\n public static Distance(value1: DeepImmutable, value2: DeepImmutable): number {\r\n return Math.sqrt(Vector2.DistanceSquared(value1, value2));\r\n }\r\n\r\n /**\r\n * Returns the squared distance between the vectors \"value1\" and \"value2\"\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#72\r\n * @param value1 defines first vector\r\n * @param value2 defines second vector\r\n * @returns the squared distance between vectors\r\n */\r\n public static DistanceSquared(value1: DeepImmutable, value2: DeepImmutable): number {\r\n const x = value1.x - value2.x;\r\n const y = value1.y - value2.y;\r\n return x * x + y * y;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 located at the center of the vectors \"value1\" and \"value2\"\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#86\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#66\r\n * @param value1 defines first vector\r\n * @param value2 defines second vector\r\n * @returns a new Vector2\r\n */\r\n public static Center(value1: DeepImmutable, value2: DeepImmutable): T {\r\n const result = new (value1.constructor as Constructor)();\r\n return Vector2.CenterToRef(value1, value2, result);\r\n }\r\n\r\n /**\r\n * Gets the center of the vectors \"value1\" and \"value2\" and stores the result in the vector \"ref\"\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#66\r\n * @param value1 defines first vector\r\n * @param value2 defines second vector\r\n * @param ref defines third vector\r\n * @returns ref\r\n */\r\n public static CenterToRef(value1: DeepImmutable, value2: DeepImmutable, ref: T): T {\r\n return ref.copyFromFloats((value1.x + value2.x) / 2, (value1.y + value2.y) / 2);\r\n }\r\n\r\n /**\r\n * Gets the shortest distance (float) between the point \"p\" and the segment defined by the two points \"segA\" and \"segB\".\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#77\r\n * @param p defines the middle point\r\n * @param segA defines one point of the segment\r\n * @param segB defines the other point of the segment\r\n * @returns the shortest distance\r\n */\r\n public static DistanceOfPointFromSegment(p: DeepImmutable, segA: DeepImmutable, segB: DeepImmutable): number {\r\n const l2 = Vector2.DistanceSquared(segA, segB);\r\n if (l2 === 0.0) {\r\n return Vector2.Distance(p, segA);\r\n }\r\n const v = segB.subtract(segA);\r\n const t = Math.max(0, Math.min(1, Vector2.Dot(p.subtract(segA), v) / l2));\r\n const proj = segA.add(v.multiplyByFloats(t, t));\r\n return Vector2.Distance(p, proj);\r\n }\r\n}\r\nVector2 satisfies TensorStatic;\r\nObject.defineProperties(Vector2.prototype, {\r\n dimension: { value: [2] },\r\n rank: { value: 1 },\r\n});\r\n\r\n/**\r\n * Class used to store (x,y,z) vector representation\r\n * A Vector3 is the main object used in 3D geometry\r\n * It can represent either the coordinates of a point the space, either a direction\r\n * Reminder: js uses a left handed forward facing system\r\n * Example Playground - Overview - https://playground.babylonjs.com/#R1F8YU\r\n */\r\nexport class Vector3 implements Vector>, IVector3Like {\r\n private static _UpReadOnly = Vector3.Up() as DeepImmutable;\r\n private static _DownReadOnly = Vector3.Down() as DeepImmutable;\r\n private static _LeftHandedForwardReadOnly = Vector3.Forward(false) as DeepImmutable;\r\n private static _RightHandedForwardReadOnly = Vector3.Forward(true) as DeepImmutable;\r\n private static _LeftHandedBackwardReadOnly = Vector3.Backward(false) as DeepImmutable;\r\n private static _RightHandedBackwardReadOnly = Vector3.Backward(true) as DeepImmutable;\r\n private static _RightReadOnly = Vector3.Right() as DeepImmutable;\r\n private static _LeftReadOnly = Vector3.Left() as DeepImmutable;\r\n private static _ZeroReadOnly = Vector3.Zero() as DeepImmutable;\r\n private static _OneReadOnly = Vector3.One() as DeepImmutable;\r\n\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: Readonly<[3]>;\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 1;\r\n\r\n /** @internal */\r\n public _x: number;\r\n\r\n /** @internal */\r\n public _y: number;\r\n\r\n /** @internal */\r\n public _z: number;\r\n\r\n /** @internal */\r\n public _isDirty = true;\r\n\r\n /** Gets or sets the x coordinate */\r\n public get x() {\r\n return this._x;\r\n }\r\n\r\n public set x(value: number) {\r\n this._x = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /** Gets or sets the y coordinate */\r\n public get y() {\r\n return this._y;\r\n }\r\n\r\n public set y(value: number) {\r\n this._y = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /** Gets or sets the z coordinate */\r\n public get z() {\r\n return this._z;\r\n }\r\n\r\n public set z(value: number) {\r\n this._z = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Creates a new Vector3 object from the given x, y, z (floats) coordinates.\r\n * @param x defines the first coordinates (on X axis)\r\n * @param y defines the second coordinates (on Y axis)\r\n * @param z defines the third coordinates (on Z axis)\r\n */\r\n constructor(x: number = 0, y: number = 0, z: number = 0) {\r\n this._x = x;\r\n this._y = y;\r\n this._z = z;\r\n }\r\n\r\n /**\r\n * Creates a string representation of the Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#67\r\n * @returns a string with the Vector3 coordinates.\r\n */\r\n public toString(): string {\r\n return `{X: ${this._x} Y: ${this._y} Z: ${this._z}}`;\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns the string \"Vector3\"\r\n */\r\n public getClassName(): string {\r\n return \"Vector3\";\r\n }\r\n\r\n /**\r\n * Creates the Vector3 hash code\r\n * @returns a number which tends to be unique between Vector3 instances\r\n */\r\n public getHashCode(): number {\r\n const x = _ExtractAsInt(this._x);\r\n const y = _ExtractAsInt(this._y);\r\n const z = _ExtractAsInt(this._z);\r\n\r\n let hash = x;\r\n hash = (hash * 397) ^ y;\r\n hash = (hash * 397) ^ z;\r\n return hash;\r\n }\r\n\r\n // Operators\r\n\r\n /**\r\n * Creates an array containing three elements : the coordinates of the Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#10\r\n * @returns a new array of numbers\r\n */\r\n public asArray(): Tuple {\r\n return [this._x, this._y, this._z];\r\n }\r\n\r\n /**\r\n * Populates the given array or Float32Array from the given index with the successive coordinates of the Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#65\r\n * @param array defines the destination array\r\n * @param index defines the offset in the destination array\r\n * @returns the current Vector3\r\n */\r\n public toArray(array: FloatArray, index: number = 0): this {\r\n array[index] = this._x;\r\n array[index + 1] = this._y;\r\n array[index + 2] = this._z;\r\n return this;\r\n }\r\n\r\n /**\r\n * Update the current vector from an array\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#24\r\n * @param array defines the destination array\r\n * @param offset defines the offset in the destination array\r\n * @returns the current Vector3\r\n */\r\n public fromArray(array: DeepImmutable, offset: number = 0): this {\r\n Vector3.FromArrayToRef(array, offset, this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Converts the current Vector3 into a quaternion (considering that the Vector3 contains Euler angles representation of a rotation)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#66\r\n * @returns a new Quaternion object, computed from the Vector3 coordinates\r\n */\r\n public toQuaternion(): Quaternion {\r\n return Quaternion.RotationYawPitchRoll(this._y, this._x, this._z);\r\n }\r\n\r\n /**\r\n * Adds the given vector to the current Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#4\r\n * @param otherVector defines the second operand\r\n * @returns the current updated Vector3\r\n */\r\n public addInPlace(otherVector: DeepImmutable): this {\r\n this._x += otherVector._x;\r\n this._y += otherVector._y;\r\n this._z += otherVector._z;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the given coordinates to the current Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#5\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the current updated Vector3\r\n */\r\n public addInPlaceFromFloats(x: number, y: number, z: number): this {\r\n this._x += x;\r\n this._y += y;\r\n this._z += z;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets a new Vector3, result of the addition the current Vector3 and the given vector\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#3\r\n * @param otherVector defines the second operand\r\n * @returns the resulting Vector3\r\n */\r\n public add(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this._x + otherVector._x, this._y + otherVector._y, this._z + otherVector._z);\r\n }\r\n\r\n /**\r\n * Adds the current Vector3 to the given one and stores the result in the vector \"result\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#6\r\n * @param otherVector defines the second operand\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public addToRef(otherVector: DeepImmutable, result: T): T {\r\n return result.copyFromFloats(this._x + otherVector._x, this._y + otherVector._y, this._z + otherVector._z);\r\n }\r\n\r\n /**\r\n * Subtract the given vector from the current Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#61\r\n * @param otherVector defines the second operand\r\n * @returns the current updated Vector3\r\n */\r\n public subtractInPlace(otherVector: DeepImmutable): this {\r\n this._x -= otherVector._x;\r\n this._y -= otherVector._y;\r\n this._z -= otherVector._z;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3, result of the subtraction of the given vector from the current Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#60\r\n * @param otherVector defines the second operand\r\n * @returns the resulting Vector3\r\n */\r\n public subtract(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this._x - otherVector._x, this._y - otherVector._y, this._z - otherVector._z);\r\n }\r\n\r\n /**\r\n * Subtracts the given vector from the current Vector3 and stores the result in the vector \"result\".\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#63\r\n * @param otherVector defines the second operand\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public subtractToRef(otherVector: DeepImmutable, result: T): T {\r\n return this.subtractFromFloatsToRef(otherVector._x, otherVector._y, otherVector._z, result);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the subtraction of the given floats from the current Vector3 coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#62\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the resulting Vector3\r\n */\r\n public subtractFromFloats(x: number, y: number, z: number): this {\r\n return new (this.constructor as Constructor)(this._x - x, this._y - y, this._z - z);\r\n }\r\n\r\n /**\r\n * Subtracts the given floats from the current Vector3 coordinates and set the given vector \"result\" with this result\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#64\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public subtractFromFloatsToRef(x: number, y: number, z: number, result: T): T {\r\n return result.copyFromFloats(this._x - x, this._y - y, this._z - z);\r\n }\r\n\r\n /**\r\n * Gets a new Vector3 set with the current Vector3 negated coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#35\r\n * @returns a new Vector3\r\n */\r\n public negate(): this {\r\n return new (this.constructor as Constructor)(-this._x, -this._y, -this._z);\r\n }\r\n\r\n /**\r\n * Negate this vector in place\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#36\r\n * @returns this\r\n */\r\n public negateInPlace(): this {\r\n this._x *= -1;\r\n this._y *= -1;\r\n this._z *= -1;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Negate the current Vector3 and stores the result in the given vector \"result\" coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#37\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public negateToRef(result: T): T {\r\n return result.copyFromFloats(this._x * -1, this._y * -1, this._z * -1);\r\n }\r\n\r\n /**\r\n * Multiplies the Vector3 coordinates by the float \"scale\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#56\r\n * @param scale defines the multiplier factor\r\n * @returns the current updated Vector3\r\n */\r\n public scaleInPlace(scale: number): this {\r\n this._x *= scale;\r\n this._y *= scale;\r\n this._z *= scale;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the current Vector3 coordinates multiplied by the float \"scale\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#53\r\n * @param scale defines the multiplier factor\r\n * @returns a new Vector3\r\n */\r\n public scale(scale: number): this {\r\n return new (this.constructor as Constructor)(this._x * scale, this._y * scale, this._z * scale);\r\n }\r\n\r\n /**\r\n * Multiplies the current Vector3 coordinates by the float \"scale\" and stores the result in the given vector \"result\" coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#57\r\n * @param scale defines the multiplier factor\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n return result.copyFromFloats(this._x * scale, this._y * scale, this._z * scale);\r\n }\r\n\r\n /**\r\n * Creates a vector normal (perpendicular) to the current Vector3 and stores the result in the given vector\r\n * Out of the infinite possibilities the normal chosen is the one formed by rotating the current vector\r\n * 90 degrees about an axis which lies perpendicular to the current vector\r\n * and its projection on the xz plane. In the case of a current vector in the xz plane\r\n * the normal is calculated to be along the y axis.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#230\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#231\r\n * @param result defines the Vector3 object where to store the resultant normal\r\n * @returns the result\r\n */\r\n public getNormalToRef(result: Vector3): Vector3 {\r\n /**\r\n * Calculates the spherical coordinates of the current vector\r\n * so saves on memory rather than importing whole Spherical Class\r\n */\r\n const radius: number = this.length();\r\n let theta: number = Math.acos(this.y / radius);\r\n const phi = Math.atan2(this.z, this.x);\r\n //makes angle 90 degs to current vector\r\n if (theta > Math.PI / 2) {\r\n theta -= Math.PI / 2;\r\n } else {\r\n theta += Math.PI / 2;\r\n }\r\n //Calculates resutant normal vector from spherical coordinate of perpendicular vector\r\n const x = radius * Math.sin(theta) * Math.cos(phi);\r\n const y = radius * Math.cos(theta);\r\n const z = radius * Math.sin(theta) * Math.sin(phi);\r\n result.set(x, y, z);\r\n return result;\r\n }\r\n\r\n /**\r\n * Rotates the vector using the given unit quaternion and stores the new vector in result\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#9\r\n * @param q the unit quaternion representing the rotation\r\n * @param result the output vector\r\n * @returns the result\r\n */\r\n public applyRotationQuaternionToRef(q: Quaternion, result: T): T {\r\n // Derived from https://raw.org/proof/vector-rotation-using-quaternions/\r\n\r\n const vx = this._x,\r\n vy = this._y,\r\n vz = this._z;\r\n const qx = q._x,\r\n qy = q._y,\r\n qz = q._z,\r\n qw = q._w;\r\n\r\n // t = 2q x v\r\n const tx = 2 * (qy * vz - qz * vy);\r\n const ty = 2 * (qz * vx - qx * vz);\r\n const tz = 2 * (qx * vy - qy * vx);\r\n\r\n // v + w t + q x t\r\n result._x = vx + qw * tx + qy * tz - qz * ty;\r\n result._y = vy + qw * ty + qz * tx - qx * tz;\r\n result._z = vz + qw * tz + qx * ty - qy * tx;\r\n\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Rotates the vector in place using the given unit quaternion\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#8\r\n * @param q the unit quaternion representing the rotation\r\n * @returns the current updated Vector3\r\n */\r\n public applyRotationQuaternionInPlace(q: Quaternion): this {\r\n return this.applyRotationQuaternionToRef(q, this);\r\n }\r\n\r\n /**\r\n * Rotates the vector using the given unit quaternion and returns the new vector\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#7\r\n * @param q the unit quaternion representing the rotation\r\n * @returns a new Vector3\r\n */\r\n public applyRotationQuaternion(q: Quaternion): this {\r\n return this.applyRotationQuaternionToRef(q, new (this.constructor as Constructor)());\r\n }\r\n\r\n /**\r\n * Scale the current Vector3 values by a factor and add the result to a given Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#55\r\n * @param scale defines the scale factor\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns result input\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n return result.addInPlaceFromFloats(this._x * scale, this._y * scale, this._z * scale);\r\n }\r\n\r\n /**\r\n * Projects the current point Vector3 to a plane along a ray starting from a specified origin and passing through the current point Vector3.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#48\r\n * @param plane defines the plane to project to\r\n * @param origin defines the origin of the projection ray\r\n * @returns the projected vector3\r\n */\r\n public projectOnPlane(plane: Plane, origin: Vector3): T {\r\n const result = new (this.constructor as Constructor)();\r\n this.projectOnPlaneToRef(plane, origin, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Projects the current point Vector3 to a plane along a ray starting from a specified origin and passing through the current point Vector3.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#49\r\n * @param plane defines the plane to project to\r\n * @param origin defines the origin of the projection ray\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public projectOnPlaneToRef(plane: Plane, origin: Vector3, result: T): T {\r\n const n = plane.normal;\r\n const d = plane.d;\r\n\r\n const V = MathTmp.Vector3[0];\r\n\r\n // ray direction\r\n this.subtractToRef(origin, V);\r\n\r\n V.normalize();\r\n\r\n const denom = Vector3.Dot(V, n);\r\n\r\n //When the ray is close to parallel to the plane return infinity vector\r\n if (Math.abs(denom) < 0.0000000001) {\r\n result.setAll(Infinity);\r\n } else {\r\n const t = -(Vector3.Dot(origin, n) + d) / denom;\r\n\r\n // P = P0 + t*V\r\n const scaledV = V.scaleInPlace(t);\r\n origin.addToRef(scaledV, result);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns true if the current Vector3 and the given vector coordinates are strictly equal\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#19\r\n * @param otherVector defines the second operand\r\n * @returns true if both vectors are equals\r\n */\r\n public equals(otherVector: DeepImmutable): boolean {\r\n return otherVector && this._x === otherVector._x && this._y === otherVector._y && this._z === otherVector._z;\r\n }\r\n\r\n /**\r\n * Returns true if the current Vector3 and the given vector coordinates are distant less than epsilon\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#21\r\n * @param otherVector defines the second operand\r\n * @param epsilon defines the minimal distance to define values as equals\r\n * @returns true if both vectors are distant less than epsilon\r\n */\r\n public equalsWithEpsilon(otherVector: DeepImmutable, epsilon: number = Epsilon): boolean {\r\n return otherVector && WithinEpsilon(this._x, otherVector._x, epsilon) && WithinEpsilon(this._y, otherVector._y, epsilon) && WithinEpsilon(this._z, otherVector._z, epsilon);\r\n }\r\n\r\n /**\r\n * Returns true if the current Vector3 coordinates equals the given floats\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#20\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns true if both vectors are equal\r\n */\r\n public equalsToFloats(x: number, y: number, z: number): boolean {\r\n return this._x === x && this._y === y && this._z === z;\r\n }\r\n\r\n /**\r\n * Multiplies the current Vector3 coordinates by the given ones\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#32\r\n * @param otherVector defines the second operand\r\n * @returns the current updated Vector3\r\n */\r\n public multiplyInPlace(otherVector: DeepImmutable): this {\r\n this._x *= otherVector._x;\r\n this._y *= otherVector._y;\r\n this._z *= otherVector._z;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3, result of the multiplication of the current Vector3 by the given vector\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#31\r\n * @param otherVector defines the second operand\r\n * @returns the new Vector3\r\n */\r\n public multiply(otherVector: DeepImmutable): this {\r\n return this.multiplyByFloats(otherVector._x, otherVector._y, otherVector._z);\r\n }\r\n\r\n /**\r\n * Multiplies the current Vector3 by the given one and stores the result in the given vector \"result\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#33\r\n * @param otherVector defines the second operand\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public multiplyToRef(otherVector: DeepImmutable, result: T): T {\r\n return result.copyFromFloats(this._x * otherVector._x, this._y * otherVector._y, this._z * otherVector._z);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the result of the multiplication of the current Vector3 coordinates by the given floats\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#34\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the new Vector3\r\n */\r\n public multiplyByFloats(x: number, y: number, z: number): this {\r\n return new (this.constructor as Constructor)(this._x * x, this._y * y, this._z * z);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the result of the division of the current Vector3 coordinates by the given ones\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#16\r\n * @param otherVector defines the second operand\r\n * @returns the new Vector3\r\n */\r\n public divide(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this._x / otherVector._x, this._y / otherVector._y, this._z / otherVector._z);\r\n }\r\n\r\n /**\r\n * Divides the current Vector3 coordinates by the given ones and stores the result in the given vector \"result\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#18\r\n * @param otherVector defines the second operand\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public divideToRef(otherVector: DeepImmutable, result: T): T {\r\n return result.copyFromFloats(this._x / otherVector._x, this._y / otherVector._y, this._z / otherVector._z);\r\n }\r\n\r\n /**\r\n * Divides the current Vector3 coordinates by the given ones.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#17\r\n * @param otherVector defines the second operand\r\n * @returns the current updated Vector3\r\n */\r\n public divideInPlace(otherVector: DeepImmutable): this {\r\n this._x = this._x / otherVector._x;\r\n this._y = this._y / otherVector._y;\r\n this._z = this._z / otherVector._z;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Vector3 with the minimal coordinate values between its and the given vector ones\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#29\r\n * @param other defines the second operand\r\n * @returns the current updated Vector3\r\n */\r\n public minimizeInPlace(other: DeepImmutable): this {\r\n return this.minimizeInPlaceFromFloats(other._x, other._y, other._z);\r\n }\r\n\r\n /**\r\n * Updates the current Vector3 with the maximal coordinate values between its and the given vector ones.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#27\r\n * @param other defines the second operand\r\n * @returns the current updated Vector3\r\n */\r\n public maximizeInPlace(other: DeepImmutable): this {\r\n return this.maximizeInPlaceFromFloats(other._x, other._y, other._z);\r\n }\r\n\r\n /**\r\n * Updates the current Vector3 with the minimal coordinate values between its and the given coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#30\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the current updated Vector3\r\n */\r\n public minimizeInPlaceFromFloats(x: number, y: number, z: number): this {\r\n if (x < this._x) {\r\n this.x = x;\r\n }\r\n if (y < this._y) {\r\n this.y = y;\r\n }\r\n if (z < this._z) {\r\n this.z = z;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Vector3 with the maximal coordinate values between its and the given coordinates.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#28\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the current updated Vector3\r\n */\r\n public maximizeInPlaceFromFloats(x: number, y: number, z: number): this {\r\n if (x > this._x) {\r\n this.x = x;\r\n }\r\n if (y > this._y) {\r\n this.y = y;\r\n }\r\n if (z > this._z) {\r\n this.z = z;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Due to float precision, scale of a mesh could be uniform but float values are off by a small fraction\r\n * Check if is non uniform within a certain amount of decimal places to account for this\r\n * @param epsilon the amount the values can differ\r\n * @returns if the vector is non uniform to a certain number of decimal places\r\n */\r\n public isNonUniformWithinEpsilon(epsilon: number) {\r\n const absX = Math.abs(this._x);\r\n const absY = Math.abs(this._y);\r\n if (!WithinEpsilon(absX, absY, epsilon)) {\r\n return true;\r\n }\r\n\r\n const absZ = Math.abs(this._z);\r\n if (!WithinEpsilon(absX, absZ, epsilon)) {\r\n return true;\r\n }\r\n\r\n if (!WithinEpsilon(absY, absZ, epsilon)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the vector is non uniform meaning x, y or z are not all the same\r\n */\r\n public get isNonUniform(): boolean {\r\n const absX = Math.abs(this._x);\r\n const absY = Math.abs(this._y);\r\n if (absX !== absY) {\r\n return true;\r\n }\r\n\r\n const absZ = Math.abs(this._z);\r\n if (absX !== absZ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets the current Vector3's floored values and stores them in result\r\n * @param result the vector to store the result in\r\n * @returns the result vector\r\n */\r\n public floorToRef(result: T): T {\r\n result._x = Math.floor(this._x);\r\n result._y = Math.floor(this._y);\r\n result._z = Math.floor(this._z);\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector3 from current Vector3 floored values\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#22\r\n * @returns a new Vector3\r\n */\r\n public floor(): this {\r\n return new (this.constructor as Constructor)(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z));\r\n }\r\n\r\n /**\r\n * Gets the current Vector3's fractional values and stores them in result\r\n * @param result the vector to store the result in\r\n * @returns the result vector\r\n */\r\n public fractToRef(result: T): T {\r\n result._x = this.x - Math.floor(this._x);\r\n result._y = this.y - Math.floor(this._y);\r\n result._z = this.z - Math.floor(this._z);\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector3 from current Vector3 fractional values\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#23\r\n * @returns a new Vector3\r\n */\r\n public fract(): this {\r\n return new (this.constructor as Constructor)(this.x - Math.floor(this._x), this.y - Math.floor(this._y), this.z - Math.floor(this._z));\r\n }\r\n\r\n // Properties\r\n /**\r\n * Gets the length of the Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#25\r\n * @returns the length of the Vector3\r\n */\r\n public length(): number {\r\n return Math.sqrt(this.lengthSquared());\r\n }\r\n\r\n /**\r\n * Gets the squared length of the Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#26\r\n * @returns squared length of the Vector3\r\n */\r\n public lengthSquared(): number {\r\n return this._x * this._x + this._y * this._y + this._z * this._z;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the vector contains a zero in one of its components\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#1\r\n */\r\n public get hasAZeroComponent(): boolean {\r\n return this._x * this._y * this._z === 0;\r\n }\r\n\r\n /**\r\n * Normalize the current Vector3.\r\n * Please note that this is an in place operation.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#122\r\n * @returns the current updated Vector3\r\n */\r\n public normalize(): this {\r\n return this.normalizeFromLength(this.length());\r\n }\r\n\r\n /**\r\n * Reorders the x y z properties of the vector in place\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#44\r\n * @param order new ordering of the properties (eg. for vector 1,2,3 with \"ZYX\" will produce 3,2,1)\r\n * @returns the current updated vector\r\n */\r\n public reorderInPlace(order: string) {\r\n order = order.toLowerCase();\r\n if (order === \"xyz\") {\r\n return this;\r\n }\r\n const tem = MathTmp.Vector3[0].copyFrom(this);\r\n this.x = (tem)[order[0]];\r\n this.y = (tem)[order[1]];\r\n this.z = (tem)[order[2]];\r\n return this;\r\n }\r\n\r\n /**\r\n * Rotates the vector around 0,0,0 by a quaternion\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#47\r\n * @param quaternion the rotation quaternion\r\n * @param result vector to store the result\r\n * @returns the resulting vector\r\n */\r\n public rotateByQuaternionToRef(quaternion: Quaternion, result: T): T {\r\n quaternion.toRotationMatrix(MathTmp.Matrix[0]);\r\n Vector3.TransformCoordinatesToRef(this, MathTmp.Matrix[0], result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Rotates a vector around a given point\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#46\r\n * @param quaternion the rotation quaternion\r\n * @param point the point to rotate around\r\n * @param result vector to store the result\r\n * @returns the resulting vector\r\n */\r\n public rotateByQuaternionAroundPointToRef(quaternion: Quaternion, point: Vector3, result: T): T {\r\n this.subtractToRef(point, MathTmp.Vector3[0]);\r\n MathTmp.Vector3[0].rotateByQuaternionToRef(quaternion, MathTmp.Vector3[0]);\r\n point.addToRef(MathTmp.Vector3[0], result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 as the cross product of the current vector and the \"other\" one\r\n * The cross product is then orthogonal to both current and \"other\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#14\r\n * @param other defines the right operand\r\n * @returns the cross product\r\n */\r\n public cross(other: Vector3): this {\r\n const result = new (this.constructor as Constructor)();\r\n return Vector3.CrossToRef(this, other, result);\r\n }\r\n\r\n /**\r\n * Normalize the current Vector3 with the given input length.\r\n * Please note that this is an in place operation.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#123\r\n * @param len the length of the vector\r\n * @returns the current updated Vector3\r\n */\r\n public normalizeFromLength(len: number): this {\r\n if (len === 0 || len === 1.0) {\r\n return this;\r\n }\r\n\r\n return this.scaleInPlace(1.0 / len);\r\n }\r\n\r\n /**\r\n * Normalize the current Vector3 to a new vector\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#124\r\n * @returns the new Vector3\r\n */\r\n public normalizeToNew(): this {\r\n const normalized = new (this.constructor as Constructor)(0, 0, 0);\r\n this.normalizeToRef(normalized);\r\n return normalized;\r\n }\r\n\r\n /**\r\n * Normalize the current Vector3 to the reference\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#125\r\n * @param reference define the Vector3 to update\r\n * @returns the updated Vector3\r\n */\r\n public normalizeToRef(reference: T): T {\r\n const len = this.length();\r\n if (len === 0 || len === 1.0) {\r\n return reference.copyFrom(this);\r\n }\r\n\r\n return this.scaleToRef(1.0 / len, reference);\r\n }\r\n\r\n /**\r\n * Creates a new Vector3 copied from the current Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#11\r\n * @returns the new Vector3\r\n */\r\n public clone(): this {\r\n return new (this.constructor as Constructor)(this._x, this._y, this._z);\r\n }\r\n\r\n /**\r\n * Copies the given vector coordinates to the current Vector3 ones\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#12\r\n * @param source defines the source Vector3\r\n * @returns the current updated Vector3\r\n */\r\n public copyFrom(source: DeepImmutable): this {\r\n return this.copyFromFloats(source._x, source._y, source._z);\r\n }\r\n\r\n /**\r\n * Copies the given floats to the current Vector3 coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#13\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the current updated Vector3\r\n */\r\n public copyFromFloats(x: number, y: number, z: number): this {\r\n this._x = x;\r\n this._y = y;\r\n this._z = z;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Copies the given floats to the current Vector3 coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#58\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the current updated Vector3\r\n */\r\n public set(x: number, y: number, z: number): this {\r\n return this.copyFromFloats(x, y, z);\r\n }\r\n\r\n /**\r\n * Copies the given float to the current Vector3 coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#59\r\n * @param v defines the x, y and z coordinates of the operand\r\n * @returns the current updated Vector3\r\n */\r\n public setAll(v: number): this {\r\n this._x = this._y = this._z = v;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Get the clip factor between two vectors\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#126\r\n * @param vector0 defines the first operand\r\n * @param vector1 defines the second operand\r\n * @param axis defines the axis to use\r\n * @param size defines the size along the axis\r\n * @returns the clip factor\r\n */\r\n public static GetClipFactor(vector0: DeepImmutable, vector1: DeepImmutable, axis: DeepImmutable, size: number): number {\r\n const d0 = Vector3.Dot(vector0, axis);\r\n const d1 = Vector3.Dot(vector1, axis);\r\n\r\n return (d0 - size) / (d0 - d1);\r\n }\r\n\r\n /**\r\n * Get angle between two vectors\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#86\r\n * @param vector0 the starting point\r\n * @param vector1 the ending point\r\n * @param normal direction of the normal\r\n * @returns the angle between vector0 and vector1\r\n */\r\n public static GetAngleBetweenVectors(vector0: DeepImmutable, vector1: DeepImmutable, normal: DeepImmutable): number {\r\n const v0: Vector3 = vector0.normalizeToRef(MathTmp.Vector3[1]);\r\n const v1: Vector3 = vector1.normalizeToRef(MathTmp.Vector3[2]);\r\n let dot: number = Vector3.Dot(v0, v1);\r\n // Vectors are normalized so dot will be in [-1, 1] (aside precision issues enough to break the result which explains the below clamp)\r\n dot = Clamp(dot, -1, 1);\r\n\r\n const angle = Math.acos(dot);\r\n const n = MathTmp.Vector3[3];\r\n Vector3.CrossToRef(v0, v1, n);\r\n if (Vector3.Dot(n, normal) > 0) {\r\n return isNaN(angle) ? 0 : angle;\r\n }\r\n return isNaN(angle) ? -Math.PI : -Math.acos(dot);\r\n }\r\n\r\n /**\r\n * Get angle between two vectors projected on a plane\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#87\r\n * Expectation compute time: 0.01 ms (median) and 0.02 ms (percentile 95%)\r\n * @param vector0 angle between vector0 and vector1\r\n * @param vector1 angle between vector0 and vector1\r\n * @param normal Normal of the projection plane\r\n * @returns the angle in radians (float) between vector0 and vector1 projected on the plane with the specified normal\r\n */\r\n public static GetAngleBetweenVectorsOnPlane(vector0: DeepImmutable, vector1: DeepImmutable, normal: DeepImmutable): number {\r\n MathTmp.Vector3[0].copyFrom(vector0);\r\n const v0 = MathTmp.Vector3[0];\r\n MathTmp.Vector3[1].copyFrom(vector1);\r\n const v1 = MathTmp.Vector3[1];\r\n MathTmp.Vector3[2].copyFrom(normal);\r\n const vNormal = MathTmp.Vector3[2];\r\n const right = MathTmp.Vector3[3];\r\n const forward = MathTmp.Vector3[4];\r\n\r\n v0.normalize();\r\n v1.normalize();\r\n vNormal.normalize();\r\n\r\n Vector3.CrossToRef(vNormal, v0, right);\r\n Vector3.CrossToRef(right, vNormal, forward);\r\n\r\n const angle = Math.atan2(Vector3.Dot(v1, right), Vector3.Dot(v1, forward));\r\n\r\n return NormalizeRadians(angle);\r\n }\r\n\r\n /**\r\n * Gets the rotation that aligns the roll axis (Y) to the line joining the start point to the target point and stores it in the ref Vector3\r\n * Example PG https://playground.babylonjs.com/#R1F8YU#189\r\n * @param start the starting point\r\n * @param target the target point\r\n * @param ref the vector3 to store the result\r\n * @returns ref in the form (pitch, yaw, 0)\r\n */\r\n public static PitchYawRollToMoveBetweenPointsToRef(start: Vector3, target: Vector3, ref: T): T {\r\n const diff = TmpVectors.Vector3[0];\r\n target.subtractToRef(start, diff);\r\n ref._y = Math.atan2(diff.x, diff.z) || 0;\r\n ref._x = Math.atan2(Math.sqrt(diff.x ** 2 + diff.z ** 2), diff.y) || 0;\r\n ref._z = 0;\r\n ref._isDirty = true;\r\n return ref;\r\n }\r\n\r\n /**\r\n * Gets the rotation that aligns the roll axis (Y) to the line joining the start point to the target point\r\n * Example PG https://playground.babylonjs.com/#R1F8YU#188\r\n * @param start the starting point\r\n * @param target the target point\r\n * @returns the rotation in the form (pitch, yaw, 0)\r\n */\r\n public static PitchYawRollToMoveBetweenPoints(start: Vector3, target: Vector3): Vector3 {\r\n const ref = Vector3.Zero();\r\n return Vector3.PitchYawRollToMoveBetweenPointsToRef(start, target, ref);\r\n }\r\n\r\n /**\r\n * Slerp between two vectors. See also `SmoothToRef`\r\n * Slerp is a spherical linear interpolation\r\n * giving a slow in and out effect\r\n * Example Playground 1 https://playground.babylonjs.com/#R1F8YU#108\r\n * Example Playground 2 https://playground.babylonjs.com/#R1F8YU#109\r\n * @param vector0 Start vector\r\n * @param vector1 End vector\r\n * @param slerp amount (will be clamped between 0 and 1)\r\n * @param result The slerped vector\r\n * @returns The slerped vector\r\n */\r\n public static SlerpToRef(vector0: Vector3, vector1: Vector3, slerp: number, result: T): T {\r\n slerp = Clamp(slerp, 0, 1);\r\n const vector0Dir = MathTmp.Vector3[0];\r\n const vector1Dir = MathTmp.Vector3[1];\r\n\r\n vector0Dir.copyFrom(vector0);\r\n const vector0Length = vector0Dir.length();\r\n vector0Dir.normalizeFromLength(vector0Length);\r\n\r\n vector1Dir.copyFrom(vector1);\r\n const vector1Length = vector1Dir.length();\r\n vector1Dir.normalizeFromLength(vector1Length);\r\n\r\n const dot = Vector3.Dot(vector0Dir, vector1Dir);\r\n\r\n let scale0;\r\n let scale1;\r\n\r\n if (dot < 1 - Epsilon) {\r\n const omega = Math.acos(dot);\r\n const invSin = 1 / Math.sin(omega);\r\n scale0 = Math.sin((1 - slerp) * omega) * invSin;\r\n scale1 = Math.sin(slerp * omega) * invSin;\r\n } else {\r\n // Use linear interpolation\r\n scale0 = 1 - slerp;\r\n scale1 = slerp;\r\n }\r\n\r\n vector0Dir.scaleInPlace(scale0);\r\n vector1Dir.scaleInPlace(scale1);\r\n result.copyFrom(vector0Dir).addInPlace(vector1Dir);\r\n result.scaleInPlace(Lerp(vector0Length, vector1Length, slerp));\r\n return result;\r\n }\r\n\r\n /**\r\n * Smooth interpolation between two vectors using Slerp\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#110\r\n * @param source source vector\r\n * @param goal goal vector\r\n * @param deltaTime current interpolation frame\r\n * @param lerpTime total interpolation time\r\n * @param result the smoothed vector\r\n * @returns the smoothed vector\r\n */\r\n public static SmoothToRef(source: Vector3, goal: Vector3, deltaTime: number, lerpTime: number, result: T): T {\r\n Vector3.SlerpToRef(source, goal, lerpTime === 0 ? 1 : deltaTime / lerpTime, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set from the index \"offset\" of the given array\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#83\r\n * @param array defines the source array\r\n * @param offset defines the offset in the source array\r\n * @returns the new Vector3\r\n */\r\n public static FromArray(array: DeepImmutable>, offset: number = 0): Vector3 {\r\n return new Vector3(array[offset], array[offset + 1], array[offset + 2]);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set from the index \"offset\" of the given Float32Array\r\n * @param array defines the source array\r\n * @param offset defines the offset in the source array\r\n * @returns the new Vector3\r\n * @deprecated Please use FromArray instead.\r\n */\r\n public static FromFloatArray(array: DeepImmutable, offset?: number): Vector3 {\r\n return Vector3.FromArray(array, offset);\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the element values from the index \"offset\" of the given array\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#84\r\n * @param array defines the source array\r\n * @param offset defines the offset in the source array\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number, result: T): T {\r\n result._x = array[offset];\r\n result._y = array[offset + 1];\r\n result._z = array[offset + 2];\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the element values from the index \"offset\" of the given Float32Array\r\n * @param array defines the source array\r\n * @param offset defines the offset in the source array\r\n * @param result defines the Vector3 where to store the result\r\n * @deprecated Please use FromArrayToRef instead.\r\n * @returns result input\r\n */\r\n public static FromFloatArrayToRef(array: DeepImmutable, offset: number, result: T): T {\r\n return Vector3.FromArrayToRef(array, offset, result);\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the given floats.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#85\r\n * @param x defines the x coordinate of the source\r\n * @param y defines the y coordinate of the source\r\n * @param z defines the z coordinate of the source\r\n * @param result defines the Vector3 where to store the result\r\n * @returns the result vector\r\n */\r\n public static FromFloatsToRef(x: number, y: number, z: number, result: T): T {\r\n result.copyFromFloats(x, y, z);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set to (0.0, 0.0, 0.0)\r\n * @returns a new empty Vector3\r\n */\r\n public static Zero(): Vector3 {\r\n return new Vector3(0.0, 0.0, 0.0);\r\n }\r\n /**\r\n * Returns a new Vector3 set to (1.0, 1.0, 1.0)\r\n * @returns a new Vector3\r\n */\r\n public static One(): Vector3 {\r\n return new Vector3(1.0, 1.0, 1.0);\r\n }\r\n /**\r\n * Returns a new Vector3 set to (0.0, 1.0, 0.0)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\r\n * @returns a new up Vector3\r\n */\r\n public static Up(): Vector3 {\r\n return new Vector3(0.0, 1.0, 0.0);\r\n }\r\n\r\n /**\r\n * Gets an up Vector3 that must not be updated\r\n */\r\n public static get UpReadOnly(): DeepImmutable {\r\n return Vector3._UpReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a down Vector3 that must not be updated\r\n */\r\n public static get DownReadOnly(): DeepImmutable {\r\n return Vector3._DownReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a right Vector3 that must not be updated\r\n */\r\n public static get RightReadOnly(): DeepImmutable {\r\n return Vector3._RightReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a left Vector3 that must not be updated\r\n */\r\n public static get LeftReadOnly(): DeepImmutable {\r\n return Vector3._LeftReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a forward Vector3 that must not be updated\r\n */\r\n public static get LeftHandedForwardReadOnly(): DeepImmutable {\r\n return Vector3._LeftHandedForwardReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a forward Vector3 that must not be updated\r\n */\r\n public static get RightHandedForwardReadOnly(): DeepImmutable {\r\n return Vector3._RightHandedForwardReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a backward Vector3 that must not be updated\r\n */\r\n public static get LeftHandedBackwardReadOnly(): DeepImmutable {\r\n return Vector3._LeftHandedBackwardReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a backward Vector3 that must not be updated\r\n */\r\n public static get RightHandedBackwardReadOnly(): DeepImmutable {\r\n return Vector3._RightHandedBackwardReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a zero Vector3 that must not be updated\r\n */\r\n public static get ZeroReadOnly(): DeepImmutable {\r\n return Vector3._ZeroReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a one Vector3 that must not be updated\r\n */\r\n public static get OneReadOnly(): DeepImmutable {\r\n return Vector3._OneReadOnly;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set to (0.0, -1.0, 0.0)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\r\n * @returns a new down Vector3\r\n */\r\n public static Down(): Vector3 {\r\n return new Vector3(0.0, -1.0, 0.0);\r\n }\r\n /**\r\n * Returns a new Vector3 set to (0.0, 0.0, 1.0)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\r\n * @param rightHandedSystem is the scene right-handed (negative z)\r\n * @returns a new forward Vector3\r\n */\r\n public static Forward(rightHandedSystem: boolean = false): Vector3 {\r\n return new Vector3(0.0, 0.0, rightHandedSystem ? -1.0 : 1.0);\r\n }\r\n /**\r\n * Returns a new Vector3 set to (0.0, 0.0, -1.0)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\r\n * @param rightHandedSystem is the scene right-handed (negative-z)\r\n * @returns a new Backward Vector3\r\n */\r\n public static Backward(rightHandedSystem: boolean = false): Vector3 {\r\n return new Vector3(0.0, 0.0, rightHandedSystem ? 1.0 : -1.0);\r\n }\r\n /**\r\n * Returns a new Vector3 set to (1.0, 0.0, 0.0)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\r\n * @returns a new right Vector3\r\n */\r\n public static Right(): Vector3 {\r\n return new Vector3(1.0, 0.0, 0.0);\r\n }\r\n /**\r\n * Returns a new Vector3 set to (-1.0, 0.0, 0.0)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\r\n * @returns a new left Vector3\r\n */\r\n public static Left(): Vector3 {\r\n return new Vector3(-1.0, 0.0, 0.0);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @returns a Vector3 with random values between min and max\r\n */\r\n public static Random(min: number = 0, max: number = 1): Vector3 {\r\n return new Vector3(RandomRange(min, max), RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Sets a Vector3 with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @param ref the ref to store the values in\r\n * @returns the ref with random values between min and max\r\n */\r\n public static RandomToRef(min: number = 0, max: number = 1, ref: T): T {\r\n return ref.copyFromFloats(RandomRange(min, max), RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the result of the transformation by the given matrix of the given vector.\r\n * This method computes transformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#111\r\n * @param vector defines the Vector3 to transform\r\n * @param transformation defines the transformation matrix\r\n * @returns the transformed Vector3\r\n */\r\n public static TransformCoordinates(vector: DeepImmutable, transformation: DeepImmutable): Vector3 {\r\n const result = Vector3.Zero();\r\n Vector3.TransformCoordinatesToRef(vector, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given vector\r\n * This method computes transformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#113\r\n * @param vector defines the Vector3 to transform\r\n * @param transformation defines the transformation matrix\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static TransformCoordinatesToRef(vector: DeepImmutable, transformation: DeepImmutable, result: T): T {\r\n Vector3.TransformCoordinatesFromFloatsToRef(vector._x, vector._y, vector._z, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given floats (x, y, z)\r\n * This method computes transformed coordinates only, not transformed direction vectors\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#115\r\n * @param x define the x coordinate of the source vector\r\n * @param y define the y coordinate of the source vector\r\n * @param z define the z coordinate of the source vector\r\n * @param transformation defines the transformation matrix\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static TransformCoordinatesFromFloatsToRef(x: number, y: number, z: number, transformation: DeepImmutable, result: T): T {\r\n const m = transformation.m;\r\n const rx = x * m[0] + y * m[4] + z * m[8] + m[12];\r\n const ry = x * m[1] + y * m[5] + z * m[9] + m[13];\r\n const rz = x * m[2] + y * m[6] + z * m[10] + m[14];\r\n const rw = 1 / (x * m[3] + y * m[7] + z * m[11] + m[15]);\r\n\r\n result._x = rx * rw;\r\n result._y = ry * rw;\r\n result._z = rz * rw;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the result of the normal transformation by the given matrix of the given vector\r\n * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#112\r\n * @param vector defines the Vector3 to transform\r\n * @param transformation defines the transformation matrix\r\n * @returns the new Vector3\r\n */\r\n public static TransformNormal(vector: DeepImmutable, transformation: DeepImmutable): Vector3 {\r\n const result = Vector3.Zero();\r\n Vector3.TransformNormalToRef(vector, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given vector\r\n * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#114\r\n * @param vector defines the Vector3 to transform\r\n * @param transformation defines the transformation matrix\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static TransformNormalToRef(vector: DeepImmutable, transformation: DeepImmutable, result: T): T {\r\n this.TransformNormalFromFloatsToRef(vector._x, vector._y, vector._z, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given floats (x, y, z)\r\n * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#116\r\n * @param x define the x coordinate of the source vector\r\n * @param y define the y coordinate of the source vector\r\n * @param z define the z coordinate of the source vector\r\n * @param transformation defines the transformation matrix\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static TransformNormalFromFloatsToRef(x: number, y: number, z: number, transformation: DeepImmutable, result: T): T {\r\n const m = transformation.m;\r\n result._x = x * m[0] + y * m[4] + z * m[8];\r\n result._y = x * m[1] + y * m[5] + z * m[9];\r\n result._z = x * m[2] + y * m[6] + z * m[10];\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 located for \"amount\" on the CatmullRom interpolation spline defined by the vectors \"value1\", \"value2\", \"value3\", \"value4\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#69\r\n * @param value1 defines the first control point\r\n * @param value2 defines the second control point\r\n * @param value3 defines the third control point\r\n * @param value4 defines the fourth control point\r\n * @param amount defines the amount on the spline to use\r\n * @returns the new Vector3\r\n */\r\n public static CatmullRom(\r\n value1: DeepImmutable,\r\n value2: DeepImmutable,\r\n value3: DeepImmutable,\r\n value4: DeepImmutable,\r\n amount: number\r\n ): T {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n\r\n const x =\r\n 0.5 *\r\n (2.0 * value2._x +\r\n (-value1._x + value3._x) * amount +\r\n (2.0 * value1._x - 5.0 * value2._x + 4.0 * value3._x - value4._x) * squared +\r\n (-value1._x + 3.0 * value2._x - 3.0 * value3._x + value4._x) * cubed);\r\n\r\n const y =\r\n 0.5 *\r\n (2.0 * value2._y +\r\n (-value1._y + value3._y) * amount +\r\n (2.0 * value1._y - 5.0 * value2._y + 4.0 * value3._y - value4._y) * squared +\r\n (-value1._y + 3.0 * value2._y - 3.0 * value3._y + value4._y) * cubed);\r\n\r\n const z =\r\n 0.5 *\r\n (2.0 * value2._z +\r\n (-value1._z + value3._z) * amount +\r\n (2.0 * value1._z - 5.0 * value2._z + 4.0 * value3._z - value4._z) * squared +\r\n (-value1._z + 3.0 * value2._z - 3.0 * value3._z + value4._z) * cubed);\r\n\r\n return new (value1.constructor as Constructor)(x, y, z);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\r\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\r\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#76\r\n * @param value defines the current value\r\n * @param min defines the lower range value\r\n * @param max defines the upper range value\r\n * @returns the new Vector3\r\n */\r\n public static Clamp(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable): T {\r\n const result = new (value.constructor as Constructor)();\r\n Vector3.ClampToRef(value, min, max, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\r\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\r\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#77\r\n * @param value defines the current value\r\n * @param min defines the lower range value\r\n * @param max defines the upper range value\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static ClampToRef(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable, result: T): T {\r\n let x = value._x;\r\n x = x > max._x ? max._x : x;\r\n x = x < min._x ? min._x : x;\r\n\r\n let y = value._y;\r\n y = y > max._y ? max._y : y;\r\n y = y < min._y ? min._y : y;\r\n\r\n let z = value._z;\r\n z = z > max._z ? max._z : z;\r\n z = z < min._z ? min._z : z;\r\n\r\n result.copyFromFloats(x, y, z);\r\n return result;\r\n }\r\n\r\n /**\r\n * Checks if a given vector is inside a specific range\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#75\r\n * @param v defines the vector to test\r\n * @param min defines the minimum range\r\n * @param max defines the maximum range\r\n */\r\n public static CheckExtends(v: Vector3, min: Vector3, max: Vector3): void {\r\n min.minimizeInPlace(v);\r\n max.maximizeInPlace(v);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 located for \"amount\" (float) on the Hermite interpolation spline defined by the vectors \"value1\", \"tangent1\", \"value2\", \"tangent2\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#89\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent vector\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent vector\r\n * @param amount defines the amount on the interpolation spline (between 0 and 1)\r\n * @returns the new Vector3\r\n */\r\n public static Hermite(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n amount: number\r\n ): T {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n const part1 = 2.0 * cubed - 3.0 * squared + 1.0;\r\n const part2 = -2.0 * cubed + 3.0 * squared;\r\n const part3 = cubed - 2.0 * squared + amount;\r\n const part4 = cubed - squared;\r\n\r\n const x = value1._x * part1 + value2._x * part2 + tangent1._x * part3 + tangent2._x * part4;\r\n const y = value1._y * part1 + value2._y * part2 + tangent1._y * part3 + tangent2._y * part4;\r\n const z = value1._z * part1 + value2._z * part2 + tangent1._z * part3 + tangent2._z * part4;\r\n return new (value1.constructor as Constructor)(x, y, z);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 which is the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#90\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @returns 1st derivative\r\n */\r\n public static Hermite1stDerivative(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number\r\n ): T {\r\n const result = new (value1.constructor as Constructor)();\r\n\r\n this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Update a Vector3 with the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#91\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @param result define where to store the derivative\r\n * @returns result input\r\n */\r\n public static Hermite1stDerivativeToRef(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number,\r\n result: T\r\n ): T {\r\n const t2 = time * time;\r\n\r\n result._x = (t2 - time) * 6 * value1._x + (3 * t2 - 4 * time + 1) * tangent1._x + (-t2 + time) * 6 * value2._x + (3 * t2 - 2 * time) * tangent2._x;\r\n result._y = (t2 - time) * 6 * value1._y + (3 * t2 - 4 * time + 1) * tangent1._y + (-t2 + time) * 6 * value2._y + (3 * t2 - 2 * time) * tangent2._y;\r\n result._z = (t2 - time) * 6 * value1._z + (3 * t2 - 4 * time + 1) * tangent1._z + (-t2 + time) * 6 * value2._z + (3 * t2 - 2 * time) * tangent2._z;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 located for \"amount\" (float) on the linear interpolation between the vectors \"start\" and \"end\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#95\r\n * @param start defines the start value\r\n * @param end defines the end value\r\n * @param amount max defines amount between both (between 0 and 1)\r\n * @returns the new Vector3\r\n */\r\n public static Lerp(start: DeepImmutable, end: DeepImmutable, amount: number): T {\r\n const result = new (start.constructor as Constructor)(0, 0, 0);\r\n Vector3.LerpToRef(start, end, amount, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the result of the linear interpolation from the vector \"start\" for \"amount\" to the vector \"end\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#93\r\n * @param start defines the start value\r\n * @param end defines the end value\r\n * @param amount max defines amount between both (between 0 and 1)\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static LerpToRef(start: DeepImmutable, end: DeepImmutable, amount: number, result: T): T {\r\n result._x = start._x + (end._x - start._x) * amount;\r\n result._y = start._y + (end._y - start._y) * amount;\r\n result._z = start._z + (end._z - start._z) * amount;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns the dot product (float) between the vectors \"left\" and \"right\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#82\r\n * @param left defines the left operand\r\n * @param right defines the right operand\r\n * @returns the dot product\r\n */\r\n public static Dot(left: DeepImmutable, right: DeepImmutable): number {\r\n return left._x * right._x + left._y * right._y + left._z * right._z;\r\n }\r\n\r\n /**\r\n * Returns the dot product (float) between the current vectors and \"otherVector\"\r\n * @param otherVector defines the right operand\r\n * @returns the dot product\r\n */\r\n public dot(otherVector: DeepImmutable): number {\r\n return this._x * otherVector._x + this._y * otherVector._y + this._z * otherVector._z;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 as the cross product of the vectors \"left\" and \"right\"\r\n * The cross product is then orthogonal to both \"left\" and \"right\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#15\r\n * @param left defines the left operand\r\n * @param right defines the right operand\r\n * @returns the cross product\r\n */\r\n public static Cross(left: DeepImmutable, right: DeepImmutable): T {\r\n const result = new (left.constructor as Constructor)();\r\n Vector3.CrossToRef(left, right, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the cross product of \"left\" and \"right\"\r\n * The cross product is then orthogonal to both \"left\" and \"right\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#78\r\n * @param left defines the left operand\r\n * @param right defines the right operand\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static CrossToRef(left: DeepImmutable, right: DeepImmutable, result: T): T {\r\n const x = left._y * right._z - left._z * right._y;\r\n const y = left._z * right._x - left._x * right._z;\r\n const z = left._x * right._y - left._y * right._x;\r\n result.copyFromFloats(x, y, z);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 as the normalization of the given vector\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#98\r\n * @param vector defines the Vector3 to normalize\r\n * @returns the new Vector3\r\n */\r\n public static Normalize(vector: DeepImmutable): Vector3 {\r\n const result = Vector3.Zero();\r\n Vector3.NormalizeToRef(vector, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the normalization of the given first vector\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#98\r\n * @param vector defines the Vector3 to normalize\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static NormalizeToRef(vector: DeepImmutable, result: T): T {\r\n vector.normalizeToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Project a Vector3 onto screen space\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#101\r\n * @param vector defines the Vector3 to project\r\n * @param world defines the world matrix to use\r\n * @param transform defines the transform (view x projection) matrix to use\r\n * @param viewport defines the screen viewport to use\r\n * @returns the new Vector3\r\n */\r\n public static Project(vector: DeepImmutable, world: DeepImmutable, transform: DeepImmutable, viewport: DeepImmutable): T {\r\n const result = new (vector.constructor as Constructor)();\r\n Vector3.ProjectToRef(vector, world, transform, viewport, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Project a Vector3 onto screen space to reference\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#102\r\n * @param vector defines the Vector3 to project\r\n * @param world defines the world matrix to use\r\n * @param transform defines the transform (view x projection) matrix to use\r\n * @param viewport defines the screen viewport to use\r\n * @param result the vector in which the screen space will be stored\r\n * @returns result input\r\n */\r\n public static ProjectToRef(\r\n vector: DeepImmutable,\r\n world: DeepImmutable,\r\n transform: DeepImmutable,\r\n viewport: DeepImmutable,\r\n result: T\r\n ): T {\r\n const cw = viewport.width;\r\n const ch = viewport.height;\r\n const cx = viewport.x;\r\n const cy = viewport.y;\r\n\r\n const viewportMatrix = MathTmp.Matrix[1];\r\n\r\n Matrix.FromValuesToRef(cw / 2.0, 0, 0, 0, 0, -ch / 2.0, 0, 0, 0, 0, 0.5, 0, cx + cw / 2.0, ch / 2.0 + cy, 0.5, 1, viewportMatrix);\r\n\r\n const matrix = MathTmp.Matrix[0];\r\n world.multiplyToRef(transform, matrix);\r\n matrix.multiplyToRef(viewportMatrix, matrix);\r\n\r\n Vector3.TransformCoordinatesToRef(vector, matrix, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Reflects a vector off the plane defined by a normalized normal\r\n * @param inDirection defines the vector direction\r\n * @param normal defines the normal - Must be normalized\r\n * @returns the resulting vector\r\n */\r\n public static Reflect(inDirection: DeepImmutable, normal: DeepImmutable): Vector3 {\r\n return this.ReflectToRef(inDirection, normal, new Vector3());\r\n }\r\n\r\n /**\r\n * Reflects a vector off the plane defined by a normalized normal to reference\r\n * @param inDirection defines the vector direction\r\n * @param normal defines the normal - Must be normalized\r\n * @param ref defines the Vector3 where to store the result\r\n * @returns the resulting vector\r\n */\r\n public static ReflectToRef(inDirection: DeepImmutable, normal: DeepImmutable, ref: T): T {\r\n const tmp = TmpVectors.Vector3[0];\r\n tmp.copyFrom(normal).scaleInPlace(2 * Vector3.Dot(inDirection, normal));\r\n\r\n return ref.copyFrom(inDirection).subtractInPlace(tmp);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _UnprojectFromInvertedMatrixToRef(source: DeepImmutable, matrix: DeepImmutable, result: T): T {\r\n Vector3.TransformCoordinatesToRef(source, matrix, result);\r\n const m = matrix.m;\r\n const num = source._x * m[3] + source._y * m[7] + source._z * m[11] + m[15];\r\n if (WithinEpsilon(num, 1.0)) {\r\n result.scaleInPlace(1.0 / num);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Unproject from screen space to object space\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#121\r\n * @param source defines the screen space Vector3 to use\r\n * @param viewportWidth defines the current width of the viewport\r\n * @param viewportHeight defines the current height of the viewport\r\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\r\n * @param transform defines the transform (view x projection) matrix to use\r\n * @returns the new Vector3\r\n */\r\n public static UnprojectFromTransform(\r\n source: DeepImmutable,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n transform: DeepImmutable\r\n ): T {\r\n return this.Unproject(source, viewportWidth, viewportHeight, world, transform, Matrix.IdentityReadOnly);\r\n }\r\n\r\n /**\r\n * Unproject from screen space to object space\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#117\r\n * @param source defines the screen space Vector3 to use\r\n * @param viewportWidth defines the current width of the viewport\r\n * @param viewportHeight defines the current height of the viewport\r\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\r\n * @param view defines the view matrix to use\r\n * @param projection defines the projection matrix to use\r\n * @returns the new Vector3\r\n */\r\n public static Unproject(\r\n source: DeepImmutable,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable\r\n ): T {\r\n const result = new (source.constructor as Constructor)();\r\n\r\n Vector3.UnprojectToRef(source, viewportWidth, viewportHeight, world, view, projection, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Unproject from screen space to object space\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#119\r\n * @param source defines the screen space Vector3 to use\r\n * @param viewportWidth defines the current width of the viewport\r\n * @param viewportHeight defines the current height of the viewport\r\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\r\n * @param view defines the view matrix to use\r\n * @param projection defines the projection matrix to use\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static UnprojectToRef(\r\n source: DeepImmutable,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable,\r\n result: T\r\n ): T {\r\n Vector3.UnprojectFloatsToRef(source._x, source._y, source._z, viewportWidth, viewportHeight, world, view, projection, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Unproject from screen space to object space\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#120\r\n * @param sourceX defines the screen space x coordinate to use\r\n * @param sourceY defines the screen space y coordinate to use\r\n * @param sourceZ defines the screen space z coordinate to use\r\n * @param viewportWidth defines the current width of the viewport\r\n * @param viewportHeight defines the current height of the viewport\r\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\r\n * @param view defines the view matrix to use\r\n * @param projection defines the projection matrix to use\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static UnprojectFloatsToRef(\r\n sourceX: float,\r\n sourceY: float,\r\n sourceZ: float,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable,\r\n result: T\r\n ): T {\r\n const matrix = MathTmp.Matrix[0];\r\n world.multiplyToRef(view, matrix);\r\n matrix.multiplyToRef(projection, matrix);\r\n matrix.invert();\r\n\r\n const screenSource = MathTmp.Vector3[0];\r\n screenSource.x = (sourceX / viewportWidth) * 2 - 1;\r\n screenSource.y = -((sourceY / viewportHeight) * 2 - 1);\r\n if (EngineStore.LastCreatedEngine?.isNDCHalfZRange) {\r\n screenSource.z = sourceZ;\r\n } else {\r\n screenSource.z = 2 * sourceZ - 1.0;\r\n }\r\n\r\n Vector3._UnprojectFromInvertedMatrixToRef(screenSource, matrix, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the minimal coordinate values between two Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#97\r\n * @param left defines the first operand\r\n * @param right defines the second operand\r\n * @returns the new Vector3\r\n */\r\n public static Minimize(left: DeepImmutable, right: DeepImmutable): T {\r\n const min = new (left.constructor as Constructor)();\r\n min.copyFrom(left);\r\n min.minimizeInPlace(right);\r\n return min;\r\n }\r\n\r\n /**\r\n * Gets the maximal coordinate values between two Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#96\r\n * @param left defines the first operand\r\n * @param right defines the second operand\r\n * @returns the new Vector3\r\n */\r\n public static Maximize(left: DeepImmutable, right: DeepImmutable): T {\r\n const max = new (left.constructor as Constructor)();\r\n max.copyFrom(left);\r\n max.maximizeInPlace(right);\r\n return max;\r\n }\r\n\r\n /**\r\n * Returns the distance between the vectors \"value1\" and \"value2\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#81\r\n * @param value1 defines the first operand\r\n * @param value2 defines the second operand\r\n * @returns the distance\r\n */\r\n public static Distance(value1: DeepImmutable, value2: DeepImmutable): number {\r\n return Math.sqrt(Vector3.DistanceSquared(value1, value2));\r\n }\r\n\r\n /**\r\n * Returns the squared distance between the vectors \"value1\" and \"value2\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#80\r\n * @param value1 defines the first operand\r\n * @param value2 defines the second operand\r\n * @returns the squared distance\r\n */\r\n public static DistanceSquared(value1: DeepImmutable, value2: DeepImmutable): number {\r\n const x = value1._x - value2._x;\r\n const y = value1._y - value2._y;\r\n const z = value1._z - value2._z;\r\n\r\n return x * x + y * y + z * z;\r\n }\r\n\r\n /**\r\n * Projects \"vector\" on the triangle determined by its extremities \"p0\", \"p1\" and \"p2\", stores the result in \"ref\"\r\n * and returns the distance to the projected point.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#104\r\n * From http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.4264&rep=rep1&type=pdf\r\n *\r\n * @param vector the vector to get distance from\r\n * @param p0 extremity of the triangle\r\n * @param p1 extremity of the triangle\r\n * @param p2 extremity of the triangle\r\n * @param ref variable to store the result to\r\n * @returns The distance between \"ref\" and \"vector\"\r\n */\r\n public static ProjectOnTriangleToRef(vector: DeepImmutable, p0: DeepImmutable, p1: DeepImmutable, p2: DeepImmutable, ref: Vector3): number {\r\n const p1p0 = MathTmp.Vector3[0];\r\n const p2p0 = MathTmp.Vector3[1];\r\n const p2p1 = MathTmp.Vector3[2];\r\n const normal = MathTmp.Vector3[3];\r\n const vectorp0 = MathTmp.Vector3[4];\r\n\r\n // Triangle vectors\r\n p1.subtractToRef(p0, p1p0);\r\n p2.subtractToRef(p0, p2p0);\r\n p2.subtractToRef(p1, p2p1);\r\n\r\n const p1p0L = p1p0.length();\r\n const p2p0L = p2p0.length();\r\n const p2p1L = p2p1.length();\r\n\r\n if (p1p0L < Epsilon || p2p0L < Epsilon || p2p1L < Epsilon) {\r\n // This is a degenerate triangle. As we assume this is part of a non-degenerate mesh,\r\n // we will find a better intersection later.\r\n // Let's just return one of the extremities\r\n ref.copyFrom(p0);\r\n return Vector3.Distance(vector, p0);\r\n }\r\n\r\n // Compute normal and vector to p0\r\n vector.subtractToRef(p0, vectorp0);\r\n Vector3.CrossToRef(p1p0, p2p0, normal);\r\n const nl = normal.length();\r\n if (nl < Epsilon) {\r\n // Extremities are aligned, we are back on the case of a degenerate triangle\r\n ref.copyFrom(p0);\r\n return Vector3.Distance(vector, p0);\r\n }\r\n normal.normalizeFromLength(nl);\r\n let l = vectorp0.length();\r\n if (l < Epsilon) {\r\n // Vector is p0\r\n ref.copyFrom(p0);\r\n return 0;\r\n }\r\n vectorp0.normalizeFromLength(l);\r\n\r\n // Project to \"proj\" that lies on the triangle plane\r\n const cosA = Vector3.Dot(normal, vectorp0);\r\n const projVector = MathTmp.Vector3[5];\r\n const proj = MathTmp.Vector3[6];\r\n projVector.copyFrom(normal).scaleInPlace(-l * cosA);\r\n proj.copyFrom(vector).addInPlace(projVector);\r\n\r\n // Compute barycentric coordinates (v0, v1 and v2 are axis from barycenter to extremities)\r\n const v0 = MathTmp.Vector3[4];\r\n const v1 = MathTmp.Vector3[5];\r\n const v2 = MathTmp.Vector3[7];\r\n const tmp = MathTmp.Vector3[8];\r\n\r\n v0.copyFrom(p1p0).scaleInPlace(1 / p1p0L);\r\n tmp.copyFrom(p2p0).scaleInPlace(1 / p2p0L);\r\n v0.addInPlace(tmp).scaleInPlace(-1);\r\n\r\n v1.copyFrom(p1p0).scaleInPlace(-1 / p1p0L);\r\n tmp.copyFrom(p2p1).scaleInPlace(1 / p2p1L);\r\n v1.addInPlace(tmp).scaleInPlace(-1);\r\n\r\n v2.copyFrom(p2p1).scaleInPlace(-1 / p2p1L);\r\n tmp.copyFrom(p2p0).scaleInPlace(-1 / p2p0L);\r\n v2.addInPlace(tmp).scaleInPlace(-1);\r\n\r\n // Determines which edge of the triangle is closest to \"proj\"\r\n const projP = MathTmp.Vector3[9];\r\n let dot;\r\n projP.copyFrom(proj).subtractInPlace(p0);\r\n Vector3.CrossToRef(v0, projP, tmp);\r\n dot = Vector3.Dot(tmp, normal);\r\n const s0 = dot;\r\n\r\n projP.copyFrom(proj).subtractInPlace(p1);\r\n Vector3.CrossToRef(v1, projP, tmp);\r\n dot = Vector3.Dot(tmp, normal);\r\n const s1 = dot;\r\n\r\n projP.copyFrom(proj).subtractInPlace(p2);\r\n Vector3.CrossToRef(v2, projP, tmp);\r\n dot = Vector3.Dot(tmp, normal);\r\n const s2 = dot;\r\n\r\n const edge = MathTmp.Vector3[10];\r\n let e0, e1;\r\n if (s0 > 0 && s1 < 0) {\r\n edge.copyFrom(p1p0);\r\n e0 = p0;\r\n e1 = p1;\r\n } else if (s1 > 0 && s2 < 0) {\r\n edge.copyFrom(p2p1);\r\n e0 = p1;\r\n e1 = p2;\r\n } else {\r\n edge.copyFrom(p2p0).scaleInPlace(-1);\r\n e0 = p2;\r\n e1 = p0;\r\n }\r\n\r\n // Determines if \"proj\" lies inside the triangle\r\n const tmp2 = MathTmp.Vector3[9];\r\n const tmp3 = MathTmp.Vector3[4];\r\n e0.subtractToRef(proj, tmp);\r\n e1.subtractToRef(proj, tmp2);\r\n Vector3.CrossToRef(tmp, tmp2, tmp3);\r\n const isOutside = Vector3.Dot(tmp3, normal) < 0;\r\n\r\n // If inside, we already found the projected point, \"proj\"\r\n if (!isOutside) {\r\n ref.copyFrom(proj);\r\n return Math.abs(l * cosA);\r\n }\r\n\r\n // If outside, we find \"triProj\", the closest point from \"proj\" on the closest edge\r\n const r = MathTmp.Vector3[5];\r\n Vector3.CrossToRef(edge, tmp3, r);\r\n r.normalize();\r\n const e0proj = MathTmp.Vector3[9];\r\n e0proj.copyFrom(e0).subtractInPlace(proj);\r\n const e0projL = e0proj.length();\r\n if (e0projL < Epsilon) {\r\n // Proj is e0\r\n ref.copyFrom(e0);\r\n return Vector3.Distance(vector, e0);\r\n }\r\n e0proj.normalizeFromLength(e0projL);\r\n const cosG = Vector3.Dot(r, e0proj);\r\n const triProj = MathTmp.Vector3[7];\r\n triProj.copyFrom(proj).addInPlace(r.scaleInPlace(e0projL * cosG));\r\n\r\n // Now we clamp \"triProj\" so it lies between e0 and e1\r\n tmp.copyFrom(triProj).subtractInPlace(e0);\r\n l = edge.length();\r\n edge.normalizeFromLength(l);\r\n let t = Vector3.Dot(tmp, edge) / Math.max(l, Epsilon);\r\n t = Clamp(t, 0, 1);\r\n triProj.copyFrom(e0).addInPlace(edge.scaleInPlace(t * l));\r\n ref.copyFrom(triProj);\r\n\r\n return Vector3.Distance(vector, triProj);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 located at the center between \"value1\" and \"value2\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#72\r\n * @param value1 defines the first operand\r\n * @param value2 defines the second operand\r\n * @returns the new Vector3\r\n */\r\n public static Center(value1: DeepImmutable, value2: DeepImmutable): Vector3 {\r\n return Vector3.CenterToRef(value1, value2, Vector3.Zero());\r\n }\r\n\r\n /**\r\n * Gets the center of the vectors \"value1\" and \"value2\" and stores the result in the vector \"ref\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#73\r\n * @param value1 defines first vector\r\n * @param value2 defines second vector\r\n * @param ref defines third vector\r\n * @returns ref\r\n */\r\n public static CenterToRef(value1: DeepImmutable, value2: DeepImmutable, ref: T): T {\r\n return ref.copyFromFloats((value1._x + value2._x) / 2, (value1._y + value2._y) / 2, (value1._z + value2._z) / 2);\r\n }\r\n\r\n /**\r\n * Given three orthogonal normalized left-handed oriented Vector3 axis in space (target system),\r\n * RotationFromAxis() returns the rotation Euler angles (ex : rotation.x, rotation.y, rotation.z) to apply\r\n * to something in order to rotate it from its local system to the given target system\r\n * Note: axis1, axis2 and axis3 are normalized during this operation\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#106\r\n * @param axis1 defines the first axis\r\n * @param axis2 defines the second axis\r\n * @param axis3 defines the third axis\r\n * @returns a new Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/target_align\r\n */\r\n public static RotationFromAxis(axis1: DeepImmutable, axis2: DeepImmutable, axis3: DeepImmutable): T {\r\n const rotation = new (axis1.constructor as Constructor)();\r\n Vector3.RotationFromAxisToRef(axis1, axis2, axis3, rotation);\r\n return rotation;\r\n }\r\n\r\n /**\r\n * The same than RotationFromAxis but updates the given ref Vector3 parameter instead of returning a new Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#107\r\n * @param axis1 defines the first axis\r\n * @param axis2 defines the second axis\r\n * @param axis3 defines the third axis\r\n * @param ref defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static RotationFromAxisToRef(axis1: DeepImmutable, axis2: DeepImmutable, axis3: DeepImmutable, ref: T): T {\r\n const quat = MathTmp.Quaternion[0];\r\n Quaternion.RotationQuaternionFromAxisToRef(axis1, axis2, axis3, quat);\r\n quat.toEulerAnglesToRef(ref);\r\n return ref;\r\n }\r\n}\r\nVector3 satisfies VectorStatic;\r\nObject.defineProperties(Vector3.prototype, {\r\n dimension: { value: [3] },\r\n rank: { value: 1 },\r\n});\r\n\r\n/**\r\n * Vector4 class created for EulerAngle class conversion to Quaternion\r\n */\r\nexport class Vector4 implements Vector>, IVector4Like {\r\n private static _ZeroReadOnly = Vector4.Zero() as DeepImmutable;\r\n\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: Readonly<[4]>;\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 1;\r\n\r\n /**\r\n * Creates a Vector4 object from the given floats.\r\n * @param x x value of the vector\r\n * @param y y value of the vector\r\n * @param z z value of the vector\r\n * @param w w value of the vector\r\n */\r\n constructor(\r\n /** x value of the vector */\r\n public x: number = 0,\r\n /** y value of the vector */\r\n public y: number = 0,\r\n /** z value of the vector */\r\n public z: number = 0,\r\n /** w value of the vector */\r\n public w: number = 0\r\n ) {}\r\n\r\n /**\r\n * Returns the string with the Vector4 coordinates.\r\n * @returns a string containing all the vector values\r\n */\r\n public toString(): string {\r\n return `{X: ${this.x} Y: ${this.y} Z: ${this.z} W: ${this.w}}`;\r\n }\r\n\r\n /**\r\n * Returns the string \"Vector4\".\r\n * @returns \"Vector4\"\r\n */\r\n public getClassName(): string {\r\n return \"Vector4\";\r\n }\r\n\r\n /**\r\n * Returns the Vector4 hash code.\r\n * @returns a unique hash code\r\n */\r\n public getHashCode(): number {\r\n const x = _ExtractAsInt(this.x);\r\n const y = _ExtractAsInt(this.y);\r\n const z = _ExtractAsInt(this.z);\r\n const w = _ExtractAsInt(this.w);\r\n\r\n let hash = x;\r\n hash = (hash * 397) ^ y;\r\n hash = (hash * 397) ^ z;\r\n hash = (hash * 397) ^ w;\r\n return hash;\r\n }\r\n\r\n // Operators\r\n /**\r\n * Returns a new array populated with 4 elements : the Vector4 coordinates.\r\n * @returns the resulting array\r\n */\r\n public asArray(): Tuple {\r\n return [this.x, this.y, this.z, this.w];\r\n }\r\n\r\n /**\r\n * Populates the given array from the given index with the Vector4 coordinates.\r\n * @param array array to populate\r\n * @param index index of the array to start at (default: 0)\r\n * @returns the Vector4.\r\n */\r\n public toArray(array: FloatArray, index?: number): this {\r\n if (index === undefined) {\r\n index = 0;\r\n }\r\n array[index] = this.x;\r\n array[index + 1] = this.y;\r\n array[index + 2] = this.z;\r\n array[index + 3] = this.w;\r\n return this;\r\n }\r\n\r\n /**\r\n * Update the current vector from an array\r\n * @param array defines the destination array\r\n * @param offset defines the offset in the destination array\r\n * @returns the current Vector3\r\n */\r\n public fromArray(array: FloatArray, offset: number = 0): this {\r\n Vector4.FromArrayToRef(array, offset, this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the given vector to the current Vector4.\r\n * @param otherVector the vector to add\r\n * @returns the updated Vector4.\r\n */\r\n public addInPlace(otherVector: DeepImmutable): this {\r\n this.x += otherVector.x;\r\n this.y += otherVector.y;\r\n this.z += otherVector.z;\r\n this.w += otherVector.w;\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the given coordinates to the current Vector4\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @param w defines the w coordinate of the operand\r\n * @returns the current updated Vector4\r\n */\r\n public addInPlaceFromFloats(x: number, y: number, z: number, w: number): this {\r\n this.x += x;\r\n this.y += y;\r\n this.z += z;\r\n this.w += w;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 as the result of the addition of the current Vector4 and the given one.\r\n * @param otherVector the vector to add\r\n * @returns the resulting vector\r\n */\r\n public add(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x + otherVector.x, this.y + otherVector.y, this.z + otherVector.z, this.w + otherVector.w);\r\n }\r\n\r\n /**\r\n * Updates the given vector \"result\" with the result of the addition of the current Vector4 and the given one.\r\n * @param otherVector the vector to add\r\n * @param result the vector to store the result\r\n * @returns result input\r\n */\r\n public addToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x + otherVector.x;\r\n result.y = this.y + otherVector.y;\r\n result.z = this.z + otherVector.z;\r\n result.w = this.w + otherVector.w;\r\n return result;\r\n }\r\n\r\n /**\r\n * Subtract in place the given vector from the current Vector4.\r\n * @param otherVector the vector to subtract\r\n * @returns the updated Vector4.\r\n */\r\n public subtractInPlace(otherVector: DeepImmutable): this {\r\n this.x -= otherVector.x;\r\n this.y -= otherVector.y;\r\n this.z -= otherVector.z;\r\n this.w -= otherVector.w;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 with the result of the subtraction of the given vector from the current Vector4.\r\n * @param otherVector the vector to add\r\n * @returns the new vector with the result\r\n */\r\n public subtract(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x - otherVector.x, this.y - otherVector.y, this.z - otherVector.z, this.w - otherVector.w);\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the result of the subtraction of the given vector from the current Vector4.\r\n * @param otherVector the vector to subtract\r\n * @param result the vector to store the result\r\n * @returns result input\r\n */\r\n public subtractToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x - otherVector.x;\r\n result.y = this.y - otherVector.y;\r\n result.z = this.z - otherVector.z;\r\n result.w = this.w - otherVector.w;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the result of the subtraction of the given floats from the current Vector4 coordinates.\r\n * @param x value to subtract\r\n * @param y value to subtract\r\n * @param z value to subtract\r\n * @param w value to subtract\r\n * @returns new vector containing the result\r\n */\r\n public subtractFromFloats(x: number, y: number, z: number, w: number): this {\r\n return new (this.constructor as Constructor)(this.x - x, this.y - y, this.z - z, this.w - w);\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" set with the result of the subtraction of the given floats from the current Vector4 coordinates.\r\n * @param x value to subtract\r\n * @param y value to subtract\r\n * @param z value to subtract\r\n * @param w value to subtract\r\n * @param result the vector to store the result in\r\n * @returns result input\r\n */\r\n public subtractFromFloatsToRef(x: number, y: number, z: number, w: number, result: T): T {\r\n result.x = this.x - x;\r\n result.y = this.y - y;\r\n result.z = this.z - z;\r\n result.w = this.w - w;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the current Vector4 negated coordinates.\r\n * @returns a new vector with the negated values\r\n */\r\n public negate(): this {\r\n return new (this.constructor as Constructor)(-this.x, -this.y, -this.z, -this.w);\r\n }\r\n\r\n /**\r\n * Negate this vector in place\r\n * @returns this\r\n */\r\n public negateInPlace(): this {\r\n this.x *= -1;\r\n this.y *= -1;\r\n this.z *= -1;\r\n this.w *= -1;\r\n return this;\r\n }\r\n\r\n /**\r\n * Negate the current Vector4 and stores the result in the given vector \"result\" coordinates\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public negateToRef(result: T): T {\r\n return result.copyFromFloats(this.x * -1, this.y * -1, this.z * -1, this.w * -1);\r\n }\r\n\r\n /**\r\n * Multiplies the current Vector4 coordinates by scale (float).\r\n * @param scale the number to scale with\r\n * @returns the updated Vector4.\r\n */\r\n public scaleInPlace(scale: number): this {\r\n this.x *= scale;\r\n this.y *= scale;\r\n this.z *= scale;\r\n this.w *= scale;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the current Vector4 coordinates multiplied by scale (float).\r\n * @param scale the number to scale with\r\n * @returns a new vector with the result\r\n */\r\n public scale(scale: number): this {\r\n return new (this.constructor as Constructor)(this.x * scale, this.y * scale, this.z * scale, this.w * scale);\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the current Vector4 coordinates multiplied by scale (float).\r\n * @param scale the number to scale with\r\n * @param result a vector to store the result in\r\n * @returns result input\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n result.x = this.x * scale;\r\n result.y = this.y * scale;\r\n result.z = this.z * scale;\r\n result.w = this.w * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Scale the current Vector4 values by a factor and add the result to a given Vector4\r\n * @param scale defines the scale factor\r\n * @param result defines the Vector4 object where to store the result\r\n * @returns result input\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n result.x += this.x * scale;\r\n result.y += this.y * scale;\r\n result.z += this.z * scale;\r\n result.w += this.w * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Boolean : True if the current Vector4 coordinates are stricly equal to the given ones.\r\n * @param otherVector the vector to compare against\r\n * @returns true if they are equal\r\n */\r\n public equals(otherVector: DeepImmutable): boolean {\r\n return otherVector && this.x === otherVector.x && this.y === otherVector.y && this.z === otherVector.z && this.w === otherVector.w;\r\n }\r\n\r\n /**\r\n * Boolean : True if the current Vector4 coordinates are each beneath the distance \"epsilon\" from the given vector ones.\r\n * @param otherVector vector to compare against\r\n * @param epsilon (Default: very small number)\r\n * @returns true if they are equal\r\n */\r\n public equalsWithEpsilon(otherVector: DeepImmutable, epsilon: number = Epsilon): boolean {\r\n return (\r\n otherVector &&\r\n WithinEpsilon(this.x, otherVector.x, epsilon) &&\r\n WithinEpsilon(this.y, otherVector.y, epsilon) &&\r\n WithinEpsilon(this.z, otherVector.z, epsilon) &&\r\n WithinEpsilon(this.w, otherVector.w, epsilon)\r\n );\r\n }\r\n\r\n /**\r\n * Boolean : True if the given floats are strictly equal to the current Vector4 coordinates.\r\n * @param x x value to compare against\r\n * @param y y value to compare against\r\n * @param z z value to compare against\r\n * @param w w value to compare against\r\n * @returns true if equal\r\n */\r\n public equalsToFloats(x: number, y: number, z: number, w: number): boolean {\r\n return this.x === x && this.y === y && this.z === z && this.w === w;\r\n }\r\n\r\n /**\r\n * Multiplies in place the current Vector4 by the given one.\r\n * @param otherVector vector to multiple with\r\n * @returns the updated Vector4.\r\n */\r\n public multiplyInPlace(otherVector: DeepImmutable): this {\r\n this.x *= otherVector.x;\r\n this.y *= otherVector.y;\r\n this.z *= otherVector.z;\r\n this.w *= otherVector.w;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the multiplication result of the current Vector4 and the given one.\r\n * @param otherVector vector to multiple with\r\n * @returns resulting new vector\r\n */\r\n public multiply(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x * otherVector.x, this.y * otherVector.y, this.z * otherVector.z, this.w * otherVector.w);\r\n }\r\n /**\r\n * Updates the given vector \"result\" with the multiplication result of the current Vector4 and the given one.\r\n * @param otherVector vector to multiple with\r\n * @param result vector to store the result\r\n * @returns result input\r\n */\r\n public multiplyToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x * otherVector.x;\r\n result.y = this.y * otherVector.y;\r\n result.z = this.z * otherVector.z;\r\n result.w = this.w * otherVector.w;\r\n return result;\r\n }\r\n /**\r\n * Returns a new Vector4 set with the multiplication result of the given floats and the current Vector4 coordinates.\r\n * @param x x value multiply with\r\n * @param y y value multiply with\r\n * @param z z value multiply with\r\n * @param w w value multiply with\r\n * @returns resulting new vector\r\n */\r\n public multiplyByFloats(x: number, y: number, z: number, w: number): this {\r\n return new (this.constructor as Constructor)(this.x * x, this.y * y, this.z * z, this.w * w);\r\n }\r\n /**\r\n * Returns a new Vector4 set with the division result of the current Vector4 by the given one.\r\n * @param otherVector vector to devide with\r\n * @returns resulting new vector\r\n */\r\n public divide(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x / otherVector.x, this.y / otherVector.y, this.z / otherVector.z, this.w / otherVector.w);\r\n }\r\n /**\r\n * Updates the given vector \"result\" with the division result of the current Vector4 by the given one.\r\n * @param otherVector vector to devide with\r\n * @param result vector to store the result\r\n * @returns result input\r\n */\r\n public divideToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x / otherVector.x;\r\n result.y = this.y / otherVector.y;\r\n result.z = this.z / otherVector.z;\r\n result.w = this.w / otherVector.w;\r\n return result;\r\n }\r\n\r\n /**\r\n * Divides the current Vector3 coordinates by the given ones.\r\n * @param otherVector vector to devide with\r\n * @returns the updated Vector3.\r\n */\r\n public divideInPlace(otherVector: DeepImmutable): this {\r\n return this.divideToRef(otherVector, this);\r\n }\r\n\r\n /**\r\n * Updates the Vector4 coordinates with the minimum values between its own and the given vector ones\r\n * @param other defines the second operand\r\n * @returns the current updated Vector4\r\n */\r\n public minimizeInPlace(other: DeepImmutable): this {\r\n if (other.x < this.x) {\r\n this.x = other.x;\r\n }\r\n if (other.y < this.y) {\r\n this.y = other.y;\r\n }\r\n if (other.z < this.z) {\r\n this.z = other.z;\r\n }\r\n if (other.w < this.w) {\r\n this.w = other.w;\r\n }\r\n return this;\r\n }\r\n /**\r\n * Updates the Vector4 coordinates with the maximum values between its own and the given vector ones\r\n * @param other defines the second operand\r\n * @returns the current updated Vector4\r\n */\r\n public maximizeInPlace(other: DeepImmutable): this {\r\n if (other.x > this.x) {\r\n this.x = other.x;\r\n }\r\n if (other.y > this.y) {\r\n this.y = other.y;\r\n }\r\n if (other.z > this.z) {\r\n this.z = other.z;\r\n }\r\n if (other.w > this.w) {\r\n this.w = other.w;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Vector4 with the minimal coordinate values between its and the given coordinates\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @param w defines the w coordinate of the operand\r\n * @returns the current updated Vector4\r\n */\r\n public minimizeInPlaceFromFloats(x: number, y: number, z: number, w: number): this {\r\n this.x = Math.min(x, this.x);\r\n this.y = Math.min(y, this.y);\r\n this.z = Math.min(z, this.z);\r\n this.w = Math.min(w, this.w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Vector4 with the maximal coordinate values between its and the given coordinates.\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @param w defines the w coordinate of the operand\r\n * @returns the current updated Vector4\r\n */\r\n public maximizeInPlaceFromFloats(x: number, y: number, z: number, w: number): this {\r\n this.x = Math.max(x, this.x);\r\n this.y = Math.max(y, this.y);\r\n this.z = Math.max(z, this.z);\r\n this.w = Math.max(w, this.w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the current Vector4's floored values and stores them in result\r\n * @param result the vector to store the result in\r\n * @returns the result vector\r\n */\r\n public floorToRef(result: T): T {\r\n result.x = Math.floor(this.x);\r\n result.y = Math.floor(this.y);\r\n result.z = Math.floor(this.z);\r\n result.w = Math.floor(this.w);\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector4 from current Vector4 floored values\r\n * @returns a new Vector4\r\n */\r\n public floor(): this {\r\n return new (this.constructor as Constructor)(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z), Math.floor(this.w));\r\n }\r\n\r\n /**\r\n * Gets the current Vector4's fractional values and stores them in result\r\n * @param result the vector to store the result in\r\n * @returns the result vector\r\n */\r\n public fractToRef(result: T): T {\r\n result.x = this.x - Math.floor(this.x);\r\n result.y = this.y - Math.floor(this.y);\r\n result.z = this.z - Math.floor(this.z);\r\n result.w = this.w - Math.floor(this.w);\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector4 from current Vector4 fractional values\r\n * @returns a new Vector4\r\n */\r\n public fract(): this {\r\n return new (this.constructor as Constructor)(\r\n this.x - Math.floor(this.x),\r\n this.y - Math.floor(this.y),\r\n this.z - Math.floor(this.z),\r\n this.w - Math.floor(this.w)\r\n );\r\n }\r\n\r\n // Properties\r\n /**\r\n * Returns the Vector4 length (float).\r\n * @returns the length\r\n */\r\n public length(): number {\r\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\r\n }\r\n /**\r\n * Returns the Vector4 squared length (float).\r\n * @returns the length squared\r\n */\r\n public lengthSquared(): number {\r\n return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\r\n }\r\n\r\n // Methods\r\n /**\r\n * Normalizes in place the Vector4.\r\n * @returns the updated Vector4.\r\n */\r\n public normalize(): this {\r\n return this.normalizeFromLength(this.length());\r\n }\r\n\r\n /**\r\n * Normalize the current Vector4 with the given input length.\r\n * Please note that this is an in place operation.\r\n * @param len the length of the vector\r\n * @returns the current updated Vector4\r\n */\r\n public normalizeFromLength(len: number): this {\r\n if (len === 0 || len === 1.0) {\r\n return this;\r\n }\r\n\r\n return this.scaleInPlace(1.0 / len);\r\n }\r\n\r\n /**\r\n * Normalize the current Vector4 to a new vector\r\n * @returns the new Vector4\r\n */\r\n public normalizeToNew(): this {\r\n const normalized = new (this.constructor as Constructor)();\r\n this.normalizeToRef(normalized);\r\n return normalized;\r\n }\r\n\r\n /**\r\n * Normalize the current Vector4 to the reference\r\n * @param reference define the Vector4 to update\r\n * @returns the updated Vector4\r\n */\r\n public normalizeToRef(reference: T): T {\r\n const len = this.length();\r\n if (len === 0 || len === 1.0) {\r\n return reference.copyFrom(this);\r\n }\r\n\r\n return this.scaleToRef(1.0 / len, reference);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 from the Vector4 (x, y, z) coordinates.\r\n * @returns this converted to a new vector3\r\n */\r\n public toVector3(): Vector3 {\r\n return new Vector3(this.x, this.y, this.z);\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 copied from the current one.\r\n * @returns the new cloned vector\r\n */\r\n public clone(): this {\r\n return new (this.constructor as Constructor)(this.x, this.y, this.z, this.w);\r\n }\r\n /**\r\n * Updates the current Vector4 with the given one coordinates.\r\n * @param source the source vector to copy from\r\n * @returns the updated Vector4.\r\n */\r\n public copyFrom(source: DeepImmutable): this {\r\n this.x = source.x;\r\n this.y = source.y;\r\n this.z = source.z;\r\n this.w = source.w;\r\n return this;\r\n }\r\n /**\r\n * Updates the current Vector4 coordinates with the given floats.\r\n * @param x float to copy from\r\n * @param y float to copy from\r\n * @param z float to copy from\r\n * @param w float to copy from\r\n * @returns the updated Vector4.\r\n */\r\n public copyFromFloats(x: number, y: number, z: number, w: number): this {\r\n this.x = x;\r\n this.y = y;\r\n this.z = z;\r\n this.w = w;\r\n return this;\r\n }\r\n /**\r\n * Updates the current Vector4 coordinates with the given floats.\r\n * @param x float to set from\r\n * @param y float to set from\r\n * @param z float to set from\r\n * @param w float to set from\r\n * @returns the updated Vector4.\r\n */\r\n public set(x: number, y: number, z: number, w: number): this {\r\n return this.copyFromFloats(x, y, z, w);\r\n }\r\n\r\n /**\r\n * Copies the given float to the current Vector4 coordinates\r\n * @param v defines the x, y, z and w coordinates of the operand\r\n * @returns the current updated Vector4\r\n */\r\n public setAll(v: number): this {\r\n this.x = this.y = this.z = this.w = v;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the dot product (float) between the current vectors and \"otherVector\"\r\n * @param otherVector defines the right operand\r\n * @returns the dot product\r\n */\r\n public dot(otherVector: DeepImmutable): number {\r\n return this.x * otherVector.x + this.y * otherVector.y + this.z * otherVector.z + this.w * otherVector.w;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Returns a new Vector4 set from the starting index of the given array.\r\n * @param array the array to pull values from\r\n * @param offset the offset into the array to start at\r\n * @returns the new vector\r\n */\r\n public static FromArray(array: DeepImmutable>, offset?: number): Vector4 {\r\n if (!offset) {\r\n offset = 0;\r\n }\r\n return new Vector4(array[offset], array[offset + 1], array[offset + 2], array[offset + 3]);\r\n }\r\n /**\r\n * Updates the given vector \"result\" from the starting index of the given array.\r\n * @param array the array to pull values from\r\n * @param offset the offset into the array to start at\r\n * @param result the vector to store the result in\r\n * @returns result input\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number, result: T): T {\r\n result.x = array[offset];\r\n result.y = array[offset + 1];\r\n result.z = array[offset + 2];\r\n result.w = array[offset + 3];\r\n return result;\r\n }\r\n /**\r\n * Updates the given vector \"result\" from the starting index of the given Float32Array.\r\n * @param array the array to pull values from\r\n * @param offset the offset into the array to start at\r\n * @param result the vector to store the result in\r\n * @returns result input\r\n */\r\n public static FromFloatArrayToRef(array: DeepImmutable, offset: number, result: T): T {\r\n Vector4.FromArrayToRef(array, offset, result);\r\n return result;\r\n }\r\n /**\r\n * Updates the given vector \"result\" coordinates from the given floats.\r\n * @param x float to set from\r\n * @param y float to set from\r\n * @param z float to set from\r\n * @param w float to set from\r\n * @param result the vector to the floats in\r\n * @returns result input\r\n */\r\n public static FromFloatsToRef(x: number, y: number, z: number, w: number, result: T): T {\r\n result.x = x;\r\n result.y = y;\r\n result.z = z;\r\n result.w = w;\r\n return result;\r\n }\r\n /**\r\n * Returns a new Vector4 set to (0.0, 0.0, 0.0, 0.0)\r\n * @returns the new vector\r\n */\r\n public static Zero(): Vector4 {\r\n return new Vector4(0.0, 0.0, 0.0, 0.0);\r\n }\r\n /**\r\n * Returns a new Vector4 set to (1.0, 1.0, 1.0, 1.0)\r\n * @returns the new vector\r\n */\r\n public static One(): Vector4 {\r\n return new Vector4(1.0, 1.0, 1.0, 1.0);\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @returns a Vector4 with random values between min and max\r\n */\r\n public static Random(min: number = 0, max: number = 1): Vector4 {\r\n return new Vector4(RandomRange(min, max), RandomRange(min, max), RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Sets a Vector4 with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @param ref the ref to store the values in\r\n * @returns the ref with random values between min and max\r\n */\r\n public static RandomToRef(min: number = 0, max: number = 1, ref: T): T {\r\n return ref.copyFromFloats(RandomRange(min, max), RandomRange(min, max), RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\r\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\r\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\r\n * @param value defines the current value\r\n * @param min defines the lower range value\r\n * @param max defines the upper range value\r\n * @returns the new Vector4\r\n */\r\n public static Clamp(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable): T {\r\n const result = new (value.constructor as Constructor)();\r\n Vector4.ClampToRef(value, min, max, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\r\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\r\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\r\n * @param value defines the current value\r\n * @param min defines the lower range value\r\n * @param max defines the upper range value\r\n * @param result defines the Vector4 where to store the result\r\n * @returns result input\r\n */\r\n public static ClampToRef(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable, result: T): T {\r\n return result.copyFromFloats(Clamp(value.x, min.x, max.x), Clamp(value.y, min.y, max.y), Clamp(value.z, min.z, max.z), Clamp(value.w, min.w, max.w));\r\n }\r\n\r\n /**\r\n * Checks if a given vector is inside a specific range\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#75\r\n * @param v defines the vector to test\r\n * @param min defines the minimum range\r\n * @param max defines the maximum range\r\n */\r\n public static CheckExtends(v: Vector4, min: Vector4, max: Vector4): void {\r\n min.minimizeInPlace(v);\r\n max.maximizeInPlace(v);\r\n }\r\n\r\n /**\r\n * Gets a zero Vector4 that must not be updated\r\n */\r\n public static get ZeroReadOnly(): DeepImmutable {\r\n return Vector4._ZeroReadOnly;\r\n }\r\n /**\r\n * Returns a new normalized Vector4 from the given one.\r\n * @param vector the vector to normalize\r\n * @returns the vector\r\n */\r\n public static Normalize(vector: DeepImmutable): Vector4 {\r\n const result = Vector4.Zero();\r\n Vector4.NormalizeToRef(vector, result);\r\n return result;\r\n }\r\n /**\r\n * Updates the given vector \"result\" from the normalization of the given one.\r\n * @param vector the vector to normalize\r\n * @param result the vector to store the result in\r\n * @returns result input\r\n */\r\n public static NormalizeToRef(vector: DeepImmutable, result: T): T {\r\n vector.normalizeToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a vector with the minimum values from the left and right vectors\r\n * @param left left vector to minimize\r\n * @param right right vector to minimize\r\n * @returns a new vector with the minimum of the left and right vector values\r\n */\r\n public static Minimize(left: DeepImmutable, right: DeepImmutable): T {\r\n const min = new (left.constructor as Constructor)();\r\n min.copyFrom(left);\r\n min.minimizeInPlace(right);\r\n return min;\r\n }\r\n\r\n /**\r\n * Returns a vector with the maximum values from the left and right vectors\r\n * @param left left vector to maximize\r\n * @param right right vector to maximize\r\n * @returns a new vector with the maximum of the left and right vector values\r\n */\r\n public static Maximize(left: DeepImmutable, right: DeepImmutable): T {\r\n const max = new (left.constructor as Constructor)();\r\n max.copyFrom(left);\r\n max.maximizeInPlace(right);\r\n return max;\r\n }\r\n /**\r\n * Returns the distance (float) between the vectors \"value1\" and \"value2\".\r\n * @param value1 value to calulate the distance between\r\n * @param value2 value to calulate the distance between\r\n * @returns the distance between the two vectors\r\n */\r\n public static Distance(value1: DeepImmutable, value2: DeepImmutable): number {\r\n return Math.sqrt(Vector4.DistanceSquared(value1, value2));\r\n }\r\n /**\r\n * Returns the squared distance (float) between the vectors \"value1\" and \"value2\".\r\n * @param value1 value to calulate the distance between\r\n * @param value2 value to calulate the distance between\r\n * @returns the distance between the two vectors squared\r\n */\r\n public static DistanceSquared(value1: DeepImmutable, value2: DeepImmutable): number {\r\n const x = value1.x - value2.x;\r\n const y = value1.y - value2.y;\r\n const z = value1.z - value2.z;\r\n const w = value1.w - value2.w;\r\n\r\n return x * x + y * y + z * z + w * w;\r\n }\r\n /**\r\n * Returns a new Vector4 located at the center between the vectors \"value1\" and \"value2\".\r\n * @param value1 value to calulate the center between\r\n * @param value2 value to calulate the center between\r\n * @returns the center between the two vectors\r\n */\r\n public static Center(value1: DeepImmutable, value2: DeepImmutable): Vector4 {\r\n return Vector4.CenterToRef(value1, value2, Vector4.Zero());\r\n }\r\n\r\n /**\r\n * Gets the center of the vectors \"value1\" and \"value2\" and stores the result in the vector \"ref\"\r\n * @param value1 defines first vector\r\n * @param value2 defines second vector\r\n * @param ref defines third vector\r\n * @returns ref\r\n */\r\n public static CenterToRef(value1: DeepImmutable, value2: DeepImmutable, ref: T): T {\r\n return ref.copyFromFloats((value1.x + value2.x) / 2, (value1.y + value2.y) / 2, (value1.z + value2.z) / 2, (value1.w + value2.w) / 2);\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the result of the transformation by the given matrix of the given vector.\r\n * This method computes tranformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\r\n * The difference with Vector3.TransformCoordinates is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead\r\n * @param vector defines the Vector3 to transform\r\n * @param transformation defines the transformation matrix\r\n * @returns the transformed Vector4\r\n */\r\n public static TransformCoordinates(vector: DeepImmutable, transformation: DeepImmutable): Vector4 {\r\n const result = Vector4.Zero();\r\n Vector4.TransformCoordinatesToRef(vector, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given vector\r\n * This method computes tranformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\r\n * The difference with Vector3.TransformCoordinatesToRef is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead\r\n * @param vector defines the Vector3 to transform\r\n * @param transformation defines the transformation matrix\r\n * @param result defines the Vector4 where to store the result\r\n * @returns result input\r\n */\r\n public static TransformCoordinatesToRef(vector: DeepImmutable, transformation: DeepImmutable, result: T): T {\r\n Vector4.TransformCoordinatesFromFloatsToRef(vector._x, vector._y, vector._z, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given floats (x, y, z)\r\n * This method computes tranformed coordinates only, not transformed direction vectors\r\n * The difference with Vector3.TransformCoordinatesFromFloatsToRef is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead\r\n * @param x define the x coordinate of the source vector\r\n * @param y define the y coordinate of the source vector\r\n * @param z define the z coordinate of the source vector\r\n * @param transformation defines the transformation matrix\r\n * @param result defines the Vector4 where to store the result\r\n * @returns result input\r\n */\r\n public static TransformCoordinatesFromFloatsToRef(x: number, y: number, z: number, transformation: DeepImmutable, result: T): T {\r\n const m = transformation.m;\r\n const rx = x * m[0] + y * m[4] + z * m[8] + m[12];\r\n const ry = x * m[1] + y * m[5] + z * m[9] + m[13];\r\n const rz = x * m[2] + y * m[6] + z * m[10] + m[14];\r\n const rw = x * m[3] + y * m[7] + z * m[11] + m[15];\r\n\r\n result.x = rx;\r\n result.y = ry;\r\n result.z = rz;\r\n result.w = rw;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the result of the normal transformation by the given matrix of the given vector.\r\n * This methods computes transformed normalized direction vectors only.\r\n * @param vector the vector to transform\r\n * @param transformation the transformation matrix to apply\r\n * @returns the new vector\r\n */\r\n public static TransformNormal(vector: DeepImmutable, transformation: DeepImmutable): T {\r\n const result = new (vector.constructor as Constructor)();\r\n Vector4.TransformNormalToRef(vector, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given vector.\r\n * This methods computes transformed normalized direction vectors only.\r\n * @param vector the vector to transform\r\n * @param transformation the transformation matrix to apply\r\n * @param result the vector to store the result in\r\n * @returns result input\r\n */\r\n public static TransformNormalToRef(vector: DeepImmutable, transformation: DeepImmutable, result: T): T {\r\n const m = transformation.m;\r\n const x = vector.x * m[0] + vector.y * m[4] + vector.z * m[8];\r\n const y = vector.x * m[1] + vector.y * m[5] + vector.z * m[9];\r\n const z = vector.x * m[2] + vector.y * m[6] + vector.z * m[10];\r\n result.x = x;\r\n result.y = y;\r\n result.z = z;\r\n result.w = vector.w;\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given floats (x, y, z, w).\r\n * This methods computes transformed normalized direction vectors only.\r\n * @param x value to transform\r\n * @param y value to transform\r\n * @param z value to transform\r\n * @param w value to transform\r\n * @param transformation the transformation matrix to apply\r\n * @param result the vector to store the results in\r\n * @returns result input\r\n */\r\n public static TransformNormalFromFloatsToRef(x: number, y: number, z: number, w: number, transformation: DeepImmutable, result: T): T {\r\n const m = transformation.m;\r\n result.x = x * m[0] + y * m[4] + z * m[8];\r\n result.y = x * m[1] + y * m[5] + z * m[9];\r\n result.z = x * m[2] + y * m[6] + z * m[10];\r\n result.w = w;\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new Vector4 from a Vector3\r\n * @param source defines the source data\r\n * @param w defines the 4th component (default is 0)\r\n * @returns a new Vector4\r\n */\r\n public static FromVector3(source: Vector3, w: number = 0) {\r\n return new Vector4(source._x, source._y, source._z, w);\r\n }\r\n\r\n /**\r\n * Returns the dot product (float) between the vectors \"left\" and \"right\"\r\n * @param left defines the left operand\r\n * @param right defines the right operand\r\n * @returns the dot product\r\n */\r\n public static Dot(left: DeepImmutable, right: DeepImmutable): number {\r\n return left.dot(right);\r\n }\r\n}\r\nVector4 satisfies VectorStatic;\r\nObject.defineProperties(Vector4.prototype, {\r\n dimension: { value: [4] },\r\n rank: { value: 1 },\r\n});\r\n\r\n/**\r\n * Class used to store quaternion data\r\n * Example Playground - Overview - https://playground.babylonjs.com/#L49EJ7#100\r\n * @see https://en.wikipedia.org/wiki/Quaternion\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms\r\n */\r\nexport class Quaternion implements Tensor>, IQuaternionLike {\r\n /** @internal */\r\n public _x: number;\r\n\r\n /** @internal */\r\n public _y: number;\r\n\r\n /** @internal */\r\n public _z: number;\r\n\r\n /** @internal */\r\n public _w: number;\r\n\r\n /** @internal */\r\n public _isDirty = true;\r\n\r\n /** Gets or sets the x coordinate */\r\n public get x() {\r\n return this._x;\r\n }\r\n\r\n public set x(value: number) {\r\n this._x = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /** Gets or sets the y coordinate */\r\n public get y() {\r\n return this._y;\r\n }\r\n\r\n public set y(value: number) {\r\n this._y = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /** Gets or sets the z coordinate */\r\n public get z() {\r\n return this._z;\r\n }\r\n\r\n public set z(value: number) {\r\n this._z = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /** Gets or sets the w coordinate */\r\n public get w() {\r\n return this._w;\r\n }\r\n\r\n public set w(value: number) {\r\n this._w = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: Readonly<[4]>;\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 1;\r\n\r\n /**\r\n * Creates a new Quaternion from the given floats\r\n * @param x defines the first component (0 by default)\r\n * @param y defines the second component (0 by default)\r\n * @param z defines the third component (0 by default)\r\n * @param w defines the fourth component (1.0 by default)\r\n */\r\n constructor(x: number = 0.0, y: number = 0.0, z: number = 0.0, w: number = 1.0) {\r\n this._x = x;\r\n this._y = y;\r\n this._z = z;\r\n this._w = w;\r\n }\r\n\r\n /**\r\n * Gets a string representation for the current quaternion\r\n * @returns a string with the Quaternion coordinates\r\n */\r\n public toString(): string {\r\n return `{X: ${this._x} Y: ${this._y} Z: ${this._z} W: ${this._w}}`;\r\n }\r\n\r\n /**\r\n * Gets the class name of the quaternion\r\n * @returns the string \"Quaternion\"\r\n */\r\n public getClassName(): string {\r\n return \"Quaternion\";\r\n }\r\n\r\n /**\r\n * Gets a hash code for this quaternion\r\n * @returns the quaternion hash code\r\n */\r\n public getHashCode(): number {\r\n const x = _ExtractAsInt(this._x);\r\n const y = _ExtractAsInt(this._y);\r\n const z = _ExtractAsInt(this._z);\r\n const w = _ExtractAsInt(this._w);\r\n\r\n let hash = x;\r\n hash = (hash * 397) ^ y;\r\n hash = (hash * 397) ^ z;\r\n hash = (hash * 397) ^ w;\r\n return hash;\r\n }\r\n\r\n /**\r\n * Copy the quaternion to an array\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#13\r\n * @returns a new array populated with 4 elements from the quaternion coordinates\r\n */\r\n public asArray(): Tuple {\r\n return [this._x, this._y, this._z, this._w];\r\n }\r\n\r\n /**\r\n * Stores from the starting index in the given array the Quaternion successive values\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#59\r\n * @param array defines the array where to store the x,y,z,w components\r\n * @param index defines an optional index in the target array to define where to start storing values\r\n * @returns the current Quaternion object\r\n */\r\n public toArray(array: FloatArray, index: number = 0): this {\r\n array[index] = this._x;\r\n array[index + 1] = this._y;\r\n array[index + 2] = this._z;\r\n array[index + 3] = this._w;\r\n return this;\r\n }\r\n\r\n public fromArray(array: FloatArray, index: number = 0): this {\r\n return Quaternion.FromArrayToRef(array, index, this);\r\n }\r\n\r\n /**\r\n * Check if two quaternions are equals\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#38\r\n * @param otherQuaternion defines the second operand\r\n * @returns true if the current quaternion and the given one coordinates are strictly equals\r\n */\r\n public equals(otherQuaternion: DeepImmutable): boolean {\r\n return otherQuaternion && this._x === otherQuaternion._x && this._y === otherQuaternion._y && this._z === otherQuaternion._z && this._w === otherQuaternion._w;\r\n }\r\n\r\n /**\r\n * Gets a boolean if two quaternions are equals (using an epsilon value)\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#37\r\n * @param otherQuaternion defines the other quaternion\r\n * @param epsilon defines the minimal distance to consider equality\r\n * @returns true if the given quaternion coordinates are close to the current ones by a distance of epsilon.\r\n */\r\n public equalsWithEpsilon(otherQuaternion: DeepImmutable, epsilon: number = Epsilon): boolean {\r\n return (\r\n otherQuaternion &&\r\n WithinEpsilon(this._x, otherQuaternion._x, epsilon) &&\r\n WithinEpsilon(this._y, otherQuaternion._y, epsilon) &&\r\n WithinEpsilon(this._z, otherQuaternion._z, epsilon) &&\r\n WithinEpsilon(this._w, otherQuaternion._w, epsilon)\r\n );\r\n }\r\n\r\n /**\r\n * Clone the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#12\r\n * @returns a new quaternion copied from the current one\r\n */\r\n public clone(): this {\r\n return new (this.constructor as Constructor)(this._x, this._y, this._z, this._w);\r\n }\r\n\r\n /**\r\n * Copy a quaternion to the current one\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#86\r\n * @param other defines the other quaternion\r\n * @returns the updated current quaternion\r\n */\r\n public copyFrom(other: DeepImmutable): this {\r\n this._x = other._x;\r\n this._y = other._y;\r\n this._z = other._z;\r\n this._w = other._w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current quaternion with the given float coordinates\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#87\r\n * @param x defines the x coordinate\r\n * @param y defines the y coordinate\r\n * @param z defines the z coordinate\r\n * @param w defines the w coordinate\r\n * @returns the updated current quaternion\r\n */\r\n public copyFromFloats(x: number, y: number, z: number, w: number): this {\r\n this._x = x;\r\n this._y = y;\r\n this._z = z;\r\n this._w = w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current quaternion from the given float coordinates\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#56\r\n * @param x defines the x coordinate\r\n * @param y defines the y coordinate\r\n * @param z defines the z coordinate\r\n * @param w defines the w coordinate\r\n * @returns the updated current quaternion\r\n */\r\n public set(x: number, y: number, z: number, w: number): this {\r\n return this.copyFromFloats(x, y, z, w);\r\n }\r\n\r\n public setAll(value: number): this {\r\n return this.copyFromFloats(value, value, value, value);\r\n }\r\n\r\n /**\r\n * Adds two quaternions\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#10\r\n * @param other defines the second operand\r\n * @returns a new quaternion as the addition result of the given one and the current quaternion\r\n */\r\n public add(other: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this._x + other._x, this._y + other._y, this._z + other._z, this._w + other._w);\r\n }\r\n\r\n /**\r\n * Add a quaternion to the current one\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#11\r\n * @param other defines the quaternion to add\r\n * @returns the current quaternion\r\n */\r\n public addInPlace(other: DeepImmutable): this {\r\n this._x += other._x;\r\n this._y += other._y;\r\n this._z += other._z;\r\n this._w += other._w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n public addToRef(other: DeepImmutable, result: T): T {\r\n result._x = this._x + other._x;\r\n result._y = this._y + other._y;\r\n result._z = this._z + other._z;\r\n result._w = this._w + other._w;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n public addInPlaceFromFloats(x: number, y: number, z: number, w: number): this {\r\n this._x += x;\r\n this._y += y;\r\n this._z += z;\r\n this._w += w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n public subtractToRef(other: DeepImmutable, result: T): T {\r\n result._x = this._x - other._x;\r\n result._y = this._y - other._y;\r\n result._z = this._z - other._z;\r\n result._w = this._w - other._w;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n public subtractFromFloats(x: number, y: number, z: number, w: number): this {\r\n return this.subtractFromFloatsToRef(x, y, z, w, new (this.constructor as Constructor)());\r\n }\r\n\r\n public subtractFromFloatsToRef(x: number, y: number, z: number, w: number, result: T): T {\r\n result._x = this._x - x;\r\n result._y = this._y - y;\r\n result._z = this._z - z;\r\n result._w = this._w - w;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Subtract two quaternions\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#57\r\n * @param other defines the second operand\r\n * @returns a new quaternion as the subtraction result of the given one from the current one\r\n */\r\n public subtract(other: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this._x - other._x, this._y - other._y, this._z - other._z, this._w - other._w);\r\n }\r\n\r\n /**\r\n * Subtract a quaternion to the current one\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#58\r\n * @param other defines the quaternion to subtract\r\n * @returns the current quaternion\r\n */\r\n public subtractInPlace(other: DeepImmutable): this {\r\n this._x -= other._x;\r\n this._y -= other._y;\r\n this._z -= other._z;\r\n this._w -= other._w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiplies the current quaternion by a scale factor\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#88\r\n * @param value defines the scale factor\r\n * @returns a new quaternion set by multiplying the current quaternion coordinates by the float \"scale\"\r\n */\r\n public scale(value: number): this {\r\n return new (this.constructor as Constructor)(this._x * value, this._y * value, this._z * value, this._w * value);\r\n }\r\n\r\n /**\r\n * Scale the current quaternion values by a factor and stores the result to a given quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#89\r\n * @param scale defines the scale factor\r\n * @param result defines the Quaternion object where to store the result\r\n * @returns result input\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n result._x = this._x * scale;\r\n result._y = this._y * scale;\r\n result._z = this._z * scale;\r\n result._w = this._w * scale;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Multiplies in place the current quaternion by a scale factor\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#90\r\n * @param value defines the scale factor\r\n * @returns the current modified quaternion\r\n */\r\n public scaleInPlace(value: number): this {\r\n this._x *= value;\r\n this._y *= value;\r\n this._z *= value;\r\n this._w *= value;\r\n this._isDirty = true;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Scale the current quaternion values by a factor and add the result to a given quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#91\r\n * @param scale defines the scale factor\r\n * @param result defines the Quaternion object where to store the result\r\n * @returns result input\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n result._x += this._x * scale;\r\n result._y += this._y * scale;\r\n result._z += this._z * scale;\r\n result._w += this._w * scale;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Multiplies two quaternions\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#43\r\n * @param q1 defines the second operand\r\n * @returns a new quaternion set as the multiplication result of the current one with the given one \"q1\"\r\n */\r\n public multiply(q1: DeepImmutable): this {\r\n const result = new (this.constructor as Constructor)(0, 0, 0, 1.0);\r\n this.multiplyToRef(q1, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given \"result\" as the multiplication result of the current one with the given one \"q1\"\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#45\r\n * @param q1 defines the second operand\r\n * @param result defines the target quaternion\r\n * @returns the current quaternion\r\n */\r\n public multiplyToRef(q1: DeepImmutable, result: T): T {\r\n const x = this._x * q1._w + this._y * q1._z - this._z * q1._y + this._w * q1._x;\r\n const y = -this._x * q1._z + this._y * q1._w + this._z * q1._x + this._w * q1._y;\r\n const z = this._x * q1._y - this._y * q1._x + this._z * q1._w + this._w * q1._z;\r\n const w = -this._x * q1._x - this._y * q1._y - this._z * q1._z + this._w * q1._w;\r\n result.copyFromFloats(x, y, z, w);\r\n return result;\r\n }\r\n\r\n /**\r\n * Updates the current quaternion with the multiplication of itself with the given one \"q1\"\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#46\r\n * @param other defines the second operand\r\n * @returns the currentupdated quaternion\r\n */\r\n public multiplyInPlace(other: DeepImmutable): this {\r\n return this.multiplyToRef(other, this);\r\n }\r\n\r\n public multiplyByFloats(x: number, y: number, z: number, w: number): this {\r\n this._x *= x;\r\n this._y *= y;\r\n this._z *= z;\r\n this._w *= w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divide(_other: DeepImmutable): this {\r\n throw new ReferenceError(\"Can not divide a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divideToRef(_other: DeepImmutable, _result: T): T {\r\n throw new ReferenceError(\"Can not divide a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divideInPlace(_other: DeepImmutable): this {\r\n throw new ReferenceError(\"Can not divide a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public minimizeInPlace(): this {\r\n throw new ReferenceError(\"Can not minimize a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public minimizeInPlaceFromFloats(): this {\r\n throw new ReferenceError(\"Can not minimize a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public maximizeInPlace(): this {\r\n throw new ReferenceError(\"Can not maximize a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public maximizeInPlaceFromFloats(): this {\r\n throw new ReferenceError(\"Can not maximize a quaternion\");\r\n }\r\n\r\n public negate(): this {\r\n return this.negateToRef(new (this.constructor as Constructor)());\r\n }\r\n\r\n public negateInPlace(): this {\r\n this._x = -this._x;\r\n this._y = -this._y;\r\n this._z = -this._z;\r\n this._w = -this._w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n public negateToRef(result: T): T {\r\n result._x = -this._x;\r\n result._y = -this._y;\r\n result._z = -this._z;\r\n result._w = -this._w;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n public equalsToFloats(x: number, y: number, z: number, w: number): boolean {\r\n return this._x === x && this._y === y && this._z === z && this._w === w;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public floorToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not floor a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public floor(): this {\r\n throw new ReferenceError(\"Can not floor a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public fractToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not fract a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public fract(): this {\r\n throw new ReferenceError(\"Can not fract a quaternion\");\r\n }\r\n\r\n /**\r\n * Conjugates the current quaternion and stores the result in the given quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#81\r\n * @param ref defines the target quaternion\r\n * @returns result input\r\n */\r\n public conjugateToRef(ref: T): T {\r\n ref.copyFromFloats(-this._x, -this._y, -this._z, this._w);\r\n return ref;\r\n }\r\n\r\n /**\r\n * Conjugates in place the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#82\r\n * @returns the current updated quaternion\r\n */\r\n public conjugateInPlace(): this {\r\n this._x *= -1;\r\n this._y *= -1;\r\n this._z *= -1;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Conjugates (1-q) the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#83\r\n * @returns a new quaternion\r\n */\r\n public conjugate(): this {\r\n return new (this.constructor as Constructor)(-this._x, -this._y, -this._z, this._w);\r\n }\r\n\r\n /**\r\n * Returns the inverse of the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#84\r\n * @returns a new quaternion\r\n */\r\n public invert(): this {\r\n const conjugate = this.conjugate();\r\n const lengthSquared = this.lengthSquared();\r\n if (lengthSquared == 0 || lengthSquared == 1) {\r\n return conjugate;\r\n }\r\n conjugate.scaleInPlace(1 / lengthSquared);\r\n return conjugate;\r\n }\r\n\r\n /**\r\n * Invert in place the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#85\r\n * @returns this quaternion\r\n */\r\n public invertInPlace(): this {\r\n this.conjugateInPlace();\r\n const lengthSquared = this.lengthSquared();\r\n if (lengthSquared == 0 || lengthSquared == 1) {\r\n return this;\r\n }\r\n this.scaleInPlace(1 / lengthSquared);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets squared length of current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#29\r\n * @returns the quaternion length (float)\r\n */\r\n public lengthSquared(): number {\r\n return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\r\n }\r\n\r\n /**\r\n * Gets length of current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#28\r\n * @returns the quaternion length (float)\r\n */\r\n public length(): number {\r\n return Math.sqrt(this.lengthSquared());\r\n }\r\n\r\n /**\r\n * Normalize in place the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#54\r\n * @returns the current updated quaternion\r\n */\r\n public normalize(): this {\r\n return this.normalizeFromLength(this.length());\r\n }\r\n\r\n /**\r\n * Normalize the current quaternion with the given input length.\r\n * Please note that this is an in place operation.\r\n * @param len the length of the quaternion\r\n * @returns the current updated Quaternion\r\n */\r\n public normalizeFromLength(len: number): this {\r\n if (len === 0 || len === 1.0) {\r\n return this;\r\n }\r\n\r\n return this.scaleInPlace(1.0 / len);\r\n }\r\n\r\n /**\r\n * Normalize a copy of the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#55\r\n * @returns the normalized quaternion\r\n */\r\n public normalizeToNew(): this {\r\n const normalized = new (this.constructor as Constructor)(0, 0, 0, 1);\r\n this.normalizeToRef(normalized);\r\n return normalized;\r\n }\r\n\r\n /**\r\n * Normalize the current Quaternion to the reference\r\n * @param reference define the Quaternion to update\r\n * @returns the updated Quaternion\r\n */\r\n public normalizeToRef(reference: T): T {\r\n const len = this.length();\r\n if (len === 0 || len === 1.0) {\r\n return reference.copyFromFloats(this._x, this._y, this._z, this._w);\r\n }\r\n\r\n return this.scaleToRef(1.0 / len, reference);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the Euler angles translated from the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#32\r\n * @returns a new Vector3 containing the Euler angles\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/rotation_conventions\r\n */\r\n public toEulerAngles(): Vector3 {\r\n const result = Vector3.Zero();\r\n this.toEulerAnglesToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector3 \"result\" with the Euler angles translated from the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#31\r\n * @param result defines the vector which will be filled with the Euler angles\r\n * @returns result input\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/rotation_conventions\r\n */\r\n public toEulerAnglesToRef(result: T): T {\r\n const qz = this._z;\r\n const qx = this._x;\r\n const qy = this._y;\r\n const qw = this._w;\r\n\r\n const zAxisY = qy * qz - qx * qw;\r\n const limit = 0.4999999;\r\n\r\n if (zAxisY < -limit) {\r\n result._y = 2 * Math.atan2(qy, qw);\r\n result._x = Math.PI / 2;\r\n result._z = 0;\r\n result._isDirty = true;\r\n } else if (zAxisY > limit) {\r\n result._y = 2 * Math.atan2(qy, qw);\r\n result._x = -Math.PI / 2;\r\n result._z = 0;\r\n result._isDirty = true;\r\n } else {\r\n const sqw = qw * qw;\r\n const sqz = qz * qz;\r\n const sqx = qx * qx;\r\n const sqy = qy * qy;\r\n result._z = Math.atan2(2.0 * (qx * qy + qz * qw), -sqz - sqx + sqy + sqw);\r\n result._x = Math.asin(-2.0 * zAxisY);\r\n result._y = Math.atan2(2.0 * (qz * qx + qy * qw), sqz - sqx - sqy + sqw);\r\n result._isDirty = true;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Updates the given rotation matrix with the current quaternion values\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#67\r\n * @param result defines the target matrix\r\n * @returns the updated matrix with the rotation\r\n */\r\n public toRotationMatrix(result: T): T {\r\n Matrix.FromQuaternionToRef(this, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Updates the current quaternion from the given rotation matrix values\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#41\r\n * @param matrix defines the source matrix\r\n * @returns the current updated quaternion\r\n */\r\n public fromRotationMatrix(matrix: DeepImmutable): this {\r\n Quaternion.FromRotationMatrixToRef(matrix, this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the dot product (float) between the current quaternions and \"other\"\r\n * @param other defines the right operand\r\n * @returns the dot product\r\n */\r\n public dot(other: DeepImmutable): number {\r\n return this._x * other._x + this._y * other._y + this._z * other._z + this._w * other._w;\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Creates a new quaternion from a rotation matrix\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#101\r\n * @param matrix defines the source matrix\r\n * @returns a new quaternion created from the given rotation matrix values\r\n */\r\n public static FromRotationMatrix(matrix: DeepImmutable): Quaternion {\r\n const result = new Quaternion();\r\n Quaternion.FromRotationMatrixToRef(matrix, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Updates the given quaternion with the given rotation matrix values\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#102\r\n * @param matrix defines the source matrix\r\n * @param result defines the target quaternion\r\n * @returns result input\r\n */\r\n public static FromRotationMatrixToRef(matrix: DeepImmutable, result: T): T {\r\n const data = matrix.m;\r\n const m11 = data[0],\r\n m12 = data[4],\r\n m13 = data[8];\r\n const m21 = data[1],\r\n m22 = data[5],\r\n m23 = data[9];\r\n const m31 = data[2],\r\n m32 = data[6],\r\n m33 = data[10];\r\n const trace = m11 + m22 + m33;\r\n let s;\r\n\r\n if (trace > 0) {\r\n s = 0.5 / Math.sqrt(trace + 1.0);\r\n\r\n result._w = 0.25 / s;\r\n result._x = (m32 - m23) * s;\r\n result._y = (m13 - m31) * s;\r\n result._z = (m21 - m12) * s;\r\n result._isDirty = true;\r\n } else if (m11 > m22 && m11 > m33) {\r\n s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\r\n\r\n result._w = (m32 - m23) / s;\r\n result._x = 0.25 * s;\r\n result._y = (m12 + m21) / s;\r\n result._z = (m13 + m31) / s;\r\n result._isDirty = true;\r\n } else if (m22 > m33) {\r\n s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\r\n\r\n result._w = (m13 - m31) / s;\r\n result._x = (m12 + m21) / s;\r\n result._y = 0.25 * s;\r\n result._z = (m23 + m32) / s;\r\n result._isDirty = true;\r\n } else {\r\n s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\r\n\r\n result._w = (m21 - m12) / s;\r\n result._x = (m13 + m31) / s;\r\n result._y = (m23 + m32) / s;\r\n result._z = 0.25 * s;\r\n result._isDirty = true;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns the dot product (float) between the quaternions \"left\" and \"right\"\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#61\r\n * @param left defines the left operand\r\n * @param right defines the right operand\r\n * @returns the dot product\r\n */\r\n public static Dot(left: DeepImmutable, right: DeepImmutable): number {\r\n return left._x * right._x + left._y * right._y + left._z * right._z + left._w * right._w;\r\n }\r\n\r\n /**\r\n * Checks if the orientations of two rotation quaternions are close to each other\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#60\r\n * @param quat0 defines the first quaternion to check\r\n * @param quat1 defines the second quaternion to check\r\n * @param epsilon defines closeness, 0 same orientation, 1 PI apart, default 0.1\r\n * @returns true if the two quaternions are close to each other within epsilon\r\n */\r\n public static AreClose(quat0: DeepImmutable, quat1: DeepImmutable, epsilon: number = 0.1): boolean {\r\n const dot = Quaternion.Dot(quat0, quat1);\r\n\r\n return 1 - dot * dot <= epsilon;\r\n }\r\n\r\n /**\r\n * Smooth interpolation between two quaternions using Slerp\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#93\r\n * @param source source quaternion\r\n * @param goal goal quaternion\r\n * @param deltaTime current interpolation frame\r\n * @param lerpTime total interpolation time\r\n * @param result the smoothed quaternion\r\n * @returns the smoothed quaternion\r\n */\r\n public static SmoothToRef(source: Quaternion, goal: Quaternion, deltaTime: number, lerpTime: number, result: T): T {\r\n let slerp = lerpTime === 0 ? 1 : deltaTime / lerpTime;\r\n slerp = Clamp(slerp, 0, 1);\r\n\r\n Quaternion.SlerpToRef(source, goal, slerp, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an empty quaternion\r\n * @returns a new quaternion set to (0.0, 0.0, 0.0)\r\n */\r\n public static Zero(): Quaternion {\r\n return new Quaternion(0.0, 0.0, 0.0, 0.0);\r\n }\r\n\r\n /**\r\n * Inverse a given quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#103\r\n * @param q defines the source quaternion\r\n * @returns a new quaternion as the inverted current quaternion\r\n */\r\n public static Inverse(q: DeepImmutable): T {\r\n return new (q.constructor as Constructor)(-q._x, -q._y, -q._z, q._w);\r\n }\r\n\r\n /**\r\n * Inverse a given quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#104\r\n * @param q defines the source quaternion\r\n * @param result the quaternion the result will be stored in\r\n * @returns the result quaternion\r\n */\r\n public static InverseToRef(q: Quaternion, result: T): T {\r\n result.set(-q._x, -q._y, -q._z, q._w);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an identity quaternion\r\n * @returns the identity quaternion\r\n */\r\n public static Identity(): Quaternion {\r\n return new Quaternion(0.0, 0.0, 0.0, 1.0);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the given quaternion is identity\r\n * @param quaternion defines the quaternion to check\r\n * @returns true if the quaternion is identity\r\n */\r\n public static IsIdentity(quaternion: DeepImmutable): boolean {\r\n return quaternion && quaternion._x === 0 && quaternion._y === 0 && quaternion._z === 0 && quaternion._w === 1;\r\n }\r\n\r\n /**\r\n * Creates a quaternion from a rotation around an axis\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#72\r\n * @param axis defines the axis to use\r\n * @param angle defines the angle to use\r\n * @returns a new quaternion created from the given axis (Vector3) and angle in radians (float)\r\n */\r\n public static RotationAxis(axis: DeepImmutable, angle: number): Quaternion {\r\n return Quaternion.RotationAxisToRef(axis, angle, new Quaternion());\r\n }\r\n\r\n /**\r\n * Creates a rotation around an axis and stores it into the given quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#73\r\n * @param axis defines the axis to use\r\n * @param angle defines the angle to use\r\n * @param result defines the target quaternion\r\n * @returns the target quaternion\r\n */\r\n public static RotationAxisToRef(axis: DeepImmutable, angle: number, result: T): T {\r\n const sin = Math.sin(angle / 2);\r\n axis.normalize();\r\n result._w = Math.cos(angle / 2);\r\n result._x = axis._x * sin;\r\n result._y = axis._y * sin;\r\n result._z = axis._z * sin;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new quaternion from data stored into an array\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#63\r\n * @param array defines the data source\r\n * @param offset defines the offset in the source array where the data starts\r\n * @returns a new quaternion\r\n */\r\n public static FromArray(array: DeepImmutable>, offset?: number): Quaternion {\r\n if (!offset) {\r\n offset = 0;\r\n }\r\n return new Quaternion(array[offset], array[offset + 1], array[offset + 2], array[offset + 3]);\r\n }\r\n\r\n /**\r\n * Updates the given quaternion \"result\" from the starting index of the given array.\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#64\r\n * @param array the array to pull values from\r\n * @param offset the offset into the array to start at\r\n * @param result the quaternion to store the result in\r\n * @returns result input\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number, result: T): T {\r\n result._x = array[offset];\r\n result._y = array[offset + 1];\r\n result._z = array[offset + 2];\r\n result._w = array[offset + 3];\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given quaternion \"result\" with the given floats.\r\n * @param x defines the x coordinate of the source\r\n * @param y defines the y coordinate of the source\r\n * @param z defines the z coordinate of the source\r\n * @param w defines the w coordinate of the source\r\n * @param result defines the quaternion where to store the result\r\n * @returns the result quaternion\r\n */\r\n public static FromFloatsToRef(x: number, y: number, z: number, w: number, result: T): T {\r\n result.copyFromFloats(x, y, z, w);\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a quaternion from Euler rotation angles\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#33\r\n * @param x Pitch\r\n * @param y Yaw\r\n * @param z Roll\r\n * @returns the new Quaternion\r\n */\r\n public static FromEulerAngles(x: number, y: number, z: number): Quaternion {\r\n const q = new Quaternion();\r\n Quaternion.RotationYawPitchRollToRef(y, x, z, q);\r\n return q;\r\n }\r\n\r\n /**\r\n * Updates a quaternion from Euler rotation angles\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#34\r\n * @param x Pitch\r\n * @param y Yaw\r\n * @param z Roll\r\n * @param result the quaternion to store the result\r\n * @returns the updated quaternion\r\n */\r\n public static FromEulerAnglesToRef(x: number, y: number, z: number, result: T): T {\r\n Quaternion.RotationYawPitchRollToRef(y, x, z, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a quaternion from Euler rotation vector\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#35\r\n * @param vec the Euler vector (x Pitch, y Yaw, z Roll)\r\n * @returns the new Quaternion\r\n */\r\n public static FromEulerVector(vec: DeepImmutable): Quaternion {\r\n const q = new Quaternion();\r\n Quaternion.RotationYawPitchRollToRef(vec._y, vec._x, vec._z, q);\r\n return q;\r\n }\r\n\r\n /**\r\n * Updates a quaternion from Euler rotation vector\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#36\r\n * @param vec the Euler vector (x Pitch, y Yaw, z Roll)\r\n * @param result the quaternion to store the result\r\n * @returns the updated quaternion\r\n */\r\n public static FromEulerVectorToRef(vec: DeepImmutable, result: T): T {\r\n Quaternion.RotationYawPitchRollToRef(vec._y, vec._x, vec._z, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Updates a quaternion so that it rotates vector vecFrom to vector vecTo\r\n * Example Playground - https://playground.babylonjs.com/#L49EJ7#70\r\n * @param vecFrom defines the direction vector from which to rotate\r\n * @param vecTo defines the direction vector to which to rotate\r\n * @param result the quaternion to store the result\r\n * @param epsilon defines the minimal dot value to define vecs as opposite. Default: `BABYLON.Epsilon`\r\n * @returns the updated quaternion\r\n */\r\n public static FromUnitVectorsToRef(vecFrom: DeepImmutable, vecTo: DeepImmutable, result: T, epsilon = Epsilon): T {\r\n const r = Vector3.Dot(vecFrom, vecTo) + 1;\r\n\r\n if (r < epsilon) {\r\n if (Math.abs(vecFrom.x) > Math.abs(vecFrom.z)) {\r\n result.set(-vecFrom.y, vecFrom.x, 0, 0);\r\n } else {\r\n result.set(0, -vecFrom.z, vecFrom.y, 0);\r\n }\r\n } else {\r\n Vector3.CrossToRef(vecFrom, vecTo, TmpVectors.Vector3[0]);\r\n result.set(TmpVectors.Vector3[0].x, TmpVectors.Vector3[0].y, TmpVectors.Vector3[0].z, r);\r\n }\r\n\r\n return result.normalize();\r\n }\r\n\r\n /**\r\n * Creates a new quaternion from the given Euler float angles (y, x, z)\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#77\r\n * @param yaw defines the rotation around Y axis\r\n * @param pitch defines the rotation around X axis\r\n * @param roll defines the rotation around Z axis\r\n * @returns the new quaternion\r\n */\r\n public static RotationYawPitchRoll(yaw: number, pitch: number, roll: number): Quaternion {\r\n const q = new Quaternion();\r\n Quaternion.RotationYawPitchRollToRef(yaw, pitch, roll, q);\r\n return q;\r\n }\r\n\r\n /**\r\n * Creates a new rotation from the given Euler float angles (y, x, z) and stores it in the target quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#78\r\n * @param yaw defines the rotation around Y axis\r\n * @param pitch defines the rotation around X axis\r\n * @param roll defines the rotation around Z axis\r\n * @param result defines the target quaternion\r\n * @returns result input\r\n */\r\n public static RotationYawPitchRollToRef(yaw: number, pitch: number, roll: number, result: T): T {\r\n // Produces a quaternion from Euler angles in the z-y-x orientation (Tait-Bryan angles)\r\n const halfRoll = roll * 0.5;\r\n const halfPitch = pitch * 0.5;\r\n const halfYaw = yaw * 0.5;\r\n\r\n const sinRoll = Math.sin(halfRoll);\r\n const cosRoll = Math.cos(halfRoll);\r\n const sinPitch = Math.sin(halfPitch);\r\n const cosPitch = Math.cos(halfPitch);\r\n const sinYaw = Math.sin(halfYaw);\r\n const cosYaw = Math.cos(halfYaw);\r\n\r\n result._x = cosYaw * sinPitch * cosRoll + sinYaw * cosPitch * sinRoll;\r\n result._y = sinYaw * cosPitch * cosRoll - cosYaw * sinPitch * sinRoll;\r\n result._z = cosYaw * cosPitch * sinRoll - sinYaw * sinPitch * cosRoll;\r\n result._w = cosYaw * cosPitch * cosRoll + sinYaw * sinPitch * sinRoll;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new quaternion from the given Euler float angles expressed in z-x-z orientation\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#68\r\n * @param alpha defines the rotation around first axis\r\n * @param beta defines the rotation around second axis\r\n * @param gamma defines the rotation around third axis\r\n * @returns the new quaternion\r\n */\r\n public static RotationAlphaBetaGamma(alpha: number, beta: number, gamma: number): Quaternion {\r\n const result = new Quaternion();\r\n Quaternion.RotationAlphaBetaGammaToRef(alpha, beta, gamma, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new quaternion from the given Euler float angles expressed in z-x-z orientation and stores it in the target quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#69\r\n * @param alpha defines the rotation around first axis\r\n * @param beta defines the rotation around second axis\r\n * @param gamma defines the rotation around third axis\r\n * @param result defines the target quaternion\r\n * @returns result input\r\n */\r\n public static RotationAlphaBetaGammaToRef(alpha: number, beta: number, gamma: number, result: T): T {\r\n // Produces a quaternion from Euler angles in the z-x-z orientation\r\n const halfGammaPlusAlpha = (gamma + alpha) * 0.5;\r\n const halfGammaMinusAlpha = (gamma - alpha) * 0.5;\r\n const halfBeta = beta * 0.5;\r\n\r\n result._x = Math.cos(halfGammaMinusAlpha) * Math.sin(halfBeta);\r\n result._y = Math.sin(halfGammaMinusAlpha) * Math.sin(halfBeta);\r\n result._z = Math.sin(halfGammaPlusAlpha) * Math.cos(halfBeta);\r\n result._w = Math.cos(halfGammaPlusAlpha) * Math.cos(halfBeta);\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new quaternion containing the rotation value to reach the target (axis1, axis2, axis3) orientation as a rotated XYZ system (axis1, axis2 and axis3 are normalized during this operation)\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#75\r\n * @param axis1 defines the first axis\r\n * @param axis2 defines the second axis\r\n * @param axis3 defines the third axis\r\n * @returns the new quaternion\r\n */\r\n public static RotationQuaternionFromAxis(axis1: DeepImmutable, axis2: DeepImmutable, axis3: DeepImmutable): Quaternion {\r\n const quat = new Quaternion(0.0, 0.0, 0.0, 0.0);\r\n Quaternion.RotationQuaternionFromAxisToRef(axis1, axis2, axis3, quat);\r\n return quat;\r\n }\r\n\r\n /**\r\n * Creates a rotation value to reach the target (axis1, axis2, axis3) orientation as a rotated XYZ system (axis1, axis2 and axis3 are normalized during this operation) and stores it in the target quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#76\r\n * @param axis1 defines the first axis\r\n * @param axis2 defines the second axis\r\n * @param axis3 defines the third axis\r\n * @param ref defines the target quaternion\r\n * @returns result input\r\n */\r\n public static RotationQuaternionFromAxisToRef(axis1: DeepImmutable, axis2: DeepImmutable, axis3: DeepImmutable, ref: T): T {\r\n const rotMat = MathTmp.Matrix[0];\r\n Matrix.FromXYZAxesToRef(axis1.normalize(), axis2.normalize(), axis3.normalize(), rotMat);\r\n Quaternion.FromRotationMatrixToRef(rotMat, ref);\r\n return ref;\r\n }\r\n\r\n /**\r\n * Creates a new rotation value to orient an object to look towards the given forward direction, the up direction being oriented like \"up\".\r\n * This function works in left handed mode\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#96\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @returns A new quaternion oriented toward the specified forward and up.\r\n */\r\n public static FromLookDirectionLH(forward: DeepImmutable, up: DeepImmutable): Quaternion {\r\n const quat = new Quaternion();\r\n Quaternion.FromLookDirectionLHToRef(forward, up, quat);\r\n return quat;\r\n }\r\n\r\n /**\r\n * Creates a new rotation value to orient an object to look towards the given forward direction with the up direction being oriented like \"up\", and stores it in the target quaternion.\r\n * This function works in left handed mode\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#97\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @param ref defines the target quaternion.\r\n * @returns result input\r\n */\r\n public static FromLookDirectionLHToRef(forward: DeepImmutable, up: DeepImmutable, ref: T): T {\r\n const rotMat = MathTmp.Matrix[0];\r\n Matrix.LookDirectionLHToRef(forward, up, rotMat);\r\n Quaternion.FromRotationMatrixToRef(rotMat, ref);\r\n return ref;\r\n }\r\n\r\n /**\r\n * Creates a new rotation value to orient an object to look towards the given forward direction, the up direction being oriented like \"up\".\r\n * This function works in right handed mode\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#98\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @returns A new quaternion oriented toward the specified forward and up.\r\n */\r\n public static FromLookDirectionRH(forward: DeepImmutable, up: DeepImmutable): Quaternion {\r\n const quat = new Quaternion();\r\n Quaternion.FromLookDirectionRHToRef(forward, up, quat);\r\n return quat;\r\n }\r\n\r\n /**\r\n * Creates a new rotation value to orient an object to look towards the given forward direction with the up direction being oriented like \"up\", and stores it in the target quaternion.\r\n * This function works in right handed mode\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#105\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @param ref defines the target quaternion.\r\n * @returns result input\r\n */\r\n public static FromLookDirectionRHToRef(forward: DeepImmutable, up: DeepImmutable, ref: T): T {\r\n const rotMat = MathTmp.Matrix[0];\r\n Matrix.LookDirectionRHToRef(forward, up, rotMat);\r\n return Quaternion.FromRotationMatrixToRef(rotMat, ref);\r\n }\r\n\r\n /**\r\n * Interpolates between two quaternions\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#79\r\n * @param left defines first quaternion\r\n * @param right defines second quaternion\r\n * @param amount defines the gradient to use\r\n * @returns the new interpolated quaternion\r\n */\r\n public static Slerp(left: DeepImmutable, right: DeepImmutable, amount: number): Quaternion {\r\n const result = Quaternion.Identity();\r\n\r\n Quaternion.SlerpToRef(left, right, amount, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Interpolates between two quaternions and stores it into a target quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#92\r\n * @param left defines first quaternion\r\n * @param right defines second quaternion\r\n * @param amount defines the gradient to use\r\n * @param result defines the target quaternion\r\n * @returns result input\r\n */\r\n public static SlerpToRef(left: DeepImmutable, right: DeepImmutable, amount: number, result: T): T {\r\n let num2;\r\n let num3;\r\n let num4 = left._x * right._x + left._y * right._y + left._z * right._z + left._w * right._w;\r\n let flag = false;\r\n\r\n if (num4 < 0) {\r\n flag = true;\r\n num4 = -num4;\r\n }\r\n\r\n if (num4 > 0.999999) {\r\n num3 = 1 - amount;\r\n num2 = flag ? -amount : amount;\r\n } else {\r\n const num5 = Math.acos(num4);\r\n const num6 = 1.0 / Math.sin(num5);\r\n num3 = Math.sin((1.0 - amount) * num5) * num6;\r\n num2 = flag ? -Math.sin(amount * num5) * num6 : Math.sin(amount * num5) * num6;\r\n }\r\n\r\n result._x = num3 * left._x + num2 * right._x;\r\n result._y = num3 * left._y + num2 * right._y;\r\n result._z = num3 * left._z + num2 * right._z;\r\n result._w = num3 * left._w + num2 * right._w;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Interpolate between two quaternions using Hermite interpolation\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#47\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#hermite-quaternion-spline\r\n * @param value1 defines first quaternion\r\n * @param tangent1 defines the incoming tangent\r\n * @param value2 defines second quaternion\r\n * @param tangent2 defines the outgoing tangent\r\n * @param amount defines the target quaternion\r\n * @returns the new interpolated quaternion\r\n */\r\n public static Hermite(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n amount: number\r\n ): T {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n const part1 = 2.0 * cubed - 3.0 * squared + 1.0;\r\n const part2 = -2.0 * cubed + 3.0 * squared;\r\n const part3 = cubed - 2.0 * squared + amount;\r\n const part4 = cubed - squared;\r\n\r\n const x = value1._x * part1 + value2._x * part2 + tangent1._x * part3 + tangent2._x * part4;\r\n const y = value1._y * part1 + value2._y * part2 + tangent1._y * part3 + tangent2._y * part4;\r\n const z = value1._z * part1 + value2._z * part2 + tangent1._z * part3 + tangent2._z * part4;\r\n const w = value1._w * part1 + value2._w * part2 + tangent1._w * part3 + tangent2._w * part4;\r\n return new (value1.constructor as Constructor)(x, y, z, w);\r\n }\r\n\r\n /**\r\n * Returns a new Quaternion which is the 1st derivative of the Hermite spline defined by the quaternions \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#48\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @returns 1st derivative\r\n */\r\n public static Hermite1stDerivative(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number\r\n ): T {\r\n const result = new (value1.constructor as Constructor)();\r\n\r\n this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Update a Quaternion with the 1st derivative of the Hermite spline defined by the quaternions \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#49\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @param result define where to store the derivative\r\n * @returns result input\r\n */\r\n public static Hermite1stDerivativeToRef(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number,\r\n result: T\r\n ): T {\r\n const t2 = time * time;\r\n\r\n result._x = (t2 - time) * 6 * value1._x + (3 * t2 - 4 * time + 1) * tangent1._x + (-t2 + time) * 6 * value2._x + (3 * t2 - 2 * time) * tangent2._x;\r\n result._y = (t2 - time) * 6 * value1._y + (3 * t2 - 4 * time + 1) * tangent1._y + (-t2 + time) * 6 * value2._y + (3 * t2 - 2 * time) * tangent2._y;\r\n result._z = (t2 - time) * 6 * value1._z + (3 * t2 - 4 * time + 1) * tangent1._z + (-t2 + time) * 6 * value2._z + (3 * t2 - 2 * time) * tangent2._z;\r\n result._w = (t2 - time) * 6 * value1._w + (3 * t2 - 4 * time + 1) * tangent1._w + (-t2 + time) * 6 * value2._w + (3 * t2 - 2 * time) * tangent2._w;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Quaternion as the normalization of the given Quaternion\r\n * @param quat defines the Quaternion to normalize\r\n * @returns the new Quaternion\r\n */\r\n public static Normalize(quat: DeepImmutable): Quaternion {\r\n const result = Quaternion.Zero();\r\n Quaternion.NormalizeToRef(quat, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given Quaternion \"result\" with the normalization of the given first Quaternion\r\n * @param quat defines the Quaternion to normalize\r\n * @param result defines the Quaternion where to store the result\r\n * @returns result input\r\n */\r\n public static NormalizeToRef(quat: DeepImmutable, result: T): T {\r\n quat.normalizeToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Quaternion set with the coordinates of \"value\", if the quaternion \"value\" is in the cube defined by the quaternions \"min\" and \"max\"\r\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\r\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\r\n * @param value defines the current value\r\n * @param min defines the lower range value\r\n * @param max defines the upper range value\r\n * @returns the new Quaternion\r\n */\r\n public static Clamp(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable): T {\r\n const result = new (value.constructor as Constructor)();\r\n Quaternion.ClampToRef(value, min, max, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given quaternion \"result\" with the coordinates of \"value\", if the quaternion \"value\" is in the cube defined by the quaternions \"min\" and \"max\"\r\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\r\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\r\n * @param value defines the current value\r\n * @param min defines the lower range value\r\n * @param max defines the upper range value\r\n * @param result defines the Quaternion where to store the result\r\n * @returns result input\r\n */\r\n public static ClampToRef(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable, result: T): T {\r\n return result.copyFromFloats(Clamp(value.x, min.x, max.x), Clamp(value.y, min.y, max.y), Clamp(value.z, min.z, max.z), Clamp(value.w, min.w, max.w));\r\n }\r\n\r\n /**\r\n * Returns a new Quaternion with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @returns a Quaternion with random values between min and max\r\n */\r\n public static Random(min: number = 0, max: number = 1): Quaternion {\r\n return new Quaternion(RandomRange(min, max), RandomRange(min, max), RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Sets a Quaternion with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @param ref the ref to store the values in\r\n * @returns the ref with random values between min and max\r\n */\r\n public static RandomToRef(min: number = 0, max: number = 1, ref: T): T {\r\n return ref.copyFromFloats(RandomRange(min, max), RandomRange(min, max), RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Do not use\r\n * @internal\r\n */\r\n public static Minimize(): Quaternion {\r\n throw new ReferenceError(\"Quaternion.Minimize does not make sense\");\r\n }\r\n\r\n /**\r\n * Do not use\r\n * @internal\r\n */\r\n public static Maximize(): Quaternion {\r\n throw new ReferenceError(\"Quaternion.Maximize does not make sense\");\r\n }\r\n\r\n /**\r\n * Returns the distance (float) between the quaternions \"value1\" and \"value2\".\r\n * @param value1 value to calulate the distance between\r\n * @param value2 value to calulate the distance between\r\n * @returns the distance between the two quaternions\r\n */\r\n public static Distance(value1: DeepImmutable, value2: DeepImmutable): number {\r\n return Math.sqrt(Quaternion.DistanceSquared(value1, value2));\r\n }\r\n /**\r\n * Returns the squared distance (float) between the quaternions \"value1\" and \"value2\".\r\n * @param value1 value to calulate the distance between\r\n * @param value2 value to calulate the distance between\r\n * @returns the distance between the two quaternions squared\r\n */\r\n public static DistanceSquared(value1: DeepImmutable, value2: DeepImmutable): number {\r\n const x = value1.x - value2.x;\r\n const y = value1.y - value2.y;\r\n const z = value1.z - value2.z;\r\n const w = value1.w - value2.w;\r\n\r\n return x * x + y * y + z * z + w * w;\r\n }\r\n\r\n /**\r\n * Returns a new Quaternion located at the center between the quaternions \"value1\" and \"value2\".\r\n * @param value1 value to calulate the center between\r\n * @param value2 value to calulate the center between\r\n * @returns the center between the two quaternions\r\n */\r\n public static Center(value1: DeepImmutable, value2: DeepImmutable): Quaternion {\r\n return Quaternion.CenterToRef(value1, value2, Quaternion.Zero());\r\n }\r\n\r\n /**\r\n * Gets the center of the quaternions \"value1\" and \"value2\" and stores the result in the quaternion \"ref\"\r\n * @param value1 defines first quaternion\r\n * @param value2 defines second quaternion\r\n * @param ref defines third quaternion\r\n * @returns ref\r\n */\r\n public static CenterToRef(value1: DeepImmutable, value2: DeepImmutable, ref: T): T {\r\n return ref.copyFromFloats((value1.x + value2.x) / 2, (value1.y + value2.y) / 2, (value1.z + value2.z) / 2, (value1.w + value2.w) / 2);\r\n }\r\n}\r\nQuaternion satisfies TensorStatic;\r\nObject.defineProperties(Quaternion.prototype, {\r\n dimension: { value: [4] },\r\n rank: { value: 1 },\r\n});\r\n\r\n/**\r\n * Class used to store matrix data (4x4)\r\n * Note on matrix definitions in Babylon.js for setting values directly\r\n * rather than using one of the methods available.\r\n * Matrix size is given by rows x columns.\r\n * A Vector3 is a 1 X 3 matrix [x, y, z].\r\n *\r\n * In Babylon.js multiplying a 1 x 3 matrix by a 4 x 4 matrix\r\n * is done using BABYLON.Vector4.TransformCoordinates(Vector3, Matrix).\r\n * and extending the passed Vector3 to a Vector4, V = [x, y, z, 1].\r\n * Let M be a matrix with elements m(row, column), so that\r\n * m(2, 3) is the element in row 2 column 3 of M.\r\n *\r\n * Multiplication is of the form VM and has the resulting Vector4\r\n * VM = [xm(0, 0) + ym(1, 0) + zm(2, 0) + m(3, 0), xm(0, 1) + ym(1, 1) + zm(2, 1) + m(3, 1), xm(0, 2) + ym(1, 2) + zm(2, 2) + m(3, 2), xm(0, 3) + ym(1, 3) + zm(2, 3) + m(3, 3)].\r\n * On the web you will find many examples that use the opposite convention of MV,\r\n * in which case to make use of the examples you will need to transpose the matrix.\r\n *\r\n * Example Playground - Overview Linear Algebra - https://playground.babylonjs.com/#AV9X17\r\n * Example Playground - Overview Transformation - https://playground.babylonjs.com/#AV9X17#1\r\n * Example Playground - Overview Projection - https://playground.babylonjs.com/#AV9X17#2\r\n */\r\nexport class Matrix implements Tensor, 4>>, IMatrixLike {\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: Readonly<[4, 4]>;\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 2;\r\n\r\n /**\r\n * Gets the precision of matrix computations\r\n */\r\n public static get Use64Bits(): boolean {\r\n return PerformanceConfigurator.MatrixUse64Bits;\r\n }\r\n\r\n private static _UpdateFlagSeed = 0;\r\n private static _IdentityReadOnly = Matrix.Identity() as DeepImmutable;\r\n\r\n private _isIdentity = false;\r\n private _isIdentityDirty = true;\r\n private _isIdentity3x2 = true;\r\n private _isIdentity3x2Dirty = true;\r\n /**\r\n * Gets the update flag of the matrix which is an unique number for the matrix.\r\n * It will be incremented every time the matrix data change.\r\n * You can use it to speed the comparison between two versions of the same matrix.\r\n */\r\n public updateFlag: number = -1;\r\n\r\n private readonly _m: Tuple;\r\n\r\n /**\r\n * Gets the internal data of the matrix\r\n */\r\n public get m(): DeepImmutable> {\r\n return this._m;\r\n }\r\n\r\n /**\r\n * Update the updateFlag to indicate that the matrix has been updated\r\n */\r\n public markAsUpdated() {\r\n this.updateFlag = Matrix._UpdateFlagSeed++;\r\n this._isIdentity = false;\r\n this._isIdentity3x2 = false;\r\n this._isIdentityDirty = true;\r\n this._isIdentity3x2Dirty = true;\r\n }\r\n\r\n private _updateIdentityStatus(isIdentity: boolean, isIdentityDirty: boolean = false, isIdentity3x2: boolean = false, isIdentity3x2Dirty: boolean = true) {\r\n this._isIdentity = isIdentity;\r\n this._isIdentity3x2 = isIdentity || isIdentity3x2;\r\n this._isIdentityDirty = this._isIdentity ? false : isIdentityDirty;\r\n this._isIdentity3x2Dirty = this._isIdentity3x2 ? false : isIdentity3x2Dirty;\r\n }\r\n\r\n /**\r\n * Creates an empty matrix (filled with zeros)\r\n */\r\n public constructor() {\r\n if (PerformanceConfigurator.MatrixTrackPrecisionChange) {\r\n PerformanceConfigurator.MatrixTrackedMatrices!.push(this);\r\n }\r\n\r\n this._m = new PerformanceConfigurator.MatrixCurrentType(16);\r\n\r\n this.markAsUpdated();\r\n }\r\n\r\n // Properties\r\n\r\n /**\r\n * Check if the current matrix is identity\r\n * @returns true is the matrix is the identity matrix\r\n */\r\n public isIdentity(): boolean {\r\n if (this._isIdentityDirty) {\r\n this._isIdentityDirty = false;\r\n const m = this._m;\r\n this._isIdentity =\r\n m[0] === 1.0 &&\r\n m[1] === 0.0 &&\r\n m[2] === 0.0 &&\r\n m[3] === 0.0 &&\r\n m[4] === 0.0 &&\r\n m[5] === 1.0 &&\r\n m[6] === 0.0 &&\r\n m[7] === 0.0 &&\r\n m[8] === 0.0 &&\r\n m[9] === 0.0 &&\r\n m[10] === 1.0 &&\r\n m[11] === 0.0 &&\r\n m[12] === 0.0 &&\r\n m[13] === 0.0 &&\r\n m[14] === 0.0 &&\r\n m[15] === 1.0;\r\n }\r\n\r\n return this._isIdentity;\r\n }\r\n\r\n /**\r\n * Check if the current matrix is identity as a texture matrix (3x2 store in 4x4)\r\n * @returns true is the matrix is the identity matrix\r\n */\r\n public isIdentityAs3x2(): boolean {\r\n if (this._isIdentity3x2Dirty) {\r\n this._isIdentity3x2Dirty = false;\r\n if (this._m[0] !== 1.0 || this._m[5] !== 1.0 || this._m[15] !== 1.0) {\r\n this._isIdentity3x2 = false;\r\n } else if (\r\n this._m[1] !== 0.0 ||\r\n this._m[2] !== 0.0 ||\r\n this._m[3] !== 0.0 ||\r\n this._m[4] !== 0.0 ||\r\n this._m[6] !== 0.0 ||\r\n this._m[7] !== 0.0 ||\r\n this._m[8] !== 0.0 ||\r\n this._m[9] !== 0.0 ||\r\n this._m[10] !== 0.0 ||\r\n this._m[11] !== 0.0 ||\r\n this._m[12] !== 0.0 ||\r\n this._m[13] !== 0.0 ||\r\n this._m[14] !== 0.0\r\n ) {\r\n this._isIdentity3x2 = false;\r\n } else {\r\n this._isIdentity3x2 = true;\r\n }\r\n }\r\n\r\n return this._isIdentity3x2;\r\n }\r\n\r\n /**\r\n * Gets the determinant of the matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#34\r\n * @returns the matrix determinant\r\n */\r\n public determinant(): number {\r\n if (this._isIdentity === true) {\r\n return 1;\r\n }\r\n\r\n const m = this._m;\r\n const m00 = m[0],\r\n m01 = m[1],\r\n m02 = m[2],\r\n m03 = m[3];\r\n const m10 = m[4],\r\n m11 = m[5],\r\n m12 = m[6],\r\n m13 = m[7];\r\n const m20 = m[8],\r\n m21 = m[9],\r\n m22 = m[10],\r\n m23 = m[11];\r\n const m30 = m[12],\r\n m31 = m[13],\r\n m32 = m[14],\r\n m33 = m[15];\r\n // https://en.wikipedia.org/wiki/Laplace_expansion\r\n // to compute the deterrminant of a 4x4 Matrix we compute the cofactors of any row or column,\r\n // then we multiply each Cofactor by its corresponding matrix value and sum them all to get the determinant\r\n // Cofactor(i, j) = sign(i,j) * det(Minor(i, j))\r\n // where\r\n // - sign(i,j) = (i+j) % 2 === 0 ? 1 : -1\r\n // - Minor(i, j) is the 3x3 matrix we get by removing row i and column j from current Matrix\r\n //\r\n // Here we do that for the 1st row.\r\n\r\n const det_22_33 = m22 * m33 - m32 * m23;\r\n const det_21_33 = m21 * m33 - m31 * m23;\r\n const det_21_32 = m21 * m32 - m31 * m22;\r\n const det_20_33 = m20 * m33 - m30 * m23;\r\n const det_20_32 = m20 * m32 - m22 * m30;\r\n const det_20_31 = m20 * m31 - m30 * m21;\r\n const cofact_00 = +(m11 * det_22_33 - m12 * det_21_33 + m13 * det_21_32);\r\n const cofact_01 = -(m10 * det_22_33 - m12 * det_20_33 + m13 * det_20_32);\r\n const cofact_02 = +(m10 * det_21_33 - m11 * det_20_33 + m13 * det_20_31);\r\n const cofact_03 = -(m10 * det_21_32 - m11 * det_20_32 + m12 * det_20_31);\r\n return m00 * cofact_00 + m01 * cofact_01 + m02 * cofact_02 + m03 * cofact_03;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Gets a string with the Matrix values\r\n * @returns a string with the Matrix values\r\n */\r\n public toString(): string {\r\n return `{${this.m[0]}, ${this.m[1]}, ${this.m[2]}, ${this.m[3]}\\n${this.m[4]}, ${this.m[5]}, ${this.m[6]}, ${this.m[7]}\\n${this.m[8]}, ${this.m[9]}, ${this.m[10]}, ${this.m[11]}\\n${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`;\r\n }\r\n\r\n /**\r\n * Returns the matrix as a Float32Array or Array\r\n * @deprecated Use asArray\r\n */\r\n public toArray(): FloatArray;\r\n\r\n /**\r\n * Stores the matrix in a Float32Array or Array\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#49\r\n * @param array The destination array\r\n * @param index The destination index to start ay\r\n * @returns the matrix\r\n */\r\n public toArray(array: FloatArray, index: number): this;\r\n public toArray(array: Nullable = null, index: number = 0): this | FloatArray {\r\n if (!array) {\r\n return this._m;\r\n }\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n array[index + i] = m[i];\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the matrix as a Float32Array or Array\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#114\r\n * @returns the matrix underlying array.\r\n */\r\n public asArray(): Tuple {\r\n return this._m;\r\n }\r\n\r\n public fromArray(array: FloatArray, index: number = 0): this {\r\n return Matrix.FromArrayToRef(array, index, this);\r\n }\r\n\r\n public copyFromFloats(...floats: Tuple): this {\r\n return Matrix.FromArrayToRef(floats, 0, this);\r\n }\r\n\r\n public set(...values: Tuple): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = values[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public setAll(value: number): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = value;\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Inverts the current matrix in place\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#118\r\n * @returns the current inverted matrix\r\n */\r\n public invert(): this {\r\n this.invertToRef(this);\r\n return this;\r\n }\r\n /**\r\n * Sets all the matrix elements to zero\r\n * @returns the current matrix\r\n */\r\n public reset(): this {\r\n Matrix.FromValuesToRef(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, this);\r\n this._updateIdentityStatus(false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the current matrix with a second one\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#44\r\n * @param other defines the matrix to add\r\n * @returns a new matrix as the addition of the current matrix and the given one\r\n */\r\n public add(other: DeepImmutable): this {\r\n const result = new (this.constructor as Constructor)();\r\n this.addToRef(other, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given matrix \"result\" to the addition of the current matrix and the given one\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#45\r\n * @param other defines the matrix to add\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public addToRef(other: DeepImmutable, result: T): T {\r\n const m = this._m;\r\n const resultM = result._m;\r\n const otherM = other.m;\r\n for (let index = 0; index < 16; index++) {\r\n resultM[index] = m[index] + otherM[index];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds in place the given matrix to the current matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#46\r\n * @param other defines the second operand\r\n * @returns the current updated matrix\r\n */\r\n public addToSelf(other: DeepImmutable): this {\r\n const m = this._m;\r\n const otherM = other.m;\r\n for (let index = 0; index < 16; index++) {\r\n m[index] += otherM[index];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public addInPlace(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] += otherM[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public addInPlaceFromFloats(...floats: Tuple): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] += floats[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public subtract(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] -= otherM[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n public subtractToRef(other: DeepImmutable, result: T): T {\r\n const m = this._m,\r\n otherM = other.m,\r\n resultM = result._m;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = m[i] - otherM[i];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n public subtractInPlace(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] -= otherM[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public subtractFromFloats(...floats: Tuple): this {\r\n return this.subtractFromFloatsToRef(...floats, new (this.constructor as Constructor)());\r\n }\r\n\r\n public subtractFromFloatsToRef(...args: [...Tuple, T]): T {\r\n const result = args.pop() as T,\r\n m = this._m,\r\n resultM = result._m,\r\n values = args as unknown as Tuple;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = m[i] - values[i];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given matrix to the current inverted Matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#119\r\n * @param other defines the target matrix\r\n * @returns result input\r\n */\r\n public invertToRef(other: T): T {\r\n if (this._isIdentity === true) {\r\n Matrix.IdentityToRef(other);\r\n return other;\r\n }\r\n\r\n // the inverse of a Matrix is the transpose of cofactor matrix divided by the determinant\r\n const m = this._m;\r\n const m00 = m[0],\r\n m01 = m[1],\r\n m02 = m[2],\r\n m03 = m[3];\r\n const m10 = m[4],\r\n m11 = m[5],\r\n m12 = m[6],\r\n m13 = m[7];\r\n const m20 = m[8],\r\n m21 = m[9],\r\n m22 = m[10],\r\n m23 = m[11];\r\n const m30 = m[12],\r\n m31 = m[13],\r\n m32 = m[14],\r\n m33 = m[15];\r\n\r\n const det_22_33 = m22 * m33 - m32 * m23;\r\n const det_21_33 = m21 * m33 - m31 * m23;\r\n const det_21_32 = m21 * m32 - m31 * m22;\r\n const det_20_33 = m20 * m33 - m30 * m23;\r\n const det_20_32 = m20 * m32 - m22 * m30;\r\n const det_20_31 = m20 * m31 - m30 * m21;\r\n\r\n const cofact_00 = +(m11 * det_22_33 - m12 * det_21_33 + m13 * det_21_32);\r\n const cofact_01 = -(m10 * det_22_33 - m12 * det_20_33 + m13 * det_20_32);\r\n const cofact_02 = +(m10 * det_21_33 - m11 * det_20_33 + m13 * det_20_31);\r\n const cofact_03 = -(m10 * det_21_32 - m11 * det_20_32 + m12 * det_20_31);\r\n\r\n const det = m00 * cofact_00 + m01 * cofact_01 + m02 * cofact_02 + m03 * cofact_03;\r\n\r\n if (det === 0) {\r\n // not invertible\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n\r\n const detInv = 1 / det;\r\n const det_12_33 = m12 * m33 - m32 * m13;\r\n const det_11_33 = m11 * m33 - m31 * m13;\r\n const det_11_32 = m11 * m32 - m31 * m12;\r\n const det_10_33 = m10 * m33 - m30 * m13;\r\n const det_10_32 = m10 * m32 - m30 * m12;\r\n const det_10_31 = m10 * m31 - m30 * m11;\r\n const det_12_23 = m12 * m23 - m22 * m13;\r\n const det_11_23 = m11 * m23 - m21 * m13;\r\n const det_11_22 = m11 * m22 - m21 * m12;\r\n const det_10_23 = m10 * m23 - m20 * m13;\r\n const det_10_22 = m10 * m22 - m20 * m12;\r\n const det_10_21 = m10 * m21 - m20 * m11;\r\n\r\n const cofact_10 = -(m01 * det_22_33 - m02 * det_21_33 + m03 * det_21_32);\r\n const cofact_11 = +(m00 * det_22_33 - m02 * det_20_33 + m03 * det_20_32);\r\n const cofact_12 = -(m00 * det_21_33 - m01 * det_20_33 + m03 * det_20_31);\r\n const cofact_13 = +(m00 * det_21_32 - m01 * det_20_32 + m02 * det_20_31);\r\n\r\n const cofact_20 = +(m01 * det_12_33 - m02 * det_11_33 + m03 * det_11_32);\r\n const cofact_21 = -(m00 * det_12_33 - m02 * det_10_33 + m03 * det_10_32);\r\n const cofact_22 = +(m00 * det_11_33 - m01 * det_10_33 + m03 * det_10_31);\r\n const cofact_23 = -(m00 * det_11_32 - m01 * det_10_32 + m02 * det_10_31);\r\n\r\n const cofact_30 = -(m01 * det_12_23 - m02 * det_11_23 + m03 * det_11_22);\r\n const cofact_31 = +(m00 * det_12_23 - m02 * det_10_23 + m03 * det_10_22);\r\n const cofact_32 = -(m00 * det_11_23 - m01 * det_10_23 + m03 * det_10_21);\r\n const cofact_33 = +(m00 * det_11_22 - m01 * det_10_22 + m02 * det_10_21);\r\n\r\n Matrix.FromValuesToRef(\r\n cofact_00 * detInv,\r\n cofact_10 * detInv,\r\n cofact_20 * detInv,\r\n cofact_30 * detInv,\r\n cofact_01 * detInv,\r\n cofact_11 * detInv,\r\n cofact_21 * detInv,\r\n cofact_31 * detInv,\r\n cofact_02 * detInv,\r\n cofact_12 * detInv,\r\n cofact_22 * detInv,\r\n cofact_32 * detInv,\r\n cofact_03 * detInv,\r\n cofact_13 * detInv,\r\n cofact_23 * detInv,\r\n cofact_33 * detInv,\r\n other\r\n );\r\n\r\n return other;\r\n }\r\n\r\n /**\r\n * add a value at the specified position in the current Matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#47\r\n * @param index the index of the value within the matrix. between 0 and 15.\r\n * @param value the value to be added\r\n * @returns the current updated matrix\r\n */\r\n public addAtIndex(index: number, value: number): this {\r\n this._m[index] += value;\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * mutiply the specified position in the current Matrix by a value\r\n * @param index the index of the value within the matrix. between 0 and 15.\r\n * @param value the value to be added\r\n * @returns the current updated matrix\r\n */\r\n public multiplyAtIndex(index: number, value: number): this {\r\n this._m[index] *= value;\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Inserts the translation vector (using 3 floats) in the current matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#120\r\n * @param x defines the 1st component of the translation\r\n * @param y defines the 2nd component of the translation\r\n * @param z defines the 3rd component of the translation\r\n * @returns the current updated matrix\r\n */\r\n public setTranslationFromFloats(x: number, y: number, z: number): this {\r\n this._m[12] = x;\r\n this._m[13] = y;\r\n this._m[14] = z;\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the translation vector (using 3 floats) in the current matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#20\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#48\r\n * @param x defines the 1st component of the translation\r\n * @param y defines the 2nd component of the translation\r\n * @param z defines the 3rd component of the translation\r\n * @returns the current updated matrix\r\n */\r\n public addTranslationFromFloats(x: number, y: number, z: number): this {\r\n this._m[12] += x;\r\n this._m[13] += y;\r\n this._m[14] += z;\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Inserts the translation vector in the current matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#121\r\n * @param vector3 defines the translation to insert\r\n * @returns the current updated matrix\r\n */\r\n public setTranslation(vector3: DeepImmutable): this {\r\n return this.setTranslationFromFloats(vector3._x, vector3._y, vector3._z);\r\n }\r\n\r\n /**\r\n * Gets the translation value of the current matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#122\r\n * @returns a new Vector3 as the extracted translation from the matrix\r\n */\r\n public getTranslation(): Vector3 {\r\n return new Vector3(this._m[12], this._m[13], this._m[14]);\r\n }\r\n\r\n /**\r\n * Fill a Vector3 with the extracted translation from the matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#123\r\n * @param result defines the Vector3 where to store the translation\r\n * @returns the current matrix\r\n */\r\n public getTranslationToRef(result: T): T {\r\n result.x = this._m[12];\r\n result.y = this._m[13];\r\n result.z = this._m[14];\r\n return result;\r\n }\r\n\r\n /**\r\n * Remove rotation and scaling part from the matrix\r\n * @returns the updated matrix\r\n */\r\n public removeRotationAndScaling(): this {\r\n const m = this.m;\r\n Matrix.FromValuesToRef(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, m[12], m[13], m[14], m[15], this);\r\n this._updateIdentityStatus(m[12] === 0 && m[13] === 0 && m[14] === 0 && m[15] === 1);\r\n return this;\r\n }\r\n\r\n /**\r\n * Copy the current matrix from the given one\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#21\r\n * @param other defines the source matrix\r\n * @returns the current updated matrix\r\n */\r\n public copyFrom(other: DeepImmutable): this {\r\n other.copyToArray(this._m);\r\n const o = other as Matrix;\r\n this.updateFlag = o.updateFlag;\r\n this._updateIdentityStatus(o._isIdentity, o._isIdentityDirty, o._isIdentity3x2, o._isIdentity3x2Dirty);\r\n return this;\r\n }\r\n\r\n /**\r\n * Populates the given array from the starting index with the current matrix values\r\n * @param array defines the target array\r\n * @param offset defines the offset in the target array where to start storing values\r\n * @returns the current matrix\r\n */\r\n public copyToArray(array: Float32Array | Array, offset: number = 0): this {\r\n const source = this._m;\r\n array[offset] = source[0];\r\n array[offset + 1] = source[1];\r\n array[offset + 2] = source[2];\r\n array[offset + 3] = source[3];\r\n array[offset + 4] = source[4];\r\n array[offset + 5] = source[5];\r\n array[offset + 6] = source[6];\r\n array[offset + 7] = source[7];\r\n array[offset + 8] = source[8];\r\n array[offset + 9] = source[9];\r\n array[offset + 10] = source[10];\r\n array[offset + 11] = source[11];\r\n array[offset + 12] = source[12];\r\n array[offset + 13] = source[13];\r\n array[offset + 14] = source[14];\r\n array[offset + 15] = source[15];\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiply two matrices\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#15\r\n * A.multiply(B) means apply B to A so result is B x A\r\n * @param other defines the second operand\r\n * @returns a new matrix set with the multiplication result of the current Matrix and the given one\r\n */\r\n public multiply(other: DeepImmutable): this {\r\n const result = new (this.constructor as Constructor)();\r\n this.multiplyToRef(other, result);\r\n return result;\r\n }\r\n\r\n public multiplyInPlace(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] *= otherM[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public multiplyByFloats(...floats: Tuple): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = floats[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiples the current matrix by the given floats and stores them in the given ref\r\n * @param args The floats and ref\r\n * @returns The updated ref\r\n */\r\n public multiplyByFloatsToRef(...args: [...Tuple, T]): T {\r\n const result = args.pop() as T,\r\n m = this._m,\r\n resultM = result._m,\r\n values = args as unknown as Tuple;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = m[i] * values[i];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given matrix \"result\" with the multiplication result of the current Matrix and the given one\r\n * A.multiplyToRef(B, R) means apply B to A and store in R and R = B x A\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#16\r\n * @param other defines the second operand\r\n * @param result defines the matrix where to store the multiplication\r\n * @returns result input\r\n */\r\n public multiplyToRef(other: DeepImmutable, result: T): T {\r\n if (this._isIdentity) {\r\n result.copyFrom(other);\r\n return result;\r\n }\r\n if ((other as Matrix)._isIdentity) {\r\n result.copyFrom(this);\r\n return result;\r\n }\r\n\r\n this.multiplyToArray(other, result._m, 0);\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the Float32Array \"result\" from the given index \"offset\" with the multiplication of the current matrix and the given one\r\n * @param other defines the second operand\r\n * @param result defines the array where to store the multiplication\r\n * @param offset defines the offset in the target array where to start storing values\r\n * @returns the current matrix\r\n */\r\n public multiplyToArray(other: DeepImmutable, result: Float32Array | Array, offset: number): this {\r\n const m = this._m;\r\n const otherM = other.m;\r\n const tm0 = m[0],\r\n tm1 = m[1],\r\n tm2 = m[2],\r\n tm3 = m[3];\r\n const tm4 = m[4],\r\n tm5 = m[5],\r\n tm6 = m[6],\r\n tm7 = m[7];\r\n const tm8 = m[8],\r\n tm9 = m[9],\r\n tm10 = m[10],\r\n tm11 = m[11];\r\n const tm12 = m[12],\r\n tm13 = m[13],\r\n tm14 = m[14],\r\n tm15 = m[15];\r\n\r\n const om0 = otherM[0],\r\n om1 = otherM[1],\r\n om2 = otherM[2],\r\n om3 = otherM[3];\r\n const om4 = otherM[4],\r\n om5 = otherM[5],\r\n om6 = otherM[6],\r\n om7 = otherM[7];\r\n const om8 = otherM[8],\r\n om9 = otherM[9],\r\n om10 = otherM[10],\r\n om11 = otherM[11];\r\n const om12 = otherM[12],\r\n om13 = otherM[13],\r\n om14 = otherM[14],\r\n om15 = otherM[15];\r\n\r\n result[offset] = tm0 * om0 + tm1 * om4 + tm2 * om8 + tm3 * om12;\r\n result[offset + 1] = tm0 * om1 + tm1 * om5 + tm2 * om9 + tm3 * om13;\r\n result[offset + 2] = tm0 * om2 + tm1 * om6 + tm2 * om10 + tm3 * om14;\r\n result[offset + 3] = tm0 * om3 + tm1 * om7 + tm2 * om11 + tm3 * om15;\r\n\r\n result[offset + 4] = tm4 * om0 + tm5 * om4 + tm6 * om8 + tm7 * om12;\r\n result[offset + 5] = tm4 * om1 + tm5 * om5 + tm6 * om9 + tm7 * om13;\r\n result[offset + 6] = tm4 * om2 + tm5 * om6 + tm6 * om10 + tm7 * om14;\r\n result[offset + 7] = tm4 * om3 + tm5 * om7 + tm6 * om11 + tm7 * om15;\r\n\r\n result[offset + 8] = tm8 * om0 + tm9 * om4 + tm10 * om8 + tm11 * om12;\r\n result[offset + 9] = tm8 * om1 + tm9 * om5 + tm10 * om9 + tm11 * om13;\r\n result[offset + 10] = tm8 * om2 + tm9 * om6 + tm10 * om10 + tm11 * om14;\r\n result[offset + 11] = tm8 * om3 + tm9 * om7 + tm10 * om11 + tm11 * om15;\r\n\r\n result[offset + 12] = tm12 * om0 + tm13 * om4 + tm14 * om8 + tm15 * om12;\r\n result[offset + 13] = tm12 * om1 + tm13 * om5 + tm14 * om9 + tm15 * om13;\r\n result[offset + 14] = tm12 * om2 + tm13 * om6 + tm14 * om10 + tm15 * om14;\r\n result[offset + 15] = tm12 * om3 + tm13 * om7 + tm14 * om11 + tm15 * om15;\r\n return this;\r\n }\r\n\r\n public divide(other: DeepImmutable): this {\r\n return this.divideToRef(other, new (this.constructor as Constructor)());\r\n }\r\n\r\n public divideToRef(other: DeepImmutable, result: T): T {\r\n const m = this._m,\r\n otherM = other.m,\r\n resultM = result._m;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = m[i] / otherM[i];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n public divideInPlace(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] /= otherM[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public minimizeInPlace(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = Math.min(m[i], otherM[i]);\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public minimizeInPlaceFromFloats(...floats: Tuple): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = Math.min(m[i], floats[i]);\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public maximizeInPlace(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = Math.min(m[i], otherM[i]);\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public maximizeInPlaceFromFloats(...floats: Tuple): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = Math.min(m[i], floats[i]);\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public negate(): this {\r\n return this.negateToRef(new (this.constructor as Constructor)());\r\n }\r\n\r\n public negateInPlace(): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = -m[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public negateToRef(result: T): T {\r\n const m = this._m,\r\n resultM = result._m;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = -m[i];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Check equality between this matrix and a second one\r\n * @param value defines the second matrix to compare\r\n * @returns true is the current matrix and the given one values are strictly equal\r\n */\r\n public equals(value: DeepImmutable): boolean {\r\n const other = value as Matrix;\r\n if (!other) {\r\n return false;\r\n }\r\n\r\n if (this._isIdentity || other._isIdentity) {\r\n if (!this._isIdentityDirty && !other._isIdentityDirty) {\r\n return this._isIdentity && other._isIdentity;\r\n }\r\n }\r\n\r\n const m = this.m;\r\n const om = other.m;\r\n return (\r\n m[0] === om[0] &&\r\n m[1] === om[1] &&\r\n m[2] === om[2] &&\r\n m[3] === om[3] &&\r\n m[4] === om[4] &&\r\n m[5] === om[5] &&\r\n m[6] === om[6] &&\r\n m[7] === om[7] &&\r\n m[8] === om[8] &&\r\n m[9] === om[9] &&\r\n m[10] === om[10] &&\r\n m[11] === om[11] &&\r\n m[12] === om[12] &&\r\n m[13] === om[13] &&\r\n m[14] === om[14] &&\r\n m[15] === om[15]\r\n );\r\n }\r\n\r\n public equalsWithEpsilon(other: DeepImmutable, epsilon: number = 0): boolean {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n if (!WithinEpsilon(m[i], otherM[i], epsilon)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n public equalsToFloats(...floats: Tuple): boolean {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n if (m[i] != floats[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n public floor(): this {\r\n return this.floorToRef(new (this.constructor as Constructor)());\r\n }\r\n\r\n public floorToRef(result: T): T {\r\n const m = this._m,\r\n resultM = result._m;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = Math.floor(m[i]);\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n public fract(): this {\r\n return this.fractToRef(new (this.constructor as Constructor)());\r\n }\r\n\r\n public fractToRef(result: T): T {\r\n const m = this._m,\r\n resultM = result._m;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = m[i] - Math.floor(m[i]);\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Clone the current matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#18\r\n * @returns a new matrix from the current matrix\r\n */\r\n public clone(): this {\r\n const matrix = new (this.constructor as Constructor)();\r\n matrix.copyFrom(this);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Returns the name of the current matrix class\r\n * @returns the string \"Matrix\"\r\n */\r\n public getClassName(): string {\r\n return \"Matrix\";\r\n }\r\n\r\n /**\r\n * Gets the hash code of the current matrix\r\n * @returns the hash code\r\n */\r\n public getHashCode(): number {\r\n let hash = _ExtractAsInt(this._m[0]);\r\n for (let i = 1; i < 16; i++) {\r\n hash = (hash * 397) ^ _ExtractAsInt(this._m[i]);\r\n }\r\n return hash;\r\n }\r\n\r\n /**\r\n * Decomposes the current Matrix into a translation, rotation and scaling components of the provided node\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#13\r\n * @param node the node to decompose the matrix to\r\n * @returns true if operation was successful\r\n */\r\n public decomposeToTransformNode(node: TransformNode): boolean {\r\n node.rotationQuaternion = node.rotationQuaternion || new Quaternion();\r\n return this.decompose(node.scaling, node.rotationQuaternion, node.position);\r\n }\r\n /**\r\n * Decomposes the current Matrix into a translation, rotation and scaling components\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#12\r\n * @param scale defines the scale vector3 given as a reference to update\r\n * @param rotation defines the rotation quaternion given as a reference to update\r\n * @param translation defines the translation vector3 given as a reference to update\r\n * @param preserveScalingNode Use scaling sign coming from this node. Otherwise scaling sign might change.\r\n * @param useAbsoluteScaling Use scaling sign coming from this absoluteScaling when true or scaling otherwise.\r\n * @returns true if operation was successful\r\n */\r\n public decompose(scale?: Vector3, rotation?: Quaternion, translation?: Vector3, preserveScalingNode?: TransformNode, useAbsoluteScaling: boolean = true): boolean {\r\n if (this._isIdentity) {\r\n if (translation) {\r\n translation.setAll(0);\r\n }\r\n if (scale) {\r\n scale.setAll(1);\r\n }\r\n if (rotation) {\r\n rotation.copyFromFloats(0, 0, 0, 1);\r\n }\r\n return true;\r\n }\r\n\r\n const m = this._m;\r\n if (translation) {\r\n translation.copyFromFloats(m[12], m[13], m[14]);\r\n }\r\n\r\n scale = scale || MathTmp.Vector3[0];\r\n\r\n scale.x = Math.sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]);\r\n scale.y = Math.sqrt(m[4] * m[4] + m[5] * m[5] + m[6] * m[6]);\r\n scale.z = Math.sqrt(m[8] * m[8] + m[9] * m[9] + m[10] * m[10]);\r\n\r\n if (preserveScalingNode) {\r\n const signX = (useAbsoluteScaling ? preserveScalingNode.absoluteScaling.x : preserveScalingNode.scaling.x) < 0 ? -1 : 1;\r\n const signY = (useAbsoluteScaling ? preserveScalingNode.absoluteScaling.y : preserveScalingNode.scaling.y) < 0 ? -1 : 1;\r\n const signZ = (useAbsoluteScaling ? preserveScalingNode.absoluteScaling.z : preserveScalingNode.scaling.z) < 0 ? -1 : 1;\r\n\r\n scale.x *= signX;\r\n scale.y *= signY;\r\n scale.z *= signZ;\r\n } else {\r\n if (this.determinant() <= 0) {\r\n scale.y *= -1;\r\n }\r\n }\r\n\r\n if (scale._x === 0 || scale._y === 0 || scale._z === 0) {\r\n if (rotation) {\r\n rotation.copyFromFloats(0.0, 0.0, 0.0, 1.0);\r\n }\r\n return false;\r\n }\r\n\r\n if (rotation) {\r\n const sx = 1 / scale._x,\r\n sy = 1 / scale._y,\r\n sz = 1 / scale._z;\r\n Matrix.FromValuesToRef(\r\n m[0] * sx,\r\n m[1] * sx,\r\n m[2] * sx,\r\n 0.0,\r\n m[4] * sy,\r\n m[5] * sy,\r\n m[6] * sy,\r\n 0.0,\r\n m[8] * sz,\r\n m[9] * sz,\r\n m[10] * sz,\r\n 0.0,\r\n 0.0,\r\n 0.0,\r\n 0.0,\r\n 1.0,\r\n MathTmp.Matrix[0]\r\n );\r\n\r\n Quaternion.FromRotationMatrixToRef(MathTmp.Matrix[0], rotation);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets specific row of the matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\r\n * @param index defines the number of the row to get\r\n * @returns the index-th row of the current matrix as a new Vector4\r\n */\r\n public getRow(index: number): Nullable {\r\n if (index < 0 || index > 3) {\r\n return null;\r\n }\r\n const i = index * 4;\r\n return new Vector4(this._m[i + 0], this._m[i + 1], this._m[i + 2], this._m[i + 3]);\r\n }\r\n\r\n /**\r\n * Gets specific row of the matrix to ref\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\r\n * @param index defines the number of the row to get\r\n * @param rowVector vector to store the index-th row of the current matrix\r\n * @returns result input\r\n */\r\n public getRowToRef(index: number, rowVector: T): T {\r\n if (index >= 0 && index <= 3) {\r\n const i = index * 4;\r\n rowVector.x = this._m[i + 0];\r\n rowVector.y = this._m[i + 1];\r\n rowVector.z = this._m[i + 2];\r\n rowVector.w = this._m[i + 3];\r\n }\r\n return rowVector;\r\n }\r\n\r\n /**\r\n * Sets the index-th row of the current matrix to the vector4 values\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\r\n * @param index defines the number of the row to set\r\n * @param row defines the target vector4\r\n * @returns the updated current matrix\r\n */\r\n public setRow(index: number, row: Vector4): this {\r\n return this.setRowFromFloats(index, row.x, row.y, row.z, row.w);\r\n }\r\n\r\n /**\r\n * Compute the transpose of the matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#40\r\n * @returns the new transposed matrix\r\n */\r\n public transpose(): this {\r\n const result = new (this.constructor as Constructor)();\r\n Matrix.TransposeToRef(this, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Compute the transpose of the matrix and store it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#41\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public transposeToRef(result: T): T {\r\n Matrix.TransposeToRef(this, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the index-th row of the current matrix with the given 4 x float values\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\r\n * @param index defines the row index\r\n * @param x defines the x component to set\r\n * @param y defines the y component to set\r\n * @param z defines the z component to set\r\n * @param w defines the w component to set\r\n * @returns the updated current matrix\r\n */\r\n public setRowFromFloats(index: number, x: number, y: number, z: number, w: number): this {\r\n if (index < 0 || index > 3) {\r\n return this;\r\n }\r\n const i = index * 4;\r\n this._m[i + 0] = x;\r\n this._m[i + 1] = y;\r\n this._m[i + 2] = z;\r\n this._m[i + 3] = w;\r\n\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Compute a new matrix set with the current matrix values multiplied by scale (float)\r\n * @param scale defines the scale factor\r\n * @returns a new matrix\r\n */\r\n public scale(scale: number): this {\r\n const result = new (this.constructor as Constructor)();\r\n this.scaleToRef(scale, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Scale the current matrix values by a factor to a given result matrix\r\n * @param scale defines the scale factor\r\n * @param result defines the matrix to store the result\r\n * @returns result input\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n for (let index = 0; index < 16; index++) {\r\n result._m[index] = this._m[index] * scale;\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Scale the current matrix values by a factor and add the result to a given matrix\r\n * @param scale defines the scale factor\r\n * @param result defines the Matrix to store the result\r\n * @returns result input\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n for (let index = 0; index < 16; index++) {\r\n result._m[index] += this._m[index] * scale;\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n public scaleInPlace(scale: number): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] *= scale;\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Writes to the given matrix a normal matrix, computed from this one (using values from identity matrix for fourth row and column).\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#17\r\n * @param ref matrix to store the result\r\n * @returns the reference matrix\r\n */\r\n public toNormalMatrix(ref: T): T {\r\n const tmp = MathTmp.Matrix[0];\r\n this.invertToRef(tmp);\r\n tmp.transposeToRef(ref);\r\n const m = ref._m;\r\n Matrix.FromValuesToRef(m[0], m[1], m[2], 0.0, m[4], m[5], m[6], 0.0, m[8], m[9], m[10], 0.0, 0.0, 0.0, 0.0, 1.0, ref);\r\n return ref;\r\n }\r\n\r\n /**\r\n * Gets only rotation part of the current matrix\r\n * @returns a new matrix sets to the extracted rotation matrix from the current one\r\n */\r\n public getRotationMatrix(): this {\r\n const result = new (this.constructor as Constructor)();\r\n this.getRotationMatrixToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Extracts the rotation matrix from the current one and sets it as the given \"result\"\r\n * @param result defines the target matrix to store data to\r\n * @returns result input\r\n */\r\n public getRotationMatrixToRef(result: T): T {\r\n const scale = MathTmp.Vector3[0];\r\n if (!this.decompose(scale)) {\r\n Matrix.IdentityToRef(result);\r\n return result;\r\n }\r\n\r\n const m = this._m;\r\n const sx = 1 / scale._x,\r\n sy = 1 / scale._y,\r\n sz = 1 / scale._z;\r\n Matrix.FromValuesToRef(m[0] * sx, m[1] * sx, m[2] * sx, 0.0, m[4] * sy, m[5] * sy, m[6] * sy, 0.0, m[8] * sz, m[9] * sz, m[10] * sz, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Toggles model matrix from being right handed to left handed in place and vice versa\r\n * @returns the current updated matrix\r\n */\r\n public toggleModelMatrixHandInPlace(): this {\r\n const m = this._m;\r\n m[2] *= -1;\r\n m[6] *= -1;\r\n m[8] *= -1;\r\n m[9] *= -1;\r\n m[14] *= -1;\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Toggles projection matrix from being right handed to left handed in place and vice versa\r\n * @returns the current updated matrix\r\n */\r\n public toggleProjectionMatrixHandInPlace(): this {\r\n const m = this._m;\r\n m[8] *= -1;\r\n m[9] *= -1;\r\n m[10] *= -1;\r\n m[11] *= -1;\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a matrix from an array\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#42\r\n * @param array defines the source array\r\n * @param offset defines an offset in the source array\r\n * @returns a new Matrix set from the starting index of the given array\r\n */\r\n public static FromArray(array: DeepImmutable>, offset: number = 0): Matrix {\r\n const result = new Matrix();\r\n Matrix.FromArrayToRef(array, offset, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Copy the content of an array into a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#43\r\n * @param array defines the source array\r\n * @param offset defines an offset in the source array\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number, result: T): T {\r\n for (let index = 0; index < 16; index++) {\r\n result._m[index] = array[index + offset];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Stores an array into a matrix after having multiplied each component by a given factor\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#50\r\n * @param array defines the source array\r\n * @param offset defines the offset in the source array\r\n * @param scale defines the scaling factor\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static FromFloat32ArrayToRefScaled(array: DeepImmutable>, offset: number, scale: number, result: T): T {\r\n for (let index = 0; index < 16; index++) {\r\n result._m[index] = array[index + offset] * scale;\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets an identity matrix that must not be updated\r\n */\r\n public static get IdentityReadOnly(): DeepImmutable {\r\n return Matrix._IdentityReadOnly;\r\n }\r\n\r\n /**\r\n * Stores a list of values (16) inside a given matrix\r\n * @param initialM11 defines 1st value of 1st row\r\n * @param initialM12 defines 2nd value of 1st row\r\n * @param initialM13 defines 3rd value of 1st row\r\n * @param initialM14 defines 4th value of 1st row\r\n * @param initialM21 defines 1st value of 2nd row\r\n * @param initialM22 defines 2nd value of 2nd row\r\n * @param initialM23 defines 3rd value of 2nd row\r\n * @param initialM24 defines 4th value of 2nd row\r\n * @param initialM31 defines 1st value of 3rd row\r\n * @param initialM32 defines 2nd value of 3rd row\r\n * @param initialM33 defines 3rd value of 3rd row\r\n * @param initialM34 defines 4th value of 3rd row\r\n * @param initialM41 defines 1st value of 4th row\r\n * @param initialM42 defines 2nd value of 4th row\r\n * @param initialM43 defines 3rd value of 4th row\r\n * @param initialM44 defines 4th value of 4th row\r\n * @param result defines the target matrix\r\n */\r\n public static FromValuesToRef(\r\n initialM11: number,\r\n initialM12: number,\r\n initialM13: number,\r\n initialM14: number,\r\n initialM21: number,\r\n initialM22: number,\r\n initialM23: number,\r\n initialM24: number,\r\n initialM31: number,\r\n initialM32: number,\r\n initialM33: number,\r\n initialM34: number,\r\n initialM41: number,\r\n initialM42: number,\r\n initialM43: number,\r\n initialM44: number,\r\n result: Matrix\r\n ): void {\r\n const m = result._m;\r\n m[0] = initialM11;\r\n m[1] = initialM12;\r\n m[2] = initialM13;\r\n m[3] = initialM14;\r\n m[4] = initialM21;\r\n m[5] = initialM22;\r\n m[6] = initialM23;\r\n m[7] = initialM24;\r\n m[8] = initialM31;\r\n m[9] = initialM32;\r\n m[10] = initialM33;\r\n m[11] = initialM34;\r\n m[12] = initialM41;\r\n m[13] = initialM42;\r\n m[14] = initialM43;\r\n m[15] = initialM44;\r\n\r\n result.markAsUpdated();\r\n }\r\n\r\n /**\r\n * Creates new matrix from a list of values (16)\r\n * @param initialM11 defines 1st value of 1st row\r\n * @param initialM12 defines 2nd value of 1st row\r\n * @param initialM13 defines 3rd value of 1st row\r\n * @param initialM14 defines 4th value of 1st row\r\n * @param initialM21 defines 1st value of 2nd row\r\n * @param initialM22 defines 2nd value of 2nd row\r\n * @param initialM23 defines 3rd value of 2nd row\r\n * @param initialM24 defines 4th value of 2nd row\r\n * @param initialM31 defines 1st value of 3rd row\r\n * @param initialM32 defines 2nd value of 3rd row\r\n * @param initialM33 defines 3rd value of 3rd row\r\n * @param initialM34 defines 4th value of 3rd row\r\n * @param initialM41 defines 1st value of 4th row\r\n * @param initialM42 defines 2nd value of 4th row\r\n * @param initialM43 defines 3rd value of 4th row\r\n * @param initialM44 defines 4th value of 4th row\r\n * @returns the new matrix\r\n */\r\n public static FromValues(\r\n initialM11: number,\r\n initialM12: number,\r\n initialM13: number,\r\n initialM14: number,\r\n initialM21: number,\r\n initialM22: number,\r\n initialM23: number,\r\n initialM24: number,\r\n initialM31: number,\r\n initialM32: number,\r\n initialM33: number,\r\n initialM34: number,\r\n initialM41: number,\r\n initialM42: number,\r\n initialM43: number,\r\n initialM44: number\r\n ): Matrix {\r\n const result = new Matrix();\r\n const m = result._m;\r\n m[0] = initialM11;\r\n m[1] = initialM12;\r\n m[2] = initialM13;\r\n m[3] = initialM14;\r\n m[4] = initialM21;\r\n m[5] = initialM22;\r\n m[6] = initialM23;\r\n m[7] = initialM24;\r\n m[8] = initialM31;\r\n m[9] = initialM32;\r\n m[10] = initialM33;\r\n m[11] = initialM34;\r\n m[12] = initialM41;\r\n m[13] = initialM42;\r\n m[14] = initialM43;\r\n m[15] = initialM44;\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new matrix composed by merging scale (vector3), rotation (quaternion) and translation (vector3)\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#24\r\n * @param scale defines the scale vector3\r\n * @param rotation defines the rotation quaternion\r\n * @param translation defines the translation vector3\r\n * @returns a new matrix\r\n */\r\n public static Compose(scale: DeepImmutable, rotation: DeepImmutable, translation: DeepImmutable): Matrix {\r\n const result = new Matrix();\r\n Matrix.ComposeToRef(scale, rotation, translation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets a matrix to a value composed by merging scale (vector3), rotation (quaternion) and translation (vector3)\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#25\r\n * @param scale defines the scale vector3\r\n * @param rotation defines the rotation quaternion\r\n * @param translation defines the translation vector3\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static ComposeToRef(scale: DeepImmutable, rotation: DeepImmutable, translation: DeepImmutable, result: T): T {\r\n const m = result._m;\r\n const x = rotation._x,\r\n y = rotation._y,\r\n z = rotation._z,\r\n w = rotation._w;\r\n const x2 = x + x,\r\n y2 = y + y,\r\n z2 = z + z;\r\n const xx = x * x2,\r\n xy = x * y2,\r\n xz = x * z2;\r\n const yy = y * y2,\r\n yz = y * z2,\r\n zz = z * z2;\r\n const wx = w * x2,\r\n wy = w * y2,\r\n wz = w * z2;\r\n\r\n const sx = scale._x,\r\n sy = scale._y,\r\n sz = scale._z;\r\n\r\n m[0] = (1 - (yy + zz)) * sx;\r\n m[1] = (xy + wz) * sx;\r\n m[2] = (xz - wy) * sx;\r\n m[3] = 0;\r\n\r\n m[4] = (xy - wz) * sy;\r\n m[5] = (1 - (xx + zz)) * sy;\r\n m[6] = (yz + wx) * sy;\r\n m[7] = 0;\r\n\r\n m[8] = (xz + wy) * sz;\r\n m[9] = (yz - wx) * sz;\r\n m[10] = (1 - (xx + yy)) * sz;\r\n m[11] = 0;\r\n\r\n m[12] = translation._x;\r\n m[13] = translation._y;\r\n m[14] = translation._z;\r\n m[15] = 1;\r\n\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new identity matrix\r\n * @returns a new identity matrix\r\n */\r\n public static Identity(): Matrix {\r\n const identity = Matrix.FromValues(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0);\r\n identity._updateIdentityStatus(true);\r\n return identity;\r\n }\r\n\r\n /**\r\n * Creates a new identity matrix and stores the result in a given matrix\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static IdentityToRef(result: T): T {\r\n Matrix.FromValuesToRef(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n result._updateIdentityStatus(true);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new zero matrix\r\n * @returns a new zero matrix\r\n */\r\n public static Zero(): Matrix {\r\n const zero = Matrix.FromValues(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\n zero._updateIdentityStatus(false);\r\n return zero;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the X axis\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#97\r\n * @param angle defines the angle (in radians) to use\r\n * @returns the new matrix\r\n */\r\n public static RotationX(angle: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.RotationXToRef(angle, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new matrix as the invert of a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#124\r\n * @param source defines the source matrix\r\n * @returns the new matrix\r\n */\r\n public static Invert(source: DeepImmutable): T {\r\n const result = new (source.constructor as Constructor)();\r\n source.invertToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the X axis and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#98\r\n * @param angle defines the angle (in radians) to use\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static RotationXToRef(angle: number, result: T): T {\r\n const s = Math.sin(angle);\r\n const c = Math.cos(angle);\r\n Matrix.FromValuesToRef(1.0, 0.0, 0.0, 0.0, 0.0, c, s, 0.0, 0.0, -s, c, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n\r\n result._updateIdentityStatus(c === 1 && s === 0);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the Y axis\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#99\r\n * @param angle defines the angle (in radians) to use\r\n * @returns the new matrix\r\n */\r\n public static RotationY(angle: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.RotationYToRef(angle, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the Y axis and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#100\r\n * @param angle defines the angle (in radians) to use\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static RotationYToRef(angle: number, result: T): T {\r\n const s = Math.sin(angle);\r\n const c = Math.cos(angle);\r\n Matrix.FromValuesToRef(c, 0.0, -s, 0.0, 0.0, 1.0, 0.0, 0.0, s, 0.0, c, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n\r\n result._updateIdentityStatus(c === 1 && s === 0);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the Z axis\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#101\r\n * @param angle defines the angle (in radians) to use\r\n * @returns the new matrix\r\n */\r\n public static RotationZ(angle: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.RotationZToRef(angle, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the Z axis and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#102\r\n * @param angle defines the angle (in radians) to use\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static RotationZToRef(angle: number, result: T): T {\r\n const s = Math.sin(angle);\r\n const c = Math.cos(angle);\r\n Matrix.FromValuesToRef(c, s, 0.0, 0.0, -s, c, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n\r\n result._updateIdentityStatus(c === 1 && s === 0);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the given axis\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#96\r\n * @param axis defines the axis to use\r\n * @param angle defines the angle (in radians) to use\r\n * @returns the new matrix\r\n */\r\n public static RotationAxis(axis: DeepImmutable, angle: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.RotationAxisToRef(axis, angle, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the given axis and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#94\r\n * @param axis defines the axis to use\r\n * @param angle defines the angle (in radians) to use\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static RotationAxisToRef(axis: DeepImmutable, angle: number, result: T): T {\r\n const s = Math.sin(-angle);\r\n const c = Math.cos(-angle);\r\n const c1 = 1 - c;\r\n\r\n axis.normalize();\r\n const m = result._m;\r\n m[0] = axis._x * axis._x * c1 + c;\r\n m[1] = axis._x * axis._y * c1 - axis._z * s;\r\n m[2] = axis._x * axis._z * c1 + axis._y * s;\r\n m[3] = 0.0;\r\n\r\n m[4] = axis._y * axis._x * c1 + axis._z * s;\r\n m[5] = axis._y * axis._y * c1 + c;\r\n m[6] = axis._y * axis._z * c1 - axis._x * s;\r\n m[7] = 0.0;\r\n\r\n m[8] = axis._z * axis._x * c1 - axis._y * s;\r\n m[9] = axis._z * axis._y * c1 + axis._x * s;\r\n m[10] = axis._z * axis._z * c1 + c;\r\n m[11] = 0.0;\r\n\r\n m[12] = 0.0;\r\n m[13] = 0.0;\r\n m[14] = 0.0;\r\n m[15] = 1.0;\r\n\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Takes normalised vectors and returns a rotation matrix to align \"from\" with \"to\".\r\n * Taken from http://www.iquilezles.org/www/articles/noacos/noacos.htm\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#93\r\n * @param from defines the vector to align\r\n * @param to defines the vector to align to\r\n * @param result defines the target matrix\r\n * @param useYAxisForCoplanar defines a boolean indicating that we should favor Y axis for coplanar vectors (default is false)\r\n * @returns result input\r\n */\r\n public static RotationAlignToRef(from: DeepImmutable, to: DeepImmutable, result: T, useYAxisForCoplanar = false): T {\r\n const c = Vector3.Dot(to, from);\r\n const m = result._m;\r\n if (c < -1 + Epsilon) {\r\n // from and to are colinear and opposite direction.\r\n // compute a PI rotation on Y axis\r\n m[0] = -1;\r\n m[1] = 0;\r\n m[2] = 0;\r\n m[3] = 0;\r\n m[4] = 0;\r\n m[5] = useYAxisForCoplanar ? 1 : -1;\r\n m[6] = 0;\r\n m[7] = 0;\r\n m[8] = 0;\r\n m[9] = 0;\r\n m[10] = useYAxisForCoplanar ? -1 : 1;\r\n m[11] = 0;\r\n } else {\r\n const v = Vector3.Cross(to, from);\r\n const k = 1 / (1 + c);\r\n\r\n m[0] = v._x * v._x * k + c;\r\n m[1] = v._y * v._x * k - v._z;\r\n m[2] = v._z * v._x * k + v._y;\r\n m[3] = 0;\r\n m[4] = v._x * v._y * k + v._z;\r\n m[5] = v._y * v._y * k + c;\r\n m[6] = v._z * v._y * k - v._x;\r\n m[7] = 0;\r\n m[8] = v._x * v._z * k - v._y;\r\n m[9] = v._y * v._z * k + v._x;\r\n m[10] = v._z * v._z * k + c;\r\n m[11] = 0;\r\n }\r\n m[12] = 0;\r\n m[13] = 0;\r\n m[14] = 0;\r\n m[15] = 1;\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a rotation matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#103\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#105\r\n * @param yaw defines the yaw angle in radians (Y axis)\r\n * @param pitch defines the pitch angle in radians (X axis)\r\n * @param roll defines the roll angle in radians (Z axis)\r\n * @returns the new rotation matrix\r\n */\r\n public static RotationYawPitchRoll(yaw: number, pitch: number, roll: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.RotationYawPitchRollToRef(yaw, pitch, roll, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a rotation matrix and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#104\r\n * @param yaw defines the yaw angle in radians (Y axis)\r\n * @param pitch defines the pitch angle in radians (X axis)\r\n * @param roll defines the roll angle in radians (Z axis)\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static RotationYawPitchRollToRef(yaw: number, pitch: number, roll: number, result: T): T {\r\n Quaternion.RotationYawPitchRollToRef(yaw, pitch, roll, MathTmp.Quaternion[0]);\r\n MathTmp.Quaternion[0].toRotationMatrix(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a scaling matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#107\r\n * @param x defines the scale factor on X axis\r\n * @param y defines the scale factor on Y axis\r\n * @param z defines the scale factor on Z axis\r\n * @returns the new matrix\r\n */\r\n public static Scaling(x: number, y: number, z: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.ScalingToRef(x, y, z, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a scaling matrix and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#108\r\n * @param x defines the scale factor on X axis\r\n * @param y defines the scale factor on Y axis\r\n * @param z defines the scale factor on Z axis\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static ScalingToRef(x: number, y: number, z: number, result: T): T {\r\n Matrix.FromValuesToRef(x, 0.0, 0.0, 0.0, 0.0, y, 0.0, 0.0, 0.0, 0.0, z, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n\r\n result._updateIdentityStatus(x === 1 && y === 1 && z === 1);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a translation matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#109\r\n * @param x defines the translation on X axis\r\n * @param y defines the translation on Y axis\r\n * @param z defines the translationon Z axis\r\n * @returns the new matrix\r\n */\r\n public static Translation(x: number, y: number, z: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.TranslationToRef(x, y, z, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a translation matrix and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#110\r\n * @param x defines the translation on X axis\r\n * @param y defines the translation on Y axis\r\n * @param z defines the translationon Z axis\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static TranslationToRef(x: number, y: number, z: number, result: T): T {\r\n Matrix.FromValuesToRef(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, x, y, z, 1.0, result);\r\n result._updateIdentityStatus(x === 0 && y === 0 && z === 0);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Matrix whose values are the interpolated values for \"gradient\" (float) between the ones of the matrices \"startValue\" and \"endValue\".\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#55\r\n * @param startValue defines the start value\r\n * @param endValue defines the end value\r\n * @param gradient defines the gradient factor\r\n * @returns the new matrix\r\n */\r\n public static Lerp(startValue: DeepImmutable, endValue: DeepImmutable, gradient: number): T {\r\n const result = new (startValue.constructor as Constructor)();\r\n Matrix.LerpToRef(startValue, endValue, gradient, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Set the given matrix \"result\" as the interpolated values for \"gradient\" (float) between the ones of the matrices \"startValue\" and \"endValue\".\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#54\r\n * @param startValue defines the start value\r\n * @param endValue defines the end value\r\n * @param gradient defines the gradient factor\r\n * @param result defines the Matrix object where to store data\r\n * @returns result input\r\n */\r\n public static LerpToRef(startValue: DeepImmutable, endValue: DeepImmutable, gradient: number, result: T): T {\r\n const resultM = result._m;\r\n const startM = startValue.m;\r\n const endM = endValue.m;\r\n for (let index = 0; index < 16; index++) {\r\n resultM[index] = startM[index] * (1.0 - gradient) + endM[index] * gradient;\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Builds a new matrix whose values are computed by:\r\n * * decomposing the \"startValue\" and \"endValue\" matrices into their respective scale, rotation and translation matrices\r\n * * interpolating for \"gradient\" (float) the values between each of these decomposed matrices between the start and the end\r\n * * recomposing a new matrix from these 3 interpolated scale, rotation and translation matrices\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#22\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#51\r\n * @param startValue defines the first matrix\r\n * @param endValue defines the second matrix\r\n * @param gradient defines the gradient between the two matrices\r\n * @returns the new matrix\r\n */\r\n public static DecomposeLerp(startValue: DeepImmutable, endValue: DeepImmutable, gradient: number): T {\r\n const result = new (startValue.constructor as Constructor)();\r\n Matrix.DecomposeLerpToRef(startValue, endValue, gradient, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Update a matrix to values which are computed by:\r\n * * decomposing the \"startValue\" and \"endValue\" matrices into their respective scale, rotation and translation matrices\r\n * * interpolating for \"gradient\" (float) the values between each of these decomposed matrices between the start and the end\r\n * * recomposing a new matrix from these 3 interpolated scale, rotation and translation matrices\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#23\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#53\r\n * @param startValue defines the first matrix\r\n * @param endValue defines the second matrix\r\n * @param gradient defines the gradient between the two matrices\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static DecomposeLerpToRef(startValue: DeepImmutable, endValue: DeepImmutable, gradient: number, result: T): T {\r\n const startScale = MathTmp.Vector3[0];\r\n const startRotation = MathTmp.Quaternion[0];\r\n const startTranslation = MathTmp.Vector3[1];\r\n startValue.decompose(startScale, startRotation, startTranslation);\r\n\r\n const endScale = MathTmp.Vector3[2];\r\n const endRotation = MathTmp.Quaternion[1];\r\n const endTranslation = MathTmp.Vector3[3];\r\n endValue.decompose(endScale, endRotation, endTranslation);\r\n\r\n const resultScale = MathTmp.Vector3[4];\r\n Vector3.LerpToRef(startScale, endScale, gradient, resultScale);\r\n const resultRotation = MathTmp.Quaternion[2];\r\n Quaternion.SlerpToRef(startRotation, endRotation, gradient, resultRotation);\r\n\r\n const resultTranslation = MathTmp.Vector3[5];\r\n Vector3.LerpToRef(startTranslation, endTranslation, gradient, resultTranslation);\r\n\r\n Matrix.ComposeToRef(resultScale, resultRotation, resultTranslation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\r\n * This function generates a matrix suitable for a left handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#58\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#59\r\n * @param eye defines the final position of the entity\r\n * @param target defines where the entity should look at\r\n * @param up defines the up vector for the entity\r\n * @returns the new matrix\r\n */\r\n public static LookAtLH(eye: DeepImmutable, target: DeepImmutable, up: DeepImmutable): Matrix {\r\n const result = new Matrix();\r\n Matrix.LookAtLHToRef(eye, target, up, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\r\n * This function generates a matrix suitable for a left handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#60\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#61\r\n * @param eye defines the final position of the entity\r\n * @param target defines where the entity should look at\r\n * @param up defines the up vector for the entity\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static LookAtLHToRef(eye: DeepImmutable, target: DeepImmutable, up: DeepImmutable, result: Matrix): Matrix {\r\n const xAxis = MathTmp.Vector3[0];\r\n const yAxis = MathTmp.Vector3[1];\r\n const zAxis = MathTmp.Vector3[2];\r\n\r\n // Z axis\r\n target.subtractToRef(eye, zAxis);\r\n zAxis.normalize();\r\n\r\n // X axis\r\n Vector3.CrossToRef(up, zAxis, xAxis);\r\n\r\n const xSquareLength = xAxis.lengthSquared();\r\n if (xSquareLength === 0) {\r\n xAxis.x = 1.0;\r\n } else {\r\n xAxis.normalizeFromLength(Math.sqrt(xSquareLength));\r\n }\r\n\r\n // Y axis\r\n Vector3.CrossToRef(zAxis, xAxis, yAxis);\r\n yAxis.normalize();\r\n\r\n // Eye angles\r\n const ex = -Vector3.Dot(xAxis, eye);\r\n const ey = -Vector3.Dot(yAxis, eye);\r\n const ez = -Vector3.Dot(zAxis, eye);\r\n\r\n Matrix.FromValuesToRef(xAxis._x, yAxis._x, zAxis._x, 0.0, xAxis._y, yAxis._y, zAxis._y, 0.0, xAxis._z, yAxis._z, zAxis._z, 0.0, ex, ey, ez, 1.0, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\r\n * This function generates a matrix suitable for a right handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#62\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#63\r\n * @param eye defines the final position of the entity\r\n * @param target defines where the entity should look at\r\n * @param up defines the up vector for the entity\r\n * @returns the new matrix\r\n */\r\n public static LookAtRH(eye: DeepImmutable, target: DeepImmutable, up: DeepImmutable): Matrix {\r\n const result = new Matrix();\r\n Matrix.LookAtRHToRef(eye, target, up, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\r\n * This function generates a matrix suitable for a right handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#64\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#65\r\n * @param eye defines the final position of the entity\r\n * @param target defines where the entity should look at\r\n * @param up defines the up vector for the entity\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static LookAtRHToRef(eye: DeepImmutable, target: DeepImmutable, up: DeepImmutable, result: T): T {\r\n const xAxis = MathTmp.Vector3[0];\r\n const yAxis = MathTmp.Vector3[1];\r\n const zAxis = MathTmp.Vector3[2];\r\n\r\n // Z axis\r\n eye.subtractToRef(target, zAxis);\r\n zAxis.normalize();\r\n\r\n // X axis\r\n Vector3.CrossToRef(up, zAxis, xAxis);\r\n\r\n const xSquareLength = xAxis.lengthSquared();\r\n if (xSquareLength === 0) {\r\n xAxis.x = 1.0;\r\n } else {\r\n xAxis.normalizeFromLength(Math.sqrt(xSquareLength));\r\n }\r\n\r\n // Y axis\r\n Vector3.CrossToRef(zAxis, xAxis, yAxis);\r\n yAxis.normalize();\r\n\r\n // Eye angles\r\n const ex = -Vector3.Dot(xAxis, eye);\r\n const ey = -Vector3.Dot(yAxis, eye);\r\n const ez = -Vector3.Dot(zAxis, eye);\r\n\r\n Matrix.FromValuesToRef(xAxis._x, yAxis._x, zAxis._x, 0.0, xAxis._y, yAxis._y, zAxis._y, 0.0, xAxis._z, yAxis._z, zAxis._z, 0.0, ex, ey, ez, 1.0, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\r\n * This function generates a matrix suitable for a left handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#66\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @returns the new matrix\r\n */\r\n public static LookDirectionLH(forward: DeepImmutable, up: DeepImmutable): Matrix {\r\n const result = new Matrix();\r\n Matrix.LookDirectionLHToRef(forward, up, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\r\n * This function generates a matrix suitable for a left handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#67\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static LookDirectionLHToRef(forward: DeepImmutable, up: DeepImmutable, result: T): T {\r\n const back = MathTmp.Vector3[0];\r\n back.copyFrom(forward);\r\n back.scaleInPlace(-1);\r\n const left = MathTmp.Vector3[1];\r\n Vector3.CrossToRef(up, back, left);\r\n\r\n // Generate the rotation matrix.\r\n Matrix.FromValuesToRef(left._x, left._y, left._z, 0.0, up._x, up._y, up._z, 0.0, back._x, back._y, back._z, 0.0, 0, 0, 0, 1.0, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\r\n * This function generates a matrix suitable for a right handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#68\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @returns the new matrix\r\n */\r\n public static LookDirectionRH(forward: DeepImmutable, up: DeepImmutable): Matrix {\r\n const result = new Matrix();\r\n Matrix.LookDirectionRHToRef(forward, up, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\r\n * This function generates a matrix suitable for a right handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#69\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static LookDirectionRHToRef(forward: DeepImmutable, up: DeepImmutable, result: T): T {\r\n const right = MathTmp.Vector3[2];\r\n Vector3.CrossToRef(up, forward, right);\r\n\r\n // Generate the rotation matrix.\r\n Matrix.FromValuesToRef(right._x, right._y, right._z, 0.0, up._x, up._y, up._z, 0.0, forward._x, forward._y, forward._z, 0.0, 0, 0, 0, 1.0, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a left-handed orthographic projection matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#70\r\n * @param width defines the viewport width\r\n * @param height defines the viewport height\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns a new matrix as a left-handed orthographic projection matrix\r\n */\r\n public static OrthoLH(width: number, height: number, znear: number, zfar: number, halfZRange?: boolean): Matrix {\r\n const matrix = new Matrix();\r\n Matrix.OrthoLHToRef(width, height, znear, zfar, matrix, halfZRange);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Store a left-handed orthographic projection to a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#71\r\n * @param width defines the viewport width\r\n * @param height defines the viewport height\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param result defines the target matrix\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns result input\r\n */\r\n public static OrthoLHToRef(width: number, height: number, znear: number, zfar: number, result: T, halfZRange?: boolean): T {\r\n const n = znear;\r\n const f = zfar;\r\n\r\n const a = 2.0 / width;\r\n const b = 2.0 / height;\r\n const c = 2.0 / (f - n);\r\n const d = -(f + n) / (f - n);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, 0.0, 0.0, 0.0, c, 0.0, 0.0, 0.0, d, 1.0, result);\r\n\r\n if (halfZRange) {\r\n result.multiplyToRef(mtxConvertNDCToHalfZRange, result);\r\n }\r\n\r\n result._updateIdentityStatus(a === 1 && b === 1 && c === 1 && d === 0);\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a left-handed orthographic projection matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#72\r\n * @param left defines the viewport left coordinate\r\n * @param right defines the viewport right coordinate\r\n * @param bottom defines the viewport bottom coordinate\r\n * @param top defines the viewport top coordinate\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns a new matrix as a left-handed orthographic projection matrix\r\n */\r\n public static OrthoOffCenterLH(left: number, right: number, bottom: number, top: number, znear: number, zfar: number, halfZRange?: boolean): Matrix {\r\n const matrix = new Matrix();\r\n Matrix.OrthoOffCenterLHToRef(left, right, bottom, top, znear, zfar, matrix, halfZRange);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Stores a left-handed orthographic projection into a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#73\r\n * @param left defines the viewport left coordinate\r\n * @param right defines the viewport right coordinate\r\n * @param bottom defines the viewport bottom coordinate\r\n * @param top defines the viewport top coordinate\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param result defines the target matrix\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns result input\r\n */\r\n public static OrthoOffCenterLHToRef(\r\n left: number,\r\n right: number,\r\n bottom: number,\r\n top: number,\r\n znear: number,\r\n zfar: number,\r\n result: T,\r\n halfZRange?: boolean\r\n ): T {\r\n const n = znear;\r\n const f = zfar;\r\n\r\n const a = 2.0 / (right - left);\r\n const b = 2.0 / (top - bottom);\r\n const c = 2.0 / (f - n);\r\n const d = -(f + n) / (f - n);\r\n const i0 = (left + right) / (left - right);\r\n const i1 = (top + bottom) / (bottom - top);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, 0.0, 0.0, 0.0, c, 0.0, i0, i1, d, 1.0, result);\r\n\r\n if (halfZRange) {\r\n result.multiplyToRef(mtxConvertNDCToHalfZRange, result);\r\n }\r\n\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Stores a left-handed oblique projection into a given matrix\r\n * @param left defines the viewport left coordinate\r\n * @param right defines the viewport right coordinate\r\n * @param bottom defines the viewport bottom coordinate\r\n * @param top defines the viewport top coordinate\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param length Length of the shear\r\n * @param angle Angle (along X/Y Plane) to apply shear\r\n * @param distance Distance from shear point\r\n * @param result defines the target matrix\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns result input\r\n */\r\n public static ObliqueOffCenterLHToRef(\r\n left: number,\r\n right: number,\r\n bottom: number,\r\n top: number,\r\n znear: number,\r\n zfar: number,\r\n length: number,\r\n angle: number,\r\n distance: number,\r\n result: T,\r\n halfZRange?: boolean\r\n ): T {\r\n const a = -length * Math.cos(angle);\r\n const b = -length * Math.sin(angle);\r\n\r\n Matrix.TranslationToRef(0, 0, -distance, MathTmp.Matrix[1]);\r\n Matrix.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, a, b, 1, 0, 0, 0, 0, 1, MathTmp.Matrix[0]);\r\n MathTmp.Matrix[1].multiplyToRef(MathTmp.Matrix[0], MathTmp.Matrix[0]);\r\n Matrix.TranslationToRef(0, 0, distance, MathTmp.Matrix[1]);\r\n MathTmp.Matrix[0].multiplyToRef(MathTmp.Matrix[1], MathTmp.Matrix[0]);\r\n\r\n Matrix.OrthoOffCenterLHToRef(left, right, bottom, top, znear, zfar, result, halfZRange);\r\n MathTmp.Matrix[0].multiplyToRef(result, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a right-handed orthographic projection matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#76\r\n * @param left defines the viewport left coordinate\r\n * @param right defines the viewport right coordinate\r\n * @param bottom defines the viewport bottom coordinate\r\n * @param top defines the viewport top coordinate\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns a new matrix as a right-handed orthographic projection matrix\r\n */\r\n public static OrthoOffCenterRH(left: number, right: number, bottom: number, top: number, znear: number, zfar: number, halfZRange?: boolean): Matrix {\r\n const matrix = new Matrix();\r\n Matrix.OrthoOffCenterRHToRef(left, right, bottom, top, znear, zfar, matrix, halfZRange);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Stores a right-handed orthographic projection into a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#77\r\n * @param left defines the viewport left coordinate\r\n * @param right defines the viewport right coordinate\r\n * @param bottom defines the viewport bottom coordinate\r\n * @param top defines the viewport top coordinate\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param result defines the target matrix\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns result input\r\n */\r\n public static OrthoOffCenterRHToRef(\r\n left: number,\r\n right: number,\r\n bottom: number,\r\n top: number,\r\n znear: number,\r\n zfar: number,\r\n result: T,\r\n halfZRange?: boolean\r\n ): T {\r\n Matrix.OrthoOffCenterLHToRef(left, right, bottom, top, znear, zfar, result, halfZRange);\r\n result._m[10] *= -1; // No need to call markAsUpdated as previous function already called it and let _isIdentityDirty to true\r\n return result;\r\n }\r\n\r\n /**\r\n * Stores a right-handed oblique projection into a given matrix\r\n * @param left defines the viewport left coordinate\r\n * @param right defines the viewport right coordinate\r\n * @param bottom defines the viewport bottom coordinate\r\n * @param top defines the viewport top coordinate\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param length Length of the shear\r\n * @param angle Angle (along X/Y Plane) to apply shear\r\n * @param distance Distance from shear point\r\n * @param result defines the target matrix\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns result input\r\n */\r\n public static ObliqueOffCenterRHToRef(\r\n left: number,\r\n right: number,\r\n bottom: number,\r\n top: number,\r\n znear: number,\r\n zfar: number,\r\n length: number,\r\n angle: number,\r\n distance: number,\r\n result: T,\r\n halfZRange?: boolean\r\n ): T {\r\n const a = length * Math.cos(angle);\r\n const b = length * Math.sin(angle);\r\n\r\n Matrix.TranslationToRef(0, 0, distance, MathTmp.Matrix[1]);\r\n Matrix.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, a, b, 1, 0, 0, 0, 0, 1, MathTmp.Matrix[0]);\r\n MathTmp.Matrix[1].multiplyToRef(MathTmp.Matrix[0], MathTmp.Matrix[0]);\r\n Matrix.TranslationToRef(0, 0, -distance, MathTmp.Matrix[1]);\r\n MathTmp.Matrix[0].multiplyToRef(MathTmp.Matrix[1], MathTmp.Matrix[0]);\r\n\r\n Matrix.OrthoOffCenterRHToRef(left, right, bottom, top, znear, zfar, result, halfZRange);\r\n MathTmp.Matrix[0].multiplyToRef(result, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a left-handed perspective projection matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#85\r\n * @param width defines the viewport width\r\n * @param height defines the viewport height\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @returns a new matrix as a left-handed perspective projection matrix\r\n */\r\n public static PerspectiveLH(width: number, height: number, znear: number, zfar: number, halfZRange?: boolean, projectionPlaneTilt: number = 0): Matrix {\r\n const matrix = new Matrix();\r\n\r\n const n = znear;\r\n const f = zfar;\r\n\r\n const a = (2.0 * n) / width;\r\n const b = (2.0 * n) / height;\r\n const c = (f + n) / (f - n);\r\n const d = (-2.0 * f * n) / (f - n);\r\n const rot = Math.tan(projectionPlaneTilt);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, rot, 0.0, 0.0, c, 1.0, 0.0, 0.0, d, 0.0, matrix);\r\n\r\n if (halfZRange) {\r\n matrix.multiplyToRef(mtxConvertNDCToHalfZRange, matrix);\r\n }\r\n\r\n matrix._updateIdentityStatus(false);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Creates a left-handed perspective projection matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#78\r\n * @param fov defines the horizontal field of view\r\n * @param aspect defines the aspect ratio\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\r\n * @returns a new matrix as a left-handed perspective projection matrix\r\n */\r\n public static PerspectiveFovLH(\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n halfZRange?: boolean,\r\n projectionPlaneTilt: number = 0,\r\n reverseDepthBufferMode: boolean = false\r\n ): Matrix {\r\n const matrix = new Matrix();\r\n Matrix.PerspectiveFovLHToRef(fov, aspect, znear, zfar, matrix, true, halfZRange, projectionPlaneTilt, reverseDepthBufferMode);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Stores a left-handed perspective projection into a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#81\r\n * @param fov defines the horizontal field of view\r\n * @param aspect defines the aspect ratio\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\r\n * @param result defines the target matrix\r\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\r\n * @returns result input\r\n */\r\n public static PerspectiveFovLHToRef(\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n result: T,\r\n isVerticalFovFixed = true,\r\n halfZRange?: boolean,\r\n projectionPlaneTilt: number = 0,\r\n reverseDepthBufferMode: boolean = false\r\n ): T {\r\n const n = znear;\r\n const f = zfar;\r\n\r\n const t = 1.0 / Math.tan(fov * 0.5);\r\n const a = isVerticalFovFixed ? t / aspect : t;\r\n const b = isVerticalFovFixed ? t : t * aspect;\r\n const c = reverseDepthBufferMode && n === 0 ? -1 : f !== 0 ? (f + n) / (f - n) : 1;\r\n const d = reverseDepthBufferMode && n === 0 ? 2 * f : f !== 0 ? (-2.0 * f * n) / (f - n) : -2 * n;\r\n const rot = Math.tan(projectionPlaneTilt);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, rot, 0.0, 0.0, c, 1.0, 0.0, 0.0, d, 0.0, result);\r\n\r\n if (halfZRange) {\r\n result.multiplyToRef(mtxConvertNDCToHalfZRange, result);\r\n }\r\n\r\n result._updateIdentityStatus(false);\r\n return result;\r\n }\r\n\r\n /**\r\n * Stores a left-handed perspective projection into a given matrix with depth reversed\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#89\r\n * @param fov defines the horizontal field of view\r\n * @param aspect defines the aspect ratio\r\n * @param znear defines the near clip plane\r\n * @param zfar not used as infinity is used as far clip\r\n * @param result defines the target matrix\r\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @returns result input\r\n */\r\n public static PerspectiveFovReverseLHToRef(\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n result: T,\r\n isVerticalFovFixed = true,\r\n halfZRange?: boolean,\r\n projectionPlaneTilt: number = 0\r\n ): T {\r\n const t = 1.0 / Math.tan(fov * 0.5);\r\n const a = isVerticalFovFixed ? t / aspect : t;\r\n const b = isVerticalFovFixed ? t : t * aspect;\r\n const rot = Math.tan(projectionPlaneTilt);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, rot, 0.0, 0.0, -znear, 1.0, 0.0, 0.0, 1.0, 0.0, result);\r\n if (halfZRange) {\r\n result.multiplyToRef(mtxConvertNDCToHalfZRange, result);\r\n }\r\n result._updateIdentityStatus(false);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a right-handed perspective projection matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#83\r\n * @param fov defines the horizontal field of view\r\n * @param aspect defines the aspect ratio\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\r\n * @returns a new matrix as a right-handed perspective projection matrix\r\n */\r\n public static PerspectiveFovRH(\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n halfZRange?: boolean,\r\n projectionPlaneTilt: number = 0,\r\n reverseDepthBufferMode: boolean = false\r\n ): Matrix {\r\n const matrix = new Matrix();\r\n Matrix.PerspectiveFovRHToRef(fov, aspect, znear, zfar, matrix, true, halfZRange, projectionPlaneTilt, reverseDepthBufferMode);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Stores a right-handed perspective projection into a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#84\r\n * @param fov defines the horizontal field of view\r\n * @param aspect defines the aspect ratio\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\r\n * @param result defines the target matrix\r\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\r\n * @returns result input\r\n */\r\n public static PerspectiveFovRHToRef(\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n result: T,\r\n isVerticalFovFixed = true,\r\n halfZRange?: boolean,\r\n projectionPlaneTilt: number = 0,\r\n reverseDepthBufferMode: boolean = false\r\n ): T {\r\n //alternatively this could be expressed as:\r\n // m = PerspectiveFovLHToRef\r\n // m[10] *= -1.0;\r\n // m[11] *= -1.0;\r\n\r\n const n = znear;\r\n const f = zfar;\r\n\r\n const t = 1.0 / Math.tan(fov * 0.5);\r\n const a = isVerticalFovFixed ? t / aspect : t;\r\n const b = isVerticalFovFixed ? t : t * aspect;\r\n const c = reverseDepthBufferMode && n === 0 ? 1 : f !== 0 ? -(f + n) / (f - n) : -1;\r\n const d = reverseDepthBufferMode && n === 0 ? 2 * f : f !== 0 ? (-2 * f * n) / (f - n) : -2 * n;\r\n const rot = Math.tan(projectionPlaneTilt);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, rot, 0.0, 0.0, c, -1.0, 0.0, 0.0, d, 0.0, result);\r\n\r\n if (halfZRange) {\r\n result.multiplyToRef(mtxConvertNDCToHalfZRange, result);\r\n }\r\n\r\n result._updateIdentityStatus(false);\r\n return result;\r\n }\r\n\r\n /**\r\n * Stores a right-handed perspective projection into a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#90\r\n * @param fov defines the horizontal field of view\r\n * @param aspect defines the aspect ratio\r\n * @param znear defines the near clip plane\r\n * @param zfar not used as infinity is used as far clip\r\n * @param result defines the target matrix\r\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @returns result input\r\n */\r\n public static PerspectiveFovReverseRHToRef(\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n result: T,\r\n isVerticalFovFixed = true,\r\n halfZRange?: boolean,\r\n projectionPlaneTilt: number = 0\r\n ): T {\r\n const t = 1.0 / Math.tan(fov * 0.5);\r\n const a = isVerticalFovFixed ? t / aspect : t;\r\n const b = isVerticalFovFixed ? t : t * aspect;\r\n const rot = Math.tan(projectionPlaneTilt);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, rot, 0.0, 0.0, -znear, -1.0, 0.0, 0.0, -1.0, 0.0, result);\r\n\r\n if (halfZRange) {\r\n result.multiplyToRef(mtxConvertNDCToHalfZRange, result);\r\n }\r\n\r\n result._updateIdentityStatus(false);\r\n return result;\r\n }\r\n\r\n /**\r\n * Computes a complete transformation matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#113\r\n * @param viewport defines the viewport to use\r\n * @param world defines the world matrix\r\n * @param view defines the view matrix\r\n * @param projection defines the projection matrix\r\n * @param zmin defines the near clip plane\r\n * @param zmax defines the far clip plane\r\n * @returns the transformation matrix\r\n */\r\n public static GetFinalMatrix(\r\n viewport: DeepImmutable,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable,\r\n zmin: number,\r\n zmax: number\r\n ): T {\r\n const cw = viewport.width;\r\n const ch = viewport.height;\r\n const cx = viewport.x;\r\n const cy = viewport.y;\r\n\r\n const viewportMatrix = Matrix.FromValues(cw / 2.0, 0.0, 0.0, 0.0, 0.0, -ch / 2.0, 0.0, 0.0, 0.0, 0.0, zmax - zmin, 0.0, cx + cw / 2.0, ch / 2.0 + cy, zmin, 1.0);\r\n\r\n const matrix = new (world.constructor as Constructor)();\r\n world.multiplyToRef(view, matrix);\r\n matrix.multiplyToRef(projection, matrix);\r\n return matrix.multiplyToRef(viewportMatrix, matrix);\r\n }\r\n\r\n /**\r\n * Extracts a 2x2 matrix from a given matrix and store the result in a Float32Array\r\n * @param matrix defines the matrix to use\r\n * @returns a new Float32Array array with 4 elements : the 2x2 matrix extracted from the given matrix\r\n */\r\n public static GetAsMatrix2x2(matrix: DeepImmutable): Float32Array | Array {\r\n const m = matrix.m;\r\n const arr = [m[0], m[1], m[4], m[5]];\r\n return PerformanceConfigurator.MatrixUse64Bits ? arr : new Float32Array(arr);\r\n }\r\n /**\r\n * Extracts a 3x3 matrix from a given matrix and store the result in a Float32Array\r\n * @param matrix defines the matrix to use\r\n * @returns a new Float32Array array with 9 elements : the 3x3 matrix extracted from the given matrix\r\n */\r\n public static GetAsMatrix3x3(matrix: DeepImmutable): Float32Array | Array {\r\n const m = matrix.m;\r\n const arr = [m[0], m[1], m[2], m[4], m[5], m[6], m[8], m[9], m[10]];\r\n return PerformanceConfigurator.MatrixUse64Bits ? arr : new Float32Array(arr);\r\n }\r\n\r\n /**\r\n * Compute the transpose of a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#111\r\n * @param matrix defines the matrix to transpose\r\n * @returns the new matrix\r\n */\r\n public static Transpose(matrix: DeepImmutable): T {\r\n const result = new (matrix.constructor as Constructor)();\r\n Matrix.TransposeToRef(matrix, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Compute the transpose of a matrix and store it in a target matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#112\r\n * @param matrix defines the matrix to transpose\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static TransposeToRef(matrix: DeepImmutable, result: T): T {\r\n const mm = matrix.m;\r\n const rm0 = mm[0];\r\n const rm1 = mm[4];\r\n const rm2 = mm[8];\r\n const rm3 = mm[12];\r\n\r\n const rm4 = mm[1];\r\n const rm5 = mm[5];\r\n const rm6 = mm[9];\r\n const rm7 = mm[13];\r\n\r\n const rm8 = mm[2];\r\n const rm9 = mm[6];\r\n const rm10 = mm[10];\r\n const rm11 = mm[14];\r\n\r\n const rm12 = mm[3];\r\n const rm13 = mm[7];\r\n const rm14 = mm[11];\r\n const rm15 = mm[15];\r\n\r\n const rm = result._m;\r\n rm[0] = rm0;\r\n rm[1] = rm1;\r\n rm[2] = rm2;\r\n rm[3] = rm3;\r\n rm[4] = rm4;\r\n rm[5] = rm5;\r\n rm[6] = rm6;\r\n rm[7] = rm7;\r\n rm[8] = rm8;\r\n rm[9] = rm9;\r\n rm[10] = rm10;\r\n rm[11] = rm11;\r\n rm[12] = rm12;\r\n rm[13] = rm13;\r\n rm[14] = rm14;\r\n rm[15] = rm15;\r\n result.markAsUpdated();\r\n\r\n // identity-ness does not change when transposing\r\n result._updateIdentityStatus((matrix as Matrix)._isIdentity, (matrix as Matrix)._isIdentityDirty);\r\n return result;\r\n }\r\n\r\n /**\r\n * Computes a reflection matrix from a plane\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#87\r\n * @param plane defines the reflection plane\r\n * @returns a new matrix\r\n */\r\n public static Reflection(plane: DeepImmutable): Matrix {\r\n const matrix = new Matrix();\r\n Matrix.ReflectionToRef(plane, matrix);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Computes a reflection matrix from a plane\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#88\r\n * @param plane defines the reflection plane\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static ReflectionToRef(plane: DeepImmutable, result: T): T {\r\n plane.normalize();\r\n const x = plane.normal.x;\r\n const y = plane.normal.y;\r\n const z = plane.normal.z;\r\n const temp = -2 * x;\r\n const temp2 = -2 * y;\r\n const temp3 = -2 * z;\r\n Matrix.FromValuesToRef(\r\n temp * x + 1,\r\n temp2 * x,\r\n temp3 * x,\r\n 0.0,\r\n temp * y,\r\n temp2 * y + 1,\r\n temp3 * y,\r\n 0.0,\r\n temp * z,\r\n temp2 * z,\r\n temp3 * z + 1,\r\n 0.0,\r\n temp * plane.d,\r\n temp2 * plane.d,\r\n temp3 * plane.d,\r\n 1.0,\r\n result\r\n );\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given matrix as a rotation matrix composed from the 3 left handed axes\r\n * @param xaxis defines the value of the 1st axis\r\n * @param yaxis defines the value of the 2nd axis\r\n * @param zaxis defines the value of the 3rd axis\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static FromXYZAxesToRef(xaxis: DeepImmutable, yaxis: DeepImmutable, zaxis: DeepImmutable, result: T): T {\r\n Matrix.FromValuesToRef(xaxis._x, xaxis._y, xaxis._z, 0.0, yaxis._x, yaxis._y, yaxis._z, 0.0, zaxis._x, zaxis._y, zaxis._z, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a rotation matrix from a quaternion and stores it in a target matrix\r\n * @param quat defines the quaternion to use\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static FromQuaternionToRef(quat: DeepImmutable, result: T): T {\r\n const xx = quat._x * quat._x;\r\n const yy = quat._y * quat._y;\r\n const zz = quat._z * quat._z;\r\n const xy = quat._x * quat._y;\r\n const zw = quat._z * quat._w;\r\n const zx = quat._z * quat._x;\r\n const yw = quat._y * quat._w;\r\n const yz = quat._y * quat._z;\r\n const xw = quat._x * quat._w;\r\n\r\n result._m[0] = 1.0 - 2.0 * (yy + zz);\r\n result._m[1] = 2.0 * (xy + zw);\r\n result._m[2] = 2.0 * (zx - yw);\r\n result._m[3] = 0.0;\r\n\r\n result._m[4] = 2.0 * (xy - zw);\r\n result._m[5] = 1.0 - 2.0 * (zz + xx);\r\n result._m[6] = 2.0 * (yz + xw);\r\n result._m[7] = 0.0;\r\n\r\n result._m[8] = 2.0 * (zx + yw);\r\n result._m[9] = 2.0 * (yz - xw);\r\n result._m[10] = 1.0 - 2.0 * (yy + xx);\r\n result._m[11] = 0.0;\r\n\r\n result._m[12] = 0.0;\r\n result._m[13] = 0.0;\r\n result._m[14] = 0.0;\r\n result._m[15] = 1.0;\r\n\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n}\r\nObject.defineProperties(Matrix.prototype, {\r\n dimension: { value: [4, 4] },\r\n rank: { value: 2 },\r\n});\r\n\r\n/**\r\n * @internal\r\n * Same as Tmp but not exported to keep it only for math functions to avoid conflicts\r\n */\r\nclass MathTmp {\r\n // Temporary Vector3s\r\n public static Vector3 = ArrayTools.BuildTuple(11, Vector3.Zero);\r\n\r\n // Temporary Matricies\r\n public static Matrix = ArrayTools.BuildTuple(2, Matrix.Identity);\r\n\r\n // Temporary Quaternions\r\n public static Quaternion = ArrayTools.BuildTuple(3, Quaternion.Zero);\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class TmpVectors {\r\n /** 3 temp Vector2 at once should be enough */\r\n public static Vector2 = ArrayTools.BuildTuple(3, Vector2.Zero);\r\n\r\n /** 13 temp Vector3 at once should be enough */\r\n public static Vector3 = ArrayTools.BuildTuple(13, Vector3.Zero);\r\n\r\n /** 3 temp Vector4 at once should be enough */\r\n public static Vector4 = ArrayTools.BuildTuple(3, Vector4.Zero);\r\n\r\n /** 2 temp Quaternion at once should be enough */\r\n public static Quaternion = ArrayTools.BuildTuple(2, Quaternion.Zero);\r\n\r\n /** 8 temp Matrices at once should be enough */\r\n public static Matrix = ArrayTools.BuildTuple(8, Matrix.Identity);\r\n}\r\n\r\nRegisterClass(\"BABYLON.Vector2\", Vector2);\r\nRegisterClass(\"BABYLON.Vector3\", Vector3);\r\nRegisterClass(\"BABYLON.Vector4\", Vector4);\r\nRegisterClass(\"BABYLON.Matrix\", Matrix);\r\n\r\nconst mtxConvertNDCToHalfZRange = Matrix.FromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 1);\r\n", "import { Clamp, Lerp, NormalizeRadians, RandomRange, ToHex, WithinEpsilon } from \"./math.scalar.functions\";\r\n\r\n/**\r\n * Scalar computation library\r\n */\r\nexport class Scalar {\r\n /**\r\n * Two pi constants convenient for computation.\r\n */\r\n public static TwoPi: number = Math.PI * 2;\r\n\r\n /**\r\n * Boolean : true if the absolute difference between a and b is lower than epsilon (default = 1.401298E-45)\r\n * @param a number\r\n * @param b number\r\n * @param epsilon (default = 1.401298E-45)\r\n * @returns true if the absolute difference between a and b is lower than epsilon (default = 1.401298E-45)\r\n */\r\n public static WithinEpsilon: (a: number, b: number, epsilon?: number) => boolean = WithinEpsilon;\r\n\r\n /**\r\n * Returns a string : the upper case translation of the number i to hexadecimal.\r\n * @param i number\r\n * @returns the upper case translation of the number i to hexadecimal.\r\n */\r\n public static ToHex: (i: number) => string = ToHex;\r\n\r\n /**\r\n * Returns -1 if value is negative and +1 is value is positive.\r\n * @param value the value\r\n * @returns the value itself if it's equal to zero.\r\n */\r\n public static Sign(value: number): number {\r\n value = +value; // convert to a number\r\n\r\n if (value === 0 || isNaN(value)) {\r\n return value;\r\n }\r\n\r\n return value > 0 ? 1 : -1;\r\n }\r\n\r\n /**\r\n * Returns the value itself if it's between min and max.\r\n * Returns min if the value is lower than min.\r\n * Returns max if the value is greater than max.\r\n * @param value the value to clmap\r\n * @param min the min value to clamp to (default: 0)\r\n * @param max the max value to clamp to (default: 1)\r\n * @returns the clamped value\r\n */\r\n public static Clamp: (value: number, min?: number, max?: number) => number = Clamp;\r\n\r\n /**\r\n * the log2 of value.\r\n * @param value the value to compute log2 of\r\n * @returns the log2 of value.\r\n */\r\n public static Log2(value: number): number {\r\n return Math.log(value) * Math.LOG2E;\r\n }\r\n\r\n /**\r\n * the floor part of a log2 value.\r\n * @param value the value to compute log2 of\r\n * @returns the log2 of value.\r\n */\r\n public static ILog2(value: number): number {\r\n if (Math.log2) {\r\n return Math.floor(Math.log2(value));\r\n }\r\n\r\n if (value < 0) {\r\n return NaN;\r\n } else if (value === 0) {\r\n return -Infinity;\r\n }\r\n\r\n let n = 0;\r\n if (value < 1) {\r\n while (value < 1) {\r\n n++;\r\n value = value * 2;\r\n }\r\n n = -n;\r\n } else if (value > 1) {\r\n while (value > 1) {\r\n n++;\r\n value = Math.floor(value / 2);\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n /**\r\n * Loops the value, so that it is never larger than length and never smaller than 0.\r\n *\r\n * This is similar to the modulo operator but it works with floating point numbers.\r\n * For example, using 3.0 for t and 2.5 for length, the result would be 0.5.\r\n * With t = 5 and length = 2.5, the result would be 0.0.\r\n * Note, however, that the behaviour is not defined for negative numbers as it is for the modulo operator\r\n * @param value the value\r\n * @param length the length\r\n * @returns the looped value\r\n */\r\n public static Repeat(value: number, length: number): number {\r\n return value - Math.floor(value / length) * length;\r\n }\r\n\r\n /**\r\n * Normalize the value between 0.0 and 1.0 using min and max values\r\n * @param value value to normalize\r\n * @param min max to normalize between\r\n * @param max min to normalize between\r\n * @returns the normalized value\r\n */\r\n public static Normalize(value: number, min: number, max: number): number {\r\n return (value - min) / (max - min);\r\n }\r\n\r\n /**\r\n * Denormalize the value from 0.0 and 1.0 using min and max values\r\n * @param normalized value to denormalize\r\n * @param min max to denormalize between\r\n * @param max min to denormalize between\r\n * @returns the denormalized value\r\n */\r\n public static Denormalize(normalized: number, min: number, max: number): number {\r\n return normalized * (max - min) + min;\r\n }\r\n\r\n /**\r\n * Calculates the shortest difference between two given angles given in degrees.\r\n * @param current current angle in degrees\r\n * @param target target angle in degrees\r\n * @returns the delta\r\n */\r\n public static DeltaAngle(current: number, target: number): number {\r\n let num: number = Scalar.Repeat(target - current, 360.0);\r\n if (num > 180.0) {\r\n num -= 360.0;\r\n }\r\n return num;\r\n }\r\n\r\n /**\r\n * PingPongs the value t, so that it is never larger than length and never smaller than 0.\r\n * @param tx value\r\n * @param length length\r\n * @returns The returned value will move back and forth between 0 and length\r\n */\r\n public static PingPong(tx: number, length: number): number {\r\n const t: number = Scalar.Repeat(tx, length * 2.0);\r\n return length - Math.abs(t - length);\r\n }\r\n\r\n /**\r\n * Interpolates between min and max with smoothing at the limits.\r\n *\r\n * This function interpolates between min and max in a similar way to Lerp. However, the interpolation will gradually speed up\r\n * from the start and slow down toward the end. This is useful for creating natural-looking animation, fading and other transitions.\r\n * @param from from\r\n * @param to to\r\n * @param tx value\r\n * @returns the smooth stepped value\r\n */\r\n public static SmoothStep(from: number, to: number, tx: number): number {\r\n let t: number = Scalar.Clamp(tx);\r\n t = -2.0 * t * t * t + 3.0 * t * t;\r\n return to * t + from * (1.0 - t);\r\n }\r\n\r\n /**\r\n * Moves a value current towards target.\r\n *\r\n * This is essentially the same as Mathf.Lerp but instead the function will ensure that the speed never exceeds maxDelta.\r\n * Negative values of maxDelta pushes the value away from target.\r\n * @param current current value\r\n * @param target target value\r\n * @param maxDelta max distance to move\r\n * @returns resulting value\r\n */\r\n public static MoveTowards(current: number, target: number, maxDelta: number): number {\r\n let result: number = 0;\r\n if (Math.abs(target - current) <= maxDelta) {\r\n result = target;\r\n } else {\r\n result = current + Scalar.Sign(target - current) * maxDelta;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Same as MoveTowards but makes sure the values interpolate correctly when they wrap around 360 degrees.\r\n *\r\n * Variables current and target are assumed to be in degrees. For optimization reasons, negative values of maxDelta\r\n * are not supported and may cause oscillation. To push current away from a target angle, add 180 to that angle instead.\r\n * @param current current value\r\n * @param target target value\r\n * @param maxDelta max distance to move\r\n * @returns resulting angle\r\n */\r\n public static MoveTowardsAngle(current: number, target: number, maxDelta: number): number {\r\n const num: number = Scalar.DeltaAngle(current, target);\r\n let result: number = 0;\r\n if (-maxDelta < num && num < maxDelta) {\r\n result = target;\r\n } else {\r\n target = current + num;\r\n result = Scalar.MoveTowards(current, target, maxDelta);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new scalar with values linearly interpolated of \"amount\" between the start scalar and the end scalar.\r\n * @param start start value\r\n * @param end target value\r\n * @param amount amount to lerp between\r\n * @returns the lerped value\r\n */\r\n public static Lerp: (start: number, end: number, amount: number) => number = Lerp;\r\n\r\n /**\r\n * Same as Lerp but makes sure the values interpolate correctly when they wrap around 360 degrees.\r\n * The parameter t is clamped to the range [0, 1]. Variables a and b are assumed to be in degrees.\r\n * @param start start value\r\n * @param end target value\r\n * @param amount amount to lerp between\r\n * @returns the lerped value\r\n */\r\n public static LerpAngle(start: number, end: number, amount: number): number {\r\n let num: number = Scalar.Repeat(end - start, 360.0);\r\n if (num > 180.0) {\r\n num -= 360.0;\r\n }\r\n return start + num * Clamp(amount);\r\n }\r\n\r\n /**\r\n * Calculates the linear parameter t that produces the interpolant value within the range [a, b].\r\n * @param a start value\r\n * @param b target value\r\n * @param value value between a and b\r\n * @returns the inverseLerp value\r\n */\r\n public static InverseLerp(a: number, b: number, value: number): number {\r\n let result: number = 0;\r\n if (a != b) {\r\n result = Clamp((value - a) / (b - a));\r\n } else {\r\n result = 0.0;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new scalar located for \"amount\" (float) on the Hermite spline defined by the scalars \"value1\", \"value3\", \"tangent1\", \"tangent2\".\r\n * @see http://mathworld.wolfram.com/HermitePolynomial.html\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param amount defines the amount on the interpolation spline (between 0 and 1)\r\n * @returns hermite result\r\n */\r\n public static Hermite(value1: number, tangent1: number, value2: number, tangent2: number, amount: number): number {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n const part1 = 2.0 * cubed - 3.0 * squared + 1.0;\r\n const part2 = -2.0 * cubed + 3.0 * squared;\r\n const part3 = cubed - 2.0 * squared + amount;\r\n const part4 = cubed - squared;\r\n\r\n return value1 * part1 + value2 * part2 + tangent1 * part3 + tangent2 * part4;\r\n }\r\n\r\n /**\r\n * Returns a new scalar which is the 1st derivative of the Hermite spline defined by the scalars \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @returns 1st derivative\r\n */\r\n public static Hermite1stDerivative(value1: number, tangent1: number, value2: number, tangent2: number, time: number): number {\r\n const t2 = time * time;\r\n return (t2 - time) * 6 * value1 + (3 * t2 - 4 * time + 1) * tangent1 + (-t2 + time) * 6 * value2 + (3 * t2 - 2 * time) * tangent2;\r\n }\r\n\r\n /**\r\n * Returns a random float number between and min and max values\r\n * @param min min value of random\r\n * @param max max value of random\r\n * @returns random value\r\n */\r\n public static RandomRange: (min: number, max: number) => number = RandomRange;\r\n\r\n /**\r\n * This function returns percentage of a number in a given range.\r\n *\r\n * RangeToPercent(40,20,60) will return 0.5 (50%)\r\n * RangeToPercent(34,0,100) will return 0.34 (34%)\r\n * @param number to convert to percentage\r\n * @param min min range\r\n * @param max max range\r\n * @returns the percentage\r\n */\r\n public static RangeToPercent(number: number, min: number, max: number): number {\r\n return (number - min) / (max - min);\r\n }\r\n\r\n /**\r\n * This function returns number that corresponds to the percentage in a given range.\r\n *\r\n * PercentToRange(0.34,0,100) will return 34.\r\n * @param percent to convert to number\r\n * @param min min range\r\n * @param max max range\r\n * @returns the number\r\n */\r\n public static PercentToRange(percent: number, min: number, max: number): number {\r\n return (max - min) * percent + min;\r\n }\r\n\r\n /**\r\n * Returns the angle converted to equivalent value between -Math.PI and Math.PI radians.\r\n * @param angle The angle to normalize in radian.\r\n * @returns The converted angle.\r\n */\r\n public static NormalizeRadians: (angle: number) => number = NormalizeRadians;\r\n\r\n /**\r\n * Returns the highest common factor of two integers.\r\n * @param a first parameter\r\n * @param b second parameter\r\n * @returns HCF of a and b\r\n */\r\n public static HCF(a: number, b: number): number {\r\n const r: number = a % b;\r\n if (r === 0) {\r\n return b;\r\n }\r\n return Scalar.HCF(b, r);\r\n }\r\n}\r\n", "import type { Constructor, DeepImmutable, FloatArray, Tuple } from \"../types\";\r\nimport { Scalar } from \"./math.scalar\";\r\nimport { Clamp, ToHex } from \"./math.scalar.functions\";\r\nimport { ToLinearSpace, ToGammaSpace, Epsilon } from \"./math.constants\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport type { Tensor } from \"./tensor\";\r\nimport type { IColor3Like, IColor4Like } from \"./math.like\";\r\n\r\nfunction colorChannelToLinearSpace(color: number): number {\r\n return Math.pow(color, ToLinearSpace);\r\n}\r\n\r\nfunction colorChannelToLinearSpaceExact(color: number): number {\r\n if (color <= 0.04045) {\r\n return 0.0773993808 * color;\r\n }\r\n return Math.pow(0.947867299 * (color + 0.055), 2.4);\r\n}\r\n\r\nfunction colorChannelToGammaSpace(color: number): number {\r\n return Math.pow(color, ToGammaSpace);\r\n}\r\n\r\nfunction colorChannelToGammaSpaceExact(color: number): number {\r\n if (color <= 0.0031308) {\r\n return 12.92 * color;\r\n }\r\n return 1.055 * Math.pow(color, 0.41666) - 0.055;\r\n}\r\n\r\n/**\r\n * Class used to hold a RGB color\r\n */\r\nexport class Color3 implements Tensor>, IColor3Like {\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: [3];\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 1;\r\n\r\n /**\r\n * Creates a new Color3 object from red, green, blue values, all between 0 and 1\r\n * @param r defines the red component (between 0 and 1, default is 0)\r\n * @param g defines the green component (between 0 and 1, default is 0)\r\n * @param b defines the blue component (between 0 and 1, default is 0)\r\n */\r\n constructor(\r\n /**\r\n * Defines the red component (between 0 and 1, default is 0)\r\n */\r\n public r: number = 0,\r\n /**\r\n * Defines the green component (between 0 and 1, default is 0)\r\n */\r\n public g: number = 0,\r\n /**\r\n * Defines the blue component (between 0 and 1, default is 0)\r\n */\r\n public b: number = 0\r\n ) {}\r\n\r\n /**\r\n * Creates a string with the Color3 current values\r\n * @returns the string representation of the Color3 object\r\n */\r\n public toString(): string {\r\n return \"{R: \" + this.r + \" G:\" + this.g + \" B:\" + this.b + \"}\";\r\n }\r\n\r\n /**\r\n * Returns the string \"Color3\"\r\n * @returns \"Color3\"\r\n */\r\n public getClassName(): string {\r\n return \"Color3\";\r\n }\r\n\r\n /**\r\n * Compute the Color3 hash code\r\n * @returns an unique number that can be used to hash Color3 objects\r\n */\r\n public getHashCode(): number {\r\n let hash = (this.r * 255) | 0;\r\n hash = (hash * 397) ^ ((this.g * 255) | 0);\r\n hash = (hash * 397) ^ ((this.b * 255) | 0);\r\n return hash;\r\n }\r\n\r\n // Operators\r\n\r\n /**\r\n * Stores in the given array from the given starting index the red, green, blue values as successive elements\r\n * @param array defines the array where to store the r,g,b components\r\n * @param index defines an optional index in the target array to define where to start storing values\r\n * @returns the current Color3 object\r\n */\r\n public toArray(array: FloatArray, index: number = 0): this {\r\n array[index] = this.r;\r\n array[index + 1] = this.g;\r\n array[index + 2] = this.b;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Update the current color with values stored in an array from the starting index of the given array\r\n * @param array defines the source array\r\n * @param offset defines an offset in the source array\r\n * @returns the current Color3 object\r\n */\r\n public fromArray(array: DeepImmutable>, offset: number = 0): this {\r\n Color3.FromArrayToRef(array, offset, this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Color4 object from the current Color3 and the given alpha\r\n * @param alpha defines the alpha component on the new Color4 object (default is 1)\r\n * @returns a new Color4 object\r\n */\r\n public toColor4(alpha: number = 1): Color4 {\r\n return new Color4(this.r, this.g, this.b, alpha);\r\n }\r\n\r\n /**\r\n * Returns a new array populated with 3 numeric elements : red, green and blue values\r\n * @returns the new array\r\n */\r\n public asArray(): Tuple {\r\n return [this.r, this.g, this.b];\r\n }\r\n\r\n /**\r\n * Returns the luminance value\r\n * @returns a float value\r\n */\r\n public toLuminance(): number {\r\n return this.r * 0.3 + this.g * 0.59 + this.b * 0.11;\r\n }\r\n\r\n /**\r\n * Multiply each Color3 rgb values by the given Color3 rgb values in a new Color3 object\r\n * @param otherColor defines the second operand\r\n * @returns the new Color3 object\r\n */\r\n public multiply(otherColor: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.r * otherColor.r, this.g * otherColor.g, this.b * otherColor.b);\r\n }\r\n\r\n /**\r\n * Multiply the rgb values of the Color3 and the given Color3 and stores the result in the object \"result\"\r\n * @param otherColor defines the second operand\r\n * @param result defines the Color3 object where to store the result\r\n * @returns the result Color3\r\n */\r\n public multiplyToRef(otherColor: DeepImmutable, result: T): T {\r\n result.r = this.r * otherColor.r;\r\n result.g = this.g * otherColor.g;\r\n result.b = this.b * otherColor.b;\r\n return result;\r\n }\r\n\r\n /**\r\n * Multiplies the current Color3 coordinates by the given ones\r\n * @param otherColor defines the second operand\r\n * @returns the current updated Color3\r\n */\r\n public multiplyInPlace(otherColor: DeepImmutable): this {\r\n this.r *= otherColor.r;\r\n this.g *= otherColor.g;\r\n this.b *= otherColor.b;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Color3 set with the result of the multiplication of the current Color3 coordinates by the given floats\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @returns the new Color3\r\n */\r\n public multiplyByFloats(r: number, g: number, b: number): this {\r\n return new (this.constructor as Constructor)(this.r * r, this.g * g, this.b * b);\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divide(_other: DeepImmutable): this {\r\n throw new ReferenceError(\"Can not divide a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divideToRef(_other: DeepImmutable, _result: T): T {\r\n throw new ReferenceError(\"Can not divide a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divideInPlace(_other: DeepImmutable): this {\r\n throw new ReferenceError(\"Can not divide a color\");\r\n }\r\n\r\n /**\r\n * Updates the current Color3 with the minimal coordinate values between its and the given color ones\r\n * @param other defines the second operand\r\n * @returns the current updated Color3\r\n */\r\n public minimizeInPlace(other: DeepImmutable): this {\r\n return this.minimizeInPlaceFromFloats(other.r, other.g, other.b);\r\n }\r\n\r\n /**\r\n * Updates the current Color3 with the maximal coordinate values between its and the given color ones.\r\n * @param other defines the second operand\r\n * @returns the current updated Color3\r\n */\r\n public maximizeInPlace(other: DeepImmutable): this {\r\n return this.maximizeInPlaceFromFloats(other.r, other.g, other.b);\r\n }\r\n\r\n /**\r\n * Updates the current Color3 with the minimal coordinate values between its and the given coordinates\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @returns the current updated Color3\r\n */\r\n public minimizeInPlaceFromFloats(r: number, g: number, b: number): this {\r\n this.r = Math.min(r, this.r);\r\n this.g = Math.min(g, this.g);\r\n this.b = Math.min(b, this.b);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Color3 with the maximal coordinate values between its and the given coordinates.\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @returns the current updated Color3\r\n */\r\n public maximizeInPlaceFromFloats(r: number, g: number, b: number): this {\r\n this.r = Math.max(r, this.r);\r\n this.g = Math.max(g, this.g);\r\n this.b = Math.max(b, this.b);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public floorToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not floor a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public floor(): this {\r\n throw new ReferenceError(\"Can not floor a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public fractToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not fract a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public fract(): this {\r\n throw new ReferenceError(\"Can not fract a color\");\r\n }\r\n\r\n /**\r\n * Determines equality between Color3 objects\r\n * @param otherColor defines the second operand\r\n * @returns true if the rgb values are equal to the given ones\r\n */\r\n public equals(otherColor: DeepImmutable): boolean {\r\n return otherColor && this.r === otherColor.r && this.g === otherColor.g && this.b === otherColor.b;\r\n }\r\n\r\n /**\r\n * Alias for equalsToFloats\r\n * @param r red color component\r\n * @param g green color component\r\n * @param b blue color component\r\n * @returns boolean\r\n */\r\n public equalsFloats(r: number, g: number, b: number): boolean {\r\n return this.equalsToFloats(r, g, b);\r\n }\r\n\r\n /**\r\n * Determines equality between the current Color3 object and a set of r,b,g values\r\n * @param r defines the red component to check\r\n * @param g defines the green component to check\r\n * @param b defines the blue component to check\r\n * @returns true if the rgb values are equal to the given ones\r\n */\r\n public equalsToFloats(r: number, g: number, b: number): boolean {\r\n return this.r === r && this.g === g && this.b === b;\r\n }\r\n\r\n /**\r\n * Returns true if the current Color3 and the given color coordinates are distant less than epsilon\r\n * @param otherColor defines the second operand\r\n * @param epsilon defines the minimal distance to define values as equals\r\n * @returns true if both colors are distant less than epsilon\r\n */\r\n public equalsWithEpsilon(otherColor: DeepImmutable, epsilon: number = Epsilon): boolean {\r\n return Scalar.WithinEpsilon(this.r, otherColor.r, epsilon) && Scalar.WithinEpsilon(this.g, otherColor.g, epsilon) && Scalar.WithinEpsilon(this.b, otherColor.b, epsilon);\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public negate(): this {\r\n throw new ReferenceError(\"Can not negate a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public negateInPlace(): this {\r\n throw new ReferenceError(\"Can not negate a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public negateToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not negate a color\");\r\n }\r\n\r\n /**\r\n * Creates a new Color3 with the current Color3 values multiplied by scale\r\n * @param scale defines the scaling factor to apply\r\n * @returns a new Color3 object\r\n */\r\n public scale(scale: number): this {\r\n return new (this.constructor as Constructor)(this.r * scale, this.g * scale, this.b * scale);\r\n }\r\n\r\n /**\r\n * Multiplies the Color3 values by the float \"scale\"\r\n * @param scale defines the scaling factor to apply\r\n * @returns the current updated Color3\r\n */\r\n public scaleInPlace(scale: number): this {\r\n this.r *= scale;\r\n this.g *= scale;\r\n this.b *= scale;\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiplies the rgb values by scale and stores the result into \"result\"\r\n * @param scale defines the scaling factor\r\n * @param result defines the Color3 object where to store the result\r\n * @returns the result Color3\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n result.r = this.r * scale;\r\n result.g = this.g * scale;\r\n result.b = this.b * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Scale the current Color3 values by a factor and add the result to a given Color3\r\n * @param scale defines the scale factor\r\n * @param result defines color to store the result into\r\n * @returns the result Color3\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n result.r += this.r * scale;\r\n result.g += this.g * scale;\r\n result.b += this.b * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Clamps the rgb values by the min and max values and stores the result into \"result\"\r\n * @param min defines minimum clamping value (default is 0)\r\n * @param max defines maximum clamping value (default is 1)\r\n * @param result defines color to store the result into\r\n * @returns the result Color3\r\n */\r\n public clampToRef(min: number = 0, max: number = 1, result: T): T {\r\n result.r = Clamp(this.r, min, max);\r\n result.g = Clamp(this.g, min, max);\r\n result.b = Clamp(this.b, min, max);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new Color3 set with the added values of the current Color3 and of the given one\r\n * @param otherColor defines the second operand\r\n * @returns the new Color3\r\n */\r\n public add(otherColor: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.r + otherColor.r, this.g + otherColor.g, this.b + otherColor.b);\r\n }\r\n\r\n /**\r\n * Adds the given color to the current Color3\r\n * @param otherColor defines the second operand\r\n * @returns the current updated Color3\r\n */\r\n public addInPlace(otherColor: DeepImmutable): this {\r\n this.r += otherColor.r;\r\n this.g += otherColor.g;\r\n this.b += otherColor.b;\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the given coordinates to the current Color3\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @returns the current updated Color3\r\n */\r\n public addInPlaceFromFloats(r: number, g: number, b: number): this {\r\n this.r += r;\r\n this.g += g;\r\n this.b += b;\r\n return this;\r\n }\r\n\r\n /**\r\n * Stores the result of the addition of the current Color3 and given one rgb values into \"result\"\r\n * @param otherColor defines the second operand\r\n * @param result defines Color3 object to store the result into\r\n * @returns the unmodified current Color3\r\n */\r\n public addToRef(otherColor: DeepImmutable, result: T): T {\r\n result.r = this.r + otherColor.r;\r\n result.g = this.g + otherColor.g;\r\n result.b = this.b + otherColor.b;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Color3 set with the subtracted values of the given one from the current Color3\r\n * @param otherColor defines the second operand\r\n * @returns the new Color3\r\n */\r\n public subtract(otherColor: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.r - otherColor.r, this.g - otherColor.g, this.b - otherColor.b);\r\n }\r\n\r\n /**\r\n * Stores the result of the subtraction of given one from the current Color3 rgb values into \"result\"\r\n * @param otherColor defines the second operand\r\n * @param result defines Color3 object to store the result into\r\n * @returns the unmodified current Color3\r\n */\r\n public subtractToRef(otherColor: DeepImmutable, result: T): T {\r\n result.r = this.r - otherColor.r;\r\n result.g = this.g - otherColor.g;\r\n result.b = this.b - otherColor.b;\r\n return result;\r\n }\r\n\r\n /**\r\n * Subtract the given color from the current Color3\r\n * @param otherColor defines the second operand\r\n * @returns the current updated Color3\r\n */\r\n public subtractInPlace(otherColor: DeepImmutable): this {\r\n this.r -= otherColor.r;\r\n this.g -= otherColor.g;\r\n this.b -= otherColor.b;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Color3 set with the subtraction of the given floats from the current Color3 coordinates\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @returns the resulting Color3\r\n */\r\n public subtractFromFloats(r: number, g: number, b: number): this {\r\n return new (this.constructor as Constructor)(this.r - r, this.g - g, this.b - b);\r\n }\r\n\r\n /**\r\n * Subtracts the given floats from the current Color3 coordinates and set the given color \"result\" with this result\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @param result defines the Color3 object where to store the result\r\n * @returns the result\r\n */\r\n public subtractFromFloatsToRef(r: number, g: number, b: number, result: T): T {\r\n return result.copyFromFloats(this.r - r, this.g - g, this.b - b);\r\n }\r\n\r\n /**\r\n * Copy the current object\r\n * @returns a new Color3 copied the current one\r\n */\r\n public clone(): this {\r\n return new (this.constructor as Constructor)(this.r, this.g, this.b);\r\n }\r\n\r\n /**\r\n * Copies the rgb values from the source in the current Color3\r\n * @param source defines the source Color3 object\r\n * @returns the updated Color3 object\r\n */\r\n public copyFrom(source: DeepImmutable): this {\r\n this.r = source.r;\r\n this.g = source.g;\r\n this.b = source.b;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the Color3 rgb values from the given floats\r\n * @param r defines the red component to read from\r\n * @param g defines the green component to read from\r\n * @param b defines the blue component to read from\r\n * @returns the current Color3 object\r\n */\r\n public copyFromFloats(r: number, g: number, b: number): this {\r\n this.r = r;\r\n this.g = g;\r\n this.b = b;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the Color3 rgb values from the given floats\r\n * @param r defines the red component to read from\r\n * @param g defines the green component to read from\r\n * @param b defines the blue component to read from\r\n * @returns the current Color3 object\r\n */\r\n public set(r: number, g: number, b: number): this {\r\n return this.copyFromFloats(r, g, b);\r\n }\r\n\r\n /**\r\n * Copies the given float to the current Color3 coordinates\r\n * @param v defines the r, g and b coordinates of the operand\r\n * @returns the current updated Color3\r\n */\r\n public setAll(v: number): this {\r\n this.r = this.g = this.b = v;\r\n return this;\r\n }\r\n\r\n /**\r\n * Compute the Color3 hexadecimal code as a string\r\n * @returns a string containing the hexadecimal representation of the Color3 object\r\n */\r\n public toHexString(): string {\r\n const intR = Math.round(this.r * 255);\r\n const intG = Math.round(this.g * 255);\r\n const intB = Math.round(this.b * 255);\r\n return \"#\" + ToHex(intR) + ToHex(intG) + ToHex(intB);\r\n }\r\n\r\n /**\r\n * Converts current color in rgb space to HSV values\r\n * @returns a new color3 representing the HSV values\r\n */\r\n public toHSV(): this {\r\n const result = new (this.constructor as Constructor)();\r\n\r\n this.toHSVToRef(result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts current color in rgb space to HSV values\r\n * @param result defines the Color3 where to store the HSV values\r\n */\r\n public toHSVToRef(result: this) {\r\n const r = this.r;\r\n const g = this.g;\r\n const b = this.b;\r\n\r\n const max = Math.max(r, g, b);\r\n const min = Math.min(r, g, b);\r\n let h = 0;\r\n let s = 0;\r\n const v = max;\r\n\r\n const dm = max - min;\r\n\r\n if (max !== 0) {\r\n s = dm / max;\r\n }\r\n\r\n if (max != min) {\r\n if (max == r) {\r\n h = (g - b) / dm;\r\n if (g < b) {\r\n h += 6;\r\n }\r\n } else if (max == g) {\r\n h = (b - r) / dm + 2;\r\n } else if (max == b) {\r\n h = (r - g) / dm + 4;\r\n }\r\n h *= 60;\r\n }\r\n\r\n result.r = h;\r\n result.g = s;\r\n result.b = v;\r\n }\r\n\r\n /**\r\n * Computes a new Color3 converted from the current one to linear space\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns a new Color3 object\r\n */\r\n public toLinearSpace(exact = false): this {\r\n const convertedColor = new (this.constructor as Constructor)();\r\n this.toLinearSpaceToRef(convertedColor, exact);\r\n return convertedColor;\r\n }\r\n\r\n /**\r\n * Converts the Color3 values to linear space and stores the result in \"convertedColor\"\r\n * @param convertedColor defines the Color3 object where to store the linear space version\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns the unmodified Color3\r\n */\r\n public toLinearSpaceToRef(convertedColor: this, exact = false): this {\r\n if (exact) {\r\n convertedColor.r = colorChannelToLinearSpaceExact(this.r);\r\n convertedColor.g = colorChannelToLinearSpaceExact(this.g);\r\n convertedColor.b = colorChannelToLinearSpaceExact(this.b);\r\n } else {\r\n convertedColor.r = colorChannelToLinearSpace(this.r);\r\n convertedColor.g = colorChannelToLinearSpace(this.g);\r\n convertedColor.b = colorChannelToLinearSpace(this.b);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Computes a new Color3 converted from the current one to gamma space\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns a new Color3 object\r\n */\r\n public toGammaSpace(exact = false): this {\r\n const convertedColor = new (this.constructor as Constructor)();\r\n this.toGammaSpaceToRef(convertedColor, exact);\r\n return convertedColor;\r\n }\r\n\r\n /**\r\n * Converts the Color3 values to gamma space and stores the result in \"convertedColor\"\r\n * @param convertedColor defines the Color3 object where to store the gamma space version\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns the unmodified Color3\r\n */\r\n public toGammaSpaceToRef(convertedColor: this, exact = false): this {\r\n if (exact) {\r\n convertedColor.r = colorChannelToGammaSpaceExact(this.r);\r\n convertedColor.g = colorChannelToGammaSpaceExact(this.g);\r\n convertedColor.b = colorChannelToGammaSpaceExact(this.b);\r\n } else {\r\n convertedColor.r = colorChannelToGammaSpace(this.r);\r\n convertedColor.g = colorChannelToGammaSpace(this.g);\r\n convertedColor.b = colorChannelToGammaSpace(this.b);\r\n }\r\n return this;\r\n }\r\n\r\n // Statics\r\n\r\n private static _BlackReadOnly = Color3.Black() as DeepImmutable;\r\n\r\n /**\r\n * Converts Hue, saturation and value to a Color3 (RGB)\r\n * @param hue defines the hue (value between 0 and 360)\r\n * @param saturation defines the saturation (value between 0 and 1)\r\n * @param value defines the value (value between 0 and 1)\r\n * @param result defines the Color3 where to store the RGB values\r\n */\r\n public static HSVtoRGBToRef(hue: number, saturation: number, value: number, result: Color3) {\r\n const chroma = value * saturation;\r\n const h = hue / 60;\r\n const x = chroma * (1 - Math.abs((h % 2) - 1));\r\n let r = 0;\r\n let g = 0;\r\n let b = 0;\r\n\r\n if (h >= 0 && h <= 1) {\r\n r = chroma;\r\n g = x;\r\n } else if (h >= 1 && h <= 2) {\r\n r = x;\r\n g = chroma;\r\n } else if (h >= 2 && h <= 3) {\r\n g = chroma;\r\n b = x;\r\n } else if (h >= 3 && h <= 4) {\r\n g = x;\r\n b = chroma;\r\n } else if (h >= 4 && h <= 5) {\r\n r = x;\r\n b = chroma;\r\n } else if (h >= 5 && h <= 6) {\r\n r = chroma;\r\n b = x;\r\n }\r\n\r\n const m = value - chroma;\r\n result.set(r + m, g + m, b + m);\r\n }\r\n\r\n /**\r\n * Converts Hue, saturation and value to a new Color3 (RGB)\r\n * @param hue defines the hue (value between 0 and 360)\r\n * @param saturation defines the saturation (value between 0 and 1)\r\n * @param value defines the value (value between 0 and 1)\r\n * @returns a new Color3 object\r\n */\r\n public static FromHSV(hue: number, saturation: number, value: number): Color3 {\r\n const result = new Color3(0, 0, 0);\r\n Color3.HSVtoRGBToRef(hue, saturation, value, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new Color3 from the string containing valid hexadecimal values\r\n * @param hex defines a string containing valid hexadecimal values\r\n * @returns a new Color3 object\r\n */\r\n public static FromHexString(hex: string): Color3 {\r\n if (hex.substring(0, 1) !== \"#\" || hex.length !== 7) {\r\n return new Color3(0, 0, 0);\r\n }\r\n\r\n const r = parseInt(hex.substring(1, 3), 16);\r\n const g = parseInt(hex.substring(3, 5), 16);\r\n const b = parseInt(hex.substring(5, 7), 16);\r\n\r\n return Color3.FromInts(r, g, b);\r\n }\r\n\r\n /**\r\n * Creates a new Color3 from the starting index of the given array\r\n * @param array defines the source array\r\n * @param offset defines an offset in the source array\r\n * @returns a new Color3 object\r\n */\r\n public static FromArray(array: DeepImmutable>, offset: number = 0): Color3 {\r\n return new Color3(array[offset], array[offset + 1], array[offset + 2]);\r\n }\r\n\r\n /**\r\n * Creates a new Color3 from the starting index element of the given array\r\n * @param array defines the source array to read from\r\n * @param offset defines the offset in the source array\r\n * @param result defines the target Color3 object\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number = 0, result: Color3) {\r\n result.r = array[offset];\r\n result.g = array[offset + 1];\r\n result.b = array[offset + 2];\r\n }\r\n\r\n /**\r\n * Creates a new Color3 from integer values (\\< 256)\r\n * @param r defines the red component to read from (value between 0 and 255)\r\n * @param g defines the green component to read from (value between 0 and 255)\r\n * @param b defines the blue component to read from (value between 0 and 255)\r\n * @returns a new Color3 object\r\n */\r\n public static FromInts(r: number, g: number, b: number): Color3 {\r\n return new Color3(r / 255.0, g / 255.0, b / 255.0);\r\n }\r\n\r\n /**\r\n * Creates a new Color3 with values linearly interpolated of \"amount\" between the start Color3 and the end Color3\r\n * @param start defines the start Color3 value\r\n * @param end defines the end Color3 value\r\n * @param amount defines the gradient value between start and end\r\n * @returns a new Color3 object\r\n */\r\n public static Lerp(start: DeepImmutable, end: DeepImmutable, amount: number): Color3 {\r\n const result = new Color3(0.0, 0.0, 0.0);\r\n Color3.LerpToRef(start, end, amount, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new Color3 with values linearly interpolated of \"amount\" between the start Color3 and the end Color3\r\n * @param left defines the start value\r\n * @param right defines the end value\r\n * @param amount defines the gradient factor\r\n * @param result defines the Color3 object where to store the result\r\n */\r\n public static LerpToRef(left: DeepImmutable, right: DeepImmutable, amount: number, result: Color3): void {\r\n result.r = left.r + (right.r - left.r) * amount;\r\n result.g = left.g + (right.g - left.g) * amount;\r\n result.b = left.b + (right.b - left.b) * amount;\r\n }\r\n\r\n /**\r\n * Returns a new Color3 located for \"amount\" (float) on the Hermite interpolation spline defined by the vectors \"value1\", \"tangent1\", \"value2\", \"tangent2\"\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent Color3\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent Color3\r\n * @param amount defines the amount on the interpolation spline (between 0 and 1)\r\n * @returns the new Color3\r\n */\r\n public static Hermite(value1: DeepImmutable, tangent1: DeepImmutable, value2: DeepImmutable, tangent2: DeepImmutable, amount: number): Color3 {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n const part1 = 2.0 * cubed - 3.0 * squared + 1.0;\r\n const part2 = -2.0 * cubed + 3.0 * squared;\r\n const part3 = cubed - 2.0 * squared + amount;\r\n const part4 = cubed - squared;\r\n\r\n const r = value1.r * part1 + value2.r * part2 + tangent1.r * part3 + tangent2.r * part4;\r\n const g = value1.g * part1 + value2.g * part2 + tangent1.g * part3 + tangent2.g * part4;\r\n const b = value1.b * part1 + value2.b * part2 + tangent1.b * part3 + tangent2.b * part4;\r\n return new Color3(r, g, b);\r\n }\r\n\r\n /**\r\n * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @returns 1st derivative\r\n */\r\n public static Hermite1stDerivative(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number\r\n ): Color3 {\r\n const result = Color3.Black();\r\n\r\n this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @param result define where to store the derivative\r\n */\r\n public static Hermite1stDerivativeToRef(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number,\r\n result: Color3\r\n ) {\r\n const t2 = time * time;\r\n\r\n result.r = (t2 - time) * 6 * value1.r + (3 * t2 - 4 * time + 1) * tangent1.r + (-t2 + time) * 6 * value2.r + (3 * t2 - 2 * time) * tangent2.r;\r\n result.g = (t2 - time) * 6 * value1.g + (3 * t2 - 4 * time + 1) * tangent1.g + (-t2 + time) * 6 * value2.g + (3 * t2 - 2 * time) * tangent2.g;\r\n result.b = (t2 - time) * 6 * value1.b + (3 * t2 - 4 * time + 1) * tangent1.b + (-t2 + time) * 6 * value2.b + (3 * t2 - 2 * time) * tangent2.b;\r\n }\r\n\r\n /**\r\n * Returns a Color3 value containing a red color\r\n * @returns a new Color3 object\r\n */\r\n public static Red(): Color3 {\r\n return new Color3(1, 0, 0);\r\n }\r\n /**\r\n * Returns a Color3 value containing a green color\r\n * @returns a new Color3 object\r\n */\r\n public static Green(): Color3 {\r\n return new Color3(0, 1, 0);\r\n }\r\n /**\r\n * Returns a Color3 value containing a blue color\r\n * @returns a new Color3 object\r\n */\r\n public static Blue(): Color3 {\r\n return new Color3(0, 0, 1);\r\n }\r\n /**\r\n * Returns a Color3 value containing a black color\r\n * @returns a new Color3 object\r\n */\r\n public static Black(): Color3 {\r\n return new Color3(0, 0, 0);\r\n }\r\n\r\n /**\r\n * Gets a Color3 value containing a black color that must not be updated\r\n */\r\n public static get BlackReadOnly(): DeepImmutable {\r\n return Color3._BlackReadOnly;\r\n }\r\n\r\n /**\r\n * Returns a Color3 value containing a white color\r\n * @returns a new Color3 object\r\n */\r\n public static White(): Color3 {\r\n return new Color3(1, 1, 1);\r\n }\r\n /**\r\n * Returns a Color3 value containing a purple color\r\n * @returns a new Color3 object\r\n */\r\n public static Purple(): Color3 {\r\n return new Color3(0.5, 0, 0.5);\r\n }\r\n /**\r\n * Returns a Color3 value containing a magenta color\r\n * @returns a new Color3 object\r\n */\r\n public static Magenta(): Color3 {\r\n return new Color3(1, 0, 1);\r\n }\r\n /**\r\n * Returns a Color3 value containing a yellow color\r\n * @returns a new Color3 object\r\n */\r\n public static Yellow(): Color3 {\r\n return new Color3(1, 1, 0);\r\n }\r\n /**\r\n * Returns a Color3 value containing a gray color\r\n * @returns a new Color3 object\r\n */\r\n public static Gray(): Color3 {\r\n return new Color3(0.5, 0.5, 0.5);\r\n }\r\n /**\r\n * Returns a Color3 value containing a teal color\r\n * @returns a new Color3 object\r\n */\r\n public static Teal(): Color3 {\r\n return new Color3(0, 1.0, 1.0);\r\n }\r\n /**\r\n * Returns a Color3 value containing a random color\r\n * @returns a new Color3 object\r\n */\r\n public static Random(): Color3 {\r\n return new Color3(Math.random(), Math.random(), Math.random());\r\n }\r\n}\r\nObject.defineProperties(Color3.prototype, {\r\n dimension: { value: [3] },\r\n rank: { value: 1 },\r\n});\r\n\r\n/**\r\n * Class used to hold a RBGA color\r\n */\r\nexport class Color4 implements Tensor>, IColor4Like {\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: [4];\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 1;\r\n\r\n /**\r\n * Creates a new Color4 object from red, green, blue values, all between 0 and 1\r\n * @param r defines the red component (between 0 and 1, default is 0)\r\n * @param g defines the green component (between 0 and 1, default is 0)\r\n * @param b defines the blue component (between 0 and 1, default is 0)\r\n * @param a defines the alpha component (between 0 and 1, default is 1)\r\n */\r\n constructor(\r\n /**\r\n * Defines the red component (between 0 and 1, default is 0)\r\n */\r\n public r: number = 0,\r\n /**\r\n * Defines the green component (between 0 and 1, default is 0)\r\n */\r\n public g: number = 0,\r\n /**\r\n * Defines the blue component (between 0 and 1, default is 0)\r\n */\r\n public b: number = 0,\r\n /**\r\n * Defines the alpha component (between 0 and 1, default is 1)\r\n */\r\n public a: number = 1\r\n ) {}\r\n\r\n // Operators\r\n\r\n /**\r\n * Creates a new array populated with 4 numeric elements : red, green, blue, alpha values\r\n * @returns the new array\r\n */\r\n public asArray(): Tuple {\r\n return [this.r, this.g, this.b, this.a];\r\n }\r\n\r\n /**\r\n * Stores from the starting index in the given array the Color4 successive values\r\n * @param array defines the array where to store the r,g,b components\r\n * @param index defines an optional index in the target array to define where to start storing values\r\n * @returns the current Color4 object\r\n */\r\n public toArray(array: FloatArray, index: number = 0): this {\r\n array[index] = this.r;\r\n array[index + 1] = this.g;\r\n array[index + 2] = this.b;\r\n array[index + 3] = this.a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Update the current color with values stored in an array from the starting index of the given array\r\n * @param array defines the source array\r\n * @param offset defines an offset in the source array\r\n * @returns the current Color4 object\r\n */\r\n public fromArray(array: DeepImmutable>, offset: number = 0): this {\r\n this.r = array[offset];\r\n this.g = array[offset + 1];\r\n this.b = array[offset + 2];\r\n this.a = array[offset + 3];\r\n return this;\r\n }\r\n\r\n /**\r\n * Determines equality between Color4 objects\r\n * @param otherColor defines the second operand\r\n * @returns true if the rgba values are equal to the given ones\r\n */\r\n public equals(otherColor: DeepImmutable): boolean {\r\n return otherColor && this.r === otherColor.r && this.g === otherColor.g && this.b === otherColor.b && this.a === otherColor.a;\r\n }\r\n\r\n /**\r\n * Creates a new Color4 set with the added values of the current Color4 and of the given one\r\n * @param otherColor defines the second operand\r\n * @returns a new Color4 object\r\n */\r\n public add(otherColor: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.r + otherColor.r, this.g + otherColor.g, this.b + otherColor.b, this.a + otherColor.a);\r\n }\r\n\r\n /**\r\n * Updates the given color \"result\" with the result of the addition of the current Color4 and the given one.\r\n * @param otherColor the color to add\r\n * @param result the color to store the result\r\n * @returns result input\r\n */\r\n public addToRef(otherColor: DeepImmutable, result: T): T {\r\n result.r = this.r + otherColor.r;\r\n result.g = this.g + otherColor.g;\r\n result.b = this.b + otherColor.b;\r\n result.a = this.a + otherColor.a;\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds in place the given Color4 values to the current Color4 object\r\n * @param otherColor defines the second operand\r\n * @returns the current updated Color4 object\r\n */\r\n public addInPlace(otherColor: DeepImmutable): this {\r\n this.r += otherColor.r;\r\n this.g += otherColor.g;\r\n this.b += otherColor.b;\r\n this.a += otherColor.a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the given coordinates to the current Color4\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @param a defines the a coordinate of the operand\r\n * @returns the current updated Color4\r\n */\r\n public addInPlaceFromFloats(r: number, g: number, b: number, a: number): this {\r\n this.r += r;\r\n this.g += g;\r\n this.b += b;\r\n this.a += a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates a new Color4 set with the subtracted values of the given one from the current Color4\r\n * @param otherColor defines the second operand\r\n * @returns a new Color4 object\r\n */\r\n public subtract(otherColor: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.r - otherColor.r, this.g - otherColor.g, this.b - otherColor.b, this.a - otherColor.a);\r\n }\r\n\r\n /**\r\n * Subtracts the given ones from the current Color4 values and stores the results in \"result\"\r\n * @param otherColor defines the second operand\r\n * @param result defines the Color4 object where to store the result\r\n * @returns the result Color4 object\r\n */\r\n public subtractToRef(otherColor: DeepImmutable, result: T): T {\r\n result.r = this.r - otherColor.r;\r\n result.g = this.g - otherColor.g;\r\n result.b = this.b - otherColor.b;\r\n result.a = this.a - otherColor.a;\r\n return result;\r\n }\r\n\r\n /**\r\n * Subtract in place the given color from the current Color4.\r\n * @param otherColor the color to subtract\r\n * @returns the updated Color4.\r\n */\r\n public subtractInPlace(otherColor: DeepImmutable): this {\r\n this.r -= otherColor.r;\r\n this.g -= otherColor.g;\r\n this.b -= otherColor.b;\r\n this.a -= otherColor.a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Color4 set with the result of the subtraction of the given floats from the current Color4 coordinates.\r\n * @param r value to subtract\r\n * @param g value to subtract\r\n * @param b value to subtract\r\n * @param a value to subtract\r\n * @returns new color containing the result\r\n */\r\n public subtractFromFloats(r: number, g: number, b: number, a: number): this {\r\n return new (this.constructor as Constructor)(this.r - r, this.g - g, this.b - b, this.a - a);\r\n }\r\n\r\n /**\r\n * Sets the given color \"result\" set with the result of the subtraction of the given floats from the current Color4 coordinates.\r\n * @param r value to subtract\r\n * @param g value to subtract\r\n * @param b value to subtract\r\n * @param a value to subtract\r\n * @param result the color to store the result in\r\n * @returns result input\r\n */\r\n public subtractFromFloatsToRef(r: number, g: number, b: number, a: number, result: T): T {\r\n result.r = this.r - r;\r\n result.g = this.g - g;\r\n result.b = this.b - b;\r\n result.a = this.a - a;\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new Color4 with the current Color4 values multiplied by scale\r\n * @param scale defines the scaling factor to apply\r\n * @returns a new Color4 object\r\n */\r\n public scale(scale: number): this {\r\n return new (this.constructor as Constructor)(this.r * scale, this.g * scale, this.b * scale, this.a * scale);\r\n }\r\n\r\n /**\r\n * Multiplies the Color4 values by the float \"scale\"\r\n * @param scale defines the scaling factor to apply\r\n * @returns the current updated Color4\r\n */\r\n public scaleInPlace(scale: number): this {\r\n this.r *= scale;\r\n this.g *= scale;\r\n this.b *= scale;\r\n this.a *= scale;\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiplies the current Color4 values by scale and stores the result in \"result\"\r\n * @param scale defines the scaling factor to apply\r\n * @param result defines the Color4 object where to store the result\r\n * @returns the result Color4\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n result.r = this.r * scale;\r\n result.g = this.g * scale;\r\n result.b = this.b * scale;\r\n result.a = this.a * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Scale the current Color4 values by a factor and add the result to a given Color4\r\n * @param scale defines the scale factor\r\n * @param result defines the Color4 object where to store the result\r\n * @returns the result Color4\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n result.r += this.r * scale;\r\n result.g += this.g * scale;\r\n result.b += this.b * scale;\r\n result.a += this.a * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Clamps the rgb values by the min and max values and stores the result into \"result\"\r\n * @param min defines minimum clamping value (default is 0)\r\n * @param max defines maximum clamping value (default is 1)\r\n * @param result defines color to store the result into.\r\n * @returns the result Color4\r\n */\r\n public clampToRef(min: number = 0, max: number = 1, result: T): T {\r\n result.r = Clamp(this.r, min, max);\r\n result.g = Clamp(this.g, min, max);\r\n result.b = Clamp(this.b, min, max);\r\n result.a = Clamp(this.a, min, max);\r\n return result;\r\n }\r\n\r\n /**\r\n * Multiply an Color4 value by another and return a new Color4 object\r\n * @param color defines the Color4 value to multiply by\r\n * @returns a new Color4 object\r\n */\r\n public multiply(color: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.r * color.r, this.g * color.g, this.b * color.b, this.a * color.a);\r\n }\r\n\r\n /**\r\n * Multiply a Color4 value by another and push the result in a reference value\r\n * @param color defines the Color4 value to multiply by\r\n * @param result defines the Color4 to fill the result in\r\n * @returns the result Color4\r\n */\r\n public multiplyToRef(color: DeepImmutable, result: T): T {\r\n result.r = this.r * color.r;\r\n result.g = this.g * color.g;\r\n result.b = this.b * color.b;\r\n result.a = this.a * color.a;\r\n return result;\r\n }\r\n\r\n /**\r\n * Multiplies in place the current Color4 by the given one.\r\n * @param otherColor color to multiple with\r\n * @returns the updated Color4.\r\n */\r\n public multiplyInPlace(otherColor: DeepImmutable): this {\r\n this.r *= otherColor.r;\r\n this.g *= otherColor.g;\r\n this.b *= otherColor.b;\r\n this.a *= otherColor.a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Color4 set with the multiplication result of the given floats and the current Color4 coordinates.\r\n * @param r value multiply with\r\n * @param g value multiply with\r\n * @param b value multiply with\r\n * @param a value multiply with\r\n * @returns resulting new color\r\n */\r\n public multiplyByFloats(r: number, g: number, b: number, a: number): this {\r\n return new (this.constructor as Constructor)(this.r * r, this.g * g, this.b * b, this.a * a);\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divide(_other: DeepImmutable): this {\r\n throw new ReferenceError(\"Can not divide a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divideToRef(_other: DeepImmutable, _result: T): T {\r\n throw new ReferenceError(\"Can not divide a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divideInPlace(_other: DeepImmutable): this {\r\n throw new ReferenceError(\"Can not divide a color\");\r\n }\r\n\r\n /**\r\n * Updates the Color4 coordinates with the minimum values between its own and the given color ones\r\n * @param other defines the second operand\r\n * @returns the current updated Color4\r\n */\r\n public minimizeInPlace(other: DeepImmutable): this {\r\n this.r = Math.min(this.r, other.r);\r\n this.g = Math.min(this.g, other.g);\r\n this.b = Math.min(this.b, other.b);\r\n this.a = Math.min(this.a, other.a);\r\n return this;\r\n }\r\n /**\r\n * Updates the Color4 coordinates with the maximum values between its own and the given color ones\r\n * @param other defines the second operand\r\n * @returns the current updated Color4\r\n */\r\n public maximizeInPlace(other: DeepImmutable): this {\r\n this.r = Math.max(this.r, other.r);\r\n this.g = Math.max(this.g, other.g);\r\n this.b = Math.max(this.b, other.b);\r\n this.a = Math.max(this.a, other.a);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Color4 with the minimal coordinate values between its and the given coordinates\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @param a defines the a coordinate of the operand\r\n * @returns the current updated Color4\r\n */\r\n public minimizeInPlaceFromFloats(r: number, g: number, b: number, a: number): this {\r\n this.r = Math.min(r, this.r);\r\n this.g = Math.min(g, this.g);\r\n this.b = Math.min(b, this.b);\r\n this.a = Math.min(a, this.a);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Color4 with the maximal coordinate values between its and the given coordinates.\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @param a defines the a coordinate of the operand\r\n * @returns the current updated Color4\r\n */\r\n public maximizeInPlaceFromFloats(r: number, g: number, b: number, a: number): this {\r\n this.r = Math.max(r, this.r);\r\n this.g = Math.max(g, this.g);\r\n this.b = Math.max(b, this.b);\r\n this.a = Math.max(a, this.a);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public floorToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not floor a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public floor(): this {\r\n throw new ReferenceError(\"Can not floor a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public fractToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not fract a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public fract(): this {\r\n throw new ReferenceError(\"Can not fract a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public negate(): this {\r\n throw new ReferenceError(\"Can not negate a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public negateInPlace(): this {\r\n throw new ReferenceError(\"Can not negate a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public negateToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not negate a color\");\r\n }\r\n\r\n /**\r\n * Boolean : True if the current Color4 coordinates are each beneath the distance \"epsilon\" from the given color ones.\r\n * @param otherColor color to compare against\r\n * @param epsilon (Default: very small number)\r\n * @returns true if they are equal\r\n */\r\n public equalsWithEpsilon(otherColor: DeepImmutable, epsilon: number = Epsilon): boolean {\r\n return (\r\n Scalar.WithinEpsilon(this.r, otherColor.r, epsilon) &&\r\n Scalar.WithinEpsilon(this.g, otherColor.g, epsilon) &&\r\n Scalar.WithinEpsilon(this.b, otherColor.b, epsilon) &&\r\n Scalar.WithinEpsilon(this.a, otherColor.a, epsilon)\r\n );\r\n }\r\n\r\n /**\r\n * Boolean : True if the given floats are strictly equal to the current Color4 coordinates.\r\n * @param x x value to compare against\r\n * @param y y value to compare against\r\n * @param z z value to compare against\r\n * @param w w value to compare against\r\n * @returns true if equal\r\n */\r\n public equalsToFloats(x: number, y: number, z: number, w: number): boolean {\r\n return this.r === x && this.g === y && this.b === z && this.a === w;\r\n }\r\n\r\n /**\r\n * Creates a string with the Color4 current values\r\n * @returns the string representation of the Color4 object\r\n */\r\n public toString(): string {\r\n return \"{R: \" + this.r + \" G:\" + this.g + \" B:\" + this.b + \" A:\" + this.a + \"}\";\r\n }\r\n\r\n /**\r\n * Returns the string \"Color4\"\r\n * @returns \"Color4\"\r\n */\r\n public getClassName(): string {\r\n return \"Color4\";\r\n }\r\n\r\n /**\r\n * Compute the Color4 hash code\r\n * @returns an unique number that can be used to hash Color4 objects\r\n */\r\n public getHashCode(): number {\r\n let hash = (this.r * 255) | 0;\r\n hash = (hash * 397) ^ ((this.g * 255) | 0);\r\n hash = (hash * 397) ^ ((this.b * 255) | 0);\r\n hash = (hash * 397) ^ ((this.a * 255) | 0);\r\n return hash;\r\n }\r\n\r\n /**\r\n * Creates a new Color4 copied from the current one\r\n * @returns a new Color4 object\r\n */\r\n public clone(): this {\r\n const result = new (this.constructor as Constructor)();\r\n return result.copyFrom(this);\r\n }\r\n\r\n /**\r\n * Copies the given Color4 values into the current one\r\n * @param source defines the source Color4 object\r\n * @returns the current updated Color4 object\r\n */\r\n public copyFrom(source: DeepImmutable): this {\r\n this.r = source.r;\r\n this.g = source.g;\r\n this.b = source.b;\r\n this.a = source.a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Copies the given float values into the current one\r\n * @param r defines the red component to read from\r\n * @param g defines the green component to read from\r\n * @param b defines the blue component to read from\r\n * @param a defines the alpha component to read from\r\n * @returns the current updated Color4 object\r\n */\r\n public copyFromFloats(r: number, g: number, b: number, a: number): this {\r\n this.r = r;\r\n this.g = g;\r\n this.b = b;\r\n this.a = a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Copies the given float values into the current one\r\n * @param r defines the red component to read from\r\n * @param g defines the green component to read from\r\n * @param b defines the blue component to read from\r\n * @param a defines the alpha component to read from\r\n * @returns the current updated Color4 object\r\n */\r\n public set(r: number, g: number, b: number, a: number): this {\r\n return this.copyFromFloats(r, g, b, a);\r\n }\r\n\r\n /**\r\n * Copies the given float to the current Vector4 coordinates\r\n * @param v defines the r, g, b, and a coordinates of the operand\r\n * @returns the current updated Vector4\r\n */\r\n public setAll(v: number): this {\r\n this.r = this.g = this.b = this.a = v;\r\n return this;\r\n }\r\n\r\n /**\r\n * Compute the Color4 hexadecimal code as a string\r\n * @param returnAsColor3 defines if the string should only contains RGB values (off by default)\r\n * @returns a string containing the hexadecimal representation of the Color4 object\r\n */\r\n public toHexString(returnAsColor3 = false): string {\r\n const intR = Math.round(this.r * 255);\r\n const intG = Math.round(this.g * 255);\r\n const intB = Math.round(this.b * 255);\r\n\r\n if (returnAsColor3) {\r\n return \"#\" + ToHex(intR) + ToHex(intG) + ToHex(intB);\r\n }\r\n\r\n const intA = Math.round(this.a * 255);\r\n return \"#\" + ToHex(intR) + ToHex(intG) + ToHex(intB) + ToHex(intA);\r\n }\r\n\r\n /**\r\n * Computes a new Color4 converted from the current one to linear space\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns a new Color4 object\r\n */\r\n public toLinearSpace(exact = false): Color4 {\r\n const convertedColor = new Color4();\r\n this.toLinearSpaceToRef(convertedColor, exact);\r\n return convertedColor;\r\n }\r\n\r\n /**\r\n * Converts the Color4 values to linear space and stores the result in \"convertedColor\"\r\n * @param convertedColor defines the Color4 object where to store the linear space version\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns the unmodified Color4\r\n */\r\n public toLinearSpaceToRef(convertedColor: Color4, exact = false): Color4 {\r\n if (exact) {\r\n convertedColor.r = colorChannelToLinearSpaceExact(this.r);\r\n convertedColor.g = colorChannelToLinearSpaceExact(this.g);\r\n convertedColor.b = colorChannelToLinearSpaceExact(this.b);\r\n } else {\r\n convertedColor.r = colorChannelToLinearSpace(this.r);\r\n convertedColor.g = colorChannelToLinearSpace(this.g);\r\n convertedColor.b = colorChannelToLinearSpace(this.b);\r\n }\r\n convertedColor.a = this.a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Computes a new Color4 converted from the current one to gamma space\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns a new Color4 object\r\n */\r\n public toGammaSpace(exact = false): Color4 {\r\n const convertedColor = new Color4();\r\n this.toGammaSpaceToRef(convertedColor, exact);\r\n return convertedColor;\r\n }\r\n\r\n /**\r\n * Converts the Color4 values to gamma space and stores the result in \"convertedColor\"\r\n * @param convertedColor defines the Color4 object where to store the gamma space version\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns the unmodified Color4\r\n */\r\n public toGammaSpaceToRef(convertedColor: Color4, exact = false): Color4 {\r\n if (exact) {\r\n convertedColor.r = colorChannelToGammaSpaceExact(this.r);\r\n convertedColor.g = colorChannelToGammaSpaceExact(this.g);\r\n convertedColor.b = colorChannelToGammaSpaceExact(this.b);\r\n } else {\r\n convertedColor.r = colorChannelToGammaSpace(this.r);\r\n convertedColor.g = colorChannelToGammaSpace(this.g);\r\n convertedColor.b = colorChannelToGammaSpace(this.b);\r\n }\r\n convertedColor.a = this.a;\r\n return this;\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Creates a new Color4 from the string containing valid hexadecimal values.\r\n *\r\n * A valid hex string is either in the format #RRGGBB or #RRGGBBAA.\r\n *\r\n * When a hex string without alpha is passed, the resulting Color4 has\r\n * its alpha value set to 1.0.\r\n *\r\n * An invalid string results in a Color with all its channels set to 0.0,\r\n * i.e. \"transparent black\".\r\n *\r\n * @param hex defines a string containing valid hexadecimal values\r\n * @returns a new Color4 object\r\n */\r\n public static FromHexString(hex: string): Color4 {\r\n if (hex.substring(0, 1) !== \"#\" || (hex.length !== 9 && hex.length !== 7)) {\r\n return new Color4(0.0, 0.0, 0.0, 0.0);\r\n }\r\n\r\n const r = parseInt(hex.substring(1, 3), 16);\r\n const g = parseInt(hex.substring(3, 5), 16);\r\n const b = parseInt(hex.substring(5, 7), 16);\r\n const a = hex.length === 9 ? parseInt(hex.substring(7, 9), 16) : 255;\r\n\r\n return Color4.FromInts(r, g, b, a);\r\n }\r\n\r\n /**\r\n * Creates a new Color4 object set with the linearly interpolated values of \"amount\" between the left Color4 object and the right Color4 object\r\n * @param left defines the start value\r\n * @param right defines the end value\r\n * @param amount defines the gradient factor\r\n * @returns a new Color4 object\r\n */\r\n public static Lerp(left: DeepImmutable, right: DeepImmutable, amount: number): Color4 {\r\n const result = new Color4(0.0, 0.0, 0.0, 0.0);\r\n Color4.LerpToRef(left, right, amount, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Set the given \"result\" with the linearly interpolated values of \"amount\" between the left Color4 object and the right Color4 object\r\n * @param left defines the start value\r\n * @param right defines the end value\r\n * @param amount defines the gradient factor\r\n * @param result defines the Color4 object where to store data\r\n */\r\n public static LerpToRef(left: DeepImmutable, right: DeepImmutable, amount: number, result: Color4): void {\r\n result.r = left.r + (right.r - left.r) * amount;\r\n result.g = left.g + (right.g - left.g) * amount;\r\n result.b = left.b + (right.b - left.b) * amount;\r\n result.a = left.a + (right.a - left.a) * amount;\r\n }\r\n\r\n /**\r\n * Interpolate between two Color4 using Hermite interpolation\r\n * @param value1 defines first Color4\r\n * @param tangent1 defines the incoming tangent\r\n * @param value2 defines second Color4\r\n * @param tangent2 defines the outgoing tangent\r\n * @param amount defines the target Color4\r\n * @returns the new interpolated Color4\r\n */\r\n public static Hermite(value1: DeepImmutable, tangent1: DeepImmutable, value2: DeepImmutable, tangent2: DeepImmutable, amount: number): Color4 {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n const part1 = 2.0 * cubed - 3.0 * squared + 1.0;\r\n const part2 = -2.0 * cubed + 3.0 * squared;\r\n const part3 = cubed - 2.0 * squared + amount;\r\n const part4 = cubed - squared;\r\n\r\n const r = value1.r * part1 + value2.r * part2 + tangent1.r * part3 + tangent2.r * part4;\r\n const g = value1.g * part1 + value2.g * part2 + tangent1.g * part3 + tangent2.g * part4;\r\n const b = value1.b * part1 + value2.b * part2 + tangent1.b * part3 + tangent2.b * part4;\r\n const a = value1.a * part1 + value2.a * part2 + tangent1.a * part3 + tangent2.a * part4;\r\n return new Color4(r, g, b, a);\r\n }\r\n\r\n /**\r\n * Returns a new Color4 which is the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @returns 1st derivative\r\n */\r\n public static Hermite1stDerivative(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number\r\n ): Color4 {\r\n const result = new Color4();\r\n\r\n this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Update a Color4 with the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @param result define where to store the derivative\r\n */\r\n public static Hermite1stDerivativeToRef(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number,\r\n result: Color4\r\n ) {\r\n const t2 = time * time;\r\n\r\n result.r = (t2 - time) * 6 * value1.r + (3 * t2 - 4 * time + 1) * tangent1.r + (-t2 + time) * 6 * value2.r + (3 * t2 - 2 * time) * tangent2.r;\r\n result.g = (t2 - time) * 6 * value1.g + (3 * t2 - 4 * time + 1) * tangent1.g + (-t2 + time) * 6 * value2.g + (3 * t2 - 2 * time) * tangent2.g;\r\n result.b = (t2 - time) * 6 * value1.b + (3 * t2 - 4 * time + 1) * tangent1.b + (-t2 + time) * 6 * value2.b + (3 * t2 - 2 * time) * tangent2.b;\r\n result.a = (t2 - time) * 6 * value1.a + (3 * t2 - 4 * time + 1) * tangent1.a + (-t2 + time) * 6 * value2.a + (3 * t2 - 2 * time) * tangent2.a;\r\n }\r\n\r\n /**\r\n * Creates a new Color4 from a Color3 and an alpha value\r\n * @param color3 defines the source Color3 to read from\r\n * @param alpha defines the alpha component (1.0 by default)\r\n * @returns a new Color4 object\r\n */\r\n public static FromColor3(color3: DeepImmutable, alpha: number = 1.0): Color4 {\r\n return new Color4(color3.r, color3.g, color3.b, alpha);\r\n }\r\n\r\n /**\r\n * Creates a new Color4 from the starting index element of the given array\r\n * @param array defines the source array to read from\r\n * @param offset defines the offset in the source array\r\n * @returns a new Color4 object\r\n */\r\n public static FromArray(array: DeepImmutable>, offset: number = 0): Color4 {\r\n return new Color4(array[offset], array[offset + 1], array[offset + 2], array[offset + 3]);\r\n }\r\n\r\n /**\r\n * Creates a new Color4 from the starting index element of the given array\r\n * @param array defines the source array to read from\r\n * @param offset defines the offset in the source array\r\n * @param result defines the target Color4 object\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number = 0, result: Color4) {\r\n result.r = array[offset];\r\n result.g = array[offset + 1];\r\n result.b = array[offset + 2];\r\n result.a = array[offset + 3];\r\n }\r\n\r\n /**\r\n * Creates a new Color3 from integer values (less than 256)\r\n * @param r defines the red component to read from (value between 0 and 255)\r\n * @param g defines the green component to read from (value between 0 and 255)\r\n * @param b defines the blue component to read from (value between 0 and 255)\r\n * @param a defines the alpha component to read from (value between 0 and 255)\r\n * @returns a new Color3 object\r\n */\r\n public static FromInts(r: number, g: number, b: number, a: number): Color4 {\r\n return new Color4(r / 255.0, g / 255.0, b / 255.0, a / 255.0);\r\n }\r\n\r\n /**\r\n * Check the content of a given array and convert it to an array containing RGBA data\r\n * If the original array was already containing count * 4 values then it is returned directly\r\n * @param colors defines the array to check\r\n * @param count defines the number of RGBA data to expect\r\n * @returns an array containing count * 4 values (RGBA)\r\n */\r\n public static CheckColors4(colors: number[], count: number): number[] {\r\n // Check if color3 was used\r\n if (colors.length === count * 3) {\r\n const colors4 = [];\r\n for (let index = 0; index < colors.length; index += 3) {\r\n const newIndex = (index / 3) * 4;\r\n colors4[newIndex] = colors[index];\r\n colors4[newIndex + 1] = colors[index + 1];\r\n colors4[newIndex + 2] = colors[index + 2];\r\n colors4[newIndex + 3] = 1.0;\r\n }\r\n\r\n return colors4;\r\n }\r\n\r\n return colors;\r\n }\r\n}\r\nObject.defineProperties(Color4.prototype, {\r\n dimension: { value: [4] },\r\n rank: { value: 1 },\r\n});\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class TmpColors {\r\n public static Color3: Color3[] = ArrayTools.BuildArray(3, Color3.Black);\r\n public static Color4: Color4[] = ArrayTools.BuildArray(3, () => new Color4(0, 0, 0, 0));\r\n}\r\n\r\nRegisterClass(\"BABYLON.Color3\", Color3);\r\nRegisterClass(\"BABYLON.Color4\", Color4);\r\n", "import type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Sprite } from \"../Sprites/sprite\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Vector2 } from \"../Maths/math.vector\";\r\n\r\n/**\r\n * Interface used to define ActionEvent\r\n */\r\nexport interface IActionEvent {\r\n /** The mesh or sprite that triggered the action */\r\n source: any;\r\n /** The X mouse cursor position at the time of the event */\r\n pointerX: number;\r\n /** The Y mouse cursor position at the time of the event */\r\n pointerY: number;\r\n /** The mesh that is currently pointed at (can be null) */\r\n meshUnderPointer: Nullable;\r\n /** the original (browser) event that triggered the ActionEvent */\r\n sourceEvent?: any;\r\n /** additional data for the event */\r\n additionalData?: any;\r\n}\r\n\r\n/**\r\n * ActionEvent is the event being sent when an action is triggered.\r\n */\r\nexport class ActionEvent implements IActionEvent {\r\n /**\r\n * Creates a new ActionEvent\r\n * @param source The mesh or sprite that triggered the action\r\n * @param pointerX The X mouse cursor position at the time of the event\r\n * @param pointerY The Y mouse cursor position at the time of the event\r\n * @param meshUnderPointer The mesh that is currently pointed at (can be null)\r\n * @param sourceEvent the original (browser) event that triggered the ActionEvent\r\n * @param additionalData additional data for the event\r\n */\r\n constructor(\r\n /** The mesh or sprite that triggered the action */\r\n public source: any,\r\n /** The X mouse cursor position at the time of the event */\r\n public pointerX: number,\r\n /** The Y mouse cursor position at the time of the event */\r\n public pointerY: number,\r\n /** The mesh that is currently pointed at (can be null) */\r\n public meshUnderPointer: Nullable,\r\n /** the original (browser) event that triggered the ActionEvent */\r\n public sourceEvent?: any,\r\n /** additional data for the event */\r\n public additionalData?: any\r\n ) {}\r\n\r\n /**\r\n * Helper function to auto-create an ActionEvent from a source mesh.\r\n * @param source The source mesh that triggered the event\r\n * @param evt The original (browser) event\r\n * @param additionalData additional data for the event\r\n * @returns the new ActionEvent\r\n */\r\n public static CreateNew(source: AbstractMesh, evt?: any, additionalData?: any): ActionEvent {\r\n const scene = source.getScene();\r\n return new ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer || source, evt, additionalData);\r\n }\r\n\r\n /**\r\n * Helper function to auto-create an ActionEvent from a source sprite\r\n * @param source The source sprite that triggered the event\r\n * @param scene Scene associated with the sprite\r\n * @param evt The original (browser) event\r\n * @param additionalData additional data for the event\r\n * @returns the new ActionEvent\r\n */\r\n public static CreateNewFromSprite(source: Sprite, scene: Scene, evt?: any, additionalData?: any): ActionEvent {\r\n return new ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer, evt, additionalData);\r\n }\r\n\r\n /**\r\n * Helper function to auto-create an ActionEvent from a scene. If triggered by a mesh use ActionEvent.CreateNew\r\n * @param scene the scene where the event occurred\r\n * @param evt The original (browser) event\r\n * @returns the new ActionEvent\r\n */\r\n public static CreateNewFromScene(scene: Scene, evt: any): ActionEvent {\r\n return new ActionEvent(null, scene.pointerX, scene.pointerY, scene.meshUnderPointer, evt);\r\n }\r\n\r\n /**\r\n * Helper function to auto-create an ActionEvent from a primitive\r\n * @param prim defines the target primitive\r\n * @param pointerPos defines the pointer position\r\n * @param evt The original (browser) event\r\n * @param additionalData additional data for the event\r\n * @returns the new ActionEvent\r\n */\r\n public static CreateNewFromPrimitive(prim: any, pointerPos: Vector2, evt?: Event, additionalData?: any): ActionEvent {\r\n return new ActionEvent(prim, pointerPos.x, pointerPos.y, null, evt, additionalData);\r\n }\r\n}\r\n", "/* eslint-disable no-console */\r\n/**\r\n * Logger used throughout the application to allow configuration of\r\n * the log level required for the messages.\r\n */\r\nexport class Logger {\r\n /**\r\n * No log\r\n */\r\n public static readonly NoneLogLevel = 0;\r\n /**\r\n * Only message logs\r\n */\r\n public static readonly MessageLogLevel = 1;\r\n /**\r\n * Only warning logs\r\n */\r\n public static readonly WarningLogLevel = 2;\r\n /**\r\n * Only error logs\r\n */\r\n public static readonly ErrorLogLevel = 4;\r\n /**\r\n * All logs\r\n */\r\n public static readonly AllLogLevel = 7;\r\n\r\n /**\r\n * Message to display when a message has been logged too many times\r\n */\r\n public static MessageLimitReached = \"Too many %TYPE%s (%LIMIT%), no more %TYPE%s will be reported for this message.\";\r\n\r\n private static _LogCache = \"\";\r\n private static _LogLimitOutputs: { [message: string]: { limit: number; current: number } } = {};\r\n // levels according to the (binary) numbering.\r\n private static _Levels = [\r\n {},\r\n { color: \"white\", logFunc: console.log, name: \"Log\" },\r\n { color: \"orange\", logFunc: console.warn, name: \"Warn\" },\r\n {},\r\n { color: \"red\", logFunc: console.error, name: \"Error\" },\r\n ];\r\n\r\n /**\r\n * Gets a value indicating the number of loading errors\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static errorsCount = 0;\r\n\r\n /**\r\n * Callback called when a new log is added\r\n */\r\n public static OnNewCacheEntry: (entry: string) => void;\r\n\r\n private static _CheckLimit(message: string, limit: number): boolean {\r\n let entry = Logger._LogLimitOutputs[message];\r\n if (!entry) {\r\n entry = { limit, current: 1 };\r\n Logger._LogLimitOutputs[message] = entry;\r\n } else {\r\n entry.current++;\r\n }\r\n return entry.current <= entry.limit;\r\n }\r\n\r\n private static _GenerateLimitMessage(message: string, level: number = 1): void {\r\n const entry = Logger._LogLimitOutputs[message];\r\n if (!entry || !Logger.MessageLimitReached) {\r\n return;\r\n }\r\n const type = this._Levels[level];\r\n if (entry.current === entry.limit) {\r\n Logger[type.name as \"Log\" | \"Warn\" | \"Error\"](Logger.MessageLimitReached.replace(/%LIMIT%/g, \"\" + entry.limit).replace(/%TYPE%/g, type.name ?? \"\"));\r\n }\r\n }\r\n\r\n private static _AddLogEntry(entry: string) {\r\n Logger._LogCache = entry + Logger._LogCache;\r\n\r\n if (Logger.OnNewCacheEntry) {\r\n Logger.OnNewCacheEntry(entry);\r\n }\r\n }\r\n\r\n private static _FormatMessage(message: string): string {\r\n const padStr = (i: number) => (i < 10 ? \"0\" + i : \"\" + i);\r\n\r\n const date = new Date();\r\n return \"[\" + padStr(date.getHours()) + \":\" + padStr(date.getMinutes()) + \":\" + padStr(date.getSeconds()) + \"]: \" + message;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private static _LogDisabled(message: string | any[], limit?: number): void {\r\n // nothing to do\r\n }\r\n private static _LogEnabled(level: number = 1, message: string | any[], limit?: number): void {\r\n // take first message if array\r\n const msg = Array.isArray(message) ? message[0] : message;\r\n if (limit !== undefined && !Logger._CheckLimit(msg, limit)) {\r\n return;\r\n }\r\n\r\n const formattedMessage = Logger._FormatMessage(msg);\r\n const type = this._Levels[level];\r\n const optionals = Array.isArray(message) ? message.slice(1) : [];\r\n type.logFunc && type.logFunc(\"BJS - \" + formattedMessage, ...optionals);\r\n\r\n const entry = `
${formattedMessage}

`;\r\n Logger._AddLogEntry(entry);\r\n Logger._GenerateLimitMessage(msg, level);\r\n }\r\n\r\n /**\r\n * Log a message to the console\r\n */\r\n public static Log: (message: string | any[], limit?: number) => void = Logger._LogEnabled.bind(Logger, Logger.MessageLogLevel);\r\n\r\n /**\r\n * Write a warning message to the console\r\n */\r\n public static Warn: (message: string | any[], limit?: number) => void = Logger._LogEnabled.bind(Logger, Logger.WarningLogLevel);\r\n\r\n /**\r\n * Write an error message to the console\r\n */\r\n public static Error: (message: string | any[], limit?: number) => void = Logger._LogEnabled.bind(Logger, Logger.ErrorLogLevel);\r\n\r\n /**\r\n * Gets current log cache (list of logs)\r\n */\r\n public static get LogCache(): string {\r\n return Logger._LogCache;\r\n }\r\n\r\n /**\r\n * Clears the log cache\r\n */\r\n public static ClearLogCache(): void {\r\n Logger._LogCache = \"\";\r\n Logger._LogLimitOutputs = {};\r\n Logger.errorsCount = 0;\r\n }\r\n\r\n /**\r\n * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel)\r\n */\r\n public static set LogLevels(level: number) {\r\n Logger.Log = Logger._LogDisabled;\r\n Logger.Warn = Logger._LogDisabled;\r\n Logger.Error = Logger._LogDisabled;\r\n [Logger.MessageLogLevel, Logger.WarningLogLevel, Logger.ErrorLogLevel].forEach((l) => {\r\n if ((level & l) === l) {\r\n const type = this._Levels[l];\r\n Logger[type.name as \"Log\" | \"Warn\" | \"Error\"] = Logger._LogEnabled.bind(Logger, l);\r\n }\r\n });\r\n }\r\n}\r\n", "import { Logger } from \"./logger\";\r\n\r\nconst CloneValue = (source: any, destinationObject: any, shallowCopyValues: boolean) => {\r\n if (!source) {\r\n return null;\r\n }\r\n\r\n if (source.getClassName && source.getClassName() === \"Mesh\") {\r\n return null;\r\n }\r\n\r\n if (source.getClassName && (source.getClassName() === \"SubMesh\" || source.getClassName() === \"PhysicsBody\")) {\r\n return source.clone(destinationObject);\r\n } else if (source.clone) {\r\n return source.clone();\r\n } else if (Array.isArray(source)) {\r\n return source.slice();\r\n } else if (shallowCopyValues && typeof source === \"object\") {\r\n return { ...source };\r\n }\r\n return null;\r\n};\r\n\r\nfunction GetAllPropertyNames(obj: any): string[] {\r\n const props: string[] = [];\r\n\r\n do {\r\n Object.getOwnPropertyNames(obj).forEach(function (prop) {\r\n if (props.indexOf(prop) === -1) {\r\n props.push(prop);\r\n }\r\n });\r\n } while ((obj = Object.getPrototypeOf(obj)));\r\n\r\n return props;\r\n}\r\n\r\n/**\r\n * Class containing a set of static utilities functions for deep copy.\r\n */\r\nexport class DeepCopier {\r\n /**\r\n * Tries to copy an object by duplicating every property\r\n * @param source defines the source object\r\n * @param destination defines the target object\r\n * @param doNotCopyList defines a list of properties to avoid\r\n * @param mustCopyList defines a list of properties to copy (even if they start with _)\r\n * @param shallowCopyValues defines wether properties referencing objects (none cloneable) must be shallow copied (false by default)\r\n * @remarks shallowCopyValues will not instantite the copied values which makes it only usable for \"JSON objects\"\r\n */\r\n public static DeepCopy(source: any, destination: any, doNotCopyList?: string[], mustCopyList?: string[], shallowCopyValues = false): void {\r\n const properties = GetAllPropertyNames(source);\r\n for (const prop of properties) {\r\n if (prop[0] === \"_\" && (!mustCopyList || mustCopyList.indexOf(prop) === -1)) {\r\n continue;\r\n }\r\n\r\n if (prop.endsWith(\"Observable\")) {\r\n continue;\r\n }\r\n\r\n if (doNotCopyList && doNotCopyList.indexOf(prop) !== -1) {\r\n continue;\r\n }\r\n\r\n const sourceValue = source[prop];\r\n const typeOfSourceValue = typeof sourceValue;\r\n\r\n if (typeOfSourceValue === \"function\") {\r\n continue;\r\n }\r\n\r\n try {\r\n if (typeOfSourceValue === \"object\") {\r\n if (sourceValue instanceof Uint8Array) {\r\n destination[prop] = Uint8Array.from(sourceValue);\r\n } else if (sourceValue instanceof Array) {\r\n destination[prop] = [];\r\n\r\n if (sourceValue.length > 0) {\r\n if (typeof sourceValue[0] == \"object\") {\r\n for (let index = 0; index < sourceValue.length; index++) {\r\n const clonedValue = CloneValue(sourceValue[index], destination, shallowCopyValues);\r\n\r\n if (destination[prop].indexOf(clonedValue) === -1) {\r\n // Test if auto inject was not done\r\n destination[prop].push(clonedValue);\r\n }\r\n }\r\n } else {\r\n destination[prop] = sourceValue.slice(0);\r\n }\r\n }\r\n } else {\r\n destination[prop] = CloneValue(sourceValue, destination, shallowCopyValues);\r\n }\r\n } else {\r\n destination[prop] = sourceValue;\r\n }\r\n } catch (e) {\r\n // Log a warning (it could be because of a read-only property)\r\n Logger.Warn(e.message);\r\n }\r\n }\r\n }\r\n}\r\n", "import type { IEasingFunction } from \"./easing\";\r\n\r\n/**\r\n * Defines an interface which represents an animation key frame\r\n */\r\nexport interface IAnimationKey {\r\n /**\r\n * Frame of the key frame\r\n */\r\n frame: number;\r\n /**\r\n * Value at the specifies key frame\r\n */\r\n value: any;\r\n /**\r\n * The input tangent for the cubic hermite spline\r\n */\r\n inTangent?: any;\r\n /**\r\n * The output tangent for the cubic hermite spline\r\n */\r\n outTangent?: any;\r\n /**\r\n * The animation interpolation type\r\n */\r\n interpolation?: AnimationKeyInterpolation;\r\n /**\r\n * Property defined by UI tools to link (or not ) the tangents\r\n */\r\n lockedTangent?: boolean;\r\n /**\r\n * The easing function associated with the key frame (optional). If not defined, the easing function defined at the animation level (if any) will be used instead\r\n */\r\n easingFunction?: IEasingFunction;\r\n}\r\n\r\n/**\r\n * Enum for the animation key frame interpolation type\r\n */\r\nexport enum AnimationKeyInterpolation {\r\n /**\r\n * Use tangents to interpolate between start and end values.\r\n */\r\n NONE = 0,\r\n /**\r\n * Do not interpolate between keys and use the start key value only. Tangents are ignored\r\n */\r\n STEP = 1,\r\n}\r\n", "/**\r\n * Represents the range of an animation\r\n */\r\nexport class AnimationRange {\r\n /**\r\n * Initializes the range of an animation\r\n * @param name The name of the animation range\r\n * @param from The starting frame of the animation\r\n * @param to The ending frame of the animation\r\n */\r\n constructor(\r\n /**The name of the animation range**/\r\n public name: string,\r\n /**The starting frame of the animation */\r\n public from: number,\r\n /**The ending frame of the animation*/\r\n public to: number\r\n ) {}\r\n\r\n /**\r\n * Makes a copy of the animation range\r\n * @returns A copy of the animation range\r\n */\r\n public clone(): AnimationRange {\r\n return new AnimationRange(this.name, this.from, this.to);\r\n }\r\n}\r\n", "// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst __mergedStore = {};\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst __decoratorInitialStore = {};\r\n\r\n/** @internal */\r\nexport function GetDirectStore(target: any): any {\r\n const classKey = target.getClassName();\r\n\r\n if (!(__decoratorInitialStore)[classKey]) {\r\n (__decoratorInitialStore)[classKey] = {};\r\n }\r\n\r\n return (__decoratorInitialStore)[classKey];\r\n}\r\n\r\n/**\r\n * @returns the list of properties flagged as serializable\r\n * @param target host object\r\n */\r\nexport function GetMergedStore(target: any): any {\r\n const classKey = target.getClassName();\r\n\r\n if ((__mergedStore)[classKey]) {\r\n return (__mergedStore)[classKey];\r\n }\r\n\r\n (__mergedStore)[classKey] = {};\r\n\r\n const store = (__mergedStore)[classKey];\r\n let currentTarget = target;\r\n let currentKey = classKey;\r\n while (currentKey) {\r\n const initialStore = (__decoratorInitialStore)[currentKey];\r\n for (const property in initialStore) {\r\n store[property] = initialStore[property];\r\n }\r\n\r\n let parent: any;\r\n let done = false;\r\n\r\n do {\r\n parent = Object.getPrototypeOf(currentTarget);\r\n if (!parent.getClassName) {\r\n done = true;\r\n break;\r\n }\r\n\r\n if (parent.getClassName() !== currentKey) {\r\n break;\r\n }\r\n\r\n currentTarget = parent;\r\n } while (parent);\r\n\r\n if (done) {\r\n break;\r\n }\r\n\r\n currentKey = parent.getClassName();\r\n currentTarget = parent;\r\n }\r\n\r\n return store;\r\n}\r\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"../types\";\r\nimport { GetDirectStore } from \"./decorators.functions\";\r\nimport { _WarnImport } from \"./devTools\";\r\n\r\nfunction generateSerializableMember(type: number, sourceName?: string) {\r\n return (target: any, propertyKey: string | symbol) => {\r\n const classStore = GetDirectStore(target);\r\n\r\n if (!classStore[propertyKey]) {\r\n classStore[propertyKey] = { type: type, sourceName: sourceName };\r\n }\r\n };\r\n}\r\n\r\nfunction generateExpandMember(setCallback: string, targetKey: Nullable = null) {\r\n return (target: any, propertyKey: string) => {\r\n const key = targetKey || \"_\" + propertyKey;\r\n Object.defineProperty(target, propertyKey, {\r\n get: function (this: any) {\r\n return this[key];\r\n },\r\n set: function (this: any, value) {\r\n // does this object (i.e. vector3) has an equals function? use it!\r\n // Note - not using \"with epsilon\" here, it is expected te behave like the internal cache does.\r\n if (typeof this.equals === \"function\") {\r\n if (this.equals(value)) {\r\n return;\r\n }\r\n }\r\n if (this[key] === value) {\r\n return;\r\n }\r\n this[key] = value;\r\n\r\n target[setCallback].apply(this);\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n };\r\n}\r\n\r\nexport function expandToProperty(callback: string, targetKey: Nullable = null) {\r\n return generateExpandMember(callback, targetKey);\r\n}\r\n\r\nexport function serialize(sourceName?: string) {\r\n return generateSerializableMember(0, sourceName); // value member\r\n}\r\n\r\nexport function serializeAsTexture(sourceName?: string) {\r\n return generateSerializableMember(1, sourceName); // texture member\r\n}\r\n\r\nexport function serializeAsColor3(sourceName?: string) {\r\n return generateSerializableMember(2, sourceName); // color3 member\r\n}\r\n\r\nexport function serializeAsFresnelParameters(sourceName?: string) {\r\n return generateSerializableMember(3, sourceName); // fresnel parameters member\r\n}\r\n\r\nexport function serializeAsVector2(sourceName?: string) {\r\n return generateSerializableMember(4, sourceName); // vector2 member\r\n}\r\n\r\nexport function serializeAsVector3(sourceName?: string) {\r\n return generateSerializableMember(5, sourceName); // vector3 member\r\n}\r\n\r\nexport function serializeAsMeshReference(sourceName?: string) {\r\n return generateSerializableMember(6, sourceName); // mesh reference member\r\n}\r\n\r\nexport function serializeAsColorCurves(sourceName?: string) {\r\n return generateSerializableMember(7, sourceName); // color curves\r\n}\r\n\r\nexport function serializeAsColor4(sourceName?: string) {\r\n return generateSerializableMember(8, sourceName); // color 4\r\n}\r\n\r\nexport function serializeAsImageProcessingConfiguration(sourceName?: string) {\r\n return generateSerializableMember(9, sourceName); // image processing\r\n}\r\n\r\nexport function serializeAsQuaternion(sourceName?: string) {\r\n return generateSerializableMember(10, sourceName); // quaternion member\r\n}\r\n\r\nexport function serializeAsMatrix(sourceName?: string) {\r\n return generateSerializableMember(12, sourceName); // matrix member\r\n}\r\n\r\n/**\r\n * Decorator used to define property that can be serialized as reference to a camera\r\n * @param sourceName defines the name of the property to decorate\r\n * @returns Property Decorator\r\n */\r\nexport function serializeAsCameraReference(sourceName?: string) {\r\n return generateSerializableMember(11, sourceName); // camera reference member\r\n}\r\n\r\n/** @internal */\r\ndeclare const _native: any;\r\n\r\n/**\r\n * Decorator used to redirect a function to a native implementation if available.\r\n * @internal\r\n */\r\nexport function nativeOverride boolean>(\r\n target: any,\r\n propertyKey: string,\r\n descriptor: TypedPropertyDescriptor<(...params: Parameters) => unknown>,\r\n predicate?: T\r\n) {\r\n // Cache the original JS function for later.\r\n const jsFunc = descriptor.value!;\r\n\r\n // Override the JS function to check for a native override on first invocation. Setting descriptor.value overrides the function at the early stage of code being loaded/imported.\r\n descriptor.value = (...params: Parameters): unknown => {\r\n // Assume the resolved function will be the original JS function, then we will check for the Babylon Native context.\r\n let func = jsFunc;\r\n\r\n // Check if we are executing in a Babylon Native context (e.g. check the presence of the _native global property) and if so also check if a function override is available.\r\n if (typeof _native !== \"undefined\" && _native[propertyKey]) {\r\n const nativeFunc = _native[propertyKey] as (...params: Parameters) => unknown;\r\n // If a predicate was provided, then we'll need to invoke the predicate on each invocation of the underlying function to determine whether to call the native function or the JS function.\r\n if (predicate) {\r\n // The resolved function will execute the predicate and then either execute the native function or the JS function.\r\n func = (...params: Parameters) => (predicate(...params) ? nativeFunc(...params) : jsFunc(...params));\r\n } else {\r\n // The resolved function will directly execute the native function.\r\n func = nativeFunc;\r\n }\r\n }\r\n\r\n // Override the JS function again with the final resolved target function.\r\n target[propertyKey] = func;\r\n\r\n // The JS function has now been overridden based on whether we're executing in the context of Babylon Native, but we still need to invoke that function.\r\n // Future invocations of the function will just directly invoke the final overridden function, not any of the decorator setup logic above.\r\n return func(...params);\r\n };\r\n}\r\n\r\n/**\r\n * Decorator factory that applies the nativeOverride decorator, but determines whether to redirect to the native implementation based on a filter function that evaluates the function arguments.\r\n * @param predicate\r\n * @example @nativeOverride.filter((...[arg1]: Parameters) => arg1.length > 20)\r\n * public someMethod(arg1: string, arg2: number): string {\r\n * @internal\r\n */\r\nnativeOverride.filter = function boolean>(predicate: T) {\r\n return (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...params: Parameters) => unknown>) =>\r\n nativeOverride(target, propertyKey, descriptor, predicate);\r\n};\r\n", "/**\r\n * Class used to evaluate queries containing `and` and `or` operators\r\n */\r\nexport class AndOrNotEvaluator {\r\n /**\r\n * Evaluate a query\r\n * @param query defines the query to evaluate\r\n * @param evaluateCallback defines the callback used to filter result\r\n * @returns true if the query matches\r\n */\r\n public static Eval(query: string, evaluateCallback: (val: any) => boolean): boolean {\r\n if (!query.match(/\\([^()]*\\)/g)) {\r\n query = AndOrNotEvaluator._HandleParenthesisContent(query, evaluateCallback);\r\n } else {\r\n query = query.replace(/\\([^()]*\\)/g, (r) => {\r\n // remove parenthesis\r\n r = r.slice(1, r.length - 1);\r\n return AndOrNotEvaluator._HandleParenthesisContent(r, evaluateCallback);\r\n });\r\n }\r\n\r\n if (query === \"true\") {\r\n return true;\r\n }\r\n\r\n if (query === \"false\") {\r\n return false;\r\n }\r\n\r\n return AndOrNotEvaluator.Eval(query, evaluateCallback);\r\n }\r\n\r\n private static _HandleParenthesisContent(parenthesisContent: string, evaluateCallback: (val: string) => boolean): string {\r\n evaluateCallback =\r\n evaluateCallback ||\r\n ((r) => {\r\n return r === \"true\" ? true : false;\r\n });\r\n\r\n let result;\r\n const or = parenthesisContent.split(\"||\");\r\n\r\n for (const i in or) {\r\n if (Object.prototype.hasOwnProperty.call(or, i)) {\r\n let ori = AndOrNotEvaluator._SimplifyNegation(or[i].trim());\r\n const and = ori.split(\"&&\");\r\n\r\n if (and.length > 1) {\r\n for (let j = 0; j < and.length; ++j) {\r\n const andj = AndOrNotEvaluator._SimplifyNegation(and[j].trim());\r\n if (andj !== \"true\" && andj !== \"false\") {\r\n if (andj[0] === \"!\") {\r\n result = !evaluateCallback(andj.substring(1));\r\n } else {\r\n result = evaluateCallback(andj);\r\n }\r\n } else {\r\n result = andj === \"true\" ? true : false;\r\n }\r\n if (!result) {\r\n // no need to continue since 'false && ... && ...' will always return false\r\n ori = \"false\";\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (result || ori === \"true\") {\r\n // no need to continue since 'true || ... || ...' will always return true\r\n result = true;\r\n break;\r\n }\r\n\r\n // result equals false (or undefined)\r\n\r\n if (ori !== \"true\" && ori !== \"false\") {\r\n if (ori[0] === \"!\") {\r\n result = !evaluateCallback(ori.substring(1));\r\n } else {\r\n result = evaluateCallback(ori);\r\n }\r\n } else {\r\n result = ori === \"true\" ? true : false;\r\n }\r\n }\r\n }\r\n\r\n // the whole parenthesis scope is replaced by 'true' or 'false'\r\n return result ? \"true\" : \"false\";\r\n }\r\n\r\n private static _SimplifyNegation(booleanString: string): string {\r\n booleanString = booleanString.replace(/^[\\s!]+/, (r) => {\r\n // remove whitespaces\r\n r = r.replace(/[\\s]/g, () => \"\");\r\n return r.length % 2 ? \"!\" : \"\";\r\n });\r\n\r\n booleanString = booleanString.trim();\r\n\r\n if (booleanString === \"!true\") {\r\n booleanString = \"false\";\r\n } else if (booleanString === \"!false\") {\r\n booleanString = \"true\";\r\n }\r\n\r\n return booleanString;\r\n }\r\n}\r\n", "import { AndOrNotEvaluator } from \"./andOrNotEvaluator\";\r\n\r\n/**\r\n * Class used to store custom tags\r\n */\r\nexport class Tags {\r\n /**\r\n * Adds support for tags on the given object\r\n * @param obj defines the object to use\r\n */\r\n public static EnableFor(obj: any): void {\r\n obj._tags = obj._tags || {};\r\n\r\n obj.hasTags = () => {\r\n return Tags.HasTags(obj);\r\n };\r\n\r\n obj.addTags = (tagsString: string) => {\r\n return Tags.AddTagsTo(obj, tagsString);\r\n };\r\n\r\n obj.removeTags = (tagsString: string) => {\r\n return Tags.RemoveTagsFrom(obj, tagsString);\r\n };\r\n\r\n obj.matchesTagsQuery = (tagsQuery: string) => {\r\n return Tags.MatchesQuery(obj, tagsQuery);\r\n };\r\n }\r\n\r\n /**\r\n * Removes tags support\r\n * @param obj defines the object to use\r\n */\r\n public static DisableFor(obj: any): void {\r\n delete obj._tags;\r\n delete obj.hasTags;\r\n delete obj.addTags;\r\n delete obj.removeTags;\r\n delete obj.matchesTagsQuery;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the given object has tags\r\n * @param obj defines the object to use\r\n * @returns a boolean\r\n */\r\n public static HasTags(obj: any): boolean {\r\n if (!obj._tags) {\r\n return false;\r\n }\r\n\r\n const tags = obj._tags;\r\n for (const i in tags) {\r\n if (Object.prototype.hasOwnProperty.call(tags, i)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets the tags available on a given object\r\n * @param obj defines the object to use\r\n * @param asString defines if the tags must be returned as a string instead of an array of strings\r\n * @returns the tags\r\n */\r\n public static GetTags(obj: any, asString: boolean = true): any {\r\n if (!obj._tags) {\r\n return null;\r\n }\r\n if (asString) {\r\n const tagsArray = [];\r\n for (const tag in obj._tags) {\r\n if (Object.prototype.hasOwnProperty.call(obj._tags, tag) && obj._tags[tag] === true) {\r\n tagsArray.push(tag);\r\n }\r\n }\r\n return tagsArray.join(\" \");\r\n } else {\r\n return obj._tags;\r\n }\r\n }\r\n\r\n /**\r\n * Adds tags to an object\r\n * @param obj defines the object to use\r\n * @param tagsString defines the tag string. The tags 'true' and 'false' are reserved and cannot be used as tags.\r\n * A tag cannot start with '||', '&&', and '!'. It cannot contain whitespaces\r\n */\r\n public static AddTagsTo(obj: any, tagsString: string): void {\r\n if (!tagsString) {\r\n return;\r\n }\r\n\r\n if (typeof tagsString !== \"string\") {\r\n return;\r\n }\r\n\r\n const tags = tagsString.split(\" \");\r\n tags.forEach(function (tag) {\r\n Tags._AddTagTo(obj, tag);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _AddTagTo(obj: any, tag: string): void {\r\n tag = tag.trim();\r\n\r\n if (tag === \"\" || tag === \"true\" || tag === \"false\") {\r\n return;\r\n }\r\n\r\n if (tag.match(/[\\s]/) || tag.match(/^([!]|([|]|[&]){2})/)) {\r\n return;\r\n }\r\n\r\n Tags.EnableFor(obj);\r\n obj._tags[tag] = true;\r\n }\r\n\r\n /**\r\n * Removes specific tags from a specific object\r\n * @param obj defines the object to use\r\n * @param tagsString defines the tags to remove\r\n */\r\n public static RemoveTagsFrom(obj: any, tagsString: string) {\r\n if (!Tags.HasTags(obj)) {\r\n return;\r\n }\r\n const tags = tagsString.split(\" \");\r\n for (const t in tags) {\r\n Tags._RemoveTagFrom(obj, tags[t]);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _RemoveTagFrom(obj: any, tag: string): void {\r\n delete obj._tags[tag];\r\n }\r\n\r\n /**\r\n * Defines if tags hosted on an object match a given query\r\n * @param obj defines the object to use\r\n * @param tagsQuery defines the tag query\r\n * @returns a boolean\r\n */\r\n public static MatchesQuery(obj: any, tagsQuery: string): boolean {\r\n if (tagsQuery === undefined) {\r\n return true;\r\n }\r\n\r\n if (tagsQuery === \"\") {\r\n return Tags.HasTags(obj);\r\n }\r\n\r\n return AndOrNotEvaluator.Eval(tagsQuery, (r) => Tags.HasTags(obj) && obj._tags[r]);\r\n }\r\n}\r\n", "const warnedMap: { [key: string]: boolean } = {};\r\n/**\r\n * @internal\r\n */\r\nexport function _WarnImport(name: string, warnOnce = false) {\r\n if (warnOnce && warnedMap[name]) {\r\n return;\r\n }\r\n warnedMap[name] = true;\r\n return `${name} needs to be imported before as it contains a side-effect required by your code.`;\r\n}\r\n", "import type { FresnelParameters } from \"../Materials/fresnelParameters\";\r\nimport type { ImageProcessingConfiguration } from \"../Materials/imageProcessingConfiguration\";\r\nimport { _WarnImport } from \"./devTools\";\r\nimport type { ColorCurves } from \"../Materials/colorCurves\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport { Tags } from \"./tags\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport { Matrix, Quaternion, Vector2, Vector3 } from \"../Maths/math.vector\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { GetMergedStore } from \"./decorators.functions\";\r\n\r\n/** @internal */\r\nexport interface CopySourceOptions {\r\n /*\r\n * if a texture is used in more than one channel (e.g diffuse and opacity),\r\n * only clone it once and reuse it on the other channels. Default false\r\n */\r\n cloneTexturesOnlyOnce?: boolean;\r\n}\r\n\r\nconst _copySource = function (creationFunction: () => T, source: T, instanciate: boolean, options: CopySourceOptions = {}): T {\r\n const destination = creationFunction();\r\n\r\n // Tags\r\n if (Tags && Tags.HasTags(source)) {\r\n Tags.AddTagsTo(destination, Tags.GetTags(source, true));\r\n }\r\n\r\n const classStore = GetMergedStore(destination);\r\n\r\n // Map from source texture uniqueId to destination texture\r\n const textureMap: Record = {};\r\n\r\n // Properties\r\n for (const property in classStore) {\r\n const propertyDescriptor = classStore[property];\r\n const sourceProperty = (source)[property];\r\n const propertyType = propertyDescriptor.type;\r\n\r\n if (sourceProperty !== undefined && sourceProperty !== null && (property !== \"uniqueId\" || SerializationHelper.AllowLoadingUniqueId)) {\r\n switch (propertyType) {\r\n case 0: // Value\r\n case 6: // Mesh reference\r\n case 11: // Camera reference\r\n (destination)[property] = sourceProperty;\r\n break;\r\n case 1: // Texture\r\n if (options.cloneTexturesOnlyOnce && textureMap[sourceProperty.uniqueId]) {\r\n (destination)[property] = textureMap[sourceProperty.uniqueId];\r\n } else {\r\n (destination)[property] = instanciate || sourceProperty.isRenderTarget ? sourceProperty : sourceProperty.clone();\r\n textureMap[sourceProperty.uniqueId] = (destination)[property];\r\n }\r\n break;\r\n case 2: // Color3\r\n case 3: // FresnelParameters\r\n case 4: // Vector2\r\n case 5: // Vector3\r\n case 7: // Color Curves\r\n case 10: // Quaternion\r\n case 12: // Matrix\r\n (destination)[property] = instanciate ? sourceProperty : sourceProperty.clone();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return destination;\r\n};\r\n\r\n/**\r\n * Class used to help serialization objects\r\n */\r\nexport class SerializationHelper {\r\n /**\r\n * Gets or sets a boolean to indicate if the UniqueId property should be serialized\r\n */\r\n public static AllowLoadingUniqueId = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _ImageProcessingConfigurationParser = (sourceProperty: any): ImageProcessingConfiguration => {\r\n throw _WarnImport(\"ImageProcessingConfiguration\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _FresnelParametersParser = (sourceProperty: any): FresnelParameters => {\r\n throw _WarnImport(\"FresnelParameters\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _ColorCurvesParser = (sourceProperty: any): ColorCurves => {\r\n throw _WarnImport(\"ColorCurves\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _TextureParser = (sourceProperty: any, scene: Scene, rootUrl: string): Nullable => {\r\n throw _WarnImport(\"Texture\");\r\n };\r\n\r\n /**\r\n * Appends the serialized animations from the source animations\r\n * @param source Source containing the animations\r\n * @param destination Target to store the animations\r\n */\r\n public static AppendSerializedAnimations(source: IAnimatable, destination: any): void {\r\n if (source.animations) {\r\n destination.animations = [];\r\n for (let animationIndex = 0; animationIndex < source.animations.length; animationIndex++) {\r\n const animation = source.animations[animationIndex];\r\n\r\n destination.animations.push(animation.serialize());\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Static function used to serialized a specific entity\r\n * @param entity defines the entity to serialize\r\n * @param serializationObject defines the optional target object where serialization data will be stored\r\n * @returns a JSON compatible object representing the serialization of the entity\r\n */\r\n public static Serialize(entity: T, serializationObject?: any): any {\r\n if (!serializationObject) {\r\n serializationObject = {};\r\n }\r\n\r\n // Tags\r\n if (Tags) {\r\n serializationObject.tags = Tags.GetTags(entity);\r\n }\r\n\r\n const serializedProperties = GetMergedStore(entity);\r\n\r\n // Properties\r\n for (const property in serializedProperties) {\r\n const propertyDescriptor = serializedProperties[property];\r\n const targetPropertyName = propertyDescriptor.sourceName || property;\r\n const propertyType = propertyDescriptor.type;\r\n const sourceProperty = (entity)[property];\r\n\r\n if (sourceProperty !== undefined && sourceProperty !== null && (property !== \"uniqueId\" || SerializationHelper.AllowLoadingUniqueId)) {\r\n switch (propertyType) {\r\n case 0: // Value\r\n serializationObject[targetPropertyName] = sourceProperty;\r\n break;\r\n case 1: // Texture\r\n serializationObject[targetPropertyName] = sourceProperty.serialize();\r\n break;\r\n case 2: // Color3\r\n serializationObject[targetPropertyName] = sourceProperty.asArray();\r\n break;\r\n case 3: // FresnelParameters\r\n serializationObject[targetPropertyName] = sourceProperty.serialize();\r\n break;\r\n case 4: // Vector2\r\n serializationObject[targetPropertyName] = sourceProperty.asArray();\r\n break;\r\n case 5: // Vector3\r\n serializationObject[targetPropertyName] = sourceProperty.asArray();\r\n break;\r\n case 6: // Mesh reference\r\n serializationObject[targetPropertyName] = sourceProperty.id;\r\n break;\r\n case 7: // Color Curves\r\n serializationObject[targetPropertyName] = sourceProperty.serialize();\r\n break;\r\n case 8: // Color 4\r\n serializationObject[targetPropertyName] = (sourceProperty).asArray();\r\n break;\r\n case 9: // Image Processing\r\n serializationObject[targetPropertyName] = (sourceProperty).serialize();\r\n break;\r\n case 10: // Quaternion\r\n serializationObject[targetPropertyName] = (sourceProperty).asArray();\r\n break;\r\n case 11: // Camera reference\r\n serializationObject[targetPropertyName] = (sourceProperty).id;\r\n break;\r\n case 12: // Matrix\r\n serializationObject[targetPropertyName] = (sourceProperty).asArray();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Given a source json and a destination object in a scene, this function will parse the source and will try to apply its content to the destination object\r\n * @param source the source json data\r\n * @param destination the destination object\r\n * @param scene the scene where the object is\r\n * @param rootUrl root url to use to load assets\r\n */\r\n public static ParseProperties(source: any, destination: any, scene: Nullable, rootUrl: Nullable) {\r\n if (!rootUrl) {\r\n rootUrl = \"\";\r\n }\r\n\r\n const classStore = GetMergedStore(destination);\r\n\r\n // Properties\r\n for (const property in classStore) {\r\n const propertyDescriptor = classStore[property];\r\n const sourceProperty = source[propertyDescriptor.sourceName || property];\r\n const propertyType = propertyDescriptor.type;\r\n\r\n if (sourceProperty !== undefined && sourceProperty !== null && (property !== \"uniqueId\" || SerializationHelper.AllowLoadingUniqueId)) {\r\n const dest = destination;\r\n switch (propertyType) {\r\n case 0: // Value\r\n dest[property] = sourceProperty;\r\n break;\r\n case 1: // Texture\r\n if (scene) {\r\n dest[property] = SerializationHelper._TextureParser(sourceProperty, scene, rootUrl);\r\n }\r\n break;\r\n case 2: // Color3\r\n dest[property] = Color3.FromArray(sourceProperty);\r\n break;\r\n case 3: // FresnelParameters\r\n dest[property] = SerializationHelper._FresnelParametersParser(sourceProperty);\r\n break;\r\n case 4: // Vector2\r\n dest[property] = Vector2.FromArray(sourceProperty);\r\n break;\r\n case 5: // Vector3\r\n dest[property] = Vector3.FromArray(sourceProperty);\r\n break;\r\n case 6: // Mesh reference\r\n if (scene) {\r\n dest[property] = scene.getLastMeshById(sourceProperty);\r\n }\r\n break;\r\n case 7: // Color Curves\r\n dest[property] = SerializationHelper._ColorCurvesParser(sourceProperty);\r\n break;\r\n case 8: // Color 4\r\n dest[property] = Color4.FromArray(sourceProperty);\r\n break;\r\n case 9: // Image Processing\r\n dest[property] = SerializationHelper._ImageProcessingConfigurationParser(sourceProperty);\r\n break;\r\n case 10: // Quaternion\r\n dest[property] = Quaternion.FromArray(sourceProperty);\r\n break;\r\n case 11: // Camera reference\r\n if (scene) {\r\n dest[property] = scene.getCameraById(sourceProperty);\r\n }\r\n break;\r\n case 12: // Matrix\r\n dest[property] = Matrix.FromArray(sourceProperty);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new entity from a serialization data object\r\n * @param creationFunction defines a function used to instanciated the new entity\r\n * @param source defines the source serialization data\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root url for resources\r\n * @returns a new entity\r\n */\r\n public static Parse(creationFunction: () => T, source: any, scene: Nullable, rootUrl: Nullable = null): T {\r\n const destination = creationFunction();\r\n\r\n // Tags\r\n if (Tags) {\r\n Tags.AddTagsTo(destination, source.tags);\r\n }\r\n\r\n SerializationHelper.ParseProperties(source, destination, scene, rootUrl);\r\n\r\n return destination;\r\n }\r\n\r\n /**\r\n * Clones an object\r\n * @param creationFunction defines the function used to instanciate the new object\r\n * @param source defines the source object\r\n * @param options defines the options to use\r\n * @returns the cloned object\r\n */\r\n public static Clone(creationFunction: () => T, source: T, options: CopySourceOptions = {}): T {\r\n return _copySource(creationFunction, source, false, options);\r\n }\r\n\r\n /**\r\n * Instanciates a new object based on a source one (some data will be shared between both object)\r\n * @param creationFunction defines the function used to instanciate the new object\r\n * @param source defines the source object\r\n * @returns the new object\r\n */\r\n public static Instanciate(creationFunction: () => T, source: T): T {\r\n return _copySource(creationFunction, source, true);\r\n }\r\n}\r\n", "\n/******************************************************************************\nCopyright (c) Microsoft Corporation.\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Scene } from \"./scene\";\r\nimport type { Nullable } from \"./types\";\r\nimport { Matrix, Vector3 } from \"./Maths/math.vector\";\r\nimport type { Engine } from \"./Engines/engine\";\r\nimport type { IBehaviorAware, Behavior } from \"./Behaviors/behavior\";\r\nimport { serialize } from \"./Misc/decorators\";\r\nimport type { Observer } from \"./Misc/observable\";\r\nimport { Observable } from \"./Misc/observable\";\r\nimport { EngineStore } from \"./Engines/engineStore\";\r\nimport { _WarnImport } from \"./Misc/devTools\";\r\nimport type { AbstractActionManager } from \"./Actions/abstractActionManager\";\r\nimport type { IInspectable } from \"./Misc/iInspectable\";\r\nimport type { AbstractScene } from \"./abstractScene\";\r\nimport type { IAccessibilityTag } from \"./IAccessibilityTag\";\r\nimport type { AnimationRange } from \"./Animations/animationRange\";\r\nimport type { AnimationPropertiesOverride } from \"./Animations/animationPropertiesOverride\";\r\nimport type { AbstractMesh } from \"./Meshes/abstractMesh\";\r\nimport type { Animation } from \"./Animations/animation\";\r\nimport type { Animatable } from \"./Animations/animatable\";\r\nimport { SerializationHelper } from \"./Misc/decorators.serialization\";\r\n\r\n/**\r\n * Defines how a node can be built from a string name.\r\n */\r\nexport type NodeConstructor = (name: string, scene: Scene, options?: any) => () => Node;\r\n\r\n/** @internal */\r\nclass _InternalNodeDataInfo {\r\n public _doNotSerialize = false;\r\n public _isDisposed = false;\r\n public _sceneRootNodesIndex = -1;\r\n public _isEnabled = true;\r\n public _isParentEnabled = true;\r\n public _isReady = true;\r\n public _onEnabledStateChangedObservable = new Observable();\r\n public _onClonedObservable = new Observable();\r\n}\r\n\r\n/**\r\n * Node is the basic class for all scene objects (Mesh, Light, Camera.)\r\n */\r\nexport class Node implements IBehaviorAware {\r\n protected _isDirty = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _AnimationRangeFactory = (_name: string, _from: number, _to: number): AnimationRange => {\r\n throw _WarnImport(\"AnimationRange\");\r\n };\r\n\r\n private static _NodeConstructors: { [key: string]: any } = {};\r\n\r\n /**\r\n * Add a new node constructor\r\n * @param type defines the type name of the node to construct\r\n * @param constructorFunc defines the constructor function\r\n */\r\n public static AddNodeConstructor(type: string, constructorFunc: NodeConstructor) {\r\n this._NodeConstructors[type] = constructorFunc;\r\n }\r\n\r\n /**\r\n * Returns a node constructor based on type name\r\n * @param type defines the type name\r\n * @param name defines the new node name\r\n * @param scene defines the hosting scene\r\n * @param options defines optional options to transmit to constructors\r\n * @returns the new constructor or null\r\n */\r\n public static Construct(type: string, name: string, scene: Scene, options?: any): Nullable<() => Node> {\r\n const constructorFunc = this._NodeConstructors[type];\r\n\r\n if (!constructorFunc) {\r\n return null;\r\n }\r\n\r\n return constructorFunc(name, scene, options);\r\n }\r\n\r\n private _nodeDataStorage = new _InternalNodeDataInfo();\r\n\r\n /**\r\n * Gets or sets the name of the node\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Gets or sets the id of the node\r\n */\r\n @serialize()\r\n public id: string;\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n @serialize()\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets or sets a string used to store user defined state for the node\r\n */\r\n @serialize()\r\n public state = \"\";\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the node\r\n */\r\n @serialize()\r\n public metadata: any = null;\r\n\r\n /** @internal */\r\n public _internalMetadata: any;\r\n\r\n /**\r\n * For internal use only. Please do not use.\r\n */\r\n public reservedDataStore: any = null;\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility\r\n */\r\n public inspectableCustomProperties: IInspectable[];\r\n\r\n /**\r\n * Gets or sets the accessibility tag to describe the node for accessibility purpose.\r\n */\r\n public set accessibilityTag(value: Nullable) {\r\n this._accessibilityTag = value;\r\n this.onAccessibilityTagChangedObservable.notifyObservers(value);\r\n }\r\n\r\n public get accessibilityTag() {\r\n return this._accessibilityTag;\r\n }\r\n\r\n protected _accessibilityTag: Nullable = null;\r\n\r\n /**\r\n * Observable fired when an accessibility tag is changed\r\n */\r\n public onAccessibilityTagChangedObservable = new Observable>();\r\n\r\n /**\r\n * Gets or sets a boolean used to define if the node must be serialized\r\n */\r\n public get doNotSerialize() {\r\n if (this._nodeDataStorage._doNotSerialize) {\r\n return true;\r\n }\r\n\r\n if (this._parentNode) {\r\n return this._parentNode.doNotSerialize;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public set doNotSerialize(value: boolean) {\r\n this._nodeDataStorage._doNotSerialize = value;\r\n }\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable = null;\r\n\r\n /**\r\n * Gets a list of Animations associated with the node\r\n */\r\n public animations: Animation[] = [];\r\n protected _ranges: { [name: string]: Nullable } = {};\r\n\r\n /**\r\n * Callback raised when the node is ready to be used\r\n */\r\n public onReady: Nullable<(node: Node) => void> = null;\r\n\r\n /** @internal */\r\n public _currentRenderId = -1;\r\n private _parentUpdateId = -1;\r\n /** @internal */\r\n public _childUpdateId = -1;\r\n\r\n /** @internal */\r\n public _waitingParentId: Nullable = null;\r\n /** @internal */\r\n public _waitingParentInstanceIndex: Nullable = null;\r\n /** @internal */\r\n public _waitingParsedUniqueId: Nullable = null;\r\n /** @internal */\r\n public _scene: Scene;\r\n /** @internal */\r\n public _cache: any = {};\r\n\r\n protected _parentNode: Nullable = null;\r\n\r\n /** @internal */\r\n protected _children: Nullable = null;\r\n\r\n /** @internal */\r\n public _worldMatrix = Matrix.Identity();\r\n /** @internal */\r\n public _worldMatrixDeterminant = 0;\r\n /** @internal */\r\n public _worldMatrixDeterminantIsDirty = true;\r\n\r\n /**\r\n * Gets a boolean indicating if the node has been disposed\r\n * @returns true if the node was disposed\r\n */\r\n public isDisposed(): boolean {\r\n return this._nodeDataStorage._isDisposed;\r\n }\r\n\r\n /**\r\n * Gets or sets the parent of the node (without keeping the current position in the scene)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/parent\r\n */\r\n public set parent(parent: Nullable) {\r\n if (this._parentNode === parent) {\r\n return;\r\n }\r\n\r\n const previousParentNode = this._parentNode;\r\n\r\n // Remove self from list of children of parent\r\n if (this._parentNode && this._parentNode._children !== undefined && this._parentNode._children !== null) {\r\n const index = this._parentNode._children.indexOf(this);\r\n if (index !== -1) {\r\n this._parentNode._children.splice(index, 1);\r\n }\r\n\r\n if (!parent && !this._nodeDataStorage._isDisposed) {\r\n this._addToSceneRootNodes();\r\n }\r\n }\r\n\r\n // Store new parent\r\n this._parentNode = parent;\r\n this._isDirty = true;\r\n\r\n // Add as child to new parent\r\n if (this._parentNode) {\r\n if (this._parentNode._children === undefined || this._parentNode._children === null) {\r\n this._parentNode._children = new Array();\r\n }\r\n this._parentNode._children.push(this);\r\n\r\n if (!previousParentNode) {\r\n this._removeFromSceneRootNodes();\r\n }\r\n }\r\n\r\n // Enabled state\r\n this._syncParentEnabledState();\r\n }\r\n\r\n public get parent(): Nullable {\r\n return this._parentNode;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _serializeAsParent(serializationObject: any): void {\r\n serializationObject.parentId = this.uniqueId;\r\n }\r\n\r\n /** @internal */\r\n public _addToSceneRootNodes() {\r\n if (this._nodeDataStorage._sceneRootNodesIndex === -1) {\r\n this._nodeDataStorage._sceneRootNodesIndex = this._scene.rootNodes.length;\r\n this._scene.rootNodes.push(this);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _removeFromSceneRootNodes() {\r\n if (this._nodeDataStorage._sceneRootNodesIndex !== -1) {\r\n const rootNodes = this._scene.rootNodes;\r\n const lastIdx = rootNodes.length - 1;\r\n rootNodes[this._nodeDataStorage._sceneRootNodesIndex] = rootNodes[lastIdx];\r\n rootNodes[this._nodeDataStorage._sceneRootNodesIndex]._nodeDataStorage._sceneRootNodesIndex = this._nodeDataStorage._sceneRootNodesIndex;\r\n this._scene.rootNodes.pop();\r\n this._nodeDataStorage._sceneRootNodesIndex = -1;\r\n }\r\n }\r\n\r\n private _animationPropertiesOverride: Nullable = null;\r\n\r\n /**\r\n * Gets or sets the animation properties override\r\n */\r\n public get animationPropertiesOverride(): Nullable {\r\n if (!this._animationPropertiesOverride) {\r\n return this._scene.animationPropertiesOverride;\r\n }\r\n return this._animationPropertiesOverride;\r\n }\r\n\r\n public set animationPropertiesOverride(value: Nullable) {\r\n this._animationPropertiesOverride = value;\r\n }\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"Node\" string\r\n */\r\n public getClassName(): string {\r\n return \"Node\";\r\n }\r\n\r\n /** @internal */\r\n public readonly _isNode = true;\r\n\r\n /**\r\n * An event triggered when the mesh is disposed\r\n */\r\n public onDisposeObservable = new Observable();\r\n\r\n private _onDisposeObserver: Nullable> = null;\r\n /**\r\n * Sets a callback that will be raised when the node will be disposed\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the enabled state of the node changes\r\n */\r\n public get onEnabledStateChangedObservable(): Observable {\r\n return this._nodeDataStorage._onEnabledStateChangedObservable;\r\n }\r\n\r\n /**\r\n * An event triggered when the node is cloned\r\n */\r\n public get onClonedObservable(): Observable {\r\n return this._nodeDataStorage._onClonedObservable;\r\n }\r\n\r\n /**\r\n * Creates a new Node\r\n * @param name the name and id to be given to this node\r\n * @param scene the scene this node will be added to\r\n */\r\n constructor(name: string, scene: Nullable = null) {\r\n this.name = name;\r\n this.id = name;\r\n this._scene = (scene || EngineStore.LastCreatedScene);\r\n this.uniqueId = this._scene.getUniqueId();\r\n this._initCache();\r\n }\r\n\r\n /**\r\n * Gets the scene of the node\r\n * @returns a scene\r\n */\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Gets the engine of the node\r\n * @returns a Engine\r\n */\r\n public getEngine(): Engine {\r\n return this._scene.getEngine();\r\n }\r\n\r\n // Behaviors\r\n private _behaviors = new Array>();\r\n\r\n /**\r\n * Attach a behavior to the node\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\r\n * @param behavior defines the behavior to attach\r\n * @param attachImmediately defines that the behavior must be attached even if the scene is still loading\r\n * @returns the current Node\r\n */\r\n public addBehavior(behavior: Behavior, attachImmediately = false): Node {\r\n const index = this._behaviors.indexOf(behavior);\r\n\r\n if (index !== -1) {\r\n return this;\r\n }\r\n\r\n behavior.init();\r\n if (this._scene.isLoading && !attachImmediately) {\r\n // We defer the attach when the scene will be loaded\r\n this._scene.onDataLoadedObservable.addOnce(() => {\r\n behavior.attach(this);\r\n });\r\n } else {\r\n behavior.attach(this);\r\n }\r\n this._behaviors.push(behavior);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove an attached behavior\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\r\n * @param behavior defines the behavior to attach\r\n * @returns the current Node\r\n */\r\n public removeBehavior(behavior: Behavior): Node {\r\n const index = this._behaviors.indexOf(behavior);\r\n\r\n if (index === -1) {\r\n return this;\r\n }\r\n\r\n this._behaviors[index].detach();\r\n this._behaviors.splice(index, 1);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the list of attached behaviors\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\r\n */\r\n public get behaviors(): Behavior[] {\r\n return this._behaviors;\r\n }\r\n\r\n /**\r\n * Gets an attached behavior by name\r\n * @param name defines the name of the behavior to look for\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\r\n * @returns null if behavior was not found else the requested behavior\r\n */\r\n public getBehaviorByName(name: string): Nullable> {\r\n for (const behavior of this._behaviors) {\r\n if (behavior.name === name) {\r\n return behavior;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the latest update of the World matrix\r\n * @returns a Matrix\r\n */\r\n public getWorldMatrix(): Matrix {\r\n if (this._currentRenderId !== this._scene.getRenderId()) {\r\n this.computeWorldMatrix();\r\n }\r\n return this._worldMatrix;\r\n }\r\n\r\n /** @internal */\r\n public _getWorldMatrixDeterminant(): number {\r\n if (this._worldMatrixDeterminantIsDirty) {\r\n this._worldMatrixDeterminantIsDirty = false;\r\n this._worldMatrixDeterminant = this._worldMatrix.determinant();\r\n }\r\n return this._worldMatrixDeterminant;\r\n }\r\n\r\n /**\r\n * Returns directly the latest state of the mesh World matrix.\r\n * A Matrix is returned.\r\n */\r\n public get worldMatrixFromCache(): Matrix {\r\n return this._worldMatrix;\r\n }\r\n\r\n // override it in derived class if you add new variables to the cache\r\n // and call the parent class method\r\n /** @internal */\r\n public _initCache() {\r\n this._cache = {};\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public updateCache(force?: boolean): void {\r\n if (!force && this.isSynchronized()) {\r\n return;\r\n }\r\n\r\n this._updateCache();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getActionManagerForTrigger(trigger?: number, _initialCall = true): Nullable {\r\n if (!this.parent) {\r\n return null;\r\n }\r\n\r\n return this.parent._getActionManagerForTrigger(trigger, false);\r\n }\r\n\r\n // override it in derived class if you add new variables to the cache\r\n // and call the parent class method if !ignoreParentClass\r\n /**\r\n * @internal\r\n */\r\n public _updateCache(_ignoreParentClass?: boolean): void {}\r\n\r\n // override it in derived class if you add new variables to the cache\r\n /** @internal */\r\n public _isSynchronized(): boolean {\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _markSyncedWithParent() {\r\n if (this._parentNode) {\r\n this._parentUpdateId = this._parentNode._childUpdateId;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public isSynchronizedWithParent(): boolean {\r\n if (!this._parentNode) {\r\n return true;\r\n }\r\n\r\n if (this._parentNode._isDirty || this._parentUpdateId !== this._parentNode._childUpdateId) {\r\n return false;\r\n }\r\n\r\n return this._parentNode.isSynchronized();\r\n }\r\n\r\n /** @internal */\r\n public isSynchronized(): boolean {\r\n if (this._parentNode && !this.isSynchronizedWithParent()) {\r\n return false;\r\n }\r\n\r\n return this._isSynchronized();\r\n }\r\n\r\n /**\r\n * Is this node ready to be used/rendered\r\n * @param _completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\r\n * @returns true if the node is ready\r\n */\r\n public isReady(_completeCheck = false): boolean {\r\n return this._nodeDataStorage._isReady;\r\n }\r\n\r\n /**\r\n * Flag the node as dirty (Forcing it to update everything)\r\n * @param _property helps children apply precise \"dirtyfication\"\r\n * @returns this node\r\n */\r\n public markAsDirty(_property?: string): Node {\r\n this._currentRenderId = Number.MAX_VALUE;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Is this node enabled?\r\n * If the node has a parent, all ancestors will be checked and false will be returned if any are false (not enabled), otherwise will return true\r\n * @param checkAncestors indicates if this method should check the ancestors. The default is to check the ancestors. If set to false, the method will return the value of this node without checking ancestors\r\n * @returns whether this node (and its parent) is enabled\r\n */\r\n public isEnabled(checkAncestors: boolean = true): boolean {\r\n if (checkAncestors === false) {\r\n return this._nodeDataStorage._isEnabled;\r\n }\r\n\r\n if (!this._nodeDataStorage._isEnabled) {\r\n return false;\r\n }\r\n\r\n return this._nodeDataStorage._isParentEnabled;\r\n }\r\n\r\n /** @internal */\r\n protected _syncParentEnabledState() {\r\n this._nodeDataStorage._isParentEnabled = this._parentNode ? this._parentNode.isEnabled() : true;\r\n\r\n if (this._children) {\r\n this._children.forEach((c) => {\r\n c._syncParentEnabledState(); // Force children to update accordingly\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Set the enabled state of this node\r\n * @param value defines the new enabled state\r\n */\r\n public setEnabled(value: boolean): void {\r\n if (this._nodeDataStorage._isEnabled === value) {\r\n return;\r\n }\r\n this._nodeDataStorage._isEnabled = value;\r\n this._syncParentEnabledState();\r\n this._nodeDataStorage._onEnabledStateChangedObservable.notifyObservers(value);\r\n }\r\n\r\n /**\r\n * Is this node a descendant of the given node?\r\n * The function will iterate up the hierarchy until the ancestor was found or no more parents defined\r\n * @param ancestor defines the parent node to inspect\r\n * @returns a boolean indicating if this node is a descendant of the given node\r\n */\r\n public isDescendantOf(ancestor: Node): boolean {\r\n if (this.parent) {\r\n if (this.parent === ancestor) {\r\n return true;\r\n }\r\n\r\n return this.parent.isDescendantOf(ancestor);\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getDescendants(results: Node[], directDescendantsOnly: boolean = false, predicate?: (node: Node) => boolean): void {\r\n if (!this._children) {\r\n return;\r\n }\r\n\r\n for (let index = 0; index < this._children.length; index++) {\r\n const item = this._children[index];\r\n\r\n if (!predicate || predicate(item)) {\r\n results.push(item);\r\n }\r\n\r\n if (!directDescendantsOnly) {\r\n item._getDescendants(results, false, predicate);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Will return all nodes that have this node as ascendant\r\n * @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\r\n * @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\r\n * @returns all children nodes of all types\r\n */\r\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (node: Node) => node is T): T[];\r\n\r\n /**\r\n * Will return all nodes that have this node as ascendant\r\n * @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\r\n * @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\r\n * @returns all children nodes of all types\r\n */\r\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): Node[];\r\n\r\n /**\r\n * Will return all nodes that have this node as ascendant\r\n * @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\r\n * @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\r\n * @returns all children nodes of all types\r\n */\r\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): Node[] {\r\n const results: Node[] = [];\r\n\r\n this._getDescendants(results, directDescendantsOnly, predicate);\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Get all child-meshes of this node\r\n * @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 (Default: false)\r\n * @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\r\n * @returns an array of AbstractMesh\r\n */\r\n public getChildMeshes(directDescendantsOnly?: boolean, predicate?: (node: Node) => node is T): T[];\r\n\r\n /**\r\n * Get all child-meshes of this node\r\n * @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 (Default: false)\r\n * @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\r\n * @returns an array of AbstractMesh\r\n */\r\n public getChildMeshes(directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): AbstractMesh[];\r\n\r\n /**\r\n * Get all child-meshes of this node\r\n * @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 (Default: false)\r\n * @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\r\n * @returns an array of AbstractMesh\r\n */\r\n public getChildMeshes(directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): AbstractMesh[] {\r\n const results: Array = [];\r\n this._getDescendants(results, directDescendantsOnly, (node: Node) => {\r\n return (!predicate || predicate(node)) && (node).cullingStrategy !== undefined;\r\n });\r\n return results;\r\n }\r\n\r\n /**\r\n * Get all direct children of this node\r\n * @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\r\n * @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 (Default: true)\r\n * @returns an array of Node\r\n */\r\n public getChildren(predicate?: (node: Node) => node is T, directDescendantsOnly?: boolean): T[];\r\n\r\n /**\r\n * Get all direct children of this node\r\n * @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\r\n * @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 (Default: true)\r\n * @returns an array of Node\r\n */\r\n public getChildren(predicate?: (node: Node) => boolean, directDescendantsOnly?: boolean): Node[];\r\n\r\n /**\r\n * Get all direct children of this node\r\n * @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\r\n * @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 (Default: true)\r\n * @returns an array of Node\r\n */\r\n public getChildren(predicate?: (node: Node) => boolean, directDescendantsOnly = true): Node[] {\r\n return this.getDescendants(directDescendantsOnly, predicate);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setReady(state: boolean): void {\r\n if (state === this._nodeDataStorage._isReady) {\r\n return;\r\n }\r\n\r\n if (!state) {\r\n this._nodeDataStorage._isReady = false;\r\n return;\r\n }\r\n\r\n if (this.onReady) {\r\n this.onReady(this);\r\n }\r\n this._nodeDataStorage._isReady = true;\r\n }\r\n\r\n /**\r\n * Get an animation by name\r\n * @param name defines the name of the animation to look for\r\n * @returns null if not found else the requested animation\r\n */\r\n public getAnimationByName(name: string): Nullable {\r\n for (let i = 0; i < this.animations.length; i++) {\r\n const animation = this.animations[i];\r\n\r\n if (animation.name === name) {\r\n return animation;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Creates an animation range for this node\r\n * @param name defines the name of the range\r\n * @param from defines the starting key\r\n * @param to defines the end key\r\n */\r\n public createAnimationRange(name: string, from: number, to: number): void {\r\n // check name not already in use\r\n if (!this._ranges[name]) {\r\n this._ranges[name] = Node._AnimationRangeFactory(name, from, to);\r\n for (let i = 0, nAnimations = this.animations.length; i < nAnimations; i++) {\r\n if (this.animations[i]) {\r\n this.animations[i].createRange(name, from, to);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Delete a specific animation range\r\n * @param name defines the name of the range to delete\r\n * @param deleteFrames defines if animation frames from the range must be deleted as well\r\n */\r\n public deleteAnimationRange(name: string, deleteFrames = true): void {\r\n for (let i = 0, nAnimations = this.animations.length; i < nAnimations; i++) {\r\n if (this.animations[i]) {\r\n this.animations[i].deleteRange(name, deleteFrames);\r\n }\r\n }\r\n this._ranges[name] = null; // said much faster than 'delete this._range[name]'\r\n }\r\n\r\n /**\r\n * Get an animation range by name\r\n * @param name defines the name of the animation range to look for\r\n * @returns null if not found else the requested animation range\r\n */\r\n public getAnimationRange(name: string): Nullable {\r\n return this._ranges[name] || null;\r\n }\r\n\r\n /**\r\n * Clone the current node\r\n * @param name Name of the new clone\r\n * @param newParent New parent for the clone\r\n * @param doNotCloneChildren Do not clone children hierarchy\r\n * @returns the new transform node\r\n */\r\n public clone(name: string, newParent: Nullable, doNotCloneChildren?: boolean): Nullable {\r\n const result = SerializationHelper.Clone(() => new Node(name, this.getScene()), this);\r\n\r\n if (newParent) {\r\n result.parent = newParent;\r\n }\r\n\r\n if (!doNotCloneChildren) {\r\n // Children\r\n const directDescendants = this.getDescendants(true);\r\n for (let index = 0; index < directDescendants.length; index++) {\r\n const child = directDescendants[index];\r\n\r\n child.clone(name + \".\" + child.name, result);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the list of all animation ranges defined on this node\r\n * @returns an array\r\n */\r\n public getAnimationRanges(): Nullable[] {\r\n const animationRanges: Nullable[] = [];\r\n let name: string;\r\n for (name in this._ranges) {\r\n animationRanges.push(this._ranges[name]);\r\n }\r\n return animationRanges;\r\n }\r\n\r\n /**\r\n * Will start the animation sequence\r\n * @param name defines the range frames for animation sequence\r\n * @param loop defines if the animation should loop (false by default)\r\n * @param speedRatio defines the speed factor in which to run the animation (1 by default)\r\n * @param onAnimationEnd defines a function to be executed when the animation ended (undefined by default)\r\n * @returns the object created for this animation. If range does not exist, it will return null\r\n */\r\n public beginAnimation(name: string, loop?: boolean, speedRatio?: number, onAnimationEnd?: () => void): Nullable {\r\n const range = this.getAnimationRange(name);\r\n\r\n if (!range) {\r\n return null;\r\n }\r\n\r\n return this._scene.beginAnimation(this, range.from, range.to, loop, speedRatio, onAnimationEnd);\r\n }\r\n\r\n /**\r\n * Serialize animation ranges into a JSON compatible object\r\n * @returns serialization object\r\n */\r\n public serializeAnimationRanges(): any {\r\n const serializationRanges = [];\r\n for (const name in this._ranges) {\r\n const localRange = this._ranges[name];\r\n if (!localRange) {\r\n continue;\r\n }\r\n const range: any = {};\r\n range.name = name;\r\n range.from = localRange.from;\r\n range.to = localRange.to;\r\n serializationRanges.push(range);\r\n }\r\n return serializationRanges;\r\n }\r\n\r\n /**\r\n * Computes the world matrix of the node\r\n * @param _force defines if the cache version should be invalidated forcing the world matrix to be created from scratch\r\n * @returns the world matrix\r\n */\r\n public computeWorldMatrix(_force?: boolean): Matrix {\r\n if (!this._worldMatrix) {\r\n this._worldMatrix = Matrix.Identity();\r\n }\r\n return this._worldMatrix;\r\n }\r\n\r\n /**\r\n * Releases resources associated with this node.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n this._nodeDataStorage._isDisposed = true;\r\n\r\n if (!doNotRecurse) {\r\n const nodes = this.getDescendants(true);\r\n for (const node of nodes) {\r\n node.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n }\r\n\r\n if (!this.parent) {\r\n this._removeFromSceneRootNodes();\r\n } else {\r\n this.parent = null;\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n\r\n this.onEnabledStateChangedObservable.clear();\r\n this.onClonedObservable.clear();\r\n\r\n // Behaviors\r\n for (const behavior of this._behaviors) {\r\n behavior.detach();\r\n }\r\n\r\n this._behaviors.length = 0;\r\n\r\n this.metadata = null;\r\n }\r\n\r\n /**\r\n * Parse animation range data from a serialization object and store them into a given node\r\n * @param node defines where to store the animation ranges\r\n * @param parsedNode defines the serialization object to read data from\r\n * @param _scene defines the hosting scene\r\n */\r\n public static ParseAnimationRanges(node: Node, parsedNode: any, _scene: Scene): void {\r\n if (parsedNode.ranges) {\r\n for (let index = 0; index < parsedNode.ranges.length; index++) {\r\n const data = parsedNode.ranges[index];\r\n node.createAnimationRange(data.name, data.from, data.to);\r\n }\r\n }\r\n }\r\n /**\r\n * Return the minimum and maximum world vectors of the entire hierarchy under current node\r\n * @param includeDescendants Include bounding info from descendants as well (true by default)\r\n * @param predicate defines a callback function that can be customize to filter what meshes should be included in the list used to compute the bounding vectors\r\n * @returns the new bounding vectors\r\n */\r\n public getHierarchyBoundingVectors(includeDescendants = true, predicate: Nullable<(abstractMesh: AbstractMesh) => boolean> = null): { min: Vector3; max: Vector3 } {\r\n // Ensures that all world matrix will be recomputed.\r\n this.getScene().incrementRenderId();\r\n\r\n this.computeWorldMatrix(true);\r\n\r\n let min: Vector3;\r\n let max: Vector3;\r\n\r\n const thisAbstractMesh = this as Node as AbstractMesh;\r\n if (thisAbstractMesh.getBoundingInfo && thisAbstractMesh.subMeshes) {\r\n // If this is an abstract mesh get its bounding info\r\n const boundingInfo = thisAbstractMesh.getBoundingInfo();\r\n min = boundingInfo.boundingBox.minimumWorld.clone();\r\n max = boundingInfo.boundingBox.maximumWorld.clone();\r\n } else {\r\n min = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n max = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n }\r\n\r\n if (includeDescendants) {\r\n const descendants = this.getDescendants(false);\r\n\r\n for (const descendant of descendants) {\r\n const childMesh = descendant;\r\n childMesh.computeWorldMatrix(true);\r\n\r\n // Filters meshes based on custom predicate function.\r\n if (predicate && !predicate(childMesh)) {\r\n continue;\r\n }\r\n\r\n //make sure we have the needed params to get mix and max\r\n if (!childMesh.getBoundingInfo || childMesh.getTotalVertices() === 0) {\r\n continue;\r\n }\r\n\r\n const childBoundingInfo = childMesh.getBoundingInfo();\r\n const boundingBox = childBoundingInfo.boundingBox;\r\n\r\n const minBox = boundingBox.minimumWorld;\r\n const maxBox = boundingBox.maximumWorld;\r\n\r\n Vector3.CheckExtends(minBox, min, max);\r\n Vector3.CheckExtends(maxBox, min, max);\r\n }\r\n }\r\n\r\n return {\r\n min: min,\r\n max: max,\r\n };\r\n }\r\n}\r\n", "/**\r\n * Interface for the size containing width and height\r\n */\r\nexport interface ISize {\r\n /**\r\n * Width\r\n */\r\n width: number;\r\n /**\r\n * Height\r\n */\r\n height: number;\r\n}\r\n\r\n/**\r\n * Size containing width and height\r\n */\r\nexport class Size implements ISize {\r\n /**\r\n * Width\r\n */\r\n public width: number;\r\n /**\r\n * Height\r\n */\r\n public height: number;\r\n\r\n /**\r\n * Creates a Size object from the given width and height (floats).\r\n * @param width width of the new size\r\n * @param height height of the new size\r\n */\r\n public constructor(width: number, height: number) {\r\n this.width = width;\r\n this.height = height;\r\n }\r\n\r\n /**\r\n * Returns a string with the Size width and height\r\n * @returns a string with the Size width and height\r\n */\r\n public toString(): string {\r\n return `{W: ${this.width}, H: ${this.height}}`;\r\n }\r\n /**\r\n * \"Size\"\r\n * @returns the string \"Size\"\r\n */\r\n public getClassName(): string {\r\n return \"Size\";\r\n }\r\n /**\r\n * Returns the Size hash code.\r\n * @returns a hash code for a unique width and height\r\n */\r\n public getHashCode(): number {\r\n let hash = this.width | 0;\r\n hash = (hash * 397) ^ (this.height | 0);\r\n return hash;\r\n }\r\n /**\r\n * Updates the current size from the given one.\r\n * @param src the given size\r\n */\r\n public copyFrom(src: Size) {\r\n this.width = src.width;\r\n this.height = src.height;\r\n }\r\n /**\r\n * Updates in place the current Size from the given floats.\r\n * @param width width of the new size\r\n * @param height height of the new size\r\n * @returns the updated Size.\r\n */\r\n public copyFromFloats(width: number, height: number): Size {\r\n this.width = width;\r\n this.height = height;\r\n return this;\r\n }\r\n /**\r\n * Updates in place the current Size from the given floats.\r\n * @param width width to set\r\n * @param height height to set\r\n * @returns the updated Size.\r\n */\r\n public set(width: number, height: number): Size {\r\n return this.copyFromFloats(width, height);\r\n }\r\n /**\r\n * Multiplies the width and height by numbers\r\n * @param w factor to multiple the width by\r\n * @param h factor to multiple the height by\r\n * @returns a new Size set with the multiplication result of the current Size and the given floats.\r\n */\r\n public multiplyByFloats(w: number, h: number): Size {\r\n return new Size(this.width * w, this.height * h);\r\n }\r\n /**\r\n * Clones the size\r\n * @returns a new Size copied from the given one.\r\n */\r\n public clone(): Size {\r\n return new Size(this.width, this.height);\r\n }\r\n /**\r\n * True if the current Size and the given one width and height are strictly equal.\r\n * @param other the other size to compare against\r\n * @returns True if the current Size and the given one width and height are strictly equal.\r\n */\r\n public equals(other: Size): boolean {\r\n if (!other) {\r\n return false;\r\n }\r\n return this.width === other.width && this.height === other.height;\r\n }\r\n /**\r\n * The surface of the Size : width * height (float).\r\n */\r\n public get surface(): number {\r\n return this.width * this.height;\r\n }\r\n /**\r\n * Create a new size of zero\r\n * @returns a new Size set to (0.0, 0.0)\r\n */\r\n public static Zero(): Size {\r\n return new Size(0.0, 0.0);\r\n }\r\n /**\r\n * Sums the width and height of two sizes\r\n * @param otherSize size to add to this size\r\n * @returns a new Size set as the addition result of the current Size and the given one.\r\n */\r\n public add(otherSize: Size): Size {\r\n const r = new Size(this.width + otherSize.width, this.height + otherSize.height);\r\n return r;\r\n }\r\n /**\r\n * Subtracts the width and height of two\r\n * @param otherSize size to subtract to this size\r\n * @returns a new Size set as the subtraction result of the given one from the current Size.\r\n */\r\n public subtract(otherSize: Size): Size {\r\n const r = new Size(this.width - otherSize.width, this.height - otherSize.height);\r\n return r;\r\n }\r\n /**\r\n * Scales the width and height\r\n * @param scale the scale to multiply the width and height by\r\n * @returns a new Size set with the multiplication result of the current Size and the given floats.\r\n */\r\n public scale(scale: number): Size {\r\n return new Size(this.width * scale, this.height * scale);\r\n }\r\n /**\r\n * Creates a new Size set at the linear interpolation \"amount\" between \"start\" and \"end\"\r\n * @param start starting size to lerp between\r\n * @param end end size to lerp between\r\n * @param amount amount to lerp between the start and end values\r\n * @returns a new Size set at the linear interpolation \"amount\" between \"start\" and \"end\"\r\n */\r\n public static Lerp(start: Size, end: Size, amount: number): Size {\r\n const w = start.width + (end.width - start.width) * amount;\r\n const h = start.height + (end.height - start.height) * amount;\r\n\r\n return new Size(w, h);\r\n }\r\n}\r\n", "import type { IWebRequest } from \"./interfaces/iWebRequest\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { INative } from \"../Engines/Native/nativeInterfaces\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare const _native: INative;\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nfunction createXMLHttpRequest(): XMLHttpRequest {\r\n // If running in Babylon Native, then defer to the native XMLHttpRequest, which has the same public contract\r\n if (typeof _native !== \"undefined\" && _native.XMLHttpRequest) {\r\n return new _native.XMLHttpRequest();\r\n } else {\r\n return new XMLHttpRequest();\r\n }\r\n}\r\n\r\n/**\r\n * Extended version of XMLHttpRequest with support for customizations (headers, ...)\r\n */\r\nexport class WebRequest implements IWebRequest {\r\n private readonly _xhr = createXMLHttpRequest();\r\n\r\n /**\r\n * Custom HTTP Request Headers to be sent with XMLHttpRequests\r\n * i.e. when loading files, where the server/service expects an Authorization header\r\n */\r\n public static CustomRequestHeaders: { [key: string]: string } = {};\r\n\r\n /**\r\n * Add callback functions in this array to update all the requests before they get sent to the network\r\n */\r\n public static CustomRequestModifiers = new Array<(request: XMLHttpRequest, url: string) => void>();\r\n\r\n /**\r\n * If set to true, requests to Babylon.js CDN requests will not be modified\r\n */\r\n public static SkipRequestModificationForBabylonCDN = true;\r\n\r\n /**\r\n * This function can be called to check if there are request modifiers for network requests\r\n * @returns true if there are any custom requests available\r\n */\r\n public static get IsCustomRequestAvailable(): boolean {\r\n return Object.keys(WebRequest.CustomRequestHeaders).length > 0 || WebRequest.CustomRequestModifiers.length > 0;\r\n }\r\n\r\n private _requestURL: string = \"\";\r\n\r\n private _injectCustomRequestHeaders(): void {\r\n if (this._shouldSkipRequestModifications(this._requestURL)) {\r\n return;\r\n }\r\n for (const key in WebRequest.CustomRequestHeaders) {\r\n const val = WebRequest.CustomRequestHeaders[key];\r\n if (val) {\r\n this._xhr.setRequestHeader(key, val);\r\n }\r\n }\r\n }\r\n\r\n private _shouldSkipRequestModifications(url: string): boolean {\r\n return WebRequest.SkipRequestModificationForBabylonCDN && (url.includes(\"preview.babylonjs.com\") || url.includes(\"cdn.babylonjs.com\"));\r\n }\r\n\r\n /**\r\n * Gets or sets a function to be called when loading progress changes\r\n */\r\n public get onprogress(): ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null {\r\n return this._xhr.onprogress;\r\n }\r\n\r\n public set onprogress(value: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null) {\r\n this._xhr.onprogress = value;\r\n }\r\n\r\n /**\r\n * Returns client's state\r\n */\r\n public get readyState(): number {\r\n return this._xhr.readyState;\r\n }\r\n\r\n /**\r\n * Returns client's status\r\n */\r\n public get status(): number {\r\n return this._xhr.status;\r\n }\r\n\r\n /**\r\n * Returns client's status as a text\r\n */\r\n public get statusText(): string {\r\n return this._xhr.statusText;\r\n }\r\n\r\n /**\r\n * Returns client's response\r\n */\r\n public get response(): any {\r\n return this._xhr.response;\r\n }\r\n\r\n /**\r\n * Returns client's response url\r\n */\r\n public get responseURL(): string {\r\n return this._xhr.responseURL;\r\n }\r\n\r\n /**\r\n * Returns client's response as text\r\n */\r\n public get responseText(): string {\r\n return this._xhr.responseText;\r\n }\r\n\r\n /**\r\n * Gets or sets the expected response type\r\n */\r\n public get responseType(): XMLHttpRequestResponseType {\r\n return this._xhr.responseType;\r\n }\r\n\r\n public set responseType(value: XMLHttpRequestResponseType) {\r\n this._xhr.responseType = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the timeout value in milliseconds\r\n */\r\n public get timeout(): number {\r\n return this._xhr.timeout;\r\n }\r\n\r\n public set timeout(value: number) {\r\n this._xhr.timeout = value;\r\n }\r\n\r\n /** @internal */\r\n public addEventListener(\r\n type: K,\r\n listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any,\r\n options?: boolean | AddEventListenerOptions\r\n ): void;\r\n public addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void {\r\n this._xhr.addEventListener(type, listener, options);\r\n }\r\n\r\n /** @internal */\r\n public removeEventListener(\r\n type: K,\r\n listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any,\r\n options?: boolean | EventListenerOptions\r\n ): void;\r\n public removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void {\r\n this._xhr.removeEventListener(type, listener, options);\r\n }\r\n\r\n /**\r\n * Cancels any network activity\r\n */\r\n public abort() {\r\n this._xhr.abort();\r\n }\r\n\r\n /**\r\n * Initiates the request. The optional argument provides the request body. The argument is ignored if request method is GET or HEAD\r\n * @param body defines an optional request body\r\n */\r\n public send(body?: Document | XMLHttpRequestBodyInit | null): void {\r\n if (WebRequest.CustomRequestHeaders) {\r\n this._injectCustomRequestHeaders();\r\n }\r\n\r\n this._xhr.send(body);\r\n }\r\n\r\n /**\r\n * Sets the request method, request URL\r\n * @param method defines the method to use (GET, POST, etc..)\r\n * @param url defines the url to connect with\r\n */\r\n public open(method: string, url: string): void {\r\n for (const update of WebRequest.CustomRequestModifiers) {\r\n if (this._shouldSkipRequestModifications(url)) {\r\n return;\r\n }\r\n update(this._xhr, url);\r\n }\r\n\r\n // Clean url\r\n url = url.replace(\"file:http:\", \"http:\");\r\n url = url.replace(\"file:https:\", \"https:\");\r\n\r\n this._requestURL = url;\r\n\r\n this._xhr.open(method, url, true);\r\n }\r\n\r\n /**\r\n * Sets the value of a request header.\r\n * @param name The name of the header whose value is to be set\r\n * @param value The value to set as the body of the header\r\n */\r\n setRequestHeader(name: string, value: string): void {\r\n this._xhr.setRequestHeader(name, value);\r\n }\r\n\r\n /**\r\n * Get the string containing the text of a particular header's value.\r\n * @param name The name of the header\r\n * @returns The string containing the text of the given header name\r\n */\r\n getResponseHeader(name: string): Nullable {\r\n return this._xhr.getResponseHeader(name);\r\n }\r\n}\r\n", "import type { IEasingFunction, EasingFunction } from \"./easing\";\r\nimport { Vector3, Quaternion, Vector2, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport { Scalar } from \"../Maths/math.scalar\";\r\nimport type { DeepImmutable, Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport type { IAnimationKey } from \"./animationKey\";\r\nimport { AnimationKeyInterpolation } from \"./animationKey\";\r\nimport { AnimationRange } from \"./animationRange\";\r\nimport type { AnimationEvent } from \"./animationEvent\";\r\nimport { Node } from \"../node\";\r\nimport type { IAnimatable } from \"./animatable.interface\";\r\nimport { Size } from \"../Maths/math.size\";\r\nimport { WebRequest } from \"../Misc/webRequest\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Animatable } from \"./animatable\";\r\nimport type { RuntimeAnimation } from \"./runtimeAnimation\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\n\r\n// Static values to help the garbage collector\r\n\r\n// Quaternion\r\nexport const _staticOffsetValueQuaternion: DeepImmutable = Object.freeze(new Quaternion(0, 0, 0, 0));\r\n\r\n// Vector3\r\nexport const _staticOffsetValueVector3: DeepImmutable = Object.freeze(Vector3.Zero());\r\n\r\n// Vector2\r\nexport const _staticOffsetValueVector2: DeepImmutable = Object.freeze(Vector2.Zero());\r\n\r\n// Size\r\nexport const _staticOffsetValueSize: DeepImmutable = Object.freeze(Size.Zero());\r\n\r\n// Color3\r\nexport const _staticOffsetValueColor3: DeepImmutable = Object.freeze(Color3.Black());\r\n\r\n// Color4\r\nexport const _staticOffsetValueColor4: DeepImmutable = Object.freeze(new Color4(0, 0, 0, 0));\r\n\r\n/**\r\n * Options to be used when creating an additive animation\r\n */\r\nexport interface IMakeAnimationAdditiveOptions {\r\n /**\r\n * The frame that the animation should be relative to (if not provided, 0 will be used)\r\n */\r\n referenceFrame?: number;\r\n /**\r\n * The name of the animation range to convert to additive. If not provided, fromFrame / toFrame will be used\r\n * If fromFrame / toFrame are not provided either, the whole animation will be converted to additive\r\n */\r\n range?: string;\r\n /**\r\n * If true, the original animation will be cloned and converted to additive. If false, the original animation will be converted to additive (default is false)\r\n */\r\n cloneOriginalAnimation?: boolean;\r\n /**\r\n * The name of the cloned animation if cloneOriginalAnimation is true. If not provided, use the original animation name\r\n */\r\n clonedAnimationName?: string;\r\n /**\r\n * Together with toFrame, defines the range of the animation to convert to additive. Will only be used if range is not provided\r\n * If range and fromFrame / toFrame are not provided, the whole animation will be converted to additive\r\n */\r\n fromFrame?: number;\r\n /**\r\n * Together with fromFrame, defines the range of the animation to convert to additive.\r\n */\r\n toFrame?: number;\r\n /**\r\n * If true, the key frames will be clipped to the range specified by range or fromFrame / toFrame (default is false)\r\n */\r\n clipKeys?: boolean;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface _IAnimationState {\r\n key: number;\r\n repeatCount: number;\r\n workValue?: any;\r\n loopMode?: number;\r\n offsetValue?: any;\r\n highLimitValue?: any;\r\n}\r\n\r\nconst evaluateAnimationState: _IAnimationState = {\r\n key: 0,\r\n repeatCount: 0,\r\n loopMode: 2 /*Animation.ANIMATIONLOOPMODE_CONSTANT*/,\r\n};\r\n\r\n/**\r\n * Class used to store any kind of animation\r\n */\r\nexport class Animation {\r\n private static _UniqueIdGenerator = 0;\r\n\r\n /**\r\n * Use matrix interpolation instead of using direct key value when animating matrices\r\n */\r\n public static AllowMatricesInterpolation = false;\r\n\r\n /**\r\n * When matrix interpolation is enabled, this boolean forces the system to use Matrix.DecomposeLerp instead of Matrix.Lerp. Interpolation is more precise but slower\r\n */\r\n public static AllowMatrixDecomposeForInterpolation = true;\r\n\r\n /**\r\n * Gets or sets the unique id of the animation (the uniqueness is solely among other animations)\r\n */\r\n public uniqueId: number;\r\n\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n /** Snippet ID if the animation was created from the snippet server */\r\n public snippetId: string;\r\n\r\n /**\r\n * Stores the key frames of the animation\r\n */\r\n private _keys: Array;\r\n\r\n /**\r\n * Stores the easing function of the animation\r\n */\r\n private _easingFunction: Nullable = null;\r\n\r\n /**\r\n * @internal Internal use only\r\n */\r\n public _runtimeAnimations = new Array();\r\n\r\n /**\r\n * The set of event that will be linked to this animation\r\n */\r\n private _events = new Array();\r\n\r\n /**\r\n * Stores an array of target property paths\r\n */\r\n public targetPropertyPath: string[];\r\n\r\n /**\r\n * Stores the blending speed of the animation\r\n */\r\n public blendingSpeed = 0.01;\r\n\r\n /**\r\n * Stores the animation ranges for the animation\r\n */\r\n private _ranges: { [name: string]: Nullable } = {};\r\n\r\n /**\r\n * @internal Internal use\r\n */\r\n public static _PrepareAnimation(\r\n name: string,\r\n targetProperty: string,\r\n framePerSecond: number,\r\n totalFrame: number,\r\n from: any,\r\n to: any,\r\n loopMode?: number,\r\n easingFunction?: EasingFunction\r\n ): Nullable {\r\n let dataType = undefined;\r\n\r\n if (!isNaN(parseFloat(from)) && isFinite(from)) {\r\n dataType = Animation.ANIMATIONTYPE_FLOAT;\r\n } else if (from instanceof Quaternion) {\r\n dataType = Animation.ANIMATIONTYPE_QUATERNION;\r\n } else if (from instanceof Vector3) {\r\n dataType = Animation.ANIMATIONTYPE_VECTOR3;\r\n } else if (from instanceof Vector2) {\r\n dataType = Animation.ANIMATIONTYPE_VECTOR2;\r\n } else if (from instanceof Color3) {\r\n dataType = Animation.ANIMATIONTYPE_COLOR3;\r\n } else if (from instanceof Color4) {\r\n dataType = Animation.ANIMATIONTYPE_COLOR4;\r\n } else if (from instanceof Size) {\r\n dataType = Animation.ANIMATIONTYPE_SIZE;\r\n }\r\n\r\n if (dataType == undefined) {\r\n return null;\r\n }\r\n\r\n const animation = new Animation(name, targetProperty, framePerSecond, dataType, loopMode);\r\n\r\n const keys: Array = [\r\n { frame: 0, value: from },\r\n { frame: totalFrame, value: to },\r\n ];\r\n animation.setKeys(keys);\r\n\r\n if (easingFunction !== undefined) {\r\n animation.setEasingFunction(easingFunction);\r\n }\r\n\r\n return animation;\r\n }\r\n\r\n /**\r\n * Sets up an animation\r\n * @param property The property to animate\r\n * @param animationType The animation type to apply\r\n * @param framePerSecond The frames per second of the animation\r\n * @param easingFunction The easing function used in the animation\r\n * @returns The created animation\r\n */\r\n public static CreateAnimation(property: string, animationType: number, framePerSecond: number, easingFunction: EasingFunction): Animation {\r\n const animation: Animation = new Animation(property + \"Animation\", property, framePerSecond, animationType, Animation.ANIMATIONLOOPMODE_CONSTANT);\r\n\r\n animation.setEasingFunction(easingFunction);\r\n\r\n return animation;\r\n }\r\n\r\n /**\r\n * Create and start an animation on a node\r\n * @param name defines the name of the global animation that will be run on all nodes\r\n * @param target defines the target where the animation will take place\r\n * @param targetProperty defines property to animate\r\n * @param framePerSecond defines the number of frame per second yo use\r\n * @param totalFrame defines the number of frames in total\r\n * @param from defines the initial value\r\n * @param to defines the final value\r\n * @param loopMode defines which loop mode you want to use (off by default)\r\n * @param easingFunction defines the easing function to use (linear by default)\r\n * @param onAnimationEnd defines the callback to call when animation end\r\n * @param scene defines the hosting scene\r\n * @returns the animatable created for this animation\r\n */\r\n public static CreateAndStartAnimation(\r\n name: string,\r\n target: any,\r\n targetProperty: string,\r\n framePerSecond: number,\r\n totalFrame: number,\r\n from: any,\r\n to: any,\r\n loopMode?: number,\r\n easingFunction?: EasingFunction,\r\n onAnimationEnd?: () => void,\r\n scene?: Scene\r\n ): Nullable {\r\n const animation = Animation._PrepareAnimation(name, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction);\r\n\r\n if (!animation) {\r\n return null;\r\n }\r\n\r\n if (target.getScene) {\r\n scene = target.getScene();\r\n }\r\n\r\n if (!scene) {\r\n return null;\r\n }\r\n\r\n return scene.beginDirectAnimation(target, [animation], 0, totalFrame, animation.loopMode === 1, 1.0, onAnimationEnd);\r\n }\r\n\r\n /**\r\n * Create and start an animation on a node and its descendants\r\n * @param name defines the name of the global animation that will be run on all nodes\r\n * @param node defines the root node where the animation will take place\r\n * @param directDescendantsOnly if true only direct descendants will be used, if false direct and also indirect (children of children, an so on in a recursive manner) descendants will be used\r\n * @param targetProperty defines property to animate\r\n * @param framePerSecond defines the number of frame per second to use\r\n * @param totalFrame defines the number of frames in total\r\n * @param from defines the initial value\r\n * @param to defines the final value\r\n * @param loopMode defines which loop mode you want to use (off by default)\r\n * @param easingFunction defines the easing function to use (linear by default)\r\n * @param onAnimationEnd defines the callback to call when an animation ends (will be called once per node)\r\n * @returns the list of animatables created for all nodes\r\n * @example https://www.babylonjs-playground.com/#MH0VLI\r\n */\r\n public static CreateAndStartHierarchyAnimation(\r\n name: string,\r\n node: Node,\r\n directDescendantsOnly: boolean,\r\n targetProperty: string,\r\n framePerSecond: number,\r\n totalFrame: number,\r\n from: any,\r\n to: any,\r\n loopMode?: number,\r\n easingFunction?: EasingFunction,\r\n onAnimationEnd?: () => void\r\n ): Nullable {\r\n const animation = Animation._PrepareAnimation(name, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction);\r\n\r\n if (!animation) {\r\n return null;\r\n }\r\n\r\n const scene = node.getScene();\r\n return scene.beginDirectHierarchyAnimation(node, directDescendantsOnly, [animation], 0, totalFrame, animation.loopMode === 1, 1.0, onAnimationEnd);\r\n }\r\n\r\n /**\r\n * Creates a new animation, merges it with the existing animations and starts it\r\n * @param name Name of the animation\r\n * @param node Node which contains the scene that begins the animations\r\n * @param targetProperty Specifies which property to animate\r\n * @param framePerSecond The frames per second of the animation\r\n * @param totalFrame The total number of frames\r\n * @param from The frame at the beginning of the animation\r\n * @param to The frame at the end of the animation\r\n * @param loopMode Specifies the loop mode of the animation\r\n * @param easingFunction (Optional) The easing function of the animation, which allow custom mathematical formulas for animations\r\n * @param onAnimationEnd Callback to run once the animation is complete\r\n * @returns Nullable animation\r\n */\r\n public static CreateMergeAndStartAnimation(\r\n name: string,\r\n node: Node,\r\n targetProperty: string,\r\n framePerSecond: number,\r\n totalFrame: number,\r\n from: any,\r\n to: any,\r\n loopMode?: number,\r\n easingFunction?: EasingFunction,\r\n onAnimationEnd?: () => void\r\n ): Nullable {\r\n const animation = Animation._PrepareAnimation(name, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction);\r\n\r\n if (!animation) {\r\n return null;\r\n }\r\n\r\n node.animations.push(animation);\r\n\r\n return node.getScene().beginAnimation(node, 0, totalFrame, animation.loopMode === 1, 1.0, onAnimationEnd);\r\n }\r\n\r\n /**\r\n * Convert the keyframes of an animation to be relative to a given reference frame.\r\n * @param sourceAnimation defines the Animation containing keyframes to convert\r\n * @param referenceFrame defines the frame that keyframes in the range will be relative to (default: 0)\r\n * @param range defines the name of the AnimationRange belonging to the Animation to convert\r\n * @param cloneOriginal defines whether or not to clone the animation and convert the clone or convert the original animation (default is false)\r\n * @param clonedName defines the name of the resulting cloned Animation if cloneOriginal is true\r\n * @returns a new Animation if cloneOriginal is true or the original Animation if cloneOriginal is false\r\n */\r\n public static MakeAnimationAdditive(sourceAnimation: Animation, referenceFrame?: number, range?: string, cloneOriginal?: boolean, clonedName?: string): Animation;\r\n\r\n /**\r\n * Convert the keyframes of an animation to be relative to a given reference frame.\r\n * @param sourceAnimation defines the Animation containing keyframes to convert\r\n * @param options defines the options to use when converting ey keyframes\r\n * @returns a new Animation if options.cloneOriginalAnimation is true or the original Animation if options.cloneOriginalAnimation is false\r\n */\r\n public static MakeAnimationAdditive(sourceAnimation: Animation, options?: IMakeAnimationAdditiveOptions): Animation;\r\n\r\n /** @internal */\r\n public static MakeAnimationAdditive(\r\n sourceAnimation: Animation,\r\n referenceFrameOrOptions?: number | IMakeAnimationAdditiveOptions,\r\n range?: string,\r\n cloneOriginal = false,\r\n clonedName?: string\r\n ): Animation {\r\n let options: IMakeAnimationAdditiveOptions;\r\n\r\n if (typeof referenceFrameOrOptions === \"object\") {\r\n options = referenceFrameOrOptions;\r\n } else {\r\n options = {\r\n referenceFrame: referenceFrameOrOptions ?? 0,\r\n range: range,\r\n cloneOriginalAnimation: cloneOriginal,\r\n clonedAnimationName: clonedName,\r\n };\r\n }\r\n\r\n let animation = sourceAnimation;\r\n\r\n if (options.cloneOriginalAnimation) {\r\n animation = sourceAnimation.clone();\r\n animation.name = options.clonedAnimationName || animation.name;\r\n }\r\n\r\n if (!animation._keys.length) {\r\n return animation;\r\n }\r\n\r\n const referenceFrame = options.referenceFrame && options.referenceFrame >= 0 ? options.referenceFrame : 0;\r\n let startIndex = 0;\r\n const firstKey = animation._keys[0];\r\n let endIndex = animation._keys.length - 1;\r\n const lastKey = animation._keys[endIndex];\r\n const valueStore = {\r\n referenceValue: firstKey.value,\r\n referencePosition: TmpVectors.Vector3[0],\r\n referenceQuaternion: TmpVectors.Quaternion[0],\r\n referenceScaling: TmpVectors.Vector3[1],\r\n keyPosition: TmpVectors.Vector3[2],\r\n keyQuaternion: TmpVectors.Quaternion[1],\r\n keyScaling: TmpVectors.Vector3[3],\r\n };\r\n let from = firstKey.frame;\r\n let to = lastKey.frame;\r\n if (options.range) {\r\n const rangeValue = animation.getRange(options.range);\r\n\r\n if (rangeValue) {\r\n from = rangeValue.from;\r\n to = rangeValue.to;\r\n }\r\n } else {\r\n from = options.fromFrame ?? from;\r\n to = options.toFrame ?? to;\r\n }\r\n\r\n if (from !== firstKey.frame) {\r\n startIndex = animation.createKeyForFrame(from);\r\n }\r\n\r\n if (to !== lastKey.frame) {\r\n endIndex = animation.createKeyForFrame(to);\r\n }\r\n\r\n // There's only one key, so use it\r\n if (animation._keys.length === 1) {\r\n const value = animation._getKeyValue(animation._keys[0]);\r\n valueStore.referenceValue = value.clone ? value.clone() : value;\r\n }\r\n\r\n // Reference frame is before the first frame, so just use the first frame\r\n else if (referenceFrame <= firstKey.frame) {\r\n const value = animation._getKeyValue(firstKey.value);\r\n valueStore.referenceValue = value.clone ? value.clone() : value;\r\n }\r\n\r\n // Reference frame is after the last frame, so just use the last frame\r\n else if (referenceFrame >= lastKey.frame) {\r\n const value = animation._getKeyValue(lastKey.value);\r\n valueStore.referenceValue = value.clone ? value.clone() : value;\r\n }\r\n\r\n // Interpolate the reference value from the animation\r\n else {\r\n evaluateAnimationState.key = 0;\r\n const value = animation._interpolate(referenceFrame, evaluateAnimationState);\r\n valueStore.referenceValue = value.clone ? value.clone() : value;\r\n }\r\n\r\n // Conjugate the quaternion\r\n if (animation.dataType === Animation.ANIMATIONTYPE_QUATERNION) {\r\n valueStore.referenceValue.normalize().conjugateInPlace();\r\n }\r\n\r\n // Decompose matrix and conjugate the quaternion\r\n else if (animation.dataType === Animation.ANIMATIONTYPE_MATRIX) {\r\n valueStore.referenceValue.decompose(valueStore.referenceScaling, valueStore.referenceQuaternion, valueStore.referencePosition);\r\n valueStore.referenceQuaternion.normalize().conjugateInPlace();\r\n }\r\n\r\n let startFrame = Number.MAX_VALUE;\r\n const clippedKeys: Nullable = options.clipKeys ? [] : null;\r\n\r\n // Subtract the reference value from all of the key values\r\n for (let index = startIndex; index <= endIndex; index++) {\r\n let key = animation._keys[index];\r\n\r\n if (clippedKeys) {\r\n key = {\r\n frame: key.frame,\r\n value: key.value.clone ? key.value.clone() : key.value,\r\n inTangent: key.inTangent,\r\n outTangent: key.outTangent,\r\n interpolation: key.interpolation,\r\n lockedTangent: key.lockedTangent,\r\n };\r\n if (startFrame === Number.MAX_VALUE) {\r\n startFrame = key.frame;\r\n }\r\n key.frame -= startFrame;\r\n clippedKeys.push(key);\r\n }\r\n\r\n // If this key was duplicated to create a frame 0 key, skip it because its value has already been updated\r\n if (index && animation.dataType !== Animation.ANIMATIONTYPE_FLOAT && key.value === firstKey.value) {\r\n continue;\r\n }\r\n\r\n switch (animation.dataType) {\r\n case Animation.ANIMATIONTYPE_MATRIX:\r\n key.value.decompose(valueStore.keyScaling, valueStore.keyQuaternion, valueStore.keyPosition);\r\n valueStore.keyPosition.subtractInPlace(valueStore.referencePosition);\r\n valueStore.keyScaling.divideInPlace(valueStore.referenceScaling);\r\n valueStore.referenceQuaternion.multiplyToRef(valueStore.keyQuaternion, valueStore.keyQuaternion);\r\n Matrix.ComposeToRef(valueStore.keyScaling, valueStore.keyQuaternion, valueStore.keyPosition, key.value);\r\n break;\r\n\r\n case Animation.ANIMATIONTYPE_QUATERNION:\r\n valueStore.referenceValue.multiplyToRef(key.value, key.value);\r\n break;\r\n\r\n case Animation.ANIMATIONTYPE_VECTOR2:\r\n case Animation.ANIMATIONTYPE_VECTOR3:\r\n case Animation.ANIMATIONTYPE_COLOR3:\r\n case Animation.ANIMATIONTYPE_COLOR4:\r\n key.value.subtractToRef(valueStore.referenceValue, key.value);\r\n break;\r\n\r\n case Animation.ANIMATIONTYPE_SIZE:\r\n key.value.width -= valueStore.referenceValue.width;\r\n key.value.height -= valueStore.referenceValue.height;\r\n break;\r\n\r\n default:\r\n key.value -= valueStore.referenceValue;\r\n }\r\n }\r\n\r\n if (clippedKeys) {\r\n animation.setKeys(clippedKeys, true);\r\n }\r\n\r\n return animation;\r\n }\r\n\r\n /**\r\n * Transition property of an host to the target Value\r\n * @param property The property to transition\r\n * @param targetValue The target Value of the property\r\n * @param host The object where the property to animate belongs\r\n * @param scene Scene used to run the animation\r\n * @param frameRate Framerate (in frame/s) to use\r\n * @param transition The transition type we want to use\r\n * @param duration The duration of the animation, in milliseconds\r\n * @param onAnimationEnd Callback trigger at the end of the animation\r\n * @returns Nullable animation\r\n */\r\n public static TransitionTo(\r\n property: string,\r\n targetValue: any,\r\n host: any,\r\n scene: Scene,\r\n frameRate: number,\r\n transition: Animation,\r\n duration: number,\r\n onAnimationEnd: Nullable<() => void> = null\r\n ): Nullable {\r\n if (duration <= 0) {\r\n host[property] = targetValue;\r\n if (onAnimationEnd) {\r\n onAnimationEnd();\r\n }\r\n return null;\r\n }\r\n\r\n const endFrame: number = frameRate * (duration / 1000);\r\n\r\n transition.setKeys([\r\n {\r\n frame: 0,\r\n value: host[property].clone ? host[property].clone() : host[property],\r\n },\r\n {\r\n frame: endFrame,\r\n value: targetValue,\r\n },\r\n ]);\r\n\r\n if (!host.animations) {\r\n host.animations = [];\r\n }\r\n\r\n host.animations.push(transition);\r\n\r\n const animation: Animatable = scene.beginAnimation(host, 0, endFrame, false);\r\n animation.onAnimationEnd = onAnimationEnd;\r\n return animation;\r\n }\r\n\r\n /**\r\n * Return the array of runtime animations currently using this animation\r\n */\r\n public get runtimeAnimations(): RuntimeAnimation[] {\r\n return this._runtimeAnimations;\r\n }\r\n\r\n /**\r\n * Specifies if any of the runtime animations are currently running\r\n */\r\n public get hasRunningRuntimeAnimations(): boolean {\r\n for (const runtimeAnimation of this._runtimeAnimations) {\r\n if (!runtimeAnimation.isStopped()) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Initializes the animation\r\n * @param name Name of the animation\r\n * @param targetProperty Property to animate\r\n * @param framePerSecond The frames per second of the animation\r\n * @param dataType The data type of the animation\r\n * @param loopMode The loop mode of the animation\r\n * @param enableBlending Specifies if blending should be enabled\r\n */\r\n constructor(\r\n /**Name of the animation */\r\n public name: string,\r\n /**Property to animate */\r\n public targetProperty: string,\r\n /**The frames per second of the animation */\r\n public framePerSecond: number,\r\n /**The data type of the animation */\r\n public dataType: number,\r\n /**The loop mode of the animation */\r\n public loopMode?: number,\r\n /**Specifies if blending should be enabled */\r\n public enableBlending?: boolean\r\n ) {\r\n this.targetPropertyPath = targetProperty.split(\".\");\r\n this.dataType = dataType;\r\n this.loopMode = loopMode === undefined ? Animation.ANIMATIONLOOPMODE_CYCLE : loopMode;\r\n this.uniqueId = Animation._UniqueIdGenerator++;\r\n }\r\n\r\n // Methods\r\n /**\r\n * Converts the animation to a string\r\n * @param fullDetails support for multiple levels of logging within scene loading\r\n * @returns String form of the animation\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name + \", property: \" + this.targetProperty;\r\n ret += \", datatype: \" + [\"Float\", \"Vector3\", \"Quaternion\", \"Matrix\", \"Color3\", \"Vector2\"][this.dataType];\r\n ret += \", nKeys: \" + (this._keys ? this._keys.length : \"none\");\r\n ret += \", nRanges: \" + (this._ranges ? Object.keys(this._ranges).length : \"none\");\r\n if (fullDetails) {\r\n ret += \", Ranges: {\";\r\n let first = true;\r\n for (const name in this._ranges) {\r\n if (first) {\r\n ret += \", \";\r\n first = false;\r\n }\r\n ret += name;\r\n }\r\n ret += \"}\";\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Add an event to this animation\r\n * @param event Event to add\r\n */\r\n public addEvent(event: AnimationEvent): void {\r\n this._events.push(event);\r\n this._events.sort((a, b) => a.frame - b.frame);\r\n }\r\n\r\n /**\r\n * Remove all events found at the given frame\r\n * @param frame The frame to remove events from\r\n */\r\n public removeEvents(frame: number): void {\r\n for (let index = 0; index < this._events.length; index++) {\r\n if (this._events[index].frame === frame) {\r\n this._events.splice(index, 1);\r\n index--;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Retrieves all the events from the animation\r\n * @returns Events from the animation\r\n */\r\n public getEvents(): AnimationEvent[] {\r\n return this._events;\r\n }\r\n\r\n /**\r\n * Creates an animation range\r\n * @param name Name of the animation range\r\n * @param from Starting frame of the animation range\r\n * @param to Ending frame of the animation\r\n */\r\n public createRange(name: string, from: number, to: number): void {\r\n // check name not already in use; could happen for bones after serialized\r\n if (!this._ranges[name]) {\r\n this._ranges[name] = new AnimationRange(name, from, to);\r\n }\r\n }\r\n\r\n /**\r\n * Deletes an animation range by name\r\n * @param name Name of the animation range to delete\r\n * @param deleteFrames Specifies if the key frames for the range should also be deleted (true) or not (false)\r\n */\r\n public deleteRange(name: string, deleteFrames = true): void {\r\n const range = this._ranges[name];\r\n if (!range) {\r\n return;\r\n }\r\n if (deleteFrames) {\r\n const from = range.from;\r\n const to = range.to;\r\n\r\n // this loop MUST go high to low for multiple splices to work\r\n for (let key = this._keys.length - 1; key >= 0; key--) {\r\n if (this._keys[key].frame >= from && this._keys[key].frame <= to) {\r\n this._keys.splice(key, 1);\r\n }\r\n }\r\n }\r\n this._ranges[name] = null; // said much faster than 'delete this._range[name]'\r\n }\r\n\r\n /**\r\n * Gets the animation range by name, or null if not defined\r\n * @param name Name of the animation range\r\n * @returns Nullable animation range\r\n */\r\n public getRange(name: string): Nullable {\r\n return this._ranges[name];\r\n }\r\n\r\n /**\r\n * Gets the key frames from the animation\r\n * @returns The key frames of the animation\r\n */\r\n public getKeys(): Array {\r\n return this._keys;\r\n }\r\n\r\n /**\r\n * Gets the highest frame rate of the animation\r\n * @returns Highest frame rate of the animation\r\n */\r\n public getHighestFrame(): number {\r\n let ret = 0;\r\n\r\n for (let key = 0, nKeys = this._keys.length; key < nKeys; key++) {\r\n if (ret < this._keys[key].frame) {\r\n ret = this._keys[key].frame;\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Gets the easing function of the animation\r\n * @returns Easing function of the animation\r\n */\r\n public getEasingFunction(): Nullable {\r\n return this._easingFunction;\r\n }\r\n\r\n /**\r\n * Sets the easing function of the animation\r\n * @param easingFunction A custom mathematical formula for animation\r\n */\r\n public setEasingFunction(easingFunction: Nullable): void {\r\n this._easingFunction = easingFunction;\r\n }\r\n\r\n /**\r\n * Interpolates a scalar linearly\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated scalar value\r\n */\r\n public floatInterpolateFunction(startValue: number, endValue: number, gradient: number): number {\r\n return Scalar.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a scalar cubically\r\n * @param startValue Start value of the animation curve\r\n * @param outTangent End tangent of the animation\r\n * @param endValue End value of the animation curve\r\n * @param inTangent Start tangent of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated scalar value\r\n */\r\n public floatInterpolateFunctionWithTangents(startValue: number, outTangent: number, endValue: number, inTangent: number, gradient: number): number {\r\n return Scalar.Hermite(startValue, outTangent, endValue, inTangent, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a quaternion using a spherical linear interpolation\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated quaternion value\r\n */\r\n public quaternionInterpolateFunction(startValue: Quaternion, endValue: Quaternion, gradient: number): Quaternion {\r\n return Quaternion.Slerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a quaternion cubically\r\n * @param startValue Start value of the animation curve\r\n * @param outTangent End tangent of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param inTangent Start tangent of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated quaternion value\r\n */\r\n public quaternionInterpolateFunctionWithTangents(startValue: Quaternion, outTangent: Quaternion, endValue: Quaternion, inTangent: Quaternion, gradient: number): Quaternion {\r\n return Quaternion.Hermite(startValue, outTangent, endValue, inTangent, gradient).normalize();\r\n }\r\n\r\n /**\r\n * Interpolates a Vector3 linearly\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\r\n * @returns Interpolated scalar value\r\n */\r\n public vector3InterpolateFunction(startValue: Vector3, endValue: Vector3, gradient: number): Vector3 {\r\n return Vector3.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Vector3 cubically\r\n * @param startValue Start value of the animation curve\r\n * @param outTangent End tangent of the animation\r\n * @param endValue End value of the animation curve\r\n * @param inTangent Start tangent of the animation curve\r\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\r\n * @returns InterpolatedVector3 value\r\n */\r\n public vector3InterpolateFunctionWithTangents(startValue: Vector3, outTangent: Vector3, endValue: Vector3, inTangent: Vector3, gradient: number): Vector3 {\r\n return Vector3.Hermite(startValue, outTangent, endValue, inTangent, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Vector2 linearly\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\r\n * @returns Interpolated Vector2 value\r\n */\r\n public vector2InterpolateFunction(startValue: Vector2, endValue: Vector2, gradient: number): Vector2 {\r\n return Vector2.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Vector2 cubically\r\n * @param startValue Start value of the animation curve\r\n * @param outTangent End tangent of the animation\r\n * @param endValue End value of the animation curve\r\n * @param inTangent Start tangent of the animation curve\r\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\r\n * @returns Interpolated Vector2 value\r\n */\r\n public vector2InterpolateFunctionWithTangents(startValue: Vector2, outTangent: Vector2, endValue: Vector2, inTangent: Vector2, gradient: number): Vector2 {\r\n return Vector2.Hermite(startValue, outTangent, endValue, inTangent, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a size linearly\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated Size value\r\n */\r\n public sizeInterpolateFunction(startValue: Size, endValue: Size, gradient: number): Size {\r\n return Size.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Color3 linearly\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated Color3 value\r\n */\r\n public color3InterpolateFunction(startValue: Color3, endValue: Color3, gradient: number): Color3 {\r\n return Color3.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Color3 cubically\r\n * @param startValue Start value of the animation curve\r\n * @param outTangent End tangent of the animation\r\n * @param endValue End value of the animation curve\r\n * @param inTangent Start tangent of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns interpolated value\r\n */\r\n public color3InterpolateFunctionWithTangents(startValue: Color3, outTangent: Color3, endValue: Color3, inTangent: Color3, gradient: number): Color3 {\r\n return Color3.Hermite(startValue, outTangent, endValue, inTangent, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Color4 linearly\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated Color3 value\r\n */\r\n public color4InterpolateFunction(startValue: Color4, endValue: Color4, gradient: number): Color4 {\r\n return Color4.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Color4 cubically\r\n * @param startValue Start value of the animation curve\r\n * @param outTangent End tangent of the animation\r\n * @param endValue End value of the animation curve\r\n * @param inTangent Start tangent of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns interpolated value\r\n */\r\n public color4InterpolateFunctionWithTangents(startValue: Color4, outTangent: Color4, endValue: Color4, inTangent: Color4, gradient: number): Color4 {\r\n return Color4.Hermite(startValue, outTangent, endValue, inTangent, gradient);\r\n }\r\n\r\n /**\r\n * @internal Internal use only\r\n */\r\n public _getKeyValue(value: any): any {\r\n if (typeof value === \"function\") {\r\n return value();\r\n }\r\n\r\n return value;\r\n }\r\n\r\n /**\r\n * Evaluate the animation value at a given frame\r\n * @param currentFrame defines the frame where we want to evaluate the animation\r\n * @returns the animation value\r\n */\r\n public evaluate(currentFrame: number) {\r\n evaluateAnimationState.key = 0;\r\n return this._interpolate(currentFrame, evaluateAnimationState);\r\n }\r\n\r\n /**\r\n * @internal Internal use only\r\n */\r\n public _interpolate(currentFrame: number, state: _IAnimationState, searchClosestKeyOnly = false): any {\r\n if (state.loopMode === Animation.ANIMATIONLOOPMODE_CONSTANT && state.repeatCount > 0) {\r\n return state.highLimitValue.clone ? state.highLimitValue.clone() : state.highLimitValue;\r\n }\r\n\r\n const keys = this._keys;\r\n const keysLength = keys.length;\r\n\r\n let key = state.key;\r\n\r\n while (key >= 0 && currentFrame < keys[key].frame) {\r\n --key;\r\n }\r\n\r\n while (key + 1 <= keysLength - 1 && currentFrame >= keys[key + 1].frame) {\r\n ++key;\r\n }\r\n\r\n state.key = key;\r\n\r\n if (key < 0) {\r\n return searchClosestKeyOnly ? undefined : this._getKeyValue(keys[0].value);\r\n } else if (key + 1 > keysLength - 1) {\r\n return searchClosestKeyOnly ? undefined : this._getKeyValue(keys[keysLength - 1].value);\r\n }\r\n\r\n const startKey = keys[key];\r\n const endKey = keys[key + 1];\r\n\r\n if (searchClosestKeyOnly && (currentFrame === startKey.frame || currentFrame === endKey.frame)) {\r\n return undefined;\r\n }\r\n\r\n const startValue = this._getKeyValue(startKey.value);\r\n const endValue = this._getKeyValue(endKey.value);\r\n if (startKey.interpolation === AnimationKeyInterpolation.STEP) {\r\n if (endKey.frame > currentFrame) {\r\n return startValue;\r\n } else {\r\n return endValue;\r\n }\r\n }\r\n\r\n const useTangent = startKey.outTangent !== undefined && endKey.inTangent !== undefined;\r\n const frameDelta = endKey.frame - startKey.frame;\r\n\r\n // gradient : percent of currentFrame between the frame inf and the frame sup\r\n let gradient = (currentFrame - startKey.frame) / frameDelta;\r\n\r\n // check for easingFunction and correction of gradient\r\n const easingFunction = startKey.easingFunction || this.getEasingFunction();\r\n if (easingFunction !== null) {\r\n gradient = easingFunction.ease(gradient);\r\n }\r\n\r\n switch (this.dataType) {\r\n // Float\r\n case Animation.ANIMATIONTYPE_FLOAT: {\r\n const floatValue = useTangent\r\n ? this.floatInterpolateFunctionWithTangents(startValue, startKey.outTangent * frameDelta, endValue, endKey.inTangent * frameDelta, gradient)\r\n : this.floatInterpolateFunction(startValue, endValue, gradient);\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return floatValue;\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return (state.offsetValue ?? 0) * state.repeatCount + floatValue;\r\n }\r\n break;\r\n }\r\n // Quaternion\r\n case Animation.ANIMATIONTYPE_QUATERNION: {\r\n const quatValue = useTangent\r\n ? this.quaternionInterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient)\r\n : this.quaternionInterpolateFunction(startValue, endValue, gradient);\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return quatValue;\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return quatValue.addInPlace((state.offsetValue || _staticOffsetValueQuaternion).scale(state.repeatCount));\r\n }\r\n\r\n return quatValue;\r\n }\r\n // Vector3\r\n case Animation.ANIMATIONTYPE_VECTOR3: {\r\n const vec3Value = useTangent\r\n ? this.vector3InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient)\r\n : this.vector3InterpolateFunction(startValue, endValue, gradient);\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return vec3Value;\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return vec3Value.add((state.offsetValue || _staticOffsetValueVector3).scale(state.repeatCount));\r\n }\r\n break;\r\n }\r\n // Vector2\r\n case Animation.ANIMATIONTYPE_VECTOR2: {\r\n const vec2Value = useTangent\r\n ? this.vector2InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient)\r\n : this.vector2InterpolateFunction(startValue, endValue, gradient);\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return vec2Value;\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return vec2Value.add((state.offsetValue || _staticOffsetValueVector2).scale(state.repeatCount));\r\n }\r\n break;\r\n }\r\n // Size\r\n case Animation.ANIMATIONTYPE_SIZE: {\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return this.sizeInterpolateFunction(startValue, endValue, gradient);\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return this.sizeInterpolateFunction(startValue, endValue, gradient).add((state.offsetValue || _staticOffsetValueSize).scale(state.repeatCount));\r\n }\r\n break;\r\n }\r\n // Color3\r\n case Animation.ANIMATIONTYPE_COLOR3: {\r\n const color3Value = useTangent\r\n ? this.color3InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient)\r\n : this.color3InterpolateFunction(startValue, endValue, gradient);\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return color3Value;\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return color3Value.add((state.offsetValue || _staticOffsetValueColor3).scale(state.repeatCount));\r\n }\r\n break;\r\n }\r\n // Color4\r\n case Animation.ANIMATIONTYPE_COLOR4: {\r\n const color4Value = useTangent\r\n ? this.color4InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient)\r\n : this.color4InterpolateFunction(startValue, endValue, gradient);\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return color4Value;\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return color4Value.add((state.offsetValue || _staticOffsetValueColor4).scale(state.repeatCount));\r\n }\r\n break;\r\n }\r\n // Matrix\r\n case Animation.ANIMATIONTYPE_MATRIX: {\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO: {\r\n if (Animation.AllowMatricesInterpolation) {\r\n return this.matrixInterpolateFunction(startValue, endValue, gradient, state.workValue);\r\n }\r\n return startValue;\r\n }\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: {\r\n return startValue;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Defines the function to use to interpolate matrices\r\n * @param startValue defines the start matrix\r\n * @param endValue defines the end matrix\r\n * @param gradient defines the gradient between both matrices\r\n * @param result defines an optional target matrix where to store the interpolation\r\n * @returns the interpolated matrix\r\n */\r\n public matrixInterpolateFunction(startValue: Matrix, endValue: Matrix, gradient: number, result?: Matrix): Matrix {\r\n if (Animation.AllowMatrixDecomposeForInterpolation) {\r\n if (result) {\r\n Matrix.DecomposeLerpToRef(startValue, endValue, gradient, result);\r\n return result;\r\n }\r\n return Matrix.DecomposeLerp(startValue, endValue, gradient);\r\n }\r\n\r\n if (result) {\r\n Matrix.LerpToRef(startValue, endValue, gradient, result);\r\n return result;\r\n }\r\n return Matrix.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Makes a copy of the animation\r\n * @returns Cloned animation\r\n */\r\n public clone(): Animation {\r\n const clone = new Animation(this.name, this.targetPropertyPath.join(\".\"), this.framePerSecond, this.dataType, this.loopMode);\r\n\r\n clone.enableBlending = this.enableBlending;\r\n clone.blendingSpeed = this.blendingSpeed;\r\n\r\n if (this._keys) {\r\n clone.setKeys(this._keys);\r\n }\r\n\r\n if (this._ranges) {\r\n clone._ranges = {};\r\n for (const name in this._ranges) {\r\n const range = this._ranges[name];\r\n if (!range) {\r\n continue;\r\n }\r\n clone._ranges[name] = range.clone();\r\n }\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Sets the key frames of the animation\r\n * @param values The animation key frames to set\r\n * @param dontClone Whether to clone the keys or not (default is false, so the array of keys is cloned)\r\n */\r\n public setKeys(values: Array, dontClone = false): void {\r\n this._keys = !dontClone ? values.slice(0) : values;\r\n }\r\n\r\n /**\r\n * Creates a key for the frame passed as a parameter and adds it to the animation IF a key doesn't already exist for that frame\r\n * @param frame Frame number\r\n * @returns The key index if the key was added or the index of the pre existing key if the frame passed as parameter already has a corresponding key\r\n */\r\n public createKeyForFrame(frame: number) {\r\n // Find the key corresponding to frame\r\n evaluateAnimationState.key = 0;\r\n const value = this._interpolate(frame, evaluateAnimationState, true);\r\n\r\n if (!value) {\r\n // A key corresponding to this frame already exists\r\n return this._keys[evaluateAnimationState.key].frame === frame ? evaluateAnimationState.key : evaluateAnimationState.key + 1;\r\n }\r\n\r\n // The frame is between two keys, so create a new key\r\n const newKey: IAnimationKey = {\r\n frame,\r\n value: value.clone ? value.clone() : value,\r\n };\r\n\r\n this._keys.splice(evaluateAnimationState.key + 1, 0, newKey);\r\n\r\n return evaluateAnimationState.key + 1;\r\n }\r\n\r\n /**\r\n * Serializes the animation to an object\r\n * @returns Serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.property = this.targetProperty;\r\n serializationObject.framePerSecond = this.framePerSecond;\r\n serializationObject.dataType = this.dataType;\r\n serializationObject.loopBehavior = this.loopMode;\r\n serializationObject.enableBlending = this.enableBlending;\r\n serializationObject.blendingSpeed = this.blendingSpeed;\r\n\r\n const dataType = this.dataType;\r\n serializationObject.keys = [];\r\n const keys = this.getKeys();\r\n for (let index = 0; index < keys.length; index++) {\r\n const animationKey = keys[index];\r\n\r\n const key: any = {};\r\n key.frame = animationKey.frame;\r\n\r\n switch (dataType) {\r\n case Animation.ANIMATIONTYPE_FLOAT:\r\n key.values = [animationKey.value];\r\n if (animationKey.inTangent !== undefined) {\r\n key.values.push(animationKey.inTangent);\r\n }\r\n if (animationKey.outTangent !== undefined) {\r\n if (animationKey.inTangent === undefined) {\r\n key.values.push(undefined);\r\n }\r\n key.values.push(animationKey.outTangent);\r\n }\r\n if (animationKey.interpolation !== undefined) {\r\n if (animationKey.inTangent === undefined) {\r\n key.values.push(undefined);\r\n }\r\n if (animationKey.outTangent === undefined) {\r\n key.values.push(undefined);\r\n }\r\n key.values.push(animationKey.interpolation);\r\n }\r\n break;\r\n case Animation.ANIMATIONTYPE_QUATERNION:\r\n case Animation.ANIMATIONTYPE_MATRIX:\r\n case Animation.ANIMATIONTYPE_VECTOR3:\r\n case Animation.ANIMATIONTYPE_COLOR3:\r\n case Animation.ANIMATIONTYPE_COLOR4:\r\n key.values = animationKey.value.asArray();\r\n if (animationKey.inTangent != undefined) {\r\n key.values.push(animationKey.inTangent.asArray());\r\n }\r\n if (animationKey.outTangent != undefined) {\r\n if (animationKey.inTangent === undefined) {\r\n key.values.push(undefined);\r\n }\r\n key.values.push(animationKey.outTangent.asArray());\r\n }\r\n if (animationKey.interpolation !== undefined) {\r\n if (animationKey.inTangent === undefined) {\r\n key.values.push(undefined);\r\n }\r\n if (animationKey.outTangent === undefined) {\r\n key.values.push(undefined);\r\n }\r\n key.values.push(animationKey.interpolation);\r\n }\r\n break;\r\n }\r\n\r\n serializationObject.keys.push(key);\r\n }\r\n\r\n serializationObject.ranges = [];\r\n for (const name in this._ranges) {\r\n const source = this._ranges[name];\r\n\r\n if (!source) {\r\n continue;\r\n }\r\n const range: any = {};\r\n range.name = name;\r\n range.from = source.from;\r\n range.to = source.to;\r\n serializationObject.ranges.push(range);\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Float animation type\r\n */\r\n public static readonly ANIMATIONTYPE_FLOAT = 0;\r\n /**\r\n * Vector3 animation type\r\n */\r\n public static readonly ANIMATIONTYPE_VECTOR3 = 1;\r\n /**\r\n * Quaternion animation type\r\n */\r\n public static readonly ANIMATIONTYPE_QUATERNION = 2;\r\n /**\r\n * Matrix animation type\r\n */\r\n public static readonly ANIMATIONTYPE_MATRIX = 3;\r\n /**\r\n * Color3 animation type\r\n */\r\n public static readonly ANIMATIONTYPE_COLOR3 = 4;\r\n /**\r\n * Color3 animation type\r\n */\r\n public static readonly ANIMATIONTYPE_COLOR4 = 7;\r\n /**\r\n * Vector2 animation type\r\n */\r\n public static readonly ANIMATIONTYPE_VECTOR2 = 5;\r\n /**\r\n * Size animation type\r\n */\r\n public static readonly ANIMATIONTYPE_SIZE = 6;\r\n /**\r\n * Relative Loop Mode\r\n */\r\n public static readonly ANIMATIONLOOPMODE_RELATIVE = 0;\r\n /**\r\n * Cycle Loop Mode\r\n */\r\n public static readonly ANIMATIONLOOPMODE_CYCLE = 1;\r\n /**\r\n * Constant Loop Mode\r\n */\r\n public static readonly ANIMATIONLOOPMODE_CONSTANT = 2;\r\n /**\r\n * Yoyo Loop Mode\r\n */\r\n public static readonly ANIMATIONLOOPMODE_YOYO = 4;\r\n /**\r\n * Relative Loop Mode (add to current value of animated object, unlike ANIMATIONLOOPMODE_RELATIVE)\r\n */\r\n public static readonly ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT = 5;\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _UniversalLerp(left: any, right: any, amount: number): any {\r\n const constructor = left.constructor;\r\n if (constructor.Lerp) {\r\n // Lerp supported\r\n return constructor.Lerp(left, right, amount);\r\n } else if (constructor.Slerp) {\r\n // Slerp supported\r\n return constructor.Slerp(left, right, amount);\r\n } else if (left.toFixed) {\r\n // Number\r\n return left * (1.0 - amount) + amount * right;\r\n } else {\r\n // Blending not supported\r\n return right;\r\n }\r\n }\r\n\r\n /**\r\n * Parses an animation object and creates an animation\r\n * @param parsedAnimation Parsed animation object\r\n * @returns Animation object\r\n */\r\n public static Parse(parsedAnimation: any): Animation {\r\n const animation = new Animation(parsedAnimation.name, parsedAnimation.property, parsedAnimation.framePerSecond, parsedAnimation.dataType, parsedAnimation.loopBehavior);\r\n\r\n const dataType = parsedAnimation.dataType;\r\n const keys: Array = [];\r\n let data;\r\n let index: number;\r\n\r\n if (parsedAnimation.enableBlending) {\r\n animation.enableBlending = parsedAnimation.enableBlending;\r\n }\r\n\r\n if (parsedAnimation.blendingSpeed) {\r\n animation.blendingSpeed = parsedAnimation.blendingSpeed;\r\n }\r\n\r\n for (index = 0; index < parsedAnimation.keys.length; index++) {\r\n const key = parsedAnimation.keys[index];\r\n let inTangent: any = undefined;\r\n let outTangent: any = undefined;\r\n let interpolation: any = undefined;\r\n\r\n switch (dataType) {\r\n case Animation.ANIMATIONTYPE_FLOAT:\r\n data = key.values[0];\r\n if (key.values.length >= 2) {\r\n inTangent = key.values[1];\r\n }\r\n if (key.values.length >= 3) {\r\n outTangent = key.values[2];\r\n }\r\n if (key.values.length >= 4) {\r\n interpolation = key.values[3];\r\n }\r\n break;\r\n case Animation.ANIMATIONTYPE_QUATERNION:\r\n data = Quaternion.FromArray(key.values);\r\n if (key.values.length >= 8) {\r\n const _inTangent = Quaternion.FromArray(key.values.slice(4, 8));\r\n if (!_inTangent.equals(Quaternion.Zero())) {\r\n inTangent = _inTangent;\r\n }\r\n }\r\n if (key.values.length >= 12) {\r\n const _outTangent = Quaternion.FromArray(key.values.slice(8, 12));\r\n if (!_outTangent.equals(Quaternion.Zero())) {\r\n outTangent = _outTangent;\r\n }\r\n }\r\n if (key.values.length >= 13) {\r\n interpolation = key.values[12];\r\n }\r\n break;\r\n case Animation.ANIMATIONTYPE_MATRIX:\r\n data = Matrix.FromArray(key.values);\r\n if (key.values.length >= 17) {\r\n interpolation = key.values[16];\r\n }\r\n break;\r\n case Animation.ANIMATIONTYPE_COLOR3:\r\n data = Color3.FromArray(key.values);\r\n if (key.values[3]) {\r\n inTangent = Color3.FromArray(key.values[3]);\r\n }\r\n if (key.values[4]) {\r\n outTangent = Color3.FromArray(key.values[4]);\r\n }\r\n if (key.values[5]) {\r\n interpolation = key.values[5];\r\n }\r\n break;\r\n case Animation.ANIMATIONTYPE_COLOR4:\r\n data = Color4.FromArray(key.values);\r\n if (key.values[4]) {\r\n inTangent = Color4.FromArray(key.values[4]);\r\n }\r\n if (key.values[5]) {\r\n outTangent = Color4.FromArray(key.values[5]);\r\n }\r\n if (key.values[6]) {\r\n interpolation = Color4.FromArray(key.values[6]);\r\n }\r\n break;\r\n case Animation.ANIMATIONTYPE_VECTOR3:\r\n default:\r\n data = Vector3.FromArray(key.values);\r\n if (key.values[3]) {\r\n inTangent = Vector3.FromArray(key.values[3]);\r\n }\r\n if (key.values[4]) {\r\n outTangent = Vector3.FromArray(key.values[4]);\r\n }\r\n if (key.values[5]) {\r\n interpolation = key.values[5];\r\n }\r\n break;\r\n }\r\n\r\n const keyData: any = {};\r\n keyData.frame = key.frame;\r\n keyData.value = data;\r\n\r\n if (inTangent != undefined) {\r\n keyData.inTangent = inTangent;\r\n }\r\n if (outTangent != undefined) {\r\n keyData.outTangent = outTangent;\r\n }\r\n if (interpolation != undefined) {\r\n keyData.interpolation = interpolation;\r\n }\r\n keys.push(keyData);\r\n }\r\n\r\n animation.setKeys(keys);\r\n\r\n if (parsedAnimation.ranges) {\r\n for (index = 0; index < parsedAnimation.ranges.length; index++) {\r\n data = parsedAnimation.ranges[index];\r\n animation.createRange(data.name, data.from, data.to);\r\n }\r\n }\r\n\r\n return animation;\r\n }\r\n\r\n /**\r\n * Appends the serialized animations from the source animations\r\n * @param source Source containing the animations\r\n * @param destination Target to store the animations\r\n */\r\n public static AppendSerializedAnimations(source: IAnimatable, destination: any): void {\r\n SerializationHelper.AppendSerializedAnimations(source, destination);\r\n }\r\n\r\n /**\r\n * Creates a new animation or an array of animations from a snippet saved in a remote file\r\n * @param name defines the name of the animation to create (can be null or empty to use the one from the json data)\r\n * @param url defines the url to load from\r\n * @returns a promise that will resolve to the new animation or an array of animations\r\n */\r\n public static ParseFromFileAsync(name: Nullable, url: string): Promise> {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n let serializationObject = JSON.parse(request.responseText);\r\n if (serializationObject.animations) {\r\n serializationObject = serializationObject.animations;\r\n }\r\n\r\n if (serializationObject.length) {\r\n const output: Animation[] = [];\r\n for (const serializedAnimation of serializationObject) {\r\n output.push(this.Parse(serializedAnimation));\r\n }\r\n\r\n resolve(output);\r\n } else {\r\n const output = this.Parse(serializationObject);\r\n\r\n if (name) {\r\n output.name = name;\r\n }\r\n\r\n resolve(output);\r\n }\r\n } else {\r\n reject(\"Unable to load the animation\");\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", url);\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates an animation or an array of animations from a snippet saved by the Inspector\r\n * @param snippetId defines the snippet to load\r\n * @returns a promise that will resolve to the new animation or a new array of animations\r\n */\r\n public static ParseFromSnippetAsync(snippetId: string): Promise> {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n\r\n if (snippet.animations) {\r\n const serializationObject = JSON.parse(snippet.animations);\r\n const outputs: Animation[] = [];\r\n for (const serializedAnimation of serializationObject.animations) {\r\n const output = this.Parse(serializedAnimation);\r\n output.snippetId = snippetId;\r\n outputs.push(output);\r\n }\r\n\r\n resolve(outputs);\r\n } else {\r\n const serializationObject = JSON.parse(snippet.animation);\r\n const output = this.Parse(serializationObject);\r\n\r\n output.snippetId = snippetId;\r\n\r\n resolve(output);\r\n }\r\n } else {\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates an animation or an array of animations from a snippet saved by the Inspector\r\n * @deprecated Please use ParseFromSnippetAsync instead\r\n * @param snippetId defines the snippet to load\r\n * @returns a promise that will resolve to the new animation or a new array of animations\r\n */\r\n public static CreateFromSnippetAsync = Animation.ParseFromSnippetAsync;\r\n}\r\n\r\nRegisterClass(\"BABYLON.Animation\", Animation);\r\nNode._AnimationRangeFactory = (name: string, from: number, to: number) => new AnimationRange(name, from, to);\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n/**\r\n * Checks if the window object exists\r\n * @returns true if the window object exists\r\n */\r\nexport function IsWindowObjectExist(): boolean {\r\n return typeof window !== \"undefined\";\r\n}\r\n\r\n/**\r\n * Checks if the navigator object exists\r\n * @returns true if the navigator object exists\r\n */\r\nexport function IsNavigatorAvailable(): boolean {\r\n return typeof navigator !== \"undefined\";\r\n}\r\n\r\n/**\r\n * Check if the document object exists\r\n * @returns true if the document object exists\r\n */\r\nexport function IsDocumentAvailable(): boolean {\r\n return typeof document !== \"undefined\";\r\n}\r\n\r\n/**\r\n * Extracts text content from a DOM element hierarchy\r\n * @param element defines the root element\r\n * @returns a string\r\n */\r\nexport function GetDOMTextContent(element: HTMLElement): string {\r\n let result = \"\";\r\n let child = element.firstChild;\r\n\r\n while (child) {\r\n if (child.nodeType === 3) {\r\n result += child.textContent;\r\n }\r\n child = child.nextSibling;\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Sets of helpers dealing with the DOM and some of the recurrent functions needed in\r\n * Babylon.js\r\n */\r\nexport const DomManagement = {\r\n /**\r\n * Checks if the window object exists\r\n * @returns true if the window object exists\r\n */\r\n IsWindowObjectExist,\r\n\r\n /**\r\n * Checks if the navigator object exists\r\n * @returns true if the navigator object exists\r\n */\r\n IsNavigatorAvailable,\r\n\r\n /**\r\n * Check if the document object exists\r\n * @returns true if the document object exists\r\n */\r\n IsDocumentAvailable,\r\n /**\r\n * Extracts text content from a DOM element hierarchy\r\n * @param element defines the root element\r\n * @returns a string\r\n */\r\n GetDOMTextContent,\r\n};\r\n", "import { IsWindowObjectExist } from \"./domManagement\";\r\n\r\n/**\r\n * Class containing a set of static utilities functions for precision date\r\n */\r\nexport class PrecisionDate {\r\n /**\r\n * Gets either window.performance.now() if supported or Date.now() else\r\n */\r\n public static get Now(): number {\r\n if (IsWindowObjectExist() && window.performance && window.performance.now) {\r\n return window.performance.now();\r\n }\r\n\r\n return Date.now();\r\n }\r\n}\r\n", "/**\r\n * Class used to help managing file picking and drag'n'drop\r\n * File Storage\r\n */\r\nexport class FilesInputStore {\r\n /**\r\n * List of files ready to be loaded\r\n */\r\n public static FilesToLoad: { [key: string]: File } = {};\r\n}\r\n", "import type { WebRequest } from \"./webRequest\";\r\n\r\n/**\r\n * Class used to define a retry strategy when error happens while loading assets\r\n */\r\nexport class RetryStrategy {\r\n /**\r\n * Function used to defines an exponential back off strategy\r\n * @param maxRetries defines the maximum number of retries (3 by default)\r\n * @param baseInterval defines the interval between retries\r\n * @returns the strategy function to use\r\n */\r\n public static ExponentialBackoff(maxRetries = 3, baseInterval = 500) {\r\n return (url: string, request: WebRequest, retryIndex: number): number => {\r\n if (request.status !== 0 || retryIndex >= maxRetries || url.indexOf(\"file:\") !== -1) {\r\n return -1;\r\n }\r\n\r\n return Math.pow(2, retryIndex) * baseInterval;\r\n };\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n/**\r\n * Base error. Due to limitations of typedoc-check and missing documentation\r\n * in lib.es5.d.ts, cannot extend Error directly for RuntimeError.\r\n * @ignore\r\n */\r\nexport abstract class BaseError extends Error {\r\n // See https://stackoverflow.com/questions/12915412/how-do-i-extend-a-host-object-e-g-error-in-typescript\r\n // and https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n\r\n // Polyfill for Object.setPrototypeOf if necessary.\r\n protected static _setPrototypeOf: (o: any, proto: object | null) => any =\r\n (Object as any).setPrototypeOf ||\r\n ((o, proto) => {\r\n o.__proto__ = proto;\r\n return o;\r\n });\r\n}\r\n\r\n/* IMP! DO NOT CHANGE THE NUMBERING OF EXISTING ERROR CODES */\r\n/**\r\n * Error codes for BaseError\r\n */\r\nexport const ErrorCodes = {\r\n // Mesh errors 0-999\r\n /** Invalid or empty mesh vertex positions. */\r\n MeshInvalidPositionsError: 0,\r\n\r\n // Texture errors 1000-1999\r\n /** Unsupported texture found. */\r\n UnsupportedTextureError: 1000,\r\n\r\n // GLTFLoader errors 2000-2999\r\n /** Unexpected magic number found in GLTF file header. */\r\n GLTFLoaderUnexpectedMagicError: 2000,\r\n\r\n // SceneLoader errors 3000-3999\r\n /** SceneLoader generic error code. Ideally wraps the inner exception. */\r\n SceneLoaderError: 3000,\r\n\r\n // File related errors 4000-4999\r\n /** Load file error */\r\n LoadFileError: 4000,\r\n /** Request file error */\r\n RequestFileError: 4001,\r\n /** Read file error */\r\n ReadFileError: 4002,\r\n} as const;\r\n\r\n/**\r\n * Error code type\r\n */\r\nexport type ErrorCodesType = (typeof ErrorCodes)[keyof typeof ErrorCodes];\r\n\r\n/**\r\n * Application runtime error\r\n */\r\nexport class RuntimeError extends BaseError {\r\n /**\r\n * The error code\r\n */\r\n public errorCode: ErrorCodesType;\r\n\r\n /**\r\n * The error that caused this outer error\r\n */\r\n public innerError?: Error;\r\n\r\n /**\r\n * Creates a new RuntimeError\r\n * @param message defines the message of the error\r\n * @param errorCode the error code\r\n * @param innerError the error that caused the outer error\r\n */\r\n public constructor(message: string, errorCode: ErrorCodesType, innerError?: Error) {\r\n super(message);\r\n\r\n this.errorCode = errorCode;\r\n this.innerError = innerError;\r\n\r\n this.name = \"RuntimeError\";\r\n BaseError._setPrototypeOf(this, RuntimeError.prototype);\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n\r\n/**\r\n * Checks for a matching suffix at the end of a string (for ES5 and lower)\r\n * @param str Source string\r\n * @param suffix Suffix to search for in the source string\r\n * @returns Boolean indicating whether the suffix was found (true) or not (false)\r\n * @deprecated Please use native string function instead\r\n */\r\nexport const EndsWith = (str: string, suffix: string): boolean => {\r\n return str.endsWith(suffix);\r\n};\r\n\r\n/**\r\n * Checks for a matching suffix at the beginning of a string (for ES5 and lower)\r\n * @param str Source string\r\n * @param suffix Suffix to search for in the source string\r\n * @returns Boolean indicating whether the suffix was found (true) or not (false)\r\n * @deprecated Please use native string function instead\r\n */\r\nexport const StartsWith = (str: string, suffix: string): boolean => {\r\n if (!str) {\r\n return false;\r\n }\r\n return str.startsWith(suffix);\r\n};\r\n\r\n/**\r\n * Decodes a buffer into a string\r\n * @param buffer The buffer to decode\r\n * @returns The decoded string\r\n */\r\nexport const Decode = (buffer: Uint8Array | Uint16Array): string => {\r\n if (typeof TextDecoder !== \"undefined\") {\r\n return new TextDecoder().decode(buffer);\r\n }\r\n\r\n let result = \"\";\r\n for (let i = 0; i < buffer.byteLength; i++) {\r\n result += String.fromCharCode(buffer[i]);\r\n }\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Encode a buffer to a base64 string\r\n * @param buffer defines the buffer to encode\r\n * @returns the encoded string\r\n */\r\nexport const EncodeArrayBufferToBase64 = (buffer: ArrayBuffer | ArrayBufferView): string => {\r\n const keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\r\n let output = \"\";\r\n let chr1, chr2, chr3, enc1, enc2, enc3, enc4;\r\n let i = 0;\r\n const bytes = ArrayBuffer.isView(buffer) ? new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength) : new Uint8Array(buffer);\r\n\r\n while (i < bytes.length) {\r\n chr1 = bytes[i++];\r\n chr2 = i < bytes.length ? bytes[i++] : Number.NaN;\r\n chr3 = i < bytes.length ? bytes[i++] : Number.NaN;\r\n\r\n enc1 = chr1 >> 2;\r\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\r\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\r\n enc4 = chr3 & 63;\r\n\r\n if (isNaN(chr2)) {\r\n enc3 = enc4 = 64;\r\n } else if (isNaN(chr3)) {\r\n enc4 = 64;\r\n }\r\n output += keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);\r\n }\r\n\r\n return output;\r\n};\r\n\r\n/**\r\n * Converts a given base64 string as an ASCII encoded stream of data\r\n * @param base64Data The base64 encoded string to decode\r\n * @returns Decoded ASCII string\r\n */\r\nexport const DecodeBase64ToString = (base64Data: string): string => {\r\n return atob(base64Data);\r\n};\r\n\r\n/**\r\n * Converts a given base64 string into an ArrayBuffer of raw byte data\r\n * @param base64Data The base64 encoded string to decode\r\n * @returns ArrayBuffer of byte data\r\n */\r\nexport const DecodeBase64ToBinary = (base64Data: string): ArrayBuffer => {\r\n const decodedString = DecodeBase64ToString(base64Data);\r\n const bufferLength = decodedString.length;\r\n const bufferView = new Uint8Array(new ArrayBuffer(bufferLength));\r\n\r\n for (let i = 0; i < bufferLength; i++) {\r\n bufferView[i] = decodedString.charCodeAt(i);\r\n }\r\n\r\n return bufferView.buffer;\r\n};\r\n\r\n/**\r\n * Converts a number to string and pads with preceding zeroes until it is of specified length.\r\n * @param num the number to convert and pad\r\n * @param length the expected length of the string\r\n * @returns the padded string\r\n */\r\nexport const PadNumber = (num: number, length: number): string => {\r\n let str = String(num);\r\n while (str.length < length) {\r\n str = \"0\" + str;\r\n }\r\n return str;\r\n};\r\n/**\r\n * Helper to manipulate strings\r\n */\r\nexport const StringTools = {\r\n EndsWith,\r\n StartsWith,\r\n Decode,\r\n EncodeArrayBufferToBase64,\r\n DecodeBase64ToString,\r\n DecodeBase64ToBinary,\r\n PadNumber,\r\n};\r\n", "/**\r\n * Language of the shader code\r\n */\r\nexport enum ShaderLanguage {\r\n /** language is GLSL (used by WebGL) */\r\n GLSL,\r\n /** language is WGSL (used by WebGPU) */\r\n WGSL,\r\n}\r\n", "import { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines the shader related stores and directory\r\n */\r\nexport class ShaderStore {\r\n /**\r\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\r\n */\r\n public static ShadersRepository = \"src/Shaders/\";\r\n /**\r\n * Store of each shader (The can be looked up using effect.key)\r\n */\r\n public static ShadersStore: { [key: string]: string } = {};\r\n /**\r\n * Store of each included file for a shader (The can be looked up using effect.key)\r\n */\r\n public static IncludesShadersStore: { [key: string]: string } = {};\r\n\r\n /**\r\n * Gets or sets the relative url used to load shaders (WGSL) if using the engine in non-minified mode\r\n */\r\n public static ShadersRepositoryWGSL = \"src/ShadersWGSL/\";\r\n /**\r\n * Store of each shader (WGSL)\r\n */\r\n public static ShadersStoreWGSL: { [key: string]: string } = {};\r\n /**\r\n * Store of each included file for a shader (WGSL)\r\n */\r\n public static IncludesShadersStoreWGSL: { [key: string]: string } = {};\r\n\r\n /**\r\n * Gets the shaders repository path for a given shader language\r\n * @param shaderLanguage the shader language\r\n * @returns the path to the shaders repository\r\n */\r\n public static GetShadersRepository(shaderLanguage = ShaderLanguage.GLSL): string {\r\n return shaderLanguage === ShaderLanguage.GLSL ? ShaderStore.ShadersRepository : ShaderStore.ShadersRepositoryWGSL;\r\n }\r\n\r\n /**\r\n * Gets the shaders store of a given shader language\r\n * @param shaderLanguage the shader language\r\n * @returns the shaders store\r\n */\r\n public static GetShadersStore(shaderLanguage = ShaderLanguage.GLSL): { [key: string]: string } {\r\n return shaderLanguage === ShaderLanguage.GLSL ? ShaderStore.ShadersStore : ShaderStore.ShadersStoreWGSL;\r\n }\r\n\r\n /**\r\n * Gets the include shaders store of a given shader language\r\n * @param shaderLanguage the shader language\r\n * @returns the include shaders store\r\n */\r\n public static GetIncludesShadersStore(shaderLanguage = ShaderLanguage.GLSL): { [key: string]: string } {\r\n return shaderLanguage === ShaderLanguage.GLSL ? ShaderStore.IncludesShadersStore : ShaderStore.IncludesShadersStoreWGSL;\r\n }\r\n}\r\n", "import type { ProcessingOptions } from \"./shaderProcessingOptions\";\r\n\r\nconst defaultAttributeKeywordName = \"attribute\";\r\nconst defaultVaryingKeywordName = \"varying\";\r\n\r\n/** @internal */\r\nexport class ShaderCodeNode {\r\n line: string;\r\n children: ShaderCodeNode[] = [];\r\n additionalDefineKey?: string;\r\n additionalDefineValue?: string;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n isValid(preprocessors: { [key: string]: string }): boolean {\r\n return true;\r\n }\r\n\r\n process(preprocessors: { [key: string]: string }, options: ProcessingOptions): string {\r\n let result = \"\";\r\n if (this.line) {\r\n let value: string = this.line;\r\n const processor = options.processor;\r\n if (processor) {\r\n // This must be done before other replacements to avoid mistakenly changing something that was already changed.\r\n if (processor.lineProcessor) {\r\n value = processor.lineProcessor(value, options.isFragment, options.processingContext);\r\n }\r\n\r\n const attributeKeyword = options.processor?.attributeKeywordName ?? defaultAttributeKeywordName;\r\n const varyingKeyword =\r\n options.isFragment && options.processor?.varyingFragmentKeywordName\r\n ? options.processor?.varyingFragmentKeywordName\r\n : !options.isFragment && options.processor?.varyingVertexKeywordName\r\n ? options.processor?.varyingVertexKeywordName\r\n : defaultVaryingKeywordName;\r\n\r\n if (!options.isFragment && processor.attributeProcessor && this.line.startsWith(attributeKeyword)) {\r\n value = processor.attributeProcessor(this.line, preprocessors, options.processingContext);\r\n } else if (\r\n processor.varyingProcessor &&\r\n (processor.varyingCheck?.(this.line, options.isFragment) || (!processor.varyingCheck && this.line.startsWith(varyingKeyword)))\r\n ) {\r\n value = processor.varyingProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n } else if (processor.uniformProcessor && processor.uniformRegexp && processor.uniformRegexp.test(this.line)) {\r\n if (!options.lookForClosingBracketForUniformBuffer) {\r\n value = processor.uniformProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n }\r\n } else if (processor.uniformBufferProcessor && processor.uniformBufferRegexp && processor.uniformBufferRegexp.test(this.line)) {\r\n if (!options.lookForClosingBracketForUniformBuffer) {\r\n value = processor.uniformBufferProcessor(this.line, options.isFragment, options.processingContext);\r\n options.lookForClosingBracketForUniformBuffer = true;\r\n }\r\n } else if (processor.textureProcessor && processor.textureRegexp && processor.textureRegexp.test(this.line)) {\r\n value = processor.textureProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n } else if ((processor.uniformProcessor || processor.uniformBufferProcessor) && this.line.startsWith(\"uniform\") && !options.lookForClosingBracketForUniformBuffer) {\r\n const regex = /uniform\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/;\r\n\r\n if (regex.test(this.line)) {\r\n // uniform\r\n if (processor.uniformProcessor) {\r\n value = processor.uniformProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n }\r\n } else {\r\n // Uniform buffer\r\n if (processor.uniformBufferProcessor) {\r\n value = processor.uniformBufferProcessor(this.line, options.isFragment, options.processingContext);\r\n options.lookForClosingBracketForUniformBuffer = true;\r\n }\r\n }\r\n }\r\n\r\n if (options.lookForClosingBracketForUniformBuffer && this.line.indexOf(\"}\") !== -1) {\r\n options.lookForClosingBracketForUniformBuffer = false;\r\n if (processor.endOfUniformBufferProcessor) {\r\n value = processor.endOfUniformBufferProcessor(this.line, options.isFragment, options.processingContext);\r\n }\r\n }\r\n }\r\n\r\n result += value + \"\\n\";\r\n }\r\n\r\n this.children.forEach((child) => {\r\n result += child.process(preprocessors, options);\r\n });\r\n\r\n if (this.additionalDefineKey) {\r\n preprocessors[this.additionalDefineKey] = this.additionalDefineValue || \"true\";\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n", "/** @internal */\r\nexport class ShaderCodeCursor {\r\n private _lines: string[] = [];\r\n lineIndex: number;\r\n\r\n get currentLine(): string {\r\n return this._lines[this.lineIndex];\r\n }\r\n\r\n get canRead(): boolean {\r\n return this.lineIndex < this._lines.length - 1;\r\n }\r\n\r\n set lines(value: string[]) {\r\n this._lines.length = 0;\r\n\r\n for (const line of value) {\r\n // Skip empty lines\r\n if (!line || line === \"\\r\") {\r\n continue;\r\n }\r\n\r\n // Prevent removing line break in macros.\r\n if (line[0] === \"#\") {\r\n this._lines.push(line);\r\n continue;\r\n }\r\n\r\n // Do not split single line comments\r\n const trimmedLine = line.trim();\r\n\r\n if (!trimmedLine) {\r\n continue;\r\n }\r\n\r\n if (trimmedLine.startsWith(\"//\")) {\r\n this._lines.push(line);\r\n continue;\r\n }\r\n\r\n // Work with semicolon in the line\r\n const semicolonIndex = trimmedLine.indexOf(\";\");\r\n\r\n if (semicolonIndex === -1) {\r\n // No semicolon in the line\r\n this._lines.push(trimmedLine);\r\n } else if (semicolonIndex === trimmedLine.length - 1) {\r\n // Single semicolon at the end of the line\r\n // If trimmedLine == \";\", we must not push, to be backward compatible with the old code!\r\n if (trimmedLine.length > 1) {\r\n this._lines.push(trimmedLine);\r\n }\r\n } else {\r\n // Semicolon in the middle of the line\r\n const split = line.split(\";\");\r\n\r\n for (let index = 0; index < split.length; index++) {\r\n let subLine = split[index];\r\n\r\n if (!subLine) {\r\n continue;\r\n }\r\n\r\n subLine = subLine.trim();\r\n\r\n if (!subLine) {\r\n continue;\r\n }\r\n\r\n this._lines.push(subLine + (index !== split.length - 1 ? \";\" : \"\"));\r\n }\r\n }\r\n }\r\n }\r\n}\r\n", "import { ShaderCodeNode } from \"./shaderCodeNode\";\r\nimport type { ProcessingOptions } from \"./shaderProcessingOptions\";\r\n\r\n/** @internal */\r\nexport class ShaderCodeConditionNode extends ShaderCodeNode {\r\n process(preprocessors: { [key: string]: string }, options: ProcessingOptions) {\r\n for (let index = 0; index < this.children.length; index++) {\r\n const node = this.children[index];\r\n\r\n if (node.isValid(preprocessors)) {\r\n return node.process(preprocessors, options);\r\n }\r\n }\r\n\r\n return \"\";\r\n }\r\n}\r\n", "import { ShaderCodeNode } from \"./shaderCodeNode\";\r\nimport type { ShaderDefineExpression } from \"./Expressions/shaderDefineExpression\";\r\n\r\n/** @internal */\r\nexport class ShaderCodeTestNode extends ShaderCodeNode {\r\n public testExpression: ShaderDefineExpression;\r\n\r\n public isValid(preprocessors: { [key: string]: string }) {\r\n return this.testExpression.isTrue(preprocessors);\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n/** @internal */\r\nexport class ShaderDefineExpression {\r\n /**\r\n * Cache items count limit for the InfixToPostfix cache.\r\n * It uses to improve the performance of the shader compilation.\r\n * For details see PR: https://github.com/BabylonJS/Babylon.js/pull/13936\r\n */\r\n static InfixToPostfixCacheLimitSize = 50000;\r\n\r\n /**\r\n * When the cache size is exceeded, a cache cleanup will be triggered\r\n * and the cache will be reduced by the size specified\r\n * in the InfixToPostfixCacheCleanupSize variable, removing entries\r\n * that have not been accessed the longest.\r\n */\r\n static InfixToPostfixCacheCleanupSize = 25000;\r\n\r\n protected static _InfixToPostfixCache: Map<\r\n string,\r\n {\r\n accessTime: number;\r\n result: string[];\r\n }\r\n > = new Map();\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isTrue(preprocessors: { [key: string]: string }): boolean {\r\n return true;\r\n }\r\n\r\n private static _OperatorPriority: { [name: string]: number } = {\r\n \")\": 0,\r\n \"(\": 1,\r\n \"||\": 2,\r\n \"&&\": 3,\r\n };\r\n\r\n private static _Stack = [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\r\n\r\n public static postfixToInfix(postfix: string[]): string {\r\n const stack: string[] = [];\r\n\r\n for (const c of postfix) {\r\n if (ShaderDefineExpression._OperatorPriority[c] === undefined) {\r\n stack.push(c);\r\n } else {\r\n const v1 = stack[stack.length - 1],\r\n v2 = stack[stack.length - 2];\r\n\r\n stack.length -= 2;\r\n stack.push(`(${v2}${c}${v1})`);\r\n }\r\n }\r\n\r\n return stack[stack.length - 1];\r\n }\r\n\r\n /**\r\n * Converts an infix expression to a postfix expression.\r\n *\r\n * This method is used to transform infix expressions, which are more human-readable,\r\n * into postfix expressions, also known as Reverse Polish Notation (RPN), that can be\r\n * evaluated more efficiently by a computer. The conversion is based on the operator\r\n * priority defined in _OperatorPriority.\r\n *\r\n * The function employs a stack-based algorithm for the conversion and caches the result\r\n * to improve performance. The cache keeps track of each converted expression's access time\r\n * to manage the cache size and optimize memory usage. When the cache size exceeds a specified\r\n * limit, the least recently accessed items in the cache are deleted.\r\n *\r\n * The cache mechanism is particularly helpful for shader compilation, where the same infix\r\n * expressions might be encountered repeatedly, hence the caching can speed up the process.\r\n *\r\n * @param infix - The infix expression to be converted.\r\n * @returns The postfix expression as an array of strings.\r\n */\r\n public static infixToPostfix(infix: string): string[] {\r\n // Is infix already in cache\r\n const cacheItem = ShaderDefineExpression._InfixToPostfixCache.get(infix);\r\n if (cacheItem) {\r\n cacheItem.accessTime = Date.now();\r\n return cacheItem.result;\r\n }\r\n\r\n // Is infix contain any operator\r\n if (!infix.includes(\"&&\") && !infix.includes(\"||\") && !infix.includes(\")\") && !infix.includes(\"(\")) {\r\n return [infix];\r\n }\r\n\r\n const result: string[] = [];\r\n\r\n let stackIdx = -1;\r\n\r\n const pushOperand = () => {\r\n operand = operand.trim();\r\n if (operand !== \"\") {\r\n result.push(operand);\r\n operand = \"\";\r\n }\r\n };\r\n\r\n const push = (s: string) => {\r\n if (stackIdx < ShaderDefineExpression._Stack.length - 1) {\r\n ShaderDefineExpression._Stack[++stackIdx] = s;\r\n }\r\n };\r\n\r\n const peek = () => ShaderDefineExpression._Stack[stackIdx];\r\n\r\n const pop = () => (stackIdx === -1 ? \"!!INVALID EXPRESSION!!\" : ShaderDefineExpression._Stack[stackIdx--]);\r\n\r\n let idx = 0,\r\n operand = \"\";\r\n\r\n while (idx < infix.length) {\r\n const c = infix.charAt(idx),\r\n token = idx < infix.length - 1 ? infix.substr(idx, 2) : \"\";\r\n\r\n if (c === \"(\") {\r\n operand = \"\";\r\n push(c);\r\n } else if (c === \")\") {\r\n pushOperand();\r\n while (stackIdx !== -1 && peek() !== \"(\") {\r\n result.push(pop());\r\n }\r\n pop();\r\n } else if (ShaderDefineExpression._OperatorPriority[token] > 1) {\r\n pushOperand();\r\n while (stackIdx !== -1 && ShaderDefineExpression._OperatorPriority[peek()] >= ShaderDefineExpression._OperatorPriority[token]) {\r\n result.push(pop());\r\n }\r\n push(token);\r\n idx++;\r\n } else {\r\n operand += c;\r\n }\r\n idx++;\r\n }\r\n\r\n pushOperand();\r\n\r\n while (stackIdx !== -1) {\r\n if (peek() === \"(\") {\r\n pop();\r\n } else {\r\n result.push(pop());\r\n }\r\n }\r\n\r\n // If the cache is at capacity, clear it before adding a new item\r\n if (ShaderDefineExpression._InfixToPostfixCache.size >= ShaderDefineExpression.InfixToPostfixCacheLimitSize) {\r\n ShaderDefineExpression.ClearCache();\r\n }\r\n\r\n // Add the new item to the cache, including the current time as the last access time\r\n ShaderDefineExpression._InfixToPostfixCache.set(infix, { result, accessTime: Date.now() });\r\n\r\n return result;\r\n }\r\n\r\n private static ClearCache(): void {\r\n // Convert the cache to an array and sort by last access time\r\n const sortedCache = Array.from(ShaderDefineExpression._InfixToPostfixCache.entries()).sort((a, b) => a[1].accessTime - b[1].accessTime);\r\n\r\n // Remove the least recently accessed half of the cache\r\n for (let i = 0; i < ShaderDefineExpression.InfixToPostfixCacheCleanupSize; i++) {\r\n ShaderDefineExpression._InfixToPostfixCache.delete(sortedCache[i][0]);\r\n }\r\n }\r\n}\r\n", "import { ShaderDefineExpression } from \"../shaderDefineExpression\";\r\n\r\n/** @internal */\r\nexport class ShaderDefineIsDefinedOperator extends ShaderDefineExpression {\r\n public constructor(\r\n public define: string,\r\n public not: boolean = false\r\n ) {\r\n super();\r\n }\r\n\r\n public isTrue(preprocessors: { [key: string]: string }) {\r\n let condition = preprocessors[this.define] !== undefined;\r\n\r\n if (this.not) {\r\n condition = !condition;\r\n }\r\n\r\n return condition;\r\n }\r\n}\r\n", "import { ShaderDefineExpression } from \"../shaderDefineExpression\";\r\n\r\n/** @internal */\r\nexport class ShaderDefineOrOperator extends ShaderDefineExpression {\r\n public leftOperand: ShaderDefineExpression;\r\n public rightOperand: ShaderDefineExpression;\r\n\r\n public isTrue(preprocessors: { [key: string]: string }): boolean {\r\n return this.leftOperand.isTrue(preprocessors) || this.rightOperand.isTrue(preprocessors);\r\n }\r\n}\r\n", "import { ShaderDefineExpression } from \"../shaderDefineExpression\";\r\n\r\n/** @internal */\r\nexport class ShaderDefineAndOperator extends ShaderDefineExpression {\r\n public leftOperand: ShaderDefineExpression;\r\n public rightOperand: ShaderDefineExpression;\r\n\r\n public isTrue(preprocessors: { [key: string]: string }): boolean {\r\n return this.leftOperand.isTrue(preprocessors) && this.rightOperand.isTrue(preprocessors);\r\n }\r\n}\r\n", "import { ShaderDefineExpression } from \"../shaderDefineExpression\";\r\n\r\n/** @internal */\r\nexport class ShaderDefineArithmeticOperator extends ShaderDefineExpression {\r\n public constructor(\r\n public define: string,\r\n public operand: string,\r\n public testValue: string\r\n ) {\r\n super();\r\n }\r\n\r\n public isTrue(preprocessors: { [key: string]: string }) {\r\n let value = preprocessors[this.define];\r\n\r\n if (value === undefined) {\r\n value = this.define;\r\n }\r\n\r\n let condition = false;\r\n const left = parseInt(value);\r\n const right = parseInt(this.testValue);\r\n\r\n switch (this.operand) {\r\n case \">\":\r\n condition = left > right;\r\n break;\r\n case \"<\":\r\n condition = left < right;\r\n break;\r\n case \"<=\":\r\n condition = left <= right;\r\n break;\r\n case \">=\":\r\n condition = left >= right;\r\n break;\r\n case \"==\":\r\n condition = left === right;\r\n break;\r\n case \"!=\":\r\n condition = left !== right;\r\n break;\r\n }\r\n\r\n return condition;\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { ShaderCodeNode } from \"./shaderCodeNode\";\r\nimport { ShaderCodeCursor } from \"./shaderCodeCursor\";\r\nimport { ShaderCodeConditionNode } from \"./shaderCodeConditionNode\";\r\nimport { ShaderCodeTestNode } from \"./shaderCodeTestNode\";\r\nimport { ShaderDefineIsDefinedOperator } from \"./Expressions/Operators/shaderDefineIsDefinedOperator\";\r\nimport { ShaderDefineOrOperator } from \"./Expressions/Operators/shaderDefineOrOperator\";\r\nimport { ShaderDefineAndOperator } from \"./Expressions/Operators/shaderDefineAndOperator\";\r\nimport { ShaderDefineExpression } from \"./Expressions/shaderDefineExpression\";\r\nimport { ShaderDefineArithmeticOperator } from \"./Expressions/Operators/shaderDefineArithmeticOperator\";\r\nimport type { ProcessingOptions } from \"./shaderProcessingOptions\";\r\nimport { _WarnImport } from \"../../Misc/devTools\";\r\nimport { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\n\r\nimport type { WebRequest } from \"../../Misc/webRequest\";\r\nimport type { LoadFileError } from \"../../Misc/fileTools\";\r\nimport type { IOfflineProvider } from \"../../Offline/IOfflineProvider\";\r\nimport type { IFileRequest } from \"../../Misc/fileRequest\";\r\nimport type { ThinEngine } from \"../thinEngine\";\r\n\r\nconst regexSE = /defined\\s*?\\((.+?)\\)/g;\r\nconst regexSERevert = /defined\\s*?\\[(.+?)\\]/g;\r\nconst regexShaderInclude = /#include\\s?<(.+)>(\\((.*)\\))*(\\[(.*)\\])*/g;\r\nconst regexShaderDecl = /__decl__/;\r\nconst regexLightX = /light\\{X\\}.(\\w*)/g;\r\nconst regexX = /\\{X\\}/g;\r\nconst reusableMatches: RegExpMatchArray[] = [];\r\n\r\n/** @internal */\r\nexport class ShaderProcessor {\r\n private static _MoveCursorRegex = /(#ifdef)|(#else)|(#elif)|(#endif)|(#ifndef)|(#if)/;\r\n\r\n public static Initialize(options: ProcessingOptions): void {\r\n if (options.processor && options.processor.initializeShaders) {\r\n options.processor.initializeShaders(options.processingContext);\r\n }\r\n }\r\n\r\n public static Process(sourceCode: string, options: ProcessingOptions, callback: (migratedCode: string, codeBeforeMigration: string) => void, engine: ThinEngine) {\r\n if (options.processor?.preProcessShaderCode) {\r\n sourceCode = options.processor.preProcessShaderCode(sourceCode, options.isFragment);\r\n }\r\n this._ProcessIncludes(sourceCode, options, (codeWithIncludes) => {\r\n if (options.processCodeAfterIncludes) {\r\n codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? \"fragment\" : \"vertex\", codeWithIncludes);\r\n }\r\n const migratedCode = this._ProcessShaderConversion(codeWithIncludes, options, engine);\r\n callback(migratedCode, codeWithIncludes);\r\n });\r\n }\r\n\r\n public static PreProcess(sourceCode: string, options: ProcessingOptions, callback: (migratedCode: string, codeBeforeMigration: string) => void, engine: ThinEngine) {\r\n if (options.processor?.preProcessShaderCode) {\r\n sourceCode = options.processor.preProcessShaderCode(sourceCode, options.isFragment);\r\n }\r\n this._ProcessIncludes(sourceCode, options, (codeWithIncludes) => {\r\n if (options.processCodeAfterIncludes) {\r\n codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? \"fragment\" : \"vertex\", codeWithIncludes);\r\n }\r\n const migratedCode = this._ApplyPreProcessing(codeWithIncludes, options, engine);\r\n callback(migratedCode, codeWithIncludes);\r\n });\r\n }\r\n\r\n public static Finalize(vertexCode: string, fragmentCode: string, options: ProcessingOptions): { vertexCode: string; fragmentCode: string } {\r\n if (!options.processor || !options.processor.finalizeShaders) {\r\n return { vertexCode, fragmentCode };\r\n }\r\n\r\n return options.processor.finalizeShaders(vertexCode, fragmentCode, options.processingContext);\r\n }\r\n\r\n private static _ProcessPrecision(source: string, options: ProcessingOptions): string {\r\n if (options.processor?.noPrecision) {\r\n return source;\r\n }\r\n\r\n const shouldUseHighPrecisionShader = options.shouldUseHighPrecisionShader;\r\n\r\n if (source.indexOf(\"precision highp float\") === -1) {\r\n if (!shouldUseHighPrecisionShader) {\r\n source = \"precision mediump float;\\n\" + source;\r\n } else {\r\n source = \"precision highp float;\\n\" + source;\r\n }\r\n } else {\r\n if (!shouldUseHighPrecisionShader) {\r\n // Moving highp to mediump\r\n source = source.replace(\"precision highp float\", \"precision mediump float\");\r\n }\r\n }\r\n\r\n return source;\r\n }\r\n\r\n private static _ExtractOperation(expression: string) {\r\n const regex = /defined\\((.+)\\)/;\r\n\r\n const match = regex.exec(expression);\r\n\r\n if (match && match.length) {\r\n return new ShaderDefineIsDefinedOperator(match[1].trim(), expression[0] === \"!\");\r\n }\r\n\r\n const operators = [\"==\", \"!=\", \">=\", \"<=\", \"<\", \">\"];\r\n let operator = \"\";\r\n let indexOperator = 0;\r\n\r\n for (operator of operators) {\r\n indexOperator = expression.indexOf(operator);\r\n\r\n if (indexOperator > -1) {\r\n break;\r\n }\r\n }\r\n\r\n if (indexOperator === -1) {\r\n return new ShaderDefineIsDefinedOperator(expression);\r\n }\r\n\r\n const define = expression.substring(0, indexOperator).trim();\r\n const value = expression.substring(indexOperator + operator.length).trim();\r\n\r\n return new ShaderDefineArithmeticOperator(define, operator, value);\r\n }\r\n\r\n private static _BuildSubExpression(expression: string): ShaderDefineExpression {\r\n expression = expression.replace(regexSE, \"defined[$1]\");\r\n\r\n const postfix = ShaderDefineExpression.infixToPostfix(expression);\r\n\r\n const stack: (string | ShaderDefineExpression)[] = [];\r\n\r\n for (const c of postfix) {\r\n if (c !== \"||\" && c !== \"&&\") {\r\n stack.push(c);\r\n } else if (stack.length >= 2) {\r\n let v1 = stack[stack.length - 1],\r\n v2 = stack[stack.length - 2];\r\n\r\n stack.length -= 2;\r\n\r\n const operator = c == \"&&\" ? new ShaderDefineAndOperator() : new ShaderDefineOrOperator();\r\n\r\n if (typeof v1 === \"string\") {\r\n v1 = v1.replace(regexSERevert, \"defined($1)\");\r\n }\r\n\r\n if (typeof v2 === \"string\") {\r\n v2 = v2.replace(regexSERevert, \"defined($1)\");\r\n }\r\n\r\n operator.leftOperand = typeof v2 === \"string\" ? this._ExtractOperation(v2) : v2;\r\n operator.rightOperand = typeof v1 === \"string\" ? this._ExtractOperation(v1) : v1;\r\n\r\n stack.push(operator);\r\n }\r\n }\r\n\r\n let result = stack[stack.length - 1];\r\n\r\n if (typeof result === \"string\") {\r\n result = result.replace(regexSERevert, \"defined($1)\");\r\n }\r\n\r\n // note: stack.length !== 1 if there was an error in the parsing\r\n\r\n return typeof result === \"string\" ? this._ExtractOperation(result) : result;\r\n }\r\n\r\n private static _BuildExpression(line: string, start: number): ShaderCodeTestNode {\r\n const node = new ShaderCodeTestNode();\r\n const command = line.substring(0, start);\r\n let expression = line.substring(start);\r\n\r\n expression = expression.substring(0, (expression.indexOf(\"//\") + 1 || expression.length + 1) - 1).trim();\r\n\r\n if (command === \"#ifdef\") {\r\n node.testExpression = new ShaderDefineIsDefinedOperator(expression);\r\n } else if (command === \"#ifndef\") {\r\n node.testExpression = new ShaderDefineIsDefinedOperator(expression, true);\r\n } else {\r\n node.testExpression = this._BuildSubExpression(expression);\r\n }\r\n\r\n return node;\r\n }\r\n\r\n private static _MoveCursorWithinIf(cursor: ShaderCodeCursor, rootNode: ShaderCodeConditionNode, ifNode: ShaderCodeNode) {\r\n let line = cursor.currentLine;\r\n while (this._MoveCursor(cursor, ifNode)) {\r\n line = cursor.currentLine;\r\n const first5 = line.substring(0, 5).toLowerCase();\r\n\r\n if (first5 === \"#else\") {\r\n const elseNode = new ShaderCodeNode();\r\n rootNode.children.push(elseNode);\r\n this._MoveCursor(cursor, elseNode);\r\n return;\r\n } else if (first5 === \"#elif\") {\r\n const elifNode = this._BuildExpression(line, 5);\r\n\r\n rootNode.children.push(elifNode);\r\n ifNode = elifNode;\r\n }\r\n }\r\n }\r\n\r\n private static _MoveCursor(cursor: ShaderCodeCursor, rootNode: ShaderCodeNode): boolean {\r\n while (cursor.canRead) {\r\n cursor.lineIndex++;\r\n const line = cursor.currentLine;\r\n\r\n if (line.indexOf(\"#\") >= 0) {\r\n const matches = ShaderProcessor._MoveCursorRegex.exec(line);\r\n\r\n if (matches && matches.length) {\r\n const keyword = matches[0];\r\n\r\n switch (keyword) {\r\n case \"#ifdef\": {\r\n const newRootNode = new ShaderCodeConditionNode();\r\n rootNode.children.push(newRootNode);\r\n\r\n const ifNode = this._BuildExpression(line, 6);\r\n newRootNode.children.push(ifNode);\r\n this._MoveCursorWithinIf(cursor, newRootNode, ifNode);\r\n break;\r\n }\r\n case \"#else\":\r\n case \"#elif\":\r\n return true;\r\n case \"#endif\":\r\n return false;\r\n case \"#ifndef\": {\r\n const newRootNode = new ShaderCodeConditionNode();\r\n rootNode.children.push(newRootNode);\r\n\r\n const ifNode = this._BuildExpression(line, 7);\r\n newRootNode.children.push(ifNode);\r\n this._MoveCursorWithinIf(cursor, newRootNode, ifNode);\r\n break;\r\n }\r\n case \"#if\": {\r\n const newRootNode = new ShaderCodeConditionNode();\r\n const ifNode = this._BuildExpression(line, 3);\r\n rootNode.children.push(newRootNode);\r\n\r\n newRootNode.children.push(ifNode);\r\n this._MoveCursorWithinIf(cursor, newRootNode, ifNode);\r\n break;\r\n }\r\n }\r\n continue;\r\n }\r\n }\r\n\r\n const newNode = new ShaderCodeNode();\r\n newNode.line = line;\r\n rootNode.children.push(newNode);\r\n\r\n // Detect additional defines\r\n if (line[0] === \"#\" && line[1] === \"d\") {\r\n const split = line.replace(\";\", \"\").split(\" \");\r\n newNode.additionalDefineKey = split[1];\r\n\r\n if (split.length === 3) {\r\n newNode.additionalDefineValue = split[2];\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private static _EvaluatePreProcessors(sourceCode: string, preprocessors: { [key: string]: string }, options: ProcessingOptions): string {\r\n const rootNode = new ShaderCodeNode();\r\n const cursor = new ShaderCodeCursor();\r\n\r\n cursor.lineIndex = -1;\r\n cursor.lines = sourceCode.split(\"\\n\");\r\n\r\n // Decompose (We keep it in 2 steps so it is easier to maintain and perf hit is insignificant)\r\n this._MoveCursor(cursor, rootNode);\r\n\r\n // Recompose\r\n return rootNode.process(preprocessors, options);\r\n }\r\n\r\n private static _PreparePreProcessors(options: ProcessingOptions, engine: ThinEngine): { [key: string]: string } {\r\n const defines = options.defines;\r\n const preprocessors: { [key: string]: string } = {};\r\n\r\n for (const define of defines) {\r\n const keyValue = define.replace(\"#define\", \"\").replace(\";\", \"\").trim();\r\n const split = keyValue.split(\" \");\r\n preprocessors[split[0]] = split.length > 1 ? split[1] : \"\";\r\n }\r\n\r\n if (options.processor?.shaderLanguage === ShaderLanguage.GLSL) {\r\n preprocessors[\"GL_ES\"] = \"true\";\r\n }\r\n preprocessors[\"__VERSION__\"] = options.version;\r\n preprocessors[options.platformName] = \"true\";\r\n\r\n engine._getGlobalDefines(preprocessors);\r\n\r\n return preprocessors;\r\n }\r\n\r\n private static _ProcessShaderConversion(sourceCode: string, options: ProcessingOptions, engine: ThinEngine): string {\r\n let preparedSourceCode = this._ProcessPrecision(sourceCode, options);\r\n\r\n if (!options.processor) {\r\n return preparedSourceCode;\r\n }\r\n\r\n // Already converted\r\n if (options.processor.shaderLanguage === ShaderLanguage.GLSL && preparedSourceCode.indexOf(\"#version 3\") !== -1) {\r\n preparedSourceCode = preparedSourceCode.replace(\"#version 300 es\", \"\");\r\n if (!options.processor.parseGLES3) {\r\n return preparedSourceCode;\r\n }\r\n }\r\n\r\n const defines = options.defines;\r\n\r\n const preprocessors = this._PreparePreProcessors(options, engine);\r\n\r\n // General pre processing\r\n if (options.processor.preProcessor) {\r\n preparedSourceCode = options.processor.preProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext);\r\n }\r\n\r\n preparedSourceCode = this._EvaluatePreProcessors(preparedSourceCode, preprocessors, options);\r\n\r\n // Post processing\r\n if (options.processor.postProcessor) {\r\n preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext, engine);\r\n }\r\n\r\n // Inline functions tagged with #define inline\r\n if (engine._features.needShaderCodeInlining) {\r\n preparedSourceCode = engine.inlineShaderCode(preparedSourceCode);\r\n }\r\n\r\n return preparedSourceCode;\r\n }\r\n\r\n private static _ApplyPreProcessing(sourceCode: string, options: ProcessingOptions, engine: ThinEngine): string {\r\n let preparedSourceCode = sourceCode;\r\n\r\n const defines = options.defines;\r\n\r\n const preprocessors = this._PreparePreProcessors(options, engine);\r\n\r\n // General pre processing\r\n if (options.processor?.preProcessor) {\r\n preparedSourceCode = options.processor.preProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext);\r\n }\r\n\r\n preparedSourceCode = this._EvaluatePreProcessors(preparedSourceCode, preprocessors, options);\r\n\r\n // Post processing\r\n if (options.processor?.postProcessor) {\r\n preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext, engine);\r\n }\r\n\r\n // Inline functions tagged with #define inline\r\n if (engine._features.needShaderCodeInlining) {\r\n preparedSourceCode = engine.inlineShaderCode(preparedSourceCode);\r\n }\r\n\r\n return preparedSourceCode;\r\n }\r\n\r\n /** @internal */\r\n public static _ProcessIncludes(sourceCode: string, options: ProcessingOptions, callback: (data: any) => void): void {\r\n reusableMatches.length = 0;\r\n let match: RegExpMatchArray | null;\r\n // stay back-compat to the old matchAll syntax\r\n while ((match = regexShaderInclude.exec(sourceCode)) !== null) {\r\n reusableMatches.push(match);\r\n }\r\n\r\n let returnValue = String(sourceCode);\r\n let parts = [sourceCode];\r\n\r\n let keepProcessing = false;\r\n\r\n for (const match of reusableMatches) {\r\n let includeFile = match[1];\r\n\r\n // Uniform declaration\r\n if (includeFile.indexOf(\"__decl__\") !== -1) {\r\n includeFile = includeFile.replace(regexShaderDecl, \"\");\r\n if (options.supportsUniformBuffers) {\r\n includeFile = includeFile.replace(\"Vertex\", \"Ubo\").replace(\"Fragment\", \"Ubo\");\r\n }\r\n includeFile = includeFile + \"Declaration\";\r\n }\r\n\r\n if (options.includesShadersStore[includeFile]) {\r\n // Substitution\r\n let includeContent = options.includesShadersStore[includeFile];\r\n if (match[2]) {\r\n const splits = match[3].split(\",\");\r\n\r\n for (let index = 0; index < splits.length; index += 2) {\r\n const source = new RegExp(splits[index], \"g\");\r\n const dest = splits[index + 1];\r\n\r\n includeContent = includeContent.replace(source, dest);\r\n }\r\n }\r\n\r\n if (match[4]) {\r\n const indexString = match[5];\r\n\r\n if (indexString.indexOf(\"..\") !== -1) {\r\n const indexSplits = indexString.split(\"..\");\r\n const minIndex = parseInt(indexSplits[0]);\r\n let maxIndex = parseInt(indexSplits[1]);\r\n let sourceIncludeContent = includeContent.slice(0);\r\n includeContent = \"\";\r\n\r\n if (isNaN(maxIndex)) {\r\n maxIndex = options.indexParameters[indexSplits[1]];\r\n }\r\n\r\n for (let i = minIndex; i < maxIndex; i++) {\r\n if (!options.supportsUniformBuffers) {\r\n // Ubo replacement\r\n sourceIncludeContent = sourceIncludeContent.replace(regexLightX, (str: string, p1: string) => {\r\n return p1 + \"{X}\";\r\n });\r\n }\r\n includeContent += sourceIncludeContent.replace(regexX, i.toString()) + \"\\n\";\r\n }\r\n } else {\r\n if (!options.supportsUniformBuffers) {\r\n // Ubo replacement\r\n includeContent = includeContent.replace(regexLightX, (str: string, p1: string) => {\r\n return p1 + \"{X}\";\r\n });\r\n }\r\n includeContent = includeContent.replace(regexX, indexString);\r\n }\r\n }\r\n\r\n // Replace\r\n // Split all parts on match[0] and intersperse the parts with the include content\r\n const newParts = [];\r\n for (const part of parts) {\r\n const splitPart = part.split(match[0]);\r\n for (let i = 0; i < splitPart.length - 1; i++) {\r\n newParts.push(splitPart[i]);\r\n newParts.push(includeContent);\r\n }\r\n newParts.push(splitPart[splitPart.length - 1]);\r\n }\r\n parts = newParts;\r\n\r\n keepProcessing = keepProcessing || includeContent.indexOf(\"#include<\") >= 0 || includeContent.indexOf(\"#include <\") >= 0;\r\n } else {\r\n const includeShaderUrl = options.shadersRepository + \"ShadersInclude/\" + includeFile + \".fx\";\r\n\r\n ShaderProcessor._FileToolsLoadFile(includeShaderUrl, (fileContent) => {\r\n options.includesShadersStore[includeFile] = fileContent as string;\r\n this._ProcessIncludes(parts.join(\"\"), options, callback);\r\n });\r\n return;\r\n }\r\n }\r\n reusableMatches.length = 0;\r\n\r\n returnValue = parts.join(\"\");\r\n\r\n if (keepProcessing) {\r\n this._ProcessIncludes(returnValue.toString(), options, callback);\r\n } else {\r\n callback(returnValue);\r\n }\r\n }\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @returns a file request object\r\n * @internal\r\n */\r\n public static _FileToolsLoadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void\r\n ): IFileRequest {\r\n throw _WarnImport(\"FileTools\");\r\n }\r\n}\r\n", "import { Observable } from \"../Misc/observable\";\r\nimport type { FloatArray, Nullable } from \"../types\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { GetDOMTextContent, IsWindowObjectExist } from \"../Misc/domManagement\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { IDisposable } from \"../scene\";\r\nimport type { IPipelineContext } from \"../Engines/IPipelineContext\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { ShaderProcessor } from \"../Engines/Processors/shaderProcessor\";\r\nimport type { IShaderProcessor } from \"../Engines/Processors/iShaderProcessor\";\r\nimport type { ProcessingOptions, ShaderCustomProcessingFunction, ShaderProcessingContext } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { IMatrixLike, IVector2Like, IVector3Like, IVector4Like, IColor3Like, IColor4Like, IQuaternionLike } from \"../Maths/math.like\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport type { IEffectFallbacks } from \"./iEffectFallbacks\";\r\nimport { ShaderStore as EngineShaderStore } from \"../Engines/shaderStore\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\n\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport type { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { PostProcess } from \"../PostProcesses/postProcess\";\r\n\r\n/**\r\n * Defines the route to the shader code. The priority is as follows:\r\n * * object: `{ vertexSource: \"vertex shader code string\", fragmentSource: \"fragment shader code string\" }` for directly passing the shader code\r\n * * object: `{ vertexElement: \"vertexShaderCode\", fragmentElement: \"fragmentShaderCode\" }`, used with shader code in script tags\r\n * * object: `{ vertex: \"custom\", fragment: \"custom\" }`, used with `Effect.ShadersStore[\"customVertexShader\"]` and `Effect.ShadersStore[\"customFragmentShader\"]`\r\n * * string: `\"./COMMON_NAME\"`, used with external files COMMON_NAME.vertex.fx and COMMON_NAME.fragment.fx in index.html folder.\r\n */\r\nexport type IShaderPath = {\r\n /**\r\n * Directly pass the shader code\r\n */\r\n vertexSource?: string;\r\n /**\r\n * Directly pass the shader code\r\n */\r\n fragmentSource?: string;\r\n /**\r\n * Used with Effect.ShadersStore. If the `vertex` is set to `\"custom`, then\r\n * Babylon.js will read from Effect.ShadersStore[\"customVertexShader\"]\r\n */\r\n vertex?: string;\r\n /**\r\n * Used with Effect.ShadersStore. If the `fragment` is set to `\"custom`, then\r\n * Babylon.js will read from Effect.ShadersStore[\"customFragmentShader\"]\r\n */\r\n fragment?: string;\r\n /**\r\n * Used with shader code in script tags\r\n */\r\n vertexElement?: string;\r\n /**\r\n * Used with shader code in script tags\r\n */\r\n fragmentElement?: string;\r\n};\r\n\r\n/**\r\n * Options to be used when creating an effect.\r\n */\r\nexport interface IEffectCreationOptions {\r\n /**\r\n * Attributes that will be used in the shader.\r\n */\r\n attributes: string[];\r\n /**\r\n * Uniform variable names that will be set in the shader.\r\n */\r\n uniformsNames: string[];\r\n /**\r\n * Uniform buffer variable names that will be set in the shader.\r\n */\r\n uniformBuffersNames: string[];\r\n /**\r\n * Sampler texture variable names that will be set in the shader.\r\n */\r\n samplers: string[];\r\n /**\r\n * Define statements that will be set in the shader.\r\n */\r\n defines: any;\r\n /**\r\n * Possible fallbacks for this effect to improve performance when needed.\r\n */\r\n fallbacks: Nullable;\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n onCompiled: Nullable<(effect: Effect) => void>;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n onError: Nullable<(effect: Effect, errors: string) => void>;\r\n /**\r\n * Parameters to be used with Babylons include syntax to iterate over an array (eg. \\{lights: 10\\})\r\n */\r\n indexParameters?: any;\r\n /**\r\n * Max number of lights that can be used in the shader.\r\n */\r\n maxSimultaneousLights?: number;\r\n /**\r\n * See https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext/transformFeedbackVaryings\r\n */\r\n transformFeedbackVaryings?: Nullable;\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: Nullable;\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated after the #include have been processed\r\n */\r\n processCodeAfterIncludes?: Nullable;\r\n /**\r\n * Is this effect rendering to several color attachments ?\r\n */\r\n multiTarget?: boolean;\r\n /**\r\n * The language the shader is written in (default: GLSL)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n}\r\n\r\n/**\r\n * Effect containing vertex and fragment shader that can be executed on an object.\r\n */\r\nexport class Effect implements IDisposable {\r\n /**\r\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\r\n */\r\n public static get ShadersRepository(): string {\r\n return EngineShaderStore.ShadersRepository;\r\n }\r\n public static set ShadersRepository(repo: string) {\r\n EngineShaderStore.ShadersRepository = repo;\r\n }\r\n /**\r\n * Enable logging of the shader code when a compilation error occurs\r\n */\r\n public static LogShaderCodeOnCompilationError = true;\r\n /**\r\n * Name of the effect.\r\n */\r\n public name: IShaderPath | string;\r\n /**\r\n * String container all the define statements that should be set on the shader.\r\n */\r\n public defines: string = \"\";\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n public onCompiled: Nullable<(effect: Effect) => void> = null;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n public onError: Nullable<(effect: Effect, errors: string) => void> = null;\r\n /**\r\n * Callback that will be called when effect is bound.\r\n */\r\n public onBind: Nullable<(effect: Effect) => void> = null;\r\n /**\r\n * Unique ID of the effect.\r\n */\r\n public uniqueId = 0;\r\n /**\r\n * Observable that will be called when the shader is compiled.\r\n * It is recommended to use executeWhenCompile() or to make sure that scene.isReady() is called to get this observable raised.\r\n */\r\n public onCompileObservable = new Observable();\r\n /**\r\n * Observable that will be called if an error occurs during shader compilation.\r\n */\r\n public onErrorObservable = new Observable();\r\n\r\n /** @internal */\r\n public _onBindObservable: Nullable> = null;\r\n\r\n private _isDisposed = false;\r\n\r\n /**\r\n * Observable that will be called when effect is bound.\r\n */\r\n public get onBindObservable(): Observable {\r\n if (!this._onBindObservable) {\r\n this._onBindObservable = new Observable();\r\n }\r\n\r\n return this._onBindObservable;\r\n }\r\n\r\n /** @internal */\r\n public _bonesComputationForcedToCPU = false;\r\n /** @internal */\r\n public _uniformBuffersNames: { [key: string]: number } = {};\r\n /** @internal */\r\n public _samplerList: string[];\r\n /** @internal */\r\n public _multiTarget: boolean = false;\r\n\r\n private static _UniqueIdSeed = 0;\r\n /** @internal */\r\n public _engine: Engine;\r\n private _uniformBuffersNamesList: string[];\r\n private _uniformsNames: string[];\r\n private _samplers: { [key: string]: number } = {};\r\n private _isReady = false;\r\n private _compilationError = \"\";\r\n private _allFallbacksProcessed = false;\r\n private _attributesNames: string[];\r\n private _attributes: number[];\r\n private _attributeLocationByName: { [name: string]: number };\r\n private _uniforms: { [key: string]: Nullable } = {};\r\n /**\r\n * Key for the effect.\r\n * @internal\r\n */\r\n public _key: string = \"\";\r\n private _indexParameters: any;\r\n private _fallbacks: Nullable = null;\r\n private _vertexSourceCodeOverride: string = \"\";\r\n private _fragmentSourceCodeOverride: string = \"\";\r\n private _transformFeedbackVaryings: Nullable = null;\r\n private _shaderLanguage: ShaderLanguage;\r\n /**\r\n * Compiled shader to webGL program.\r\n * @internal\r\n */\r\n public _pipelineContext: Nullable = null;\r\n /** @internal */\r\n public _vertexSourceCode: string = \"\";\r\n /** @internal */\r\n public _fragmentSourceCode: string = \"\";\r\n\r\n /** @internal */\r\n private _vertexSourceCodeBeforeMigration: string = \"\";\r\n /** @internal */\r\n private _fragmentSourceCodeBeforeMigration: string = \"\";\r\n\r\n /** @internal */\r\n private _rawVertexSourceCode: string = \"\";\r\n /** @internal */\r\n private _rawFragmentSourceCode: string = \"\";\r\n\r\n private static _BaseCache: { [key: number]: DataBuffer } = {};\r\n private _processingContext: Nullable;\r\n\r\n private _processCodeAfterIncludes: ShaderCustomProcessingFunction | undefined = undefined;\r\n private _processFinalCode: Nullable = null;\r\n\r\n /**\r\n * Gets the shader language type used to write vertex and fragment source code.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates an effect.\r\n * An effect can be used to create/manage/execute vertex and fragment shaders.\r\n * @param baseName Name of the effect.\r\n * @param attributesNamesOrOptions List of attribute names that will be passed to the shader or set of all options to create the effect.\r\n * @param uniformsNamesOrEngine List of uniform variable names that will be passed to the shader or the engine that will be used to render effect.\r\n * @param samplers List of sampler variables that will be passed to the shader.\r\n * @param engine Engine to be used to render the effect\r\n * @param defines Define statements to be added to the shader.\r\n * @param fallbacks Possible fallbacks for this effect to improve performance when needed.\r\n * @param onCompiled Callback that will be called when the shader is compiled.\r\n * @param onError Callback that will be called if an error occurs during shader compilation.\r\n * @param indexParameters Parameters to be used with Babylons include syntax to iterate over an array (eg. \\{lights: 10\\})\r\n * @param key Effect Key identifying uniquely compiled shader variants\r\n * @param shaderLanguage the language the shader is written in (default: GLSL)\r\n */\r\n constructor(\r\n baseName: IShaderPath | string,\r\n attributesNamesOrOptions: string[] | IEffectCreationOptions,\r\n uniformsNamesOrEngine: string[] | ThinEngine,\r\n samplers: Nullable = null,\r\n engine?: ThinEngine,\r\n defines: Nullable = null,\r\n fallbacks: Nullable = null,\r\n onCompiled: Nullable<(effect: Effect) => void> = null,\r\n onError: Nullable<(effect: Effect, errors: string) => void> = null,\r\n indexParameters?: any,\r\n key: string = \"\",\r\n shaderLanguage = ShaderLanguage.GLSL\r\n ) {\r\n this.name = baseName;\r\n this._key = key;\r\n\r\n if ((attributesNamesOrOptions).attributes) {\r\n const options = attributesNamesOrOptions;\r\n this._engine = uniformsNamesOrEngine;\r\n\r\n this._attributesNames = options.attributes;\r\n this._uniformsNames = options.uniformsNames.concat(options.samplers);\r\n this._samplerList = options.samplers.slice();\r\n this.defines = options.defines;\r\n this.onError = options.onError;\r\n this.onCompiled = options.onCompiled;\r\n this._fallbacks = options.fallbacks;\r\n this._indexParameters = options.indexParameters;\r\n this._transformFeedbackVaryings = options.transformFeedbackVaryings || null;\r\n this._multiTarget = !!options.multiTarget;\r\n this._shaderLanguage = options.shaderLanguage ?? ShaderLanguage.GLSL;\r\n\r\n if (options.uniformBuffersNames) {\r\n this._uniformBuffersNamesList = options.uniformBuffersNames.slice();\r\n for (let i = 0; i < options.uniformBuffersNames.length; i++) {\r\n this._uniformBuffersNames[options.uniformBuffersNames[i]] = i;\r\n }\r\n }\r\n\r\n this._processFinalCode = options.processFinalCode ?? null;\r\n this._processCodeAfterIncludes = options.processCodeAfterIncludes ?? undefined;\r\n } else {\r\n this._engine = engine;\r\n this.defines = defines == null ? \"\" : defines;\r\n this._uniformsNames = (uniformsNamesOrEngine).concat(samplers);\r\n this._samplerList = samplers ? samplers.slice() : [];\r\n this._attributesNames = attributesNamesOrOptions;\r\n this._uniformBuffersNamesList = [];\r\n this._shaderLanguage = shaderLanguage;\r\n\r\n this.onError = onError;\r\n this.onCompiled = onCompiled;\r\n\r\n this._indexParameters = indexParameters;\r\n this._fallbacks = fallbacks;\r\n }\r\n\r\n this._attributeLocationByName = {};\r\n\r\n this.uniqueId = Effect._UniqueIdSeed++;\r\n\r\n this._processShaderCode();\r\n }\r\n\r\n /** @internal */\r\n public _processShaderCode(shaderProcessor: Nullable = null, keepExistingPipelineContext = false) {\r\n let vertexSource: string | HTMLElement | IShaderPath;\r\n let fragmentSource: string | HTMLElement | IShaderPath;\r\n\r\n const baseName = this.name;\r\n const hostDocument = IsWindowObjectExist() ? this._engine.getHostDocument() : null;\r\n\r\n if (typeof baseName === \"string\") {\r\n vertexSource = baseName;\r\n } else if (baseName.vertexSource) {\r\n vertexSource = \"source:\" + baseName.vertexSource;\r\n } else if (baseName.vertexElement) {\r\n vertexSource = hostDocument?.getElementById(baseName.vertexElement) || baseName.vertexElement;\r\n } else {\r\n vertexSource = baseName.vertex || baseName;\r\n }\r\n if (typeof baseName === \"string\") {\r\n fragmentSource = baseName;\r\n } else if (baseName.fragmentSource) {\r\n fragmentSource = \"source:\" + baseName.fragmentSource;\r\n } else if (baseName.fragmentElement) {\r\n fragmentSource = hostDocument?.getElementById(baseName.fragmentElement) || baseName.fragmentElement;\r\n } else {\r\n fragmentSource = baseName.fragment || baseName;\r\n }\r\n\r\n this._processingContext = this._engine._getShaderProcessingContext(this._shaderLanguage);\r\n\r\n let processorOptions: ProcessingOptions = {\r\n defines: this.defines.split(\"\\n\"),\r\n indexParameters: this._indexParameters,\r\n isFragment: false,\r\n shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader,\r\n processor: shaderProcessor ?? this._engine._getShaderProcessor(this._shaderLanguage),\r\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\r\n shadersRepository: EngineShaderStore.GetShadersRepository(this._shaderLanguage),\r\n includesShadersStore: EngineShaderStore.GetIncludesShadersStore(this._shaderLanguage),\r\n version: (this._engine.version * 100).toString(),\r\n platformName: this._engine.shaderPlatformName,\r\n processingContext: this._processingContext,\r\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\r\n processCodeAfterIncludes: this._processCodeAfterIncludes,\r\n };\r\n\r\n const shaderCodes: [string | undefined, string | undefined] = [undefined, undefined];\r\n const shadersLoaded = () => {\r\n if (shaderCodes[0] && shaderCodes[1]) {\r\n processorOptions.isFragment = true;\r\n const [migratedVertexCode, fragmentCode] = shaderCodes;\r\n ShaderProcessor.Process(\r\n fragmentCode,\r\n processorOptions,\r\n (migratedFragmentCode, codeBeforeMigration) => {\r\n this._fragmentSourceCodeBeforeMigration = codeBeforeMigration;\r\n if (this._processFinalCode) {\r\n migratedFragmentCode = this._processFinalCode(\"fragment\", migratedFragmentCode);\r\n }\r\n const finalShaders = ShaderProcessor.Finalize(migratedVertexCode, migratedFragmentCode, processorOptions);\r\n processorOptions = null as any;\r\n this._useFinalCode(finalShaders.vertexCode, finalShaders.fragmentCode, baseName, keepExistingPipelineContext);\r\n },\r\n this._engine\r\n );\r\n }\r\n };\r\n this._loadShader(vertexSource, \"Vertex\", \"\", (vertexCode) => {\r\n ShaderProcessor.Initialize(processorOptions);\r\n ShaderProcessor.Process(\r\n vertexCode,\r\n processorOptions,\r\n (migratedVertexCode, codeBeforeMigration) => {\r\n this._rawVertexSourceCode = vertexCode;\r\n this._vertexSourceCodeBeforeMigration = codeBeforeMigration;\r\n if (this._processFinalCode) {\r\n migratedVertexCode = this._processFinalCode(\"vertex\", migratedVertexCode);\r\n }\r\n shaderCodes[0] = migratedVertexCode;\r\n shadersLoaded();\r\n },\r\n this._engine\r\n );\r\n });\r\n this._loadShader(fragmentSource, \"Fragment\", \"Pixel\", (fragmentCode) => {\r\n this._rawFragmentSourceCode = fragmentCode;\r\n shaderCodes[1] = fragmentCode;\r\n shadersLoaded();\r\n });\r\n }\r\n\r\n private _useFinalCode(migratedVertexCode: string, migratedFragmentCode: string, baseName: any, keepExistingPipelineContext = false) {\r\n if (baseName) {\r\n const vertex = baseName.vertexElement || baseName.vertex || baseName.spectorName || baseName;\r\n const fragment = baseName.fragmentElement || baseName.fragment || baseName.spectorName || baseName;\r\n\r\n this._vertexSourceCode = (this._shaderLanguage === ShaderLanguage.WGSL ? \"//\" : \"\") + \"#define SHADER_NAME vertex:\" + vertex + \"\\n\" + migratedVertexCode;\r\n this._fragmentSourceCode = (this._shaderLanguage === ShaderLanguage.WGSL ? \"//\" : \"\") + \"#define SHADER_NAME fragment:\" + fragment + \"\\n\" + migratedFragmentCode;\r\n } else {\r\n this._vertexSourceCode = migratedVertexCode;\r\n this._fragmentSourceCode = migratedFragmentCode;\r\n }\r\n this._prepareEffect(keepExistingPipelineContext);\r\n }\r\n\r\n /**\r\n * Unique key for this effect\r\n */\r\n public get key(): string {\r\n return this._key;\r\n }\r\n\r\n /**\r\n * If the effect has been compiled and prepared.\r\n * @returns if the effect is compiled and prepared.\r\n */\r\n public isReady(): boolean {\r\n try {\r\n return this._isReadyInternal();\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private _isReadyInternal(): boolean {\r\n if (this._isReady) {\r\n return true;\r\n }\r\n if (this._pipelineContext) {\r\n return this._pipelineContext.isReady;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * The engine the effect was initialized with.\r\n * @returns the engine.\r\n */\r\n public getEngine(): Engine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * The pipeline context for this effect\r\n * @returns the associated pipeline context\r\n */\r\n public getPipelineContext(): Nullable {\r\n return this._pipelineContext;\r\n }\r\n\r\n /**\r\n * The set of names of attribute variables for the shader.\r\n * @returns An array of attribute names.\r\n */\r\n public getAttributesNames(): string[] {\r\n return this._attributesNames;\r\n }\r\n\r\n /**\r\n * Returns the attribute at the given index.\r\n * @param index The index of the attribute.\r\n * @returns The location of the attribute.\r\n */\r\n public getAttributeLocation(index: number): number {\r\n return this._attributes[index];\r\n }\r\n\r\n /**\r\n * Returns the attribute based on the name of the variable.\r\n * @param name of the attribute to look up.\r\n * @returns the attribute location.\r\n */\r\n public getAttributeLocationByName(name: string): number {\r\n return this._attributeLocationByName[name];\r\n }\r\n\r\n /**\r\n * The number of attributes.\r\n * @returns the number of attributes.\r\n */\r\n public getAttributesCount(): number {\r\n return this._attributes.length;\r\n }\r\n\r\n /**\r\n * Gets the index of a uniform variable.\r\n * @param uniformName of the uniform to look up.\r\n * @returns the index.\r\n */\r\n public getUniformIndex(uniformName: string): number {\r\n return this._uniformsNames.indexOf(uniformName);\r\n }\r\n\r\n /**\r\n * Returns the attribute based on the name of the variable.\r\n * @param uniformName of the uniform to look up.\r\n * @returns the location of the uniform.\r\n */\r\n public getUniform(uniformName: string): Nullable {\r\n return this._uniforms[uniformName];\r\n }\r\n\r\n /**\r\n * Returns an array of sampler variable names\r\n * @returns The array of sampler variable names.\r\n */\r\n public getSamplers(): string[] {\r\n return this._samplerList;\r\n }\r\n\r\n /**\r\n * Returns an array of uniform variable names\r\n * @returns The array of uniform variable names.\r\n */\r\n public getUniformNames(): string[] {\r\n return this._uniformsNames;\r\n }\r\n\r\n /**\r\n * Returns an array of uniform buffer variable names\r\n * @returns The array of uniform buffer variable names.\r\n */\r\n public getUniformBuffersNames(): string[] {\r\n return this._uniformBuffersNamesList;\r\n }\r\n\r\n /**\r\n * Returns the index parameters used to create the effect\r\n * @returns The index parameters object\r\n */\r\n public getIndexParameters(): any {\r\n return this._indexParameters;\r\n }\r\n\r\n /**\r\n * The error from the last compilation.\r\n * @returns the error string.\r\n */\r\n public getCompilationError(): string {\r\n return this._compilationError;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that all fallbacks were used during compilation\r\n * @returns true if all fallbacks were used\r\n */\r\n public allFallbacksProcessed(): boolean {\r\n return this._allFallbacksProcessed;\r\n }\r\n\r\n /**\r\n * Adds a callback to the onCompiled observable and call the callback immediately if already ready.\r\n * @param func The callback to be used.\r\n */\r\n public executeWhenCompiled(func: (effect: Effect) => void): void {\r\n if (this.isReady()) {\r\n func(this);\r\n return;\r\n }\r\n\r\n this.onCompileObservable.add((effect) => {\r\n func(effect);\r\n });\r\n\r\n if (!this._pipelineContext || this._pipelineContext.isAsync) {\r\n setTimeout(() => {\r\n this._checkIsReady(null);\r\n }, 16);\r\n }\r\n }\r\n\r\n private _checkIsReady(previousPipelineContext: Nullable) {\r\n try {\r\n if (this._isReadyInternal()) {\r\n return;\r\n }\r\n } catch (e) {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n return;\r\n }\r\n\r\n if (this._isDisposed) {\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n this._checkIsReady(previousPipelineContext);\r\n }, 16);\r\n }\r\n\r\n private _loadShader(shader: any, key: string, optionalKey: string, callback: (data: any) => void): void {\r\n if (typeof HTMLElement !== \"undefined\") {\r\n // DOM element ?\r\n if (shader instanceof HTMLElement) {\r\n const shaderCode = GetDOMTextContent(shader);\r\n callback(shaderCode);\r\n return;\r\n }\r\n }\r\n\r\n // Direct source ?\r\n if (shader.substr(0, 7) === \"source:\") {\r\n callback(shader.substr(7));\r\n return;\r\n }\r\n\r\n // Base64 encoded ?\r\n if (shader.substr(0, 7) === \"base64:\") {\r\n const shaderBinary = window.atob(shader.substr(7));\r\n callback(shaderBinary);\r\n return;\r\n }\r\n\r\n const shaderStore = EngineShaderStore.GetShadersStore(this._shaderLanguage);\r\n\r\n // Is in local store ?\r\n if (shaderStore[shader + key + \"Shader\"]) {\r\n callback(shaderStore[shader + key + \"Shader\"]);\r\n return;\r\n }\r\n\r\n if (optionalKey && shaderStore[shader + optionalKey + \"Shader\"]) {\r\n callback(shaderStore[shader + optionalKey + \"Shader\"]);\r\n return;\r\n }\r\n\r\n let shaderUrl;\r\n\r\n if (shader[0] === \".\" || shader[0] === \"/\" || shader.indexOf(\"http\") > -1) {\r\n shaderUrl = shader;\r\n } else {\r\n shaderUrl = EngineShaderStore.GetShadersRepository(this._shaderLanguage) + shader;\r\n }\r\n\r\n // Vertex shader\r\n this._engine._loadFile(shaderUrl + \".\" + key.toLowerCase() + \".fx\", callback);\r\n }\r\n\r\n /**\r\n * Gets the vertex shader source code of this effect\r\n * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)\r\n */\r\n public get vertexSourceCode(): string {\r\n return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride\r\n ? this._vertexSourceCodeOverride\r\n : this._pipelineContext?._getVertexShaderCode() ?? this._vertexSourceCode;\r\n }\r\n\r\n /**\r\n * Gets the fragment shader source code of this effect\r\n * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)\r\n */\r\n public get fragmentSourceCode(): string {\r\n return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride\r\n ? this._fragmentSourceCodeOverride\r\n : this._pipelineContext?._getFragmentShaderCode() ?? this._fragmentSourceCode;\r\n }\r\n\r\n /**\r\n * Gets the vertex shader source code before migration.\r\n * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.\r\n * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).\r\n */\r\n public get vertexSourceCodeBeforeMigration(): string {\r\n return this._vertexSourceCodeBeforeMigration;\r\n }\r\n\r\n /**\r\n * Gets the fragment shader source code before migration.\r\n * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.\r\n * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).\r\n */\r\n public get fragmentSourceCodeBeforeMigration(): string {\r\n return this._fragmentSourceCodeBeforeMigration;\r\n }\r\n\r\n /**\r\n * Gets the vertex shader source code before it has been modified by any processing\r\n */\r\n public get rawVertexSourceCode(): string {\r\n return this._rawVertexSourceCode;\r\n }\r\n\r\n /**\r\n * Gets the fragment shader source code before it has been modified by any processing\r\n */\r\n public get rawFragmentSourceCode(): string {\r\n return this._rawFragmentSourceCode;\r\n }\r\n\r\n /**\r\n * Recompiles the webGL program\r\n * @param vertexSourceCode The source code for the vertex shader.\r\n * @param fragmentSourceCode The source code for the fragment shader.\r\n * @param onCompiled Callback called when completed.\r\n * @param onError Callback called on error.\r\n * @internal\r\n */\r\n public _rebuildProgram(vertexSourceCode: string, fragmentSourceCode: string, onCompiled: (pipelineContext: IPipelineContext) => void, onError: (message: string) => void) {\r\n this._isReady = false;\r\n\r\n this._vertexSourceCodeOverride = vertexSourceCode;\r\n this._fragmentSourceCodeOverride = fragmentSourceCode;\r\n this.onError = (effect, error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n };\r\n this.onCompiled = () => {\r\n const scenes = this.getEngine().scenes;\r\n if (scenes) {\r\n for (let i = 0; i < scenes.length; i++) {\r\n scenes[i].markAllMaterialsAsDirty(Constants.MATERIAL_AllDirtyFlag);\r\n }\r\n }\r\n\r\n this._pipelineContext!._handlesSpectorRebuildCallback?.(onCompiled);\r\n };\r\n this._fallbacks = null;\r\n this._prepareEffect();\r\n }\r\n\r\n /**\r\n * Prepares the effect\r\n * @internal\r\n */\r\n public _prepareEffect(keepExistingPipelineContext = false) {\r\n const attributesNames = this._attributesNames;\r\n const defines = this.defines;\r\n\r\n const previousPipelineContext = this._pipelineContext;\r\n\r\n this._isReady = false;\r\n\r\n try {\r\n const engine = this._engine;\r\n\r\n this._pipelineContext = (keepExistingPipelineContext ? previousPipelineContext : undefined) ?? engine.createPipelineContext(this._processingContext);\r\n this._pipelineContext._name = this._key.replace(/\\r/g, \"\").replace(/\\n/g, \"|\");\r\n\r\n const rebuildRebind = (\r\n vertexSourceCode: string,\r\n fragmentSourceCode: string,\r\n onCompiled: (pipelineContext: IPipelineContext) => void,\r\n onError: (message: string) => void\r\n ) => this._rebuildProgram(vertexSourceCode, fragmentSourceCode, onCompiled, onError);\r\n if (this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride) {\r\n engine._preparePipelineContext(\r\n this._pipelineContext,\r\n this._vertexSourceCodeOverride,\r\n this._fragmentSourceCodeOverride,\r\n true,\r\n this._rawVertexSourceCode,\r\n this._rawFragmentSourceCode,\r\n rebuildRebind,\r\n null,\r\n this._transformFeedbackVaryings,\r\n this._key\r\n );\r\n } else {\r\n engine._preparePipelineContext(\r\n this._pipelineContext,\r\n this._vertexSourceCode,\r\n this._fragmentSourceCode,\r\n false,\r\n this._rawVertexSourceCode,\r\n this._rawFragmentSourceCode,\r\n rebuildRebind,\r\n defines,\r\n this._transformFeedbackVaryings,\r\n this._key\r\n );\r\n }\r\n\r\n engine._executeWhenRenderingStateIsCompiled(this._pipelineContext, () => {\r\n this._attributes = [];\r\n this._pipelineContext!._fillEffectInformation(\r\n this,\r\n this._uniformBuffersNames,\r\n this._uniformsNames,\r\n this._uniforms,\r\n this._samplerList,\r\n this._samplers,\r\n attributesNames,\r\n this._attributes\r\n );\r\n\r\n // Caches attribute locations.\r\n if (attributesNames) {\r\n for (let i = 0; i < attributesNames.length; i++) {\r\n const name = attributesNames[i];\r\n this._attributeLocationByName[name] = this._attributes[i];\r\n }\r\n }\r\n\r\n engine.bindSamplers(this);\r\n\r\n this._compilationError = \"\";\r\n this._isReady = true;\r\n if (this.onCompiled) {\r\n this.onCompiled(this);\r\n }\r\n this.onCompileObservable.notifyObservers(this);\r\n this.onCompileObservable.clear();\r\n\r\n // Unbind mesh reference in fallbacks\r\n if (this._fallbacks) {\r\n this._fallbacks.unBindMesh();\r\n }\r\n\r\n if (previousPipelineContext && !keepExistingPipelineContext) {\r\n this.getEngine()._deletePipelineContext(previousPipelineContext);\r\n }\r\n });\r\n\r\n if (this._pipelineContext.isAsync) {\r\n this._checkIsReady(previousPipelineContext);\r\n }\r\n } catch (e) {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n }\r\n }\r\n\r\n private _getShaderCodeAndErrorLine(code: Nullable, error: Nullable, isFragment: boolean): [Nullable, Nullable] {\r\n const regexp = isFragment ? /FRAGMENT SHADER ERROR: 0:(\\d+?):/ : /VERTEX SHADER ERROR: 0:(\\d+?):/;\r\n\r\n let errorLine = null;\r\n\r\n if (error && code) {\r\n const res = error.match(regexp);\r\n if (res && res.length === 2) {\r\n const lineNumber = parseInt(res[1]);\r\n const lines = code.split(\"\\n\", -1);\r\n if (lines.length >= lineNumber) {\r\n errorLine = `Offending line [${lineNumber}] in ${isFragment ? \"fragment\" : \"vertex\"} code: ${lines[lineNumber - 1]}`;\r\n }\r\n }\r\n }\r\n\r\n return [code, errorLine];\r\n }\r\n\r\n private _processCompilationErrors(e: any, previousPipelineContext: Nullable = null) {\r\n this._compilationError = e.message;\r\n const attributesNames = this._attributesNames;\r\n const fallbacks = this._fallbacks;\r\n\r\n // Let's go through fallbacks then\r\n Logger.Error(\"Unable to compile effect:\");\r\n Logger.Error(\r\n \"Uniforms: \" +\r\n this._uniformsNames.map(function (uniform) {\r\n return \" \" + uniform;\r\n })\r\n );\r\n Logger.Error(\r\n \"Attributes: \" +\r\n attributesNames.map(function (attribute) {\r\n return \" \" + attribute;\r\n })\r\n );\r\n Logger.Error(\"Defines:\\n\" + this.defines);\r\n if (Effect.LogShaderCodeOnCompilationError) {\r\n let lineErrorVertex = null,\r\n lineErrorFragment = null,\r\n code = null;\r\n if (this._pipelineContext?._getVertexShaderCode()) {\r\n [code, lineErrorVertex] = this._getShaderCodeAndErrorLine(this._pipelineContext._getVertexShaderCode(), this._compilationError, false);\r\n if (code) {\r\n Logger.Error(\"Vertex code:\");\r\n Logger.Error(code);\r\n }\r\n }\r\n if (this._pipelineContext?._getFragmentShaderCode()) {\r\n [code, lineErrorFragment] = this._getShaderCodeAndErrorLine(this._pipelineContext?._getFragmentShaderCode(), this._compilationError, true);\r\n if (code) {\r\n Logger.Error(\"Fragment code:\");\r\n Logger.Error(code);\r\n }\r\n }\r\n if (lineErrorVertex) {\r\n Logger.Error(lineErrorVertex);\r\n }\r\n if (lineErrorFragment) {\r\n Logger.Error(lineErrorFragment);\r\n }\r\n }\r\n Logger.Error(\"Error: \" + this._compilationError);\r\n\r\n const notifyErrors = () => {\r\n if (this.onError) {\r\n this.onError(this, this._compilationError);\r\n }\r\n this.onErrorObservable.notifyObservers(this);\r\n };\r\n\r\n // In case a previous compilation was successful, we need to restore the previous pipeline context\r\n if (previousPipelineContext) {\r\n this._pipelineContext = previousPipelineContext;\r\n this._isReady = true;\r\n notifyErrors();\r\n }\r\n\r\n // Lets try to compile fallbacks as long as we have some.\r\n if (fallbacks) {\r\n this._pipelineContext = null;\r\n if (fallbacks.hasMoreFallbacks) {\r\n this._allFallbacksProcessed = false;\r\n Logger.Error(\"Trying next fallback.\");\r\n this.defines = fallbacks.reduce(this.defines, this);\r\n this._prepareEffect();\r\n } else {\r\n // Sorry we did everything we can\r\n this._allFallbacksProcessed = true;\r\n notifyErrors();\r\n this.onErrorObservable.clear();\r\n\r\n // Unbind mesh reference in fallbacks\r\n if (this._fallbacks) {\r\n this._fallbacks.unBindMesh();\r\n }\r\n }\r\n } else {\r\n this._allFallbacksProcessed = true;\r\n\r\n // In case of error, without any prior successful compilation, let s notify observers\r\n if (!previousPipelineContext) {\r\n notifyErrors();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the effect is supported. (Must be called after compilation)\r\n */\r\n public get isSupported(): boolean {\r\n return this._compilationError === \"\";\r\n }\r\n\r\n /**\r\n * Binds a texture to the engine to be used as output of the shader.\r\n * @param channel Name of the output variable.\r\n * @param texture Texture to bind.\r\n * @internal\r\n */\r\n public _bindTexture(channel: string, texture: Nullable): void {\r\n this._engine._bindTexture(this._samplers[channel], texture, channel);\r\n }\r\n\r\n /**\r\n * Sets a texture on the engine to be used in the shader.\r\n * @param channel Name of the sampler variable.\r\n * @param texture Texture to set.\r\n */\r\n public setTexture(channel: string, texture: Nullable): void {\r\n this._engine.setTexture(this._samplers[channel], this._uniforms[channel], texture, channel);\r\n }\r\n\r\n /**\r\n * Sets a depth stencil texture from a render target on the engine to be used in the shader.\r\n * @param channel Name of the sampler variable.\r\n * @param texture Texture to set.\r\n */\r\n public setDepthStencilTexture(channel: string, texture: Nullable): void {\r\n this._engine.setDepthStencilTexture(this._samplers[channel], this._uniforms[channel], texture, channel);\r\n }\r\n\r\n /**\r\n * Sets an array of textures on the engine to be used in the shader.\r\n * @param channel Name of the variable.\r\n * @param textures Textures to set.\r\n */\r\n public setTextureArray(channel: string, textures: ThinTexture[]): void {\r\n const exName = channel + \"Ex\";\r\n if (this._samplerList.indexOf(exName + \"0\") === -1) {\r\n const initialPos = this._samplerList.indexOf(channel);\r\n for (let index = 1; index < textures.length; index++) {\r\n const currentExName = exName + (index - 1).toString();\r\n this._samplerList.splice(initialPos + index, 0, currentExName);\r\n }\r\n\r\n // Reset every channels\r\n let channelIndex = 0;\r\n for (const key of this._samplerList) {\r\n this._samplers[key] = channelIndex;\r\n channelIndex += 1;\r\n }\r\n }\r\n\r\n this._engine.setTextureArray(this._samplers[channel], this._uniforms[channel], textures, channel);\r\n }\r\n\r\n /**\r\n * Sets a texture to be the input of the specified post process. (To use the output, pass in the next post process in the pipeline)\r\n * @param channel Name of the sampler variable.\r\n * @param postProcess Post process to get the input texture from.\r\n */\r\n public setTextureFromPostProcess(channel: string, postProcess: Nullable): void {\r\n this._engine.setTextureFromPostProcess(this._samplers[channel], postProcess, channel);\r\n }\r\n\r\n /**\r\n * (Warning! setTextureFromPostProcessOutput may be desired instead)\r\n * Sets the input texture of the passed in post process to be input of this effect. (To use the output of the passed in post process use setTextureFromPostProcessOutput)\r\n * @param channel Name of the sampler variable.\r\n * @param postProcess Post process to get the output texture from.\r\n */\r\n public setTextureFromPostProcessOutput(channel: string, postProcess: Nullable): void {\r\n this._engine.setTextureFromPostProcessOutput(this._samplers[channel], postProcess, channel);\r\n }\r\n\r\n /**\r\n * Binds a buffer to a uniform.\r\n * @param buffer Buffer to bind.\r\n * @param name Name of the uniform variable to bind to.\r\n */\r\n public bindUniformBuffer(buffer: DataBuffer, name: string): void {\r\n const bufferName = this._uniformBuffersNames[name];\r\n if (bufferName === undefined || (Effect._BaseCache[bufferName] === buffer && this._engine._features.useUBOBindingCache)) {\r\n return;\r\n }\r\n Effect._BaseCache[bufferName] = buffer;\r\n this._engine.bindUniformBufferBase(buffer, bufferName, name);\r\n }\r\n\r\n /**\r\n * Binds block to a uniform.\r\n * @param blockName Name of the block to bind.\r\n * @param index Index to bind.\r\n */\r\n public bindUniformBlock(blockName: string, index: number): void {\r\n this._engine.bindUniformBlock(this._pipelineContext!, blockName, index);\r\n }\r\n\r\n /**\r\n * Sets an integer value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value Value to be set.\r\n * @returns this effect.\r\n */\r\n public setInt(uniformName: string, value: number): Effect {\r\n this._pipelineContext!.setInt(uniformName, value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int2 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int2.\r\n * @param y Second int in int2.\r\n * @returns this effect.\r\n */\r\n public setInt2(uniformName: string, x: number, y: number): Effect {\r\n this._pipelineContext!.setInt2(uniformName, x, y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int3 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int3.\r\n * @param y Second int in int3.\r\n * @param z Third int in int3.\r\n * @returns this effect.\r\n */\r\n public setInt3(uniformName: string, x: number, y: number, z: number): Effect {\r\n this._pipelineContext!.setInt3(uniformName, x, y, z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int4 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int4.\r\n * @param y Second int in int4.\r\n * @param z Third int in int4.\r\n * @param w Fourth int in int4.\r\n * @returns this effect.\r\n */\r\n public setInt4(uniformName: string, x: number, y: number, z: number, w: number): Effect {\r\n this._pipelineContext!.setInt4(uniformName, x, y, z, w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray2(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray3(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray4(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned integer value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value Value to be set.\r\n * @returns this effect.\r\n */\r\n public setUInt(uniformName: string, value: number): Effect {\r\n this._pipelineContext!.setUInt(uniformName, value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int2 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint2.\r\n * @param y Second unsigned int in uint2.\r\n * @returns this effect.\r\n */\r\n public setUInt2(uniformName: string, x: number, y: number): Effect {\r\n this._pipelineContext!.setUInt2(uniformName, x, y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int3 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint3.\r\n * @param y Second unsigned int in uint3.\r\n * @param z Third unsigned int in uint3.\r\n * @returns this effect.\r\n */\r\n public setUInt3(uniformName: string, x: number, y: number, z: number): Effect {\r\n this._pipelineContext!.setUInt3(uniformName, x, y, z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int4 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint4.\r\n * @param y Second unsigned int in uint4.\r\n * @param z Third unsigned int in uint4.\r\n * @param w Fourth unsigned int in uint4.\r\n * @returns this effect.\r\n */\r\n public setUInt4(uniformName: string, x: number, y: number, z: number, w: number): Effect {\r\n this._pipelineContext!.setUInt4(uniformName, x, y, z, w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray2(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray3(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray4(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray2(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray3(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray4(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray2(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray3(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray4(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets matrices on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param matrices matrices to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrices(uniformName: string, matrices: Float32Array | Array): Effect {\r\n this._pipelineContext!.setMatrices(uniformName, matrices as Float32Array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets matrix on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrix(uniformName: string, matrix: IMatrixLike): Effect {\r\n this._pipelineContext!.setMatrix(uniformName, matrix);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix)\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrix3x3(uniformName: string, matrix: Float32Array | Array): Effect {\r\n // the cast is ok because it is gl.uniformMatrix3fv() which is called at the end, and this function accepts Float32Array and Array\r\n this._pipelineContext!.setMatrix3x3(uniformName, matrix as Float32Array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix)\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrix2x2(uniformName: string, matrix: Float32Array | Array): Effect {\r\n // the cast is ok because it is gl.uniformMatrix3fv() which is called at the end, and this function accepts Float32Array and Array\r\n this._pipelineContext!.setMatrix2x2(uniformName, matrix as Float32Array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value value to be set.\r\n * @returns this effect.\r\n */\r\n public setFloat(uniformName: string, value: number): Effect {\r\n this._pipelineContext!.setFloat(uniformName, value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a boolean on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param bool value to be set.\r\n * @returns this effect.\r\n */\r\n public setBool(uniformName: string, bool: boolean): Effect {\r\n this._pipelineContext!.setInt(uniformName, bool ? 1 : 0);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Vector2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector2 vector2 to be set.\r\n * @returns this effect.\r\n */\r\n public setVector2(uniformName: string, vector2: IVector2Like): Effect {\r\n this._pipelineContext!.setVector2(uniformName, vector2);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float2.\r\n * @param y Second float in float2.\r\n * @returns this effect.\r\n */\r\n public setFloat2(uniformName: string, x: number, y: number): Effect {\r\n this._pipelineContext!.setFloat2(uniformName, x, y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Vector3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector3 Value to be set.\r\n * @returns this effect.\r\n */\r\n public setVector3(uniformName: string, vector3: IVector3Like): Effect {\r\n this._pipelineContext!.setVector3(uniformName, vector3);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float3.\r\n * @param y Second float in float3.\r\n * @param z Third float in float3.\r\n * @returns this effect.\r\n */\r\n public setFloat3(uniformName: string, x: number, y: number, z: number): Effect {\r\n this._pipelineContext!.setFloat3(uniformName, x, y, z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Vector4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector4 Value to be set.\r\n * @returns this effect.\r\n */\r\n public setVector4(uniformName: string, vector4: IVector4Like): Effect {\r\n this._pipelineContext!.setVector4(uniformName, vector4);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Quaternion on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param quaternion Value to be set.\r\n * @returns this effect.\r\n */\r\n public setQuaternion(uniformName: string, quaternion: IQuaternionLike): Effect {\r\n this._pipelineContext!.setQuaternion(uniformName, quaternion);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float4.\r\n * @param y Second float in float4.\r\n * @param z Third float in float4.\r\n * @param w Fourth float in float4.\r\n * @returns this effect.\r\n */\r\n public setFloat4(uniformName: string, x: number, y: number, z: number, w: number): Effect {\r\n this._pipelineContext!.setFloat4(uniformName, x, y, z, w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Color3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param color3 Value to be set.\r\n * @returns this effect.\r\n */\r\n public setColor3(uniformName: string, color3: IColor3Like): Effect {\r\n this._pipelineContext!.setColor3(uniformName, color3);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Color4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param color3 Value to be set.\r\n * @param alpha Alpha value to be set.\r\n * @returns this effect.\r\n */\r\n public setColor4(uniformName: string, color3: IColor3Like, alpha: number): Effect {\r\n this._pipelineContext!.setColor4(uniformName, color3, alpha);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Color4 on a uniform variable\r\n * @param uniformName defines the name of the variable\r\n * @param color4 defines the value to be set\r\n * @returns this effect.\r\n */\r\n public setDirectColor4(uniformName: string, color4: IColor4Like): Effect {\r\n this._pipelineContext!.setDirectColor4(uniformName, color4);\r\n return this;\r\n }\r\n\r\n /**\r\n * Release all associated resources.\r\n **/\r\n public dispose() {\r\n if (this._pipelineContext) {\r\n this._pipelineContext.dispose();\r\n }\r\n this._engine._releaseEffect(this);\r\n\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * This function will add a new shader to the shader store\r\n * @param name the name of the shader\r\n * @param pixelShader optional pixel shader content\r\n * @param vertexShader optional vertex shader content\r\n * @param shaderLanguage the language the shader is written in (default: GLSL)\r\n */\r\n public static RegisterShader(name: string, pixelShader?: string, vertexShader?: string, shaderLanguage = ShaderLanguage.GLSL) {\r\n if (pixelShader) {\r\n EngineShaderStore.GetShadersStore(shaderLanguage)[`${name}PixelShader`] = pixelShader;\r\n }\r\n\r\n if (vertexShader) {\r\n EngineShaderStore.GetShadersStore(shaderLanguage)[`${name}VertexShader`] = vertexShader;\r\n }\r\n }\r\n\r\n /**\r\n * Store of each shader (The can be looked up using effect.key)\r\n */\r\n public static ShadersStore: { [key: string]: string } = EngineShaderStore.ShadersStore;\r\n /**\r\n * Store of each included file for a shader (The can be looked up using effect.key)\r\n */\r\n public static IncludesShadersStore: { [key: string]: string } = EngineShaderStore.IncludesShadersStore;\r\n\r\n /**\r\n * Resets the cache of effects.\r\n */\r\n public static ResetCache() {\r\n Effect._BaseCache = {};\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class DepthCullingState {\r\n protected _isDepthTestDirty = false;\r\n protected _isDepthMaskDirty = false;\r\n protected _isDepthFuncDirty = false;\r\n protected _isCullFaceDirty = false;\r\n protected _isCullDirty = false;\r\n protected _isZOffsetDirty = false;\r\n protected _isFrontFaceDirty = false;\r\n\r\n protected _depthTest: boolean;\r\n protected _depthMask: boolean;\r\n protected _depthFunc: Nullable;\r\n protected _cull: Nullable;\r\n protected _cullFace: Nullable;\r\n protected _zOffset: number;\r\n protected _zOffsetUnits: number;\r\n protected _frontFace: Nullable;\r\n\r\n /**\r\n * Initializes the state.\r\n * @param reset\r\n */\r\n public constructor(reset = true) {\r\n if (reset) {\r\n this.reset();\r\n }\r\n }\r\n\r\n public get isDirty(): boolean {\r\n return (\r\n this._isDepthFuncDirty ||\r\n this._isDepthTestDirty ||\r\n this._isDepthMaskDirty ||\r\n this._isCullFaceDirty ||\r\n this._isCullDirty ||\r\n this._isZOffsetDirty ||\r\n this._isFrontFaceDirty\r\n );\r\n }\r\n\r\n public get zOffset(): number {\r\n return this._zOffset;\r\n }\r\n\r\n public set zOffset(value: number) {\r\n if (this._zOffset === value) {\r\n return;\r\n }\r\n\r\n this._zOffset = value;\r\n this._isZOffsetDirty = true;\r\n }\r\n\r\n public get zOffsetUnits(): number {\r\n return this._zOffsetUnits;\r\n }\r\n\r\n public set zOffsetUnits(value: number) {\r\n if (this._zOffsetUnits === value) {\r\n return;\r\n }\r\n\r\n this._zOffsetUnits = value;\r\n this._isZOffsetDirty = true;\r\n }\r\n\r\n public get cullFace(): Nullable {\r\n return this._cullFace;\r\n }\r\n\r\n public set cullFace(value: Nullable) {\r\n if (this._cullFace === value) {\r\n return;\r\n }\r\n\r\n this._cullFace = value;\r\n this._isCullFaceDirty = true;\r\n }\r\n\r\n public get cull(): Nullable {\r\n return this._cull;\r\n }\r\n\r\n public set cull(value: Nullable) {\r\n if (this._cull === value) {\r\n return;\r\n }\r\n\r\n this._cull = value;\r\n this._isCullDirty = true;\r\n }\r\n\r\n public get depthFunc(): Nullable {\r\n return this._depthFunc;\r\n }\r\n\r\n public set depthFunc(value: Nullable) {\r\n if (this._depthFunc === value) {\r\n return;\r\n }\r\n\r\n this._depthFunc = value;\r\n this._isDepthFuncDirty = true;\r\n }\r\n\r\n public get depthMask(): boolean {\r\n return this._depthMask;\r\n }\r\n\r\n public set depthMask(value: boolean) {\r\n if (this._depthMask === value) {\r\n return;\r\n }\r\n\r\n this._depthMask = value;\r\n this._isDepthMaskDirty = true;\r\n }\r\n\r\n public get depthTest(): boolean {\r\n return this._depthTest;\r\n }\r\n\r\n public set depthTest(value: boolean) {\r\n if (this._depthTest === value) {\r\n return;\r\n }\r\n\r\n this._depthTest = value;\r\n this._isDepthTestDirty = true;\r\n }\r\n\r\n public get frontFace(): Nullable {\r\n return this._frontFace;\r\n }\r\n\r\n public set frontFace(value: Nullable) {\r\n if (this._frontFace === value) {\r\n return;\r\n }\r\n\r\n this._frontFace = value;\r\n this._isFrontFaceDirty = true;\r\n }\r\n\r\n public reset() {\r\n this._depthMask = true;\r\n this._depthTest = true;\r\n this._depthFunc = null;\r\n this._cullFace = null;\r\n this._cull = null;\r\n this._zOffset = 0;\r\n this._zOffsetUnits = 0;\r\n this._frontFace = null;\r\n\r\n this._isDepthTestDirty = true;\r\n this._isDepthMaskDirty = true;\r\n this._isDepthFuncDirty = false;\r\n this._isCullFaceDirty = false;\r\n this._isCullDirty = false;\r\n this._isZOffsetDirty = true;\r\n this._isFrontFaceDirty = false;\r\n }\r\n\r\n public apply(gl: WebGLRenderingContext) {\r\n if (!this.isDirty) {\r\n return;\r\n }\r\n\r\n // Cull\r\n if (this._isCullDirty) {\r\n if (this.cull) {\r\n gl.enable(gl.CULL_FACE);\r\n } else {\r\n gl.disable(gl.CULL_FACE);\r\n }\r\n\r\n this._isCullDirty = false;\r\n }\r\n\r\n // Cull face\r\n if (this._isCullFaceDirty) {\r\n gl.cullFace(this.cullFace);\r\n this._isCullFaceDirty = false;\r\n }\r\n\r\n // Depth mask\r\n if (this._isDepthMaskDirty) {\r\n gl.depthMask(this.depthMask);\r\n this._isDepthMaskDirty = false;\r\n }\r\n\r\n // Depth test\r\n if (this._isDepthTestDirty) {\r\n if (this.depthTest) {\r\n gl.enable(gl.DEPTH_TEST);\r\n } else {\r\n gl.disable(gl.DEPTH_TEST);\r\n }\r\n this._isDepthTestDirty = false;\r\n }\r\n\r\n // Depth func\r\n if (this._isDepthFuncDirty) {\r\n gl.depthFunc(this.depthFunc);\r\n this._isDepthFuncDirty = false;\r\n }\r\n\r\n // zOffset\r\n if (this._isZOffsetDirty) {\r\n if (this.zOffset || this.zOffsetUnits) {\r\n gl.enable(gl.POLYGON_OFFSET_FILL);\r\n gl.polygonOffset(this.zOffset, this.zOffsetUnits);\r\n } else {\r\n gl.disable(gl.POLYGON_OFFSET_FILL);\r\n }\r\n\r\n this._isZOffsetDirty = false;\r\n }\r\n\r\n // Front face\r\n if (this._isFrontFaceDirty) {\r\n gl.frontFace(this.frontFace);\r\n this._isFrontFaceDirty = false;\r\n }\r\n }\r\n}\r\n", "import { Constants } from \"../Engines/constants\";\r\nimport type { IStencilState } from \"./IStencilState\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class StencilState implements IStencilState {\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will always pass. i.e. Pixels will be drawn in the order they are drawn */\r\n public static readonly ALWAYS = Constants.ALWAYS;\r\n /** Passed to stencilOperation to specify that stencil value must be kept */\r\n public static readonly KEEP = Constants.KEEP;\r\n /** Passed to stencilOperation to specify that stencil value must be replaced */\r\n public static readonly REPLACE = Constants.REPLACE;\r\n\r\n public constructor() {\r\n this.reset();\r\n }\r\n\r\n public reset() {\r\n this.enabled = false;\r\n this.mask = 0xff;\r\n\r\n this.func = StencilState.ALWAYS;\r\n this.funcRef = 1;\r\n this.funcMask = 0xff;\r\n\r\n this.opStencilFail = StencilState.KEEP;\r\n this.opDepthFail = StencilState.KEEP;\r\n this.opStencilDepthPass = StencilState.REPLACE;\r\n }\r\n\r\n public func: number;\r\n public get stencilFunc(): number {\r\n return this.func;\r\n }\r\n\r\n public set stencilFunc(value: number) {\r\n this.func = value;\r\n }\r\n\r\n public funcRef: number;\r\n public get stencilFuncRef(): number {\r\n return this.funcRef;\r\n }\r\n\r\n public set stencilFuncRef(value: number) {\r\n this.funcRef = value;\r\n }\r\n\r\n public funcMask: number;\r\n public get stencilFuncMask(): number {\r\n return this.funcMask;\r\n }\r\n\r\n public set stencilFuncMask(value: number) {\r\n this.funcMask = value;\r\n }\r\n\r\n public opStencilFail: number;\r\n public get stencilOpStencilFail(): number {\r\n return this.opStencilFail;\r\n }\r\n\r\n public set stencilOpStencilFail(value: number) {\r\n this.opStencilFail = value;\r\n }\r\n\r\n public opDepthFail: number;\r\n public get stencilOpDepthFail(): number {\r\n return this.opDepthFail;\r\n }\r\n\r\n public set stencilOpDepthFail(value: number) {\r\n this.opDepthFail = value;\r\n }\r\n\r\n public opStencilDepthPass: number;\r\n public get stencilOpStencilDepthPass(): number {\r\n return this.opStencilDepthPass;\r\n }\r\n\r\n public set stencilOpStencilDepthPass(value: number) {\r\n this.opStencilDepthPass = value;\r\n }\r\n\r\n public mask: number;\r\n public get stencilMask(): number {\r\n return this.mask;\r\n }\r\n\r\n public set stencilMask(value: number) {\r\n this.mask = value;\r\n }\r\n\r\n public enabled: boolean;\r\n public get stencilTest(): boolean {\r\n return this.enabled;\r\n }\r\n\r\n public set stencilTest(value: boolean) {\r\n this.enabled = value;\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class AlphaState {\r\n public _blendFunctionParameters = new Array>(4);\r\n public _blendEquationParameters = new Array>(2);\r\n public _blendConstants = new Array>(4);\r\n public _isBlendConstantsDirty = false;\r\n\r\n private _alphaBlend = false;\r\n private _isAlphaBlendDirty = false;\r\n private _isBlendFunctionParametersDirty = false;\r\n private _isBlendEquationParametersDirty = false;\r\n\r\n /**\r\n * Initializes the state.\r\n */\r\n public constructor() {\r\n this.reset();\r\n }\r\n\r\n public get isDirty(): boolean {\r\n return this._isAlphaBlendDirty || this._isBlendFunctionParametersDirty || this._isBlendEquationParametersDirty;\r\n }\r\n\r\n public get alphaBlend(): boolean {\r\n return this._alphaBlend;\r\n }\r\n\r\n public set alphaBlend(value: boolean) {\r\n if (this._alphaBlend === value) {\r\n return;\r\n }\r\n\r\n this._alphaBlend = value;\r\n this._isAlphaBlendDirty = true;\r\n }\r\n\r\n public setAlphaBlendConstants(r: number, g: number, b: number, a: number): void {\r\n if (this._blendConstants[0] === r && this._blendConstants[1] === g && this._blendConstants[2] === b && this._blendConstants[3] === a) {\r\n return;\r\n }\r\n\r\n this._blendConstants[0] = r;\r\n this._blendConstants[1] = g;\r\n this._blendConstants[2] = b;\r\n this._blendConstants[3] = a;\r\n\r\n this._isBlendConstantsDirty = true;\r\n }\r\n\r\n public setAlphaBlendFunctionParameters(value0: number, value1: number, value2: number, value3: number): void {\r\n if (\r\n this._blendFunctionParameters[0] === value0 &&\r\n this._blendFunctionParameters[1] === value1 &&\r\n this._blendFunctionParameters[2] === value2 &&\r\n this._blendFunctionParameters[3] === value3\r\n ) {\r\n return;\r\n }\r\n\r\n this._blendFunctionParameters[0] = value0;\r\n this._blendFunctionParameters[1] = value1;\r\n this._blendFunctionParameters[2] = value2;\r\n this._blendFunctionParameters[3] = value3;\r\n\r\n this._isBlendFunctionParametersDirty = true;\r\n }\r\n\r\n public setAlphaEquationParameters(rgb: number, alpha: number): void {\r\n if (this._blendEquationParameters[0] === rgb && this._blendEquationParameters[1] === alpha) {\r\n return;\r\n }\r\n\r\n this._blendEquationParameters[0] = rgb;\r\n this._blendEquationParameters[1] = alpha;\r\n\r\n this._isBlendEquationParametersDirty = true;\r\n }\r\n\r\n public reset() {\r\n this._alphaBlend = false;\r\n this._blendFunctionParameters[0] = null;\r\n this._blendFunctionParameters[1] = null;\r\n this._blendFunctionParameters[2] = null;\r\n this._blendFunctionParameters[3] = null;\r\n\r\n this._blendEquationParameters[0] = null;\r\n this._blendEquationParameters[1] = null;\r\n\r\n this._blendConstants[0] = null;\r\n this._blendConstants[1] = null;\r\n this._blendConstants[2] = null;\r\n this._blendConstants[3] = null;\r\n\r\n this._isAlphaBlendDirty = true;\r\n this._isBlendFunctionParametersDirty = false;\r\n this._isBlendEquationParametersDirty = false;\r\n this._isBlendConstantsDirty = false;\r\n }\r\n\r\n public apply(gl: WebGLRenderingContext) {\r\n if (!this.isDirty) {\r\n return;\r\n }\r\n\r\n // Alpha blend\r\n if (this._isAlphaBlendDirty) {\r\n if (this._alphaBlend) {\r\n gl.enable(gl.BLEND);\r\n } else {\r\n gl.disable(gl.BLEND);\r\n }\r\n\r\n this._isAlphaBlendDirty = false;\r\n }\r\n\r\n // Alpha function\r\n if (this._isBlendFunctionParametersDirty) {\r\n gl.blendFuncSeparate(\r\n this._blendFunctionParameters[0],\r\n this._blendFunctionParameters[1],\r\n this._blendFunctionParameters[2],\r\n this._blendFunctionParameters[3]\r\n );\r\n this._isBlendFunctionParametersDirty = false;\r\n }\r\n\r\n // Alpha equation\r\n if (this._isBlendEquationParametersDirty) {\r\n gl.blendEquationSeparate(this._blendEquationParameters[0]!, this._blendEquationParameters[1]!);\r\n this._isBlendEquationParametersDirty = false;\r\n }\r\n\r\n // Constants\r\n if (this._isBlendConstantsDirty) {\r\n gl.blendColor(this._blendConstants[0], this._blendConstants[1], this._blendConstants[2], this._blendConstants[3]);\r\n this._isBlendConstantsDirty = false;\r\n }\r\n }\r\n}\r\n", "import { Constants } from \"../../Engines/constants\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n/**\r\n * Class used to store a texture sampler data\r\n */\r\nexport class TextureSampler {\r\n /**\r\n * Gets the sampling mode of the texture\r\n */\r\n public samplingMode: number = -1;\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n public get wrapU() {\r\n return this._cachedWrapU;\r\n }\r\n\r\n public set wrapU(value: Nullable) {\r\n this._cachedWrapU = value;\r\n }\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n public get wrapV() {\r\n return this._cachedWrapV;\r\n }\r\n\r\n public set wrapV(value: Nullable) {\r\n this._cachedWrapV = value;\r\n }\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n public get wrapR() {\r\n return this._cachedWrapR;\r\n }\r\n\r\n public set wrapR(value: Nullable) {\r\n this._cachedWrapR = value;\r\n }\r\n\r\n /**\r\n * With compliant hardware and browser (supporting anisotropic filtering)\r\n * this defines the level of anisotropic filtering in the texture.\r\n * The higher the better but the slower.\r\n */\r\n public get anisotropicFilteringLevel() {\r\n return this._cachedAnisotropicFilteringLevel;\r\n }\r\n\r\n public set anisotropicFilteringLevel(value: Nullable) {\r\n this._cachedAnisotropicFilteringLevel = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the comparison function (Constants.LESS, Constants.EQUAL, etc). Set 0 to not use a comparison function\r\n */\r\n public get comparisonFunction() {\r\n return this._comparisonFunction;\r\n }\r\n\r\n public set comparisonFunction(value: number) {\r\n this._comparisonFunction = value;\r\n }\r\n\r\n private _useMipMaps = true;\r\n /**\r\n * Indicates to use the mip maps (if available on the texture).\r\n * Thanks to this flag, you can instruct the sampler to not sample the mipmaps even if they exist (and if the sampling mode is set to a value that normally samples the mipmaps!)\r\n */\r\n public get useMipMaps() {\r\n return this._useMipMaps;\r\n }\r\n\r\n public set useMipMaps(value: boolean) {\r\n this._useMipMaps = value;\r\n }\r\n\r\n /** @internal */\r\n public _cachedWrapU: Nullable = null;\r\n\r\n /** @internal */\r\n public _cachedWrapV: Nullable = null;\r\n\r\n /** @internal */\r\n public _cachedWrapR: Nullable = null;\r\n\r\n /** @internal */\r\n public _cachedAnisotropicFilteringLevel: Nullable = null;\r\n\r\n /** @internal */\r\n public _comparisonFunction: number = 0;\r\n\r\n /**\r\n * Used for debugging purpose only\r\n */\r\n public label?: string;\r\n\r\n /**\r\n * Creates a Sampler instance\r\n */\r\n constructor() {}\r\n\r\n /**\r\n * Sets all the parameters of the sampler\r\n * @param wrapU u address mode (default: TEXTURE_WRAP_ADDRESSMODE)\r\n * @param wrapV v address mode (default: TEXTURE_WRAP_ADDRESSMODE)\r\n * @param wrapR r address mode (default: TEXTURE_WRAP_ADDRESSMODE)\r\n * @param anisotropicFilteringLevel anisotropic level (default: 1)\r\n * @param samplingMode sampling mode (default: Constants.TEXTURE_BILINEAR_SAMPLINGMODE)\r\n * @param comparisonFunction comparison function (default: 0 - no comparison function)\r\n * @returns the current sampler instance\r\n */\r\n public setParameters(\r\n wrapU = Constants.TEXTURE_WRAP_ADDRESSMODE,\r\n wrapV = Constants.TEXTURE_WRAP_ADDRESSMODE,\r\n wrapR = Constants.TEXTURE_WRAP_ADDRESSMODE,\r\n anisotropicFilteringLevel = 1,\r\n samplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n comparisonFunction = 0\r\n ): TextureSampler {\r\n this._cachedWrapU = wrapU;\r\n this._cachedWrapV = wrapV;\r\n this._cachedWrapR = wrapR;\r\n this._cachedAnisotropicFilteringLevel = anisotropicFilteringLevel;\r\n this.samplingMode = samplingMode;\r\n this._comparisonFunction = comparisonFunction;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Compares this sampler with another one\r\n * @param other sampler to compare with\r\n * @returns true if the samplers have the same parametres, else false\r\n */\r\n public compareSampler(other: TextureSampler): boolean {\r\n return (\r\n this._cachedWrapU === other._cachedWrapU &&\r\n this._cachedWrapV === other._cachedWrapV &&\r\n this._cachedWrapR === other._cachedWrapR &&\r\n this._cachedAnisotropicFilteringLevel === other._cachedAnisotropicFilteringLevel &&\r\n this.samplingMode === other.samplingMode &&\r\n this._comparisonFunction === other._comparisonFunction &&\r\n this._useMipMaps === other._useMipMaps\r\n );\r\n }\r\n}\r\n", "import { Observable } from \"../../Misc/observable\";\r\nimport type { ImageSource, Nullable, int } from \"../../types\";\r\nimport type { ICanvas, ICanvasRenderingContext } from \"../../Engines/ICanvas\";\r\nimport type { HardwareTextureWrapper } from \"./hardwareTextureWrapper\";\r\nimport { TextureSampler } from \"./textureSampler\";\r\n\r\nimport type { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport type { SphericalPolynomial } from \"../../Maths/sphericalPolynomial\";\r\n\r\n/**\r\n * Defines the source of the internal texture\r\n */\r\nexport enum InternalTextureSource {\r\n /**\r\n * The source of the texture data is unknown\r\n */\r\n Unknown,\r\n /**\r\n * Texture data comes from an URL\r\n */\r\n Url,\r\n /**\r\n * Texture data is only used for temporary storage\r\n */\r\n Temp,\r\n /**\r\n * Texture data comes from raw data (ArrayBuffer)\r\n */\r\n Raw,\r\n /**\r\n * Texture content is dynamic (video or dynamic texture)\r\n */\r\n Dynamic,\r\n /**\r\n * Texture content is generated by rendering to it\r\n */\r\n RenderTarget,\r\n /**\r\n * Texture content is part of a multi render target process\r\n */\r\n MultiRenderTarget,\r\n /**\r\n * Texture data comes from a cube data file\r\n */\r\n Cube,\r\n /**\r\n * Texture data comes from a raw cube data\r\n */\r\n CubeRaw,\r\n /**\r\n * Texture data come from a prefiltered cube data file\r\n */\r\n CubePrefiltered,\r\n /**\r\n * Texture content is raw 3D data\r\n */\r\n Raw3D,\r\n /**\r\n * Texture content is raw 2D array data\r\n */\r\n Raw2DArray,\r\n /**\r\n * Texture content is a depth/stencil texture\r\n */\r\n DepthStencil,\r\n /**\r\n * Texture data comes from a raw cube data encoded with RGBD\r\n */\r\n CubeRawRGBD,\r\n /**\r\n * Texture content is a depth texture\r\n */\r\n Depth,\r\n}\r\n\r\n/**\r\n * Class used to store data associated with WebGL texture data for the engine\r\n * This class should not be used directly\r\n */\r\nexport class InternalTexture extends TextureSampler {\r\n /**\r\n * Defines if the texture is ready\r\n */\r\n public isReady: boolean = false;\r\n /**\r\n * Defines if the texture is a cube texture\r\n */\r\n public isCube: boolean = false;\r\n /**\r\n * Defines if the texture contains 3D data\r\n */\r\n public is3D: boolean = false;\r\n /**\r\n * Defines if the texture contains 2D array data\r\n */\r\n public is2DArray: boolean = false;\r\n /**\r\n * Defines if the texture contains multiview data\r\n */\r\n public isMultiview: boolean = false;\r\n /**\r\n * Gets the URL used to load this texture\r\n */\r\n public url: string = \"\";\r\n /** @internal */\r\n public _originalUrl: string; // not empty only if different from url\r\n /**\r\n * Gets a boolean indicating if the texture needs mipmaps generation\r\n */\r\n public generateMipMaps: boolean = false;\r\n /**\r\n * Gets a boolean indicating if the texture uses mipmaps\r\n * TODO implements useMipMaps as a separate setting from generateMipMaps\r\n */\r\n public get useMipMaps() {\r\n return this.generateMipMaps;\r\n }\r\n public set useMipMaps(value: boolean) {\r\n this.generateMipMaps = value;\r\n }\r\n /**\r\n * Gets the number of samples used by the texture (WebGL2+ only)\r\n */\r\n public samples: number = 0;\r\n /**\r\n * Gets the type of the texture (int, float...)\r\n */\r\n public type: number = -1;\r\n /**\r\n * Gets the format of the texture (RGB, RGBA...)\r\n */\r\n public format: number = -1;\r\n /**\r\n * Observable called when the texture is loaded\r\n */\r\n public onLoadedObservable = new Observable();\r\n /**\r\n * Observable called when the texture load is raising an error\r\n */\r\n public onErrorObservable = new Observable>();\r\n /**\r\n * If this callback is defined it will be called instead of the default _rebuild function\r\n */\r\n public onRebuildCallback: Nullable<\r\n (internalTexture: InternalTexture) => {\r\n proxy: Nullable>;\r\n isReady: boolean;\r\n isAsync: boolean;\r\n }\r\n > = null;\r\n /**\r\n * Gets the width of the texture\r\n */\r\n public width: number = 0;\r\n /**\r\n * Gets the height of the texture\r\n */\r\n public height: number = 0;\r\n /**\r\n * Gets the depth of the texture\r\n */\r\n public depth: number = 0;\r\n /**\r\n * Gets the initial width of the texture (It could be rescaled if the current system does not support non power of two textures)\r\n */\r\n public baseWidth: number = 0;\r\n /**\r\n * Gets the initial height of the texture (It could be rescaled if the current system does not support non power of two textures)\r\n */\r\n public baseHeight: number = 0;\r\n /**\r\n * Gets the initial depth of the texture (It could be rescaled if the current system does not support non power of two textures)\r\n */\r\n public baseDepth: number = 0;\r\n /**\r\n * Gets a boolean indicating if the texture is inverted on Y axis\r\n */\r\n public invertY: boolean = false;\r\n\r\n // Private\r\n /** @internal */\r\n public _invertVScale = false;\r\n /** @internal */\r\n public _associatedChannel = -1;\r\n /** @internal */\r\n public _source = InternalTextureSource.Unknown;\r\n /** @internal */\r\n public _buffer: Nullable = null;\r\n /** @internal */\r\n public _bufferView: Nullable = null;\r\n /** @internal */\r\n public _bufferViewArray: Nullable = null;\r\n /** @internal */\r\n public _bufferViewArrayArray: Nullable = null;\r\n /** @internal */\r\n public _size: number = 0;\r\n /** @internal */\r\n public _extension: string = \"\";\r\n /** @internal */\r\n public _files: Nullable = null;\r\n /** @internal */\r\n public _workingCanvas: Nullable = null;\r\n /** @internal */\r\n public _workingContext: Nullable = null;\r\n /** @internal */\r\n public _cachedCoordinatesMode: Nullable = null;\r\n /** @internal */\r\n public _isDisabled: boolean = false;\r\n /** @internal */\r\n public _compression: Nullable = null;\r\n /** @internal */\r\n public _sphericalPolynomial: Nullable = null;\r\n /** @internal */\r\n public _sphericalPolynomialPromise: Nullable> = null;\r\n /** @internal */\r\n public _sphericalPolynomialComputed = false;\r\n /** @internal */\r\n public _lodGenerationScale: number = 0;\r\n /** @internal */\r\n public _lodGenerationOffset: number = 0;\r\n /** @internal */\r\n public _useSRGBBuffer: boolean = false;\r\n /** @internal */\r\n public _creationFlags: number = 0;\r\n /** @internal */\r\n public _originalFormat?: number;\r\n\r\n // The following three fields helps sharing generated fixed LODs for texture filtering\r\n // In environment not supporting the textureLOD extension like EDGE. They are for internal use only.\r\n // They are at the level of the gl texture to benefit from the cache.\r\n /** @internal */\r\n public _lodTextureHigh: Nullable = null;\r\n /** @internal */\r\n public _lodTextureMid: Nullable = null;\r\n /** @internal */\r\n public _lodTextureLow: Nullable = null;\r\n /** @internal */\r\n public _isRGBD: boolean = false;\r\n\r\n /** @internal */\r\n public _linearSpecularLOD: boolean = false;\r\n /** @internal */\r\n public _irradianceTexture: Nullable = null;\r\n\r\n /** @internal */\r\n public _hardwareTexture: Nullable = null;\r\n\r\n /** @internal */\r\n public _maxLodLevel: Nullable = null;\r\n\r\n /** @internal */\r\n public _references: number = 1;\r\n\r\n /** @internal */\r\n public _gammaSpace: Nullable = null;\r\n\r\n /** @internal */\r\n public _premulAlpha = false;\r\n\r\n /** @internal */\r\n public _dynamicTextureSource: Nullable = null;\r\n\r\n private _engine: ThinEngine;\r\n private _uniqueId: number;\r\n\r\n /** @internal */\r\n public static _Counter = 0;\r\n\r\n /** Gets the unique id of the internal texture */\r\n public get uniqueId() {\r\n return this._uniqueId;\r\n }\r\n\r\n /** @internal */\r\n public _setUniqueId(id: number) {\r\n this._uniqueId = id;\r\n }\r\n\r\n /**\r\n * Gets the Engine the texture belongs to.\r\n * @returns The babylon engine\r\n */\r\n public getEngine(): ThinEngine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * Gets the data source type of the texture\r\n */\r\n public get source(): InternalTextureSource {\r\n return this._source;\r\n }\r\n\r\n /**\r\n * Creates a new InternalTexture\r\n * @param engine defines the engine to use\r\n * @param source defines the type of data that will be used\r\n * @param delayAllocation if the texture allocation should be delayed (default: false)\r\n */\r\n constructor(engine: ThinEngine, source: InternalTextureSource, delayAllocation = false) {\r\n super();\r\n\r\n this._engine = engine;\r\n this._source = source;\r\n this._uniqueId = InternalTexture._Counter++;\r\n\r\n if (!delayAllocation) {\r\n this._hardwareTexture = engine._createHardwareTexture();\r\n }\r\n }\r\n\r\n /**\r\n * Increments the number of references (ie. the number of Texture that point to it)\r\n */\r\n public incrementReferences(): void {\r\n this._references++;\r\n }\r\n\r\n /**\r\n * Change the size of the texture (not the size of the content)\r\n * @param width defines the new width\r\n * @param height defines the new height\r\n * @param depth defines the new depth (1 by default)\r\n */\r\n public updateSize(width: int, height: int, depth: int = 1): void {\r\n this._engine.updateTextureDimensions(this, width, height, depth);\r\n\r\n this.width = width;\r\n this.height = height;\r\n this.depth = depth;\r\n\r\n this.baseWidth = width;\r\n this.baseHeight = height;\r\n this.baseDepth = depth;\r\n\r\n this._size = width * height * depth;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n this.isReady = false;\r\n this._cachedCoordinatesMode = null;\r\n this._cachedWrapU = null;\r\n this._cachedWrapV = null;\r\n this._cachedWrapR = null;\r\n this._cachedAnisotropicFilteringLevel = null;\r\n if (this.onRebuildCallback) {\r\n const data = this.onRebuildCallback(this);\r\n const swapAndSetIsReady = (proxyInternalTexture: InternalTexture) => {\r\n proxyInternalTexture._swapAndDie(this, false);\r\n this.isReady = data.isReady;\r\n };\r\n if (data.isAsync) {\r\n (data.proxy as Promise).then(swapAndSetIsReady);\r\n } else {\r\n swapAndSetIsReady(data.proxy as InternalTexture);\r\n }\r\n return;\r\n }\r\n\r\n let proxy: InternalTexture;\r\n switch (this.source) {\r\n case InternalTextureSource.Temp:\r\n break;\r\n\r\n case InternalTextureSource.Url:\r\n proxy = this._engine.createTexture(\r\n this._originalUrl ?? this.url,\r\n !this.generateMipMaps,\r\n this.invertY,\r\n null,\r\n this.samplingMode,\r\n // Do not use Proxy here as it could be fully synchronous\r\n // and proxy would be undefined.\r\n (temp) => {\r\n temp._swapAndDie(this, false);\r\n this.isReady = true;\r\n },\r\n null,\r\n this._buffer,\r\n undefined,\r\n this.format,\r\n this._extension,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._useSRGBBuffer\r\n );\r\n return;\r\n\r\n case InternalTextureSource.Raw:\r\n proxy = this._engine.createRawTexture(\r\n this._bufferView,\r\n this.baseWidth,\r\n this.baseHeight,\r\n this.format,\r\n this.generateMipMaps,\r\n this.invertY,\r\n this.samplingMode,\r\n this._compression,\r\n this.type,\r\n this._creationFlags,\r\n this._useSRGBBuffer\r\n );\r\n proxy._swapAndDie(this, false);\r\n\r\n this.isReady = true;\r\n break;\r\n\r\n case InternalTextureSource.Raw3D:\r\n proxy = this._engine.createRawTexture3D(\r\n this._bufferView,\r\n this.baseWidth,\r\n this.baseHeight,\r\n this.baseDepth,\r\n this.format,\r\n this.generateMipMaps,\r\n this.invertY,\r\n this.samplingMode,\r\n this._compression,\r\n this.type\r\n );\r\n proxy._swapAndDie(this, false);\r\n\r\n this.isReady = true;\r\n break;\r\n\r\n case InternalTextureSource.Raw2DArray:\r\n proxy = this._engine.createRawTexture2DArray(\r\n this._bufferView,\r\n this.baseWidth,\r\n this.baseHeight,\r\n this.baseDepth,\r\n this.format,\r\n this.generateMipMaps,\r\n this.invertY,\r\n this.samplingMode,\r\n this._compression,\r\n this.type\r\n );\r\n proxy._swapAndDie(this, false);\r\n\r\n this.isReady = true;\r\n break;\r\n\r\n case InternalTextureSource.Dynamic:\r\n proxy = this._engine.createDynamicTexture(this.baseWidth, this.baseHeight, this.generateMipMaps, this.samplingMode);\r\n proxy._swapAndDie(this, false);\r\n if (this._dynamicTextureSource) {\r\n this._engine.updateDynamicTexture(this, this._dynamicTextureSource, this.invertY, this._premulAlpha, this.format, true);\r\n }\r\n\r\n // The engine will make sure to update content so no need to flag it as isReady = true\r\n break;\r\n\r\n case InternalTextureSource.Cube:\r\n proxy = this._engine.createCubeTexture(\r\n this.url,\r\n null,\r\n this._files,\r\n !this.generateMipMaps,\r\n () => {\r\n proxy._swapAndDie(this, false);\r\n this.isReady = true;\r\n },\r\n null,\r\n this.format,\r\n this._extension,\r\n false,\r\n 0,\r\n 0,\r\n null,\r\n undefined,\r\n this._useSRGBBuffer\r\n );\r\n return;\r\n\r\n case InternalTextureSource.CubeRaw:\r\n proxy = this._engine.createRawCubeTexture(\r\n this._bufferViewArray!,\r\n this.width,\r\n this._originalFormat ?? this.format,\r\n this.type,\r\n this.generateMipMaps,\r\n this.invertY,\r\n this.samplingMode,\r\n this._compression\r\n );\r\n proxy._swapAndDie(this, false);\r\n this.isReady = true;\r\n break;\r\n\r\n case InternalTextureSource.CubeRawRGBD:\r\n // This case is being handeled by the environment texture tools and is not a part of the rebuild process.\r\n // To use CubeRawRGBD use updateRGBDAsync on the cube texture.\r\n return;\r\n\r\n case InternalTextureSource.CubePrefiltered:\r\n proxy = this._engine.createPrefilteredCubeTexture(\r\n this.url,\r\n null,\r\n this._lodGenerationScale,\r\n this._lodGenerationOffset,\r\n (proxy) => {\r\n if (proxy) {\r\n proxy._swapAndDie(this, false);\r\n }\r\n this.isReady = true;\r\n },\r\n null,\r\n this.format,\r\n this._extension\r\n );\r\n proxy._sphericalPolynomial = this._sphericalPolynomial;\r\n return;\r\n\r\n case InternalTextureSource.DepthStencil:\r\n case InternalTextureSource.Depth: {\r\n // Will be handled at the RenderTargetWrapper level\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _swapAndDie(target: InternalTexture, swapAll = true): void {\r\n // TODO what about refcount on target?\r\n\r\n this._hardwareTexture?.setUsage(target._source, this.generateMipMaps, this.is2DArray, this.isCube, this.is3D, this.width, this.height, this.depth);\r\n\r\n target._hardwareTexture = this._hardwareTexture;\r\n if (swapAll) {\r\n target._isRGBD = this._isRGBD;\r\n }\r\n\r\n if (this._lodTextureHigh) {\r\n if (target._lodTextureHigh) {\r\n target._lodTextureHigh.dispose();\r\n }\r\n target._lodTextureHigh = this._lodTextureHigh;\r\n }\r\n\r\n if (this._lodTextureMid) {\r\n if (target._lodTextureMid) {\r\n target._lodTextureMid.dispose();\r\n }\r\n target._lodTextureMid = this._lodTextureMid;\r\n }\r\n\r\n if (this._lodTextureLow) {\r\n if (target._lodTextureLow) {\r\n target._lodTextureLow.dispose();\r\n }\r\n target._lodTextureLow = this._lodTextureLow;\r\n }\r\n\r\n if (this._irradianceTexture) {\r\n if (target._irradianceTexture) {\r\n target._irradianceTexture.dispose();\r\n }\r\n target._irradianceTexture = this._irradianceTexture;\r\n }\r\n\r\n const cache = this._engine.getLoadedTexturesCache();\r\n let index = cache.indexOf(this);\r\n if (index !== -1) {\r\n cache.splice(index, 1);\r\n }\r\n\r\n index = cache.indexOf(target);\r\n if (index === -1) {\r\n cache.push(target);\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the current allocated resources\r\n */\r\n public dispose(): void {\r\n this._references--;\r\n this.onLoadedObservable.clear();\r\n this.onErrorObservable.clear();\r\n if (this._references === 0) {\r\n this._engine._releaseTexture(this);\r\n this._hardwareTexture = null;\r\n this._dynamicTextureSource = null;\r\n }\r\n }\r\n}\r\n", "import { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\nimport type { IShaderProcessor } from \"../Processors/iShaderProcessor\";\r\n\r\nconst varyingRegex = /(flat\\s)?\\s*varying\\s*.*/;\r\n\r\n/** @internal */\r\nexport class WebGL2ShaderProcessor implements IShaderProcessor {\r\n public shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n public attributeProcessor(attribute: string) {\r\n return attribute.replace(\"attribute\", \"in\");\r\n }\r\n\r\n public varyingCheck(varying: string, _isFragment: boolean) {\r\n return varyingRegex.test(varying);\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean) {\r\n return varying.replace(\"varying\", isFragment ? \"in\" : \"out\");\r\n }\r\n\r\n public postProcessor(code: string, defines: string[], isFragment: boolean) {\r\n const hasDrawBuffersExtension = code.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1;\r\n\r\n // Remove extensions\r\n const regex = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\r\n code = code.replace(regex, \"\");\r\n\r\n // Replace instructions\r\n code = code.replace(/texture2D\\s*\\(/g, \"texture(\");\r\n if (isFragment) {\r\n const hasOutput = code.search(/layout *\\(location *= *0\\) *out/g) !== -1;\r\n\r\n code = code.replace(/texture2DLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCubeLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCube\\s*\\(/g, \"texture(\");\r\n code = code.replace(/gl_FragDepthEXT/g, \"gl_FragDepth\");\r\n code = code.replace(/gl_FragColor/g, \"glFragColor\");\r\n code = code.replace(/gl_FragData/g, \"glFragData\");\r\n code = code.replace(/void\\s+?main\\s*\\(/g, (hasDrawBuffersExtension || hasOutput ? \"\" : \"layout(location = 0) out vec4 glFragColor;\\n\") + \"void main(\");\r\n } else {\r\n const hasMultiviewExtension = defines.indexOf(\"#define MULTIVIEW\") !== -1;\r\n if (hasMultiviewExtension) {\r\n return \"#extension GL_OVR_multiview2 : require\\nlayout (num_views = 2) in;\\n\" + code;\r\n }\r\n }\r\n\r\n return code;\r\n }\r\n}\r\n", "/**\r\n * Class used to store gfx data (like WebGLBuffer)\r\n */\r\nexport class DataBuffer {\r\n private static _Counter = 0;\r\n\r\n /**\r\n * Gets or sets the number of objects referencing this buffer\r\n */\r\n public references: number = 0;\r\n /** Gets or sets the size of the underlying buffer */\r\n public capacity: number = 0;\r\n /**\r\n * Gets or sets a boolean indicating if the buffer contains 32bits indices\r\n */\r\n public is32Bits: boolean = false;\r\n\r\n /**\r\n * Gets the underlying buffer\r\n */\r\n public get underlyingResource(): any {\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the unique id of this buffer\r\n */\r\n public readonly uniqueId: number;\r\n\r\n /**\r\n * Constructs the buffer\r\n */\r\n constructor() {\r\n this.uniqueId = DataBuffer._Counter++;\r\n }\r\n}\r\n", "import { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n/** @internal */\r\nexport class WebGLDataBuffer extends DataBuffer {\r\n private _buffer: Nullable;\r\n\r\n public constructor(resource: WebGLBuffer) {\r\n super();\r\n this._buffer = resource;\r\n }\r\n\r\n public get underlyingResource(): any {\r\n return this._buffer;\r\n }\r\n}\r\n", "import type { IPipelineContext } from \"../IPipelineContext\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Effect } from \"../../Materials/effect\";\r\nimport type { IMatrixLike, IVector2Like, IVector3Like, IVector4Like, IColor3Like, IColor4Like, IQuaternionLike } from \"../../Maths/math.like\";\r\nimport type { ThinEngine } from \"../thinEngine\";\r\n\r\n/** @internal */\r\nexport class WebGLPipelineContext implements IPipelineContext {\r\n private _valueCache: { [key: string]: any } = {};\r\n private _uniforms: { [key: string]: Nullable };\r\n\r\n public engine: ThinEngine;\r\n public program: Nullable;\r\n public context?: WebGLRenderingContext;\r\n public vertexShader?: WebGLShader;\r\n public fragmentShader?: WebGLShader;\r\n public isParallelCompiled: boolean;\r\n public onCompiled?: () => void;\r\n public transformFeedback?: WebGLTransformFeedback | null;\r\n\r\n public vertexCompilationError: Nullable = null;\r\n public fragmentCompilationError: Nullable = null;\r\n public programLinkError: Nullable = null;\r\n public programValidationError: Nullable = null;\r\n\r\n /** @internal */\r\n public _isDisposed = false;\r\n\r\n public get isAsync() {\r\n return this.isParallelCompiled;\r\n }\r\n\r\n public get isReady(): boolean {\r\n if (this.program) {\r\n if (this.isParallelCompiled) {\r\n return this.engine._isRenderingStateCompiled(this);\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public _handlesSpectorRebuildCallback(onCompiled: (program: WebGLProgram) => void): void {\r\n if (onCompiled && this.program) {\r\n onCompiled(this.program);\r\n }\r\n }\r\n\r\n public _fillEffectInformation(\r\n effect: Effect,\r\n uniformBuffersNames: { [key: string]: number },\r\n uniformsNames: string[],\r\n uniforms: { [key: string]: Nullable },\r\n samplerList: string[],\r\n samplers: { [key: string]: number },\r\n attributesNames: string[],\r\n attributes: number[]\r\n ) {\r\n const engine = this.engine;\r\n if (engine.supportsUniformBuffers) {\r\n for (const name in uniformBuffersNames) {\r\n effect.bindUniformBlock(name, uniformBuffersNames[name]);\r\n }\r\n }\r\n\r\n const effectAvailableUniforms = this.engine.getUniforms(this, uniformsNames);\r\n effectAvailableUniforms.forEach((uniform, index) => {\r\n uniforms[uniformsNames[index]] = uniform;\r\n });\r\n this._uniforms = uniforms;\r\n\r\n let index: number;\r\n for (index = 0; index < samplerList.length; index++) {\r\n const sampler = effect.getUniform(samplerList[index]);\r\n if (sampler == null) {\r\n samplerList.splice(index, 1);\r\n index--;\r\n }\r\n }\r\n\r\n samplerList.forEach((name, index) => {\r\n samplers[name] = index;\r\n });\r\n\r\n for (const attr of engine.getAttributes(this, attributesNames)) {\r\n attributes.push(attr);\r\n }\r\n }\r\n\r\n /**\r\n * Release all associated resources.\r\n **/\r\n public dispose() {\r\n this._uniforms = {};\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _cacheMatrix(uniformName: string, matrix: IMatrixLike): boolean {\r\n const cache = this._valueCache[uniformName];\r\n const flag = matrix.updateFlag;\r\n if (cache !== undefined && cache === flag) {\r\n return false;\r\n }\r\n\r\n this._valueCache[uniformName] = flag;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _cacheFloat2(uniformName: string, x: number, y: number): boolean {\r\n let cache = this._valueCache[uniformName];\r\n if (!cache || cache.length !== 2) {\r\n cache = [x, y];\r\n this._valueCache[uniformName] = cache;\r\n return true;\r\n }\r\n\r\n let changed = false;\r\n if (cache[0] !== x) {\r\n cache[0] = x;\r\n changed = true;\r\n }\r\n if (cache[1] !== y) {\r\n cache[1] = y;\r\n changed = true;\r\n }\r\n\r\n return changed;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _cacheFloat3(uniformName: string, x: number, y: number, z: number): boolean {\r\n let cache = this._valueCache[uniformName];\r\n if (!cache || cache.length !== 3) {\r\n cache = [x, y, z];\r\n this._valueCache[uniformName] = cache;\r\n return true;\r\n }\r\n\r\n let changed = false;\r\n if (cache[0] !== x) {\r\n cache[0] = x;\r\n changed = true;\r\n }\r\n if (cache[1] !== y) {\r\n cache[1] = y;\r\n changed = true;\r\n }\r\n if (cache[2] !== z) {\r\n cache[2] = z;\r\n changed = true;\r\n }\r\n\r\n return changed;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _cacheFloat4(uniformName: string, x: number, y: number, z: number, w: number): boolean {\r\n let cache = this._valueCache[uniformName];\r\n if (!cache || cache.length !== 4) {\r\n cache = [x, y, z, w];\r\n this._valueCache[uniformName] = cache;\r\n return true;\r\n }\r\n\r\n let changed = false;\r\n if (cache[0] !== x) {\r\n cache[0] = x;\r\n changed = true;\r\n }\r\n if (cache[1] !== y) {\r\n cache[1] = y;\r\n changed = true;\r\n }\r\n if (cache[2] !== z) {\r\n cache[2] = z;\r\n changed = true;\r\n }\r\n if (cache[3] !== w) {\r\n cache[3] = w;\r\n changed = true;\r\n }\r\n\r\n return changed;\r\n }\r\n\r\n /**\r\n * Sets an integer value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value Value to be set.\r\n */\r\n public setInt(uniformName: string, value: number): void {\r\n const cache = this._valueCache[uniformName];\r\n if (cache !== undefined && cache === value) {\r\n return;\r\n }\r\n\r\n if (this.engine.setInt(this._uniforms[uniformName], value)) {\r\n this._valueCache[uniformName] = value;\r\n }\r\n }\r\n\r\n /**\r\n * Sets a int2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int2.\r\n * @param y Second int in int2.\r\n */\r\n public setInt2(uniformName: string, x: number, y: number): void {\r\n if (this._cacheFloat2(uniformName, x, y)) {\r\n if (!this.engine.setInt2(this._uniforms[uniformName], x, y)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a int3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int3.\r\n * @param y Second int in int3.\r\n * @param z Third int in int3.\r\n */\r\n public setInt3(uniformName: string, x: number, y: number, z: number): void {\r\n if (this._cacheFloat3(uniformName, x, y, z)) {\r\n if (!this.engine.setInt3(this._uniforms[uniformName], x, y, z)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a int4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int4.\r\n * @param y Second int in int4.\r\n * @param z Third int in int4.\r\n * @param w Fourth int in int4.\r\n */\r\n public setInt4(uniformName: string, x: number, y: number, z: number, w: number): void {\r\n if (this._cacheFloat4(uniformName, x, y, z, w)) {\r\n if (!this.engine.setInt4(this._uniforms[uniformName], x, y, z, w)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets an int array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setIntArray(uniformName: string, array: Int32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setIntArray(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setIntArray2(uniformName: string, array: Int32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setIntArray2(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setIntArray3(uniformName: string, array: Int32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setIntArray3(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setIntArray4(uniformName: string, array: Int32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setIntArray4(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an unsigned integer value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value Value to be set.\r\n */\r\n public setUInt(uniformName: string, value: number): void {\r\n const cache = this._valueCache[uniformName];\r\n if (cache !== undefined && cache === value) {\r\n return;\r\n }\r\n\r\n if (this.engine.setUInt(this._uniforms[uniformName], value)) {\r\n this._valueCache[uniformName] = value;\r\n }\r\n }\r\n\r\n /**\r\n * Sets an unsigned int2 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint2.\r\n * @param y Second unsigned int in uint2.\r\n */\r\n public setUInt2(uniformName: string, x: number, y: number): void {\r\n if (this._cacheFloat2(uniformName, x, y)) {\r\n if (!this.engine.setUInt2(this._uniforms[uniformName], x, y)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets an unsigned int3 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint3.\r\n * @param y Second unsigned int in uint3.\r\n * @param z Third unsigned int in uint3.\r\n */\r\n public setUInt3(uniformName: string, x: number, y: number, z: number): void {\r\n if (this._cacheFloat3(uniformName, x, y, z)) {\r\n if (!this.engine.setUInt3(this._uniforms[uniformName], x, y, z)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets an unsigned int4 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint4.\r\n * @param y Second unsigned int in uint4.\r\n * @param z Third unsigned int in uint4.\r\n * @param w Fourth unsigned int in uint4.\r\n */\r\n public setUInt4(uniformName: string, x: number, y: number, z: number, w: number): void {\r\n if (this._cacheFloat4(uniformName, x, y, z, w)) {\r\n if (!this.engine.setUInt4(this._uniforms[uniformName], x, y, z, w)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setUIntArray(uniformName: string, array: Uint32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setUIntArray(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setUIntArray2(uniformName: string, array: Uint32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setUIntArray2(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setUIntArray3(uniformName: string, array: Uint32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setUIntArray3(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setUIntArray4(uniformName: string, array: Uint32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setUIntArray4(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setArray(uniformName: string, array: number[]): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setArray(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setArray2(uniformName: string, array: number[]): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setArray2(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setArray3(uniformName: string, array: number[]): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setArray3(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setArray4(uniformName: string, array: number[]): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setArray4(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets matrices on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param matrices matrices to be set.\r\n */\r\n public setMatrices(uniformName: string, matrices: Float32Array): void {\r\n if (!matrices) {\r\n return;\r\n }\r\n\r\n this._valueCache[uniformName] = null;\r\n this.engine.setMatrices(this._uniforms[uniformName], matrices);\r\n }\r\n\r\n /**\r\n * Sets matrix on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n */\r\n public setMatrix(uniformName: string, matrix: IMatrixLike): void {\r\n if (this._cacheMatrix(uniformName, matrix)) {\r\n if (!this.engine.setMatrices(this._uniforms[uniformName], matrix.asArray())) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix)\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n */\r\n public setMatrix3x3(uniformName: string, matrix: Float32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setMatrix3x3(this._uniforms[uniformName], matrix);\r\n }\r\n\r\n /**\r\n * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix)\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n */\r\n public setMatrix2x2(uniformName: string, matrix: Float32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setMatrix2x2(this._uniforms[uniformName], matrix);\r\n }\r\n\r\n /**\r\n * Sets a float on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value value to be set.\r\n */\r\n public setFloat(uniformName: string, value: number): void {\r\n const cache = this._valueCache[uniformName];\r\n if (cache !== undefined && cache === value) {\r\n return;\r\n }\r\n\r\n if (this.engine.setFloat(this._uniforms[uniformName], value)) {\r\n this._valueCache[uniformName] = value;\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Vector2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector2 vector2 to be set.\r\n */\r\n public setVector2(uniformName: string, vector2: IVector2Like): void {\r\n if (this._cacheFloat2(uniformName, vector2.x, vector2.y)) {\r\n if (!this.engine.setFloat2(this._uniforms[uniformName], vector2.x, vector2.y)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a float2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float2.\r\n * @param y Second float in float2.\r\n */\r\n public setFloat2(uniformName: string, x: number, y: number): void {\r\n if (this._cacheFloat2(uniformName, x, y)) {\r\n if (!this.engine.setFloat2(this._uniforms[uniformName], x, y)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Vector3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector3 Value to be set.\r\n */\r\n public setVector3(uniformName: string, vector3: IVector3Like): void {\r\n if (this._cacheFloat3(uniformName, vector3.x, vector3.y, vector3.z)) {\r\n if (!this.engine.setFloat3(this._uniforms[uniformName], vector3.x, vector3.y, vector3.z)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a float3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float3.\r\n * @param y Second float in float3.\r\n * @param z Third float in float3.\r\n */\r\n public setFloat3(uniformName: string, x: number, y: number, z: number): void {\r\n if (this._cacheFloat3(uniformName, x, y, z)) {\r\n if (!this.engine.setFloat3(this._uniforms[uniformName], x, y, z)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Vector4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector4 Value to be set.\r\n */\r\n public setVector4(uniformName: string, vector4: IVector4Like): void {\r\n if (this._cacheFloat4(uniformName, vector4.x, vector4.y, vector4.z, vector4.w)) {\r\n if (!this.engine.setFloat4(this._uniforms[uniformName], vector4.x, vector4.y, vector4.z, vector4.w)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Quaternion on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param quaternion Value to be set.\r\n */\r\n public setQuaternion(uniformName: string, quaternion: IQuaternionLike): void {\r\n if (this._cacheFloat4(uniformName, quaternion.x, quaternion.y, quaternion.z, quaternion.w)) {\r\n if (!this.engine.setFloat4(this._uniforms[uniformName], quaternion.x, quaternion.y, quaternion.z, quaternion.w)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a float4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float4.\r\n * @param y Second float in float4.\r\n * @param z Third float in float4.\r\n * @param w Fourth float in float4.\r\n */\r\n public setFloat4(uniformName: string, x: number, y: number, z: number, w: number): void {\r\n if (this._cacheFloat4(uniformName, x, y, z, w)) {\r\n if (!this.engine.setFloat4(this._uniforms[uniformName], x, y, z, w)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Color3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param color3 Value to be set.\r\n */\r\n public setColor3(uniformName: string, color3: IColor3Like): void {\r\n if (this._cacheFloat3(uniformName, color3.r, color3.g, color3.b)) {\r\n if (!this.engine.setFloat3(this._uniforms[uniformName], color3.r, color3.g, color3.b)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Color4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param color3 Value to be set.\r\n * @param alpha Alpha value to be set.\r\n */\r\n public setColor4(uniformName: string, color3: IColor3Like, alpha: number): void {\r\n if (this._cacheFloat4(uniformName, color3.r, color3.g, color3.b, alpha)) {\r\n if (!this.engine.setFloat4(this._uniforms[uniformName], color3.r, color3.g, color3.b, alpha)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Color4 on a uniform variable\r\n * @param uniformName defines the name of the variable\r\n * @param color4 defines the value to be set\r\n */\r\n public setDirectColor4(uniformName: string, color4: IColor4Like): void {\r\n if (this._cacheFloat4(uniformName, color4.r, color4.g, color4.b, color4.a)) {\r\n if (!this.engine.setFloat4(this._uniforms[uniformName], color4.r, color4.g, color4.b, color4.a)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n public _getVertexShaderCode(): string | null {\r\n return this.vertexShader ? this.engine._getShaderSource(this.vertexShader) : null;\r\n }\r\n\r\n public _getFragmentShaderCode(): string | null {\r\n return this.fragmentShader ? this.engine._getShaderSource(this.fragmentShader) : null;\r\n }\r\n}\r\n", "import type { HardwareTextureWrapper } from \"../../Materials/Textures/hardwareTextureWrapper\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n/** @internal */\r\nexport class WebGLHardwareTexture implements HardwareTextureWrapper {\r\n private _webGLTexture: WebGLTexture;\r\n private _context: WebGLRenderingContext;\r\n\r\n // There can be multiple buffers for a single WebGL texture because different layers of a 2DArrayTexture / 3DTexture\r\n // or different faces of a cube texture can be bound to different render targets at the same time.\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private _MSAARenderBuffers: Nullable = null;\r\n\r\n public get underlyingResource(): Nullable {\r\n return this._webGLTexture;\r\n }\r\n\r\n constructor(existingTexture: Nullable = null, context: WebGLRenderingContext) {\r\n this._context = context as WebGLRenderingContext;\r\n if (!existingTexture) {\r\n existingTexture = context.createTexture();\r\n if (!existingTexture) {\r\n throw new Error(\"Unable to create webGL texture\");\r\n }\r\n }\r\n this.set(existingTexture);\r\n }\r\n\r\n public setUsage(): void {}\r\n\r\n public set(hardwareTexture: WebGLTexture) {\r\n this._webGLTexture = hardwareTexture;\r\n }\r\n\r\n public reset() {\r\n this._webGLTexture = null as any;\r\n this._MSAARenderBuffers = null;\r\n }\r\n\r\n public addMSAARenderBuffer(buffer: WebGLRenderbuffer) {\r\n if (!this._MSAARenderBuffers) {\r\n this._MSAARenderBuffers = [];\r\n }\r\n this._MSAARenderBuffers.push(buffer);\r\n }\r\n\r\n public releaseMSAARenderBuffers() {\r\n if (this._MSAARenderBuffers) {\r\n for (const buffer of this._MSAARenderBuffers) {\r\n this._context.deleteRenderbuffer(buffer);\r\n }\r\n this._MSAARenderBuffers = null;\r\n }\r\n }\r\n\r\n public getMSAARenderBuffer(index = 0) {\r\n return this._MSAARenderBuffers?.[index] ?? null;\r\n }\r\n\r\n public release() {\r\n this.releaseMSAARenderBuffers();\r\n\r\n if (this._webGLTexture) {\r\n this._context.deleteTexture(this._webGLTexture);\r\n }\r\n this.reset();\r\n }\r\n}\r\n", "import type { IDrawContext } from \"../Engines/IDrawContext\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\nimport type { Nullable } from \"../types\";\r\n\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport type { Effect } from \"./effect\";\r\nimport type { MaterialDefines } from \"./materialDefines\";\r\n\r\n/** @internal */\r\nexport class DrawWrapper {\r\n public effect: Nullable;\r\n public defines: Nullable;\r\n public materialContext?: IMaterialContext;\r\n public drawContext?: IDrawContext;\r\n\r\n /**\r\n * @internal\r\n * Specifies if the effect was previously ready\r\n */\r\n public _wasPreviouslyReady = false;\r\n\r\n /**\r\n * @internal\r\n * Forces the code from bindForSubMesh to be fully run the next time it is called\r\n */\r\n public _forceRebindOnNextCall = true;\r\n\r\n /**\r\n * @internal\r\n * Specifies if the effect was previously using instances\r\n */\r\n public _wasPreviouslyUsingInstances: Nullable = null;\r\n\r\n public static IsWrapper(effect: Effect | DrawWrapper): effect is DrawWrapper {\r\n return (effect as Effect).getPipelineContext === undefined;\r\n }\r\n\r\n public static GetEffect(effect: Effect | DrawWrapper): Nullable {\r\n return (effect as Effect).getPipelineContext === undefined ? (effect as DrawWrapper).effect : (effect as Effect);\r\n }\r\n\r\n constructor(engine: ThinEngine, createMaterialContext = true) {\r\n this.effect = null;\r\n this.defines = null;\r\n this.drawContext = engine.createDrawContext();\r\n if (createMaterialContext) {\r\n this.materialContext = engine.createMaterialContext();\r\n }\r\n }\r\n\r\n public setEffect(effect: Nullable, defines?: Nullable, resetContext = true): void {\r\n this.effect = effect;\r\n if (defines !== undefined) {\r\n this.defines = defines;\r\n }\r\n if (resetContext) {\r\n this.drawContext?.reset();\r\n }\r\n }\r\n\r\n public dispose(): void {\r\n this.drawContext?.dispose();\r\n }\r\n}\r\n", "import type { IStencilState } from \"./IStencilState\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class StencilStateComposer {\r\n protected _isStencilTestDirty = false;\r\n protected _isStencilMaskDirty = false;\r\n protected _isStencilFuncDirty = false;\r\n protected _isStencilOpDirty = false;\r\n\r\n protected _enabled: boolean;\r\n\r\n protected _mask: number;\r\n\r\n protected _func: number;\r\n protected _funcRef: number;\r\n protected _funcMask: number;\r\n\r\n protected _opStencilFail: number;\r\n protected _opDepthFail: number;\r\n protected _opStencilDepthPass: number;\r\n\r\n public stencilGlobal: IStencilState;\r\n public stencilMaterial: IStencilState | undefined;\r\n\r\n public useStencilGlobalOnly = false;\r\n\r\n public get isDirty(): boolean {\r\n return this._isStencilTestDirty || this._isStencilMaskDirty || this._isStencilFuncDirty || this._isStencilOpDirty;\r\n }\r\n\r\n public get func(): number {\r\n return this._func;\r\n }\r\n\r\n public set func(value: number) {\r\n if (this._func === value) {\r\n return;\r\n }\r\n\r\n this._func = value;\r\n this._isStencilFuncDirty = true;\r\n }\r\n\r\n public get funcRef(): number {\r\n return this._funcRef;\r\n }\r\n\r\n public set funcRef(value: number) {\r\n if (this._funcRef === value) {\r\n return;\r\n }\r\n\r\n this._funcRef = value;\r\n this._isStencilFuncDirty = true;\r\n }\r\n\r\n public get funcMask(): number {\r\n return this._funcMask;\r\n }\r\n\r\n public set funcMask(value: number) {\r\n if (this._funcMask === value) {\r\n return;\r\n }\r\n\r\n this._funcMask = value;\r\n this._isStencilFuncDirty = true;\r\n }\r\n\r\n public get opStencilFail(): number {\r\n return this._opStencilFail;\r\n }\r\n\r\n public set opStencilFail(value: number) {\r\n if (this._opStencilFail === value) {\r\n return;\r\n }\r\n\r\n this._opStencilFail = value;\r\n this._isStencilOpDirty = true;\r\n }\r\n\r\n public get opDepthFail(): number {\r\n return this._opDepthFail;\r\n }\r\n\r\n public set opDepthFail(value: number) {\r\n if (this._opDepthFail === value) {\r\n return;\r\n }\r\n\r\n this._opDepthFail = value;\r\n this._isStencilOpDirty = true;\r\n }\r\n\r\n public get opStencilDepthPass(): number {\r\n return this._opStencilDepthPass;\r\n }\r\n\r\n public set opStencilDepthPass(value: number) {\r\n if (this._opStencilDepthPass === value) {\r\n return;\r\n }\r\n\r\n this._opStencilDepthPass = value;\r\n this._isStencilOpDirty = true;\r\n }\r\n\r\n public get mask(): number {\r\n return this._mask;\r\n }\r\n\r\n public set mask(value: number) {\r\n if (this._mask === value) {\r\n return;\r\n }\r\n\r\n this._mask = value;\r\n this._isStencilMaskDirty = true;\r\n }\r\n\r\n public get enabled(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n public set enabled(value: boolean) {\r\n if (this._enabled === value) {\r\n return;\r\n }\r\n\r\n this._enabled = value;\r\n this._isStencilTestDirty = true;\r\n }\r\n\r\n public constructor(reset = true) {\r\n if (reset) {\r\n this.reset();\r\n }\r\n }\r\n\r\n public reset() {\r\n this.stencilMaterial = undefined;\r\n\r\n this.stencilGlobal?.reset();\r\n\r\n this._isStencilTestDirty = true;\r\n this._isStencilMaskDirty = true;\r\n this._isStencilFuncDirty = true;\r\n this._isStencilOpDirty = true;\r\n }\r\n\r\n public apply(gl?: WebGLRenderingContext) {\r\n if (!gl) {\r\n return;\r\n }\r\n\r\n const stencilMaterialEnabled = !this.useStencilGlobalOnly && !!this.stencilMaterial?.enabled;\r\n\r\n this.enabled = stencilMaterialEnabled ? this.stencilMaterial!.enabled : this.stencilGlobal.enabled;\r\n this.func = stencilMaterialEnabled ? this.stencilMaterial!.func : this.stencilGlobal.func;\r\n this.funcRef = stencilMaterialEnabled ? this.stencilMaterial!.funcRef : this.stencilGlobal.funcRef;\r\n this.funcMask = stencilMaterialEnabled ? this.stencilMaterial!.funcMask : this.stencilGlobal.funcMask;\r\n this.opStencilFail = stencilMaterialEnabled ? this.stencilMaterial!.opStencilFail : this.stencilGlobal.opStencilFail;\r\n this.opDepthFail = stencilMaterialEnabled ? this.stencilMaterial!.opDepthFail : this.stencilGlobal.opDepthFail;\r\n this.opStencilDepthPass = stencilMaterialEnabled ? this.stencilMaterial!.opStencilDepthPass : this.stencilGlobal.opStencilDepthPass;\r\n this.mask = stencilMaterialEnabled ? this.stencilMaterial!.mask : this.stencilGlobal.mask;\r\n\r\n if (!this.isDirty) {\r\n return;\r\n }\r\n\r\n // Stencil test\r\n if (this._isStencilTestDirty) {\r\n if (this.enabled) {\r\n gl.enable(gl.STENCIL_TEST);\r\n } else {\r\n gl.disable(gl.STENCIL_TEST);\r\n }\r\n this._isStencilTestDirty = false;\r\n }\r\n\r\n // Stencil mask\r\n if (this._isStencilMaskDirty) {\r\n gl.stencilMask(this.mask);\r\n this._isStencilMaskDirty = false;\r\n }\r\n\r\n // Stencil func\r\n if (this._isStencilFuncDirty) {\r\n gl.stencilFunc(this.func, this.funcRef, this.funcMask);\r\n this._isStencilFuncDirty = false;\r\n }\r\n\r\n // Stencil op\r\n if (this._isStencilOpDirty) {\r\n gl.stencilOp(this.opStencilFail, this.opDepthFail, this.opStencilDepthPass);\r\n this._isStencilOpDirty = false;\r\n }\r\n }\r\n}\r\n", "import { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { IShaderProcessor } from \"../Processors/iShaderProcessor\";\r\nimport type { ShaderProcessingContext } from \"../Processors/shaderProcessingOptions\";\r\n\r\nimport type { ThinEngine } from \"../thinEngine\";\r\n\r\n/** @internal */\r\nexport class WebGLShaderProcessor implements IShaderProcessor {\r\n public shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n public postProcessor(code: string, defines: string[], isFragment: boolean, processingContext: Nullable, engine: ThinEngine) {\r\n // Remove extensions\r\n if (!engine.getCaps().drawBuffersExtension) {\r\n // even if enclosed in #if/#endif, IE11 does parse the #extension declaration, so we need to remove it altogether\r\n const regex = /#extension.+GL_EXT_draw_buffers.+(enable|require)/g;\r\n code = code.replace(regex, \"\");\r\n }\r\n\r\n return code;\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { EngineStore } from \"./engineStore\";\r\nimport type { IInternalTextureLoader } from \"../Materials/Textures/internalTextureLoader\";\r\nimport type { IEffectCreationOptions, IShaderPath } from \"../Materials/effect\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport type { IShaderProcessor } from \"./Processors/iShaderProcessor\";\r\nimport type { ShaderProcessingContext } from \"./Processors/shaderProcessingOptions\";\r\nimport type { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport type { Nullable, DataArray, IndicesArray, FloatArray, DeepImmutable } from \"../types\";\r\nimport type { EngineCapabilities } from \"./engineCapabilities\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { DepthCullingState } from \"../States/depthCullingState\";\r\nimport { StencilState } from \"../States/stencilState\";\r\nimport { AlphaState } from \"../States/alphaCullingState\";\r\nimport { Constants } from \"./constants\";\r\nimport { InternalTexture, InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport type { IViewportLike, IColor4Like } from \"../Maths/math.like\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport type { IFileRequest } from \"../Misc/fileRequest\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { IsDocumentAvailable, IsWindowObjectExist } from \"../Misc/domManagement\";\r\nimport { WebGLShaderProcessor } from \"./WebGL/webGLShaderProcessors\";\r\nimport { WebGL2ShaderProcessor } from \"./WebGL/webGL2ShaderProcessors\";\r\nimport { WebGLDataBuffer } from \"../Meshes/WebGL/webGLDataBuffer\";\r\nimport type { IPipelineContext } from \"./IPipelineContext\";\r\nimport { WebGLPipelineContext } from \"./WebGL/webGLPipelineContext\";\r\nimport type { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { InstancingAttributeInfo } from \"./instancingAttributeInfo\";\r\nimport type { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport type { IOfflineProvider } from \"../Offline/IOfflineProvider\";\r\nimport type { IEffectFallbacks } from \"../Materials/iEffectFallbacks\";\r\nimport type { IWebRequest } from \"../Misc/interfaces/iWebRequest\";\r\nimport { PerformanceConfigurator } from \"./performanceConfigurator\";\r\nimport type { EngineFeatures } from \"./engineFeatures\";\r\nimport type { HardwareTextureWrapper } from \"../Materials/Textures/hardwareTextureWrapper\";\r\nimport { WebGLHardwareTexture } from \"./WebGL/webGLHardwareTexture\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { IMaterialContext } from \"./IMaterialContext\";\r\nimport type { IDrawContext } from \"./IDrawContext\";\r\nimport type { ICanvas, ICanvasRenderingContext, IImage } from \"./ICanvas\";\r\nimport { StencilStateComposer } from \"../States/stencilStateComposer\";\r\nimport type { StorageBuffer } from \"../Buffers/storageBuffer\";\r\nimport type { IAudioEngineOptions } from \"../Audio/Interfaces/IAudioEngineOptions\";\r\nimport type { IStencilState } from \"../States/IStencilState\";\r\nimport type { InternalTextureCreationOptions, TextureSize } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\nimport type { RenderTargetWrapper } from \"./renderTargetWrapper\";\r\nimport type { WebGLRenderTargetWrapper } from \"./WebGL/webGLRenderTargetWrapper\";\r\nimport type { VideoTexture } from \"../Materials/Textures/videoTexture\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { WebRequest } from \"../Misc/webRequest\";\r\nimport type { LoadFileError } from \"../Misc/fileTools\";\r\nimport type { Texture } from \"../Materials/Textures/texture\";\r\nimport { PrecisionDate } from \"../Misc/precisionDate\";\r\n\r\n/**\r\n * Defines the interface used by objects working like Scene\r\n * @internal\r\n */\r\nexport interface ISceneLike {\r\n addPendingData(data: any): void;\r\n removePendingData(data: any): void;\r\n offlineProvider: IOfflineProvider;\r\n}\r\n\r\n/**\r\n * Keeps track of all the buffer info used in engine.\r\n */\r\nclass BufferPointer {\r\n public active: boolean;\r\n public index: number;\r\n public size: number;\r\n public type: number;\r\n public normalized: boolean;\r\n public stride: number;\r\n public offset: number;\r\n public buffer: WebGLBuffer;\r\n}\r\n\r\n/**\r\n * Information about the current host\r\n */\r\nexport interface HostInformation {\r\n /**\r\n * Defines if the current host is a mobile\r\n */\r\n isMobile: boolean;\r\n}\r\n\r\n/** Interface defining initialization parameters for ThinEngine class */\r\nexport interface ThinEngineOptions {\r\n /**\r\n * Defines if the engine should no exceed a specified device ratio\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio\r\n */\r\n limitDeviceRatio?: number;\r\n /**\r\n * Defines if webaudio should be initialized as well\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/audio/playingSoundsMusic\r\n */\r\n audioEngine?: boolean;\r\n /**\r\n * Specifies options for the audio engine\r\n */\r\n audioEngineOptions?: IAudioEngineOptions;\r\n\r\n /**\r\n * Defines if animations should run using a deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n */\r\n deterministicLockstep?: boolean;\r\n /** Defines the maximum steps to use with deterministic lock step mode */\r\n lockstepMaxSteps?: number;\r\n /** Defines the seconds between each deterministic lock step */\r\n timeStep?: number;\r\n /**\r\n * Defines that engine should ignore context lost events\r\n * If this event happens when this parameter is true, you will have to reload the page to restore rendering\r\n */\r\n doNotHandleContextLost?: boolean;\r\n /**\r\n * Defines that engine should ignore modifying touch action attribute and style\r\n * If not handle, you might need to set it up on your side for expected touch devices behavior.\r\n */\r\n doNotHandleTouchAction?: boolean;\r\n\r\n /**\r\n * Make the matrix computations to be performed in 64 bits instead of 32 bits. False by default\r\n */\r\n useHighPrecisionMatrix?: boolean;\r\n\r\n /**\r\n * Defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n adaptToDeviceRatio?: boolean;\r\n\r\n /**\r\n * True if the more expensive but exact conversions should be used for transforming colors to and from linear space within shaders.\r\n * Otherwise, the default is to use a cheaper approximation.\r\n */\r\n useExactSrgbConversions?: boolean;\r\n\r\n /**\r\n * Defines whether MSAA is enabled on the canvas.\r\n */\r\n antialias?: boolean;\r\n\r\n /**\r\n * Defines whether the stencil buffer should be enabled.\r\n */\r\n stencil?: boolean;\r\n\r\n /**\r\n * Defines whether the canvas should be created in \"premultiplied\" mode (if false, the canvas is created in the \"opaque\" mode) (true by default)\r\n */\r\n premultipliedAlpha?: boolean;\r\n}\r\n\r\n/** Interface defining initialization parameters for Engine class */\r\nexport interface EngineOptions extends ThinEngineOptions, WebGLContextAttributes {\r\n /**\r\n * Defines if webgl2 should be turned off even if supported\r\n * @see https://doc.babylonjs.com/setup/support/webGL2\r\n */\r\n disableWebGL2Support?: boolean;\r\n\r\n /**\r\n * Defines that engine should compile shaders with high precision floats (if supported). True by default\r\n */\r\n useHighPrecisionFloats?: boolean;\r\n /**\r\n * Make the canvas XR Compatible for XR sessions\r\n */\r\n xrCompatible?: boolean;\r\n\r\n /**\r\n * Will prevent the system from falling back to software implementation if a hardware device cannot be created\r\n */\r\n failIfMajorPerformanceCaveat?: boolean;\r\n\r\n /**\r\n * If sRGB Buffer support is not set during construction, use this value to force a specific state\r\n * This is added due to an issue when processing textures in chrome/edge/firefox\r\n * This will not influence NativeEngine and WebGPUEngine which set the behavior to true during construction.\r\n */\r\n forceSRGBBufferSupportState?: boolean;\r\n\r\n /**\r\n * Defines if the gl context should be released.\r\n * It's false by default for backward compatibility, but you should probably pass true (see https://registry.khronos.org/webgl/extensions/WEBGL_lose_context/)\r\n */\r\n loseContextOnDispose?: boolean;\r\n}\r\n\r\n/**\r\n * The base engine class (root of all engines)\r\n */\r\nexport class ThinEngine {\r\n private static _TempClearColorUint32 = new Uint32Array(4);\r\n private static _TempClearColorInt32 = new Int32Array(4);\r\n\r\n /** Use this array to turn off some WebGL2 features on known buggy browsers version */\r\n public static ExceptionList = [\r\n { key: \"Chrome/63.0\", capture: \"63\\\\.0\\\\.3239\\\\.(\\\\d+)\", captureConstraint: 108, targets: [\"uniformBuffer\"] },\r\n { key: \"Firefox/58\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\r\n { key: \"Firefox/59\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\r\n { key: \"Chrome/72.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Chrome/73.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Chrome/74.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Mac OS.+Chrome/71\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Mac OS.+Chrome/72\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Mac OS.+Chrome\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\r\n { key: \"Chrome/12\\\\d\\\\..+?Mobile\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\r\n // desktop osx safari 15.4\r\n { key: \".*AppleWebKit.*(15.4).*Safari\", capture: null, captureConstraint: null, targets: [\"antialias\", \"maxMSAASamples\"] },\r\n // mobile browsers using safari 15.4 on ios\r\n { key: \".*(15.4).*AppleWebKit.*Safari\", capture: null, captureConstraint: null, targets: [\"antialias\", \"maxMSAASamples\"] },\r\n ];\r\n\r\n /** @internal */\r\n public static _TextureLoaders: IInternalTextureLoader[] = [];\r\n\r\n /**\r\n * Returns the current npm package of the sdk\r\n */\r\n // Not mixed with Version for tooling purpose.\r\n public static get NpmPackage(): string {\r\n return \"babylonjs@7.1.0\";\r\n }\r\n\r\n /**\r\n * Returns the current version of the framework\r\n */\r\n public static get Version(): string {\r\n return \"7.1.0\";\r\n }\r\n\r\n /**\r\n * Returns a string describing the current engine\r\n */\r\n public get description(): string {\r\n let description = this.name + this.webGLVersion;\r\n\r\n if (this._caps.parallelShaderCompile) {\r\n description += \" - Parallel shader compilation\";\r\n }\r\n\r\n return description;\r\n }\r\n\r\n /** @internal */\r\n protected _name = \"WebGL\";\r\n\r\n /**\r\n * Gets or sets the name of the engine\r\n */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n public set name(value: string) {\r\n this._name = value;\r\n }\r\n\r\n /**\r\n * Returns the version of the engine\r\n */\r\n public get version(): number {\r\n return this._webGLVersion;\r\n }\r\n\r\n protected _isDisposed = false;\r\n\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n // Updatable statics so stick with vars here\r\n\r\n /**\r\n * Gets or sets the epsilon value used by collision engine\r\n */\r\n public static CollisionsEpsilon = 0.001;\r\n\r\n /**\r\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\r\n */\r\n public static get ShadersRepository(): string {\r\n return Effect.ShadersRepository;\r\n }\r\n public static set ShadersRepository(value: string) {\r\n Effect.ShadersRepository = value;\r\n }\r\n\r\n protected _shaderProcessor: Nullable;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getShaderProcessor(shaderLanguage: ShaderLanguage): Nullable {\r\n return this._shaderProcessor;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean that indicates if textures must be forced to power of 2 size even if not required\r\n */\r\n public forcePOTTextures = false;\r\n\r\n /**\r\n * Gets a boolean indicating if the engine is currently rendering in fullscreen mode\r\n */\r\n public isFullscreen = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if back faces must be culled. If false, front faces are culled instead (true by default)\r\n * If non null, this takes precedence over the value from the material\r\n */\r\n public cullBackFaces: Nullable = null;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the engine must keep rendering even if the window is not in foreground\r\n */\r\n public renderEvenInBackground = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that cache can be kept between frames\r\n */\r\n public preventCacheWipeBetweenFrames = false;\r\n\r\n /** Gets or sets a boolean indicating if the engine should validate programs after compilation */\r\n public validateShaderPrograms = false;\r\n\r\n private _useReverseDepthBuffer = false;\r\n /**\r\n * Gets or sets a boolean indicating if depth buffer should be reverse, going from far to near.\r\n * This can provide greater z depth for distant objects.\r\n */\r\n public get useReverseDepthBuffer(): boolean {\r\n return this._useReverseDepthBuffer;\r\n }\r\n\r\n public set useReverseDepthBuffer(useReverse) {\r\n if (useReverse === this._useReverseDepthBuffer) {\r\n return;\r\n }\r\n\r\n this._useReverseDepthBuffer = useReverse;\r\n\r\n if (useReverse) {\r\n this._depthCullingState.depthFunc = Constants.GEQUAL;\r\n } else {\r\n this._depthCullingState.depthFunc = Constants.LEQUAL;\r\n }\r\n }\r\n\r\n /**\r\n * Indicates if the z range in NDC space is 0..1 (value: true) or -1..1 (value: false)\r\n */\r\n public readonly isNDCHalfZRange: boolean = false;\r\n\r\n /**\r\n * Indicates that the origin of the texture/framebuffer space is the bottom left corner. If false, the origin is top left\r\n */\r\n public readonly hasOriginBottomLeft: boolean = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that uniform buffers must be disabled even if they are supported\r\n */\r\n public disableUniformBuffers = false;\r\n\r\n /**\r\n * An event triggered when the engine is disposed.\r\n */\r\n public readonly onDisposeObservable = new Observable();\r\n\r\n private _frameId = 0;\r\n /**\r\n * Gets the current frame id\r\n */\r\n public get frameId(): number {\r\n return this._frameId;\r\n }\r\n\r\n /**\r\n * The time (in milliseconds elapsed since the current page has been loaded) when the engine was initialized\r\n */\r\n public readonly startTime: number;\r\n\r\n /** @internal */\r\n public _uniformBuffers = new Array();\r\n /** @internal */\r\n public _storageBuffers = new Array();\r\n\r\n /**\r\n * Gets a boolean indicating that the engine supports uniform buffers\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n */\r\n public get supportsUniformBuffers(): boolean {\r\n return this.webGLVersion > 1 && !this.disableUniformBuffers;\r\n }\r\n\r\n // Private Members\r\n\r\n /** @internal */\r\n public _gl: WebGL2RenderingContext;\r\n /** @internal */\r\n public _webGLVersion = 1.0;\r\n protected _renderingCanvas: Nullable;\r\n protected _windowIsBackground = false;\r\n protected _creationOptions: EngineOptions;\r\n protected _audioContext: Nullable;\r\n protected _audioDestination: Nullable;\r\n /** @internal */\r\n public _glSRGBExtensionValues: {\r\n SRGB: typeof WebGL2RenderingContext.SRGB;\r\n SRGB8: typeof WebGL2RenderingContext.SRGB8 | EXT_sRGB[\"SRGB_ALPHA_EXT\"];\r\n SRGB8_ALPHA8: typeof WebGL2RenderingContext.SRGB8_ALPHA8 | EXT_sRGB[\"SRGB_ALPHA_EXT\"];\r\n };\r\n /**\r\n * Gets the options used for engine creation\r\n * @returns EngineOptions object\r\n */\r\n public getCreationOptions() {\r\n return this._creationOptions;\r\n }\r\n\r\n protected _highPrecisionShadersAllowed = true;\r\n /** @internal */\r\n public get _shouldUseHighPrecisionShader(): boolean {\r\n return !!(this._caps.highPrecisionShaderSupported && this._highPrecisionShadersAllowed);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that only power of 2 textures are supported\r\n * Please note that you can still use non power of 2 textures but in this case the engine will forcefully convert them\r\n */\r\n public get needPOTTextures(): boolean {\r\n return this._webGLVersion < 2 || this.forcePOTTextures;\r\n }\r\n\r\n /** @internal */\r\n public _badOS = false;\r\n\r\n /** @internal */\r\n public _badDesktopOS = false;\r\n\r\n /** @internal */\r\n public _hardwareScalingLevel: number;\r\n /** @internal */\r\n public _caps: EngineCapabilities;\r\n /** @internal */\r\n public _features: EngineFeatures;\r\n protected _isStencilEnable: boolean;\r\n\r\n private _glVersion: string;\r\n private _glRenderer: string;\r\n private _glVendor: string;\r\n\r\n /** @internal */\r\n public _videoTextureSupported: boolean;\r\n\r\n protected _activeRenderLoops = new Array<() => void>();\r\n\r\n /**\r\n * Gets the list of current active render loop functions\r\n * @returns a read only array with the current render loop functions\r\n */\r\n public get activeRenderLoops(): ReadonlyArray<() => void> {\r\n return this._activeRenderLoops;\r\n }\r\n\r\n // Lost context\r\n /**\r\n * Observable signaled when a context lost event is raised\r\n */\r\n public onContextLostObservable = new Observable();\r\n /**\r\n * Observable signaled when a context restored event is raised\r\n */\r\n public onContextRestoredObservable = new Observable();\r\n private _onContextLost: (evt: Event) => void;\r\n private _onContextRestored: (evt: Event) => void;\r\n protected _contextWasLost = false;\r\n\r\n /** @internal */\r\n public _doNotHandleContextLost = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if resources should be retained to be able to handle context lost events\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#handling-webgl-context-lost\r\n */\r\n public get doNotHandleContextLost(): boolean {\r\n return this._doNotHandleContextLost;\r\n }\r\n\r\n public set doNotHandleContextLost(value: boolean) {\r\n this._doNotHandleContextLost = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that vertex array object must be disabled even if they are supported\r\n */\r\n public disableVertexArrayObjects = false;\r\n\r\n // States\r\n /** @internal */\r\n protected _colorWrite = true;\r\n /** @internal */\r\n protected _colorWriteChanged = true;\r\n /** @internal */\r\n protected _depthCullingState = new DepthCullingState();\r\n /** @internal */\r\n protected _stencilStateComposer = new StencilStateComposer();\r\n /** @internal */\r\n protected _stencilState = new StencilState();\r\n /** @internal */\r\n public _alphaState = new AlphaState();\r\n /** @internal */\r\n public _alphaMode = Constants.ALPHA_ADD;\r\n /** @internal */\r\n public _alphaEquation = Constants.ALPHA_DISABLE;\r\n\r\n // Cache\r\n /** @internal */\r\n public _internalTexturesCache = new Array();\r\n /** @internal */\r\n public _renderTargetWrapperCache = new Array();\r\n /** @internal */\r\n protected _activeChannel = 0;\r\n private _currentTextureChannel = -1;\r\n /** @internal */\r\n protected _boundTexturesCache: { [key: string]: Nullable } = {};\r\n protected _currentEffect: Nullable;\r\n /** @internal */\r\n public _currentDrawContext: IDrawContext;\r\n /** @internal */\r\n public _currentMaterialContext: IMaterialContext;\r\n /** @internal */\r\n protected _currentProgram: Nullable;\r\n protected _compiledEffects: { [key: string]: Effect } = {};\r\n private _vertexAttribArraysEnabled: boolean[] = [];\r\n /** @internal */\r\n protected _cachedViewport: Nullable;\r\n private _cachedVertexArrayObject: Nullable;\r\n /** @internal */\r\n protected _cachedVertexBuffers: any;\r\n /** @internal */\r\n protected _cachedIndexBuffer: Nullable;\r\n /** @internal */\r\n protected _cachedEffectForVertexBuffers: Nullable;\r\n\r\n /** @internal */\r\n public _currentRenderTarget: Nullable = null;\r\n private _uintIndicesCurrentlySet = false;\r\n protected _currentBoundBuffer = new Array>();\r\n /** @internal */\r\n public _currentFramebuffer: Nullable = null;\r\n /** @internal */\r\n public _dummyFramebuffer: Nullable = null;\r\n private _currentBufferPointers = new Array();\r\n private _currentInstanceLocations = new Array();\r\n private _currentInstanceBuffers = new Array();\r\n private _textureUnits: Int32Array;\r\n\r\n /** @internal */\r\n public _workingCanvas: Nullable;\r\n /** @internal */\r\n public _workingContext: Nullable;\r\n\r\n /** @internal */\r\n public _boundRenderFunction: any = () => this._renderLoop();\r\n\r\n private _vaoRecordInProgress = false;\r\n private _mustWipeVertexAttributes = false;\r\n\r\n private _emptyTexture: Nullable;\r\n private _emptyCubeTexture: Nullable;\r\n private _emptyTexture3D: Nullable;\r\n private _emptyTexture2DArray: Nullable;\r\n\r\n /** @internal */\r\n public _frameHandler: number = 0;\r\n\r\n private _nextFreeTextureSlots = new Array();\r\n private _maxSimultaneousTextures = 0;\r\n private _maxMSAASamplesOverride: Nullable = null;\r\n\r\n private _activeRequests = new Array();\r\n\r\n /**\r\n * If set to true zooming in and out in the browser will rescale the hardware-scaling correctly.\r\n */\r\n public adaptToDeviceRatio: boolean = false;\r\n /** @internal */\r\n protected _lastDevicePixelRatio: number = 1.0;\r\n\r\n /** @internal */\r\n public _transformTextureUrl: Nullable<(url: string) => string> = null;\r\n\r\n /**\r\n * Gets information about the current host\r\n */\r\n public hostInformation: HostInformation = {\r\n isMobile: false,\r\n };\r\n\r\n protected get _supportsHardwareTextureRescaling() {\r\n return false;\r\n }\r\n\r\n protected _framebufferDimensionsObject: Nullable<{ framebufferWidth: number; framebufferHeight: number }>;\r\n\r\n /**\r\n * sets the object from which width and height will be taken from when getting render width and height\r\n * Will fallback to the gl object\r\n * @param dimensions the framebuffer width and height that will be used.\r\n */\r\n public set framebufferDimensionsObject(dimensions: Nullable<{ framebufferWidth: number; framebufferHeight: number }>) {\r\n this._framebufferDimensionsObject = dimensions;\r\n }\r\n\r\n /**\r\n * Gets the current viewport\r\n */\r\n public get currentViewport(): Nullable {\r\n return this._cachedViewport;\r\n }\r\n\r\n /**\r\n * Gets the default empty texture\r\n */\r\n public get emptyTexture(): InternalTexture {\r\n if (!this._emptyTexture) {\r\n this._emptyTexture = this.createRawTexture(new Uint8Array(4), 1, 1, Constants.TEXTUREFORMAT_RGBA, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n return this._emptyTexture;\r\n }\r\n\r\n /**\r\n * Gets the default empty 3D texture\r\n */\r\n public get emptyTexture3D(): InternalTexture {\r\n if (!this._emptyTexture3D) {\r\n this._emptyTexture3D = this.createRawTexture3D(new Uint8Array(4), 1, 1, 1, Constants.TEXTUREFORMAT_RGBA, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n return this._emptyTexture3D;\r\n }\r\n\r\n /**\r\n * Gets the default empty 2D array texture\r\n */\r\n public get emptyTexture2DArray(): InternalTexture {\r\n if (!this._emptyTexture2DArray) {\r\n this._emptyTexture2DArray = this.createRawTexture2DArray(\r\n new Uint8Array(4),\r\n 1,\r\n 1,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE\r\n );\r\n }\r\n\r\n return this._emptyTexture2DArray;\r\n }\r\n\r\n /**\r\n * Gets the default empty cube texture\r\n */\r\n public get emptyCubeTexture(): InternalTexture {\r\n if (!this._emptyCubeTexture) {\r\n const faceData = new Uint8Array(4);\r\n const cubeData = [faceData, faceData, faceData, faceData, faceData, faceData];\r\n this._emptyCubeTexture = this.createRawCubeTexture(\r\n cubeData,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n Constants.TEXTURETYPE_UNSIGNED_INT,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE\r\n );\r\n }\r\n\r\n return this._emptyCubeTexture;\r\n }\r\n\r\n /**\r\n * Defines whether the engine has been created with the premultipliedAlpha option on or not.\r\n */\r\n public premultipliedAlpha: boolean = true;\r\n\r\n /**\r\n * Observable event triggered before each texture is initialized\r\n */\r\n public onBeforeTextureInitObservable = new Observable();\r\n\r\n /** @internal */\r\n protected _isWebGPU: boolean = false;\r\n /**\r\n * Gets a boolean indicating if the engine runs in WebGPU or not.\r\n */\r\n public get isWebGPU(): boolean {\r\n return this._isWebGPU;\r\n }\r\n\r\n /** @internal */\r\n protected _shaderPlatformName: string;\r\n /**\r\n * Gets the shader platform name used by the effects.\r\n */\r\n public get shaderPlatformName(): string {\r\n return this._shaderPlatformName;\r\n }\r\n\r\n /**\r\n * Enables or disables the snapshot rendering mode\r\n * Note that the WebGL engine does not support snapshot rendering so setting the value won't have any effect for this engine\r\n */\r\n public get snapshotRendering(): boolean {\r\n return false;\r\n }\r\n\r\n public set snapshotRendering(activate) {\r\n // WebGL engine does not support snapshot rendering\r\n }\r\n\r\n protected _snapshotRenderingMode = Constants.SNAPSHOTRENDERING_STANDARD;\r\n /**\r\n * Gets or sets the snapshot rendering mode\r\n */\r\n public get snapshotRenderingMode(): number {\r\n return this._snapshotRenderingMode;\r\n }\r\n\r\n public set snapshotRenderingMode(mode: number) {\r\n this._snapshotRenderingMode = mode;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the exact sRGB conversions or faster approximations are used for converting to and from linear space.\r\n */\r\n public readonly useExactSrgbConversions: boolean;\r\n\r\n /**\r\n * Creates a new snapshot at the next frame using the current snapshotRenderingMode\r\n */\r\n public snapshotRenderingReset(): void {\r\n this.snapshotRendering = false;\r\n }\r\n\r\n private _checkForMobile: () => void;\r\n\r\n private static _CreateCanvas(width: number, height: number): ICanvas {\r\n if (typeof document === \"undefined\") {\r\n return (new OffscreenCanvas(width, height));\r\n }\r\n const canvas = (document.createElement(\"canvas\"));\r\n canvas.width = width;\r\n canvas.height = height;\r\n return canvas;\r\n }\r\n\r\n /**\r\n * Create a canvas. This method is overridden by other engines\r\n * @param width width\r\n * @param height height\r\n * @returns ICanvas interface\r\n */\r\n public createCanvas(width: number, height: number): ICanvas {\r\n return ThinEngine._CreateCanvas(width, height);\r\n }\r\n\r\n /**\r\n * Create an image to use with canvas\r\n * @returns IImage interface\r\n */\r\n public createCanvasImage(): IImage {\r\n return document.createElement(\"img\");\r\n }\r\n\r\n /**\r\n * Creates a new engine\r\n * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which already used the WebGL context\r\n * @param antialias defines enable antialiasing (default: false)\r\n * @param options defines further options to be sent to the getContext() function\r\n * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n constructor(\r\n canvasOrContext: Nullable,\r\n antialias?: boolean,\r\n options?: EngineOptions,\r\n adaptToDeviceRatio?: boolean\r\n ) {\r\n this.startTime = PrecisionDate.Now;\r\n\r\n let canvas: Nullable = null;\r\n\r\n options = options || {};\r\n\r\n this._creationOptions = options;\r\n\r\n // Save this off for use in resize().\r\n this.adaptToDeviceRatio = adaptToDeviceRatio ?? false;\r\n\r\n this._stencilStateComposer.stencilGlobal = this._stencilState;\r\n\r\n PerformanceConfigurator.SetMatrixPrecision(!!options.useHighPrecisionMatrix);\r\n\r\n options.antialias = antialias ?? options.antialias;\r\n options.deterministicLockstep = options.deterministicLockstep ?? false;\r\n options.lockstepMaxSteps = options.lockstepMaxSteps ?? 4;\r\n options.timeStep = options.timeStep ?? 1 / 60;\r\n options.audioEngine = options.audioEngine ?? true;\r\n options.stencil = options.stencil ?? true;\r\n\r\n this._audioContext = options.audioEngineOptions?.audioContext ?? null;\r\n this._audioDestination = options.audioEngineOptions?.audioDestination ?? null;\r\n this.premultipliedAlpha = options.premultipliedAlpha ?? true;\r\n this.useExactSrgbConversions = options.useExactSrgbConversions ?? false;\r\n this._doNotHandleContextLost = !!options.doNotHandleContextLost;\r\n this._isStencilEnable = options.stencil ? true : false;\r\n\r\n // Viewport\r\n adaptToDeviceRatio = adaptToDeviceRatio || options.adaptToDeviceRatio || false;\r\n\r\n const devicePixelRatio = IsWindowObjectExist() ? window.devicePixelRatio || 1.0 : 1.0;\r\n\r\n const limitDeviceRatio = options.limitDeviceRatio || devicePixelRatio;\r\n this._hardwareScalingLevel = adaptToDeviceRatio ? 1.0 / Math.min(limitDeviceRatio, devicePixelRatio) : 1.0;\r\n this._lastDevicePixelRatio = devicePixelRatio;\r\n\r\n if (!canvasOrContext) {\r\n return;\r\n }\r\n\r\n if ((canvasOrContext as any).getContext) {\r\n canvas = canvasOrContext;\r\n this._renderingCanvas = canvas;\r\n\r\n if (options.preserveDrawingBuffer === undefined) {\r\n options.preserveDrawingBuffer = false;\r\n }\r\n\r\n if (options.xrCompatible === undefined) {\r\n options.xrCompatible = true;\r\n }\r\n\r\n // Exceptions\r\n if (navigator && navigator.userAgent) {\r\n this._setupMobileChecks();\r\n\r\n const ua = navigator.userAgent;\r\n for (const exception of ThinEngine.ExceptionList) {\r\n const key = exception.key;\r\n const targets = exception.targets;\r\n const check = new RegExp(key);\r\n\r\n if (check.test(ua)) {\r\n if (exception.capture && exception.captureConstraint) {\r\n const capture = exception.capture;\r\n const constraint = exception.captureConstraint;\r\n\r\n const regex = new RegExp(capture);\r\n const matches = regex.exec(ua);\r\n\r\n if (matches && matches.length > 0) {\r\n const capturedValue = parseInt(matches[matches.length - 1]);\r\n if (capturedValue >= constraint) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n for (const target of targets) {\r\n switch (target) {\r\n case \"uniformBuffer\":\r\n this.disableUniformBuffers = true;\r\n break;\r\n case \"vao\":\r\n this.disableVertexArrayObjects = true;\r\n break;\r\n case \"antialias\":\r\n options.antialias = false;\r\n break;\r\n case \"maxMSAASamples\":\r\n this._maxMSAASamplesOverride = 1;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Context lost\r\n if (!this._doNotHandleContextLost) {\r\n this._onContextLost = (evt: Event) => {\r\n evt.preventDefault();\r\n this._contextWasLost = true;\r\n Logger.Warn(\"WebGL context lost.\");\r\n\r\n this.onContextLostObservable.notifyObservers(this);\r\n };\r\n\r\n this._onContextRestored = () => {\r\n this._restoreEngineAfterContextLost(() => this._initGLContext());\r\n };\r\n\r\n canvas.addEventListener(\"webglcontextlost\", this._onContextLost, false);\r\n canvas.addEventListener(\"webglcontextrestored\", this._onContextRestored, false);\r\n\r\n options.powerPreference = options.powerPreference || \"high-performance\";\r\n }\r\n\r\n // Detect if we are running on a faulty buggy desktop OS.\r\n this._badDesktopOS = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n if (this._badDesktopOS) {\r\n options.xrCompatible = false;\r\n }\r\n\r\n // GL\r\n if (!options.disableWebGL2Support) {\r\n try {\r\n this._gl = (canvas.getContext(\"webgl2\", options) || canvas.getContext(\"experimental-webgl2\", options));\r\n if (this._gl) {\r\n this._webGLVersion = 2.0;\r\n this._shaderPlatformName = \"WEBGL2\";\r\n\r\n // Prevent weird browsers to lie (yeah that happens!)\r\n if (!this._gl.deleteQuery) {\r\n this._webGLVersion = 1.0;\r\n this._shaderPlatformName = \"WEBGL1\";\r\n }\r\n }\r\n } catch (e) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n if (!this._gl) {\r\n if (!canvas) {\r\n throw new Error(\"The provided canvas is null or undefined.\");\r\n }\r\n try {\r\n this._gl = (canvas.getContext(\"webgl\", options) || canvas.getContext(\"experimental-webgl\", options));\r\n } catch (e) {\r\n throw new Error(\"WebGL not supported\");\r\n }\r\n }\r\n\r\n if (!this._gl) {\r\n throw new Error(\"WebGL not supported\");\r\n }\r\n } else {\r\n this._gl = canvasOrContext;\r\n this._renderingCanvas = this._gl.canvas as HTMLCanvasElement;\r\n\r\n if ((this._gl as any).renderbufferStorageMultisample) {\r\n this._webGLVersion = 2.0;\r\n this._shaderPlatformName = \"WEBGL2\";\r\n } else {\r\n this._shaderPlatformName = \"WEBGL1\";\r\n }\r\n\r\n const attributes = this._gl.getContextAttributes();\r\n if (attributes) {\r\n options.stencil = attributes.stencil;\r\n }\r\n }\r\n\r\n // Ensures a consistent color space unpacking of textures cross browser.\r\n this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE);\r\n\r\n if (options.useHighPrecisionFloats !== undefined) {\r\n this._highPrecisionShadersAllowed = options.useHighPrecisionFloats;\r\n }\r\n\r\n this.resize();\r\n\r\n this._initGLContext();\r\n this._initFeatures();\r\n\r\n // Prepare buffer pointers\r\n for (let i = 0; i < this._caps.maxVertexAttribs; i++) {\r\n this._currentBufferPointers[i] = new BufferPointer();\r\n }\r\n\r\n // Shader processor\r\n this._shaderProcessor = this.webGLVersion > 1 ? new WebGL2ShaderProcessor() : new WebGLShaderProcessor();\r\n\r\n // Detect if we are running on a faulty buggy OS.\r\n this._badOS = /iPad/i.test(navigator.userAgent) || /iPhone/i.test(navigator.userAgent);\r\n\r\n // Starting with iOS 14, we can trust the browser\r\n // let matches = navigator.userAgent.match(/Version\\/(\\d+)/);\r\n\r\n // if (matches && matches.length === 2) {\r\n // if (parseInt(matches[1]) >= 14) {\r\n // this._badOS = false;\r\n // }\r\n // }\r\n\r\n const versionToLog = `Babylon.js v${ThinEngine.Version}`;\r\n Logger.Log(versionToLog + ` - ${this.description}`);\r\n\r\n // Check setAttribute in case of workers\r\n if (this._renderingCanvas && this._renderingCanvas.setAttribute) {\r\n this._renderingCanvas.setAttribute(\"data-engine\", versionToLog);\r\n }\r\n }\r\n\r\n protected _setupMobileChecks(): void {\r\n if (!(navigator && navigator.userAgent)) {\r\n return;\r\n }\r\n\r\n // Function to check if running on mobile device\r\n this._checkForMobile = () => {\r\n const currentUA = navigator.userAgent;\r\n this.hostInformation.isMobile =\r\n currentUA.indexOf(\"Mobile\") !== -1 ||\r\n // Needed for iOS 13+ detection on iPad (inspired by solution from https://stackoverflow.com/questions/9038625/detect-if-device-is-ios)\r\n (currentUA.indexOf(\"Mac\") !== -1 && IsDocumentAvailable() && \"ontouchend\" in document);\r\n };\r\n\r\n // Set initial isMobile value\r\n this._checkForMobile();\r\n\r\n // Set up event listener to check when window is resized (used to get emulator activation to work properly)\r\n if (IsWindowObjectExist()) {\r\n window.addEventListener(\"resize\", this._checkForMobile);\r\n }\r\n }\r\n\r\n protected _clearEmptyResources(): void {\r\n this._dummyFramebuffer = null;\r\n this._emptyTexture = null;\r\n this._emptyCubeTexture = null;\r\n this._emptyTexture3D = null;\r\n this._emptyTexture2DArray = null;\r\n }\r\n\r\n protected _rebuildGraphicsResources(): void {\r\n // Ensure webgl and engine states are matching\r\n this.wipeCaches(true);\r\n\r\n // Rebuild effects\r\n this._rebuildEffects();\r\n this._rebuildComputeEffects?.();\r\n\r\n // Note:\r\n // The call to _rebuildBuffers must be made before the call to _rebuildInternalTextures because in the process of _rebuildBuffers the buffers used by the post process managers will be rebuilt\r\n // and we may need to use the post process manager of the scene during _rebuildInternalTextures (in WebGL1, non-POT textures are rescaled using a post process + post process manager of the scene)\r\n\r\n // Rebuild buffers\r\n this._rebuildBuffers();\r\n // Rebuild textures\r\n this._rebuildInternalTextures();\r\n // Rebuild textures\r\n this._rebuildTextures();\r\n // Rebuild textures\r\n this._rebuildRenderTargetWrappers();\r\n\r\n // Reset engine states after all the buffer/textures/... have been rebuilt\r\n this.wipeCaches(true);\r\n }\r\n\r\n protected _flagContextRestored(): void {\r\n Logger.Warn(this.name + \" context successfully restored.\");\r\n this.onContextRestoredObservable.notifyObservers(this);\r\n this._contextWasLost = false;\r\n }\r\n\r\n protected _restoreEngineAfterContextLost(initEngine: () => void): void {\r\n // Adding a timeout to avoid race condition at browser level\r\n setTimeout(async () => {\r\n this._clearEmptyResources();\r\n\r\n const depthTest = this._depthCullingState.depthTest; // backup those values because the call to initEngine / wipeCaches will reset them\r\n const depthFunc = this._depthCullingState.depthFunc;\r\n const depthMask = this._depthCullingState.depthMask;\r\n const stencilTest = this._stencilState.stencilTest;\r\n\r\n // Rebuild context\r\n await initEngine();\r\n this._rebuildGraphicsResources();\r\n\r\n this._depthCullingState.depthTest = depthTest;\r\n this._depthCullingState.depthFunc = depthFunc;\r\n this._depthCullingState.depthMask = depthMask;\r\n this._stencilState.stencilTest = stencilTest;\r\n\r\n this._flagContextRestored();\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Shared initialization across engines types.\r\n * @param canvas The canvas associated with this instance of the engine.\r\n */\r\n protected _sharedInit(canvas: HTMLCanvasElement) {\r\n this._renderingCanvas = canvas;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getShaderProcessingContext(shaderLanguage: ShaderLanguage): Nullable {\r\n return null;\r\n }\r\n\r\n private _rebuildInternalTextures(): void {\r\n const currentState = this._internalTexturesCache.slice(); // Do a copy because the rebuild will add proxies\r\n\r\n for (const internalTexture of currentState) {\r\n internalTexture._rebuild();\r\n }\r\n }\r\n\r\n private _rebuildRenderTargetWrappers(): void {\r\n const currentState = this._renderTargetWrapperCache.slice(); // Do a copy because the rebuild will add proxies\r\n\r\n for (const renderTargetWrapper of currentState) {\r\n renderTargetWrapper._rebuild();\r\n }\r\n }\r\n\r\n private _rebuildEffects(): void {\r\n for (const key in this._compiledEffects) {\r\n const effect = this._compiledEffects[key];\r\n\r\n effect._pipelineContext = null; // because _prepareEffect will try to dispose this pipeline before recreating it and that would lead to webgl errors\r\n effect._prepareEffect();\r\n }\r\n\r\n Effect.ResetCache();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if all created effects are ready\r\n * @returns true if all effects are ready\r\n */\r\n public areAllEffectsReady(): boolean {\r\n for (const key in this._compiledEffects) {\r\n const effect = this._compiledEffects[key];\r\n\r\n if (!effect.isReady()) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n protected _rebuildBuffers(): void {\r\n // Uniforms\r\n for (const uniformBuffer of this._uniformBuffers) {\r\n uniformBuffer._rebuildAfterContextLost();\r\n }\r\n }\r\n\r\n protected _rebuildTextures(): void {}\r\n\r\n protected _initGLContext(): void {\r\n // Caps\r\n this._caps = {\r\n maxTexturesImageUnits: this._gl.getParameter(this._gl.MAX_TEXTURE_IMAGE_UNITS),\r\n maxCombinedTexturesImageUnits: this._gl.getParameter(this._gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\r\n maxVertexTextureImageUnits: this._gl.getParameter(this._gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS),\r\n maxTextureSize: this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),\r\n maxSamples: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_SAMPLES) : 1,\r\n maxCubemapTextureSize: this._gl.getParameter(this._gl.MAX_CUBE_MAP_TEXTURE_SIZE),\r\n maxRenderTextureSize: this._gl.getParameter(this._gl.MAX_RENDERBUFFER_SIZE),\r\n maxVertexAttribs: this._gl.getParameter(this._gl.MAX_VERTEX_ATTRIBS),\r\n maxVaryingVectors: this._gl.getParameter(this._gl.MAX_VARYING_VECTORS),\r\n maxFragmentUniformVectors: this._gl.getParameter(this._gl.MAX_FRAGMENT_UNIFORM_VECTORS),\r\n maxVertexUniformVectors: this._gl.getParameter(this._gl.MAX_VERTEX_UNIFORM_VECTORS),\r\n parallelShaderCompile: this._gl.getExtension(\"KHR_parallel_shader_compile\") || undefined,\r\n standardDerivatives: this._webGLVersion > 1 || this._gl.getExtension(\"OES_standard_derivatives\") !== null,\r\n maxAnisotropy: 1,\r\n astc: this._gl.getExtension(\"WEBGL_compressed_texture_astc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_astc\"),\r\n bptc: this._gl.getExtension(\"EXT_texture_compression_bptc\") || this._gl.getExtension(\"WEBKIT_EXT_texture_compression_bptc\"),\r\n s3tc: this._gl.getExtension(\"WEBGL_compressed_texture_s3tc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc\"),\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n s3tc_srgb: this._gl.getExtension(\"WEBGL_compressed_texture_s3tc_srgb\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc_srgb\"),\r\n pvrtc: this._gl.getExtension(\"WEBGL_compressed_texture_pvrtc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_pvrtc\"),\r\n etc1: this._gl.getExtension(\"WEBGL_compressed_texture_etc1\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_etc1\"),\r\n etc2:\r\n this._gl.getExtension(\"WEBGL_compressed_texture_etc\") ||\r\n this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_etc\") ||\r\n this._gl.getExtension(\"WEBGL_compressed_texture_es3_0\"), // also a requirement of OpenGL ES 3\r\n textureAnisotropicFilterExtension:\r\n this._gl.getExtension(\"EXT_texture_filter_anisotropic\") ||\r\n this._gl.getExtension(\"WEBKIT_EXT_texture_filter_anisotropic\") ||\r\n this._gl.getExtension(\"MOZ_EXT_texture_filter_anisotropic\"),\r\n uintIndices: this._webGLVersion > 1 || this._gl.getExtension(\"OES_element_index_uint\") !== null,\r\n fragmentDepthSupported: this._webGLVersion > 1 || this._gl.getExtension(\"EXT_frag_depth\") !== null,\r\n highPrecisionShaderSupported: false,\r\n timerQuery: this._gl.getExtension(\"EXT_disjoint_timer_query_webgl2\") || this._gl.getExtension(\"EXT_disjoint_timer_query\"),\r\n supportOcclusionQuery: this._webGLVersion > 1,\r\n canUseTimestampForTimerQuery: false,\r\n drawBuffersExtension: false,\r\n maxMSAASamples: 1,\r\n colorBufferFloat: !!(this._webGLVersion > 1 && this._gl.getExtension(\"EXT_color_buffer_float\")),\r\n supportFloatTexturesResolve: false,\r\n rg11b10ufColorRenderable: false,\r\n colorBufferHalfFloat: !!(this._webGLVersion > 1 && this._gl.getExtension(\"EXT_color_buffer_half_float\")),\r\n textureFloat: this._webGLVersion > 1 || this._gl.getExtension(\"OES_texture_float\") ? true : false,\r\n textureHalfFloat: this._webGLVersion > 1 || this._gl.getExtension(\"OES_texture_half_float\") ? true : false,\r\n textureHalfFloatRender: false,\r\n textureFloatLinearFiltering: false,\r\n textureFloatRender: false,\r\n textureHalfFloatLinearFiltering: false,\r\n vertexArrayObject: false,\r\n instancedArrays: false,\r\n textureLOD: this._webGLVersion > 1 || this._gl.getExtension(\"EXT_shader_texture_lod\") ? true : false,\r\n texelFetch: this._webGLVersion !== 1,\r\n blendMinMax: false,\r\n multiview: this._gl.getExtension(\"OVR_multiview2\"),\r\n oculusMultiview: this._gl.getExtension(\"OCULUS_multiview\"),\r\n depthTextureExtension: false,\r\n canUseGLInstanceID: this._webGLVersion > 1,\r\n canUseGLVertexID: this._webGLVersion > 1,\r\n supportComputeShaders: false,\r\n supportSRGBBuffers: false,\r\n supportTransformFeedbacks: this._webGLVersion > 1,\r\n textureMaxLevel: this._webGLVersion > 1,\r\n texture2DArrayMaxLayerCount: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_ARRAY_TEXTURE_LAYERS) : 128,\r\n disableMorphTargetTexture: false,\r\n };\r\n\r\n this._caps.supportFloatTexturesResolve = this._caps.colorBufferFloat;\r\n this._caps.rg11b10ufColorRenderable = this._caps.colorBufferFloat;\r\n\r\n // Infos\r\n this._glVersion = this._gl.getParameter(this._gl.VERSION);\r\n\r\n const rendererInfo: any = this._gl.getExtension(\"WEBGL_debug_renderer_info\");\r\n if (rendererInfo != null) {\r\n this._glRenderer = this._gl.getParameter(rendererInfo.UNMASKED_RENDERER_WEBGL);\r\n this._glVendor = this._gl.getParameter(rendererInfo.UNMASKED_VENDOR_WEBGL);\r\n }\r\n\r\n if (!this._glVendor) {\r\n this._glVendor = this._gl.getParameter(this._gl.VENDOR) || \"Unknown vendor\";\r\n }\r\n\r\n if (!this._glRenderer) {\r\n this._glRenderer = this._gl.getParameter(this._gl.RENDERER) || \"Unknown renderer\";\r\n }\r\n\r\n // Constants\r\n if (this._gl.HALF_FLOAT_OES !== 0x8d61) {\r\n this._gl.HALF_FLOAT_OES = 0x8d61; // Half floating-point type (16-bit).\r\n }\r\n if (this._gl.RGBA16F !== 0x881a) {\r\n this._gl.RGBA16F = 0x881a; // RGBA 16-bit floating-point color-renderable internal sized format.\r\n }\r\n if (this._gl.RGBA32F !== 0x8814) {\r\n this._gl.RGBA32F = 0x8814; // RGBA 32-bit floating-point color-renderable internal sized format.\r\n }\r\n if (this._gl.DEPTH24_STENCIL8 !== 35056) {\r\n this._gl.DEPTH24_STENCIL8 = 35056;\r\n }\r\n\r\n // Extensions\r\n if (this._caps.timerQuery) {\r\n if (this._webGLVersion === 1) {\r\n this._gl.getQuery = (this._caps.timerQuery).getQueryEXT.bind(this._caps.timerQuery);\r\n }\r\n // WebGLQuery casted to number to avoid TS error\r\n this._caps.canUseTimestampForTimerQuery = ((this._gl.getQuery(this._caps.timerQuery.TIMESTAMP_EXT, this._caps.timerQuery.QUERY_COUNTER_BITS_EXT) as number) ?? 0) > 0;\r\n }\r\n\r\n this._caps.maxAnisotropy = this._caps.textureAnisotropicFilterExtension\r\n ? this._gl.getParameter(this._caps.textureAnisotropicFilterExtension.MAX_TEXTURE_MAX_ANISOTROPY_EXT)\r\n : 0;\r\n this._caps.textureFloatLinearFiltering = this._caps.textureFloat && this._gl.getExtension(\"OES_texture_float_linear\") ? true : false;\r\n this._caps.textureFloatRender = this._caps.textureFloat && this._canRenderToFloatFramebuffer() ? true : false;\r\n this._caps.textureHalfFloatLinearFiltering =\r\n this._webGLVersion > 1 || (this._caps.textureHalfFloat && this._gl.getExtension(\"OES_texture_half_float_linear\")) ? true : false;\r\n\r\n // Compressed formats\r\n if (this._caps.astc) {\r\n this._gl.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = this._caps.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;\r\n }\r\n if (this._caps.bptc) {\r\n this._gl.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT = this._caps.bptc.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT;\r\n }\r\n if (this._caps.s3tc_srgb) {\r\n this._gl.COMPRESSED_SRGB_S3TC_DXT1_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_S3TC_DXT1_EXT;\r\n this._gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\r\n this._gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\r\n }\r\n if (this._caps.etc2) {\r\n this._gl.COMPRESSED_SRGB8_ETC2 = this._caps.etc2.COMPRESSED_SRGB8_ETC2;\r\n this._gl.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = this._caps.etc2.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;\r\n }\r\n\r\n // Checks if some of the format renders first to allow the use of webgl inspector.\r\n if (this._webGLVersion > 1) {\r\n if (this._gl.HALF_FLOAT_OES !== 0x140b) {\r\n this._gl.HALF_FLOAT_OES = 0x140b;\r\n }\r\n }\r\n this._caps.textureHalfFloatRender = this._caps.textureHalfFloat && this._canRenderToHalfFloatFramebuffer();\r\n // Draw buffers\r\n if (this._webGLVersion > 1) {\r\n this._caps.drawBuffersExtension = true;\r\n this._caps.maxMSAASamples = this._maxMSAASamplesOverride !== null ? this._maxMSAASamplesOverride : this._gl.getParameter(this._gl.MAX_SAMPLES);\r\n } else {\r\n const drawBuffersExtension = this._gl.getExtension(\"WEBGL_draw_buffers\");\r\n\r\n if (drawBuffersExtension !== null) {\r\n this._caps.drawBuffersExtension = true;\r\n this._gl.drawBuffers = drawBuffersExtension.drawBuffersWEBGL.bind(drawBuffersExtension);\r\n (this._gl.DRAW_FRAMEBUFFER as any) = this._gl.FRAMEBUFFER;\r\n\r\n for (let i = 0; i < 16; i++) {\r\n (this._gl)[\"COLOR_ATTACHMENT\" + i + \"_WEBGL\"] = (drawBuffersExtension)[\"COLOR_ATTACHMENT\" + i + \"_WEBGL\"];\r\n }\r\n }\r\n }\r\n\r\n // Depth Texture\r\n if (this._webGLVersion > 1) {\r\n this._caps.depthTextureExtension = true;\r\n } else {\r\n const depthTextureExtension = this._gl.getExtension(\"WEBGL_depth_texture\");\r\n\r\n if (depthTextureExtension != null) {\r\n this._caps.depthTextureExtension = true;\r\n this._gl.UNSIGNED_INT_24_8 = depthTextureExtension.UNSIGNED_INT_24_8_WEBGL;\r\n }\r\n }\r\n\r\n // Vertex array object\r\n if (this.disableVertexArrayObjects) {\r\n this._caps.vertexArrayObject = false;\r\n } else if (this._webGLVersion > 1) {\r\n this._caps.vertexArrayObject = true;\r\n } else {\r\n const vertexArrayObjectExtension = this._gl.getExtension(\"OES_vertex_array_object\");\r\n\r\n if (vertexArrayObjectExtension != null) {\r\n this._caps.vertexArrayObject = true;\r\n this._gl.createVertexArray = vertexArrayObjectExtension.createVertexArrayOES.bind(vertexArrayObjectExtension);\r\n this._gl.bindVertexArray = vertexArrayObjectExtension.bindVertexArrayOES.bind(vertexArrayObjectExtension);\r\n this._gl.deleteVertexArray = vertexArrayObjectExtension.deleteVertexArrayOES.bind(vertexArrayObjectExtension);\r\n }\r\n }\r\n\r\n // Instances count\r\n if (this._webGLVersion > 1) {\r\n this._caps.instancedArrays = true;\r\n } else {\r\n const instanceExtension = this._gl.getExtension(\"ANGLE_instanced_arrays\");\r\n\r\n if (instanceExtension != null) {\r\n this._caps.instancedArrays = true;\r\n this._gl.drawArraysInstanced = instanceExtension.drawArraysInstancedANGLE.bind(instanceExtension);\r\n this._gl.drawElementsInstanced = instanceExtension.drawElementsInstancedANGLE.bind(instanceExtension);\r\n this._gl.vertexAttribDivisor = instanceExtension.vertexAttribDivisorANGLE.bind(instanceExtension);\r\n } else {\r\n this._caps.instancedArrays = false;\r\n }\r\n }\r\n\r\n if (this._gl.getShaderPrecisionFormat) {\r\n const vertexhighp = this._gl.getShaderPrecisionFormat(this._gl.VERTEX_SHADER, this._gl.HIGH_FLOAT);\r\n const fragmenthighp = this._gl.getShaderPrecisionFormat(this._gl.FRAGMENT_SHADER, this._gl.HIGH_FLOAT);\r\n\r\n if (vertexhighp && fragmenthighp) {\r\n this._caps.highPrecisionShaderSupported = vertexhighp.precision !== 0 && fragmenthighp.precision !== 0;\r\n }\r\n }\r\n\r\n if (this._webGLVersion > 1) {\r\n this._caps.blendMinMax = true;\r\n } else {\r\n const blendMinMaxExtension = this._gl.getExtension(\"EXT_blend_minmax\");\r\n if (blendMinMaxExtension != null) {\r\n this._caps.blendMinMax = true;\r\n this._gl.MAX = blendMinMaxExtension.MAX_EXT as typeof WebGL2RenderingContext.MAX;\r\n this._gl.MIN = blendMinMaxExtension.MIN_EXT as typeof WebGL2RenderingContext.MIN;\r\n }\r\n }\r\n\r\n // sRGB buffers\r\n // only run this if not already set to true (in the constructor, for example)\r\n if (!this._caps.supportSRGBBuffers) {\r\n if (this._webGLVersion > 1) {\r\n this._caps.supportSRGBBuffers = true;\r\n this._glSRGBExtensionValues = {\r\n SRGB: WebGL2RenderingContext.SRGB,\r\n SRGB8: WebGL2RenderingContext.SRGB8,\r\n SRGB8_ALPHA8: WebGL2RenderingContext.SRGB8_ALPHA8,\r\n };\r\n } else {\r\n const sRGBExtension = this._gl.getExtension(\"EXT_sRGB\");\r\n\r\n if (sRGBExtension != null) {\r\n this._caps.supportSRGBBuffers = true;\r\n this._glSRGBExtensionValues = {\r\n SRGB: sRGBExtension.SRGB_EXT as typeof WebGL2RenderingContext.SRGB | EXT_sRGB[\"SRGB_EXT\"],\r\n SRGB8: sRGBExtension.SRGB_ALPHA_EXT as typeof WebGL2RenderingContext.SRGB8 | EXT_sRGB[\"SRGB_ALPHA_EXT\"],\r\n SRGB8_ALPHA8: sRGBExtension.SRGB_ALPHA_EXT as typeof WebGL2RenderingContext.SRGB8_ALPHA8 | EXT_sRGB[\"SRGB8_ALPHA8_EXT\"],\r\n };\r\n }\r\n }\r\n // take into account the forced state that was provided in options\r\n // When the issue in angle/chrome is fixed the flag should be taken into account only when it is explicitly defined\r\n this._caps.supportSRGBBuffers = this._caps.supportSRGBBuffers && !!(this._creationOptions && this._creationOptions.forceSRGBBufferSupportState);\r\n }\r\n\r\n // Depth buffer\r\n this._depthCullingState.depthTest = true;\r\n this._depthCullingState.depthFunc = this._gl.LEQUAL;\r\n this._depthCullingState.depthMask = true;\r\n\r\n // Texture maps\r\n this._maxSimultaneousTextures = this._caps.maxCombinedTexturesImageUnits;\r\n for (let slot = 0; slot < this._maxSimultaneousTextures; slot++) {\r\n this._nextFreeTextureSlots.push(slot);\r\n }\r\n\r\n if (this._glRenderer === \"Mali-G72\") {\r\n // Overcome a bug when using a texture to store morph targets on Mali-G72\r\n this._caps.disableMorphTargetTexture = true;\r\n }\r\n }\r\n\r\n protected _initFeatures(): void {\r\n this._features = {\r\n forceBitmapOverHTMLImageElement: typeof HTMLImageElement === \"undefined\",\r\n supportRenderAndCopyToLodForFloatTextures: this._webGLVersion !== 1,\r\n supportDepthStencilTexture: this._webGLVersion !== 1,\r\n supportShadowSamplers: this._webGLVersion !== 1,\r\n uniformBufferHardCheckMatrix: false,\r\n allowTexturePrefiltering: this._webGLVersion !== 1,\r\n trackUbosInFrame: false,\r\n checkUbosContentBeforeUpload: false,\r\n supportCSM: this._webGLVersion !== 1,\r\n basisNeedsPOT: this._webGLVersion === 1,\r\n support3DTextures: this._webGLVersion !== 1,\r\n needTypeSuffixInShaderConstants: this._webGLVersion !== 1,\r\n supportMSAA: this._webGLVersion !== 1,\r\n supportSSAO2: this._webGLVersion !== 1,\r\n supportExtendedTextureFormats: this._webGLVersion !== 1,\r\n supportSwitchCaseInShader: this._webGLVersion !== 1,\r\n supportSyncTextureRead: true,\r\n needsInvertingBitmap: true,\r\n useUBOBindingCache: true,\r\n needShaderCodeInlining: false,\r\n needToAlwaysBindUniformBuffers: false,\r\n supportRenderPasses: false,\r\n supportSpriteInstancing: true,\r\n forceVertexBufferStrideAndOffsetMultiple4Bytes: false,\r\n _collectUbosUpdatedInFrame: false,\r\n };\r\n }\r\n\r\n /**\r\n * Gets version of the current webGL context\r\n * Keep it for back compat - use version instead\r\n */\r\n public get webGLVersion(): number {\r\n return this._webGLVersion;\r\n }\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"Engine\" string\r\n */\r\n public getClassName(): string {\r\n return \"ThinEngine\";\r\n }\r\n\r\n /**\r\n * Returns true if the stencil buffer has been enabled through the creation option of the context.\r\n */\r\n public get isStencilEnable(): boolean {\r\n return this._isStencilEnable;\r\n }\r\n\r\n /** @internal */\r\n public _prepareWorkingCanvas(): void {\r\n if (this._workingCanvas) {\r\n return;\r\n }\r\n\r\n this._workingCanvas = this.createCanvas(1, 1);\r\n const context = this._workingCanvas.getContext(\"2d\");\r\n\r\n if (context) {\r\n this._workingContext = context;\r\n }\r\n }\r\n\r\n /**\r\n * Reset the texture cache to empty state\r\n */\r\n public resetTextureCache() {\r\n for (const key in this._boundTexturesCache) {\r\n if (!Object.prototype.hasOwnProperty.call(this._boundTexturesCache, key)) {\r\n continue;\r\n }\r\n this._boundTexturesCache[key] = null;\r\n }\r\n\r\n this._currentTextureChannel = -1;\r\n }\r\n\r\n /**\r\n * Gets an object containing information about the current engine context\r\n * @returns an object containing the vendor, the renderer and the version of the current engine context\r\n */\r\n public getInfo() {\r\n return this.getGlInfo();\r\n }\r\n\r\n /**\r\n * Gets an object containing information about the current webGL context\r\n * @returns an object containing the vendor, the renderer and the version of the current webGL context\r\n */\r\n public getGlInfo() {\r\n return {\r\n vendor: this._glVendor,\r\n renderer: this._glRenderer,\r\n version: this._glVersion,\r\n };\r\n }\r\n\r\n /**\r\n * Defines the hardware scaling level.\r\n * By default the hardware scaling level is computed from the window device ratio.\r\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\r\n * @param level defines the level to use\r\n */\r\n public setHardwareScalingLevel(level: number): void {\r\n this._hardwareScalingLevel = level;\r\n this.resize();\r\n }\r\n\r\n /**\r\n * Gets the current hardware scaling level.\r\n * By default the hardware scaling level is computed from the window device ratio.\r\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\r\n * @returns a number indicating the current hardware scaling level\r\n */\r\n public getHardwareScalingLevel(): number {\r\n return this._hardwareScalingLevel;\r\n }\r\n\r\n /**\r\n * Gets the list of loaded textures\r\n * @returns an array containing all loaded textures\r\n */\r\n public getLoadedTexturesCache(): InternalTexture[] {\r\n return this._internalTexturesCache;\r\n }\r\n\r\n /**\r\n * Gets the object containing all engine capabilities\r\n * @returns the EngineCapabilities object\r\n */\r\n public getCaps(): EngineCapabilities {\r\n return this._caps;\r\n }\r\n\r\n /**\r\n * stop executing a render loop function and remove it from the execution array\r\n * @param renderFunction defines the function to be removed. If not provided all functions will be removed.\r\n */\r\n public stopRenderLoop(renderFunction?: () => void): void {\r\n if (!renderFunction) {\r\n this._activeRenderLoops.length = 0;\r\n this._cancelFrame();\r\n return;\r\n }\r\n\r\n const index = this._activeRenderLoops.indexOf(renderFunction);\r\n\r\n if (index >= 0) {\r\n this._activeRenderLoops.splice(index, 1);\r\n if (this._activeRenderLoops.length == 0) {\r\n this._cancelFrame();\r\n }\r\n }\r\n }\r\n\r\n protected _cancelFrame() {\r\n if (this._frameHandler !== 0) {\r\n const handlerToCancel = this._frameHandler;\r\n this._frameHandler = 0;\r\n\r\n if (!IsWindowObjectExist()) {\r\n if (typeof cancelAnimationFrame === \"function\") {\r\n return cancelAnimationFrame(handlerToCancel);\r\n }\r\n } else {\r\n const { cancelAnimationFrame } = this.getHostWindow() || window;\r\n if (typeof cancelAnimationFrame === \"function\") {\r\n return cancelAnimationFrame(handlerToCancel);\r\n }\r\n }\r\n return clearTimeout(handlerToCancel);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _renderLoop(): void {\r\n this._frameHandler = 0;\r\n\r\n if (!this._contextWasLost) {\r\n let shouldRender = true;\r\n if (this._isDisposed || (!this.renderEvenInBackground && this._windowIsBackground)) {\r\n shouldRender = false;\r\n }\r\n\r\n if (shouldRender) {\r\n // Start new frame\r\n this.beginFrame();\r\n\r\n for (let index = 0; index < this._activeRenderLoops.length; index++) {\r\n const renderFunction = this._activeRenderLoops[index];\r\n\r\n renderFunction();\r\n }\r\n\r\n // Present\r\n this.endFrame();\r\n }\r\n }\r\n\r\n if (this._frameHandler === 0) {\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n }\r\n }\r\n\r\n /**\r\n * Gets the HTML canvas attached with the current webGL context\r\n * @returns a HTML canvas\r\n */\r\n public getRenderingCanvas(): Nullable {\r\n return this._renderingCanvas;\r\n }\r\n\r\n /**\r\n * Gets the audio context specified in engine initialization options\r\n * @returns an Audio Context\r\n */\r\n public getAudioContext(): Nullable {\r\n return this._audioContext;\r\n }\r\n\r\n /**\r\n * Gets the audio destination specified in engine initialization options\r\n * @returns an audio destination node\r\n */\r\n public getAudioDestination(): Nullable {\r\n return this._audioDestination;\r\n }\r\n\r\n /**\r\n * Gets host window\r\n * @returns the host window object\r\n */\r\n public getHostWindow(): Nullable {\r\n if (!IsWindowObjectExist()) {\r\n return null;\r\n }\r\n\r\n if (this._renderingCanvas && this._renderingCanvas.ownerDocument && this._renderingCanvas.ownerDocument.defaultView) {\r\n return this._renderingCanvas.ownerDocument.defaultView;\r\n }\r\n\r\n return window;\r\n }\r\n\r\n /**\r\n * Gets the current render width\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the current render width\r\n */\r\n public getRenderWidth(useScreen = false): number {\r\n if (!useScreen && this._currentRenderTarget) {\r\n return this._currentRenderTarget.width;\r\n }\r\n\r\n return this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferWidth : this._gl.drawingBufferWidth;\r\n }\r\n\r\n /**\r\n * Gets the current render height\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the current render height\r\n */\r\n public getRenderHeight(useScreen = false): number {\r\n if (!useScreen && this._currentRenderTarget) {\r\n return this._currentRenderTarget.height;\r\n }\r\n\r\n return this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferHeight : this._gl.drawingBufferHeight;\r\n }\r\n\r\n /**\r\n * Can be used to override the current requestAnimationFrame requester.\r\n * @internal\r\n */\r\n protected _queueNewFrame(bindedRenderFunction: any, requester?: any): number {\r\n return ThinEngine.QueueNewFrame(bindedRenderFunction, requester);\r\n }\r\n\r\n /**\r\n * Register and execute a render loop. The engine can have more than one render function\r\n * @param renderFunction defines the function to continuously execute\r\n */\r\n public runRenderLoop(renderFunction: () => void): void {\r\n if (this._activeRenderLoops.indexOf(renderFunction) !== -1) {\r\n return;\r\n }\r\n\r\n this._activeRenderLoops.push(renderFunction);\r\n\r\n // On the first added function, start the render loop.\r\n if (this._activeRenderLoops.length === 1 && this._frameHandler === 0) {\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current render buffer or the current render target (if any is set up)\r\n * @param color defines the color to use\r\n * @param backBuffer defines if the back buffer must be cleared\r\n * @param depth defines if the depth buffer must be cleared\r\n * @param stencil defines if the stencil buffer must be cleared\r\n */\r\n public clear(color: Nullable, backBuffer: boolean, depth: boolean, stencil: boolean = false): void {\r\n const useStencilGlobalOnly = this.stencilStateComposer.useStencilGlobalOnly;\r\n this.stencilStateComposer.useStencilGlobalOnly = true; // make sure the stencil mask is coming from the global stencil and not from a material (effect) which would currently be in effect\r\n\r\n this.applyStates();\r\n\r\n this.stencilStateComposer.useStencilGlobalOnly = useStencilGlobalOnly;\r\n\r\n let mode = 0;\r\n if (backBuffer && color) {\r\n let setBackBufferColor = true;\r\n if (this._currentRenderTarget) {\r\n const textureFormat = this._currentRenderTarget.texture?.format;\r\n if (\r\n textureFormat === Constants.TEXTUREFORMAT_RED_INTEGER ||\r\n textureFormat === Constants.TEXTUREFORMAT_RG_INTEGER ||\r\n textureFormat === Constants.TEXTUREFORMAT_RGB_INTEGER ||\r\n textureFormat === Constants.TEXTUREFORMAT_RGBA_INTEGER\r\n ) {\r\n const textureType = this._currentRenderTarget.texture?.type;\r\n if (textureType === Constants.TEXTURETYPE_UNSIGNED_INTEGER || textureType === Constants.TEXTURETYPE_UNSIGNED_SHORT) {\r\n ThinEngine._TempClearColorUint32[0] = color.r * 255;\r\n ThinEngine._TempClearColorUint32[1] = color.g * 255;\r\n ThinEngine._TempClearColorUint32[2] = color.b * 255;\r\n ThinEngine._TempClearColorUint32[3] = color.a * 255;\r\n this._gl.clearBufferuiv(this._gl.COLOR, 0, ThinEngine._TempClearColorUint32);\r\n setBackBufferColor = false;\r\n } else {\r\n ThinEngine._TempClearColorInt32[0] = color.r * 255;\r\n ThinEngine._TempClearColorInt32[1] = color.g * 255;\r\n ThinEngine._TempClearColorInt32[2] = color.b * 255;\r\n ThinEngine._TempClearColorInt32[3] = color.a * 255;\r\n this._gl.clearBufferiv(this._gl.COLOR, 0, ThinEngine._TempClearColorInt32);\r\n setBackBufferColor = false;\r\n }\r\n }\r\n }\r\n\r\n if (setBackBufferColor) {\r\n this._gl.clearColor(color.r, color.g, color.b, color.a !== undefined ? color.a : 1.0);\r\n mode |= this._gl.COLOR_BUFFER_BIT;\r\n }\r\n }\r\n\r\n if (depth) {\r\n if (this.useReverseDepthBuffer) {\r\n this._depthCullingState.depthFunc = this._gl.GEQUAL;\r\n this._gl.clearDepth(0.0);\r\n } else {\r\n this._gl.clearDepth(1.0);\r\n }\r\n mode |= this._gl.DEPTH_BUFFER_BIT;\r\n }\r\n if (stencil) {\r\n this._gl.clearStencil(0);\r\n mode |= this._gl.STENCIL_BUFFER_BIT;\r\n }\r\n this._gl.clear(mode);\r\n }\r\n\r\n protected _viewportCached = { x: 0, y: 0, z: 0, w: 0 };\r\n\r\n /**\r\n * @internal\r\n */\r\n public _viewport(x: number, y: number, width: number, height: number): void {\r\n if (x !== this._viewportCached.x || y !== this._viewportCached.y || width !== this._viewportCached.z || height !== this._viewportCached.w) {\r\n this._viewportCached.x = x;\r\n this._viewportCached.y = y;\r\n this._viewportCached.z = width;\r\n this._viewportCached.w = height;\r\n\r\n this._gl.viewport(x, y, width, height);\r\n }\r\n }\r\n\r\n /**\r\n * Set the WebGL's viewport\r\n * @param viewport defines the viewport element to be used\r\n * @param requiredWidth defines the width required for rendering. If not provided the rendering canvas' width is used\r\n * @param requiredHeight defines the height required for rendering. If not provided the rendering canvas' height is used\r\n */\r\n public setViewport(viewport: IViewportLike, requiredWidth?: number, requiredHeight?: number): void {\r\n const width = requiredWidth || this.getRenderWidth();\r\n const height = requiredHeight || this.getRenderHeight();\r\n const x = viewport.x || 0;\r\n const y = viewport.y || 0;\r\n\r\n this._cachedViewport = viewport;\r\n\r\n this._viewport(x * width, y * height, width * viewport.width, height * viewport.height);\r\n }\r\n\r\n /**\r\n * Begin a new frame\r\n */\r\n public beginFrame(): void {}\r\n\r\n /**\r\n * Enf the current frame\r\n */\r\n public endFrame(): void {\r\n // Force a flush in case we are using a bad OS.\r\n if (this._badOS) {\r\n this.flushFramebuffer();\r\n }\r\n this._frameId++;\r\n }\r\n\r\n /**\r\n * Resize the view according to the canvas' size\r\n * @param forceSetSize true to force setting the sizes of the underlying canvas\r\n */\r\n public resize(forceSetSize = false): void {\r\n let width: number;\r\n let height: number;\r\n\r\n // Re-query hardware scaling level to handle zoomed-in resizing.\r\n if (this.adaptToDeviceRatio) {\r\n const devicePixelRatio = IsWindowObjectExist() ? window.devicePixelRatio || 1.0 : 1.0;\r\n const changeRatio = this._lastDevicePixelRatio / devicePixelRatio;\r\n this._lastDevicePixelRatio = devicePixelRatio;\r\n this._hardwareScalingLevel *= changeRatio;\r\n }\r\n\r\n if (IsWindowObjectExist() && IsDocumentAvailable()) {\r\n // make sure it is a Node object, and is a part of the document.\r\n if (this._renderingCanvas) {\r\n const boundingRect = this._renderingCanvas.getBoundingClientRect\r\n ? this._renderingCanvas.getBoundingClientRect()\r\n : {\r\n // fallback to last solution in case the function doesn't exist\r\n width: this._renderingCanvas.width * this._hardwareScalingLevel,\r\n height: this._renderingCanvas.height * this._hardwareScalingLevel,\r\n };\r\n width = this._renderingCanvas.clientWidth || boundingRect.width || this._renderingCanvas.width || 100;\r\n height = this._renderingCanvas.clientHeight || boundingRect.height || this._renderingCanvas.height || 100;\r\n } else {\r\n width = window.innerWidth;\r\n height = window.innerHeight;\r\n }\r\n } else {\r\n width = this._renderingCanvas ? this._renderingCanvas.width : 100;\r\n height = this._renderingCanvas ? this._renderingCanvas.height : 100;\r\n }\r\n\r\n this.setSize(width / this._hardwareScalingLevel, height / this._hardwareScalingLevel, forceSetSize);\r\n }\r\n\r\n /**\r\n * Force a specific size of the canvas\r\n * @param width defines the new canvas' width\r\n * @param height defines the new canvas' height\r\n * @param forceSetSize true to force setting the sizes of the underlying canvas\r\n * @returns true if the size was changed\r\n */\r\n public setSize(width: number, height: number, forceSetSize = false): boolean {\r\n if (!this._renderingCanvas) {\r\n return false;\r\n }\r\n\r\n width = width | 0;\r\n height = height | 0;\r\n\r\n if (!forceSetSize && this._renderingCanvas.width === width && this._renderingCanvas.height === height) {\r\n return false;\r\n }\r\n\r\n this._renderingCanvas.width = width;\r\n this._renderingCanvas.height = height;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Binds the frame buffer to the specified texture.\r\n * @param rtWrapper The render target wrapper to render to\r\n * @param faceIndex The face of the texture to render to in case of cube texture and if the render target wrapper is not a multi render target\r\n * @param requiredWidth The width of the target to render to\r\n * @param requiredHeight The height of the target to render to\r\n * @param forceFullscreenViewport Forces the viewport to be the entire texture/screen if true\r\n * @param lodLevel Defines the lod level to bind to the frame buffer\r\n * @param layer Defines the 2d array index to bind to the frame buffer if the render target wrapper is not a multi render target\r\n */\r\n public bindFramebuffer(\r\n rtWrapper: RenderTargetWrapper,\r\n faceIndex: number = 0,\r\n requiredWidth?: number,\r\n requiredHeight?: number,\r\n forceFullscreenViewport?: boolean,\r\n lodLevel = 0,\r\n layer = 0\r\n ): void {\r\n const webglRTWrapper = rtWrapper as WebGLRenderTargetWrapper;\r\n\r\n if (this._currentRenderTarget) {\r\n this.unBindFramebuffer(this._currentRenderTarget);\r\n }\r\n this._currentRenderTarget = rtWrapper;\r\n this._bindUnboundFramebuffer(webglRTWrapper._MSAAFramebuffer ? webglRTWrapper._MSAAFramebuffer : webglRTWrapper._framebuffer);\r\n\r\n const gl = this._gl;\r\n if (!rtWrapper.isMulti) {\r\n if (rtWrapper.is2DArray || rtWrapper.is3D) {\r\n gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, rtWrapper.texture!._hardwareTexture?.underlyingResource, lodLevel, layer);\r\n } else if (rtWrapper.isCube) {\r\n gl.framebufferTexture2D(\r\n gl.FRAMEBUFFER,\r\n gl.COLOR_ATTACHMENT0,\r\n gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex,\r\n rtWrapper.texture!._hardwareTexture?.underlyingResource,\r\n lodLevel\r\n );\r\n } else if (webglRTWrapper._currentLOD !== lodLevel) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, rtWrapper.texture!._hardwareTexture?.underlyingResource, lodLevel);\r\n webglRTWrapper._currentLOD = lodLevel;\r\n }\r\n }\r\n\r\n const depthStencilTexture = rtWrapper._depthStencilTexture;\r\n if (depthStencilTexture) {\r\n if (rtWrapper.is3D) {\r\n if (\r\n rtWrapper.texture!.width !== depthStencilTexture.width ||\r\n rtWrapper.texture!.height !== depthStencilTexture.height ||\r\n rtWrapper.texture!.depth !== depthStencilTexture.depth\r\n ) {\r\n Logger.Warn(\"Depth/Stencil attachment for 3D target must have same dimensions as color attachment\");\r\n }\r\n }\r\n const attachment = rtWrapper._depthStencilTextureWithStencil ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\r\n if (rtWrapper.is2DArray || rtWrapper.is3D) {\r\n gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachment, depthStencilTexture._hardwareTexture?.underlyingResource, lodLevel, layer);\r\n } else if (rtWrapper.isCube) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, depthStencilTexture._hardwareTexture?.underlyingResource, lodLevel);\r\n } else {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, depthStencilTexture._hardwareTexture?.underlyingResource, lodLevel);\r\n }\r\n }\r\n\r\n if (this._cachedViewport && !forceFullscreenViewport) {\r\n this.setViewport(this._cachedViewport, requiredWidth, requiredHeight);\r\n } else {\r\n if (!requiredWidth) {\r\n requiredWidth = rtWrapper.width;\r\n if (lodLevel) {\r\n requiredWidth = requiredWidth / Math.pow(2, lodLevel);\r\n }\r\n }\r\n if (!requiredHeight) {\r\n requiredHeight = rtWrapper.height;\r\n if (lodLevel) {\r\n requiredHeight = requiredHeight / Math.pow(2, lodLevel);\r\n }\r\n }\r\n\r\n this._viewport(0, 0, requiredWidth, requiredHeight);\r\n }\r\n\r\n this.wipeCaches();\r\n }\r\n\r\n /**\r\n * Set various states to the webGL context\r\n * @param culling defines culling state: true to enable culling, false to disable it\r\n * @param zOffset defines the value to apply to zOffset (0 by default)\r\n * @param force defines if states must be applied even if cache is up to date\r\n * @param reverseSide defines if culling must be reversed (CCW if false, CW if true)\r\n * @param cullBackFaces true to cull back faces, false to cull front faces (if culling is enabled)\r\n * @param stencil stencil states to set\r\n * @param zOffsetUnits defines the value to apply to zOffsetUnits (0 by default)\r\n */\r\n public setState(culling: boolean, zOffset: number = 0, force?: boolean, reverseSide = false, cullBackFaces?: boolean, stencil?: IStencilState, zOffsetUnits: number = 0): void {\r\n // Culling\r\n if (this._depthCullingState.cull !== culling || force) {\r\n this._depthCullingState.cull = culling;\r\n }\r\n\r\n // Cull face\r\n const cullFace = this.cullBackFaces ?? cullBackFaces ?? true ? this._gl.BACK : this._gl.FRONT;\r\n if (this._depthCullingState.cullFace !== cullFace || force) {\r\n this._depthCullingState.cullFace = cullFace;\r\n }\r\n\r\n // Z offset\r\n this.setZOffset(zOffset);\r\n this.setZOffsetUnits(zOffsetUnits);\r\n\r\n // Front face\r\n const frontFace = reverseSide ? this._gl.CW : this._gl.CCW;\r\n if (this._depthCullingState.frontFace !== frontFace || force) {\r\n this._depthCullingState.frontFace = frontFace;\r\n }\r\n\r\n this._stencilStateComposer.stencilMaterial = stencil;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if depth testing is enabled\r\n * @returns the current state\r\n */\r\n public getDepthBuffer(): boolean {\r\n return this._depthCullingState.depthTest;\r\n }\r\n\r\n /**\r\n * Enable or disable depth buffering\r\n * @param enable defines the state to set\r\n */\r\n public setDepthBuffer(enable: boolean): void {\r\n this._depthCullingState.depthTest = enable;\r\n }\r\n\r\n /**\r\n * Set the z offset Factor to apply to current rendering\r\n * @param value defines the offset to apply\r\n */\r\n public setZOffset(value: number): void {\r\n this._depthCullingState.zOffset = this.useReverseDepthBuffer ? -value : value;\r\n }\r\n\r\n /**\r\n * Gets the current value of the zOffset Factor\r\n * @returns the current zOffset Factor state\r\n */\r\n public getZOffset(): number {\r\n const zOffset = this._depthCullingState.zOffset;\r\n return this.useReverseDepthBuffer ? -zOffset : zOffset;\r\n }\r\n\r\n /**\r\n * Set the z offset Units to apply to current rendering\r\n * @param value defines the offset to apply\r\n */\r\n public setZOffsetUnits(value: number): void {\r\n this._depthCullingState.zOffsetUnits = this.useReverseDepthBuffer ? -value : value;\r\n }\r\n\r\n /**\r\n * Gets the current value of the zOffset Units\r\n * @returns the current zOffset Units state\r\n */\r\n public getZOffsetUnits(): number {\r\n const zOffsetUnits = this._depthCullingState.zOffsetUnits;\r\n return this.useReverseDepthBuffer ? -zOffsetUnits : zOffsetUnits;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bindUnboundFramebuffer(framebuffer: Nullable) {\r\n if (this._currentFramebuffer !== framebuffer) {\r\n this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\r\n this._currentFramebuffer = framebuffer;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _currentFrameBufferIsDefaultFrameBuffer() {\r\n return this._currentFramebuffer === null;\r\n }\r\n\r\n /**\r\n * Generates the mipmaps for a texture\r\n * @param texture texture to generate the mipmaps for\r\n */\r\n public generateMipmaps(texture: InternalTexture): void {\r\n const target = this._getTextureTarget(texture);\r\n this._bindTextureDirectly(target, texture, true);\r\n this._gl.generateMipmap(target);\r\n this._bindTextureDirectly(target, null);\r\n }\r\n\r\n /**\r\n * Unbind the current render target texture from the webGL context\r\n * @param texture defines the render target wrapper to unbind\r\n * @param disableGenerateMipMaps defines a boolean indicating that mipmaps must not be generated\r\n * @param onBeforeUnbind defines a function which will be called before the effective unbind\r\n */\r\n public unBindFramebuffer(texture: RenderTargetWrapper, disableGenerateMipMaps = false, onBeforeUnbind?: () => void): void {\r\n const webglRTWrapper = texture as WebGLRenderTargetWrapper;\r\n\r\n this._currentRenderTarget = null;\r\n\r\n // If MSAA, we need to bitblt back to main texture\r\n const gl = this._gl;\r\n if (webglRTWrapper._MSAAFramebuffer) {\r\n if (texture.isMulti) {\r\n // This texture is part of a MRT texture, we need to treat all attachments\r\n this.unBindMultiColorAttachmentFramebuffer(texture, disableGenerateMipMaps, onBeforeUnbind);\r\n return;\r\n }\r\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, webglRTWrapper._MSAAFramebuffer);\r\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, webglRTWrapper._framebuffer);\r\n gl.blitFramebuffer(0, 0, texture.width, texture.height, 0, 0, texture.width, texture.height, gl.COLOR_BUFFER_BIT, gl.NEAREST);\r\n }\r\n\r\n if (texture.texture?.generateMipMaps && !disableGenerateMipMaps && !texture.isCube) {\r\n this.generateMipmaps(texture.texture);\r\n }\r\n\r\n if (onBeforeUnbind) {\r\n if (webglRTWrapper._MSAAFramebuffer) {\r\n // Bind the correct framebuffer\r\n this._bindUnboundFramebuffer(webglRTWrapper._framebuffer);\r\n }\r\n onBeforeUnbind();\r\n }\r\n\r\n this._bindUnboundFramebuffer(null);\r\n }\r\n\r\n /**\r\n * Force a webGL flush (ie. a flush of all waiting webGL commands)\r\n */\r\n public flushFramebuffer(): void {\r\n this._gl.flush();\r\n }\r\n\r\n /**\r\n * Unbind the current render target and bind the default framebuffer\r\n */\r\n public restoreDefaultFramebuffer(): void {\r\n if (this._currentRenderTarget) {\r\n this.unBindFramebuffer(this._currentRenderTarget);\r\n } else {\r\n this._bindUnboundFramebuffer(null);\r\n }\r\n if (this._cachedViewport) {\r\n this.setViewport(this._cachedViewport);\r\n }\r\n\r\n this.wipeCaches();\r\n }\r\n\r\n // VBOs\r\n\r\n /** @internal */\r\n protected _resetVertexBufferBinding(): void {\r\n this.bindArrayBuffer(null);\r\n this._cachedVertexBuffers = null;\r\n }\r\n\r\n /**\r\n * Creates a vertex buffer\r\n * @param data the data or size for the vertex buffer\r\n * @param _updatable whether the buffer should be created as updatable\r\n * @param _label defines the label of the buffer (for debug purpose)\r\n * @returns the new WebGL static buffer\r\n */\r\n public createVertexBuffer(data: DataArray | number, _updatable?: boolean, _label?: string): DataBuffer {\r\n return this._createVertexBuffer(data, this._gl.STATIC_DRAW);\r\n }\r\n\r\n private _createVertexBuffer(data: DataArray | number, usage: number): DataBuffer {\r\n const vbo = this._gl.createBuffer();\r\n\r\n if (!vbo) {\r\n throw new Error(\"Unable to create vertex buffer\");\r\n }\r\n\r\n const dataBuffer = new WebGLDataBuffer(vbo);\r\n this.bindArrayBuffer(dataBuffer);\r\n\r\n if (typeof data !== \"number\") {\r\n if (data instanceof Array) {\r\n this._gl.bufferData(this._gl.ARRAY_BUFFER, new Float32Array(data), usage);\r\n dataBuffer.capacity = data.length * 4;\r\n } else {\r\n this._gl.bufferData(this._gl.ARRAY_BUFFER, data, usage);\r\n dataBuffer.capacity = data.byteLength;\r\n }\r\n } else {\r\n this._gl.bufferData(this._gl.ARRAY_BUFFER, new Uint8Array(data), usage);\r\n dataBuffer.capacity = data;\r\n }\r\n\r\n this._resetVertexBufferBinding();\r\n\r\n dataBuffer.references = 1;\r\n return dataBuffer;\r\n }\r\n\r\n /**\r\n * Creates a dynamic vertex buffer\r\n * @param data the data for the dynamic vertex buffer\r\n * @param _label defines the label of the buffer (for debug purpose)\r\n * @returns the new WebGL dynamic buffer\r\n */\r\n public createDynamicVertexBuffer(data: DataArray | number, _label?: string): DataBuffer {\r\n return this._createVertexBuffer(data, this._gl.DYNAMIC_DRAW);\r\n }\r\n\r\n protected _resetIndexBufferBinding(): void {\r\n this.bindIndexBuffer(null);\r\n this._cachedIndexBuffer = null;\r\n }\r\n\r\n /**\r\n * Creates a new index buffer\r\n * @param indices defines the content of the index buffer\r\n * @param updatable defines if the index buffer must be updatable\r\n * @param _label defines the label of the buffer (for debug purpose)\r\n * @returns a new webGL buffer\r\n */\r\n public createIndexBuffer(indices: IndicesArray, updatable?: boolean, _label?: string): DataBuffer {\r\n const vbo = this._gl.createBuffer();\r\n const dataBuffer = new WebGLDataBuffer(vbo!);\r\n\r\n if (!vbo) {\r\n throw new Error(\"Unable to create index buffer\");\r\n }\r\n\r\n this.bindIndexBuffer(dataBuffer);\r\n\r\n const data = this._normalizeIndexData(indices);\r\n this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, data, updatable ? this._gl.DYNAMIC_DRAW : this._gl.STATIC_DRAW);\r\n this._resetIndexBufferBinding();\r\n dataBuffer.references = 1;\r\n dataBuffer.is32Bits = data.BYTES_PER_ELEMENT === 4;\r\n return dataBuffer;\r\n }\r\n\r\n protected _normalizeIndexData(indices: IndicesArray): Uint16Array | Uint32Array {\r\n const bytesPerElement = (indices as Exclude).BYTES_PER_ELEMENT;\r\n if (bytesPerElement === 2) {\r\n return indices as Uint16Array;\r\n }\r\n\r\n // Check 32 bit support\r\n if (this._caps.uintIndices) {\r\n if (indices instanceof Uint32Array) {\r\n return indices;\r\n } else {\r\n // number[] or Int32Array, check if 32 bit is necessary\r\n for (let index = 0; index < indices.length; index++) {\r\n if (indices[index] >= 65535) {\r\n return new Uint32Array(indices);\r\n }\r\n }\r\n\r\n return new Uint16Array(indices);\r\n }\r\n }\r\n\r\n // No 32 bit support, force conversion to 16 bit (values greater 16 bit are lost)\r\n return new Uint16Array(indices);\r\n }\r\n\r\n /**\r\n * Bind a webGL buffer to the webGL context\r\n * @param buffer defines the buffer to bind\r\n */\r\n public bindArrayBuffer(buffer: Nullable): void {\r\n if (!this._vaoRecordInProgress) {\r\n this._unbindVertexArrayObject();\r\n }\r\n this._bindBuffer(buffer, this._gl.ARRAY_BUFFER);\r\n }\r\n\r\n /**\r\n * Bind a specific block at a given index in a specific shader program\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param blockName defines the block name\r\n * @param index defines the index where to bind the block\r\n */\r\n public bindUniformBlock(pipelineContext: IPipelineContext, blockName: string, index: number): void {\r\n const program = (pipelineContext as WebGLPipelineContext).program!;\r\n\r\n const uniformLocation = this._gl.getUniformBlockIndex(program, blockName);\r\n\r\n this._gl.uniformBlockBinding(program, uniformLocation, index);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected bindIndexBuffer(buffer: Nullable): void {\r\n if (!this._vaoRecordInProgress) {\r\n this._unbindVertexArrayObject();\r\n }\r\n this._bindBuffer(buffer, this._gl.ELEMENT_ARRAY_BUFFER);\r\n }\r\n\r\n private _bindBuffer(buffer: Nullable, target: number): void {\r\n if (this._vaoRecordInProgress || this._currentBoundBuffer[target] !== buffer) {\r\n this._gl.bindBuffer(target, buffer ? buffer.underlyingResource : null);\r\n this._currentBoundBuffer[target] = buffer;\r\n }\r\n }\r\n\r\n /**\r\n * update the bound buffer with the given data\r\n * @param data defines the data to update\r\n */\r\n public updateArrayBuffer(data: Float32Array): void {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data);\r\n }\r\n\r\n private _vertexAttribPointer(buffer: DataBuffer, indx: number, size: number, type: number, normalized: boolean, stride: number, offset: number): void {\r\n const pointer = this._currentBufferPointers[indx];\r\n if (!pointer) {\r\n return;\r\n }\r\n\r\n let changed = false;\r\n if (!pointer.active) {\r\n changed = true;\r\n pointer.active = true;\r\n pointer.index = indx;\r\n pointer.size = size;\r\n pointer.type = type;\r\n pointer.normalized = normalized;\r\n pointer.stride = stride;\r\n pointer.offset = offset;\r\n pointer.buffer = buffer;\r\n } else {\r\n if (pointer.buffer !== buffer) {\r\n pointer.buffer = buffer;\r\n changed = true;\r\n }\r\n if (pointer.size !== size) {\r\n pointer.size = size;\r\n changed = true;\r\n }\r\n if (pointer.type !== type) {\r\n pointer.type = type;\r\n changed = true;\r\n }\r\n if (pointer.normalized !== normalized) {\r\n pointer.normalized = normalized;\r\n changed = true;\r\n }\r\n if (pointer.stride !== stride) {\r\n pointer.stride = stride;\r\n changed = true;\r\n }\r\n if (pointer.offset !== offset) {\r\n pointer.offset = offset;\r\n changed = true;\r\n }\r\n }\r\n\r\n if (changed || this._vaoRecordInProgress) {\r\n this.bindArrayBuffer(buffer);\r\n if (type === this._gl.UNSIGNED_INT || type === this._gl.INT) {\r\n this._gl.vertexAttribIPointer(indx, size, type, stride, offset);\r\n } else {\r\n this._gl.vertexAttribPointer(indx, size, type, normalized, stride, offset);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bindIndexBufferWithCache(indexBuffer: Nullable): void {\r\n if (indexBuffer == null) {\r\n return;\r\n }\r\n if (this._cachedIndexBuffer !== indexBuffer) {\r\n this._cachedIndexBuffer = indexBuffer;\r\n this.bindIndexBuffer(indexBuffer);\r\n this._uintIndicesCurrentlySet = indexBuffer.is32Bits;\r\n }\r\n }\r\n\r\n private _bindVertexBuffersAttributes(\r\n vertexBuffers: { [key: string]: Nullable },\r\n effect: Effect,\r\n overrideVertexBuffers?: { [kind: string]: Nullable }\r\n ): void {\r\n const attributes = effect.getAttributesNames();\r\n\r\n if (!this._vaoRecordInProgress) {\r\n this._unbindVertexArrayObject();\r\n }\r\n\r\n this.unbindAllAttributes();\r\n\r\n for (let index = 0; index < attributes.length; index++) {\r\n const order = effect.getAttributeLocation(index);\r\n\r\n if (order >= 0) {\r\n const ai = attributes[index];\r\n let vertexBuffer: Nullable = null;\r\n\r\n if (overrideVertexBuffers) {\r\n vertexBuffer = overrideVertexBuffers[ai];\r\n }\r\n\r\n if (!vertexBuffer) {\r\n vertexBuffer = vertexBuffers[ai];\r\n }\r\n\r\n if (!vertexBuffer) {\r\n continue;\r\n }\r\n\r\n this._gl.enableVertexAttribArray(order);\r\n if (!this._vaoRecordInProgress) {\r\n this._vertexAttribArraysEnabled[order] = true;\r\n }\r\n\r\n const buffer = vertexBuffer.getBuffer();\r\n if (buffer) {\r\n this._vertexAttribPointer(buffer, order, vertexBuffer.getSize(), vertexBuffer.type, vertexBuffer.normalized, vertexBuffer.byteStride, vertexBuffer.byteOffset);\r\n\r\n if (vertexBuffer.getIsInstanced()) {\r\n this._gl.vertexAttribDivisor(order, vertexBuffer.getInstanceDivisor());\r\n if (!this._vaoRecordInProgress) {\r\n this._currentInstanceLocations.push(order);\r\n this._currentInstanceBuffers.push(buffer);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Records a vertex array object\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#vertex-array-objects\r\n * @param vertexBuffers defines the list of vertex buffers to store\r\n * @param indexBuffer defines the index buffer to store\r\n * @param effect defines the effect to store\r\n * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers\r\n * @returns the new vertex array object\r\n */\r\n public recordVertexArrayObject(\r\n vertexBuffers: { [key: string]: VertexBuffer },\r\n indexBuffer: Nullable,\r\n effect: Effect,\r\n overrideVertexBuffers?: { [kind: string]: Nullable }\r\n ): WebGLVertexArrayObject {\r\n const vao = this._gl.createVertexArray();\r\n\r\n if (!vao) {\r\n throw new Error(\"Unable to create VAO\");\r\n }\r\n\r\n this._vaoRecordInProgress = true;\r\n\r\n this._gl.bindVertexArray(vao);\r\n\r\n this._mustWipeVertexAttributes = true;\r\n this._bindVertexBuffersAttributes(vertexBuffers, effect, overrideVertexBuffers);\r\n\r\n this.bindIndexBuffer(indexBuffer);\r\n\r\n this._vaoRecordInProgress = false;\r\n this._gl.bindVertexArray(null);\r\n\r\n return vao;\r\n }\r\n\r\n /**\r\n * Bind a specific vertex array object\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#vertex-array-objects\r\n * @param vertexArrayObject defines the vertex array object to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n */\r\n public bindVertexArrayObject(vertexArrayObject: WebGLVertexArrayObject, indexBuffer: Nullable): void {\r\n if (this._cachedVertexArrayObject !== vertexArrayObject) {\r\n this._cachedVertexArrayObject = vertexArrayObject;\r\n\r\n this._gl.bindVertexArray(vertexArrayObject);\r\n this._cachedVertexBuffers = null;\r\n this._cachedIndexBuffer = null;\r\n\r\n this._uintIndicesCurrentlySet = indexBuffer != null && indexBuffer.is32Bits;\r\n this._mustWipeVertexAttributes = true;\r\n }\r\n }\r\n\r\n /**\r\n * Bind webGl buffers directly to the webGL context\r\n * @param vertexBuffer defines the vertex buffer to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n * @param vertexDeclaration defines the vertex declaration to use with the vertex buffer\r\n * @param vertexStrideSize defines the vertex stride of the vertex buffer\r\n * @param effect defines the effect associated with the vertex buffer\r\n */\r\n public bindBuffersDirectly(vertexBuffer: DataBuffer, indexBuffer: DataBuffer, vertexDeclaration: number[], vertexStrideSize: number, effect: Effect): void {\r\n if (this._cachedVertexBuffers !== vertexBuffer || this._cachedEffectForVertexBuffers !== effect) {\r\n this._cachedVertexBuffers = vertexBuffer;\r\n this._cachedEffectForVertexBuffers = effect;\r\n\r\n const attributesCount = effect.getAttributesCount();\r\n\r\n this._unbindVertexArrayObject();\r\n this.unbindAllAttributes();\r\n\r\n let offset = 0;\r\n for (let index = 0; index < attributesCount; index++) {\r\n if (index < vertexDeclaration.length) {\r\n const order = effect.getAttributeLocation(index);\r\n\r\n if (order >= 0) {\r\n this._gl.enableVertexAttribArray(order);\r\n this._vertexAttribArraysEnabled[order] = true;\r\n this._vertexAttribPointer(vertexBuffer, order, vertexDeclaration[index], this._gl.FLOAT, false, vertexStrideSize, offset);\r\n }\r\n\r\n offset += vertexDeclaration[index] * 4;\r\n }\r\n }\r\n }\r\n\r\n this._bindIndexBufferWithCache(indexBuffer);\r\n }\r\n\r\n private _unbindVertexArrayObject(): void {\r\n if (!this._cachedVertexArrayObject) {\r\n return;\r\n }\r\n\r\n this._cachedVertexArrayObject = null;\r\n this._gl.bindVertexArray(null);\r\n }\r\n\r\n /**\r\n * Bind a list of vertex buffers to the webGL context\r\n * @param vertexBuffers defines the list of vertex buffers to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n * @param effect defines the effect associated with the vertex buffers\r\n * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers\r\n */\r\n public bindBuffers(\r\n vertexBuffers: { [key: string]: Nullable },\r\n indexBuffer: Nullable,\r\n effect: Effect,\r\n overrideVertexBuffers?: { [kind: string]: Nullable }\r\n ): void {\r\n if (this._cachedVertexBuffers !== vertexBuffers || this._cachedEffectForVertexBuffers !== effect) {\r\n this._cachedVertexBuffers = vertexBuffers;\r\n this._cachedEffectForVertexBuffers = effect;\r\n\r\n this._bindVertexBuffersAttributes(vertexBuffers, effect, overrideVertexBuffers);\r\n }\r\n\r\n this._bindIndexBufferWithCache(indexBuffer);\r\n }\r\n\r\n /**\r\n * Unbind all instance attributes\r\n */\r\n public unbindInstanceAttributes() {\r\n let boundBuffer;\r\n for (let i = 0, ul = this._currentInstanceLocations.length; i < ul; i++) {\r\n const instancesBuffer = this._currentInstanceBuffers[i];\r\n if (boundBuffer != instancesBuffer && instancesBuffer.references) {\r\n boundBuffer = instancesBuffer;\r\n this.bindArrayBuffer(instancesBuffer);\r\n }\r\n const offsetLocation = this._currentInstanceLocations[i];\r\n this._gl.vertexAttribDivisor(offsetLocation, 0);\r\n }\r\n this._currentInstanceBuffers.length = 0;\r\n this._currentInstanceLocations.length = 0;\r\n }\r\n\r\n /**\r\n * Release and free the memory of a vertex array object\r\n * @param vao defines the vertex array object to delete\r\n */\r\n public releaseVertexArrayObject(vao: WebGLVertexArrayObject) {\r\n this._gl.deleteVertexArray(vao);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseBuffer(buffer: DataBuffer): boolean {\r\n buffer.references--;\r\n\r\n if (buffer.references === 0) {\r\n this._deleteBuffer(buffer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n protected _deleteBuffer(buffer: DataBuffer): void {\r\n this._gl.deleteBuffer(buffer.underlyingResource);\r\n }\r\n\r\n /**\r\n * Update the content of a webGL buffer used with instantiation and bind it to the webGL context\r\n * @param instancesBuffer defines the webGL buffer to update and bind\r\n * @param data defines the data to store in the buffer\r\n * @param offsetLocations defines the offsets or attributes information used to determine where data must be stored in the buffer\r\n */\r\n public updateAndBindInstancesBuffer(instancesBuffer: DataBuffer, data: Float32Array, offsetLocations: number[] | InstancingAttributeInfo[]): void {\r\n this.bindArrayBuffer(instancesBuffer);\r\n if (data) {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data);\r\n }\r\n\r\n if ((offsetLocations[0]).index !== undefined) {\r\n this.bindInstancesBuffer(instancesBuffer, offsetLocations as any, true);\r\n } else {\r\n for (let index = 0; index < 4; index++) {\r\n const offsetLocation = offsetLocations[index];\r\n\r\n if (!this._vertexAttribArraysEnabled[offsetLocation]) {\r\n this._gl.enableVertexAttribArray(offsetLocation);\r\n this._vertexAttribArraysEnabled[offsetLocation] = true;\r\n }\r\n\r\n this._vertexAttribPointer(instancesBuffer, offsetLocation, 4, this._gl.FLOAT, false, 64, index * 16);\r\n this._gl.vertexAttribDivisor(offsetLocation, 1);\r\n this._currentInstanceLocations.push(offsetLocation);\r\n this._currentInstanceBuffers.push(instancesBuffer);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Bind the content of a webGL buffer used with instantiation\r\n * @param instancesBuffer defines the webGL buffer to bind\r\n * @param attributesInfo defines the offsets or attributes information used to determine where data must be stored in the buffer\r\n * @param computeStride defines Whether to compute the strides from the info or use the default 0\r\n */\r\n public bindInstancesBuffer(instancesBuffer: DataBuffer, attributesInfo: InstancingAttributeInfo[], computeStride = true): void {\r\n this.bindArrayBuffer(instancesBuffer);\r\n\r\n let stride = 0;\r\n if (computeStride) {\r\n for (let i = 0; i < attributesInfo.length; i++) {\r\n const ai = attributesInfo[i];\r\n stride += ai.attributeSize * 4;\r\n }\r\n }\r\n\r\n for (let i = 0; i < attributesInfo.length; i++) {\r\n const ai = attributesInfo[i];\r\n if (ai.index === undefined) {\r\n ai.index = this._currentEffect!.getAttributeLocationByName(ai.attributeName);\r\n }\r\n\r\n if (ai.index < 0) {\r\n continue;\r\n }\r\n\r\n if (!this._vertexAttribArraysEnabled[ai.index]) {\r\n this._gl.enableVertexAttribArray(ai.index);\r\n this._vertexAttribArraysEnabled[ai.index] = true;\r\n }\r\n\r\n this._vertexAttribPointer(instancesBuffer, ai.index, ai.attributeSize, ai.attributeType || this._gl.FLOAT, ai.normalized || false, stride, ai.offset);\r\n this._gl.vertexAttribDivisor(ai.index, ai.divisor === undefined ? 1 : ai.divisor);\r\n this._currentInstanceLocations.push(ai.index);\r\n this._currentInstanceBuffers.push(instancesBuffer);\r\n }\r\n }\r\n\r\n /**\r\n * Disable the instance attribute corresponding to the name in parameter\r\n * @param name defines the name of the attribute to disable\r\n */\r\n public disableInstanceAttributeByName(name: string) {\r\n if (!this._currentEffect) {\r\n return;\r\n }\r\n\r\n const attributeLocation = this._currentEffect.getAttributeLocationByName(name);\r\n this.disableInstanceAttribute(attributeLocation);\r\n }\r\n\r\n /**\r\n * Disable the instance attribute corresponding to the location in parameter\r\n * @param attributeLocation defines the attribute location of the attribute to disable\r\n */\r\n public disableInstanceAttribute(attributeLocation: number) {\r\n let shouldClean = false;\r\n let index: number;\r\n while ((index = this._currentInstanceLocations.indexOf(attributeLocation)) !== -1) {\r\n this._currentInstanceLocations.splice(index, 1);\r\n this._currentInstanceBuffers.splice(index, 1);\r\n\r\n shouldClean = true;\r\n index = this._currentInstanceLocations.indexOf(attributeLocation);\r\n }\r\n\r\n if (shouldClean) {\r\n this._gl.vertexAttribDivisor(attributeLocation, 0);\r\n this.disableAttributeByIndex(attributeLocation);\r\n }\r\n }\r\n\r\n /**\r\n * Disable the attribute corresponding to the location in parameter\r\n * @param attributeLocation defines the attribute location of the attribute to disable\r\n */\r\n public disableAttributeByIndex(attributeLocation: number) {\r\n this._gl.disableVertexAttribArray(attributeLocation);\r\n this._vertexAttribArraysEnabled[attributeLocation] = false;\r\n this._currentBufferPointers[attributeLocation].active = false;\r\n }\r\n\r\n /**\r\n * Send a draw order\r\n * @param useTriangles defines if triangles must be used to draw (else wireframe will be used)\r\n * @param indexStart defines the starting index\r\n * @param indexCount defines the number of index to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public draw(useTriangles: boolean, indexStart: number, indexCount: number, instancesCount?: number): void {\r\n this.drawElementsType(useTriangles ? Constants.MATERIAL_TriangleFillMode : Constants.MATERIAL_WireFrameFillMode, indexStart, indexCount, instancesCount);\r\n }\r\n\r\n /**\r\n * Draw a list of points\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public drawPointClouds(verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n this.drawArraysType(Constants.MATERIAL_PointFillMode, verticesStart, verticesCount, instancesCount);\r\n }\r\n\r\n /**\r\n * Draw a list of unindexed primitives\r\n * @param useTriangles defines if triangles must be used to draw (else wireframe will be used)\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public drawUnIndexed(useTriangles: boolean, verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n this.drawArraysType(useTriangles ? Constants.MATERIAL_TriangleFillMode : Constants.MATERIAL_WireFrameFillMode, verticesStart, verticesCount, instancesCount);\r\n }\r\n\r\n /**\r\n * Draw a list of indexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param indexStart defines the starting index\r\n * @param indexCount defines the number of index to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public drawElementsType(fillMode: number, indexStart: number, indexCount: number, instancesCount?: number): void {\r\n // Apply states\r\n this.applyStates();\r\n\r\n this._reportDrawCall();\r\n\r\n // Render\r\n\r\n const drawMode = this._drawMode(fillMode);\r\n const indexFormat = this._uintIndicesCurrentlySet ? this._gl.UNSIGNED_INT : this._gl.UNSIGNED_SHORT;\r\n const mult = this._uintIndicesCurrentlySet ? 4 : 2;\r\n if (instancesCount) {\r\n this._gl.drawElementsInstanced(drawMode, indexCount, indexFormat, indexStart * mult, instancesCount);\r\n } else {\r\n this._gl.drawElements(drawMode, indexCount, indexFormat, indexStart * mult);\r\n }\r\n }\r\n\r\n /**\r\n * Draw a list of unindexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public drawArraysType(fillMode: number, verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n // Apply states\r\n this.applyStates();\r\n\r\n this._reportDrawCall();\r\n\r\n const drawMode = this._drawMode(fillMode);\r\n if (instancesCount) {\r\n this._gl.drawArraysInstanced(drawMode, verticesStart, verticesCount, instancesCount);\r\n } else {\r\n this._gl.drawArrays(drawMode, verticesStart, verticesCount);\r\n }\r\n }\r\n\r\n private _drawMode(fillMode: number): number {\r\n switch (fillMode) {\r\n // Triangle views\r\n case Constants.MATERIAL_TriangleFillMode:\r\n return this._gl.TRIANGLES;\r\n case Constants.MATERIAL_PointFillMode:\r\n return this._gl.POINTS;\r\n case Constants.MATERIAL_WireFrameFillMode:\r\n return this._gl.LINES;\r\n // Draw modes\r\n case Constants.MATERIAL_PointListDrawMode:\r\n return this._gl.POINTS;\r\n case Constants.MATERIAL_LineListDrawMode:\r\n return this._gl.LINES;\r\n case Constants.MATERIAL_LineLoopDrawMode:\r\n return this._gl.LINE_LOOP;\r\n case Constants.MATERIAL_LineStripDrawMode:\r\n return this._gl.LINE_STRIP;\r\n case Constants.MATERIAL_TriangleStripDrawMode:\r\n return this._gl.TRIANGLE_STRIP;\r\n case Constants.MATERIAL_TriangleFanDrawMode:\r\n return this._gl.TRIANGLE_FAN;\r\n default:\r\n return this._gl.TRIANGLES;\r\n }\r\n }\r\n\r\n /** @internal */\r\n protected _reportDrawCall() {\r\n // Will be implemented by children\r\n }\r\n\r\n // Shaders\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseEffect(effect: Effect): void {\r\n if (this._compiledEffects[effect._key]) {\r\n delete this._compiledEffects[effect._key];\r\n }\r\n const pipelineContext = effect.getPipelineContext();\r\n if (pipelineContext) {\r\n this._deletePipelineContext(pipelineContext);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _deletePipelineContext(pipelineContext: IPipelineContext): void {\r\n const webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n if (webGLPipelineContext && webGLPipelineContext.program) {\r\n webGLPipelineContext.program.__SPECTOR_rebuildProgram = null;\r\n\r\n this._gl.deleteProgram(webGLPipelineContext.program);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _getGlobalDefines(defines?: { [key: string]: string }): string | undefined {\r\n if (defines) {\r\n if (this.isNDCHalfZRange) {\r\n defines[\"IS_NDC_HALF_ZRANGE\"] = \"\";\r\n } else {\r\n delete defines[\"IS_NDC_HALF_ZRANGE\"];\r\n }\r\n if (this.useReverseDepthBuffer) {\r\n defines[\"USE_REVERSE_DEPTHBUFFER\"] = \"\";\r\n } else {\r\n delete defines[\"USE_REVERSE_DEPTHBUFFER\"];\r\n }\r\n if (this.useExactSrgbConversions) {\r\n defines[\"USE_EXACT_SRGB_CONVERSIONS\"] = \"\";\r\n } else {\r\n delete defines[\"USE_EXACT_SRGB_CONVERSIONS\"];\r\n }\r\n return;\r\n } else {\r\n let s = \"\";\r\n if (this.isNDCHalfZRange) {\r\n s += \"#define IS_NDC_HALF_ZRANGE\";\r\n }\r\n if (this.useReverseDepthBuffer) {\r\n if (s) {\r\n s += \"\\n\";\r\n }\r\n s += \"#define USE_REVERSE_DEPTHBUFFER\";\r\n }\r\n if (this.useExactSrgbConversions) {\r\n if (s) {\r\n s += \"\\n\";\r\n }\r\n s += \"#define USE_EXACT_SRGB_CONVERSIONS\";\r\n }\r\n return s;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new effect (used to store vertex/fragment shaders)\r\n * @param baseName defines the base name of the effect (The name of file without .fragment.fx or .vertex.fx)\r\n * @param attributesNamesOrOptions defines either a list of attribute names or an IEffectCreationOptions object\r\n * @param uniformsNamesOrEngine defines either a list of uniform names or the engine to use\r\n * @param samplers defines an array of string used to represent textures\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param fallbacks defines the list of potential fallbacks to use if shader compilation fails\r\n * @param onCompiled defines a function to call when the effect creation is successful\r\n * @param onError defines a function to call when the effect creation has failed\r\n * @param indexParameters defines an object containing the index values to use to compile shaders (like the maximum number of simultaneous lights)\r\n * @param shaderLanguage the language the shader is written in (default: GLSL)\r\n * @returns the new Effect\r\n */\r\n public createEffect(\r\n baseName: string | (IShaderPath & { vertexToken?: string; fragmentToken?: string }),\r\n attributesNamesOrOptions: string[] | IEffectCreationOptions,\r\n uniformsNamesOrEngine: string[] | ThinEngine,\r\n samplers?: string[],\r\n defines?: string,\r\n fallbacks?: IEffectFallbacks,\r\n onCompiled?: Nullable<(effect: Effect) => void>,\r\n onError?: Nullable<(effect: Effect, errors: string) => void>,\r\n indexParameters?: any,\r\n shaderLanguage = ShaderLanguage.GLSL\r\n ): Effect {\r\n const vertex = typeof baseName === \"string\" ? baseName : baseName.vertexToken || baseName.vertexSource || baseName.vertexElement || baseName.vertex;\r\n const fragment = typeof baseName === \"string\" ? baseName : baseName.fragmentToken || baseName.fragmentSource || baseName.fragmentElement || baseName.fragment;\r\n const globalDefines = this._getGlobalDefines()!;\r\n\r\n let fullDefines = defines ?? (attributesNamesOrOptions).defines ?? \"\";\r\n\r\n if (globalDefines) {\r\n fullDefines += globalDefines;\r\n }\r\n\r\n const name = vertex + \"+\" + fragment + \"@\" + fullDefines;\r\n if (this._compiledEffects[name]) {\r\n const compiledEffect = this._compiledEffects[name];\r\n if (onCompiled && compiledEffect.isReady()) {\r\n onCompiled(compiledEffect);\r\n }\r\n\r\n return compiledEffect;\r\n }\r\n const effect = new Effect(\r\n baseName,\r\n attributesNamesOrOptions,\r\n uniformsNamesOrEngine,\r\n samplers,\r\n this,\r\n defines,\r\n fallbacks,\r\n onCompiled,\r\n onError,\r\n indexParameters,\r\n name,\r\n shaderLanguage\r\n );\r\n this._compiledEffects[name] = effect;\r\n\r\n return effect;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected static _ConcatenateShader(source: string, defines: Nullable, shaderVersion: string = \"\"): string {\r\n return shaderVersion + (defines ? defines + \"\\n\" : \"\") + source;\r\n }\r\n\r\n private _compileShader(source: string, type: string, defines: Nullable, shaderVersion: string): WebGLShader {\r\n return this._compileRawShader(ThinEngine._ConcatenateShader(source, defines, shaderVersion), type);\r\n }\r\n\r\n private _compileRawShader(source: string, type: string): WebGLShader {\r\n const gl = this._gl;\r\n\r\n const shader = gl.createShader(type === \"vertex\" ? gl.VERTEX_SHADER : gl.FRAGMENT_SHADER);\r\n\r\n if (!shader) {\r\n let error: GLenum = gl.NO_ERROR;\r\n let tempError: GLenum = gl.NO_ERROR;\r\n while ((tempError = gl.getError()) !== gl.NO_ERROR) {\r\n error = tempError;\r\n }\r\n\r\n throw new Error(\r\n `Something went wrong while creating a gl ${type} shader object. gl error=${error}, gl isContextLost=${gl.isContextLost()}, _contextWasLost=${this._contextWasLost}`\r\n );\r\n }\r\n\r\n gl.shaderSource(shader, source);\r\n gl.compileShader(shader);\r\n\r\n return shader;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getShaderSource(shader: WebGLShader): Nullable {\r\n return this._gl.getShaderSource(shader);\r\n }\r\n\r\n /**\r\n * Directly creates a webGL program\r\n * @param pipelineContext defines the pipeline context to attach to\r\n * @param vertexCode defines the vertex shader code to use\r\n * @param fragmentCode defines the fragment shader code to use\r\n * @param context defines the webGL context to use (if not set, the current one will be used)\r\n * @param transformFeedbackVaryings defines the list of transform feedback varyings to use\r\n * @returns the new webGL program\r\n */\r\n public createRawShaderProgram(\r\n pipelineContext: IPipelineContext,\r\n vertexCode: string,\r\n fragmentCode: string,\r\n context?: WebGLRenderingContext,\r\n transformFeedbackVaryings: Nullable = null\r\n ): WebGLProgram {\r\n context = context || this._gl;\r\n\r\n const vertexShader = this._compileRawShader(vertexCode, \"vertex\");\r\n const fragmentShader = this._compileRawShader(fragmentCode, \"fragment\");\r\n\r\n return this._createShaderProgram(pipelineContext as WebGLPipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings);\r\n }\r\n\r\n /**\r\n * Creates a webGL program\r\n * @param pipelineContext defines the pipeline context to attach to\r\n * @param vertexCode defines the vertex shader code to use\r\n * @param fragmentCode defines the fragment shader code to use\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param context defines the webGL context to use (if not set, the current one will be used)\r\n * @param transformFeedbackVaryings defines the list of transform feedback varyings to use\r\n * @returns the new webGL program\r\n */\r\n public createShaderProgram(\r\n pipelineContext: IPipelineContext,\r\n vertexCode: string,\r\n fragmentCode: string,\r\n defines: Nullable,\r\n context?: WebGLRenderingContext,\r\n transformFeedbackVaryings: Nullable = null\r\n ): WebGLProgram {\r\n context = context || this._gl;\r\n\r\n const shaderVersion = this._webGLVersion > 1 ? \"#version 300 es\\n#define WEBGL2 \\n\" : \"\";\r\n const vertexShader = this._compileShader(vertexCode, \"vertex\", defines, shaderVersion);\r\n const fragmentShader = this._compileShader(fragmentCode, \"fragment\", defines, shaderVersion);\r\n\r\n return this._createShaderProgram(pipelineContext as WebGLPipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings);\r\n }\r\n\r\n /**\r\n * Inline functions in shader code that are marked to be inlined\r\n * @param code code to inline\r\n * @returns inlined code\r\n */\r\n public inlineShaderCode(code: string): string {\r\n // no inlining needed in the WebGL engine\r\n return code;\r\n }\r\n\r\n /**\r\n * Creates a new pipeline context\r\n * @param shaderProcessingContext defines the shader processing context used during the processing if available\r\n * @returns the new pipeline\r\n */\r\n public createPipelineContext(shaderProcessingContext: Nullable): IPipelineContext {\r\n const pipelineContext = new WebGLPipelineContext();\r\n pipelineContext.engine = this;\r\n\r\n if (this._caps.parallelShaderCompile) {\r\n pipelineContext.isParallelCompiled = true;\r\n }\r\n\r\n return pipelineContext;\r\n }\r\n\r\n /**\r\n * Creates a new material context\r\n * @returns the new context\r\n */\r\n public createMaterialContext(): IMaterialContext | undefined {\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Creates a new draw context\r\n * @returns the new context\r\n */\r\n public createDrawContext(): IDrawContext | undefined {\r\n return undefined;\r\n }\r\n\r\n protected _createShaderProgram(\r\n pipelineContext: WebGLPipelineContext,\r\n vertexShader: WebGLShader,\r\n fragmentShader: WebGLShader,\r\n context: WebGLRenderingContext,\r\n transformFeedbackVaryings: Nullable = null\r\n ): WebGLProgram {\r\n const shaderProgram = context.createProgram();\r\n pipelineContext.program = shaderProgram;\r\n\r\n if (!shaderProgram) {\r\n throw new Error(\"Unable to create program\");\r\n }\r\n\r\n context.attachShader(shaderProgram, vertexShader);\r\n context.attachShader(shaderProgram, fragmentShader);\r\n\r\n context.linkProgram(shaderProgram);\r\n\r\n pipelineContext.context = context;\r\n pipelineContext.vertexShader = vertexShader;\r\n pipelineContext.fragmentShader = fragmentShader;\r\n\r\n if (!pipelineContext.isParallelCompiled) {\r\n this._finalizePipelineContext(pipelineContext);\r\n }\r\n\r\n return shaderProgram;\r\n }\r\n\r\n protected _finalizePipelineContext(pipelineContext: WebGLPipelineContext) {\r\n const context = pipelineContext.context!;\r\n const vertexShader = pipelineContext.vertexShader!;\r\n const fragmentShader = pipelineContext.fragmentShader!;\r\n const program = pipelineContext.program!;\r\n\r\n const linked = context.getProgramParameter(program, context.LINK_STATUS);\r\n if (!linked) {\r\n // Get more info\r\n // Vertex\r\n if (!this._gl.getShaderParameter(vertexShader, this._gl.COMPILE_STATUS)) {\r\n const log = this._gl.getShaderInfoLog(vertexShader);\r\n if (log) {\r\n pipelineContext.vertexCompilationError = log;\r\n throw new Error(\"VERTEX SHADER \" + log);\r\n }\r\n }\r\n\r\n // Fragment\r\n if (!this._gl.getShaderParameter(fragmentShader, this._gl.COMPILE_STATUS)) {\r\n const log = this._gl.getShaderInfoLog(fragmentShader);\r\n if (log) {\r\n pipelineContext.fragmentCompilationError = log;\r\n throw new Error(\"FRAGMENT SHADER \" + log);\r\n }\r\n }\r\n\r\n const error = context.getProgramInfoLog(program);\r\n if (error) {\r\n pipelineContext.programLinkError = error;\r\n throw new Error(error);\r\n }\r\n }\r\n\r\n if (this.validateShaderPrograms) {\r\n context.validateProgram(program);\r\n const validated = context.getProgramParameter(program, context.VALIDATE_STATUS);\r\n\r\n if (!validated) {\r\n const error = context.getProgramInfoLog(program);\r\n if (error) {\r\n pipelineContext.programValidationError = error;\r\n throw new Error(error);\r\n }\r\n }\r\n }\r\n\r\n context.deleteShader(vertexShader);\r\n context.deleteShader(fragmentShader);\r\n\r\n pipelineContext.vertexShader = undefined;\r\n pipelineContext.fragmentShader = undefined;\r\n\r\n if (pipelineContext.onCompiled) {\r\n pipelineContext.onCompiled();\r\n pipelineContext.onCompiled = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _preparePipelineContext(\r\n pipelineContext: IPipelineContext,\r\n vertexSourceCode: string,\r\n fragmentSourceCode: string,\r\n createAsRaw: boolean,\r\n rawVertexSourceCode: string,\r\n rawFragmentSourceCode: string,\r\n rebuildRebind: any,\r\n defines: Nullable,\r\n transformFeedbackVaryings: Nullable,\r\n key: string\r\n ) {\r\n const webGLRenderingState = pipelineContext as WebGLPipelineContext;\r\n\r\n if (createAsRaw) {\r\n webGLRenderingState.program = this.createRawShaderProgram(webGLRenderingState, vertexSourceCode, fragmentSourceCode, undefined, transformFeedbackVaryings);\r\n } else {\r\n webGLRenderingState.program = this.createShaderProgram(webGLRenderingState, vertexSourceCode, fragmentSourceCode, defines, undefined, transformFeedbackVaryings);\r\n }\r\n webGLRenderingState.program.__SPECTOR_rebuildProgram = rebuildRebind;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _isRenderingStateCompiled(pipelineContext: IPipelineContext): boolean {\r\n const webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n if (this._isDisposed || webGLPipelineContext._isDisposed) {\r\n return false;\r\n }\r\n if (this._gl.getProgramParameter(webGLPipelineContext.program!, this._caps.parallelShaderCompile!.COMPLETION_STATUS_KHR)) {\r\n this._finalizePipelineContext(webGLPipelineContext);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _executeWhenRenderingStateIsCompiled(pipelineContext: IPipelineContext, action: () => void) {\r\n const webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n\r\n if (!webGLPipelineContext.isParallelCompiled) {\r\n action();\r\n return;\r\n }\r\n\r\n const oldHandler = webGLPipelineContext.onCompiled;\r\n\r\n if (oldHandler) {\r\n webGLPipelineContext.onCompiled = () => {\r\n oldHandler!();\r\n action();\r\n };\r\n } else {\r\n webGLPipelineContext.onCompiled = action;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the list of webGL uniform locations associated with a specific program based on a list of uniform names\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param uniformsNames defines the list of uniform names\r\n * @returns an array of webGL uniform locations\r\n */\r\n public getUniforms(pipelineContext: IPipelineContext, uniformsNames: string[]): Nullable[] {\r\n const results = new Array>();\r\n const webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n\r\n for (let index = 0; index < uniformsNames.length; index++) {\r\n results.push(this._gl.getUniformLocation(webGLPipelineContext.program!, uniformsNames[index]));\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Gets the list of active attributes for a given webGL program\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param attributesNames defines the list of attribute names to get\r\n * @returns an array of indices indicating the offset of each attribute\r\n */\r\n public getAttributes(pipelineContext: IPipelineContext, attributesNames: string[]): number[] {\r\n const results = [];\r\n const webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n\r\n for (let index = 0; index < attributesNames.length; index++) {\r\n try {\r\n results.push(this._gl.getAttribLocation(webGLPipelineContext.program!, attributesNames[index]));\r\n } catch (e) {\r\n results.push(-1);\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Activates an effect, making it the current one (ie. the one used for rendering)\r\n * @param effect defines the effect to activate\r\n */\r\n public enableEffect(effect: Nullable): void {\r\n effect = effect !== null && DrawWrapper.IsWrapper(effect) ? effect.effect : effect; // get only the effect, we don't need a Wrapper in the WebGL engine\r\n\r\n if (!effect || effect === this._currentEffect) {\r\n return;\r\n }\r\n\r\n this._stencilStateComposer.stencilMaterial = undefined;\r\n\r\n effect = effect as Effect;\r\n\r\n // Use program\r\n this.bindSamplers(effect);\r\n\r\n this._currentEffect = effect;\r\n\r\n if (effect.onBind) {\r\n effect.onBind(effect);\r\n }\r\n if (effect._onBindObservable) {\r\n effect._onBindObservable.notifyObservers(effect);\r\n }\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a number (int)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param value defines the int number to store\r\n * @returns true if the value was set\r\n */\r\n public setInt(uniform: Nullable, value: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1i(uniform, value);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a int2\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setInt2(uniform: Nullable, x: number, y: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2i(uniform, x, y);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a int3\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setInt3(uniform: Nullable, x: number, y: number, z: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3i(uniform, x, y, z);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a int4\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @param w defines the 4th component of the value\r\n * @returns true if the value was set\r\n */\r\n public setInt4(uniform: Nullable, x: number, y: number, z: number, w: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4i(uniform, x, y, z, w);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray(uniform: Nullable, array: Int32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1iv(uniform, array);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32 (stored as vec2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray2(uniform: Nullable, array: Int32Array): boolean {\r\n if (!uniform || array.length % 2 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2iv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32 (stored as vec3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray3(uniform: Nullable, array: Int32Array): boolean {\r\n if (!uniform || array.length % 3 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3iv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32 (stored as vec4)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray4(uniform: Nullable, array: Int32Array): boolean {\r\n if (!uniform || array.length % 4 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4iv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a number (unsigned int)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param value defines the unsigned int number to store\r\n * @returns true if the value was set\r\n */\r\n public setUInt(uniform: Nullable, value: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1ui(uniform, value);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a unsigned int2\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setUInt2(uniform: Nullable, x: number, y: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2ui(uniform, x, y);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a unsigned int3\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setUInt3(uniform: Nullable, x: number, y: number, z: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3ui(uniform, x, y, z);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a unsigned int4\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @param w defines the 4th component of the value\r\n * @returns true if the value was set\r\n */\r\n public setUInt4(uniform: Nullable, x: number, y: number, z: number, w: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4ui(uniform, x, y, z, w);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of unsigned int32\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of unsigned int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setUIntArray(uniform: Nullable, array: Uint32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1uiv(uniform, array);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of unsigned int32 (stored as vec2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of unsigned int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setUIntArray2(uniform: Nullable, array: Uint32Array): boolean {\r\n if (!uniform || array.length % 2 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2uiv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of unsigned int32 (stored as vec3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of unsigned int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setUIntArray3(uniform: Nullable, array: Uint32Array): boolean {\r\n if (!uniform || array.length % 3 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3uiv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of unsigned int32 (stored as vec4)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of unsigned int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setUIntArray4(uniform: Nullable, array: Uint32Array): boolean {\r\n if (!uniform || array.length % 4 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4uiv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray(uniform: Nullable, array: number[] | Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n if (array.length < 1) {\r\n return false;\r\n }\r\n this._gl.uniform1fv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number (stored as vec2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray2(uniform: Nullable, array: number[] | Float32Array): boolean {\r\n if (!uniform || array.length % 2 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2fv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number (stored as vec3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray3(uniform: Nullable, array: number[] | Float32Array): boolean {\r\n if (!uniform || array.length % 3 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3fv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number (stored as vec4)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray4(uniform: Nullable, array: number[] | Float32Array): boolean {\r\n if (!uniform || array.length % 4 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4fv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of float32 (stored as matrices)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param matrices defines the array of float32 to store\r\n * @returns true if the value was set\r\n */\r\n public setMatrices(uniform: Nullable, matrices: DeepImmutable): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniformMatrix4fv(uniform, false, matrices);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a matrix (3x3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param matrix defines the Float32Array representing the 3x3 matrix to store\r\n * @returns true if the value was set\r\n */\r\n public setMatrix3x3(uniform: Nullable, matrix: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniformMatrix3fv(uniform, false, matrix);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a matrix (2x2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param matrix defines the Float32Array representing the 2x2 matrix to store\r\n * @returns true if the value was set\r\n */\r\n public setMatrix2x2(uniform: Nullable, matrix: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniformMatrix2fv(uniform, false, matrix);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a number (float)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param value defines the float number to store\r\n * @returns true if the value was transferred\r\n */\r\n public setFloat(uniform: Nullable, value: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1f(uniform, value);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a vec2\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setFloat2(uniform: Nullable, x: number, y: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2f(uniform, x, y);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a vec3\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setFloat3(uniform: Nullable, x: number, y: number, z: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3f(uniform, x, y, z);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a vec4\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @param w defines the 4th component of the value\r\n * @returns true if the value was set\r\n */\r\n public setFloat4(uniform: Nullable, x: number, y: number, z: number, w: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4f(uniform, x, y, z, w);\r\n\r\n return true;\r\n }\r\n\r\n // States\r\n\r\n /**\r\n * Apply all cached states (depth, culling, stencil and alpha)\r\n */\r\n public applyStates() {\r\n this._depthCullingState.apply(this._gl);\r\n this._stencilStateComposer.apply(this._gl);\r\n this._alphaState.apply(this._gl);\r\n\r\n if (this._colorWriteChanged) {\r\n this._colorWriteChanged = false;\r\n const enable = this._colorWrite;\r\n this._gl.colorMask(enable, enable, enable, enable);\r\n }\r\n }\r\n\r\n /**\r\n * Enable or disable color writing\r\n * @param enable defines the state to set\r\n */\r\n public setColorWrite(enable: boolean): void {\r\n if (enable !== this._colorWrite) {\r\n this._colorWriteChanged = true;\r\n this._colorWrite = enable;\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if color writing is enabled\r\n * @returns the current color writing state\r\n */\r\n public getColorWrite(): boolean {\r\n return this._colorWrite;\r\n }\r\n\r\n /**\r\n * Gets the depth culling state manager\r\n */\r\n public get depthCullingState(): DepthCullingState {\r\n return this._depthCullingState;\r\n }\r\n\r\n /**\r\n * Gets the alpha state manager\r\n */\r\n public get alphaState(): AlphaState {\r\n return this._alphaState;\r\n }\r\n\r\n /**\r\n * Gets the stencil state manager\r\n */\r\n public get stencilState(): StencilState {\r\n return this._stencilState;\r\n }\r\n\r\n /**\r\n * Gets the stencil state composer\r\n */\r\n public get stencilStateComposer(): StencilStateComposer {\r\n return this._stencilStateComposer;\r\n }\r\n\r\n // Textures\r\n\r\n /**\r\n * Clears the list of texture accessible through engine.\r\n * This can help preventing texture load conflict due to name collision.\r\n */\r\n public clearInternalTexturesCache() {\r\n this._internalTexturesCache.length = 0;\r\n }\r\n\r\n /**\r\n * Force the entire cache to be cleared\r\n * You should not have to use this function unless your engine needs to share the webGL context with another engine\r\n * @param bruteForce defines a boolean to force clearing ALL caches (including stencil, detoh and alpha states)\r\n */\r\n public wipeCaches(bruteForce?: boolean): void {\r\n if (this.preventCacheWipeBetweenFrames && !bruteForce) {\r\n return;\r\n }\r\n this._currentEffect = null;\r\n this._viewportCached.x = 0;\r\n this._viewportCached.y = 0;\r\n this._viewportCached.z = 0;\r\n this._viewportCached.w = 0;\r\n\r\n // Done before in case we clean the attributes\r\n this._unbindVertexArrayObject();\r\n\r\n if (bruteForce) {\r\n this._currentProgram = null;\r\n this.resetTextureCache();\r\n\r\n this._stencilStateComposer.reset();\r\n\r\n this._depthCullingState.reset();\r\n this._depthCullingState.depthFunc = this._gl.LEQUAL;\r\n\r\n this._alphaState.reset();\r\n this._alphaMode = Constants.ALPHA_ADD;\r\n this._alphaEquation = Constants.ALPHA_DISABLE;\r\n\r\n this._colorWrite = true;\r\n this._colorWriteChanged = true;\r\n\r\n this._unpackFlipYCached = null;\r\n\r\n this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE);\r\n this._gl.pixelStorei(this._gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0);\r\n\r\n this._mustWipeVertexAttributes = true;\r\n this.unbindAllAttributes();\r\n }\r\n\r\n this._resetVertexBufferBinding();\r\n this._cachedIndexBuffer = null;\r\n this._cachedEffectForVertexBuffers = null;\r\n this.bindIndexBuffer(null);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getSamplingParameters(samplingMode: number, generateMipMaps: boolean): { min: number; mag: number } {\r\n const gl = this._gl;\r\n let magFilter: GLenum = gl.NEAREST;\r\n let minFilter: GLenum = gl.NEAREST;\r\n\r\n switch (samplingMode) {\r\n case Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case Constants.TEXTURE_NEAREST_NEAREST_MIPLINEAR:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case Constants.TEXTURE_NEAREST_LINEAR_MIPNEAREST:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case Constants.TEXTURE_NEAREST_LINEAR_MIPLINEAR:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case Constants.TEXTURE_NEAREST_LINEAR:\r\n magFilter = gl.NEAREST;\r\n minFilter = gl.LINEAR;\r\n break;\r\n case Constants.TEXTURE_NEAREST_NEAREST:\r\n magFilter = gl.NEAREST;\r\n minFilter = gl.NEAREST;\r\n break;\r\n case Constants.TEXTURE_LINEAR_NEAREST_MIPNEAREST:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case Constants.TEXTURE_LINEAR_NEAREST_MIPLINEAR:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case Constants.TEXTURE_LINEAR_LINEAR:\r\n magFilter = gl.LINEAR;\r\n minFilter = gl.LINEAR;\r\n break;\r\n case Constants.TEXTURE_LINEAR_NEAREST:\r\n magFilter = gl.LINEAR;\r\n minFilter = gl.NEAREST;\r\n break;\r\n }\r\n\r\n return {\r\n min: minFilter,\r\n mag: magFilter,\r\n };\r\n }\r\n\r\n /** @internal */\r\n protected _createTexture(): WebGLTexture {\r\n const texture = this._gl.createTexture();\r\n\r\n if (!texture) {\r\n throw new Error(\"Unable to create texture\");\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n /** @internal */\r\n public _createHardwareTexture(): HardwareTextureWrapper {\r\n return new WebGLHardwareTexture(this._createTexture(), this._gl);\r\n }\r\n\r\n /**\r\n * Creates an internal texture without binding it to a framebuffer\r\n * @internal\r\n * @param size defines the size of the texture\r\n * @param options defines the options used to create the texture\r\n * @param delayGPUTextureCreation true to delay the texture creation the first time it is really needed. false to create it right away\r\n * @param source source type of the texture\r\n * @returns a new internal texture\r\n */\r\n public _createInternalTexture(\r\n size: TextureSize,\r\n options: boolean | InternalTextureCreationOptions,\r\n delayGPUTextureCreation = true,\r\n source = InternalTextureSource.Unknown\r\n ): InternalTexture {\r\n let generateMipMaps = false;\r\n let type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n let samplingMode = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n let format = Constants.TEXTUREFORMAT_RGBA;\r\n let useSRGBBuffer = false;\r\n let samples = 1;\r\n let label: string | undefined;\r\n if (options !== undefined && typeof options === \"object\") {\r\n generateMipMaps = !!options.generateMipMaps;\r\n type = options.type === undefined ? Constants.TEXTURETYPE_UNSIGNED_INT : options.type;\r\n samplingMode = options.samplingMode === undefined ? Constants.TEXTURE_TRILINEAR_SAMPLINGMODE : options.samplingMode;\r\n format = options.format === undefined ? Constants.TEXTUREFORMAT_RGBA : options.format;\r\n useSRGBBuffer = options.useSRGBBuffer === undefined ? false : options.useSRGBBuffer;\r\n samples = options.samples ?? 1;\r\n label = options.label;\r\n } else {\r\n generateMipMaps = !!options;\r\n }\r\n\r\n useSRGBBuffer &&= this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU);\r\n\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloatLinearFiltering) {\r\n // if floating point linear (gl.FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n } else if (type === Constants.TEXTURETYPE_HALF_FLOAT && !this._caps.textureHalfFloatLinearFiltering) {\r\n // if floating point linear (HALF_FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n }\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloat) {\r\n type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n Logger.Warn(\"Float textures are not supported. Type forced to TEXTURETYPE_UNSIGNED_BYTE\");\r\n }\r\n\r\n const gl = this._gl;\r\n const texture = new InternalTexture(this, source);\r\n const width = (<{ width: number; height: number; depth?: number; layers?: number }>size).width || size;\r\n const height = (<{ width: number; height: number; depth?: number; layers?: number }>size).height || size;\r\n const depth = (<{ width: number; height: number; depth?: number; layers?: number }>size).depth || 0;\r\n const layers = (<{ width: number; height: number; depth?: number; layers?: number }>size).layers || 0;\r\n const filters = this._getSamplingParameters(samplingMode, generateMipMaps);\r\n const target = layers !== 0 ? gl.TEXTURE_2D_ARRAY : depth !== 0 ? gl.TEXTURE_3D : gl.TEXTURE_2D;\r\n const sizedFormat = this._getRGBABufferInternalSizedFormat(type, format, useSRGBBuffer);\r\n const internalFormat = this._getInternalFormat(format);\r\n const textureType = this._getWebGLTextureType(type);\r\n\r\n // Bind\r\n this._bindTextureDirectly(target, texture);\r\n\r\n if (layers !== 0) {\r\n texture.is2DArray = true;\r\n gl.texImage3D(target, 0, sizedFormat, width, height, layers, 0, internalFormat, textureType, null);\r\n } else if (depth !== 0) {\r\n texture.is3D = true;\r\n gl.texImage3D(target, 0, sizedFormat, width, height, depth, 0, internalFormat, textureType, null);\r\n } else {\r\n gl.texImage2D(target, 0, sizedFormat, width, height, 0, internalFormat, textureType, null);\r\n }\r\n\r\n gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, filters.mag);\r\n gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, filters.min);\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n\r\n // MipMaps\r\n if (generateMipMaps) {\r\n this._gl.generateMipmap(target);\r\n }\r\n\r\n this._bindTextureDirectly(target, null);\r\n\r\n texture._useSRGBBuffer = useSRGBBuffer;\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.depth = layers;\r\n texture.isReady = true;\r\n texture.samples = samples;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.type = type;\r\n texture.format = format;\r\n texture.label = label;\r\n\r\n this._internalTexturesCache.push(texture);\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getUseSRGBBuffer(useSRGBBuffer: boolean, noMipmap: boolean): boolean {\r\n // Generating mipmaps for sRGB textures is not supported in WebGL1 so we must disable the support if mipmaps is enabled\r\n return useSRGBBuffer && this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU || noMipmap);\r\n }\r\n\r\n protected _createTextureBase(\r\n url: Nullable,\r\n noMipmap: boolean,\r\n invertY: boolean,\r\n scene: Nullable,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<(texture: InternalTexture) => void> = null,\r\n onError: Nullable<(message: string, exception: any) => void> = null,\r\n prepareTexture: (\r\n texture: InternalTexture,\r\n extension: string,\r\n scene: Nullable,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n invertY: boolean,\r\n noMipmap: boolean,\r\n isCompressed: boolean,\r\n processFunction: (\r\n width: number,\r\n height: number,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n extension: string,\r\n texture: InternalTexture,\r\n continuationCallback: () => void\r\n ) => boolean,\r\n samplingMode: number\r\n ) => void,\r\n prepareTextureProcessFunction: (\r\n width: number,\r\n height: number,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n extension: string,\r\n texture: InternalTexture,\r\n continuationCallback: () => void\r\n ) => boolean,\r\n buffer: Nullable = null,\r\n fallback: Nullable = null,\r\n format: Nullable = null,\r\n forcedExtension: Nullable = null,\r\n mimeType?: string,\r\n loaderOptions?: any,\r\n useSRGBBuffer?: boolean\r\n ): InternalTexture {\r\n url = url || \"\";\r\n const fromData = url.substr(0, 5) === \"data:\";\r\n const fromBlob = url.substr(0, 5) === \"blob:\";\r\n const isBase64 = fromData && url.indexOf(\";base64,\") !== -1;\r\n\r\n const texture = fallback ? fallback : new InternalTexture(this, InternalTextureSource.Url);\r\n\r\n if (texture !== fallback) {\r\n texture.label = url.substring(0, 60); // default label, can be overriden by the caller\r\n }\r\n\r\n const originalUrl = url;\r\n if (this._transformTextureUrl && !isBase64 && !fallback && !buffer) {\r\n url = this._transformTextureUrl(url);\r\n }\r\n\r\n if (originalUrl !== url) {\r\n texture._originalUrl = originalUrl;\r\n }\r\n\r\n // establish the file extension, if possible\r\n const lastDot = url.lastIndexOf(\".\");\r\n let extension = forcedExtension ? forcedExtension : lastDot > -1 ? url.substring(lastDot).toLowerCase() : \"\";\r\n let loader: Nullable = null;\r\n\r\n // Remove query string\r\n const queryStringIndex = extension.indexOf(\"?\");\r\n\r\n if (queryStringIndex > -1) {\r\n extension = extension.split(\"?\")[0];\r\n }\r\n\r\n for (const availableLoader of ThinEngine._TextureLoaders) {\r\n if (availableLoader.canLoad(extension, mimeType)) {\r\n loader = availableLoader;\r\n break;\r\n }\r\n }\r\n\r\n if (scene) {\r\n scene.addPendingData(texture);\r\n }\r\n texture.url = url;\r\n texture.generateMipMaps = !noMipmap;\r\n texture.samplingMode = samplingMode;\r\n texture.invertY = invertY;\r\n texture._useSRGBBuffer = this._getUseSRGBBuffer(!!useSRGBBuffer, noMipmap);\r\n\r\n if (!this._doNotHandleContextLost) {\r\n // Keep a link to the buffer only if we plan to handle context lost\r\n texture._buffer = buffer;\r\n }\r\n\r\n let onLoadObserver: Nullable> = null;\r\n if (onLoad && !fallback) {\r\n onLoadObserver = texture.onLoadedObservable.add(onLoad);\r\n }\r\n\r\n if (!fallback) {\r\n this._internalTexturesCache.push(texture);\r\n }\r\n\r\n const onInternalError = (message?: string, exception?: any) => {\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n if (url === originalUrl) {\r\n if (onLoadObserver) {\r\n texture.onLoadedObservable.remove(onLoadObserver);\r\n }\r\n\r\n if (EngineStore.UseFallbackTexture && url !== EngineStore.FallbackTexture) {\r\n this._createTextureBase(\r\n EngineStore.FallbackTexture,\r\n noMipmap,\r\n texture.invertY,\r\n scene,\r\n samplingMode,\r\n null,\r\n onError,\r\n prepareTexture,\r\n prepareTextureProcessFunction,\r\n buffer,\r\n texture\r\n );\r\n }\r\n\r\n message = (message || \"Unknown error\") + (EngineStore.UseFallbackTexture ? \" - Fallback texture was used\" : \"\");\r\n texture.onErrorObservable.notifyObservers({ message, exception });\r\n if (onError) {\r\n onError(message, exception);\r\n }\r\n } else {\r\n // fall back to the original url if the transformed url fails to load\r\n Logger.Warn(`Failed to load ${url}, falling back to ${originalUrl}`);\r\n this._createTextureBase(\r\n originalUrl,\r\n noMipmap,\r\n texture.invertY,\r\n scene,\r\n samplingMode,\r\n onLoad,\r\n onError,\r\n prepareTexture,\r\n prepareTextureProcessFunction,\r\n buffer,\r\n texture,\r\n format,\r\n forcedExtension,\r\n mimeType,\r\n loaderOptions,\r\n useSRGBBuffer\r\n );\r\n }\r\n };\r\n\r\n // processing for non-image formats\r\n if (loader) {\r\n const callback = (data: ArrayBufferView) => {\r\n loader!.loadData(\r\n data,\r\n texture,\r\n (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void, loadFailed) => {\r\n if (loadFailed) {\r\n onInternalError(\"TextureLoader failed to load data\");\r\n } else {\r\n prepareTexture(\r\n texture,\r\n extension,\r\n scene,\r\n { width, height },\r\n texture.invertY,\r\n !loadMipmap,\r\n isCompressed,\r\n () => {\r\n done();\r\n return false;\r\n },\r\n samplingMode\r\n );\r\n }\r\n },\r\n loaderOptions\r\n );\r\n };\r\n\r\n if (!buffer) {\r\n this._loadFile(\r\n url,\r\n (data) => callback(new Uint8Array(data as ArrayBuffer)),\r\n undefined,\r\n scene ? scene.offlineProvider : undefined,\r\n true,\r\n (request?: IWebRequest, exception?: any) => {\r\n onInternalError(\"Unable to load \" + (request ? request.responseURL : url, exception));\r\n }\r\n );\r\n } else {\r\n if (buffer instanceof ArrayBuffer) {\r\n callback(new Uint8Array(buffer));\r\n } else if (ArrayBuffer.isView(buffer)) {\r\n callback(buffer);\r\n } else {\r\n if (onError) {\r\n onError(\"Unable to load: only ArrayBuffer or ArrayBufferView is supported\", null);\r\n }\r\n }\r\n }\r\n } else {\r\n const onload = (img: HTMLImageElement | ImageBitmap) => {\r\n if (fromBlob && !this._doNotHandleContextLost) {\r\n // We need to store the image if we need to rebuild the texture\r\n // in case of a webgl context lost\r\n texture._buffer = img;\r\n }\r\n\r\n prepareTexture(texture, extension, scene, img, texture.invertY, noMipmap, false, prepareTextureProcessFunction, samplingMode);\r\n };\r\n // According to the WebGL spec section 6.10, ImageBitmaps must be inverted on creation.\r\n // So, we pass imageOrientation to _FileToolsLoadImage() as it may create an ImageBitmap.\r\n\r\n if (!fromData || isBase64) {\r\n if (buffer && (typeof (buffer).decoding === \"string\" || (buffer).close)) {\r\n onload(buffer);\r\n } else {\r\n ThinEngine._FileToolsLoadImage(\r\n url,\r\n onload,\r\n onInternalError,\r\n scene ? scene.offlineProvider : null,\r\n mimeType,\r\n texture.invertY && this._features.needsInvertingBitmap ? { imageOrientation: \"flipY\" } : undefined\r\n );\r\n }\r\n } else if (typeof buffer === \"string\" || buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer) || buffer instanceof Blob) {\r\n ThinEngine._FileToolsLoadImage(\r\n buffer,\r\n onload,\r\n onInternalError,\r\n scene ? scene.offlineProvider : null,\r\n mimeType,\r\n texture.invertY && this._features.needsInvertingBitmap ? { imageOrientation: \"flipY\" } : undefined\r\n );\r\n } else if (buffer) {\r\n onload(buffer);\r\n }\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * Usually called from Texture.ts.\r\n * Passed information to create a WebGLTexture\r\n * @param url defines a value which contains one of the following:\r\n * * A conventional http URL, e.g. 'http://...' or 'file://...'\r\n * * A base64 string of in-line texture data, e.g. 'data:image/jpg;base64,/...'\r\n * * An indicator that data being passed using the buffer parameter, e.g. 'data:mytexture.jpg'\r\n * @param noMipmap defines a boolean indicating that no mipmaps shall be generated. Ignored for compressed textures. They must be in the file\r\n * @param invertY when true, image is flipped when loaded. You probably want true. Certain compressed textures may invert this if their default is inverted (eg. ktx)\r\n * @param scene needed for loading to the correct scene\r\n * @param samplingMode mode with should be used sample / access the texture (Default: Texture.TRILINEAR_SAMPLINGMODE)\r\n * @param onLoad optional callback to be called upon successful completion\r\n * @param onError optional callback to be called upon failure\r\n * @param buffer a source of a file previously fetched as either a base64 string, an ArrayBuffer (compressed or image format), HTMLImageElement (image format), or a Blob\r\n * @param fallback an internal argument in case the function must be called again, due to etc1 not having alpha capabilities\r\n * @param format internal format. Default: RGB when extension is '.jpg' else RGBA. Ignored for compressed textures\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @param mimeType defines an optional mime type\r\n * @param loaderOptions options to be passed to the loader\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\r\n * @returns a InternalTexture for assignment back into BABYLON.Texture\r\n */\r\n public createTexture(\r\n url: Nullable,\r\n noMipmap: boolean,\r\n invertY: boolean,\r\n scene: Nullable,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<(texture: InternalTexture) => void> = null,\r\n onError: Nullable<(message: string, exception: any) => void> = null,\r\n buffer: Nullable = null,\r\n fallback: Nullable = null,\r\n format: Nullable = null,\r\n forcedExtension: Nullable = null,\r\n mimeType?: string,\r\n loaderOptions?: any,\r\n creationFlags?: number,\r\n useSRGBBuffer?: boolean\r\n ): InternalTexture {\r\n return this._createTextureBase(\r\n url,\r\n noMipmap,\r\n invertY,\r\n scene,\r\n samplingMode,\r\n onLoad,\r\n onError,\r\n this._prepareWebGLTexture.bind(this),\r\n (potWidth, potHeight, img, extension, texture, continuationCallback) => {\r\n const gl = this._gl;\r\n const isPot = img.width === potWidth && img.height === potHeight;\r\n\r\n texture._creationFlags = creationFlags ?? 0;\r\n\r\n const tip = this._getTexImageParametersForCreateTexture(format, extension, texture._useSRGBBuffer);\r\n if (isPot) {\r\n gl.texImage2D(gl.TEXTURE_2D, 0, tip.internalFormat, tip.format, tip.type, img as any);\r\n return false;\r\n }\r\n\r\n const maxTextureSize = this._caps.maxTextureSize;\r\n\r\n if (img.width > maxTextureSize || img.height > maxTextureSize || !this._supportsHardwareTextureRescaling) {\r\n this._prepareWorkingCanvas();\r\n if (!this._workingCanvas || !this._workingContext) {\r\n return false;\r\n }\r\n\r\n this._workingCanvas.width = potWidth;\r\n this._workingCanvas.height = potHeight;\r\n\r\n this._workingContext.drawImage(img as any, 0, 0, img.width, img.height, 0, 0, potWidth, potHeight);\r\n gl.texImage2D(gl.TEXTURE_2D, 0, tip.internalFormat, tip.format, tip.type, this._workingCanvas as TexImageSource);\r\n\r\n texture.width = potWidth;\r\n texture.height = potHeight;\r\n\r\n return false;\r\n } else {\r\n // Using shaders when possible to rescale because canvas.drawImage is lossy\r\n const source = new InternalTexture(this, InternalTextureSource.Temp);\r\n this._bindTextureDirectly(gl.TEXTURE_2D, source, true);\r\n gl.texImage2D(gl.TEXTURE_2D, 0, tip.internalFormat, tip.format, tip.type, img as any);\r\n\r\n this._rescaleTexture(source, texture, scene, tip.format, () => {\r\n this._releaseTexture(source);\r\n this._bindTextureDirectly(gl.TEXTURE_2D, texture, true);\r\n\r\n continuationCallback();\r\n });\r\n }\r\n\r\n return true;\r\n },\r\n buffer,\r\n fallback,\r\n format,\r\n forcedExtension,\r\n mimeType,\r\n loaderOptions,\r\n useSRGBBuffer\r\n );\r\n }\r\n\r\n /**\r\n * Calls to the GL texImage2D and texImage3D functions require three arguments describing the pixel format of the texture.\r\n * createTexture derives these from the babylonFormat and useSRGBBuffer arguments and also the file extension of the URL it's working with.\r\n * This function encapsulates that derivation for easy unit testing.\r\n * @param babylonFormat Babylon's format enum, as specified in ITextureCreationOptions.\r\n * @param fileExtension The file extension including the dot, e.g. .jpg.\r\n * @param useSRGBBuffer Use SRGB not linear.\r\n * @returns The options to pass to texImage2D or texImage3D calls.\r\n * @internal\r\n */\r\n public _getTexImageParametersForCreateTexture(babylonFormat: Nullable, fileExtension: string, useSRGBBuffer: boolean): TexImageParameters {\r\n if (babylonFormat === undefined || babylonFormat === null) {\r\n babylonFormat = fileExtension === \".jpg\" && !useSRGBBuffer ? Constants.TEXTUREFORMAT_RGB : Constants.TEXTUREFORMAT_RGBA;\r\n }\r\n\r\n let format: number, internalFormat: number;\r\n if (this.webGLVersion === 1) {\r\n // In WebGL 1, format and internalFormat must be the same and taken from a limited set of values, see https://docs.gl/es2/glTexImage2D.\r\n // The SRGB extension (https://developer.mozilla.org/en-US/docs/Web/API/EXT_sRGB) adds some extra values, hence passing useSRGBBuffer\r\n // to getInternalFormat.\r\n format = this._getInternalFormat(babylonFormat, useSRGBBuffer);\r\n internalFormat = format;\r\n } else {\r\n // In WebGL 2, format has a wider range of values and internal format can be one of the sized formats, see\r\n // https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml.\r\n // SRGB is included in the sized format and should not be passed in \"format\", hence always passing useSRGBBuffer as false.\r\n format = this._getInternalFormat(babylonFormat, false);\r\n internalFormat = this._getRGBABufferInternalSizedFormat(Constants.TEXTURETYPE_UNSIGNED_BYTE, babylonFormat, useSRGBBuffer);\r\n }\r\n\r\n return {\r\n internalFormat,\r\n format,\r\n type: this._gl.UNSIGNED_BYTE,\r\n };\r\n }\r\n\r\n /**\r\n * Loads an image as an HTMLImageElement.\r\n * @param input url string, ArrayBuffer, or Blob to load\r\n * @param onLoad callback called when the image successfully loads\r\n * @param onError callback called when the image fails to load\r\n * @param offlineProvider offline provider for caching\r\n * @param mimeType optional mime type\r\n * @param imageBitmapOptions optional the options to use when creating an ImageBitmap\r\n * @returns the HTMLImageElement of the loaded image\r\n * @internal\r\n */\r\n public static _FileToolsLoadImage(\r\n input: string | ArrayBuffer | ArrayBufferView | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string, exception?: any) => void,\r\n offlineProvider: Nullable,\r\n mimeType?: string,\r\n imageBitmapOptions?: ImageBitmapOptions\r\n ): Nullable {\r\n throw _WarnImport(\"FileTools\");\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _rescaleTexture(source: InternalTexture, destination: InternalTexture, scene: Nullable, internalFormat: number, onComplete: () => void): void {}\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a raw texture\r\n * @param data defines the data to store in the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param format defines the format of the data\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default)\r\n * @param compression defines the compression used (null by default)\r\n * @param type defines the type fo the data (Engine.TEXTURETYPE_UNSIGNED_INT by default)\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\r\n * @returns the raw texture inside an InternalTexture\r\n */\r\n public createRawTexture(\r\n data: Nullable,\r\n width: number,\r\n height: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable = null,\r\n type: number = Constants.TEXTURETYPE_UNSIGNED_INT,\r\n creationFlags = 0,\r\n useSRGBBuffer: boolean = false\r\n ): InternalTexture {\r\n throw _WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a new raw cube texture\r\n * @param data defines the array of data to use to create each face\r\n * @param size defines the size of the textures\r\n * @param format defines the format of the data\r\n * @param type defines the type of the data (like Engine.TEXTURETYPE_UNSIGNED_INT)\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compression used (null by default)\r\n * @returns the cube texture as an InternalTexture\r\n */\r\n public createRawCubeTexture(\r\n data: Nullable,\r\n size: number,\r\n format: number,\r\n type: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable = null\r\n ): InternalTexture {\r\n throw _WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a new raw 3D texture\r\n * @param data defines the data used to create the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param depth defines the depth of the texture\r\n * @param format defines the format of the texture\r\n * @param generateMipMaps defines if the engine must generate mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compressed used (can be null)\r\n * @param textureType defines the compressed used (can be null)\r\n * @returns a new raw 3D texture (stored in an InternalTexture)\r\n */\r\n public createRawTexture3D(\r\n data: Nullable,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable = null,\r\n textureType = Constants.TEXTURETYPE_UNSIGNED_INT\r\n ): InternalTexture {\r\n throw _WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a new raw 2D array texture\r\n * @param data defines the data used to create the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param depth defines the number of layers of the texture\r\n * @param format defines the format of the texture\r\n * @param generateMipMaps defines if the engine must generate mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compressed used (can be null)\r\n * @param textureType defines the compressed used (can be null)\r\n * @returns a new raw 2D array texture (stored in an InternalTexture)\r\n */\r\n public createRawTexture2DArray(\r\n data: Nullable,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable = null,\r\n textureType = Constants.TEXTURETYPE_UNSIGNED_INT\r\n ): InternalTexture {\r\n throw _WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n private _unpackFlipYCached: Nullable = null;\r\n\r\n /**\r\n * In case you are sharing the context with other applications, it might\r\n * be interested to not cache the unpack flip y state to ensure a consistent\r\n * value would be set.\r\n */\r\n public enableUnpackFlipYCached = true;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _unpackFlipY(value: boolean): void {\r\n if (this._unpackFlipYCached !== value) {\r\n this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, value ? 1 : 0);\r\n\r\n if (this.enableUnpackFlipYCached) {\r\n this._unpackFlipYCached = value;\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _getUnpackAlignement(): number {\r\n return this._gl.getParameter(this._gl.UNPACK_ALIGNMENT);\r\n }\r\n\r\n private _getTextureTarget(texture: InternalTexture): number {\r\n if (texture.isCube) {\r\n return this._gl.TEXTURE_CUBE_MAP;\r\n } else if (texture.is3D) {\r\n return this._gl.TEXTURE_3D;\r\n } else if (texture.is2DArray || texture.isMultiview) {\r\n return this._gl.TEXTURE_2D_ARRAY;\r\n }\r\n return this._gl.TEXTURE_2D;\r\n }\r\n\r\n /**\r\n * Update the sampling mode of a given texture\r\n * @param samplingMode defines the required sampling mode\r\n * @param texture defines the texture to update\r\n * @param generateMipMaps defines whether to generate mipmaps for the texture\r\n */\r\n public updateTextureSamplingMode(samplingMode: number, texture: InternalTexture, generateMipMaps: boolean = false): void {\r\n const target = this._getTextureTarget(texture);\r\n const filters = this._getSamplingParameters(samplingMode, texture.useMipMaps || generateMipMaps);\r\n\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_MAG_FILTER, filters.mag, texture);\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_MIN_FILTER, filters.min);\r\n\r\n if (generateMipMaps) {\r\n texture.generateMipMaps = true;\r\n this._gl.generateMipmap(target);\r\n }\r\n\r\n this._bindTextureDirectly(target, null);\r\n\r\n texture.samplingMode = samplingMode;\r\n }\r\n\r\n /**\r\n * Update the dimensions of a texture\r\n * @param texture texture to update\r\n * @param width new width of the texture\r\n * @param height new height of the texture\r\n * @param depth new depth of the texture\r\n */\r\n public updateTextureDimensions(texture: InternalTexture, width: number, height: number, depth: number = 1): void {}\r\n\r\n /**\r\n * Update the sampling mode of a given texture\r\n * @param texture defines the texture to update\r\n * @param wrapU defines the texture wrap mode of the u coordinates\r\n * @param wrapV defines the texture wrap mode of the v coordinates\r\n * @param wrapR defines the texture wrap mode of the r coordinates\r\n */\r\n public updateTextureWrappingMode(texture: InternalTexture, wrapU: Nullable, wrapV: Nullable = null, wrapR: Nullable = null): void {\r\n const target = this._getTextureTarget(texture);\r\n\r\n if (wrapU !== null) {\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(wrapU), texture);\r\n texture._cachedWrapU = wrapU;\r\n }\r\n if (wrapV !== null) {\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(wrapV), texture);\r\n texture._cachedWrapV = wrapV;\r\n }\r\n if ((texture.is2DArray || texture.is3D) && wrapR !== null) {\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(wrapR), texture);\r\n texture._cachedWrapR = wrapR;\r\n }\r\n\r\n this._bindTextureDirectly(target, null);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setupDepthStencilTexture(\r\n internalTexture: InternalTexture,\r\n size: TextureSize,\r\n generateStencil: boolean,\r\n bilinearFiltering: boolean,\r\n comparisonFunction: number,\r\n samples = 1\r\n ): void {\r\n const width = (<{ width: number; height: number; layers?: number }>size).width || size;\r\n const height = (<{ width: number; height: number; layers?: number }>size).height || size;\r\n const layers = (<{ width: number; height: number; depth?: number; layers?: number }>size).layers || 0;\r\n const depth = (<{ width: number; height: number; depth?: number; layers?: number }>size).depth || 0;\r\n\r\n internalTexture.baseWidth = width;\r\n internalTexture.baseHeight = height;\r\n internalTexture.width = width;\r\n internalTexture.height = height;\r\n internalTexture.is2DArray = layers > 0;\r\n internalTexture.depth = layers || depth;\r\n internalTexture.isReady = true;\r\n internalTexture.samples = samples;\r\n internalTexture.generateMipMaps = false;\r\n internalTexture.samplingMode = bilinearFiltering ? Constants.TEXTURE_BILINEAR_SAMPLINGMODE : Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n internalTexture.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n internalTexture._comparisonFunction = comparisonFunction;\r\n\r\n const gl = this._gl;\r\n const target = this._getTextureTarget(internalTexture);\r\n const samplingParameters = this._getSamplingParameters(internalTexture.samplingMode, false);\r\n gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, samplingParameters.mag);\r\n gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, samplingParameters.min);\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n\r\n // TEXTURE_COMPARE_FUNC/MODE are only availble in WebGL2.\r\n if (this.webGLVersion > 1) {\r\n if (comparisonFunction === 0) {\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_FUNC, Constants.LEQUAL);\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_MODE, gl.NONE);\r\n } else {\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_FUNC, comparisonFunction);\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _uploadCompressedDataToTextureDirectly(\r\n texture: InternalTexture,\r\n internalFormat: number,\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n faceIndex: number = 0,\r\n lod: number = 0\r\n ) {\r\n const gl = this._gl;\r\n\r\n let target: GLenum = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n }\r\n\r\n if (texture._useSRGBBuffer) {\r\n switch (internalFormat) {\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB8_ETC2:\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB_ETC1_WEBGL:\r\n // Note, if using ETC1 and sRGB is requested, this will use ETC2 if available.\r\n if (this._caps.etc2) {\r\n internalFormat = gl.COMPRESSED_SRGB8_ETC2;\r\n } else {\r\n texture._useSRGBBuffer = false;\r\n }\r\n break;\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA8_ETC2_EAC:\r\n if (this._caps.etc2) {\r\n internalFormat = gl.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;\r\n } else {\r\n texture._useSRGBBuffer = false;\r\n }\r\n break;\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_BPTC_UNORM:\r\n internalFormat = gl.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT;\r\n break;\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_ASTC_4x4:\r\n internalFormat = gl.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;\r\n break;\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB_S3TC_DXT1:\r\n if (this._caps.s3tc_srgb) {\r\n internalFormat = gl.COMPRESSED_SRGB_S3TC_DXT1_EXT;\r\n } else {\r\n // S3TC sRGB extension not supported\r\n texture._useSRGBBuffer = false;\r\n }\r\n break;\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT1:\r\n if (this._caps.s3tc_srgb) {\r\n internalFormat = gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\r\n } else {\r\n // S3TC sRGB extension not supported\r\n texture._useSRGBBuffer = false;\r\n }\r\n break;\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT5:\r\n if (this._caps.s3tc_srgb) {\r\n internalFormat = gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\r\n } else {\r\n // S3TC sRGB extension not supported\r\n texture._useSRGBBuffer = false;\r\n }\r\n break;\r\n default:\r\n // We don't support a sRGB format corresponding to internalFormat, so revert to non sRGB format\r\n texture._useSRGBBuffer = false;\r\n break;\r\n }\r\n }\r\n\r\n this._gl.compressedTexImage2D(target, lod, internalFormat, width, height, 0, data);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _uploadDataToTextureDirectly(\r\n texture: InternalTexture,\r\n imageData: ArrayBufferView,\r\n faceIndex: number = 0,\r\n lod: number = 0,\r\n babylonInternalFormat?: number,\r\n useTextureWidthAndHeight = false\r\n ): void {\r\n const gl = this._gl;\r\n\r\n const textureType = this._getWebGLTextureType(texture.type);\r\n const format = this._getInternalFormat(texture.format);\r\n const internalFormat =\r\n babylonInternalFormat === undefined\r\n ? this._getRGBABufferInternalSizedFormat(texture.type, texture.format, texture._useSRGBBuffer)\r\n : this._getInternalFormat(babylonInternalFormat, texture._useSRGBBuffer);\r\n\r\n this._unpackFlipY(texture.invertY);\r\n\r\n let target: GLenum = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n }\r\n\r\n const lodMaxWidth = Math.round(Math.log(texture.width) * Math.LOG2E);\r\n const lodMaxHeight = Math.round(Math.log(texture.height) * Math.LOG2E);\r\n const width = useTextureWidthAndHeight ? texture.width : Math.pow(2, Math.max(lodMaxWidth - lod, 0));\r\n const height = useTextureWidthAndHeight ? texture.height : Math.pow(2, Math.max(lodMaxHeight - lod, 0));\r\n\r\n gl.texImage2D(target, lod, internalFormat, width, height, 0, format, textureType, imageData);\r\n }\r\n\r\n /**\r\n * Update a portion of an internal texture\r\n * @param texture defines the texture to update\r\n * @param imageData defines the data to store into the texture\r\n * @param xOffset defines the x coordinates of the update rectangle\r\n * @param yOffset defines the y coordinates of the update rectangle\r\n * @param width defines the width of the update rectangle\r\n * @param height defines the height of the update rectangle\r\n * @param faceIndex defines the face index if texture is a cube (0 by default)\r\n * @param lod defines the lod level to update (0 by default)\r\n * @param generateMipMaps defines whether to generate mipmaps or not\r\n */\r\n public updateTextureData(\r\n texture: InternalTexture,\r\n imageData: ArrayBufferView,\r\n xOffset: number,\r\n yOffset: number,\r\n width: number,\r\n height: number,\r\n faceIndex: number = 0,\r\n lod: number = 0,\r\n generateMipMaps = false\r\n ): void {\r\n const gl = this._gl;\r\n\r\n const textureType = this._getWebGLTextureType(texture.type);\r\n const format = this._getInternalFormat(texture.format);\r\n\r\n this._unpackFlipY(texture.invertY);\r\n\r\n let targetForBinding: GLenum = gl.TEXTURE_2D;\r\n let target: GLenum = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n targetForBinding = gl.TEXTURE_CUBE_MAP;\r\n }\r\n\r\n this._bindTextureDirectly(targetForBinding, texture, true);\r\n\r\n gl.texSubImage2D(target, lod, xOffset, yOffset, width, height, format, textureType, imageData);\r\n\r\n if (generateMipMaps) {\r\n this._gl.generateMipmap(target);\r\n }\r\n\r\n this._bindTextureDirectly(targetForBinding, null);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _uploadArrayBufferViewToTexture(texture: InternalTexture, imageData: ArrayBufferView, faceIndex: number = 0, lod: number = 0): void {\r\n const gl = this._gl;\r\n const bindTarget = texture.isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D;\r\n\r\n this._bindTextureDirectly(bindTarget, texture, true);\r\n\r\n this._uploadDataToTextureDirectly(texture, imageData, faceIndex, lod);\r\n\r\n this._bindTextureDirectly(bindTarget, null, true);\r\n }\r\n\r\n protected _prepareWebGLTextureContinuation(texture: InternalTexture, scene: Nullable, noMipmap: boolean, isCompressed: boolean, samplingMode: number): void {\r\n const gl = this._gl;\r\n if (!gl) {\r\n return;\r\n }\r\n\r\n const filters = this._getSamplingParameters(samplingMode, !noMipmap);\r\n\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filters.mag);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filters.min);\r\n\r\n if (!noMipmap && !isCompressed) {\r\n gl.generateMipmap(gl.TEXTURE_2D);\r\n }\r\n\r\n this._bindTextureDirectly(gl.TEXTURE_2D, null);\r\n\r\n // this.resetTextureCache();\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n texture.onLoadedObservable.notifyObservers(texture);\r\n texture.onLoadedObservable.clear();\r\n }\r\n\r\n private _prepareWebGLTexture(\r\n texture: InternalTexture,\r\n extension: string,\r\n scene: Nullable,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n invertY: boolean,\r\n noMipmap: boolean,\r\n isCompressed: boolean,\r\n processFunction: (\r\n width: number,\r\n height: number,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n extension: string,\r\n texture: InternalTexture,\r\n continuationCallback: () => void\r\n ) => boolean,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE\r\n ): void {\r\n const maxTextureSize = this.getCaps().maxTextureSize;\r\n const potWidth = Math.min(maxTextureSize, this.needPOTTextures ? ThinEngine.GetExponentOfTwo(img.width, maxTextureSize) : img.width);\r\n const potHeight = Math.min(maxTextureSize, this.needPOTTextures ? ThinEngine.GetExponentOfTwo(img.height, maxTextureSize) : img.height);\r\n\r\n const gl = this._gl;\r\n if (!gl) {\r\n return;\r\n }\r\n\r\n if (!texture._hardwareTexture) {\r\n // this.resetTextureCache();\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n return;\r\n }\r\n\r\n this._bindTextureDirectly(gl.TEXTURE_2D, texture, true);\r\n this._unpackFlipY(invertY === undefined ? true : invertY ? true : false);\r\n\r\n texture.baseWidth = img.width;\r\n texture.baseHeight = img.height;\r\n texture.width = potWidth;\r\n texture.height = potHeight;\r\n texture.isReady = true;\r\n texture.type = texture.type !== -1 ? texture.type : Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n texture.format = texture.format !== -1 ? texture.format : extension === \".jpg\" && !texture._useSRGBBuffer ? Constants.TEXTUREFORMAT_RGB : Constants.TEXTUREFORMAT_RGBA;\r\n\r\n if (\r\n processFunction(potWidth, potHeight, img, extension, texture, () => {\r\n this._prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode);\r\n })\r\n ) {\r\n // Returning as texture needs extra async steps\r\n return;\r\n }\r\n\r\n this._prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setupFramebufferDepthAttachments(\r\n generateStencilBuffer: boolean,\r\n generateDepthBuffer: boolean,\r\n width: number,\r\n height: number,\r\n samples = 1\r\n ): Nullable {\r\n const gl = this._gl;\r\n\r\n // Create the depth/stencil buffer\r\n if (generateStencilBuffer && generateDepthBuffer) {\r\n return this._createRenderBuffer(width, height, samples, gl.DEPTH_STENCIL, gl.DEPTH24_STENCIL8, gl.DEPTH_STENCIL_ATTACHMENT);\r\n }\r\n if (generateDepthBuffer) {\r\n let depthFormat: GLenum = gl.DEPTH_COMPONENT16;\r\n if (this._webGLVersion > 1) {\r\n depthFormat = gl.DEPTH_COMPONENT32F;\r\n }\r\n\r\n return this._createRenderBuffer(width, height, samples, depthFormat, depthFormat, gl.DEPTH_ATTACHMENT);\r\n }\r\n if (generateStencilBuffer) {\r\n return this._createRenderBuffer(width, height, samples, gl.STENCIL_INDEX8, gl.STENCIL_INDEX8, gl.STENCIL_ATTACHMENT);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _createRenderBuffer(\r\n width: number,\r\n height: number,\r\n samples: number,\r\n internalFormat: number,\r\n msInternalFormat: number,\r\n attachment: number,\r\n unbindBuffer = true\r\n ): Nullable {\r\n const gl = this._gl;\r\n const renderBuffer = gl.createRenderbuffer();\r\n return this._updateRenderBuffer(renderBuffer, width, height, samples, internalFormat, msInternalFormat, attachment, unbindBuffer);\r\n }\r\n\r\n public _updateRenderBuffer(\r\n renderBuffer: Nullable,\r\n width: number,\r\n height: number,\r\n samples: number,\r\n internalFormat: number,\r\n msInternalFormat: number,\r\n attachment: number,\r\n unbindBuffer = true\r\n ): Nullable {\r\n const gl = this._gl;\r\n\r\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderBuffer);\r\n\r\n if (samples > 1 && gl.renderbufferStorageMultisample) {\r\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, samples, msInternalFormat, width, height);\r\n } else {\r\n gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, width, height);\r\n }\r\n\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, renderBuffer);\r\n\r\n if (unbindBuffer) {\r\n gl.bindRenderbuffer(gl.RENDERBUFFER, null);\r\n }\r\n\r\n return renderBuffer;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseTexture(texture: InternalTexture): void {\r\n this._deleteTexture(texture._hardwareTexture?.underlyingResource);\r\n\r\n // Unbind channels\r\n this.unbindAllTextures();\r\n\r\n const index = this._internalTexturesCache.indexOf(texture);\r\n if (index !== -1) {\r\n this._internalTexturesCache.splice(index, 1);\r\n }\r\n\r\n // Integrated fixed lod samplers.\r\n if (texture._lodTextureHigh) {\r\n texture._lodTextureHigh.dispose();\r\n }\r\n if (texture._lodTextureMid) {\r\n texture._lodTextureMid.dispose();\r\n }\r\n if (texture._lodTextureLow) {\r\n texture._lodTextureLow.dispose();\r\n }\r\n\r\n // Integrated irradiance map.\r\n if (texture._irradianceTexture) {\r\n texture._irradianceTexture.dispose();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseRenderTargetWrapper(rtWrapper: RenderTargetWrapper): void {\r\n const index = this._renderTargetWrapperCache.indexOf(rtWrapper);\r\n if (index !== -1) {\r\n this._renderTargetWrapperCache.splice(index, 1);\r\n }\r\n }\r\n\r\n protected _deleteTexture(texture: Nullable): void {\r\n if (texture) {\r\n this._gl.deleteTexture(texture);\r\n }\r\n }\r\n\r\n protected _setProgram(program: WebGLProgram): void {\r\n if (this._currentProgram !== program) {\r\n this._gl.useProgram(program);\r\n this._currentProgram = program;\r\n }\r\n }\r\n\r\n protected _boundUniforms: { [key: number]: WebGLUniformLocation } = {};\r\n\r\n /**\r\n * Binds an effect to the webGL context\r\n * @param effect defines the effect to bind\r\n */\r\n public bindSamplers(effect: Effect): void {\r\n const webGLPipelineContext = effect.getPipelineContext() as WebGLPipelineContext;\r\n this._setProgram(webGLPipelineContext.program!);\r\n const samplers = effect.getSamplers();\r\n for (let index = 0; index < samplers.length; index++) {\r\n const uniform = effect.getUniform(samplers[index]);\r\n\r\n if (uniform) {\r\n this._boundUniforms[index] = uniform;\r\n }\r\n }\r\n this._currentEffect = null;\r\n }\r\n\r\n private _activateCurrentTexture() {\r\n if (this._currentTextureChannel !== this._activeChannel) {\r\n this._gl.activeTexture(this._gl.TEXTURE0 + this._activeChannel);\r\n this._currentTextureChannel = this._activeChannel;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bindTextureDirectly(target: number, texture: Nullable, forTextureDataUpdate = false, force = false): boolean {\r\n let wasPreviouslyBound = false;\r\n const isTextureForRendering = texture && texture._associatedChannel > -1;\r\n if (forTextureDataUpdate && isTextureForRendering) {\r\n this._activeChannel = texture!._associatedChannel;\r\n }\r\n\r\n const currentTextureBound = this._boundTexturesCache[this._activeChannel];\r\n\r\n if (currentTextureBound !== texture || force) {\r\n this._activateCurrentTexture();\r\n\r\n if (texture && texture.isMultiview) {\r\n //this._gl.bindTexture(target, texture ? texture._colorTextureArray : null);\r\n Logger.Error([\"_bindTextureDirectly called with a multiview texture!\", target, texture]);\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"_bindTextureDirectly called with a multiview texture!\";\r\n } else {\r\n this._gl.bindTexture(target, texture?._hardwareTexture?.underlyingResource ?? null);\r\n }\r\n\r\n this._boundTexturesCache[this._activeChannel] = texture;\r\n\r\n if (texture) {\r\n texture._associatedChannel = this._activeChannel;\r\n }\r\n } else if (forTextureDataUpdate) {\r\n wasPreviouslyBound = true;\r\n this._activateCurrentTexture();\r\n }\r\n\r\n if (isTextureForRendering && !forTextureDataUpdate) {\r\n this._bindSamplerUniformToChannel(texture!._associatedChannel, this._activeChannel);\r\n }\r\n\r\n return wasPreviouslyBound;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bindTexture(channel: number, texture: Nullable, name: string): void {\r\n if (channel === undefined) {\r\n return;\r\n }\r\n\r\n if (texture) {\r\n texture._associatedChannel = channel;\r\n }\r\n\r\n this._activeChannel = channel;\r\n const target = texture ? this._getTextureTarget(texture) : this._gl.TEXTURE_2D;\r\n this._bindTextureDirectly(target, texture);\r\n }\r\n\r\n /**\r\n * Unbind all textures from the webGL context\r\n */\r\n public unbindAllTextures(): void {\r\n for (let channel = 0; channel < this._maxSimultaneousTextures; channel++) {\r\n this._activeChannel = channel;\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null);\r\n if (this.webGLVersion > 1) {\r\n this._bindTextureDirectly(this._gl.TEXTURE_3D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a texture to the according uniform.\r\n * @param channel The texture channel\r\n * @param uniform The uniform to set\r\n * @param texture The texture to apply\r\n * @param name The name of the uniform in the effect\r\n */\r\n public setTexture(channel: number, uniform: Nullable, texture: Nullable, name: string): void {\r\n if (channel === undefined) {\r\n return;\r\n }\r\n\r\n if (uniform) {\r\n this._boundUniforms[channel] = uniform;\r\n }\r\n\r\n this._setTexture(channel, texture);\r\n }\r\n\r\n private _bindSamplerUniformToChannel(sourceSlot: number, destination: number) {\r\n const uniform = this._boundUniforms[sourceSlot];\r\n if (!uniform || uniform._currentState === destination) {\r\n return;\r\n }\r\n this._gl.uniform1i(uniform, destination);\r\n uniform._currentState = destination;\r\n }\r\n\r\n private _getTextureWrapMode(mode: number): number {\r\n switch (mode) {\r\n case Constants.TEXTURE_WRAP_ADDRESSMODE:\r\n return this._gl.REPEAT;\r\n case Constants.TEXTURE_CLAMP_ADDRESSMODE:\r\n return this._gl.CLAMP_TO_EDGE;\r\n case Constants.TEXTURE_MIRROR_ADDRESSMODE:\r\n return this._gl.MIRRORED_REPEAT;\r\n }\r\n return this._gl.REPEAT;\r\n }\r\n\r\n protected _setTexture(channel: number, texture: Nullable, isPartOfTextureArray = false, depthStencilTexture = false, name = \"\"): boolean {\r\n // Not ready?\r\n if (!texture) {\r\n if (this._boundTexturesCache[channel] != null) {\r\n this._activeChannel = channel;\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null);\r\n if (this.webGLVersion > 1) {\r\n this._bindTextureDirectly(this._gl.TEXTURE_3D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null);\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n // Video\r\n if ((texture).video) {\r\n this._activeChannel = channel;\r\n const videoInternalTexture = (texture).getInternalTexture();\r\n if (videoInternalTexture) {\r\n videoInternalTexture._associatedChannel = channel;\r\n }\r\n (texture).update();\r\n } else if (texture.delayLoadState === Constants.DELAYLOADSTATE_NOTLOADED) {\r\n // Delay loading\r\n texture.delayLoad();\r\n return false;\r\n }\r\n\r\n let internalTexture: InternalTexture;\r\n if (depthStencilTexture) {\r\n internalTexture = (texture).depthStencilTexture!;\r\n } else if (texture.isReady()) {\r\n internalTexture = texture.getInternalTexture();\r\n } else if (texture.isCube) {\r\n internalTexture = this.emptyCubeTexture;\r\n } else if (texture.is3D) {\r\n internalTexture = this.emptyTexture3D;\r\n } else if (texture.is2DArray) {\r\n internalTexture = this.emptyTexture2DArray;\r\n } else {\r\n internalTexture = this.emptyTexture;\r\n }\r\n\r\n if (!isPartOfTextureArray && internalTexture) {\r\n internalTexture._associatedChannel = channel;\r\n }\r\n\r\n let needToBind = true;\r\n if (this._boundTexturesCache[channel] === internalTexture) {\r\n if (!isPartOfTextureArray) {\r\n this._bindSamplerUniformToChannel(internalTexture._associatedChannel, channel);\r\n }\r\n\r\n needToBind = false;\r\n }\r\n\r\n this._activeChannel = channel;\r\n const target = this._getTextureTarget(internalTexture);\r\n if (needToBind) {\r\n this._bindTextureDirectly(target, internalTexture, isPartOfTextureArray);\r\n }\r\n\r\n if (internalTexture && !internalTexture.isMultiview) {\r\n // CUBIC_MODE and SKYBOX_MODE both require CLAMP_TO_EDGE. All other modes use REPEAT.\r\n if (internalTexture.isCube && internalTexture._cachedCoordinatesMode !== texture.coordinatesMode) {\r\n internalTexture._cachedCoordinatesMode = texture.coordinatesMode;\r\n\r\n const textureWrapMode =\r\n texture.coordinatesMode !== Constants.TEXTURE_CUBIC_MODE && texture.coordinatesMode !== Constants.TEXTURE_SKYBOX_MODE\r\n ? Constants.TEXTURE_WRAP_ADDRESSMODE\r\n : Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n texture.wrapU = textureWrapMode;\r\n texture.wrapV = textureWrapMode;\r\n }\r\n\r\n if (internalTexture._cachedWrapU !== texture.wrapU) {\r\n internalTexture._cachedWrapU = texture.wrapU;\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(texture.wrapU), internalTexture);\r\n }\r\n\r\n if (internalTexture._cachedWrapV !== texture.wrapV) {\r\n internalTexture._cachedWrapV = texture.wrapV;\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(texture.wrapV), internalTexture);\r\n }\r\n\r\n if (internalTexture.is3D && internalTexture._cachedWrapR !== texture.wrapR) {\r\n internalTexture._cachedWrapR = texture.wrapR;\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(texture.wrapR), internalTexture);\r\n }\r\n\r\n this._setAnisotropicLevel(target, internalTexture, texture.anisotropicFilteringLevel);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Sets an array of texture to the webGL context\r\n * @param channel defines the channel where the texture array must be set\r\n * @param uniform defines the associated uniform location\r\n * @param textures defines the array of textures to bind\r\n * @param name name of the channel\r\n */\r\n public setTextureArray(channel: number, uniform: Nullable, textures: ThinTexture[], name: string): void {\r\n if (channel === undefined || !uniform) {\r\n return;\r\n }\r\n\r\n if (!this._textureUnits || this._textureUnits.length !== textures.length) {\r\n this._textureUnits = new Int32Array(textures.length);\r\n }\r\n for (let i = 0; i < textures.length; i++) {\r\n const texture = textures[i].getInternalTexture();\r\n\r\n if (texture) {\r\n this._textureUnits[i] = channel + i;\r\n texture._associatedChannel = channel + i;\r\n } else {\r\n this._textureUnits[i] = -1;\r\n }\r\n }\r\n this._gl.uniform1iv(uniform, this._textureUnits);\r\n\r\n for (let index = 0; index < textures.length; index++) {\r\n this._setTexture(this._textureUnits[index], textures[index], true);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setAnisotropicLevel(target: number, internalTexture: InternalTexture, anisotropicFilteringLevel: number) {\r\n const anisotropicFilterExtension = this._caps.textureAnisotropicFilterExtension;\r\n if (\r\n internalTexture.samplingMode !== Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST &&\r\n internalTexture.samplingMode !== Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR &&\r\n internalTexture.samplingMode !== Constants.TEXTURE_LINEAR_LINEAR\r\n ) {\r\n anisotropicFilteringLevel = 1; // Forcing the anisotropic to 1 because else webgl will force filters to linear\r\n }\r\n\r\n if (anisotropicFilterExtension && internalTexture._cachedAnisotropicFilteringLevel !== anisotropicFilteringLevel) {\r\n this._setTextureParameterFloat(\r\n target,\r\n anisotropicFilterExtension.TEXTURE_MAX_ANISOTROPY_EXT,\r\n Math.min(anisotropicFilteringLevel, this._caps.maxAnisotropy),\r\n internalTexture\r\n );\r\n internalTexture._cachedAnisotropicFilteringLevel = anisotropicFilteringLevel;\r\n }\r\n }\r\n\r\n private _setTextureParameterFloat(target: number, parameter: number, value: number, texture: InternalTexture): void {\r\n this._bindTextureDirectly(target, texture, true, true);\r\n this._gl.texParameterf(target, parameter, value);\r\n }\r\n\r\n private _setTextureParameterInteger(target: number, parameter: number, value: number, texture?: InternalTexture) {\r\n if (texture) {\r\n this._bindTextureDirectly(target, texture, true, true);\r\n }\r\n this._gl.texParameteri(target, parameter, value);\r\n }\r\n\r\n /**\r\n * Unbind all vertex attributes from the webGL context\r\n */\r\n public unbindAllAttributes() {\r\n if (this._mustWipeVertexAttributes) {\r\n this._mustWipeVertexAttributes = false;\r\n\r\n for (let i = 0; i < this._caps.maxVertexAttribs; i++) {\r\n this.disableAttributeByIndex(i);\r\n }\r\n return;\r\n }\r\n\r\n for (let i = 0, ul = this._vertexAttribArraysEnabled.length; i < ul; i++) {\r\n if (i >= this._caps.maxVertexAttribs || !this._vertexAttribArraysEnabled[i]) {\r\n continue;\r\n }\r\n\r\n this.disableAttributeByIndex(i);\r\n }\r\n }\r\n\r\n /**\r\n * Force the engine to release all cached effects. This means that next effect compilation will have to be done completely even if a similar effect was already compiled\r\n */\r\n public releaseEffects() {\r\n for (const name in this._compiledEffects) {\r\n const webGLPipelineContext = this._compiledEffects[name].getPipelineContext() as WebGLPipelineContext;\r\n this._deletePipelineContext(webGLPipelineContext);\r\n }\r\n\r\n this._compiledEffects = {};\r\n }\r\n\r\n /**\r\n * Dispose and release all associated resources\r\n */\r\n public dispose(): void {\r\n this._isDisposed = true;\r\n this.stopRenderLoop();\r\n\r\n // Clear observables\r\n if (this.onBeforeTextureInitObservable) {\r\n this.onBeforeTextureInitObservable.clear();\r\n }\r\n\r\n // Empty texture\r\n if (this._emptyTexture) {\r\n this._releaseTexture(this._emptyTexture);\r\n this._emptyTexture = null;\r\n }\r\n if (this._emptyCubeTexture) {\r\n this._releaseTexture(this._emptyCubeTexture);\r\n this._emptyCubeTexture = null;\r\n }\r\n\r\n if (this._dummyFramebuffer) {\r\n this._gl.deleteFramebuffer(this._dummyFramebuffer);\r\n }\r\n\r\n // Release effects\r\n this.releaseEffects();\r\n this.releaseComputeEffects?.();\r\n\r\n // Unbind\r\n this.unbindAllAttributes();\r\n this._boundUniforms = {};\r\n\r\n // Events\r\n if (IsWindowObjectExist()) {\r\n if (this._renderingCanvas) {\r\n if (!this._doNotHandleContextLost) {\r\n this._renderingCanvas.removeEventListener(\"webglcontextlost\", this._onContextLost);\r\n this._renderingCanvas.removeEventListener(\"webglcontextrestored\", this._onContextRestored);\r\n }\r\n\r\n window.removeEventListener(\"resize\", this._checkForMobile);\r\n }\r\n }\r\n\r\n this._workingCanvas = null;\r\n this._workingContext = null;\r\n this._currentBufferPointers.length = 0;\r\n this._renderingCanvas = null;\r\n this._currentProgram = null;\r\n this._boundRenderFunction = null;\r\n\r\n Effect.ResetCache();\r\n\r\n // Abort active requests\r\n for (const request of this._activeRequests) {\r\n request.abort();\r\n }\r\n\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n\r\n if (this._creationOptions.loseContextOnDispose) {\r\n this._gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\r\n }\r\n }\r\n\r\n /**\r\n * Attach a new callback raised when context lost event is fired\r\n * @param callback defines the callback to call\r\n */\r\n public attachContextLostEvent(callback: (event: WebGLContextEvent) => void): void {\r\n if (this._renderingCanvas) {\r\n this._renderingCanvas.addEventListener(\"webglcontextlost\", callback, false);\r\n }\r\n }\r\n\r\n /**\r\n * Attach a new callback raised when context restored event is fired\r\n * @param callback defines the callback to call\r\n */\r\n public attachContextRestoredEvent(callback: (event: WebGLContextEvent) => void): void {\r\n if (this._renderingCanvas) {\r\n this._renderingCanvas.addEventListener(\"webglcontextrestored\", callback, false);\r\n }\r\n }\r\n\r\n /**\r\n * Get the current error code of the webGL context\r\n * @returns the error code\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError\r\n */\r\n public getError(): number {\r\n return this._gl.getError();\r\n }\r\n\r\n private _canRenderToFloatFramebuffer(): boolean {\r\n if (this._webGLVersion > 1) {\r\n return this._caps.colorBufferFloat;\r\n }\r\n return this._canRenderToFramebuffer(Constants.TEXTURETYPE_FLOAT);\r\n }\r\n\r\n private _canRenderToHalfFloatFramebuffer(): boolean {\r\n if (this._webGLVersion > 1) {\r\n return this._caps.colorBufferFloat;\r\n }\r\n return this._canRenderToFramebuffer(Constants.TEXTURETYPE_HALF_FLOAT);\r\n }\r\n\r\n // Thank you : http://stackoverflow.com/questions/28827511/webgl-ios-render-to-floating-point-texture\r\n private _canRenderToFramebuffer(type: number): boolean {\r\n const gl = this._gl;\r\n\r\n //clear existing errors\r\n // eslint-disable-next-line no-empty\r\n while (gl.getError() !== gl.NO_ERROR) {}\r\n\r\n let successful = true;\r\n\r\n const texture = gl.createTexture();\r\n gl.bindTexture(gl.TEXTURE_2D, texture);\r\n gl.texImage2D(gl.TEXTURE_2D, 0, this._getRGBABufferInternalSizedFormat(type), 1, 1, 0, gl.RGBA, this._getWebGLTextureType(type), null);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\r\n\r\n const fb = gl.createFramebuffer();\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb);\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\r\n const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\r\n\r\n successful = successful && status === gl.FRAMEBUFFER_COMPLETE;\r\n successful = successful && gl.getError() === gl.NO_ERROR;\r\n\r\n //try render by clearing frame buffer's color buffer\r\n if (successful) {\r\n gl.clear(gl.COLOR_BUFFER_BIT);\r\n successful = successful && gl.getError() === gl.NO_ERROR;\r\n }\r\n\r\n //try reading from frame to ensure render occurs (just creating the FBO is not sufficient to determine if rendering is supported)\r\n if (successful) {\r\n //in practice it's sufficient to just read from the backbuffer rather than handle potentially issues reading from the texture\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\r\n const readFormat = gl.RGBA;\r\n const readType = gl.UNSIGNED_BYTE;\r\n const buffer = new Uint8Array(4);\r\n gl.readPixels(0, 0, 1, 1, readFormat, readType, buffer);\r\n successful = successful && gl.getError() === gl.NO_ERROR;\r\n }\r\n\r\n //clean up\r\n gl.deleteTexture(texture);\r\n gl.deleteFramebuffer(fb);\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\r\n\r\n //clear accumulated errors\r\n // eslint-disable-next-line no-empty\r\n while (!successful && gl.getError() !== gl.NO_ERROR) {}\r\n\r\n return successful;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getWebGLTextureType(type: number): number {\r\n if (this._webGLVersion === 1) {\r\n switch (type) {\r\n case Constants.TEXTURETYPE_FLOAT:\r\n return this._gl.FLOAT;\r\n case Constants.TEXTURETYPE_HALF_FLOAT:\r\n return this._gl.HALF_FLOAT_OES;\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE:\r\n return this._gl.UNSIGNED_BYTE;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4:\r\n return this._gl.UNSIGNED_SHORT_4_4_4_4;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1:\r\n return this._gl.UNSIGNED_SHORT_5_5_5_1;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5:\r\n return this._gl.UNSIGNED_SHORT_5_6_5;\r\n }\r\n return this._gl.UNSIGNED_BYTE;\r\n }\r\n\r\n switch (type) {\r\n case Constants.TEXTURETYPE_BYTE:\r\n return this._gl.BYTE;\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE:\r\n return this._gl.UNSIGNED_BYTE;\r\n case Constants.TEXTURETYPE_SHORT:\r\n return this._gl.SHORT;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT:\r\n return this._gl.UNSIGNED_SHORT;\r\n case Constants.TEXTURETYPE_INT:\r\n return this._gl.INT;\r\n case Constants.TEXTURETYPE_UNSIGNED_INTEGER: // Refers to UNSIGNED_INT\r\n return this._gl.UNSIGNED_INT;\r\n case Constants.TEXTURETYPE_FLOAT:\r\n return this._gl.FLOAT;\r\n case Constants.TEXTURETYPE_HALF_FLOAT:\r\n return this._gl.HALF_FLOAT;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4:\r\n return this._gl.UNSIGNED_SHORT_4_4_4_4;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1:\r\n return this._gl.UNSIGNED_SHORT_5_5_5_1;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5:\r\n return this._gl.UNSIGNED_SHORT_5_6_5;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV:\r\n return this._gl.UNSIGNED_INT_2_10_10_10_REV;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_24_8:\r\n return this._gl.UNSIGNED_INT_24_8;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV:\r\n return this._gl.UNSIGNED_INT_10F_11F_11F_REV;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV:\r\n return this._gl.UNSIGNED_INT_5_9_9_9_REV;\r\n case Constants.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV:\r\n return this._gl.FLOAT_32_UNSIGNED_INT_24_8_REV;\r\n }\r\n\r\n return this._gl.UNSIGNED_BYTE;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getInternalFormat(format: number, useSRGBBuffer = false): number {\r\n let internalFormat: GLenum = useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA;\r\n\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_ALPHA:\r\n internalFormat = this._gl.ALPHA;\r\n break;\r\n case Constants.TEXTUREFORMAT_LUMINANCE:\r\n internalFormat = this._gl.LUMINANCE;\r\n break;\r\n case Constants.TEXTUREFORMAT_LUMINANCE_ALPHA:\r\n internalFormat = this._gl.LUMINANCE_ALPHA;\r\n break;\r\n case Constants.TEXTUREFORMAT_RED:\r\n internalFormat = this._gl.RED;\r\n break;\r\n case Constants.TEXTUREFORMAT_RG:\r\n internalFormat = this._gl.RG;\r\n break;\r\n case Constants.TEXTUREFORMAT_RGB:\r\n internalFormat = useSRGBBuffer ? this._glSRGBExtensionValues.SRGB : this._gl.RGB;\r\n break;\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n internalFormat = useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA;\r\n break;\r\n }\r\n\r\n if (this._webGLVersion > 1) {\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n internalFormat = this._gl.RED_INTEGER;\r\n break;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n internalFormat = this._gl.RG_INTEGER;\r\n break;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n internalFormat = this._gl.RGB_INTEGER;\r\n break;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n internalFormat = this._gl.RGBA_INTEGER;\r\n break;\r\n }\r\n }\r\n\r\n return internalFormat;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getRGBABufferInternalSizedFormat(type: number, format?: number, useSRGBBuffer = false): number {\r\n if (this._webGLVersion === 1) {\r\n if (format !== undefined) {\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_ALPHA:\r\n return this._gl.ALPHA;\r\n case Constants.TEXTUREFORMAT_LUMINANCE:\r\n return this._gl.LUMINANCE;\r\n case Constants.TEXTUREFORMAT_LUMINANCE_ALPHA:\r\n return this._gl.LUMINANCE_ALPHA;\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB : this._gl.RGB;\r\n }\r\n }\r\n return this._gl.RGBA;\r\n }\r\n\r\n switch (type) {\r\n case Constants.TEXTURETYPE_BYTE:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED:\r\n return this._gl.R8_SNORM;\r\n case Constants.TEXTUREFORMAT_RG:\r\n return this._gl.RG8_SNORM;\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return this._gl.RGB8_SNORM;\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return this._gl.R8I;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return this._gl.RG8I;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return this._gl.RGB8I;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGBA8I;\r\n default:\r\n return this._gl.RGBA8_SNORM;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED:\r\n return this._gl.R8;\r\n case Constants.TEXTUREFORMAT_RG:\r\n return this._gl.RG8;\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8 : this._gl.RGB8; // By default. Other possibilities are RGB565, SRGB8.\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA8; // By default. Other possibilities are RGB5_A1, RGBA4, SRGB8_ALPHA8.\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return this._gl.R8UI;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return this._gl.RG8UI;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return this._gl.RGB8UI;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGBA8UI;\r\n case Constants.TEXTUREFORMAT_ALPHA:\r\n return this._gl.ALPHA;\r\n case Constants.TEXTUREFORMAT_LUMINANCE:\r\n return this._gl.LUMINANCE;\r\n case Constants.TEXTUREFORMAT_LUMINANCE_ALPHA:\r\n return this._gl.LUMINANCE_ALPHA;\r\n default:\r\n return this._gl.RGBA8;\r\n }\r\n case Constants.TEXTURETYPE_SHORT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return this._gl.R16I;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return this._gl.RG16I;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return this._gl.RGB16I;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGBA16I;\r\n default:\r\n return this._gl.RGBA16I;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return this._gl.R16UI;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return this._gl.RG16UI;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return this._gl.RGB16UI;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGBA16UI;\r\n default:\r\n return this._gl.RGBA16UI;\r\n }\r\n case Constants.TEXTURETYPE_INT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return this._gl.R32I;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return this._gl.RG32I;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return this._gl.RGB32I;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGBA32I;\r\n default:\r\n return this._gl.RGBA32I;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_INTEGER: // Refers to UNSIGNED_INT\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return this._gl.R32UI;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return this._gl.RG32UI;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return this._gl.RGB32UI;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGBA32UI;\r\n default:\r\n return this._gl.RGBA32UI;\r\n }\r\n case Constants.TEXTURETYPE_FLOAT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED:\r\n return this._gl.R32F; // By default. Other possibility is R16F.\r\n case Constants.TEXTUREFORMAT_RG:\r\n return this._gl.RG32F; // By default. Other possibility is RG16F.\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return this._gl.RGB32F; // By default. Other possibilities are RGB16F, R11F_G11F_B10F, RGB9_E5.\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return this._gl.RGBA32F; // By default. Other possibility is RGBA16F.\r\n default:\r\n return this._gl.RGBA32F;\r\n }\r\n case Constants.TEXTURETYPE_HALF_FLOAT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED:\r\n return this._gl.R16F;\r\n case Constants.TEXTUREFORMAT_RG:\r\n return this._gl.RG16F;\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return this._gl.RGB16F; // By default. Other possibilities are R11F_G11F_B10F, RGB9_E5.\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return this._gl.RGBA16F;\r\n default:\r\n return this._gl.RGBA16F;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5:\r\n return this._gl.RGB565;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV:\r\n return this._gl.R11F_G11F_B10F;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV:\r\n return this._gl.RGB9_E5;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4:\r\n return this._gl.RGBA4;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1:\r\n return this._gl.RGB5_A1;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return this._gl.RGB10_A2; // By default. Other possibility is RGB5_A1.\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGB10_A2UI;\r\n default:\r\n return this._gl.RGB10_A2;\r\n }\r\n }\r\n\r\n return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA8;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (data: any) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: IWebRequest, exception?: any) => void\r\n ): IFileRequest {\r\n const request = ThinEngine._FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);\r\n this._activeRequests.push(request);\r\n request.onCompleteObservable.add((request) => {\r\n this._activeRequests.splice(this._activeRequests.indexOf(request), 1);\r\n });\r\n return request;\r\n }\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @returns a file request object\r\n * @internal\r\n */\r\n public static _FileToolsLoadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void\r\n ): IFileRequest {\r\n throw _WarnImport(\"FileTools\");\r\n }\r\n\r\n /**\r\n * Reads pixels from the current frame buffer. Please note that this function can be slow\r\n * @param x defines the x coordinate of the rectangle where pixels must be read\r\n * @param y defines the y coordinate of the rectangle where pixels must be read\r\n * @param width defines the width of the rectangle where pixels must be read\r\n * @param height defines the height of the rectangle where pixels must be read\r\n * @param hasAlpha defines whether the output should have alpha or not (defaults to true)\r\n * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels\r\n * @returns a ArrayBufferView promise (Uint8Array) containing RGBA colors\r\n */\r\n public readPixels(x: number, y: number, width: number, height: number, hasAlpha = true, flushRenderer = true): Promise {\r\n const numChannels = hasAlpha ? 4 : 3;\r\n const format = hasAlpha ? this._gl.RGBA : this._gl.RGB;\r\n const data = new Uint8Array(height * width * numChannels);\r\n if (flushRenderer) {\r\n this.flushFramebuffer();\r\n }\r\n this._gl.readPixels(x, y, width, height, format, this._gl.UNSIGNED_BYTE, data);\r\n return Promise.resolve(data);\r\n }\r\n\r\n // Statics\r\n\r\n private static _IsSupported: Nullable = null;\r\n private static _HasMajorPerformanceCaveat: Nullable = null;\r\n\r\n /**\r\n * Gets a Promise indicating if the engine can be instantiated (ie. if a webGL context can be found)\r\n */\r\n public static get IsSupportedAsync(): Promise {\r\n return Promise.resolve(this.isSupported());\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the engine can be instantiated (ie. if a webGL context can be found)\r\n */\r\n public static get IsSupported(): boolean {\r\n return this.isSupported(); // Backward compat\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the engine can be instantiated (ie. if a webGL context can be found)\r\n * @returns true if the engine can be created\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static isSupported(): boolean {\r\n if (this._HasMajorPerformanceCaveat !== null) {\r\n return !this._HasMajorPerformanceCaveat; // We know it is performant so WebGL is supported\r\n }\r\n\r\n if (this._IsSupported === null) {\r\n try {\r\n const tempcanvas = this._CreateCanvas(1, 1);\r\n const gl = tempcanvas.getContext(\"webgl\") || (tempcanvas as any).getContext(\"experimental-webgl\");\r\n\r\n this._IsSupported = gl != null && !!window.WebGLRenderingContext;\r\n } catch (e) {\r\n this._IsSupported = false;\r\n }\r\n }\r\n\r\n return this._IsSupported;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the engine can be instantiated on a performant device (ie. if a webGL context can be found and it does not use a slow implementation)\r\n */\r\n public static get HasMajorPerformanceCaveat(): boolean {\r\n if (this._HasMajorPerformanceCaveat === null) {\r\n try {\r\n const tempcanvas = this._CreateCanvas(1, 1);\r\n const gl =\r\n tempcanvas.getContext(\"webgl\", { failIfMajorPerformanceCaveat: true }) ||\r\n (tempcanvas as any).getContext(\"experimental-webgl\", { failIfMajorPerformanceCaveat: true });\r\n\r\n this._HasMajorPerformanceCaveat = !gl;\r\n } catch (e) {\r\n this._HasMajorPerformanceCaveat = false;\r\n }\r\n }\r\n\r\n return this._HasMajorPerformanceCaveat;\r\n }\r\n\r\n /**\r\n * Find the next highest power of two.\r\n * @param x Number to start search from.\r\n * @returns Next highest power of two.\r\n */\r\n public static CeilingPOT(x: number): number {\r\n x--;\r\n x |= x >> 1;\r\n x |= x >> 2;\r\n x |= x >> 4;\r\n x |= x >> 8;\r\n x |= x >> 16;\r\n x++;\r\n return x;\r\n }\r\n\r\n /**\r\n * Find the next lowest power of two.\r\n * @param x Number to start search from.\r\n * @returns Next lowest power of two.\r\n */\r\n public static FloorPOT(x: number): number {\r\n x = x | (x >> 1);\r\n x = x | (x >> 2);\r\n x = x | (x >> 4);\r\n x = x | (x >> 8);\r\n x = x | (x >> 16);\r\n return x - (x >> 1);\r\n }\r\n\r\n /**\r\n * Find the nearest power of two.\r\n * @param x Number to start search from.\r\n * @returns Next nearest power of two.\r\n */\r\n public static NearestPOT(x: number): number {\r\n const c = ThinEngine.CeilingPOT(x);\r\n const f = ThinEngine.FloorPOT(x);\r\n return c - x > x - f ? f : c;\r\n }\r\n\r\n /**\r\n * Get the closest exponent of two\r\n * @param value defines the value to approximate\r\n * @param max defines the maximum value to return\r\n * @param mode defines how to define the closest value\r\n * @returns closest exponent of two of the given value\r\n */\r\n public static GetExponentOfTwo(value: number, max: number, mode = Constants.SCALEMODE_NEAREST): number {\r\n let pot;\r\n\r\n switch (mode) {\r\n case Constants.SCALEMODE_FLOOR:\r\n pot = ThinEngine.FloorPOT(value);\r\n break;\r\n case Constants.SCALEMODE_NEAREST:\r\n pot = ThinEngine.NearestPOT(value);\r\n break;\r\n case Constants.SCALEMODE_CEILING:\r\n default:\r\n pot = ThinEngine.CeilingPOT(value);\r\n break;\r\n }\r\n\r\n return Math.min(pot, max);\r\n }\r\n\r\n /**\r\n * Queue a new function into the requested animation frame pool (ie. this function will be executed by the browser (or the javascript engine) for the next frame)\r\n * @param func - the function to be called\r\n * @param requester - the object that will request the next frame. Falls back to window.\r\n * @returns frame number\r\n */\r\n public static QueueNewFrame(func: () => void, requester?: any): number {\r\n // Note that there is kind of a typing issue here, as `setTimeout` might return something else than a number (NodeJs returns a NodeJS.Timeout object).\r\n // Also if the global `requestAnimationFrame`'s returnType is number, `requester.requestPostAnimationFrame` and `requester.requestAnimationFrame` types\r\n // are `any`.\r\n\r\n if (!IsWindowObjectExist()) {\r\n if (typeof requestAnimationFrame === \"function\") {\r\n return requestAnimationFrame(func);\r\n }\r\n } else {\r\n const { requestAnimationFrame } = requester || window;\r\n if (typeof requestAnimationFrame === \"function\") {\r\n return requestAnimationFrame(func);\r\n }\r\n }\r\n\r\n // fallback to the global `setTimeout`.\r\n // In most cases (aka in the browser), `window` is the global object, so instead of calling `window.setTimeout` we could call the global `setTimeout`.\r\n return setTimeout(func, 16) as unknown as number;\r\n }\r\n\r\n /**\r\n * Gets host document\r\n * @returns the host document object\r\n */\r\n public getHostDocument(): Nullable {\r\n if (this._renderingCanvas && this._renderingCanvas.ownerDocument) {\r\n return this._renderingCanvas.ownerDocument;\r\n }\r\n\r\n return IsDocumentAvailable() ? document : null;\r\n }\r\n}\r\n\r\ninterface TexImageParameters {\r\n internalFormat: number;\r\n format: number;\r\n type: number;\r\n}\r\n", "import { IsWindowObjectExist } from \"./domManagement\";\r\n\r\n/**\r\n * Class used to provide helper for timing\r\n */\r\nexport class TimingTools {\r\n /**\r\n * Polyfill for setImmediate\r\n * @param action defines the action to execute after the current execution block\r\n */\r\n public static SetImmediate(action: () => void) {\r\n if (IsWindowObjectExist() && window.setImmediate) {\r\n window.setImmediate(action);\r\n } else {\r\n setTimeout(action, 1);\r\n }\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { WebRequest } from \"./webRequest\";\r\nimport { IsWindowObjectExist } from \"./domManagement\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { IOfflineProvider } from \"../Offline/IOfflineProvider\";\r\nimport type { IFileRequest } from \"./fileRequest\";\r\nimport { Observable } from \"./observable\";\r\nimport { FilesInputStore } from \"./filesInputStore\";\r\nimport { RetryStrategy } from \"./retryStrategy\";\r\nimport { BaseError, ErrorCodes, RuntimeError } from \"./error\";\r\nimport { DecodeBase64ToBinary, DecodeBase64ToString, EncodeArrayBufferToBase64 } from \"./stringTools\";\r\nimport { ShaderProcessor } from \"../Engines/Processors/shaderProcessor\";\r\nimport { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Logger } from \"./logger\";\r\nimport { TimingTools } from \"./timingTools\";\r\nimport type { INative } from \"../Engines/Native/nativeInterfaces\";\r\n\r\nconst Base64DataUrlRegEx = new RegExp(/^data:([^,]+\\/[^,]+)?;base64,/i);\r\ndeclare const _native: INative;\r\n\r\n/** @ignore */\r\nexport class LoadFileError extends RuntimeError {\r\n public request?: WebRequest;\r\n public file?: File;\r\n\r\n /**\r\n * Creates a new LoadFileError\r\n * @param message defines the message of the error\r\n * @param object defines the optional web request\r\n */\r\n constructor(message: string, object?: WebRequest | File) {\r\n super(message, ErrorCodes.LoadFileError);\r\n\r\n this.name = \"LoadFileError\";\r\n BaseError._setPrototypeOf(this, LoadFileError.prototype);\r\n\r\n if (object instanceof WebRequest) {\r\n this.request = object;\r\n } else {\r\n this.file = object;\r\n }\r\n }\r\n}\r\n\r\n/** @ignore */\r\nexport class RequestFileError extends RuntimeError {\r\n /**\r\n * Creates a new LoadFileError\r\n * @param message defines the message of the error\r\n * @param request defines the optional web request\r\n */\r\n constructor(\r\n message: string,\r\n public request: WebRequest\r\n ) {\r\n super(message, ErrorCodes.RequestFileError);\r\n this.name = \"RequestFileError\";\r\n BaseError._setPrototypeOf(this, RequestFileError.prototype);\r\n }\r\n}\r\n\r\n/** @ignore */\r\nexport class ReadFileError extends RuntimeError {\r\n /**\r\n * Creates a new ReadFileError\r\n * @param message defines the message of the error\r\n * @param file defines the optional file\r\n */\r\n constructor(\r\n message: string,\r\n public file: File\r\n ) {\r\n super(message, ErrorCodes.ReadFileError);\r\n this.name = \"ReadFileError\";\r\n BaseError._setPrototypeOf(this, ReadFileError.prototype);\r\n }\r\n}\r\n/**\r\n * @internal\r\n */\r\nexport const FileToolsOptions: {\r\n DefaultRetryStrategy: (url: string, request: WebRequest, retryIndex: number) => number;\r\n BaseUrl: string;\r\n CorsBehavior: string | ((url: string | string[]) => string);\r\n PreprocessUrl: (url: string) => string;\r\n ScriptBaseUrl: string;\r\n ScriptPreprocessUrl: (url: string) => string;\r\n} = {\r\n /**\r\n * Gets or sets the retry strategy to apply when an error happens while loading an asset.\r\n * When defining this function, return the wait time before trying again or return -1 to\r\n * stop retrying and error out.\r\n */\r\n DefaultRetryStrategy: RetryStrategy.ExponentialBackoff(),\r\n\r\n /**\r\n * Gets or sets the base URL to use to load assets\r\n */\r\n BaseUrl: \"\",\r\n\r\n /**\r\n * Default behaviour for cors in the application.\r\n * It can be a string if the expected behavior is identical in the entire app.\r\n * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance)\r\n */\r\n CorsBehavior: \"anonymous\",\r\n\r\n /**\r\n * Gets or sets a function used to pre-process url before using them to load assets\r\n * @param url\r\n * @returns the processed url\r\n */\r\n PreprocessUrl: (url: string) => url,\r\n\r\n /**\r\n * Gets or sets the base URL to use to load scripts\r\n * Used for both JS and WASM\r\n */\r\n ScriptBaseUrl: \"\",\r\n /**\r\n * Gets or sets a function used to pre-process script url before using them to load.\r\n * Used for both JS and WASM\r\n * @param url defines the url to process\r\n * @returns the processed url\r\n */\r\n ScriptPreprocessUrl: (url: string) => url,\r\n};\r\n\r\n/**\r\n * Removes unwanted characters from an url\r\n * @param url defines the url to clean\r\n * @returns the cleaned url\r\n */\r\nconst _CleanUrl = (url: string): string => {\r\n url = url.replace(/#/gm, \"%23\");\r\n return url;\r\n};\r\n\r\n/**\r\n * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element.\r\n * @param url define the url we are trying\r\n * @param element define the dom element where to configure the cors policy\r\n * @internal\r\n */\r\nexport const SetCorsBehavior = (url: string | string[], element: { crossOrigin: string | null }): void => {\r\n if (url && url.indexOf(\"data:\") === 0) {\r\n return;\r\n }\r\n\r\n if (FileToolsOptions.CorsBehavior) {\r\n if (typeof FileToolsOptions.CorsBehavior === \"string\" || FileToolsOptions.CorsBehavior instanceof String) {\r\n element.crossOrigin = FileToolsOptions.CorsBehavior;\r\n } else {\r\n const result = FileToolsOptions.CorsBehavior(url);\r\n if (result) {\r\n element.crossOrigin = result;\r\n }\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Loads an image as an HTMLImageElement.\r\n * @param input url string, ArrayBuffer, or Blob to load\r\n * @param onLoad callback called when the image successfully loads\r\n * @param onError callback called when the image fails to load\r\n * @param offlineProvider offline provider for caching\r\n * @param mimeType optional mime type\r\n * @param imageBitmapOptions\r\n * @returns the HTMLImageElement of the loaded image\r\n * @internal\r\n */\r\nexport const LoadImage = (\r\n input: string | ArrayBuffer | ArrayBufferView | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string, exception?: any) => void,\r\n offlineProvider: Nullable,\r\n mimeType: string = \"\",\r\n imageBitmapOptions?: ImageBitmapOptions\r\n): Nullable => {\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (typeof HTMLImageElement === \"undefined\" && !engine?._features.forceBitmapOverHTMLImageElement) {\r\n onError(\"LoadImage is only supported in web or BabylonNative environments.\");\r\n return null;\r\n }\r\n\r\n let url: string;\r\n let usingObjectURL = false;\r\n\r\n if (input instanceof ArrayBuffer || ArrayBuffer.isView(input)) {\r\n if (typeof Blob !== \"undefined\" && typeof URL !== \"undefined\") {\r\n url = URL.createObjectURL(new Blob([input], { type: mimeType }));\r\n usingObjectURL = true;\r\n } else {\r\n url = `data:${mimeType};base64,` + EncodeArrayBufferToBase64(input);\r\n }\r\n } else if (input instanceof Blob) {\r\n url = URL.createObjectURL(input);\r\n usingObjectURL = true;\r\n } else {\r\n url = _CleanUrl(input);\r\n url = FileToolsOptions.PreprocessUrl(input);\r\n }\r\n\r\n const onErrorHandler = (exception: any) => {\r\n if (onError) {\r\n const inputText = url || input.toString();\r\n onError(`Error while trying to load image: ${inputText.indexOf(\"http\") === 0 || inputText.length <= 128 ? inputText : inputText.slice(0, 128) + \"...\"}`, exception);\r\n }\r\n };\r\n\r\n if (engine?._features.forceBitmapOverHTMLImageElement) {\r\n LoadFile(\r\n url,\r\n (data) => {\r\n engine!\r\n .createImageBitmap(new Blob([data], { type: mimeType }), { premultiplyAlpha: \"none\", ...imageBitmapOptions })\r\n .then((imgBmp) => {\r\n onLoad(imgBmp);\r\n if (usingObjectURL) {\r\n URL.revokeObjectURL(url);\r\n }\r\n })\r\n .catch((reason) => {\r\n if (onError) {\r\n onError(\"Error while trying to load image: \" + input, reason);\r\n }\r\n });\r\n },\r\n undefined,\r\n offlineProvider || undefined,\r\n true,\r\n (request, exception) => {\r\n onErrorHandler(exception);\r\n }\r\n );\r\n\r\n return null;\r\n }\r\n\r\n const img = new Image();\r\n SetCorsBehavior(url, img);\r\n\r\n const handlersList: { target: any; name: string; handler: any }[] = [];\r\n\r\n const loadHandlersList = () => {\r\n handlersList.forEach((handler) => {\r\n handler.target.addEventListener(handler.name, handler.handler);\r\n });\r\n };\r\n\r\n const unloadHandlersList = () => {\r\n handlersList.forEach((handler) => {\r\n handler.target.removeEventListener(handler.name, handler.handler);\r\n });\r\n handlersList.length = 0;\r\n };\r\n\r\n const loadHandler = () => {\r\n unloadHandlersList();\r\n\r\n onLoad(img);\r\n\r\n // Must revoke the URL after calling onLoad to avoid security exceptions in\r\n // certain scenarios (e.g. when hosted in vscode).\r\n if (usingObjectURL && img.src) {\r\n URL.revokeObjectURL(img.src);\r\n }\r\n };\r\n\r\n const errorHandler = (err: any) => {\r\n unloadHandlersList();\r\n\r\n onErrorHandler(err);\r\n\r\n if (usingObjectURL && img.src) {\r\n URL.revokeObjectURL(img.src);\r\n }\r\n };\r\n\r\n const cspHandler = (err: any) => {\r\n if (err.blockedURI !== img.src) {\r\n return;\r\n }\r\n\r\n unloadHandlersList();\r\n const cspException = new Error(`CSP violation of policy ${err.effectiveDirective} ${err.blockedURI}. Current policy is ${err.originalPolicy}`);\r\n\r\n EngineStore.UseFallbackTexture = false;\r\n onErrorHandler(cspException);\r\n if (usingObjectURL && img.src) {\r\n URL.revokeObjectURL(img.src);\r\n }\r\n img.src = \"\";\r\n };\r\n\r\n handlersList.push({ target: img, name: \"load\", handler: loadHandler });\r\n handlersList.push({ target: img, name: \"error\", handler: errorHandler });\r\n handlersList.push({ target: document, name: \"securitypolicyviolation\", handler: cspHandler });\r\n\r\n loadHandlersList();\r\n\r\n const fromBlob = url.substring(0, 5) === \"blob:\";\r\n const fromData = url.substring(0, 5) === \"data:\";\r\n const noOfflineSupport = () => {\r\n if (fromBlob || fromData || !WebRequest.IsCustomRequestAvailable) {\r\n img.src = url;\r\n } else {\r\n LoadFile(\r\n url,\r\n (data, _, contentType) => {\r\n const type = !mimeType && contentType ? contentType : mimeType;\r\n const blob = new Blob([data], { type });\r\n const url = URL.createObjectURL(blob);\r\n usingObjectURL = true;\r\n img.src = url;\r\n },\r\n undefined,\r\n offlineProvider || undefined,\r\n true,\r\n (_request, exception) => {\r\n onErrorHandler(exception);\r\n }\r\n );\r\n }\r\n };\r\n\r\n const loadFromOfflineSupport = () => {\r\n if (offlineProvider) {\r\n offlineProvider.loadImage(url, img);\r\n }\r\n };\r\n\r\n if (!fromBlob && !fromData && offlineProvider && offlineProvider.enableTexturesOffline) {\r\n offlineProvider.open(loadFromOfflineSupport, noOfflineSupport);\r\n } else {\r\n if (url.indexOf(\"file:\") !== -1) {\r\n const textureName = decodeURIComponent(url.substring(5).toLowerCase());\r\n if (FilesInputStore.FilesToLoad[textureName] && typeof URL !== \"undefined\") {\r\n try {\r\n let blobURL;\r\n try {\r\n blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]);\r\n } catch (ex) {\r\n // Chrome doesn't support oneTimeOnly parameter\r\n blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]);\r\n }\r\n img.src = blobURL;\r\n usingObjectURL = true;\r\n } catch (e) {\r\n img.src = \"\";\r\n }\r\n return img;\r\n }\r\n }\r\n\r\n noOfflineSupport();\r\n }\r\n\r\n return img;\r\n};\r\n\r\n/**\r\n * Reads a file from a File object\r\n * @param file defines the file to load\r\n * @param onSuccess defines the callback to call when data is loaded\r\n * @param onProgress defines the callback to call during loading process\r\n * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer\r\n * @param onError defines the callback to call when an error occurs\r\n * @returns a file request object\r\n * @internal\r\n */\r\nexport const ReadFile = (\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: (ev: ProgressEvent) => any,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: ReadFileError) => void\r\n): IFileRequest => {\r\n const reader = new FileReader();\r\n const fileRequest: IFileRequest = {\r\n onCompleteObservable: new Observable(),\r\n abort: () => reader.abort(),\r\n };\r\n\r\n reader.onloadend = () => fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n if (onError) {\r\n reader.onerror = () => {\r\n onError(new ReadFileError(`Unable to read ${file.name}`, file));\r\n };\r\n }\r\n reader.onload = (e) => {\r\n //target doesn't have result from ts 1.3\r\n onSuccess((e.target)[\"result\"]);\r\n };\r\n if (onProgress) {\r\n reader.onprogress = onProgress;\r\n }\r\n if (!useArrayBuffer) {\r\n // Asynchronous read\r\n reader.readAsText(file);\r\n } else {\r\n reader.readAsArrayBuffer(file);\r\n }\r\n\r\n return fileRequest;\r\n};\r\n\r\n/**\r\n * Loads a file from a url, a data url, or a file url\r\n * @param fileOrUrl file, url, data url, or file url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @param onOpened\r\n * @returns a file request object\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const LoadFile = (\r\n fileOrUrl: File | string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string, contentType?: Nullable) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n onOpened?: (request: WebRequest) => void\r\n): IFileRequest => {\r\n if ((fileOrUrl as File).name) {\r\n return ReadFile(\r\n fileOrUrl as File,\r\n onSuccess,\r\n onProgress,\r\n useArrayBuffer,\r\n onError\r\n ? (error: ReadFileError) => {\r\n onError(undefined, error);\r\n }\r\n : undefined\r\n );\r\n }\r\n\r\n const url = fileOrUrl as string;\r\n\r\n // If file and file input are set\r\n if (url.indexOf(\"file:\") !== -1) {\r\n let fileName = decodeURIComponent(url.substring(5).toLowerCase());\r\n if (fileName.indexOf(\"./\") === 0) {\r\n fileName = fileName.substring(2);\r\n }\r\n const file = FilesInputStore.FilesToLoad[fileName];\r\n if (file) {\r\n return ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError ? (error) => onError(undefined, new LoadFileError(error.message, error.file)) : undefined);\r\n }\r\n }\r\n\r\n // For a Base64 Data URL\r\n const { match, type } = TestBase64DataUrl(url);\r\n if (match) {\r\n const fileRequest: IFileRequest = {\r\n onCompleteObservable: new Observable(),\r\n abort: () => () => {},\r\n };\r\n\r\n try {\r\n const data = useArrayBuffer ? DecodeBase64UrlToBinary(url) : DecodeBase64UrlToString(url);\r\n onSuccess(data, undefined, type);\r\n } catch (error) {\r\n if (onError) {\r\n onError(undefined, error);\r\n } else {\r\n Logger.Error(error.message || \"Failed to parse the Data URL\");\r\n }\r\n }\r\n\r\n TimingTools.SetImmediate(() => {\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n });\r\n\r\n return fileRequest;\r\n }\r\n\r\n return RequestFile(\r\n url,\r\n (data, request) => {\r\n onSuccess(data, request?.responseURL, request?.getResponseHeader(\"content-type\"));\r\n },\r\n onProgress,\r\n offlineProvider,\r\n useArrayBuffer,\r\n onError\r\n ? (error) => {\r\n onError(error.request, new LoadFileError(error.message, error.request));\r\n }\r\n : undefined,\r\n onOpened\r\n );\r\n};\r\n\r\n/**\r\n * Loads a file from a url\r\n * @param url url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @param onOpened callback called when the web request is opened\r\n * @returns a file request object\r\n * @internal\r\n */\r\nexport const RequestFile = (\r\n url: string,\r\n onSuccess?: (data: string | ArrayBuffer, request?: WebRequest) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: RequestFileError) => void,\r\n onOpened?: (request: WebRequest) => void\r\n): IFileRequest => {\r\n url = _CleanUrl(url);\r\n url = FileToolsOptions.PreprocessUrl(url);\r\n\r\n const loadUrl = FileToolsOptions.BaseUrl + url;\r\n\r\n let aborted = false;\r\n const fileRequest: IFileRequest = {\r\n onCompleteObservable: new Observable(),\r\n abort: () => (aborted = true),\r\n };\r\n\r\n const requestFile = () => {\r\n let request: Nullable = new WebRequest();\r\n let retryHandle: Nullable> = null;\r\n let onReadyStateChange: Nullable<() => void>;\r\n\r\n const unbindEvents = () => {\r\n if (!request) {\r\n return;\r\n }\r\n\r\n if (onProgress) {\r\n request.removeEventListener(\"progress\", onProgress);\r\n }\r\n if (onReadyStateChange) {\r\n request.removeEventListener(\"readystatechange\", onReadyStateChange);\r\n }\r\n request.removeEventListener(\"loadend\", onLoadEnd!);\r\n };\r\n\r\n let onLoadEnd: Nullable<() => void> = () => {\r\n unbindEvents();\r\n\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n fileRequest.onCompleteObservable.clear();\r\n\r\n onProgress = undefined;\r\n onReadyStateChange = null;\r\n onLoadEnd = null;\r\n onError = undefined;\r\n onOpened = undefined;\r\n onSuccess = undefined;\r\n };\r\n\r\n fileRequest.abort = () => {\r\n aborted = true;\r\n\r\n if (onLoadEnd) {\r\n onLoadEnd();\r\n }\r\n\r\n if (request && request.readyState !== (XMLHttpRequest.DONE || 4)) {\r\n request.abort();\r\n }\r\n\r\n if (retryHandle !== null) {\r\n clearTimeout(retryHandle);\r\n retryHandle = null;\r\n }\r\n\r\n request = null;\r\n };\r\n\r\n const handleError = (error: any) => {\r\n const message = error.message || \"Unknown error\";\r\n if (onError && request) {\r\n onError(new RequestFileError(message, request));\r\n } else {\r\n Logger.Error(message);\r\n }\r\n };\r\n\r\n const retryLoop = (retryIndex: number) => {\r\n if (!request) {\r\n return;\r\n }\r\n request.open(\"GET\", loadUrl);\r\n\r\n if (onOpened) {\r\n try {\r\n onOpened(request);\r\n } catch (e) {\r\n handleError(e);\r\n return;\r\n }\r\n }\r\n\r\n if (useArrayBuffer) {\r\n request.responseType = \"arraybuffer\";\r\n }\r\n\r\n if (onProgress) {\r\n request.addEventListener(\"progress\", onProgress);\r\n }\r\n\r\n if (onLoadEnd) {\r\n request.addEventListener(\"loadend\", onLoadEnd);\r\n }\r\n\r\n onReadyStateChange = () => {\r\n if (aborted || !request) {\r\n return;\r\n }\r\n\r\n // In case of undefined state in some browsers.\r\n if (request.readyState === (XMLHttpRequest.DONE || 4)) {\r\n // Some browsers have issues where onreadystatechange can be called multiple times with the same value.\r\n if (onReadyStateChange) {\r\n request.removeEventListener(\"readystatechange\", onReadyStateChange);\r\n }\r\n\r\n if ((request.status >= 200 && request.status < 300) || (request.status === 0 && (!IsWindowObjectExist() || IsFileURL()))) {\r\n try {\r\n if (onSuccess) {\r\n onSuccess(useArrayBuffer ? request.response : request.responseText, request);\r\n }\r\n } catch (e) {\r\n handleError(e);\r\n }\r\n return;\r\n }\r\n\r\n const retryStrategy = FileToolsOptions.DefaultRetryStrategy;\r\n if (retryStrategy) {\r\n const waitTime = retryStrategy(loadUrl, request, retryIndex);\r\n if (waitTime !== -1) {\r\n // Prevent the request from completing for retry.\r\n unbindEvents();\r\n\r\n request = new WebRequest();\r\n retryHandle = setTimeout(() => retryLoop(retryIndex + 1), waitTime);\r\n return;\r\n }\r\n }\r\n\r\n const error = new RequestFileError(\"Error status: \" + request.status + \" \" + request.statusText + \" - Unable to load \" + loadUrl, request);\r\n if (onError) {\r\n onError(error);\r\n }\r\n }\r\n };\r\n\r\n request.addEventListener(\"readystatechange\", onReadyStateChange);\r\n\r\n request.send();\r\n };\r\n\r\n retryLoop(0);\r\n };\r\n\r\n // Caching all files\r\n if (offlineProvider && offlineProvider.enableSceneOffline) {\r\n const noOfflineSupport = (request?: any) => {\r\n if (request && request.status > 400) {\r\n if (onError) {\r\n onError(request);\r\n }\r\n } else {\r\n requestFile();\r\n }\r\n };\r\n\r\n const loadFromOfflineSupport = () => {\r\n // TODO: database needs to support aborting and should return a IFileRequest\r\n\r\n if (offlineProvider) {\r\n offlineProvider.loadFile(\r\n FileToolsOptions.BaseUrl + url,\r\n (data) => {\r\n if (!aborted && onSuccess) {\r\n onSuccess(data);\r\n }\r\n\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n },\r\n onProgress\r\n ? (event) => {\r\n if (!aborted && onProgress) {\r\n onProgress(event);\r\n }\r\n }\r\n : undefined,\r\n noOfflineSupport,\r\n useArrayBuffer\r\n );\r\n }\r\n };\r\n\r\n offlineProvider.open(loadFromOfflineSupport, noOfflineSupport);\r\n } else {\r\n requestFile();\r\n }\r\n\r\n return fileRequest;\r\n};\r\n\r\n/**\r\n * Checks if the loaded document was accessed via `file:`-Protocol.\r\n * @returns boolean\r\n * @internal\r\n */\r\nexport const IsFileURL = (): boolean => {\r\n return typeof location !== \"undefined\" && location.protocol === \"file:\";\r\n};\r\n\r\n/**\r\n * Test if the given uri is a valid base64 data url\r\n * @param uri The uri to test\r\n * @returns True if the uri is a base64 data url or false otherwise\r\n * @internal\r\n */\r\nexport const IsBase64DataUrl = (uri: string): boolean => {\r\n return Base64DataUrlRegEx.test(uri);\r\n};\r\n\r\nexport const TestBase64DataUrl = (uri: string): { match: boolean; type: string } => {\r\n const results = Base64DataUrlRegEx.exec(uri);\r\n if (results === null || results.length === 0) {\r\n return { match: false, type: \"\" };\r\n } else {\r\n const type = results[0].replace(\"data:\", \"\").replace(\"base64,\", \"\");\r\n return { match: true, type };\r\n }\r\n};\r\n\r\n/**\r\n * Decode the given base64 uri.\r\n * @param uri The uri to decode\r\n * @returns The decoded base64 data.\r\n * @internal\r\n */\r\nexport function DecodeBase64UrlToBinary(uri: string): ArrayBuffer {\r\n return DecodeBase64ToBinary(uri.split(\",\")[1]);\r\n}\r\n\r\n/**\r\n * Decode the given base64 uri into a UTF-8 encoded string.\r\n * @param uri The uri to decode\r\n * @returns The decoded base64 data.\r\n * @internal\r\n */\r\nexport const DecodeBase64UrlToString = (uri: string): string => {\r\n return DecodeBase64ToString(uri.split(\",\")[1]);\r\n};\r\n\r\n/**\r\n * This will be executed automatically for UMD and es5.\r\n * If esm dev wants the side effects to execute they will have to run it manually\r\n * Once we build native modules those need to be exported.\r\n * @internal\r\n */\r\nconst initSideEffects = () => {\r\n ThinEngine._FileToolsLoadImage = LoadImage;\r\n ThinEngine._FileToolsLoadFile = LoadFile;\r\n ShaderProcessor._FileToolsLoadFile = LoadFile;\r\n};\r\n\r\ninitSideEffects();\r\n\r\n// deprecated\r\n\r\n/**\r\n * FileTools defined as any.\r\n * This should not be imported or used in future releases or in any module in the framework\r\n * @internal\r\n * @deprecated import the needed function from fileTools.ts\r\n */\r\nexport let FileTools: {\r\n DecodeBase64UrlToBinary: (uri: string) => ArrayBuffer;\r\n DecodeBase64UrlToString: (uri: string) => string;\r\n DefaultRetryStrategy: any;\r\n BaseUrl: any;\r\n CorsBehavior: any;\r\n PreprocessUrl: any;\r\n IsBase64DataUrl: (uri: string) => boolean;\r\n IsFileURL: () => boolean;\r\n LoadFile: (\r\n fileOrUrl: string | File,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string | undefined) => void,\r\n onProgress?: ((ev: ProgressEvent) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((request?: WebRequest | undefined, exception?: LoadFileError | undefined) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest;\r\n LoadImage: (\r\n input: string | ArrayBuffer | Blob | ArrayBufferView,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string | undefined, exception?: any) => void,\r\n offlineProvider: Nullable,\r\n mimeType?: string | undefined,\r\n imageBitmapOptions?: ImageBitmapOptions | undefined\r\n ) => Nullable;\r\n ReadFile: (\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: ((ev: ProgressEvent) => any) | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: ReadFileError) => void) | undefined\r\n ) => IFileRequest;\r\n RequestFile: (\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, request?: WebRequest | undefined) => void,\r\n onProgress?: ((event: ProgressEvent) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: RequestFileError) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest;\r\n SetCorsBehavior: (url: string | string[], element: { crossOrigin: string | null }) => void;\r\n};\r\n/**\r\n * @param DecodeBase64UrlToBinary\r\n * @param DecodeBase64UrlToString\r\n * @param FileToolsOptions\r\n * @internal\r\n */\r\nexport const _injectLTSFileTools = (\r\n DecodeBase64UrlToBinary: (uri: string) => ArrayBuffer,\r\n DecodeBase64UrlToString: (uri: string) => string,\r\n FileToolsOptions: { DefaultRetryStrategy: any; BaseUrl: any; CorsBehavior: any; PreprocessUrl: any },\r\n IsBase64DataUrl: (uri: string) => boolean,\r\n IsFileURL: () => boolean,\r\n LoadFile: (\r\n fileOrUrl: string | File,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string | undefined) => void,\r\n onProgress?: ((ev: ProgressEvent) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((request?: WebRequest | undefined, exception?: LoadFileError | undefined) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest,\r\n LoadImage: (\r\n input: string | ArrayBuffer | ArrayBufferView | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string | undefined, exception?: any) => void,\r\n offlineProvider: Nullable,\r\n mimeType?: string,\r\n imageBitmapOptions?: ImageBitmapOptions | undefined\r\n ) => Nullable,\r\n ReadFile: (\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: ((ev: ProgressEvent) => any) | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: ReadFileError) => void) | undefined\r\n ) => IFileRequest,\r\n RequestFile: (\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, request?: WebRequest | undefined) => void,\r\n onProgress?: ((event: ProgressEvent) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: RequestFileError) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest,\r\n SetCorsBehavior: (url: string | string[], element: { crossOrigin: string | null }) => void\r\n) => {\r\n /**\r\n * Backwards compatibility.\r\n * @internal\r\n * @deprecated\r\n */\r\n FileTools = {\r\n DecodeBase64UrlToBinary,\r\n DecodeBase64UrlToString,\r\n DefaultRetryStrategy: FileToolsOptions.DefaultRetryStrategy,\r\n BaseUrl: FileToolsOptions.BaseUrl,\r\n CorsBehavior: FileToolsOptions.CorsBehavior,\r\n PreprocessUrl: FileToolsOptions.PreprocessUrl,\r\n IsBase64DataUrl,\r\n IsFileURL,\r\n LoadFile,\r\n LoadImage,\r\n ReadFile,\r\n RequestFile,\r\n SetCorsBehavior,\r\n };\r\n\r\n Object.defineProperty(FileTools, \"DefaultRetryStrategy\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.DefaultRetryStrategy;\r\n },\r\n set: function (this: null, value: (url: string, request: WebRequest, retryIndex: number) => number) {\r\n FileToolsOptions.DefaultRetryStrategy = value;\r\n },\r\n });\r\n\r\n Object.defineProperty(FileTools, \"BaseUrl\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.BaseUrl;\r\n },\r\n set: function (this: null, value: string) {\r\n FileToolsOptions.BaseUrl = value;\r\n },\r\n });\r\n\r\n Object.defineProperty(FileTools, \"PreprocessUrl\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.PreprocessUrl;\r\n },\r\n set: function (this: null, value: (url: string) => string) {\r\n FileToolsOptions.PreprocessUrl = value;\r\n },\r\n });\r\n\r\n Object.defineProperty(FileTools, \"CorsBehavior\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.CorsBehavior;\r\n },\r\n set: function (this: null, value: string | ((url: string | string[]) => string)) {\r\n FileToolsOptions.CorsBehavior = value;\r\n },\r\n });\r\n};\r\n\r\n_injectLTSFileTools(DecodeBase64UrlToBinary, DecodeBase64UrlToString, FileToolsOptions, IsBase64DataUrl, IsFileURL, LoadFile, LoadImage, ReadFile, RequestFile, SetCorsBehavior);\r\n", "/**\r\n * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523\r\n * Be aware Math.random() could cause collisions, but:\r\n * \"All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide\"\r\n * @returns a pseudo random id\r\n */\r\nexport function RandomGUID(): string {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0,\r\n v = c === \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\n/**\r\n * Class used to manipulate GUIDs\r\n */\r\nexport const GUID = {\r\n /**\r\n * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523\r\n * Be aware Math.random() could cause collisions, but:\r\n * \"All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide\"\r\n * @returns a pseudo random id\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n RandomId: RandomGUID,\r\n};\r\n", "import { Logger } from \"./logger\";\r\nimport { GetClass } from \"./typeStore\";\r\n\r\n/**\r\n * Class used to enable instantiation of objects by class name\r\n */\r\nexport class InstantiationTools {\r\n /**\r\n * Use this object to register external classes like custom textures or material\r\n * to allow the loaders to instantiate them\r\n */\r\n public static RegisteredExternalClasses: { [key: string]: Object } = {};\r\n\r\n /**\r\n * Tries to instantiate a new object from a given class name\r\n * @param className defines the class name to instantiate\r\n * @returns the new object or null if the system was not able to do the instantiation\r\n */\r\n public static Instantiate(className: string): any {\r\n if (this.RegisteredExternalClasses && this.RegisteredExternalClasses[className]) {\r\n return this.RegisteredExternalClasses[className];\r\n }\r\n\r\n const internalClass = GetClass(className);\r\n if (internalClass) {\r\n return internalClass;\r\n }\r\n\r\n Logger.Warn(className + \" not found, you may have missed an import.\");\r\n\r\n const arr = className.split(\".\");\r\n\r\n let fn: any = window || this;\r\n for (let i = 0, len = arr.length; i < len; i++) {\r\n fn = fn[arr[i]];\r\n }\r\n\r\n if (typeof fn !== \"function\") {\r\n return null;\r\n }\r\n\r\n return fn;\r\n }\r\n}\r\n", "/**\r\n * Function indicating if a number is an exponent of 2\r\n * @param value defines the value to test\r\n * @returns true if the value is an exponent of 2\r\n */\r\nexport function IsExponentOfTwo(value: number): boolean {\r\n let count = 1;\r\n\r\n do {\r\n count *= 2;\r\n } while (count < value);\r\n\r\n return count === value;\r\n}\r\n\r\n/**\r\n * Interpolates between a and b via alpha\r\n * @param a The lower value (returned when alpha = 0)\r\n * @param b The upper value (returned when alpha = 1)\r\n * @param alpha The interpolation-factor\r\n * @returns The mixed value\r\n */\r\nexport function Mix(a: number, b: number, alpha: number): number {\r\n return a * (1 - alpha) + b * alpha;\r\n}\r\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Nullable } from \"../types\";\r\nimport { Observable } from \"./observable\";\r\nimport { GetDOMTextContent, IsNavigatorAvailable, IsWindowObjectExist } from \"./domManagement\";\r\nimport { Logger } from \"./logger\";\r\nimport { DeepCopier } from \"./deepCopier\";\r\nimport { PrecisionDate } from \"./precisionDate\";\r\nimport { _WarnImport } from \"./devTools\";\r\nimport { WebRequest } from \"./webRequest\";\r\nimport type { IFileRequest } from \"./fileRequest\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { ReadFileError } from \"./fileTools\";\r\nimport {\r\n FileToolsOptions,\r\n DecodeBase64UrlToBinary,\r\n IsBase64DataUrl,\r\n LoadFile as FileToolsLoadFile,\r\n LoadImage as FileToolLoadImage,\r\n ReadFile as FileToolsReadFile,\r\n SetCorsBehavior,\r\n} from \"./fileTools\";\r\nimport type { IOfflineProvider } from \"../Offline/IOfflineProvider\";\r\nimport { TimingTools } from \"./timingTools\";\r\nimport { InstantiationTools } from \"./instantiationTools\";\r\nimport { RandomGUID } from \"./guid\";\r\nimport type { IScreenshotSize } from \"./interfaces/screenshotSize\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { IColor4Like } from \"../Maths/math.like\";\r\nimport { IsExponentOfTwo, Mix } from \"./tools.functions\";\r\n\r\ndeclare function importScripts(...urls: string[]): void;\r\n\r\n/**\r\n * Class containing a set of static utilities functions\r\n */\r\nexport class Tools {\r\n /**\r\n * Gets or sets the base URL to use to load assets\r\n */\r\n public static get BaseUrl() {\r\n return FileToolsOptions.BaseUrl;\r\n }\r\n\r\n public static set BaseUrl(value: string) {\r\n FileToolsOptions.BaseUrl = value;\r\n }\r\n\r\n /**\r\n * This function checks whether a URL is absolute or not.\r\n * It will also detect data and blob URLs\r\n * @param url the url to check\r\n * @returns is the url absolute or relative\r\n */\r\n public static IsAbsoluteUrl(url: string): boolean {\r\n // See https://stackoverflow.com/a/38979205.\r\n\r\n // URL is protocol-relative (= absolute)\r\n if (url.indexOf(\"//\") === 0) {\r\n return true;\r\n }\r\n\r\n // URL has no protocol (= relative)\r\n if (url.indexOf(\"://\") === -1) {\r\n return false;\r\n }\r\n\r\n // URL does not contain a dot, i.e. no TLD (= relative, possibly REST)\r\n if (url.indexOf(\".\") === -1) {\r\n return false;\r\n }\r\n\r\n // URL does not contain a single slash (= relative)\r\n if (url.indexOf(\"/\") === -1) {\r\n return false;\r\n }\r\n\r\n // The first colon comes after the first slash (= relative)\r\n if (url.indexOf(\":\") > url.indexOf(\"/\")) {\r\n return false;\r\n }\r\n\r\n // Protocol is defined before first dot (= absolute)\r\n if (url.indexOf(\"://\") < url.indexOf(\".\")) {\r\n return true;\r\n }\r\n if (url.indexOf(\"data:\") === 0 || url.indexOf(\"blob:\") === 0) {\r\n return true;\r\n }\r\n\r\n // Anything else must be relative\r\n return false;\r\n }\r\n\r\n /**\r\n * Sets the base URL to use to load scripts\r\n */\r\n public static set ScriptBaseUrl(value: string) {\r\n FileToolsOptions.ScriptBaseUrl = value;\r\n }\r\n\r\n public static get ScriptBaseUrl(): string {\r\n return FileToolsOptions.ScriptBaseUrl;\r\n }\r\n\r\n /**\r\n * Sets a preprocessing function to run on a source URL before importing it\r\n * Note that this function will execute AFTER the base URL is appended to the URL\r\n */\r\n public static set ScriptPreprocessUrl(func: (source: string) => string) {\r\n FileToolsOptions.ScriptPreprocessUrl = func;\r\n }\r\n\r\n public static get ScriptPreprocessUrl(): (source: string) => string {\r\n return FileToolsOptions.ScriptPreprocessUrl;\r\n }\r\n\r\n /**\r\n * Enable/Disable Custom HTTP Request Headers globally.\r\n * default = false\r\n * @see CustomRequestHeaders\r\n */\r\n public static UseCustomRequestHeaders = false;\r\n\r\n /**\r\n * Custom HTTP Request Headers to be sent with XMLHttpRequests\r\n * i.e. when loading files, where the server/service expects an Authorization header\r\n */\r\n public static CustomRequestHeaders = WebRequest.CustomRequestHeaders;\r\n\r\n /**\r\n * Gets or sets the retry strategy to apply when an error happens while loading an asset\r\n */\r\n public static get DefaultRetryStrategy() {\r\n return FileToolsOptions.DefaultRetryStrategy;\r\n }\r\n\r\n public static set DefaultRetryStrategy(strategy: (url: string, request: WebRequest, retryIndex: number) => number) {\r\n FileToolsOptions.DefaultRetryStrategy = strategy;\r\n }\r\n\r\n /**\r\n * Default behavior for cors in the application.\r\n * It can be a string if the expected behavior is identical in the entire app.\r\n * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance)\r\n */\r\n public static get CorsBehavior(): string | ((url: string | string[]) => string) {\r\n return FileToolsOptions.CorsBehavior;\r\n }\r\n\r\n public static set CorsBehavior(value: string | ((url: string | string[]) => string)) {\r\n FileToolsOptions.CorsBehavior = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a global variable indicating if fallback texture must be used when a texture cannot be loaded\r\n * @ignorenaming\r\n */\r\n public static get UseFallbackTexture() {\r\n return EngineStore.UseFallbackTexture;\r\n }\r\n\r\n public static set UseFallbackTexture(value: boolean) {\r\n EngineStore.UseFallbackTexture = value;\r\n }\r\n\r\n /**\r\n * Use this object to register external classes like custom textures or material\r\n * to allow the loaders to instantiate them\r\n */\r\n public static get RegisteredExternalClasses() {\r\n return InstantiationTools.RegisteredExternalClasses;\r\n }\r\n\r\n public static set RegisteredExternalClasses(classes: { [key: string]: Object }) {\r\n InstantiationTools.RegisteredExternalClasses = classes;\r\n }\r\n\r\n /**\r\n * Texture content used if a texture cannot loaded\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static get fallbackTexture() {\r\n return EngineStore.FallbackTexture;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static set fallbackTexture(value: string) {\r\n EngineStore.FallbackTexture = value;\r\n }\r\n\r\n /**\r\n * Read the content of a byte array at a specified coordinates (taking in account wrapping)\r\n * @param u defines the coordinate on X axis\r\n * @param v defines the coordinate on Y axis\r\n * @param width defines the width of the source data\r\n * @param height defines the height of the source data\r\n * @param pixels defines the source byte array\r\n * @param color defines the output color\r\n */\r\n public static FetchToRef(u: number, v: number, width: number, height: number, pixels: Uint8Array, color: IColor4Like): void {\r\n const wrappedU = (Math.abs(u) * width) % width | 0;\r\n const wrappedV = (Math.abs(v) * height) % height | 0;\r\n\r\n const position = (wrappedU + wrappedV * width) * 4;\r\n color.r = pixels[position] / 255;\r\n color.g = pixels[position + 1] / 255;\r\n color.b = pixels[position + 2] / 255;\r\n color.a = pixels[position + 3] / 255;\r\n }\r\n\r\n /**\r\n * Interpolates between a and b via alpha\r\n * @param a The lower value (returned when alpha = 0)\r\n * @param b The upper value (returned when alpha = 1)\r\n * @param alpha The interpolation-factor\r\n * @returns The mixed value\r\n */\r\n public static Mix(a: number, b: number, alpha: number): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Tries to instantiate a new object from a given class name\r\n * @param className defines the class name to instantiate\r\n * @returns the new object or null if the system was not able to do the instantiation\r\n */\r\n public static Instantiate(className: string): any {\r\n return InstantiationTools.Instantiate(className);\r\n }\r\n\r\n /**\r\n * Polyfill for setImmediate\r\n * @param action defines the action to execute after the current execution block\r\n */\r\n public static SetImmediate(action: () => void) {\r\n TimingTools.SetImmediate(action);\r\n }\r\n\r\n /**\r\n * Function indicating if a number is an exponent of 2\r\n * @param value defines the value to test\r\n * @returns true if the value is an exponent of 2\r\n */\r\n public static IsExponentOfTwo(value: number): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Returns the nearest 32-bit single precision float representation of a Number\r\n * @param value A Number. If the parameter is of a different type, it will get converted\r\n * to a number or to NaN if it cannot be converted\r\n * @returns number\r\n */\r\n public static FloatRound(value: number): number {\r\n return Math.fround(value);\r\n }\r\n\r\n /**\r\n * Extracts the filename from a path\r\n * @param path defines the path to use\r\n * @returns the filename\r\n */\r\n public static GetFilename(path: string): string {\r\n const index = path.lastIndexOf(\"/\");\r\n if (index < 0) {\r\n return path;\r\n }\r\n\r\n return path.substring(index + 1);\r\n }\r\n\r\n /**\r\n * Extracts the \"folder\" part of a path (everything before the filename).\r\n * @param uri The URI to extract the info from\r\n * @param returnUnchangedIfNoSlash Do not touch the URI if no slashes are present\r\n * @returns The \"folder\" part of the path\r\n */\r\n public static GetFolderPath(uri: string, returnUnchangedIfNoSlash = false): string {\r\n const index = uri.lastIndexOf(\"/\");\r\n if (index < 0) {\r\n if (returnUnchangedIfNoSlash) {\r\n return uri;\r\n }\r\n return \"\";\r\n }\r\n\r\n return uri.substring(0, index + 1);\r\n }\r\n\r\n /**\r\n * Extracts text content from a DOM element hierarchy\r\n * Back Compat only, please use GetDOMTextContent instead.\r\n */\r\n public static GetDOMTextContent = GetDOMTextContent;\r\n\r\n /**\r\n * Convert an angle in radians to degrees\r\n * @param angle defines the angle to convert\r\n * @returns the angle in degrees\r\n */\r\n public static ToDegrees(angle: number): number {\r\n return (angle * 180) / Math.PI;\r\n }\r\n\r\n /**\r\n * Convert an angle in degrees to radians\r\n * @param angle defines the angle to convert\r\n * @returns the angle in radians\r\n */\r\n public static ToRadians(angle: number): number {\r\n return (angle * Math.PI) / 180;\r\n }\r\n\r\n /**\r\n * Smooth angle changes (kind of low-pass filter), in particular for device orientation \"shaking\"\r\n * Use trigonometric functions to avoid discontinuity (0/360, -180/180)\r\n * @param previousAngle defines last angle value, in degrees\r\n * @param newAngle defines new angle value, in degrees\r\n * @param smoothFactor defines smoothing sensitivity; min 0: no smoothing, max 1: new data ignored\r\n * @returns the angle in degrees\r\n */\r\n public static SmoothAngleChange(previousAngle: number, newAngle: number, smoothFactor = 0.9): number {\r\n const previousAngleRad = this.ToRadians(previousAngle);\r\n const newAngleRad = this.ToRadians(newAngle);\r\n return this.ToDegrees(\r\n Math.atan2(\r\n (1 - smoothFactor) * Math.sin(newAngleRad) + smoothFactor * Math.sin(previousAngleRad),\r\n (1 - smoothFactor) * Math.cos(newAngleRad) + smoothFactor * Math.cos(previousAngleRad)\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Returns an array if obj is not an array\r\n * @param obj defines the object to evaluate as an array\r\n * @param allowsNullUndefined defines a boolean indicating if obj is allowed to be null or undefined\r\n * @returns either obj directly if obj is an array or a new array containing obj\r\n */\r\n public static MakeArray(obj: any, allowsNullUndefined?: boolean): Nullable> {\r\n if (allowsNullUndefined !== true && (obj === undefined || obj == null)) {\r\n return null;\r\n }\r\n\r\n return Array.isArray(obj) ? obj : [obj];\r\n }\r\n\r\n /**\r\n * Gets the pointer prefix to use\r\n * @param engine defines the engine we are finding the prefix for\r\n * @returns \"pointer\" if touch is enabled. Else returns \"mouse\"\r\n */\r\n public static GetPointerPrefix(engine: Engine): string {\r\n let eventPrefix = \"pointer\";\r\n\r\n // Check if pointer events are supported\r\n if (IsWindowObjectExist() && !window.PointerEvent) {\r\n eventPrefix = \"mouse\";\r\n }\r\n\r\n // Special Fallback MacOS Safari...\r\n if (\r\n engine._badDesktopOS &&\r\n !engine._badOS &&\r\n // And not ipad pros who claim to be macs...\r\n !(document && \"ontouchend\" in document)\r\n ) {\r\n eventPrefix = \"mouse\";\r\n }\r\n\r\n return eventPrefix;\r\n }\r\n\r\n /**\r\n * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element.\r\n * @param url define the url we are trying\r\n * @param element define the dom element where to configure the cors policy\r\n * @param element.crossOrigin\r\n */\r\n public static SetCorsBehavior(url: string | string[], element: { crossOrigin: string | null }): void {\r\n SetCorsBehavior(url, element);\r\n }\r\n\r\n /**\r\n * Sets the referrerPolicy behavior on a dom element.\r\n * @param referrerPolicy define the referrer policy to use\r\n * @param element define the dom element where to configure the referrer policy\r\n * @param element.referrerPolicy\r\n */\r\n public static SetReferrerPolicyBehavior(referrerPolicy: Nullable, element: { referrerPolicy: string | null }): void {\r\n element.referrerPolicy = referrerPolicy;\r\n }\r\n\r\n // External files\r\n\r\n /**\r\n * Removes unwanted characters from an url\r\n * @param url defines the url to clean\r\n * @returns the cleaned url\r\n */\r\n public static CleanUrl(url: string): string {\r\n url = url.replace(/#/gm, \"%23\");\r\n return url;\r\n }\r\n\r\n /**\r\n * Gets or sets a function used to pre-process url before using them to load assets\r\n */\r\n public static get PreprocessUrl() {\r\n return FileToolsOptions.PreprocessUrl;\r\n }\r\n\r\n public static set PreprocessUrl(processor: (url: string) => string) {\r\n FileToolsOptions.PreprocessUrl = processor;\r\n }\r\n\r\n /**\r\n * Loads an image as an HTMLImageElement.\r\n * @param input url string, ArrayBuffer, or Blob to load\r\n * @param onLoad callback called when the image successfully loads\r\n * @param onError callback called when the image fails to load\r\n * @param offlineProvider offline provider for caching\r\n * @param mimeType optional mime type\r\n * @param imageBitmapOptions optional the options to use when creating an ImageBitmap\r\n * @returns the HTMLImageElement of the loaded image\r\n */\r\n public static LoadImage(\r\n input: string | ArrayBuffer | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string, exception?: any) => void,\r\n offlineProvider: Nullable,\r\n mimeType?: string,\r\n imageBitmapOptions?: ImageBitmapOptions\r\n ): Nullable {\r\n return FileToolLoadImage(input, onLoad, onError, offlineProvider, mimeType, imageBitmapOptions);\r\n }\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url url string, ArrayBuffer, or Blob to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @returns a file request object\r\n */\r\n public static LoadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (data: any) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: any) => void\r\n ): IFileRequest {\r\n return FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);\r\n }\r\n\r\n // Note that this must come first since useArrayBuffer defaults to true below.\r\n public static LoadFileAsync(url: string, useArrayBuffer?: true): Promise;\r\n public static LoadFileAsync(url: string, useArrayBuffer?: false): Promise;\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url the file url to load\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @returns a promise containing an ArrayBuffer corresponding to the loaded file\r\n */\r\n public static LoadFileAsync(url: string, useArrayBuffer = true): Promise {\r\n return new Promise((resolve, reject) => {\r\n FileToolsLoadFile(\r\n url,\r\n (data) => {\r\n resolve(data);\r\n },\r\n undefined,\r\n undefined,\r\n useArrayBuffer,\r\n (request, exception) => {\r\n reject(exception);\r\n }\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _DefaultCdnUrl = \"https://cdn.babylonjs.com\";\r\n\r\n /**\r\n * Get a script URL including preprocessing\r\n * @param scriptUrl the script Url to process\r\n * @param forceAbsoluteUrl force the script to be an absolute url (adding the current base url if necessary)\r\n * @returns a modified URL to use\r\n */\r\n public static GetBabylonScriptURL(scriptUrl: Nullable, forceAbsoluteUrl?: boolean): string {\r\n if (!scriptUrl) {\r\n return \"\";\r\n }\r\n // if the base URL was set, and the script Url is an absolute path change the default path\r\n if (Tools.ScriptBaseUrl && scriptUrl.startsWith(Tools._DefaultCdnUrl)) {\r\n // change the default host, which is https://cdn.babylonjs.com with the one defined\r\n // make sure no trailing slash is present\r\n\r\n const baseUrl = Tools.ScriptBaseUrl[Tools.ScriptBaseUrl.length - 1] === \"/\" ? Tools.ScriptBaseUrl.substring(0, Tools.ScriptBaseUrl.length - 1) : Tools.ScriptBaseUrl;\r\n scriptUrl = scriptUrl.replace(Tools._DefaultCdnUrl, baseUrl);\r\n }\r\n\r\n // run the preprocessor\r\n scriptUrl = Tools.ScriptPreprocessUrl(scriptUrl);\r\n\r\n if (forceAbsoluteUrl) {\r\n scriptUrl = Tools.GetAbsoluteUrl(scriptUrl);\r\n }\r\n\r\n return scriptUrl;\r\n }\r\n\r\n /**\r\n * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the\r\n * content of this file is added into a new script element, attached to the DOM (body element)\r\n * @param scriptUrl defines the url of the script to load\r\n * @param onSuccess defines the callback called when the script is loaded\r\n * @param onError defines the callback to call if an error occurs\r\n * @param scriptId defines the id of the script element\r\n */\r\n public static LoadBabylonScript(scriptUrl: string, onSuccess: () => void, onError?: (message?: string, exception?: any) => void, scriptId?: string) {\r\n scriptUrl = Tools.GetBabylonScriptURL(scriptUrl);\r\n Tools.LoadScript(scriptUrl, onSuccess, onError);\r\n }\r\n\r\n /**\r\n * Load an asynchronous script (identified by an url). When the url returns, the\r\n * content of this file is added into a new script element, attached to the DOM (body element)\r\n * @param scriptUrl defines the url of the script to laod\r\n * @returns a promise request object\r\n */\r\n public static LoadBabylonScriptAsync(scriptUrl: string): Promise {\r\n scriptUrl = Tools.GetBabylonScriptURL(scriptUrl);\r\n return Tools.LoadScriptAsync(scriptUrl);\r\n }\r\n\r\n /**\r\n * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the\r\n * content of this file is added into a new script element, attached to the DOM (body element)\r\n * @param scriptUrl defines the url of the script to load\r\n * @param onSuccess defines the callback called when the script is loaded\r\n * @param onError defines the callback to call if an error occurs\r\n * @param scriptId defines the id of the script element\r\n */\r\n public static LoadScript(scriptUrl: string, onSuccess: () => void, onError?: (message?: string, exception?: any) => void, scriptId?: string) {\r\n if (typeof importScripts === \"function\") {\r\n try {\r\n importScripts(scriptUrl);\r\n onSuccess();\r\n } catch (e) {\r\n onError?.(`Unable to load script '${scriptUrl}' in worker`, e);\r\n }\r\n return;\r\n } else if (!IsWindowObjectExist()) {\r\n onError?.(`Cannot load script '${scriptUrl}' outside of a window or a worker`);\r\n return;\r\n }\r\n const head = document.getElementsByTagName(\"head\")[0];\r\n const script = document.createElement(\"script\");\r\n script.setAttribute(\"type\", \"text/javascript\");\r\n script.setAttribute(\"src\", scriptUrl);\r\n if (scriptId) {\r\n script.id = scriptId;\r\n }\r\n\r\n script.onload = () => {\r\n if (onSuccess) {\r\n onSuccess();\r\n }\r\n };\r\n\r\n script.onerror = (e) => {\r\n if (onError) {\r\n onError(`Unable to load script '${scriptUrl}'`, e);\r\n }\r\n };\r\n\r\n head.appendChild(script);\r\n }\r\n\r\n /**\r\n * Load an asynchronous script (identified by an url). When the url returns, the\r\n * content of this file is added into a new script element, attached to the DOM (body element)\r\n * @param scriptUrl defines the url of the script to load\r\n * @param scriptId defines the id of the script element\r\n * @returns a promise request object\r\n */\r\n public static LoadScriptAsync(scriptUrl: string, scriptId?: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n this.LoadScript(\r\n scriptUrl,\r\n () => {\r\n resolve();\r\n },\r\n (message, exception) => {\r\n reject(exception || new Error(message));\r\n },\r\n scriptId\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Loads a file from a blob\r\n * @param fileToLoad defines the blob to use\r\n * @param callback defines the callback to call when data is loaded\r\n * @param progressCallback defines the callback to call during loading process\r\n * @returns a file request object\r\n */\r\n public static ReadFileAsDataURL(fileToLoad: Blob, callback: (data: any) => void, progressCallback: (ev: ProgressEvent) => any): IFileRequest {\r\n const reader = new FileReader();\r\n\r\n const request: IFileRequest = {\r\n onCompleteObservable: new Observable(),\r\n abort: () => reader.abort(),\r\n };\r\n\r\n reader.onloadend = () => {\r\n request.onCompleteObservable.notifyObservers(request);\r\n };\r\n\r\n reader.onload = (e) => {\r\n //target doesn't have result from ts 1.3\r\n callback((e.target)[\"result\"]);\r\n };\r\n\r\n reader.onprogress = progressCallback;\r\n\r\n reader.readAsDataURL(fileToLoad);\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Reads a file from a File object\r\n * @param file defines the file to load\r\n * @param onSuccess defines the callback to call when data is loaded\r\n * @param onProgress defines the callback to call during loading process\r\n * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer\r\n * @param onError defines the callback to call when an error occurs\r\n * @returns a file request object\r\n */\r\n public static ReadFile(\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: (ev: ProgressEvent) => any,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: ReadFileError) => void\r\n ): IFileRequest {\r\n return FileToolsReadFile(file, onSuccess, onProgress, useArrayBuffer, onError);\r\n }\r\n\r\n /**\r\n * Creates a data url from a given string content\r\n * @param content defines the content to convert\r\n * @returns the new data url link\r\n */\r\n public static FileAsURL(content: string): string {\r\n const fileBlob = new Blob([content]);\r\n const url = window.URL;\r\n const link: string = url.createObjectURL(fileBlob);\r\n return link;\r\n }\r\n\r\n /**\r\n * Format the given number to a specific decimal format\r\n * @param value defines the number to format\r\n * @param decimals defines the number of decimals to use\r\n * @returns the formatted string\r\n */\r\n public static Format(value: number, decimals = 2): string {\r\n return value.toFixed(decimals);\r\n }\r\n\r\n /**\r\n * Tries to copy an object by duplicating every property\r\n * @param source defines the source object\r\n * @param destination defines the target object\r\n * @param doNotCopyList defines a list of properties to avoid\r\n * @param mustCopyList defines a list of properties to copy (even if they start with _)\r\n */\r\n public static DeepCopy(source: any, destination: any, doNotCopyList?: string[], mustCopyList?: string[]): void {\r\n DeepCopier.DeepCopy(source, destination, doNotCopyList, mustCopyList);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the given object has no own property\r\n * @param obj defines the object to test\r\n * @returns true if object has no own property\r\n */\r\n public static IsEmpty(obj: any): boolean {\r\n for (const i in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, i)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Function used to register events at window level\r\n * @param windowElement defines the Window object to use\r\n * @param events defines the events to register\r\n */\r\n public static RegisterTopRootEvents(windowElement: Window, events: { name: string; handler: Nullable<(e: FocusEvent) => any> }[]): void {\r\n for (let index = 0; index < events.length; index++) {\r\n const event = events[index];\r\n windowElement.addEventListener(event.name, event.handler, false);\r\n\r\n try {\r\n if (window.parent) {\r\n window.parent.addEventListener(event.name, event.handler, false);\r\n }\r\n } catch (e) {\r\n // Silently fails...\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Function used to unregister events from window level\r\n * @param windowElement defines the Window object to use\r\n * @param events defines the events to unregister\r\n */\r\n public static UnregisterTopRootEvents(windowElement: Window, events: { name: string; handler: Nullable<(e: FocusEvent) => any> }[]): void {\r\n for (let index = 0; index < events.length; index++) {\r\n const event = events[index];\r\n windowElement.removeEventListener(event.name, event.handler);\r\n\r\n try {\r\n if (windowElement.parent) {\r\n windowElement.parent.removeEventListener(event.name, event.handler);\r\n }\r\n } catch (e) {\r\n // Silently fails...\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Dumps the current bound framebuffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param engine defines the hosting engine\r\n * @param successCallback defines the callback triggered once the data are available\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns a void promise\r\n */\r\n public static async DumpFramebuffer(\r\n width: number,\r\n height: number,\r\n engine: Engine,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n quality?: number\r\n ) {\r\n throw _WarnImport(\"DumpTools\");\r\n }\r\n\r\n /**\r\n * Dumps an array buffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param data the data array\r\n * @param successCallback defines the callback triggered once the data are available\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param invertY true to invert the picture in the Y dimension\r\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n public static DumpData(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n successCallback?: (data: string | ArrayBuffer) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n invertY = false,\r\n toArrayBuffer = false,\r\n quality?: number\r\n ) {\r\n throw _WarnImport(\"DumpTools\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Dumps an array buffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param data the data array\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param invertY true to invert the picture in the Y dimension\r\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns a promise that resolve to the final data\r\n */\r\n public static DumpDataAsync(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n invertY = false,\r\n toArrayBuffer = false,\r\n quality?: number\r\n ): Promise {\r\n throw _WarnImport(\"DumpTools\");\r\n }\r\n\r\n private static _IsOffScreenCanvas(canvas: HTMLCanvasElement | OffscreenCanvas): canvas is OffscreenCanvas {\r\n return (canvas as OffscreenCanvas).convertToBlob !== undefined;\r\n }\r\n\r\n /**\r\n * Converts the canvas data to blob.\r\n * This acts as a polyfill for browsers not supporting the to blob function.\r\n * @param canvas Defines the canvas to extract the data from (can be an offscreen canvas)\r\n * @param successCallback Defines the callback triggered once the data are available\r\n * @param mimeType Defines the mime type of the result\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n static ToBlob(canvas: HTMLCanvasElement | OffscreenCanvas, successCallback: (blob: Nullable) => void, mimeType = \"image/png\", quality?: number): void {\r\n // We need HTMLCanvasElement.toBlob for HD screenshots\r\n if (!Tools._IsOffScreenCanvas(canvas) && !canvas.toBlob) {\r\n // low performance polyfill based on toDataURL (https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob)\r\n canvas.toBlob = function (callback, type, quality) {\r\n setTimeout(() => {\r\n const binStr = atob(this.toDataURL(type, quality).split(\",\")[1]),\r\n len = binStr.length,\r\n arr = new Uint8Array(len);\r\n\r\n for (let i = 0; i < len; i++) {\r\n arr[i] = binStr.charCodeAt(i);\r\n }\r\n callback(new Blob([arr]));\r\n });\r\n };\r\n }\r\n if (Tools._IsOffScreenCanvas(canvas)) {\r\n canvas\r\n .convertToBlob({\r\n type: mimeType,\r\n quality,\r\n })\r\n .then((blob) => successCallback(blob));\r\n } else {\r\n canvas.toBlob(\r\n function (blob) {\r\n successCallback(blob);\r\n },\r\n mimeType,\r\n quality\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Download a Blob object\r\n * @param blob the Blob object\r\n * @param fileName the file name to download\r\n */\r\n static DownloadBlob(blob: Blob, fileName?: string) {\r\n //Creating a link if the browser have the download attribute on the a tag, to automatically start download generated image.\r\n if (\"download\" in document.createElement(\"a\")) {\r\n if (!fileName) {\r\n const date = new Date();\r\n const stringDate =\r\n (date.getFullYear() + \"-\" + (date.getMonth() + 1)).slice(2) + \"-\" + date.getDate() + \"_\" + date.getHours() + \"-\" + (\"0\" + date.getMinutes()).slice(-2);\r\n fileName = \"screenshot_\" + stringDate + \".png\";\r\n }\r\n Tools.Download(blob, fileName);\r\n } else {\r\n if (blob && typeof URL !== \"undefined\") {\r\n const url = URL.createObjectURL(blob);\r\n\r\n const newWindow = window.open(\"\");\r\n if (!newWindow) {\r\n return;\r\n }\r\n const img = newWindow.document.createElement(\"img\");\r\n img.onload = function () {\r\n // no longer need to read the blob so it's revoked\r\n URL.revokeObjectURL(url);\r\n };\r\n img.src = url;\r\n newWindow.document.body.appendChild(img);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Encodes the canvas data to base 64, or automatically downloads the result if `fileName` is defined.\r\n * @param canvas The canvas to get the data from, which can be an offscreen canvas.\r\n * @param successCallback The callback which is triggered once the data is available. If `fileName` is defined, the callback will be invoked after the download occurs, and the `data` argument will be an empty string.\r\n * @param mimeType The mime type of the result.\r\n * @param fileName The name of the file to download. If defined, the result will automatically be downloaded. If not defined, and `successCallback` is also not defined, the result will automatically be downloaded with an auto-generated file name.\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n static EncodeScreenshotCanvasData(\r\n canvas: HTMLCanvasElement | OffscreenCanvas,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n quality?: number\r\n ): void {\r\n if (typeof fileName === \"string\" || !successCallback) {\r\n this.ToBlob(\r\n canvas,\r\n function (blob) {\r\n if (blob) {\r\n Tools.DownloadBlob(blob, fileName);\r\n }\r\n if (successCallback) {\r\n successCallback(\"\");\r\n }\r\n },\r\n mimeType,\r\n quality\r\n );\r\n } else if (successCallback) {\r\n if (Tools._IsOffScreenCanvas(canvas)) {\r\n canvas\r\n .convertToBlob({\r\n type: mimeType,\r\n quality,\r\n })\r\n .then((blob) => {\r\n const reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onloadend = () => {\r\n const base64data = reader.result;\r\n successCallback(base64data as string);\r\n };\r\n });\r\n return;\r\n }\r\n const base64Image = canvas.toDataURL(mimeType, quality);\r\n successCallback(base64Image);\r\n }\r\n }\r\n\r\n /**\r\n * Downloads a blob in the browser\r\n * @param blob defines the blob to download\r\n * @param fileName defines the name of the downloaded file\r\n */\r\n public static Download(blob: Blob, fileName: string): void {\r\n if (typeof URL === \"undefined\") {\r\n return;\r\n }\r\n\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement(\"a\");\r\n document.body.appendChild(a);\r\n a.style.display = \"none\";\r\n a.href = url;\r\n a.download = fileName;\r\n a.addEventListener(\"click\", () => {\r\n if (a.parentElement) {\r\n a.parentElement.removeChild(a);\r\n }\r\n });\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * Will return the right value of the noPreventDefault variable\r\n * Needed to keep backwards compatibility to the old API.\r\n *\r\n * @param args arguments passed to the attachControl function\r\n * @returns the correct value for noPreventDefault\r\n */\r\n public static BackCompatCameraNoPreventDefault(args: IArguments): boolean {\r\n // is it used correctly?\r\n if (typeof args[0] === \"boolean\") {\r\n return args[0];\r\n } else if (typeof args[1] === \"boolean\") {\r\n return args[1];\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Captures a screenshot of the current rendering\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param successCallback defines the callback receives a single parameter which contains the\r\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\r\n * src parameter of an to display it\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param forceDownload force the system to download the image even if a successCallback is provided\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static CreateScreenshot(\r\n engine: Engine,\r\n camera: Camera,\r\n size: IScreenshotSize | number,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n forceDownload = false,\r\n quality?: number\r\n ): void {\r\n throw _WarnImport(\"ScreenshotTools\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Captures a screenshot of the current rendering\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an to display it\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static CreateScreenshotAsync(engine: Engine, camera: Camera, size: IScreenshotSize | number, mimeType = \"image/png\", quality?: number): Promise {\r\n throw _WarnImport(\"ScreenshotTools\");\r\n }\r\n\r\n /**\r\n * Generates an image screenshot from the specified camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine The engine to use for rendering\r\n * @param camera The camera to use for rendering\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param successCallback The callback receives a single parameter which contains the\r\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\r\n * src parameter of an to display it\r\n * @param mimeType The MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param samples Texture samples (default: 1)\r\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\r\n * @param fileName A name for for the downloaded file.\r\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\r\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\r\n * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static CreateScreenshotUsingRenderTarget(\r\n engine: Engine,\r\n camera: Camera,\r\n size: IScreenshotSize | number,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n samples = 1,\r\n antialiasing = false,\r\n fileName?: string,\r\n renderSprites = false,\r\n enableStencilBuffer = false,\r\n useLayerMask = true,\r\n quality?: number\r\n ): void {\r\n throw _WarnImport(\"ScreenshotTools\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Generates an image screenshot from the specified camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine The engine to use for rendering\r\n * @param camera The camera to use for rendering\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param mimeType The MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param samples Texture samples (default: 1)\r\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\r\n * @param fileName A name for for the downloaded file.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\r\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\r\n * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * to the src parameter of an to display it\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static CreateScreenshotUsingRenderTargetAsync(\r\n engine: Engine,\r\n camera: Camera,\r\n size: IScreenshotSize | number,\r\n mimeType = \"image/png\",\r\n samples = 1,\r\n antialiasing = false,\r\n fileName?: string,\r\n renderSprites = false,\r\n enableStencilBuffer = false,\r\n useLayerMask = true,\r\n quality?: number\r\n ): Promise {\r\n throw _WarnImport(\"ScreenshotTools\");\r\n }\r\n\r\n /**\r\n * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523\r\n * Be aware Math.random() could cause collisions, but:\r\n * \"All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide\"\r\n * @returns a pseudo random id\r\n */\r\n public static RandomId(): string {\r\n return RandomGUID();\r\n }\r\n\r\n /**\r\n * Test if the given uri is a base64 string\r\n * @deprecated Please use FileTools.IsBase64DataUrl instead.\r\n * @param uri The uri to test\r\n * @returns True if the uri is a base64 string or false otherwise\r\n */\r\n public static IsBase64(uri: string): boolean {\r\n return IsBase64DataUrl(uri);\r\n }\r\n\r\n /**\r\n * Decode the given base64 uri.\r\n * @deprecated Please use FileTools.DecodeBase64UrlToBinary instead.\r\n * @param uri The uri to decode\r\n * @returns The decoded base64 data.\r\n */\r\n public static DecodeBase64(uri: string): ArrayBuffer {\r\n return DecodeBase64UrlToBinary(uri);\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check, jsdoc/require-param\r\n /**\r\n * @returns the absolute URL of a given (relative) url\r\n */\r\n public static GetAbsoluteUrl: (url: string) => string =\r\n typeof document === \"object\"\r\n ? (url) => {\r\n const a = document.createElement(\"a\");\r\n a.href = url;\r\n return a.href;\r\n }\r\n : typeof URL === \"function\" && typeof location === \"object\"\r\n ? (url) => new URL(url, location.origin).href\r\n : () => {\r\n throw new Error(\"Unable to get absolute URL. Override BABYLON.Tools.GetAbsoluteUrl to a custom implementation for the current context.\");\r\n };\r\n\r\n // Logs\r\n /**\r\n * No log\r\n */\r\n public static readonly NoneLogLevel = Logger.NoneLogLevel;\r\n /**\r\n * Only message logs\r\n */\r\n public static readonly MessageLogLevel = Logger.MessageLogLevel;\r\n /**\r\n * Only warning logs\r\n */\r\n public static readonly WarningLogLevel = Logger.WarningLogLevel;\r\n /**\r\n * Only error logs\r\n */\r\n public static readonly ErrorLogLevel = Logger.ErrorLogLevel;\r\n /**\r\n * All logs\r\n */\r\n public static readonly AllLogLevel = Logger.AllLogLevel;\r\n\r\n /**\r\n * Gets a value indicating the number of loading errors\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static get errorsCount(): number {\r\n return Logger.errorsCount;\r\n }\r\n\r\n /**\r\n * Callback called when a new log is added\r\n */\r\n public static OnNewCacheEntry: (entry: string) => void;\r\n\r\n /**\r\n * Log a message to the console\r\n * @param message defines the message to log\r\n */\r\n public static Log(message: string): void {\r\n Logger.Log(message);\r\n }\r\n\r\n /**\r\n * Write a warning message to the console\r\n * @param message defines the message to log\r\n */\r\n public static Warn(message: string): void {\r\n Logger.Warn(message);\r\n }\r\n\r\n /**\r\n * Write an error message to the console\r\n * @param message defines the message to log\r\n */\r\n public static Error(message: string): void {\r\n Logger.Error(message);\r\n }\r\n\r\n /**\r\n * Gets current log cache (list of logs)\r\n */\r\n public static get LogCache(): string {\r\n return Logger.LogCache;\r\n }\r\n\r\n /**\r\n * Clears the log cache\r\n */\r\n public static ClearLogCache(): void {\r\n Logger.ClearLogCache();\r\n }\r\n\r\n /**\r\n * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel)\r\n */\r\n public static set LogLevels(level: number) {\r\n Logger.LogLevels = level;\r\n }\r\n\r\n /**\r\n * Checks if the window object exists\r\n * Back Compat only, please use IsWindowObjectExist instead.\r\n */\r\n public static IsWindowObjectExist = IsWindowObjectExist;\r\n\r\n // Performances\r\n\r\n /**\r\n * No performance log\r\n */\r\n public static readonly PerformanceNoneLogLevel = 0;\r\n /**\r\n * Use user marks to log performance\r\n */\r\n public static readonly PerformanceUserMarkLogLevel = 1;\r\n /**\r\n * Log performance to the console\r\n */\r\n public static readonly PerformanceConsoleLogLevel = 2;\r\n\r\n private static _Performance: Performance;\r\n\r\n /**\r\n * Sets the current performance log level\r\n */\r\n public static set PerformanceLogLevel(level: number) {\r\n if ((level & Tools.PerformanceUserMarkLogLevel) === Tools.PerformanceUserMarkLogLevel) {\r\n Tools.StartPerformanceCounter = Tools._StartUserMark;\r\n Tools.EndPerformanceCounter = Tools._EndUserMark;\r\n return;\r\n }\r\n\r\n if ((level & Tools.PerformanceConsoleLogLevel) === Tools.PerformanceConsoleLogLevel) {\r\n Tools.StartPerformanceCounter = Tools._StartPerformanceConsole;\r\n Tools.EndPerformanceCounter = Tools._EndPerformanceConsole;\r\n return;\r\n }\r\n\r\n Tools.StartPerformanceCounter = Tools._StartPerformanceCounterDisabled;\r\n Tools.EndPerformanceCounter = Tools._EndPerformanceCounterDisabled;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private static _StartPerformanceCounterDisabled(counterName: string, condition?: boolean): void {}\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private static _EndPerformanceCounterDisabled(counterName: string, condition?: boolean): void {}\r\n\r\n private static _StartUserMark(counterName: string, condition = true): void {\r\n if (!Tools._Performance) {\r\n if (!IsWindowObjectExist()) {\r\n return;\r\n }\r\n Tools._Performance = window.performance;\r\n }\r\n\r\n if (!condition || !Tools._Performance.mark) {\r\n return;\r\n }\r\n Tools._Performance.mark(counterName + \"-Begin\");\r\n }\r\n\r\n private static _EndUserMark(counterName: string, condition = true): void {\r\n if (!condition || !Tools._Performance.mark) {\r\n return;\r\n }\r\n Tools._Performance.mark(counterName + \"-End\");\r\n Tools._Performance.measure(counterName, counterName + \"-Begin\", counterName + \"-End\");\r\n }\r\n\r\n private static _StartPerformanceConsole(counterName: string, condition = true): void {\r\n if (!condition) {\r\n return;\r\n }\r\n\r\n Tools._StartUserMark(counterName, condition);\r\n\r\n if (console.time) {\r\n console.time(counterName);\r\n }\r\n }\r\n\r\n private static _EndPerformanceConsole(counterName: string, condition = true): void {\r\n if (!condition) {\r\n return;\r\n }\r\n\r\n Tools._EndUserMark(counterName, condition);\r\n\r\n console.timeEnd(counterName);\r\n }\r\n\r\n /**\r\n * Starts a performance counter\r\n */\r\n public static StartPerformanceCounter: (counterName: string, condition?: boolean) => void = Tools._StartPerformanceCounterDisabled;\r\n\r\n /**\r\n * Ends a specific performance counter\r\n */\r\n public static EndPerformanceCounter: (counterName: string, condition?: boolean) => void = Tools._EndPerformanceCounterDisabled;\r\n\r\n /**\r\n * Gets either window.performance.now() if supported or Date.now() else\r\n */\r\n public static get Now(): number {\r\n return PrecisionDate.Now;\r\n }\r\n\r\n /**\r\n * This method will return the name of the class used to create the instance of the given object.\r\n * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator.\r\n * @param object the object to get the class name from\r\n * @param isType defines if the object is actually a type\r\n * @returns the name of the class, will be \"object\" for a custom data type not using the @className decorator\r\n */\r\n public static GetClassName(object: any, isType = false): string {\r\n let name = null;\r\n\r\n if (!isType && object.getClassName) {\r\n name = object.getClassName();\r\n } else {\r\n if (object instanceof Object) {\r\n const classObj = isType ? object : Object.getPrototypeOf(object);\r\n name = classObj.constructor[\"__bjsclassName__\"];\r\n }\r\n if (!name) {\r\n name = typeof object;\r\n }\r\n }\r\n return name;\r\n }\r\n\r\n /**\r\n * Gets the first element of an array satisfying a given predicate\r\n * @param array defines the array to browse\r\n * @param predicate defines the predicate to use\r\n * @returns null if not found or the element\r\n */\r\n public static First(array: Array, predicate: (item: T) => boolean): Nullable {\r\n for (const el of array) {\r\n if (predicate(el)) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * This method will return the name of the full name of the class, including its owning module (if any).\r\n * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator or implementing a method getClassName():string (in which case the module won't be specified).\r\n * @param object the object to get the class name from\r\n * @param isType defines if the object is actually a type\r\n * @returns a string that can have two forms: \"moduleName.className\" if module was specified when the class' Name was registered or \"className\" if there was not module specified.\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static getFullClassName(object: any, isType = false): Nullable {\r\n let className = null;\r\n let moduleName = null;\r\n\r\n if (!isType && object.getClassName) {\r\n className = object.getClassName();\r\n } else {\r\n if (object instanceof Object) {\r\n const classObj = isType ? object : Object.getPrototypeOf(object);\r\n className = classObj.constructor[\"__bjsclassName__\"];\r\n moduleName = classObj.constructor[\"__bjsmoduleName__\"];\r\n }\r\n if (!className) {\r\n className = typeof object;\r\n }\r\n }\r\n\r\n if (!className) {\r\n return null;\r\n }\r\n\r\n return (moduleName != null ? moduleName + \".\" : \"\") + className;\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves after the given amount of time.\r\n * @param delay Number of milliseconds to delay\r\n * @returns Promise that resolves after the given amount of time\r\n */\r\n public static DelayAsync(delay: number): Promise {\r\n return new Promise((resolve) => {\r\n setTimeout(() => {\r\n resolve();\r\n }, delay);\r\n });\r\n }\r\n\r\n /**\r\n * Utility function to detect if the current user agent is Safari\r\n * @returns whether or not the current user agent is safari\r\n */\r\n public static IsSafari(): boolean {\r\n if (!IsNavigatorAvailable()) {\r\n return false;\r\n }\r\n\r\n return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n }\r\n}\r\n\r\n/**\r\n * Use this className as a decorator on a given class definition to add it a name and optionally its module.\r\n * You can then use the Tools.getClassName(obj) on an instance to retrieve its class name.\r\n * This method is the only way to get it done in all cases, even if the .js file declaring the class is minified\r\n * @param name The name of the class, case should be preserved\r\n * @param module The name of the Module hosting the class, optional, but strongly recommended to specify if possible. Case should be preserved.\r\n * @returns a decorator function to apply on the class definition.\r\n */\r\nexport function className(name: string, module?: string): (target: Object) => void {\r\n return (target: Object) => {\r\n (target)[\"__bjsclassName__\"] = name;\r\n (target)[\"__bjsmoduleName__\"] = module != null ? module : null;\r\n };\r\n}\r\n\r\n/**\r\n * An implementation of a loop for asynchronous functions.\r\n */\r\nexport class AsyncLoop {\r\n /**\r\n * Defines the current index of the loop.\r\n */\r\n public index: number;\r\n private _done: boolean;\r\n private _fn: (asyncLoop: AsyncLoop) => void;\r\n private _successCallback: () => void;\r\n\r\n /**\r\n * Constructor.\r\n * @param iterations the number of iterations.\r\n * @param func the function to run each iteration\r\n * @param successCallback the callback that will be called upon successful execution\r\n * @param offset starting offset.\r\n */\r\n constructor(\r\n /**\r\n * Defines the number of iterations for the loop\r\n */\r\n public iterations: number,\r\n func: (asyncLoop: AsyncLoop) => void,\r\n successCallback: () => void,\r\n offset = 0\r\n ) {\r\n this.index = offset - 1;\r\n this._done = false;\r\n this._fn = func;\r\n this._successCallback = successCallback;\r\n }\r\n\r\n /**\r\n * Execute the next iteration. Must be called after the last iteration was finished.\r\n */\r\n public executeNext(): void {\r\n if (!this._done) {\r\n if (this.index + 1 < this.iterations) {\r\n ++this.index;\r\n this._fn(this);\r\n } else {\r\n this.breakLoop();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Break the loop and run the success callback.\r\n */\r\n public breakLoop(): void {\r\n this._done = true;\r\n this._successCallback();\r\n }\r\n\r\n /**\r\n * Create and run an async loop.\r\n * @param iterations the number of iterations.\r\n * @param fn the function to run each iteration\r\n * @param successCallback the callback that will be called upon successful execution\r\n * @param offset starting offset.\r\n * @returns the created async loop object\r\n */\r\n public static Run(iterations: number, fn: (asyncLoop: AsyncLoop) => void, successCallback: () => void, offset = 0): AsyncLoop {\r\n const loop = new AsyncLoop(iterations, fn, successCallback, offset);\r\n\r\n loop.executeNext();\r\n\r\n return loop;\r\n }\r\n\r\n /**\r\n * A for-loop that will run a given number of iterations synchronous and the rest async.\r\n * @param iterations total number of iterations\r\n * @param syncedIterations number of synchronous iterations in each async iteration.\r\n * @param fn the function to call each iteration.\r\n * @param callback a success call back that will be called when iterating stops.\r\n * @param breakFunction a break condition (optional)\r\n * @param timeout timeout settings for the setTimeout function. default - 0.\r\n * @returns the created async loop object\r\n */\r\n public static SyncAsyncForLoop(\r\n iterations: number,\r\n syncedIterations: number,\r\n fn: (iteration: number) => void,\r\n callback: () => void,\r\n breakFunction?: () => boolean,\r\n timeout = 0\r\n ): AsyncLoop {\r\n return AsyncLoop.Run(\r\n Math.ceil(iterations / syncedIterations),\r\n (loop: AsyncLoop) => {\r\n if (breakFunction && breakFunction()) {\r\n loop.breakLoop();\r\n } else {\r\n setTimeout(() => {\r\n for (let i = 0; i < syncedIterations; ++i) {\r\n const iteration = loop.index * syncedIterations + i;\r\n if (iteration >= iterations) {\r\n break;\r\n }\r\n fn(iteration);\r\n if (breakFunction && breakFunction()) {\r\n loop.breakLoop();\r\n break;\r\n }\r\n }\r\n loop.executeNext();\r\n }, timeout);\r\n }\r\n },\r\n callback\r\n );\r\n }\r\n}\r\n\r\nTools.Mix = Mix;\r\nTools.IsExponentOfTwo = IsExponentOfTwo;\r\n\r\n// Will only be define if Tools is imported freeing up some space when only engine is required\r\nEngineStore.FallbackTexture =\r\n \"data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QBmRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAAExAAIAAAAQAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQubmV0IDQuMC41AP/bAEMABAIDAwMCBAMDAwQEBAQFCQYFBQUFCwgIBgkNCw0NDQsMDA4QFBEODxMPDAwSGBITFRYXFxcOERkbGRYaFBYXFv/bAEMBBAQEBQUFCgYGChYPDA8WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFv/AABEIAQABAAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APH6KKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76CiiigD5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BQooooA+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/voKKKKAPl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76CiiigD5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BQooooA+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/voKKKKAPl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76P//Z\";\r\n", "/**\r\n * Defines an array and its length.\r\n * It can be helpful to group result from both Arrays and smart arrays in one structure.\r\n */\r\nexport interface ISmartArrayLike {\r\n /**\r\n * The data of the array.\r\n */\r\n data: Array;\r\n /**\r\n * The active length of the array.\r\n */\r\n length: number;\r\n}\r\n\r\n/**\r\n * Defines an GC Friendly array where the backfield array do not shrink to prevent over allocations.\r\n */\r\nexport class SmartArray implements ISmartArrayLike {\r\n /**\r\n * The full set of data from the array.\r\n */\r\n public data: Array;\r\n\r\n /**\r\n * The active length of the array.\r\n */\r\n public length: number = 0;\r\n\r\n protected _id: number;\r\n\r\n /**\r\n * Instantiates a Smart Array.\r\n * @param capacity defines the default capacity of the array.\r\n */\r\n constructor(capacity: number) {\r\n this.data = new Array(capacity);\r\n this._id = SmartArray._GlobalId++;\r\n }\r\n\r\n /**\r\n * Pushes a value at the end of the active data.\r\n * @param value defines the object to push in the array.\r\n */\r\n public push(value: T): void {\r\n this.data[this.length++] = value;\r\n\r\n if (this.length > this.data.length) {\r\n this.data.length *= 2;\r\n }\r\n }\r\n\r\n /**\r\n * Iterates over the active data and apply the lambda to them.\r\n * @param func defines the action to apply on each value.\r\n */\r\n public forEach(func: (content: T) => void): void {\r\n for (let index = 0; index < this.length; index++) {\r\n func(this.data[index]);\r\n }\r\n }\r\n\r\n /**\r\n * Sorts the full sets of data.\r\n * @param compareFn defines the comparison function to apply.\r\n */\r\n public sort(compareFn: (a: T, b: T) => number): void {\r\n this.data.sort(compareFn);\r\n }\r\n\r\n /**\r\n * Resets the active data to an empty array.\r\n */\r\n public reset(): void {\r\n this.length = 0;\r\n }\r\n\r\n /**\r\n * Releases all the data from the array as well as the array.\r\n */\r\n public dispose(): void {\r\n this.reset();\r\n\r\n if (this.data) {\r\n this.data.length = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Concats the active data with a given array.\r\n * @param array defines the data to concatenate with.\r\n */\r\n public concat(array: any): void {\r\n if (array.length === 0) {\r\n return;\r\n }\r\n if (this.length + array.length > this.data.length) {\r\n this.data.length = (this.length + array.length) * 2;\r\n }\r\n\r\n for (let index = 0; index < array.length; index++) {\r\n this.data[this.length++] = (array.data || array)[index];\r\n }\r\n }\r\n\r\n /**\r\n * Returns the position of a value in the active data.\r\n * @param value defines the value to find the index for\r\n * @returns the index if found in the active data otherwise -1\r\n */\r\n public indexOf(value: T): number {\r\n const position = this.data.indexOf(value);\r\n\r\n if (position >= this.length) {\r\n return -1;\r\n }\r\n\r\n return position;\r\n }\r\n\r\n /**\r\n * Returns whether an element is part of the active data.\r\n * @param value defines the value to look for\r\n * @returns true if found in the active data otherwise false\r\n */\r\n public contains(value: T): boolean {\r\n return this.indexOf(value) !== -1;\r\n }\r\n\r\n // Statics\r\n private static _GlobalId = 0;\r\n}\r\n\r\n/**\r\n * Defines an GC Friendly array where the backfield array do not shrink to prevent over allocations.\r\n * The data in this array can only be present once\r\n */\r\nexport class SmartArrayNoDuplicate extends SmartArray {\r\n private _duplicateId = 0;\r\n\r\n /**\r\n * Pushes a value at the end of the active data.\r\n * THIS DOES NOT PREVENT DUPPLICATE DATA\r\n * @param value defines the object to push in the array.\r\n */\r\n public push(value: T): void {\r\n super.push(value);\r\n\r\n if (!(value).__smartArrayFlags) {\r\n (value).__smartArrayFlags = {};\r\n }\r\n\r\n (value).__smartArrayFlags[this._id] = this._duplicateId;\r\n }\r\n\r\n /**\r\n * Pushes a value at the end of the active data.\r\n * If the data is already present, it won t be added again\r\n * @param value defines the object to push in the array.\r\n * @returns true if added false if it was already present\r\n */\r\n public pushNoDuplicate(value: T): boolean {\r\n if ((value).__smartArrayFlags && (value).__smartArrayFlags[this._id] === this._duplicateId) {\r\n return false;\r\n }\r\n this.push(value);\r\n return true;\r\n }\r\n\r\n /**\r\n * Resets the active data to an empty array.\r\n */\r\n public reset(): void {\r\n super.reset();\r\n this._duplicateId++;\r\n }\r\n\r\n /**\r\n * Concats the active data with a given array.\r\n * This ensures no duplicate will be present in the result.\r\n * @param array defines the data to concatenate with.\r\n */\r\n public concatWithNoDuplicate(array: any): void {\r\n if (array.length === 0) {\r\n return;\r\n }\r\n if (this.length + array.length > this.data.length) {\r\n this.data.length = (this.length + array.length) * 2;\r\n }\r\n\r\n for (let index = 0; index < array.length; index++) {\r\n const item = (array.data || array)[index];\r\n this.pushNoDuplicate(item);\r\n }\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * This class implement a typical dictionary using a string as key and the generic type T as value.\r\n * The underlying implementation relies on an associative array to ensure the best performances.\r\n * The value can be anything including 'null' but except 'undefined'\r\n */\r\nexport class StringDictionary {\r\n /**\r\n * This will clear this dictionary and copy the content from the 'source' one.\r\n * If the T value is a custom object, it won't be copied/cloned, the same object will be used\r\n * @param source the dictionary to take the content from and copy to this dictionary\r\n */\r\n public copyFrom(source: StringDictionary) {\r\n this.clear();\r\n source.forEach((t, v) => this.add(t, v));\r\n }\r\n\r\n /**\r\n * Get a value based from its key\r\n * @param key the given key to get the matching value from\r\n * @returns the value if found, otherwise undefined is returned\r\n */\r\n public get(key: string): T | undefined {\r\n const val = this._data[key];\r\n if (val !== undefined) {\r\n return val;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Get a value from its key or add it if it doesn't exist.\r\n * This method will ensure you that a given key/data will be present in the dictionary.\r\n * @param key the given key to get the matching value from\r\n * @param factory the factory that will create the value if the key is not present in the dictionary.\r\n * The factory will only be invoked if there's no data for the given key.\r\n * @returns the value corresponding to the key.\r\n */\r\n public getOrAddWithFactory(key: string, factory: (key: string) => T): T {\r\n let val = this.get(key);\r\n if (val !== undefined) {\r\n return val;\r\n }\r\n\r\n val = factory(key);\r\n if (val) {\r\n this.add(key, val);\r\n }\r\n\r\n return val;\r\n }\r\n\r\n /**\r\n * Get a value from its key if present in the dictionary otherwise add it\r\n * @param key the key to get the value from\r\n * @param val if there's no such key/value pair in the dictionary add it with this value\r\n * @returns the value corresponding to the key\r\n */\r\n public getOrAdd(key: string, val: T): T {\r\n const curVal = this.get(key);\r\n if (curVal !== undefined) {\r\n return curVal;\r\n }\r\n\r\n this.add(key, val);\r\n return val;\r\n }\r\n\r\n /**\r\n * Check if there's a given key in the dictionary\r\n * @param key the key to check for\r\n * @returns true if the key is present, false otherwise\r\n */\r\n public contains(key: string): boolean {\r\n return this._data[key] !== undefined;\r\n }\r\n\r\n /**\r\n * Add a new key and its corresponding value\r\n * @param key the key to add\r\n * @param value the value corresponding to the key\r\n * @returns true if the operation completed successfully, false if we couldn't insert the key/value because there was already this key in the dictionary\r\n */\r\n public add(key: string, value: T): boolean {\r\n if (this._data[key] !== undefined) {\r\n return false;\r\n }\r\n this._data[key] = value;\r\n ++this._count;\r\n return true;\r\n }\r\n\r\n /**\r\n * Update a specific value associated to a key\r\n * @param key defines the key to use\r\n * @param value defines the value to store\r\n * @returns true if the value was updated (or false if the key was not found)\r\n */\r\n public set(key: string, value: T): boolean {\r\n if (this._data[key] === undefined) {\r\n return false;\r\n }\r\n this._data[key] = value;\r\n return true;\r\n }\r\n\r\n /**\r\n * Get the element of the given key and remove it from the dictionary\r\n * @param key defines the key to search\r\n * @returns the value associated with the key or null if not found\r\n */\r\n public getAndRemove(key: string): Nullable {\r\n const val = this.get(key);\r\n if (val !== undefined) {\r\n delete this._data[key];\r\n --this._count;\r\n return val;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Remove a key/value from the dictionary.\r\n * @param key the key to remove\r\n * @returns true if the item was successfully deleted, false if no item with such key exist in the dictionary\r\n */\r\n public remove(key: string): boolean {\r\n if (this.contains(key)) {\r\n delete this._data[key];\r\n --this._count;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Clear the whole content of the dictionary\r\n */\r\n public clear() {\r\n this._data = {};\r\n this._count = 0;\r\n }\r\n\r\n /**\r\n * Gets the current count\r\n */\r\n public get count() {\r\n return this._count;\r\n }\r\n\r\n /**\r\n * Execute a callback on each key/val of the dictionary.\r\n * Note that you can remove any element in this dictionary in the callback implementation\r\n * @param callback the callback to execute on a given key/value pair\r\n */\r\n public forEach(callback: (key: string, val: T) => void) {\r\n for (const cur in this._data) {\r\n const val = this._data[cur];\r\n callback(cur, val);\r\n }\r\n }\r\n\r\n /**\r\n * Execute a callback on every occurrence of the dictionary until it returns a valid TRes object.\r\n * If the callback returns null or undefined the method will iterate to the next key/value pair\r\n * Note that you can remove any element in this dictionary in the callback implementation\r\n * @param callback the callback to execute, if it return a valid T instanced object the enumeration will stop and the object will be returned\r\n * @returns the first item\r\n */\r\n public first(callback: (key: string, val: T) => TRes) {\r\n for (const cur in this._data) {\r\n const val = this._data[cur];\r\n const res = callback(cur, val);\r\n if (res) {\r\n return res;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _count = 0;\r\n private _data: { [key: string]: T } = {};\r\n}\r\n", "/**\r\n * Prepare the list of uniforms associated with the ColorCurves effects.\r\n * @param uniformsList The list of uniforms used in the effect\r\n */\r\nexport function PrepareUniformsForColorCurves(uniformsList: string[]): void {\r\n uniformsList.push(\"vCameraColorCurveNeutral\", \"vCameraColorCurvePositive\", \"vCameraColorCurveNegative\");\r\n}\r\n", "import { serialize } from \"../Misc/decorators\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport { PrepareUniformsForColorCurves } from \"./colorCurves.functions\";\r\n\r\n/**\r\n * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT).\r\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\r\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\r\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\r\n */\r\nexport class ColorCurves {\r\n private _dirty = true;\r\n\r\n private _tempColor = new Color4(0, 0, 0, 0);\r\n\r\n private _globalCurve = new Color4(0, 0, 0, 0);\r\n private _highlightsCurve = new Color4(0, 0, 0, 0);\r\n private _midtonesCurve = new Color4(0, 0, 0, 0);\r\n private _shadowsCurve = new Color4(0, 0, 0, 0);\r\n\r\n private _positiveCurve = new Color4(0, 0, 0, 0);\r\n private _negativeCurve = new Color4(0, 0, 0, 0);\r\n\r\n @serialize()\r\n private _globalHue = 30;\r\n\r\n @serialize()\r\n private _globalDensity = 0;\r\n\r\n @serialize()\r\n private _globalSaturation = 0;\r\n\r\n @serialize()\r\n private _globalExposure = 0;\r\n\r\n /**\r\n * Gets the global Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public get globalHue(): number {\r\n return this._globalHue;\r\n }\r\n /**\r\n * Sets the global Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public set globalHue(value: number) {\r\n this._globalHue = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the global Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public get globalDensity(): number {\r\n return this._globalDensity;\r\n }\r\n /**\r\n * Sets the global Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public set globalDensity(value: number) {\r\n this._globalDensity = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the global Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public get globalSaturation(): number {\r\n return this._globalSaturation;\r\n }\r\n /**\r\n * Sets the global Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public set globalSaturation(value: number) {\r\n this._globalSaturation = value;\r\n this._dirty = true;\r\n }\r\n\r\n /**\r\n * Gets the global Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public get globalExposure(): number {\r\n return this._globalExposure;\r\n }\r\n /**\r\n * Sets the global Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public set globalExposure(value: number) {\r\n this._globalExposure = value;\r\n this._dirty = true;\r\n }\r\n\r\n @serialize()\r\n private _highlightsHue = 30;\r\n\r\n @serialize()\r\n private _highlightsDensity = 0;\r\n\r\n @serialize()\r\n private _highlightsSaturation = 0;\r\n\r\n @serialize()\r\n private _highlightsExposure = 0;\r\n\r\n /**\r\n * Gets the highlights Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public get highlightsHue(): number {\r\n return this._highlightsHue;\r\n }\r\n /**\r\n * Sets the highlights Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public set highlightsHue(value: number) {\r\n this._highlightsHue = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the highlights Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public get highlightsDensity(): number {\r\n return this._highlightsDensity;\r\n }\r\n /**\r\n * Sets the highlights Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public set highlightsDensity(value: number) {\r\n this._highlightsDensity = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the highlights Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public get highlightsSaturation(): number {\r\n return this._highlightsSaturation;\r\n }\r\n /**\r\n * Sets the highlights Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public set highlightsSaturation(value: number) {\r\n this._highlightsSaturation = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the highlights Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public get highlightsExposure(): number {\r\n return this._highlightsExposure;\r\n }\r\n /**\r\n * Sets the highlights Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public set highlightsExposure(value: number) {\r\n this._highlightsExposure = value;\r\n this._dirty = true;\r\n }\r\n\r\n @serialize()\r\n private _midtonesHue = 30;\r\n\r\n @serialize()\r\n private _midtonesDensity = 0;\r\n\r\n @serialize()\r\n private _midtonesSaturation = 0;\r\n\r\n @serialize()\r\n private _midtonesExposure = 0;\r\n\r\n /**\r\n * Gets the midtones Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public get midtonesHue(): number {\r\n return this._midtonesHue;\r\n }\r\n /**\r\n * Sets the midtones Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public set midtonesHue(value: number) {\r\n this._midtonesHue = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the midtones Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public get midtonesDensity(): number {\r\n return this._midtonesDensity;\r\n }\r\n /**\r\n * Sets the midtones Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public set midtonesDensity(value: number) {\r\n this._midtonesDensity = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the midtones Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public get midtonesSaturation(): number {\r\n return this._midtonesSaturation;\r\n }\r\n /**\r\n * Sets the midtones Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public set midtonesSaturation(value: number) {\r\n this._midtonesSaturation = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the midtones Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public get midtonesExposure(): number {\r\n return this._midtonesExposure;\r\n }\r\n /**\r\n * Sets the midtones Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public set midtonesExposure(value: number) {\r\n this._midtonesExposure = value;\r\n this._dirty = true;\r\n }\r\n\r\n private _shadowsHue = 30;\r\n private _shadowsDensity = 0;\r\n private _shadowsSaturation = 0;\r\n private _shadowsExposure = 0;\r\n\r\n /**\r\n * Gets the shadows Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public get shadowsHue(): number {\r\n return this._shadowsHue;\r\n }\r\n /**\r\n * Sets the shadows Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public set shadowsHue(value: number) {\r\n this._shadowsHue = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the shadows Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public get shadowsDensity(): number {\r\n return this._shadowsDensity;\r\n }\r\n /**\r\n * Sets the shadows Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public set shadowsDensity(value: number) {\r\n this._shadowsDensity = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the shadows Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public get shadowsSaturation(): number {\r\n return this._shadowsSaturation;\r\n }\r\n /**\r\n * Sets the shadows Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public set shadowsSaturation(value: number) {\r\n this._shadowsSaturation = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the shadows Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public get shadowsExposure(): number {\r\n return this._shadowsExposure;\r\n }\r\n /**\r\n * Sets the shadows Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public set shadowsExposure(value: number) {\r\n this._shadowsExposure = value;\r\n this._dirty = true;\r\n }\r\n\r\n /**\r\n * Returns the class name\r\n * @returns The class name\r\n */\r\n public getClassName(): string {\r\n return \"ColorCurves\";\r\n }\r\n\r\n /**\r\n * Binds the color curves to the shader.\r\n * @param colorCurves The color curve to bind\r\n * @param effect The effect to bind to\r\n * @param positiveUniform The positive uniform shader parameter\r\n * @param neutralUniform The neutral uniform shader parameter\r\n * @param negativeUniform The negative uniform shader parameter\r\n */\r\n public static Bind(\r\n colorCurves: ColorCurves,\r\n effect: Effect,\r\n positiveUniform = \"vCameraColorCurvePositive\",\r\n neutralUniform = \"vCameraColorCurveNeutral\",\r\n negativeUniform = \"vCameraColorCurveNegative\"\r\n ): void {\r\n if (colorCurves._dirty) {\r\n colorCurves._dirty = false;\r\n\r\n // Fill in global info.\r\n colorCurves._getColorGradingDataToRef(\r\n colorCurves._globalHue,\r\n colorCurves._globalDensity,\r\n colorCurves._globalSaturation,\r\n colorCurves._globalExposure,\r\n colorCurves._globalCurve\r\n );\r\n\r\n // Compute highlights info.\r\n colorCurves._getColorGradingDataToRef(\r\n colorCurves._highlightsHue,\r\n colorCurves._highlightsDensity,\r\n colorCurves._highlightsSaturation,\r\n colorCurves._highlightsExposure,\r\n colorCurves._tempColor\r\n );\r\n colorCurves._tempColor.multiplyToRef(colorCurves._globalCurve, colorCurves._highlightsCurve);\r\n\r\n // Compute midtones info.\r\n colorCurves._getColorGradingDataToRef(\r\n colorCurves._midtonesHue,\r\n colorCurves._midtonesDensity,\r\n colorCurves._midtonesSaturation,\r\n colorCurves._midtonesExposure,\r\n colorCurves._tempColor\r\n );\r\n colorCurves._tempColor.multiplyToRef(colorCurves._globalCurve, colorCurves._midtonesCurve);\r\n\r\n // Compute shadows info.\r\n colorCurves._getColorGradingDataToRef(\r\n colorCurves._shadowsHue,\r\n colorCurves._shadowsDensity,\r\n colorCurves._shadowsSaturation,\r\n colorCurves._shadowsExposure,\r\n colorCurves._tempColor\r\n );\r\n colorCurves._tempColor.multiplyToRef(colorCurves._globalCurve, colorCurves._shadowsCurve);\r\n\r\n // Compute deltas (neutral is midtones).\r\n colorCurves._highlightsCurve.subtractToRef(colorCurves._midtonesCurve, colorCurves._positiveCurve);\r\n colorCurves._midtonesCurve.subtractToRef(colorCurves._shadowsCurve, colorCurves._negativeCurve);\r\n }\r\n\r\n if (effect) {\r\n effect.setFloat4(positiveUniform, colorCurves._positiveCurve.r, colorCurves._positiveCurve.g, colorCurves._positiveCurve.b, colorCurves._positiveCurve.a);\r\n effect.setFloat4(neutralUniform, colorCurves._midtonesCurve.r, colorCurves._midtonesCurve.g, colorCurves._midtonesCurve.b, colorCurves._midtonesCurve.a);\r\n effect.setFloat4(negativeUniform, colorCurves._negativeCurve.r, colorCurves._negativeCurve.g, colorCurves._negativeCurve.b, colorCurves._negativeCurve.a);\r\n }\r\n }\r\n\r\n /**\r\n * Prepare the list of uniforms associated with the ColorCurves effects.\r\n * @param uniformsList The list of uniforms used in the effect\r\n */\r\n public static PrepareUniforms: (uniformsList: string[]) => void = PrepareUniformsForColorCurves;\r\n\r\n /**\r\n * Returns color grading data based on a hue, density, saturation and exposure value.\r\n * @param hue\r\n * @param density\r\n * @param saturation The saturation.\r\n * @param exposure The exposure.\r\n * @param result The result data container.\r\n */\r\n private _getColorGradingDataToRef(hue: number, density: number, saturation: number, exposure: number, result: Color4): void {\r\n if (hue == null) {\r\n return;\r\n }\r\n\r\n hue = ColorCurves._Clamp(hue, 0, 360);\r\n density = ColorCurves._Clamp(density, -100, 100);\r\n saturation = ColorCurves._Clamp(saturation, -100, 100);\r\n exposure = ColorCurves._Clamp(exposure, -100, 100);\r\n\r\n // Remap the slider/config filter density with non-linear mapping and also scale by half\r\n // so that the maximum filter density is only 50% control. This provides fine control\r\n // for small values and reasonable range.\r\n density = ColorCurves._ApplyColorGradingSliderNonlinear(density);\r\n density *= 0.5;\r\n\r\n exposure = ColorCurves._ApplyColorGradingSliderNonlinear(exposure);\r\n\r\n if (density < 0) {\r\n density *= -1;\r\n hue = (hue + 180) % 360;\r\n }\r\n\r\n ColorCurves._FromHSBToRef(hue, density, 50 + 0.25 * exposure, result);\r\n result.scaleToRef(2, result);\r\n result.a = 1 + 0.01 * saturation;\r\n }\r\n\r\n /**\r\n * Takes an input slider value and returns an adjusted value that provides extra control near the centre.\r\n * @param value The input slider value in range [-100,100].\r\n * @returns Adjusted value.\r\n */\r\n private static _ApplyColorGradingSliderNonlinear(value: number): number {\r\n value /= 100;\r\n\r\n let x: number = Math.abs(value);\r\n x = Math.pow(x, 2);\r\n\r\n if (value < 0) {\r\n x *= -1;\r\n }\r\n\r\n x *= 100;\r\n\r\n return x;\r\n }\r\n\r\n /**\r\n * Returns an RGBA Color4 based on Hue, Saturation and Brightness (also referred to as value, HSV).\r\n * @param hue The hue (H) input.\r\n * @param saturation The saturation (S) input.\r\n * @param brightness The brightness (B) input.\r\n * @param result\r\n * @result An RGBA color represented as Vector4.\r\n */\r\n private static _FromHSBToRef(hue: number, saturation: number, brightness: number, result: Color4): void {\r\n let h: number = ColorCurves._Clamp(hue, 0, 360);\r\n const s: number = ColorCurves._Clamp(saturation / 100, 0, 1);\r\n const v: number = ColorCurves._Clamp(brightness / 100, 0, 1);\r\n\r\n if (s === 0) {\r\n result.r = v;\r\n result.g = v;\r\n result.b = v;\r\n } else {\r\n // sector 0 to 5\r\n h /= 60;\r\n const i = Math.floor(h);\r\n\r\n // fractional part of h\r\n const f = h - i;\r\n const p = v * (1 - s);\r\n const q = v * (1 - s * f);\r\n const t = v * (1 - s * (1 - f));\r\n\r\n switch (i) {\r\n case 0:\r\n result.r = v;\r\n result.g = t;\r\n result.b = p;\r\n break;\r\n case 1:\r\n result.r = q;\r\n result.g = v;\r\n result.b = p;\r\n break;\r\n case 2:\r\n result.r = p;\r\n result.g = v;\r\n result.b = t;\r\n break;\r\n case 3:\r\n result.r = p;\r\n result.g = q;\r\n result.b = v;\r\n break;\r\n case 4:\r\n result.r = t;\r\n result.g = p;\r\n result.b = v;\r\n break;\r\n default:\r\n // case 5:\r\n result.r = v;\r\n result.g = p;\r\n result.b = q;\r\n break;\r\n }\r\n }\r\n\r\n result.a = 1;\r\n }\r\n\r\n /**\r\n * Returns a value clamped between min and max\r\n * @param value The value to clamp\r\n * @param min The minimum of value\r\n * @param max The maximum of value\r\n * @returns The clamped value.\r\n */\r\n private static _Clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max);\r\n }\r\n\r\n /**\r\n * Clones the current color curve instance.\r\n * @returns The cloned curves\r\n */\r\n public clone(): ColorCurves {\r\n return SerializationHelper.Clone(() => new ColorCurves(), this);\r\n }\r\n\r\n /**\r\n * Serializes the current color curve instance to a json representation.\r\n * @returns a JSON representation\r\n */\r\n public serialize(): any {\r\n return SerializationHelper.Serialize(this);\r\n }\r\n\r\n /**\r\n * Parses the color curve from a json representation.\r\n * @param source the JSON source to parse\r\n * @returns The parsed curves\r\n */\r\n public static Parse(source: any): ColorCurves {\r\n return SerializationHelper.Parse(() => new ColorCurves(), source, null, null);\r\n }\r\n}\r\n\r\n// References the dependencies.\r\nSerializationHelper._ColorCurvesParser = ColorCurves.Parse;\r\n", "import { PrepareUniformsForColorCurves } from \"./colorCurves.functions\";\r\nimport type { IImageProcessingConfigurationDefines } from \"./imageProcessingConfiguration.defines\";\r\n\r\n/**\r\n * Prepare the list of uniforms associated with the Image Processing effects.\r\n * @param uniforms The list of uniforms used in the effect\r\n * @param defines the list of defines currently in use\r\n */\r\nexport function PrepareUniformsForImageProcessing(uniforms: string[], defines: IImageProcessingConfigurationDefines): void {\r\n if (defines.EXPOSURE) {\r\n uniforms.push(\"exposureLinear\");\r\n }\r\n if (defines.CONTRAST) {\r\n uniforms.push(\"contrast\");\r\n }\r\n if (defines.COLORGRADING) {\r\n uniforms.push(\"colorTransformSettings\");\r\n }\r\n if (defines.VIGNETTE || defines.DITHER) {\r\n uniforms.push(\"vInverseScreenSize\");\r\n }\r\n if (defines.VIGNETTE) {\r\n uniforms.push(\"vignetteSettings1\");\r\n uniforms.push(\"vignetteSettings2\");\r\n }\r\n if (defines.COLORCURVES) {\r\n PrepareUniformsForColorCurves(uniforms);\r\n }\r\n if (defines.DITHER) {\r\n uniforms.push(\"ditherIntensity\");\r\n }\r\n}\r\n\r\n/**\r\n * Prepare the list of samplers associated with the Image Processing effects.\r\n * @param samplersList The list of uniforms used in the effect\r\n * @param defines the list of defines currently in use\r\n */\r\nexport function PrepareSamplersForImageProcessing(samplersList: string[], defines: IImageProcessingConfigurationDefines): void {\r\n if (defines.COLORGRADING) {\r\n samplersList.push(\"txColorTransform\");\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { serialize, serializeAsTexture, serializeAsColorCurves, serializeAsColor4 } from \"../Misc/decorators\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { ColorCurves } from \"../Materials/colorCurves\";\r\n\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Mix } from \"../Misc/tools.functions\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport type { IImageProcessingConfigurationDefines } from \"./imageProcessingConfiguration.defines\";\r\nimport { PrepareSamplersForImageProcessing, PrepareUniformsForImageProcessing } from \"./imageProcessingConfiguration.functions\";\r\n\r\n/**\r\n * This groups together the common properties used for image processing either in direct forward pass\r\n * or through post processing effect depending on the use of the image processing pipeline in your scene\r\n * or not.\r\n */\r\nexport class ImageProcessingConfiguration {\r\n /**\r\n * Default tone mapping applied in BabylonJS.\r\n */\r\n public static readonly TONEMAPPING_STANDARD = 0;\r\n\r\n /**\r\n * ACES Tone mapping (used by default in unreal and unity). This can help getting closer\r\n * to other engines rendering to increase portability.\r\n */\r\n public static readonly TONEMAPPING_ACES = 1;\r\n\r\n /**\r\n * Color curves setup used in the effect if colorCurvesEnabled is set to true\r\n */\r\n @serializeAsColorCurves()\r\n public colorCurves: Nullable = new ColorCurves();\r\n\r\n @serialize()\r\n private _colorCurvesEnabled = false;\r\n /**\r\n * Gets whether the color curves effect is enabled.\r\n */\r\n public get colorCurvesEnabled(): boolean {\r\n return this._colorCurvesEnabled;\r\n }\r\n /**\r\n * Sets whether the color curves effect is enabled.\r\n */\r\n public set colorCurvesEnabled(value: boolean) {\r\n if (this._colorCurvesEnabled === value) {\r\n return;\r\n }\r\n\r\n this._colorCurvesEnabled = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serializeAsTexture(\"colorGradingTexture\")\r\n private _colorGradingTexture: Nullable;\r\n /**\r\n * Color grading LUT texture used in the effect if colorGradingEnabled is set to true\r\n */\r\n public get colorGradingTexture(): Nullable {\r\n return this._colorGradingTexture;\r\n }\r\n /**\r\n * Color grading LUT texture used in the effect if colorGradingEnabled is set to true\r\n */\r\n public set colorGradingTexture(value: Nullable) {\r\n if (this._colorGradingTexture === value) {\r\n return;\r\n }\r\n\r\n this._colorGradingTexture = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _colorGradingEnabled = false;\r\n /**\r\n * Gets whether the color grading effect is enabled.\r\n */\r\n public get colorGradingEnabled(): boolean {\r\n return this._colorGradingEnabled;\r\n }\r\n /**\r\n * Sets whether the color grading effect is enabled.\r\n */\r\n public set colorGradingEnabled(value: boolean) {\r\n if (this._colorGradingEnabled === value) {\r\n return;\r\n }\r\n\r\n this._colorGradingEnabled = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _colorGradingWithGreenDepth = true;\r\n /**\r\n * Gets whether the color grading effect is using a green depth for the 3d Texture.\r\n */\r\n public get colorGradingWithGreenDepth(): boolean {\r\n return this._colorGradingWithGreenDepth;\r\n }\r\n /**\r\n * Sets whether the color grading effect is using a green depth for the 3d Texture.\r\n */\r\n public set colorGradingWithGreenDepth(value: boolean) {\r\n if (this._colorGradingWithGreenDepth === value) {\r\n return;\r\n }\r\n\r\n this._colorGradingWithGreenDepth = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _colorGradingBGR = true;\r\n /**\r\n * Gets whether the color grading texture contains BGR values.\r\n */\r\n public get colorGradingBGR(): boolean {\r\n return this._colorGradingBGR;\r\n }\r\n /**\r\n * Sets whether the color grading texture contains BGR values.\r\n */\r\n public set colorGradingBGR(value: boolean) {\r\n if (this._colorGradingBGR === value) {\r\n return;\r\n }\r\n\r\n this._colorGradingBGR = value;\r\n this._updateParameters();\r\n }\r\n\r\n /** @internal */\r\n @serialize()\r\n public _exposure = 1.0;\r\n /**\r\n * Gets the Exposure used in the effect.\r\n */\r\n public get exposure(): number {\r\n return this._exposure;\r\n }\r\n /**\r\n * Sets the Exposure used in the effect.\r\n */\r\n public set exposure(value: number) {\r\n if (this._exposure === value) {\r\n return;\r\n }\r\n\r\n this._exposure = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _toneMappingEnabled = false;\r\n /**\r\n * Gets whether the tone mapping effect is enabled.\r\n */\r\n public get toneMappingEnabled(): boolean {\r\n return this._toneMappingEnabled;\r\n }\r\n /**\r\n * Sets whether the tone mapping effect is enabled.\r\n */\r\n public set toneMappingEnabled(value: boolean) {\r\n if (this._toneMappingEnabled === value) {\r\n return;\r\n }\r\n\r\n this._toneMappingEnabled = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _toneMappingType = ImageProcessingConfiguration.TONEMAPPING_STANDARD;\r\n /**\r\n * Gets the type of tone mapping effect.\r\n */\r\n public get toneMappingType(): number {\r\n return this._toneMappingType;\r\n }\r\n /**\r\n * Sets the type of tone mapping effect used in BabylonJS.\r\n */\r\n public set toneMappingType(value: number) {\r\n if (this._toneMappingType === value) {\r\n return;\r\n }\r\n\r\n this._toneMappingType = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n protected _contrast = 1.0;\r\n /**\r\n * Gets the contrast used in the effect.\r\n */\r\n public get contrast(): number {\r\n return this._contrast;\r\n }\r\n /**\r\n * Sets the contrast used in the effect.\r\n */\r\n public set contrast(value: number) {\r\n if (this._contrast === value) {\r\n return;\r\n }\r\n\r\n this._contrast = value;\r\n this._updateParameters();\r\n }\r\n\r\n /**\r\n * Vignette stretch size.\r\n */\r\n @serialize()\r\n public vignetteStretch = 0;\r\n\r\n /**\r\n * Vignette center X Offset.\r\n */\r\n @serialize()\r\n public vignetteCenterX = 0;\r\n\r\n /**\r\n * Vignette center Y Offset.\r\n */\r\n @serialize()\r\n public vignetteCenterY = 0;\r\n\r\n /**\r\n * Back Compat: Vignette center Y Offset.\r\n * @deprecated use vignetteCenterY instead\r\n */\r\n public get vignetteCentreY(): number {\r\n return this.vignetteCenterY;\r\n }\r\n public set vignetteCentreY(value: number) {\r\n this.vignetteCenterY = value;\r\n }\r\n\r\n /**\r\n * Back Compat: Vignette center X Offset.\r\n * @deprecated use vignetteCenterX instead\r\n */\r\n public get vignetteCentreX(): number {\r\n return this.vignetteCenterX;\r\n }\r\n public set vignetteCentreX(value: number) {\r\n this.vignetteCenterX = value;\r\n }\r\n\r\n /**\r\n * Vignette weight or intensity of the vignette effect.\r\n */\r\n @serialize()\r\n public vignetteWeight = 1.5;\r\n\r\n /**\r\n * Color of the vignette applied on the screen through the chosen blend mode (vignetteBlendMode)\r\n * if vignetteEnabled is set to true.\r\n */\r\n @serializeAsColor4()\r\n public vignetteColor: Color4 = new Color4(0, 0, 0, 0);\r\n\r\n /**\r\n * Camera field of view used by the Vignette effect.\r\n */\r\n @serialize()\r\n public vignetteCameraFov = 0.5;\r\n\r\n @serialize()\r\n private _vignetteBlendMode = ImageProcessingConfiguration.VIGNETTEMODE_MULTIPLY;\r\n /**\r\n * Gets the vignette blend mode allowing different kind of effect.\r\n */\r\n public get vignetteBlendMode(): number {\r\n return this._vignetteBlendMode;\r\n }\r\n /**\r\n * Sets the vignette blend mode allowing different kind of effect.\r\n */\r\n public set vignetteBlendMode(value: number) {\r\n if (this._vignetteBlendMode === value) {\r\n return;\r\n }\r\n\r\n this._vignetteBlendMode = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _vignetteEnabled = false;\r\n /**\r\n * Gets whether the vignette effect is enabled.\r\n */\r\n public get vignetteEnabled(): boolean {\r\n return this._vignetteEnabled;\r\n }\r\n /**\r\n * Sets whether the vignette effect is enabled.\r\n */\r\n public set vignetteEnabled(value: boolean) {\r\n if (this._vignetteEnabled === value) {\r\n return;\r\n }\r\n\r\n this._vignetteEnabled = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _ditheringEnabled = false;\r\n /**\r\n * Gets whether the dithering effect is enabled.\r\n * The dithering effect can be used to reduce banding.\r\n */\r\n public get ditheringEnabled(): boolean {\r\n return this._ditheringEnabled;\r\n }\r\n /**\r\n * Sets whether the dithering effect is enabled.\r\n * The dithering effect can be used to reduce banding.\r\n */\r\n public set ditheringEnabled(value: boolean) {\r\n if (this._ditheringEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ditheringEnabled = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _ditheringIntensity = 1.0 / 255.0;\r\n /**\r\n * Gets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0.\r\n */\r\n public get ditheringIntensity(): number {\r\n return this._ditheringIntensity;\r\n }\r\n /**\r\n * Sets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0.\r\n */\r\n public set ditheringIntensity(value: number) {\r\n if (this._ditheringIntensity === value) {\r\n return;\r\n }\r\n\r\n this._ditheringIntensity = value;\r\n this._updateParameters();\r\n }\r\n\r\n /** @internal */\r\n @serialize()\r\n public _skipFinalColorClamp = false;\r\n /**\r\n * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader\r\n * Applies to PBR materials.\r\n */\r\n public get skipFinalColorClamp(): boolean {\r\n return this._skipFinalColorClamp;\r\n }\r\n /**\r\n * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader\r\n * Applies to PBR materials.\r\n */\r\n public set skipFinalColorClamp(value: boolean) {\r\n if (this._skipFinalColorClamp === value) {\r\n return;\r\n }\r\n\r\n this._skipFinalColorClamp = value;\r\n this._updateParameters();\r\n }\r\n\r\n /** @internal */\r\n @serialize()\r\n public _applyByPostProcess = false;\r\n /**\r\n * Gets whether the image processing is applied through a post process or not.\r\n */\r\n public get applyByPostProcess(): boolean {\r\n return this._applyByPostProcess;\r\n }\r\n /**\r\n * Sets whether the image processing is applied through a post process or not.\r\n */\r\n public set applyByPostProcess(value: boolean) {\r\n if (this._applyByPostProcess === value) {\r\n return;\r\n }\r\n\r\n this._applyByPostProcess = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _isEnabled = true;\r\n /**\r\n * Gets whether the image processing is enabled or not.\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n /**\r\n * Sets whether the image processing is enabled or not.\r\n */\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n this._updateParameters();\r\n }\r\n\r\n /**\r\n * An event triggered when the configuration changes and requires Shader to Update some parameters.\r\n */\r\n public onUpdateParameters = new Observable();\r\n\r\n /**\r\n * Method called each time the image processing information changes requires to recompile the effect.\r\n */\r\n protected _updateParameters(): void {\r\n this.onUpdateParameters.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Gets the current class name.\r\n * @returns \"ImageProcessingConfiguration\"\r\n */\r\n public getClassName(): string {\r\n return \"ImageProcessingConfiguration\";\r\n }\r\n\r\n /**\r\n * Prepare the list of uniforms associated with the Image Processing effects.\r\n * @param uniforms The list of uniforms used in the effect\r\n * @param defines the list of defines currently in use\r\n */\r\n public static PrepareUniforms: (uniforms: string[], defines: IImageProcessingConfigurationDefines) => void = PrepareUniformsForImageProcessing;\r\n\r\n /**\r\n * Prepare the list of samplers associated with the Image Processing effects.\r\n * @param samplersList The list of uniforms used in the effect\r\n * @param defines the list of defines currently in use\r\n */\r\n public static PrepareSamplers: (samplersList: string[], defines: IImageProcessingConfigurationDefines) => void = PrepareSamplersForImageProcessing;\r\n\r\n /**\r\n * Prepare the list of defines associated to the shader.\r\n * @param defines the list of defines to complete\r\n * @param forPostProcess Define if we are currently in post process mode or not\r\n */\r\n public prepareDefines(defines: IImageProcessingConfigurationDefines, forPostProcess = false): void {\r\n if (forPostProcess !== this.applyByPostProcess || !this._isEnabled) {\r\n defines.VIGNETTE = false;\r\n defines.TONEMAPPING = false;\r\n defines.TONEMAPPING_ACES = false;\r\n defines.CONTRAST = false;\r\n defines.EXPOSURE = false;\r\n defines.COLORCURVES = false;\r\n defines.COLORGRADING = false;\r\n defines.COLORGRADING3D = false;\r\n defines.DITHER = false;\r\n defines.IMAGEPROCESSING = false;\r\n defines.SKIPFINALCOLORCLAMP = this.skipFinalColorClamp;\r\n defines.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess && this._isEnabled;\r\n return;\r\n }\r\n\r\n defines.VIGNETTE = this.vignetteEnabled;\r\n defines.VIGNETTEBLENDMODEMULTIPLY = this.vignetteBlendMode === ImageProcessingConfiguration._VIGNETTEMODE_MULTIPLY;\r\n defines.VIGNETTEBLENDMODEOPAQUE = !defines.VIGNETTEBLENDMODEMULTIPLY;\r\n\r\n defines.TONEMAPPING = this.toneMappingEnabled;\r\n switch (this._toneMappingType) {\r\n case ImageProcessingConfiguration.TONEMAPPING_ACES:\r\n defines.TONEMAPPING_ACES = true;\r\n break;\r\n default:\r\n defines.TONEMAPPING_ACES = false;\r\n break;\r\n }\r\n\r\n defines.CONTRAST = this.contrast !== 1.0;\r\n defines.EXPOSURE = this.exposure !== 1.0;\r\n defines.COLORCURVES = this.colorCurvesEnabled && !!this.colorCurves;\r\n defines.COLORGRADING = this.colorGradingEnabled && !!this.colorGradingTexture;\r\n if (defines.COLORGRADING) {\r\n defines.COLORGRADING3D = this.colorGradingTexture!.is3D;\r\n } else {\r\n defines.COLORGRADING3D = false;\r\n }\r\n defines.SAMPLER3DGREENDEPTH = this.colorGradingWithGreenDepth;\r\n defines.SAMPLER3DBGRMAP = this.colorGradingBGR;\r\n defines.DITHER = this._ditheringEnabled;\r\n defines.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess;\r\n defines.SKIPFINALCOLORCLAMP = this.skipFinalColorClamp;\r\n defines.IMAGEPROCESSING = defines.VIGNETTE || defines.TONEMAPPING || defines.CONTRAST || defines.EXPOSURE || defines.COLORCURVES || defines.COLORGRADING || defines.DITHER;\r\n }\r\n\r\n /**\r\n * Returns true if all the image processing information are ready.\r\n * @returns True if ready, otherwise, false\r\n */\r\n public isReady() {\r\n // Color Grading texture can not be none blocking.\r\n return !this.colorGradingEnabled || !this.colorGradingTexture || this.colorGradingTexture.isReady();\r\n }\r\n\r\n /**\r\n * Binds the image processing to the shader.\r\n * @param effect The effect to bind to\r\n * @param overrideAspectRatio Override the aspect ratio of the effect\r\n */\r\n public bind(effect: Effect, overrideAspectRatio?: number): void {\r\n // Color Curves\r\n if (this._colorCurvesEnabled && this.colorCurves) {\r\n ColorCurves.Bind(this.colorCurves, effect);\r\n }\r\n\r\n // Vignette and dither handled together due to common uniform.\r\n if (this._vignetteEnabled || this._ditheringEnabled) {\r\n const inverseWidth = 1 / effect.getEngine().getRenderWidth();\r\n const inverseHeight = 1 / effect.getEngine().getRenderHeight();\r\n effect.setFloat2(\"vInverseScreenSize\", inverseWidth, inverseHeight);\r\n\r\n if (this._ditheringEnabled) {\r\n effect.setFloat(\"ditherIntensity\", 0.5 * this._ditheringIntensity);\r\n }\r\n\r\n if (this._vignetteEnabled) {\r\n const aspectRatio = overrideAspectRatio != null ? overrideAspectRatio : inverseHeight / inverseWidth;\r\n\r\n let vignetteScaleY = Math.tan(this.vignetteCameraFov * 0.5);\r\n let vignetteScaleX = vignetteScaleY * aspectRatio;\r\n\r\n const vignetteScaleGeometricMean = Math.sqrt(vignetteScaleX * vignetteScaleY);\r\n vignetteScaleX = Mix(vignetteScaleX, vignetteScaleGeometricMean, this.vignetteStretch);\r\n vignetteScaleY = Mix(vignetteScaleY, vignetteScaleGeometricMean, this.vignetteStretch);\r\n\r\n effect.setFloat4(\"vignetteSettings1\", vignetteScaleX, vignetteScaleY, -vignetteScaleX * this.vignetteCenterX, -vignetteScaleY * this.vignetteCenterY);\r\n\r\n const vignettePower = -2.0 * this.vignetteWeight;\r\n effect.setFloat4(\"vignetteSettings2\", this.vignetteColor.r, this.vignetteColor.g, this.vignetteColor.b, vignettePower);\r\n }\r\n }\r\n\r\n // Exposure\r\n effect.setFloat(\"exposureLinear\", this.exposure);\r\n\r\n // Contrast\r\n effect.setFloat(\"contrast\", this.contrast);\r\n\r\n // Color transform settings\r\n if (this.colorGradingTexture) {\r\n effect.setTexture(\"txColorTransform\", this.colorGradingTexture);\r\n const textureSize = this.colorGradingTexture.getSize().height;\r\n\r\n effect.setFloat4(\r\n \"colorTransformSettings\",\r\n (textureSize - 1) / textureSize, // textureScale\r\n 0.5 / textureSize, // textureOffset\r\n textureSize, // textureSize\r\n this.colorGradingTexture.level // weight\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Clones the current image processing instance.\r\n * @returns The cloned image processing\r\n */\r\n public clone(): ImageProcessingConfiguration {\r\n return SerializationHelper.Clone(() => new ImageProcessingConfiguration(), this);\r\n }\r\n\r\n /**\r\n * Serializes the current image processing instance to a json representation.\r\n * @returns a JSON representation\r\n */\r\n public serialize(): any {\r\n return SerializationHelper.Serialize(this);\r\n }\r\n\r\n /**\r\n * Parses the image processing from a json representation.\r\n * @param source the JSON source to parse\r\n * @returns The parsed image processing\r\n */\r\n public static Parse(source: any): ImageProcessingConfiguration {\r\n const parsed = SerializationHelper.Parse(() => new ImageProcessingConfiguration(), source, null, null);\r\n // Backward compatibility\r\n if (source.vignetteCentreX !== undefined) {\r\n parsed.vignetteCenterX = source.vignetteCentreX;\r\n }\r\n if (source.vignetteCentreY !== undefined) {\r\n parsed.vignetteCenterY = source.vignetteCentreY;\r\n }\r\n\r\n return parsed;\r\n }\r\n\r\n // Static constants associated to the image processing.\r\n private static _VIGNETTEMODE_MULTIPLY = 0;\r\n private static _VIGNETTEMODE_OPAQUE = 1;\r\n\r\n /**\r\n * Used to apply the vignette as a mix with the pixel color.\r\n */\r\n public static get VIGNETTEMODE_MULTIPLY(): number {\r\n return this._VIGNETTEMODE_MULTIPLY;\r\n }\r\n\r\n /**\r\n * Used to apply the vignette as a replacement of the pixel color.\r\n */\r\n public static get VIGNETTEMODE_OPAQUE(): number {\r\n return this._VIGNETTEMODE_OPAQUE;\r\n }\r\n}\r\n\r\n// References the dependencies.\r\nSerializationHelper._ImageProcessingConfigurationParser = ImageProcessingConfiguration.Parse;\r\n", "import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { FloatArray, Nullable } from \"../../types\";\r\nimport type { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport { WebGLDataBuffer } from \"../../Meshes/WebGL/webGLDataBuffer\";\r\nimport type { IPipelineContext } from \"../IPipelineContext\";\r\nimport type { WebGLPipelineContext } from \"../WebGL/webGLPipelineContext\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Create an uniform buffer\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n * @param elements defines the content of the uniform buffer\r\n * @param label defines a name for the buffer (for debugging purpose)\r\n * @returns the webGL uniform buffer\r\n */\r\n createUniformBuffer(elements: FloatArray, label?: string): DataBuffer;\r\n\r\n /**\r\n * Create a dynamic uniform buffer\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n * @param elements defines the content of the uniform buffer\r\n * @param label defines a name for the buffer (for debugging purpose)\r\n * @returns the webGL uniform buffer\r\n */\r\n createDynamicUniformBuffer(elements: FloatArray, label?: string): DataBuffer;\r\n\r\n /**\r\n * Update an existing uniform buffer\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n * @param uniformBuffer defines the target uniform buffer\r\n * @param elements defines the content to update\r\n * @param offset defines the offset in the uniform buffer where update should start\r\n * @param count defines the size of the data to update\r\n */\r\n updateUniformBuffer(uniformBuffer: DataBuffer, elements: FloatArray, offset?: number, count?: number): void;\r\n\r\n /**\r\n * Bind an uniform buffer to the current webGL context\r\n * @param buffer defines the buffer to bind\r\n */\r\n bindUniformBuffer(buffer: Nullable): void;\r\n\r\n /**\r\n * Bind a buffer to the current webGL context at a given location\r\n * @param buffer defines the buffer to bind\r\n * @param location defines the index where to bind the buffer\r\n * @param name Name of the uniform variable to bind\r\n */\r\n bindUniformBufferBase(buffer: DataBuffer, location: number, name: string): void;\r\n\r\n /**\r\n * Bind a specific block at a given index in a specific shader program\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param blockName defines the block name\r\n * @param index defines the index where to bind the block\r\n */\r\n bindUniformBlock(pipelineContext: IPipelineContext, blockName: string, index: number): void;\r\n }\r\n}\r\n\r\nThinEngine.prototype.createUniformBuffer = function (elements: FloatArray, _label?: string): DataBuffer {\r\n const ubo = this._gl.createBuffer();\r\n\r\n if (!ubo) {\r\n throw new Error(\"Unable to create uniform buffer\");\r\n }\r\n const result = new WebGLDataBuffer(ubo);\r\n\r\n this.bindUniformBuffer(result);\r\n\r\n if (elements instanceof Float32Array) {\r\n this._gl.bufferData(this._gl.UNIFORM_BUFFER, elements, this._gl.STATIC_DRAW);\r\n } else {\r\n this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(elements), this._gl.STATIC_DRAW);\r\n }\r\n\r\n this.bindUniformBuffer(null);\r\n\r\n result.references = 1;\r\n return result;\r\n};\r\n\r\nThinEngine.prototype.createDynamicUniformBuffer = function (elements: FloatArray, _label?: string): DataBuffer {\r\n const ubo = this._gl.createBuffer();\r\n\r\n if (!ubo) {\r\n throw new Error(\"Unable to create dynamic uniform buffer\");\r\n }\r\n\r\n const result = new WebGLDataBuffer(ubo);\r\n this.bindUniformBuffer(result);\r\n\r\n if (elements instanceof Float32Array) {\r\n this._gl.bufferData(this._gl.UNIFORM_BUFFER, elements, this._gl.DYNAMIC_DRAW);\r\n } else {\r\n this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(elements), this._gl.DYNAMIC_DRAW);\r\n }\r\n\r\n this.bindUniformBuffer(null);\r\n\r\n result.references = 1;\r\n return result;\r\n};\r\n\r\nThinEngine.prototype.updateUniformBuffer = function (uniformBuffer: DataBuffer, elements: FloatArray, offset?: number, count?: number): void {\r\n this.bindUniformBuffer(uniformBuffer);\r\n\r\n if (offset === undefined) {\r\n offset = 0;\r\n }\r\n\r\n if (count === undefined) {\r\n if (elements instanceof Float32Array) {\r\n this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, offset, elements);\r\n } else {\r\n this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, offset, new Float32Array(elements));\r\n }\r\n } else {\r\n if (elements instanceof Float32Array) {\r\n this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, elements.subarray(offset, offset + count));\r\n } else {\r\n this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, new Float32Array(elements).subarray(offset, offset + count));\r\n }\r\n }\r\n\r\n this.bindUniformBuffer(null);\r\n};\r\n\r\nThinEngine.prototype.bindUniformBuffer = function (buffer: Nullable): void {\r\n this._gl.bindBuffer(this._gl.UNIFORM_BUFFER, buffer ? buffer.underlyingResource : null);\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nThinEngine.prototype.bindUniformBufferBase = function (buffer: DataBuffer, location: number, name: string): void {\r\n this._gl.bindBufferBase(this._gl.UNIFORM_BUFFER, location, buffer ? buffer.underlyingResource : null);\r\n};\r\n\r\nThinEngine.prototype.bindUniformBlock = function (pipelineContext: IPipelineContext, blockName: string, index: number): void {\r\n const program = (pipelineContext as WebGLPipelineContext).program!;\r\n\r\n const uniformLocation = this._gl.getUniformBlockIndex(program, blockName);\r\n\r\n if (uniformLocation !== 0xffffffff) {\r\n this._gl.uniformBlockBinding(program, uniformLocation, index);\r\n }\r\n};\r\n", "import { Logger } from \"../Misc/logger\";\r\nimport type { Nullable, FloatArray } from \"../types\";\r\nimport type { IMatrixLike, IVector3Like, IVector4Like, IColor3Like, IColor4Like } from \"../Maths/math.like\";\r\nimport type { Effect } from \"./effect\";\r\nimport type { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport type { InternalTexture } from \"./Textures/internalTexture\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport \"../Engines/Extensions/engine.uniformBuffer\";\r\n\r\n/**\r\n * Uniform buffer objects.\r\n *\r\n * Handles blocks of uniform on the GPU.\r\n *\r\n * If WebGL 2 is not available, this class falls back on traditional setUniformXXX calls.\r\n *\r\n * For more information, please refer to :\r\n * https://www.khronos.org/opengl/wiki/Uniform_Buffer_Object\r\n */\r\nexport class UniformBuffer {\r\n /** @internal */\r\n public static _UpdatedUbosInFrame: { [name: string]: number } = {};\r\n\r\n private _engine: ThinEngine;\r\n private _buffer: Nullable;\r\n private _buffers: Array<[DataBuffer, Float32Array | undefined]>;\r\n private _bufferIndex: number;\r\n private _createBufferOnWrite: boolean;\r\n private _data: number[];\r\n private _bufferData: Float32Array;\r\n private _dynamic?: boolean;\r\n private _uniformLocations: { [key: string]: number };\r\n private _uniformSizes: { [key: string]: number };\r\n private _uniformArraySizes: { [key: string]: { strideSize: number; arraySize: number } };\r\n private _uniformLocationPointer: number;\r\n private _needSync: boolean;\r\n private _noUBO: boolean;\r\n private _currentEffect: Effect;\r\n private _currentEffectName: string;\r\n private _name: string;\r\n private _currentFrameId: number;\r\n\r\n // Pool for avoiding memory leaks\r\n private static _MAX_UNIFORM_SIZE = 256;\r\n private static _TempBuffer = new Float32Array(UniformBuffer._MAX_UNIFORM_SIZE);\r\n private static _TempBufferInt32View = new Int32Array(UniformBuffer._TempBuffer.buffer);\r\n private static _TempBufferUInt32View = new Uint32Array(UniformBuffer._TempBuffer.buffer);\r\n\r\n /**\r\n * Lambda to Update a 3x3 Matrix in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateMatrix3x3: (name: string, matrix: Float32Array) => void;\r\n\r\n /**\r\n * Lambda to Update a 2x2 Matrix in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateMatrix2x2: (name: string, matrix: Float32Array) => void;\r\n\r\n /**\r\n * Lambda to Update a single float in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateFloat: (name: string, x: number) => void;\r\n\r\n /**\r\n * Lambda to Update a vec2 of float in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateFloat2: (name: string, x: number, y: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec3 of float in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateFloat3: (name: string, x: number, y: number, z: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec4 of float in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateFloat4: (name: string, x: number, y: number, z: number, w: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update an array of float in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateFloatArray: (name: string, array: Float32Array) => void;\r\n\r\n /**\r\n * Lambda to Update an array of number in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateArray: (name: string, array: number[]) => void;\r\n\r\n /**\r\n * Lambda to Update an array of number in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateIntArray: (name: string, array: Int32Array) => void;\r\n\r\n /**\r\n * Lambda to Update an array of number in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateUIntArray: (name: string, array: Uint32Array) => void;\r\n\r\n /**\r\n * Lambda to Update a 4x4 Matrix in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateMatrix: (name: string, mat: IMatrixLike) => void;\r\n\r\n /**\r\n * Lambda to Update an array of 4x4 Matrix in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateMatrices: (name: string, mat: Float32Array) => void;\r\n\r\n /**\r\n * Lambda to Update vec3 of float from a Vector in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateVector3: (name: string, vector: IVector3Like) => void;\r\n\r\n /**\r\n * Lambda to Update vec4 of float from a Vector in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateVector4: (name: string, vector: IVector4Like) => void;\r\n\r\n /**\r\n * Lambda to Update vec3 of float from a Color in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateColor3: (name: string, color: IColor3Like, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update vec4 of float from a Color in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateColor4: (name: string, color: IColor3Like, alpha: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update vec4 of float from a Color in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateDirectColor4: (name: string, color: IColor4Like, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a int a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateInt: (name: string, x: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec2 of int in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateInt2: (name: string, x: number, y: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec3 of int in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateInt3: (name: string, x: number, y: number, z: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec4 of int in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateInt4: (name: string, x: number, y: number, z: number, w: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a unsigned int a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateUInt: (name: string, x: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec2 of unsigned int in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateUInt2: (name: string, x: number, y: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec3 of unsigned int in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateUInt3: (name: string, x: number, y: number, z: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec4 of unsigned int in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateUInt4: (name: string, x: number, y: number, z: number, w: number, suffix?: string) => void;\r\n\r\n /**\r\n * Instantiates a new Uniform buffer objects.\r\n *\r\n * Handles blocks of uniform on the GPU.\r\n *\r\n * If WebGL 2 is not available, this class falls back on traditional setUniformXXX calls.\r\n *\r\n * For more information, please refer to :\r\n * @see https://www.khronos.org/opengl/wiki/Uniform_Buffer_Object\r\n * @param engine Define the engine the buffer is associated with\r\n * @param data Define the data contained in the buffer\r\n * @param dynamic Define if the buffer is updatable\r\n * @param name to assign to the buffer (debugging purpose)\r\n * @param forceNoUniformBuffer define that this object must not rely on UBO objects\r\n */\r\n constructor(engine: ThinEngine, data?: number[], dynamic?: boolean, name?: string, forceNoUniformBuffer = false) {\r\n this._engine = engine;\r\n this._noUBO = !engine.supportsUniformBuffers || forceNoUniformBuffer;\r\n this._dynamic = dynamic;\r\n this._name = name ?? \"no-name\";\r\n\r\n this._data = data || [];\r\n\r\n this._uniformLocations = {};\r\n this._uniformSizes = {};\r\n this._uniformArraySizes = {};\r\n this._uniformLocationPointer = 0;\r\n this._needSync = false;\r\n\r\n if (this._engine._features.trackUbosInFrame) {\r\n this._buffers = [];\r\n this._bufferIndex = -1;\r\n this._createBufferOnWrite = false;\r\n this._currentFrameId = 0;\r\n }\r\n\r\n if (this._noUBO) {\r\n this.updateMatrix3x3 = this._updateMatrix3x3ForEffect;\r\n this.updateMatrix2x2 = this._updateMatrix2x2ForEffect;\r\n this.updateFloat = this._updateFloatForEffect;\r\n this.updateFloat2 = this._updateFloat2ForEffect;\r\n this.updateFloat3 = this._updateFloat3ForEffect;\r\n this.updateFloat4 = this._updateFloat4ForEffect;\r\n this.updateFloatArray = this._updateFloatArrayForEffect;\r\n this.updateArray = this._updateArrayForEffect;\r\n this.updateIntArray = this._updateIntArrayForEffect;\r\n this.updateUIntArray = this._updateUIntArrayForEffect;\r\n this.updateMatrix = this._updateMatrixForEffect;\r\n this.updateMatrices = this._updateMatricesForEffect;\r\n this.updateVector3 = this._updateVector3ForEffect;\r\n this.updateVector4 = this._updateVector4ForEffect;\r\n this.updateColor3 = this._updateColor3ForEffect;\r\n this.updateColor4 = this._updateColor4ForEffect;\r\n this.updateDirectColor4 = this._updateDirectColor4ForEffect;\r\n this.updateInt = this._updateIntForEffect;\r\n this.updateInt2 = this._updateInt2ForEffect;\r\n this.updateInt3 = this._updateInt3ForEffect;\r\n this.updateInt4 = this._updateInt4ForEffect;\r\n this.updateUInt = this._updateUIntForEffect;\r\n this.updateUInt2 = this._updateUInt2ForEffect;\r\n this.updateUInt3 = this._updateUInt3ForEffect;\r\n this.updateUInt4 = this._updateUInt4ForEffect;\r\n } else {\r\n this._engine._uniformBuffers.push(this);\r\n\r\n this.updateMatrix3x3 = this._updateMatrix3x3ForUniform;\r\n this.updateMatrix2x2 = this._updateMatrix2x2ForUniform;\r\n this.updateFloat = this._updateFloatForUniform;\r\n this.updateFloat2 = this._updateFloat2ForUniform;\r\n this.updateFloat3 = this._updateFloat3ForUniform;\r\n this.updateFloat4 = this._updateFloat4ForUniform;\r\n this.updateFloatArray = this._updateFloatArrayForUniform;\r\n this.updateArray = this._updateArrayForUniform;\r\n this.updateIntArray = this._updateIntArrayForUniform;\r\n this.updateUIntArray = this._updateUIntArrayForUniform;\r\n this.updateMatrix = this._updateMatrixForUniform;\r\n this.updateMatrices = this._updateMatricesForUniform;\r\n this.updateVector3 = this._updateVector3ForUniform;\r\n this.updateVector4 = this._updateVector4ForUniform;\r\n this.updateColor3 = this._updateColor3ForUniform;\r\n this.updateColor4 = this._updateColor4ForUniform;\r\n this.updateDirectColor4 = this._updateDirectColor4ForUniform;\r\n this.updateInt = this._updateIntForUniform;\r\n this.updateInt2 = this._updateInt2ForUniform;\r\n this.updateInt3 = this._updateInt3ForUniform;\r\n this.updateInt4 = this._updateInt4ForUniform;\r\n this.updateUInt = this._updateUIntForUniform;\r\n this.updateUInt2 = this._updateUInt2ForUniform;\r\n this.updateUInt3 = this._updateUInt3ForUniform;\r\n this.updateUInt4 = this._updateUInt4ForUniform;\r\n }\r\n }\r\n\r\n /**\r\n * Indicates if the buffer is using the WebGL2 UBO implementation,\r\n * or just falling back on setUniformXXX calls.\r\n */\r\n public get useUbo(): boolean {\r\n return !this._noUBO;\r\n }\r\n\r\n /**\r\n * Indicates if the WebGL underlying uniform buffer is in sync\r\n * with the javascript cache data.\r\n */\r\n public get isSync(): boolean {\r\n return !this._needSync;\r\n }\r\n\r\n /**\r\n * Indicates if the WebGL underlying uniform buffer is dynamic.\r\n * Also, a dynamic UniformBuffer will disable cache verification and always\r\n * update the underlying WebGL uniform buffer to the GPU.\r\n * @returns if Dynamic, otherwise false\r\n */\r\n public isDynamic(): boolean {\r\n return this._dynamic !== undefined;\r\n }\r\n\r\n /**\r\n * The data cache on JS side.\r\n * @returns the underlying data as a float array\r\n */\r\n public getData(): Float32Array {\r\n return this._bufferData;\r\n }\r\n\r\n /**\r\n * The underlying WebGL Uniform buffer.\r\n * @returns the webgl buffer\r\n */\r\n public getBuffer(): Nullable {\r\n return this._buffer;\r\n }\r\n\r\n /**\r\n * std140 layout specifies how to align data within an UBO structure.\r\n * See https://khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf#page=159\r\n * for specs.\r\n * @param size\r\n */\r\n private _fillAlignment(size: number) {\r\n // This code has been simplified because we only use floats, vectors of 1, 2, 3, 4 components\r\n // and 4x4 matrices\r\n // TODO : change if other types are used\r\n\r\n let alignment;\r\n if (size <= 2) {\r\n alignment = size;\r\n } else {\r\n alignment = 4;\r\n }\r\n\r\n if (this._uniformLocationPointer % alignment !== 0) {\r\n const oldPointer = this._uniformLocationPointer;\r\n this._uniformLocationPointer += alignment - (this._uniformLocationPointer % alignment);\r\n const diff = this._uniformLocationPointer - oldPointer;\r\n\r\n for (let i = 0; i < diff; i++) {\r\n this._data.push(0);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Adds an uniform in the buffer.\r\n * Warning : the subsequents calls of this function must be in the same order as declared in the shader\r\n * for the layout to be correct ! The addUniform function only handles types like float, vec2, vec3, vec4, mat4,\r\n * meaning size=1,2,3,4 or 16. It does not handle struct types.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param size Data size, or data directly.\r\n * @param arraySize The number of elements in the array, 0 if not an array.\r\n */\r\n public addUniform(name: string, size: number | number[], arraySize = 0) {\r\n if (this._noUBO) {\r\n return;\r\n }\r\n\r\n if (this._uniformLocations[name] !== undefined) {\r\n // Already existing uniform\r\n return;\r\n }\r\n // This function must be called in the order of the shader layout !\r\n // size can be the size of the uniform, or data directly\r\n let data;\r\n\r\n // std140 FTW...\r\n if (arraySize > 0) {\r\n if (size instanceof Array) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"addUniform should not be use with Array in UBO: \" + name;\r\n }\r\n\r\n this._fillAlignment(4);\r\n\r\n this._uniformArraySizes[name] = { strideSize: size, arraySize };\r\n if (size == 16) {\r\n size = size * arraySize;\r\n } else {\r\n const perElementPadding = 4 - size;\r\n const totalPadding = perElementPadding * arraySize;\r\n size = size * arraySize + totalPadding;\r\n }\r\n\r\n data = [];\r\n // Fill with zeros\r\n for (let i = 0; i < size; i++) {\r\n data.push(0);\r\n }\r\n } else {\r\n if (size instanceof Array) {\r\n data = size;\r\n size = data.length;\r\n } else {\r\n size = size;\r\n data = [];\r\n\r\n // Fill with zeros\r\n for (let i = 0; i < size; i++) {\r\n data.push(0);\r\n }\r\n }\r\n this._fillAlignment(size);\r\n }\r\n\r\n this._uniformSizes[name] = size;\r\n this._uniformLocations[name] = this._uniformLocationPointer;\r\n this._uniformLocationPointer += size;\r\n\r\n for (let i = 0; i < size; i++) {\r\n this._data.push(data[i]);\r\n }\r\n\r\n this._needSync = true;\r\n }\r\n\r\n /**\r\n * Adds a Matrix 4x4 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param mat A 4x4 matrix.\r\n */\r\n public addMatrix(name: string, mat: IMatrixLike) {\r\n this.addUniform(name, Array.prototype.slice.call(mat.asArray()));\r\n }\r\n\r\n /**\r\n * Adds a vec2 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param x Define the x component value of the vec2\r\n * @param y Define the y component value of the vec2\r\n */\r\n public addFloat2(name: string, x: number, y: number) {\r\n const temp = [x, y];\r\n this.addUniform(name, temp);\r\n }\r\n\r\n /**\r\n * Adds a vec3 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param x Define the x component value of the vec3\r\n * @param y Define the y component value of the vec3\r\n * @param z Define the z component value of the vec3\r\n */\r\n public addFloat3(name: string, x: number, y: number, z: number) {\r\n const temp = [x, y, z];\r\n this.addUniform(name, temp);\r\n }\r\n\r\n /**\r\n * Adds a vec3 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param color Define the vec3 from a Color\r\n */\r\n public addColor3(name: string, color: IColor3Like) {\r\n const temp = [color.r, color.g, color.b];\r\n this.addUniform(name, temp);\r\n }\r\n\r\n /**\r\n * Adds a vec4 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param color Define the rgb components from a Color\r\n * @param alpha Define the a component of the vec4\r\n */\r\n public addColor4(name: string, color: IColor3Like, alpha: number) {\r\n const temp = [color.r, color.g, color.b, alpha];\r\n this.addUniform(name, temp);\r\n }\r\n\r\n /**\r\n * Adds a vec3 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param vector Define the vec3 components from a Vector\r\n */\r\n public addVector3(name: string, vector: IVector3Like) {\r\n const temp = [vector.x, vector.y, vector.z];\r\n this.addUniform(name, temp);\r\n }\r\n\r\n /**\r\n * Adds a Matrix 3x3 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n */\r\n public addMatrix3x3(name: string) {\r\n this.addUniform(name, 12);\r\n }\r\n\r\n /**\r\n * Adds a Matrix 2x2 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n */\r\n public addMatrix2x2(name: string) {\r\n this.addUniform(name, 8);\r\n }\r\n\r\n /**\r\n * Effectively creates the WebGL Uniform Buffer, once layout is completed with `addUniform`.\r\n */\r\n public create(): void {\r\n if (this._noUBO) {\r\n return;\r\n }\r\n if (this._buffer) {\r\n return; // nothing to do\r\n }\r\n\r\n // See spec, alignment must be filled as a vec4\r\n this._fillAlignment(4);\r\n this._bufferData = new Float32Array(this._data);\r\n\r\n this._rebuild();\r\n\r\n this._needSync = true;\r\n }\r\n\r\n // The result of this method is used for debugging purpose, as part of the buffer name\r\n // It is meant to more easily know what this buffer is about when debugging\r\n // Some buffers can have a lot of uniforms (several dozens), so the method only returns the first 10 of them\r\n // (should be enough to understand what the buffer is for)\r\n private _getNames() {\r\n const names = [];\r\n let i = 0;\r\n for (const name in this._uniformLocations) {\r\n names.push(name);\r\n if (++i === 10) {\r\n break;\r\n }\r\n }\r\n return names.join(\",\");\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this._noUBO || !this._bufferData) {\r\n return;\r\n }\r\n\r\n if (this._dynamic) {\r\n this._buffer = this._engine.createDynamicUniformBuffer(this._bufferData, this._name + \"_UniformList:\" + this._getNames());\r\n } else {\r\n this._buffer = this._engine.createUniformBuffer(this._bufferData, this._name + \"_UniformList:\" + this._getNames());\r\n }\r\n\r\n if (this._engine._features.trackUbosInFrame) {\r\n this._buffers.push([this._buffer, this._engine._features.checkUbosContentBeforeUpload ? this._bufferData.slice() : undefined]);\r\n this._bufferIndex = this._buffers.length - 1;\r\n this._createBufferOnWrite = false;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _rebuildAfterContextLost(): void {\r\n if (this._engine._features.trackUbosInFrame) {\r\n this._buffers = [];\r\n this._currentFrameId = 0;\r\n }\r\n this._rebuild();\r\n }\r\n\r\n /** @internal */\r\n public get _numBuffers(): number {\r\n return this._buffers.length;\r\n }\r\n\r\n /** @internal */\r\n public get _indexBuffer(): number {\r\n return this._bufferIndex;\r\n }\r\n\r\n /** Gets the name of this buffer */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n /** Gets the current effect */\r\n public get currentEffect(): Nullable {\r\n return this._currentEffect;\r\n }\r\n\r\n private _buffersEqual(buf1: Float32Array, buf2: Float32Array): boolean {\r\n for (let i = 0; i < buf1.length; ++i) {\r\n if (buf1[i] !== buf2[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n private _copyBuffer(src: Float32Array, dst: Float32Array): void {\r\n for (let i = 0; i < src.length; ++i) {\r\n dst[i] = src[i];\r\n }\r\n }\r\n\r\n /**\r\n * Updates the WebGL Uniform Buffer on the GPU.\r\n * If the `dynamic` flag is set to true, no cache comparison is done.\r\n * Otherwise, the buffer will be updated only if the cache differs.\r\n */\r\n public update(): void {\r\n if (this._noUBO) {\r\n return;\r\n }\r\n\r\n this.bindUniformBuffer();\r\n\r\n if (!this._buffer) {\r\n this.create();\r\n return;\r\n }\r\n\r\n if (!this._dynamic && !this._needSync) {\r\n this._createBufferOnWrite = this._engine._features.trackUbosInFrame;\r\n return;\r\n }\r\n\r\n if (this._buffers && this._buffers.length > 1 && this._buffers[this._bufferIndex][1]) {\r\n if (this._buffersEqual(this._bufferData, this._buffers[this._bufferIndex][1]!)) {\r\n this._needSync = false;\r\n this._createBufferOnWrite = this._engine._features.trackUbosInFrame;\r\n return;\r\n } else {\r\n this._copyBuffer(this._bufferData, this._buffers[this._bufferIndex][1]!);\r\n }\r\n }\r\n\r\n this._engine.updateUniformBuffer(this._buffer, this._bufferData);\r\n\r\n if (this._engine._features._collectUbosUpdatedInFrame) {\r\n if (!UniformBuffer._UpdatedUbosInFrame[this._name]) {\r\n UniformBuffer._UpdatedUbosInFrame[this._name] = 0;\r\n }\r\n UniformBuffer._UpdatedUbosInFrame[this._name]++;\r\n }\r\n\r\n this._needSync = false;\r\n this._createBufferOnWrite = this._engine._features.trackUbosInFrame;\r\n }\r\n\r\n private _createNewBuffer() {\r\n if (this._bufferIndex + 1 < this._buffers.length) {\r\n this._bufferIndex++;\r\n this._buffer = this._buffers[this._bufferIndex][0];\r\n this._createBufferOnWrite = false;\r\n this._needSync = true;\r\n } else {\r\n this._rebuild();\r\n }\r\n }\r\n\r\n private _checkNewFrame(): void {\r\n if (this._engine._features.trackUbosInFrame && this._currentFrameId !== this._engine.frameId) {\r\n this._currentFrameId = this._engine.frameId;\r\n this._createBufferOnWrite = false;\r\n if (this._buffers && this._buffers.length > 0) {\r\n this._needSync = this._bufferIndex !== 0;\r\n this._bufferIndex = 0;\r\n this._buffer = this._buffers[this._bufferIndex][0];\r\n } else {\r\n this._bufferIndex = -1;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU.\r\n * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.\r\n * @param data Define the flattened data\r\n * @param size Define the size of the data.\r\n */\r\n public updateUniform(uniformName: string, data: FloatArray, size: number) {\r\n this._checkNewFrame();\r\n\r\n let location = this._uniformLocations[uniformName];\r\n if (location === undefined) {\r\n if (this._buffer) {\r\n // Cannot add an uniform if the buffer is already created\r\n Logger.Error(\"Cannot add an uniform after UBO has been created. uniformName=\" + uniformName);\r\n return;\r\n }\r\n this.addUniform(uniformName, size);\r\n location = this._uniformLocations[uniformName];\r\n }\r\n\r\n if (!this._buffer) {\r\n this.create();\r\n }\r\n\r\n if (!this._dynamic) {\r\n // Cache for static uniform buffers\r\n let changed = false;\r\n\r\n for (let i = 0; i < size; i++) {\r\n // We are checking the matrix cache before calling updateUniform so we do not need to check it here\r\n // Hence the test for size === 16 to simply commit the matrix values\r\n if ((size === 16 && !this._engine._features.uniformBufferHardCheckMatrix) || this._bufferData[location + i] !== Math.fround(data[i])) {\r\n changed = true;\r\n if (this._createBufferOnWrite) {\r\n this._createNewBuffer();\r\n }\r\n this._bufferData[location + i] = data[i];\r\n }\r\n }\r\n\r\n this._needSync = this._needSync || changed;\r\n } else {\r\n // No cache for dynamic\r\n for (let i = 0; i < size; i++) {\r\n this._bufferData[location + i] = data[i];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU.\r\n * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.\r\n * @param data Define the flattened data\r\n * @param size Define the size of the data.\r\n */\r\n public updateUniformArray(uniformName: string, data: FloatArray, size: number) {\r\n this._checkNewFrame();\r\n\r\n const location = this._uniformLocations[uniformName];\r\n if (location === undefined) {\r\n Logger.Error(\"Cannot add an uniform Array dynamically. Please, add it using addUniform and make sure that uniform buffers are supported by the current engine.\");\r\n return;\r\n }\r\n\r\n if (!this._buffer) {\r\n this.create();\r\n }\r\n\r\n const arraySizes = this._uniformArraySizes[uniformName];\r\n\r\n if (!this._dynamic) {\r\n // Cache for static uniform buffers\r\n let changed = false;\r\n let countToFour = 0;\r\n let baseStride = 0;\r\n for (let i = 0; i < size; i++) {\r\n if (this._bufferData[location + baseStride * 4 + countToFour] !== Tools.FloatRound(data[i])) {\r\n changed = true;\r\n if (this._createBufferOnWrite) {\r\n this._createNewBuffer();\r\n }\r\n this._bufferData[location + baseStride * 4 + countToFour] = data[i];\r\n }\r\n countToFour++;\r\n if (countToFour === arraySizes.strideSize) {\r\n for (; countToFour < 4; countToFour++) {\r\n this._bufferData[location + baseStride * 4 + countToFour] = 0;\r\n }\r\n countToFour = 0;\r\n baseStride++;\r\n }\r\n }\r\n\r\n this._needSync = this._needSync || changed;\r\n } else {\r\n // No cache for dynamic\r\n for (let i = 0; i < size; i++) {\r\n this._bufferData[location + i] = data[i];\r\n }\r\n }\r\n }\r\n\r\n // Matrix cache\r\n private _valueCache: { [key: string]: number } = {};\r\n private _cacheMatrix(name: string, matrix: IMatrixLike): boolean {\r\n this._checkNewFrame();\r\n\r\n const cache = this._valueCache[name];\r\n const flag = matrix.updateFlag;\r\n if (cache !== undefined && cache === flag) {\r\n return false;\r\n }\r\n\r\n this._valueCache[name] = flag;\r\n return true;\r\n }\r\n\r\n // Update methods\r\n\r\n private _updateMatrix3x3ForUniform(name: string, matrix: Float32Array): void {\r\n // To match std140, matrix must be realigned\r\n for (let i = 0; i < 3; i++) {\r\n UniformBuffer._TempBuffer[i * 4] = matrix[i * 3];\r\n UniformBuffer._TempBuffer[i * 4 + 1] = matrix[i * 3 + 1];\r\n UniformBuffer._TempBuffer[i * 4 + 2] = matrix[i * 3 + 2];\r\n UniformBuffer._TempBuffer[i * 4 + 3] = 0.0;\r\n }\r\n\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 12);\r\n }\r\n\r\n private _updateMatrix3x3ForEffect(name: string, matrix: Float32Array): void {\r\n this._currentEffect.setMatrix3x3(name, matrix);\r\n }\r\n\r\n private _updateMatrix2x2ForEffect(name: string, matrix: Float32Array): void {\r\n this._currentEffect.setMatrix2x2(name, matrix);\r\n }\r\n\r\n private _updateMatrix2x2ForUniform(name: string, matrix: Float32Array): void {\r\n // To match std140, matrix must be realigned\r\n for (let i = 0; i < 2; i++) {\r\n UniformBuffer._TempBuffer[i * 4] = matrix[i * 2];\r\n UniformBuffer._TempBuffer[i * 4 + 1] = matrix[i * 2 + 1];\r\n UniformBuffer._TempBuffer[i * 4 + 2] = 0.0;\r\n UniformBuffer._TempBuffer[i * 4 + 3] = 0.0;\r\n }\r\n\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 8);\r\n }\r\n\r\n private _updateFloatForEffect(name: string, x: number) {\r\n this._currentEffect.setFloat(name, x);\r\n }\r\n\r\n private _updateFloatForUniform(name: string, x: number) {\r\n UniformBuffer._TempBuffer[0] = x;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 1);\r\n }\r\n\r\n private _updateFloat2ForEffect(name: string, x: number, y: number, suffix = \"\") {\r\n this._currentEffect.setFloat2(name + suffix, x, y);\r\n }\r\n\r\n private _updateFloat2ForUniform(name: string, x: number, y: number) {\r\n UniformBuffer._TempBuffer[0] = x;\r\n UniformBuffer._TempBuffer[1] = y;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 2);\r\n }\r\n\r\n private _updateFloat3ForEffect(name: string, x: number, y: number, z: number, suffix = \"\") {\r\n this._currentEffect.setFloat3(name + suffix, x, y, z);\r\n }\r\n\r\n private _updateFloat3ForUniform(name: string, x: number, y: number, z: number) {\r\n UniformBuffer._TempBuffer[0] = x;\r\n UniformBuffer._TempBuffer[1] = y;\r\n UniformBuffer._TempBuffer[2] = z;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 3);\r\n }\r\n\r\n private _updateFloat4ForEffect(name: string, x: number, y: number, z: number, w: number, suffix = \"\") {\r\n this._currentEffect.setFloat4(name + suffix, x, y, z, w);\r\n }\r\n\r\n private _updateFloat4ForUniform(name: string, x: number, y: number, z: number, w: number) {\r\n UniformBuffer._TempBuffer[0] = x;\r\n UniformBuffer._TempBuffer[1] = y;\r\n UniformBuffer._TempBuffer[2] = z;\r\n UniformBuffer._TempBuffer[3] = w;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 4);\r\n }\r\n\r\n private _updateFloatArrayForEffect(name: string, array: Float32Array) {\r\n this._currentEffect.setFloatArray(name, array);\r\n }\r\n\r\n private _updateFloatArrayForUniform(name: string, array: Float32Array) {\r\n this.updateUniformArray(name, array, array.length);\r\n }\r\n\r\n private _updateArrayForEffect(name: string, array: number[]) {\r\n this._currentEffect.setArray(name, array);\r\n }\r\n\r\n private _updateArrayForUniform(name: string, array: number[]) {\r\n this.updateUniformArray(name, array, array.length);\r\n }\r\n\r\n private _updateIntArrayForEffect(name: string, array: Int32Array) {\r\n this._currentEffect.setIntArray(name, array);\r\n }\r\n\r\n private _updateIntArrayForUniform(name: string, array: Int32Array) {\r\n UniformBuffer._TempBufferInt32View.set(array);\r\n this.updateUniformArray(name, UniformBuffer._TempBuffer, array.length);\r\n }\r\n\r\n private _updateUIntArrayForEffect(name: string, array: Uint32Array) {\r\n this._currentEffect.setUIntArray(name, array);\r\n }\r\n\r\n private _updateUIntArrayForUniform(name: string, array: Uint32Array) {\r\n UniformBuffer._TempBufferUInt32View.set(array);\r\n this.updateUniformArray(name, UniformBuffer._TempBuffer, array.length);\r\n }\r\n\r\n private _updateMatrixForEffect(name: string, mat: IMatrixLike) {\r\n this._currentEffect.setMatrix(name, mat);\r\n }\r\n\r\n private _updateMatrixForUniform(name: string, mat: IMatrixLike) {\r\n if (this._cacheMatrix(name, mat)) {\r\n this.updateUniform(name, mat.asArray(), 16);\r\n }\r\n }\r\n\r\n private _updateMatricesForEffect(name: string, mat: Float32Array) {\r\n this._currentEffect.setMatrices(name, mat);\r\n }\r\n\r\n private _updateMatricesForUniform(name: string, mat: Float32Array) {\r\n this.updateUniform(name, mat, mat.length);\r\n }\r\n\r\n private _updateVector3ForEffect(name: string, vector: IVector3Like) {\r\n this._currentEffect.setVector3(name, vector);\r\n }\r\n\r\n private _updateVector3ForUniform(name: string, vector: IVector3Like) {\r\n UniformBuffer._TempBuffer[0] = vector.x;\r\n UniformBuffer._TempBuffer[1] = vector.y;\r\n UniformBuffer._TempBuffer[2] = vector.z;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 3);\r\n }\r\n\r\n private _updateVector4ForEffect(name: string, vector: IVector4Like) {\r\n this._currentEffect.setVector4(name, vector);\r\n }\r\n\r\n private _updateVector4ForUniform(name: string, vector: IVector4Like) {\r\n UniformBuffer._TempBuffer[0] = vector.x;\r\n UniformBuffer._TempBuffer[1] = vector.y;\r\n UniformBuffer._TempBuffer[2] = vector.z;\r\n UniformBuffer._TempBuffer[3] = vector.w;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 4);\r\n }\r\n\r\n private _updateColor3ForEffect(name: string, color: IColor3Like, suffix = \"\") {\r\n this._currentEffect.setColor3(name + suffix, color);\r\n }\r\n\r\n private _updateColor3ForUniform(name: string, color: IColor3Like) {\r\n UniformBuffer._TempBuffer[0] = color.r;\r\n UniformBuffer._TempBuffer[1] = color.g;\r\n UniformBuffer._TempBuffer[2] = color.b;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 3);\r\n }\r\n\r\n private _updateColor4ForEffect(name: string, color: IColor3Like, alpha: number, suffix = \"\") {\r\n this._currentEffect.setColor4(name + suffix, color, alpha);\r\n }\r\n\r\n private _updateDirectColor4ForEffect(name: string, color: IColor4Like, suffix = \"\") {\r\n this._currentEffect.setDirectColor4(name + suffix, color);\r\n }\r\n\r\n private _updateColor4ForUniform(name: string, color: IColor3Like, alpha: number) {\r\n UniformBuffer._TempBuffer[0] = color.r;\r\n UniformBuffer._TempBuffer[1] = color.g;\r\n UniformBuffer._TempBuffer[2] = color.b;\r\n UniformBuffer._TempBuffer[3] = alpha;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 4);\r\n }\r\n\r\n private _updateDirectColor4ForUniform(name: string, color: IColor4Like) {\r\n UniformBuffer._TempBuffer[0] = color.r;\r\n UniformBuffer._TempBuffer[1] = color.g;\r\n UniformBuffer._TempBuffer[2] = color.b;\r\n UniformBuffer._TempBuffer[3] = color.a;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 4);\r\n }\r\n\r\n private _updateIntForEffect(name: string, x: number, suffix = \"\") {\r\n this._currentEffect.setInt(name + suffix, x);\r\n }\r\n\r\n private _updateIntForUniform(name: string, x: number) {\r\n UniformBuffer._TempBufferInt32View[0] = x;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 1);\r\n }\r\n\r\n private _updateInt2ForEffect(name: string, x: number, y: number, suffix = \"\") {\r\n this._currentEffect.setInt2(name + suffix, x, y);\r\n }\r\n\r\n private _updateInt2ForUniform(name: string, x: number, y: number) {\r\n UniformBuffer._TempBufferInt32View[0] = x;\r\n UniformBuffer._TempBufferInt32View[1] = y;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 2);\r\n }\r\n\r\n private _updateInt3ForEffect(name: string, x: number, y: number, z: number, suffix = \"\") {\r\n this._currentEffect.setInt3(name + suffix, x, y, z);\r\n }\r\n\r\n private _updateInt3ForUniform(name: string, x: number, y: number, z: number) {\r\n UniformBuffer._TempBufferInt32View[0] = x;\r\n UniformBuffer._TempBufferInt32View[1] = y;\r\n UniformBuffer._TempBufferInt32View[2] = z;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 3);\r\n }\r\n\r\n private _updateInt4ForEffect(name: string, x: number, y: number, z: number, w: number, suffix = \"\") {\r\n this._currentEffect.setInt4(name + suffix, x, y, z, w);\r\n }\r\n\r\n private _updateInt4ForUniform(name: string, x: number, y: number, z: number, w: number) {\r\n UniformBuffer._TempBufferInt32View[0] = x;\r\n UniformBuffer._TempBufferInt32View[1] = y;\r\n UniformBuffer._TempBufferInt32View[2] = z;\r\n UniformBuffer._TempBufferInt32View[3] = w;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 4);\r\n }\r\n\r\n private _updateUIntForEffect(name: string, x: number, suffix = \"\") {\r\n this._currentEffect.setUInt(name + suffix, x);\r\n }\r\n\r\n private _updateUIntForUniform(name: string, x: number) {\r\n UniformBuffer._TempBufferUInt32View[0] = x;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 1);\r\n }\r\n\r\n private _updateUInt2ForEffect(name: string, x: number, y: number, suffix = \"\") {\r\n this._currentEffect.setUInt2(name + suffix, x, y);\r\n }\r\n\r\n private _updateUInt2ForUniform(name: string, x: number, y: number) {\r\n UniformBuffer._TempBufferUInt32View[0] = x;\r\n UniformBuffer._TempBufferUInt32View[1] = y;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 2);\r\n }\r\n\r\n private _updateUInt3ForEffect(name: string, x: number, y: number, z: number, suffix = \"\") {\r\n this._currentEffect.setUInt3(name + suffix, x, y, z);\r\n }\r\n\r\n private _updateUInt3ForUniform(name: string, x: number, y: number, z: number) {\r\n UniformBuffer._TempBufferUInt32View[0] = x;\r\n UniformBuffer._TempBufferUInt32View[1] = y;\r\n UniformBuffer._TempBufferUInt32View[2] = z;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 3);\r\n }\r\n\r\n private _updateUInt4ForEffect(name: string, x: number, y: number, z: number, w: number, suffix = \"\") {\r\n this._currentEffect.setUInt4(name + suffix, x, y, z, w);\r\n }\r\n\r\n private _updateUInt4ForUniform(name: string, x: number, y: number, z: number, w: number) {\r\n UniformBuffer._TempBufferUInt32View[0] = x;\r\n UniformBuffer._TempBufferUInt32View[1] = y;\r\n UniformBuffer._TempBufferUInt32View[2] = z;\r\n UniformBuffer._TempBufferUInt32View[3] = w;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 4);\r\n }\r\n\r\n /**\r\n * Sets a sampler uniform on the effect.\r\n * @param name Define the name of the sampler.\r\n * @param texture Define the texture to set in the sampler\r\n */\r\n public setTexture(name: string, texture: Nullable) {\r\n this._currentEffect.setTexture(name, texture);\r\n }\r\n\r\n /**\r\n * Sets a sampler uniform on the effect.\r\n * @param name Define the name of the sampler.\r\n * @param texture Define the (internal) texture to set in the sampler\r\n */\r\n public bindTexture(name: string, texture: Nullable) {\r\n this._currentEffect._bindTexture(name, texture);\r\n }\r\n\r\n /**\r\n * Directly updates the value of the uniform in the cache AND on the GPU.\r\n * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.\r\n * @param data Define the flattened data\r\n */\r\n public updateUniformDirectly(uniformName: string, data: FloatArray) {\r\n this.updateUniform(uniformName, data, data.length);\r\n\r\n this.update();\r\n }\r\n\r\n /**\r\n * Associates an effect to this uniform buffer\r\n * @param effect Define the effect to associate the buffer to\r\n * @param name Name of the uniform block in the shader.\r\n */\r\n public bindToEffect(effect: Effect, name: string): void {\r\n this._currentEffect = effect;\r\n this._currentEffectName = name;\r\n }\r\n\r\n /**\r\n * Binds the current (GPU) buffer to the effect\r\n */\r\n public bindUniformBuffer(): void {\r\n if (!this._noUBO && this._buffer && this._currentEffect) {\r\n this._currentEffect.bindUniformBuffer(this._buffer, this._currentEffectName);\r\n }\r\n }\r\n\r\n /**\r\n * Dissociates the current effect from this uniform buffer\r\n */\r\n public unbindEffect(): void {\r\n this._currentEffect = undefined as any;\r\n this._currentEffectName = undefined as any;\r\n }\r\n\r\n /**\r\n * Sets the current state of the class (_bufferIndex, _buffer) to point to the data buffer passed in parameter if this buffer is one of the buffers handled by the class (meaning if it can be found in the _buffers array)\r\n * This method is meant to be able to update a buffer at any time: just call setDataBuffer to set the class in the right state, call some updateXXX methods and then call udpate() => that will update the GPU buffer on the graphic card\r\n * @param dataBuffer buffer to look for\r\n * @returns true if the buffer has been found and the class internal state points to it, else false\r\n */\r\n public setDataBuffer(dataBuffer: DataBuffer): boolean {\r\n if (!this._buffers) {\r\n return this._buffer === dataBuffer;\r\n }\r\n\r\n for (let b = 0; b < this._buffers.length; ++b) {\r\n const buffer = this._buffers[b];\r\n if (buffer[0] === dataBuffer) {\r\n this._bufferIndex = b;\r\n this._buffer = dataBuffer;\r\n this._createBufferOnWrite = false;\r\n this._currentEffect = undefined as any;\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the uniform buffer.\r\n */\r\n public dispose(): void {\r\n if (this._noUBO) {\r\n return;\r\n }\r\n\r\n const uniformBuffers = this._engine._uniformBuffers;\r\n const index = uniformBuffers.indexOf(this);\r\n\r\n if (index !== -1) {\r\n uniformBuffers[index] = uniformBuffers[uniformBuffers.length - 1];\r\n uniformBuffers.pop();\r\n }\r\n\r\n if (this._engine._features.trackUbosInFrame && this._buffers) {\r\n for (let i = 0; i < this._buffers.length; ++i) {\r\n const buffer = this._buffers[i][0];\r\n this._engine._releaseBuffer(buffer!);\r\n }\r\n } else if (this._buffer && this._engine._releaseBuffer(this._buffer)) {\r\n this._buffer = null;\r\n }\r\n }\r\n}\r\n", "import type { Nullable, DataArray, FloatArray } from \"../types\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { DataBuffer } from \"./dataBuffer\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\n/**\r\n * Class used to store data that will be store in GPU memory\r\n */\r\nexport class Buffer {\r\n private _engine: ThinEngine;\r\n private _buffer: Nullable;\r\n /** @internal */\r\n public _data: Nullable;\r\n private _updatable: boolean;\r\n private _instanced: boolean;\r\n private _divisor: number;\r\n private _isAlreadyOwned = false;\r\n private _isDisposed = false;\r\n private _label?: string;\r\n\r\n /**\r\n * Gets a boolean indicating if the Buffer is disposed\r\n */\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * Gets the byte stride.\r\n */\r\n public readonly byteStride: number;\r\n\r\n /**\r\n * Constructor\r\n * @param engine the engine\r\n * @param data the data to use for this buffer\r\n * @param updatable whether the data is updatable\r\n * @param stride the stride (optional)\r\n * @param postponeInternalCreation whether to postpone creating the internal WebGL buffer (optional)\r\n * @param instanced whether the buffer is instanced (optional)\r\n * @param useBytes set to true if the stride in in bytes (optional)\r\n * @param divisor sets an optional divisor for instances (1 by default)\r\n * @param label defines the label of the buffer (for debug purpose)\r\n */\r\n constructor(\r\n engine: ThinEngine,\r\n data: DataArray | DataBuffer,\r\n updatable: boolean,\r\n stride = 0,\r\n postponeInternalCreation = false,\r\n instanced = false,\r\n useBytes = false,\r\n divisor?: number,\r\n label?: string\r\n ) {\r\n if (engine && (engine as unknown as Mesh).getScene) {\r\n // old versions of VertexBuffer accepted 'mesh' instead of 'engine'\r\n this._engine = (engine as unknown as Mesh).getScene().getEngine();\r\n } else {\r\n this._engine = engine;\r\n }\r\n\r\n this._updatable = updatable;\r\n this._instanced = instanced;\r\n this._divisor = divisor || 1;\r\n this._label = label;\r\n\r\n if (data instanceof DataBuffer) {\r\n this._data = null;\r\n this._buffer = data;\r\n } else {\r\n this._data = data;\r\n this._buffer = null;\r\n }\r\n\r\n this.byteStride = useBytes ? stride : stride * Float32Array.BYTES_PER_ELEMENT;\r\n\r\n if (!postponeInternalCreation) {\r\n // by default\r\n this.create();\r\n }\r\n }\r\n\r\n /**\r\n * Create a new VertexBuffer based on the current buffer\r\n * @param kind defines the vertex buffer kind (position, normal, etc.)\r\n * @param offset defines offset in the buffer (0 by default)\r\n * @param size defines the size in floats of attributes (position is 3 for instance)\r\n * @param stride defines the stride size in floats in the buffer (the offset to apply to reach next value when data is interleaved)\r\n * @param instanced defines if the vertex buffer contains indexed data\r\n * @param useBytes defines if the offset and stride are in bytes *\r\n * @param divisor sets an optional divisor for instances (1 by default)\r\n * @returns the new vertex buffer\r\n */\r\n public createVertexBuffer(kind: string, offset: number, size: number, stride?: number, instanced?: boolean, useBytes = false, divisor?: number): VertexBuffer {\r\n const byteOffset = useBytes ? offset : offset * Float32Array.BYTES_PER_ELEMENT;\r\n const byteStride = stride ? (useBytes ? stride : stride * Float32Array.BYTES_PER_ELEMENT) : this.byteStride;\r\n\r\n // a lot of these parameters are ignored as they are overridden by the buffer\r\n return new VertexBuffer(\r\n this._engine,\r\n this,\r\n kind,\r\n this._updatable,\r\n true,\r\n byteStride,\r\n instanced === undefined ? this._instanced : instanced,\r\n byteOffset,\r\n size,\r\n undefined,\r\n undefined,\r\n true,\r\n this._divisor || divisor\r\n );\r\n }\r\n\r\n // Properties\r\n\r\n /**\r\n * Gets a boolean indicating if the Buffer is updatable?\r\n * @returns true if the buffer is updatable\r\n */\r\n public isUpdatable(): boolean {\r\n return this._updatable;\r\n }\r\n\r\n /**\r\n * Gets current buffer's data\r\n * @returns a DataArray or null\r\n */\r\n public getData(): Nullable {\r\n return this._data;\r\n }\r\n\r\n /**\r\n * Gets underlying native buffer\r\n * @returns underlying native buffer\r\n */\r\n public getBuffer(): Nullable {\r\n return this._buffer;\r\n }\r\n\r\n /**\r\n * Gets the stride in float32 units (i.e. byte stride / 4).\r\n * May not be an integer if the byte stride is not divisible by 4.\r\n * @returns the stride in float32 units\r\n * @deprecated Please use byteStride instead.\r\n */\r\n public getStrideSize(): number {\r\n return this.byteStride / Float32Array.BYTES_PER_ELEMENT;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Store data into the buffer. Creates the buffer if not used already.\r\n * If the buffer was already used, it will be updated only if it is updatable, otherwise it will do nothing.\r\n * @param data defines the data to store\r\n */\r\n public create(data: Nullable = null): void {\r\n if (!data && this._buffer) {\r\n return; // nothing to do\r\n }\r\n\r\n data = data || this._data;\r\n\r\n if (!data) {\r\n return;\r\n }\r\n\r\n if (!this._buffer) {\r\n // create buffer\r\n if (this._updatable) {\r\n this._buffer = this._engine.createDynamicVertexBuffer(data, this._label);\r\n this._data = data;\r\n } else {\r\n this._buffer = this._engine.createVertexBuffer(data, undefined, this._label);\r\n }\r\n } else if (this._updatable) {\r\n // update buffer\r\n this._engine.updateDynamicVertexBuffer(this._buffer, data);\r\n this._data = data;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (!this._data) {\r\n if (!this._buffer) {\r\n // Buffer was not yet created, nothing to do\r\n return;\r\n }\r\n if (this._buffer.capacity > 0) {\r\n // We can at least recreate the buffer with the right size, even if we don't have the data\r\n if (this._updatable) {\r\n this._buffer = this._engine.createDynamicVertexBuffer(this._buffer.capacity, this._label);\r\n } else {\r\n this._buffer = this._engine.createVertexBuffer(this._buffer.capacity, undefined, this._label);\r\n }\r\n return;\r\n }\r\n Logger.Warn(`Missing data for buffer \"${this._label}\" ${this._buffer ? \"(uniqueId: \" + this._buffer.uniqueId + \")\" : \"\"}. Buffer reconstruction failed.`);\r\n this._buffer = null;\r\n } else {\r\n this._buffer = null;\r\n this.create(this._data);\r\n }\r\n }\r\n\r\n /**\r\n * Update current buffer data\r\n * @param data defines the data to store\r\n */\r\n public update(data: DataArray): void {\r\n this.create(data);\r\n }\r\n\r\n /**\r\n * Updates the data directly.\r\n * @param data the new data\r\n * @param offset the new offset\r\n * @param vertexCount the vertex count (optional)\r\n * @param useBytes set to true if the offset is in bytes\r\n */\r\n public updateDirectly(data: DataArray, offset: number, vertexCount?: number, useBytes: boolean = false): void {\r\n if (!this._buffer) {\r\n return;\r\n }\r\n\r\n if (this._updatable) {\r\n // update buffer\r\n this._engine.updateDynamicVertexBuffer(\r\n this._buffer,\r\n data,\r\n useBytes ? offset : offset * Float32Array.BYTES_PER_ELEMENT,\r\n vertexCount ? vertexCount * this.byteStride : undefined\r\n );\r\n if (offset === 0 && vertexCount === undefined) {\r\n // Keep the data if we easily can\r\n this._data = data;\r\n } else {\r\n this._data = null;\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _increaseReferences() {\r\n if (!this._buffer) {\r\n return;\r\n }\r\n\r\n if (!this._isAlreadyOwned) {\r\n this._isAlreadyOwned = true;\r\n return;\r\n }\r\n\r\n this._buffer.references++;\r\n }\r\n\r\n /**\r\n * Release all resources\r\n */\r\n public dispose(): void {\r\n if (!this._buffer) {\r\n return;\r\n }\r\n\r\n // The data buffer has an internal counter as this buffer can be used by several VertexBuffer objects\r\n // This means that we only flag it as disposed when all references are released (when _releaseBuffer will return true)\r\n if (this._engine._releaseBuffer(this._buffer)) {\r\n this._isDisposed = true;\r\n this._data = null;\r\n this._buffer = null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Options to be used when creating a vertex buffer\r\n */\r\nexport interface IVertexBufferOptions {\r\n /**\r\n * whether the data is updatable (default: false)\r\n */\r\n updatable?: boolean;\r\n /**\r\n * whether to postpone creating the internal WebGL buffer (default: false)\r\n */\r\n postponeInternalCreation?: boolean;\r\n /**\r\n * the stride (will be automatically computed from the kind parameter if not specified)\r\n */\r\n stride?: number;\r\n /**\r\n * whether the buffer is instanced (default: false)\r\n */\r\n instanced?: boolean;\r\n /**\r\n * the offset of the data (default: 0)\r\n */\r\n offset?: number;\r\n /**\r\n * the number of components (will be automatically computed from the kind parameter if not specified)\r\n */\r\n size?: number;\r\n /**\r\n * the type of the component (will be deduce from the data parameter if not specified)\r\n */\r\n type?: number;\r\n /**\r\n * whether the data contains normalized data (default: false)\r\n */\r\n normalized?: boolean;\r\n /**\r\n * set to true if stride and offset are in bytes (default: false)\r\n */\r\n useBytes?: boolean;\r\n /**\r\n * defines the instance divisor to use (default: 1, only used if instanced is true)\r\n */\r\n divisor?: number;\r\n /**\r\n * defines if the buffer should be released when the vertex buffer is disposed (default: false)\r\n */\r\n takeBufferOwnership?: boolean;\r\n /**\r\n * label to use for this vertex buffer (debugging purpose)\r\n */\r\n label?: string;\r\n}\r\n\r\n/**\r\n * Specialized buffer used to store vertex data\r\n */\r\nexport class VertexBuffer {\r\n private static _Counter = 0;\r\n\r\n /** @internal */\r\n public _buffer: Buffer;\r\n /** @internal */\r\n public _validOffsetRange: boolean; // used internally by the engine\r\n private _kind: string;\r\n private _size: number;\r\n /** @internal */\r\n public _ownsBuffer: boolean;\r\n private _instanced: boolean;\r\n private _instanceDivisor: number;\r\n /** @internal */\r\n public _isDisposed = false;\r\n /** @internal */\r\n public _label?: string;\r\n\r\n /**\r\n * The byte type.\r\n */\r\n public static readonly BYTE = Constants.BYTE;\r\n\r\n /**\r\n * The unsigned byte type.\r\n */\r\n public static readonly UNSIGNED_BYTE = Constants.UNSIGNED_BYTE;\r\n\r\n /**\r\n * The short type.\r\n */\r\n public static readonly SHORT = Constants.SHORT;\r\n\r\n /**\r\n * The unsigned short type.\r\n */\r\n public static readonly UNSIGNED_SHORT = Constants.UNSIGNED_SHORT;\r\n\r\n /**\r\n * The integer type.\r\n */\r\n public static readonly INT = Constants.INT;\r\n\r\n /**\r\n * The unsigned integer type.\r\n */\r\n public static readonly UNSIGNED_INT = Constants.UNSIGNED_INT;\r\n\r\n /**\r\n * The float type.\r\n */\r\n public static readonly FLOAT = Constants.FLOAT;\r\n\r\n /**\r\n * Gets a boolean indicating if the Buffer is disposed\r\n */\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * Gets or sets the instance divisor when in instanced mode\r\n */\r\n public get instanceDivisor(): number {\r\n return this._instanceDivisor;\r\n }\r\n\r\n public set instanceDivisor(value: number) {\r\n const isInstanced = value != 0;\r\n this._instanceDivisor = value;\r\n\r\n if (isInstanced !== this._instanced) {\r\n this._instanced = isInstanced;\r\n this._computeHashCode();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the byte stride.\r\n */\r\n public readonly byteStride: number;\r\n\r\n /**\r\n * Gets the byte offset.\r\n */\r\n public readonly byteOffset: number;\r\n\r\n /**\r\n * Gets whether integer data values should be normalized into a certain range when being casted to a float.\r\n */\r\n public readonly normalized: boolean;\r\n\r\n /**\r\n * Gets the data type of each component in the array.\r\n */\r\n public readonly type: number;\r\n\r\n /**\r\n * Gets the unique id of this vertex buffer\r\n */\r\n public readonly uniqueId: number;\r\n\r\n /**\r\n * Gets a hash code representing the format (type, normalized, size, instanced, stride) of this buffer\r\n * All buffers with the same format will have the same hash code\r\n */\r\n public readonly hashCode: number;\r\n\r\n /**\r\n * Gets the engine associated with the buffer\r\n */\r\n public readonly engine: ThinEngine;\r\n\r\n /**\r\n * Gets the max possible amount of vertices stored within the current vertex buffer.\r\n * We do not have the end offset or count so this will be too big for concatenated vertex buffers.\r\n * @internal\r\n */\r\n public get _maxVerticesCount() {\r\n const data = this.getData();\r\n if (!data) {\r\n return 0;\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n // data is a regular number[] with float values\r\n return data.length / (this.byteStride / 4) - this.byteOffset / 4;\r\n }\r\n\r\n return (data.byteLength - this.byteOffset) / this.byteStride;\r\n }\r\n\r\n /**\r\n * Constructor\r\n * @param engine the engine\r\n * @param data the data to use for this vertex buffer\r\n * @param kind the vertex buffer kind\r\n * @param updatable whether the data is updatable\r\n * @param postponeInternalCreation whether to postpone creating the internal WebGL buffer (optional)\r\n * @param stride the stride (optional)\r\n * @param instanced whether the buffer is instanced (optional)\r\n * @param offset the offset of the data (optional)\r\n * @param size the number of components (optional)\r\n * @param type the type of the component (optional)\r\n * @param normalized whether the data contains normalized data (optional)\r\n * @param useBytes set to true if stride and offset are in bytes (optional)\r\n * @param divisor defines the instance divisor to use (1 by default)\r\n * @param takeBufferOwnership defines if the buffer should be released when the vertex buffer is disposed\r\n */\r\n constructor(\r\n engine: ThinEngine,\r\n data: DataArray | Buffer | DataBuffer,\r\n kind: string,\r\n updatable: boolean,\r\n postponeInternalCreation?: boolean,\r\n stride?: number,\r\n instanced?: boolean,\r\n offset?: number,\r\n size?: number,\r\n type?: number,\r\n normalized?: boolean,\r\n useBytes?: boolean,\r\n divisor?: number,\r\n takeBufferOwnership?: boolean\r\n );\r\n\r\n /**\r\n * Constructor\r\n * @param engine the engine\r\n * @param data the data to use for this vertex buffer\r\n * @param kind the vertex buffer kind\r\n * @param options defines the rest of the options used to create the buffer\r\n */\r\n constructor(engine: ThinEngine, data: DataArray | Buffer | DataBuffer, kind: string, options?: IVertexBufferOptions);\r\n\r\n /** @internal */\r\n constructor(\r\n engine: ThinEngine,\r\n data: DataArray | Buffer | DataBuffer,\r\n kind: string,\r\n updatableOrOptions?: boolean | IVertexBufferOptions,\r\n postponeInternalCreation?: boolean,\r\n stride?: number,\r\n instanced?: boolean,\r\n offset?: number,\r\n size?: number,\r\n type?: number,\r\n normalized = false,\r\n useBytes = false,\r\n divisor = 1,\r\n takeBufferOwnership = false\r\n ) {\r\n let updatable = false;\r\n\r\n this.engine = engine;\r\n\r\n if (typeof updatableOrOptions === \"object\" && updatableOrOptions !== null) {\r\n updatable = updatableOrOptions.updatable ?? false;\r\n postponeInternalCreation = updatableOrOptions.postponeInternalCreation;\r\n stride = updatableOrOptions.stride;\r\n instanced = updatableOrOptions.instanced;\r\n offset = updatableOrOptions.offset;\r\n size = updatableOrOptions.size;\r\n type = updatableOrOptions.type;\r\n normalized = updatableOrOptions.normalized ?? false;\r\n useBytes = updatableOrOptions.useBytes ?? false;\r\n divisor = updatableOrOptions.divisor ?? 1;\r\n takeBufferOwnership = updatableOrOptions.takeBufferOwnership ?? false;\r\n this._label = updatableOrOptions.label;\r\n } else {\r\n updatable = !!updatableOrOptions;\r\n }\r\n\r\n if (data instanceof Buffer) {\r\n this._buffer = data;\r\n this._ownsBuffer = takeBufferOwnership;\r\n } else {\r\n this._buffer = new Buffer(engine, data, updatable, stride, postponeInternalCreation, instanced, useBytes, divisor, this._label);\r\n this._ownsBuffer = true;\r\n }\r\n\r\n this.uniqueId = VertexBuffer._Counter++;\r\n this._kind = kind;\r\n\r\n if (type === undefined) {\r\n const vertexData = this.getData();\r\n this.type = vertexData ? VertexBuffer.GetDataType(vertexData) : VertexBuffer.FLOAT;\r\n } else {\r\n this.type = type;\r\n }\r\n\r\n const typeByteLength = VertexBuffer.GetTypeByteLength(this.type);\r\n\r\n if (useBytes) {\r\n this._size = size || (stride ? stride / typeByteLength : VertexBuffer.DeduceStride(kind));\r\n this.byteStride = stride || this._buffer.byteStride || this._size * typeByteLength;\r\n this.byteOffset = offset || 0;\r\n } else {\r\n this._size = size || stride || VertexBuffer.DeduceStride(kind);\r\n this.byteStride = stride ? stride * typeByteLength : this._buffer.byteStride || this._size * typeByteLength;\r\n this.byteOffset = (offset || 0) * typeByteLength;\r\n }\r\n\r\n this.normalized = normalized;\r\n\r\n this._instanced = instanced !== undefined ? instanced : false;\r\n this._instanceDivisor = instanced ? divisor : 0;\r\n\r\n this._alignBuffer();\r\n this._computeHashCode();\r\n }\r\n\r\n private _computeHashCode(): void {\r\n // note: cast to any because the property is declared readonly\r\n (this.hashCode as any) =\r\n ((this.type - 5120) << 0) +\r\n ((this.normalized ? 1 : 0) << 3) +\r\n (this._size << 4) +\r\n ((this._instanced ? 1 : 0) << 6) +\r\n /* keep 5 bits free */\r\n (this.byteStride << 12);\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n this._buffer?._rebuild();\r\n }\r\n\r\n /**\r\n * Returns the kind of the VertexBuffer (string)\r\n * @returns a string\r\n */\r\n public getKind(): string {\r\n return this._kind;\r\n }\r\n\r\n // Properties\r\n\r\n /**\r\n * Gets a boolean indicating if the VertexBuffer is updatable?\r\n * @returns true if the buffer is updatable\r\n */\r\n public isUpdatable(): boolean {\r\n return this._buffer.isUpdatable();\r\n }\r\n\r\n /**\r\n * Gets current buffer's data\r\n * @returns a DataArray or null\r\n */\r\n public getData(): Nullable {\r\n return this._buffer.getData();\r\n }\r\n\r\n /**\r\n * Gets current buffer's data as a float array. Float data is constructed if the vertex buffer data cannot be returned directly.\r\n * @param totalVertices number of vertices in the buffer to take into account\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns a float array containing vertex data\r\n */\r\n public getFloatData(totalVertices: number, forceCopy?: boolean): Nullable {\r\n const data = this.getData();\r\n if (!data) {\r\n return null;\r\n }\r\n\r\n return VertexBuffer.GetFloatData(data, this._size, this.type, this.byteOffset, this.byteStride, this.normalized, totalVertices, forceCopy);\r\n }\r\n\r\n /**\r\n * Gets underlying native buffer\r\n * @returns underlying native buffer\r\n */\r\n public getBuffer(): Nullable {\r\n return this._buffer.getBuffer();\r\n }\r\n\r\n /**\r\n * Gets the Buffer instance that wraps the native GPU buffer\r\n * @returns the wrapper buffer\r\n */\r\n public getWrapperBuffer(): Buffer {\r\n return this._buffer;\r\n }\r\n\r\n /**\r\n * Gets the stride in float32 units (i.e. byte stride / 4).\r\n * May not be an integer if the byte stride is not divisible by 4.\r\n * @returns the stride in float32 units\r\n * @deprecated Please use byteStride instead.\r\n */\r\n public getStrideSize(): number {\r\n return this.byteStride / VertexBuffer.GetTypeByteLength(this.type);\r\n }\r\n\r\n /**\r\n * Returns the offset as a multiple of the type byte length.\r\n * @returns the offset in bytes\r\n * @deprecated Please use byteOffset instead.\r\n */\r\n public getOffset(): number {\r\n return this.byteOffset / VertexBuffer.GetTypeByteLength(this.type);\r\n }\r\n\r\n /**\r\n * Returns the number of components or the byte size per vertex attribute\r\n * @param sizeInBytes If true, returns the size in bytes or else the size in number of components of the vertex attribute (default: false)\r\n * @returns the number of components\r\n */\r\n public getSize(sizeInBytes = false): number {\r\n return sizeInBytes ? this._size * VertexBuffer.GetTypeByteLength(this.type) : this._size;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating is the internal buffer of the VertexBuffer is instanced\r\n * @returns true if this buffer is instanced\r\n */\r\n public getIsInstanced(): boolean {\r\n return this._instanced;\r\n }\r\n\r\n /**\r\n * Returns the instancing divisor, zero for non-instanced (integer).\r\n * @returns a number\r\n */\r\n public getInstanceDivisor(): number {\r\n return this._instanceDivisor;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Store data into the buffer. If the buffer was already used it will be either recreated or updated depending on isUpdatable property\r\n * @param data defines the data to store\r\n */\r\n public create(data?: DataArray): void {\r\n this._buffer.create(data);\r\n this._alignBuffer();\r\n }\r\n\r\n /**\r\n * Updates the underlying buffer according to the passed numeric array or Float32Array.\r\n * This function will create a new buffer if the current one is not updatable\r\n * @param data defines the data to store\r\n */\r\n public update(data: DataArray): void {\r\n this._buffer.update(data);\r\n this._alignBuffer();\r\n }\r\n\r\n /**\r\n * Updates directly the underlying WebGLBuffer according to the passed numeric array or Float32Array.\r\n * Returns the directly updated WebGLBuffer.\r\n * @param data the new data\r\n * @param offset the new offset\r\n * @param useBytes set to true if the offset is in bytes\r\n */\r\n public updateDirectly(data: DataArray, offset: number, useBytes: boolean = false): void {\r\n this._buffer.updateDirectly(data, offset, undefined, useBytes);\r\n this._alignBuffer();\r\n }\r\n\r\n /**\r\n * Disposes the VertexBuffer and the underlying WebGLBuffer.\r\n */\r\n public dispose(): void {\r\n if (this._ownsBuffer) {\r\n this._buffer.dispose();\r\n }\r\n\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * Enumerates each value of this vertex buffer as numbers.\r\n * @param count the number of values to enumerate\r\n * @param callback the callback function called for each value\r\n */\r\n public forEach(count: number, callback: (value: number, index: number) => void): void {\r\n VertexBuffer.ForEach(this._buffer.getData()!, this.byteOffset, this.byteStride, this._size, this.type, count, this.normalized, callback);\r\n }\r\n\r\n /** @internal */\r\n public _alignBuffer() {}\r\n\r\n // Enums\r\n /**\r\n * Positions\r\n */\r\n public static readonly PositionKind = Constants.PositionKind;\r\n /**\r\n * Normals\r\n */\r\n public static readonly NormalKind = Constants.NormalKind;\r\n /**\r\n * Tangents\r\n */\r\n public static readonly TangentKind = Constants.TangentKind;\r\n /**\r\n * Texture coordinates\r\n */\r\n public static readonly UVKind = Constants.UVKind;\r\n /**\r\n * Texture coordinates 2\r\n */\r\n public static readonly UV2Kind = Constants.UV2Kind;\r\n /**\r\n * Texture coordinates 3\r\n */\r\n public static readonly UV3Kind = Constants.UV3Kind;\r\n /**\r\n * Texture coordinates 4\r\n */\r\n public static readonly UV4Kind = Constants.UV4Kind;\r\n /**\r\n * Texture coordinates 5\r\n */\r\n public static readonly UV5Kind = Constants.UV5Kind;\r\n /**\r\n * Texture coordinates 6\r\n */\r\n public static readonly UV6Kind = Constants.UV6Kind;\r\n /**\r\n * Colors\r\n */\r\n public static readonly ColorKind = Constants.ColorKind;\r\n /**\r\n * Instance Colors\r\n */\r\n public static readonly ColorInstanceKind = Constants.ColorInstanceKind;\r\n /**\r\n * Matrix indices (for bones)\r\n */\r\n public static readonly MatricesIndicesKind = Constants.MatricesIndicesKind;\r\n /**\r\n * Matrix weights (for bones)\r\n */\r\n public static readonly MatricesWeightsKind = Constants.MatricesWeightsKind;\r\n /**\r\n * Additional matrix indices (for bones)\r\n */\r\n public static readonly MatricesIndicesExtraKind = Constants.MatricesIndicesExtraKind;\r\n /**\r\n * Additional matrix weights (for bones)\r\n */\r\n public static readonly MatricesWeightsExtraKind = Constants.MatricesWeightsExtraKind;\r\n\r\n /**\r\n * Deduces the stride given a kind.\r\n * @param kind The kind string to deduce\r\n * @returns The deduced stride\r\n */\r\n public static DeduceStride(kind: string): number {\r\n switch (kind) {\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind:\r\n case VertexBuffer.UV3Kind:\r\n case VertexBuffer.UV4Kind:\r\n case VertexBuffer.UV5Kind:\r\n case VertexBuffer.UV6Kind:\r\n return 2;\r\n case VertexBuffer.NormalKind:\r\n case VertexBuffer.PositionKind:\r\n return 3;\r\n case VertexBuffer.ColorKind:\r\n case VertexBuffer.ColorInstanceKind:\r\n case VertexBuffer.MatricesIndicesKind:\r\n case VertexBuffer.MatricesIndicesExtraKind:\r\n case VertexBuffer.MatricesWeightsKind:\r\n case VertexBuffer.MatricesWeightsExtraKind:\r\n case VertexBuffer.TangentKind:\r\n return 4;\r\n default:\r\n throw new Error(\"Invalid kind '\" + kind + \"'\");\r\n }\r\n }\r\n\r\n /**\r\n * Gets the vertex buffer type of the given data array.\r\n * @param data the data array\r\n * @returns the vertex buffer type\r\n */\r\n public static GetDataType(data: DataArray): number {\r\n if (data instanceof Int8Array) {\r\n return VertexBuffer.BYTE;\r\n } else if (data instanceof Uint8Array) {\r\n return VertexBuffer.UNSIGNED_BYTE;\r\n } else if (data instanceof Int16Array) {\r\n return VertexBuffer.SHORT;\r\n } else if (data instanceof Uint16Array) {\r\n return VertexBuffer.UNSIGNED_SHORT;\r\n } else if (data instanceof Int32Array) {\r\n return VertexBuffer.INT;\r\n } else if (data instanceof Uint32Array) {\r\n return VertexBuffer.UNSIGNED_INT;\r\n } else {\r\n return VertexBuffer.FLOAT;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the byte length of the given type.\r\n * @param type the type\r\n * @returns the number of bytes\r\n */\r\n public static GetTypeByteLength(type: number): number {\r\n switch (type) {\r\n case VertexBuffer.BYTE:\r\n case VertexBuffer.UNSIGNED_BYTE:\r\n return 1;\r\n case VertexBuffer.SHORT:\r\n case VertexBuffer.UNSIGNED_SHORT:\r\n return 2;\r\n case VertexBuffer.INT:\r\n case VertexBuffer.UNSIGNED_INT:\r\n case VertexBuffer.FLOAT:\r\n return 4;\r\n default:\r\n throw new Error(`Invalid type '${type}'`);\r\n }\r\n }\r\n\r\n /**\r\n * Enumerates each value of the given parameters as numbers.\r\n * @param data the data to enumerate\r\n * @param byteOffset the byte offset of the data\r\n * @param byteStride the byte stride of the data\r\n * @param componentCount the number of components per element\r\n * @param componentType the type of the component\r\n * @param count the number of values to enumerate\r\n * @param normalized whether the data is normalized\r\n * @param callback the callback function called for each value\r\n */\r\n public static ForEach(\r\n data: DataArray,\r\n byteOffset: number,\r\n byteStride: number,\r\n componentCount: number,\r\n componentType: number,\r\n count: number,\r\n normalized: boolean,\r\n callback: (value: number, index: number) => void\r\n ): void {\r\n if (data instanceof Array) {\r\n let offset = byteOffset / 4;\r\n const stride = byteStride / 4;\r\n for (let index = 0; index < count; index += componentCount) {\r\n for (let componentIndex = 0; componentIndex < componentCount; componentIndex++) {\r\n callback(data[offset + componentIndex], index + componentIndex);\r\n }\r\n offset += stride;\r\n }\r\n } else {\r\n const dataView = data instanceof ArrayBuffer ? new DataView(data) : new DataView(data.buffer, data.byteOffset, data.byteLength);\r\n const componentByteLength = VertexBuffer.GetTypeByteLength(componentType);\r\n for (let index = 0; index < count; index += componentCount) {\r\n let componentByteOffset = byteOffset;\r\n for (let componentIndex = 0; componentIndex < componentCount; componentIndex++) {\r\n const value = VertexBuffer._GetFloatValue(dataView, componentType, componentByteOffset, normalized);\r\n callback(value, index + componentIndex);\r\n componentByteOffset += componentByteLength;\r\n }\r\n byteOffset += byteStride;\r\n }\r\n }\r\n }\r\n\r\n private static _GetFloatValue(dataView: DataView, type: number, byteOffset: number, normalized: boolean): number {\r\n switch (type) {\r\n case VertexBuffer.BYTE: {\r\n let value = dataView.getInt8(byteOffset);\r\n if (normalized) {\r\n value = Math.max(value / 127, -1);\r\n }\r\n return value;\r\n }\r\n case VertexBuffer.UNSIGNED_BYTE: {\r\n let value = dataView.getUint8(byteOffset);\r\n if (normalized) {\r\n value = value / 255;\r\n }\r\n return value;\r\n }\r\n case VertexBuffer.SHORT: {\r\n let value = dataView.getInt16(byteOffset, true);\r\n if (normalized) {\r\n value = Math.max(value / 32767, -1);\r\n }\r\n return value;\r\n }\r\n case VertexBuffer.UNSIGNED_SHORT: {\r\n let value = dataView.getUint16(byteOffset, true);\r\n if (normalized) {\r\n value = value / 65535;\r\n }\r\n return value;\r\n }\r\n case VertexBuffer.INT: {\r\n return dataView.getInt32(byteOffset, true);\r\n }\r\n case VertexBuffer.UNSIGNED_INT: {\r\n return dataView.getUint32(byteOffset, true);\r\n }\r\n case VertexBuffer.FLOAT: {\r\n return dataView.getFloat32(byteOffset, true);\r\n }\r\n default: {\r\n throw new Error(`Invalid component type ${type}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the given data array as a float array. Float data is constructed if the data array cannot be returned directly.\r\n * @param data the input data array\r\n * @param size the number of components\r\n * @param type the component type\r\n * @param byteOffset the byte offset of the data\r\n * @param byteStride the byte stride of the data\r\n * @param normalized whether the data is normalized\r\n * @param totalVertices number of vertices in the buffer to take into account\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns a float array containing vertex data\r\n */\r\n public static GetFloatData(\r\n data: DataArray,\r\n size: number,\r\n type: number,\r\n byteOffset: number,\r\n byteStride: number,\r\n normalized: boolean,\r\n totalVertices: number,\r\n forceCopy?: boolean\r\n ): FloatArray {\r\n const tightlyPackedByteStride = size * VertexBuffer.GetTypeByteLength(type);\r\n const count = totalVertices * size;\r\n\r\n if (type !== VertexBuffer.FLOAT || byteStride !== tightlyPackedByteStride) {\r\n const copy = new Float32Array(count);\r\n VertexBuffer.ForEach(data, byteOffset, byteStride, size, type, count, normalized, (value, index) => (copy[index] = value));\r\n return copy;\r\n }\r\n\r\n if (!(data instanceof Array || data instanceof Float32Array) || byteOffset !== 0 || data.length !== count) {\r\n if (data instanceof Array) {\r\n const offset = byteOffset / 4;\r\n return data.slice(offset, offset + count);\r\n } else if (data instanceof ArrayBuffer) {\r\n return new Float32Array(data, byteOffset, count);\r\n } else {\r\n let offset = data.byteOffset + byteOffset;\r\n if (forceCopy) {\r\n const result = new Float32Array(count);\r\n const source = new Float32Array(data.buffer, offset, count);\r\n\r\n result.set(source);\r\n\r\n return result;\r\n }\r\n\r\n // Protect against bad data\r\n const remainder = offset % 4;\r\n\r\n if (remainder) {\r\n offset = Math.max(0, offset - remainder);\r\n }\r\n\r\n return new Float32Array(data.buffer, offset, count);\r\n }\r\n }\r\n\r\n if (forceCopy) {\r\n return data.slice();\r\n }\r\n\r\n return data;\r\n }\r\n}\r\n", "import type { Nullable, FloatArray } from \"../types\";\r\nimport { Vector3, Vector2, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { Sprite } from \"../Sprites/sprite\";\r\n\r\nimport type { Ray } from \"../Culling/ray\";\r\n\r\n/**\r\n * Information about the result of picking within a scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/picking_collisions\r\n */\r\nexport class PickingInfo {\r\n /**\r\n * If the pick collided with an object\r\n */\r\n public hit = false;\r\n /**\r\n * Distance away where the pick collided\r\n */\r\n public distance = 0;\r\n /**\r\n * The location of pick collision\r\n */\r\n public pickedPoint: Nullable = null;\r\n /**\r\n * The mesh corresponding the pick collision\r\n */\r\n public pickedMesh: Nullable = null;\r\n /** (See getTextureCoordinates) The barycentric U coordinate that is used when calculating the texture coordinates of the collision.*/\r\n public bu = 0;\r\n /** (See getTextureCoordinates) The barycentric V coordinate that is used when calculating the texture coordinates of the collision.*/\r\n public bv = 0;\r\n /** The index of the face on the mesh that was picked, or the index of the Line if the picked Mesh is a LinesMesh */\r\n public faceId = -1;\r\n /** The index of the face on the subMesh that was picked, or the index of the Line if the picked Mesh is a LinesMesh */\r\n public subMeshFaceId = -1;\r\n /** Id of the submesh that was picked */\r\n public subMeshId = 0;\r\n /** If a sprite was picked, this will be the sprite the pick collided with */\r\n public pickedSprite: Nullable = null;\r\n /** If we are picking a mesh with thin instance, this will give you the picked thin instance */\r\n public thinInstanceIndex = -1;\r\n /**\r\n * The ray that was used to perform the picking.\r\n */\r\n public ray: Nullable = null;\r\n /**\r\n * If a mesh was used to do the picking (eg. 6dof controller) as a \"near interaction\", this will be populated.\r\n */\r\n public originMesh: Nullable = null;\r\n /**\r\n * The aim-space transform of the input used for picking, if it is an XR input source.\r\n */\r\n public aimTransform: Nullable = null;\r\n /**\r\n * The grip-space transform of the input used for picking, if it is an XR input source.\r\n * Some XR sources, such as input coming from head mounted displays, do not have this.\r\n */\r\n public gripTransform: Nullable = null;\r\n\r\n /**\r\n * Gets the normal corresponding to the face the pick collided with\r\n * @param useWorldCoordinates If the resulting normal should be relative to the world (default: false)\r\n * @param useVerticesNormals If the vertices normals should be used to calculate the normal instead of the normal map (default: true)\r\n * @returns The normal corresponding to the face the pick collided with\r\n * @remarks Note that the returned normal will always point towards the picking ray.\r\n */\r\n public getNormal(useWorldCoordinates = false, useVerticesNormals = true): Nullable {\r\n if (!this.pickedMesh || (useVerticesNormals && !this.pickedMesh.isVerticesDataPresent(VertexBuffer.NormalKind))) {\r\n return null;\r\n }\r\n\r\n let indices = this.pickedMesh.getIndices();\r\n\r\n if (indices?.length === 0) {\r\n indices = null;\r\n }\r\n\r\n let result: Vector3;\r\n\r\n const tmp0 = TmpVectors.Vector3[0];\r\n const tmp1 = TmpVectors.Vector3[1];\r\n const tmp2 = TmpVectors.Vector3[2];\r\n\r\n if (useVerticesNormals) {\r\n const normals = this.pickedMesh.getVerticesData(VertexBuffer.NormalKind);\r\n\r\n let normal0 = indices\r\n ? Vector3.FromArrayToRef(normals, indices[this.faceId * 3] * 3, tmp0)\r\n : tmp0.copyFromFloats(normals[this.faceId * 3 * 3], normals[this.faceId * 3 * 3 + 1], normals[this.faceId * 3 * 3 + 2]);\r\n let normal1 = indices\r\n ? Vector3.FromArrayToRef(normals, indices[this.faceId * 3 + 1] * 3, tmp1)\r\n : tmp1.copyFromFloats(normals[(this.faceId * 3 + 1) * 3], normals[(this.faceId * 3 + 1) * 3 + 1], normals[(this.faceId * 3 + 1) * 3 + 2]);\r\n let normal2 = indices\r\n ? Vector3.FromArrayToRef(normals, indices[this.faceId * 3 + 2] * 3, tmp2)\r\n : tmp2.copyFromFloats(normals[(this.faceId * 3 + 2) * 3], normals[(this.faceId * 3 + 2) * 3 + 1], normals[(this.faceId * 3 + 2) * 3 + 2]);\r\n\r\n normal0 = normal0.scale(this.bu);\r\n normal1 = normal1.scale(this.bv);\r\n normal2 = normal2.scale(1.0 - this.bu - this.bv);\r\n\r\n result = new Vector3(normal0.x + normal1.x + normal2.x, normal0.y + normal1.y + normal2.y, normal0.z + normal1.z + normal2.z);\r\n } else {\r\n const positions = this.pickedMesh.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n const vertex1 = indices\r\n ? Vector3.FromArrayToRef(positions, indices[this.faceId * 3] * 3, tmp0)\r\n : tmp0.copyFromFloats(positions[this.faceId * 3 * 3], positions[this.faceId * 3 * 3 + 1], positions[this.faceId * 3 * 3 + 2]);\r\n const vertex2 = indices\r\n ? Vector3.FromArrayToRef(positions, indices[this.faceId * 3 + 1] * 3, tmp1)\r\n : tmp1.copyFromFloats(positions[(this.faceId * 3 + 1) * 3], positions[(this.faceId * 3 + 1) * 3 + 1], positions[(this.faceId * 3 + 1) * 3 + 2]);\r\n const vertex3 = indices\r\n ? Vector3.FromArrayToRef(positions, indices[this.faceId * 3 + 2] * 3, tmp2)\r\n : tmp2.copyFromFloats(positions[(this.faceId * 3 + 2) * 3], positions[(this.faceId * 3 + 2) * 3 + 1], positions[(this.faceId * 3 + 2) * 3 + 2]);\r\n\r\n const p1p2 = vertex1.subtract(vertex2);\r\n const p3p2 = vertex3.subtract(vertex2);\r\n\r\n result = Vector3.Cross(p1p2, p3p2);\r\n }\r\n\r\n const transformNormalToWorld = (pickedMesh: AbstractMesh, n: Vector3) => {\r\n let wm = pickedMesh.getWorldMatrix();\r\n\r\n if (pickedMesh.nonUniformScaling) {\r\n TmpVectors.Matrix[0].copyFrom(wm);\r\n wm = TmpVectors.Matrix[0];\r\n wm.setTranslationFromFloats(0, 0, 0);\r\n wm.invert();\r\n wm.transposeToRef(TmpVectors.Matrix[1]);\r\n\r\n wm = TmpVectors.Matrix[1];\r\n }\r\n\r\n Vector3.TransformNormalToRef(n, wm, n);\r\n };\r\n\r\n if (useWorldCoordinates) {\r\n transformNormalToWorld(this.pickedMesh, result);\r\n }\r\n\r\n if (this.ray) {\r\n const normalForDirectionChecking = TmpVectors.Vector3[0].copyFrom(result);\r\n\r\n if (!useWorldCoordinates) {\r\n // the normal has not been transformed to world space as part as the normal processing, so we must do it now\r\n transformNormalToWorld(this.pickedMesh, normalForDirectionChecking);\r\n }\r\n\r\n // Flip the normal if the picking ray is in the same direction.\r\n if (Vector3.Dot(normalForDirectionChecking, this.ray.direction) > 0) {\r\n result.negateInPlace();\r\n }\r\n }\r\n\r\n result.normalize();\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the texture coordinates of where the pick occurred\r\n * @param uvSet The UV set to use to calculate the texture coordinates (default: VertexBuffer.UVKind)\r\n * @returns The vector containing the coordinates of the texture\r\n */\r\n public getTextureCoordinates(uvSet = VertexBuffer.UVKind): Nullable {\r\n if (!this.pickedMesh || !this.pickedMesh.isVerticesDataPresent(uvSet)) {\r\n return null;\r\n }\r\n\r\n const indices = this.pickedMesh.getIndices();\r\n if (!indices) {\r\n return null;\r\n }\r\n\r\n const uvs = this.pickedMesh.getVerticesData(uvSet);\r\n if (!uvs) {\r\n return null;\r\n }\r\n\r\n let uv0 = Vector2.FromArray(uvs, indices[this.faceId * 3] * 2);\r\n let uv1 = Vector2.FromArray(uvs, indices[this.faceId * 3 + 1] * 2);\r\n let uv2 = Vector2.FromArray(uvs, indices[this.faceId * 3 + 2] * 2);\r\n\r\n uv0 = uv0.scale(this.bu);\r\n uv1 = uv1.scale(this.bv);\r\n uv2 = uv2.scale(1.0 - this.bu - this.bv);\r\n\r\n return new Vector2(uv0.x + uv1.x + uv2.x, uv0.y + uv1.y + uv2.y);\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport type { PostProcess } from \"./postProcess\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport type { RenderTargetWrapper } from \"../Engines/renderTargetWrapper\";\r\n\r\nimport type { Scene } from \"../scene\";\r\n\r\n/**\r\n * PostProcessManager is used to manage one or more post processes or post process pipelines\r\n * See https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses\r\n */\r\nexport class PostProcessManager {\r\n private _scene: Scene;\r\n private _indexBuffer: Nullable;\r\n private _vertexBuffers: { [key: string]: Nullable } = {};\r\n\r\n /**\r\n * Creates a new instance PostProcess\r\n * @param scene The scene that the post process is associated with.\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n }\r\n\r\n private _prepareBuffers(): void {\r\n if (this._vertexBuffers[VertexBuffer.PositionKind]) {\r\n return;\r\n }\r\n\r\n // VBO\r\n const vertices = [];\r\n vertices.push(1, 1);\r\n vertices.push(-1, 1);\r\n vertices.push(-1, -1);\r\n vertices.push(1, -1);\r\n\r\n this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(this._scene.getEngine(), vertices, VertexBuffer.PositionKind, false, false, 2);\r\n\r\n this._buildIndexBuffer();\r\n }\r\n\r\n private _buildIndexBuffer(): void {\r\n // Indices\r\n const indices = [];\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n this._indexBuffer = this._scene.getEngine().createIndexBuffer(indices);\r\n }\r\n\r\n /**\r\n * Rebuilds the vertex buffers of the manager.\r\n * @internal\r\n */\r\n public _rebuild(): void {\r\n const vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n\r\n if (!vb) {\r\n return;\r\n }\r\n vb._rebuild();\r\n this._buildIndexBuffer();\r\n }\r\n\r\n // Methods\r\n /**\r\n * Prepares a frame to be run through a post process.\r\n * @param sourceTexture The input texture to the post processes. (default: null)\r\n * @param postProcesses An array of post processes to be run. (default: null)\r\n * @returns True if the post processes were able to be run.\r\n * @internal\r\n */\r\n public _prepareFrame(sourceTexture: Nullable = null, postProcesses: Nullable = null): boolean {\r\n const camera = this._scene.activeCamera;\r\n if (!camera) {\r\n return false;\r\n }\r\n\r\n postProcesses = postProcesses || >camera._postProcesses.filter((pp) => {\r\n return pp != null;\r\n });\r\n\r\n if (!postProcesses || postProcesses.length === 0 || !this._scene.postProcessesEnabled) {\r\n return false;\r\n }\r\n\r\n postProcesses[0].activate(camera, sourceTexture, postProcesses !== null && postProcesses !== undefined);\r\n return true;\r\n }\r\n\r\n /**\r\n * Manually render a set of post processes to a texture.\r\n * Please note, the frame buffer won't be unbound after the call in case you have more render to do.\r\n * @param postProcesses An array of post processes to be run.\r\n * @param targetTexture The render target wrapper to render to.\r\n * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight\r\n * @param faceIndex defines the face to render to if a cubemap is defined as the target\r\n * @param lodLevel defines which lod of the texture to render to\r\n * @param doNotBindFrambuffer If set to true, assumes that the framebuffer has been bound previously\r\n */\r\n public directRender(\r\n postProcesses: PostProcess[],\r\n targetTexture: Nullable = null,\r\n forceFullscreenViewport = false,\r\n faceIndex = 0,\r\n lodLevel = 0,\r\n doNotBindFrambuffer = false\r\n ): void {\r\n const engine = this._scene.getEngine();\r\n\r\n for (let index = 0; index < postProcesses.length; index++) {\r\n if (index < postProcesses.length - 1) {\r\n postProcesses[index + 1].activate(this._scene.activeCamera, targetTexture?.texture);\r\n } else {\r\n if (targetTexture) {\r\n engine.bindFramebuffer(targetTexture, faceIndex, undefined, undefined, forceFullscreenViewport, lodLevel);\r\n } else if (!doNotBindFrambuffer) {\r\n engine.restoreDefaultFramebuffer();\r\n }\r\n engine._debugInsertMarker?.(`post process ${postProcesses[index].name} output`);\r\n }\r\n\r\n const pp = postProcesses[index];\r\n const effect = pp.apply();\r\n\r\n if (effect) {\r\n pp.onBeforeRenderObservable.notifyObservers(effect);\r\n\r\n // VBOs\r\n this._prepareBuffers();\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n\r\n // Draw order\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, 6);\r\n\r\n pp.onAfterRenderObservable.notifyObservers(effect);\r\n }\r\n }\r\n\r\n // Restore depth buffer\r\n engine.setDepthBuffer(true);\r\n engine.setDepthWrite(true);\r\n }\r\n\r\n /**\r\n * Finalize the result of the output of the postprocesses.\r\n * @param doNotPresent If true the result will not be displayed to the screen.\r\n * @param targetTexture The render target wrapper to render to.\r\n * @param faceIndex The index of the face to bind the target texture to.\r\n * @param postProcesses The array of post processes to render.\r\n * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight (default: false)\r\n * @internal\r\n */\r\n public _finalizeFrame(\r\n doNotPresent?: boolean,\r\n targetTexture?: RenderTargetWrapper,\r\n faceIndex?: number,\r\n postProcesses?: Array,\r\n forceFullscreenViewport = false\r\n ): void {\r\n const camera = this._scene.activeCamera;\r\n\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n postProcesses = postProcesses || >camera._postProcesses.filter((pp) => {\r\n return pp != null;\r\n });\r\n if (postProcesses.length === 0 || !this._scene.postProcessesEnabled) {\r\n return;\r\n }\r\n const engine = this._scene.getEngine();\r\n\r\n for (let index = 0, len = postProcesses.length; index < len; index++) {\r\n const pp = postProcesses[index];\r\n\r\n if (index < len - 1) {\r\n pp._outputTexture = postProcesses[index + 1].activate(camera, targetTexture?.texture);\r\n } else {\r\n if (targetTexture) {\r\n engine.bindFramebuffer(targetTexture, faceIndex, undefined, undefined, forceFullscreenViewport);\r\n pp._outputTexture = targetTexture;\r\n } else {\r\n engine.restoreDefaultFramebuffer();\r\n pp._outputTexture = null;\r\n }\r\n engine._debugInsertMarker?.(`post process ${postProcesses[index].name} output`);\r\n }\r\n\r\n if (doNotPresent) {\r\n break;\r\n }\r\n\r\n const effect = pp.apply();\r\n\r\n if (effect) {\r\n pp.onBeforeRenderObservable.notifyObservers(effect);\r\n\r\n // VBOs\r\n this._prepareBuffers();\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n\r\n // Draw order\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, 6);\r\n\r\n pp.onAfterRenderObservable.notifyObservers(effect);\r\n }\r\n }\r\n\r\n // Restore states\r\n engine.setDepthBuffer(true);\r\n engine.setDepthWrite(true);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n /**\r\n * Disposes of the post process manager.\r\n */\r\n public dispose(): void {\r\n const buffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (buffer) {\r\n buffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._scene.getEngine()._releaseBuffer(this._indexBuffer);\r\n this._indexBuffer = null;\r\n }\r\n }\r\n}\r\n", "import { SmartArray, SmartArrayNoDuplicate } from \"../Misc/smartArray\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Nullable, DeepImmutable } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport type { IEdgesRenderer } from \"./edgesRenderer\";\r\nimport type { ISpriteManager } from \"../Sprites/spriteManager\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\n\r\n/**\r\n * This represents the object necessary to create a rendering group.\r\n * This is exclusively used and created by the rendering manager.\r\n * To modify the behavior, you use the available helpers in your scene or meshes.\r\n * @internal\r\n */\r\nexport class RenderingGroup {\r\n private static _ZeroVector: DeepImmutable = Vector3.Zero();\r\n private _scene: Scene;\r\n private _opaqueSubMeshes = new SmartArray(256);\r\n private _transparentSubMeshes = new SmartArray(256);\r\n private _alphaTestSubMeshes = new SmartArray(256);\r\n private _depthOnlySubMeshes = new SmartArray(256);\r\n private _particleSystems = new SmartArray(256);\r\n private _spriteManagers = new SmartArray(256);\r\n\r\n private _opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>;\r\n private _alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>;\r\n private _transparentSortCompareFn: (a: SubMesh, b: SubMesh) => number;\r\n\r\n private _renderOpaque: (subMeshes: SmartArray) => void;\r\n private _renderAlphaTest: (subMeshes: SmartArray) => void;\r\n private _renderTransparent: (subMeshes: SmartArray) => void;\r\n\r\n /** @internal */\r\n public _empty = true;\r\n\r\n /** @internal */\r\n public _edgesRenderers = new SmartArrayNoDuplicate(16);\r\n\r\n public onBeforeTransparentRendering: () => void;\r\n\r\n /**\r\n * Set the opaque sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set opaqueSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._opaqueSortCompareFn = value;\r\n } else {\r\n this._opaqueSortCompareFn = RenderingGroup.PainterSortCompare;\r\n }\r\n this._renderOpaque = this._renderOpaqueSorted;\r\n }\r\n\r\n /**\r\n * Set the alpha test sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set alphaTestSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._alphaTestSortCompareFn = value;\r\n } else {\r\n this._alphaTestSortCompareFn = RenderingGroup.PainterSortCompare;\r\n }\r\n this._renderAlphaTest = this._renderAlphaTestSorted;\r\n }\r\n\r\n /**\r\n * Set the transparent sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set transparentSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._transparentSortCompareFn = value;\r\n } else {\r\n this._transparentSortCompareFn = RenderingGroup.defaultTransparentSortCompare;\r\n }\r\n this._renderTransparent = this._renderTransparentSorted;\r\n }\r\n\r\n /**\r\n * Creates a new rendering group.\r\n * @param index The rendering group index\r\n * @param scene\r\n * @param opaqueSortCompareFn The opaque sort comparison function. If null no order is applied\r\n * @param alphaTestSortCompareFn The alpha test sort comparison function. If null no order is applied\r\n * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied\r\n */\r\n constructor(\r\n public index: number,\r\n scene: Scene,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ) {\r\n this._scene = scene;\r\n\r\n this.opaqueSortCompareFn = opaqueSortCompareFn;\r\n this.alphaTestSortCompareFn = alphaTestSortCompareFn;\r\n this.transparentSortCompareFn = transparentSortCompareFn;\r\n }\r\n\r\n /**\r\n * Render all the sub meshes contained in the group.\r\n * @param customRenderFunction Used to override the default render behaviour of the group.\r\n * @param renderSprites\r\n * @param renderParticles\r\n * @param activeMeshes\r\n */\r\n public render(\r\n customRenderFunction: Nullable<\r\n (\r\n opaqueSubMeshes: SmartArray,\r\n transparentSubMeshes: SmartArray,\r\n alphaTestSubMeshes: SmartArray,\r\n depthOnlySubMeshes: SmartArray\r\n ) => void\r\n >,\r\n renderSprites: boolean,\r\n renderParticles: boolean,\r\n activeMeshes: Nullable\r\n ): void {\r\n if (customRenderFunction) {\r\n customRenderFunction(this._opaqueSubMeshes, this._alphaTestSubMeshes, this._transparentSubMeshes, this._depthOnlySubMeshes);\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n // Depth only\r\n if (this._depthOnlySubMeshes.length !== 0) {\r\n engine.setColorWrite(false);\r\n this._renderAlphaTest(this._depthOnlySubMeshes);\r\n engine.setColorWrite(true);\r\n }\r\n\r\n // Opaque\r\n if (this._opaqueSubMeshes.length !== 0) {\r\n this._renderOpaque(this._opaqueSubMeshes);\r\n }\r\n\r\n // Alpha test\r\n if (this._alphaTestSubMeshes.length !== 0) {\r\n this._renderAlphaTest(this._alphaTestSubMeshes);\r\n }\r\n\r\n const stencilState = engine.getStencilBuffer();\r\n engine.setStencilBuffer(false);\r\n\r\n // Sprites\r\n if (renderSprites) {\r\n this._renderSprites();\r\n }\r\n\r\n // Particles\r\n if (renderParticles) {\r\n this._renderParticles(activeMeshes);\r\n }\r\n\r\n if (this.onBeforeTransparentRendering) {\r\n this.onBeforeTransparentRendering();\r\n }\r\n\r\n // Transparent\r\n if (this._transparentSubMeshes.length !== 0 || this._scene.useOrderIndependentTransparency) {\r\n engine.setStencilBuffer(stencilState);\r\n if (this._scene.useOrderIndependentTransparency) {\r\n const excludedMeshes = this._scene.depthPeelingRenderer!.render(this._transparentSubMeshes);\r\n if (excludedMeshes.length) {\r\n // Render leftover meshes that could not be processed by depth peeling\r\n this._renderTransparent(excludedMeshes);\r\n }\r\n } else {\r\n this._renderTransparent(this._transparentSubMeshes);\r\n }\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Set back stencil to false in case it changes before the edge renderer.\r\n engine.setStencilBuffer(false);\r\n\r\n // Edges\r\n if (this._edgesRenderers.length) {\r\n for (let edgesRendererIndex = 0; edgesRendererIndex < this._edgesRenderers.length; edgesRendererIndex++) {\r\n this._edgesRenderers.data[edgesRendererIndex].render();\r\n }\r\n\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Restore Stencil state.\r\n engine.setStencilBuffer(stencilState);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the opaqueSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderOpaqueSorted(subMeshes: SmartArray): void {\r\n RenderingGroup._RenderSorted(subMeshes, this._opaqueSortCompareFn, this._scene.activeCamera, false);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the alphatestSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderAlphaTestSorted(subMeshes: SmartArray): void {\r\n RenderingGroup._RenderSorted(subMeshes, this._alphaTestSortCompareFn, this._scene.activeCamera, false);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the transparentSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderTransparentSorted(subMeshes: SmartArray): void {\r\n RenderingGroup._RenderSorted(subMeshes, this._transparentSortCompareFn, this._scene.activeCamera, true);\r\n }\r\n\r\n /**\r\n * Renders the submeshes in a specified order.\r\n * @param subMeshes The submeshes to sort before render\r\n * @param sortCompareFn The comparison function use to sort\r\n * @param camera The camera position use to preprocess the submeshes to help sorting\r\n * @param transparent Specifies to activate blending if true\r\n */\r\n private static _RenderSorted(\r\n subMeshes: SmartArray,\r\n sortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>,\r\n camera: Nullable,\r\n transparent: boolean\r\n ): void {\r\n let subIndex = 0;\r\n let subMesh: SubMesh;\r\n const cameraPosition = camera ? camera.globalPosition : RenderingGroup._ZeroVector;\r\n\r\n if (transparent) {\r\n for (; subIndex < subMeshes.length; subIndex++) {\r\n subMesh = subMeshes.data[subIndex];\r\n subMesh._alphaIndex = subMesh.getMesh().alphaIndex;\r\n subMesh._distanceToCamera = Vector3.Distance(subMesh.getBoundingInfo().boundingSphere.centerWorld, cameraPosition);\r\n }\r\n }\r\n\r\n const sortedArray = subMeshes.length === subMeshes.data.length ? subMeshes.data : subMeshes.data.slice(0, subMeshes.length);\r\n\r\n if (sortCompareFn) {\r\n sortedArray.sort(sortCompareFn);\r\n }\r\n\r\n const scene = sortedArray[0].getMesh().getScene();\r\n for (subIndex = 0; subIndex < sortedArray.length; subIndex++) {\r\n subMesh = sortedArray[subIndex];\r\n\r\n if (scene._activeMeshesFrozenButKeepClipping && !subMesh.isInFrustum(scene._frustumPlanes)) {\r\n continue;\r\n }\r\n\r\n if (transparent) {\r\n const material = subMesh.getMaterial();\r\n\r\n if (material && material.needDepthPrePass) {\r\n const engine = material.getScene().getEngine();\r\n engine.setColorWrite(false);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n subMesh.render(false);\r\n engine.setColorWrite(true);\r\n }\r\n }\r\n\r\n subMesh.render(transparent);\r\n }\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered back to front if in the same alpha index.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static defaultTransparentSortCompare(a: SubMesh, b: SubMesh): number {\r\n // Alpha index first\r\n if (a._alphaIndex > b._alphaIndex) {\r\n return 1;\r\n }\r\n if (a._alphaIndex < b._alphaIndex) {\r\n return -1;\r\n }\r\n\r\n // Then distance to camera\r\n return RenderingGroup.backToFrontSortCompare(a, b);\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered back to front.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static backToFrontSortCompare(a: SubMesh, b: SubMesh): number {\r\n // Then distance to camera\r\n if (a._distanceToCamera < b._distanceToCamera) {\r\n return 1;\r\n }\r\n if (a._distanceToCamera > b._distanceToCamera) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered front to back (prevent overdraw).\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static frontToBackSortCompare(a: SubMesh, b: SubMesh): number {\r\n // Then distance to camera\r\n if (a._distanceToCamera < b._distanceToCamera) {\r\n return -1;\r\n }\r\n if (a._distanceToCamera > b._distanceToCamera) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are grouped by material then geometry.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n public static PainterSortCompare(a: SubMesh, b: SubMesh): number {\r\n const meshA = a.getMesh();\r\n const meshB = b.getMesh();\r\n\r\n if (meshA.material && meshB.material) {\r\n return meshA.material.uniqueId - meshB.material.uniqueId;\r\n }\r\n\r\n return meshA.uniqueId - meshB.uniqueId;\r\n }\r\n\r\n /**\r\n * Resets the different lists of submeshes to prepare a new frame.\r\n */\r\n public prepare(): void {\r\n this._opaqueSubMeshes.reset();\r\n this._transparentSubMeshes.reset();\r\n this._alphaTestSubMeshes.reset();\r\n this._depthOnlySubMeshes.reset();\r\n this._particleSystems.reset();\r\n this.prepareSprites();\r\n this._edgesRenderers.reset();\r\n this._empty = true;\r\n }\r\n\r\n /**\r\n * Resets the different lists of sprites to prepare a new frame.\r\n */\r\n public prepareSprites(): void {\r\n this._spriteManagers.reset();\r\n }\r\n\r\n public dispose(): void {\r\n this._opaqueSubMeshes.dispose();\r\n this._transparentSubMeshes.dispose();\r\n this._alphaTestSubMeshes.dispose();\r\n this._depthOnlySubMeshes.dispose();\r\n this._particleSystems.dispose();\r\n this._spriteManagers.dispose();\r\n this._edgesRenderers.dispose();\r\n }\r\n\r\n /**\r\n * Inserts the submesh in its correct queue depending on its material.\r\n * @param subMesh The submesh to dispatch\r\n * @param [mesh] Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.\r\n * @param [material] Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.\r\n */\r\n public dispatch(subMesh: SubMesh, mesh?: AbstractMesh, material?: Nullable): void {\r\n // Get mesh and materials if not provided\r\n if (mesh === undefined) {\r\n mesh = subMesh.getMesh();\r\n }\r\n if (material === undefined) {\r\n material = subMesh.getMaterial();\r\n }\r\n\r\n if (material === null || material === undefined) {\r\n return;\r\n }\r\n\r\n if (material.needAlphaBlendingForMesh(mesh)) {\r\n // Transparent\r\n this._transparentSubMeshes.push(subMesh);\r\n } else if (material.needAlphaTesting()) {\r\n // Alpha test\r\n if (material.needDepthPrePass) {\r\n this._depthOnlySubMeshes.push(subMesh);\r\n }\r\n\r\n this._alphaTestSubMeshes.push(subMesh);\r\n } else {\r\n if (material.needDepthPrePass) {\r\n this._depthOnlySubMeshes.push(subMesh);\r\n }\r\n\r\n this._opaqueSubMeshes.push(subMesh); // Opaque\r\n }\r\n\r\n mesh._renderingGroup = this;\r\n\r\n if (mesh._edgesRenderer && mesh._edgesRenderer.isEnabled) {\r\n this._edgesRenderers.pushNoDuplicate(mesh._edgesRenderer);\r\n }\r\n\r\n this._empty = false;\r\n }\r\n\r\n public dispatchSprites(spriteManager: ISpriteManager) {\r\n this._spriteManagers.push(spriteManager);\r\n this._empty = false;\r\n }\r\n\r\n public dispatchParticles(particleSystem: IParticleSystem) {\r\n this._particleSystems.push(particleSystem);\r\n this._empty = false;\r\n }\r\n\r\n private _renderParticles(activeMeshes: Nullable): void {\r\n if (this._particleSystems.length === 0) {\r\n return;\r\n }\r\n\r\n // Particles\r\n const activeCamera = this._scene.activeCamera;\r\n this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene);\r\n for (let particleIndex = 0; particleIndex < this._particleSystems.length; particleIndex++) {\r\n const particleSystem = this._particleSystems.data[particleIndex];\r\n\r\n if ((activeCamera && activeCamera.layerMask & particleSystem.layerMask) === 0) {\r\n continue;\r\n }\r\n\r\n const emitter: any = particleSystem.emitter;\r\n if (!emitter.position || !activeMeshes || activeMeshes.indexOf(emitter) !== -1) {\r\n this._scene._activeParticles.addCount(particleSystem.render(), false);\r\n }\r\n }\r\n this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n\r\n private _renderSprites(): void {\r\n if (!this._scene.spritesEnabled || this._spriteManagers.length === 0) {\r\n return;\r\n }\r\n\r\n // Sprites\r\n const activeCamera = this._scene.activeCamera;\r\n this._scene.onBeforeSpritesRenderingObservable.notifyObservers(this._scene);\r\n for (let id = 0; id < this._spriteManagers.length; id++) {\r\n const spriteManager = this._spriteManagers.data[id];\r\n\r\n if ((activeCamera && activeCamera.layerMask & spriteManager.layerMask) !== 0) {\r\n spriteManager.render();\r\n }\r\n }\r\n this._scene.onAfterSpritesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\nimport type { SmartArray } from \"../Misc/smartArray\";\r\nimport type { ISpriteManager } from \"../Sprites/spriteManager\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport { RenderingGroup } from \"./renderingGroup\";\r\n\r\nimport type { Scene } from \"../scene\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\n\r\n/**\r\n * Interface describing the different options available in the rendering manager\r\n * regarding Auto Clear between groups.\r\n */\r\nexport interface IRenderingManagerAutoClearSetup {\r\n /**\r\n * Defines whether or not autoclear is enable.\r\n */\r\n autoClear: boolean;\r\n /**\r\n * Defines whether or not to autoclear the depth buffer.\r\n */\r\n depth: boolean;\r\n /**\r\n * Defines whether or not to autoclear the stencil buffer.\r\n */\r\n stencil: boolean;\r\n}\r\n\r\n/**\r\n * This class is used by the onRenderingGroupObservable\r\n */\r\nexport class RenderingGroupInfo {\r\n /**\r\n * The Scene that being rendered\r\n */\r\n scene: Scene;\r\n\r\n /**\r\n * The camera currently used for the rendering pass\r\n */\r\n camera: Nullable;\r\n\r\n /**\r\n * The ID of the renderingGroup being processed\r\n */\r\n renderingGroupId: number;\r\n}\r\n\r\n/**\r\n * This is the manager responsible of all the rendering for meshes sprites and particles.\r\n * It is enable to manage the different groups as well as the different necessary sort functions.\r\n * This should not be used directly aside of the few static configurations\r\n */\r\nexport class RenderingManager {\r\n /**\r\n * The max id used for rendering groups (not included)\r\n */\r\n public static MAX_RENDERINGGROUPS = 4;\r\n\r\n /**\r\n * The min id used for rendering groups (included)\r\n */\r\n public static MIN_RENDERINGGROUPS = 0;\r\n\r\n /**\r\n * Used to globally prevent autoclearing scenes.\r\n */\r\n public static AUTOCLEAR = true;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _useSceneAutoClearSetup = false;\r\n\r\n private _scene: Scene;\r\n private _renderingGroups = new Array();\r\n private _depthStencilBufferAlreadyCleaned: boolean;\r\n\r\n private _autoClearDepthStencil: { [id: number]: IRenderingManagerAutoClearSetup } = {};\r\n private _customOpaqueSortCompareFn: { [id: number]: Nullable<(a: SubMesh, b: SubMesh) => number> } = {};\r\n private _customAlphaTestSortCompareFn: { [id: number]: Nullable<(a: SubMesh, b: SubMesh) => number> } = {};\r\n private _customTransparentSortCompareFn: { [id: number]: Nullable<(a: SubMesh, b: SubMesh) => number> } = {};\r\n private _renderingGroupInfo: Nullable = new RenderingGroupInfo();\r\n\r\n private _maintainStateBetweenFrames = false;\r\n /**\r\n * Gets or sets a boolean indicating that the manager will not reset between frames.\r\n * This means that if a mesh becomes invisible or transparent it will not be visible until this boolean is set to false again.\r\n * By default, the rendering manager will dispatch all active meshes per frame (moving them to the transparent, opaque or alpha testing lists).\r\n * By turning this property on, you will accelerate the rendering by keeping all these lists unchanged between frames.\r\n */\r\n public get maintainStateBetweenFrames() {\r\n return this._maintainStateBetweenFrames;\r\n }\r\n\r\n public set maintainStateBetweenFrames(value: boolean) {\r\n if (value === this._maintainStateBetweenFrames) {\r\n return;\r\n }\r\n\r\n this._maintainStateBetweenFrames = value;\r\n if (!this._maintainStateBetweenFrames) {\r\n this.restoreDispachedFlags();\r\n }\r\n }\r\n\r\n /**\r\n * Restore wasDispatched flags on the lists of elements to render.\r\n */\r\n public restoreDispachedFlags() {\r\n for (const mesh of this._scene.meshes) {\r\n if (mesh.subMeshes) {\r\n for (const subMesh of mesh.subMeshes) {\r\n subMesh._wasDispatched = false;\r\n }\r\n }\r\n }\r\n\r\n if (this._scene.spriteManagers) {\r\n for (const spriteManager of this._scene.spriteManagers) {\r\n spriteManager._wasDispatched = false;\r\n }\r\n }\r\n\r\n for (const particleSystem of this._scene.particleSystems) {\r\n particleSystem._wasDispatched = false;\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates a new rendering group for a particular scene\r\n * @param scene Defines the scene the groups belongs to\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n\r\n for (let i = RenderingManager.MIN_RENDERINGGROUPS; i < RenderingManager.MAX_RENDERINGGROUPS; i++) {\r\n this._autoClearDepthStencil[i] = { autoClear: true, depth: true, stencil: true };\r\n }\r\n }\r\n\r\n /**\r\n * @returns the rendering group with the specified id.\r\n * @param id the id of the rendering group (0 by default)\r\n */\r\n public getRenderingGroup(id: number): RenderingGroup {\r\n const renderingGroupId = id || 0;\r\n\r\n this._prepareRenderingGroup(renderingGroupId);\r\n\r\n return this._renderingGroups[renderingGroupId];\r\n }\r\n\r\n private _clearDepthStencilBuffer(depth = true, stencil = true): void {\r\n if (this._depthStencilBufferAlreadyCleaned) {\r\n return;\r\n }\r\n\r\n this._scene.getEngine().clear(null, false, depth, stencil);\r\n this._depthStencilBufferAlreadyCleaned = true;\r\n }\r\n\r\n /**\r\n * Renders the entire managed groups. This is used by the scene or the different render targets.\r\n * @internal\r\n */\r\n public render(\r\n customRenderFunction: Nullable<\r\n (\r\n opaqueSubMeshes: SmartArray,\r\n transparentSubMeshes: SmartArray,\r\n alphaTestSubMeshes: SmartArray,\r\n depthOnlySubMeshes: SmartArray\r\n ) => void\r\n >,\r\n activeMeshes: Nullable,\r\n renderParticles: boolean,\r\n renderSprites: boolean\r\n ): void {\r\n // Update the observable context (not null as it only goes away on dispose)\r\n const info = this._renderingGroupInfo!;\r\n info.scene = this._scene;\r\n info.camera = this._scene.activeCamera;\r\n\r\n // Dispatch sprites\r\n if (this._scene.spriteManagers && renderSprites) {\r\n for (let index = 0; index < this._scene.spriteManagers.length; index++) {\r\n const manager = this._scene.spriteManagers[index];\r\n this.dispatchSprites(manager);\r\n }\r\n }\r\n\r\n // Render\r\n for (let index = RenderingManager.MIN_RENDERINGGROUPS; index < RenderingManager.MAX_RENDERINGGROUPS; index++) {\r\n this._depthStencilBufferAlreadyCleaned = index === RenderingManager.MIN_RENDERINGGROUPS;\r\n const renderingGroup = this._renderingGroups[index];\r\n if (!renderingGroup || renderingGroup._empty) {\r\n continue;\r\n }\r\n\r\n const renderingGroupMask = 1 << index;\r\n info.renderingGroupId = index;\r\n\r\n // Before Observable\r\n this._scene.onBeforeRenderingGroupObservable.notifyObservers(info, renderingGroupMask);\r\n\r\n // Clear depth/stencil if needed\r\n if (RenderingManager.AUTOCLEAR) {\r\n const autoClear = this._useSceneAutoClearSetup ? this._scene.getAutoClearDepthStencilSetup(index) : this._autoClearDepthStencil[index];\r\n\r\n if (autoClear && autoClear.autoClear) {\r\n this._clearDepthStencilBuffer(autoClear.depth, autoClear.stencil);\r\n }\r\n }\r\n\r\n // Render\r\n for (const step of this._scene._beforeRenderingGroupDrawStage) {\r\n step.action(index);\r\n }\r\n renderingGroup.render(customRenderFunction, renderSprites, renderParticles, activeMeshes);\r\n for (const step of this._scene._afterRenderingGroupDrawStage) {\r\n step.action(index);\r\n }\r\n\r\n // After Observable\r\n this._scene.onAfterRenderingGroupObservable.notifyObservers(info, renderingGroupMask);\r\n }\r\n }\r\n\r\n /**\r\n * Resets the different information of the group to prepare a new frame\r\n * @internal\r\n */\r\n public reset(): void {\r\n if (this.maintainStateBetweenFrames) {\r\n return;\r\n }\r\n\r\n for (let index = RenderingManager.MIN_RENDERINGGROUPS; index < RenderingManager.MAX_RENDERINGGROUPS; index++) {\r\n const renderingGroup = this._renderingGroups[index];\r\n if (renderingGroup) {\r\n renderingGroup.prepare();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resets the sprites information of the group to prepare a new frame\r\n * @internal\r\n */\r\n public resetSprites(): void {\r\n if (this.maintainStateBetweenFrames) {\r\n return;\r\n }\r\n\r\n for (let index = RenderingManager.MIN_RENDERINGGROUPS; index < RenderingManager.MAX_RENDERINGGROUPS; index++) {\r\n const renderingGroup = this._renderingGroups[index];\r\n if (renderingGroup) {\r\n renderingGroup.prepareSprites();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Dispose and release the group and its associated resources.\r\n * @internal\r\n */\r\n public dispose(): void {\r\n this.freeRenderingGroups();\r\n this._renderingGroups.length = 0;\r\n this._renderingGroupInfo = null;\r\n }\r\n\r\n /**\r\n * Clear the info related to rendering groups preventing retention points during dispose.\r\n */\r\n public freeRenderingGroups(): void {\r\n for (let index = RenderingManager.MIN_RENDERINGGROUPS; index < RenderingManager.MAX_RENDERINGGROUPS; index++) {\r\n const renderingGroup = this._renderingGroups[index];\r\n if (renderingGroup) {\r\n renderingGroup.dispose();\r\n }\r\n }\r\n }\r\n\r\n private _prepareRenderingGroup(renderingGroupId: number): void {\r\n if (this._renderingGroups[renderingGroupId] === undefined) {\r\n this._renderingGroups[renderingGroupId] = new RenderingGroup(\r\n renderingGroupId,\r\n this._scene,\r\n this._customOpaqueSortCompareFn[renderingGroupId],\r\n this._customAlphaTestSortCompareFn[renderingGroupId],\r\n this._customTransparentSortCompareFn[renderingGroupId]\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Add a sprite manager to the rendering manager in order to render it this frame.\r\n * @param spriteManager Define the sprite manager to render\r\n */\r\n public dispatchSprites(spriteManager: ISpriteManager) {\r\n if (this.maintainStateBetweenFrames && spriteManager._wasDispatched) {\r\n return;\r\n }\r\n spriteManager._wasDispatched = true;\r\n this.getRenderingGroup(spriteManager.renderingGroupId).dispatchSprites(spriteManager);\r\n }\r\n\r\n /**\r\n * Add a particle system to the rendering manager in order to render it this frame.\r\n * @param particleSystem Define the particle system to render\r\n */\r\n public dispatchParticles(particleSystem: IParticleSystem) {\r\n if (this.maintainStateBetweenFrames && particleSystem._wasDispatched) {\r\n return;\r\n }\r\n particleSystem._wasDispatched = true;\r\n this.getRenderingGroup(particleSystem.renderingGroupId).dispatchParticles(particleSystem);\r\n }\r\n\r\n /**\r\n * Add a submesh to the manager in order to render it this frame\r\n * @param subMesh The submesh to dispatch\r\n * @param mesh Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.\r\n * @param material Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.\r\n */\r\n public dispatch(subMesh: SubMesh, mesh?: AbstractMesh, material?: Nullable): void {\r\n if (mesh === undefined) {\r\n mesh = subMesh.getMesh();\r\n }\r\n if (this.maintainStateBetweenFrames && subMesh._wasDispatched) {\r\n return;\r\n }\r\n subMesh._wasDispatched = true;\r\n this.getRenderingGroup(mesh.renderingGroupId).dispatch(subMesh, mesh, material);\r\n }\r\n\r\n /**\r\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\r\n * This allowed control for front to back rendering or reversely depending of the special needs.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\r\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\r\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\r\n */\r\n public setRenderingOrder(\r\n renderingGroupId: number,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ) {\r\n this._customOpaqueSortCompareFn[renderingGroupId] = opaqueSortCompareFn;\r\n this._customAlphaTestSortCompareFn[renderingGroupId] = alphaTestSortCompareFn;\r\n this._customTransparentSortCompareFn[renderingGroupId] = transparentSortCompareFn;\r\n\r\n if (this._renderingGroups[renderingGroupId]) {\r\n const group = this._renderingGroups[renderingGroupId];\r\n group.opaqueSortCompareFn = this._customOpaqueSortCompareFn[renderingGroupId];\r\n group.alphaTestSortCompareFn = this._customAlphaTestSortCompareFn[renderingGroupId];\r\n group.transparentSortCompareFn = this._customTransparentSortCompareFn[renderingGroupId];\r\n }\r\n }\r\n\r\n /**\r\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\r\n * @param depth Automatically clears depth between groups if true and autoClear is true.\r\n * @param stencil Automatically clears stencil between groups if true and autoClear is true.\r\n */\r\n public setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean, depth = true, stencil = true): void {\r\n this._autoClearDepthStencil[renderingGroupId] = {\r\n autoClear: autoClearDepthStencil,\r\n depth: depth,\r\n stencil: stencil,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the current auto clear configuration for one rendering group of the rendering\r\n * manager.\r\n * @param index the rendering group index to get the information for\r\n * @returns The auto clear setup for the requested rendering group\r\n */\r\n public getAutoClearDepthStencilSetup(index: number): IRenderingManagerAutoClearSetup {\r\n return this._autoClearDepthStencil[index];\r\n }\r\n}\r\n", "import type { Scene } from \"./scene\";\r\nimport type { SmartArrayNoDuplicate } from \"./Misc/smartArray\";\r\nimport type { Nullable } from \"./types\";\r\nimport type { PickingInfo } from \"./Collisions/pickingInfo\";\r\nimport type { AbstractScene } from \"./abstractScene\";\r\nimport type { IPointerEvent } from \"./Events/deviceInputEvents\";\r\n\r\nimport type { Mesh } from \"./Meshes/mesh\";\r\nimport type { Effect } from \"./Materials/effect\";\r\nimport type { Camera } from \"./Cameras/camera\";\r\nimport type { AbstractMesh } from \"./Meshes/abstractMesh\";\r\nimport type { SubMesh } from \"./Meshes/subMesh\";\r\nimport type { RenderTargetTexture } from \"./Materials/Textures/renderTargetTexture\";\r\n\r\n/**\r\n * Groups all the scene component constants in one place to ease maintenance.\r\n * @internal\r\n */\r\nexport class SceneComponentConstants {\r\n public static readonly NAME_EFFECTLAYER = \"EffectLayer\";\r\n public static readonly NAME_LAYER = \"Layer\";\r\n public static readonly NAME_LENSFLARESYSTEM = \"LensFlareSystem\";\r\n public static readonly NAME_BOUNDINGBOXRENDERER = \"BoundingBoxRenderer\";\r\n public static readonly NAME_PARTICLESYSTEM = \"ParticleSystem\";\r\n public static readonly NAME_GAMEPAD = \"Gamepad\";\r\n public static readonly NAME_SIMPLIFICATIONQUEUE = \"SimplificationQueue\";\r\n public static readonly NAME_GEOMETRYBUFFERRENDERER = \"GeometryBufferRenderer\";\r\n public static readonly NAME_PREPASSRENDERER = \"PrePassRenderer\";\r\n public static readonly NAME_DEPTHRENDERER = \"DepthRenderer\";\r\n public static readonly NAME_DEPTHPEELINGRENDERER = \"DepthPeelingRenderer\";\r\n public static readonly NAME_POSTPROCESSRENDERPIPELINEMANAGER = \"PostProcessRenderPipelineManager\";\r\n public static readonly NAME_SPRITE = \"Sprite\";\r\n public static readonly NAME_SUBSURFACE = \"SubSurface\";\r\n public static readonly NAME_OUTLINERENDERER = \"Outline\";\r\n public static readonly NAME_PROCEDURALTEXTURE = \"ProceduralTexture\";\r\n public static readonly NAME_SHADOWGENERATOR = \"ShadowGenerator\";\r\n public static readonly NAME_OCTREE = \"Octree\";\r\n public static readonly NAME_PHYSICSENGINE = \"PhysicsEngine\";\r\n public static readonly NAME_AUDIO = \"Audio\";\r\n public static readonly NAME_FLUIDRENDERER = \"FluidRenderer\";\r\n\r\n public static readonly STEP_ISREADYFORMESH_EFFECTLAYER = 0;\r\n\r\n public static readonly STEP_BEFOREEVALUATEACTIVEMESH_BOUNDINGBOXRENDERER = 0;\r\n\r\n public static readonly STEP_EVALUATESUBMESH_BOUNDINGBOXRENDERER = 0;\r\n\r\n public static readonly STEP_PREACTIVEMESH_BOUNDINGBOXRENDERER = 0;\r\n\r\n public static readonly STEP_CAMERADRAWRENDERTARGET_EFFECTLAYER = 1;\r\n\r\n public static readonly STEP_BEFORECAMERADRAW_PREPASS = 0;\r\n public static readonly STEP_BEFORECAMERADRAW_EFFECTLAYER = 1;\r\n public static readonly STEP_BEFORECAMERADRAW_LAYER = 2;\r\n\r\n public static readonly STEP_BEFORERENDERTARGETDRAW_PREPASS = 0;\r\n public static readonly STEP_BEFORERENDERTARGETDRAW_LAYER = 1;\r\n\r\n public static readonly STEP_BEFORERENDERINGMESH_PREPASS = 0;\r\n public static readonly STEP_BEFORERENDERINGMESH_OUTLINE = 1;\r\n\r\n public static readonly STEP_AFTERRENDERINGMESH_PREPASS = 0;\r\n public static readonly STEP_AFTERRENDERINGMESH_OUTLINE = 1;\r\n\r\n public static readonly STEP_AFTERRENDERINGGROUPDRAW_EFFECTLAYER_DRAW = 0;\r\n public static readonly STEP_AFTERRENDERINGGROUPDRAW_BOUNDINGBOXRENDERER = 1;\r\n\r\n public static readonly STEP_BEFORECAMERAUPDATE_SIMPLIFICATIONQUEUE = 0;\r\n public static readonly STEP_BEFORECAMERAUPDATE_GAMEPAD = 1;\r\n\r\n public static readonly STEP_BEFORECLEAR_PROCEDURALTEXTURE = 0;\r\n public static readonly STEP_BEFORECLEAR_PREPASS = 1;\r\n\r\n public static readonly STEP_BEFORERENDERTARGETCLEAR_PREPASS = 0;\r\n\r\n public static readonly STEP_AFTERRENDERTARGETDRAW_PREPASS = 0;\r\n public static readonly STEP_AFTERRENDERTARGETDRAW_LAYER = 1;\r\n\r\n public static readonly STEP_AFTERCAMERADRAW_PREPASS = 0;\r\n public static readonly STEP_AFTERCAMERADRAW_EFFECTLAYER = 1;\r\n public static readonly STEP_AFTERCAMERADRAW_LENSFLARESYSTEM = 2;\r\n public static readonly STEP_AFTERCAMERADRAW_EFFECTLAYER_DRAW = 3;\r\n public static readonly STEP_AFTERCAMERADRAW_LAYER = 4;\r\n public static readonly STEP_AFTERCAMERADRAW_FLUIDRENDERER = 5;\r\n\r\n public static readonly STEP_AFTERCAMERAPOSTPROCESS_LAYER = 0;\r\n\r\n public static readonly STEP_AFTERRENDERTARGETPOSTPROCESS_LAYER = 0;\r\n\r\n public static readonly STEP_AFTERRENDER_AUDIO = 0;\r\n\r\n public static readonly STEP_GATHERRENDERTARGETS_DEPTHRENDERER = 0;\r\n public static readonly STEP_GATHERRENDERTARGETS_GEOMETRYBUFFERRENDERER = 1;\r\n public static readonly STEP_GATHERRENDERTARGETS_SHADOWGENERATOR = 2;\r\n public static readonly STEP_GATHERRENDERTARGETS_POSTPROCESSRENDERPIPELINEMANAGER = 3;\r\n\r\n public static readonly STEP_GATHERACTIVECAMERARENDERTARGETS_DEPTHRENDERER = 0;\r\n public static readonly STEP_GATHERACTIVECAMERARENDERTARGETS_FLUIDRENDERER = 1;\r\n\r\n public static readonly STEP_POINTERMOVE_SPRITE = 0;\r\n public static readonly STEP_POINTERDOWN_SPRITE = 0;\r\n public static readonly STEP_POINTERUP_SPRITE = 0;\r\n}\r\n\r\n/**\r\n * This represents a scene component.\r\n *\r\n * This is used to decouple the dependency the scene is having on the different workloads like\r\n * layers, post processes...\r\n */\r\nexport interface ISceneComponent {\r\n /**\r\n * The name of the component. Each component must have a unique name.\r\n */\r\n name: string;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n scene: Scene;\r\n\r\n /**\r\n * Register the component to one instance of a scene.\r\n */\r\n register(): void;\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n rebuild(): void;\r\n\r\n /**\r\n * Disposes the component and the associated ressources.\r\n */\r\n dispose(): void;\r\n}\r\n\r\n/**\r\n * This represents a SERIALIZABLE scene component.\r\n *\r\n * This extends Scene Component to add Serialization methods on top.\r\n */\r\nexport interface ISceneSerializableComponent extends ISceneComponent {\r\n /**\r\n * Adds all the elements from the container to the scene\r\n * @param container the container holding the elements\r\n */\r\n addFromContainer(container: AbstractScene): void;\r\n\r\n /**\r\n * Removes all the elements in the container from the scene\r\n * @param container contains the elements to remove\r\n * @param dispose if the removed element should be disposed (default: false)\r\n */\r\n removeFromContainer(container: AbstractScene, dispose?: boolean): void;\r\n\r\n /**\r\n * Serializes the component data to the specified json object\r\n * @param serializationObject The object to serialize to\r\n */\r\n serialize(serializationObject: any): void;\r\n}\r\n\r\n/**\r\n * Strong typing of a Mesh related stage step action\r\n */\r\nexport type MeshStageAction = (mesh: AbstractMesh, hardwareInstancedRendering: boolean) => boolean;\r\n\r\n/**\r\n * Strong typing of a Evaluate Sub Mesh related stage step action\r\n */\r\nexport type EvaluateSubMeshStageAction = (mesh: AbstractMesh, subMesh: SubMesh) => void;\r\n\r\n/**\r\n * Strong typing of a pre active Mesh related stage step action\r\n */\r\nexport type PreActiveMeshStageAction = (mesh: AbstractMesh) => void;\r\n\r\n/**\r\n * Strong typing of a Camera related stage step action\r\n */\r\nexport type CameraStageAction = (camera: Camera) => void;\r\n\r\n/**\r\n * Strong typing of a Camera Frame buffer related stage step action\r\n */\r\nexport type CameraStageFrameBufferAction = (camera: Camera) => boolean;\r\n\r\n/**\r\n * Strong typing of a Render Target related stage step action\r\n */\r\nexport type RenderTargetStageAction = (renderTarget: RenderTargetTexture, faceIndex?: number, layer?: number) => void;\r\n\r\n/**\r\n * Strong typing of a RenderingGroup related stage step action\r\n */\r\nexport type RenderingGroupStageAction = (renderingGroupId: number) => void;\r\n\r\n/**\r\n * Strong typing of a Mesh Render related stage step action\r\n */\r\nexport type RenderingMeshStageAction = (mesh: Mesh, subMesh: SubMesh, batch: any, effect: Nullable) => void;\r\n\r\n/**\r\n * Strong typing of a simple stage step action\r\n */\r\nexport type SimpleStageAction = () => void;\r\n\r\n/**\r\n * Strong typing of a render target action.\r\n */\r\nexport type RenderTargetsStageAction = (renderTargets: SmartArrayNoDuplicate) => void;\r\n\r\n/**\r\n * Strong typing of a pointer move action.\r\n */\r\nexport type PointerMoveStageAction = (\r\n unTranslatedPointerX: number,\r\n unTranslatedPointerY: number,\r\n pickResult: Nullable,\r\n isMeshPicked: boolean,\r\n element: Nullable\r\n) => Nullable;\r\n\r\n/**\r\n * Strong typing of a pointer up/down action.\r\n */\r\nexport type PointerUpDownStageAction = (\r\n unTranslatedPointerX: number,\r\n unTranslatedPointerY: number,\r\n pickResult: Nullable,\r\n evt: IPointerEvent,\r\n doubleClick: boolean\r\n) => Nullable;\r\n\r\n/**\r\n * Representation of a stage in the scene (Basically a list of ordered steps)\r\n * @internal\r\n */\r\nexport class Stage extends Array<{ index: number; component: ISceneComponent; action: T }> {\r\n /**\r\n * Hide ctor from the rest of the world.\r\n * @param items The items to add.\r\n */\r\n private constructor(items?: { index: number; component: ISceneComponent; action: T }[]) {\r\n super(...(items));\r\n }\r\n\r\n /**\r\n * Creates a new Stage.\r\n * @returns A new instance of a Stage\r\n */\r\n static Create(): Stage {\r\n return Object.create(Stage.prototype);\r\n }\r\n\r\n /**\r\n * Registers a step in an ordered way in the targeted stage.\r\n * @param index Defines the position to register the step in\r\n * @param component Defines the component attached to the step\r\n * @param action Defines the action to launch during the step\r\n */\r\n public registerStep(index: number, component: ISceneComponent, action: T): void {\r\n let i = 0;\r\n let maxIndex = Number.MAX_VALUE;\r\n for (; i < this.length; i++) {\r\n const step = this[i];\r\n maxIndex = step.index;\r\n if (index < maxIndex) {\r\n break;\r\n }\r\n }\r\n this.splice(i, 0, { index, component, action: action.bind(component) });\r\n }\r\n\r\n /**\r\n * Clears all the steps from the stage.\r\n */\r\n public clear(): void {\r\n this.length = 0;\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\nimport { Vector2 } from \"../Maths/math.vector\";\r\nimport type { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { IMouseEvent, IPointerEvent } from \"./deviceInputEvents\";\r\nimport type { InputManager } from \"../Inputs/scene.inputManager\";\r\n\r\nimport type { Ray } from \"../Culling/ray\";\r\n\r\n/**\r\n * Gather the list of pointer event types as constants.\r\n */\r\nexport class PointerEventTypes {\r\n /**\r\n * The pointerdown event is fired when a pointer becomes active. For mouse, it is fired when the device transitions from no buttons depressed to at least one button depressed. For touch, it is fired when physical contact is made with the digitizer. For pen, it is fired when the stylus makes physical contact with the digitizer.\r\n */\r\n public static readonly POINTERDOWN = 0x01;\r\n /**\r\n * The pointerup event is fired when a pointer is no longer active.\r\n */\r\n public static readonly POINTERUP = 0x02;\r\n /**\r\n * The pointermove event is fired when a pointer changes coordinates.\r\n */\r\n public static readonly POINTERMOVE = 0x04;\r\n /**\r\n * The pointerwheel event is fired when a mouse wheel has been rotated.\r\n */\r\n public static readonly POINTERWHEEL = 0x08;\r\n /**\r\n * The pointerpick event is fired when a mesh or sprite has been picked by the pointer.\r\n */\r\n public static readonly POINTERPICK = 0x10;\r\n /**\r\n * The pointertap event is fired when a the object has been touched and released without drag.\r\n */\r\n public static readonly POINTERTAP = 0x20;\r\n /**\r\n * The pointerdoubletap event is fired when a the object has been touched and released twice without drag.\r\n */\r\n public static readonly POINTERDOUBLETAP = 0x40;\r\n}\r\n\r\n/**\r\n * Base class of pointer info types.\r\n */\r\nexport class PointerInfoBase {\r\n /**\r\n * Instantiates the base class of pointers info.\r\n * @param type Defines the type of event (PointerEventTypes)\r\n * @param event Defines the related dom event\r\n */\r\n constructor(\r\n /**\r\n * Defines the type of event (PointerEventTypes)\r\n */\r\n public type: number,\r\n /**\r\n * Defines the related dom event\r\n */\r\n public event: IMouseEvent\r\n ) {}\r\n}\r\n\r\n/**\r\n * This class is used to store pointer related info for the onPrePointerObservable event.\r\n * Set the skipOnPointerObservable property to true if you want the engine to stop any process after this event is triggered, even not calling onPointerObservable\r\n */\r\nexport class PointerInfoPre extends PointerInfoBase {\r\n /**\r\n * Ray from a pointer if available (eg. 6dof controller)\r\n */\r\n public ray: Nullable = null;\r\n\r\n /**\r\n * Defines picking info coming from a near interaction (proximity instead of ray-based picking)\r\n */\r\n public nearInteractionPickingInfo: Nullable;\r\n\r\n /**\r\n * The original picking info that was used to trigger the pointer event\r\n */\r\n public originalPickingInfo: Nullable = null;\r\n\r\n /**\r\n * Defines the local position of the pointer on the canvas.\r\n */\r\n public localPosition: Vector2;\r\n\r\n /**\r\n * Defines whether the engine should skip the next OnPointerObservable associated to this pre.\r\n */\r\n public skipOnPointerObservable: boolean;\r\n\r\n /**\r\n * Instantiates a PointerInfoPre to store pointer related info to the onPrePointerObservable event.\r\n * @param type Defines the type of event (PointerEventTypes)\r\n * @param event Defines the related dom event\r\n * @param localX Defines the local x coordinates of the pointer when the event occured\r\n * @param localY Defines the local y coordinates of the pointer when the event occured\r\n */\r\n constructor(type: number, event: IMouseEvent, localX: number, localY: number) {\r\n super(type, event);\r\n this.skipOnPointerObservable = false;\r\n this.localPosition = new Vector2(localX, localY);\r\n }\r\n}\r\n\r\n/**\r\n * This type contains all the data related to a pointer event in Babylon.js.\r\n * The event member is an instance of PointerEvent for all types except PointerWheel and is of type MouseWheelEvent when type equals PointerWheel. The different event types can be found in the PointerEventTypes class.\r\n */\r\nexport class PointerInfo extends PointerInfoBase {\r\n private _pickInfo: Nullable;\r\n private _inputManager: Nullable;\r\n\r\n /**\r\n * Defines the picking info associated with this PointerInfo object (if applicable)\r\n */\r\n public get pickInfo(): Nullable {\r\n if (!this._pickInfo) {\r\n this._generatePickInfo();\r\n }\r\n\r\n return this._pickInfo;\r\n }\r\n /**\r\n * Instantiates a PointerInfo to store pointer related info to the onPointerObservable event.\r\n * @param type Defines the type of event (PointerEventTypes)\r\n * @param event Defines the related dom event\r\n * @param pickInfo Defines the picking info associated to the info (if any)\r\n * @param inputManager Defines the InputManager to use if there is no pickInfo\r\n */\r\n constructor(type: number, event: IMouseEvent, pickInfo: Nullable, inputManager: Nullable = null) {\r\n super(type, event);\r\n this._pickInfo = pickInfo;\r\n this._inputManager = inputManager;\r\n }\r\n\r\n /**\r\n * Generates the picking info if needed\r\n */\r\n /** @internal */\r\n public _generatePickInfo(): void {\r\n if (this._inputManager) {\r\n this._pickInfo = this._inputManager._pickMove(this.event as IPointerEvent);\r\n this._inputManager._setRayOnPointerInfo(this._pickInfo, this.event);\r\n this._inputManager = null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Data relating to a touch event on the screen.\r\n */\r\nexport interface PointerTouch {\r\n /**\r\n * X coordinate of touch.\r\n */\r\n x: number;\r\n /**\r\n * Y coordinate of touch.\r\n */\r\n y: number;\r\n /**\r\n * Id of touch. Unique for each finger.\r\n */\r\n pointerId: number;\r\n /**\r\n * Event type passed from DOM.\r\n */\r\n type: any;\r\n}\r\n", "import type { IKeyboardEvent } from \"./deviceInputEvents\";\r\n\r\n/**\r\n * Gather the list of keyboard event types as constants.\r\n */\r\nexport class KeyboardEventTypes {\r\n /**\r\n * The keydown event is fired when a key becomes active (pressed).\r\n */\r\n public static readonly KEYDOWN = 0x01;\r\n /**\r\n * The keyup event is fired when a key has been released.\r\n */\r\n public static readonly KEYUP = 0x02;\r\n}\r\n\r\n/**\r\n * This class is used to store keyboard related info for the onKeyboardObservable event.\r\n */\r\nexport class KeyboardInfo {\r\n /**\r\n * Instantiates a new keyboard info.\r\n * This class is used to store keyboard related info for the onKeyboardObservable event.\r\n * @param type Defines the type of event (KeyboardEventTypes)\r\n * @param event Defines the related dom event\r\n */\r\n constructor(\r\n /**\r\n * Defines the type of event (KeyboardEventTypes)\r\n */\r\n public type: number,\r\n /**\r\n * Defines the related dom event\r\n */\r\n public event: IKeyboardEvent\r\n ) {}\r\n}\r\n\r\n/**\r\n * This class is used to store keyboard related info for the onPreKeyboardObservable event.\r\n * Set the skipOnKeyboardObservable property to true if you want the engine to stop any process after this event is triggered, even not calling onKeyboardObservable\r\n */\r\nexport class KeyboardInfoPre extends KeyboardInfo {\r\n /**\r\n * Defines whether the engine should skip the next onKeyboardObservable associated to this pre.\r\n */\r\n public skipOnKeyboardObservable: boolean;\r\n\r\n /**\r\n * Defines whether the engine should skip the next onKeyboardObservable associated to this pre.\r\n * @deprecated use skipOnKeyboardObservable property instead\r\n */\r\n public get skipOnPointerObservable() {\r\n return this.skipOnKeyboardObservable;\r\n }\r\n public set skipOnPointerObservable(value) {\r\n this.skipOnKeyboardObservable = value;\r\n }\r\n\r\n /**\r\n * Instantiates a new keyboard pre info.\r\n * This class is used to store keyboard related info for the onPreKeyboardObservable event.\r\n * @param type Defines the type of event (KeyboardEventTypes)\r\n * @param event Defines the related dom event\r\n */\r\n constructor(\r\n /**\r\n * Defines the type of event (KeyboardEventTypes)\r\n */\r\n public type: number,\r\n /**\r\n * Defines the related dom event\r\n */\r\n public event: IKeyboardEvent\r\n ) {\r\n super(type, event);\r\n this.skipOnKeyboardObservable = false;\r\n }\r\n}\r\n", "/**\r\n * Enum for Device Types\r\n */\r\nexport enum DeviceType {\r\n /** Generic */\r\n Generic = 0,\r\n /** Keyboard */\r\n Keyboard = 1,\r\n /** Mouse */\r\n Mouse = 2,\r\n /** Touch Pointers */\r\n Touch = 3,\r\n /** PS4 Dual Shock */\r\n DualShock = 4,\r\n /** Xbox */\r\n Xbox = 5,\r\n /** Switch Controller */\r\n Switch = 6,\r\n /** PS5 DualSense */\r\n DualSense = 7,\r\n}\r\n\r\n// Device Enums\r\n/**\r\n * Enum for All Pointers (Touch/Mouse)\r\n */\r\nexport enum PointerInput {\r\n /** Horizontal Axis (Not used in events/observables; only in polling) */\r\n Horizontal = 0,\r\n /** Vertical Axis (Not used in events/observables; only in polling) */\r\n Vertical = 1,\r\n /** Left Click or Touch */\r\n LeftClick = 2,\r\n /** Middle Click */\r\n MiddleClick = 3,\r\n /** Right Click */\r\n RightClick = 4,\r\n /** Browser Back */\r\n BrowserBack = 5,\r\n /** Browser Forward */\r\n BrowserForward = 6,\r\n /** Mouse Wheel X */\r\n MouseWheelX = 7,\r\n /** Mouse Wheel Y */\r\n MouseWheelY = 8,\r\n /** Mouse Wheel Z */\r\n MouseWheelZ = 9,\r\n /** Used in events/observables to identify if x/y changes occurred */\r\n Move = 12,\r\n}\r\n\r\n/** @internal */\r\nexport enum NativePointerInput {\r\n /** Horizontal Axis */\r\n Horizontal = PointerInput.Horizontal,\r\n /** Vertical Axis */\r\n Vertical = 1,\r\n /** Left Click or Touch */\r\n LeftClick = 2,\r\n /** Middle Click */\r\n MiddleClick = 3,\r\n /** Right Click */\r\n RightClick = 4,\r\n /** Browser Back */\r\n BrowserBack = 5,\r\n /** Browser Forward */\r\n BrowserForward = 6,\r\n /** Mouse Wheel X */\r\n MouseWheelX = 7,\r\n /** Mouse Wheel Y */\r\n MouseWheelY = 8,\r\n /** Mouse Wheel Z */\r\n MouseWheelZ = 9,\r\n /** Delta X */\r\n DeltaHorizontal = 10,\r\n /** Delta Y */\r\n DeltaVertical = 11,\r\n}\r\n\r\n/**\r\n * Enum for Dual Shock Gamepad\r\n */\r\nexport enum DualShockInput {\r\n /** Cross */\r\n Cross = 0,\r\n /** Circle */\r\n Circle = 1,\r\n /** Square */\r\n Square = 2,\r\n /** Triangle */\r\n Triangle = 3,\r\n /** L1 */\r\n L1 = 4,\r\n /** R1 */\r\n R1 = 5,\r\n /** L2 */\r\n L2 = 6,\r\n /** R2 */\r\n R2 = 7,\r\n /** Share */\r\n Share = 8,\r\n /** Options */\r\n Options = 9,\r\n /** L3 */\r\n L3 = 10,\r\n /** R3 */\r\n R3 = 11,\r\n /** DPadUp */\r\n DPadUp = 12,\r\n /** DPadDown */\r\n DPadDown = 13,\r\n /** DPadLeft */\r\n DPadLeft = 14,\r\n /** DRight */\r\n DPadRight = 15,\r\n /** Home */\r\n Home = 16,\r\n /** TouchPad */\r\n TouchPad = 17,\r\n /** LStickXAxis */\r\n LStickXAxis = 18,\r\n /** LStickYAxis */\r\n LStickYAxis = 19,\r\n /** RStickXAxis */\r\n RStickXAxis = 20,\r\n /** RStickYAxis */\r\n RStickYAxis = 21,\r\n}\r\n\r\n/**\r\n * Enum for Dual Sense Gamepad\r\n */\r\nexport enum DualSenseInput {\r\n /** Cross */\r\n Cross = 0,\r\n /** Circle */\r\n Circle = 1,\r\n /** Square */\r\n Square = 2,\r\n /** Triangle */\r\n Triangle = 3,\r\n /** L1 */\r\n L1 = 4,\r\n /** R1 */\r\n R1 = 5,\r\n /** L2 */\r\n L2 = 6,\r\n /** R2 */\r\n R2 = 7,\r\n /** Create */\r\n Create = 8,\r\n /** Options */\r\n Options = 9,\r\n /** L3 */\r\n L3 = 10,\r\n /** R3 */\r\n R3 = 11,\r\n /** DPadUp */\r\n DPadUp = 12,\r\n /** DPadDown */\r\n DPadDown = 13,\r\n /** DPadLeft */\r\n DPadLeft = 14,\r\n /** DRight */\r\n DPadRight = 15,\r\n /** Home */\r\n Home = 16,\r\n /** TouchPad */\r\n TouchPad = 17,\r\n /** LStickXAxis */\r\n LStickXAxis = 18,\r\n /** LStickYAxis */\r\n LStickYAxis = 19,\r\n /** RStickXAxis */\r\n RStickXAxis = 20,\r\n /** RStickYAxis */\r\n RStickYAxis = 21,\r\n}\r\n\r\n/**\r\n * Enum for Xbox Gamepad\r\n */\r\nexport enum XboxInput {\r\n /** A */\r\n A = 0,\r\n /** B */\r\n B = 1,\r\n /** X */\r\n X = 2,\r\n /** Y */\r\n Y = 3,\r\n /** LB */\r\n LB = 4,\r\n /** RB */\r\n RB = 5,\r\n /** LT */\r\n LT = 6,\r\n /** RT */\r\n RT = 7,\r\n /** Back */\r\n Back = 8,\r\n /** Start */\r\n Start = 9,\r\n /** LS */\r\n LS = 10,\r\n /** RS */\r\n RS = 11,\r\n /** DPadUp */\r\n DPadUp = 12,\r\n /** DPadDown */\r\n DPadDown = 13,\r\n /** DPadLeft */\r\n DPadLeft = 14,\r\n /** DRight */\r\n DPadRight = 15,\r\n /** Home */\r\n Home = 16,\r\n /** LStickXAxis */\r\n LStickXAxis = 17,\r\n /** LStickYAxis */\r\n LStickYAxis = 18,\r\n /** RStickXAxis */\r\n RStickXAxis = 19,\r\n /** RStickYAxis */\r\n RStickYAxis = 20,\r\n}\r\n\r\n/**\r\n * Enum for Switch (Pro/JoyCon L+R) Gamepad\r\n */\r\nexport enum SwitchInput {\r\n /** B */\r\n B = 0,\r\n /** A */\r\n A = 1,\r\n /** Y */\r\n Y = 2,\r\n /** X */\r\n X = 3,\r\n /** L */\r\n L = 4,\r\n /** R */\r\n R = 5,\r\n /** ZL */\r\n ZL = 6,\r\n /** ZR */\r\n ZR = 7,\r\n /** Minus */\r\n Minus = 8,\r\n /** Plus */\r\n Plus = 9,\r\n /** LS */\r\n LS = 10,\r\n /** RS */\r\n RS = 11,\r\n /** DPadUp */\r\n DPadUp = 12,\r\n /** DPadDown */\r\n DPadDown = 13,\r\n /** DPadLeft */\r\n DPadLeft = 14,\r\n /** DRight */\r\n DPadRight = 15,\r\n /** Home */\r\n Home = 16,\r\n /** Capture */\r\n Capture = 17,\r\n /** LStickXAxis */\r\n LStickXAxis = 18,\r\n /** LStickYAxis */\r\n LStickYAxis = 19,\r\n /** RStickXAxis */\r\n RStickXAxis = 20,\r\n /** RStickYAxis */\r\n RStickYAxis = 21,\r\n}\r\n", "import type { PointerInput } from \"../DeviceInput/InputDevices/deviceEnums\";\r\n\r\n/**\r\n * Event Types\r\n */\r\nexport enum DeviceInputEventType {\r\n // Pointers\r\n /** PointerMove */\r\n PointerMove,\r\n /** PointerDown */\r\n PointerDown,\r\n /** PointerUp */\r\n PointerUp,\r\n}\r\n\r\n/**\r\n * Native friendly interface for Event Object\r\n */\r\nexport interface IUIEvent {\r\n /**\r\n * Input array index\r\n */\r\n inputIndex: number;\r\n\r\n /**\r\n * Current target for an event\r\n */\r\n currentTarget?: any;\r\n\r\n /**\r\n * Alias for target\r\n * @deprecated Use target instead\r\n */\r\n srcElement?: any;\r\n\r\n /**\r\n * Type of event\r\n */\r\n type: string;\r\n\r\n /**\r\n * Reference to object where object was dispatched\r\n */\r\n target: any;\r\n\r\n /**\r\n * Tells user agent what to do when not explicitly handled\r\n */\r\n preventDefault: () => void;\r\n}\r\n\r\n/**\r\n * Native friendly interface for KeyboardEvent Object\r\n */\r\nexport interface IKeyboardEvent extends IUIEvent {\r\n /**\r\n * Status of Alt key being pressed\r\n */\r\n altKey: boolean;\r\n\r\n /**\r\n * Unicode value of character pressed\r\n * @deprecated Required for event, use keyCode instead.\r\n */\r\n charCode?: number;\r\n\r\n /**\r\n * Code for key based on layout\r\n */\r\n code: string;\r\n\r\n /**\r\n * Status of Ctrl key being pressed\r\n */\r\n ctrlKey: boolean;\r\n\r\n /**\r\n * String representation of key\r\n */\r\n key: string;\r\n /**\r\n * ASCII value of key\r\n * @deprecated Used with DeviceSourceManager\r\n */\r\n keyCode: number;\r\n\r\n /**\r\n * Status of Meta key (eg. Windows key) being pressed\r\n */\r\n metaKey: boolean;\r\n\r\n /**\r\n * Status of Shift key being pressed\r\n */\r\n shiftKey: boolean;\r\n}\r\n\r\n/**\r\n * Native friendly interface for MouseEvent Object\r\n */\r\nexport interface IMouseEvent extends IUIEvent {\r\n /**\r\n * Subset of possible PointerInput values for events, excluding ones that CANNOT be in events organically\r\n */\r\n inputIndex: Exclude;\r\n\r\n /**\r\n * Status of Alt key being pressed\r\n */\r\n altKey: boolean;\r\n\r\n /**\r\n * Value of single mouse button pressed\r\n */\r\n button: number;\r\n\r\n /**\r\n * Value of all mouse buttons pressed\r\n */\r\n buttons: number;\r\n\r\n /**\r\n * Current X coordinate\r\n */\r\n clientX: number;\r\n\r\n /**\r\n * Current Y coordinate\r\n */\r\n clientY: number;\r\n\r\n /**\r\n * Status of Ctrl key being pressed\r\n */\r\n ctrlKey: boolean;\r\n\r\n /**\r\n * Provides current click count\r\n */\r\n detail?: number;\r\n\r\n /**\r\n * Status of Meta key (eg. Windows key) being pressed\r\n */\r\n metaKey: boolean;\r\n\r\n /**\r\n * Delta of movement on X axis\r\n */\r\n movementX: number;\r\n\r\n /**\r\n * Delta of movement on Y axis\r\n */\r\n movementY: number;\r\n\r\n /**\r\n * Delta of movement on X axis\r\n * @deprecated Use 'movementX' instead\r\n */\r\n mozMovementX?: number;\r\n\r\n /**\r\n * Delta of movement on Y axis\r\n * @deprecated Use 'movementY' instead\r\n */\r\n mozMovementY?: number;\r\n\r\n /**\r\n * Delta of movement on X axis\r\n * @deprecated Use 'movementX' instead\r\n */\r\n msMovementX?: number;\r\n\r\n /**\r\n * Delta of movement on Y axis\r\n * @deprecated Use 'movementY' instead\r\n */\r\n msMovementY?: number;\r\n\r\n /**\r\n * Current coordinate of X within container\r\n */\r\n offsetX: number;\r\n\r\n /**\r\n * Current coordinate of Y within container\r\n */\r\n offsetY: number;\r\n\r\n /**\r\n * Horizontal coordinate of event\r\n */\r\n pageX: number;\r\n\r\n /**\r\n * Vertical coordinate of event\r\n */\r\n pageY: number;\r\n\r\n /**\r\n * Status of Shift key being pressed\r\n */\r\n shiftKey: boolean;\r\n\r\n /**\r\n * Delta of movement on X axis\r\n * @deprecated Use 'movementX' instead\r\n */\r\n webkitMovementX?: number;\r\n\r\n /**\r\n * Delta of movement on Y axis\r\n * @deprecated Use 'movementY' instead\r\n */\r\n webkitMovementY?: number;\r\n\r\n /**\r\n * Alias of clientX\r\n */\r\n x: number;\r\n\r\n /**\r\n * Alias of clientY\r\n */\r\n y: number;\r\n}\r\n\r\n/**\r\n * Native friendly interface for PointerEvent Object\r\n */\r\nexport interface IPointerEvent extends IMouseEvent {\r\n /**\r\n * Subset of possible PointerInput values for events, excluding ones that CANNOT be in events organically and mouse wheel values\r\n */\r\n inputIndex: Exclude;\r\n\r\n /**\r\n * Pointer Event ID\r\n */\r\n pointerId: number;\r\n\r\n /**\r\n * Type of pointer\r\n */\r\n pointerType: string;\r\n}\r\n\r\n/**\r\n * Native friendly interface for WheelEvent Object\r\n */\r\nexport interface IWheelEvent extends IMouseEvent {\r\n /**\r\n * Subset of possible PointerInput values for events that can only be used with mouse wheel\r\n */\r\n inputIndex: PointerInput.MouseWheelX | PointerInput.MouseWheelY | PointerInput.MouseWheelZ;\r\n\r\n /**\r\n * Units for delta value\r\n */\r\n deltaMode: number;\r\n\r\n /**\r\n * Horizontal scroll delta\r\n */\r\n deltaX: number;\r\n\r\n /**\r\n * Vertical scroll delta\r\n */\r\n deltaY: number;\r\n\r\n /**\r\n * Z-Axis scroll delta\r\n */\r\n deltaZ: number;\r\n\r\n /**\r\n * WheelDelta (From MouseWheel Event)\r\n * @deprecated\r\n */\r\n wheelDelta?: number;\r\n}\r\n\r\n/**\r\n * Constants used for Events\r\n */\r\nexport class EventConstants {\r\n /**\r\n * Pixel delta for Wheel Events (Default)\r\n */\r\n public static DOM_DELTA_PIXEL = 0x00;\r\n\r\n /**\r\n * Line delta for Wheel Events\r\n */\r\n public static DOM_DELTA_LINE = 0x01;\r\n\r\n /**\r\n * Page delta for Wheel Events\r\n */\r\n public static DOM_DELTA_PAGE = 0x02;\r\n}\r\n", "import type { DeviceType } from \"./deviceEnums\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { DeviceInput } from \"./deviceTypes\";\r\nimport type { IDeviceInputSystem } from \"../inputInterfaces\";\r\nimport type { IKeyboardEvent, IPointerEvent, IWheelEvent } from \"../../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Subset of DeviceInput that only handles pointers and keyboard\r\n */\r\nexport type DeviceSourceEvent = T extends DeviceType.Keyboard\r\n ? IKeyboardEvent\r\n : T extends DeviceType.Mouse\r\n ? IWheelEvent | IPointerEvent\r\n : T extends DeviceType.Touch\r\n ? IPointerEvent\r\n : never;\r\n\r\n/**\r\n * Class that handles all input for a specific device\r\n */\r\nexport class DeviceSource {\r\n // Public Members\r\n /**\r\n * Observable to handle device input changes per device\r\n */\r\n public readonly onInputChangedObservable = new Observable>();\r\n\r\n // Private Members\r\n private readonly _deviceInputSystem: IDeviceInputSystem;\r\n\r\n /**\r\n * Default Constructor\r\n * @param deviceInputSystem - Reference to DeviceInputSystem\r\n * @param deviceType - Type of device\r\n * @param deviceSlot - \"Slot\" or index that device is referenced in\r\n */\r\n constructor(\r\n deviceInputSystem: IDeviceInputSystem,\r\n /** Type of device */\r\n public readonly deviceType: T,\r\n /** \"Slot\" or index that device is referenced in */\r\n public readonly deviceSlot: number = 0\r\n ) {\r\n this._deviceInputSystem = deviceInputSystem;\r\n }\r\n\r\n /**\r\n * Get input for specific input\r\n * @param inputIndex - index of specific input on device\r\n * @returns Input value from DeviceInputSystem\r\n */\r\n public getInput(inputIndex: DeviceInput): number {\r\n return this._deviceInputSystem.pollInput(this.deviceType, this.deviceSlot, inputIndex);\r\n }\r\n}\r\n", "import { Constants } from \"../Engines/constants\";\r\nimport type { IUIEvent } from \"../Events/deviceInputEvents\";\r\nimport { EventConstants } from \"../Events/deviceInputEvents\";\r\nimport type { Nullable } from \"../types\";\r\nimport { DeviceType, NativePointerInput, PointerInput } from \"./InputDevices/deviceEnums\";\r\nimport type { IDeviceInputSystem } from \"./inputInterfaces\";\r\n\r\n/**\r\n * Class to wrap DeviceInputSystem data into an event object\r\n */\r\nexport class DeviceEventFactory {\r\n /**\r\n * Create device input events based on provided type and slot\r\n *\r\n * @param deviceType Type of device\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @param currentState Current value for given input\r\n * @param deviceInputSystem Reference to DeviceInputSystem\r\n * @param elementToAttachTo HTMLElement to reference as target for inputs\r\n * @param pointerId PointerId to use for pointer events\r\n * @returns IUIEvent object\r\n */\r\n public static CreateDeviceEvent(\r\n deviceType: DeviceType,\r\n deviceSlot: number,\r\n inputIndex: number,\r\n currentState: Nullable,\r\n deviceInputSystem: IDeviceInputSystem,\r\n elementToAttachTo?: any,\r\n pointerId?: number\r\n ): IUIEvent {\r\n switch (deviceType) {\r\n case DeviceType.Keyboard:\r\n return this._CreateKeyboardEvent(inputIndex, currentState, deviceInputSystem, elementToAttachTo);\r\n case DeviceType.Mouse:\r\n if (inputIndex === PointerInput.MouseWheelX || inputIndex === PointerInput.MouseWheelY || inputIndex === PointerInput.MouseWheelZ) {\r\n return this._CreateWheelEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo);\r\n }\r\n // eslint-disable-next-line no-fallthrough\r\n case DeviceType.Touch:\r\n return this._CreatePointerEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo, pointerId);\r\n default:\r\n // eslint-disable-next-line no-throw-literal\r\n throw `Unable to generate event for device ${DeviceType[deviceType]}`;\r\n }\r\n }\r\n\r\n /**\r\n * Creates pointer event\r\n *\r\n * @param deviceType Type of device\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @param currentState Current value for given input\r\n * @param deviceInputSystem Reference to DeviceInputSystem\r\n * @param elementToAttachTo HTMLElement to reference as target for inputs\r\n * @param pointerId PointerId to use for pointer events\r\n * @returns IUIEvent object (Pointer)\r\n */\r\n private static _CreatePointerEvent(\r\n deviceType: DeviceType,\r\n deviceSlot: number,\r\n inputIndex: number,\r\n currentState: Nullable,\r\n deviceInputSystem: IDeviceInputSystem,\r\n elementToAttachTo?: any,\r\n pointerId?: number\r\n ): any {\r\n const evt = this._CreateMouseEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo);\r\n\r\n if (deviceType === DeviceType.Mouse) {\r\n evt.deviceType = DeviceType.Mouse;\r\n evt.pointerId = 1;\r\n evt.pointerType = \"mouse\";\r\n } else {\r\n evt.deviceType = DeviceType.Touch;\r\n evt.pointerId = pointerId ?? deviceSlot;\r\n evt.pointerType = \"touch\";\r\n }\r\n\r\n let buttons = 0;\r\n\r\n // Populate buttons property with current state of all mouse buttons\r\n // Uses values found on: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\r\n buttons += deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.LeftClick);\r\n buttons += deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.RightClick) * 2;\r\n buttons += deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.MiddleClick) * 4;\r\n evt.buttons = buttons;\r\n\r\n if (inputIndex === PointerInput.Move) {\r\n evt.type = \"pointermove\";\r\n } else if (inputIndex >= PointerInput.LeftClick && inputIndex <= PointerInput.RightClick) {\r\n evt.type = currentState === 1 ? \"pointerdown\" : \"pointerup\";\r\n evt.button = inputIndex - 2;\r\n }\r\n\r\n return evt;\r\n }\r\n\r\n /**\r\n * Create Mouse Wheel Event\r\n * @param deviceType Type of device\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @param currentState Current value for given input\r\n * @param deviceInputSystem Reference to DeviceInputSystem\r\n * @param elementToAttachTo HTMLElement to reference as target for inputs\r\n * @returns IUIEvent object (Wheel)\r\n */\r\n private static _CreateWheelEvent(\r\n deviceType: DeviceType,\r\n deviceSlot: number,\r\n inputIndex: number,\r\n currentState: Nullable,\r\n deviceInputSystem: IDeviceInputSystem,\r\n elementToAttachTo: any\r\n ): any {\r\n const evt = this._CreateMouseEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo);\r\n\r\n // While WheelEvents don't generally have a pointerId, we used to add one in the InputManager\r\n // This line has been added to make the InputManager more platform-agnostic\r\n // Similar code exists in the WebDeviceInputSystem to handle browser created events\r\n evt.pointerId = 1;\r\n evt.type = \"wheel\";\r\n evt.deltaMode = EventConstants.DOM_DELTA_PIXEL;\r\n evt.deltaX = 0;\r\n evt.deltaY = 0;\r\n evt.deltaZ = 0;\r\n\r\n switch (inputIndex) {\r\n case PointerInput.MouseWheelX:\r\n evt.deltaX = currentState;\r\n break;\r\n case PointerInput.MouseWheelY:\r\n evt.deltaY = currentState;\r\n break;\r\n case PointerInput.MouseWheelZ:\r\n evt.deltaZ = currentState;\r\n break;\r\n }\r\n\r\n return evt;\r\n }\r\n\r\n /**\r\n * Create Mouse Event\r\n * @param deviceType Type of device\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @param currentState Current value for given input\r\n * @param deviceInputSystem Reference to DeviceInputSystem\r\n * @param elementToAttachTo HTMLElement to reference as target for inputs\r\n * @returns IUIEvent object (Mouse)\r\n */\r\n private static _CreateMouseEvent(\r\n deviceType: DeviceType,\r\n deviceSlot: number,\r\n inputIndex: number,\r\n currentState: Nullable,\r\n deviceInputSystem: IDeviceInputSystem,\r\n elementToAttachTo?: any\r\n ): any {\r\n const evt = this._CreateEvent(elementToAttachTo);\r\n const pointerX = deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.Horizontal);\r\n const pointerY = deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.Vertical);\r\n\r\n // Handle offsets/deltas based on existence of HTMLElement\r\n if (elementToAttachTo) {\r\n evt.movementX = 0;\r\n evt.movementY = 0;\r\n evt.offsetX = evt.movementX - elementToAttachTo.getBoundingClientRect().x;\r\n evt.offsetY = evt.movementY - elementToAttachTo.getBoundingClientRect().y;\r\n } else {\r\n evt.movementX = deviceInputSystem.pollInput(deviceType, deviceSlot, NativePointerInput.DeltaHorizontal); // DeltaHorizontal\r\n evt.movementY = deviceInputSystem.pollInput(deviceType, deviceSlot, NativePointerInput.DeltaVertical); // DeltaVertical\r\n evt.offsetX = 0;\r\n evt.offsetY = 0;\r\n }\r\n this._CheckNonCharacterKeys(evt, deviceInputSystem);\r\n\r\n evt.clientX = pointerX;\r\n evt.clientY = pointerY;\r\n evt.x = pointerX;\r\n evt.y = pointerY;\r\n\r\n evt.deviceType = deviceType;\r\n evt.deviceSlot = deviceSlot;\r\n evt.inputIndex = inputIndex;\r\n\r\n return evt;\r\n }\r\n\r\n /**\r\n * Create Keyboard Event\r\n * @param inputIndex Id of input to be checked\r\n * @param currentState Current value for given input\r\n * @param deviceInputSystem Reference to DeviceInputSystem\r\n * @param elementToAttachTo HTMLElement to reference as target for inputs\r\n * @returns IEvent object (Keyboard)\r\n */\r\n private static _CreateKeyboardEvent(inputIndex: number, currentState: Nullable, deviceInputSystem: IDeviceInputSystem, elementToAttachTo?: any): any {\r\n const evt = this._CreateEvent(elementToAttachTo);\r\n this._CheckNonCharacterKeys(evt, deviceInputSystem);\r\n evt.deviceType = DeviceType.Keyboard;\r\n evt.deviceSlot = 0;\r\n evt.inputIndex = inputIndex;\r\n\r\n evt.type = currentState === 1 ? \"keydown\" : \"keyup\";\r\n evt.key = String.fromCharCode(inputIndex);\r\n evt.keyCode = inputIndex;\r\n\r\n return evt;\r\n }\r\n\r\n /**\r\n * Add parameters for non-character keys (Ctrl, Alt, Meta, Shift)\r\n * @param evt Event object to add parameters to\r\n * @param deviceInputSystem DeviceInputSystem to pull values from\r\n */\r\n private static _CheckNonCharacterKeys(evt: any, deviceInputSystem: IDeviceInputSystem): void {\r\n const isKeyboardActive = deviceInputSystem.isDeviceAvailable(DeviceType.Keyboard);\r\n const altKey = isKeyboardActive && deviceInputSystem.pollInput(DeviceType.Keyboard, 0, Constants.INPUT_ALT_KEY) === 1;\r\n const ctrlKey = isKeyboardActive && deviceInputSystem.pollInput(DeviceType.Keyboard, 0, Constants.INPUT_CTRL_KEY) === 1;\r\n const metaKey =\r\n isKeyboardActive &&\r\n (deviceInputSystem.pollInput(DeviceType.Keyboard, 0, Constants.INPUT_META_KEY1) === 1 ||\r\n deviceInputSystem.pollInput(DeviceType.Keyboard, 0, Constants.INPUT_META_KEY2) === 1 ||\r\n deviceInputSystem.pollInput(DeviceType.Keyboard, 0, Constants.INPUT_META_KEY3) === 1);\r\n const shiftKey = isKeyboardActive && deviceInputSystem.pollInput(DeviceType.Keyboard, 0, Constants.INPUT_SHIFT_KEY) === 1;\r\n\r\n evt.altKey = altKey;\r\n evt.ctrlKey = ctrlKey;\r\n evt.metaKey = metaKey;\r\n evt.shiftKey = shiftKey;\r\n }\r\n\r\n /**\r\n * Create base event object\r\n * @param elementToAttachTo Value to use as event target\r\n * @returns\r\n */\r\n private static _CreateEvent(elementToAttachTo: any): any {\r\n const evt: { [k: string]: any } = {};\r\n evt.preventDefault = () => {};\r\n evt.target = elementToAttachTo;\r\n\r\n return evt;\r\n }\r\n}\r\n", "import type { INative } from \"../Engines/Native/nativeInterfaces\";\r\nimport type { IUIEvent } from \"../Events/deviceInputEvents\";\r\nimport { DeviceEventFactory } from \"./eventFactory\";\r\nimport { DeviceType } from \"./InputDevices/deviceEnums\";\r\nimport type { IDeviceInputSystem } from \"./inputInterfaces\";\r\n\r\ndeclare const _native: INative;\r\n\r\n/** @internal */\r\nexport class NativeDeviceInputSystem implements IDeviceInputSystem {\r\n private readonly _nativeInput: IDeviceInputSystem;\r\n\r\n public constructor(\r\n onDeviceConnected: (deviceType: DeviceType, deviceSlot: number) => void,\r\n onDeviceDisconnected: (deviceType: DeviceType, deviceSlot: number) => void,\r\n onInputChanged: (deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent) => void\r\n ) {\r\n this._nativeInput = _native.DeviceInputSystem\r\n ? new _native.DeviceInputSystem(onDeviceConnected, onDeviceDisconnected, (deviceType, deviceSlot, inputIndex, currentState) => {\r\n const evt = DeviceEventFactory.CreateDeviceEvent(deviceType, deviceSlot, inputIndex, currentState, this);\r\n\r\n onInputChanged(deviceType, deviceSlot, evt);\r\n })\r\n : this._createDummyNativeInput();\r\n }\r\n\r\n // Public functions\r\n /**\r\n * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized.\r\n * @param deviceType Enum specifying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @returns Current value of input\r\n */\r\n public pollInput(deviceType: DeviceType, deviceSlot: number, inputIndex: number): number {\r\n return this._nativeInput.pollInput(deviceType, deviceSlot, inputIndex);\r\n }\r\n\r\n /**\r\n * Check for a specific device in the DeviceInputSystem\r\n * @param deviceType Type of device to check for\r\n * @returns bool with status of device's existence\r\n */\r\n public isDeviceAvailable(deviceType: DeviceType): boolean {\r\n //TODO: FIx native side first\r\n return deviceType === DeviceType.Mouse || deviceType === DeviceType.Touch;\r\n }\r\n\r\n /**\r\n * Dispose of all the observables\r\n */\r\n public dispose(): void {\r\n this._nativeInput.dispose();\r\n }\r\n\r\n /**\r\n * For versions of BabylonNative that don't have the NativeInput plugin initialized, create a dummy version\r\n * @returns Object with dummy functions\r\n */\r\n private _createDummyNativeInput() {\r\n const nativeInput = {\r\n pollInput: () => {\r\n return 0;\r\n },\r\n isDeviceAvailable: () => {\r\n return false;\r\n },\r\n dispose: () => {},\r\n };\r\n\r\n return nativeInput;\r\n }\r\n}\r\n", "import type { Engine } from \"../Engines/engine\";\r\nimport type { IPointerEvent, IUIEvent } from \"../Events/deviceInputEvents\";\r\nimport { IsNavigatorAvailable } from \"../Misc/domManagement\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport type { Nullable } from \"../types\";\r\nimport { DeviceEventFactory } from \"./eventFactory\";\r\nimport { DeviceType, PointerInput } from \"./InputDevices/deviceEnums\";\r\nimport type { IDeviceInputSystem } from \"./inputInterfaces\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst MAX_KEYCODES = 255;\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst MAX_POINTER_INPUTS = Object.keys(PointerInput).length / 2;\r\n\r\n/** @internal */\r\nexport class WebDeviceInputSystem implements IDeviceInputSystem {\r\n // Private Members\r\n private _inputs: Array<{ [deviceSlot: number]: Array }> = [];\r\n private _gamepads: Array;\r\n private _keyboardActive: boolean = false;\r\n private _pointerActive: boolean = false;\r\n private _elementToAttachTo: HTMLElement;\r\n private _metaKeys: Array;\r\n private readonly _engine: Engine;\r\n private readonly _usingSafari: boolean = Tools.IsSafari();\r\n // Found solution for determining if MacOS is being used here:\r\n // https://stackoverflow.com/questions/10527983/best-way-to-detect-mac-os-x-or-windows-computers-with-javascript-or-jquery\r\n private readonly _usingMacOS: boolean = IsNavigatorAvailable() && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);\r\n\r\n private _onDeviceConnected: (deviceType: DeviceType, deviceSlot: number) => void;\r\n private _onDeviceDisconnected: (deviceType: DeviceType, deviceSlot: number) => void;\r\n private _onInputChanged: (deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent) => void;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _keyboardDownEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _keyboardUpEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _keyboardBlurEvent = (evt: any) => {};\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerMoveEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerDownEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerUpEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerCancelEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerWheelEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerBlurEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerMacOSChromeOutEvent = (evt: any) => {};\r\n private _wheelEventName: string;\r\n private _eventsAttached: boolean = false;\r\n\r\n private _mouseId = -1;\r\n private readonly _isUsingFirefox = IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf(\"Firefox\") !== -1;\r\n private readonly _isUsingChromium = IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf(\"Chrome\") !== -1;\r\n\r\n // Array to store active Pointer ID values; prevents issues with negative pointerIds\r\n private _activeTouchIds: Array;\r\n private _maxTouchPoints: number = 0;\r\n\r\n private _pointerInputClearObserver: Nullable> = null;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _gamepadConnectedEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _gamepadDisconnectedEvent = (evt: any) => {};\r\n\r\n private _eventPrefix: string;\r\n\r\n /**\r\n * Constructor for the WebDeviceInputSystem\r\n * @param engine Engine to reference\r\n * @param onDeviceConnected Callback to execute when device is connected\r\n * @param onDeviceDisconnected Callback to execute when device is disconnected\r\n * @param onInputChanged Callback to execute when input changes on device\r\n */\r\n constructor(\r\n engine: Engine,\r\n onDeviceConnected: (deviceType: DeviceType, deviceSlot: number) => void,\r\n onDeviceDisconnected: (deviceType: DeviceType, deviceSlot: number) => void,\r\n onInputChanged: (deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent) => void\r\n ) {\r\n this._eventPrefix = Tools.GetPointerPrefix(engine);\r\n this._engine = engine;\r\n\r\n this._onDeviceConnected = onDeviceConnected;\r\n this._onDeviceDisconnected = onDeviceDisconnected;\r\n this._onInputChanged = onInputChanged;\r\n\r\n // If we need a pointerId, set one for future use\r\n this._mouseId = this._isUsingFirefox ? 0 : 1;\r\n\r\n this._enableEvents();\r\n\r\n if (this._usingMacOS) {\r\n this._metaKeys = [];\r\n }\r\n\r\n // Set callback to enable event handler switching when inputElement changes\r\n if (!this._engine._onEngineViewChanged) {\r\n this._engine._onEngineViewChanged = () => {\r\n this._enableEvents();\r\n };\r\n }\r\n }\r\n\r\n // Public functions\r\n /**\r\n * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized.\r\n * @param deviceType Enum specifying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @returns Current value of input\r\n */\r\n public pollInput(deviceType: DeviceType, deviceSlot: number, inputIndex: number): number {\r\n const device = this._inputs[deviceType][deviceSlot];\r\n\r\n if (!device) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw `Unable to find device ${DeviceType[deviceType]}`;\r\n }\r\n\r\n if (deviceType >= DeviceType.DualShock && deviceType <= DeviceType.DualSense) {\r\n this._updateDevice(deviceType, deviceSlot, inputIndex);\r\n }\r\n\r\n const currentValue = device[inputIndex];\r\n if (currentValue === undefined) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw `Unable to find input ${inputIndex} for device ${DeviceType[deviceType]} in slot ${deviceSlot}`;\r\n }\r\n\r\n if (inputIndex === PointerInput.Move) {\r\n Tools.Warn(`Unable to provide information for PointerInput.Move. Try using PointerInput.Horizontal or PointerInput.Vertical for move data.`);\r\n }\r\n\r\n return currentValue;\r\n }\r\n\r\n /**\r\n * Check for a specific device in the DeviceInputSystem\r\n * @param deviceType Type of device to check for\r\n * @returns bool with status of device's existence\r\n */\r\n public isDeviceAvailable(deviceType: DeviceType): boolean {\r\n return this._inputs[deviceType] !== undefined;\r\n }\r\n\r\n /**\r\n * Dispose of all the eventlisteners\r\n */\r\n public dispose(): void {\r\n // Callbacks\r\n this._onDeviceConnected = () => {};\r\n this._onDeviceDisconnected = () => {};\r\n this._onInputChanged = () => {};\r\n delete this._engine._onEngineViewChanged;\r\n\r\n if (this._elementToAttachTo) {\r\n this._disableEvents();\r\n }\r\n }\r\n\r\n /**\r\n * Enable listening for user input events\r\n */\r\n private _enableEvents(): void {\r\n const inputElement = this?._engine.getInputElement();\r\n if (inputElement && (!this._eventsAttached || this._elementToAttachTo !== inputElement)) {\r\n // Remove events before adding to avoid double events or simultaneous events on multiple canvases\r\n this._disableEvents();\r\n\r\n // If the inputs array has already been created, zero it out to before setting up events\r\n if (this._inputs) {\r\n for (const inputs of this._inputs) {\r\n if (inputs) {\r\n for (const deviceSlotKey in inputs) {\r\n const deviceSlot = +deviceSlotKey;\r\n const device = inputs[deviceSlot];\r\n if (device) {\r\n for (let inputIndex = 0; inputIndex < device.length; inputIndex++) {\r\n device[inputIndex] = 0;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._elementToAttachTo = inputElement;\r\n // Set tab index for the inputElement to the engine's canvasTabIndex, if and only if the element's tab index is -1\r\n this._elementToAttachTo.tabIndex = this._elementToAttachTo.tabIndex !== -1 ? this._elementToAttachTo.tabIndex : this._engine.canvasTabIndex;\r\n this._handleKeyActions();\r\n this._handlePointerActions();\r\n this._handleGamepadActions();\r\n this._eventsAttached = true;\r\n\r\n // Check for devices that are already connected but aren't registered. Currently, only checks for gamepads and mouse\r\n this._checkForConnectedDevices();\r\n }\r\n }\r\n\r\n /**\r\n * Disable listening for user input events\r\n */\r\n private _disableEvents(): void {\r\n if (this._elementToAttachTo) {\r\n // Blur Events\r\n this._elementToAttachTo.removeEventListener(\"blur\", this._keyboardBlurEvent);\r\n this._elementToAttachTo.removeEventListener(\"blur\", this._pointerBlurEvent);\r\n\r\n // Keyboard Events\r\n this._elementToAttachTo.removeEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.removeEventListener(\"keyup\", this._keyboardUpEvent);\r\n\r\n // Pointer Events\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"down\", this._pointerDownEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"up\", this._pointerUpEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"cancel\", this._pointerCancelEvent);\r\n this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent);\r\n if (this._usingMacOS && this._isUsingChromium) {\r\n this._elementToAttachTo.removeEventListener(\"lostpointercapture\", this._pointerMacOSChromeOutEvent);\r\n }\r\n\r\n // Gamepad Events\r\n window.removeEventListener(\"gamepadconnected\", this._gamepadConnectedEvent);\r\n window.removeEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\r\n }\r\n\r\n if (this._pointerInputClearObserver) {\r\n this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver);\r\n }\r\n\r\n this._eventsAttached = false;\r\n }\r\n\r\n /**\r\n * Checks for existing connections to devices and register them, if necessary\r\n * Currently handles gamepads and mouse\r\n */\r\n private _checkForConnectedDevices(): void {\r\n if (navigator.getGamepads) {\r\n const gamepads = navigator.getGamepads();\r\n\r\n for (const gamepad of gamepads) {\r\n if (gamepad) {\r\n this._addGamePad(gamepad);\r\n }\r\n }\r\n }\r\n\r\n // If the device in use has mouse capabilities, pre-register mouse\r\n if (typeof matchMedia === \"function\" && matchMedia(\"(pointer:fine)\").matches) {\r\n // This will provide a dummy value for the cursor position and is expected to be overridden when the first mouse event happens.\r\n // There isn't any good way to get the current position outside of a pointer event so that's why this was done.\r\n this._addPointerDevice(DeviceType.Mouse, 0, 0, 0);\r\n }\r\n }\r\n\r\n // Private functions\r\n /**\r\n * Add a gamepad to the DeviceInputSystem\r\n * @param gamepad A single DOM Gamepad object\r\n */\r\n private _addGamePad(gamepad: any): void {\r\n const deviceType = this._getGamepadDeviceType(gamepad.id);\r\n const deviceSlot = gamepad.index;\r\n\r\n this._gamepads = this._gamepads || new Array(gamepad.index + 1);\r\n this._registerDevice(deviceType, deviceSlot, gamepad.buttons.length + gamepad.axes.length);\r\n\r\n this._gamepads[deviceSlot] = deviceType;\r\n }\r\n\r\n /**\r\n * Add pointer device to DeviceInputSystem\r\n * @param deviceType Type of Pointer to add\r\n * @param deviceSlot Pointer ID (0 for mouse, pointerId for Touch)\r\n * @param currentX Current X at point of adding\r\n * @param currentY Current Y at point of adding\r\n */\r\n private _addPointerDevice(deviceType: DeviceType, deviceSlot: number, currentX: number, currentY: number): void {\r\n if (!this._pointerActive) {\r\n this._pointerActive = true;\r\n }\r\n this._registerDevice(deviceType, deviceSlot, MAX_POINTER_INPUTS);\r\n const pointer = this._inputs[deviceType][deviceSlot]; /* initialize our pointer position immediately after registration */\r\n pointer[0] = currentX;\r\n pointer[1] = currentY;\r\n }\r\n\r\n /**\r\n * Add device and inputs to device array\r\n * @param deviceType Enum specifying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param numberOfInputs Number of input entries to create for given device\r\n */\r\n private _registerDevice(deviceType: DeviceType, deviceSlot: number, numberOfInputs: number): void {\r\n if (deviceSlot === undefined) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw `Unable to register device ${DeviceType[deviceType]} to undefined slot.`;\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n const device = new Array(numberOfInputs);\r\n\r\n device.fill(0);\r\n\r\n this._inputs[deviceType][deviceSlot] = device;\r\n this._onDeviceConnected(deviceType, deviceSlot);\r\n }\r\n }\r\n\r\n /**\r\n * Given a specific device name, remove that device from the device map\r\n * @param deviceType Enum specifying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n */\r\n private _unregisterDevice(deviceType: DeviceType, deviceSlot: number): void {\r\n if (this._inputs[deviceType][deviceSlot]) {\r\n delete this._inputs[deviceType][deviceSlot];\r\n this._onDeviceDisconnected(deviceType, deviceSlot);\r\n }\r\n }\r\n\r\n /**\r\n * Handle all actions that come from keyboard interaction\r\n */\r\n private _handleKeyActions(): void {\r\n this._keyboardDownEvent = (evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, MAX_KEYCODES);\r\n }\r\n\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n if (kbKey) {\r\n kbKey[evt.keyCode] = 1;\r\n\r\n const deviceEvent = evt as IUIEvent;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n\r\n if (this._usingMacOS && evt.metaKey && evt.key !== \"Meta\") {\r\n if (!this._metaKeys.includes(evt.keyCode)) {\r\n this._metaKeys.push(evt.keyCode);\r\n }\r\n }\r\n\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n };\r\n\r\n this._keyboardUpEvent = (evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, MAX_KEYCODES);\r\n }\r\n\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n if (kbKey) {\r\n kbKey[evt.keyCode] = 0;\r\n\r\n const deviceEvent = evt as IUIEvent;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n\r\n if (this._usingMacOS && evt.key === \"Meta\" && this._metaKeys.length > 0) {\r\n for (const keyCode of this._metaKeys) {\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, keyCode, 0, this, this._elementToAttachTo);\r\n kbKey[keyCode] = 0;\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n this._metaKeys.splice(0, this._metaKeys.length);\r\n }\r\n\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n };\r\n\r\n this._keyboardBlurEvent = () => {\r\n if (this._keyboardActive) {\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n\r\n for (let i = 0; i < kbKey.length; i++) {\r\n if (kbKey[i] !== 0) {\r\n kbKey[i] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, i, 0, this, this._elementToAttachTo);\r\n\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n }\r\n if (this._usingMacOS) {\r\n this._metaKeys.splice(0, this._metaKeys.length);\r\n }\r\n }\r\n };\r\n\r\n this._elementToAttachTo.addEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.addEventListener(\"keyup\", this._keyboardUpEvent);\r\n this._elementToAttachTo.addEventListener(\"blur\", this._keyboardBlurEvent);\r\n }\r\n\r\n /**\r\n * Handle all actions that come from pointer interaction\r\n */\r\n private _handlePointerActions(): void {\r\n // If maxTouchPoints is defined, use that value. Otherwise, allow for a minimum for supported gestures like pinch\r\n this._maxTouchPoints = (IsNavigatorAvailable() && navigator.maxTouchPoints) || 2;\r\n if (!this._activeTouchIds) {\r\n this._activeTouchIds = new Array(this._maxTouchPoints);\r\n }\r\n\r\n for (let i = 0; i < this._maxTouchPoints; i++) {\r\n this._activeTouchIds[i] = -1;\r\n }\r\n\r\n this._pointerMoveEvent = (evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n let deviceSlot = deviceType === DeviceType.Mouse ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n // In the event that we're gettting pointermove events from touch inputs that we aren't tracking,\r\n // look for an available slot and retroactively connect it.\r\n if (deviceType === DeviceType.Touch && deviceSlot === -1) {\r\n const idx = this._activeTouchIds.indexOf(-1);\r\n\r\n if (idx >= 0) {\r\n deviceSlot = idx;\r\n this._activeTouchIds[idx] = evt.pointerId;\r\n // Because this is a \"new\" input, inform the connected callback\r\n this._onDeviceConnected(deviceType, deviceSlot);\r\n } else {\r\n // We can't find an open slot to store new pointer so just return (can only support max number of touches)\r\n Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\r\n return;\r\n }\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n const deviceEvent = evt as IPointerEvent;\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n\r\n // For touches that aren't started with a down, we need to set the button state to 1\r\n if (deviceType === DeviceType.Touch && pointer[PointerInput.LeftClick] === 0) {\r\n pointer[PointerInput.LeftClick] = 1;\r\n }\r\n\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n\r\n // Lets Propagate the event for move with same position.\r\n if (!this._usingSafari && evt.button !== -1) {\r\n deviceEvent.inputIndex = evt.button + 2;\r\n pointer[evt.button + 2] = pointer[evt.button + 2] ? 0 : 1; // Reverse state of button if evt.button has value\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n }\r\n };\r\n\r\n this._pointerDownEvent = (evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n let deviceSlot = deviceType === DeviceType.Mouse ? 0 : evt.pointerId;\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n const idx = this._activeTouchIds.indexOf(-1);\r\n\r\n if (idx >= 0) {\r\n deviceSlot = idx;\r\n this._activeTouchIds[idx] = evt.pointerId;\r\n } else {\r\n // We can't find an open slot to store new pointer so just return (can only support max number of touches)\r\n Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\r\n return;\r\n }\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY);\r\n } else if (deviceType === DeviceType.Touch) {\r\n this._onDeviceConnected(deviceType, deviceSlot);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n\r\n if (deviceType === DeviceType.Mouse) {\r\n // Mouse; Set pointerId if undefined\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n if (!document.pointerLockElement) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(this._mouseId);\r\n } catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n } else {\r\n // Touch; Since touches are dynamically assigned, only set capture if we have an id\r\n if (evt.pointerId && !document.pointerLockElement) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(evt.pointerId);\r\n } catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n }\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[evt.button + 2] = 1;\r\n\r\n const deviceEvent = evt as IUIEvent;\r\n\r\n // NOTE: The +2 used here to is because PointerInput has the same value progression for its mouse buttons as PointerEvent.button\r\n // However, we have our X and Y values front-loaded to group together the touch inputs but not break this progression\r\n // EG. ([X, Y, Left-click], Middle-click, etc...)\r\n deviceEvent.inputIndex = evt.button + 2;\r\n\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n\r\n if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n }\r\n };\r\n\r\n this._pointerUpEvent = (evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n const deviceSlot = deviceType === DeviceType.Mouse ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n // If we're getting a pointerup event for a touch that isn't active, just return.\r\n if (deviceSlot === -1) {\r\n return;\r\n } else {\r\n this._activeTouchIds[deviceSlot] = -1;\r\n }\r\n }\r\n\r\n const pointer = this._inputs[deviceType]?.[deviceSlot];\r\n if (pointer && pointer[evt.button + 2] !== 0) {\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[evt.button + 2] = 0;\r\n\r\n const deviceEvent = evt as IUIEvent;\r\n\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n\r\n // NOTE: The +2 used here to is because PointerInput has the same value progression for its mouse buttons as PointerEvent.button\r\n // However, we have our X and Y values front-loaded to group together the touch inputs but not break this progression\r\n // EG. ([X, Y, Left-click], Middle-click, etc...)\r\n deviceEvent.inputIndex = evt.button + 2;\r\n\r\n if (deviceType === DeviceType.Mouse && this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture?.(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n } else if (evt.pointerId && this._elementToAttachTo.hasPointerCapture?.(evt.pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(evt.pointerId);\r\n }\r\n\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n this._onDeviceDisconnected(deviceType, deviceSlot);\r\n }\r\n }\r\n };\r\n\r\n this._pointerCancelEvent = (evt) => {\r\n if (evt.pointerType === \"mouse\") {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n\r\n if (this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture?.(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n }\r\n\r\n for (let inputIndex = PointerInput.LeftClick; inputIndex <= PointerInput.BrowserForward; inputIndex++) {\r\n if (pointer[inputIndex] === 1) {\r\n pointer[inputIndex] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, inputIndex, 0, this, this._elementToAttachTo);\r\n\r\n this._onInputChanged(DeviceType.Mouse, 0, deviceEvent);\r\n }\r\n }\r\n } else {\r\n const deviceSlot = this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n // If we're getting a pointercancel event for a touch that isn't active, just return\r\n if (deviceSlot === -1) {\r\n return;\r\n }\r\n\r\n if (this._elementToAttachTo.hasPointerCapture?.(evt.pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(evt.pointerId);\r\n }\r\n\r\n this._inputs[DeviceType.Touch][deviceSlot][PointerInput.LeftClick] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(\r\n DeviceType.Touch,\r\n deviceSlot,\r\n PointerInput.LeftClick,\r\n 0,\r\n this,\r\n this._elementToAttachTo,\r\n evt.pointerId\r\n );\r\n\r\n this._onInputChanged(DeviceType.Touch, deviceSlot, deviceEvent);\r\n\r\n this._activeTouchIds[deviceSlot] = -1;\r\n this._onDeviceDisconnected(DeviceType.Touch, deviceSlot);\r\n }\r\n };\r\n\r\n // Set Wheel Event Name, code originally from scene.inputManager\r\n this._wheelEventName =\r\n \"onwheel\" in document.createElement(\"div\")\r\n ? \"wheel\" // Modern browsers support \"wheel\"\r\n : (document).onmousewheel !== undefined\r\n ? \"mousewheel\" // Webkit and IE support at least \"mousewheel\"\r\n : \"DOMMouseScroll\"; // let's assume that remaining browsers are older Firefox\r\n\r\n // Code originally in scene.inputManager.ts\r\n // Chrome reports warning in console if wheel listener doesn't set an explicit passive option.\r\n // IE11 only supports captureEvent:boolean, not options:object, and it defaults to false.\r\n // Feature detection technique copied from: https://github.com/github/eventlistener-polyfill (MIT license)\r\n let passiveSupported = false;\r\n const noop = function () {};\r\n\r\n try {\r\n const options = Object.defineProperty({}, \"passive\", {\r\n get: function () {\r\n passiveSupported = true;\r\n },\r\n });\r\n\r\n this._elementToAttachTo.addEventListener(\"test\", noop, options);\r\n this._elementToAttachTo.removeEventListener(\"test\", noop, options);\r\n } catch (e) {\r\n /* */\r\n }\r\n\r\n this._pointerBlurEvent = () => {\r\n // Handle mouse buttons\r\n if (this.isDeviceAvailable(DeviceType.Mouse)) {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n\r\n if (this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture?.(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n }\r\n\r\n for (let inputIndex = PointerInput.LeftClick; inputIndex <= PointerInput.BrowserForward; inputIndex++) {\r\n if (pointer[inputIndex] === 1) {\r\n pointer[inputIndex] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, inputIndex, 0, this, this._elementToAttachTo);\r\n\r\n this._onInputChanged(DeviceType.Mouse, 0, deviceEvent);\r\n }\r\n }\r\n }\r\n\r\n // Handle Active Touches\r\n if (this.isDeviceAvailable(DeviceType.Touch)) {\r\n const pointer = this._inputs[DeviceType.Touch];\r\n\r\n for (let deviceSlot = 0; deviceSlot < this._activeTouchIds.length; deviceSlot++) {\r\n const pointerId = this._activeTouchIds[deviceSlot];\r\n\r\n if (this._elementToAttachTo.hasPointerCapture?.(pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(pointerId);\r\n }\r\n\r\n if (pointerId !== -1 && pointer[deviceSlot]?.[PointerInput.LeftClick] === 1) {\r\n pointer[deviceSlot][PointerInput.LeftClick] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(\r\n DeviceType.Touch,\r\n deviceSlot,\r\n PointerInput.LeftClick,\r\n 0,\r\n this,\r\n this._elementToAttachTo,\r\n pointerId\r\n );\r\n\r\n this._onInputChanged(DeviceType.Touch, deviceSlot, deviceEvent);\r\n\r\n this._activeTouchIds[deviceSlot] = -1;\r\n this._onDeviceDisconnected(DeviceType.Touch, deviceSlot);\r\n }\r\n }\r\n }\r\n };\r\n\r\n this._pointerWheelEvent = (evt) => {\r\n const deviceType = DeviceType.Mouse;\r\n const deviceSlot = 0;\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = [];\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._pointerActive = true;\r\n this._registerDevice(deviceType, deviceSlot, MAX_POINTER_INPUTS);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n pointer[PointerInput.MouseWheelX] = evt.deltaX || 0;\r\n pointer[PointerInput.MouseWheelY] = evt.deltaY || evt.wheelDelta || 0;\r\n pointer[PointerInput.MouseWheelZ] = evt.deltaZ || 0;\r\n\r\n const deviceEvent = evt as IUIEvent;\r\n // By default, there is no pointerId for mouse wheel events so we'll add one here\r\n // This logic was originally in the InputManager but was added here to make the\r\n // InputManager more platform-agnostic\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n if (pointer[PointerInput.MouseWheelX] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelX;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelY] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelY;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelZ] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelZ;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n }\r\n };\r\n\r\n // Workaround for MacOS Chromium Browsers for lost pointer capture bug\r\n if (this._usingMacOS && this._isUsingChromium) {\r\n this._pointerMacOSChromeOutEvent = (evt) => {\r\n if (evt.buttons > 1) {\r\n this._pointerCancelEvent(evt);\r\n }\r\n };\r\n this._elementToAttachTo.addEventListener(\"lostpointercapture\", this._pointerMacOSChromeOutEvent);\r\n }\r\n\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"down\", this._pointerDownEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"up\", this._pointerUpEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"cancel\", this._pointerCancelEvent);\r\n this._elementToAttachTo.addEventListener(\"blur\", this._pointerBlurEvent);\r\n this._elementToAttachTo.addEventListener(this._wheelEventName, this._pointerWheelEvent, passiveSupported ? { passive: false } : false);\r\n\r\n // Since there's no up or down event for mouse wheel or delta x/y, clear mouse values at end of frame\r\n this._pointerInputClearObserver = this._engine.onEndFrameObservable.add(() => {\r\n if (this.isDeviceAvailable(DeviceType.Mouse)) {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n pointer[PointerInput.MouseWheelX] = 0;\r\n pointer[PointerInput.MouseWheelY] = 0;\r\n pointer[PointerInput.MouseWheelZ] = 0;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handle all actions that come from gamepad interaction\r\n */\r\n private _handleGamepadActions(): void {\r\n this._gamepadConnectedEvent = (evt: any) => {\r\n this._addGamePad(evt.gamepad);\r\n };\r\n\r\n this._gamepadDisconnectedEvent = (evt: any) => {\r\n if (this._gamepads) {\r\n const deviceType = this._getGamepadDeviceType(evt.gamepad.id);\r\n const deviceSlot = evt.gamepad.index;\r\n\r\n this._unregisterDevice(deviceType, deviceSlot);\r\n delete this._gamepads[deviceSlot];\r\n }\r\n };\r\n\r\n window.addEventListener(\"gamepadconnected\", this._gamepadConnectedEvent);\r\n window.addEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\r\n }\r\n\r\n /**\r\n * Update all non-event based devices with each frame\r\n * @param deviceType Enum specifying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n */\r\n private _updateDevice(deviceType: DeviceType, deviceSlot: number, inputIndex: number): void {\r\n // Gamepads\r\n const gp = navigator.getGamepads()[deviceSlot];\r\n\r\n if (gp && deviceType === this._gamepads[deviceSlot]) {\r\n const device = this._inputs[deviceType][deviceSlot];\r\n\r\n if (inputIndex >= gp.buttons.length) {\r\n device[inputIndex] = gp.axes[inputIndex - gp.buttons.length].valueOf();\r\n } else {\r\n device[inputIndex] = gp.buttons[inputIndex].value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets DeviceType from the device name\r\n * @param deviceName Name of Device from DeviceInputSystem\r\n * @returns DeviceType enum value\r\n */\r\n private _getGamepadDeviceType(deviceName: string): DeviceType {\r\n if (deviceName.indexOf(\"054c\") !== -1) {\r\n // DualShock 4 Gamepad\r\n return deviceName.indexOf(\"0ce6\") !== -1 ? DeviceType.DualSense : DeviceType.DualShock;\r\n } else if (deviceName.indexOf(\"Xbox One\") !== -1 || deviceName.search(\"Xbox 360\") !== -1 || deviceName.search(\"xinput\") !== -1) {\r\n // Xbox Gamepad\r\n return DeviceType.Xbox;\r\n } else if (deviceName.indexOf(\"057e\") !== -1) {\r\n // Switch Gamepad\r\n return DeviceType.Switch;\r\n }\r\n\r\n return DeviceType.Generic;\r\n }\r\n\r\n /**\r\n * Get DeviceType from a given pointer/mouse/touch event.\r\n * @param evt PointerEvent to evaluate\r\n * @returns DeviceType interpreted from event\r\n */\r\n private _getPointerType(evt: any): DeviceType {\r\n let deviceType = DeviceType.Mouse;\r\n\r\n if (evt.pointerType === \"touch\" || evt.pointerType === \"pen\" || evt.touches) {\r\n deviceType = DeviceType.Touch;\r\n }\r\n\r\n return deviceType;\r\n }\r\n}\r\n", "import type { IDisposable } from \"../scene\";\r\nimport { DeviceType } from \"./InputDevices/deviceEnums\";\r\nimport type { Observable } from \"../Misc/observable\";\r\nimport type { IDeviceInputSystem } from \"./inputInterfaces\";\r\nimport { NativeDeviceInputSystem } from \"./nativeDeviceInputSystem\";\r\nimport { WebDeviceInputSystem } from \"./webDeviceInputSystem\";\r\nimport { DeviceSource } from \"./InputDevices/deviceSource\";\r\nimport type { INative } from \"../Engines/Native/nativeInterfaces\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { IUIEvent } from \"../Events/deviceInputEvents\";\r\n\r\ntype Distribute = T extends DeviceType ? DeviceSource : never;\r\n\r\nexport type DeviceSourceType = Distribute;\r\n\r\ndeclare const _native: INative;\r\n\r\ndeclare module \"../Engines/engine\" {\r\n interface Engine {\r\n /** @internal */\r\n _deviceSourceManager?: InternalDeviceSourceManager;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport interface IObservableManager {\r\n onDeviceConnectedObservable: Observable;\r\n onDeviceDisconnectedObservable: Observable;\r\n\r\n // Functions\r\n _onInputChanged(deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent): void;\r\n _addDevice(deviceSource: DeviceSource): void;\r\n _removeDevice(deviceType: DeviceType, deviceSlot: number): void;\r\n}\r\n\r\n/** @internal */\r\nexport class InternalDeviceSourceManager implements IDisposable {\r\n // Public Members\r\n public readonly _deviceInputSystem: IDeviceInputSystem;\r\n\r\n // Private Members\r\n // This is a master list of all device type/slot combos\r\n private readonly _devices: Array>;\r\n\r\n private readonly _registeredManagers = new Array();\r\n\r\n public _refCount = 0;\r\n\r\n public constructor(engine: Engine) {\r\n const numberOfDeviceTypes = Object.keys(DeviceType).length / 2;\r\n this._devices = new Array>(numberOfDeviceTypes);\r\n\r\n const onDeviceConnected = (deviceType: DeviceType, deviceSlot: number) => {\r\n if (!this._devices[deviceType]) {\r\n this._devices[deviceType] = new Array();\r\n }\r\n\r\n if (!this._devices[deviceType][deviceSlot]) {\r\n this._devices[deviceType][deviceSlot] = deviceSlot;\r\n }\r\n for (const manager of this._registeredManagers) {\r\n const deviceSource = new DeviceSource(this._deviceInputSystem, deviceType, deviceSlot);\r\n manager._addDevice(deviceSource);\r\n }\r\n };\r\n\r\n const onDeviceDisconnected = (deviceType: DeviceType, deviceSlot: number) => {\r\n if (this._devices[deviceType]?.[deviceSlot]) {\r\n delete this._devices[deviceType][deviceSlot];\r\n }\r\n for (const manager of this._registeredManagers) {\r\n manager._removeDevice(deviceType, deviceSlot);\r\n }\r\n };\r\n\r\n const onInputChanged = (deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent) => {\r\n if (eventData) {\r\n for (const manager of this._registeredManagers) {\r\n manager._onInputChanged(deviceType, deviceSlot, eventData);\r\n }\r\n }\r\n };\r\n\r\n if (typeof _native !== \"undefined\") {\r\n this._deviceInputSystem = new NativeDeviceInputSystem(onDeviceConnected, onDeviceDisconnected, onInputChanged);\r\n } else {\r\n this._deviceInputSystem = new WebDeviceInputSystem(engine, onDeviceConnected, onDeviceDisconnected, onInputChanged);\r\n }\r\n }\r\n\r\n // Public Functions\r\n public readonly registerManager = (manager: IObservableManager): void => {\r\n for (let deviceType = 0; deviceType < this._devices.length; deviceType++) {\r\n const device = this._devices[deviceType];\r\n for (const deviceSlotKey in device) {\r\n const deviceSlot = +deviceSlotKey;\r\n manager._addDevice(new DeviceSource(this._deviceInputSystem, deviceType, deviceSlot));\r\n }\r\n }\r\n this._registeredManagers.push(manager);\r\n };\r\n\r\n public readonly unregisterManager = (manager: IObservableManager): void => {\r\n const idx = this._registeredManagers.indexOf(manager);\r\n\r\n if (idx > -1) {\r\n this._registeredManagers.splice(idx, 1);\r\n }\r\n };\r\n\r\n public dispose(): void {\r\n this._deviceInputSystem.dispose();\r\n }\r\n}\r\n", "import type { Engine } from \"../../Engines/engine\";\r\nimport { DeviceType } from \"./deviceEnums\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { DeviceSource } from \"./deviceSource\";\r\nimport type { IObservableManager, DeviceSourceType } from \"../internalDeviceSourceManager\";\r\nimport { InternalDeviceSourceManager } from \"../internalDeviceSourceManager\";\r\nimport type { IDisposable } from \"../../scene\";\r\nimport type { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { IKeyboardEvent, IPointerEvent, IUIEvent, IWheelEvent } from \"../../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Class to keep track of devices\r\n */\r\nexport class DeviceSourceManager implements IDisposable, IObservableManager {\r\n // Public Members\r\n /**\r\n * Observable to be triggered when after a device is connected, any new observers added will be triggered against already connected devices\r\n */\r\n public readonly onDeviceConnectedObservable: Observable;\r\n\r\n /**\r\n * Observable to be triggered when after a device is disconnected\r\n */\r\n public readonly onDeviceDisconnectedObservable: Observable;\r\n\r\n // Private Members\r\n private _engine: Engine;\r\n private _onDisposeObserver: Nullable>;\r\n private readonly _devices: Array>>;\r\n private readonly _firstDevice: Array;\r\n\r\n // Public Functions\r\n /**\r\n * Gets a DeviceSource, given a type and slot\r\n * @param deviceType - Type of Device\r\n * @param deviceSlot - Slot or ID of device\r\n * @returns DeviceSource\r\n */\r\n public getDeviceSource(deviceType: T, deviceSlot?: number): Nullable> {\r\n if (deviceSlot === undefined) {\r\n if (this._firstDevice[deviceType] === undefined) {\r\n return null;\r\n }\r\n\r\n deviceSlot = this._firstDevice[deviceType];\r\n }\r\n\r\n if (!this._devices[deviceType] || this._devices[deviceType][deviceSlot] === undefined) {\r\n return null;\r\n }\r\n\r\n return this._devices[deviceType][deviceSlot] as DeviceSource;\r\n }\r\n /**\r\n * Gets an array of DeviceSource objects for a given device type\r\n * @param deviceType - Type of Device\r\n * @returns All available DeviceSources of a given type\r\n */\r\n public getDeviceSources(deviceType: T): ReadonlyArray> {\r\n // If device type hasn't had any devices connected yet, return empty array.\r\n if (!this._devices[deviceType]) {\r\n return [];\r\n }\r\n return this._devices[deviceType].filter((source) => {\r\n return !!source;\r\n }) as Array>;\r\n }\r\n\r\n /**\r\n * Default constructor\r\n * @param engine - Used to get canvas (if applicable)\r\n */\r\n constructor(engine: Engine) {\r\n const numberOfDeviceTypes = Object.keys(DeviceType).length / 2;\r\n this._devices = new Array(numberOfDeviceTypes);\r\n this._firstDevice = new Array(numberOfDeviceTypes);\r\n this._engine = engine;\r\n\r\n if (!this._engine._deviceSourceManager) {\r\n this._engine._deviceSourceManager = new InternalDeviceSourceManager(engine);\r\n }\r\n this._engine._deviceSourceManager._refCount++;\r\n\r\n // Observables\r\n this.onDeviceConnectedObservable = new Observable((observer) => {\r\n for (const devices of this._devices) {\r\n if (devices) {\r\n for (const device of devices) {\r\n if (device) {\r\n this.onDeviceConnectedObservable.notifyObserver(observer, device as DeviceSourceType);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n this.onDeviceDisconnectedObservable = new Observable();\r\n\r\n this._engine._deviceSourceManager.registerManager(this);\r\n\r\n this._onDisposeObserver = engine.onDisposeObservable.add(() => {\r\n this.dispose();\r\n });\r\n }\r\n\r\n /**\r\n * Dispose of DeviceSourceManager\r\n */\r\n public dispose(): void {\r\n // Null out observable refs\r\n this.onDeviceConnectedObservable.clear();\r\n this.onDeviceDisconnectedObservable.clear();\r\n\r\n if (this._engine._deviceSourceManager) {\r\n this._engine._deviceSourceManager.unregisterManager(this);\r\n if (--this._engine._deviceSourceManager._refCount < 1) {\r\n this._engine._deviceSourceManager.dispose();\r\n delete this._engine._deviceSourceManager;\r\n }\r\n }\r\n this._engine.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n\r\n // Hidden Functions\r\n /**\r\n * @param deviceSource - Source to add\r\n * @internal\r\n */\r\n public _addDevice(deviceSource: DeviceSourceType): void {\r\n if (!this._devices[deviceSource.deviceType]) {\r\n this._devices[deviceSource.deviceType] = new Array();\r\n }\r\n\r\n if (!this._devices[deviceSource.deviceType][deviceSource.deviceSlot]) {\r\n this._devices[deviceSource.deviceType][deviceSource.deviceSlot] = deviceSource;\r\n this._updateFirstDevices(deviceSource.deviceType);\r\n }\r\n\r\n this.onDeviceConnectedObservable.notifyObservers(deviceSource);\r\n }\r\n\r\n /**\r\n * @param deviceType - DeviceType\r\n * @param deviceSlot - DeviceSlot\r\n * @internal\r\n */\r\n public _removeDevice(deviceType: DeviceType, deviceSlot: number): void {\r\n const deviceSource = this._devices[deviceType]?.[deviceSlot]; // Grab local reference to use before removing from devices\r\n this.onDeviceDisconnectedObservable.notifyObservers(deviceSource as DeviceSourceType);\r\n if (this._devices[deviceType]?.[deviceSlot]) {\r\n delete this._devices[deviceType][deviceSlot];\r\n }\r\n // Even if we don't delete a device, we should still check for the first device as things may have gotten out of sync.\r\n this._updateFirstDevices(deviceType);\r\n }\r\n\r\n /**\r\n * @param deviceType - DeviceType\r\n * @param deviceSlot - DeviceSlot\r\n * @param eventData - Event\r\n * @internal\r\n */\r\n public _onInputChanged(deviceType: T, deviceSlot: number, eventData: IUIEvent): void {\r\n this._devices[deviceType]?.[deviceSlot]?.onInputChangedObservable.notifyObservers(eventData as IKeyboardEvent | IWheelEvent | IPointerEvent);\r\n }\r\n\r\n // Private Functions\r\n private _updateFirstDevices(type: DeviceType): void {\r\n switch (type) {\r\n case DeviceType.Keyboard:\r\n case DeviceType.Mouse:\r\n this._firstDevice[type] = 0;\r\n break;\r\n case DeviceType.Touch:\r\n case DeviceType.DualSense:\r\n case DeviceType.DualShock:\r\n case DeviceType.Xbox:\r\n case DeviceType.Switch:\r\n case DeviceType.Generic: {\r\n delete this._firstDevice[type];\r\n // eslint-disable-next-line no-case-declarations\r\n const devices = this._devices[type];\r\n if (devices) {\r\n for (let i = 0; i < devices.length; i++) {\r\n if (devices[i]) {\r\n this._firstDevice[type] = i;\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n", "import { PrecisionDate } from \"./precisionDate\";\r\n\r\n/**\r\n * This class is used to track a performance counter which is number based.\r\n * The user has access to many properties which give statistics of different nature.\r\n *\r\n * The implementer can track two kinds of Performance Counter: time and count.\r\n * For time you can optionally call fetchNewFrame() to notify the start of a new frame to monitor, then call beginMonitoring() to start and endMonitoring() to record the lapsed time. endMonitoring takes a newFrame parameter for you to specify if the monitored time should be set for a new frame or accumulated to the current frame being monitored.\r\n * For count you first have to call fetchNewFrame() to notify the start of a new frame to monitor, then call addCount() how many time required to increment the count value you monitor.\r\n */\r\nexport class PerfCounter {\r\n /**\r\n * Gets or sets a global boolean to turn on and off all the counters\r\n */\r\n public static Enabled = true;\r\n\r\n /**\r\n * Returns the smallest value ever\r\n */\r\n public get min(): number {\r\n return this._min;\r\n }\r\n\r\n /**\r\n * Returns the biggest value ever\r\n */\r\n public get max(): number {\r\n return this._max;\r\n }\r\n\r\n /**\r\n * Returns the average value since the performance counter is running\r\n */\r\n public get average(): number {\r\n return this._average;\r\n }\r\n\r\n /**\r\n * Returns the average value of the last second the counter was monitored\r\n */\r\n public get lastSecAverage(): number {\r\n return this._lastSecAverage;\r\n }\r\n\r\n /**\r\n * Returns the current value\r\n */\r\n public get current(): number {\r\n return this._current;\r\n }\r\n\r\n /**\r\n * Gets the accumulated total\r\n */\r\n public get total(): number {\r\n return this._totalAccumulated;\r\n }\r\n\r\n /**\r\n * Gets the total value count\r\n */\r\n public get count(): number {\r\n return this._totalValueCount;\r\n }\r\n\r\n /**\r\n * Creates a new counter\r\n */\r\n constructor() {\r\n this._startMonitoringTime = 0;\r\n this._min = 0;\r\n this._max = 0;\r\n this._average = 0;\r\n this._lastSecAverage = 0;\r\n this._current = 0;\r\n this._totalValueCount = 0;\r\n this._totalAccumulated = 0;\r\n this._lastSecAccumulated = 0;\r\n this._lastSecTime = 0;\r\n this._lastSecValueCount = 0;\r\n }\r\n\r\n /**\r\n * Call this method to start monitoring a new frame.\r\n * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the start of the frame, then beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count.\r\n */\r\n public fetchNewFrame() {\r\n this._totalValueCount++;\r\n this._current = 0;\r\n this._lastSecValueCount++;\r\n }\r\n\r\n /**\r\n * Call this method to monitor a count of something (e.g. mesh drawn in viewport count)\r\n * @param newCount the count value to add to the monitored count\r\n * @param fetchResult true when it's the last time in the frame you add to the counter and you wish to update the statistics properties (min/max/average), false if you only want to update statistics.\r\n */\r\n public addCount(newCount: number, fetchResult: boolean) {\r\n if (!PerfCounter.Enabled) {\r\n return;\r\n }\r\n this._current += newCount;\r\n if (fetchResult) {\r\n this._fetchResult();\r\n }\r\n }\r\n\r\n /**\r\n * Start monitoring this performance counter\r\n */\r\n public beginMonitoring() {\r\n if (!PerfCounter.Enabled) {\r\n return;\r\n }\r\n this._startMonitoringTime = PrecisionDate.Now;\r\n }\r\n\r\n /**\r\n * Compute the time lapsed since the previous beginMonitoring() call.\r\n * @param newFrame true by default to fetch the result and monitor a new frame, if false the time monitored will be added to the current frame counter\r\n */\r\n public endMonitoring(newFrame: boolean = true) {\r\n if (!PerfCounter.Enabled) {\r\n return;\r\n }\r\n\r\n if (newFrame) {\r\n this.fetchNewFrame();\r\n }\r\n\r\n const currentTime = PrecisionDate.Now;\r\n this._current = currentTime - this._startMonitoringTime;\r\n\r\n if (newFrame) {\r\n this._fetchResult();\r\n }\r\n }\r\n\r\n /**\r\n * Call this method to end the monitoring of a frame.\r\n * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the end of the frame, after beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count.\r\n */\r\n public endFrame() {\r\n this._fetchResult();\r\n }\r\n\r\n /** @internal */\r\n public _fetchResult() {\r\n this._totalAccumulated += this._current;\r\n this._lastSecAccumulated += this._current;\r\n\r\n // Min/Max update\r\n this._min = Math.min(this._min, this._current);\r\n this._max = Math.max(this._max, this._current);\r\n this._average = this._totalAccumulated / this._totalValueCount;\r\n\r\n // Reset last sec?\r\n const now = PrecisionDate.Now;\r\n if (now - this._lastSecTime > 1000) {\r\n this._lastSecAverage = this._lastSecAccumulated / this._lastSecValueCount;\r\n this._lastSecTime = now;\r\n this._lastSecAccumulated = 0;\r\n this._lastSecValueCount = 0;\r\n }\r\n }\r\n\r\n private _startMonitoringTime: number;\r\n private _min: number;\r\n private _max: number;\r\n private _average: number;\r\n private _current: number;\r\n private _totalValueCount: number;\r\n private _totalAccumulated: number;\r\n private _lastSecAverage: number;\r\n private _lastSecAccumulated: number;\r\n private _lastSecTime: number;\r\n private _lastSecValueCount: number;\r\n}\r\n", "import type { DeepImmutable } from \"../types\";\r\nimport { Vector3, Matrix } from \"./math.vector\";\r\nimport type { IPlaneLike } from \"./math.like\";\r\n\r\n/**\r\n * Represents a plane by the equation ax + by + cz + d = 0\r\n */\r\nexport class Plane implements IPlaneLike {\r\n private static _TmpMatrix = Matrix.Identity();\r\n\r\n /**\r\n * Normal of the plane (a,b,c)\r\n */\r\n public normal: Vector3;\r\n /**\r\n * d component of the plane\r\n */\r\n public d: number;\r\n /**\r\n * Creates a Plane object according to the given floats a, b, c, d and the plane equation : ax + by + cz + d = 0\r\n * @param a a component of the plane\r\n * @param b b component of the plane\r\n * @param c c component of the plane\r\n * @param d d component of the plane\r\n */\r\n constructor(a: number, b: number, c: number, d: number) {\r\n this.normal = new Vector3(a, b, c);\r\n this.d = d;\r\n }\r\n\r\n /**\r\n * @returns the plane coordinates as a new array of 4 elements [a, b, c, d].\r\n */\r\n public asArray(): number[] {\r\n return [this.normal.x, this.normal.y, this.normal.z, this.d];\r\n }\r\n\r\n // Methods\r\n /**\r\n * @returns a new plane copied from the current Plane.\r\n */\r\n public clone(): Plane {\r\n return new Plane(this.normal.x, this.normal.y, this.normal.z, this.d);\r\n }\r\n /**\r\n * @returns the string \"Plane\".\r\n */\r\n public getClassName(): string {\r\n return \"Plane\";\r\n }\r\n /**\r\n * @returns the Plane hash code.\r\n */\r\n public getHashCode(): number {\r\n let hash = this.normal.getHashCode();\r\n hash = (hash * 397) ^ (this.d | 0);\r\n return hash;\r\n }\r\n /**\r\n * Normalize the current Plane in place.\r\n * @returns the updated Plane.\r\n */\r\n public normalize(): Plane {\r\n const norm = Math.sqrt(this.normal.x * this.normal.x + this.normal.y * this.normal.y + this.normal.z * this.normal.z);\r\n let magnitude = 0.0;\r\n\r\n if (norm !== 0) {\r\n magnitude = 1.0 / norm;\r\n }\r\n this.normal.x *= magnitude;\r\n this.normal.y *= magnitude;\r\n this.normal.z *= magnitude;\r\n this.d *= magnitude;\r\n return this;\r\n }\r\n /**\r\n * Applies a transformation the plane and returns the result\r\n * @param transformation the transformation matrix to be applied to the plane\r\n * @returns a new Plane as the result of the transformation of the current Plane by the given matrix.\r\n */\r\n public transform(transformation: DeepImmutable): Plane {\r\n const invertedMatrix = Plane._TmpMatrix;\r\n transformation.invertToRef(invertedMatrix);\r\n const m = invertedMatrix.m;\r\n const x = this.normal.x;\r\n const y = this.normal.y;\r\n const z = this.normal.z;\r\n const d = this.d;\r\n\r\n const normalX = x * m[0] + y * m[1] + z * m[2] + d * m[3];\r\n const normalY = x * m[4] + y * m[5] + z * m[6] + d * m[7];\r\n const normalZ = x * m[8] + y * m[9] + z * m[10] + d * m[11];\r\n const finalD = x * m[12] + y * m[13] + z * m[14] + d * m[15];\r\n\r\n return new Plane(normalX, normalY, normalZ, finalD);\r\n }\r\n\r\n /**\r\n * Compute the dot product between the point and the plane normal\r\n * @param point point to calculate the dot product with\r\n * @returns the dot product (float) of the point coordinates and the plane normal.\r\n */\r\n public dotCoordinate(point: DeepImmutable): number {\r\n return this.normal.x * point.x + this.normal.y * point.y + this.normal.z * point.z + this.d;\r\n }\r\n\r\n /**\r\n * Updates the current Plane from the plane defined by the three given points.\r\n * @param point1 one of the points used to construct the plane\r\n * @param point2 one of the points used to construct the plane\r\n * @param point3 one of the points used to construct the plane\r\n * @returns the updated Plane.\r\n */\r\n public copyFromPoints(point1: DeepImmutable, point2: DeepImmutable, point3: DeepImmutable): Plane {\r\n const x1 = point2.x - point1.x;\r\n const y1 = point2.y - point1.y;\r\n const z1 = point2.z - point1.z;\r\n const x2 = point3.x - point1.x;\r\n const y2 = point3.y - point1.y;\r\n const z2 = point3.z - point1.z;\r\n const yz = y1 * z2 - z1 * y2;\r\n const xz = z1 * x2 - x1 * z2;\r\n const xy = x1 * y2 - y1 * x2;\r\n const pyth = Math.sqrt(yz * yz + xz * xz + xy * xy);\r\n let invPyth;\r\n\r\n if (pyth !== 0) {\r\n invPyth = 1.0 / pyth;\r\n } else {\r\n invPyth = 0.0;\r\n }\r\n\r\n this.normal.x = yz * invPyth;\r\n this.normal.y = xz * invPyth;\r\n this.normal.z = xy * invPyth;\r\n this.d = -(this.normal.x * point1.x + this.normal.y * point1.y + this.normal.z * point1.z);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Checks if the plane is facing a given direction (meaning if the plane's normal is pointing in the opposite direction of the given vector).\r\n * Note that for this function to work as expected you should make sure that:\r\n * - direction and the plane normal are normalized\r\n * - epsilon is a number just bigger than -1, something like -0.99 for eg\r\n * @param direction the direction to check if the plane is facing\r\n * @param epsilon value the dot product is compared against (returns true if dot <= epsilon)\r\n * @returns True if the plane is facing the given direction\r\n */\r\n public isFrontFacingTo(direction: DeepImmutable, epsilon: number): boolean {\r\n const dot = Vector3.Dot(this.normal, direction);\r\n return dot <= epsilon;\r\n }\r\n\r\n /**\r\n * Calculates the distance to a point\r\n * @param point point to calculate distance to\r\n * @returns the signed distance (float) from the given point to the Plane.\r\n */\r\n public signedDistanceTo(point: DeepImmutable): number {\r\n return Vector3.Dot(point, this.normal) + this.d;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a plane from an array\r\n * @param array the array to create a plane from\r\n * @returns a new Plane from the given array.\r\n */\r\n static FromArray(array: DeepImmutable>): Plane {\r\n return new Plane(array[0], array[1], array[2], array[3]);\r\n }\r\n /**\r\n * Creates a plane from three points\r\n * @param point1 point used to create the plane\r\n * @param point2 point used to create the plane\r\n * @param point3 point used to create the plane\r\n * @returns a new Plane defined by the three given points.\r\n */\r\n static FromPoints(point1: DeepImmutable, point2: DeepImmutable, point3: DeepImmutable): Plane {\r\n const result = new Plane(0.0, 0.0, 0.0, 0.0);\r\n result.copyFromPoints(point1, point2, point3);\r\n return result;\r\n }\r\n /**\r\n * Creates a plane from an origin point and a normal\r\n * @param origin origin of the plane to be constructed\r\n * @param normal normal of the plane to be constructed\r\n * @returns a new Plane the normal vector to this plane at the given origin point.\r\n */\r\n static FromPositionAndNormal(origin: DeepImmutable, normal: Vector3): Plane {\r\n const plane = new Plane(0.0, 0.0, 0.0, 0.0);\r\n return this.FromPositionAndNormalToRef(origin, normal, plane);\r\n }\r\n\r\n /**\r\n * Updates the given Plane \"result\" from an origin point and a normal.\r\n * @param origin origin of the plane to be constructed\r\n * @param normal the normalized normals of the plane to be constructed\r\n * @param result defines the Plane where to store the result\r\n * @returns result input\r\n */\r\n static FromPositionAndNormalToRef(origin: DeepImmutable, normal: DeepImmutable, result: T): T {\r\n result.normal.copyFrom(normal);\r\n result.normal.normalize();\r\n result.d = -origin.dot(result.normal);\r\n return result;\r\n }\r\n\r\n /**\r\n * Calculates the distance from a plane and a point\r\n * @param origin origin of the plane to be constructed\r\n * @param normal normal of the plane to be constructed\r\n * @param point point to calculate distance to\r\n * @returns the signed distance between the plane defined by the normal vector at the \"origin\"\" point and the given other point.\r\n */\r\n static SignedDistanceToPlaneFromPositionAndNormal(origin: DeepImmutable, normal: DeepImmutable, point: DeepImmutable): number {\r\n const d = -(normal.x * origin.x + normal.y * origin.y + normal.z * origin.z);\r\n return Vector3.Dot(point, normal) + d;\r\n }\r\n}\r\n", "import type { Matrix, Vector3 } from \"./math.vector\";\r\nimport type { DeepImmutable } from \"../types\";\r\nimport { Plane } from \"./math.plane\";\r\n\r\n/**\r\n * Represents a camera frustum\r\n */\r\nexport class Frustum {\r\n /**\r\n * Gets the planes representing the frustum\r\n * @param transform matrix to be applied to the returned planes\r\n * @returns a new array of 6 Frustum planes computed by the given transformation matrix.\r\n */\r\n public static GetPlanes(transform: DeepImmutable): Plane[] {\r\n const frustumPlanes = [];\r\n for (let index = 0; index < 6; index++) {\r\n frustumPlanes.push(new Plane(0.0, 0.0, 0.0, 0.0));\r\n }\r\n Frustum.GetPlanesToRef(transform, frustumPlanes);\r\n return frustumPlanes;\r\n }\r\n\r\n /**\r\n * Gets the near frustum plane transformed by the transform matrix\r\n * @param transform transformation matrix to be applied to the resulting frustum plane\r\n * @param frustumPlane the resulting frustum plane\r\n */\r\n public static GetNearPlaneToRef(transform: DeepImmutable, frustumPlane: Plane): void {\r\n const m = transform.m;\r\n frustumPlane.normal.x = m[3] + m[2];\r\n frustumPlane.normal.y = m[7] + m[6];\r\n frustumPlane.normal.z = m[11] + m[10];\r\n frustumPlane.d = m[15] + m[14];\r\n frustumPlane.normalize();\r\n }\r\n\r\n /**\r\n * Gets the far frustum plane transformed by the transform matrix\r\n * @param transform transformation matrix to be applied to the resulting frustum plane\r\n * @param frustumPlane the resulting frustum plane\r\n */\r\n public static GetFarPlaneToRef(transform: DeepImmutable, frustumPlane: Plane): void {\r\n const m = transform.m;\r\n frustumPlane.normal.x = m[3] - m[2];\r\n frustumPlane.normal.y = m[7] - m[6];\r\n frustumPlane.normal.z = m[11] - m[10];\r\n frustumPlane.d = m[15] - m[14];\r\n frustumPlane.normalize();\r\n }\r\n\r\n /**\r\n * Gets the left frustum plane transformed by the transform matrix\r\n * @param transform transformation matrix to be applied to the resulting frustum plane\r\n * @param frustumPlane the resulting frustum plane\r\n */\r\n public static GetLeftPlaneToRef(transform: DeepImmutable, frustumPlane: Plane): void {\r\n const m = transform.m;\r\n frustumPlane.normal.x = m[3] + m[0];\r\n frustumPlane.normal.y = m[7] + m[4];\r\n frustumPlane.normal.z = m[11] + m[8];\r\n frustumPlane.d = m[15] + m[12];\r\n frustumPlane.normalize();\r\n }\r\n\r\n /**\r\n * Gets the right frustum plane transformed by the transform matrix\r\n * @param transform transformation matrix to be applied to the resulting frustum plane\r\n * @param frustumPlane the resulting frustum plane\r\n */\r\n public static GetRightPlaneToRef(transform: DeepImmutable, frustumPlane: Plane): void {\r\n const m = transform.m;\r\n frustumPlane.normal.x = m[3] - m[0];\r\n frustumPlane.normal.y = m[7] - m[4];\r\n frustumPlane.normal.z = m[11] - m[8];\r\n frustumPlane.d = m[15] - m[12];\r\n frustumPlane.normalize();\r\n }\r\n\r\n /**\r\n * Gets the top frustum plane transformed by the transform matrix\r\n * @param transform transformation matrix to be applied to the resulting frustum plane\r\n * @param frustumPlane the resulting frustum plane\r\n */\r\n public static GetTopPlaneToRef(transform: DeepImmutable, frustumPlane: Plane): void {\r\n const m = transform.m;\r\n frustumPlane.normal.x = m[3] - m[1];\r\n frustumPlane.normal.y = m[7] - m[5];\r\n frustumPlane.normal.z = m[11] - m[9];\r\n frustumPlane.d = m[15] - m[13];\r\n frustumPlane.normalize();\r\n }\r\n\r\n /**\r\n * Gets the bottom frustum plane transformed by the transform matrix\r\n * @param transform transformation matrix to be applied to the resulting frustum plane\r\n * @param frustumPlane the resulting frustum plane\r\n */\r\n public static GetBottomPlaneToRef(transform: DeepImmutable, frustumPlane: Plane): void {\r\n const m = transform.m;\r\n frustumPlane.normal.x = m[3] + m[1];\r\n frustumPlane.normal.y = m[7] + m[5];\r\n frustumPlane.normal.z = m[11] + m[9];\r\n frustumPlane.d = m[15] + m[13];\r\n frustumPlane.normalize();\r\n }\r\n\r\n /**\r\n * Sets the given array \"frustumPlanes\" with the 6 Frustum planes computed by the given transformation matrix.\r\n * @param transform transformation matrix to be applied to the resulting frustum planes\r\n * @param frustumPlanes the resulting frustum planes\r\n */\r\n public static GetPlanesToRef(transform: DeepImmutable, frustumPlanes: Plane[]): void {\r\n // Near\r\n Frustum.GetNearPlaneToRef(transform, frustumPlanes[0]);\r\n\r\n // Far\r\n Frustum.GetFarPlaneToRef(transform, frustumPlanes[1]);\r\n\r\n // Left\r\n Frustum.GetLeftPlaneToRef(transform, frustumPlanes[2]);\r\n\r\n // Right\r\n Frustum.GetRightPlaneToRef(transform, frustumPlanes[3]);\r\n\r\n // Top\r\n Frustum.GetTopPlaneToRef(transform, frustumPlanes[4]);\r\n\r\n // Bottom\r\n Frustum.GetBottomPlaneToRef(transform, frustumPlanes[5]);\r\n }\r\n\r\n /**\r\n * Tests if a point is located between the frustum planes.\r\n * @param point defines the point to test\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if the point is located between the frustum planes\r\n */\r\n public static IsPointInFrustum(point: Vector3, frustumPlanes: Array>): boolean {\r\n for (let i = 0; i < 6; i++) {\r\n if (frustumPlanes[i].dotCoordinate(point) < 0) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n", "import type { EventState, Observable, Observer } from \"../Misc/observable\";\r\nimport { PointerInfoPre, PointerInfo, PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { Nullable } from \"../types\";\r\nimport { AbstractActionManager } from \"../Actions/abstractActionManager\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport { Vector2, Matrix } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { ActionEvent } from \"../Actions/actionEvent\";\r\nimport { KeyboardEventTypes, KeyboardInfoPre, KeyboardInfo } from \"../Events/keyboardEvents\";\r\nimport { DeviceType, PointerInput } from \"../DeviceInput/InputDevices/deviceEnums\";\r\nimport type { IKeyboardEvent, IMouseEvent, IPointerEvent } from \"../Events/deviceInputEvents\";\r\nimport { DeviceSourceManager } from \"../DeviceInput/InputDevices/deviceSourceManager\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\nimport type { Scene } from \"../scene\";\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nclass _ClickInfo {\r\n private _singleClick = false;\r\n private _doubleClick = false;\r\n private _hasSwiped = false;\r\n private _ignore = false;\r\n\r\n public get singleClick(): boolean {\r\n return this._singleClick;\r\n }\r\n public get doubleClick(): boolean {\r\n return this._doubleClick;\r\n }\r\n public get hasSwiped(): boolean {\r\n return this._hasSwiped;\r\n }\r\n public get ignore(): boolean {\r\n return this._ignore;\r\n }\r\n\r\n public set singleClick(b: boolean) {\r\n this._singleClick = b;\r\n }\r\n public set doubleClick(b: boolean) {\r\n this._doubleClick = b;\r\n }\r\n public set hasSwiped(b: boolean) {\r\n this._hasSwiped = b;\r\n }\r\n public set ignore(b: boolean) {\r\n this._ignore = b;\r\n }\r\n}\r\n\r\n/** @internal */\r\ninterface _IClickEvent {\r\n clickInfo: _ClickInfo;\r\n evt: IPointerEvent;\r\n timeoutId: number;\r\n}\r\n\r\n/**\r\n * Class used to manage all inputs for the scene.\r\n */\r\nexport class InputManager {\r\n /** The distance in pixel that you have to move to prevent some events */\r\n public static DragMovementThreshold = 10; // in pixels\r\n /** Time in milliseconds to wait to raise long press events if button is still pressed */\r\n public static LongPressDelay = 500; // in milliseconds\r\n /** Time in milliseconds with two consecutive clicks will be considered as a double click */\r\n public static DoubleClickDelay = 300; // in milliseconds\r\n /**\r\n * This flag will modify the behavior so that, when true, a click will happen if and only if\r\n * another click DOES NOT happen within the DoubleClickDelay time frame. If another click does\r\n * happen within that time frame, the first click will not fire an event and and a double click will occur.\r\n */\r\n public static ExclusiveDoubleClickMode = false;\r\n\r\n /** This is a defensive check to not allow control attachment prior to an already active one. If already attached, previous control is unattached before attaching the new one. */\r\n private _alreadyAttached = false;\r\n private _alreadyAttachedTo: Nullable;\r\n\r\n // Pointers\r\n private _onPointerMove: (evt: IMouseEvent) => void;\r\n private _onPointerDown: (evt: IPointerEvent) => void;\r\n private _onPointerUp: (evt: IPointerEvent) => void;\r\n\r\n private _initClickEvent: (\r\n obs1: Observable,\r\n obs2: Observable,\r\n evt: IPointerEvent,\r\n cb: (clickInfo: _ClickInfo, pickResult: Nullable) => void\r\n ) => void;\r\n private _initActionManager: (act: Nullable, clickInfo: _ClickInfo) => Nullable;\r\n private _delayedSimpleClick: (btn: number, clickInfo: _ClickInfo, cb: (clickInfo: _ClickInfo, pickResult: Nullable) => void) => void;\r\n private _meshPickProceed = false;\r\n\r\n private _previousButtonPressed: number;\r\n private _currentPickResult: Nullable = null;\r\n private _previousPickResult: Nullable = null;\r\n private _totalPointersPressed = 0;\r\n private _doubleClickOccured = false;\r\n private _isSwiping: boolean = false;\r\n private _swipeButtonPressed: number = -1;\r\n private _skipPointerTap: boolean = false;\r\n private _isMultiTouchGesture: boolean = false;\r\n\r\n private _pointerOverMesh: Nullable;\r\n\r\n private _pickedDownMesh: Nullable;\r\n private _pickedUpMesh: Nullable;\r\n\r\n private _pointerX: number = 0;\r\n private _pointerY: number = 0;\r\n private _unTranslatedPointerX: number;\r\n private _unTranslatedPointerY: number;\r\n private _startingPointerPosition = new Vector2(0, 0);\r\n private _previousStartingPointerPosition = new Vector2(0, 0);\r\n private _startingPointerTime = 0;\r\n private _previousStartingPointerTime = 0;\r\n private _pointerCaptures: { [pointerId: number]: boolean } = {};\r\n private _meshUnderPointerId: { [pointerId: number]: Nullable } = {};\r\n private _movePointerInfo: Nullable = null;\r\n private _cameraObserverCount = 0;\r\n private _delayedClicks: Array> = [null, null, null, null, null];\r\n\r\n // Keyboard\r\n private _onKeyDown: (evt: IKeyboardEvent) => void;\r\n private _onKeyUp: (evt: IKeyboardEvent) => void;\r\n\r\n private _scene: Scene;\r\n private _deviceSourceManager: Nullable = null;\r\n\r\n /**\r\n * Creates a new InputManager\r\n * @param scene - defines the hosting scene\r\n */\r\n constructor(scene?: Scene) {\r\n this._scene = scene || EngineStore.LastCreatedScene;\r\n if (!this._scene) {\r\n return;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the mesh that is currently under the pointer\r\n * @returns Mesh that the pointer is pointer is hovering over\r\n */\r\n public get meshUnderPointer(): Nullable {\r\n if (this._movePointerInfo) {\r\n // Because _pointerOverMesh is populated as part of _pickMove, we need to force a pick to update it.\r\n // Calling _pickMove calls _setCursorAndPointerOverMesh which calls setPointerOverMesh\r\n this._movePointerInfo._generatePickInfo();\r\n // Once we have what we need, we can clear _movePointerInfo because we don't need it anymore\r\n this._movePointerInfo = null;\r\n }\r\n return this._pointerOverMesh;\r\n }\r\n\r\n /**\r\n * When using more than one pointer (for example in XR) you can get the mesh under the specific pointer\r\n * @param pointerId - the pointer id to use\r\n * @returns The mesh under this pointer id or null if not found\r\n */\r\n public getMeshUnderPointerByPointerId(pointerId: number): Nullable {\r\n return this._meshUnderPointerId[pointerId] || null;\r\n }\r\n\r\n /**\r\n * Gets the pointer coordinates in 2D without any translation (ie. straight out of the pointer event)\r\n * @returns Vector with X/Y values directly from pointer event\r\n */\r\n public get unTranslatedPointer(): Vector2 {\r\n return new Vector2(this._unTranslatedPointerX, this._unTranslatedPointerY);\r\n }\r\n\r\n /**\r\n * Gets or sets the current on-screen X position of the pointer\r\n * @returns Translated X with respect to screen\r\n */\r\n public get pointerX(): number {\r\n return this._pointerX;\r\n }\r\n\r\n public set pointerX(value: number) {\r\n this._pointerX = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the current on-screen Y position of the pointer\r\n * @returns Translated Y with respect to screen\r\n */\r\n public get pointerY(): number {\r\n return this._pointerY;\r\n }\r\n\r\n public set pointerY(value: number) {\r\n this._pointerY = value;\r\n }\r\n\r\n private _updatePointerPosition(evt: IPointerEvent): void {\r\n const canvasRect = this._scene.getEngine().getInputElementClientRect();\r\n\r\n if (!canvasRect) {\r\n return;\r\n }\r\n\r\n this._pointerX = evt.clientX - canvasRect.left;\r\n this._pointerY = evt.clientY - canvasRect.top;\r\n\r\n this._unTranslatedPointerX = this._pointerX;\r\n this._unTranslatedPointerY = this._pointerY;\r\n }\r\n\r\n private _processPointerMove(pickResult: Nullable, evt: IPointerEvent) {\r\n const scene = this._scene;\r\n const engine = scene.getEngine();\r\n const canvas = engine.getInputElement();\r\n\r\n if (canvas) {\r\n canvas.tabIndex = engine.canvasTabIndex;\r\n\r\n // Restore pointer\r\n if (!scene.doNotHandleCursors) {\r\n canvas.style.cursor = scene.defaultCursor;\r\n }\r\n }\r\n\r\n this._setCursorAndPointerOverMesh(pickResult, evt, scene);\r\n\r\n for (const step of scene._pointerMoveStage) {\r\n // If _pointerMoveState is defined, we have an active spriteManager and can't use Lazy Picking\r\n // Therefore, we need to force a pick to update the pickResult\r\n pickResult = pickResult || this._pickMove(evt);\r\n const isMeshPicked = pickResult?.pickedMesh ? true : false;\r\n pickResult = step.action(this._unTranslatedPointerX, this._unTranslatedPointerY, pickResult, isMeshPicked, canvas);\r\n }\r\n\r\n const type = evt.inputIndex >= PointerInput.MouseWheelX && evt.inputIndex <= PointerInput.MouseWheelZ ? PointerEventTypes.POINTERWHEEL : PointerEventTypes.POINTERMOVE;\r\n\r\n if (scene.onPointerMove) {\r\n // Because of lazy picking, we need to force a pick to update the pickResult\r\n pickResult = pickResult || this._pickMove(evt);\r\n scene.onPointerMove(evt, pickResult, type);\r\n }\r\n\r\n let pointerInfo: PointerInfo;\r\n if (pickResult) {\r\n pointerInfo = new PointerInfo(type, evt, pickResult);\r\n this._setRayOnPointerInfo(pickResult, evt);\r\n } else {\r\n pointerInfo = new PointerInfo(type, evt, null, this);\r\n this._movePointerInfo = pointerInfo;\r\n }\r\n\r\n if (scene.onPointerObservable.hasObservers()) {\r\n scene.onPointerObservable.notifyObservers(pointerInfo, type);\r\n }\r\n }\r\n\r\n // Pointers handling\r\n /** @internal */\r\n public _setRayOnPointerInfo(pickInfo: Nullable, event: IMouseEvent) {\r\n const scene = this._scene;\r\n if (pickInfo && scene._pickingAvailable) {\r\n if (!pickInfo.ray) {\r\n pickInfo.ray = scene.createPickingRay(event.offsetX, event.offsetY, Matrix.Identity(), scene.activeCamera);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _addCameraPointerObserver(observer: (p: PointerInfo, s: EventState) => void, mask?: number): Nullable> {\r\n this._cameraObserverCount++;\r\n return this._scene.onPointerObservable.add(observer, mask);\r\n }\r\n\r\n /** @internal */\r\n public _removeCameraPointerObserver(observer: Observer): boolean {\r\n this._cameraObserverCount--;\r\n return this._scene.onPointerObservable.remove(observer);\r\n }\r\n\r\n private _checkForPicking(): boolean {\r\n return !!(this._scene.onPointerObservable.observers.length > this._cameraObserverCount || this._scene.onPointerPick);\r\n }\r\n\r\n private _checkPrePointerObservable(pickResult: Nullable, evt: IPointerEvent, type: number) {\r\n const scene = this._scene;\r\n const pi = new PointerInfoPre(type, evt, this._unTranslatedPointerX, this._unTranslatedPointerY);\r\n if (pickResult) {\r\n pi.originalPickingInfo = pickResult;\r\n pi.ray = pickResult.ray;\r\n if (evt.pointerType === \"xr-near\" && pickResult.originMesh) {\r\n pi.nearInteractionPickingInfo = pickResult;\r\n }\r\n }\r\n\r\n scene.onPrePointerObservable.notifyObservers(pi, type);\r\n if (pi.skipOnPointerObservable) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _pickMove(evt: IPointerEvent): PickingInfo {\r\n const scene = this._scene;\r\n const pickResult = scene.pick(\r\n this._unTranslatedPointerX,\r\n this._unTranslatedPointerY,\r\n scene.pointerMovePredicate,\r\n scene.pointerMoveFastCheck,\r\n scene.cameraToUseForPointers,\r\n scene.pointerMoveTrianglePredicate\r\n );\r\n\r\n this._setCursorAndPointerOverMesh(pickResult, evt, scene);\r\n\r\n return pickResult;\r\n }\r\n\r\n private _setCursorAndPointerOverMesh(pickResult: Nullable, evt: IPointerEvent, scene: Scene) {\r\n const engine = scene.getEngine();\r\n const canvas = engine.getInputElement();\r\n\r\n if (pickResult?.pickedMesh) {\r\n this.setPointerOverMesh(pickResult.pickedMesh, evt.pointerId, pickResult, evt);\r\n\r\n if (!scene.doNotHandleCursors && canvas && this._pointerOverMesh) {\r\n const actionManager = this._pointerOverMesh._getActionManagerForTrigger();\r\n if (actionManager && actionManager.hasPointerTriggers) {\r\n canvas.style.cursor = actionManager.hoverCursor || scene.hoverCursor;\r\n }\r\n }\r\n } else {\r\n this.setPointerOverMesh(null, evt.pointerId, pickResult, evt);\r\n }\r\n }\r\n\r\n /**\r\n * Use this method to simulate a pointer move on a mesh\r\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\r\n * @param pickResult - pickingInfo of the object wished to simulate pointer event on\r\n * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\r\n */\r\n public simulatePointerMove(pickResult: PickingInfo, pointerEventInit?: PointerEventInit): void {\r\n const evt = new PointerEvent(\"pointermove\", pointerEventInit);\r\n evt.inputIndex = PointerInput.Move;\r\n\r\n if (this._checkPrePointerObservable(pickResult, evt, PointerEventTypes.POINTERMOVE)) {\r\n return;\r\n }\r\n this._processPointerMove(pickResult, evt);\r\n }\r\n\r\n /**\r\n * Use this method to simulate a pointer down on a mesh\r\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\r\n * @param pickResult - pickingInfo of the object wished to simulate pointer event on\r\n * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\r\n */\r\n public simulatePointerDown(pickResult: PickingInfo, pointerEventInit?: PointerEventInit): void {\r\n const evt = new PointerEvent(\"pointerdown\", pointerEventInit);\r\n evt.inputIndex = evt.button + 2;\r\n\r\n if (this._checkPrePointerObservable(pickResult, evt, PointerEventTypes.POINTERDOWN)) {\r\n return;\r\n }\r\n\r\n this._processPointerDown(pickResult, evt);\r\n }\r\n\r\n private _processPointerDown(pickResult: Nullable, evt: IPointerEvent): void {\r\n const scene = this._scene;\r\n if (pickResult?.pickedMesh) {\r\n this._pickedDownMesh = pickResult.pickedMesh;\r\n const actionManager = pickResult.pickedMesh._getActionManagerForTrigger();\r\n if (actionManager) {\r\n if (actionManager.hasPickTriggers) {\r\n actionManager.processTrigger(Constants.ACTION_OnPickDownTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n switch (evt.button) {\r\n case 0:\r\n actionManager.processTrigger(Constants.ACTION_OnLeftPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n break;\r\n case 1:\r\n actionManager.processTrigger(Constants.ACTION_OnCenterPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n break;\r\n case 2:\r\n actionManager.processTrigger(Constants.ACTION_OnRightPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n break;\r\n }\r\n }\r\n\r\n if (actionManager.hasSpecificTrigger(Constants.ACTION_OnLongPressTrigger)) {\r\n window.setTimeout(() => {\r\n const pickResult = scene.pick(\r\n this._unTranslatedPointerX,\r\n this._unTranslatedPointerY,\r\n (mesh: AbstractMesh): boolean =>\r\n (\r\n (mesh.isPickable &&\r\n mesh.isVisible &&\r\n mesh.isReady() &&\r\n mesh.actionManager &&\r\n mesh.actionManager.hasSpecificTrigger(Constants.ACTION_OnLongPressTrigger) &&\r\n mesh === this._pickedDownMesh)\r\n ),\r\n false,\r\n scene.cameraToUseForPointers\r\n );\r\n\r\n if (pickResult?.pickedMesh && actionManager) {\r\n if (this._totalPointersPressed !== 0 && Date.now() - this._startingPointerTime > InputManager.LongPressDelay && !this._isPointerSwiping()) {\r\n this._startingPointerTime = 0;\r\n actionManager.processTrigger(Constants.ACTION_OnLongPressTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt));\r\n }\r\n }\r\n }, InputManager.LongPressDelay);\r\n }\r\n }\r\n } else {\r\n for (const step of scene._pointerDownStage) {\r\n pickResult = step.action(this._unTranslatedPointerX, this._unTranslatedPointerY, pickResult, evt, false);\r\n }\r\n }\r\n\r\n let pointerInfo: PointerInfo;\r\n const type = PointerEventTypes.POINTERDOWN;\r\n\r\n if (pickResult) {\r\n if (scene.onPointerDown) {\r\n scene.onPointerDown(evt, pickResult, type);\r\n }\r\n\r\n pointerInfo = new PointerInfo(type, evt, pickResult);\r\n this._setRayOnPointerInfo(pickResult, evt);\r\n } else {\r\n pointerInfo = new PointerInfo(type, evt, null, this);\r\n }\r\n\r\n if (scene.onPointerObservable.hasObservers()) {\r\n scene.onPointerObservable.notifyObservers(pointerInfo, type);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * @internals Boolean if delta for pointer exceeds drag movement threshold\r\n */\r\n public _isPointerSwiping(): boolean {\r\n return this._isSwiping;\r\n }\r\n\r\n /**\r\n * Use this method to simulate a pointer up on a mesh\r\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\r\n * @param pickResult - pickingInfo of the object wished to simulate pointer event on\r\n * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\r\n * @param doubleTap - indicates that the pointer up event should be considered as part of a double click (false by default)\r\n */\r\n public simulatePointerUp(pickResult: PickingInfo, pointerEventInit?: PointerEventInit, doubleTap?: boolean): void {\r\n const evt = new PointerEvent(\"pointerup\", pointerEventInit);\r\n evt.inputIndex = PointerInput.Move;\r\n const clickInfo = new _ClickInfo();\r\n\r\n if (doubleTap) {\r\n clickInfo.doubleClick = true;\r\n } else {\r\n clickInfo.singleClick = true;\r\n }\r\n\r\n if (this._checkPrePointerObservable(pickResult, evt, PointerEventTypes.POINTERUP)) {\r\n return;\r\n }\r\n\r\n this._processPointerUp(pickResult, evt, clickInfo);\r\n }\r\n\r\n private _processPointerUp(pickResult: Nullable, evt: IPointerEvent, clickInfo: _ClickInfo): void {\r\n const scene = this._scene;\r\n if (pickResult?.pickedMesh) {\r\n this._pickedUpMesh = pickResult.pickedMesh;\r\n if (this._pickedDownMesh === this._pickedUpMesh) {\r\n if (scene.onPointerPick) {\r\n scene.onPointerPick(evt, pickResult);\r\n }\r\n if (clickInfo.singleClick && !clickInfo.ignore && scene.onPointerObservable.observers.length > this._cameraObserverCount) {\r\n const type = PointerEventTypes.POINTERPICK;\r\n const pi = new PointerInfo(type, evt, pickResult);\r\n this._setRayOnPointerInfo(pickResult, evt);\r\n scene.onPointerObservable.notifyObservers(pi, type);\r\n }\r\n }\r\n const actionManager = pickResult.pickedMesh._getActionManagerForTrigger();\r\n if (actionManager && !clickInfo.ignore) {\r\n actionManager.processTrigger(Constants.ACTION_OnPickUpTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n\r\n if (!clickInfo.hasSwiped && clickInfo.singleClick) {\r\n actionManager.processTrigger(Constants.ACTION_OnPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n }\r\n\r\n const doubleClickActionManager = pickResult.pickedMesh._getActionManagerForTrigger(Constants.ACTION_OnDoublePickTrigger);\r\n if (clickInfo.doubleClick && doubleClickActionManager) {\r\n doubleClickActionManager.processTrigger(Constants.ACTION_OnDoublePickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n }\r\n }\r\n } else {\r\n if (!clickInfo.ignore) {\r\n for (const step of scene._pointerUpStage) {\r\n pickResult = step.action(this._unTranslatedPointerX, this._unTranslatedPointerY, pickResult, evt, clickInfo.doubleClick);\r\n }\r\n }\r\n }\r\n\r\n if (this._pickedDownMesh && this._pickedDownMesh !== this._pickedUpMesh) {\r\n const pickedDownActionManager = this._pickedDownMesh._getActionManagerForTrigger(Constants.ACTION_OnPickOutTrigger);\r\n if (pickedDownActionManager) {\r\n pickedDownActionManager.processTrigger(Constants.ACTION_OnPickOutTrigger, ActionEvent.CreateNew(this._pickedDownMesh, evt));\r\n }\r\n }\r\n\r\n if (!clickInfo.ignore) {\r\n const pi = new PointerInfo(PointerEventTypes.POINTERUP, evt, pickResult);\r\n // Set ray on picking info. Note that this info will also be reused for the tap notification.\r\n this._setRayOnPointerInfo(pickResult, evt);\r\n scene.onPointerObservable.notifyObservers(pi, PointerEventTypes.POINTERUP);\r\n\r\n if (scene.onPointerUp) {\r\n scene.onPointerUp(evt, pickResult, PointerEventTypes.POINTERUP);\r\n }\r\n\r\n if (!clickInfo.hasSwiped && !this._skipPointerTap && !this._isMultiTouchGesture) {\r\n let type = 0;\r\n if (clickInfo.singleClick) {\r\n type = PointerEventTypes.POINTERTAP;\r\n } else if (clickInfo.doubleClick) {\r\n type = PointerEventTypes.POINTERDOUBLETAP;\r\n }\r\n\r\n if (type) {\r\n const pi = new PointerInfo(type, evt, pickResult);\r\n if (scene.onPointerObservable.hasObservers() && scene.onPointerObservable.hasSpecificMask(type)) {\r\n scene.onPointerObservable.notifyObservers(pi, type);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down)\r\n * @param pointerId - defines the pointer id to use in a multi-touch scenario (0 by default)\r\n * @returns true if the pointer was captured\r\n */\r\n public isPointerCaptured(pointerId = 0): boolean {\r\n return this._pointerCaptures[pointerId];\r\n }\r\n\r\n /**\r\n * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp\r\n * @param attachUp - defines if you want to attach events to pointerup\r\n * @param attachDown - defines if you want to attach events to pointerdown\r\n * @param attachMove - defines if you want to attach events to pointermove\r\n * @param elementToAttachTo - defines the target DOM element to attach to (will use the canvas by default)\r\n */\r\n public attachControl(attachUp = true, attachDown = true, attachMove = true, elementToAttachTo: Nullable = null): void {\r\n const scene = this._scene;\r\n const engine = scene.getEngine();\r\n\r\n if (!elementToAttachTo) {\r\n elementToAttachTo = engine.getInputElement();\r\n }\r\n\r\n if (this._alreadyAttached) {\r\n this.detachControl();\r\n }\r\n\r\n if (elementToAttachTo) {\r\n this._alreadyAttachedTo = elementToAttachTo;\r\n }\r\n this._deviceSourceManager = new DeviceSourceManager(engine);\r\n\r\n // Because this is only called from _initClickEvent, which is called in _onPointerUp, we'll use the pointerUpPredicate for the pick call\r\n this._initActionManager = (act: Nullable): Nullable => {\r\n if (!this._meshPickProceed) {\r\n const pickResult =\r\n scene.skipPointerUpPicking || (scene._registeredActions === 0 && !this._checkForPicking() && !scene.onPointerUp)\r\n ? null\r\n : scene.pick(\r\n this._unTranslatedPointerX,\r\n this._unTranslatedPointerY,\r\n scene.pointerUpPredicate,\r\n scene.pointerUpFastCheck,\r\n scene.cameraToUseForPointers,\r\n scene.pointerUpTrianglePredicate\r\n );\r\n this._currentPickResult = pickResult;\r\n if (pickResult) {\r\n act = pickResult.hit && pickResult.pickedMesh ? pickResult.pickedMesh._getActionManagerForTrigger() : null;\r\n }\r\n this._meshPickProceed = true;\r\n }\r\n return act;\r\n };\r\n\r\n this._delayedSimpleClick = (btn: number, clickInfo: _ClickInfo, cb: (clickInfo: _ClickInfo, pickResult: Nullable) => void) => {\r\n // double click delay is over and that no double click has been raised since, or the 2 consecutive keys pressed are different\r\n if ((Date.now() - this._previousStartingPointerTime > InputManager.DoubleClickDelay && !this._doubleClickOccured) || btn !== this._previousButtonPressed) {\r\n this._doubleClickOccured = false;\r\n clickInfo.singleClick = true;\r\n clickInfo.ignore = false;\r\n\r\n // If we have a delayed click, we need to resolve the TAP event\r\n if (this._delayedClicks[btn]) {\r\n const evt = this._delayedClicks[btn]!.evt;\r\n const type = PointerEventTypes.POINTERTAP;\r\n const pi = new PointerInfo(type, evt, this._currentPickResult);\r\n if (scene.onPointerObservable.hasObservers() && scene.onPointerObservable.hasSpecificMask(type)) {\r\n scene.onPointerObservable.notifyObservers(pi, type);\r\n }\r\n\r\n // Clear the delayed click\r\n this._delayedClicks[btn] = null;\r\n }\r\n }\r\n };\r\n\r\n this._initClickEvent = (\r\n obs1: Observable,\r\n obs2: Observable,\r\n evt: IPointerEvent,\r\n cb: (clickInfo: _ClickInfo, pickResult: Nullable) => void\r\n ): void => {\r\n const clickInfo = new _ClickInfo();\r\n this._currentPickResult = null;\r\n let act: Nullable = null;\r\n\r\n let checkPicking =\r\n obs1.hasSpecificMask(PointerEventTypes.POINTERPICK) ||\r\n obs2.hasSpecificMask(PointerEventTypes.POINTERPICK) ||\r\n obs1.hasSpecificMask(PointerEventTypes.POINTERTAP) ||\r\n obs2.hasSpecificMask(PointerEventTypes.POINTERTAP) ||\r\n obs1.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP) ||\r\n obs2.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP);\r\n if (!checkPicking && AbstractActionManager) {\r\n act = this._initActionManager(act, clickInfo);\r\n if (act) {\r\n checkPicking = act.hasPickTriggers;\r\n }\r\n }\r\n\r\n let needToIgnoreNext = false;\r\n\r\n if (checkPicking) {\r\n const btn = evt.button;\r\n clickInfo.hasSwiped = this._isPointerSwiping();\r\n\r\n if (!clickInfo.hasSwiped) {\r\n let checkSingleClickImmediately = !InputManager.ExclusiveDoubleClickMode;\r\n\r\n if (!checkSingleClickImmediately) {\r\n checkSingleClickImmediately = !obs1.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP) && !obs2.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP);\r\n\r\n if (checkSingleClickImmediately && !AbstractActionManager.HasSpecificTrigger(Constants.ACTION_OnDoublePickTrigger)) {\r\n act = this._initActionManager(act, clickInfo);\r\n if (act) {\r\n checkSingleClickImmediately = !act.hasSpecificTrigger(Constants.ACTION_OnDoublePickTrigger);\r\n }\r\n }\r\n }\r\n\r\n if (checkSingleClickImmediately) {\r\n // single click detected if double click delay is over or two different successive keys pressed without exclusive double click or no double click required\r\n if (Date.now() - this._previousStartingPointerTime > InputManager.DoubleClickDelay || btn !== this._previousButtonPressed) {\r\n clickInfo.singleClick = true;\r\n cb(clickInfo, this._currentPickResult);\r\n needToIgnoreNext = true;\r\n }\r\n }\r\n // at least one double click is required to be check and exclusive double click is enabled\r\n else {\r\n // Queue up a delayed click, just in case this isn't a double click\r\n // It should be noted that while this delayed event happens\r\n // because of user input, it shouldn't be considered as a direct,\r\n // timing-dependent result of that input. It's meant to just fire the TAP event\r\n const delayedClick = {\r\n evt: evt,\r\n clickInfo: clickInfo,\r\n timeoutId: window.setTimeout(this._delayedSimpleClick.bind(this, btn, clickInfo, cb), InputManager.DoubleClickDelay),\r\n };\r\n\r\n this._delayedClicks[btn] = delayedClick;\r\n }\r\n\r\n let checkDoubleClick = obs1.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP) || obs2.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP);\r\n if (!checkDoubleClick && AbstractActionManager.HasSpecificTrigger(Constants.ACTION_OnDoublePickTrigger)) {\r\n act = this._initActionManager(act, clickInfo);\r\n if (act) {\r\n checkDoubleClick = act.hasSpecificTrigger(Constants.ACTION_OnDoublePickTrigger);\r\n }\r\n }\r\n if (checkDoubleClick) {\r\n // two successive keys pressed are equal, double click delay is not over and double click has not just occurred\r\n if (btn === this._previousButtonPressed && Date.now() - this._previousStartingPointerTime < InputManager.DoubleClickDelay && !this._doubleClickOccured) {\r\n // pointer has not moved for 2 clicks, it's a double click\r\n if (!clickInfo.hasSwiped && !this._isPointerSwiping()) {\r\n this._previousStartingPointerTime = 0;\r\n this._doubleClickOccured = true;\r\n clickInfo.doubleClick = true;\r\n clickInfo.ignore = false;\r\n // If we have a pending click, we need to cancel it\r\n if (InputManager.ExclusiveDoubleClickMode && this._delayedClicks[btn]) {\r\n clearTimeout(this._delayedClicks[btn]?.timeoutId);\r\n this._delayedClicks[btn] = null;\r\n }\r\n\r\n cb(clickInfo, this._currentPickResult);\r\n }\r\n // if the two successive clicks are too far, it's just two simple clicks\r\n else {\r\n this._doubleClickOccured = false;\r\n this._previousStartingPointerTime = this._startingPointerTime;\r\n this._previousStartingPointerPosition.x = this._startingPointerPosition.x;\r\n this._previousStartingPointerPosition.y = this._startingPointerPosition.y;\r\n this._previousButtonPressed = btn;\r\n if (InputManager.ExclusiveDoubleClickMode) {\r\n // If we have a delayed click, we need to cancel it\r\n if (this._delayedClicks[btn]) {\r\n clearTimeout(this._delayedClicks[btn]?.timeoutId);\r\n this._delayedClicks[btn] = null;\r\n }\r\n cb(clickInfo, this._previousPickResult);\r\n } else {\r\n cb(clickInfo, this._currentPickResult);\r\n }\r\n }\r\n needToIgnoreNext = true;\r\n }\r\n // just the first click of the double has been raised\r\n else {\r\n this._doubleClickOccured = false;\r\n this._previousStartingPointerTime = this._startingPointerTime;\r\n this._previousStartingPointerPosition.x = this._startingPointerPosition.x;\r\n this._previousStartingPointerPosition.y = this._startingPointerPosition.y;\r\n this._previousButtonPressed = btn!;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Even if ExclusiveDoubleClickMode is true, we need to always handle\r\n // up events at time of execution, unless we're explicitly ignoring them.\r\n if (!needToIgnoreNext) {\r\n cb(clickInfo, this._currentPickResult);\r\n }\r\n };\r\n\r\n this._onPointerMove = (evt: IMouseEvent) => {\r\n this._updatePointerPosition(evt as IPointerEvent);\r\n\r\n // Check if pointer leaves DragMovementThreshold range to determine if swipe is occurring\r\n if (!this._isSwiping && this._swipeButtonPressed !== -1) {\r\n this._isSwiping =\r\n Math.abs(this._startingPointerPosition.x - this._pointerX) > InputManager.DragMovementThreshold ||\r\n Math.abs(this._startingPointerPosition.y - this._pointerY) > InputManager.DragMovementThreshold;\r\n }\r\n\r\n // Because there's a race condition between pointermove and pointerlockchange events, we need to\r\n // verify that the pointer is still locked after each pointermove event.\r\n if (engine.isPointerLock) {\r\n engine._verifyPointerLock();\r\n }\r\n\r\n // PreObservable support\r\n if (\r\n this._checkPrePointerObservable(\r\n null,\r\n evt as IPointerEvent,\r\n evt.inputIndex >= PointerInput.MouseWheelX && evt.inputIndex <= PointerInput.MouseWheelZ ? PointerEventTypes.POINTERWHEEL : PointerEventTypes.POINTERMOVE\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n if (!scene.cameraToUseForPointers && !scene.activeCamera) {\r\n return;\r\n }\r\n\r\n if (scene.skipPointerMovePicking) {\r\n this._processPointerMove(new PickingInfo(), evt as IPointerEvent);\r\n return;\r\n }\r\n\r\n if (!scene.pointerMovePredicate) {\r\n scene.pointerMovePredicate = (mesh: AbstractMesh): boolean =>\r\n mesh.isPickable &&\r\n mesh.isVisible &&\r\n mesh.isReady() &&\r\n mesh.isEnabled() &&\r\n (mesh.enablePointerMoveEvents || scene.constantlyUpdateMeshUnderPointer || mesh._getActionManagerForTrigger() !== null) &&\r\n (!scene.cameraToUseForPointers || (scene.cameraToUseForPointers.layerMask & mesh.layerMask) !== 0);\r\n }\r\n\r\n const pickResult = scene._registeredActions > 0 || scene.constantlyUpdateMeshUnderPointer ? this._pickMove(evt as IPointerEvent) : null;\r\n this._processPointerMove(pickResult, evt as IPointerEvent);\r\n };\r\n\r\n this._onPointerDown = (evt: IPointerEvent) => {\r\n this._totalPointersPressed++;\r\n this._pickedDownMesh = null;\r\n this._meshPickProceed = false;\r\n\r\n // If ExclusiveDoubleClickMode is true, we need to resolve any pending delayed clicks\r\n if (InputManager.ExclusiveDoubleClickMode) {\r\n for (let i = 0; i < this._delayedClicks.length; i++) {\r\n if (this._delayedClicks[i]) {\r\n // If the button that was pressed is the same as the one that was released,\r\n // just clear the timer. This will be resolved in the up event.\r\n if (evt.button === i) {\r\n clearTimeout(this._delayedClicks[i]?.timeoutId);\r\n } else {\r\n // Otherwise, we need to resolve the click\r\n const clickInfo = this._delayedClicks[i]!.clickInfo;\r\n this._doubleClickOccured = false;\r\n clickInfo.singleClick = true;\r\n clickInfo.ignore = false;\r\n\r\n const prevEvt = this._delayedClicks[i]!.evt;\r\n const type = PointerEventTypes.POINTERTAP;\r\n const pi = new PointerInfo(type, prevEvt, this._currentPickResult);\r\n if (scene.onPointerObservable.hasObservers() && scene.onPointerObservable.hasSpecificMask(type)) {\r\n scene.onPointerObservable.notifyObservers(pi, type);\r\n }\r\n\r\n // Clear the delayed click\r\n this._delayedClicks[i] = null;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._updatePointerPosition(evt);\r\n\r\n if (this._swipeButtonPressed === -1) {\r\n this._swipeButtonPressed = evt.button;\r\n }\r\n\r\n if (scene.preventDefaultOnPointerDown && elementToAttachTo) {\r\n evt.preventDefault();\r\n elementToAttachTo.focus();\r\n }\r\n\r\n this._startingPointerPosition.x = this._pointerX;\r\n this._startingPointerPosition.y = this._pointerY;\r\n this._startingPointerTime = Date.now();\r\n\r\n // PreObservable support\r\n if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERDOWN)) {\r\n return;\r\n }\r\n\r\n if (!scene.cameraToUseForPointers && !scene.activeCamera) {\r\n return;\r\n }\r\n\r\n this._pointerCaptures[evt.pointerId] = true;\r\n\r\n if (!scene.pointerDownPredicate) {\r\n scene.pointerDownPredicate = (mesh: AbstractMesh): boolean => {\r\n return (\r\n mesh.isPickable &&\r\n mesh.isVisible &&\r\n mesh.isReady() &&\r\n mesh.isEnabled() &&\r\n (!scene.cameraToUseForPointers || (scene.cameraToUseForPointers.layerMask & mesh.layerMask) !== 0)\r\n );\r\n };\r\n }\r\n\r\n // Meshes\r\n this._pickedDownMesh = null;\r\n let pickResult;\r\n if (scene.skipPointerDownPicking || (scene._registeredActions === 0 && !this._checkForPicking() && !scene.onPointerDown)) {\r\n pickResult = new PickingInfo();\r\n } else {\r\n pickResult = scene.pick(\r\n this._unTranslatedPointerX,\r\n this._unTranslatedPointerY,\r\n scene.pointerDownPredicate,\r\n scene.pointerDownFastCheck,\r\n scene.cameraToUseForPointers,\r\n scene.pointerDownTrianglePredicate\r\n );\r\n }\r\n\r\n this._processPointerDown(pickResult, evt);\r\n };\r\n\r\n this._onPointerUp = (evt: IPointerEvent) => {\r\n if (this._totalPointersPressed === 0) {\r\n // We are attaching the pointer up to windows because of a bug in FF\r\n return; // So we need to test it the pointer down was pressed before.\r\n }\r\n\r\n this._totalPointersPressed--;\r\n this._pickedUpMesh = null;\r\n this._meshPickProceed = false;\r\n\r\n this._updatePointerPosition(evt);\r\n\r\n if (scene.preventDefaultOnPointerUp && elementToAttachTo) {\r\n evt.preventDefault();\r\n elementToAttachTo.focus();\r\n }\r\n\r\n this._initClickEvent(scene.onPrePointerObservable, scene.onPointerObservable, evt, (clickInfo: _ClickInfo, pickResult: Nullable) => {\r\n // PreObservable support\r\n if (scene.onPrePointerObservable.hasObservers()) {\r\n this._skipPointerTap = false;\r\n if (!clickInfo.ignore) {\r\n if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERUP)) {\r\n // If we're skipping the next observable, we need to reset the swipe state before returning\r\n if (this._swipeButtonPressed === evt.button) {\r\n this._isSwiping = false;\r\n this._swipeButtonPressed = -1;\r\n }\r\n\r\n // If we're going to skip the POINTERUP, we need to reset the pointer capture\r\n if (evt.buttons === 0) {\r\n this._pointerCaptures[evt.pointerId] = false;\r\n }\r\n\r\n return;\r\n }\r\n if (!clickInfo.hasSwiped) {\r\n if (clickInfo.singleClick && scene.onPrePointerObservable.hasSpecificMask(PointerEventTypes.POINTERTAP)) {\r\n if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERTAP)) {\r\n this._skipPointerTap = true;\r\n }\r\n }\r\n if (clickInfo.doubleClick && scene.onPrePointerObservable.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP)) {\r\n if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERDOUBLETAP)) {\r\n this._skipPointerTap = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // There should be a pointer captured at this point so if there isn't we should reset and return\r\n if (!this._pointerCaptures[evt.pointerId]) {\r\n if (this._swipeButtonPressed === evt.button) {\r\n this._isSwiping = false;\r\n this._swipeButtonPressed = -1;\r\n }\r\n return;\r\n }\r\n\r\n // Only release capture if all buttons are released\r\n if (evt.buttons === 0) {\r\n this._pointerCaptures[evt.pointerId] = false;\r\n }\r\n if (!scene.cameraToUseForPointers && !scene.activeCamera) {\r\n return;\r\n }\r\n\r\n if (!scene.pointerUpPredicate) {\r\n scene.pointerUpPredicate = (mesh: AbstractMesh): boolean => {\r\n return (\r\n mesh.isPickable &&\r\n mesh.isVisible &&\r\n mesh.isReady() &&\r\n mesh.isEnabled() &&\r\n (!scene.cameraToUseForPointers || (scene.cameraToUseForPointers.layerMask & mesh.layerMask) !== 0)\r\n );\r\n };\r\n }\r\n\r\n // Meshes\r\n if (!this._meshPickProceed && ((AbstractActionManager && AbstractActionManager.HasTriggers) || this._checkForPicking() || scene.onPointerUp)) {\r\n this._initActionManager(null, clickInfo);\r\n }\r\n if (!pickResult) {\r\n pickResult = this._currentPickResult;\r\n }\r\n\r\n this._processPointerUp(pickResult, evt, clickInfo);\r\n\r\n this._previousPickResult = this._currentPickResult;\r\n\r\n if (this._swipeButtonPressed === evt.button) {\r\n this._isSwiping = false;\r\n this._swipeButtonPressed = -1;\r\n }\r\n });\r\n };\r\n\r\n this._onKeyDown = (evt: IKeyboardEvent) => {\r\n const type = KeyboardEventTypes.KEYDOWN;\r\n if (scene.onPreKeyboardObservable.hasObservers()) {\r\n const pi = new KeyboardInfoPre(type, evt);\r\n scene.onPreKeyboardObservable.notifyObservers(pi, type);\r\n if (pi.skipOnKeyboardObservable) {\r\n return;\r\n }\r\n }\r\n\r\n if (scene.onKeyboardObservable.hasObservers()) {\r\n const pi = new KeyboardInfo(type, evt);\r\n scene.onKeyboardObservable.notifyObservers(pi, type);\r\n }\r\n\r\n if (scene.actionManager) {\r\n scene.actionManager.processTrigger(Constants.ACTION_OnKeyDownTrigger, ActionEvent.CreateNewFromScene(scene, evt));\r\n }\r\n };\r\n\r\n this._onKeyUp = (evt: IKeyboardEvent) => {\r\n const type = KeyboardEventTypes.KEYUP;\r\n if (scene.onPreKeyboardObservable.hasObservers()) {\r\n const pi = new KeyboardInfoPre(type, evt);\r\n scene.onPreKeyboardObservable.notifyObservers(pi, type);\r\n if (pi.skipOnKeyboardObservable) {\r\n return;\r\n }\r\n }\r\n\r\n if (scene.onKeyboardObservable.hasObservers()) {\r\n const pi = new KeyboardInfo(type, evt);\r\n scene.onKeyboardObservable.notifyObservers(pi, type);\r\n }\r\n\r\n if (scene.actionManager) {\r\n scene.actionManager.processTrigger(Constants.ACTION_OnKeyUpTrigger, ActionEvent.CreateNewFromScene(scene, evt));\r\n }\r\n };\r\n\r\n // If a device connects that we can handle, wire up the observable\r\n this._deviceSourceManager.onDeviceConnectedObservable.add((deviceSource) => {\r\n if (deviceSource.deviceType === DeviceType.Mouse) {\r\n deviceSource.onInputChangedObservable.add((eventData) => {\r\n if (\r\n eventData.inputIndex === PointerInput.LeftClick ||\r\n eventData.inputIndex === PointerInput.MiddleClick ||\r\n eventData.inputIndex === PointerInput.RightClick ||\r\n eventData.inputIndex === PointerInput.BrowserBack ||\r\n eventData.inputIndex === PointerInput.BrowserForward\r\n ) {\r\n if (attachDown && deviceSource.getInput(eventData.inputIndex) === 1) {\r\n this._onPointerDown(eventData);\r\n } else if (attachUp && deviceSource.getInput(eventData.inputIndex) === 0) {\r\n this._onPointerUp(eventData);\r\n }\r\n } else if (attachMove) {\r\n if (eventData.inputIndex === PointerInput.Move) {\r\n this._onPointerMove(eventData);\r\n } else if (\r\n eventData.inputIndex === PointerInput.MouseWheelX ||\r\n eventData.inputIndex === PointerInput.MouseWheelY ||\r\n eventData.inputIndex === PointerInput.MouseWheelZ\r\n ) {\r\n this._onPointerMove(eventData);\r\n }\r\n }\r\n });\r\n } else if (deviceSource.deviceType === DeviceType.Touch) {\r\n deviceSource.onInputChangedObservable.add((eventData) => {\r\n if (eventData.inputIndex === PointerInput.LeftClick) {\r\n if (attachDown && deviceSource.getInput(eventData.inputIndex) === 1) {\r\n this._onPointerDown(eventData);\r\n if (this._totalPointersPressed > 1) {\r\n this._isMultiTouchGesture = true;\r\n }\r\n } else if (attachUp && deviceSource.getInput(eventData.inputIndex) === 0) {\r\n this._onPointerUp(eventData);\r\n if (this._totalPointersPressed === 0) {\r\n this._isMultiTouchGesture = false;\r\n }\r\n }\r\n }\r\n\r\n if (attachMove && eventData.inputIndex === PointerInput.Move) {\r\n this._onPointerMove(eventData);\r\n }\r\n });\r\n } else if (deviceSource.deviceType === DeviceType.Keyboard) {\r\n deviceSource.onInputChangedObservable.add((eventData) => {\r\n if (eventData.type === \"keydown\") {\r\n this._onKeyDown(eventData);\r\n } else if (eventData.type === \"keyup\") {\r\n this._onKeyUp(eventData);\r\n }\r\n });\r\n }\r\n });\r\n\r\n this._alreadyAttached = true;\r\n }\r\n\r\n /**\r\n * Detaches all event handlers\r\n */\r\n public detachControl() {\r\n if (this._alreadyAttached) {\r\n this._deviceSourceManager!.dispose();\r\n this._deviceSourceManager = null;\r\n\r\n // Cursor\r\n if (this._alreadyAttachedTo && !this._scene.doNotHandleCursors) {\r\n this._alreadyAttachedTo.style.cursor = this._scene.defaultCursor;\r\n }\r\n\r\n this._alreadyAttached = false;\r\n this._alreadyAttachedTo = null;\r\n }\r\n }\r\n\r\n /**\r\n * Force the value of meshUnderPointer\r\n * @param mesh - defines the mesh to use\r\n * @param pointerId - optional pointer id when using more than one pointer. Defaults to 0\r\n * @param pickResult - optional pickingInfo data used to find mesh\r\n * @param evt - optional pointer event\r\n */\r\n public setPointerOverMesh(mesh: Nullable, pointerId: number = 0, pickResult?: Nullable, evt?: IPointerEvent): void {\r\n if (this._meshUnderPointerId[pointerId] === mesh && (!mesh || !mesh._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting)) {\r\n return;\r\n }\r\n\r\n const underPointerMesh = this._meshUnderPointerId[pointerId];\r\n\r\n let actionManager: Nullable;\r\n if (underPointerMesh) {\r\n actionManager = underPointerMesh._getActionManagerForTrigger(Constants.ACTION_OnPointerOutTrigger);\r\n if (actionManager) {\r\n actionManager.processTrigger(Constants.ACTION_OnPointerOutTrigger, ActionEvent.CreateNew(underPointerMesh, evt, { pointerId }));\r\n }\r\n }\r\n\r\n if (mesh) {\r\n this._meshUnderPointerId[pointerId] = mesh;\r\n this._pointerOverMesh = mesh;\r\n\r\n actionManager = mesh._getActionManagerForTrigger(Constants.ACTION_OnPointerOverTrigger);\r\n if (actionManager) {\r\n actionManager.processTrigger(Constants.ACTION_OnPointerOverTrigger, ActionEvent.CreateNew(mesh, evt, { pointerId, pickResult }));\r\n }\r\n } else {\r\n delete this._meshUnderPointerId[pointerId];\r\n this._pointerOverMesh = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the mesh under the pointer\r\n * @returns a Mesh or null if no mesh is under the pointer\r\n */\r\n public getPointerOverMesh(): Nullable {\r\n return this.meshUnderPointer;\r\n }\r\n\r\n /**\r\n * @param mesh - Mesh to invalidate\r\n * @internal\r\n */\r\n public _invalidateMesh(mesh: AbstractMesh) {\r\n if (this._pointerOverMesh === mesh) {\r\n this._pointerOverMesh = null;\r\n }\r\n if (this._pickedDownMesh === mesh) {\r\n this._pickedDownMesh = null;\r\n }\r\n if (this._pickedUpMesh === mesh) {\r\n this._pickedUpMesh = null;\r\n }\r\n for (const pointerId in this._meshUnderPointerId) {\r\n if (this._meshUnderPointerId[pointerId] === mesh) {\r\n delete this._meshUnderPointerId[pointerId];\r\n }\r\n }\r\n }\r\n}\r\n", "/**\r\n * Helper class used to generate session unique ID\r\n */\r\nexport class UniqueIdGenerator {\r\n // Statics\r\n private static _UniqueIdCounter = 1;\r\n\r\n /**\r\n * Gets an unique (relatively to the current scene) Id\r\n */\r\n public static get UniqueId() {\r\n const result = this._UniqueIdCounter;\r\n this._UniqueIdCounter++;\r\n return result;\r\n }\r\n}\r\n", "/** Defines the cross module constantsused by lights to avoid circular dependencies */\r\nexport class LightConstants {\r\n /**\r\n * Falloff Default: light is falling off following the material specification:\r\n * standard material is using standard falloff whereas pbr material can request special falloff per materials.\r\n */\r\n public static readonly FALLOFF_DEFAULT = 0;\r\n\r\n /**\r\n * Falloff Physical: light is falling off following the inverse squared distance law.\r\n */\r\n public static readonly FALLOFF_PHYSICAL = 1;\r\n\r\n /**\r\n * Falloff gltf: light is falling off as described in the gltf moving to PBR document\r\n * to enhance interoperability with other engines.\r\n */\r\n public static readonly FALLOFF_GLTF = 2;\r\n\r\n /**\r\n * Falloff Standard: light is falling off like in the standard material\r\n * to enhance interoperability with other materials.\r\n */\r\n public static readonly FALLOFF_STANDARD = 3;\r\n\r\n //lightmapMode Consts\r\n /**\r\n * If every light affecting the material is in this lightmapMode,\r\n * material.lightmapTexture adds or multiplies\r\n * (depends on material.useLightmapAsShadowmap)\r\n * after every other light calculations.\r\n */\r\n public static readonly LIGHTMAP_DEFAULT = 0;\r\n /**\r\n * material.lightmapTexture as only diffuse lighting from this light\r\n * adds only specular lighting from this light\r\n * adds dynamic shadows\r\n */\r\n public static readonly LIGHTMAP_SPECULAR = 1;\r\n /**\r\n * material.lightmapTexture as only lighting\r\n * no light calculation from this light\r\n * only adds dynamic shadows from this light\r\n */\r\n public static readonly LIGHTMAP_SHADOWSONLY = 2;\r\n\r\n // Intensity Mode Consts\r\n /**\r\n * Each light type uses the default quantity according to its type:\r\n * point/spot lights use luminous intensity\r\n * directional lights use illuminance\r\n */\r\n public static readonly INTENSITYMODE_AUTOMATIC = 0;\r\n /**\r\n * lumen (lm)\r\n */\r\n public static readonly INTENSITYMODE_LUMINOUSPOWER = 1;\r\n /**\r\n * candela (lm/sr)\r\n */\r\n public static readonly INTENSITYMODE_LUMINOUSINTENSITY = 2;\r\n /**\r\n * lux (lm/m^2)\r\n */\r\n public static readonly INTENSITYMODE_ILLUMINANCE = 3;\r\n /**\r\n * nit (cd/m^2)\r\n */\r\n public static readonly INTENSITYMODE_LUMINANCE = 4;\r\n\r\n // Light types ids const.\r\n /**\r\n * Light type const id of the point light.\r\n */\r\n public static readonly LIGHTTYPEID_POINTLIGHT = 0;\r\n /**\r\n * Light type const id of the directional light.\r\n */\r\n public static readonly LIGHTTYPEID_DIRECTIONALLIGHT = 1;\r\n /**\r\n * Light type const id of the spot light.\r\n */\r\n public static readonly LIGHTTYPEID_SPOTLIGHT = 2;\r\n /**\r\n * Light type const id of the hemispheric light.\r\n */\r\n public static readonly LIGHTTYPEID_HEMISPHERICLIGHT = 3;\r\n\r\n /**\r\n * Sort function to order lights for rendering.\r\n * @param a First Light object to compare to second.\r\n * @param b Second Light object to compare first.\r\n * @returns -1 to reduce's a's index relative to be, 0 for no change, 1 to increase a's index relative to b.\r\n */\r\n public static CompareLightsPriority(a: ISortableLight, b: ISortableLight): number {\r\n //shadow-casting lights have priority over non-shadow-casting lights\r\n //the renderPriority is a secondary sort criterion\r\n if (a.shadowEnabled !== b.shadowEnabled) {\r\n return (b.shadowEnabled ? 1 : 0) - (a.shadowEnabled ? 1 : 0);\r\n }\r\n return b.renderPriority - a.renderPriority;\r\n }\r\n}\r\n\r\n/**\r\n * Defines the common interface of sortable lights\r\n */\r\nexport interface ISortableLight {\r\n /**\r\n * Gets or sets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching\r\n * the current shadow generator.\r\n */\r\n shadowEnabled: boolean;\r\n /**\r\n * Defines the rendering priority of the lights. It can help in case of fallback or number of lights\r\n * exceeding the number allowed of the materials.\r\n */\r\n renderPriority: number;\r\n}\r\n", "import type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\n\r\n/**\r\n * Class used to store configuration data associated with pointer picking\r\n */\r\nexport class PointerPickingConfiguration {\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer down event\r\n */\r\n public pointerDownPredicate: (Mesh: AbstractMesh) => boolean;\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer up event\r\n */\r\n public pointerUpPredicate: (Mesh: AbstractMesh) => boolean;\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer move event\r\n */\r\n public pointerMovePredicate: (Mesh: AbstractMesh) => boolean;\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer down event\r\n */\r\n public pointerDownFastCheck = false;\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer up event\r\n */\r\n public pointerUpFastCheck = false;\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer move event\r\n */\r\n public pointerMoveFastCheck = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer move event occurs.\r\n */\r\n public skipPointerMovePicking = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer down event occurs.\r\n */\r\n public skipPointerDownPicking = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer up event occurs. Off by default.\r\n */\r\n public skipPointerUpPicking = false;\r\n}\r\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Nullable } from \"./types\";\r\nimport { Tools } from \"./Misc/tools\";\r\nimport type { IAnimatable } from \"./Animations/animatable.interface\";\r\nimport { PrecisionDate } from \"./Misc/precisionDate\";\r\nimport type { Observer } from \"./Misc/observable\";\r\nimport { Observable } from \"./Misc/observable\";\r\nimport type { ISmartArrayLike } from \"./Misc/smartArray\";\r\nimport { SmartArrayNoDuplicate, SmartArray } from \"./Misc/smartArray\";\r\nimport { StringDictionary } from \"./Misc/stringDictionary\";\r\nimport { Tags } from \"./Misc/tags\";\r\nimport type { Vector2, Vector4 } from \"./Maths/math.vector\";\r\nimport { Vector3, Matrix, TmpVectors } from \"./Maths/math.vector\";\r\nimport type { IParticleSystem } from \"./Particles/IParticleSystem\";\r\nimport { AbstractScene } from \"./abstractScene\";\r\nimport { ImageProcessingConfiguration } from \"./Materials/imageProcessingConfiguration\";\r\nimport { UniformBuffer } from \"./Materials/uniformBuffer\";\r\nimport { PickingInfo } from \"./Collisions/pickingInfo\";\r\nimport type { ICollisionCoordinator } from \"./Collisions/collisionCoordinator\";\r\nimport type { PointerEventTypes, PointerInfoPre, PointerInfo } from \"./Events/pointerEvents\";\r\nimport type { KeyboardInfoPre, KeyboardInfo } from \"./Events/keyboardEvents\";\r\nimport { ActionEvent } from \"./Actions/actionEvent\";\r\nimport { PostProcessManager } from \"./PostProcesses/postProcessManager\";\r\nimport type { IOfflineProvider } from \"./Offline/IOfflineProvider\";\r\nimport type { RenderingGroupInfo, IRenderingManagerAutoClearSetup } from \"./Rendering/renderingManager\";\r\nimport { RenderingManager } from \"./Rendering/renderingManager\";\r\nimport type {\r\n ISceneComponent,\r\n ISceneSerializableComponent,\r\n SimpleStageAction,\r\n RenderTargetsStageAction,\r\n RenderTargetStageAction,\r\n MeshStageAction,\r\n EvaluateSubMeshStageAction,\r\n PreActiveMeshStageAction,\r\n CameraStageAction,\r\n RenderingGroupStageAction,\r\n RenderingMeshStageAction,\r\n PointerMoveStageAction,\r\n PointerUpDownStageAction,\r\n CameraStageFrameBufferAction,\r\n} from \"./sceneComponent\";\r\nimport { Stage } from \"./sceneComponent\";\r\nimport type { Engine } from \"./Engines/engine\";\r\nimport { Constants } from \"./Engines/constants\";\r\nimport { IsWindowObjectExist } from \"./Misc/domManagement\";\r\nimport { EngineStore } from \"./Engines/engineStore\";\r\nimport type { AbstractActionManager } from \"./Actions/abstractActionManager\";\r\nimport { _WarnImport } from \"./Misc/devTools\";\r\nimport type { WebRequest } from \"./Misc/webRequest\";\r\nimport { InputManager } from \"./Inputs/scene.inputManager\";\r\nimport { PerfCounter } from \"./Misc/perfCounter\";\r\nimport type { IFileRequest } from \"./Misc/fileRequest\";\r\nimport { Color4, Color3 } from \"./Maths/math.color\";\r\nimport type { Plane } from \"./Maths/math.plane\";\r\nimport { Frustum } from \"./Maths/math.frustum\";\r\nimport { UniqueIdGenerator } from \"./Misc/uniqueIdGenerator\";\r\nimport type { LoadFileError, RequestFileError, ReadFileError } from \"./Misc/fileTools\";\r\nimport { ReadFile, RequestFile, LoadFile } from \"./Misc/fileTools\";\r\nimport type { IClipPlanesHolder } from \"./Misc/interfaces/iClipPlanesHolder\";\r\nimport type { IPointerEvent } from \"./Events/deviceInputEvents\";\r\nimport { LightConstants } from \"./Lights/lightConstants\";\r\nimport { _ObserveArray } from \"./Misc/arrayTools\";\r\nimport type { IAction } from \"./Actions/action\";\r\nimport type { AnimationPropertiesOverride } from \"./Animations/animationPropertiesOverride\";\r\nimport type { AnimationGroup } from \"./Animations/animationGroup\";\r\nimport type { Skeleton } from \"./Bones/skeleton\";\r\nimport type { Bone } from \"./Bones/bone\";\r\nimport type { Camera } from \"./Cameras/camera\";\r\nimport type { Collider } from \"./Collisions/collider\";\r\nimport type { Ray, TrianglePickingPredicate } from \"./Culling/ray\";\r\nimport type { Light } from \"./Lights/light\";\r\nimport type { PerformanceViewerCollector } from \"./Misc/PerformanceViewer/performanceViewerCollector\";\r\nimport type { MorphTarget } from \"./Morph/morphTarget\";\r\nimport type { MorphTargetManager } from \"./Morph/morphTargetManager\";\r\nimport type { PostProcess } from \"./PostProcesses/postProcess\";\r\nimport type { Material } from \"./Materials/material\";\r\nimport type { BaseTexture } from \"./Materials/Textures/baseTexture\";\r\nimport type { Geometry } from \"./Meshes/geometry\";\r\nimport type { TransformNode } from \"./Meshes/transformNode\";\r\nimport type { AbstractMesh } from \"./Meshes/abstractMesh\";\r\nimport type { MultiMaterial } from \"./Materials/multiMaterial\";\r\nimport type { Effect } from \"./Materials/effect\";\r\nimport type { RenderTargetTexture } from \"./Materials/Textures/renderTargetTexture\";\r\nimport type { Mesh } from \"./Meshes/mesh\";\r\nimport type { SubMesh } from \"./Meshes/subMesh\";\r\nimport type { Node } from \"./node\";\r\nimport type { Animation } from \"./Animations/animation\";\r\nimport type { Animatable } from \"./Animations/animatable\";\r\nimport type { Texture } from \"./Materials/Textures/texture\";\r\nimport { PointerPickingConfiguration } from \"./Inputs/pointerPickingConfiguration\";\r\nimport { Logger } from \"./Misc/logger\";\r\n\r\n/**\r\n * Define an interface for all classes that will hold resources\r\n */\r\nexport interface IDisposable {\r\n /**\r\n * Releases all held resources\r\n */\r\n dispose(): void;\r\n}\r\n\r\n/** Interface defining initialization parameters for Scene class */\r\nexport interface SceneOptions {\r\n /**\r\n * Defines that scene should keep up-to-date a map of geometry to enable fast look-up by uniqueId\r\n * It will improve performance when the number of geometries becomes important.\r\n */\r\n useGeometryUniqueIdsMap?: boolean;\r\n\r\n /**\r\n * Defines that each material of the scene should keep up-to-date a map of referencing meshes for fast disposing\r\n * It will improve performance when the number of mesh becomes important, but might consume a bit more memory\r\n */\r\n useMaterialMeshMap?: boolean;\r\n\r\n /**\r\n * Defines that each mesh of the scene should keep up-to-date a map of referencing cloned meshes for fast disposing\r\n * It will improve performance when the number of mesh becomes important, but might consume a bit more memory\r\n */\r\n useClonedMeshMap?: boolean;\r\n\r\n /** Defines if the creation of the scene should impact the engine (Eg. UtilityLayer's scene) */\r\n virtual?: boolean;\r\n}\r\n\r\n/**\r\n * Define how the scene should favor performance over ease of use\r\n */\r\nexport enum ScenePerformancePriority {\r\n /** Default mode. No change. Performance will be treated as less important than backward compatibility */\r\n BackwardCompatible,\r\n /** Some performance options will be turned on trying to strike a balance between perf and ease of use */\r\n Intermediate,\r\n /** Performance will be top priority */\r\n Aggressive,\r\n}\r\n\r\n/**\r\n * Represents a scene to be rendered by the engine.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene\r\n */\r\nexport class Scene extends AbstractScene implements IAnimatable, IClipPlanesHolder {\r\n /** The fog is deactivated */\r\n public static readonly FOGMODE_NONE = Constants.FOGMODE_NONE;\r\n /** The fog density is following an exponential function */\r\n public static readonly FOGMODE_EXP = Constants.FOGMODE_EXP;\r\n /** The fog density is following an exponential function faster than FOGMODE_EXP */\r\n public static readonly FOGMODE_EXP2 = Constants.FOGMODE_EXP2;\r\n /** The fog density is following a linear function. */\r\n public static readonly FOGMODE_LINEAR = Constants.FOGMODE_LINEAR;\r\n\r\n /**\r\n * Gets or sets the minimum deltatime when deterministic lock step is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n */\r\n public static MinDeltaTime = 1.0;\r\n /**\r\n * Gets or sets the maximum deltatime when deterministic lock step is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n */\r\n public static MaxDeltaTime = 1000.0;\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Factory used to create the default material.\r\n * @param scene The scene to create the material for\r\n * @returns The default material\r\n */\r\n public static DefaultMaterialFactory(scene: Scene): Material {\r\n throw _WarnImport(\"StandardMaterial\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Factory used to create the a collision coordinator.\r\n * @returns The collision coordinator\r\n */\r\n public static CollisionCoordinatorFactory(): ICollisionCoordinator {\r\n throw _WarnImport(\"DefaultCollisionCoordinator\");\r\n }\r\n\r\n // Members\r\n\r\n /** @internal */\r\n public _inputManager = new InputManager(this);\r\n\r\n /** Define this parameter if you are using multiple cameras and you want to specify which one should be used for pointer position */\r\n public cameraToUseForPointers: Nullable = null;\r\n\r\n /** @internal */\r\n public readonly _isScene = true;\r\n\r\n /** @internal */\r\n public _blockEntityCollection = false;\r\n\r\n /**\r\n * Gets or sets a boolean that indicates if the scene must clear the render buffer before rendering a frame\r\n */\r\n public autoClear = true;\r\n /**\r\n * Gets or sets a boolean that indicates if the scene must clear the depth and stencil buffers before rendering a frame\r\n */\r\n public autoClearDepthAndStencil = true;\r\n /**\r\n * Defines the color used to clear the render buffer (Default is (0.2, 0.2, 0.3, 1.0))\r\n */\r\n public clearColor: Color4 = new Color4(0.2, 0.2, 0.3, 1.0);\r\n /**\r\n * Defines the color used to simulate the ambient color (Default is (0, 0, 0))\r\n */\r\n public ambientColor = new Color3(0, 0, 0);\r\n\r\n /**\r\n * This is use to store the default BRDF lookup for PBR materials in your scene.\r\n * It should only be one of the following (if not the default embedded one):\r\n * * For uncorrelated BRDF (pbr.brdf.useEnergyConservation = false and pbr.brdf.useSmithVisibilityHeightCorrelated = false) : https://assets.babylonjs.com/environments/uncorrelatedBRDF.dds\r\n * * For correlated BRDF (pbr.brdf.useEnergyConservation = false and pbr.brdf.useSmithVisibilityHeightCorrelated = true) : https://assets.babylonjs.com/environments/correlatedBRDF.dds\r\n * * For correlated multi scattering BRDF (pbr.brdf.useEnergyConservation = true and pbr.brdf.useSmithVisibilityHeightCorrelated = true) : https://assets.babylonjs.com/environments/correlatedMSBRDF.dds\r\n * The material properties need to be setup according to the type of texture in use.\r\n */\r\n public environmentBRDFTexture: BaseTexture;\r\n\r\n /**\r\n * Texture used in all pbr material as the reflection texture.\r\n * As in the majority of the scene they are the same (exception for multi room and so on),\r\n * this is easier to reference from here than from all the materials.\r\n */\r\n public get environmentTexture(): Nullable {\r\n return this._environmentTexture;\r\n }\r\n /**\r\n * Texture used in all pbr material as the reflection texture.\r\n * As in the majority of the scene they are the same (exception for multi room and so on),\r\n * this is easier to set here than in all the materials.\r\n */\r\n public set environmentTexture(value: Nullable) {\r\n if (this._environmentTexture === value) {\r\n return;\r\n }\r\n\r\n this._environmentTexture = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Intensity of the environment in all pbr material.\r\n * This dims or reinforces the IBL lighting overall (reflection and diffuse).\r\n * As in the majority of the scene they are the same (exception for multi room and so on),\r\n * this is easier to reference from here than from all the materials.\r\n */\r\n public environmentIntensity: number = 1;\r\n\r\n /** @internal */\r\n protected _imageProcessingConfiguration: ImageProcessingConfiguration;\r\n /**\r\n * Default image processing configuration used either in the rendering\r\n * Forward main pass or through the imageProcessingPostProcess if present.\r\n * As in the majority of the scene they are the same (exception for multi camera),\r\n * this is easier to reference from here than from all the materials and post process.\r\n *\r\n * No setter as we it is a shared configuration, you can set the values instead.\r\n */\r\n public get imageProcessingConfiguration(): ImageProcessingConfiguration {\r\n return this._imageProcessingConfiguration;\r\n }\r\n\r\n private _performancePriority = ScenePerformancePriority.BackwardCompatible;\r\n\r\n /**\r\n * Observable triggered when the performance priority is changed\r\n */\r\n public onScenePerformancePriorityChangedObservable = new Observable();\r\n /**\r\n * Gets or sets a value indicating how to treat performance relatively to ease of use and backward compatibility\r\n */\r\n public get performancePriority() {\r\n return this._performancePriority;\r\n }\r\n\r\n public set performancePriority(value) {\r\n if (value === this._performancePriority) {\r\n return;\r\n }\r\n\r\n this._performancePriority = value;\r\n\r\n switch (value) {\r\n case ScenePerformancePriority.BackwardCompatible:\r\n this.skipFrustumClipping = false;\r\n this._renderingManager.maintainStateBetweenFrames = false;\r\n this.skipPointerMovePicking = false;\r\n this.autoClear = true;\r\n break;\r\n case ScenePerformancePriority.Intermediate:\r\n this.skipFrustumClipping = false;\r\n this._renderingManager.maintainStateBetweenFrames = false;\r\n this.skipPointerMovePicking = true;\r\n this.autoClear = false;\r\n break;\r\n case ScenePerformancePriority.Aggressive:\r\n this.skipFrustumClipping = true;\r\n this._renderingManager.maintainStateBetweenFrames = true;\r\n this.skipPointerMovePicking = true;\r\n this.autoClear = false;\r\n break;\r\n }\r\n\r\n this.onScenePerformancePriorityChangedObservable.notifyObservers(value);\r\n }\r\n\r\n private _forceWireframe = false;\r\n /**\r\n * Gets or sets a boolean indicating if all rendering must be done in wireframe\r\n */\r\n public set forceWireframe(value: boolean) {\r\n if (this._forceWireframe === value) {\r\n return;\r\n }\r\n this._forceWireframe = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_MiscDirtyFlag);\r\n }\r\n public get forceWireframe(): boolean {\r\n return this._forceWireframe;\r\n }\r\n\r\n private _skipFrustumClipping = false;\r\n /**\r\n * Gets or sets a boolean indicating if we should skip the frustum clipping part of the active meshes selection\r\n */\r\n public set skipFrustumClipping(value: boolean) {\r\n if (this._skipFrustumClipping === value) {\r\n return;\r\n }\r\n this._skipFrustumClipping = value;\r\n }\r\n public get skipFrustumClipping(): boolean {\r\n return this._skipFrustumClipping;\r\n }\r\n\r\n private _forcePointsCloud = false;\r\n /**\r\n * Gets or sets a boolean indicating if all rendering must be done in point cloud\r\n */\r\n public set forcePointsCloud(value: boolean) {\r\n if (this._forcePointsCloud === value) {\r\n return;\r\n }\r\n this._forcePointsCloud = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_MiscDirtyFlag);\r\n }\r\n public get forcePointsCloud(): boolean {\r\n return this._forcePointsCloud;\r\n }\r\n\r\n /**\r\n * Gets or sets the active clipplane 1\r\n */\r\n public clipPlane: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 2\r\n */\r\n public clipPlane2: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 3\r\n */\r\n public clipPlane3: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 4\r\n */\r\n public clipPlane4: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 5\r\n */\r\n public clipPlane5: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 6\r\n */\r\n public clipPlane6: Nullable;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if animations are enabled\r\n */\r\n public animationsEnabled = true;\r\n\r\n private _animationPropertiesOverride: Nullable = null;\r\n\r\n /**\r\n * Gets or sets the animation properties override\r\n */\r\n public get animationPropertiesOverride(): Nullable {\r\n return this._animationPropertiesOverride;\r\n }\r\n\r\n public set animationPropertiesOverride(value: Nullable) {\r\n this._animationPropertiesOverride = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if a constant deltatime has to be used\r\n * This is mostly useful for testing purposes when you do not want the animations to scale with the framerate\r\n */\r\n public useConstantAnimationDeltaTime = false;\r\n /**\r\n * Gets or sets a boolean indicating if the scene must keep the meshUnderPointer property updated\r\n * Please note that it requires to run a ray cast through the scene on every frame\r\n */\r\n public constantlyUpdateMeshUnderPointer = false;\r\n\r\n /**\r\n * Defines the HTML cursor to use when hovering over interactive elements\r\n */\r\n public hoverCursor = \"pointer\";\r\n /**\r\n * Defines the HTML default cursor to use (empty by default)\r\n */\r\n public defaultCursor: string = \"\";\r\n /**\r\n * Defines whether cursors are handled by the scene.\r\n */\r\n public doNotHandleCursors = false;\r\n /**\r\n * This is used to call preventDefault() on pointer down\r\n * in order to block unwanted artifacts like system double clicks\r\n */\r\n public preventDefaultOnPointerDown = true;\r\n\r\n /**\r\n * This is used to call preventDefault() on pointer up\r\n * in order to block unwanted artifacts like system double clicks\r\n */\r\n public preventDefaultOnPointerUp = true;\r\n\r\n // Metadata\r\n /**\r\n * Gets or sets user defined metadata\r\n */\r\n public metadata: any = null;\r\n\r\n /**\r\n * For internal use only. Please do not use.\r\n */\r\n public reservedDataStore: any = null;\r\n\r\n /**\r\n * Gets the name of the plugin used to load this scene (null by default)\r\n */\r\n public loadingPluginName: string;\r\n\r\n /**\r\n * Use this array to add regular expressions used to disable offline support for specific urls\r\n */\r\n public disableOfflineSupportExceptionRules: RegExp[] = [];\r\n\r\n /**\r\n * An event triggered when the scene is disposed.\r\n */\r\n public onDisposeObservable = new Observable();\r\n\r\n private _onDisposeObserver: Nullable> = null;\r\n /** Sets a function to be executed when this scene is disposed. */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered before rendering the scene (right after animations and physics)\r\n */\r\n public onBeforeRenderObservable = new Observable();\r\n\r\n private _onBeforeRenderObserver: Nullable> = null;\r\n /** Sets a function to be executed before rendering this scene */\r\n public set beforeRender(callback: Nullable<() => void>) {\r\n if (this._onBeforeRenderObserver) {\r\n this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n }\r\n if (callback) {\r\n this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * An event triggered after rendering the scene\r\n */\r\n public onAfterRenderObservable = new Observable();\r\n\r\n /**\r\n * An event triggered after rendering the scene for an active camera (When scene.render is called this will be called after each camera)\r\n * This is triggered for each \"sub\" camera in a Camera Rig unlike onAfterCameraRenderObservable\r\n */\r\n public onAfterRenderCameraObservable = new Observable();\r\n\r\n private _onAfterRenderObserver: Nullable> = null;\r\n /** Sets a function to be executed after rendering this scene */\r\n public set afterRender(callback: Nullable<() => void>) {\r\n if (this._onAfterRenderObserver) {\r\n this.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n }\r\n\r\n if (callback) {\r\n this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * An event triggered before animating the scene\r\n */\r\n public onBeforeAnimationsObservable = new Observable();\r\n\r\n /**\r\n * An event triggered after animations processing\r\n */\r\n public onAfterAnimationsObservable = new Observable();\r\n\r\n /**\r\n * An event triggered before draw calls are ready to be sent\r\n */\r\n public onBeforeDrawPhaseObservable = new Observable();\r\n\r\n /**\r\n * An event triggered after draw calls have been sent\r\n */\r\n public onAfterDrawPhaseObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when the scene is ready\r\n */\r\n public onReadyObservable = new Observable();\r\n\r\n /**\r\n * An event triggered before rendering a camera\r\n */\r\n public onBeforeCameraRenderObservable = new Observable();\r\n\r\n private _onBeforeCameraRenderObserver: Nullable> = null;\r\n /** Sets a function to be executed before rendering a camera*/\r\n public set beforeCameraRender(callback: () => void) {\r\n if (this._onBeforeCameraRenderObserver) {\r\n this.onBeforeCameraRenderObservable.remove(this._onBeforeCameraRenderObserver);\r\n }\r\n\r\n this._onBeforeCameraRenderObserver = this.onBeforeCameraRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered after rendering a camera\r\n * This is triggered for the full rig Camera only unlike onAfterRenderCameraObservable\r\n */\r\n public onAfterCameraRenderObservable = new Observable();\r\n\r\n private _onAfterCameraRenderObserver: Nullable> = null;\r\n /** Sets a function to be executed after rendering a camera*/\r\n public set afterCameraRender(callback: () => void) {\r\n if (this._onAfterCameraRenderObserver) {\r\n this.onAfterCameraRenderObservable.remove(this._onAfterCameraRenderObserver);\r\n }\r\n this._onAfterCameraRenderObserver = this.onAfterCameraRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when active meshes evaluation is about to start\r\n */\r\n public onBeforeActiveMeshesEvaluationObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when active meshes evaluation is done\r\n */\r\n public onAfterActiveMeshesEvaluationObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when particles rendering is about to start\r\n * Note: This event can be trigger more than once per frame (because particles can be rendered by render target textures as well)\r\n */\r\n public onBeforeParticlesRenderingObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when particles rendering is done\r\n * Note: This event can be trigger more than once per frame (because particles can be rendered by render target textures as well)\r\n */\r\n public onAfterParticlesRenderingObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when SceneLoader.Append or SceneLoader.Load or SceneLoader.ImportMesh were successfully executed\r\n */\r\n public onDataLoadedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a camera is created\r\n */\r\n public onNewCameraAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a camera is removed\r\n */\r\n public onCameraRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a light is created\r\n */\r\n public onNewLightAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a light is removed\r\n */\r\n public onLightRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a geometry is created\r\n */\r\n public onNewGeometryAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a geometry is removed\r\n */\r\n public onGeometryRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a transform node is created\r\n */\r\n public onNewTransformNodeAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a transform node is removed\r\n */\r\n public onTransformNodeRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a mesh is created\r\n */\r\n public onNewMeshAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a mesh is removed\r\n */\r\n public onMeshRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a skeleton is created\r\n */\r\n public onNewSkeletonAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a skeleton is removed\r\n */\r\n public onSkeletonRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a material is created\r\n */\r\n public onNewMaterialAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a multi material is created\r\n */\r\n public onNewMultiMaterialAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a material is removed\r\n */\r\n public onMaterialRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a multi material is removed\r\n */\r\n public onMultiMaterialRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a texture is created\r\n */\r\n public onNewTextureAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a texture is removed\r\n */\r\n public onTextureRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when render targets are about to be rendered\r\n * Can happen multiple times per frame.\r\n */\r\n public onBeforeRenderTargetsRenderObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when render targets were rendered.\r\n * Can happen multiple times per frame.\r\n */\r\n public onAfterRenderTargetsRenderObservable = new Observable();\r\n\r\n /**\r\n * An event triggered before calculating deterministic simulation step\r\n */\r\n public onBeforeStepObservable = new Observable();\r\n\r\n /**\r\n * An event triggered after calculating deterministic simulation step\r\n */\r\n public onAfterStepObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when the activeCamera property is updated\r\n */\r\n public onActiveCameraChanged = new Observable();\r\n\r\n /**\r\n * An event triggered when the activeCameras property is updated\r\n */\r\n public onActiveCamerasChanged = new Observable();\r\n\r\n /**\r\n * This Observable will be triggered before rendering each renderingGroup of each rendered camera.\r\n * The RenderingGroupInfo class contains all the information about the context in which the observable is called\r\n * If you wish to register an Observer only for a given set of renderingGroup, use the mask with a combination of the renderingGroup index elevated to the power of two (1 for renderingGroup 0, 2 for renderingrOup1, 4 for 2 and 8 for 3)\r\n */\r\n public onBeforeRenderingGroupObservable = new Observable();\r\n\r\n /**\r\n * This Observable will be triggered after rendering each renderingGroup of each rendered camera.\r\n * The RenderingGroupInfo class contains all the information about the context in which the observable is called\r\n * If you wish to register an Observer only for a given set of renderingGroup, use the mask with a combination of the renderingGroup index elevated to the power of two (1 for renderingGroup 0, 2 for renderingrOup1, 4 for 2 and 8 for 3)\r\n */\r\n public onAfterRenderingGroupObservable = new Observable();\r\n\r\n /**\r\n * This Observable will when a mesh has been imported into the scene.\r\n */\r\n public onMeshImportedObservable = new Observable();\r\n\r\n /**\r\n * This Observable will when an animation file has been imported into the scene.\r\n */\r\n public onAnimationFileImportedObservable = new Observable();\r\n\r\n /**\r\n * Gets or sets a user defined funtion to select LOD from a mesh and a camera.\r\n * By default this function is undefined and Babylon.js will select LOD based on distance to camera\r\n */\r\n public customLODSelector: (mesh: AbstractMesh, camera: Camera) => Nullable;\r\n\r\n // Animations\r\n\r\n /** @internal */\r\n public _registeredForLateAnimationBindings = new SmartArrayNoDuplicate(256);\r\n\r\n // Pointers\r\n private _pointerPickingConfiguration = new PointerPickingConfiguration();\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer down event\r\n */\r\n public get pointerDownPredicate() {\r\n return this._pointerPickingConfiguration.pointerDownPredicate;\r\n }\r\n\r\n public set pointerDownPredicate(value) {\r\n this._pointerPickingConfiguration.pointerDownPredicate = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer up event\r\n */\r\n public get pointerUpPredicate() {\r\n return this._pointerPickingConfiguration.pointerUpPredicate;\r\n }\r\n\r\n public set pointerUpPredicate(value) {\r\n this._pointerPickingConfiguration.pointerUpPredicate = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer move event\r\n */\r\n public get pointerMovePredicate() {\r\n return this._pointerPickingConfiguration.pointerMovePredicate;\r\n }\r\n\r\n public set pointerMovePredicate(value) {\r\n this._pointerPickingConfiguration.pointerMovePredicate = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer down event\r\n */\r\n public get pointerDownFastCheck() {\r\n return this._pointerPickingConfiguration.pointerDownFastCheck;\r\n }\r\n\r\n public set pointerDownFastCheck(value) {\r\n this._pointerPickingConfiguration.pointerDownFastCheck = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer up event\r\n */\r\n public get pointerUpFastCheck() {\r\n return this._pointerPickingConfiguration.pointerUpFastCheck;\r\n }\r\n\r\n public set pointerUpFastCheck(value) {\r\n this._pointerPickingConfiguration.pointerUpFastCheck = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer move event\r\n */\r\n public get pointerMoveFastCheck() {\r\n return this._pointerPickingConfiguration.pointerMoveFastCheck;\r\n }\r\n\r\n public set pointerMoveFastCheck(value) {\r\n this._pointerPickingConfiguration.pointerMoveFastCheck = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer move event occurs.\r\n */\r\n public get skipPointerMovePicking() {\r\n return this._pointerPickingConfiguration.skipPointerMovePicking;\r\n }\r\n\r\n public set skipPointerMovePicking(value) {\r\n this._pointerPickingConfiguration.skipPointerMovePicking = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer down event occurs.\r\n */\r\n public get skipPointerDownPicking() {\r\n return this._pointerPickingConfiguration.skipPointerDownPicking;\r\n }\r\n\r\n public set skipPointerDownPicking(value) {\r\n this._pointerPickingConfiguration.skipPointerDownPicking = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer up event occurs. Off by default.\r\n */\r\n public get skipPointerUpPicking() {\r\n return this._pointerPickingConfiguration.skipPointerUpPicking;\r\n }\r\n\r\n public set skipPointerUpPicking(value) {\r\n this._pointerPickingConfiguration.skipPointerUpPicking = value;\r\n }\r\n\r\n /** Callback called when a pointer move is detected */\r\n public onPointerMove?: (evt: IPointerEvent, pickInfo: PickingInfo, type: PointerEventTypes) => void;\r\n /** Callback called when a pointer down is detected */\r\n public onPointerDown?: (evt: IPointerEvent, pickInfo: PickingInfo, type: PointerEventTypes) => void;\r\n /** Callback called when a pointer up is detected */\r\n public onPointerUp?: (evt: IPointerEvent, pickInfo: Nullable, type: PointerEventTypes) => void;\r\n /** Callback called when a pointer pick is detected */\r\n public onPointerPick?: (evt: IPointerEvent, pickInfo: PickingInfo) => void;\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate faces for a pointer move event\r\n */\r\n public pointerMoveTrianglePredicate: ((p0: Vector3, p1: Vector3, p2: Vector3, ray: Ray) => boolean) | undefined;\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate faces for a pointer down event\r\n */\r\n public pointerDownTrianglePredicate: ((p0: Vector3, p1: Vector3, p2: Vector3, ray: Ray) => boolean) | undefined;\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate faces for a pointer up event\r\n */\r\n public pointerUpTrianglePredicate: ((p0: Vector3, p1: Vector3, p2: Vector3, ray: Ray) => boolean) | undefined;\r\n\r\n /**\r\n * This observable event is triggered when any ponter event is triggered. It is registered during Scene.attachControl() and it is called BEFORE the 3D engine process anything (mesh/sprite picking for instance).\r\n * You have the possibility to skip the process and the call to onPointerObservable by setting PointerInfoPre.skipOnPointerObservable to true\r\n */\r\n public onPrePointerObservable = new Observable();\r\n\r\n /**\r\n * Observable event triggered each time an input event is received from the rendering canvas\r\n */\r\n public onPointerObservable = new Observable();\r\n\r\n /**\r\n * Gets the pointer coordinates without any translation (ie. straight out of the pointer event)\r\n */\r\n public get unTranslatedPointer(): Vector2 {\r\n return this._inputManager.unTranslatedPointer;\r\n }\r\n\r\n /**\r\n * Gets or sets the distance in pixel that you have to move to prevent some events. Default is 10 pixels\r\n */\r\n public static get DragMovementThreshold() {\r\n return InputManager.DragMovementThreshold;\r\n }\r\n\r\n public static set DragMovementThreshold(value: number) {\r\n InputManager.DragMovementThreshold = value;\r\n }\r\n\r\n /**\r\n * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 500 ms\r\n */\r\n public static get LongPressDelay() {\r\n return InputManager.LongPressDelay;\r\n }\r\n\r\n public static set LongPressDelay(value: number) {\r\n InputManager.LongPressDelay = value;\r\n }\r\n\r\n /**\r\n * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 300 ms\r\n */\r\n public static get DoubleClickDelay() {\r\n return InputManager.DoubleClickDelay;\r\n }\r\n\r\n public static set DoubleClickDelay(value: number) {\r\n InputManager.DoubleClickDelay = value;\r\n }\r\n\r\n /** If you need to check double click without raising a single click at first click, enable this flag */\r\n public static get ExclusiveDoubleClickMode() {\r\n return InputManager.ExclusiveDoubleClickMode;\r\n }\r\n\r\n public static set ExclusiveDoubleClickMode(value: boolean) {\r\n InputManager.ExclusiveDoubleClickMode = value;\r\n }\r\n\r\n /**\r\n * Bind the current view position to an effect.\r\n * @param effect The effect to be bound\r\n * @param variableName name of the shader variable that will hold the eye position\r\n * @param isVector3 true to indicates that variableName is a Vector3 and not a Vector4\r\n * @returns the computed eye position\r\n */\r\n public bindEyePosition(effect: Nullable, variableName = \"vEyePosition\", isVector3 = false): Vector4 {\r\n const eyePosition = this._forcedViewPosition ? this._forcedViewPosition : this._mirroredCameraPosition ? this._mirroredCameraPosition : this.activeCamera!.globalPosition;\r\n\r\n const invertNormal = this.useRightHandedSystem === (this._mirroredCameraPosition != null);\r\n\r\n TmpVectors.Vector4[0].set(eyePosition.x, eyePosition.y, eyePosition.z, invertNormal ? -1 : 1);\r\n\r\n if (effect) {\r\n if (isVector3) {\r\n effect.setFloat3(variableName, TmpVectors.Vector4[0].x, TmpVectors.Vector4[0].y, TmpVectors.Vector4[0].z);\r\n } else {\r\n effect.setVector4(variableName, TmpVectors.Vector4[0]);\r\n }\r\n }\r\n\r\n return TmpVectors.Vector4[0];\r\n }\r\n\r\n /**\r\n * Update the scene ubo before it can be used in rendering processing\r\n * @returns the scene UniformBuffer\r\n */\r\n public finalizeSceneUbo(): UniformBuffer {\r\n const ubo = this.getSceneUniformBuffer();\r\n const eyePosition = this.bindEyePosition(null);\r\n ubo.updateFloat4(\"vEyePosition\", eyePosition.x, eyePosition.y, eyePosition.z, eyePosition.w);\r\n\r\n ubo.update();\r\n\r\n return ubo;\r\n }\r\n\r\n // Mirror\r\n /** @internal */\r\n public _mirroredCameraPosition: Nullable;\r\n\r\n // Keyboard\r\n\r\n /**\r\n * This observable event is triggered when any keyboard event si raised and registered during Scene.attachControl()\r\n * You have the possibility to skip the process and the call to onKeyboardObservable by setting KeyboardInfoPre.skipOnPointerObservable to true\r\n */\r\n public onPreKeyboardObservable = new Observable();\r\n\r\n /**\r\n * Observable event triggered each time an keyboard event is received from the hosting window\r\n */\r\n public onKeyboardObservable = new Observable();\r\n\r\n // Coordinates system\r\n\r\n private _useRightHandedSystem = false;\r\n /**\r\n * Gets or sets a boolean indicating if the scene must use right-handed coordinates system\r\n */\r\n public set useRightHandedSystem(value: boolean) {\r\n if (this._useRightHandedSystem === value) {\r\n return;\r\n }\r\n this._useRightHandedSystem = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_MiscDirtyFlag);\r\n }\r\n public get useRightHandedSystem(): boolean {\r\n return this._useRightHandedSystem;\r\n }\r\n\r\n // Deterministic lockstep\r\n private _timeAccumulator: number = 0;\r\n private _currentStepId: number = 0;\r\n private _currentInternalStep: number = 0;\r\n\r\n /**\r\n * Sets the step Id used by deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @param newStepId defines the step Id\r\n */\r\n public setStepId(newStepId: number): void {\r\n this._currentStepId = newStepId;\r\n }\r\n\r\n /**\r\n * Gets the step Id used by deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @returns the step Id\r\n */\r\n public getStepId(): number {\r\n return this._currentStepId;\r\n }\r\n\r\n /**\r\n * Gets the internal step used by deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @returns the internal step\r\n */\r\n public getInternalStep(): number {\r\n return this._currentInternalStep;\r\n }\r\n\r\n // Fog\r\n\r\n private _fogEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if fog is enabled on this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\r\n * (Default is true)\r\n */\r\n public set fogEnabled(value: boolean) {\r\n if (this._fogEnabled === value) {\r\n return;\r\n }\r\n this._fogEnabled = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_MiscDirtyFlag);\r\n }\r\n public get fogEnabled(): boolean {\r\n return this._fogEnabled;\r\n }\r\n\r\n private _fogMode = Scene.FOGMODE_NONE;\r\n /**\r\n * Gets or sets the fog mode to use\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\r\n * | mode | value |\r\n * | --- | --- |\r\n * | FOGMODE_NONE | 0 |\r\n * | FOGMODE_EXP | 1 |\r\n * | FOGMODE_EXP2 | 2 |\r\n * | FOGMODE_LINEAR | 3 |\r\n */\r\n public set fogMode(value: number) {\r\n if (this._fogMode === value) {\r\n return;\r\n }\r\n this._fogMode = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_MiscDirtyFlag);\r\n }\r\n public get fogMode(): number {\r\n return this._fogMode;\r\n }\r\n\r\n /**\r\n * Gets or sets the fog color to use\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\r\n * (Default is Color3(0.2, 0.2, 0.3))\r\n */\r\n public fogColor = new Color3(0.2, 0.2, 0.3);\r\n /**\r\n * Gets or sets the fog density to use\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\r\n * (Default is 0.1)\r\n */\r\n public fogDensity = 0.1;\r\n /**\r\n * Gets or sets the fog start distance to use\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\r\n * (Default is 0)\r\n */\r\n public fogStart = 0;\r\n /**\r\n * Gets or sets the fog end distance to use\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\r\n * (Default is 1000)\r\n */\r\n public fogEnd = 1000.0;\r\n\r\n /**\r\n * Flag indicating that the frame buffer binding is handled by another component\r\n */\r\n public get prePass(): boolean {\r\n return !!this.prePassRenderer && this.prePassRenderer.defaultRT.enabled;\r\n }\r\n\r\n /**\r\n * Flag indicating if we need to store previous matrices when rendering\r\n */\r\n public needsPreviousWorldMatrices = false;\r\n\r\n // Lights\r\n private _shadowsEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if shadows are enabled on this scene\r\n */\r\n public set shadowsEnabled(value: boolean) {\r\n if (this._shadowsEnabled === value) {\r\n return;\r\n }\r\n this._shadowsEnabled = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_LightDirtyFlag);\r\n }\r\n public get shadowsEnabled(): boolean {\r\n return this._shadowsEnabled;\r\n }\r\n\r\n private _lightsEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if lights are enabled on this scene\r\n */\r\n public set lightsEnabled(value: boolean) {\r\n if (this._lightsEnabled === value) {\r\n return;\r\n }\r\n this._lightsEnabled = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_LightDirtyFlag);\r\n }\r\n\r\n public get lightsEnabled(): boolean {\r\n return this._lightsEnabled;\r\n }\r\n\r\n private _activeCameras: Nullable;\r\n private _unObserveActiveCameras: Nullable<() => void> = null;\r\n\r\n /** All of the active cameras added to this scene. */\r\n public get activeCameras(): Nullable {\r\n return this._activeCameras;\r\n }\r\n\r\n public set activeCameras(cameras: Nullable) {\r\n if (this._unObserveActiveCameras) {\r\n this._unObserveActiveCameras();\r\n this._unObserveActiveCameras = null;\r\n }\r\n\r\n if (cameras) {\r\n this._unObserveActiveCameras = _ObserveArray(cameras, () => {\r\n this.onActiveCamerasChanged.notifyObservers(this);\r\n });\r\n }\r\n\r\n this._activeCameras = cameras;\r\n }\r\n\r\n /** @internal */\r\n public _activeCamera: Nullable;\r\n /** Gets or sets the current active camera */\r\n public get activeCamera(): Nullable {\r\n return this._activeCamera;\r\n }\r\n\r\n public set activeCamera(value: Nullable) {\r\n if (value === this._activeCamera) {\r\n return;\r\n }\r\n\r\n this._activeCamera = value;\r\n this.onActiveCameraChanged.notifyObservers(this);\r\n }\r\n\r\n private _defaultMaterial: Material;\r\n\r\n /** The default material used on meshes when no material is affected */\r\n public get defaultMaterial(): Material {\r\n if (!this._defaultMaterial) {\r\n this._defaultMaterial = Scene.DefaultMaterialFactory(this);\r\n }\r\n\r\n return this._defaultMaterial;\r\n }\r\n\r\n /** The default material used on meshes when no material is affected */\r\n public set defaultMaterial(value: Material) {\r\n this._defaultMaterial = value;\r\n }\r\n\r\n // Textures\r\n private _texturesEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if textures are enabled on this scene\r\n */\r\n public set texturesEnabled(value: boolean) {\r\n if (this._texturesEnabled === value) {\r\n return;\r\n }\r\n this._texturesEnabled = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n public get texturesEnabled(): boolean {\r\n return this._texturesEnabled;\r\n }\r\n\r\n // Physics\r\n /**\r\n * Gets or sets a boolean indicating if physic engines are enabled on this scene\r\n */\r\n public physicsEnabled = true;\r\n\r\n // Particles\r\n /**\r\n * Gets or sets a boolean indicating if particles are enabled on this scene\r\n */\r\n public particlesEnabled = true;\r\n\r\n // Sprites\r\n /**\r\n * Gets or sets a boolean indicating if sprites are enabled on this scene\r\n */\r\n public spritesEnabled = true;\r\n\r\n // Skeletons\r\n private _skeletonsEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if skeletons are enabled on this scene\r\n */\r\n public set skeletonsEnabled(value: boolean) {\r\n if (this._skeletonsEnabled === value) {\r\n return;\r\n }\r\n this._skeletonsEnabled = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_AttributesDirtyFlag);\r\n }\r\n\r\n public get skeletonsEnabled(): boolean {\r\n return this._skeletonsEnabled;\r\n }\r\n\r\n // Lens flares\r\n /**\r\n * Gets or sets a boolean indicating if lens flares are enabled on this scene\r\n */\r\n public lensFlaresEnabled = true;\r\n\r\n // Collisions\r\n /**\r\n * Gets or sets a boolean indicating if collisions are enabled on this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public collisionsEnabled = true;\r\n\r\n private _collisionCoordinator: ICollisionCoordinator;\r\n\r\n /** @internal */\r\n public get collisionCoordinator(): ICollisionCoordinator {\r\n if (!this._collisionCoordinator) {\r\n this._collisionCoordinator = Scene.CollisionCoordinatorFactory();\r\n this._collisionCoordinator.init(this);\r\n }\r\n\r\n return this._collisionCoordinator;\r\n }\r\n\r\n /**\r\n * Defines the gravity applied to this scene (used only for collisions)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public gravity = new Vector3(0, -9.807, 0);\r\n\r\n // Postprocesses\r\n /**\r\n * Gets or sets a boolean indicating if postprocesses are enabled on this scene\r\n */\r\n public postProcessesEnabled = true;\r\n /**\r\n * Gets the current postprocess manager\r\n */\r\n public postProcessManager: PostProcessManager;\r\n\r\n // Customs render targets\r\n /**\r\n * Gets or sets a boolean indicating if render targets are enabled on this scene\r\n */\r\n public renderTargetsEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if next render targets must be dumped as image for debugging purposes\r\n * We recommend not using it and instead rely on Spector.js: http://spector.babylonjs.com\r\n */\r\n public dumpNextRenderTargets = false;\r\n /**\r\n * The list of user defined render targets added to the scene\r\n */\r\n public customRenderTargets: RenderTargetTexture[] = [];\r\n\r\n /**\r\n * Defines if texture loading must be delayed\r\n * If true, textures will only be loaded when they need to be rendered\r\n */\r\n public useDelayedTextureLoading: boolean;\r\n\r\n /**\r\n * Gets the list of meshes imported to the scene through SceneLoader\r\n */\r\n public importedMeshesFiles: string[] = [];\r\n\r\n // Probes\r\n /**\r\n * Gets or sets a boolean indicating if probes are enabled on this scene\r\n */\r\n public probesEnabled = true;\r\n\r\n // Offline support\r\n /**\r\n * Gets or sets the current offline provider to use to store scene data\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimizeCached\r\n */\r\n public offlineProvider: IOfflineProvider;\r\n\r\n /**\r\n * Gets or sets the action manager associated with the scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions\r\n */\r\n public actionManager: AbstractActionManager;\r\n\r\n private _meshesForIntersections = new SmartArrayNoDuplicate(256);\r\n\r\n // Procedural textures\r\n /**\r\n * Gets or sets a boolean indicating if procedural textures are enabled on this scene\r\n */\r\n public proceduralTexturesEnabled = true;\r\n\r\n // Private\r\n private _engine: Engine;\r\n\r\n // Performance counters\r\n private _totalVertices = new PerfCounter();\r\n /** @internal */\r\n public _activeIndices = new PerfCounter();\r\n /** @internal */\r\n public _activeParticles = new PerfCounter();\r\n /** @internal */\r\n public _activeBones = new PerfCounter();\r\n\r\n private _animationRatio: number;\r\n\r\n /** @internal */\r\n public _animationTimeLast: number;\r\n\r\n /** @internal */\r\n public _animationTime: number = 0;\r\n\r\n /**\r\n * Gets or sets a general scale for animation speed\r\n * @see https://www.babylonjs-playground.com/#IBU2W7#3\r\n */\r\n public animationTimeScale: number = 1;\r\n\r\n /** @internal */\r\n public _cachedMaterial: Nullable;\r\n /** @internal */\r\n public _cachedEffect: Nullable;\r\n /** @internal */\r\n public _cachedVisibility: Nullable;\r\n\r\n private _renderId = 0;\r\n private _frameId = 0;\r\n private _executeWhenReadyTimeoutId: Nullable> = null;\r\n private _intermediateRendering = false;\r\n private _defaultFrameBufferCleared = false;\r\n\r\n private _viewUpdateFlag = -1;\r\n private _projectionUpdateFlag = -1;\r\n\r\n /** @internal */\r\n public _toBeDisposed = new Array>(256);\r\n private _activeRequests = new Array();\r\n\r\n /** @internal */\r\n public _pendingData = new Array();\r\n private _isDisposed = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that all submeshes of active meshes must be rendered\r\n * Use this boolean to avoid computing frustum clipping on submeshes (This could help when you are CPU bound)\r\n */\r\n public dispatchAllSubMeshesOfActiveMeshes: boolean = false;\r\n private _activeMeshes = new SmartArray(256);\r\n private _processedMaterials = new SmartArray(256);\r\n private _renderTargets = new SmartArrayNoDuplicate(256);\r\n private _materialsRenderTargets = new SmartArrayNoDuplicate(256);\r\n /** @internal */\r\n public _activeParticleSystems = new SmartArray(256);\r\n private _activeSkeletons = new SmartArrayNoDuplicate(32);\r\n private _softwareSkinnedMeshes = new SmartArrayNoDuplicate(32);\r\n\r\n private _renderingManager: RenderingManager;\r\n\r\n /**\r\n * Gets the scene's rendering manager\r\n */\r\n public get renderingManager(): RenderingManager {\r\n return this._renderingManager;\r\n }\r\n\r\n /** @internal */\r\n public _activeAnimatables = new Array();\r\n\r\n private _transformMatrix = Matrix.Zero();\r\n private _sceneUbo: UniformBuffer;\r\n\r\n /** @internal */\r\n public _viewMatrix: Matrix;\r\n /** @internal */\r\n public _projectionMatrix: Matrix;\r\n /** @internal */\r\n public _forcedViewPosition: Nullable;\r\n\r\n /** @internal */\r\n public _frustumPlanes: Plane[];\r\n /**\r\n * Gets the list of frustum planes (built from the active camera)\r\n */\r\n public get frustumPlanes(): Plane[] {\r\n return this._frustumPlanes;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if lights must be sorted by priority (off by default)\r\n * This is useful if there are more lights that the maximum simulteanous authorized\r\n */\r\n public requireLightSorting = false;\r\n\r\n /** @internal */\r\n public readonly useMaterialMeshMap: boolean;\r\n /** @internal */\r\n public readonly useClonedMeshMap: boolean;\r\n\r\n private _externalData: StringDictionary;\r\n private _uid: Nullable;\r\n\r\n /**\r\n * @internal\r\n * Backing store of defined scene components.\r\n */\r\n public _components: ISceneComponent[] = [];\r\n\r\n /**\r\n * @internal\r\n * Backing store of defined scene components.\r\n */\r\n public _serializableComponents: ISceneSerializableComponent[] = [];\r\n\r\n /**\r\n * List of components to register on the next registration step.\r\n */\r\n private _transientComponents: ISceneComponent[] = [];\r\n\r\n /**\r\n * Registers the transient components if needed.\r\n */\r\n private _registerTransientComponents(): void {\r\n // Register components that have been associated lately to the scene.\r\n if (this._transientComponents.length > 0) {\r\n for (const component of this._transientComponents) {\r\n component.register();\r\n }\r\n this._transientComponents.length = 0;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Add a component to the scene.\r\n * Note that the ccomponent could be registered on th next frame if this is called after\r\n * the register component stage.\r\n * @param component Defines the component to add to the scene\r\n */\r\n public _addComponent(component: ISceneComponent) {\r\n this._components.push(component);\r\n this._transientComponents.push(component);\r\n\r\n const serializableComponent = component as any;\r\n if (serializableComponent.addFromContainer && serializableComponent.serialize) {\r\n this._serializableComponents.push(serializableComponent);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Gets a component from the scene.\r\n * @param name defines the name of the component to retrieve\r\n * @returns the component or null if not present\r\n */\r\n public _getComponent(name: string): Nullable {\r\n for (const component of this._components) {\r\n if (component.name === name) {\r\n return component;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Defines the actions happening before camera updates.\r\n */\r\n public _beforeCameraUpdateStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening before clear the canvas.\r\n */\r\n public _beforeClearStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening before clear the canvas.\r\n */\r\n public _beforeRenderTargetClearStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions when collecting render targets for the frame.\r\n */\r\n public _gatherRenderTargetsStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening for one camera in the frame.\r\n */\r\n public _gatherActiveCameraRenderTargetsStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening during the per mesh ready checks.\r\n */\r\n public _isReadyForMeshStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening before evaluate active mesh checks.\r\n */\r\n public _beforeEvaluateActiveMeshStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening during the evaluate sub mesh checks.\r\n */\r\n public _evaluateSubMeshStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening during the active mesh stage.\r\n */\r\n public _preActiveMeshStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening during the per camera render target step.\r\n */\r\n public _cameraDrawRenderTargetStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just before the active camera is drawing.\r\n */\r\n public _beforeCameraDrawStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just before a render target is drawing.\r\n */\r\n public _beforeRenderTargetDrawStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just before a rendering group is drawing.\r\n */\r\n public _beforeRenderingGroupDrawStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just before a mesh is drawing.\r\n */\r\n public _beforeRenderingMeshStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just after a mesh has been drawn.\r\n */\r\n public _afterRenderingMeshStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just after a rendering group has been drawn.\r\n */\r\n public _afterRenderingGroupDrawStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just after the active camera has been drawn.\r\n */\r\n public _afterCameraDrawStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just after the post processing\r\n */\r\n public _afterCameraPostProcessStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just after a render target has been drawn.\r\n */\r\n public _afterRenderTargetDrawStage = Stage.Create();\r\n /**\r\n * Defines the actions happening just after the post processing on a render target\r\n */\r\n public _afterRenderTargetPostProcessStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just after rendering all cameras and computing intersections.\r\n */\r\n public _afterRenderStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening when a pointer move event happens.\r\n */\r\n public _pointerMoveStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening when a pointer down event happens.\r\n */\r\n public _pointerDownStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening when a pointer up event happens.\r\n */\r\n public _pointerUpStage = Stage.Create();\r\n\r\n /**\r\n * an optional map from Geometry Id to Geometry index in the 'geometries' array\r\n */\r\n private _geometriesByUniqueId: Nullable<{ [uniqueId: string]: number | undefined }> = null;\r\n\r\n /**\r\n * Creates a new Scene\r\n * @param engine defines the engine to use to render this scene\r\n * @param options defines the scene options\r\n */\r\n constructor(engine: Engine, options?: SceneOptions) {\r\n super();\r\n\r\n this.activeCameras = [] as Camera[];\r\n\r\n const fullOptions = {\r\n useGeometryUniqueIdsMap: true,\r\n useMaterialMeshMap: true,\r\n useClonedMeshMap: true,\r\n virtual: false,\r\n ...options,\r\n };\r\n\r\n engine = this._engine = engine || EngineStore.LastCreatedEngine;\r\n if (fullOptions.virtual) {\r\n engine._virtualScenes.push(this);\r\n } else {\r\n EngineStore._LastCreatedScene = this;\r\n engine.scenes.push(this);\r\n }\r\n\r\n this._uid = null;\r\n\r\n this._renderingManager = new RenderingManager(this);\r\n\r\n if (PostProcessManager) {\r\n this.postProcessManager = new PostProcessManager(this);\r\n }\r\n\r\n if (IsWindowObjectExist()) {\r\n this.attachControl();\r\n }\r\n\r\n // Uniform Buffer\r\n this._createUbo();\r\n\r\n // Default Image processing definition\r\n if (ImageProcessingConfiguration) {\r\n this._imageProcessingConfiguration = new ImageProcessingConfiguration();\r\n }\r\n\r\n this.setDefaultCandidateProviders();\r\n\r\n if (fullOptions.useGeometryUniqueIdsMap) {\r\n this._geometriesByUniqueId = {};\r\n }\r\n\r\n this.useMaterialMeshMap = fullOptions.useMaterialMeshMap;\r\n this.useClonedMeshMap = fullOptions.useClonedMeshMap;\r\n\r\n if (!options || !options.virtual) {\r\n engine.onNewSceneAddedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"Scene\" string\r\n */\r\n public getClassName(): string {\r\n return \"Scene\";\r\n }\r\n\r\n private _defaultMeshCandidates: ISmartArrayLike = {\r\n data: [],\r\n length: 0,\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getDefaultMeshCandidates(): ISmartArrayLike {\r\n this._defaultMeshCandidates.data = this.meshes;\r\n this._defaultMeshCandidates.length = this.meshes.length;\r\n return this._defaultMeshCandidates;\r\n }\r\n\r\n private _defaultSubMeshCandidates: ISmartArrayLike = {\r\n data: [],\r\n length: 0,\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getDefaultSubMeshCandidates(mesh: AbstractMesh): ISmartArrayLike {\r\n this._defaultSubMeshCandidates.data = mesh.subMeshes;\r\n this._defaultSubMeshCandidates.length = mesh.subMeshes.length;\r\n return this._defaultSubMeshCandidates;\r\n }\r\n\r\n /**\r\n * Sets the default candidate providers for the scene.\r\n * This sets the getActiveMeshCandidates, getActiveSubMeshCandidates, getIntersectingSubMeshCandidates\r\n * and getCollidingSubMeshCandidates to their default function\r\n */\r\n public setDefaultCandidateProviders(): void {\r\n this.getActiveMeshCandidates = () => this._getDefaultMeshCandidates();\r\n this.getActiveSubMeshCandidates = (mesh: AbstractMesh) => this._getDefaultSubMeshCandidates(mesh);\r\n this.getIntersectingSubMeshCandidates = (mesh: AbstractMesh, localRay: Ray) => this._getDefaultSubMeshCandidates(mesh);\r\n this.getCollidingSubMeshCandidates = (mesh: AbstractMesh, collider: Collider) => this._getDefaultSubMeshCandidates(mesh);\r\n }\r\n\r\n /**\r\n * Gets the mesh that is currently under the pointer\r\n */\r\n public get meshUnderPointer(): Nullable {\r\n return this._inputManager.meshUnderPointer;\r\n }\r\n\r\n /**\r\n * Gets or sets the current on-screen X position of the pointer\r\n */\r\n public get pointerX(): number {\r\n return this._inputManager.pointerX;\r\n }\r\n\r\n public set pointerX(value: number) {\r\n this._inputManager.pointerX = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the current on-screen Y position of the pointer\r\n */\r\n public get pointerY(): number {\r\n return this._inputManager.pointerY;\r\n }\r\n\r\n public set pointerY(value: number) {\r\n this._inputManager.pointerY = value;\r\n }\r\n\r\n /**\r\n * Gets the cached material (ie. the latest rendered one)\r\n * @returns the cached material\r\n */\r\n public getCachedMaterial(): Nullable {\r\n return this._cachedMaterial;\r\n }\r\n\r\n /**\r\n * Gets the cached effect (ie. the latest rendered one)\r\n * @returns the cached effect\r\n */\r\n public getCachedEffect(): Nullable {\r\n return this._cachedEffect;\r\n }\r\n\r\n /**\r\n * Gets the cached visibility state (ie. the latest rendered one)\r\n * @returns the cached visibility state\r\n */\r\n public getCachedVisibility(): Nullable {\r\n return this._cachedVisibility;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the current material / effect / visibility must be bind again\r\n * @param material defines the current material\r\n * @param effect defines the current effect\r\n * @param visibility defines the current visibility state\r\n * @returns true if one parameter is not cached\r\n */\r\n public isCachedMaterialInvalid(material: Material, effect: Effect, visibility: number = 1) {\r\n return this._cachedEffect !== effect || this._cachedMaterial !== material || this._cachedVisibility !== visibility;\r\n }\r\n\r\n /**\r\n * Gets the engine associated with the scene\r\n * @returns an Engine\r\n */\r\n public getEngine(): Engine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * Gets the total number of vertices rendered per frame\r\n * @returns the total number of vertices rendered per frame\r\n */\r\n public getTotalVertices(): number {\r\n return this._totalVertices.current;\r\n }\r\n\r\n /**\r\n * Gets the performance counter for total vertices\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\r\n */\r\n public get totalVerticesPerfCounter(): PerfCounter {\r\n return this._totalVertices;\r\n }\r\n\r\n /**\r\n * Gets the total number of active indices rendered per frame (You can deduce the number of rendered triangles by dividing this number by 3)\r\n * @returns the total number of active indices rendered per frame\r\n */\r\n public getActiveIndices(): number {\r\n return this._activeIndices.current;\r\n }\r\n\r\n /**\r\n * Gets the performance counter for active indices\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\r\n */\r\n public get totalActiveIndicesPerfCounter(): PerfCounter {\r\n return this._activeIndices;\r\n }\r\n\r\n /**\r\n * Gets the total number of active particles rendered per frame\r\n * @returns the total number of active particles rendered per frame\r\n */\r\n public getActiveParticles(): number {\r\n return this._activeParticles.current;\r\n }\r\n\r\n /**\r\n * Gets the performance counter for active particles\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\r\n */\r\n public get activeParticlesPerfCounter(): PerfCounter {\r\n return this._activeParticles;\r\n }\r\n\r\n /**\r\n * Gets the total number of active bones rendered per frame\r\n * @returns the total number of active bones rendered per frame\r\n */\r\n public getActiveBones(): number {\r\n return this._activeBones.current;\r\n }\r\n\r\n /**\r\n * Gets the performance counter for active bones\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\r\n */\r\n public get activeBonesPerfCounter(): PerfCounter {\r\n return this._activeBones;\r\n }\r\n\r\n /**\r\n * Gets the array of active meshes\r\n * @returns an array of AbstractMesh\r\n */\r\n public getActiveMeshes(): SmartArray {\r\n return this._activeMeshes;\r\n }\r\n\r\n /**\r\n * Gets the animation ratio (which is 1.0 is the scene renders at 60fps and 2 if the scene renders at 30fps, etc.)\r\n * @returns a number\r\n */\r\n public getAnimationRatio(): number {\r\n return this._animationRatio !== undefined ? this._animationRatio : 1;\r\n }\r\n\r\n /**\r\n * Gets an unique Id for the current render phase\r\n * @returns a number\r\n */\r\n public getRenderId(): number {\r\n return this._renderId;\r\n }\r\n\r\n /**\r\n * Gets an unique Id for the current frame\r\n * @returns a number\r\n */\r\n public getFrameId(): number {\r\n return this._frameId;\r\n }\r\n\r\n /** Call this function if you want to manually increment the render Id*/\r\n public incrementRenderId(): void {\r\n this._renderId++;\r\n }\r\n\r\n private _createUbo(): void {\r\n this.setSceneUniformBuffer(this.createSceneUniformBuffer());\r\n }\r\n\r\n /**\r\n * Use this method to simulate a pointer move on a mesh\r\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\r\n * @param pickResult pickingInfo of the object wished to simulate pointer event on\r\n * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\r\n * @returns the current scene\r\n */\r\n public simulatePointerMove(pickResult: PickingInfo, pointerEventInit?: PointerEventInit): Scene {\r\n this._inputManager.simulatePointerMove(pickResult, pointerEventInit);\r\n return this;\r\n }\r\n\r\n /**\r\n * Use this method to simulate a pointer down on a mesh\r\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\r\n * @param pickResult pickingInfo of the object wished to simulate pointer event on\r\n * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\r\n * @returns the current scene\r\n */\r\n public simulatePointerDown(pickResult: PickingInfo, pointerEventInit?: PointerEventInit): Scene {\r\n this._inputManager.simulatePointerDown(pickResult, pointerEventInit);\r\n return this;\r\n }\r\n\r\n /**\r\n * Use this method to simulate a pointer up on a mesh\r\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\r\n * @param pickResult pickingInfo of the object wished to simulate pointer event on\r\n * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\r\n * @param doubleTap indicates that the pointer up event should be considered as part of a double click (false by default)\r\n * @returns the current scene\r\n */\r\n public simulatePointerUp(pickResult: PickingInfo, pointerEventInit?: PointerEventInit, doubleTap?: boolean): Scene {\r\n this._inputManager.simulatePointerUp(pickResult, pointerEventInit, doubleTap);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down)\r\n * @param pointerId defines the pointer id to use in a multi-touch scenario (0 by default)\r\n * @returns true if the pointer was captured\r\n */\r\n public isPointerCaptured(pointerId = 0): boolean {\r\n return this._inputManager.isPointerCaptured(pointerId);\r\n }\r\n\r\n /**\r\n * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp\r\n * @param attachUp defines if you want to attach events to pointerup\r\n * @param attachDown defines if you want to attach events to pointerdown\r\n * @param attachMove defines if you want to attach events to pointermove\r\n */\r\n public attachControl(attachUp = true, attachDown = true, attachMove = true): void {\r\n this._inputManager.attachControl(attachUp, attachDown, attachMove);\r\n }\r\n\r\n /** Detaches all event handlers*/\r\n public detachControl() {\r\n this._inputManager.detachControl();\r\n }\r\n\r\n /**\r\n * This function will check if the scene can be rendered (textures are loaded, shaders are compiled)\r\n * Delay loaded resources are not taking in account\r\n * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: true)\r\n * @returns true if all required resources are ready\r\n */\r\n public isReady(checkRenderTargets = true): boolean {\r\n if (this._isDisposed) {\r\n return false;\r\n }\r\n\r\n let index: number;\r\n const engine = this.getEngine();\r\n\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n\r\n engine.currentRenderPassId = this.activeCamera?.renderPassId ?? currentRenderPassId;\r\n\r\n let isReady = true;\r\n\r\n // Pending data\r\n if (this._pendingData.length > 0) {\r\n isReady = false;\r\n }\r\n\r\n // Ensures that the pre-pass renderer is enabled if it is to be enabled.\r\n this.prePassRenderer?.update();\r\n\r\n // OIT\r\n if (this.useOrderIndependentTransparency && this.depthPeelingRenderer) {\r\n isReady &&= this.depthPeelingRenderer.isReady();\r\n }\r\n\r\n // Meshes\r\n if (checkRenderTargets) {\r\n this._processedMaterials.reset();\r\n this._materialsRenderTargets.reset();\r\n }\r\n\r\n for (index = 0; index < this.meshes.length; index++) {\r\n const mesh = this.meshes[index];\r\n\r\n if (!mesh.subMeshes || mesh.subMeshes.length === 0) {\r\n continue;\r\n }\r\n\r\n // Do not stop at the first encountered \"unready\" object as we want to ensure\r\n // all materials are starting off their compilation in parallel.\r\n if (!mesh.isReady(true)) {\r\n isReady = false;\r\n continue;\r\n }\r\n\r\n const hardwareInstancedRendering =\r\n mesh.hasThinInstances ||\r\n mesh.getClassName() === \"InstancedMesh\" ||\r\n mesh.getClassName() === \"InstancedLinesMesh\" ||\r\n (engine.getCaps().instancedArrays && (mesh).instances.length > 0);\r\n // Is Ready For Mesh\r\n for (const step of this._isReadyForMeshStage) {\r\n if (!step.action(mesh, hardwareInstancedRendering)) {\r\n isReady = false;\r\n }\r\n }\r\n\r\n if (!checkRenderTargets) {\r\n continue;\r\n }\r\n\r\n const mat = mesh.material || this.defaultMaterial;\r\n if (mat) {\r\n if (mat._storeEffectOnSubMeshes) {\r\n for (const subMesh of mesh.subMeshes) {\r\n const material = subMesh.getMaterial();\r\n if (material && material.hasRenderTargetTextures && material.getRenderTargetTextures != null) {\r\n if (this._processedMaterials.indexOf(material) === -1) {\r\n this._processedMaterials.push(material);\r\n\r\n this._materialsRenderTargets.concatWithNoDuplicate(material.getRenderTargetTextures!());\r\n }\r\n }\r\n }\r\n } else {\r\n if (mat.hasRenderTargetTextures && mat.getRenderTargetTextures != null) {\r\n if (this._processedMaterials.indexOf(mat) === -1) {\r\n this._processedMaterials.push(mat);\r\n\r\n this._materialsRenderTargets.concatWithNoDuplicate(mat.getRenderTargetTextures!());\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Render targets\r\n if (checkRenderTargets) {\r\n for (index = 0; index < this._materialsRenderTargets.length; ++index) {\r\n const rtt = this._materialsRenderTargets.data[index];\r\n if (!rtt.isReadyForRendering()) {\r\n isReady = false;\r\n }\r\n }\r\n }\r\n\r\n // Geometries\r\n for (index = 0; index < this.geometries.length; index++) {\r\n const geometry = this.geometries[index];\r\n\r\n if (geometry.delayLoadState === Constants.DELAYLOADSTATE_LOADING) {\r\n isReady = false;\r\n }\r\n }\r\n\r\n // Post-processes\r\n if (this.activeCameras && this.activeCameras.length > 0) {\r\n for (const camera of this.activeCameras) {\r\n if (!camera.isReady(true)) {\r\n isReady = false;\r\n }\r\n }\r\n } else if (this.activeCamera) {\r\n if (!this.activeCamera.isReady(true)) {\r\n isReady = false;\r\n }\r\n }\r\n\r\n // Particles\r\n for (const particleSystem of this.particleSystems) {\r\n if (!particleSystem.isReady()) {\r\n isReady = false;\r\n }\r\n }\r\n\r\n // Layers\r\n if (this.layers) {\r\n for (const layer of this.layers) {\r\n if (!layer.isReady()) {\r\n isReady = false;\r\n }\r\n }\r\n }\r\n\r\n // Effects\r\n if (!engine.areAllEffectsReady()) {\r\n isReady = false;\r\n }\r\n\r\n engine.currentRenderPassId = currentRenderPassId;\r\n\r\n return isReady;\r\n }\r\n\r\n /** Resets all cached information relative to material (including effect and visibility) */\r\n public resetCachedMaterial(): void {\r\n this._cachedMaterial = null;\r\n this._cachedEffect = null;\r\n this._cachedVisibility = null;\r\n }\r\n\r\n /**\r\n * Registers a function to be called before every frame render\r\n * @param func defines the function to register\r\n */\r\n public registerBeforeRender(func: () => void): void {\r\n this.onBeforeRenderObservable.add(func);\r\n }\r\n\r\n /**\r\n * Unregisters a function called before every frame render\r\n * @param func defines the function to unregister\r\n */\r\n public unregisterBeforeRender(func: () => void): void {\r\n this.onBeforeRenderObservable.removeCallback(func);\r\n }\r\n\r\n /**\r\n * Registers a function to be called after every frame render\r\n * @param func defines the function to register\r\n */\r\n public registerAfterRender(func: () => void): void {\r\n this.onAfterRenderObservable.add(func);\r\n }\r\n\r\n /**\r\n * Unregisters a function called after every frame render\r\n * @param func defines the function to unregister\r\n */\r\n public unregisterAfterRender(func: () => void): void {\r\n this.onAfterRenderObservable.removeCallback(func);\r\n }\r\n\r\n private _executeOnceBeforeRender(func: () => void): void {\r\n const execFunc = () => {\r\n func();\r\n setTimeout(() => {\r\n this.unregisterBeforeRender(execFunc);\r\n });\r\n };\r\n this.registerBeforeRender(execFunc);\r\n }\r\n\r\n /**\r\n * The provided function will run before render once and will be disposed afterwards.\r\n * A timeout delay can be provided so that the function will be executed in N ms.\r\n * The timeout is using the browser's native setTimeout so time percision cannot be guaranteed.\r\n * @param func The function to be executed.\r\n * @param timeout optional delay in ms\r\n */\r\n public executeOnceBeforeRender(func: () => void, timeout?: number): void {\r\n if (timeout !== undefined) {\r\n setTimeout(() => {\r\n this._executeOnceBeforeRender(func);\r\n }, timeout);\r\n } else {\r\n this._executeOnceBeforeRender(func);\r\n }\r\n }\r\n\r\n /**\r\n * This function can help adding any object to the list of data awaited to be ready in order to check for a complete scene loading.\r\n * @param data defines the object to wait for\r\n */\r\n public addPendingData(data: any): void {\r\n this._pendingData.push(data);\r\n }\r\n\r\n /**\r\n * Remove a pending data from the loading list which has previously been added with addPendingData.\r\n * @param data defines the object to remove from the pending list\r\n */\r\n public removePendingData(data: any): void {\r\n const wasLoading = this.isLoading;\r\n const index = this._pendingData.indexOf(data);\r\n\r\n if (index !== -1) {\r\n this._pendingData.splice(index, 1);\r\n }\r\n\r\n if (wasLoading && !this.isLoading) {\r\n this.onDataLoadedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the number of items waiting to be loaded\r\n * @returns the number of items waiting to be loaded\r\n */\r\n public getWaitingItemsCount(): number {\r\n return this._pendingData.length;\r\n }\r\n\r\n /**\r\n * Returns a boolean indicating if the scene is still loading data\r\n */\r\n public get isLoading(): boolean {\r\n return this._pendingData.length > 0;\r\n }\r\n\r\n /**\r\n * Registers a function to be executed when the scene is ready\r\n * @param func - the function to be executed\r\n * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false)\r\n */\r\n public executeWhenReady(func: () => void, checkRenderTargets = false): void {\r\n this.onReadyObservable.addOnce(func);\r\n\r\n if (this._executeWhenReadyTimeoutId !== null) {\r\n return;\r\n }\r\n\r\n this._checkIsReady(checkRenderTargets);\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves when the scene is ready\r\n * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false)\r\n * @returns A promise that resolves when the scene is ready\r\n */\r\n public whenReadyAsync(checkRenderTargets = false): Promise {\r\n return new Promise((resolve) => {\r\n this.executeWhenReady(() => {\r\n resolve();\r\n }, checkRenderTargets);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _checkIsReady(checkRenderTargets = false) {\r\n this._registerTransientComponents();\r\n\r\n if (this.isReady(checkRenderTargets)) {\r\n this.onReadyObservable.notifyObservers(this);\r\n\r\n this.onReadyObservable.clear();\r\n this._executeWhenReadyTimeoutId = null;\r\n return;\r\n }\r\n\r\n if (this._isDisposed) {\r\n this.onReadyObservable.clear();\r\n this._executeWhenReadyTimeoutId = null;\r\n return;\r\n }\r\n\r\n this._executeWhenReadyTimeoutId = setTimeout(() => {\r\n // Ensure materials effects are checked outside render loops\r\n this.incrementRenderId();\r\n this._checkIsReady(checkRenderTargets);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Gets all animatable attached to the scene\r\n */\r\n public get animatables(): Animatable[] {\r\n return this._activeAnimatables;\r\n }\r\n\r\n /**\r\n * Resets the last animation time frame.\r\n * Useful to override when animations start running when loading a scene for the first time.\r\n */\r\n public resetLastAnimationTimeFrame(): void {\r\n this._animationTimeLast = PrecisionDate.Now;\r\n }\r\n\r\n // Matrix\r\n\r\n /**\r\n * Gets the current view matrix\r\n * @returns a Matrix\r\n */\r\n public getViewMatrix(): Matrix {\r\n return this._viewMatrix;\r\n }\r\n\r\n /**\r\n * Gets the current projection matrix\r\n * @returns a Matrix\r\n */\r\n public getProjectionMatrix(): Matrix {\r\n return this._projectionMatrix;\r\n }\r\n\r\n /**\r\n * Gets the current transform matrix\r\n * @returns a Matrix made of View * Projection\r\n */\r\n public getTransformMatrix(): Matrix {\r\n return this._transformMatrix;\r\n }\r\n\r\n /**\r\n * Sets the current transform matrix\r\n * @param viewL defines the View matrix to use\r\n * @param projectionL defines the Projection matrix to use\r\n * @param viewR defines the right View matrix to use (if provided)\r\n * @param projectionR defines the right Projection matrix to use (if provided)\r\n */\r\n public setTransformMatrix(viewL: Matrix, projectionL: Matrix, viewR?: Matrix, projectionR?: Matrix): void {\r\n // clear the multiviewSceneUbo if no viewR and projectionR are defined\r\n if (!viewR && !projectionR && this._multiviewSceneUbo) {\r\n this._multiviewSceneUbo.dispose();\r\n this._multiviewSceneUbo = null;\r\n }\r\n if (this._viewUpdateFlag === viewL.updateFlag && this._projectionUpdateFlag === projectionL.updateFlag) {\r\n return;\r\n }\r\n\r\n this._viewUpdateFlag = viewL.updateFlag;\r\n this._projectionUpdateFlag = projectionL.updateFlag;\r\n this._viewMatrix = viewL;\r\n this._projectionMatrix = projectionL;\r\n\r\n this._viewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix);\r\n\r\n // Update frustum\r\n if (!this._frustumPlanes) {\r\n this._frustumPlanes = Frustum.GetPlanes(this._transformMatrix);\r\n } else {\r\n Frustum.GetPlanesToRef(this._transformMatrix, this._frustumPlanes);\r\n }\r\n\r\n if (this._multiviewSceneUbo && this._multiviewSceneUbo.useUbo) {\r\n this._updateMultiviewUbo(viewR, projectionR);\r\n } else if (this._sceneUbo.useUbo) {\r\n this._sceneUbo.updateMatrix(\"viewProjection\", this._transformMatrix);\r\n this._sceneUbo.updateMatrix(\"view\", this._viewMatrix);\r\n this._sceneUbo.updateMatrix(\"projection\", this._projectionMatrix);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the uniform buffer used to store scene data\r\n * @returns a UniformBuffer\r\n */\r\n public getSceneUniformBuffer(): UniformBuffer {\r\n return this._multiviewSceneUbo ? this._multiviewSceneUbo : this._sceneUbo;\r\n }\r\n\r\n /**\r\n * Creates a scene UBO\r\n * @param name name of the uniform buffer (optional, for debugging purpose only)\r\n * @returns a new ubo\r\n */\r\n public createSceneUniformBuffer(name?: string): UniformBuffer {\r\n const sceneUbo = new UniformBuffer(this._engine, undefined, false, name ?? \"scene\");\r\n sceneUbo.addUniform(\"viewProjection\", 16);\r\n sceneUbo.addUniform(\"view\", 16);\r\n sceneUbo.addUniform(\"projection\", 16);\r\n sceneUbo.addUniform(\"vEyePosition\", 4);\r\n\r\n return sceneUbo;\r\n }\r\n\r\n /**\r\n * Sets the scene ubo\r\n * @param ubo the ubo to set for the scene\r\n */\r\n public setSceneUniformBuffer(ubo: UniformBuffer): void {\r\n this._sceneUbo = ubo;\r\n this._viewUpdateFlag = -1;\r\n this._projectionUpdateFlag = -1;\r\n }\r\n\r\n /**\r\n * Gets an unique (relatively to the current scene) Id\r\n * @returns an unique number for the scene\r\n */\r\n public getUniqueId() {\r\n return UniqueIdGenerator.UniqueId;\r\n }\r\n\r\n /**\r\n * Add a mesh to the list of scene's meshes\r\n * @param newMesh defines the mesh to add\r\n * @param recursive if all child meshes should also be added to the scene\r\n */\r\n public addMesh(newMesh: AbstractMesh, recursive = false) {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n\r\n this.meshes.push(newMesh);\r\n\r\n newMesh._resyncLightSources();\r\n\r\n if (!newMesh.parent) {\r\n newMesh._addToSceneRootNodes();\r\n }\r\n\r\n this.onNewMeshAddedObservable.notifyObservers(newMesh);\r\n\r\n if (recursive) {\r\n newMesh.getChildMeshes().forEach((m) => {\r\n this.addMesh(m);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Remove a mesh for the list of scene's meshes\r\n * @param toRemove defines the mesh to remove\r\n * @param recursive if all child meshes should also be removed from the scene\r\n * @returns the index where the mesh was in the mesh list\r\n */\r\n public removeMesh(toRemove: AbstractMesh, recursive = false): number {\r\n const index = this.meshes.indexOf(toRemove);\r\n if (index !== -1) {\r\n // Remove from the scene if mesh found\r\n this.meshes[index] = this.meshes[this.meshes.length - 1];\r\n this.meshes.pop();\r\n\r\n if (!toRemove.parent) {\r\n toRemove._removeFromSceneRootNodes();\r\n }\r\n }\r\n\r\n this._inputManager._invalidateMesh(toRemove);\r\n\r\n this.onMeshRemovedObservable.notifyObservers(toRemove);\r\n if (recursive) {\r\n toRemove.getChildMeshes().forEach((m) => {\r\n this.removeMesh(m);\r\n });\r\n }\r\n return index;\r\n }\r\n\r\n /**\r\n * Add a transform node to the list of scene's transform nodes\r\n * @param newTransformNode defines the transform node to add\r\n */\r\n public addTransformNode(newTransformNode: TransformNode) {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n\r\n if (newTransformNode.getScene() === this && newTransformNode._indexInSceneTransformNodesArray !== -1) {\r\n // Already there?\r\n return;\r\n }\r\n\r\n newTransformNode._indexInSceneTransformNodesArray = this.transformNodes.length;\r\n this.transformNodes.push(newTransformNode);\r\n\r\n if (!newTransformNode.parent) {\r\n newTransformNode._addToSceneRootNodes();\r\n }\r\n\r\n this.onNewTransformNodeAddedObservable.notifyObservers(newTransformNode);\r\n }\r\n\r\n /**\r\n * Remove a transform node for the list of scene's transform nodes\r\n * @param toRemove defines the transform node to remove\r\n * @returns the index where the transform node was in the transform node list\r\n */\r\n public removeTransformNode(toRemove: TransformNode): number {\r\n const index = toRemove._indexInSceneTransformNodesArray;\r\n if (index !== -1) {\r\n if (index !== this.transformNodes.length - 1) {\r\n const lastNode = this.transformNodes[this.transformNodes.length - 1];\r\n this.transformNodes[index] = lastNode;\r\n lastNode._indexInSceneTransformNodesArray = index;\r\n }\r\n\r\n toRemove._indexInSceneTransformNodesArray = -1;\r\n this.transformNodes.pop();\r\n if (!toRemove.parent) {\r\n toRemove._removeFromSceneRootNodes();\r\n }\r\n }\r\n\r\n this.onTransformNodeRemovedObservable.notifyObservers(toRemove);\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Remove a skeleton for the list of scene's skeletons\r\n * @param toRemove defines the skeleton to remove\r\n * @returns the index where the skeleton was in the skeleton list\r\n */\r\n public removeSkeleton(toRemove: Skeleton): number {\r\n const index = this.skeletons.indexOf(toRemove);\r\n if (index !== -1) {\r\n // Remove from the scene if found\r\n this.skeletons.splice(index, 1);\r\n this.onSkeletonRemovedObservable.notifyObservers(toRemove);\r\n\r\n // Clean active container\r\n this._executeActiveContainerCleanup(this._activeSkeletons);\r\n }\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Remove a morph target for the list of scene's morph targets\r\n * @param toRemove defines the morph target to remove\r\n * @returns the index where the morph target was in the morph target list\r\n */\r\n public removeMorphTargetManager(toRemove: MorphTargetManager): number {\r\n const index = this.morphTargetManagers.indexOf(toRemove);\r\n if (index !== -1) {\r\n // Remove from the scene if found\r\n this.morphTargetManagers.splice(index, 1);\r\n }\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Remove a light for the list of scene's lights\r\n * @param toRemove defines the light to remove\r\n * @returns the index where the light was in the light list\r\n */\r\n public removeLight(toRemove: Light): number {\r\n const index = this.lights.indexOf(toRemove);\r\n if (index !== -1) {\r\n // Remove from meshes\r\n for (const mesh of this.meshes) {\r\n mesh._removeLightSource(toRemove, false);\r\n }\r\n\r\n // Remove from the scene if mesh found\r\n this.lights.splice(index, 1);\r\n this.sortLightsByPriority();\r\n\r\n if (!toRemove.parent) {\r\n toRemove._removeFromSceneRootNodes();\r\n }\r\n }\r\n this.onLightRemovedObservable.notifyObservers(toRemove);\r\n return index;\r\n }\r\n\r\n /**\r\n * Remove a camera for the list of scene's cameras\r\n * @param toRemove defines the camera to remove\r\n * @returns the index where the camera was in the camera list\r\n */\r\n public removeCamera(toRemove: Camera): number {\r\n const index = this.cameras.indexOf(toRemove);\r\n if (index !== -1) {\r\n // Remove from the scene if mesh found\r\n this.cameras.splice(index, 1);\r\n if (!toRemove.parent) {\r\n toRemove._removeFromSceneRootNodes();\r\n }\r\n }\r\n // Remove from activeCameras\r\n if (this.activeCameras) {\r\n const index2 = this.activeCameras.indexOf(toRemove);\r\n if (index2 !== -1) {\r\n // Remove from the scene if mesh found\r\n this.activeCameras.splice(index2, 1);\r\n }\r\n }\r\n // Reset the activeCamera\r\n if (this.activeCamera === toRemove) {\r\n if (this.cameras.length > 0) {\r\n this.activeCamera = this.cameras[0];\r\n } else {\r\n this.activeCamera = null;\r\n }\r\n }\r\n this.onCameraRemovedObservable.notifyObservers(toRemove);\r\n return index;\r\n }\r\n\r\n /**\r\n * Remove a particle system for the list of scene's particle systems\r\n * @param toRemove defines the particle system to remove\r\n * @returns the index where the particle system was in the particle system list\r\n */\r\n public removeParticleSystem(toRemove: IParticleSystem): number {\r\n const index = this.particleSystems.indexOf(toRemove);\r\n if (index !== -1) {\r\n this.particleSystems.splice(index, 1);\r\n\r\n // Clean active container\r\n this._executeActiveContainerCleanup(this._activeParticleSystems);\r\n }\r\n return index;\r\n }\r\n\r\n /**\r\n * Remove a animation for the list of scene's animations\r\n * @param toRemove defines the animation to remove\r\n * @returns the index where the animation was in the animation list\r\n */\r\n public removeAnimation(toRemove: Animation): number {\r\n const index = this.animations.indexOf(toRemove);\r\n if (index !== -1) {\r\n this.animations.splice(index, 1);\r\n }\r\n return index;\r\n }\r\n\r\n /**\r\n * Will stop the animation of the given target\r\n * @param target - the target\r\n * @param animationName - the name of the animation to stop (all animations will be stopped if both this and targetMask are empty)\r\n * @param targetMask - a function that determines if the animation should be stopped based on its target (all animations will be stopped if both this and animationName are empty)\r\n */\r\n public stopAnimation(target: any, animationName?: string, targetMask?: (target: any) => boolean): void {\r\n // Do nothing as code will be provided by animation component\r\n }\r\n\r\n /**\r\n * Removes the given animation group from this scene.\r\n * @param toRemove The animation group to remove\r\n * @returns The index of the removed animation group\r\n */\r\n public removeAnimationGroup(toRemove: AnimationGroup): number {\r\n const index = this.animationGroups.indexOf(toRemove);\r\n if (index !== -1) {\r\n this.animationGroups.splice(index, 1);\r\n }\r\n return index;\r\n }\r\n\r\n /**\r\n * Removes the given multi-material from this scene.\r\n * @param toRemove The multi-material to remove\r\n * @returns The index of the removed multi-material\r\n */\r\n public removeMultiMaterial(toRemove: MultiMaterial): number {\r\n const index = this.multiMaterials.indexOf(toRemove);\r\n if (index !== -1) {\r\n this.multiMaterials.splice(index, 1);\r\n }\r\n\r\n this.onMultiMaterialRemovedObservable.notifyObservers(toRemove);\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Removes the given material from this scene.\r\n * @param toRemove The material to remove\r\n * @returns The index of the removed material\r\n */\r\n public removeMaterial(toRemove: Material): number {\r\n const index = toRemove._indexInSceneMaterialArray;\r\n if (index !== -1 && index < this.materials.length) {\r\n if (index !== this.materials.length - 1) {\r\n const lastMaterial = this.materials[this.materials.length - 1];\r\n this.materials[index] = lastMaterial;\r\n lastMaterial._indexInSceneMaterialArray = index;\r\n }\r\n\r\n toRemove._indexInSceneMaterialArray = -1;\r\n this.materials.pop();\r\n }\r\n\r\n this.onMaterialRemovedObservable.notifyObservers(toRemove);\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Removes the given action manager from this scene.\r\n * @deprecated\r\n * @param toRemove The action manager to remove\r\n * @returns The index of the removed action manager\r\n */\r\n public removeActionManager(toRemove: AbstractActionManager): number {\r\n const index = this.actionManagers.indexOf(toRemove);\r\n if (index !== -1) {\r\n this.actionManagers.splice(index, 1);\r\n }\r\n return index;\r\n }\r\n\r\n /**\r\n * Removes the given texture from this scene.\r\n * @param toRemove The texture to remove\r\n * @returns The index of the removed texture\r\n */\r\n public removeTexture(toRemove: BaseTexture): number {\r\n const index = this.textures.indexOf(toRemove);\r\n if (index !== -1) {\r\n this.textures.splice(index, 1);\r\n }\r\n this.onTextureRemovedObservable.notifyObservers(toRemove);\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Adds the given light to this scene\r\n * @param newLight The light to add\r\n */\r\n public addLight(newLight: Light): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.lights.push(newLight);\r\n this.sortLightsByPriority();\r\n\r\n if (!newLight.parent) {\r\n newLight._addToSceneRootNodes();\r\n }\r\n\r\n // Add light to all meshes (To support if the light is removed and then re-added)\r\n for (const mesh of this.meshes) {\r\n if (mesh.lightSources.indexOf(newLight) === -1) {\r\n mesh.lightSources.push(newLight);\r\n mesh._resyncLightSources();\r\n }\r\n }\r\n\r\n this.onNewLightAddedObservable.notifyObservers(newLight);\r\n }\r\n\r\n /**\r\n * Sorts the list list based on light priorities\r\n */\r\n public sortLightsByPriority(): void {\r\n if (this.requireLightSorting) {\r\n this.lights.sort(LightConstants.CompareLightsPriority);\r\n }\r\n }\r\n\r\n /**\r\n * Adds the given camera to this scene\r\n * @param newCamera The camera to add\r\n */\r\n public addCamera(newCamera: Camera): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n\r\n this.cameras.push(newCamera);\r\n this.onNewCameraAddedObservable.notifyObservers(newCamera);\r\n\r\n if (!newCamera.parent) {\r\n newCamera._addToSceneRootNodes();\r\n }\r\n }\r\n\r\n /**\r\n * Adds the given skeleton to this scene\r\n * @param newSkeleton The skeleton to add\r\n */\r\n public addSkeleton(newSkeleton: Skeleton): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.skeletons.push(newSkeleton);\r\n this.onNewSkeletonAddedObservable.notifyObservers(newSkeleton);\r\n }\r\n\r\n /**\r\n * Adds the given particle system to this scene\r\n * @param newParticleSystem The particle system to add\r\n */\r\n public addParticleSystem(newParticleSystem: IParticleSystem): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.particleSystems.push(newParticleSystem);\r\n }\r\n\r\n /**\r\n * Adds the given animation to this scene\r\n * @param newAnimation The animation to add\r\n */\r\n public addAnimation(newAnimation: Animation): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.animations.push(newAnimation);\r\n }\r\n\r\n /**\r\n * Adds the given animation group to this scene.\r\n * @param newAnimationGroup The animation group to add\r\n */\r\n public addAnimationGroup(newAnimationGroup: AnimationGroup): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.animationGroups.push(newAnimationGroup);\r\n }\r\n\r\n /**\r\n * Adds the given multi-material to this scene\r\n * @param newMultiMaterial The multi-material to add\r\n */\r\n public addMultiMaterial(newMultiMaterial: MultiMaterial): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.multiMaterials.push(newMultiMaterial);\r\n this.onNewMultiMaterialAddedObservable.notifyObservers(newMultiMaterial);\r\n }\r\n\r\n /**\r\n * Adds the given material to this scene\r\n * @param newMaterial The material to add\r\n */\r\n public addMaterial(newMaterial: Material): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n\r\n if (newMaterial.getScene() === this && newMaterial._indexInSceneMaterialArray !== -1) {\r\n // Already there??\r\n return;\r\n }\r\n\r\n newMaterial._indexInSceneMaterialArray = this.materials.length;\r\n this.materials.push(newMaterial);\r\n this.onNewMaterialAddedObservable.notifyObservers(newMaterial);\r\n }\r\n\r\n /**\r\n * Adds the given morph target to this scene\r\n * @param newMorphTargetManager The morph target to add\r\n */\r\n public addMorphTargetManager(newMorphTargetManager: MorphTargetManager): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.morphTargetManagers.push(newMorphTargetManager);\r\n }\r\n\r\n /**\r\n * Adds the given geometry to this scene\r\n * @param newGeometry The geometry to add\r\n */\r\n public addGeometry(newGeometry: Geometry): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n\r\n if (this._geometriesByUniqueId) {\r\n this._geometriesByUniqueId[newGeometry.uniqueId] = this.geometries.length;\r\n }\r\n\r\n this.geometries.push(newGeometry);\r\n }\r\n\r\n /**\r\n * Adds the given action manager to this scene\r\n * @deprecated\r\n * @param newActionManager The action manager to add\r\n */\r\n public addActionManager(newActionManager: AbstractActionManager): void {\r\n this.actionManagers.push(newActionManager);\r\n }\r\n\r\n /**\r\n * Adds the given texture to this scene.\r\n * @param newTexture The texture to add\r\n */\r\n public addTexture(newTexture: BaseTexture): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.textures.push(newTexture);\r\n this.onNewTextureAddedObservable.notifyObservers(newTexture);\r\n }\r\n\r\n /**\r\n * Switch active camera\r\n * @param newCamera defines the new active camera\r\n * @param attachControl defines if attachControl must be called for the new active camera (default: true)\r\n */\r\n public switchActiveCamera(newCamera: Camera, attachControl = true): void {\r\n const canvas = this._engine.getInputElement();\r\n\r\n if (!canvas) {\r\n return;\r\n }\r\n\r\n if (this.activeCamera) {\r\n this.activeCamera.detachControl();\r\n }\r\n this.activeCamera = newCamera;\r\n if (attachControl) {\r\n newCamera.attachControl();\r\n }\r\n }\r\n\r\n /**\r\n * sets the active camera of the scene using its Id\r\n * @param id defines the camera's Id\r\n * @returns the new active camera or null if none found.\r\n */\r\n public setActiveCameraById(id: string): Nullable {\r\n const camera = this.getCameraById(id);\r\n\r\n if (camera) {\r\n this.activeCamera = camera;\r\n return camera;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * sets the active camera of the scene using its name\r\n * @param name defines the camera's name\r\n * @returns the new active camera or null if none found.\r\n */\r\n public setActiveCameraByName(name: string): Nullable {\r\n const camera = this.getCameraByName(name);\r\n\r\n if (camera) {\r\n this.activeCamera = camera;\r\n return camera;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * get an animation group using its name\r\n * @param name defines the material's name\r\n * @returns the animation group or null if none found.\r\n */\r\n public getAnimationGroupByName(name: string): Nullable {\r\n for (let index = 0; index < this.animationGroups.length; index++) {\r\n if (this.animationGroups[index].name === name) {\r\n return this.animationGroups[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _getMaterial(allowMultiMaterials: boolean, predicate: (m: Material) => boolean): Nullable {\r\n for (let index = 0; index < this.materials.length; index++) {\r\n const material = this.materials[index];\r\n if (predicate(material)) {\r\n return material;\r\n }\r\n }\r\n if (allowMultiMaterials) {\r\n for (let index = 0; index < this.multiMaterials.length; index++) {\r\n const material = this.multiMaterials[index];\r\n if (predicate(material)) {\r\n return material;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Get a material using its unique id\r\n * @param uniqueId defines the material's unique id\r\n * @param allowMultiMaterials determines whether multimaterials should be considered\r\n * @returns the material or null if none found.\r\n */\r\n public getMaterialByUniqueID(uniqueId: number, allowMultiMaterials: boolean = false): Nullable {\r\n return this._getMaterial(allowMultiMaterials, (m) => m.uniqueId === uniqueId);\r\n }\r\n\r\n /**\r\n * get a material using its id\r\n * @param id defines the material's Id\r\n * @param allowMultiMaterials determines whether multimaterials should be considered\r\n * @returns the material or null if none found.\r\n */\r\n public getMaterialById(id: string, allowMultiMaterials: boolean = false): Nullable {\r\n return this._getMaterial(allowMultiMaterials, (m) => m.id === id);\r\n }\r\n\r\n /**\r\n * Gets a material using its name\r\n * @param name defines the material's name\r\n * @param allowMultiMaterials determines whether multimaterials should be considered\r\n * @returns the material or null if none found.\r\n */\r\n public getMaterialByName(name: string, allowMultiMaterials: boolean = false): Nullable {\r\n return this._getMaterial(allowMultiMaterials, (m) => m.name === name);\r\n }\r\n\r\n /**\r\n * Gets a last added material using a given id\r\n * @param id defines the material's id\r\n * @param allowMultiMaterials determines whether multimaterials should be considered\r\n * @returns the last material with the given id or null if none found.\r\n */\r\n public getLastMaterialById(id: string, allowMultiMaterials: boolean = false): Nullable {\r\n for (let index = this.materials.length - 1; index >= 0; index--) {\r\n if (this.materials[index].id === id) {\r\n return this.materials[index];\r\n }\r\n }\r\n if (allowMultiMaterials) {\r\n for (let index = this.multiMaterials.length - 1; index >= 0; index--) {\r\n if (this.multiMaterials[index].id === id) {\r\n return this.multiMaterials[index];\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Get a texture using its unique id\r\n * @param uniqueId defines the texture's unique id\r\n * @returns the texture or null if none found.\r\n */\r\n public getTextureByUniqueId(uniqueId: number): Nullable {\r\n for (let index = 0; index < this.textures.length; index++) {\r\n if (this.textures[index].uniqueId === uniqueId) {\r\n return this.textures[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a texture using its name\r\n * @param name defines the texture's name\r\n * @returns the texture or null if none found.\r\n */\r\n public getTextureByName(name: string): Nullable {\r\n for (let index = 0; index < this.textures.length; index++) {\r\n if (this.textures[index].name === name) {\r\n return this.textures[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a camera using its Id\r\n * @param id defines the Id to look for\r\n * @returns the camera or null if not found\r\n */\r\n public getCameraById(id: string): Nullable {\r\n for (let index = 0; index < this.cameras.length; index++) {\r\n if (this.cameras[index].id === id) {\r\n return this.cameras[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a camera using its unique Id\r\n * @param uniqueId defines the unique Id to look for\r\n * @returns the camera or null if not found\r\n */\r\n public getCameraByUniqueId(uniqueId: number): Nullable {\r\n for (let index = 0; index < this.cameras.length; index++) {\r\n if (this.cameras[index].uniqueId === uniqueId) {\r\n return this.cameras[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a camera using its name\r\n * @param name defines the camera's name\r\n * @returns the camera or null if none found.\r\n */\r\n public getCameraByName(name: string): Nullable {\r\n for (let index = 0; index < this.cameras.length; index++) {\r\n if (this.cameras[index].name === name) {\r\n return this.cameras[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a bone using its Id\r\n * @param id defines the bone's Id\r\n * @returns the bone or null if not found\r\n */\r\n public getBoneById(id: string): Nullable {\r\n for (let skeletonIndex = 0; skeletonIndex < this.skeletons.length; skeletonIndex++) {\r\n const skeleton = this.skeletons[skeletonIndex];\r\n for (let boneIndex = 0; boneIndex < skeleton.bones.length; boneIndex++) {\r\n if (skeleton.bones[boneIndex].id === id) {\r\n return skeleton.bones[boneIndex];\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a bone using its id\r\n * @param name defines the bone's name\r\n * @returns the bone or null if not found\r\n */\r\n public getBoneByName(name: string): Nullable {\r\n for (let skeletonIndex = 0; skeletonIndex < this.skeletons.length; skeletonIndex++) {\r\n const skeleton = this.skeletons[skeletonIndex];\r\n for (let boneIndex = 0; boneIndex < skeleton.bones.length; boneIndex++) {\r\n if (skeleton.bones[boneIndex].name === name) {\r\n return skeleton.bones[boneIndex];\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a light node using its name\r\n * @param name defines the light's name\r\n * @returns the light or null if none found.\r\n */\r\n public getLightByName(name: string): Nullable {\r\n for (let index = 0; index < this.lights.length; index++) {\r\n if (this.lights[index].name === name) {\r\n return this.lights[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a light node using its Id\r\n * @param id defines the light's Id\r\n * @returns the light or null if none found.\r\n */\r\n public getLightById(id: string): Nullable {\r\n for (let index = 0; index < this.lights.length; index++) {\r\n if (this.lights[index].id === id) {\r\n return this.lights[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a light node using its scene-generated unique Id\r\n * @param uniqueId defines the light's unique Id\r\n * @returns the light or null if none found.\r\n */\r\n public getLightByUniqueId(uniqueId: number): Nullable {\r\n for (let index = 0; index < this.lights.length; index++) {\r\n if (this.lights[index].uniqueId === uniqueId) {\r\n return this.lights[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a particle system by Id\r\n * @param id defines the particle system Id\r\n * @returns the corresponding system or null if none found\r\n */\r\n public getParticleSystemById(id: string): Nullable {\r\n for (let index = 0; index < this.particleSystems.length; index++) {\r\n if (this.particleSystems[index].id === id) {\r\n return this.particleSystems[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a geometry using its Id\r\n * @param id defines the geometry's Id\r\n * @returns the geometry or null if none found.\r\n */\r\n public getGeometryById(id: string): Nullable {\r\n for (let index = 0; index < this.geometries.length; index++) {\r\n if (this.geometries[index].id === id) {\r\n return this.geometries[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _getGeometryByUniqueId(uniqueId: number): Nullable {\r\n if (this._geometriesByUniqueId) {\r\n const index = this._geometriesByUniqueId[uniqueId];\r\n if (index !== undefined) {\r\n return this.geometries[index];\r\n }\r\n } else {\r\n for (let index = 0; index < this.geometries.length; index++) {\r\n if (this.geometries[index].uniqueId === uniqueId) {\r\n return this.geometries[index];\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Add a new geometry to this scene\r\n * @param geometry defines the geometry to be added to the scene.\r\n * @param force defines if the geometry must be pushed even if a geometry with this id already exists\r\n * @returns a boolean defining if the geometry was added or not\r\n */\r\n public pushGeometry(geometry: Geometry, force?: boolean): boolean {\r\n if (!force && this._getGeometryByUniqueId(geometry.uniqueId)) {\r\n return false;\r\n }\r\n\r\n this.addGeometry(geometry);\r\n\r\n this.onNewGeometryAddedObservable.notifyObservers(geometry);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Removes an existing geometry\r\n * @param geometry defines the geometry to be removed from the scene\r\n * @returns a boolean defining if the geometry was removed or not\r\n */\r\n public removeGeometry(geometry: Geometry): boolean {\r\n let index;\r\n if (this._geometriesByUniqueId) {\r\n index = this._geometriesByUniqueId[geometry.uniqueId];\r\n if (index === undefined) {\r\n return false;\r\n }\r\n } else {\r\n index = this.geometries.indexOf(geometry);\r\n if (index < 0) {\r\n return false;\r\n }\r\n }\r\n\r\n if (index !== this.geometries.length - 1) {\r\n const lastGeometry = this.geometries[this.geometries.length - 1];\r\n if (lastGeometry) {\r\n this.geometries[index] = lastGeometry;\r\n if (this._geometriesByUniqueId) {\r\n this._geometriesByUniqueId[lastGeometry.uniqueId] = index;\r\n }\r\n }\r\n }\r\n\r\n if (this._geometriesByUniqueId) {\r\n this._geometriesByUniqueId[geometry.uniqueId] = undefined;\r\n }\r\n\r\n this.geometries.pop();\r\n\r\n this.onGeometryRemovedObservable.notifyObservers(geometry);\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets the list of geometries attached to the scene\r\n * @returns an array of Geometry\r\n */\r\n public getGeometries(): Geometry[] {\r\n return this.geometries;\r\n }\r\n\r\n /**\r\n * Gets the first added mesh found of a given Id\r\n * @param id defines the Id to search for\r\n * @returns the mesh found or null if not found at all\r\n */\r\n public getMeshById(id: string): Nullable {\r\n for (let index = 0; index < this.meshes.length; index++) {\r\n if (this.meshes[index].id === id) {\r\n return this.meshes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a list of meshes using their Id\r\n * @param id defines the Id to search for\r\n * @returns a list of meshes\r\n */\r\n public getMeshesById(id: string): Array {\r\n return this.meshes.filter(function (m) {\r\n return m.id === id;\r\n });\r\n }\r\n\r\n /**\r\n * Gets the first added transform node found of a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found transform node or null if not found at all.\r\n */\r\n public getTransformNodeById(id: string): Nullable {\r\n for (let index = 0; index < this.transformNodes.length; index++) {\r\n if (this.transformNodes[index].id === id) {\r\n return this.transformNodes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a transform node with its auto-generated unique Id\r\n * @param uniqueId defines the unique Id to search for\r\n * @returns the found transform node or null if not found at all.\r\n */\r\n public getTransformNodeByUniqueId(uniqueId: number): Nullable {\r\n for (let index = 0; index < this.transformNodes.length; index++) {\r\n if (this.transformNodes[index].uniqueId === uniqueId) {\r\n return this.transformNodes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a list of transform nodes using their Id\r\n * @param id defines the Id to search for\r\n * @returns a list of transform nodes\r\n */\r\n public getTransformNodesById(id: string): Array {\r\n return this.transformNodes.filter(function (m) {\r\n return m.id === id;\r\n });\r\n }\r\n\r\n /**\r\n * Gets a mesh with its auto-generated unique Id\r\n * @param uniqueId defines the unique Id to search for\r\n * @returns the found mesh or null if not found at all.\r\n */\r\n public getMeshByUniqueId(uniqueId: number): Nullable {\r\n for (let index = 0; index < this.meshes.length; index++) {\r\n if (this.meshes[index].uniqueId === uniqueId) {\r\n return this.meshes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a the last added mesh using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found mesh or null if not found at all.\r\n */\r\n public getLastMeshById(id: string): Nullable {\r\n for (let index = this.meshes.length - 1; index >= 0; index--) {\r\n if (this.meshes[index].id === id) {\r\n return this.meshes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a the last transform node using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found mesh or null if not found at all.\r\n */\r\n public getLastTransformNodeById(id: string): Nullable {\r\n for (let index = this.transformNodes.length - 1; index >= 0; index--) {\r\n if (this.transformNodes[index].id === id) {\r\n return this.transformNodes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a the last added node (Mesh, Camera, Light) using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found node or null if not found at all\r\n */\r\n public getLastEntryById(id: string): Nullable {\r\n let index: number;\r\n for (index = this.meshes.length - 1; index >= 0; index--) {\r\n if (this.meshes[index].id === id) {\r\n return this.meshes[index];\r\n }\r\n }\r\n\r\n for (index = this.transformNodes.length - 1; index >= 0; index--) {\r\n if (this.transformNodes[index].id === id) {\r\n return this.transformNodes[index];\r\n }\r\n }\r\n\r\n for (index = this.cameras.length - 1; index >= 0; index--) {\r\n if (this.cameras[index].id === id) {\r\n return this.cameras[index];\r\n }\r\n }\r\n\r\n for (index = this.lights.length - 1; index >= 0; index--) {\r\n if (this.lights[index].id === id) {\r\n return this.lights[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a node (Mesh, Camera, Light) using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found node or null if not found at all\r\n */\r\n public getNodeById(id: string): Nullable {\r\n const mesh = this.getMeshById(id);\r\n if (mesh) {\r\n return mesh;\r\n }\r\n\r\n const transformNode = this.getTransformNodeById(id);\r\n if (transformNode) {\r\n return transformNode;\r\n }\r\n\r\n const light = this.getLightById(id);\r\n if (light) {\r\n return light;\r\n }\r\n\r\n const camera = this.getCameraById(id);\r\n if (camera) {\r\n return camera;\r\n }\r\n\r\n const bone = this.getBoneById(id);\r\n if (bone) {\r\n return bone;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a node (Mesh, Camera, Light) using a given name\r\n * @param name defines the name to search for\r\n * @returns the found node or null if not found at all.\r\n */\r\n public getNodeByName(name: string): Nullable {\r\n const mesh = this.getMeshByName(name);\r\n if (mesh) {\r\n return mesh;\r\n }\r\n\r\n const transformNode = this.getTransformNodeByName(name);\r\n if (transformNode) {\r\n return transformNode;\r\n }\r\n\r\n const light = this.getLightByName(name);\r\n if (light) {\r\n return light;\r\n }\r\n\r\n const camera = this.getCameraByName(name);\r\n if (camera) {\r\n return camera;\r\n }\r\n\r\n const bone = this.getBoneByName(name);\r\n if (bone) {\r\n return bone;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a mesh using a given name\r\n * @param name defines the name to search for\r\n * @returns the found mesh or null if not found at all.\r\n */\r\n public getMeshByName(name: string): Nullable {\r\n for (let index = 0; index < this.meshes.length; index++) {\r\n if (this.meshes[index].name === name) {\r\n return this.meshes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a transform node using a given name\r\n * @param name defines the name to search for\r\n * @returns the found transform node or null if not found at all.\r\n */\r\n public getTransformNodeByName(name: string): Nullable {\r\n for (let index = 0; index < this.transformNodes.length; index++) {\r\n if (this.transformNodes[index].name === name) {\r\n return this.transformNodes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a skeleton using a given Id (if many are found, this function will pick the last one)\r\n * @param id defines the Id to search for\r\n * @returns the found skeleton or null if not found at all.\r\n */\r\n public getLastSkeletonById(id: string): Nullable {\r\n for (let index = this.skeletons.length - 1; index >= 0; index--) {\r\n if (this.skeletons[index].id === id) {\r\n return this.skeletons[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a skeleton using a given auto generated unique id\r\n * @param uniqueId defines the unique id to search for\r\n * @returns the found skeleton or null if not found at all.\r\n */\r\n public getSkeletonByUniqueId(uniqueId: number): Nullable {\r\n for (let index = 0; index < this.skeletons.length; index++) {\r\n if (this.skeletons[index].uniqueId === uniqueId) {\r\n return this.skeletons[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a skeleton using a given id (if many are found, this function will pick the first one)\r\n * @param id defines the id to search for\r\n * @returns the found skeleton or null if not found at all.\r\n */\r\n public getSkeletonById(id: string): Nullable {\r\n for (let index = 0; index < this.skeletons.length; index++) {\r\n if (this.skeletons[index].id === id) {\r\n return this.skeletons[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a skeleton using a given name\r\n * @param name defines the name to search for\r\n * @returns the found skeleton or null if not found at all.\r\n */\r\n public getSkeletonByName(name: string): Nullable {\r\n for (let index = 0; index < this.skeletons.length; index++) {\r\n if (this.skeletons[index].name === name) {\r\n return this.skeletons[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a morph target manager using a given id (if many are found, this function will pick the last one)\r\n * @param id defines the id to search for\r\n * @returns the found morph target manager or null if not found at all.\r\n */\r\n public getMorphTargetManagerById(id: number): Nullable {\r\n for (let index = 0; index < this.morphTargetManagers.length; index++) {\r\n if (this.morphTargetManagers[index].uniqueId === id) {\r\n return this.morphTargetManagers[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a morph target using a given id (if many are found, this function will pick the first one)\r\n * @param id defines the id to search for\r\n * @returns the found morph target or null if not found at all.\r\n */\r\n public getMorphTargetById(id: string): Nullable {\r\n for (let managerIndex = 0; managerIndex < this.morphTargetManagers.length; ++managerIndex) {\r\n const morphTargetManager = this.morphTargetManagers[managerIndex];\r\n for (let index = 0; index < morphTargetManager.numTargets; ++index) {\r\n const target = morphTargetManager.getTarget(index);\r\n if (target.id === id) {\r\n return target;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a morph target using a given name (if many are found, this function will pick the first one)\r\n * @param name defines the name to search for\r\n * @returns the found morph target or null if not found at all.\r\n */\r\n public getMorphTargetByName(name: string): Nullable {\r\n for (let managerIndex = 0; managerIndex < this.morphTargetManagers.length; ++managerIndex) {\r\n const morphTargetManager = this.morphTargetManagers[managerIndex];\r\n for (let index = 0; index < morphTargetManager.numTargets; ++index) {\r\n const target = morphTargetManager.getTarget(index);\r\n if (target.name === name) {\r\n return target;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a post process using a given name (if many are found, this function will pick the first one)\r\n * @param name defines the name to search for\r\n * @returns the found post process or null if not found at all.\r\n */\r\n public getPostProcessByName(name: string): Nullable {\r\n for (let postProcessIndex = 0; postProcessIndex < this.postProcesses.length; ++postProcessIndex) {\r\n const postProcess = this.postProcesses[postProcessIndex];\r\n if (postProcess.name === name) {\r\n return postProcess;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the given mesh is active\r\n * @param mesh defines the mesh to look for\r\n * @returns true if the mesh is in the active list\r\n */\r\n public isActiveMesh(mesh: AbstractMesh): boolean {\r\n return this._activeMeshes.indexOf(mesh) !== -1;\r\n }\r\n\r\n /**\r\n * Return a unique id as a string which can serve as an identifier for the scene\r\n */\r\n public get uid(): string {\r\n if (!this._uid) {\r\n this._uid = Tools.RandomId();\r\n }\r\n return this._uid;\r\n }\r\n\r\n /**\r\n * Add an externally attached data from its key.\r\n * This method call will fail and return false, if such key already exists.\r\n * If you don't care and just want to get the data no matter what, use the more convenient getOrAddExternalDataWithFactory() method.\r\n * @param key the unique key that identifies the data\r\n * @param data the data object to associate to the key for this Engine instance\r\n * @returns true if no such key were already present and the data was added successfully, false otherwise\r\n */\r\n public addExternalData(key: string, data: T): boolean {\r\n if (!this._externalData) {\r\n this._externalData = new StringDictionary();\r\n }\r\n return this._externalData.add(key, data);\r\n }\r\n\r\n /**\r\n * Get an externally attached data from its key\r\n * @param key the unique key that identifies the data\r\n * @returns the associated data, if present (can be null), or undefined if not present\r\n */\r\n public getExternalData(key: string): Nullable {\r\n if (!this._externalData) {\r\n return null;\r\n }\r\n return this._externalData.get(key);\r\n }\r\n\r\n /**\r\n * Get an externally attached data from its key, create it using a factory if it's not already present\r\n * @param key the unique key that identifies the data\r\n * @param factory the factory that will be called to create the instance if and only if it doesn't exists\r\n * @returns the associated data, can be null if the factory returned null.\r\n */\r\n public getOrAddExternalDataWithFactory(key: string, factory: (k: string) => T): T {\r\n if (!this._externalData) {\r\n this._externalData = new StringDictionary();\r\n }\r\n return this._externalData.getOrAddWithFactory(key, factory);\r\n }\r\n\r\n /**\r\n * Remove an externally attached data from the Engine instance\r\n * @param key the unique key that identifies the data\r\n * @returns true if the data was successfully removed, false if it doesn't exist\r\n */\r\n public removeExternalData(key: string): boolean {\r\n return this._externalData.remove(key);\r\n }\r\n\r\n private _evaluateSubMesh(subMesh: SubMesh, mesh: AbstractMesh, initialMesh: AbstractMesh, forcePush: boolean): void {\r\n if (forcePush || subMesh.isInFrustum(this._frustumPlanes)) {\r\n for (const step of this._evaluateSubMeshStage) {\r\n step.action(mesh, subMesh);\r\n }\r\n\r\n const material = subMesh.getMaterial();\r\n if (material !== null && material !== undefined) {\r\n // Render targets\r\n if (material.hasRenderTargetTextures && material.getRenderTargetTextures != null) {\r\n if (this._processedMaterials.indexOf(material) === -1) {\r\n this._processedMaterials.push(material);\r\n\r\n this._materialsRenderTargets.concatWithNoDuplicate(material.getRenderTargetTextures!());\r\n }\r\n }\r\n\r\n // Dispatch\r\n this._renderingManager.dispatch(subMesh, mesh, material);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the processed materials smart array preventing retention point in material dispose.\r\n */\r\n public freeProcessedMaterials(): void {\r\n this._processedMaterials.dispose();\r\n }\r\n\r\n private _preventFreeActiveMeshesAndRenderingGroups = false;\r\n\r\n /** Gets or sets a boolean blocking all the calls to freeActiveMeshes and freeRenderingGroups\r\n * It can be used in order to prevent going through methods freeRenderingGroups and freeActiveMeshes several times to improve performance\r\n * when disposing several meshes in a row or a hierarchy of meshes.\r\n * When used, it is the responsibility of the user to blockfreeActiveMeshesAndRenderingGroups back to false.\r\n */\r\n public get blockfreeActiveMeshesAndRenderingGroups(): boolean {\r\n return this._preventFreeActiveMeshesAndRenderingGroups;\r\n }\r\n\r\n public set blockfreeActiveMeshesAndRenderingGroups(value: boolean) {\r\n if (this._preventFreeActiveMeshesAndRenderingGroups === value) {\r\n return;\r\n }\r\n\r\n if (value) {\r\n this.freeActiveMeshes();\r\n this.freeRenderingGroups();\r\n }\r\n\r\n this._preventFreeActiveMeshesAndRenderingGroups = value;\r\n }\r\n\r\n /**\r\n * Clear the active meshes smart array preventing retention point in mesh dispose.\r\n */\r\n public freeActiveMeshes(): void {\r\n if (this.blockfreeActiveMeshesAndRenderingGroups) {\r\n return;\r\n }\r\n\r\n this._activeMeshes.dispose();\r\n if (this.activeCamera && this.activeCamera._activeMeshes) {\r\n this.activeCamera._activeMeshes.dispose();\r\n }\r\n if (this.activeCameras) {\r\n for (let i = 0; i < this.activeCameras.length; i++) {\r\n const activeCamera = this.activeCameras[i];\r\n if (activeCamera && activeCamera._activeMeshes) {\r\n activeCamera._activeMeshes.dispose();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the info related to rendering groups preventing retention points during dispose.\r\n */\r\n public freeRenderingGroups(): void {\r\n if (this.blockfreeActiveMeshesAndRenderingGroups) {\r\n return;\r\n }\r\n\r\n if (this._renderingManager) {\r\n this._renderingManager.freeRenderingGroups();\r\n }\r\n if (this.textures) {\r\n for (let i = 0; i < this.textures.length; i++) {\r\n const texture = this.textures[i];\r\n if (texture && (texture).renderList) {\r\n (texture).freeRenderingGroups();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _isInIntermediateRendering(): boolean {\r\n return this._intermediateRendering;\r\n }\r\n\r\n /**\r\n * Lambda returning the list of potentially active meshes.\r\n */\r\n public getActiveMeshCandidates: () => ISmartArrayLike;\r\n\r\n /**\r\n * Lambda returning the list of potentially active sub meshes.\r\n */\r\n public getActiveSubMeshCandidates: (mesh: AbstractMesh) => ISmartArrayLike;\r\n\r\n /**\r\n * Lambda returning the list of potentially intersecting sub meshes.\r\n */\r\n public getIntersectingSubMeshCandidates: (mesh: AbstractMesh, localRay: Ray) => ISmartArrayLike;\r\n\r\n /**\r\n * Lambda returning the list of potentially colliding sub meshes.\r\n */\r\n public getCollidingSubMeshCandidates: (mesh: AbstractMesh, collider: Collider) => ISmartArrayLike;\r\n\r\n /** @internal */\r\n public _activeMeshesFrozen = false;\r\n /** @internal */\r\n public _activeMeshesFrozenButKeepClipping = false;\r\n private _skipEvaluateActiveMeshesCompletely = false;\r\n\r\n /**\r\n * Use this function to stop evaluating active meshes. The current list will be keep alive between frames\r\n * @param skipEvaluateActiveMeshes defines an optional boolean indicating that the evaluate active meshes step must be completely skipped\r\n * @param onSuccess optional success callback\r\n * @param onError optional error callback\r\n * @param freezeMeshes defines if meshes should be frozen (true by default)\r\n * @param keepFrustumCulling defines if you want to keep running the frustum clipping (false by default)\r\n * @returns the current scene\r\n */\r\n public freezeActiveMeshes(\r\n skipEvaluateActiveMeshes = false,\r\n onSuccess?: () => void,\r\n onError?: (message: string) => void,\r\n freezeMeshes = true,\r\n keepFrustumCulling = false\r\n ): Scene {\r\n this.executeWhenReady(() => {\r\n if (!this.activeCamera) {\r\n onError && onError(\"No active camera found\");\r\n return;\r\n }\r\n\r\n if (!this._frustumPlanes) {\r\n this.updateTransformMatrix();\r\n }\r\n\r\n this._evaluateActiveMeshes();\r\n this._activeMeshesFrozen = true;\r\n this._activeMeshesFrozenButKeepClipping = keepFrustumCulling;\r\n this._skipEvaluateActiveMeshesCompletely = skipEvaluateActiveMeshes;\r\n\r\n if (freezeMeshes) {\r\n for (let index = 0; index < this._activeMeshes.length; index++) {\r\n this._activeMeshes.data[index]._freeze();\r\n }\r\n }\r\n onSuccess && onSuccess();\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Use this function to restart evaluating active meshes on every frame\r\n * @returns the current scene\r\n */\r\n public unfreezeActiveMeshes(): Scene {\r\n for (let index = 0; index < this.meshes.length; index++) {\r\n const mesh = this.meshes[index];\r\n if (mesh._internalAbstractMeshDataInfo) {\r\n mesh._internalAbstractMeshDataInfo._isActive = false;\r\n }\r\n }\r\n\r\n for (let index = 0; index < this._activeMeshes.length; index++) {\r\n this._activeMeshes.data[index]._unFreeze();\r\n }\r\n\r\n this._activeMeshesFrozen = false;\r\n return this;\r\n }\r\n\r\n private _executeActiveContainerCleanup(container: SmartArray) {\r\n const isInFastMode = this._engine.snapshotRendering && this._engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST;\r\n\r\n if (!isInFastMode && this._activeMeshesFrozen && this._activeMeshes.length) {\r\n return; // Do not execute in frozen mode\r\n }\r\n\r\n // We need to ensure we are not in the rendering loop\r\n this.onBeforeRenderObservable.addOnce(() => container.dispose());\r\n }\r\n\r\n private _evaluateActiveMeshes(): void {\r\n if (this._engine.snapshotRendering && this._engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST) {\r\n if (this._activeMeshes.length > 0) {\r\n this.activeCamera?._activeMeshes.reset();\r\n this._activeMeshes.reset();\r\n this._renderingManager.reset();\r\n this._processedMaterials.reset();\r\n this._activeParticleSystems.reset();\r\n this._activeSkeletons.reset();\r\n this._softwareSkinnedMeshes.reset();\r\n }\r\n return;\r\n }\r\n\r\n if (this._activeMeshesFrozen && this._activeMeshes.length) {\r\n if (!this._skipEvaluateActiveMeshesCompletely) {\r\n const len = this._activeMeshes.length;\r\n for (let i = 0; i < len; i++) {\r\n const mesh = this._activeMeshes.data[i];\r\n mesh.computeWorldMatrix();\r\n }\r\n }\r\n\r\n if (this._activeParticleSystems) {\r\n const psLength = this._activeParticleSystems.length;\r\n for (let i = 0; i < psLength; i++) {\r\n this._activeParticleSystems.data[i].animate();\r\n }\r\n }\r\n\r\n this._renderingManager.resetSprites();\r\n\r\n return;\r\n }\r\n\r\n if (!this.activeCamera) {\r\n return;\r\n }\r\n\r\n this.onBeforeActiveMeshesEvaluationObservable.notifyObservers(this);\r\n\r\n this.activeCamera._activeMeshes.reset();\r\n this._activeMeshes.reset();\r\n this._renderingManager.reset();\r\n this._processedMaterials.reset();\r\n this._activeParticleSystems.reset();\r\n this._activeSkeletons.reset();\r\n this._softwareSkinnedMeshes.reset();\r\n this._materialsRenderTargets.reset();\r\n\r\n for (const step of this._beforeEvaluateActiveMeshStage) {\r\n step.action();\r\n }\r\n\r\n // Determine mesh candidates\r\n const meshes = this.getActiveMeshCandidates();\r\n\r\n // Check each mesh\r\n const len = meshes.length;\r\n for (let i = 0; i < len; i++) {\r\n const mesh = meshes.data[i];\r\n mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate = false;\r\n if (mesh.isBlocked) {\r\n continue;\r\n }\r\n\r\n this._totalVertices.addCount(mesh.getTotalVertices(), false);\r\n\r\n if (!mesh.isReady() || !mesh.isEnabled() || mesh.scaling.hasAZeroComponent) {\r\n continue;\r\n }\r\n\r\n mesh.computeWorldMatrix();\r\n\r\n // Intersections\r\n if (mesh.actionManager && mesh.actionManager.hasSpecificTriggers2(Constants.ACTION_OnIntersectionEnterTrigger, Constants.ACTION_OnIntersectionExitTrigger)) {\r\n this._meshesForIntersections.pushNoDuplicate(mesh);\r\n }\r\n\r\n // Switch to current LOD\r\n let meshToRender = this.customLODSelector ? this.customLODSelector(mesh, this.activeCamera) : mesh.getLOD(this.activeCamera);\r\n mesh._internalAbstractMeshDataInfo._currentLOD = meshToRender;\r\n mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate = true;\r\n if (meshToRender === undefined || meshToRender === null) {\r\n continue;\r\n }\r\n\r\n // Compute world matrix if LOD is billboard\r\n if (meshToRender !== mesh && meshToRender.billboardMode !== 0) {\r\n meshToRender.computeWorldMatrix();\r\n }\r\n\r\n mesh._preActivate();\r\n\r\n if (\r\n mesh.isVisible &&\r\n mesh.visibility > 0 &&\r\n (mesh.layerMask & this.activeCamera.layerMask) !== 0 &&\r\n (this._skipFrustumClipping || mesh.alwaysSelectAsActiveMesh || mesh.isInFrustum(this._frustumPlanes))\r\n ) {\r\n this._activeMeshes.push(mesh);\r\n this.activeCamera._activeMeshes.push(mesh);\r\n\r\n if (meshToRender !== mesh) {\r\n meshToRender._activate(this._renderId, false);\r\n }\r\n\r\n for (const step of this._preActiveMeshStage) {\r\n step.action(mesh);\r\n }\r\n\r\n if (mesh._activate(this._renderId, false)) {\r\n if (!mesh.isAnInstance) {\r\n meshToRender._internalAbstractMeshDataInfo._onlyForInstances = false;\r\n } else {\r\n if (mesh._internalAbstractMeshDataInfo._actAsRegularMesh) {\r\n meshToRender = mesh;\r\n }\r\n }\r\n meshToRender._internalAbstractMeshDataInfo._isActive = true;\r\n this._activeMesh(mesh, meshToRender);\r\n }\r\n\r\n mesh._postActivate();\r\n }\r\n }\r\n\r\n this.onAfterActiveMeshesEvaluationObservable.notifyObservers(this);\r\n\r\n // Particle systems\r\n if (this.particlesEnabled) {\r\n this.onBeforeParticlesRenderingObservable.notifyObservers(this);\r\n for (let particleIndex = 0; particleIndex < this.particleSystems.length; particleIndex++) {\r\n const particleSystem = this.particleSystems[particleIndex];\r\n\r\n if (!particleSystem.isStarted() || !particleSystem.emitter) {\r\n continue;\r\n }\r\n\r\n const emitter = particleSystem.emitter;\r\n if (!emitter.position || emitter.isEnabled()) {\r\n this._activeParticleSystems.push(particleSystem);\r\n particleSystem.animate();\r\n this._renderingManager.dispatchParticles(particleSystem);\r\n }\r\n }\r\n this.onAfterParticlesRenderingObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n private _activeMesh(sourceMesh: AbstractMesh, mesh: AbstractMesh): void {\r\n if (this._skeletonsEnabled && mesh.skeleton !== null && mesh.skeleton !== undefined) {\r\n if (this._activeSkeletons.pushNoDuplicate(mesh.skeleton)) {\r\n mesh.skeleton.prepare();\r\n this._activeBones.addCount(mesh.skeleton.bones.length, false);\r\n }\r\n\r\n if (!mesh.computeBonesUsingShaders) {\r\n this._softwareSkinnedMeshes.pushNoDuplicate(mesh);\r\n }\r\n }\r\n\r\n let forcePush = sourceMesh.hasInstances || sourceMesh.isAnInstance || this.dispatchAllSubMeshesOfActiveMeshes || this._skipFrustumClipping || mesh.alwaysSelectAsActiveMesh;\r\n\r\n if (mesh && mesh.subMeshes && mesh.subMeshes.length > 0) {\r\n const subMeshes = this.getActiveSubMeshCandidates(mesh);\r\n const len = subMeshes.length;\r\n forcePush = forcePush || len === 1;\r\n for (let i = 0; i < len; i++) {\r\n const subMesh = subMeshes.data[i];\r\n this._evaluateSubMesh(subMesh, mesh, sourceMesh, forcePush);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update the transform matrix to update from the current active camera\r\n * @param force defines a boolean used to force the update even if cache is up to date\r\n */\r\n public updateTransformMatrix(force?: boolean): void {\r\n const activeCamera = this.activeCamera;\r\n if (!activeCamera) {\r\n return;\r\n }\r\n\r\n if (activeCamera._renderingMultiview) {\r\n const leftCamera = activeCamera._rigCameras[0];\r\n const rightCamera = activeCamera._rigCameras[1];\r\n this.setTransformMatrix(leftCamera.getViewMatrix(), leftCamera.getProjectionMatrix(force), rightCamera.getViewMatrix(), rightCamera.getProjectionMatrix(force));\r\n } else {\r\n this.setTransformMatrix(activeCamera.getViewMatrix(), activeCamera.getProjectionMatrix(force));\r\n }\r\n }\r\n\r\n private _bindFrameBuffer(camera: Nullable, clear = true) {\r\n if (camera && camera._multiviewTexture) {\r\n camera._multiviewTexture._bindFrameBuffer();\r\n } else if (camera && camera.outputRenderTarget) {\r\n camera.outputRenderTarget._bindFrameBuffer();\r\n } else {\r\n if (!this._engine._currentFrameBufferIsDefaultFrameBuffer()) {\r\n this._engine.restoreDefaultFramebuffer();\r\n }\r\n }\r\n if (clear) {\r\n this._clearFrameBuffer(camera);\r\n }\r\n }\r\n\r\n private _clearFrameBuffer(camera: Nullable) {\r\n // we assume the framebuffer currently bound is the right one\r\n if (camera && camera._multiviewTexture) {\r\n // no clearing\r\n } else if (camera && camera.outputRenderTarget && !camera._renderingMultiview) {\r\n const rtt = camera.outputRenderTarget;\r\n if (rtt.onClearObservable.hasObservers()) {\r\n rtt.onClearObservable.notifyObservers(this._engine);\r\n } else if (!rtt.skipInitialClear && !camera.isRightCamera) {\r\n if (this.autoClear) {\r\n this._engine.clear(rtt.clearColor || this.clearColor, !rtt._cleared, true, true);\r\n }\r\n rtt._cleared = true;\r\n }\r\n } else {\r\n if (!this._defaultFrameBufferCleared) {\r\n this._defaultFrameBufferCleared = true;\r\n this._clear();\r\n } else {\r\n this._engine.clear(null, false, true, true);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _allowPostProcessClearColor = true;\r\n /**\r\n * @internal\r\n */\r\n public _renderForCamera(camera: Camera, rigParent?: Camera, bindFrameBuffer = true): void {\r\n if (camera && camera._skipRendering) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n\r\n // Use _activeCamera instead of activeCamera to avoid onActiveCameraChanged\r\n this._activeCamera = camera;\r\n\r\n if (!this.activeCamera) {\r\n throw new Error(\"Active camera not set\");\r\n }\r\n\r\n // Viewport\r\n engine.setViewport(this.activeCamera.viewport);\r\n\r\n // Camera\r\n this.resetCachedMaterial();\r\n this._renderId++;\r\n\r\n if (!this.prePass && bindFrameBuffer) {\r\n let skipInitialClear = true;\r\n if (camera._renderingMultiview && camera.outputRenderTarget) {\r\n skipInitialClear = camera.outputRenderTarget.skipInitialClear;\r\n if (this.autoClear) {\r\n this._defaultFrameBufferCleared = false;\r\n camera.outputRenderTarget.skipInitialClear = false;\r\n }\r\n }\r\n this._bindFrameBuffer(this._activeCamera);\r\n if (camera._renderingMultiview && camera.outputRenderTarget) {\r\n camera.outputRenderTarget.skipInitialClear = skipInitialClear;\r\n }\r\n }\r\n\r\n this.updateTransformMatrix();\r\n\r\n this.onBeforeCameraRenderObservable.notifyObservers(this.activeCamera);\r\n\r\n // Meshes\r\n this._evaluateActiveMeshes();\r\n\r\n // Software skinning\r\n for (let softwareSkinnedMeshIndex = 0; softwareSkinnedMeshIndex < this._softwareSkinnedMeshes.length; softwareSkinnedMeshIndex++) {\r\n const mesh = this._softwareSkinnedMeshes.data[softwareSkinnedMeshIndex];\r\n\r\n mesh.applySkeleton(mesh.skeleton);\r\n }\r\n\r\n // Render targets\r\n this.onBeforeRenderTargetsRenderObservable.notifyObservers(this);\r\n\r\n this._renderTargets.concatWithNoDuplicate(this._materialsRenderTargets);\r\n\r\n if (camera.customRenderTargets && camera.customRenderTargets.length > 0) {\r\n this._renderTargets.concatWithNoDuplicate(camera.customRenderTargets);\r\n }\r\n\r\n if (rigParent && rigParent.customRenderTargets && rigParent.customRenderTargets.length > 0) {\r\n this._renderTargets.concatWithNoDuplicate(rigParent.customRenderTargets);\r\n }\r\n\r\n if (this.environmentTexture && this.environmentTexture.isRenderTarget) {\r\n this._renderTargets.pushNoDuplicate(this.environmentTexture as RenderTargetTexture);\r\n }\r\n\r\n // Collects render targets from external components.\r\n for (const step of this._gatherActiveCameraRenderTargetsStage) {\r\n step.action(this._renderTargets);\r\n }\r\n\r\n let needRebind = false;\r\n if (this.renderTargetsEnabled) {\r\n this._intermediateRendering = true;\r\n\r\n if (this._renderTargets.length > 0) {\r\n Tools.StartPerformanceCounter(\"Render targets\", this._renderTargets.length > 0);\r\n for (let renderIndex = 0; renderIndex < this._renderTargets.length; renderIndex++) {\r\n const renderTarget = this._renderTargets.data[renderIndex];\r\n if (renderTarget._shouldRender()) {\r\n this._renderId++;\r\n const hasSpecialRenderTargetCamera = renderTarget.activeCamera && renderTarget.activeCamera !== this.activeCamera;\r\n renderTarget.render(hasSpecialRenderTargetCamera, this.dumpNextRenderTargets);\r\n needRebind = true;\r\n }\r\n }\r\n Tools.EndPerformanceCounter(\"Render targets\", this._renderTargets.length > 0);\r\n\r\n this._renderId++;\r\n }\r\n\r\n for (const step of this._cameraDrawRenderTargetStage) {\r\n needRebind = step.action(this.activeCamera) || needRebind;\r\n }\r\n\r\n this._intermediateRendering = false;\r\n }\r\n\r\n this._engine.currentRenderPassId = camera.outputRenderTarget?.renderPassId ?? camera.renderPassId ?? Constants.RENDERPASS_MAIN;\r\n\r\n // Restore framebuffer after rendering to targets\r\n if (needRebind && !this.prePass) {\r\n this._bindFrameBuffer(this._activeCamera, false);\r\n this.updateTransformMatrix();\r\n }\r\n\r\n this.onAfterRenderTargetsRenderObservable.notifyObservers(this);\r\n\r\n // Prepare Frame\r\n if (this.postProcessManager && !camera._multiviewTexture && !this.prePass) {\r\n this.postProcessManager._prepareFrame();\r\n }\r\n\r\n // Before Camera Draw\r\n for (const step of this._beforeCameraDrawStage) {\r\n step.action(this.activeCamera);\r\n }\r\n\r\n // Render\r\n this.onBeforeDrawPhaseObservable.notifyObservers(this);\r\n\r\n if (engine.snapshotRendering && engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST) {\r\n this.finalizeSceneUbo();\r\n }\r\n this._renderingManager.render(null, null, true, true);\r\n this.onAfterDrawPhaseObservable.notifyObservers(this);\r\n\r\n // After Camera Draw\r\n for (const step of this._afterCameraDrawStage) {\r\n step.action(this.activeCamera);\r\n }\r\n\r\n // Finalize frame\r\n if (this.postProcessManager && !camera._multiviewTexture) {\r\n // if the camera has an output render target, render the post process to the render target\r\n const texture = camera.outputRenderTarget ? camera.outputRenderTarget.renderTarget! : undefined;\r\n this.postProcessManager._finalizeFrame(camera.isIntermediate, texture);\r\n }\r\n\r\n // After post process\r\n for (const step of this._afterCameraPostProcessStage) {\r\n step.action(this.activeCamera);\r\n }\r\n\r\n // Reset some special arrays\r\n this._renderTargets.reset();\r\n\r\n this.onAfterCameraRenderObservable.notifyObservers(this.activeCamera);\r\n }\r\n\r\n private _processSubCameras(camera: Camera, bindFrameBuffer = true): void {\r\n if (camera.cameraRigMode === Constants.RIG_MODE_NONE || camera._renderingMultiview) {\r\n if (camera._renderingMultiview && !this._multiviewSceneUbo) {\r\n this._createMultiviewUbo();\r\n }\r\n this._renderForCamera(camera, undefined, bindFrameBuffer);\r\n this.onAfterRenderCameraObservable.notifyObservers(camera);\r\n return;\r\n }\r\n\r\n if (camera._useMultiviewToSingleView) {\r\n this._renderMultiviewToSingleView(camera);\r\n } else {\r\n // rig cameras\r\n this.onBeforeCameraRenderObservable.notifyObservers(camera);\r\n for (let index = 0; index < camera._rigCameras.length; index++) {\r\n this._renderForCamera(camera._rigCameras[index], camera);\r\n }\r\n }\r\n\r\n // Use _activeCamera instead of activeCamera to avoid onActiveCameraChanged\r\n this._activeCamera = camera;\r\n this.updateTransformMatrix();\r\n this.onAfterRenderCameraObservable.notifyObservers(camera);\r\n }\r\n\r\n private _checkIntersections(): void {\r\n for (let index = 0; index < this._meshesForIntersections.length; index++) {\r\n const sourceMesh = this._meshesForIntersections.data[index];\r\n\r\n if (!sourceMesh.actionManager) {\r\n continue;\r\n }\r\n\r\n for (let actionIndex = 0; sourceMesh.actionManager && actionIndex < sourceMesh.actionManager.actions.length; actionIndex++) {\r\n const action: IAction = sourceMesh.actionManager.actions[actionIndex];\r\n\r\n if (action.trigger === Constants.ACTION_OnIntersectionEnterTrigger || action.trigger === Constants.ACTION_OnIntersectionExitTrigger) {\r\n const parameters = action.getTriggerParameter();\r\n const otherMesh = parameters.mesh ? parameters.mesh : parameters;\r\n\r\n const areIntersecting = otherMesh.intersectsMesh(sourceMesh, parameters.usePreciseIntersection);\r\n const currentIntersectionInProgress = sourceMesh._intersectionsInProgress.indexOf(otherMesh);\r\n\r\n if (areIntersecting && currentIntersectionInProgress === -1) {\r\n if (action.trigger === Constants.ACTION_OnIntersectionEnterTrigger) {\r\n action._executeCurrent(ActionEvent.CreateNew(sourceMesh, undefined, otherMesh));\r\n sourceMesh._intersectionsInProgress.push(otherMesh);\r\n } else if (action.trigger === Constants.ACTION_OnIntersectionExitTrigger) {\r\n sourceMesh._intersectionsInProgress.push(otherMesh);\r\n }\r\n } else if (!areIntersecting && currentIntersectionInProgress > -1) {\r\n //They intersected, and now they don't.\r\n\r\n //is this trigger an exit trigger? execute an event.\r\n if (action.trigger === Constants.ACTION_OnIntersectionExitTrigger) {\r\n action._executeCurrent(ActionEvent.CreateNew(sourceMesh, undefined, otherMesh));\r\n }\r\n\r\n //if this is an exit trigger, or no exit trigger exists, remove the id from the intersection in progress array.\r\n if (\r\n !sourceMesh.actionManager.hasSpecificTrigger(Constants.ACTION_OnIntersectionExitTrigger, (parameter) => {\r\n const parameterMesh = parameter.mesh ? parameter.mesh : parameter;\r\n return otherMesh === parameterMesh;\r\n }) ||\r\n action.trigger === Constants.ACTION_OnIntersectionExitTrigger\r\n ) {\r\n sourceMesh._intersectionsInProgress.splice(currentIntersectionInProgress, 1);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _advancePhysicsEngineStep(step: number) {\r\n // Do nothing. Code will be replaced if physics engine component is referenced\r\n }\r\n\r\n /**\r\n * User updatable function that will return a deterministic frame time when engine is in deterministic lock step mode\r\n * @returns the frame time\r\n */\r\n public getDeterministicFrameTime: () => number = () => {\r\n return this._engine.getTimeStep();\r\n };\r\n\r\n /** @internal */\r\n public _animate(customDeltaTime?: number): void {\r\n // Nothing to do as long as Animatable have not been imported.\r\n }\r\n\r\n /** Execute all animations (for a frame) */\r\n public animate() {\r\n if (this._engine.isDeterministicLockStep()) {\r\n let deltaTime = Math.max(Scene.MinDeltaTime, Math.min(this._engine.getDeltaTime(), Scene.MaxDeltaTime)) + this._timeAccumulator;\r\n\r\n const defaultFrameTime = this._engine.getTimeStep();\r\n const defaultFPS = 1000.0 / defaultFrameTime / 1000.0;\r\n\r\n let stepsTaken = 0;\r\n\r\n const maxSubSteps = this._engine.getLockstepMaxSteps();\r\n\r\n let internalSteps = Math.floor(deltaTime / defaultFrameTime);\r\n internalSteps = Math.min(internalSteps, maxSubSteps);\r\n\r\n while (deltaTime > 0 && stepsTaken < internalSteps) {\r\n this.onBeforeStepObservable.notifyObservers(this);\r\n\r\n // Animations\r\n this._animationRatio = defaultFrameTime * defaultFPS;\r\n this._animate(defaultFrameTime);\r\n this.onAfterAnimationsObservable.notifyObservers(this);\r\n\r\n // Physics\r\n if (this.physicsEnabled) {\r\n this._advancePhysicsEngineStep(defaultFrameTime);\r\n }\r\n\r\n this.onAfterStepObservable.notifyObservers(this);\r\n this._currentStepId++;\r\n\r\n stepsTaken++;\r\n deltaTime -= defaultFrameTime;\r\n }\r\n\r\n this._timeAccumulator = deltaTime < 0 ? 0 : deltaTime;\r\n } else {\r\n // Animations\r\n const deltaTime = this.useConstantAnimationDeltaTime ? 16 : Math.max(Scene.MinDeltaTime, Math.min(this._engine.getDeltaTime(), Scene.MaxDeltaTime));\r\n this._animationRatio = deltaTime * (60.0 / 1000.0);\r\n this._animate();\r\n this.onAfterAnimationsObservable.notifyObservers(this);\r\n\r\n // Physics\r\n if (this.physicsEnabled) {\r\n this._advancePhysicsEngineStep(deltaTime);\r\n }\r\n }\r\n }\r\n\r\n private _clear(): void {\r\n if (this.autoClearDepthAndStencil || this.autoClear) {\r\n this._engine.clear(this.clearColor, this.autoClear || this.forceWireframe || this.forcePointsCloud, this.autoClearDepthAndStencil, this.autoClearDepthAndStencil);\r\n }\r\n }\r\n\r\n private _checkCameraRenderTarget(camera: Nullable) {\r\n if (camera?.outputRenderTarget && !camera?.isRigCamera) {\r\n camera.outputRenderTarget._cleared = false;\r\n }\r\n if (camera?.rigCameras?.length) {\r\n for (let i = 0; i < camera.rigCameras.length; ++i) {\r\n const rtt = camera.rigCameras[i].outputRenderTarget;\r\n if (rtt) {\r\n rtt._cleared = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache of all meshes\r\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\r\n */\r\n public resetDrawCache(passId?: number): void {\r\n if (!this.meshes) {\r\n return;\r\n }\r\n\r\n for (const mesh of this.meshes) {\r\n mesh.resetDrawCache(passId);\r\n }\r\n }\r\n\r\n /**\r\n * Render the scene\r\n * @param updateCameras defines a boolean indicating if cameras must update according to their inputs (true by default)\r\n * @param ignoreAnimations defines a boolean indicating if animations should not be executed (false by default)\r\n */\r\n public render(updateCameras = true, ignoreAnimations = false): void {\r\n if (this.isDisposed) {\r\n return;\r\n }\r\n\r\n if (this.onReadyObservable.hasObservers() && this._executeWhenReadyTimeoutId === null) {\r\n this._checkIsReady();\r\n }\r\n\r\n this._frameId++;\r\n this._defaultFrameBufferCleared = false;\r\n this._checkCameraRenderTarget(this.activeCamera);\r\n if (this.activeCameras?.length) {\r\n this.activeCameras.forEach(this._checkCameraRenderTarget);\r\n }\r\n\r\n // Register components that have been associated lately to the scene.\r\n this._registerTransientComponents();\r\n\r\n this._activeParticles.fetchNewFrame();\r\n this._totalVertices.fetchNewFrame();\r\n this._activeIndices.fetchNewFrame();\r\n this._activeBones.fetchNewFrame();\r\n this._meshesForIntersections.reset();\r\n this.resetCachedMaterial();\r\n\r\n this.onBeforeAnimationsObservable.notifyObservers(this);\r\n\r\n // Actions\r\n if (this.actionManager) {\r\n this.actionManager.processTrigger(Constants.ACTION_OnEveryFrameTrigger);\r\n }\r\n\r\n // Animations\r\n if (!ignoreAnimations) {\r\n this.animate();\r\n }\r\n\r\n // Before camera update steps\r\n for (const step of this._beforeCameraUpdateStage) {\r\n step.action();\r\n }\r\n\r\n // Update Cameras\r\n if (updateCameras) {\r\n if (this.activeCameras && this.activeCameras.length > 0) {\r\n for (let cameraIndex = 0; cameraIndex < this.activeCameras.length; cameraIndex++) {\r\n const camera = this.activeCameras[cameraIndex];\r\n camera.update();\r\n if (camera.cameraRigMode !== Constants.RIG_MODE_NONE) {\r\n // rig cameras\r\n for (let index = 0; index < camera._rigCameras.length; index++) {\r\n camera._rigCameras[index].update();\r\n }\r\n }\r\n }\r\n } else if (this.activeCamera) {\r\n this.activeCamera.update();\r\n if (this.activeCamera.cameraRigMode !== Constants.RIG_MODE_NONE) {\r\n // rig cameras\r\n for (let index = 0; index < this.activeCamera._rigCameras.length; index++) {\r\n this.activeCamera._rigCameras[index].update();\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Before render\r\n this.onBeforeRenderObservable.notifyObservers(this);\r\n\r\n const engine = this.getEngine();\r\n\r\n // Customs render targets\r\n this.onBeforeRenderTargetsRenderObservable.notifyObservers(this);\r\n\r\n const currentActiveCamera = this.activeCameras?.length ? this.activeCameras[0] : this.activeCamera;\r\n if (this.renderTargetsEnabled) {\r\n Tools.StartPerformanceCounter(\"Custom render targets\", this.customRenderTargets.length > 0);\r\n this._intermediateRendering = true;\r\n for (let customIndex = 0; customIndex < this.customRenderTargets.length; customIndex++) {\r\n const renderTarget = this.customRenderTargets[customIndex];\r\n if (renderTarget._shouldRender()) {\r\n this._renderId++;\r\n\r\n this.activeCamera = renderTarget.activeCamera || this.activeCamera;\r\n\r\n if (!this.activeCamera) {\r\n throw new Error(\"Active camera not set\");\r\n }\r\n\r\n // Viewport\r\n engine.setViewport(this.activeCamera.viewport);\r\n\r\n // Camera\r\n this.updateTransformMatrix();\r\n\r\n renderTarget.render(currentActiveCamera !== this.activeCamera, this.dumpNextRenderTargets);\r\n }\r\n }\r\n Tools.EndPerformanceCounter(\"Custom render targets\", this.customRenderTargets.length > 0);\r\n this._intermediateRendering = false;\r\n this._renderId++;\r\n }\r\n\r\n this._engine.currentRenderPassId = currentActiveCamera?.renderPassId ?? Constants.RENDERPASS_MAIN;\r\n\r\n // Restore back buffer\r\n this.activeCamera = currentActiveCamera;\r\n if (this._activeCamera && this._activeCamera.cameraRigMode !== Constants.RIG_MODE_CUSTOM && !this.prePass) {\r\n this._bindFrameBuffer(this._activeCamera, false);\r\n }\r\n this.onAfterRenderTargetsRenderObservable.notifyObservers(this);\r\n\r\n for (const step of this._beforeClearStage) {\r\n step.action();\r\n }\r\n\r\n // Clear\r\n this._clearFrameBuffer(this.activeCamera);\r\n\r\n // Collects render targets from external components.\r\n for (const step of this._gatherRenderTargetsStage) {\r\n step.action(this._renderTargets);\r\n }\r\n\r\n // Multi-cameras?\r\n if (this.activeCameras && this.activeCameras.length > 0) {\r\n for (let cameraIndex = 0; cameraIndex < this.activeCameras.length; cameraIndex++) {\r\n this._processSubCameras(this.activeCameras[cameraIndex], cameraIndex > 0);\r\n }\r\n } else {\r\n if (!this.activeCamera) {\r\n throw new Error(\"No camera defined\");\r\n }\r\n\r\n this._processSubCameras(this.activeCamera, !!this.activeCamera.outputRenderTarget);\r\n }\r\n\r\n // Intersection checks\r\n this._checkIntersections();\r\n\r\n // Executes the after render stage actions.\r\n for (const step of this._afterRenderStage) {\r\n step.action();\r\n }\r\n\r\n // After render\r\n if (this.afterRender) {\r\n this.afterRender();\r\n }\r\n\r\n this.onAfterRenderObservable.notifyObservers(this);\r\n\r\n // Cleaning\r\n if (this._toBeDisposed.length) {\r\n for (let index = 0; index < this._toBeDisposed.length; index++) {\r\n const data = this._toBeDisposed[index];\r\n if (data) {\r\n data.dispose();\r\n }\r\n }\r\n\r\n this._toBeDisposed.length = 0;\r\n }\r\n\r\n if (this.dumpNextRenderTargets) {\r\n this.dumpNextRenderTargets = false;\r\n }\r\n\r\n this._activeBones.addCount(0, true);\r\n this._activeIndices.addCount(0, true);\r\n this._activeParticles.addCount(0, true);\r\n\r\n this._engine.restoreDefaultFramebuffer();\r\n }\r\n\r\n /**\r\n * Freeze all materials\r\n * A frozen material will not be updatable but should be faster to render\r\n * Note: multimaterials will not be frozen, but their submaterials will\r\n */\r\n public freezeMaterials(): void {\r\n for (let i = 0; i < this.materials.length; i++) {\r\n this.materials[i].freeze();\r\n }\r\n }\r\n\r\n /**\r\n * Unfreeze all materials\r\n * A frozen material will not be updatable but should be faster to render\r\n */\r\n public unfreezeMaterials(): void {\r\n for (let i = 0; i < this.materials.length; i++) {\r\n this.materials[i].unfreeze();\r\n }\r\n }\r\n\r\n /**\r\n * Releases all held resources\r\n */\r\n public dispose(): void {\r\n if (this.isDisposed) {\r\n return;\r\n }\r\n\r\n this.beforeRender = null;\r\n this.afterRender = null;\r\n this.metadata = null;\r\n\r\n this.skeletons.length = 0;\r\n this.morphTargetManagers.length = 0;\r\n this._transientComponents.length = 0;\r\n this._isReadyForMeshStage.clear();\r\n this._beforeEvaluateActiveMeshStage.clear();\r\n this._evaluateSubMeshStage.clear();\r\n this._preActiveMeshStage.clear();\r\n this._cameraDrawRenderTargetStage.clear();\r\n this._beforeCameraDrawStage.clear();\r\n this._beforeRenderTargetDrawStage.clear();\r\n this._beforeRenderingGroupDrawStage.clear();\r\n this._beforeRenderingMeshStage.clear();\r\n this._afterRenderingMeshStage.clear();\r\n this._afterRenderingGroupDrawStage.clear();\r\n this._afterCameraDrawStage.clear();\r\n this._afterRenderTargetDrawStage.clear();\r\n this._afterRenderStage.clear();\r\n this._beforeCameraUpdateStage.clear();\r\n this._beforeClearStage.clear();\r\n this._gatherRenderTargetsStage.clear();\r\n this._gatherActiveCameraRenderTargetsStage.clear();\r\n this._pointerMoveStage.clear();\r\n this._pointerDownStage.clear();\r\n this._pointerUpStage.clear();\r\n\r\n this.importedMeshesFiles = [] as string[];\r\n\r\n if (this.stopAllAnimations) {\r\n // Ensures that no animatable notifies a callback that could start a new animation group, constantly adding new animatables to the active list...\r\n this._activeAnimatables.forEach((animatable) => {\r\n animatable.onAnimationEndObservable.clear();\r\n animatable.onAnimationEnd = null;\r\n });\r\n this.stopAllAnimations();\r\n }\r\n\r\n this.resetCachedMaterial();\r\n\r\n // Smart arrays\r\n if (this.activeCamera) {\r\n this.activeCamera._activeMeshes.dispose();\r\n this.activeCamera = null;\r\n }\r\n this.activeCameras = null;\r\n\r\n this._activeMeshes.dispose();\r\n this._renderingManager.dispose();\r\n this._processedMaterials.dispose();\r\n this._activeParticleSystems.dispose();\r\n this._activeSkeletons.dispose();\r\n this._softwareSkinnedMeshes.dispose();\r\n this._renderTargets.dispose();\r\n this._materialsRenderTargets.dispose();\r\n this._registeredForLateAnimationBindings.dispose();\r\n this._meshesForIntersections.dispose();\r\n this._toBeDisposed.length = 0;\r\n\r\n // Abort active requests\r\n const activeRequests = this._activeRequests.slice();\r\n for (const request of activeRequests) {\r\n request.abort();\r\n }\r\n this._activeRequests.length = 0;\r\n\r\n // Events\r\n try {\r\n this.onDisposeObservable.notifyObservers(this);\r\n } catch (e) {\r\n Logger.Error(\"An error occurred while calling onDisposeObservable!\", e);\r\n }\r\n\r\n this.detachControl();\r\n\r\n // Detach cameras\r\n const canvas = this._engine.getInputElement();\r\n\r\n if (canvas) {\r\n for (let index = 0; index < this.cameras.length; index++) {\r\n this.cameras[index].detachControl();\r\n }\r\n }\r\n\r\n // Release animation groups\r\n this._disposeList(this.animationGroups);\r\n\r\n // Release lights\r\n this._disposeList(this.lights);\r\n\r\n // Release meshes\r\n this._disposeList(this.meshes, (item) => item.dispose(true));\r\n this._disposeList(this.transformNodes, (item) => item.dispose(true));\r\n\r\n // Release cameras\r\n const cameras = this.cameras;\r\n this._disposeList(cameras);\r\n\r\n // Release materials\r\n if (this._defaultMaterial) {\r\n this._defaultMaterial.dispose();\r\n }\r\n this._disposeList(this.multiMaterials);\r\n this._disposeList(this.materials);\r\n\r\n // Release particles\r\n this._disposeList(this.particleSystems);\r\n\r\n // Release postProcesses\r\n this._disposeList(this.postProcesses);\r\n\r\n // Release textures\r\n this._disposeList(this.textures);\r\n\r\n // Release morph targets\r\n this._disposeList(this.morphTargetManagers);\r\n\r\n // Release UBO\r\n this._sceneUbo.dispose();\r\n\r\n if (this._multiviewSceneUbo) {\r\n this._multiviewSceneUbo.dispose();\r\n }\r\n\r\n // Post-processes\r\n this.postProcessManager.dispose();\r\n\r\n // Components\r\n this._disposeList(this._components);\r\n\r\n // Remove from engine\r\n let index = this._engine.scenes.indexOf(this);\r\n\r\n if (index > -1) {\r\n this._engine.scenes.splice(index, 1);\r\n }\r\n\r\n if (EngineStore._LastCreatedScene === this) {\r\n if (this._engine.scenes.length > 0) {\r\n EngineStore._LastCreatedScene = this._engine.scenes[this._engine.scenes.length - 1];\r\n } else {\r\n EngineStore._LastCreatedScene = null;\r\n }\r\n }\r\n\r\n index = this._engine._virtualScenes.indexOf(this);\r\n\r\n if (index > -1) {\r\n this._engine._virtualScenes.splice(index, 1);\r\n }\r\n\r\n this._engine.wipeCaches(true);\r\n this.onDisposeObservable.clear();\r\n this.onBeforeRenderObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onBeforeRenderTargetsRenderObservable.clear();\r\n this.onAfterRenderTargetsRenderObservable.clear();\r\n this.onAfterStepObservable.clear();\r\n this.onBeforeStepObservable.clear();\r\n this.onBeforeActiveMeshesEvaluationObservable.clear();\r\n this.onAfterActiveMeshesEvaluationObservable.clear();\r\n this.onBeforeParticlesRenderingObservable.clear();\r\n this.onAfterParticlesRenderingObservable.clear();\r\n this.onBeforeDrawPhaseObservable.clear();\r\n this.onAfterDrawPhaseObservable.clear();\r\n this.onBeforeAnimationsObservable.clear();\r\n this.onAfterAnimationsObservable.clear();\r\n this.onDataLoadedObservable.clear();\r\n this.onBeforeRenderingGroupObservable.clear();\r\n this.onAfterRenderingGroupObservable.clear();\r\n this.onMeshImportedObservable.clear();\r\n this.onBeforeCameraRenderObservable.clear();\r\n this.onAfterCameraRenderObservable.clear();\r\n this.onAfterRenderCameraObservable.clear();\r\n this.onReadyObservable.clear();\r\n this.onNewCameraAddedObservable.clear();\r\n this.onCameraRemovedObservable.clear();\r\n this.onNewLightAddedObservable.clear();\r\n this.onLightRemovedObservable.clear();\r\n this.onNewGeometryAddedObservable.clear();\r\n this.onGeometryRemovedObservable.clear();\r\n this.onNewTransformNodeAddedObservable.clear();\r\n this.onTransformNodeRemovedObservable.clear();\r\n this.onNewMeshAddedObservable.clear();\r\n this.onMeshRemovedObservable.clear();\r\n this.onNewSkeletonAddedObservable.clear();\r\n this.onSkeletonRemovedObservable.clear();\r\n this.onNewMaterialAddedObservable.clear();\r\n this.onNewMultiMaterialAddedObservable.clear();\r\n this.onMaterialRemovedObservable.clear();\r\n this.onMultiMaterialRemovedObservable.clear();\r\n this.onNewTextureAddedObservable.clear();\r\n this.onTextureRemovedObservable.clear();\r\n this.onPrePointerObservable.clear();\r\n this.onPointerObservable.clear();\r\n this.onPreKeyboardObservable.clear();\r\n this.onKeyboardObservable.clear();\r\n this.onActiveCameraChanged.clear();\r\n this.onScenePerformancePriorityChangedObservable.clear();\r\n this._isDisposed = true;\r\n }\r\n\r\n private _disposeList(items: T[], callback?: (item: T) => void): void {\r\n const itemsCopy = items.slice(0);\r\n callback = callback ?? ((item) => item.dispose());\r\n for (const item of itemsCopy) {\r\n callback(item);\r\n }\r\n items.length = 0;\r\n }\r\n\r\n /**\r\n * Gets if the scene is already disposed\r\n */\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * Call this function to reduce memory footprint of the scene.\r\n * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly)\r\n */\r\n public clearCachedVertexData(): void {\r\n for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) {\r\n const mesh = this.meshes[meshIndex];\r\n const geometry = (mesh).geometry;\r\n\r\n if (geometry) {\r\n geometry.clearCachedData();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This function will remove the local cached buffer data from texture.\r\n * It will save memory but will prevent the texture from being rebuilt\r\n */\r\n public cleanCachedTextureBuffer(): void {\r\n for (const baseTexture of this.textures) {\r\n const buffer = (baseTexture)._buffer;\r\n\r\n if (buffer) {\r\n (baseTexture)._buffer = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the world extend vectors with an optional filter\r\n *\r\n * @param filterPredicate the predicate - which meshes should be included when calculating the world size\r\n * @returns {{ min: Vector3; max: Vector3 }} min and max vectors\r\n */\r\n public getWorldExtends(filterPredicate?: (mesh: AbstractMesh) => boolean): { min: Vector3; max: Vector3 } {\r\n const min = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n const max = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n filterPredicate = filterPredicate || (() => true);\r\n this.meshes.filter(filterPredicate).forEach((mesh) => {\r\n mesh.computeWorldMatrix(true);\r\n\r\n if (!mesh.subMeshes || mesh.subMeshes.length === 0 || mesh.infiniteDistance) {\r\n return;\r\n }\r\n\r\n const boundingInfo = mesh.getBoundingInfo();\r\n\r\n const minBox = boundingInfo.boundingBox.minimumWorld;\r\n const maxBox = boundingInfo.boundingBox.maximumWorld;\r\n\r\n Vector3.CheckExtends(minBox, min, max);\r\n Vector3.CheckExtends(maxBox, min, max);\r\n });\r\n\r\n return {\r\n min: min,\r\n max: max,\r\n };\r\n }\r\n\r\n // Picking\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a ray that can be used to pick in the scene\r\n * @param x defines the x coordinate of the origin (on-screen)\r\n * @param y defines the y coordinate of the origin (on-screen)\r\n * @param world defines the world matrix to use if you want to pick in object space (instead of world space)\r\n * @param camera defines the camera to use for the picking\r\n * @param cameraViewSpace defines if picking will be done in view space (false by default)\r\n * @returns a Ray\r\n */\r\n public createPickingRay(x: number, y: number, world: Nullable, camera: Nullable, cameraViewSpace = false): Ray {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a ray that can be used to pick in the scene\r\n * @param x defines the x coordinate of the origin (on-screen)\r\n * @param y defines the y coordinate of the origin (on-screen)\r\n * @param world defines the world matrix to use if you want to pick in object space (instead of world space)\r\n * @param result defines the ray where to store the picking ray\r\n * @param camera defines the camera to use for the picking\r\n * @param cameraViewSpace defines if picking will be done in view space (false by default)\r\n * @param enableDistantPicking defines if picking should handle large values for mesh position/scaling (false by default)\r\n * @returns the current scene\r\n */\r\n public createPickingRayToRef(\r\n x: number,\r\n y: number,\r\n world: Nullable,\r\n result: Ray,\r\n camera: Nullable,\r\n cameraViewSpace = false,\r\n enableDistantPicking = false\r\n ): Scene {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a ray that can be used to pick in the scene\r\n * @param x defines the x coordinate of the origin (on-screen)\r\n * @param y defines the y coordinate of the origin (on-screen)\r\n * @param camera defines the camera to use for the picking\r\n * @returns a Ray\r\n */\r\n public createPickingRayInCameraSpace(x: number, y: number, camera?: Camera): Ray {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a ray that can be used to pick in the scene\r\n * @param x defines the x coordinate of the origin (on-screen)\r\n * @param y defines the y coordinate of the origin (on-screen)\r\n * @param result defines the ray where to store the picking ray\r\n * @param camera defines the camera to use for the picking\r\n * @returns the current scene\r\n */\r\n public createPickingRayInCameraSpaceToRef(x: number, y: number, result: Ray, camera?: Camera): Scene {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n /** @internal */\r\n public get _pickingAvailable(): boolean {\r\n return false;\r\n }\r\n\r\n /** @internal */\r\n public _registeredActions: number = 0;\r\n\r\n /** Launch a ray to try to pick a mesh in the scene\r\n * @param x position on screen\r\n * @param y position on screen\r\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns a PickingInfo\r\n */\r\n public pick(\r\n x: number,\r\n y: number,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n fastCheck?: boolean,\r\n camera?: Nullable,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): PickingInfo {\r\n const warn = _WarnImport(\"Ray\", true);\r\n if (warn) {\r\n Logger.Warn(warn);\r\n }\r\n // Dummy info if picking as not been imported\r\n return new PickingInfo();\r\n }\r\n\r\n /** Launch a ray to try to pick a mesh in the scene using only bounding information of the main mesh (not using submeshes)\r\n * @param x position on screen\r\n * @param y position on screen\r\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used\r\n * @returns a PickingInfo (Please note that some info will not be set like distance, bv, bu and everything that cannot be capture by only using bounding infos)\r\n */\r\n public pickWithBoundingInfo(x: number, y: number, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, camera?: Nullable): Nullable {\r\n const warn = _WarnImport(\"Ray\", true);\r\n if (warn) {\r\n Logger.Warn(warn);\r\n }\r\n // Dummy info if picking as not been imported\r\n return new PickingInfo();\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Use the given ray to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides,\r\n * irrespective of orientation.\r\n * @param ray The ray to use to pick meshes\r\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must have isPickable set to true\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns a PickingInfo\r\n */\r\n public pickWithRay(ray: Ray, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Launch a ray to try to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides,\r\n * irrespective of orientation.\r\n * @param x X position on screen\r\n * @param y Y position on screen\r\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\r\n * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns an array of PickingInfo\r\n */\r\n public multiPick(x: number, y: number, predicate?: (mesh: AbstractMesh) => boolean, camera?: Camera, trianglePredicate?: TrianglePickingPredicate): Nullable {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Launch a ray to try to pick a mesh in the scene\r\n * @param ray Ray to use\r\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns an array of PickingInfo\r\n */\r\n public multiPickWithRay(ray: Ray, predicate?: (mesh: AbstractMesh) => boolean, trianglePredicate?: TrianglePickingPredicate): Nullable {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n /**\r\n * Force the value of meshUnderPointer\r\n * @param mesh defines the mesh to use\r\n * @param pointerId optional pointer id when using more than one pointer\r\n * @param pickResult optional pickingInfo data used to find mesh\r\n */\r\n public setPointerOverMesh(mesh: Nullable, pointerId?: number, pickResult?: Nullable): void {\r\n this._inputManager.setPointerOverMesh(mesh, pointerId, pickResult);\r\n }\r\n\r\n /**\r\n * Gets the mesh under the pointer\r\n * @returns a Mesh or null if no mesh is under the pointer\r\n */\r\n public getPointerOverMesh(): Nullable {\r\n return this._inputManager.getPointerOverMesh();\r\n }\r\n\r\n // Misc.\r\n /** @internal */\r\n public _rebuildGeometries(): void {\r\n for (const geometry of this.geometries) {\r\n geometry._rebuild();\r\n }\r\n\r\n for (const mesh of this.meshes) {\r\n mesh._rebuild();\r\n }\r\n\r\n if (this.postProcessManager) {\r\n this.postProcessManager._rebuild();\r\n }\r\n\r\n for (const component of this._components) {\r\n component.rebuild();\r\n }\r\n\r\n for (const system of this.particleSystems) {\r\n system.rebuild();\r\n }\r\n\r\n if (this.spriteManagers) {\r\n for (const spriteMgr of this.spriteManagers) {\r\n spriteMgr.rebuild();\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _rebuildTextures(): void {\r\n for (const texture of this.textures) {\r\n texture._rebuild(true);\r\n }\r\n\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Get from a list of objects by tags\r\n * @param list the list of objects to use\r\n * @param tagsQuery the query to use\r\n * @param filter a predicate to filter for tags\r\n * @returns\r\n */\r\n private _getByTags(list: any[], tagsQuery: string, filter?: (item: any) => boolean): any[] {\r\n if (tagsQuery === undefined) {\r\n // returns the complete list (could be done with Tags.MatchesQuery but no need to have a for-loop here)\r\n return list;\r\n }\r\n\r\n const listByTags = [];\r\n\r\n for (const i in list) {\r\n const item = list[i];\r\n if (Tags && Tags.MatchesQuery(item, tagsQuery) && (!filter || filter(item))) {\r\n listByTags.push(item);\r\n }\r\n }\r\n\r\n return listByTags;\r\n }\r\n\r\n /**\r\n * Get a list of meshes by tags\r\n * @param tagsQuery defines the tags query to use\r\n * @param filter defines a predicate used to filter results\r\n * @returns an array of Mesh\r\n */\r\n public getMeshesByTags(tagsQuery: string, filter?: (mesh: AbstractMesh) => boolean): AbstractMesh[] {\r\n return this._getByTags(this.meshes, tagsQuery, filter);\r\n }\r\n\r\n /**\r\n * Get a list of cameras by tags\r\n * @param tagsQuery defines the tags query to use\r\n * @param filter defines a predicate used to filter results\r\n * @returns an array of Camera\r\n */\r\n public getCamerasByTags(tagsQuery: string, filter?: (camera: Camera) => boolean): Camera[] {\r\n return this._getByTags(this.cameras, tagsQuery, filter);\r\n }\r\n\r\n /**\r\n * Get a list of lights by tags\r\n * @param tagsQuery defines the tags query to use\r\n * @param filter defines a predicate used to filter results\r\n * @returns an array of Light\r\n */\r\n public getLightsByTags(tagsQuery: string, filter?: (light: Light) => boolean): Light[] {\r\n return this._getByTags(this.lights, tagsQuery, filter);\r\n }\r\n\r\n /**\r\n * Get a list of materials by tags\r\n * @param tagsQuery defines the tags query to use\r\n * @param filter defines a predicate used to filter results\r\n * @returns an array of Material\r\n */\r\n public getMaterialByTags(tagsQuery: string, filter?: (material: Material) => boolean): Material[] {\r\n return this._getByTags(this.materials, tagsQuery, filter).concat(this._getByTags(this.multiMaterials, tagsQuery, filter));\r\n }\r\n\r\n /**\r\n * Get a list of transform nodes by tags\r\n * @param tagsQuery defines the tags query to use\r\n * @param filter defines a predicate used to filter results\r\n * @returns an array of TransformNode\r\n */\r\n public getTransformNodesByTags(tagsQuery: string, filter?: (transform: TransformNode) => boolean): TransformNode[] {\r\n return this._getByTags(this.transformNodes, tagsQuery, filter);\r\n }\r\n\r\n /**\r\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\r\n * This allowed control for front to back rendering or reversly depending of the special needs.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\r\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\r\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\r\n */\r\n public setRenderingOrder(\r\n renderingGroupId: number,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ): void {\r\n this._renderingManager.setRenderingOrder(renderingGroupId, opaqueSortCompareFn, alphaTestSortCompareFn, transparentSortCompareFn);\r\n }\r\n\r\n /**\r\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\r\n * @param depth Automatically clears depth between groups if true and autoClear is true.\r\n * @param stencil Automatically clears stencil between groups if true and autoClear is true.\r\n */\r\n public setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean, depth = true, stencil = true): void {\r\n this._renderingManager.setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil, depth, stencil);\r\n }\r\n\r\n /**\r\n * Gets the current auto clear configuration for one rendering group of the rendering\r\n * manager.\r\n * @param index the rendering group index to get the information for\r\n * @returns The auto clear setup for the requested rendering group\r\n */\r\n public getAutoClearDepthStencilSetup(index: number): IRenderingManagerAutoClearSetup {\r\n return this._renderingManager.getAutoClearDepthStencilSetup(index);\r\n }\r\n\r\n private _blockMaterialDirtyMechanism = false;\r\n\r\n /** @internal */\r\n public _forceBlockMaterialDirtyMechanism(value: boolean) {\r\n this._blockMaterialDirtyMechanism = value;\r\n }\r\n\r\n /** Gets or sets a boolean blocking all the calls to markAllMaterialsAsDirty (ie. the materials won't be updated if they are out of sync) */\r\n public get blockMaterialDirtyMechanism(): boolean {\r\n return this._blockMaterialDirtyMechanism;\r\n }\r\n\r\n public set blockMaterialDirtyMechanism(value: boolean) {\r\n if (this._blockMaterialDirtyMechanism === value) {\r\n return;\r\n }\r\n\r\n this._blockMaterialDirtyMechanism = value;\r\n\r\n if (!value) {\r\n // Do a complete update\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_AllDirtyFlag);\r\n }\r\n }\r\n\r\n /**\r\n * Will flag all materials as dirty to trigger new shader compilation\r\n * @param flag defines the flag used to specify which material part must be marked as dirty\r\n * @param predicate If not null, it will be used to specify if a material has to be marked as dirty\r\n */\r\n public markAllMaterialsAsDirty(flag: number, predicate?: (mat: Material) => boolean): void {\r\n if (this._blockMaterialDirtyMechanism) {\r\n return;\r\n }\r\n\r\n for (const material of this.materials) {\r\n if (predicate && !predicate(material)) {\r\n continue;\r\n }\r\n material.markAsDirty(flag);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFile(\r\n fileOrUrl: File | string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n useOfflineSupport?: boolean,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n onOpened?: (request: WebRequest) => void\r\n ): IFileRequest {\r\n const request = LoadFile(fileOrUrl, onSuccess, onProgress, useOfflineSupport ? this.offlineProvider : undefined, useArrayBuffer, onError, onOpened);\r\n this._activeRequests.push(request);\r\n request.onCompleteObservable.add((request) => {\r\n this._activeRequests.splice(this._activeRequests.indexOf(request), 1);\r\n });\r\n return request;\r\n }\r\n\r\n public _loadFileAsync(\r\n fileOrUrl: File | string,\r\n onProgress?: (data: any) => void,\r\n useOfflineSupport?: boolean,\r\n useArrayBuffer?: false,\r\n onOpened?: (request: WebRequest) => void\r\n ): Promise;\r\n\r\n public _loadFileAsync(\r\n fileOrUrl: File | string,\r\n onProgress?: (data: any) => void,\r\n useOfflineSupport?: boolean,\r\n useArrayBuffer?: true,\r\n onOpened?: (request: WebRequest) => void\r\n ): Promise;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFileAsync(\r\n fileOrUrl: File | string,\r\n onProgress?: (data: any) => void,\r\n useOfflineSupport?: boolean,\r\n useArrayBuffer?: boolean,\r\n onOpened?: (request: WebRequest) => void\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n this._loadFile(\r\n fileOrUrl,\r\n (data) => {\r\n resolve(data);\r\n },\r\n onProgress,\r\n useOfflineSupport,\r\n useArrayBuffer,\r\n (request, exception) => {\r\n reject(exception);\r\n },\r\n onOpened\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _requestFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, request?: WebRequest) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n useOfflineSupport?: boolean,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: RequestFileError) => void,\r\n onOpened?: (request: WebRequest) => void\r\n ): IFileRequest {\r\n const request = RequestFile(url, onSuccess, onProgress, useOfflineSupport ? this.offlineProvider : undefined, useArrayBuffer, onError, onOpened);\r\n this._activeRequests.push(request);\r\n request.onCompleteObservable.add((request) => {\r\n this._activeRequests.splice(this._activeRequests.indexOf(request), 1);\r\n });\r\n return request;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _requestFileAsync(\r\n url: string,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n useOfflineSupport?: boolean,\r\n useArrayBuffer?: boolean,\r\n onOpened?: (request: WebRequest) => void\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n this._requestFile(\r\n url,\r\n (data) => {\r\n resolve(data);\r\n },\r\n onProgress,\r\n useOfflineSupport,\r\n useArrayBuffer,\r\n (error) => {\r\n reject(error);\r\n },\r\n onOpened\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _readFile(\r\n file: File,\r\n onSuccess: (data: string | ArrayBuffer) => void,\r\n onProgress?: (ev: ProgressEvent) => any,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: ReadFileError) => void\r\n ): IFileRequest {\r\n const request = ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError);\r\n this._activeRequests.push(request);\r\n request.onCompleteObservable.add((request) => {\r\n this._activeRequests.splice(this._activeRequests.indexOf(request), 1);\r\n });\r\n return request;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _readFileAsync(file: File, onProgress?: (ev: ProgressEvent) => any, useArrayBuffer?: boolean): Promise {\r\n return new Promise((resolve, reject) => {\r\n this._readFile(\r\n file,\r\n (data) => {\r\n resolve(data);\r\n },\r\n onProgress,\r\n useArrayBuffer,\r\n (error) => {\r\n reject(error);\r\n }\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Internal perfCollector instance used for sharing between inspector and playground.\r\n * Marked as protected to allow sharing between prototype extensions, but disallow access at toplevel.\r\n */\r\n protected _perfCollector: Nullable = null;\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * This method gets the performance collector belonging to the scene, which is generally shared with the inspector.\r\n * @returns the perf collector belonging to the scene.\r\n */\r\n public getPerfCollector(): PerformanceViewerCollector {\r\n throw _WarnImport(\"performanceViewerSceneExtension\");\r\n }\r\n\r\n // deprecated\r\n\r\n /**\r\n * Sets the active camera of the scene using its Id\r\n * @param id defines the camera's Id\r\n * @returns the new active camera or null if none found.\r\n * @deprecated Please use setActiveCameraById instead\r\n */\r\n setActiveCameraByID(id: string): Nullable {\r\n return this.setActiveCameraById(id);\r\n }\r\n /**\r\n * Get a material using its id\r\n * @param id defines the material's Id\r\n * @returns the material or null if none found.\r\n * @deprecated Please use getMaterialById instead\r\n */\r\n getMaterialByID(id: string): Nullable {\r\n return this.getMaterialById(id);\r\n }\r\n /**\r\n * Gets a the last added material using a given id\r\n * @param id defines the material's Id\r\n * @returns the last material with the given id or null if none found.\r\n * @deprecated Please use getLastMaterialById instead\r\n */\r\n getLastMaterialByID(id: string): Nullable {\r\n return this.getLastMaterialById(id);\r\n }\r\n\r\n /**\r\n * Get a texture using its unique id\r\n * @param uniqueId defines the texture's unique id\r\n * @returns the texture or null if none found.\r\n * @deprecated Please use getTextureByUniqueId instead\r\n */\r\n getTextureByUniqueID(uniqueId: number): Nullable {\r\n return this.getTextureByUniqueId(uniqueId);\r\n }\r\n /**\r\n * Gets a camera using its Id\r\n * @param id defines the Id to look for\r\n * @returns the camera or null if not found\r\n * @deprecated Please use getCameraById instead\r\n */\r\n getCameraByID(id: string): Nullable {\r\n return this.getCameraById(id);\r\n }\r\n /**\r\n * Gets a camera using its unique Id\r\n * @param uniqueId defines the unique Id to look for\r\n * @returns the camera or null if not found\r\n * @deprecated Please use getCameraByUniqueId instead\r\n */\r\n getCameraByUniqueID(uniqueId: number): Nullable {\r\n return this.getCameraByUniqueId(uniqueId);\r\n }\r\n /**\r\n * Gets a bone using its Id\r\n * @param id defines the bone's Id\r\n * @returns the bone or null if not found\r\n * @deprecated Please use getBoneById instead\r\n */\r\n getBoneByID(id: string): Nullable {\r\n return this.getBoneById(id);\r\n }\r\n /**\r\n * Gets a light node using its Id\r\n * @param id defines the light's Id\r\n * @returns the light or null if none found.\r\n * @deprecated Please use getLightById instead\r\n */\r\n getLightByID(id: string): Nullable {\r\n return this.getLightById(id);\r\n }\r\n /**\r\n * Gets a light node using its scene-generated unique Id\r\n * @param uniqueId defines the light's unique Id\r\n * @returns the light or null if none found.\r\n * @deprecated Please use getLightByUniqueId instead\r\n */\r\n getLightByUniqueID(uniqueId: number): Nullable {\r\n return this.getLightByUniqueId(uniqueId);\r\n }\r\n /**\r\n * Gets a particle system by Id\r\n * @param id defines the particle system Id\r\n * @returns the corresponding system or null if none found\r\n * @deprecated Please use getParticleSystemById instead\r\n */\r\n getParticleSystemByID(id: string): Nullable {\r\n return this.getParticleSystemById(id);\r\n }\r\n /**\r\n * Gets a geometry using its Id\r\n * @param id defines the geometry's Id\r\n * @returns the geometry or null if none found.\r\n * @deprecated Please use getGeometryById instead\r\n */\r\n getGeometryByID(id: string): Nullable {\r\n return this.getGeometryById(id);\r\n }\r\n /**\r\n * Gets the first added mesh found of a given Id\r\n * @param id defines the Id to search for\r\n * @returns the mesh found or null if not found at all\r\n * @deprecated Please use getMeshById instead\r\n */\r\n getMeshByID(id: string): Nullable {\r\n return this.getMeshById(id);\r\n }\r\n /**\r\n * Gets a mesh with its auto-generated unique Id\r\n * @param uniqueId defines the unique Id to search for\r\n * @returns the found mesh or null if not found at all.\r\n * @deprecated Please use getMeshByUniqueId instead\r\n */\r\n getMeshByUniqueID(uniqueId: number): Nullable {\r\n return this.getMeshByUniqueId(uniqueId);\r\n }\r\n /**\r\n * Gets a the last added mesh using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found mesh or null if not found at all.\r\n * @deprecated Please use getLastMeshById instead\r\n */\r\n getLastMeshByID(id: string): Nullable {\r\n return this.getLastMeshById(id);\r\n }\r\n /**\r\n * Gets a list of meshes using their Id\r\n * @param id defines the Id to search for\r\n * @returns a list of meshes\r\n * @deprecated Please use getMeshesById instead\r\n */\r\n getMeshesByID(id: string): Array {\r\n return this.getMeshesById(id);\r\n }\r\n /**\r\n * Gets the first added transform node found of a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found transform node or null if not found at all.\r\n * @deprecated Please use getTransformNodeById instead\r\n */\r\n getTransformNodeByID(id: string): Nullable {\r\n return this.getTransformNodeById(id);\r\n }\r\n /**\r\n * Gets a transform node with its auto-generated unique Id\r\n * @param uniqueId defines the unique Id to search for\r\n * @returns the found transform node or null if not found at all.\r\n * @deprecated Please use getTransformNodeByUniqueId instead\r\n */\r\n getTransformNodeByUniqueID(uniqueId: number): Nullable {\r\n return this.getTransformNodeByUniqueId(uniqueId);\r\n }\r\n /**\r\n * Gets a list of transform nodes using their Id\r\n * @param id defines the Id to search for\r\n * @returns a list of transform nodes\r\n * @deprecated Please use getTransformNodesById instead\r\n */\r\n getTransformNodesByID(id: string): Array {\r\n return this.getTransformNodesById(id);\r\n }\r\n /**\r\n * Gets a node (Mesh, Camera, Light) using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found node or null if not found at all\r\n * @deprecated Please use getNodeById instead\r\n */\r\n getNodeByID(id: string): Nullable {\r\n return this.getNodeById(id);\r\n }\r\n /**\r\n * Gets a the last added node (Mesh, Camera, Light) using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found node or null if not found at all\r\n * @deprecated Please use getLastEntryById instead\r\n */\r\n getLastEntryByID(id: string): Nullable {\r\n return this.getLastEntryById(id);\r\n }\r\n /**\r\n * Gets a skeleton using a given Id (if many are found, this function will pick the last one)\r\n * @param id defines the Id to search for\r\n * @returns the found skeleton or null if not found at all.\r\n * @deprecated Please use getLastSkeletonById instead\r\n */\r\n getLastSkeletonByID(id: string): Nullable {\r\n return this.getLastSkeletonById(id);\r\n }\r\n}\r\n", "import { Vector3 } from \"./math.vector\";\r\n\r\n/** Defines supported spaces */\r\nexport enum Space {\r\n /** Local (object) space */\r\n LOCAL = 0,\r\n /** World space */\r\n WORLD = 1,\r\n /** Bone space */\r\n BONE = 2,\r\n}\r\n\r\n/** Defines the 3 main axes */\r\nexport class Axis {\r\n /** X axis */\r\n public static X: Vector3 = new Vector3(1.0, 0.0, 0.0);\r\n /** Y axis */\r\n public static Y: Vector3 = new Vector3(0.0, 1.0, 0.0);\r\n /** Z axis */\r\n public static Z: Vector3 = new Vector3(0.0, 0.0, 1.0);\r\n}\r\n\r\n/**\r\n * Defines cartesian components.\r\n */\r\nexport enum Coordinate {\r\n /** X axis */\r\n X,\r\n /** Y axis */\r\n Y,\r\n /** Z axis */\r\n Z,\r\n}\r\n", "import type { DeepImmutable, Nullable } from \"../types\";\r\nimport { Scalar } from \"./math.scalar\";\r\nimport { Vector2, Vector3, Quaternion, Matrix } from \"./math.vector\";\r\nimport type { Vector4 } from \"./math.vector\";\r\nimport { Epsilon } from \"./math.constants\";\r\n\r\n/**\r\n * Defines potential orientation for back face culling\r\n */\r\nexport enum Orientation {\r\n /**\r\n * Clockwise\r\n */\r\n CW = 0,\r\n /** Counter clockwise */\r\n CCW = 1,\r\n}\r\n\r\n/** Class used to represent a Bezier curve */\r\nexport class BezierCurve {\r\n /**\r\n * Returns the cubic Bezier interpolated value (float) at \"t\" (float) from the given x1, y1, x2, y2 floats\r\n * @param t defines the time\r\n * @param x1 defines the left coordinate on X axis\r\n * @param y1 defines the left coordinate on Y axis\r\n * @param x2 defines the right coordinate on X axis\r\n * @param y2 defines the right coordinate on Y axis\r\n * @returns the interpolated value\r\n */\r\n public static Interpolate(t: number, x1: number, y1: number, x2: number, y2: number): number {\r\n // Extract X (which is equal to time here)\r\n const f0 = 1 - 3 * x2 + 3 * x1;\r\n const f1 = 3 * x2 - 6 * x1;\r\n const f2 = 3 * x1;\r\n\r\n let refinedT = t;\r\n for (let i = 0; i < 5; i++) {\r\n const refinedT2 = refinedT * refinedT;\r\n const refinedT3 = refinedT2 * refinedT;\r\n\r\n const x = f0 * refinedT3 + f1 * refinedT2 + f2 * refinedT;\r\n const slope = 1.0 / (3.0 * f0 * refinedT2 + 2.0 * f1 * refinedT + f2);\r\n refinedT -= (x - t) * slope;\r\n refinedT = Math.min(1, Math.max(0, refinedT));\r\n }\r\n\r\n // Resolve cubic bezier for the given x\r\n return 3 * Math.pow(1 - refinedT, 2) * refinedT * y1 + 3 * (1 - refinedT) * Math.pow(refinedT, 2) * y2 + Math.pow(refinedT, 3);\r\n }\r\n}\r\n\r\n/**\r\n * Defines angle representation\r\n */\r\nexport class Angle {\r\n private _radians: number;\r\n\r\n /**\r\n * Creates an Angle object of \"radians\" radians (float).\r\n * @param radians the angle in radians\r\n */\r\n constructor(radians: number) {\r\n this._radians = radians;\r\n if (this._radians < 0.0) {\r\n this._radians += 2.0 * Math.PI;\r\n }\r\n }\r\n\r\n /**\r\n * Get value in degrees\r\n * @returns the Angle value in degrees (float)\r\n */\r\n public degrees() {\r\n return (this._radians * 180.0) / Math.PI;\r\n }\r\n\r\n /**\r\n * Get value in radians\r\n * @returns the Angle value in radians (float)\r\n */\r\n public radians() {\r\n return this._radians;\r\n }\r\n\r\n /**\r\n * Gets a new Angle object with a value of the angle (in radians) between the line connecting the two points and the x-axis\r\n * @param a defines first point as the origin\r\n * @param b defines point\r\n * @returns a new Angle\r\n */\r\n public static BetweenTwoPoints(a: DeepImmutable, b: DeepImmutable): Angle {\r\n const delta = b.subtract(a);\r\n const theta = Math.atan2(delta.y, delta.x);\r\n return new Angle(theta);\r\n }\r\n\r\n /**\r\n * Gets the angle between the two vectors\r\n * @param a defines first vector\r\n * @param b defines vector\r\n * @returns Returns an new Angle between 0 and PI\r\n */\r\n public static BetweenTwoVectors(a: DeepImmutable, b: DeepImmutable): Angle {\r\n let product = a.lengthSquared() * b.lengthSquared();\r\n if (product === 0) return new Angle(Math.PI / 2);\r\n product = Math.sqrt(product);\r\n let cosVal = a.dot(b as any) / product;\r\n cosVal = Scalar.Clamp(cosVal, -1, 1);\r\n const angle = Math.acos(cosVal);\r\n return new Angle(angle);\r\n }\r\n\r\n /**\r\n * Gets a new Angle object from the given float in radians\r\n * @param radians defines the angle value in radians\r\n * @returns a new Angle\r\n */\r\n public static FromRadians(radians: number): Angle {\r\n return new Angle(radians);\r\n }\r\n /**\r\n * Gets a new Angle object from the given float in degrees\r\n * @param degrees defines the angle value in degrees\r\n * @returns a new Angle\r\n */\r\n public static FromDegrees(degrees: number): Angle {\r\n return new Angle((degrees * Math.PI) / 180.0);\r\n }\r\n}\r\n\r\n/**\r\n * This represents an arc in a 2d space.\r\n */\r\nexport class Arc2 {\r\n /**\r\n * Defines the center point of the arc.\r\n */\r\n public centerPoint: Vector2;\r\n /**\r\n * Defines the radius of the arc.\r\n */\r\n public radius: number;\r\n /**\r\n * Defines the angle of the arc (from mid point to end point).\r\n */\r\n public angle: Angle;\r\n /**\r\n * Defines the start angle of the arc (from start point to middle point).\r\n */\r\n public startAngle: Angle;\r\n /**\r\n * Defines the orientation of the arc (clock wise/counter clock wise).\r\n */\r\n public orientation: Orientation;\r\n\r\n /**\r\n * Creates an Arc object from the three given points : start, middle and end.\r\n * @param startPoint Defines the start point of the arc\r\n * @param midPoint Defines the middle point of the arc\r\n * @param endPoint Defines the end point of the arc\r\n */\r\n constructor(\r\n /** Defines the start point of the arc */\r\n public startPoint: Vector2,\r\n /** Defines the mid point of the arc */\r\n public midPoint: Vector2,\r\n /** Defines the end point of the arc */\r\n public endPoint: Vector2\r\n ) {\r\n const temp = Math.pow(midPoint.x, 2) + Math.pow(midPoint.y, 2);\r\n const startToMid = (Math.pow(startPoint.x, 2) + Math.pow(startPoint.y, 2) - temp) / 2;\r\n const midToEnd = (temp - Math.pow(endPoint.x, 2) - Math.pow(endPoint.y, 2)) / 2;\r\n const det = (startPoint.x - midPoint.x) * (midPoint.y - endPoint.y) - (midPoint.x - endPoint.x) * (startPoint.y - midPoint.y);\r\n\r\n this.centerPoint = new Vector2(\r\n (startToMid * (midPoint.y - endPoint.y) - midToEnd * (startPoint.y - midPoint.y)) / det,\r\n ((startPoint.x - midPoint.x) * midToEnd - (midPoint.x - endPoint.x) * startToMid) / det\r\n );\r\n\r\n this.radius = this.centerPoint.subtract(this.startPoint).length();\r\n\r\n this.startAngle = Angle.BetweenTwoPoints(this.centerPoint, this.startPoint);\r\n\r\n const a1 = this.startAngle.degrees();\r\n let a2 = Angle.BetweenTwoPoints(this.centerPoint, this.midPoint).degrees();\r\n let a3 = Angle.BetweenTwoPoints(this.centerPoint, this.endPoint).degrees();\r\n\r\n // angles correction\r\n if (a2 - a1 > +180.0) {\r\n a2 -= 360.0;\r\n }\r\n if (a2 - a1 < -180.0) {\r\n a2 += 360.0;\r\n }\r\n if (a3 - a2 > +180.0) {\r\n a3 -= 360.0;\r\n }\r\n if (a3 - a2 < -180.0) {\r\n a3 += 360.0;\r\n }\r\n\r\n this.orientation = a2 - a1 < 0 ? Orientation.CW : Orientation.CCW;\r\n this.angle = Angle.FromDegrees(this.orientation === Orientation.CW ? a1 - a3 : a3 - a1);\r\n }\r\n}\r\n\r\n/**\r\n * Represents a 2D path made up of multiple 2D points\r\n */\r\nexport class Path2 {\r\n private _points = new Array();\r\n private _length = 0.0;\r\n\r\n /**\r\n * If the path start and end point are the same\r\n */\r\n public closed = false;\r\n\r\n /**\r\n * Creates a Path2 object from the starting 2D coordinates x and y.\r\n * @param x the starting points x value\r\n * @param y the starting points y value\r\n */\r\n constructor(x: number, y: number) {\r\n this._points.push(new Vector2(x, y));\r\n }\r\n\r\n /**\r\n * Adds a new segment until the given coordinates (x, y) to the current Path2.\r\n * @param x the added points x value\r\n * @param y the added points y value\r\n * @returns the updated Path2.\r\n */\r\n public addLineTo(x: number, y: number): Path2 {\r\n if (this.closed) {\r\n return this;\r\n }\r\n const newPoint = new Vector2(x, y);\r\n const previousPoint = this._points[this._points.length - 1];\r\n this._points.push(newPoint);\r\n this._length += newPoint.subtract(previousPoint).length();\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds _numberOfSegments_ segments according to the arc definition (middle point coordinates, end point coordinates, the arc start point being the current Path2 last point) to the current Path2.\r\n * @param midX middle point x value\r\n * @param midY middle point y value\r\n * @param endX end point x value\r\n * @param endY end point y value\r\n * @param numberOfSegments (default: 36)\r\n * @returns the updated Path2.\r\n */\r\n public addArcTo(midX: number, midY: number, endX: number, endY: number, numberOfSegments = 36): Path2 {\r\n if (this.closed) {\r\n return this;\r\n }\r\n const startPoint = this._points[this._points.length - 1];\r\n const midPoint = new Vector2(midX, midY);\r\n const endPoint = new Vector2(endX, endY);\r\n\r\n const arc = new Arc2(startPoint, midPoint, endPoint);\r\n\r\n let increment = arc.angle.radians() / numberOfSegments;\r\n if (arc.orientation === Orientation.CW) {\r\n increment *= -1;\r\n }\r\n let currentAngle = arc.startAngle.radians() + increment;\r\n\r\n for (let i = 0; i < numberOfSegments; i++) {\r\n const x = Math.cos(currentAngle) * arc.radius + arc.centerPoint.x;\r\n const y = Math.sin(currentAngle) * arc.radius + arc.centerPoint.y;\r\n this.addLineTo(x, y);\r\n currentAngle += increment;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds _numberOfSegments_ segments according to the quadratic curve definition to the current Path2.\r\n * @param controlX control point x value\r\n * @param controlY control point y value\r\n * @param endX end point x value\r\n * @param endY end point y value\r\n * @param numberOfSegments (default: 36)\r\n * @returns the updated Path2.\r\n */\r\n public addQuadraticCurveTo(controlX: number, controlY: number, endX: number, endY: number, numberOfSegments = 36): Path2 {\r\n if (this.closed) {\r\n return this;\r\n }\r\n\r\n const equation = (t: number, val0: number, val1: number, val2: number) => {\r\n const res = (1.0 - t) * (1.0 - t) * val0 + 2.0 * t * (1.0 - t) * val1 + t * t * val2;\r\n return res;\r\n };\r\n const startPoint = this._points[this._points.length - 1];\r\n for (let i = 0; i <= numberOfSegments; i++) {\r\n const step = i / numberOfSegments;\r\n const x = equation(step, startPoint.x, controlX, endX);\r\n const y = equation(step, startPoint.y, controlY, endY);\r\n this.addLineTo(x, y);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds _numberOfSegments_ segments according to the bezier curve definition to the current Path2.\r\n * @param originTangentX tangent vector at the origin point x value\r\n * @param originTangentY tangent vector at the origin point y value\r\n * @param destinationTangentX tangent vector at the destination point x value\r\n * @param destinationTangentY tangent vector at the destination point y value\r\n * @param endX end point x value\r\n * @param endY end point y value\r\n * @param numberOfSegments (default: 36)\r\n * @returns the updated Path2.\r\n */\r\n public addBezierCurveTo(\r\n originTangentX: number,\r\n originTangentY: number,\r\n destinationTangentX: number,\r\n destinationTangentY: number,\r\n endX: number,\r\n endY: number,\r\n numberOfSegments = 36\r\n ): Path2 {\r\n if (this.closed) {\r\n return this;\r\n }\r\n\r\n const equation = (t: number, val0: number, val1: number, val2: number, val3: number) => {\r\n const res = (1.0 - t) * (1.0 - t) * (1.0 - t) * val0 + 3.0 * t * (1.0 - t) * (1.0 - t) * val1 + 3.0 * t * t * (1.0 - t) * val2 + t * t * t * val3;\r\n return res;\r\n };\r\n const startPoint = this._points[this._points.length - 1];\r\n for (let i = 0; i <= numberOfSegments; i++) {\r\n const step = i / numberOfSegments;\r\n const x = equation(step, startPoint.x, originTangentX, destinationTangentX, endX);\r\n const y = equation(step, startPoint.y, originTangentY, destinationTangentY, endY);\r\n this.addLineTo(x, y);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Defines if a given point is inside the polygon defines by the path\r\n * @param point defines the point to test\r\n * @returns true if the point is inside\r\n */\r\n public isPointInside(point: Vector2) {\r\n let isInside = false;\r\n const count = this._points.length;\r\n for (let p = count - 1, q = 0; q < count; p = q++) {\r\n let edgeLow = this._points[p];\r\n let edgeHigh = this._points[q];\r\n\r\n let edgeDx = edgeHigh.x - edgeLow.x;\r\n let edgeDy = edgeHigh.y - edgeLow.y;\r\n\r\n if (Math.abs(edgeDy) > Number.EPSILON) {\r\n // Not parallel\r\n if (edgeDy < 0) {\r\n edgeLow = this._points[q];\r\n edgeDx = -edgeDx;\r\n edgeHigh = this._points[p];\r\n edgeDy = -edgeDy;\r\n }\r\n\r\n if (point.y < edgeLow.y || point.y > edgeHigh.y) {\r\n continue;\r\n }\r\n\r\n if (point.y === edgeLow.y && point.x === edgeLow.x) {\r\n return true;\r\n } else {\r\n const perpEdge = edgeDy * (point.x - edgeLow.x) - edgeDx * (point.y - edgeLow.y);\r\n if (perpEdge === 0) {\r\n return true;\r\n }\r\n if (perpEdge < 0) {\r\n continue;\r\n }\r\n isInside = !isInside;\r\n }\r\n } else {\r\n // parallel or collinear\r\n if (point.y !== edgeLow.y) {\r\n continue;\r\n }\r\n\r\n if ((edgeHigh.x <= point.x && point.x <= edgeLow.x) || (edgeLow.x <= point.x && point.x <= edgeHigh.x)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return isInside;\r\n }\r\n\r\n /**\r\n * Closes the Path2.\r\n * @returns the Path2.\r\n */\r\n public close(): Path2 {\r\n this.closed = true;\r\n return this;\r\n }\r\n /**\r\n * Gets the sum of the distance between each sequential point in the path\r\n * @returns the Path2 total length (float).\r\n */\r\n public length(): number {\r\n let result = this._length;\r\n\r\n if (this.closed) {\r\n const lastPoint = this._points[this._points.length - 1];\r\n const firstPoint = this._points[0];\r\n result += firstPoint.subtract(lastPoint).length();\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the area of the polygon defined by the path\r\n * @returns area value\r\n */\r\n public area(): number {\r\n const n = this._points.length;\r\n let value = 0.0;\r\n\r\n for (let p = n - 1, q = 0; q < n; p = q++) {\r\n value += this._points[p].x * this._points[q].y - this._points[q].x * this._points[p].y;\r\n }\r\n\r\n return value * 0.5;\r\n }\r\n\r\n /**\r\n * Gets the points which construct the path\r\n * @returns the Path2 internal array of points.\r\n */\r\n public getPoints(): Vector2[] {\r\n return this._points;\r\n }\r\n\r\n /**\r\n * Retrieves the point at the distance aways from the starting point\r\n * @param normalizedLengthPosition the length along the path to retrieve the point from\r\n * @returns a new Vector2 located at a percentage of the Path2 total length on this path.\r\n */\r\n public getPointAtLengthPosition(normalizedLengthPosition: number): Vector2 {\r\n if (normalizedLengthPosition < 0 || normalizedLengthPosition > 1) {\r\n return Vector2.Zero();\r\n }\r\n\r\n const lengthPosition = normalizedLengthPosition * this.length();\r\n\r\n let previousOffset = 0;\r\n for (let i = 0; i < this._points.length; i++) {\r\n const j = (i + 1) % this._points.length;\r\n\r\n const a = this._points[i];\r\n const b = this._points[j];\r\n const bToA = b.subtract(a);\r\n\r\n const nextOffset = bToA.length() + previousOffset;\r\n if (lengthPosition >= previousOffset && lengthPosition <= nextOffset) {\r\n const dir = bToA.normalize();\r\n const localOffset = lengthPosition - previousOffset;\r\n\r\n return new Vector2(a.x + dir.x * localOffset, a.y + dir.y * localOffset);\r\n }\r\n previousOffset = nextOffset;\r\n }\r\n\r\n return Vector2.Zero();\r\n }\r\n\r\n /**\r\n * Creates a new path starting from an x and y position\r\n * @param x starting x value\r\n * @param y starting y value\r\n * @returns a new Path2 starting at the coordinates (x, y).\r\n */\r\n public static StartingAt(x: number, y: number): Path2 {\r\n return new Path2(x, y);\r\n }\r\n}\r\n\r\n/**\r\n * Represents a 3D path made up of multiple 3D points\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/path3D\r\n */\r\nexport class Path3D {\r\n private _curve = new Array();\r\n private _distances = new Array();\r\n private _tangents = new Array();\r\n private _normals = new Array();\r\n private _binormals = new Array();\r\n private _raw: boolean;\r\n private _alignTangentsWithPath: boolean;\r\n\r\n // holds interpolated point data\r\n private readonly _pointAtData = {\r\n id: 0,\r\n point: Vector3.Zero(),\r\n previousPointArrayIndex: 0,\r\n\r\n position: 0,\r\n subPosition: 0,\r\n\r\n interpolateReady: false,\r\n interpolationMatrix: Matrix.Identity(),\r\n };\r\n\r\n /**\r\n * new Path3D(path, normal, raw)\r\n * Creates a Path3D. A Path3D is a logical math object, so not a mesh.\r\n * please read the description in the tutorial : https://doc.babylonjs.com/features/featuresDeepDive/mesh/path3D\r\n * @param path an array of Vector3, the curve axis of the Path3D\r\n * @param firstNormal (options) Vector3, the first wanted normal to the curve. Ex (0, 1, 0) for a vertical normal.\r\n * @param raw (optional, default false) : boolean, if true the returned Path3D isn't normalized. Useful to depict path acceleration or speed.\r\n * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path.\r\n */\r\n constructor(\r\n /**\r\n * an array of Vector3, the curve axis of the Path3D\r\n */\r\n public path: Vector3[],\r\n firstNormal: Nullable = null,\r\n raw?: boolean,\r\n alignTangentsWithPath = false\r\n ) {\r\n for (let p = 0; p < path.length; p++) {\r\n this._curve[p] = path[p].clone(); // hard copy\r\n }\r\n this._raw = raw || false;\r\n this._alignTangentsWithPath = alignTangentsWithPath;\r\n this._compute(firstNormal, alignTangentsWithPath);\r\n }\r\n\r\n /**\r\n * Returns the Path3D array of successive Vector3 designing its curve.\r\n * @returns the Path3D array of successive Vector3 designing its curve.\r\n */\r\n public getCurve(): Vector3[] {\r\n return this._curve;\r\n }\r\n\r\n /**\r\n * Returns the Path3D array of successive Vector3 designing its curve.\r\n * @returns the Path3D array of successive Vector3 designing its curve.\r\n */\r\n public getPoints(): Vector3[] {\r\n return this._curve;\r\n }\r\n\r\n /**\r\n * @returns the computed length (float) of the path.\r\n */\r\n public length() {\r\n return this._distances[this._distances.length - 1];\r\n }\r\n\r\n /**\r\n * Returns an array populated with tangent vectors on each Path3D curve point.\r\n * @returns an array populated with tangent vectors on each Path3D curve point.\r\n */\r\n public getTangents(): Vector3[] {\r\n return this._tangents;\r\n }\r\n\r\n /**\r\n * Returns an array populated with normal vectors on each Path3D curve point.\r\n * @returns an array populated with normal vectors on each Path3D curve point.\r\n */\r\n public getNormals(): Vector3[] {\r\n return this._normals;\r\n }\r\n\r\n /**\r\n * Returns an array populated with binormal vectors on each Path3D curve point.\r\n * @returns an array populated with binormal vectors on each Path3D curve point.\r\n */\r\n public getBinormals(): Vector3[] {\r\n return this._binormals;\r\n }\r\n\r\n /**\r\n * Returns an array populated with distances (float) of the i-th point from the first curve point.\r\n * @returns an array populated with distances (float) of the i-th point from the first curve point.\r\n */\r\n public getDistances(): number[] {\r\n return this._distances;\r\n }\r\n\r\n /**\r\n * Returns an interpolated point along this path\r\n * @param position the position of the point along this path, from 0.0 to 1.0\r\n * @returns a new Vector3 as the point\r\n */\r\n public getPointAt(position: number): Vector3 {\r\n return this._updatePointAtData(position).point;\r\n }\r\n\r\n /**\r\n * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path.\r\n * @param position the position of the point along this path, from 0.0 to 1.0\r\n * @param interpolated (optional, default false) : boolean, if true returns an interpolated tangent instead of the tangent of the previous path point.\r\n * @returns a tangent vector corresponding to the interpolated Path3D curve point, if not interpolated, the tangent is taken from the precomputed tangents array.\r\n */\r\n public getTangentAt(position: number, interpolated = false): Vector3 {\r\n this._updatePointAtData(position, interpolated);\r\n return interpolated ? Vector3.TransformCoordinates(Vector3.Forward(), this._pointAtData.interpolationMatrix) : this._tangents[this._pointAtData.previousPointArrayIndex];\r\n }\r\n\r\n /**\r\n * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path.\r\n * @param position the position of the point along this path, from 0.0 to 1.0\r\n * @param interpolated (optional, default false) : boolean, if true returns an interpolated normal instead of the normal of the previous path point.\r\n * @returns a normal vector corresponding to the interpolated Path3D curve point, if not interpolated, the normal is taken from the precomputed normals array.\r\n */\r\n public getNormalAt(position: number, interpolated = false): Vector3 {\r\n this._updatePointAtData(position, interpolated);\r\n return interpolated ? Vector3.TransformCoordinates(Vector3.Right(), this._pointAtData.interpolationMatrix) : this._normals[this._pointAtData.previousPointArrayIndex];\r\n }\r\n\r\n /**\r\n * Returns the binormal vector of an interpolated Path3D curve point at the specified position along this path.\r\n * @param position the position of the point along this path, from 0.0 to 1.0\r\n * @param interpolated (optional, default false) : boolean, if true returns an interpolated binormal instead of the binormal of the previous path point.\r\n * @returns a binormal vector corresponding to the interpolated Path3D curve point, if not interpolated, the binormal is taken from the precomputed binormals array.\r\n */\r\n public getBinormalAt(position: number, interpolated = false): Vector3 {\r\n this._updatePointAtData(position, interpolated);\r\n return interpolated ? Vector3.TransformCoordinates(Vector3.UpReadOnly, this._pointAtData.interpolationMatrix) : this._binormals[this._pointAtData.previousPointArrayIndex];\r\n }\r\n\r\n /**\r\n * Returns the distance (float) of an interpolated Path3D curve point at the specified position along this path.\r\n * @param position the position of the point along this path, from 0.0 to 1.0\r\n * @returns the distance of the interpolated Path3D curve point at the specified position along this path.\r\n */\r\n public getDistanceAt(position: number): number {\r\n return this.length() * position;\r\n }\r\n\r\n /**\r\n * Returns the array index of the previous point of an interpolated point along this path\r\n * @param position the position of the point to interpolate along this path, from 0.0 to 1.0\r\n * @returns the array index\r\n */\r\n public getPreviousPointIndexAt(position: number) {\r\n this._updatePointAtData(position);\r\n return this._pointAtData.previousPointArrayIndex;\r\n }\r\n\r\n /**\r\n * Returns the position of an interpolated point relative to the two path points it lies between, from 0.0 (point A) to 1.0 (point B)\r\n * @param position the position of the point to interpolate along this path, from 0.0 to 1.0\r\n * @returns the sub position\r\n */\r\n public getSubPositionAt(position: number) {\r\n this._updatePointAtData(position);\r\n return this._pointAtData.subPosition;\r\n }\r\n\r\n /**\r\n * Returns the position of the closest virtual point on this path to an arbitrary Vector3, from 0.0 to 1.0\r\n * @param target the vector of which to get the closest position to\r\n * @returns the position of the closest virtual point on this path to the target vector\r\n */\r\n public getClosestPositionTo(target: Vector3) {\r\n let smallestDistance = Number.MAX_VALUE;\r\n let closestPosition = 0.0;\r\n for (let i = 0; i < this._curve.length - 1; i++) {\r\n const point = this._curve[i + 0];\r\n const tangent = this._curve[i + 1].subtract(point).normalize();\r\n const subLength = this._distances[i + 1] - this._distances[i + 0];\r\n const subPosition = Math.min((Math.max(Vector3.Dot(tangent, target.subtract(point).normalize()), 0.0) * Vector3.Distance(point, target)) / subLength, 1.0);\r\n const distance = Vector3.Distance(point.add(tangent.scale(subPosition * subLength)), target);\r\n\r\n if (distance < smallestDistance) {\r\n smallestDistance = distance;\r\n closestPosition = (this._distances[i + 0] + subLength * subPosition) / this.length();\r\n }\r\n }\r\n return closestPosition;\r\n }\r\n\r\n /**\r\n * Returns a sub path (slice) of this path\r\n * @param start the position of the fist path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values\r\n * @param end the position of the last path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values\r\n * @returns a sub path (slice) of this path\r\n */\r\n public slice(start: number = 0.0, end: number = 1.0) {\r\n if (start < 0.0) {\r\n start = 1 - ((start * -1.0) % 1.0);\r\n }\r\n if (end < 0.0) {\r\n end = 1 - ((end * -1.0) % 1.0);\r\n }\r\n if (start > end) {\r\n const _start = start;\r\n start = end;\r\n end = _start;\r\n }\r\n const curvePoints = this.getCurve();\r\n\r\n const startPoint = this.getPointAt(start);\r\n let startIndex = this.getPreviousPointIndexAt(start);\r\n\r\n const endPoint = this.getPointAt(end);\r\n const endIndex = this.getPreviousPointIndexAt(end) + 1;\r\n\r\n const slicePoints: Vector3[] = [];\r\n if (start !== 0.0) {\r\n startIndex++;\r\n slicePoints.push(startPoint);\r\n }\r\n\r\n slicePoints.push(...curvePoints.slice(startIndex, endIndex));\r\n if (end !== 1.0 || start === 1.0) {\r\n slicePoints.push(endPoint);\r\n }\r\n return new Path3D(slicePoints, this.getNormalAt(start), this._raw, this._alignTangentsWithPath);\r\n }\r\n\r\n /**\r\n * Forces the Path3D tangent, normal, binormal and distance recomputation.\r\n * @param path path which all values are copied into the curves points\r\n * @param firstNormal which should be projected onto the curve\r\n * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path\r\n * @returns the same object updated.\r\n */\r\n public update(path: Vector3[], firstNormal: Nullable = null, alignTangentsWithPath = false): Path3D {\r\n for (let p = 0; p < path.length; p++) {\r\n this._curve[p].x = path[p].x;\r\n this._curve[p].y = path[p].y;\r\n this._curve[p].z = path[p].z;\r\n }\r\n this._compute(firstNormal, alignTangentsWithPath);\r\n return this;\r\n }\r\n\r\n // private function compute() : computes tangents, normals and binormals\r\n private _compute(firstNormal: Nullable, alignTangentsWithPath = false): void {\r\n const l = this._curve.length;\r\n\r\n if (l < 2) {\r\n return;\r\n }\r\n\r\n // first and last tangents\r\n this._tangents[0] = this._getFirstNonNullVector(0);\r\n if (!this._raw) {\r\n this._tangents[0].normalize();\r\n }\r\n this._tangents[l - 1] = this._curve[l - 1].subtract(this._curve[l - 2]);\r\n if (!this._raw) {\r\n this._tangents[l - 1].normalize();\r\n }\r\n\r\n // normals and binormals at first point : arbitrary vector with _normalVector()\r\n const tg0 = this._tangents[0];\r\n const pp0 = this._normalVector(tg0, firstNormal);\r\n this._normals[0] = pp0;\r\n if (!this._raw) {\r\n this._normals[0].normalize();\r\n }\r\n this._binormals[0] = Vector3.Cross(tg0, this._normals[0]);\r\n if (!this._raw) {\r\n this._binormals[0].normalize();\r\n }\r\n this._distances[0] = 0.0;\r\n\r\n // normals and binormals : next points\r\n let prev: Vector3; // previous vector (segment)\r\n let cur: Vector3; // current vector (segment)\r\n let curTang: Vector3; // current tangent\r\n // previous normal\r\n let prevNor: Vector3; // previous normal\r\n let prevBinor: Vector3; // previous binormal\r\n\r\n for (let i = 1; i < l; i++) {\r\n // tangents\r\n prev = this._getLastNonNullVector(i);\r\n if (i < l - 1) {\r\n cur = this._getFirstNonNullVector(i);\r\n this._tangents[i] = alignTangentsWithPath ? cur : prev.add(cur);\r\n this._tangents[i].normalize();\r\n }\r\n this._distances[i] = this._distances[i - 1] + this._curve[i].subtract(this._curve[i - 1]).length();\r\n\r\n // normals and binormals\r\n // http://www.cs.cmu.edu/afs/andrew/scs/cs/15-462/web/old/asst2camera.html\r\n curTang = this._tangents[i];\r\n prevBinor = this._binormals[i - 1];\r\n this._normals[i] = Vector3.Cross(prevBinor, curTang);\r\n if (!this._raw) {\r\n if (this._normals[i].length() === 0) {\r\n prevNor = this._normals[i - 1];\r\n this._normals[i] = prevNor.clone();\r\n } else {\r\n this._normals[i].normalize();\r\n }\r\n }\r\n this._binormals[i] = Vector3.Cross(curTang, this._normals[i]);\r\n if (!this._raw) {\r\n this._binormals[i].normalize();\r\n }\r\n }\r\n this._pointAtData.id = NaN;\r\n }\r\n\r\n // private function getFirstNonNullVector(index)\r\n // returns the first non null vector from index : curve[index + N].subtract(curve[index])\r\n private _getFirstNonNullVector(index: number): Vector3 {\r\n let i = 1;\r\n let nNVector: Vector3 = this._curve[index + i].subtract(this._curve[index]);\r\n while (nNVector.length() === 0 && index + i + 1 < this._curve.length) {\r\n i++;\r\n nNVector = this._curve[index + i].subtract(this._curve[index]);\r\n }\r\n return nNVector;\r\n }\r\n\r\n // private function getLastNonNullVector(index)\r\n // returns the last non null vector from index : curve[index].subtract(curve[index - N])\r\n private _getLastNonNullVector(index: number): Vector3 {\r\n let i = 1;\r\n let nLVector: Vector3 = this._curve[index].subtract(this._curve[index - i]);\r\n while (nLVector.length() === 0 && index > i + 1) {\r\n i++;\r\n nLVector = this._curve[index].subtract(this._curve[index - i]);\r\n }\r\n return nLVector;\r\n }\r\n\r\n // private function normalVector(v0, vt, va) :\r\n // returns an arbitrary point in the plane defined by the point v0 and the vector vt orthogonal to this plane\r\n // if va is passed, it returns the va projection on the plane orthogonal to vt at the point v0\r\n private _normalVector(vt: Vector3, va: Nullable): Vector3 {\r\n let normal0: Vector3;\r\n let tgl = vt.length();\r\n if (tgl === 0.0) {\r\n tgl = 1.0;\r\n }\r\n\r\n if (va === undefined || va === null) {\r\n let point: Vector3;\r\n if (!Scalar.WithinEpsilon(Math.abs(vt.y) / tgl, 1.0, Epsilon)) {\r\n // search for a point in the plane\r\n point = new Vector3(0.0, -1.0, 0.0);\r\n } else if (!Scalar.WithinEpsilon(Math.abs(vt.x) / tgl, 1.0, Epsilon)) {\r\n point = new Vector3(1.0, 0.0, 0.0);\r\n } else if (!Scalar.WithinEpsilon(Math.abs(vt.z) / tgl, 1.0, Epsilon)) {\r\n point = new Vector3(0.0, 0.0, 1.0);\r\n } else {\r\n point = Vector3.Zero();\r\n }\r\n normal0 = Vector3.Cross(vt, point);\r\n } else {\r\n normal0 = Vector3.Cross(vt, va);\r\n Vector3.CrossToRef(normal0, vt, normal0);\r\n }\r\n normal0.normalize();\r\n return normal0;\r\n }\r\n\r\n /**\r\n * Updates the point at data for an interpolated point along this curve\r\n * @param position the position of the point along this curve, from 0.0 to 1.0\r\n * @param interpolateTNB\r\n * @interpolateTNB whether to compute the interpolated tangent, normal and binormal\r\n * @returns the (updated) point at data\r\n */\r\n private _updatePointAtData(position: number, interpolateTNB: boolean = false) {\r\n // set an id for caching the result\r\n if (this._pointAtData.id === position) {\r\n if (!this._pointAtData.interpolateReady) {\r\n this._updateInterpolationMatrix();\r\n }\r\n return this._pointAtData;\r\n } else {\r\n this._pointAtData.id = position;\r\n }\r\n const curvePoints = this.getPoints();\r\n\r\n // clamp position between 0.0 and 1.0\r\n if (position <= 0.0) {\r\n return this._setPointAtData(0.0, 0.0, curvePoints[0], 0, interpolateTNB);\r\n } else if (position >= 1.0) {\r\n return this._setPointAtData(1.0, 1.0, curvePoints[curvePoints.length - 1], curvePoints.length - 1, interpolateTNB);\r\n }\r\n\r\n let previousPoint: Vector3 = curvePoints[0];\r\n let currentPoint: Vector3;\r\n let currentLength = 0.0;\r\n const targetLength = position * this.length();\r\n\r\n for (let i = 1; i < curvePoints.length; i++) {\r\n currentPoint = curvePoints[i];\r\n const distance = Vector3.Distance(previousPoint, currentPoint);\r\n currentLength += distance;\r\n if (currentLength === targetLength) {\r\n return this._setPointAtData(position, 1.0, currentPoint, i, interpolateTNB);\r\n } else if (currentLength > targetLength) {\r\n const toLength = currentLength - targetLength;\r\n const diff = toLength / distance;\r\n const dir = previousPoint.subtract(currentPoint);\r\n const point = currentPoint.add(dir.scaleInPlace(diff));\r\n return this._setPointAtData(position, 1 - diff, point, i - 1, interpolateTNB);\r\n }\r\n previousPoint = currentPoint;\r\n }\r\n return this._pointAtData;\r\n }\r\n\r\n /**\r\n * Updates the point at data from the specified parameters\r\n * @param position where along the path the interpolated point is, from 0.0 to 1.0\r\n * @param subPosition\r\n * @param point the interpolated point\r\n * @param parentIndex the index of an existing curve point that is on, or else positionally the first behind, the interpolated point\r\n * @param interpolateTNB whether to compute the interpolated tangent, normal and binormal\r\n * @returns the (updated) point at data\r\n */\r\n private _setPointAtData(position: number, subPosition: number, point: Vector3, parentIndex: number, interpolateTNB: boolean) {\r\n this._pointAtData.point = point;\r\n this._pointAtData.position = position;\r\n this._pointAtData.subPosition = subPosition;\r\n this._pointAtData.previousPointArrayIndex = parentIndex;\r\n this._pointAtData.interpolateReady = interpolateTNB;\r\n\r\n if (interpolateTNB) {\r\n this._updateInterpolationMatrix();\r\n }\r\n return this._pointAtData;\r\n }\r\n\r\n /**\r\n * Updates the point at interpolation matrix for the tangents, normals and binormals\r\n */\r\n private _updateInterpolationMatrix() {\r\n this._pointAtData.interpolationMatrix = Matrix.Identity();\r\n const parentIndex = this._pointAtData.previousPointArrayIndex;\r\n\r\n if (parentIndex !== this._tangents.length - 1) {\r\n const index = parentIndex + 1;\r\n\r\n const tangentFrom = this._tangents[parentIndex].clone();\r\n const normalFrom = this._normals[parentIndex].clone();\r\n const binormalFrom = this._binormals[parentIndex].clone();\r\n\r\n const tangentTo = this._tangents[index].clone();\r\n const normalTo = this._normals[index].clone();\r\n const binormalTo = this._binormals[index].clone();\r\n\r\n const quatFrom = Quaternion.RotationQuaternionFromAxis(normalFrom, binormalFrom, tangentFrom);\r\n const quatTo = Quaternion.RotationQuaternionFromAxis(normalTo, binormalTo, tangentTo);\r\n const quatAt = Quaternion.Slerp(quatFrom, quatTo, this._pointAtData.subPosition);\r\n\r\n quatAt.toRotationMatrix(this._pointAtData.interpolationMatrix);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * A Curve3 object is a logical object, so not a mesh, to handle curves in the 3D geometric space.\r\n * A Curve3 is designed from a series of successive Vector3.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves\r\n */\r\nexport class Curve3 {\r\n private _points: Vector3[];\r\n private _length: number = 0.0;\r\n\r\n /**\r\n * Returns a Curve3 object along a Quadratic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#quadratic-bezier-curve\r\n * @param v0 (Vector3) the origin point of the Quadratic Bezier\r\n * @param v1 (Vector3) the control point\r\n * @param v2 (Vector3) the end point of the Quadratic Bezier\r\n * @param nbPoints (integer) the wanted number of points in the curve\r\n * @returns the created Curve3\r\n */\r\n public static CreateQuadraticBezier(v0: DeepImmutable, v1: DeepImmutable, v2: DeepImmutable, nbPoints: number): Curve3 {\r\n nbPoints = nbPoints > 2 ? nbPoints : 3;\r\n const bez: Vector3[] = [];\r\n const equation = (t: number, val0: number, val1: number, val2: number) => {\r\n const res = (1.0 - t) * (1.0 - t) * val0 + 2.0 * t * (1.0 - t) * val1 + t * t * val2;\r\n return res;\r\n };\r\n for (let i = 0; i <= nbPoints; i++) {\r\n bez.push(new Vector3(equation(i / nbPoints, v0.x, v1.x, v2.x), equation(i / nbPoints, v0.y, v1.y, v2.y), equation(i / nbPoints, v0.z, v1.z, v2.z)));\r\n }\r\n return new Curve3(bez);\r\n }\r\n\r\n /**\r\n * Returns a Curve3 object along a Cubic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#cubic-bezier-curve\r\n * @param v0 (Vector3) the origin point of the Cubic Bezier\r\n * @param v1 (Vector3) the first control point\r\n * @param v2 (Vector3) the second control point\r\n * @param v3 (Vector3) the end point of the Cubic Bezier\r\n * @param nbPoints (integer) the wanted number of points in the curve\r\n * @returns the created Curve3\r\n */\r\n public static CreateCubicBezier(v0: DeepImmutable, v1: DeepImmutable, v2: DeepImmutable, v3: DeepImmutable, nbPoints: number): Curve3 {\r\n nbPoints = nbPoints > 3 ? nbPoints : 4;\r\n const bez: Vector3[] = [];\r\n const equation = (t: number, val0: number, val1: number, val2: number, val3: number) => {\r\n const res = (1.0 - t) * (1.0 - t) * (1.0 - t) * val0 + 3.0 * t * (1.0 - t) * (1.0 - t) * val1 + 3.0 * t * t * (1.0 - t) * val2 + t * t * t * val3;\r\n return res;\r\n };\r\n for (let i = 0; i <= nbPoints; i++) {\r\n bez.push(new Vector3(equation(i / nbPoints, v0.x, v1.x, v2.x, v3.x), equation(i / nbPoints, v0.y, v1.y, v2.y, v3.y), equation(i / nbPoints, v0.z, v1.z, v2.z, v3.z)));\r\n }\r\n return new Curve3(bez);\r\n }\r\n\r\n /**\r\n * Returns a Curve3 object along a Hermite Spline curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#hermite-spline\r\n * @param p1 (Vector3) the origin point of the Hermite Spline\r\n * @param t1 (Vector3) the tangent vector at the origin point\r\n * @param p2 (Vector3) the end point of the Hermite Spline\r\n * @param t2 (Vector3) the tangent vector at the end point\r\n * @param nSeg (integer) the number of curve segments or nSeg + 1 points in the array\r\n * @returns the created Curve3\r\n */\r\n public static CreateHermiteSpline(p1: DeepImmutable, t1: DeepImmutable, p2: DeepImmutable, t2: DeepImmutable, nSeg: number): Curve3 {\r\n const hermite: Vector3[] = [];\r\n const step = 1.0 / nSeg;\r\n for (let i = 0; i <= nSeg; i++) {\r\n hermite.push(Vector3.Hermite(p1, t1, p2, t2, i * step));\r\n }\r\n return new Curve3(hermite);\r\n }\r\n\r\n /**\r\n * Returns a Curve3 object along a CatmullRom Spline curve :\r\n * @param points (array of Vector3) the points the spline must pass through. At least, four points required\r\n * @param nbPoints (integer) the wanted number of points between each curve control points\r\n * @param closed (boolean) optional with default false, when true forms a closed loop from the points\r\n * @returns the created Curve3\r\n */\r\n public static CreateCatmullRomSpline(points: DeepImmutable, nbPoints: number, closed?: boolean): Curve3 {\r\n const catmullRom: Vector3[] = [];\r\n const step = 1.0 / nbPoints;\r\n let amount = 0.0;\r\n if (closed) {\r\n const pointsCount = points.length;\r\n for (let i = 0; i < pointsCount; i++) {\r\n amount = 0;\r\n for (let c = 0; c < nbPoints; c++) {\r\n catmullRom.push(\r\n Vector3.CatmullRom(points[i % pointsCount], points[(i + 1) % pointsCount], points[(i + 2) % pointsCount], points[(i + 3) % pointsCount], amount)\r\n );\r\n amount += step;\r\n }\r\n }\r\n catmullRom.push(catmullRom[0]);\r\n } else {\r\n const totalPoints: Vector3[] = [];\r\n totalPoints.push(points[0].clone());\r\n Array.prototype.push.apply(totalPoints, points);\r\n totalPoints.push(points[points.length - 1].clone());\r\n let i = 0;\r\n for (; i < totalPoints.length - 3; i++) {\r\n amount = 0;\r\n for (let c = 0; c < nbPoints; c++) {\r\n catmullRom.push(Vector3.CatmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount));\r\n amount += step;\r\n }\r\n }\r\n i--;\r\n catmullRom.push(Vector3.CatmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount));\r\n }\r\n return new Curve3(catmullRom);\r\n }\r\n\r\n /**\r\n * Returns a Curve3 object along an arc through three vector3 points:\r\n * The three points should not be colinear. When they are the Curve3 is empty.\r\n * @param first (Vector3) the first point the arc must pass through.\r\n * @param second (Vector3) the second point the arc must pass through.\r\n * @param third (Vector3) the third point the arc must pass through.\r\n * @param steps (number) the larger the number of steps the more detailed the arc.\r\n * @param closed (boolean) optional with default false, when true forms the chord from the first and third point\r\n * @param fullCircle Circle (boolean) optional with default false, when true forms the complete circle through the three points\r\n * @returns the created Curve3\r\n */\r\n public static ArcThru3Points(first: Vector3, second: Vector3, third: Vector3, steps: number = 32, closed: boolean = false, fullCircle: boolean = false): Curve3 {\r\n const arc: Vector3[] = [];\r\n const vec1 = second.subtract(first);\r\n const vec2 = third.subtract(second);\r\n const vec3 = first.subtract(third);\r\n const zAxis = Vector3.Cross(vec1, vec2);\r\n const len4 = zAxis.length();\r\n if (len4 < Math.pow(10, -8)) {\r\n return new Curve3(arc); // colinear points arc is empty\r\n }\r\n const len1_sq = vec1.lengthSquared();\r\n const len2_sq = vec2.lengthSquared();\r\n const len3_sq = vec3.lengthSquared();\r\n const len4_sq = zAxis.lengthSquared();\r\n const len1 = vec1.length();\r\n const len2 = vec2.length();\r\n const len3 = vec3.length();\r\n const radius = (0.5 * len1 * len2 * len3) / len4;\r\n const dot1 = Vector3.Dot(vec1, vec3);\r\n const dot2 = Vector3.Dot(vec1, vec2);\r\n const dot3 = Vector3.Dot(vec2, vec3);\r\n const a = (-0.5 * len2_sq * dot1) / len4_sq;\r\n const b = (-0.5 * len3_sq * dot2) / len4_sq;\r\n const c = (-0.5 * len1_sq * dot3) / len4_sq;\r\n const center = first.scale(a).add(second.scale(b)).add(third.scale(c));\r\n const radiusVec = first.subtract(center);\r\n const xAxis = radiusVec.normalize();\r\n const yAxis = Vector3.Cross(zAxis, xAxis).normalize();\r\n if (fullCircle) {\r\n const dStep = (2 * Math.PI) / steps;\r\n for (let theta = 0; theta <= 2 * Math.PI; theta += dStep) {\r\n arc.push(center.add(xAxis.scale(radius * Math.cos(theta)).add(yAxis.scale(radius * Math.sin(theta)))));\r\n }\r\n arc.push(first);\r\n } else {\r\n const dStep = 1 / steps;\r\n let theta = 0;\r\n let point = Vector3.Zero();\r\n do {\r\n point = center.add(xAxis.scale(radius * Math.cos(theta)).add(yAxis.scale(radius * Math.sin(theta))));\r\n arc.push(point);\r\n theta += dStep;\r\n } while (!point.equalsWithEpsilon(third, radius * dStep * 1.1));\r\n arc.push(third);\r\n if (closed) {\r\n arc.push(first);\r\n }\r\n }\r\n return new Curve3(arc);\r\n }\r\n\r\n /**\r\n * A Curve3 object is a logical object, so not a mesh, to handle curves in the 3D geometric space.\r\n * A Curve3 is designed from a series of successive Vector3.\r\n * Tuto : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#curve3-object\r\n * @param points points which make up the curve\r\n */\r\n constructor(points: Vector3[]) {\r\n this._points = points;\r\n this._length = this._computeLength(points);\r\n }\r\n\r\n /**\r\n * @returns the Curve3 stored array of successive Vector3\r\n */\r\n public getPoints() {\r\n return this._points;\r\n }\r\n\r\n /**\r\n * @returns the computed length (float) of the curve.\r\n */\r\n public length() {\r\n return this._length;\r\n }\r\n\r\n /**\r\n * Returns a new instance of Curve3 object : var curve = curveA.continue(curveB);\r\n * This new Curve3 is built by translating and sticking the curveB at the end of the curveA.\r\n * curveA and curveB keep unchanged.\r\n * @param curve the curve to continue from this curve\r\n * @returns the newly constructed curve\r\n */\r\n public continue(curve: DeepImmutable): Curve3 {\r\n const lastPoint = this._points[this._points.length - 1];\r\n const continuedPoints = this._points.slice();\r\n const curvePoints = curve.getPoints();\r\n for (let i = 1; i < curvePoints.length; i++) {\r\n continuedPoints.push(curvePoints[i].subtract(curvePoints[0]).add(lastPoint));\r\n }\r\n const continuedCurve = new Curve3(continuedPoints);\r\n return continuedCurve;\r\n }\r\n\r\n private _computeLength(path: DeepImmutable): number {\r\n let l = 0;\r\n for (let i = 1; i < path.length; i++) {\r\n l += path[i].subtract(path[i - 1]).length();\r\n }\r\n return l;\r\n }\r\n}\r\n", "import type { Animatable } from \"./animatable\";\r\nimport { Animation } from \"./animation\";\r\nimport type { IMakeAnimationAdditiveOptions } from \"./animation\";\r\nimport type { IAnimationKey } from \"./animationKey\";\r\n\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport { Tags } from \"../Misc/tags\";\r\nimport type { AnimationGroupMask } from \"./animationGroupMask\";\r\n\r\n/**\r\n * This class defines the direct association between an animation and a target\r\n */\r\nexport class TargetedAnimation {\r\n /**\r\n * Animation to perform\r\n */\r\n public animation: Animation;\r\n /**\r\n * Target to animate\r\n */\r\n public target: any;\r\n\r\n /**\r\n * Returns the string \"TargetedAnimation\"\r\n * @returns \"TargetedAnimation\"\r\n */\r\n public getClassName(): string {\r\n return \"TargetedAnimation\";\r\n }\r\n\r\n /**\r\n * Serialize the object\r\n * @returns the JSON object representing the current entity\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n serializationObject.animation = this.animation.serialize();\r\n serializationObject.targetId = this.target.id;\r\n\r\n return serializationObject;\r\n }\r\n}\r\n\r\n/**\r\n * Options to be used when creating an additive group animation\r\n */\r\nexport interface IMakeAnimationGroupAdditiveOptions extends IMakeAnimationAdditiveOptions {\r\n /**\r\n * Defines if the animation group should be cloned or not (default is false)\r\n */\r\n cloneOriginalAnimationGroup?: boolean;\r\n /**\r\n * The name of the cloned animation group if cloneOriginalAnimationGroup is true\r\n */\r\n clonedAnimationGroupName?: string;\r\n}\r\n\r\n/**\r\n * Use this class to create coordinated animations on multiple targets\r\n */\r\nexport class AnimationGroup implements IDisposable {\r\n private _scene: Scene;\r\n\r\n private _targetedAnimations = new Array();\r\n private _animatables = new Array();\r\n private _from = Number.MAX_VALUE;\r\n private _to = -Number.MAX_VALUE;\r\n private _isStarted: boolean;\r\n private _isPaused: boolean;\r\n private _speedRatio = 1;\r\n private _loopAnimation = false;\r\n private _isAdditive = false;\r\n private _weight = -1;\r\n private _playOrder = 0;\r\n private _enableBlending: Nullable = null;\r\n private _blendingSpeed: Nullable = null;\r\n private _numActiveAnimatables = 0;\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable = null;\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * This observable will notify when one animation have ended\r\n */\r\n public onAnimationEndObservable = new Observable();\r\n\r\n /**\r\n * Observer raised when one animation loops\r\n */\r\n public onAnimationLoopObservable = new Observable();\r\n\r\n /**\r\n * Observer raised when all animations have looped\r\n */\r\n public onAnimationGroupLoopObservable = new Observable();\r\n\r\n /**\r\n * This observable will notify when all animations have ended.\r\n */\r\n public onAnimationGroupEndObservable = new Observable();\r\n\r\n /**\r\n * This observable will notify when all animations have paused.\r\n */\r\n public onAnimationGroupPauseObservable = new Observable();\r\n\r\n /**\r\n * This observable will notify when all animations are playing.\r\n */\r\n public onAnimationGroupPlayObservable = new Observable();\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the node\r\n */\r\n public metadata: any = null;\r\n\r\n private _mask: Nullable = null;\r\n\r\n /**\r\n * Gets or sets the mask associated with this animation group. This mask is used to filter which objects should be animated.\r\n */\r\n public get mask() {\r\n return this._mask;\r\n }\r\n\r\n public set mask(value: Nullable) {\r\n if (this._mask === value) {\r\n return;\r\n }\r\n\r\n this._mask = value;\r\n\r\n this.syncWithMask(true);\r\n }\r\n\r\n /**\r\n * Makes sure that the animations are either played or stopped according to the animation group mask.\r\n * Note however that the call won't have any effect if the animation group has not been started yet.\r\n * @param forceUpdate If true, forces to loop over the animatables even if no mask is defined (used internally, you shouldn't need to use it). Default: false.\r\n */\r\n public syncWithMask(forceUpdate = false) {\r\n if (!this.mask && !forceUpdate) {\r\n this._numActiveAnimatables = this._targetedAnimations.length;\r\n return;\r\n }\r\n\r\n this._numActiveAnimatables = 0;\r\n\r\n for (let i = 0; i < this._animatables.length; ++i) {\r\n const animatable = this._animatables[i];\r\n\r\n if (!this.mask || this.mask.disabled || this.mask.retainsTarget(animatable.target.name)) {\r\n this._numActiveAnimatables++;\r\n if (animatable.paused) {\r\n animatable.restart();\r\n }\r\n } else {\r\n if (!animatable.paused) {\r\n animatable.pause();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Removes all animations for the targets not retained by the animation group mask.\r\n * Use this function if you know you won't need those animations anymore and if you want to free memory.\r\n */\r\n public removeUnmaskedAnimations() {\r\n if (!this.mask || this.mask.disabled) {\r\n return;\r\n }\r\n\r\n // Removes all animatables (in case the animation group has already been started)\r\n for (let i = 0; i < this._animatables.length; ++i) {\r\n const animatable = this._animatables[i];\r\n\r\n if (!this.mask.retainsTarget(animatable.target.name)) {\r\n animatable.stop();\r\n this._animatables.splice(i, 1);\r\n --i;\r\n }\r\n }\r\n\r\n // Removes the targeted animations\r\n for (let index = 0; index < this._targetedAnimations.length; index++) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n\r\n if (!this.mask.retainsTarget(targetedAnimation.target.name)) {\r\n this._targetedAnimations.splice(index, 1);\r\n --index;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the first frame\r\n */\r\n public get from(): number {\r\n return this._from;\r\n }\r\n\r\n public set from(value: number) {\r\n if (this._from === value) {\r\n return;\r\n }\r\n\r\n this._from = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.fromFrame = this._from;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the last frame\r\n */\r\n public get to(): number {\r\n return this._to;\r\n }\r\n\r\n public set to(value: number) {\r\n if (this._to === value) {\r\n return;\r\n }\r\n\r\n this._to = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.toFrame = this._to;\r\n }\r\n }\r\n\r\n /**\r\n * Define if the animations are started\r\n */\r\n public get isStarted(): boolean {\r\n return this._isStarted;\r\n }\r\n\r\n /**\r\n * Gets a value indicating that the current group is playing\r\n */\r\n public get isPlaying(): boolean {\r\n return this._isStarted && !this._isPaused;\r\n }\r\n\r\n /**\r\n * Gets or sets the speed ratio to use for all animations\r\n */\r\n public get speedRatio(): number {\r\n return this._speedRatio;\r\n }\r\n\r\n /**\r\n * Gets or sets the speed ratio to use for all animations\r\n */\r\n public set speedRatio(value: number) {\r\n if (this._speedRatio === value) {\r\n return;\r\n }\r\n\r\n this._speedRatio = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.speedRatio = this._speedRatio;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets if all animations should loop or not\r\n */\r\n public get loopAnimation(): boolean {\r\n return this._loopAnimation;\r\n }\r\n\r\n public set loopAnimation(value: boolean) {\r\n if (this._loopAnimation === value) {\r\n return;\r\n }\r\n\r\n this._loopAnimation = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.loopAnimation = this._loopAnimation;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets if all animations should be evaluated additively\r\n */\r\n public get isAdditive(): boolean {\r\n return this._isAdditive;\r\n }\r\n\r\n public set isAdditive(value: boolean) {\r\n if (this._isAdditive === value) {\r\n return;\r\n }\r\n\r\n this._isAdditive = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.isAdditive = this._isAdditive;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the weight to apply to all animations of the group\r\n */\r\n public get weight(): number {\r\n return this._weight;\r\n }\r\n\r\n public set weight(value: number) {\r\n if (this._weight === value) {\r\n return;\r\n }\r\n\r\n this._weight = value;\r\n this.setWeightForAllAnimatables(this._weight);\r\n }\r\n\r\n /**\r\n * Gets the targeted animations for this animation group\r\n */\r\n public get targetedAnimations(): Array {\r\n return this._targetedAnimations;\r\n }\r\n\r\n /**\r\n * returning the list of animatables controlled by this animation group.\r\n */\r\n public get animatables(): Array {\r\n return this._animatables;\r\n }\r\n\r\n /**\r\n * Gets the list of target animations\r\n */\r\n public get children() {\r\n return this._targetedAnimations;\r\n }\r\n\r\n /**\r\n * Gets or sets the order of play of the animation group (default: 0)\r\n */\r\n public get playOrder() {\r\n return this._playOrder;\r\n }\r\n\r\n public set playOrder(value: number) {\r\n if (this._playOrder === value) {\r\n return;\r\n }\r\n\r\n this._playOrder = value;\r\n\r\n if (this._animatables.length > 0) {\r\n for (let i = 0; i < this._animatables.length; i++) {\r\n this._animatables[i].playOrder = this._playOrder;\r\n }\r\n\r\n this._scene.sortActiveAnimatables();\r\n }\r\n }\r\n\r\n /**\r\n * Allows the animations of the animation group to blend with current running animations\r\n * Note that a null value means that each animation will use their own existing blending configuration (Animation.enableBlending)\r\n */\r\n public get enableBlending() {\r\n return this._enableBlending;\r\n }\r\n\r\n public set enableBlending(value: Nullable) {\r\n if (this._enableBlending === value) {\r\n return;\r\n }\r\n\r\n this._enableBlending = value;\r\n\r\n if (value !== null) {\r\n for (let i = 0; i < this._targetedAnimations.length; ++i) {\r\n this._targetedAnimations[i].animation.enableBlending = value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the animation blending speed\r\n * Note that a null value means that each animation will use their own existing blending configuration (Animation.blendingSpeed)\r\n */\r\n public get blendingSpeed() {\r\n return this._blendingSpeed;\r\n }\r\n\r\n public set blendingSpeed(value: Nullable) {\r\n if (this._blendingSpeed === value) {\r\n return;\r\n }\r\n\r\n this._blendingSpeed = value;\r\n\r\n if (value !== null) {\r\n for (let i = 0; i < this._targetedAnimations.length; ++i) {\r\n this._targetedAnimations[i].animation.blendingSpeed = value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the length (in seconds) of the animation group\r\n * This function assumes that all animations are played at the same framePerSecond speed!\r\n * Note: you can only call this method after you've added at least one targeted animation!\r\n * @param from Starting frame range (default is AnimationGroup.from)\r\n * @param to Ending frame range (default is AnimationGroup.to)\r\n * @returns The length in seconds\r\n */\r\n public getLength(from?: number, to?: number): number {\r\n from = from ?? this._from;\r\n to = to ?? this._to;\r\n\r\n const fps = this.targetedAnimations[0].animation.framePerSecond * this._speedRatio;\r\n\r\n return (to - from) / fps;\r\n }\r\n\r\n /**\r\n * Merge the array of animation groups into a new animation group\r\n * @param animationGroups List of animation groups to merge\r\n * @param disposeSource If true, animation groups will be disposed after being merged (default: true)\r\n * @param normalize If true, animation groups will be normalized before being merged, so that all animations have the same \"from\" and \"to\" frame (default: false)\r\n * @param weight Weight for the new animation group. If not provided, it will inherit the weight from the first animation group of the array\r\n * @returns The new animation group or null if no animation groups were passed\r\n */\r\n public static MergeAnimationGroups(animationGroups: Array, disposeSource = true, normalize = false, weight?: number): Nullable {\r\n if (animationGroups.length === 0) {\r\n return null;\r\n }\r\n\r\n weight = weight ?? animationGroups[0].weight;\r\n\r\n let beginFrame = Number.MAX_VALUE;\r\n let endFrame = -Number.MAX_VALUE;\r\n\r\n if (normalize) {\r\n for (const animationGroup of animationGroups) {\r\n if (animationGroup.from < beginFrame) {\r\n beginFrame = animationGroup.from;\r\n }\r\n\r\n if (animationGroup.to > endFrame) {\r\n endFrame = animationGroup.to;\r\n }\r\n }\r\n }\r\n\r\n const mergedAnimationGroup = new AnimationGroup(animationGroups[0].name + \"_merged\", animationGroups[0]._scene, weight);\r\n\r\n for (const animationGroup of animationGroups) {\r\n if (normalize) {\r\n animationGroup.normalize(beginFrame, endFrame);\r\n }\r\n\r\n for (const targetedAnimation of animationGroup.targetedAnimations) {\r\n mergedAnimationGroup.addTargetedAnimation(targetedAnimation.animation, targetedAnimation.target);\r\n }\r\n\r\n if (disposeSource) {\r\n animationGroup.dispose();\r\n }\r\n }\r\n\r\n return mergedAnimationGroup;\r\n }\r\n\r\n /**\r\n * Instantiates a new Animation Group.\r\n * This helps managing several animations at once.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/groupAnimations\r\n * @param name Defines the name of the group\r\n * @param scene Defines the scene the group belongs to\r\n * @param weight Defines the weight to use for animations in the group (-1.0 by default, meaning \"no weight\")\r\n * @param playOrder Defines the order of play of the animation group (default is 0)\r\n */\r\n public constructor(\r\n /** The name of the animation group */\r\n public name: string,\r\n scene: Nullable = null,\r\n weight = -1,\r\n playOrder = 0\r\n ) {\r\n this._scene = scene || EngineStore.LastCreatedScene!;\r\n this._weight = weight;\r\n this._playOrder = playOrder;\r\n this.uniqueId = this._scene.getUniqueId();\r\n\r\n this._scene.addAnimationGroup(this);\r\n }\r\n\r\n /**\r\n * Add an animation (with its target) in the group\r\n * @param animation defines the animation we want to add\r\n * @param target defines the target of the animation\r\n * @returns the TargetedAnimation object\r\n */\r\n public addTargetedAnimation(animation: Animation, target: any): TargetedAnimation {\r\n const targetedAnimation = new TargetedAnimation();\r\n targetedAnimation.animation = animation;\r\n targetedAnimation.target = target;\r\n\r\n const keys = animation.getKeys();\r\n if (this._from > keys[0].frame) {\r\n this._from = keys[0].frame;\r\n }\r\n\r\n if (this._to < keys[keys.length - 1].frame) {\r\n this._to = keys[keys.length - 1].frame;\r\n }\r\n\r\n if (this._enableBlending !== null) {\r\n animation.enableBlending = this._enableBlending;\r\n }\r\n\r\n if (this._blendingSpeed !== null) {\r\n animation.blendingSpeed = this._blendingSpeed;\r\n }\r\n\r\n this._targetedAnimations.push(targetedAnimation);\r\n\r\n return targetedAnimation;\r\n }\r\n\r\n /**\r\n * Remove an animation from the group\r\n * @param animation defines the animation we want to remove\r\n */\r\n public removeTargetedAnimation(animation: Animation) {\r\n for (let index = this._targetedAnimations.length - 1; index > -1; index--) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n if (targetedAnimation.animation === animation) {\r\n this._targetedAnimations.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This function will normalize every animation in the group to make sure they all go from beginFrame to endFrame\r\n * It can add constant keys at begin or end\r\n * @param beginFrame defines the new begin frame for all animations or the smallest begin frame of all animations if null (defaults to null)\r\n * @param endFrame defines the new end frame for all animations or the largest end frame of all animations if null (defaults to null)\r\n * @returns the animation group\r\n */\r\n public normalize(beginFrame: Nullable = null, endFrame: Nullable = null): AnimationGroup {\r\n if (beginFrame == null) {\r\n beginFrame = this._from;\r\n }\r\n if (endFrame == null) {\r\n endFrame = this._to;\r\n }\r\n\r\n for (let index = 0; index < this._targetedAnimations.length; index++) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n const keys = targetedAnimation.animation.getKeys();\r\n const startKey = keys[0];\r\n const endKey = keys[keys.length - 1];\r\n\r\n if (startKey.frame > beginFrame) {\r\n const newKey: IAnimationKey = {\r\n frame: beginFrame,\r\n value: startKey.value,\r\n inTangent: startKey.inTangent,\r\n outTangent: startKey.outTangent,\r\n interpolation: startKey.interpolation,\r\n };\r\n keys.splice(0, 0, newKey);\r\n }\r\n\r\n if (endKey.frame < endFrame) {\r\n const newKey: IAnimationKey = {\r\n frame: endFrame,\r\n value: endKey.value,\r\n inTangent: endKey.inTangent,\r\n outTangent: endKey.outTangent,\r\n interpolation: endKey.interpolation,\r\n };\r\n keys.push(newKey);\r\n }\r\n }\r\n\r\n this._from = beginFrame;\r\n this._to = endFrame;\r\n\r\n return this;\r\n }\r\n\r\n private _animationLoopCount: number;\r\n private _animationLoopFlags: boolean[] = [];\r\n\r\n private _processLoop(animatable: Animatable, targetedAnimation: TargetedAnimation, index: number) {\r\n animatable.onAnimationLoop = () => {\r\n this.onAnimationLoopObservable.notifyObservers(targetedAnimation);\r\n\r\n if (this._animationLoopFlags[index]) {\r\n return;\r\n }\r\n\r\n this._animationLoopFlags[index] = true;\r\n\r\n this._animationLoopCount++;\r\n if (this._animationLoopCount === this._numActiveAnimatables) {\r\n this.onAnimationGroupLoopObservable.notifyObservers(this);\r\n this._animationLoopCount = 0;\r\n this._animationLoopFlags.length = 0;\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Start all animations on given targets\r\n * @param loop defines if animations must loop\r\n * @param speedRatio defines the ratio to apply to animation speed (1 by default)\r\n * @param from defines the from key (optional)\r\n * @param to defines the to key (optional)\r\n * @param isAdditive defines the additive state for the resulting animatables (optional)\r\n * @returns the current animation group\r\n */\r\n public start(loop = false, speedRatio = 1, from?: number, to?: number, isAdditive?: boolean): AnimationGroup {\r\n if (this._isStarted || this._targetedAnimations.length === 0) {\r\n return this;\r\n }\r\n\r\n this._loopAnimation = loop;\r\n\r\n this._animationLoopCount = 0;\r\n this._animationLoopFlags.length = 0;\r\n\r\n for (let index = 0; index < this._targetedAnimations.length; index++) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n const animatable = this._scene.beginDirectAnimation(\r\n targetedAnimation.target,\r\n [targetedAnimation.animation],\r\n from !== undefined ? from : this._from,\r\n to !== undefined ? to : this._to,\r\n loop,\r\n speedRatio,\r\n undefined,\r\n undefined,\r\n isAdditive !== undefined ? isAdditive : this._isAdditive\r\n );\r\n animatable.weight = this._weight;\r\n animatable.playOrder = this._playOrder;\r\n animatable.onAnimationEnd = () => {\r\n this.onAnimationEndObservable.notifyObservers(targetedAnimation);\r\n this._checkAnimationGroupEnded(animatable);\r\n };\r\n\r\n this._processLoop(animatable, targetedAnimation, index);\r\n this._animatables.push(animatable);\r\n }\r\n\r\n this.syncWithMask();\r\n\r\n this._scene.sortActiveAnimatables();\r\n\r\n this._speedRatio = speedRatio;\r\n\r\n this._isStarted = true;\r\n this._isPaused = false;\r\n\r\n this.onAnimationGroupPlayObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Pause all animations\r\n * @returns the animation group\r\n */\r\n public pause(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n this._isPaused = true;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.pause();\r\n }\r\n\r\n this.onAnimationGroupPauseObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Play all animations to initial state\r\n * This function will start() the animations if they were not started or will restart() them if they were paused\r\n * @param loop defines if animations must loop\r\n * @returns the animation group\r\n */\r\n public play(loop?: boolean): AnimationGroup {\r\n // only if all animatables are ready and exist\r\n if (this.isStarted && this._animatables.length === this._targetedAnimations.length) {\r\n if (loop !== undefined) {\r\n this.loopAnimation = loop;\r\n }\r\n this.restart();\r\n } else {\r\n this.stop();\r\n this.start(loop, this._speedRatio);\r\n }\r\n\r\n this._isPaused = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Reset all animations to initial state\r\n * @returns the animation group\r\n */\r\n public reset(): AnimationGroup {\r\n if (!this._isStarted) {\r\n this.play();\r\n this.goToFrame(0);\r\n this.stop();\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.reset();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Restart animations from key 0\r\n * @returns the animation group\r\n */\r\n public restart(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.restart();\r\n }\r\n\r\n this.syncWithMask();\r\n\r\n this.onAnimationGroupPlayObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Stop all animations\r\n * @returns the animation group\r\n */\r\n public stop(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n const list = this._animatables.slice();\r\n for (let index = 0; index < list.length; index++) {\r\n list[index].stop(undefined, undefined, true);\r\n }\r\n\r\n // We will take care of removing all stopped animatables\r\n let curIndex = 0;\r\n for (let index = 0; index < this._scene._activeAnimatables.length; index++) {\r\n const animatable = this._scene._activeAnimatables[index];\r\n if (animatable._runtimeAnimations.length > 0) {\r\n this._scene._activeAnimatables[curIndex++] = animatable;\r\n }\r\n }\r\n this._scene._activeAnimatables.length = curIndex;\r\n\r\n this._isStarted = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set animation weight for all animatables\r\n *\r\n * @since 6.12.4\r\n * You can pass the weight to the AnimationGroup constructor, or use the weight property to set it after the group has been created,\r\n * making it easier to define the overall animation weight than calling setWeightForAllAnimatables() after the animation group has been started\r\n * @param weight defines the weight to use\r\n * @returns the animationGroup\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#animation-weights\r\n */\r\n public setWeightForAllAnimatables(weight: number): AnimationGroup {\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.weight = weight;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Synchronize and normalize all animatables with a source animatable\r\n * @param root defines the root animatable to synchronize with (null to stop synchronizing)\r\n * @returns the animationGroup\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#animation-weights\r\n */\r\n public syncAllAnimationsWith(root: Nullable): AnimationGroup {\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.syncWith(root);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Goes to a specific frame in this animation group\r\n * @param frame the frame number to go to\r\n * @returns the animationGroup\r\n */\r\n public goToFrame(frame: number): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.goToFrame(frame);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Dispose all associated resources\r\n */\r\n public dispose(): void {\r\n this._targetedAnimations.length = 0;\r\n this._animatables.length = 0;\r\n\r\n // Remove from scene\r\n const index = this._scene.animationGroups.indexOf(this);\r\n\r\n if (index > -1) {\r\n this._scene.animationGroups.splice(index, 1);\r\n }\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.animationGroups.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.animationGroups.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n this.onAnimationEndObservable.clear();\r\n this.onAnimationGroupEndObservable.clear();\r\n this.onAnimationGroupPauseObservable.clear();\r\n this.onAnimationGroupPlayObservable.clear();\r\n this.onAnimationLoopObservable.clear();\r\n this.onAnimationGroupLoopObservable.clear();\r\n }\r\n\r\n private _checkAnimationGroupEnded(animatable: Animatable) {\r\n // animatable should be taken out of the array\r\n const idx = this._animatables.indexOf(animatable);\r\n if (idx > -1) {\r\n this._animatables.splice(idx, 1);\r\n }\r\n\r\n // all animatables were removed? animation group ended!\r\n if (this._animatables.length === 0) {\r\n this._isStarted = false;\r\n this.onAnimationGroupEndObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Clone the current animation group and returns a copy\r\n * @param newName defines the name of the new group\r\n * @param targetConverter defines an optional function used to convert current animation targets to new ones\r\n * @param cloneAnimations defines if the animations should be cloned or referenced\r\n * @returns the new animation group\r\n */\r\n public clone(newName: string, targetConverter?: (oldTarget: any) => any, cloneAnimations = false): AnimationGroup {\r\n const newGroup = new AnimationGroup(newName || this.name, this._scene, this._weight, this._playOrder);\r\n\r\n newGroup._from = this.from;\r\n newGroup._to = this.to;\r\n newGroup._speedRatio = this.speedRatio;\r\n newGroup._loopAnimation = this.loopAnimation;\r\n newGroup._isAdditive = this.isAdditive;\r\n newGroup._enableBlending = this.enableBlending;\r\n newGroup._blendingSpeed = this.blendingSpeed;\r\n newGroup.metadata = this.metadata;\r\n newGroup.mask = this.mask;\r\n\r\n for (const targetAnimation of this._targetedAnimations) {\r\n newGroup.addTargetedAnimation(\r\n cloneAnimations ? targetAnimation.animation.clone() : targetAnimation.animation,\r\n targetConverter ? targetConverter(targetAnimation.target) : targetAnimation.target\r\n );\r\n }\r\n\r\n return newGroup;\r\n }\r\n\r\n /**\r\n * Serializes the animationGroup to an object\r\n * @returns Serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.from = this.from;\r\n serializationObject.to = this.to;\r\n serializationObject.speedRatio = this.speedRatio;\r\n serializationObject.loopAnimation = this.loopAnimation;\r\n serializationObject.isAdditive = this.isAdditive;\r\n serializationObject.weight = this.weight;\r\n serializationObject.playOrder = this.playOrder;\r\n serializationObject.enableBlending = this.enableBlending;\r\n serializationObject.blendingSpeed = this.blendingSpeed;\r\n\r\n serializationObject.targetedAnimations = [];\r\n for (let targetedAnimationIndex = 0; targetedAnimationIndex < this.targetedAnimations.length; targetedAnimationIndex++) {\r\n const targetedAnimation = this.targetedAnimations[targetedAnimationIndex];\r\n serializationObject.targetedAnimations[targetedAnimationIndex] = targetedAnimation.serialize();\r\n }\r\n\r\n if (Tags && Tags.HasTags(this)) {\r\n serializationObject.tags = Tags.GetTags(this);\r\n }\r\n\r\n // Metadata\r\n if (this.metadata) {\r\n serializationObject.metadata = this.metadata;\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Returns a new AnimationGroup object parsed from the source provided.\r\n * @param parsedAnimationGroup defines the source\r\n * @param scene defines the scene that will receive the animationGroup\r\n * @returns a new AnimationGroup\r\n */\r\n public static Parse(parsedAnimationGroup: any, scene: Scene): AnimationGroup {\r\n const animationGroup = new AnimationGroup(parsedAnimationGroup.name, scene, parsedAnimationGroup.weight, parsedAnimationGroup.playOrder);\r\n for (let i = 0; i < parsedAnimationGroup.targetedAnimations.length; i++) {\r\n const targetedAnimation = parsedAnimationGroup.targetedAnimations[i];\r\n const animation = Animation.Parse(targetedAnimation.animation);\r\n const id = targetedAnimation.targetId;\r\n if (targetedAnimation.animation.property === \"influence\") {\r\n // morph target animation\r\n const morphTarget = scene.getMorphTargetById(id);\r\n if (morphTarget) {\r\n animationGroup.addTargetedAnimation(animation, morphTarget);\r\n }\r\n } else {\r\n const targetNode = scene.getNodeById(id);\r\n\r\n if (targetNode != null) {\r\n animationGroup.addTargetedAnimation(animation, targetNode);\r\n }\r\n }\r\n }\r\n\r\n if (Tags) {\r\n Tags.AddTagsTo(animationGroup, parsedAnimationGroup.tags);\r\n }\r\n\r\n if (parsedAnimationGroup.from !== null && parsedAnimationGroup.to !== null) {\r\n animationGroup.normalize(parsedAnimationGroup.from, parsedAnimationGroup.to);\r\n }\r\n\r\n if (parsedAnimationGroup.speedRatio !== undefined) {\r\n animationGroup._speedRatio = parsedAnimationGroup.speedRatio;\r\n }\r\n if (parsedAnimationGroup.loopAnimation !== undefined) {\r\n animationGroup._loopAnimation = parsedAnimationGroup.loopAnimation;\r\n }\r\n\r\n if (parsedAnimationGroup.isAdditive !== undefined) {\r\n animationGroup._isAdditive = parsedAnimationGroup.isAdditive;\r\n }\r\n\r\n if (parsedAnimationGroup.weight !== undefined) {\r\n animationGroup._weight = parsedAnimationGroup.weight;\r\n }\r\n\r\n if (parsedAnimationGroup.playOrder !== undefined) {\r\n animationGroup._playOrder = parsedAnimationGroup.playOrder;\r\n }\r\n\r\n if (parsedAnimationGroup.enableBlending !== undefined) {\r\n animationGroup._enableBlending = parsedAnimationGroup.enableBlending;\r\n }\r\n\r\n if (parsedAnimationGroup.blendingSpeed !== undefined) {\r\n animationGroup._blendingSpeed = parsedAnimationGroup.blendingSpeed;\r\n }\r\n\r\n if (parsedAnimationGroup.metadata !== undefined) {\r\n animationGroup.metadata = parsedAnimationGroup.metadata;\r\n }\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Convert the keyframes for all animations belonging to the group to be relative to a given reference frame.\r\n * @param sourceAnimationGroup defines the AnimationGroup containing animations to convert\r\n * @param referenceFrame defines the frame that keyframes in the range will be relative to (default: 0)\r\n * @param range defines the name of the AnimationRange belonging to the animations in the group to convert\r\n * @param cloneOriginal defines whether or not to clone the group and convert the clone or convert the original group (default is false)\r\n * @param clonedName defines the name of the resulting cloned AnimationGroup if cloneOriginal is true\r\n * @returns a new AnimationGroup if cloneOriginal is true or the original AnimationGroup if cloneOriginal is false\r\n */\r\n public static MakeAnimationAdditive(sourceAnimationGroup: AnimationGroup, referenceFrame: number, range?: string, cloneOriginal?: boolean, clonedName?: string): AnimationGroup;\r\n\r\n /**\r\n * Convert the keyframes for all animations belonging to the group to be relative to a given reference frame.\r\n * @param sourceAnimationGroup defines the AnimationGroup containing animations to convert\r\n * @param options defines the options to use when converting keyframes\r\n * @returns a new AnimationGroup if options.cloneOriginalAnimationGroup is true or the original AnimationGroup if options.cloneOriginalAnimationGroup is false\r\n */\r\n public static MakeAnimationAdditive(sourceAnimationGroup: AnimationGroup, options?: IMakeAnimationGroupAdditiveOptions): AnimationGroup;\r\n\r\n /** @internal */\r\n public static MakeAnimationAdditive(\r\n sourceAnimationGroup: AnimationGroup,\r\n referenceFrameOrOptions?: number | IMakeAnimationGroupAdditiveOptions,\r\n range?: string,\r\n cloneOriginal = false,\r\n clonedName?: string\r\n ): AnimationGroup {\r\n let options: IMakeAnimationGroupAdditiveOptions;\r\n\r\n if (typeof referenceFrameOrOptions === \"object\") {\r\n options = referenceFrameOrOptions;\r\n } else {\r\n options = {\r\n referenceFrame: referenceFrameOrOptions,\r\n range: range,\r\n cloneOriginalAnimationGroup: cloneOriginal,\r\n clonedAnimationName: clonedName,\r\n };\r\n }\r\n\r\n let animationGroup = sourceAnimationGroup;\r\n if (options.cloneOriginalAnimationGroup) {\r\n animationGroup = sourceAnimationGroup.clone(options.clonedAnimationGroupName || animationGroup.name);\r\n }\r\n\r\n const targetedAnimations = animationGroup.targetedAnimations;\r\n for (let index = 0; index < targetedAnimations.length; index++) {\r\n const targetedAnimation = targetedAnimations[index];\r\n targetedAnimation.animation = Animation.MakeAnimationAdditive(targetedAnimation.animation, options);\r\n }\r\n\r\n animationGroup.isAdditive = true;\r\n\r\n if (options.clipKeys) {\r\n // We need to recalculate the from/to frames for the animation group because some keys may have been removed\r\n let from = Number.MAX_VALUE;\r\n let to = -Number.MAX_VALUE;\r\n\r\n const targetedAnimations = animationGroup.targetedAnimations;\r\n for (let index = 0; index < targetedAnimations.length; index++) {\r\n const targetedAnimation = targetedAnimations[index];\r\n const animation = targetedAnimation.animation;\r\n const keys = animation.getKeys();\r\n\r\n if (from > keys[0].frame) {\r\n from = keys[0].frame;\r\n }\r\n\r\n if (to < keys[keys.length - 1].frame) {\r\n to = keys[keys.length - 1].frame;\r\n }\r\n }\r\n\r\n animationGroup._from = from;\r\n animationGroup._to = to;\r\n }\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Creates a new animation, keeping only the keys that are inside a given key range\r\n * @param sourceAnimationGroup defines the animation group on which to operate\r\n * @param fromKey defines the lower bound of the range\r\n * @param toKey defines the upper bound of the range\r\n * @param name defines the name of the new animation group. If not provided, use the same name as animationGroup\r\n * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the keys. Default is false, so animations will be cloned\r\n * @returns a new animation group stripped from all the keys outside the given range\r\n */\r\n public static ClipKeys(sourceAnimationGroup: AnimationGroup, fromKey: number, toKey: number, name?: string, dontCloneAnimations?: boolean): AnimationGroup {\r\n const animationGroup = sourceAnimationGroup.clone(name || sourceAnimationGroup.name);\r\n\r\n return AnimationGroup.ClipKeysInPlace(animationGroup, fromKey, toKey, dontCloneAnimations);\r\n }\r\n\r\n /**\r\n * Updates an existing animation, keeping only the keys that are inside a given key range\r\n * @param animationGroup defines the animation group on which to operate\r\n * @param fromKey defines the lower bound of the range\r\n * @param toKey defines the upper bound of the range\r\n * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the keys. Default is false, so animations will be cloned\r\n * @returns the animationGroup stripped from all the keys outside the given range\r\n */\r\n public static ClipKeysInPlace(animationGroup: AnimationGroup, fromKey: number, toKey: number, dontCloneAnimations?: boolean): AnimationGroup {\r\n return AnimationGroup.ClipInPlace(animationGroup, fromKey, toKey, dontCloneAnimations, false);\r\n }\r\n\r\n /**\r\n * Creates a new animation, keeping only the frames that are inside a given frame range\r\n * @param sourceAnimationGroup defines the animation group on which to operate\r\n * @param fromFrame defines the lower bound of the range\r\n * @param toFrame defines the upper bound of the range\r\n * @param name defines the name of the new animation group. If not provided, use the same name as animationGroup\r\n * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the frames. Default is false, so animations will be cloned\r\n * @returns a new animation group stripped from all the frames outside the given range\r\n */\r\n public static ClipFrames(sourceAnimationGroup: AnimationGroup, fromFrame: number, toFrame: number, name?: string, dontCloneAnimations?: boolean): AnimationGroup {\r\n const animationGroup = sourceAnimationGroup.clone(name || sourceAnimationGroup.name);\r\n\r\n return AnimationGroup.ClipFramesInPlace(animationGroup, fromFrame, toFrame, dontCloneAnimations);\r\n }\r\n\r\n /**\r\n * Updates an existing animation, keeping only the frames that are inside a given frame range\r\n * @param animationGroup defines the animation group on which to operate\r\n * @param fromFrame defines the lower bound of the range\r\n * @param toFrame defines the upper bound of the range\r\n * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the frames. Default is false, so animations will be cloned\r\n * @returns the animationGroup stripped from all the frames outside the given range\r\n */\r\n public static ClipFramesInPlace(animationGroup: AnimationGroup, fromFrame: number, toFrame: number, dontCloneAnimations?: boolean): AnimationGroup {\r\n return AnimationGroup.ClipInPlace(animationGroup, fromFrame, toFrame, dontCloneAnimations, true);\r\n }\r\n\r\n /**\r\n * Updates an existing animation, keeping only the keys that are inside a given key or frame range\r\n * @param animationGroup defines the animation group on which to operate\r\n * @param start defines the lower bound of the range\r\n * @param end defines the upper bound of the range\r\n * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the keys. Default is false, so animations will be cloned\r\n * @param useFrame defines if the range is defined by frame numbers or key indices (default is false which means use key indices)\r\n * @returns the animationGroup stripped from all the keys outside the given range\r\n */\r\n public static ClipInPlace(animationGroup: AnimationGroup, start: number, end: number, dontCloneAnimations?: boolean, useFrame = false): AnimationGroup {\r\n let from = Number.MAX_VALUE;\r\n let to = -Number.MAX_VALUE;\r\n\r\n const targetedAnimations = animationGroup.targetedAnimations;\r\n for (let index = 0; index < targetedAnimations.length; index++) {\r\n const targetedAnimation = targetedAnimations[index];\r\n const animation = dontCloneAnimations ? targetedAnimation.animation : targetedAnimation.animation.clone();\r\n\r\n if (useFrame) {\r\n // Make sure we have keys corresponding to the bounds of the frame range\r\n animation.createKeyForFrame(start);\r\n animation.createKeyForFrame(end);\r\n }\r\n\r\n const keys = animation.getKeys();\r\n const newKeys: IAnimationKey[] = [];\r\n\r\n let startFrame = Number.MAX_VALUE;\r\n for (let k = 0; k < keys.length; k++) {\r\n const key = keys[k];\r\n if ((!useFrame && k >= start && k <= end) || (useFrame && key.frame >= start && key.frame <= end)) {\r\n const newKey: IAnimationKey = {\r\n frame: key.frame,\r\n value: key.value.clone ? key.value.clone() : key.value,\r\n inTangent: key.inTangent,\r\n outTangent: key.outTangent,\r\n interpolation: key.interpolation,\r\n lockedTangent: key.lockedTangent,\r\n };\r\n if (startFrame === Number.MAX_VALUE) {\r\n startFrame = newKey.frame;\r\n }\r\n newKey.frame -= startFrame;\r\n newKeys.push(newKey);\r\n }\r\n }\r\n\r\n if (newKeys.length === 0) {\r\n targetedAnimations.splice(index, 1);\r\n index--;\r\n continue;\r\n }\r\n\r\n if (from > newKeys[0].frame) {\r\n from = newKeys[0].frame;\r\n }\r\n\r\n if (to < newKeys[newKeys.length - 1].frame) {\r\n to = newKeys[newKeys.length - 1].frame;\r\n }\r\n\r\n animation.setKeys(newKeys, true);\r\n targetedAnimation.animation = animation; // in case the animation has been cloned\r\n }\r\n\r\n animationGroup._from = from;\r\n animationGroup._to = to;\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Returns the string \"AnimationGroup\"\r\n * @returns \"AnimationGroup\"\r\n */\r\n public getClassName(): string {\r\n return \"AnimationGroup\";\r\n }\r\n\r\n /**\r\n * Creates a detailed string about the object\r\n * @param fullDetails defines if the output string will support multiple levels of logging within scene loading\r\n * @returns a string representing the object\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name;\r\n ret += \", type: \" + this.getClassName();\r\n if (fullDetails) {\r\n ret += \", from: \" + this._from;\r\n ret += \", to: \" + this._to;\r\n ret += \", isStarted: \" + this._isStarted;\r\n ret += \", speedRatio: \" + this._speedRatio;\r\n ret += \", targetedAnimations length: \" + this._targetedAnimations.length;\r\n ret += \", animatables length: \" + this._animatables;\r\n }\r\n return ret;\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n// \"Coroutines are computer program components that generalize subroutines for non-preemptive multitasking, by allowing execution to be suspended and resumed.\"\r\n// https://en.wikipedia.org/wiki/Coroutine\r\n\r\n// In this implementation, coroutines are typically created via generator functions (function* with yield statements).\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*\r\n\r\n// In this implementation, the generator function (possibly parameterized) is referred to as a coroutine factory, and the returned iterator is referred to as the coroutine.\r\n// Technically yielding generator functions are not required - anything that implements the contract of Coroutine can be run as a coroutine.\r\n\r\n// The coroutine is started with the first call to next on the iterator, it is suspended with yield statements, and it is resumed with additional calls to next on the iterator.\r\n// To create an object satisfying the Coroutine contract with a generator function, it must not yield values, but rather only void via a plain \"yield;\" statement.\r\n// Coroutines can call other coroutines via:\r\n// 1. yield* someOtherCoroutine(); // If the called coroutine does not return a value\r\n// 2. const result = yield* someOtherCoroutine(); // If the called coroutine returns a value\r\n\r\n// Coroutines are run with the runCoroutine function, which takes a Coroutine, a CoroutineScheduler, and a success and error callback.\r\n// A scheduler is responsible for scheduling the next step of a coroutine, either synchronously or asynchronously.\r\n\r\n/**\r\n * A Coroutine is the intersection of:\r\n * 1. An Iterator that yields void, returns a T, and is not passed values with calls to next.\r\n * 2. An IterableIterator of void (since it only yields void).\r\n */\r\ntype CoroutineBase = Iterator & IterableIterator;\r\n/** @internal */\r\nexport type Coroutine = CoroutineBase;\r\n/** @internal */\r\nexport type AsyncCoroutine = CoroutineBase, T>;\r\n\r\n// A CoroutineStep represents a single step of a coroutine, and is an IteratorResult as returned from Coroutine.next().\r\n/** @internal */\r\nexport type CoroutineStep = IteratorResult;\r\n\r\n// A CoroutineScheduler is responsible for scheduling the call to Coroutine.next and invokes the success or error callback after next is called.\r\n/** @internal */\r\nexport type CoroutineScheduler = (coroutine: AsyncCoroutine, onStep: (stepResult: CoroutineStep) => void, onError: (stepError: any) => void) => void;\r\n\r\n// The inline scheduler simply steps the coroutine synchronously. This is useful for running a coroutine synchronously, and also as a helper function for other schedulers.\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function inlineScheduler(coroutine: AsyncCoroutine, onStep: (stepResult: CoroutineStep) => void, onError: (stepError: any) => void) {\r\n try {\r\n const step = coroutine.next();\r\n\r\n if (step.done) {\r\n onStep(step);\r\n } else if (!step.value) {\r\n // NOTE: The properties of step have been narrowed, but the type of step itself is not narrowed, so the cast below is the most type safe way to deal with this without instantiating a new object to hold the values.\r\n onStep(step as { done: typeof step.done; value: typeof step.value });\r\n } else {\r\n step.value.then(() => {\r\n step.value = undefined;\r\n onStep(step as { done: typeof step.done; value: typeof step.value });\r\n }, onError);\r\n }\r\n } catch (error) {\r\n onError(error);\r\n }\r\n}\r\n\r\n// The yielding scheduler steps the coroutine synchronously until the specified time interval has elapsed, then yields control so other operations can be performed.\r\n// A single instance of a yielding scheduler could be shared across multiple coroutines to yield when their collective work exceeds the threshold.\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function createYieldingScheduler(yieldAfterMS = 25) {\r\n let startTime: number | undefined;\r\n return (coroutine: AsyncCoroutine, onStep: (stepResult: CoroutineStep) => void, onError: (stepError: any) => void) => {\r\n const currentTime = performance.now();\r\n\r\n if (startTime === undefined || currentTime - startTime > yieldAfterMS) {\r\n // If this is the first coroutine step, or if the time interval has elapsed, record a new start time, and schedule the coroutine step to happen later, effectively yielding control of the execution context.\r\n startTime = currentTime;\r\n setTimeout(() => {\r\n inlineScheduler(coroutine, onStep, onError);\r\n }, 0);\r\n } else {\r\n // Otherwise it is not time to yield yet, so step the coroutine synchronously.\r\n inlineScheduler(coroutine, onStep, onError);\r\n }\r\n };\r\n}\r\n\r\n// Runs the specified coroutine with the specified scheduler. The success or error callback will be invoked when the coroutine finishes.\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function runCoroutine(\r\n coroutine: AsyncCoroutine,\r\n scheduler: CoroutineScheduler,\r\n onSuccess: (result: T) => void,\r\n onError: (error: any) => void,\r\n abortSignal?: AbortSignal\r\n) {\r\n const resume = () => {\r\n let reschedule: boolean | undefined;\r\n\r\n const onStep = (stepResult: CoroutineStep) => {\r\n if (stepResult.done) {\r\n // If the coroutine is done, report success.\r\n onSuccess(stepResult.value);\r\n } else {\r\n // If the coroutine is not done, resume the coroutine (via the scheduler).\r\n if (reschedule === undefined) {\r\n // If reschedule is undefined at this point, then the coroutine must have stepped synchronously, so just flag another loop iteration.\r\n reschedule = true;\r\n } else {\r\n // If reschedule is defined at this point, then the coroutine must have stepped asynchronously, so call resume to restart the step loop.\r\n resume();\r\n }\r\n }\r\n };\r\n\r\n do {\r\n reschedule = undefined;\r\n\r\n if (!abortSignal || !abortSignal.aborted) {\r\n scheduler(coroutine, onStep, onError);\r\n } else {\r\n onError(new Error(\"Aborted\"));\r\n }\r\n\r\n if (reschedule === undefined) {\r\n // If reschedule is undefined at this point, then the coroutine must have stepped asynchronously, so stop looping and let the coroutine be resumed later.\r\n reschedule = false;\r\n }\r\n } while (reschedule);\r\n };\r\n\r\n resume();\r\n}\r\n\r\n// Runs the specified coroutine synchronously.\r\n/**\r\n * @internal\r\n */\r\nexport function runCoroutineSync(coroutine: Coroutine, abortSignal?: AbortSignal): T {\r\n // Run the coroutine with the inline scheduler, storing the returned value, or re-throwing the error (since the error callback will be called synchronously by the inline scheduler).\r\n let result: T | undefined;\r\n runCoroutine(\r\n coroutine,\r\n inlineScheduler,\r\n (r: T) => (result = r),\r\n (e: any) => {\r\n throw e;\r\n },\r\n abortSignal\r\n );\r\n\r\n // Synchronously return the result of the coroutine.\r\n return result!;\r\n}\r\n\r\n// Runs the specified coroutine asynchronously with the specified scheduler.\r\n/**\r\n * @internal\r\n */\r\nexport function runCoroutineAsync(coroutine: AsyncCoroutine, scheduler: CoroutineScheduler, abortSignal?: AbortSignal): Promise {\r\n // Run the coroutine with a yielding scheduler, resolving or rejecting the result promise when the coroutine finishes.\r\n return new Promise((resolve, reject) => {\r\n runCoroutine(coroutine, scheduler, resolve, reject, abortSignal);\r\n });\r\n}\r\n\r\n/**\r\n * Given a function that returns a Coroutine, produce a function with the same parameters that returns a T.\r\n * The returned function runs the coroutine synchronously.\r\n * @param coroutineFactory A function that returns a Coroutine.\r\n * @param abortSignal\r\n * @returns A function that runs the coroutine synchronously.\r\n * @internal\r\n */\r\nexport function makeSyncFunction(\r\n coroutineFactory: (...params: TParams) => Coroutine,\r\n abortSignal?: AbortSignal\r\n): (...params: TParams) => TReturn {\r\n return (...params: TParams) => {\r\n // Run the coroutine synchronously.\r\n return runCoroutineSync(coroutineFactory(...params), abortSignal);\r\n };\r\n}\r\n\r\n/**\r\n * Given a function that returns a Coroutine, product a function with the same parameters that returns a Promise.\r\n * The returned function runs the coroutine asynchronously, yield control of the execution context occasionally to enable a more responsive experience.\r\n * @param coroutineFactory A function that returns a Coroutine.\r\n * @param scheduler\r\n * @param abortSignal\r\n * @returns A function that runs the coroutine asynchronously.\r\n * @internal\r\n */\r\nexport function makeAsyncFunction(\r\n coroutineFactory: (...params: TParams) => AsyncCoroutine,\r\n scheduler: CoroutineScheduler,\r\n abortSignal?: AbortSignal\r\n): (...params: TParams) => Promise {\r\n return (...params: TParams) => {\r\n // Run the coroutine asynchronously.\r\n return runCoroutineAsync(coroutineFactory(...params), scheduler, abortSignal);\r\n };\r\n}\r\n", "import type { IViewportLike } from \"./math.like\";\r\n\r\n/**\r\n * Class used to represent a viewport on screen\r\n */\r\nexport class Viewport implements IViewportLike {\r\n /**\r\n * Creates a Viewport object located at (x, y) and sized (width, height)\r\n * @param x defines viewport left coordinate\r\n * @param y defines viewport top coordinate\r\n * @param width defines the viewport width\r\n * @param height defines the viewport height\r\n */\r\n constructor(\r\n /** viewport left coordinate */\r\n public x: number,\r\n /** viewport top coordinate */\r\n public y: number,\r\n /**viewport width */\r\n public width: number,\r\n /** viewport height */\r\n public height: number\r\n ) {}\r\n\r\n /**\r\n * Creates a new viewport using absolute sizing (from 0-> width, 0-> height instead of 0->1)\r\n * @param renderWidth defines the rendering width\r\n * @param renderHeight defines the rendering height\r\n * @returns a new Viewport\r\n */\r\n public toGlobal(renderWidth: number, renderHeight: number): Viewport {\r\n return new Viewport(this.x * renderWidth, this.y * renderHeight, this.width * renderWidth, this.height * renderHeight);\r\n }\r\n\r\n /**\r\n * Stores absolute viewport value into a target viewport (from 0-> width, 0-> height instead of 0->1)\r\n * @param renderWidth defines the rendering width\r\n * @param renderHeight defines the rendering height\r\n * @param ref defines the target viewport\r\n * @returns the current viewport\r\n */\r\n public toGlobalToRef(renderWidth: number, renderHeight: number, ref: Viewport): Viewport {\r\n ref.x = this.x * renderWidth;\r\n ref.y = this.y * renderHeight;\r\n ref.width = this.width * renderWidth;\r\n ref.height = this.height * renderHeight;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Viewport copied from the current one\r\n * @returns a new Viewport\r\n */\r\n public clone(): Viewport {\r\n return new Viewport(this.x, this.y, this.width, this.height);\r\n }\r\n}\r\n", "import { serialize, serializeAsVector3 } from \"../Misc/decorators\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { DeepImmutable, Nullable } from \"../types\";\r\nimport type { CameraInputsManager } from \"./cameraInputsManager\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Matrix, Vector3, Quaternion } from \"../Maths/math.vector\";\r\nimport { Node } from \"../node\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { ICullable } from \"../Culling/boundingInfo\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { GetClass } from \"../Misc/typeStore\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { Frustum } from \"../Maths/math.frustum\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\nimport type { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { FreeCamera } from \"./freeCamera\";\r\nimport type { TargetCamera } from \"./targetCamera\";\r\nimport type { Ray } from \"../Culling/ray\";\r\nimport type { ArcRotateCamera } from \"./arcRotateCamera\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\n\r\n/**\r\n * Oblique projection values\r\n */\r\nexport interface IObliqueParams {\r\n /** The angle of the plane */\r\n angle: number;\r\n /** The length of the plane */\r\n length: number;\r\n /** The offset of the plane */\r\n offset: number;\r\n}\r\n\r\n/**\r\n * This is the base class of all the camera used in the application.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras\r\n */\r\nexport class Camera extends Node {\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _CreateDefaultParsedCamera = (name: string, scene: Scene): Camera => {\r\n throw _WarnImport(\"UniversalCamera\");\r\n };\r\n\r\n /**\r\n * This is the default projection mode used by the cameras.\r\n * It helps recreating a feeling of perspective and better appreciate depth.\r\n * This is the best way to simulate real life cameras.\r\n */\r\n public static readonly PERSPECTIVE_CAMERA = Constants.PERSPECTIVE_CAMERA;\r\n /**\r\n * This helps creating camera with an orthographic mode.\r\n * Orthographic is commonly used in engineering as a means to produce object specifications that communicate dimensions unambiguously, each line of 1 unit length (cm, meter..whatever) will appear to have the same length everywhere on the drawing. This allows the drafter to dimension only a subset of lines and let the reader know that other lines of that length on the drawing are also that length in reality. Every parallel line in the drawing is also parallel in the object.\r\n */\r\n public static readonly ORTHOGRAPHIC_CAMERA = Constants.ORTHOGRAPHIC_CAMERA;\r\n\r\n /**\r\n * This is the default FOV mode for perspective cameras.\r\n * This setting aligns the upper and lower bounds of the viewport to the upper and lower bounds of the camera frustum.\r\n */\r\n public static readonly FOVMODE_VERTICAL_FIXED = Constants.FOVMODE_VERTICAL_FIXED;\r\n /**\r\n * This setting aligns the left and right bounds of the viewport to the left and right bounds of the camera frustum.\r\n */\r\n public static readonly FOVMODE_HORIZONTAL_FIXED = Constants.FOVMODE_HORIZONTAL_FIXED;\r\n\r\n /**\r\n * This specifies there is no need for a camera rig.\r\n * Basically only one eye is rendered corresponding to the camera.\r\n */\r\n public static readonly RIG_MODE_NONE = Constants.RIG_MODE_NONE;\r\n /**\r\n * Simulates a camera Rig with one blue eye and one red eye.\r\n * This can be use with 3d blue and red glasses.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_ANAGLYPH = Constants.RIG_MODE_STEREOSCOPIC_ANAGLYPH;\r\n /**\r\n * Defines that both eyes of the camera will be rendered side by side with a parallel target.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL = Constants.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL;\r\n /**\r\n * Defines that both eyes of the camera will be rendered side by side with a none parallel target.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED = Constants.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED;\r\n /**\r\n * Defines that both eyes of the camera will be rendered over under each other.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_OVERUNDER = Constants.RIG_MODE_STEREOSCOPIC_OVERUNDER;\r\n /**\r\n * Defines that both eyes of the camera will be rendered on successive lines interlaced for passive 3d monitors.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_INTERLACED = Constants.RIG_MODE_STEREOSCOPIC_INTERLACED;\r\n /**\r\n * Defines that both eyes of the camera should be renderered in a VR mode (carbox).\r\n */\r\n public static readonly RIG_MODE_VR = Constants.RIG_MODE_VR;\r\n /**\r\n * Custom rig mode allowing rig cameras to be populated manually with any number of cameras\r\n */\r\n public static readonly RIG_MODE_CUSTOM = Constants.RIG_MODE_CUSTOM;\r\n\r\n /**\r\n * Defines if by default attaching controls should prevent the default javascript event to continue.\r\n */\r\n public static ForceAttachControlToAlwaysPreventDefault = false;\r\n\r\n /**\r\n * Define the input manager associated with the camera.\r\n */\r\n public inputs: CameraInputsManager;\r\n\r\n /** @internal */\r\n @serializeAsVector3(\"position\")\r\n public _position = Vector3.Zero();\r\n\r\n /**\r\n * Define the current local position of the camera in the scene\r\n */\r\n public get position(): Vector3 {\r\n return this._position;\r\n }\r\n\r\n public set position(newPosition: Vector3) {\r\n this._position = newPosition;\r\n }\r\n\r\n @serializeAsVector3(\"upVector\")\r\n protected _upVector = Vector3.Up();\r\n\r\n /**\r\n * The vector the camera should consider as up.\r\n * (default is Vector3(0, 1, 0) aka Vector3.Up())\r\n */\r\n public set upVector(vec: Vector3) {\r\n this._upVector = vec;\r\n }\r\n\r\n public get upVector() {\r\n return this._upVector;\r\n }\r\n\r\n /**\r\n * Object containing oblique projection values (only used with ORTHOGRAPHIC_CAMERA)\r\n */\r\n public oblique: Nullable = null;\r\n\r\n /**\r\n * The screen area in scene units squared\r\n */\r\n public get screenArea(): number {\r\n let x = 0;\r\n let y = 0;\r\n if (this.mode === Camera.PERSPECTIVE_CAMERA) {\r\n if (this.fovMode === Camera.FOVMODE_VERTICAL_FIXED) {\r\n y = this.minZ * 2 * Math.tan(this.fov / 2);\r\n x = this.getEngine().getAspectRatio(this) * y;\r\n } else {\r\n x = this.minZ * 2 * Math.tan(this.fov / 2);\r\n y = x / this.getEngine().getAspectRatio(this);\r\n }\r\n } else {\r\n const halfWidth = this.getEngine().getRenderWidth() / 2.0;\r\n const halfHeight = this.getEngine().getRenderHeight() / 2.0;\r\n\r\n x = (this.orthoRight ?? halfWidth) - (this.orthoLeft ?? -halfWidth);\r\n y = (this.orthoTop ?? halfHeight) - (this.orthoBottom ?? -halfHeight);\r\n }\r\n\r\n return x * y;\r\n }\r\n\r\n private _orthoLeft: Nullable = null;\r\n\r\n /**\r\n * Define the current limit on the left side for an orthographic camera\r\n * In scene unit\r\n */\r\n public set orthoLeft(value: Nullable) {\r\n this._orthoLeft = value;\r\n\r\n for (const rigCamera of this._rigCameras) {\r\n rigCamera.orthoLeft = value;\r\n }\r\n }\r\n\r\n @serialize()\r\n public get orthoLeft(): Nullable {\r\n return this._orthoLeft;\r\n }\r\n\r\n private _orthoRight: Nullable = null;\r\n\r\n /**\r\n * Define the current limit on the right side for an orthographic camera\r\n * In scene unit\r\n */\r\n public set orthoRight(value: Nullable) {\r\n this._orthoRight = value;\r\n\r\n for (const rigCamera of this._rigCameras) {\r\n rigCamera.orthoRight = value;\r\n }\r\n }\r\n\r\n @serialize()\r\n public get orthoRight(): Nullable {\r\n return this._orthoRight;\r\n }\r\n\r\n private _orthoBottom: Nullable = null;\r\n\r\n /**\r\n * Define the current limit on the bottom side for an orthographic camera\r\n * In scene unit\r\n */\r\n public set orthoBottom(value: Nullable) {\r\n this._orthoBottom = value;\r\n\r\n for (const rigCamera of this._rigCameras) {\r\n rigCamera.orthoBottom = value;\r\n }\r\n }\r\n\r\n @serialize()\r\n public get orthoBottom(): Nullable {\r\n return this._orthoBottom;\r\n }\r\n\r\n private _orthoTop: Nullable = null;\r\n\r\n /**\r\n * Define the current limit on the top side for an orthographic camera\r\n * In scene unit\r\n */\r\n public set orthoTop(value: Nullable) {\r\n this._orthoTop = value;\r\n\r\n for (const rigCamera of this._rigCameras) {\r\n rigCamera.orthoTop = value;\r\n }\r\n }\r\n\r\n @serialize()\r\n public get orthoTop(): Nullable {\r\n return this._orthoTop;\r\n }\r\n\r\n /**\r\n * Field Of View is set in Radians. (default is 0.8)\r\n */\r\n @serialize()\r\n public fov = 0.8;\r\n\r\n /**\r\n * Projection plane tilt around the X axis (horizontal), set in Radians. (default is 0)\r\n * Can be used to make vertical lines in world space actually vertical on the screen.\r\n * See https://forum.babylonjs.com/t/add-vertical-shift-to-3ds-max-exporter-babylon-cameras/17480\r\n */\r\n @serialize()\r\n public projectionPlaneTilt = 0;\r\n\r\n /**\r\n * Define the minimum distance the camera can see from.\r\n * This is important to note that the depth buffer are not infinite and the closer it starts\r\n * the more your scene might encounter depth fighting issue.\r\n */\r\n @serialize()\r\n public minZ = 1;\r\n\r\n /**\r\n * Define the maximum distance the camera can see to.\r\n * This is important to note that the depth buffer are not infinite and the further it end\r\n * the more your scene might encounter depth fighting issue.\r\n */\r\n @serialize()\r\n public maxZ = 10000.0;\r\n\r\n /**\r\n * Define the default inertia of the camera.\r\n * This helps giving a smooth feeling to the camera movement.\r\n */\r\n @serialize()\r\n public inertia = 0.9;\r\n\r\n private _mode = Camera.PERSPECTIVE_CAMERA;\r\n\r\n /**\r\n * Define the mode of the camera (Camera.PERSPECTIVE_CAMERA or Camera.ORTHOGRAPHIC_CAMERA)\r\n */\r\n set mode(mode: number) {\r\n this._mode = mode;\r\n\r\n // Pass the mode down to the rig cameras\r\n for (const rigCamera of this._rigCameras) {\r\n rigCamera.mode = mode;\r\n }\r\n }\r\n\r\n @serialize()\r\n get mode(): number {\r\n return this._mode;\r\n }\r\n\r\n /**\r\n * Define whether the camera is intermediate.\r\n * This is useful to not present the output directly to the screen in case of rig without post process for instance\r\n */\r\n public isIntermediate = false;\r\n\r\n /**\r\n * Define the viewport of the camera.\r\n * This correspond to the portion of the screen the camera will render to in normalized 0 to 1 unit.\r\n */\r\n public viewport = new Viewport(0, 0, 1.0, 1.0);\r\n\r\n /**\r\n * Restricts the camera to viewing objects with the same layerMask.\r\n * A camera with a layerMask of 1 will render mesh.layerMask & camera.layerMask!== 0\r\n */\r\n @serialize()\r\n public layerMask: number = 0x0fffffff;\r\n\r\n /**\r\n * fovMode sets the camera frustum bounds to the viewport bounds. (default is FOVMODE_VERTICAL_FIXED)\r\n */\r\n @serialize()\r\n public fovMode: number = Camera.FOVMODE_VERTICAL_FIXED;\r\n\r\n /**\r\n * Rig mode of the camera.\r\n * This is useful to create the camera with two \"eyes\" instead of one to create VR or stereoscopic scenes.\r\n * This is normally controlled byt the camera themselves as internal use.\r\n */\r\n @serialize()\r\n public cameraRigMode = Camera.RIG_MODE_NONE;\r\n\r\n /**\r\n * Defines the distance between both \"eyes\" in case of a RIG\r\n */\r\n @serialize()\r\n public interaxialDistance: number;\r\n\r\n /**\r\n * Defines if stereoscopic rendering is done side by side or over under.\r\n */\r\n @serialize()\r\n public isStereoscopicSideBySide: boolean;\r\n\r\n /**\r\n * Defines the list of custom render target which are rendered to and then used as the input to this camera's render. Eg. display another camera view on a TV in the main scene\r\n * This is pretty helpful if you wish to make a camera render to a texture you could reuse somewhere\r\n * else in the scene. (Eg. security camera)\r\n *\r\n * To change the final output target of the camera, camera.outputRenderTarget should be used instead (eg. webXR renders to a render target corresponding to an HMD)\r\n */\r\n public customRenderTargets: RenderTargetTexture[] = [];\r\n /**\r\n * When set, the camera will render to this render target instead of the default canvas\r\n *\r\n * If the desire is to use the output of a camera as a texture in the scene consider using camera.customRenderTargets instead\r\n */\r\n public outputRenderTarget: Nullable = null;\r\n\r\n /**\r\n * Observable triggered when the camera view matrix has changed.\r\n */\r\n public onViewMatrixChangedObservable = new Observable();\r\n /**\r\n * Observable triggered when the camera Projection matrix has changed.\r\n */\r\n public onProjectionMatrixChangedObservable = new Observable();\r\n /**\r\n * Observable triggered when the inputs have been processed.\r\n */\r\n public onAfterCheckInputsObservable = new Observable();\r\n /**\r\n * Observable triggered when reset has been called and applied to the camera.\r\n */\r\n public onRestoreStateObservable = new Observable();\r\n\r\n /**\r\n * Is this camera a part of a rig system?\r\n */\r\n public isRigCamera: boolean = false;\r\n\r\n /**\r\n * If isRigCamera set to true this will be set with the parent camera.\r\n * The parent camera is not (!) necessarily the .parent of this camera (like in the case of XR)\r\n */\r\n public rigParent?: Camera;\r\n\r\n /**\r\n * Render pass id used by the camera to render into the main framebuffer\r\n */\r\n public renderPassId: number;\r\n\r\n private _hasMoved = false;\r\n\r\n /**\r\n * Gets a flag indicating that the camera has moved in some way since the last call to Camera.update()\r\n */\r\n public get hasMoved() {\r\n return this._hasMoved;\r\n }\r\n\r\n /** @internal */\r\n public _cameraRigParams: any;\r\n /** @internal */\r\n public _rigCameras = new Array();\r\n /** @internal */\r\n public _rigPostProcess: Nullable;\r\n\r\n /** @internal */\r\n public _skipRendering = false;\r\n\r\n /** @internal */\r\n public _projectionMatrix = new Matrix();\r\n\r\n /** @internal */\r\n public _postProcesses = new Array>();\r\n\r\n /** @internal */\r\n public _activeMeshes = new SmartArray(256);\r\n\r\n protected _globalPosition = Vector3.Zero();\r\n\r\n /** @internal */\r\n public _computedViewMatrix = Matrix.Identity();\r\n private _doNotComputeProjectionMatrix = false;\r\n private _transformMatrix = Matrix.Zero();\r\n private _frustumPlanes: Plane[];\r\n private _refreshFrustumPlanes = true;\r\n private _storedFov: number;\r\n private _stateStored: boolean;\r\n private _absoluteRotation: Quaternion = Quaternion.Identity();\r\n\r\n /**\r\n * Instantiates a new camera object.\r\n * This should not be used directly but through the inherited cameras: ArcRotate, Free...\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras\r\n * @param name Defines the name of the camera in the scene\r\n * @param position Defines the position of the camera\r\n * @param scene Defines the scene the camera belongs too\r\n * @param setActiveOnSceneIfNoneActive Defines if the camera should be set as active after creation if no other camera have been defined in the scene\r\n */\r\n constructor(name: string, position: Vector3, scene?: Scene, setActiveOnSceneIfNoneActive = true) {\r\n super(name, scene);\r\n\r\n this.getScene().addCamera(this);\r\n\r\n if (setActiveOnSceneIfNoneActive && !this.getScene().activeCamera) {\r\n this.getScene().activeCamera = this;\r\n }\r\n\r\n this.position = position;\r\n this.renderPassId = this.getScene().getEngine().createRenderPassId(`Camera ${name}`);\r\n }\r\n\r\n /**\r\n * Store current camera state (fov, position, etc..)\r\n * @returns the camera\r\n */\r\n public storeState(): Camera {\r\n this._stateStored = true;\r\n this._storedFov = this.fov;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Restores the camera state values if it has been stored. You must call storeState() first\r\n * @returns true if restored and false otherwise\r\n */\r\n protected _restoreStateValues(): boolean {\r\n if (!this._stateStored) {\r\n return false;\r\n }\r\n\r\n this.fov = this._storedFov;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Restored camera state. You must call storeState() first.\r\n * @returns true if restored and false otherwise\r\n */\r\n public restoreState(): boolean {\r\n if (this._restoreStateValues()) {\r\n this.onRestoreStateObservable.notifyObservers(this);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets the class name of the camera.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"Camera\";\r\n }\r\n\r\n /** @internal */\r\n public readonly _isCamera = true;\r\n\r\n /**\r\n * Gets a string representation of the camera useful for debug purpose.\r\n * @param fullDetails Defines that a more verbose level of logging is required\r\n * @returns the string representation\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name;\r\n ret += \", type: \" + this.getClassName();\r\n if (this.animations) {\r\n for (let i = 0; i < this.animations.length; i++) {\r\n ret += \", animation[0]: \" + this.animations[i].toString(fullDetails);\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Automatically tilts the projection plane, using `projectionPlaneTilt`, to correct the perspective effect on vertical lines.\r\n */\r\n public applyVerticalCorrection() {\r\n const rot = this.absoluteRotation.toEulerAngles();\r\n\r\n this.projectionPlaneTilt = this._scene.useRightHandedSystem ? -rot.x : rot.x;\r\n }\r\n\r\n /**\r\n * Gets the current world space position of the camera.\r\n */\r\n public get globalPosition(): Vector3 {\r\n return this._globalPosition;\r\n }\r\n\r\n /**\r\n * Gets the list of active meshes this frame (meshes no culled or excluded by lod s in the frame)\r\n * @returns the active meshe list\r\n */\r\n public getActiveMeshes(): SmartArray {\r\n return this._activeMeshes;\r\n }\r\n\r\n /**\r\n * Check whether a mesh is part of the current active mesh list of the camera\r\n * @param mesh Defines the mesh to check\r\n * @returns true if active, false otherwise\r\n */\r\n public isActiveMesh(mesh: Mesh): boolean {\r\n return this._activeMeshes.indexOf(mesh) !== -1;\r\n }\r\n\r\n /**\r\n * Is this camera ready to be used/rendered\r\n * @param completeCheck defines if a complete check (including post processes) has to be done (false by default)\r\n * @returns true if the camera is ready\r\n */\r\n public isReady(completeCheck = false): boolean {\r\n if (completeCheck) {\r\n for (const pp of this._postProcesses) {\r\n if (pp && !pp.isReady()) {\r\n return false;\r\n }\r\n }\r\n }\r\n return super.isReady(completeCheck);\r\n }\r\n\r\n /** @internal */\r\n public _initCache() {\r\n super._initCache();\r\n\r\n this._cache.position = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n this._cache.upVector = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n\r\n this._cache.mode = undefined;\r\n this._cache.minZ = undefined;\r\n this._cache.maxZ = undefined;\r\n\r\n this._cache.fov = undefined;\r\n this._cache.fovMode = undefined;\r\n this._cache.aspectRatio = undefined;\r\n\r\n this._cache.orthoLeft = undefined;\r\n this._cache.orthoRight = undefined;\r\n this._cache.orthoBottom = undefined;\r\n this._cache.orthoTop = undefined;\r\n this._cache.obliqueAngle = undefined;\r\n this._cache.obliqueLength = undefined;\r\n this._cache.obliqueOffset = undefined;\r\n this._cache.renderWidth = undefined;\r\n this._cache.renderHeight = undefined;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateCache(ignoreParentClass?: boolean): void {\r\n if (!ignoreParentClass) {\r\n super._updateCache();\r\n }\r\n\r\n this._cache.position.copyFrom(this.position);\r\n this._cache.upVector.copyFrom(this.upVector);\r\n }\r\n\r\n /** @internal */\r\n public _isSynchronized(): boolean {\r\n return this._isSynchronizedViewMatrix() && this._isSynchronizedProjectionMatrix();\r\n }\r\n\r\n /** @internal */\r\n public _isSynchronizedViewMatrix(): boolean {\r\n if (!super._isSynchronized()) {\r\n return false;\r\n }\r\n\r\n return this._cache.position.equals(this.position) && this._cache.upVector.equals(this.upVector) && this.isSynchronizedWithParent();\r\n }\r\n\r\n /** @internal */\r\n public _isSynchronizedProjectionMatrix(): boolean {\r\n let isSynchronized = this._cache.mode === this.mode && this._cache.minZ === this.minZ && this._cache.maxZ === this.maxZ;\r\n\r\n if (!isSynchronized) {\r\n return false;\r\n }\r\n\r\n const engine = this.getEngine();\r\n\r\n if (this.mode === Camera.PERSPECTIVE_CAMERA) {\r\n isSynchronized =\r\n this._cache.fov === this.fov &&\r\n this._cache.fovMode === this.fovMode &&\r\n this._cache.aspectRatio === engine.getAspectRatio(this) &&\r\n this._cache.projectionPlaneTilt === this.projectionPlaneTilt;\r\n } else {\r\n isSynchronized =\r\n this._cache.orthoLeft === this.orthoLeft &&\r\n this._cache.orthoRight === this.orthoRight &&\r\n this._cache.orthoBottom === this.orthoBottom &&\r\n this._cache.orthoTop === this.orthoTop &&\r\n this._cache.renderWidth === engine.getRenderWidth() &&\r\n this._cache.renderHeight === engine.getRenderHeight();\r\n\r\n if (this.oblique) {\r\n isSynchronized =\r\n isSynchronized &&\r\n this._cache.obliqueAngle === this.oblique.angle &&\r\n this._cache.obliqueLength === this.oblique.length &&\r\n this._cache.obliqueOffset === this.oblique.offset;\r\n }\r\n }\r\n\r\n return isSynchronized;\r\n }\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(noPreventDefault?: boolean): void;\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param ignored defines an ignored parameter kept for backward compatibility.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n * BACK COMPAT SIGNATURE ONLY.\r\n */\r\n public attachControl(ignored: any, noPreventDefault?: boolean): void;\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * This function is here because typescript removes the typing of the last function.\r\n * @param _ignored defines an ignored parameter kept for backward compatibility.\r\n * @param _noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(_ignored?: any, _noPreventDefault?: boolean): void {}\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public detachControl(): void;\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n * @param ignored defines an ignored parameter kept for backward compatibility.\r\n */\r\n public detachControl(ignored?: any): void;\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n * This function is here because typescript removes the typing of the last function.\r\n * @param _ignored defines an ignored parameter kept for backward compatibility.\r\n */\r\n public detachControl(_ignored?: any): void {}\r\n\r\n /**\r\n * Update the camera state according to the different inputs gathered during the frame.\r\n */\r\n public update(): void {\r\n this._hasMoved = false;\r\n this._checkInputs();\r\n if (this.cameraRigMode !== Camera.RIG_MODE_NONE) {\r\n this._updateRigCameras();\r\n }\r\n\r\n // Attempt to update the camera's view and projection matrices.\r\n // This call is being made because these matrices are no longer being updated\r\n // as a part of the picking ray process (in addition to scene.render).\r\n this.getViewMatrix();\r\n this.getProjectionMatrix();\r\n }\r\n\r\n /** @internal */\r\n public _checkInputs(): void {\r\n this.onAfterCheckInputsObservable.notifyObservers(this);\r\n }\r\n\r\n /** @internal */\r\n public get rigCameras(): Camera[] {\r\n return this._rigCameras;\r\n }\r\n\r\n /**\r\n * Gets the post process used by the rig cameras\r\n */\r\n public get rigPostProcess(): Nullable {\r\n return this._rigPostProcess;\r\n }\r\n\r\n /**\r\n * Internal, gets the first post process.\r\n * @returns the first post process to be run on this camera.\r\n */\r\n public _getFirstPostProcess(): Nullable {\r\n for (let ppIndex = 0; ppIndex < this._postProcesses.length; ppIndex++) {\r\n if (this._postProcesses[ppIndex] !== null) {\r\n return this._postProcesses[ppIndex];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _cascadePostProcessesToRigCams(): void {\r\n // invalidate framebuffer\r\n const firstPostProcess = this._getFirstPostProcess();\r\n if (firstPostProcess) {\r\n firstPostProcess.markTextureDirty();\r\n }\r\n\r\n // glue the rigPostProcess to the end of the user postprocesses & assign to each sub-camera\r\n for (let i = 0, len = this._rigCameras.length; i < len; i++) {\r\n const cam = this._rigCameras[i];\r\n const rigPostProcess = cam._rigPostProcess;\r\n\r\n // for VR rig, there does not have to be a post process\r\n if (rigPostProcess) {\r\n const isPass = rigPostProcess.getEffectName() === \"pass\";\r\n if (isPass) {\r\n // any rig which has a PassPostProcess for rig[0], cannot be isIntermediate when there are also user postProcesses\r\n cam.isIntermediate = this._postProcesses.length === 0;\r\n }\r\n cam._postProcesses = this._postProcesses.slice(0).concat(rigPostProcess);\r\n rigPostProcess.markTextureDirty();\r\n } else {\r\n cam._postProcesses = this._postProcesses.slice(0);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Attach a post process to the camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#attach-postprocess\r\n * @param postProcess The post process to attach to the camera\r\n * @param insertAt The position of the post process in case several of them are in use in the scene\r\n * @returns the position the post process has been inserted at\r\n */\r\n public attachPostProcess(postProcess: PostProcess, insertAt: Nullable = null): number {\r\n if (!postProcess.isReusable() && this._postProcesses.indexOf(postProcess) > -1) {\r\n Logger.Error(\"You're trying to reuse a post process not defined as reusable.\");\r\n return 0;\r\n }\r\n\r\n if (insertAt == null || insertAt < 0) {\r\n this._postProcesses.push(postProcess);\r\n } else if (this._postProcesses[insertAt] === null) {\r\n this._postProcesses[insertAt] = postProcess;\r\n } else {\r\n this._postProcesses.splice(insertAt, 0, postProcess);\r\n }\r\n this._cascadePostProcessesToRigCams(); // also ensures framebuffer invalidated\r\n\r\n // Update prePass\r\n if (this._scene.prePassRenderer) {\r\n this._scene.prePassRenderer.markAsDirty();\r\n }\r\n\r\n return this._postProcesses.indexOf(postProcess);\r\n }\r\n\r\n /**\r\n * Detach a post process to the camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#attach-postprocess\r\n * @param postProcess The post process to detach from the camera\r\n */\r\n public detachPostProcess(postProcess: PostProcess): void {\r\n const idx = this._postProcesses.indexOf(postProcess);\r\n if (idx !== -1) {\r\n this._postProcesses[idx] = null;\r\n }\r\n\r\n // Update prePass\r\n if (this._scene.prePassRenderer) {\r\n this._scene.prePassRenderer.markAsDirty();\r\n }\r\n\r\n this._cascadePostProcessesToRigCams(); // also ensures framebuffer invalidated\r\n }\r\n\r\n /**\r\n * Gets the current world matrix of the camera\r\n * @returns the world matrix\r\n */\r\n public getWorldMatrix(): Matrix {\r\n if (this._isSynchronizedViewMatrix()) {\r\n return this._worldMatrix;\r\n }\r\n\r\n // Getting the view matrix will also compute the world matrix.\r\n this.getViewMatrix();\r\n\r\n return this._worldMatrix;\r\n }\r\n\r\n /** @internal */\r\n public _getViewMatrix(): Matrix {\r\n return Matrix.Identity();\r\n }\r\n\r\n /**\r\n * Gets the current view matrix of the camera.\r\n * @param force forces the camera to recompute the matrix without looking at the cached state\r\n * @returns the view matrix\r\n */\r\n public getViewMatrix(force?: boolean): Matrix {\r\n if (!force && this._isSynchronizedViewMatrix()) {\r\n return this._computedViewMatrix;\r\n }\r\n\r\n this._hasMoved = true;\r\n\r\n this.updateCache();\r\n this._computedViewMatrix = this._getViewMatrix();\r\n\r\n this._currentRenderId = this.getScene().getRenderId();\r\n this._childUpdateId++;\r\n\r\n this._refreshFrustumPlanes = true;\r\n\r\n if (this._cameraRigParams && this._cameraRigParams.vrPreViewMatrix) {\r\n this._computedViewMatrix.multiplyToRef(this._cameraRigParams.vrPreViewMatrix, this._computedViewMatrix);\r\n }\r\n\r\n // Notify parent camera if rig camera is changed\r\n if (this.parent && (this.parent as Camera).onViewMatrixChangedObservable) {\r\n (this.parent as Camera).onViewMatrixChangedObservable.notifyObservers(this.parent as Camera);\r\n }\r\n\r\n this.onViewMatrixChangedObservable.notifyObservers(this);\r\n\r\n this._computedViewMatrix.invertToRef(this._worldMatrix);\r\n\r\n return this._computedViewMatrix;\r\n }\r\n\r\n /**\r\n * Freeze the projection matrix.\r\n * It will prevent the cache check of the camera projection compute and can speed up perf\r\n * if no parameter of the camera are meant to change\r\n * @param projection Defines manually a projection if necessary\r\n */\r\n public freezeProjectionMatrix(projection?: Matrix): void {\r\n this._doNotComputeProjectionMatrix = true;\r\n if (projection !== undefined) {\r\n this._projectionMatrix = projection;\r\n }\r\n }\r\n\r\n /**\r\n * Unfreeze the projection matrix if it has previously been freezed by freezeProjectionMatrix.\r\n */\r\n public unfreezeProjectionMatrix(): void {\r\n this._doNotComputeProjectionMatrix = false;\r\n }\r\n\r\n /**\r\n * Gets the current projection matrix of the camera.\r\n * @param force forces the camera to recompute the matrix without looking at the cached state\r\n * @returns the projection matrix\r\n */\r\n public getProjectionMatrix(force?: boolean): Matrix {\r\n if (this._doNotComputeProjectionMatrix || (!force && this._isSynchronizedProjectionMatrix())) {\r\n return this._projectionMatrix;\r\n }\r\n\r\n // Cache\r\n this._cache.mode = this.mode;\r\n this._cache.minZ = this.minZ;\r\n this._cache.maxZ = this.maxZ;\r\n\r\n // Matrix\r\n this._refreshFrustumPlanes = true;\r\n\r\n const engine = this.getEngine();\r\n const scene = this.getScene();\r\n const reverseDepth = engine.useReverseDepthBuffer;\r\n if (this.mode === Camera.PERSPECTIVE_CAMERA) {\r\n this._cache.fov = this.fov;\r\n this._cache.fovMode = this.fovMode;\r\n this._cache.aspectRatio = engine.getAspectRatio(this);\r\n this._cache.projectionPlaneTilt = this.projectionPlaneTilt;\r\n\r\n if (this.minZ <= 0) {\r\n this.minZ = 0.1;\r\n }\r\n\r\n let getProjectionMatrix: (\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n result: Matrix,\r\n isVerticalFovFixed: boolean,\r\n halfZRange: boolean,\r\n projectionPlaneTilt: number,\r\n reverseDepthBufferMode: boolean\r\n ) => void;\r\n if (scene.useRightHandedSystem) {\r\n getProjectionMatrix = Matrix.PerspectiveFovRHToRef;\r\n } else {\r\n getProjectionMatrix = Matrix.PerspectiveFovLHToRef;\r\n }\r\n\r\n getProjectionMatrix(\r\n this.fov,\r\n engine.getAspectRatio(this),\r\n reverseDepth ? this.maxZ : this.minZ,\r\n reverseDepth ? this.minZ : this.maxZ,\r\n this._projectionMatrix,\r\n this.fovMode === Camera.FOVMODE_VERTICAL_FIXED,\r\n engine.isNDCHalfZRange,\r\n this.projectionPlaneTilt,\r\n reverseDepth\r\n );\r\n } else {\r\n const halfWidth = engine.getRenderWidth() / 2.0;\r\n const halfHeight = engine.getRenderHeight() / 2.0;\r\n if (scene.useRightHandedSystem) {\r\n if (this.oblique) {\r\n Matrix.ObliqueOffCenterRHToRef(\r\n this.orthoLeft ?? -halfWidth,\r\n this.orthoRight ?? halfWidth,\r\n this.orthoBottom ?? -halfHeight,\r\n this.orthoTop ?? halfHeight,\r\n reverseDepth ? this.maxZ : this.minZ,\r\n reverseDepth ? this.minZ : this.maxZ,\r\n this.oblique.length,\r\n this.oblique.angle,\r\n this._computeObliqueDistance(this.oblique.offset),\r\n this._projectionMatrix,\r\n engine.isNDCHalfZRange\r\n );\r\n } else {\r\n Matrix.OrthoOffCenterRHToRef(\r\n this.orthoLeft ?? -halfWidth,\r\n this.orthoRight ?? halfWidth,\r\n this.orthoBottom ?? -halfHeight,\r\n this.orthoTop ?? halfHeight,\r\n reverseDepth ? this.maxZ : this.minZ,\r\n reverseDepth ? this.minZ : this.maxZ,\r\n this._projectionMatrix,\r\n engine.isNDCHalfZRange\r\n );\r\n }\r\n } else {\r\n if (this.oblique) {\r\n Matrix.ObliqueOffCenterLHToRef(\r\n this.orthoLeft ?? -halfWidth,\r\n this.orthoRight ?? halfWidth,\r\n this.orthoBottom ?? -halfHeight,\r\n this.orthoTop ?? halfHeight,\r\n reverseDepth ? this.maxZ : this.minZ,\r\n reverseDepth ? this.minZ : this.maxZ,\r\n this.oblique.length,\r\n this.oblique.angle,\r\n this._computeObliqueDistance(this.oblique.offset),\r\n this._projectionMatrix,\r\n engine.isNDCHalfZRange\r\n );\r\n } else {\r\n Matrix.OrthoOffCenterLHToRef(\r\n this.orthoLeft ?? -halfWidth,\r\n this.orthoRight ?? halfWidth,\r\n this.orthoBottom ?? -halfHeight,\r\n this.orthoTop ?? halfHeight,\r\n reverseDepth ? this.maxZ : this.minZ,\r\n reverseDepth ? this.minZ : this.maxZ,\r\n this._projectionMatrix,\r\n engine.isNDCHalfZRange\r\n );\r\n }\r\n }\r\n\r\n this._cache.orthoLeft = this.orthoLeft;\r\n this._cache.orthoRight = this.orthoRight;\r\n this._cache.orthoBottom = this.orthoBottom;\r\n this._cache.orthoTop = this.orthoTop;\r\n this._cache.obliqueAngle = this.oblique?.angle;\r\n this._cache.obliqueLength = this.oblique?.length;\r\n this._cache.obliqueOffset = this.oblique?.offset;\r\n this._cache.renderWidth = engine.getRenderWidth();\r\n this._cache.renderHeight = engine.getRenderHeight();\r\n }\r\n\r\n this.onProjectionMatrixChangedObservable.notifyObservers(this);\r\n\r\n return this._projectionMatrix;\r\n }\r\n\r\n /**\r\n * Gets the transformation matrix (ie. the multiplication of view by projection matrices)\r\n * @returns a Matrix\r\n */\r\n public getTransformationMatrix(): Matrix {\r\n this._computedViewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix);\r\n return this._transformMatrix;\r\n }\r\n\r\n private _computeObliqueDistance(offset: number): number {\r\n const arcRotateCamera = this as Camera as ArcRotateCamera;\r\n const targetCamera = this as Camera as TargetCamera;\r\n return (arcRotateCamera.radius || (targetCamera.target ? Vector3.Distance(this.position, targetCamera.target) : this.position.length())) + offset;\r\n }\r\n\r\n private _updateFrustumPlanes(): void {\r\n if (!this._refreshFrustumPlanes) {\r\n return;\r\n }\r\n\r\n this.getTransformationMatrix();\r\n\r\n if (!this._frustumPlanes) {\r\n this._frustumPlanes = Frustum.GetPlanes(this._transformMatrix);\r\n } else {\r\n Frustum.GetPlanesToRef(this._transformMatrix, this._frustumPlanes);\r\n }\r\n\r\n this._refreshFrustumPlanes = false;\r\n }\r\n\r\n /**\r\n * Checks if a cullable object (mesh...) is in the camera frustum\r\n * This checks the bounding box center. See isCompletelyInFrustum for a full bounding check\r\n * @param target The object to check\r\n * @param checkRigCameras If the rig cameras should be checked (eg. with VR camera both eyes should be checked) (Default: false)\r\n * @returns true if the object is in frustum otherwise false\r\n */\r\n public isInFrustum(target: ICullable, checkRigCameras = false): boolean {\r\n this._updateFrustumPlanes();\r\n\r\n if (checkRigCameras && this.rigCameras.length > 0) {\r\n let result = false;\r\n this.rigCameras.forEach((cam) => {\r\n cam._updateFrustumPlanes();\r\n result = result || target.isInFrustum(cam._frustumPlanes);\r\n });\r\n return result;\r\n } else {\r\n return target.isInFrustum(this._frustumPlanes);\r\n }\r\n }\r\n\r\n /**\r\n * Checks if a cullable object (mesh...) is in the camera frustum\r\n * Unlike isInFrustum this checks the full bounding box\r\n * @param target The object to check\r\n * @returns true if the object is in frustum otherwise false\r\n */\r\n public isCompletelyInFrustum(target: ICullable): boolean {\r\n this._updateFrustumPlanes();\r\n\r\n return target.isCompletelyInFrustum(this._frustumPlanes);\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Gets a ray in the forward direction from the camera.\r\n * @param length Defines the length of the ray to create\r\n * @param transform Defines the transform to apply to the ray, by default the world matrix is used to create a workd space ray\r\n * @param origin Defines the start point of the ray which defaults to the camera position\r\n * @returns the forward ray\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getForwardRay(length = 100, transform?: Matrix, origin?: Vector3): Ray {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Gets a ray in the forward direction from the camera.\r\n * @param refRay the ray to (re)use when setting the values\r\n * @param length Defines the length of the ray to create\r\n * @param transform Defines the transform to apply to the ray, by default the world matrx is used to create a workd space ray\r\n * @param origin Defines the start point of the ray which defaults to the camera position\r\n * @returns the forward ray\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getForwardRayToRef(refRay: Ray, length = 100, transform?: Matrix, origin?: Vector3): Ray {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n /**\r\n * Releases resources associated with this node.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n // Observables\r\n this.onViewMatrixChangedObservable.clear();\r\n this.onProjectionMatrixChangedObservable.clear();\r\n this.onAfterCheckInputsObservable.clear();\r\n this.onRestoreStateObservable.clear();\r\n\r\n // Inputs\r\n if (this.inputs) {\r\n this.inputs.clear();\r\n }\r\n\r\n // Animations\r\n this.getScene().stopAnimation(this);\r\n\r\n // Remove from scene\r\n this.getScene().removeCamera(this);\r\n while (this._rigCameras.length > 0) {\r\n const camera = this._rigCameras.pop();\r\n if (camera) {\r\n camera.dispose();\r\n }\r\n }\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.cameras.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.cameras.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n // Postprocesses\r\n if (this._rigPostProcess) {\r\n this._rigPostProcess.dispose(this);\r\n this._rigPostProcess = null;\r\n this._postProcesses.length = 0;\r\n } else if (this.cameraRigMode !== Camera.RIG_MODE_NONE) {\r\n this._rigPostProcess = null;\r\n this._postProcesses.length = 0;\r\n } else {\r\n let i = this._postProcesses.length;\r\n while (--i >= 0) {\r\n const postProcess = this._postProcesses[i];\r\n if (postProcess) {\r\n postProcess.dispose(this);\r\n }\r\n }\r\n }\r\n\r\n // Render targets\r\n let i = this.customRenderTargets.length;\r\n while (--i >= 0) {\r\n this.customRenderTargets[i].dispose();\r\n }\r\n this.customRenderTargets.length = 0;\r\n\r\n // Active Meshes\r\n this._activeMeshes.dispose();\r\n\r\n this.getScene().getEngine().releaseRenderPassId(this.renderPassId);\r\n\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n /** @internal */\r\n public _isLeftCamera = false;\r\n /**\r\n * Gets the left camera of a rig setup in case of Rigged Camera\r\n */\r\n public get isLeftCamera(): boolean {\r\n return this._isLeftCamera;\r\n }\r\n\r\n /** @internal */\r\n public _isRightCamera = false;\r\n /**\r\n * Gets the right camera of a rig setup in case of Rigged Camera\r\n */\r\n public get isRightCamera(): boolean {\r\n return this._isRightCamera;\r\n }\r\n\r\n /**\r\n * Gets the left camera of a rig setup in case of Rigged Camera\r\n */\r\n public get leftCamera(): Nullable {\r\n if (this._rigCameras.length < 1) {\r\n return null;\r\n }\r\n return this._rigCameras[0];\r\n }\r\n\r\n /**\r\n * Gets the right camera of a rig setup in case of Rigged Camera\r\n */\r\n public get rightCamera(): Nullable {\r\n if (this._rigCameras.length < 2) {\r\n return null;\r\n }\r\n return this._rigCameras[1];\r\n }\r\n\r\n /**\r\n * Gets the left camera target of a rig setup in case of Rigged Camera\r\n * @returns the target position\r\n */\r\n public getLeftTarget(): Nullable {\r\n if (this._rigCameras.length < 1) {\r\n return null;\r\n }\r\n return (this._rigCameras[0]).getTarget();\r\n }\r\n\r\n /**\r\n * Gets the right camera target of a rig setup in case of Rigged Camera\r\n * @returns the target position\r\n */\r\n public getRightTarget(): Nullable {\r\n if (this._rigCameras.length < 2) {\r\n return null;\r\n }\r\n return (this._rigCameras[1]).getTarget();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public setCameraRigMode(mode: number, rigParams: any): void {\r\n if (this.cameraRigMode === mode) {\r\n return;\r\n }\r\n\r\n while (this._rigCameras.length > 0) {\r\n const camera = this._rigCameras.pop();\r\n\r\n if (camera) {\r\n camera.dispose();\r\n }\r\n }\r\n this.cameraRigMode = mode;\r\n this._cameraRigParams = {};\r\n //we have to implement stereo camera calcultating left and right viewpoints from interaxialDistance and target,\r\n //not from a given angle as it is now, but until that complete code rewriting provisional stereoHalfAngle value is introduced\r\n this._cameraRigParams.interaxialDistance = rigParams.interaxialDistance || 0.0637;\r\n this._cameraRigParams.stereoHalfAngle = Tools.ToRadians(this._cameraRigParams.interaxialDistance / 0.0637);\r\n\r\n // create the rig cameras, unless none\r\n if (this.cameraRigMode !== Camera.RIG_MODE_NONE) {\r\n const leftCamera = this.createRigCamera(this.name + \"_L\", 0);\r\n if (leftCamera) {\r\n leftCamera._isLeftCamera = true;\r\n }\r\n const rightCamera = this.createRigCamera(this.name + \"_R\", 1);\r\n if (rightCamera) {\r\n rightCamera._isRightCamera = true;\r\n }\r\n if (leftCamera && rightCamera) {\r\n this._rigCameras.push(leftCamera);\r\n this._rigCameras.push(rightCamera);\r\n }\r\n }\r\n\r\n this._setRigMode(rigParams);\r\n\r\n this._cascadePostProcessesToRigCams();\r\n this.update();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _setRigMode(rigParams: any) {\r\n // no-op\r\n }\r\n\r\n /** @internal */\r\n public _getVRProjectionMatrix(): Matrix {\r\n Matrix.PerspectiveFovLHToRef(\r\n this._cameraRigParams.vrMetrics.aspectRatioFov,\r\n this._cameraRigParams.vrMetrics.aspectRatio,\r\n this.minZ,\r\n this.maxZ,\r\n this._cameraRigParams.vrWorkMatrix,\r\n true,\r\n this.getEngine().isNDCHalfZRange\r\n );\r\n this._cameraRigParams.vrWorkMatrix.multiplyToRef(this._cameraRigParams.vrHMatrix, this._projectionMatrix);\r\n return this._projectionMatrix;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public setCameraRigParameter(name: string, value: any) {\r\n if (!this._cameraRigParams) {\r\n this._cameraRigParams = {};\r\n }\r\n this._cameraRigParams[name] = value;\r\n //provisionnally:\r\n if (name === \"interaxialDistance\") {\r\n this._cameraRigParams.stereoHalfAngle = Tools.ToRadians(value / 0.0637);\r\n }\r\n }\r\n\r\n /**\r\n * needs to be overridden by children so sub has required properties to be copied\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public createRigCamera(name: string, cameraIndex: number): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * May need to be overridden by children\r\n * @internal\r\n */\r\n public _updateRigCameras() {\r\n for (let i = 0; i < this._rigCameras.length; i++) {\r\n this._rigCameras[i].minZ = this.minZ;\r\n this._rigCameras[i].maxZ = this.maxZ;\r\n this._rigCameras[i].fov = this.fov;\r\n this._rigCameras[i].upVector.copyFrom(this.upVector);\r\n }\r\n\r\n // only update viewport when ANAGLYPH\r\n if (this.cameraRigMode === Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH) {\r\n this._rigCameras[0].viewport = this._rigCameras[1].viewport = this.viewport;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _setupInputs() {}\r\n\r\n /**\r\n * Serialiaze the camera setup to a json representation\r\n * @returns the JSON representation\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.uniqueId = this.uniqueId;\r\n\r\n // Type\r\n serializationObject.type = this.getClassName();\r\n\r\n // Parent\r\n if (this.parent) {\r\n this.parent._serializeAsParent(serializationObject);\r\n }\r\n\r\n if (this.inputs) {\r\n this.inputs.serialize(serializationObject);\r\n }\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n serializationObject.ranges = this.serializeAnimationRanges();\r\n\r\n serializationObject.isEnabled = this.isEnabled();\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Clones the current camera.\r\n * @param name The cloned camera name\r\n * @param newParent The cloned camera's new parent (none by default)\r\n * @returns the cloned camera\r\n */\r\n public clone(name: string, newParent: Nullable = null): Camera {\r\n const camera = SerializationHelper.Clone(\r\n Camera.GetConstructorFromName(this.getClassName(), name, this.getScene(), this.interaxialDistance, this.isStereoscopicSideBySide),\r\n this\r\n );\r\n camera.name = name;\r\n camera.parent = newParent;\r\n\r\n this.onClonedObservable.notifyObservers(camera);\r\n\r\n return camera;\r\n }\r\n\r\n /**\r\n * Gets the direction of the camera relative to a given local axis.\r\n * @param localAxis Defines the reference axis to provide a relative direction.\r\n * @returns the direction\r\n */\r\n public getDirection(localAxis: DeepImmutable): Vector3 {\r\n const result = Vector3.Zero();\r\n\r\n this.getDirectionToRef(localAxis, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns the current camera absolute rotation\r\n */\r\n public get absoluteRotation(): Quaternion {\r\n this.getWorldMatrix().decompose(undefined, this._absoluteRotation);\r\n\r\n return this._absoluteRotation;\r\n }\r\n\r\n /**\r\n * Gets the direction of the camera relative to a given local axis into a passed vector.\r\n * @param localAxis Defines the reference axis to provide a relative direction.\r\n * @param result Defines the vector to store the result in\r\n */\r\n public getDirectionToRef(localAxis: DeepImmutable, result: Vector3): void {\r\n Vector3.TransformNormalToRef(localAxis, this.getWorldMatrix(), result);\r\n }\r\n\r\n /**\r\n * Gets a camera constructor for a given camera type\r\n * @param type The type of the camera to construct (should be equal to one of the camera class name)\r\n * @param name The name of the camera the result will be able to instantiate\r\n * @param scene The scene the result will construct the camera in\r\n * @param interaxial_distance In case of stereoscopic setup, the distance between both eyes\r\n * @param isStereoscopicSideBySide In case of stereoscopic setup, should the sereo be side b side\r\n * @returns a factory method to construct the camera\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n static GetConstructorFromName(type: string, name: string, scene: Scene, interaxial_distance: number = 0, isStereoscopicSideBySide: boolean = true): () => Camera {\r\n const constructorFunc = Node.Construct(type, name, scene, {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n interaxial_distance: interaxial_distance,\r\n isStereoscopicSideBySide: isStereoscopicSideBySide,\r\n });\r\n\r\n if (constructorFunc) {\r\n return <() => Camera>constructorFunc;\r\n }\r\n\r\n // Default to universal camera\r\n return () => Camera._CreateDefaultParsedCamera(name, scene);\r\n }\r\n\r\n /**\r\n * Compute the world matrix of the camera.\r\n * @returns the camera world matrix\r\n */\r\n public computeWorldMatrix(): Matrix {\r\n return this.getWorldMatrix();\r\n }\r\n\r\n /**\r\n * Parse a JSON and creates the camera from the parsed information\r\n * @param parsedCamera The JSON to parse\r\n * @param scene The scene to instantiate the camera in\r\n * @returns the newly constructed camera\r\n */\r\n public static Parse(parsedCamera: any, scene: Scene): Camera {\r\n const type = parsedCamera.type;\r\n const construct = Camera.GetConstructorFromName(type, parsedCamera.name, scene, parsedCamera.interaxial_distance, parsedCamera.isStereoscopicSideBySide);\r\n\r\n const camera = SerializationHelper.Parse(construct, parsedCamera, scene);\r\n\r\n // Parent\r\n if (parsedCamera.parentId !== undefined) {\r\n camera._waitingParentId = parsedCamera.parentId;\r\n }\r\n\r\n // Parent instance index\r\n if (parsedCamera.parentInstanceIndex !== undefined) {\r\n camera._waitingParentInstanceIndex = parsedCamera.parentInstanceIndex;\r\n }\r\n\r\n //If camera has an input manager, let it parse inputs settings\r\n if (camera.inputs) {\r\n camera.inputs.parse(parsedCamera);\r\n\r\n camera._setupInputs();\r\n }\r\n\r\n if (parsedCamera.upVector) {\r\n camera.upVector = Vector3.FromArray(parsedCamera.upVector); // need to force the upVector\r\n }\r\n\r\n if ((camera).setPosition) {\r\n // need to force position\r\n camera.position.copyFromFloats(0, 0, 0);\r\n (camera).setPosition(Vector3.FromArray(parsedCamera.position));\r\n }\r\n\r\n // Target\r\n if (parsedCamera.target) {\r\n if ((camera).setTarget) {\r\n (camera).setTarget(Vector3.FromArray(parsedCamera.target));\r\n }\r\n }\r\n\r\n // Apply 3d rig, when found\r\n if (parsedCamera.cameraRigMode) {\r\n const rigParams = parsedCamera.interaxial_distance ? { interaxialDistance: parsedCamera.interaxial_distance } : {};\r\n camera.setCameraRigMode(parsedCamera.cameraRigMode, rigParams);\r\n }\r\n\r\n // Animations\r\n if (parsedCamera.animations) {\r\n for (let animationIndex = 0; animationIndex < parsedCamera.animations.length; animationIndex++) {\r\n const parsedAnimation = parsedCamera.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n camera.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n Node.ParseAnimationRanges(camera, parsedCamera, scene);\r\n }\r\n\r\n if (parsedCamera.autoAnimate) {\r\n scene.beginAnimation(camera, parsedCamera.autoAnimateFrom, parsedCamera.autoAnimateTo, parsedCamera.autoAnimateLoop, parsedCamera.autoAnimateSpeed || 1.0);\r\n }\r\n\r\n // Check if isEnabled is defined to be back compatible with prior serialized versions.\r\n if (parsedCamera.isEnabled !== undefined) {\r\n camera.setEnabled(parsedCamera.isEnabled);\r\n }\r\n\r\n return camera;\r\n }\r\n\r\n /** @internal */\r\n public _calculateHandednessMultiplier(): number {\r\n let handednessMultiplier = this.getScene().useRightHandedSystem ? -1 : 1;\r\n if (this.parent && this.parent._getWorldMatrixDeterminant() < 0) {\r\n handednessMultiplier *= -1;\r\n }\r\n\r\n return handednessMultiplier;\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class IntersectionInfo {\r\n public faceId = 0;\r\n public subMeshId = 0;\r\n\r\n constructor(\r\n public bu: Nullable,\r\n public bv: Nullable,\r\n public distance: number\r\n ) {}\r\n}\r\n", "import type { DeepImmutable, Nullable } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { BoundingSphere } from \"../Culling/boundingSphere\";\r\n\r\nimport type { ICullable } from \"./boundingInfo\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\n\r\nimport type { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\n/**\r\n * Class used to store bounding box information\r\n */\r\nexport class BoundingBox implements ICullable {\r\n /**\r\n * Gets the 8 vectors representing the bounding box in local space\r\n */\r\n public readonly vectors: Vector3[] = ArrayTools.BuildArray(8, Vector3.Zero);\r\n /**\r\n * Gets the center of the bounding box in local space\r\n */\r\n public readonly center: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the center of the bounding box in world space\r\n */\r\n public readonly centerWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the extend size in local space\r\n */\r\n public readonly extendSize: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the extend size in world space\r\n */\r\n public readonly extendSizeWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the OBB (object bounding box) directions\r\n */\r\n public readonly directions: Vector3[] = ArrayTools.BuildArray(3, Vector3.Zero);\r\n /**\r\n * Gets the 8 vectors representing the bounding box in world space\r\n */\r\n public readonly vectorsWorld: Vector3[] = ArrayTools.BuildArray(8, Vector3.Zero);\r\n /**\r\n * Gets the minimum vector in world space\r\n */\r\n public readonly minimumWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in world space\r\n */\r\n public readonly maximumWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the minimum vector in local space\r\n */\r\n public readonly minimum: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in local space\r\n */\r\n public readonly maximum: Vector3 = Vector3.Zero();\r\n\r\n private _worldMatrix: DeepImmutable;\r\n private static readonly _TmpVector3 = ArrayTools.BuildArray(3, Vector3.Zero);\r\n\r\n /**\r\n * @internal\r\n */\r\n public _tag: number;\r\n\r\n /** @internal */\r\n public _drawWrapperFront: Nullable = null;\r\n /** @internal */\r\n public _drawWrapperBack: Nullable = null;\r\n\r\n /**\r\n * Creates a new bounding box\r\n * @param min defines the minimum vector (in local space)\r\n * @param max defines the maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n constructor(min: DeepImmutable, max: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n this.reConstruct(min, max, worldMatrix);\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Recreates the entire bounding box from scratch as if we call the constructor in place\r\n * @param min defines the new minimum vector (in local space)\r\n * @param max defines the new maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n public reConstruct(min: DeepImmutable, max: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n const minX = min.x,\r\n minY = min.y,\r\n minZ = min.z,\r\n maxX = max.x,\r\n maxY = max.y,\r\n maxZ = max.z;\r\n const vectors = this.vectors;\r\n\r\n this.minimum.copyFromFloats(minX, minY, minZ);\r\n this.maximum.copyFromFloats(maxX, maxY, maxZ);\r\n vectors[0].copyFromFloats(minX, minY, minZ);\r\n vectors[1].copyFromFloats(maxX, maxY, maxZ);\r\n vectors[2].copyFromFloats(maxX, minY, minZ);\r\n vectors[3].copyFromFloats(minX, maxY, minZ);\r\n vectors[4].copyFromFloats(minX, minY, maxZ);\r\n vectors[5].copyFromFloats(maxX, maxY, minZ);\r\n vectors[6].copyFromFloats(minX, maxY, maxZ);\r\n vectors[7].copyFromFloats(maxX, minY, maxZ);\r\n\r\n // OBB\r\n max.addToRef(min, this.center).scaleInPlace(0.5);\r\n max.subtractToRef(min, this.extendSize).scaleInPlace(0.5);\r\n\r\n this._worldMatrix = worldMatrix || Matrix.IdentityReadOnly;\r\n\r\n this._update(this._worldMatrix);\r\n }\r\n\r\n /**\r\n * Scale the current bounding box by applying a scale factor\r\n * @param factor defines the scale factor to apply\r\n * @returns the current bounding box\r\n */\r\n public scale(factor: number): BoundingBox {\r\n const tmpVectors = BoundingBox._TmpVector3;\r\n const diff = this.maximum.subtractToRef(this.minimum, tmpVectors[0]);\r\n const len = diff.length();\r\n diff.normalizeFromLength(len);\r\n const distance = len * factor;\r\n const newRadius = diff.scaleInPlace(distance * 0.5);\r\n\r\n const min = this.center.subtractToRef(newRadius, tmpVectors[1]);\r\n const max = this.center.addToRef(newRadius, tmpVectors[2]);\r\n\r\n this.reConstruct(min, max, this._worldMatrix);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the world matrix of the bounding box\r\n * @returns a matrix\r\n */\r\n public getWorldMatrix(): DeepImmutable {\r\n return this._worldMatrix;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _update(world: DeepImmutable): void {\r\n const minWorld = this.minimumWorld;\r\n const maxWorld = this.maximumWorld;\r\n const directions = this.directions;\r\n const vectorsWorld = this.vectorsWorld;\r\n const vectors = this.vectors;\r\n\r\n if (!world.isIdentity()) {\r\n minWorld.setAll(Number.MAX_VALUE);\r\n maxWorld.setAll(-Number.MAX_VALUE);\r\n\r\n for (let index = 0; index < 8; ++index) {\r\n const v = vectorsWorld[index];\r\n Vector3.TransformCoordinatesToRef(vectors[index], world, v);\r\n minWorld.minimizeInPlace(v);\r\n maxWorld.maximizeInPlace(v);\r\n }\r\n\r\n // Extend\r\n maxWorld.subtractToRef(minWorld, this.extendSizeWorld).scaleInPlace(0.5);\r\n maxWorld.addToRef(minWorld, this.centerWorld).scaleInPlace(0.5);\r\n } else {\r\n minWorld.copyFrom(this.minimum);\r\n maxWorld.copyFrom(this.maximum);\r\n for (let index = 0; index < 8; ++index) {\r\n vectorsWorld[index].copyFrom(vectors[index]);\r\n }\r\n\r\n // Extend\r\n this.extendSizeWorld.copyFrom(this.extendSize);\r\n this.centerWorld.copyFrom(this.center);\r\n }\r\n\r\n Vector3.FromArrayToRef(world.m, 0, directions[0]);\r\n Vector3.FromArrayToRef(world.m, 4, directions[1]);\r\n Vector3.FromArrayToRef(world.m, 8, directions[2]);\r\n\r\n this._worldMatrix = world;\r\n }\r\n\r\n /**\r\n * Tests if the bounding box is intersecting the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an intersection\r\n */\r\n public isInFrustum(frustumPlanes: Array>): boolean {\r\n return BoundingBox.IsInFrustum(this.vectorsWorld, frustumPlanes);\r\n }\r\n\r\n /**\r\n * Tests if the bounding box is entirely inside the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an inclusion\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Array>): boolean {\r\n return BoundingBox.IsCompletelyInFrustum(this.vectorsWorld, frustumPlanes);\r\n }\r\n\r\n /**\r\n * Tests if a point is inside the bounding box\r\n * @param point defines the point to test\r\n * @returns true if the point is inside the bounding box\r\n */\r\n public intersectsPoint(point: DeepImmutable): boolean {\r\n const min = this.minimumWorld;\r\n const max = this.maximumWorld;\r\n const minX = min.x,\r\n minY = min.y,\r\n minZ = min.z,\r\n maxX = max.x,\r\n maxY = max.y,\r\n maxZ = max.z;\r\n const pointX = point.x,\r\n pointY = point.y,\r\n pointZ = point.z;\r\n const delta = -Epsilon;\r\n\r\n if (maxX - pointX < delta || delta > pointX - minX) {\r\n return false;\r\n }\r\n\r\n if (maxY - pointY < delta || delta > pointY - minY) {\r\n return false;\r\n }\r\n\r\n if (maxZ - pointZ < delta || delta > pointZ - minZ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if the bounding box intersects with a bounding sphere\r\n * @param sphere defines the sphere to test\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsSphere(sphere: DeepImmutable): boolean {\r\n return BoundingBox.IntersectsSphere(this.minimumWorld, this.maximumWorld, sphere.centerWorld, sphere.radiusWorld);\r\n }\r\n\r\n /**\r\n * Tests if the bounding box intersects with a box defined by a min and max vectors\r\n * @param min defines the min vector to use\r\n * @param max defines the max vector to use\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsMinMax(min: DeepImmutable, max: DeepImmutable): boolean {\r\n const myMin = this.minimumWorld;\r\n const myMax = this.maximumWorld;\r\n const myMinX = myMin.x,\r\n myMinY = myMin.y,\r\n myMinZ = myMin.z,\r\n myMaxX = myMax.x,\r\n myMaxY = myMax.y,\r\n myMaxZ = myMax.z;\r\n const minX = min.x,\r\n minY = min.y,\r\n minZ = min.z,\r\n maxX = max.x,\r\n maxY = max.y,\r\n maxZ = max.z;\r\n if (myMaxX < minX || myMinX > maxX) {\r\n return false;\r\n }\r\n\r\n if (myMaxY < minY || myMinY > maxY) {\r\n return false;\r\n }\r\n\r\n if (myMaxZ < minZ || myMinZ > maxZ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Disposes the resources of the class\r\n */\r\n public dispose(): void {\r\n this._drawWrapperFront?.dispose();\r\n this._drawWrapperBack?.dispose();\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Tests if two bounding boxes are intersections\r\n * @param box0 defines the first box to test\r\n * @param box1 defines the second box to test\r\n * @returns true if there is an intersection\r\n */\r\n public static Intersects(box0: DeepImmutable, box1: DeepImmutable): boolean {\r\n return box0.intersectsMinMax(box1.minimumWorld, box1.maximumWorld);\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defines by a min/max vectors intersects a sphere\r\n * @param minPoint defines the minimum vector of the bounding box\r\n * @param maxPoint defines the maximum vector of the bounding box\r\n * @param sphereCenter defines the sphere center\r\n * @param sphereRadius defines the sphere radius\r\n * @returns true if there is an intersection\r\n */\r\n public static IntersectsSphere(minPoint: DeepImmutable, maxPoint: DeepImmutable, sphereCenter: DeepImmutable, sphereRadius: number): boolean {\r\n const vector = BoundingBox._TmpVector3[0];\r\n Vector3.ClampToRef(sphereCenter, minPoint, maxPoint, vector);\r\n const num = Vector3.DistanceSquared(sphereCenter, vector);\r\n return num <= sphereRadius * sphereRadius;\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defined with 8 vectors is entirely inside frustum planes\r\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an inclusion\r\n */\r\n public static IsCompletelyInFrustum(boundingVectors: Array>, frustumPlanes: Array>): boolean {\r\n for (let p = 0; p < 6; ++p) {\r\n const frustumPlane = frustumPlanes[p];\r\n for (let i = 0; i < 8; ++i) {\r\n if (frustumPlane.dotCoordinate(boundingVectors[i]) < 0) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defined with 8 vectors intersects frustum planes\r\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an intersection\r\n */\r\n public static IsInFrustum(boundingVectors: Array>, frustumPlanes: Array>): boolean {\r\n for (let p = 0; p < 6; ++p) {\r\n let canReturnFalse = true;\r\n const frustumPlane = frustumPlanes[p];\r\n for (let i = 0; i < 8; ++i) {\r\n if (frustumPlane.dotCoordinate(boundingVectors[i]) >= 0) {\r\n canReturnFalse = false;\r\n break;\r\n }\r\n }\r\n if (canReturnFalse) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n", "import type { DeepImmutable } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\n\r\n/**\r\n * Class used to store bounding sphere information\r\n */\r\nexport class BoundingSphere {\r\n /**\r\n * Gets the center of the bounding sphere in local space\r\n */\r\n public readonly center = Vector3.Zero();\r\n /**\r\n * Radius of the bounding sphere in local space\r\n */\r\n public radius: number;\r\n /**\r\n * Gets the center of the bounding sphere in world space\r\n */\r\n public readonly centerWorld = Vector3.Zero();\r\n /**\r\n * Radius of the bounding sphere in world space\r\n */\r\n public radiusWorld: number;\r\n /**\r\n * Gets the minimum vector in local space\r\n */\r\n public readonly minimum = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in local space\r\n */\r\n public readonly maximum = Vector3.Zero();\r\n\r\n private _worldMatrix: DeepImmutable;\r\n private static readonly _TmpVector3 = ArrayTools.BuildArray(3, Vector3.Zero);\r\n\r\n /**\r\n * Creates a new bounding sphere\r\n * @param min defines the minimum vector (in local space)\r\n * @param max defines the maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n constructor(min: DeepImmutable, max: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n this.reConstruct(min, max, worldMatrix);\r\n }\r\n\r\n /**\r\n * Recreates the entire bounding sphere from scratch as if we call the constructor in place\r\n * @param min defines the new minimum vector (in local space)\r\n * @param max defines the new maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n public reConstruct(min: DeepImmutable, max: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n this.minimum.copyFrom(min);\r\n this.maximum.copyFrom(max);\r\n\r\n const distance = Vector3.Distance(min, max);\r\n\r\n max.addToRef(min, this.center).scaleInPlace(0.5);\r\n this.radius = distance * 0.5;\r\n\r\n this._update(worldMatrix || Matrix.IdentityReadOnly);\r\n }\r\n\r\n /**\r\n * Scale the current bounding sphere by applying a scale factor\r\n * @param factor defines the scale factor to apply\r\n * @returns the current bounding box\r\n */\r\n public scale(factor: number): BoundingSphere {\r\n const newRadius = this.radius * factor;\r\n const tmpVectors = BoundingSphere._TmpVector3;\r\n const tempRadiusVector = tmpVectors[0].setAll(newRadius);\r\n const min = this.center.subtractToRef(tempRadiusVector, tmpVectors[1]);\r\n const max = this.center.addToRef(tempRadiusVector, tmpVectors[2]);\r\n\r\n this.reConstruct(min, max, this._worldMatrix);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the world matrix of the bounding box\r\n * @returns a matrix\r\n */\r\n public getWorldMatrix(): DeepImmutable {\r\n return this._worldMatrix;\r\n }\r\n\r\n // Methods\r\n /**\r\n * @internal\r\n */\r\n public _update(worldMatrix: DeepImmutable): void {\r\n if (!worldMatrix.isIdentity()) {\r\n Vector3.TransformCoordinatesToRef(this.center, worldMatrix, this.centerWorld);\r\n const tempVector = BoundingSphere._TmpVector3[0];\r\n Vector3.TransformNormalFromFloatsToRef(1.0, 1.0, 1.0, worldMatrix, tempVector);\r\n this.radiusWorld = Math.max(Math.abs(tempVector.x), Math.abs(tempVector.y), Math.abs(tempVector.z)) * this.radius;\r\n } else {\r\n this.centerWorld.copyFrom(this.center);\r\n this.radiusWorld = this.radius;\r\n }\r\n }\r\n\r\n /**\r\n * Tests if the bounding sphere is intersecting the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an intersection\r\n */\r\n public isInFrustum(frustumPlanes: Array>): boolean {\r\n const center = this.centerWorld;\r\n const radius = this.radiusWorld;\r\n for (let i = 0; i < 6; i++) {\r\n if (frustumPlanes[i].dotCoordinate(center) <= -radius) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if the bounding sphere center is in between the frustum planes.\r\n * Used for optimistic fast inclusion.\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if the sphere center is in between the frustum planes\r\n */\r\n public isCenterInFrustum(frustumPlanes: Array>): boolean {\r\n const center = this.centerWorld;\r\n for (let i = 0; i < 6; i++) {\r\n if (frustumPlanes[i].dotCoordinate(center) < 0) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if a point is inside the bounding sphere\r\n * @param point defines the point to test\r\n * @returns true if the point is inside the bounding sphere\r\n */\r\n public intersectsPoint(point: DeepImmutable): boolean {\r\n const squareDistance = Vector3.DistanceSquared(this.centerWorld, point);\r\n if (this.radiusWorld * this.radiusWorld < squareDistance) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Checks if two sphere intersect\r\n * @param sphere0 sphere 0\r\n * @param sphere1 sphere 1\r\n * @returns true if the spheres intersect\r\n */\r\n public static Intersects(sphere0: DeepImmutable, sphere1: DeepImmutable): boolean {\r\n const squareDistance = Vector3.DistanceSquared(sphere0.centerWorld, sphere1.centerWorld);\r\n const radiusSum = sphere0.radiusWorld + sphere1.radiusWorld;\r\n\r\n if (radiusSum * radiusSum < squareDistance) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Creates a sphere from a center and a radius\r\n * @param center The center\r\n * @param radius radius\r\n * @param matrix Optional worldMatrix\r\n * @returns The sphere\r\n */\r\n public static CreateFromCenterAndRadius(center: DeepImmutable, radius: number, matrix?: DeepImmutable): BoundingSphere {\r\n this._TmpVector3[0].copyFrom(center);\r\n this._TmpVector3[1].copyFromFloats(0, 0, radius);\r\n this._TmpVector3[2].copyFrom(center);\r\n this._TmpVector3[0].addInPlace(this._TmpVector3[1]);\r\n this._TmpVector3[2].subtractInPlace(this._TmpVector3[1]);\r\n\r\n const sphere = new BoundingSphere(this._TmpVector3[0], this._TmpVector3[2]);\r\n\r\n if (matrix) {\r\n sphere._worldMatrix = matrix;\r\n } else {\r\n sphere._worldMatrix = Matrix.Identity();\r\n }\r\n\r\n return sphere;\r\n }\r\n}\r\n", "import type { DeepImmutable } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport type { Matrix } from \"../Maths/math.vector\";\r\nimport { TmpVectors } from \"../Maths/math.vector\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { BoundingBox } from \"./boundingBox\";\r\nimport { BoundingSphere } from \"./boundingSphere\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\n\r\nimport type { Collider } from \"../Collisions/collider\";\r\n\r\nconst _result0 = { min: 0, max: 0 };\r\nconst _result1 = { min: 0, max: 0 };\r\nconst computeBoxExtents = (axis: DeepImmutable, box: DeepImmutable, result: { min: number; max: number }) => {\r\n const p = Vector3.Dot(box.centerWorld, axis);\r\n\r\n const r0 = Math.abs(Vector3.Dot(box.directions[0], axis)) * box.extendSize.x;\r\n const r1 = Math.abs(Vector3.Dot(box.directions[1], axis)) * box.extendSize.y;\r\n const r2 = Math.abs(Vector3.Dot(box.directions[2], axis)) * box.extendSize.z;\r\n\r\n const r = r0 + r1 + r2;\r\n result.min = p - r;\r\n result.max = p + r;\r\n};\r\n\r\nconst axisOverlap = (axis: DeepImmutable, box0: DeepImmutable, box1: DeepImmutable): boolean => {\r\n computeBoxExtents(axis, box0, _result0);\r\n computeBoxExtents(axis, box1, _result1);\r\n return !(_result0.min > _result1.max || _result1.min > _result0.max);\r\n};\r\n\r\n/**\r\n * Interface for cullable objects\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#back-face-culling\r\n */\r\nexport interface ICullable {\r\n /**\r\n * Checks if the object or part of the object is in the frustum\r\n * @param frustumPlanes Camera near/planes\r\n * @returns true if the object is in frustum otherwise false\r\n */\r\n isInFrustum(frustumPlanes: Plane[]): boolean;\r\n /**\r\n * Checks if a cullable object (mesh...) is in the camera frustum\r\n * Unlike isInFrustum this checks the full bounding box\r\n * @param frustumPlanes Camera near/planes\r\n * @returns true if the object is in frustum otherwise false\r\n */\r\n isCompletelyInFrustum(frustumPlanes: Plane[]): boolean;\r\n}\r\n\r\n/**\r\n * Info for a bounding data of a mesh\r\n */\r\nexport class BoundingInfo implements ICullable {\r\n /**\r\n * Bounding box for the mesh\r\n */\r\n public readonly boundingBox: BoundingBox;\r\n /**\r\n * Bounding sphere for the mesh\r\n */\r\n public readonly boundingSphere: BoundingSphere;\r\n\r\n private _isLocked = false;\r\n\r\n private static readonly _TmpVector3 = ArrayTools.BuildArray(2, Vector3.Zero);\r\n\r\n /**\r\n * Constructs bounding info\r\n * @param minimum min vector of the bounding box/sphere\r\n * @param maximum max vector of the bounding box/sphere\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n constructor(minimum: DeepImmutable, maximum: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n this.boundingBox = new BoundingBox(minimum, maximum, worldMatrix);\r\n this.boundingSphere = new BoundingSphere(minimum, maximum, worldMatrix);\r\n }\r\n\r\n /**\r\n * Recreates the entire bounding info from scratch as if we call the constructor in place\r\n * @param min defines the new minimum vector (in local space)\r\n * @param max defines the new maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n public reConstruct(min: DeepImmutable, max: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n this.boundingBox.reConstruct(min, max, worldMatrix);\r\n this.boundingSphere.reConstruct(min, max, worldMatrix);\r\n }\r\n\r\n /**\r\n * min vector of the bounding box/sphere\r\n */\r\n public get minimum(): Vector3 {\r\n return this.boundingBox.minimum;\r\n }\r\n\r\n /**\r\n * max vector of the bounding box/sphere\r\n */\r\n public get maximum(): Vector3 {\r\n return this.boundingBox.maximum;\r\n }\r\n\r\n /**\r\n * If the info is locked and won't be updated to avoid perf overhead\r\n */\r\n public get isLocked(): boolean {\r\n return this._isLocked;\r\n }\r\n\r\n public set isLocked(value: boolean) {\r\n this._isLocked = value;\r\n }\r\n\r\n // Methods\r\n /**\r\n * Updates the bounding sphere and box\r\n * @param world world matrix to be used to update\r\n */\r\n public update(world: DeepImmutable) {\r\n if (this._isLocked) {\r\n return;\r\n }\r\n this.boundingBox._update(world);\r\n this.boundingSphere._update(world);\r\n }\r\n\r\n /**\r\n * Recreate the bounding info to be centered around a specific point given a specific extend.\r\n * @param center New center of the bounding info\r\n * @param extend New extend of the bounding info\r\n * @returns the current bounding info\r\n */\r\n public centerOn(center: DeepImmutable, extend: DeepImmutable): BoundingInfo {\r\n const minimum = BoundingInfo._TmpVector3[0].copyFrom(center).subtractInPlace(extend);\r\n const maximum = BoundingInfo._TmpVector3[1].copyFrom(center).addInPlace(extend);\r\n\r\n this.boundingBox.reConstruct(minimum, maximum, this.boundingBox.getWorldMatrix());\r\n this.boundingSphere.reConstruct(minimum, maximum, this.boundingBox.getWorldMatrix());\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Grows the bounding info to include the given point.\r\n * @param point The point that will be included in the current bounding info (in local space)\r\n * @returns the current bounding info\r\n */\r\n public encapsulate(point: Vector3): BoundingInfo {\r\n const minimum = Vector3.Minimize(this.minimum, point);\r\n const maximum = Vector3.Maximize(this.maximum, point);\r\n this.reConstruct(minimum, maximum, this.boundingBox.getWorldMatrix());\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Grows the bounding info to encapsulate the given bounding info.\r\n * @param toEncapsulate The bounding info that will be encapsulated in the current bounding info\r\n * @returns the current bounding info\r\n */\r\n public encapsulateBoundingInfo(toEncapsulate: BoundingInfo): BoundingInfo {\r\n const invw = TmpVectors.Matrix[0];\r\n this.boundingBox.getWorldMatrix().invertToRef(invw);\r\n\r\n const v = TmpVectors.Vector3[0];\r\n\r\n Vector3.TransformCoordinatesToRef(toEncapsulate.boundingBox.minimumWorld, invw, v);\r\n this.encapsulate(v);\r\n\r\n Vector3.TransformCoordinatesToRef(toEncapsulate.boundingBox.maximumWorld, invw, v);\r\n this.encapsulate(v);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Scale the current bounding info by applying a scale factor\r\n * @param factor defines the scale factor to apply\r\n * @returns the current bounding info\r\n */\r\n public scale(factor: number): BoundingInfo {\r\n this.boundingBox.scale(factor);\r\n this.boundingSphere.scale(factor);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns `true` if the bounding info is within the frustum defined by the passed array of planes.\r\n * @param frustumPlanes defines the frustum to test\r\n * @param strategy defines the strategy to use for the culling (default is BABYLON.AbstractMesh.CULLINGSTRATEGY_STANDARD)\r\n * The different strategies available are:\r\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_STANDARD most accurate but slower @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_STANDARD\r\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY faster but less accurate @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY\r\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION can be faster if always visible @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_OPTIMISTIC_INCLUSION\r\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY can be faster if always visible @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY\r\n * @returns true if the bounding info is in the frustum planes\r\n */\r\n public isInFrustum(frustumPlanes: Array>, strategy: number = Constants.MESHES_CULLINGSTRATEGY_STANDARD): boolean {\r\n const inclusionTest =\r\n strategy === Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION || strategy === Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY;\r\n if (inclusionTest) {\r\n if (this.boundingSphere.isCenterInFrustum(frustumPlanes)) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!this.boundingSphere.isInFrustum(frustumPlanes)) {\r\n return false;\r\n }\r\n\r\n const bSphereOnlyTest =\r\n strategy === Constants.MESHES_CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY || strategy === Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY;\r\n if (bSphereOnlyTest) {\r\n return true;\r\n }\r\n\r\n return this.boundingBox.isInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * Gets the world distance between the min and max points of the bounding box\r\n */\r\n public get diagonalLength(): number {\r\n const boundingBox = this.boundingBox;\r\n const diag = boundingBox.maximumWorld.subtractToRef(boundingBox.minimumWorld, BoundingInfo._TmpVector3[0]);\r\n return diag.length();\r\n }\r\n\r\n /**\r\n * Checks if a cullable object (mesh...) is in the camera frustum\r\n * Unlike isInFrustum this checks the full bounding box\r\n * @param frustumPlanes Camera near/planes\r\n * @returns true if the object is in frustum otherwise false\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Array>): boolean {\r\n return this.boundingBox.isCompletelyInFrustum(frustumPlanes);\r\n }\r\n /**\r\n * @internal\r\n */\r\n public _checkCollision(collider: Collider): boolean {\r\n return collider._canDoCollision(this.boundingSphere.centerWorld, this.boundingSphere.radiusWorld, this.boundingBox.minimumWorld, this.boundingBox.maximumWorld);\r\n }\r\n\r\n /**\r\n * Checks if a point is inside the bounding box and bounding sphere or the mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\r\n * @param point the point to check intersection with\r\n * @returns if the point intersects\r\n */\r\n public intersectsPoint(point: DeepImmutable): boolean {\r\n if (!this.boundingSphere.centerWorld) {\r\n return false;\r\n }\r\n\r\n if (!this.boundingSphere.intersectsPoint(point)) {\r\n return false;\r\n }\r\n\r\n if (!this.boundingBox.intersectsPoint(point)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Checks if another bounding info intersects the bounding box and bounding sphere or the mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\r\n * @param boundingInfo the bounding info to check intersection with\r\n * @param precise if the intersection should be done using OBB\r\n * @returns if the bounding info intersects\r\n */\r\n public intersects(boundingInfo: DeepImmutable, precise: boolean): boolean {\r\n if (!BoundingSphere.Intersects(this.boundingSphere, boundingInfo.boundingSphere)) {\r\n return false;\r\n }\r\n\r\n if (!BoundingBox.Intersects(this.boundingBox, boundingInfo.boundingBox)) {\r\n return false;\r\n }\r\n\r\n if (!precise) {\r\n return true;\r\n }\r\n\r\n const box0 = this.boundingBox;\r\n const box1 = boundingInfo.boundingBox;\r\n\r\n if (!axisOverlap(box0.directions[0], box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(box0.directions[1], box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(box0.directions[2], box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(box1.directions[0], box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(box1.directions[1], box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(box1.directions[2], box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[0], box1.directions[0]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[0], box1.directions[1]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[0], box1.directions[2]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[1], box1.directions[0]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[1], box1.directions[1]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[1], box1.directions[2]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[2], box1.directions[0]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[2], box1.directions[1]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[2], box1.directions[2]), box0, box1)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n", "import type { FloatArray, Nullable, IndicesArray } from \"../types\";\r\nimport type { Vector2 } from \"./math.vector\";\r\nimport { Vector3 } from \"./math.vector\";\r\nimport { nativeOverride } from \"../Misc/decorators\";\r\n\r\n// This helper class is only here so we can apply the nativeOverride decorator to functions.\r\nclass MathHelpers {\r\n @nativeOverride.filter((...[positions, indices]: Parameters) => !Array.isArray(positions) && !Array.isArray(indices))\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static extractMinAndMaxIndexed(positions: FloatArray, indices: IndicesArray, indexStart: number, indexCount: number, minimum: Vector3, maximum: Vector3): void {\r\n for (let index = indexStart; index < indexStart + indexCount; index++) {\r\n const offset = indices[index] * 3;\r\n const x = positions[offset];\r\n const y = positions[offset + 1];\r\n const z = positions[offset + 2];\r\n minimum.minimizeInPlaceFromFloats(x, y, z);\r\n maximum.maximizeInPlaceFromFloats(x, y, z);\r\n }\r\n }\r\n\r\n @nativeOverride.filter((...[positions]: Parameters) => !Array.isArray(positions))\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static extractMinAndMax(positions: FloatArray, start: number, count: number, stride: number, minimum: Vector3, maximum: Vector3): void {\r\n for (let index = start, offset = start * stride; index < start + count; index++, offset += stride) {\r\n const x = positions[offset];\r\n const y = positions[offset + 1];\r\n const z = positions[offset + 2];\r\n minimum.minimizeInPlaceFromFloats(x, y, z);\r\n maximum.maximizeInPlaceFromFloats(x, y, z);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Extracts minimum and maximum values from a list of indexed positions\r\n * @param positions defines the positions to use\r\n * @param indices defines the indices to the positions\r\n * @param indexStart defines the start index\r\n * @param indexCount defines the end index\r\n * @param bias defines bias value to add to the result\r\n * @returns minimum and maximum values\r\n */\r\nexport function extractMinAndMaxIndexed(\r\n positions: FloatArray,\r\n indices: IndicesArray,\r\n indexStart: number,\r\n indexCount: number,\r\n bias: Nullable = null\r\n): { minimum: Vector3; maximum: Vector3 } {\r\n const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n\r\n MathHelpers.extractMinAndMaxIndexed(positions, indices, indexStart, indexCount, minimum, maximum);\r\n\r\n if (bias) {\r\n minimum.x -= minimum.x * bias.x + bias.y;\r\n minimum.y -= minimum.y * bias.x + bias.y;\r\n minimum.z -= minimum.z * bias.x + bias.y;\r\n maximum.x += maximum.x * bias.x + bias.y;\r\n maximum.y += maximum.y * bias.x + bias.y;\r\n maximum.z += maximum.z * bias.x + bias.y;\r\n }\r\n\r\n return {\r\n minimum: minimum,\r\n maximum: maximum,\r\n };\r\n}\r\n\r\n/**\r\n * Extracts minimum and maximum values from a list of positions\r\n * @param positions defines the positions to use\r\n * @param start defines the start index in the positions array\r\n * @param count defines the number of positions to handle\r\n * @param bias defines bias value to add to the result\r\n * @param stride defines the stride size to use (distance between two positions in the positions array)\r\n * @returns minimum and maximum values\r\n */\r\nexport function extractMinAndMax(positions: FloatArray, start: number, count: number, bias: Nullable = null, stride?: number): { minimum: Vector3; maximum: Vector3 } {\r\n const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n\r\n if (!stride) {\r\n stride = 3;\r\n }\r\n\r\n MathHelpers.extractMinAndMax(positions, start, count, stride, minimum, maximum);\r\n\r\n if (bias) {\r\n minimum.x -= minimum.x * bias.x + bias.y;\r\n minimum.y -= minimum.y * bias.x + bias.y;\r\n minimum.z -= minimum.z * bias.x + bias.y;\r\n maximum.x += maximum.x * bias.x + bias.y;\r\n maximum.y += maximum.y * bias.x + bias.y;\r\n maximum.z += maximum.z * bias.x + bias.y;\r\n }\r\n\r\n return {\r\n minimum: minimum,\r\n maximum: maximum,\r\n };\r\n}\r\n", "import type { Nullable, IndicesArray, DeepImmutable, FloatArray } from \"../types\";\r\nimport type { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport type { ICullable } from \"../Culling/boundingInfo\";\r\nimport { BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { extractMinAndMaxIndexed } from \"../Maths/math.functions\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\n\r\nimport type { Collider } from \"../Collisions/collider\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { MaterialDefines } from \"../Materials/materialDefines\";\r\nimport type { MultiMaterial } from \"../Materials/multiMaterial\";\r\nimport type { AbstractMesh } from \"./abstractMesh\";\r\nimport type { Mesh } from \"./mesh\";\r\nimport type { Ray } from \"../Culling/ray\";\r\nimport type { TrianglePickingPredicate } from \"../Culling/ray\";\r\n\r\n/**\r\n * Defines a subdivision inside a mesh\r\n */\r\nexport class SubMesh implements ICullable {\r\n private _engine: Engine;\r\n /** @internal */\r\n public _drawWrappers: Array; // index in this array = pass id\r\n private _mainDrawWrapperOverride: Nullable = null;\r\n\r\n /**\r\n * Gets material defines used by the effect associated to the sub mesh\r\n */\r\n public get materialDefines(): Nullable {\r\n return this._mainDrawWrapperOverride ? (this._mainDrawWrapperOverride.defines as MaterialDefines) : (this._getDrawWrapper()?.defines as Nullable);\r\n }\r\n\r\n /**\r\n * Sets material defines used by the effect associated to the sub mesh\r\n */\r\n public set materialDefines(defines: Nullable) {\r\n const drawWrapper = this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n drawWrapper.defines = defines;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getDrawWrapper(passId?: number, createIfNotExisting = false): DrawWrapper | undefined {\r\n passId = passId ?? this._engine.currentRenderPassId;\r\n let drawWrapper = this._drawWrappers[passId];\r\n if (!drawWrapper && createIfNotExisting) {\r\n this._drawWrappers[passId] = drawWrapper = new DrawWrapper(this._mesh.getScene().getEngine());\r\n }\r\n return drawWrapper;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _removeDrawWrapper(passId: number, disposeWrapper = true) {\r\n if (disposeWrapper) {\r\n this._drawWrappers[passId]?.dispose();\r\n }\r\n this._drawWrappers[passId] = undefined as any;\r\n }\r\n\r\n /**\r\n * Gets associated (main) effect (possibly the effect override if defined)\r\n */\r\n public get effect(): Nullable {\r\n return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : this._getDrawWrapper()?.effect ?? null;\r\n }\r\n\r\n /** @internal */\r\n public get _drawWrapper(): DrawWrapper {\r\n return this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n }\r\n\r\n /** @internal */\r\n public get _drawWrapperOverride(): Nullable {\r\n return this._mainDrawWrapperOverride;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setMainDrawWrapperOverride(wrapper: Nullable): void {\r\n this._mainDrawWrapperOverride = wrapper;\r\n }\r\n\r\n /**\r\n * Sets associated effect (effect used to render this submesh)\r\n * @param effect defines the effect to associate with\r\n * @param defines defines the set of defines used to compile this effect\r\n * @param materialContext material context associated to the effect\r\n * @param resetContext true to reset the draw context\r\n */\r\n public setEffect(effect: Nullable, defines: Nullable = null, materialContext?: IMaterialContext, resetContext = true) {\r\n const drawWrapper = this._drawWrapper;\r\n drawWrapper.setEffect(effect, defines, resetContext);\r\n if (materialContext !== undefined) {\r\n drawWrapper.materialContext = materialContext;\r\n }\r\n if (!effect) {\r\n drawWrapper.defines = null;\r\n drawWrapper.materialContext = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache\r\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\r\n */\r\n public resetDrawCache(passId?: number): void {\r\n if (this._drawWrappers) {\r\n if (passId !== undefined) {\r\n this._removeDrawWrapper(passId);\r\n return;\r\n } else {\r\n for (const drawWrapper of this._drawWrappers) {\r\n drawWrapper?.dispose();\r\n }\r\n }\r\n }\r\n this._drawWrappers = [];\r\n }\r\n\r\n /** @internal */\r\n public _linesIndexCount: number = 0;\r\n private _mesh: AbstractMesh;\r\n private _renderingMesh: Mesh;\r\n private _boundingInfo: BoundingInfo;\r\n private _linesIndexBuffer: Nullable = null;\r\n /** @internal */\r\n public _lastColliderWorldVertices: Nullable = null;\r\n /** @internal */\r\n public _trianglePlanes: Plane[];\r\n /** @internal */\r\n public _lastColliderTransformMatrix: Nullable = null;\r\n /** @internal */\r\n public _wasDispatched = false;\r\n\r\n /** @internal */\r\n public _renderId = 0;\r\n /** @internal */\r\n public _alphaIndex: number = 0;\r\n /** @internal */\r\n public _distanceToCamera: number = 0;\r\n /** @internal */\r\n public _id: number;\r\n\r\n private _currentMaterial: Nullable = null;\r\n\r\n /**\r\n * Add a new submesh to a mesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns the new submesh\r\n */\r\n public static AddToMesh(\r\n materialIndex: number,\r\n verticesStart: number,\r\n verticesCount: number,\r\n indexStart: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n return new SubMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n\r\n /**\r\n * Creates a new submesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @param addToMesh defines a boolean indicating that the submesh must be added to the mesh.subMeshes array (true by default)\r\n */\r\n constructor(\r\n /** the material index to use */\r\n public materialIndex: number,\r\n /** vertex index start */\r\n public verticesStart: number,\r\n /** vertices count */\r\n public verticesCount: number,\r\n /** index start */\r\n public indexStart: number,\r\n /** indices count */\r\n public indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true,\r\n addToMesh = true\r\n ) {\r\n this._mesh = mesh;\r\n this._renderingMesh = renderingMesh || mesh;\r\n if (addToMesh) {\r\n mesh.subMeshes.push(this);\r\n }\r\n\r\n this._engine = this._mesh.getScene().getEngine();\r\n this.resetDrawCache();\r\n this._trianglePlanes = [];\r\n\r\n this._id = mesh.subMeshes.length - 1;\r\n\r\n if (createBoundingBox) {\r\n this.refreshBoundingInfo();\r\n mesh.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if this submesh covers the entire parent mesh\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public get IsGlobal(): boolean {\r\n return this.verticesStart === 0 && this.verticesCount === this._mesh.getTotalVertices() && this.indexStart === 0 && this.indexCount === this._mesh.getTotalIndices();\r\n }\r\n\r\n /**\r\n * Returns the submesh BoundingInfo object\r\n * @returns current bounding info (or mesh's one if the submesh is global)\r\n */\r\n public getBoundingInfo(): BoundingInfo {\r\n if (this.IsGlobal || this._mesh.hasThinInstances) {\r\n return this._mesh.getBoundingInfo();\r\n }\r\n\r\n return this._boundingInfo;\r\n }\r\n\r\n /**\r\n * Sets the submesh BoundingInfo\r\n * @param boundingInfo defines the new bounding info to use\r\n * @returns the SubMesh\r\n */\r\n public setBoundingInfo(boundingInfo: BoundingInfo): SubMesh {\r\n this._boundingInfo = boundingInfo;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh of the current submesh\r\n * @returns the parent mesh\r\n */\r\n public getMesh(): AbstractMesh {\r\n return this._mesh;\r\n }\r\n\r\n /**\r\n * Returns the rendering mesh of the submesh\r\n * @returns the rendering mesh (could be different from parent mesh)\r\n */\r\n public getRenderingMesh(): Mesh {\r\n return this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the replacement mesh of the submesh\r\n * @returns the replacement mesh (could be different from parent mesh)\r\n */\r\n public getReplacementMesh(): Nullable {\r\n return this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n }\r\n\r\n /**\r\n * Returns the effective mesh of the submesh\r\n * @returns the effective mesh (could be different from parent mesh)\r\n */\r\n public getEffectiveMesh(): AbstractMesh {\r\n const replacementMesh = this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n\r\n return replacementMesh ? replacementMesh : this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the submesh material\r\n * @param getDefaultMaterial Defines whether or not to get the default material if nothing has been defined.\r\n * @returns null or the current material\r\n */\r\n public getMaterial(getDefaultMaterial = true): Nullable {\r\n const rootMaterial = this._renderingMesh.getMaterialForRenderPass(this._engine.currentRenderPassId) ?? this._renderingMesh.material;\r\n\r\n if (!rootMaterial) {\r\n return getDefaultMaterial ? this._mesh.getScene().defaultMaterial : null;\r\n } else if (this._isMultiMaterial(rootMaterial)) {\r\n const effectiveMaterial = rootMaterial.getSubMaterial(this.materialIndex);\r\n\r\n if (this._currentMaterial !== effectiveMaterial) {\r\n this._currentMaterial = effectiveMaterial;\r\n this.resetDrawCache();\r\n }\r\n\r\n return effectiveMaterial;\r\n }\r\n\r\n return rootMaterial;\r\n }\r\n\r\n private _isMultiMaterial(material: Material): material is MultiMaterial {\r\n return (material as MultiMaterial).getSubMaterial !== undefined;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Sets a new updated BoundingInfo object to the submesh\r\n * @param data defines an optional position array to use to determine the bounding info\r\n * @returns the SubMesh\r\n */\r\n public refreshBoundingInfo(data: Nullable = null): SubMesh {\r\n this._lastColliderWorldVertices = null;\r\n\r\n if (this.IsGlobal || !this._renderingMesh || !this._renderingMesh.geometry) {\r\n return this;\r\n }\r\n\r\n if (!data) {\r\n data = this._renderingMesh.getVerticesData(VertexBuffer.PositionKind);\r\n }\r\n\r\n if (!data) {\r\n this._boundingInfo = this._mesh.getBoundingInfo();\r\n return this;\r\n }\r\n\r\n const indices = this._renderingMesh.getIndices();\r\n let extend: { minimum: Vector3; maximum: Vector3 };\r\n\r\n //is this the only submesh?\r\n if (this.indexStart === 0 && this.indexCount === indices.length) {\r\n const boundingInfo = this._renderingMesh.getBoundingInfo();\r\n\r\n //the rendering mesh's bounding info can be used, it is the standard submesh for all indices.\r\n extend = { minimum: boundingInfo.minimum.clone(), maximum: boundingInfo.maximum.clone() };\r\n } else {\r\n extend = extractMinAndMaxIndexed(data, indices, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias);\r\n }\r\n\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _checkCollision(collider: Collider): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n return boundingInfo._checkCollision(collider);\r\n }\r\n\r\n /**\r\n * Updates the submesh BoundingInfo\r\n * @param world defines the world matrix to use to update the bounding info\r\n * @returns the submesh\r\n */\r\n public updateBoundingInfo(world: DeepImmutable): SubMesh {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n this.refreshBoundingInfo();\r\n boundingInfo = this.getBoundingInfo();\r\n }\r\n if (boundingInfo) {\r\n (boundingInfo).update(world);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box intersects the frustum defined by the passed array of planes.\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is intersecting with the frustum\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isInFrustum(frustumPlanes, this._mesh.cullingStrategy);\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box is completely inside the frustum defined by the passed array of planes\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is inside the frustum\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Plane[]): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isCompletelyInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * Renders the submesh\r\n * @param enableAlphaMode defines if alpha needs to be used\r\n * @returns the submesh\r\n */\r\n public render(enableAlphaMode: boolean): SubMesh {\r\n this._renderingMesh.render(this, enableAlphaMode, this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : undefined);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getLinesIndexBuffer(indices: IndicesArray, engine: Engine): DataBuffer {\r\n if (!this._linesIndexBuffer) {\r\n const linesIndices = [];\r\n\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 3) {\r\n linesIndices.push(indices[index], indices[index + 1], indices[index + 1], indices[index + 2], indices[index + 2], indices[index]);\r\n }\r\n\r\n this._linesIndexBuffer = engine.createIndexBuffer(linesIndices);\r\n this._linesIndexCount = linesIndices.length;\r\n }\r\n return this._linesIndexBuffer;\r\n }\r\n\r\n /**\r\n * Checks if the submesh intersects with a ray\r\n * @param ray defines the ray to test\r\n * @returns true is the passed ray intersects the submesh bounding box\r\n */\r\n public canIntersects(ray: Ray): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return ray.intersectsBox(boundingInfo.boundingBox);\r\n }\r\n\r\n /**\r\n * Intersects current submesh with a ray\r\n * @param ray defines the ray to test\r\n * @param positions defines mesh's positions array\r\n * @param indices defines mesh's indices array\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns intersection info or null if no intersection\r\n */\r\n public intersects(ray: Ray, positions: Vector3[], indices: IndicesArray, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable {\r\n const material = this.getMaterial();\r\n if (!material) {\r\n return null;\r\n }\r\n let step = 3;\r\n let checkStopper = false;\r\n\r\n switch (material.fillMode) {\r\n case Constants.MATERIAL_PointListDrawMode:\r\n case Constants.MATERIAL_LineLoopDrawMode:\r\n case Constants.MATERIAL_LineStripDrawMode:\r\n case Constants.MATERIAL_TriangleFanDrawMode:\r\n return null;\r\n case Constants.MATERIAL_TriangleStripDrawMode:\r\n step = 1;\r\n checkStopper = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // LineMesh first as it's also a Mesh...\r\n if (material.fillMode === Constants.MATERIAL_LineListDrawMode) {\r\n // Check if mesh is unindexed\r\n if (!indices.length) {\r\n return this._intersectUnIndexedLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n }\r\n return this._intersectLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n } else {\r\n // Check if mesh is unindexed\r\n if (!indices.length && this._mesh._unIndexed) {\r\n return this._intersectUnIndexedTriangles(ray, positions, indices, fastCheck, trianglePredicate);\r\n }\r\n\r\n return this._intersectTriangles(ray, positions, indices, step, checkStopper, fastCheck, trianglePredicate);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable {\r\n let intersectInfo: Nullable = null;\r\n\r\n // Line test\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 2) {\r\n const p0 = positions[indices[index]];\r\n const p1 = positions[indices[index + 1]];\r\n\r\n const length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectUnIndexedLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable {\r\n let intersectInfo: Nullable = null;\r\n\r\n // Line test\r\n for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 2) {\r\n const p0 = positions[index];\r\n const p1 = positions[index + 1];\r\n\r\n const length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n step: number,\r\n checkStopper: boolean,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable {\r\n let intersectInfo: Nullable = null;\r\n\r\n // Triangles test\r\n let faceId = -1;\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount - (3 - step); index += step) {\r\n faceId++;\r\n const indexA = indices[index];\r\n const indexB = indices[index + 1];\r\n const indexC = indices[index + 2];\r\n\r\n if (checkStopper && indexC === 0xffffffff) {\r\n index += 2;\r\n continue;\r\n }\r\n\r\n const p0 = positions[indexA];\r\n const p1 = positions[indexB];\r\n const p2 = positions[indexC];\r\n\r\n // stay defensive and don't check against undefined positions.\r\n if (!p0 || !p1 || !p2) {\r\n continue;\r\n }\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray, indexA, indexB, indexC)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = faceId;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectUnIndexedTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable {\r\n let intersectInfo: Nullable = null;\r\n // Triangles test\r\n for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 3) {\r\n const p0 = positions[index];\r\n const p1 = positions[index + 1];\r\n const p2 = positions[index + 2];\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray, -1, -1, -1)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = index / 3;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this._linesIndexBuffer) {\r\n this._linesIndexBuffer = null;\r\n }\r\n }\r\n\r\n // Clone\r\n /**\r\n * Creates a new submesh from the passed mesh\r\n * @param newMesh defines the new hosting mesh\r\n * @param newRenderingMesh defines an optional rendering mesh\r\n * @returns the new submesh\r\n */\r\n public clone(newMesh: AbstractMesh, newRenderingMesh?: Mesh): SubMesh {\r\n const result = new SubMesh(this.materialIndex, this.verticesStart, this.verticesCount, this.indexStart, this.indexCount, newMesh, newRenderingMesh, false);\r\n\r\n if (!this.IsGlobal) {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return result;\r\n }\r\n\r\n result._boundingInfo = new BoundingInfo(boundingInfo.minimum, boundingInfo.maximum);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Dispose\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._linesIndexBuffer) {\r\n this._mesh.getScene().getEngine()._releaseBuffer(this._linesIndexBuffer);\r\n this._linesIndexBuffer = null;\r\n }\r\n\r\n // Remove from mesh\r\n const index = this._mesh.subMeshes.indexOf(this);\r\n this._mesh.subMeshes.splice(index, 1);\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns the string \"SubMesh\".\r\n */\r\n public getClassName(): string {\r\n return \"SubMesh\";\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a new submesh from indices data\r\n * @param materialIndex the index of the main mesh material\r\n * @param startIndex the index where to start the copy in the mesh indices array\r\n * @param indexCount the number of indices to copy then from the startIndex\r\n * @param mesh the main mesh to create the submesh from\r\n * @param renderingMesh the optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns a new submesh\r\n */\r\n public static CreateFromIndices(\r\n materialIndex: number,\r\n startIndex: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n let minVertexIndex = Number.MAX_VALUE;\r\n let maxVertexIndex = -Number.MAX_VALUE;\r\n\r\n const whatWillRender = renderingMesh || mesh;\r\n const indices = whatWillRender!.getIndices()!;\r\n\r\n for (let index = startIndex; index < startIndex + indexCount; index++) {\r\n const vertexIndex = indices[index];\r\n\r\n if (vertexIndex < minVertexIndex) {\r\n minVertexIndex = vertexIndex;\r\n }\r\n if (vertexIndex > maxVertexIndex) {\r\n maxVertexIndex = vertexIndex;\r\n }\r\n }\r\n\r\n return new SubMesh(materialIndex, minVertexIndex, maxVertexIndex - minVertexIndex + 1, startIndex, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n}\r\n", "/* eslint-disable jsdoc/require-returns-check */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Nullable, FloatArray, IndicesArray, DeepImmutable } from \"../types\";\r\nimport type { Matrix, Vector2 } from \"../Maths/math.vector\";\r\nimport { Vector3, Vector4, TmpVectors } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport type { Color3 } from \"../Maths/math.color\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { nativeOverride } from \"../Misc/decorators\";\r\nimport type { Coroutine } from \"../Misc/coroutine\";\r\nimport { makeSyncFunction, runCoroutineSync } from \"../Misc/coroutine\";\r\nimport type { ICreateCapsuleOptions } from \"./Builders/capsuleBuilder\";\r\nimport { RuntimeError, ErrorCodes } from \"../Misc/error\";\r\n\r\nimport type { Geometry } from \"../Meshes/geometry\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { SubMesh } from \"./subMesh\";\r\n\r\n/**\r\n * Define an interface for all classes that will get and set the data on vertices\r\n */\r\nexport interface IGetSetVerticesData {\r\n /**\r\n * Gets a boolean indicating if specific vertex data is present\r\n * @param kind defines the vertex data kind to use\r\n * @returns true is data kind is present\r\n */\r\n isVerticesDataPresent(kind: string): boolean;\r\n /**\r\n * Gets a specific vertex data attached to this geometry. Float data is constructed if the vertex buffer data cannot be returned directly.\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns a float array containing vertex data\r\n */\r\n getVerticesData(kind: string, copyWhenShared?: boolean, forceCopy?: boolean): Nullable;\r\n /**\r\n * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices.\r\n * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one.\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns the indices array or an empty array if the mesh has no geometry\r\n */\r\n getIndices(copyWhenShared?: boolean, forceCopy?: boolean): Nullable;\r\n /**\r\n * Set specific vertex data\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @param data defines the vertex data to use\r\n * @param updatable defines if the vertex must be flagged as updatable (false as default)\r\n * @param stride defines the stride to use (0 by default). This value is deduced from the kind value if not specified\r\n */\r\n setVerticesData(kind: string, data: FloatArray, updatable: boolean): void;\r\n /**\r\n * Update a specific associated vertex buffer\r\n * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for \"position\" kind\r\n * @param makeItUnique defines if the geometry associated with the mesh must be cloned to make the change only for this mesh (and not all meshes associated with the same geometry)\r\n */\r\n updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): void;\r\n /**\r\n * Creates a new index buffer\r\n * @param indices defines the indices to store in the index buffer\r\n * @param totalVertices defines the total number of vertices (could be null)\r\n * @param updatable defines if the index buffer must be flagged as updatable (false by default)\r\n */\r\n setIndices(indices: IndicesArray, totalVertices: Nullable, updatable?: boolean): void;\r\n}\r\n\r\n/** Class used to attach material info to sub section of a vertex data class */\r\nexport class VertexDataMaterialInfo {\r\n /** Defines the material index to use */\r\n public materialIndex: number;\r\n /** Defines vertex index start*/\r\n public verticesStart: number;\r\n /** Defines vertices count */\r\n public verticesCount: number;\r\n /** Defines index start */\r\n public indexStart: number;\r\n /** Defines indices count */\r\n public indexCount: number;\r\n}\r\n\r\n/**\r\n * This class contains the various kinds of data on every vertex of a mesh used in determining its shape and appearance\r\n */\r\nexport class VertexData {\r\n /**\r\n * Mesh side orientation : usually the external or front surface\r\n */\r\n public static readonly FRONTSIDE = 0;\r\n /**\r\n * Mesh side orientation : usually the internal or back surface\r\n */\r\n public static readonly BACKSIDE = 1;\r\n /**\r\n * Mesh side orientation : both internal and external or front and back surfaces\r\n */\r\n public static readonly DOUBLESIDE = 2;\r\n /**\r\n * Mesh side orientation : by default, `FRONTSIDE`\r\n */\r\n public static readonly DEFAULTSIDE = 0;\r\n\r\n private static _UniqueIDGenerator = 0;\r\n\r\n /**\r\n * An array of the x, y, z position of each vertex [...., x, y, z, .....]\r\n */\r\n public positions: Nullable;\r\n\r\n /**\r\n * An array of the x, y, z normal vector of each vertex [...., x, y, z, .....]\r\n */\r\n public normals: Nullable;\r\n\r\n /**\r\n * An array of the x, y, z tangent vector of each vertex [...., x, y, z, .....]\r\n */\r\n public tangents: Nullable;\r\n\r\n /**\r\n * An array of u,v which maps a texture image onto each vertex [...., u, v, .....]\r\n */\r\n public uvs: Nullable;\r\n\r\n /**\r\n * A second array of u,v which maps a texture image onto each vertex [...., u, v, .....]\r\n */\r\n public uvs2: Nullable;\r\n\r\n /**\r\n * A third array of u,v which maps a texture image onto each vertex [...., u, v, .....]\r\n */\r\n public uvs3: Nullable;\r\n\r\n /**\r\n * A fourth array of u,v which maps a texture image onto each vertex [...., u, v, .....]\r\n */\r\n public uvs4: Nullable;\r\n\r\n /**\r\n * A fifth array of u,v which maps a texture image onto each vertex [...., u, v, .....]\r\n */\r\n public uvs5: Nullable;\r\n\r\n /**\r\n * A sixth array of u,v which maps a texture image onto each vertex [...., u, v, .....]\r\n */\r\n public uvs6: Nullable;\r\n\r\n /**\r\n * An array of the r, g, b, a, color of each vertex [...., r, g, b, a, .....]\r\n */\r\n public colors: Nullable;\r\n\r\n /**\r\n * An array containing the list of indices to the array of matrices produced by bones, each vertex have up to 4 indices (8 if the matricesIndicesExtra is set).\r\n */\r\n public matricesIndices: Nullable;\r\n\r\n /**\r\n * An array containing the list of weights defining the weight of each indexed matrix in the final computation\r\n */\r\n public matricesWeights: Nullable;\r\n\r\n /**\r\n * An array extending the number of possible indices\r\n */\r\n public matricesIndicesExtra: Nullable;\r\n\r\n /**\r\n * An array extending the number of possible weights when the number of indices is extended\r\n */\r\n public matricesWeightsExtra: Nullable;\r\n\r\n /**\r\n * An array of i, j, k the three vertex indices required for each triangular facet [...., i, j, k .....]\r\n */\r\n public indices: Nullable;\r\n\r\n /**\r\n * An array defining material association for sub sections of the vertex data\r\n */\r\n public materialInfos: Nullable>;\r\n\r\n /**\r\n * Gets the unique ID of this vertex Data\r\n */\r\n public uniqueId = 0;\r\n\r\n /**\r\n * Metadata used to store contextual values\r\n */\r\n public metadata: any = {};\r\n\r\n /**\r\n * Gets or sets a value indicating that the mesh must be flagged with hasVertexAlpha = true\r\n */\r\n public hasVertexAlpha: boolean;\r\n\r\n /**\r\n * Creates a new VertexData\r\n */\r\n public constructor() {\r\n this.uniqueId = VertexData._UniqueIDGenerator;\r\n VertexData._UniqueIDGenerator++;\r\n }\r\n\r\n /**\r\n * Uses the passed data array to set the set the values for the specified kind of data\r\n * @param data a linear array of floating numbers\r\n * @param kind the type of data that is being set, eg positions, colors etc\r\n */\r\n public set(data: FloatArray, kind: string) {\r\n if (!data.length) {\r\n Logger.Warn(`Setting vertex data kind '${kind}' with an empty array`);\r\n }\r\n\r\n switch (kind) {\r\n case VertexBuffer.PositionKind:\r\n this.positions = data;\r\n break;\r\n case VertexBuffer.NormalKind:\r\n this.normals = data;\r\n break;\r\n case VertexBuffer.TangentKind:\r\n this.tangents = data;\r\n break;\r\n case VertexBuffer.UVKind:\r\n this.uvs = data;\r\n break;\r\n case VertexBuffer.UV2Kind:\r\n this.uvs2 = data;\r\n break;\r\n case VertexBuffer.UV3Kind:\r\n this.uvs3 = data;\r\n break;\r\n case VertexBuffer.UV4Kind:\r\n this.uvs4 = data;\r\n break;\r\n case VertexBuffer.UV5Kind:\r\n this.uvs5 = data;\r\n break;\r\n case VertexBuffer.UV6Kind:\r\n this.uvs6 = data;\r\n break;\r\n case VertexBuffer.ColorKind:\r\n this.colors = data;\r\n break;\r\n case VertexBuffer.MatricesIndicesKind:\r\n this.matricesIndices = data;\r\n break;\r\n case VertexBuffer.MatricesWeightsKind:\r\n this.matricesWeights = data;\r\n break;\r\n case VertexBuffer.MatricesIndicesExtraKind:\r\n this.matricesIndicesExtra = data;\r\n break;\r\n case VertexBuffer.MatricesWeightsExtraKind:\r\n this.matricesWeightsExtra = data;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Associates the vertexData to the passed Mesh.\r\n * Sets it as updatable or not (default `false`)\r\n * @param mesh the mesh the vertexData is applied to\r\n * @param updatable when used and having the value true allows new data to update the vertexData\r\n * @returns the VertexData\r\n */\r\n public applyToMesh(mesh: Mesh, updatable?: boolean): VertexData {\r\n this._applyTo(mesh, updatable, false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Associates the vertexData to the passed Geometry.\r\n * Sets it as updatable or not (default `false`)\r\n * @param geometry the geometry the vertexData is applied to\r\n * @param updatable when used and having the value true allows new data to update the vertexData\r\n * @returns VertexData\r\n */\r\n public applyToGeometry(geometry: Geometry, updatable?: boolean): VertexData {\r\n this._applyTo(geometry, updatable, false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the associated mesh\r\n * @param mesh the mesh to be updated\r\n * @returns VertexData\r\n */\r\n public updateMesh(mesh: Mesh): VertexData {\r\n this._update(mesh);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the associated geometry\r\n * @param geometry the geometry to be updated\r\n * @returns VertexData.\r\n */\r\n public updateGeometry(geometry: Geometry): VertexData {\r\n this._update(geometry);\r\n return this;\r\n }\r\n\r\n private readonly _applyTo = makeSyncFunction(this._applyToCoroutine.bind(this));\r\n\r\n /**\r\n * @internal\r\n */\r\n public *_applyToCoroutine(meshOrGeometry: IGetSetVerticesData, updatable: boolean = false, isAsync: boolean): Coroutine {\r\n if (this.positions) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.PositionKind, this.positions, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.normals) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.NormalKind, this.normals, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.tangents) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.TangentKind, this.tangents, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.uvs) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.UVKind, this.uvs, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.uvs2) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.UV2Kind, this.uvs2, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.uvs3) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.UV3Kind, this.uvs3, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.uvs4) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.UV4Kind, this.uvs4, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.uvs5) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.UV5Kind, this.uvs5, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.uvs6) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.UV6Kind, this.uvs6, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.colors) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.ColorKind, this.colors, updatable);\r\n if (this.hasVertexAlpha && (meshOrGeometry as any).hasVertexAlpha !== undefined) {\r\n (meshOrGeometry as any).hasVertexAlpha = true;\r\n }\r\n\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.matricesIndices) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.MatricesIndicesKind, this.matricesIndices, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.matricesWeights) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.MatricesWeightsKind, this.matricesWeights, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.matricesIndicesExtra) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.matricesWeightsExtra) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.indices) {\r\n meshOrGeometry.setIndices(this.indices, null, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n } else {\r\n meshOrGeometry.setIndices([], null);\r\n }\r\n\r\n if ((meshOrGeometry as Mesh).subMeshes && this.materialInfos && this.materialInfos.length > 1) {\r\n const mesh = meshOrGeometry as Mesh;\r\n mesh.subMeshes = [];\r\n for (const matInfo of this.materialInfos) {\r\n new SubMesh(matInfo.materialIndex, matInfo.verticesStart, matInfo.verticesCount, matInfo.indexStart, matInfo.indexCount, mesh);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private _update(meshOrGeometry: IGetSetVerticesData, updateExtends?: boolean, makeItUnique?: boolean): VertexData {\r\n if (this.positions) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.PositionKind, this.positions, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.normals) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.NormalKind, this.normals, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.tangents) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.TangentKind, this.tangents, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.uvs) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.UVKind, this.uvs, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.uvs2) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.UV2Kind, this.uvs2, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.uvs3) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.UV3Kind, this.uvs3, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.uvs4) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.UV4Kind, this.uvs4, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.uvs5) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.UV5Kind, this.uvs5, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.uvs6) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.UV6Kind, this.uvs6, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.colors) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.ColorKind, this.colors, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.matricesIndices) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.MatricesIndicesKind, this.matricesIndices, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.matricesWeights) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.MatricesWeightsKind, this.matricesWeights, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.matricesIndicesExtra) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.matricesWeightsExtra) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.indices) {\r\n meshOrGeometry.setIndices(this.indices, null);\r\n }\r\n return this;\r\n }\r\n\r\n @nativeOverride.filter((...[coordinates]: Parameters) => !Array.isArray(coordinates))\r\n private static _TransformVector3Coordinates(coordinates: FloatArray, transformation: DeepImmutable, offset = 0, length = coordinates.length) {\r\n const coordinate = TmpVectors.Vector3[0];\r\n const transformedCoordinate = TmpVectors.Vector3[1];\r\n for (let index = offset; index < offset + length; index += 3) {\r\n Vector3.FromArrayToRef(coordinates, index, coordinate);\r\n Vector3.TransformCoordinatesToRef(coordinate, transformation, transformedCoordinate);\r\n coordinates[index] = transformedCoordinate.x;\r\n coordinates[index + 1] = transformedCoordinate.y;\r\n coordinates[index + 2] = transformedCoordinate.z;\r\n }\r\n }\r\n\r\n @nativeOverride.filter((...[normals]: Parameters) => !Array.isArray(normals))\r\n private static _TransformVector3Normals(normals: FloatArray, transformation: DeepImmutable, offset = 0, length = normals.length) {\r\n const normal = TmpVectors.Vector3[0];\r\n const transformedNormal = TmpVectors.Vector3[1];\r\n for (let index = offset; index < offset + length; index += 3) {\r\n Vector3.FromArrayToRef(normals, index, normal);\r\n Vector3.TransformNormalToRef(normal, transformation, transformedNormal);\r\n normals[index] = transformedNormal.x;\r\n normals[index + 1] = transformedNormal.y;\r\n normals[index + 2] = transformedNormal.z;\r\n }\r\n }\r\n\r\n @nativeOverride.filter((...[normals]: Parameters) => !Array.isArray(normals))\r\n private static _TransformVector4Normals(normals: FloatArray, transformation: DeepImmutable, offset = 0, length = normals.length) {\r\n const normal = TmpVectors.Vector4[0];\r\n const transformedNormal = TmpVectors.Vector4[1];\r\n for (let index = offset; index < offset + length; index += 4) {\r\n Vector4.FromArrayToRef(normals, index, normal);\r\n Vector4.TransformNormalToRef(normal, transformation, transformedNormal);\r\n normals[index] = transformedNormal.x;\r\n normals[index + 1] = transformedNormal.y;\r\n normals[index + 2] = transformedNormal.z;\r\n normals[index + 3] = transformedNormal.w;\r\n }\r\n }\r\n\r\n @nativeOverride.filter((...[indices]: Parameters) => !Array.isArray(indices))\r\n private static _FlipFaces(indices: IndicesArray, offset = 0, length = indices.length) {\r\n for (let index = offset; index < offset + length; index += 3) {\r\n const tmp = indices[index + 1];\r\n indices[index + 1] = indices[index + 2];\r\n indices[index + 2] = tmp;\r\n }\r\n }\r\n\r\n /**\r\n * Transforms each position and each normal of the vertexData according to the passed Matrix\r\n * @param matrix the transforming matrix\r\n * @returns the VertexData\r\n */\r\n public transform(matrix: Matrix): VertexData {\r\n const flip = matrix.determinant() < 0;\r\n if (this.positions) {\r\n VertexData._TransformVector3Coordinates(this.positions, matrix);\r\n }\r\n\r\n if (this.normals) {\r\n VertexData._TransformVector3Normals(this.normals, matrix);\r\n }\r\n\r\n if (this.tangents) {\r\n VertexData._TransformVector4Normals(this.tangents, matrix);\r\n }\r\n\r\n if (flip && this.indices) {\r\n VertexData._FlipFaces(this.indices);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Generates an array of vertex data where each vertex data only has one material info\r\n * @returns An array of VertexData\r\n */\r\n public splitBasedOnMaterialID() {\r\n if (!this.materialInfos || this.materialInfos.length < 2) {\r\n return [this];\r\n }\r\n\r\n const result: VertexData[] = [];\r\n for (const materialInfo of this.materialInfos) {\r\n const vertexData = new VertexData();\r\n\r\n if (this.positions) {\r\n vertexData.positions = this.positions.slice(materialInfo.verticesStart * 3, (materialInfo.verticesCount + materialInfo.verticesStart) * 3);\r\n }\r\n\r\n if (this.normals) {\r\n vertexData.normals = this.normals.slice(materialInfo.verticesStart * 3, (materialInfo.verticesCount + materialInfo.verticesStart) * 3);\r\n }\r\n\r\n if (this.tangents) {\r\n vertexData.tangents = this.tangents.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4);\r\n }\r\n\r\n if (this.colors) {\r\n vertexData.colors = this.colors.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4);\r\n }\r\n\r\n if (this.uvs) {\r\n vertexData.uvs = this.uvs.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2);\r\n }\r\n\r\n if (this.uvs2) {\r\n vertexData.uvs2 = this.uvs2.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2);\r\n }\r\n\r\n if (this.uvs3) {\r\n vertexData.uvs3 = this.uvs3.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2);\r\n }\r\n\r\n if (this.uvs4) {\r\n vertexData.uvs4 = this.uvs4.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2);\r\n }\r\n\r\n if (this.uvs5) {\r\n vertexData.uvs5 = this.uvs5.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2);\r\n }\r\n\r\n if (this.uvs6) {\r\n vertexData.uvs6 = this.uvs6.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2);\r\n }\r\n\r\n if (this.matricesIndices) {\r\n vertexData.matricesIndices = this.matricesIndices.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4);\r\n }\r\n\r\n if (this.matricesIndicesExtra) {\r\n vertexData.matricesIndicesExtra = this.matricesIndicesExtra.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4);\r\n }\r\n\r\n if (this.matricesWeights) {\r\n vertexData.matricesWeights = this.matricesWeights.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4);\r\n }\r\n\r\n if (this.matricesWeightsExtra) {\r\n vertexData.matricesWeightsExtra = this.matricesWeightsExtra.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4);\r\n }\r\n\r\n if (this.indices) {\r\n vertexData.indices = [];\r\n for (let index = materialInfo.indexStart; index < materialInfo.indexStart + materialInfo.indexCount; index++) {\r\n vertexData.indices.push(this.indices[index] - materialInfo.verticesStart);\r\n }\r\n }\r\n\r\n const newMaterialInfo = new VertexDataMaterialInfo();\r\n newMaterialInfo.indexStart = 0;\r\n newMaterialInfo.indexCount = vertexData.indices ? vertexData.indices.length : 0;\r\n newMaterialInfo.materialIndex = materialInfo.materialIndex;\r\n newMaterialInfo.verticesStart = 0;\r\n newMaterialInfo.verticesCount = (vertexData.positions ? vertexData.positions.length : 0) / 3;\r\n vertexData.materialInfos = [newMaterialInfo];\r\n\r\n result.push(vertexData);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Merges the passed VertexData into the current one\r\n * @param others the VertexData to be merged into the current one\r\n * @param use32BitsIndices defines a boolean indicating if indices must be store in a 32 bits array\r\n * @param forceCloneIndices defines a boolean indicating if indices are forced to be cloned\r\n * @param mergeMaterialIds defines a boolean indicating if we need to merge the material infos\r\n * @param enableCompletion defines a boolean indicating if the vertex data should be completed to be compatible\r\n * @returns the modified VertexData\r\n */\r\n public merge(others: VertexData | VertexData[], use32BitsIndices = false, forceCloneIndices = false, mergeMaterialIds = false, enableCompletion = false) {\r\n const vertexDatas: { vertexData: VertexData; transform?: Matrix }[] = Array.isArray(others)\r\n ? others.map((other) => {\r\n return { vertexData: other };\r\n })\r\n : [{ vertexData: others }];\r\n return runCoroutineSync(this._mergeCoroutine(undefined, vertexDatas, use32BitsIndices, false, forceCloneIndices, mergeMaterialIds, enableCompletion));\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public *_mergeCoroutine(\r\n transform: Matrix | undefined,\r\n vertexDatas: { vertexData: VertexData; transform?: Matrix }[],\r\n use32BitsIndices = false,\r\n isAsync: boolean,\r\n forceCloneIndices: boolean,\r\n mergeMaterialIds = false,\r\n enableCompletion = false\r\n ): Coroutine {\r\n this._validate();\r\n\r\n let others = vertexDatas.map((vertexData) => vertexData.vertexData);\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let root: VertexData = this;\r\n\r\n if (enableCompletion) {\r\n // First let's make sure we have the max set of attributes on the main vertex data\r\n for (const other of others) {\r\n if (!other) {\r\n continue;\r\n }\r\n\r\n other._validate();\r\n\r\n if (!this.normals && other.normals) {\r\n this.normals = new Float32Array(this.positions!.length);\r\n }\r\n\r\n if (!this.tangents && other.tangents) {\r\n this.tangents = new Float32Array((this.positions!.length / 3) * 4);\r\n }\r\n\r\n if (!this.uvs && other.uvs) {\r\n this.uvs = new Float32Array((this.positions!.length / 3) * 2);\r\n }\r\n\r\n if (!this.uvs2 && other.uvs2) {\r\n this.uvs2 = new Float32Array((this.positions!.length / 3) * 2);\r\n }\r\n\r\n if (!this.uvs3 && other.uvs3) {\r\n this.uvs3 = new Float32Array((this.positions!.length / 3) * 2);\r\n }\r\n\r\n if (!this.uvs4 && other.uvs4) {\r\n this.uvs4 = new Float32Array((this.positions!.length / 3) * 2);\r\n }\r\n\r\n if (!this.uvs5 && other.uvs5) {\r\n this.uvs5 = new Float32Array((this.positions!.length / 3) * 2);\r\n }\r\n\r\n if (!this.uvs6 && other.uvs6) {\r\n this.uvs6 = new Float32Array((this.positions!.length / 3) * 2);\r\n }\r\n\r\n if (!this.colors && other.colors) {\r\n this.colors = new Float32Array((this.positions!.length / 3) * 4);\r\n this.colors.fill(1); // Set to white by default\r\n }\r\n\r\n if (!this.matricesIndices && other.matricesIndices) {\r\n this.matricesIndices = new Float32Array((this.positions!.length / 3) * 4);\r\n }\r\n\r\n if (!this.matricesWeights && other.matricesWeights) {\r\n this.matricesWeights = new Float32Array((this.positions!.length / 3) * 4);\r\n }\r\n\r\n if (!this.matricesIndicesExtra && other.matricesIndicesExtra) {\r\n this.matricesIndicesExtra = new Float32Array((this.positions!.length / 3) * 4);\r\n }\r\n\r\n if (!this.matricesWeightsExtra && other.matricesWeightsExtra) {\r\n this.matricesWeightsExtra = new Float32Array((this.positions!.length / 3) * 4);\r\n }\r\n }\r\n }\r\n\r\n for (const other of others) {\r\n if (!other) {\r\n continue;\r\n }\r\n\r\n if (!enableCompletion) {\r\n other._validate();\r\n if (\r\n !this.normals !== !other.normals ||\r\n !this.tangents !== !other.tangents ||\r\n !this.uvs !== !other.uvs ||\r\n !this.uvs2 !== !other.uvs2 ||\r\n !this.uvs3 !== !other.uvs3 ||\r\n !this.uvs4 !== !other.uvs4 ||\r\n !this.uvs5 !== !other.uvs5 ||\r\n !this.uvs6 !== !other.uvs6 ||\r\n !this.colors !== !other.colors ||\r\n !this.matricesIndices !== !other.matricesIndices ||\r\n !this.matricesWeights !== !other.matricesWeights ||\r\n !this.matricesIndicesExtra !== !other.matricesIndicesExtra ||\r\n !this.matricesWeightsExtra !== !other.matricesWeightsExtra\r\n ) {\r\n throw new Error(\"Cannot merge vertex data that do not have the same set of attributes\");\r\n }\r\n } else {\r\n // Align the others with main set of attributes\r\n if (this.normals && !other.normals) {\r\n other.normals = new Float32Array(other.positions!.length);\r\n }\r\n\r\n if (this.tangents && !other.tangents) {\r\n other.tangents = new Float32Array((other.positions!.length / 3) * 4);\r\n }\r\n\r\n if (this.uvs && !other.uvs) {\r\n other.uvs = new Float32Array((other.positions!.length / 3) * 2);\r\n }\r\n\r\n if (this.uvs2 && !other.uvs2) {\r\n other.uvs2 = new Float32Array((other.positions!.length / 3) * 2);\r\n }\r\n\r\n if (this.uvs3 && !other.uvs3) {\r\n other.uvs3 = new Float32Array((other.positions!.length / 3) * 2);\r\n }\r\n\r\n if (this.uvs4 && !other.uvs4) {\r\n other.uvs4 = new Float32Array((other.positions!.length / 3) * 2);\r\n }\r\n if (this.uvs5 && !other.uvs5) {\r\n other.uvs5 = new Float32Array((other.positions!.length / 3) * 2);\r\n }\r\n\r\n if (this.uvs6 && !other.uvs6) {\r\n other.uvs6 = new Float32Array((other.positions!.length / 3) * 2);\r\n }\r\n\r\n if (this.colors && !other.colors) {\r\n other.colors = new Float32Array((other.positions!.length / 3) * 4);\r\n other.colors.fill(1); // Set to white by default\r\n }\r\n\r\n if (this.matricesIndices && !other.matricesIndices) {\r\n other.matricesIndices = new Float32Array((other.positions!.length / 3) * 4);\r\n }\r\n if (this.matricesWeights && !other.matricesWeights) {\r\n other.matricesWeights = new Float32Array((other.positions!.length / 3) * 4);\r\n }\r\n\r\n if (this.matricesIndicesExtra && !other.matricesIndicesExtra) {\r\n other.matricesIndicesExtra = new Float32Array((other.positions!.length / 3) * 4);\r\n }\r\n\r\n if (this.matricesWeightsExtra && !other.matricesWeightsExtra) {\r\n other.matricesWeightsExtra = new Float32Array((other.positions!.length / 3) * 4);\r\n }\r\n }\r\n }\r\n\r\n if (mergeMaterialIds) {\r\n // Merge material infos\r\n let materialIndex = 0;\r\n let indexOffset = 0;\r\n let vertexOffset = 0;\r\n const materialInfos: VertexDataMaterialInfo[] = [];\r\n let currentMaterialInfo: Nullable = null;\r\n const vertexDataList: { vertexData: VertexData; transform?: Matrix }[] = [];\r\n\r\n // We need to split vertexData with more than one materialInfo\r\n for (const split of this.splitBasedOnMaterialID()) {\r\n vertexDataList.push({ vertexData: split, transform: transform });\r\n }\r\n\r\n for (const data of vertexDatas) {\r\n if (!data.vertexData) {\r\n continue;\r\n }\r\n for (const split of data.vertexData.splitBasedOnMaterialID()) {\r\n vertexDataList.push({ vertexData: split, transform: data.transform });\r\n }\r\n }\r\n\r\n // Sort by material IDs\r\n vertexDataList.sort((a, b) => {\r\n const matInfoA = a.vertexData.materialInfos ? a.vertexData.materialInfos[0].materialIndex : 0;\r\n const matInfoB = b.vertexData.materialInfos ? b.vertexData.materialInfos[0].materialIndex : 0;\r\n\r\n if (matInfoA > matInfoB) {\r\n return 1;\r\n }\r\n\r\n if (matInfoA === matInfoB) {\r\n return 0;\r\n }\r\n\r\n return -1;\r\n });\r\n\r\n // Build the new material info\r\n for (const vertexDataSource of vertexDataList) {\r\n const vertexData = vertexDataSource.vertexData;\r\n if (vertexData.materialInfos) {\r\n materialIndex = vertexData.materialInfos[0].materialIndex;\r\n } else {\r\n materialIndex = 0;\r\n }\r\n if (currentMaterialInfo && currentMaterialInfo.materialIndex === materialIndex) {\r\n currentMaterialInfo.indexCount += vertexData.indices!.length;\r\n currentMaterialInfo.verticesCount += vertexData.positions!.length / 3;\r\n } else {\r\n const materialInfo = new VertexDataMaterialInfo();\r\n materialInfo.materialIndex = materialIndex;\r\n materialInfo.indexStart = indexOffset;\r\n materialInfo.indexCount = vertexData.indices!.length;\r\n materialInfo.verticesStart = vertexOffset;\r\n materialInfo.verticesCount = vertexData.positions!.length / 3;\r\n\r\n materialInfos.push(materialInfo);\r\n currentMaterialInfo = materialInfo;\r\n }\r\n indexOffset += vertexData.indices!.length;\r\n vertexOffset += vertexData.positions!.length / 3;\r\n }\r\n // Extract sorted values\r\n const first = vertexDataList.splice(0, 1)[0];\r\n root = first.vertexData;\r\n transform = first.transform;\r\n others = vertexDataList.map((v) => v.vertexData);\r\n vertexDatas = vertexDataList;\r\n\r\n this.materialInfos = materialInfos;\r\n }\r\n\r\n // Merge geometries\r\n const totalIndices = others.reduce((indexSum, vertexData) => indexSum + (vertexData.indices?.length ?? 0), root.indices?.length ?? 0);\r\n const sliceIndices = forceCloneIndices || others.some((vertexData) => vertexData.indices === root.indices);\r\n let indices = sliceIndices ? root.indices?.slice() : root.indices;\r\n if (totalIndices > 0) {\r\n let indicesOffset = indices?.length ?? 0;\r\n\r\n if (!indices) {\r\n indices = new Array(totalIndices);\r\n }\r\n\r\n if (indices.length !== totalIndices) {\r\n if (Array.isArray(indices)) {\r\n indices.length = totalIndices;\r\n } else {\r\n const temp = use32BitsIndices || indices instanceof Uint32Array ? new Uint32Array(totalIndices) : new Uint16Array(totalIndices);\r\n temp.set(indices);\r\n indices = temp;\r\n }\r\n\r\n if (transform && transform.determinant() < 0) {\r\n VertexData._FlipFaces(indices, 0, indicesOffset);\r\n }\r\n }\r\n\r\n let positionsOffset = root.positions ? root.positions.length / 3 : 0;\r\n for (const { vertexData: other, transform } of vertexDatas) {\r\n if (other.indices) {\r\n for (let index = 0; index < other.indices.length; index++) {\r\n indices[indicesOffset + index] = other.indices[index] + positionsOffset;\r\n }\r\n\r\n if (transform && transform.determinant() < 0) {\r\n VertexData._FlipFaces(indices, indicesOffset, other.indices.length);\r\n }\r\n\r\n // The call to _validate already checked for positions\r\n positionsOffset += other.positions!.length / 3;\r\n indicesOffset += other.indices.length;\r\n\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.indices = indices!;\r\n\r\n this.positions = VertexData._MergeElement(\r\n VertexBuffer.PositionKind,\r\n root.positions,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.positions, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n if (root.normals) {\r\n this.normals = VertexData._MergeElement(\r\n VertexBuffer.NormalKind,\r\n root.normals,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.normals, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.tangents) {\r\n this.tangents = VertexData._MergeElement(\r\n VertexBuffer.TangentKind,\r\n root.tangents,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.tangents, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.uvs) {\r\n this.uvs = VertexData._MergeElement(\r\n VertexBuffer.UVKind,\r\n root.uvs,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.uvs, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.uvs2) {\r\n this.uvs2 = VertexData._MergeElement(\r\n VertexBuffer.UV2Kind,\r\n root.uvs2,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.uvs2, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.uvs3) {\r\n this.uvs3 = VertexData._MergeElement(\r\n VertexBuffer.UV3Kind,\r\n root.uvs3,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.uvs3, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.uvs4) {\r\n this.uvs4 = VertexData._MergeElement(\r\n VertexBuffer.UV4Kind,\r\n root.uvs4,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.uvs4, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.uvs5) {\r\n this.uvs5 = VertexData._MergeElement(\r\n VertexBuffer.UV5Kind,\r\n root.uvs5,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.uvs5, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.uvs6) {\r\n this.uvs6 = VertexData._MergeElement(\r\n VertexBuffer.UV6Kind,\r\n root.uvs6,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.uvs6, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.colors) {\r\n this.colors = VertexData._MergeElement(\r\n VertexBuffer.ColorKind,\r\n root.colors,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.colors, other.transform])\r\n );\r\n if (root.hasVertexAlpha !== undefined || vertexDatas.some((other) => other.vertexData.hasVertexAlpha !== undefined)) {\r\n this.hasVertexAlpha = root.hasVertexAlpha || vertexDatas.some((other) => other.vertexData.hasVertexAlpha);\r\n }\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.matricesIndices) {\r\n this.matricesIndices = VertexData._MergeElement(\r\n VertexBuffer.MatricesIndicesKind,\r\n root.matricesIndices,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.matricesIndices, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.matricesWeights) {\r\n this.matricesWeights = VertexData._MergeElement(\r\n VertexBuffer.MatricesWeightsKind,\r\n root.matricesWeights,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.matricesWeights, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.matricesIndicesExtra) {\r\n this.matricesIndicesExtra = VertexData._MergeElement(\r\n VertexBuffer.MatricesIndicesExtraKind,\r\n root.matricesIndicesExtra,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.matricesIndicesExtra, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.matricesWeightsExtra) {\r\n this.matricesWeightsExtra = VertexData._MergeElement(\r\n VertexBuffer.MatricesWeightsExtraKind,\r\n root.matricesWeightsExtra,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.matricesWeightsExtra, other.transform])\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private static _MergeElement(\r\n kind: string,\r\n source: Nullable,\r\n transform: Matrix | undefined,\r\n others: readonly (readonly [element: Nullable, transform?: Matrix])[]\r\n ): Nullable {\r\n const nonNullOthers = others.filter((other): other is [element: FloatArray, transform?: Matrix] => other[0] !== null && other[0] !== undefined);\r\n\r\n // If there is no source to copy and no other non-null sources then skip this element.\r\n if (!source && nonNullOthers.length == 0) {\r\n return source;\r\n }\r\n\r\n if (!source) {\r\n return this._MergeElement(kind, nonNullOthers[0][0], nonNullOthers[0][1], nonNullOthers.slice(1));\r\n }\r\n\r\n const len = nonNullOthers.reduce((sumLen, elements) => sumLen + elements[0].length, source.length);\r\n\r\n const transformRange =\r\n kind === VertexBuffer.PositionKind\r\n ? VertexData._TransformVector3Coordinates\r\n : kind === VertexBuffer.NormalKind\r\n ? VertexData._TransformVector3Normals\r\n : kind === VertexBuffer.TangentKind\r\n ? VertexData._TransformVector4Normals\r\n : () => {};\r\n\r\n if (source instanceof Float32Array) {\r\n // use non-loop method when the source is Float32Array\r\n const ret32 = new Float32Array(len);\r\n ret32.set(source);\r\n transform && transformRange(ret32, transform, 0, source.length);\r\n\r\n let offset = source.length;\r\n for (const [vertexData, transform] of nonNullOthers) {\r\n ret32.set(vertexData, offset);\r\n transform && transformRange(ret32, transform, offset, vertexData.length);\r\n offset += vertexData.length;\r\n }\r\n return ret32;\r\n } else {\r\n // don't use concat as it is super slow, just loop for other cases\r\n const ret = new Array(len);\r\n for (let i = 0; i < source.length; i++) {\r\n ret[i] = source[i];\r\n }\r\n transform && transformRange(ret, transform, 0, source.length);\r\n\r\n let offset = source.length;\r\n for (const [vertexData, transform] of nonNullOthers) {\r\n for (let i = 0; i < vertexData.length; i++) {\r\n ret[offset + i] = vertexData[i];\r\n }\r\n transform && transformRange(ret, transform, offset, vertexData.length);\r\n offset += vertexData.length;\r\n }\r\n return ret;\r\n }\r\n }\r\n\r\n private _validate(): void {\r\n if (!this.positions) {\r\n throw new RuntimeError(\"Positions are required\", ErrorCodes.MeshInvalidPositionsError);\r\n }\r\n\r\n const getElementCount = (kind: string, values: FloatArray) => {\r\n const stride = VertexBuffer.DeduceStride(kind);\r\n if (values.length % stride !== 0) {\r\n throw new Error(\"The \" + kind + \"s array count must be a multiple of \" + stride);\r\n }\r\n\r\n return values.length / stride;\r\n };\r\n\r\n const positionsElementCount = getElementCount(VertexBuffer.PositionKind, this.positions);\r\n\r\n const validateElementCount = (kind: string, values: FloatArray) => {\r\n const elementCount = getElementCount(kind, values);\r\n if (elementCount !== positionsElementCount) {\r\n throw new Error(\"The \" + kind + \"s element count (\" + elementCount + \") does not match the positions count (\" + positionsElementCount + \")\");\r\n }\r\n };\r\n\r\n if (this.normals) {\r\n validateElementCount(VertexBuffer.NormalKind, this.normals);\r\n }\r\n if (this.tangents) {\r\n validateElementCount(VertexBuffer.TangentKind, this.tangents);\r\n }\r\n if (this.uvs) {\r\n validateElementCount(VertexBuffer.UVKind, this.uvs);\r\n }\r\n if (this.uvs2) {\r\n validateElementCount(VertexBuffer.UV2Kind, this.uvs2);\r\n }\r\n if (this.uvs3) {\r\n validateElementCount(VertexBuffer.UV3Kind, this.uvs3);\r\n }\r\n if (this.uvs4) {\r\n validateElementCount(VertexBuffer.UV4Kind, this.uvs4);\r\n }\r\n if (this.uvs5) {\r\n validateElementCount(VertexBuffer.UV5Kind, this.uvs5);\r\n }\r\n if (this.uvs6) {\r\n validateElementCount(VertexBuffer.UV6Kind, this.uvs6);\r\n }\r\n if (this.colors) {\r\n validateElementCount(VertexBuffer.ColorKind, this.colors);\r\n }\r\n if (this.matricesIndices) {\r\n validateElementCount(VertexBuffer.MatricesIndicesKind, this.matricesIndices);\r\n }\r\n if (this.matricesWeights) {\r\n validateElementCount(VertexBuffer.MatricesWeightsKind, this.matricesWeights);\r\n }\r\n if (this.matricesIndicesExtra) {\r\n validateElementCount(VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra);\r\n }\r\n if (this.matricesWeightsExtra) {\r\n validateElementCount(VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra);\r\n }\r\n }\r\n\r\n /**\r\n * Clone the current vertex data\r\n * @returns a copy of the current data\r\n */\r\n public clone() {\r\n const serializationObject = this.serialize();\r\n return VertexData.Parse(serializationObject);\r\n }\r\n\r\n /**\r\n * Serializes the VertexData\r\n * @returns a serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n if (this.positions) {\r\n serializationObject.positions = Array.from(this.positions);\r\n }\r\n\r\n if (this.normals) {\r\n serializationObject.normals = Array.from(this.normals);\r\n }\r\n\r\n if (this.tangents) {\r\n serializationObject.tangents = Array.from(this.tangents);\r\n }\r\n\r\n if (this.uvs) {\r\n serializationObject.uvs = Array.from(this.uvs);\r\n }\r\n\r\n if (this.uvs2) {\r\n serializationObject.uvs2 = Array.from(this.uvs2);\r\n }\r\n\r\n if (this.uvs3) {\r\n serializationObject.uvs3 = Array.from(this.uvs3);\r\n }\r\n\r\n if (this.uvs4) {\r\n serializationObject.uvs4 = Array.from(this.uvs4);\r\n }\r\n\r\n if (this.uvs5) {\r\n serializationObject.uvs5 = Array.from(this.uvs5);\r\n }\r\n\r\n if (this.uvs6) {\r\n serializationObject.uvs6 = Array.from(this.uvs6);\r\n }\r\n\r\n if (this.colors) {\r\n serializationObject.colors = Array.from(this.colors);\r\n serializationObject.hasVertexAlpha = this.hasVertexAlpha;\r\n }\r\n\r\n if (this.matricesIndices) {\r\n serializationObject.matricesIndices = Array.from(this.matricesIndices);\r\n serializationObject.matricesIndices._isExpanded = true;\r\n }\r\n\r\n if (this.matricesWeights) {\r\n serializationObject.matricesWeights = Array.from(this.matricesWeights);\r\n }\r\n\r\n if (this.matricesIndicesExtra) {\r\n serializationObject.matricesIndicesExtra = Array.from(this.matricesIndicesExtra);\r\n serializationObject.matricesIndicesExtra._isExpanded = true;\r\n }\r\n\r\n if (this.matricesWeightsExtra) {\r\n serializationObject.matricesWeightsExtra = Array.from(this.matricesWeightsExtra);\r\n }\r\n\r\n serializationObject.indices = Array.from(this.indices as number[]);\r\n\r\n if (this.materialInfos) {\r\n serializationObject.materialInfos = [];\r\n for (const materialInfo of this.materialInfos) {\r\n const materialInfoSerializationObject = {\r\n indexStart: materialInfo.indexStart,\r\n indexCount: materialInfo.indexCount,\r\n materialIndex: materialInfo.materialIndex,\r\n verticesStart: materialInfo.verticesStart,\r\n verticesCount: materialInfo.verticesCount,\r\n };\r\n serializationObject.materialInfos.push(materialInfoSerializationObject);\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Extracts the vertexData from a mesh\r\n * @param mesh the mesh from which to extract the VertexData\r\n * @param copyWhenShared defines if the VertexData must be cloned when shared between multiple meshes, optional, default false\r\n * @param forceCopy indicating that the VertexData must be cloned, optional, default false\r\n * @returns the object VertexData associated to the passed mesh\r\n */\r\n public static ExtractFromMesh(mesh: Mesh, copyWhenShared?: boolean, forceCopy?: boolean): VertexData {\r\n return VertexData._ExtractFrom(mesh, copyWhenShared, forceCopy);\r\n }\r\n\r\n /**\r\n * Extracts the vertexData from the geometry\r\n * @param geometry the geometry from which to extract the VertexData\r\n * @param copyWhenShared defines if the VertexData must be cloned when the geometry is shared between multiple meshes, optional, default false\r\n * @param forceCopy indicating that the VertexData must be cloned, optional, default false\r\n * @returns the object VertexData associated to the passed mesh\r\n */\r\n public static ExtractFromGeometry(geometry: Geometry, copyWhenShared?: boolean, forceCopy?: boolean): VertexData {\r\n return VertexData._ExtractFrom(geometry, copyWhenShared, forceCopy);\r\n }\r\n\r\n private static _ExtractFrom(meshOrGeometry: IGetSetVerticesData, copyWhenShared?: boolean, forceCopy?: boolean): VertexData {\r\n const result = new VertexData();\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.PositionKind)) {\r\n result.positions = meshOrGeometry.getVerticesData(VertexBuffer.PositionKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.NormalKind)) {\r\n result.normals = meshOrGeometry.getVerticesData(VertexBuffer.NormalKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.TangentKind)) {\r\n result.tangents = meshOrGeometry.getVerticesData(VertexBuffer.TangentKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n result.uvs = meshOrGeometry.getVerticesData(VertexBuffer.UVKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV2Kind)) {\r\n result.uvs2 = meshOrGeometry.getVerticesData(VertexBuffer.UV2Kind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV3Kind)) {\r\n result.uvs3 = meshOrGeometry.getVerticesData(VertexBuffer.UV3Kind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV4Kind)) {\r\n result.uvs4 = meshOrGeometry.getVerticesData(VertexBuffer.UV4Kind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV5Kind)) {\r\n result.uvs5 = meshOrGeometry.getVerticesData(VertexBuffer.UV5Kind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV6Kind)) {\r\n result.uvs6 = meshOrGeometry.getVerticesData(VertexBuffer.UV6Kind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.ColorKind)) {\r\n result.colors = meshOrGeometry.getVerticesData(VertexBuffer.ColorKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind)) {\r\n result.matricesIndices = meshOrGeometry.getVerticesData(VertexBuffer.MatricesIndicesKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) {\r\n result.matricesWeights = meshOrGeometry.getVerticesData(VertexBuffer.MatricesWeightsKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesIndicesExtraKind)) {\r\n result.matricesIndicesExtra = meshOrGeometry.getVerticesData(VertexBuffer.MatricesIndicesExtraKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesWeightsExtraKind)) {\r\n result.matricesWeightsExtra = meshOrGeometry.getVerticesData(VertexBuffer.MatricesWeightsExtraKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n result.indices = meshOrGeometry.getIndices(copyWhenShared, forceCopy);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a Ribbon\r\n * @param options an object used to set the following optional parameters for the ribbon, required but can be empty\r\n * * pathArray array of paths, each of which an array of successive Vector3\r\n * * closeArray creates a seam between the first and the last paths of the pathArray, optional, default false\r\n * * closePath creates a seam between the first and the last points of each path of the path array, optional, default false\r\n * * offset a positive integer, only used when pathArray contains a single path (offset = 10 means the point 1 is joined to the point 11), default rounded half size of the pathArray length\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * * invertUV swaps in the U and V coordinates when applying a texture, optional, default false\r\n * * uvs a linear array, of length 2 * number of vertices, of custom UV values, optional\r\n * * colors a linear array, of length 4 * number of vertices, of custom color values, optional\r\n * @returns the VertexData of the ribbon\r\n * @deprecated use CreateRibbonVertexData instead\r\n */\r\n public static CreateRibbon(options: {\r\n pathArray: Vector3[][];\r\n closeArray?: boolean;\r\n closePath?: boolean;\r\n offset?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n invertUV?: boolean;\r\n uvs?: Vector2[];\r\n colors?: Color4[];\r\n }): VertexData {\r\n throw _WarnImport(\"ribbonBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a box\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * size sets the width, height and depth of the box to the value of size, optional default 1\r\n * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size\r\n * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size\r\n * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size\r\n * * faceUV an array of 6 Vector4 elements used to set different images to each box side\r\n * * faceColors an array of 6 Color3 elements used to set different colors to each box side\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the box\r\n * @deprecated Please use CreateBoxVertexData from the BoxBuilder file instead\r\n */\r\n public static CreateBox(options: {\r\n size?: number;\r\n width?: number;\r\n height?: number;\r\n depth?: number;\r\n faceUV?: Vector4[];\r\n faceColors?: Color4[];\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"boxBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a tiled box\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * faceTiles sets the pattern, tile size and number of tiles for a face\r\n * * faceUV an array of 6 Vector4 elements used to set different images to each box side\r\n * * faceColors an array of 6 Color3 elements used to set different colors to each box side\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * @param options.pattern\r\n * @param options.width\r\n * @param options.height\r\n * @param options.depth\r\n * @param options.tileSize\r\n * @param options.tileWidth\r\n * @param options.tileHeight\r\n * @param options.alignHorizontal\r\n * @param options.alignVertical\r\n * @param options.faceUV\r\n * @param options.faceColors\r\n * @param options.sideOrientation\r\n * @returns the VertexData of the box\r\n * @deprecated Please use CreateTiledBoxVertexData instead\r\n */\r\n public static CreateTiledBox(options: {\r\n pattern?: number;\r\n width?: number;\r\n height?: number;\r\n depth?: number;\r\n tileSize?: number;\r\n tileWidth?: number;\r\n tileHeight?: number;\r\n alignHorizontal?: number;\r\n alignVertical?: number;\r\n faceUV?: Vector4[];\r\n faceColors?: Color4[];\r\n sideOrientation?: number;\r\n }): VertexData {\r\n throw _WarnImport(\"tiledBoxBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a tiled plane\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * pattern a limited pattern arrangement depending on the number\r\n * * tileSize sets the width, height and depth of the tile to the value of size, optional default 1\r\n * * tileWidth sets the width (x direction) of the tile, overwrites the width set by size, optional, default size\r\n * * tileHeight sets the height (y direction) of the tile, overwrites the height set by size, optional, default size\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the tiled plane\r\n * @deprecated use CreateTiledPlaneVertexData instead\r\n */\r\n public static CreateTiledPlane(options: {\r\n pattern?: number;\r\n tileSize?: number;\r\n tileWidth?: number;\r\n tileHeight?: number;\r\n size?: number;\r\n width?: number;\r\n height?: number;\r\n alignHorizontal?: number;\r\n alignVertical?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"tiledPlaneBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for an ellipsoid, defaults to a sphere\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * segments sets the number of horizontal strips optional, default 32\r\n * * diameter sets the axes dimensions, diameterX, diameterY and diameterZ to the value of diameter, optional default 1\r\n * * diameterX sets the diameterX (x direction) of the ellipsoid, overwrites the diameterX set by diameter, optional, default diameter\r\n * * diameterY sets the diameterY (y direction) of the ellipsoid, overwrites the diameterY set by diameter, optional, default diameter\r\n * * diameterZ sets the diameterZ (z direction) of the ellipsoid, overwrites the diameterZ set by diameter, optional, default diameter\r\n * * arc a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the circumference (latitude) given by the arc value, optional, default 1\r\n * * slice a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the height (latitude) given by the arc value, optional, default 1\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the ellipsoid\r\n * @deprecated use CreateSphereVertexData instead\r\n */\r\n public static CreateSphere(options: {\r\n segments?: number;\r\n diameter?: number;\r\n diameterX?: number;\r\n diameterY?: number;\r\n diameterZ?: number;\r\n arc?: number;\r\n slice?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"sphereBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a cylinder, cone or prism\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * height sets the height (y direction) of the cylinder, optional, default 2\r\n * * diameterTop sets the diameter of the top of the cone, overwrites diameter, optional, default diameter\r\n * * diameterBottom sets the diameter of the bottom of the cone, overwrites diameter, optional, default diameter\r\n * * diameter sets the diameter of the top and bottom of the cone, optional default 1\r\n * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24\r\n * * subdivisions` the number of rings along the cylinder height, optional, default 1\r\n * * arc a number from 0 to 1, to create an unclosed cylinder based on the fraction of the circumference given by the arc value, optional, default 1\r\n * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively\r\n * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively\r\n * * hasRings when true makes each subdivision independently treated as a face for faceUV and faceColors, optional, default false\r\n * * enclose when true closes an open cylinder by adding extra flat faces between the height axis and vertical edges, think cut cake\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the cylinder, cone or prism\r\n * @deprecated please use CreateCylinderVertexData instead\r\n */\r\n public static CreateCylinder(options: {\r\n height?: number;\r\n diameterTop?: number;\r\n diameterBottom?: number;\r\n diameter?: number;\r\n tessellation?: number;\r\n subdivisions?: number;\r\n arc?: number;\r\n faceColors?: Color4[];\r\n faceUV?: Vector4[];\r\n hasRings?: boolean;\r\n enclose?: boolean;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"cylinderBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a torus\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * diameter the diameter of the torus, optional default 1\r\n * * thickness the diameter of the tube forming the torus, optional default 0.5\r\n * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the torus\r\n * @deprecated use CreateTorusVertexData instead\r\n */\r\n public static CreateTorus(options: {\r\n diameter?: number;\r\n thickness?: number;\r\n tessellation?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"torusBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData of the LineSystem\r\n * @param options an object used to set the following optional parameters for the LineSystem, required but can be empty\r\n * - lines an array of lines, each line being an array of successive Vector3\r\n * - colors an array of line colors, each of the line colors being an array of successive Color4, one per line point\r\n * @returns the VertexData of the LineSystem\r\n * @deprecated use CreateLineSystemVertexData instead\r\n */\r\n public static CreateLineSystem(options: { lines: Vector3[][]; colors?: Nullable }): VertexData {\r\n throw _WarnImport(\"linesBuilder\");\r\n }\r\n\r\n /**\r\n * Create the VertexData for a DashedLines\r\n * @param options an object used to set the following optional parameters for the DashedLines, required but can be empty\r\n * - points an array successive Vector3\r\n * - dashSize the size of the dashes relative to the dash number, optional, default 3\r\n * - gapSize the size of the gap between two successive dashes relative to the dash number, optional, default 1\r\n * - dashNb the intended total number of dashes, optional, default 200\r\n * @returns the VertexData for the DashedLines\r\n * @deprecated use CreateDashedLinesVertexData instead\r\n */\r\n public static CreateDashedLines(options: { points: Vector3[]; dashSize?: number; gapSize?: number; dashNb?: number }): VertexData {\r\n throw _WarnImport(\"linesBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a Ground\r\n * @param options an object used to set the following optional parameters for the Ground, required but can be empty\r\n * - width the width (x direction) of the ground, optional, default 1\r\n * - height the height (z direction) of the ground, optional, default 1\r\n * - subdivisions the number of subdivisions per side, optional, default 1\r\n * @returns the VertexData of the Ground\r\n * @deprecated Please use CreateGroundVertexData instead\r\n */\r\n public static CreateGround(options: { width?: number; height?: number; subdivisions?: number; subdivisionsX?: number; subdivisionsY?: number }): VertexData {\r\n throw _WarnImport(\"groundBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a TiledGround by subdividing the ground into tiles\r\n * @param options an object used to set the following optional parameters for the Ground, required but can be empty\r\n * * xmin the ground minimum X coordinate, optional, default -1\r\n * * zmin the ground minimum Z coordinate, optional, default -1\r\n * * xmax the ground maximum X coordinate, optional, default 1\r\n * * zmax the ground maximum Z coordinate, optional, default 1\r\n * * subdivisions a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the ground width and height creating 'tiles', default {w: 6, h: 6}\r\n * * precision a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the tile width and height, default {w: 2, h: 2}\r\n * @returns the VertexData of the TiledGround\r\n * @deprecated use CreateTiledGroundVertexData instead\r\n */\r\n public static CreateTiledGround(options: {\r\n xmin: number;\r\n zmin: number;\r\n xmax: number;\r\n zmax: number;\r\n subdivisions?: { w: number; h: number };\r\n precision?: { w: number; h: number };\r\n }): VertexData {\r\n throw _WarnImport(\"groundBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData of the Ground designed from a heightmap\r\n * @param options an object used to set the following parameters for the Ground, required and provided by CreateGroundFromHeightMap\r\n * * width the width (x direction) of the ground\r\n * * height the height (z direction) of the ground\r\n * * subdivisions the number of subdivisions per side\r\n * * minHeight the minimum altitude on the ground, optional, default 0\r\n * * maxHeight the maximum altitude on the ground, optional default 1\r\n * * colorFilter the filter to apply to the image pixel colors to compute the height, optional Color3, default (0.3, 0.59, 0.11)\r\n * * buffer the array holding the image color data\r\n * * bufferWidth the width of image\r\n * * bufferHeight the height of image\r\n * * alphaFilter Remove any data where the alpha channel is below this value, defaults 0 (all data visible)\r\n * @returns the VertexData of the Ground designed from a heightmap\r\n * @deprecated use CreateGroundFromHeightMapVertexData instead\r\n */\r\n public static CreateGroundFromHeightMap(options: {\r\n width: number;\r\n height: number;\r\n subdivisions: number;\r\n minHeight: number;\r\n maxHeight: number;\r\n colorFilter: Color3;\r\n buffer: Uint8Array;\r\n bufferWidth: number;\r\n bufferHeight: number;\r\n alphaFilter: number;\r\n }): VertexData {\r\n throw _WarnImport(\"groundBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a Plane\r\n * @param options an object used to set the following optional parameters for the plane, required but can be empty\r\n * * size sets the width and height of the plane to the value of size, optional default 1\r\n * * width sets the width (x direction) of the plane, overwrites the width set by size, optional, default size\r\n * * height sets the height (y direction) of the plane, overwrites the height set by size, optional, default size\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the box\r\n * @deprecated use CreatePlaneVertexData instead\r\n */\r\n public static CreatePlane(options: { size?: number; width?: number; height?: number; sideOrientation?: number; frontUVs?: Vector4; backUVs?: Vector4 }): VertexData {\r\n throw _WarnImport(\"planeBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData of the Disc or regular Polygon\r\n * @param options an object used to set the following optional parameters for the disc, required but can be empty\r\n * * radius the radius of the disc, optional default 0.5\r\n * * tessellation the number of polygon sides, optional, default 64\r\n * * arc a number from 0 to 1, to create an unclosed polygon based on the fraction of the circumference given by the arc value, optional, default 1\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the box\r\n * @deprecated use CreateDiscVertexData instead\r\n */\r\n public static CreateDisc(options: { radius?: number; tessellation?: number; arc?: number; sideOrientation?: number; frontUVs?: Vector4; backUVs?: Vector4 }): VertexData {\r\n throw _WarnImport(\"discBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for an irregular Polygon in the XoZ plane using a mesh built by polygonTriangulation.build()\r\n * All parameters are provided by CreatePolygon as needed\r\n * @param polygon a mesh built from polygonTriangulation.build()\r\n * @param sideOrientation takes the values Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * @param fUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively\r\n * @param fColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively\r\n * @param frontUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * @param backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @param wrap a boolean, default false, when true and fUVs used texture is wrapped around all sides, when false texture is applied side\r\n * @returns the VertexData of the Polygon\r\n * @deprecated use CreatePolygonVertexData instead\r\n */\r\n public static CreatePolygon(polygon: Mesh, sideOrientation: number, fUV?: Vector4[], fColors?: Color4[], frontUVs?: Vector4, backUVs?: Vector4, wrap?: boolean): VertexData {\r\n throw _WarnImport(\"polygonBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData of the IcoSphere\r\n * @param options an object used to set the following optional parameters for the IcoSphere, required but can be empty\r\n * * radius the radius of the IcoSphere, optional default 1\r\n * * radiusX allows stretching in the x direction, optional, default radius\r\n * * radiusY allows stretching in the y direction, optional, default radius\r\n * * radiusZ allows stretching in the z direction, optional, default radius\r\n * * flat when true creates a flat shaded mesh, optional, default true\r\n * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the IcoSphere\r\n * @deprecated use CreateIcoSphereVertexData instead\r\n */\r\n public static CreateIcoSphere(options: {\r\n radius?: number;\r\n radiusX?: number;\r\n radiusY?: number;\r\n radiusZ?: number;\r\n flat?: boolean;\r\n subdivisions?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"icoSphereBuilder\");\r\n }\r\n\r\n // inspired from // http://stemkoski.github.io/Three.js/Polyhedra.html\r\n /**\r\n * Creates the VertexData for a Polyhedron\r\n * @param options an object used to set the following optional parameters for the polyhedron, required but can be empty\r\n * * type provided types are:\r\n * * 0 : Tetrahedron, 1 : Octahedron, 2 : Dodecahedron, 3 : Icosahedron, 4 : Rhombicuboctahedron, 5 : Triangular Prism, 6 : Pentagonal Prism, 7 : Hexagonal Prism, 8 : Square Pyramid (J1)\r\n * * 9 : Pentagonal Pyramid (J2), 10 : Triangular Dipyramid (J12), 11 : Pentagonal Dipyramid (J13), 12 : Elongated Square Dipyramid (J15), 13 : Elongated Pentagonal Dipyramid (J16), 14 : Elongated Pentagonal Cupola (J20)\r\n * * size the size of the IcoSphere, optional default 1\r\n * * sizeX allows stretching in the x direction, optional, default size\r\n * * sizeY allows stretching in the y direction, optional, default size\r\n * * sizeZ allows stretching in the z direction, optional, default size\r\n * * custom a number that overwrites the type to create from an extended set of polyhedron from https://www.babylonjs-playground.com/#21QRSK#15 with minimised editor\r\n * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively\r\n * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively\r\n * * flat when true creates a flat shaded mesh, optional, default true\r\n * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the Polyhedron\r\n * @deprecated use CreatePolyhedronVertexData instead\r\n */\r\n public static CreatePolyhedron(options: {\r\n type?: number;\r\n size?: number;\r\n sizeX?: number;\r\n sizeY?: number;\r\n sizeZ?: number;\r\n custom?: any;\r\n faceUV?: Vector4[];\r\n faceColors?: Color4[];\r\n flat?: boolean;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"polyhedronBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a Capsule, inspired from https://github.com/maximeq/three-js-capsule-geometry/blob/master/src/CapsuleBufferGeometry.js\r\n * @param options an object used to set the following optional parameters for the capsule, required but can be empty\r\n * @returns the VertexData of the Capsule\r\n * @deprecated Please use CreateCapsuleVertexData from the capsuleBuilder file instead\r\n */\r\n public static CreateCapsule(\r\n options: ICreateCapsuleOptions = {\r\n orientation: Vector3.Up(),\r\n subdivisions: 2,\r\n tessellation: 16,\r\n height: 1,\r\n radius: 0.25,\r\n capSubdivisions: 6,\r\n }\r\n ): VertexData {\r\n throw _WarnImport(\"capsuleBuilder\");\r\n }\r\n\r\n // based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3D/src/away3d/primitives/TorusKnot.as?spec=svn2473&r=2473\r\n /**\r\n * Creates the VertexData for a TorusKnot\r\n * @param options an object used to set the following optional parameters for the TorusKnot, required but can be empty\r\n * * radius the radius of the torus knot, optional, default 2\r\n * * tube the thickness of the tube, optional, default 0.5\r\n * * radialSegments the number of sides on each tube segments, optional, default 32\r\n * * tubularSegments the number of tubes to decompose the knot into, optional, default 32\r\n * * p the number of windings around the z axis, optional, default 2\r\n * * q the number of windings around the x axis, optional, default 3\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the Torus Knot\r\n * @deprecated use CreateTorusKnotVertexData instead\r\n */\r\n public static CreateTorusKnot(options: {\r\n radius?: number;\r\n tube?: number;\r\n radialSegments?: number;\r\n tubularSegments?: number;\r\n p?: number;\r\n q?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"torusKnotBuilder\");\r\n }\r\n\r\n // Tools\r\n\r\n /**\r\n * Compute normals for given positions and indices\r\n * @param positions an array of vertex positions, [...., x, y, z, ......]\r\n * @param indices an array of indices in groups of three for each triangular facet, [...., i, j, k, ......]\r\n * @param normals an array of vertex normals, [...., x, y, z, ......]\r\n * @param options an object used to set the following optional parameters for the TorusKnot, optional\r\n * * facetNormals : optional array of facet normals (vector3)\r\n * * facetPositions : optional array of facet positions (vector3)\r\n * * facetPartitioning : optional partitioning array. facetPositions is required for facetPartitioning computation\r\n * * ratio : optional partitioning ratio / bounding box, required for facetPartitioning computation\r\n * * bInfo : optional bounding info, required for facetPartitioning computation\r\n * * bbSize : optional bounding box size data, required for facetPartitioning computation\r\n * * subDiv : optional partitioning data about subdivisions on each axis (int), required for facetPartitioning computation\r\n * * useRightHandedSystem: optional boolean to for right handed system computation\r\n * * depthSort : optional boolean to enable the facet depth sort computation\r\n * * distanceTo : optional Vector3 to compute the facet depth from this location\r\n * * depthSortedFacets : optional array of depthSortedFacets to store the facet distances from the reference location\r\n */\r\n public static ComputeNormals(\r\n positions: any,\r\n indices: any,\r\n normals: any,\r\n options?: {\r\n facetNormals?: any;\r\n facetPositions?: any;\r\n facetPartitioning?: any;\r\n ratio?: number;\r\n bInfo?: any;\r\n bbSize?: Vector3;\r\n subDiv?: any;\r\n useRightHandedSystem?: boolean;\r\n depthSort?: boolean;\r\n distanceTo?: Vector3;\r\n depthSortedFacets?: any;\r\n }\r\n ): void {\r\n // temporary scalar variables\r\n let index = 0; // facet index\r\n let p1p2x = 0.0; // p1p2 vector x coordinate\r\n let p1p2y = 0.0; // p1p2 vector y coordinate\r\n let p1p2z = 0.0; // p1p2 vector z coordinate\r\n let p3p2x = 0.0; // p3p2 vector x coordinate\r\n let p3p2y = 0.0; // p3p2 vector y coordinate\r\n let p3p2z = 0.0; // p3p2 vector z coordinate\r\n let faceNormalx = 0.0; // facet normal x coordinate\r\n let faceNormaly = 0.0; // facet normal y coordinate\r\n let faceNormalz = 0.0; // facet normal z coordinate\r\n let length = 0.0; // facet normal length before normalization\r\n let v1x = 0; // vector1 x index in the positions array\r\n let v1y = 0; // vector1 y index in the positions array\r\n let v1z = 0; // vector1 z index in the positions array\r\n let v2x = 0; // vector2 x index in the positions array\r\n let v2y = 0; // vector2 y index in the positions array\r\n let v2z = 0; // vector2 z index in the positions array\r\n let v3x = 0; // vector3 x index in the positions array\r\n let v3y = 0; // vector3 y index in the positions array\r\n let v3z = 0; // vector3 z index in the positions array\r\n let computeFacetNormals = false;\r\n let computeFacetPositions = false;\r\n let computeFacetPartitioning = false;\r\n let computeDepthSort = false;\r\n let faceNormalSign = 1;\r\n let ratio = 0;\r\n let distanceTo: Nullable = null;\r\n if (options) {\r\n computeFacetNormals = options.facetNormals ? true : false;\r\n computeFacetPositions = options.facetPositions ? true : false;\r\n computeFacetPartitioning = options.facetPartitioning ? true : false;\r\n faceNormalSign = options.useRightHandedSystem === true ? -1 : 1;\r\n ratio = options.ratio || 0;\r\n computeDepthSort = options.depthSort ? true : false;\r\n distanceTo = options.distanceTo;\r\n if (computeDepthSort) {\r\n if (distanceTo === undefined) {\r\n distanceTo = Vector3.Zero();\r\n }\r\n }\r\n }\r\n\r\n // facetPartitioning reinit if needed\r\n let xSubRatio = 0;\r\n let ySubRatio = 0;\r\n let zSubRatio = 0;\r\n let subSq = 0;\r\n if (computeFacetPartitioning && options && options.bbSize) {\r\n //let bbSizeMax = options.bbSize.x > options.bbSize.y ? options.bbSize.x : options.bbSize.y;\r\n //bbSizeMax = bbSizeMax > options.bbSize.z ? bbSizeMax : options.bbSize.z;\r\n xSubRatio = (options.subDiv.X * ratio) / options.bbSize.x;\r\n ySubRatio = (options.subDiv.Y * ratio) / options.bbSize.y;\r\n zSubRatio = (options.subDiv.Z * ratio) / options.bbSize.z;\r\n subSq = options.subDiv.max * options.subDiv.max;\r\n options.facetPartitioning.length = 0;\r\n }\r\n\r\n // reset the normals\r\n for (index = 0; index < positions.length; index++) {\r\n normals[index] = 0.0;\r\n }\r\n\r\n // Loop : 1 indice triplet = 1 facet\r\n const nbFaces = (indices.length / 3) | 0;\r\n for (index = 0; index < nbFaces; index++) {\r\n // get the indexes of the coordinates of each vertex of the facet\r\n v1x = indices[index * 3] * 3;\r\n v1y = v1x + 1;\r\n v1z = v1x + 2;\r\n v2x = indices[index * 3 + 1] * 3;\r\n v2y = v2x + 1;\r\n v2z = v2x + 2;\r\n v3x = indices[index * 3 + 2] * 3;\r\n v3y = v3x + 1;\r\n v3z = v3x + 2;\r\n\r\n p1p2x = positions[v1x] - positions[v2x]; // compute two vectors per facet : p1p2 and p3p2\r\n p1p2y = positions[v1y] - positions[v2y];\r\n p1p2z = positions[v1z] - positions[v2z];\r\n\r\n p3p2x = positions[v3x] - positions[v2x];\r\n p3p2y = positions[v3y] - positions[v2y];\r\n p3p2z = positions[v3z] - positions[v2z];\r\n\r\n // compute the face normal with the cross product\r\n faceNormalx = faceNormalSign * (p1p2y * p3p2z - p1p2z * p3p2y);\r\n faceNormaly = faceNormalSign * (p1p2z * p3p2x - p1p2x * p3p2z);\r\n faceNormalz = faceNormalSign * (p1p2x * p3p2y - p1p2y * p3p2x);\r\n // normalize this normal and store it in the array facetData\r\n length = Math.sqrt(faceNormalx * faceNormalx + faceNormaly * faceNormaly + faceNormalz * faceNormalz);\r\n length = length === 0 ? 1.0 : length;\r\n faceNormalx /= length;\r\n faceNormaly /= length;\r\n faceNormalz /= length;\r\n\r\n if (computeFacetNormals && options) {\r\n options.facetNormals[index].x = faceNormalx;\r\n options.facetNormals[index].y = faceNormaly;\r\n options.facetNormals[index].z = faceNormalz;\r\n }\r\n\r\n if (computeFacetPositions && options) {\r\n // compute and the facet barycenter coordinates in the array facetPositions\r\n options.facetPositions[index].x = (positions[v1x] + positions[v2x] + positions[v3x]) / 3.0;\r\n options.facetPositions[index].y = (positions[v1y] + positions[v2y] + positions[v3y]) / 3.0;\r\n options.facetPositions[index].z = (positions[v1z] + positions[v2z] + positions[v3z]) / 3.0;\r\n }\r\n\r\n if (computeFacetPartitioning && options) {\r\n // store the facet indexes in arrays in the main facetPartitioning array :\r\n // compute each facet vertex (+ facet barycenter) index in the partiniong array\r\n const ox = Math.floor((options.facetPositions[index].x - options.bInfo.minimum.x * ratio) * xSubRatio);\r\n const oy = Math.floor((options.facetPositions[index].y - options.bInfo.minimum.y * ratio) * ySubRatio);\r\n const oz = Math.floor((options.facetPositions[index].z - options.bInfo.minimum.z * ratio) * zSubRatio);\r\n const b1x = Math.floor((positions[v1x] - options.bInfo.minimum.x * ratio) * xSubRatio);\r\n const b1y = Math.floor((positions[v1y] - options.bInfo.minimum.y * ratio) * ySubRatio);\r\n const b1z = Math.floor((positions[v1z] - options.bInfo.minimum.z * ratio) * zSubRatio);\r\n const b2x = Math.floor((positions[v2x] - options.bInfo.minimum.x * ratio) * xSubRatio);\r\n const b2y = Math.floor((positions[v2y] - options.bInfo.minimum.y * ratio) * ySubRatio);\r\n const b2z = Math.floor((positions[v2z] - options.bInfo.minimum.z * ratio) * zSubRatio);\r\n const b3x = Math.floor((positions[v3x] - options.bInfo.minimum.x * ratio) * xSubRatio);\r\n const b3y = Math.floor((positions[v3y] - options.bInfo.minimum.y * ratio) * ySubRatio);\r\n const b3z = Math.floor((positions[v3z] - options.bInfo.minimum.z * ratio) * zSubRatio);\r\n\r\n const block_idx_v1 = b1x + options.subDiv.max * b1y + subSq * b1z;\r\n const block_idx_v2 = b2x + options.subDiv.max * b2y + subSq * b2z;\r\n const block_idx_v3 = b3x + options.subDiv.max * b3y + subSq * b3z;\r\n const block_idx_o = ox + options.subDiv.max * oy + subSq * oz;\r\n\r\n options.facetPartitioning[block_idx_o] = options.facetPartitioning[block_idx_o] ? options.facetPartitioning[block_idx_o] : new Array();\r\n options.facetPartitioning[block_idx_v1] = options.facetPartitioning[block_idx_v1] ? options.facetPartitioning[block_idx_v1] : new Array();\r\n options.facetPartitioning[block_idx_v2] = options.facetPartitioning[block_idx_v2] ? options.facetPartitioning[block_idx_v2] : new Array();\r\n options.facetPartitioning[block_idx_v3] = options.facetPartitioning[block_idx_v3] ? options.facetPartitioning[block_idx_v3] : new Array();\r\n\r\n // push each facet index in each block containing the vertex\r\n options.facetPartitioning[block_idx_v1].push(index);\r\n if (block_idx_v2 != block_idx_v1) {\r\n options.facetPartitioning[block_idx_v2].push(index);\r\n }\r\n if (!(block_idx_v3 == block_idx_v2 || block_idx_v3 == block_idx_v1)) {\r\n options.facetPartitioning[block_idx_v3].push(index);\r\n }\r\n if (!(block_idx_o == block_idx_v1 || block_idx_o == block_idx_v2 || block_idx_o == block_idx_v3)) {\r\n options.facetPartitioning[block_idx_o].push(index);\r\n }\r\n }\r\n\r\n if (computeDepthSort && options && options.facetPositions) {\r\n const dsf = options.depthSortedFacets[index];\r\n dsf.ind = index * 3;\r\n dsf.sqDistance = Vector3.DistanceSquared(options.facetPositions[index], distanceTo!);\r\n }\r\n\r\n // compute the normals anyway\r\n normals[v1x] += faceNormalx; // accumulate all the normals per face\r\n normals[v1y] += faceNormaly;\r\n normals[v1z] += faceNormalz;\r\n normals[v2x] += faceNormalx;\r\n normals[v2y] += faceNormaly;\r\n normals[v2z] += faceNormalz;\r\n normals[v3x] += faceNormalx;\r\n normals[v3y] += faceNormaly;\r\n normals[v3z] += faceNormalz;\r\n }\r\n // last normalization of each normal\r\n for (index = 0; index < normals.length / 3; index++) {\r\n faceNormalx = normals[index * 3];\r\n faceNormaly = normals[index * 3 + 1];\r\n faceNormalz = normals[index * 3 + 2];\r\n\r\n length = Math.sqrt(faceNormalx * faceNormalx + faceNormaly * faceNormaly + faceNormalz * faceNormalz);\r\n length = length === 0 ? 1.0 : length;\r\n faceNormalx /= length;\r\n faceNormaly /= length;\r\n faceNormalz /= length;\r\n\r\n normals[index * 3] = faceNormalx;\r\n normals[index * 3 + 1] = faceNormaly;\r\n normals[index * 3 + 2] = faceNormalz;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _ComputeSides(\r\n sideOrientation: number,\r\n positions: FloatArray,\r\n indices: FloatArray | IndicesArray,\r\n normals: FloatArray,\r\n uvs: FloatArray,\r\n frontUVs?: Vector4,\r\n backUVs?: Vector4\r\n ) {\r\n const li: number = indices.length;\r\n const ln: number = normals.length;\r\n let i: number;\r\n let n: number;\r\n sideOrientation = sideOrientation || VertexData.DEFAULTSIDE;\r\n\r\n switch (sideOrientation) {\r\n case VertexData.FRONTSIDE:\r\n // nothing changed\r\n break;\r\n\r\n case VertexData.BACKSIDE:\r\n // indices\r\n for (i = 0; i < li; i += 3) {\r\n const tmp = indices[i];\r\n indices[i] = indices[i + 2];\r\n indices[i + 2] = tmp;\r\n }\r\n // normals\r\n for (n = 0; n < ln; n++) {\r\n normals[n] = -normals[n];\r\n }\r\n break;\r\n\r\n case VertexData.DOUBLESIDE: {\r\n // positions\r\n const lp: number = positions.length;\r\n const l: number = lp / 3;\r\n for (let p = 0; p < lp; p++) {\r\n positions[lp + p] = positions[p];\r\n }\r\n // indices\r\n for (i = 0; i < li; i += 3) {\r\n indices[i + li] = indices[i + 2] + l;\r\n indices[i + 1 + li] = indices[i + 1] + l;\r\n indices[i + 2 + li] = indices[i] + l;\r\n }\r\n // normals\r\n for (n = 0; n < ln; n++) {\r\n normals[ln + n] = -normals[n];\r\n }\r\n\r\n // uvs\r\n const lu: number = uvs.length;\r\n let u: number = 0;\r\n for (u = 0; u < lu; u++) {\r\n uvs[u + lu] = uvs[u];\r\n }\r\n frontUVs = frontUVs ? frontUVs : new Vector4(0.0, 0.0, 1.0, 1.0);\r\n backUVs = backUVs ? backUVs : new Vector4(0.0, 0.0, 1.0, 1.0);\r\n u = 0;\r\n for (i = 0; i < lu / 2; i++) {\r\n uvs[u] = frontUVs.x + (frontUVs.z - frontUVs.x) * uvs[u];\r\n uvs[u + 1] = frontUVs.y + (frontUVs.w - frontUVs.y) * uvs[u + 1];\r\n uvs[u + lu] = backUVs.x + (backUVs.z - backUVs.x) * uvs[u + lu];\r\n uvs[u + lu + 1] = backUVs.y + (backUVs.w - backUVs.y) * uvs[u + lu + 1];\r\n u += 2;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a VertexData from serialized data\r\n * @param parsedVertexData the parsed data from an imported file\r\n * @returns a VertexData\r\n */\r\n public static Parse(parsedVertexData: any) {\r\n const vertexData = new VertexData();\r\n\r\n // positions\r\n const positions = parsedVertexData.positions;\r\n if (positions) {\r\n vertexData.set(positions, VertexBuffer.PositionKind);\r\n }\r\n\r\n // normals\r\n const normals = parsedVertexData.normals;\r\n if (normals) {\r\n vertexData.set(normals, VertexBuffer.NormalKind);\r\n }\r\n\r\n // tangents\r\n const tangents = parsedVertexData.tangents;\r\n if (tangents) {\r\n vertexData.set(tangents, VertexBuffer.TangentKind);\r\n }\r\n\r\n // uvs\r\n const uvs = parsedVertexData.uvs;\r\n if (uvs) {\r\n vertexData.set(uvs, VertexBuffer.UVKind);\r\n }\r\n\r\n // uv2s\r\n const uvs2 = parsedVertexData.uvs2;\r\n if (uvs2) {\r\n vertexData.set(uvs2, VertexBuffer.UV2Kind);\r\n }\r\n\r\n // uv3s\r\n const uvs3 = parsedVertexData.uvs3;\r\n if (uvs3) {\r\n vertexData.set(uvs3, VertexBuffer.UV3Kind);\r\n }\r\n\r\n // uv4s\r\n const uvs4 = parsedVertexData.uvs4;\r\n if (uvs4) {\r\n vertexData.set(uvs4, VertexBuffer.UV4Kind);\r\n }\r\n\r\n // uv5s\r\n const uvs5 = parsedVertexData.uvs5;\r\n if (uvs5) {\r\n vertexData.set(uvs5, VertexBuffer.UV5Kind);\r\n }\r\n\r\n // uv6s\r\n const uvs6 = parsedVertexData.uvs6;\r\n if (uvs6) {\r\n vertexData.set(uvs6, VertexBuffer.UV6Kind);\r\n }\r\n\r\n // colors\r\n const colors = parsedVertexData.colors;\r\n if (colors) {\r\n vertexData.set(Color4.CheckColors4(colors, positions.length / 3), VertexBuffer.ColorKind);\r\n if (parsedVertexData.hasVertexAlpha !== undefined) {\r\n vertexData.hasVertexAlpha = parsedVertexData.hasVertexAlpha;\r\n }\r\n }\r\n\r\n // matricesIndices\r\n const matricesIndices = parsedVertexData.matricesIndices;\r\n if (matricesIndices) {\r\n vertexData.set(matricesIndices, VertexBuffer.MatricesIndicesKind);\r\n }\r\n\r\n // matricesWeights\r\n const matricesWeights = parsedVertexData.matricesWeights;\r\n if (matricesWeights) {\r\n vertexData.set(matricesWeights, VertexBuffer.MatricesWeightsKind);\r\n }\r\n\r\n // indices\r\n const indices = parsedVertexData.indices;\r\n if (indices) {\r\n vertexData.indices = indices;\r\n }\r\n\r\n // MaterialInfos\r\n const materialInfos = parsedVertexData.materialInfos;\r\n if (materialInfos) {\r\n vertexData.materialInfos = [];\r\n for (const materialInfoFromJSON of materialInfos) {\r\n const materialInfo = new VertexDataMaterialInfo();\r\n materialInfo.indexCount = materialInfoFromJSON.indexCount;\r\n materialInfo.indexStart = materialInfoFromJSON.indexStart;\r\n materialInfo.verticesCount = materialInfoFromJSON.verticesCount;\r\n materialInfo.verticesStart = materialInfoFromJSON.verticesStart;\r\n materialInfo.materialIndex = materialInfoFromJSON.materialIndex;\r\n vertexData.materialInfos.push(materialInfo);\r\n }\r\n }\r\n\r\n return vertexData;\r\n }\r\n\r\n /**\r\n * Applies VertexData created from the imported parameters to the geometry\r\n * @param parsedVertexData the parsed data from an imported file\r\n * @param geometry the geometry to apply the VertexData to\r\n */\r\n public static ImportVertexData(parsedVertexData: any, geometry: Geometry) {\r\n const vertexData = VertexData.Parse(parsedVertexData);\r\n\r\n geometry.setAllVerticesData(vertexData, parsedVertexData.updatable);\r\n }\r\n}\r\n", "import { Constants } from \"../Engines/constants\";\r\n\r\n/**\r\n * Class used to represent data loading progression\r\n */\r\nexport class SceneLoaderFlags {\r\n // Flags\r\n private static _ForceFullSceneLoadingForIncremental = false;\r\n private static _ShowLoadingScreen = true;\r\n private static _CleanBoneMatrixWeights = false;\r\n private static _LoggingLevel = Constants.SCENELOADER_NO_LOGGING;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if entire scene must be loaded even if scene contains incremental data\r\n */\r\n public static get ForceFullSceneLoadingForIncremental() {\r\n return SceneLoaderFlags._ForceFullSceneLoadingForIncremental;\r\n }\r\n\r\n public static set ForceFullSceneLoadingForIncremental(value: boolean) {\r\n SceneLoaderFlags._ForceFullSceneLoadingForIncremental = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if loading screen must be displayed while loading a scene\r\n */\r\n public static get ShowLoadingScreen(): boolean {\r\n return SceneLoaderFlags._ShowLoadingScreen;\r\n }\r\n\r\n public static set ShowLoadingScreen(value: boolean) {\r\n SceneLoaderFlags._ShowLoadingScreen = value;\r\n }\r\n\r\n /**\r\n * Defines the current logging level (while loading the scene)\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static get loggingLevel(): number {\r\n return SceneLoaderFlags._LoggingLevel;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static set loggingLevel(value: number) {\r\n SceneLoaderFlags._LoggingLevel = value;\r\n }\r\n\r\n /**\r\n * Gets or set a boolean indicating if matrix weights must be cleaned upon loading\r\n */\r\n public static get CleanBoneMatrixWeights(): boolean {\r\n return SceneLoaderFlags._CleanBoneMatrixWeights;\r\n }\r\n\r\n public static set CleanBoneMatrixWeights(value: boolean) {\r\n SceneLoaderFlags._CleanBoneMatrixWeights = value;\r\n }\r\n}\r\n", "/**\r\n * Options used to control default behaviors regarding compatibility support\r\n */\r\nexport class CompatibilityOptions {\r\n /**\r\n * Defines if the system should use OpenGL convention for UVs when creating geometry or loading .babylon files (false by default)\r\n */\r\n public static UseOpenGLOrientationForUV = false;\r\n}\r\n", "import type { Nullable, FloatArray, DataArray, IndicesArray } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Vector2 } from \"../Maths/math.vector\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { IGetSetVerticesData } from \"../Meshes/mesh.vertexData\";\r\nimport { VertexData } from \"../Meshes/mesh.vertexData\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { SceneLoaderFlags } from \"../Loading/sceneLoaderFlags\";\r\nimport { BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport { Tags } from \"../Misc/tags\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { extractMinAndMax } from \"../Maths/math.functions\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { CompatibilityOptions } from \"../Compat/compatibilityOptions\";\r\n\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { Buffer } from \"../Buffers/buffer\";\r\n\r\n/**\r\n * Class used to store geometry data (vertex buffers + index buffer)\r\n */\r\nexport class Geometry implements IGetSetVerticesData {\r\n // Members\r\n /**\r\n * Gets or sets the ID of the geometry\r\n */\r\n public id: string;\r\n /**\r\n * Gets or sets the unique ID of the geometry\r\n */\r\n public uniqueId: number;\r\n /**\r\n * Gets the delay loading state of the geometry (none by default which means not delayed)\r\n */\r\n public delayLoadState = Constants.DELAYLOADSTATE_NONE;\r\n /**\r\n * Gets the file containing the data to load when running in delay load state\r\n */\r\n public delayLoadingFile: Nullable;\r\n /**\r\n * Callback called when the geometry is updated\r\n */\r\n public onGeometryUpdated: (geometry: Geometry, kind?: string) => void;\r\n\r\n // Private\r\n private _scene: Scene;\r\n private _engine: Engine;\r\n private _meshes: Mesh[];\r\n private _totalVertices = 0;\r\n private _totalIndices?: number;\r\n /** @internal */\r\n public _loadedUniqueId: string;\r\n /** @internal */\r\n public _indices: IndicesArray;\r\n /** @internal */\r\n public _vertexBuffers: { [key: string]: VertexBuffer };\r\n private _isDisposed = false;\r\n private _extend: { minimum: Vector3; maximum: Vector3 };\r\n private _boundingBias: Vector2;\r\n /** @internal */\r\n public _delayInfo: Array;\r\n private _indexBuffer: Nullable;\r\n private _indexBufferIsUpdatable = false;\r\n /** @internal */\r\n public _boundingInfo: Nullable;\r\n /** @internal */\r\n public _delayLoadingFunction: Nullable<(any: any, geometry: Geometry) => void>;\r\n /** @internal */\r\n public _softwareSkinningFrameId: number;\r\n private _vertexArrayObjects: { [key: string]: WebGLVertexArrayObject };\r\n private _updatable: boolean;\r\n\r\n // Cache\r\n /** @internal */\r\n public _positions: Nullable;\r\n private _positionsCache: Vector3[] = [];\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable = null;\r\n\r\n /**\r\n * Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y\r\n */\r\n public get boundingBias(): Vector2 {\r\n return this._boundingBias;\r\n }\r\n\r\n /**\r\n * Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y\r\n */\r\n public set boundingBias(value: Vector2) {\r\n if (this._boundingBias) {\r\n this._boundingBias.copyFrom(value);\r\n } else {\r\n this._boundingBias = value.clone();\r\n }\r\n\r\n this._updateBoundingInfo(true, null);\r\n }\r\n\r\n /**\r\n * Static function used to attach a new empty geometry to a mesh\r\n * @param mesh defines the mesh to attach the geometry to\r\n * @returns the new Geometry\r\n */\r\n public static CreateGeometryForMesh(mesh: Mesh): Geometry {\r\n const geometry = new Geometry(Geometry.RandomId(), mesh.getScene());\r\n\r\n geometry.applyToMesh(mesh);\r\n\r\n return geometry;\r\n }\r\n\r\n /** Get the list of meshes using this geometry */\r\n public get meshes(): Mesh[] {\r\n return this._meshes;\r\n }\r\n\r\n /**\r\n * If set to true (false by default), the bounding info applied to the meshes sharing this geometry will be the bounding info defined at the class level\r\n * and won't be computed based on the vertex positions (which is what we get when useBoundingInfoFromGeometry = false)\r\n */\r\n public useBoundingInfoFromGeometry = false;\r\n\r\n /**\r\n * Creates a new geometry\r\n * @param id defines the unique ID\r\n * @param scene defines the hosting scene\r\n * @param vertexData defines the VertexData used to get geometry data\r\n * @param updatable defines if geometry must be updatable (false by default)\r\n * @param mesh defines the mesh that will be associated with the geometry\r\n */\r\n constructor(id: string, scene?: Scene, vertexData?: VertexData, updatable: boolean = false, mesh: Nullable = null) {\r\n this._scene = scene || EngineStore.LastCreatedScene;\r\n if (!this._scene) {\r\n return;\r\n }\r\n this.id = id;\r\n this.uniqueId = this._scene.getUniqueId();\r\n this._engine = this._scene.getEngine();\r\n this._meshes = [];\r\n //Init vertex buffer cache\r\n this._vertexBuffers = {};\r\n this._indices = [];\r\n this._updatable = updatable;\r\n\r\n // vertexData\r\n if (vertexData) {\r\n this.setAllVerticesData(vertexData, updatable);\r\n } else {\r\n this._totalVertices = 0;\r\n }\r\n\r\n if (this._engine.getCaps().vertexArrayObject) {\r\n this._vertexArrayObjects = {};\r\n }\r\n\r\n // applyToMesh\r\n if (mesh) {\r\n this.applyToMesh(mesh);\r\n mesh.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current extend of the geometry\r\n */\r\n public get extend(): { minimum: Vector3; maximum: Vector3 } {\r\n return this._extend;\r\n }\r\n\r\n /**\r\n * Gets the hosting scene\r\n * @returns the hosting Scene\r\n */\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Gets the hosting engine\r\n * @returns the hosting Engine\r\n */\r\n public getEngine(): Engine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * Defines if the geometry is ready to use\r\n * @returns true if the geometry is ready to be used\r\n */\r\n public isReady(): boolean {\r\n return this.delayLoadState === Constants.DELAYLOADSTATE_LOADED || this.delayLoadState === Constants.DELAYLOADSTATE_NONE;\r\n }\r\n\r\n /**\r\n * Gets a value indicating that the geometry should not be serialized\r\n */\r\n public get doNotSerialize(): boolean {\r\n for (let index = 0; index < this._meshes.length; index++) {\r\n if (!this._meshes[index].doNotSerialize) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this._vertexArrayObjects) {\r\n this._vertexArrayObjects = {};\r\n }\r\n\r\n // Index buffer\r\n if (this._meshes.length !== 0 && this._indices) {\r\n this._indexBuffer = this._engine.createIndexBuffer(this._indices, this._updatable, \"Geometry_\" + this.id + \"_IndexBuffer\");\r\n }\r\n\r\n // Vertex buffers\r\n const buffers = new Set();\r\n for (const key in this._vertexBuffers) {\r\n buffers.add(this._vertexBuffers[key].getWrapperBuffer());\r\n }\r\n\r\n buffers.forEach((buffer) => {\r\n buffer._rebuild();\r\n });\r\n }\r\n\r\n /**\r\n * Affects all geometry data in one call\r\n * @param vertexData defines the geometry data\r\n * @param updatable defines if the geometry must be flagged as updatable (false as default)\r\n */\r\n public setAllVerticesData(vertexData: VertexData, updatable?: boolean): void {\r\n vertexData.applyToGeometry(this, updatable);\r\n this._notifyUpdate();\r\n }\r\n\r\n /**\r\n * Set specific vertex data\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @param data defines the vertex data to use\r\n * @param updatable defines if the vertex must be flagged as updatable (false as default)\r\n * @param stride defines the stride to use (0 by default). This value is deduced from the kind value if not specified\r\n */\r\n public setVerticesData(kind: string, data: FloatArray, updatable: boolean = false, stride?: number): void {\r\n if (updatable && Array.isArray(data)) {\r\n // to avoid converting to Float32Array at each draw call in engine.updateDynamicVertexBuffer, we make the conversion a single time here\r\n data = new Float32Array(data);\r\n }\r\n const buffer = new VertexBuffer(this._engine, data, kind, {\r\n updatable,\r\n postponeInternalCreation: this._meshes.length === 0,\r\n stride,\r\n label: \"Geometry_\" + this.id + \"_\" + kind,\r\n });\r\n this.setVerticesBuffer(buffer);\r\n }\r\n\r\n /**\r\n * Removes a specific vertex data\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n */\r\n public removeVerticesData(kind: string) {\r\n if (this._vertexBuffers[kind]) {\r\n this._vertexBuffers[kind].dispose();\r\n delete this._vertexBuffers[kind];\r\n }\r\n\r\n if (this._vertexArrayObjects) {\r\n this._disposeVertexArrayObjects();\r\n }\r\n }\r\n\r\n /**\r\n * Affect a vertex buffer to the geometry. the vertexBuffer.getKind() function is used to determine where to store the data\r\n * @param buffer defines the vertex buffer to use\r\n * @param totalVertices defines the total number of vertices for position kind (could be null)\r\n * @param disposeExistingBuffer disposes the existing buffer, if any (default: true)\r\n */\r\n public setVerticesBuffer(buffer: VertexBuffer, totalVertices: Nullable = null, disposeExistingBuffer = true): void {\r\n const kind = buffer.getKind();\r\n if (this._vertexBuffers[kind] && disposeExistingBuffer) {\r\n this._vertexBuffers[kind].dispose();\r\n }\r\n\r\n if (buffer._buffer) {\r\n buffer._buffer._increaseReferences();\r\n }\r\n\r\n this._vertexBuffers[kind] = buffer;\r\n const meshes = this._meshes;\r\n const numOfMeshes = meshes.length;\r\n\r\n if (kind === VertexBuffer.PositionKind) {\r\n this._totalVertices = totalVertices ?? buffer._maxVerticesCount;\r\n\r\n this._updateExtend(buffer.getFloatData(this._totalVertices));\r\n this._resetPointsArrayCache();\r\n\r\n // this._extend can be empty if buffer.getFloatData(this._totalVertices) returned null\r\n const minimum = (this._extend && this._extend.minimum) || new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n const maximum = (this._extend && this._extend.maximum) || new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n\r\n for (let index = 0; index < numOfMeshes; index++) {\r\n const mesh = meshes[index];\r\n mesh.buildBoundingInfo(minimum, maximum);\r\n mesh._createGlobalSubMesh(mesh.isUnIndexed);\r\n mesh.computeWorldMatrix(true);\r\n mesh.synchronizeInstances();\r\n }\r\n }\r\n\r\n this._notifyUpdate(kind);\r\n }\r\n\r\n /**\r\n * Update a specific vertex buffer\r\n * This function will directly update the underlying DataBuffer according to the passed numeric array or Float32Array\r\n * It will do nothing if the buffer is not updatable\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @param data defines the data to use\r\n * @param offset defines the offset in the target buffer where to store the data\r\n * @param useBytes set to true if the offset is in bytes\r\n */\r\n public updateVerticesDataDirectly(kind: string, data: DataArray, offset: number, useBytes: boolean = false): void {\r\n const vertexBuffer = this.getVertexBuffer(kind);\r\n\r\n if (!vertexBuffer) {\r\n return;\r\n }\r\n\r\n vertexBuffer.updateDirectly(data, offset, useBytes);\r\n this._notifyUpdate(kind);\r\n }\r\n\r\n /**\r\n * Update a specific vertex buffer\r\n * This function will create a new buffer if the current one is not updatable\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @param data defines the data to use\r\n * @param updateExtends defines if the geometry extends must be recomputed (false by default)\r\n */\r\n public updateVerticesData(kind: string, data: FloatArray, updateExtends: boolean = false): void {\r\n const vertexBuffer = this.getVertexBuffer(kind);\r\n\r\n if (!vertexBuffer) {\r\n return;\r\n }\r\n\r\n vertexBuffer.update(data);\r\n\r\n if (kind === VertexBuffer.PositionKind) {\r\n this._updateBoundingInfo(updateExtends, data);\r\n }\r\n this._notifyUpdate(kind);\r\n }\r\n\r\n private _updateBoundingInfo(updateExtends: boolean, data: Nullable) {\r\n if (updateExtends) {\r\n this._updateExtend(data);\r\n }\r\n\r\n this._resetPointsArrayCache();\r\n\r\n if (updateExtends) {\r\n const meshes = this._meshes;\r\n for (const mesh of meshes) {\r\n if (mesh.hasBoundingInfo) {\r\n mesh.getBoundingInfo().reConstruct(this._extend.minimum, this._extend.maximum);\r\n } else {\r\n mesh.buildBoundingInfo(this._extend.minimum, this._extend.maximum);\r\n }\r\n\r\n const subMeshes = mesh.subMeshes;\r\n for (const subMesh of subMeshes) {\r\n subMesh.refreshBoundingInfo();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bind(\r\n effect: Nullable,\r\n indexToBind?: Nullable,\r\n overrideVertexBuffers?: { [kind: string]: Nullable },\r\n overrideVertexArrayObjects?: { [key: string]: WebGLVertexArrayObject }\r\n ): void {\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n if (indexToBind === undefined) {\r\n indexToBind = this._indexBuffer;\r\n }\r\n const vbs = this.getVertexBuffers();\r\n\r\n if (!vbs) {\r\n return;\r\n }\r\n\r\n if (indexToBind != this._indexBuffer || (!this._vertexArrayObjects && !overrideVertexArrayObjects)) {\r\n this._engine.bindBuffers(vbs, indexToBind, effect, overrideVertexBuffers);\r\n return;\r\n }\r\n\r\n const vaos = overrideVertexArrayObjects ? overrideVertexArrayObjects : this._vertexArrayObjects;\r\n\r\n // Using VAO\r\n if (!vaos[effect.key]) {\r\n vaos[effect.key] = this._engine.recordVertexArrayObject(vbs, indexToBind, effect, overrideVertexBuffers);\r\n }\r\n\r\n this._engine.bindVertexArrayObject(vaos[effect.key], indexToBind);\r\n }\r\n\r\n /**\r\n * Gets total number of vertices\r\n * @returns the total number of vertices\r\n */\r\n public getTotalVertices(): number {\r\n if (!this.isReady()) {\r\n return 0;\r\n }\r\n\r\n return this._totalVertices;\r\n }\r\n\r\n /**\r\n * Gets a specific vertex data attached to this geometry. Float data is constructed if the vertex buffer data cannot be returned directly.\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns a float array containing vertex data\r\n */\r\n public getVerticesData(kind: string, copyWhenShared?: boolean, forceCopy?: boolean): Nullable {\r\n const vertexBuffer = this.getVertexBuffer(kind);\r\n if (!vertexBuffer) {\r\n return null;\r\n }\r\n\r\n return vertexBuffer.getFloatData(this._totalVertices, forceCopy || (copyWhenShared && this._meshes.length !== 1));\r\n }\r\n\r\n /**\r\n * Returns a boolean defining if the vertex data for the requested `kind` is updatable\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @returns true if the vertex buffer with the specified kind is updatable\r\n */\r\n public isVertexBufferUpdatable(kind: string): boolean {\r\n const vb = this._vertexBuffers[kind];\r\n\r\n if (!vb) {\r\n return false;\r\n }\r\n\r\n return vb.isUpdatable();\r\n }\r\n\r\n /**\r\n * Gets a specific vertex buffer\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @returns a VertexBuffer\r\n */\r\n public getVertexBuffer(kind: string): Nullable {\r\n if (!this.isReady()) {\r\n return null;\r\n }\r\n return this._vertexBuffers[kind];\r\n }\r\n\r\n /**\r\n * Returns all vertex buffers\r\n * @returns an object holding all vertex buffers indexed by kind\r\n */\r\n public getVertexBuffers(): Nullable<{ [key: string]: VertexBuffer }> {\r\n if (!this.isReady()) {\r\n return null;\r\n }\r\n return this._vertexBuffers;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if specific vertex buffer is present\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @returns true if data is present\r\n */\r\n public isVerticesDataPresent(kind: string): boolean {\r\n if (!this._vertexBuffers) {\r\n if (this._delayInfo) {\r\n return this._delayInfo.indexOf(kind) !== -1;\r\n }\r\n return false;\r\n }\r\n return this._vertexBuffers[kind] !== undefined;\r\n }\r\n\r\n /**\r\n * Gets a list of all attached data kinds (Position, normal, etc...)\r\n * @returns a list of string containing all kinds\r\n */\r\n public getVerticesDataKinds(): string[] {\r\n const result = [];\r\n let kind;\r\n if (!this._vertexBuffers && this._delayInfo) {\r\n for (kind in this._delayInfo) {\r\n result.push(kind);\r\n }\r\n } else {\r\n for (kind in this._vertexBuffers) {\r\n result.push(kind);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Update index buffer\r\n * @param indices defines the indices to store in the index buffer\r\n * @param offset defines the offset in the target buffer where to store the data\r\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\r\n */\r\n public updateIndices(indices: IndicesArray, offset?: number, gpuMemoryOnly = false): void {\r\n if (!this._indexBuffer) {\r\n return;\r\n }\r\n\r\n if (!this._indexBufferIsUpdatable) {\r\n this.setIndices(indices, null, true);\r\n } else {\r\n const needToUpdateSubMeshes = indices.length !== this._indices.length;\r\n\r\n if (!gpuMemoryOnly) {\r\n this._indices = indices.slice();\r\n }\r\n this._engine.updateDynamicIndexBuffer(this._indexBuffer, indices, offset);\r\n if (needToUpdateSubMeshes) {\r\n for (const mesh of this._meshes) {\r\n mesh._createGlobalSubMesh(true);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the index buffer for this geometry.\r\n * @param indexBuffer Defines the index buffer to use for this geometry\r\n * @param totalVertices Defines the total number of vertices used by the buffer\r\n * @param totalIndices Defines the total number of indices in the index buffer\r\n */\r\n public setIndexBuffer(indexBuffer: DataBuffer, totalVertices: number, totalIndices: number): void {\r\n this._indices = [];\r\n this._indexBufferIsUpdatable = false;\r\n this._indexBuffer = indexBuffer;\r\n this._totalVertices = totalVertices;\r\n this._totalIndices = totalIndices;\r\n\r\n indexBuffer.is32Bits ||= this._totalIndices > 65535;\r\n\r\n for (const mesh of this._meshes) {\r\n mesh._createGlobalSubMesh(true);\r\n mesh.synchronizeInstances();\r\n }\r\n\r\n this._notifyUpdate();\r\n }\r\n\r\n /**\r\n * Creates a new index buffer\r\n * @param indices defines the indices to store in the index buffer\r\n * @param totalVertices defines the total number of vertices (could be null)\r\n * @param updatable defines if the index buffer must be flagged as updatable (false by default)\r\n */\r\n public setIndices(indices: IndicesArray, totalVertices: Nullable = null, updatable: boolean = false): void {\r\n if (this._indexBuffer) {\r\n this._engine._releaseBuffer(this._indexBuffer);\r\n }\r\n\r\n this._indices = indices;\r\n this._indexBufferIsUpdatable = updatable;\r\n if (this._meshes.length !== 0 && this._indices) {\r\n this._indexBuffer = this._engine.createIndexBuffer(this._indices, updatable, \"Geometry_\" + this.id + \"_IndexBuffer\");\r\n }\r\n\r\n if (totalVertices != undefined) {\r\n // including null and undefined\r\n this._totalVertices = totalVertices;\r\n }\r\n\r\n for (const mesh of this._meshes) {\r\n mesh._createGlobalSubMesh(true);\r\n mesh.synchronizeInstances();\r\n }\r\n\r\n this._notifyUpdate();\r\n }\r\n\r\n /**\r\n * Return the total number of indices\r\n * @returns the total number of indices\r\n */\r\n public getTotalIndices(): number {\r\n if (!this.isReady()) {\r\n return 0;\r\n }\r\n return this._totalIndices !== undefined ? this._totalIndices : this._indices.length;\r\n }\r\n\r\n /**\r\n * Gets the index buffer array\r\n * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns the index buffer array\r\n */\r\n public getIndices(copyWhenShared?: boolean, forceCopy?: boolean): Nullable {\r\n if (!this.isReady()) {\r\n return null;\r\n }\r\n const orig = this._indices;\r\n if (!forceCopy && (!copyWhenShared || this._meshes.length === 1)) {\r\n return orig;\r\n } else {\r\n return orig.slice();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the index buffer\r\n * @returns the index buffer\r\n */\r\n public getIndexBuffer(): Nullable {\r\n if (!this.isReady()) {\r\n return null;\r\n }\r\n return this._indexBuffer;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseVertexArrayObject(effect: Nullable = null) {\r\n if (!effect || !this._vertexArrayObjects) {\r\n return;\r\n }\r\n\r\n if (this._vertexArrayObjects[effect.key]) {\r\n this._engine.releaseVertexArrayObject(this._vertexArrayObjects[effect.key]);\r\n delete this._vertexArrayObjects[effect.key];\r\n }\r\n }\r\n\r\n /**\r\n * Release the associated resources for a specific mesh\r\n * @param mesh defines the source mesh\r\n * @param shouldDispose defines if the geometry must be disposed if there is no more mesh pointing to it\r\n */\r\n public releaseForMesh(mesh: Mesh, shouldDispose?: boolean): void {\r\n const meshes = this._meshes;\r\n const index = meshes.indexOf(mesh);\r\n\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n meshes.splice(index, 1);\r\n\r\n if (this._vertexArrayObjects) {\r\n mesh._invalidateInstanceVertexArrayObject();\r\n }\r\n\r\n mesh._geometry = null;\r\n\r\n if (meshes.length === 0 && shouldDispose) {\r\n this.dispose();\r\n }\r\n }\r\n\r\n /**\r\n * Apply current geometry to a given mesh\r\n * @param mesh defines the mesh to apply geometry to\r\n */\r\n public applyToMesh(mesh: Mesh): void {\r\n if (mesh._geometry === this) {\r\n return;\r\n }\r\n\r\n const previousGeometry = mesh._geometry;\r\n if (previousGeometry) {\r\n previousGeometry.releaseForMesh(mesh);\r\n }\r\n\r\n if (this._vertexArrayObjects) {\r\n mesh._invalidateInstanceVertexArrayObject();\r\n }\r\n\r\n const meshes = this._meshes;\r\n\r\n // must be done before setting vertexBuffers because of mesh._createGlobalSubMesh()\r\n mesh._geometry = this;\r\n mesh._internalAbstractMeshDataInfo._positions = null;\r\n\r\n this._scene.pushGeometry(this);\r\n\r\n meshes.push(mesh);\r\n\r\n if (this.isReady()) {\r\n this._applyToMesh(mesh);\r\n } else if (this._boundingInfo) {\r\n mesh.setBoundingInfo(this._boundingInfo);\r\n }\r\n }\r\n\r\n private _updateExtend(data: Nullable = null) {\r\n if (this.useBoundingInfoFromGeometry && this._boundingInfo) {\r\n this._extend = {\r\n minimum: this._boundingInfo.minimum.clone(),\r\n maximum: this._boundingInfo.maximum.clone(),\r\n };\r\n } else {\r\n if (!data) {\r\n data = this.getVerticesData(VertexBuffer.PositionKind)!;\r\n // This can happen if the buffer comes from a Hardware Buffer where\r\n // The data have not been uploaded by Babylon. (ex: Compute Shaders and Storage Buffers)\r\n if (!data) {\r\n return;\r\n }\r\n }\r\n\r\n this._extend = extractMinAndMax(data, 0, this._totalVertices, this.boundingBias, 3);\r\n }\r\n }\r\n\r\n private _applyToMesh(mesh: Mesh): void {\r\n const numOfMeshes = this._meshes.length;\r\n\r\n // vertexBuffers\r\n for (const kind in this._vertexBuffers) {\r\n if (numOfMeshes === 1) {\r\n this._vertexBuffers[kind].create();\r\n }\r\n\r\n if (kind === VertexBuffer.PositionKind) {\r\n if (!this._extend) {\r\n this._updateExtend();\r\n }\r\n mesh.buildBoundingInfo(this._extend.minimum, this._extend.maximum);\r\n\r\n mesh._createGlobalSubMesh(mesh.isUnIndexed);\r\n\r\n //bounding info was just created again, world matrix should be applied again.\r\n mesh._updateBoundingInfo();\r\n }\r\n }\r\n\r\n // indexBuffer\r\n if (numOfMeshes === 1 && this._indices && this._indices.length > 0) {\r\n this._indexBuffer = this._engine.createIndexBuffer(this._indices, this._updatable, \"Geometry_\" + this.id + \"_IndexBuffer\");\r\n }\r\n\r\n // morphTargets\r\n mesh._syncGeometryWithMorphTargetManager();\r\n\r\n // instances\r\n mesh.synchronizeInstances();\r\n }\r\n\r\n private _notifyUpdate(kind?: string) {\r\n if (this.onGeometryUpdated) {\r\n this.onGeometryUpdated(this, kind);\r\n }\r\n\r\n if (this._vertexArrayObjects) {\r\n this._disposeVertexArrayObjects();\r\n }\r\n\r\n for (const mesh of this._meshes) {\r\n mesh._markSubMeshesAsAttributesDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Load the geometry if it was flagged as delay loaded\r\n * @param scene defines the hosting scene\r\n * @param onLoaded defines a callback called when the geometry is loaded\r\n */\r\n public load(scene: Scene, onLoaded?: () => void): void {\r\n if (this.delayLoadState === Constants.DELAYLOADSTATE_LOADING) {\r\n return;\r\n }\r\n\r\n if (this.isReady()) {\r\n if (onLoaded) {\r\n onLoaded();\r\n }\r\n return;\r\n }\r\n\r\n this.delayLoadState = Constants.DELAYLOADSTATE_LOADING;\r\n\r\n this._queueLoad(scene, onLoaded);\r\n }\r\n\r\n private _queueLoad(scene: Scene, onLoaded?: () => void): void {\r\n if (!this.delayLoadingFile) {\r\n return;\r\n }\r\n\r\n scene.addPendingData(this);\r\n scene._loadFile(\r\n this.delayLoadingFile,\r\n (data) => {\r\n if (!this._delayLoadingFunction) {\r\n return;\r\n }\r\n\r\n this._delayLoadingFunction(JSON.parse(data as string), this);\r\n\r\n this.delayLoadState = Constants.DELAYLOADSTATE_LOADED;\r\n this._delayInfo = [];\r\n\r\n scene.removePendingData(this);\r\n\r\n const meshes = this._meshes;\r\n const numOfMeshes = meshes.length;\r\n for (let index = 0; index < numOfMeshes; index++) {\r\n this._applyToMesh(meshes[index]);\r\n }\r\n\r\n if (onLoaded) {\r\n onLoaded();\r\n }\r\n },\r\n undefined,\r\n true\r\n );\r\n }\r\n\r\n /**\r\n * Invert the geometry to move from a right handed system to a left handed one.\r\n */\r\n public toLeftHanded(): void {\r\n // Flip faces\r\n const tIndices = this.getIndices(false);\r\n if (tIndices != null && tIndices.length > 0) {\r\n for (let i = 0; i < tIndices.length; i += 3) {\r\n const tTemp = tIndices[i + 0];\r\n tIndices[i + 0] = tIndices[i + 2];\r\n tIndices[i + 2] = tTemp;\r\n }\r\n this.setIndices(tIndices);\r\n }\r\n\r\n // Negate position.z\r\n const tPositions = this.getVerticesData(VertexBuffer.PositionKind, false);\r\n if (tPositions != null && tPositions.length > 0) {\r\n for (let i = 0; i < tPositions.length; i += 3) {\r\n tPositions[i + 2] = -tPositions[i + 2];\r\n }\r\n this.setVerticesData(VertexBuffer.PositionKind, tPositions, false);\r\n }\r\n\r\n // Negate normal.z\r\n const tNormals = this.getVerticesData(VertexBuffer.NormalKind, false);\r\n if (tNormals != null && tNormals.length > 0) {\r\n for (let i = 0; i < tNormals.length; i += 3) {\r\n tNormals[i + 2] = -tNormals[i + 2];\r\n }\r\n this.setVerticesData(VertexBuffer.NormalKind, tNormals, false);\r\n }\r\n }\r\n\r\n // Cache\r\n /** @internal */\r\n public _resetPointsArrayCache(): void {\r\n this._positions = null;\r\n }\r\n\r\n /** @internal */\r\n public _generatePointsArray(): boolean {\r\n if (this._positions) {\r\n return true;\r\n }\r\n\r\n const data = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (!data || data.length === 0) {\r\n return false;\r\n }\r\n\r\n for (let index = this._positionsCache.length * 3, arrayIdx = this._positionsCache.length; index < data.length; index += 3, ++arrayIdx) {\r\n this._positionsCache[arrayIdx] = Vector3.FromArray(data, index);\r\n }\r\n\r\n for (let index = 0, arrayIdx = 0; index < data.length; index += 3, ++arrayIdx) {\r\n this._positionsCache[arrayIdx].set(data[0 + index], data[1 + index], data[2 + index]);\r\n }\r\n\r\n // just in case the number of positions was reduced, splice the array\r\n this._positionsCache.length = data.length / 3;\r\n\r\n this._positions = this._positionsCache;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets a value indicating if the geometry is disposed\r\n * @returns true if the geometry was disposed\r\n */\r\n public isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n private _disposeVertexArrayObjects(): void {\r\n if (this._vertexArrayObjects) {\r\n for (const kind in this._vertexArrayObjects) {\r\n this._engine.releaseVertexArrayObject(this._vertexArrayObjects[kind]);\r\n }\r\n this._vertexArrayObjects = {}; // Will trigger a rebuild of the VAO if supported\r\n\r\n const meshes = this._meshes;\r\n const numOfMeshes = meshes.length;\r\n for (let index = 0; index < numOfMeshes; index++) {\r\n meshes[index]._invalidateInstanceVertexArrayObject();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Free all associated resources\r\n */\r\n public dispose(): void {\r\n const meshes = this._meshes;\r\n const numOfMeshes = meshes.length;\r\n let index: number;\r\n for (index = 0; index < numOfMeshes; index++) {\r\n this.releaseForMesh(meshes[index]);\r\n }\r\n this._meshes.length = 0;\r\n\r\n this._disposeVertexArrayObjects();\r\n\r\n for (const kind in this._vertexBuffers) {\r\n this._vertexBuffers[kind].dispose();\r\n }\r\n this._vertexBuffers = {};\r\n this._totalVertices = 0;\r\n\r\n if (this._indexBuffer) {\r\n this._engine._releaseBuffer(this._indexBuffer);\r\n }\r\n this._indexBuffer = null;\r\n this._indices = [];\r\n\r\n this.delayLoadState = Constants.DELAYLOADSTATE_NONE;\r\n this.delayLoadingFile = null;\r\n this._delayLoadingFunction = null;\r\n this._delayInfo = [];\r\n\r\n this._boundingInfo = null;\r\n\r\n this._scene.removeGeometry(this);\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.geometries.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.geometries.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * Clone the current geometry into a new geometry\r\n * @param id defines the unique ID of the new geometry\r\n * @returns a new geometry object\r\n */\r\n public copy(id: string): Geometry {\r\n const vertexData = new VertexData();\r\n\r\n vertexData.indices = [];\r\n\r\n const indices = this.getIndices();\r\n if (indices) {\r\n for (let index = 0; index < indices.length; index++) {\r\n (vertexData.indices).push(indices[index]);\r\n }\r\n }\r\n\r\n let updatable = false;\r\n let stopChecking = false;\r\n let kind;\r\n for (kind in this._vertexBuffers) {\r\n // using slice() to make a copy of the array and not just reference it\r\n const data = this.getVerticesData(kind);\r\n\r\n if (data) {\r\n if (data instanceof Float32Array) {\r\n vertexData.set(new Float32Array(data), kind);\r\n } else {\r\n vertexData.set((data).slice(0), kind);\r\n }\r\n if (!stopChecking) {\r\n const vb = this.getVertexBuffer(kind);\r\n\r\n if (vb) {\r\n updatable = vb.isUpdatable();\r\n stopChecking = !updatable;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const geometry = new Geometry(id, this._scene, vertexData, updatable);\r\n\r\n geometry.delayLoadState = this.delayLoadState;\r\n geometry.delayLoadingFile = this.delayLoadingFile;\r\n geometry._delayLoadingFunction = this._delayLoadingFunction;\r\n\r\n for (kind in this._delayInfo) {\r\n geometry._delayInfo = geometry._delayInfo || [];\r\n geometry._delayInfo.push(kind);\r\n }\r\n\r\n // Bounding info\r\n geometry._boundingInfo = new BoundingInfo(this._extend.minimum, this._extend.maximum);\r\n\r\n return geometry;\r\n }\r\n\r\n /**\r\n * Serialize the current geometry info (and not the vertices data) into a JSON object\r\n * @returns a JSON representation of the current geometry data (without the vertices data)\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.id = this.id;\r\n serializationObject.uniqueId = this.uniqueId;\r\n serializationObject.updatable = this._updatable;\r\n\r\n if (Tags && Tags.HasTags(this)) {\r\n serializationObject.tags = Tags.GetTags(this);\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n private _toNumberArray(origin: Nullable): number[] {\r\n if (Array.isArray(origin)) {\r\n return origin;\r\n } else {\r\n return Array.prototype.slice.call(origin);\r\n }\r\n }\r\n\r\n /**\r\n * Release any memory retained by the cached data on the Geometry.\r\n *\r\n * Call this function to reduce memory footprint of the mesh.\r\n * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly)\r\n */\r\n public clearCachedData(): void {\r\n this._indices = [];\r\n this._resetPointsArrayCache();\r\n\r\n for (const vbName in this._vertexBuffers) {\r\n if (!Object.prototype.hasOwnProperty.call(this._vertexBuffers, vbName)) {\r\n continue;\r\n }\r\n this._vertexBuffers[vbName]._buffer._data = null;\r\n }\r\n }\r\n\r\n /**\r\n * Serialize all vertices data into a JSON object\r\n * @returns a JSON representation of the current geometry data\r\n */\r\n public serializeVerticeData(): any {\r\n const serializationObject = this.serialize();\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.PositionKind)) {\r\n serializationObject.positions = this._toNumberArray(this.getVerticesData(VertexBuffer.PositionKind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.PositionKind)) {\r\n serializationObject.positions._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.NormalKind)) {\r\n serializationObject.normals = this._toNumberArray(this.getVerticesData(VertexBuffer.NormalKind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.NormalKind)) {\r\n serializationObject.normals._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.TangentKind)) {\r\n serializationObject.tangents = this._toNumberArray(this.getVerticesData(VertexBuffer.TangentKind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.TangentKind)) {\r\n serializationObject.tangents._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n serializationObject.uvs = this._toNumberArray(this.getVerticesData(VertexBuffer.UVKind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.UVKind)) {\r\n serializationObject.uvs._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.UV2Kind)) {\r\n serializationObject.uvs2 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV2Kind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.UV2Kind)) {\r\n serializationObject.uvs2._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.UV3Kind)) {\r\n serializationObject.uvs3 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV3Kind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.UV3Kind)) {\r\n serializationObject.uvs3._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.UV4Kind)) {\r\n serializationObject.uvs4 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV4Kind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.UV4Kind)) {\r\n serializationObject.uvs4._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.UV5Kind)) {\r\n serializationObject.uvs5 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV5Kind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.UV5Kind)) {\r\n serializationObject.uvs5._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.UV6Kind)) {\r\n serializationObject.uvs6 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV6Kind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.UV6Kind)) {\r\n serializationObject.uvs6._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.ColorKind)) {\r\n serializationObject.colors = this._toNumberArray(this.getVerticesData(VertexBuffer.ColorKind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.ColorKind)) {\r\n serializationObject.colors._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind)) {\r\n serializationObject.matricesIndices = this._toNumberArray(this.getVerticesData(VertexBuffer.MatricesIndicesKind));\r\n serializationObject.matricesIndices._isExpanded = true;\r\n if (this.isVertexBufferUpdatable(VertexBuffer.MatricesIndicesKind)) {\r\n serializationObject.matricesIndices._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) {\r\n serializationObject.matricesWeights = this._toNumberArray(this.getVerticesData(VertexBuffer.MatricesWeightsKind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.MatricesWeightsKind)) {\r\n serializationObject.matricesWeights._updatable = true;\r\n }\r\n }\r\n\r\n serializationObject.indices = this._toNumberArray(this.getIndices());\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Extracts a clone of a mesh geometry\r\n * @param mesh defines the source mesh\r\n * @param id defines the unique ID of the new geometry object\r\n * @returns the new geometry object\r\n */\r\n public static ExtractFromMesh(mesh: Mesh, id: string): Nullable {\r\n const geometry = mesh._geometry;\r\n\r\n if (!geometry) {\r\n return null;\r\n }\r\n\r\n return geometry.copy(id);\r\n }\r\n\r\n /**\r\n * You should now use Tools.RandomId(), this method is still here for legacy reasons.\r\n * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523\r\n * Be aware Math.random() could cause collisions, but:\r\n * \"All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide\"\r\n * @returns a string containing a new GUID\r\n */\r\n public static RandomId(): string {\r\n return Tools.RandomId();\r\n }\r\n\r\n private static _GetGeometryByLoadedUniqueId(uniqueId: string, scene: Scene) {\r\n for (let index = 0; index < scene.geometries.length; index++) {\r\n if (scene.geometries[index]._loadedUniqueId === uniqueId) {\r\n return scene.geometries[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _ImportGeometry(parsedGeometry: any, mesh: Mesh): void {\r\n const scene = mesh.getScene();\r\n\r\n // Geometry\r\n const geometryUniqueId = parsedGeometry.geometryUniqueId;\r\n const geometryId = parsedGeometry.geometryId;\r\n if (geometryUniqueId || geometryId) {\r\n const geometry = geometryUniqueId ? this._GetGeometryByLoadedUniqueId(geometryUniqueId, scene) : scene.getGeometryById(geometryId);\r\n if (geometry) {\r\n geometry.applyToMesh(mesh);\r\n }\r\n } else if (parsedGeometry instanceof ArrayBuffer) {\r\n const binaryInfo = mesh._binaryInfo;\r\n\r\n if (binaryInfo.positionsAttrDesc && binaryInfo.positionsAttrDesc.count > 0) {\r\n const positionsData = new Float32Array(parsedGeometry, binaryInfo.positionsAttrDesc.offset, binaryInfo.positionsAttrDesc.count);\r\n mesh.setVerticesData(VertexBuffer.PositionKind, positionsData, false);\r\n }\r\n\r\n if (binaryInfo.normalsAttrDesc && binaryInfo.normalsAttrDesc.count > 0) {\r\n const normalsData = new Float32Array(parsedGeometry, binaryInfo.normalsAttrDesc.offset, binaryInfo.normalsAttrDesc.count);\r\n mesh.setVerticesData(VertexBuffer.NormalKind, normalsData, false);\r\n }\r\n\r\n if (binaryInfo.tangetsAttrDesc && binaryInfo.tangetsAttrDesc.count > 0) {\r\n const tangentsData = new Float32Array(parsedGeometry, binaryInfo.tangetsAttrDesc.offset, binaryInfo.tangetsAttrDesc.count);\r\n mesh.setVerticesData(VertexBuffer.TangentKind, tangentsData, false);\r\n }\r\n\r\n if (binaryInfo.uvsAttrDesc && binaryInfo.uvsAttrDesc.count > 0) {\r\n const uvsData = new Float32Array(parsedGeometry, binaryInfo.uvsAttrDesc.offset, binaryInfo.uvsAttrDesc.count);\r\n if (CompatibilityOptions.UseOpenGLOrientationForUV) {\r\n for (let index = 1; index < uvsData.length; index += 2) {\r\n uvsData[index] = 1 - uvsData[index];\r\n }\r\n }\r\n mesh.setVerticesData(VertexBuffer.UVKind, uvsData, false);\r\n }\r\n\r\n if (binaryInfo.uvs2AttrDesc && binaryInfo.uvs2AttrDesc.count > 0) {\r\n const uvs2Data = new Float32Array(parsedGeometry, binaryInfo.uvs2AttrDesc.offset, binaryInfo.uvs2AttrDesc.count);\r\n if (CompatibilityOptions.UseOpenGLOrientationForUV) {\r\n for (let index = 1; index < uvs2Data.length; index += 2) {\r\n uvs2Data[index] = 1 - uvs2Data[index];\r\n }\r\n }\r\n mesh.setVerticesData(VertexBuffer.UV2Kind, uvs2Data, false);\r\n }\r\n\r\n if (binaryInfo.uvs3AttrDesc && binaryInfo.uvs3AttrDesc.count > 0) {\r\n const uvs3Data = new Float32Array(parsedGeometry, binaryInfo.uvs3AttrDesc.offset, binaryInfo.uvs3AttrDesc.count);\r\n if (CompatibilityOptions.UseOpenGLOrientationForUV) {\r\n for (let index = 1; index < uvs3Data.length; index += 2) {\r\n uvs3Data[index] = 1 - uvs3Data[index];\r\n }\r\n }\r\n mesh.setVerticesData(VertexBuffer.UV3Kind, uvs3Data, false);\r\n }\r\n\r\n if (binaryInfo.uvs4AttrDesc && binaryInfo.uvs4AttrDesc.count > 0) {\r\n const uvs4Data = new Float32Array(parsedGeometry, binaryInfo.uvs4AttrDesc.offset, binaryInfo.uvs4AttrDesc.count);\r\n if (CompatibilityOptions.UseOpenGLOrientationForUV) {\r\n for (let index = 1; index < uvs4Data.length; index += 2) {\r\n uvs4Data[index] = 1 - uvs4Data[index];\r\n }\r\n }\r\n mesh.setVerticesData(VertexBuffer.UV4Kind, uvs4Data, false);\r\n }\r\n\r\n if (binaryInfo.uvs5AttrDesc && binaryInfo.uvs5AttrDesc.count > 0) {\r\n const uvs5Data = new Float32Array(parsedGeometry, binaryInfo.uvs5AttrDesc.offset, binaryInfo.uvs5AttrDesc.count);\r\n if (CompatibilityOptions.UseOpenGLOrientationForUV) {\r\n for (let index = 1; index < uvs5Data.length; index += 2) {\r\n uvs5Data[index] = 1 - uvs5Data[index];\r\n }\r\n }\r\n mesh.setVerticesData(VertexBuffer.UV5Kind, uvs5Data, false);\r\n }\r\n\r\n if (binaryInfo.uvs6AttrDesc && binaryInfo.uvs6AttrDesc.count > 0) {\r\n const uvs6Data = new Float32Array(parsedGeometry, binaryInfo.uvs6AttrDesc.offset, binaryInfo.uvs6AttrDesc.count);\r\n if (CompatibilityOptions.UseOpenGLOrientationForUV) {\r\n for (let index = 1; index < uvs6Data.length; index += 2) {\r\n uvs6Data[index] = 1 - uvs6Data[index];\r\n }\r\n }\r\n mesh.setVerticesData(VertexBuffer.UV6Kind, uvs6Data, false);\r\n }\r\n\r\n if (binaryInfo.colorsAttrDesc && binaryInfo.colorsAttrDesc.count > 0) {\r\n const colorsData = new Float32Array(parsedGeometry, binaryInfo.colorsAttrDesc.offset, binaryInfo.colorsAttrDesc.count);\r\n mesh.setVerticesData(VertexBuffer.ColorKind, colorsData, false, binaryInfo.colorsAttrDesc.stride);\r\n }\r\n\r\n if (binaryInfo.matricesIndicesAttrDesc && binaryInfo.matricesIndicesAttrDesc.count > 0) {\r\n const matricesIndicesData = new Int32Array(parsedGeometry, binaryInfo.matricesIndicesAttrDesc.offset, binaryInfo.matricesIndicesAttrDesc.count);\r\n const floatIndices = [];\r\n for (let i = 0; i < matricesIndicesData.length; i++) {\r\n const index = matricesIndicesData[i];\r\n floatIndices.push(index & 0x000000ff);\r\n floatIndices.push((index & 0x0000ff00) >> 8);\r\n floatIndices.push((index & 0x00ff0000) >> 16);\r\n floatIndices.push((index >> 24) & 0xff); // & 0xFF to convert to v + 256 if v < 0\r\n }\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, floatIndices, false);\r\n }\r\n\r\n if (binaryInfo.matricesIndicesExtraAttrDesc && binaryInfo.matricesIndicesExtraAttrDesc.count > 0) {\r\n const matricesIndicesData = new Int32Array(parsedGeometry, binaryInfo.matricesIndicesExtraAttrDesc.offset, binaryInfo.matricesIndicesExtraAttrDesc.count);\r\n const floatIndices = [];\r\n for (let i = 0; i < matricesIndicesData.length; i++) {\r\n const index = matricesIndicesData[i];\r\n floatIndices.push(index & 0x000000ff);\r\n floatIndices.push((index & 0x0000ff00) >> 8);\r\n floatIndices.push((index & 0x00ff0000) >> 16);\r\n floatIndices.push((index >> 24) & 0xff); // & 0xFF to convert to v + 256 if v < 0\r\n }\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, floatIndices, false);\r\n }\r\n\r\n if (binaryInfo.matricesWeightsAttrDesc && binaryInfo.matricesWeightsAttrDesc.count > 0) {\r\n const matricesWeightsData = new Float32Array(parsedGeometry, binaryInfo.matricesWeightsAttrDesc.offset, binaryInfo.matricesWeightsAttrDesc.count);\r\n mesh.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeightsData, false);\r\n }\r\n\r\n if (binaryInfo.indicesAttrDesc && binaryInfo.indicesAttrDesc.count > 0) {\r\n const indicesData = new Int32Array(parsedGeometry, binaryInfo.indicesAttrDesc.offset, binaryInfo.indicesAttrDesc.count);\r\n mesh.setIndices(indicesData, null);\r\n }\r\n\r\n if (binaryInfo.subMeshesAttrDesc && binaryInfo.subMeshesAttrDesc.count > 0) {\r\n const subMeshesData = new Int32Array(parsedGeometry, binaryInfo.subMeshesAttrDesc.offset, binaryInfo.subMeshesAttrDesc.count * 5);\r\n\r\n mesh.subMeshes = [];\r\n for (let i = 0; i < binaryInfo.subMeshesAttrDesc.count; i++) {\r\n const materialIndex = subMeshesData[i * 5 + 0];\r\n const verticesStart = subMeshesData[i * 5 + 1];\r\n const verticesCount = subMeshesData[i * 5 + 2];\r\n const indexStart = subMeshesData[i * 5 + 3];\r\n const indexCount = subMeshesData[i * 5 + 4];\r\n\r\n SubMesh.AddToMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh);\r\n }\r\n }\r\n } else if (parsedGeometry.positions && parsedGeometry.normals && parsedGeometry.indices) {\r\n mesh.setVerticesData(VertexBuffer.PositionKind, parsedGeometry.positions, parsedGeometry.positions._updatable);\r\n\r\n mesh.setVerticesData(VertexBuffer.NormalKind, parsedGeometry.normals, parsedGeometry.normals._updatable);\r\n\r\n if (parsedGeometry.tangents) {\r\n mesh.setVerticesData(VertexBuffer.TangentKind, parsedGeometry.tangents, parsedGeometry.tangents._updatable);\r\n }\r\n\r\n if (parsedGeometry.uvs) {\r\n mesh.setVerticesData(VertexBuffer.UVKind, parsedGeometry.uvs, parsedGeometry.uvs._updatable);\r\n }\r\n\r\n if (parsedGeometry.uvs2) {\r\n mesh.setVerticesData(VertexBuffer.UV2Kind, parsedGeometry.uvs2, parsedGeometry.uvs2._updatable);\r\n }\r\n\r\n if (parsedGeometry.uvs3) {\r\n mesh.setVerticesData(VertexBuffer.UV3Kind, parsedGeometry.uvs3, parsedGeometry.uvs3._updatable);\r\n }\r\n\r\n if (parsedGeometry.uvs4) {\r\n mesh.setVerticesData(VertexBuffer.UV4Kind, parsedGeometry.uvs4, parsedGeometry.uvs4._updatable);\r\n }\r\n\r\n if (parsedGeometry.uvs5) {\r\n mesh.setVerticesData(VertexBuffer.UV5Kind, parsedGeometry.uvs5, parsedGeometry.uvs5._updatable);\r\n }\r\n\r\n if (parsedGeometry.uvs6) {\r\n mesh.setVerticesData(VertexBuffer.UV6Kind, parsedGeometry.uvs6, parsedGeometry.uvs6._updatable);\r\n }\r\n\r\n if (parsedGeometry.colors) {\r\n mesh.setVerticesData(VertexBuffer.ColorKind, Color4.CheckColors4(parsedGeometry.colors, parsedGeometry.positions.length / 3), parsedGeometry.colors._updatable);\r\n }\r\n\r\n if (parsedGeometry.matricesIndices) {\r\n if (!parsedGeometry.matricesIndices._isExpanded) {\r\n const floatIndices = [];\r\n\r\n for (let i = 0; i < parsedGeometry.matricesIndices.length; i++) {\r\n const matricesIndex = parsedGeometry.matricesIndices[i];\r\n\r\n floatIndices.push(matricesIndex & 0x000000ff);\r\n floatIndices.push((matricesIndex & 0x0000ff00) >> 8);\r\n floatIndices.push((matricesIndex & 0x00ff0000) >> 16);\r\n floatIndices.push((matricesIndex >> 24) & 0xff); // & 0xFF to convert to v + 256 if v < 0\r\n }\r\n\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, floatIndices, parsedGeometry.matricesIndices._updatable);\r\n } else {\r\n delete parsedGeometry.matricesIndices._isExpanded;\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, parsedGeometry.matricesIndices, parsedGeometry.matricesIndices._updatable);\r\n }\r\n }\r\n\r\n if (parsedGeometry.matricesIndicesExtra) {\r\n if (!parsedGeometry.matricesIndicesExtra._isExpanded) {\r\n const floatIndices = [];\r\n\r\n for (let i = 0; i < parsedGeometry.matricesIndicesExtra.length; i++) {\r\n const matricesIndex = parsedGeometry.matricesIndicesExtra[i];\r\n\r\n floatIndices.push(matricesIndex & 0x000000ff);\r\n floatIndices.push((matricesIndex & 0x0000ff00) >> 8);\r\n floatIndices.push((matricesIndex & 0x00ff0000) >> 16);\r\n floatIndices.push((matricesIndex >> 24) & 0xff); // & 0xFF to convert to v + 256 if v < 0\r\n }\r\n\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, floatIndices, parsedGeometry.matricesIndicesExtra._updatable);\r\n } else {\r\n delete parsedGeometry.matricesIndices._isExpanded;\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, parsedGeometry.matricesIndicesExtra, parsedGeometry.matricesIndicesExtra._updatable);\r\n }\r\n }\r\n\r\n if (parsedGeometry.matricesWeights) {\r\n Geometry._CleanMatricesWeights(parsedGeometry, mesh);\r\n mesh.setVerticesData(VertexBuffer.MatricesWeightsKind, parsedGeometry.matricesWeights, parsedGeometry.matricesWeights._updatable);\r\n }\r\n\r\n if (parsedGeometry.matricesWeightsExtra) {\r\n mesh.setVerticesData(VertexBuffer.MatricesWeightsExtraKind, parsedGeometry.matricesWeightsExtra, parsedGeometry.matricesWeights._updatable);\r\n }\r\n\r\n mesh.setIndices(parsedGeometry.indices, null);\r\n }\r\n\r\n // SubMeshes\r\n if (parsedGeometry.subMeshes) {\r\n mesh.subMeshes = [];\r\n for (let subIndex = 0; subIndex < parsedGeometry.subMeshes.length; subIndex++) {\r\n const parsedSubMesh = parsedGeometry.subMeshes[subIndex];\r\n\r\n SubMesh.AddToMesh(\r\n parsedSubMesh.materialIndex,\r\n parsedSubMesh.verticesStart,\r\n parsedSubMesh.verticesCount,\r\n parsedSubMesh.indexStart,\r\n parsedSubMesh.indexCount,\r\n mesh\r\n );\r\n }\r\n }\r\n\r\n // Flat shading\r\n if (mesh._shouldGenerateFlatShading) {\r\n mesh.convertToFlatShadedMesh();\r\n mesh._shouldGenerateFlatShading = false;\r\n }\r\n\r\n // Update\r\n mesh.computeWorldMatrix(true);\r\n\r\n scene.onMeshImportedObservable.notifyObservers(mesh);\r\n }\r\n\r\n private static _CleanMatricesWeights(parsedGeometry: any, mesh: Mesh): void {\r\n const epsilon: number = 1e-3;\r\n if (!SceneLoaderFlags.CleanBoneMatrixWeights) {\r\n return;\r\n }\r\n let noInfluenceBoneIndex = 0.0;\r\n if (parsedGeometry.skeletonId > -1) {\r\n const skeleton = mesh.getScene().getLastSkeletonById(parsedGeometry.skeletonId);\r\n\r\n if (!skeleton) {\r\n return;\r\n }\r\n noInfluenceBoneIndex = skeleton.bones.length;\r\n } else {\r\n return;\r\n }\r\n const matricesIndices = mesh.getVerticesData(VertexBuffer.MatricesIndicesKind);\r\n const matricesIndicesExtra = mesh.getVerticesData(VertexBuffer.MatricesIndicesExtraKind);\r\n const matricesWeights = parsedGeometry.matricesWeights;\r\n const matricesWeightsExtra = parsedGeometry.matricesWeightsExtra;\r\n const influencers = parsedGeometry.numBoneInfluencer;\r\n const size = matricesWeights.length;\r\n\r\n for (let i = 0; i < size; i += 4) {\r\n let weight = 0.0;\r\n let firstZeroWeight = -1;\r\n for (let j = 0; j < 4; j++) {\r\n const w = matricesWeights[i + j];\r\n weight += w;\r\n if (w < epsilon && firstZeroWeight < 0) {\r\n firstZeroWeight = j;\r\n }\r\n }\r\n if (matricesWeightsExtra) {\r\n for (let j = 0; j < 4; j++) {\r\n const w = matricesWeightsExtra[i + j];\r\n weight += w;\r\n if (w < epsilon && firstZeroWeight < 0) {\r\n firstZeroWeight = j + 4;\r\n }\r\n }\r\n }\r\n if (firstZeroWeight < 0 || firstZeroWeight > influencers - 1) {\r\n firstZeroWeight = influencers - 1;\r\n }\r\n if (weight > epsilon) {\r\n const mweight = 1.0 / weight;\r\n for (let j = 0; j < 4; j++) {\r\n matricesWeights[i + j] *= mweight;\r\n }\r\n if (matricesWeightsExtra) {\r\n for (let j = 0; j < 4; j++) {\r\n matricesWeightsExtra[i + j] *= mweight;\r\n }\r\n }\r\n } else {\r\n if (firstZeroWeight >= 4) {\r\n matricesWeightsExtra[i + firstZeroWeight - 4] = 1.0 - weight;\r\n matricesIndicesExtra[i + firstZeroWeight - 4] = noInfluenceBoneIndex;\r\n } else {\r\n matricesWeights[i + firstZeroWeight] = 1.0 - weight;\r\n matricesIndices[i + firstZeroWeight] = noInfluenceBoneIndex;\r\n }\r\n }\r\n }\r\n\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, matricesIndices);\r\n if (parsedGeometry.matricesWeightsExtra) {\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, matricesIndicesExtra);\r\n }\r\n }\r\n\r\n /**\r\n * Create a new geometry from persisted data (Using .babylon file format)\r\n * @param parsedVertexData defines the persisted data\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root url to use to load assets (like delayed data)\r\n * @returns the new geometry object\r\n */\r\n public static Parse(parsedVertexData: any, scene: Scene, rootUrl: string): Nullable {\r\n const geometry = new Geometry(parsedVertexData.id, scene, undefined, parsedVertexData.updatable);\r\n geometry._loadedUniqueId = parsedVertexData.uniqueId;\r\n\r\n if (Tags) {\r\n Tags.AddTagsTo(geometry, parsedVertexData.tags);\r\n }\r\n\r\n if (parsedVertexData.delayLoadingFile) {\r\n geometry.delayLoadState = Constants.DELAYLOADSTATE_NOTLOADED;\r\n geometry.delayLoadingFile = rootUrl + parsedVertexData.delayLoadingFile;\r\n geometry._boundingInfo = new BoundingInfo(Vector3.FromArray(parsedVertexData.boundingBoxMinimum), Vector3.FromArray(parsedVertexData.boundingBoxMaximum));\r\n\r\n geometry._delayInfo = [];\r\n if (parsedVertexData.hasUVs) {\r\n geometry._delayInfo.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (parsedVertexData.hasUVs2) {\r\n geometry._delayInfo.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (parsedVertexData.hasUVs3) {\r\n geometry._delayInfo.push(VertexBuffer.UV3Kind);\r\n }\r\n\r\n if (parsedVertexData.hasUVs4) {\r\n geometry._delayInfo.push(VertexBuffer.UV4Kind);\r\n }\r\n\r\n if (parsedVertexData.hasUVs5) {\r\n geometry._delayInfo.push(VertexBuffer.UV5Kind);\r\n }\r\n\r\n if (parsedVertexData.hasUVs6) {\r\n geometry._delayInfo.push(VertexBuffer.UV6Kind);\r\n }\r\n\r\n if (parsedVertexData.hasColors) {\r\n geometry._delayInfo.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (parsedVertexData.hasMatricesIndices) {\r\n geometry._delayInfo.push(VertexBuffer.MatricesIndicesKind);\r\n }\r\n\r\n if (parsedVertexData.hasMatricesWeights) {\r\n geometry._delayInfo.push(VertexBuffer.MatricesWeightsKind);\r\n }\r\n\r\n geometry._delayLoadingFunction = VertexData.ImportVertexData;\r\n } else {\r\n VertexData.ImportVertexData(parsedVertexData, geometry);\r\n }\r\n\r\n scene.pushGeometry(geometry, true);\r\n\r\n return geometry;\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\nimport { PrecisionDate } from \"./precisionDate\";\r\n\r\n/**\r\n * Performance monitor tracks rolling average frame-time and frame-time variance over a user defined sliding-window\r\n */\r\nexport class PerformanceMonitor {\r\n private _enabled: boolean = true;\r\n private _rollingFrameTime: RollingAverage;\r\n private _lastFrameTimeMs: Nullable;\r\n\r\n /**\r\n * constructor\r\n * @param frameSampleSize The number of samples required to saturate the sliding window\r\n */\r\n constructor(frameSampleSize: number = 30) {\r\n this._rollingFrameTime = new RollingAverage(frameSampleSize);\r\n }\r\n\r\n /**\r\n * Samples current frame\r\n * @param timeMs A timestamp in milliseconds of the current frame to compare with other frames\r\n */\r\n public sampleFrame(timeMs: number = PrecisionDate.Now) {\r\n if (!this._enabled) {\r\n return;\r\n }\r\n\r\n if (this._lastFrameTimeMs != null) {\r\n const dt = timeMs - this._lastFrameTimeMs;\r\n this._rollingFrameTime.add(dt);\r\n }\r\n\r\n this._lastFrameTimeMs = timeMs;\r\n }\r\n\r\n /**\r\n * Returns the average frame time in milliseconds over the sliding window (or the subset of frames sampled so far)\r\n */\r\n public get averageFrameTime(): number {\r\n return this._rollingFrameTime.average;\r\n }\r\n\r\n /**\r\n * Returns the variance frame time in milliseconds over the sliding window (or the subset of frames sampled so far)\r\n */\r\n public get averageFrameTimeVariance(): number {\r\n return this._rollingFrameTime.variance;\r\n }\r\n\r\n /**\r\n * Returns the frame time of the most recent frame\r\n */\r\n public get instantaneousFrameTime(): number {\r\n return this._rollingFrameTime.history(0);\r\n }\r\n\r\n /**\r\n * Returns the average framerate in frames per second over the sliding window (or the subset of frames sampled so far)\r\n */\r\n public get averageFPS(): number {\r\n return 1000.0 / this._rollingFrameTime.average;\r\n }\r\n\r\n /**\r\n * Returns the average framerate in frames per second using the most recent frame time\r\n */\r\n public get instantaneousFPS(): number {\r\n const history = this._rollingFrameTime.history(0);\r\n\r\n if (history === 0) {\r\n return 0;\r\n }\r\n\r\n return 1000.0 / history;\r\n }\r\n\r\n /**\r\n * Returns true if enough samples have been taken to completely fill the sliding window\r\n */\r\n public get isSaturated(): boolean {\r\n return this._rollingFrameTime.isSaturated();\r\n }\r\n\r\n /**\r\n * Enables contributions to the sliding window sample set\r\n */\r\n public enable() {\r\n this._enabled = true;\r\n }\r\n\r\n /**\r\n * Disables contributions to the sliding window sample set\r\n * Samples will not be interpolated over the disabled period\r\n */\r\n public disable() {\r\n this._enabled = false;\r\n //clear last sample to avoid interpolating over the disabled period when next enabled\r\n this._lastFrameTimeMs = null;\r\n }\r\n\r\n /**\r\n * Returns true if sampling is enabled\r\n */\r\n public get isEnabled(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n /**\r\n * Resets performance monitor\r\n */\r\n public reset() {\r\n //clear last sample to avoid interpolating over the disabled period when next enabled\r\n this._lastFrameTimeMs = null;\r\n //wipe record\r\n this._rollingFrameTime.reset();\r\n }\r\n}\r\n\r\n/**\r\n * RollingAverage\r\n *\r\n * Utility to efficiently compute the rolling average and variance over a sliding window of samples\r\n */\r\nexport class RollingAverage {\r\n /**\r\n * Current average\r\n */\r\n public average: number;\r\n /**\r\n * Current variance\r\n */\r\n public variance: number;\r\n\r\n protected _samples: Array;\r\n protected _sampleCount: number;\r\n protected _pos: number;\r\n protected _m2: number; //sum of squares of differences from the (current) mean\r\n\r\n /**\r\n * constructor\r\n * @param length The number of samples required to saturate the sliding window\r\n */\r\n constructor(length: number) {\r\n this._samples = new Array(length);\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Adds a sample to the sample set\r\n * @param v The sample value\r\n */\r\n public add(v: number) {\r\n //http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance\r\n let delta: number;\r\n\r\n //we need to check if we've already wrapped round\r\n if (this.isSaturated()) {\r\n //remove bottom of stack from mean\r\n const bottomValue = this._samples[this._pos];\r\n delta = bottomValue - this.average;\r\n this.average -= delta / (this._sampleCount - 1);\r\n this._m2 -= delta * (bottomValue - this.average);\r\n } else {\r\n this._sampleCount++;\r\n }\r\n\r\n //add new value to mean\r\n delta = v - this.average;\r\n this.average += delta / this._sampleCount;\r\n this._m2 += delta * (v - this.average);\r\n\r\n //set the new variance\r\n this.variance = this._m2 / (this._sampleCount - 1);\r\n\r\n this._samples[this._pos] = v;\r\n this._pos++;\r\n\r\n this._pos %= this._samples.length; //positive wrap around\r\n }\r\n\r\n /**\r\n * Returns previously added values or null if outside of history or outside the sliding window domain\r\n * @param i Index in history. For example, pass 0 for the most recent value and 1 for the value before that\r\n * @returns Value previously recorded with add() or null if outside of range\r\n */\r\n public history(i: number): number {\r\n if (i >= this._sampleCount || i >= this._samples.length) {\r\n return 0;\r\n }\r\n\r\n const i0 = this._wrapPosition(this._pos - 1.0);\r\n return this._samples[this._wrapPosition(i0 - i)];\r\n }\r\n\r\n /**\r\n * Returns true if enough samples have been taken to completely fill the sliding window\r\n * @returns true if sample-set saturated\r\n */\r\n public isSaturated(): boolean {\r\n return this._sampleCount >= this._samples.length;\r\n }\r\n\r\n /**\r\n * Resets the rolling average (equivalent to 0 samples taken so far)\r\n */\r\n public reset() {\r\n this.average = 0;\r\n this.variance = 0;\r\n this._sampleCount = 0;\r\n this._pos = 0;\r\n this._m2 = 0;\r\n }\r\n\r\n /**\r\n * Wraps a value around the sample range boundaries\r\n * @param i Position in sample range, for example if the sample length is 5, and i is -3, then 2 will be returned.\r\n * @returns Wrapped position in sample range\r\n */\r\n protected _wrapPosition(i: number): number {\r\n const max = this._samples.length;\r\n return ((i % max) + max) % max;\r\n }\r\n}\r\n", "import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../constants\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /** @internal */\r\n _readTexturePixels(\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex?: number,\r\n level?: number,\r\n buffer?: Nullable,\r\n flushRenderer?: boolean,\r\n noDataConversion?: boolean,\r\n x?: number,\r\n y?: number\r\n ): Promise;\r\n\r\n /** @internal */\r\n _readTexturePixelsSync(\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex?: number,\r\n level?: number,\r\n buffer?: Nullable,\r\n flushRenderer?: boolean,\r\n noDataConversion?: boolean,\r\n x?: number,\r\n y?: number\r\n ): ArrayBufferView;\r\n }\r\n}\r\n\r\n/**\r\n * Allocate a typed array depending on a texture type. Optionally can copy existing data in the buffer.\r\n * @param type type of the texture\r\n * @param sizeOrDstBuffer size of the array OR an existing buffer that will be used as the destination of the copy (if copyBuffer is provided)\r\n * @param sizeInBytes true if the size of the array is given in bytes, false if it is the number of elements of the array\r\n * @param copyBuffer if provided, buffer to copy into the destination buffer (either a newly allocated buffer if sizeOrDstBuffer is a number or use sizeOrDstBuffer as the destination buffer otherwise)\r\n * @returns the allocated buffer or sizeOrDstBuffer if the latter is an ArrayBuffer\r\n */\r\nexport function allocateAndCopyTypedBuffer(type: number, sizeOrDstBuffer: number | ArrayBuffer, sizeInBytes = false, copyBuffer?: ArrayBuffer): ArrayBufferView {\r\n switch (type) {\r\n case Constants.TEXTURETYPE_BYTE: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Int8Array(sizeOrDstBuffer) : new Int8Array(sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Int8Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint8Array(sizeOrDstBuffer) : new Uint8Array(sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint8Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_SHORT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Int16Array(sizeOrDstBuffer) : new Int16Array(sizeInBytes ? sizeOrDstBuffer / 2 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Int16Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5:\r\n case Constants.TEXTURETYPE_HALF_FLOAT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint16Array(sizeOrDstBuffer) : new Uint16Array(sizeInBytes ? sizeOrDstBuffer / 2 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint16Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_INT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Int32Array(sizeOrDstBuffer) : new Int32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Int32Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_INTEGER:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_24_8:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV:\r\n case Constants.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint32Array(sizeOrDstBuffer) : new Uint32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint32Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_FLOAT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Float32Array(sizeOrDstBuffer) : new Float32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Float32Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n }\r\n\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint8Array(sizeOrDstBuffer) : new Uint8Array(sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint8Array(copyBuffer));\r\n }\r\n return buffer;\r\n}\r\n\r\nThinEngine.prototype._readTexturePixelsSync = function (\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex = -1,\r\n level = 0,\r\n buffer: Nullable = null,\r\n flushRenderer = true,\r\n noDataConversion = false,\r\n x = 0,\r\n y = 0\r\n): ArrayBufferView {\r\n const gl = this._gl;\r\n if (!gl) {\r\n throw new Error(\"Engine does not have gl rendering context.\");\r\n }\r\n if (!this._dummyFramebuffer) {\r\n const dummy = gl.createFramebuffer();\r\n\r\n if (!dummy) {\r\n throw new Error(\"Unable to create dummy framebuffer\");\r\n }\r\n\r\n this._dummyFramebuffer = dummy;\r\n }\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFramebuffer);\r\n\r\n if (faceIndex > -1) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, texture._hardwareTexture?.underlyingResource, level);\r\n } else {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture._hardwareTexture?.underlyingResource, level);\r\n }\r\n\r\n let readType = texture.type !== undefined ? this._getWebGLTextureType(texture.type) : gl.UNSIGNED_BYTE;\r\n\r\n if (!noDataConversion) {\r\n switch (readType) {\r\n case gl.UNSIGNED_BYTE:\r\n if (!buffer) {\r\n buffer = new Uint8Array(4 * width * height);\r\n }\r\n readType = gl.UNSIGNED_BYTE;\r\n break;\r\n default:\r\n if (!buffer) {\r\n buffer = new Float32Array(4 * width * height);\r\n }\r\n readType = gl.FLOAT;\r\n break;\r\n }\r\n } else if (!buffer) {\r\n buffer = allocateAndCopyTypedBuffer(texture.type, 4 * width * height);\r\n }\r\n\r\n if (flushRenderer) {\r\n this.flushFramebuffer();\r\n }\r\n\r\n gl.readPixels(x, y, width, height, gl.RGBA, readType, buffer);\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._currentFramebuffer);\r\n\r\n return buffer;\r\n};\r\n\r\nThinEngine.prototype._readTexturePixels = function (\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex = -1,\r\n level = 0,\r\n buffer: Nullable = null,\r\n flushRenderer = true,\r\n noDataConversion = false,\r\n x = 0,\r\n y = 0\r\n): Promise {\r\n return Promise.resolve(this._readTexturePixelsSync(texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion, x, y));\r\n};\r\n", "import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { Constants } from \"../constants\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Sets alpha constants used by some alpha blending modes\r\n * @param r defines the red component\r\n * @param g defines the green component\r\n * @param b defines the blue component\r\n * @param a defines the alpha component\r\n */\r\n setAlphaConstants(r: number, g: number, b: number, a: number): void;\r\n\r\n /**\r\n * Sets the current alpha mode\r\n * @param mode defines the mode to use (one of the Engine.ALPHA_XXX)\r\n * @param noDepthWriteChange defines if depth writing state should remains unchanged (false by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering\r\n */\r\n setAlphaMode(mode: number, noDepthWriteChange?: boolean): void;\r\n\r\n /**\r\n * Gets the current alpha mode\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering\r\n * @returns the current alpha mode\r\n */\r\n getAlphaMode(): number;\r\n\r\n /**\r\n * Sets the current alpha equation\r\n * @param equation defines the equation to use (one of the Engine.ALPHA_EQUATION_XXX)\r\n */\r\n setAlphaEquation(equation: number): void;\r\n\r\n /**\r\n * Gets the current alpha equation.\r\n * @returns the current alpha equation\r\n */\r\n getAlphaEquation(): number;\r\n }\r\n}\r\n\r\nThinEngine.prototype.setAlphaConstants = function (r: number, g: number, b: number, a: number) {\r\n this._alphaState.setAlphaBlendConstants(r, g, b, a);\r\n};\r\n\r\nThinEngine.prototype.setAlphaMode = function (mode: number, noDepthWriteChange: boolean = false): void {\r\n if (this._alphaMode === mode) {\r\n if (!noDepthWriteChange) {\r\n // Make sure we still have the correct depth mask according to the alpha mode (a transparent material could have forced writting to the depth buffer, for instance)\r\n const depthMask = mode === Constants.ALPHA_DISABLE;\r\n if (this.depthCullingState.depthMask !== depthMask) {\r\n this.depthCullingState.depthMask = depthMask;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n switch (mode) {\r\n case Constants.ALPHA_DISABLE:\r\n this._alphaState.alphaBlend = false;\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED_PORTERDUFF:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_COMBINE:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ONEONE:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ZERO, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ADD:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_SUBTRACT:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ZERO, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_MULTIPLY:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_COLOR, this._gl.ZERO, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_MAXIMIZED:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_INTERPOLATE:\r\n this._alphaState.setAlphaBlendFunctionParameters(\r\n this._gl.CONSTANT_COLOR,\r\n this._gl.ONE_MINUS_CONSTANT_COLOR,\r\n this._gl.CONSTANT_ALPHA,\r\n this._gl.ONE_MINUS_CONSTANT_ALPHA\r\n );\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_SCREENMODE:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEONE:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ALPHATOCOLOR:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ZERO);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_REVERSEONEMINUS:\r\n this._alphaState.setAlphaBlendFunctionParameters(\r\n this._gl.ONE_MINUS_DST_COLOR,\r\n this._gl.ONE_MINUS_SRC_COLOR,\r\n this._gl.ONE_MINUS_DST_ALPHA,\r\n this._gl.ONE_MINUS_SRC_ALPHA\r\n );\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_SRC_DSTONEMINUSSRCALPHA:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEZERO:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ZERO);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_EXCLUSION:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE_MINUS_DST_COLOR, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ZERO, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_LAYER_ACCUMULATE:\r\n // Same as ALPHA_COMBINE but accumulates (1 - alpha) values in the alpha channel for a later readout in order independant transparency\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n }\r\n if (!noDepthWriteChange) {\r\n this.depthCullingState.depthMask = mode === Constants.ALPHA_DISABLE;\r\n }\r\n this._alphaMode = mode;\r\n};\r\n\r\nThinEngine.prototype.getAlphaMode = function (): number {\r\n return this._alphaMode;\r\n};\r\n\r\nThinEngine.prototype.setAlphaEquation = function (equation: number): void {\r\n if (this._alphaEquation === equation) {\r\n return;\r\n }\r\n\r\n switch (equation) {\r\n case Constants.ALPHA_EQUATION_ADD:\r\n this._alphaState.setAlphaEquationParameters(Constants.GL_ALPHA_EQUATION_ADD, Constants.GL_ALPHA_EQUATION_ADD);\r\n break;\r\n case Constants.ALPHA_EQUATION_SUBSTRACT:\r\n this._alphaState.setAlphaEquationParameters(Constants.GL_ALPHA_EQUATION_SUBTRACT, Constants.GL_ALPHA_EQUATION_SUBTRACT);\r\n break;\r\n case Constants.ALPHA_EQUATION_REVERSE_SUBTRACT:\r\n this._alphaState.setAlphaEquationParameters(Constants.GL_ALPHA_EQUATION_REVERSE_SUBTRACT, Constants.GL_ALPHA_EQUATION_REVERSE_SUBTRACT);\r\n break;\r\n case Constants.ALPHA_EQUATION_MAX:\r\n this._alphaState.setAlphaEquationParameters(Constants.GL_ALPHA_EQUATION_MAX, Constants.GL_ALPHA_EQUATION_MAX);\r\n break;\r\n case Constants.ALPHA_EQUATION_MIN:\r\n this._alphaState.setAlphaEquationParameters(Constants.GL_ALPHA_EQUATION_MIN, Constants.GL_ALPHA_EQUATION_MIN);\r\n break;\r\n case Constants.ALPHA_EQUATION_DARKEN:\r\n this._alphaState.setAlphaEquationParameters(Constants.GL_ALPHA_EQUATION_MIN, Constants.GL_ALPHA_EQUATION_ADD);\r\n break;\r\n }\r\n this._alphaEquation = equation;\r\n};\r\n\r\nThinEngine.prototype.getAlphaEquation = function () {\r\n return this._alphaEquation;\r\n};\r\n", "import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport type { IndicesArray, DataArray } from \"../../types\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Update a dynamic index buffer\r\n * @param indexBuffer defines the target index buffer\r\n * @param indices defines the data to update\r\n * @param offset defines the offset in the target index buffer where update should start\r\n */\r\n updateDynamicIndexBuffer(indexBuffer: DataBuffer, indices: IndicesArray, offset?: number): void;\r\n\r\n /**\r\n * Updates a dynamic vertex buffer.\r\n * @param vertexBuffer the vertex buffer to update\r\n * @param data the data used to update the vertex buffer\r\n * @param byteOffset the byte offset of the data\r\n * @param byteLength the byte length of the data\r\n */\r\n updateDynamicVertexBuffer(vertexBuffer: DataBuffer, data: DataArray, byteOffset?: number, byteLength?: number): void;\r\n }\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nThinEngine.prototype.updateDynamicIndexBuffer = function (this: ThinEngine, indexBuffer: DataBuffer, indices: IndicesArray, offset: number = 0): void {\r\n // Force cache update\r\n this._currentBoundBuffer[this._gl.ELEMENT_ARRAY_BUFFER] = null;\r\n this.bindIndexBuffer(indexBuffer);\r\n\r\n let view: ArrayBufferView;\r\n if (indexBuffer.is32Bits) {\r\n // anything else than Uint32Array needs to be converted to Uint32Array\r\n view = indices instanceof Uint32Array ? indices : new Uint32Array(indices);\r\n } else {\r\n // anything else than Uint16Array needs to be converted to Uint16Array\r\n view = indices instanceof Uint16Array ? indices : new Uint16Array(indices);\r\n }\r\n\r\n this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, view, this._gl.DYNAMIC_DRAW);\r\n\r\n this._resetIndexBufferBinding();\r\n};\r\n\r\nThinEngine.prototype.updateDynamicVertexBuffer = function (this: ThinEngine, vertexBuffer: DataBuffer, data: DataArray, byteOffset?: number, byteLength?: number): void {\r\n this.bindArrayBuffer(vertexBuffer);\r\n\r\n if (byteOffset === undefined) {\r\n byteOffset = 0;\r\n }\r\n\r\n const dataLength = (data as ArrayBuffer).byteLength || (data as number[]).length;\r\n\r\n if (byteLength === undefined || (byteLength >= dataLength && byteOffset === 0)) {\r\n if (data instanceof Array) {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, byteOffset, new Float32Array(data));\r\n } else {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, byteOffset, data);\r\n }\r\n } else {\r\n if (data instanceof Array) {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, new Float32Array(data).subarray(byteOffset, byteOffset + byteLength));\r\n } else {\r\n if (data instanceof ArrayBuffer) {\r\n data = new Uint8Array(data, byteOffset, byteLength);\r\n } else {\r\n data = new Uint8Array(data.buffer, data.byteOffset + byteOffset, byteLength);\r\n }\r\n\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data);\r\n }\r\n }\r\n\r\n this._resetVertexBufferBinding();\r\n};\r\n", "import { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { InternalTexture, InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport type { IOfflineProvider } from \"../Offline/IOfflineProvider\";\r\nimport type { ILoadingScreen } from \"../Loading/loadingScreen\";\r\nimport { IsDocumentAvailable, IsWindowObjectExist } from \"../Misc/domManagement\";\r\nimport { EngineStore } from \"./engineStore\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport type { WebGLPipelineContext } from \"./WebGL/webGLPipelineContext\";\r\nimport type { IPipelineContext } from \"./IPipelineContext\";\r\nimport type { ICustomAnimationFrameRequester } from \"../Misc/customAnimationFrameRequester\";\r\nimport type { EngineOptions } from \"./thinEngine\";\r\nimport { ThinEngine } from \"./thinEngine\";\r\nimport { Constants } from \"./constants\";\r\nimport type { IViewportLike, IColor4Like } from \"../Maths/math.like\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { PerformanceMonitor } from \"../Misc/performanceMonitor\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { PerfCounter } from \"../Misc/perfCounter\";\r\nimport { WebGLDataBuffer } from \"../Meshes/WebGL/webGLDataBuffer\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { RenderTargetWrapper } from \"./renderTargetWrapper\";\r\nimport { WebGLHardwareTexture } from \"./WebGL/webGLHardwareTexture\";\r\n\r\nimport \"./Extensions/engine.alpha\";\r\nimport \"./Extensions/engine.readTexture\";\r\nimport \"./Extensions/engine.dynamicBuffer\";\r\nimport type { IAudioEngine } from \"../Audio/Interfaces/IAudioEngine\";\r\n\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { PostProcess } from \"../PostProcesses/postProcess\";\r\n\r\n/**\r\n * Defines the interface used by objects containing a viewport (like a camera)\r\n */\r\ninterface IViewportOwnerLike {\r\n /**\r\n * Gets or sets the viewport\r\n */\r\n viewport: IViewportLike;\r\n}\r\n\r\n/**\r\n * The engine class is responsible for interfacing with all lower-level APIs such as WebGL and Audio\r\n */\r\nexport class Engine extends ThinEngine {\r\n // Const statics\r\n\r\n /** Defines that alpha blending is disabled */\r\n public static readonly ALPHA_DISABLE = Constants.ALPHA_DISABLE;\r\n /** Defines that alpha blending to SRC ALPHA * SRC + DEST */\r\n public static readonly ALPHA_ADD = Constants.ALPHA_ADD;\r\n /** Defines that alpha blending to SRC ALPHA * SRC + (1 - SRC ALPHA) * DEST */\r\n public static readonly ALPHA_COMBINE = Constants.ALPHA_COMBINE;\r\n /** Defines that alpha blending to DEST - SRC * DEST */\r\n public static readonly ALPHA_SUBTRACT = Constants.ALPHA_SUBTRACT;\r\n /** Defines that alpha blending to SRC * DEST */\r\n public static readonly ALPHA_MULTIPLY = Constants.ALPHA_MULTIPLY;\r\n /** Defines that alpha blending to SRC ALPHA * SRC + (1 - SRC) * DEST */\r\n public static readonly ALPHA_MAXIMIZED = Constants.ALPHA_MAXIMIZED;\r\n /** Defines that alpha blending to SRC + DEST */\r\n public static readonly ALPHA_ONEONE = Constants.ALPHA_ONEONE;\r\n /** Defines that alpha blending to SRC + (1 - SRC ALPHA) * DEST */\r\n public static readonly ALPHA_PREMULTIPLIED = Constants.ALPHA_PREMULTIPLIED;\r\n /**\r\n * Defines that alpha blending to SRC + (1 - SRC ALPHA) * DEST\r\n * Alpha will be set to (1 - SRC ALPHA) * DEST ALPHA\r\n */\r\n public static readonly ALPHA_PREMULTIPLIED_PORTERDUFF = Constants.ALPHA_PREMULTIPLIED_PORTERDUFF;\r\n /** Defines that alpha blending to CST * SRC + (1 - CST) * DEST */\r\n public static readonly ALPHA_INTERPOLATE = Constants.ALPHA_INTERPOLATE;\r\n /**\r\n * Defines that alpha blending to SRC + (1 - SRC) * DEST\r\n * Alpha will be set to SRC ALPHA + (1 - SRC ALPHA) * DEST ALPHA\r\n */\r\n public static readonly ALPHA_SCREENMODE = Constants.ALPHA_SCREENMODE;\r\n\r\n /** Defines that the resource is not delayed*/\r\n public static readonly DELAYLOADSTATE_NONE = Constants.DELAYLOADSTATE_NONE;\r\n /** Defines that the resource was successfully delay loaded */\r\n public static readonly DELAYLOADSTATE_LOADED = Constants.DELAYLOADSTATE_LOADED;\r\n /** Defines that the resource is currently delay loading */\r\n public static readonly DELAYLOADSTATE_LOADING = Constants.DELAYLOADSTATE_LOADING;\r\n /** Defines that the resource is delayed and has not started loading */\r\n public static readonly DELAYLOADSTATE_NOTLOADED = Constants.DELAYLOADSTATE_NOTLOADED;\r\n\r\n // Depht or Stencil test Constants.\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will never pass. i.e. Nothing will be drawn */\r\n public static readonly NEVER = Constants.NEVER;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will always pass. i.e. Pixels will be drawn in the order they are drawn */\r\n public static readonly ALWAYS = Constants.ALWAYS;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than the stored value */\r\n public static readonly LESS = Constants.LESS;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is equals to the stored value */\r\n public static readonly EQUAL = Constants.EQUAL;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than or equal to the stored value */\r\n public static readonly LEQUAL = Constants.LEQUAL;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than the stored value */\r\n public static readonly GREATER = Constants.GREATER;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than or equal to the stored value */\r\n public static readonly GEQUAL = Constants.GEQUAL;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is not equal to the stored value */\r\n public static readonly NOTEQUAL = Constants.NOTEQUAL;\r\n\r\n // Stencil Actions Constants.\r\n /** Passed to stencilOperation to specify that stencil value must be kept */\r\n public static readonly KEEP = Constants.KEEP;\r\n /** Passed to stencilOperation to specify that stencil value must be replaced */\r\n public static readonly REPLACE = Constants.REPLACE;\r\n /** Passed to stencilOperation to specify that stencil value must be incremented */\r\n public static readonly INCR = Constants.INCR;\r\n /** Passed to stencilOperation to specify that stencil value must be decremented */\r\n public static readonly DECR = Constants.DECR;\r\n /** Passed to stencilOperation to specify that stencil value must be inverted */\r\n public static readonly INVERT = Constants.INVERT;\r\n /** Passed to stencilOperation to specify that stencil value must be incremented with wrapping */\r\n public static readonly INCR_WRAP = Constants.INCR_WRAP;\r\n /** Passed to stencilOperation to specify that stencil value must be decremented with wrapping */\r\n public static readonly DECR_WRAP = Constants.DECR_WRAP;\r\n\r\n /** Texture is not repeating outside of 0..1 UVs */\r\n public static readonly TEXTURE_CLAMP_ADDRESSMODE = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n /** Texture is repeating outside of 0..1 UVs */\r\n public static readonly TEXTURE_WRAP_ADDRESSMODE = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n /** Texture is repeating and mirrored */\r\n public static readonly TEXTURE_MIRROR_ADDRESSMODE = Constants.TEXTURE_MIRROR_ADDRESSMODE;\r\n\r\n /** ALPHA */\r\n public static readonly TEXTUREFORMAT_ALPHA = Constants.TEXTUREFORMAT_ALPHA;\r\n /** LUMINANCE */\r\n public static readonly TEXTUREFORMAT_LUMINANCE = Constants.TEXTUREFORMAT_LUMINANCE;\r\n /** LUMINANCE_ALPHA */\r\n public static readonly TEXTUREFORMAT_LUMINANCE_ALPHA = Constants.TEXTUREFORMAT_LUMINANCE_ALPHA;\r\n /** RGB */\r\n public static readonly TEXTUREFORMAT_RGB = Constants.TEXTUREFORMAT_RGB;\r\n /** RGBA */\r\n public static readonly TEXTUREFORMAT_RGBA = Constants.TEXTUREFORMAT_RGBA;\r\n /** RED */\r\n public static readonly TEXTUREFORMAT_RED = Constants.TEXTUREFORMAT_RED;\r\n /** RED (2nd reference) */\r\n public static readonly TEXTUREFORMAT_R = Constants.TEXTUREFORMAT_R;\r\n /** RG */\r\n public static readonly TEXTUREFORMAT_RG = Constants.TEXTUREFORMAT_RG;\r\n /** RED_INTEGER */\r\n public static readonly TEXTUREFORMAT_RED_INTEGER = Constants.TEXTUREFORMAT_RED_INTEGER;\r\n /** RED_INTEGER (2nd reference) */\r\n public static readonly TEXTUREFORMAT_R_INTEGER = Constants.TEXTUREFORMAT_R_INTEGER;\r\n /** RG_INTEGER */\r\n public static readonly TEXTUREFORMAT_RG_INTEGER = Constants.TEXTUREFORMAT_RG_INTEGER;\r\n /** RGB_INTEGER */\r\n public static readonly TEXTUREFORMAT_RGB_INTEGER = Constants.TEXTUREFORMAT_RGB_INTEGER;\r\n /** RGBA_INTEGER */\r\n public static readonly TEXTUREFORMAT_RGBA_INTEGER = Constants.TEXTUREFORMAT_RGBA_INTEGER;\r\n\r\n /** UNSIGNED_BYTE */\r\n public static readonly TEXTURETYPE_UNSIGNED_BYTE = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n /** UNSIGNED_BYTE (2nd reference) */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n /** FLOAT */\r\n public static readonly TEXTURETYPE_FLOAT = Constants.TEXTURETYPE_FLOAT;\r\n /** HALF_FLOAT */\r\n public static readonly TEXTURETYPE_HALF_FLOAT = Constants.TEXTURETYPE_HALF_FLOAT;\r\n /** BYTE */\r\n public static readonly TEXTURETYPE_BYTE = Constants.TEXTURETYPE_BYTE;\r\n /** SHORT */\r\n public static readonly TEXTURETYPE_SHORT = Constants.TEXTURETYPE_SHORT;\r\n /** UNSIGNED_SHORT */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT = Constants.TEXTURETYPE_UNSIGNED_SHORT;\r\n /** INT */\r\n public static readonly TEXTURETYPE_INT = Constants.TEXTURETYPE_INT;\r\n /** UNSIGNED_INT */\r\n public static readonly TEXTURETYPE_UNSIGNED_INTEGER = Constants.TEXTURETYPE_UNSIGNED_INTEGER;\r\n /** UNSIGNED_SHORT_4_4_4_4 */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4 = Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4;\r\n /** UNSIGNED_SHORT_5_5_5_1 */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1 = Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1;\r\n /** UNSIGNED_SHORT_5_6_5 */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT_5_6_5 = Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5;\r\n /** UNSIGNED_INT_2_10_10_10_REV */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV = Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV;\r\n /** UNSIGNED_INT_24_8 */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_24_8 = Constants.TEXTURETYPE_UNSIGNED_INT_24_8;\r\n /** UNSIGNED_INT_10F_11F_11F_REV */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV = Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV;\r\n /** UNSIGNED_INT_5_9_9_9_REV */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV = Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV;\r\n /** FLOAT_32_UNSIGNED_INT_24_8_REV */\r\n public static readonly TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV = Constants.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV;\r\n\r\n /** nearest is mag = nearest and min = nearest and mip = none */\r\n public static readonly TEXTURE_NEAREST_SAMPLINGMODE = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n /** Bilinear is mag = linear and min = linear and mip = nearest */\r\n public static readonly TEXTURE_BILINEAR_SAMPLINGMODE = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n /** Trilinear is mag = linear and min = linear and mip = linear */\r\n public static readonly TEXTURE_TRILINEAR_SAMPLINGMODE = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n /** nearest is mag = nearest and min = nearest and mip = linear */\r\n public static readonly TEXTURE_NEAREST_NEAREST_MIPLINEAR = Constants.TEXTURE_NEAREST_NEAREST_MIPLINEAR;\r\n /** Bilinear is mag = linear and min = linear and mip = nearest */\r\n public static readonly TEXTURE_LINEAR_LINEAR_MIPNEAREST = Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST;\r\n /** Trilinear is mag = linear and min = linear and mip = linear */\r\n public static readonly TEXTURE_LINEAR_LINEAR_MIPLINEAR = Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR;\r\n /** mag = nearest and min = nearest and mip = nearest */\r\n public static readonly TEXTURE_NEAREST_NEAREST_MIPNEAREST = Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST;\r\n /** mag = nearest and min = linear and mip = nearest */\r\n public static readonly TEXTURE_NEAREST_LINEAR_MIPNEAREST = Constants.TEXTURE_NEAREST_LINEAR_MIPNEAREST;\r\n /** mag = nearest and min = linear and mip = linear */\r\n public static readonly TEXTURE_NEAREST_LINEAR_MIPLINEAR = Constants.TEXTURE_NEAREST_LINEAR_MIPLINEAR;\r\n /** mag = nearest and min = linear and mip = none */\r\n public static readonly TEXTURE_NEAREST_LINEAR = Constants.TEXTURE_NEAREST_LINEAR;\r\n /** mag = nearest and min = nearest and mip = none */\r\n public static readonly TEXTURE_NEAREST_NEAREST = Constants.TEXTURE_NEAREST_NEAREST;\r\n /** mag = linear and min = nearest and mip = nearest */\r\n public static readonly TEXTURE_LINEAR_NEAREST_MIPNEAREST = Constants.TEXTURE_LINEAR_NEAREST_MIPNEAREST;\r\n /** mag = linear and min = nearest and mip = linear */\r\n public static readonly TEXTURE_LINEAR_NEAREST_MIPLINEAR = Constants.TEXTURE_LINEAR_NEAREST_MIPLINEAR;\r\n /** mag = linear and min = linear and mip = none */\r\n public static readonly TEXTURE_LINEAR_LINEAR = Constants.TEXTURE_LINEAR_LINEAR;\r\n /** mag = linear and min = nearest and mip = none */\r\n public static readonly TEXTURE_LINEAR_NEAREST = Constants.TEXTURE_LINEAR_NEAREST;\r\n\r\n /** Explicit coordinates mode */\r\n public static readonly TEXTURE_EXPLICIT_MODE = Constants.TEXTURE_EXPLICIT_MODE;\r\n /** Spherical coordinates mode */\r\n public static readonly TEXTURE_SPHERICAL_MODE = Constants.TEXTURE_SPHERICAL_MODE;\r\n /** Planar coordinates mode */\r\n public static readonly TEXTURE_PLANAR_MODE = Constants.TEXTURE_PLANAR_MODE;\r\n /** Cubic coordinates mode */\r\n public static readonly TEXTURE_CUBIC_MODE = Constants.TEXTURE_CUBIC_MODE;\r\n /** Projection coordinates mode */\r\n public static readonly TEXTURE_PROJECTION_MODE = Constants.TEXTURE_PROJECTION_MODE;\r\n /** Skybox coordinates mode */\r\n public static readonly TEXTURE_SKYBOX_MODE = Constants.TEXTURE_SKYBOX_MODE;\r\n /** Inverse Cubic coordinates mode */\r\n public static readonly TEXTURE_INVCUBIC_MODE = Constants.TEXTURE_INVCUBIC_MODE;\r\n /** Equirectangular coordinates mode */\r\n public static readonly TEXTURE_EQUIRECTANGULAR_MODE = Constants.TEXTURE_EQUIRECTANGULAR_MODE;\r\n /** Equirectangular Fixed coordinates mode */\r\n public static readonly TEXTURE_FIXED_EQUIRECTANGULAR_MODE = Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MODE;\r\n /** Equirectangular Fixed Mirrored coordinates mode */\r\n public static readonly TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE = Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE;\r\n\r\n // Texture rescaling mode\r\n /** Defines that texture rescaling will use a floor to find the closer power of 2 size */\r\n public static readonly SCALEMODE_FLOOR = Constants.SCALEMODE_FLOOR;\r\n /** Defines that texture rescaling will look for the nearest power of 2 size */\r\n public static readonly SCALEMODE_NEAREST = Constants.SCALEMODE_NEAREST;\r\n /** Defines that texture rescaling will use a ceil to find the closer power of 2 size */\r\n public static readonly SCALEMODE_CEILING = Constants.SCALEMODE_CEILING;\r\n\r\n /**\r\n * Returns the current npm package of the sdk\r\n */\r\n // Not mixed with Version for tooling purpose.\r\n public static get NpmPackage(): string {\r\n return ThinEngine.NpmPackage;\r\n }\r\n\r\n /**\r\n * Returns the current version of the framework\r\n */\r\n public static get Version(): string {\r\n return ThinEngine.Version;\r\n }\r\n\r\n /** Gets the list of created engines */\r\n public static get Instances(): Engine[] {\r\n return EngineStore.Instances;\r\n }\r\n\r\n /**\r\n * Gets the latest created engine\r\n */\r\n public static get LastCreatedEngine(): Nullable {\r\n return EngineStore.LastCreatedEngine;\r\n }\r\n\r\n /**\r\n * Gets the latest created scene\r\n */\r\n public static get LastCreatedScene(): Nullable {\r\n return EngineStore.LastCreatedScene;\r\n }\r\n\r\n /** @internal */\r\n /**\r\n * Engine abstraction for loading and creating an image bitmap from a given source string.\r\n * @param imageSource source to load the image from.\r\n * @param options An object that sets options for the image's extraction.\r\n * @returns ImageBitmap.\r\n */\r\n public _createImageBitmapFromSource(imageSource: string, options?: ImageBitmapOptions): Promise {\r\n const promise = new Promise((resolve, reject) => {\r\n const image = new Image();\r\n image.onload = () => {\r\n image.decode().then(() => {\r\n this.createImageBitmap(image, options).then((imageBitmap) => {\r\n resolve(imageBitmap);\r\n });\r\n });\r\n };\r\n image.onerror = () => {\r\n reject(`Error loading image ${image.src}`);\r\n };\r\n\r\n image.src = imageSource;\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * Engine abstraction for createImageBitmap\r\n * @param image source for image\r\n * @param options An object that sets options for the image's extraction.\r\n * @returns ImageBitmap\r\n */\r\n public createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise {\r\n return createImageBitmap(image, options);\r\n }\r\n\r\n /**\r\n * Resize an image and returns the image data as an uint8array\r\n * @param image image to resize\r\n * @param bufferWidth destination buffer width\r\n * @param bufferHeight destination buffer height\r\n * @returns an uint8array containing RGBA values of bufferWidth * bufferHeight size\r\n */\r\n public resizeImageBitmap(image: HTMLImageElement | ImageBitmap, bufferWidth: number, bufferHeight: number): Uint8Array {\r\n const canvas = this.createCanvas(bufferWidth, bufferHeight);\r\n const context = canvas.getContext(\"2d\");\r\n\r\n if (!context) {\r\n throw new Error(\"Unable to get 2d context for resizeImageBitmap\");\r\n }\r\n\r\n context.drawImage(image, 0, 0);\r\n\r\n // Create VertexData from map data\r\n // Cast is due to wrong definition in lib.d.ts from ts 1.3 - https://github.com/Microsoft/TypeScript/issues/949\r\n const buffer = (context.getImageData(0, 0, bufferWidth, bufferHeight).data);\r\n return buffer;\r\n }\r\n\r\n /**\r\n * Will flag all materials in all scenes in all engines as dirty to trigger new shader compilation\r\n * @param flag defines which part of the materials must be marked as dirty\r\n * @param predicate defines a predicate used to filter which materials should be affected\r\n */\r\n public static MarkAllMaterialsAsDirty(flag: number, predicate?: (mat: Material) => boolean): void {\r\n for (let engineIndex = 0; engineIndex < Engine.Instances.length; engineIndex++) {\r\n const engine = Engine.Instances[engineIndex];\r\n\r\n for (let sceneIndex = 0; sceneIndex < engine.scenes.length; sceneIndex++) {\r\n engine.scenes[sceneIndex].markAllMaterialsAsDirty(flag, predicate);\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Method called to create the default loading screen.\r\n * This can be overridden in your own app.\r\n * @param canvas The rendering canvas element\r\n * @returns The loading screen\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static DefaultLoadingScreenFactory(canvas: HTMLCanvasElement): ILoadingScreen {\r\n throw _WarnImport(\"LoadingScreen\");\r\n }\r\n\r\n /**\r\n * Method called to create the default rescale post process on each engine.\r\n */\r\n public static _RescalePostProcessFactory: Nullable<(engine: Engine) => PostProcess> = null;\r\n\r\n // Members\r\n\r\n /**\r\n * Gets or sets a boolean to enable/disable IndexedDB support and avoid XHR on .manifest\r\n **/\r\n public enableOfflineSupport = false;\r\n\r\n /**\r\n * Gets or sets a boolean to enable/disable checking manifest if IndexedDB support is enabled (js will always consider the database is up to date)\r\n **/\r\n public disableManifestCheck = false;\r\n\r\n /**\r\n * Gets or sets a boolean to enable/disable the context menu (right-click) from appearing on the main canvas\r\n */\r\n public disableContextMenu: boolean = true;\r\n\r\n /**\r\n * Gets the list of created scenes\r\n */\r\n public scenes: Scene[] = [];\r\n\r\n /** @internal */\r\n public _virtualScenes = new Array();\r\n\r\n /**\r\n * Event raised when a new scene is created\r\n */\r\n public onNewSceneAddedObservable = new Observable();\r\n\r\n /**\r\n * Gets the list of created postprocesses\r\n */\r\n public postProcesses: PostProcess[] = [];\r\n\r\n /**\r\n * Gets a boolean indicating if the pointer is currently locked\r\n */\r\n public isPointerLock = false;\r\n\r\n // Observables\r\n\r\n /**\r\n * Observable event triggered each time the rendering canvas is resized\r\n */\r\n public onResizeObservable = new Observable();\r\n\r\n /**\r\n * Observable event triggered each time the canvas loses focus\r\n */\r\n public onCanvasBlurObservable = new Observable();\r\n\r\n /**\r\n * Observable event triggered each time the canvas gains focus\r\n */\r\n public onCanvasFocusObservable = new Observable();\r\n\r\n /**\r\n * Observable event triggered each time the canvas receives pointerout event\r\n */\r\n public onCanvasPointerOutObservable = new Observable();\r\n\r\n /**\r\n * Observable raised when the engine begins a new frame\r\n */\r\n public onBeginFrameObservable = new Observable();\r\n\r\n /**\r\n * If set, will be used to request the next animation frame for the render loop\r\n */\r\n public customAnimationFrameRequester: Nullable = null;\r\n\r\n /**\r\n * Observable raised when the engine ends the current frame\r\n */\r\n public onEndFrameObservable = new Observable();\r\n\r\n /**\r\n * Observable raised when the engine is about to compile a shader\r\n */\r\n public onBeforeShaderCompilationObservable = new Observable();\r\n\r\n /**\r\n * Observable raised when the engine has just compiled a shader\r\n */\r\n public onAfterShaderCompilationObservable = new Observable();\r\n\r\n /**\r\n * Gets the audio engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/audio/playingSoundsMusic\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static audioEngine: Nullable;\r\n\r\n /**\r\n * Default AudioEngine factory responsible of creating the Audio Engine.\r\n * By default, this will create a BabylonJS Audio Engine if the workload has been embedded.\r\n */\r\n public static AudioEngineFactory: (\r\n hostElement: Nullable,\r\n audioContext: Nullable,\r\n audioDestination: Nullable\r\n ) => IAudioEngine;\r\n\r\n /**\r\n * Default offline support factory responsible of creating a tool used to store data locally.\r\n * By default, this will create a Database object if the workload has been embedded.\r\n */\r\n public static OfflineProviderFactory: (urlToScene: string, callbackManifestChecked: (checked: boolean) => any, disableManifestCheck: boolean) => IOfflineProvider;\r\n\r\n private _loadingScreen: ILoadingScreen;\r\n private _pointerLockRequested: boolean;\r\n private _rescalePostProcess: Nullable;\r\n\r\n // Deterministic lockstepMaxSteps\r\n protected _deterministicLockstep: boolean = false;\r\n protected _lockstepMaxSteps: number = 4;\r\n protected _timeStep: number = 1 / 60;\r\n\r\n protected get _supportsHardwareTextureRescaling() {\r\n return !!Engine._RescalePostProcessFactory;\r\n }\r\n\r\n // FPS\r\n private _fps = 60;\r\n private _deltaTime = 0;\r\n\r\n /** @internal */\r\n public _drawCalls = new PerfCounter();\r\n\r\n /** Gets or sets the tab index to set to the rendering canvas. 1 is the minimum value to set to be able to capture keyboard events */\r\n public canvasTabIndex = 1;\r\n\r\n /**\r\n * Turn this value on if you want to pause FPS computation when in background\r\n */\r\n public disablePerformanceMonitorInBackground = false;\r\n\r\n private _performanceMonitor = new PerformanceMonitor();\r\n /**\r\n * Gets the performance monitor attached to this engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation\r\n */\r\n public get performanceMonitor(): PerformanceMonitor {\r\n return this._performanceMonitor;\r\n }\r\n\r\n // Focus\r\n private _onFocus: () => void;\r\n private _onBlur: () => void;\r\n private _onCanvasPointerOut: (event: PointerEvent) => void;\r\n private _onCanvasBlur: () => void;\r\n private _onCanvasFocus: () => void;\r\n private _onCanvasContextMenu: (evt: Event) => void;\r\n\r\n private _onFullscreenChange: () => void;\r\n private _onPointerLockChange: () => void;\r\n\r\n protected _compatibilityMode = true;\r\n\r\n /**\r\n * (WebGPU only) True (default) to be in compatibility mode, meaning rendering all existing scenes without artifacts (same rendering than WebGL).\r\n * Setting the property to false will improve performances but may not work in some scenes if some precautions are not taken.\r\n * See https://doc.babylonjs.com/setup/support/webGPU/webGPUOptimization/webGPUNonCompatibilityMode for more details\r\n */\r\n public get compatibilityMode() {\r\n return this._compatibilityMode;\r\n }\r\n\r\n public set compatibilityMode(mode: boolean) {\r\n // not supported in WebGL\r\n this._compatibilityMode = true;\r\n }\r\n\r\n // Events\r\n\r\n /**\r\n * Gets the HTML element used to attach event listeners\r\n * @returns a HTML element\r\n */\r\n public getInputElement(): Nullable {\r\n return this._renderingCanvas;\r\n }\r\n\r\n /**\r\n * Creates a new engine\r\n * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which already used the WebGL context\r\n * @param antialias defines enable antialiasing (default: false)\r\n * @param options defines further options to be sent to the getContext() function\r\n * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n constructor(\r\n canvasOrContext: Nullable,\r\n antialias?: boolean,\r\n options?: EngineOptions,\r\n adaptToDeviceRatio: boolean = false\r\n ) {\r\n super(canvasOrContext, antialias, options, adaptToDeviceRatio);\r\n\r\n Engine.Instances.push(this);\r\n\r\n if (!canvasOrContext) {\r\n return;\r\n }\r\n\r\n this._features.supportRenderPasses = true;\r\n\r\n options = this._creationOptions;\r\n\r\n if ((canvasOrContext).getContext) {\r\n const canvas = canvasOrContext;\r\n\r\n this._sharedInit(canvas);\r\n }\r\n }\r\n\r\n protected _initGLContext(): void {\r\n super._initGLContext();\r\n\r\n this._rescalePostProcess = null;\r\n }\r\n\r\n /**\r\n * Shared initialization across engines types.\r\n * @param canvas The canvas associated with this instance of the engine.\r\n */\r\n protected _sharedInit(canvas: HTMLCanvasElement) {\r\n super._sharedInit(canvas);\r\n\r\n this._onCanvasFocus = () => {\r\n this.onCanvasFocusObservable.notifyObservers(this);\r\n };\r\n\r\n this._onCanvasBlur = () => {\r\n this.onCanvasBlurObservable.notifyObservers(this);\r\n };\r\n\r\n this._onCanvasContextMenu = (evt: Event) => {\r\n if (this.disableContextMenu) {\r\n evt.preventDefault();\r\n }\r\n };\r\n\r\n canvas.addEventListener(\"focus\", this._onCanvasFocus);\r\n canvas.addEventListener(\"blur\", this._onCanvasBlur);\r\n canvas.addEventListener(\"contextmenu\", this._onCanvasContextMenu);\r\n\r\n this._onBlur = () => {\r\n if (this.disablePerformanceMonitorInBackground) {\r\n this._performanceMonitor.disable();\r\n }\r\n this._windowIsBackground = true;\r\n };\r\n\r\n this._onFocus = () => {\r\n if (this.disablePerformanceMonitorInBackground) {\r\n this._performanceMonitor.enable();\r\n }\r\n this._windowIsBackground = false;\r\n };\r\n\r\n this._onCanvasPointerOut = (ev) => {\r\n // Check that the element at the point of the pointer out isn't the canvas and if it isn't, notify observers\r\n // Note: This is a workaround for a bug with Safari\r\n if (document.elementFromPoint(ev.clientX, ev.clientY) !== canvas) {\r\n this.onCanvasPointerOutObservable.notifyObservers(ev);\r\n }\r\n };\r\n\r\n const hostWindow = this.getHostWindow(); // it calls IsWindowObjectExist()\r\n if (hostWindow && typeof hostWindow.addEventListener === \"function\") {\r\n hostWindow.addEventListener(\"blur\", this._onBlur);\r\n hostWindow.addEventListener(\"focus\", this._onFocus);\r\n }\r\n\r\n canvas.addEventListener(\"pointerout\", this._onCanvasPointerOut);\r\n\r\n if (!this._creationOptions.doNotHandleTouchAction) {\r\n this._disableTouchAction();\r\n }\r\n\r\n // Create Audio Engine if needed.\r\n if (!Engine.audioEngine && this._creationOptions.audioEngine && Engine.AudioEngineFactory) {\r\n Engine.audioEngine = Engine.AudioEngineFactory(this.getRenderingCanvas(), this.getAudioContext(), this.getAudioDestination());\r\n }\r\n if (IsDocumentAvailable()) {\r\n // Fullscreen\r\n this._onFullscreenChange = () => {\r\n this.isFullscreen = !!document.fullscreenElement;\r\n\r\n // Pointer lock\r\n if (this.isFullscreen && this._pointerLockRequested && canvas) {\r\n Engine._RequestPointerlock(canvas);\r\n }\r\n };\r\n\r\n document.addEventListener(\"fullscreenchange\", this._onFullscreenChange, false);\r\n document.addEventListener(\"webkitfullscreenchange\", this._onFullscreenChange, false);\r\n\r\n // Pointer lock\r\n this._onPointerLockChange = () => {\r\n this.isPointerLock = document.pointerLockElement === canvas;\r\n };\r\n\r\n document.addEventListener(\"pointerlockchange\", this._onPointerLockChange, false);\r\n document.addEventListener(\"webkitpointerlockchange\", this._onPointerLockChange, false);\r\n }\r\n\r\n this.enableOfflineSupport = Engine.OfflineProviderFactory !== undefined;\r\n\r\n this._deterministicLockstep = !!this._creationOptions.deterministicLockstep;\r\n this._lockstepMaxSteps = this._creationOptions.lockstepMaxSteps || 0;\r\n this._timeStep = this._creationOptions.timeStep || 1 / 60;\r\n }\r\n\r\n /** @internal */\r\n public _verifyPointerLock(): void {\r\n this._onPointerLockChange?.();\r\n }\r\n\r\n /**\r\n * Gets current aspect ratio\r\n * @param viewportOwner defines the camera to use to get the aspect ratio\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the aspect ratio\r\n */\r\n public getAspectRatio(viewportOwner: IViewportOwnerLike, useScreen = false): number {\r\n const viewport = viewportOwner.viewport;\r\n return (this.getRenderWidth(useScreen) * viewport.width) / (this.getRenderHeight(useScreen) * viewport.height);\r\n }\r\n\r\n /**\r\n * Gets current screen aspect ratio\r\n * @returns a number defining the aspect ratio\r\n */\r\n public getScreenAspectRatio(): number {\r\n return this.getRenderWidth(true) / this.getRenderHeight(true);\r\n }\r\n\r\n /**\r\n * Gets the client rect of the HTML canvas attached with the current webGL context\r\n * @returns a client rectangle\r\n */\r\n public getRenderingCanvasClientRect(): Nullable {\r\n if (!this._renderingCanvas) {\r\n return null;\r\n }\r\n return this._renderingCanvas.getBoundingClientRect();\r\n }\r\n\r\n /**\r\n * Gets the client rect of the HTML element used for events\r\n * @returns a client rectangle\r\n */\r\n public getInputElementClientRect(): Nullable {\r\n if (!this._renderingCanvas) {\r\n return null;\r\n }\r\n return this.getInputElement()!.getBoundingClientRect();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the engine is running in deterministic lock step mode\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @returns true if engine is in deterministic lock step mode\r\n */\r\n public isDeterministicLockStep(): boolean {\r\n return this._deterministicLockstep;\r\n }\r\n\r\n /**\r\n * Gets the max steps when engine is running in deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @returns the max steps\r\n */\r\n public getLockstepMaxSteps(): number {\r\n return this._lockstepMaxSteps;\r\n }\r\n\r\n /**\r\n * Returns the time in ms between steps when using deterministic lock step.\r\n * @returns time step in (ms)\r\n */\r\n public getTimeStep(): number {\r\n return this._timeStep * 1000;\r\n }\r\n\r\n /**\r\n * Force the mipmap generation for the given render target texture\r\n * @param texture defines the render target texture to use\r\n * @param unbind defines whether or not to unbind the texture after generation. Defaults to true.\r\n */\r\n public generateMipMapsForCubemap(texture: InternalTexture, unbind = true) {\r\n if (texture.generateMipMaps) {\r\n const gl = this._gl;\r\n this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, texture, true);\r\n gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\r\n if (unbind) {\r\n this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, null);\r\n }\r\n }\r\n }\r\n\r\n /** States */\r\n\r\n /**\r\n * Gets a boolean indicating if depth writing is enabled\r\n * @returns the current depth writing state\r\n */\r\n public getDepthWrite(): boolean {\r\n return this._depthCullingState.depthMask;\r\n }\r\n\r\n /**\r\n * Enable or disable depth writing\r\n * @param enable defines the state to set\r\n */\r\n public setDepthWrite(enable: boolean): void {\r\n this._depthCullingState.depthMask = enable;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if stencil buffer is enabled\r\n * @returns the current stencil buffer state\r\n */\r\n public getStencilBuffer(): boolean {\r\n return this._stencilState.stencilTest;\r\n }\r\n\r\n /**\r\n * Enable or disable the stencil buffer\r\n * @param enable defines if the stencil buffer must be enabled or disabled\r\n */\r\n public setStencilBuffer(enable: boolean): void {\r\n this._stencilState.stencilTest = enable;\r\n }\r\n\r\n /**\r\n * Gets the current stencil mask\r\n * @returns a number defining the new stencil mask to use\r\n */\r\n public getStencilMask(): number {\r\n return this._stencilState.stencilMask;\r\n }\r\n\r\n /**\r\n * Sets the current stencil mask\r\n * @param mask defines the new stencil mask to use\r\n */\r\n public setStencilMask(mask: number): void {\r\n this._stencilState.stencilMask = mask;\r\n }\r\n\r\n /**\r\n * Gets the current stencil function\r\n * @returns a number defining the stencil function to use\r\n */\r\n public getStencilFunction(): number {\r\n return this._stencilState.stencilFunc;\r\n }\r\n\r\n /**\r\n * Gets the current stencil reference value\r\n * @returns a number defining the stencil reference value to use\r\n */\r\n public getStencilFunctionReference(): number {\r\n return this._stencilState.stencilFuncRef;\r\n }\r\n\r\n /**\r\n * Gets the current stencil mask\r\n * @returns a number defining the stencil mask to use\r\n */\r\n public getStencilFunctionMask(): number {\r\n return this._stencilState.stencilFuncMask;\r\n }\r\n\r\n /**\r\n * Sets the current stencil function\r\n * @param stencilFunc defines the new stencil function to use\r\n */\r\n public setStencilFunction(stencilFunc: number) {\r\n this._stencilState.stencilFunc = stencilFunc;\r\n }\r\n\r\n /**\r\n * Sets the current stencil reference\r\n * @param reference defines the new stencil reference to use\r\n */\r\n public setStencilFunctionReference(reference: number) {\r\n this._stencilState.stencilFuncRef = reference;\r\n }\r\n\r\n /**\r\n * Sets the current stencil mask\r\n * @param mask defines the new stencil mask to use\r\n */\r\n public setStencilFunctionMask(mask: number) {\r\n this._stencilState.stencilFuncMask = mask;\r\n }\r\n\r\n /**\r\n * Gets the current stencil operation when stencil fails\r\n * @returns a number defining stencil operation to use when stencil fails\r\n */\r\n public getStencilOperationFail(): number {\r\n return this._stencilState.stencilOpStencilFail;\r\n }\r\n\r\n /**\r\n * Gets the current stencil operation when depth fails\r\n * @returns a number defining stencil operation to use when depth fails\r\n */\r\n public getStencilOperationDepthFail(): number {\r\n return this._stencilState.stencilOpDepthFail;\r\n }\r\n\r\n /**\r\n * Gets the current stencil operation when stencil passes\r\n * @returns a number defining stencil operation to use when stencil passes\r\n */\r\n public getStencilOperationPass(): number {\r\n return this._stencilState.stencilOpStencilDepthPass;\r\n }\r\n\r\n /**\r\n * Sets the stencil operation to use when stencil fails\r\n * @param operation defines the stencil operation to use when stencil fails\r\n */\r\n public setStencilOperationFail(operation: number): void {\r\n this._stencilState.stencilOpStencilFail = operation;\r\n }\r\n\r\n /**\r\n * Sets the stencil operation to use when depth fails\r\n * @param operation defines the stencil operation to use when depth fails\r\n */\r\n public setStencilOperationDepthFail(operation: number): void {\r\n this._stencilState.stencilOpDepthFail = operation;\r\n }\r\n\r\n /**\r\n * Sets the stencil operation to use when stencil passes\r\n * @param operation defines the stencil operation to use when stencil passes\r\n */\r\n public setStencilOperationPass(operation: number): void {\r\n this._stencilState.stencilOpStencilDepthPass = operation;\r\n }\r\n\r\n /**\r\n * Sets a boolean indicating if the dithering state is enabled or disabled\r\n * @param value defines the dithering state\r\n */\r\n public setDitheringState(value: boolean): void {\r\n if (value) {\r\n this._gl.enable(this._gl.DITHER);\r\n } else {\r\n this._gl.disable(this._gl.DITHER);\r\n }\r\n }\r\n\r\n /**\r\n * Sets a boolean indicating if the rasterizer state is enabled or disabled\r\n * @param value defines the rasterizer state\r\n */\r\n public setRasterizerState(value: boolean): void {\r\n if (value) {\r\n this._gl.disable(this._gl.RASTERIZER_DISCARD);\r\n } else {\r\n this._gl.enable(this._gl.RASTERIZER_DISCARD);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current depth function\r\n * @returns a number defining the depth function\r\n */\r\n public getDepthFunction(): Nullable {\r\n return this._depthCullingState.depthFunc;\r\n }\r\n\r\n /**\r\n * Sets the current depth function\r\n * @param depthFunc defines the function to use\r\n */\r\n public setDepthFunction(depthFunc: number) {\r\n this._depthCullingState.depthFunc = depthFunc;\r\n }\r\n\r\n /**\r\n * Sets the current depth function to GREATER\r\n */\r\n public setDepthFunctionToGreater(): void {\r\n this.setDepthFunction(Constants.GREATER);\r\n }\r\n\r\n /**\r\n * Sets the current depth function to GEQUAL\r\n */\r\n public setDepthFunctionToGreaterOrEqual(): void {\r\n this.setDepthFunction(Constants.GEQUAL);\r\n }\r\n\r\n /**\r\n * Sets the current depth function to LESS\r\n */\r\n public setDepthFunctionToLess(): void {\r\n this.setDepthFunction(Constants.LESS);\r\n }\r\n\r\n /**\r\n * Sets the current depth function to LEQUAL\r\n */\r\n public setDepthFunctionToLessOrEqual(): void {\r\n this.setDepthFunction(Constants.LEQUAL);\r\n }\r\n\r\n private _cachedStencilBuffer: boolean;\r\n private _cachedStencilFunction: number;\r\n private _cachedStencilMask: number;\r\n private _cachedStencilOperationPass: number;\r\n private _cachedStencilOperationFail: number;\r\n private _cachedStencilOperationDepthFail: number;\r\n private _cachedStencilReference: number;\r\n\r\n /**\r\n * Caches the state of the stencil buffer\r\n */\r\n public cacheStencilState() {\r\n this._cachedStencilBuffer = this.getStencilBuffer();\r\n this._cachedStencilFunction = this.getStencilFunction();\r\n this._cachedStencilMask = this.getStencilMask();\r\n this._cachedStencilOperationPass = this.getStencilOperationPass();\r\n this._cachedStencilOperationFail = this.getStencilOperationFail();\r\n this._cachedStencilOperationDepthFail = this.getStencilOperationDepthFail();\r\n this._cachedStencilReference = this.getStencilFunctionReference();\r\n }\r\n\r\n /**\r\n * Restores the state of the stencil buffer\r\n */\r\n public restoreStencilState() {\r\n this.setStencilFunction(this._cachedStencilFunction);\r\n this.setStencilMask(this._cachedStencilMask);\r\n this.setStencilBuffer(this._cachedStencilBuffer);\r\n this.setStencilOperationPass(this._cachedStencilOperationPass);\r\n this.setStencilOperationFail(this._cachedStencilOperationFail);\r\n this.setStencilOperationDepthFail(this._cachedStencilOperationDepthFail);\r\n this.setStencilFunctionReference(this._cachedStencilReference);\r\n }\r\n\r\n /**\r\n * Directly set the WebGL Viewport\r\n * @param x defines the x coordinate of the viewport (in screen space)\r\n * @param y defines the y coordinate of the viewport (in screen space)\r\n * @param width defines the width of the viewport (in screen space)\r\n * @param height defines the height of the viewport (in screen space)\r\n * @returns the current viewport Object (if any) that is being replaced by this call. You can restore this viewport later on to go back to the original state\r\n */\r\n public setDirectViewport(x: number, y: number, width: number, height: number): Nullable {\r\n const currentViewport = this._cachedViewport;\r\n this._cachedViewport = null;\r\n\r\n this._viewport(x, y, width, height);\r\n\r\n return currentViewport;\r\n }\r\n\r\n /**\r\n * Executes a scissor clear (ie. a clear on a specific portion of the screen)\r\n * @param x defines the x-coordinate of the bottom left corner of the clear rectangle\r\n * @param y defines the y-coordinate of the corner of the clear rectangle\r\n * @param width defines the width of the clear rectangle\r\n * @param height defines the height of the clear rectangle\r\n * @param clearColor defines the clear color\r\n */\r\n public scissorClear(x: number, y: number, width: number, height: number, clearColor: IColor4Like): void {\r\n this.enableScissor(x, y, width, height);\r\n this.clear(clearColor, true, true, true);\r\n this.disableScissor();\r\n }\r\n\r\n /**\r\n * Enable scissor test on a specific rectangle (ie. render will only be executed on a specific portion of the screen)\r\n * @param x defines the x-coordinate of the bottom left corner of the clear rectangle\r\n * @param y defines the y-coordinate of the corner of the clear rectangle\r\n * @param width defines the width of the clear rectangle\r\n * @param height defines the height of the clear rectangle\r\n */\r\n public enableScissor(x: number, y: number, width: number, height: number): void {\r\n const gl = this._gl;\r\n\r\n // Change state\r\n gl.enable(gl.SCISSOR_TEST);\r\n gl.scissor(x, y, width, height);\r\n }\r\n\r\n /**\r\n * Disable previously set scissor test rectangle\r\n */\r\n public disableScissor() {\r\n const gl = this._gl;\r\n\r\n gl.disable(gl.SCISSOR_TEST);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _reportDrawCall(numDrawCalls = 1) {\r\n this._drawCalls.addCount(numDrawCalls, false);\r\n }\r\n\r\n public _loadFileAsync(url: string, offlineProvider?: IOfflineProvider, useArrayBuffer?: false): Promise;\r\n public _loadFileAsync(url: string, offlineProvider?: IOfflineProvider, useArrayBuffer?: true): Promise;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFileAsync(url: string, offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean): Promise {\r\n return new Promise((resolve, reject) => {\r\n this._loadFile(\r\n url,\r\n (data) => {\r\n resolve(data);\r\n },\r\n undefined,\r\n offlineProvider,\r\n useArrayBuffer,\r\n (request, exception) => {\r\n reject(exception);\r\n }\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Gets the source code of the vertex shader associated with a specific webGL program\r\n * @param program defines the program to use\r\n * @returns a string containing the source code of the vertex shader associated with the program\r\n */\r\n public getVertexShaderSource(program: WebGLProgram): Nullable {\r\n const shaders = this._gl.getAttachedShaders(program);\r\n\r\n if (!shaders) {\r\n return null;\r\n }\r\n\r\n return this._gl.getShaderSource(shaders[0]);\r\n }\r\n\r\n /**\r\n * Gets the source code of the fragment shader associated with a specific webGL program\r\n * @param program defines the program to use\r\n * @returns a string containing the source code of the fragment shader associated with the program\r\n */\r\n public getFragmentShaderSource(program: WebGLProgram): Nullable {\r\n const shaders = this._gl.getAttachedShaders(program);\r\n\r\n if (!shaders) {\r\n return null;\r\n }\r\n\r\n return this._gl.getShaderSource(shaders[1]);\r\n }\r\n\r\n /**\r\n * Sets a depth stencil texture from a render target to the according uniform.\r\n * @param channel The texture channel\r\n * @param uniform The uniform to set\r\n * @param texture The render target texture containing the depth stencil texture to apply\r\n * @param name The texture name\r\n */\r\n public setDepthStencilTexture(channel: number, uniform: Nullable, texture: Nullable, name?: string): void {\r\n if (channel === undefined) {\r\n return;\r\n }\r\n\r\n if (uniform) {\r\n this._boundUniforms[channel] = uniform;\r\n }\r\n\r\n if (!texture || !texture.depthStencilTexture) {\r\n this._setTexture(channel, null, undefined, undefined, name);\r\n } else {\r\n this._setTexture(channel, texture, false, true, name);\r\n }\r\n }\r\n\r\n /**\r\n * Sets a texture to the webGL context from a postprocess\r\n * @param channel defines the channel to use\r\n * @param postProcess defines the source postprocess\r\n * @param name name of the channel\r\n */\r\n public setTextureFromPostProcess(channel: number, postProcess: Nullable, name: string): void {\r\n let postProcessInput = null;\r\n if (postProcess) {\r\n if (postProcess._forcedOutputTexture) {\r\n postProcessInput = postProcess._forcedOutputTexture;\r\n } else if (postProcess._textures.data[postProcess._currentRenderTextureInd]) {\r\n postProcessInput = postProcess._textures.data[postProcess._currentRenderTextureInd];\r\n }\r\n }\r\n\r\n this._bindTexture(channel, postProcessInput?.texture ?? null, name);\r\n }\r\n\r\n /**\r\n * Binds the output of the passed in post process to the texture channel specified\r\n * @param channel The channel the texture should be bound to\r\n * @param postProcess The post process which's output should be bound\r\n * @param name name of the channel\r\n */\r\n public setTextureFromPostProcessOutput(channel: number, postProcess: Nullable, name: string): void {\r\n this._bindTexture(channel, postProcess?._outputTexture?.texture ?? null, name);\r\n }\r\n\r\n /**\r\n * sets the object from which width and height will be taken from when getting render width and height\r\n * Will fallback to the gl object\r\n * @param dimensions the framebuffer width and height that will be used.\r\n */\r\n public set framebufferDimensionsObject(dimensions: Nullable<{ framebufferWidth: number; framebufferHeight: number }>) {\r\n this._framebufferDimensionsObject = dimensions;\r\n if (this._framebufferDimensionsObject) {\r\n this.onResizeObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n protected _rebuildBuffers(): void {\r\n // Index / Vertex\r\n for (const scene of this.scenes) {\r\n scene.resetCachedMaterial();\r\n scene._rebuildGeometries();\r\n }\r\n\r\n for (const scene of this._virtualScenes) {\r\n scene.resetCachedMaterial();\r\n scene._rebuildGeometries();\r\n }\r\n\r\n super._rebuildBuffers();\r\n }\r\n\r\n protected _rebuildTextures(): void {\r\n for (const scene of this.scenes) {\r\n scene._rebuildTextures();\r\n }\r\n\r\n for (const scene of this._virtualScenes) {\r\n scene._rebuildTextures();\r\n }\r\n\r\n super._rebuildTextures();\r\n }\r\n\r\n /** @internal */\r\n public _renderFrame() {\r\n for (let index = 0; index < this._activeRenderLoops.length; index++) {\r\n const renderFunction = this._activeRenderLoops[index];\r\n\r\n renderFunction();\r\n }\r\n }\r\n\r\n protected _cancelFrame() {\r\n if (this.customAnimationFrameRequester) {\r\n if (this._frameHandler !== 0) {\r\n this._frameHandler = 0;\r\n const { cancelAnimationFrame } = this.customAnimationFrameRequester;\r\n if (cancelAnimationFrame) {\r\n cancelAnimationFrame(this.customAnimationFrameRequester.requestID);\r\n }\r\n }\r\n } else {\r\n super._cancelFrame();\r\n }\r\n }\r\n\r\n public _renderLoop(): void {\r\n this._frameHandler = 0;\r\n\r\n if (!this._contextWasLost) {\r\n let shouldRender = true;\r\n if (this.isDisposed || (!this.renderEvenInBackground && this._windowIsBackground)) {\r\n shouldRender = false;\r\n }\r\n\r\n if (shouldRender) {\r\n // Start new frame\r\n this.beginFrame();\r\n\r\n // Child canvases\r\n if (!this._renderViews()) {\r\n // Main frame\r\n this._renderFrame();\r\n }\r\n\r\n // Present\r\n this.endFrame();\r\n }\r\n }\r\n\r\n if (this._frameHandler === 0) {\r\n // Register new frame\r\n if (this.customAnimationFrameRequester) {\r\n this.customAnimationFrameRequester.requestID = this._queueNewFrame(\r\n this.customAnimationFrameRequester.renderFunction || this._boundRenderFunction,\r\n this.customAnimationFrameRequester\r\n );\r\n this._frameHandler = this.customAnimationFrameRequester.requestID;\r\n } else {\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _renderViews() {\r\n return false;\r\n }\r\n\r\n /**\r\n * Toggle full screen mode\r\n * @param requestPointerLock defines if a pointer lock should be requested from the user\r\n */\r\n public switchFullscreen(requestPointerLock: boolean): void {\r\n if (this.isFullscreen) {\r\n this.exitFullscreen();\r\n } else {\r\n this.enterFullscreen(requestPointerLock);\r\n }\r\n }\r\n\r\n /**\r\n * Enters full screen mode\r\n * @param requestPointerLock defines if a pointer lock should be requested from the user\r\n */\r\n public enterFullscreen(requestPointerLock: boolean): void {\r\n if (!this.isFullscreen) {\r\n this._pointerLockRequested = requestPointerLock;\r\n if (this._renderingCanvas) {\r\n Engine._RequestFullscreen(this._renderingCanvas);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Exits full screen mode\r\n */\r\n public exitFullscreen(): void {\r\n if (this.isFullscreen) {\r\n Engine._ExitFullscreen();\r\n }\r\n }\r\n\r\n /**\r\n * Enters Pointerlock mode\r\n */\r\n public enterPointerlock(): void {\r\n if (this._renderingCanvas) {\r\n Engine._RequestPointerlock(this._renderingCanvas);\r\n }\r\n }\r\n\r\n /**\r\n * Exits Pointerlock mode\r\n */\r\n public exitPointerlock(): void {\r\n Engine._ExitPointerlock();\r\n }\r\n\r\n /**\r\n * Begin a new frame\r\n */\r\n public beginFrame(): void {\r\n this._measureFps();\r\n\r\n this.onBeginFrameObservable.notifyObservers(this);\r\n super.beginFrame();\r\n }\r\n\r\n /**\r\n * End the current frame\r\n */\r\n public endFrame(): void {\r\n super.endFrame();\r\n\r\n this.onEndFrameObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Force a specific size of the canvas\r\n * @param width defines the new canvas' width\r\n * @param height defines the new canvas' height\r\n * @param forceSetSize true to force setting the sizes of the underlying canvas\r\n * @returns true if the size was changed\r\n */\r\n public setSize(width: number, height: number, forceSetSize = false): boolean {\r\n if (!this._renderingCanvas) {\r\n return false;\r\n }\r\n\r\n if (!super.setSize(width, height, forceSetSize)) {\r\n return false;\r\n }\r\n\r\n if (this.scenes) {\r\n for (let index = 0; index < this.scenes.length; index++) {\r\n const scene = this.scenes[index];\r\n\r\n for (let camIndex = 0; camIndex < scene.cameras.length; camIndex++) {\r\n const cam = scene.cameras[camIndex];\r\n\r\n cam._currentRenderId = 0;\r\n }\r\n }\r\n\r\n if (this.onResizeObservable.hasObservers()) {\r\n this.onResizeObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public _deletePipelineContext(pipelineContext: IPipelineContext): void {\r\n const webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n if (webGLPipelineContext && webGLPipelineContext.program) {\r\n if (webGLPipelineContext.transformFeedback) {\r\n this.deleteTransformFeedback(webGLPipelineContext.transformFeedback);\r\n webGLPipelineContext.transformFeedback = null;\r\n }\r\n }\r\n super._deletePipelineContext(pipelineContext);\r\n }\r\n\r\n public createShaderProgram(\r\n pipelineContext: IPipelineContext,\r\n vertexCode: string,\r\n fragmentCode: string,\r\n defines: Nullable,\r\n context?: WebGLRenderingContext,\r\n transformFeedbackVaryings: Nullable = null\r\n ): WebGLProgram {\r\n context = context || this._gl;\r\n\r\n this.onBeforeShaderCompilationObservable.notifyObservers(this);\r\n\r\n const program = super.createShaderProgram(pipelineContext, vertexCode, fragmentCode, defines, context, transformFeedbackVaryings);\r\n this.onAfterShaderCompilationObservable.notifyObservers(this);\r\n\r\n return program;\r\n }\r\n\r\n protected _createShaderProgram(\r\n pipelineContext: WebGLPipelineContext,\r\n vertexShader: WebGLShader,\r\n fragmentShader: WebGLShader,\r\n context: WebGLRenderingContext,\r\n transformFeedbackVaryings: Nullable = null\r\n ): WebGLProgram {\r\n const shaderProgram = context.createProgram();\r\n pipelineContext.program = shaderProgram;\r\n\r\n if (!shaderProgram) {\r\n throw new Error(\"Unable to create program\");\r\n }\r\n\r\n context.attachShader(shaderProgram, vertexShader);\r\n context.attachShader(shaderProgram, fragmentShader);\r\n\r\n if (this.webGLVersion > 1 && transformFeedbackVaryings) {\r\n const transformFeedback = this.createTransformFeedback();\r\n\r\n this.bindTransformFeedback(transformFeedback);\r\n this.setTranformFeedbackVaryings(shaderProgram, transformFeedbackVaryings);\r\n pipelineContext.transformFeedback = transformFeedback;\r\n }\r\n\r\n context.linkProgram(shaderProgram);\r\n\r\n if (this.webGLVersion > 1 && transformFeedbackVaryings) {\r\n this.bindTransformFeedback(null);\r\n }\r\n\r\n pipelineContext.context = context;\r\n pipelineContext.vertexShader = vertexShader;\r\n pipelineContext.fragmentShader = fragmentShader;\r\n\r\n if (!pipelineContext.isParallelCompiled) {\r\n this._finalizePipelineContext(pipelineContext);\r\n }\r\n\r\n return shaderProgram;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseTexture(texture: InternalTexture): void {\r\n super._releaseTexture(texture);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseRenderTargetWrapper(rtWrapper: RenderTargetWrapper): void {\r\n super._releaseRenderTargetWrapper(rtWrapper);\r\n\r\n // Set output texture of post process to null if the framebuffer has been released/disposed\r\n this.scenes.forEach((scene) => {\r\n scene.postProcesses.forEach((postProcess) => {\r\n if (postProcess._outputTexture === rtWrapper) {\r\n postProcess._outputTexture = null;\r\n }\r\n });\r\n scene.cameras.forEach((camera) => {\r\n camera._postProcesses.forEach((postProcess) => {\r\n if (postProcess) {\r\n if (postProcess._outputTexture === rtWrapper) {\r\n postProcess._outputTexture = null;\r\n }\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected static _RenderPassIdCounter = 0;\r\n /**\r\n * Gets or sets the current render pass id\r\n */\r\n public currentRenderPassId = Constants.RENDERPASS_MAIN;\r\n\r\n private _renderPassNames: string[] = [\"main\"];\r\n /**\r\n * Gets the names of the render passes that are currently created\r\n * @returns list of the render pass names\r\n */\r\n public getRenderPassNames(): string[] {\r\n return this._renderPassNames;\r\n }\r\n\r\n /**\r\n * Gets the name of the current render pass\r\n * @returns name of the current render pass\r\n */\r\n public getCurrentRenderPassName(): string {\r\n return this._renderPassNames[this.currentRenderPassId];\r\n }\r\n\r\n /**\r\n * Creates a render pass id\r\n * @param name Name of the render pass (for debug purpose only)\r\n * @returns the id of the new render pass\r\n */\r\n public createRenderPassId(name?: string) {\r\n // Note: render pass id == 0 is always for the main render pass\r\n const id = ++Engine._RenderPassIdCounter;\r\n this._renderPassNames[id] = name ?? \"NONAME\";\r\n return id;\r\n }\r\n\r\n /**\r\n * Releases a render pass id\r\n * @param id id of the render pass to release\r\n */\r\n public releaseRenderPassId(id: number): void {\r\n this._renderPassNames[id] = undefined as any;\r\n\r\n for (let s = 0; s < this.scenes.length; ++s) {\r\n const scene = this.scenes[s];\r\n for (let m = 0; m < scene.meshes.length; ++m) {\r\n const mesh = scene.meshes[m];\r\n if (mesh.subMeshes) {\r\n for (let b = 0; b < mesh.subMeshes.length; ++b) {\r\n const subMesh = mesh.subMeshes[b];\r\n subMesh._removeDrawWrapper(id);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Rescales a texture\r\n * @param source input texture\r\n * @param destination destination texture\r\n * @param scene scene to use to render the resize\r\n * @param internalFormat format to use when resizing\r\n * @param onComplete callback to be called when resize has completed\r\n */\r\n public _rescaleTexture(source: InternalTexture, destination: InternalTexture, scene: Nullable, internalFormat: number, onComplete: () => void): void {\r\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.LINEAR);\r\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.LINEAR);\r\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE);\r\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);\r\n\r\n const rtt = this.createRenderTargetTexture(\r\n {\r\n width: destination.width,\r\n height: destination.height,\r\n },\r\n {\r\n generateMipMaps: false,\r\n type: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n }\r\n );\r\n\r\n if (!this._rescalePostProcess && Engine._RescalePostProcessFactory) {\r\n this._rescalePostProcess = Engine._RescalePostProcessFactory(this);\r\n }\r\n\r\n if (this._rescalePostProcess) {\r\n this._rescalePostProcess.externalTextureSamplerBinding = true;\r\n this._rescalePostProcess.getEffect().executeWhenCompiled(() => {\r\n this._rescalePostProcess!.onApply = function (effect) {\r\n effect._bindTexture(\"textureSampler\", source);\r\n };\r\n\r\n let hostingScene: Scene = scene;\r\n\r\n if (!hostingScene) {\r\n hostingScene = this.scenes[this.scenes.length - 1];\r\n }\r\n hostingScene.postProcessManager.directRender([this._rescalePostProcess!], rtt, true);\r\n\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, destination, true);\r\n this._gl.copyTexImage2D(this._gl.TEXTURE_2D, 0, internalFormat, 0, 0, destination.width, destination.height, 0);\r\n\r\n this.unBindFramebuffer(rtt);\r\n rtt.dispose();\r\n\r\n if (onComplete) {\r\n onComplete();\r\n }\r\n });\r\n }\r\n }\r\n\r\n // FPS\r\n\r\n /**\r\n * Gets the current framerate\r\n * @returns a number representing the framerate\r\n */\r\n public getFps(): number {\r\n return this._fps;\r\n }\r\n\r\n /**\r\n * Gets the time spent between current and previous frame\r\n * @returns a number representing the delta time in ms\r\n */\r\n public getDeltaTime(): number {\r\n return this._deltaTime;\r\n }\r\n\r\n private _measureFps(): void {\r\n this._performanceMonitor.sampleFrame();\r\n this._fps = this._performanceMonitor.averageFPS;\r\n this._deltaTime = this._performanceMonitor.instantaneousFrameTime || 0;\r\n }\r\n\r\n /**\r\n * Wraps an external web gl texture in a Babylon texture.\r\n * @param texture defines the external texture\r\n * @param hasMipMaps defines whether the external texture has mip maps (default: false)\r\n * @param samplingMode defines the sampling mode for the external texture (default: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE)\r\n * @param width defines the width for the external texture (default: 0)\r\n * @param height defines the height for the external texture (default: 0)\r\n * @returns the babylon internal texture\r\n */\r\n public wrapWebGLTexture(\r\n texture: WebGLTexture,\r\n hasMipMaps: boolean = false,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n width: number = 0,\r\n height: number = 0\r\n ): InternalTexture {\r\n const hardwareTexture = new WebGLHardwareTexture(texture, this._gl);\r\n const internalTexture = new InternalTexture(this, InternalTextureSource.Unknown, true);\r\n internalTexture._hardwareTexture = hardwareTexture;\r\n internalTexture.baseWidth = width;\r\n internalTexture.baseHeight = height;\r\n internalTexture.width = width;\r\n internalTexture.height = height;\r\n internalTexture.isReady = true;\r\n internalTexture.useMipMaps = hasMipMaps;\r\n this.updateTextureSamplingMode(samplingMode, internalTexture);\r\n return internalTexture;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _uploadImageToTexture(texture: InternalTexture, image: HTMLImageElement | ImageBitmap, faceIndex: number = 0, lod: number = 0) {\r\n const gl = this._gl;\r\n\r\n const textureType = this._getWebGLTextureType(texture.type);\r\n const format = this._getInternalFormat(texture.format);\r\n const internalFormat = this._getRGBABufferInternalSizedFormat(texture.type, format);\r\n\r\n const bindTarget = texture.isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D;\r\n\r\n this._bindTextureDirectly(bindTarget, texture, true);\r\n this._unpackFlipY(texture.invertY);\r\n\r\n let target: GLenum = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n }\r\n\r\n gl.texImage2D(target, lod, internalFormat, format, textureType, image);\r\n this._bindTextureDirectly(bindTarget, null, true);\r\n }\r\n\r\n /**\r\n * Updates a depth texture Comparison Mode and Function.\r\n * If the comparison Function is equal to 0, the mode will be set to none.\r\n * Otherwise, this only works in webgl 2 and requires a shadow sampler in the shader.\r\n * @param texture The texture to set the comparison function for\r\n * @param comparisonFunction The comparison function to set, 0 if no comparison required\r\n */\r\n public updateTextureComparisonFunction(texture: InternalTexture, comparisonFunction: number): void {\r\n if (this.webGLVersion === 1) {\r\n Logger.Error(\"WebGL 1 does not support texture comparison.\");\r\n return;\r\n }\r\n\r\n const gl = this._gl;\r\n\r\n if (texture.isCube) {\r\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, texture, true);\r\n\r\n if (comparisonFunction === 0) {\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_FUNC, Constants.LEQUAL);\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_MODE, gl.NONE);\r\n } else {\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_FUNC, comparisonFunction);\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE);\r\n }\r\n\r\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null);\r\n } else {\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, texture, true);\r\n\r\n if (comparisonFunction === 0) {\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_FUNC, Constants.LEQUAL);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_MODE, gl.NONE);\r\n } else {\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_FUNC, comparisonFunction);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE);\r\n }\r\n\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, null);\r\n }\r\n\r\n texture._comparisonFunction = comparisonFunction;\r\n }\r\n\r\n /**\r\n * Creates a webGL buffer to use with instantiation\r\n * @param capacity defines the size of the buffer\r\n * @returns the webGL buffer\r\n */\r\n public createInstancesBuffer(capacity: number): DataBuffer {\r\n const buffer = this._gl.createBuffer();\r\n\r\n if (!buffer) {\r\n throw new Error(\"Unable to create instance buffer\");\r\n }\r\n\r\n const result = new WebGLDataBuffer(buffer);\r\n result.capacity = capacity;\r\n\r\n this.bindArrayBuffer(result);\r\n this._gl.bufferData(this._gl.ARRAY_BUFFER, capacity, this._gl.DYNAMIC_DRAW);\r\n\r\n result.references = 1;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Delete a webGL buffer used with instantiation\r\n * @param buffer defines the webGL buffer to delete\r\n */\r\n public deleteInstancesBuffer(buffer: WebGLBuffer): void {\r\n this._gl.deleteBuffer(buffer);\r\n }\r\n\r\n private _clientWaitAsync(sync: WebGLSync, flags = 0, intervalms = 10): Promise {\r\n const gl = (this._gl as any);\r\n return new Promise((resolve, reject) => {\r\n const check = () => {\r\n const res = gl.clientWaitSync(sync, flags, 0);\r\n if (res == gl.WAIT_FAILED) {\r\n reject();\r\n return;\r\n }\r\n if (res == gl.TIMEOUT_EXPIRED) {\r\n setTimeout(check, intervalms);\r\n return;\r\n }\r\n resolve();\r\n };\r\n\r\n check();\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _readPixelsAsync(x: number, y: number, w: number, h: number, format: number, type: number, outputBuffer: ArrayBufferView) {\r\n if (this._webGLVersion < 2) {\r\n throw new Error(\"_readPixelsAsync only work on WebGL2+\");\r\n }\r\n\r\n const gl = (this._gl as any);\r\n const buf = gl.createBuffer();\r\n gl.bindBuffer(gl.PIXEL_PACK_BUFFER, buf);\r\n gl.bufferData(gl.PIXEL_PACK_BUFFER, outputBuffer.byteLength, gl.STREAM_READ);\r\n gl.readPixels(x, y, w, h, format, type, 0);\r\n gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);\r\n\r\n const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);\r\n if (!sync) {\r\n return null;\r\n }\r\n\r\n gl.flush();\r\n\r\n return this._clientWaitAsync(sync, 0, 10).then(() => {\r\n gl.deleteSync(sync);\r\n\r\n gl.bindBuffer(gl.PIXEL_PACK_BUFFER, buf);\r\n gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, outputBuffer);\r\n gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);\r\n gl.deleteBuffer(buf);\r\n\r\n return outputBuffer;\r\n });\r\n }\r\n\r\n public dispose(): void {\r\n this.hideLoadingUI();\r\n\r\n this.onNewSceneAddedObservable.clear();\r\n\r\n // Release postProcesses\r\n while (this.postProcesses.length) {\r\n this.postProcesses[0].dispose();\r\n }\r\n\r\n // Rescale PP\r\n if (this._rescalePostProcess) {\r\n this._rescalePostProcess.dispose();\r\n }\r\n\r\n // Release scenes\r\n while (this.scenes.length) {\r\n this.scenes[0].dispose();\r\n }\r\n\r\n while (this._virtualScenes.length) {\r\n this._virtualScenes[0].dispose();\r\n }\r\n\r\n // Release audio engine\r\n if (EngineStore.Instances.length === 1 && Engine.audioEngine) {\r\n Engine.audioEngine.dispose();\r\n Engine.audioEngine = null;\r\n }\r\n\r\n // Events\r\n const hostWindow = this.getHostWindow(); // it calls IsWindowObjectExist()\r\n if (hostWindow && typeof hostWindow.removeEventListener === \"function\") {\r\n hostWindow.removeEventListener(\"blur\", this._onBlur);\r\n hostWindow.removeEventListener(\"focus\", this._onFocus);\r\n }\r\n\r\n if (this._renderingCanvas) {\r\n this._renderingCanvas.removeEventListener(\"focus\", this._onCanvasFocus);\r\n this._renderingCanvas.removeEventListener(\"blur\", this._onCanvasBlur);\r\n this._renderingCanvas.removeEventListener(\"pointerout\", this._onCanvasPointerOut);\r\n this._renderingCanvas.removeEventListener(\"contextmenu\", this._onCanvasContextMenu);\r\n }\r\n\r\n if (IsDocumentAvailable()) {\r\n document.removeEventListener(\"fullscreenchange\", this._onFullscreenChange);\r\n document.removeEventListener(\"mozfullscreenchange\", this._onFullscreenChange);\r\n document.removeEventListener(\"webkitfullscreenchange\", this._onFullscreenChange);\r\n document.removeEventListener(\"msfullscreenchange\", this._onFullscreenChange);\r\n document.removeEventListener(\"pointerlockchange\", this._onPointerLockChange);\r\n document.removeEventListener(\"mspointerlockchange\", this._onPointerLockChange);\r\n document.removeEventListener(\"mozpointerlockchange\", this._onPointerLockChange);\r\n document.removeEventListener(\"webkitpointerlockchange\", this._onPointerLockChange);\r\n }\r\n\r\n super.dispose();\r\n\r\n // Remove from Instances\r\n const index = EngineStore.Instances.indexOf(this);\r\n\r\n if (index >= 0) {\r\n EngineStore.Instances.splice(index, 1);\r\n }\r\n\r\n // no more engines left in the engine store? Notify!\r\n if (!Engine.Instances.length) {\r\n EngineStore.OnEnginesDisposedObservable.notifyObservers(this);\r\n }\r\n\r\n // Observables\r\n this.onResizeObservable.clear();\r\n this.onCanvasBlurObservable.clear();\r\n this.onCanvasFocusObservable.clear();\r\n this.onCanvasPointerOutObservable.clear();\r\n this.onBeginFrameObservable.clear();\r\n this.onEndFrameObservable.clear();\r\n }\r\n\r\n private _disableTouchAction(): void {\r\n if (!this._renderingCanvas || !this._renderingCanvas.setAttribute) {\r\n return;\r\n }\r\n\r\n this._renderingCanvas.setAttribute(\"touch-action\", \"none\");\r\n this._renderingCanvas.style.touchAction = \"none\";\r\n (this._renderingCanvas.style as any).webkitTapHighlightColor = \"transparent\";\r\n }\r\n\r\n // Loading screen\r\n\r\n /**\r\n * Display the loading screen\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\r\n */\r\n public displayLoadingUI(): void {\r\n if (!IsWindowObjectExist()) {\r\n return;\r\n }\r\n const loadingScreen = this.loadingScreen;\r\n if (loadingScreen) {\r\n loadingScreen.displayLoadingUI();\r\n }\r\n }\r\n\r\n /**\r\n * Hide the loading screen\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\r\n */\r\n public hideLoadingUI(): void {\r\n if (!IsWindowObjectExist()) {\r\n return;\r\n }\r\n const loadingScreen = this._loadingScreen;\r\n if (loadingScreen) {\r\n loadingScreen.hideLoadingUI();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current loading screen object\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\r\n */\r\n public get loadingScreen(): ILoadingScreen {\r\n if (!this._loadingScreen && this._renderingCanvas) {\r\n this._loadingScreen = Engine.DefaultLoadingScreenFactory(this._renderingCanvas);\r\n }\r\n return this._loadingScreen;\r\n }\r\n\r\n /**\r\n * Sets the current loading screen object\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\r\n */\r\n public set loadingScreen(loadingScreen: ILoadingScreen) {\r\n this._loadingScreen = loadingScreen;\r\n }\r\n\r\n /**\r\n * Sets the current loading screen text\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\r\n */\r\n public set loadingUIText(text: string) {\r\n this.loadingScreen.loadingUIText = text;\r\n }\r\n\r\n /**\r\n * Sets the current loading screen background color\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\r\n */\r\n public set loadingUIBackgroundColor(color: string) {\r\n this.loadingScreen.loadingUIBackgroundColor = color;\r\n }\r\n\r\n /**\r\n * creates and returns a new video element\r\n * @param constraints video constraints\r\n * @returns video element\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public createVideoElement(constraints: MediaTrackConstraints): any {\r\n return document.createElement(\"video\");\r\n }\r\n\r\n /** Pointerlock and fullscreen */\r\n\r\n /**\r\n * Ask the browser to promote the current element to pointerlock mode\r\n * @param element defines the DOM element to promote\r\n */\r\n static _RequestPointerlock(element: HTMLElement): void {\r\n if (element.requestPointerLock) {\r\n // In some browsers, requestPointerLock returns a promise.\r\n // Handle possible rejections to avoid an unhandled top-level exception.\r\n const promise: unknown = element.requestPointerLock();\r\n if (promise instanceof Promise)\r\n promise\r\n .then(() => {\r\n element.focus();\r\n })\r\n .catch(() => {});\r\n else element.focus();\r\n }\r\n }\r\n\r\n /**\r\n * Asks the browser to exit pointerlock mode\r\n */\r\n static _ExitPointerlock(): void {\r\n if (document.exitPointerLock) {\r\n document.exitPointerLock();\r\n }\r\n }\r\n\r\n /**\r\n * Ask the browser to promote the current element to fullscreen rendering mode\r\n * @param element defines the DOM element to promote\r\n */\r\n static _RequestFullscreen(element: HTMLElement): void {\r\n const requestFunction = element.requestFullscreen || (element).webkitRequestFullscreen;\r\n if (!requestFunction) {\r\n return;\r\n }\r\n requestFunction.call(element);\r\n }\r\n\r\n /**\r\n * Asks the browser to exit fullscreen mode\r\n */\r\n static _ExitFullscreen(): void {\r\n const anyDoc = document as any;\r\n\r\n if (document.exitFullscreen) {\r\n document.exitFullscreen();\r\n } else if (anyDoc.webkitCancelFullScreen) {\r\n anyDoc.webkitCancelFullScreen();\r\n }\r\n }\r\n\r\n /**\r\n * Get Font size information\r\n * @param font font name\r\n * @returns an object containing ascent, height and descent\r\n */\r\n public getFontOffset(font: string): { ascent: number; height: number; descent: number } {\r\n const text = document.createElement(\"span\");\r\n text.innerHTML = \"Hg\";\r\n text.setAttribute(\"style\", `font: ${font} !important`);\r\n\r\n const block = document.createElement(\"div\");\r\n block.style.display = \"inline-block\";\r\n block.style.width = \"1px\";\r\n block.style.height = \"0px\";\r\n block.style.verticalAlign = \"bottom\";\r\n\r\n const div = document.createElement(\"div\");\r\n div.style.whiteSpace = \"nowrap\";\r\n div.appendChild(text);\r\n div.appendChild(block);\r\n\r\n document.body.appendChild(div);\r\n\r\n let fontAscent = 0;\r\n let fontHeight = 0;\r\n try {\r\n fontHeight = block.getBoundingClientRect().top - text.getBoundingClientRect().top;\r\n block.style.verticalAlign = \"baseline\";\r\n fontAscent = block.getBoundingClientRect().top - text.getBoundingClientRect().top;\r\n } finally {\r\n document.body.removeChild(div);\r\n }\r\n return { ascent: fontAscent, height: fontHeight, descent: fontHeight - fontAscent };\r\n }\r\n}\r\n", "import type { DeepImmutable, Nullable } from \"../types\";\r\nimport { serialize, serializeAsVector3, serializeAsQuaternion } from \"../Misc/decorators\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport { Observable } from \"../Misc/observable\";\r\n\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Quaternion, Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Node } from \"../node\";\r\nimport type { Bone } from \"../Bones/bone\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Space } from \"../Maths/math.axis\";\r\nimport { GetClass } from \"../Misc/typeStore\";\r\n\r\nconst convertRHSToLHS = Matrix.Compose(Vector3.One(), Quaternion.FromEulerAngles(0, Math.PI, 0), Vector3.Zero());\r\n\r\n/**\r\n * A TransformNode is an object that is not rendered but can be used as a center of transformation. This can decrease memory usage and increase rendering speed compared to using an empty mesh as a parent and is less complicated than using a pivot matrix.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/transform_node\r\n */\r\nexport class TransformNode extends Node {\r\n // Statics\r\n /**\r\n * Object will not rotate to face the camera\r\n */\r\n public static BILLBOARDMODE_NONE = 0;\r\n /**\r\n * Object will rotate to face the camera but only on the x axis\r\n */\r\n public static BILLBOARDMODE_X = 1;\r\n /**\r\n * Object will rotate to face the camera but only on the y axis\r\n */\r\n public static BILLBOARDMODE_Y = 2;\r\n /**\r\n * Object will rotate to face the camera but only on the z axis\r\n */\r\n public static BILLBOARDMODE_Z = 4;\r\n /**\r\n * Object will rotate to face the camera\r\n */\r\n public static BILLBOARDMODE_ALL = 7;\r\n /**\r\n * Object will rotate to face the camera's position instead of orientation\r\n */\r\n public static BILLBOARDMODE_USE_POSITION = 128;\r\n /**\r\n * Child transform with Billboard flags should or should not apply parent rotation (default if off)\r\n */\r\n public static BillboardUseParentOrientation: boolean = false;\r\n\r\n private static _TmpRotation = Quaternion.Zero();\r\n private static _TmpScaling = Vector3.Zero();\r\n private static _TmpTranslation = Vector3.Zero();\r\n\r\n private _forward = new Vector3(0, 0, 1);\r\n private _up = new Vector3(0, 1, 0);\r\n private _right = new Vector3(1, 0, 0);\r\n\r\n // Properties\r\n @serializeAsVector3(\"position\")\r\n private _position = Vector3.Zero();\r\n\r\n @serializeAsVector3(\"rotation\")\r\n private _rotation = Vector3.Zero();\r\n\r\n @serializeAsQuaternion(\"rotationQuaternion\")\r\n private _rotationQuaternion: Nullable = null;\r\n\r\n @serializeAsVector3(\"scaling\")\r\n protected _scaling = Vector3.One();\r\n private _transformToBoneReferal: Nullable = null;\r\n private _currentParentWhenAttachingToBone: Nullable;\r\n private _isAbsoluteSynced = false;\r\n\r\n @serialize(\"billboardMode\")\r\n private _billboardMode = TransformNode.BILLBOARDMODE_NONE;\r\n\r\n /**\r\n * Gets or sets the billboard mode. Default is 0.\r\n *\r\n * | Value | Type | Description |\r\n * | --- | --- | --- |\r\n * | 0 | BILLBOARDMODE_NONE | |\r\n * | 1 | BILLBOARDMODE_X | |\r\n * | 2 | BILLBOARDMODE_Y | |\r\n * | 4 | BILLBOARDMODE_Z | |\r\n * | 7 | BILLBOARDMODE_ALL | |\r\n *\r\n */\r\n public get billboardMode() {\r\n return this._billboardMode;\r\n }\r\n\r\n public set billboardMode(value: number) {\r\n if (this._billboardMode === value) {\r\n return;\r\n }\r\n this._billboardMode = value;\r\n this._cache.useBillboardPosition = (this._billboardMode & TransformNode.BILLBOARDMODE_USE_POSITION) !== 0;\r\n this._computeUseBillboardPath();\r\n }\r\n\r\n private _preserveParentRotationForBillboard = false;\r\n /**\r\n * Gets or sets a boolean indicating that parent rotation should be preserved when using billboards.\r\n * This could be useful for glTF objects where parent rotation helps converting from right handed to left handed\r\n */\r\n public get preserveParentRotationForBillboard() {\r\n return this._preserveParentRotationForBillboard;\r\n }\r\n\r\n public set preserveParentRotationForBillboard(value: boolean) {\r\n if (value === this._preserveParentRotationForBillboard) {\r\n return;\r\n }\r\n this._preserveParentRotationForBillboard = value;\r\n this._computeUseBillboardPath();\r\n }\r\n\r\n private _computeUseBillboardPath(): void {\r\n this._cache.useBillboardPath = this._billboardMode !== TransformNode.BILLBOARDMODE_NONE && !this.preserveParentRotationForBillboard;\r\n }\r\n\r\n /**\r\n * Multiplication factor on scale x/y/z when computing the world matrix. Eg. for a 1x1x1 cube setting this to 2 will make it a 2x2x2 cube\r\n */\r\n @serialize()\r\n public scalingDeterminant = 1;\r\n\r\n @serialize(\"infiniteDistance\")\r\n private _infiniteDistance = false;\r\n\r\n /**\r\n * Gets or sets the distance of the object to max, often used by skybox\r\n */\r\n public get infiniteDistance() {\r\n return this._infiniteDistance;\r\n }\r\n\r\n public set infiniteDistance(value: boolean) {\r\n if (this._infiniteDistance === value) {\r\n return;\r\n }\r\n\r\n this._infiniteDistance = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that non uniform scaling (when at least one component is different from others) should be ignored.\r\n * By default the system will update normals to compensate\r\n */\r\n @serialize()\r\n public ignoreNonUniformScaling = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that even if rotationQuaternion is defined, you can keep updating rotation property and Babylon.js will just mix both\r\n */\r\n @serialize()\r\n public reIntegrateRotationIntoRotationQuaternion = false;\r\n\r\n // Cache\r\n /** @internal */\r\n public _poseMatrix: Nullable = null;\r\n /** @internal */\r\n public _localMatrix = Matrix.Zero();\r\n\r\n private _usePivotMatrix = false;\r\n private _absolutePosition = Vector3.Zero();\r\n private _absoluteScaling = Vector3.Zero();\r\n private _absoluteRotationQuaternion = Quaternion.Identity();\r\n private _pivotMatrix = Matrix.Identity();\r\n private _pivotMatrixInverse: Matrix;\r\n /** @internal */\r\n public _postMultiplyPivotMatrix = false;\r\n\r\n protected _isWorldMatrixFrozen = false;\r\n\r\n /** @internal */\r\n public _indexInSceneTransformNodesArray = -1;\r\n\r\n /**\r\n * An event triggered after the world matrix is updated\r\n */\r\n public onAfterWorldMatrixUpdateObservable = new Observable();\r\n\r\n constructor(name: string, scene: Nullable = null, isPure = true) {\r\n super(name, scene);\r\n\r\n if (isPure) {\r\n this.getScene().addTransformNode(this);\r\n }\r\n }\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"TransformNode\" string\r\n */\r\n public getClassName(): string {\r\n return \"TransformNode\";\r\n }\r\n\r\n /**\r\n * Gets or set the node position (default is (0.0, 0.0, 0.0))\r\n */\r\n public get position(): Vector3 {\r\n return this._position;\r\n }\r\n\r\n public set position(newPosition: Vector3) {\r\n this._position = newPosition;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * return true if a pivot has been set\r\n * @returns true if a pivot matrix is used\r\n */\r\n public isUsingPivotMatrix(): boolean {\r\n return this._usePivotMatrix;\r\n }\r\n\r\n /**\r\n * @returns true if pivot matrix must be cancelled in the world matrix. When this parameter is set to true (default), the inverse of the pivot matrix is also applied at the end to cancel the transformation effect.\r\n */\r\n public isUsingPostMultiplyPivotMatrix(): boolean {\r\n return this._postMultiplyPivotMatrix;\r\n }\r\n\r\n /**\r\n * Gets or sets the rotation property : a Vector3 defining the rotation value in radians around each local axis X, Y, Z (default is (0.0, 0.0, 0.0)).\r\n * If rotation quaternion is set, this Vector3 will be ignored and copy from the quaternion\r\n */\r\n public get rotation(): Vector3 {\r\n return this._rotation;\r\n }\r\n\r\n public set rotation(newRotation: Vector3) {\r\n this._rotation = newRotation;\r\n this._rotationQuaternion = null;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Gets or sets the scaling property : a Vector3 defining the node scaling along each local axis X, Y, Z (default is (1.0, 1.0, 1.0)).\r\n */\r\n public get scaling(): Vector3 {\r\n return this._scaling;\r\n }\r\n\r\n public set scaling(newScaling: Vector3) {\r\n this._scaling = newScaling;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Gets or sets the rotation Quaternion property : this a Quaternion object defining the node rotation by using a unit quaternion (undefined by default, but can be null).\r\n * If set, only the rotationQuaternion is then used to compute the node rotation (ie. node.rotation will be ignored)\r\n */\r\n public get rotationQuaternion(): Nullable {\r\n return this._rotationQuaternion;\r\n }\r\n\r\n public set rotationQuaternion(quaternion: Nullable) {\r\n this._rotationQuaternion = quaternion;\r\n //reset the rotation vector.\r\n if (quaternion) {\r\n this._rotation.setAll(0.0);\r\n }\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * The forward direction of that transform in world space.\r\n */\r\n public get forward(): Vector3 {\r\n Vector3.TransformNormalFromFloatsToRef(0, 0, this.getScene().useRightHandedSystem ? -1.0 : 1.0, this.getWorldMatrix(), this._forward);\r\n return this._forward.normalize();\r\n }\r\n\r\n /**\r\n * The up direction of that transform in world space.\r\n */\r\n public get up(): Vector3 {\r\n Vector3.TransformNormalFromFloatsToRef(0, 1, 0, this.getWorldMatrix(), this._up);\r\n return this._up.normalize();\r\n }\r\n\r\n /**\r\n * The right direction of that transform in world space.\r\n */\r\n public get right(): Vector3 {\r\n Vector3.TransformNormalFromFloatsToRef(this.getScene().useRightHandedSystem ? -1.0 : 1.0, 0, 0, this.getWorldMatrix(), this._right);\r\n return this._right.normalize();\r\n }\r\n\r\n /**\r\n * Copies the parameter passed Matrix into the mesh Pose matrix.\r\n * @param matrix the matrix to copy the pose from\r\n * @returns this TransformNode.\r\n */\r\n public updatePoseMatrix(matrix: Matrix): TransformNode {\r\n if (!this._poseMatrix) {\r\n this._poseMatrix = matrix.clone();\r\n return this;\r\n }\r\n this._poseMatrix.copyFrom(matrix);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh Pose matrix.\r\n * @returns the pose matrix\r\n */\r\n public getPoseMatrix(): Matrix {\r\n if (!this._poseMatrix) {\r\n this._poseMatrix = Matrix.Identity();\r\n }\r\n return this._poseMatrix;\r\n }\r\n\r\n /** @internal */\r\n public _isSynchronized(): boolean {\r\n const cache = this._cache;\r\n\r\n if (this._billboardMode !== cache.billboardMode || this._billboardMode !== TransformNode.BILLBOARDMODE_NONE) {\r\n return false;\r\n }\r\n\r\n if (cache.pivotMatrixUpdated) {\r\n return false;\r\n }\r\n\r\n if (this._infiniteDistance) {\r\n return false;\r\n }\r\n\r\n if (this._position._isDirty) {\r\n return false;\r\n }\r\n\r\n if (this._scaling._isDirty) {\r\n return false;\r\n }\r\n\r\n if ((this._rotationQuaternion && this._rotationQuaternion._isDirty) || this._rotation._isDirty) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _initCache() {\r\n super._initCache();\r\n\r\n const cache = this._cache;\r\n cache.localMatrixUpdated = false;\r\n cache.billboardMode = -1;\r\n cache.infiniteDistance = false;\r\n cache.useBillboardPosition = false;\r\n cache.useBillboardPath = false;\r\n }\r\n\r\n /**\r\n * Returns the current mesh absolute position.\r\n * Returns a Vector3.\r\n */\r\n public get absolutePosition(): Vector3 {\r\n return this.getAbsolutePosition();\r\n }\r\n\r\n /**\r\n * Returns the current mesh absolute scaling.\r\n * Returns a Vector3.\r\n */\r\n public get absoluteScaling(): Vector3 {\r\n this._syncAbsoluteScalingAndRotation();\r\n return this._absoluteScaling;\r\n }\r\n\r\n /**\r\n * Returns the current mesh absolute rotation.\r\n * Returns a Quaternion.\r\n */\r\n public get absoluteRotationQuaternion(): Quaternion {\r\n this._syncAbsoluteScalingAndRotation();\r\n return this._absoluteRotationQuaternion;\r\n }\r\n\r\n /**\r\n * Sets a new matrix to apply before all other transformation\r\n * @param matrix defines the transform matrix\r\n * @returns the current TransformNode\r\n */\r\n public setPreTransformMatrix(matrix: Matrix): TransformNode {\r\n return this.setPivotMatrix(matrix, false);\r\n }\r\n\r\n /**\r\n * Sets a new pivot matrix to the current node\r\n * @param matrix defines the new pivot matrix to use\r\n * @param postMultiplyPivotMatrix defines if the pivot matrix must be cancelled in the world matrix. When this parameter is set to true (default), the inverse of the pivot matrix is also applied at the end to cancel the transformation effect\r\n * @returns the current TransformNode\r\n */\r\n public setPivotMatrix(matrix: DeepImmutable, postMultiplyPivotMatrix = true): TransformNode {\r\n this._pivotMatrix.copyFrom(matrix);\r\n this._usePivotMatrix = !this._pivotMatrix.isIdentity();\r\n\r\n this._cache.pivotMatrixUpdated = true;\r\n this._postMultiplyPivotMatrix = postMultiplyPivotMatrix;\r\n\r\n if (this._postMultiplyPivotMatrix) {\r\n if (!this._pivotMatrixInverse) {\r\n this._pivotMatrixInverse = Matrix.Invert(this._pivotMatrix);\r\n } else {\r\n this._pivotMatrix.invertToRef(this._pivotMatrixInverse);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh pivot matrix.\r\n * Default : Identity.\r\n * @returns the matrix\r\n */\r\n public getPivotMatrix(): Matrix {\r\n return this._pivotMatrix;\r\n }\r\n\r\n /**\r\n * Instantiate (when possible) or clone that node with its hierarchy\r\n * @param newParent defines the new parent to use for the instance (or clone)\r\n * @param options defines options to configure how copy is done\r\n * @param options.doNotInstantiate defines if the model must be instantiated or just cloned\r\n * @param onNewNodeCreated defines an option callback to call when a clone or an instance is created\r\n * @returns an instance (or a clone) of the current node with its hierarchy\r\n */\r\n public instantiateHierarchy(\r\n newParent: Nullable = null,\r\n options?: { doNotInstantiate: boolean | ((node: TransformNode) => boolean) },\r\n onNewNodeCreated?: (source: TransformNode, clone: TransformNode) => void\r\n ): Nullable {\r\n const clone = this.clone(\"Clone of \" + (this.name || this.id), newParent || this.parent, true);\r\n\r\n if (clone) {\r\n if (onNewNodeCreated) {\r\n onNewNodeCreated(this, clone);\r\n }\r\n }\r\n\r\n for (const child of this.getChildTransformNodes(true)) {\r\n child.instantiateHierarchy(clone, options, onNewNodeCreated);\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Prevents the World matrix to be computed any longer\r\n * @param newWorldMatrix defines an optional matrix to use as world matrix\r\n * @param decompose defines whether to decompose the given newWorldMatrix or directly assign\r\n * @returns the TransformNode.\r\n */\r\n public freezeWorldMatrix(newWorldMatrix: Nullable = null, decompose = false): TransformNode {\r\n if (newWorldMatrix) {\r\n if (decompose) {\r\n this._rotation.setAll(0);\r\n this._rotationQuaternion = this._rotationQuaternion || Quaternion.Identity();\r\n newWorldMatrix.decompose(this._scaling, this._rotationQuaternion, this._position);\r\n this.computeWorldMatrix(true);\r\n } else {\r\n this._worldMatrix = newWorldMatrix;\r\n this._absolutePosition.copyFromFloats(this._worldMatrix.m[12], this._worldMatrix.m[13], this._worldMatrix.m[14]);\r\n this._afterComputeWorldMatrix();\r\n }\r\n } else {\r\n this._isWorldMatrixFrozen = false; // no guarantee world is not already frozen, switch off temporarily\r\n this.computeWorldMatrix(true);\r\n }\r\n this._isDirty = false;\r\n this._isWorldMatrixFrozen = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Allows back the World matrix computation.\r\n * @returns the TransformNode.\r\n */\r\n public unfreezeWorldMatrix() {\r\n this._isWorldMatrixFrozen = false;\r\n this.computeWorldMatrix(true);\r\n return this;\r\n }\r\n\r\n /**\r\n * True if the World matrix has been frozen.\r\n */\r\n public get isWorldMatrixFrozen(): boolean {\r\n return this._isWorldMatrixFrozen;\r\n }\r\n\r\n /**\r\n * Returns the mesh absolute position in the World.\r\n * @returns a Vector3.\r\n */\r\n public getAbsolutePosition(): Vector3 {\r\n this.computeWorldMatrix();\r\n return this._absolutePosition;\r\n }\r\n\r\n /**\r\n * Sets the mesh absolute position in the World from a Vector3 or an Array(3).\r\n * @param absolutePosition the absolute position to set\r\n * @returns the TransformNode.\r\n */\r\n public setAbsolutePosition(absolutePosition: Vector3): TransformNode {\r\n if (!absolutePosition) {\r\n return this;\r\n }\r\n let absolutePositionX;\r\n let absolutePositionY;\r\n let absolutePositionZ;\r\n if (absolutePosition.x === undefined) {\r\n if (arguments.length < 3) {\r\n return this;\r\n }\r\n absolutePositionX = arguments[0];\r\n absolutePositionY = arguments[1];\r\n absolutePositionZ = arguments[2];\r\n } else {\r\n absolutePositionX = absolutePosition.x;\r\n absolutePositionY = absolutePosition.y;\r\n absolutePositionZ = absolutePosition.z;\r\n }\r\n if (this.parent) {\r\n const invertParentWorldMatrix = TmpVectors.Matrix[0];\r\n this.parent.getWorldMatrix().invertToRef(invertParentWorldMatrix);\r\n Vector3.TransformCoordinatesFromFloatsToRef(absolutePositionX, absolutePositionY, absolutePositionZ, invertParentWorldMatrix, this.position);\r\n } else {\r\n this.position.x = absolutePositionX;\r\n this.position.y = absolutePositionY;\r\n this.position.z = absolutePositionZ;\r\n }\r\n\r\n this._absolutePosition.copyFrom(absolutePosition);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the mesh position in its local space.\r\n * @param vector3 the position to set in localspace\r\n * @returns the TransformNode.\r\n */\r\n public setPositionWithLocalVector(vector3: Vector3): TransformNode {\r\n this.computeWorldMatrix();\r\n this.position = Vector3.TransformNormal(vector3, this._localMatrix);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh position in the local space from the current World matrix values.\r\n * @returns a new Vector3.\r\n */\r\n public getPositionExpressedInLocalSpace(): Vector3 {\r\n this.computeWorldMatrix();\r\n const invLocalWorldMatrix = TmpVectors.Matrix[0];\r\n this._localMatrix.invertToRef(invLocalWorldMatrix);\r\n return Vector3.TransformNormal(this.position, invLocalWorldMatrix);\r\n }\r\n\r\n /**\r\n * Translates the mesh along the passed Vector3 in its local space.\r\n * @param vector3 the distance to translate in localspace\r\n * @returns the TransformNode.\r\n */\r\n public locallyTranslate(vector3: Vector3): TransformNode {\r\n this.computeWorldMatrix(true);\r\n this.position = Vector3.TransformCoordinates(vector3, this._localMatrix);\r\n return this;\r\n }\r\n\r\n private static _LookAtVectorCache = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Orients a mesh towards a target point. Mesh must be drawn facing user.\r\n * @param targetPoint the position (must be in same space as current mesh) to look at\r\n * @param yawCor optional yaw (y-axis) correction in radians\r\n * @param pitchCor optional pitch (x-axis) correction in radians\r\n * @param rollCor optional roll (z-axis) correction in radians\r\n * @param space the chosen space of the target\r\n * @returns the TransformNode.\r\n */\r\n public lookAt(targetPoint: Vector3, yawCor: number = 0, pitchCor: number = 0, rollCor: number = 0, space: Space = Space.LOCAL): TransformNode {\r\n const dv = TransformNode._LookAtVectorCache;\r\n const pos = space === Space.LOCAL ? this.position : this.getAbsolutePosition();\r\n targetPoint.subtractToRef(pos, dv);\r\n this.setDirection(dv, yawCor, pitchCor, rollCor);\r\n\r\n // Correct for parent's rotation offset\r\n if (space === Space.WORLD && this.parent) {\r\n if (this.rotationQuaternion) {\r\n // Get local rotation matrix of the looking object\r\n const rotationMatrix = TmpVectors.Matrix[0];\r\n this.rotationQuaternion.toRotationMatrix(rotationMatrix);\r\n\r\n // Offset rotation by parent's inverted rotation matrix to correct in world space\r\n const parentRotationMatrix = TmpVectors.Matrix[1];\r\n this.parent.getWorldMatrix().getRotationMatrixToRef(parentRotationMatrix);\r\n parentRotationMatrix.invert();\r\n rotationMatrix.multiplyToRef(parentRotationMatrix, rotationMatrix);\r\n this.rotationQuaternion.fromRotationMatrix(rotationMatrix);\r\n } else {\r\n // Get local rotation matrix of the looking object\r\n const quaternionRotation = TmpVectors.Quaternion[0];\r\n Quaternion.FromEulerVectorToRef(this.rotation, quaternionRotation);\r\n const rotationMatrix = TmpVectors.Matrix[0];\r\n quaternionRotation.toRotationMatrix(rotationMatrix);\r\n\r\n // Offset rotation by parent's inverted rotation matrix to correct in world space\r\n const parentRotationMatrix = TmpVectors.Matrix[1];\r\n this.parent.getWorldMatrix().getRotationMatrixToRef(parentRotationMatrix);\r\n parentRotationMatrix.invert();\r\n rotationMatrix.multiplyToRef(parentRotationMatrix, rotationMatrix);\r\n quaternionRotation.fromRotationMatrix(rotationMatrix);\r\n quaternionRotation.toEulerAnglesToRef(this.rotation);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 that is the localAxis, expressed in the mesh local space, rotated like the mesh.\r\n * This Vector3 is expressed in the World space.\r\n * @param localAxis axis to rotate\r\n * @returns a new Vector3 that is the localAxis, expressed in the mesh local space, rotated like the mesh.\r\n */\r\n public getDirection(localAxis: Vector3): Vector3 {\r\n const result = Vector3.Zero();\r\n\r\n this.getDirectionToRef(localAxis, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the Vector3 \"result\" as the rotated Vector3 \"localAxis\" in the same rotation than the mesh.\r\n * localAxis is expressed in the mesh local space.\r\n * result is computed in the World space from the mesh World matrix.\r\n * @param localAxis axis to rotate\r\n * @param result the resulting transformnode\r\n * @returns this TransformNode.\r\n */\r\n public getDirectionToRef(localAxis: Vector3, result: Vector3): TransformNode {\r\n Vector3.TransformNormalToRef(localAxis, this.getWorldMatrix(), result);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets this transform node rotation to the given local axis.\r\n * @param localAxis the axis in local space\r\n * @param yawCor optional yaw (y-axis) correction in radians\r\n * @param pitchCor optional pitch (x-axis) correction in radians\r\n * @param rollCor optional roll (z-axis) correction in radians\r\n * @returns this TransformNode\r\n */\r\n public setDirection(localAxis: Vector3, yawCor: number = 0, pitchCor: number = 0, rollCor: number = 0): TransformNode {\r\n const yaw = -Math.atan2(localAxis.z, localAxis.x) + Math.PI / 2;\r\n const len = Math.sqrt(localAxis.x * localAxis.x + localAxis.z * localAxis.z);\r\n const pitch = -Math.atan2(localAxis.y, len);\r\n if (this.rotationQuaternion) {\r\n Quaternion.RotationYawPitchRollToRef(yaw + yawCor, pitch + pitchCor, rollCor, this.rotationQuaternion);\r\n } else {\r\n this.rotation.x = pitch + pitchCor;\r\n this.rotation.y = yaw + yawCor;\r\n this.rotation.z = rollCor;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a new pivot point to the current node\r\n * @param point defines the new pivot point to use\r\n * @param space defines if the point is in world or local space (local by default)\r\n * @returns the current TransformNode\r\n */\r\n public setPivotPoint(point: Vector3, space: Space = Space.LOCAL): TransformNode {\r\n if (this.getScene().getRenderId() == 0) {\r\n this.computeWorldMatrix(true);\r\n }\r\n\r\n const wm = this.getWorldMatrix();\r\n\r\n if (space == Space.WORLD) {\r\n const tmat = TmpVectors.Matrix[0];\r\n wm.invertToRef(tmat);\r\n point = Vector3.TransformCoordinates(point, tmat);\r\n }\r\n\r\n return this.setPivotMatrix(Matrix.Translation(-point.x, -point.y, -point.z), true);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the mesh pivot point coordinates in the local space.\r\n * @returns the pivot point\r\n */\r\n public getPivotPoint(): Vector3 {\r\n const point = Vector3.Zero();\r\n this.getPivotPointToRef(point);\r\n return point;\r\n }\r\n\r\n /**\r\n * Sets the passed Vector3 \"result\" with the coordinates of the mesh pivot point in the local space.\r\n * @param result the vector3 to store the result\r\n * @returns this TransformNode.\r\n */\r\n public getPivotPointToRef(result: Vector3): TransformNode {\r\n result.x = -this._pivotMatrix.m[12];\r\n result.y = -this._pivotMatrix.m[13];\r\n result.z = -this._pivotMatrix.m[14];\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the mesh pivot point World coordinates.\r\n * @returns a new Vector3 set with the mesh pivot point World coordinates.\r\n */\r\n public getAbsolutePivotPoint(): Vector3 {\r\n const point = Vector3.Zero();\r\n this.getAbsolutePivotPointToRef(point);\r\n return point;\r\n }\r\n\r\n /**\r\n * Sets the Vector3 \"result\" coordinates with the mesh pivot point World coordinates.\r\n * @param result vector3 to store the result\r\n * @returns this TransformNode.\r\n */\r\n public getAbsolutePivotPointToRef(result: Vector3): TransformNode {\r\n this.getPivotPointToRef(result);\r\n Vector3.TransformCoordinatesToRef(result, this.getWorldMatrix(), result);\r\n return this;\r\n }\r\n\r\n /**\r\n * Flag the transform node as dirty (Forcing it to update everything)\r\n * @param property if set to \"rotation\" the objects rotationQuaternion will be set to null\r\n * @returns this node\r\n */\r\n public markAsDirty(property?: string): Node {\r\n if (this._isDirty) {\r\n return this;\r\n }\r\n\r\n // We need to explicitly update the children\r\n // as the scene.evaluateActiveMeshes will not poll the transform nodes\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.markAsDirty(property);\r\n }\r\n }\r\n return super.markAsDirty(property);\r\n }\r\n\r\n /**\r\n * Defines the passed node as the parent of the current node.\r\n * The node will remain exactly where it is and its position / rotation will be updated accordingly.\r\n * Note that if the mesh has a pivot matrix / point defined it will be applied after the parent was updated.\r\n * In that case the node will not remain in the same space as it is, as the pivot will be applied.\r\n * To avoid this, you can set updatePivot to true and the pivot will be updated to identity\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/parent\r\n * @param node the node ot set as the parent\r\n * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.\r\n * @param updatePivot if true, update the pivot matrix to keep the node in the same space as before\r\n * @returns this TransformNode.\r\n */\r\n public setParent(node: Nullable, preserveScalingSign: boolean = false, updatePivot = false): TransformNode {\r\n if (!node && !this.parent) {\r\n return this;\r\n }\r\n\r\n const quatRotation = TmpVectors.Quaternion[0];\r\n const position = TmpVectors.Vector3[0];\r\n const scale = TmpVectors.Vector3[1];\r\n const invParentMatrix = TmpVectors.Matrix[1];\r\n Matrix.IdentityToRef(invParentMatrix);\r\n const composedMatrix = TmpVectors.Matrix[0];\r\n this.computeWorldMatrix(true);\r\n\r\n let currentRotation = this.rotationQuaternion;\r\n if (!currentRotation) {\r\n currentRotation = TransformNode._TmpRotation;\r\n Quaternion.RotationYawPitchRollToRef(this._rotation.y, this._rotation.x, this._rotation.z, currentRotation);\r\n }\r\n\r\n // current global transformation without pivot\r\n Matrix.ComposeToRef(this.scaling, currentRotation, this.position, composedMatrix);\r\n if (this.parent) {\r\n composedMatrix.multiplyToRef(this.parent.computeWorldMatrix(true), composedMatrix);\r\n }\r\n\r\n // is a node was set, calculate the difference between this and the node\r\n if (node) {\r\n node.computeWorldMatrix(true).invertToRef(invParentMatrix);\r\n composedMatrix.multiplyToRef(invParentMatrix, composedMatrix);\r\n }\r\n composedMatrix.decompose(scale, quatRotation, position, preserveScalingSign ? this : undefined);\r\n\r\n if (this.rotationQuaternion) {\r\n this.rotationQuaternion.copyFrom(quatRotation);\r\n } else {\r\n quatRotation.toEulerAnglesToRef(this.rotation);\r\n }\r\n\r\n this.scaling.copyFrom(scale);\r\n this.position.copyFrom(position);\r\n\r\n this.parent = node;\r\n\r\n if (updatePivot) {\r\n this.setPivotMatrix(Matrix.Identity());\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private _nonUniformScaling = false;\r\n /**\r\n * True if the scaling property of this object is non uniform eg. (1,2,1)\r\n */\r\n public get nonUniformScaling(): boolean {\r\n return this._nonUniformScaling;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateNonUniformScalingState(value: boolean): boolean {\r\n if (this._nonUniformScaling === value) {\r\n return false;\r\n }\r\n\r\n this._nonUniformScaling = value;\r\n return true;\r\n }\r\n\r\n /**\r\n * Attach the current TransformNode to another TransformNode associated with a bone\r\n * @param bone Bone affecting the TransformNode\r\n * @param affectedTransformNode TransformNode associated with the bone\r\n * @returns this object\r\n */\r\n public attachToBone(bone: Bone, affectedTransformNode: TransformNode): TransformNode {\r\n this._currentParentWhenAttachingToBone = this.parent;\r\n this._transformToBoneReferal = affectedTransformNode;\r\n this.parent = bone;\r\n\r\n bone.getSkeleton().prepare(true); // make sure bone.getFinalMatrix() is up to date\r\n\r\n if (bone.getFinalMatrix().determinant() < 0) {\r\n this.scalingDeterminant *= -1;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Detach the transform node if its associated with a bone\r\n * @param resetToPreviousParent Indicates if the parent that was in effect when attachToBone was called should be set back or if we should set parent to null instead (defaults to the latter)\r\n * @returns this object\r\n */\r\n public detachFromBone(resetToPreviousParent = false): TransformNode {\r\n if (!this.parent) {\r\n if (resetToPreviousParent) {\r\n this.parent = this._currentParentWhenAttachingToBone;\r\n }\r\n return this;\r\n }\r\n\r\n if (this.parent.getWorldMatrix().determinant() < 0) {\r\n this.scalingDeterminant *= -1;\r\n }\r\n this._transformToBoneReferal = null;\r\n if (resetToPreviousParent) {\r\n this.parent = this._currentParentWhenAttachingToBone;\r\n } else {\r\n this.parent = null;\r\n }\r\n return this;\r\n }\r\n\r\n private static _RotationAxisCache = new Quaternion();\r\n /**\r\n * Rotates the mesh around the axis vector for the passed angle (amount) expressed in radians, in the given space.\r\n * space (default LOCAL) can be either Space.LOCAL, either Space.WORLD.\r\n * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.\r\n * The passed axis is also normalized.\r\n * @param axis the axis to rotate around\r\n * @param amount the amount to rotate in radians\r\n * @param space Space to rotate in (Default: local)\r\n * @returns the TransformNode.\r\n */\r\n public rotate(axis: Vector3, amount: number, space?: Space): TransformNode {\r\n axis.normalize();\r\n if (!this.rotationQuaternion) {\r\n this.rotationQuaternion = this.rotation.toQuaternion();\r\n this.rotation.setAll(0);\r\n }\r\n let rotationQuaternion: Quaternion;\r\n if (!space || (space as any) === Space.LOCAL) {\r\n rotationQuaternion = Quaternion.RotationAxisToRef(axis, amount, TransformNode._RotationAxisCache);\r\n this.rotationQuaternion.multiplyToRef(rotationQuaternion, this.rotationQuaternion);\r\n } else {\r\n if (this.parent) {\r\n const parentWorldMatrix = this.parent.getWorldMatrix();\r\n const invertParentWorldMatrix = TmpVectors.Matrix[0];\r\n parentWorldMatrix.invertToRef(invertParentWorldMatrix);\r\n axis = Vector3.TransformNormal(axis, invertParentWorldMatrix);\r\n\r\n if (parentWorldMatrix.determinant() < 0) {\r\n amount *= -1;\r\n }\r\n }\r\n rotationQuaternion = Quaternion.RotationAxisToRef(axis, amount, TransformNode._RotationAxisCache);\r\n rotationQuaternion.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Rotates the mesh around the axis vector for the passed angle (amount) expressed in radians, in world space.\r\n * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.\r\n * The passed axis is also normalized. .\r\n * Method is based on http://www.euclideanspace.com/maths/geometry/affine/aroundPoint/index.htm\r\n * @param point the point to rotate around\r\n * @param axis the axis to rotate around\r\n * @param amount the amount to rotate in radians\r\n * @returns the TransformNode\r\n */\r\n public rotateAround(point: Vector3, axis: Vector3, amount: number): TransformNode {\r\n axis.normalize();\r\n if (!this.rotationQuaternion) {\r\n this.rotationQuaternion = Quaternion.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z);\r\n this.rotation.setAll(0);\r\n }\r\n\r\n const tmpVector = TmpVectors.Vector3[0];\r\n const finalScale = TmpVectors.Vector3[1];\r\n const finalTranslation = TmpVectors.Vector3[2];\r\n\r\n const finalRotation = TmpVectors.Quaternion[0];\r\n\r\n const translationMatrix = TmpVectors.Matrix[0]; // T\r\n const translationMatrixInv = TmpVectors.Matrix[1]; // T'\r\n const rotationMatrix = TmpVectors.Matrix[2]; // R\r\n const finalMatrix = TmpVectors.Matrix[3]; // T' x R x T\r\n\r\n point.subtractToRef(this.position, tmpVector);\r\n Matrix.TranslationToRef(tmpVector.x, tmpVector.y, tmpVector.z, translationMatrix); // T\r\n Matrix.TranslationToRef(-tmpVector.x, -tmpVector.y, -tmpVector.z, translationMatrixInv); // T'\r\n Matrix.RotationAxisToRef(axis, amount, rotationMatrix); // R\r\n\r\n translationMatrixInv.multiplyToRef(rotationMatrix, finalMatrix); // T' x R\r\n finalMatrix.multiplyToRef(translationMatrix, finalMatrix); // T' x R x T\r\n\r\n finalMatrix.decompose(finalScale, finalRotation, finalTranslation);\r\n\r\n this.position.addInPlace(finalTranslation);\r\n finalRotation.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Translates the mesh along the axis vector for the passed distance in the given space.\r\n * space (default LOCAL) can be either Space.LOCAL, either Space.WORLD.\r\n * @param axis the axis to translate in\r\n * @param distance the distance to translate\r\n * @param space Space to rotate in (Default: local)\r\n * @returns the TransformNode.\r\n */\r\n public translate(axis: Vector3, distance: number, space?: Space): TransformNode {\r\n const displacementVector = axis.scale(distance);\r\n if (!space || (space as any) === Space.LOCAL) {\r\n const tempV3 = this.getPositionExpressedInLocalSpace().add(displacementVector);\r\n this.setPositionWithLocalVector(tempV3);\r\n } else {\r\n this.setAbsolutePosition(this.getAbsolutePosition().add(displacementVector));\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a rotation step to the mesh current rotation.\r\n * x, y, z are Euler angles expressed in radians.\r\n * This methods updates the current mesh rotation, either mesh.rotation, either mesh.rotationQuaternion if it's set.\r\n * This means this rotation is made in the mesh local space only.\r\n * It's useful to set a custom rotation order different from the BJS standard one YXZ.\r\n * Example : this rotates the mesh first around its local X axis, then around its local Z axis, finally around its local Y axis.\r\n * ```javascript\r\n * mesh.addRotation(x1, 0, 0).addRotation(0, 0, z2).addRotation(0, 0, y3);\r\n * ```\r\n * Note that `addRotation()` accumulates the passed rotation values to the current ones and computes the .rotation or .rotationQuaternion updated values.\r\n * Under the hood, only quaternions are used. So it's a little faster is you use .rotationQuaternion because it doesn't need to translate them back to Euler angles.\r\n * @param x Rotation to add\r\n * @param y Rotation to add\r\n * @param z Rotation to add\r\n * @returns the TransformNode.\r\n */\r\n public addRotation(x: number, y: number, z: number): TransformNode {\r\n let rotationQuaternion;\r\n if (this.rotationQuaternion) {\r\n rotationQuaternion = this.rotationQuaternion;\r\n } else {\r\n rotationQuaternion = TmpVectors.Quaternion[1];\r\n Quaternion.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, rotationQuaternion);\r\n }\r\n const accumulation = TmpVectors.Quaternion[0];\r\n Quaternion.RotationYawPitchRollToRef(y, x, z, accumulation);\r\n rotationQuaternion.multiplyInPlace(accumulation);\r\n if (!this.rotationQuaternion) {\r\n rotationQuaternion.toEulerAnglesToRef(this.rotation);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _getEffectiveParent(): Nullable {\r\n return this.parent;\r\n }\r\n\r\n /**\r\n * Returns whether the transform node world matrix computation needs the camera information to be computed.\r\n * This is the case when the node is a billboard or has an infinite distance for instance.\r\n * @returns true if the world matrix computation needs the camera information to be computed\r\n */\r\n public isWorldMatrixCameraDependent(): boolean {\r\n return (this._infiniteDistance && !this.parent) || (this._billboardMode !== TransformNode.BILLBOARDMODE_NONE && !this.preserveParentRotationForBillboard);\r\n }\r\n\r\n /**\r\n * Computes the world matrix of the node\r\n * @param force defines if the cache version should be invalidated forcing the world matrix to be created from scratch\r\n * @param camera defines the camera used if different from the scene active camera (This is used with modes like Billboard or infinite distance)\r\n * @returns the world matrix\r\n */\r\n public computeWorldMatrix(force: boolean = false, camera: Nullable = null): Matrix {\r\n if (this._isWorldMatrixFrozen && !this._isDirty) {\r\n return this._worldMatrix;\r\n }\r\n\r\n const currentRenderId = this.getScene().getRenderId();\r\n if (!this._isDirty && !force && (this._currentRenderId === currentRenderId || this.isSynchronized())) {\r\n this._currentRenderId = currentRenderId;\r\n return this._worldMatrix;\r\n }\r\n\r\n camera = camera || this.getScene().activeCamera;\r\n\r\n this._updateCache();\r\n const cache = this._cache;\r\n cache.pivotMatrixUpdated = false;\r\n cache.billboardMode = this.billboardMode;\r\n cache.infiniteDistance = this.infiniteDistance;\r\n cache.parent = this._parentNode;\r\n\r\n this._currentRenderId = currentRenderId;\r\n this._childUpdateId += 1;\r\n this._isDirty = false;\r\n this._position._isDirty = false;\r\n this._rotation._isDirty = false;\r\n this._scaling._isDirty = false;\r\n const parent = this._getEffectiveParent();\r\n\r\n // Scaling\r\n const scaling: Vector3 = TransformNode._TmpScaling;\r\n let translation: Vector3 = this._position;\r\n\r\n // Translation\r\n if (this._infiniteDistance) {\r\n if (!this.parent && camera) {\r\n const cameraWorldMatrix = camera.getWorldMatrix();\r\n const cameraGlobalPosition = new Vector3(cameraWorldMatrix.m[12], cameraWorldMatrix.m[13], cameraWorldMatrix.m[14]);\r\n\r\n translation = TransformNode._TmpTranslation;\r\n translation.copyFromFloats(this._position.x + cameraGlobalPosition.x, this._position.y + cameraGlobalPosition.y, this._position.z + cameraGlobalPosition.z);\r\n }\r\n }\r\n\r\n // Scaling\r\n scaling.copyFromFloats(this._scaling.x * this.scalingDeterminant, this._scaling.y * this.scalingDeterminant, this._scaling.z * this.scalingDeterminant);\r\n\r\n // Rotation\r\n let rotation: Quaternion;\r\n if (this._rotationQuaternion) {\r\n this._rotationQuaternion._isDirty = false;\r\n rotation = this._rotationQuaternion;\r\n if (this.reIntegrateRotationIntoRotationQuaternion) {\r\n const len = this.rotation.lengthSquared();\r\n if (len) {\r\n this._rotationQuaternion.multiplyInPlace(Quaternion.RotationYawPitchRoll(this._rotation.y, this._rotation.x, this._rotation.z));\r\n this._rotation.copyFromFloats(0, 0, 0);\r\n }\r\n }\r\n } else {\r\n rotation = TransformNode._TmpRotation;\r\n Quaternion.RotationYawPitchRollToRef(this._rotation.y, this._rotation.x, this._rotation.z, rotation);\r\n }\r\n\r\n // Compose\r\n if (this._usePivotMatrix) {\r\n const scaleMatrix = TmpVectors.Matrix[1];\r\n Matrix.ScalingToRef(scaling.x, scaling.y, scaling.z, scaleMatrix);\r\n\r\n // Rotation\r\n const rotationMatrix = TmpVectors.Matrix[0];\r\n rotation.toRotationMatrix(rotationMatrix);\r\n\r\n // Composing transformations\r\n this._pivotMatrix.multiplyToRef(scaleMatrix, TmpVectors.Matrix[4]);\r\n TmpVectors.Matrix[4].multiplyToRef(rotationMatrix, this._localMatrix);\r\n\r\n // Post multiply inverse of pivotMatrix\r\n if (this._postMultiplyPivotMatrix) {\r\n this._localMatrix.multiplyToRef(this._pivotMatrixInverse, this._localMatrix);\r\n }\r\n\r\n this._localMatrix.addTranslationFromFloats(translation.x, translation.y, translation.z);\r\n } else {\r\n Matrix.ComposeToRef(scaling, rotation, translation, this._localMatrix);\r\n }\r\n\r\n // Parent\r\n if (parent && parent.getWorldMatrix) {\r\n if (force) {\r\n parent.computeWorldMatrix(force);\r\n }\r\n if (cache.useBillboardPath) {\r\n if (this._transformToBoneReferal) {\r\n const bone = this.parent as Bone;\r\n bone.getSkeleton().prepare();\r\n bone.getFinalMatrix().multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), TmpVectors.Matrix[7]);\r\n } else {\r\n TmpVectors.Matrix[7].copyFrom(parent.getWorldMatrix());\r\n }\r\n\r\n // Extract scaling and translation from parent\r\n const translation = TmpVectors.Vector3[5];\r\n const scale = TmpVectors.Vector3[6];\r\n const orientation = TmpVectors.Quaternion[0];\r\n TmpVectors.Matrix[7].decompose(scale, orientation, translation);\r\n Matrix.ScalingToRef(scale.x, scale.y, scale.z, TmpVectors.Matrix[7]);\r\n TmpVectors.Matrix[7].setTranslation(translation);\r\n\r\n if (TransformNode.BillboardUseParentOrientation) {\r\n // set localMatrix translation to be transformed against parent's orientation.\r\n this._position.applyRotationQuaternionToRef(orientation, translation);\r\n this._localMatrix.setTranslation(translation);\r\n }\r\n\r\n this._localMatrix.multiplyToRef(TmpVectors.Matrix[7], this._worldMatrix);\r\n } else {\r\n if (this._transformToBoneReferal) {\r\n const bone = this.parent as Bone;\r\n bone.getSkeleton().prepare();\r\n this._localMatrix.multiplyToRef(bone.getFinalMatrix(), TmpVectors.Matrix[6]);\r\n TmpVectors.Matrix[6].multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), this._worldMatrix);\r\n } else {\r\n this._localMatrix.multiplyToRef(parent.getWorldMatrix(), this._worldMatrix);\r\n }\r\n }\r\n this._markSyncedWithParent();\r\n } else {\r\n this._worldMatrix.copyFrom(this._localMatrix);\r\n }\r\n\r\n // Billboarding based on camera orientation (testing PG:http://www.babylonjs-playground.com/#UJEIL#13)\r\n if (cache.useBillboardPath && camera && this.billboardMode && !cache.useBillboardPosition) {\r\n const storedTranslation = TmpVectors.Vector3[0];\r\n this._worldMatrix.getTranslationToRef(storedTranslation); // Save translation\r\n\r\n // Cancel camera rotation\r\n TmpVectors.Matrix[1].copyFrom(camera.getViewMatrix());\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n TmpVectors.Matrix[1].multiplyToRef(convertRHSToLHS, TmpVectors.Matrix[1]);\r\n }\r\n\r\n TmpVectors.Matrix[1].setTranslationFromFloats(0, 0, 0);\r\n TmpVectors.Matrix[1].invertToRef(TmpVectors.Matrix[0]);\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_ALL) !== TransformNode.BILLBOARDMODE_ALL) {\r\n TmpVectors.Matrix[0].decompose(undefined, TmpVectors.Quaternion[0], undefined);\r\n const eulerAngles = TmpVectors.Vector3[1];\r\n TmpVectors.Quaternion[0].toEulerAnglesToRef(eulerAngles);\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_X) !== TransformNode.BILLBOARDMODE_X) {\r\n eulerAngles.x = 0;\r\n }\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_Y) !== TransformNode.BILLBOARDMODE_Y) {\r\n eulerAngles.y = 0;\r\n }\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_Z) !== TransformNode.BILLBOARDMODE_Z) {\r\n eulerAngles.z = 0;\r\n }\r\n\r\n Matrix.RotationYawPitchRollToRef(eulerAngles.y, eulerAngles.x, eulerAngles.z, TmpVectors.Matrix[0]);\r\n }\r\n this._worldMatrix.setTranslationFromFloats(0, 0, 0);\r\n this._worldMatrix.multiplyToRef(TmpVectors.Matrix[0], this._worldMatrix);\r\n\r\n // Restore translation\r\n this._worldMatrix.setTranslation(TmpVectors.Vector3[0]);\r\n }\r\n // Billboarding based on camera position\r\n else if (cache.useBillboardPath && camera && cache.useBillboardPosition) {\r\n const storedTranslation = TmpVectors.Vector3[0];\r\n // Save translation\r\n this._worldMatrix.getTranslationToRef(storedTranslation);\r\n\r\n // Compute camera position in local space\r\n const cameraPosition = camera.globalPosition;\r\n this._worldMatrix.invertToRef(TmpVectors.Matrix[1]);\r\n const camInObjSpace = TmpVectors.Vector3[1];\r\n Vector3.TransformCoordinatesToRef(cameraPosition, TmpVectors.Matrix[1], camInObjSpace);\r\n camInObjSpace.normalize();\r\n\r\n // Find the lookAt info in local space\r\n const yaw = -Math.atan2(camInObjSpace.z, camInObjSpace.x) + Math.PI / 2;\r\n const len = Math.sqrt(camInObjSpace.x * camInObjSpace.x + camInObjSpace.z * camInObjSpace.z);\r\n const pitch = -Math.atan2(camInObjSpace.y, len);\r\n Quaternion.RotationYawPitchRollToRef(yaw, pitch, 0, TmpVectors.Quaternion[0]);\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_ALL) !== TransformNode.BILLBOARDMODE_ALL) {\r\n const eulerAngles = TmpVectors.Vector3[1];\r\n TmpVectors.Quaternion[0].toEulerAnglesToRef(eulerAngles);\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_X) !== TransformNode.BILLBOARDMODE_X) {\r\n eulerAngles.x = 0;\r\n }\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_Y) !== TransformNode.BILLBOARDMODE_Y) {\r\n eulerAngles.y = 0;\r\n }\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_Z) !== TransformNode.BILLBOARDMODE_Z) {\r\n eulerAngles.z = 0;\r\n }\r\n\r\n Matrix.RotationYawPitchRollToRef(eulerAngles.y, eulerAngles.x, eulerAngles.z, TmpVectors.Matrix[0]);\r\n } else {\r\n Matrix.FromQuaternionToRef(TmpVectors.Quaternion[0], TmpVectors.Matrix[0]);\r\n }\r\n\r\n // Cancel translation\r\n this._worldMatrix.setTranslationFromFloats(0, 0, 0);\r\n\r\n // Rotate according to lookat (diff from local to lookat)\r\n this._worldMatrix.multiplyToRef(TmpVectors.Matrix[0], this._worldMatrix);\r\n\r\n // Restore translation\r\n this._worldMatrix.setTranslation(TmpVectors.Vector3[0]);\r\n }\r\n\r\n // Normal matrix\r\n if (!this.ignoreNonUniformScaling) {\r\n if (this._scaling.isNonUniformWithinEpsilon(0.000001)) {\r\n this._updateNonUniformScalingState(true);\r\n } else if (parent && (parent)._nonUniformScaling) {\r\n this._updateNonUniformScalingState((parent)._nonUniformScaling);\r\n } else {\r\n this._updateNonUniformScalingState(false);\r\n }\r\n } else {\r\n this._updateNonUniformScalingState(false);\r\n }\r\n\r\n this._afterComputeWorldMatrix();\r\n\r\n // Absolute position\r\n this._absolutePosition.copyFromFloats(this._worldMatrix.m[12], this._worldMatrix.m[13], this._worldMatrix.m[14]);\r\n this._isAbsoluteSynced = false;\r\n\r\n // Callbacks\r\n this.onAfterWorldMatrixUpdateObservable.notifyObservers(this);\r\n\r\n if (!this._poseMatrix) {\r\n this._poseMatrix = Matrix.Invert(this._worldMatrix);\r\n }\r\n\r\n // Cache the determinant\r\n this._worldMatrixDeterminantIsDirty = true;\r\n\r\n return this._worldMatrix;\r\n }\r\n\r\n /**\r\n * Resets this nodeTransform's local matrix to Matrix.Identity().\r\n * @param independentOfChildren indicates if all child nodeTransform's world-space transform should be preserved.\r\n */\r\n public resetLocalMatrix(independentOfChildren: boolean = true): void {\r\n this.computeWorldMatrix();\r\n if (independentOfChildren) {\r\n const children = this.getChildren();\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i] as TransformNode;\r\n if (child) {\r\n child.computeWorldMatrix();\r\n const bakedMatrix = TmpVectors.Matrix[0];\r\n child._localMatrix.multiplyToRef(this._localMatrix, bakedMatrix);\r\n const tmpRotationQuaternion = TmpVectors.Quaternion[0];\r\n bakedMatrix.decompose(child.scaling, tmpRotationQuaternion, child.position);\r\n if (child.rotationQuaternion) {\r\n child.rotationQuaternion.copyFrom(tmpRotationQuaternion);\r\n } else {\r\n tmpRotationQuaternion.toEulerAnglesToRef(child.rotation);\r\n }\r\n }\r\n }\r\n }\r\n this.scaling.copyFromFloats(1, 1, 1);\r\n this.position.copyFromFloats(0, 0, 0);\r\n this.rotation.copyFromFloats(0, 0, 0);\r\n\r\n //only if quaternion is already set\r\n if (this.rotationQuaternion) {\r\n this.rotationQuaternion = Quaternion.Identity();\r\n }\r\n this._worldMatrix = Matrix.Identity();\r\n }\r\n\r\n protected _afterComputeWorldMatrix(): void {}\r\n\r\n /**\r\n * If you'd like to be called back after the mesh position, rotation or scaling has been updated.\r\n * @param func callback function to add\r\n *\r\n * @returns the TransformNode.\r\n */\r\n public registerAfterWorldMatrixUpdate(func: (mesh: TransformNode) => void): TransformNode {\r\n this.onAfterWorldMatrixUpdateObservable.add(func);\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a registered callback function.\r\n * @param func callback function to remove\r\n * @returns the TransformNode.\r\n */\r\n public unregisterAfterWorldMatrixUpdate(func: (mesh: TransformNode) => void): TransformNode {\r\n this.onAfterWorldMatrixUpdateObservable.removeCallback(func);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the position of the current mesh in camera space\r\n * @param camera defines the camera to use\r\n * @returns a position\r\n */\r\n public getPositionInCameraSpace(camera: Nullable = null): Vector3 {\r\n if (!camera) {\r\n camera = this.getScene().activeCamera;\r\n }\r\n\r\n return Vector3.TransformCoordinates(this.getAbsolutePosition(), camera.getViewMatrix());\r\n }\r\n\r\n /**\r\n * Returns the distance from the mesh to the active camera\r\n * @param camera defines the camera to use\r\n * @returns the distance\r\n */\r\n public getDistanceToCamera(camera: Nullable = null): number {\r\n if (!camera) {\r\n camera = this.getScene().activeCamera;\r\n }\r\n return this.getAbsolutePosition().subtract(camera.globalPosition).length();\r\n }\r\n\r\n /**\r\n * Clone the current transform node\r\n * @param name Name of the new clone\r\n * @param newParent New parent for the clone\r\n * @param doNotCloneChildren Do not clone children hierarchy\r\n * @returns the new transform node\r\n */\r\n public clone(name: string, newParent: Nullable, doNotCloneChildren?: boolean): Nullable {\r\n const result = SerializationHelper.Clone(() => new TransformNode(name, this.getScene()), this);\r\n\r\n result.name = name;\r\n result.id = name;\r\n\r\n if (newParent) {\r\n result.parent = newParent;\r\n }\r\n\r\n if (!doNotCloneChildren) {\r\n // Children\r\n const directDescendants = this.getDescendants(true);\r\n for (let index = 0; index < directDescendants.length; index++) {\r\n const child = directDescendants[index];\r\n\r\n if ((child).clone) {\r\n (child).clone(name + \".\" + child.name, result);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Serializes the objects information.\r\n * @param currentSerializationObject defines the object to serialize in\r\n * @returns the serialized object\r\n */\r\n public serialize(currentSerializationObject?: any): any {\r\n const serializationObject = SerializationHelper.Serialize(this, currentSerializationObject);\r\n serializationObject.type = this.getClassName();\r\n serializationObject.uniqueId = this.uniqueId;\r\n\r\n // Parent\r\n if (this.parent) {\r\n this.parent._serializeAsParent(serializationObject);\r\n }\r\n\r\n serializationObject.localMatrix = this.getPivotMatrix().asArray();\r\n\r\n serializationObject.isEnabled = this.isEnabled();\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n serializationObject.ranges = this.serializeAnimationRanges();\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Returns a new TransformNode object parsed from the source provided.\r\n * @param parsedTransformNode is the source.\r\n * @param scene the scene the object belongs to\r\n * @param rootUrl is a string, it's the root URL to prefix the `delayLoadingFile` property with\r\n * @returns a new TransformNode object parsed from the source provided.\r\n */\r\n public static Parse(parsedTransformNode: any, scene: Scene, rootUrl: string): TransformNode {\r\n const transformNode = SerializationHelper.Parse(() => new TransformNode(parsedTransformNode.name, scene), parsedTransformNode, scene, rootUrl);\r\n\r\n if (parsedTransformNode.localMatrix) {\r\n transformNode.setPreTransformMatrix(Matrix.FromArray(parsedTransformNode.localMatrix));\r\n } else if (parsedTransformNode.pivotMatrix) {\r\n transformNode.setPivotMatrix(Matrix.FromArray(parsedTransformNode.pivotMatrix));\r\n }\r\n\r\n transformNode.setEnabled(parsedTransformNode.isEnabled);\r\n\r\n transformNode._waitingParsedUniqueId = parsedTransformNode.uniqueId;\r\n\r\n // Parent\r\n if (parsedTransformNode.parentId !== undefined) {\r\n transformNode._waitingParentId = parsedTransformNode.parentId;\r\n }\r\n\r\n if (parsedTransformNode.parentInstanceIndex !== undefined) {\r\n transformNode._waitingParentInstanceIndex = parsedTransformNode.parentInstanceIndex;\r\n }\r\n\r\n // Animations\r\n if (parsedTransformNode.animations) {\r\n for (let animationIndex = 0; animationIndex < parsedTransformNode.animations.length; animationIndex++) {\r\n const parsedAnimation = parsedTransformNode.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n transformNode.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n Node.ParseAnimationRanges(transformNode, parsedTransformNode, scene);\r\n }\r\n\r\n if (parsedTransformNode.autoAnimate) {\r\n scene.beginAnimation(\r\n transformNode,\r\n parsedTransformNode.autoAnimateFrom,\r\n parsedTransformNode.autoAnimateTo,\r\n parsedTransformNode.autoAnimateLoop,\r\n parsedTransformNode.autoAnimateSpeed || 1.0\r\n );\r\n }\r\n\r\n return transformNode;\r\n }\r\n\r\n /**\r\n * Get all child-transformNodes of this node\r\n * @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\r\n * @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\r\n * @returns an array of TransformNode\r\n */\r\n public getChildTransformNodes(directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): TransformNode[] {\r\n const results: Array = [];\r\n this._getDescendants(results, directDescendantsOnly, (node: Node) => {\r\n return (!predicate || predicate(node)) && node instanceof TransformNode;\r\n });\r\n return results;\r\n }\r\n\r\n /**\r\n * Releases resources associated with this transform node.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n // Animations\r\n this.getScene().stopAnimation(this);\r\n\r\n // Remove from scene\r\n this.getScene().removeTransformNode(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.transformNodes.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.transformNodes.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n this.onAfterWorldMatrixUpdateObservable.clear();\r\n\r\n if (doNotRecurse) {\r\n const transformNodes = this.getChildTransformNodes(true);\r\n for (const transformNode of transformNodes) {\r\n transformNode.parent = null;\r\n transformNode.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n /**\r\n * Uniformly scales the mesh to fit inside of a unit cube (1 X 1 X 1 units)\r\n * @param includeDescendants Use the hierarchy's bounding box instead of the mesh's bounding box. Default is false\r\n * @param ignoreRotation ignore rotation when computing the scale (ie. object will be axis aligned). Default is false\r\n * @param predicate predicate that is passed in to getHierarchyBoundingVectors when selecting which object should be included when scaling\r\n * @returns the current mesh\r\n */\r\n public normalizeToUnitCube(includeDescendants = true, ignoreRotation = false, predicate?: Nullable<(node: AbstractMesh) => boolean>): TransformNode {\r\n let storedRotation: Nullable = null;\r\n let storedRotationQuaternion: Nullable = null;\r\n\r\n if (ignoreRotation) {\r\n if (this.rotationQuaternion) {\r\n storedRotationQuaternion = this.rotationQuaternion.clone();\r\n this.rotationQuaternion.copyFromFloats(0, 0, 0, 1);\r\n } else if (this.rotation) {\r\n storedRotation = this.rotation.clone();\r\n this.rotation.copyFromFloats(0, 0, 0);\r\n }\r\n }\r\n\r\n const boundingVectors = this.getHierarchyBoundingVectors(includeDescendants, predicate);\r\n const sizeVec = boundingVectors.max.subtract(boundingVectors.min);\r\n const maxDimension = Math.max(sizeVec.x, sizeVec.y, sizeVec.z);\r\n\r\n if (maxDimension === 0) {\r\n return this;\r\n }\r\n\r\n const scale = 1 / maxDimension;\r\n\r\n this.scaling.scaleInPlace(scale);\r\n\r\n if (ignoreRotation) {\r\n if (this.rotationQuaternion && storedRotationQuaternion) {\r\n this.rotationQuaternion.copyFrom(storedRotationQuaternion);\r\n } else if (this.rotation && storedRotation) {\r\n this.rotation.copyFrom(storedRotation);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private _syncAbsoluteScalingAndRotation(): void {\r\n if (!this._isAbsoluteSynced) {\r\n this._worldMatrix.decompose(this._absoluteScaling, this._absoluteRotationQuaternion);\r\n this._isAbsoluteSynced = true;\r\n }\r\n }\r\n}\r\n", "import type { Collider } from \"./collider\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\n\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class _MeshCollisionData {\r\n public _checkCollisions = false;\r\n public _collisionMask = -1;\r\n public _collisionGroup = -1;\r\n public _surroundingMeshes: Nullable = null;\r\n public _collider: Nullable = null;\r\n public _oldPositionForCollisions = new Vector3(0, 0, 0);\r\n public _diffPositionForCollisions = new Vector3(0, 0, 0);\r\n public _onCollideObserver: Nullable>;\r\n public _onCollisionPositionChangeObserver: Nullable>;\r\n public _collisionResponse = true;\r\n}\r\n", "import { Observable } from \"../Misc/observable\";\r\nimport type { Nullable, FloatArray, IndicesArray, DeepImmutable } from \"../types\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { ScenePerformancePriority } from \"../scene\";\r\nimport type { Vector2 } from \"../Maths/math.vector\";\r\nimport { Quaternion, Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport type { Node } from \"../node\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { IGetSetVerticesData } from \"../Meshes/mesh.vertexData\";\r\nimport { VertexData } from \"../Meshes/mesh.vertexData\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport type { ICullable } from \"../Culling/boundingInfo\";\r\nimport { BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { MaterialDefines } from \"../Materials/materialDefines\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport type { Skeleton } from \"../Bones/skeleton\";\r\nimport type { MorphTargetManager } from \"../Morph/morphTargetManager\";\r\nimport type { IBakedVertexAnimationManager } from \"../BakedVertexAnimation/bakedVertexAnimationManager\";\r\nimport type { IEdgesRenderer } from \"../Rendering/edgesRenderer\";\r\nimport type { SolidParticle } from \"../Particles/solidParticle\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { AbstractActionManager } from \"../Actions/abstractActionManager\";\r\nimport { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport { _MeshCollisionData } from \"../Collisions/meshCollisionData\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport type { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { extractMinAndMax } from \"../Maths/math.functions\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { Axis } from \"../Maths/math.axis\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\nimport type { Ray } from \"../Culling/ray\";\r\nimport type { Collider } from \"../Collisions/collider\";\r\nimport type { TrianglePickingPredicate } from \"../Culling/ray\";\r\nimport type { RenderingGroup } from \"../Rendering/renderingGroup\";\r\nimport type { IEdgesRendererOptions } from \"../Rendering/edgesRenderer\";\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nclass _FacetDataStorage {\r\n // facetData private properties\r\n public facetPositions: Vector3[]; // facet local positions\r\n public facetNormals: Vector3[]; // facet local normals\r\n public facetPartitioning: number[][]; // partitioning array of facet index arrays\r\n public facetNb: number = 0; // facet number\r\n public partitioningSubdivisions: number = 10; // number of subdivisions per axis in the partitioning space\r\n public partitioningBBoxRatio: number = 1.01; // the partitioning array space is by default 1% bigger than the bounding box\r\n public facetDataEnabled: boolean = false; // is the facet data feature enabled on this mesh ?\r\n public facetParameters: any = {}; // keep a reference to the object parameters to avoid memory re-allocation\r\n public bbSize: Vector3 = Vector3.Zero(); // bbox size approximated for facet data\r\n public subDiv = {\r\n // actual number of subdivisions per axis for ComputeNormals()\r\n max: 1,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n X: 1,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n Y: 1,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n Z: 1,\r\n };\r\n\r\n public facetDepthSort: boolean = false; // is the facet depth sort to be computed\r\n public facetDepthSortEnabled: boolean = false; // is the facet depth sort initialized\r\n public depthSortedIndices: IndicesArray; // copy of the indices array to store them once sorted\r\n public depthSortedFacets: { ind: number; sqDistance: number }[]; // array of depth sorted facets\r\n public facetDepthSortFunction: (f1: { ind: number; sqDistance: number }, f2: { ind: number; sqDistance: number }) => number; // facet depth sort function\r\n public facetDepthSortFrom: Vector3; // location where to depth sort from\r\n public facetDepthSortOrigin: Vector3; // same as facetDepthSortFrom but expressed in the mesh local space\r\n\r\n public invertedMatrix: Matrix; // Inverted world matrix.\r\n}\r\n\r\n/**\r\n * @internal\r\n **/\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nclass _InternalAbstractMeshDataInfo {\r\n public _hasVertexAlpha = false;\r\n public _useVertexColors = true;\r\n public _numBoneInfluencers = 4;\r\n public _applyFog = true;\r\n public _receiveShadows = false;\r\n public _facetData = new _FacetDataStorage();\r\n public _visibility = 1.0;\r\n public _skeleton: Nullable = null;\r\n public _layerMask: number = 0x0fffffff;\r\n public _computeBonesUsingShaders = true;\r\n public _isActive = false;\r\n public _onlyForInstances = false;\r\n public _isActiveIntermediate = false;\r\n public _onlyForInstancesIntermediate = false;\r\n public _actAsRegularMesh = false;\r\n public _currentLOD: Nullable = null;\r\n public _currentLODIsUpToDate: boolean = false;\r\n public _collisionRetryCount: number = 3;\r\n public _morphTargetManager: Nullable = null;\r\n public _renderingGroupId = 0;\r\n public _bakedVertexAnimationManager: Nullable = null;\r\n public _material: Nullable = null;\r\n public _materialForRenderPass: Array; // map a render pass id (index in the array) to a Material\r\n public _positions: Nullable = null;\r\n public _pointerOverDisableMeshTesting: boolean = false;\r\n // Collisions\r\n public _meshCollisionData = new _MeshCollisionData();\r\n public _enableDistantPicking = false;\r\n /** @internal\r\n * Bounding info that is unnafected by the addition of thin instances\r\n */\r\n public _rawBoundingInfo: Nullable = null;\r\n}\r\n\r\n/**\r\n * Class used to store all common mesh properties\r\n */\r\nexport class AbstractMesh extends TransformNode implements IDisposable, ICullable, IGetSetVerticesData {\r\n /** No occlusion */\r\n public static OCCLUSION_TYPE_NONE = 0;\r\n /** Occlusion set to optimistic */\r\n public static OCCLUSION_TYPE_OPTIMISTIC = 1;\r\n /** Occlusion set to strict */\r\n public static OCCLUSION_TYPE_STRICT = 2;\r\n /** Use an accurate occlusion algorithm */\r\n public static OCCLUSION_ALGORITHM_TYPE_ACCURATE = 0;\r\n /** Use a conservative occlusion algorithm */\r\n public static OCCLUSION_ALGORITHM_TYPE_CONSERVATIVE = 1;\r\n\r\n /** Default culling strategy : this is an exclusion test and it's the more accurate.\r\n * Test order :\r\n * Is the bounding sphere outside the frustum ?\r\n * If not, are the bounding box vertices outside the frustum ?\r\n * It not, then the cullable object is in the frustum.\r\n */\r\n public static readonly CULLINGSTRATEGY_STANDARD = Constants.MESHES_CULLINGSTRATEGY_STANDARD;\r\n /** Culling strategy : Bounding Sphere Only.\r\n * This is an exclusion test. It's faster than the standard strategy because the bounding box is not tested.\r\n * It's also less accurate than the standard because some not visible objects can still be selected.\r\n * Test : is the bounding sphere outside the frustum ?\r\n * If not, then the cullable object is in the frustum.\r\n */\r\n public static readonly CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY = Constants.MESHES_CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY;\r\n /** Culling strategy : Optimistic Inclusion.\r\n * This in an inclusion test first, then the standard exclusion test.\r\n * This can be faster when a cullable object is expected to be almost always in the camera frustum.\r\n * This could also be a little slower than the standard test when the tested object center is not the frustum but one of its bounding box vertex is still inside.\r\n * Anyway, it's as accurate as the standard strategy.\r\n * Test :\r\n * Is the cullable object bounding sphere center in the frustum ?\r\n * If not, apply the default culling strategy.\r\n */\r\n public static readonly CULLINGSTRATEGY_OPTIMISTIC_INCLUSION = Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION;\r\n /** Culling strategy : Optimistic Inclusion then Bounding Sphere Only.\r\n * This in an inclusion test first, then the bounding sphere only exclusion test.\r\n * This can be the fastest test when a cullable object is expected to be almost always in the camera frustum.\r\n * This could also be a little slower than the BoundingSphereOnly strategy when the tested object center is not in the frustum but its bounding sphere still intersects it.\r\n * It's less accurate than the standard strategy and as accurate as the BoundingSphereOnly strategy.\r\n * Test :\r\n * Is the cullable object bounding sphere center in the frustum ?\r\n * If not, apply the Bounding Sphere Only strategy. No Bounding Box is tested here.\r\n */\r\n public static readonly CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY = Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY;\r\n\r\n /**\r\n * No billboard\r\n */\r\n public static get BILLBOARDMODE_NONE(): number {\r\n return TransformNode.BILLBOARDMODE_NONE;\r\n }\r\n\r\n /** Billboard on X axis */\r\n public static get BILLBOARDMODE_X(): number {\r\n return TransformNode.BILLBOARDMODE_X;\r\n }\r\n\r\n /** Billboard on Y axis */\r\n public static get BILLBOARDMODE_Y(): number {\r\n return TransformNode.BILLBOARDMODE_Y;\r\n }\r\n\r\n /** Billboard on Z axis */\r\n public static get BILLBOARDMODE_Z(): number {\r\n return TransformNode.BILLBOARDMODE_Z;\r\n }\r\n\r\n /** Billboard on all axes */\r\n public static get BILLBOARDMODE_ALL(): number {\r\n return TransformNode.BILLBOARDMODE_ALL;\r\n }\r\n\r\n /** Billboard on using position instead of orientation */\r\n public static get BILLBOARDMODE_USE_POSITION(): number {\r\n return TransformNode.BILLBOARDMODE_USE_POSITION;\r\n }\r\n\r\n // Internal data\r\n /** @internal */\r\n public _internalAbstractMeshDataInfo = new _InternalAbstractMeshDataInfo();\r\n\r\n /** @internal */\r\n public _waitingMaterialId: Nullable = null;\r\n\r\n /**\r\n * The culling strategy to use to check whether the mesh must be rendered or not.\r\n * This value can be changed at any time and will be used on the next render mesh selection.\r\n * The possible values are :\r\n * - AbstractMesh.CULLINGSTRATEGY_STANDARD\r\n * - AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY\r\n * - AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION\r\n * - AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY\r\n * Please read each static variable documentation to get details about the culling process.\r\n * */\r\n public cullingStrategy = AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY;\r\n\r\n /**\r\n * Gets the number of facets in the mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet\r\n */\r\n public get facetNb(): number {\r\n return this._internalAbstractMeshDataInfo._facetData.facetNb;\r\n }\r\n /**\r\n * Gets or set the number (integer) of subdivisions per axis in the partitioning space\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning\r\n */\r\n public get partitioningSubdivisions(): number {\r\n return this._internalAbstractMeshDataInfo._facetData.partitioningSubdivisions;\r\n }\r\n public set partitioningSubdivisions(nb: number) {\r\n this._internalAbstractMeshDataInfo._facetData.partitioningSubdivisions = nb;\r\n }\r\n /**\r\n * The ratio (float) to apply to the bounding box size to set to the partitioning space.\r\n * Ex : 1.01 (default) the partitioning space is 1% bigger than the bounding box\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning\r\n */\r\n public get partitioningBBoxRatio(): number {\r\n return this._internalAbstractMeshDataInfo._facetData.partitioningBBoxRatio;\r\n }\r\n public set partitioningBBoxRatio(ratio: number) {\r\n this._internalAbstractMeshDataInfo._facetData.partitioningBBoxRatio = ratio;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the facets must be depth sorted on next call to `updateFacetData()`.\r\n * Works only for updatable meshes.\r\n * Doesn't work with multi-materials\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort\r\n */\r\n public get mustDepthSortFacets(): boolean {\r\n return this._internalAbstractMeshDataInfo._facetData.facetDepthSort;\r\n }\r\n public set mustDepthSortFacets(sort: boolean) {\r\n this._internalAbstractMeshDataInfo._facetData.facetDepthSort = sort;\r\n }\r\n\r\n /**\r\n * The location (Vector3) where the facet depth sort must be computed from.\r\n * By default, the active camera position.\r\n * Used only when facet depth sort is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort\r\n */\r\n public get facetDepthSortFrom(): Vector3 {\r\n return this._internalAbstractMeshDataInfo._facetData.facetDepthSortFrom;\r\n }\r\n public set facetDepthSortFrom(location: Vector3) {\r\n this._internalAbstractMeshDataInfo._facetData.facetDepthSortFrom = location;\r\n }\r\n\r\n /** number of collision detection tries. Change this value if not all collisions are detected and handled properly */\r\n public get collisionRetryCount(): number {\r\n return this._internalAbstractMeshDataInfo._collisionRetryCount;\r\n }\r\n public set collisionRetryCount(retryCount: number) {\r\n this._internalAbstractMeshDataInfo._collisionRetryCount = retryCount;\r\n }\r\n /**\r\n * gets a boolean indicating if facetData is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet\r\n */\r\n public get isFacetDataEnabled(): boolean {\r\n return this._internalAbstractMeshDataInfo._facetData.facetDataEnabled;\r\n }\r\n\r\n /**\r\n * Gets or sets the morph target manager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets\r\n */\r\n public get morphTargetManager(): Nullable {\r\n return this._internalAbstractMeshDataInfo._morphTargetManager;\r\n }\r\n\r\n public set morphTargetManager(value: Nullable) {\r\n if (this._internalAbstractMeshDataInfo._morphTargetManager === value) {\r\n return;\r\n }\r\n this._internalAbstractMeshDataInfo._morphTargetManager = value;\r\n this._syncGeometryWithMorphTargetManager();\r\n }\r\n\r\n /**\r\n * Gets or sets the baked vertex animation manager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/baked_texture_animations\r\n */\r\n public get bakedVertexAnimationManager(): Nullable {\r\n return this._internalAbstractMeshDataInfo._bakedVertexAnimationManager;\r\n }\r\n\r\n public set bakedVertexAnimationManager(value: Nullable) {\r\n if (this._internalAbstractMeshDataInfo._bakedVertexAnimationManager === value) {\r\n return;\r\n }\r\n this._internalAbstractMeshDataInfo._bakedVertexAnimationManager = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /** @internal */\r\n public _syncGeometryWithMorphTargetManager(): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateNonUniformScalingState(value: boolean): boolean {\r\n if (!super._updateNonUniformScalingState(value)) {\r\n return false;\r\n }\r\n this._markSubMeshesAsMiscDirty();\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public get rawBoundingInfo(): Nullable {\r\n return this._internalAbstractMeshDataInfo._rawBoundingInfo;\r\n }\r\n public set rawBoundingInfo(boundingInfo: Nullable) {\r\n this._internalAbstractMeshDataInfo._rawBoundingInfo = boundingInfo;\r\n }\r\n\r\n // Events\r\n\r\n /**\r\n * An event triggered when this mesh collides with another one\r\n */\r\n public onCollideObservable = new Observable();\r\n\r\n /** Set a function to call when this mesh collides with another one */\r\n public set onCollide(callback: (collidedMesh?: AbstractMesh) => void) {\r\n if (this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver) {\r\n this.onCollideObservable.remove(this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver);\r\n }\r\n this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver = this.onCollideObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the collision's position changes\r\n */\r\n public onCollisionPositionChangeObservable = new Observable();\r\n\r\n /** Set a function to call when the collision's position changes */\r\n public set onCollisionPositionChange(callback: () => void) {\r\n if (this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver) {\r\n this.onCollisionPositionChangeObservable.remove(this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver);\r\n }\r\n this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver = this.onCollisionPositionChangeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when material is changed\r\n */\r\n public onMaterialChangedObservable = new Observable();\r\n\r\n // Properties\r\n\r\n /**\r\n * Gets or sets the orientation for POV movement & rotation\r\n */\r\n public definedFacingForward = true;\r\n\r\n /** @internal */\r\n public _occlusionQuery: Nullable = null;\r\n\r\n /** @internal */\r\n public _renderingGroup: Nullable = null;\r\n\r\n /**\r\n * Gets or sets mesh visibility between 0 and 1 (default is 1)\r\n */\r\n public get visibility(): number {\r\n return this._internalAbstractMeshDataInfo._visibility;\r\n }\r\n\r\n /**\r\n * Gets or sets mesh visibility between 0 and 1 (default is 1)\r\n */\r\n public set visibility(value: number) {\r\n if (this._internalAbstractMeshDataInfo._visibility === value) {\r\n return;\r\n }\r\n\r\n const oldValue = this._internalAbstractMeshDataInfo._visibility;\r\n\r\n this._internalAbstractMeshDataInfo._visibility = value;\r\n\r\n if ((oldValue === 1 && value !== 1) || (oldValue !== 1 && value === 1)) {\r\n this._markSubMeshesAsDirty((defines) => {\r\n defines.markAsMiscDirty();\r\n defines.markAsPrePassDirty();\r\n });\r\n }\r\n }\r\n\r\n /** Gets or sets the alpha index used to sort transparent meshes\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#alpha-index\r\n */\r\n public alphaIndex = Number.MAX_VALUE;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh is visible (renderable). Default is true\r\n */\r\n public isVisible = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be picked (by scene.pick for instance or through actions). Default is true\r\n */\r\n public isPickable = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be near picked (touched by the XR controller or hands). Default is false\r\n */\r\n public isNearPickable = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be grabbed. Default is false.\r\n * Setting this to true, while using the XR near interaction feature, will trigger a pointer event when the mesh is grabbed.\r\n * Grabbing means that the controller is using the squeeze or main trigger button to grab the mesh.\r\n * This is different from nearPickable which only triggers the event when the mesh is touched by the controller\r\n */\r\n public isNearGrabbable = false;\r\n\r\n /** Gets or sets a boolean indicating that bounding boxes of subMeshes must be rendered as well (false by default) */\r\n public showSubMeshesBoundingBox = false;\r\n\r\n /** Gets or sets a boolean indicating if the mesh must be considered as a ray blocker for lens flares (false by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/lenseFlare\r\n */\r\n public isBlocker = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that pointer move events must be supported on this mesh (false by default)\r\n */\r\n public enablePointerMoveEvents = false;\r\n\r\n /**\r\n * Gets or sets the property which disables the test that is checking that the mesh under the pointer is the same than the previous time we tested for it (default: false).\r\n * Set this property to true if you want thin instances picking to be reported accurately when moving over the mesh.\r\n * Note that setting this property to true will incur some performance penalties when dealing with pointer events for this mesh so use it sparingly.\r\n */\r\n public get pointerOverDisableMeshTesting() {\r\n return this._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting;\r\n }\r\n\r\n public set pointerOverDisableMeshTesting(disable: boolean) {\r\n this._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting = disable;\r\n }\r\n\r\n /**\r\n * Specifies the rendering group id for this mesh (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#rendering-groups\r\n */\r\n public get renderingGroupId() {\r\n return this._internalAbstractMeshDataInfo._renderingGroupId;\r\n }\r\n\r\n public set renderingGroupId(value: number) {\r\n this._internalAbstractMeshDataInfo._renderingGroupId = value;\r\n }\r\n\r\n /** Gets or sets current material */\r\n public get material(): Nullable {\r\n return this._internalAbstractMeshDataInfo._material;\r\n }\r\n public set material(value: Nullable) {\r\n if (this._internalAbstractMeshDataInfo._material === value) {\r\n return;\r\n }\r\n\r\n // remove from material mesh map id needed\r\n if (this._internalAbstractMeshDataInfo._material && this._internalAbstractMeshDataInfo._material.meshMap) {\r\n this._internalAbstractMeshDataInfo._material.meshMap[this.uniqueId] = undefined;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._material = value;\r\n\r\n if (value && value.meshMap) {\r\n value.meshMap[this.uniqueId] = this;\r\n }\r\n\r\n if (this.onMaterialChangedObservable.hasObservers()) {\r\n this.onMaterialChangedObservable.notifyObservers(this);\r\n }\r\n\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n this.resetDrawCache();\r\n this._unBindEffect();\r\n }\r\n\r\n /**\r\n * Gets the material used to render the mesh in a specific render pass\r\n * @param renderPassId render pass id\r\n * @returns material used for the render pass. If no specific material is used for this render pass, undefined is returned (meaning mesh.material is used for this pass)\r\n */\r\n public getMaterialForRenderPass(renderPassId: number): Material | undefined {\r\n return this._internalAbstractMeshDataInfo._materialForRenderPass?.[renderPassId];\r\n }\r\n\r\n /**\r\n * Sets the material to be used to render the mesh in a specific render pass\r\n * @param renderPassId render pass id\r\n * @param material material to use for this render pass. If undefined is passed, no specific material will be used for this render pass but the regular material will be used instead (mesh.material)\r\n */\r\n public setMaterialForRenderPass(renderPassId: number, material?: Material): void {\r\n this.resetDrawCache(renderPassId);\r\n if (!this._internalAbstractMeshDataInfo._materialForRenderPass) {\r\n this._internalAbstractMeshDataInfo._materialForRenderPass = [];\r\n }\r\n this._internalAbstractMeshDataInfo._materialForRenderPass[renderPassId] = material;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this mesh can receive realtime shadows\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows\r\n */\r\n public get receiveShadows(): boolean {\r\n return this._internalAbstractMeshDataInfo._receiveShadows;\r\n }\r\n public set receiveShadows(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._receiveShadows === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._receiveShadows = value;\r\n this._markSubMeshesAsLightDirty();\r\n }\r\n\r\n /** Defines color to use when rendering outline */\r\n public outlineColor = Color3.Red();\r\n /** Define width to use when rendering outline */\r\n public outlineWidth = 0.02;\r\n\r\n /** Defines color to use when rendering overlay */\r\n public overlayColor = Color3.Red();\r\n /** Defines alpha to use when rendering overlay */\r\n public overlayAlpha = 0.5;\r\n\r\n /** Gets or sets a boolean indicating that this mesh contains vertex color data with alpha values */\r\n public get hasVertexAlpha(): boolean {\r\n return this._internalAbstractMeshDataInfo._hasVertexAlpha;\r\n }\r\n public set hasVertexAlpha(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._hasVertexAlpha === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._hasVertexAlpha = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n this._markSubMeshesAsMiscDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating that this mesh needs to use vertex color data to render (if this kind of vertex data is available in the geometry) */\r\n public get useVertexColors(): boolean {\r\n return this._internalAbstractMeshDataInfo._useVertexColors;\r\n }\r\n public set useVertexColors(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._useVertexColors === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._useVertexColors = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that bone animations must be computed by the GPU (true by default)\r\n */\r\n public get computeBonesUsingShaders(): boolean {\r\n return this._internalAbstractMeshDataInfo._computeBonesUsingShaders;\r\n }\r\n public set computeBonesUsingShaders(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._computeBonesUsingShaders === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._computeBonesUsingShaders = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /** Gets or sets the number of allowed bone influences per vertex (4 by default) */\r\n public get numBoneInfluencers(): number {\r\n return this._internalAbstractMeshDataInfo._numBoneInfluencers;\r\n }\r\n public set numBoneInfluencers(value: number) {\r\n if (this._internalAbstractMeshDataInfo._numBoneInfluencers === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._numBoneInfluencers = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating that this mesh will allow fog to be rendered on it (true by default) */\r\n public get applyFog(): boolean {\r\n return this._internalAbstractMeshDataInfo._applyFog;\r\n }\r\n public set applyFog(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._applyFog === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._applyFog = value;\r\n this._markSubMeshesAsMiscDirty();\r\n }\r\n\r\n /** When enabled, decompose picking matrices for better precision with large values for mesh position and scling */\r\n public get enableDistantPicking(): boolean {\r\n return this._internalAbstractMeshDataInfo._enableDistantPicking;\r\n }\r\n public set enableDistantPicking(value: boolean) {\r\n this._internalAbstractMeshDataInfo._enableDistantPicking = value;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes selection (true by default) */\r\n public useOctreeForRenderingSelection = true;\r\n /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes picking (true by default) */\r\n public useOctreeForPicking = true;\r\n /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes collision (true by default) */\r\n public useOctreeForCollisions = true;\r\n /**\r\n * Gets or sets the current layer mask (default is 0x0FFFFFFF)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/layerMasksAndMultiCam\r\n */\r\n public get layerMask(): number {\r\n return this._internalAbstractMeshDataInfo._layerMask;\r\n }\r\n\r\n public set layerMask(value: number) {\r\n if (value === this._internalAbstractMeshDataInfo._layerMask) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._layerMask = value;\r\n this._resyncLightSources();\r\n }\r\n\r\n /**\r\n * True if the mesh must be rendered in any case (this will shortcut the frustum clipping phase)\r\n */\r\n public alwaysSelectAsActiveMesh = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the bounding info does not need to be kept in sync (for performance reason)\r\n */\r\n public doNotSyncBoundingInfo = false;\r\n\r\n /**\r\n * Gets or sets the current action manager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions\r\n */\r\n public actionManager: Nullable = null;\r\n\r\n /**\r\n * Gets or sets the ellipsoid used to impersonate this mesh when using collision engine (default is (0.5, 1, 0.5))\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public ellipsoid = new Vector3(0.5, 1, 0.5);\r\n /**\r\n * Gets or sets the ellipsoid offset used to impersonate this mesh when using collision engine (default is (0, 0, 0))\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public ellipsoidOffset = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Gets or sets a collision mask used to mask collisions (default is -1).\r\n * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0\r\n */\r\n public get collisionMask(): number {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionMask;\r\n }\r\n\r\n public set collisionMask(mask: number) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionMask = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * Gets or sets a collision response flag (default is true).\r\n * when collisionResponse is false, events are still triggered but colliding entity has no response\r\n * This helps creating trigger volume when user wants collision feedback events but not position/velocity\r\n * to respond to the collision.\r\n */\r\n public get collisionResponse(): boolean {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionResponse;\r\n }\r\n\r\n public set collisionResponse(response: boolean) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionResponse = response;\r\n }\r\n /**\r\n * Gets or sets the current collision group mask (-1 by default).\r\n * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0\r\n */\r\n public get collisionGroup(): number {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionGroup;\r\n }\r\n\r\n public set collisionGroup(mask: number) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionGroup = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * Gets or sets current surrounding meshes (null by default).\r\n *\r\n * By default collision detection is tested against every mesh in the scene.\r\n * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified\r\n * meshes will be tested for the collision.\r\n *\r\n * Note: if set to an empty array no collision will happen when this mesh is moved.\r\n */\r\n public get surroundingMeshes(): Nullable {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._surroundingMeshes;\r\n }\r\n\r\n public set surroundingMeshes(meshes: Nullable) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._surroundingMeshes = meshes;\r\n }\r\n\r\n // Edges\r\n /**\r\n * Defines edge width used when edgesRenderer is enabled\r\n * @see https://www.babylonjs-playground.com/#10OJSG#13\r\n */\r\n public edgesWidth = 1;\r\n /**\r\n * Defines edge color used when edgesRenderer is enabled\r\n * @see https://www.babylonjs-playground.com/#10OJSG#13\r\n */\r\n public edgesColor = new Color4(1, 0, 0, 1);\r\n /** @internal */\r\n public _edgesRenderer: Nullable = null;\r\n\r\n /** @internal */\r\n public _masterMesh: Nullable = null;\r\n protected _boundingInfo: Nullable = null;\r\n protected _boundingInfoIsDirty = true;\r\n /** @internal */\r\n public _renderId = 0;\r\n\r\n /**\r\n * Gets or sets the list of subMeshes\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials\r\n */\r\n public subMeshes: SubMesh[];\r\n\r\n /** @internal */\r\n public _intersectionsInProgress = new Array();\r\n\r\n /** @internal */\r\n public _unIndexed = false;\r\n\r\n /** @internal */\r\n public _lightSources = new Array();\r\n\r\n /** Gets the list of lights affecting that mesh */\r\n public get lightSources(): Light[] {\r\n return this._lightSources;\r\n }\r\n\r\n /** @internal */\r\n public get _positions(): Nullable {\r\n return null;\r\n }\r\n\r\n // Loading properties\r\n /** @internal */\r\n public _waitingData: {\r\n lods: Nullable;\r\n actions: Nullable;\r\n freezeWorldMatrix: Nullable;\r\n } = {\r\n lods: null,\r\n actions: null,\r\n freezeWorldMatrix: null,\r\n };\r\n\r\n /** @internal */\r\n public _bonesTransformMatrices: Nullable = null;\r\n\r\n /** @internal */\r\n public _transformMatrixTexture: Nullable = null;\r\n\r\n /**\r\n * Gets or sets a skeleton to apply skinning transformations\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons\r\n */\r\n public set skeleton(value: Nullable) {\r\n const skeleton = this._internalAbstractMeshDataInfo._skeleton;\r\n if (skeleton && skeleton.needInitialSkinMatrix) {\r\n skeleton._unregisterMeshWithPoseMatrix(this);\r\n }\r\n\r\n if (value && value.needInitialSkinMatrix) {\r\n value._registerMeshWithPoseMatrix(this);\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._skeleton = value;\r\n\r\n if (!this._internalAbstractMeshDataInfo._skeleton) {\r\n this._bonesTransformMatrices = null;\r\n }\r\n\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n public get skeleton(): Nullable {\r\n return this._internalAbstractMeshDataInfo._skeleton;\r\n }\r\n\r\n /**\r\n * An event triggered when the mesh is rebuilt.\r\n */\r\n public onRebuildObservable = new Observable();\r\n\r\n /**\r\n * The current mesh uniform buffer.\r\n * @internal Internal use only.\r\n */\r\n public _uniformBuffer: UniformBuffer;\r\n\r\n // Constructor\r\n\r\n /**\r\n * Creates a new AbstractMesh\r\n * @param name defines the name of the mesh\r\n * @param scene defines the hosting scene\r\n */\r\n constructor(name: string, scene: Nullable = null) {\r\n super(name, scene, false);\r\n\r\n scene = this.getScene();\r\n\r\n scene.addMesh(this);\r\n\r\n this._resyncLightSources();\r\n\r\n // Mesh Uniform Buffer.\r\n this._uniformBuffer = new UniformBuffer(this.getScene().getEngine(), undefined, undefined, name, !this.getScene().getEngine().isWebGPU);\r\n this._buildUniformLayout();\r\n\r\n switch (scene.performancePriority) {\r\n case ScenePerformancePriority.Aggressive:\r\n this.doNotSyncBoundingInfo = true;\r\n // eslint-disable-next-line no-fallthrough\r\n case ScenePerformancePriority.Intermediate:\r\n this.alwaysSelectAsActiveMesh = true;\r\n this.isPickable = false;\r\n break;\r\n }\r\n }\r\n\r\n protected _buildUniformLayout(): void {\r\n this._uniformBuffer.addUniform(\"world\", 16);\r\n this._uniformBuffer.addUniform(\"visibility\", 1);\r\n this._uniformBuffer.create();\r\n }\r\n\r\n /**\r\n * Transfer the mesh values to its UBO.\r\n * @param world The world matrix associated with the mesh\r\n */\r\n public transferToEffect(world: Matrix): void {\r\n const ubo = this._uniformBuffer;\r\n\r\n ubo.updateMatrix(\"world\", world);\r\n ubo.updateFloat(\"visibility\", this._internalAbstractMeshDataInfo._visibility);\r\n\r\n ubo.update();\r\n }\r\n\r\n /**\r\n * Gets the mesh uniform buffer.\r\n * @returns the uniform buffer of the mesh.\r\n */\r\n public getMeshUniformBuffer(): UniformBuffer {\r\n return this._uniformBuffer;\r\n }\r\n\r\n /**\r\n * Returns the string \"AbstractMesh\"\r\n * @returns \"AbstractMesh\"\r\n */\r\n public getClassName(): string {\r\n return \"AbstractMesh\";\r\n }\r\n\r\n /**\r\n * Gets a string representation of the current mesh\r\n * @param fullDetails defines a boolean indicating if full details must be included\r\n * @returns a string representation of the current mesh\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name + \", isInstance: \" + (this.getClassName() !== \"InstancedMesh\" ? \"YES\" : \"NO\");\r\n ret += \", # of submeshes: \" + (this.subMeshes ? this.subMeshes.length : 0);\r\n\r\n const skeleton = this._internalAbstractMeshDataInfo._skeleton;\r\n if (skeleton) {\r\n ret += \", skeleton: \" + skeleton.name;\r\n }\r\n if (fullDetails) {\r\n ret += \", billboard mode: \" + [\"NONE\", \"X\", \"Y\", null, \"Z\", null, null, \"ALL\"][this.billboardMode];\r\n ret += \", freeze wrld mat: \" + (this._isWorldMatrixFrozen || this._waitingData.freezeWorldMatrix ? \"YES\" : \"NO\");\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _getEffectiveParent(): Nullable {\r\n if (this._masterMesh && this.billboardMode !== TransformNode.BILLBOARDMODE_NONE) {\r\n return this._masterMesh;\r\n }\r\n\r\n return super._getEffectiveParent();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getActionManagerForTrigger(trigger?: number, initialCall = true): Nullable {\r\n if (this.actionManager && (initialCall || this.actionManager.isRecursive)) {\r\n if (trigger) {\r\n if (this.actionManager.hasSpecificTrigger(trigger)) {\r\n return this.actionManager;\r\n }\r\n } else {\r\n return this.actionManager;\r\n }\r\n }\r\n\r\n if (!this.parent) {\r\n return null;\r\n }\r\n\r\n return this.parent._getActionManagerForTrigger(trigger, false);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _rebuild(dispose = false): void {\r\n this.onRebuildObservable.notifyObservers(this);\r\n\r\n if (this._occlusionQuery !== null) {\r\n this._occlusionQuery = null;\r\n }\r\n\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n for (const subMesh of this.subMeshes) {\r\n subMesh._rebuild();\r\n }\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n /** @internal */\r\n public _resyncLightSources(): void {\r\n this._lightSources.length = 0;\r\n\r\n for (const light of this.getScene().lights) {\r\n if (!light.isEnabled()) {\r\n continue;\r\n }\r\n\r\n if (light.canAffectMesh(this)) {\r\n this._lightSources.push(light);\r\n }\r\n }\r\n\r\n this._markSubMeshesAsLightDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _resyncLightSource(light: Light): void {\r\n const isIn = light.isEnabled() && light.canAffectMesh(this);\r\n\r\n const index = this._lightSources.indexOf(light);\r\n let removed = false;\r\n if (index === -1) {\r\n if (!isIn) {\r\n return;\r\n }\r\n this._lightSources.push(light);\r\n } else {\r\n if (isIn) {\r\n return;\r\n }\r\n removed = true;\r\n this._lightSources.splice(index, 1);\r\n }\r\n\r\n this._markSubMeshesAsLightDirty(removed);\r\n }\r\n\r\n /** @internal */\r\n public _unBindEffect() {\r\n for (const subMesh of this.subMeshes) {\r\n subMesh.setEffect(null);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _removeLightSource(light: Light, dispose: boolean): void {\r\n const index = this._lightSources.indexOf(light);\r\n\r\n if (index === -1) {\r\n return;\r\n }\r\n this._lightSources.splice(index, 1);\r\n\r\n this._markSubMeshesAsLightDirty(dispose);\r\n }\r\n\r\n private _markSubMeshesAsDirty(func: (defines: MaterialDefines) => void) {\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n for (const subMesh of this.subMeshes) {\r\n for (let i = 0; i < subMesh._drawWrappers.length; ++i) {\r\n const drawWrapper = subMesh._drawWrappers[i];\r\n if (!drawWrapper || !drawWrapper.defines || !(drawWrapper.defines as MaterialDefines).markAllAsDirty) {\r\n continue;\r\n }\r\n func(drawWrapper.defines as MaterialDefines);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _markSubMeshesAsLightDirty(dispose: boolean = false) {\r\n this._markSubMeshesAsDirty((defines) => defines.markAsLightDirty(dispose));\r\n }\r\n\r\n /** @internal */\r\n public _markSubMeshesAsAttributesDirty() {\r\n this._markSubMeshesAsDirty((defines) => defines.markAsAttributesDirty());\r\n }\r\n\r\n /** @internal */\r\n public _markSubMeshesAsMiscDirty() {\r\n this._markSubMeshesAsDirty((defines) => defines.markAsMiscDirty());\r\n }\r\n\r\n /**\r\n * Flag the AbstractMesh as dirty (Forcing it to update everything)\r\n * @param property if set to \"rotation\" the objects rotationQuaternion will be set to null\r\n * @returns this AbstractMesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public markAsDirty(property?: string): AbstractMesh {\r\n this._currentRenderId = Number.MAX_VALUE;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache for all submeshes of this abstract mesh\r\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\r\n */\r\n public resetDrawCache(passId?: number): void {\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n for (const subMesh of this.subMeshes) {\r\n subMesh.resetDrawCache(passId);\r\n }\r\n }\r\n\r\n // Methods\r\n /**\r\n * Returns true if the mesh is blocked. Implemented by child classes\r\n */\r\n public get isBlocked(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns the mesh itself by default. Implemented by child classes\r\n * @param camera defines the camera to use to pick the right LOD level\r\n * @returns the currentAbstractMesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getLOD(camera: Camera): Nullable {\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns 0 by default. Implemented by child classes\r\n * @returns an integer\r\n */\r\n public getTotalVertices(): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Returns a positive integer : the total number of indices in this mesh geometry.\r\n * @returns the number of indices or zero if the mesh has no geometry.\r\n */\r\n public getTotalIndices(): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Returns null by default. Implemented by child classes\r\n * @returns null\r\n */\r\n public getIndices(): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the array of the requested vertex data kind. Implemented by child classes\r\n * @param kind defines the vertex data kind to use\r\n * @returns null\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getVerticesData(kind: string): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Sets the vertex data of the mesh geometry for the requested `kind`.\r\n * If the mesh has no geometry, a new Geometry object is set to the mesh and then passed this vertex data.\r\n * Note that a new underlying VertexBuffer object is created each call.\r\n * If the `kind` is the `PositionKind`, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\r\n * @param kind defines vertex data kind:\r\n * * VertexBuffer.PositionKind\r\n * * VertexBuffer.UVKind\r\n * * VertexBuffer.UV2Kind\r\n * * VertexBuffer.UV3Kind\r\n * * VertexBuffer.UV4Kind\r\n * * VertexBuffer.UV5Kind\r\n * * VertexBuffer.UV6Kind\r\n * * VertexBuffer.ColorKind\r\n * * VertexBuffer.MatricesIndicesKind\r\n * * VertexBuffer.MatricesIndicesExtraKind\r\n * * VertexBuffer.MatricesWeightsKind\r\n * * VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updatable defines if the data must be flagged as updatable (or static)\r\n * @param stride defines the vertex stride (size of an entire vertex). Can be null and in this case will be deduced from vertex data kind\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setVerticesData(kind: string, data: FloatArray, updatable?: boolean, stride?: number): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the existing vertex data of the mesh geometry for the requested `kind`.\r\n * If the mesh has no geometry, it is simply returned as it is.\r\n * @param kind defines vertex data kind:\r\n * * VertexBuffer.PositionKind\r\n * * VertexBuffer.UVKind\r\n * * VertexBuffer.UV2Kind\r\n * * VertexBuffer.UV3Kind\r\n * * VertexBuffer.UV4Kind\r\n * * VertexBuffer.UV5Kind\r\n * * VertexBuffer.UV6Kind\r\n * * VertexBuffer.ColorKind\r\n * * VertexBuffer.MatricesIndicesKind\r\n * * VertexBuffer.MatricesIndicesExtraKind\r\n * * VertexBuffer.MatricesWeightsKind\r\n * * VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updateExtends If `kind` is `PositionKind` and if `updateExtends` is true, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed\r\n * @param makeItUnique If true, a new global geometry is created from this data and is set to the mesh\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the mesh indices,\r\n * If the mesh has no geometry, a new Geometry object is created and set to the mesh.\r\n * @param indices Expects an array populated with integers or a typed array (Int32Array, Uint32Array, Uint16Array)\r\n * @param totalVertices Defines the total number of vertices\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setIndices(indices: IndicesArray, totalVertices: Nullable): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if specific vertex data is present\r\n * @param kind defines the vertex data kind to use\r\n * @returns true is data kind is present\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isVerticesDataPresent(kind: string): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns the mesh BoundingInfo object or creates a new one and returns if it was undefined.\r\n * Note that it returns a shallow bounding of the mesh (i.e. it does not include children).\r\n * However, if the mesh contains thin instances, it will be expanded to include them. If you want the \"raw\" bounding data instead, then use `getRawBoundingInfo()`.\r\n * To get the full bounding of all children, call `getHierarchyBoundingVectors` instead.\r\n * @returns a BoundingInfo\r\n */\r\n public getBoundingInfo(): BoundingInfo {\r\n if (this._masterMesh) {\r\n return this._masterMesh.getBoundingInfo();\r\n }\r\n\r\n if (this._boundingInfoIsDirty) {\r\n this._boundingInfoIsDirty = false;\r\n // this._boundingInfo is being created if undefined\r\n this._updateBoundingInfo();\r\n }\r\n // cannot be null.\r\n return this._boundingInfo!;\r\n }\r\n\r\n /**\r\n * Returns the bounding info unnafected by instance data.\r\n * @returns the bounding info of the mesh unaffected by instance data.\r\n */\r\n public getRawBoundingInfo() {\r\n return this.rawBoundingInfo ?? this.getBoundingInfo();\r\n }\r\n\r\n /**\r\n * Overwrite the current bounding info\r\n * @param boundingInfo defines the new bounding info\r\n * @returns the current mesh\r\n */\r\n public setBoundingInfo(boundingInfo: BoundingInfo): AbstractMesh {\r\n this._boundingInfo = boundingInfo;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns true if there is already a bounding info\r\n */\r\n public get hasBoundingInfo(): boolean {\r\n return this._boundingInfo !== null;\r\n }\r\n\r\n /**\r\n * Creates a new bounding info for the mesh\r\n * @param minimum min vector of the bounding box/sphere\r\n * @param maximum max vector of the bounding box/sphere\r\n * @param worldMatrix defines the new world matrix\r\n * @returns the new bounding info\r\n */\r\n public buildBoundingInfo(minimum: DeepImmutable, maximum: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n this._boundingInfo = new BoundingInfo(minimum, maximum, worldMatrix);\r\n return this._boundingInfo;\r\n }\r\n\r\n /**\r\n * Uniformly scales the mesh to fit inside of a unit cube (1 X 1 X 1 units)\r\n * @param includeDescendants Use the hierarchy's bounding box instead of the mesh's bounding box. Default is false\r\n * @param ignoreRotation ignore rotation when computing the scale (ie. object will be axis aligned). Default is false\r\n * @param predicate predicate that is passed in to getHierarchyBoundingVectors when selecting which object should be included when scaling\r\n * @returns the current mesh\r\n */\r\n public normalizeToUnitCube(includeDescendants = true, ignoreRotation = false, predicate?: Nullable<(node: AbstractMesh) => boolean>): AbstractMesh {\r\n return super.normalizeToUnitCube(includeDescendants, ignoreRotation, predicate);\r\n }\r\n\r\n /** Gets a boolean indicating if this mesh has skinning data and an attached skeleton */\r\n public get useBones(): boolean {\r\n return (\r\n (this.skeleton &&\r\n this.getScene().skeletonsEnabled &&\r\n this.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind) &&\r\n this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind))\r\n );\r\n }\r\n\r\n /** @internal */\r\n public _preActivate(): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _preActivateForIntermediateRendering(renderId: number): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _activate(renderId: number, intermediateRendering: boolean): boolean {\r\n this._renderId = renderId;\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _postActivate(): void {\r\n // Do nothing\r\n }\r\n\r\n /** @internal */\r\n public _freeze() {\r\n // Do nothing\r\n }\r\n\r\n /** @internal */\r\n public _unFreeze() {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Gets the current world matrix\r\n * @returns a Matrix\r\n */\r\n public getWorldMatrix(): Matrix {\r\n if (this._masterMesh && this.billboardMode === TransformNode.BILLBOARDMODE_NONE) {\r\n return this._masterMesh.getWorldMatrix();\r\n }\r\n\r\n return super.getWorldMatrix();\r\n }\r\n\r\n /** @internal */\r\n public _getWorldMatrixDeterminant(): number {\r\n if (this._masterMesh) {\r\n return this._masterMesh._getWorldMatrixDeterminant();\r\n }\r\n\r\n return super._getWorldMatrixDeterminant();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh is an instance or a regular mesh\r\n */\r\n public get isAnInstance(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh has instances\r\n */\r\n public get hasInstances(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh has thin instances\r\n */\r\n public get hasThinInstances(): boolean {\r\n return false;\r\n }\r\n\r\n // ================================== Point of View Movement =================================\r\n\r\n /**\r\n * Perform relative position change from the point of view of behind the front of the mesh.\r\n * This is performed taking into account the meshes current rotation, so you do not have to care.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param amountRight defines the distance on the right axis\r\n * @param amountUp defines the distance on the up axis\r\n * @param amountForward defines the distance on the forward axis\r\n * @returns the current mesh\r\n */\r\n public movePOV(amountRight: number, amountUp: number, amountForward: number): AbstractMesh {\r\n this.position.addInPlace(this.calcMovePOV(amountRight, amountUp, amountForward));\r\n return this;\r\n }\r\n\r\n /**\r\n * Calculate relative position change from the point of view of behind the front of the mesh.\r\n * This is performed taking into account the meshes current rotation, so you do not have to care.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param amountRight defines the distance on the right axis\r\n * @param amountUp defines the distance on the up axis\r\n * @param amountForward defines the distance on the forward axis\r\n * @returns the new displacement vector\r\n */\r\n public calcMovePOV(amountRight: number, amountUp: number, amountForward: number): Vector3 {\r\n const rotMatrix = new Matrix();\r\n const rotQuaternion = this.rotationQuaternion ? this.rotationQuaternion : Quaternion.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z);\r\n rotQuaternion.toRotationMatrix(rotMatrix);\r\n\r\n const translationDelta = Vector3.Zero();\r\n const defForwardMult = this.definedFacingForward ? -1 : 1;\r\n Vector3.TransformCoordinatesFromFloatsToRef(amountRight * defForwardMult, amountUp, amountForward * defForwardMult, rotMatrix, translationDelta);\r\n return translationDelta;\r\n }\r\n // ================================== Point of View Rotation =================================\r\n /**\r\n * Perform relative rotation change from the point of view of behind the front of the mesh.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param flipBack defines the flip\r\n * @param twirlClockwise defines the twirl\r\n * @param tiltRight defines the tilt\r\n * @returns the current mesh\r\n */\r\n public rotatePOV(flipBack: number, twirlClockwise: number, tiltRight: number): AbstractMesh {\r\n this.rotation.addInPlace(this.calcRotatePOV(flipBack, twirlClockwise, tiltRight));\r\n return this;\r\n }\r\n\r\n /**\r\n * Calculate relative rotation change from the point of view of behind the front of the mesh.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param flipBack defines the flip\r\n * @param twirlClockwise defines the twirl\r\n * @param tiltRight defines the tilt\r\n * @returns the new rotation vector\r\n */\r\n public calcRotatePOV(flipBack: number, twirlClockwise: number, tiltRight: number): Vector3 {\r\n const defForwardMult = this.definedFacingForward ? 1 : -1;\r\n return new Vector3(flipBack * defForwardMult, twirlClockwise, tiltRight * defForwardMult);\r\n }\r\n\r\n /**\r\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\r\n * This means the mesh underlying bounding box and sphere are recomputed.\r\n * @param applySkeleton defines whether to apply the skeleton before computing the bounding info\r\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\r\n * @returns the current mesh\r\n */\r\n public refreshBoundingInfo(applySkeleton: boolean = false, applyMorph: boolean = false): AbstractMesh {\r\n if (this._boundingInfo && this._boundingInfo.isLocked) {\r\n return this;\r\n }\r\n\r\n this._refreshBoundingInfo(this._getPositionData(applySkeleton, applyMorph), null);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _refreshBoundingInfo(data: Nullable, bias: Nullable): void {\r\n if (data) {\r\n const extend = extractMinAndMax(data, 0, this.getTotalVertices(), bias);\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n }\r\n\r\n if (this.subMeshes) {\r\n for (let index = 0; index < this.subMeshes.length; index++) {\r\n this.subMeshes[index].refreshBoundingInfo(data);\r\n }\r\n }\r\n\r\n this._updateBoundingInfo();\r\n }\r\n\r\n /**\r\n * Internal function to get buffer data and possibly apply morphs and normals\r\n * @param applySkeleton\r\n * @param applyMorph\r\n * @param data\r\n * @param kind the kind of data you want. Can be Normal or Position\r\n * @returns a FloatArray of the vertex data\r\n */\r\n private _getData(applySkeleton: boolean = false, applyMorph: boolean = false, data?: Nullable, kind: string = VertexBuffer.PositionKind): Nullable {\r\n data = data ?? this.getVerticesData(kind)!.slice();\r\n\r\n if (data && applyMorph && this.morphTargetManager) {\r\n let faceIndexCount = 0;\r\n let positionIndex = 0;\r\n for (let vertexCount = 0; vertexCount < data.length; vertexCount++) {\r\n let value = data[vertexCount];\r\n for (let targetCount = 0; targetCount < this.morphTargetManager.numTargets; targetCount++) {\r\n const targetMorph = this.morphTargetManager.getTarget(targetCount);\r\n const influence = targetMorph.influence;\r\n if (influence !== 0.0) {\r\n let morphTargetData: Nullable = null;\r\n switch (kind) {\r\n case VertexBuffer.PositionKind:\r\n morphTargetData = targetMorph.getPositions();\r\n break;\r\n case VertexBuffer.NormalKind:\r\n morphTargetData = targetMorph.getNormals();\r\n break;\r\n case VertexBuffer.TangentKind:\r\n morphTargetData = targetMorph.getTangents();\r\n break;\r\n case VertexBuffer.UVKind:\r\n morphTargetData = targetMorph.getUVs();\r\n break;\r\n }\r\n if (morphTargetData) {\r\n value += (morphTargetData[vertexCount] - data[vertexCount]) * influence;\r\n }\r\n }\r\n }\r\n data[vertexCount] = value;\r\n\r\n faceIndexCount++;\r\n if (kind === VertexBuffer.PositionKind) {\r\n if (this._positions && faceIndexCount === 3) {\r\n // We want to merge into positions every 3 indices starting (but not 0)\r\n faceIndexCount = 0;\r\n const index = positionIndex * 3;\r\n this._positions[positionIndex++].copyFromFloats(data[index], data[index + 1], data[index + 2]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (data && applySkeleton && this.skeleton) {\r\n const matricesIndicesData = this.getVerticesData(VertexBuffer.MatricesIndicesKind);\r\n const matricesWeightsData = this.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n if (matricesWeightsData && matricesIndicesData) {\r\n const needExtras = this.numBoneInfluencers > 4;\r\n const matricesIndicesExtraData = needExtras ? this.getVerticesData(VertexBuffer.MatricesIndicesExtraKind) : null;\r\n const matricesWeightsExtraData = needExtras ? this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind) : null;\r\n\r\n const skeletonMatrices = this.skeleton.getTransformMatrices(this);\r\n\r\n const tempVector = TmpVectors.Vector3[0];\r\n const finalMatrix = TmpVectors.Matrix[0];\r\n const tempMatrix = TmpVectors.Matrix[1];\r\n\r\n let matWeightIdx = 0;\r\n for (let index = 0; index < data.length; index += 3, matWeightIdx += 4) {\r\n finalMatrix.reset();\r\n\r\n let inf: number;\r\n let weight: number;\r\n for (inf = 0; inf < 4; inf++) {\r\n weight = matricesWeightsData[matWeightIdx + inf];\r\n if (weight > 0) {\r\n Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesData[matWeightIdx + inf] * 16), weight, tempMatrix);\r\n finalMatrix.addToSelf(tempMatrix);\r\n }\r\n }\r\n if (needExtras) {\r\n for (inf = 0; inf < 4; inf++) {\r\n weight = matricesWeightsExtraData![matWeightIdx + inf];\r\n if (weight > 0) {\r\n Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesExtraData![matWeightIdx + inf] * 16), weight, tempMatrix);\r\n finalMatrix.addToSelf(tempMatrix);\r\n }\r\n }\r\n }\r\n\r\n if (kind === VertexBuffer.NormalKind) {\r\n Vector3.TransformNormalFromFloatsToRef(data[index], data[index + 1], data[index + 2], finalMatrix, tempVector);\r\n } else {\r\n Vector3.TransformCoordinatesFromFloatsToRef(data[index], data[index + 1], data[index + 2], finalMatrix, tempVector);\r\n }\r\n tempVector.toArray(data, index);\r\n\r\n if (kind === VertexBuffer.PositionKind && this._positions) {\r\n this._positions[index / 3].copyFrom(tempVector);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Get the normals vertex data and optionally apply skeleton and morphing.\r\n * @param applySkeleton defines whether to apply the skeleton\r\n * @param applyMorph defines whether to apply the morph target\r\n * @returns the normals data\r\n */\r\n public getNormalsData(applySkeleton = false, applyMorph = false): Nullable {\r\n return this._getData(applySkeleton, applyMorph, null, VertexBuffer.NormalKind);\r\n }\r\n\r\n /**\r\n * Get the position vertex data and optionally apply skeleton and morphing.\r\n * @param applySkeleton defines whether to apply the skeleton\r\n * @param applyMorph defines whether to apply the morph target\r\n * @param data defines the position data to apply the skeleton and morph to\r\n * @returns the position data\r\n */\r\n public getPositionData(applySkeleton: boolean = false, applyMorph: boolean = false, data?: Nullable): Nullable {\r\n return this._getData(applySkeleton, applyMorph, data, VertexBuffer.PositionKind);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getPositionData(applySkeleton: boolean, applyMorph: boolean): Nullable {\r\n let data = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (this._internalAbstractMeshDataInfo._positions) {\r\n this._internalAbstractMeshDataInfo._positions = null;\r\n }\r\n\r\n if (data && ((applySkeleton && this.skeleton) || (applyMorph && this.morphTargetManager))) {\r\n data = data.slice();\r\n this._generatePointsArray();\r\n if (this._positions) {\r\n const pos = this._positions;\r\n this._internalAbstractMeshDataInfo._positions = new Array(pos.length);\r\n for (let i = 0; i < pos.length; i++) {\r\n this._internalAbstractMeshDataInfo._positions[i] = pos[i]?.clone() || new Vector3();\r\n }\r\n }\r\n return this.getPositionData(applySkeleton, applyMorph, data);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /** @internal */\r\n public _updateBoundingInfo(): AbstractMesh {\r\n if (this._boundingInfo) {\r\n this._boundingInfo.update(this.worldMatrixFromCache);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(Vector3.Zero(), Vector3.Zero(), this.worldMatrixFromCache);\r\n }\r\n this._updateSubMeshesBoundingInfo(this.worldMatrixFromCache);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateSubMeshesBoundingInfo(matrix: DeepImmutable): AbstractMesh {\r\n if (!this.subMeshes) {\r\n return this;\r\n }\r\n const count = this.subMeshes.length;\r\n for (let subIndex = 0; subIndex < count; subIndex++) {\r\n const subMesh = this.subMeshes[subIndex];\r\n if (count > 1 || !subMesh.IsGlobal) {\r\n subMesh.updateBoundingInfo(matrix);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n protected _afterComputeWorldMatrix(): void {\r\n if (this.doNotSyncBoundingInfo) {\r\n return;\r\n }\r\n // Bounding info\r\n this._boundingInfoIsDirty = true;\r\n }\r\n\r\n /**\r\n * Returns `true` if the mesh is within the frustum defined by the passed array of planes.\r\n * A mesh is in the frustum if its bounding box intersects the frustum\r\n * @param frustumPlanes defines the frustum to test\r\n * @returns true if the mesh is in the frustum planes\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n return this.getBoundingInfo().isInFrustum(frustumPlanes, this.cullingStrategy);\r\n }\r\n\r\n /**\r\n * Returns `true` if the mesh is completely in the frustum defined be the passed array of planes.\r\n * A mesh is completely in the frustum if its bounding box it completely inside the frustum.\r\n * @param frustumPlanes defines the frustum to test\r\n * @returns true if the mesh is completely in the frustum planes\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Plane[]): boolean {\r\n return this.getBoundingInfo().isCompletelyInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * True if the mesh intersects another mesh or a SolidParticle object\r\n * @param mesh defines a target mesh or SolidParticle to test\r\n * @param precise Unless the parameter `precise` is set to `true` the intersection is computed according to Axis Aligned Bounding Boxes (AABB), else according to OBB (Oriented BBoxes)\r\n * @param includeDescendants Can be set to true to test if the mesh defined in parameters intersects with the current mesh or any child meshes\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsMesh(mesh: AbstractMesh | SolidParticle, precise: boolean = false, includeDescendants?: boolean): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n const otherBoundingInfo = mesh.getBoundingInfo();\r\n\r\n if (boundingInfo.intersects(otherBoundingInfo, precise)) {\r\n return true;\r\n }\r\n\r\n if (includeDescendants) {\r\n for (const child of this.getChildMeshes()) {\r\n if (child.intersectsMesh(mesh, precise, true)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns true if the passed point (Vector3) is inside the mesh bounding box\r\n * @param point defines the point to test\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsPoint(point: Vector3): boolean {\r\n return this.getBoundingInfo().intersectsPoint(point);\r\n }\r\n\r\n // Collisions\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this mesh can be used in the collision engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public get checkCollisions(): boolean {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._checkCollisions;\r\n }\r\n\r\n public set checkCollisions(collisionEnabled: boolean) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._checkCollisions = collisionEnabled;\r\n }\r\n\r\n /**\r\n * Gets Collider object used to compute collisions (not physics)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public get collider(): Nullable {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collider;\r\n }\r\n\r\n /**\r\n * Move the mesh using collision engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n * @param displacement defines the requested displacement vector\r\n * @returns the current mesh\r\n */\r\n public moveWithCollisions(displacement: Vector3): AbstractMesh {\r\n const globalPosition = this.getAbsolutePosition();\r\n\r\n globalPosition.addToRef(this.ellipsoidOffset, this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions);\r\n const coordinator = this.getScene().collisionCoordinator;\r\n\r\n if (!this._internalAbstractMeshDataInfo._meshCollisionData._collider) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collider = coordinator.createCollider();\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collider._radius = this.ellipsoid;\r\n\r\n coordinator.getNewPosition(\r\n this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions,\r\n displacement,\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collider,\r\n this.collisionRetryCount,\r\n this,\r\n this._onCollisionPositionChange,\r\n this.uniqueId\r\n );\r\n return this;\r\n }\r\n\r\n private _onCollisionPositionChange = (collisionId: number, newPosition: Vector3, collidedMesh: Nullable = null) => {\r\n newPosition.subtractToRef(\r\n this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions,\r\n this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions\r\n );\r\n\r\n if (this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions.length() > Engine.CollisionsEpsilon) {\r\n this.position.addInPlace(this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions);\r\n }\r\n\r\n if (collidedMesh) {\r\n this.onCollideObservable.notifyObservers(collidedMesh);\r\n }\r\n\r\n this.onCollisionPositionChangeObservable.notifyObservers(this.position);\r\n };\r\n\r\n // Collisions\r\n /**\r\n * @internal\r\n */\r\n public _collideForSubMesh(subMesh: SubMesh, transformMatrix: Matrix, collider: Collider): AbstractMesh {\r\n this._generatePointsArray();\r\n\r\n if (!this._positions) {\r\n return this;\r\n }\r\n\r\n // Transformation\r\n if (!subMesh._lastColliderWorldVertices || !subMesh._lastColliderTransformMatrix!.equals(transformMatrix)) {\r\n subMesh._lastColliderTransformMatrix = transformMatrix.clone();\r\n subMesh._lastColliderWorldVertices = [];\r\n subMesh._trianglePlanes = [];\r\n const start = subMesh.verticesStart;\r\n const end = subMesh.verticesStart + subMesh.verticesCount;\r\n for (let i = start; i < end; i++) {\r\n subMesh._lastColliderWorldVertices.push(Vector3.TransformCoordinates(this._positions[i], transformMatrix));\r\n }\r\n }\r\n\r\n // Collide\r\n collider._collide(\r\n subMesh._trianglePlanes,\r\n subMesh._lastColliderWorldVertices,\r\n this.getIndices(),\r\n subMesh.indexStart,\r\n subMesh.indexStart + subMesh.indexCount,\r\n subMesh.verticesStart,\r\n !!subMesh.getMaterial(),\r\n this,\r\n this._shouldConvertRHS(),\r\n subMesh.getMaterial()?.fillMode === Constants.MATERIAL_TriangleStripDrawMode\r\n );\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processCollisionsForSubMeshes(collider: Collider, transformMatrix: Matrix): AbstractMesh {\r\n const subMeshes = this._scene.getCollidingSubMeshCandidates(this, collider);\r\n const len = subMeshes.length;\r\n\r\n for (let index = 0; index < len; index++) {\r\n const subMesh = subMeshes.data[index];\r\n\r\n // Bounding test\r\n if (len > 1 && !subMesh._checkCollision(collider)) {\r\n continue;\r\n }\r\n\r\n this._collideForSubMesh(subMesh, transformMatrix, collider);\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public _shouldConvertRHS() {\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _checkCollision(collider: Collider): AbstractMesh {\r\n // Bounding box test\r\n if (!this.getBoundingInfo()._checkCollision(collider)) {\r\n return this;\r\n }\r\n\r\n // Transformation matrix\r\n const collisionsScalingMatrix = TmpVectors.Matrix[0];\r\n const collisionsTransformMatrix = TmpVectors.Matrix[1];\r\n Matrix.ScalingToRef(1.0 / collider._radius.x, 1.0 / collider._radius.y, 1.0 / collider._radius.z, collisionsScalingMatrix);\r\n this.worldMatrixFromCache.multiplyToRef(collisionsScalingMatrix, collisionsTransformMatrix);\r\n this._processCollisionsForSubMeshes(collider, collisionsTransformMatrix);\r\n return this;\r\n }\r\n\r\n // Picking\r\n /** @internal */\r\n public _generatePointsArray(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if the passed Ray intersects with the mesh. A mesh triangle can be picked both from its front and back sides,\r\n * irrespective of orientation.\r\n * @param ray defines the ray to use. It should be in the mesh's LOCAL coordinate space.\r\n * @param fastCheck defines if fast mode (but less precise) must be used (false by default)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\r\n * @param worldToUse defines the world matrix to use to get the world coordinate of the intersection point\r\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\r\n * @returns the picking info\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\r\n */\r\n public intersects(\r\n ray: Ray,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate,\r\n onlyBoundingInfo = false,\r\n worldToUse?: Matrix,\r\n skipBoundingInfo = false\r\n ): PickingInfo {\r\n const pickingInfo = new PickingInfo();\r\n const className = this.getClassName();\r\n const intersectionThreshold = className === \"InstancedLinesMesh\" || className === \"LinesMesh\" || className === \"GreasedLineMesh\" ? (this as any).intersectionThreshold : 0;\r\n const boundingInfo = this.getBoundingInfo();\r\n if (!this.subMeshes) {\r\n return pickingInfo;\r\n }\r\n if (\r\n !skipBoundingInfo &&\r\n (!ray.intersectsSphere(boundingInfo.boundingSphere, intersectionThreshold) || !ray.intersectsBox(boundingInfo.boundingBox, intersectionThreshold))\r\n ) {\r\n return pickingInfo;\r\n }\r\n\r\n if (onlyBoundingInfo) {\r\n pickingInfo.hit = skipBoundingInfo ? false : true;\r\n pickingInfo.pickedMesh = skipBoundingInfo ? null : this;\r\n pickingInfo.distance = skipBoundingInfo ? 0 : Vector3.Distance(ray.origin, boundingInfo.boundingSphere.center);\r\n pickingInfo.subMeshId = 0;\r\n return pickingInfo;\r\n }\r\n\r\n if (!this._generatePointsArray()) {\r\n return pickingInfo;\r\n }\r\n\r\n let intersectInfo: Nullable = null;\r\n\r\n const subMeshes = this._scene.getIntersectingSubMeshCandidates(this, ray);\r\n const len: number = subMeshes.length;\r\n\r\n // Check if all submeshes are using a material that don't allow picking (point/lines rendering)\r\n // if no submesh can be picked that way, then fallback to BBox picking\r\n let anySubmeshSupportIntersect = false;\r\n for (let index = 0; index < len; index++) {\r\n const subMesh = subMeshes.data[index];\r\n const material = subMesh.getMaterial();\r\n if (!material) {\r\n continue;\r\n }\r\n if (\r\n material.fillMode == Constants.MATERIAL_TriangleStripDrawMode ||\r\n material.fillMode == Constants.MATERIAL_TriangleFillMode ||\r\n material.fillMode == Constants.MATERIAL_WireFrameFillMode ||\r\n material.fillMode == Constants.MATERIAL_PointFillMode ||\r\n material.fillMode == Constants.MATERIAL_LineListDrawMode\r\n ) {\r\n anySubmeshSupportIntersect = true;\r\n break;\r\n }\r\n }\r\n\r\n // no sub mesh support intersection, fallback to BBox that has already be done\r\n if (!anySubmeshSupportIntersect) {\r\n pickingInfo.hit = true;\r\n pickingInfo.pickedMesh = this;\r\n pickingInfo.distance = Vector3.Distance(ray.origin, boundingInfo.boundingSphere.center);\r\n pickingInfo.subMeshId = -1;\r\n return pickingInfo;\r\n }\r\n\r\n // at least 1 submesh supports intersection, keep going\r\n for (let index = 0; index < len; index++) {\r\n const subMesh = subMeshes.data[index];\r\n\r\n // Bounding test\r\n if (len > 1 && !skipBoundingInfo && !subMesh.canIntersects(ray)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = subMesh.intersects(ray, this._positions, this.getIndices(), fastCheck, trianglePredicate);\r\n\r\n if (currentIntersectInfo) {\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.subMeshId = index;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (intersectInfo) {\r\n // Get picked point\r\n const world = worldToUse ?? this.getWorldMatrix();\r\n const worldOrigin = TmpVectors.Vector3[0];\r\n const direction = TmpVectors.Vector3[1];\r\n Vector3.TransformCoordinatesToRef(ray.origin, world, worldOrigin);\r\n ray.direction.scaleToRef(intersectInfo.distance, direction);\r\n const worldDirection = Vector3.TransformNormal(direction, world);\r\n const pickedPoint = worldDirection.addInPlace(worldOrigin);\r\n\r\n // Return result\r\n pickingInfo.hit = true;\r\n pickingInfo.distance = Vector3.Distance(worldOrigin, pickedPoint);\r\n pickingInfo.pickedPoint = pickedPoint;\r\n pickingInfo.pickedMesh = this;\r\n pickingInfo.bu = intersectInfo.bu || 0;\r\n pickingInfo.bv = intersectInfo.bv || 0;\r\n pickingInfo.subMeshFaceId = intersectInfo.faceId;\r\n pickingInfo.faceId = intersectInfo.faceId + subMeshes.data[intersectInfo.subMeshId].indexStart / (this.getClassName().indexOf(\"LinesMesh\") !== -1 ? 2 : 3);\r\n pickingInfo.subMeshId = intersectInfo.subMeshId;\r\n return pickingInfo;\r\n }\r\n\r\n return pickingInfo;\r\n }\r\n\r\n /**\r\n * Clones the current mesh\r\n * @param name defines the mesh name\r\n * @param newParent defines the new mesh parent\r\n * @param doNotCloneChildren defines a boolean indicating that children must not be cloned (false by default)\r\n * @returns the new mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public clone(name: string, newParent: Nullable, doNotCloneChildren?: boolean): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Disposes all the submeshes of the current meshnp\r\n * @returns the current mesh\r\n */\r\n public releaseSubMeshes(): AbstractMesh {\r\n if (this.subMeshes) {\r\n while (this.subMeshes.length) {\r\n this.subMeshes[0].dispose();\r\n }\r\n } else {\r\n this.subMeshes = [] as SubMesh[];\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Releases resources associated with this abstract mesh.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n let index: number;\r\n\r\n const scene = this.getScene();\r\n\r\n // mesh map release.\r\n if (this._scene.useMaterialMeshMap) {\r\n // remove from material mesh map id needed\r\n if (this._internalAbstractMeshDataInfo._material && this._internalAbstractMeshDataInfo._material.meshMap) {\r\n this._internalAbstractMeshDataInfo._material.meshMap[this.uniqueId] = undefined;\r\n }\r\n }\r\n\r\n // Smart Array Retainers.\r\n scene.freeActiveMeshes();\r\n scene.freeRenderingGroups();\r\n if (scene.renderingManager.maintainStateBetweenFrames) {\r\n scene.renderingManager.restoreDispachedFlags();\r\n }\r\n\r\n // Action manager\r\n if (this.actionManager !== undefined && this.actionManager !== null) {\r\n // If it's the only mesh using the action manager, dispose of it.\r\n if (!this._scene.meshes.some((m) => m !== this && m.actionManager === this.actionManager)) {\r\n this.actionManager.dispose();\r\n }\r\n this.actionManager = null;\r\n }\r\n\r\n // Skeleton\r\n this._internalAbstractMeshDataInfo._skeleton = null;\r\n\r\n if (this._transformMatrixTexture) {\r\n this._transformMatrixTexture.dispose();\r\n this._transformMatrixTexture = null;\r\n }\r\n\r\n // Intersections in progress\r\n for (index = 0; index < this._intersectionsInProgress.length; index++) {\r\n const other = this._intersectionsInProgress[index];\r\n\r\n const pos = other._intersectionsInProgress.indexOf(this);\r\n other._intersectionsInProgress.splice(pos, 1);\r\n }\r\n\r\n this._intersectionsInProgress.length = 0;\r\n\r\n // Lights\r\n const lights = scene.lights;\r\n\r\n lights.forEach((light: Light) => {\r\n let meshIndex = light.includedOnlyMeshes.indexOf(this);\r\n\r\n if (meshIndex !== -1) {\r\n light.includedOnlyMeshes.splice(meshIndex, 1);\r\n }\r\n\r\n meshIndex = light.excludedMeshes.indexOf(this);\r\n\r\n if (meshIndex !== -1) {\r\n light.excludedMeshes.splice(meshIndex, 1);\r\n }\r\n\r\n // Shadow generators\r\n const generators = light.getShadowGenerators();\r\n if (generators) {\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n const shadowMap = generator.getShadowMap();\r\n\r\n if (shadowMap && shadowMap.renderList) {\r\n meshIndex = shadowMap.renderList.indexOf(this);\r\n\r\n if (meshIndex !== -1) {\r\n shadowMap.renderList.splice(meshIndex, 1);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n // SubMeshes\r\n if (this.getClassName() !== \"InstancedMesh\" || this.getClassName() !== \"InstancedLinesMesh\") {\r\n this.releaseSubMeshes();\r\n }\r\n\r\n // Query\r\n const engine = scene.getEngine();\r\n if (this._occlusionQuery !== null) {\r\n this.isOcclusionQueryInProgress = false;\r\n engine.deleteQuery(this._occlusionQuery);\r\n this._occlusionQuery = null;\r\n }\r\n\r\n // Engine\r\n engine.wipeCaches();\r\n\r\n // Remove from scene\r\n scene.removeMesh(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.meshes.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.meshes.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n if (disposeMaterialAndTextures) {\r\n if (this.material) {\r\n if (this.material.getClassName() === \"MultiMaterial\") {\r\n this.material.dispose(false, true, true);\r\n } else {\r\n this.material.dispose(false, true);\r\n }\r\n }\r\n }\r\n\r\n if (!doNotRecurse) {\r\n // Particles\r\n for (index = 0; index < scene.particleSystems.length; index++) {\r\n if (scene.particleSystems[index].emitter === this) {\r\n scene.particleSystems[index].dispose();\r\n index--;\r\n }\r\n }\r\n }\r\n\r\n // facet data\r\n if (this._internalAbstractMeshDataInfo._facetData.facetDataEnabled) {\r\n this.disableFacetData();\r\n }\r\n\r\n this._uniformBuffer.dispose();\r\n\r\n this.onAfterWorldMatrixUpdateObservable.clear();\r\n this.onCollideObservable.clear();\r\n this.onCollisionPositionChangeObservable.clear();\r\n this.onRebuildObservable.clear();\r\n\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n /**\r\n * Adds the passed mesh as a child to the current mesh\r\n * @param mesh defines the child mesh\r\n * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.\r\n * @returns the current mesh\r\n */\r\n public addChild(mesh: AbstractMesh, preserveScalingSign: boolean = false): AbstractMesh {\r\n mesh.setParent(this, preserveScalingSign);\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes the passed mesh from the current mesh children list\r\n * @param mesh defines the child mesh\r\n * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.\r\n * @returns the current mesh\r\n */\r\n public removeChild(mesh: AbstractMesh, preserveScalingSign: boolean = false): AbstractMesh {\r\n mesh.setParent(null, preserveScalingSign);\r\n return this;\r\n }\r\n\r\n // Facet data\r\n /** @internal */\r\n private _initFacetData(): AbstractMesh {\r\n const data = this._internalAbstractMeshDataInfo._facetData;\r\n if (!data.facetNormals) {\r\n data.facetNormals = [] as Vector3[];\r\n }\r\n if (!data.facetPositions) {\r\n data.facetPositions = [] as Vector3[];\r\n }\r\n if (!data.facetPartitioning) {\r\n data.facetPartitioning = new Array();\r\n }\r\n data.facetNb = ((this.getIndices()).length / 3) | 0;\r\n data.partitioningSubdivisions = data.partitioningSubdivisions ? data.partitioningSubdivisions : 10; // default nb of partitioning subdivisions = 10\r\n data.partitioningBBoxRatio = data.partitioningBBoxRatio ? data.partitioningBBoxRatio : 1.01; // default ratio 1.01 = the partitioning is 1% bigger than the bounding box\r\n for (let f = 0; f < data.facetNb; f++) {\r\n data.facetNormals[f] = Vector3.Zero();\r\n data.facetPositions[f] = Vector3.Zero();\r\n }\r\n data.facetDataEnabled = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the mesh facetData arrays and the internal partitioning when the mesh is morphed or updated.\r\n * This method can be called within the render loop.\r\n * You don't need to call this method by yourself in the render loop when you update/morph a mesh with the methods CreateXXX() as they automatically manage this computation\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public updateFacetData(): AbstractMesh {\r\n const data = this._internalAbstractMeshDataInfo._facetData;\r\n if (!data.facetDataEnabled) {\r\n this._initFacetData();\r\n }\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = this.getIndices();\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n const bInfo = this.getBoundingInfo();\r\n\r\n if (data.facetDepthSort && !data.facetDepthSortEnabled) {\r\n // init arrays, matrix and sort function on first call\r\n data.facetDepthSortEnabled = true;\r\n if (indices instanceof Uint16Array) {\r\n data.depthSortedIndices = new Uint16Array(indices!);\r\n } else if (indices instanceof Uint32Array) {\r\n data.depthSortedIndices = new Uint32Array(indices!);\r\n } else {\r\n let needs32bits = false;\r\n for (let i = 0; i < indices!.length; i++) {\r\n if (indices![i] > 65535) {\r\n needs32bits = true;\r\n break;\r\n }\r\n }\r\n if (needs32bits) {\r\n data.depthSortedIndices = new Uint32Array(indices!);\r\n } else {\r\n data.depthSortedIndices = new Uint16Array(indices!);\r\n }\r\n }\r\n data.facetDepthSortFunction = function (f1, f2) {\r\n return f2.sqDistance - f1.sqDistance;\r\n };\r\n if (!data.facetDepthSortFrom) {\r\n const camera = this.getScene().activeCamera;\r\n data.facetDepthSortFrom = camera ? camera.position : Vector3.Zero();\r\n }\r\n data.depthSortedFacets = [];\r\n for (let f = 0; f < data.facetNb; f++) {\r\n const depthSortedFacet = { ind: f * 3, sqDistance: 0.0 };\r\n data.depthSortedFacets.push(depthSortedFacet);\r\n }\r\n data.invertedMatrix = Matrix.Identity();\r\n data.facetDepthSortOrigin = Vector3.Zero();\r\n }\r\n\r\n data.bbSize.x = bInfo.maximum.x - bInfo.minimum.x > Epsilon ? bInfo.maximum.x - bInfo.minimum.x : Epsilon;\r\n data.bbSize.y = bInfo.maximum.y - bInfo.minimum.y > Epsilon ? bInfo.maximum.y - bInfo.minimum.y : Epsilon;\r\n data.bbSize.z = bInfo.maximum.z - bInfo.minimum.z > Epsilon ? bInfo.maximum.z - bInfo.minimum.z : Epsilon;\r\n let bbSizeMax = data.bbSize.x > data.bbSize.y ? data.bbSize.x : data.bbSize.y;\r\n bbSizeMax = bbSizeMax > data.bbSize.z ? bbSizeMax : data.bbSize.z;\r\n data.subDiv.max = data.partitioningSubdivisions;\r\n data.subDiv.X = Math.floor((data.subDiv.max * data.bbSize.x) / bbSizeMax); // adjust the number of subdivisions per axis\r\n data.subDiv.Y = Math.floor((data.subDiv.max * data.bbSize.y) / bbSizeMax); // according to each bbox size per axis\r\n data.subDiv.Z = Math.floor((data.subDiv.max * data.bbSize.z) / bbSizeMax);\r\n data.subDiv.X = data.subDiv.X < 1 ? 1 : data.subDiv.X; // at least one subdivision\r\n data.subDiv.Y = data.subDiv.Y < 1 ? 1 : data.subDiv.Y;\r\n data.subDiv.Z = data.subDiv.Z < 1 ? 1 : data.subDiv.Z;\r\n // set the parameters for ComputeNormals()\r\n data.facetParameters.facetNormals = this.getFacetLocalNormals();\r\n data.facetParameters.facetPositions = this.getFacetLocalPositions();\r\n data.facetParameters.facetPartitioning = this.getFacetLocalPartitioning();\r\n data.facetParameters.bInfo = bInfo;\r\n data.facetParameters.bbSize = data.bbSize;\r\n data.facetParameters.subDiv = data.subDiv;\r\n data.facetParameters.ratio = this.partitioningBBoxRatio;\r\n data.facetParameters.depthSort = data.facetDepthSort;\r\n if (data.facetDepthSort && data.facetDepthSortEnabled) {\r\n this.computeWorldMatrix(true);\r\n this._worldMatrix.invertToRef(data.invertedMatrix);\r\n Vector3.TransformCoordinatesToRef(data.facetDepthSortFrom, data.invertedMatrix, data.facetDepthSortOrigin);\r\n data.facetParameters.distanceTo = data.facetDepthSortOrigin;\r\n }\r\n data.facetParameters.depthSortedFacets = data.depthSortedFacets;\r\n if (normals) {\r\n VertexData.ComputeNormals(positions, indices, normals, data.facetParameters);\r\n }\r\n\r\n if (data.facetDepthSort && data.facetDepthSortEnabled) {\r\n data.depthSortedFacets.sort(data.facetDepthSortFunction);\r\n const l = (data.depthSortedIndices.length / 3) | 0;\r\n for (let f = 0; f < l; f++) {\r\n const sind = data.depthSortedFacets[f].ind;\r\n data.depthSortedIndices[f * 3] = indices![sind];\r\n data.depthSortedIndices[f * 3 + 1] = indices![sind + 1];\r\n data.depthSortedIndices[f * 3 + 2] = indices![sind + 2];\r\n }\r\n this.updateIndices(data.depthSortedIndices, undefined, true);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the facetLocalNormals array.\r\n * The normals are expressed in the mesh local spac\r\n * @returns an array of Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetLocalNormals(): Vector3[] {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n if (!facetData.facetNormals) {\r\n this.updateFacetData();\r\n }\r\n return facetData.facetNormals;\r\n }\r\n\r\n /**\r\n * Returns the facetLocalPositions array.\r\n * The facet positions are expressed in the mesh local space\r\n * @returns an array of Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetLocalPositions(): Vector3[] {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n if (!facetData.facetPositions) {\r\n this.updateFacetData();\r\n }\r\n return facetData.facetPositions;\r\n }\r\n\r\n /**\r\n * Returns the facetLocalPartitioning array\r\n * @returns an array of array of numbers\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetLocalPartitioning(): number[][] {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n\r\n if (!facetData.facetPartitioning) {\r\n this.updateFacetData();\r\n }\r\n return facetData.facetPartitioning;\r\n }\r\n\r\n /**\r\n * Returns the i-th facet position in the world system.\r\n * This method allocates a new Vector3 per call\r\n * @param i defines the facet index\r\n * @returns a new Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetPosition(i: number): Vector3 {\r\n const pos = Vector3.Zero();\r\n this.getFacetPositionToRef(i, pos);\r\n return pos;\r\n }\r\n\r\n /**\r\n * Sets the reference Vector3 with the i-th facet position in the world system\r\n * @param i defines the facet index\r\n * @param ref defines the target vector\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetPositionToRef(i: number, ref: Vector3): AbstractMesh {\r\n const localPos = this.getFacetLocalPositions()[i];\r\n const world = this.getWorldMatrix();\r\n Vector3.TransformCoordinatesToRef(localPos, world, ref);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the i-th facet normal in the world system.\r\n * This method allocates a new Vector3 per call\r\n * @param i defines the facet index\r\n * @returns a new Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetNormal(i: number): Vector3 {\r\n const norm = Vector3.Zero();\r\n this.getFacetNormalToRef(i, norm);\r\n return norm;\r\n }\r\n\r\n /**\r\n * Sets the reference Vector3 with the i-th facet normal in the world system\r\n * @param i defines the facet index\r\n * @param ref defines the target vector\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetNormalToRef(i: number, ref: Vector3) {\r\n const localNorm = this.getFacetLocalNormals()[i];\r\n Vector3.TransformNormalToRef(localNorm, this.getWorldMatrix(), ref);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the facets (in an array) in the same partitioning block than the one the passed coordinates are located (expressed in the mesh local system)\r\n * @param x defines x coordinate\r\n * @param y defines y coordinate\r\n * @param z defines z coordinate\r\n * @returns the array of facet indexes\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetsAtLocalCoordinates(x: number, y: number, z: number): Nullable {\r\n const bInfo = this.getBoundingInfo();\r\n const data = this._internalAbstractMeshDataInfo._facetData;\r\n\r\n const ox = Math.floor(((x - bInfo.minimum.x * data.partitioningBBoxRatio) * data.subDiv.X * data.partitioningBBoxRatio) / data.bbSize.x);\r\n const oy = Math.floor(((y - bInfo.minimum.y * data.partitioningBBoxRatio) * data.subDiv.Y * data.partitioningBBoxRatio) / data.bbSize.y);\r\n const oz = Math.floor(((z - bInfo.minimum.z * data.partitioningBBoxRatio) * data.subDiv.Z * data.partitioningBBoxRatio) / data.bbSize.z);\r\n if (ox < 0 || ox > data.subDiv.max || oy < 0 || oy > data.subDiv.max || oz < 0 || oz > data.subDiv.max) {\r\n return null;\r\n }\r\n return data.facetPartitioning[ox + data.subDiv.max * oy + data.subDiv.max * data.subDiv.max * oz];\r\n }\r\n\r\n /**\r\n * Returns the closest mesh facet index at (x,y,z) World coordinates, null if not found\r\n * @param x defines x coordinate\r\n * @param y defines y coordinate\r\n * @param z defines z coordinate\r\n * @param projected sets as the (x,y,z) world projection on the facet\r\n * @param checkFace if true (default false), only the facet \"facing\" to (x,y,z) or only the ones \"turning their backs\", according to the parameter \"facing\" are returned\r\n * @param facing if facing and checkFace are true, only the facet \"facing\" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet \"turning their backs\" to (x, y, z) are returned : negative dot (x, y, z) * facet position\r\n * @returns the face index if found (or null instead)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getClosestFacetAtCoordinates(x: number, y: number, z: number, projected?: Vector3, checkFace: boolean = false, facing: boolean = true): Nullable {\r\n const world = this.getWorldMatrix();\r\n const invMat = TmpVectors.Matrix[5];\r\n world.invertToRef(invMat);\r\n const invVect = TmpVectors.Vector3[8];\r\n Vector3.TransformCoordinatesFromFloatsToRef(x, y, z, invMat, invVect); // transform (x,y,z) to coordinates in the mesh local space\r\n const closest = this.getClosestFacetAtLocalCoordinates(invVect.x, invVect.y, invVect.z, projected, checkFace, facing);\r\n if (projected) {\r\n // transform the local computed projected vector to world coordinates\r\n Vector3.TransformCoordinatesFromFloatsToRef(projected.x, projected.y, projected.z, world, projected);\r\n }\r\n return closest;\r\n }\r\n\r\n /**\r\n * Returns the closest mesh facet index at (x,y,z) local coordinates, null if not found\r\n * @param x defines x coordinate\r\n * @param y defines y coordinate\r\n * @param z defines z coordinate\r\n * @param projected sets as the (x,y,z) local projection on the facet\r\n * @param checkFace if true (default false), only the facet \"facing\" to (x,y,z) or only the ones \"turning their backs\", according to the parameter \"facing\" are returned\r\n * @param facing if facing and checkFace are true, only the facet \"facing\" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet \"turning their backs\" to (x, y, z) are returned : negative dot (x, y, z) * facet position\r\n * @returns the face index if found (or null instead)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getClosestFacetAtLocalCoordinates(x: number, y: number, z: number, projected?: Vector3, checkFace: boolean = false, facing: boolean = true): Nullable {\r\n let closest = null;\r\n let tmpx = 0.0;\r\n let tmpy = 0.0;\r\n let tmpz = 0.0;\r\n let d = 0.0; // tmp dot facet normal * facet position\r\n let t0 = 0.0;\r\n let projx = 0.0;\r\n let projy = 0.0;\r\n let projz = 0.0;\r\n // Get all the facets in the same partitioning block than (x, y, z)\r\n const facetPositions = this.getFacetLocalPositions();\r\n const facetNormals = this.getFacetLocalNormals();\r\n const facetsInBlock = this.getFacetsAtLocalCoordinates(x, y, z);\r\n if (!facetsInBlock) {\r\n return null;\r\n }\r\n // Get the closest facet to (x, y, z)\r\n let shortest = Number.MAX_VALUE; // init distance vars\r\n let tmpDistance = shortest;\r\n let fib; // current facet in the block\r\n let norm; // current facet normal\r\n let p0; // current facet barycenter position\r\n // loop on all the facets in the current partitioning block\r\n for (let idx = 0; idx < facetsInBlock.length; idx++) {\r\n fib = facetsInBlock[idx];\r\n norm = facetNormals[fib];\r\n p0 = facetPositions[fib];\r\n\r\n d = (x - p0.x) * norm.x + (y - p0.y) * norm.y + (z - p0.z) * norm.z;\r\n if (!checkFace || (checkFace && facing && d >= 0.0) || (checkFace && !facing && d <= 0.0)) {\r\n // compute (x,y,z) projection on the facet = (projx, projy, projz)\r\n d = norm.x * p0.x + norm.y * p0.y + norm.z * p0.z;\r\n t0 = -(norm.x * x + norm.y * y + norm.z * z - d) / (norm.x * norm.x + norm.y * norm.y + norm.z * norm.z);\r\n projx = x + norm.x * t0;\r\n projy = y + norm.y * t0;\r\n projz = z + norm.z * t0;\r\n\r\n tmpx = projx - x;\r\n tmpy = projy - y;\r\n tmpz = projz - z;\r\n tmpDistance = tmpx * tmpx + tmpy * tmpy + tmpz * tmpz; // compute length between (x, y, z) and its projection on the facet\r\n if (tmpDistance < shortest) {\r\n // just keep the closest facet to (x, y, z)\r\n shortest = tmpDistance;\r\n closest = fib;\r\n if (projected) {\r\n projected.x = projx;\r\n projected.y = projy;\r\n projected.z = projz;\r\n }\r\n }\r\n }\r\n }\r\n return closest;\r\n }\r\n\r\n /**\r\n * Returns the object \"parameter\" set with all the expected parameters for facetData computation by ComputeNormals()\r\n * @returns the parameters\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetDataParameters(): any {\r\n return this._internalAbstractMeshDataInfo._facetData.facetParameters;\r\n }\r\n\r\n /**\r\n * Disables the feature FacetData and frees the related memory\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public disableFacetData(): AbstractMesh {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n if (facetData.facetDataEnabled) {\r\n facetData.facetDataEnabled = false;\r\n facetData.facetPositions = [] as Vector3[];\r\n facetData.facetNormals = [] as Vector3[];\r\n facetData.facetPartitioning = new Array();\r\n facetData.facetParameters = null;\r\n facetData.depthSortedIndices = new Uint32Array(0);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the AbstractMesh indices array\r\n * @param indices defines the data source\r\n * @param offset defines the offset in the index buffer where to store the new data (can be null)\r\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public updateIndices(indices: IndicesArray, offset?: number, gpuMemoryOnly = false): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates new normals data for the mesh\r\n * @param updatable defines if the normal vertex buffer must be flagged as updatable\r\n * @returns the current mesh\r\n */\r\n public createNormals(updatable: boolean): AbstractMesh {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = this.getIndices();\r\n let normals: FloatArray;\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.NormalKind)) {\r\n normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n } else {\r\n normals = [];\r\n }\r\n\r\n VertexData.ComputeNormals(positions, indices, normals, { useRightHandedSystem: this.getScene().useRightHandedSystem });\r\n this.setVerticesData(VertexBuffer.NormalKind, normals, updatable);\r\n return this;\r\n }\r\n\r\n /**\r\n * Align the mesh with a normal\r\n * @param normal defines the normal to use\r\n * @param upDirection can be used to redefined the up vector to use (will use the (0, 1, 0) by default)\r\n * @returns the current mesh\r\n */\r\n public alignWithNormal(normal: Vector3, upDirection?: Vector3): AbstractMesh {\r\n if (!upDirection) {\r\n upDirection = Axis.Y;\r\n }\r\n\r\n const axisX = TmpVectors.Vector3[0];\r\n const axisZ = TmpVectors.Vector3[1];\r\n Vector3.CrossToRef(upDirection, normal, axisZ);\r\n Vector3.CrossToRef(normal, axisZ, axisX);\r\n\r\n if (this.rotationQuaternion) {\r\n Quaternion.RotationQuaternionFromAxisToRef(axisX, normal, axisZ, this.rotationQuaternion);\r\n } else {\r\n Vector3.RotationFromAxisToRef(axisX, normal, axisZ, this.rotation);\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public _checkOcclusionQuery(): boolean {\r\n // Will be replaced by correct code if Occlusion queries are referenced\r\n return false;\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Disables the mesh edge rendering mode\r\n * @returns the currentAbstractMesh\r\n */\r\n disableEdgesRendering(): AbstractMesh {\r\n throw _WarnImport(\"EdgesRenderer\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Enables the edge rendering mode on the mesh.\r\n * This mode makes the mesh edges visible\r\n * @param epsilon defines the maximal distance between two angles to detect a face\r\n * @param checkVerticesInsteadOfIndices indicates that we should check vertex list directly instead of faces\r\n * @param options options to the edge renderer\r\n * @returns the currentAbstractMesh\r\n * @see https://www.babylonjs-playground.com/#19O9TU#0\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n enableEdgesRendering(epsilon?: number, checkVerticesInsteadOfIndices?: boolean, options?: IEdgesRendererOptions): AbstractMesh {\r\n throw _WarnImport(\"EdgesRenderer\");\r\n }\r\n\r\n /**\r\n * This function returns all of the particle systems in the scene that use the mesh as an emitter.\r\n * @returns an array of particle systems in the scene that use the mesh as an emitter\r\n */\r\n public getConnectedParticleSystems(): IParticleSystem[] {\r\n return this._scene.particleSystems.filter((particleSystem) => particleSystem.emitter === this);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.AbstractMesh\", AbstractMesh);\r\n", "import type { ShaderCustomProcessingFunction } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { SmartArray } from \"../Misc/smartArray\";\r\n\r\nimport type { BaseTexture } from \"./Textures/baseTexture\";\r\nimport type { EffectFallbacks } from \"./effectFallbacks\";\r\nimport type { MaterialDefines } from \"./materialDefines\";\r\nimport type { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport type { RenderTargetTexture } from \"./Textures/renderTargetTexture\";\r\n\r\n/** @internal */\r\nexport type MaterialPluginCreated = {};\r\n\r\n/** @internal */\r\nexport type MaterialPluginDisposed = {\r\n forceDisposeTextures?: boolean;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginHasTexture = {\r\n hasTexture: boolean;\r\n texture: BaseTexture;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginIsReadyForSubMesh = {\r\n isReadyForSubMesh: boolean;\r\n defines: MaterialDefines;\r\n subMesh: SubMesh;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginGetDefineNames = {\r\n defineNames?: { [name: string]: { type: string; default: any } };\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginPrepareEffect = {\r\n defines: MaterialDefines;\r\n fallbacks: EffectFallbacks;\r\n fallbackRank: number;\r\n customCode?: ShaderCustomProcessingFunction;\r\n attributes: string[];\r\n uniforms: string[];\r\n samplers: string[];\r\n uniformBuffersNames: string[];\r\n mesh: AbstractMesh;\r\n indexParameters: any;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginPrepareDefines = {\r\n defines: MaterialDefines;\r\n mesh: AbstractMesh;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginPrepareUniformBuffer = {\r\n ubo: UniformBuffer;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginBindForSubMesh = {\r\n subMesh: SubMesh;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginGetAnimatables = {\r\n animatables: IAnimatable[];\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginGetActiveTextures = {\r\n activeTextures: BaseTexture[];\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginFillRenderTargetTextures = {\r\n renderTargets: SmartArray;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginHasRenderTargetTextures = {\r\n hasRenderTargetTextures: boolean;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginHardBindForSubMesh = {\r\n subMesh: SubMesh;\r\n};\r\n\r\n/**\r\n * @internal\r\n */\r\nexport enum MaterialPluginEvent {\r\n Created = 0x0001,\r\n Disposed = 0x0002,\r\n GetDefineNames = 0x0004,\r\n PrepareUniformBuffer = 0x0008,\r\n IsReadyForSubMesh = 0x0010,\r\n PrepareDefines = 0x0020,\r\n BindForSubMesh = 0x0040,\r\n PrepareEffect = 0x0080,\r\n GetAnimatables = 0x0100,\r\n GetActiveTextures = 0x0200,\r\n HasTexture = 0x0400,\r\n FillRenderTargetTextures = 0x0800,\r\n HasRenderTargetTextures = 0x1000,\r\n HardBindForSubMesh = 0x2000,\r\n}\r\n", "import type { Effect } from \"./effect\";\r\nimport type { IClipPlanesHolder } from \"../Misc/interfaces/iClipPlanesHolder\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\n\r\n/** @internal */\r\nexport function addClipPlaneUniforms(uniforms: string[]): void {\r\n if (uniforms.indexOf(\"vClipPlane\") === -1) {\r\n uniforms.push(\"vClipPlane\");\r\n }\r\n if (uniforms.indexOf(\"vClipPlane2\") === -1) {\r\n uniforms.push(\"vClipPlane2\");\r\n }\r\n if (uniforms.indexOf(\"vClipPlane3\") === -1) {\r\n uniforms.push(\"vClipPlane3\");\r\n }\r\n if (uniforms.indexOf(\"vClipPlane4\") === -1) {\r\n uniforms.push(\"vClipPlane4\");\r\n }\r\n if (uniforms.indexOf(\"vClipPlane5\") === -1) {\r\n uniforms.push(\"vClipPlane5\");\r\n }\r\n if (uniforms.indexOf(\"vClipPlane6\") === -1) {\r\n uniforms.push(\"vClipPlane6\");\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport function prepareStringDefinesForClipPlanes(primaryHolder: IClipPlanesHolder, secondaryHolder: IClipPlanesHolder, defines: string[]): void {\r\n const clipPlane = !!(primaryHolder.clipPlane ?? secondaryHolder.clipPlane);\r\n const clipPlane2 = !!(primaryHolder.clipPlane2 ?? secondaryHolder.clipPlane2);\r\n const clipPlane3 = !!(primaryHolder.clipPlane3 ?? secondaryHolder.clipPlane3);\r\n const clipPlane4 = !!(primaryHolder.clipPlane4 ?? secondaryHolder.clipPlane4);\r\n const clipPlane5 = !!(primaryHolder.clipPlane5 ?? secondaryHolder.clipPlane5);\r\n const clipPlane6 = !!(primaryHolder.clipPlane6 ?? secondaryHolder.clipPlane6);\r\n\r\n if (clipPlane) defines.push(\"#define CLIPPLANE\");\r\n if (clipPlane2) defines.push(\"#define CLIPPLANE2\");\r\n if (clipPlane3) defines.push(\"#define CLIPPLANE3\");\r\n if (clipPlane4) defines.push(\"#define CLIPPLANE4\");\r\n if (clipPlane5) defines.push(\"#define CLIPPLANE5\");\r\n if (clipPlane6) defines.push(\"#define CLIPPLANE6\");\r\n}\r\n\r\n/** @internal */\r\nexport function prepareDefinesForClipPlanes(primaryHolder: IClipPlanesHolder, secondaryHolder: IClipPlanesHolder, defines: Record): boolean {\r\n let changed = false;\r\n\r\n const clipPlane = !!(primaryHolder.clipPlane ?? secondaryHolder.clipPlane);\r\n const clipPlane2 = !!(primaryHolder.clipPlane2 ?? secondaryHolder.clipPlane2);\r\n const clipPlane3 = !!(primaryHolder.clipPlane3 ?? secondaryHolder.clipPlane3);\r\n const clipPlane4 = !!(primaryHolder.clipPlane4 ?? secondaryHolder.clipPlane4);\r\n const clipPlane5 = !!(primaryHolder.clipPlane5 ?? secondaryHolder.clipPlane5);\r\n const clipPlane6 = !!(primaryHolder.clipPlane6 ?? secondaryHolder.clipPlane6);\r\n\r\n // Do not factorize this code, it breaks browsers optimizations.\r\n if (defines[\"CLIPPLANE\"] !== clipPlane) {\r\n defines[\"CLIPPLANE\"] = clipPlane;\r\n changed = true;\r\n }\r\n if (defines[\"CLIPPLANE2\"] !== clipPlane2) {\r\n defines[\"CLIPPLANE2\"] = clipPlane2;\r\n changed = true;\r\n }\r\n if (defines[\"CLIPPLANE3\"] !== clipPlane3) {\r\n defines[\"CLIPPLANE3\"] = clipPlane3;\r\n changed = true;\r\n }\r\n if (defines[\"CLIPPLANE4\"] !== clipPlane4) {\r\n defines[\"CLIPPLANE4\"] = clipPlane4;\r\n changed = true;\r\n }\r\n if (defines[\"CLIPPLANE5\"] !== clipPlane5) {\r\n defines[\"CLIPPLANE5\"] = clipPlane5;\r\n changed = true;\r\n }\r\n if (defines[\"CLIPPLANE6\"] !== clipPlane6) {\r\n defines[\"CLIPPLANE6\"] = clipPlane6;\r\n changed = true;\r\n }\r\n\r\n return changed;\r\n}\r\n\r\n/** @internal */\r\nexport function bindClipPlane(effect: Effect, primaryHolder: IClipPlanesHolder, secondaryHolder: IClipPlanesHolder): void {\r\n let clipPlane = primaryHolder.clipPlane ?? secondaryHolder.clipPlane;\r\n setClipPlane(effect, \"vClipPlane\", clipPlane);\r\n clipPlane = primaryHolder.clipPlane2 ?? secondaryHolder.clipPlane2;\r\n setClipPlane(effect, \"vClipPlane2\", clipPlane);\r\n clipPlane = primaryHolder.clipPlane3 ?? secondaryHolder.clipPlane3;\r\n setClipPlane(effect, \"vClipPlane3\", clipPlane);\r\n clipPlane = primaryHolder.clipPlane4 ?? secondaryHolder.clipPlane4;\r\n setClipPlane(effect, \"vClipPlane4\", clipPlane);\r\n clipPlane = primaryHolder.clipPlane5 ?? secondaryHolder.clipPlane5;\r\n setClipPlane(effect, \"vClipPlane5\", clipPlane);\r\n clipPlane = primaryHolder.clipPlane6 ?? secondaryHolder.clipPlane6;\r\n setClipPlane(effect, \"vClipPlane6\", clipPlane);\r\n}\r\n\r\nfunction setClipPlane(effect: Effect, uniformName: string, clipPlane: Nullable): void {\r\n if (clipPlane) {\r\n effect.setFloat4(uniformName, clipPlane.normal.x, clipPlane.normal.y, clipPlane.normal.z, clipPlane.d);\r\n }\r\n}\r\n", "import { Logger } from \"../Misc/logger\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Effect, IEffectCreationOptions } from \"./effect\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { BaseTexture } from \"./Textures/baseTexture\";\r\nimport type { PrePassConfiguration } from \"./prePassConfiguration\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport type { MaterialDefines } from \"./materialDefines\";\r\nimport type { EffectFallbacks } from \"./effectFallbacks\";\r\nimport { LightConstants } from \"../Lights/lightConstants\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { Material } from \"./material\";\r\nimport type { Nullable } from \"../types\";\r\nimport { prepareDefinesForClipPlanes } from \"./clipPlaneMaterialHelper\";\r\n\r\n// Temps\r\nconst _TempFogColor = Color3.Black();\r\nconst _TmpMorphInfluencers = { NUM_MORPH_INFLUENCERS: 0 };\r\n\r\n/**\r\n * Binds the logarithmic depth information from the scene to the effect for the given defines.\r\n * @param defines The generated defines used in the effect\r\n * @param effect The effect we are binding the data to\r\n * @param scene The scene we are willing to render with logarithmic scale for\r\n */\r\nexport function BindLogDepth(defines: any, effect: Effect, scene: Scene): void {\r\n if (!defines || defines[\"LOGARITHMICDEPTH\"] || (defines.indexOf && defines.indexOf(\"LOGARITHMICDEPTH\") >= 0)) {\r\n const camera = scene.activeCamera as Camera;\r\n if (camera.mode === Constants.ORTHOGRAPHIC_CAMERA) {\r\n Logger.Error(\"Logarithmic depth is not compatible with orthographic cameras!\", 20);\r\n }\r\n effect.setFloat(\"logarithmicDepthConstant\", 2.0 / (Math.log(camera.maxZ + 1.0) / Math.LN2));\r\n }\r\n}\r\n\r\n/**\r\n * Binds the fog information from the scene to the effect for the given mesh.\r\n * @param scene The scene the lights belongs to\r\n * @param mesh The mesh we are binding the information to render\r\n * @param effect The effect we are binding the data to\r\n * @param linearSpace Defines if the fog effect is applied in linear space\r\n */\r\nexport function BindFogParameters(scene: Scene, mesh?: AbstractMesh, effect?: Effect, linearSpace = false): void {\r\n if (effect && scene.fogEnabled && (!mesh || mesh.applyFog) && scene.fogMode !== Constants.FOGMODE_NONE) {\r\n effect.setFloat4(\"vFogInfos\", scene.fogMode, scene.fogStart, scene.fogEnd, scene.fogDensity);\r\n // Convert fog color to linear space if used in a linear space computed shader.\r\n if (linearSpace) {\r\n scene.fogColor.toLinearSpaceToRef(_TempFogColor, scene.getEngine().useExactSrgbConversions);\r\n effect.setColor3(\"vFogColor\", _TempFogColor);\r\n } else {\r\n effect.setColor3(\"vFogColor\", scene.fogColor);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the list of attributes required for morph targets according to the effect defines.\r\n * @param attribs The current list of supported attribs\r\n * @param mesh The mesh to prepare the morph targets attributes for\r\n * @param influencers The number of influencers\r\n */\r\nexport function PrepareAttributesForMorphTargetsInfluencers(attribs: string[], mesh: AbstractMesh, influencers: number): void {\r\n _TmpMorphInfluencers.NUM_MORPH_INFLUENCERS = influencers;\r\n PrepareAttributesForMorphTargets(attribs, mesh, _TmpMorphInfluencers);\r\n}\r\n\r\n/**\r\n * Prepares the list of attributes required for morph targets according to the effect defines.\r\n * @param attribs The current list of supported attribs\r\n * @param mesh The mesh to prepare the morph targets attributes for\r\n * @param defines The current Defines of the effect\r\n */\r\nexport function PrepareAttributesForMorphTargets(attribs: string[], mesh: AbstractMesh, defines: any): void {\r\n const influencers = defines[\"NUM_MORPH_INFLUENCERS\"];\r\n\r\n if (influencers > 0 && EngineStore.LastCreatedEngine) {\r\n const maxAttributesCount = EngineStore.LastCreatedEngine.getCaps().maxVertexAttribs;\r\n const manager = (mesh as Mesh).morphTargetManager;\r\n if (manager?.isUsingTextureForTargets) {\r\n return;\r\n }\r\n const normal = manager && manager.supportsNormals && defines[\"NORMAL\"];\r\n const tangent = manager && manager.supportsTangents && defines[\"TANGENT\"];\r\n const uv = manager && manager.supportsUVs && defines[\"UV1\"];\r\n for (let index = 0; index < influencers; index++) {\r\n attribs.push(Constants.PositionKind + index);\r\n\r\n if (normal) {\r\n attribs.push(Constants.NormalKind + index);\r\n }\r\n\r\n if (tangent) {\r\n attribs.push(Constants.TangentKind + index);\r\n }\r\n\r\n if (uv) {\r\n attribs.push(Constants.UVKind + \"_\" + index);\r\n }\r\n\r\n if (attribs.length > maxAttributesCount) {\r\n Logger.Error(\"Cannot add more vertex attributes for mesh \" + mesh.name);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Add the list of attributes required for instances to the attribs array.\r\n * @param attribs The current list of supported attribs\r\n * @param needsPreviousMatrices If the shader needs previous matrices\r\n */\r\nexport function PushAttributesForInstances(attribs: string[], needsPreviousMatrices: boolean = false): void {\r\n attribs.push(\"world0\");\r\n attribs.push(\"world1\");\r\n attribs.push(\"world2\");\r\n attribs.push(\"world3\");\r\n if (needsPreviousMatrices) {\r\n attribs.push(\"previousWorld0\");\r\n attribs.push(\"previousWorld1\");\r\n attribs.push(\"previousWorld2\");\r\n attribs.push(\"previousWorld3\");\r\n }\r\n}\r\n\r\n/**\r\n * Binds the morph targets information from the mesh to the effect.\r\n * @param abstractMesh The mesh we are binding the information to render\r\n * @param effect The effect we are binding the data to\r\n */\r\nexport function BindMorphTargetParameters(abstractMesh: AbstractMesh, effect: Effect): void {\r\n const manager = (abstractMesh).morphTargetManager;\r\n if (!abstractMesh || !manager) {\r\n return;\r\n }\r\n\r\n effect.setFloatArray(\"morphTargetInfluences\", manager.influences);\r\n}\r\n\r\n/**\r\n * Binds the scene's uniform buffer to the effect.\r\n * @param effect defines the effect to bind to the scene uniform buffer\r\n * @param sceneUbo defines the uniform buffer storing scene data\r\n */\r\nexport function BindSceneUniformBuffer(effect: Effect, sceneUbo: UniformBuffer): void {\r\n sceneUbo.bindToEffect(effect, \"Scene\");\r\n}\r\n\r\n/**\r\n * Helps preparing the defines values about the UVs in used in the effect.\r\n * UVs are shared as much as we can across channels in the shaders.\r\n * @param texture The texture we are preparing the UVs for\r\n * @param defines The defines to update\r\n * @param key The channel key \"diffuse\", \"specular\"... used in the shader\r\n */\r\nexport function PrepareDefinesForMergedUV(texture: BaseTexture, defines: any, key: string): void {\r\n defines._needUVs = true;\r\n defines[key] = true;\r\n if (texture.optimizeUVAllocation && texture.getTextureMatrix().isIdentityAs3x2()) {\r\n defines[key + \"DIRECTUV\"] = texture.coordinatesIndex + 1;\r\n defines[\"MAINUV\" + (texture.coordinatesIndex + 1)] = true;\r\n } else {\r\n defines[key + \"DIRECTUV\"] = 0;\r\n }\r\n}\r\n\r\n/**\r\n * Binds a texture matrix value to its corresponding uniform\r\n * @param texture The texture to bind the matrix for\r\n * @param uniformBuffer The uniform buffer receiving the data\r\n * @param key The channel key \"diffuse\", \"specular\"... used in the shader\r\n */\r\nexport function BindTextureMatrix(texture: BaseTexture, uniformBuffer: UniformBuffer, key: string): void {\r\n const matrix = texture.getTextureMatrix();\r\n\r\n uniformBuffer.updateMatrix(key + \"Matrix\", matrix);\r\n}\r\n\r\n/**\r\n * Prepares the list of attributes required for baked vertex animations according to the effect defines.\r\n * @param attribs The current list of supported attribs\r\n * @param mesh The mesh to prepare for baked vertex animations\r\n * @param defines The current Defines of the effect\r\n */\r\nexport function PrepareAttributesForBakedVertexAnimation(attribs: string[], mesh: AbstractMesh, defines: any): void {\r\n const enabled = defines[\"BAKED_VERTEX_ANIMATION_TEXTURE\"] && defines[\"INSTANCES\"];\r\n\r\n if (enabled) {\r\n attribs.push(\"bakedVertexAnimationSettingsInstanced\");\r\n }\r\n}\r\n\r\n// Copies the bones transformation matrices into the target array and returns the target's reference\r\nfunction _CopyBonesTransformationMatrices(source: Float32Array, target: Float32Array): Float32Array {\r\n target.set(source);\r\n\r\n return target;\r\n}\r\n\r\n/**\r\n * Binds the bones information from the mesh to the effect.\r\n * @param mesh The mesh we are binding the information to render\r\n * @param effect The effect we are binding the data to\r\n * @param prePassConfiguration Configuration for the prepass, in case prepass is activated\r\n */\r\nexport function BindBonesParameters(mesh?: AbstractMesh, effect?: Effect, prePassConfiguration?: PrePassConfiguration): void {\r\n if (!effect || !mesh) {\r\n return;\r\n }\r\n if (mesh.computeBonesUsingShaders && effect._bonesComputationForcedToCPU) {\r\n mesh.computeBonesUsingShaders = false;\r\n }\r\n\r\n if (mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n const skeleton = mesh.skeleton;\r\n\r\n if (skeleton.isUsingTextureForMatrices && effect.getUniformIndex(\"boneTextureWidth\") > -1) {\r\n const boneTexture = skeleton.getTransformMatrixTexture(mesh);\r\n effect.setTexture(\"boneSampler\", boneTexture);\r\n effect.setFloat(\"boneTextureWidth\", 4.0 * (skeleton.bones.length + 1));\r\n } else {\r\n const matrices = skeleton.getTransformMatrices(mesh);\r\n\r\n if (matrices) {\r\n effect.setMatrices(\"mBones\", matrices);\r\n if (prePassConfiguration && mesh.getScene().prePassRenderer && mesh.getScene().prePassRenderer!.getIndex(Constants.PREPASS_VELOCITY_TEXTURE_TYPE)) {\r\n if (!prePassConfiguration.previousBones[mesh.uniqueId]) {\r\n prePassConfiguration.previousBones[mesh.uniqueId] = matrices.slice();\r\n }\r\n effect.setMatrices(\"mPreviousBones\", prePassConfiguration.previousBones[mesh.uniqueId]);\r\n _CopyBonesTransformationMatrices(matrices, prePassConfiguration.previousBones[mesh.uniqueId]);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Binds the light information to the effect.\r\n * @param light The light containing the generator\r\n * @param effect The effect we are binding the data to\r\n * @param lightIndex The light index in the effect used to render\r\n */\r\nexport function BindLightProperties(light: Light, effect: Effect, lightIndex: number): void {\r\n light.transferToEffect(effect, lightIndex + \"\");\r\n}\r\n\r\n/**\r\n * Binds the lights information from the scene to the effect for the given mesh.\r\n * @param light Light to bind\r\n * @param lightIndex Light index\r\n * @param scene The scene where the light belongs to\r\n * @param effect The effect we are binding the data to\r\n * @param useSpecular Defines if specular is supported\r\n * @param receiveShadows Defines if the effect (mesh) we bind the light for receives shadows\r\n */\r\nexport function BindLight(light: Light, lightIndex: number, scene: Scene, effect: Effect, useSpecular: boolean, receiveShadows = true): void {\r\n light._bindLight(lightIndex, scene, effect, useSpecular, receiveShadows);\r\n}\r\n\r\n/**\r\n * Binds the lights information from the scene to the effect for the given mesh.\r\n * @param scene The scene the lights belongs to\r\n * @param mesh The mesh we are binding the information to render\r\n * @param effect The effect we are binding the data to\r\n * @param defines The generated defines for the effect\r\n * @param maxSimultaneousLights The maximum number of light that can be bound to the effect\r\n */\r\nexport function BindLights(scene: Scene, mesh: AbstractMesh, effect: Effect, defines: any, maxSimultaneousLights = 4): void {\r\n const len = Math.min(mesh.lightSources.length, maxSimultaneousLights);\r\n\r\n for (let i = 0; i < len; i++) {\r\n const light = mesh.lightSources[i];\r\n BindLight(light, i, scene, effect, typeof defines === \"boolean\" ? defines : defines[\"SPECULARTERM\"], mesh.receiveShadows);\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the list of attributes required for bones according to the effect defines.\r\n * @param attribs The current list of supported attribs\r\n * @param mesh The mesh to prepare the bones attributes for\r\n * @param defines The current Defines of the effect\r\n * @param fallbacks The current effect fallback strategy\r\n */\r\nexport function PrepareAttributesForBones(attribs: string[], mesh: AbstractMesh, defines: any, fallbacks: EffectFallbacks): void {\r\n if (defines[\"NUM_BONE_INFLUENCERS\"] > 0) {\r\n fallbacks.addCPUSkinningFallback(0, mesh);\r\n\r\n attribs.push(Constants.MatricesIndicesKind);\r\n attribs.push(Constants.MatricesWeightsKind);\r\n if (defines[\"NUM_BONE_INFLUENCERS\"] > 4) {\r\n attribs.push(Constants.MatricesIndicesExtraKind);\r\n attribs.push(Constants.MatricesWeightsExtraKind);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Check and prepare the list of attributes required for instances according to the effect defines.\r\n * @param attribs The current list of supported attribs\r\n * @param defines The current MaterialDefines of the effect\r\n */\r\nexport function PrepareAttributesForInstances(attribs: string[], defines: MaterialDefines): void {\r\n if (defines[\"INSTANCES\"] || defines[\"THIN_INSTANCES\"]) {\r\n PushAttributesForInstances(attribs, !!defines[\"PREPASS_VELOCITY\"]);\r\n }\r\n\r\n if (defines.INSTANCESCOLOR) {\r\n attribs.push(Constants.ColorInstanceKind);\r\n }\r\n}\r\n\r\n/**\r\n * This helps decreasing rank by rank the shadow quality (0 being the highest rank and quality)\r\n * @param defines The defines to update while falling back\r\n * @param fallbacks The authorized effect fallbacks\r\n * @param maxSimultaneousLights The maximum number of lights allowed\r\n * @param rank the current rank of the Effect\r\n * @returns The newly affected rank\r\n */\r\nexport function HandleFallbacksForShadows(defines: any, fallbacks: EffectFallbacks, maxSimultaneousLights = 4, rank = 0): number {\r\n let lightFallbackRank = 0;\r\n for (let lightIndex = 0; lightIndex < maxSimultaneousLights; lightIndex++) {\r\n if (!defines[\"LIGHT\" + lightIndex]) {\r\n break;\r\n }\r\n\r\n if (lightIndex > 0) {\r\n lightFallbackRank = rank + lightIndex;\r\n fallbacks.addFallback(lightFallbackRank, \"LIGHT\" + lightIndex);\r\n }\r\n\r\n if (!defines[\"SHADOWS\"]) {\r\n if (defines[\"SHADOW\" + lightIndex]) {\r\n fallbacks.addFallback(rank, \"SHADOW\" + lightIndex);\r\n }\r\n\r\n if (defines[\"SHADOWPCF\" + lightIndex]) {\r\n fallbacks.addFallback(rank, \"SHADOWPCF\" + lightIndex);\r\n }\r\n\r\n if (defines[\"SHADOWPCSS\" + lightIndex]) {\r\n fallbacks.addFallback(rank, \"SHADOWPCSS\" + lightIndex);\r\n }\r\n\r\n if (defines[\"SHADOWPOISSON\" + lightIndex]) {\r\n fallbacks.addFallback(rank, \"SHADOWPOISSON\" + lightIndex);\r\n }\r\n\r\n if (defines[\"SHADOWESM\" + lightIndex]) {\r\n fallbacks.addFallback(rank, \"SHADOWESM\" + lightIndex);\r\n }\r\n\r\n if (defines[\"SHADOWCLOSEESM\" + lightIndex]) {\r\n fallbacks.addFallback(rank, \"SHADOWCLOSEESM\" + lightIndex);\r\n }\r\n }\r\n }\r\n return lightFallbackRank++;\r\n}\r\n\r\n/**\r\n * Gets the current status of the fog (should it be enabled?)\r\n * @param mesh defines the mesh to evaluate for fog support\r\n * @param scene defines the hosting scene\r\n * @returns true if fog must be enabled\r\n */\r\nexport function GetFogState(mesh: AbstractMesh, scene: Scene) {\r\n return scene.fogEnabled && mesh.applyFog && scene.fogMode !== Constants.FOGMODE_NONE;\r\n}\r\n\r\n/**\r\n * Helper used to prepare the list of defines associated with misc. values for shader compilation\r\n * @param mesh defines the current mesh\r\n * @param scene defines the current scene\r\n * @param useLogarithmicDepth defines if logarithmic depth has to be turned on\r\n * @param pointsCloud defines if point cloud rendering has to be turned on\r\n * @param fogEnabled defines if fog has to be turned on\r\n * @param alphaTest defines if alpha testing has to be turned on\r\n * @param defines defines the current list of defines\r\n * @param applyDecalAfterDetail Defines if the decal is applied after or before the detail\r\n */\r\nexport function PrepareDefinesForMisc(\r\n mesh: AbstractMesh,\r\n scene: Scene,\r\n useLogarithmicDepth: boolean,\r\n pointsCloud: boolean,\r\n fogEnabled: boolean,\r\n alphaTest: boolean,\r\n defines: any,\r\n applyDecalAfterDetail: boolean = false\r\n): void {\r\n if (defines._areMiscDirty) {\r\n defines[\"LOGARITHMICDEPTH\"] = useLogarithmicDepth;\r\n defines[\"POINTSIZE\"] = pointsCloud;\r\n defines[\"FOG\"] = fogEnabled && GetFogState(mesh, scene);\r\n defines[\"NONUNIFORMSCALING\"] = mesh.nonUniformScaling;\r\n defines[\"ALPHATEST\"] = alphaTest;\r\n defines[\"DECAL_AFTER_DETAIL\"] = applyDecalAfterDetail;\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the defines related to the light information passed in parameter\r\n * @param scene The scene we are intending to draw\r\n * @param mesh The mesh the effect is compiling for\r\n * @param defines The defines to update\r\n * @param specularSupported Specifies whether specular is supported or not (override lights data)\r\n * @param maxSimultaneousLights Specifies how manuy lights can be added to the effect at max\r\n * @param disableLighting Specifies whether the lighting is disabled (override scene and light)\r\n * @returns true if normals will be required for the rest of the effect\r\n */\r\nexport function PrepareDefinesForLights(scene: Scene, mesh: AbstractMesh, defines: any, specularSupported: boolean, maxSimultaneousLights = 4, disableLighting = false): boolean {\r\n if (!defines._areLightsDirty) {\r\n return defines._needNormals;\r\n }\r\n\r\n let lightIndex = 0;\r\n const state = {\r\n needNormals: defines._needNormals, // prevents overriding previous reflection or other needs for normals\r\n needRebuild: false,\r\n lightmapMode: false,\r\n shadowEnabled: false,\r\n specularEnabled: false,\r\n };\r\n\r\n if (scene.lightsEnabled && !disableLighting) {\r\n for (const light of mesh.lightSources) {\r\n PrepareDefinesForLight(scene, mesh, light, lightIndex, defines, specularSupported, state);\r\n\r\n lightIndex++;\r\n if (lightIndex === maxSimultaneousLights) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n defines[\"SPECULARTERM\"] = state.specularEnabled;\r\n defines[\"SHADOWS\"] = state.shadowEnabled;\r\n\r\n // Resetting all other lights if any\r\n for (let index = lightIndex; index < maxSimultaneousLights; index++) {\r\n if (defines[\"LIGHT\" + index] !== undefined) {\r\n defines[\"LIGHT\" + index] = false;\r\n defines[\"HEMILIGHT\" + index] = false;\r\n defines[\"POINTLIGHT\" + index] = false;\r\n defines[\"DIRLIGHT\" + index] = false;\r\n defines[\"SPOTLIGHT\" + index] = false;\r\n defines[\"SHADOW\" + index] = false;\r\n defines[\"SHADOWCSM\" + index] = false;\r\n defines[\"SHADOWCSMDEBUG\" + index] = false;\r\n defines[\"SHADOWCSMNUM_CASCADES\" + index] = false;\r\n defines[\"SHADOWCSMUSESHADOWMAXZ\" + index] = false;\r\n defines[\"SHADOWCSMNOBLEND\" + index] = false;\r\n defines[\"SHADOWCSM_RIGHTHANDED\" + index] = false;\r\n defines[\"SHADOWPCF\" + index] = false;\r\n defines[\"SHADOWPCSS\" + index] = false;\r\n defines[\"SHADOWPOISSON\" + index] = false;\r\n defines[\"SHADOWESM\" + index] = false;\r\n defines[\"SHADOWCLOSEESM\" + index] = false;\r\n defines[\"SHADOWCUBE\" + index] = false;\r\n defines[\"SHADOWLOWQUALITY\" + index] = false;\r\n defines[\"SHADOWMEDIUMQUALITY\" + index] = false;\r\n }\r\n }\r\n\r\n const caps = scene.getEngine().getCaps();\r\n\r\n if (defines[\"SHADOWFLOAT\"] === undefined) {\r\n state.needRebuild = true;\r\n }\r\n\r\n defines[\"SHADOWFLOAT\"] =\r\n state.shadowEnabled && ((caps.textureFloatRender && caps.textureFloatLinearFiltering) || (caps.textureHalfFloatRender && caps.textureHalfFloatLinearFiltering));\r\n defines[\"LIGHTMAPEXCLUDED\"] = state.lightmapMode;\r\n\r\n if (state.needRebuild) {\r\n defines.rebuild();\r\n }\r\n\r\n return state.needNormals;\r\n}\r\n\r\n/**\r\n * Prepares the defines related to the light information passed in parameter\r\n * @param scene The scene we are intending to draw\r\n * @param mesh The mesh the effect is compiling for\r\n * @param light The light the effect is compiling for\r\n * @param lightIndex The index of the light\r\n * @param defines The defines to update\r\n * @param specularSupported Specifies whether specular is supported or not (override lights data)\r\n * @param state Defines the current state regarding what is needed (normals, etc...)\r\n * @param state.needNormals\r\n * @param state.needRebuild\r\n * @param state.shadowEnabled\r\n * @param state.specularEnabled\r\n * @param state.lightmapMode\r\n */\r\nexport function PrepareDefinesForLight(\r\n scene: Scene,\r\n mesh: AbstractMesh,\r\n light: Light,\r\n lightIndex: number,\r\n defines: any,\r\n specularSupported: boolean,\r\n state: {\r\n needNormals: boolean;\r\n needRebuild: boolean;\r\n shadowEnabled: boolean;\r\n specularEnabled: boolean;\r\n lightmapMode: boolean;\r\n }\r\n) {\r\n state.needNormals = true;\r\n\r\n if (defines[\"LIGHT\" + lightIndex] === undefined) {\r\n state.needRebuild = true;\r\n }\r\n\r\n defines[\"LIGHT\" + lightIndex] = true;\r\n\r\n defines[\"SPOTLIGHT\" + lightIndex] = false;\r\n defines[\"HEMILIGHT\" + lightIndex] = false;\r\n defines[\"POINTLIGHT\" + lightIndex] = false;\r\n defines[\"DIRLIGHT\" + lightIndex] = false;\r\n\r\n light.prepareLightSpecificDefines(defines, lightIndex);\r\n\r\n // FallOff.\r\n defines[\"LIGHT_FALLOFF_PHYSICAL\" + lightIndex] = false;\r\n defines[\"LIGHT_FALLOFF_GLTF\" + lightIndex] = false;\r\n defines[\"LIGHT_FALLOFF_STANDARD\" + lightIndex] = false;\r\n\r\n switch (light.falloffType) {\r\n case LightConstants.FALLOFF_GLTF:\r\n defines[\"LIGHT_FALLOFF_GLTF\" + lightIndex] = true;\r\n break;\r\n case LightConstants.FALLOFF_PHYSICAL:\r\n defines[\"LIGHT_FALLOFF_PHYSICAL\" + lightIndex] = true;\r\n break;\r\n case LightConstants.FALLOFF_STANDARD:\r\n defines[\"LIGHT_FALLOFF_STANDARD\" + lightIndex] = true;\r\n break;\r\n }\r\n\r\n // Specular\r\n if (specularSupported && !light.specular.equalsFloats(0, 0, 0)) {\r\n state.specularEnabled = true;\r\n }\r\n\r\n // Shadows\r\n defines[\"SHADOW\" + lightIndex] = false;\r\n defines[\"SHADOWCSM\" + lightIndex] = false;\r\n defines[\"SHADOWCSMDEBUG\" + lightIndex] = false;\r\n defines[\"SHADOWCSMNUM_CASCADES\" + lightIndex] = false;\r\n defines[\"SHADOWCSMUSESHADOWMAXZ\" + lightIndex] = false;\r\n defines[\"SHADOWCSMNOBLEND\" + lightIndex] = false;\r\n defines[\"SHADOWCSM_RIGHTHANDED\" + lightIndex] = false;\r\n defines[\"SHADOWPCF\" + lightIndex] = false;\r\n defines[\"SHADOWPCSS\" + lightIndex] = false;\r\n defines[\"SHADOWPOISSON\" + lightIndex] = false;\r\n defines[\"SHADOWESM\" + lightIndex] = false;\r\n defines[\"SHADOWCLOSEESM\" + lightIndex] = false;\r\n defines[\"SHADOWCUBE\" + lightIndex] = false;\r\n defines[\"SHADOWLOWQUALITY\" + lightIndex] = false;\r\n defines[\"SHADOWMEDIUMQUALITY\" + lightIndex] = false;\r\n\r\n if (mesh && mesh.receiveShadows && scene.shadowsEnabled && light.shadowEnabled) {\r\n const shadowGenerator = light.getShadowGenerator(scene.activeCamera) ?? light.getShadowGenerator();\r\n if (shadowGenerator) {\r\n const shadowMap = shadowGenerator.getShadowMap();\r\n if (shadowMap) {\r\n if (shadowMap.renderList && shadowMap.renderList.length > 0) {\r\n state.shadowEnabled = true;\r\n shadowGenerator.prepareDefines(defines, lightIndex);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (light.lightmapMode != LightConstants.LIGHTMAP_DEFAULT) {\r\n state.lightmapMode = true;\r\n defines[\"LIGHTMAPEXCLUDED\" + lightIndex] = true;\r\n defines[\"LIGHTMAPNOSPECULAR\" + lightIndex] = light.lightmapMode == LightConstants.LIGHTMAP_SHADOWSONLY;\r\n } else {\r\n defines[\"LIGHTMAPEXCLUDED\" + lightIndex] = false;\r\n defines[\"LIGHTMAPNOSPECULAR\" + lightIndex] = false;\r\n }\r\n}\r\n\r\n/**\r\n * Helper used to prepare the list of defines associated with frame values for shader compilation\r\n * @param scene defines the current scene\r\n * @param engine defines the current engine\r\n * @param material defines the material we are compiling the shader for\r\n * @param defines specifies the list of active defines\r\n * @param useInstances defines if instances have to be turned on\r\n * @param useClipPlane defines if clip plane have to be turned on\r\n * @param useThinInstances defines if thin instances have to be turned on\r\n */\r\nexport function PrepareDefinesForFrameBoundValues(\r\n scene: Scene,\r\n engine: Engine,\r\n material: Material,\r\n defines: any,\r\n useInstances: boolean,\r\n useClipPlane: Nullable = null,\r\n useThinInstances: boolean = false\r\n): void {\r\n let changed = PrepareDefinesForCamera(scene, defines);\r\n\r\n if (useClipPlane !== false) {\r\n changed = prepareDefinesForClipPlanes(material, scene, defines);\r\n }\r\n\r\n if (defines[\"DEPTHPREPASS\"] !== !engine.getColorWrite()) {\r\n defines[\"DEPTHPREPASS\"] = !defines[\"DEPTHPREPASS\"];\r\n changed = true;\r\n }\r\n\r\n if (defines[\"INSTANCES\"] !== useInstances) {\r\n defines[\"INSTANCES\"] = useInstances;\r\n changed = true;\r\n }\r\n\r\n if (defines[\"THIN_INSTANCES\"] !== useThinInstances) {\r\n defines[\"THIN_INSTANCES\"] = useThinInstances;\r\n changed = true;\r\n }\r\n\r\n if (changed) {\r\n defines.markAsUnprocessed();\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the defines for bones\r\n * @param mesh The mesh containing the geometry data we will draw\r\n * @param defines The defines to update\r\n */\r\nexport function PrepareDefinesForBones(mesh: AbstractMesh, defines: any) {\r\n if (mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n defines[\"NUM_BONE_INFLUENCERS\"] = mesh.numBoneInfluencers;\r\n\r\n const materialSupportsBoneTexture = defines[\"BONETEXTURE\"] !== undefined;\r\n\r\n if (mesh.skeleton.isUsingTextureForMatrices && materialSupportsBoneTexture) {\r\n defines[\"BONETEXTURE\"] = true;\r\n } else {\r\n defines[\"BonesPerMesh\"] = mesh.skeleton.bones.length + 1;\r\n defines[\"BONETEXTURE\"] = materialSupportsBoneTexture ? false : undefined;\r\n\r\n const prePassRenderer = mesh.getScene().prePassRenderer;\r\n if (prePassRenderer && prePassRenderer.enabled) {\r\n const nonExcluded = prePassRenderer.excludedSkinnedMesh.indexOf(mesh) === -1;\r\n defines[\"BONES_VELOCITY_ENABLED\"] = nonExcluded;\r\n }\r\n }\r\n } else {\r\n defines[\"NUM_BONE_INFLUENCERS\"] = 0;\r\n defines[\"BonesPerMesh\"] = 0;\r\n if (defines[\"BONETEXTURE\"] !== undefined) {\r\n defines[\"BONETEXTURE\"] = false;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the defines for morph targets\r\n * @param mesh The mesh containing the geometry data we will draw\r\n * @param defines The defines to update\r\n */\r\nexport function PrepareDefinesForMorphTargets(mesh: AbstractMesh, defines: any) {\r\n const manager = (mesh).morphTargetManager;\r\n if (manager) {\r\n defines[\"MORPHTARGETS_UV\"] = manager.supportsUVs && defines[\"UV1\"];\r\n defines[\"MORPHTARGETS_TANGENT\"] = manager.supportsTangents && defines[\"TANGENT\"];\r\n defines[\"MORPHTARGETS_NORMAL\"] = manager.supportsNormals && defines[\"NORMAL\"];\r\n defines[\"NUM_MORPH_INFLUENCERS\"] = manager.numMaxInfluencers || manager.numInfluencers;\r\n defines[\"MORPHTARGETS\"] = defines[\"NUM_MORPH_INFLUENCERS\"] > 0;\r\n\r\n defines[\"MORPHTARGETS_TEXTURE\"] = manager.isUsingTextureForTargets;\r\n } else {\r\n defines[\"MORPHTARGETS_UV\"] = false;\r\n defines[\"MORPHTARGETS_TANGENT\"] = false;\r\n defines[\"MORPHTARGETS_NORMAL\"] = false;\r\n defines[\"MORPHTARGETS\"] = false;\r\n defines[\"NUM_MORPH_INFLUENCERS\"] = 0;\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the defines for baked vertex animation\r\n * @param mesh The mesh containing the geometry data we will draw\r\n * @param defines The defines to update\r\n */\r\nexport function PrepareDefinesForBakedVertexAnimation(mesh: AbstractMesh, defines: any) {\r\n const manager = (mesh).bakedVertexAnimationManager;\r\n defines[\"BAKED_VERTEX_ANIMATION_TEXTURE\"] = manager && manager.isEnabled ? true : false;\r\n}\r\n\r\n/**\r\n * Prepares the defines used in the shader depending on the attributes data available in the mesh\r\n * @param mesh The mesh containing the geometry data we will draw\r\n * @param defines The defines to update\r\n * @param useVertexColor Precise whether vertex colors should be used or not (override mesh info)\r\n * @param useBones Precise whether bones should be used or not (override mesh info)\r\n * @param useMorphTargets Precise whether morph targets should be used or not (override mesh info)\r\n * @param useVertexAlpha Precise whether vertex alpha should be used or not (override mesh info)\r\n * @param useBakedVertexAnimation Precise whether baked vertex animation should be used or not (override mesh info)\r\n * @returns false if defines are considered not dirty and have not been checked\r\n */\r\nexport function PrepareDefinesForAttributes(\r\n mesh: AbstractMesh,\r\n defines: any,\r\n useVertexColor: boolean,\r\n useBones: boolean,\r\n useMorphTargets = false,\r\n useVertexAlpha = true,\r\n useBakedVertexAnimation = true\r\n): boolean {\r\n if (!defines._areAttributesDirty && defines._needNormals === defines._normals && defines._needUVs === defines._uvs) {\r\n return false;\r\n }\r\n\r\n defines._normals = defines._needNormals;\r\n defines._uvs = defines._needUVs;\r\n\r\n defines[\"NORMAL\"] = defines._needNormals && mesh.isVerticesDataPresent(Constants.NormalKind);\r\n\r\n if (defines._needNormals && mesh.isVerticesDataPresent(Constants.TangentKind)) {\r\n defines[\"TANGENT\"] = true;\r\n }\r\n\r\n for (let i = 1; i <= Constants.MAX_SUPPORTED_UV_SETS; ++i) {\r\n defines[\"UV\" + i] = defines._needUVs ? mesh.isVerticesDataPresent(`uv${i === 1 ? \"\" : i}`) : false;\r\n }\r\n\r\n if (useVertexColor) {\r\n const hasVertexColors = mesh.useVertexColors && mesh.isVerticesDataPresent(Constants.ColorKind);\r\n defines[\"VERTEXCOLOR\"] = hasVertexColors;\r\n defines[\"VERTEXALPHA\"] = mesh.hasVertexAlpha && hasVertexColors && useVertexAlpha;\r\n }\r\n\r\n if (mesh.isVerticesDataPresent(Constants.ColorInstanceKind) && (mesh.hasInstances || mesh.hasThinInstances)) {\r\n defines[\"INSTANCESCOLOR\"] = true;\r\n }\r\n\r\n if (useBones) {\r\n PrepareDefinesForBones(mesh, defines);\r\n }\r\n\r\n if (useMorphTargets) {\r\n PrepareDefinesForMorphTargets(mesh, defines);\r\n }\r\n\r\n if (useBakedVertexAnimation) {\r\n PrepareDefinesForBakedVertexAnimation(mesh, defines);\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Prepares the defines related to multiview\r\n * @param scene The scene we are intending to draw\r\n * @param defines The defines to update\r\n */\r\nexport function PrepareDefinesForMultiview(scene: Scene, defines: any) {\r\n if (scene.activeCamera) {\r\n const previousMultiview = defines.MULTIVIEW;\r\n defines.MULTIVIEW = scene.activeCamera.outputRenderTarget !== null && scene.activeCamera.outputRenderTarget.getViewCount() > 1;\r\n if (defines.MULTIVIEW != previousMultiview) {\r\n defines.markAsUnprocessed();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the defines related to order independant transparency\r\n * @param scene The scene we are intending to draw\r\n * @param defines The defines to update\r\n * @param needAlphaBlending Determines if the material needs alpha blending\r\n */\r\nexport function PrepareDefinesForOIT(scene: Scene, defines: any, needAlphaBlending: boolean) {\r\n const previousDefine = defines.ORDER_INDEPENDENT_TRANSPARENCY;\r\n const previousDefine16Bits = defines.ORDER_INDEPENDENT_TRANSPARENCY_16BITS;\r\n\r\n defines.ORDER_INDEPENDENT_TRANSPARENCY = scene.useOrderIndependentTransparency && needAlphaBlending;\r\n defines.ORDER_INDEPENDENT_TRANSPARENCY_16BITS = !scene.getEngine().getCaps().textureFloatLinearFiltering;\r\n\r\n if (previousDefine !== defines.ORDER_INDEPENDENT_TRANSPARENCY || previousDefine16Bits !== defines.ORDER_INDEPENDENT_TRANSPARENCY_16BITS) {\r\n defines.markAsUnprocessed();\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the defines related to the prepass\r\n * @param scene The scene we are intending to draw\r\n * @param defines The defines to update\r\n * @param canRenderToMRT Indicates if this material renders to several textures in the prepass\r\n */\r\nexport function PrepareDefinesForPrePass(scene: Scene, defines: any, canRenderToMRT: boolean) {\r\n const previousPrePass = defines.PREPASS;\r\n\r\n if (!defines._arePrePassDirty) {\r\n return;\r\n }\r\n\r\n const texturesList = [\r\n {\r\n type: Constants.PREPASS_POSITION_TEXTURE_TYPE,\r\n define: \"PREPASS_POSITION\",\r\n index: \"PREPASS_POSITION_INDEX\",\r\n },\r\n {\r\n type: Constants.PREPASS_VELOCITY_TEXTURE_TYPE,\r\n define: \"PREPASS_VELOCITY\",\r\n index: \"PREPASS_VELOCITY_INDEX\",\r\n },\r\n {\r\n type: Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE,\r\n define: \"PREPASS_REFLECTIVITY\",\r\n index: \"PREPASS_REFLECTIVITY_INDEX\",\r\n },\r\n {\r\n type: Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE,\r\n define: \"PREPASS_IRRADIANCE\",\r\n index: \"PREPASS_IRRADIANCE_INDEX\",\r\n },\r\n {\r\n type: Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE,\r\n define: \"PREPASS_ALBEDO_SQRT\",\r\n index: \"PREPASS_ALBEDO_SQRT_INDEX\",\r\n },\r\n {\r\n type: Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n define: \"PREPASS_DEPTH\",\r\n index: \"PREPASS_DEPTH_INDEX\",\r\n },\r\n {\r\n type: Constants.PREPASS_NORMAL_TEXTURE_TYPE,\r\n define: \"PREPASS_NORMAL\",\r\n index: \"PREPASS_NORMAL_INDEX\",\r\n },\r\n ];\r\n\r\n if (scene.prePassRenderer && scene.prePassRenderer.enabled && canRenderToMRT) {\r\n defines.PREPASS = true;\r\n defines.SCENE_MRT_COUNT = scene.prePassRenderer.mrtCount;\r\n defines.PREPASS_NORMAL_WORLDSPACE = scene.prePassRenderer.generateNormalsInWorldSpace;\r\n\r\n for (let i = 0; i < texturesList.length; i++) {\r\n const index = scene.prePassRenderer.getIndex(texturesList[i].type);\r\n if (index !== -1) {\r\n defines[texturesList[i].define] = true;\r\n defines[texturesList[i].index] = index;\r\n } else {\r\n defines[texturesList[i].define] = false;\r\n }\r\n }\r\n } else {\r\n defines.PREPASS = false;\r\n for (let i = 0; i < texturesList.length; i++) {\r\n defines[texturesList[i].define] = false;\r\n }\r\n }\r\n\r\n if (defines.PREPASS != previousPrePass) {\r\n defines.markAsUnprocessed();\r\n defines.markAsImageProcessingDirty();\r\n }\r\n}\r\n\r\n/**\r\n * Helper used to prepare the defines relative to the active camera\r\n * @param scene defines the current scene\r\n * @param defines specifies the list of active defines\r\n * @returns true if the defines have been updated, else false\r\n */\r\nexport function PrepareDefinesForCamera(scene: Scene, defines: any): boolean {\r\n let changed = false;\r\n\r\n if (scene.activeCamera) {\r\n const wasOrtho = defines[\"CAMERA_ORTHOGRAPHIC\"] ? 1 : 0;\r\n const wasPersp = defines[\"CAMERA_PERSPECTIVE\"] ? 1 : 0;\r\n const isOrtho = scene.activeCamera.mode === Constants.ORTHOGRAPHIC_CAMERA ? 1 : 0;\r\n const isPersp = scene.activeCamera.mode === Constants.PERSPECTIVE_CAMERA ? 1 : 0;\r\n\r\n if (wasOrtho ^ isOrtho || wasPersp ^ isPersp) {\r\n defines[\"CAMERA_ORTHOGRAPHIC\"] = isOrtho === 1;\r\n defines[\"CAMERA_PERSPECTIVE\"] = isPersp === 1;\r\n changed = true;\r\n }\r\n }\r\n\r\n return changed;\r\n}\r\n\r\n/**\r\n * Prepares the uniforms and samplers list to be used in the effect (for a specific light)\r\n * @param lightIndex defines the light index\r\n * @param uniformsList The uniform list\r\n * @param samplersList The sampler list\r\n * @param projectedLightTexture defines if projected texture must be used\r\n * @param uniformBuffersList defines an optional list of uniform buffers\r\n * @param updateOnlyBuffersList True to only update the uniformBuffersList array\r\n */\r\nexport function PrepareUniformsAndSamplersForLight(\r\n lightIndex: number,\r\n uniformsList: string[],\r\n samplersList: string[],\r\n projectedLightTexture?: any,\r\n uniformBuffersList: Nullable = null,\r\n updateOnlyBuffersList = false\r\n) {\r\n if (uniformBuffersList) {\r\n uniformBuffersList.push(\"Light\" + lightIndex);\r\n }\r\n\r\n if (updateOnlyBuffersList) {\r\n return;\r\n }\r\n\r\n uniformsList.push(\r\n \"vLightData\" + lightIndex,\r\n \"vLightDiffuse\" + lightIndex,\r\n \"vLightSpecular\" + lightIndex,\r\n \"vLightDirection\" + lightIndex,\r\n \"vLightFalloff\" + lightIndex,\r\n \"vLightGround\" + lightIndex,\r\n \"lightMatrix\" + lightIndex,\r\n \"shadowsInfo\" + lightIndex,\r\n \"depthValues\" + lightIndex\r\n );\r\n\r\n samplersList.push(\"shadowSampler\" + lightIndex);\r\n samplersList.push(\"depthSampler\" + lightIndex);\r\n\r\n uniformsList.push(\r\n \"viewFrustumZ\" + lightIndex,\r\n \"cascadeBlendFactor\" + lightIndex,\r\n \"lightSizeUVCorrection\" + lightIndex,\r\n \"depthCorrection\" + lightIndex,\r\n \"penumbraDarkness\" + lightIndex,\r\n \"frustumLengths\" + lightIndex\r\n );\r\n\r\n if (projectedLightTexture) {\r\n samplersList.push(\"projectionLightSampler\" + lightIndex);\r\n uniformsList.push(\"textureProjectionMatrix\" + lightIndex);\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the uniforms and samplers list to be used in the effect\r\n * @param uniformsListOrOptions The uniform names to prepare or an EffectCreationOptions containing the list and extra information\r\n * @param samplersList The sampler list\r\n * @param defines The defines helping in the list generation\r\n * @param maxSimultaneousLights The maximum number of simultaneous light allowed in the effect\r\n */\r\nexport function PrepareUniformsAndSamplersList(uniformsListOrOptions: string[] | IEffectCreationOptions, samplersList?: string[], defines?: any, maxSimultaneousLights = 4): void {\r\n let uniformsList: string[];\r\n let uniformBuffersList: Nullable = null;\r\n\r\n if ((uniformsListOrOptions).uniformsNames) {\r\n const options = uniformsListOrOptions;\r\n uniformsList = options.uniformsNames;\r\n uniformBuffersList = options.uniformBuffersNames;\r\n samplersList = options.samplers;\r\n defines = options.defines;\r\n maxSimultaneousLights = options.maxSimultaneousLights || 0;\r\n } else {\r\n uniformsList = uniformsListOrOptions;\r\n if (!samplersList) {\r\n samplersList = [];\r\n }\r\n }\r\n\r\n for (let lightIndex = 0; lightIndex < maxSimultaneousLights; lightIndex++) {\r\n if (!defines[\"LIGHT\" + lightIndex]) {\r\n break;\r\n }\r\n PrepareUniformsAndSamplersForLight(lightIndex, uniformsList, samplersList, defines[\"PROJECTEDLIGHTTEXTURE\" + lightIndex], uniformBuffersList);\r\n }\r\n\r\n if (defines[\"NUM_MORPH_INFLUENCERS\"]) {\r\n uniformsList.push(\"morphTargetInfluences\");\r\n uniformsList.push(\"morphTargetCount\");\r\n }\r\n\r\n if (defines[\"BAKED_VERTEX_ANIMATION_TEXTURE\"]) {\r\n uniformsList.push(\"bakedVertexAnimationSettings\");\r\n uniformsList.push(\"bakedVertexAnimationTextureSizeInverted\");\r\n uniformsList.push(\"bakedVertexAnimationTime\");\r\n samplersList.push(\"bakedVertexAnimationTexture\");\r\n }\r\n}\r\n", "import { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { serialize } from \"../Misc/decorators\";\r\nimport type { IStencilState } from \"../States/IStencilState\";\r\n\r\nimport type { Scene } from \"../scene\";\r\n\r\n/**\r\n * Class that holds the different stencil states of a material\r\n * Usage example: https://playground.babylonjs.com/#CW5PRI#10\r\n */\r\nexport class MaterialStencilState implements IStencilState {\r\n /**\r\n * Creates a material stencil state instance\r\n */\r\n public constructor() {\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Resets all the stencil states to default values\r\n */\r\n public reset() {\r\n this.enabled = false;\r\n this.mask = 0xff;\r\n\r\n this.func = Constants.ALWAYS;\r\n this.funcRef = 1;\r\n this.funcMask = 0xff;\r\n\r\n this.opStencilFail = Constants.KEEP;\r\n this.opDepthFail = Constants.KEEP;\r\n this.opStencilDepthPass = Constants.REPLACE;\r\n }\r\n\r\n private _func: number;\r\n /**\r\n * Gets or sets the stencil function\r\n */\r\n @serialize()\r\n public get func(): number {\r\n return this._func;\r\n }\r\n\r\n public set func(value: number) {\r\n this._func = value;\r\n }\r\n\r\n private _funcRef: number;\r\n /**\r\n * Gets or sets the stencil function reference\r\n */\r\n @serialize()\r\n public get funcRef(): number {\r\n return this._funcRef;\r\n }\r\n\r\n public set funcRef(value: number) {\r\n this._funcRef = value;\r\n }\r\n\r\n private _funcMask: number;\r\n /**\r\n * Gets or sets the stencil function mask\r\n */\r\n @serialize()\r\n public get funcMask(): number {\r\n return this._funcMask;\r\n }\r\n\r\n public set funcMask(value: number) {\r\n this._funcMask = value;\r\n }\r\n\r\n private _opStencilFail: number;\r\n /**\r\n * Gets or sets the operation when the stencil test fails\r\n */\r\n @serialize()\r\n public get opStencilFail(): number {\r\n return this._opStencilFail;\r\n }\r\n\r\n public set opStencilFail(value: number) {\r\n this._opStencilFail = value;\r\n }\r\n\r\n private _opDepthFail: number;\r\n /**\r\n * Gets or sets the operation when the depth test fails\r\n */\r\n @serialize()\r\n public get opDepthFail(): number {\r\n return this._opDepthFail;\r\n }\r\n\r\n public set opDepthFail(value: number) {\r\n this._opDepthFail = value;\r\n }\r\n\r\n private _opStencilDepthPass: number;\r\n /**\r\n * Gets or sets the operation when the stencil+depth test succeeds\r\n */\r\n @serialize()\r\n public get opStencilDepthPass(): number {\r\n return this._opStencilDepthPass;\r\n }\r\n\r\n public set opStencilDepthPass(value: number) {\r\n this._opStencilDepthPass = value;\r\n }\r\n\r\n private _mask: number;\r\n /**\r\n * Gets or sets the stencil mask\r\n */\r\n @serialize()\r\n public get mask(): number {\r\n return this._mask;\r\n }\r\n\r\n public set mask(value: number) {\r\n this._mask = value;\r\n }\r\n\r\n private _enabled: boolean;\r\n /**\r\n * Enables or disables the stencil test\r\n */\r\n @serialize()\r\n public get enabled(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n public set enabled(value: boolean) {\r\n this._enabled = value;\r\n }\r\n\r\n /**\r\n * Get the current class name, useful for serialization or dynamic coding.\r\n * @returns \"MaterialStencilState\"\r\n */\r\n public getClassName(): string {\r\n return \"MaterialStencilState\";\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current configuration into another one.\r\n * @param stencilState defines stencil state where to copy the info\r\n */\r\n public copyTo(stencilState: MaterialStencilState): void {\r\n SerializationHelper.Clone(() => stencilState, this);\r\n }\r\n\r\n /**\r\n * Serializes this stencil configuration.\r\n * @returns - An object with the serialized config.\r\n */\r\n public serialize(): any {\r\n return SerializationHelper.Serialize(this);\r\n }\r\n\r\n /**\r\n * Parses a stencil state configuration from a serialized object.\r\n * @param source - Serialized object.\r\n * @param scene Defines the scene we are parsing for\r\n * @param rootUrl Defines the rootUrl to load from\r\n */\r\n public parse(source: any, scene: Scene, rootUrl: string): void {\r\n SerializationHelper.Parse(() => this, source, scene, rootUrl);\r\n }\r\n}\r\n", "import { serialize } from \"../Misc/decorators\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport type { SmartArray } from \"../Misc/smartArray\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Matrix } from \"../Maths/math.vector\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { Effect } from \"./effect\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { MaterialDefines } from \"./materialDefines\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { IInspectable } from \"../Misc/iInspectable\";\r\nimport { Plane } from \"../Maths/math.plane\";\r\nimport type { ShadowDepthWrapper } from \"./shadowDepthWrapper\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\nimport { DrawWrapper } from \"./drawWrapper\";\r\nimport { MaterialStencilState } from \"./materialStencilState\";\r\nimport { ScenePerformancePriority } from \"../scene\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport type {\r\n MaterialPluginDisposed,\r\n MaterialPluginIsReadyForSubMesh,\r\n MaterialPluginGetDefineNames,\r\n MaterialPluginBindForSubMesh,\r\n MaterialPluginGetActiveTextures,\r\n MaterialPluginHasTexture,\r\n MaterialPluginGetAnimatables,\r\n MaterialPluginPrepareDefines,\r\n MaterialPluginPrepareEffect,\r\n MaterialPluginPrepareUniformBuffer,\r\n MaterialPluginCreated,\r\n MaterialPluginFillRenderTargetTextures,\r\n MaterialPluginHasRenderTargetTextures,\r\n MaterialPluginHardBindForSubMesh,\r\n} from \"./materialPluginEvent\";\r\nimport { MaterialPluginEvent } from \"./materialPluginEvent\";\r\nimport type { ShaderCustomProcessingFunction } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { IClipPlanesHolder } from \"../Misc/interfaces/iClipPlanesHolder\";\r\n\r\nimport type { PrePassRenderer } from \"../Rendering/prePassRenderer\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { Animation } from \"../Animations/animation\";\r\nimport type { InstancedMesh } from \"../Meshes/instancedMesh\";\r\nimport { BindSceneUniformBuffer } from \"./materialHelper.functions\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\n\r\ndeclare let BABYLON: any;\r\n\r\n/**\r\n * Options for compiling materials.\r\n */\r\nexport interface IMaterialCompilationOptions {\r\n /**\r\n * Defines whether clip planes are enabled.\r\n */\r\n clipPlane: boolean;\r\n\r\n /**\r\n * Defines whether instances are enabled.\r\n */\r\n useInstances: boolean;\r\n}\r\n\r\n/**\r\n * Options passed when calling customShaderNameResolve\r\n */\r\nexport interface ICustomShaderNameResolveOptions {\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: Nullable;\r\n}\r\n\r\n/**\r\n * Base class for the main features of a material in Babylon.js\r\n */\r\nexport class Material implements IAnimatable, IClipPlanesHolder {\r\n /**\r\n * Returns the triangle fill mode\r\n */\r\n public static readonly TriangleFillMode = Constants.MATERIAL_TriangleFillMode;\r\n /**\r\n * Returns the wireframe mode\r\n */\r\n public static readonly WireFrameFillMode = Constants.MATERIAL_WireFrameFillMode;\r\n /**\r\n * Returns the point fill mode\r\n */\r\n public static readonly PointFillMode = Constants.MATERIAL_PointFillMode;\r\n /**\r\n * Returns the point list draw mode\r\n */\r\n public static readonly PointListDrawMode = Constants.MATERIAL_PointListDrawMode;\r\n /**\r\n * Returns the line list draw mode\r\n */\r\n public static readonly LineListDrawMode = Constants.MATERIAL_LineListDrawMode;\r\n /**\r\n * Returns the line loop draw mode\r\n */\r\n public static readonly LineLoopDrawMode = Constants.MATERIAL_LineLoopDrawMode;\r\n /**\r\n * Returns the line strip draw mode\r\n */\r\n public static readonly LineStripDrawMode = Constants.MATERIAL_LineStripDrawMode;\r\n /**\r\n * Returns the triangle strip draw mode\r\n */\r\n public static readonly TriangleStripDrawMode = Constants.MATERIAL_TriangleStripDrawMode;\r\n /**\r\n * Returns the triangle fan draw mode\r\n */\r\n public static readonly TriangleFanDrawMode = Constants.MATERIAL_TriangleFanDrawMode;\r\n\r\n /**\r\n * Stores the clock-wise side orientation\r\n */\r\n public static readonly ClockWiseSideOrientation = Constants.MATERIAL_ClockWiseSideOrientation;\r\n\r\n /**\r\n * Stores the counter clock-wise side orientation\r\n */\r\n public static readonly CounterClockWiseSideOrientation = Constants.MATERIAL_CounterClockWiseSideOrientation;\r\n\r\n /**\r\n * The dirty texture flag value\r\n */\r\n public static readonly TextureDirtyFlag = Constants.MATERIAL_TextureDirtyFlag;\r\n\r\n /**\r\n * The dirty light flag value\r\n */\r\n public static readonly LightDirtyFlag = Constants.MATERIAL_LightDirtyFlag;\r\n\r\n /**\r\n * The dirty fresnel flag value\r\n */\r\n public static readonly FresnelDirtyFlag = Constants.MATERIAL_FresnelDirtyFlag;\r\n\r\n /**\r\n * The dirty attribute flag value\r\n */\r\n public static readonly AttributesDirtyFlag = Constants.MATERIAL_AttributesDirtyFlag;\r\n\r\n /**\r\n * The dirty misc flag value\r\n */\r\n public static readonly MiscDirtyFlag = Constants.MATERIAL_MiscDirtyFlag;\r\n\r\n /**\r\n * The dirty prepass flag value\r\n */\r\n public static readonly PrePassDirtyFlag = Constants.MATERIAL_PrePassDirtyFlag;\r\n\r\n /**\r\n * The all dirty flag value\r\n */\r\n public static readonly AllDirtyFlag = Constants.MATERIAL_AllDirtyFlag;\r\n\r\n /**\r\n * MaterialTransparencyMode: No transparency mode, Alpha channel is not use.\r\n */\r\n public static readonly MATERIAL_OPAQUE = 0;\r\n\r\n /**\r\n * MaterialTransparencyMode: Alpha Test mode, pixel are discarded below a certain threshold defined by the alpha cutoff value.\r\n */\r\n public static readonly MATERIAL_ALPHATEST = 1;\r\n\r\n /**\r\n * MaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.\r\n */\r\n public static readonly MATERIAL_ALPHABLEND = 2;\r\n\r\n /**\r\n * MaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.\r\n * They are also discarded below the alpha cutoff threshold to improve performances.\r\n */\r\n public static readonly MATERIAL_ALPHATESTANDBLEND = 3;\r\n\r\n /**\r\n * The Whiteout method is used to blend normals.\r\n * Details of the algorithm can be found here: https://blog.selfshadow.com/publications/blending-in-detail/\r\n */\r\n public static readonly MATERIAL_NORMALBLENDMETHOD_WHITEOUT = 0;\r\n\r\n /**\r\n * The Reoriented Normal Mapping method is used to blend normals.\r\n * Details of the algorithm can be found here: https://blog.selfshadow.com/publications/blending-in-detail/\r\n */\r\n public static readonly MATERIAL_NORMALBLENDMETHOD_RNM = 1;\r\n\r\n /**\r\n * Event observable which raises global events common to all materials (like MaterialPluginEvent.Created)\r\n */\r\n public static OnEventObservable = new Observable();\r\n\r\n /**\r\n * Custom callback helping to override the default shader used in the material.\r\n */\r\n public customShaderNameResolve: (\r\n shaderName: string,\r\n uniforms: string[],\r\n uniformBuffers: string[],\r\n samplers: string[],\r\n defines: MaterialDefines | string[],\r\n attributes?: string[],\r\n options?: ICustomShaderNameResolveOptions\r\n ) => string;\r\n\r\n /**\r\n * Custom shadow depth material to use for shadow rendering instead of the in-built one\r\n */\r\n public shadowDepthWrapper: Nullable = null;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the material is allowed (if supported) to do shader hot swapping.\r\n * This means that the material can keep using a previous shader while a new one is being compiled.\r\n * This is mostly used when shader parallel compilation is supported (true by default)\r\n */\r\n public allowShaderHotSwapping = true;\r\n\r\n /**\r\n * The ID of the material\r\n */\r\n @serialize()\r\n public id: string;\r\n\r\n /**\r\n * Gets or sets the unique id of the material\r\n */\r\n @serialize()\r\n public uniqueId: number;\r\n\r\n /** @internal */\r\n public _loadedUniqueId: string;\r\n\r\n /**\r\n * The name of the material\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Gets or sets user defined metadata\r\n */\r\n @serialize()\r\n public metadata: any = null;\r\n\r\n /** @internal */\r\n public _internalMetadata: any;\r\n\r\n /**\r\n * For internal use only. Please do not use.\r\n */\r\n public reservedDataStore: any = null;\r\n\r\n /**\r\n * Specifies if the ready state should be checked on each call\r\n */\r\n @serialize()\r\n public checkReadyOnEveryCall = false;\r\n\r\n /**\r\n * Specifies if the ready state should be checked once\r\n */\r\n @serialize()\r\n public checkReadyOnlyOnce = false;\r\n\r\n /**\r\n * The state of the material\r\n */\r\n @serialize()\r\n public state = \"\";\r\n\r\n /**\r\n * If the material can be rendered to several textures with MRT extension\r\n */\r\n public get canRenderToMRT(): boolean {\r\n // By default, shaders are not compatible with MRTs\r\n // Base classes should override that if their shader supports MRT\r\n return false;\r\n }\r\n\r\n /**\r\n * The alpha value of the material\r\n */\r\n @serialize(\"alpha\")\r\n protected _alpha = 1.0;\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility\r\n */\r\n public inspectableCustomProperties: IInspectable[];\r\n\r\n /**\r\n * Sets the alpha value of the material\r\n */\r\n public set alpha(value: number) {\r\n if (this._alpha === value) {\r\n return;\r\n }\r\n\r\n const oldValue = this._alpha;\r\n this._alpha = value;\r\n\r\n // Only call dirty when there is a state change (no alpha / alpha)\r\n if (oldValue === 1 || value === 1) {\r\n this.markAsDirty(Material.MiscDirtyFlag + Material.PrePassDirtyFlag);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the alpha value of the material\r\n */\r\n public get alpha(): number {\r\n return this._alpha;\r\n }\r\n\r\n /**\r\n * Specifies if back face culling is enabled\r\n */\r\n @serialize(\"backFaceCulling\")\r\n protected _backFaceCulling = true;\r\n\r\n /**\r\n * Sets the culling state (true to enable culling, false to disable)\r\n */\r\n public set backFaceCulling(value: boolean) {\r\n if (this._backFaceCulling === value) {\r\n return;\r\n }\r\n this._backFaceCulling = value;\r\n this.markAsDirty(Material.TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the culling state\r\n */\r\n public get backFaceCulling(): boolean {\r\n return this._backFaceCulling;\r\n }\r\n\r\n /**\r\n * Specifies if back or front faces should be culled (when culling is enabled)\r\n */\r\n @serialize(\"cullBackFaces\")\r\n protected _cullBackFaces = true;\r\n\r\n /**\r\n * Sets the type of faces that should be culled (true for back faces, false for front faces)\r\n */\r\n public set cullBackFaces(value: boolean) {\r\n if (this._cullBackFaces === value) {\r\n return;\r\n }\r\n this._cullBackFaces = value;\r\n this.markAsDirty(Material.TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the type of faces that should be culled\r\n */\r\n public get cullBackFaces(): boolean {\r\n return this._cullBackFaces;\r\n }\r\n\r\n private _blockDirtyMechanism = false;\r\n\r\n /**\r\n * Block the dirty-mechanism for this specific material\r\n * When set to false after being true the material will be marked as dirty.\r\n */\r\n public get blockDirtyMechanism(): boolean {\r\n return this._blockDirtyMechanism;\r\n }\r\n\r\n public set blockDirtyMechanism(value: boolean) {\r\n if (this._blockDirtyMechanism === value) {\r\n return;\r\n }\r\n\r\n this._blockDirtyMechanism = value;\r\n\r\n if (!value) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * This allows you to modify the material without marking it as dirty after every change.\r\n * This function should be used if you need to make more than one dirty-enabling change to the material - adding a texture, setting a new fill mode and so on.\r\n * The callback will pass the material as an argument, so you can make your changes to it.\r\n * @param callback the callback to be executed that will update the material\r\n */\r\n public atomicMaterialsUpdate(callback: (material: this) => void): void {\r\n this.blockDirtyMechanism = true;\r\n try {\r\n callback(this);\r\n } finally {\r\n this.blockDirtyMechanism = false;\r\n }\r\n }\r\n\r\n /**\r\n * Stores the value for side orientation\r\n */\r\n @serialize()\r\n public sideOrientation: number;\r\n\r\n /**\r\n * Callback triggered when the material is compiled\r\n */\r\n public onCompiled: Nullable<(effect: Effect) => void> = null;\r\n\r\n /**\r\n * Callback triggered when an error occurs\r\n */\r\n public onError: Nullable<(effect: Effect, errors: string) => void> = null;\r\n\r\n /**\r\n * Callback triggered to get the render target textures\r\n */\r\n public getRenderTargetTextures: Nullable<() => SmartArray> = null;\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public get hasRenderTargetTextures(): boolean {\r\n this._eventInfo.hasRenderTargetTextures = false;\r\n this._callbackPluginEventHasRenderTargetTextures(this._eventInfo);\r\n return this._eventInfo.hasRenderTargetTextures;\r\n }\r\n\r\n /**\r\n * Specifies if the material should be serialized\r\n */\r\n public doNotSerialize = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _storeEffectOnSubMeshes = false;\r\n\r\n /**\r\n * Stores the animations for the material\r\n */\r\n public animations: Nullable> = null;\r\n\r\n /**\r\n * An event triggered when the material is disposed\r\n */\r\n public onDisposeObservable = new Observable();\r\n\r\n /**\r\n * An observer which watches for dispose events\r\n */\r\n private _onDisposeObserver: Nullable> = null;\r\n private _onUnBindObservable: Nullable> = null;\r\n\r\n /**\r\n * Called during a dispose event\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n private _onBindObservable: Nullable>;\r\n\r\n /**\r\n * An event triggered when the material is bound\r\n */\r\n public get onBindObservable(): Observable {\r\n if (!this._onBindObservable) {\r\n this._onBindObservable = new Observable();\r\n }\r\n\r\n return this._onBindObservable;\r\n }\r\n\r\n /**\r\n * An observer which watches for bind events\r\n */\r\n private _onBindObserver: Nullable> = null;\r\n\r\n /**\r\n * Called during a bind event\r\n */\r\n public set onBind(callback: (Mesh: AbstractMesh) => void) {\r\n if (this._onBindObserver) {\r\n this.onBindObservable.remove(this._onBindObserver);\r\n }\r\n this._onBindObserver = this.onBindObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the material is unbound\r\n */\r\n public get onUnBindObservable(): Observable {\r\n if (!this._onUnBindObservable) {\r\n this._onUnBindObservable = new Observable();\r\n }\r\n\r\n return this._onUnBindObservable;\r\n }\r\n\r\n protected _onEffectCreatedObservable: Nullable }>>;\r\n\r\n /**\r\n * An event triggered when the effect is (re)created\r\n */\r\n public get onEffectCreatedObservable(): Observable<{ effect: Effect; subMesh: Nullable }> {\r\n if (!this._onEffectCreatedObservable) {\r\n this._onEffectCreatedObservable = new Observable<{ effect: Effect; subMesh: Nullable }>();\r\n }\r\n\r\n return this._onEffectCreatedObservable;\r\n }\r\n\r\n /**\r\n * Stores the value of the alpha mode\r\n */\r\n @serialize(\"alphaMode\")\r\n private _alphaMode: number = Constants.ALPHA_COMBINE;\r\n\r\n /**\r\n * Sets the value of the alpha mode.\r\n *\r\n * | Value | Type | Description |\r\n * | --- | --- | --- |\r\n * | 0 | ALPHA_DISABLE | |\r\n * | 1 | ALPHA_ADD | |\r\n * | 2 | ALPHA_COMBINE | |\r\n * | 3 | ALPHA_SUBTRACT | |\r\n * | 4 | ALPHA_MULTIPLY | |\r\n * | 5 | ALPHA_MAXIMIZED | |\r\n * | 6 | ALPHA_ONEONE | |\r\n * | 7 | ALPHA_PREMULTIPLIED | |\r\n * | 8 | ALPHA_PREMULTIPLIED_PORTERDUFF | |\r\n * | 9 | ALPHA_INTERPOLATE | |\r\n * | 10 | ALPHA_SCREENMODE | |\r\n *\r\n */\r\n public set alphaMode(value: number) {\r\n if (this._alphaMode === value) {\r\n return;\r\n }\r\n this._alphaMode = value;\r\n this.markAsDirty(Material.TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the value of the alpha mode\r\n */\r\n public get alphaMode(): number {\r\n return this._alphaMode;\r\n }\r\n\r\n /**\r\n * Stores the state of the need depth pre-pass value\r\n */\r\n @serialize()\r\n private _needDepthPrePass = false;\r\n\r\n /**\r\n * Sets the need depth pre-pass value\r\n */\r\n public set needDepthPrePass(value: boolean) {\r\n if (this._needDepthPrePass === value) {\r\n return;\r\n }\r\n this._needDepthPrePass = value;\r\n if (this._needDepthPrePass) {\r\n this.checkReadyOnEveryCall = true;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the depth pre-pass value\r\n */\r\n public get needDepthPrePass(): boolean {\r\n return this._needDepthPrePass;\r\n }\r\n\r\n /**\r\n * Can this material render to prepass\r\n */\r\n public get isPrePassCapable(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies if depth writing should be disabled\r\n */\r\n @serialize()\r\n public disableDepthWrite = false;\r\n\r\n /**\r\n * Specifies if color writing should be disabled\r\n */\r\n @serialize()\r\n public disableColorWrite = false;\r\n\r\n /**\r\n * Specifies if depth writing should be forced\r\n */\r\n @serialize()\r\n public forceDepthWrite = false;\r\n\r\n /**\r\n * Specifies the depth function that should be used. 0 means the default engine function\r\n */\r\n @serialize()\r\n public depthFunction = 0;\r\n\r\n /**\r\n * Specifies if there should be a separate pass for culling\r\n */\r\n @serialize()\r\n public separateCullingPass = false;\r\n\r\n /**\r\n * Stores the state specifying if fog should be enabled\r\n */\r\n @serialize(\"fogEnabled\")\r\n private _fogEnabled = true;\r\n\r\n /**\r\n * Sets the state for enabling fog\r\n */\r\n public set fogEnabled(value: boolean) {\r\n if (this._fogEnabled === value) {\r\n return;\r\n }\r\n this._fogEnabled = value;\r\n this.markAsDirty(Material.MiscDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the value of the fog enabled state\r\n */\r\n public get fogEnabled(): boolean {\r\n return this._fogEnabled;\r\n }\r\n\r\n /**\r\n * Stores the size of points\r\n */\r\n @serialize()\r\n public pointSize = 1.0;\r\n\r\n /**\r\n * Stores the z offset Factor value\r\n */\r\n @serialize()\r\n public zOffset = 0;\r\n\r\n /**\r\n * Stores the z offset Units value\r\n */\r\n @serialize()\r\n public zOffsetUnits = 0;\r\n\r\n public get wireframe(): boolean {\r\n switch (this._fillMode) {\r\n case Material.WireFrameFillMode:\r\n case Material.LineListDrawMode:\r\n case Material.LineLoopDrawMode:\r\n case Material.LineStripDrawMode:\r\n return true;\r\n }\r\n\r\n return this._scene.forceWireframe;\r\n }\r\n\r\n /**\r\n * Sets the state of wireframe mode\r\n */\r\n public set wireframe(value: boolean) {\r\n this.fillMode = value ? Material.WireFrameFillMode : Material.TriangleFillMode;\r\n }\r\n\r\n /**\r\n * Gets the value specifying if point clouds are enabled\r\n */\r\n @serialize()\r\n public get pointsCloud(): boolean {\r\n switch (this._fillMode) {\r\n case Material.PointFillMode:\r\n case Material.PointListDrawMode:\r\n return true;\r\n }\r\n\r\n return this._scene.forcePointsCloud;\r\n }\r\n\r\n /**\r\n * Sets the state of point cloud mode\r\n */\r\n public set pointsCloud(value: boolean) {\r\n this.fillMode = value ? Material.PointFillMode : Material.TriangleFillMode;\r\n }\r\n\r\n /**\r\n * Gets the material fill mode\r\n */\r\n @serialize()\r\n public get fillMode(): number {\r\n return this._fillMode;\r\n }\r\n\r\n /**\r\n * Sets the material fill mode\r\n */\r\n public set fillMode(value: number) {\r\n if (this._fillMode === value) {\r\n return;\r\n }\r\n\r\n this._fillMode = value;\r\n this.markAsDirty(Material.MiscDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets or sets the active clipplane 1\r\n */\r\n public clipPlane: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 2\r\n */\r\n public clipPlane2: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 3\r\n */\r\n public clipPlane3: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 4\r\n */\r\n public clipPlane4: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 5\r\n */\r\n public clipPlane5: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 6\r\n */\r\n public clipPlane6: Nullable;\r\n\r\n /**\r\n * Gives access to the stencil properties of the material\r\n */\r\n public readonly stencil = new MaterialStencilState();\r\n\r\n protected _useLogarithmicDepth: boolean;\r\n\r\n /**\r\n * In case the depth buffer does not allow enough depth precision for your scene (might be the case in large scenes)\r\n * You can try switching to logarithmic depth.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/logarithmicDepthBuffer\r\n */\r\n @serialize()\r\n public get useLogarithmicDepth(): boolean {\r\n return this._useLogarithmicDepth;\r\n }\r\n\r\n public set useLogarithmicDepth(value: boolean) {\r\n const fragmentDepthSupported = this.getScene().getEngine().getCaps().fragmentDepthSupported;\r\n\r\n if (value && !fragmentDepthSupported) {\r\n Logger.Warn(\"Logarithmic depth has been requested for a material on a device that doesn't support it.\");\r\n }\r\n\r\n this._useLogarithmicDepth = value && fragmentDepthSupported;\r\n\r\n this._markAllSubMeshesAsMiscDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n * Stores the effects for the material\r\n */\r\n public _materialContext: IMaterialContext | undefined;\r\n\r\n protected _drawWrapper: DrawWrapper;\r\n /** @internal */\r\n public _getDrawWrapper(): DrawWrapper {\r\n return this._drawWrapper;\r\n }\r\n /**\r\n * @internal\r\n */\r\n public _setDrawWrapper(drawWrapper: DrawWrapper) {\r\n this._drawWrapper = drawWrapper;\r\n }\r\n\r\n /**\r\n * Specifies if uniform buffers should be used\r\n */\r\n private _useUBO: boolean = false;\r\n\r\n /**\r\n * Stores a reference to the scene\r\n */\r\n private _scene: Scene;\r\n protected _needToBindSceneUbo: boolean;\r\n\r\n /**\r\n * Stores the fill mode state\r\n */\r\n private _fillMode = Material.TriangleFillMode;\r\n\r\n /**\r\n * Specifies if the depth write state should be cached\r\n */\r\n private _cachedDepthWriteState: boolean = false;\r\n\r\n /**\r\n * Specifies if the color write state should be cached\r\n */\r\n private _cachedColorWriteState: boolean = false;\r\n\r\n /**\r\n * Specifies if the depth function state should be cached\r\n */\r\n private _cachedDepthFunctionState: number = 0;\r\n\r\n /**\r\n * Stores the uniform buffer\r\n * @internal\r\n */\r\n public _uniformBuffer: UniformBuffer;\r\n\r\n /** @internal */\r\n public _indexInSceneMaterialArray = -1;\r\n\r\n /** @internal */\r\n public meshMap: Nullable<{ [id: string]: AbstractMesh | undefined }> = null;\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable = null;\r\n\r\n /** @internal */\r\n public _dirtyCallbacks: { [code: number]: () => void };\r\n\r\n /** @internal */\r\n public _uniformBufferLayoutBuilt = false;\r\n\r\n protected _eventInfo: MaterialPluginCreated &\r\n MaterialPluginDisposed &\r\n MaterialPluginHasTexture &\r\n MaterialPluginIsReadyForSubMesh &\r\n MaterialPluginGetDefineNames &\r\n MaterialPluginPrepareEffect &\r\n MaterialPluginPrepareDefines &\r\n MaterialPluginPrepareUniformBuffer &\r\n MaterialPluginBindForSubMesh &\r\n MaterialPluginGetAnimatables &\r\n MaterialPluginGetActiveTextures &\r\n MaterialPluginFillRenderTargetTextures &\r\n MaterialPluginHasRenderTargetTextures &\r\n MaterialPluginHardBindForSubMesh = {} as any; // will be initialized before each event notification\r\n\r\n /** @internal */\r\n public _callbackPluginEventGeneric: (\r\n id: number,\r\n info:\r\n | MaterialPluginGetActiveTextures\r\n | MaterialPluginGetAnimatables\r\n | MaterialPluginHasTexture\r\n | MaterialPluginDisposed\r\n | MaterialPluginGetDefineNames\r\n | MaterialPluginPrepareEffect\r\n | MaterialPluginPrepareUniformBuffer\r\n ) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventIsReadyForSubMesh: (eventData: MaterialPluginIsReadyForSubMesh) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventPrepareDefines: (eventData: MaterialPluginPrepareDefines) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventPrepareDefinesBeforeAttributes: (eventData: MaterialPluginPrepareDefines) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventHardBindForSubMesh: (eventData: MaterialPluginHardBindForSubMesh) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventBindForSubMesh: (eventData: MaterialPluginBindForSubMesh) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventHasRenderTargetTextures: (eventData: MaterialPluginHasRenderTargetTextures) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventFillRenderTargetTextures: (eventData: MaterialPluginFillRenderTargetTextures) => void = () => void 0;\r\n\r\n /**\r\n * Creates a material instance\r\n * @param name defines the name of the material\r\n * @param scene defines the scene to reference\r\n * @param doNotAdd specifies if the material should be added to the scene\r\n */\r\n constructor(name: string, scene?: Nullable, doNotAdd?: boolean) {\r\n this.name = name;\r\n const setScene = scene || EngineStore.LastCreatedScene;\r\n if (!setScene) {\r\n return;\r\n }\r\n this._scene = setScene;\r\n this._dirtyCallbacks = {};\r\n\r\n this._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag] = this._markAllSubMeshesAsTexturesDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_LightDirtyFlag] = this._markAllSubMeshesAsLightsDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_FresnelDirtyFlag] = this._markAllSubMeshesAsFresnelDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_AttributesDirtyFlag] = this._markAllSubMeshesAsAttributesDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_MiscDirtyFlag] = this._markAllSubMeshesAsMiscDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_PrePassDirtyFlag] = this._markAllSubMeshesAsPrePassDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_AllDirtyFlag] = this._markAllSubMeshesAsAllDirty.bind(this);\r\n\r\n this.id = name || Tools.RandomId();\r\n this.uniqueId = this._scene.getUniqueId();\r\n this._materialContext = this._scene.getEngine().createMaterialContext();\r\n this._drawWrapper = new DrawWrapper(this._scene.getEngine(), false);\r\n this._drawWrapper.materialContext = this._materialContext;\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n this.sideOrientation = Material.ClockWiseSideOrientation;\r\n } else {\r\n this.sideOrientation = Material.CounterClockWiseSideOrientation;\r\n }\r\n\r\n this._uniformBuffer = new UniformBuffer(this._scene.getEngine(), undefined, undefined, name);\r\n this._useUBO = this.getScene().getEngine().supportsUniformBuffers;\r\n\r\n if (!doNotAdd) {\r\n this._scene.addMaterial(this);\r\n }\r\n\r\n if (this._scene.useMaterialMeshMap) {\r\n this.meshMap = {};\r\n }\r\n\r\n Material.OnEventObservable.notifyObservers(this, MaterialPluginEvent.Created);\r\n }\r\n\r\n /**\r\n * Returns a string representation of the current material\r\n * @param fullDetails defines a boolean indicating which levels of logging is desired\r\n * @returns a string with material information\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public toString(fullDetails?: boolean): string {\r\n const ret = \"Name: \" + this.name;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Gets the class name of the material\r\n * @returns a string with the class name of the material\r\n */\r\n public getClassName(): string {\r\n return \"Material\";\r\n }\r\n\r\n /** @internal */\r\n public get _isMaterial() {\r\n return true;\r\n }\r\n\r\n /**\r\n * Specifies if updates for the material been locked\r\n */\r\n public get isFrozen(): boolean {\r\n return this.checkReadyOnlyOnce;\r\n }\r\n\r\n /**\r\n * Locks updates for the material\r\n */\r\n public freeze(): void {\r\n this.markDirty();\r\n this.checkReadyOnlyOnce = true;\r\n }\r\n\r\n /**\r\n * Unlocks updates for the material\r\n */\r\n public unfreeze(): void {\r\n this.markDirty();\r\n this.checkReadyOnlyOnce = false;\r\n }\r\n\r\n /**\r\n * Specifies if the material is ready to be used\r\n * @param mesh defines the mesh to check\r\n * @param useInstances specifies if instances should be used\r\n * @returns a boolean indicating if the material is ready to be used\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReady(mesh?: AbstractMesh, useInstances?: boolean): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Specifies that the submesh is ready to be used\r\n * @param mesh defines the mesh to check\r\n * @param subMesh defines which submesh to check\r\n * @param useInstances specifies that instances should be used\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean {\r\n const defines = subMesh.materialDefines;\r\n if (!defines) {\r\n return false;\r\n }\r\n\r\n this._eventInfo.isReadyForSubMesh = true;\r\n this._eventInfo.defines = defines;\r\n this._callbackPluginEventIsReadyForSubMesh(this._eventInfo);\r\n\r\n return this._eventInfo.isReadyForSubMesh;\r\n }\r\n\r\n /**\r\n * Returns the material effect\r\n * @returns the effect associated with the material\r\n */\r\n public getEffect(): Nullable {\r\n return this._drawWrapper.effect;\r\n }\r\n\r\n /**\r\n * Returns the current scene\r\n * @returns a Scene\r\n */\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Enforces alpha test in opaque or blend mode in order to improve the performances of some situations.\r\n */\r\n protected _forceAlphaTest = false;\r\n\r\n /**\r\n * The transparency mode of the material.\r\n */\r\n protected _transparencyMode: Nullable = null;\r\n\r\n /**\r\n * Gets the current transparency mode.\r\n */\r\n @serialize()\r\n public get transparencyMode(): Nullable {\r\n return this._transparencyMode;\r\n }\r\n\r\n /**\r\n * Sets the transparency mode of the material.\r\n *\r\n * | Value | Type | Description |\r\n * | ----- | ----------------------------------- | ----------- |\r\n * | 0 | OPAQUE | |\r\n * | 1 | ALPHATEST | |\r\n * | 2 | ALPHABLEND | |\r\n * | 3 | ALPHATESTANDBLEND | |\r\n *\r\n */\r\n public set transparencyMode(value: Nullable) {\r\n if (this._transparencyMode === value) {\r\n return;\r\n }\r\n\r\n this._transparencyMode = value;\r\n\r\n this._forceAlphaTest = value === Material.MATERIAL_ALPHATESTANDBLEND;\r\n\r\n this._markAllSubMeshesAsTexturesAndMiscDirty();\r\n }\r\n\r\n /**\r\n * Returns true if alpha blending should be disabled.\r\n */\r\n protected get _disableAlphaBlending(): boolean {\r\n return this._transparencyMode === Material.MATERIAL_OPAQUE || this._transparencyMode === Material.MATERIAL_ALPHATEST;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha blend mode.\r\n * @returns a boolean specifying if alpha blending is needed\r\n */\r\n public needAlphaBlending(): boolean {\r\n if (this._disableAlphaBlending) {\r\n return false;\r\n }\r\n\r\n return this.alpha < 1.0;\r\n }\r\n\r\n /**\r\n * Specifies if the mesh will require alpha blending\r\n * @param mesh defines the mesh to check\r\n * @returns a boolean specifying if alpha blending is needed for the mesh\r\n */\r\n public needAlphaBlendingForMesh(mesh: AbstractMesh): boolean {\r\n if (mesh.visibility < 1.0) {\r\n return true;\r\n }\r\n\r\n if (this._disableAlphaBlending) {\r\n return false;\r\n }\r\n\r\n return mesh.hasVertexAlpha || this.needAlphaBlending();\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha test mode.\r\n * @returns a boolean specifying if an alpha test is needed.\r\n */\r\n public needAlphaTesting(): boolean {\r\n if (this._forceAlphaTest) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies if material alpha testing should be turned on for the mesh\r\n * @param mesh defines the mesh to check\r\n * @returns a boolean specifying if alpha testing should be turned on for the mesh\r\n */\r\n protected _shouldTurnAlphaTestOn(mesh: AbstractMesh): boolean {\r\n return !this.needAlphaBlendingForMesh(mesh) && this.needAlphaTesting();\r\n }\r\n\r\n /**\r\n * Gets the texture used for the alpha test\r\n * @returns the texture to use for alpha testing\r\n */\r\n public getAlphaTestTexture(): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate that it needs to be re-calculated\r\n * @param forceMaterialDirty - Forces the material to be marked as dirty for all components (same as this.markAsDirty(Material.AllDirtyFlag)). You should use this flag if the material is frozen and you want to force a recompilation.\r\n */\r\n public markDirty(forceMaterialDirty = false): void {\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n if (subMesh.getMaterial() !== this) {\r\n continue;\r\n }\r\n\r\n for (const drawWrapper of subMesh._drawWrappers) {\r\n if (!drawWrapper) {\r\n continue;\r\n }\r\n if (this._materialContext === drawWrapper.materialContext) {\r\n drawWrapper._wasPreviouslyReady = false;\r\n drawWrapper._wasPreviouslyUsingInstances = null;\r\n drawWrapper._forceRebindOnNextCall = forceMaterialDirty;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (forceMaterialDirty) {\r\n this.markAsDirty(Material.AllDirtyFlag);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _preBind(effect?: Effect | DrawWrapper, overrideOrientation: Nullable = null): boolean {\r\n const engine = this._scene.getEngine();\r\n\r\n const orientation = overrideOrientation == null ? this.sideOrientation : overrideOrientation;\r\n const reverse = orientation === Material.ClockWiseSideOrientation;\r\n\r\n engine.enableEffect(effect ? effect : this._getDrawWrapper());\r\n engine.setState(\r\n this.backFaceCulling,\r\n this.zOffset,\r\n false,\r\n reverse,\r\n this._scene._mirroredCameraPosition ? !this.cullBackFaces : this.cullBackFaces,\r\n this.stencil,\r\n this.zOffsetUnits\r\n );\r\n\r\n return reverse;\r\n }\r\n\r\n /**\r\n * Binds the material to the mesh\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh to bind the material to\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bind(world: Matrix, mesh?: Mesh): void {}\r\n\r\n /**\r\n * Initializes the uniform buffer layout for the shader.\r\n */\r\n public buildUniformLayout(): void {\r\n const ubo = this._uniformBuffer;\r\n\r\n this._eventInfo.ubo = ubo;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.PrepareUniformBuffer, this._eventInfo);\r\n\r\n ubo.create();\r\n\r\n this._uniformBufferLayoutBuilt = true;\r\n }\r\n\r\n /**\r\n * Binds the submesh to the material\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventBindForSubMesh(this._eventInfo);\r\n drawWrapper._forceRebindOnNextCall = false;\r\n }\r\n\r\n /**\r\n * Binds the world matrix to the material\r\n * @param world defines the world transformation matrix\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bindOnlyWorldMatrix(world: Matrix): void {}\r\n\r\n /**\r\n * Binds the view matrix to the effect\r\n * @param effect defines the effect to bind the view matrix to\r\n */\r\n public bindView(effect: Effect): void {\r\n if (!this._useUBO) {\r\n effect.setMatrix(\"view\", this.getScene().getViewMatrix());\r\n } else {\r\n this._needToBindSceneUbo = true;\r\n }\r\n }\r\n\r\n /**\r\n * Binds the view projection and projection matrices to the effect\r\n * @param effect defines the effect to bind the view projection and projection matrices to\r\n */\r\n public bindViewProjection(effect: Effect): void {\r\n if (!this._useUBO) {\r\n effect.setMatrix(\"viewProjection\", this.getScene().getTransformMatrix());\r\n effect.setMatrix(\"projection\", this.getScene().getProjectionMatrix());\r\n } else {\r\n this._needToBindSceneUbo = true;\r\n }\r\n }\r\n\r\n /**\r\n * Binds the view matrix to the effect\r\n * @param effect defines the effect to bind the view matrix to\r\n * @param variableName name of the shader variable that will hold the eye position\r\n */\r\n public bindEyePosition(effect: Effect, variableName?: string): void {\r\n if (!this._useUBO) {\r\n this._scene.bindEyePosition(effect, variableName);\r\n } else {\r\n this._needToBindSceneUbo = true;\r\n }\r\n }\r\n\r\n /**\r\n * Processes to execute after binding the material to a mesh\r\n * @param mesh defines the rendered mesh\r\n * @param effect defines the effect used to bind the material\r\n * @param _subMesh defines the subMesh that the material has been bound for\r\n */\r\n protected _afterBind(mesh?: Mesh, effect: Nullable = null, _subMesh?: SubMesh): void {\r\n this._scene._cachedMaterial = this;\r\n if (this._needToBindSceneUbo) {\r\n if (effect) {\r\n this._needToBindSceneUbo = false;\r\n BindSceneUniformBuffer(effect, this.getScene().getSceneUniformBuffer());\r\n this._scene.finalizeSceneUbo();\r\n }\r\n }\r\n if (mesh) {\r\n this._scene._cachedVisibility = mesh.visibility;\r\n } else {\r\n this._scene._cachedVisibility = 1;\r\n }\r\n\r\n if (this._onBindObservable && mesh) {\r\n this._onBindObservable.notifyObservers(mesh);\r\n }\r\n\r\n if (this.disableDepthWrite) {\r\n const engine = this._scene.getEngine();\r\n this._cachedDepthWriteState = engine.getDepthWrite();\r\n engine.setDepthWrite(false);\r\n }\r\n\r\n if (this.disableColorWrite) {\r\n const engine = this._scene.getEngine();\r\n this._cachedColorWriteState = engine.getColorWrite();\r\n engine.setColorWrite(false);\r\n }\r\n\r\n if (this.depthFunction !== 0) {\r\n const engine = this._scene.getEngine();\r\n this._cachedDepthFunctionState = engine.getDepthFunction() || 0;\r\n engine.setDepthFunction(this.depthFunction);\r\n }\r\n }\r\n\r\n /**\r\n * Unbinds the material from the mesh\r\n */\r\n public unbind(): void {\r\n if (this._onUnBindObservable) {\r\n this._onUnBindObservable.notifyObservers(this);\r\n }\r\n\r\n if (this.depthFunction !== 0) {\r\n const engine = this._scene.getEngine();\r\n engine.setDepthFunction(this._cachedDepthFunctionState);\r\n }\r\n\r\n if (this.disableDepthWrite) {\r\n const engine = this._scene.getEngine();\r\n engine.setDepthWrite(this._cachedDepthWriteState);\r\n }\r\n\r\n if (this.disableColorWrite) {\r\n const engine = this._scene.getEngine();\r\n engine.setColorWrite(this._cachedColorWriteState);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the animatable textures.\r\n * @returns - Array of animatable textures.\r\n */\r\n public getAnimatables(): IAnimatable[] {\r\n this._eventInfo.animatables = [];\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetAnimatables, this._eventInfo);\r\n return this._eventInfo.animatables;\r\n }\r\n\r\n /**\r\n * Gets the active textures from the material\r\n * @returns an array of textures\r\n */\r\n public getActiveTextures(): BaseTexture[] {\r\n this._eventInfo.activeTextures = [];\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetActiveTextures, this._eventInfo);\r\n return this._eventInfo.activeTextures;\r\n }\r\n\r\n /**\r\n * Specifies if the material uses a texture\r\n * @param texture defines the texture to check against the material\r\n * @returns a boolean specifying if the material uses the texture\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n this._eventInfo.hasTexture = false;\r\n this._eventInfo.texture = texture;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.HasTexture, this._eventInfo);\r\n return this._eventInfo.hasTexture;\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the material, and gives it a new name\r\n * @param name defines the new name for the duplicated material\r\n * @returns the cloned material\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public clone(name: string): Nullable {\r\n return null;\r\n }\r\n\r\n protected _clonePlugins(targetMaterial: Material, rootUrl: string) {\r\n const serializationObject: any = {};\r\n\r\n // Create plugins in targetMaterial in case they don't exist\r\n this._serializePlugins(serializationObject);\r\n\r\n Material._ParsePlugins(serializationObject, targetMaterial, this._scene, rootUrl);\r\n\r\n // Copy the properties of the current plugins to the cloned material's plugins\r\n if (this.pluginManager) {\r\n for (const plugin of this.pluginManager._plugins) {\r\n const targetPlugin = targetMaterial.pluginManager!.getPlugin(plugin.name);\r\n if (targetPlugin) {\r\n plugin.copyTo(targetPlugin);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the meshes bound to the material\r\n * @returns an array of meshes bound to the material\r\n */\r\n public getBindedMeshes(): AbstractMesh[] {\r\n if (this.meshMap) {\r\n const result: AbstractMesh[] = [];\r\n for (const meshId in this.meshMap) {\r\n const mesh = this.meshMap[meshId];\r\n if (mesh) {\r\n result.push(mesh);\r\n }\r\n }\r\n return result;\r\n } else {\r\n const meshes = this._scene.meshes;\r\n return meshes.filter((mesh) => mesh.material === this);\r\n }\r\n }\r\n\r\n /**\r\n * Force shader compilation\r\n * @param mesh defines the mesh associated with this material\r\n * @param onCompiled defines a function to execute once the material is compiled\r\n * @param options defines the options to configure the compilation\r\n * @param onError defines a function to execute if the material fails compiling\r\n */\r\n public forceCompilation(\r\n mesh: AbstractMesh,\r\n onCompiled?: (material: Material) => void,\r\n options?: Partial,\r\n onError?: (reason: string) => void\r\n ): void {\r\n const localOptions = {\r\n clipPlane: false,\r\n useInstances: false,\r\n ...options,\r\n };\r\n\r\n const scene = this.getScene();\r\n const currentHotSwapingState = this.allowShaderHotSwapping;\r\n this.allowShaderHotSwapping = false; // Turned off to let us evaluate the real compilation state\r\n\r\n const checkReady = () => {\r\n if (!this._scene || !this._scene.getEngine()) {\r\n return;\r\n }\r\n\r\n const clipPlaneState = scene.clipPlane;\r\n\r\n if (localOptions.clipPlane) {\r\n scene.clipPlane = new Plane(0, 0, 0, 1);\r\n }\r\n\r\n if (this._storeEffectOnSubMeshes) {\r\n let allDone = true,\r\n lastError = null;\r\n if (mesh.subMeshes) {\r\n const tempSubMesh = new SubMesh(0, 0, 0, 0, 0, mesh, undefined, false, false);\r\n if (tempSubMesh.materialDefines) {\r\n tempSubMesh.materialDefines._renderId = -1;\r\n }\r\n if (!this.isReadyForSubMesh(mesh, tempSubMesh, localOptions.useInstances)) {\r\n if (tempSubMesh.effect && tempSubMesh.effect.getCompilationError() && tempSubMesh.effect.allFallbacksProcessed()) {\r\n lastError = tempSubMesh.effect.getCompilationError();\r\n } else {\r\n allDone = false;\r\n setTimeout(checkReady, 16);\r\n }\r\n }\r\n }\r\n if (allDone) {\r\n this.allowShaderHotSwapping = currentHotSwapingState;\r\n if (lastError) {\r\n if (onError) {\r\n onError(lastError);\r\n }\r\n }\r\n if (onCompiled) {\r\n onCompiled(this);\r\n }\r\n }\r\n } else {\r\n if (this.isReady()) {\r\n this.allowShaderHotSwapping = currentHotSwapingState;\r\n if (onCompiled) {\r\n onCompiled(this);\r\n }\r\n } else {\r\n setTimeout(checkReady, 16);\r\n }\r\n }\r\n\r\n if (localOptions.clipPlane) {\r\n scene.clipPlane = clipPlaneState;\r\n }\r\n };\r\n\r\n checkReady();\r\n }\r\n\r\n /**\r\n * Force shader compilation\r\n * @param mesh defines the mesh that will use this material\r\n * @param options defines additional options for compiling the shaders\r\n * @returns a promise that resolves when the compilation completes\r\n */\r\n public forceCompilationAsync(mesh: AbstractMesh, options?: Partial): Promise {\r\n return new Promise((resolve, reject) => {\r\n this.forceCompilation(\r\n mesh,\r\n () => {\r\n resolve();\r\n },\r\n options,\r\n (reason) => {\r\n reject(reason);\r\n }\r\n );\r\n });\r\n }\r\n\r\n private static readonly _AllDirtyCallBack = (defines: MaterialDefines) => defines.markAllAsDirty();\r\n private static readonly _ImageProcessingDirtyCallBack = (defines: MaterialDefines) => defines.markAsImageProcessingDirty();\r\n private static readonly _TextureDirtyCallBack = (defines: MaterialDefines) => defines.markAsTexturesDirty();\r\n private static readonly _FresnelDirtyCallBack = (defines: MaterialDefines) => defines.markAsFresnelDirty();\r\n private static readonly _MiscDirtyCallBack = (defines: MaterialDefines) => defines.markAsMiscDirty();\r\n private static readonly _PrePassDirtyCallBack = (defines: MaterialDefines) => defines.markAsPrePassDirty();\r\n private static readonly _LightsDirtyCallBack = (defines: MaterialDefines) => defines.markAsLightDirty();\r\n private static readonly _AttributeDirtyCallBack = (defines: MaterialDefines) => defines.markAsAttributesDirty();\r\n\r\n private static _FresnelAndMiscDirtyCallBack = (defines: MaterialDefines) => {\r\n Material._FresnelDirtyCallBack(defines);\r\n Material._MiscDirtyCallBack(defines);\r\n };\r\n\r\n private static _TextureAndMiscDirtyCallBack = (defines: MaterialDefines) => {\r\n Material._TextureDirtyCallBack(defines);\r\n Material._MiscDirtyCallBack(defines);\r\n };\r\n\r\n private static readonly _DirtyCallbackArray: Array<(defines: MaterialDefines) => void> = [];\r\n private static readonly _RunDirtyCallBacks = (defines: MaterialDefines) => {\r\n for (const cb of Material._DirtyCallbackArray) {\r\n cb(defines);\r\n }\r\n };\r\n\r\n /**\r\n * Marks a define in the material to indicate that it needs to be re-computed\r\n * @param flag defines a flag used to determine which parts of the material have to be marked as dirty\r\n */\r\n public markAsDirty(flag: number): void {\r\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism) {\r\n return;\r\n }\r\n\r\n Material._DirtyCallbackArray.length = 0;\r\n\r\n if (flag & Material.TextureDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._TextureDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.LightDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._LightsDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.FresnelDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._FresnelDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.AttributesDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._AttributeDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.MiscDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._MiscDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.PrePassDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._PrePassDirtyCallBack);\r\n }\r\n\r\n if (Material._DirtyCallbackArray.length) {\r\n this._markAllSubMeshesAsDirty(Material._RunDirtyCallBacks);\r\n }\r\n\r\n this.getScene().resetCachedMaterial();\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache for all submeshes that are using this material\r\n */\r\n public resetDrawCache(): void {\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n if (subMesh.getMaterial() !== this) {\r\n continue;\r\n }\r\n\r\n subMesh.resetDrawCache();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Marks all submeshes of a material to indicate that their material defines need to be re-calculated\r\n * @param func defines a function which checks material defines against the submeshes\r\n */\r\n protected _markAllSubMeshesAsDirty(func: (defines: MaterialDefines) => void) {\r\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism) {\r\n return;\r\n }\r\n\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n // We want to skip the submeshes which are not using this material or which have not yet rendered at least once\r\n if (subMesh.getMaterial(false) !== this) {\r\n continue;\r\n }\r\n\r\n for (const drawWrapper of subMesh._drawWrappers) {\r\n if (!drawWrapper || !drawWrapper.defines || !(drawWrapper.defines as MaterialDefines).markAllAsDirty) {\r\n continue;\r\n }\r\n if (this._materialContext === drawWrapper.materialContext) {\r\n func(drawWrapper.defines as MaterialDefines);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Indicates that the scene should check if the rendering now needs a prepass\r\n */\r\n protected _markScenePrePassDirty() {\r\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism) {\r\n return;\r\n }\r\n\r\n const prePassRenderer = this.getScene().enablePrePassRenderer();\r\n if (prePassRenderer) {\r\n prePassRenderer.markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Indicates that we need to re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsAllDirty() {\r\n this._markAllSubMeshesAsDirty(Material._AllDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that image processing needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsImageProcessingDirty() {\r\n this._markAllSubMeshesAsDirty(Material._ImageProcessingDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that textures need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsTexturesDirty() {\r\n this._markAllSubMeshesAsDirty(Material._TextureDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that fresnel needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsFresnelDirty() {\r\n this._markAllSubMeshesAsDirty(Material._FresnelDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that fresnel and misc need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsFresnelAndMiscDirty() {\r\n this._markAllSubMeshesAsDirty(Material._FresnelAndMiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that lights need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsLightsDirty() {\r\n this._markAllSubMeshesAsDirty(Material._LightsDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that attributes need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsAttributesDirty() {\r\n this._markAllSubMeshesAsDirty(Material._AttributeDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that misc needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsMiscDirty() {\r\n this._markAllSubMeshesAsDirty(Material._MiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that prepass needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsPrePassDirty() {\r\n this._markAllSubMeshesAsDirty(Material._MiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that textures and misc need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsTexturesAndMiscDirty() {\r\n this._markAllSubMeshesAsDirty(Material._TextureAndMiscDirtyCallBack);\r\n }\r\n\r\n protected _checkScenePerformancePriority() {\r\n if (this._scene.performancePriority !== ScenePerformancePriority.BackwardCompatible) {\r\n this.checkReadyOnlyOnce = true;\r\n // re-set the flag when the perf priority changes\r\n const observer = this._scene.onScenePerformancePriorityChangedObservable.addOnce(() => {\r\n this.checkReadyOnlyOnce = false;\r\n });\r\n // if this material is disposed before the scene is disposed, cleanup the observer\r\n this.onDisposeObservable.add(() => {\r\n this._scene.onScenePerformancePriorityChangedObservable.remove(observer);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Sets the required values to the prepass renderer.\r\n * @param prePassRenderer defines the prepass renderer to setup.\r\n * @returns true if the pre pass is needed.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean {\r\n // Do Nothing by default\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the material\r\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\r\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\r\n * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh\r\n */\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean): void {\r\n const scene = this.getScene();\r\n // Animations\r\n scene.stopAnimation(this);\r\n scene.freeProcessedMaterials();\r\n\r\n // Remove from scene\r\n scene.removeMaterial(this);\r\n\r\n this._eventInfo.forceDisposeTextures = forceDisposeTextures;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.Disposed, this._eventInfo);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.materials.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.materials.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n if (notBoundToMesh !== true) {\r\n // Remove from meshes\r\n if (this.meshMap) {\r\n for (const meshId in this.meshMap) {\r\n const mesh = this.meshMap[meshId];\r\n if (mesh) {\r\n mesh.material = null; // will set the entry in the map to undefined\r\n this.releaseVertexArrayObject(mesh, forceDisposeEffect);\r\n }\r\n }\r\n } else {\r\n const meshes = scene.meshes;\r\n for (const mesh of meshes) {\r\n if (mesh.material === this && !(mesh as InstancedMesh).sourceMesh) {\r\n mesh.material = null;\r\n this.releaseVertexArrayObject(mesh, forceDisposeEffect);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._uniformBuffer.dispose();\r\n\r\n // Shader are kept in cache for further use but we can get rid of this by using forceDisposeEffect\r\n if (forceDisposeEffect && this._drawWrapper.effect) {\r\n if (!this._storeEffectOnSubMeshes) {\r\n this._drawWrapper.effect.dispose();\r\n }\r\n\r\n this._drawWrapper.effect = null;\r\n }\r\n\r\n this.metadata = null;\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n\r\n this.onDisposeObservable.clear();\r\n if (this._onBindObservable) {\r\n this._onBindObservable.clear();\r\n }\r\n\r\n if (this._onUnBindObservable) {\r\n this._onUnBindObservable.clear();\r\n }\r\n\r\n if (this._onEffectCreatedObservable) {\r\n this._onEffectCreatedObservable.clear();\r\n }\r\n\r\n if (this._eventInfo) {\r\n this._eventInfo = {} as any;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private releaseVertexArrayObject(mesh: AbstractMesh, forceDisposeEffect?: boolean) {\r\n const geometry = (mesh).geometry;\r\n if (geometry) {\r\n if (this._storeEffectOnSubMeshes) {\r\n if (mesh.subMeshes) {\r\n for (const subMesh of mesh.subMeshes) {\r\n geometry._releaseVertexArrayObject(subMesh.effect);\r\n if (forceDisposeEffect && subMesh.effect) {\r\n subMesh.effect.dispose();\r\n }\r\n }\r\n }\r\n } else {\r\n geometry._releaseVertexArrayObject(this._drawWrapper.effect);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Serializes this material\r\n * @returns the serialized material object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n\r\n serializationObject.stencil = this.stencil.serialize();\r\n serializationObject.uniqueId = this.uniqueId;\r\n\r\n this._serializePlugins(serializationObject);\r\n\r\n return serializationObject;\r\n }\r\n\r\n protected _serializePlugins(serializationObject: any) {\r\n serializationObject.plugins = {};\r\n\r\n if (this.pluginManager) {\r\n for (const plugin of this.pluginManager._plugins) {\r\n serializationObject.plugins[plugin.getClassName()] = plugin.serialize();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a material from parsed material data\r\n * @param parsedMaterial defines parsed material data\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures\r\n * @returns a new material\r\n */\r\n public static Parse(parsedMaterial: any, scene: Scene, rootUrl: string): Nullable {\r\n if (!parsedMaterial.customType) {\r\n parsedMaterial.customType = \"BABYLON.StandardMaterial\";\r\n } else if (parsedMaterial.customType === \"BABYLON.PBRMaterial\" && parsedMaterial.overloadedAlbedo) {\r\n parsedMaterial.customType = \"BABYLON.LegacyPBRMaterial\";\r\n if (!BABYLON.LegacyPBRMaterial) {\r\n Logger.Error(\"Your scene is trying to load a legacy version of the PBRMaterial, please, include it from the materials library.\");\r\n return null;\r\n }\r\n }\r\n\r\n const materialType = Tools.Instantiate(parsedMaterial.customType);\r\n const material = materialType.Parse(parsedMaterial, scene, rootUrl);\r\n material._loadedUniqueId = parsedMaterial.uniqueId;\r\n\r\n return material;\r\n }\r\n\r\n protected static _ParsePlugins(serializationObject: any, material: Material, scene: Scene, rootUrl: string) {\r\n if (!serializationObject.plugins) {\r\n return;\r\n }\r\n\r\n for (const pluginClassName in serializationObject.plugins) {\r\n const pluginData = serializationObject.plugins[pluginClassName];\r\n\r\n let plugin = material.pluginManager?.getPlugin(pluginData.name);\r\n\r\n if (!plugin) {\r\n const pluginClassType = Tools.Instantiate(\"BABYLON.\" + pluginClassName);\r\n if (pluginClassType) {\r\n plugin = new pluginClassType(material);\r\n }\r\n }\r\n\r\n plugin?.parse(pluginData, scene, rootUrl);\r\n }\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { Tags } from \"../Misc/tags\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\n/**\r\n * A multi-material is used to apply different materials to different parts of the same object without the need of\r\n * separate meshes. This can be use to improve performances.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials\r\n */\r\nexport class MultiMaterial extends Material {\r\n private _subMaterials: Nullable[];\r\n /** @internal */\r\n public _waitingSubMaterialsUniqueIds: string[] = [];\r\n\r\n /**\r\n * Gets or Sets the list of Materials used within the multi material.\r\n * They need to be ordered according to the submeshes order in the associated mesh\r\n */\r\n public get subMaterials(): Nullable[] {\r\n return this._subMaterials;\r\n }\r\n\r\n public set subMaterials(value: Nullable[]) {\r\n this._subMaterials = value;\r\n this._hookArray(value);\r\n }\r\n\r\n /**\r\n * Function used to align with Node.getChildren()\r\n * @returns the list of Materials used within the multi material\r\n */\r\n public getChildren(): Nullable[] {\r\n return this.subMaterials;\r\n }\r\n\r\n /**\r\n * Instantiates a new Multi Material\r\n * A multi-material is used to apply different materials to different parts of the same object without the need of\r\n * separate meshes. This can be use to improve performances.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials\r\n * @param name Define the name in the scene\r\n * @param scene Define the scene the material belongs to\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene, true);\r\n\r\n this.getScene().addMultiMaterial(this);\r\n\r\n this.subMaterials = [] as Material[];\r\n\r\n this._storeEffectOnSubMeshes = true; // multimaterial is considered like a push material\r\n }\r\n\r\n private _hookArray(array: Nullable[]): void {\r\n const oldPush = array.push;\r\n array.push = (...items: Nullable[]) => {\r\n const result = oldPush.apply(array, items);\r\n\r\n this._markAllSubMeshesAsTexturesDirty();\r\n\r\n return result;\r\n };\r\n\r\n const oldSplice = array.splice;\r\n array.splice = (index: number, deleteCount?: number) => {\r\n const deleted = oldSplice.apply(array, [index, deleteCount]);\r\n\r\n this._markAllSubMeshesAsTexturesDirty();\r\n\r\n return deleted;\r\n };\r\n }\r\n\r\n /**\r\n * Get one of the submaterial by its index in the submaterials array\r\n * @param index The index to look the sub material at\r\n * @returns The Material if the index has been defined\r\n */\r\n public getSubMaterial(index: number): Nullable {\r\n if (index < 0 || index >= this.subMaterials.length) {\r\n return this.getScene().defaultMaterial;\r\n }\r\n\r\n return this.subMaterials[index];\r\n }\r\n\r\n /**\r\n * Get the list of active textures for the whole sub materials list.\r\n * @returns All the textures that will be used during the rendering\r\n */\r\n public getActiveTextures(): BaseTexture[] {\r\n return super.getActiveTextures().concat(\r\n ...this.subMaterials.map((subMaterial) => {\r\n if (subMaterial) {\r\n return subMaterial.getActiveTextures();\r\n } else {\r\n return [];\r\n }\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Specifies if any sub-materials of this multi-material use a given texture.\r\n * @param texture Defines the texture to check against this multi-material's sub-materials.\r\n * @returns A boolean specifying if any sub-material of this multi-material uses the texture.\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n if (super.hasTexture(texture)) {\r\n return true;\r\n }\r\n\r\n for (let i = 0; i < this.subMaterials.length; i++) {\r\n if (this.subMaterials[i]?.hasTexture(texture)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets the current class name of the material e.g. \"MultiMaterial\"\r\n * Mainly use in serialization.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"MultiMaterial\";\r\n }\r\n\r\n /**\r\n * Checks if the material is ready to render the requested sub mesh\r\n * @param mesh Define the mesh the submesh belongs to\r\n * @param subMesh Define the sub mesh to look readiness for\r\n * @param useInstances Define whether or not the material is used with instances\r\n * @returns true if ready, otherwise false\r\n */\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean {\r\n for (let index = 0; index < this.subMaterials.length; index++) {\r\n const subMaterial = this.subMaterials[index];\r\n if (subMaterial) {\r\n if (subMaterial._storeEffectOnSubMeshes) {\r\n if (!subMaterial.isReadyForSubMesh(mesh, subMesh, useInstances)) {\r\n return false;\r\n }\r\n continue;\r\n }\r\n\r\n if (!subMaterial.isReady(mesh)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Clones the current material and its related sub materials\r\n * @param name Define the name of the newly cloned material\r\n * @param cloneChildren Define if submaterial will be cloned or shared with the parent instance\r\n * @returns the cloned material\r\n */\r\n public clone(name: string, cloneChildren?: boolean): MultiMaterial {\r\n const newMultiMaterial = new MultiMaterial(name, this.getScene());\r\n\r\n for (let index = 0; index < this.subMaterials.length; index++) {\r\n let subMaterial: Nullable = null;\r\n const current = this.subMaterials[index];\r\n if (cloneChildren && current) {\r\n subMaterial = current.clone(name + \"-\" + current.name);\r\n } else {\r\n subMaterial = this.subMaterials[index];\r\n }\r\n newMultiMaterial.subMaterials.push(subMaterial);\r\n }\r\n\r\n return newMultiMaterial;\r\n }\r\n\r\n /**\r\n * Serializes the materials into a JSON representation.\r\n * @returns the JSON representation\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.id = this.id;\r\n serializationObject.uniqueId = this.uniqueId;\r\n if (Tags) {\r\n serializationObject.tags = Tags.GetTags(this);\r\n }\r\n serializationObject.materialsUniqueIds = [];\r\n serializationObject.materials = [];\r\n\r\n for (let matIndex = 0; matIndex < this.subMaterials.length; matIndex++) {\r\n const subMat = this.subMaterials[matIndex];\r\n\r\n if (subMat) {\r\n serializationObject.materialsUniqueIds.push(subMat.uniqueId);\r\n serializationObject.materials.push(subMat.id);\r\n } else {\r\n serializationObject.materialsUniqueIds.push(null);\r\n serializationObject.materials.push(null);\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Dispose the material and release its associated resources\r\n * @param forceDisposeEffect Define if we want to force disposing the associated effect (if false the shader is not released and could be reuse later on)\r\n * @param forceDisposeTextures Define if we want to force disposing the associated textures (if false, they will not be disposed and can still be use elsewhere in the app)\r\n * @param forceDisposeChildren Define if we want to force disposing the associated submaterials (if false, they will not be disposed and can still be use elsewhere in the app)\r\n */\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, forceDisposeChildren?: boolean): void {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n if (forceDisposeChildren) {\r\n for (let index = 0; index < this.subMaterials.length; index++) {\r\n const subMaterial = this.subMaterials[index];\r\n if (subMaterial) {\r\n subMaterial.dispose(forceDisposeEffect, forceDisposeTextures);\r\n }\r\n }\r\n }\r\n\r\n const index = scene.multiMaterials.indexOf(this);\r\n if (index >= 0) {\r\n scene.multiMaterials.splice(index, 1);\r\n }\r\n\r\n super.dispose(forceDisposeEffect, forceDisposeTextures);\r\n }\r\n\r\n /**\r\n * Creates a MultiMaterial from parsed MultiMaterial data.\r\n * @param parsedMultiMaterial defines parsed MultiMaterial data.\r\n * @param scene defines the hosting scene\r\n * @returns a new MultiMaterial\r\n */\r\n public static ParseMultiMaterial(parsedMultiMaterial: any, scene: Scene): MultiMaterial {\r\n const multiMaterial = new MultiMaterial(parsedMultiMaterial.name, scene);\r\n\r\n multiMaterial.id = parsedMultiMaterial.id;\r\n multiMaterial._loadedUniqueId = parsedMultiMaterial.uniqueId;\r\n\r\n if (Tags) {\r\n Tags.AddTagsTo(multiMaterial, parsedMultiMaterial.tags);\r\n }\r\n\r\n if (parsedMultiMaterial.materialsUniqueIds) {\r\n multiMaterial._waitingSubMaterialsUniqueIds = parsedMultiMaterial.materialsUniqueIds;\r\n } else {\r\n parsedMultiMaterial.materials.forEach((subMatId: string) => multiMaterial.subMaterials.push(scene.getLastMaterialById(subMatId)));\r\n }\r\n\r\n return multiMaterial;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.MultiMaterial\", MultiMaterial);\r\n", "import type { Mesh } from \"./mesh\";\r\nimport type { Nullable } from \"../types\";\r\n\r\n/**\r\n * Class used to represent a specific level of detail of a mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\r\n */\r\nexport class MeshLODLevel {\r\n /**\r\n * Creates a new LOD level\r\n * @param distanceOrScreenCoverage defines either the distance or the screen coverage where this level should start being displayed\r\n * @param mesh defines the mesh to use to render this level\r\n */\r\n constructor(\r\n /** Either distance from the center of the object to show this level or the screen coverage if `useLODScreenCoverage` is set to `true` on the mesh*/\r\n public distanceOrScreenCoverage: number,\r\n /** Defines the mesh to use to render this level */\r\n public mesh: Nullable\r\n ) {}\r\n}\r\n", "/* eslint-disable jsdoc/require-returns-check */\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Tools, AsyncLoop } from \"../Misc/tools\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport { DeepCopier } from \"../Misc/deepCopier\";\r\nimport { Tags } from \"../Misc/tags\";\r\nimport type { Coroutine } from \"../Misc/coroutine\";\r\nimport { runCoroutineSync, runCoroutineAsync, createYieldingScheduler } from \"../Misc/coroutine\";\r\nimport type { Nullable, FloatArray, IndicesArray } from \"../types\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport type { Scene } from \"../scene\";\r\nimport { ScenePerformancePriority } from \"../scene\";\r\nimport type { Vector4 } from \"../Maths/math.vector\";\r\nimport { Quaternion, Matrix, Vector3, Vector2 } from \"../Maths/math.vector\";\r\nimport type { Color4 } from \"../Maths/math.color\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport { Node } from \"../node\";\r\nimport { VertexBuffer, Buffer } from \"../Buffers/buffer\";\r\nimport type { IGetSetVerticesData } from \"./mesh.vertexData\";\r\nimport { VertexData } from \"./mesh.vertexData\";\r\n\r\nimport { Geometry } from \"./geometry\";\r\nimport { AbstractMesh } from \"./abstractMesh\";\r\nimport { SubMesh } from \"./subMesh\";\r\nimport type { BoundingSphere } from \"../Culling/boundingSphere\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { MultiMaterial } from \"../Materials/multiMaterial\";\r\nimport { SceneLoaderFlags } from \"../Loading/sceneLoaderFlags\";\r\nimport type { Skeleton } from \"../Bones/skeleton\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { GetClass, RegisterClass } from \"../Misc/typeStore\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { MeshLODLevel } from \"./meshLODLevel\";\r\nimport type { Path3D } from \"../Maths/math.path\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport type { TransformNode } from \"./transformNode\";\r\nimport type { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { PhysicsEngine as PhysicsEngineV1 } from \"../Physics/v1/physicsEngine\";\r\n\r\nimport type { GoldbergMesh } from \"./goldbergMesh\";\r\nimport type { InstancedMesh } from \"./instancedMesh\";\r\nimport type { IPhysicsEnabledObject, PhysicsImpostor } from \"../Physics/v1/physicsImpostor\";\r\nimport type { ICreateCapsuleOptions } from \"./Builders/capsuleBuilder\";\r\nimport type { LinesMesh } from \"./linesMesh\";\r\nimport type { GroundMesh } from \"./groundMesh\";\r\nimport type { DataBuffer } from \"core/Buffers/dataBuffer\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class _CreationDataStorage {\r\n public closePath?: boolean;\r\n public closeArray?: boolean;\r\n public idx: number[];\r\n public dashSize: number;\r\n public gapSize: number;\r\n public path3D: Path3D;\r\n public pathArray: Vector3[][];\r\n public arc: number;\r\n public radius: number;\r\n public cap: number;\r\n public tessellation: number;\r\n}\r\n\r\n/**\r\n * @internal\r\n **/\r\nclass _InstanceDataStorage {\r\n public visibleInstances: any = {};\r\n public batchCache = new _InstancesBatch();\r\n public batchCacheReplacementModeInFrozenMode = new _InstancesBatch();\r\n public instancesBufferSize = 32 * 16 * 4; // let's start with a maximum of 32 instances\r\n public instancesBuffer: Nullable;\r\n public instancesPreviousBuffer: Nullable;\r\n public instancesData: Float32Array;\r\n public instancesPreviousData: Float32Array;\r\n public overridenInstanceCount: number;\r\n public isFrozen: boolean;\r\n public forceMatrixUpdates: boolean;\r\n public previousBatch: Nullable<_InstancesBatch>;\r\n public hardwareInstancedRendering: boolean;\r\n public sideOrientation: number;\r\n public manualUpdate: boolean;\r\n public previousManualUpdate: boolean;\r\n public previousRenderId: number;\r\n public masterMeshPreviousWorldMatrix: Nullable;\r\n}\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class _InstancesBatch {\r\n public mustReturn = false;\r\n public visibleInstances = new Array>>();\r\n public renderSelf: boolean[] = [];\r\n public hardwareInstancedRendering: boolean[] = [];\r\n}\r\n\r\n/**\r\n * @internal\r\n **/\r\nclass _ThinInstanceDataStorage {\r\n public instancesCount: number = 0;\r\n public matrixBuffer: Nullable = null;\r\n public previousMatrixBuffer: Nullable = null;\r\n public matrixBufferSize = 32 * 16; // let's start with a maximum of 32 thin instances\r\n public matrixData: Nullable = null;\r\n public previousMatrixData: Nullable;\r\n public boundingVectors: Array = [];\r\n public worldMatrices: Nullable = null;\r\n public masterMeshPreviousWorldMatrix: Nullable;\r\n}\r\n\r\n/**\r\n * @internal\r\n **/\r\nclass _InternalMeshDataInfo {\r\n // Events\r\n public _onBeforeRenderObservable: Nullable>;\r\n public _onBeforeBindObservable: Nullable>;\r\n public _onAfterRenderObservable: Nullable>;\r\n public _onBeforeDrawObservable: Nullable>;\r\n public _onBetweenPassObservable: Nullable>;\r\n\r\n public _areNormalsFrozen: boolean = false; // Will be used by ribbons mainly\r\n public _sourcePositions: Nullable; // Will be used to save original positions when using software skinning\r\n public _sourceNormals: Nullable; // Will be used to save original normals when using software skinning\r\n\r\n // Will be used to save a source mesh reference, If any\r\n public _source: Nullable = null;\r\n // Will be used to for fast cloned mesh lookup\r\n public meshMap: Nullable<{ [id: string]: Mesh | undefined }> = null;\r\n\r\n public _preActivateId: number = -1;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public _LODLevels = new Array();\r\n /** Alternative definition of LOD level, using screen coverage instead of distance */\r\n public _useLODScreenCoverage: boolean = false;\r\n public _checkReadinessObserver: Nullable>;\r\n\r\n public _onMeshReadyObserverAdded: (observer: Observer) => void;\r\n\r\n public _effectiveMaterial: Nullable = null;\r\n\r\n public _forcedInstanceCount: number = 0;\r\n\r\n public _overrideRenderingFillMode: Nullable = null;\r\n}\r\n\r\n/**\r\n * Class used to represent renderable models\r\n */\r\nexport class Mesh extends AbstractMesh implements IGetSetVerticesData {\r\n // Consts\r\n\r\n /**\r\n * Mesh side orientation : usually the external or front surface\r\n */\r\n public static readonly FRONTSIDE = VertexData.FRONTSIDE;\r\n\r\n /**\r\n * Mesh side orientation : usually the internal or back surface\r\n */\r\n public static readonly BACKSIDE = VertexData.BACKSIDE;\r\n /**\r\n * Mesh side orientation : both internal and external or front and back surfaces\r\n */\r\n public static readonly DOUBLESIDE = VertexData.DOUBLESIDE;\r\n /**\r\n * Mesh side orientation : by default, `FRONTSIDE`\r\n */\r\n public static readonly DEFAULTSIDE = VertexData.DEFAULTSIDE;\r\n /**\r\n * Mesh cap setting : no cap\r\n */\r\n public static readonly NO_CAP = 0;\r\n /**\r\n * Mesh cap setting : one cap at the beginning of the mesh\r\n */\r\n public static readonly CAP_START = 1;\r\n /**\r\n * Mesh cap setting : one cap at the end of the mesh\r\n */\r\n public static readonly CAP_END = 2;\r\n /**\r\n * Mesh cap setting : two caps, one at the beginning and one at the end of the mesh\r\n */\r\n public static readonly CAP_ALL = 3;\r\n /**\r\n * Mesh pattern setting : no flip or rotate\r\n */\r\n public static readonly NO_FLIP = 0;\r\n /**\r\n * Mesh pattern setting : flip (reflect in y axis) alternate tiles on each row or column\r\n */\r\n public static readonly FLIP_TILE = 1;\r\n /**\r\n * Mesh pattern setting : rotate (180degs) alternate tiles on each row or column\r\n */\r\n public static readonly ROTATE_TILE = 2;\r\n /**\r\n * Mesh pattern setting : flip (reflect in y axis) all tiles on alternate rows\r\n */\r\n public static readonly FLIP_ROW = 3;\r\n /**\r\n * Mesh pattern setting : rotate (180degs) all tiles on alternate rows\r\n */\r\n public static readonly ROTATE_ROW = 4;\r\n /**\r\n * Mesh pattern setting : flip and rotate alternate tiles on each row or column\r\n */\r\n public static readonly FLIP_N_ROTATE_TILE = 5;\r\n /**\r\n * Mesh pattern setting : rotate pattern and rotate\r\n */\r\n public static readonly FLIP_N_ROTATE_ROW = 6;\r\n /**\r\n * Mesh tile positioning : part tiles same on left/right or top/bottom\r\n */\r\n public static readonly CENTER = 0;\r\n /**\r\n * Mesh tile positioning : part tiles on left\r\n */\r\n public static readonly LEFT = 1;\r\n /**\r\n * Mesh tile positioning : part tiles on right\r\n */\r\n public static readonly RIGHT = 2;\r\n /**\r\n * Mesh tile positioning : part tiles on top\r\n */\r\n public static readonly TOP = 3;\r\n /**\r\n * Mesh tile positioning : part tiles on bottom\r\n */\r\n public static readonly BOTTOM = 4;\r\n\r\n /**\r\n * Indicates that the instanced meshes should be sorted from back to front before rendering if their material is transparent\r\n */\r\n public static INSTANCEDMESH_SORT_TRANSPARENT = false;\r\n\r\n /**\r\n * Gets the default side orientation.\r\n * @param orientation the orientation to value to attempt to get\r\n * @returns the default orientation\r\n * @internal\r\n */\r\n public static _GetDefaultSideOrientation(orientation?: number): number {\r\n return orientation || Mesh.FRONTSIDE; // works as Mesh.FRONTSIDE is 0\r\n }\r\n\r\n // Internal data\r\n private _internalMeshDataInfo = new _InternalMeshDataInfo();\r\n\r\n /**\r\n * Determines if the LOD levels are intended to be calculated using screen coverage (surface area ratio) instead of distance.\r\n */\r\n public get useLODScreenCoverage() {\r\n return this._internalMeshDataInfo._useLODScreenCoverage;\r\n }\r\n\r\n public set useLODScreenCoverage(value: boolean) {\r\n this._internalMeshDataInfo._useLODScreenCoverage = value;\r\n this._sortLODLevels();\r\n }\r\n\r\n /**\r\n * Will notify when the mesh is completely ready, including materials.\r\n * Observers added to this observable will be removed once triggered\r\n */\r\n public onMeshReadyObservable: Observable;\r\n\r\n public get computeBonesUsingShaders(): boolean {\r\n return this._internalAbstractMeshDataInfo._computeBonesUsingShaders;\r\n }\r\n public set computeBonesUsingShaders(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._computeBonesUsingShaders === value) {\r\n return;\r\n }\r\n\r\n if (value && this._internalMeshDataInfo._sourcePositions) {\r\n // switch from software to GPU computation: we need to reset the vertex and normal buffers that have been updated by the software process\r\n this.setVerticesData(VertexBuffer.PositionKind, this._internalMeshDataInfo._sourcePositions, true);\r\n if (this._internalMeshDataInfo._sourceNormals) {\r\n this.setVerticesData(VertexBuffer.NormalKind, this._internalMeshDataInfo._sourceNormals, true);\r\n }\r\n\r\n this._internalMeshDataInfo._sourcePositions = null;\r\n this._internalMeshDataInfo._sourceNormals = null;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._computeBonesUsingShaders = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /**\r\n * An event triggered before rendering the mesh\r\n */\r\n public get onBeforeRenderObservable(): Observable {\r\n if (!this._internalMeshDataInfo._onBeforeRenderObservable) {\r\n this._internalMeshDataInfo._onBeforeRenderObservable = new Observable();\r\n }\r\n\r\n return this._internalMeshDataInfo._onBeforeRenderObservable;\r\n }\r\n\r\n /**\r\n * An event triggered before binding the mesh\r\n */\r\n public get onBeforeBindObservable(): Observable {\r\n if (!this._internalMeshDataInfo._onBeforeBindObservable) {\r\n this._internalMeshDataInfo._onBeforeBindObservable = new Observable();\r\n }\r\n\r\n return this._internalMeshDataInfo._onBeforeBindObservable;\r\n }\r\n\r\n /**\r\n * An event triggered after rendering the mesh\r\n */\r\n public get onAfterRenderObservable(): Observable {\r\n if (!this._internalMeshDataInfo._onAfterRenderObservable) {\r\n this._internalMeshDataInfo._onAfterRenderObservable = new Observable();\r\n }\r\n\r\n return this._internalMeshDataInfo._onAfterRenderObservable;\r\n }\r\n\r\n /**\r\n * An event triggeredbetween rendering pass when using separateCullingPass = true\r\n */\r\n public get onBetweenPassObservable(): Observable {\r\n if (!this._internalMeshDataInfo._onBetweenPassObservable) {\r\n this._internalMeshDataInfo._onBetweenPassObservable = new Observable();\r\n }\r\n\r\n return this._internalMeshDataInfo._onBetweenPassObservable;\r\n }\r\n\r\n /**\r\n * An event triggered before drawing the mesh\r\n */\r\n public get onBeforeDrawObservable(): Observable {\r\n if (!this._internalMeshDataInfo._onBeforeDrawObservable) {\r\n this._internalMeshDataInfo._onBeforeDrawObservable = new Observable();\r\n }\r\n\r\n return this._internalMeshDataInfo._onBeforeDrawObservable;\r\n }\r\n\r\n private _onBeforeDrawObserver: Nullable>;\r\n\r\n /**\r\n * Sets a callback to call before drawing the mesh. It is recommended to use onBeforeDrawObservable instead\r\n */\r\n public set onBeforeDraw(callback: () => void) {\r\n if (this._onBeforeDrawObserver) {\r\n this.onBeforeDrawObservable.remove(this._onBeforeDrawObserver);\r\n }\r\n this._onBeforeDrawObserver = this.onBeforeDrawObservable.add(callback);\r\n }\r\n\r\n public get hasInstances(): boolean {\r\n return this.instances.length > 0;\r\n }\r\n\r\n public get hasThinInstances(): boolean {\r\n return (this.forcedInstanceCount || this._thinInstanceDataStorage.instancesCount || 0) > 0;\r\n }\r\n\r\n // Members\r\n\r\n /**\r\n * Gets the delay loading state of the mesh (when delay loading is turned on)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/incrementalLoading\r\n */\r\n public delayLoadState = Constants.DELAYLOADSTATE_NONE;\r\n\r\n /**\r\n * Gets the list of instances created from this mesh\r\n * it is not supposed to be modified manually.\r\n * Note also that the order of the InstancedMesh wihin the array is not significant and might change.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\r\n */\r\n public instances: InstancedMesh[] = [];\r\n\r\n /**\r\n * Gets the file containing delay loading data for this mesh\r\n */\r\n public delayLoadingFile: string;\r\n\r\n /** @internal */\r\n public _binaryInfo: any;\r\n\r\n /**\r\n * User defined function used to change how LOD level selection is done\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\r\n */\r\n public onLODLevelSelection: (distance: number, mesh: Mesh, selectedLevel: Nullable) => void;\r\n\r\n // Private\r\n /** @internal */\r\n public _creationDataStorage: Nullable<_CreationDataStorage> = null;\r\n\r\n /** @internal */\r\n public _geometry: Nullable = null;\r\n /** @internal */\r\n public _delayInfo: Array;\r\n /** @internal */\r\n public _delayLoadingFunction: (any: any, mesh: Mesh) => void;\r\n\r\n /**\r\n * Gets or sets the forced number of instances to display.\r\n * If 0 (default value), the number of instances is not forced and depends on the draw type\r\n * (regular / instance / thin instances mesh)\r\n */\r\n public get forcedInstanceCount(): number {\r\n return this._internalMeshDataInfo._forcedInstanceCount;\r\n }\r\n\r\n public set forcedInstanceCount(count: number) {\r\n this._internalMeshDataInfo._forcedInstanceCount = count;\r\n }\r\n\r\n /** @internal */\r\n public _instanceDataStorage = new _InstanceDataStorage();\r\n\r\n /** @internal */\r\n public _thinInstanceDataStorage = new _ThinInstanceDataStorage();\r\n\r\n /** @internal */\r\n public _shouldGenerateFlatShading: boolean = false;\r\n\r\n // Use by builder only to know what orientation were the mesh build in.\r\n /** @internal */\r\n public _originalBuilderSideOrientation: number = Mesh.DEFAULTSIDE;\r\n\r\n /**\r\n * Use this property to change the original side orientation defined at construction time\r\n */\r\n public overrideMaterialSideOrientation: Nullable = null;\r\n\r\n /**\r\n * Use this property to override the Material's fillMode value\r\n */\r\n public get overrideRenderingFillMode(): Nullable {\r\n return this._internalMeshDataInfo._overrideRenderingFillMode;\r\n }\r\n\r\n public set overrideRenderingFillMode(fillMode: Nullable) {\r\n this._internalMeshDataInfo._overrideRenderingFillMode = fillMode;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating whether to render ignoring the active camera's max z setting. (false by default)\r\n * You should not mix meshes that have this property set to true with meshes that have it set to false if they all write\r\n * to the depth buffer, because the z-values are not comparable in the two cases and you will get rendering artifacts if you do.\r\n * You can set the property to true for meshes that do not write to the depth buffer, or set the same value (either false or true) otherwise.\r\n * Note this will reduce performance when set to true.\r\n */\r\n public ignoreCameraMaxZ = false;\r\n\r\n /**\r\n * Gets the source mesh (the one used to clone this one from)\r\n */\r\n public get source(): Nullable {\r\n return this._internalMeshDataInfo._source;\r\n }\r\n\r\n /**\r\n * Gets the list of clones of this mesh\r\n * The scene must have been constructed with useClonedMeshMap=true for this to work!\r\n * Note that useClonedMeshMap=true is the default setting\r\n */\r\n public get cloneMeshMap(): Nullable<{ [id: string]: Mesh | undefined }> {\r\n return this._internalMeshDataInfo.meshMap;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this mesh does not use index buffer\r\n */\r\n public get isUnIndexed(): boolean {\r\n return this._unIndexed;\r\n }\r\n\r\n public set isUnIndexed(value: boolean) {\r\n if (this._unIndexed !== value) {\r\n this._unIndexed = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n }\r\n\r\n /** Gets the array buffer used to store the instanced buffer used for instances' world matrices */\r\n public get worldMatrixInstancedBuffer() {\r\n return this._instanceDataStorage.instancesData;\r\n }\r\n\r\n /** Gets the array buffer used to store the instanced buffer used for instances' previous world matrices */\r\n public get previousWorldMatrixInstancedBuffer() {\r\n return this._instanceDataStorage.instancesPreviousData;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */\r\n public get manualUpdateOfWorldMatrixInstancedBuffer() {\r\n return this._instanceDataStorage.manualUpdate;\r\n }\r\n\r\n public set manualUpdateOfWorldMatrixInstancedBuffer(value: boolean) {\r\n this._instanceDataStorage.manualUpdate = value;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */\r\n public get manualUpdateOfPreviousWorldMatrixInstancedBuffer() {\r\n return this._instanceDataStorage.previousManualUpdate;\r\n }\r\n\r\n public set manualUpdateOfPreviousWorldMatrixInstancedBuffer(value: boolean) {\r\n this._instanceDataStorage.previousManualUpdate = value;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices must be performed in all cases (and notably even in frozen mode) */\r\n public get forceWorldMatrixInstancedBufferUpdate() {\r\n return this._instanceDataStorage.forceMatrixUpdates;\r\n }\r\n\r\n public set forceWorldMatrixInstancedBufferUpdate(value: boolean) {\r\n this._instanceDataStorage.forceMatrixUpdates = value;\r\n }\r\n\r\n /**\r\n * @constructor\r\n * @param name The value used by scene.getMeshByName() to do a lookup.\r\n * @param scene The scene to add this mesh to.\r\n * @param parent The parent of this mesh, if it has one\r\n * @param source An optional Mesh from which geometry is shared, cloned.\r\n * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False.\r\n * When false, achieved by calling a clone(), also passing False.\r\n * This will make creation of children, recursive.\r\n * @param clonePhysicsImpostor When cloning, include cloning mesh physics impostor, default True.\r\n */\r\n constructor(\r\n name: string,\r\n scene: Nullable = null,\r\n parent: Nullable = null,\r\n source: Nullable = null,\r\n doNotCloneChildren?: boolean,\r\n clonePhysicsImpostor: boolean = true\r\n ) {\r\n super(name, scene);\r\n\r\n scene = this.getScene();\r\n\r\n this._onBeforeDraw = (isInstance: boolean, world: Matrix, effectiveMaterial?: Material) => {\r\n if (isInstance && effectiveMaterial) {\r\n if (this._uniformBuffer) {\r\n this.transferToEffect(world);\r\n } else {\r\n effectiveMaterial.bindOnlyWorldMatrix(world);\r\n }\r\n }\r\n };\r\n\r\n if (source) {\r\n // Geometry\r\n if (source._geometry) {\r\n source._geometry.applyToMesh(this);\r\n }\r\n\r\n // Deep copy\r\n DeepCopier.DeepCopy(\r\n source,\r\n this,\r\n [\r\n \"name\",\r\n \"material\",\r\n \"skeleton\",\r\n \"instances\",\r\n \"parent\",\r\n \"uniqueId\",\r\n \"source\",\r\n \"metadata\",\r\n \"morphTargetManager\",\r\n \"hasInstances\",\r\n \"worldMatrixInstancedBuffer\",\r\n \"previousWorldMatrixInstancedBuffer\",\r\n \"hasLODLevels\",\r\n \"geometry\",\r\n \"isBlocked\",\r\n \"areNormalsFrozen\",\r\n \"facetNb\",\r\n \"isFacetDataEnabled\",\r\n \"lightSources\",\r\n \"useBones\",\r\n \"isAnInstance\",\r\n \"collider\",\r\n \"edgesRenderer\",\r\n \"forward\",\r\n \"up\",\r\n \"right\",\r\n \"absolutePosition\",\r\n \"absoluteScaling\",\r\n \"absoluteRotationQuaternion\",\r\n \"isWorldMatrixFrozen\",\r\n \"nonUniformScaling\",\r\n \"behaviors\",\r\n \"worldMatrixFromCache\",\r\n \"hasThinInstances\",\r\n \"cloneMeshMap\",\r\n \"hasBoundingInfo\",\r\n \"physicsBody\",\r\n \"physicsImpostor\",\r\n ],\r\n [\"_poseMatrix\"]\r\n );\r\n\r\n // Source mesh\r\n this._internalMeshDataInfo._source = source;\r\n if (scene.useClonedMeshMap) {\r\n if (!source._internalMeshDataInfo.meshMap) {\r\n source._internalMeshDataInfo.meshMap = {};\r\n }\r\n source._internalMeshDataInfo.meshMap[this.uniqueId] = this;\r\n }\r\n\r\n // Construction Params\r\n // Clone parameters allowing mesh to be updated in case of parametric shapes.\r\n this._originalBuilderSideOrientation = source._originalBuilderSideOrientation;\r\n this._creationDataStorage = source._creationDataStorage;\r\n\r\n // Animation ranges\r\n if (source._ranges) {\r\n const ranges = source._ranges;\r\n for (const name in ranges) {\r\n if (!Object.prototype.hasOwnProperty.call(ranges, name)) {\r\n continue;\r\n }\r\n\r\n if (!ranges[name]) {\r\n continue;\r\n }\r\n\r\n this.createAnimationRange(name, ranges[name]!.from, ranges[name]!.to);\r\n }\r\n }\r\n\r\n // Metadata\r\n if (source.metadata && source.metadata.clone) {\r\n this.metadata = source.metadata.clone();\r\n } else {\r\n this.metadata = source.metadata;\r\n }\r\n this._internalMetadata = source._internalMetadata;\r\n\r\n // Tags\r\n if (Tags && Tags.HasTags(source)) {\r\n Tags.AddTagsTo(this, Tags.GetTags(source, true));\r\n }\r\n\r\n // Enabled. We shouldn't need to check the source's ancestors, as this mesh\r\n // will have the same ones.\r\n this.setEnabled(source.isEnabled(false));\r\n\r\n // Parent\r\n this.parent = source.parent;\r\n\r\n // Pivot\r\n this.setPivotMatrix(source.getPivotMatrix(), this._postMultiplyPivotMatrix);\r\n\r\n this.id = name + \".\" + source.id;\r\n\r\n // Material\r\n this.material = source.material;\r\n\r\n if (!doNotCloneChildren) {\r\n // Children\r\n const directDescendants = source.getDescendants(true);\r\n for (let index = 0; index < directDescendants.length; index++) {\r\n const child = directDescendants[index];\r\n\r\n if ((child).clone) {\r\n (child).clone(name + \".\" + child.name, this);\r\n }\r\n }\r\n }\r\n\r\n // Morphs\r\n if (source.morphTargetManager) {\r\n this.morphTargetManager = source.morphTargetManager;\r\n }\r\n\r\n // Physics clone\r\n if (scene.getPhysicsEngine) {\r\n const physicsEngine = scene.getPhysicsEngine();\r\n if (clonePhysicsImpostor && physicsEngine) {\r\n if (physicsEngine.getPluginVersion() === 1) {\r\n const impostor = (physicsEngine as PhysicsEngineV1).getImpostorForPhysicsObject(source);\r\n if (impostor) {\r\n this.physicsImpostor = impostor.clone(this);\r\n }\r\n } else if (physicsEngine.getPluginVersion() === 2) {\r\n if (source.physicsBody) {\r\n source.physicsBody.clone(this);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Particles\r\n for (let index = 0; index < scene.particleSystems.length; index++) {\r\n const system = scene.particleSystems[index];\r\n\r\n if (system.emitter === source) {\r\n system.clone(system.name, this);\r\n }\r\n }\r\n\r\n // Skeleton\r\n this.skeleton = source.skeleton;\r\n\r\n this.refreshBoundingInfo(true, true);\r\n this.computeWorldMatrix(true);\r\n }\r\n\r\n // Parent\r\n if (parent !== null) {\r\n this.parent = parent;\r\n }\r\n\r\n this._instanceDataStorage.hardwareInstancedRendering = this.getEngine().getCaps().instancedArrays;\r\n\r\n this._internalMeshDataInfo._onMeshReadyObserverAdded = (observer: Observer) => {\r\n // only notify once! then unregister the observer\r\n observer.unregisterOnNextCall = true;\r\n if (this.isReady(true)) {\r\n this.onMeshReadyObservable.notifyObservers(this);\r\n } else {\r\n if (!this._internalMeshDataInfo._checkReadinessObserver) {\r\n this._internalMeshDataInfo._checkReadinessObserver = this._scene.onBeforeRenderObservable.add(() => {\r\n // check for complete readiness\r\n if (this.isReady(true)) {\r\n this._scene.onBeforeRenderObservable.remove(this._internalMeshDataInfo._checkReadinessObserver);\r\n this._internalMeshDataInfo._checkReadinessObserver = null;\r\n this.onMeshReadyObservable.notifyObservers(this);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n this.onMeshReadyObservable = new Observable(this._internalMeshDataInfo._onMeshReadyObserverAdded);\r\n\r\n if (source) {\r\n source.onClonedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n public instantiateHierarchy(\r\n newParent: Nullable = null,\r\n options?: { doNotInstantiate: boolean | ((node: TransformNode) => boolean) },\r\n onNewNodeCreated?: (source: TransformNode, clone: TransformNode) => void\r\n ): Nullable {\r\n const instance =\r\n this.getTotalVertices() === 0 || (options && options.doNotInstantiate && (options.doNotInstantiate === true || options.doNotInstantiate(this)))\r\n ? this.clone(\"Clone of \" + (this.name || this.id), newParent || this.parent, true)\r\n : this.createInstance(\"instance of \" + (this.name || this.id));\r\n\r\n instance.parent = newParent || this.parent;\r\n instance.position = this.position.clone();\r\n instance.scaling = this.scaling.clone();\r\n if (this.rotationQuaternion) {\r\n instance.rotationQuaternion = this.rotationQuaternion.clone();\r\n } else {\r\n instance.rotation = this.rotation.clone();\r\n }\r\n\r\n if (onNewNodeCreated) {\r\n onNewNodeCreated(this, instance);\r\n }\r\n\r\n for (const child of this.getChildTransformNodes(true)) {\r\n // instancedMesh should have a different sourced mesh\r\n if (child.getClassName() === \"InstancedMesh\" && instance.getClassName() === \"Mesh\" && (child as InstancedMesh).sourceMesh === this) {\r\n (child as InstancedMesh).instantiateHierarchy(\r\n instance,\r\n {\r\n doNotInstantiate: (options && options.doNotInstantiate) || false,\r\n newSourcedMesh: instance as Mesh,\r\n },\r\n onNewNodeCreated\r\n );\r\n } else {\r\n child.instantiateHierarchy(instance, options, onNewNodeCreated);\r\n }\r\n }\r\n\r\n return instance;\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns the string \"Mesh\".\r\n */\r\n public getClassName(): string {\r\n return \"Mesh\";\r\n }\r\n\r\n /** @internal */\r\n public get _isMesh() {\r\n return true;\r\n }\r\n\r\n /**\r\n * Returns a description of this mesh\r\n * @param fullDetails define if full details about this mesh must be used\r\n * @returns a descriptive string representing this mesh\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = super.toString(fullDetails);\r\n ret += \", n vertices: \" + this.getTotalVertices();\r\n ret += \", parent: \" + (this._waitingParentId ? this._waitingParentId : this.parent ? this.parent.name : \"NONE\");\r\n\r\n if (this.animations) {\r\n for (let i = 0; i < this.animations.length; i++) {\r\n ret += \", animation[0]: \" + this.animations[i].toString(fullDetails);\r\n }\r\n }\r\n\r\n if (fullDetails) {\r\n if (this._geometry) {\r\n const ib = this.getIndices();\r\n const vb = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (vb && ib) {\r\n ret += \", flat shading: \" + (vb.length / 3 === ib.length ? \"YES\" : \"NO\");\r\n }\r\n } else {\r\n ret += \", flat shading: UNKNOWN\";\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /** @internal */\r\n public _unBindEffect() {\r\n super._unBindEffect();\r\n\r\n for (const instance of this.instances) {\r\n instance._unBindEffect();\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh has LOD\r\n */\r\n public get hasLODLevels(): boolean {\r\n return this._internalMeshDataInfo._LODLevels.length > 0;\r\n }\r\n\r\n /**\r\n * Gets the list of MeshLODLevel associated with the current mesh\r\n * @returns an array of MeshLODLevel\r\n */\r\n public getLODLevels(): MeshLODLevel[] {\r\n return this._internalMeshDataInfo._LODLevels;\r\n }\r\n\r\n private _sortLODLevels(): void {\r\n const sortingOrderFactor = this._internalMeshDataInfo._useLODScreenCoverage ? -1 : 1;\r\n this._internalMeshDataInfo._LODLevels.sort((a, b) => {\r\n if (a.distanceOrScreenCoverage < b.distanceOrScreenCoverage) {\r\n return sortingOrderFactor;\r\n }\r\n if (a.distanceOrScreenCoverage > b.distanceOrScreenCoverage) {\r\n return -sortingOrderFactor;\r\n }\r\n\r\n return 0;\r\n });\r\n }\r\n\r\n /**\r\n * Add a mesh as LOD level triggered at the given distance.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\r\n * @param distanceOrScreenCoverage Either distance from the center of the object to show this level or the screen coverage if `useScreenCoverage` is set to `true`.\r\n * If screen coverage, value is a fraction of the screen's total surface, between 0 and 1.\r\n * Example Playground for distance https://playground.babylonjs.com/#QE7KM#197\r\n * Example Playground for screen coverage https://playground.babylonjs.com/#QE7KM#196\r\n * @param mesh The mesh to be added as LOD level (can be null)\r\n * @returns This mesh (for chaining)\r\n */\r\n public addLODLevel(distanceOrScreenCoverage: number, mesh: Nullable): Mesh {\r\n if (mesh && mesh._masterMesh) {\r\n Logger.Warn(\"You cannot use a mesh as LOD level twice\");\r\n return this;\r\n }\r\n\r\n const level = new MeshLODLevel(distanceOrScreenCoverage, mesh);\r\n this._internalMeshDataInfo._LODLevels.push(level);\r\n\r\n if (mesh) {\r\n mesh._masterMesh = this;\r\n }\r\n\r\n this._sortLODLevels();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the LOD level mesh at the passed distance or null if not found.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\r\n * @param distance The distance from the center of the object to show this level\r\n * @returns a Mesh or `null`\r\n */\r\n public getLODLevelAtDistance(distance: number): Nullable {\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n for (let index = 0; index < internalDataInfo._LODLevels.length; index++) {\r\n const level = internalDataInfo._LODLevels[index];\r\n\r\n if (level.distanceOrScreenCoverage === distance) {\r\n return level.mesh;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Remove a mesh from the LOD array\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\r\n * @param mesh defines the mesh to be removed\r\n * @returns This mesh (for chaining)\r\n */\r\n public removeLODLevel(mesh: Nullable): Mesh {\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n for (let index = 0; index < internalDataInfo._LODLevels.length; index++) {\r\n if (internalDataInfo._LODLevels[index].mesh === mesh) {\r\n internalDataInfo._LODLevels.splice(index, 1);\r\n if (mesh) {\r\n mesh._masterMesh = null;\r\n }\r\n }\r\n }\r\n\r\n this._sortLODLevels();\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the registered LOD mesh distant from the parameter `camera` position if any, else returns the current mesh.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\r\n * @param camera defines the camera to use to compute distance\r\n * @param boundingSphere defines a custom bounding sphere to use instead of the one from this mesh\r\n * @returns This mesh (for chaining)\r\n */\r\n public getLOD(camera: Camera, boundingSphere?: BoundingSphere): Nullable {\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n if (!internalDataInfo._LODLevels || internalDataInfo._LODLevels.length === 0) {\r\n return this;\r\n }\r\n\r\n const bSphere = boundingSphere || this.getBoundingInfo().boundingSphere;\r\n\r\n const distanceToCamera = camera.mode === Camera.ORTHOGRAPHIC_CAMERA ? camera.minZ : bSphere.centerWorld.subtract(camera.globalPosition).length();\r\n let compareValue = distanceToCamera;\r\n let compareSign = 1;\r\n\r\n if (internalDataInfo._useLODScreenCoverage) {\r\n const screenArea = camera.screenArea;\r\n let meshArea = (bSphere.radiusWorld * camera.minZ) / distanceToCamera;\r\n meshArea = meshArea * meshArea * Math.PI;\r\n compareValue = meshArea / screenArea;\r\n compareSign = -1;\r\n }\r\n\r\n if (compareSign * internalDataInfo._LODLevels[internalDataInfo._LODLevels.length - 1].distanceOrScreenCoverage > compareSign * compareValue) {\r\n if (this.onLODLevelSelection) {\r\n this.onLODLevelSelection(compareValue, this, this);\r\n }\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < internalDataInfo._LODLevels.length; index++) {\r\n const level = internalDataInfo._LODLevels[index];\r\n\r\n if (compareSign * level.distanceOrScreenCoverage < compareSign * compareValue) {\r\n if (level.mesh) {\r\n if (level.mesh.delayLoadState === Constants.DELAYLOADSTATE_NOTLOADED) {\r\n level.mesh._checkDelayState();\r\n return this;\r\n }\r\n\r\n if (level.mesh.delayLoadState === Constants.DELAYLOADSTATE_LOADING) {\r\n return this;\r\n }\r\n\r\n level.mesh._preActivate();\r\n level.mesh._updateSubMeshesBoundingInfo(this.worldMatrixFromCache);\r\n }\r\n\r\n if (this.onLODLevelSelection) {\r\n this.onLODLevelSelection(compareValue, this, level.mesh);\r\n }\r\n\r\n return level.mesh;\r\n }\r\n }\r\n\r\n if (this.onLODLevelSelection) {\r\n this.onLODLevelSelection(compareValue, this, this);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the mesh internal Geometry object\r\n */\r\n public get geometry(): Nullable {\r\n return this._geometry;\r\n }\r\n\r\n /**\r\n * Returns the total number of vertices within the mesh geometry or zero if the mesh has no geometry.\r\n * @returns the total number of vertices\r\n */\r\n public getTotalVertices(): number {\r\n if (this._geometry === null || this._geometry === undefined) {\r\n return 0;\r\n }\r\n return this._geometry.getTotalVertices();\r\n }\r\n\r\n /**\r\n * Returns the content of an associated vertex buffer\r\n * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param copyWhenShared defines a boolean indicating that if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one\r\n * @param forceCopy defines a boolean forcing the copy of the buffer no matter what the value of copyWhenShared is\r\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\r\n * @returns a FloatArray or null if the mesh has no geometry or no vertex buffer for this kind.\r\n */\r\n public getVerticesData(kind: string, copyWhenShared?: boolean, forceCopy?: boolean, bypassInstanceData?: boolean): Nullable {\r\n if (!this._geometry) {\r\n return null;\r\n }\r\n let data = bypassInstanceData\r\n ? undefined\r\n : this._userInstancedBuffersStorage?.vertexBuffers[kind]?.getFloatData(\r\n this.instances.length + 1, // +1 because the master mesh is not included in the instances array\r\n forceCopy || (copyWhenShared && this._geometry.meshes.length !== 1)\r\n );\r\n if (!data) {\r\n data = this._geometry.getVerticesData(kind, copyWhenShared, forceCopy);\r\n }\r\n return data;\r\n }\r\n\r\n /**\r\n * Returns the mesh VertexBuffer object from the requested `kind`\r\n * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.NormalKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\r\n * @returns a FloatArray or null if the mesh has no vertex buffer for this kind.\r\n */\r\n public getVertexBuffer(kind: string, bypassInstanceData?: boolean): Nullable {\r\n if (!this._geometry) {\r\n return null;\r\n }\r\n\r\n return (bypassInstanceData ? undefined : this._userInstancedBuffersStorage?.vertexBuffers[kind]) ?? this._geometry.getVertexBuffer(kind);\r\n }\r\n\r\n /**\r\n * Tests if a specific vertex buffer is associated with this mesh\r\n * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.NormalKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\r\n * @returns a boolean\r\n */\r\n public isVerticesDataPresent(kind: string, bypassInstanceData?: boolean): boolean {\r\n if (!this._geometry) {\r\n if (this._delayInfo) {\r\n return this._delayInfo.indexOf(kind) !== -1;\r\n }\r\n return false;\r\n }\r\n return (!bypassInstanceData && this._userInstancedBuffersStorage?.vertexBuffers[kind] !== undefined) || this._geometry.isVerticesDataPresent(kind);\r\n }\r\n\r\n /**\r\n * Returns a boolean defining if the vertex data for the requested `kind` is updatable.\r\n * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\r\n * @returns a boolean\r\n */\r\n public isVertexBufferUpdatable(kind: string, bypassInstanceData?: boolean): boolean {\r\n if (!this._geometry) {\r\n if (this._delayInfo) {\r\n return this._delayInfo.indexOf(kind) !== -1;\r\n }\r\n return false;\r\n }\r\n if (!bypassInstanceData) {\r\n const buffer = this._userInstancedBuffersStorage?.vertexBuffers[kind];\r\n if (buffer) {\r\n return buffer.isUpdatable();\r\n }\r\n }\r\n return this._geometry.isVertexBufferUpdatable(kind);\r\n }\r\n\r\n /**\r\n * Returns a string which contains the list of existing `kinds` of Vertex Data associated with this mesh.\r\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\r\n * @returns an array of strings\r\n */\r\n public getVerticesDataKinds(bypassInstanceData?: boolean): string[] {\r\n if (!this._geometry) {\r\n const result: string[] = [];\r\n if (this._delayInfo) {\r\n this._delayInfo.forEach(function (kind) {\r\n result.push(kind);\r\n });\r\n }\r\n return result;\r\n }\r\n const kinds = this._geometry.getVerticesDataKinds();\r\n if (!bypassInstanceData && this._userInstancedBuffersStorage) {\r\n for (const kind in this._userInstancedBuffersStorage.vertexBuffers) {\r\n if (kinds.indexOf(kind) === -1) {\r\n kinds.push(kind);\r\n }\r\n }\r\n }\r\n return kinds;\r\n }\r\n\r\n /**\r\n * Returns a positive integer : the total number of indices in this mesh geometry.\r\n * @returns the numner of indices or zero if the mesh has no geometry.\r\n */\r\n public getTotalIndices(): number {\r\n if (!this._geometry) {\r\n return 0;\r\n }\r\n return this._geometry.getTotalIndices();\r\n }\r\n\r\n /**\r\n * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices.\r\n * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one.\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns the indices array or an empty array if the mesh has no geometry\r\n */\r\n public getIndices(copyWhenShared?: boolean, forceCopy?: boolean): Nullable {\r\n if (!this._geometry) {\r\n return [];\r\n }\r\n return this._geometry.getIndices(copyWhenShared, forceCopy);\r\n }\r\n\r\n public get isBlocked(): boolean {\r\n return this._masterMesh !== null && this._masterMesh !== undefined;\r\n }\r\n\r\n /**\r\n * Determine if the current mesh is ready to be rendered\r\n * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\r\n * @param forceInstanceSupport will check if the mesh will be ready when used with instances (false by default)\r\n * @returns true if all associated assets are ready (material, textures, shaders)\r\n */\r\n public isReady(completeCheck = false, forceInstanceSupport = false): boolean {\r\n if (this.delayLoadState === Constants.DELAYLOADSTATE_LOADING) {\r\n return false;\r\n }\r\n\r\n if (!super.isReady(completeCheck)) {\r\n return false;\r\n }\r\n\r\n if (!this.subMeshes || this.subMeshes.length === 0) {\r\n return true;\r\n }\r\n\r\n if (!completeCheck) {\r\n return true;\r\n }\r\n\r\n const engine = this.getEngine();\r\n const scene = this.getScene();\r\n const hardwareInstancedRendering = forceInstanceSupport || (engine.getCaps().instancedArrays && (this.instances.length > 0 || this.hasThinInstances));\r\n\r\n this.computeWorldMatrix();\r\n\r\n const mat = this.material || scene.defaultMaterial;\r\n if (mat) {\r\n if (mat._storeEffectOnSubMeshes) {\r\n for (const subMesh of this.subMeshes) {\r\n const effectiveMaterial = subMesh.getMaterial();\r\n if (effectiveMaterial) {\r\n if (effectiveMaterial._storeEffectOnSubMeshes) {\r\n if (!effectiveMaterial.isReadyForSubMesh(this, subMesh, hardwareInstancedRendering)) {\r\n return false;\r\n }\r\n } else {\r\n if (!effectiveMaterial.isReady(this, hardwareInstancedRendering)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n if (!mat.isReady(this, hardwareInstancedRendering)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n // Shadows\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n for (const light of this.lightSources) {\r\n const generators = light.getShadowGenerators();\r\n\r\n if (!generators) {\r\n continue;\r\n }\r\n\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n if (generator && (!generator.getShadowMap()?.renderList || (generator.getShadowMap()?.renderList && generator.getShadowMap()?.renderList?.indexOf(this) !== -1))) {\r\n const shadowMap = generator.getShadowMap()!;\r\n const renderPassIds = shadowMap.renderPassIds ?? [engine.currentRenderPassId];\r\n for (let p = 0; p < renderPassIds.length; ++p) {\r\n engine.currentRenderPassId = renderPassIds[p];\r\n for (const subMesh of this.subMeshes) {\r\n if (!generator.isReady(subMesh, hardwareInstancedRendering, subMesh.getMaterial()?.needAlphaBlendingForMesh(this) ?? false)) {\r\n engine.currentRenderPassId = currentRenderPassId;\r\n return false;\r\n }\r\n }\r\n }\r\n engine.currentRenderPassId = currentRenderPassId;\r\n }\r\n }\r\n }\r\n\r\n // LOD\r\n for (const lod of this._internalMeshDataInfo._LODLevels) {\r\n if (lod.mesh && !lod.mesh.isReady(hardwareInstancedRendering)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the normals aren't to be recomputed on next mesh `positions` array update. This property is pertinent only for updatable parametric shapes.\r\n */\r\n public get areNormalsFrozen(): boolean {\r\n return this._internalMeshDataInfo._areNormalsFrozen;\r\n }\r\n\r\n /**\r\n * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It prevents the mesh normals from being recomputed on next `positions` array update.\r\n * @returns the current mesh\r\n */\r\n public freezeNormals(): Mesh {\r\n this._internalMeshDataInfo._areNormalsFrozen = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It reactivates the mesh normals computation if it was previously frozen\r\n * @returns the current mesh\r\n */\r\n public unfreezeNormals(): Mesh {\r\n this._internalMeshDataInfo._areNormalsFrozen = false;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a value overriding the instance count. Only applicable when custom instanced InterleavedVertexBuffer are used rather than InstancedMeshs\r\n */\r\n public set overridenInstanceCount(count: number) {\r\n this._instanceDataStorage.overridenInstanceCount = count;\r\n }\r\n\r\n // Methods\r\n /** @internal */\r\n public _preActivate(): Mesh {\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n const sceneRenderId = this.getScene().getRenderId();\r\n if (internalDataInfo._preActivateId === sceneRenderId) {\r\n return this;\r\n }\r\n\r\n internalDataInfo._preActivateId = sceneRenderId;\r\n this._instanceDataStorage.visibleInstances = null;\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _preActivateForIntermediateRendering(renderId: number): Mesh {\r\n if (this._instanceDataStorage.visibleInstances) {\r\n this._instanceDataStorage.visibleInstances.intermediateDefaultRenderId = renderId;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _registerInstanceForRenderId(instance: InstancedMesh, renderId: number): Mesh {\r\n if (!this._instanceDataStorage.visibleInstances) {\r\n this._instanceDataStorage.visibleInstances = {\r\n defaultRenderId: renderId,\r\n selfDefaultRenderId: this._renderId,\r\n };\r\n }\r\n\r\n if (!this._instanceDataStorage.visibleInstances[renderId]) {\r\n if (this._instanceDataStorage.previousRenderId !== undefined && this._instanceDataStorage.isFrozen) {\r\n this._instanceDataStorage.visibleInstances[this._instanceDataStorage.previousRenderId] = null;\r\n }\r\n this._instanceDataStorage.previousRenderId = renderId;\r\n this._instanceDataStorage.visibleInstances[renderId] = new Array();\r\n }\r\n\r\n this._instanceDataStorage.visibleInstances[renderId].push(instance);\r\n return this;\r\n }\r\n\r\n protected _afterComputeWorldMatrix(): void {\r\n super._afterComputeWorldMatrix();\r\n\r\n if (!this.hasThinInstances) {\r\n return;\r\n }\r\n\r\n if (!this.doNotSyncBoundingInfo) {\r\n this.thinInstanceRefreshBoundingInfo(false);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _postActivate(): void {\r\n if (this.edgesShareWithInstances && this.edgesRenderer && this.edgesRenderer.isEnabled && this._renderingGroup) {\r\n this._renderingGroup._edgesRenderers.pushNoDuplicate(this.edgesRenderer);\r\n this.edgesRenderer.customInstances.push(this.getWorldMatrix());\r\n }\r\n }\r\n\r\n /**\r\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\r\n * This means the mesh underlying bounding box and sphere are recomputed.\r\n * @param applySkeleton defines whether to apply the skeleton before computing the bounding info\r\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\r\n * @returns the current mesh\r\n */\r\n public refreshBoundingInfo(applySkeleton: boolean = false, applyMorph: boolean = false): Mesh {\r\n if (this.hasBoundingInfo && this.getBoundingInfo().isLocked) {\r\n return this;\r\n }\r\n\r\n const bias = this.geometry ? this.geometry.boundingBias : null;\r\n this._refreshBoundingInfo(this._getPositionData(applySkeleton, applyMorph), bias);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _createGlobalSubMesh(force: boolean): Nullable {\r\n const totalVertices = this.getTotalVertices();\r\n if (!totalVertices || !this.getIndices()) {\r\n return null;\r\n }\r\n\r\n // Check if we need to recreate the submeshes\r\n if (this.subMeshes && this.subMeshes.length > 0) {\r\n const ib = this.getIndices();\r\n\r\n if (!ib) {\r\n return null;\r\n }\r\n\r\n const totalIndices = ib.length;\r\n let needToRecreate = false;\r\n\r\n if (force) {\r\n needToRecreate = true;\r\n } else {\r\n for (const submesh of this.subMeshes) {\r\n if (submesh.indexStart + submesh.indexCount > totalIndices) {\r\n needToRecreate = true;\r\n break;\r\n }\r\n\r\n if (submesh.verticesStart + submesh.verticesCount > totalVertices) {\r\n needToRecreate = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!needToRecreate) {\r\n return this.subMeshes[0];\r\n }\r\n }\r\n\r\n this.releaseSubMeshes();\r\n return new SubMesh(0, 0, totalVertices, 0, this.getTotalIndices(), this);\r\n }\r\n\r\n /**\r\n * This function will subdivide the mesh into multiple submeshes\r\n * @param count defines the expected number of submeshes\r\n */\r\n public subdivide(count: number): void {\r\n if (count < 1) {\r\n return;\r\n }\r\n\r\n const totalIndices = this.getTotalIndices();\r\n let subdivisionSize = (totalIndices / count) | 0;\r\n let offset = 0;\r\n\r\n // Ensure that subdivisionSize is a multiple of 3\r\n while (subdivisionSize % 3 !== 0) {\r\n subdivisionSize++;\r\n }\r\n\r\n this.releaseSubMeshes();\r\n for (let index = 0; index < count; index++) {\r\n if (offset >= totalIndices) {\r\n break;\r\n }\r\n\r\n SubMesh.CreateFromIndices(0, offset, index === count - 1 ? totalIndices - offset : subdivisionSize, this, undefined, false);\r\n\r\n offset += subdivisionSize;\r\n }\r\n\r\n this.refreshBoundingInfo();\r\n this.synchronizeInstances();\r\n }\r\n\r\n /**\r\n * Copy a FloatArray into a specific associated vertex buffer\r\n * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updatable defines if the updated vertex buffer must be flagged as updatable\r\n * @param stride defines the data stride size (can be null)\r\n * @returns the current mesh\r\n */\r\n public setVerticesData(kind: string, data: FloatArray, updatable: boolean = false, stride?: number): AbstractMesh {\r\n if (!this._geometry) {\r\n const vertexData = new VertexData();\r\n vertexData.set(data, kind);\r\n\r\n const scene = this.getScene();\r\n\r\n new Geometry(Geometry.RandomId(), scene, vertexData, updatable, this);\r\n } else {\r\n this._geometry.setVerticesData(kind, data, updatable, stride);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Delete a vertex buffer associated with this mesh\r\n * @param kind defines which buffer to delete (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n */\r\n public removeVerticesData(kind: string) {\r\n if (!this._geometry) {\r\n return;\r\n }\r\n\r\n this._geometry.removeVerticesData(kind);\r\n }\r\n\r\n /**\r\n * Flags an associated vertex buffer as updatable\r\n * @param kind defines which buffer to use (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param updatable defines if the updated vertex buffer must be flagged as updatable\r\n */\r\n public markVerticesDataAsUpdatable(kind: string, updatable = true) {\r\n const vb = this.getVertexBuffer(kind);\r\n\r\n if (!vb || vb.isUpdatable() === updatable) {\r\n return;\r\n }\r\n\r\n this.setVerticesData(kind, this.getVerticesData(kind), updatable);\r\n }\r\n\r\n /**\r\n * Sets the mesh global Vertex Buffer\r\n * @param buffer defines the buffer to use\r\n * @param disposeExistingBuffer disposes the existing buffer, if any (default: true)\r\n * @returns the current mesh\r\n */\r\n public setVerticesBuffer(buffer: VertexBuffer, disposeExistingBuffer = true): Mesh {\r\n if (!this._geometry) {\r\n this._geometry = Geometry.CreateGeometryForMesh(this);\r\n }\r\n\r\n this._geometry.setVerticesBuffer(buffer, null, disposeExistingBuffer);\r\n return this;\r\n }\r\n\r\n /**\r\n * Update a specific associated vertex buffer\r\n * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for \"position\" kind\r\n * @param makeItUnique defines if the geometry associated with the mesh must be cloned to make the change only for this mesh (and not all meshes associated with the same geometry)\r\n * @returns the current mesh\r\n */\r\n public updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): AbstractMesh {\r\n if (!this._geometry) {\r\n return this;\r\n }\r\n if (!makeItUnique) {\r\n this._geometry.updateVerticesData(kind, data, updateExtends);\r\n } else {\r\n this.makeGeometryUnique();\r\n this.updateVerticesData(kind, data, updateExtends, false);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * This method updates the vertex positions of an updatable mesh according to the `positionFunction` returned values.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#other-shapes-updatemeshpositions\r\n * @param positionFunction is a simple JS function what is passed the mesh `positions` array. It doesn't need to return anything\r\n * @param computeNormals is a boolean (default true) to enable/disable the mesh normal recomputation after the vertex position update\r\n * @returns the current mesh\r\n */\r\n public updateMeshPositions(positionFunction: (data: FloatArray) => void, computeNormals: boolean = true): Mesh {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n if (!positions) {\r\n return this;\r\n }\r\n\r\n positionFunction(positions);\r\n this.updateVerticesData(VertexBuffer.PositionKind, positions, false, false);\r\n\r\n if (computeNormals) {\r\n const indices = this.getIndices();\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n\r\n if (!normals) {\r\n return this;\r\n }\r\n\r\n VertexData.ComputeNormals(positions, indices, normals);\r\n this.updateVerticesData(VertexBuffer.NormalKind, normals, false, false);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates a un-shared specific occurence of the geometry for the mesh.\r\n * @returns the current mesh\r\n */\r\n public makeGeometryUnique(): Mesh {\r\n if (!this._geometry) {\r\n return this;\r\n }\r\n\r\n if (this._geometry.meshes.length === 1) {\r\n return this;\r\n }\r\n\r\n const oldGeometry = this._geometry;\r\n const geometry = this._geometry.copy(Geometry.RandomId());\r\n oldGeometry.releaseForMesh(this, true);\r\n geometry.applyToMesh(this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the index buffer of this mesh.\r\n * @param indexBuffer Defines the index buffer to use for this mesh\r\n * @param totalVertices Defines the total number of vertices used by the buffer\r\n * @param totalIndices Defines the total number of indices in the index buffer\r\n */\r\n public setIndexBuffer(indexBuffer: DataBuffer, totalVertices: number, totalIndices: number): void {\r\n let geometry = this._geometry;\r\n if (!geometry) {\r\n geometry = new Geometry(Geometry.RandomId(), this.getScene(), undefined, undefined, this);\r\n }\r\n geometry.setIndexBuffer(indexBuffer, totalVertices, totalIndices);\r\n }\r\n\r\n /**\r\n * Set the index buffer of this mesh\r\n * @param indices defines the source data\r\n * @param totalVertices defines the total number of vertices referenced by this index data (can be null)\r\n * @param updatable defines if the updated index buffer must be flagged as updatable (default is false)\r\n * @returns the current mesh\r\n */\r\n public setIndices(indices: IndicesArray, totalVertices: Nullable = null, updatable: boolean = false): AbstractMesh {\r\n if (!this._geometry) {\r\n const vertexData = new VertexData();\r\n vertexData.indices = indices;\r\n\r\n const scene = this.getScene();\r\n\r\n new Geometry(Geometry.RandomId(), scene, vertexData, updatable, this);\r\n } else {\r\n this._geometry.setIndices(indices, totalVertices, updatable);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Update the current index buffer\r\n * @param indices defines the source data\r\n * @param offset defines the offset in the index buffer where to store the new data (can be null)\r\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\r\n * @returns the current mesh\r\n */\r\n public updateIndices(indices: IndicesArray, offset?: number, gpuMemoryOnly = false): AbstractMesh {\r\n if (!this._geometry) {\r\n return this;\r\n }\r\n\r\n this._geometry.updateIndices(indices, offset, gpuMemoryOnly);\r\n return this;\r\n }\r\n\r\n /**\r\n * Invert the geometry to move from a right handed system to a left handed one.\r\n * @returns the current mesh\r\n */\r\n public toLeftHanded(): Mesh {\r\n if (!this._geometry) {\r\n return this;\r\n }\r\n this._geometry.toLeftHanded();\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bind(subMesh: SubMesh, effect: Effect, fillMode: number, allowInstancedRendering = true): Mesh {\r\n if (!this._geometry) {\r\n return this;\r\n }\r\n\r\n const engine = this.getScene().getEngine();\r\n\r\n // Morph targets\r\n if (this.morphTargetManager && this.morphTargetManager.isUsingTextureForTargets) {\r\n this.morphTargetManager._bind(effect);\r\n }\r\n\r\n // Wireframe\r\n let indexToBind;\r\n if (this._unIndexed) {\r\n indexToBind = null;\r\n } else {\r\n switch (this._getRenderingFillMode(fillMode)) {\r\n case Material.PointFillMode:\r\n indexToBind = null;\r\n break;\r\n case Material.WireFrameFillMode:\r\n indexToBind = subMesh._getLinesIndexBuffer(this.getIndices(), engine);\r\n break;\r\n default:\r\n case Material.TriangleFillMode:\r\n indexToBind = this._geometry.getIndexBuffer();\r\n break;\r\n }\r\n }\r\n\r\n // VBOs\r\n if (!allowInstancedRendering || !this._userInstancedBuffersStorage || this.hasThinInstances) {\r\n this._geometry._bind(effect, indexToBind);\r\n } else {\r\n this._geometry._bind(effect, indexToBind, this._userInstancedBuffersStorage.vertexBuffers, this._userInstancedBuffersStorage.vertexArrayObjects);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _draw(subMesh: SubMesh, fillMode: number, instancesCount?: number): Mesh {\r\n if (!this._geometry || !this._geometry.getVertexBuffers() || (!this._unIndexed && !this._geometry.getIndexBuffer())) {\r\n return this;\r\n }\r\n\r\n if (this._internalMeshDataInfo._onBeforeDrawObservable) {\r\n this._internalMeshDataInfo._onBeforeDrawObservable.notifyObservers(this);\r\n }\r\n\r\n const scene = this.getScene();\r\n const engine = scene.getEngine();\r\n\r\n if (this._unIndexed || fillMode == Material.PointFillMode) {\r\n // or triangles as points\r\n engine.drawArraysType(fillMode, subMesh.verticesStart, subMesh.verticesCount, this.forcedInstanceCount || instancesCount);\r\n } else if (fillMode == Material.WireFrameFillMode) {\r\n // Triangles as wireframe\r\n engine.drawElementsType(fillMode, 0, subMesh._linesIndexCount, this.forcedInstanceCount || instancesCount);\r\n } else {\r\n engine.drawElementsType(fillMode, subMesh.indexStart, subMesh.indexCount, this.forcedInstanceCount || instancesCount);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Registers for this mesh a javascript function called just before the rendering process\r\n * @param func defines the function to call before rendering this mesh\r\n * @returns the current mesh\r\n */\r\n public registerBeforeRender(func: (mesh: AbstractMesh) => void): Mesh {\r\n this.onBeforeRenderObservable.add(func);\r\n return this;\r\n }\r\n\r\n /**\r\n * Disposes a previously registered javascript function called before the rendering\r\n * @param func defines the function to remove\r\n * @returns the current mesh\r\n */\r\n public unregisterBeforeRender(func: (mesh: AbstractMesh) => void): Mesh {\r\n this.onBeforeRenderObservable.removeCallback(func);\r\n return this;\r\n }\r\n\r\n /**\r\n * Registers for this mesh a javascript function called just after the rendering is complete\r\n * @param func defines the function to call after rendering this mesh\r\n * @returns the current mesh\r\n */\r\n public registerAfterRender(func: (mesh: AbstractMesh) => void): Mesh {\r\n this.onAfterRenderObservable.add(func);\r\n return this;\r\n }\r\n\r\n /**\r\n * Disposes a previously registered javascript function called after the rendering.\r\n * @param func defines the function to remove\r\n * @returns the current mesh\r\n */\r\n public unregisterAfterRender(func: (mesh: AbstractMesh) => void): Mesh {\r\n this.onAfterRenderObservable.removeCallback(func);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getInstancesRenderList(subMeshId: number, isReplacementMode: boolean = false): _InstancesBatch {\r\n if (this._instanceDataStorage.isFrozen) {\r\n if (isReplacementMode) {\r\n this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.hardwareInstancedRendering[subMeshId] = false;\r\n this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.renderSelf[subMeshId] = true;\r\n return this._instanceDataStorage.batchCacheReplacementModeInFrozenMode;\r\n }\r\n if (this._instanceDataStorage.previousBatch) {\r\n return this._instanceDataStorage.previousBatch;\r\n }\r\n }\r\n const scene = this.getScene();\r\n const isInIntermediateRendering = scene._isInIntermediateRendering();\r\n const onlyForInstances = isInIntermediateRendering\r\n ? this._internalAbstractMeshDataInfo._onlyForInstancesIntermediate\r\n : this._internalAbstractMeshDataInfo._onlyForInstances;\r\n const batchCache = this._instanceDataStorage.batchCache;\r\n batchCache.mustReturn = false;\r\n batchCache.renderSelf[subMeshId] = isReplacementMode || (!onlyForInstances && this.isEnabled() && this.isVisible);\r\n batchCache.visibleInstances[subMeshId] = null;\r\n\r\n if (this._instanceDataStorage.visibleInstances && !isReplacementMode) {\r\n const visibleInstances = this._instanceDataStorage.visibleInstances;\r\n const currentRenderId = scene.getRenderId();\r\n const defaultRenderId = isInIntermediateRendering ? visibleInstances.intermediateDefaultRenderId : visibleInstances.defaultRenderId;\r\n batchCache.visibleInstances[subMeshId] = visibleInstances[currentRenderId];\r\n\r\n if (!batchCache.visibleInstances[subMeshId] && defaultRenderId) {\r\n batchCache.visibleInstances[subMeshId] = visibleInstances[defaultRenderId];\r\n }\r\n }\r\n batchCache.hardwareInstancedRendering[subMeshId] =\r\n !isReplacementMode &&\r\n this._instanceDataStorage.hardwareInstancedRendering &&\r\n batchCache.visibleInstances[subMeshId] !== null &&\r\n batchCache.visibleInstances[subMeshId] !== undefined;\r\n this._instanceDataStorage.previousBatch = batchCache;\r\n\r\n return batchCache;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderWithInstances(subMesh: SubMesh, fillMode: number, batch: _InstancesBatch, effect: Effect, engine: Engine): Mesh {\r\n const visibleInstances = batch.visibleInstances[subMesh._id];\r\n const visibleInstanceCount = visibleInstances ? visibleInstances.length : 0;\r\n\r\n const instanceStorage = this._instanceDataStorage;\r\n const currentInstancesBufferSize = instanceStorage.instancesBufferSize;\r\n let instancesBuffer = instanceStorage.instancesBuffer;\r\n let instancesPreviousBuffer = instanceStorage.instancesPreviousBuffer;\r\n const matricesCount = visibleInstanceCount + 1;\r\n const bufferSize = matricesCount * 16 * 4;\r\n\r\n while (instanceStorage.instancesBufferSize < bufferSize) {\r\n instanceStorage.instancesBufferSize *= 2;\r\n }\r\n\r\n if (!instanceStorage.instancesData || currentInstancesBufferSize != instanceStorage.instancesBufferSize) {\r\n instanceStorage.instancesData = new Float32Array(instanceStorage.instancesBufferSize / 4);\r\n }\r\n if ((this._scene.needsPreviousWorldMatrices && !instanceStorage.instancesPreviousData) || currentInstancesBufferSize != instanceStorage.instancesBufferSize) {\r\n instanceStorage.instancesPreviousData = new Float32Array(instanceStorage.instancesBufferSize / 4);\r\n }\r\n\r\n let offset = 0;\r\n let instancesCount = 0;\r\n\r\n const renderSelf = batch.renderSelf[subMesh._id];\r\n\r\n const needUpdateBuffer =\r\n !instancesBuffer ||\r\n currentInstancesBufferSize !== instanceStorage.instancesBufferSize ||\r\n (this._scene.needsPreviousWorldMatrices && !instanceStorage.instancesPreviousBuffer);\r\n\r\n if (!this._instanceDataStorage.manualUpdate && (!instanceStorage.isFrozen || needUpdateBuffer)) {\r\n const world = this.getWorldMatrix();\r\n if (renderSelf) {\r\n if (this._scene.needsPreviousWorldMatrices) {\r\n if (!instanceStorage.masterMeshPreviousWorldMatrix) {\r\n instanceStorage.masterMeshPreviousWorldMatrix = world.clone();\r\n instanceStorage.masterMeshPreviousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset);\r\n } else {\r\n instanceStorage.masterMeshPreviousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset);\r\n instanceStorage.masterMeshPreviousWorldMatrix.copyFrom(world);\r\n }\r\n }\r\n world.copyToArray(instanceStorage.instancesData, offset);\r\n offset += 16;\r\n instancesCount++;\r\n }\r\n\r\n if (visibleInstances) {\r\n if (Mesh.INSTANCEDMESH_SORT_TRANSPARENT && this._scene.activeCamera && subMesh.getMaterial()?.needAlphaBlendingForMesh(subMesh.getRenderingMesh())) {\r\n const cameraPosition = this._scene.activeCamera.globalPosition;\r\n for (let instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) {\r\n const instanceMesh = visibleInstances[instanceIndex];\r\n instanceMesh._distanceToCamera = Vector3.Distance(instanceMesh.getBoundingInfo().boundingSphere.centerWorld, cameraPosition);\r\n }\r\n visibleInstances.sort((m1, m2) => {\r\n return m1._distanceToCamera > m2._distanceToCamera ? -1 : m1._distanceToCamera < m2._distanceToCamera ? 1 : 0;\r\n });\r\n }\r\n for (let instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) {\r\n const instance = visibleInstances[instanceIndex];\r\n const matrix = instance.getWorldMatrix();\r\n matrix.copyToArray(instanceStorage.instancesData, offset);\r\n\r\n if (this._scene.needsPreviousWorldMatrices) {\r\n if (!instance._previousWorldMatrix) {\r\n instance._previousWorldMatrix = matrix.clone();\r\n instance._previousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset);\r\n } else {\r\n instance._previousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset);\r\n instance._previousWorldMatrix.copyFrom(matrix);\r\n }\r\n }\r\n\r\n offset += 16;\r\n instancesCount++;\r\n }\r\n }\r\n } else {\r\n instancesCount = (renderSelf ? 1 : 0) + visibleInstanceCount;\r\n }\r\n\r\n if (needUpdateBuffer) {\r\n if (instancesBuffer) {\r\n instancesBuffer.dispose();\r\n }\r\n\r\n if (instancesPreviousBuffer) {\r\n instancesPreviousBuffer.dispose();\r\n }\r\n\r\n instancesBuffer = new Buffer(engine, instanceStorage.instancesData, true, 16, false, true);\r\n instanceStorage.instancesBuffer = instancesBuffer;\r\n if (!this._userInstancedBuffersStorage) {\r\n this._userInstancedBuffersStorage = {\r\n data: {},\r\n vertexBuffers: {},\r\n strides: {},\r\n sizes: {},\r\n vertexArrayObjects: this.getEngine().getCaps().vertexArrayObject ? {} : undefined,\r\n };\r\n }\r\n\r\n this._userInstancedBuffersStorage.vertexBuffers[\"world0\"] = instancesBuffer.createVertexBuffer(\"world0\", 0, 4);\r\n this._userInstancedBuffersStorage.vertexBuffers[\"world1\"] = instancesBuffer.createVertexBuffer(\"world1\", 4, 4);\r\n this._userInstancedBuffersStorage.vertexBuffers[\"world2\"] = instancesBuffer.createVertexBuffer(\"world2\", 8, 4);\r\n this._userInstancedBuffersStorage.vertexBuffers[\"world3\"] = instancesBuffer.createVertexBuffer(\"world3\", 12, 4);\r\n\r\n if (this._scene.needsPreviousWorldMatrices) {\r\n instancesPreviousBuffer = new Buffer(engine, instanceStorage.instancesPreviousData, true, 16, false, true);\r\n instanceStorage.instancesPreviousBuffer = instancesPreviousBuffer;\r\n\r\n this._userInstancedBuffersStorage.vertexBuffers[\"previousWorld0\"] = instancesPreviousBuffer.createVertexBuffer(\"previousWorld0\", 0, 4);\r\n this._userInstancedBuffersStorage.vertexBuffers[\"previousWorld1\"] = instancesPreviousBuffer.createVertexBuffer(\"previousWorld1\", 4, 4);\r\n this._userInstancedBuffersStorage.vertexBuffers[\"previousWorld2\"] = instancesPreviousBuffer.createVertexBuffer(\"previousWorld2\", 8, 4);\r\n this._userInstancedBuffersStorage.vertexBuffers[\"previousWorld3\"] = instancesPreviousBuffer.createVertexBuffer(\"previousWorld3\", 12, 4);\r\n }\r\n this._invalidateInstanceVertexArrayObject();\r\n } else {\r\n if (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) {\r\n instancesBuffer!.updateDirectly(instanceStorage.instancesData, 0, instancesCount);\r\n if (this._scene.needsPreviousWorldMatrices && (!this._instanceDataStorage.manualUpdate || this._instanceDataStorage.previousManualUpdate)) {\r\n instancesPreviousBuffer!.updateDirectly(instanceStorage.instancesPreviousData, 0, instancesCount);\r\n }\r\n }\r\n }\r\n\r\n this._processInstancedBuffers(visibleInstances, renderSelf);\r\n\r\n // Stats\r\n this.getScene()._activeIndices.addCount(subMesh.indexCount * instancesCount, false);\r\n\r\n // Draw\r\n if (engine._currentDrawContext) {\r\n engine._currentDrawContext.useInstancing = true;\r\n }\r\n this._bind(subMesh, effect, fillMode);\r\n this._draw(subMesh, fillMode, instancesCount);\r\n\r\n // Write current matrices as previous matrices in case of manual update\r\n // Default behaviour when previous matrices are not specified explicitly\r\n // Will break if instances number/order changes\r\n if (\r\n this._scene.needsPreviousWorldMatrices &&\r\n !needUpdateBuffer &&\r\n this._instanceDataStorage.manualUpdate &&\r\n (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) &&\r\n !this._instanceDataStorage.previousManualUpdate\r\n ) {\r\n instancesPreviousBuffer!.updateDirectly(instanceStorage.instancesData, 0, instancesCount);\r\n }\r\n\r\n engine.unbindInstanceAttributes();\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderWithThinInstances(subMesh: SubMesh, fillMode: number, effect: Effect, engine: Engine) {\r\n // Stats\r\n const instancesCount = this._thinInstanceDataStorage?.instancesCount ?? 0;\r\n\r\n this.getScene()._activeIndices.addCount(subMesh.indexCount * instancesCount, false);\r\n\r\n // Draw\r\n if (engine._currentDrawContext) {\r\n engine._currentDrawContext.useInstancing = true;\r\n }\r\n this._bind(subMesh, effect, fillMode);\r\n this._draw(subMesh, fillMode, instancesCount);\r\n\r\n // Write current matrices as previous matrices\r\n // Default behaviour when previous matrices are not specified explicitly\r\n // Will break if instances number/order changes\r\n if (this._scene.needsPreviousWorldMatrices && !this._thinInstanceDataStorage.previousMatrixData && this._thinInstanceDataStorage.matrixData) {\r\n if (!this._thinInstanceDataStorage.previousMatrixBuffer) {\r\n this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", this._thinInstanceDataStorage.matrixData, false);\r\n } else {\r\n this._thinInstanceDataStorage.previousMatrixBuffer!.updateDirectly(this._thinInstanceDataStorage.matrixData, 0, instancesCount);\r\n }\r\n }\r\n\r\n engine.unbindInstanceAttributes();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _processInstancedBuffers(visibleInstances: Nullable, renderSelf: boolean) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processRendering(\r\n renderingMesh: AbstractMesh,\r\n subMesh: SubMesh,\r\n effect: Effect,\r\n fillMode: number,\r\n batch: _InstancesBatch,\r\n hardwareInstancedRendering: boolean,\r\n onBeforeDraw: (isInstance: boolean, world: Matrix, effectiveMaterial?: Material) => void,\r\n effectiveMaterial?: Material\r\n ): Mesh {\r\n const scene = this.getScene();\r\n const engine = scene.getEngine();\r\n fillMode = this._getRenderingFillMode(fillMode);\r\n\r\n if (hardwareInstancedRendering && subMesh.getRenderingMesh().hasThinInstances) {\r\n this._renderWithThinInstances(subMesh, fillMode, effect, engine);\r\n return this;\r\n }\r\n\r\n if (hardwareInstancedRendering) {\r\n this._renderWithInstances(subMesh, fillMode, batch, effect, engine);\r\n } else {\r\n if (engine._currentDrawContext) {\r\n engine._currentDrawContext.useInstancing = false;\r\n }\r\n\r\n let instanceCount = 0;\r\n if (batch.renderSelf[subMesh._id]) {\r\n // Draw\r\n if (onBeforeDraw) {\r\n onBeforeDraw(false, renderingMesh.getWorldMatrix(), effectiveMaterial);\r\n }\r\n instanceCount++;\r\n\r\n this._draw(subMesh, fillMode, this._instanceDataStorage.overridenInstanceCount);\r\n }\r\n\r\n const visibleInstancesForSubMesh = batch.visibleInstances[subMesh._id];\r\n\r\n if (visibleInstancesForSubMesh) {\r\n const visibleInstanceCount = visibleInstancesForSubMesh.length;\r\n instanceCount += visibleInstanceCount;\r\n\r\n // Stats\r\n for (let instanceIndex = 0; instanceIndex < visibleInstanceCount; instanceIndex++) {\r\n const instance = visibleInstancesForSubMesh[instanceIndex];\r\n\r\n // World\r\n const world = instance.getWorldMatrix();\r\n if (onBeforeDraw) {\r\n onBeforeDraw(true, world, effectiveMaterial);\r\n }\r\n // Draw\r\n this._draw(subMesh, fillMode);\r\n }\r\n }\r\n\r\n // Stats\r\n scene._activeIndices.addCount(subMesh.indexCount * instanceCount, false);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _rebuild(dispose = false): void {\r\n if (this._instanceDataStorage.instancesBuffer) {\r\n // Dispose instance buffer to be recreated in _renderWithInstances when rendered\r\n if (dispose) {\r\n this._instanceDataStorage.instancesBuffer.dispose();\r\n }\r\n this._instanceDataStorage.instancesBuffer = null;\r\n }\r\n if (this._userInstancedBuffersStorage) {\r\n for (const kind in this._userInstancedBuffersStorage.vertexBuffers) {\r\n const buffer = this._userInstancedBuffersStorage.vertexBuffers[kind];\r\n if (buffer) {\r\n // Dispose instance buffer to be recreated in _renderWithInstances when rendered\r\n if (dispose) {\r\n buffer.dispose();\r\n }\r\n this._userInstancedBuffersStorage.vertexBuffers[kind] = null;\r\n }\r\n }\r\n if (this._userInstancedBuffersStorage.vertexArrayObjects) {\r\n this._userInstancedBuffersStorage.vertexArrayObjects = {};\r\n }\r\n }\r\n this._internalMeshDataInfo._effectiveMaterial = null;\r\n super._rebuild(dispose);\r\n }\r\n\r\n /** @internal */\r\n public _freeze() {\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n // Prepare batches\r\n for (let index = 0; index < this.subMeshes.length; index++) {\r\n this._getInstancesRenderList(index);\r\n }\r\n\r\n this._internalMeshDataInfo._effectiveMaterial = null;\r\n this._instanceDataStorage.isFrozen = true;\r\n }\r\n\r\n /** @internal */\r\n public _unFreeze() {\r\n this._instanceDataStorage.isFrozen = false;\r\n this._instanceDataStorage.previousBatch = null;\r\n }\r\n\r\n /**\r\n * Triggers the draw call for the mesh (or a submesh), for a specific render pass id\r\n * @param renderPassId defines the render pass id to use to draw the mesh / submesh. If not provided, use the current renderPassId of the engine.\r\n * @param enableAlphaMode defines if alpha mode can be changed (default: false)\r\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering (default: undefined)\r\n * @param subMesh defines the subMesh to render. If not provided, draw all mesh submeshes (default: undefined)\r\n * @param checkFrustumCulling defines if frustum culling must be checked (default: true). If you know the mesh is in the frustum (or if you don't care!), you can pass false to optimize.\r\n * @returns the current mesh\r\n */\r\n public renderWithRenderPassId(renderPassId?: number, enableAlphaMode?: boolean, effectiveMeshReplacement?: AbstractMesh, subMesh?: SubMesh, checkFrustumCulling = true) {\r\n const engine = this._scene.getEngine();\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n\r\n if (renderPassId !== undefined) {\r\n engine.currentRenderPassId = renderPassId;\r\n }\r\n\r\n if (subMesh) {\r\n if (!checkFrustumCulling || (checkFrustumCulling && subMesh.isInFrustum(this._scene._frustumPlanes))) {\r\n this.render(subMesh, !!enableAlphaMode, effectiveMeshReplacement);\r\n }\r\n } else {\r\n for (let s = 0; s < this.subMeshes.length; s++) {\r\n const subMesh = this.subMeshes[s];\r\n if (!checkFrustumCulling || (checkFrustumCulling && subMesh.isInFrustum(this._scene._frustumPlanes))) {\r\n this.render(subMesh, !!enableAlphaMode, effectiveMeshReplacement);\r\n }\r\n }\r\n }\r\n\r\n if (renderPassId !== undefined) {\r\n engine.currentRenderPassId = currentRenderPassId;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager\r\n * @param subMesh defines the subMesh to render\r\n * @param enableAlphaMode defines if alpha mode can be changed\r\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering\r\n * @returns the current mesh\r\n */\r\n public render(subMesh: SubMesh, enableAlphaMode: boolean, effectiveMeshReplacement?: AbstractMesh): Mesh {\r\n const scene = this.getScene();\r\n\r\n if (this._internalAbstractMeshDataInfo._isActiveIntermediate) {\r\n this._internalAbstractMeshDataInfo._isActiveIntermediate = false;\r\n } else {\r\n this._internalAbstractMeshDataInfo._isActive = false;\r\n }\r\n\r\n const numActiveCameras = scene.activeCameras?.length ?? 0;\r\n const canCheckOcclusionQuery = (numActiveCameras > 1 && scene.activeCamera === scene.activeCameras![0]) || numActiveCameras <= 1;\r\n\r\n if (canCheckOcclusionQuery && this._checkOcclusionQuery() && !this._occlusionDataStorage.forceRenderingWhenOccluded) {\r\n return this;\r\n }\r\n\r\n // Managing instances\r\n const batch = this._getInstancesRenderList(subMesh._id, !!effectiveMeshReplacement);\r\n\r\n if (batch.mustReturn) {\r\n return this;\r\n }\r\n\r\n // Checking geometry state\r\n if (!this._geometry || !this._geometry.getVertexBuffers() || (!this._unIndexed && !this._geometry.getIndexBuffer())) {\r\n return this;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n let oldCameraMaxZ = 0;\r\n let oldCamera: Nullable = null;\r\n if (this.ignoreCameraMaxZ && scene.activeCamera && !scene._isInIntermediateRendering()) {\r\n oldCameraMaxZ = scene.activeCamera.maxZ;\r\n oldCamera = scene.activeCamera;\r\n scene.activeCamera.maxZ = 0;\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n if (this._internalMeshDataInfo._onBeforeRenderObservable) {\r\n this._internalMeshDataInfo._onBeforeRenderObservable.notifyObservers(this);\r\n }\r\n\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n const hardwareInstancedRendering =\r\n batch.hardwareInstancedRendering[subMesh._id] ||\r\n renderingMesh.hasThinInstances ||\r\n (!!this._userInstancedBuffersStorage && !subMesh.getMesh()._internalAbstractMeshDataInfo._actAsRegularMesh);\r\n const instanceDataStorage = this._instanceDataStorage;\r\n\r\n const material = subMesh.getMaterial();\r\n if (!material) {\r\n if (oldCamera) {\r\n oldCamera.maxZ = oldCameraMaxZ;\r\n scene.updateTransformMatrix(true);\r\n }\r\n return this;\r\n }\r\n\r\n // Material\r\n if (!instanceDataStorage.isFrozen || !this._internalMeshDataInfo._effectiveMaterial || this._internalMeshDataInfo._effectiveMaterial !== material) {\r\n if (material._storeEffectOnSubMeshes) {\r\n if (!material.isReadyForSubMesh(this, subMesh, hardwareInstancedRendering)) {\r\n if (oldCamera) {\r\n oldCamera.maxZ = oldCameraMaxZ;\r\n scene.updateTransformMatrix(true);\r\n }\r\n return this;\r\n }\r\n } else if (!material.isReady(this, hardwareInstancedRendering)) {\r\n if (oldCamera) {\r\n oldCamera.maxZ = oldCameraMaxZ;\r\n scene.updateTransformMatrix(true);\r\n }\r\n return this;\r\n }\r\n\r\n this._internalMeshDataInfo._effectiveMaterial = material;\r\n } else if (\r\n (material._storeEffectOnSubMeshes && !subMesh._drawWrapper?._wasPreviouslyReady) ||\r\n (!material._storeEffectOnSubMeshes && !material._getDrawWrapper()._wasPreviouslyReady)\r\n ) {\r\n if (oldCamera) {\r\n oldCamera.maxZ = oldCameraMaxZ;\r\n scene.updateTransformMatrix(true);\r\n }\r\n return this;\r\n }\r\n\r\n // Alpha mode\r\n if (enableAlphaMode) {\r\n engine.setAlphaMode(this._internalMeshDataInfo._effectiveMaterial.alphaMode);\r\n }\r\n\r\n let drawWrapper: Nullable;\r\n if (this._internalMeshDataInfo._effectiveMaterial._storeEffectOnSubMeshes) {\r\n drawWrapper = subMesh._drawWrapper;\r\n } else {\r\n drawWrapper = this._internalMeshDataInfo._effectiveMaterial._getDrawWrapper();\r\n }\r\n\r\n const effect = drawWrapper?.effect ?? null;\r\n\r\n for (const step of scene._beforeRenderingMeshStage) {\r\n step.action(this, subMesh, batch, effect);\r\n }\r\n\r\n if (!drawWrapper || !effect) {\r\n if (oldCamera) {\r\n oldCamera.maxZ = oldCameraMaxZ;\r\n scene.updateTransformMatrix(true);\r\n }\r\n return this;\r\n }\r\n\r\n const effectiveMesh = effectiveMeshReplacement || this;\r\n\r\n let sideOrientation: Nullable;\r\n\r\n if (\r\n !instanceDataStorage.isFrozen &&\r\n (this._internalMeshDataInfo._effectiveMaterial.backFaceCulling ||\r\n this.overrideMaterialSideOrientation !== null ||\r\n (this._internalMeshDataInfo._effectiveMaterial as any).twoSidedLighting)\r\n ) {\r\n // Note: if two sided lighting is enabled, we need to ensure that the normal will point in the right direction even if the determinant of the world matrix is negative\r\n const mainDeterminant = effectiveMesh._getWorldMatrixDeterminant();\r\n sideOrientation = this.overrideMaterialSideOrientation;\r\n if (sideOrientation == null) {\r\n sideOrientation = this._internalMeshDataInfo._effectiveMaterial.sideOrientation;\r\n }\r\n if (mainDeterminant < 0) {\r\n sideOrientation = sideOrientation === Material.ClockWiseSideOrientation ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\r\n }\r\n instanceDataStorage.sideOrientation = sideOrientation!;\r\n } else {\r\n sideOrientation = instanceDataStorage.sideOrientation;\r\n }\r\n\r\n const reverse = this._internalMeshDataInfo._effectiveMaterial._preBind(drawWrapper, sideOrientation);\r\n\r\n if (this._internalMeshDataInfo._effectiveMaterial.forceDepthWrite) {\r\n engine.setDepthWrite(true);\r\n }\r\n\r\n // Bind\r\n const effectiveMaterial = this._internalMeshDataInfo._effectiveMaterial;\r\n const fillMode = effectiveMaterial.fillMode;\r\n\r\n if (this._internalMeshDataInfo._onBeforeBindObservable) {\r\n this._internalMeshDataInfo._onBeforeBindObservable.notifyObservers(this);\r\n }\r\n\r\n if (!hardwareInstancedRendering) {\r\n // Binding will be done later because we need to add more info to the VB\r\n this._bind(subMesh, effect, fillMode, false);\r\n }\r\n\r\n const world = effectiveMesh.getWorldMatrix();\r\n if (effectiveMaterial._storeEffectOnSubMeshes) {\r\n effectiveMaterial.bindForSubMesh(world, this, subMesh);\r\n } else {\r\n effectiveMaterial.bind(world, this);\r\n }\r\n\r\n if (!effectiveMaterial.backFaceCulling && effectiveMaterial.separateCullingPass) {\r\n engine.setState(true, effectiveMaterial.zOffset, false, !reverse, effectiveMaterial.cullBackFaces, effectiveMaterial.stencil, effectiveMaterial.zOffsetUnits);\r\n this._processRendering(this, subMesh, effect, fillMode, batch, hardwareInstancedRendering, this._onBeforeDraw, this._internalMeshDataInfo._effectiveMaterial);\r\n engine.setState(true, effectiveMaterial.zOffset, false, reverse, effectiveMaterial.cullBackFaces, effectiveMaterial.stencil, effectiveMaterial.zOffsetUnits);\r\n\r\n if (this._internalMeshDataInfo._onBetweenPassObservable) {\r\n this._internalMeshDataInfo._onBetweenPassObservable.notifyObservers(subMesh);\r\n }\r\n }\r\n\r\n // Draw\r\n this._processRendering(this, subMesh, effect, fillMode, batch, hardwareInstancedRendering, this._onBeforeDraw, this._internalMeshDataInfo._effectiveMaterial);\r\n\r\n // Unbind\r\n this._internalMeshDataInfo._effectiveMaterial.unbind();\r\n\r\n for (const step of scene._afterRenderingMeshStage) {\r\n step.action(this, subMesh, batch, effect);\r\n }\r\n\r\n if (this._internalMeshDataInfo._onAfterRenderObservable) {\r\n this._internalMeshDataInfo._onAfterRenderObservable.notifyObservers(this);\r\n }\r\n\r\n if (oldCamera) {\r\n oldCamera.maxZ = oldCameraMaxZ;\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n if (scene.performancePriority === ScenePerformancePriority.Aggressive && !instanceDataStorage.isFrozen) {\r\n this._freeze();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private _onBeforeDraw: (isInstance: boolean, world: Matrix, effectiveMaterial?: Material) => void;\r\n\r\n /**\r\n * Renormalize the mesh and patch it up if there are no weights\r\n * Similar to normalization by adding the weights compute the reciprocal and multiply all elements, this wil ensure that everything adds to 1.\r\n * However in the case of zero weights then we set just a single influence to 1.\r\n * We check in the function for extra's present and if so we use the normalizeSkinWeightsWithExtras rather than the FourWeights version.\r\n */\r\n public cleanMatrixWeights(): void {\r\n if (this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) {\r\n if (this.isVerticesDataPresent(VertexBuffer.MatricesWeightsExtraKind)) {\r\n this._normalizeSkinWeightsAndExtra();\r\n } else {\r\n this._normalizeSkinFourWeights();\r\n }\r\n }\r\n }\r\n\r\n // faster 4 weight version.\r\n private _normalizeSkinFourWeights(): void {\r\n const matricesWeights = this.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n const numWeights = matricesWeights.length;\r\n\r\n for (let a = 0; a < numWeights; a += 4) {\r\n // accumulate weights\r\n const t = matricesWeights[a] + matricesWeights[a + 1] + matricesWeights[a + 2] + matricesWeights[a + 3];\r\n // check for invalid weight and just set it to 1.\r\n if (t === 0) {\r\n matricesWeights[a] = 1;\r\n } else {\r\n // renormalize so everything adds to 1 use reciprocal\r\n const recip = 1 / t;\r\n matricesWeights[a] *= recip;\r\n matricesWeights[a + 1] *= recip;\r\n matricesWeights[a + 2] *= recip;\r\n matricesWeights[a + 3] *= recip;\r\n }\r\n }\r\n this.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeights);\r\n }\r\n // handle special case of extra verts. (in theory gltf can handle 12 influences)\r\n private _normalizeSkinWeightsAndExtra(): void {\r\n const matricesWeightsExtra = this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind);\r\n const matricesWeights = this.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n const numWeights = matricesWeights.length;\r\n\r\n for (let a = 0; a < numWeights; a += 4) {\r\n // accumulate weights\r\n let t = matricesWeights[a] + matricesWeights[a + 1] + matricesWeights[a + 2] + matricesWeights[a + 3];\r\n t += matricesWeightsExtra[a] + matricesWeightsExtra[a + 1] + matricesWeightsExtra[a + 2] + matricesWeightsExtra[a + 3];\r\n // check for invalid weight and just set it to 1.\r\n if (t === 0) {\r\n matricesWeights[a] = 1;\r\n } else {\r\n // renormalize so everything adds to 1 use reciprocal\r\n const recip = 1 / t;\r\n matricesWeights[a] *= recip;\r\n matricesWeights[a + 1] *= recip;\r\n matricesWeights[a + 2] *= recip;\r\n matricesWeights[a + 3] *= recip;\r\n // same goes for extras\r\n matricesWeightsExtra[a] *= recip;\r\n matricesWeightsExtra[a + 1] *= recip;\r\n matricesWeightsExtra[a + 2] *= recip;\r\n matricesWeightsExtra[a + 3] *= recip;\r\n }\r\n }\r\n this.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeights);\r\n this.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeightsExtra);\r\n }\r\n\r\n /**\r\n * ValidateSkinning is used to determine that a mesh has valid skinning data along with skin metrics, if missing weights,\r\n * or not normalized it is returned as invalid mesh the string can be used for console logs, or on screen messages to let\r\n * the user know there was an issue with importing the mesh\r\n * @returns a validation object with skinned, valid and report string\r\n */\r\n public validateSkinning(): { skinned: boolean; valid: boolean; report: string } {\r\n const matricesWeightsExtra = this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind);\r\n const matricesWeights = this.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n if (matricesWeights === null || this.skeleton == null) {\r\n return { skinned: false, valid: true, report: \"not skinned\" };\r\n }\r\n\r\n const numWeights = matricesWeights.length;\r\n let numberNotSorted: number = 0;\r\n let missingWeights: number = 0;\r\n let maxUsedWeights: number = 0;\r\n let numberNotNormalized: number = 0;\r\n const numInfluences: number = matricesWeightsExtra === null ? 4 : 8;\r\n const usedWeightCounts: number[] = [];\r\n for (let a = 0; a <= numInfluences; a++) {\r\n usedWeightCounts[a] = 0;\r\n }\r\n const toleranceEpsilon: number = 0.001;\r\n\r\n for (let a = 0; a < numWeights; a += 4) {\r\n let lastWeight: number = matricesWeights[a];\r\n let t = lastWeight;\r\n let usedWeights: number = t === 0 ? 0 : 1;\r\n\r\n for (let b = 1; b < numInfluences; b++) {\r\n const d = b < 4 ? matricesWeights[a + b] : matricesWeightsExtra[a + b - 4];\r\n if (d > lastWeight) {\r\n numberNotSorted++;\r\n }\r\n if (d !== 0) {\r\n usedWeights++;\r\n }\r\n t += d;\r\n lastWeight = d;\r\n }\r\n // count the buffer weights usage\r\n usedWeightCounts[usedWeights]++;\r\n\r\n // max influences\r\n if (usedWeights > maxUsedWeights) {\r\n maxUsedWeights = usedWeights;\r\n }\r\n\r\n // check for invalid weight and just set it to 1.\r\n if (t === 0) {\r\n missingWeights++;\r\n } else {\r\n // renormalize so everything adds to 1 use reciprocal\r\n const recip = 1 / t;\r\n let tolerance = 0;\r\n for (let b = 0; b < numInfluences; b++) {\r\n if (b < 4) {\r\n tolerance += Math.abs(matricesWeights[a + b] - matricesWeights[a + b] * recip);\r\n } else {\r\n tolerance += Math.abs(matricesWeightsExtra[a + b - 4] - matricesWeightsExtra[a + b - 4] * recip);\r\n }\r\n }\r\n // arbitrary epsilon value for dictating not normalized\r\n if (tolerance > toleranceEpsilon) {\r\n numberNotNormalized++;\r\n }\r\n }\r\n }\r\n\r\n // validate bone indices are in range of the skeleton\r\n const numBones: number = this.skeleton.bones.length;\r\n const matricesIndices = this.getVerticesData(VertexBuffer.MatricesIndicesKind);\r\n const matricesIndicesExtra = this.getVerticesData(VertexBuffer.MatricesIndicesExtraKind);\r\n let numBadBoneIndices: number = 0;\r\n for (let a = 0; a < numWeights; a += 4) {\r\n for (let b = 0; b < numInfluences; b++) {\r\n const index = b < 4 ? matricesIndices[a + b] : matricesIndicesExtra[a + b - 4];\r\n if (index >= numBones || index < 0) {\r\n numBadBoneIndices++;\r\n }\r\n }\r\n }\r\n\r\n // log mesh stats\r\n const output =\r\n \"Number of Weights = \" +\r\n numWeights / 4 +\r\n \"\\nMaximum influences = \" +\r\n maxUsedWeights +\r\n \"\\nMissing Weights = \" +\r\n missingWeights +\r\n \"\\nNot Sorted = \" +\r\n numberNotSorted +\r\n \"\\nNot Normalized = \" +\r\n numberNotNormalized +\r\n \"\\nWeightCounts = [\" +\r\n usedWeightCounts +\r\n \"]\" +\r\n \"\\nNumber of bones = \" +\r\n numBones +\r\n \"\\nBad Bone Indices = \" +\r\n numBadBoneIndices;\r\n\r\n return { skinned: true, valid: missingWeights === 0 && numberNotNormalized === 0 && numBadBoneIndices === 0, report: output };\r\n }\r\n\r\n /** @internal */\r\n public _checkDelayState(): Mesh {\r\n const scene = this.getScene();\r\n if (this._geometry) {\r\n this._geometry.load(scene);\r\n } else if (this.delayLoadState === Constants.DELAYLOADSTATE_NOTLOADED) {\r\n this.delayLoadState = Constants.DELAYLOADSTATE_LOADING;\r\n\r\n this._queueLoad(scene);\r\n }\r\n return this;\r\n }\r\n\r\n private _queueLoad(scene: Scene): Mesh {\r\n scene.addPendingData(this);\r\n\r\n const getBinaryData = this.delayLoadingFile.indexOf(\".babylonbinarymeshdata\") !== -1;\r\n\r\n Tools.LoadFile(\r\n this.delayLoadingFile,\r\n (data) => {\r\n if (data instanceof ArrayBuffer) {\r\n this._delayLoadingFunction(data, this);\r\n } else {\r\n this._delayLoadingFunction(JSON.parse(data), this);\r\n }\r\n\r\n this.instances.forEach((instance) => {\r\n instance.refreshBoundingInfo();\r\n instance._syncSubMeshes();\r\n });\r\n\r\n this.delayLoadState = Constants.DELAYLOADSTATE_LOADED;\r\n scene.removePendingData(this);\r\n },\r\n () => {},\r\n scene.offlineProvider,\r\n getBinaryData\r\n );\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns `true` if the mesh is within the frustum defined by the passed array of planes.\r\n * A mesh is in the frustum if its bounding box intersects the frustum\r\n * @param frustumPlanes defines the frustum to test\r\n * @returns true if the mesh is in the frustum planes\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n if (this.delayLoadState === Constants.DELAYLOADSTATE_LOADING) {\r\n return false;\r\n }\r\n\r\n if (!super.isInFrustum(frustumPlanes)) {\r\n return false;\r\n }\r\n\r\n this._checkDelayState();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Sets the mesh material by the material or multiMaterial `id` property\r\n * @param id is a string identifying the material or the multiMaterial\r\n * @returns the current mesh\r\n */\r\n public setMaterialById(id: string): Mesh {\r\n const materials = this.getScene().materials;\r\n let index: number;\r\n for (index = materials.length - 1; index > -1; index--) {\r\n if (materials[index].id === id) {\r\n this.material = materials[index];\r\n return this;\r\n }\r\n }\r\n\r\n // Multi\r\n const multiMaterials = this.getScene().multiMaterials;\r\n for (index = multiMaterials.length - 1; index > -1; index--) {\r\n if (multiMaterials[index].id === id) {\r\n this.material = multiMaterials[index];\r\n return this;\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns as a new array populated with the mesh material and/or skeleton, if any.\r\n * @returns an array of IAnimatable\r\n */\r\n public getAnimatables(): IAnimatable[] {\r\n const results: IAnimatable[] = [];\r\n\r\n if (this.material) {\r\n results.push(this.material);\r\n }\r\n\r\n if (this.skeleton) {\r\n results.push(this.skeleton);\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Modifies the mesh geometry according to the passed transformation matrix.\r\n * This method returns nothing, but it really modifies the mesh even if it's originally not set as updatable.\r\n * The mesh normals are modified using the same transformation.\r\n * Note that, under the hood, this method sets a new VertexBuffer each call.\r\n * @param transform defines the transform matrix to use\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms\r\n * @returns the current mesh\r\n */\r\n public bakeTransformIntoVertices(transform: Matrix): Mesh {\r\n // Position\r\n if (!this.isVerticesDataPresent(VertexBuffer.PositionKind)) {\r\n return this;\r\n }\r\n\r\n const submeshes = this.subMeshes.splice(0);\r\n\r\n this._resetPointsArrayCache();\r\n\r\n let data = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n const temp = Vector3.Zero();\r\n let index: number;\r\n for (index = 0; index < data.length; index += 3) {\r\n Vector3.TransformCoordinatesFromFloatsToRef(data[index], data[index + 1], data[index + 2], transform, temp).toArray(data, index);\r\n }\r\n\r\n this.setVerticesData(VertexBuffer.PositionKind, data, (this.getVertexBuffer(VertexBuffer.PositionKind)).isUpdatable());\r\n\r\n // Normals\r\n if (this.isVerticesDataPresent(VertexBuffer.NormalKind)) {\r\n data = this.getVerticesData(VertexBuffer.NormalKind);\r\n for (index = 0; index < data.length; index += 3) {\r\n Vector3.TransformNormalFromFloatsToRef(data[index], data[index + 1], data[index + 2], transform, temp)\r\n .normalize()\r\n .toArray(data, index);\r\n }\r\n this.setVerticesData(VertexBuffer.NormalKind, data, (this.getVertexBuffer(VertexBuffer.NormalKind)).isUpdatable());\r\n }\r\n\r\n // Tangents\r\n if (this.isVerticesDataPresent(VertexBuffer.TangentKind)) {\r\n data = this.getVerticesData(VertexBuffer.TangentKind);\r\n for (index = 0; index < data.length; index += 4) {\r\n Vector3.TransformNormalFromFloatsToRef(data[index], data[index + 1], data[index + 2], transform, temp)\r\n .normalize()\r\n .toArray(data, index);\r\n }\r\n this.setVerticesData(VertexBuffer.TangentKind, data, (this.getVertexBuffer(VertexBuffer.TangentKind)).isUpdatable());\r\n }\r\n\r\n // flip faces?\r\n if (transform.determinant() < 0) {\r\n this.flipFaces();\r\n }\r\n\r\n // Restore submeshes\r\n this.releaseSubMeshes();\r\n this.subMeshes = submeshes;\r\n return this;\r\n }\r\n\r\n /**\r\n * Modifies the mesh geometry according to its own current World Matrix.\r\n * The mesh World Matrix is then reset.\r\n * This method returns nothing but really modifies the mesh even if it's originally not set as updatable.\r\n * Note that, under the hood, this method sets a new VertexBuffer each call.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms\r\n * @param bakeIndependentlyOfChildren indicates whether to preserve all child nodes' World Matrix during baking\r\n * @returns the current mesh\r\n */\r\n public bakeCurrentTransformIntoVertices(bakeIndependentlyOfChildren: boolean = true): Mesh {\r\n this.bakeTransformIntoVertices(this.computeWorldMatrix(true));\r\n this.resetLocalMatrix(bakeIndependentlyOfChildren);\r\n return this;\r\n }\r\n\r\n // Cache\r\n\r\n /** @internal */\r\n public get _positions(): Nullable {\r\n if (this._internalAbstractMeshDataInfo._positions) {\r\n return this._internalAbstractMeshDataInfo._positions;\r\n }\r\n\r\n if (this._geometry) {\r\n return this._geometry._positions;\r\n }\r\n return null;\r\n }\r\n\r\n /** @internal */\r\n public _resetPointsArrayCache(): Mesh {\r\n if (this._geometry) {\r\n this._geometry._resetPointsArrayCache();\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public _generatePointsArray(): boolean {\r\n if (this._geometry) {\r\n return this._geometry._generatePointsArray();\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns a new Mesh object generated from the current mesh properties.\r\n * This method must not get confused with createInstance()\r\n * @param name is a string, the name given to the new mesh\r\n * @param newParent can be any Node object (default `null`)\r\n * @param doNotCloneChildren allows/denies the recursive cloning of the original mesh children if any (default `false`)\r\n * @param clonePhysicsImpostor allows/denies the cloning in the same time of the original mesh `body` used by the physics engine, if any (default `true`)\r\n * @returns a new mesh\r\n */\r\n public clone(name: string = \"\", newParent: Nullable = null, doNotCloneChildren?: boolean, clonePhysicsImpostor: boolean = true): Mesh {\r\n return new Mesh(name, this.getScene(), newParent, this, doNotCloneChildren, clonePhysicsImpostor);\r\n }\r\n\r\n /**\r\n * Releases resources associated with this mesh.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n this.morphTargetManager = null;\r\n\r\n if (this._geometry) {\r\n this._geometry.releaseForMesh(this, true);\r\n }\r\n\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n\r\n if (internalDataInfo._onBeforeDrawObservable) {\r\n internalDataInfo._onBeforeDrawObservable.clear();\r\n }\r\n\r\n if (internalDataInfo._onBeforeBindObservable) {\r\n internalDataInfo._onBeforeBindObservable.clear();\r\n }\r\n\r\n if (internalDataInfo._onBeforeRenderObservable) {\r\n internalDataInfo._onBeforeRenderObservable.clear();\r\n }\r\n\r\n if (internalDataInfo._onAfterRenderObservable) {\r\n internalDataInfo._onAfterRenderObservable.clear();\r\n }\r\n\r\n if (internalDataInfo._onBetweenPassObservable) {\r\n internalDataInfo._onBetweenPassObservable.clear();\r\n }\r\n\r\n // Sources\r\n if (this._scene.useClonedMeshMap) {\r\n if (internalDataInfo.meshMap) {\r\n for (const uniqueId in internalDataInfo.meshMap) {\r\n const mesh = internalDataInfo.meshMap[uniqueId];\r\n if (mesh) {\r\n mesh._internalMeshDataInfo._source = null;\r\n internalDataInfo.meshMap[uniqueId] = undefined;\r\n }\r\n }\r\n }\r\n\r\n if (internalDataInfo._source && internalDataInfo._source._internalMeshDataInfo.meshMap) {\r\n internalDataInfo._source._internalMeshDataInfo.meshMap[this.uniqueId] = undefined;\r\n }\r\n } else {\r\n const meshes = this.getScene().meshes;\r\n for (const abstractMesh of meshes) {\r\n const mesh = abstractMesh as Mesh;\r\n if (mesh._internalMeshDataInfo && mesh._internalMeshDataInfo._source && mesh._internalMeshDataInfo._source === this) {\r\n mesh._internalMeshDataInfo._source = null;\r\n }\r\n }\r\n }\r\n\r\n internalDataInfo._source = null;\r\n this._instanceDataStorage.visibleInstances = {};\r\n\r\n // Instances\r\n this._disposeInstanceSpecificData();\r\n\r\n // Thin instances\r\n this._disposeThinInstanceSpecificData();\r\n\r\n if (this._internalMeshDataInfo._checkReadinessObserver) {\r\n this._scene.onBeforeRenderObservable.remove(this._internalMeshDataInfo._checkReadinessObserver);\r\n }\r\n\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n /** @internal */\r\n public _disposeInstanceSpecificData() {\r\n // Do nothing\r\n }\r\n\r\n /** @internal */\r\n public _disposeThinInstanceSpecificData() {\r\n // Do nothing\r\n }\r\n\r\n /** @internal */\r\n public _invalidateInstanceVertexArrayObject() {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Modifies the mesh geometry according to a displacement map.\r\n * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex.\r\n * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated.\r\n * @param url is a string, the URL from the image file is to be downloaded.\r\n * @param minHeight is the lower limit of the displacement.\r\n * @param maxHeight is the upper limit of the displacement.\r\n * @param onSuccess is an optional Javascript function to be called just after the mesh is modified. It is passed the modified mesh and must return nothing.\r\n * @param uvOffset is an optional vector2 used to offset UV.\r\n * @param uvScale is an optional vector2 used to scale UV.\r\n * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance.\r\n * @param onError defines a callback called when an error occurs during the processing of the request.\r\n * @returns the Mesh.\r\n */\r\n public applyDisplacementMap(\r\n url: string,\r\n minHeight: number,\r\n maxHeight: number,\r\n onSuccess?: (mesh: Mesh) => void,\r\n uvOffset?: Vector2,\r\n uvScale?: Vector2,\r\n forceUpdate = false,\r\n onError?: (message?: string, exception?: any) => void\r\n ): Mesh {\r\n const scene = this.getScene();\r\n\r\n const onload = (img: HTMLImageElement | ImageBitmap) => {\r\n // Getting height map data\r\n const heightMapWidth = img.width;\r\n const heightMapHeight = img.height;\r\n const canvas = this.getEngine().createCanvas(heightMapWidth, heightMapHeight);\r\n const context = canvas.getContext(\"2d\");\r\n\r\n context.drawImage(img, 0, 0);\r\n\r\n // Create VertexData from map data\r\n //Cast is due to wrong definition in lib.d.ts from ts 1.3 - https://github.com/Microsoft/TypeScript/issues/949\r\n const buffer = (context.getImageData(0, 0, heightMapWidth, heightMapHeight).data);\r\n\r\n this.applyDisplacementMapFromBuffer(buffer, heightMapWidth, heightMapHeight, minHeight, maxHeight, uvOffset, uvScale, forceUpdate);\r\n //execute success callback, if set\r\n if (onSuccess) {\r\n onSuccess(this);\r\n }\r\n };\r\n\r\n Tools.LoadImage(url, onload, onError ? onError : () => {}, scene.offlineProvider);\r\n return this;\r\n }\r\n\r\n /**\r\n * Modifies the mesh geometry according to a displacementMap buffer.\r\n * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex.\r\n * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated.\r\n * @param buffer is a `Uint8Array` buffer containing series of `Uint8` lower than 255, the red, green, blue and alpha values of each successive pixel.\r\n * @param heightMapWidth is the width of the buffer image.\r\n * @param heightMapHeight is the height of the buffer image.\r\n * @param minHeight is the lower limit of the displacement.\r\n * @param maxHeight is the upper limit of the displacement.\r\n * @param uvOffset is an optional vector2 used to offset UV.\r\n * @param uvScale is an optional vector2 used to scale UV.\r\n * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance.\r\n * @returns the Mesh.\r\n */\r\n public applyDisplacementMapFromBuffer(\r\n buffer: Uint8Array,\r\n heightMapWidth: number,\r\n heightMapHeight: number,\r\n minHeight: number,\r\n maxHeight: number,\r\n uvOffset?: Vector2,\r\n uvScale?: Vector2,\r\n forceUpdate = false\r\n ): Mesh {\r\n if (!this.isVerticesDataPresent(VertexBuffer.PositionKind) || !this.isVerticesDataPresent(VertexBuffer.NormalKind) || !this.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n Logger.Warn(\"Cannot call applyDisplacementMap: Given mesh is not complete. Position, Normal or UV are missing\");\r\n return this;\r\n }\r\n\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind, true, true);\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n const uvs = this.getVerticesData(VertexBuffer.UVKind);\r\n let position = Vector3.Zero();\r\n const normal = Vector3.Zero();\r\n const uv = Vector2.Zero();\r\n\r\n uvOffset = uvOffset || Vector2.Zero();\r\n uvScale = uvScale || new Vector2(1, 1);\r\n\r\n for (let index = 0; index < positions.length; index += 3) {\r\n Vector3.FromArrayToRef(positions, index, position);\r\n Vector3.FromArrayToRef(normals, index, normal);\r\n Vector2.FromArrayToRef(uvs, (index / 3) * 2, uv);\r\n\r\n // Compute height\r\n const u = (Math.abs(uv.x * uvScale.x + (uvOffset.x % 1)) * (heightMapWidth - 1)) % heightMapWidth | 0;\r\n const v = (Math.abs(uv.y * uvScale.y + (uvOffset.y % 1)) * (heightMapHeight - 1)) % heightMapHeight | 0;\r\n\r\n const pos = (u + v * heightMapWidth) * 4;\r\n const r = buffer[pos] / 255.0;\r\n const g = buffer[pos + 1] / 255.0;\r\n const b = buffer[pos + 2] / 255.0;\r\n\r\n const gradient = r * 0.3 + g * 0.59 + b * 0.11;\r\n\r\n normal.normalize();\r\n normal.scaleInPlace(minHeight + (maxHeight - minHeight) * gradient);\r\n position = position.add(normal);\r\n\r\n position.toArray(positions, index);\r\n }\r\n\r\n VertexData.ComputeNormals(positions, this.getIndices(), normals);\r\n\r\n if (forceUpdate) {\r\n this.setVerticesData(VertexBuffer.PositionKind, positions);\r\n this.setVerticesData(VertexBuffer.NormalKind, normals);\r\n this.setVerticesData(VertexBuffer.UVKind, uvs);\r\n } else {\r\n this.updateVerticesData(VertexBuffer.PositionKind, positions);\r\n this.updateVerticesData(VertexBuffer.NormalKind, normals);\r\n }\r\n return this;\r\n }\r\n\r\n private _getFlattenedNormals(indices: IndicesArray, positions: FloatArray): Float32Array {\r\n const normals = new Float32Array(indices.length * 3);\r\n let normalsCount = 0;\r\n\r\n // Decide if normals should be flipped\r\n const flipNormalGeneration =\r\n this.overrideMaterialSideOrientation ===\r\n (this._scene.useRightHandedSystem ? Constants.MATERIAL_CounterClockWiseSideOrientation : Constants.MATERIAL_ClockWiseSideOrientation);\r\n\r\n // Generate new normals\r\n for (let index = 0; index < indices.length; index += 3) {\r\n const p1 = Vector3.FromArray(positions, indices[index] * 3);\r\n const p2 = Vector3.FromArray(positions, indices[index + 1] * 3);\r\n const p3 = Vector3.FromArray(positions, indices[index + 2] * 3);\r\n\r\n const p1p2 = p1.subtract(p2);\r\n const p3p2 = p3.subtract(p2);\r\n\r\n const normal = Vector3.Normalize(Vector3.Cross(p1p2, p3p2));\r\n if (flipNormalGeneration) {\r\n normal.scaleInPlace(-1);\r\n }\r\n\r\n // Store same normals for every vertex\r\n for (let localIndex = 0; localIndex < 3; localIndex++) {\r\n normals[normalsCount++] = normal.x;\r\n normals[normalsCount++] = normal.y;\r\n normals[normalsCount++] = normal.z;\r\n }\r\n }\r\n\r\n return normals;\r\n }\r\n\r\n private _convertToUnIndexedMesh(flattenNormals: boolean = false): Mesh {\r\n const kinds = this.getVerticesDataKinds();\r\n const indices = this.getIndices()!;\r\n const data: { [kind: string]: FloatArray } = {};\r\n\r\n const separateVertices = (data: FloatArray, stride: number): Float32Array => {\r\n const newData = new Float32Array(indices.length * stride);\r\n let count = 0;\r\n for (let index = 0; index < indices.length; index++) {\r\n for (let offset = 0; offset < stride; offset++) {\r\n newData[count++] = data[indices[index] * stride + offset];\r\n }\r\n }\r\n return newData;\r\n };\r\n\r\n // Save previous submeshes\r\n const previousSubmeshes = this.geometry ? this.subMeshes.slice(0) : [];\r\n\r\n // Cache vertex data\r\n for (const kind of kinds) {\r\n data[kind] = this.getVerticesData(kind)!;\r\n }\r\n\r\n // Update vertex data\r\n for (const kind of kinds) {\r\n const vertexBuffer = this.getVertexBuffer(kind)!;\r\n const stride = vertexBuffer.getStrideSize();\r\n\r\n if (flattenNormals && kind === VertexBuffer.NormalKind) {\r\n const normals = this._getFlattenedNormals(indices, data[VertexBuffer.PositionKind]);\r\n this.setVerticesData(VertexBuffer.NormalKind, normals, vertexBuffer.isUpdatable(), stride);\r\n } else {\r\n this.setVerticesData(kind, separateVertices(data[kind], stride), vertexBuffer.isUpdatable(), stride);\r\n }\r\n }\r\n\r\n // Update morph targets\r\n if (this.morphTargetManager) {\r\n for (let targetIndex = 0; targetIndex < this.morphTargetManager.numTargets; targetIndex++) {\r\n const target = this.morphTargetManager.getTarget(targetIndex);\r\n\r\n const positions = target.getPositions()!;\r\n target.setPositions(separateVertices(positions, 3));\r\n\r\n const normals = target.getNormals();\r\n if (normals) {\r\n target.setNormals(flattenNormals ? this._getFlattenedNormals(indices, positions) : separateVertices(normals, 3));\r\n }\r\n\r\n const tangents = target.getTangents();\r\n if (tangents) {\r\n target.setTangents(separateVertices(tangents, 3));\r\n }\r\n\r\n const uvs = target.getUVs();\r\n if (uvs) {\r\n target.setUVs(separateVertices(uvs, 2));\r\n }\r\n }\r\n this.morphTargetManager.synchronize();\r\n }\r\n\r\n // Update indices\r\n for (let index = 0; index < indices.length; index++) {\r\n indices[index] = index;\r\n }\r\n this.setIndices(indices);\r\n\r\n this._unIndexed = true;\r\n\r\n // Update submeshes\r\n this.releaseSubMeshes();\r\n for (const previousOne of previousSubmeshes) {\r\n SubMesh.AddToMesh(previousOne.materialIndex, previousOne.indexStart, previousOne.indexCount, previousOne.indexStart, previousOne.indexCount, this);\r\n }\r\n\r\n this.synchronizeInstances();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Modify the mesh to get a flat shading rendering.\r\n * This means each mesh facet will then have its own normals. Usually new vertices are added in the mesh geometry to get this result.\r\n * Warning : the mesh is really modified even if not set originally as updatable and, under the hood, a new VertexBuffer is allocated.\r\n * @returns current mesh\r\n */\r\n public convertToFlatShadedMesh(): Mesh {\r\n return this._convertToUnIndexedMesh(true);\r\n }\r\n\r\n /**\r\n * This method removes all the mesh indices and add new vertices (duplication) in order to unfold facets into buffers.\r\n * In other words, more vertices, no more indices and a single bigger VBO.\r\n * The mesh is really modified even if not set originally as updatable. Under the hood, a new VertexBuffer is allocated.\r\n * @returns current mesh\r\n */\r\n public convertToUnIndexedMesh(): Mesh {\r\n return this._convertToUnIndexedMesh();\r\n }\r\n\r\n /**\r\n * Inverses facet orientations.\r\n * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.\r\n * @param flipNormals will also inverts the normals\r\n * @returns current mesh\r\n */\r\n public flipFaces(flipNormals: boolean = false): Mesh {\r\n const vertex_data = VertexData.ExtractFromMesh(this);\r\n let i: number;\r\n if (flipNormals && this.isVerticesDataPresent(VertexBuffer.NormalKind) && vertex_data.normals) {\r\n for (i = 0; i < vertex_data.normals.length; i++) {\r\n vertex_data.normals[i] *= -1;\r\n }\r\n }\r\n\r\n if (vertex_data.indices) {\r\n let temp;\r\n for (i = 0; i < vertex_data.indices.length; i += 3) {\r\n // reassign indices\r\n temp = vertex_data.indices[i + 1];\r\n vertex_data.indices[i + 1] = vertex_data.indices[i + 2];\r\n vertex_data.indices[i + 2] = temp;\r\n }\r\n }\r\n\r\n vertex_data.applyToMesh(this, this.isVertexBufferUpdatable(VertexBuffer.PositionKind));\r\n return this;\r\n }\r\n\r\n /**\r\n * Increase the number of facets and hence vertices in a mesh\r\n * Vertex normals are interpolated from existing vertex normals\r\n * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.\r\n * @param numberPerEdge the number of new vertices to add to each edge of a facet, optional default 1\r\n */\r\n public increaseVertices(numberPerEdge: number = 1): void {\r\n const vertex_data = VertexData.ExtractFromMesh(this);\r\n const currentIndices = vertex_data.indices && !Array.isArray(vertex_data.indices) && Array.from ? Array.from(vertex_data.indices) : vertex_data.indices;\r\n const positions = vertex_data.positions && !Array.isArray(vertex_data.positions) && Array.from ? Array.from(vertex_data.positions) : vertex_data.positions;\r\n const uvs = vertex_data.uvs && !Array.isArray(vertex_data.uvs) && Array.from ? Array.from(vertex_data.uvs) : vertex_data.uvs;\r\n const normals = vertex_data.normals && !Array.isArray(vertex_data.normals) && Array.from ? Array.from(vertex_data.normals) : vertex_data.normals;\r\n\r\n if (!currentIndices || !positions) {\r\n Logger.Warn(\"Couldn't increase number of vertices : VertexData must contain at least indices and positions\");\r\n } else {\r\n vertex_data.indices = currentIndices;\r\n vertex_data.positions = positions;\r\n if (uvs) {\r\n vertex_data.uvs = uvs;\r\n }\r\n if (normals) {\r\n vertex_data.normals = normals;\r\n }\r\n\r\n const segments: number = numberPerEdge + 1; //segments per current facet edge, become sides of new facets\r\n const tempIndices: Array> = new Array();\r\n for (let i = 0; i < segments + 1; i++) {\r\n tempIndices[i] = new Array();\r\n }\r\n let a: number; //vertex index of one end of a side\r\n let b: number; //vertex index of other end of the side\r\n const deltaPosition: Vector3 = new Vector3(0, 0, 0);\r\n const deltaNormal: Vector3 = new Vector3(0, 0, 0);\r\n const deltaUV: Vector2 = new Vector2(0, 0);\r\n const indices: number[] = new Array();\r\n const vertexIndex: number[] = new Array();\r\n const side: Array>> = new Array();\r\n let len: number;\r\n let positionPtr: number = positions.length;\r\n let uvPtr: number;\r\n if (uvs) {\r\n uvPtr = uvs.length;\r\n }\r\n let normalsPtr: number;\r\n if (normals) {\r\n normalsPtr = normals.length;\r\n }\r\n\r\n for (let i = 0; i < currentIndices.length; i += 3) {\r\n vertexIndex[0] = currentIndices[i];\r\n vertexIndex[1] = currentIndices[i + 1];\r\n vertexIndex[2] = currentIndices[i + 2];\r\n for (let j = 0; j < 3; j++) {\r\n a = vertexIndex[j];\r\n b = vertexIndex[(j + 1) % 3];\r\n if (side[a] === undefined && side[b] === undefined) {\r\n side[a] = new Array();\r\n side[b] = new Array();\r\n } else {\r\n if (side[a] === undefined) {\r\n side[a] = new Array();\r\n }\r\n if (side[b] === undefined) {\r\n side[b] = new Array();\r\n }\r\n }\r\n if (side[a][b] === undefined && side[b][a] === undefined) {\r\n side[a][b] = [];\r\n deltaPosition.x = (positions[3 * b] - positions[3 * a]) / segments;\r\n deltaPosition.y = (positions[3 * b + 1] - positions[3 * a + 1]) / segments;\r\n deltaPosition.z = (positions[3 * b + 2] - positions[3 * a + 2]) / segments;\r\n if (normals) {\r\n deltaNormal.x = (normals[3 * b] - normals[3 * a]) / segments;\r\n deltaNormal.y = (normals[3 * b + 1] - normals[3 * a + 1]) / segments;\r\n deltaNormal.z = (normals[3 * b + 2] - normals[3 * a + 2]) / segments;\r\n }\r\n if (uvs) {\r\n deltaUV.x = (uvs[2 * b] - uvs[2 * a]) / segments;\r\n deltaUV.y = (uvs[2 * b + 1] - uvs[2 * a + 1]) / segments;\r\n }\r\n side[a][b].push(a);\r\n for (let k = 1; k < segments; k++) {\r\n side[a][b].push(positions.length / 3);\r\n positions[positionPtr++] = positions[3 * a] + k * deltaPosition.x;\r\n positions[positionPtr++] = positions[3 * a + 1] + k * deltaPosition.y;\r\n positions[positionPtr++] = positions[3 * a + 2] + k * deltaPosition.z;\r\n if (normals) {\r\n normals[normalsPtr!++] = normals[3 * a] + k * deltaNormal.x;\r\n normals[normalsPtr!++] = normals[3 * a + 1] + k * deltaNormal.y;\r\n normals[normalsPtr!++] = normals[3 * a + 2] + k * deltaNormal.z;\r\n }\r\n if (uvs) {\r\n uvs[uvPtr!++] = uvs[2 * a] + k * deltaUV.x;\r\n uvs[uvPtr!++] = uvs[2 * a + 1] + k * deltaUV.y;\r\n }\r\n }\r\n side[a][b].push(b);\r\n side[b][a] = new Array();\r\n len = side[a][b].length;\r\n for (let idx = 0; idx < len; idx++) {\r\n side[b][a][idx] = side[a][b][len - 1 - idx];\r\n }\r\n }\r\n }\r\n //Calculate positions, normals and uvs of new internal vertices\r\n tempIndices[0][0] = currentIndices[i];\r\n tempIndices[1][0] = side[currentIndices[i]][currentIndices[i + 1]][1];\r\n tempIndices[1][1] = side[currentIndices[i]][currentIndices[i + 2]][1];\r\n for (let k = 2; k < segments; k++) {\r\n tempIndices[k][0] = side[currentIndices[i]][currentIndices[i + 1]][k];\r\n tempIndices[k][k] = side[currentIndices[i]][currentIndices[i + 2]][k];\r\n deltaPosition.x = (positions[3 * tempIndices[k][k]] - positions[3 * tempIndices[k][0]]) / k;\r\n deltaPosition.y = (positions[3 * tempIndices[k][k] + 1] - positions[3 * tempIndices[k][0] + 1]) / k;\r\n deltaPosition.z = (positions[3 * tempIndices[k][k] + 2] - positions[3 * tempIndices[k][0] + 2]) / k;\r\n if (normals) {\r\n deltaNormal.x = (normals[3 * tempIndices[k][k]] - normals[3 * tempIndices[k][0]]) / k;\r\n deltaNormal.y = (normals[3 * tempIndices[k][k] + 1] - normals[3 * tempIndices[k][0] + 1]) / k;\r\n deltaNormal.z = (normals[3 * tempIndices[k][k] + 2] - normals[3 * tempIndices[k][0] + 2]) / k;\r\n }\r\n if (uvs) {\r\n deltaUV.x = (uvs[2 * tempIndices[k][k]] - uvs[2 * tempIndices[k][0]]) / k;\r\n deltaUV.y = (uvs[2 * tempIndices[k][k] + 1] - uvs[2 * tempIndices[k][0] + 1]) / k;\r\n }\r\n for (let j = 1; j < k; j++) {\r\n tempIndices[k][j] = positions.length / 3;\r\n positions[positionPtr++] = positions[3 * tempIndices[k][0]] + j * deltaPosition.x;\r\n positions[positionPtr++] = positions[3 * tempIndices[k][0] + 1] + j * deltaPosition.y;\r\n positions[positionPtr++] = positions[3 * tempIndices[k][0] + 2] + j * deltaPosition.z;\r\n if (normals) {\r\n normals[normalsPtr!++] = normals[3 * tempIndices[k][0]] + j * deltaNormal.x;\r\n normals[normalsPtr!++] = normals[3 * tempIndices[k][0] + 1] + j * deltaNormal.y;\r\n normals[normalsPtr!++] = normals[3 * tempIndices[k][0] + 2] + j * deltaNormal.z;\r\n }\r\n if (uvs) {\r\n uvs[uvPtr!++] = uvs[2 * tempIndices[k][0]] + j * deltaUV.x;\r\n uvs[uvPtr!++] = uvs[2 * tempIndices[k][0] + 1] + j * deltaUV.y;\r\n }\r\n }\r\n }\r\n tempIndices[segments] = side[currentIndices[i + 1]][currentIndices[i + 2]];\r\n\r\n // reform indices\r\n indices.push(tempIndices[0][0], tempIndices[1][0], tempIndices[1][1]);\r\n for (let k = 1; k < segments; k++) {\r\n let j: number;\r\n for (j = 0; j < k; j++) {\r\n indices.push(tempIndices[k][j], tempIndices[k + 1][j], tempIndices[k + 1][j + 1]);\r\n indices.push(tempIndices[k][j], tempIndices[k + 1][j + 1], tempIndices[k][j + 1]);\r\n }\r\n indices.push(tempIndices[k][j], tempIndices[k + 1][j], tempIndices[k + 1][j + 1]);\r\n }\r\n }\r\n\r\n vertex_data.indices = indices;\r\n vertex_data.applyToMesh(this, this.isVertexBufferUpdatable(VertexBuffer.PositionKind));\r\n }\r\n }\r\n\r\n /**\r\n * Force adjacent facets to share vertices and remove any facets that have all vertices in a line\r\n * This will undo any application of covertToFlatShadedMesh\r\n * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.\r\n */\r\n public forceSharedVertices(): void {\r\n const vertex_data = VertexData.ExtractFromMesh(this);\r\n const currentUVs = vertex_data.uvs;\r\n const currentIndices = vertex_data.indices;\r\n const currentPositions = vertex_data.positions;\r\n const currentColors = vertex_data.colors;\r\n const currentMatrixIndices = vertex_data.matricesIndices;\r\n const currentMatrixWeights = vertex_data.matricesWeights;\r\n const currentMatrixIndicesExtra = vertex_data.matricesIndicesExtra;\r\n const currentMatrixWeightsExtra = vertex_data.matricesWeightsExtra;\r\n\r\n if (currentIndices === void 0 || currentPositions === void 0 || currentIndices === null || currentPositions === null) {\r\n Logger.Warn(\"VertexData contains empty entries\");\r\n } else {\r\n const positions: Array = new Array();\r\n const indices: Array = new Array();\r\n const uvs: Array = new Array();\r\n const colors: Array = new Array();\r\n const matrixIndices: Array = new Array();\r\n const matrixWeights: Array = new Array();\r\n const matrixIndicesExtra: Array = new Array();\r\n const matrixWeightsExtra: Array = new Array();\r\n let pstring: Array = new Array(); //lists facet vertex positions (a,b,c) as string \"a|b|c\"\r\n\r\n let indexPtr: number = 0; // pointer to next available index value\r\n const uniquePositions: { [key: string]: number } = {}; // unique vertex positions\r\n let ptr: number; // pointer to element in uniquePositions\r\n let facet: Array;\r\n\r\n for (let i = 0; i < currentIndices.length; i += 3) {\r\n facet = [currentIndices[i], currentIndices[i + 1], currentIndices[i + 2]]; //facet vertex indices\r\n pstring = [];\r\n for (let j = 0; j < 3; j++) {\r\n pstring[j] = \"\";\r\n for (let k = 0; k < 3; k++) {\r\n //small values make 0\r\n if (Math.abs(currentPositions[3 * facet[j] + k]) < 0.00000001) {\r\n currentPositions[3 * facet[j] + k] = 0;\r\n }\r\n pstring[j] += currentPositions[3 * facet[j] + k] + \"|\";\r\n }\r\n }\r\n //check facet vertices to see that none are repeated\r\n // do not process any facet that has a repeated vertex, ie is a line\r\n if (!(pstring[0] == pstring[1] || pstring[0] == pstring[2] || pstring[1] == pstring[2])) {\r\n //for each facet position check if already listed in uniquePositions\r\n // if not listed add to uniquePositions and set index pointer\r\n // if listed use its index in uniquePositions and new index pointer\r\n for (let j = 0; j < 3; j++) {\r\n ptr = uniquePositions[pstring[j]];\r\n if (ptr === undefined) {\r\n uniquePositions[pstring[j]] = indexPtr;\r\n ptr = indexPtr++;\r\n //not listed so add individual x, y, z coordinates to positions\r\n for (let k = 0; k < 3; k++) {\r\n positions.push(currentPositions[3 * facet[j] + k]);\r\n }\r\n if (currentColors !== null && currentColors !== void 0) {\r\n for (let k = 0; k < 4; k++) {\r\n colors.push(currentColors[4 * facet[j] + k]);\r\n }\r\n }\r\n if (currentUVs !== null && currentUVs !== void 0) {\r\n for (let k = 0; k < 2; k++) {\r\n uvs.push(currentUVs[2 * facet[j] + k]);\r\n }\r\n }\r\n if (currentMatrixIndices !== null && currentMatrixIndices !== void 0) {\r\n for (let k = 0; k < 4; k++) {\r\n matrixIndices.push(currentMatrixIndices[4 * facet[j] + k]);\r\n }\r\n }\r\n if (currentMatrixWeights !== null && currentMatrixWeights !== void 0) {\r\n for (let k = 0; k < 4; k++) {\r\n matrixWeights.push(currentMatrixWeights[4 * facet[j] + k]);\r\n }\r\n }\r\n if (currentMatrixIndicesExtra !== null && currentMatrixIndicesExtra !== void 0) {\r\n for (let k = 0; k < 4; k++) {\r\n matrixIndicesExtra.push(currentMatrixIndicesExtra[4 * facet[j] + k]);\r\n }\r\n }\r\n if (currentMatrixWeightsExtra !== null && currentMatrixWeightsExtra !== void 0) {\r\n for (let k = 0; k < 4; k++) {\r\n matrixWeightsExtra.push(currentMatrixWeightsExtra[4 * facet[j] + k]);\r\n }\r\n }\r\n }\r\n // add new index pointer to indices array\r\n indices.push(ptr);\r\n }\r\n }\r\n }\r\n\r\n const normals: Array = new Array();\r\n VertexData.ComputeNormals(positions, indices, normals);\r\n\r\n //create new vertex data object and update\r\n vertex_data.positions = positions;\r\n vertex_data.indices = indices;\r\n vertex_data.normals = normals;\r\n if (currentUVs !== null && currentUVs !== void 0) {\r\n vertex_data.uvs = uvs;\r\n }\r\n if (currentColors !== null && currentColors !== void 0) {\r\n vertex_data.colors = colors;\r\n }\r\n if (currentMatrixIndices !== null && currentMatrixIndices !== void 0) {\r\n vertex_data.matricesIndices = matrixIndices;\r\n }\r\n if (currentMatrixWeights !== null && currentMatrixWeights !== void 0) {\r\n vertex_data.matricesWeights = matrixWeights;\r\n }\r\n if (currentMatrixIndicesExtra !== null && currentMatrixIndicesExtra !== void 0) {\r\n vertex_data.matricesIndicesExtra = matrixIndicesExtra;\r\n }\r\n if (currentMatrixWeights !== null && currentMatrixWeights !== void 0) {\r\n vertex_data.matricesWeightsExtra = matrixWeightsExtra;\r\n }\r\n\r\n vertex_data.applyToMesh(this, this.isVertexBufferUpdatable(VertexBuffer.PositionKind));\r\n }\r\n }\r\n\r\n // Instances\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/naming-convention\r\n public static _instancedMeshFactory(name: string, mesh: Mesh): InstancedMesh {\r\n throw _WarnImport(\"InstancedMesh\");\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _PhysicsImpostorParser(scene: Scene, physicObject: IPhysicsEnabledObject, jsonObject: any): PhysicsImpostor {\r\n throw _WarnImport(\"PhysicsImpostor\");\r\n }\r\n\r\n /**\r\n * Creates a new InstancedMesh object from the mesh model.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\r\n * @param name defines the name of the new instance\r\n * @returns a new InstancedMesh\r\n */\r\n public createInstance(name: string): InstancedMesh {\r\n return Mesh._instancedMeshFactory(name, this);\r\n }\r\n\r\n /**\r\n * Synchronises all the mesh instance submeshes to the current mesh submeshes, if any.\r\n * After this call, all the mesh instances have the same submeshes than the current mesh.\r\n * @returns the current mesh\r\n */\r\n public synchronizeInstances(): Mesh {\r\n for (let instanceIndex = 0; instanceIndex < this.instances.length; instanceIndex++) {\r\n const instance = this.instances[instanceIndex];\r\n instance._syncSubMeshes();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Optimization of the mesh's indices, in case a mesh has duplicated vertices.\r\n * The function will only reorder the indices and will not remove unused vertices to avoid problems with submeshes.\r\n * This should be used together with the simplification to avoid disappearing triangles.\r\n * @param successCallback an optional success callback to be called after the optimization finished.\r\n * @returns the current mesh\r\n */\r\n public optimizeIndices(successCallback?: (mesh?: Mesh) => void): Mesh {\r\n const indices = this.getIndices();\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (!positions || !indices) {\r\n return this;\r\n }\r\n\r\n const vectorPositions: Vector3[] = [];\r\n for (let pos = 0; pos < positions.length; pos = pos + 3) {\r\n vectorPositions.push(Vector3.FromArray(positions, pos));\r\n }\r\n const dupes: number[] = [];\r\n\r\n AsyncLoop.SyncAsyncForLoop(\r\n vectorPositions.length,\r\n 40,\r\n (iteration) => {\r\n const realPos = vectorPositions.length - 1 - iteration;\r\n const testedPosition = vectorPositions[realPos];\r\n for (let j = 0; j < realPos; ++j) {\r\n const againstPosition = vectorPositions[j];\r\n if (testedPosition.equals(againstPosition)) {\r\n dupes[realPos] = j;\r\n break;\r\n }\r\n }\r\n },\r\n () => {\r\n for (let i = 0; i < indices.length; ++i) {\r\n indices[i] = dupes[indices[i]] || indices[i];\r\n }\r\n\r\n //indices are now reordered\r\n const originalSubMeshes = this.subMeshes.slice(0);\r\n this.setIndices(indices);\r\n this.subMeshes = originalSubMeshes;\r\n if (successCallback) {\r\n successCallback(this);\r\n }\r\n }\r\n );\r\n return this;\r\n }\r\n\r\n /**\r\n * Serialize current mesh\r\n * @param serializationObject defines the object which will receive the serialization data\r\n * @returns the serialized object\r\n */\r\n public serialize(serializationObject: any = {}): any {\r\n serializationObject.name = this.name;\r\n serializationObject.id = this.id;\r\n serializationObject.uniqueId = this.uniqueId;\r\n serializationObject.type = this.getClassName();\r\n\r\n if (Tags && Tags.HasTags(this)) {\r\n serializationObject.tags = Tags.GetTags(this);\r\n }\r\n\r\n serializationObject.position = this.position.asArray();\r\n\r\n if (this.rotationQuaternion) {\r\n serializationObject.rotationQuaternion = this.rotationQuaternion.asArray();\r\n } else if (this.rotation) {\r\n serializationObject.rotation = this.rotation.asArray();\r\n }\r\n\r\n serializationObject.scaling = this.scaling.asArray();\r\n if (this._postMultiplyPivotMatrix) {\r\n serializationObject.pivotMatrix = this.getPivotMatrix().asArray();\r\n } else {\r\n serializationObject.localMatrix = this.getPivotMatrix().asArray();\r\n }\r\n\r\n serializationObject.isEnabled = this.isEnabled(false);\r\n serializationObject.isVisible = this.isVisible;\r\n serializationObject.infiniteDistance = this.infiniteDistance;\r\n serializationObject.pickable = this.isPickable;\r\n\r\n serializationObject.receiveShadows = this.receiveShadows;\r\n\r\n serializationObject.billboardMode = this.billboardMode;\r\n serializationObject.visibility = this.visibility;\r\n serializationObject.alwaysSelectAsActiveMesh = this.alwaysSelectAsActiveMesh;\r\n\r\n serializationObject.checkCollisions = this.checkCollisions;\r\n serializationObject.ellipsoid = this.ellipsoid.asArray();\r\n serializationObject.ellipsoidOffset = this.ellipsoidOffset.asArray();\r\n serializationObject.doNotSyncBoundingInfo = this.doNotSyncBoundingInfo;\r\n serializationObject.isBlocker = this.isBlocker;\r\n serializationObject.overrideMaterialSideOrientation = this.overrideMaterialSideOrientation;\r\n\r\n // Parent\r\n if (this.parent) {\r\n this.parent._serializeAsParent(serializationObject);\r\n }\r\n\r\n // Geometry\r\n serializationObject.isUnIndexed = this.isUnIndexed;\r\n const geometry = this._geometry;\r\n if (geometry && this.subMeshes) {\r\n serializationObject.geometryUniqueId = geometry.uniqueId;\r\n serializationObject.geometryId = geometry.id;\r\n\r\n // SubMeshes\r\n serializationObject.subMeshes = [];\r\n for (let subIndex = 0; subIndex < this.subMeshes.length; subIndex++) {\r\n const subMesh = this.subMeshes[subIndex];\r\n\r\n serializationObject.subMeshes.push({\r\n materialIndex: subMesh.materialIndex,\r\n verticesStart: subMesh.verticesStart,\r\n verticesCount: subMesh.verticesCount,\r\n indexStart: subMesh.indexStart,\r\n indexCount: subMesh.indexCount,\r\n });\r\n }\r\n }\r\n\r\n // Material\r\n if (this.material) {\r\n if (!this.material.doNotSerialize) {\r\n serializationObject.materialUniqueId = this.material.uniqueId;\r\n serializationObject.materialId = this.material.id; // back compat\r\n }\r\n } else {\r\n this.material = null;\r\n serializationObject.materialUniqueId = this._scene.defaultMaterial.uniqueId;\r\n serializationObject.materialId = this._scene.defaultMaterial.id; // back compat\r\n }\r\n\r\n // Morph targets\r\n if (this.morphTargetManager) {\r\n serializationObject.morphTargetManagerId = this.morphTargetManager.uniqueId;\r\n }\r\n\r\n // Skeleton\r\n if (this.skeleton) {\r\n serializationObject.skeletonId = this.skeleton.id;\r\n serializationObject.numBoneInfluencers = this.numBoneInfluencers;\r\n }\r\n\r\n // Physics\r\n //TODO implement correct serialization for physics impostors.\r\n if (this.getScene()._getComponent(SceneComponentConstants.NAME_PHYSICSENGINE)) {\r\n const impostor = this.getPhysicsImpostor();\r\n if (impostor) {\r\n serializationObject.physicsMass = impostor.getParam(\"mass\");\r\n serializationObject.physicsFriction = impostor.getParam(\"friction\");\r\n serializationObject.physicsRestitution = impostor.getParam(\"mass\");\r\n serializationObject.physicsImpostor = impostor.type;\r\n }\r\n }\r\n\r\n // Metadata\r\n if (this.metadata) {\r\n serializationObject.metadata = this.metadata;\r\n }\r\n\r\n // Instances\r\n serializationObject.instances = [];\r\n for (let index = 0; index < this.instances.length; index++) {\r\n const instance = this.instances[index];\r\n if (instance.doNotSerialize) {\r\n continue;\r\n }\r\n\r\n const serializationInstance: any = {\r\n name: instance.name,\r\n id: instance.id,\r\n isEnabled: instance.isEnabled(false),\r\n isVisible: instance.isVisible,\r\n isPickable: instance.isPickable,\r\n checkCollisions: instance.checkCollisions,\r\n position: instance.position.asArray(),\r\n scaling: instance.scaling.asArray(),\r\n };\r\n\r\n if (instance.parent) {\r\n instance.parent._serializeAsParent(serializationInstance);\r\n }\r\n\r\n if (instance.rotationQuaternion) {\r\n serializationInstance.rotationQuaternion = instance.rotationQuaternion.asArray();\r\n } else if (instance.rotation) {\r\n serializationInstance.rotation = instance.rotation.asArray();\r\n }\r\n\r\n // Physics\r\n //TODO implement correct serialization for physics impostors.\r\n if (this.getScene()._getComponent(SceneComponentConstants.NAME_PHYSICSENGINE)) {\r\n const impostor = instance.getPhysicsImpostor();\r\n if (impostor) {\r\n serializationInstance.physicsMass = impostor.getParam(\"mass\");\r\n serializationInstance.physicsFriction = impostor.getParam(\"friction\");\r\n serializationInstance.physicsRestitution = impostor.getParam(\"mass\");\r\n serializationInstance.physicsImpostor = impostor.type;\r\n }\r\n }\r\n\r\n // Metadata\r\n if (instance.metadata) {\r\n serializationInstance.metadata = instance.metadata;\r\n }\r\n\r\n // Action Manager\r\n if (instance.actionManager) {\r\n serializationInstance.actions = instance.actionManager.serialize(instance.name);\r\n }\r\n\r\n serializationObject.instances.push(serializationInstance);\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(instance, serializationInstance);\r\n serializationInstance.ranges = instance.serializeAnimationRanges();\r\n }\r\n\r\n // Thin instances\r\n if (this._thinInstanceDataStorage.instancesCount && this._thinInstanceDataStorage.matrixData) {\r\n serializationObject.thinInstances = {\r\n instancesCount: this._thinInstanceDataStorage.instancesCount,\r\n matrixData: Array.from(this._thinInstanceDataStorage.matrixData),\r\n matrixBufferSize: this._thinInstanceDataStorage.matrixBufferSize,\r\n enablePicking: this.thinInstanceEnablePicking,\r\n };\r\n\r\n if (this._userThinInstanceBuffersStorage) {\r\n const userThinInstance: any = {\r\n data: {},\r\n sizes: {},\r\n strides: {},\r\n };\r\n\r\n for (const kind in this._userThinInstanceBuffersStorage.data) {\r\n userThinInstance.data[kind] = Array.from(this._userThinInstanceBuffersStorage.data[kind]);\r\n userThinInstance.sizes[kind] = this._userThinInstanceBuffersStorage.sizes[kind];\r\n userThinInstance.strides[kind] = this._userThinInstanceBuffersStorage.strides[kind];\r\n }\r\n\r\n serializationObject.thinInstances.userThinInstance = userThinInstance;\r\n }\r\n }\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n serializationObject.ranges = this.serializeAnimationRanges();\r\n\r\n // Layer mask\r\n serializationObject.layerMask = this.layerMask;\r\n\r\n // Alpha\r\n serializationObject.alphaIndex = this.alphaIndex;\r\n serializationObject.hasVertexAlpha = this.hasVertexAlpha;\r\n\r\n // Overlay\r\n serializationObject.overlayAlpha = this.overlayAlpha;\r\n serializationObject.overlayColor = this.overlayColor.asArray();\r\n serializationObject.renderOverlay = this.renderOverlay;\r\n\r\n // Fog\r\n serializationObject.applyFog = this.applyFog;\r\n\r\n // Action Manager\r\n if (this.actionManager) {\r\n serializationObject.actions = this.actionManager.serialize(this.name);\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /** @internal */\r\n public _syncGeometryWithMorphTargetManager() {\r\n if (!this.geometry) {\r\n return;\r\n }\r\n\r\n this._markSubMeshesAsAttributesDirty();\r\n\r\n const morphTargetManager = this._internalAbstractMeshDataInfo._morphTargetManager;\r\n if (morphTargetManager && morphTargetManager.vertexCount) {\r\n if (morphTargetManager.vertexCount !== this.getTotalVertices()) {\r\n Logger.Error(\"Mesh is incompatible with morph targets. Targets and mesh must all have the same vertices count.\");\r\n this.morphTargetManager = null;\r\n return;\r\n }\r\n\r\n if (morphTargetManager.isUsingTextureForTargets) {\r\n return;\r\n }\r\n\r\n for (let index = 0; index < morphTargetManager.numInfluencers; index++) {\r\n const morphTarget = morphTargetManager.getActiveTarget(index);\r\n\r\n const positions = morphTarget.getPositions();\r\n if (!positions) {\r\n Logger.Error(\"Invalid morph target. Target must have positions.\");\r\n return;\r\n }\r\n\r\n this.geometry.setVerticesData(VertexBuffer.PositionKind + index, positions, false, 3);\r\n\r\n const normals = morphTarget.getNormals();\r\n if (normals) {\r\n this.geometry.setVerticesData(VertexBuffer.NormalKind + index, normals, false, 3);\r\n }\r\n\r\n const tangents = morphTarget.getTangents();\r\n if (tangents) {\r\n this.geometry.setVerticesData(VertexBuffer.TangentKind + index, tangents, false, 3);\r\n }\r\n\r\n const uvs = morphTarget.getUVs();\r\n if (uvs) {\r\n this.geometry.setVerticesData(VertexBuffer.UVKind + \"_\" + index, uvs, false, 2);\r\n }\r\n }\r\n } else {\r\n let index = 0;\r\n\r\n // Positions\r\n while (this.geometry.isVerticesDataPresent(VertexBuffer.PositionKind + index)) {\r\n this.geometry.removeVerticesData(VertexBuffer.PositionKind + index);\r\n\r\n if (this.geometry.isVerticesDataPresent(VertexBuffer.NormalKind + index)) {\r\n this.geometry.removeVerticesData(VertexBuffer.NormalKind + index);\r\n }\r\n if (this.geometry.isVerticesDataPresent(VertexBuffer.TangentKind + index)) {\r\n this.geometry.removeVerticesData(VertexBuffer.TangentKind + index);\r\n }\r\n if (this.geometry.isVerticesDataPresent(VertexBuffer.UVKind + index)) {\r\n this.geometry.removeVerticesData(VertexBuffer.UVKind + \"_\" + index);\r\n }\r\n index++;\r\n }\r\n }\r\n }\r\n\r\n // Statics\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _GroundMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n throw _WarnImport(\"GroundMesh\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _GoldbergMeshParser = (parsedMesh: any, scene: Scene): GoldbergMesh => {\r\n throw _WarnImport(\"GoldbergMesh\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _LinesMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n throw _WarnImport(\"LinesMesh\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _GreasedLineMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n throw _WarnImport(\"GreasedLineMesh\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _GreasedLineRibbonMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n throw _WarnImport(\"GreasedLineRibbonMesh\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _TrailMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n throw _WarnImport(\"TrailMesh\");\r\n };\r\n\r\n /**\r\n * Returns a new Mesh object parsed from the source provided.\r\n * @param parsedMesh is the source\r\n * @param scene defines the hosting scene\r\n * @param rootUrl is the root URL to prefix the `delayLoadingFile` property with\r\n * @returns a new Mesh\r\n */\r\n public static Parse(parsedMesh: any, scene: Scene, rootUrl: string): Mesh {\r\n let mesh: Mesh;\r\n\r\n if (parsedMesh.type && parsedMesh.type === \"LinesMesh\") {\r\n mesh = Mesh._LinesMeshParser(parsedMesh, scene);\r\n } else if (parsedMesh.type && parsedMesh.type === \"GroundMesh\") {\r\n mesh = Mesh._GroundMeshParser(parsedMesh, scene);\r\n } else if (parsedMesh.type && parsedMesh.type === \"GoldbergMesh\") {\r\n mesh = Mesh._GoldbergMeshParser(parsedMesh, scene);\r\n } else if (parsedMesh.type && parsedMesh.type === \"GreasedLineMesh\") {\r\n mesh = Mesh._GreasedLineMeshParser(parsedMesh, scene);\r\n } else if (parsedMesh.type && parsedMesh.type === \"TrailMesh\") {\r\n mesh = Mesh._TrailMeshParser(parsedMesh, scene);\r\n } else {\r\n mesh = new Mesh(parsedMesh.name, scene);\r\n }\r\n mesh.id = parsedMesh.id;\r\n mesh._waitingParsedUniqueId = parsedMesh.uniqueId;\r\n\r\n if (Tags) {\r\n Tags.AddTagsTo(mesh, parsedMesh.tags);\r\n }\r\n\r\n mesh.position = Vector3.FromArray(parsedMesh.position);\r\n\r\n if (parsedMesh.metadata !== undefined) {\r\n mesh.metadata = parsedMesh.metadata;\r\n }\r\n\r\n if (parsedMesh.rotationQuaternion) {\r\n mesh.rotationQuaternion = Quaternion.FromArray(parsedMesh.rotationQuaternion);\r\n } else if (parsedMesh.rotation) {\r\n mesh.rotation = Vector3.FromArray(parsedMesh.rotation);\r\n }\r\n\r\n mesh.scaling = Vector3.FromArray(parsedMesh.scaling);\r\n\r\n if (parsedMesh.localMatrix) {\r\n mesh.setPreTransformMatrix(Matrix.FromArray(parsedMesh.localMatrix));\r\n } else if (parsedMesh.pivotMatrix) {\r\n mesh.setPivotMatrix(Matrix.FromArray(parsedMesh.pivotMatrix));\r\n }\r\n\r\n mesh.setEnabled(parsedMesh.isEnabled);\r\n mesh.isVisible = parsedMesh.isVisible;\r\n mesh.infiniteDistance = parsedMesh.infiniteDistance;\r\n mesh.alwaysSelectAsActiveMesh = !!parsedMesh.alwaysSelectAsActiveMesh;\r\n\r\n mesh.showBoundingBox = parsedMesh.showBoundingBox;\r\n mesh.showSubMeshesBoundingBox = parsedMesh.showSubMeshesBoundingBox;\r\n\r\n if (parsedMesh.applyFog !== undefined) {\r\n mesh.applyFog = parsedMesh.applyFog;\r\n }\r\n\r\n if (parsedMesh.pickable !== undefined) {\r\n mesh.isPickable = parsedMesh.pickable;\r\n }\r\n\r\n if (parsedMesh.alphaIndex !== undefined) {\r\n mesh.alphaIndex = parsedMesh.alphaIndex;\r\n }\r\n\r\n mesh.receiveShadows = parsedMesh.receiveShadows;\r\n\r\n if (parsedMesh.billboardMode !== undefined) {\r\n mesh.billboardMode = parsedMesh.billboardMode;\r\n }\r\n\r\n if (parsedMesh.visibility !== undefined) {\r\n mesh.visibility = parsedMesh.visibility;\r\n }\r\n\r\n mesh.checkCollisions = parsedMesh.checkCollisions;\r\n mesh.doNotSyncBoundingInfo = !!parsedMesh.doNotSyncBoundingInfo;\r\n\r\n if (parsedMesh.ellipsoid) {\r\n mesh.ellipsoid = Vector3.FromArray(parsedMesh.ellipsoid);\r\n }\r\n\r\n if (parsedMesh.ellipsoidOffset) {\r\n mesh.ellipsoidOffset = Vector3.FromArray(parsedMesh.ellipsoidOffset);\r\n }\r\n\r\n if (parsedMesh.overrideMaterialSideOrientation !== undefined) {\r\n mesh.overrideMaterialSideOrientation = parsedMesh.overrideMaterialSideOrientation;\r\n }\r\n\r\n if (parsedMesh.isBlocker !== undefined) {\r\n mesh.isBlocker = parsedMesh.isBlocker;\r\n }\r\n\r\n mesh._shouldGenerateFlatShading = parsedMesh.useFlatShading;\r\n\r\n // freezeWorldMatrix\r\n if (parsedMesh.freezeWorldMatrix) {\r\n mesh._waitingData.freezeWorldMatrix = parsedMesh.freezeWorldMatrix;\r\n }\r\n\r\n // Parent\r\n if (parsedMesh.parentId !== undefined) {\r\n mesh._waitingParentId = parsedMesh.parentId;\r\n }\r\n\r\n if (parsedMesh.parentInstanceIndex !== undefined) {\r\n mesh._waitingParentInstanceIndex = parsedMesh.parentInstanceIndex;\r\n }\r\n\r\n // Actions\r\n if (parsedMesh.actions !== undefined) {\r\n mesh._waitingData.actions = parsedMesh.actions;\r\n }\r\n\r\n // Overlay\r\n if (parsedMesh.overlayAlpha !== undefined) {\r\n mesh.overlayAlpha = parsedMesh.overlayAlpha;\r\n }\r\n\r\n if (parsedMesh.overlayColor !== undefined) {\r\n mesh.overlayColor = Color3.FromArray(parsedMesh.overlayColor);\r\n }\r\n\r\n if (parsedMesh.renderOverlay !== undefined) {\r\n mesh.renderOverlay = parsedMesh.renderOverlay;\r\n }\r\n\r\n // Geometry\r\n mesh.isUnIndexed = !!parsedMesh.isUnIndexed;\r\n mesh.hasVertexAlpha = parsedMesh.hasVertexAlpha;\r\n\r\n if (parsedMesh.delayLoadingFile) {\r\n mesh.delayLoadState = Constants.DELAYLOADSTATE_NOTLOADED;\r\n mesh.delayLoadingFile = rootUrl + parsedMesh.delayLoadingFile;\r\n mesh.buildBoundingInfo(Vector3.FromArray(parsedMesh.boundingBoxMinimum), Vector3.FromArray(parsedMesh.boundingBoxMaximum));\r\n\r\n if (parsedMesh._binaryInfo) {\r\n mesh._binaryInfo = parsedMesh._binaryInfo;\r\n }\r\n\r\n mesh._delayInfo = [];\r\n if (parsedMesh.hasUVs) {\r\n mesh._delayInfo.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (parsedMesh.hasUVs2) {\r\n mesh._delayInfo.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (parsedMesh.hasUVs3) {\r\n mesh._delayInfo.push(VertexBuffer.UV3Kind);\r\n }\r\n\r\n if (parsedMesh.hasUVs4) {\r\n mesh._delayInfo.push(VertexBuffer.UV4Kind);\r\n }\r\n\r\n if (parsedMesh.hasUVs5) {\r\n mesh._delayInfo.push(VertexBuffer.UV5Kind);\r\n }\r\n\r\n if (parsedMesh.hasUVs6) {\r\n mesh._delayInfo.push(VertexBuffer.UV6Kind);\r\n }\r\n\r\n if (parsedMesh.hasColors) {\r\n mesh._delayInfo.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (parsedMesh.hasMatricesIndices) {\r\n mesh._delayInfo.push(VertexBuffer.MatricesIndicesKind);\r\n }\r\n\r\n if (parsedMesh.hasMatricesWeights) {\r\n mesh._delayInfo.push(VertexBuffer.MatricesWeightsKind);\r\n }\r\n\r\n mesh._delayLoadingFunction = Geometry._ImportGeometry;\r\n\r\n if (SceneLoaderFlags.ForceFullSceneLoadingForIncremental) {\r\n mesh._checkDelayState();\r\n }\r\n } else {\r\n Geometry._ImportGeometry(parsedMesh, mesh);\r\n }\r\n\r\n // Material\r\n if (parsedMesh.materialUniqueId) {\r\n mesh._waitingMaterialId = parsedMesh.materialUniqueId;\r\n } else if (parsedMesh.materialId) {\r\n mesh._waitingMaterialId = parsedMesh.materialId;\r\n }\r\n\r\n // Morph targets\r\n if (parsedMesh.morphTargetManagerId > -1) {\r\n mesh.morphTargetManager = scene.getMorphTargetManagerById(parsedMesh.morphTargetManagerId);\r\n }\r\n\r\n // Skeleton\r\n if (parsedMesh.skeletonId !== undefined && parsedMesh.skeletonId !== null) {\r\n mesh.skeleton = scene.getLastSkeletonById(parsedMesh.skeletonId);\r\n if (parsedMesh.numBoneInfluencers) {\r\n mesh.numBoneInfluencers = parsedMesh.numBoneInfluencers;\r\n }\r\n }\r\n\r\n // Animations\r\n if (parsedMesh.animations) {\r\n for (let animationIndex = 0; animationIndex < parsedMesh.animations.length; animationIndex++) {\r\n const parsedAnimation = parsedMesh.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n mesh.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n Node.ParseAnimationRanges(mesh, parsedMesh, scene);\r\n }\r\n\r\n if (parsedMesh.autoAnimate) {\r\n scene.beginAnimation(mesh, parsedMesh.autoAnimateFrom, parsedMesh.autoAnimateTo, parsedMesh.autoAnimateLoop, parsedMesh.autoAnimateSpeed || 1.0);\r\n }\r\n\r\n // Layer Mask\r\n if (parsedMesh.layerMask && !isNaN(parsedMesh.layerMask)) {\r\n mesh.layerMask = Math.abs(parseInt(parsedMesh.layerMask));\r\n } else {\r\n mesh.layerMask = 0x0fffffff;\r\n }\r\n\r\n // Physics\r\n if (parsedMesh.physicsImpostor) {\r\n Mesh._PhysicsImpostorParser(scene, mesh, parsedMesh);\r\n }\r\n\r\n // Levels\r\n if (parsedMesh.lodMeshIds) {\r\n mesh._waitingData.lods = {\r\n ids: parsedMesh.lodMeshIds,\r\n distances: parsedMesh.lodDistances ? parsedMesh.lodDistances : null,\r\n coverages: parsedMesh.lodCoverages ? parsedMesh.lodCoverages : null,\r\n };\r\n }\r\n\r\n // Instances\r\n if (parsedMesh.instances) {\r\n for (let index = 0; index < parsedMesh.instances.length; index++) {\r\n const parsedInstance = parsedMesh.instances[index];\r\n const instance = mesh.createInstance(parsedInstance.name);\r\n\r\n if (parsedInstance.id) {\r\n instance.id = parsedInstance.id;\r\n }\r\n\r\n if (Tags) {\r\n if (parsedInstance.tags) {\r\n Tags.AddTagsTo(instance, parsedInstance.tags);\r\n } else {\r\n Tags.AddTagsTo(instance, parsedMesh.tags);\r\n }\r\n }\r\n\r\n instance.position = Vector3.FromArray(parsedInstance.position);\r\n\r\n if (parsedInstance.metadata !== undefined) {\r\n instance.metadata = parsedInstance.metadata;\r\n }\r\n\r\n if (parsedInstance.parentId !== undefined) {\r\n instance._waitingParentId = parsedInstance.parentId;\r\n }\r\n\r\n if (parsedInstance.parentInstanceIndex !== undefined) {\r\n instance._waitingParentInstanceIndex = parsedInstance.parentInstanceIndex;\r\n }\r\n\r\n if (parsedInstance.isEnabled !== undefined && parsedInstance.isEnabled !== null) {\r\n instance.setEnabled(parsedInstance.isEnabled);\r\n }\r\n\r\n if (parsedInstance.isVisible !== undefined && parsedInstance.isVisible !== null) {\r\n instance.isVisible = parsedInstance.isVisible;\r\n }\r\n\r\n if (parsedInstance.isPickable !== undefined && parsedInstance.isPickable !== null) {\r\n instance.isPickable = parsedInstance.isPickable;\r\n }\r\n\r\n if (parsedInstance.rotationQuaternion) {\r\n instance.rotationQuaternion = Quaternion.FromArray(parsedInstance.rotationQuaternion);\r\n } else if (parsedInstance.rotation) {\r\n instance.rotation = Vector3.FromArray(parsedInstance.rotation);\r\n }\r\n\r\n instance.scaling = Vector3.FromArray(parsedInstance.scaling);\r\n\r\n if (parsedInstance.checkCollisions != undefined && parsedInstance.checkCollisions != null) {\r\n instance.checkCollisions = parsedInstance.checkCollisions;\r\n }\r\n if (parsedInstance.pickable != undefined && parsedInstance.pickable != null) {\r\n instance.isPickable = parsedInstance.pickable;\r\n }\r\n if (parsedInstance.showBoundingBox != undefined && parsedInstance.showBoundingBox != null) {\r\n instance.showBoundingBox = parsedInstance.showBoundingBox;\r\n }\r\n if (parsedInstance.showSubMeshesBoundingBox != undefined && parsedInstance.showSubMeshesBoundingBox != null) {\r\n instance.showSubMeshesBoundingBox = parsedInstance.showSubMeshesBoundingBox;\r\n }\r\n if (parsedInstance.alphaIndex != undefined && parsedInstance.showSubMeshesBoundingBox != null) {\r\n instance.alphaIndex = parsedInstance.alphaIndex;\r\n }\r\n\r\n // Physics\r\n if (parsedInstance.physicsImpostor) {\r\n Mesh._PhysicsImpostorParser(scene, instance, parsedInstance);\r\n }\r\n\r\n // Actions\r\n if (parsedInstance.actions !== undefined) {\r\n instance._waitingData.actions = parsedInstance.actions;\r\n }\r\n\r\n // Animation\r\n if (parsedInstance.animations) {\r\n for (let animationIndex = 0; animationIndex < parsedInstance.animations.length; animationIndex++) {\r\n const parsedAnimation = parsedInstance.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n instance.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n Node.ParseAnimationRanges(instance, parsedInstance, scene);\r\n\r\n if (parsedInstance.autoAnimate) {\r\n scene.beginAnimation(\r\n instance,\r\n parsedInstance.autoAnimateFrom,\r\n parsedInstance.autoAnimateTo,\r\n parsedInstance.autoAnimateLoop,\r\n parsedInstance.autoAnimateSpeed || 1.0\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Thin instances\r\n if (parsedMesh.thinInstances) {\r\n const thinInstances = parsedMesh.thinInstances;\r\n\r\n mesh.thinInstanceEnablePicking = !!thinInstances.enablePicking;\r\n\r\n if (thinInstances.matrixData) {\r\n mesh.thinInstanceSetBuffer(\"matrix\", new Float32Array(thinInstances.matrixData), 16, false);\r\n\r\n mesh._thinInstanceDataStorage.matrixBufferSize = thinInstances.matrixBufferSize;\r\n mesh._thinInstanceDataStorage.instancesCount = thinInstances.instancesCount;\r\n } else {\r\n mesh._thinInstanceDataStorage.matrixBufferSize = thinInstances.matrixBufferSize;\r\n }\r\n\r\n if (parsedMesh.thinInstances.userThinInstance) {\r\n const userThinInstance = parsedMesh.thinInstances.userThinInstance;\r\n\r\n for (const kind in userThinInstance.data) {\r\n mesh.thinInstanceSetBuffer(kind, new Float32Array(userThinInstance.data[kind]), userThinInstance.strides[kind], false);\r\n mesh._userThinInstanceBuffersStorage.sizes[kind] = userThinInstance.sizes[kind];\r\n }\r\n }\r\n }\r\n\r\n return mesh;\r\n }\r\n\r\n // Skeletons\r\n\r\n /**\r\n * Prepare internal position array for software CPU skinning\r\n * @returns original positions used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh\r\n */\r\n public setPositionsForCPUSkinning(): Nullable {\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n if (!internalDataInfo._sourcePositions) {\r\n const source = this.getVerticesData(VertexBuffer.PositionKind);\r\n if (!source) {\r\n return internalDataInfo._sourcePositions;\r\n }\r\n\r\n internalDataInfo._sourcePositions = new Float32Array(source);\r\n\r\n if (!this.isVertexBufferUpdatable(VertexBuffer.PositionKind)) {\r\n this.setVerticesData(VertexBuffer.PositionKind, source, true);\r\n }\r\n }\r\n return internalDataInfo._sourcePositions;\r\n }\r\n\r\n /**\r\n * Prepare internal normal array for software CPU skinning\r\n * @returns original normals used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh.\r\n */\r\n public setNormalsForCPUSkinning(): Nullable {\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n\r\n if (!internalDataInfo._sourceNormals) {\r\n const source = this.getVerticesData(VertexBuffer.NormalKind);\r\n\r\n if (!source) {\r\n return internalDataInfo._sourceNormals;\r\n }\r\n\r\n internalDataInfo._sourceNormals = new Float32Array(source);\r\n\r\n if (!this.isVertexBufferUpdatable(VertexBuffer.NormalKind)) {\r\n this.setVerticesData(VertexBuffer.NormalKind, source, true);\r\n }\r\n }\r\n return internalDataInfo._sourceNormals;\r\n }\r\n\r\n /**\r\n * Updates the vertex buffer by applying transformation from the bones\r\n * @param skeleton defines the skeleton to apply to current mesh\r\n * @returns the current mesh\r\n */\r\n public applySkeleton(skeleton: Skeleton): Mesh {\r\n if (!this.geometry) {\r\n return this;\r\n }\r\n\r\n if (this.geometry._softwareSkinningFrameId == this.getScene().getFrameId()) {\r\n return this;\r\n }\r\n\r\n this.geometry._softwareSkinningFrameId = this.getScene().getFrameId();\r\n\r\n if (!this.isVerticesDataPresent(VertexBuffer.PositionKind)) {\r\n return this;\r\n }\r\n if (!this.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind)) {\r\n return this;\r\n }\r\n if (!this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) {\r\n return this;\r\n }\r\n\r\n const hasNormals = this.isVerticesDataPresent(VertexBuffer.NormalKind);\r\n\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n\r\n if (!internalDataInfo._sourcePositions) {\r\n const submeshes = this.subMeshes.slice();\r\n this.setPositionsForCPUSkinning();\r\n this.subMeshes = submeshes;\r\n }\r\n\r\n if (hasNormals && !internalDataInfo._sourceNormals) {\r\n this.setNormalsForCPUSkinning();\r\n }\r\n\r\n // positionsData checks for not being Float32Array will only pass at most once\r\n let positionsData = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (!positionsData) {\r\n return this;\r\n }\r\n\r\n if (!(positionsData instanceof Float32Array)) {\r\n positionsData = new Float32Array(positionsData);\r\n }\r\n\r\n // normalsData checks for not being Float32Array will only pass at most once\r\n let normalsData = this.getVerticesData(VertexBuffer.NormalKind);\r\n\r\n if (hasNormals) {\r\n if (!normalsData) {\r\n return this;\r\n }\r\n\r\n if (!(normalsData instanceof Float32Array)) {\r\n normalsData = new Float32Array(normalsData);\r\n }\r\n }\r\n\r\n const matricesIndicesData = this.getVerticesData(VertexBuffer.MatricesIndicesKind);\r\n const matricesWeightsData = this.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n\r\n if (!matricesWeightsData || !matricesIndicesData) {\r\n return this;\r\n }\r\n\r\n const needExtras = this.numBoneInfluencers > 4;\r\n const matricesIndicesExtraData = needExtras ? this.getVerticesData(VertexBuffer.MatricesIndicesExtraKind) : null;\r\n const matricesWeightsExtraData = needExtras ? this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind) : null;\r\n\r\n const skeletonMatrices = skeleton.getTransformMatrices(this);\r\n\r\n const tempVector3 = Vector3.Zero();\r\n const finalMatrix = new Matrix();\r\n const tempMatrix = new Matrix();\r\n\r\n let matWeightIdx = 0;\r\n let inf: number;\r\n for (let index = 0; index < positionsData.length; index += 3, matWeightIdx += 4) {\r\n let weight: number;\r\n for (inf = 0; inf < 4; inf++) {\r\n weight = matricesWeightsData[matWeightIdx + inf];\r\n if (weight > 0) {\r\n Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesData[matWeightIdx + inf] * 16), weight, tempMatrix);\r\n finalMatrix.addToSelf(tempMatrix);\r\n }\r\n }\r\n if (needExtras) {\r\n for (inf = 0; inf < 4; inf++) {\r\n weight = matricesWeightsExtraData![matWeightIdx + inf];\r\n if (weight > 0) {\r\n Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesExtraData![matWeightIdx + inf] * 16), weight, tempMatrix);\r\n finalMatrix.addToSelf(tempMatrix);\r\n }\r\n }\r\n }\r\n\r\n Vector3.TransformCoordinatesFromFloatsToRef(\r\n internalDataInfo._sourcePositions![index],\r\n internalDataInfo._sourcePositions![index + 1],\r\n internalDataInfo._sourcePositions![index + 2],\r\n finalMatrix,\r\n tempVector3\r\n );\r\n tempVector3.toArray(positionsData, index);\r\n\r\n if (hasNormals) {\r\n Vector3.TransformNormalFromFloatsToRef(\r\n internalDataInfo._sourceNormals![index],\r\n internalDataInfo._sourceNormals![index + 1],\r\n internalDataInfo._sourceNormals![index + 2],\r\n finalMatrix,\r\n tempVector3\r\n );\r\n tempVector3.toArray(normalsData!, index);\r\n }\r\n\r\n finalMatrix.reset();\r\n }\r\n\r\n this.updateVerticesData(VertexBuffer.PositionKind, positionsData);\r\n if (hasNormals) {\r\n this.updateVerticesData(VertexBuffer.NormalKind, normalsData!);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // Tools\r\n\r\n /**\r\n * Returns an object containing a min and max Vector3 which are the minimum and maximum vectors of each mesh bounding box from the passed array, in the world coordinates\r\n * @param meshes defines the list of meshes to scan\r\n * @returns an object `{min:` Vector3`, max:` Vector3`}`\r\n */\r\n public static MinMax(meshes: AbstractMesh[]): { min: Vector3; max: Vector3 } {\r\n let minVector: Nullable = null;\r\n let maxVector: Nullable = null;\r\n\r\n meshes.forEach(function (mesh) {\r\n const boundingInfo = mesh.getBoundingInfo();\r\n\r\n const boundingBox = boundingInfo.boundingBox;\r\n if (!minVector || !maxVector) {\r\n minVector = boundingBox.minimumWorld;\r\n maxVector = boundingBox.maximumWorld;\r\n } else {\r\n minVector.minimizeInPlace(boundingBox.minimumWorld);\r\n maxVector.maximizeInPlace(boundingBox.maximumWorld);\r\n }\r\n });\r\n\r\n if (!minVector || !maxVector) {\r\n return {\r\n min: Vector3.Zero(),\r\n max: Vector3.Zero(),\r\n };\r\n }\r\n\r\n return {\r\n min: minVector,\r\n max: maxVector,\r\n };\r\n }\r\n\r\n /**\r\n * Returns the center of the `{min:` Vector3`, max:` Vector3`}` or the center of MinMax vector3 computed from a mesh array\r\n * @param meshesOrMinMaxVector could be an array of meshes or a `{min:` Vector3`, max:` Vector3`}` object\r\n * @returns a vector3\r\n */\r\n public static Center(meshesOrMinMaxVector: { min: Vector3; max: Vector3 } | AbstractMesh[]): Vector3 {\r\n const minMaxVector = meshesOrMinMaxVector instanceof Array ? Mesh.MinMax(meshesOrMinMaxVector) : meshesOrMinMaxVector;\r\n return Vector3.Center(minMaxVector.min, minMaxVector.max);\r\n }\r\n\r\n /**\r\n * Merge the array of meshes into a single mesh for performance reasons.\r\n * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes.\r\n * @param disposeSource when true (default), dispose of the vertices from the source meshes.\r\n * @param allow32BitsIndices when the sum of the vertices > 64k, this must be set to true.\r\n * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted.\r\n * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes.\r\n * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes.\r\n * @returns a new mesh\r\n */\r\n public static MergeMeshes(\r\n meshes: Array,\r\n disposeSource = true,\r\n allow32BitsIndices?: boolean,\r\n meshSubclass?: Mesh,\r\n subdivideWithSubMeshes?: boolean,\r\n multiMultiMaterials?: boolean\r\n ) {\r\n return runCoroutineSync(Mesh._MergeMeshesCoroutine(meshes, disposeSource, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials, false));\r\n }\r\n\r\n /**\r\n * Merge the array of meshes into a single mesh for performance reasons.\r\n * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes.\r\n * @param disposeSource when true (default), dispose of the vertices from the source meshes.\r\n * @param allow32BitsIndices when the sum of the vertices > 64k, this must be set to true.\r\n * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted.\r\n * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes.\r\n * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes.\r\n * @returns a new mesh\r\n */\r\n public static MergeMeshesAsync(\r\n meshes: Array,\r\n disposeSource = true,\r\n allow32BitsIndices?: boolean,\r\n meshSubclass?: Mesh,\r\n subdivideWithSubMeshes?: boolean,\r\n multiMultiMaterials?: boolean\r\n ) {\r\n return runCoroutineAsync(\r\n Mesh._MergeMeshesCoroutine(meshes, disposeSource, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials, true),\r\n createYieldingScheduler()\r\n );\r\n }\r\n\r\n private static *_MergeMeshesCoroutine(\r\n meshes: Array,\r\n disposeSource = true,\r\n allow32BitsIndices: boolean | undefined,\r\n meshSubclass: Mesh | undefined,\r\n subdivideWithSubMeshes: boolean | undefined,\r\n multiMultiMaterials: boolean | undefined,\r\n isAsync: boolean\r\n ): Coroutine> {\r\n // Remove any null/undefined entries from the mesh array\r\n meshes = meshes.filter(Boolean);\r\n\r\n if (meshes.length === 0) {\r\n return null;\r\n }\r\n\r\n let index: number;\r\n if (!allow32BitsIndices) {\r\n let totalVertices = 0;\r\n\r\n // Counting vertices\r\n for (index = 0; index < meshes.length; index++) {\r\n totalVertices += meshes[index].getTotalVertices();\r\n\r\n if (totalVertices >= 65536) {\r\n Logger.Warn(\"Cannot merge meshes because resulting mesh will have more than 65536 vertices. Please use allow32BitsIndices = true to use 32 bits indices\");\r\n return null;\r\n }\r\n }\r\n }\r\n if (multiMultiMaterials) {\r\n subdivideWithSubMeshes = false;\r\n }\r\n const materialArray: Array = new Array();\r\n const materialIndexArray: Array = new Array();\r\n // Merge\r\n const indiceArray: Array = new Array();\r\n const currentOverrideMaterialSideOrientation = meshes[0].overrideMaterialSideOrientation;\r\n\r\n for (index = 0; index < meshes.length; index++) {\r\n const mesh = meshes[index];\r\n if (mesh.isAnInstance) {\r\n Logger.Warn(\"Cannot merge instance meshes.\");\r\n return null;\r\n }\r\n\r\n if (currentOverrideMaterialSideOrientation !== mesh.overrideMaterialSideOrientation) {\r\n Logger.Warn(\"Cannot merge meshes with different overrideMaterialSideOrientation values.\");\r\n return null;\r\n }\r\n\r\n if (subdivideWithSubMeshes) {\r\n indiceArray.push(mesh.getTotalIndices());\r\n }\r\n\r\n if (multiMultiMaterials) {\r\n if (mesh.material) {\r\n const material = mesh.material;\r\n if (material instanceof MultiMaterial) {\r\n for (let matIndex = 0; matIndex < material.subMaterials.length; matIndex++) {\r\n if (materialArray.indexOf(material.subMaterials[matIndex]) < 0) {\r\n materialArray.push(material.subMaterials[matIndex]);\r\n }\r\n }\r\n for (let subIndex = 0; subIndex < mesh.subMeshes.length; subIndex++) {\r\n materialIndexArray.push(materialArray.indexOf(material.subMaterials[mesh.subMeshes[subIndex].materialIndex]));\r\n indiceArray.push(mesh.subMeshes[subIndex].indexCount);\r\n }\r\n } else {\r\n if (materialArray.indexOf(material) < 0) {\r\n materialArray.push(material);\r\n }\r\n for (let subIndex = 0; subIndex < mesh.subMeshes.length; subIndex++) {\r\n materialIndexArray.push(materialArray.indexOf(material));\r\n indiceArray.push(mesh.subMeshes[subIndex].indexCount);\r\n }\r\n }\r\n } else {\r\n for (let subIndex = 0; subIndex < mesh.subMeshes.length; subIndex++) {\r\n materialIndexArray.push(0);\r\n indiceArray.push(mesh.subMeshes[subIndex].indexCount);\r\n }\r\n }\r\n }\r\n }\r\n\r\n const source = meshes[0];\r\n\r\n const getVertexDataFromMesh = (mesh: Mesh) => {\r\n const wm = mesh.computeWorldMatrix(true);\r\n const vertexData = VertexData.ExtractFromMesh(mesh, false, false);\r\n return { vertexData, transform: wm };\r\n };\r\n\r\n const { vertexData: sourceVertexData, transform: sourceTransform } = getVertexDataFromMesh(source);\r\n if (isAsync) {\r\n yield;\r\n }\r\n\r\n const meshVertexDatas = new Array<{ vertexData: VertexData; transform?: Matrix }>(meshes.length - 1);\r\n for (let i = 1; i < meshes.length; i++) {\r\n meshVertexDatas[i - 1] = getVertexDataFromMesh(meshes[i]);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n const mergeCoroutine = sourceVertexData._mergeCoroutine(sourceTransform, meshVertexDatas, allow32BitsIndices, isAsync, !disposeSource);\r\n let mergeCoroutineStep = mergeCoroutine.next();\r\n while (!mergeCoroutineStep.done) {\r\n if (isAsync) {\r\n yield;\r\n }\r\n mergeCoroutineStep = mergeCoroutine.next();\r\n }\r\n const vertexData = mergeCoroutineStep.value;\r\n\r\n if (!meshSubclass) {\r\n meshSubclass = new Mesh(source.name + \"_merged\", source.getScene());\r\n }\r\n\r\n const applyToCoroutine = vertexData._applyToCoroutine(meshSubclass, undefined, isAsync);\r\n let applyToCoroutineStep = applyToCoroutine.next();\r\n while (!applyToCoroutineStep.done) {\r\n if (isAsync) {\r\n yield;\r\n }\r\n applyToCoroutineStep = applyToCoroutine.next();\r\n }\r\n\r\n // Setting properties\r\n meshSubclass.checkCollisions = source.checkCollisions;\r\n meshSubclass.overrideMaterialSideOrientation = source.overrideMaterialSideOrientation;\r\n\r\n // Cleaning\r\n if (disposeSource) {\r\n for (index = 0; index < meshes.length; index++) {\r\n meshes[index].dispose();\r\n }\r\n }\r\n\r\n // Subdivide\r\n if (subdivideWithSubMeshes || multiMultiMaterials) {\r\n //-- removal of global submesh\r\n meshSubclass.releaseSubMeshes();\r\n index = 0;\r\n let offset = 0;\r\n\r\n //-- apply subdivision according to index table\r\n while (index < indiceArray.length) {\r\n SubMesh.CreateFromIndices(0, offset, indiceArray[index], meshSubclass, undefined, false);\r\n offset += indiceArray[index];\r\n index++;\r\n }\r\n\r\n for (const subMesh of meshSubclass.subMeshes) {\r\n subMesh.refreshBoundingInfo();\r\n }\r\n\r\n meshSubclass.computeWorldMatrix(true);\r\n }\r\n\r\n if (multiMultiMaterials) {\r\n const newMultiMaterial = new MultiMaterial(source.name + \"_merged\", source.getScene());\r\n newMultiMaterial.subMaterials = materialArray;\r\n for (let subIndex = 0; subIndex < meshSubclass.subMeshes.length; subIndex++) {\r\n meshSubclass.subMeshes[subIndex].materialIndex = materialIndexArray[subIndex];\r\n }\r\n meshSubclass.material = newMultiMaterial;\r\n } else {\r\n meshSubclass.material = source.material;\r\n }\r\n\r\n return meshSubclass;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public addInstance(instance: InstancedMesh) {\r\n instance._indexInSourceMeshInstanceArray = this.instances.length;\r\n this.instances.push(instance);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public removeInstance(instance: InstancedMesh) {\r\n // Remove from mesh\r\n const index = instance._indexInSourceMeshInstanceArray;\r\n if (index != -1) {\r\n if (index !== this.instances.length - 1) {\r\n const last = this.instances[this.instances.length - 1];\r\n this.instances[index] = last;\r\n last._indexInSourceMeshInstanceArray = index;\r\n }\r\n\r\n instance._indexInSourceMeshInstanceArray = -1;\r\n this.instances.pop();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _shouldConvertRHS() {\r\n return this.overrideMaterialSideOrientation === Material.CounterClockWiseSideOrientation;\r\n }\r\n\r\n /** @internal */\r\n public _getRenderingFillMode(fillMode: number): number {\r\n const scene = this.getScene();\r\n\r\n if (scene.forcePointsCloud) return Material.PointFillMode;\r\n\r\n if (scene.forceWireframe) return Material.WireFrameFillMode;\r\n\r\n return this.overrideRenderingFillMode ?? fillMode;\r\n }\r\n\r\n // deprecated methods\r\n /**\r\n * Sets the mesh material by the material or multiMaterial `id` property\r\n * @param id is a string identifying the material or the multiMaterial\r\n * @returns the current mesh\r\n * @deprecated Please use MeshBuilder instead Please use setMaterialById instead\r\n */\r\n public setMaterialByID(id: string): Mesh {\r\n return this.setMaterialById(id);\r\n }\r\n\r\n /**\r\n * Creates a ribbon mesh.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\r\n * @param name defines the name of the mesh to create\r\n * @param pathArray is a required array of paths, what are each an array of successive Vector3. The pathArray parameter depicts the ribbon geometry.\r\n * @param closeArray creates a seam between the first and the last paths of the path array (default is false)\r\n * @param closePath creates a seam between the first and the last points of each path of the path array\r\n * @param offset is taken in account only if the `pathArray` is containing a single path\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @param instance defines an instance of an existing Ribbon object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#ribbon)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateRibbon(\r\n name: string,\r\n pathArray: Vector3[][],\r\n closeArray: boolean,\r\n closePath: boolean,\r\n offset: number,\r\n scene?: Scene,\r\n updatable?: boolean,\r\n sideOrientation?: number,\r\n instance?: Mesh\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a plane polygonal mesh. By default, this is a disc.\r\n * @param name defines the name of the mesh to create\r\n * @param radius sets the radius size (float) of the polygon (default 0.5)\r\n * @param tessellation sets the number of polygon sides (positive integer, default 64). So a tessellation valued to 3 will build a triangle, to 4 a square, etc\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateDisc(name: string, radius: number, tessellation: number, scene: Nullable, updatable?: boolean, sideOrientation?: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a box mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param size sets the size (float) of each box side (default 1)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateBox(name: string, size: number, scene: Nullable, updatable?: boolean, sideOrientation?: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a sphere mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param segments sets the sphere number of horizontal stripes (positive integer, default 32)\r\n * @param diameter sets the diameter size (float) of the sphere (default 1)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateSphere(name: string, segments: number, diameter: number, scene?: Scene, updatable?: boolean, sideOrientation?: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a hemisphere mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param segments sets the sphere number of horizontal stripes (positive integer, default 32)\r\n * @param diameter sets the diameter size (float) of the sphere (default 1)\r\n * @param scene defines the hosting scene\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateHemisphere(name: string, segments: number, diameter: number, scene?: Scene): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a cylinder or a cone mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param height sets the height size (float) of the cylinder/cone (float, default 2)\r\n * @param diameterTop set the top cap diameter (floats, default 1)\r\n * @param diameterBottom set the bottom cap diameter (floats, default 1). This value can't be zero\r\n * @param tessellation sets the number of cylinder sides (positive integer, default 24). Set it to 3 to get a prism for instance\r\n * @param subdivisions sets the number of rings along the cylinder height (positive integer, default 1)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateCylinder(\r\n name: string,\r\n height: number,\r\n diameterTop: number,\r\n diameterBottom: number,\r\n tessellation: number,\r\n subdivisions: any,\r\n scene?: Scene,\r\n updatable?: any,\r\n sideOrientation?: number\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n // Torus (Code from SharpDX.org)\r\n /**\r\n * Creates a torus mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param diameter sets the diameter size (float) of the torus (default 1)\r\n * @param thickness sets the diameter size of the tube of the torus (float, default 0.5)\r\n * @param tessellation sets the number of torus sides (positive integer, default 16)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateTorus(name: string, diameter: number, thickness: number, tessellation: number, scene?: Scene, updatable?: boolean, sideOrientation?: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a torus knot mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param radius sets the global radius size (float) of the torus knot (default 2)\r\n * @param tube sets the diameter size of the tube of the torus (float, default 0.5)\r\n * @param radialSegments sets the number of sides on each tube segments (positive integer, default 32)\r\n * @param tubularSegments sets the number of tubes to decompose the knot into (positive integer, default 32)\r\n * @param p the number of windings on X axis (positive integers, default 2)\r\n * @param q the number of windings on Y axis (positive integers, default 3)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateTorusKnot(\r\n name: string,\r\n radius: number,\r\n tube: number,\r\n radialSegments: number,\r\n tubularSegments: number,\r\n p: number,\r\n q: number,\r\n scene?: Scene,\r\n updatable?: boolean,\r\n sideOrientation?: number\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a line mesh..\r\n * @param name defines the name of the mesh to create\r\n * @param points is an array successive Vector3\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines).\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateLines(name: string, points: Vector3[], scene: Nullable, updatable: boolean, instance?: Nullable): LinesMesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a dashed line mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param points is an array successive Vector3\r\n * @param dashSize is the size of the dashes relatively the dash number (positive float, default 3)\r\n * @param gapSize is the size of the gap between two successive dashes relatively the dash number (positive float, default 1)\r\n * @param dashNb is the intended total number of dashes (positive integer, default 200)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateDashedLines(\r\n name: string,\r\n points: Vector3[],\r\n dashSize: number,\r\n gapSize: number,\r\n dashNb: number,\r\n scene: Nullable,\r\n updatable?: boolean,\r\n instance?: LinesMesh\r\n ): LinesMesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a polygon mesh.Please consider using the same method from the MeshBuilder class instead\r\n * The polygon's shape will depend on the input parameters and is constructed parallel to a ground mesh.\r\n * The parameter `shape` is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors.\r\n * You can set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created.\r\n * Remember you can only change the shape positions, not their number when updating a polygon.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#non-regular-polygon\r\n * @param name defines the name of the mesh to create\r\n * @param shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors\r\n * @param scene defines the hosting scene\r\n * @param holes is a required array of arrays of successive Vector3 used to defines holes in the polygon\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @param earcutInjection can be used to inject your own earcut reference\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreatePolygon(name: string, shape: Vector3[], scene: Scene, holes?: Vector3[][], updatable?: boolean, sideOrientation?: number, earcutInjection?: any): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates an extruded polygon mesh, with depth in the Y direction..\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-non-regular-polygon\r\n * @param name defines the name of the mesh to create\r\n * @param shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors\r\n * @param depth defines the height of extrusion\r\n * @param scene defines the hosting scene\r\n * @param holes is a required array of arrays of successive Vector3 used to defines holes in the polygon\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @param earcutInjection can be used to inject your own earcut reference\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static ExtrudePolygon(\r\n name: string,\r\n shape: Vector3[],\r\n depth: number,\r\n scene: Scene,\r\n holes?: Vector3[][],\r\n updatable?: boolean,\r\n sideOrientation?: number,\r\n earcutInjection?: any\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates an extruded shape mesh.\r\n * The extrusion is a parametric shape. It has no predefined shape. Its final shape will depend on the input parameters.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes\r\n * @param name defines the name of the mesh to create\r\n * @param shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis\r\n * @param path is a required array of successive Vector3. This is the axis curve the shape is extruded along\r\n * @param scale is the value to scale the shape\r\n * @param rotation is the angle value to rotate the shape each step (each path point), from the former step (so rotation added each step) along the curve\r\n * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @param instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#extruded-shape)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static ExtrudeShape(\r\n name: string,\r\n shape: Vector3[],\r\n path: Vector3[],\r\n scale: number,\r\n rotation: number,\r\n cap: number,\r\n scene: Nullable,\r\n updatable?: boolean,\r\n sideOrientation?: number,\r\n instance?: Mesh\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates an custom extruded shape mesh.\r\n * The custom extrusion is a parametric shape.\r\n * It has no predefined shape. Its final shape will depend on the input parameters.\r\n *\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes\r\n * @param name defines the name of the mesh to create\r\n * @param shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis\r\n * @param path is a required array of successive Vector3. This is the axis curve the shape is extruded along\r\n * @param scaleFunction is a custom Javascript function called on each path point\r\n * @param rotationFunction is a custom Javascript function called on each path point\r\n * @param ribbonCloseArray forces the extrusion underlying ribbon to close all the paths in its `pathArray`\r\n * @param ribbonClosePath forces the extrusion underlying ribbon to close its `pathArray`\r\n * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @param instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#extruded-shape)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static ExtrudeShapeCustom(\r\n name: string,\r\n shape: Vector3[],\r\n path: Vector3[],\r\n scaleFunction: Nullable<{ (i: number, distance: number): number }>,\r\n rotationFunction: Nullable<{ (i: number, distance: number): number }>,\r\n ribbonCloseArray: boolean,\r\n ribbonClosePath: boolean,\r\n cap: number,\r\n scene: Scene,\r\n updatable?: boolean,\r\n sideOrientation?: number,\r\n instance?: Mesh\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates lathe mesh.\r\n * The lathe is a shape with a symmetry axis : a 2D model shape is rotated around this axis to design the lathe.\r\n * @param name defines the name of the mesh to create\r\n * @param shape is a required array of successive Vector3. This array depicts the shape to be rotated in its local space : the shape must be designed in the xOy plane and will be rotated around the Y axis. It's usually a 2D shape, so the Vector3 z coordinates are often set to zero\r\n * @param radius is the radius value of the lathe\r\n * @param tessellation is the side number of the lathe.\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateLathe(name: string, shape: Vector3[], radius: number, tessellation: number, scene: Scene, updatable?: boolean, sideOrientation?: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a plane mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param size sets the size (float) of both sides of the plane at once (default 1)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreatePlane(name: string, size: number, scene: Scene, updatable?: boolean, sideOrientation?: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a ground mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param width set the width of the ground\r\n * @param height set the height of the ground\r\n * @param subdivisions sets the number of subdivisions per side\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateGround(name: string, width: number, height: number, subdivisions: number, scene?: Scene, updatable?: boolean): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a tiled ground mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param xmin set the ground minimum X coordinate\r\n * @param zmin set the ground minimum Y coordinate\r\n * @param xmax set the ground maximum X coordinate\r\n * @param zmax set the ground maximum Z coordinate\r\n * @param subdivisions is an object `{w: positive integer, h: positive integer}` (default `{w: 6, h: 6}`). `w` and `h` are the numbers of subdivisions on the ground width and height. Each subdivision is called a tile\r\n * @param precision is an object `{w: positive integer, h: positive integer}` (default `{w: 2, h: 2}`). `w` and `h` are the numbers of subdivisions on the ground width and height of each tile\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateTiledGround(\r\n name: string,\r\n xmin: number,\r\n zmin: number,\r\n xmax: number,\r\n zmax: number,\r\n subdivisions: { w: number; h: number },\r\n precision: { w: number; h: number },\r\n scene: Scene,\r\n updatable?: boolean\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a ground mesh from a height map.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/height_map\r\n * @param name defines the name of the mesh to create\r\n * @param url sets the URL of the height map image resource\r\n * @param width set the ground width size\r\n * @param height set the ground height size\r\n * @param subdivisions sets the number of subdivision per side\r\n * @param minHeight is the minimum altitude on the ground\r\n * @param maxHeight is the maximum altitude on the ground\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param onReady is a callback function that will be called once the mesh is built (the height map download can last some time)\r\n * @param alphaFilter will filter any data where the alpha channel is below this value, defaults 0 (all data visible)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateGroundFromHeightMap(\r\n name: string,\r\n url: string,\r\n width: number,\r\n height: number,\r\n subdivisions: number,\r\n minHeight: number,\r\n maxHeight: number,\r\n scene: Scene,\r\n updatable?: boolean,\r\n onReady?: (mesh: GroundMesh) => void,\r\n alphaFilter?: number\r\n ): GroundMesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a tube mesh.\r\n * The tube is a parametric shape.\r\n * It has no predefined shape. Its final shape will depend on the input parameters.\r\n *\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\r\n * @param name defines the name of the mesh to create\r\n * @param path is a required array of successive Vector3. It is the curve used as the axis of the tube\r\n * @param radius sets the tube radius size\r\n * @param tessellation is the number of sides on the tubular surface\r\n * @param radiusFunction is a custom function. If it is not null, it overrides the parameter `radius`. This function is called on each point of the tube path and is passed the index `i` of the i-th point and the distance of this point from the first point of the path\r\n * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @param instance is an instance of an existing Tube object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#tube)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateTube(\r\n name: string,\r\n path: Vector3[],\r\n radius: number,\r\n tessellation: number,\r\n radiusFunction: { (i: number, distance: number): number },\r\n cap: number,\r\n scene: Scene,\r\n updatable?: boolean,\r\n sideOrientation?: number,\r\n instance?: Mesh\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a polyhedron mesh.\r\n *.\r\n * * The parameter `type` (positive integer, max 14, default 0) sets the polyhedron type to build among the 15 embedded types. Please refer to the type sheet in the tutorial to choose the wanted type\r\n * * The parameter `size` (positive float, default 1) sets the polygon size\r\n * * You can overwrite the `size` on each dimension bu using the parameters `sizeX`, `sizeY` or `sizeZ` (positive floats, default to `size` value)\r\n * * You can build other polyhedron types than the 15 embbeded ones by setting the parameter `custom` (`polyhedronObject`, default null). If you set the parameter `custom`, this overwrittes the parameter `type`\r\n * * A `polyhedronObject` is a formatted javascript object. You'll find a full file with pre-set polyhedra here : https://github.com/BabylonJS/Extensions/tree/master/Polyhedron\r\n * * You can set the color and the UV of each side of the polyhedron with the parameters `faceColors` (Color4, default `(1, 1, 1, 1)`) and faceUV (Vector4, default `(0, 0, 1, 1)`)\r\n * * To understand how to set `faceUV` or `faceColors`, please read this by considering the right number of faces of your polyhedron, instead of only 6 for the box : https://doc.babylonjs.com/features/featuresDeepDive/materials/using/texturePerBoxFace\r\n * * The parameter `flat` (boolean, default true). If set to false, it gives the polyhedron a single global face, so less vertices and shared normals. In this case, `faceColors` and `faceUV` are ignored\r\n * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\r\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\r\n * @param name defines the name of the mesh to create\r\n * @param options defines the options used to create the mesh\r\n * @param scene defines the hosting scene\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreatePolyhedron(\r\n name: string,\r\n options: {\r\n type?: number;\r\n size?: number;\r\n sizeX?: number;\r\n sizeY?: number;\r\n sizeZ?: number;\r\n custom?: any;\r\n faceUV?: Vector4[];\r\n faceColors?: Color4[];\r\n updatable?: boolean;\r\n sideOrientation?: number;\r\n },\r\n scene: Scene\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a sphere based upon an icosahedron with 20 triangular faces which can be subdivided\r\n * * The parameter `radius` sets the radius size (float) of the icosphere (default 1)\r\n * * You can set some different icosphere dimensions, for instance to build an ellipsoid, by using the parameters `radiusX`, `radiusY` and `radiusZ` (all by default have the same value than `radius`)\r\n * * The parameter `subdivisions` sets the number of subdivisions (positive integer, default 4). The more subdivisions, the more faces on the icosphere whatever its size\r\n * * The parameter `flat` (boolean, default true) gives each side its own normals. Set it to false to get a smooth continuous light reflection on the surface\r\n * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\r\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/polyhedra#icosphere\r\n * @param name defines the name of the mesh\r\n * @param options defines the options used to create the mesh\r\n * @param scene defines the hosting scene\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateIcoSphere(\r\n name: string,\r\n options: { radius?: number; flat?: boolean; subdivisions?: number; sideOrientation?: number; updatable?: boolean },\r\n scene: Scene\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a decal mesh.\r\n *.\r\n * A decal is a mesh usually applied as a model onto the surface of another mesh\r\n * @param name defines the name of the mesh\r\n * @param sourceMesh defines the mesh receiving the decal\r\n * @param position sets the position of the decal in world coordinates\r\n * @param normal sets the normal of the mesh where the decal is applied onto in world coordinates\r\n * @param size sets the decal scaling\r\n * @param angle sets the angle to rotate the decal\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateDecal(name: string, sourceMesh: AbstractMesh, position: Vector3, normal: Vector3, size: Vector3, angle: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /** Creates a Capsule Mesh\r\n * @param name defines the name of the mesh.\r\n * @param options the constructors options used to shape the mesh.\r\n * @param scene defines the scene the mesh is scoped to.\r\n * @returns the capsule mesh\r\n * @see https://doc.babylonjs.com/how_to/capsule_shape\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateCapsule(name: string, options: ICreateCapsuleOptions, scene: Scene): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Extends a mesh to a Goldberg mesh\r\n * Warning the mesh to convert MUST be an import of a perviously exported Goldberg mesh\r\n * @param mesh the mesh to convert\r\n * @returns the extended mesh\r\n * @deprecated Please use ExtendMeshToGoldberg instead\r\n */\r\n public static ExtendToGoldberg(mesh: Mesh): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.Mesh\", Mesh);\r\n", "import { serialize, serializeAsColor3, expandToProperty } from \"../Misc/decorators\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Matrix } from \"../Maths/math.vector\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3, TmpColors } from \"../Maths/math.color\";\r\nimport { Node } from \"../node\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport type { IShadowGenerator } from \"./Shadows/shadowGenerator\";\r\nimport { GetClass } from \"../Misc/typeStore\";\r\nimport type { ISortableLight } from \"./lightConstants\";\r\nimport { LightConstants } from \"./lightConstants\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\n\r\n/**\r\n * Base class of all the lights in Babylon. It groups all the generic information about lights.\r\n * Lights are used, as you would expect, to affect how meshes are seen, in terms of both illumination and colour.\r\n * All meshes allow light to pass through them unless shadow generation is activated. The default number of lights allowed is four but this can be increased.\r\n */\r\nexport abstract class Light extends Node implements ISortableLight {\r\n /**\r\n * Falloff Default: light is falling off following the material specification:\r\n * standard material is using standard falloff whereas pbr material can request special falloff per materials.\r\n */\r\n public static readonly FALLOFF_DEFAULT = LightConstants.FALLOFF_DEFAULT;\r\n\r\n /**\r\n * Falloff Physical: light is falling off following the inverse squared distance law.\r\n */\r\n public static readonly FALLOFF_PHYSICAL = LightConstants.FALLOFF_PHYSICAL;\r\n\r\n /**\r\n * Falloff gltf: light is falling off as described in the gltf moving to PBR document\r\n * to enhance interoperability with other engines.\r\n */\r\n public static readonly FALLOFF_GLTF = LightConstants.FALLOFF_GLTF;\r\n\r\n /**\r\n * Falloff Standard: light is falling off like in the standard material\r\n * to enhance interoperability with other materials.\r\n */\r\n public static readonly FALLOFF_STANDARD = LightConstants.FALLOFF_STANDARD;\r\n\r\n //lightmapMode Consts\r\n /**\r\n * If every light affecting the material is in this lightmapMode,\r\n * material.lightmapTexture adds or multiplies\r\n * (depends on material.useLightmapAsShadowmap)\r\n * after every other light calculations.\r\n */\r\n public static readonly LIGHTMAP_DEFAULT = LightConstants.LIGHTMAP_DEFAULT;\r\n /**\r\n * material.lightmapTexture as only diffuse lighting from this light\r\n * adds only specular lighting from this light\r\n * adds dynamic shadows\r\n */\r\n public static readonly LIGHTMAP_SPECULAR = LightConstants.LIGHTMAP_SPECULAR;\r\n /**\r\n * material.lightmapTexture as only lighting\r\n * no light calculation from this light\r\n * only adds dynamic shadows from this light\r\n */\r\n public static readonly LIGHTMAP_SHADOWSONLY = LightConstants.LIGHTMAP_SHADOWSONLY;\r\n\r\n // Intensity Mode Consts\r\n /**\r\n * Each light type uses the default quantity according to its type:\r\n * point/spot lights use luminous intensity\r\n * directional lights use illuminance\r\n */\r\n public static readonly INTENSITYMODE_AUTOMATIC = LightConstants.INTENSITYMODE_AUTOMATIC;\r\n /**\r\n * lumen (lm)\r\n */\r\n public static readonly INTENSITYMODE_LUMINOUSPOWER = LightConstants.INTENSITYMODE_LUMINOUSPOWER;\r\n /**\r\n * candela (lm/sr)\r\n */\r\n public static readonly INTENSITYMODE_LUMINOUSINTENSITY = LightConstants.INTENSITYMODE_LUMINOUSINTENSITY;\r\n /**\r\n * lux (lm/m^2)\r\n */\r\n public static readonly INTENSITYMODE_ILLUMINANCE = LightConstants.INTENSITYMODE_ILLUMINANCE;\r\n /**\r\n * nit (cd/m^2)\r\n */\r\n public static readonly INTENSITYMODE_LUMINANCE = LightConstants.INTENSITYMODE_LUMINANCE;\r\n\r\n // Light types ids const.\r\n /**\r\n * Light type const id of the point light.\r\n */\r\n public static readonly LIGHTTYPEID_POINTLIGHT = LightConstants.LIGHTTYPEID_POINTLIGHT;\r\n /**\r\n * Light type const id of the directional light.\r\n */\r\n public static readonly LIGHTTYPEID_DIRECTIONALLIGHT = LightConstants.LIGHTTYPEID_DIRECTIONALLIGHT;\r\n /**\r\n * Light type const id of the spot light.\r\n */\r\n public static readonly LIGHTTYPEID_SPOTLIGHT = LightConstants.LIGHTTYPEID_SPOTLIGHT;\r\n /**\r\n * Light type const id of the hemispheric light.\r\n */\r\n public static readonly LIGHTTYPEID_HEMISPHERICLIGHT = LightConstants.LIGHTTYPEID_HEMISPHERICLIGHT;\r\n\r\n /**\r\n * Diffuse gives the basic color to an object.\r\n */\r\n @serializeAsColor3()\r\n public diffuse = new Color3(1.0, 1.0, 1.0);\r\n\r\n /**\r\n * Specular produces a highlight color on an object.\r\n * Note: This is not affecting PBR materials.\r\n */\r\n @serializeAsColor3()\r\n public specular = new Color3(1.0, 1.0, 1.0);\r\n\r\n /**\r\n * Defines the falloff type for this light. This lets overriding how punctual light are\r\n * falling off base on range or angle.\r\n * This can be set to any values in Light.FALLOFF_x.\r\n *\r\n * Note: This is only useful for PBR Materials at the moment. This could be extended if required to\r\n * other types of materials.\r\n */\r\n @serialize()\r\n public falloffType = Light.FALLOFF_DEFAULT;\r\n\r\n /**\r\n * Strength of the light.\r\n * Note: By default it is define in the framework own unit.\r\n * Note: In PBR materials the intensityMode can be use to chose what unit the intensity is defined in.\r\n */\r\n @serialize()\r\n public intensity = 1.0;\r\n\r\n private _range = Number.MAX_VALUE;\r\n protected _inverseSquaredRange = 0;\r\n\r\n /**\r\n * Defines how far from the source the light is impacting in scene units.\r\n * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff.\r\n */\r\n @serialize()\r\n public get range(): number {\r\n return this._range;\r\n }\r\n /**\r\n * Defines how far from the source the light is impacting in scene units.\r\n * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff.\r\n */\r\n public set range(value: number) {\r\n this._range = value;\r\n this._inverseSquaredRange = 1.0 / (this.range * this.range);\r\n }\r\n\r\n /**\r\n * Cached photometric scale default to 1.0 as the automatic intensity mode defaults to 1.0 for every type\r\n * of light.\r\n */\r\n private _photometricScale = 1.0;\r\n\r\n private _intensityMode: number = Light.INTENSITYMODE_AUTOMATIC;\r\n /**\r\n * Gets the photometric scale used to interpret the intensity.\r\n * This is only relevant with PBR Materials where the light intensity can be defined in a physical way.\r\n */\r\n @serialize()\r\n public get intensityMode(): number {\r\n return this._intensityMode;\r\n }\r\n /**\r\n * Sets the photometric scale used to interpret the intensity.\r\n * This is only relevant with PBR Materials where the light intensity can be defined in a physical way.\r\n */\r\n public set intensityMode(value: number) {\r\n this._intensityMode = value;\r\n this._computePhotometricScale();\r\n }\r\n\r\n private _radius = 0.00001;\r\n /**\r\n * Gets the light radius used by PBR Materials to simulate soft area lights.\r\n */\r\n @serialize()\r\n public get radius(): number {\r\n return this._radius;\r\n }\r\n /**\r\n * sets the light radius used by PBR Materials to simulate soft area lights.\r\n */\r\n public set radius(value: number) {\r\n this._radius = value;\r\n this._computePhotometricScale();\r\n }\r\n\r\n @serialize()\r\n private _renderPriority: number;\r\n /**\r\n * Defines the rendering priority of the lights. It can help in case of fallback or number of lights\r\n * exceeding the number allowed of the materials.\r\n */\r\n @expandToProperty(\"_reorderLightsInScene\")\r\n public renderPriority: number = 0;\r\n\r\n @serialize(\"shadowEnabled\")\r\n private _shadowEnabled: boolean = true;\r\n /**\r\n * Gets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching\r\n * the current shadow generator.\r\n */\r\n public get shadowEnabled(): boolean {\r\n return this._shadowEnabled;\r\n }\r\n /**\r\n * Sets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching\r\n * the current shadow generator.\r\n */\r\n public set shadowEnabled(value: boolean) {\r\n if (this._shadowEnabled === value) {\r\n return;\r\n }\r\n\r\n this._shadowEnabled = value;\r\n this._markMeshesAsLightDirty();\r\n }\r\n\r\n private _includedOnlyMeshes: AbstractMesh[];\r\n /**\r\n * Gets the only meshes impacted by this light.\r\n */\r\n public get includedOnlyMeshes(): AbstractMesh[] {\r\n return this._includedOnlyMeshes;\r\n }\r\n /**\r\n * Sets the only meshes impacted by this light.\r\n */\r\n public set includedOnlyMeshes(value: AbstractMesh[]) {\r\n this._includedOnlyMeshes = value;\r\n this._hookArrayForIncludedOnly(value);\r\n }\r\n\r\n private _excludedMeshes: AbstractMesh[];\r\n /**\r\n * Gets the meshes not impacted by this light.\r\n */\r\n public get excludedMeshes(): AbstractMesh[] {\r\n return this._excludedMeshes;\r\n }\r\n /**\r\n * Sets the meshes not impacted by this light.\r\n */\r\n public set excludedMeshes(value: AbstractMesh[]) {\r\n this._excludedMeshes = value;\r\n this._hookArrayForExcluded(value);\r\n }\r\n\r\n @serialize(\"excludeWithLayerMask\")\r\n private _excludeWithLayerMask = 0;\r\n /**\r\n * Gets the layer id use to find what meshes are not impacted by the light.\r\n * Inactive if 0\r\n */\r\n public get excludeWithLayerMask(): number {\r\n return this._excludeWithLayerMask;\r\n }\r\n /**\r\n * Sets the layer id use to find what meshes are not impacted by the light.\r\n * Inactive if 0\r\n */\r\n public set excludeWithLayerMask(value: number) {\r\n this._excludeWithLayerMask = value;\r\n this._resyncMeshes();\r\n }\r\n\r\n @serialize(\"includeOnlyWithLayerMask\")\r\n private _includeOnlyWithLayerMask = 0;\r\n /**\r\n * Gets the layer id use to find what meshes are impacted by the light.\r\n * Inactive if 0\r\n */\r\n public get includeOnlyWithLayerMask(): number {\r\n return this._includeOnlyWithLayerMask;\r\n }\r\n /**\r\n * Sets the layer id use to find what meshes are impacted by the light.\r\n * Inactive if 0\r\n */\r\n public set includeOnlyWithLayerMask(value: number) {\r\n this._includeOnlyWithLayerMask = value;\r\n this._resyncMeshes();\r\n }\r\n\r\n @serialize(\"lightmapMode\")\r\n private _lightmapMode = 0;\r\n /**\r\n * Gets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x)\r\n */\r\n public get lightmapMode(): number {\r\n return this._lightmapMode;\r\n }\r\n /**\r\n * Sets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x)\r\n */\r\n public set lightmapMode(value: number) {\r\n if (this._lightmapMode === value) {\r\n return;\r\n }\r\n\r\n this._lightmapMode = value;\r\n this._markMeshesAsLightDirty();\r\n }\r\n\r\n /**\r\n * Returns the view matrix.\r\n * @param _faceIndex The index of the face for which we want to extract the view matrix. Only used for point light types.\r\n * @returns The view matrix. Can be null, if a view matrix cannot be defined for the type of light considered (as for a hemispherical light, for example).\r\n */\r\n public getViewMatrix(_faceIndex?: number): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the projection matrix.\r\n * Note that viewMatrix and renderList are optional and are only used by lights that calculate the projection matrix from a list of meshes (e.g. directional lights with automatic extents calculation).\r\n * @param _viewMatrix The view transform matrix of the light (optional).\r\n * @param _renderList The list of meshes to take into account when calculating the projection matrix (optional).\r\n * @returns The projection matrix. Can be null, if a projection matrix cannot be defined for the type of light considered (as for a hemispherical light, for example).\r\n */\r\n public getProjectionMatrix(_viewMatrix?: Matrix, _renderList?: Array): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Shadow generators associated to the light.\r\n * @internal Internal use only.\r\n */\r\n public _shadowGenerators: Nullable, IShadowGenerator>> = null;\r\n\r\n /**\r\n * @internal Internal use only.\r\n */\r\n public _excludedMeshesIds = new Array();\r\n\r\n /**\r\n * @internal Internal use only.\r\n */\r\n public _includedOnlyMeshesIds = new Array();\r\n\r\n /**\r\n * The current light uniform buffer.\r\n * @internal Internal use only.\r\n */\r\n public _uniformBuffer: UniformBuffer;\r\n\r\n /** @internal */\r\n public _renderId: number;\r\n\r\n private _lastUseSpecular: boolean;\r\n\r\n /**\r\n * Creates a Light object in the scene.\r\n * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction\r\n * @param name The friendly name of the light\r\n * @param scene The scene the light belongs too\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n this.getScene().addLight(this);\r\n this._uniformBuffer = new UniformBuffer(this.getScene().getEngine(), undefined, undefined, name);\r\n this._buildUniformLayout();\r\n\r\n this.includedOnlyMeshes = [] as AbstractMesh[];\r\n this.excludedMeshes = [] as AbstractMesh[];\r\n\r\n this._resyncMeshes();\r\n }\r\n\r\n protected abstract _buildUniformLayout(): void;\r\n\r\n /**\r\n * Sets the passed Effect \"effect\" with the Light information.\r\n * @param effect The effect to update\r\n * @param lightIndex The index of the light in the effect to update\r\n * @returns The light\r\n */\r\n public abstract transferToEffect(effect: Effect, lightIndex: string): Light;\r\n\r\n /**\r\n * Sets the passed Effect \"effect\" with the Light textures.\r\n * @param effect The effect to update\r\n * @param lightIndex The index of the light in the effect to update\r\n * @returns The light\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public transferTexturesToEffect(effect: Effect, lightIndex: string): Light {\r\n // Do nothing by default.\r\n return this;\r\n }\r\n\r\n /**\r\n * Binds the lights information from the scene to the effect for the given mesh.\r\n * @param lightIndex Light index\r\n * @param scene The scene where the light belongs to\r\n * @param effect The effect we are binding the data to\r\n * @param useSpecular Defines if specular is supported\r\n * @param receiveShadows Defines if the effect (mesh) we bind the light for receives shadows\r\n */\r\n public _bindLight(lightIndex: number, scene: Scene, effect: Effect, useSpecular: boolean, receiveShadows = true): void {\r\n const iAsString = lightIndex.toString();\r\n let needUpdate = false;\r\n\r\n this._uniformBuffer.bindToEffect(effect, \"Light\" + iAsString);\r\n\r\n if (this._renderId !== scene.getRenderId() || this._lastUseSpecular !== useSpecular || !this._uniformBuffer.useUbo) {\r\n this._renderId = scene.getRenderId();\r\n this._lastUseSpecular = useSpecular;\r\n\r\n const scaledIntensity = this.getScaledIntensity();\r\n\r\n this.transferToEffect(effect, iAsString);\r\n\r\n this.diffuse.scaleToRef(scaledIntensity, TmpColors.Color3[0]);\r\n this._uniformBuffer.updateColor4(\"vLightDiffuse\", TmpColors.Color3[0], this.range, iAsString);\r\n if (useSpecular) {\r\n this.specular.scaleToRef(scaledIntensity, TmpColors.Color3[1]);\r\n this._uniformBuffer.updateColor4(\"vLightSpecular\", TmpColors.Color3[1], this.radius, iAsString);\r\n }\r\n needUpdate = true;\r\n }\r\n\r\n // Textures might still need to be rebound.\r\n this.transferTexturesToEffect(effect, iAsString);\r\n\r\n // Shadows\r\n if (scene.shadowsEnabled && this.shadowEnabled && receiveShadows) {\r\n const shadowGenerator = this.getShadowGenerator(scene.activeCamera) ?? this.getShadowGenerator();\r\n if (shadowGenerator) {\r\n shadowGenerator.bindShadowLight(iAsString, effect);\r\n needUpdate = true;\r\n }\r\n }\r\n\r\n if (needUpdate) {\r\n this._uniformBuffer.update();\r\n } else {\r\n this._uniformBuffer.bindUniformBuffer();\r\n }\r\n }\r\n\r\n /**\r\n * Sets the passed Effect \"effect\" with the Light information.\r\n * @param effect The effect to update\r\n * @param lightDataUniformName The uniform used to store light data (position or direction)\r\n * @returns The light\r\n */\r\n public abstract transferToNodeMaterialEffect(effect: Effect, lightDataUniformName: string): Light;\r\n\r\n /**\r\n * Returns the string \"Light\".\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"Light\";\r\n }\r\n\r\n /** @internal */\r\n public readonly _isLight = true;\r\n\r\n /**\r\n * Converts the light information to a readable string for debug purpose.\r\n * @param fullDetails Supports for multiple levels of logging within scene loading\r\n * @returns the human readable light info\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name;\r\n ret += \", type: \" + [\"Point\", \"Directional\", \"Spot\", \"Hemispheric\"][this.getTypeID()];\r\n if (this.animations) {\r\n for (let i = 0; i < this.animations.length; i++) {\r\n ret += \", animation[0]: \" + this.animations[i].toString(fullDetails);\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /** @internal */\r\n protected _syncParentEnabledState() {\r\n super._syncParentEnabledState();\r\n if (!this.isDisposed()) {\r\n this._resyncMeshes();\r\n }\r\n }\r\n\r\n /**\r\n * Set the enabled state of this node.\r\n * @param value - the new enabled state\r\n */\r\n public setEnabled(value: boolean): void {\r\n super.setEnabled(value);\r\n\r\n this._resyncMeshes();\r\n }\r\n\r\n /**\r\n * Returns the Light associated shadow generator if any.\r\n * @param camera Camera for which the shadow generator should be retrieved (default: null). If null, retrieves the default shadow generator\r\n * @returns the associated shadow generator.\r\n */\r\n public getShadowGenerator(camera: Nullable = null): Nullable {\r\n if (this._shadowGenerators === null) {\r\n return null;\r\n }\r\n\r\n return this._shadowGenerators.get(camera) ?? null;\r\n }\r\n\r\n /**\r\n * Returns all the shadow generators associated to this light\r\n * @returns\r\n */\r\n public getShadowGenerators(): Nullable, IShadowGenerator>> {\r\n return this._shadowGenerators;\r\n }\r\n\r\n /**\r\n * Returns a Vector3, the absolute light position in the World.\r\n * @returns the world space position of the light\r\n */\r\n public getAbsolutePosition(): Vector3 {\r\n return Vector3.Zero();\r\n }\r\n\r\n /**\r\n * Specifies if the light will affect the passed mesh.\r\n * @param mesh The mesh to test against the light\r\n * @returns true the mesh is affected otherwise, false.\r\n */\r\n public canAffectMesh(mesh: AbstractMesh): boolean {\r\n if (!mesh) {\r\n return true;\r\n }\r\n\r\n if (this.includedOnlyMeshes && this.includedOnlyMeshes.length > 0 && this.includedOnlyMeshes.indexOf(mesh) === -1) {\r\n return false;\r\n }\r\n\r\n if (this.excludedMeshes && this.excludedMeshes.length > 0 && this.excludedMeshes.indexOf(mesh) !== -1) {\r\n return false;\r\n }\r\n\r\n if (this.includeOnlyWithLayerMask !== 0 && (this.includeOnlyWithLayerMask & mesh.layerMask) === 0) {\r\n return false;\r\n }\r\n\r\n if (this.excludeWithLayerMask !== 0 && this.excludeWithLayerMask & mesh.layerMask) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Releases resources associated with this node.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n if (this._shadowGenerators) {\r\n const iterator = this._shadowGenerators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const shadowGenerator = key.value;\r\n shadowGenerator.dispose();\r\n }\r\n this._shadowGenerators = null;\r\n }\r\n\r\n // Animations\r\n this.getScene().stopAnimation(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.lights.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.lights.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n // Remove from meshes\r\n for (const mesh of this.getScene().meshes) {\r\n mesh._removeLightSource(this, true);\r\n }\r\n\r\n this._uniformBuffer.dispose();\r\n\r\n // Remove from scene\r\n this.getScene().removeLight(this);\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n /**\r\n * Returns the light type ID (integer).\r\n * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x\r\n */\r\n public getTypeID(): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Returns the intensity scaled by the Photometric Scale according to the light type and intensity mode.\r\n * @returns the scaled intensity in intensity mode unit\r\n */\r\n public getScaledIntensity() {\r\n return this._photometricScale * this.intensity;\r\n }\r\n\r\n /**\r\n * Returns a new Light object, named \"name\", from the current one.\r\n * @param name The name of the cloned light\r\n * @param newParent The parent of this light, if it has one\r\n * @returns the new created light\r\n */\r\n public clone(name: string, newParent: Nullable = null): Nullable {\r\n const constructor = Light.GetConstructorFromName(this.getTypeID(), name, this.getScene());\r\n\r\n if (!constructor) {\r\n return null;\r\n }\r\n const clonedLight = SerializationHelper.Clone(constructor, this);\r\n if (name) {\r\n clonedLight.name = name;\r\n }\r\n if (newParent) {\r\n clonedLight.parent = newParent;\r\n }\r\n clonedLight.setEnabled(this.isEnabled());\r\n\r\n this.onClonedObservable.notifyObservers(clonedLight);\r\n\r\n return clonedLight;\r\n }\r\n\r\n /**\r\n * Serializes the current light into a Serialization object.\r\n * @returns the serialized object.\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.uniqueId = this.uniqueId;\r\n\r\n // Type\r\n serializationObject.type = this.getTypeID();\r\n\r\n // Parent\r\n if (this.parent) {\r\n this.parent._serializeAsParent(serializationObject);\r\n }\r\n\r\n // Inclusion / exclusions\r\n if (this.excludedMeshes.length > 0) {\r\n serializationObject.excludedMeshesIds = [];\r\n this.excludedMeshes.forEach((mesh: AbstractMesh) => {\r\n serializationObject.excludedMeshesIds.push(mesh.id);\r\n });\r\n }\r\n\r\n if (this.includedOnlyMeshes.length > 0) {\r\n serializationObject.includedOnlyMeshesIds = [];\r\n this.includedOnlyMeshes.forEach((mesh: AbstractMesh) => {\r\n serializationObject.includedOnlyMeshesIds.push(mesh.id);\r\n });\r\n }\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n serializationObject.ranges = this.serializeAnimationRanges();\r\n\r\n serializationObject.isEnabled = this.isEnabled();\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Creates a new typed light from the passed type (integer) : point light = 0, directional light = 1, spot light = 2, hemispheric light = 3.\r\n * This new light is named \"name\" and added to the passed scene.\r\n * @param type Type according to the types available in Light.LIGHTTYPEID_x\r\n * @param name The friendly name of the light\r\n * @param scene The scene the new light will belong to\r\n * @returns the constructor function\r\n */\r\n static GetConstructorFromName(type: number, name: string, scene: Scene): Nullable<() => Light> {\r\n const constructorFunc = Node.Construct(\"Light_Type_\" + type, name, scene);\r\n\r\n if (constructorFunc) {\r\n return <() => Light>constructorFunc;\r\n }\r\n\r\n // Default to no light for none present once.\r\n return null;\r\n }\r\n\r\n /**\r\n * Parses the passed \"parsedLight\" and returns a new instanced Light from this parsing.\r\n * @param parsedLight The JSON representation of the light\r\n * @param scene The scene to create the parsed light in\r\n * @returns the created light after parsing\r\n */\r\n public static Parse(parsedLight: any, scene: Scene): Nullable {\r\n const constructor = Light.GetConstructorFromName(parsedLight.type, parsedLight.name, scene);\r\n\r\n if (!constructor) {\r\n return null;\r\n }\r\n\r\n const light = SerializationHelper.Parse(constructor, parsedLight, scene);\r\n\r\n // Inclusion / exclusions\r\n if (parsedLight.excludedMeshesIds) {\r\n light._excludedMeshesIds = parsedLight.excludedMeshesIds;\r\n }\r\n\r\n if (parsedLight.includedOnlyMeshesIds) {\r\n light._includedOnlyMeshesIds = parsedLight.includedOnlyMeshesIds;\r\n }\r\n\r\n // Parent\r\n if (parsedLight.parentId !== undefined) {\r\n light._waitingParentId = parsedLight.parentId;\r\n }\r\n\r\n if (parsedLight.parentInstanceIndex !== undefined) {\r\n light._waitingParentInstanceIndex = parsedLight.parentInstanceIndex;\r\n }\r\n\r\n // Falloff\r\n if (parsedLight.falloffType !== undefined) {\r\n light.falloffType = parsedLight.falloffType;\r\n }\r\n\r\n // Lightmaps\r\n if (parsedLight.lightmapMode !== undefined) {\r\n light.lightmapMode = parsedLight.lightmapMode;\r\n }\r\n\r\n // Animations\r\n if (parsedLight.animations) {\r\n for (let animationIndex = 0; animationIndex < parsedLight.animations.length; animationIndex++) {\r\n const parsedAnimation = parsedLight.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n light.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n Node.ParseAnimationRanges(light, parsedLight, scene);\r\n }\r\n\r\n if (parsedLight.autoAnimate) {\r\n scene.beginAnimation(light, parsedLight.autoAnimateFrom, parsedLight.autoAnimateTo, parsedLight.autoAnimateLoop, parsedLight.autoAnimateSpeed || 1.0);\r\n }\r\n\r\n // Check if isEnabled is defined to be back compatible with prior serialized versions.\r\n if (parsedLight.isEnabled !== undefined) {\r\n light.setEnabled(parsedLight.isEnabled);\r\n }\r\n\r\n return light;\r\n }\r\n\r\n private _hookArrayForExcluded(array: AbstractMesh[]): void {\r\n const oldPush = array.push;\r\n array.push = (...items: AbstractMesh[]) => {\r\n const result = oldPush.apply(array, items);\r\n\r\n for (const item of items) {\r\n item._resyncLightSource(this);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const oldSplice = array.splice;\r\n array.splice = (index: number, deleteCount?: number) => {\r\n const deleted = oldSplice.apply(array, [index, deleteCount]);\r\n\r\n for (const item of deleted) {\r\n item._resyncLightSource(this);\r\n }\r\n\r\n return deleted;\r\n };\r\n\r\n for (const item of array) {\r\n item._resyncLightSource(this);\r\n }\r\n }\r\n\r\n private _hookArrayForIncludedOnly(array: AbstractMesh[]): void {\r\n const oldPush = array.push;\r\n array.push = (...items: AbstractMesh[]) => {\r\n const result = oldPush.apply(array, items);\r\n\r\n this._resyncMeshes();\r\n\r\n return result;\r\n };\r\n\r\n const oldSplice = array.splice;\r\n array.splice = (index: number, deleteCount?: number) => {\r\n const deleted = oldSplice.apply(array, [index, deleteCount]);\r\n\r\n this._resyncMeshes();\r\n\r\n return deleted;\r\n };\r\n\r\n this._resyncMeshes();\r\n }\r\n\r\n private _resyncMeshes() {\r\n for (const mesh of this.getScene().meshes) {\r\n mesh._resyncLightSource(this);\r\n }\r\n }\r\n\r\n /**\r\n * Forces the meshes to update their light related information in their rendering used effects\r\n * @internal Internal Use Only\r\n */\r\n public _markMeshesAsLightDirty() {\r\n for (const mesh of this.getScene().meshes) {\r\n if (mesh.lightSources.indexOf(this) !== -1) {\r\n mesh._markSubMeshesAsLightDirty();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Recomputes the cached photometric scale if needed.\r\n */\r\n private _computePhotometricScale(): void {\r\n this._photometricScale = this._getPhotometricScale();\r\n this.getScene().resetCachedMaterial();\r\n }\r\n\r\n /**\r\n * @returns the Photometric Scale according to the light type and intensity mode.\r\n */\r\n private _getPhotometricScale() {\r\n let photometricScale = 0.0;\r\n const lightTypeID = this.getTypeID();\r\n\r\n //get photometric mode\r\n let photometricMode = this.intensityMode;\r\n if (photometricMode === Light.INTENSITYMODE_AUTOMATIC) {\r\n if (lightTypeID === Light.LIGHTTYPEID_DIRECTIONALLIGHT) {\r\n photometricMode = Light.INTENSITYMODE_ILLUMINANCE;\r\n } else {\r\n photometricMode = Light.INTENSITYMODE_LUMINOUSINTENSITY;\r\n }\r\n }\r\n\r\n //compute photometric scale\r\n switch (lightTypeID) {\r\n case Light.LIGHTTYPEID_POINTLIGHT:\r\n case Light.LIGHTTYPEID_SPOTLIGHT:\r\n switch (photometricMode) {\r\n case Light.INTENSITYMODE_LUMINOUSPOWER:\r\n photometricScale = 1.0 / (4.0 * Math.PI);\r\n break;\r\n case Light.INTENSITYMODE_LUMINOUSINTENSITY:\r\n photometricScale = 1.0;\r\n break;\r\n case Light.INTENSITYMODE_LUMINANCE:\r\n photometricScale = this.radius * this.radius;\r\n break;\r\n }\r\n break;\r\n\r\n case Light.LIGHTTYPEID_DIRECTIONALLIGHT:\r\n switch (photometricMode) {\r\n case Light.INTENSITYMODE_ILLUMINANCE:\r\n photometricScale = 1.0;\r\n break;\r\n case Light.INTENSITYMODE_LUMINANCE: {\r\n // When radius (and therefore solid angle) is non-zero a directional lights brightness can be specified via central (peak) luminance.\r\n // For a directional light the 'radius' defines the angular radius (in radians) rather than world-space radius (e.g. in metres).\r\n let apexAngleRadians = this.radius;\r\n // Impose a minimum light angular size to avoid the light becoming an infinitely small angular light source (i.e. a dirac delta function).\r\n apexAngleRadians = Math.max(apexAngleRadians, 0.001);\r\n const solidAngle = 2.0 * Math.PI * (1.0 - Math.cos(apexAngleRadians));\r\n photometricScale = solidAngle;\r\n break;\r\n }\r\n }\r\n break;\r\n\r\n case Light.LIGHTTYPEID_HEMISPHERICLIGHT:\r\n // No fall off in hemispheric light.\r\n photometricScale = 1.0;\r\n break;\r\n }\r\n return photometricScale;\r\n }\r\n\r\n /**\r\n * Reorder the light in the scene according to their defined priority.\r\n * @internal Internal Use Only\r\n */\r\n public _reorderLightsInScene(): void {\r\n const scene = this.getScene();\r\n if (this._renderPriority != 0) {\r\n scene.requireLightSorting = true;\r\n }\r\n this.getScene().sortLightsByPriority();\r\n }\r\n\r\n /**\r\n * Prepares the list of defines specific to the light type.\r\n * @param defines the list of defines\r\n * @param lightIndex defines the index of the light for the effect\r\n */\r\n public abstract prepareLightSpecificDefines(defines: any, lightIndex: number): void;\r\n}\r\n", "import type { Nullable } from \"../../types\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport { Constants } from \"../../Engines/constants\";\r\n\r\nimport type { ISize } from \"../../Maths/math.size\";\r\nimport { Size } from \"../../Maths/math.size\";\r\n\r\nimport type { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\n\r\n/**\r\n * Base class of all the textures in babylon.\r\n * It groups all the common properties required to work with Thin Engine.\r\n */\r\nexport class ThinTexture {\r\n protected _wrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n public get wrapU() {\r\n return this._wrapU;\r\n }\r\n\r\n public set wrapU(value: number) {\r\n this._wrapU = value;\r\n }\r\n\r\n protected _wrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n public get wrapV() {\r\n return this._wrapV;\r\n }\r\n\r\n public set wrapV(value: number) {\r\n this._wrapV = value;\r\n }\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n public wrapR = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n\r\n /**\r\n * With compliant hardware and browser (supporting anisotropic filtering)\r\n * this defines the level of anisotropic filtering in the texture.\r\n * The higher the better but the slower. This defaults to 4 as it seems to be the best tradeoff.\r\n */\r\n public anisotropicFilteringLevel = 4;\r\n\r\n /**\r\n * Define the current state of the loading sequence when in delayed load mode.\r\n */\r\n public delayLoadState = Constants.DELAYLOADSTATE_NONE;\r\n\r\n /**\r\n * How a texture is mapped.\r\n * Unused in thin texture mode.\r\n */\r\n public get coordinatesMode(): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Define if the texture is a cube texture or if false a 2d texture.\r\n */\r\n public get isCube(): boolean {\r\n if (!this._texture) {\r\n return false;\r\n }\r\n\r\n return this._texture.isCube;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected set isCube(value: boolean) {\r\n if (!this._texture) {\r\n return;\r\n }\r\n\r\n this._texture.isCube = value;\r\n }\r\n\r\n /**\r\n * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture.\r\n */\r\n public get is3D(): boolean {\r\n if (!this._texture) {\r\n return false;\r\n }\r\n\r\n return this._texture.is3D;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected set is3D(value: boolean) {\r\n if (!this._texture) {\r\n return;\r\n }\r\n\r\n this._texture.is3D = value;\r\n }\r\n\r\n /**\r\n * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture.\r\n */\r\n public get is2DArray(): boolean {\r\n if (!this._texture) {\r\n return false;\r\n }\r\n\r\n return this._texture.is2DArray;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected set is2DArray(value: boolean) {\r\n if (!this._texture) {\r\n return;\r\n }\r\n\r\n this._texture.is2DArray = value;\r\n }\r\n\r\n /**\r\n * Get the class name of the texture.\r\n * @returns \"ThinTexture\"\r\n */\r\n public getClassName(): string {\r\n return \"ThinTexture\";\r\n }\r\n\r\n /** @internal */\r\n public _texture: Nullable = null;\r\n\r\n protected _engine: Nullable = null;\r\n\r\n private _cachedSize: ISize = Size.Zero();\r\n private _cachedBaseSize: ISize = Size.Zero();\r\n\r\n private static _IsRenderTargetWrapper(texture: Nullable | Nullable): texture is RenderTargetWrapper {\r\n return (texture as RenderTargetWrapper)?._shareDepth !== undefined;\r\n }\r\n\r\n /**\r\n * Instantiates a new ThinTexture.\r\n * Base class of all the textures in babylon.\r\n * This can be used as an internal texture wrapper in ThinEngine to benefit from the cache\r\n * @param internalTexture Define the internalTexture to wrap. You can also pass a RenderTargetWrapper, in which case the texture will be the render target's texture\r\n */\r\n constructor(internalTexture: Nullable) {\r\n this._texture = ThinTexture._IsRenderTargetWrapper(internalTexture) ? internalTexture.texture : internalTexture;\r\n if (this._texture) {\r\n this._engine = this._texture.getEngine();\r\n }\r\n }\r\n\r\n /**\r\n * Get if the texture is ready to be used (downloaded, converted, mip mapped...).\r\n * @returns true if fully ready\r\n */\r\n public isReady(): boolean {\r\n if (this.delayLoadState === Constants.DELAYLOADSTATE_NOTLOADED) {\r\n this.delayLoad();\r\n return false;\r\n }\r\n\r\n if (this._texture) {\r\n return this._texture.isReady;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Triggers the load sequence in delayed load mode.\r\n */\r\n public delayLoad(): void {}\r\n\r\n /**\r\n * Get the underlying lower level texture from Babylon.\r\n * @returns the internal texture\r\n */\r\n public getInternalTexture(): Nullable {\r\n return this._texture;\r\n }\r\n\r\n /**\r\n * Get the size of the texture.\r\n * @returns the texture size.\r\n */\r\n public getSize(): ISize {\r\n if (this._texture) {\r\n if (this._texture.width) {\r\n this._cachedSize.width = this._texture.width;\r\n this._cachedSize.height = this._texture.height;\r\n return this._cachedSize;\r\n }\r\n\r\n if (this._texture._size) {\r\n this._cachedSize.width = this._texture._size;\r\n this._cachedSize.height = this._texture._size;\r\n return this._cachedSize;\r\n }\r\n }\r\n\r\n return this._cachedSize;\r\n }\r\n\r\n /**\r\n * Get the base size of the texture.\r\n * It can be different from the size if the texture has been resized for POT for instance\r\n * @returns the base size\r\n */\r\n public getBaseSize(): ISize {\r\n if (!this.isReady() || !this._texture) {\r\n this._cachedBaseSize.width = 0;\r\n this._cachedBaseSize.height = 0;\r\n return this._cachedBaseSize;\r\n }\r\n\r\n if (this._texture._size) {\r\n this._cachedBaseSize.width = this._texture._size;\r\n this._cachedBaseSize.height = this._texture._size;\r\n return this._cachedBaseSize;\r\n }\r\n\r\n this._cachedBaseSize.width = this._texture.baseWidth;\r\n this._cachedBaseSize.height = this._texture.baseHeight;\r\n return this._cachedBaseSize;\r\n }\r\n\r\n /** @internal */\r\n protected _initialSamplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n\r\n /**\r\n * Get the current sampling mode associated with the texture.\r\n */\r\n public get samplingMode(): number {\r\n if (!this._texture) {\r\n return this._initialSamplingMode;\r\n }\r\n\r\n return this._texture.samplingMode;\r\n }\r\n\r\n /**\r\n * Update the sampling mode of the texture.\r\n * Default is Trilinear mode.\r\n *\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 1 | NEAREST_SAMPLINGMODE or NEAREST_NEAREST_MIPLINEAR | Nearest is: mag = nearest, min = nearest, mip = linear |\r\n * | 2 | BILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPNEAREST | Bilinear is: mag = linear, min = linear, mip = nearest |\r\n * | 3 | TRILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPLINEAR | Trilinear is: mag = linear, min = linear, mip = linear |\r\n * | 4 | NEAREST_NEAREST_MIPNEAREST | |\r\n * | 5 | NEAREST_LINEAR_MIPNEAREST | |\r\n * | 6 | NEAREST_LINEAR_MIPLINEAR | |\r\n * | 7 | NEAREST_LINEAR | |\r\n * | 8 | NEAREST_NEAREST | |\r\n * | 9 | LINEAR_NEAREST_MIPNEAREST | |\r\n * | 10 | LINEAR_NEAREST_MIPLINEAR | |\r\n * | 11 | LINEAR_LINEAR | |\r\n * | 12 | LINEAR_NEAREST | |\r\n *\r\n * > _mag_: magnification filter (close to the viewer)\r\n * > _min_: minification filter (far from the viewer)\r\n * > _mip_: filter used between mip map levels\r\n *@param samplingMode Define the new sampling mode of the texture\r\n */\r\n public updateSamplingMode(samplingMode: number): void {\r\n if (this._texture && this._engine) {\r\n this._engine.updateTextureSamplingMode(samplingMode, this._texture);\r\n }\r\n }\r\n\r\n /**\r\n * Release and destroy the underlying lower level texture aka internalTexture.\r\n */\r\n public releaseInternalTexture(): void {\r\n if (this._texture) {\r\n this._texture.dispose();\r\n this._texture = null;\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public dispose(): void {\r\n if (this._texture) {\r\n this.releaseInternalTexture();\r\n this._engine = null;\r\n }\r\n }\r\n}\r\n", "import { serialize, serializeAsTexture } from \"../../Misc/decorators\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix } from \"../../Maths/math.vector\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { IAnimatable } from \"../../Animations/animatable.interface\";\r\nimport { RandomGUID } from \"../../Misc/guid\";\r\n\r\nimport \"../../Misc/fileTools\";\r\nimport type { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { ThinTexture } from \"./thinTexture\";\r\nimport type { AbstractScene } from \"../../abstractScene\";\r\n\r\nimport type { Animation } from \"../../Animations/animation\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\n\r\n/**\r\n * Base class of all the textures in babylon.\r\n * It groups all the common properties the materials, post process, lights... might need\r\n * in order to make a correct use of the texture.\r\n */\r\nexport class BaseTexture extends ThinTexture implements IAnimatable {\r\n /**\r\n * Default anisotropic filtering level for the application.\r\n * It is set to 4 as a good tradeoff between perf and quality.\r\n */\r\n public static DEFAULT_ANISOTROPIC_FILTERING_LEVEL = 4;\r\n\r\n /**\r\n * Gets or sets the unique id of the texture\r\n */\r\n @serialize()\r\n public uniqueId: number;\r\n\r\n /**\r\n * Define the name of the texture.\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information.\r\n */\r\n @serialize()\r\n public metadata: any = null;\r\n\r\n /** @internal */\r\n public _internalMetadata: any;\r\n\r\n /**\r\n * For internal use only. Please do not use.\r\n */\r\n public reservedDataStore: any = null;\r\n\r\n @serialize(\"hasAlpha\")\r\n private _hasAlpha = false;\r\n /**\r\n * Define if the texture is having a usable alpha value (can be use for transparency or glossiness for instance).\r\n */\r\n public set hasAlpha(value: boolean) {\r\n if (this._hasAlpha === value) {\r\n return;\r\n }\r\n this._hasAlpha = value;\r\n if (this._scene) {\r\n this._scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n }\r\n public get hasAlpha(): boolean {\r\n return this._hasAlpha;\r\n }\r\n\r\n @serialize(\"getAlphaFromRGB\")\r\n private _getAlphaFromRGB = false;\r\n /**\r\n * Defines if the alpha value should be determined via the rgb values.\r\n * If true the luminance of the pixel might be used to find the corresponding alpha value.\r\n */\r\n public set getAlphaFromRGB(value: boolean) {\r\n if (this._getAlphaFromRGB === value) {\r\n return;\r\n }\r\n this._getAlphaFromRGB = value;\r\n if (this._scene) {\r\n this._scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n }\r\n public get getAlphaFromRGB(): boolean {\r\n return this._getAlphaFromRGB;\r\n }\r\n\r\n /**\r\n * Intensity or strength of the texture.\r\n * It is commonly used by materials to fine tune the intensity of the texture\r\n */\r\n @serialize()\r\n public level = 1;\r\n\r\n @serialize(\"coordinatesIndex\")\r\n protected _coordinatesIndex = 0;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the texture should try to reduce shader code if there is no UV manipulation.\r\n * (ie. when texture.getTextureMatrix().isIdentityAs3x2() returns true)\r\n */\r\n @serialize()\r\n public optimizeUVAllocation = true;\r\n\r\n /**\r\n * Define the UV channel to use starting from 0 and defaulting to 0.\r\n * This is part of the texture as textures usually maps to one uv set.\r\n */\r\n public set coordinatesIndex(value: number) {\r\n if (this._coordinatesIndex === value) {\r\n return;\r\n }\r\n this._coordinatesIndex = value;\r\n if (this._scene) {\r\n this._scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n }\r\n public get coordinatesIndex(): number {\r\n return this._coordinatesIndex;\r\n }\r\n\r\n @serialize(\"coordinatesMode\")\r\n protected _coordinatesMode = Constants.TEXTURE_EXPLICIT_MODE;\r\n\r\n /**\r\n * How a texture is mapped.\r\n *\r\n * | Value | Type | Description |\r\n * | ----- | ----------------------------------- | ----------- |\r\n * | 0 | EXPLICIT_MODE | |\r\n * | 1 | SPHERICAL_MODE | |\r\n * | 2 | PLANAR_MODE | |\r\n * | 3 | CUBIC_MODE | |\r\n * | 4 | PROJECTION_MODE | |\r\n * | 5 | SKYBOX_MODE | |\r\n * | 6 | INVCUBIC_MODE | |\r\n * | 7 | EQUIRECTANGULAR_MODE | |\r\n * | 8 | FIXED_EQUIRECTANGULAR_MODE | |\r\n * | 9 | FIXED_EQUIRECTANGULAR_MIRRORED_MODE | |\r\n */\r\n public set coordinatesMode(value: number) {\r\n if (this._coordinatesMode === value) {\r\n return;\r\n }\r\n this._coordinatesMode = value;\r\n if (this._scene) {\r\n this._scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n }\r\n public get coordinatesMode(): number {\r\n return this._coordinatesMode;\r\n }\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n @serialize()\r\n public get wrapU() {\r\n return this._wrapU;\r\n }\r\n public set wrapU(value: number) {\r\n this._wrapU = value;\r\n }\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n @serialize()\r\n public get wrapV() {\r\n return this._wrapV;\r\n }\r\n public set wrapV(value: number) {\r\n this._wrapV = value;\r\n }\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n @serialize()\r\n public wrapR = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n\r\n /**\r\n * With compliant hardware and browser (supporting anisotropic filtering)\r\n * this defines the level of anisotropic filtering in the texture.\r\n * The higher the better but the slower. This defaults to 4 as it seems to be the best tradeoff.\r\n */\r\n @serialize()\r\n public anisotropicFilteringLevel = BaseTexture.DEFAULT_ANISOTROPIC_FILTERING_LEVEL;\r\n\r\n /** @internal */\r\n public _isCube = false;\r\n /**\r\n * Define if the texture is a cube texture or if false a 2d texture.\r\n */\r\n @serialize()\r\n public get isCube(): boolean {\r\n if (!this._texture) {\r\n return this._isCube;\r\n }\r\n\r\n return this._texture.isCube;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected set isCube(value: boolean) {\r\n if (!this._texture) {\r\n this._isCube = value;\r\n } else {\r\n this._texture.isCube = value;\r\n }\r\n }\r\n\r\n /**\r\n * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture.\r\n */\r\n @serialize()\r\n public get is3D(): boolean {\r\n if (!this._texture) {\r\n return false;\r\n }\r\n\r\n return this._texture.is3D;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected set is3D(value: boolean) {\r\n if (!this._texture) {\r\n return;\r\n }\r\n\r\n this._texture.is3D = value;\r\n }\r\n\r\n /**\r\n * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture.\r\n */\r\n @serialize()\r\n public get is2DArray(): boolean {\r\n if (!this._texture) {\r\n return false;\r\n }\r\n\r\n return this._texture.is2DArray;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected set is2DArray(value: boolean) {\r\n if (!this._texture) {\r\n return;\r\n }\r\n\r\n this._texture.is2DArray = value;\r\n }\r\n\r\n /** @internal */\r\n protected _gammaSpace = true;\r\n /**\r\n * Define if the texture contains data in gamma space (most of the png/jpg aside bump).\r\n * HDR texture are usually stored in linear space.\r\n * This only impacts the PBR and Background materials\r\n */\r\n @serialize()\r\n public get gammaSpace(): boolean {\r\n if (!this._texture) {\r\n return this._gammaSpace;\r\n } else {\r\n if (this._texture._gammaSpace === null) {\r\n this._texture._gammaSpace = this._gammaSpace;\r\n }\r\n }\r\n\r\n return this._texture._gammaSpace && !this._texture._useSRGBBuffer;\r\n }\r\n\r\n public set gammaSpace(gamma: boolean) {\r\n if (!this._texture) {\r\n if (this._gammaSpace === gamma) {\r\n return;\r\n }\r\n\r\n this._gammaSpace = gamma;\r\n } else {\r\n if (this._texture._gammaSpace === gamma) {\r\n return;\r\n }\r\n this._texture._gammaSpace = gamma;\r\n }\r\n\r\n this.getScene()?.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n\r\n /**\r\n * Gets or sets whether or not the texture contains RGBD data.\r\n */\r\n public get isRGBD(): boolean {\r\n return this._texture != null && this._texture._isRGBD;\r\n }\r\n public set isRGBD(value: boolean) {\r\n if (value === this.isRGBD) {\r\n return;\r\n }\r\n\r\n if (this._texture) {\r\n this._texture._isRGBD = value;\r\n }\r\n\r\n this.getScene()?.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n\r\n /**\r\n * Is Z inverted in the texture (useful in a cube texture).\r\n */\r\n @serialize()\r\n public invertZ = false;\r\n\r\n /**\r\n * Are mip maps generated for this texture or not.\r\n */\r\n public get noMipmap(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n @serialize()\r\n public lodLevelInAlpha = false;\r\n\r\n /**\r\n * With prefiltered texture, defined the offset used during the prefiltering steps.\r\n */\r\n @serialize()\r\n public get lodGenerationOffset(): number {\r\n if (this._texture) {\r\n return this._texture._lodGenerationOffset;\r\n }\r\n\r\n return 0.0;\r\n }\r\n public set lodGenerationOffset(value: number) {\r\n if (this._texture) {\r\n this._texture._lodGenerationOffset = value;\r\n }\r\n }\r\n\r\n /**\r\n * With prefiltered texture, defined the scale used during the prefiltering steps.\r\n */\r\n @serialize()\r\n public get lodGenerationScale(): number {\r\n if (this._texture) {\r\n return this._texture._lodGenerationScale;\r\n }\r\n\r\n return 0.0;\r\n }\r\n public set lodGenerationScale(value: number) {\r\n if (this._texture) {\r\n this._texture._lodGenerationScale = value;\r\n }\r\n }\r\n\r\n /**\r\n * With prefiltered texture, defined if the specular generation is based on a linear ramp.\r\n * By default we are using a log2 of the linear roughness helping to keep a better resolution for\r\n * average roughness values.\r\n */\r\n @serialize()\r\n public get linearSpecularLOD(): boolean {\r\n if (this._texture) {\r\n return this._texture._linearSpecularLOD;\r\n }\r\n\r\n return false;\r\n }\r\n public set linearSpecularLOD(value: boolean) {\r\n if (this._texture) {\r\n this._texture._linearSpecularLOD = value;\r\n }\r\n }\r\n\r\n /**\r\n * In case a better definition than spherical harmonics is required for the diffuse part of the environment.\r\n * You can set the irradiance texture to rely on a texture instead of the spherical approach.\r\n * This texture need to have the same characteristics than its parent (Cube vs 2d, coordinates mode, Gamma/Linear, RGBD).\r\n */\r\n @serializeAsTexture()\r\n public get irradianceTexture(): Nullable {\r\n if (this._texture) {\r\n return this._texture._irradianceTexture;\r\n }\r\n\r\n return null;\r\n }\r\n public set irradianceTexture(value: Nullable) {\r\n if (this._texture) {\r\n this._texture._irradianceTexture = value;\r\n }\r\n }\r\n\r\n /**\r\n * Define if the texture is a render target.\r\n */\r\n @serialize()\r\n public isRenderTarget = false;\r\n\r\n /**\r\n * Define the unique id of the texture in the scene.\r\n */\r\n public get uid(): string {\r\n if (!this._uid) {\r\n this._uid = RandomGUID();\r\n }\r\n return this._uid;\r\n }\r\n\r\n /** @internal */\r\n public _prefiltered: boolean = false;\r\n /** @internal */\r\n public _forceSerialize: boolean = false;\r\n\r\n /**\r\n * Return a string representation of the texture.\r\n * @returns the texture as a string\r\n */\r\n public toString(): string {\r\n return this.name;\r\n }\r\n\r\n /**\r\n * Get the class name of the texture.\r\n * @returns \"BaseTexture\"\r\n */\r\n public getClassName(): string {\r\n return \"BaseTexture\";\r\n }\r\n\r\n /**\r\n * Define the list of animation attached to the texture.\r\n */\r\n public animations: Animation[] = [];\r\n\r\n /**\r\n * An event triggered when the texture is disposed.\r\n */\r\n public onDisposeObservable = new Observable();\r\n\r\n private _onDisposeObserver: Nullable> = null;\r\n /**\r\n * Callback triggered when the texture has been disposed.\r\n * Kept for back compatibility, you can use the onDisposeObservable instead.\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n protected _scene: Nullable = null;\r\n\r\n /** @internal */\r\n private _uid: Nullable = null;\r\n\r\n /**\r\n * Define if the texture is preventing a material to render or not.\r\n * If not and the texture is not ready, the engine will use a default black texture instead.\r\n */\r\n public get isBlocking(): boolean {\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable = null;\r\n\r\n protected _loadingError: boolean = false;\r\n protected _errorObject?: {\r\n message?: string;\r\n exception?: any;\r\n };\r\n\r\n /**\r\n * Was there any loading error?\r\n */\r\n public get loadingError(): boolean {\r\n return this._loadingError;\r\n }\r\n\r\n /**\r\n * If a loading error occurred this object will be populated with information about the error.\r\n */\r\n public get errorObject():\r\n | {\r\n message?: string;\r\n exception?: any;\r\n }\r\n | undefined {\r\n return this._errorObject;\r\n }\r\n\r\n /**\r\n * Instantiates a new BaseTexture.\r\n * Base class of all the textures in babylon.\r\n * It groups all the common properties the materials, post process, lights... might need\r\n * in order to make a correct use of the texture.\r\n * @param sceneOrEngine Define the scene or engine the texture belongs to\r\n * @param internalTexture Define the internal texture associated with the texture\r\n */\r\n constructor(sceneOrEngine?: Nullable, internalTexture: Nullable = null) {\r\n super(null);\r\n\r\n if (sceneOrEngine) {\r\n if (BaseTexture._IsScene(sceneOrEngine)) {\r\n this._scene = sceneOrEngine;\r\n } else {\r\n this._engine = sceneOrEngine;\r\n }\r\n } else {\r\n this._scene = EngineStore.LastCreatedScene;\r\n }\r\n\r\n if (this._scene) {\r\n this.uniqueId = this._scene.getUniqueId();\r\n this._scene.addTexture(this);\r\n this._engine = this._scene.getEngine();\r\n }\r\n\r\n this._texture = internalTexture;\r\n\r\n this._uid = null;\r\n }\r\n\r\n /**\r\n * Get the scene the texture belongs to.\r\n * @returns the scene or null if undefined\r\n */\r\n public getScene(): Nullable {\r\n return this._scene;\r\n }\r\n\r\n /** @internal */\r\n protected _getEngine(): Nullable {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * Checks if the texture has the same transform matrix than another texture\r\n * @param texture texture to check against\r\n * @returns true if the transforms are the same, else false\r\n */\r\n public checkTransformsAreIdentical(texture: Nullable): boolean {\r\n return texture !== null;\r\n }\r\n\r\n /**\r\n * Get the texture transform matrix used to offset tile the texture for instance.\r\n * @returns the transformation matrix\r\n */\r\n public getTextureMatrix(): Matrix {\r\n return Matrix.IdentityReadOnly;\r\n }\r\n\r\n /**\r\n * Get the texture reflection matrix used to rotate/transform the reflection.\r\n * @returns the reflection matrix\r\n */\r\n public getReflectionTextureMatrix(): Matrix {\r\n return Matrix.IdentityReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a suitable rotate/transform matrix when the texture is used for refraction.\r\n * There's a separate function from getReflectionTextureMatrix because refraction requires a special configuration of the matrix in right-handed mode.\r\n * @returns The refraction matrix\r\n */\r\n public getRefractionTextureMatrix(): Matrix {\r\n return this.getReflectionTextureMatrix();\r\n }\r\n\r\n /**\r\n * Get if the texture is ready to be consumed (either it is ready or it is not blocking)\r\n * @returns true if ready, not blocking or if there was an error loading the texture\r\n */\r\n public isReadyOrNotBlocking(): boolean {\r\n return !this.isBlocking || this.isReady() || this.loadingError;\r\n }\r\n\r\n /**\r\n * Scales the texture if is `canRescale()`\r\n * @param ratio the resize factor we want to use to rescale\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public scale(ratio: number): void {}\r\n\r\n /**\r\n * Get if the texture can rescale.\r\n */\r\n public get canRescale(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getFromCache(url: Nullable, noMipmap: boolean, sampling?: number, invertY?: boolean, useSRGBBuffer?: boolean, isCube?: boolean): Nullable {\r\n const engine = this._getEngine();\r\n if (!engine) {\r\n return null;\r\n }\r\n\r\n const correctedUseSRGBBuffer = engine._getUseSRGBBuffer(!!useSRGBBuffer, noMipmap);\r\n\r\n const texturesCache = engine.getLoadedTexturesCache();\r\n for (let index = 0; index < texturesCache.length; index++) {\r\n const texturesCacheEntry = texturesCache[index];\r\n\r\n if (useSRGBBuffer === undefined || correctedUseSRGBBuffer === texturesCacheEntry._useSRGBBuffer) {\r\n if (invertY === undefined || invertY === texturesCacheEntry.invertY) {\r\n if (texturesCacheEntry.url === url && texturesCacheEntry.generateMipMaps === !noMipmap) {\r\n if (!sampling || sampling === texturesCacheEntry.samplingMode) {\r\n if (isCube === undefined || isCube === texturesCacheEntry.isCube) {\r\n texturesCacheEntry.incrementReferences();\r\n return texturesCacheEntry;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(_fromContextLost = false): void {}\r\n\r\n /**\r\n * Clones the texture.\r\n * @returns the cloned texture\r\n */\r\n public clone(): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Get the texture underlying type (INT, FLOAT...)\r\n */\r\n public get textureType(): number {\r\n if (!this._texture) {\r\n return Constants.TEXTURETYPE_UNSIGNED_INT;\r\n }\r\n\r\n return this._texture.type !== undefined ? this._texture.type : Constants.TEXTURETYPE_UNSIGNED_INT;\r\n }\r\n\r\n /**\r\n * Get the texture underlying format (RGB, RGBA...)\r\n */\r\n public get textureFormat(): number {\r\n if (!this._texture) {\r\n return Constants.TEXTUREFORMAT_RGBA;\r\n }\r\n\r\n return this._texture.format !== undefined ? this._texture.format : Constants.TEXTUREFORMAT_RGBA;\r\n }\r\n\r\n /**\r\n * Indicates that textures need to be re-calculated for all materials\r\n */\r\n protected _markAllSubMeshesAsTexturesDirty() {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Reads the pixels stored in the webgl texture and returns them as an ArrayBuffer.\r\n * This will returns an RGBA array buffer containing either in values (0-255) or\r\n * float values (0-1) depending of the underlying buffer type.\r\n * @param faceIndex defines the face of the texture to read (in case of cube texture)\r\n * @param level defines the LOD level of the texture to read (in case of Mip Maps)\r\n * @param buffer defines a user defined buffer to fill with data (can be null)\r\n * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels\r\n * @param noDataConversion false to convert the data to Uint8Array (if texture type is UNSIGNED_BYTE) or to Float32Array (if texture type is anything but UNSIGNED_BYTE). If true, the type of the generated buffer (if buffer==null) will depend on the type of the texture\r\n * @param x defines the region x coordinates to start reading from (default to 0)\r\n * @param y defines the region y coordinates to start reading from (default to 0)\r\n * @param width defines the region width to read from (default to the texture size at level)\r\n * @param height defines the region width to read from (default to the texture size at level)\r\n * @returns The Array buffer promise containing the pixels data.\r\n */\r\n public readPixels(\r\n faceIndex = 0,\r\n level = 0,\r\n buffer: Nullable = null,\r\n flushRenderer = true,\r\n noDataConversion = false,\r\n x = 0,\r\n y = 0,\r\n width = Number.MAX_VALUE,\r\n height = Number.MAX_VALUE\r\n ): Nullable> {\r\n if (!this._texture) {\r\n return null;\r\n }\r\n\r\n const engine = this._getEngine();\r\n if (!engine) {\r\n return null;\r\n }\r\n\r\n const size = this.getSize();\r\n let maxWidth = size.width;\r\n let maxHeight = size.height;\r\n if (level !== 0) {\r\n maxWidth = maxWidth / Math.pow(2, level);\r\n maxHeight = maxHeight / Math.pow(2, level);\r\n maxWidth = Math.round(maxWidth);\r\n maxHeight = Math.round(maxHeight);\r\n }\r\n\r\n width = Math.min(maxWidth, width);\r\n height = Math.min(maxHeight, height);\r\n\r\n try {\r\n if (this._texture.isCube) {\r\n return engine._readTexturePixels(this._texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion, x, y);\r\n }\r\n\r\n return engine._readTexturePixels(this._texture, width, height, -1, level, buffer, flushRenderer, noDataConversion, x, y);\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _readPixelsSync(faceIndex = 0, level = 0, buffer: Nullable = null, flushRenderer = true, noDataConversion = false): Nullable {\r\n if (!this._texture) {\r\n return null;\r\n }\r\n\r\n const size = this.getSize();\r\n let width = size.width;\r\n let height = size.height;\r\n\r\n const engine = this._getEngine();\r\n if (!engine) {\r\n return null;\r\n }\r\n\r\n if (level != 0) {\r\n width = width / Math.pow(2, level);\r\n height = height / Math.pow(2, level);\r\n\r\n width = Math.round(width);\r\n height = Math.round(height);\r\n }\r\n\r\n try {\r\n if (this._texture.isCube) {\r\n return engine._readTexturePixelsSync(this._texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion);\r\n }\r\n\r\n return engine._readTexturePixelsSync(this._texture, width, height, -1, level, buffer, flushRenderer, noDataConversion);\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public get _lodTextureHigh(): Nullable {\r\n if (this._texture) {\r\n return this._texture._lodTextureHigh;\r\n }\r\n return null;\r\n }\r\n\r\n /** @internal */\r\n public get _lodTextureMid(): Nullable {\r\n if (this._texture) {\r\n return this._texture._lodTextureMid;\r\n }\r\n return null;\r\n }\r\n\r\n /** @internal */\r\n public get _lodTextureLow(): Nullable {\r\n if (this._texture) {\r\n return this._texture._lodTextureLow;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public dispose(): void {\r\n if (this._scene) {\r\n // Animations\r\n if (this._scene.stopAnimation) {\r\n this._scene.stopAnimation(this);\r\n }\r\n\r\n // Remove from scene\r\n this._scene.removePendingData(this);\r\n const index = this._scene.textures.indexOf(this);\r\n\r\n if (index >= 0) {\r\n this._scene.textures.splice(index, 1);\r\n }\r\n this._scene.onTextureRemovedObservable.notifyObservers(this);\r\n this._scene = null;\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.textures.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.textures.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n\r\n this.metadata = null;\r\n\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Serialize the texture into a JSON representation that can be parsed later on.\r\n * @param allowEmptyName True to force serialization even if name is empty. Default: false\r\n * @returns the JSON representation of the texture\r\n */\r\n public serialize(allowEmptyName = false): any {\r\n if (!this.name && !allowEmptyName) {\r\n return null;\r\n }\r\n\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Helper function to be called back once a list of texture contains only ready textures.\r\n * @param textures Define the list of textures to wait for\r\n * @param callback Define the callback triggered once the entire list will be ready\r\n */\r\n public static WhenAllReady(textures: BaseTexture[], callback: () => void): void {\r\n let numRemaining = textures.length;\r\n if (numRemaining === 0) {\r\n callback();\r\n return;\r\n }\r\n\r\n for (let i = 0; i < textures.length; i++) {\r\n const texture = textures[i];\r\n\r\n if (texture.isReady()) {\r\n if (--numRemaining === 0) {\r\n callback();\r\n }\r\n } else {\r\n const onLoadObservable = (texture as any).onLoadObservable as Observable;\r\n\r\n if (onLoadObservable) {\r\n onLoadObservable.addOnce(() => {\r\n if (--numRemaining === 0) {\r\n callback();\r\n }\r\n });\r\n } else {\r\n if (--numRemaining === 0) {\r\n callback();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private static _IsScene(sceneOrEngine: Scene | ThinEngine): sceneOrEngine is Scene {\r\n return sceneOrEngine.getClassName() === \"Scene\";\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { ISize } from \"../Maths/math.size\";\r\nimport type { Nullable } from \"../types\";\r\n\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\n\r\n/**\r\n * Transform some pixel data to a base64 string\r\n * @param pixels defines the pixel data to transform to base64\r\n * @param size defines the width and height of the (texture) data\r\n * @param invertY true if the data must be inverted for the Y coordinate during the conversion\r\n * @returns The base64 encoded string or null\r\n */\r\nexport function GenerateBase64StringFromPixelData(pixels: ArrayBufferView, size: ISize, invertY = false): Nullable {\r\n const width = size.width;\r\n const height = size.height;\r\n\r\n if (pixels instanceof Float32Array) {\r\n let len = pixels.byteLength / pixels.BYTES_PER_ELEMENT;\r\n const npixels = new Uint8Array(len);\r\n\r\n while (--len >= 0) {\r\n let val = pixels[len];\r\n if (val < 0) {\r\n val = 0;\r\n } else if (val > 1) {\r\n val = 1;\r\n }\r\n npixels[len] = val * 255;\r\n }\r\n\r\n pixels = npixels;\r\n }\r\n\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = width;\r\n canvas.height = height;\r\n\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) {\r\n return null;\r\n }\r\n\r\n const imageData = ctx.createImageData(width, height);\r\n const castData = imageData.data;\r\n castData.set(pixels);\r\n ctx.putImageData(imageData, 0, 0);\r\n\r\n if (invertY) {\r\n const canvas2 = document.createElement(\"canvas\");\r\n canvas2.width = width;\r\n canvas2.height = height;\r\n\r\n const ctx2 = canvas2.getContext(\"2d\");\r\n if (!ctx2) {\r\n return null;\r\n }\r\n\r\n ctx2.translate(0, height);\r\n ctx2.scale(1, -1);\r\n ctx2.drawImage(canvas, 0, 0);\r\n\r\n return canvas2.toDataURL(\"image/png\");\r\n }\r\n\r\n return canvas.toDataURL(\"image/png\");\r\n}\r\n\r\n/**\r\n * Reads the pixels stored in the webgl texture and returns them as a base64 string\r\n * @param texture defines the texture to read pixels from\r\n * @param faceIndex defines the face of the texture to read (in case of cube texture)\r\n * @param level defines the LOD level of the texture to read (in case of Mip Maps)\r\n * @returns The base64 encoded string or null\r\n */\r\nexport function GenerateBase64StringFromTexture(texture: BaseTexture, faceIndex = 0, level = 0): Nullable {\r\n const internalTexture = texture.getInternalTexture();\r\n if (!internalTexture) {\r\n return null;\r\n }\r\n\r\n const pixels = texture._readPixelsSync(faceIndex, level);\r\n if (!pixels) {\r\n return null;\r\n }\r\n\r\n return GenerateBase64StringFromPixelData(pixels, texture.getSize(), internalTexture.invertY);\r\n}\r\n\r\n/**\r\n * Reads the pixels stored in the webgl texture and returns them as a base64 string\r\n * @param texture defines the texture to read pixels from\r\n * @param faceIndex defines the face of the texture to read (in case of cube texture)\r\n * @param level defines the LOD level of the texture to read (in case of Mip Maps)\r\n * @returns The base64 encoded string or null wrapped in a promise\r\n */\r\nexport async function GenerateBase64StringFromTextureAsync(texture: BaseTexture, faceIndex = 0, level = 0): Promise> {\r\n const internalTexture = texture.getInternalTexture();\r\n if (!internalTexture) {\r\n return null;\r\n }\r\n\r\n const pixels = await texture.readPixels(faceIndex, level);\r\n if (!pixels) {\r\n return null;\r\n }\r\n\r\n return GenerateBase64StringFromPixelData(pixels, texture.getSize(), internalTexture.invertY);\r\n}\r\n\r\n/**\r\n * Class used to host copy specific utilities\r\n * (Back-compat)\r\n */\r\nexport const CopyTools = {\r\n /**\r\n * Transform some pixel data to a base64 string\r\n * @param pixels defines the pixel data to transform to base64\r\n * @param size defines the width and height of the (texture) data\r\n * @param invertY true if the data must be inverted for the Y coordinate during the conversion\r\n * @returns The base64 encoded string or null\r\n */\r\n GenerateBase64StringFromPixelData,\r\n\r\n /**\r\n * Reads the pixels stored in the webgl texture and returns them as a base64 string\r\n * @param texture defines the texture to read pixels from\r\n * @param faceIndex defines the face of the texture to read (in case of cube texture)\r\n * @param level defines the LOD level of the texture to read (in case of Mip Maps)\r\n * @returns The base64 encoded string or null\r\n */\r\n GenerateBase64StringFromTexture,\r\n\r\n /**\r\n * Reads the pixels stored in the webgl texture and returns them as a base64 string\r\n * @param texture defines the texture to read pixels from\r\n * @param faceIndex defines the face of the texture to read (in case of cube texture)\r\n * @param level defines the LOD level of the texture to read (in case of Mip Maps)\r\n * @returns The base64 encoded string or null wrapped in a promise\r\n */\r\n GenerateBase64StringFromTextureAsync,\r\n};\r\n", "import { serialize } from \"../../Misc/decorators\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Matrix, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { GetClass, RegisterClass } from \"../../Misc/typeStore\";\r\nimport { _WarnImport } from \"../../Misc/devTools\";\r\nimport type { IInspectable } from \"../../Misc/iInspectable\";\r\nimport type { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { TimingTools } from \"../../Misc/timingTools\";\r\nimport { InstantiationTools } from \"../../Misc/instantiationTools\";\r\nimport { Plane } from \"../../Maths/math.plane\";\r\nimport { EncodeArrayBufferToBase64 } from \"../../Misc/stringTools\";\r\nimport { GenerateBase64StringFromTexture, GenerateBase64StringFromTextureAsync } from \"../../Misc/copyTools\";\r\nimport { CompatibilityOptions } from \"../../Compat/compatibilityOptions\";\r\nimport type { InternalTexture } from \"./internalTexture\";\r\n\r\nimport type { CubeTexture } from \"../../Materials/Textures/cubeTexture\";\r\nimport type { MirrorTexture } from \"../../Materials/Textures/mirrorTexture\";\r\nimport type { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { VideoTexture, VideoTextureSettings } from \"./videoTexture\";\r\n\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\n\r\n/**\r\n * Defines the available options when creating a texture\r\n */\r\nexport interface ITextureCreationOptions {\r\n /** Defines if the texture will require mip maps or not (default: false) */\r\n noMipmap?: boolean;\r\n\r\n /** Defines if the texture needs to be inverted on the y axis during loading (default: true) */\r\n invertY?: boolean;\r\n\r\n /** Defines the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...) (default: Texture.TRILINEAR_SAMPLINGMODE) */\r\n samplingMode?: number;\r\n\r\n /** Defines a callback triggered when the texture has been loaded (default: null) */\r\n onLoad?: Nullable<() => void>;\r\n\r\n /** Defines a callback triggered when an error occurred during the loading session (default: null) */\r\n onError?: Nullable<(message?: string, exception?: any) => void>;\r\n\r\n /** Defines the buffer to load the texture from in case the texture is loaded from a buffer representation (default: null) */\r\n buffer?: Nullable;\r\n\r\n /** Defines if the buffer we are loading the texture from should be deleted after load (default: false) */\r\n deleteBuffer?: boolean;\r\n\r\n /** Defines the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...) (default: ) */\r\n format?: number;\r\n\r\n /** Defines an optional mime type information (default: undefined) */\r\n mimeType?: string;\r\n\r\n /** Options to be passed to the loader (default: undefined) */\r\n loaderOptions?: any;\r\n\r\n /** Specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg) (default: undefined) */\r\n creationFlags?: number;\r\n\r\n /** Defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU) (default: false) */\r\n useSRGBBuffer?: boolean;\r\n\r\n /** Defines the underlying texture from an already existing one */\r\n internalTexture?: InternalTexture;\r\n\r\n /** Defines the underlying texture texture space */\r\n gammaSpace?: boolean;\r\n}\r\n\r\n/**\r\n * This represents a texture in babylon. It can be easily loaded from a network, base64 or html input.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#texture\r\n */\r\nexport class Texture extends BaseTexture {\r\n /**\r\n * Gets or sets a general boolean used to indicate that textures containing direct data (buffers) must be saved as part of the serialization process\r\n */\r\n public static SerializeBuffers = true;\r\n\r\n /**\r\n * Gets or sets a general boolean used to indicate that texture buffers must be saved as part of the serialization process.\r\n * If no buffer exists, one will be created as base64 string from the internal webgl data.\r\n */\r\n public static ForceSerializeBuffers = false;\r\n\r\n /**\r\n * This observable will notify when any texture had a loading error\r\n */\r\n public static OnTextureLoadErrorObservable = new Observable();\r\n\r\n /** @internal */\r\n public static _SerializeInternalTextureUniqueId = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _CubeTextureParser = (jsonTexture: any, scene: Scene, rootUrl: string): CubeTexture => {\r\n throw _WarnImport(\"CubeTexture\");\r\n };\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _CreateMirror = (name: string, renderTargetSize: number, scene: Scene, generateMipMaps: boolean): MirrorTexture => {\r\n throw _WarnImport(\"MirrorTexture\");\r\n };\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _CreateRenderTargetTexture = (name: string, renderTargetSize: number, scene: Scene, generateMipMaps: boolean, creationFlags?: number): RenderTargetTexture => {\r\n throw _WarnImport(\"RenderTargetTexture\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _CreateVideoTexture(\r\n name: Nullable,\r\n src: string | string[] | HTMLVideoElement,\r\n scene: Nullable,\r\n generateMipMaps = false,\r\n invertY = false,\r\n samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE,\r\n settings: Partial = {},\r\n onError?: Nullable<(message?: string, exception?: any) => void>,\r\n format: number = Constants.TEXTUREFORMAT_RGBA\r\n ): VideoTexture {\r\n throw _WarnImport(\"VideoTexture\");\r\n }\r\n\r\n /** nearest is mag = nearest and min = nearest and no mip */\r\n public static readonly NEAREST_SAMPLINGMODE = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n /** nearest is mag = nearest and min = nearest and mip = linear */\r\n public static readonly NEAREST_NEAREST_MIPLINEAR = Constants.TEXTURE_NEAREST_NEAREST_MIPLINEAR; // nearest is mag = nearest and min = nearest and mip = linear\r\n\r\n /** Bilinear is mag = linear and min = linear and no mip */\r\n public static readonly BILINEAR_SAMPLINGMODE = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n /** Bilinear is mag = linear and min = linear and mip = nearest */\r\n public static readonly LINEAR_LINEAR_MIPNEAREST = Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST; // Bilinear is mag = linear and min = linear and mip = nearest\r\n\r\n /** Trilinear is mag = linear and min = linear and mip = linear */\r\n public static readonly TRILINEAR_SAMPLINGMODE = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n /** Trilinear is mag = linear and min = linear and mip = linear */\r\n public static readonly LINEAR_LINEAR_MIPLINEAR = Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR; // Trilinear is mag = linear and min = linear and mip = linear\r\n\r\n /** mag = nearest and min = nearest and mip = nearest */\r\n public static readonly NEAREST_NEAREST_MIPNEAREST = Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST;\r\n /** mag = nearest and min = linear and mip = nearest */\r\n public static readonly NEAREST_LINEAR_MIPNEAREST = Constants.TEXTURE_NEAREST_LINEAR_MIPNEAREST;\r\n /** mag = nearest and min = linear and mip = linear */\r\n public static readonly NEAREST_LINEAR_MIPLINEAR = Constants.TEXTURE_NEAREST_LINEAR_MIPLINEAR;\r\n /** mag = nearest and min = linear and mip = none */\r\n public static readonly NEAREST_LINEAR = Constants.TEXTURE_NEAREST_LINEAR;\r\n /** mag = nearest and min = nearest and mip = none */\r\n public static readonly NEAREST_NEAREST = Constants.TEXTURE_NEAREST_NEAREST;\r\n /** mag = linear and min = nearest and mip = nearest */\r\n public static readonly LINEAR_NEAREST_MIPNEAREST = Constants.TEXTURE_LINEAR_NEAREST_MIPNEAREST;\r\n /** mag = linear and min = nearest and mip = linear */\r\n public static readonly LINEAR_NEAREST_MIPLINEAR = Constants.TEXTURE_LINEAR_NEAREST_MIPLINEAR;\r\n /** mag = linear and min = linear and mip = none */\r\n public static readonly LINEAR_LINEAR = Constants.TEXTURE_LINEAR_LINEAR;\r\n /** mag = linear and min = nearest and mip = none */\r\n public static readonly LINEAR_NEAREST = Constants.TEXTURE_LINEAR_NEAREST;\r\n\r\n /** Explicit coordinates mode */\r\n public static readonly EXPLICIT_MODE = Constants.TEXTURE_EXPLICIT_MODE;\r\n /** Spherical coordinates mode */\r\n public static readonly SPHERICAL_MODE = Constants.TEXTURE_SPHERICAL_MODE;\r\n /** Planar coordinates mode */\r\n public static readonly PLANAR_MODE = Constants.TEXTURE_PLANAR_MODE;\r\n /** Cubic coordinates mode */\r\n public static readonly CUBIC_MODE = Constants.TEXTURE_CUBIC_MODE;\r\n /** Projection coordinates mode */\r\n public static readonly PROJECTION_MODE = Constants.TEXTURE_PROJECTION_MODE;\r\n /** Inverse Cubic coordinates mode */\r\n public static readonly SKYBOX_MODE = Constants.TEXTURE_SKYBOX_MODE;\r\n /** Inverse Cubic coordinates mode */\r\n public static readonly INVCUBIC_MODE = Constants.TEXTURE_INVCUBIC_MODE;\r\n /** Equirectangular coordinates mode */\r\n public static readonly EQUIRECTANGULAR_MODE = Constants.TEXTURE_EQUIRECTANGULAR_MODE;\r\n /** Equirectangular Fixed coordinates mode */\r\n public static readonly FIXED_EQUIRECTANGULAR_MODE = Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MODE;\r\n /** Equirectangular Fixed Mirrored coordinates mode */\r\n public static readonly FIXED_EQUIRECTANGULAR_MIRRORED_MODE = Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE;\r\n\r\n /** Texture is not repeating outside of 0..1 UVs */\r\n public static readonly CLAMP_ADDRESSMODE = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n /** Texture is repeating outside of 0..1 UVs */\r\n public static readonly WRAP_ADDRESSMODE = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n /** Texture is repeating and mirrored */\r\n public static readonly MIRROR_ADDRESSMODE = Constants.TEXTURE_MIRROR_ADDRESSMODE;\r\n\r\n /**\r\n * Gets or sets a boolean which defines if the texture url must be build from the serialized URL instead of just using the name and loading them side by side with the scene file\r\n */\r\n public static UseSerializedUrlIfAny = false;\r\n\r\n /**\r\n * Define the url of the texture.\r\n */\r\n @serialize()\r\n public url: Nullable = null;\r\n\r\n /**\r\n * Define an offset on the texture to offset the u coordinates of the UVs\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#offsetting\r\n */\r\n @serialize()\r\n public uOffset = 0;\r\n\r\n /**\r\n * Define an offset on the texture to offset the v coordinates of the UVs\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#offsetting\r\n */\r\n @serialize()\r\n public vOffset = 0;\r\n\r\n /**\r\n * Define an offset on the texture to scale the u coordinates of the UVs\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#tiling\r\n */\r\n @serialize()\r\n public uScale = 1.0;\r\n\r\n /**\r\n * Define an offset on the texture to scale the v coordinates of the UVs\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#tiling\r\n */\r\n @serialize()\r\n public vScale = 1.0;\r\n\r\n /**\r\n * Define an offset on the texture to rotate around the u coordinates of the UVs\r\n * The angle is defined in radians.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials\r\n */\r\n @serialize()\r\n public uAng = 0;\r\n\r\n /**\r\n * Define an offset on the texture to rotate around the v coordinates of the UVs\r\n * The angle is defined in radians.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials\r\n */\r\n @serialize()\r\n public vAng = 0;\r\n\r\n /**\r\n * Define an offset on the texture to rotate around the w coordinates of the UVs (in case of 3d texture)\r\n * The angle is defined in radians.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials\r\n */\r\n @serialize()\r\n public wAng = 0;\r\n\r\n /**\r\n * Defines the center of rotation (U)\r\n */\r\n @serialize()\r\n public uRotationCenter = 0.5;\r\n\r\n /**\r\n * Defines the center of rotation (V)\r\n */\r\n @serialize()\r\n public vRotationCenter = 0.5;\r\n\r\n /**\r\n * Defines the center of rotation (W)\r\n */\r\n @serialize()\r\n public wRotationCenter = 0.5;\r\n\r\n /**\r\n * Sets this property to true to avoid deformations when rotating the texture with non-uniform scaling\r\n */\r\n @serialize()\r\n public homogeneousRotationInUVTransform = false;\r\n\r\n /**\r\n * Are mip maps generated for this texture or not.\r\n */\r\n get noMipmap(): boolean {\r\n return this._noMipmap;\r\n }\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility\r\n */\r\n public inspectableCustomProperties: Nullable = null;\r\n\r\n /** @internal */\r\n public _noMipmap: boolean = false;\r\n /** @internal */\r\n public _invertY: boolean = false;\r\n private _rowGenerationMatrix: Nullable = null;\r\n private _cachedTextureMatrix: Nullable = null;\r\n private _projectionModeMatrix: Nullable = null;\r\n private _t0: Nullable = null;\r\n private _t1: Nullable = null;\r\n private _t2: Nullable = null;\r\n\r\n private _cachedUOffset: number = -1;\r\n private _cachedVOffset: number = -1;\r\n private _cachedUScale: number = 0;\r\n private _cachedVScale: number = 0;\r\n private _cachedUAng: number = -1;\r\n private _cachedVAng: number = -1;\r\n private _cachedWAng: number = -1;\r\n private _cachedReflectionProjectionMatrixId: number = -1;\r\n private _cachedURotationCenter: number = -1;\r\n private _cachedVRotationCenter: number = -1;\r\n private _cachedWRotationCenter: number = -1;\r\n private _cachedHomogeneousRotationInUVTransform: boolean = false;\r\n private _cachedIdentity3x2: boolean = true;\r\n\r\n private _cachedReflectionTextureMatrix: Nullable = null;\r\n private _cachedReflectionUOffset = -1;\r\n private _cachedReflectionVOffset = -1;\r\n private _cachedReflectionUScale = 0;\r\n private _cachedReflectionVScale = 0;\r\n private _cachedReflectionCoordinatesMode = -1;\r\n\r\n /** @internal */\r\n public _buffer: Nullable = null;\r\n private _deleteBuffer: boolean = false;\r\n protected _format: Nullable = null;\r\n private _delayedOnLoad: Nullable<() => void> = null;\r\n private _delayedOnError: Nullable<() => void> = null;\r\n private _mimeType?: string;\r\n private _loaderOptions?: any;\r\n private _creationFlags?: number;\r\n /** @internal */\r\n public _useSRGBBuffer?: boolean;\r\n private _forcedExtension?: string;\r\n\r\n /** Returns the texture mime type if it was defined by a loader (undefined else) */\r\n public get mimeType() {\r\n return this._mimeType;\r\n }\r\n\r\n /**\r\n * Observable triggered once the texture has been loaded.\r\n */\r\n public onLoadObservable: Observable = new Observable();\r\n\r\n protected _isBlocking: boolean = true;\r\n /**\r\n * Is the texture preventing material to render while loading.\r\n * If false, a default texture will be used instead of the loading one during the preparation step.\r\n */\r\n public set isBlocking(value: boolean) {\r\n this._isBlocking = value;\r\n }\r\n @serialize()\r\n public get isBlocking(): boolean {\r\n return this._isBlocking;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the texture needs to be inverted on the y axis during loading\r\n */\r\n public get invertY(): boolean {\r\n return this._invertY;\r\n }\r\n\r\n /**\r\n * Instantiates a new texture.\r\n * This represents a texture in babylon. It can be easily loaded from a network, base64 or html input.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#texture\r\n * @param url defines the url of the picture to load as a texture\r\n * @param sceneOrEngine defines the scene or engine the texture will belong to\r\n * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture\r\n * @param invertY defines if the texture needs to be inverted on the y axis during loading\r\n * @param samplingMode defines the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)\r\n * @param onLoad defines a callback triggered when the texture has been loaded\r\n * @param onError defines a callback triggered when an error occurred during the loading session\r\n * @param buffer defines the buffer to load the texture from in case the texture is loaded from a buffer representation\r\n * @param deleteBuffer defines if the buffer we are loading the texture from should be deleted after load\r\n * @param format defines the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)\r\n * @param mimeType defines an optional mime type information\r\n * @param loaderOptions options to be passed to the loader\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n */\r\n constructor(\r\n url: Nullable,\r\n sceneOrEngine?: Nullable,\r\n noMipmapOrOptions?: boolean | ITextureCreationOptions,\r\n invertY?: boolean,\r\n samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<() => void> = null,\r\n onError: Nullable<(message?: string, exception?: any) => void> = null,\r\n buffer: Nullable = null,\r\n deleteBuffer: boolean = false,\r\n format?: number,\r\n mimeType?: string,\r\n loaderOptions?: any,\r\n creationFlags?: number,\r\n forcedExtension?: string\r\n ) {\r\n super(sceneOrEngine);\r\n\r\n this.name = url || \"\";\r\n this.url = url;\r\n\r\n let noMipmap: boolean;\r\n let useSRGBBuffer: boolean = false;\r\n let internalTexture: Nullable = null;\r\n let gammaSpace = true;\r\n\r\n if (typeof noMipmapOrOptions === \"object\" && noMipmapOrOptions !== null) {\r\n noMipmap = noMipmapOrOptions.noMipmap ?? false;\r\n invertY = noMipmapOrOptions.invertY ?? (CompatibilityOptions.UseOpenGLOrientationForUV ? false : true);\r\n samplingMode = noMipmapOrOptions.samplingMode ?? Texture.TRILINEAR_SAMPLINGMODE;\r\n onLoad = noMipmapOrOptions.onLoad ?? null;\r\n onError = noMipmapOrOptions.onError ?? null;\r\n buffer = noMipmapOrOptions.buffer ?? null;\r\n deleteBuffer = noMipmapOrOptions.deleteBuffer ?? false;\r\n format = noMipmapOrOptions.format;\r\n mimeType = noMipmapOrOptions.mimeType;\r\n loaderOptions = noMipmapOrOptions.loaderOptions;\r\n creationFlags = noMipmapOrOptions.creationFlags;\r\n useSRGBBuffer = noMipmapOrOptions.useSRGBBuffer ?? false;\r\n internalTexture = noMipmapOrOptions.internalTexture ?? null;\r\n gammaSpace = noMipmapOrOptions.gammaSpace ?? gammaSpace;\r\n } else {\r\n noMipmap = !!noMipmapOrOptions;\r\n }\r\n\r\n this._gammaSpace = gammaSpace;\r\n this._noMipmap = noMipmap;\r\n this._invertY = invertY === undefined ? (CompatibilityOptions.UseOpenGLOrientationForUV ? false : true) : invertY;\r\n this._initialSamplingMode = samplingMode;\r\n this._buffer = buffer;\r\n this._deleteBuffer = deleteBuffer;\r\n this._mimeType = mimeType;\r\n this._loaderOptions = loaderOptions;\r\n this._creationFlags = creationFlags;\r\n this._useSRGBBuffer = useSRGBBuffer;\r\n this._forcedExtension = forcedExtension;\r\n if (format) {\r\n this._format = format;\r\n }\r\n\r\n const scene = this.getScene();\r\n const engine = this._getEngine();\r\n if (!engine) {\r\n return;\r\n }\r\n\r\n engine.onBeforeTextureInitObservable.notifyObservers(this);\r\n\r\n const load = () => {\r\n if (this._texture) {\r\n if (this._texture._invertVScale) {\r\n this.vScale *= -1;\r\n this.vOffset += 1;\r\n }\r\n\r\n // Update texture to match internal texture's wrapping\r\n if (this._texture._cachedWrapU !== null) {\r\n this.wrapU = this._texture._cachedWrapU;\r\n this._texture._cachedWrapU = null;\r\n }\r\n if (this._texture._cachedWrapV !== null) {\r\n this.wrapV = this._texture._cachedWrapV;\r\n this._texture._cachedWrapV = null;\r\n }\r\n if (this._texture._cachedWrapR !== null) {\r\n this.wrapR = this._texture._cachedWrapR;\r\n this._texture._cachedWrapR = null;\r\n }\r\n }\r\n\r\n if (this.onLoadObservable.hasObservers()) {\r\n this.onLoadObservable.notifyObservers(this);\r\n }\r\n if (onLoad) {\r\n onLoad();\r\n }\r\n\r\n if (!this.isBlocking && scene) {\r\n scene.resetCachedMaterial();\r\n }\r\n };\r\n\r\n const errorHandler = (message?: string, exception?: any) => {\r\n this._loadingError = true;\r\n this._errorObject = { message, exception };\r\n if (onError) {\r\n onError(message, exception);\r\n }\r\n Texture.OnTextureLoadErrorObservable.notifyObservers(this);\r\n };\r\n\r\n if (!this.url && !internalTexture) {\r\n this._delayedOnLoad = load;\r\n this._delayedOnError = errorHandler;\r\n return;\r\n }\r\n\r\n this._texture = internalTexture ?? this._getFromCache(this.url, noMipmap, samplingMode, this._invertY, useSRGBBuffer, this.isCube);\r\n\r\n if (!this._texture) {\r\n if (!scene || !scene.useDelayedTextureLoading) {\r\n try {\r\n this._texture = engine.createTexture(\r\n this.url,\r\n noMipmap,\r\n this._invertY,\r\n scene,\r\n samplingMode,\r\n load,\r\n errorHandler,\r\n this._buffer,\r\n undefined,\r\n this._format,\r\n this._forcedExtension,\r\n mimeType,\r\n loaderOptions,\r\n creationFlags,\r\n useSRGBBuffer\r\n );\r\n } catch (e) {\r\n errorHandler(\"error loading\", e);\r\n throw e;\r\n }\r\n if (deleteBuffer) {\r\n this._buffer = null;\r\n }\r\n } else {\r\n this.delayLoadState = Constants.DELAYLOADSTATE_NOTLOADED;\r\n\r\n this._delayedOnLoad = load;\r\n this._delayedOnError = errorHandler;\r\n }\r\n } else {\r\n if (this._texture.isReady) {\r\n TimingTools.SetImmediate(() => load());\r\n } else {\r\n const loadObserver = this._texture.onLoadedObservable.add(load);\r\n this._texture.onErrorObservable.add((e) => {\r\n errorHandler(e.message, e.exception);\r\n this._texture?.onLoadedObservable.remove(loadObserver);\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update the url (and optional buffer) of this texture if url was null during construction.\r\n * @param url the url of the texture\r\n * @param buffer the buffer of the texture (defaults to null)\r\n * @param onLoad callback called when the texture is loaded (defaults to null)\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n */\r\n public updateURL(\r\n url: string,\r\n buffer: Nullable = null,\r\n onLoad?: () => void,\r\n forcedExtension?: string\r\n ): void {\r\n if (this.url) {\r\n this.releaseInternalTexture();\r\n this.getScene()!.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n\r\n if (!this.name || this.name.startsWith(\"data:\")) {\r\n this.name = url;\r\n }\r\n this.url = url;\r\n this._buffer = buffer;\r\n this._forcedExtension = forcedExtension;\r\n this.delayLoadState = Constants.DELAYLOADSTATE_NOTLOADED;\r\n\r\n if (onLoad) {\r\n this._delayedOnLoad = onLoad;\r\n }\r\n this.delayLoad();\r\n }\r\n\r\n /**\r\n * Finish the loading sequence of a texture flagged as delayed load.\r\n * @internal\r\n */\r\n public delayLoad(): void {\r\n if (this.delayLoadState !== Constants.DELAYLOADSTATE_NOTLOADED) {\r\n return;\r\n }\r\n\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n this.delayLoadState = Constants.DELAYLOADSTATE_LOADED;\r\n this._texture = this._getFromCache(this.url, this._noMipmap, this.samplingMode, this._invertY, this._useSRGBBuffer, this.isCube);\r\n\r\n if (!this._texture) {\r\n this._texture = scene\r\n .getEngine()\r\n .createTexture(\r\n this.url,\r\n this._noMipmap,\r\n this._invertY,\r\n scene,\r\n this.samplingMode,\r\n this._delayedOnLoad,\r\n this._delayedOnError,\r\n this._buffer,\r\n null,\r\n this._format,\r\n this._forcedExtension,\r\n this._mimeType,\r\n this._loaderOptions,\r\n this._creationFlags,\r\n this._useSRGBBuffer\r\n );\r\n if (this._deleteBuffer) {\r\n this._buffer = null;\r\n }\r\n } else {\r\n if (this._delayedOnLoad) {\r\n if (this._texture.isReady) {\r\n TimingTools.SetImmediate(this._delayedOnLoad);\r\n } else {\r\n this._texture.onLoadedObservable.add(this._delayedOnLoad);\r\n }\r\n }\r\n }\r\n\r\n this._delayedOnLoad = null;\r\n this._delayedOnError = null;\r\n }\r\n\r\n private _prepareRowForTextureGeneration(x: number, y: number, z: number, t: Vector3): void {\r\n x *= this._cachedUScale;\r\n y *= this._cachedVScale;\r\n\r\n x -= this.uRotationCenter * this._cachedUScale;\r\n y -= this.vRotationCenter * this._cachedVScale;\r\n z -= this.wRotationCenter;\r\n\r\n Vector3.TransformCoordinatesFromFloatsToRef(x, y, z, this._rowGenerationMatrix!, t);\r\n\r\n t.x += this.uRotationCenter * this._cachedUScale + this._cachedUOffset;\r\n t.y += this.vRotationCenter * this._cachedVScale + this._cachedVOffset;\r\n t.z += this.wRotationCenter;\r\n }\r\n\r\n /**\r\n * Checks if the texture has the same transform matrix than another texture\r\n * @param texture texture to check against\r\n * @returns true if the transforms are the same, else false\r\n */\r\n public checkTransformsAreIdentical(texture: Nullable): boolean {\r\n return (\r\n texture !== null &&\r\n this.uOffset === texture.uOffset &&\r\n this.vOffset === texture.vOffset &&\r\n this.uScale === texture.uScale &&\r\n this.vScale === texture.vScale &&\r\n this.uAng === texture.uAng &&\r\n this.vAng === texture.vAng &&\r\n this.wAng === texture.wAng\r\n );\r\n }\r\n\r\n /**\r\n * Get the current texture matrix which includes the requested offsetting, tiling and rotation components.\r\n * @param uBase The horizontal base offset multiplier (1 by default)\r\n * @returns the transform matrix of the texture.\r\n */\r\n public getTextureMatrix(uBase = 1): Matrix {\r\n if (\r\n this.uOffset === this._cachedUOffset &&\r\n this.vOffset === this._cachedVOffset &&\r\n this.uScale * uBase === this._cachedUScale &&\r\n this.vScale === this._cachedVScale &&\r\n this.uAng === this._cachedUAng &&\r\n this.vAng === this._cachedVAng &&\r\n this.wAng === this._cachedWAng &&\r\n this.uRotationCenter === this._cachedURotationCenter &&\r\n this.vRotationCenter === this._cachedVRotationCenter &&\r\n this.wRotationCenter === this._cachedWRotationCenter &&\r\n this.homogeneousRotationInUVTransform === this._cachedHomogeneousRotationInUVTransform\r\n ) {\r\n return this._cachedTextureMatrix!;\r\n }\r\n\r\n this._cachedUOffset = this.uOffset;\r\n this._cachedVOffset = this.vOffset;\r\n this._cachedUScale = this.uScale * uBase;\r\n this._cachedVScale = this.vScale;\r\n this._cachedUAng = this.uAng;\r\n this._cachedVAng = this.vAng;\r\n this._cachedWAng = this.wAng;\r\n this._cachedURotationCenter = this.uRotationCenter;\r\n this._cachedVRotationCenter = this.vRotationCenter;\r\n this._cachedWRotationCenter = this.wRotationCenter;\r\n this._cachedHomogeneousRotationInUVTransform = this.homogeneousRotationInUVTransform;\r\n\r\n if (!this._cachedTextureMatrix || !this._rowGenerationMatrix) {\r\n this._cachedTextureMatrix = Matrix.Zero();\r\n this._rowGenerationMatrix = new Matrix();\r\n this._t0 = Vector3.Zero();\r\n this._t1 = Vector3.Zero();\r\n this._t2 = Vector3.Zero();\r\n }\r\n\r\n Matrix.RotationYawPitchRollToRef(this.vAng, this.uAng, this.wAng, this._rowGenerationMatrix!);\r\n\r\n if (this.homogeneousRotationInUVTransform) {\r\n Matrix.TranslationToRef(-this._cachedURotationCenter, -this._cachedVRotationCenter, -this._cachedWRotationCenter, TmpVectors.Matrix[0]);\r\n Matrix.TranslationToRef(this._cachedURotationCenter, this._cachedVRotationCenter, this._cachedWRotationCenter, TmpVectors.Matrix[1]);\r\n Matrix.ScalingToRef(this._cachedUScale, this._cachedVScale, 0, TmpVectors.Matrix[2]);\r\n Matrix.TranslationToRef(this._cachedUOffset, this._cachedVOffset, 0, TmpVectors.Matrix[3]);\r\n\r\n TmpVectors.Matrix[0].multiplyToRef(this._rowGenerationMatrix!, this._cachedTextureMatrix);\r\n this._cachedTextureMatrix.multiplyToRef(TmpVectors.Matrix[1], this._cachedTextureMatrix);\r\n this._cachedTextureMatrix.multiplyToRef(TmpVectors.Matrix[2], this._cachedTextureMatrix);\r\n this._cachedTextureMatrix.multiplyToRef(TmpVectors.Matrix[3], this._cachedTextureMatrix);\r\n\r\n // copy the translation row to the 3rd row of the matrix so that we don't need to update the shaders (which expects the translation to be on the 3rd row)\r\n this._cachedTextureMatrix.setRowFromFloats(2, this._cachedTextureMatrix.m[12], this._cachedTextureMatrix.m[13], this._cachedTextureMatrix.m[14], 1);\r\n } else {\r\n this._prepareRowForTextureGeneration(0, 0, 0, this._t0!);\r\n this._prepareRowForTextureGeneration(1.0, 0, 0, this._t1!);\r\n this._prepareRowForTextureGeneration(0, 1.0, 0, this._t2!);\r\n\r\n this._t1!.subtractInPlace(this._t0!);\r\n this._t2!.subtractInPlace(this._t0!);\r\n\r\n Matrix.FromValuesToRef(\r\n this._t1!.x,\r\n this._t1!.y,\r\n this._t1!.z,\r\n 0.0,\r\n this._t2!.x,\r\n this._t2!.y,\r\n this._t2!.z,\r\n 0.0,\r\n this._t0!.x,\r\n this._t0!.y,\r\n this._t0!.z,\r\n 0.0,\r\n 0.0,\r\n 0.0,\r\n 0.0,\r\n 1.0,\r\n this._cachedTextureMatrix\r\n );\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return this._cachedTextureMatrix;\r\n }\r\n\r\n const previousIdentity3x2 = this._cachedIdentity3x2;\r\n this._cachedIdentity3x2 = this._cachedTextureMatrix.isIdentityAs3x2();\r\n\r\n if (this.optimizeUVAllocation && previousIdentity3x2 !== this._cachedIdentity3x2) {\r\n // We flag the materials that are using this texture as \"texture dirty\" because depending on the fact that the matrix is the identity or not, some defines\r\n // will get different values (see PrepareDefinesForMergedUV), meaning we should regenerate the effect accordingly\r\n scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n\r\n return this._cachedTextureMatrix;\r\n }\r\n\r\n /**\r\n * Get the current matrix used to apply reflection. This is useful to rotate an environment texture for instance.\r\n * @returns The reflection texture transform\r\n */\r\n public getReflectionTextureMatrix(): Matrix {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return this._cachedReflectionTextureMatrix!;\r\n }\r\n\r\n if (\r\n this.uOffset === this._cachedReflectionUOffset &&\r\n this.vOffset === this._cachedReflectionVOffset &&\r\n this.uScale === this._cachedReflectionUScale &&\r\n this.vScale === this._cachedReflectionVScale &&\r\n this.coordinatesMode === this._cachedReflectionCoordinatesMode\r\n ) {\r\n if (this.coordinatesMode === Texture.PROJECTION_MODE) {\r\n if (this._cachedReflectionProjectionMatrixId === scene.getProjectionMatrix().updateFlag) {\r\n return this._cachedReflectionTextureMatrix!;\r\n }\r\n } else {\r\n return this._cachedReflectionTextureMatrix!;\r\n }\r\n }\r\n\r\n if (!this._cachedReflectionTextureMatrix) {\r\n this._cachedReflectionTextureMatrix = Matrix.Zero();\r\n }\r\n\r\n if (!this._projectionModeMatrix) {\r\n this._projectionModeMatrix = Matrix.Zero();\r\n }\r\n\r\n const flagMaterialsAsTextureDirty = this._cachedReflectionCoordinatesMode !== this.coordinatesMode;\r\n\r\n this._cachedReflectionUOffset = this.uOffset;\r\n this._cachedReflectionVOffset = this.vOffset;\r\n this._cachedReflectionUScale = this.uScale;\r\n this._cachedReflectionVScale = this.vScale;\r\n this._cachedReflectionCoordinatesMode = this.coordinatesMode;\r\n\r\n switch (this.coordinatesMode) {\r\n case Texture.PLANAR_MODE: {\r\n Matrix.IdentityToRef(this._cachedReflectionTextureMatrix);\r\n (this._cachedReflectionTextureMatrix)[0] = this.uScale;\r\n (this._cachedReflectionTextureMatrix)[5] = this.vScale;\r\n (this._cachedReflectionTextureMatrix)[12] = this.uOffset;\r\n (this._cachedReflectionTextureMatrix)[13] = this.vOffset;\r\n break;\r\n }\r\n case Texture.PROJECTION_MODE: {\r\n Matrix.FromValuesToRef(0.5, 0.0, 0.0, 0.0, 0.0, -0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 1.0, 1.0, this._projectionModeMatrix);\r\n\r\n const projectionMatrix = scene.getProjectionMatrix();\r\n this._cachedReflectionProjectionMatrixId = projectionMatrix.updateFlag;\r\n projectionMatrix.multiplyToRef(this._projectionModeMatrix, this._cachedReflectionTextureMatrix);\r\n break;\r\n }\r\n default:\r\n Matrix.IdentityToRef(this._cachedReflectionTextureMatrix);\r\n break;\r\n }\r\n\r\n if (flagMaterialsAsTextureDirty) {\r\n // We flag the materials that are using this texture as \"texture dirty\" if the coordinatesMode has changed.\r\n // Indeed, this property is used to set the value of some defines used to generate the effect (in material.isReadyForSubMesh), so we must make sure this code will be re-executed and the effect recreated if necessary\r\n scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n\r\n return this._cachedReflectionTextureMatrix;\r\n }\r\n\r\n /**\r\n * Clones the texture.\r\n * @returns the cloned texture\r\n */\r\n public clone(): Texture {\r\n const options: ITextureCreationOptions = {\r\n noMipmap: this._noMipmap,\r\n invertY: this._invertY,\r\n samplingMode: this.samplingMode,\r\n onLoad: undefined,\r\n onError: undefined,\r\n buffer: this._texture ? this._texture._buffer : undefined,\r\n deleteBuffer: this._deleteBuffer,\r\n format: this.textureFormat,\r\n mimeType: this.mimeType,\r\n loaderOptions: this._loaderOptions,\r\n creationFlags: this._creationFlags,\r\n useSRGBBuffer: this._useSRGBBuffer,\r\n };\r\n\r\n return SerializationHelper.Clone(() => {\r\n return new Texture(this._texture ? this._texture.url : null, this.getScene(), options);\r\n }, this);\r\n }\r\n\r\n /**\r\n * Serialize the texture to a JSON representation we can easily use in the respective Parse function.\r\n * @returns The JSON representation of the texture\r\n */\r\n public serialize(): any {\r\n const savedName = this.name;\r\n\r\n if (!Texture.SerializeBuffers) {\r\n if (this.name.startsWith(\"data:\")) {\r\n this.name = \"\";\r\n }\r\n }\r\n\r\n if (this.name.startsWith(\"data:\") && this.url === this.name) {\r\n this.url = \"\";\r\n }\r\n\r\n const serializationObject = super.serialize(Texture._SerializeInternalTextureUniqueId);\r\n\r\n if (!serializationObject) {\r\n return null;\r\n }\r\n\r\n if (Texture.SerializeBuffers || Texture.ForceSerializeBuffers) {\r\n if (typeof this._buffer === \"string\" && (this._buffer as string).substr(0, 5) === \"data:\") {\r\n serializationObject.base64String = this._buffer;\r\n serializationObject.name = serializationObject.name.replace(\"data:\", \"\");\r\n } else if (this.url && this.url.startsWith(\"data:\") && this._buffer instanceof Uint8Array) {\r\n serializationObject.base64String = \"data:image/png;base64,\" + EncodeArrayBufferToBase64(this._buffer);\r\n } else if (Texture.ForceSerializeBuffers || (this.url && this.url.startsWith(\"blob:\")) || this._forceSerialize) {\r\n serializationObject.base64String =\r\n !this._engine || this._engine._features.supportSyncTextureRead ? GenerateBase64StringFromTexture(this) : GenerateBase64StringFromTextureAsync(this);\r\n }\r\n }\r\n\r\n serializationObject.invertY = this._invertY;\r\n serializationObject.samplingMode = this.samplingMode;\r\n serializationObject._creationFlags = this._creationFlags;\r\n serializationObject._useSRGBBuffer = this._useSRGBBuffer;\r\n if (Texture._SerializeInternalTextureUniqueId) {\r\n serializationObject.internalTextureUniqueId = this._texture?.uniqueId ?? undefined;\r\n }\r\n serializationObject.noMipmap = this._noMipmap;\r\n\r\n this.name = savedName;\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Get the current class name of the texture useful for serialization or dynamic coding.\r\n * @returns \"Texture\"\r\n */\r\n public getClassName(): string {\r\n return \"Texture\";\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n\r\n this.onLoadObservable.clear();\r\n\r\n this._delayedOnLoad = null;\r\n this._delayedOnError = null;\r\n this._buffer = null;\r\n }\r\n\r\n /**\r\n * Parse the JSON representation of a texture in order to recreate the texture in the given scene.\r\n * @param parsedTexture Define the JSON representation of the texture\r\n * @param scene Define the scene the parsed texture should be instantiated in\r\n * @param rootUrl Define the root url of the parsing sequence in the case of relative dependencies\r\n * @returns The parsed texture if successful\r\n */\r\n public static Parse(parsedTexture: any, scene: Scene, rootUrl: string): Nullable {\r\n if (parsedTexture.customType) {\r\n const customTexture = InstantiationTools.Instantiate(parsedTexture.customType);\r\n // Update Sampling Mode\r\n const parsedCustomTexture: any = customTexture.Parse(parsedTexture, scene, rootUrl);\r\n if (parsedTexture.samplingMode && parsedCustomTexture.updateSamplingMode && parsedCustomTexture._samplingMode) {\r\n if (parsedCustomTexture._samplingMode !== parsedTexture.samplingMode) {\r\n parsedCustomTexture.updateSamplingMode(parsedTexture.samplingMode);\r\n }\r\n }\r\n return parsedCustomTexture;\r\n }\r\n\r\n if (parsedTexture.isCube && !parsedTexture.isRenderTarget) {\r\n return Texture._CubeTextureParser(parsedTexture, scene, rootUrl);\r\n }\r\n\r\n const hasInternalTextureUniqueId = parsedTexture.internalTextureUniqueId !== undefined;\r\n\r\n if (!parsedTexture.name && !parsedTexture.isRenderTarget && !hasInternalTextureUniqueId) {\r\n return null;\r\n }\r\n\r\n let internalTexture: InternalTexture | undefined;\r\n\r\n if (hasInternalTextureUniqueId) {\r\n const cache = scene.getEngine().getLoadedTexturesCache();\r\n for (const texture of cache) {\r\n if (texture.uniqueId === parsedTexture.internalTextureUniqueId) {\r\n internalTexture = texture;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const onLoaded = (texture: Texture | null) => {\r\n // Clear cache\r\n if (texture && texture._texture) {\r\n texture._texture._cachedWrapU = null;\r\n texture._texture._cachedWrapV = null;\r\n texture._texture._cachedWrapR = null;\r\n }\r\n\r\n // Update Sampling Mode\r\n if (parsedTexture.samplingMode) {\r\n const sampling: number = parsedTexture.samplingMode;\r\n if (texture && texture.samplingMode !== sampling) {\r\n texture.updateSamplingMode(sampling);\r\n }\r\n }\r\n // Animations\r\n if (texture && parsedTexture.animations) {\r\n for (let animationIndex = 0; animationIndex < parsedTexture.animations.length; animationIndex++) {\r\n const parsedAnimation = parsedTexture.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n texture.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n }\r\n\r\n if (hasInternalTextureUniqueId && !internalTexture) {\r\n texture?._texture?._setUniqueId(parsedTexture.internalTextureUniqueId);\r\n }\r\n };\r\n\r\n const texture = SerializationHelper.Parse(\r\n () => {\r\n let generateMipMaps: boolean = true;\r\n if (parsedTexture.noMipmap) {\r\n generateMipMaps = false;\r\n }\r\n if (parsedTexture.mirrorPlane) {\r\n const mirrorTexture = Texture._CreateMirror(parsedTexture.name, parsedTexture.renderTargetSize, scene, generateMipMaps);\r\n mirrorTexture._waitingRenderList = parsedTexture.renderList;\r\n mirrorTexture.mirrorPlane = Plane.FromArray(parsedTexture.mirrorPlane);\r\n onLoaded(mirrorTexture);\r\n return mirrorTexture;\r\n } else if (parsedTexture.isRenderTarget) {\r\n let renderTargetTexture: Nullable = null;\r\n if (parsedTexture.isCube) {\r\n // Search for an existing reflection probe (which contains a cube render target texture)\r\n if (scene.reflectionProbes) {\r\n for (let index = 0; index < scene.reflectionProbes.length; index++) {\r\n const probe = scene.reflectionProbes[index];\r\n if (probe.name === parsedTexture.name) {\r\n return probe.cubeTexture;\r\n }\r\n }\r\n }\r\n } else {\r\n renderTargetTexture = Texture._CreateRenderTargetTexture(\r\n parsedTexture.name,\r\n parsedTexture.renderTargetSize,\r\n scene,\r\n generateMipMaps,\r\n parsedTexture._creationFlags ?? 0\r\n );\r\n renderTargetTexture._waitingRenderList = parsedTexture.renderList;\r\n }\r\n onLoaded(renderTargetTexture);\r\n return renderTargetTexture;\r\n } else if (parsedTexture.isVideo) {\r\n const texture = Texture._CreateVideoTexture(\r\n rootUrl + (parsedTexture.url || parsedTexture.name),\r\n rootUrl + (parsedTexture.src || parsedTexture.url),\r\n scene,\r\n generateMipMaps,\r\n parsedTexture.invertY,\r\n parsedTexture.samplingMode,\r\n parsedTexture.settings || {}\r\n );\r\n onLoaded(texture);\r\n return texture;\r\n } else {\r\n let texture: Texture;\r\n\r\n if (parsedTexture.base64String && !internalTexture) {\r\n // name and url are the same to ensure caching happens from the actual base64 string\r\n texture = Texture.CreateFromBase64String(\r\n parsedTexture.base64String,\r\n parsedTexture.base64String,\r\n scene,\r\n !generateMipMaps,\r\n parsedTexture.invertY,\r\n parsedTexture.samplingMode,\r\n () => {\r\n onLoaded(texture);\r\n },\r\n parsedTexture._creationFlags ?? 0,\r\n parsedTexture._useSRGBBuffer ?? false\r\n );\r\n\r\n // prettier name to fit with the loaded data\r\n texture.name = parsedTexture.name;\r\n } else {\r\n let url: string;\r\n if (parsedTexture.name && (parsedTexture.name.indexOf(\"://\") > 0 || parsedTexture.name.startsWith(\"data:\"))) {\r\n url = parsedTexture.name;\r\n } else {\r\n url = rootUrl + parsedTexture.name;\r\n }\r\n\r\n if (parsedTexture.url && (parsedTexture.url.startsWith(\"data:\") || Texture.UseSerializedUrlIfAny)) {\r\n url = parsedTexture.url;\r\n }\r\n\r\n const options: ITextureCreationOptions = {\r\n noMipmap: !generateMipMaps,\r\n invertY: parsedTexture.invertY,\r\n samplingMode: parsedTexture.samplingMode,\r\n onLoad: () => {\r\n onLoaded(texture);\r\n },\r\n internalTexture,\r\n };\r\n\r\n texture = new Texture(url, scene, options);\r\n }\r\n\r\n return texture;\r\n }\r\n },\r\n parsedTexture,\r\n scene\r\n );\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * Creates a texture from its base 64 representation.\r\n * @param data Define the base64 payload without the data: prefix\r\n * @param name Define the name of the texture in the scene useful fo caching purpose for instance\r\n * @param scene Define the scene the texture should belong to\r\n * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture\r\n * @param invertY define if the texture needs to be inverted on the y axis during loading\r\n * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)\r\n * @param onLoad define a callback triggered when the texture has been loaded\r\n * @param onError define a callback triggered when an error occurred during the loading session\r\n * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @returns the created texture\r\n */\r\n public static CreateFromBase64String(\r\n data: string,\r\n name: string,\r\n scene: Scene,\r\n noMipmapOrOptions?: boolean | ITextureCreationOptions,\r\n invertY?: boolean,\r\n samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<() => void> = null,\r\n onError: Nullable<() => void> = null,\r\n format: number = Constants.TEXTUREFORMAT_RGBA,\r\n creationFlags?: number,\r\n forcedExtension?: string\r\n ): Texture {\r\n return new Texture(\r\n \"data:\" + name,\r\n scene,\r\n noMipmapOrOptions,\r\n invertY,\r\n samplingMode,\r\n onLoad,\r\n onError,\r\n data,\r\n false,\r\n format,\r\n undefined,\r\n undefined,\r\n creationFlags,\r\n forcedExtension\r\n );\r\n }\r\n\r\n /**\r\n * Creates a texture from its data: representation. (data: will be added in case only the payload has been passed in)\r\n * @param name Define the name of the texture in the scene useful fo caching purpose for instance\r\n * @param buffer define the buffer to load the texture from in case the texture is loaded from a buffer representation\r\n * @param scene Define the scene the texture should belong to\r\n * @param deleteBuffer define if the buffer we are loading the texture from should be deleted after load\r\n * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture\r\n * @param invertY define if the texture needs to be inverted on the y axis during loading\r\n * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)\r\n * @param onLoad define a callback triggered when the texture has been loaded\r\n * @param onError define a callback triggered when an error occurred during the loading session\r\n * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @returns the created texture\r\n */\r\n public static LoadFromDataString(\r\n name: string,\r\n buffer: any,\r\n scene: Scene,\r\n deleteBuffer: boolean = false,\r\n noMipmapOrOptions?: boolean | ITextureCreationOptions,\r\n invertY: boolean = true,\r\n samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<() => void> = null,\r\n onError: Nullable<(message?: string, exception?: any) => void> = null,\r\n format: number = Constants.TEXTUREFORMAT_RGBA,\r\n creationFlags?: number,\r\n forcedExtension?: string\r\n ): Texture {\r\n if (name.substr(0, 5) !== \"data:\") {\r\n name = \"data:\" + name;\r\n }\r\n\r\n return new Texture(\r\n name,\r\n scene,\r\n noMipmapOrOptions,\r\n invertY,\r\n samplingMode,\r\n onLoad,\r\n onError,\r\n buffer,\r\n deleteBuffer,\r\n format,\r\n undefined,\r\n undefined,\r\n creationFlags,\r\n forcedExtension\r\n );\r\n }\r\n}\r\n\r\n// References the dependencies.\r\nRegisterClass(\"BABYLON.Texture\", Texture);\r\nSerializationHelper._TextureParser = Texture.Parse;\r\n", "import type { Behavior } from \"../behavior\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport type { Scene } from \"core/scene\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will allow the mesh to fade in and out\r\n */\r\nexport class FadeInOutBehavior implements Behavior {\r\n /**\r\n * Time in milliseconds to delay before fading in (Default: 0)\r\n */\r\n public fadeInDelay = 0;\r\n\r\n /**\r\n * Time in milliseconds to delay before fading out (Default: 0)\r\n */\r\n public fadeOutDelay = 0;\r\n\r\n /**\r\n * Time in milliseconds for the mesh to fade in (Default: 300)\r\n */\r\n public fadeInTime = 300;\r\n\r\n /**\r\n * Time in milliseconds for the mesh to fade out (Default: 300)\r\n */\r\n public fadeOutTime = 300;\r\n\r\n /**\r\n * Time in milliseconds to delay before fading in (Default: 0)\r\n * Will set both fade in and out delay to the same value\r\n */\r\n public get delay(): number {\r\n return this.fadeInDelay;\r\n }\r\n\r\n public set delay(value: number) {\r\n this.fadeInDelay = value;\r\n this.fadeOutDelay = value;\r\n }\r\n\r\n private _millisecondsPerFrame = 1000 / 60;\r\n private _hovered = false;\r\n private _hoverValue = 0;\r\n private _ownerNode: Nullable = null;\r\n private _onBeforeRenderObserver: Nullable> | undefined;\r\n private _delay: number = 0;\r\n private _time: number = 300;\r\n\r\n /**\r\n * Instantiates the FadeInOutBehavior\r\n */\r\n constructor() {}\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"FadeInOut\";\r\n }\r\n\r\n /**\r\n * Initializes the behavior\r\n */\r\n public init() {}\r\n\r\n /**\r\n * Attaches the fade behavior on the passed in mesh\r\n * @param ownerNode The mesh that will be faded in/out once attached\r\n */\r\n public attach(ownerNode: Mesh): void {\r\n this._ownerNode = ownerNode;\r\n this._setAllVisibility(this._ownerNode, 0);\r\n }\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n this._ownerNode = null;\r\n }\r\n\r\n /**\r\n * Triggers the mesh to begin fading in (or out)\r\n * @param fadeIn if the object should fade in or out (true to fade in)\r\n */\r\n public fadeIn(fadeIn: boolean = true) {\r\n this._delay = fadeIn ? this.fadeInDelay : this.fadeOutDelay;\r\n this._time = fadeIn ? this.fadeInTime : this.fadeOutTime;\r\n\r\n // Cancel any pending updates\r\n this._detachObserver();\r\n\r\n // If fading in and already visible or fading out and already not visible do nothing\r\n if (this._ownerNode && ((fadeIn && this._ownerNode.visibility >= 1) || (!fadeIn && this._ownerNode.visibility <= 0))) {\r\n return;\r\n }\r\n\r\n this._hovered = fadeIn;\r\n if (!this._hovered) {\r\n // Make the delay the negative of fadeout delay so the hoverValue is kept above 1 until\r\n // fadeOutDelay has elapsed\r\n this._delay *= -1;\r\n }\r\n\r\n // Reset the hoverValue. This is necessary because we may have been fading out, e.g. but not yet reached\r\n // the delay, so the hover value is greater than 1\r\n if (this._ownerNode!.visibility >= 1) {\r\n this._hoverValue = this._time;\r\n } else if (this._ownerNode!.visibility <= 0) {\r\n this._hoverValue = 0;\r\n }\r\n this._update();\r\n }\r\n\r\n /**\r\n * Triggers the mesh to begin fading out\r\n */\r\n public fadeOut() {\r\n this.fadeIn(false);\r\n }\r\n\r\n private _update = () => {\r\n if (this._ownerNode) {\r\n this._hoverValue += this._hovered ? this._millisecondsPerFrame : -this._millisecondsPerFrame;\r\n\r\n this._setAllVisibility(this._ownerNode, (this._hoverValue - this._delay) / this._time);\r\n\r\n if (this._ownerNode.visibility > 1) {\r\n this._setAllVisibility(this._ownerNode, 1);\r\n if (this._hoverValue > this._time) {\r\n this._hoverValue = this._time;\r\n this._detachObserver();\r\n return;\r\n }\r\n } else if (this._ownerNode.visibility < 0) {\r\n this._setAllVisibility(this._ownerNode, 0);\r\n if (this._hoverValue < 0) {\r\n this._hoverValue = 0;\r\n this._detachObserver();\r\n return;\r\n }\r\n }\r\n\r\n this._attachObserver();\r\n }\r\n };\r\n\r\n private _setAllVisibility(mesh: AbstractMesh, value: number) {\r\n mesh.visibility = value;\r\n mesh.getChildMeshes().forEach((c) => {\r\n this._setAllVisibility(c, value);\r\n });\r\n }\r\n\r\n private _attachObserver() {\r\n if (!this._onBeforeRenderObserver) {\r\n this._onBeforeRenderObserver = this._ownerNode?.getScene().onBeforeRenderObservable.add(this._update);\r\n }\r\n }\r\n\r\n private _detachObserver() {\r\n if (this._onBeforeRenderObserver) {\r\n this._ownerNode?.getScene().onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n this._onBeforeRenderObserver = null;\r\n }\r\n }\r\n}\r\n", "import type { DeepImmutable, Nullable, float } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport type { BoundingBox } from \"./boundingBox\";\r\nimport type { BoundingSphere } from \"./boundingSphere\";\r\nimport { Scene } from \"../scene\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { Epsilon } from \"core/Maths/math.constants\";\r\n\r\n/**\r\n * Class representing a ray with position and direction\r\n */\r\nexport class Ray {\r\n private static readonly _TmpVector3 = ArrayTools.BuildArray(6, Vector3.Zero);\r\n private static _RayDistant = Ray.Zero();\r\n private _tmpRay: Ray;\r\n\r\n /**\r\n * Creates a new ray\r\n * @param origin origin point\r\n * @param direction direction\r\n * @param length length of the ray\r\n * @param epsilon The epsilon value to use when calculating the ray/triangle intersection (default: 0)\r\n */\r\n constructor(\r\n /** origin point */\r\n public origin: Vector3,\r\n /** direction */\r\n public direction: Vector3,\r\n /** length of the ray */\r\n public length: number = Number.MAX_VALUE,\r\n /** The epsilon value to use when calculating the ray/triangle intersection (default: Epsilon from math constants) */\r\n public epsilon: number = Epsilon\r\n ) {}\r\n\r\n // Methods\r\n\r\n /**\r\n * Clone the current ray\r\n * @returns a new ray\r\n */\r\n public clone(): Ray {\r\n return new Ray(this.origin.clone(), this.direction.clone(), this.length);\r\n }\r\n\r\n /**\r\n * Checks if the ray intersects a box\r\n * This does not account for the ray length by design to improve perfs.\r\n * @param minimum bound of the box\r\n * @param maximum bound of the box\r\n * @param intersectionTreshold extra extend to be added to the box in all direction\r\n * @returns if the box was hit\r\n */\r\n public intersectsBoxMinMax(minimum: DeepImmutable, maximum: DeepImmutable, intersectionTreshold: number = 0): boolean {\r\n const newMinimum = Ray._TmpVector3[0].copyFromFloats(minimum.x - intersectionTreshold, minimum.y - intersectionTreshold, minimum.z - intersectionTreshold);\r\n const newMaximum = Ray._TmpVector3[1].copyFromFloats(maximum.x + intersectionTreshold, maximum.y + intersectionTreshold, maximum.z + intersectionTreshold);\r\n let d = 0.0;\r\n let maxValue = Number.MAX_VALUE;\r\n let inv: number;\r\n let min: number;\r\n let max: number;\r\n let temp: number;\r\n if (Math.abs(this.direction.x) < 0.0000001) {\r\n if (this.origin.x < newMinimum.x || this.origin.x > newMaximum.x) {\r\n return false;\r\n }\r\n } else {\r\n inv = 1.0 / this.direction.x;\r\n min = (newMinimum.x - this.origin.x) * inv;\r\n max = (newMaximum.x - this.origin.x) * inv;\r\n if (max === -Infinity) {\r\n max = Infinity;\r\n }\r\n\r\n if (min > max) {\r\n temp = min;\r\n min = max;\r\n max = temp;\r\n }\r\n\r\n d = Math.max(min, d);\r\n maxValue = Math.min(max, maxValue);\r\n\r\n if (d > maxValue) {\r\n return false;\r\n }\r\n }\r\n\r\n if (Math.abs(this.direction.y) < 0.0000001) {\r\n if (this.origin.y < newMinimum.y || this.origin.y > newMaximum.y) {\r\n return false;\r\n }\r\n } else {\r\n inv = 1.0 / this.direction.y;\r\n min = (newMinimum.y - this.origin.y) * inv;\r\n max = (newMaximum.y - this.origin.y) * inv;\r\n\r\n if (max === -Infinity) {\r\n max = Infinity;\r\n }\r\n\r\n if (min > max) {\r\n temp = min;\r\n min = max;\r\n max = temp;\r\n }\r\n\r\n d = Math.max(min, d);\r\n maxValue = Math.min(max, maxValue);\r\n\r\n if (d > maxValue) {\r\n return false;\r\n }\r\n }\r\n\r\n if (Math.abs(this.direction.z) < 0.0000001) {\r\n if (this.origin.z < newMinimum.z || this.origin.z > newMaximum.z) {\r\n return false;\r\n }\r\n } else {\r\n inv = 1.0 / this.direction.z;\r\n min = (newMinimum.z - this.origin.z) * inv;\r\n max = (newMaximum.z - this.origin.z) * inv;\r\n\r\n if (max === -Infinity) {\r\n max = Infinity;\r\n }\r\n\r\n if (min > max) {\r\n temp = min;\r\n min = max;\r\n max = temp;\r\n }\r\n\r\n d = Math.max(min, d);\r\n maxValue = Math.min(max, maxValue);\r\n\r\n if (d > maxValue) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Checks if the ray intersects a box\r\n * This does not account for the ray lenght by design to improve perfs.\r\n * @param box the bounding box to check\r\n * @param intersectionTreshold extra extend to be added to the BoundingBox in all direction\r\n * @returns if the box was hit\r\n */\r\n public intersectsBox(box: DeepImmutable, intersectionTreshold: number = 0): boolean {\r\n return this.intersectsBoxMinMax(box.minimum, box.maximum, intersectionTreshold);\r\n }\r\n\r\n /**\r\n * If the ray hits a sphere\r\n * @param sphere the bounding sphere to check\r\n * @param intersectionTreshold extra extend to be added to the BoundingSphere in all direction\r\n * @returns true if it hits the sphere\r\n */\r\n public intersectsSphere(sphere: DeepImmutable, intersectionTreshold: number = 0): boolean {\r\n const x = sphere.center.x - this.origin.x;\r\n const y = sphere.center.y - this.origin.y;\r\n const z = sphere.center.z - this.origin.z;\r\n const pyth = x * x + y * y + z * z;\r\n const radius = sphere.radius + intersectionTreshold;\r\n const rr = radius * radius;\r\n\r\n if (pyth <= rr) {\r\n return true;\r\n }\r\n\r\n const dot = x * this.direction.x + y * this.direction.y + z * this.direction.z;\r\n if (dot < 0.0) {\r\n return false;\r\n }\r\n\r\n const temp = pyth - dot * dot;\r\n\r\n return temp <= rr;\r\n }\r\n\r\n /**\r\n * If the ray hits a triange\r\n * @param vertex0 triangle vertex\r\n * @param vertex1 triangle vertex\r\n * @param vertex2 triangle vertex\r\n * @returns intersection information if hit\r\n */\r\n public intersectsTriangle(vertex0: DeepImmutable, vertex1: DeepImmutable, vertex2: DeepImmutable): Nullable {\r\n const edge1 = Ray._TmpVector3[0];\r\n const edge2 = Ray._TmpVector3[1];\r\n const pvec = Ray._TmpVector3[2];\r\n const tvec = Ray._TmpVector3[3];\r\n const qvec = Ray._TmpVector3[4];\r\n\r\n vertex1.subtractToRef(vertex0, edge1);\r\n vertex2.subtractToRef(vertex0, edge2);\r\n Vector3.CrossToRef(this.direction, edge2, pvec);\r\n const det = Vector3.Dot(edge1, pvec);\r\n\r\n if (det === 0) {\r\n return null;\r\n }\r\n\r\n const invdet = 1 / det;\r\n\r\n this.origin.subtractToRef(vertex0, tvec);\r\n\r\n const bv = Vector3.Dot(tvec, pvec) * invdet;\r\n\r\n if (bv < -this.epsilon || bv > 1.0 + this.epsilon) {\r\n return null;\r\n }\r\n\r\n Vector3.CrossToRef(tvec, edge1, qvec);\r\n\r\n const bw = Vector3.Dot(this.direction, qvec) * invdet;\r\n\r\n if (bw < -this.epsilon || bv + bw > 1.0 + this.epsilon) {\r\n return null;\r\n }\r\n\r\n //check if the distance is longer than the predefined length.\r\n const distance = Vector3.Dot(edge2, qvec) * invdet;\r\n if (distance > this.length) {\r\n return null;\r\n }\r\n\r\n return new IntersectionInfo(1 - bv - bw, bv, distance);\r\n }\r\n\r\n /**\r\n * Checks if ray intersects a plane\r\n * @param plane the plane to check\r\n * @returns the distance away it was hit\r\n */\r\n public intersectsPlane(plane: DeepImmutable): Nullable {\r\n let distance: number;\r\n const result1 = Vector3.Dot(plane.normal, this.direction);\r\n if (Math.abs(result1) < 9.99999997475243e-7) {\r\n return null;\r\n } else {\r\n const result2 = Vector3.Dot(plane.normal, this.origin);\r\n distance = (-plane.d - result2) / result1;\r\n if (distance < 0.0) {\r\n if (distance < -9.99999997475243e-7) {\r\n return null;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n return distance;\r\n }\r\n }\r\n /**\r\n * Calculate the intercept of a ray on a given axis\r\n * @param axis to check 'x' | 'y' | 'z'\r\n * @param offset from axis interception (i.e. an offset of 1y is intercepted above ground)\r\n * @returns a vector containing the coordinates where 'axis' is equal to zero (else offset), or null if there is no intercept.\r\n */\r\n public intersectsAxis(axis: string, offset: number = 0): Nullable {\r\n switch (axis) {\r\n case \"y\": {\r\n const t = (this.origin.y - offset) / this.direction.y;\r\n if (t > 0) {\r\n return null;\r\n }\r\n return new Vector3(this.origin.x + this.direction.x * -t, offset, this.origin.z + this.direction.z * -t);\r\n }\r\n case \"x\": {\r\n const t = (this.origin.x - offset) / this.direction.x;\r\n if (t > 0) {\r\n return null;\r\n }\r\n return new Vector3(offset, this.origin.y + this.direction.y * -t, this.origin.z + this.direction.z * -t);\r\n }\r\n case \"z\": {\r\n const t = (this.origin.z - offset) / this.direction.z;\r\n if (t > 0) {\r\n return null;\r\n }\r\n return new Vector3(this.origin.x + this.direction.x * -t, this.origin.y + this.direction.y * -t, offset);\r\n }\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Checks if ray intersects a mesh. The ray is defined in WORLD space. A mesh triangle can be picked both from its front and back sides,\r\n * irrespective of orientation.\r\n * @param mesh the mesh to check\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\r\n * @param worldToUse defines the world matrix to use to get the world coordinate of the intersection point\r\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\r\n * @returns picking info of the intersection\r\n */\r\n public intersectsMesh(\r\n mesh: DeepImmutable,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate,\r\n onlyBoundingInfo = false,\r\n worldToUse?: Matrix,\r\n skipBoundingInfo = false\r\n ): PickingInfo {\r\n const tm = TmpVectors.Matrix[0];\r\n\r\n mesh.getWorldMatrix().invertToRef(tm);\r\n\r\n if (this._tmpRay) {\r\n Ray.TransformToRef(this, tm, this._tmpRay);\r\n } else {\r\n this._tmpRay = Ray.Transform(this, tm);\r\n }\r\n\r\n return mesh.intersects(this._tmpRay, fastCheck, trianglePredicate, onlyBoundingInfo, worldToUse, skipBoundingInfo);\r\n }\r\n\r\n /**\r\n * Checks if ray intersects a mesh\r\n * @param meshes the meshes to check\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param results array to store result in\r\n * @returns Array of picking infos\r\n */\r\n public intersectsMeshes(meshes: Array>, fastCheck?: boolean, results?: Array): Array {\r\n if (results) {\r\n results.length = 0;\r\n } else {\r\n results = [];\r\n }\r\n\r\n for (let i = 0; i < meshes.length; i++) {\r\n const pickInfo = this.intersectsMesh(meshes[i], fastCheck);\r\n\r\n if (pickInfo.hit) {\r\n results.push(pickInfo);\r\n }\r\n }\r\n\r\n results.sort(this._comparePickingInfo);\r\n\r\n return results;\r\n }\r\n\r\n private _comparePickingInfo(pickingInfoA: DeepImmutable, pickingInfoB: DeepImmutable): number {\r\n if (pickingInfoA.distance < pickingInfoB.distance) {\r\n return -1;\r\n } else if (pickingInfoA.distance > pickingInfoB.distance) {\r\n return 1;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n private static _Smallnum = 0.00000001;\r\n private static _Rayl = 10e8;\r\n\r\n /**\r\n * Intersection test between the ray and a given segment within a given tolerance (threshold)\r\n * @param sega the first point of the segment to test the intersection against\r\n * @param segb the second point of the segment to test the intersection against\r\n * @param threshold the tolerance margin, if the ray doesn't intersect the segment but is close to the given threshold, the intersection is successful\r\n * @returns the distance from the ray origin to the intersection point if there's intersection, or -1 if there's no intersection\r\n */\r\n intersectionSegment(sega: DeepImmutable, segb: DeepImmutable, threshold: number): number {\r\n const o = this.origin;\r\n const u = TmpVectors.Vector3[0];\r\n const rsegb = TmpVectors.Vector3[1];\r\n const v = TmpVectors.Vector3[2];\r\n const w = TmpVectors.Vector3[3];\r\n\r\n segb.subtractToRef(sega, u);\r\n\r\n this.direction.scaleToRef(Ray._Rayl, v);\r\n o.addToRef(v, rsegb);\r\n\r\n sega.subtractToRef(o, w);\r\n\r\n const a = Vector3.Dot(u, u); // always >= 0\r\n const b = Vector3.Dot(u, v);\r\n const c = Vector3.Dot(v, v); // always >= 0\r\n const d = Vector3.Dot(u, w);\r\n const e = Vector3.Dot(v, w);\r\n const D = a * c - b * b; // always >= 0\r\n let sN: number,\r\n sD = D; // sc = sN / sD, default sD = D >= 0\r\n let tN: number,\r\n tD = D; // tc = tN / tD, default tD = D >= 0\r\n\r\n // compute the line parameters of the two closest points\r\n if (D < Ray._Smallnum) {\r\n // the lines are almost parallel\r\n sN = 0.0; // force using point P0 on segment S1\r\n sD = 1.0; // to prevent possible division by 0.0 later\r\n tN = e;\r\n tD = c;\r\n } else {\r\n // get the closest points on the infinite lines\r\n sN = b * e - c * d;\r\n tN = a * e - b * d;\r\n if (sN < 0.0) {\r\n // sc < 0 => the s=0 edge is visible\r\n sN = 0.0;\r\n tN = e;\r\n tD = c;\r\n } else if (sN > sD) {\r\n // sc > 1 => the s=1 edge is visible\r\n sN = sD;\r\n tN = e + b;\r\n tD = c;\r\n }\r\n }\r\n\r\n if (tN < 0.0) {\r\n // tc < 0 => the t=0 edge is visible\r\n tN = 0.0;\r\n // recompute sc for this edge\r\n if (-d < 0.0) {\r\n sN = 0.0;\r\n } else if (-d > a) {\r\n sN = sD;\r\n } else {\r\n sN = -d;\r\n sD = a;\r\n }\r\n } else if (tN > tD) {\r\n // tc > 1 => the t=1 edge is visible\r\n tN = tD;\r\n // recompute sc for this edge\r\n if (-d + b < 0.0) {\r\n sN = 0;\r\n } else if (-d + b > a) {\r\n sN = sD;\r\n } else {\r\n sN = -d + b;\r\n sD = a;\r\n }\r\n }\r\n // finally do the division to get sc and tc\r\n const sc = Math.abs(sN) < Ray._Smallnum ? 0.0 : sN / sD;\r\n const tc = Math.abs(tN) < Ray._Smallnum ? 0.0 : tN / tD;\r\n\r\n // get the difference of the two closest points\r\n const qtc = TmpVectors.Vector3[4];\r\n v.scaleToRef(tc, qtc);\r\n const qsc = TmpVectors.Vector3[5];\r\n u.scaleToRef(sc, qsc);\r\n qsc.addInPlace(w);\r\n const dP = TmpVectors.Vector3[6];\r\n qsc.subtractToRef(qtc, dP); // = S1(sc) - S2(tc)\r\n\r\n const isIntersected = tc > 0 && tc <= this.length && dP.lengthSquared() < threshold * threshold; // return intersection result\r\n\r\n if (isIntersected) {\r\n return qsc.length();\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * Update the ray from viewport position\r\n * @param x position\r\n * @param y y position\r\n * @param viewportWidth viewport width\r\n * @param viewportHeight viewport height\r\n * @param world world matrix\r\n * @param view view matrix\r\n * @param projection projection matrix\r\n * @param enableDistantPicking defines if picking should handle large values for mesh position/scaling (false by default)\r\n * @returns this ray updated\r\n */\r\n public update(\r\n x: number,\r\n y: number,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable,\r\n enableDistantPicking: boolean = false\r\n ): Ray {\r\n if (enableDistantPicking) {\r\n // With world matrices having great values (like 8000000000 on 1 or more scaling or position axis),\r\n // multiplying view/projection/world and doing invert will result in loss of float precision in the matrix.\r\n // One way to fix it is to compute the ray with world at identity then transform the ray in object space.\r\n // This is slower (2 matrix inverts instead of 1) but precision is preserved.\r\n // This is hidden behind `EnableDistantPicking` flag (default is false)\r\n if (!Ray._RayDistant) {\r\n Ray._RayDistant = Ray.Zero();\r\n }\r\n\r\n Ray._RayDistant.unprojectRayToRef(x, y, viewportWidth, viewportHeight, Matrix.IdentityReadOnly, view, projection);\r\n\r\n const tm = TmpVectors.Matrix[0];\r\n world.invertToRef(tm);\r\n Ray.TransformToRef(Ray._RayDistant, tm, this);\r\n } else {\r\n this.unprojectRayToRef(x, y, viewportWidth, viewportHeight, world, view, projection);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a ray with origin and direction of 0,0,0\r\n * @returns the new ray\r\n */\r\n public static Zero(): Ray {\r\n return new Ray(Vector3.Zero(), Vector3.Zero());\r\n }\r\n\r\n /**\r\n * Creates a new ray from screen space and viewport\r\n * @param x position\r\n * @param y y position\r\n * @param viewportWidth viewport width\r\n * @param viewportHeight viewport height\r\n * @param world world matrix\r\n * @param view view matrix\r\n * @param projection projection matrix\r\n * @returns new ray\r\n */\r\n public static CreateNew(\r\n x: number,\r\n y: number,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable\r\n ): Ray {\r\n const result = Ray.Zero();\r\n\r\n return result.update(x, y, viewportWidth, viewportHeight, world, view, projection);\r\n }\r\n\r\n /**\r\n * Function will create a new transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be\r\n * transformed to the given world matrix.\r\n * @param origin The origin point\r\n * @param end The end point\r\n * @param world a matrix to transform the ray to. Default is the identity matrix.\r\n * @returns the new ray\r\n */\r\n public static CreateNewFromTo(origin: Vector3, end: Vector3, world: DeepImmutable = Matrix.IdentityReadOnly): Ray {\r\n const result = new Ray(new Vector3(0, 0, 0), new Vector3(0, 0, 0));\r\n return Ray.CreateFromToToRef(origin, end, result, world);\r\n }\r\n\r\n /**\r\n * Function will update a transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be\r\n * transformed to the given world matrix.\r\n * @param origin The origin point\r\n * @param end The end point\r\n * @param result the object to store the result\r\n * @param world a matrix to transform the ray to. Default is the identity matrix.\r\n * @returns the ref ray\r\n */\r\n public static CreateFromToToRef(origin: Vector3, end: Vector3, result: Ray, world: DeepImmutable = Matrix.IdentityReadOnly): Ray {\r\n result.origin.copyFrom(origin);\r\n const direction = end.subtractToRef(origin, result.direction);\r\n const length = Math.sqrt(direction.x * direction.x + direction.y * direction.y + direction.z * direction.z);\r\n result.length = length;\r\n result.direction.normalize();\r\n\r\n return Ray.TransformToRef(result, world, result);\r\n }\r\n\r\n /**\r\n * Transforms a ray by a matrix\r\n * @param ray ray to transform\r\n * @param matrix matrix to apply\r\n * @returns the resulting new ray\r\n */\r\n public static Transform(ray: DeepImmutable, matrix: DeepImmutable): Ray {\r\n const result = new Ray(new Vector3(0, 0, 0), new Vector3(0, 0, 0));\r\n Ray.TransformToRef(ray, matrix, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Transforms a ray by a matrix\r\n * @param ray ray to transform\r\n * @param matrix matrix to apply\r\n * @param result ray to store result in\r\n * @returns the updated result ray\r\n */\r\n public static TransformToRef(ray: DeepImmutable, matrix: DeepImmutable, result: Ray): Ray {\r\n Vector3.TransformCoordinatesToRef(ray.origin, matrix, result.origin);\r\n Vector3.TransformNormalToRef(ray.direction, matrix, result.direction);\r\n result.length = ray.length;\r\n result.epsilon = ray.epsilon;\r\n\r\n const dir = result.direction;\r\n const len = dir.length();\r\n\r\n if (!(len === 0 || len === 1)) {\r\n const num = 1.0 / len;\r\n dir.x *= num;\r\n dir.y *= num;\r\n dir.z *= num;\r\n result.length *= len;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Unproject a ray from screen space to object space\r\n * @param sourceX defines the screen space x coordinate to use\r\n * @param sourceY defines the screen space y coordinate to use\r\n * @param viewportWidth defines the current width of the viewport\r\n * @param viewportHeight defines the current height of the viewport\r\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\r\n * @param view defines the view matrix to use\r\n * @param projection defines the projection matrix to use\r\n */\r\n public unprojectRayToRef(\r\n sourceX: float,\r\n sourceY: float,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable\r\n ): void {\r\n const matrix = TmpVectors.Matrix[0];\r\n world.multiplyToRef(view, matrix);\r\n matrix.multiplyToRef(projection, matrix);\r\n matrix.invert();\r\n\r\n const engine = EngineStore.LastCreatedEngine;\r\n const nearScreenSource = TmpVectors.Vector3[0];\r\n nearScreenSource.x = (sourceX / viewportWidth) * 2 - 1;\r\n nearScreenSource.y = -((sourceY / viewportHeight) * 2 - 1);\r\n nearScreenSource.z = engine?.useReverseDepthBuffer ? 1 : engine?.isNDCHalfZRange ? 0 : -1;\r\n\r\n // far Z need to be close but < to 1 or camera projection matrix with maxZ = 0 will NaN\r\n const farScreenSource = TmpVectors.Vector3[1].copyFromFloats(nearScreenSource.x, nearScreenSource.y, 1.0 - 1e-8);\r\n const nearVec3 = TmpVectors.Vector3[2];\r\n const farVec3 = TmpVectors.Vector3[3];\r\n Vector3._UnprojectFromInvertedMatrixToRef(nearScreenSource, matrix, nearVec3);\r\n Vector3._UnprojectFromInvertedMatrixToRef(farScreenSource, matrix, farVec3);\r\n\r\n this.origin.copyFrom(nearVec3);\r\n farVec3.subtractToRef(nearVec3, this.direction);\r\n this.direction.normalize();\r\n }\r\n}\r\n\r\n// Picking\r\n/**\r\n * Type used to define predicate used to select faces when a mesh intersection is detected\r\n */\r\nexport type TrianglePickingPredicate = (p0: Vector3, p1: Vector3, p2: Vector3, ray: Ray, i0: number, i1: number, i2: number) => boolean;\r\n\r\ndeclare module \"../scene\" {\r\n export interface Scene {\r\n /** @internal */\r\n _tempPickingRay: Nullable;\r\n\r\n /** @internal */\r\n _cachedRayForTransform: Ray;\r\n\r\n /** @internal */\r\n _pickWithRayInverseMatrix: Matrix;\r\n\r\n /** @internal */\r\n _internalPick(\r\n rayFunction: (world: Matrix, enableDistantPicking: boolean) => Ray,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n fastCheck?: boolean,\r\n onlyBoundingInfo?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): PickingInfo;\r\n\r\n /** @internal */\r\n _internalMultiPick(\r\n rayFunction: (world: Matrix, enableDistantPicking: boolean) => Ray,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable;\r\n\r\n /** @internal */\r\n _internalPickForMesh(\r\n pickingInfo: Nullable,\r\n rayFunction: (world: Matrix, enableDistantPicking: boolean) => Ray,\r\n mesh: AbstractMesh,\r\n world: Matrix,\r\n fastCheck?: boolean,\r\n onlyBoundingInfo?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate,\r\n skipBoundingInfo?: boolean\r\n ): Nullable;\r\n }\r\n}\r\n\r\nScene.prototype.createPickingRay = function (x: number, y: number, world: Nullable, camera: Nullable, cameraViewSpace = false): Ray {\r\n const result = Ray.Zero();\r\n\r\n this.createPickingRayToRef(x, y, world, result, camera, cameraViewSpace);\r\n\r\n return result;\r\n};\r\n\r\nScene.prototype.createPickingRayToRef = function (\r\n x: number,\r\n y: number,\r\n world: Nullable,\r\n result: Ray,\r\n camera: Nullable,\r\n cameraViewSpace = false,\r\n enableDistantPicking = false\r\n): Scene {\r\n const engine = this.getEngine();\r\n\r\n if (!camera && !(camera = this.activeCamera!)) {\r\n return this;\r\n }\r\n\r\n const cameraViewport = camera.viewport;\r\n const renderHeight = engine.getRenderHeight();\r\n const { x: vx, y: vy, width, height } = cameraViewport.toGlobal(engine.getRenderWidth(), renderHeight);\r\n\r\n // Moving coordinates to local viewport world\r\n const levelInv = 1 / engine.getHardwareScalingLevel();\r\n x = x * levelInv - vx;\r\n y = y * levelInv - (renderHeight - vy - height);\r\n\r\n result.update(\r\n x,\r\n y,\r\n width,\r\n height,\r\n world ? world : Matrix.IdentityReadOnly,\r\n cameraViewSpace ? Matrix.IdentityReadOnly : camera.getViewMatrix(),\r\n camera.getProjectionMatrix(),\r\n enableDistantPicking\r\n );\r\n return this;\r\n};\r\n\r\nScene.prototype.createPickingRayInCameraSpace = function (x: number, y: number, camera?: Camera): Ray {\r\n const result = Ray.Zero();\r\n\r\n this.createPickingRayInCameraSpaceToRef(x, y, result, camera);\r\n\r\n return result;\r\n};\r\n\r\nScene.prototype.createPickingRayInCameraSpaceToRef = function (x: number, y: number, result: Ray, camera?: Camera): Scene {\r\n if (!PickingInfo) {\r\n return this;\r\n }\r\n\r\n const engine = this.getEngine();\r\n\r\n if (!camera && !(camera = this.activeCamera!)) {\r\n throw new Error(\"Active camera not set\");\r\n }\r\n\r\n const cameraViewport = camera.viewport;\r\n const renderHeight = engine.getRenderHeight();\r\n const { x: vx, y: vy, width, height } = cameraViewport.toGlobal(engine.getRenderWidth(), renderHeight);\r\n const identity = Matrix.Identity();\r\n\r\n // Moving coordinates to local viewport world\r\n const levelInv = 1 / engine.getHardwareScalingLevel();\r\n x = x * levelInv - vx;\r\n y = y * levelInv - (renderHeight - vy - height);\r\n result.update(x, y, width, height, identity, identity, camera.getProjectionMatrix());\r\n return this;\r\n};\r\n\r\nScene.prototype._internalPickForMesh = function (\r\n pickingInfo: Nullable,\r\n rayFunction: (world: Matrix, enableDistantPicking: boolean) => Ray,\r\n mesh: AbstractMesh,\r\n world: Matrix,\r\n fastCheck?: boolean,\r\n onlyBoundingInfo?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate,\r\n skipBoundingInfo?: boolean\r\n) {\r\n const ray = rayFunction(world, mesh.enableDistantPicking);\r\n\r\n const result = mesh.intersects(ray, fastCheck, trianglePredicate, onlyBoundingInfo, world, skipBoundingInfo);\r\n if (!result || !result.hit) {\r\n return null;\r\n }\r\n\r\n if (!fastCheck && pickingInfo != null && result.distance >= pickingInfo.distance) {\r\n return null;\r\n }\r\n\r\n return result;\r\n};\r\n\r\nScene.prototype._internalPick = function (\r\n rayFunction: (world: Matrix, enableDistantPicking: boolean) => Ray,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n fastCheck?: boolean,\r\n onlyBoundingInfo?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n): PickingInfo {\r\n let pickingInfo = null;\r\n\r\n const computeWorldMatrixForCamera = !!(this.activeCameras && this.activeCameras.length > 1 && this.cameraToUseForPointers !== this.activeCamera);\r\n const currentCamera = this.cameraToUseForPointers || this.activeCamera;\r\n\r\n for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) {\r\n const mesh = this.meshes[meshIndex];\r\n\r\n if (predicate) {\r\n if (!predicate(mesh)) {\r\n continue;\r\n }\r\n } else if (!mesh.isEnabled() || !mesh.isVisible || !mesh.isPickable) {\r\n continue;\r\n }\r\n\r\n const forceCompute = computeWorldMatrixForCamera && mesh.isWorldMatrixCameraDependent();\r\n const world = mesh.computeWorldMatrix(forceCompute, currentCamera);\r\n\r\n if (mesh.hasThinInstances && (mesh as Mesh).thinInstanceEnablePicking) {\r\n // first check if the ray intersects the whole bounding box/sphere of the mesh\r\n const result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, world, true, true, trianglePredicate);\r\n if (result) {\r\n if (onlyBoundingInfo) {\r\n // the user only asked for a bounding info check so we can return\r\n return result;\r\n }\r\n const tmpMatrix = TmpVectors.Matrix[1];\r\n const thinMatrices = (mesh as Mesh).thinInstanceGetWorldMatrices();\r\n for (let index = 0; index < thinMatrices.length; index++) {\r\n const thinMatrix = thinMatrices[index];\r\n thinMatrix.multiplyToRef(world, tmpMatrix);\r\n const result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, tmpMatrix, fastCheck, onlyBoundingInfo, trianglePredicate, true);\r\n\r\n if (result) {\r\n pickingInfo = result;\r\n pickingInfo.thinInstanceIndex = index;\r\n\r\n if (fastCheck) {\r\n return pickingInfo;\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n const result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, world, fastCheck, onlyBoundingInfo, trianglePredicate);\r\n\r\n if (result) {\r\n pickingInfo = result;\r\n\r\n if (fastCheck) {\r\n return pickingInfo;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return pickingInfo || new PickingInfo();\r\n};\r\n\r\nScene.prototype._internalMultiPick = function (\r\n rayFunction: (world: Matrix, enableDistantPicking: boolean) => Ray,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n): Nullable {\r\n if (!PickingInfo) {\r\n return null;\r\n }\r\n const pickingInfos: PickingInfo[] = [];\r\n const computeWorldMatrixForCamera = !!(this.activeCameras && this.activeCameras.length > 1 && this.cameraToUseForPointers !== this.activeCamera);\r\n const currentCamera = this.cameraToUseForPointers || this.activeCamera;\r\n\r\n for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) {\r\n const mesh = this.meshes[meshIndex];\r\n\r\n if (predicate) {\r\n if (!predicate(mesh)) {\r\n continue;\r\n }\r\n } else if (!mesh.isEnabled() || !mesh.isVisible || !mesh.isPickable) {\r\n continue;\r\n }\r\n\r\n const forceCompute = computeWorldMatrixForCamera && mesh.isWorldMatrixCameraDependent();\r\n const world = mesh.computeWorldMatrix(forceCompute, currentCamera);\r\n\r\n if (mesh.hasThinInstances && (mesh as Mesh).thinInstanceEnablePicking) {\r\n const result = this._internalPickForMesh(null, rayFunction, mesh, world, true, true, trianglePredicate);\r\n if (result) {\r\n const tmpMatrix = TmpVectors.Matrix[1];\r\n const thinMatrices = (mesh as Mesh).thinInstanceGetWorldMatrices();\r\n for (let index = 0; index < thinMatrices.length; index++) {\r\n const thinMatrix = thinMatrices[index];\r\n thinMatrix.multiplyToRef(world, tmpMatrix);\r\n const result = this._internalPickForMesh(null, rayFunction, mesh, tmpMatrix, false, false, trianglePredicate, true);\r\n\r\n if (result) {\r\n result.thinInstanceIndex = index;\r\n pickingInfos.push(result);\r\n }\r\n }\r\n }\r\n } else {\r\n const result = this._internalPickForMesh(null, rayFunction, mesh, world, false, false, trianglePredicate);\r\n\r\n if (result) {\r\n pickingInfos.push(result);\r\n }\r\n }\r\n }\r\n\r\n return pickingInfos;\r\n};\r\n\r\nScene.prototype.pickWithBoundingInfo = function (\r\n x: number,\r\n y: number,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n fastCheck?: boolean,\r\n camera?: Nullable\r\n): Nullable {\r\n if (!PickingInfo) {\r\n return null;\r\n }\r\n const result = this._internalPick(\r\n (world) => {\r\n if (!this._tempPickingRay) {\r\n this._tempPickingRay = Ray.Zero();\r\n }\r\n\r\n this.createPickingRayToRef(x, y, world, this._tempPickingRay, camera || null);\r\n return this._tempPickingRay;\r\n },\r\n predicate,\r\n fastCheck,\r\n true\r\n );\r\n if (result) {\r\n result.ray = this.createPickingRay(x, y, Matrix.Identity(), camera || null);\r\n }\r\n return result;\r\n};\r\n\r\nObject.defineProperty(Scene.prototype, \"_pickingAvailable\", {\r\n get: () => true,\r\n enumerable: false,\r\n configurable: false,\r\n});\r\n\r\nScene.prototype.pick = function (\r\n x: number,\r\n y: number,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n fastCheck?: boolean,\r\n camera?: Nullable,\r\n trianglePredicate?: TrianglePickingPredicate,\r\n _enableDistantPicking = false\r\n): PickingInfo {\r\n const result = this._internalPick(\r\n (world, enableDistantPicking) => {\r\n if (!this._tempPickingRay) {\r\n this._tempPickingRay = Ray.Zero();\r\n }\r\n\r\n this.createPickingRayToRef(x, y, world, this._tempPickingRay, camera || null, false, enableDistantPicking);\r\n return this._tempPickingRay;\r\n },\r\n predicate,\r\n fastCheck,\r\n false,\r\n trianglePredicate\r\n );\r\n if (result) {\r\n result.ray = this.createPickingRay(x, y, Matrix.Identity(), camera || null);\r\n }\r\n return result;\r\n};\r\n\r\nScene.prototype.pickWithRay = function (\r\n ray: Ray,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n): Nullable {\r\n const result = this._internalPick(\r\n (world) => {\r\n if (!this._pickWithRayInverseMatrix) {\r\n this._pickWithRayInverseMatrix = Matrix.Identity();\r\n }\r\n world.invertToRef(this._pickWithRayInverseMatrix);\r\n\r\n if (!this._cachedRayForTransform) {\r\n this._cachedRayForTransform = Ray.Zero();\r\n }\r\n\r\n Ray.TransformToRef(ray, this._pickWithRayInverseMatrix, this._cachedRayForTransform);\r\n return this._cachedRayForTransform;\r\n },\r\n predicate,\r\n fastCheck,\r\n false,\r\n trianglePredicate\r\n );\r\n if (result) {\r\n result.ray = ray;\r\n }\r\n return result;\r\n};\r\n\r\nScene.prototype.multiPick = function (\r\n x: number,\r\n y: number,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n camera?: Camera,\r\n trianglePredicate?: TrianglePickingPredicate\r\n): Nullable {\r\n return this._internalMultiPick((world) => this.createPickingRay(x, y, world, camera || null), predicate, trianglePredicate);\r\n};\r\n\r\nScene.prototype.multiPickWithRay = function (ray: Ray, predicate?: (mesh: AbstractMesh) => boolean, trianglePredicate?: TrianglePickingPredicate): Nullable {\r\n return this._internalMultiPick(\r\n (world) => {\r\n if (!this._pickWithRayInverseMatrix) {\r\n this._pickWithRayInverseMatrix = Matrix.Identity();\r\n }\r\n world.invertToRef(this._pickWithRayInverseMatrix);\r\n\r\n if (!this._cachedRayForTransform) {\r\n this._cachedRayForTransform = Ray.Zero();\r\n }\r\n\r\n Ray.TransformToRef(ray, this._pickWithRayInverseMatrix, this._cachedRayForTransform);\r\n return this._cachedRayForTransform;\r\n },\r\n predicate,\r\n trianglePredicate\r\n );\r\n};\r\n\r\nCamera.prototype.getForwardRay = function (length = 100, transform?: Matrix, origin?: Vector3): Ray {\r\n return this.getForwardRayToRef(new Ray(Vector3.Zero(), Vector3.Zero(), length), length, transform, origin);\r\n};\r\n\r\nCamera.prototype.getForwardRayToRef = function (refRay: Ray, length = 100, transform?: Matrix, origin?: Vector3): Ray {\r\n if (!transform) {\r\n transform = this.getWorldMatrix();\r\n }\r\n refRay.length = length;\r\n\r\n if (origin) {\r\n refRay.origin.copyFrom(origin);\r\n } else {\r\n refRay.origin.copyFrom(this.position);\r\n }\r\n const forward = TmpVectors.Vector3[2];\r\n forward.set(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n const worldForward = TmpVectors.Vector3[3];\r\n Vector3.TransformNormalToRef(forward, transform, worldForward);\r\n Vector3.NormalizeToRef(worldForward, refRay.direction);\r\n\r\n return refRay;\r\n};\r\n", "import { Vector3, Matrix } from \"../Maths/math.vector\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\n\r\n/**\r\n * Class containing a set of static utilities functions for managing Pivots\r\n * @internal\r\n */\r\nexport class PivotTools {\r\n // Stores the state of the pivot cache (_oldPivotPoint, _pivotTranslation)\r\n // store/remove pivot point should only be applied during their outermost calls\r\n private static _PivotCached = 0;\r\n private static _OldPivotPoint = new Vector3();\r\n private static _PivotTranslation = new Vector3();\r\n private static _PivotTmpVector = new Vector3();\r\n private static _PivotPostMultiplyPivotMatrix = false;\r\n /**\r\n * @internal\r\n */\r\n public static _RemoveAndStorePivotPoint(mesh: TransformNode) {\r\n if (mesh && PivotTools._PivotCached === 0) {\r\n // Save old pivot and set pivot to 0,0,0\r\n mesh.getPivotPointToRef(PivotTools._OldPivotPoint);\r\n PivotTools._PivotPostMultiplyPivotMatrix = mesh._postMultiplyPivotMatrix;\r\n if (!PivotTools._OldPivotPoint.equalsToFloats(0, 0, 0)) {\r\n mesh.setPivotMatrix(Matrix.IdentityReadOnly);\r\n PivotTools._OldPivotPoint.subtractToRef(mesh.getPivotPoint(), PivotTools._PivotTranslation);\r\n PivotTools._PivotTmpVector.copyFromFloats(1, 1, 1);\r\n PivotTools._PivotTmpVector.subtractInPlace(mesh.scaling);\r\n PivotTools._PivotTmpVector.multiplyInPlace(PivotTools._PivotTranslation);\r\n mesh.position.addInPlace(PivotTools._PivotTmpVector);\r\n }\r\n }\r\n PivotTools._PivotCached++;\r\n }\r\n /**\r\n * @internal\r\n */\r\n public static _RestorePivotPoint(mesh: TransformNode) {\r\n if (mesh && !PivotTools._OldPivotPoint.equalsToFloats(0, 0, 0) && PivotTools._PivotCached === 1) {\r\n mesh.setPivotPoint(PivotTools._OldPivotPoint);\r\n mesh._postMultiplyPivotMatrix = PivotTools._PivotPostMultiplyPivotMatrix;\r\n PivotTools._PivotTmpVector.copyFromFloats(1, 1, 1);\r\n PivotTools._PivotTmpVector.subtractInPlace(mesh.scaling);\r\n PivotTools._PivotTmpVector.multiplyInPlace(PivotTools._PivotTranslation);\r\n mesh.position.subtractInPlace(PivotTools._PivotTmpVector);\r\n }\r\n this._PivotCached--;\r\n }\r\n}\r\n", "import type { Scene } from \"../../scene\";\r\nimport type { Vector4 } from \"../../Maths/math.vector\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Plane } from \"../../Maths/math.plane\";\r\nimport { CompatibilityOptions } from \"../../Compat/compatibilityOptions\";\r\n\r\n/**\r\n * Creates the VertexData for a Plane\r\n * @param options an object used to set the following optional parameters for the plane, required but can be empty\r\n * * size sets the width and height of the plane to the value of size, optional default 1\r\n * * width sets the width (x direction) of the plane, overwrites the width set by size, optional, default size\r\n * * height sets the height (y direction) of the plane, overwrites the height set by size, optional, default size\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the box\r\n */\r\nexport function CreatePlaneVertexData(options: { size?: number; width?: number; height?: number; sideOrientation?: number; frontUVs?: Vector4; backUVs?: Vector4 }): VertexData {\r\n const indices = [];\r\n const positions = [];\r\n const normals = [];\r\n const uvs = [];\r\n\r\n const width: number = options.width || options.size || 1;\r\n const height: number = options.height || options.size || 1;\r\n const sideOrientation = options.sideOrientation === 0 ? 0 : options.sideOrientation || VertexData.DEFAULTSIDE;\r\n\r\n // Vertices\r\n const halfWidth = width / 2.0;\r\n const halfHeight = height / 2.0;\r\n\r\n positions.push(-halfWidth, -halfHeight, 0);\r\n normals.push(0, 0, -1.0);\r\n uvs.push(0.0, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 : 0.0);\r\n\r\n positions.push(halfWidth, -halfHeight, 0);\r\n normals.push(0, 0, -1.0);\r\n uvs.push(1.0, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 : 0.0);\r\n\r\n positions.push(halfWidth, halfHeight, 0);\r\n normals.push(0, 0, -1.0);\r\n uvs.push(1.0, CompatibilityOptions.UseOpenGLOrientationForUV ? 0.0 : 1.0);\r\n\r\n positions.push(-halfWidth, halfHeight, 0);\r\n normals.push(0, 0, -1.0);\r\n uvs.push(0.0, CompatibilityOptions.UseOpenGLOrientationForUV ? 0.0 : 1.0);\r\n\r\n // Indices\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n // Sides\r\n VertexData._ComputeSides(sideOrientation, positions, indices, normals, uvs, options.frontUVs, options.backUVs);\r\n\r\n // Result\r\n const vertexData = new VertexData();\r\n\r\n vertexData.indices = indices;\r\n vertexData.positions = positions;\r\n vertexData.normals = normals;\r\n vertexData.uvs = uvs;\r\n\r\n return vertexData;\r\n}\r\n\r\n/**\r\n * Creates a plane mesh\r\n * * The parameter `size` sets the size (float) of both sides of the plane at once (default 1)\r\n * * You can set some different plane dimensions by using the parameters `width` and `height` (both by default have the same value of `size`)\r\n * * The parameter `sourcePlane` is a Plane instance. It builds a mesh plane from a Math plane\r\n * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE\r\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\r\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\r\n * @param name defines the name of the mesh\r\n * @param options defines the options used to create the mesh\r\n * @param scene defines the hosting scene\r\n * @returns the plane mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#plane\r\n */\r\nexport function CreatePlane(\r\n name: string,\r\n options: { size?: number; width?: number; height?: number; sideOrientation?: number; frontUVs?: Vector4; backUVs?: Vector4; updatable?: boolean; sourcePlane?: Plane } = {},\r\n scene: Nullable = null\r\n): Mesh {\r\n const plane = new Mesh(name, scene);\r\n\r\n options.sideOrientation = Mesh._GetDefaultSideOrientation(options.sideOrientation);\r\n plane._originalBuilderSideOrientation = options.sideOrientation;\r\n\r\n const vertexData = CreatePlaneVertexData(options);\r\n\r\n vertexData.applyToMesh(plane, options.updatable);\r\n\r\n if (options.sourcePlane) {\r\n plane.translate(options.sourcePlane.normal, -options.sourcePlane.d);\r\n plane.setDirection(options.sourcePlane.normal.scale(-1));\r\n }\r\n\r\n return plane;\r\n}\r\n\r\n/**\r\n * Class containing static functions to help procedurally build meshes\r\n * @deprecated use the function directly from the module\r\n */\r\nexport const PlaneBuilder = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CreatePlane,\r\n};\r\n\r\nVertexData.CreatePlane = CreatePlaneVertexData;\r\nMesh.CreatePlane = (name: string, size: number, scene: Scene, updatable?: boolean, sideOrientation?: number): Mesh => {\r\n const options = {\r\n size,\r\n width: size,\r\n height: size,\r\n sideOrientation,\r\n updatable,\r\n };\r\n\r\n return CreatePlane(name, options, scene);\r\n};\r\n", "import type { Behavior } from \"../../Behaviors/behavior\";\r\nimport { Mesh } from \"../../Meshes/mesh\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { PointerInfo } from \"../../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../../Events/pointerEvents\";\r\nimport { Ray } from \"../../Culling/ray\";\r\nimport { PivotTools } from \"../../Misc/pivotTools\";\r\nimport type { ArcRotateCamera } from \"../../Cameras/arcRotateCamera\";\r\nimport { CreatePlane } from \"../../Meshes/Builders/planeBuilder\";\r\n\r\nimport type { IPointerEvent } from \"../../Events/deviceInputEvents\";\r\nimport { Epsilon } from \"../../Maths/math.constants\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will allow the mesh to be dragged around the screen based on pointer events\r\n */\r\nexport class PointerDragBehavior implements Behavior {\r\n private static _AnyMouseId = -2;\r\n /**\r\n * Abstract mesh the behavior is set on\r\n */\r\n public attachedNode: AbstractMesh;\r\n protected _dragPlane: Mesh;\r\n private _scene: Scene;\r\n private _pointerObserver: Nullable>;\r\n private _beforeRenderObserver: Nullable>;\r\n private static _PlaneScene: Scene;\r\n private _useAlternatePickedPointAboveMaxDragAngleDragSpeed = -1.1;\r\n private _activeDragButton: number = -1;\r\n private _activePointerInfo: Nullable;\r\n /**\r\n * The maximum tolerated angle between the drag plane and dragging pointer rays to trigger pointer events. Set to 0 to allow any angle (default: 0)\r\n */\r\n public maxDragAngle = 0;\r\n /**\r\n * Butttons that can be used to initiate a drag\r\n */\r\n public dragButtons = [0, 1, 2];\r\n /**\r\n * @internal\r\n */\r\n public _useAlternatePickedPointAboveMaxDragAngle = false;\r\n /**\r\n * Get or set the currentDraggingPointerId\r\n * @deprecated Please use currentDraggingPointerId instead\r\n */\r\n public get currentDraggingPointerID(): number {\r\n return this.currentDraggingPointerId;\r\n }\r\n public set currentDraggingPointerID(currentDraggingPointerID: number) {\r\n this.currentDraggingPointerId = currentDraggingPointerID;\r\n }\r\n /**\r\n * The id of the pointer that is currently interacting with the behavior (-1 when no pointer is active)\r\n */\r\n public currentDraggingPointerId = -1;\r\n /**\r\n * The last position where the pointer hit the drag plane in world space\r\n */\r\n public lastDragPosition: Vector3;\r\n /**\r\n * If the behavior is currently in a dragging state\r\n */\r\n public dragging = false;\r\n /**\r\n * The distance towards the target drag position to move each frame. This can be useful to avoid jitter. Set this to 1 for no delay. (Default: 0.2)\r\n */\r\n public dragDeltaRatio = 0.2;\r\n /**\r\n * If the drag plane orientation should be updated during the dragging (Default: true)\r\n */\r\n public updateDragPlane = true;\r\n // Debug mode will display drag planes to help visualize behavior\r\n private _debugMode = false;\r\n private _moving = false;\r\n /**\r\n * Fires each time the attached mesh is dragged with the pointer\r\n * * delta between last drag position and current drag position in world space\r\n * * dragDistance along the drag axis\r\n * * dragPlaneNormal normal of the current drag plane used during the drag\r\n * * dragPlanePoint in world space where the drag intersects the drag plane\r\n *\r\n * (if validatedDrag is used, the position of the attached mesh might not equal dragPlanePoint)\r\n */\r\n public onDragObservable = new Observable<{\r\n delta: Vector3;\r\n dragPlanePoint: Vector3;\r\n dragPlaneNormal: Vector3;\r\n dragDistance: number;\r\n pointerId: number;\r\n pointerInfo: Nullable;\r\n }>();\r\n /**\r\n * Fires each time a drag begins (eg. mouse down on mesh)\r\n * * dragPlanePoint in world space where the drag intersects the drag plane\r\n *\r\n * (if validatedDrag is used, the position of the attached mesh might not equal dragPlanePoint)\r\n */\r\n public onDragStartObservable = new Observable<{ dragPlanePoint: Vector3; pointerId: number; pointerInfo: Nullable }>();\r\n /**\r\n * Fires each time a drag ends (eg. mouse release after drag)\r\n * * dragPlanePoint in world space where the drag intersects the drag plane\r\n *\r\n * (if validatedDrag is used, the position of the attached mesh might not equal dragPlanePoint)\r\n */\r\n public onDragEndObservable = new Observable<{ dragPlanePoint: Vector3; pointerId: number; pointerInfo: Nullable }>();\r\n /**\r\n * Fires each time behavior enabled state changes\r\n */\r\n public onEnabledObservable = new Observable();\r\n\r\n /**\r\n * If the attached mesh should be moved when dragged\r\n */\r\n public moveAttached = true;\r\n\r\n /**\r\n * If the drag behavior will react to drag events (Default: true)\r\n */\r\n public set enabled(value: boolean) {\r\n if (value != this._enabled) {\r\n this.onEnabledObservable.notifyObservers(value);\r\n }\r\n this._enabled = value;\r\n }\r\n\r\n public get enabled() {\r\n return this._enabled;\r\n }\r\n private _enabled = true;\r\n\r\n /**\r\n * If pointer events should start and release the drag (Default: true)\r\n */\r\n public startAndReleaseDragOnPointerEvents = true;\r\n /**\r\n * If camera controls should be detached during the drag\r\n */\r\n public detachCameraControls = true;\r\n\r\n /**\r\n * If set, the drag plane/axis will be rotated based on the attached mesh's world rotation (Default: true)\r\n */\r\n public useObjectOrientationForDragging = true;\r\n\r\n private _options: { dragAxis?: Vector3; dragPlaneNormal?: Vector3 };\r\n\r\n /**\r\n * Gets the options used by the behavior\r\n */\r\n public get options(): { dragAxis?: Vector3; dragPlaneNormal?: Vector3 } {\r\n return this._options;\r\n }\r\n\r\n /**\r\n * Sets the options used by the behavior\r\n */\r\n public set options(options: { dragAxis?: Vector3; dragPlaneNormal?: Vector3 }) {\r\n this._options = options;\r\n }\r\n\r\n /**\r\n * Creates a pointer drag behavior that can be attached to a mesh\r\n * @param options The drag axis or normal of the plane that will be dragged across. If no options are specified the drag plane will always face the ray's origin (eg. camera)\r\n * @param options.dragAxis\r\n * @param options.dragPlaneNormal\r\n */\r\n constructor(options?: { dragAxis?: Vector3; dragPlaneNormal?: Vector3 }) {\r\n this._options = options ? options : {};\r\n\r\n let optionCount = 0;\r\n if (this._options.dragAxis) {\r\n optionCount++;\r\n }\r\n if (this._options.dragPlaneNormal) {\r\n optionCount++;\r\n }\r\n if (optionCount > 1) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Multiple drag modes specified in dragBehavior options. Only one expected\";\r\n }\r\n }\r\n\r\n /**\r\n * Predicate to determine if it is valid to move the object to a new position when it is moved.\r\n * In the case of rotation gizmo, target contains the angle.\r\n * @param target destination position or desired angle delta\r\n * @returns boolean for whether or not it is valid to move\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public validateDrag = (target: Vector3) => {\r\n return true;\r\n };\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"PointerDrag\";\r\n }\r\n\r\n /**\r\n * Initializes the behavior\r\n */\r\n public init() {}\r\n\r\n private _tmpVector = new Vector3(0, 0, 0);\r\n private _alternatePickedPoint = new Vector3(0, 0, 0);\r\n private _worldDragAxis = new Vector3(0, 0, 0);\r\n private _targetPosition = new Vector3(0, 0, 0);\r\n private _attachedToElement: boolean = false;\r\n /**\r\n * Attaches the drag behavior the passed in mesh\r\n * @param ownerNode The mesh that will be dragged around once attached\r\n * @param predicate Predicate to use for pick filtering\r\n */\r\n public attach(ownerNode: AbstractMesh, predicate?: (m: AbstractMesh) => boolean): void {\r\n this._scene = ownerNode.getScene();\r\n ownerNode.isNearGrabbable = true;\r\n this.attachedNode = ownerNode;\r\n\r\n // Initialize drag plane to not interfere with existing scene\r\n if (!PointerDragBehavior._PlaneScene) {\r\n if (this._debugMode) {\r\n PointerDragBehavior._PlaneScene = this._scene;\r\n } else {\r\n PointerDragBehavior._PlaneScene = new Scene(this._scene.getEngine(), { virtual: true });\r\n PointerDragBehavior._PlaneScene.detachControl();\r\n this._scene.onDisposeObservable.addOnce(() => {\r\n PointerDragBehavior._PlaneScene.dispose();\r\n (PointerDragBehavior._PlaneScene) = null;\r\n });\r\n }\r\n }\r\n this._dragPlane = CreatePlane(\r\n \"pointerDragPlane\",\r\n { size: this._debugMode ? 1 : 10000, updatable: false, sideOrientation: Mesh.DOUBLESIDE },\r\n PointerDragBehavior._PlaneScene\r\n );\r\n\r\n // State of the drag\r\n this.lastDragPosition = new Vector3(0, 0, 0);\r\n\r\n const pickPredicate = predicate\r\n ? predicate\r\n : (m: AbstractMesh) => {\r\n return this.attachedNode == m || m.isDescendantOf(this.attachedNode);\r\n };\r\n\r\n this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => {\r\n if (!this.enabled) {\r\n // If behavior is disabled before releaseDrag is ever called, call it now.\r\n if (this._attachedToElement) {\r\n this.releaseDrag();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (pointerInfo.type == PointerEventTypes.POINTERDOWN) {\r\n if (\r\n this.startAndReleaseDragOnPointerEvents &&\r\n !this.dragging &&\r\n pointerInfo.pickInfo &&\r\n pointerInfo.pickInfo.hit &&\r\n pointerInfo.pickInfo.pickedMesh &&\r\n pointerInfo.pickInfo.pickedPoint &&\r\n pointerInfo.pickInfo.ray &&\r\n pickPredicate(pointerInfo.pickInfo.pickedMesh)\r\n ) {\r\n if (this._activeDragButton === -1 && this.dragButtons.indexOf(pointerInfo.event.button) !== -1) {\r\n this._activeDragButton = pointerInfo.event.button;\r\n this._activePointerInfo = pointerInfo;\r\n this._startDrag((pointerInfo.event).pointerId, pointerInfo.pickInfo.ray, pointerInfo.pickInfo.pickedPoint);\r\n }\r\n }\r\n } else if (pointerInfo.type == PointerEventTypes.POINTERUP) {\r\n if (\r\n this.startAndReleaseDragOnPointerEvents &&\r\n this.currentDraggingPointerId == (pointerInfo.event).pointerId &&\r\n (this._activeDragButton === pointerInfo.event.button || this._activeDragButton === -1)\r\n ) {\r\n this.releaseDrag();\r\n }\r\n } else if (pointerInfo.type == PointerEventTypes.POINTERMOVE) {\r\n const pointerId = (pointerInfo.event).pointerId;\r\n\r\n // If drag was started with anyMouseID specified, set pointerID to the next mouse that moved\r\n if (this.currentDraggingPointerId === PointerDragBehavior._AnyMouseId && pointerId !== PointerDragBehavior._AnyMouseId) {\r\n const evt = pointerInfo.event;\r\n const isMouseEvent = evt.pointerType === \"mouse\" || (!this._scene.getEngine().hostInformation.isMobile && evt instanceof MouseEvent);\r\n if (isMouseEvent) {\r\n if (this._lastPointerRay[this.currentDraggingPointerId]) {\r\n this._lastPointerRay[pointerId] = this._lastPointerRay[this.currentDraggingPointerId];\r\n delete this._lastPointerRay[this.currentDraggingPointerId];\r\n }\r\n this.currentDraggingPointerId = pointerId;\r\n }\r\n }\r\n\r\n // Keep track of last pointer ray, this is used simulating the start of a drag in startDrag()\r\n if (!this._lastPointerRay[pointerId]) {\r\n this._lastPointerRay[pointerId] = new Ray(new Vector3(), new Vector3());\r\n }\r\n if (pointerInfo.pickInfo && pointerInfo.pickInfo.ray) {\r\n this._lastPointerRay[pointerId].origin.copyFrom(pointerInfo.pickInfo.ray.origin);\r\n this._lastPointerRay[pointerId].direction.copyFrom(pointerInfo.pickInfo.ray.direction);\r\n\r\n if (this.currentDraggingPointerId == pointerId && this.dragging) {\r\n this._moveDrag(pointerInfo.pickInfo.ray);\r\n }\r\n }\r\n }\r\n });\r\n\r\n this._beforeRenderObserver = this._scene.onBeforeRenderObservable.add(() => {\r\n if (this._moving && this.moveAttached) {\r\n let needMatrixUpdate = false;\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedNode);\r\n // Slowly move mesh to avoid jitter\r\n this._targetPosition.subtractToRef(this.attachedNode.absolutePosition, this._tmpVector);\r\n this._tmpVector.scaleInPlace(this.dragDeltaRatio);\r\n this.attachedNode.getAbsolutePosition().addToRef(this._tmpVector, this._tmpVector);\r\n if (this.validateDrag(this._tmpVector)) {\r\n this.attachedNode.setAbsolutePosition(this._tmpVector);\r\n needMatrixUpdate = true;\r\n }\r\n PivotTools._RestorePivotPoint(this.attachedNode);\r\n if (needMatrixUpdate) {\r\n this.attachedNode.computeWorldMatrix();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Force release the drag action by code.\r\n */\r\n public releaseDrag() {\r\n if (this.dragging) {\r\n this.dragging = false;\r\n this.onDragEndObservable.notifyObservers({ dragPlanePoint: this.lastDragPosition, pointerId: this.currentDraggingPointerId, pointerInfo: this._activePointerInfo });\r\n }\r\n\r\n this.currentDraggingPointerId = -1;\r\n this._activeDragButton = -1;\r\n this._activePointerInfo = null;\r\n this._moving = false;\r\n\r\n // Reattach camera controls\r\n if (this.detachCameraControls && this._attachedToElement && this._scene.activeCamera && !this._scene.activeCamera.leftCamera) {\r\n if (this._scene.activeCamera.getClassName() === \"ArcRotateCamera\") {\r\n const arcRotateCamera = this._scene.activeCamera as ArcRotateCamera;\r\n arcRotateCamera.attachControl(\r\n arcRotateCamera.inputs ? arcRotateCamera.inputs.noPreventDefault : true,\r\n arcRotateCamera._useCtrlForPanning,\r\n arcRotateCamera._panningMouseButton\r\n );\r\n } else {\r\n this._scene.activeCamera.attachControl(this._scene.activeCamera.inputs ? this._scene.activeCamera.inputs.noPreventDefault : true);\r\n }\r\n this._attachedToElement = false;\r\n }\r\n }\r\n\r\n private _startDragRay = new Ray(new Vector3(), new Vector3());\r\n private _lastPointerRay: { [key: number]: Ray } = {};\r\n /**\r\n * Simulates the start of a pointer drag event on the behavior\r\n * @param pointerId pointerID of the pointer that should be simulated (Default: Any mouse pointer ID)\r\n * @param fromRay initial ray of the pointer to be simulated (Default: Ray from camera to attached mesh)\r\n * @param startPickedPoint picked point of the pointer to be simulated (Default: attached mesh position)\r\n */\r\n public startDrag(pointerId: number = PointerDragBehavior._AnyMouseId, fromRay?: Ray, startPickedPoint?: Vector3) {\r\n this._startDrag(pointerId, fromRay, startPickedPoint);\r\n\r\n let lastRay = this._lastPointerRay[pointerId];\r\n if (pointerId === PointerDragBehavior._AnyMouseId) {\r\n lastRay = this._lastPointerRay[Object.keys(this._lastPointerRay)[0]];\r\n }\r\n\r\n if (lastRay) {\r\n // if there was a last pointer ray drag the object there\r\n this._moveDrag(lastRay);\r\n }\r\n }\r\n\r\n protected _startDrag(pointerId: number, fromRay?: Ray, startPickedPoint?: Vector3) {\r\n if (!this._scene.activeCamera || this.dragging || !this.attachedNode) {\r\n return;\r\n }\r\n\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedNode);\r\n // Create start ray from the camera to the object\r\n if (fromRay) {\r\n this._startDragRay.direction.copyFrom(fromRay.direction);\r\n this._startDragRay.origin.copyFrom(fromRay.origin);\r\n } else {\r\n this._startDragRay.origin.copyFrom(this._scene.activeCamera.position);\r\n this.attachedNode.getWorldMatrix().getTranslationToRef(this._tmpVector);\r\n this._tmpVector.subtractToRef(this._scene.activeCamera.position, this._startDragRay.direction);\r\n }\r\n\r\n this._updateDragPlanePosition(this._startDragRay, startPickedPoint ? startPickedPoint : this._tmpVector);\r\n\r\n const pickedPoint = this._pickWithRayOnDragPlane(this._startDragRay);\r\n if (pickedPoint) {\r\n this.dragging = true;\r\n this.currentDraggingPointerId = pointerId;\r\n this.lastDragPosition.copyFrom(pickedPoint);\r\n this.onDragStartObservable.notifyObservers({ dragPlanePoint: pickedPoint, pointerId: this.currentDraggingPointerId, pointerInfo: this._activePointerInfo });\r\n this._targetPosition.copyFrom(this.attachedNode.getAbsolutePosition());\r\n\r\n // Detatch camera controls\r\n if (this.detachCameraControls && this._scene.activeCamera && this._scene.activeCamera.inputs && !this._scene.activeCamera.leftCamera) {\r\n if (this._scene.activeCamera.inputs.attachedToElement) {\r\n this._scene.activeCamera.detachControl();\r\n this._attachedToElement = true;\r\n } else {\r\n this._attachedToElement = false;\r\n }\r\n }\r\n } else {\r\n this.releaseDrag();\r\n }\r\n PivotTools._RestorePivotPoint(this.attachedNode);\r\n }\r\n\r\n private _dragDelta = new Vector3();\r\n protected _moveDrag(ray: Ray) {\r\n this._moving = true;\r\n const pickedPoint = this._pickWithRayOnDragPlane(ray);\r\n\r\n if (pickedPoint) {\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedNode);\r\n\r\n if (this.updateDragPlane) {\r\n this._updateDragPlanePosition(ray, pickedPoint);\r\n }\r\n let dragLength = 0;\r\n // depending on the drag mode option drag accordingly\r\n if (this._options.dragAxis) {\r\n // Convert local drag axis to world if useObjectOrientationForDragging\r\n this.useObjectOrientationForDragging\r\n ? Vector3.TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._worldDragAxis)\r\n : this._worldDragAxis.copyFrom(this._options.dragAxis);\r\n\r\n // Project delta drag from the drag plane onto the drag axis\r\n pickedPoint.subtractToRef(this.lastDragPosition, this._tmpVector);\r\n dragLength = Vector3.Dot(this._tmpVector, this._worldDragAxis);\r\n this._worldDragAxis.scaleToRef(dragLength, this._dragDelta);\r\n } else {\r\n dragLength = this._dragDelta.length();\r\n pickedPoint.subtractToRef(this.lastDragPosition, this._dragDelta);\r\n }\r\n this._targetPosition.addInPlace(this._dragDelta);\r\n this.onDragObservable.notifyObservers({\r\n dragDistance: dragLength,\r\n delta: this._dragDelta,\r\n dragPlanePoint: pickedPoint,\r\n dragPlaneNormal: this._dragPlane.forward,\r\n pointerId: this.currentDraggingPointerId,\r\n pointerInfo: this._activePointerInfo,\r\n });\r\n this.lastDragPosition.copyFrom(pickedPoint);\r\n\r\n PivotTools._RestorePivotPoint(this.attachedNode);\r\n }\r\n }\r\n\r\n private _pickWithRayOnDragPlane(ray: Nullable) {\r\n if (!ray) {\r\n return null;\r\n }\r\n\r\n // Calculate angle between plane normal and ray\r\n let angle = Math.acos(Vector3.Dot(this._dragPlane.forward, ray.direction));\r\n // Correct if ray is casted from oposite side\r\n if (angle > Math.PI / 2) {\r\n angle = Math.PI - angle;\r\n }\r\n\r\n // If the angle is too perpendicular to the plane pick another point on the plane where it is looking\r\n if (this.maxDragAngle > 0 && angle > this.maxDragAngle) {\r\n if (this._useAlternatePickedPointAboveMaxDragAngle) {\r\n // Invert ray direction along the towards object axis\r\n this._tmpVector.copyFrom(ray.direction);\r\n this.attachedNode.absolutePosition.subtractToRef(ray.origin, this._alternatePickedPoint);\r\n this._alternatePickedPoint.normalize();\r\n this._alternatePickedPoint.scaleInPlace(this._useAlternatePickedPointAboveMaxDragAngleDragSpeed * Vector3.Dot(this._alternatePickedPoint, this._tmpVector));\r\n this._tmpVector.addInPlace(this._alternatePickedPoint);\r\n\r\n // Project resulting vector onto the drag plane and add it to the attached nodes absolute position to get a picked point\r\n const dot = Vector3.Dot(this._dragPlane.forward, this._tmpVector);\r\n this._dragPlane.forward.scaleToRef(-dot, this._alternatePickedPoint);\r\n this._alternatePickedPoint.addInPlace(this._tmpVector);\r\n this._alternatePickedPoint.addInPlace(this.attachedNode.absolutePosition);\r\n return this._alternatePickedPoint;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n // use an infinite plane instead of ray picking a mesh that must be updated every frame\r\n const planeNormal = this._dragPlane.forward;\r\n const planePosition = this._dragPlane.position;\r\n const dotProduct = ray.direction.dot(planeNormal);\r\n if (Math.abs(dotProduct) < Epsilon) {\r\n // Ray and plane are parallel, no intersection\r\n return null;\r\n }\r\n\r\n planePosition.subtractToRef(ray.origin, TmpVectors.Vector3[0]);\r\n const t = TmpVectors.Vector3[0].dot(planeNormal) / dotProduct;\r\n // Ensure the intersection point is in front of the ray (t must be positive)\r\n if (t < 0) {\r\n // Intersection point is behind the ray\r\n return null;\r\n }\r\n\r\n // Calculate the intersection point using the parameter t\r\n ray.direction.scaleToRef(t, TmpVectors.Vector3[0]);\r\n const intersectionPoint = ray.origin.add(TmpVectors.Vector3[0]);\r\n return intersectionPoint;\r\n }\r\n\r\n // Variables to avoid instantiation in the below method\r\n private _pointA = new Vector3(0, 0, 0);\r\n private _pointC = new Vector3(0, 0, 0);\r\n private _localAxis = new Vector3(0, 0, 0);\r\n private _lookAt = new Vector3(0, 0, 0);\r\n // Position the drag plane based on the attached mesh position, for single axis rotate the plane along the axis to face the camera\r\n private _updateDragPlanePosition(ray: Ray, dragPlanePosition: Vector3) {\r\n this._pointA.copyFrom(dragPlanePosition);\r\n if (this._options.dragAxis) {\r\n this.useObjectOrientationForDragging\r\n ? Vector3.TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis)\r\n : this._localAxis.copyFrom(this._options.dragAxis);\r\n\r\n // Calculate plane normal that is the cross product of local axis and (eye-dragPlanePosition)\r\n ray.origin.subtractToRef(this._pointA, this._pointC);\r\n this._pointC.normalize();\r\n if (Math.abs(Vector3.Dot(this._localAxis, this._pointC)) > 0.999) {\r\n // the drag axis is colinear with the (eye to position) ray. The cross product will give jittered values.\r\n // A new axis vector need to be computed\r\n if (Math.abs(Vector3.Dot(Vector3.UpReadOnly, this._pointC)) > 0.999) {\r\n this._lookAt.copyFrom(Vector3.Right());\r\n } else {\r\n this._lookAt.copyFrom(Vector3.UpReadOnly);\r\n }\r\n } else {\r\n Vector3.CrossToRef(this._localAxis, this._pointC, this._lookAt);\r\n // Get perpendicular line from previous result and drag axis to adjust lineB to be perpendicular to camera\r\n Vector3.CrossToRef(this._localAxis, this._lookAt, this._lookAt);\r\n this._lookAt.normalize();\r\n }\r\n\r\n this._dragPlane.position.copyFrom(this._pointA);\r\n this._pointA.addToRef(this._lookAt, this._lookAt);\r\n this._dragPlane.lookAt(this._lookAt);\r\n } else if (this._options.dragPlaneNormal) {\r\n this.useObjectOrientationForDragging\r\n ? Vector3.TransformCoordinatesToRef(this._options.dragPlaneNormal, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis)\r\n : this._localAxis.copyFrom(this._options.dragPlaneNormal);\r\n this._dragPlane.position.copyFrom(this._pointA);\r\n this._pointA.addToRef(this._localAxis, this._lookAt);\r\n this._dragPlane.lookAt(this._lookAt);\r\n } else {\r\n this._dragPlane.position.copyFrom(this._pointA);\r\n this._dragPlane.lookAt(ray.origin);\r\n }\r\n // Update the position of the drag plane so it doesn't get out of sync with the node (eg. when moving back and forth quickly)\r\n this._dragPlane.position.copyFrom(this.attachedNode.getAbsolutePosition());\r\n\r\n this._dragPlane.computeWorldMatrix(true);\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n this._lastPointerRay = {};\r\n if (this.attachedNode) {\r\n this.attachedNode.isNearGrabbable = false;\r\n }\r\n if (this._pointerObserver) {\r\n this._scene.onPointerObservable.remove(this._pointerObserver);\r\n }\r\n if (this._beforeRenderObserver) {\r\n this._scene.onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n if (this._dragPlane) {\r\n this._dragPlane.dispose();\r\n }\r\n this.releaseDrag();\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Behavior } from \"../../Behaviors/behavior\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { PointerInfo } from \"../../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../../Events/pointerEvents\";\r\nimport { Vector3, Quaternion, TmpVectors } from \"../../Maths/math.vector\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport type { PickingInfo } from \"../../Collisions/pickingInfo\";\r\nimport { Camera } from \"../../Cameras/camera\";\r\nimport type { Ray } from \"../../Culling/ray\";\r\nimport type { IPointerEvent } from \"../../Events/deviceInputEvents\";\r\nimport type { ArcRotateCamera } from \"../../Cameras/arcRotateCamera\";\r\n\r\n/**\r\n * Data store to track virtual pointers movement\r\n */\r\ntype VirtualMeshInfo = {\r\n dragging: boolean;\r\n moving: boolean;\r\n dragMesh: AbstractMesh;\r\n originMesh: AbstractMesh;\r\n pivotMesh: AbstractMesh;\r\n startingPivotPosition: Vector3;\r\n startingPivotOrientation: Quaternion;\r\n startingPosition: Vector3;\r\n startingOrientation: Quaternion;\r\n lastOriginPosition: Vector3;\r\n lastDragPosition: Vector3;\r\n};\r\n\r\n/**\r\n * Base behavior for six degrees of freedom interactions in XR experiences.\r\n * Creates virtual meshes that are dragged around\r\n * And observables for position/rotation changes\r\n */\r\nexport class BaseSixDofDragBehavior implements Behavior {\r\n protected static _virtualScene: Scene;\r\n private _pointerObserver: Nullable>;\r\n private _attachedToElement: boolean = false;\r\n protected _virtualMeshesInfo: {\r\n [id: number]: VirtualMeshInfo;\r\n } = {};\r\n\r\n private _tmpVector: Vector3 = new Vector3();\r\n private _tmpQuaternion: Quaternion = new Quaternion();\r\n\r\n protected _dragType = {\r\n NONE: 0,\r\n DRAG: 1,\r\n DRAG_WITH_CONTROLLER: 2,\r\n NEAR_DRAG: 3,\r\n };\r\n\r\n protected _scene: Scene;\r\n protected _moving = false;\r\n protected _ownerNode: TransformNode;\r\n protected _dragging = this._dragType.NONE;\r\n\r\n /**\r\n * The list of child meshes that can receive drag events\r\n * If `null`, all child meshes will receive drag event\r\n */\r\n public draggableMeshes: Nullable = null;\r\n\r\n /**\r\n * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)\r\n */\r\n public zDragFactor = 3;\r\n /**\r\n * The id of the pointer that is currently interacting with the behavior (-1 when no pointer is active)\r\n */\r\n public get currentDraggingPointerId() {\r\n if (this.currentDraggingPointerIds[0] !== undefined) {\r\n return this.currentDraggingPointerIds[0];\r\n }\r\n return -1;\r\n }\r\n\r\n public set currentDraggingPointerId(value: number) {\r\n this.currentDraggingPointerIds[0] = value;\r\n }\r\n\r\n /**\r\n * In case of multipointer interaction, all pointer ids currently active are stored here\r\n */\r\n public currentDraggingPointerIds: number[] = [];\r\n\r\n /**\r\n * Get or set the currentDraggingPointerId\r\n * @deprecated Please use currentDraggingPointerId instead\r\n */\r\n public get currentDraggingPointerID(): number {\r\n return this.currentDraggingPointerId;\r\n }\r\n public set currentDraggingPointerID(currentDraggingPointerID: number) {\r\n this.currentDraggingPointerId = currentDraggingPointerID;\r\n }\r\n /**\r\n /**\r\n * If camera controls should be detached during the drag\r\n */\r\n public detachCameraControls = true;\r\n\r\n /**\r\n * Fires each time a drag starts\r\n */\r\n public onDragStartObservable = new Observable<{ position: Vector3 }>();\r\n /**\r\n * Fires each time a drag happens\r\n */\r\n public onDragObservable = new Observable<{ delta: Vector3; position: Vector3; pickInfo: PickingInfo }>();\r\n /**\r\n * Fires each time a drag ends (eg. mouse release after drag)\r\n */\r\n public onDragEndObservable = new Observable<{}>();\r\n\r\n /**\r\n * Should the behavior allow simultaneous pointers to interact with the owner node.\r\n */\r\n public allowMultiPointer: boolean = true;\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"BaseSixDofDrag\";\r\n }\r\n\r\n /**\r\n * Returns true if the attached mesh is currently moving with this behavior\r\n */\r\n public get isMoving(): boolean {\r\n return this._moving;\r\n }\r\n\r\n /**\r\n * Initializes the behavior\r\n */\r\n public init() {}\r\n\r\n /**\r\n * In the case of multiple active cameras, the cameraToUseForPointers should be used if set instead of active camera\r\n */\r\n private get _pointerCamera() {\r\n if (this._scene.cameraToUseForPointers) {\r\n return this._scene.cameraToUseForPointers;\r\n } else {\r\n return this._scene.activeCamera;\r\n }\r\n }\r\n\r\n private _createVirtualMeshInfo() {\r\n // Setup virtual meshes to be used for dragging without dirtying the existing scene\r\n\r\n const dragMesh = new AbstractMesh(\"\", BaseSixDofDragBehavior._virtualScene);\r\n dragMesh.rotationQuaternion = new Quaternion();\r\n const originMesh = new AbstractMesh(\"\", BaseSixDofDragBehavior._virtualScene);\r\n originMesh.rotationQuaternion = new Quaternion();\r\n const pivotMesh = new AbstractMesh(\"\", BaseSixDofDragBehavior._virtualScene);\r\n pivotMesh.rotationQuaternion = new Quaternion();\r\n\r\n return {\r\n dragging: false,\r\n moving: false,\r\n dragMesh,\r\n originMesh,\r\n pivotMesh,\r\n startingPivotPosition: new Vector3(),\r\n startingPivotOrientation: new Quaternion(),\r\n startingPosition: new Vector3(),\r\n startingOrientation: new Quaternion(),\r\n lastOriginPosition: new Vector3(),\r\n lastDragPosition: new Vector3(),\r\n };\r\n }\r\n\r\n protected _resetVirtualMeshesPosition() {\r\n for (let i = 0; i < this.currentDraggingPointerIds.length; i++) {\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.position.copyFrom(this._ownerNode.getAbsolutePivotPoint());\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.rotationQuaternion!.copyFrom(this._ownerNode.rotationQuaternion!);\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingPivotPosition.copyFrom(\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.position\r\n );\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingPivotOrientation.copyFrom(\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.rotationQuaternion!\r\n );\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingPosition.copyFrom(this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].dragMesh.position);\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingOrientation.copyFrom(\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].dragMesh.rotationQuaternion!\r\n );\r\n }\r\n }\r\n\r\n private _pointerUpdate2D(ray: Ray, pointerId: number, zDragFactor: number) {\r\n if (this._pointerCamera && this._pointerCamera.cameraRigMode == Camera.RIG_MODE_NONE && !this._pointerCamera._isLeftCamera && !this._pointerCamera._isRightCamera) {\r\n ray.origin.copyFrom(this._pointerCamera!.globalPosition);\r\n zDragFactor = 0;\r\n }\r\n\r\n const virtualMeshesInfo = this._virtualMeshesInfo[pointerId];\r\n\r\n // Calculate controller drag distance in controller space\r\n const originDragDifference = TmpVectors.Vector3[0];\r\n ray.origin.subtractToRef(virtualMeshesInfo.lastOriginPosition, originDragDifference);\r\n virtualMeshesInfo.lastOriginPosition.copyFrom(ray.origin);\r\n const localOriginDragDifference = -Vector3.Dot(originDragDifference, ray.direction);\r\n\r\n virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.dragMesh);\r\n virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.pivotMesh);\r\n\r\n this._applyZOffset(virtualMeshesInfo.dragMesh, localOriginDragDifference, zDragFactor);\r\n this._applyZOffset(virtualMeshesInfo.pivotMesh, localOriginDragDifference, zDragFactor);\r\n\r\n // Update the controller position\r\n virtualMeshesInfo.originMesh.position.copyFrom(ray.origin);\r\n const lookAt = TmpVectors.Vector3[0];\r\n ray.origin.addToRef(ray.direction, lookAt);\r\n virtualMeshesInfo.originMesh.lookAt(lookAt);\r\n\r\n virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.dragMesh);\r\n virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.pivotMesh);\r\n }\r\n\r\n private _pointerUpdateXR(controllerAimTransform: TransformNode, controllerGripTransform: Nullable, pointerId: number, zDragFactor: number) {\r\n const virtualMeshesInfo = this._virtualMeshesInfo[pointerId];\r\n virtualMeshesInfo.originMesh.position.copyFrom(controllerAimTransform.position);\r\n if (this._dragging === this._dragType.NEAR_DRAG && controllerGripTransform) {\r\n virtualMeshesInfo.originMesh.rotationQuaternion!.copyFrom(controllerGripTransform.rotationQuaternion!);\r\n } else {\r\n virtualMeshesInfo.originMesh.rotationQuaternion!.copyFrom(controllerAimTransform.rotationQuaternion!);\r\n }\r\n\r\n virtualMeshesInfo.pivotMesh.computeWorldMatrix(true);\r\n virtualMeshesInfo.dragMesh.computeWorldMatrix(true);\r\n\r\n // Z scaling logic\r\n if (zDragFactor !== 0) {\r\n // Camera.getForwardRay modifies TmpVectors.Vector[0-3], so cache it in advance\r\n const cameraForwardVec = TmpVectors.Vector3[0];\r\n const originDragDirection = TmpVectors.Vector3[1];\r\n cameraForwardVec.copyFrom(this._pointerCamera!.getForwardRay().direction);\r\n virtualMeshesInfo.originMesh.position.subtractToRef(virtualMeshesInfo.lastOriginPosition, originDragDirection);\r\n virtualMeshesInfo.lastOriginPosition.copyFrom(virtualMeshesInfo.originMesh.position);\r\n const controllerDragDistance = originDragDirection.length();\r\n originDragDirection.normalize();\r\n\r\n const cameraToDrag = TmpVectors.Vector3[2];\r\n const controllerToDrag = TmpVectors.Vector3[3];\r\n virtualMeshesInfo.dragMesh.absolutePosition.subtractToRef(this._pointerCamera!.globalPosition, cameraToDrag);\r\n virtualMeshesInfo.dragMesh.absolutePosition.subtractToRef(virtualMeshesInfo.originMesh.position, controllerToDrag);\r\n const controllerToDragDistance = controllerToDrag.length();\r\n cameraToDrag.normalize();\r\n controllerToDrag.normalize();\r\n\r\n const controllerDragScaling = Math.abs(Vector3.Dot(originDragDirection, controllerToDrag)) * Vector3.Dot(originDragDirection, cameraForwardVec);\r\n let zOffsetScaling = controllerDragScaling * zDragFactor * controllerDragDistance * controllerToDragDistance;\r\n\r\n // Prevent pulling the mesh through the controller\r\n const minDistanceFromControllerToDragMesh = 0.01;\r\n if (zOffsetScaling < 0 && minDistanceFromControllerToDragMesh - controllerToDragDistance > zOffsetScaling) {\r\n zOffsetScaling = Math.min(minDistanceFromControllerToDragMesh - controllerToDragDistance, 0);\r\n }\r\n controllerToDrag.scaleInPlace(zOffsetScaling);\r\n\r\n controllerToDrag.addToRef(virtualMeshesInfo.pivotMesh.absolutePosition, this._tmpVector);\r\n virtualMeshesInfo.pivotMesh.setAbsolutePosition(this._tmpVector);\r\n controllerToDrag.addToRef(virtualMeshesInfo.dragMesh.absolutePosition, this._tmpVector);\r\n virtualMeshesInfo.dragMesh.setAbsolutePosition(this._tmpVector);\r\n }\r\n }\r\n\r\n /**\r\n * Attaches the scale behavior the passed in mesh\r\n * @param ownerNode The mesh that will be scaled around once attached\r\n */\r\n public attach(ownerNode: TransformNode): void {\r\n this._ownerNode = ownerNode;\r\n this._scene = this._ownerNode.getScene();\r\n if (!BaseSixDofDragBehavior._virtualScene) {\r\n BaseSixDofDragBehavior._virtualScene = new Scene(this._scene.getEngine(), { virtual: true });\r\n BaseSixDofDragBehavior._virtualScene.detachControl();\r\n }\r\n\r\n const pickPredicate = (m: AbstractMesh) => {\r\n return this._ownerNode === m || (m.isDescendantOf(this._ownerNode) && (!this.draggableMeshes || this.draggableMeshes.indexOf(m) !== -1));\r\n };\r\n\r\n this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => {\r\n const pointerId = (pointerInfo.event).pointerId;\r\n if (!this._virtualMeshesInfo[pointerId]) {\r\n this._virtualMeshesInfo[pointerId] = this._createVirtualMeshInfo();\r\n }\r\n const virtualMeshesInfo = this._virtualMeshesInfo[pointerId];\r\n const isXRPointer = (pointerInfo.event).pointerType === \"xr-near\" || (pointerInfo.event).pointerType === \"xr\";\r\n\r\n if (pointerInfo.type == PointerEventTypes.POINTERDOWN) {\r\n if (\r\n !virtualMeshesInfo.dragging &&\r\n pointerInfo.pickInfo &&\r\n pointerInfo.pickInfo.hit &&\r\n pointerInfo.pickInfo.pickedMesh &&\r\n pointerInfo.pickInfo.pickedPoint &&\r\n pointerInfo.pickInfo.ray &&\r\n (!isXRPointer || pointerInfo.pickInfo.aimTransform) &&\r\n pickPredicate(pointerInfo.pickInfo.pickedMesh)\r\n ) {\r\n if ((!this.allowMultiPointer || isXRPointer) && this.currentDraggingPointerIds.length > 0) {\r\n return;\r\n }\r\n\r\n if (\r\n this._pointerCamera &&\r\n this._pointerCamera.cameraRigMode === Camera.RIG_MODE_NONE &&\r\n !this._pointerCamera._isLeftCamera &&\r\n !this._pointerCamera._isRightCamera\r\n ) {\r\n pointerInfo.pickInfo.ray.origin.copyFrom(this._pointerCamera!.globalPosition);\r\n }\r\n\r\n this._ownerNode.computeWorldMatrix(true);\r\n const virtualMeshesInfo = this._virtualMeshesInfo[pointerId];\r\n\r\n if (isXRPointer) {\r\n this._dragging = pointerInfo.pickInfo.originMesh ? this._dragType.NEAR_DRAG : this._dragType.DRAG_WITH_CONTROLLER;\r\n virtualMeshesInfo.originMesh.position.copyFrom(pointerInfo.pickInfo.aimTransform!.position);\r\n if (this._dragging === this._dragType.NEAR_DRAG && pointerInfo.pickInfo.gripTransform) {\r\n virtualMeshesInfo.originMesh.rotationQuaternion!.copyFrom(pointerInfo.pickInfo.gripTransform.rotationQuaternion!);\r\n } else {\r\n virtualMeshesInfo.originMesh.rotationQuaternion!.copyFrom(pointerInfo.pickInfo.aimTransform!.rotationQuaternion!);\r\n }\r\n } else {\r\n this._dragging = this._dragType.DRAG;\r\n virtualMeshesInfo.originMesh.position.copyFrom(pointerInfo.pickInfo.ray.origin);\r\n }\r\n\r\n virtualMeshesInfo.lastOriginPosition.copyFrom(virtualMeshesInfo.originMesh.position);\r\n\r\n virtualMeshesInfo.dragMesh.position.copyFrom(pointerInfo.pickInfo.pickedPoint);\r\n virtualMeshesInfo.lastDragPosition.copyFrom(pointerInfo.pickInfo.pickedPoint);\r\n\r\n virtualMeshesInfo.pivotMesh.position.copyFrom(this._ownerNode.getAbsolutePivotPoint());\r\n virtualMeshesInfo.pivotMesh.rotationQuaternion!.copyFrom(this._ownerNode.absoluteRotationQuaternion);\r\n\r\n virtualMeshesInfo.startingPosition.copyFrom(virtualMeshesInfo.dragMesh.position);\r\n virtualMeshesInfo.startingPivotPosition.copyFrom(virtualMeshesInfo.pivotMesh.position);\r\n virtualMeshesInfo.startingOrientation.copyFrom(virtualMeshesInfo.dragMesh.rotationQuaternion!);\r\n virtualMeshesInfo.startingPivotOrientation.copyFrom(virtualMeshesInfo.pivotMesh.rotationQuaternion!);\r\n\r\n if (isXRPointer) {\r\n virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.dragMesh);\r\n virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.pivotMesh);\r\n } else {\r\n virtualMeshesInfo.originMesh.lookAt(virtualMeshesInfo.dragMesh.position);\r\n }\r\n\r\n // Update state\r\n virtualMeshesInfo.dragging = true;\r\n\r\n if (this.currentDraggingPointerIds.indexOf(pointerId) === -1) {\r\n this.currentDraggingPointerIds.push(pointerId);\r\n }\r\n\r\n // Detach camera controls\r\n if (this.detachCameraControls && this._pointerCamera && !this._pointerCamera.leftCamera) {\r\n if (this._pointerCamera.inputs && this._pointerCamera.inputs.attachedToElement) {\r\n this._pointerCamera.detachControl();\r\n this._attachedToElement = true;\r\n } else if (!this.allowMultiPointer || this.currentDraggingPointerIds.length === 0) {\r\n this._attachedToElement = false;\r\n }\r\n }\r\n\r\n this._targetDragStart(virtualMeshesInfo.pivotMesh.position, virtualMeshesInfo.pivotMesh.rotationQuaternion!, pointerId);\r\n this.onDragStartObservable.notifyObservers({ position: virtualMeshesInfo.pivotMesh.position });\r\n }\r\n } else if (pointerInfo.type == PointerEventTypes.POINTERUP || pointerInfo.type == PointerEventTypes.POINTERDOUBLETAP) {\r\n const registeredPointerIndex = this.currentDraggingPointerIds.indexOf(pointerId);\r\n\r\n // Update state\r\n virtualMeshesInfo.dragging = false;\r\n\r\n if (registeredPointerIndex !== -1) {\r\n this.currentDraggingPointerIds.splice(registeredPointerIndex, 1);\r\n if (this.currentDraggingPointerIds.length === 0) {\r\n this._moving = false;\r\n this._dragging = this._dragType.NONE;\r\n\r\n // Reattach camera controls\r\n if (this.detachCameraControls && this._attachedToElement && this._pointerCamera && !this._pointerCamera.leftCamera) {\r\n this._reattachCameraControls();\r\n this._attachedToElement = false;\r\n }\r\n }\r\n\r\n virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.dragMesh);\r\n virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.pivotMesh);\r\n this._targetDragEnd(pointerId);\r\n this.onDragEndObservable.notifyObservers({});\r\n }\r\n } else if (pointerInfo.type == PointerEventTypes.POINTERMOVE) {\r\n const registeredPointerIndex = this.currentDraggingPointerIds.indexOf(pointerId);\r\n\r\n if (registeredPointerIndex !== -1 && virtualMeshesInfo.dragging && pointerInfo.pickInfo && (pointerInfo.pickInfo.ray || pointerInfo.pickInfo.aimTransform)) {\r\n let zDragFactor = this.zDragFactor;\r\n\r\n // 2 pointer interaction should not have a z axis drag factor\r\n // as well as near interaction\r\n if (this.currentDraggingPointerIds.length > 1 || pointerInfo.pickInfo.originMesh) {\r\n zDragFactor = 0;\r\n }\r\n\r\n this._ownerNode.computeWorldMatrix(true);\r\n if (!isXRPointer) {\r\n this._pointerUpdate2D(pointerInfo.pickInfo.ray!, pointerId, zDragFactor);\r\n } else {\r\n this._pointerUpdateXR(pointerInfo.pickInfo.aimTransform!, pointerInfo.pickInfo.gripTransform, pointerId, zDragFactor);\r\n }\r\n\r\n // Get change in rotation\r\n this._tmpQuaternion.copyFrom(virtualMeshesInfo.startingPivotOrientation);\r\n this._tmpQuaternion.x = -this._tmpQuaternion.x;\r\n this._tmpQuaternion.y = -this._tmpQuaternion.y;\r\n this._tmpQuaternion.z = -this._tmpQuaternion.z;\r\n virtualMeshesInfo.pivotMesh.absoluteRotationQuaternion!.multiplyToRef(this._tmpQuaternion, this._tmpQuaternion);\r\n virtualMeshesInfo.pivotMesh.absolutePosition.subtractToRef(virtualMeshesInfo.startingPivotPosition, this._tmpVector);\r\n\r\n this.onDragObservable.notifyObservers({ delta: this._tmpVector, position: virtualMeshesInfo.pivotMesh.position, pickInfo: pointerInfo.pickInfo });\r\n\r\n // Notify herited methods and observables\r\n this._targetDrag(this._tmpVector, this._tmpQuaternion, pointerId);\r\n virtualMeshesInfo.lastDragPosition.copyFrom(virtualMeshesInfo.dragMesh.absolutePosition);\r\n\r\n this._moving = true;\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _applyZOffset(node: TransformNode, localOriginDragDifference: number, zDragFactor: number) {\r\n // Determine how much the controller moved to/away towards the dragged object and use this to move the object further when its further away\r\n node.position.z -= node.position.z < 1 ? localOriginDragDifference * zDragFactor : localOriginDragDifference * zDragFactor * node.position.z;\r\n if (node.position.z < 0) {\r\n node.position.z = 0;\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _targetDragStart(worldPosition: Vector3, worldRotation: Quaternion, pointerId: number) {\r\n // Herited classes can override that\r\n }\r\n\r\n protected _targetDrag(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion, pointerId: number) {\r\n // Herited classes can override that\r\n }\r\n\r\n protected _targetDragEnd(pointerId: number) {\r\n // Herited classes can override that\r\n }\r\n\r\n protected _reattachCameraControls() {\r\n if (this._pointerCamera) {\r\n // If the camera is an ArcRotateCamera, preserve the settings from the camera\r\n // when reattaching control\r\n if (this._pointerCamera.getClassName() === \"ArcRotateCamera\") {\r\n const arcRotateCamera = this._pointerCamera as ArcRotateCamera;\r\n arcRotateCamera.attachControl(\r\n arcRotateCamera.inputs ? arcRotateCamera.inputs.noPreventDefault : true,\r\n arcRotateCamera._useCtrlForPanning,\r\n arcRotateCamera._panningMouseButton\r\n );\r\n } else {\r\n // preserve the settings from the camera when reattaching control\r\n this._pointerCamera.attachControl(this._pointerCamera.inputs ? this._pointerCamera.inputs.noPreventDefault : true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n if (this._scene) {\r\n if (this.detachCameraControls && this._attachedToElement && this._pointerCamera && !this._pointerCamera.leftCamera) {\r\n this._reattachCameraControls();\r\n this._attachedToElement = false;\r\n }\r\n this._scene.onPointerObservable.remove(this._pointerObserver);\r\n }\r\n\r\n for (const pointerId in this._virtualMeshesInfo) {\r\n this._virtualMeshesInfo[pointerId].originMesh.dispose();\r\n this._virtualMeshesInfo[pointerId].dragMesh.dispose();\r\n }\r\n\r\n this.onDragEndObservable.clear();\r\n this.onDragObservable.clear();\r\n this.onDragStartObservable.clear();\r\n }\r\n}\r\n", "import type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Vector3, Quaternion, Matrix, TmpVectors } from \"../../Maths/math.vector\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { BaseSixDofDragBehavior } from \"./baseSixDofDragBehavior\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Space } from \"../../Maths/math.axis\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will allow the mesh to be dragged around based on directions and origin of the pointer's ray\r\n */\r\nexport class SixDofDragBehavior extends BaseSixDofDragBehavior {\r\n private _sceneRenderObserver: Nullable> = null;\r\n private _virtualTransformNode: TransformNode;\r\n\r\n protected _targetPosition = new Vector3(0, 0, 0);\r\n protected _targetOrientation = new Quaternion();\r\n protected _targetScaling = new Vector3(1, 1, 1);\r\n protected _startingPosition = new Vector3(0, 0, 0);\r\n protected _startingOrientation = new Quaternion();\r\n protected _startingScaling = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * Fires when position is updated\r\n */\r\n public onPositionChangedObservable = new Observable<{ position: Vector3 }>();\r\n\r\n /**\r\n * The distance towards the target drag position to move each frame. This can be useful to avoid jitter. Set this to 1 for no delay. (Default: 0.2)\r\n */\r\n public dragDeltaRatio = 0.2;\r\n\r\n /**\r\n * If the object should rotate to face the drag origin\r\n */\r\n public rotateDraggedObject = true;\r\n\r\n /**\r\n * If `rotateDraggedObject` is set to `true`, this parameter determines if we are only rotating around the y axis (yaw)\r\n */\r\n public rotateAroundYOnly = false;\r\n\r\n /**\r\n * Should the behavior rotate 1:1 with the motion controller, when one is used.\r\n */\r\n public rotateWithMotionController = true;\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"SixDofDrag\";\r\n }\r\n\r\n /**\r\n * Use this flag to update the target but not move the owner node towards the target\r\n */\r\n public disableMovement: boolean = false;\r\n\r\n /**\r\n * Should the object rotate towards the camera when we start dragging it\r\n */\r\n public faceCameraOnDragStart = false;\r\n\r\n /**\r\n * Attaches the six DoF drag behavior\r\n * In XR mode the mesh and its children will have their isNearGrabbable property set to true\r\n * @param ownerNode The mesh that will be dragged around once attached\r\n */\r\n public attach(ownerNode: Mesh): void {\r\n super.attach(ownerNode);\r\n\r\n ownerNode.isNearGrabbable = true;\r\n // if it has children, make sure they are grabbable too\r\n ownerNode.getChildMeshes().forEach((m) => {\r\n m.isNearGrabbable = true;\r\n });\r\n\r\n // Node that will save the owner's transform\r\n this._virtualTransformNode = new TransformNode(\"virtual_sixDof\", BaseSixDofDragBehavior._virtualScene);\r\n this._virtualTransformNode.rotationQuaternion = Quaternion.Identity();\r\n\r\n // On every frame move towards target scaling to avoid jitter caused by vr controllers\r\n this._sceneRenderObserver = ownerNode.getScene().onBeforeRenderObservable.add(() => {\r\n if (this.currentDraggingPointerIds.length === 1 && this._moving && !this.disableMovement) {\r\n // 1 pointer only drags mesh\r\n const deltaToAdd = TmpVectors.Vector3[0];\r\n deltaToAdd.copyFrom(this._targetPosition).subtractInPlace(ownerNode.absolutePosition).scaleInPlace(this.dragDeltaRatio);\r\n const deltaToAddTransformed = TmpVectors.Vector3[1];\r\n deltaToAddTransformed.copyFrom(deltaToAdd);\r\n // If the node has a parent, transform the delta to local space, so it can be added to the\r\n // position in local space\r\n if (ownerNode.parent) {\r\n const parentRotationMatrixInverse = TmpVectors.Matrix[0];\r\n (ownerNode.parent as TransformNode).absoluteRotationQuaternion.toRotationMatrix(parentRotationMatrixInverse);\r\n parentRotationMatrixInverse.invert();\r\n Vector3.TransformNormalToRef(deltaToAdd, parentRotationMatrixInverse, deltaToAddTransformed);\r\n }\r\n ownerNode.position.addInPlace(deltaToAddTransformed);\r\n\r\n this.onPositionChangedObservable.notifyObservers({ position: ownerNode.absolutePosition });\r\n\r\n // Only rotate the mesh if it's parent has uniform scaling\r\n if (!ownerNode.parent || ((ownerNode.parent as TransformNode).scaling && !(ownerNode.parent as TransformNode).scaling.isNonUniformWithinEpsilon(0.001))) {\r\n const rotationToApply = TmpVectors.Quaternion[0];\r\n rotationToApply.copyFrom(this._targetOrientation);\r\n if (ownerNode.parent) {\r\n const parentRotationInverse = TmpVectors.Quaternion[0];\r\n parentRotationInverse.copyFrom((ownerNode.parent as TransformNode).absoluteRotationQuaternion);\r\n parentRotationInverse.invertInPlace();\r\n parentRotationInverse.multiplyToRef(this._targetOrientation, rotationToApply);\r\n }\r\n Quaternion.SlerpToRef(ownerNode.rotationQuaternion!, rotationToApply, this.dragDeltaRatio, ownerNode.rotationQuaternion!);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _getPositionOffsetAround(transformationLocalOrigin: Vector3, scaling: number, rotation: Quaternion): Vector3 {\r\n const translationMatrix = TmpVectors.Matrix[0]; // T\r\n const translationMatrixInv = TmpVectors.Matrix[1]; // T'\r\n const rotationMatrix = TmpVectors.Matrix[2]; // R\r\n const scaleMatrix = TmpVectors.Matrix[3]; // S\r\n const finalMatrix = TmpVectors.Matrix[4]; // T' x R x S x T\r\n\r\n Matrix.TranslationToRef(transformationLocalOrigin.x, transformationLocalOrigin.y, transformationLocalOrigin.z, translationMatrix); // T\r\n Matrix.TranslationToRef(-transformationLocalOrigin.x, -transformationLocalOrigin.y, -transformationLocalOrigin.z, translationMatrixInv); // T'\r\n Matrix.FromQuaternionToRef(rotation, rotationMatrix); // R\r\n Matrix.ScalingToRef(scaling, scaling, scaling, scaleMatrix);\r\n translationMatrixInv.multiplyToRef(rotationMatrix, finalMatrix); // T' x R\r\n finalMatrix.multiplyToRef(scaleMatrix, finalMatrix); // T' x R x S\r\n finalMatrix.multiplyToRef(translationMatrix, finalMatrix); // T' x R x S x T\r\n\r\n return finalMatrix.getTranslation();\r\n }\r\n\r\n private _onePointerPositionUpdated(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion) {\r\n const pointerDelta = TmpVectors.Vector3[0];\r\n pointerDelta.setAll(0);\r\n\r\n if (this._dragging === this._dragType.DRAG) {\r\n if (this.rotateDraggedObject) {\r\n if (this.rotateAroundYOnly) {\r\n // Convert change in rotation to only y axis rotation\r\n Quaternion.RotationYawPitchRollToRef(worldDeltaRotation.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]);\r\n } else {\r\n TmpVectors.Quaternion[0].copyFrom(worldDeltaRotation);\r\n }\r\n TmpVectors.Quaternion[0].multiplyToRef(this._startingOrientation, this._targetOrientation);\r\n }\r\n } else if (this._dragging === this._dragType.NEAR_DRAG || (this._dragging === this._dragType.DRAG_WITH_CONTROLLER && this.rotateWithMotionController)) {\r\n worldDeltaRotation.multiplyToRef(this._startingOrientation, this._targetOrientation);\r\n }\r\n\r\n this._targetPosition.copyFrom(this._startingPosition).addInPlace(worldDeltaPosition);\r\n }\r\n\r\n private _twoPointersPositionUpdated() {\r\n const startingPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].startingPosition;\r\n const startingPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].startingPosition;\r\n const startingCenter = TmpVectors.Vector3[0];\r\n startingPosition0.addToRef(startingPosition1, startingCenter);\r\n startingCenter.scaleInPlace(0.5);\r\n const startingVector = TmpVectors.Vector3[1];\r\n startingPosition1.subtractToRef(startingPosition0, startingVector);\r\n\r\n const currentPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].dragMesh.absolutePosition;\r\n const currentPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].dragMesh.absolutePosition;\r\n const currentCenter = TmpVectors.Vector3[2];\r\n currentPosition0.addToRef(currentPosition1, currentCenter);\r\n currentCenter.scaleInPlace(0.5);\r\n const currentVector = TmpVectors.Vector3[3];\r\n currentPosition1.subtractToRef(currentPosition0, currentVector);\r\n\r\n const scaling = currentVector.length() / startingVector.length();\r\n const translation = currentCenter.subtract(startingCenter);\r\n const rotationQuaternion = Quaternion.FromEulerAngles(\r\n 0,\r\n Vector3.GetAngleBetweenVectorsOnPlane(startingVector.normalize(), currentVector.normalize(), Vector3.UpReadOnly),\r\n 0\r\n );\r\n\r\n const oldParent = this._ownerNode.parent;\r\n this._ownerNode.setParent(null);\r\n\r\n const positionOffset = this._getPositionOffsetAround(startingCenter.subtract(this._virtualTransformNode.getAbsolutePivotPoint()), scaling, rotationQuaternion);\r\n this._virtualTransformNode.rotationQuaternion!.multiplyToRef(rotationQuaternion, this._ownerNode.rotationQuaternion!);\r\n this._virtualTransformNode.scaling.scaleToRef(scaling, this._ownerNode.scaling);\r\n this._virtualTransformNode.position.addToRef(translation.addInPlace(positionOffset), this._ownerNode.position);\r\n this.onPositionChangedObservable.notifyObservers({ position: this._ownerNode.position });\r\n\r\n this._ownerNode.setParent(oldParent);\r\n }\r\n\r\n protected _targetDragStart() {\r\n const pointerCount = this.currentDraggingPointerIds.length;\r\n\r\n if (!this._ownerNode.rotationQuaternion) {\r\n this._ownerNode.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._ownerNode.rotation.y, this._ownerNode.rotation.x, this._ownerNode.rotation.z);\r\n }\r\n const worldPivot = this._ownerNode.getAbsolutePivotPoint();\r\n\r\n if (pointerCount === 1) {\r\n this._targetPosition.copyFrom(this._ownerNode.absolutePosition);\r\n this._targetOrientation.copyFrom(this._ownerNode.absoluteRotationQuaternion);\r\n this._targetScaling.copyFrom(this._ownerNode.absoluteScaling);\r\n\r\n if (this.faceCameraOnDragStart && this._scene.activeCamera) {\r\n const toCamera = TmpVectors.Vector3[0];\r\n this._scene.activeCamera.position.subtractToRef(worldPivot, toCamera);\r\n toCamera.normalize();\r\n const quat = TmpVectors.Quaternion[0];\r\n if (this._scene.useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toCamera, new Vector3(0, 1, 0), quat);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toCamera, new Vector3(0, 1, 0), quat);\r\n }\r\n quat.normalize();\r\n Quaternion.RotationYawPitchRollToRef(quat.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]);\r\n this._targetOrientation.copyFrom(TmpVectors.Quaternion[0]);\r\n }\r\n this._startingPosition.copyFrom(this._targetPosition);\r\n this._startingOrientation.copyFrom(this._targetOrientation);\r\n this._startingScaling.copyFrom(this._targetScaling);\r\n } else if (pointerCount === 2) {\r\n this._virtualTransformNode.setPivotPoint(new Vector3(0, 0, 0), Space.LOCAL);\r\n this._virtualTransformNode.position.copyFrom(this._ownerNode.absolutePosition);\r\n this._virtualTransformNode.scaling.copyFrom(this._ownerNode.absoluteScaling);\r\n this._virtualTransformNode.rotationQuaternion!.copyFrom(this._ownerNode.absoluteRotationQuaternion);\r\n this._virtualTransformNode.setPivotPoint(worldPivot, Space.WORLD);\r\n this._resetVirtualMeshesPosition();\r\n }\r\n }\r\n\r\n protected _targetDrag(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion) {\r\n if (this.currentDraggingPointerIds.length === 1) {\r\n this._onePointerPositionUpdated(worldDeltaPosition, worldDeltaRotation);\r\n } else if (this.currentDraggingPointerIds.length === 2) {\r\n this._twoPointersPositionUpdated();\r\n }\r\n }\r\n\r\n protected _targetDragEnd() {\r\n if (this.currentDraggingPointerIds.length === 1) {\r\n // We still have 1 active pointer, we must simulate a dragstart with a reseted position/orientation\r\n this._resetVirtualMeshesPosition();\r\n const previousFaceCameraFlag = this.faceCameraOnDragStart;\r\n this.faceCameraOnDragStart = false;\r\n this._targetDragStart();\r\n this.faceCameraOnDragStart = previousFaceCameraFlag;\r\n }\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n super.detach();\r\n\r\n if (this._ownerNode) {\r\n this._ownerNode.getScene().onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n }\r\n\r\n if (this._virtualTransformNode) {\r\n this._virtualTransformNode.dispose();\r\n }\r\n }\r\n}\r\n", "import type { PickingInfo } from \"../../Collisions/pickingInfo\";\r\nimport type { PointerInfo } from \"../../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../../Events/pointerEvents\";\r\nimport { Quaternion, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Behavior } from \"../behavior\";\r\n\r\n/**\r\n * A behavior that allows a transform node to stick to a surface position/orientation\r\n * @since 5.0.0\r\n */\r\nexport class SurfaceMagnetismBehavior implements Behavior {\r\n private _scene: Scene;\r\n private _attachedMesh: Nullable;\r\n private _attachPointLocalOffset: Vector3 = new Vector3();\r\n private _pointerObserver: Nullable>;\r\n private _workingPosition: Vector3 = new Vector3();\r\n private _workingQuaternion: Quaternion = new Quaternion();\r\n private _lastTick: number = -1;\r\n private _onBeforeRender: Nullable>;\r\n private _hit = false;\r\n\r\n /**\r\n * Distance offset from the hit point to place the target at, along the hit normal.\r\n */\r\n public hitNormalOffset: number = 0.05;\r\n\r\n /**\r\n * Name of the behavior\r\n */\r\n public get name(): string {\r\n return \"SurfaceMagnetism\";\r\n }\r\n\r\n /**\r\n * Spatial mapping meshes to collide with\r\n */\r\n public meshes: AbstractMesh[] = [];\r\n\r\n /**\r\n * Function called when the behavior needs to be initialized (after attaching it to a target)\r\n */\r\n public init(): void {}\r\n\r\n /**\r\n * Set to false if the node should strictly follow the camera without any interpolation time\r\n */\r\n public interpolatePose = true;\r\n\r\n /**\r\n * Rate of interpolation of position and rotation of the attached node.\r\n * Higher values will give a slower interpolation.\r\n */\r\n public lerpTime = 250;\r\n\r\n /**\r\n * If true, pitch and roll are omitted.\r\n */\r\n public keepOrientationVertical = true;\r\n\r\n /**\r\n * Is this behavior reacting to pointer events\r\n */\r\n public enabled = true;\r\n\r\n /**\r\n * Maximum distance for the node to stick to the surface\r\n */\r\n public maxStickingDistance = 0.8;\r\n\r\n /**\r\n * Attaches the behavior to a transform node\r\n * @param target defines the target where the behavior is attached to\r\n * @param scene the scene\r\n */\r\n public attach(target: Mesh, scene?: Scene): void {\r\n this._attachedMesh = target;\r\n this._scene = scene || target.getScene();\r\n if (!this._attachedMesh.rotationQuaternion) {\r\n this._attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._attachedMesh.rotation.y, this._attachedMesh.rotation.x, this._attachedMesh.rotation.z);\r\n }\r\n this.updateAttachPoint();\r\n\r\n this._workingPosition.copyFrom(this._attachedMesh.position);\r\n this._workingQuaternion.copyFrom(this._attachedMesh.rotationQuaternion);\r\n this._addObservables();\r\n }\r\n\r\n /**\r\n * Detaches the behavior\r\n */\r\n public detach(): void {\r\n this._attachedMesh = null;\r\n this._removeObservables();\r\n }\r\n\r\n private _getTargetPose(pickingInfo: PickingInfo): Nullable<{ position: Vector3; quaternion: Quaternion }> {\r\n if (!this._attachedMesh) {\r\n return null;\r\n }\r\n\r\n if (pickingInfo && pickingInfo.hit) {\r\n const pickedNormal = pickingInfo.getNormal(true, true);\r\n const pickedPoint = pickingInfo.pickedPoint;\r\n\r\n if (!pickedNormal || !pickedPoint) {\r\n return null;\r\n }\r\n pickedNormal.normalize();\r\n\r\n const worldTarget = TmpVectors.Vector3[0];\r\n worldTarget.copyFrom(pickedNormal);\r\n worldTarget.scaleInPlace(this.hitNormalOffset);\r\n worldTarget.addInPlace(pickedPoint);\r\n\r\n if (this._attachedMesh.parent) {\r\n TmpVectors.Matrix[0].copyFrom(this._attachedMesh.parent.getWorldMatrix()).invert();\r\n Vector3.TransformNormalToRef(worldTarget, TmpVectors.Matrix[0], worldTarget);\r\n }\r\n\r\n return {\r\n position: worldTarget,\r\n quaternion: Quaternion.RotationYawPitchRoll(\r\n -Math.atan2(pickedNormal.x, -pickedNormal.z),\r\n this.keepOrientationVertical ? 0 : Math.atan2(pickedNormal.y, Math.sqrt(pickedNormal.z * pickedNormal.z + pickedNormal.x * pickedNormal.x)),\r\n 0\r\n ),\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Updates the attach point with the current geometry extents of the attached mesh\r\n */\r\n public updateAttachPoint() {\r\n this._getAttachPointOffsetToRef(this._attachPointLocalOffset);\r\n }\r\n\r\n /**\r\n * Finds the intersection point of the given ray onto the meshes and updates the target.\r\n * Transformation will be interpolated according to `interpolatePose` and `lerpTime` properties.\r\n * If no mesh of `meshes` are hit, this does nothing.\r\n * @param pickInfo The input pickingInfo that will be used to intersect the meshes\r\n * @returns a boolean indicating if we found a hit to stick to\r\n */\r\n public findAndUpdateTarget(pickInfo: PickingInfo): boolean {\r\n this._hit = false;\r\n if (!pickInfo.ray) {\r\n return false;\r\n }\r\n\r\n const subPicking = pickInfo.ray.intersectsMeshes(this.meshes)[0];\r\n\r\n if (this._attachedMesh && subPicking && subPicking.hit && subPicking.pickedMesh) {\r\n const pose = this._getTargetPose(subPicking);\r\n if (pose && Vector3.Distance(this._attachedMesh.position, pose.position) < this.maxStickingDistance) {\r\n this._workingPosition.copyFrom(pose.position);\r\n this._workingQuaternion.copyFrom(pose.quaternion);\r\n this._hit = true;\r\n }\r\n }\r\n\r\n return this._hit;\r\n }\r\n\r\n private _getAttachPointOffsetToRef(ref: Vector3) {\r\n if (!this._attachedMesh) {\r\n ref.setAll(0);\r\n return;\r\n }\r\n\r\n const storedQuat = TmpVectors.Quaternion[0];\r\n storedQuat.copyFrom(this._attachedMesh.rotationQuaternion!);\r\n this._attachedMesh.rotationQuaternion!.copyFromFloats(0, 0, 0, 1);\r\n this._attachedMesh.computeWorldMatrix();\r\n const boundingMinMax = this._attachedMesh.getHierarchyBoundingVectors();\r\n const center = TmpVectors.Vector3[0];\r\n boundingMinMax.max.addToRef(boundingMinMax.min, center);\r\n center.scaleInPlace(0.5);\r\n center.z = boundingMinMax.max.z;\r\n // We max the z coordinate because we want the attach point to be on the back of the mesh\r\n const invWorld = TmpVectors.Matrix[0];\r\n this._attachedMesh.getWorldMatrix().invertToRef(invWorld);\r\n Vector3.TransformCoordinatesToRef(center, invWorld, ref);\r\n this._attachedMesh.rotationQuaternion!.copyFrom(storedQuat);\r\n }\r\n\r\n private _updateTransformToGoal(elapsed: number) {\r\n if (!this._attachedMesh || !this._hit) {\r\n return;\r\n }\r\n\r\n const oldParent = this._attachedMesh.parent;\r\n this._attachedMesh.setParent(null);\r\n\r\n const worldOffset = TmpVectors.Vector3[0];\r\n Vector3.TransformNormalToRef(this._attachPointLocalOffset, this._attachedMesh.getWorldMatrix(), worldOffset);\r\n\r\n if (!this.interpolatePose) {\r\n this._attachedMesh.position.copyFrom(this._workingPosition).subtractInPlace(worldOffset);\r\n this._attachedMesh.rotationQuaternion!.copyFrom(this._workingQuaternion);\r\n return;\r\n }\r\n\r\n // position\r\n const interpolatedPosition = new Vector3();\r\n Vector3.SmoothToRef(this._attachedMesh.position, this._workingPosition, elapsed, this.lerpTime, interpolatedPosition);\r\n this._attachedMesh.position.copyFrom(interpolatedPosition);\r\n\r\n // rotation\r\n const currentRotation = new Quaternion();\r\n currentRotation.copyFrom(this._attachedMesh.rotationQuaternion!);\r\n Quaternion.SmoothToRef(currentRotation, this._workingQuaternion, elapsed, this.lerpTime, this._attachedMesh.rotationQuaternion!);\r\n\r\n this._attachedMesh.setParent(oldParent);\r\n }\r\n\r\n private _addObservables() {\r\n this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => {\r\n if (this.enabled && pointerInfo.type == PointerEventTypes.POINTERMOVE && pointerInfo.pickInfo) {\r\n this.findAndUpdateTarget(pointerInfo.pickInfo);\r\n }\r\n });\r\n\r\n this._lastTick = Date.now();\r\n this._onBeforeRender = this._scene.onBeforeRenderObservable.add(() => {\r\n const tick = Date.now();\r\n this._updateTransformToGoal(tick - this._lastTick);\r\n this._lastTick = tick;\r\n });\r\n }\r\n\r\n private _removeObservables() {\r\n this._scene.onPointerObservable.remove(this._pointerObserver);\r\n this._scene.onBeforeRenderObservable.remove(this._onBeforeRender);\r\n this._pointerObserver = null;\r\n this._onBeforeRender = null;\r\n }\r\n}\r\n", "import type { Behavior } from \"../behavior\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport { Matrix, Quaternion, Vector3 } from \"../../Maths/math.vector\";\r\nimport { Scalar } from \"../../Maths/math.scalar\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Epsilon } from \"../../Maths/math.constants\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will follow a camera\r\n * @since 5.0.0\r\n */\r\nexport class FollowBehavior implements Behavior {\r\n private _scene: Scene;\r\n\r\n // Memory cache to avoid GC usage\r\n private _tmpQuaternion: Quaternion = new Quaternion();\r\n private _tmpVectors: Vector3[] = [new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3()];\r\n private _tmpMatrix: Matrix = new Matrix();\r\n private _tmpInvertView: Matrix = new Matrix();\r\n private _tmpForward: Vector3 = new Vector3();\r\n private _tmpNodeForward: Vector3 = new Vector3();\r\n private _tmpPosition: Vector3 = new Vector3();\r\n\r\n private _followedCamera: Nullable;\r\n private _onBeforeRender: Nullable>;\r\n\r\n private _workingPosition: Vector3 = new Vector3();\r\n private _workingQuaternion: Quaternion = new Quaternion();\r\n private _lastTick: number = -1;\r\n private _recenterNextUpdate = true;\r\n\r\n /**\r\n * Attached node of this behavior\r\n */\r\n public attachedNode: Nullable;\r\n\r\n /**\r\n * Set to false if the node should strictly follow the camera without any interpolation time\r\n */\r\n public interpolatePose = true;\r\n\r\n /**\r\n * Rate of interpolation of position and rotation of the attached node.\r\n * Higher values will give a slower interpolation.\r\n */\r\n public lerpTime = 500;\r\n\r\n /**\r\n * If the behavior should ignore the pitch and roll of the camera.\r\n */\r\n public ignoreCameraPitchAndRoll = false;\r\n\r\n /**\r\n * Pitch offset from camera (relative to Max Distance)\r\n * Is only effective if `ignoreCameraPitchAndRoll` is set to `true`.\r\n */\r\n public pitchOffset = 15;\r\n\r\n /**\r\n * The vertical angle from the camera forward axis to the owner will not exceed this value\r\n */\r\n public maxViewVerticalDegrees = 30;\r\n\r\n /**\r\n * The horizontal angle from the camera forward axis to the owner will not exceed this value\r\n */\r\n public maxViewHorizontalDegrees = 30;\r\n /**\r\n * The attached node will not reorient until the angle between its forward vector and the vector to the camera is greater than this value\r\n */\r\n public orientToCameraDeadzoneDegrees = 60;\r\n /**\r\n * Option to ignore distance clamping\r\n */\r\n public ignoreDistanceClamp = false;\r\n /**\r\n * Option to ignore angle clamping\r\n */\r\n public ignoreAngleClamp = false;\r\n /**\r\n * Max vertical distance between the attachedNode and camera\r\n */\r\n public verticalMaxDistance = 0;\r\n /**\r\n * Default distance from eye to attached node, i.e. the sphere radius\r\n */\r\n public defaultDistance = 0.8;\r\n /**\r\n * Max distance from eye to attached node, i.e. the sphere radius\r\n */\r\n public maximumDistance = 2;\r\n /**\r\n * Min distance from eye to attached node, i.e. the sphere radius\r\n */\r\n public minimumDistance = 0.3;\r\n\r\n /**\r\n * Ignore vertical movement and lock the Y position of the object.\r\n */\r\n public useFixedVerticalOffset = false;\r\n\r\n /**\r\n * Fixed vertical position offset distance.\r\n */\r\n public fixedVerticalOffset = 0;\r\n\r\n /**\r\n * Enables/disables the behavior\r\n * @internal\r\n */\r\n public _enabled = true;\r\n\r\n /**\r\n * The camera that should be followed by this behavior\r\n */\r\n public get followedCamera(): Nullable {\r\n return this._followedCamera || this._scene.activeCamera;\r\n }\r\n\r\n public set followedCamera(camera: Nullable) {\r\n this._followedCamera = camera;\r\n }\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"Follow\";\r\n }\r\n\r\n /**\r\n * Initializes the behavior\r\n */\r\n public init() {}\r\n\r\n /**\r\n * Attaches the follow behavior\r\n * @param ownerNode The mesh that will be following once attached\r\n * @param followedCamera The camera that should be followed by the node\r\n */\r\n public attach(ownerNode: TransformNode, followedCamera?: Camera): void {\r\n this._scene = ownerNode.getScene();\r\n this.attachedNode = ownerNode;\r\n\r\n if (followedCamera) {\r\n this.followedCamera = followedCamera;\r\n }\r\n\r\n this._addObservables();\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n this.attachedNode = null;\r\n this._removeObservables();\r\n }\r\n\r\n /**\r\n * Recenters the attached node in front of the camera on the next update\r\n */\r\n public recenter() {\r\n this._recenterNextUpdate = true;\r\n }\r\n\r\n private _angleBetweenVectorAndPlane(vector: Vector3, normal: Vector3) {\r\n // Work on copies\r\n this._tmpVectors[0].copyFrom(vector);\r\n vector = this._tmpVectors[0];\r\n this._tmpVectors[1].copyFrom(normal);\r\n normal = this._tmpVectors[1];\r\n\r\n vector.normalize();\r\n normal.normalize();\r\n\r\n return Math.PI / 2 - Math.acos(Vector3.Dot(vector, normal));\r\n }\r\n\r\n private _length2D(vector: Vector3) {\r\n return Math.sqrt(vector.x * vector.x + vector.z * vector.z);\r\n }\r\n\r\n private _distanceClamp(currentToTarget: Vector3, moveToDefault: boolean = false) {\r\n let minDistance = this.minimumDistance;\r\n let maxDistance = this.maximumDistance;\r\n const defaultDistance = this.defaultDistance;\r\n\r\n const direction = this._tmpVectors[0];\r\n direction.copyFrom(currentToTarget);\r\n let currentDistance = direction.length();\r\n direction.normalizeFromLength(currentDistance);\r\n\r\n if (this.ignoreCameraPitchAndRoll) {\r\n // If we don't account for pitch offset, the casted object will float up/down as the reference\r\n // gets closer to it because we will still be casting in the direction of the pitched offset.\r\n // To fix this, only modify the XZ position of the object.\r\n minDistance = this._length2D(direction) * minDistance;\r\n maxDistance = this._length2D(direction) * maxDistance;\r\n\r\n const currentDistance2D = this._length2D(currentToTarget);\r\n direction.scaleInPlace(currentDistance / currentDistance2D);\r\n currentDistance = currentDistance2D;\r\n }\r\n\r\n let clampedDistance = currentDistance;\r\n\r\n if (moveToDefault) {\r\n clampedDistance = defaultDistance;\r\n } else {\r\n clampedDistance = Scalar.Clamp(currentDistance, minDistance, maxDistance);\r\n }\r\n\r\n currentToTarget.copyFrom(direction).scaleInPlace(clampedDistance);\r\n\r\n return currentDistance !== clampedDistance;\r\n }\r\n\r\n private _applyVerticalClamp(currentToTarget: Vector3) {\r\n if (this.verticalMaxDistance !== 0) {\r\n currentToTarget.y = Scalar.Clamp(currentToTarget.y, -this.verticalMaxDistance, this.verticalMaxDistance);\r\n }\r\n }\r\n\r\n private _toOrientationQuatToRef(vector: Vector3, quaternion: Quaternion) {\r\n Quaternion.RotationYawPitchRollToRef(Math.atan2(vector.x, vector.z), Math.atan2(vector.y, Math.sqrt(vector.z * vector.z + vector.x * vector.x)), 0, quaternion);\r\n }\r\n\r\n private _applyPitchOffset(invertView: Matrix) {\r\n const forward = this._tmpVectors[0];\r\n const right = this._tmpVectors[1];\r\n forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n right.copyFromFloats(1, 0, 0);\r\n Vector3.TransformNormalToRef(forward, invertView, forward);\r\n forward.y = 0;\r\n forward.normalize();\r\n Vector3.TransformNormalToRef(right, invertView, right);\r\n\r\n Quaternion.RotationAxisToRef(right, (this.pitchOffset * Math.PI) / 180, this._tmpQuaternion);\r\n forward.rotateByQuaternionToRef(this._tmpQuaternion, forward);\r\n this._toOrientationQuatToRef(forward, this._tmpQuaternion);\r\n this._tmpQuaternion.toRotationMatrix(this._tmpMatrix);\r\n\r\n // Since we already extracted position from the invert view matrix, we can\r\n // disregard the position part of the matrix in the copy\r\n invertView.copyFrom(this._tmpMatrix);\r\n }\r\n\r\n private _angularClamp(invertView: Matrix, currentToTarget: Vector3): boolean {\r\n const forward = this._tmpVectors[5];\r\n forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n const right = this._tmpVectors[6];\r\n right.copyFromFloats(1, 0, 0);\r\n\r\n // forward and right are related to camera frame of reference\r\n Vector3.TransformNormalToRef(forward, invertView, forward);\r\n Vector3.TransformNormalToRef(right, invertView, right);\r\n\r\n // Up is global Z\r\n const up = Vector3.UpReadOnly;\r\n\r\n const dist = currentToTarget.length();\r\n\r\n if (dist < Epsilon) {\r\n return false;\r\n }\r\n\r\n let angularClamped = false;\r\n const rotationQuat = this._tmpQuaternion;\r\n\r\n // X-axis leashing\r\n if (this.ignoreCameraPitchAndRoll) {\r\n const angle = Vector3.GetAngleBetweenVectorsOnPlane(currentToTarget, forward, right);\r\n Quaternion.RotationAxisToRef(right, angle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n } else {\r\n const angle = -Vector3.GetAngleBetweenVectorsOnPlane(currentToTarget, forward, right);\r\n const minMaxAngle = ((this.maxViewVerticalDegrees * Math.PI) / 180) * 0.5;\r\n if (angle < -minMaxAngle) {\r\n Quaternion.RotationAxisToRef(right, -angle - minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n } else if (angle > minMaxAngle) {\r\n Quaternion.RotationAxisToRef(right, -angle + minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n }\r\n }\r\n\r\n // Y-axis leashing\r\n const angle = this._angleBetweenVectorAndPlane(currentToTarget, right) * (this._scene.useRightHandedSystem ? -1 : 1);\r\n const minMaxAngle = ((this.maxViewHorizontalDegrees * Math.PI) / 180) * 0.5;\r\n if (angle < -minMaxAngle) {\r\n Quaternion.RotationAxisToRef(up, -angle - minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n } else if (angle > minMaxAngle) {\r\n Quaternion.RotationAxisToRef(up, -angle + minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n }\r\n\r\n return angularClamped;\r\n }\r\n\r\n private _orientationClamp(currentToTarget: Vector3, rotationQuaternion: Quaternion) {\r\n // Construct a rotation quat from up vector and target vector\r\n const toFollowed = this._tmpVectors[0];\r\n toFollowed.copyFrom(currentToTarget).scaleInPlace(-1).normalize();\r\n\r\n const up = this._tmpVectors[1];\r\n const right = this._tmpVectors[2];\r\n // We use global up vector to orient the following node (global +Y)\r\n up.copyFromFloats(0, 1, 0);\r\n\r\n // Gram-Schmidt to create an orthonormal frame\r\n Vector3.CrossToRef(toFollowed, up, right);\r\n const length = right.length();\r\n\r\n if (length < Epsilon) {\r\n return;\r\n }\r\n\r\n right.normalizeFromLength(length);\r\n\r\n Vector3.CrossToRef(right, toFollowed, up);\r\n if (this.attachedNode?.getScene().useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toFollowed, up, rotationQuaternion);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toFollowed, up, rotationQuaternion);\r\n }\r\n }\r\n\r\n private _passedOrientationDeadzone(currentToTarget: Vector3, forward: Vector3) {\r\n const leashToFollow = this._tmpVectors[5];\r\n leashToFollow.copyFrom(currentToTarget);\r\n leashToFollow.normalize();\r\n\r\n const angle = Math.abs(Vector3.GetAngleBetweenVectorsOnPlane(forward, leashToFollow, Vector3.UpReadOnly));\r\n return (angle * 180) / Math.PI > this.orientToCameraDeadzoneDegrees;\r\n }\r\n\r\n private _updateLeashing(camera: Camera) {\r\n if (this.attachedNode && this._enabled) {\r\n const oldParent = this.attachedNode.parent;\r\n this.attachedNode.setParent(null);\r\n\r\n const worldMatrix = this.attachedNode.getWorldMatrix();\r\n const currentToTarget = this._workingPosition;\r\n const rotationQuaternion = this._workingQuaternion;\r\n const pivot = this.attachedNode.getPivotPoint();\r\n const invertView = this._tmpInvertView;\r\n invertView.copyFrom(camera.getViewMatrix());\r\n invertView.invert();\r\n\r\n Vector3.TransformCoordinatesToRef(pivot, worldMatrix, currentToTarget);\r\n const position = this._tmpPosition;\r\n position.copyFromFloats(0, 0, 0);\r\n Vector3.TransformCoordinatesToRef(position, worldMatrix, position);\r\n position.scaleInPlace(-1).subtractInPlace(pivot);\r\n currentToTarget.subtractInPlace(camera.globalPosition);\r\n\r\n if (this.ignoreCameraPitchAndRoll) {\r\n this._applyPitchOffset(invertView);\r\n }\r\n\r\n let angularClamped = false;\r\n const forward = this._tmpForward;\r\n forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n Vector3.TransformNormalToRef(forward, invertView, forward);\r\n\r\n const nodeForward = this._tmpNodeForward;\r\n nodeForward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n Vector3.TransformNormalToRef(nodeForward, worldMatrix, nodeForward);\r\n\r\n if (this._recenterNextUpdate) {\r\n currentToTarget.copyFrom(forward).scaleInPlace(this.defaultDistance);\r\n } else {\r\n if (this.ignoreAngleClamp) {\r\n const currentDistance = currentToTarget.length();\r\n currentToTarget.copyFrom(forward).scaleInPlace(currentDistance);\r\n } else {\r\n angularClamped = this._angularClamp(invertView, currentToTarget);\r\n }\r\n }\r\n\r\n let distanceClamped = false;\r\n if (!this.ignoreDistanceClamp) {\r\n distanceClamped = this._distanceClamp(currentToTarget, angularClamped);\r\n this._applyVerticalClamp(currentToTarget);\r\n }\r\n\r\n if (this.useFixedVerticalOffset) {\r\n currentToTarget.y = position.y - camera.globalPosition.y + this.fixedVerticalOffset;\r\n }\r\n\r\n if (angularClamped || distanceClamped || this._passedOrientationDeadzone(currentToTarget, nodeForward) || this._recenterNextUpdate) {\r\n this._orientationClamp(currentToTarget, rotationQuaternion);\r\n }\r\n\r\n this._workingPosition.subtractInPlace(pivot);\r\n this._recenterNextUpdate = false;\r\n\r\n this.attachedNode.setParent(oldParent);\r\n }\r\n }\r\n\r\n private _updateTransformToGoal(elapsed: number) {\r\n if (!this.attachedNode || !this.followedCamera || !this._enabled) {\r\n return;\r\n }\r\n\r\n if (!this.attachedNode.rotationQuaternion) {\r\n this.attachedNode.rotationQuaternion = Quaternion.Identity();\r\n }\r\n\r\n const oldParent = this.attachedNode.parent;\r\n this.attachedNode.setParent(null);\r\n\r\n if (!this.interpolatePose) {\r\n this.attachedNode.position.copyFrom(this.followedCamera.globalPosition).addInPlace(this._workingPosition);\r\n this.attachedNode.rotationQuaternion.copyFrom(this._workingQuaternion);\r\n return;\r\n }\r\n\r\n // position\r\n const currentDirection = new Vector3();\r\n currentDirection.copyFrom(this.attachedNode.position).subtractInPlace(this.followedCamera.globalPosition);\r\n Vector3.SmoothToRef(currentDirection, this._workingPosition, elapsed, this.lerpTime, currentDirection);\r\n currentDirection.addInPlace(this.followedCamera.globalPosition);\r\n this.attachedNode.position.copyFrom(currentDirection);\r\n\r\n // rotation\r\n const currentRotation = new Quaternion();\r\n currentRotation.copyFrom(this.attachedNode.rotationQuaternion);\r\n Quaternion.SmoothToRef(currentRotation, this._workingQuaternion, elapsed, this.lerpTime, this.attachedNode.rotationQuaternion);\r\n\r\n this.attachedNode.setParent(oldParent);\r\n }\r\n\r\n private _addObservables() {\r\n this._lastTick = Date.now();\r\n this._onBeforeRender = this._scene.onBeforeRenderObservable.add(() => {\r\n if (!this.followedCamera) {\r\n return;\r\n }\r\n\r\n const tick = Date.now();\r\n this._updateLeashing(this.followedCamera);\r\n this._updateTransformToGoal(tick - this._lastTick);\r\n this._lastTick = tick;\r\n });\r\n }\r\n\r\n private _removeObservables() {\r\n if (this._onBeforeRender) {\r\n this._scene.onBeforeRenderObservable.remove(this._onBeforeRender);\r\n }\r\n }\r\n}\r\n", "import type { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport type { IDisposable } from \"../scene\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport type { Observable } from \"core/Misc/observable\";\r\n\r\n/**\r\n * Defining the interface required for a (webxr) feature\r\n */\r\nexport interface IWebXRFeature extends IDisposable {\r\n /**\r\n * Is this feature attached\r\n */\r\n attached: boolean;\r\n /**\r\n * Should auto-attach be disabled?\r\n */\r\n disableAutoAttach: boolean;\r\n\r\n /**\r\n * Attach the feature to the session\r\n * Will usually be called by the features manager\r\n *\r\n * @param force should attachment be forced (even when already attached)\r\n * @returns true if successful.\r\n */\r\n attach(force?: boolean): boolean;\r\n /**\r\n * Detach the feature from the session\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n detach(): boolean;\r\n\r\n /**\r\n * This function will be executed during before enabling the feature and can be used to not-allow enabling it.\r\n * Note that at this point the session has NOT started, so this is purely checking if the browser supports it\r\n *\r\n * @returns whether or not the feature is compatible in this environment\r\n */\r\n isCompatible(): boolean;\r\n\r\n /**\r\n * Was this feature disposed;\r\n */\r\n isDisposed: boolean;\r\n\r\n /**\r\n * The name of the native xr feature name, if applicable (like anchor, hit-test, or hand-tracking)\r\n */\r\n xrNativeFeatureName?: string;\r\n\r\n /**\r\n * A list of (Babylon WebXR) features this feature depends on\r\n */\r\n dependsOn?: string[];\r\n\r\n /**\r\n * If this feature requires to extend the XRSessionInit object, this function will return the partial XR session init object\r\n */\r\n getXRSessionInitExtension?: () => Promise>;\r\n\r\n /**\r\n * Triggered when the feature is attached\r\n */\r\n onFeatureAttachObservable: Observable;\r\n /**\r\n * Triggered when the feature is detached\r\n */\r\n onFeatureDetachObservable: Observable;\r\n}\r\n\r\n/**\r\n * A list of the currently available features without referencing them\r\n */\r\nexport class WebXRFeatureName {\r\n /**\r\n * The name of the anchor system feature\r\n */\r\n public static readonly ANCHOR_SYSTEM = \"xr-anchor-system\";\r\n /**\r\n * The name of the background remover feature\r\n */\r\n public static readonly BACKGROUND_REMOVER = \"xr-background-remover\";\r\n /**\r\n * The name of the hit test feature\r\n */\r\n public static readonly HIT_TEST = \"xr-hit-test\";\r\n /**\r\n * The name of the mesh detection feature\r\n */\r\n public static readonly MESH_DETECTION = \"xr-mesh-detection\";\r\n /**\r\n * physics impostors for xr controllers feature\r\n */\r\n public static readonly PHYSICS_CONTROLLERS = \"xr-physics-controller\";\r\n /**\r\n * The name of the plane detection feature\r\n */\r\n public static readonly PLANE_DETECTION = \"xr-plane-detection\";\r\n /**\r\n * The name of the pointer selection feature\r\n */\r\n public static readonly POINTER_SELECTION = \"xr-controller-pointer-selection\";\r\n /**\r\n * The name of the teleportation feature\r\n */\r\n public static readonly TELEPORTATION = \"xr-controller-teleportation\";\r\n /**\r\n * The name of the feature points feature.\r\n */\r\n public static readonly FEATURE_POINTS = \"xr-feature-points\";\r\n /**\r\n * The name of the hand tracking feature.\r\n */\r\n public static readonly HAND_TRACKING = \"xr-hand-tracking\";\r\n /**\r\n * The name of the image tracking feature\r\n */\r\n public static readonly IMAGE_TRACKING = \"xr-image-tracking\";\r\n /**\r\n * The name of the near interaction feature\r\n */\r\n public static readonly NEAR_INTERACTION = \"xr-near-interaction\";\r\n /**\r\n * The name of the DOM overlay feature\r\n */\r\n public static readonly DOM_OVERLAY = \"xr-dom-overlay\";\r\n /**\r\n * The name of the movement feature\r\n */\r\n public static readonly MOVEMENT = \"xr-controller-movement\";\r\n /**\r\n * The name of the light estimation feature\r\n */\r\n public static readonly LIGHT_ESTIMATION = \"xr-light-estimation\";\r\n /**\r\n * The name of the eye tracking feature\r\n */\r\n public static readonly EYE_TRACKING = \"xr-eye-tracking\";\r\n /**\r\n * The name of the walking locomotion feature\r\n */\r\n public static readonly WALKING_LOCOMOTION = \"xr-walking-locomotion\";\r\n /**\r\n * The name of the composition layers feature\r\n */\r\n public static readonly LAYERS = \"xr-layers\";\r\n /**\r\n * The name of the depth sensing feature\r\n */\r\n public static readonly DEPTH_SENSING = \"xr-depth-sensing\";\r\n /**\r\n * The name of the WebXR Space Warp feature\r\n */\r\n public static readonly SPACE_WARP = \"xr-space-warp\";\r\n /**\r\n * The name of the WebXR Raw Camera Access feature\r\n */\r\n public static readonly RAW_CAMERA_ACCESS = \"xr-raw-camera-access\";\r\n}\r\n\r\n/**\r\n * Defining the constructor of a feature. Used to register the modules.\r\n */\r\nexport type WebXRFeatureConstructor = (xrSessionManager: WebXRSessionManager, options?: any) => () => IWebXRFeature;\r\n\r\n/**\r\n * The WebXR features manager is responsible of enabling or disabling features required for the current XR session.\r\n * It is mainly used in AR sessions.\r\n *\r\n * A feature can have a version that is defined by Babylon (and does not correspond with the webxr version).\r\n */\r\nexport class WebXRFeaturesManager implements IDisposable {\r\n private static readonly _AvailableFeatures: {\r\n [name: string]: {\r\n stable: number;\r\n latest: number;\r\n [version: number]: WebXRFeatureConstructor;\r\n };\r\n } = {};\r\n\r\n private _features: {\r\n [name: string]: {\r\n featureImplementation: IWebXRFeature;\r\n version: number;\r\n enabled: boolean;\r\n required: boolean;\r\n };\r\n } = {};\r\n\r\n /**\r\n * The key is the feature to check and the value is the feature that conflicts.\r\n */\r\n private static readonly _ConflictingFeatures: { [key: string]: string } = {\r\n [WebXRFeatureName.TELEPORTATION]: WebXRFeatureName.MOVEMENT,\r\n [WebXRFeatureName.MOVEMENT]: WebXRFeatureName.TELEPORTATION,\r\n };\r\n\r\n /**\r\n * constructs a new features manages.\r\n *\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n */\r\n constructor(private _xrSessionManager: WebXRSessionManager) {\r\n // when session starts / initialized - attach\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this.getEnabledFeatures().forEach((featureName) => {\r\n const feature = this._features[featureName];\r\n if (feature.enabled && !feature.featureImplementation.attached && !feature.featureImplementation.disableAutoAttach) {\r\n this.attachFeature(featureName);\r\n }\r\n });\r\n });\r\n\r\n // when session ends - detach\r\n this._xrSessionManager.onXRSessionEnded.add(() => {\r\n this.getEnabledFeatures().forEach((featureName) => {\r\n const feature = this._features[featureName];\r\n if (feature.enabled && feature.featureImplementation.attached) {\r\n // detach, but don't disable!\r\n this.detachFeature(featureName);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Used to register a module. After calling this function a developer can use this feature in the scene.\r\n * Mainly used internally.\r\n *\r\n * @param featureName the name of the feature to register\r\n * @param constructorFunction the function used to construct the module\r\n * @param version the (babylon) version of the module\r\n * @param stable is that a stable version of this module\r\n */\r\n public static AddWebXRFeature(featureName: string, constructorFunction: WebXRFeatureConstructor, version: number = 1, stable: boolean = false) {\r\n this._AvailableFeatures[featureName] = this._AvailableFeatures[featureName] || { latest: version };\r\n if (version > this._AvailableFeatures[featureName].latest) {\r\n this._AvailableFeatures[featureName].latest = version;\r\n }\r\n if (stable) {\r\n this._AvailableFeatures[featureName].stable = version;\r\n }\r\n this._AvailableFeatures[featureName][version] = constructorFunction;\r\n }\r\n\r\n /**\r\n * Returns a constructor of a specific feature.\r\n *\r\n * @param featureName the name of the feature to construct\r\n * @param version the version of the feature to load\r\n * @param xrSessionManager the xrSessionManager. Used to construct the module\r\n * @param options optional options provided to the module.\r\n * @returns a function that, when called, will return a new instance of this feature\r\n */\r\n public static ConstructFeature(featureName: string, version: number = 1, xrSessionManager: WebXRSessionManager, options?: any): () => IWebXRFeature {\r\n const constructorFunction = this._AvailableFeatures[featureName][version];\r\n if (!constructorFunction) {\r\n // throw an error? return nothing?\r\n throw new Error(\"feature not found\");\r\n }\r\n\r\n return constructorFunction(xrSessionManager, options);\r\n }\r\n\r\n /**\r\n * Can be used to return the list of features currently registered\r\n *\r\n * @returns an Array of available features\r\n */\r\n public static GetAvailableFeatures() {\r\n return Object.keys(this._AvailableFeatures);\r\n }\r\n\r\n /**\r\n * Gets the versions available for a specific feature\r\n * @param featureName the name of the feature\r\n * @returns an array with the available versions\r\n */\r\n public static GetAvailableVersions(featureName: string) {\r\n return Object.keys(this._AvailableFeatures[featureName]);\r\n }\r\n\r\n /**\r\n * Return the latest unstable version of this feature\r\n * @param featureName the name of the feature to search\r\n * @returns the version number. if not found will return -1\r\n */\r\n public static GetLatestVersionOfFeature(featureName: string): number {\r\n return (this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].latest) || -1;\r\n }\r\n\r\n /**\r\n * Return the latest stable version of this feature\r\n * @param featureName the name of the feature to search\r\n * @returns the version number. if not found will return -1\r\n */\r\n public static GetStableVersionOfFeature(featureName: string): number {\r\n return (this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].stable) || -1;\r\n }\r\n\r\n /**\r\n * Attach a feature to the current session. Mainly used when session started to start the feature effect.\r\n * Can be used during a session to start a feature\r\n * @param featureName the name of feature to attach\r\n */\r\n public attachFeature(featureName: string) {\r\n const feature = this._features[featureName];\r\n if (feature && feature.enabled && !feature.featureImplementation.attached) {\r\n const attached = feature.featureImplementation.attach();\r\n if (!attached) {\r\n Tools.Warn(`Feature ${featureName} failed to attach`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Can be used inside a session or when the session ends to detach a specific feature\r\n * @param featureName the name of the feature to detach\r\n */\r\n public detachFeature(featureName: string) {\r\n const feature = this._features[featureName];\r\n if (feature && feature.featureImplementation.attached) {\r\n const detached = feature.featureImplementation.detach();\r\n if (!detached) {\r\n Tools.Warn(`Feature ${featureName} failed to detach`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Used to disable an already-enabled feature\r\n * The feature will be disposed and will be recreated once enabled.\r\n * @param featureName the feature to disable\r\n * @returns true if disable was successful\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public disableFeature(featureName: string | { Name: string }): boolean {\r\n const name = typeof featureName === \"string\" ? featureName : featureName.Name;\r\n const feature = this._features[name];\r\n if (feature && feature.enabled) {\r\n feature.enabled = false;\r\n this.detachFeature(name);\r\n feature.featureImplementation.dispose();\r\n delete this._features[name];\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * dispose this features manager\r\n */\r\n public dispose(): void {\r\n this.getEnabledFeatures().forEach((feature) => {\r\n this.disableFeature(feature);\r\n });\r\n }\r\n\r\n /**\r\n * Enable a feature using its name and a version. This will enable it in the scene, and will be responsible to attach it when the session starts.\r\n * If used twice, the old version will be disposed and a new one will be constructed. This way you can re-enable with different configuration.\r\n *\r\n * @param featureName the name of the feature to load or the class of the feature\r\n * @param version optional version to load. if not provided the latest version will be enabled\r\n * @param moduleOptions options provided to the module. Ses the module documentation / constructor\r\n * @param attachIfPossible if set to true (default) the feature will be automatically attached, if it is currently possible\r\n * @param required is this feature required to the app. If set to true the session init will fail if the feature is not available.\r\n * @returns a new constructed feature or throws an error if feature not found or conflicts with another enabled feature.\r\n */\r\n public enableFeature(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n featureName: string | { Name: string },\r\n version: number | string = \"latest\",\r\n moduleOptions: any = {},\r\n attachIfPossible: boolean = true,\r\n required: boolean = true\r\n ): IWebXRFeature {\r\n const name = typeof featureName === \"string\" ? featureName : featureName.Name;\r\n let versionToLoad = 0;\r\n if (typeof version === \"string\") {\r\n if (!version) {\r\n throw new Error(`Error in provided version - ${name} (${version})`);\r\n }\r\n if (version === \"stable\") {\r\n versionToLoad = WebXRFeaturesManager.GetStableVersionOfFeature(name);\r\n } else if (version === \"latest\") {\r\n versionToLoad = WebXRFeaturesManager.GetLatestVersionOfFeature(name);\r\n } else {\r\n // try loading the number the string represents\r\n versionToLoad = +version;\r\n }\r\n if (versionToLoad === -1 || isNaN(versionToLoad)) {\r\n throw new Error(`feature not found - ${name} (${version})`);\r\n }\r\n } else {\r\n versionToLoad = version;\r\n }\r\n\r\n // check if there is a feature conflict\r\n const conflictingFeature = WebXRFeaturesManager._ConflictingFeatures[name];\r\n if (conflictingFeature !== undefined && this.getEnabledFeatures().indexOf(conflictingFeature) !== -1) {\r\n throw new Error(`Feature ${name} cannot be enabled while ${conflictingFeature} is enabled.`);\r\n }\r\n\r\n // check if already initialized\r\n const feature = this._features[name];\r\n const constructFunction = WebXRFeaturesManager.ConstructFeature(name, versionToLoad, this._xrSessionManager, moduleOptions);\r\n if (!constructFunction) {\r\n // report error?\r\n throw new Error(`feature not found - ${name}`);\r\n }\r\n\r\n /* If the feature is already enabled, detach and dispose it, and create a new one */\r\n if (feature) {\r\n this.disableFeature(name);\r\n }\r\n\r\n const constructed = constructFunction();\r\n if (constructed.dependsOn) {\r\n const dependentsFound = constructed.dependsOn.every((featureName) => !!this._features[featureName]);\r\n if (!dependentsFound) {\r\n throw new Error(`Dependant features missing. Make sure the following features are enabled - ${constructed.dependsOn.join(\", \")}`);\r\n }\r\n }\r\n if (constructed.isCompatible()) {\r\n this._features[name] = {\r\n featureImplementation: constructed,\r\n enabled: true,\r\n version: versionToLoad,\r\n required,\r\n };\r\n\r\n if (attachIfPossible) {\r\n // if session started already, request and enable\r\n if (this._xrSessionManager.session && !this._features[name].featureImplementation.attached) {\r\n // enable feature\r\n this.attachFeature(name);\r\n }\r\n } else {\r\n // disable auto-attach when session starts\r\n this._features[name].featureImplementation.disableAutoAttach = true;\r\n }\r\n\r\n return this._features[name].featureImplementation;\r\n } else {\r\n if (required) {\r\n throw new Error(\"required feature not compatible\");\r\n } else {\r\n Tools.Warn(`Feature ${name} not compatible with the current environment/browser and was not enabled.`);\r\n return constructed;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * get the implementation of an enabled feature.\r\n * @param featureName the name of the feature to load\r\n * @returns the feature class, if found\r\n */\r\n public getEnabledFeature(featureName: string): IWebXRFeature {\r\n return this._features[featureName] && this._features[featureName].featureImplementation;\r\n }\r\n\r\n /**\r\n * Get the list of enabled features\r\n * @returns an array of enabled features\r\n */\r\n public getEnabledFeatures() {\r\n return Object.keys(this._features);\r\n }\r\n\r\n /**\r\n * This function will extend the session creation configuration object with enabled features.\r\n * If, for example, the anchors feature is enabled, it will be automatically added to the optional or required features list,\r\n * according to the defined \"required\" variable, provided during enableFeature call\r\n * @param xrSessionInit the xr Session init object to extend\r\n *\r\n * @returns an extended XRSessionInit object\r\n */\r\n public async _extendXRSessionInitObject(xrSessionInit: XRSessionInit): Promise {\r\n const enabledFeatures = this.getEnabledFeatures();\r\n for (const featureName of enabledFeatures) {\r\n const feature = this._features[featureName];\r\n const nativeName = feature.featureImplementation.xrNativeFeatureName;\r\n if (nativeName) {\r\n if (feature.required) {\r\n xrSessionInit.requiredFeatures = xrSessionInit.requiredFeatures || [];\r\n if (xrSessionInit.requiredFeatures.indexOf(nativeName) === -1) {\r\n xrSessionInit.requiredFeatures.push(nativeName);\r\n }\r\n } else {\r\n xrSessionInit.optionalFeatures = xrSessionInit.optionalFeatures || [];\r\n if (xrSessionInit.optionalFeatures.indexOf(nativeName) === -1) {\r\n xrSessionInit.optionalFeatures.push(nativeName);\r\n }\r\n }\r\n }\r\n if (feature.featureImplementation.getXRSessionInitExtension) {\r\n const extended = await feature.featureImplementation.getXRSessionInitExtension();\r\n xrSessionInit = {\r\n ...xrSessionInit,\r\n ...extended,\r\n };\r\n }\r\n }\r\n return xrSessionInit;\r\n }\r\n}\r\n", "import type { IWebXRFeature } from \"../webXRFeaturesManager\";\r\nimport type { Observer, EventState } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * This is the base class for all WebXR features.\r\n * Since most features require almost the same resources and callbacks, this class can be used to simplify the development\r\n * Note that since the features manager is using the `IWebXRFeature` you are in no way obligated to use this class\r\n */\r\nexport abstract class WebXRAbstractFeature implements IWebXRFeature {\r\n private _attached: boolean = false;\r\n private _removeOnDetach: {\r\n observer: Nullable>;\r\n observable: Observable;\r\n }[] = [];\r\n\r\n /**\r\n * Is this feature disposed?\r\n */\r\n public isDisposed: boolean = false;\r\n\r\n /**\r\n * Should auto-attach be disabled?\r\n */\r\n public disableAutoAttach: boolean = false;\r\n\r\n protected _xrNativeFeatureName: string = \"\";\r\n\r\n /**\r\n * The name of the native xr feature name (like anchor, hit-test, or hand-tracking)\r\n */\r\n public get xrNativeFeatureName() {\r\n return this._xrNativeFeatureName;\r\n }\r\n\r\n public set xrNativeFeatureName(name: string) {\r\n // check if feature was initialized while in session but needs to be initialized before the session starts\r\n if (!this._xrSessionManager.isNative && name && this._xrSessionManager.inXRSession && this._xrSessionManager.enabledFeatures?.indexOf(name) === -1) {\r\n Logger.Warn(`The feature ${name} needs to be enabled before starting the XR session. Note - It is still possible it is not supported.`);\r\n }\r\n this._xrNativeFeatureName = name;\r\n }\r\n\r\n /**\r\n * Observers registered here will be executed when the feature is attached\r\n */\r\n public onFeatureAttachObservable: Observable = new Observable();\r\n /**\r\n * Observers registered here will be executed when the feature is detached\r\n */\r\n public onFeatureDetachObservable: Observable = new Observable();\r\n\r\n /**\r\n * The dependencies of this feature, if any\r\n */\r\n public dependsOn?: string[];\r\n\r\n /**\r\n * Construct a new (abstract) WebXR feature\r\n * @param _xrSessionManager the xr session manager for this feature\r\n */\r\n constructor(protected _xrSessionManager: WebXRSessionManager) {}\r\n\r\n /**\r\n * Is this feature attached\r\n */\r\n public get attached() {\r\n return this._attached;\r\n }\r\n\r\n /**\r\n * attach this feature\r\n *\r\n * @param force should attachment be forced (even when already attached)\r\n * @returns true if successful, false is failed or already attached\r\n */\r\n public attach(force?: boolean): boolean {\r\n // do not attach a disposed feature\r\n if (this.isDisposed) {\r\n return false;\r\n }\r\n if (!force) {\r\n if (this.attached) {\r\n return false;\r\n }\r\n } else {\r\n if (this.attached) {\r\n // detach first, to be sure\r\n this.detach();\r\n }\r\n }\r\n\r\n // if this is a native WebXR feature, check if it is enabled on the session\r\n // For now only check if not using babylon native\r\n // vision OS doesn't support the enabledFeatures array, so just warn instead of failing\r\n if (!this._xrSessionManager.enabledFeatures) {\r\n Logger.Warn(\"session.enabledFeatures is not available on this device. It is possible that this feature is not supported.\");\r\n } else if (!this._xrSessionManager.isNative && this.xrNativeFeatureName && this._xrSessionManager.enabledFeatures.indexOf(this.xrNativeFeatureName) === -1) {\r\n return false;\r\n }\r\n\r\n this._attached = true;\r\n this._addNewAttachObserver(this._xrSessionManager.onXRFrameObservable, (frame) => this._onXRFrame(frame));\r\n this.onFeatureAttachObservable.notifyObservers(this);\r\n return true;\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n *\r\n * @returns true if successful, false if failed or already detached\r\n */\r\n public detach(): boolean {\r\n if (!this._attached) {\r\n this.disableAutoAttach = true;\r\n return false;\r\n }\r\n this._attached = false;\r\n this._removeOnDetach.forEach((toRemove) => {\r\n toRemove.observable.remove(toRemove.observer);\r\n });\r\n this.onFeatureDetachObservable.notifyObservers(this);\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public dispose(): void {\r\n this.detach();\r\n this.isDisposed = true;\r\n this.onFeatureAttachObservable.clear();\r\n this.onFeatureDetachObservable.clear();\r\n }\r\n\r\n /**\r\n * This function will be executed during before enabling the feature and can be used to not-allow enabling it.\r\n * Note that at this point the session has NOT started, so this is purely checking if the browser supports it\r\n *\r\n * @returns whether or not the feature is compatible in this environment\r\n */\r\n public isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * This is used to register callbacks that will automatically be removed when detach is called.\r\n * @param observable the observable to which the observer will be attached\r\n * @param callback the callback to register\r\n * @param insertFirst should the callback be executed as soon as it is registered\r\n */\r\n protected _addNewAttachObserver(observable: Observable, callback: (eventData: T, eventState: EventState) => void, insertFirst?: boolean) {\r\n this._removeOnDetach.push({\r\n observable,\r\n observer: observable.add(callback, undefined, insertFirst),\r\n });\r\n }\r\n\r\n /**\r\n * Code in this function will be executed on each xrFrame received from the browser.\r\n * This function will not execute after the feature is detached.\r\n * @param _xrFrame the current frame\r\n */\r\n protected abstract _onXRFrame(_xrFrame: XRFrame): void;\r\n}\r\n", "import type { Vector3 } from \"../../Maths/math.vector\";\r\nimport type { IPhysicsEnginePlugin } from \"./IPhysicsEnginePlugin\";\r\n/**\r\n * Interface for Physics-Joint data\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport interface PhysicsJointData {\r\n //Important for some engines, optional!\r\n /**\r\n * The main pivot of the joint\r\n */\r\n mainPivot?: Vector3;\r\n /**\r\n * The connected pivot of the joint\r\n */\r\n connectedPivot?: Vector3;\r\n /**\r\n * The main axis of the joint\r\n */\r\n mainAxis?: Vector3;\r\n /**\r\n * The connected axis of the joint\r\n */\r\n connectedAxis?: Vector3;\r\n /**\r\n * The collision of the joint\r\n */\r\n collision?: boolean;\r\n /**\r\n * Native Oimo/Cannon/Energy data\r\n */\r\n nativeParams?: any;\r\n}\r\n\r\n/**\r\n * This is a holder class for the physics joint created by the physics plugin\r\n * It holds a set of functions to control the underlying joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport class PhysicsJoint {\r\n private _physicsJoint: any;\r\n protected _physicsPlugin: IPhysicsEnginePlugin;\r\n\r\n /**\r\n * Initializes the physics joint\r\n * @param type The type of the physics joint\r\n * @param jointData The data for the physics joint\r\n */\r\n constructor(\r\n /**\r\n * The type of the physics joint\r\n */\r\n public type: number,\r\n /**\r\n * The data for the physics joint\r\n */\r\n public jointData: PhysicsJointData\r\n ) {\r\n jointData.nativeParams = jointData.nativeParams || {};\r\n }\r\n\r\n /**\r\n * Gets the physics joint\r\n */\r\n public get physicsJoint(): any {\r\n return this._physicsJoint;\r\n }\r\n\r\n /**\r\n * Sets the physics joint\r\n */\r\n public set physicsJoint(newJoint: any) {\r\n if (this._physicsJoint) {\r\n //remove from the world\r\n }\r\n\r\n this._physicsJoint = newJoint;\r\n }\r\n\r\n /**\r\n * Sets the physics plugin\r\n */\r\n public set physicsPlugin(physicsPlugin: IPhysicsEnginePlugin) {\r\n this._physicsPlugin = physicsPlugin;\r\n }\r\n\r\n /**\r\n * Execute a function that is physics-plugin specific.\r\n * @param {Function} func the function that will be executed.\r\n * It accepts two parameters: the physics world and the physics joint\r\n */\r\n public executeNativeFunction(func: (world: any, physicsJoint: any) => void) {\r\n func(this._physicsPlugin.world, this._physicsJoint);\r\n }\r\n\r\n //TODO check if the native joints are the same\r\n\r\n //Joint Types\r\n /**\r\n * Distance-Joint type\r\n */\r\n public static DistanceJoint = 0;\r\n /**\r\n * Hinge-Joint type\r\n */\r\n public static HingeJoint = 1;\r\n /**\r\n * Ball-and-Socket joint type\r\n */\r\n public static BallAndSocketJoint = 2;\r\n /**\r\n * Wheel-Joint type\r\n */\r\n public static WheelJoint = 3;\r\n /**\r\n * Slider-Joint type\r\n */\r\n public static SliderJoint = 4;\r\n //OIMO\r\n /**\r\n * Prismatic-Joint type\r\n */\r\n public static PrismaticJoint = 5;\r\n //\r\n /**\r\n * Universal-Joint type\r\n * ENERGY FTW! (compare with this - @see http://ode-wiki.org/wiki/index.php?title=Manual:_Joint_Types_and_Functions)\r\n */\r\n public static UniversalJoint = 6;\r\n /**\r\n * Hinge-Joint 2 type\r\n */\r\n public static Hinge2Joint = PhysicsJoint.WheelJoint;\r\n //Cannon\r\n /**\r\n * Point to Point Joint type. Similar to a Ball-Joint. Different in parameters\r\n */\r\n public static PointToPointJoint = 8;\r\n //Cannon only at the moment\r\n /**\r\n * Spring-Joint type\r\n */\r\n public static SpringJoint = 9;\r\n /**\r\n * Lock-Joint type\r\n */\r\n public static LockJoint = 10;\r\n}\r\n\r\n/**\r\n * A class representing a physics distance joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport class DistanceJoint extends PhysicsJoint {\r\n /**\r\n *\r\n * @param jointData The data for the Distance-Joint\r\n */\r\n constructor(jointData: DistanceJointData) {\r\n super(PhysicsJoint.DistanceJoint, jointData);\r\n }\r\n\r\n /**\r\n * Update the predefined distance.\r\n * @param maxDistance The maximum preferred distance\r\n * @param minDistance The minimum preferred distance\r\n */\r\n public updateDistance(maxDistance: number, minDistance?: number) {\r\n this._physicsPlugin.updateDistanceJoint(this, maxDistance, minDistance);\r\n }\r\n}\r\n\r\n/**\r\n * Represents a Motor-Enabled Joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport class MotorEnabledJoint extends PhysicsJoint implements IMotorEnabledJoint {\r\n /**\r\n * Initializes the Motor-Enabled Joint\r\n * @param type The type of the joint\r\n * @param jointData The physical joint data for the joint\r\n */\r\n constructor(type: number, jointData: PhysicsJointData) {\r\n super(type, jointData);\r\n }\r\n\r\n /**\r\n * Set the motor values.\r\n * Attention, this function is plugin specific. Engines won't react 100% the same.\r\n * @param force the force to apply\r\n * @param maxForce max force for this motor.\r\n */\r\n public setMotor(force?: number, maxForce?: number) {\r\n this._physicsPlugin.setMotor(this, force || 0, maxForce);\r\n }\r\n\r\n /**\r\n * Set the motor's limits.\r\n * Attention, this function is plugin specific. Engines won't react 100% the same.\r\n * @param upperLimit The upper limit of the motor\r\n * @param lowerLimit The lower limit of the motor\r\n */\r\n public setLimit(upperLimit: number, lowerLimit?: number) {\r\n this._physicsPlugin.setLimit(this, upperLimit, lowerLimit);\r\n }\r\n}\r\n\r\n/**\r\n * This class represents a single physics Hinge-Joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport class HingeJoint extends MotorEnabledJoint {\r\n /**\r\n * Initializes the Hinge-Joint\r\n * @param jointData The joint data for the Hinge-Joint\r\n */\r\n constructor(jointData: PhysicsJointData) {\r\n super(PhysicsJoint.HingeJoint, jointData);\r\n }\r\n\r\n /**\r\n * Set the motor values.\r\n * Attention, this function is plugin specific. Engines won't react 100% the same.\r\n * @param {number} force the force to apply\r\n * @param {number} maxForce max force for this motor.\r\n */\r\n public setMotor(force?: number, maxForce?: number) {\r\n this._physicsPlugin.setMotor(this, force || 0, maxForce);\r\n }\r\n\r\n /**\r\n * Set the motor's limits.\r\n * Attention, this function is plugin specific. Engines won't react 100% the same.\r\n * @param upperLimit The upper limit of the motor\r\n * @param lowerLimit The lower limit of the motor\r\n */\r\n public setLimit(upperLimit: number, lowerLimit?: number) {\r\n this._physicsPlugin.setLimit(this, upperLimit, lowerLimit);\r\n }\r\n}\r\n\r\n/**\r\n * This class represents a dual hinge physics joint (same as wheel joint)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport class Hinge2Joint extends MotorEnabledJoint {\r\n /**\r\n * Initializes the Hinge2-Joint\r\n * @param jointData The joint data for the Hinge2-Joint\r\n */\r\n constructor(jointData: PhysicsJointData) {\r\n super(PhysicsJoint.Hinge2Joint, jointData);\r\n }\r\n\r\n /**\r\n * Set the motor values.\r\n * Attention, this function is plugin specific. Engines won't react 100% the same.\r\n * @param targetSpeed the speed the motor is to reach\r\n * @param maxForce max force for this motor.\r\n * @param motorIndex motor's index, 0 or 1.\r\n */\r\n public setMotor(targetSpeed?: number, maxForce?: number, motorIndex: number = 0) {\r\n this._physicsPlugin.setMotor(this, targetSpeed || 0, maxForce, motorIndex);\r\n }\r\n\r\n /**\r\n * Set the motor limits.\r\n * Attention, this function is plugin specific. Engines won't react 100% the same.\r\n * @param upperLimit the upper limit\r\n * @param lowerLimit lower limit\r\n * @param motorIndex the motor's index, 0 or 1.\r\n */\r\n public setLimit(upperLimit: number, lowerLimit?: number, motorIndex: number = 0) {\r\n this._physicsPlugin.setLimit(this, upperLimit, lowerLimit, motorIndex);\r\n }\r\n}\r\n\r\n/**\r\n * Interface for a motor enabled joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport interface IMotorEnabledJoint {\r\n /**\r\n * Physics joint\r\n */\r\n physicsJoint: any;\r\n /**\r\n * Sets the motor of the motor-enabled joint\r\n * @param force The force of the motor\r\n * @param maxForce The maximum force of the motor\r\n * @param motorIndex The index of the motor\r\n */\r\n setMotor(force?: number, maxForce?: number, motorIndex?: number): void;\r\n /**\r\n * Sets the limit of the motor\r\n * @param upperLimit The upper limit of the motor\r\n * @param lowerLimit The lower limit of the motor\r\n * @param motorIndex The index of the motor\r\n */\r\n setLimit(upperLimit: number, lowerLimit?: number, motorIndex?: number): void;\r\n}\r\n\r\n/**\r\n * Joint data for a Distance-Joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport interface DistanceJointData extends PhysicsJointData {\r\n /**\r\n * Max distance the 2 joint objects can be apart\r\n */\r\n maxDistance: number;\r\n //Oimo - minDistance\r\n //Cannon - maxForce\r\n}\r\n\r\n/**\r\n * Joint data from a spring joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport interface SpringJointData extends PhysicsJointData {\r\n /**\r\n * Length of the spring\r\n */\r\n length: number;\r\n /**\r\n * Stiffness of the spring\r\n */\r\n stiffness: number;\r\n /**\r\n * Damping of the spring\r\n */\r\n damping: number;\r\n /** this callback will be called when applying the force to the impostors. */\r\n forceApplicationCallback: () => void;\r\n}\r\n", "import type { Nullable, IndicesArray } from \"../../types\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { ArrayTools } from \"../../Misc/arrayTools\";\r\nimport type { Matrix } from \"../../Maths/math.vector\";\r\nimport { Vector3, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Bone } from \"../../Bones/bone\";\r\nimport type { BoundingInfo } from \"../../Culling/boundingInfo\";\r\nimport type { PhysicsEngine as PhysicsEngineV1 } from \"./physicsEngine\";\r\n\r\nimport type { PhysicsJointData } from \"./physicsJoint\";\r\nimport { PhysicsJoint } from \"./physicsJoint\";\r\nimport { Space } from \"../../Maths/math.axis\";\r\n\r\n/**\r\n * The interface for the physics imposter parameters\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport interface PhysicsImpostorParameters {\r\n /**\r\n * The mass of the physics imposter\r\n */\r\n mass: number;\r\n /**\r\n * The friction of the physics imposter\r\n */\r\n friction?: number;\r\n /**\r\n * The coefficient of restitution of the physics imposter\r\n */\r\n restitution?: number;\r\n /**\r\n * The native options of the physics imposter\r\n */\r\n nativeOptions?: any;\r\n /**\r\n * Specifies if the parent should be ignored\r\n */\r\n ignoreParent?: boolean;\r\n /**\r\n * Specifies if bi-directional transformations should be disabled\r\n */\r\n disableBidirectionalTransformation?: boolean;\r\n /**\r\n * The pressure inside the physics imposter, soft object only\r\n */\r\n pressure?: number;\r\n /**\r\n * The stiffness the physics imposter, soft object only\r\n */\r\n stiffness?: number;\r\n /**\r\n * The number of iterations used in maintaining consistent vertex velocities, soft object only\r\n */\r\n velocityIterations?: number;\r\n /**\r\n * The number of iterations used in maintaining consistent vertex positions, soft object only\r\n */\r\n positionIterations?: number;\r\n /**\r\n * The number used to fix points on a cloth (0, 1, 2, 4, 8) or rope (0, 1, 2) only\r\n * 0 None, 1, back left or top, 2, back right or bottom, 4, front left, 8, front right\r\n * Add to fix multiple points\r\n */\r\n fixedPoints?: number;\r\n /**\r\n * The collision margin around a soft object\r\n */\r\n margin?: number;\r\n /**\r\n * The collision margin around a soft object\r\n */\r\n damping?: number;\r\n /**\r\n * The path for a rope based on an extrusion\r\n */\r\n path?: any;\r\n /**\r\n * The shape of an extrusion used for a rope based on an extrusion\r\n */\r\n shape?: any;\r\n}\r\n\r\n/**\r\n * Interface for a physics-enabled object\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport interface IPhysicsEnabledObject {\r\n /**\r\n * The position of the physics-enabled object\r\n */\r\n position: Vector3;\r\n /**\r\n * The rotation of the physics-enabled object\r\n */\r\n rotationQuaternion: Nullable;\r\n /**\r\n * The scale of the physics-enabled object\r\n */\r\n scaling: Vector3;\r\n /**\r\n * The rotation of the physics-enabled object\r\n */\r\n rotation?: Vector3;\r\n /**\r\n * The parent of the physics-enabled object\r\n */\r\n parent?: any;\r\n /**\r\n * The bounding info of the physics-enabled object\r\n * @returns The bounding info of the physics-enabled object\r\n */\r\n getBoundingInfo(): BoundingInfo;\r\n /**\r\n * Computes the world matrix\r\n * @param force Specifies if the world matrix should be computed by force\r\n * @returns A world matrix\r\n */\r\n computeWorldMatrix(force: boolean): Matrix;\r\n /**\r\n * Gets the world matrix\r\n * @returns A world matrix\r\n */\r\n getWorldMatrix?(): Matrix;\r\n /**\r\n * Gets the child meshes\r\n * @param directDescendantsOnly Specifies if only direct-descendants should be obtained\r\n * @returns An array of abstract meshes\r\n */\r\n getChildMeshes?(directDescendantsOnly?: boolean): Array;\r\n /**\r\n * Gets the vertex data\r\n * @param kind The type of vertex data\r\n * @returns A nullable array of numbers, or a float32 array\r\n */\r\n getVerticesData(kind: string): Nullable | Float32Array>;\r\n /**\r\n * Gets the indices from the mesh\r\n * @returns A nullable array of index arrays\r\n */\r\n getIndices?(): Nullable;\r\n /**\r\n * Gets the scene from the mesh\r\n * @returns the indices array or null\r\n */\r\n getScene?(): Scene;\r\n /**\r\n * Gets the absolute position from the mesh\r\n * @returns the absolute position\r\n */\r\n getAbsolutePosition(): Vector3;\r\n /**\r\n * Gets the absolute pivot point from the mesh\r\n * @returns the absolute pivot point\r\n */\r\n getAbsolutePivotPoint(): Vector3;\r\n /**\r\n * Rotates the mesh\r\n * @param axis The axis of rotation\r\n * @param amount The amount of rotation\r\n * @param space The space of the rotation\r\n * @returns The rotation transform node\r\n */\r\n rotate(axis: Vector3, amount: number, space?: Space): TransformNode;\r\n /**\r\n * Translates the mesh\r\n * @param axis The axis of translation\r\n * @param distance The distance of translation\r\n * @param space The space of the translation\r\n * @returns The transform node\r\n */\r\n translate(axis: Vector3, distance: number, space?: Space): TransformNode;\r\n /**\r\n * Sets the absolute position of the mesh\r\n * @param absolutePosition The absolute position of the mesh\r\n * @returns The transform node\r\n */\r\n setAbsolutePosition(absolutePosition: Vector3): TransformNode;\r\n /**\r\n * Gets the class name of the mesh\r\n * @returns The class name\r\n */\r\n getClassName(): string;\r\n}\r\n\r\nMesh._PhysicsImpostorParser = function (scene: Scene, physicObject: IPhysicsEnabledObject, jsonObject: any): PhysicsImpostor {\r\n return new PhysicsImpostor(\r\n physicObject,\r\n jsonObject.physicsImpostor,\r\n {\r\n mass: jsonObject.physicsMass,\r\n friction: jsonObject.physicsFriction,\r\n restitution: jsonObject.physicsRestitution,\r\n },\r\n scene\r\n );\r\n};\r\n\r\n/**\r\n * Represents a physics imposter\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport class PhysicsImpostor {\r\n /**\r\n * The default object size of the imposter\r\n */\r\n public static DEFAULT_OBJECT_SIZE: Vector3 = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * The identity quaternion of the imposter\r\n */\r\n public static IDENTITY_QUATERNION = Quaternion.Identity();\r\n\r\n /** @internal */\r\n public _pluginData: any = {};\r\n\r\n private _physicsEngine: Nullable;\r\n //The native cannon/oimo/energy physics body object.\r\n private _physicsBody: any;\r\n private _bodyUpdateRequired: boolean = false;\r\n\r\n private _onBeforePhysicsStepCallbacks = new Array<(impostor: PhysicsImpostor) => void>();\r\n private _onAfterPhysicsStepCallbacks = new Array<(impostor: PhysicsImpostor) => void>();\r\n /** @internal */\r\n public _onPhysicsCollideCallbacks: Array<{\r\n callback: (collider: PhysicsImpostor, collidedAgainst: PhysicsImpostor, point: Nullable, distance: number, impulse: number, normal: Nullable) => void;\r\n otherImpostors: Array;\r\n }> = [];\r\n\r\n private _deltaPosition: Vector3 = Vector3.Zero();\r\n private _deltaRotation: Quaternion;\r\n private _deltaRotationConjugated: Quaternion;\r\n\r\n /** @internal */\r\n public _isFromLine: boolean;\r\n\r\n //If set, this is this impostor's parent\r\n private _parent: Nullable;\r\n\r\n private _isDisposed = false;\r\n\r\n private static _TmpVecs: Vector3[] = ArrayTools.BuildArray(3, Vector3.Zero);\r\n private static _TmpQuat: Quaternion = Quaternion.Identity();\r\n\r\n /**\r\n * Specifies if the physics imposter is disposed\r\n */\r\n get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * Gets the mass of the physics imposter\r\n */\r\n get mass(): number {\r\n return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyMass(this) : 0;\r\n }\r\n\r\n set mass(value: number) {\r\n this.setMass(value);\r\n }\r\n\r\n /**\r\n * Gets the coefficient of friction\r\n */\r\n get friction(): number {\r\n return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyFriction(this) : 0;\r\n }\r\n\r\n /**\r\n * Sets the coefficient of friction\r\n */\r\n set friction(value: number) {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n this._physicsEngine.getPhysicsPlugin().setBodyFriction(this, value);\r\n }\r\n\r\n /**\r\n * Gets the coefficient of restitution\r\n */\r\n get restitution(): number {\r\n return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyRestitution(this) : 0;\r\n }\r\n\r\n /**\r\n * Sets the coefficient of restitution\r\n */\r\n set restitution(value: number) {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n this._physicsEngine.getPhysicsPlugin().setBodyRestitution(this, value);\r\n }\r\n\r\n /**\r\n * Gets the pressure of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n get pressure(): number {\r\n if (!this._physicsEngine) {\r\n return 0;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.setBodyPressure) {\r\n return 0;\r\n }\r\n return plugin.getBodyPressure!(this);\r\n }\r\n\r\n /**\r\n * Sets the pressure of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n set pressure(value: number) {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.setBodyPressure) {\r\n return;\r\n }\r\n plugin.setBodyPressure!(this, value);\r\n }\r\n\r\n /**\r\n * Gets the stiffness of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n get stiffness(): number {\r\n if (!this._physicsEngine) {\r\n return 0;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.getBodyStiffness) {\r\n return 0;\r\n }\r\n return plugin.getBodyStiffness!(this);\r\n }\r\n\r\n /**\r\n * Sets the stiffness of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n set stiffness(value: number) {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.setBodyStiffness) {\r\n return;\r\n }\r\n plugin.setBodyStiffness!(this, value);\r\n }\r\n\r\n /**\r\n * Gets the velocityIterations of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n get velocityIterations(): number {\r\n if (!this._physicsEngine) {\r\n return 0;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.getBodyVelocityIterations) {\r\n return 0;\r\n }\r\n return plugin.getBodyVelocityIterations!(this);\r\n }\r\n\r\n /**\r\n * Sets the velocityIterations of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n set velocityIterations(value: number) {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.setBodyVelocityIterations) {\r\n return;\r\n }\r\n plugin.setBodyVelocityIterations!(this, value);\r\n }\r\n\r\n /**\r\n * Gets the positionIterations of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n get positionIterations(): number {\r\n if (!this._physicsEngine) {\r\n return 0;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.getBodyPositionIterations) {\r\n return 0;\r\n }\r\n return plugin.getBodyPositionIterations!(this);\r\n }\r\n\r\n /**\r\n * Sets the positionIterations of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n set positionIterations(value: number) {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.setBodyPositionIterations) {\r\n return;\r\n }\r\n plugin.setBodyPositionIterations!(this, value);\r\n }\r\n\r\n /**\r\n * The unique id of the physics imposter\r\n * set by the physics engine when adding this impostor to the array\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * @internal\r\n */\r\n public soft: boolean = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public segments: number = 0;\r\n\r\n private _joints: Array<{\r\n joint: PhysicsJoint;\r\n otherImpostor: PhysicsImpostor;\r\n }>;\r\n\r\n /**\r\n * Initializes the physics imposter\r\n * @param object The physics-enabled object used as the physics imposter\r\n * @param type The type of the physics imposter. Types are available as static members of this class.\r\n * @param _options The options for the physics imposter\r\n * @param _scene The Babylon scene\r\n */\r\n constructor(\r\n /**\r\n * The physics-enabled object used as the physics imposter\r\n */\r\n public object: IPhysicsEnabledObject,\r\n /**\r\n * The type of the physics imposter\r\n */\r\n public type: number,\r\n private _options: PhysicsImpostorParameters = { mass: 0 },\r\n private _scene?: Scene\r\n ) {\r\n //sanity check!\r\n if (!this.object) {\r\n Logger.Error(\"No object was provided. A physics object is obligatory\");\r\n return;\r\n }\r\n if (this.object.parent && _options.mass !== 0) {\r\n Logger.Warn(\"A physics impostor has been created for an object which has a parent. Babylon physics currently works in local space so unexpected issues may occur.\");\r\n }\r\n\r\n // Legacy support for old syntax.\r\n if (!this._scene && object.getScene) {\r\n this._scene = object.getScene();\r\n }\r\n\r\n if (!this._scene) {\r\n return;\r\n }\r\n\r\n if (this.type > 100) {\r\n this.soft = true;\r\n }\r\n\r\n this._physicsEngine = this._scene.getPhysicsEngine() as any;\r\n if (!this._physicsEngine) {\r\n Logger.Error(\"Physics not enabled. Please use scene.enablePhysics(...) before creating impostors.\");\r\n } else {\r\n //set the object's quaternion, if not set\r\n if (!this.object.rotationQuaternion) {\r\n if (this.object.rotation) {\r\n this.object.rotationQuaternion = Quaternion.RotationYawPitchRoll(this.object.rotation.y, this.object.rotation.x, this.object.rotation.z);\r\n } else {\r\n this.object.rotationQuaternion = new Quaternion();\r\n }\r\n }\r\n //default options params\r\n this._options.mass = _options.mass === void 0 ? 0 : _options.mass;\r\n this._options.friction = _options.friction === void 0 ? 0.2 : _options.friction;\r\n this._options.restitution = _options.restitution === void 0 ? 0.2 : _options.restitution;\r\n if (this.soft) {\r\n //softbody mass must be above 0;\r\n this._options.mass = this._options.mass > 0 ? this._options.mass : 1;\r\n this._options.pressure = _options.pressure === void 0 ? 200 : _options.pressure;\r\n this._options.stiffness = _options.stiffness === void 0 ? 1 : _options.stiffness;\r\n this._options.velocityIterations = _options.velocityIterations === void 0 ? 20 : _options.velocityIterations;\r\n this._options.positionIterations = _options.positionIterations === void 0 ? 20 : _options.positionIterations;\r\n this._options.fixedPoints = _options.fixedPoints === void 0 ? 0 : _options.fixedPoints;\r\n this._options.margin = _options.margin === void 0 ? 0 : _options.margin;\r\n this._options.damping = _options.damping === void 0 ? 0 : _options.damping;\r\n this._options.path = _options.path === void 0 ? null : _options.path;\r\n this._options.shape = _options.shape === void 0 ? null : _options.shape;\r\n }\r\n this._joints = [];\r\n //If the mesh has a parent, don't initialize the physicsBody. Instead wait for the parent to do that.\r\n if (!this.object.parent || this._options.ignoreParent) {\r\n this._init();\r\n } else if (this.object.parent.physicsImpostor) {\r\n Logger.Warn(\"You must affect impostors to children before affecting impostor to parent.\");\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This function will completely initialize this impostor.\r\n * It will create a new body - but only if this mesh has no parent.\r\n * If it has, this impostor will not be used other than to define the impostor\r\n * of the child mesh.\r\n * @internal\r\n */\r\n public _init() {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n\r\n this._physicsEngine.removeImpostor(this);\r\n this.physicsBody = null;\r\n this._parent = this._parent || this._getPhysicsParent();\r\n if (!this._isDisposed && (!this.parent || this._options.ignoreParent)) {\r\n this._physicsEngine.addImpostor(this);\r\n }\r\n }\r\n\r\n private _getPhysicsParent(): Nullable {\r\n if (this.object.parent instanceof AbstractMesh) {\r\n const parentMesh: AbstractMesh = this.object.parent;\r\n return parentMesh.physicsImpostor;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Should a new body be generated.\r\n * @returns boolean specifying if body initialization is required\r\n */\r\n public isBodyInitRequired(): boolean {\r\n return this._bodyUpdateRequired || (!this._physicsBody && (!this._parent || !!this._options.ignoreParent));\r\n }\r\n\r\n /**\r\n * Sets the updated scaling\r\n */\r\n public setScalingUpdated() {\r\n this.forceUpdate();\r\n }\r\n\r\n /**\r\n * Force a regeneration of this or the parent's impostor's body.\r\n * Use with caution - This will remove all previously-instantiated joints.\r\n */\r\n public forceUpdate() {\r\n this._init();\r\n if (this.parent && !this._options.ignoreParent) {\r\n this.parent.forceUpdate();\r\n }\r\n }\r\n\r\n /*public get mesh(): AbstractMesh {\r\n return this._mesh;\r\n }*/\r\n\r\n /**\r\n * Gets the body that holds this impostor. Either its own, or its parent.\r\n */\r\n public get physicsBody(): any {\r\n return this._parent && !this._options.ignoreParent ? this._parent.physicsBody : this._physicsBody;\r\n }\r\n\r\n /**\r\n * Get the parent of the physics imposter\r\n * @returns Physics imposter or null\r\n */\r\n public get parent(): Nullable {\r\n return !this._options.ignoreParent && this._parent ? this._parent : null;\r\n }\r\n\r\n /**\r\n * Sets the parent of the physics imposter\r\n */\r\n public set parent(value: Nullable) {\r\n this._parent = value;\r\n }\r\n\r\n /**\r\n * Set the physics body. Used mainly by the physics engine/plugin\r\n */\r\n public set physicsBody(physicsBody: any) {\r\n if (this._physicsBody && this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().removePhysicsBody(this);\r\n }\r\n this._physicsBody = physicsBody;\r\n this.resetUpdateFlags();\r\n }\r\n\r\n /**\r\n * Resets the update flags\r\n */\r\n public resetUpdateFlags() {\r\n this._bodyUpdateRequired = false;\r\n }\r\n\r\n /**\r\n * Gets the object extents\r\n * @returns the object extents\r\n */\r\n public getObjectExtents(): Vector3 {\r\n if (this.object.getBoundingInfo) {\r\n const q = this.object.rotationQuaternion;\r\n const scaling = this.object.scaling.clone();\r\n //reset rotation\r\n this.object.rotationQuaternion = PhysicsImpostor.IDENTITY_QUATERNION;\r\n //calculate the world matrix with no rotation\r\n const worldMatrix = this.object.computeWorldMatrix && this.object.computeWorldMatrix(true);\r\n if (worldMatrix) {\r\n worldMatrix.decompose(scaling, undefined, undefined);\r\n }\r\n const boundingInfo = this.object.getBoundingInfo();\r\n // get the global scaling of the object\r\n const size = boundingInfo.boundingBox.extendSize.scale(2).multiplyInPlace(scaling);\r\n size.x = Math.abs(size.x);\r\n size.y = Math.abs(size.y);\r\n size.z = Math.abs(size.z);\r\n //bring back the rotation\r\n this.object.rotationQuaternion = q;\r\n //calculate the world matrix with the new rotation\r\n this.object.computeWorldMatrix && this.object.computeWorldMatrix(true);\r\n return size;\r\n } else {\r\n return PhysicsImpostor.DEFAULT_OBJECT_SIZE;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the object center\r\n * @returns The object center\r\n */\r\n public getObjectCenter(): Vector3 {\r\n if (this.object.getBoundingInfo) {\r\n const boundingInfo = this.object.getBoundingInfo();\r\n return boundingInfo.boundingBox.centerWorld;\r\n } else {\r\n return this.object.position;\r\n }\r\n }\r\n\r\n /**\r\n * Get a specific parameter from the options parameters\r\n * @param paramName The object parameter name\r\n * @returns The object parameter\r\n */\r\n public getParam(paramName: string): any {\r\n return (this._options)[paramName];\r\n }\r\n\r\n /**\r\n * Sets a specific parameter in the options given to the physics plugin\r\n * @param paramName The parameter name\r\n * @param value The value of the parameter\r\n */\r\n public setParam(paramName: string, value: number) {\r\n (this._options)[paramName] = value;\r\n this._bodyUpdateRequired = true;\r\n }\r\n\r\n /**\r\n * Specifically change the body's mass. Won't recreate the physics body object\r\n * @param mass The mass of the physics imposter\r\n */\r\n public setMass(mass: number) {\r\n if (this.getParam(\"mass\") !== mass) {\r\n this.setParam(\"mass\", mass);\r\n }\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().setBodyMass(this, mass);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the linear velocity\r\n * @returns linear velocity or null\r\n */\r\n public getLinearVelocity(): Nullable {\r\n return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getLinearVelocity(this) : Vector3.Zero();\r\n }\r\n\r\n /**\r\n * Sets the linear velocity\r\n * @param velocity linear velocity or null\r\n */\r\n public setLinearVelocity(velocity: Nullable) {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().setLinearVelocity(this, velocity);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the angular velocity\r\n * @returns angular velocity or null\r\n */\r\n public getAngularVelocity(): Nullable {\r\n return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getAngularVelocity(this) : Vector3.Zero();\r\n }\r\n\r\n /**\r\n * Sets the angular velocity\r\n * @param velocity The velocity or null\r\n */\r\n public setAngularVelocity(velocity: Nullable) {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().setAngularVelocity(this, velocity);\r\n }\r\n }\r\n\r\n /**\r\n * Execute a function with the physics plugin native code\r\n * Provide a function the will have two variables - the world object and the physics body object\r\n * @param func The function to execute with the physics plugin native code\r\n */\r\n public executeNativeFunction(func: (world: any, physicsBody: any) => void) {\r\n if (this._physicsEngine) {\r\n func(this._physicsEngine.getPhysicsPlugin().world, this.physicsBody);\r\n }\r\n }\r\n\r\n /**\r\n * Register a function that will be executed before the physics world is stepping forward\r\n * @param func The function to execute before the physics world is stepped forward\r\n */\r\n public registerBeforePhysicsStep(func: (impostor: PhysicsImpostor) => void): void {\r\n this._onBeforePhysicsStepCallbacks.push(func);\r\n }\r\n\r\n /**\r\n * Unregister a function that will be executed before the physics world is stepping forward\r\n * @param func The function to execute before the physics world is stepped forward\r\n */\r\n public unregisterBeforePhysicsStep(func: (impostor: PhysicsImpostor) => void): void {\r\n const index = this._onBeforePhysicsStepCallbacks.indexOf(func);\r\n\r\n if (index > -1) {\r\n this._onBeforePhysicsStepCallbacks.splice(index, 1);\r\n } else {\r\n Logger.Warn(\"Function to remove was not found\");\r\n }\r\n }\r\n\r\n /**\r\n * Register a function that will be executed after the physics step\r\n * @param func The function to execute after physics step\r\n */\r\n public registerAfterPhysicsStep(func: (impostor: PhysicsImpostor) => void): void {\r\n this._onAfterPhysicsStepCallbacks.push(func);\r\n }\r\n\r\n /**\r\n * Unregisters a function that will be executed after the physics step\r\n * @param func The function to execute after physics step\r\n */\r\n public unregisterAfterPhysicsStep(func: (impostor: PhysicsImpostor) => void): void {\r\n const index = this._onAfterPhysicsStepCallbacks.indexOf(func);\r\n\r\n if (index > -1) {\r\n this._onAfterPhysicsStepCallbacks.splice(index, 1);\r\n } else {\r\n Logger.Warn(\"Function to remove was not found\");\r\n }\r\n }\r\n\r\n /**\r\n * register a function that will be executed when this impostor collides against a different body\r\n * @param collideAgainst Physics imposter, or array of physics imposters to collide against\r\n * @param func Callback that is executed on collision\r\n */\r\n public registerOnPhysicsCollide(\r\n collideAgainst: PhysicsImpostor | Array,\r\n func: (collider: PhysicsImpostor, collidedAgainst: PhysicsImpostor, point: Nullable) => void\r\n ): void {\r\n const collidedAgainstList: Array = collideAgainst instanceof Array ? >collideAgainst : [collideAgainst];\r\n this._onPhysicsCollideCallbacks.push({ callback: func, otherImpostors: collidedAgainstList });\r\n }\r\n\r\n /**\r\n * Unregisters the physics imposter's collision callback\r\n * @param collideAgainst The physics object to collide against\r\n * @param func Callback to execute on collision\r\n */\r\n public unregisterOnPhysicsCollide(\r\n collideAgainst: PhysicsImpostor | Array,\r\n func: (collider: PhysicsImpostor, collidedAgainst: PhysicsImpostor | Array, point: Nullable) => void\r\n ): void {\r\n const collidedAgainstList: Array = collideAgainst instanceof Array ? >collideAgainst : [collideAgainst];\r\n let index = -1;\r\n const found = this._onPhysicsCollideCallbacks.some((cbDef, idx) => {\r\n if (cbDef.callback === func && cbDef.otherImpostors.length === collidedAgainstList.length) {\r\n // chcek the arrays match\r\n const sameList = cbDef.otherImpostors.every((impostor) => {\r\n return collidedAgainstList.indexOf(impostor) > -1;\r\n });\r\n if (sameList) {\r\n index = idx;\r\n }\r\n return sameList;\r\n }\r\n return false;\r\n });\r\n\r\n if (found) {\r\n this._onPhysicsCollideCallbacks.splice(index, 1);\r\n } else {\r\n Logger.Warn(\"Function to remove was not found\");\r\n }\r\n }\r\n\r\n //temp variables for parent rotation calculations\r\n //private _mats: Array = [new Matrix(), new Matrix()];\r\n private _tmpQuat: Quaternion = new Quaternion();\r\n private _tmpQuat2: Quaternion = new Quaternion();\r\n\r\n /**\r\n * Get the parent rotation\r\n * @returns The parent rotation\r\n */\r\n public getParentsRotation(): Quaternion {\r\n let parent = this.object.parent;\r\n this._tmpQuat.copyFromFloats(0, 0, 0, 1);\r\n while (parent) {\r\n if (parent.rotationQuaternion) {\r\n this._tmpQuat2.copyFrom(parent.rotationQuaternion);\r\n } else {\r\n Quaternion.RotationYawPitchRollToRef(parent.rotation.y, parent.rotation.x, parent.rotation.z, this._tmpQuat2);\r\n }\r\n this._tmpQuat.multiplyToRef(this._tmpQuat2, this._tmpQuat);\r\n parent = parent.parent;\r\n }\r\n return this._tmpQuat;\r\n }\r\n\r\n /**\r\n * this function is executed by the physics engine.\r\n */\r\n public beforeStep = () => {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n\r\n this.object.translate(this._deltaPosition, -1);\r\n this._deltaRotationConjugated &&\r\n this.object.rotationQuaternion &&\r\n this.object.rotationQuaternion.multiplyToRef(this._deltaRotationConjugated, this.object.rotationQuaternion);\r\n this.object.computeWorldMatrix(false);\r\n if (this.object.parent && this.object.rotationQuaternion) {\r\n this.getParentsRotation();\r\n this._tmpQuat.multiplyToRef(this.object.rotationQuaternion, this._tmpQuat);\r\n } else {\r\n this._tmpQuat.copyFrom(this.object.rotationQuaternion || new Quaternion());\r\n }\r\n if (!this._options.disableBidirectionalTransformation) {\r\n this.object.rotationQuaternion &&\r\n this._physicsEngine.getPhysicsPlugin().setPhysicsBodyTransformation(this, /*bInfo.boundingBox.centerWorld*/ this.object.getAbsolutePosition(), this._tmpQuat);\r\n }\r\n\r\n this._onBeforePhysicsStepCallbacks.forEach((func) => {\r\n func(this);\r\n });\r\n };\r\n\r\n /**\r\n * this function is executed by the physics engine\r\n */\r\n public afterStep = () => {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n\r\n this._onAfterPhysicsStepCallbacks.forEach((func) => {\r\n func(this);\r\n });\r\n\r\n this._physicsEngine.getPhysicsPlugin().setTransformationFromPhysicsBody(this);\r\n // object has now its world rotation. needs to be converted to local.\r\n if (this.object.parent && this.object.rotationQuaternion) {\r\n this.getParentsRotation();\r\n this._tmpQuat.conjugateInPlace();\r\n this._tmpQuat.multiplyToRef(this.object.rotationQuaternion, this.object.rotationQuaternion);\r\n }\r\n // take the position set and make it the absolute position of this object.\r\n this.object.setAbsolutePosition(this.object.position);\r\n if (this._deltaRotation) {\r\n this.object.rotationQuaternion && this.object.rotationQuaternion.multiplyToRef(this._deltaRotation, this.object.rotationQuaternion);\r\n this._deltaPosition.applyRotationQuaternionToRef(this._deltaRotation, PhysicsImpostor._TmpVecs[0]);\r\n this.object.translate(PhysicsImpostor._TmpVecs[0], 1);\r\n } else {\r\n this.object.translate(this._deltaPosition, 1);\r\n }\r\n this.object.computeWorldMatrix(true);\r\n };\r\n\r\n /**\r\n * Legacy collision detection event support\r\n */\r\n public onCollideEvent: Nullable<(collider: PhysicsImpostor, collidedWith: PhysicsImpostor) => void> = null;\r\n\r\n /**\r\n * define an onCollide function to call when this impostor collides against a different body\r\n * @param e collide event data\r\n */\r\n public onCollide = (e: { body: any; point: Nullable; distance: number; impulse: number; normal: Nullable }) => {\r\n if (!this._onPhysicsCollideCallbacks.length && !this.onCollideEvent) {\r\n return;\r\n }\r\n\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n const otherImpostor = this._physicsEngine.getImpostorWithPhysicsBody(e.body);\r\n if (otherImpostor) {\r\n // Legacy collision detection event support\r\n if (this.onCollideEvent) {\r\n this.onCollideEvent(this, otherImpostor);\r\n }\r\n this._onPhysicsCollideCallbacks\r\n .filter((obj) => {\r\n return obj.otherImpostors.indexOf(otherImpostor) !== -1;\r\n })\r\n .forEach((obj) => {\r\n obj.callback(this, otherImpostor, e.point, e.distance, e.impulse, e.normal);\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Apply a force\r\n * @param force The force to apply\r\n * @param contactPoint The contact point for the force\r\n * @returns The physics imposter\r\n */\r\n public applyForce(force: Vector3, contactPoint: Vector3): PhysicsImpostor {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().applyForce(this, force, contactPoint);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Apply an impulse\r\n * @param force The impulse force\r\n * @param contactPoint The contact point for the impulse force\r\n * @returns The physics imposter\r\n */\r\n public applyImpulse(force: Vector3, contactPoint: Vector3): PhysicsImpostor {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().applyImpulse(this, force, contactPoint);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * A help function to create a joint\r\n * @param otherImpostor A physics imposter used to create a joint\r\n * @param jointType The type of joint\r\n * @param jointData The data for the joint\r\n * @returns The physics imposter\r\n */\r\n public createJoint(otherImpostor: PhysicsImpostor, jointType: number, jointData: PhysicsJointData): PhysicsImpostor {\r\n const joint = new PhysicsJoint(jointType, jointData);\r\n this.addJoint(otherImpostor, joint);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a joint to this impostor with a different impostor\r\n * @param otherImpostor A physics imposter used to add a joint\r\n * @param joint The joint to add\r\n * @returns The physics imposter\r\n */\r\n public addJoint(otherImpostor: PhysicsImpostor, joint: PhysicsJoint): PhysicsImpostor {\r\n this._joints.push({\r\n otherImpostor: otherImpostor,\r\n joint: joint,\r\n });\r\n\r\n if (this._physicsEngine) {\r\n this._physicsEngine.addJoint(this, otherImpostor, joint);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add an anchor to a cloth impostor\r\n * @param otherImpostor rigid impostor to anchor to\r\n * @param width ratio across width from 0 to 1\r\n * @param height ratio up height from 0 to 1\r\n * @param influence the elasticity between cloth impostor and anchor from 0, very stretchy to 1, little stretch\r\n * @param noCollisionBetweenLinkedBodies when true collisions between cloth impostor and anchor are ignored; default false\r\n * @returns impostor the soft imposter\r\n */\r\n public addAnchor(otherImpostor: PhysicsImpostor, width: number, height: number, influence: number, noCollisionBetweenLinkedBodies: boolean): PhysicsImpostor {\r\n if (!this._physicsEngine) {\r\n return this;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.appendAnchor) {\r\n return this;\r\n }\r\n if (this._physicsEngine) {\r\n plugin.appendAnchor!(this, otherImpostor, width, height, influence, noCollisionBetweenLinkedBodies);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a hook to a rope impostor\r\n * @param otherImpostor rigid impostor to anchor to\r\n * @param length ratio across rope from 0 to 1\r\n * @param influence the elasticity between rope impostor and anchor from 0, very stretchy to 1, little stretch\r\n * @param noCollisionBetweenLinkedBodies when true collisions between soft impostor and anchor are ignored; default false\r\n * @returns impostor the rope imposter\r\n */\r\n public addHook(otherImpostor: PhysicsImpostor, length: number, influence: number, noCollisionBetweenLinkedBodies: boolean): PhysicsImpostor {\r\n if (!this._physicsEngine) {\r\n return this;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.appendAnchor) {\r\n return this;\r\n }\r\n if (this._physicsEngine) {\r\n plugin.appendHook!(this, otherImpostor, length, influence, noCollisionBetweenLinkedBodies);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Will keep this body still, in a sleep mode.\r\n * @returns the physics imposter\r\n */\r\n public sleep(): PhysicsImpostor {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().sleepBody(this);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Wake the body up.\r\n * @returns The physics imposter\r\n */\r\n public wakeUp(): PhysicsImpostor {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().wakeUpBody(this);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Clones the physics imposter\r\n * @param newObject The physics imposter clones to this physics-enabled object\r\n * @returns A nullable physics imposter\r\n */\r\n public clone(newObject: IPhysicsEnabledObject): Nullable {\r\n if (!newObject) {\r\n return null;\r\n }\r\n return new PhysicsImpostor(newObject, this.type, this._options, this._scene);\r\n }\r\n\r\n /**\r\n * Disposes the physics imposter\r\n */\r\n public dispose(/*disposeChildren: boolean = true*/) {\r\n //no dispose if no physics engine is available.\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n\r\n this._joints.forEach((j) => {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.removeJoint(this, j.otherImpostor, j.joint);\r\n }\r\n });\r\n //dispose the physics body\r\n this._physicsEngine.removeImpostor(this);\r\n if (this.parent) {\r\n this.parent.forceUpdate();\r\n } else {\r\n /*this._object.getChildMeshes().forEach(function(mesh) {\r\n if (mesh.physicsImpostor) {\r\n if (disposeChildren) {\r\n mesh.physicsImpostor.dispose();\r\n mesh.physicsImpostor = null;\r\n }\r\n }\r\n })*/\r\n }\r\n\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * Sets the delta position\r\n * @param position The delta position amount\r\n */\r\n public setDeltaPosition(position: Vector3) {\r\n this._deltaPosition.copyFrom(position);\r\n }\r\n\r\n /**\r\n * Sets the delta rotation\r\n * @param rotation The delta rotation amount\r\n */\r\n public setDeltaRotation(rotation: Quaternion) {\r\n if (!this._deltaRotation) {\r\n this._deltaRotation = new Quaternion();\r\n }\r\n this._deltaRotation.copyFrom(rotation);\r\n this._deltaRotationConjugated = this._deltaRotation.conjugate();\r\n }\r\n\r\n /**\r\n * Gets the box size of the physics imposter and stores the result in the input parameter\r\n * @param result Stores the box size\r\n * @returns The physics imposter\r\n */\r\n public getBoxSizeToRef(result: Vector3): PhysicsImpostor {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().getBoxSizeToRef(this, result);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the radius of the physics imposter\r\n * @returns Radius of the physics imposter\r\n */\r\n public getRadius(): number {\r\n return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getRadius(this) : 0;\r\n }\r\n\r\n /**\r\n * Sync a bone with this impostor\r\n * @param bone The bone to sync to the impostor.\r\n * @param boneMesh The mesh that the bone is influencing.\r\n * @param jointPivot The pivot of the joint / bone in local space.\r\n * @param distToJoint Optional distance from the impostor to the joint.\r\n * @param adjustRotation Optional quaternion for adjusting the local rotation of the bone.\r\n */\r\n public syncBoneWithImpostor(bone: Bone, boneMesh: AbstractMesh, jointPivot: Vector3, distToJoint?: number, adjustRotation?: Quaternion) {\r\n const tempVec = PhysicsImpostor._TmpVecs[0];\r\n const mesh = this.object;\r\n\r\n if (mesh.rotationQuaternion) {\r\n if (adjustRotation) {\r\n const tempQuat = PhysicsImpostor._TmpQuat;\r\n mesh.rotationQuaternion.multiplyToRef(adjustRotation, tempQuat);\r\n bone.setRotationQuaternion(tempQuat, Space.WORLD, boneMesh);\r\n } else {\r\n bone.setRotationQuaternion(mesh.rotationQuaternion, Space.WORLD, boneMesh);\r\n }\r\n }\r\n\r\n tempVec.x = 0;\r\n tempVec.y = 0;\r\n tempVec.z = 0;\r\n\r\n if (jointPivot) {\r\n tempVec.x = jointPivot.x;\r\n tempVec.y = jointPivot.y;\r\n tempVec.z = jointPivot.z;\r\n\r\n bone.getDirectionToRef(tempVec, boneMesh, tempVec);\r\n\r\n if (distToJoint === undefined || distToJoint === null) {\r\n distToJoint = jointPivot.length();\r\n }\r\n\r\n tempVec.x *= distToJoint;\r\n tempVec.y *= distToJoint;\r\n tempVec.z *= distToJoint;\r\n }\r\n\r\n if (bone.getParent()) {\r\n tempVec.addInPlace(mesh.getAbsolutePosition());\r\n bone.setAbsolutePosition(tempVec, boneMesh);\r\n } else {\r\n boneMesh.setAbsolutePosition(mesh.getAbsolutePosition());\r\n boneMesh.position.x -= tempVec.x;\r\n boneMesh.position.y -= tempVec.y;\r\n boneMesh.position.z -= tempVec.z;\r\n }\r\n }\r\n\r\n /**\r\n * Sync impostor to a bone\r\n * @param bone The bone that the impostor will be synced to.\r\n * @param boneMesh The mesh that the bone is influencing.\r\n * @param jointPivot The pivot of the joint / bone in local space.\r\n * @param distToJoint Optional distance from the impostor to the joint.\r\n * @param adjustRotation Optional quaternion for adjusting the local rotation of the bone.\r\n * @param boneAxis Optional vector3 axis the bone is aligned with\r\n */\r\n public syncImpostorWithBone(bone: Bone, boneMesh: AbstractMesh, jointPivot: Vector3, distToJoint?: number, adjustRotation?: Quaternion, boneAxis?: Vector3) {\r\n const mesh = this.object;\r\n\r\n if (mesh.rotationQuaternion) {\r\n if (adjustRotation) {\r\n const tempQuat = PhysicsImpostor._TmpQuat;\r\n bone.getRotationQuaternionToRef(Space.WORLD, boneMesh, tempQuat);\r\n tempQuat.multiplyToRef(adjustRotation, mesh.rotationQuaternion);\r\n } else {\r\n bone.getRotationQuaternionToRef(Space.WORLD, boneMesh, mesh.rotationQuaternion);\r\n }\r\n }\r\n\r\n const pos = PhysicsImpostor._TmpVecs[0];\r\n const boneDir = PhysicsImpostor._TmpVecs[1];\r\n\r\n if (!boneAxis) {\r\n boneAxis = PhysicsImpostor._TmpVecs[2];\r\n boneAxis.x = 0;\r\n boneAxis.y = 1;\r\n boneAxis.z = 0;\r\n }\r\n\r\n bone.getDirectionToRef(boneAxis, boneMesh, boneDir);\r\n bone.getAbsolutePositionToRef(boneMesh, pos);\r\n\r\n if ((distToJoint === undefined || distToJoint === null) && jointPivot) {\r\n distToJoint = jointPivot.length();\r\n }\r\n\r\n if (distToJoint !== undefined && distToJoint !== null) {\r\n pos.x += boneDir.x * distToJoint;\r\n pos.y += boneDir.y * distToJoint;\r\n pos.z += boneDir.z * distToJoint;\r\n }\r\n\r\n mesh.setAbsolutePosition(pos);\r\n }\r\n\r\n //Impostor types\r\n /**\r\n * No-Imposter type\r\n */\r\n public static NoImpostor = 0;\r\n /**\r\n * Sphere-Imposter type\r\n */\r\n public static SphereImpostor = 1;\r\n /**\r\n * Box-Imposter type\r\n */\r\n public static BoxImpostor = 2;\r\n /**\r\n * Plane-Imposter type\r\n */\r\n public static PlaneImpostor = 3;\r\n /**\r\n * Mesh-imposter type (Only available to objects with vertices data)\r\n */\r\n public static MeshImpostor = 4;\r\n /**\r\n * Capsule-Impostor type (Ammo.js plugin only)\r\n */\r\n public static CapsuleImpostor = 6;\r\n /**\r\n * Cylinder-Imposter type\r\n */\r\n public static CylinderImpostor = 7;\r\n /**\r\n * Particle-Imposter type\r\n */\r\n public static ParticleImpostor = 8;\r\n /**\r\n * Heightmap-Imposter type\r\n */\r\n public static HeightmapImpostor = 9;\r\n /**\r\n * ConvexHull-Impostor type (Ammo.js plugin only)\r\n */\r\n public static ConvexHullImpostor = 10;\r\n /**\r\n * Custom-Imposter type (Ammo.js plugin only)\r\n */\r\n public static CustomImpostor = 100;\r\n /**\r\n * Rope-Imposter type\r\n */\r\n public static RopeImpostor = 101;\r\n /**\r\n * Cloth-Imposter type\r\n */\r\n public static ClothImpostor = 102;\r\n /**\r\n * Softbody-Imposter type\r\n */\r\n public static SoftbodyImpostor = 103;\r\n}\r\n", "import { Tools } from \"../Misc/tools\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { AnimationGroup } from \"../Animations/animationGroup\";\r\nimport type { AssetContainer } from \"../assetContainer\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport type { Skeleton } from \"../Bones/skeleton\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { SceneLoaderFlags } from \"./sceneLoaderFlags\";\r\nimport type { IFileRequest } from \"../Misc/fileRequest\";\r\nimport type { WebRequest } from \"../Misc/webRequest\";\r\nimport type { LoadFileError } from \"../Misc/fileTools\";\r\nimport { IsBase64DataUrl } from \"../Misc/fileTools\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { Geometry } from \"../Meshes/geometry\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport { RuntimeError, ErrorCodes } from \"../Misc/error\";\r\nimport type { ISpriteManager } from \"../Sprites/spriteManager\";\r\nimport { RandomGUID } from \"../Misc/guid\";\r\n\r\n/**\r\n * Type used for the success callback of ImportMesh\r\n */\r\nexport type SceneLoaderSuccessCallback = (\r\n meshes: AbstractMesh[],\r\n particleSystems: IParticleSystem[],\r\n skeletons: Skeleton[],\r\n animationGroups: AnimationGroup[],\r\n transformNodes: TransformNode[],\r\n geometries: Geometry[],\r\n lights: Light[],\r\n spriteManagers: ISpriteManager[]\r\n) => void;\r\n\r\n/**\r\n * Interface used for the result of ImportMeshAsync\r\n */\r\nexport interface ISceneLoaderAsyncResult {\r\n /**\r\n * The array of loaded meshes\r\n */\r\n readonly meshes: AbstractMesh[];\r\n\r\n /**\r\n * The array of loaded particle systems\r\n */\r\n readonly particleSystems: IParticleSystem[];\r\n\r\n /**\r\n * The array of loaded skeletons\r\n */\r\n readonly skeletons: Skeleton[];\r\n\r\n /**\r\n * The array of loaded animation groups\r\n */\r\n readonly animationGroups: AnimationGroup[];\r\n\r\n /**\r\n * The array of loaded transform nodes\r\n */\r\n readonly transformNodes: TransformNode[];\r\n\r\n /**\r\n * The array of loaded geometries\r\n */\r\n readonly geometries: Geometry[];\r\n\r\n /**\r\n * The array of loaded lights\r\n */\r\n readonly lights: Light[];\r\n\r\n /**\r\n * The array of loaded sprite managers\r\n */\r\n readonly spriteManagers: ISpriteManager[];\r\n}\r\n\r\n/**\r\n * Interface used to represent data loading progression\r\n */\r\nexport interface ISceneLoaderProgressEvent {\r\n /**\r\n * Defines if data length to load can be evaluated\r\n */\r\n readonly lengthComputable: boolean;\r\n\r\n /**\r\n * Defines the loaded data length\r\n */\r\n readonly loaded: number;\r\n\r\n /**\r\n * Defines the data length to load\r\n */\r\n readonly total: number;\r\n}\r\n\r\n/**\r\n * Interface used by SceneLoader plugins to define supported file extensions\r\n */\r\nexport interface ISceneLoaderPluginExtensions {\r\n /**\r\n * Defines the list of supported extensions\r\n */\r\n [extension: string]: {\r\n isBinary: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Interface used by SceneLoader plugin factory\r\n */\r\nexport interface ISceneLoaderPluginFactory {\r\n /**\r\n * Defines the name of the factory\r\n */\r\n name: string;\r\n\r\n /**\r\n * Function called to create a new plugin\r\n * @returns the new plugin\r\n */\r\n createPlugin(): ISceneLoaderPlugin | ISceneLoaderPluginAsync;\r\n\r\n /**\r\n * The callback that returns true if the data can be directly loaded.\r\n * @param data string containing the file data\r\n * @returns if the data can be loaded directly\r\n */\r\n canDirectLoad?(data: string): boolean;\r\n}\r\n\r\n/**\r\n * Interface used to define the base of ISceneLoaderPlugin and ISceneLoaderPluginAsync\r\n */\r\nexport interface ISceneLoaderPluginBase {\r\n /**\r\n * The friendly name of this plugin.\r\n */\r\n name: string;\r\n\r\n /**\r\n * The file extensions supported by this plugin.\r\n */\r\n extensions: string | ISceneLoaderPluginExtensions;\r\n\r\n /**\r\n * The callback called when loading from a url.\r\n * @param scene scene loading this url\r\n * @param fileOrUrl file or url to load\r\n * @param rootUrl root url to use to load assets\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @param name defines the name of the file when loading a binary file\r\n * @returns a file request object\r\n */\r\n loadFile?(\r\n scene: Scene,\r\n fileOrUrl: File | string | ArrayBufferView,\r\n rootUrl: string,\r\n onSuccess: (data: any, responseURL?: string) => void,\r\n onProgress?: (ev: ISceneLoaderProgressEvent) => void,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n name?: string\r\n ): Nullable;\r\n\r\n /**\r\n * The callback that returns true if the data can be directly loaded.\r\n * @param data string containing the file data\r\n * @returns if the data can be loaded directly\r\n */\r\n canDirectLoad?(data: string): boolean;\r\n\r\n /**\r\n * The callback that returns the data to pass to the plugin if the data can be directly loaded.\r\n * @param scene scene loading this data\r\n * @param data string containing the data\r\n * @returns data to pass to the plugin\r\n */\r\n directLoad?(scene: Scene, data: string): any;\r\n\r\n /**\r\n * The callback that allows custom handling of the root url based on the response url.\r\n * @param rootUrl the original root url\r\n * @param responseURL the response url if available\r\n * @returns the new root url\r\n */\r\n rewriteRootURL?(rootUrl: string, responseURL?: string): string;\r\n}\r\n\r\n/**\r\n * Interface used to define a SceneLoader plugin\r\n */\r\nexport interface ISceneLoaderPlugin extends ISceneLoaderPluginBase {\r\n /**\r\n * Import meshes into a scene.\r\n * @param meshesNames An array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported\r\n * @param scene The scene to import into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @param meshes The meshes array to import into\r\n * @param particleSystems The particle systems array to import into\r\n * @param skeletons The skeletons array to import into\r\n * @param onError The callback when import fails\r\n * @returns True if successful or false otherwise\r\n */\r\n importMesh(\r\n meshesNames: any,\r\n scene: Scene,\r\n data: any,\r\n rootUrl: string,\r\n meshes: AbstractMesh[],\r\n particleSystems: IParticleSystem[],\r\n skeletons: Skeleton[],\r\n onError?: (message: string, exception?: any) => void\r\n ): boolean;\r\n\r\n /**\r\n * Load into a scene.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @param onError The callback when import fails\r\n * @returns True if successful or false otherwise\r\n */\r\n load(scene: Scene, data: any, rootUrl: string, onError?: (message: string, exception?: any) => void): boolean;\r\n\r\n /**\r\n * Load into an asset container.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @param onError The callback when import fails\r\n * @returns The loaded asset container\r\n */\r\n loadAssetContainer(scene: Scene, data: any, rootUrl: string, onError?: (message: string, exception?: any) => void): AssetContainer;\r\n}\r\n\r\n/**\r\n * Interface used to define an async SceneLoader plugin\r\n */\r\nexport interface ISceneLoaderPluginAsync extends ISceneLoaderPluginBase {\r\n /**\r\n * Import meshes into a scene.\r\n * @param meshesNames An array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported\r\n * @param scene The scene to import into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @param onProgress The callback when the load progresses\r\n * @param fileName Defines the name of the file to load\r\n * @returns The loaded objects (e.g. meshes, particle systems, skeletons, animation groups, etc.)\r\n */\r\n importMeshAsync(\r\n meshesNames: any,\r\n scene: Scene,\r\n data: any,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName?: string\r\n ): Promise;\r\n\r\n /**\r\n * Load into a scene.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @param onProgress The callback when the load progresses\r\n * @param fileName Defines the name of the file to load\r\n * @returns Nothing\r\n */\r\n loadAsync(scene: Scene, data: any, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise;\r\n\r\n /**\r\n * Load into an asset container.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @param onProgress The callback when the load progresses\r\n * @param fileName Defines the name of the file to load\r\n * @returns The loaded asset container\r\n */\r\n loadAssetContainerAsync(scene: Scene, data: any, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise;\r\n}\r\n\r\n/**\r\n * Mode that determines how to handle old animation groups before loading new ones.\r\n */\r\nexport enum SceneLoaderAnimationGroupLoadingMode {\r\n /**\r\n * Reset all old animations to initial state then dispose them.\r\n */\r\n Clean = 0,\r\n\r\n /**\r\n * Stop all old animations.\r\n */\r\n Stop = 1,\r\n\r\n /**\r\n * Restart old animations from first frame.\r\n */\r\n Sync = 2,\r\n\r\n /**\r\n * Old animations remains untouched.\r\n */\r\n NoSync = 3,\r\n}\r\n\r\n/**\r\n * Defines a plugin registered by the SceneLoader\r\n */\r\ninterface IRegisteredPlugin {\r\n /**\r\n * Defines the plugin to use\r\n */\r\n plugin: ISceneLoaderPlugin | ISceneLoaderPluginAsync | ISceneLoaderPluginFactory;\r\n /**\r\n * Defines if the plugin supports binary data\r\n */\r\n isBinary: boolean;\r\n}\r\n\r\n/**\r\n * Defines file information\r\n */\r\ninterface IFileInfo {\r\n /**\r\n * Gets the file url\r\n */\r\n url: string;\r\n /**\r\n * Gets the root url\r\n */\r\n rootUrl: string;\r\n /**\r\n * Gets filename\r\n */\r\n name: string;\r\n /**\r\n * Gets the file\r\n */\r\n file: Nullable;\r\n\r\n /**\r\n * Gets raw binary data.\r\n */\r\n rawData: Nullable;\r\n}\r\n\r\n/**\r\n * Class used to load scene from various file formats using registered plugins\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/loadingFileTypes\r\n */\r\nexport class SceneLoader {\r\n /**\r\n * No logging while loading\r\n */\r\n public static readonly NO_LOGGING = Constants.SCENELOADER_NO_LOGGING;\r\n\r\n /**\r\n * Minimal logging while loading\r\n */\r\n public static readonly MINIMAL_LOGGING = Constants.SCENELOADER_MINIMAL_LOGGING;\r\n\r\n /**\r\n * Summary logging while loading\r\n */\r\n public static readonly SUMMARY_LOGGING = Constants.SCENELOADER_SUMMARY_LOGGING;\r\n\r\n /**\r\n * Detailed logging while loading\r\n */\r\n public static readonly DETAILED_LOGGING = Constants.SCENELOADER_DETAILED_LOGGING;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if entire scene must be loaded even if scene contains incremental data\r\n */\r\n public static get ForceFullSceneLoadingForIncremental() {\r\n return SceneLoaderFlags.ForceFullSceneLoadingForIncremental;\r\n }\r\n\r\n public static set ForceFullSceneLoadingForIncremental(value: boolean) {\r\n SceneLoaderFlags.ForceFullSceneLoadingForIncremental = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if loading screen must be displayed while loading a scene\r\n */\r\n public static get ShowLoadingScreen(): boolean {\r\n return SceneLoaderFlags.ShowLoadingScreen;\r\n }\r\n\r\n public static set ShowLoadingScreen(value: boolean) {\r\n SceneLoaderFlags.ShowLoadingScreen = value;\r\n }\r\n\r\n /**\r\n * Defines the current logging level (while loading the scene)\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static get loggingLevel(): number {\r\n return SceneLoaderFlags.loggingLevel;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static set loggingLevel(value: number) {\r\n SceneLoaderFlags.loggingLevel = value;\r\n }\r\n\r\n /**\r\n * Gets or set a boolean indicating if matrix weights must be cleaned upon loading\r\n */\r\n public static get CleanBoneMatrixWeights(): boolean {\r\n return SceneLoaderFlags.CleanBoneMatrixWeights;\r\n }\r\n\r\n public static set CleanBoneMatrixWeights(value: boolean) {\r\n SceneLoaderFlags.CleanBoneMatrixWeights = value;\r\n }\r\n\r\n // Members\r\n\r\n /**\r\n * Event raised when a plugin is used to load a scene\r\n */\r\n public static OnPluginActivatedObservable = new Observable();\r\n\r\n private static _RegisteredPlugins: { [extension: string]: IRegisteredPlugin } = {};\r\n\r\n private static _ShowingLoadingScreen = false;\r\n\r\n /**\r\n * Gets the default plugin (used to load Babylon files)\r\n * @returns the .babylon plugin\r\n */\r\n public static GetDefaultPlugin(): IRegisteredPlugin {\r\n return SceneLoader._RegisteredPlugins[\".babylon\"];\r\n }\r\n\r\n private static _GetPluginForExtension(extension: string): IRegisteredPlugin {\r\n const registeredPlugin = SceneLoader._RegisteredPlugins[extension];\r\n if (registeredPlugin) {\r\n return registeredPlugin;\r\n }\r\n Logger.Warn(\r\n \"Unable to find a plugin to load \" +\r\n extension +\r\n \" files. Trying to use .babylon default plugin. To load from a specific filetype (eg. gltf) see: https://doc.babylonjs.com/features/featuresDeepDive/importers/loadingFileTypes\"\r\n );\r\n return SceneLoader.GetDefaultPlugin();\r\n }\r\n\r\n private static _GetPluginForDirectLoad(data: string): IRegisteredPlugin {\r\n for (const extension in SceneLoader._RegisteredPlugins) {\r\n const plugin = SceneLoader._RegisteredPlugins[extension].plugin;\r\n\r\n if (plugin.canDirectLoad && plugin.canDirectLoad(data)) {\r\n return SceneLoader._RegisteredPlugins[extension];\r\n }\r\n }\r\n\r\n return SceneLoader.GetDefaultPlugin();\r\n }\r\n\r\n private static _GetPluginForFilename(sceneFilename: string): IRegisteredPlugin {\r\n const queryStringPosition = sceneFilename.indexOf(\"?\");\r\n\r\n if (queryStringPosition !== -1) {\r\n sceneFilename = sceneFilename.substring(0, queryStringPosition);\r\n }\r\n\r\n const dotPosition = sceneFilename.lastIndexOf(\".\");\r\n\r\n const extension = sceneFilename.substring(dotPosition, sceneFilename.length).toLowerCase();\r\n return SceneLoader._GetPluginForExtension(extension);\r\n }\r\n\r\n private static _GetDirectLoad(sceneFilename: string): Nullable {\r\n if (sceneFilename.substr(0, 5) === \"data:\") {\r\n return sceneFilename.substr(5);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private static _FormatErrorMessage(fileInfo: IFileInfo, message?: string, exception?: any): string {\r\n const fromLoad = fileInfo.rawData ? \"binary data\" : fileInfo.url;\r\n let errorMessage = \"Unable to load from \" + fromLoad;\r\n\r\n if (message) {\r\n errorMessage += `: ${message}`;\r\n } else if (exception) {\r\n errorMessage += `: ${exception}`;\r\n }\r\n\r\n return errorMessage;\r\n }\r\n\r\n private static _LoadData(\r\n fileInfo: IFileInfo,\r\n scene: Scene,\r\n onSuccess: (plugin: ISceneLoaderPlugin | ISceneLoaderPluginAsync, data: any, responseURL?: string) => void,\r\n onProgress: ((event: ISceneLoaderProgressEvent) => void) | undefined,\r\n onError: (message?: string, exception?: any) => void,\r\n onDispose: () => void,\r\n pluginExtension: Nullable,\r\n name: string\r\n ): Nullable {\r\n const directLoad = SceneLoader._GetDirectLoad(fileInfo.url);\r\n\r\n if (fileInfo.rawData && !pluginExtension) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"When using ArrayBufferView to load data the file extension must be provided.\";\r\n }\r\n\r\n const registeredPlugin = pluginExtension\r\n ? SceneLoader._GetPluginForExtension(pluginExtension)\r\n : directLoad\r\n ? SceneLoader._GetPluginForDirectLoad(fileInfo.url)\r\n : SceneLoader._GetPluginForFilename(fileInfo.url);\r\n\r\n if (fileInfo.rawData && !registeredPlugin.isBinary) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Loading from ArrayBufferView can not be used with plugins that don't support binary loading.\";\r\n }\r\n\r\n let plugin: ISceneLoaderPlugin | ISceneLoaderPluginAsync;\r\n\r\n if ((registeredPlugin.plugin as ISceneLoaderPluginFactory).createPlugin !== undefined) {\r\n plugin = (registeredPlugin.plugin as ISceneLoaderPluginFactory).createPlugin();\r\n } else {\r\n plugin = registeredPlugin.plugin;\r\n }\r\n\r\n if (!plugin) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"The loader plugin corresponding to the file type you are trying to load has not been found. If using es6, please import the plugin you wish to use before.\";\r\n }\r\n\r\n SceneLoader.OnPluginActivatedObservable.notifyObservers(plugin);\r\n\r\n // Check if we have a direct load url. If the plugin is registered to handle\r\n // it or it's not a base64 data url, then pass it through the direct load path.\r\n if (directLoad && ((plugin.canDirectLoad && plugin.canDirectLoad(fileInfo.url)) || !IsBase64DataUrl(fileInfo.url))) {\r\n if (plugin.directLoad) {\r\n const result = plugin.directLoad(scene, directLoad);\r\n if (result.then) {\r\n result\r\n .then((data: any) => {\r\n onSuccess(plugin, data);\r\n })\r\n .catch((error: any) => {\r\n onError(\"Error in directLoad of _loadData: \" + error, error);\r\n });\r\n } else {\r\n onSuccess(plugin, result);\r\n }\r\n } else {\r\n onSuccess(plugin, directLoad);\r\n }\r\n return plugin;\r\n }\r\n\r\n const useArrayBuffer = registeredPlugin.isBinary;\r\n\r\n const dataCallback = (data: any, responseURL?: string) => {\r\n if (scene.isDisposed) {\r\n onError(\"Scene has been disposed\");\r\n return;\r\n }\r\n\r\n onSuccess(plugin, data, responseURL);\r\n };\r\n\r\n let request: Nullable = null;\r\n let pluginDisposed = false;\r\n const onDisposeObservable = (plugin as any).onDisposeObservable as Observable;\r\n if (onDisposeObservable) {\r\n onDisposeObservable.add(() => {\r\n pluginDisposed = true;\r\n\r\n if (request) {\r\n request.abort();\r\n request = null;\r\n }\r\n\r\n onDispose();\r\n });\r\n }\r\n\r\n const manifestChecked = () => {\r\n if (pluginDisposed) {\r\n return;\r\n }\r\n\r\n const errorCallback = (request?: WebRequest, exception?: LoadFileError) => {\r\n onError(request?.statusText, exception);\r\n };\r\n\r\n if (!plugin.loadFile && fileInfo.rawData) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Plugin does not support loading ArrayBufferView.\";\r\n }\r\n\r\n request = plugin.loadFile\r\n ? plugin.loadFile(scene, fileInfo.rawData || fileInfo.file || fileInfo.url, fileInfo.rootUrl, dataCallback, onProgress, useArrayBuffer, errorCallback, name)\r\n : scene._loadFile(fileInfo.file || fileInfo.url, dataCallback, onProgress, true, useArrayBuffer, errorCallback);\r\n };\r\n\r\n const engine = scene.getEngine();\r\n let canUseOfflineSupport = engine.enableOfflineSupport;\r\n if (canUseOfflineSupport) {\r\n // Also check for exceptions\r\n let exceptionFound = false;\r\n for (const regex of scene.disableOfflineSupportExceptionRules) {\r\n if (regex.test(fileInfo.url)) {\r\n exceptionFound = true;\r\n break;\r\n }\r\n }\r\n\r\n canUseOfflineSupport = !exceptionFound;\r\n }\r\n\r\n if (canUseOfflineSupport && Engine.OfflineProviderFactory) {\r\n // Checking if a manifest file has been set for this scene and if offline mode has been requested\r\n scene.offlineProvider = Engine.OfflineProviderFactory(fileInfo.url, manifestChecked, engine.disableManifestCheck);\r\n } else {\r\n manifestChecked();\r\n }\r\n\r\n return plugin;\r\n }\r\n\r\n private static _GetFileInfo(rootUrl: string, sceneFilename: string | File | ArrayBufferView): Nullable {\r\n let url: string;\r\n let name: string;\r\n let file: Nullable = null;\r\n let rawData: Nullable = null;\r\n\r\n if (!sceneFilename) {\r\n url = rootUrl;\r\n name = Tools.GetFilename(rootUrl);\r\n rootUrl = Tools.GetFolderPath(rootUrl);\r\n } else if ((sceneFilename as File).name) {\r\n const sceneFile = sceneFilename as File;\r\n url = `file:${sceneFile.name}`;\r\n name = sceneFile.name;\r\n file = sceneFile;\r\n } else if (ArrayBuffer.isView(sceneFilename)) {\r\n url = \"\";\r\n name = RandomGUID();\r\n rawData = sceneFilename as ArrayBufferView;\r\n } else if (typeof sceneFilename === \"string\" && sceneFilename.startsWith(\"data:\")) {\r\n url = sceneFilename;\r\n name = \"\";\r\n } else {\r\n const filename = sceneFilename as string;\r\n if (filename.substr(0, 1) === \"/\") {\r\n Tools.Error(\"Wrong sceneFilename parameter\");\r\n return null;\r\n }\r\n\r\n url = rootUrl + filename;\r\n name = filename;\r\n }\r\n\r\n return {\r\n url: url,\r\n rootUrl: rootUrl,\r\n name: name,\r\n file: file,\r\n rawData,\r\n };\r\n }\r\n\r\n // Public functions\r\n\r\n /**\r\n * Gets a plugin that can load the given extension\r\n * @param extension defines the extension to load\r\n * @returns a plugin or null if none works\r\n */\r\n public static GetPluginForExtension(extension: string): ISceneLoaderPlugin | ISceneLoaderPluginAsync | ISceneLoaderPluginFactory {\r\n return SceneLoader._GetPluginForExtension(extension).plugin;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the given extension can be loaded\r\n * @param extension defines the extension to load\r\n * @returns true if the extension is supported\r\n */\r\n public static IsPluginForExtensionAvailable(extension: string): boolean {\r\n return !!SceneLoader._RegisteredPlugins[extension];\r\n }\r\n\r\n /**\r\n * Adds a new plugin to the list of registered plugins\r\n * @param plugin defines the plugin to add\r\n */\r\n public static RegisterPlugin(plugin: ISceneLoaderPlugin | ISceneLoaderPluginAsync): void {\r\n if (typeof plugin.extensions === \"string\") {\r\n const extension = plugin.extensions;\r\n SceneLoader._RegisteredPlugins[extension.toLowerCase()] = {\r\n plugin: plugin,\r\n isBinary: false,\r\n };\r\n } else {\r\n const extensions = plugin.extensions;\r\n Object.keys(extensions).forEach((extension) => {\r\n SceneLoader._RegisteredPlugins[extension.toLowerCase()] = {\r\n plugin: plugin,\r\n isBinary: extensions[extension].isBinary,\r\n };\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Import meshes into a scene\r\n * @param meshNames an array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene the instance of BABYLON.Scene to append to\r\n * @param onSuccess a callback with a list of imported meshes, particleSystems, skeletons, and animationGroups when import succeeds\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param onError a callback with the scene, a message, and possibly an exception when import fails\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the name of the file, if the data is binary\r\n * @returns The loaded plugin\r\n */\r\n public static ImportMesh(\r\n meshNames: any,\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n onSuccess: Nullable = null,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n onError: Nullable<(scene: Scene, message: string, exception?: any) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Nullable {\r\n if (!scene) {\r\n Logger.Error(\"No scene available to import mesh to\");\r\n return null;\r\n }\r\n\r\n const fileInfo = SceneLoader._GetFileInfo(rootUrl, sceneFilename);\r\n if (!fileInfo) {\r\n return null;\r\n }\r\n\r\n const loadingToken = {};\r\n scene.addPendingData(loadingToken);\r\n\r\n const disposeHandler = () => {\r\n scene.removePendingData(loadingToken);\r\n };\r\n\r\n const errorHandler = (message?: string, exception?: any) => {\r\n const errorMessage = SceneLoader._FormatErrorMessage(fileInfo, message, exception);\r\n\r\n if (onError) {\r\n onError(scene, errorMessage, new RuntimeError(errorMessage, ErrorCodes.SceneLoaderError, exception));\r\n } else {\r\n Logger.Error(errorMessage);\r\n // should the exception be thrown?\r\n }\r\n\r\n disposeHandler();\r\n };\r\n\r\n const progressHandler = onProgress\r\n ? (event: ISceneLoaderProgressEvent) => {\r\n try {\r\n onProgress(event);\r\n } catch (e) {\r\n errorHandler(\"Error in onProgress callback: \" + e, e);\r\n }\r\n }\r\n : undefined;\r\n\r\n const successHandler: SceneLoaderSuccessCallback = (meshes, particleSystems, skeletons, animationGroups, transformNodes, geometries, lights, spriteManagers) => {\r\n scene.importedMeshesFiles.push(fileInfo.url);\r\n\r\n if (onSuccess) {\r\n try {\r\n onSuccess(meshes, particleSystems, skeletons, animationGroups, transformNodes, geometries, lights, spriteManagers);\r\n } catch (e) {\r\n errorHandler(\"Error in onSuccess callback: \" + e, e);\r\n }\r\n }\r\n\r\n scene.removePendingData(loadingToken);\r\n };\r\n\r\n return SceneLoader._LoadData(\r\n fileInfo,\r\n scene,\r\n (plugin, data, responseURL) => {\r\n if (plugin.rewriteRootURL) {\r\n fileInfo.rootUrl = plugin.rewriteRootURL(fileInfo.rootUrl, responseURL);\r\n }\r\n\r\n if ((plugin).importMesh) {\r\n const syncedPlugin = plugin;\r\n const meshes: AbstractMesh[] = [];\r\n const particleSystems: IParticleSystem[] = [];\r\n const skeletons: Skeleton[] = [];\r\n\r\n if (!syncedPlugin.importMesh(meshNames, scene, data, fileInfo.rootUrl, meshes, particleSystems, skeletons, errorHandler)) {\r\n return;\r\n }\r\n\r\n scene.loadingPluginName = plugin.name;\r\n successHandler(meshes, particleSystems, skeletons, [], [], [], [], []);\r\n } else {\r\n const asyncedPlugin = plugin;\r\n asyncedPlugin\r\n .importMeshAsync(meshNames, scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name)\r\n .then((result) => {\r\n scene.loadingPluginName = plugin.name;\r\n successHandler(\r\n result.meshes,\r\n result.particleSystems,\r\n result.skeletons,\r\n result.animationGroups,\r\n result.transformNodes,\r\n result.geometries,\r\n result.lights,\r\n result.spriteManagers\r\n );\r\n })\r\n .catch((error) => {\r\n errorHandler(error.message, error);\r\n });\r\n }\r\n },\r\n progressHandler,\r\n errorHandler,\r\n disposeHandler,\r\n pluginExtension,\r\n name\r\n );\r\n }\r\n\r\n /**\r\n * Import meshes into a scene\r\n * @param meshNames an array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene the instance of BABYLON.Scene to append to\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the name of the file\r\n * @returns The loaded list of imported meshes, particle systems, skeletons, and animation groups\r\n */\r\n public static ImportMeshAsync(\r\n meshNames: any,\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n SceneLoader.ImportMesh(\r\n meshNames,\r\n rootUrl,\r\n sceneFilename,\r\n scene,\r\n (meshes, particleSystems, skeletons, animationGroups, transformNodes, geometries, lights, spriteManagers) => {\r\n resolve({\r\n meshes: meshes,\r\n particleSystems: particleSystems,\r\n skeletons: skeletons,\r\n animationGroups: animationGroups,\r\n transformNodes: transformNodes,\r\n geometries: geometries,\r\n lights: lights,\r\n spriteManagers: spriteManagers,\r\n });\r\n },\r\n onProgress,\r\n (scene, message, exception) => {\r\n reject(exception || new Error(message));\r\n },\r\n pluginExtension,\r\n name\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Load a scene\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param engine is the instance of BABYLON.Engine to use to create the scene\r\n * @param onSuccess a callback with the scene when import succeeds\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param onError a callback with the scene, a message, and possibly an exception when import fails\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the filename, if the data is binary\r\n * @returns The loaded plugin\r\n */\r\n public static Load(\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n engine: Nullable = EngineStore.LastCreatedEngine,\r\n onSuccess: Nullable<(scene: Scene) => void> = null,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n onError: Nullable<(scene: Scene, message: string, exception?: any) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Nullable {\r\n if (!engine) {\r\n Tools.Error(\"No engine available\");\r\n return null;\r\n }\r\n\r\n return SceneLoader.Append(rootUrl, sceneFilename, new Scene(engine), onSuccess, onProgress, onError, pluginExtension, name);\r\n }\r\n\r\n /**\r\n * Load a scene\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param engine is the instance of BABYLON.Engine to use to create the scene\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the filename, if the data is binary\r\n * @returns The loaded scene\r\n */\r\n public static LoadAsync(\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n engine: Nullable = EngineStore.LastCreatedEngine,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n SceneLoader.Load(\r\n rootUrl,\r\n sceneFilename,\r\n engine,\r\n (scene) => {\r\n resolve(scene);\r\n },\r\n onProgress,\r\n (scene, message, exception) => {\r\n reject(exception || new Error(message));\r\n },\r\n pluginExtension,\r\n name\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Append a scene\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene is the instance of BABYLON.Scene to append to\r\n * @param onSuccess a callback with the scene when import succeeds\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param onError a callback with the scene, a message, and possibly an exception when import fails\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the name of the file, if the data is binary\r\n * @returns The loaded plugin\r\n */\r\n public static Append(\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n onSuccess: Nullable<(scene: Scene) => void> = null,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n onError: Nullable<(scene: Scene, message: string, exception?: any) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Nullable {\r\n if (!scene) {\r\n Logger.Error(\"No scene available to append to\");\r\n return null;\r\n }\r\n\r\n const fileInfo = SceneLoader._GetFileInfo(rootUrl, sceneFilename);\r\n if (!fileInfo) {\r\n return null;\r\n }\r\n\r\n const loadingToken = {};\r\n scene.addPendingData(loadingToken);\r\n\r\n const disposeHandler = () => {\r\n scene.removePendingData(loadingToken);\r\n };\r\n\r\n if (SceneLoader.ShowLoadingScreen && !this._ShowingLoadingScreen) {\r\n this._ShowingLoadingScreen = true;\r\n scene.getEngine().displayLoadingUI();\r\n scene.executeWhenReady(() => {\r\n scene.getEngine().hideLoadingUI();\r\n this._ShowingLoadingScreen = false;\r\n });\r\n }\r\n\r\n const errorHandler = (message?: string, exception?: any) => {\r\n const errorMessage = SceneLoader._FormatErrorMessage(fileInfo, message, exception);\r\n\r\n if (onError) {\r\n onError(scene, errorMessage, new RuntimeError(errorMessage, ErrorCodes.SceneLoaderError, exception));\r\n } else {\r\n Logger.Error(errorMessage);\r\n // should the exception be thrown?\r\n }\r\n\r\n disposeHandler();\r\n };\r\n\r\n const progressHandler = onProgress\r\n ? (event: ISceneLoaderProgressEvent) => {\r\n try {\r\n onProgress(event);\r\n } catch (e) {\r\n errorHandler(\"Error in onProgress callback\", e);\r\n }\r\n }\r\n : undefined;\r\n\r\n const successHandler = () => {\r\n if (onSuccess) {\r\n try {\r\n onSuccess(scene);\r\n } catch (e) {\r\n errorHandler(\"Error in onSuccess callback\", e);\r\n }\r\n }\r\n\r\n scene.removePendingData(loadingToken);\r\n };\r\n\r\n return SceneLoader._LoadData(\r\n fileInfo,\r\n scene,\r\n (plugin, data) => {\r\n if ((plugin).load) {\r\n const syncedPlugin = plugin;\r\n if (!syncedPlugin.load(scene, data, fileInfo.rootUrl, errorHandler)) {\r\n return;\r\n }\r\n\r\n scene.loadingPluginName = plugin.name;\r\n successHandler();\r\n } else {\r\n const asyncedPlugin = plugin;\r\n asyncedPlugin\r\n .loadAsync(scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name)\r\n .then(() => {\r\n scene.loadingPluginName = plugin.name;\r\n successHandler();\r\n })\r\n .catch((error) => {\r\n errorHandler(error.message, error);\r\n });\r\n }\r\n },\r\n progressHandler,\r\n errorHandler,\r\n disposeHandler,\r\n pluginExtension,\r\n name\r\n );\r\n }\r\n\r\n /**\r\n * Append a scene\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene is the instance of BABYLON.Scene to append to\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the name of the file, if the data is binary\r\n * @returns The given scene\r\n */\r\n public static AppendAsync(\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n SceneLoader.Append(\r\n rootUrl,\r\n sceneFilename,\r\n scene,\r\n (scene) => {\r\n resolve(scene);\r\n },\r\n onProgress,\r\n (scene, message, exception) => {\r\n reject(exception || new Error(message));\r\n },\r\n pluginExtension,\r\n name\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Load a scene into an asset container\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene is the instance of BABYLON.Scene to append to (default: last created scene)\r\n * @param onSuccess a callback with the scene when import succeeds\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param onError a callback with the scene, a message, and possibly an exception when import fails\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the filename, if the data is binary\r\n * @returns The loaded plugin\r\n */\r\n public static LoadAssetContainer(\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n onSuccess: Nullable<(assets: AssetContainer) => void> = null,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n onError: Nullable<(scene: Scene, message: string, exception?: any) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Nullable {\r\n if (!scene) {\r\n Logger.Error(\"No scene available to load asset container to\");\r\n return null;\r\n }\r\n\r\n const fileInfo = SceneLoader._GetFileInfo(rootUrl, sceneFilename);\r\n if (!fileInfo) {\r\n return null;\r\n }\r\n\r\n const loadingToken = {};\r\n scene.addPendingData(loadingToken);\r\n\r\n const disposeHandler = () => {\r\n scene.removePendingData(loadingToken);\r\n };\r\n\r\n const errorHandler = (message?: string, exception?: any) => {\r\n const errorMessage = SceneLoader._FormatErrorMessage(fileInfo, message, exception);\r\n\r\n if (onError) {\r\n onError(scene, errorMessage, new RuntimeError(errorMessage, ErrorCodes.SceneLoaderError, exception));\r\n } else {\r\n Logger.Error(errorMessage);\r\n // should the exception be thrown?\r\n }\r\n\r\n disposeHandler();\r\n };\r\n\r\n const progressHandler = onProgress\r\n ? (event: ISceneLoaderProgressEvent) => {\r\n try {\r\n onProgress(event);\r\n } catch (e) {\r\n errorHandler(\"Error in onProgress callback\", e);\r\n }\r\n }\r\n : undefined;\r\n\r\n const successHandler = (assets: AssetContainer) => {\r\n if (onSuccess) {\r\n try {\r\n onSuccess(assets);\r\n } catch (e) {\r\n errorHandler(\"Error in onSuccess callback\", e);\r\n }\r\n }\r\n\r\n scene.removePendingData(loadingToken);\r\n };\r\n\r\n return SceneLoader._LoadData(\r\n fileInfo,\r\n scene,\r\n (plugin, data) => {\r\n if ((plugin).loadAssetContainer) {\r\n const syncedPlugin = plugin;\r\n const assetContainer = syncedPlugin.loadAssetContainer(scene, data, fileInfo.rootUrl, errorHandler);\r\n if (!assetContainer) {\r\n return;\r\n }\r\n assetContainer.populateRootNodes();\r\n scene.loadingPluginName = plugin.name;\r\n successHandler(assetContainer);\r\n } else if ((plugin).loadAssetContainerAsync) {\r\n const asyncedPlugin = plugin;\r\n asyncedPlugin\r\n .loadAssetContainerAsync(scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name)\r\n .then((assetContainer) => {\r\n assetContainer.populateRootNodes();\r\n scene.loadingPluginName = plugin.name;\r\n successHandler(assetContainer);\r\n })\r\n .catch((error) => {\r\n errorHandler(error.message, error);\r\n });\r\n } else {\r\n errorHandler(\"LoadAssetContainer is not supported by this plugin. Plugin did not provide a loadAssetContainer or loadAssetContainerAsync method.\");\r\n }\r\n },\r\n progressHandler,\r\n errorHandler,\r\n disposeHandler,\r\n pluginExtension,\r\n name\r\n );\r\n }\r\n\r\n /**\r\n * Load a scene into an asset container\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene (default: empty string)\r\n * @param scene is the instance of Scene to append to\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @returns The loaded asset container\r\n */\r\n public static LoadAssetContainerAsync(\r\n rootUrl: string,\r\n sceneFilename: string | File = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n pluginExtension: Nullable = null\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n SceneLoader.LoadAssetContainer(\r\n rootUrl,\r\n sceneFilename,\r\n scene,\r\n (assetContainer) => {\r\n resolve(assetContainer);\r\n },\r\n onProgress,\r\n (scene, message, exception) => {\r\n reject(exception || new Error(message));\r\n },\r\n pluginExtension\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Import animations from a file into a scene\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene is the instance of BABYLON.Scene to append to (default: last created scene)\r\n * @param overwriteAnimations when true, animations are cleaned before importing new ones. Animations are appended otherwise\r\n * @param animationGroupLoadingMode defines how to handle old animations groups before importing new ones\r\n * @param targetConverter defines a function used to convert animation targets from loaded scene to current scene (default: search node by name)\r\n * @param onSuccess a callback with the scene when import succeeds\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param onError a callback with the scene, a message, and possibly an exception when import fails\r\n * @param pluginExtension the extension used to determine the plugin\r\n */\r\n public static ImportAnimations(\r\n rootUrl: string,\r\n sceneFilename: string | File = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n overwriteAnimations = true,\r\n animationGroupLoadingMode = SceneLoaderAnimationGroupLoadingMode.Clean,\r\n targetConverter: Nullable<(target: any) => any> = null,\r\n onSuccess: Nullable<(scene: Scene) => void> = null,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n onError: Nullable<(scene: Scene, message: string, exception?: any) => void> = null,\r\n pluginExtension: Nullable = null\r\n ): void {\r\n if (!scene) {\r\n Logger.Error(\"No scene available to load animations to\");\r\n return;\r\n }\r\n\r\n if (overwriteAnimations) {\r\n // Reset, stop and dispose all animations before loading new ones\r\n for (const animatable of scene.animatables) {\r\n animatable.reset();\r\n }\r\n scene.stopAllAnimations();\r\n scene.animationGroups.slice().forEach((animationGroup) => {\r\n animationGroup.dispose();\r\n });\r\n const nodes = scene.getNodes();\r\n nodes.forEach((node) => {\r\n if (node.animations) {\r\n node.animations = [];\r\n }\r\n });\r\n } else {\r\n switch (animationGroupLoadingMode) {\r\n case SceneLoaderAnimationGroupLoadingMode.Clean:\r\n scene.animationGroups.slice().forEach((animationGroup) => {\r\n animationGroup.dispose();\r\n });\r\n break;\r\n case SceneLoaderAnimationGroupLoadingMode.Stop:\r\n scene.animationGroups.forEach((animationGroup) => {\r\n animationGroup.stop();\r\n });\r\n break;\r\n case SceneLoaderAnimationGroupLoadingMode.Sync:\r\n scene.animationGroups.forEach((animationGroup) => {\r\n animationGroup.reset();\r\n animationGroup.restart();\r\n });\r\n break;\r\n case SceneLoaderAnimationGroupLoadingMode.NoSync:\r\n // nothing to do\r\n break;\r\n default:\r\n Logger.Error(\"Unknown animation group loading mode value '\" + animationGroupLoadingMode + \"'\");\r\n return;\r\n }\r\n }\r\n\r\n const startingIndexForNewAnimatables = scene.animatables.length;\r\n\r\n const onAssetContainerLoaded = (container: AssetContainer) => {\r\n container.mergeAnimationsTo(scene, scene.animatables.slice(startingIndexForNewAnimatables), targetConverter);\r\n\r\n container.dispose();\r\n\r\n scene.onAnimationFileImportedObservable.notifyObservers(scene);\r\n\r\n if (onSuccess) {\r\n onSuccess(scene);\r\n }\r\n };\r\n\r\n this.LoadAssetContainer(rootUrl, sceneFilename, scene, onAssetContainerLoaded, onProgress, onError, pluginExtension);\r\n }\r\n\r\n /**\r\n * Import animations from a file into a scene\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene is the instance of BABYLON.Scene to append to (default: last created scene)\r\n * @param overwriteAnimations when true, animations are cleaned before importing new ones. Animations are appended otherwise\r\n * @param animationGroupLoadingMode defines how to handle old animations groups before importing new ones\r\n * @param targetConverter defines a function used to convert animation targets from loaded scene to current scene (default: search node by name)\r\n * @param onSuccess a callback with the scene when import succeeds\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param onError a callback with the scene, a message, and possibly an exception when import fails\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @returns the updated scene with imported animations\r\n */\r\n public static ImportAnimationsAsync(\r\n rootUrl: string,\r\n sceneFilename: string | File = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n overwriteAnimations = true,\r\n animationGroupLoadingMode = SceneLoaderAnimationGroupLoadingMode.Clean,\r\n targetConverter: Nullable<(target: any) => any> = null,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onSuccess: Nullable<(scene: Scene) => void> = null,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onError: Nullable<(scene: Scene, message: string, exception?: any) => void> = null,\r\n pluginExtension: Nullable = null\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n SceneLoader.ImportAnimations(\r\n rootUrl,\r\n sceneFilename,\r\n scene,\r\n overwriteAnimations,\r\n animationGroupLoadingMode,\r\n targetConverter,\r\n (_scene: Scene) => {\r\n resolve(_scene);\r\n },\r\n onProgress,\r\n (_scene: Scene, message: string, exception: any) => {\r\n reject(exception || new Error(message));\r\n },\r\n pluginExtension\r\n );\r\n });\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Matrix } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { Material } from \"../Materials/material\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\n/**\r\n * Base class of materials working in push mode in babylon JS\r\n * @internal\r\n */\r\nexport class PushMaterial extends Material {\r\n protected _activeEffect?: Effect;\r\n\r\n protected _normalMatrix: Matrix = new Matrix();\r\n\r\n constructor(name: string, scene?: Scene, storeEffectOnSubMeshes = true) {\r\n super(name, scene);\r\n this._storeEffectOnSubMeshes = storeEffectOnSubMeshes;\r\n }\r\n\r\n public getEffect(): Effect {\r\n return this._storeEffectOnSubMeshes ? this._activeEffect! : super.getEffect()!;\r\n }\r\n\r\n public isReady(mesh?: AbstractMesh, useInstances?: boolean): boolean {\r\n if (!mesh) {\r\n return false;\r\n }\r\n\r\n if (!this._storeEffectOnSubMeshes) {\r\n return true;\r\n }\r\n\r\n if (!mesh.subMeshes || mesh.subMeshes.length === 0) {\r\n return true;\r\n }\r\n\r\n return this.isReadyForSubMesh(mesh, mesh.subMeshes[0], useInstances);\r\n }\r\n\r\n protected _isReadyForSubMesh(subMesh: SubMesh) {\r\n const defines = subMesh.materialDefines;\r\n if (!this.checkReadyOnEveryCall && subMesh.effect && defines) {\r\n if (defines._renderId === this.getScene().getRenderId()) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Binds the given world matrix to the active effect\r\n *\r\n * @param world the matrix to bind\r\n */\r\n public bindOnlyWorldMatrix(world: Matrix): void {\r\n this._activeEffect!.setMatrix(\"world\", world);\r\n }\r\n\r\n /**\r\n * Binds the given normal matrix to the active effect\r\n *\r\n * @param normalMatrix the matrix to bind\r\n */\r\n public bindOnlyNormalMatrix(normalMatrix: Matrix): void {\r\n this._activeEffect!.setMatrix(\"normalMatrix\", normalMatrix);\r\n }\r\n\r\n public bind(world: Matrix, mesh?: Mesh): void {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n this.bindForSubMesh(world, mesh, mesh.subMeshes[0]);\r\n }\r\n\r\n protected _afterBind(mesh?: Mesh, effect: Nullable = null, subMesh?: SubMesh): void {\r\n super._afterBind(mesh, effect, subMesh);\r\n this.getScene()._cachedEffect = effect;\r\n if (subMesh) {\r\n subMesh._drawWrapper._forceRebindOnNextCall = false;\r\n } else {\r\n this._drawWrapper._forceRebindOnNextCall = false;\r\n }\r\n }\r\n\r\n protected _mustRebind(scene: Scene, effect: Effect, subMesh: SubMesh, visibility = 1): boolean {\r\n return subMesh._drawWrapper._forceRebindOnNextCall || scene.isCachedMaterialInvalid(this, effect, visibility);\r\n }\r\n\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean) {\r\n this._activeEffect = undefined;\r\n super.dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh);\r\n }\r\n}\r\n", "/**\r\n * Defines the kind of connection point for node based material\r\n */\r\nexport enum NodeMaterialBlockConnectionPointTypes {\r\n /** Float */\r\n Float = 0x0001,\r\n /** Int */\r\n Int = 0x0002,\r\n /** Vector2 */\r\n Vector2 = 0x0004,\r\n /** Vector3 */\r\n Vector3 = 0x0008,\r\n /** Vector4 */\r\n Vector4 = 0x0010,\r\n /** Color3 */\r\n Color3 = 0x0020,\r\n /** Color4 */\r\n Color4 = 0x0040,\r\n /** Matrix */\r\n Matrix = 0x0080,\r\n /** Custom object */\r\n Object = 0x0100,\r\n /** Detect type based on connection */\r\n AutoDetect = 0x0400,\r\n /** Output type that will be defined by input type */\r\n BasedOnInput = 0x0800,\r\n /** Bitmask of all types */\r\n All = 0x0fff,\r\n}\r\n", "/**\r\n * Enum used to define the target of a block\r\n */\r\nexport enum NodeMaterialBlockTargets {\r\n /** Vertex shader */\r\n Vertex = 1,\r\n /** Fragment shader */\r\n Fragment = 2,\r\n /** Neutral */\r\n Neutral = 4,\r\n /** Vertex and Fragment */\r\n VertexAndFragment = Vertex | Fragment,\r\n}\r\n", "/**\r\n * Manages the defines for the Material\r\n */\r\nexport class MaterialDefines {\r\n /** @internal */\r\n protected _keys: string[] = [];\r\n private _isDirty = true;\r\n /** @internal */\r\n public _renderId: number;\r\n\r\n /** @internal */\r\n public _areLightsDirty = true;\r\n /** @internal */\r\n public _areLightsDisposed = false;\r\n /** @internal */\r\n public _areAttributesDirty = true;\r\n /** @internal */\r\n public _areTexturesDirty = true;\r\n /** @internal */\r\n public _areFresnelDirty = true;\r\n /** @internal */\r\n public _areMiscDirty = true;\r\n /** @internal */\r\n public _arePrePassDirty = true;\r\n /** @internal */\r\n public _areImageProcessingDirty = true;\r\n\r\n /** @internal */\r\n public _normals = false;\r\n /** @internal */\r\n public _uvs = false;\r\n\r\n /** @internal */\r\n public _needNormals = false;\r\n /** @internal */\r\n public _needUVs = false;\r\n\r\n protected _externalProperties?: { [name: string]: { type: string; default: any } };\r\n\r\n [id: string]: any;\r\n\r\n /**\r\n * Creates a new instance\r\n * @param externalProperties list of external properties to inject into the object\r\n */\r\n constructor(externalProperties?: { [name: string]: { type: string; default: any } }) {\r\n this._externalProperties = externalProperties;\r\n\r\n // Initialize External Properties\r\n if (externalProperties) {\r\n for (const prop in externalProperties) {\r\n if (Object.prototype.hasOwnProperty.call(externalProperties, prop)) {\r\n this._setDefaultValue(prop);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Specifies if the material needs to be re-calculated\r\n */\r\n public get isDirty(): boolean {\r\n return this._isDirty;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate that it has been re-calculated\r\n */\r\n public markAsProcessed() {\r\n this._isDirty = false;\r\n this._areAttributesDirty = false;\r\n this._areTexturesDirty = false;\r\n this._areFresnelDirty = false;\r\n this._areLightsDirty = false;\r\n this._areLightsDisposed = false;\r\n this._areMiscDirty = false;\r\n this._arePrePassDirty = false;\r\n this._areImageProcessingDirty = false;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate that it needs to be re-calculated\r\n */\r\n public markAsUnprocessed() {\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate all of its defines need to be re-calculated\r\n */\r\n public markAllAsDirty() {\r\n this._areTexturesDirty = true;\r\n this._areAttributesDirty = true;\r\n this._areLightsDirty = true;\r\n this._areFresnelDirty = true;\r\n this._areMiscDirty = true;\r\n this._arePrePassDirty = false;\r\n this._areImageProcessingDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate that image processing needs to be re-calculated\r\n */\r\n public markAsImageProcessingDirty() {\r\n this._areImageProcessingDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate the lights need to be re-calculated\r\n * @param disposed Defines whether the light is dirty due to dispose or not\r\n */\r\n public markAsLightDirty(disposed = false) {\r\n this._areLightsDirty = true;\r\n this._areLightsDisposed = this._areLightsDisposed || disposed;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the attribute state as changed\r\n */\r\n public markAsAttributesDirty() {\r\n this._areAttributesDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the texture state as changed\r\n */\r\n public markAsTexturesDirty() {\r\n this._areTexturesDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the fresnel state as changed\r\n */\r\n public markAsFresnelDirty() {\r\n this._areFresnelDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the misc state as changed\r\n */\r\n public markAsMiscDirty() {\r\n this._areMiscDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the prepass state as changed\r\n */\r\n public markAsPrePassDirty() {\r\n this._arePrePassDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Rebuilds the material defines\r\n */\r\n public rebuild() {\r\n this._keys.length = 0;\r\n\r\n for (const key of Object.keys(this)) {\r\n if (key[0] === \"_\") {\r\n continue;\r\n }\r\n\r\n this._keys.push(key);\r\n }\r\n\r\n if (this._externalProperties) {\r\n for (const name in this._externalProperties) {\r\n if (this._keys.indexOf(name) === -1) {\r\n this._keys.push(name);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Specifies if two material defines are equal\r\n * @param other - A material define instance to compare to\r\n * @returns - Boolean indicating if the material defines are equal (true) or not (false)\r\n */\r\n public isEqual(other: MaterialDefines): boolean {\r\n if (this._keys.length !== other._keys.length) {\r\n return false;\r\n }\r\n\r\n for (let index = 0; index < this._keys.length; index++) {\r\n const prop = this._keys[index];\r\n\r\n if ((this)[prop] !== (other)[prop]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Clones this instance's defines to another instance\r\n * @param other - material defines to clone values to\r\n */\r\n public cloneTo(other: MaterialDefines): void {\r\n if (this._keys.length !== other._keys.length) {\r\n other._keys = this._keys.slice(0);\r\n }\r\n\r\n for (let index = 0; index < this._keys.length; index++) {\r\n const prop = this._keys[index];\r\n\r\n (other)[prop] = (this)[prop];\r\n }\r\n }\r\n\r\n /**\r\n * Resets the material define values\r\n */\r\n public reset(): void {\r\n this._keys.forEach((prop) => this._setDefaultValue(prop));\r\n }\r\n\r\n private _setDefaultValue(prop: string): void {\r\n const type = this._externalProperties?.[prop]?.type ?? typeof (this)[prop];\r\n const defValue = this._externalProperties?.[prop]?.default;\r\n\r\n switch (type) {\r\n case \"number\":\r\n (this)[prop] = defValue ?? 0;\r\n break;\r\n case \"string\":\r\n (this)[prop] = defValue ?? \"\";\r\n break;\r\n default:\r\n (this)[prop] = defValue ?? false;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Converts the material define values to a string\r\n * @returns - String of material define information\r\n */\r\n public toString(): string {\r\n let result = \"\";\r\n for (let index = 0; index < this._keys.length; index++) {\r\n const prop = this._keys[index];\r\n const value = (this)[prop];\r\n const type = typeof value;\r\n\r\n switch (type) {\r\n case \"number\":\r\n case \"string\":\r\n result += \"#define \" + prop + \" \" + value + \"\\n\";\r\n break;\r\n default:\r\n if (value) {\r\n result += \"#define \" + prop + \"\\n\";\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n", "import { NodeMaterialBlockConnectionPointTypes } from \"./Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport { NodeMaterialBlockTargets } from \"./Enums/nodeMaterialBlockTargets\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { InputBlock } from \"./Blocks/Input/inputBlock\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { NodeMaterialBlock } from \"./nodeMaterialBlock\";\r\n\r\n/**\r\n * Enum used to define the compatibility state between two connection points\r\n */\r\nexport enum NodeMaterialConnectionPointCompatibilityStates {\r\n /** Points are compatibles */\r\n Compatible,\r\n /** Points are incompatible because of their types */\r\n TypeIncompatible,\r\n /** Points are incompatible because of their targets (vertex vs fragment) */\r\n TargetIncompatible,\r\n /** Points are incompatible because they are in the same hierarchy **/\r\n HierarchyIssue,\r\n}\r\n\r\n/**\r\n * Defines the direction of a connection point\r\n */\r\nexport enum NodeMaterialConnectionPointDirection {\r\n /** Input */\r\n Input,\r\n /** Output */\r\n Output,\r\n}\r\n\r\n/**\r\n * Defines a connection point for a block\r\n */\r\nexport class NodeMaterialConnectionPoint {\r\n /**\r\n * Checks if two types are equivalent\r\n * @param type1 type 1 to check\r\n * @param type2 type 2 to check\r\n * @returns true if both types are equivalent, else false\r\n */\r\n public static AreEquivalentTypes(type1: number, type2: number): boolean {\r\n switch (type1) {\r\n case NodeMaterialBlockConnectionPointTypes.Vector3: {\r\n if (type2 === NodeMaterialBlockConnectionPointTypes.Color3) {\r\n return true;\r\n }\r\n break;\r\n }\r\n case NodeMaterialBlockConnectionPointTypes.Vector4: {\r\n if (type2 === NodeMaterialBlockConnectionPointTypes.Color4) {\r\n return true;\r\n }\r\n break;\r\n }\r\n case NodeMaterialBlockConnectionPointTypes.Color3: {\r\n if (type2 === NodeMaterialBlockConnectionPointTypes.Vector3) {\r\n return true;\r\n }\r\n break;\r\n }\r\n case NodeMaterialBlockConnectionPointTypes.Color4: {\r\n if (type2 === NodeMaterialBlockConnectionPointTypes.Vector4) {\r\n return true;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /** @internal */\r\n public _ownerBlock: NodeMaterialBlock;\r\n /** @internal */\r\n public _connectedPoint: Nullable = null;\r\n\r\n private _endpoints = new Array();\r\n private _associatedVariableName: string;\r\n private _direction: NodeMaterialConnectionPointDirection;\r\n\r\n /** @internal */\r\n public _typeConnectionSource: Nullable = null;\r\n\r\n /** @internal */\r\n public _defaultConnectionPointType: Nullable = null;\r\n\r\n /** @internal */\r\n public _linkedConnectionSource: Nullable = null;\r\n\r\n /** @internal */\r\n public _acceptedConnectionPointType: Nullable = null;\r\n\r\n private _type = NodeMaterialBlockConnectionPointTypes.Float;\r\n\r\n /** @internal */\r\n public _enforceAssociatedVariableName = false;\r\n\r\n /** Gets the direction of the point */\r\n public get direction() {\r\n return this._direction;\r\n }\r\n\r\n /** Indicates that this connection point needs dual validation before being connected to another point */\r\n public needDualDirectionValidation: boolean = false;\r\n\r\n /**\r\n * Gets or sets the additional types supported by this connection point\r\n */\r\n public acceptedConnectionPointTypes: NodeMaterialBlockConnectionPointTypes[] = [];\r\n\r\n /**\r\n * Gets or sets the additional types excluded by this connection point\r\n */\r\n public excludedConnectionPointTypes: NodeMaterialBlockConnectionPointTypes[] = [];\r\n\r\n /**\r\n * Observable triggered when this point is connected\r\n */\r\n public onConnectionObservable = new Observable();\r\n\r\n /**\r\n * Observable triggered when this point is disconnected\r\n */\r\n public onDisconnectionObservable = new Observable();\r\n\r\n /**\r\n * Gets or sets the associated variable name in the shader\r\n */\r\n public get associatedVariableName(): string {\r\n if (this._ownerBlock.isInput) {\r\n return (this._ownerBlock as InputBlock).associatedVariableName;\r\n }\r\n\r\n if ((!this._enforceAssociatedVariableName || !this._associatedVariableName) && this._connectedPoint) {\r\n return this._connectedPoint.associatedVariableName;\r\n }\r\n\r\n return this._associatedVariableName;\r\n }\r\n\r\n public set associatedVariableName(value: string) {\r\n this._associatedVariableName = value;\r\n }\r\n\r\n /** Get the inner type (ie AutoDetect for instance instead of the inferred one) */\r\n public get innerType() {\r\n if (this._linkedConnectionSource && this._linkedConnectionSource.isConnected) {\r\n return this.type;\r\n }\r\n return this._type;\r\n }\r\n\r\n /**\r\n * Gets or sets the connection point type (default is float)\r\n */\r\n public get type(): NodeMaterialBlockConnectionPointTypes {\r\n if (this._type === NodeMaterialBlockConnectionPointTypes.AutoDetect) {\r\n if (this._ownerBlock.isInput) {\r\n return (this._ownerBlock as InputBlock).type;\r\n }\r\n\r\n if (this._connectedPoint) {\r\n return this._connectedPoint.type;\r\n }\r\n\r\n if (this._linkedConnectionSource && this._linkedConnectionSource.isConnected) {\r\n return this._linkedConnectionSource.type;\r\n }\r\n }\r\n\r\n if (this._type === NodeMaterialBlockConnectionPointTypes.BasedOnInput) {\r\n if (this._typeConnectionSource) {\r\n if (!this._typeConnectionSource.isConnected && this._defaultConnectionPointType) {\r\n return this._defaultConnectionPointType;\r\n }\r\n return this._typeConnectionSource.type;\r\n } else if (this._defaultConnectionPointType) {\r\n return this._defaultConnectionPointType;\r\n }\r\n }\r\n\r\n return this._type;\r\n }\r\n\r\n public set type(value: NodeMaterialBlockConnectionPointTypes) {\r\n this._type = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the connection point name\r\n */\r\n public name: string;\r\n\r\n /**\r\n * Gets or sets the connection point name\r\n */\r\n public displayName: string;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this connection point can be omitted\r\n */\r\n public isOptional: boolean;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this connection point is exposed on a frame\r\n */\r\n public isExposedOnFrame: boolean = false;\r\n\r\n /**\r\n * Gets or sets number indicating the position that the port is exposed to on a frame\r\n */\r\n public exposedPortPosition: number = -1;\r\n\r\n /**\r\n * Gets or sets a string indicating that this uniform must be defined under a #ifdef\r\n */\r\n public define: string;\r\n\r\n /** @internal */\r\n public _prioritizeVertex = false;\r\n\r\n private _target: NodeMaterialBlockTargets = NodeMaterialBlockTargets.VertexAndFragment;\r\n\r\n /** Gets or sets the target of that connection point */\r\n public get target(): NodeMaterialBlockTargets {\r\n if (!this._prioritizeVertex || !this._ownerBlock) {\r\n return this._target;\r\n }\r\n\r\n if (this._target !== NodeMaterialBlockTargets.VertexAndFragment) {\r\n return this._target;\r\n }\r\n\r\n if (this._ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n return NodeMaterialBlockTargets.Fragment;\r\n }\r\n\r\n return NodeMaterialBlockTargets.Vertex;\r\n }\r\n\r\n public set target(value: NodeMaterialBlockTargets) {\r\n this._target = value;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the current point is connected to another NodeMaterialBlock\r\n */\r\n public get isConnected(): boolean {\r\n return this.connectedPoint !== null || this.hasEndpoints;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the current point is connected to an input block\r\n */\r\n public get isConnectedToInputBlock(): boolean {\r\n return this.connectedPoint !== null && this.connectedPoint.ownerBlock.isInput;\r\n }\r\n\r\n /**\r\n * Gets a the connected input block (if any)\r\n */\r\n public get connectInputBlock(): Nullable {\r\n if (!this.isConnectedToInputBlock) {\r\n return null;\r\n }\r\n\r\n return this.connectedPoint!.ownerBlock as InputBlock;\r\n }\r\n\r\n /** Get the other side of the connection (if any) */\r\n public get connectedPoint(): Nullable {\r\n return this._connectedPoint;\r\n }\r\n\r\n /** Get the block that owns this connection point */\r\n public get ownerBlock(): NodeMaterialBlock {\r\n return this._ownerBlock;\r\n }\r\n\r\n /** Get the block connected on the other side of this connection (if any) */\r\n public get sourceBlock(): Nullable {\r\n if (!this._connectedPoint) {\r\n return null;\r\n }\r\n\r\n return this._connectedPoint.ownerBlock;\r\n }\r\n\r\n /** Get the block connected on the endpoints of this connection (if any) */\r\n public get connectedBlocks(): Array {\r\n if (this._endpoints.length === 0) {\r\n return [];\r\n }\r\n\r\n return this._endpoints.map((e) => e.ownerBlock);\r\n }\r\n\r\n /** Gets the list of connected endpoints */\r\n public get endpoints() {\r\n return this._endpoints;\r\n }\r\n\r\n /** Gets a boolean indicating if that output point is connected to at least one input */\r\n public get hasEndpoints(): boolean {\r\n return this._endpoints && this._endpoints.length > 0;\r\n }\r\n\r\n /** Gets a boolean indicating that this connection has a path to the vertex output*/\r\n public get isDirectlyConnectedToVertexOutput(): boolean {\r\n if (!this.hasEndpoints) {\r\n return false;\r\n }\r\n\r\n for (const endpoint of this._endpoints) {\r\n if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Vertex) {\r\n return true;\r\n }\r\n\r\n if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Neutral || endpoint.ownerBlock.target === NodeMaterialBlockTargets.VertexAndFragment) {\r\n if (endpoint.ownerBlock.outputs.some((o) => o.isDirectlyConnectedToVertexOutput)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /** Gets a boolean indicating that this connection will be used in the vertex shader */\r\n public get isConnectedInVertexShader(): boolean {\r\n if (this.target === NodeMaterialBlockTargets.Vertex) {\r\n return true;\r\n }\r\n\r\n if (!this.hasEndpoints) {\r\n return false;\r\n }\r\n\r\n for (const endpoint of this._endpoints) {\r\n if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Vertex) {\r\n return true;\r\n }\r\n\r\n if (endpoint.target === NodeMaterialBlockTargets.Vertex) {\r\n return true;\r\n }\r\n\r\n if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Neutral || endpoint.ownerBlock.target === NodeMaterialBlockTargets.VertexAndFragment) {\r\n if (endpoint.ownerBlock.outputs.some((o) => o.isConnectedInVertexShader)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /** Gets a boolean indicating that this connection will be used in the fragment shader */\r\n public get isConnectedInFragmentShader(): boolean {\r\n if (this.target === NodeMaterialBlockTargets.Fragment) {\r\n return true;\r\n }\r\n\r\n if (!this.hasEndpoints) {\r\n return false;\r\n }\r\n\r\n for (const endpoint of this._endpoints) {\r\n if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n return true;\r\n }\r\n\r\n if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Neutral || endpoint.ownerBlock.target === NodeMaterialBlockTargets.VertexAndFragment) {\r\n if (endpoint.ownerBlock.isConnectedInFragmentShader()) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Creates a block suitable to be used as an input for this input point.\r\n * If null is returned, a block based on the point type will be created.\r\n * @returns The returned string parameter is the name of the output point of NodeMaterialBlock (first parameter of the returned array) that can be connected to the input\r\n */\r\n public createCustomInputBlock(): Nullable<[NodeMaterialBlock, string]> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Creates a new connection point\r\n * @param name defines the connection point name\r\n * @param ownerBlock defines the block hosting this connection point\r\n * @param direction defines the direction of the connection point\r\n */\r\n public constructor(name: string, ownerBlock: NodeMaterialBlock, direction: NodeMaterialConnectionPointDirection) {\r\n this._ownerBlock = ownerBlock;\r\n this.name = name;\r\n this._direction = direction;\r\n }\r\n\r\n /**\r\n * Gets the current class name e.g. \"NodeMaterialConnectionPoint\"\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"NodeMaterialConnectionPoint\";\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the current point can be connected to another point\r\n * @param connectionPoint defines the other connection point\r\n * @returns a boolean\r\n */\r\n public canConnectTo(connectionPoint: NodeMaterialConnectionPoint) {\r\n return this.checkCompatibilityState(connectionPoint) === NodeMaterialConnectionPointCompatibilityStates.Compatible;\r\n }\r\n\r\n /**\r\n * Gets a number indicating if the current point can be connected to another point\r\n * @param connectionPoint defines the other connection point\r\n * @returns a number defining the compatibility state\r\n */\r\n public checkCompatibilityState(connectionPoint: NodeMaterialConnectionPoint): NodeMaterialConnectionPointCompatibilityStates {\r\n const ownerBlock = this._ownerBlock;\r\n const otherBlock = connectionPoint.ownerBlock;\r\n\r\n if (ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n // Let's check we are not going reverse\r\n\r\n if (otherBlock.target === NodeMaterialBlockTargets.Vertex) {\r\n return NodeMaterialConnectionPointCompatibilityStates.TargetIncompatible;\r\n }\r\n\r\n for (const output of otherBlock.outputs) {\r\n if (output.ownerBlock.target != NodeMaterialBlockTargets.Neutral && output.isConnectedInVertexShader) {\r\n return NodeMaterialConnectionPointCompatibilityStates.TargetIncompatible;\r\n }\r\n }\r\n }\r\n\r\n if (this.type !== connectionPoint.type && connectionPoint.innerType !== NodeMaterialBlockConnectionPointTypes.AutoDetect) {\r\n // Equivalents\r\n if (NodeMaterialConnectionPoint.AreEquivalentTypes(this.type, connectionPoint.type)) {\r\n return NodeMaterialConnectionPointCompatibilityStates.Compatible;\r\n }\r\n\r\n // Accepted types\r\n if (\r\n (connectionPoint.acceptedConnectionPointTypes && connectionPoint.acceptedConnectionPointTypes.indexOf(this.type) !== -1) ||\r\n (connectionPoint._acceptedConnectionPointType && NodeMaterialConnectionPoint.AreEquivalentTypes(connectionPoint._acceptedConnectionPointType.type, this.type))\r\n ) {\r\n return NodeMaterialConnectionPointCompatibilityStates.Compatible;\r\n } else {\r\n return NodeMaterialConnectionPointCompatibilityStates.TypeIncompatible;\r\n }\r\n }\r\n\r\n // Excluded\r\n if (connectionPoint.excludedConnectionPointTypes && connectionPoint.excludedConnectionPointTypes.indexOf(this.type) !== -1) {\r\n return NodeMaterialConnectionPointCompatibilityStates.TypeIncompatible;\r\n }\r\n\r\n // Check hierarchy\r\n let targetBlock = otherBlock;\r\n let sourceBlock = ownerBlock;\r\n if (this.direction === NodeMaterialConnectionPointDirection.Input) {\r\n targetBlock = ownerBlock;\r\n sourceBlock = otherBlock;\r\n }\r\n\r\n if (targetBlock.isAnAncestorOf(sourceBlock)) {\r\n return NodeMaterialConnectionPointCompatibilityStates.HierarchyIssue;\r\n }\r\n\r\n return NodeMaterialConnectionPointCompatibilityStates.Compatible;\r\n }\r\n\r\n /**\r\n * Connect this point to another connection point\r\n * @param connectionPoint defines the other connection point\r\n * @param ignoreConstraints defines if the system will ignore connection type constraints (default is false)\r\n * @returns the current connection point\r\n */\r\n public connectTo(connectionPoint: NodeMaterialConnectionPoint, ignoreConstraints = false): NodeMaterialConnectionPoint {\r\n if (!ignoreConstraints && !this.canConnectTo(connectionPoint)) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Cannot connect these two connectors.\";\r\n }\r\n\r\n this._endpoints.push(connectionPoint);\r\n connectionPoint._connectedPoint = this;\r\n\r\n this._enforceAssociatedVariableName = false;\r\n\r\n this.onConnectionObservable.notifyObservers(connectionPoint);\r\n connectionPoint.onConnectionObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Disconnect this point from one of his endpoint\r\n * @param endpoint defines the other connection point\r\n * @returns the current connection point\r\n */\r\n public disconnectFrom(endpoint: NodeMaterialConnectionPoint): NodeMaterialConnectionPoint {\r\n const index = this._endpoints.indexOf(endpoint);\r\n\r\n if (index === -1) {\r\n return this;\r\n }\r\n\r\n this._endpoints.splice(index, 1);\r\n endpoint._connectedPoint = null;\r\n this._enforceAssociatedVariableName = false;\r\n endpoint._enforceAssociatedVariableName = false;\r\n\r\n this.onDisconnectionObservable.notifyObservers(endpoint);\r\n endpoint.onDisconnectionObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Fill the list of excluded connection point types with all types other than those passed in the parameter\r\n * @param mask Types (ORed values of NodeMaterialBlockConnectionPointTypes) that are allowed, and thus will not be pushed to the excluded list\r\n */\r\n public addExcludedConnectionPointFromAllowedTypes(mask: number): void {\r\n let bitmask = 1;\r\n while (bitmask < NodeMaterialBlockConnectionPointTypes.All) {\r\n if (!(mask & bitmask)) {\r\n this.excludedConnectionPointTypes.push(bitmask);\r\n }\r\n bitmask = bitmask << 1;\r\n }\r\n }\r\n\r\n /**\r\n * Serializes this point in a JSON representation\r\n * @param isInput defines if the connection point is an input (default is true)\r\n * @returns the serialized point object\r\n */\r\n public serialize(isInput = true): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.displayName = this.displayName;\r\n\r\n if (isInput && this.connectedPoint) {\r\n serializationObject.inputName = this.name;\r\n serializationObject.targetBlockId = this.connectedPoint.ownerBlock.uniqueId;\r\n serializationObject.targetConnectionName = this.connectedPoint.name;\r\n serializationObject.isExposedOnFrame = true;\r\n serializationObject.exposedPortPosition = this.exposedPortPosition;\r\n }\r\n\r\n if (this.isExposedOnFrame || this.exposedPortPosition >= 0) {\r\n serializationObject.isExposedOnFrame = true;\r\n serializationObject.exposedPortPosition = this.exposedPortPosition;\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Release resources\r\n */\r\n public dispose() {\r\n this.onConnectionObservable.clear();\r\n this.onDisconnectionObservable.clear();\r\n }\r\n}\r\n", "import { NodeMaterialBlockConnectionPointTypes } from \"./Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"./nodeMaterialBuildState\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { NodeMaterialConnectionPoint, NodeMaterialConnectionPointDirection } from \"./nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"./Enums/nodeMaterialBlockTargets\";\r\nimport type { Effect } from \"../effect\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"./nodeMaterial\";\r\nimport type { InputBlock } from \"./Blocks/Input/inputBlock\";\r\nimport { UniqueIdGenerator } from \"../../Misc/uniqueIdGenerator\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { GetClass } from \"../../Misc/typeStore\";\r\nimport type { EffectFallbacks } from \"../effectFallbacks\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Defines a block that can be used inside a node based material\r\n */\r\nexport class NodeMaterialBlock {\r\n private _buildId: number;\r\n private _buildTarget: NodeMaterialBlockTargets;\r\n protected _target: NodeMaterialBlockTargets;\r\n private _isFinalMerger = false;\r\n private _isInput = false;\r\n private _isTeleportOut = false;\r\n private _isTeleportIn = false;\r\n private _name = \"\";\r\n protected _isUnique = false;\r\n\r\n /** Gets or sets a boolean indicating that only one input can be connected at a time */\r\n public inputsAreExclusive = false;\r\n\r\n /** @internal */\r\n public _codeVariableName = \"\";\r\n\r\n /** @internal */\r\n public _inputs = new Array();\r\n /** @internal */\r\n public _outputs = new Array();\r\n\r\n /** @internal */\r\n public _preparationId: number;\r\n\r\n /** @internal */\r\n public readonly _originalTargetIsNeutral: boolean;\r\n\r\n /**\r\n * Gets the name of the block\r\n */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n /**\r\n * Sets the name of the block. Will check if the name is valid.\r\n */\r\n public set name(newName: string) {\r\n if (!this.validateBlockName(newName)) {\r\n return;\r\n }\r\n\r\n this._name = newName;\r\n }\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets or sets the comments associated with this block\r\n */\r\n public comments: string = \"\";\r\n\r\n /**\r\n * Gets a boolean indicating that this block can only be used once per NodeMaterial\r\n */\r\n public get isUnique() {\r\n return this._isUnique;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this block is an end block (e.g. it is generating a system value)\r\n */\r\n public get isFinalMerger(): boolean {\r\n return this._isFinalMerger;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this block is an input (e.g. it sends data to the shader)\r\n */\r\n public get isInput(): boolean {\r\n return this._isInput;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a teleport out\r\n */\r\n public get isTeleportOut(): boolean {\r\n return this._isTeleportOut;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a teleport in\r\n */\r\n public get isTeleportIn(): boolean {\r\n return this._isTeleportIn;\r\n }\r\n\r\n /**\r\n * Gets or sets the build Id\r\n */\r\n public get buildId(): number {\r\n return this._buildId;\r\n }\r\n\r\n public set buildId(value: number) {\r\n this._buildId = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the target of the block\r\n */\r\n public get target() {\r\n return this._target;\r\n }\r\n\r\n public set target(value: NodeMaterialBlockTargets) {\r\n if ((this._target & value) !== 0) {\r\n return;\r\n }\r\n this._target = value;\r\n }\r\n\r\n /**\r\n * Gets the list of input points\r\n */\r\n public get inputs(): NodeMaterialConnectionPoint[] {\r\n return this._inputs;\r\n }\r\n\r\n /** Gets the list of output points */\r\n public get outputs(): NodeMaterialConnectionPoint[] {\r\n return this._outputs;\r\n }\r\n\r\n /**\r\n * Find an input by its name\r\n * @param name defines the name of the input to look for\r\n * @returns the input or null if not found\r\n */\r\n public getInputByName(name: string) {\r\n const filter = this._inputs.filter((e) => e.name === name);\r\n\r\n if (filter.length) {\r\n return filter[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Find an output by its name\r\n * @param name defines the name of the output to look for\r\n * @returns the output or null if not found\r\n */\r\n public getOutputByName(name: string) {\r\n const filter = this._outputs.filter((e) => e.name === name);\r\n\r\n if (filter.length) {\r\n return filter[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that this input can be edited in the Inspector (false by default) */\r\n public visibleInInspector = false;\r\n\r\n /** Gets or sets a boolean indicating that this input can be edited from a collapsed frame */\r\n public visibleOnFrame = false;\r\n\r\n /**\r\n * Creates a new NodeMaterialBlock\r\n * @param name defines the block name\r\n * @param target defines the target of that block (Vertex by default)\r\n * @param isFinalMerger defines a boolean indicating that this block is an end block (e.g. it is generating a system value). Default is false\r\n */\r\n public constructor(name: string, target = NodeMaterialBlockTargets.Vertex, isFinalMerger = false) {\r\n this._target = target;\r\n this._originalTargetIsNeutral = target === NodeMaterialBlockTargets.Neutral;\r\n this._isFinalMerger = isFinalMerger;\r\n this._isInput = this.getClassName() === \"InputBlock\";\r\n this._isTeleportOut = this.getClassName() === \"NodeMaterialTeleportOutBlock\";\r\n this._isTeleportIn = this.getClassName() === \"NodeMaterialTeleportInBlock\";\r\n this._name = name;\r\n this.uniqueId = UniqueIdGenerator.UniqueId;\r\n }\r\n\r\n /** @internal */\r\n public _setInitialTarget(target: NodeMaterialBlockTargets): void {\r\n this._target = target;\r\n (this._originalTargetIsNeutral as boolean) = target === NodeMaterialBlockTargets.Neutral;\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public initialize(state: NodeMaterialBuildState) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Bind data to effect. Will only be called for blocks with isBindable === true\r\n * @param effect defines the effect to bind data to\r\n * @param nodeMaterial defines the hosting NodeMaterial\r\n * @param mesh defines the mesh that will be rendered\r\n * @param subMesh defines the submesh that will be rendered\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh, subMesh?: SubMesh) {\r\n // Do nothing\r\n }\r\n\r\n protected _declareOutput(output: NodeMaterialConnectionPoint, state: NodeMaterialBuildState): string {\r\n return `${state._getGLType(output.type)} ${output.associatedVariableName}`;\r\n }\r\n\r\n protected _writeVariable(currentPoint: NodeMaterialConnectionPoint): string {\r\n const connectionPoint = currentPoint.connectedPoint;\r\n\r\n if (connectionPoint) {\r\n return `${currentPoint.associatedVariableName}`;\r\n }\r\n\r\n return `0.`;\r\n }\r\n\r\n protected _writeFloat(value: number) {\r\n let stringVersion = value.toString();\r\n\r\n if (stringVersion.indexOf(\".\") === -1) {\r\n stringVersion += \".0\";\r\n }\r\n return `${stringVersion}`;\r\n }\r\n\r\n /**\r\n * Gets the current class name e.g. \"NodeMaterialBlock\"\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"NodeMaterialBlock\";\r\n }\r\n\r\n /** Gets a boolean indicating that this connection will be used in the fragment shader\r\n * @returns true if connected in fragment shader\r\n */\r\n public isConnectedInFragmentShader() {\r\n return this.outputs.some((o) => o.isConnectedInFragmentShader);\r\n }\r\n\r\n /**\r\n * Register a new input. Must be called inside a block constructor\r\n * @param name defines the connection point name\r\n * @param type defines the connection point type\r\n * @param isOptional defines a boolean indicating that this input can be omitted\r\n * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default)\r\n * @param point an already created connection point. If not provided, create a new one\r\n * @returns the current block\r\n */\r\n public registerInput(\r\n name: string,\r\n type: NodeMaterialBlockConnectionPointTypes,\r\n isOptional: boolean = false,\r\n target?: NodeMaterialBlockTargets,\r\n point?: NodeMaterialConnectionPoint\r\n ) {\r\n point = point ?? new NodeMaterialConnectionPoint(name, this, NodeMaterialConnectionPointDirection.Input);\r\n point.type = type;\r\n point.isOptional = isOptional;\r\n if (target) {\r\n point.target = target;\r\n }\r\n\r\n this._inputs.push(point);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a new output. Must be called inside a block constructor\r\n * @param name defines the connection point name\r\n * @param type defines the connection point type\r\n * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default)\r\n * @param point an already created connection point. If not provided, create a new one\r\n * @returns the current block\r\n */\r\n public registerOutput(name: string, type: NodeMaterialBlockConnectionPointTypes, target?: NodeMaterialBlockTargets, point?: NodeMaterialConnectionPoint) {\r\n point = point ?? new NodeMaterialConnectionPoint(name, this, NodeMaterialConnectionPointDirection.Output);\r\n point.type = type;\r\n if (target) {\r\n point.target = target;\r\n }\r\n\r\n this._outputs.push(point);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Will return the first available input e.g. the first one which is not an uniform or an attribute\r\n * @param forOutput defines an optional connection point to check compatibility with\r\n * @returns the first available input or null\r\n */\r\n public getFirstAvailableInput(forOutput: Nullable = null) {\r\n for (const input of this._inputs) {\r\n if (!input.connectedPoint) {\r\n if (!forOutput || forOutput.type === input.type || input.type === NodeMaterialBlockConnectionPointTypes.AutoDetect) {\r\n return input;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Will return the first available output e.g. the first one which is not yet connected and not a varying\r\n * @param forBlock defines an optional block to check compatibility with\r\n * @returns the first available input or null\r\n */\r\n public getFirstAvailableOutput(forBlock: Nullable = null) {\r\n for (const output of this._outputs) {\r\n if (!forBlock || !forBlock.target || forBlock.target === NodeMaterialBlockTargets.Neutral || (forBlock.target & output.target) !== 0) {\r\n return output;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the sibling of the given output\r\n * @param current defines the current output\r\n * @returns the next output in the list or null\r\n */\r\n public getSiblingOutput(current: NodeMaterialConnectionPoint) {\r\n const index = this._outputs.indexOf(current);\r\n\r\n if (index === -1 || index >= this._outputs.length) {\r\n return null;\r\n }\r\n\r\n return this._outputs[index + 1];\r\n }\r\n\r\n /**\r\n * Checks if the current block is an ancestor of a given block\r\n * @param block defines the potential descendant block to check\r\n * @returns true if block is a descendant\r\n */\r\n public isAnAncestorOf(block: NodeMaterialBlock): boolean {\r\n for (const output of this._outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n if (endpoint.ownerBlock === block) {\r\n return true;\r\n }\r\n if (endpoint.ownerBlock.isAnAncestorOf(block)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Connect current block with another block\r\n * @param other defines the block to connect with\r\n * @param options define the various options to help pick the right connections\r\n * @param options.input\r\n * @param options.output\r\n * @param options.outputSwizzle\r\n * @returns the current block\r\n */\r\n public connectTo(\r\n other: NodeMaterialBlock,\r\n options?: {\r\n input?: string;\r\n output?: string;\r\n outputSwizzle?: string;\r\n }\r\n ) {\r\n if (this._outputs.length === 0) {\r\n return;\r\n }\r\n\r\n let output = options && options.output ? this.getOutputByName(options.output) : this.getFirstAvailableOutput(other);\r\n\r\n let notFound = true;\r\n while (notFound) {\r\n const input = options && options.input ? other.getInputByName(options.input) : other.getFirstAvailableInput(output);\r\n\r\n if (output && input && output.canConnectTo(input)) {\r\n output.connectTo(input);\r\n notFound = false;\r\n } else if (!output) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Unable to find a compatible match\";\r\n } else {\r\n output = this.getSiblingOutput(output);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n // Empty. Must be defined by child nodes\r\n }\r\n\r\n /**\r\n * Add uniforms, samplers and uniform buffers at compilation time\r\n * @param state defines the state to update\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param uniformBuffers defines the list of uniform buffer names\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public updateUniformsAndSamples(state: NodeMaterialBuildState, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, uniformBuffers: string[]) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Add potential fallbacks if shader compilation fails\r\n * @param mesh defines the mesh to be rendered\r\n * @param fallbacks defines the current prioritized list of fallbacks\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public provideFallbacks(mesh: AbstractMesh, fallbacks: EffectFallbacks) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Initialize defines for shader compilation\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param useInstances specifies that instances should be used\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public initializeDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, useInstances: boolean = false) {}\r\n\r\n /**\r\n * Update defines for shader compilation\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param useInstances specifies that instances should be used\r\n * @param subMesh defines which submesh to render\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, useInstances: boolean = false, subMesh?: SubMesh) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Lets the block try to connect some inputs automatically\r\n * @param material defines the hosting NodeMaterial\r\n * @param additionalFilteringInfo optional additional filtering condition when looking for compatible blocks\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Function called when a block is declared as repeatable content generator\r\n * @param vertexShaderState defines the current compilation state for the vertex shader\r\n * @param fragmentShaderState defines the current compilation state for the fragment shader\r\n * @param mesh defines the mesh to be rendered\r\n * @param defines defines the material defines to update\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public replaceRepeatableContent(vertexShaderState: NodeMaterialBuildState, fragmentShaderState: NodeMaterialBuildState, mesh: AbstractMesh, defines: NodeMaterialDefines) {\r\n // Do nothing\r\n }\r\n\r\n /** Gets a boolean indicating that the code of this block will be promoted to vertex shader even if connected to fragment output */\r\n public get willBeGeneratedIntoVertexShaderFromFragmentShader(): boolean {\r\n if (this.isInput || this.isFinalMerger) {\r\n return false;\r\n }\r\n\r\n if (this._outputs.some((o) => o.isDirectlyConnectedToVertexOutput)) {\r\n return false;\r\n }\r\n\r\n if (this.target === NodeMaterialBlockTargets.Vertex) {\r\n return false;\r\n }\r\n\r\n if (this.target === NodeMaterialBlockTargets.VertexAndFragment || this.target === NodeMaterialBlockTargets.Neutral) {\r\n if (this._outputs.some((o) => o.isConnectedInVertexShader)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if the block is ready\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param useInstances specifies that instances should be used\r\n * @returns true if the block is ready\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReady(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, useInstances: boolean = false) {\r\n return true;\r\n }\r\n\r\n protected _linkConnectionTypes(inputIndex0: number, inputIndex1: number, looseCoupling = false) {\r\n if (looseCoupling) {\r\n this._inputs[inputIndex1]._acceptedConnectionPointType = this._inputs[inputIndex0];\r\n } else {\r\n this._inputs[inputIndex0]._linkedConnectionSource = this._inputs[inputIndex1];\r\n }\r\n this._inputs[inputIndex1]._linkedConnectionSource = this._inputs[inputIndex0];\r\n }\r\n\r\n private _processBuild(block: NodeMaterialBlock, state: NodeMaterialBuildState, input: NodeMaterialConnectionPoint, activeBlocks: NodeMaterialBlock[]) {\r\n block.build(state, activeBlocks);\r\n\r\n const localBlockIsFragment = state._vertexState != null;\r\n const otherBlockWasGeneratedInVertexShader = block._buildTarget === NodeMaterialBlockTargets.Vertex && block.target !== NodeMaterialBlockTargets.VertexAndFragment;\r\n\r\n if (\r\n localBlockIsFragment &&\r\n ((block.target & block._buildTarget) === 0 ||\r\n (block.target & input.target) === 0 ||\r\n (this.target !== NodeMaterialBlockTargets.VertexAndFragment && otherBlockWasGeneratedInVertexShader))\r\n ) {\r\n // context switch! We need a varying\r\n if (\r\n (!block.isInput && state.target !== block._buildTarget) || // block was already emitted by vertex shader\r\n (block.isInput && (block as InputBlock).isAttribute && !(block as InputBlock)._noContextSwitch) // block is an attribute\r\n ) {\r\n const connectedPoint = input.connectedPoint!;\r\n if (state._vertexState._emitVaryingFromString(\"v_\" + connectedPoint.associatedVariableName, state._getGLType(connectedPoint.type))) {\r\n state._vertexState.compilationString += `${\"v_\" + connectedPoint.associatedVariableName} = ${connectedPoint.associatedVariableName};\\n`;\r\n }\r\n input.associatedVariableName = \"v_\" + connectedPoint.associatedVariableName;\r\n input._enforceAssociatedVariableName = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Validates the new name for the block node.\r\n * @param newName the new name to be given to the node.\r\n * @returns false if the name is a reserve word, else true.\r\n */\r\n public validateBlockName(newName: string) {\r\n const reservedNames: Array = [\r\n \"position\",\r\n \"normal\",\r\n \"tangent\",\r\n \"particle_positionw\",\r\n \"uv\",\r\n \"uv2\",\r\n \"uv3\",\r\n \"uv4\",\r\n \"uv5\",\r\n \"uv6\",\r\n \"position2d\",\r\n \"particle_uv\",\r\n \"matricesIndices\",\r\n \"matricesWeights\",\r\n \"world0\",\r\n \"world1\",\r\n \"world2\",\r\n \"world3\",\r\n \"particle_color\",\r\n \"particle_texturemask\",\r\n ];\r\n for (const reservedName of reservedNames) {\r\n if (newName === reservedName) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _customBuildStep(state: NodeMaterialBuildState, activeBlocks: NodeMaterialBlock[]): void {\r\n // Must be implemented by children\r\n }\r\n\r\n /**\r\n * Compile the current node and generate the shader code\r\n * @param state defines the current compilation state (uniforms, samplers, current string)\r\n * @param activeBlocks defines the list of active blocks (i.e. blocks to compile)\r\n * @returns true if already built\r\n */\r\n public build(state: NodeMaterialBuildState, activeBlocks: NodeMaterialBlock[]): boolean {\r\n if (this._buildId === state.sharedData.buildId) {\r\n return true;\r\n }\r\n\r\n if (!this.isInput) {\r\n /** Prepare outputs */\r\n for (const output of this._outputs) {\r\n if (!output.associatedVariableName) {\r\n output.associatedVariableName = state._getFreeVariableName(output.name);\r\n }\r\n }\r\n }\r\n\r\n // Check if \"parent\" blocks are compiled\r\n for (const input of this._inputs) {\r\n if (!input.connectedPoint) {\r\n if (!input.isOptional) {\r\n // Emit a warning\r\n state.sharedData.checks.notConnectedNonOptionalInputs.push(input);\r\n }\r\n continue;\r\n }\r\n\r\n if (this.target !== NodeMaterialBlockTargets.Neutral) {\r\n if ((input.target & this.target!) === 0) {\r\n continue;\r\n }\r\n\r\n if ((input.target & state.target!) === 0) {\r\n continue;\r\n }\r\n }\r\n\r\n const block = input.connectedPoint.ownerBlock;\r\n if (block && block !== this) {\r\n this._processBuild(block, state, input, activeBlocks);\r\n }\r\n }\r\n\r\n this._customBuildStep(state, activeBlocks);\r\n\r\n if (this._buildId === state.sharedData.buildId) {\r\n return true; // Need to check again as inputs can be connected multiple time to this endpoint\r\n }\r\n\r\n // Logs\r\n if (state.sharedData.verbose) {\r\n Logger.Log(`${state.target === NodeMaterialBlockTargets.Vertex ? \"Vertex shader\" : \"Fragment shader\"}: Building ${this.name} [${this.getClassName()}]`);\r\n }\r\n\r\n // Checks final outputs\r\n if (this.isFinalMerger) {\r\n switch (state.target) {\r\n case NodeMaterialBlockTargets.Vertex:\r\n state.sharedData.checks.emitVertex = true;\r\n break;\r\n case NodeMaterialBlockTargets.Fragment:\r\n state.sharedData.checks.emitFragment = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!this.isInput && state.sharedData.emitComments) {\r\n state.compilationString += `\\n//${this.name}\\n`;\r\n }\r\n\r\n this._buildBlock(state);\r\n\r\n this._buildId = state.sharedData.buildId;\r\n this._buildTarget = state.target;\r\n\r\n // Compile connected blocks\r\n for (const output of this._outputs) {\r\n if ((output.target & state.target) === 0) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n const block = endpoint.ownerBlock;\r\n\r\n if (block && (block.target & state.target) !== 0 && activeBlocks.indexOf(block) !== -1) {\r\n this._processBuild(block, state, endpoint, activeBlocks);\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n protected _inputRename(name: string) {\r\n return name;\r\n }\r\n\r\n protected _outputRename(name: string) {\r\n return name;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n const variableName = this._codeVariableName;\r\n return `${variableName}.visibleInInspector = ${this.visibleInInspector};\\n${variableName}.visibleOnFrame = ${this.visibleOnFrame};\\n${variableName}.target = ${this.target};\\n`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _dumpCode(uniqueNames: string[], alreadyDumped: NodeMaterialBlock[]) {\r\n alreadyDumped.push(this);\r\n\r\n // Get unique name\r\n const nameAsVariableName = this.name.replace(/[^A-Za-z_]+/g, \"\");\r\n this._codeVariableName = nameAsVariableName || `${this.getClassName()}_${this.uniqueId}`;\r\n\r\n if (uniqueNames.indexOf(this._codeVariableName) !== -1) {\r\n let index = 0;\r\n do {\r\n index++;\r\n this._codeVariableName = nameAsVariableName + index;\r\n } while (uniqueNames.indexOf(this._codeVariableName) !== -1);\r\n }\r\n\r\n uniqueNames.push(this._codeVariableName);\r\n\r\n // Declaration\r\n let codeString = `\\n// ${this.getClassName()}\\n`;\r\n if (this.comments) {\r\n codeString += `// ${this.comments}\\n`;\r\n }\r\n codeString += `var ${this._codeVariableName} = new BABYLON.${this.getClassName()}(\"${this.name}\");\\n`;\r\n\r\n // Properties\r\n codeString += this._dumpPropertiesCode();\r\n\r\n // Inputs\r\n for (const input of this.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n\r\n const connectedOutput = input.connectedPoint!;\r\n const connectedBlock = connectedOutput.ownerBlock;\r\n\r\n if (alreadyDumped.indexOf(connectedBlock) === -1) {\r\n codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n\r\n // Outputs\r\n for (const output of this.outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n const connectedBlock = endpoint.ownerBlock;\r\n if (connectedBlock && alreadyDumped.indexOf(connectedBlock) === -1) {\r\n codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _dumpCodeForOutputConnections(alreadyDumped: NodeMaterialBlock[]) {\r\n let codeString = \"\";\r\n\r\n if (alreadyDumped.indexOf(this) !== -1) {\r\n return codeString;\r\n }\r\n\r\n alreadyDumped.push(this);\r\n\r\n for (const input of this.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n\r\n const connectedOutput = input.connectedPoint!;\r\n const connectedBlock = connectedOutput.ownerBlock;\r\n\r\n codeString += connectedBlock._dumpCodeForOutputConnections(alreadyDumped);\r\n codeString += `${connectedBlock._codeVariableName}.${connectedBlock._outputRename(connectedOutput.name)}.connectTo(${this._codeVariableName}.${this._inputRename(\r\n input.name\r\n )});\\n`;\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * Clone the current block to a new identical block\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a copy of the current block\r\n */\r\n public clone(scene: Scene, rootUrl: string = \"\") {\r\n const serializationObject = this.serialize();\r\n\r\n const blockType = GetClass(serializationObject.customType);\r\n if (blockType) {\r\n const block: NodeMaterialBlock = new blockType();\r\n block._deserialize(serializationObject, scene, rootUrl);\r\n\r\n return block;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Serializes this block in a JSON representation\r\n * @returns the serialized block object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n serializationObject.customType = \"BABYLON.\" + this.getClassName();\r\n serializationObject.id = this.uniqueId;\r\n serializationObject.name = this.name;\r\n serializationObject.comments = this.comments;\r\n serializationObject.visibleInInspector = this.visibleInInspector;\r\n serializationObject.visibleOnFrame = this.visibleOnFrame;\r\n serializationObject.target = this.target;\r\n\r\n serializationObject.inputs = [];\r\n serializationObject.outputs = [];\r\n\r\n for (const input of this.inputs) {\r\n serializationObject.inputs.push(input.serialize());\r\n }\r\n\r\n for (const output of this.outputs) {\r\n serializationObject.outputs.push(output.serialize(false));\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n this.name = serializationObject.name;\r\n this.comments = serializationObject.comments;\r\n this.visibleInInspector = !!serializationObject.visibleInInspector;\r\n this.visibleOnFrame = !!serializationObject.visibleOnFrame;\r\n this._target = serializationObject.target ?? this.target;\r\n this._deserializePortDisplayNamesAndExposedOnFrame(serializationObject);\r\n }\r\n\r\n private _deserializePortDisplayNamesAndExposedOnFrame(serializationObject: any) {\r\n const serializedInputs = serializationObject.inputs;\r\n const serializedOutputs = serializationObject.outputs;\r\n if (serializedInputs) {\r\n serializedInputs.forEach((port: any, i: number) => {\r\n if (port.displayName) {\r\n this.inputs[i].displayName = port.displayName;\r\n }\r\n if (port.isExposedOnFrame) {\r\n this.inputs[i].isExposedOnFrame = port.isExposedOnFrame;\r\n this.inputs[i].exposedPortPosition = port.exposedPortPosition;\r\n }\r\n });\r\n }\r\n if (serializedOutputs) {\r\n serializedOutputs.forEach((port: any, i: number) => {\r\n if (port.displayName) {\r\n this.outputs[i].displayName = port.displayName;\r\n }\r\n if (port.isExposedOnFrame) {\r\n this.outputs[i].isExposedOnFrame = port.isExposedOnFrame;\r\n this.outputs[i].exposedPortPosition = port.exposedPortPosition;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Release resources\r\n */\r\n public dispose() {\r\n for (const input of this.inputs) {\r\n input.dispose();\r\n }\r\n\r\n for (const output of this.outputs) {\r\n output.dispose();\r\n }\r\n }\r\n}\r\n", "import { NodeMaterialBlock } from \"../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport type { InputBlock } from \"./Input/inputBlock\";\r\nimport type { AbstractMesh } from \"../../../Meshes/abstractMesh\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"../nodeMaterial\";\r\n\r\n/**\r\n * Block used to transform a vector (2, 3 or 4) with a matrix. It will generate a Vector4\r\n */\r\nexport class TransformBlock extends NodeMaterialBlock {\r\n /**\r\n * Defines the value to use to complement W value to transform it to a Vector4\r\n */\r\n public complementW = 1;\r\n\r\n /**\r\n * Defines the value to use to complement z value to transform it to a Vector4\r\n */\r\n public complementZ = 0;\r\n\r\n /**\r\n * Creates a new TransformBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.target = NodeMaterialBlockTargets.Vertex;\r\n\r\n this.registerInput(\"vector\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerInput(\"transform\", NodeMaterialBlockConnectionPointTypes.Matrix);\r\n this.registerOutput(\"output\", NodeMaterialBlockConnectionPointTypes.Vector4);\r\n this.registerOutput(\"xyz\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n\r\n this._inputs[0].onConnectionObservable.add((other) => {\r\n if (other.ownerBlock.isInput) {\r\n const otherAsInput = other.ownerBlock as InputBlock;\r\n\r\n if (otherAsInput.name === \"normal\" || otherAsInput.name === \"tangent\") {\r\n this.complementW = 0;\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"TransformBlock\";\r\n }\r\n\r\n /**\r\n * Gets the vector input\r\n */\r\n public get vector(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the xyz output component\r\n */\r\n public get xyz(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the matrix transform input\r\n */\r\n public get transform(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const vector = this.vector;\r\n const transform = this.transform;\r\n\r\n if (vector.connectedPoint) {\r\n // None uniform scaling case.\r\n if (this.complementW === 0) {\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n state.sharedData.blocksWithDefines.push(this);\r\n\r\n const transformName = state._getFreeVariableName(`${transform.associatedVariableName}_NUS`);\r\n state.compilationString += `mat3 ${transformName} = mat3(${transform.associatedVariableName});\\n`;\r\n state.compilationString += `#ifdef NONUNIFORMSCALING\\n`;\r\n state.compilationString += `${transformName} = transposeMat3(inverseMat3(${transformName}));\\n`;\r\n state.compilationString += `#endif\\n`;\r\n switch (vector.connectedPoint.type) {\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n state.compilationString +=\r\n this._declareOutput(this.output, state) +\r\n ` = vec4(${transformName} * vec3(${vector.associatedVariableName}, ${this._writeFloat(this.complementZ)}), ${this._writeFloat(this.complementW)});\\n`;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n state.compilationString +=\r\n this._declareOutput(this.output, state) + ` = vec4(${transformName} * ${vector.associatedVariableName}, ${this._writeFloat(this.complementW)});\\n`;\r\n break;\r\n default:\r\n state.compilationString +=\r\n this._declareOutput(this.output, state) + ` = vec4(${transformName} * ${vector.associatedVariableName}.xyz, ${this._writeFloat(this.complementW)});\\n`;\r\n break;\r\n }\r\n } else {\r\n const transformName = transform.associatedVariableName;\r\n switch (vector.connectedPoint.type) {\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n state.compilationString +=\r\n this._declareOutput(this.output, state) +\r\n ` = ${transformName} * vec4(${vector.associatedVariableName}, ${this._writeFloat(this.complementZ)}, ${this._writeFloat(this.complementW)});\\n`;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n state.compilationString +=\r\n this._declareOutput(this.output, state) + ` = ${transformName} * vec4(${vector.associatedVariableName}, ${this._writeFloat(this.complementW)});\\n`;\r\n break;\r\n default:\r\n state.compilationString += this._declareOutput(this.output, state) + ` = ${transformName} * ${vector.associatedVariableName};\\n`;\r\n break;\r\n }\r\n }\r\n\r\n if (this.xyz.hasEndpoints) {\r\n state.compilationString += this._declareOutput(this.xyz, state) + ` = ${this.output.associatedVariableName}.xyz;\\n`;\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Update defines for shader compilation\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n */\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n // Do nothing\r\n if (mesh.nonUniformScaling) {\r\n defines.setValue(\"NONUNIFORMSCALING\", true);\r\n }\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.complementZ = this.complementZ;\r\n serializationObject.complementW = this.complementW;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.complementZ = serializationObject.complementZ !== undefined ? serializationObject.complementZ : 0.0;\r\n this.complementW = serializationObject.complementW !== undefined ? serializationObject.complementW : 1.0;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode() + `${this._codeVariableName}.complementZ = ${this.complementZ};\\n`;\r\n\r\n codeString += `${this._codeVariableName}.complementW = ${this.complementW};\\n`;\r\n\r\n return codeString;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TransformBlock\", TransformBlock);\r\n", "import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport type { Immutable } from \"../../../../types\";\r\n\r\nimport type { FragmentOutputBlock } from \"../Fragment/fragmentOutputBlock\";\r\n\r\n/**\r\n * Block used to output the vertex position\r\n */\r\nexport class VertexOutputBlock extends NodeMaterialBlock {\r\n /**\r\n * Creates a new VertexOutputBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Vertex, true);\r\n\r\n this.registerInput(\"vector\", NodeMaterialBlockConnectionPointTypes.Vector4);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"VertexOutputBlock\";\r\n }\r\n\r\n /**\r\n * Gets the vector input component\r\n */\r\n public get vector(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n private _isLogarithmicDepthEnabled(nodeList: Immutable, useLogarithmicDepth: boolean): boolean {\r\n if (useLogarithmicDepth) {\r\n return true;\r\n }\r\n\r\n for (const node of nodeList) {\r\n if ((node as FragmentOutputBlock).useLogarithmicDepth) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const input = this.vector;\r\n\r\n state.compilationString += `gl_Position = ${input.associatedVariableName};\\n`;\r\n\r\n if (this._isLogarithmicDepthEnabled(state.sharedData.fragmentOutputNodes, state.sharedData.nodeMaterial.useLogarithmicDepth)) {\r\n state._emitUniformFromString(\"logarithmicDepthConstant\", \"float\");\r\n state._emitVaryingFromString(\"vFragmentDepth\", \"float\");\r\n\r\n state.compilationString += `vFragmentDepth = 1.0 + gl_Position.w;\\n`;\r\n state.compilationString += `gl_Position.z = log2(max(0.000001, vFragmentDepth)) * logarithmicDepthConstant;\\n`;\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.VertexOutputBlock\", VertexOutputBlock);\r\n", "import type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\n\r\n/**\r\n * Enum defining the type of properties that can be edited in the property pages in the node editor\r\n */\r\nexport enum PropertyTypeForEdition {\r\n /** property is a boolean */\r\n Boolean,\r\n /** property is a float */\r\n Float,\r\n /** property is a int */\r\n Int,\r\n /** property is a Vector2 */\r\n Vector2,\r\n /** property is a list of values */\r\n List,\r\n}\r\n\r\n/**\r\n * Interface that defines an option in a variable of type list\r\n */\r\nexport interface IEditablePropertyListOption {\r\n /** label of the option */\r\n label: string;\r\n /** value of the option */\r\n value: number;\r\n}\r\n\r\n/**\r\n * Interface that defines the options available for an editable property\r\n */\r\nexport interface IEditablePropertyOption {\r\n /** min value */\r\n min?: number;\r\n /** max value */\r\n max?: number;\r\n /** notifiers: indicates which actions to take when the property is changed */\r\n notifiers?: {\r\n /** the entity should be rebuilt */\r\n rebuild?: boolean;\r\n /** the preview should be updated */\r\n update?: boolean;\r\n /** the onPreviewCommandActivated observer of the preview manager should be triggered */\r\n activatePreviewCommand?: boolean;\r\n /** a callback to trigger */\r\n callback?: (scene: Nullable, block: any) => boolean | undefined | void;\r\n /** a callback to validate the property. Returns true if the property is ok, else false. If false, the rebuild/update/callback events won't be called */\r\n onValidation?: (block: any, propertyName: string) => boolean;\r\n };\r\n /** list of the options for a variable of type list */\r\n options?: IEditablePropertyListOption[];\r\n}\r\n\r\n/**\r\n * Interface that describes an editable property\r\n */\r\nexport interface IPropertyDescriptionForEdition {\r\n /** name of the property */\r\n propertyName: string;\r\n /** display name of the property */\r\n displayName: string;\r\n /** type of the property */\r\n type: PropertyTypeForEdition;\r\n /** group of the property - all properties with the same group value will be displayed in a specific section */\r\n groupName: string;\r\n /** options for the property */\r\n options: IEditablePropertyOption;\r\n}\r\n\r\n/**\r\n * Decorator that flags a property in a node block as being editable\r\n * @param displayName the display name of the property\r\n * @param propertyType the type of the property\r\n * @param groupName the group name of the property\r\n * @param options the options of the property\r\n * @returns the decorator\r\n */\r\nexport function editableInPropertyPage(\r\n displayName: string,\r\n propertyType: PropertyTypeForEdition = PropertyTypeForEdition.Boolean,\r\n groupName: string = \"PROPERTIES\",\r\n options?: IEditablePropertyOption\r\n) {\r\n return (target: any, propertyKey: string) => {\r\n let propStore: IPropertyDescriptionForEdition[] = target._propStore;\r\n if (!propStore) {\r\n propStore = [];\r\n target._propStore = propStore;\r\n }\r\n propStore.push({\r\n propertyName: propertyKey,\r\n displayName: displayName,\r\n type: propertyType,\r\n groupName: groupName,\r\n options: options ?? {},\r\n });\r\n };\r\n}\r\n", "import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport type { Scene } from \"../../../../scene\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { NodeMaterialDefines, NodeMaterial } from \"../../nodeMaterial\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../../Decorators/nodeDecorator\";\r\nimport type { Effect } from \"../../../effect\";\r\nimport type { Mesh } from \"../../../../Meshes/mesh\";\r\nimport { BindLogDepth } from \"../../../materialHelper.functions\";\r\n\r\n/**\r\n * Block used to output the final color\r\n */\r\nexport class FragmentOutputBlock extends NodeMaterialBlock {\r\n private _linearDefineName: string;\r\n private _gammaDefineName: string;\r\n\r\n /**\r\n * Create a new FragmentOutputBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment, true);\r\n\r\n this.registerInput(\"rgba\", NodeMaterialBlockConnectionPointTypes.Color4, true);\r\n this.registerInput(\"rgb\", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);\r\n this.registerInput(\"a\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.rgb.addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Color3 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Float\r\n );\r\n }\r\n\r\n /** Gets or sets a boolean indicating if content needs to be converted to gamma space */\r\n @editableInPropertyPage(\"Convert to gamma space\", PropertyTypeForEdition.Boolean, \"PROPERTIES\", { notifiers: { update: true } })\r\n public convertToGammaSpace = false;\r\n\r\n /** Gets or sets a boolean indicating if content needs to be converted to linear space */\r\n @editableInPropertyPage(\"Convert to linear space\", PropertyTypeForEdition.Boolean, \"PROPERTIES\", { notifiers: { update: true } })\r\n public convertToLinearSpace = false;\r\n\r\n /** Gets or sets a boolean indicating if logarithmic depth should be used */\r\n @editableInPropertyPage(\"Use logarithmic depth\", PropertyTypeForEdition.Boolean, \"PROPERTIES\")\r\n public useLogarithmicDepth = false;\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"FragmentOutputBlock\";\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"logarithmicDepthConstant\");\r\n state._excludeVariableName(\"vFragmentDepth\");\r\n }\r\n\r\n /**\r\n * Gets the rgba input component\r\n */\r\n public get rgba(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgb input component\r\n */\r\n public get rgb(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the a input component\r\n */\r\n public get a(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n defines.setValue(this._linearDefineName, this.convertToLinearSpace, true);\r\n defines.setValue(this._gammaDefineName, this.convertToGammaSpace, true);\r\n }\r\n\r\n public bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh) {\r\n if ((this.useLogarithmicDepth || nodeMaterial.useLogarithmicDepth) && mesh) {\r\n BindLogDepth(undefined, effect, mesh.getScene());\r\n }\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const rgba = this.rgba;\r\n const rgb = this.rgb;\r\n const a = this.a;\r\n\r\n state.sharedData.hints.needAlphaBlending = rgba.isConnected || a.isConnected;\r\n state.sharedData.blocksWithDefines.push(this);\r\n if (this.useLogarithmicDepth || state.sharedData.nodeMaterial.useLogarithmicDepth) {\r\n state._emitUniformFromString(\"logarithmicDepthConstant\", \"float\");\r\n state._emitVaryingFromString(\"vFragmentDepth\", \"float\");\r\n state.sharedData.bindableBlocks.push(this);\r\n }\r\n this._linearDefineName = state._getFreeDefineName(\"CONVERTTOLINEAR\");\r\n this._gammaDefineName = state._getFreeDefineName(\"CONVERTTOGAMMA\");\r\n\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n\r\n if (rgba.connectedPoint) {\r\n if (a.isConnected) {\r\n state.compilationString += `gl_FragColor = vec4(${rgba.associatedVariableName}.rgb, ${a.associatedVariableName});\\n`;\r\n } else {\r\n state.compilationString += `gl_FragColor = ${rgba.associatedVariableName};\\n`;\r\n }\r\n } else if (rgb.connectedPoint) {\r\n let aValue = \"1.0\";\r\n\r\n if (a.connectedPoint) {\r\n aValue = a.associatedVariableName;\r\n }\r\n\r\n if (rgb.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Float) {\r\n state.compilationString += `gl_FragColor = vec4(${rgb.associatedVariableName}, ${rgb.associatedVariableName}, ${rgb.associatedVariableName}, ${aValue});\\n`;\r\n } else {\r\n state.compilationString += `gl_FragColor = vec4(${rgb.associatedVariableName}, ${aValue});\\n`;\r\n }\r\n } else {\r\n state.sharedData.checks.notConnectedNonOptionalInputs.push(rgba);\r\n }\r\n\r\n state.compilationString += `#ifdef ${this._linearDefineName}\\n`;\r\n state.compilationString += `gl_FragColor = toLinearSpace(gl_FragColor);\\n`;\r\n state.compilationString += `#endif\\n`;\r\n\r\n state.compilationString += `#ifdef ${this._gammaDefineName}\\n`;\r\n state.compilationString += `gl_FragColor = toGammaSpace(gl_FragColor);\\n`;\r\n state.compilationString += `#endif\\n`;\r\n\r\n if (this.useLogarithmicDepth || state.sharedData.nodeMaterial.useLogarithmicDepth) {\r\n state.compilationString += `gl_FragDepthEXT = log2(vFragmentDepth) * logarithmicDepthConstant * 0.5;\\n`;\r\n }\r\n\r\n state.compilationString += `#if defined(PREPASS)\\r\\n`;\r\n state.compilationString += `gl_FragData[0] = gl_FragColor;\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n\r\n return this;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode();\r\n codeString += `${this._codeVariableName}.convertToGammaSpace = ${this.convertToGammaSpace};\\n`;\r\n codeString += `${this._codeVariableName}.convertToLinearSpace = ${this.convertToLinearSpace};\\n`;\r\n codeString += `${this._codeVariableName}.useLogarithmicDepth = ${this.useLogarithmicDepth};\\n`;\r\n\r\n return codeString;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.convertToGammaSpace = this.convertToGammaSpace;\r\n serializationObject.convertToLinearSpace = this.convertToLinearSpace;\r\n serializationObject.useLogarithmicDepth = this.useLogarithmicDepth;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.convertToGammaSpace = serializationObject.convertToGammaSpace;\r\n this.convertToLinearSpace = serializationObject.convertToLinearSpace;\r\n this.useLogarithmicDepth = serializationObject.useLogarithmicDepth ?? false;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.FragmentOutputBlock\", FragmentOutputBlock);\r\n", "/**\r\n * Enum defining the mode of a NodeMaterialBlockConnectionPoint\r\n */\r\nexport enum NodeMaterialBlockConnectionPointMode {\r\n /** Value is an uniform */\r\n Uniform,\r\n /** Value is a mesh attribute */\r\n Attribute,\r\n /** Value is a varying between vertex and fragment shaders */\r\n Varying,\r\n /** Mode is undefined */\r\n Undefined,\r\n}\r\n", "/**\r\n * Enum used to define system values e.g. values automatically provided by the system\r\n */\r\nexport enum NodeMaterialSystemValues {\r\n /** World */\r\n World = 1,\r\n /** View */\r\n View = 2,\r\n /** Projection */\r\n Projection = 3,\r\n /** ViewProjection */\r\n ViewProjection = 4,\r\n /** WorldView */\r\n WorldView = 5,\r\n /** WorldViewProjection */\r\n WorldViewProjection = 6,\r\n /** CameraPosition */\r\n CameraPosition = 7,\r\n /** Fog Color */\r\n FogColor = 8,\r\n /** Delta time */\r\n DeltaTime = 9,\r\n /** Camera parameters */\r\n CameraParameters = 10,\r\n /** Material alpha */\r\n MaterialAlpha = 11,\r\n}\r\n", "import { Vector3, Vector2 } from \"./math.vector\";\r\n\r\n/**\r\n * Contains position and normal vectors for a vertex\r\n */\r\nexport class PositionNormalVertex {\r\n /**\r\n * Creates a PositionNormalVertex\r\n * @param position the position of the vertex (defaut: 0,0,0)\r\n * @param normal the normal of the vertex (defaut: 0,1,0)\r\n */\r\n constructor(\r\n /** the position of the vertex (defaut: 0,0,0) */\r\n public position: Vector3 = Vector3.Zero(),\r\n /** the normal of the vertex (defaut: 0,1,0) */\r\n public normal: Vector3 = Vector3.Up()\r\n ) {}\r\n\r\n /**\r\n * Clones the PositionNormalVertex\r\n * @returns the cloned PositionNormalVertex\r\n */\r\n public clone(): PositionNormalVertex {\r\n return new PositionNormalVertex(this.position.clone(), this.normal.clone());\r\n }\r\n}\r\n\r\n/**\r\n * Contains position, normal and uv vectors for a vertex\r\n */\r\nexport class PositionNormalTextureVertex {\r\n /**\r\n * Creates a PositionNormalTextureVertex\r\n * @param position the position of the vertex (defaut: 0,0,0)\r\n * @param normal the normal of the vertex (defaut: 0,1,0)\r\n * @param uv the uv of the vertex (default: 0,0)\r\n */\r\n constructor(\r\n /** the position of the vertex (defaut: 0,0,0) */\r\n public position: Vector3 = Vector3.Zero(),\r\n /** the normal of the vertex (defaut: 0,1,0) */\r\n public normal: Vector3 = Vector3.Up(),\r\n /** the uv of the vertex (default: 0,0) */\r\n public uv: Vector2 = Vector2.Zero()\r\n ) {}\r\n /**\r\n * Clones the PositionNormalTextureVertex\r\n * @returns the cloned PositionNormalTextureVertex\r\n */\r\n public clone(): PositionNormalTextureVertex {\r\n return new PositionNormalTextureVertex(this.position.clone(), this.normal.clone(), this.uv.clone());\r\n }\r\n}\r\n", "/**\r\n * Enum defining the type of animations supported by InputBlock\r\n */\r\nexport enum AnimatedInputBlockTypes {\r\n /** No animation */\r\n None,\r\n /** Time based animation (is incremented by 0.6 each second). Will only work for floats */\r\n Time,\r\n /** Time elapsed (in seconds) since the engine was initialized. Will only work for floats */\r\n RealTime,\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport { NodeMaterialBlockConnectionPointMode } from \"../../Enums/nodeMaterialBlockConnectionPointMode\";\r\nimport { NodeMaterialSystemValues } from \"../../Enums/nodeMaterialSystemValues\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport type { Effect } from \"../../../../Materials/effect\";\r\nimport { Matrix, Vector2, Vector3, Vector4 } from \"../../../../Maths/math.vector\";\r\nimport type { Scene } from \"../../../../scene\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport { GetClass, RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { Color3, Color4, TmpColors } from \"../../../../Maths/math\";\r\nimport { AnimatedInputBlockTypes } from \"./animatedInputBlockTypes\";\r\nimport { Observable } from \"../../../../Misc/observable\";\r\nimport type { NodeMaterial } from \"../../nodeMaterial\";\r\nimport { PrecisionDate } from \"core/Misc/precisionDate\";\r\n\r\nconst remapAttributeName: { [name: string]: string } = {\r\n position2d: \"position\",\r\n particle_uv: \"vUV\",\r\n particle_color: \"vColor\",\r\n particle_texturemask: \"textureMask\",\r\n particle_positionw: \"vPositionW\",\r\n};\r\n\r\nconst attributeInFragmentOnly: { [name: string]: boolean } = {\r\n particle_uv: true,\r\n particle_color: true,\r\n particle_texturemask: true,\r\n particle_positionw: true,\r\n};\r\n\r\nconst attributeAsUniform: { [name: string]: boolean } = {\r\n particle_texturemask: true,\r\n};\r\n\r\n/**\r\n * Block used to expose an input value\r\n */\r\nexport class InputBlock extends NodeMaterialBlock {\r\n private _mode = NodeMaterialBlockConnectionPointMode.Undefined;\r\n private _associatedVariableName: string;\r\n private _storedValue: any;\r\n private _valueCallback: () => any;\r\n private _type: NodeMaterialBlockConnectionPointTypes;\r\n private _animationType = AnimatedInputBlockTypes.None;\r\n\r\n /** Gets or set a value used to limit the range of float values */\r\n public min: number = 0;\r\n\r\n /** Gets or set a value used to limit the range of float values */\r\n public max: number = 0;\r\n\r\n /** Gets or set a value indicating that this input can only get 0 and 1 values */\r\n public isBoolean: boolean = false;\r\n\r\n /** Gets or sets a value used by the Node Material editor to determine how to configure the current value if it is a matrix */\r\n public matrixMode: number = 0;\r\n\r\n /** @internal */\r\n public _systemValue: Nullable = null;\r\n\r\n /** Gets or sets a boolean indicating that the value of this input will not change after a build */\r\n public isConstant = false;\r\n\r\n /** Gets or sets the group to use to display this block in the Inspector */\r\n public groupInInspector = \"\";\r\n\r\n /** Gets an observable raised when the value is changed */\r\n public onValueChangedObservable = new Observable();\r\n\r\n /** Gets or sets a boolean indicating if content needs to be converted to gamma space (for color3/4 only) */\r\n public convertToGammaSpace = false;\r\n\r\n /** Gets or sets a boolean indicating if content needs to be converted to linear space (for color3/4 only) */\r\n public convertToLinearSpace = false;\r\n\r\n /**\r\n * Gets or sets the connection point type (default is float)\r\n */\r\n public get type(): NodeMaterialBlockConnectionPointTypes {\r\n if (this._type === NodeMaterialBlockConnectionPointTypes.AutoDetect) {\r\n if (this.isUniform && this.value != null) {\r\n if (!isNaN(this.value)) {\r\n this._type = NodeMaterialBlockConnectionPointTypes.Float;\r\n return this._type;\r\n }\r\n\r\n switch (this.value.getClassName()) {\r\n case \"Vector2\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector2;\r\n return this._type;\r\n case \"Vector3\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector3;\r\n return this._type;\r\n case \"Vector4\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector4;\r\n return this._type;\r\n case \"Color3\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Color3;\r\n return this._type;\r\n case \"Color4\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Color4;\r\n return this._type;\r\n case \"Matrix\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Matrix;\r\n return this._type;\r\n }\r\n }\r\n\r\n if (this.isAttribute) {\r\n switch (this.name) {\r\n case \"position\":\r\n case \"normal\":\r\n case \"particle_positionw\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector3;\r\n return this._type;\r\n case \"uv\":\r\n case \"uv2\":\r\n case \"uv3\":\r\n case \"uv4\":\r\n case \"uv5\":\r\n case \"uv6\":\r\n case \"position2d\":\r\n case \"particle_uv\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector2;\r\n return this._type;\r\n case \"matricesIndices\":\r\n case \"matricesWeights\":\r\n case \"matricesIndicesExtra\":\r\n case \"matricesWeightsExtra\":\r\n case \"world0\":\r\n case \"world1\":\r\n case \"world2\":\r\n case \"world3\":\r\n case \"tangent\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector4;\r\n return this._type;\r\n case \"color\":\r\n case \"instanceColor\":\r\n case \"particle_color\":\r\n case \"particle_texturemask\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Color4;\r\n return this._type;\r\n }\r\n }\r\n\r\n if (this.isSystemValue) {\r\n switch (this._systemValue) {\r\n case NodeMaterialSystemValues.World:\r\n case NodeMaterialSystemValues.WorldView:\r\n case NodeMaterialSystemValues.WorldViewProjection:\r\n case NodeMaterialSystemValues.View:\r\n case NodeMaterialSystemValues.ViewProjection:\r\n case NodeMaterialSystemValues.Projection:\r\n this._type = NodeMaterialBlockConnectionPointTypes.Matrix;\r\n return this._type;\r\n case NodeMaterialSystemValues.CameraPosition:\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector3;\r\n return this._type;\r\n case NodeMaterialSystemValues.FogColor:\r\n this._type = NodeMaterialBlockConnectionPointTypes.Color3;\r\n return this._type;\r\n case NodeMaterialSystemValues.DeltaTime:\r\n case NodeMaterialSystemValues.MaterialAlpha:\r\n this._type = NodeMaterialBlockConnectionPointTypes.Float;\r\n return this._type;\r\n case NodeMaterialSystemValues.CameraParameters:\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector4;\r\n return this._type;\r\n }\r\n }\r\n }\r\n\r\n return this._type;\r\n }\r\n\r\n /**\r\n * Creates a new InputBlock\r\n * @param name defines the block name\r\n * @param target defines the target of that block (Vertex by default)\r\n * @param type defines the type of the input (can be set to NodeMaterialBlockConnectionPointTypes.AutoDetect)\r\n */\r\n public constructor(name: string, target = NodeMaterialBlockTargets.Vertex, type: NodeMaterialBlockConnectionPointTypes = NodeMaterialBlockConnectionPointTypes.AutoDetect) {\r\n super(name, target, false);\r\n\r\n this._type = type;\r\n\r\n this.setDefaultValue();\r\n\r\n this.registerOutput(\"output\", type);\r\n }\r\n\r\n /**\r\n * Validates if a name is a reserve word.\r\n * @param newName the new name to be given to the node.\r\n * @returns false if the name is a reserve word, else true.\r\n */\r\n public validateBlockName(newName: string) {\r\n if (!this.isAttribute) {\r\n return super.validateBlockName(newName);\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Set the source of this connection point to a vertex attribute\r\n * @param attributeName defines the attribute name (position, uv, normal, etc...). If not specified it will take the connection point name\r\n * @returns the current connection point\r\n */\r\n public setAsAttribute(attributeName?: string): InputBlock {\r\n this._mode = NodeMaterialBlockConnectionPointMode.Attribute;\r\n if (attributeName) {\r\n this.name = attributeName;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the source of this connection point to a system value\r\n * @param value define the system value to use (world, view, etc...) or null to switch to manual value\r\n * @returns the current connection point\r\n */\r\n public setAsSystemValue(value: Nullable): InputBlock {\r\n this.systemValue = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets or sets the value of that point.\r\n * Please note that this value will be ignored if valueCallback is defined\r\n */\r\n public get value(): any {\r\n return this._storedValue;\r\n }\r\n\r\n public set value(value: any) {\r\n if (this.type === NodeMaterialBlockConnectionPointTypes.Float) {\r\n if (this.isBoolean) {\r\n value = value ? 1 : 0;\r\n } else if (this.min !== this.max) {\r\n value = Math.max(this.min, value);\r\n value = Math.min(this.max, value);\r\n }\r\n }\r\n\r\n this._storedValue = value;\r\n this._mode = NodeMaterialBlockConnectionPointMode.Uniform;\r\n\r\n this.onValueChangedObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Gets or sets a callback used to get the value of that point.\r\n * Please note that setting this value will force the connection point to ignore the value property\r\n */\r\n public get valueCallback(): () => any {\r\n return this._valueCallback;\r\n }\r\n\r\n public set valueCallback(value: () => any) {\r\n this._valueCallback = value;\r\n this._mode = NodeMaterialBlockConnectionPointMode.Uniform;\r\n }\r\n\r\n /**\r\n * Gets or sets the associated variable name in the shader\r\n */\r\n public get associatedVariableName(): string {\r\n return this._associatedVariableName;\r\n }\r\n\r\n public set associatedVariableName(value: string) {\r\n this._associatedVariableName = value;\r\n }\r\n\r\n /** Gets or sets the type of animation applied to the input */\r\n public get animationType() {\r\n return this._animationType;\r\n }\r\n\r\n public set animationType(value: AnimatedInputBlockTypes) {\r\n this._animationType = value;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this connection point not defined yet\r\n */\r\n public get isUndefined(): boolean {\r\n return this._mode === NodeMaterialBlockConnectionPointMode.Undefined;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this connection point is coming from an uniform.\r\n * In this case the connection point name must be the name of the uniform to use.\r\n * Can only be set on inputs\r\n */\r\n public get isUniform(): boolean {\r\n return this._mode === NodeMaterialBlockConnectionPointMode.Uniform;\r\n }\r\n\r\n public set isUniform(value: boolean) {\r\n this._mode = value ? NodeMaterialBlockConnectionPointMode.Uniform : NodeMaterialBlockConnectionPointMode.Undefined;\r\n this.associatedVariableName = \"\";\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this connection point is coming from an attribute.\r\n * In this case the connection point name must be the name of the attribute to use\r\n * Can only be set on inputs\r\n */\r\n public get isAttribute(): boolean {\r\n return this._mode === NodeMaterialBlockConnectionPointMode.Attribute;\r\n }\r\n\r\n public set isAttribute(value: boolean) {\r\n this._mode = value ? NodeMaterialBlockConnectionPointMode.Attribute : NodeMaterialBlockConnectionPointMode.Undefined;\r\n this.associatedVariableName = \"\";\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this connection point is generating a varying variable.\r\n * Can only be set on exit points\r\n */\r\n public get isVarying(): boolean {\r\n return this._mode === NodeMaterialBlockConnectionPointMode.Varying;\r\n }\r\n\r\n public set isVarying(value: boolean) {\r\n this._mode = value ? NodeMaterialBlockConnectionPointMode.Varying : NodeMaterialBlockConnectionPointMode.Undefined;\r\n this.associatedVariableName = \"\";\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the current connection point is a system value\r\n */\r\n public get isSystemValue(): boolean {\r\n return this._systemValue != null;\r\n }\r\n\r\n /**\r\n * Gets or sets the current well known value or null if not defined as a system value\r\n */\r\n public get systemValue(): Nullable {\r\n return this._systemValue;\r\n }\r\n\r\n public set systemValue(value: Nullable) {\r\n this._mode = NodeMaterialBlockConnectionPointMode.Uniform;\r\n this.associatedVariableName = \"\";\r\n this._systemValue = value;\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"InputBlock\";\r\n }\r\n\r\n /**\r\n * Animate the input if animationType !== None\r\n * @param scene defines the rendering scene\r\n */\r\n public animate(scene: Scene) {\r\n switch (this._animationType) {\r\n case AnimatedInputBlockTypes.Time: {\r\n if (this.type === NodeMaterialBlockConnectionPointTypes.Float) {\r\n this.value += scene.getAnimationRatio() * 0.01;\r\n }\r\n break;\r\n }\r\n case AnimatedInputBlockTypes.RealTime: {\r\n if (this.type === NodeMaterialBlockConnectionPointTypes.Float) {\r\n this.value = (PrecisionDate.Now - scene.getEngine().startTime) / 1000;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private _emitDefine(define: string): string {\r\n if (define[0] === \"!\") {\r\n return `#ifndef ${define.substring(1)}\\n`;\r\n }\r\n\r\n return `#ifdef ${define}\\n`;\r\n }\r\n\r\n public initialize() {\r\n this.associatedVariableName = \"\";\r\n }\r\n\r\n /**\r\n * Set the input block to its default value (based on its type)\r\n */\r\n public setDefaultValue() {\r\n switch (this.type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n this.value = 0;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n this.value = Vector2.Zero();\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n this.value = Vector3.Zero();\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n this.value = Vector4.Zero();\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n this.value = Color3.White();\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n this.value = new Color4(1, 1, 1, 1);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Matrix:\r\n this.value = Matrix.Identity();\r\n break;\r\n }\r\n }\r\n\r\n private _emitConstant(state: NodeMaterialBuildState) {\r\n switch (this.type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n return `${state._emitFloat(this.value)}`;\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n return `vec2(${this.value.x}, ${this.value.y})`;\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n return `vec3(${this.value.x}, ${this.value.y}, ${this.value.z})`;\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n return `vec4(${this.value.x}, ${this.value.y}, ${this.value.z}, ${this.value.w})`;\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n TmpColors.Color3[0].set(this.value.r, this.value.g, this.value.b);\r\n if (this.convertToGammaSpace) {\r\n TmpColors.Color3[0].toGammaSpaceToRef(TmpColors.Color3[0], state.sharedData.scene.getEngine().useExactSrgbConversions);\r\n }\r\n if (this.convertToLinearSpace) {\r\n TmpColors.Color3[0].toLinearSpaceToRef(TmpColors.Color3[0], state.sharedData.scene.getEngine().useExactSrgbConversions);\r\n }\r\n return `vec3(${TmpColors.Color3[0].r}, ${TmpColors.Color3[0].g}, ${TmpColors.Color3[0].b})`;\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n TmpColors.Color4[0].set(this.value.r, this.value.g, this.value.b, this.value.a);\r\n if (this.convertToGammaSpace) {\r\n TmpColors.Color4[0].toGammaSpaceToRef(TmpColors.Color4[0], state.sharedData.scene.getEngine().useExactSrgbConversions);\r\n }\r\n if (this.convertToLinearSpace) {\r\n TmpColors.Color4[0].toLinearSpaceToRef(TmpColors.Color4[0], state.sharedData.scene.getEngine().useExactSrgbConversions);\r\n }\r\n return `vec4(${TmpColors.Color4[0].r}, ${TmpColors.Color4[0].g}, ${TmpColors.Color4[0].b}, ${TmpColors.Color4[0].a})`;\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n /** @internal */\r\n public get _noContextSwitch(): boolean {\r\n return attributeInFragmentOnly[this.name];\r\n }\r\n\r\n private _emit(state: NodeMaterialBuildState, define?: string) {\r\n // Uniforms\r\n if (this.isUniform) {\r\n if (!this.associatedVariableName) {\r\n this.associatedVariableName = state._getFreeVariableName(\"u_\" + this.name);\r\n }\r\n\r\n if (this.isConstant) {\r\n if (state.constants.indexOf(this.associatedVariableName) !== -1) {\r\n return;\r\n }\r\n state.constants.push(this.associatedVariableName);\r\n state._constantDeclaration += this._declareOutput(this.output, state) + ` = ${this._emitConstant(state)};\\n`;\r\n return;\r\n }\r\n\r\n if (state.uniforms.indexOf(this.associatedVariableName) !== -1) {\r\n return;\r\n }\r\n\r\n state.uniforms.push(this.associatedVariableName);\r\n if (define) {\r\n state._uniformDeclaration += this._emitDefine(define);\r\n }\r\n state._uniformDeclaration += `uniform ${state._getGLType(this.type)} ${this.associatedVariableName};\\n`;\r\n if (define) {\r\n state._uniformDeclaration += `#endif\\n`;\r\n }\r\n\r\n // well known\r\n const hints = state.sharedData.hints;\r\n if (this._systemValue !== null && this._systemValue !== undefined) {\r\n switch (this._systemValue) {\r\n case NodeMaterialSystemValues.WorldView:\r\n hints.needWorldViewMatrix = true;\r\n break;\r\n case NodeMaterialSystemValues.WorldViewProjection:\r\n hints.needWorldViewProjectionMatrix = true;\r\n break;\r\n }\r\n } else {\r\n if (this._animationType !== AnimatedInputBlockTypes.None) {\r\n state.sharedData.animatedInputs.push(this);\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Attribute\r\n if (this.isAttribute) {\r\n this.associatedVariableName = remapAttributeName[this.name] ?? this.name;\r\n\r\n if (this.target === NodeMaterialBlockTargets.Vertex && state._vertexState) {\r\n // Attribute for fragment need to be carried over by varyings\r\n if (attributeInFragmentOnly[this.name]) {\r\n if (attributeAsUniform[this.name]) {\r\n state._emitUniformFromString(this.associatedVariableName, state._getGLType(this.type), define);\r\n } else {\r\n state._emitVaryingFromString(this.associatedVariableName, state._getGLType(this.type), define);\r\n }\r\n } else {\r\n this._emit(state._vertexState, define);\r\n }\r\n return;\r\n }\r\n\r\n if (state.attributes.indexOf(this.associatedVariableName) !== -1) {\r\n return;\r\n }\r\n\r\n state.attributes.push(this.associatedVariableName);\r\n\r\n if (attributeInFragmentOnly[this.name]) {\r\n if (attributeAsUniform[this.name]) {\r\n state._emitUniformFromString(this.associatedVariableName, state._getGLType(this.type), define);\r\n } else {\r\n state._emitVaryingFromString(this.associatedVariableName, state._getGLType(this.type), define);\r\n }\r\n } else {\r\n if (define) {\r\n state._attributeDeclaration += this._emitDefine(define);\r\n }\r\n state._attributeDeclaration += `attribute ${state._getGLType(this.type)} ${this.associatedVariableName};\\n`;\r\n if (define) {\r\n state._attributeDeclaration += `#endif\\n`;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _transmitWorld(effect: Effect, world: Matrix, worldView: Matrix, worldViewProjection: Matrix) {\r\n if (!this._systemValue) {\r\n return;\r\n }\r\n\r\n const variableName = this.associatedVariableName;\r\n switch (this._systemValue) {\r\n case NodeMaterialSystemValues.World:\r\n effect.setMatrix(variableName, world);\r\n break;\r\n case NodeMaterialSystemValues.WorldView:\r\n effect.setMatrix(variableName, worldView);\r\n break;\r\n case NodeMaterialSystemValues.WorldViewProjection:\r\n effect.setMatrix(variableName, worldViewProjection);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _transmit(effect: Effect, scene: Scene, material: NodeMaterial) {\r\n if (this.isAttribute) {\r\n return;\r\n }\r\n\r\n const variableName = this.associatedVariableName;\r\n if (this._systemValue) {\r\n switch (this._systemValue) {\r\n case NodeMaterialSystemValues.World:\r\n case NodeMaterialSystemValues.WorldView:\r\n case NodeMaterialSystemValues.WorldViewProjection:\r\n return;\r\n case NodeMaterialSystemValues.View:\r\n effect.setMatrix(variableName, scene.getViewMatrix());\r\n break;\r\n case NodeMaterialSystemValues.Projection:\r\n effect.setMatrix(variableName, scene.getProjectionMatrix());\r\n break;\r\n case NodeMaterialSystemValues.ViewProjection:\r\n effect.setMatrix(variableName, scene.getTransformMatrix());\r\n break;\r\n case NodeMaterialSystemValues.CameraPosition:\r\n scene.bindEyePosition(effect, variableName, true);\r\n break;\r\n case NodeMaterialSystemValues.FogColor:\r\n effect.setColor3(variableName, scene.fogColor);\r\n break;\r\n case NodeMaterialSystemValues.DeltaTime:\r\n effect.setFloat(variableName, scene.deltaTime / 1000.0);\r\n break;\r\n case NodeMaterialSystemValues.CameraParameters:\r\n if (scene.activeCamera) {\r\n effect.setFloat4(\r\n variableName,\r\n scene.getEngine().hasOriginBottomLeft ? -1 : 1,\r\n scene.activeCamera.minZ,\r\n scene.activeCamera.maxZ,\r\n 1 / scene.activeCamera.maxZ\r\n );\r\n }\r\n break;\r\n case NodeMaterialSystemValues.MaterialAlpha:\r\n effect.setFloat(variableName, material.alpha);\r\n break;\r\n }\r\n return;\r\n }\r\n\r\n const value = this._valueCallback ? this._valueCallback() : this._storedValue;\r\n\r\n if (value === null) {\r\n return;\r\n }\r\n\r\n switch (this.type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n effect.setFloat(variableName, value);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Int:\r\n effect.setInt(variableName, value);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n TmpColors.Color3[0].set(this.value.r, this.value.g, this.value.b);\r\n if (this.convertToGammaSpace) {\r\n TmpColors.Color3[0].toGammaSpaceToRef(TmpColors.Color3[0], scene.getEngine().useExactSrgbConversions);\r\n }\r\n if (this.convertToLinearSpace) {\r\n TmpColors.Color3[0].toLinearSpaceToRef(TmpColors.Color3[0], scene.getEngine().useExactSrgbConversions);\r\n }\r\n effect.setColor3(variableName, TmpColors.Color3[0]);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n TmpColors.Color4[0].set(this.value.r, this.value.g, this.value.b, this.value.a);\r\n if (this.convertToGammaSpace) {\r\n TmpColors.Color4[0].toGammaSpaceToRef(TmpColors.Color4[0], scene.getEngine().useExactSrgbConversions);\r\n }\r\n if (this.convertToLinearSpace) {\r\n TmpColors.Color4[0].toLinearSpaceToRef(TmpColors.Color4[0], scene.getEngine().useExactSrgbConversions);\r\n }\r\n effect.setDirectColor4(variableName, TmpColors.Color4[0]);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n effect.setVector2(variableName, value);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n effect.setVector3(variableName, value);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n effect.setVector4(variableName, value);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Matrix:\r\n effect.setMatrix(variableName, value);\r\n break;\r\n }\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (this.isUniform || this.isSystemValue) {\r\n state.sharedData.inputBlocks.push(this);\r\n }\r\n\r\n this._emit(state);\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n const variableName = this._codeVariableName;\r\n\r\n if (this.isAttribute) {\r\n return super._dumpPropertiesCode() + `${variableName}.setAsAttribute(\"${this.name}\");\\n`;\r\n }\r\n if (this.isSystemValue) {\r\n return super._dumpPropertiesCode() + `${variableName}.setAsSystemValue(BABYLON.NodeMaterialSystemValues.${NodeMaterialSystemValues[this._systemValue!]});\\n`;\r\n }\r\n if (this.isUniform) {\r\n const codes: string[] = [];\r\n\r\n let valueString = \"\";\r\n\r\n switch (this.type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n valueString = `${this.value}`;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n valueString = `new BABYLON.Vector2(${this.value.x}, ${this.value.y})`;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n valueString = `new BABYLON.Vector3(${this.value.x}, ${this.value.y}, ${this.value.z})`;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n valueString = `new BABYLON.Vector4(${this.value.x}, ${this.value.y}, ${this.value.z}, ${this.value.w})`;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n valueString = `new BABYLON.Color3(${this.value.r}, ${this.value.g}, ${this.value.b})`;\r\n if (this.convertToGammaSpace) {\r\n valueString += \".toGammaSpace()\";\r\n }\r\n if (this.convertToLinearSpace) {\r\n valueString += \".toLinearSpace()\";\r\n }\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n valueString = `new BABYLON.Color4(${this.value.r}, ${this.value.g}, ${this.value.b}, ${this.value.a})`;\r\n if (this.convertToGammaSpace) {\r\n valueString += \".toGammaSpace()\";\r\n }\r\n if (this.convertToLinearSpace) {\r\n valueString += \".toLinearSpace()\";\r\n }\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Matrix:\r\n valueString = `BABYLON.Matrix.FromArray([${(this.value as Matrix).m}])`;\r\n break;\r\n }\r\n\r\n // Common Property \"Value\"\r\n codes.push(`${variableName}.value = ${valueString}`);\r\n\r\n // Float-Value-Specific Properties\r\n if (this.type === NodeMaterialBlockConnectionPointTypes.Float) {\r\n codes.push(\r\n `${variableName}.min = ${this.min}`,\r\n `${variableName}.max = ${this.max}`,\r\n `${variableName}.isBoolean = ${this.isBoolean}`,\r\n `${variableName}.matrixMode = ${this.matrixMode}`,\r\n `${variableName}.animationType = BABYLON.AnimatedInputBlockTypes.${AnimatedInputBlockTypes[this.animationType]}`\r\n );\r\n }\r\n\r\n // Common Property \"Type\"\r\n codes.push(`${variableName}.isConstant = ${this.isConstant}`);\r\n\r\n codes.push(\"\");\r\n\r\n return super._dumpPropertiesCode() + codes.join(\";\\n\");\r\n }\r\n return super._dumpPropertiesCode();\r\n }\r\n\r\n public dispose() {\r\n this.onValueChangedObservable.clear();\r\n\r\n super.dispose();\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.type = this.type;\r\n serializationObject.mode = this._mode;\r\n serializationObject.systemValue = this._systemValue;\r\n serializationObject.animationType = this._animationType;\r\n serializationObject.min = this.min;\r\n serializationObject.max = this.max;\r\n serializationObject.isBoolean = this.isBoolean;\r\n serializationObject.matrixMode = this.matrixMode;\r\n serializationObject.isConstant = this.isConstant;\r\n serializationObject.groupInInspector = this.groupInInspector;\r\n serializationObject.convertToGammaSpace = this.convertToGammaSpace;\r\n serializationObject.convertToLinearSpace = this.convertToLinearSpace;\r\n\r\n if (this._storedValue != null && this._mode === NodeMaterialBlockConnectionPointMode.Uniform) {\r\n if (this._storedValue.asArray) {\r\n serializationObject.valueType = \"BABYLON.\" + this._storedValue.getClassName();\r\n serializationObject.value = this._storedValue.asArray();\r\n } else {\r\n serializationObject.valueType = \"number\";\r\n serializationObject.value = this._storedValue;\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n this._mode = serializationObject.mode;\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this._type = serializationObject.type;\r\n\r\n this._systemValue = serializationObject.systemValue || serializationObject.wellKnownValue;\r\n this._animationType = serializationObject.animationType;\r\n this.min = serializationObject.min || 0;\r\n this.max = serializationObject.max || 0;\r\n this.isBoolean = !!serializationObject.isBoolean;\r\n this.matrixMode = serializationObject.matrixMode || 0;\r\n this.isConstant = !!serializationObject.isConstant;\r\n this.groupInInspector = serializationObject.groupInInspector || \"\";\r\n this.convertToGammaSpace = !!serializationObject.convertToGammaSpace;\r\n this.convertToLinearSpace = !!serializationObject.convertToLinearSpace;\r\n\r\n // Tangents back compat\r\n if (\r\n serializationObject.name === \"tangent\" &&\r\n serializationObject.mode === NodeMaterialBlockConnectionPointMode.Attribute &&\r\n serializationObject.type === NodeMaterialBlockConnectionPointTypes.Vector3\r\n ) {\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector4;\r\n }\r\n\r\n if (!serializationObject.valueType) {\r\n return;\r\n }\r\n\r\n if (serializationObject.valueType === \"number\") {\r\n this._storedValue = serializationObject.value;\r\n } else {\r\n const valueType = GetClass(serializationObject.valueType);\r\n\r\n if (valueType) {\r\n this._storedValue = valueType.FromArray(serializationObject.value);\r\n }\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.InputBlock\", InputBlock);\r\n", "import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport type { BaseTexture } from \"../../../Textures/baseTexture\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { Texture } from \"../../../Textures/texture\";\r\nimport type { Scene } from \"../../../../scene\";\r\nimport type { InputBlock } from \"../Input/inputBlock\";\r\n\r\nimport type { NodeMaterial } from \"../../nodeMaterial\";\r\n\r\n/**\r\n * Base block used as input for post process\r\n */\r\nexport class CurrentScreenBlock extends NodeMaterialBlock {\r\n private _samplerName = \"textureSampler\";\r\n private _linearDefineName: string;\r\n private _gammaDefineName: string;\r\n private _mainUVName: string;\r\n private _tempTextureRead: string;\r\n\r\n /**\r\n * Gets or sets the texture associated with the node\r\n */\r\n public texture: Nullable;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if content needs to be converted to gamma space\r\n */\r\n public convertToGammaSpace = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if content needs to be converted to linear space\r\n */\r\n public convertToLinearSpace = false;\r\n\r\n /**\r\n * Create a new CurrentScreenBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.VertexAndFragment);\r\n\r\n this._isUnique = false;\r\n\r\n this.registerInput(\"uv\", NodeMaterialBlockConnectionPointTypes.AutoDetect, false, NodeMaterialBlockTargets.VertexAndFragment);\r\n\r\n this.registerOutput(\"rgba\", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"rgb\", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"r\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"g\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"b\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"a\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n\r\n this._inputs[0].addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Vector2 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4\r\n );\r\n\r\n this._inputs[0]._prioritizeVertex = false;\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"CurrentScreenBlock\";\r\n }\r\n\r\n /**\r\n * Gets the uv input component\r\n */\r\n public get uv(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgba output component\r\n */\r\n public get rgba(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgb output component\r\n */\r\n public get rgb(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the r output component\r\n */\r\n public get r(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the g output component\r\n */\r\n public get g(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n\r\n /**\r\n * Gets the b output component\r\n */\r\n public get b(): NodeMaterialConnectionPoint {\r\n return this._outputs[4];\r\n }\r\n\r\n /**\r\n * Gets the a output component\r\n */\r\n public get a(): NodeMaterialConnectionPoint {\r\n return this._outputs[5];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"textureSampler\");\r\n }\r\n\r\n public get target() {\r\n if (!this.uv.isConnected) {\r\n return NodeMaterialBlockTargets.VertexAndFragment;\r\n }\r\n\r\n if (this.uv.sourceBlock!.isInput) {\r\n return NodeMaterialBlockTargets.VertexAndFragment;\r\n }\r\n\r\n return NodeMaterialBlockTargets.Fragment;\r\n }\r\n\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n defines.setValue(this._linearDefineName, this.convertToGammaSpace, true);\r\n defines.setValue(this._gammaDefineName, this.convertToLinearSpace, true);\r\n }\r\n\r\n public isReady() {\r\n if (this.texture && !this.texture.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _injectVertexCode(state: NodeMaterialBuildState) {\r\n const uvInput = this.uv;\r\n\r\n if (uvInput.connectedPoint!.ownerBlock.isInput) {\r\n const uvInputOwnerBlock = uvInput.connectedPoint!.ownerBlock as InputBlock;\r\n\r\n if (!uvInputOwnerBlock.isAttribute) {\r\n state._emitUniformFromString(uvInput.associatedVariableName, \"vec2\");\r\n }\r\n }\r\n\r\n this._mainUVName = \"vMain\" + uvInput.associatedVariableName;\r\n\r\n state._emitVaryingFromString(this._mainUVName, \"vec2\");\r\n\r\n state.compilationString += `${this._mainUVName} = ${uvInput.associatedVariableName}.xy;\\n`;\r\n\r\n if (!this._outputs.some((o) => o.isConnectedInVertexShader)) {\r\n return;\r\n }\r\n\r\n this._writeTextureRead(state, true);\r\n\r\n for (const output of this._outputs) {\r\n if (output.hasEndpoints) {\r\n this._writeOutput(state, output, output.name, true);\r\n }\r\n }\r\n }\r\n\r\n private _writeTextureRead(state: NodeMaterialBuildState, vertexMode = false) {\r\n const uvInput = this.uv;\r\n\r\n if (vertexMode) {\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n return;\r\n }\r\n\r\n state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${uvInput.associatedVariableName});\\n`;\r\n return;\r\n }\r\n\r\n if (this.uv.ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${uvInput.associatedVariableName});\\n`;\r\n return;\r\n }\r\n\r\n state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${this._mainUVName});\\n`;\r\n }\r\n\r\n private _writeOutput(state: NodeMaterialBuildState, output: NodeMaterialConnectionPoint, swizzle: string, vertexMode = false) {\r\n if (vertexMode) {\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n return;\r\n }\r\n\r\n state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle};\\n`;\r\n\r\n return;\r\n }\r\n\r\n if (this.uv.ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle};\\n`;\r\n return;\r\n }\r\n\r\n state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle};\\n`;\r\n\r\n state.compilationString += `#ifdef ${this._linearDefineName}\\n`;\r\n state.compilationString += `${output.associatedVariableName} = toGammaSpace(${output.associatedVariableName});\\n`;\r\n state.compilationString += `#endif\\n`;\r\n\r\n state.compilationString += `#ifdef ${this._gammaDefineName}\\n`;\r\n state.compilationString += `${output.associatedVariableName} = toLinearSpace(${output.associatedVariableName});\\n`;\r\n state.compilationString += `#endif\\n`;\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n this._tempTextureRead = state._getFreeVariableName(\"tempTextureRead\");\r\n\r\n if (state.sharedData.blockingBlocks.indexOf(this) < 0) {\r\n state.sharedData.blockingBlocks.push(this);\r\n }\r\n if (state.sharedData.textureBlocks.indexOf(this) < 0) {\r\n state.sharedData.textureBlocks.push(this);\r\n }\r\n if (state.sharedData.blocksWithDefines.indexOf(this) < 0) {\r\n state.sharedData.blocksWithDefines.push(this);\r\n }\r\n\r\n if (state.target !== NodeMaterialBlockTargets.Fragment) {\r\n // Vertex\r\n state._emit2DSampler(this._samplerName);\r\n this._injectVertexCode(state);\r\n return;\r\n }\r\n\r\n // Fragment\r\n if (!this._outputs.some((o) => o.isConnectedInFragmentShader)) {\r\n return;\r\n }\r\n\r\n state._emit2DSampler(this._samplerName);\r\n\r\n this._linearDefineName = state._getFreeDefineName(\"ISLINEAR\");\r\n this._gammaDefineName = state._getFreeDefineName(\"ISGAMMA\");\r\n\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n\r\n this._writeTextureRead(state);\r\n\r\n for (const output of this._outputs) {\r\n if (output.hasEndpoints) {\r\n this._writeOutput(state, output, output.name);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.convertToGammaSpace = this.convertToGammaSpace;\r\n serializationObject.convertToLinearSpace = this.convertToLinearSpace;\r\n if (this.texture && !this.texture.isRenderTarget) {\r\n serializationObject.texture = this.texture.serialize();\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.convertToGammaSpace = serializationObject.convertToGammaSpace;\r\n this.convertToLinearSpace = !!serializationObject.convertToLinearSpace;\r\n\r\n if (serializationObject.texture) {\r\n rootUrl = serializationObject.texture.url.indexOf(\"data:\") === 0 ? \"\" : rootUrl;\r\n this.texture = Texture.Parse(serializationObject.texture, scene, rootUrl) as Texture;\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.CurrentScreenBlock\", CurrentScreenBlock);\r\n", "import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport { InputBlock } from \"../Input/inputBlock\";\r\nimport type { BaseTexture } from \"../../../Textures/baseTexture\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { Texture } from \"../../../Textures/texture\";\r\nimport type { Scene } from \"../../../../scene\";\r\n\r\nimport type { NodeMaterial } from \"../../nodeMaterial\";\r\n\r\n/**\r\n * Base block used for the particle texture\r\n */\r\nexport class ParticleTextureBlock extends NodeMaterialBlock {\r\n private _samplerName = \"diffuseSampler\";\r\n private _linearDefineName: string;\r\n private _gammaDefineName: string;\r\n private _tempTextureRead: string;\r\n\r\n /**\r\n * Gets or sets the texture associated with the node\r\n */\r\n public texture: Nullable;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if content needs to be converted to gamma space\r\n */\r\n public convertToGammaSpace = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if content needs to be converted to linear space\r\n */\r\n public convertToLinearSpace = false;\r\n\r\n /**\r\n * Create a new ParticleTextureBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this._isUnique = false;\r\n\r\n this.registerInput(\"uv\", NodeMaterialBlockConnectionPointTypes.AutoDetect, false, NodeMaterialBlockTargets.VertexAndFragment);\r\n\r\n this.registerOutput(\"rgba\", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"rgb\", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"r\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"g\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"b\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"a\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n\r\n this._inputs[0].addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Vector2 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4\r\n );\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"ParticleTextureBlock\";\r\n }\r\n\r\n /**\r\n * Gets the uv input component\r\n */\r\n public get uv(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgba output component\r\n */\r\n public get rgba(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgb output component\r\n */\r\n public get rgb(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the r output component\r\n */\r\n public get r(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the g output component\r\n */\r\n public get g(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n\r\n /**\r\n * Gets the b output component\r\n */\r\n public get b(): NodeMaterialConnectionPoint {\r\n return this._outputs[4];\r\n }\r\n\r\n /**\r\n * Gets the a output component\r\n */\r\n public get a(): NodeMaterialConnectionPoint {\r\n return this._outputs[5];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"diffuseSampler\");\r\n }\r\n\r\n public autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\r\n if (!this.uv.isConnected) {\r\n let uvInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"particle_uv\" && additionalFilteringInfo(b));\r\n\r\n if (!uvInput) {\r\n uvInput = new InputBlock(\"uv\");\r\n uvInput.setAsAttribute(\"particle_uv\");\r\n }\r\n uvInput.output.connectTo(this.uv);\r\n }\r\n }\r\n\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n defines.setValue(this._linearDefineName, this.convertToGammaSpace, true);\r\n defines.setValue(this._gammaDefineName, this.convertToLinearSpace, true);\r\n }\r\n\r\n public isReady() {\r\n if (this.texture && !this.texture.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _writeOutput(state: NodeMaterialBuildState, output: NodeMaterialConnectionPoint, swizzle: string) {\r\n state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle};\\n`;\r\n\r\n state.compilationString += `#ifdef ${this._linearDefineName}\\n`;\r\n state.compilationString += `${output.associatedVariableName} = toGammaSpace(${output.associatedVariableName});\\n`;\r\n state.compilationString += `#endif\\n`;\r\n\r\n state.compilationString += `#ifdef ${this._gammaDefineName}\\n`;\r\n state.compilationString += `${output.associatedVariableName} = toLinearSpace(${output.associatedVariableName});\\n`;\r\n state.compilationString += `#endif\\n`;\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Vertex) {\r\n return;\r\n }\r\n\r\n this._tempTextureRead = state._getFreeVariableName(\"tempTextureRead\");\r\n\r\n state._emit2DSampler(this._samplerName);\r\n\r\n state.sharedData.blockingBlocks.push(this);\r\n state.sharedData.textureBlocks.push(this);\r\n state.sharedData.blocksWithDefines.push(this);\r\n\r\n this._linearDefineName = state._getFreeDefineName(\"ISLINEAR\");\r\n this._gammaDefineName = state._getFreeDefineName(\"ISGAMMA\");\r\n\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n\r\n state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${this.uv.associatedVariableName});\\n`;\r\n\r\n for (const output of this._outputs) {\r\n if (output.hasEndpoints) {\r\n this._writeOutput(state, output, output.name);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.convertToGammaSpace = this.convertToGammaSpace;\r\n serializationObject.convertToLinearSpace = this.convertToLinearSpace;\r\n if (this.texture && !this.texture.isRenderTarget) {\r\n serializationObject.texture = this.texture.serialize();\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.convertToGammaSpace = serializationObject.convertToGammaSpace;\r\n this.convertToLinearSpace = !!serializationObject.convertToLinearSpace;\r\n\r\n if (serializationObject.texture) {\r\n rootUrl = serializationObject.texture.url.indexOf(\"data:\") === 0 ? \"\" : rootUrl;\r\n this.texture = Texture.Parse(serializationObject.texture, scene, rootUrl) as Texture;\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ParticleTextureBlock\", ParticleTextureBlock);\r\n", "import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n\r\n/**\r\n * Block used for the particle ramp gradient section\r\n */\r\nexport class ParticleRampGradientBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new ParticleRampGradientBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"color\", NodeMaterialBlockConnectionPointTypes.Color4, false, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerOutput(\"rampColor\", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Fragment);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"ParticleRampGradientBlock\";\r\n }\r\n\r\n /**\r\n * Gets the color input component\r\n */\r\n public get color(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rampColor output component\r\n */\r\n public get rampColor(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"remapRanges\");\r\n state._excludeVariableName(\"rampSampler\");\r\n state._excludeVariableName(\"baseColor\");\r\n state._excludeVariableName(\"alpha\");\r\n state._excludeVariableName(\"remappedColorIndex\");\r\n state._excludeVariableName(\"rampColor\");\r\n state._excludeVariableName(\"finalAlpha\");\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Vertex) {\r\n return;\r\n }\r\n\r\n state._emit2DSampler(\"rampSampler\");\r\n state._emitVaryingFromString(\"remapRanges\", \"vec4\", \"RAMPGRADIENT\");\r\n\r\n state.compilationString += `\r\n #ifdef RAMPGRADIENT\r\n vec4 baseColor = ${this.color.associatedVariableName};\r\n float alpha = ${this.color.associatedVariableName}.a;\r\n\r\n float remappedColorIndex = clamp((alpha - remapRanges.x) / remapRanges.y, 0.0, 1.0);\r\n\r\n vec4 rampColor = texture2D(rampSampler, vec2(1.0 - remappedColorIndex, 0.));\r\n baseColor.rgb *= rampColor.rgb;\r\n\r\n // Remapped alpha\r\n float finalAlpha = baseColor.a;\r\n baseColor.a = clamp((alpha * rampColor.a - remapRanges.z) / remapRanges.w, 0.0, 1.0);\r\n\r\n ${this._declareOutput(this.rampColor, state)} = baseColor;\r\n #else\r\n ${this._declareOutput(this.rampColor, state)} = ${this.color.associatedVariableName};\r\n #endif\r\n `;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ParticleRampGradientBlock\", ParticleRampGradientBlock);\r\n", "import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n\r\n/**\r\n * Block used for the particle blend multiply section\r\n */\r\nexport class ParticleBlendMultiplyBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new ParticleBlendMultiplyBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"color\", NodeMaterialBlockConnectionPointTypes.Color4, false, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"alphaTexture\", NodeMaterialBlockConnectionPointTypes.Float, false, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"alphaColor\", NodeMaterialBlockConnectionPointTypes.Float, false, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerOutput(\"blendColor\", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Fragment);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"ParticleBlendMultiplyBlock\";\r\n }\r\n\r\n /**\r\n * Gets the color input component\r\n */\r\n public get color(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the alphaTexture input component\r\n */\r\n public get alphaTexture(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the alphaColor input component\r\n */\r\n public get alphaColor(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the blendColor output component\r\n */\r\n public get blendColor(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"sourceAlpha\");\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Vertex) {\r\n return;\r\n }\r\n\r\n state.compilationString += `\r\n #ifdef BLENDMULTIPLYMODE\r\n ${this._declareOutput(this.blendColor, state)};\r\n float sourceAlpha = ${this.alphaColor.associatedVariableName} * ${this.alphaTexture.associatedVariableName};\r\n ${this.blendColor.associatedVariableName}.rgb = ${this.color.associatedVariableName}.rgb * sourceAlpha + vec3(1.0) * (1.0 - sourceAlpha);\r\n ${this.blendColor.associatedVariableName}.a = ${this.color.associatedVariableName}.a;\r\n #else\r\n ${this._declareOutput(this.blendColor, state)} = ${this.color.associatedVariableName};\r\n #endif\r\n `;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ParticleBlendMultiplyBlock\", ParticleBlendMultiplyBlock);\r\n", "import type { Nullable } from \"../types\";\r\nimport type { IEffectFallbacks } from \"./iEffectFallbacks\";\r\n\r\nimport type { Effect } from \"./effect\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\n\r\n/**\r\n * EffectFallbacks can be used to add fallbacks (properties to disable) to certain properties when desired to improve performance.\r\n * (Eg. Start at high quality with reflection and fog, if fps is low, remove reflection, if still low remove fog)\r\n */\r\nexport class EffectFallbacks implements IEffectFallbacks {\r\n private _defines: { [key: string]: Array } = {};\r\n\r\n private _currentRank = 32;\r\n private _maxRank = -1;\r\n\r\n private _mesh: Nullable = null;\r\n\r\n /**\r\n * Removes the fallback from the bound mesh.\r\n */\r\n public unBindMesh() {\r\n this._mesh = null;\r\n }\r\n\r\n /**\r\n * Adds a fallback on the specified property.\r\n * @param rank The rank of the fallback (Lower ranks will be fallbacked to first)\r\n * @param define The name of the define in the shader\r\n */\r\n public addFallback(rank: number, define: string): void {\r\n if (!this._defines[rank]) {\r\n if (rank < this._currentRank) {\r\n this._currentRank = rank;\r\n }\r\n\r\n if (rank > this._maxRank) {\r\n this._maxRank = rank;\r\n }\r\n\r\n this._defines[rank] = new Array();\r\n }\r\n\r\n this._defines[rank].push(define);\r\n }\r\n\r\n /**\r\n * Sets the mesh to use CPU skinning when needing to fallback.\r\n * @param rank The rank of the fallback (Lower ranks will be fallbacked to first)\r\n * @param mesh The mesh to use the fallbacks.\r\n */\r\n public addCPUSkinningFallback(rank: number, mesh: AbstractMesh) {\r\n this._mesh = mesh;\r\n\r\n if (rank < this._currentRank) {\r\n this._currentRank = rank;\r\n }\r\n if (rank > this._maxRank) {\r\n this._maxRank = rank;\r\n }\r\n }\r\n\r\n /**\r\n * Checks to see if more fallbacks are still available.\r\n */\r\n public get hasMoreFallbacks(): boolean {\r\n return this._currentRank <= this._maxRank;\r\n }\r\n\r\n /**\r\n * Removes the defines that should be removed when falling back.\r\n * @param currentDefines defines the current define statements for the shader.\r\n * @param effect defines the current effect we try to compile\r\n * @returns The resulting defines with defines of the current rank removed.\r\n */\r\n public reduce(currentDefines: string, effect: Effect): string {\r\n // First we try to switch to CPU skinning\r\n if (this._mesh && this._mesh.computeBonesUsingShaders && this._mesh.numBoneInfluencers > 0) {\r\n this._mesh.computeBonesUsingShaders = false;\r\n currentDefines = currentDefines.replace(\"#define NUM_BONE_INFLUENCERS \" + this._mesh.numBoneInfluencers, \"#define NUM_BONE_INFLUENCERS 0\");\r\n effect._bonesComputationForcedToCPU = true;\r\n\r\n const scene = this._mesh.getScene();\r\n for (let index = 0; index < scene.meshes.length; index++) {\r\n const otherMesh = scene.meshes[index];\r\n\r\n if (!otherMesh.material) {\r\n if (!this._mesh.material && otherMesh.computeBonesUsingShaders && otherMesh.numBoneInfluencers > 0) {\r\n otherMesh.computeBonesUsingShaders = false;\r\n }\r\n continue;\r\n }\r\n\r\n if (!otherMesh.computeBonesUsingShaders || otherMesh.numBoneInfluencers === 0) {\r\n continue;\r\n }\r\n\r\n if (otherMesh.material.getEffect() === effect) {\r\n otherMesh.computeBonesUsingShaders = false;\r\n } else if (otherMesh.subMeshes) {\r\n for (const subMesh of otherMesh.subMeshes) {\r\n const subMeshEffect = subMesh.effect;\r\n\r\n if (subMeshEffect === effect) {\r\n otherMesh.computeBonesUsingShaders = false;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n const currentFallbacks = this._defines[this._currentRank];\r\n if (currentFallbacks) {\r\n for (let index = 0; index < currentFallbacks.length; index++) {\r\n currentDefines = currentDefines.replace(\"#define \" + currentFallbacks[index], \"\");\r\n }\r\n }\r\n\r\n this._currentRank++;\r\n }\r\n\r\n return currentDefines;\r\n }\r\n}\r\n", "import type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport { InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport type { RenderTargetCreationOptions, TextureSize } from \"../Materials/Textures/textureCreationOptions\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Constants } from \"./constants\";\r\nimport type { ThinEngine } from \"./thinEngine\";\r\nimport type { IMultiRenderTargetOptions } from \"../Materials/Textures/multiRenderTarget\";\r\n\r\n/**\r\n * An interface enforcing the renderTarget accessor to used by render target textures.\r\n */\r\nexport interface IRenderTargetTexture {\r\n /**\r\n * Entry point to access the wrapper on a texture.\r\n */\r\n renderTarget: Nullable;\r\n}\r\n\r\n/**\r\n * Wrapper around a render target (either single or multi textures)\r\n */\r\nexport class RenderTargetWrapper {\r\n protected _engine: ThinEngine;\r\n private _size: TextureSize;\r\n private _isCube: boolean;\r\n private _isMulti: boolean;\r\n private _textures: Nullable = null;\r\n private _faceIndices: Nullable = null;\r\n private _layerIndices: Nullable = null;\r\n private _depthStencilTextureLabel?: string;\r\n /** @internal */\r\n public _samples = 1;\r\n\r\n /** @internal */\r\n public _attachments: Nullable = null;\r\n /** @internal */\r\n public _generateStencilBuffer: boolean = false;\r\n /** @internal */\r\n public _generateDepthBuffer: boolean = false;\r\n\r\n /** @internal */\r\n public _depthStencilTexture: Nullable;\r\n /** @internal */\r\n public _depthStencilTextureWithStencil: boolean = false;\r\n\r\n /**\r\n * Gets or sets the label of the render target wrapper (optional, for debugging purpose)\r\n */\r\n public label?: string;\r\n\r\n /**\r\n * Gets the depth/stencil texture (if created by a createDepthStencilTexture() call)\r\n */\r\n public get depthStencilTexture() {\r\n return this._depthStencilTexture;\r\n }\r\n\r\n /**\r\n * Indicates if the depth/stencil texture has a stencil aspect\r\n */\r\n public get depthStencilTextureWithStencil() {\r\n return this._depthStencilTextureWithStencil;\r\n }\r\n\r\n /**\r\n * Defines if the render target wrapper is for a cube texture or if false a 2d texture\r\n */\r\n public get isCube(): boolean {\r\n return this._isCube;\r\n }\r\n\r\n /**\r\n * Defines if the render target wrapper is for a single or multi target render wrapper\r\n */\r\n public get isMulti(): boolean {\r\n return this._isMulti;\r\n }\r\n\r\n /**\r\n * Defines if the render target wrapper is for a single or an array of textures\r\n */\r\n public get is2DArray(): boolean {\r\n return this.layers > 0;\r\n }\r\n\r\n /**\r\n * Defines if the render target wrapper is for a 3D texture\r\n */\r\n public get is3D(): boolean {\r\n return this.depth > 0;\r\n }\r\n\r\n /**\r\n * Gets the size of the render target wrapper (used for cubes, as width=height in this case)\r\n */\r\n public get size(): number {\r\n return this.width;\r\n }\r\n\r\n /**\r\n * Gets the width of the render target wrapper\r\n */\r\n public get width(): number {\r\n return (<{ width: number; height: number }>this._size).width || this._size;\r\n }\r\n\r\n /**\r\n * Gets the height of the render target wrapper\r\n */\r\n public get height(): number {\r\n return (<{ width: number; height: number }>this._size).height || this._size;\r\n }\r\n\r\n /**\r\n * Gets the number of layers of the render target wrapper (only used if is2DArray is true and wrapper is not a multi render target)\r\n */\r\n public get layers(): number {\r\n return (<{ width: number; height: number; depth?: number; layers?: number }>this._size).layers || 0;\r\n }\r\n\r\n /**\r\n * Gets the depth of the render target wrapper (only used if is3D is true and wrapper is not a multi render target)\r\n */\r\n public get depth(): number {\r\n return (<{ width: number; height: number; depth?: number; layers?: number }>this._size).depth || 0;\r\n }\r\n\r\n /**\r\n * Gets the render texture. If this is a multi render target, gets the first texture\r\n */\r\n public get texture(): Nullable {\r\n return this._textures?.[0] ?? null;\r\n }\r\n\r\n /**\r\n * Gets the list of render textures. If we are not in a multi render target, the list will be null (use the texture getter instead)\r\n */\r\n public get textures(): Nullable {\r\n return this._textures;\r\n }\r\n\r\n /**\r\n * Gets the face indices that correspond to the list of render textures. If we are not in a multi render target, the list will be null\r\n */\r\n public get faceIndices(): Nullable {\r\n return this._faceIndices;\r\n }\r\n\r\n /**\r\n * Gets the layer indices that correspond to the list of render textures. If we are not in a multi render target, the list will be null\r\n */\r\n public get layerIndices(): Nullable {\r\n return this._layerIndices;\r\n }\r\n\r\n /**\r\n * Gets the sample count of the render target\r\n */\r\n public get samples(): number {\r\n return this._samples;\r\n }\r\n\r\n /**\r\n * Sets the sample count of the render target\r\n * @param value sample count\r\n * @param initializeBuffers If set to true, the engine will make an initializing call to drawBuffers (only used when isMulti=true).\r\n * @param force true to force calling the update sample count engine function even if the current sample count is equal to value\r\n * @returns the sample count that has been set\r\n */\r\n public setSamples(value: number, initializeBuffers = true, force = false): number {\r\n if (this.samples === value && !force) {\r\n return value;\r\n }\r\n\r\n const result = this._isMulti\r\n ? this._engine.updateMultipleRenderTargetTextureSampleCount(this, value, initializeBuffers)\r\n : this._engine.updateRenderTargetTextureSampleCount(this, value);\r\n this._samples = value;\r\n return result;\r\n }\r\n\r\n /**\r\n * Initializes the render target wrapper\r\n * @param isMulti true if the wrapper is a multi render target\r\n * @param isCube true if the wrapper should render to a cube texture\r\n * @param size size of the render target (width/height/layers)\r\n * @param engine engine used to create the render target\r\n * @param label defines the label to use for the wrapper (for debugging purpose only)\r\n */\r\n constructor(isMulti: boolean, isCube: boolean, size: TextureSize, engine: ThinEngine, label?: string) {\r\n this._isMulti = isMulti;\r\n this._isCube = isCube;\r\n this._size = size;\r\n this._engine = engine;\r\n this._depthStencilTexture = null;\r\n this.label = label;\r\n }\r\n\r\n /**\r\n * Sets the render target texture(s)\r\n * @param textures texture(s) to set\r\n */\r\n public setTextures(textures: Nullable | Nullable): void {\r\n if (Array.isArray(textures)) {\r\n this._textures = textures;\r\n } else if (textures) {\r\n this._textures = [textures];\r\n } else {\r\n this._textures = null;\r\n }\r\n }\r\n\r\n /**\r\n * Set a texture in the textures array\r\n * @param texture The texture to set\r\n * @param index The index in the textures array to set\r\n * @param disposePrevious If this function should dispose the previous texture\r\n */\r\n public setTexture(texture: InternalTexture, index: number = 0, disposePrevious: boolean = true): void {\r\n if (!this._textures) {\r\n this._textures = [];\r\n }\r\n if (this._textures[index] === texture) {\r\n return;\r\n }\r\n\r\n if (this._textures[index] && disposePrevious) {\r\n this._textures[index].dispose();\r\n }\r\n\r\n this._textures[index] = texture;\r\n }\r\n\r\n /**\r\n * Sets the layer and face indices of every render target texture bound to each color attachment\r\n * @param layers The layers of each texture to be set\r\n * @param faces The faces of each texture to be set\r\n */\r\n public setLayerAndFaceIndices(layers: number[], faces: number[]) {\r\n this._layerIndices = layers;\r\n this._faceIndices = faces;\r\n }\r\n\r\n /**\r\n * Sets the layer and face indices of a texture in the textures array that should be bound to each color attachment\r\n * @param index The index of the texture in the textures array to modify\r\n * @param layer The layer of the texture to be set\r\n * @param face The face of the texture to be set\r\n */\r\n public setLayerAndFaceIndex(index: number = 0, layer?: number, face?: number): void {\r\n if (!this._layerIndices) {\r\n this._layerIndices = [];\r\n }\r\n if (!this._faceIndices) {\r\n this._faceIndices = [];\r\n }\r\n\r\n if (layer !== undefined && layer >= 0) {\r\n this._layerIndices[index] = layer;\r\n }\r\n if (face !== undefined && face >= 0) {\r\n this._faceIndices[index] = face;\r\n }\r\n }\r\n\r\n /**\r\n * Creates the depth/stencil texture\r\n * @param comparisonFunction Comparison function to use for the texture\r\n * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture\r\n * @param generateStencil true if the stencil aspect should also be created\r\n * @param samples sample count to use when creating the texture\r\n * @param format format of the depth texture\r\n * @param label defines the label to use for the texture (for debugging purpose only)\r\n * @returns the depth/stencil created texture\r\n */\r\n public createDepthStencilTexture(\r\n comparisonFunction: number = 0,\r\n bilinearFiltering: boolean = true,\r\n generateStencil: boolean = false,\r\n samples: number = 1,\r\n format: number = Constants.TEXTUREFORMAT_DEPTH32_FLOAT,\r\n label?: string\r\n ): InternalTexture {\r\n this._depthStencilTexture?.dispose();\r\n\r\n this._depthStencilTextureWithStencil = generateStencil;\r\n this._depthStencilTextureLabel = label;\r\n this._depthStencilTexture = this._engine.createDepthStencilTexture(\r\n this._size,\r\n {\r\n bilinearFiltering,\r\n comparisonFunction,\r\n generateStencil,\r\n isCube: this._isCube,\r\n samples,\r\n depthTextureFormat: format,\r\n label,\r\n },\r\n this\r\n );\r\n\r\n return this._depthStencilTexture;\r\n }\r\n\r\n /**\r\n * Shares the depth buffer of this render target with another render target.\r\n * @internal\r\n * @param renderTarget Destination renderTarget\r\n */\r\n public _shareDepth(renderTarget: RenderTargetWrapper): void {\r\n if (this._depthStencilTexture) {\r\n if (renderTarget._depthStencilTexture) {\r\n renderTarget._depthStencilTexture.dispose();\r\n }\r\n\r\n renderTarget._depthStencilTexture = this._depthStencilTexture;\r\n this._depthStencilTexture.incrementReferences();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _swapAndDie(target: InternalTexture): void {\r\n if (this.texture) {\r\n this.texture._swapAndDie(target);\r\n }\r\n this._textures = null;\r\n this.dispose(true);\r\n }\r\n\r\n protected _cloneRenderTargetWrapper(): Nullable {\r\n let rtw: Nullable = null;\r\n\r\n if (this._isMulti) {\r\n const textureArray = this.textures;\r\n if (textureArray && textureArray.length > 0) {\r\n let generateDepthTexture = false;\r\n let textureCount = textureArray.length;\r\n let depthTextureFormat = -1;\r\n\r\n const lastTextureSource = textureArray[textureArray.length - 1]._source;\r\n if (lastTextureSource === InternalTextureSource.Depth || lastTextureSource === InternalTextureSource.DepthStencil) {\r\n generateDepthTexture = true;\r\n depthTextureFormat = textureArray[textureArray.length - 1].format;\r\n textureCount--;\r\n }\r\n\r\n const samplingModes: number[] = [];\r\n const types: number[] = [];\r\n const formats: number[] = [];\r\n const targetTypes: number[] = [];\r\n const faceIndex: number[] = [];\r\n const layerIndex: number[] = [];\r\n const layerCounts: number[] = [];\r\n const internalTexture2Index: { [id: number]: number } = {};\r\n\r\n for (let i = 0; i < textureCount; ++i) {\r\n const texture = textureArray[i];\r\n\r\n samplingModes.push(texture.samplingMode);\r\n types.push(texture.type);\r\n formats.push(texture.format);\r\n\r\n const index = internalTexture2Index[texture.uniqueId];\r\n if (index !== undefined) {\r\n targetTypes.push(-1);\r\n layerCounts.push(0);\r\n } else {\r\n internalTexture2Index[texture.uniqueId] = i;\r\n if (texture.is2DArray) {\r\n targetTypes.push(Constants.TEXTURE_2D_ARRAY);\r\n layerCounts.push(texture.depth);\r\n } else if (texture.isCube) {\r\n targetTypes.push(Constants.TEXTURE_CUBE_MAP);\r\n layerCounts.push(0);\r\n } /*else if (texture.isCubeArray) {\r\n targetTypes.push(Constants.TEXTURE_CUBE_MAP_ARRAY);\r\n layerCounts.push(texture.depth);\r\n }*/ else if (texture.is3D) {\r\n targetTypes.push(Constants.TEXTURE_3D);\r\n layerCounts.push(texture.depth);\r\n } else {\r\n targetTypes.push(Constants.TEXTURE_2D);\r\n layerCounts.push(0);\r\n }\r\n }\r\n\r\n if (this._faceIndices) {\r\n faceIndex.push(this._faceIndices[i] ?? 0);\r\n }\r\n if (this._layerIndices) {\r\n layerIndex.push(this._layerIndices[i] ?? 0);\r\n }\r\n }\r\n\r\n const optionsMRT: IMultiRenderTargetOptions = {\r\n samplingModes,\r\n generateMipMaps: textureArray[0].generateMipMaps,\r\n generateDepthBuffer: this._generateDepthBuffer,\r\n generateStencilBuffer: this._generateStencilBuffer,\r\n generateDepthTexture,\r\n depthTextureFormat,\r\n types,\r\n formats,\r\n textureCount,\r\n targetTypes,\r\n faceIndex,\r\n layerIndex,\r\n layerCounts,\r\n label: this.label,\r\n };\r\n const size = {\r\n width: this.width,\r\n height: this.height,\r\n depth: this.depth,\r\n };\r\n\r\n rtw = this._engine.createMultipleRenderTarget(size, optionsMRT);\r\n\r\n for (let i = 0; i < textureCount; ++i) {\r\n if (targetTypes[i] !== -1) {\r\n continue;\r\n }\r\n const index = internalTexture2Index[textureArray[i].uniqueId];\r\n rtw.setTexture(rtw.textures![index], i);\r\n }\r\n }\r\n } else {\r\n const options: RenderTargetCreationOptions = {};\r\n\r\n options.generateDepthBuffer = this._generateDepthBuffer;\r\n options.generateMipMaps = this.texture?.generateMipMaps ?? false;\r\n options.generateStencilBuffer = this._generateStencilBuffer;\r\n options.samplingMode = this.texture?.samplingMode;\r\n options.type = this.texture?.type;\r\n options.format = this.texture?.format;\r\n options.noColorAttachment = !this._textures;\r\n options.label = this.label;\r\n\r\n if (this.isCube) {\r\n rtw = this._engine.createRenderTargetCubeTexture(this.width, options);\r\n } else {\r\n const size = {\r\n width: this.width,\r\n height: this.height,\r\n layers: this.is2DArray || this.is3D ? this.texture?.depth : undefined,\r\n };\r\n\r\n rtw = this._engine.createRenderTargetTexture(size, options);\r\n }\r\n if (rtw.texture) {\r\n rtw.texture!.isReady = true;\r\n }\r\n }\r\n\r\n return rtw;\r\n }\r\n\r\n protected _swapRenderTargetWrapper(target: RenderTargetWrapper): void {\r\n if (this._textures && target._textures) {\r\n for (let i = 0; i < this._textures.length; ++i) {\r\n this._textures[i]._swapAndDie(target._textures[i], false);\r\n target._textures[i].isReady = true;\r\n }\r\n }\r\n if (this._depthStencilTexture && target._depthStencilTexture) {\r\n this._depthStencilTexture._swapAndDie(target._depthStencilTexture);\r\n target._depthStencilTexture.isReady = true;\r\n }\r\n\r\n this._textures = null;\r\n this._depthStencilTexture = null;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n const rtw = this._cloneRenderTargetWrapper();\r\n if (!rtw) {\r\n return;\r\n }\r\n\r\n if (this._depthStencilTexture) {\r\n const samplingMode = this._depthStencilTexture.samplingMode;\r\n const format = this._depthStencilTexture.format;\r\n const bilinear =\r\n samplingMode === Constants.TEXTURE_BILINEAR_SAMPLINGMODE ||\r\n samplingMode === Constants.TEXTURE_TRILINEAR_SAMPLINGMODE ||\r\n samplingMode === Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST;\r\n\r\n rtw.createDepthStencilTexture(\r\n this._depthStencilTexture._comparisonFunction,\r\n bilinear,\r\n this._depthStencilTextureWithStencil,\r\n this._depthStencilTexture.samples,\r\n format,\r\n this._depthStencilTextureLabel\r\n );\r\n }\r\n\r\n if (this.samples > 1) {\r\n rtw.setSamples(this.samples);\r\n }\r\n\r\n rtw._swapRenderTargetWrapper(this);\r\n rtw.dispose();\r\n }\r\n\r\n /**\r\n * Releases the internal render textures\r\n */\r\n public releaseTextures(): void {\r\n if (this._textures) {\r\n for (let i = 0; i < this._textures?.length ?? 0; ++i) {\r\n this._textures[i].dispose();\r\n }\r\n }\r\n this._textures = null;\r\n }\r\n\r\n /**\r\n * Disposes the whole render target wrapper\r\n * @param disposeOnlyFramebuffers true if only the frame buffers should be released (used for the WebGL engine). If false, all the textures will also be released\r\n */\r\n public dispose(disposeOnlyFramebuffers = false): void {\r\n if (!disposeOnlyFramebuffers) {\r\n this._depthStencilTexture?.dispose();\r\n this._depthStencilTexture = null;\r\n this.releaseTextures();\r\n }\r\n\r\n this._engine._releaseRenderTargetWrapper(this);\r\n }\r\n}\r\n", "// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"postprocessVertexShader\";\nconst shader = `attribute vec2 position;uniform vec2 scale;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5);\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvUV=(position*madd+madd)*scale;gl_Position=vec4(position,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const postprocessVertexShader = { name, shader };\n", "import type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport type { TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../constants\";\r\nimport type { Engine } from \"../engine\";\r\nimport { RenderTargetWrapper } from \"../renderTargetWrapper\";\r\nimport type { ThinEngine } from \"../thinEngine\";\r\n\r\n/** @internal */\r\nexport class WebGLRenderTargetWrapper extends RenderTargetWrapper {\r\n private _context: WebGLRenderingContext;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _framebuffer: Nullable = null;\r\n /**\r\n * @internal\r\n */\r\n public _depthStencilBuffer: Nullable = null;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public _MSAAFramebuffer: Nullable = null;\r\n\r\n // Multiview\r\n /**\r\n * @internal\r\n */\r\n public _colorTextureArray: Nullable = null;\r\n /**\r\n * @internal\r\n */\r\n public _depthStencilTextureArray: Nullable = null;\r\n /**\r\n * @internal\r\n */\r\n public _disposeOnlyFramebuffers = false;\r\n /**\r\n * @internal\r\n */\r\n public _currentLOD = 0;\r\n\r\n constructor(isMulti: boolean, isCube: boolean, size: TextureSize, engine: ThinEngine, context: WebGLRenderingContext) {\r\n super(isMulti, isCube, size, engine);\r\n\r\n this._context = context;\r\n }\r\n\r\n protected _cloneRenderTargetWrapper(): Nullable {\r\n let rtw: Nullable = null;\r\n\r\n if (this._colorTextureArray && this._depthStencilTextureArray) {\r\n rtw = (this._engine as Engine).createMultiviewRenderTargetTexture(this.width, this.height);\r\n rtw.texture!.isReady = true;\r\n } else {\r\n rtw = super._cloneRenderTargetWrapper();\r\n }\r\n\r\n return rtw;\r\n }\r\n\r\n protected _swapRenderTargetWrapper(target: WebGLRenderTargetWrapper): void {\r\n super._swapRenderTargetWrapper(target);\r\n\r\n target._framebuffer = this._framebuffer;\r\n target._depthStencilBuffer = this._depthStencilBuffer;\r\n target._MSAAFramebuffer = this._MSAAFramebuffer;\r\n target._colorTextureArray = this._colorTextureArray;\r\n target._depthStencilTextureArray = this._depthStencilTextureArray;\r\n\r\n this._framebuffer = this._depthStencilBuffer = this._MSAAFramebuffer = this._colorTextureArray = this._depthStencilTextureArray = null;\r\n }\r\n\r\n /**\r\n * Creates the depth/stencil texture\r\n * @param comparisonFunction Comparison function to use for the texture\r\n * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture\r\n * @param generateStencil true if the stencil aspect should also be created\r\n * @param samples sample count to use when creating the texture\r\n * @param format format of the depth texture\r\n * @param label defines the label to use for the texture (for debugging purpose only)\r\n * @returns the depth/stencil created texture\r\n */\r\n public createDepthStencilTexture(\r\n comparisonFunction: number = 0,\r\n bilinearFiltering: boolean = true,\r\n generateStencil: boolean = false,\r\n samples: number = 1,\r\n format: number = Constants.TEXTUREFORMAT_DEPTH32_FLOAT,\r\n label?: string\r\n ): InternalTexture {\r\n if (this._depthStencilBuffer) {\r\n // Dispose previous depth/stencil render buffers and clear the corresponding attachment.\r\n // Next time this framebuffer is bound, the new depth/stencil texture will be attached.\r\n const currentFrameBuffer = this._engine._currentFramebuffer;\r\n const gl = this._context;\r\n\r\n this._engine._bindUnboundFramebuffer(this._framebuffer);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, null);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, null);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, null);\r\n this._engine._bindUnboundFramebuffer(currentFrameBuffer);\r\n gl.deleteRenderbuffer(this._depthStencilBuffer);\r\n\r\n this._depthStencilBuffer = null;\r\n }\r\n\r\n return super.createDepthStencilTexture(comparisonFunction, bilinearFiltering, generateStencil, samples, format, label);\r\n }\r\n\r\n /**\r\n * Shares the depth buffer of this render target with another render target.\r\n * @internal\r\n * @param renderTarget Destination renderTarget\r\n */\r\n public _shareDepth(renderTarget: WebGLRenderTargetWrapper): void {\r\n super._shareDepth(renderTarget);\r\n\r\n const gl = this._context;\r\n const depthbuffer = this._depthStencilBuffer;\r\n const framebuffer = renderTarget._MSAAFramebuffer || renderTarget._framebuffer;\r\n\r\n if (renderTarget._depthStencilBuffer && renderTarget._depthStencilBuffer !== depthbuffer) {\r\n gl.deleteRenderbuffer(renderTarget._depthStencilBuffer);\r\n }\r\n renderTarget._depthStencilBuffer = depthbuffer;\r\n const attachment = renderTarget._generateStencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\r\n this._engine._bindUnboundFramebuffer(framebuffer);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, depthbuffer);\r\n this._engine._bindUnboundFramebuffer(null);\r\n }\r\n\r\n /**\r\n * Binds a texture to this render target on a specific attachment\r\n * @param texture The texture to bind to the framebuffer\r\n * @param attachmentIndex Index of the attachment\r\n * @param faceIndexOrLayer The face or layer of the texture to render to in case of cube texture or array texture\r\n * @param lodLevel defines the lod level to bind to the frame buffer\r\n */\r\n private _bindTextureRenderTarget(texture: InternalTexture, attachmentIndex: number = 0, faceIndexOrLayer?: number, lodLevel: number = 0) {\r\n if (!texture._hardwareTexture) {\r\n return;\r\n }\r\n\r\n const framebuffer = this._framebuffer;\r\n\r\n const currentFB = this._engine._currentFramebuffer;\r\n this._engine._bindUnboundFramebuffer(framebuffer);\r\n\r\n if (this._engine.webGLVersion > 1) {\r\n const gl = this._context as WebGL2RenderingContext;\r\n\r\n const attachment = (gl)[\"COLOR_ATTACHMENT\" + attachmentIndex];\r\n if (texture.is2DArray || texture.is3D) {\r\n faceIndexOrLayer = faceIndexOrLayer ?? this.layerIndices?.[attachmentIndex] ?? 0;\r\n gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachment, texture._hardwareTexture.underlyingResource, lodLevel, faceIndexOrLayer);\r\n } else if (texture.isCube) {\r\n // if face index is not specified, try to query it from faceIndices\r\n // default is face 0\r\n faceIndexOrLayer = faceIndexOrLayer ?? this.faceIndices?.[attachmentIndex] ?? 0;\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndexOrLayer, texture._hardwareTexture.underlyingResource, lodLevel);\r\n } else {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, texture._hardwareTexture.underlyingResource, lodLevel);\r\n }\r\n } else {\r\n // Default behavior (WebGL)\r\n const gl = this._context;\r\n\r\n const attachment = (gl)[\"COLOR_ATTACHMENT\" + attachmentIndex + \"_WEBGL\"];\r\n const target = faceIndexOrLayer !== undefined ? gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndexOrLayer : gl.TEXTURE_2D;\r\n\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, target, texture._hardwareTexture.underlyingResource, lodLevel);\r\n }\r\n\r\n this._engine._bindUnboundFramebuffer(currentFB);\r\n }\r\n\r\n /**\r\n * Set a texture in the textures array\r\n * @param texture the texture to set\r\n * @param index the index in the textures array to set\r\n * @param disposePrevious If this function should dispose the previous texture\r\n */\r\n public setTexture(texture: InternalTexture, index: number = 0, disposePrevious: boolean = true) {\r\n super.setTexture(texture, index, disposePrevious);\r\n this._bindTextureRenderTarget(texture, index);\r\n }\r\n\r\n /**\r\n * Sets the layer and face indices of every render target texture\r\n * @param layers The layer of the texture to be set (make negative to not modify)\r\n * @param faces The face of the texture to be set (make negative to not modify)\r\n */\r\n public setLayerAndFaceIndices(layers: number[], faces: number[]) {\r\n super.setLayerAndFaceIndices(layers, faces);\r\n\r\n if (!this.textures || !this.layerIndices || !this.faceIndices) {\r\n return;\r\n }\r\n\r\n // the length of this._attachments is the right one as it does not count the depth texture, in case we generated it\r\n const textureCount = this._attachments?.length ?? this.textures.length;\r\n for (let index = 0; index < textureCount; index++) {\r\n const texture = this.textures[index];\r\n if (!texture) {\r\n // The target type was probably -1 at creation time and setTexture has not been called yet for this index\r\n continue;\r\n }\r\n if (texture.is2DArray || texture.is3D) {\r\n this._bindTextureRenderTarget(texture, index, this.layerIndices[index]);\r\n } else if (texture.isCube) {\r\n this._bindTextureRenderTarget(texture, index, this.faceIndices[index]);\r\n } else {\r\n this._bindTextureRenderTarget(texture, index);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set the face and layer indices of a texture in the textures array\r\n * @param index The index of the texture in the textures array to modify\r\n * @param layer The layer of the texture to be set\r\n * @param face The face of the texture to be set\r\n */\r\n public setLayerAndFaceIndex(index: number = 0, layer?: number, face?: number): void {\r\n super.setLayerAndFaceIndex(index, layer, face);\r\n\r\n if (!this.textures || !this.layerIndices || !this.faceIndices) {\r\n return;\r\n }\r\n\r\n const texture = this.textures[index];\r\n if (texture.is2DArray || texture.is3D) {\r\n this._bindTextureRenderTarget(this.textures[index], index, this.layerIndices[index]);\r\n } else if (texture.isCube) {\r\n this._bindTextureRenderTarget(this.textures[index], index, this.faceIndices[index]);\r\n }\r\n }\r\n\r\n public dispose(disposeOnlyFramebuffers = this._disposeOnlyFramebuffers): void {\r\n const gl = this._context;\r\n\r\n if (!disposeOnlyFramebuffers) {\r\n if (this._colorTextureArray) {\r\n this._context.deleteTexture(this._colorTextureArray);\r\n this._colorTextureArray = null;\r\n }\r\n if (this._depthStencilTextureArray) {\r\n this._context.deleteTexture(this._depthStencilTextureArray);\r\n this._depthStencilTextureArray = null;\r\n }\r\n }\r\n\r\n if (this._framebuffer) {\r\n gl.deleteFramebuffer(this._framebuffer);\r\n this._framebuffer = null;\r\n }\r\n\r\n if (this._depthStencilBuffer) {\r\n gl.deleteRenderbuffer(this._depthStencilBuffer);\r\n this._depthStencilBuffer = null;\r\n }\r\n\r\n if (this._MSAAFramebuffer) {\r\n gl.deleteFramebuffer(this._MSAAFramebuffer);\r\n this._MSAAFramebuffer = null;\r\n }\r\n\r\n super.dispose(disposeOnlyFramebuffers);\r\n }\r\n}\r\n", "import { InternalTexture, InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport type { RenderTargetCreationOptions, DepthTextureCreationOptions, TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\r\nimport { ThinEngine } from \"../thinEngine\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { RenderTargetWrapper } from \"../renderTargetWrapper\";\r\nimport { WebGLRenderTargetWrapper } from \"../WebGL/webGLRenderTargetWrapper\";\r\nimport type { WebGLHardwareTexture } from \"../WebGL/webGLHardwareTexture\";\r\n\r\nimport { Constants } from \"../constants\";\r\n\r\n/**\r\n * Type used to define a texture size (either with a number or with a rect width and height)\r\n * @deprecated please use TextureSize instead\r\n */\r\nexport type RenderTargetTextureSize = TextureSize;\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Creates a new render target texture\r\n * @param size defines the size of the texture\r\n * @param options defines the options used to create the texture\r\n * @returns a new render target wrapper ready to render texture\r\n */\r\n createRenderTargetTexture(size: TextureSize, options: boolean | RenderTargetCreationOptions): RenderTargetWrapper;\r\n\r\n /**\r\n * Creates a depth stencil texture.\r\n * This is only available in WebGL 2 or with the depth texture extension available.\r\n * @param size The size of face edge in the texture.\r\n * @param options The options defining the texture.\r\n * @param rtWrapper The render target wrapper for which the depth/stencil texture must be created\r\n * @returns The texture\r\n */\r\n createDepthStencilTexture(size: TextureSize, options: DepthTextureCreationOptions, rtWrapper: RenderTargetWrapper): InternalTexture;\r\n\r\n /**\r\n * Updates the sample count of a render target texture\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#multisample-render-targets\r\n * @param rtWrapper defines the render target wrapper to update\r\n * @param samples defines the sample count to set\r\n * @returns the effective sample count (could be 0 if multisample render targets are not supported)\r\n */\r\n updateRenderTargetTextureSampleCount(rtWrapper: Nullable, samples: number): number;\r\n\r\n /** @internal */\r\n _createDepthStencilTexture(size: TextureSize, options: DepthTextureCreationOptions, rtWrapper: RenderTargetWrapper): InternalTexture;\r\n\r\n /** @internal */\r\n _createHardwareRenderTargetWrapper(isMulti: boolean, isCube: boolean, size: TextureSize): RenderTargetWrapper;\r\n }\r\n}\r\n\r\nThinEngine.prototype._createHardwareRenderTargetWrapper = function (isMulti: boolean, isCube: boolean, size: TextureSize): RenderTargetWrapper {\r\n const rtWrapper = new WebGLRenderTargetWrapper(isMulti, isCube, size, this, this._gl);\r\n this._renderTargetWrapperCache.push(rtWrapper);\r\n return rtWrapper;\r\n};\r\n\r\nThinEngine.prototype.createRenderTargetTexture = function (this: ThinEngine, size: TextureSize, options: boolean | RenderTargetCreationOptions): RenderTargetWrapper {\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(false, false, size) as WebGLRenderTargetWrapper;\r\n\r\n let generateDepthBuffer = true;\r\n let generateStencilBuffer = false;\r\n let noColorAttachment = false;\r\n let colorAttachment: InternalTexture | undefined = undefined;\r\n let samples = 1;\r\n let label: string | undefined = undefined;\r\n if (options !== undefined && typeof options === \"object\") {\r\n generateDepthBuffer = options.generateDepthBuffer ?? true;\r\n generateStencilBuffer = !!options.generateStencilBuffer;\r\n noColorAttachment = !!options.noColorAttachment;\r\n colorAttachment = options.colorAttachment;\r\n samples = options.samples ?? 1;\r\n label = options.label;\r\n }\r\n\r\n const texture = colorAttachment || (noColorAttachment ? null : this._createInternalTexture(size, options, true, InternalTextureSource.RenderTarget));\r\n const width = (<{ width: number; height: number; layers?: number }>size).width || size;\r\n const height = (<{ width: number; height: number; layers?: number }>size).height || size;\r\n\r\n const currentFrameBuffer = this._currentFramebuffer;\r\n const gl = this._gl;\r\n\r\n // Create the framebuffer\r\n const framebuffer = gl.createFramebuffer();\r\n this._bindUnboundFramebuffer(framebuffer);\r\n rtWrapper._depthStencilBuffer = this._setupFramebufferDepthAttachments(generateStencilBuffer, generateDepthBuffer, width, height);\r\n\r\n // No need to rebind on every frame\r\n if (texture && !texture.is2DArray && !texture.is3D) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture._hardwareTexture!.underlyingResource, 0);\r\n }\r\n\r\n this._bindUnboundFramebuffer(currentFrameBuffer);\r\n\r\n rtWrapper.label = label ?? \"RenderTargetWrapper\";\r\n rtWrapper._framebuffer = framebuffer;\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n\r\n rtWrapper.setTextures(texture);\r\n\r\n this.updateRenderTargetTextureSampleCount(rtWrapper, samples);\r\n\r\n return rtWrapper;\r\n};\r\n\r\nThinEngine.prototype.createDepthStencilTexture = function (size: TextureSize, options: DepthTextureCreationOptions, rtWrapper: RenderTargetWrapper): InternalTexture {\r\n if (options.isCube) {\r\n const width = (<{ width: number; height: number }>size).width || size;\r\n return this._createDepthStencilCubeTexture(width, options);\r\n } else {\r\n return this._createDepthStencilTexture(size, options, rtWrapper);\r\n }\r\n};\r\n\r\nThinEngine.prototype._createDepthStencilTexture = function (size: TextureSize, options: DepthTextureCreationOptions): InternalTexture {\r\n const gl = this._gl;\r\n const layers = (<{ width: number; height: number; depth?: number; layers?: number }>size).layers || 0;\r\n const depth = (<{ width: number; height: number; depth?: number; layers?: number }>size).depth || 0;\r\n let target: number = gl.TEXTURE_2D;\r\n if (layers !== 0) {\r\n target = gl.TEXTURE_2D_ARRAY;\r\n } else if (depth !== 0) {\r\n target = gl.TEXTURE_3D;\r\n }\r\n const internalTexture = new InternalTexture(this, InternalTextureSource.DepthStencil);\r\n internalTexture.label = options.label;\r\n if (!this._caps.depthTextureExtension) {\r\n Logger.Error(\"Depth texture is not supported by your browser or hardware.\");\r\n return internalTexture;\r\n }\r\n\r\n const internalOptions = {\r\n bilinearFiltering: false,\r\n comparisonFunction: 0,\r\n generateStencil: false,\r\n ...options,\r\n };\r\n\r\n this._bindTextureDirectly(target, internalTexture, true);\r\n\r\n this._setupDepthStencilTexture(\r\n internalTexture,\r\n size,\r\n internalOptions.generateStencil,\r\n internalOptions.comparisonFunction === 0 ? false : internalOptions.bilinearFiltering,\r\n internalOptions.comparisonFunction,\r\n internalOptions.samples\r\n );\r\n\r\n if (internalOptions.depthTextureFormat !== undefined) {\r\n if (\r\n internalOptions.depthTextureFormat !== Constants.TEXTUREFORMAT_DEPTH16 &&\r\n internalOptions.depthTextureFormat !== Constants.TEXTUREFORMAT_DEPTH24 &&\r\n internalOptions.depthTextureFormat !== Constants.TEXTUREFORMAT_DEPTH24UNORM_STENCIL8 &&\r\n internalOptions.depthTextureFormat !== Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 &&\r\n internalOptions.depthTextureFormat !== Constants.TEXTUREFORMAT_DEPTH32_FLOAT &&\r\n internalOptions.depthTextureFormat !== Constants.TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8\r\n ) {\r\n Logger.Error(\"Depth texture format is not supported.\");\r\n return internalTexture;\r\n }\r\n internalTexture.format = internalOptions.depthTextureFormat;\r\n } else {\r\n internalTexture.format = internalOptions.generateStencil ? Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 : Constants.TEXTUREFORMAT_DEPTH24;\r\n }\r\n\r\n const hasStencil =\r\n internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24UNORM_STENCIL8 ||\r\n internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 ||\r\n internalTexture.format === Constants.TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8;\r\n\r\n let type: GLenum = gl.UNSIGNED_INT;\r\n if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH16) {\r\n type = gl.UNSIGNED_SHORT;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24UNORM_STENCIL8 || internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24_STENCIL8) {\r\n type = gl.UNSIGNED_INT_24_8;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH32_FLOAT) {\r\n type = gl.FLOAT;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8) {\r\n type = gl.FLOAT_32_UNSIGNED_INT_24_8_REV;\r\n }\r\n\r\n const format: GLenum = hasStencil ? gl.DEPTH_STENCIL : gl.DEPTH_COMPONENT;\r\n let internalFormat = format;\r\n if (this.webGLVersion > 1) {\r\n if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH16) {\r\n internalFormat = gl.DEPTH_COMPONENT16;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24) {\r\n internalFormat = gl.DEPTH_COMPONENT24;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24UNORM_STENCIL8 || internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24_STENCIL8) {\r\n internalFormat = gl.DEPTH24_STENCIL8;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH32_FLOAT) {\r\n internalFormat = gl.DEPTH_COMPONENT32F;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8) {\r\n internalFormat = gl.DEPTH32F_STENCIL8;\r\n }\r\n }\r\n\r\n if (internalTexture.is2DArray) {\r\n gl.texImage3D(target, 0, internalFormat, internalTexture.width, internalTexture.height, layers, 0, format, type, null);\r\n } else if (internalTexture.is3D) {\r\n gl.texImage3D(target, 0, internalFormat, internalTexture.width, internalTexture.height, depth, 0, format, type, null);\r\n } else {\r\n gl.texImage2D(target, 0, internalFormat, internalTexture.width, internalTexture.height, 0, format, type, null);\r\n }\r\n\r\n this._bindTextureDirectly(target, null);\r\n\r\n this._internalTexturesCache.push(internalTexture);\r\n\r\n return internalTexture;\r\n};\r\n\r\nThinEngine.prototype.updateRenderTargetTextureSampleCount = function (rtWrapper: Nullable, samples: number): number {\r\n if (this.webGLVersion < 2 || !rtWrapper || !rtWrapper.texture) {\r\n return 1;\r\n }\r\n\r\n if (rtWrapper.samples === samples) {\r\n return samples;\r\n }\r\n\r\n const gl = this._gl;\r\n\r\n samples = Math.min(samples, this.getCaps().maxMSAASamples);\r\n\r\n // Dispose previous render buffers\r\n if (rtWrapper._depthStencilBuffer) {\r\n gl.deleteRenderbuffer(rtWrapper._depthStencilBuffer);\r\n rtWrapper._depthStencilBuffer = null;\r\n }\r\n\r\n if (rtWrapper._MSAAFramebuffer) {\r\n gl.deleteFramebuffer(rtWrapper._MSAAFramebuffer);\r\n rtWrapper._MSAAFramebuffer = null;\r\n }\r\n\r\n const hardwareTexture = rtWrapper.texture._hardwareTexture as WebGLHardwareTexture;\r\n hardwareTexture.releaseMSAARenderBuffers();\r\n\r\n if (samples > 1 && typeof gl.renderbufferStorageMultisample === \"function\") {\r\n const framebuffer = gl.createFramebuffer();\r\n\r\n if (!framebuffer) {\r\n throw new Error(\"Unable to create multi sampled framebuffer\");\r\n }\r\n\r\n rtWrapper._MSAAFramebuffer = framebuffer;\r\n this._bindUnboundFramebuffer(rtWrapper._MSAAFramebuffer);\r\n\r\n const colorRenderbuffer = this._createRenderBuffer(\r\n rtWrapper.texture.width,\r\n rtWrapper.texture.height,\r\n samples,\r\n -1 /* not used */,\r\n this._getRGBABufferInternalSizedFormat(rtWrapper.texture.type, rtWrapper.texture.format, rtWrapper.texture._useSRGBBuffer),\r\n gl.COLOR_ATTACHMENT0,\r\n false\r\n );\r\n\r\n if (!colorRenderbuffer) {\r\n throw new Error(\"Unable to create multi sampled framebuffer\");\r\n }\r\n\r\n hardwareTexture.addMSAARenderBuffer(colorRenderbuffer);\r\n } else {\r\n this._bindUnboundFramebuffer(rtWrapper._framebuffer);\r\n }\r\n\r\n rtWrapper.texture.samples = samples;\r\n rtWrapper._samples = samples;\r\n rtWrapper._depthStencilBuffer = this._setupFramebufferDepthAttachments(\r\n rtWrapper._generateStencilBuffer,\r\n rtWrapper._generateDepthBuffer,\r\n rtWrapper.texture.width,\r\n rtWrapper.texture.height,\r\n samples\r\n );\r\n\r\n this._bindUnboundFramebuffer(null);\r\n\r\n return samples;\r\n};\r\n", "import type { Nullable } from \"../types\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Vector2 } from \"../Maths/math.vector\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { RenderTargetCreationOptions } from \"../Materials/Textures/textureCreationOptions\";\r\nimport \"../Shaders/postprocess.vertex\";\r\nimport type { IInspectable } from \"../Misc/iInspectable\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport type { Color4 } from \"../Maths/math.color\";\r\n\r\nimport \"../Engines/Extensions/engine.renderTarget\";\r\nimport type { NodeMaterial } from \"../Materials/Node/nodeMaterial\";\r\nimport { serialize, serializeAsColor4 } from \"../Misc/decorators\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport { GetClass, RegisterClass } from \"../Misc/typeStore\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport type { RenderTargetWrapper } from \"../Engines/renderTargetWrapper\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\n\r\nimport type { Scene } from \"../scene\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport type { Animation } from \"../Animations/animation\";\r\nimport type { PrePassRenderer } from \"../Rendering/prePassRenderer\";\r\nimport type { PrePassEffectConfiguration } from \"../Rendering/prePassEffectConfiguration\";\r\n\r\n/**\r\n * Allows for custom processing of the shader code used by a post process\r\n */\r\nexport type PostProcessCustomShaderCodeProcessing = {\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated after the #include have been processed\r\n */\r\n processCodeAfterIncludes?: (postProcessName: string, shaderType: string, code: string) => string;\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: (postProcessName: string, shaderType: string, code: string) => string;\r\n /**\r\n * If provided, will be called before creating the effect to collect additional custom bindings (defines, uniforms, samplers)\r\n */\r\n defineCustomBindings?: (postProcessName: string, defines: Nullable, uniforms: string[], samplers: string[]) => Nullable;\r\n /**\r\n * If provided, will be called when binding inputs to the shader code to allow the user to add custom bindings\r\n */\r\n bindCustomBindings?: (postProcessName: string, effect: Effect) => void;\r\n};\r\n\r\n/**\r\n * Options for the PostProcess constructor\r\n */\r\nexport type PostProcessOptions = {\r\n /**\r\n * The width of the texture created for this post process.\r\n * This parameter (and height) is only used when passing a value for the 5th parameter (options) to the PostProcess constructor function.\r\n * If you use a PostProcessOptions for the 3rd parameter of the constructor, size is used instead of width and height.\r\n */\r\n width?: number;\r\n /**\r\n * The height of the texture created for this post process.\r\n * This parameter (and width) is only used when passing a value for the 5th parameter (options) to the PostProcess constructor function.\r\n * If you use a PostProcessOptions for the 3rd parameter of the constructor, size is used instead of width and height.\r\n */\r\n height?: number;\r\n\r\n /**\r\n * The list of uniforms used in the shader (if any)\r\n */\r\n uniforms?: Nullable;\r\n /**\r\n * The list of samplers used in the shader (if any)\r\n */\r\n samplers?: Nullable;\r\n /**\r\n * The list of uniform buffers used in the shader (if any)\r\n */\r\n uniformBuffers?: Nullable;\r\n /**\r\n * String of defines that will be set when running the fragment shader. (default: null)\r\n */\r\n defines?: Nullable;\r\n /**\r\n * The size of the post process texture.\r\n * It is either a ratio to downscale or upscale the texture create for this post process, or an object containing width and height values.\r\n * Default: 1\r\n */\r\n size?: number | { width: number; height: number };\r\n /**\r\n * The camera that the post process will be attached to (default: null)\r\n */\r\n camera?: Nullable;\r\n /**\r\n * The sampling mode to be used by the shader (default: Constants.TEXTURE_NEAREST_SAMPLINGMODE)\r\n */\r\n samplingMode?: number;\r\n /**\r\n * The engine to be used to render the post process (default: engine from scene)\r\n */\r\n engine?: Engine;\r\n /**\r\n * If the post process can be reused on the same frame. (default: false)\r\n */\r\n reusable?: boolean;\r\n /**\r\n * Type of the texture created for this post process (default: Constants.TEXTURETYPE_UNSIGNED_INT)\r\n */\r\n textureType?: number;\r\n /**\r\n * The url of the vertex shader to be used. (default: \"postprocess\")\r\n */\r\n vertexUrl?: string;\r\n /**\r\n * The index parameters to be used for babylons include syntax \"#include[0..varyingCount]\". (default: undefined)\r\n * See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\r\n */\r\n indexParameters?: any;\r\n /**\r\n * If the shader should not be compiled immediately. (default: false)\r\n */\r\n blockCompilation?: boolean;\r\n /**\r\n * Format of the texture created for this post process (default: TEXTUREFORMAT_RGBA)\r\n */\r\n textureFormat?: number;\r\n /**\r\n * The shader language of the shader. (default: GLSL)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n};\r\n\r\ntype TextureCache = { texture: RenderTargetWrapper; postProcessChannel: number; lastUsedRenderId: number };\r\n\r\n/**\r\n * PostProcess can be used to apply a shader to a texture after it has been rendered\r\n * See https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses\r\n */\r\nexport class PostProcess {\r\n /** @internal */\r\n public _parentContainer: Nullable = null;\r\n\r\n private static _CustomShaderCodeProcessing: { [postProcessName: string]: PostProcessCustomShaderCodeProcessing } = {};\r\n\r\n /**\r\n * Registers a shader code processing with a post process name.\r\n * @param postProcessName name of the post process. Use null for the fallback shader code processing. This is the shader code processing that will be used in case no specific shader code processing has been associated to a post process name\r\n * @param customShaderCodeProcessing shader code processing to associate to the post process name\r\n */\r\n public static RegisterShaderCodeProcessing(postProcessName: Nullable, customShaderCodeProcessing?: PostProcessCustomShaderCodeProcessing) {\r\n if (!customShaderCodeProcessing) {\r\n delete PostProcess._CustomShaderCodeProcessing[postProcessName ?? \"\"];\r\n return;\r\n }\r\n\r\n PostProcess._CustomShaderCodeProcessing[postProcessName ?? \"\"] = customShaderCodeProcessing;\r\n }\r\n\r\n private static _GetShaderCodeProcessing(postProcessName: string) {\r\n return PostProcess._CustomShaderCodeProcessing[postProcessName] ?? PostProcess._CustomShaderCodeProcessing[\"\"];\r\n }\r\n\r\n /**\r\n * Gets or sets the unique id of the post process\r\n */\r\n @serialize()\r\n public uniqueId: number;\r\n\r\n /** Name of the PostProcess. */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Width of the texture to apply the post process on\r\n */\r\n @serialize()\r\n public width = -1;\r\n\r\n /**\r\n * Height of the texture to apply the post process on\r\n */\r\n @serialize()\r\n public height = -1;\r\n\r\n /**\r\n * Gets the node material used to create this postprocess (null if the postprocess was manually created)\r\n */\r\n public nodeMaterialSource: Nullable = null;\r\n\r\n /**\r\n * Internal, reference to the location where this postprocess was output to. (Typically the texture on the next postprocess in the chain)\r\n * @internal\r\n */\r\n public _outputTexture: Nullable = null;\r\n /**\r\n * Sampling mode used by the shader\r\n * See https://doc.babylonjs.com/classes/3.1/texture\r\n */\r\n @serialize()\r\n public renderTargetSamplingMode: number;\r\n /**\r\n * Clear color to use when screen clearing\r\n */\r\n @serializeAsColor4()\r\n public clearColor: Color4;\r\n /**\r\n * If the buffer needs to be cleared before applying the post process. (default: true)\r\n * Should be set to false if shader will overwrite all previous pixels.\r\n */\r\n @serialize()\r\n public autoClear = true;\r\n /**\r\n * If clearing the buffer should be forced in autoClear mode, even when alpha mode is enabled (default: false).\r\n * By default, the buffer will only be cleared if alpha mode is disabled (and autoClear is true).\r\n */\r\n @serialize()\r\n public forceAutoClearInAlphaMode = false;\r\n /**\r\n * Type of alpha mode to use when performing the post process (default: Engine.ALPHA_DISABLE)\r\n */\r\n @serialize()\r\n public alphaMode = Constants.ALPHA_DISABLE;\r\n /**\r\n * Sets the setAlphaBlendConstants of the babylon engine\r\n */\r\n @serialize()\r\n public alphaConstants: Color4;\r\n /**\r\n * Animations to be used for the post processing\r\n */\r\n public animations: Animation[] = [];\r\n\r\n /**\r\n * Enable Pixel Perfect mode where texture is not scaled to be power of 2.\r\n * Can only be used on a single postprocess or on the last one of a chain. (default: false)\r\n */\r\n @serialize()\r\n public enablePixelPerfectMode = false;\r\n\r\n /**\r\n * Force the postprocess to be applied without taking in account viewport\r\n */\r\n @serialize()\r\n public forceFullscreenViewport = true;\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility\r\n */\r\n public inspectableCustomProperties: IInspectable[];\r\n\r\n /**\r\n * Scale mode for the post process (default: Engine.SCALEMODE_FLOOR)\r\n *\r\n * | Value | Type | Description |\r\n * | ----- | ----------------------------------- | ----------- |\r\n * | 1 | SCALEMODE_FLOOR | [engine.scalemode_floor](https://doc.babylonjs.com/api/classes/babylon.engine#scalemode_floor) |\r\n * | 2 | SCALEMODE_NEAREST | [engine.scalemode_nearest](https://doc.babylonjs.com/api/classes/babylon.engine#scalemode_nearest) |\r\n * | 3 | SCALEMODE_CEILING | [engine.scalemode_ceiling](https://doc.babylonjs.com/api/classes/babylon.engine#scalemode_ceiling) |\r\n *\r\n */\r\n @serialize()\r\n public scaleMode = Constants.SCALEMODE_FLOOR;\r\n /**\r\n * Force textures to be a power of two (default: false)\r\n */\r\n @serialize()\r\n public alwaysForcePOT = false;\r\n\r\n @serialize(\"samples\")\r\n private _samples = 1;\r\n\r\n /**\r\n * Number of sample textures (default: 1)\r\n */\r\n public get samples() {\r\n return this._samples;\r\n }\r\n\r\n public set samples(n: number) {\r\n this._samples = Math.min(n, this._engine.getCaps().maxMSAASamples);\r\n\r\n this._textures.forEach((texture) => {\r\n texture.setSamples(this._samples);\r\n });\r\n }\r\n\r\n /**\r\n * Modify the scale of the post process to be the same as the viewport (default: false)\r\n */\r\n @serialize()\r\n public adaptScaleToCurrentViewport = false;\r\n\r\n private _camera: Camera;\r\n protected _scene: Scene;\r\n private _engine: Engine;\r\n\r\n private _options: number | { width: number; height: number };\r\n private _reusable = false;\r\n private _renderId = 0;\r\n private _textureType: number;\r\n private _textureFormat: number;\r\n private _shaderLanguage: ShaderLanguage;\r\n\r\n /**\r\n * if externalTextureSamplerBinding is true, the \"apply\" method won't bind the textureSampler texture, it is expected to be done by the \"outside\" (by the onApplyObservable observer most probably).\r\n * counter-productive in some cases because if the texture bound by \"apply\" is different from the currently texture bound, (the one set by the onApplyObservable observer, for eg) some\r\n * internal structures (materialContext) will be dirtified, which may impact performances\r\n */\r\n public externalTextureSamplerBinding = false;\r\n\r\n /**\r\n * Smart array of input and output textures for the post process.\r\n * @internal\r\n */\r\n public _textures = new SmartArray(2);\r\n /**\r\n * Smart array of input and output textures for the post process.\r\n * @internal\r\n */\r\n private _textureCache: TextureCache[] = [];\r\n /**\r\n * The index in _textures that corresponds to the output texture.\r\n * @internal\r\n */\r\n public _currentRenderTextureInd = 0;\r\n private _drawWrapper: DrawWrapper;\r\n private _samplers: string[];\r\n private _fragmentUrl: string;\r\n private _vertexUrl: string;\r\n private _parameters: string[];\r\n private _uniformBuffers: string[];\r\n protected _postProcessDefines: Nullable;\r\n private _scaleRatio = new Vector2(1, 1);\r\n protected _indexParameters: any;\r\n private _shareOutputWithPostProcess: Nullable;\r\n private _texelSize = Vector2.Zero();\r\n\r\n /** @internal */\r\n public _forcedOutputTexture: Nullable;\r\n\r\n /**\r\n * Prepass configuration in case this post process needs a texture from prepass\r\n * @internal\r\n */\r\n public _prePassEffectConfiguration: PrePassEffectConfiguration;\r\n\r\n /**\r\n * Returns the fragment url or shader name used in the post process.\r\n * @returns the fragment url or name in the shader store.\r\n */\r\n public getEffectName(): string {\r\n return this._fragmentUrl;\r\n }\r\n\r\n // Events\r\n\r\n /**\r\n * An event triggered when the postprocess is activated.\r\n */\r\n public onActivateObservable = new Observable();\r\n\r\n private _onActivateObserver: Nullable>;\r\n /**\r\n * A function that is added to the onActivateObservable\r\n */\r\n public set onActivate(callback: Nullable<(camera: Camera) => void>) {\r\n if (this._onActivateObserver) {\r\n this.onActivateObservable.remove(this._onActivateObserver);\r\n }\r\n if (callback) {\r\n this._onActivateObserver = this.onActivateObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * An event triggered when the postprocess changes its size.\r\n */\r\n public onSizeChangedObservable = new Observable();\r\n\r\n private _onSizeChangedObserver: Nullable>;\r\n /**\r\n * A function that is added to the onSizeChangedObservable\r\n */\r\n public set onSizeChanged(callback: (postProcess: PostProcess) => void) {\r\n if (this._onSizeChangedObserver) {\r\n this.onSizeChangedObservable.remove(this._onSizeChangedObserver);\r\n }\r\n this._onSizeChangedObserver = this.onSizeChangedObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the postprocess applies its effect.\r\n */\r\n public onApplyObservable = new Observable();\r\n\r\n private _onApplyObserver: Nullable>;\r\n /**\r\n * A function that is added to the onApplyObservable\r\n */\r\n public set onApply(callback: (effect: Effect) => void) {\r\n if (this._onApplyObserver) {\r\n this.onApplyObservable.remove(this._onApplyObserver);\r\n }\r\n this._onApplyObserver = this.onApplyObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered before rendering the postprocess\r\n */\r\n public onBeforeRenderObservable = new Observable();\r\n\r\n private _onBeforeRenderObserver: Nullable>;\r\n /**\r\n * A function that is added to the onBeforeRenderObservable\r\n */\r\n public set onBeforeRender(callback: (effect: Effect) => void) {\r\n if (this._onBeforeRenderObserver) {\r\n this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n }\r\n this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered after rendering the postprocess\r\n */\r\n public onAfterRenderObservable = new Observable();\r\n\r\n private _onAfterRenderObserver: Nullable>;\r\n /**\r\n * A function that is added to the onAfterRenderObservable\r\n */\r\n public set onAfterRender(callback: (efect: Effect) => void) {\r\n if (this._onAfterRenderObserver) {\r\n this.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n }\r\n this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * The input texture for this post process and the output texture of the previous post process. When added to a pipeline the previous post process will\r\n * render it's output into this texture and this texture will be used as textureSampler in the fragment shader of this post process.\r\n */\r\n public get inputTexture(): RenderTargetWrapper {\r\n return this._textures.data[this._currentRenderTextureInd];\r\n }\r\n\r\n public set inputTexture(value: RenderTargetWrapper) {\r\n this._forcedOutputTexture = value;\r\n }\r\n\r\n /**\r\n * Since inputTexture should always be defined, if we previously manually set `inputTexture`,\r\n * the only way to unset it is to use this function to restore its internal state\r\n */\r\n public restoreDefaultInputTexture() {\r\n if (this._forcedOutputTexture) {\r\n this._forcedOutputTexture = null;\r\n this.markTextureDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the camera which post process is applied to.\r\n * @returns The camera the post process is applied to.\r\n */\r\n public getCamera(): Camera {\r\n return this._camera;\r\n }\r\n\r\n /**\r\n * Gets the texel size of the postprocess.\r\n * See https://en.wikipedia.org/wiki/Texel_(graphics)\r\n */\r\n public get texelSize(): Vector2 {\r\n if (this._shareOutputWithPostProcess) {\r\n return this._shareOutputWithPostProcess.texelSize;\r\n }\r\n\r\n if (this._forcedOutputTexture) {\r\n this._texelSize.copyFromFloats(1.0 / this._forcedOutputTexture.width, 1.0 / this._forcedOutputTexture.height);\r\n }\r\n\r\n return this._texelSize;\r\n }\r\n\r\n /**\r\n * Creates a new instance PostProcess\r\n * @param name The name of the PostProcess.\r\n * @param fragmentUrl The url of the fragment shader to be used.\r\n * @param options The options to be used when constructing the post process.\r\n */\r\n constructor(name: string, fragmentUrl: string, options?: PostProcessOptions);\r\n\r\n /**\r\n * Creates a new instance PostProcess\r\n * @param name The name of the PostProcess.\r\n * @param fragmentUrl The url of the fragment shader to be used.\r\n * @param parameters Array of the names of uniform non-sampler2D variables that will be passed to the shader.\r\n * @param samplers Array of the names of uniform sampler2D variables that will be passed to the shader.\r\n * @param options The required width/height ratio to downsize to before computing the render pass. (Use 1.0 for full size)\r\n * @param camera The camera to apply the render pass to.\r\n * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)\r\n * @param engine The engine which the post process will be applied. (default: current engine)\r\n * @param reusable If the post process can be reused on the same frame. (default: false)\r\n * @param defines String of defines that will be set when running the fragment shader. (default: null)\r\n * @param textureType Type of textures used when performing the post process. (default: 0)\r\n * @param vertexUrl The url of the vertex shader to be used. (default: \"postprocess\")\r\n * @param indexParameters The index parameters to be used for babylons include syntax \"#include[0..varyingCount]\". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\r\n * @param blockCompilation If the shader should not be compiled immediatly. (default: false)\r\n * @param textureFormat Format of textures used when performing the post process. (default: TEXTUREFORMAT_RGBA)\r\n * @param shaderLanguage The shader language of the shader. (default: GLSL)\r\n */\r\n constructor(\r\n name: string,\r\n fragmentUrl: string,\r\n parameters: Nullable,\r\n samplers: Nullable,\r\n options: number | PostProcessOptions,\r\n camera: Nullable,\r\n samplingMode?: number,\r\n engine?: Engine,\r\n reusable?: boolean,\r\n defines?: Nullable,\r\n textureType?: number,\r\n vertexUrl?: string,\r\n indexParameters?: any,\r\n blockCompilation?: boolean,\r\n textureFormat?: number,\r\n shaderLanguage?: ShaderLanguage\r\n );\r\n\r\n /** @internal */\r\n constructor(\r\n name: string,\r\n fragmentUrl: string,\r\n parameters?: Nullable | PostProcessOptions,\r\n samplers?: Nullable,\r\n _size?: number | PostProcessOptions,\r\n camera?: Nullable,\r\n samplingMode: number = Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n engine?: Engine,\r\n reusable?: boolean,\r\n defines: Nullable = null,\r\n textureType: number = Constants.TEXTURETYPE_UNSIGNED_INT,\r\n vertexUrl: string = \"postprocess\",\r\n indexParameters?: any,\r\n blockCompilation = false,\r\n textureFormat = Constants.TEXTUREFORMAT_RGBA,\r\n shaderLanguage = ShaderLanguage.GLSL\r\n ) {\r\n this.name = name;\r\n let size: number | { width: number; height: number } = 1;\r\n let uniformBuffers: Nullable = null;\r\n if (parameters && !Array.isArray(parameters)) {\r\n const options = parameters;\r\n parameters = options.uniforms ?? null;\r\n samplers = options.samplers ?? null;\r\n size = options.size ?? 1;\r\n camera = options.camera ?? null;\r\n samplingMode = options.samplingMode ?? Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n engine = options.engine;\r\n reusable = options.reusable;\r\n defines = options.defines ?? null;\r\n textureType = options.textureType ?? Constants.TEXTURETYPE_UNSIGNED_INT;\r\n vertexUrl = options.vertexUrl ?? \"postprocess\";\r\n indexParameters = options.indexParameters;\r\n blockCompilation = options.blockCompilation ?? false;\r\n textureFormat = options.textureFormat ?? Constants.TEXTUREFORMAT_RGBA;\r\n shaderLanguage = options.shaderLanguage ?? ShaderLanguage.GLSL;\r\n uniformBuffers = options.uniformBuffers ?? null;\r\n } else if (_size) {\r\n if (typeof _size === \"number\") {\r\n size = _size;\r\n } else {\r\n size = { width: _size.width!, height: _size.height! };\r\n }\r\n }\r\n\r\n if (camera != null) {\r\n this._camera = camera;\r\n this._scene = camera.getScene();\r\n camera.attachPostProcess(this);\r\n this._engine = this._scene.getEngine();\r\n\r\n this._scene.postProcesses.push(this);\r\n this.uniqueId = this._scene.getUniqueId();\r\n } else if (engine) {\r\n this._engine = engine;\r\n this._engine.postProcesses.push(this);\r\n }\r\n\r\n this._options = size;\r\n this.renderTargetSamplingMode = samplingMode ? samplingMode : Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n this._reusable = reusable || false;\r\n this._textureType = textureType;\r\n this._textureFormat = textureFormat;\r\n this._shaderLanguage = shaderLanguage;\r\n\r\n this._samplers = samplers || [];\r\n this._samplers.push(\"textureSampler\");\r\n\r\n this._fragmentUrl = fragmentUrl;\r\n this._vertexUrl = vertexUrl;\r\n this._parameters = parameters || [];\r\n\r\n this._parameters.push(\"scale\");\r\n this._uniformBuffers = uniformBuffers || [];\r\n\r\n this._indexParameters = indexParameters;\r\n this._drawWrapper = new DrawWrapper(this._engine);\r\n\r\n if (!blockCompilation) {\r\n this.updateEffect(defines);\r\n }\r\n }\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"PostProcess\" string\r\n */\r\n public getClassName(): string {\r\n return \"PostProcess\";\r\n }\r\n\r\n /**\r\n * Gets the engine which this post process belongs to.\r\n * @returns The engine the post process was enabled with.\r\n */\r\n public getEngine(): Engine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * The effect that is created when initializing the post process.\r\n * @returns The created effect corresponding the postprocess.\r\n */\r\n public getEffect(): Effect {\r\n return this._drawWrapper.effect!;\r\n }\r\n\r\n /**\r\n * To avoid multiple redundant textures for multiple post process, the output the output texture for this post process can be shared with another.\r\n * @param postProcess The post process to share the output with.\r\n * @returns This post process.\r\n */\r\n public shareOutputWith(postProcess: PostProcess): PostProcess {\r\n this._disposeTextures();\r\n\r\n this._shareOutputWithPostProcess = postProcess;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Reverses the effect of calling shareOutputWith and returns the post process back to its original state.\r\n * This should be called if the post process that shares output with this post process is disabled/disposed.\r\n */\r\n public useOwnOutput() {\r\n if (this._textures.length == 0) {\r\n this._textures = new SmartArray(2);\r\n }\r\n\r\n this._shareOutputWithPostProcess = null;\r\n }\r\n\r\n /**\r\n * Updates the effect with the current post process compile time values and recompiles the shader.\r\n * @param defines Define statements that should be added at the beginning of the shader. (default: null)\r\n * @param uniforms Set of uniform variables that will be passed to the shader. (default: null)\r\n * @param samplers Set of Texture2D variables that will be passed to the shader. (default: null)\r\n * @param indexParameters The index parameters to be used for babylons include syntax \"#include[0..varyingCount]\". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\r\n * @param onCompiled Called when the shader has been compiled.\r\n * @param onError Called if there is an error when compiling a shader.\r\n * @param vertexUrl The url of the vertex shader to be used (default: the one given at construction time)\r\n * @param fragmentUrl The url of the fragment shader to be used (default: the one given at construction time)\r\n */\r\n public updateEffect(\r\n defines: Nullable = null,\r\n uniforms: Nullable = null,\r\n samplers: Nullable = null,\r\n indexParameters?: any,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n vertexUrl?: string,\r\n fragmentUrl?: string\r\n ) {\r\n const customShaderCodeProcessing = PostProcess._GetShaderCodeProcessing(this.name);\r\n if (customShaderCodeProcessing?.defineCustomBindings) {\r\n const newUniforms = uniforms?.slice() ?? [];\r\n newUniforms.push(...this._parameters);\r\n\r\n const newSamplers = samplers?.slice() ?? [];\r\n newSamplers.push(...this._samplers);\r\n\r\n defines = customShaderCodeProcessing.defineCustomBindings(this.name, defines, newUniforms, newSamplers);\r\n uniforms = newUniforms;\r\n samplers = newSamplers;\r\n }\r\n this._postProcessDefines = defines;\r\n this._drawWrapper.effect = this._engine.createEffect(\r\n { vertex: vertexUrl ?? this._vertexUrl, fragment: fragmentUrl ?? this._fragmentUrl },\r\n {\r\n attributes: [\"position\"],\r\n uniformsNames: uniforms || this._parameters,\r\n uniformBuffersNames: this._uniformBuffers,\r\n samplers: samplers || this._samplers,\r\n defines: defines !== null ? defines : \"\",\r\n fallbacks: null,\r\n onCompiled: onCompiled ?? null,\r\n onError: onError ?? null,\r\n indexParameters: indexParameters || this._indexParameters,\r\n processCodeAfterIncludes: customShaderCodeProcessing?.processCodeAfterIncludes\r\n ? (shaderType: string, code: string) => customShaderCodeProcessing!.processCodeAfterIncludes!(this.name, shaderType, code)\r\n : null,\r\n processFinalCode: customShaderCodeProcessing?.processFinalCode\r\n ? (shaderType: string, code: string) => customShaderCodeProcessing!.processFinalCode!(this.name, shaderType, code)\r\n : null,\r\n shaderLanguage: this._shaderLanguage,\r\n },\r\n this._engine\r\n );\r\n }\r\n\r\n /**\r\n * The post process is reusable if it can be used multiple times within one frame.\r\n * @returns If the post process is reusable\r\n */\r\n public isReusable(): boolean {\r\n return this._reusable;\r\n }\r\n\r\n /** invalidate frameBuffer to hint the postprocess to create a depth buffer */\r\n public markTextureDirty(): void {\r\n this.width = -1;\r\n }\r\n\r\n private _createRenderTargetTexture(textureSize: { width: number; height: number }, textureOptions: RenderTargetCreationOptions, channel = 0) {\r\n for (let i = 0; i < this._textureCache.length; i++) {\r\n if (\r\n this._textureCache[i].texture.width === textureSize.width &&\r\n this._textureCache[i].texture.height === textureSize.height &&\r\n this._textureCache[i].postProcessChannel === channel &&\r\n this._textureCache[i].texture._generateDepthBuffer === textureOptions.generateDepthBuffer &&\r\n this._textureCache[i].texture.samples === textureOptions.samples\r\n ) {\r\n return this._textureCache[i].texture;\r\n }\r\n }\r\n\r\n const tex = this._engine.createRenderTargetTexture(textureSize, textureOptions);\r\n this._textureCache.push({ texture: tex, postProcessChannel: channel, lastUsedRenderId: -1 });\r\n\r\n return tex;\r\n }\r\n\r\n private _flushTextureCache() {\r\n const currentRenderId = this._renderId;\r\n\r\n for (let i = this._textureCache.length - 1; i >= 0; i--) {\r\n if (currentRenderId - this._textureCache[i].lastUsedRenderId > 100) {\r\n let currentlyUsed = false;\r\n for (let j = 0; j < this._textures.length; j++) {\r\n if (this._textures.data[j] === this._textureCache[i].texture) {\r\n currentlyUsed = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!currentlyUsed) {\r\n this._textureCache[i].texture.dispose();\r\n this._textureCache.splice(i, 1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resizes the post-process texture\r\n * @param width Width of the texture\r\n * @param height Height of the texture\r\n * @param camera The camera this post-process is applied to. Pass null if the post-process is used outside the context of a camera post-process chain (default: null)\r\n * @param needMipMaps True if mip maps need to be generated after render (default: false)\r\n * @param forceDepthStencil True to force post-process texture creation with stencil depth and buffer (default: false)\r\n */\r\n public resize(width: number, height: number, camera: Nullable = null, needMipMaps = false, forceDepthStencil = false) {\r\n if (this._textures.length > 0) {\r\n this._textures.reset();\r\n }\r\n\r\n this.width = width;\r\n this.height = height;\r\n\r\n let firstPP = null;\r\n if (camera) {\r\n for (let i = 0; i < camera._postProcesses.length; i++) {\r\n if (camera._postProcesses[i] !== null) {\r\n firstPP = camera._postProcesses[i];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const textureSize = { width: this.width, height: this.height };\r\n const textureOptions = {\r\n generateMipMaps: needMipMaps,\r\n generateDepthBuffer: forceDepthStencil || firstPP === this,\r\n generateStencilBuffer: (forceDepthStencil || firstPP === this) && this._engine.isStencilEnable,\r\n samplingMode: this.renderTargetSamplingMode,\r\n type: this._textureType,\r\n format: this._textureFormat,\r\n samples: this._samples,\r\n label: \"PostProcessRTT-\" + this.name,\r\n };\r\n\r\n this._textures.push(this._createRenderTargetTexture(textureSize, textureOptions, 0));\r\n\r\n if (this._reusable) {\r\n this._textures.push(this._createRenderTargetTexture(textureSize, textureOptions, 1));\r\n }\r\n\r\n this._texelSize.copyFromFloats(1.0 / this.width, 1.0 / this.height);\r\n\r\n this.onSizeChangedObservable.notifyObservers(this);\r\n }\r\n\r\n private _getTarget() {\r\n let target: RenderTargetWrapper;\r\n\r\n if (this._shareOutputWithPostProcess) {\r\n target = this._shareOutputWithPostProcess.inputTexture;\r\n } else if (this._forcedOutputTexture) {\r\n target = this._forcedOutputTexture;\r\n\r\n this.width = this._forcedOutputTexture.width;\r\n this.height = this._forcedOutputTexture.height;\r\n } else {\r\n target = this.inputTexture;\r\n\r\n let cache;\r\n for (let i = 0; i < this._textureCache.length; i++) {\r\n if (this._textureCache[i].texture === target) {\r\n cache = this._textureCache[i];\r\n break;\r\n }\r\n }\r\n\r\n if (cache) {\r\n cache.lastUsedRenderId = this._renderId;\r\n }\r\n }\r\n\r\n return target;\r\n }\r\n\r\n /**\r\n * Activates the post process by intializing the textures to be used when executed. Notifies onActivateObservable.\r\n * When this post process is used in a pipeline, this is call will bind the input texture of this post process to the output of the previous.\r\n * @param camera The camera that will be used in the post process. This camera will be used when calling onActivateObservable.\r\n * @param sourceTexture The source texture to be inspected to get the width and height if not specified in the post process constructor. (default: null)\r\n * @param forceDepthStencil If true, a depth and stencil buffer will be generated. (default: false)\r\n * @returns The render target wrapper that was bound to be written to.\r\n */\r\n public activate(camera: Nullable, sourceTexture: Nullable = null, forceDepthStencil?: boolean): RenderTargetWrapper {\r\n camera = camera || this._camera;\r\n\r\n const scene = camera.getScene();\r\n const engine = scene.getEngine();\r\n const maxSize = engine.getCaps().maxTextureSize;\r\n\r\n const requiredWidth = ((sourceTexture ? sourceTexture.width : this._engine.getRenderWidth(true)) * this._options) | 0;\r\n const requiredHeight = ((sourceTexture ? sourceTexture.height : this._engine.getRenderHeight(true)) * this._options) | 0;\r\n\r\n let desiredWidth = (this._options).width || requiredWidth;\r\n let desiredHeight = (this._options).height || requiredHeight;\r\n\r\n const needMipMaps =\r\n this.renderTargetSamplingMode !== Constants.TEXTURE_NEAREST_LINEAR &&\r\n this.renderTargetSamplingMode !== Constants.TEXTURE_NEAREST_NEAREST &&\r\n this.renderTargetSamplingMode !== Constants.TEXTURE_LINEAR_LINEAR;\r\n\r\n let target: Nullable = null;\r\n\r\n if (!this._shareOutputWithPostProcess && !this._forcedOutputTexture) {\r\n if (this.adaptScaleToCurrentViewport) {\r\n const currentViewport = engine.currentViewport;\r\n\r\n if (currentViewport) {\r\n desiredWidth *= currentViewport.width;\r\n desiredHeight *= currentViewport.height;\r\n }\r\n }\r\n\r\n if (needMipMaps || this.alwaysForcePOT) {\r\n if (!(this._options).width) {\r\n desiredWidth = engine.needPOTTextures ? Engine.GetExponentOfTwo(desiredWidth, maxSize, this.scaleMode) : desiredWidth;\r\n }\r\n\r\n if (!(this._options).height) {\r\n desiredHeight = engine.needPOTTextures ? Engine.GetExponentOfTwo(desiredHeight, maxSize, this.scaleMode) : desiredHeight;\r\n }\r\n }\r\n\r\n if (this.width !== desiredWidth || this.height !== desiredHeight || !(target = this._getTarget())) {\r\n this.resize(desiredWidth, desiredHeight, camera, needMipMaps, forceDepthStencil);\r\n }\r\n\r\n this._textures.forEach((texture) => {\r\n if (texture.samples !== this.samples) {\r\n this._engine.updateRenderTargetTextureSampleCount(texture, this.samples);\r\n }\r\n });\r\n\r\n this._flushTextureCache();\r\n this._renderId++;\r\n }\r\n\r\n if (!target) {\r\n target = this._getTarget();\r\n }\r\n\r\n // Bind the input of this post process to be used as the output of the previous post process.\r\n if (this.enablePixelPerfectMode) {\r\n this._scaleRatio.copyFromFloats(requiredWidth / desiredWidth, requiredHeight / desiredHeight);\r\n this._engine.bindFramebuffer(target, 0, requiredWidth, requiredHeight, this.forceFullscreenViewport);\r\n } else {\r\n this._scaleRatio.copyFromFloats(1, 1);\r\n this._engine.bindFramebuffer(target, 0, undefined, undefined, this.forceFullscreenViewport);\r\n }\r\n\r\n this._engine._debugInsertMarker?.(`post process ${this.name} input`);\r\n\r\n this.onActivateObservable.notifyObservers(camera);\r\n\r\n // Clear\r\n if (this.autoClear && (this.alphaMode === Constants.ALPHA_DISABLE || this.forceAutoClearInAlphaMode)) {\r\n this._engine.clear(this.clearColor ? this.clearColor : scene.clearColor, scene._allowPostProcessClearColor, true, true);\r\n }\r\n\r\n if (this._reusable) {\r\n this._currentRenderTextureInd = (this._currentRenderTextureInd + 1) % 2;\r\n }\r\n return target;\r\n }\r\n\r\n /**\r\n * If the post process is supported.\r\n */\r\n public get isSupported(): boolean {\r\n return this._drawWrapper.effect!.isSupported;\r\n }\r\n\r\n /**\r\n * The aspect ratio of the output texture.\r\n */\r\n public get aspectRatio(): number {\r\n if (this._shareOutputWithPostProcess) {\r\n return this._shareOutputWithPostProcess.aspectRatio;\r\n }\r\n\r\n if (this._forcedOutputTexture) {\r\n return this._forcedOutputTexture.width / this._forcedOutputTexture.height;\r\n }\r\n return this.width / this.height;\r\n }\r\n\r\n /**\r\n * Get a value indicating if the post-process is ready to be used\r\n * @returns true if the post-process is ready (shader is compiled)\r\n */\r\n public isReady(): boolean {\r\n return this._drawWrapper.effect?.isReady() ?? false;\r\n }\r\n\r\n /**\r\n * Binds all textures and uniforms to the shader, this will be run on every pass.\r\n * @returns the effect corresponding to this post process. Null if not compiled or not ready.\r\n */\r\n public apply(): Nullable {\r\n // Check\r\n if (!this._drawWrapper.effect?.isReady()) {\r\n return null;\r\n }\r\n\r\n // States\r\n this._engine.enableEffect(this._drawWrapper);\r\n this._engine.setState(false);\r\n this._engine.setDepthBuffer(false);\r\n this._engine.setDepthWrite(false);\r\n\r\n // Alpha\r\n this._engine.setAlphaMode(this.alphaMode);\r\n if (this.alphaConstants) {\r\n this.getEngine().setAlphaConstants(this.alphaConstants.r, this.alphaConstants.g, this.alphaConstants.b, this.alphaConstants.a);\r\n }\r\n\r\n // Bind the output texture of the preivous post process as the input to this post process.\r\n let source: RenderTargetWrapper;\r\n if (this._shareOutputWithPostProcess) {\r\n source = this._shareOutputWithPostProcess.inputTexture;\r\n } else if (this._forcedOutputTexture) {\r\n source = this._forcedOutputTexture;\r\n } else {\r\n source = this.inputTexture;\r\n }\r\n\r\n if (!this.externalTextureSamplerBinding) {\r\n this._drawWrapper.effect._bindTexture(\"textureSampler\", source?.texture);\r\n }\r\n\r\n // Parameters\r\n this._drawWrapper.effect.setVector2(\"scale\", this._scaleRatio);\r\n this.onApplyObservable.notifyObservers(this._drawWrapper.effect);\r\n\r\n PostProcess._GetShaderCodeProcessing(this.name)?.bindCustomBindings?.(this.name, this._drawWrapper.effect);\r\n\r\n return this._drawWrapper.effect;\r\n }\r\n\r\n private _disposeTextures() {\r\n if (this._shareOutputWithPostProcess || this._forcedOutputTexture) {\r\n this._disposeTextureCache();\r\n return;\r\n }\r\n\r\n this._disposeTextureCache();\r\n this._textures.dispose();\r\n }\r\n\r\n private _disposeTextureCache() {\r\n for (let i = this._textureCache.length - 1; i >= 0; i--) {\r\n this._textureCache[i].texture.dispose();\r\n }\r\n\r\n this._textureCache.length = 0;\r\n }\r\n\r\n /**\r\n * Sets the required values to the prepass renderer.\r\n * @param prePassRenderer defines the prepass renderer to setup.\r\n * @returns true if the pre pass is needed.\r\n */\r\n public setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean {\r\n if (this._prePassEffectConfiguration) {\r\n this._prePassEffectConfiguration = prePassRenderer.addEffectConfiguration(this._prePassEffectConfiguration);\r\n this._prePassEffectConfiguration.enabled = true;\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the post process.\r\n * @param camera The camera to dispose the post process on.\r\n */\r\n public dispose(camera?: Camera): void {\r\n camera = camera || this._camera;\r\n\r\n this._disposeTextures();\r\n\r\n let index;\r\n if (this._scene) {\r\n index = this._scene.postProcesses.indexOf(this);\r\n if (index !== -1) {\r\n this._scene.postProcesses.splice(index, 1);\r\n }\r\n }\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.postProcesses.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.postProcesses.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n index = this._engine.postProcesses.indexOf(this);\r\n if (index !== -1) {\r\n this._engine.postProcesses.splice(index, 1);\r\n }\r\n\r\n if (!camera) {\r\n return;\r\n }\r\n camera.detachPostProcess(this);\r\n\r\n index = camera._postProcesses.indexOf(this);\r\n if (index === 0 && camera._postProcesses.length > 0) {\r\n const firstPostProcess = this._camera._getFirstPostProcess();\r\n if (firstPostProcess) {\r\n firstPostProcess.markTextureDirty();\r\n }\r\n }\r\n\r\n this.onActivateObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onApplyObservable.clear();\r\n this.onBeforeRenderObservable.clear();\r\n this.onSizeChangedObservable.clear();\r\n }\r\n\r\n /**\r\n * Serializes the post process to a JSON object\r\n * @returns the JSON object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n const camera = this.getCamera() || (this._scene && this._scene.activeCamera);\r\n serializationObject.customType = \"BABYLON.\" + this.getClassName();\r\n serializationObject.cameraId = camera ? camera.id : null;\r\n serializationObject.reusable = this._reusable;\r\n serializationObject.textureType = this._textureType;\r\n serializationObject.fragmentUrl = this._fragmentUrl;\r\n serializationObject.parameters = this._parameters;\r\n serializationObject.samplers = this._samplers;\r\n serializationObject.options = this._options;\r\n serializationObject.defines = this._postProcessDefines;\r\n serializationObject.textureFormat = this._textureFormat;\r\n serializationObject.vertexUrl = this._vertexUrl;\r\n serializationObject.indexParameters = this._indexParameters;\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Clones this post process\r\n * @returns a new post process similar to this one\r\n */\r\n public clone(): Nullable {\r\n const serializationObject = this.serialize();\r\n serializationObject._engine = this._engine;\r\n serializationObject.cameraId = null;\r\n\r\n const result = PostProcess.Parse(serializationObject, this._scene, \"\");\r\n\r\n if (!result) {\r\n return null;\r\n }\r\n\r\n result.onActivateObservable = this.onActivateObservable.clone();\r\n result.onSizeChangedObservable = this.onSizeChangedObservable.clone();\r\n result.onApplyObservable = this.onApplyObservable.clone();\r\n result.onBeforeRenderObservable = this.onBeforeRenderObservable.clone();\r\n result.onAfterRenderObservable = this.onAfterRenderObservable.clone();\r\n\r\n result._prePassEffectConfiguration = this._prePassEffectConfiguration;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a material from parsed material data\r\n * @param parsedPostProcess defines parsed post process data\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures\r\n * @returns a new post process\r\n */\r\n public static Parse(parsedPostProcess: any, scene: Scene, rootUrl: string): Nullable {\r\n const postProcessType = GetClass(parsedPostProcess.customType);\r\n\r\n if (!postProcessType || !postProcessType._Parse) {\r\n return null;\r\n }\r\n\r\n const camera = scene ? scene.getCameraById(parsedPostProcess.cameraId) : null;\r\n return postProcessType._Parse(parsedPostProcess, camera, scene, rootUrl);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): Nullable {\r\n return SerializationHelper.Parse(\r\n () => {\r\n return new PostProcess(\r\n parsedPostProcess.name,\r\n parsedPostProcess.fragmentUrl,\r\n parsedPostProcess.parameters,\r\n parsedPostProcess.samplers,\r\n parsedPostProcess.options,\r\n targetCamera,\r\n parsedPostProcess.renderTargetSamplingMode,\r\n parsedPostProcess._engine,\r\n parsedPostProcess.reusable,\r\n parsedPostProcess.defines,\r\n parsedPostProcess.textureType,\r\n parsedPostProcess.vertexUrl,\r\n parsedPostProcess.indexParameters,\r\n false,\r\n parsedPostProcess.textureFormat\r\n );\r\n },\r\n parsedPostProcess,\r\n scene,\r\n rootUrl\r\n );\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.PostProcess\", PostProcess);\r\n", "import { NodeMaterialBlock } from \"../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport type { Scene } from \"../../../scene\";\r\n\r\n/**\r\n * Block used to create a Vector2/3/4 out of individual inputs (one for each component)\r\n */\r\nexport class VectorMergerBlock extends NodeMaterialBlock {\r\n /**\r\n * Gets or sets the swizzle for x (meaning which component to affect to the output.x)\r\n */\r\n public xSwizzle: \"x\" | \"y\" | \"z\" | \"w\" = \"x\";\r\n /**\r\n * Gets or sets the swizzle for y (meaning which component to affect to the output.y)\r\n */\r\n public ySwizzle: \"x\" | \"y\" | \"z\" | \"w\" = \"y\";\r\n /**\r\n * Gets or sets the swizzle for z (meaning which component to affect to the output.z)\r\n */\r\n public zSwizzle: \"x\" | \"y\" | \"z\" | \"w\" = \"z\";\r\n /**\r\n * Gets or sets the swizzle for w (meaning which component to affect to the output.w)\r\n */\r\n public wSwizzle: \"x\" | \"y\" | \"z\" | \"w\" = \"w\";\r\n\r\n /**\r\n * Create a new VectorMergerBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerInput(\"xyzw \", NodeMaterialBlockConnectionPointTypes.Vector4, true);\r\n this.registerInput(\"xyz \", NodeMaterialBlockConnectionPointTypes.Vector3, true);\r\n this.registerInput(\"xy \", NodeMaterialBlockConnectionPointTypes.Vector2, true);\r\n this.registerInput(\"zw \", NodeMaterialBlockConnectionPointTypes.Vector2, true);\r\n this.registerInput(\"x\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"y\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"z\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"w\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n\r\n this.registerOutput(\"xyzw\", NodeMaterialBlockConnectionPointTypes.Vector4);\r\n this.registerOutput(\"xyz\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerOutput(\"xy\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n this.registerOutput(\"zw\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"VectorMergerBlock\";\r\n }\r\n\r\n /**\r\n * Gets the xyzw component (input)\r\n */\r\n public get xyzwIn(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the xyz component (input)\r\n */\r\n public get xyzIn(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the xy component (input)\r\n */\r\n public get xyIn(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the zw component (input)\r\n */\r\n public get zwIn(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the x component (input)\r\n */\r\n public get x(): NodeMaterialConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the y component (input)\r\n */\r\n public get y(): NodeMaterialConnectionPoint {\r\n return this._inputs[5];\r\n }\r\n\r\n /**\r\n * Gets the z component (input)\r\n */\r\n public get z(): NodeMaterialConnectionPoint {\r\n return this._inputs[6];\r\n }\r\n\r\n /**\r\n * Gets the w component (input)\r\n */\r\n public get w(): NodeMaterialConnectionPoint {\r\n return this._inputs[7];\r\n }\r\n\r\n /**\r\n * Gets the xyzw component (output)\r\n */\r\n public get xyzw(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the xyz component (output)\r\n */\r\n public get xyzOut(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the xy component (output)\r\n */\r\n public get xyOut(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the zw component (output)\r\n */\r\n public get zwOut(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n\r\n /**\r\n * Gets the xy component (output)\r\n * @deprecated Please use xyOut instead.\r\n */\r\n public get xy(): NodeMaterialConnectionPoint {\r\n return this.xyOut;\r\n }\r\n\r\n /**\r\n * Gets the xyz component (output)\r\n * @deprecated Please use xyzOut instead.\r\n */\r\n public get xyz(): NodeMaterialConnectionPoint {\r\n return this.xyzOut;\r\n }\r\n\r\n protected _inputRename(name: string) {\r\n if (name === \"xyzw \") {\r\n return \"xyzwIn\";\r\n }\r\n if (name === \"xyz \") {\r\n return \"xyzIn\";\r\n }\r\n if (name === \"xy \") {\r\n return \"xyIn\";\r\n }\r\n if (name === \"zw \") {\r\n return \"zwIn\";\r\n }\r\n return name;\r\n }\r\n\r\n private _buildSwizzle(len: number) {\r\n const swizzle = this.xSwizzle + this.ySwizzle + this.zSwizzle + this.wSwizzle;\r\n\r\n return \".\" + swizzle.substr(0, len);\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const xInput = this.x;\r\n const yInput = this.y;\r\n const zInput = this.z;\r\n const wInput = this.w;\r\n const xyInput = this.xyIn;\r\n const zwInput = this.zwIn;\r\n const xyzInput = this.xyzIn;\r\n const xyzwInput = this.xyzwIn;\r\n\r\n const v4Output = this._outputs[0];\r\n const v3Output = this._outputs[1];\r\n const v2Output = this._outputs[2];\r\n const v2CompOutput = this._outputs[3];\r\n\r\n if (xyzwInput.isConnected) {\r\n if (v4Output.hasEndpoints) {\r\n state.compilationString += this._declareOutput(v4Output, state) + ` = ${xyzwInput.associatedVariableName}${this._buildSwizzle(4)};\\n`;\r\n }\r\n\r\n if (v3Output.hasEndpoints) {\r\n state.compilationString += this._declareOutput(v3Output, state) + ` = ${xyzwInput.associatedVariableName}${this._buildSwizzle(3)};\\n`;\r\n }\r\n\r\n if (v2Output.hasEndpoints) {\r\n state.compilationString += this._declareOutput(v2Output, state) + ` = ${xyzwInput.associatedVariableName}${this._buildSwizzle(2)};\\n`;\r\n }\r\n } else if (xyzInput.isConnected) {\r\n if (v4Output.hasEndpoints) {\r\n state.compilationString +=\r\n this._declareOutput(v4Output, state) +\r\n ` = vec4(${xyzInput.associatedVariableName}, ${wInput.isConnected ? this._writeVariable(wInput) : \"0.0\"})${this._buildSwizzle(4)};\\n`;\r\n }\r\n\r\n if (v3Output.hasEndpoints) {\r\n state.compilationString += this._declareOutput(v3Output, state) + ` = ${xyzInput.associatedVariableName}${this._buildSwizzle(3)};\\n`;\r\n }\r\n\r\n if (v2Output.hasEndpoints) {\r\n state.compilationString += this._declareOutput(v2Output, state) + ` = ${xyzInput.associatedVariableName}${this._buildSwizzle(2)};\\n`;\r\n }\r\n } else if (xyInput.isConnected) {\r\n if (v4Output.hasEndpoints) {\r\n if (zwInput.isConnected) {\r\n state.compilationString +=\r\n this._declareOutput(v4Output, state) + ` = vec4(${xyInput.associatedVariableName}, ${zwInput.associatedVariableName})${this._buildSwizzle(4)};\\n`;\r\n } else {\r\n state.compilationString +=\r\n this._declareOutput(v4Output, state) +\r\n ` = vec4(${xyInput.associatedVariableName}, ${zInput.isConnected ? this._writeVariable(zInput) : \"0.0\"}, ${\r\n wInput.isConnected ? this._writeVariable(wInput) : \"0.0\"\r\n })${this._buildSwizzle(4)};\\n`;\r\n }\r\n }\r\n\r\n if (v3Output.hasEndpoints) {\r\n state.compilationString +=\r\n this._declareOutput(v3Output, state) +\r\n ` = vec3(${xyInput.associatedVariableName}, ${zInput.isConnected ? this._writeVariable(zInput) : \"0.0\"})${this._buildSwizzle(3)};\\n`;\r\n }\r\n\r\n if (v2Output.hasEndpoints) {\r\n state.compilationString += this._declareOutput(v2Output, state) + ` = ${xyInput.associatedVariableName}${this._buildSwizzle(2)};\\n`;\r\n }\r\n\r\n if (v2CompOutput.hasEndpoints) {\r\n if (zwInput.isConnected) {\r\n state.compilationString += this._declareOutput(v2CompOutput, state) + ` = ${zwInput.associatedVariableName}${this._buildSwizzle(2)};\\n`;\r\n } else {\r\n state.compilationString +=\r\n this._declareOutput(v2CompOutput, state) +\r\n ` = vec2(${zInput.isConnected ? this._writeVariable(zInput) : \"0.0\"}, ${wInput.isConnected ? this._writeVariable(wInput) : \"0.0\"})${this._buildSwizzle(\r\n 2\r\n )};\\n`;\r\n }\r\n }\r\n } else {\r\n if (v4Output.hasEndpoints) {\r\n if (zwInput.isConnected) {\r\n state.compilationString +=\r\n this._declareOutput(v4Output, state) +\r\n ` = vec4(${xInput.isConnected ? this._writeVariable(xInput) : \"0.0\"}, ${yInput.isConnected ? this._writeVariable(yInput) : \"0.0\"}, ${\r\n zwInput.associatedVariableName\r\n })${this._buildSwizzle(4)};\\n`;\r\n } else {\r\n state.compilationString +=\r\n this._declareOutput(v4Output, state) +\r\n ` = vec4(${xInput.isConnected ? this._writeVariable(xInput) : \"0.0\"}, ${yInput.isConnected ? this._writeVariable(yInput) : \"0.0\"}, ${\r\n zInput.isConnected ? this._writeVariable(zInput) : \"0.0\"\r\n }, ${wInput.isConnected ? this._writeVariable(wInput) : \"0.0\"})${this._buildSwizzle(4)};\\n`;\r\n }\r\n }\r\n\r\n if (v3Output.hasEndpoints) {\r\n state.compilationString +=\r\n this._declareOutput(v3Output, state) +\r\n ` = vec3(${xInput.isConnected ? this._writeVariable(xInput) : \"0.0\"}, ${yInput.isConnected ? this._writeVariable(yInput) : \"0.0\"}, ${\r\n zInput.isConnected ? this._writeVariable(zInput) : \"0.0\"\r\n })${this._buildSwizzle(3)};\\n`;\r\n }\r\n\r\n if (v2Output.hasEndpoints) {\r\n state.compilationString +=\r\n this._declareOutput(v2Output, state) +\r\n ` = vec2(${xInput.isConnected ? this._writeVariable(xInput) : \"0.0\"}, ${yInput.isConnected ? this._writeVariable(yInput) : \"0.0\"})${this._buildSwizzle(2)};\\n`;\r\n }\r\n\r\n if (v2CompOutput.hasEndpoints) {\r\n if (zwInput.isConnected) {\r\n state.compilationString += this._declareOutput(v2CompOutput, state) + ` = ${zwInput.associatedVariableName}${this._buildSwizzle(2)};\\n`;\r\n } else {\r\n state.compilationString +=\r\n this._declareOutput(v2CompOutput, state) +\r\n ` = vec2(${zInput.isConnected ? this._writeVariable(zInput) : \"0.0\"}, ${wInput.isConnected ? this._writeVariable(wInput) : \"0.0\"})${this._buildSwizzle(\r\n 2\r\n )};\\n`;\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.xSwizzle = this.xSwizzle;\r\n serializationObject.ySwizzle = this.ySwizzle;\r\n serializationObject.zSwizzle = this.zSwizzle;\r\n serializationObject.wSwizzle = this.wSwizzle;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.xSwizzle = serializationObject.xSwizzle ?? \"x\";\r\n this.ySwizzle = serializationObject.ySwizzle ?? \"y\";\r\n this.zSwizzle = serializationObject.zSwizzle ?? \"z\";\r\n this.wSwizzle = serializationObject.wSwizzle ?? \"w\";\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode();\r\n codeString += `${this._codeVariableName}.xSwizzle = \"${this.xSwizzle}\";\\n`;\r\n codeString += `${this._codeVariableName}.ySwizzle = \"${this.ySwizzle}\";\\n`;\r\n codeString += `${this._codeVariableName}.zSwizzle = \"${this.zSwizzle}\";\\n`;\r\n codeString += `${this._codeVariableName}.wSwizzle = \"${this.wSwizzle}\";\\n`;\r\n\r\n return codeString;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.VectorMergerBlock\", VectorMergerBlock);\r\n", "import { NodeMaterialBlock } from \"../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../nodeMaterialBuildState\";\r\nimport type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { Vector2 } from \"../../../Maths/math.vector\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../Decorators/nodeDecorator\";\r\n/**\r\n * Block used to remap a float from a range to a new one\r\n */\r\nexport class RemapBlock extends NodeMaterialBlock {\r\n /**\r\n * Gets or sets the source range\r\n */\r\n @editableInPropertyPage(\"From\", PropertyTypeForEdition.Vector2)\r\n public sourceRange = new Vector2(-1, 1);\r\n\r\n /**\r\n * Gets or sets the target range\r\n */\r\n @editableInPropertyPage(\"To\", PropertyTypeForEdition.Vector2)\r\n public targetRange = new Vector2(0, 1);\r\n\r\n /**\r\n * Creates a new RemapBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerInput(\"input\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerInput(\"sourceMin\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"sourceMax\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"targetMin\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"targetMax\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n\r\n this.registerOutput(\"output\", NodeMaterialBlockConnectionPointTypes.BasedOnInput);\r\n\r\n this._outputs[0]._typeConnectionSource = this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"RemapBlock\";\r\n }\r\n\r\n /**\r\n * Gets the input component\r\n */\r\n public get input(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the source min input component\r\n */\r\n public get sourceMin(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the source max input component\r\n */\r\n public get sourceMax(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the target min input component\r\n */\r\n public get targetMin(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the target max input component\r\n */\r\n public get targetMax(): NodeMaterialConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const output = this._outputs[0];\r\n\r\n const sourceMin = this.sourceMin.isConnected ? this.sourceMin.associatedVariableName : this._writeFloat(this.sourceRange.x);\r\n const sourceMax = this.sourceMax.isConnected ? this.sourceMax.associatedVariableName : this._writeFloat(this.sourceRange.y);\r\n\r\n const targetMin = this.targetMin.isConnected ? this.targetMin.associatedVariableName : this._writeFloat(this.targetRange.x);\r\n const targetMax = this.targetMax.isConnected ? this.targetMax.associatedVariableName : this._writeFloat(this.targetRange.y);\r\n\r\n state.compilationString +=\r\n this._declareOutput(output, state) +\r\n ` = ${targetMin} + (${this._inputs[0].associatedVariableName} - ${sourceMin}) * (${targetMax} - ${targetMin}) / (${sourceMax} - ${sourceMin});\\n`;\r\n\r\n return this;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode() + `${this._codeVariableName}.sourceRange = new BABYLON.Vector2(${this.sourceRange.x}, ${this.sourceRange.y});\\n`;\r\n\r\n codeString += `${this._codeVariableName}.targetRange = new BABYLON.Vector2(${this.targetRange.x}, ${this.targetRange.y});\\n`;\r\n\r\n return codeString;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.sourceRange = this.sourceRange.asArray();\r\n serializationObject.targetRange = this.targetRange.asArray();\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.sourceRange = Vector2.FromArray(serializationObject.sourceRange);\r\n this.targetRange = Vector2.FromArray(serializationObject.targetRange);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.RemapBlock\", RemapBlock);\r\n", "import type { Observer } from \"core/Misc/observable\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport { NodeMaterialBlock } from \"../nodeMaterialBlock\";\r\nimport type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../Enums/nodeMaterialBlockConnectionPointTypes\";\r\n\r\n/**\r\n * Block used to perform a mathematical operation on 2 values\r\n */\r\nexport class BaseMathBlock extends NodeMaterialBlock {\r\n private readonly _connectionObservers: Observer[];\r\n\r\n protected constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerInput(\"left\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerInput(\"right\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerOutput(\"output\", NodeMaterialBlockConnectionPointTypes.BasedOnInput);\r\n\r\n this.output._typeConnectionSource = this.left;\r\n this._linkConnectionTypes(0, 1, true);\r\n\r\n this.left.acceptedConnectionPointTypes.push(NodeMaterialBlockConnectionPointTypes.Float);\r\n this.right.acceptedConnectionPointTypes.push(NodeMaterialBlockConnectionPointTypes.Float);\r\n\r\n this._connectionObservers = [\r\n this.left.onConnectionObservable.add(() => this._updateInputOutputTypes()),\r\n this.left.onDisconnectionObservable.add(() => this._updateInputOutputTypes()),\r\n this.right.onConnectionObservable.add(() => this._updateInputOutputTypes()),\r\n this.right.onDisconnectionObservable.add(() => this._updateInputOutputTypes()),\r\n ];\r\n }\r\n\r\n /**\r\n * Gets the left operand input component\r\n */\r\n public get left(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the right operand input component\r\n */\r\n public get right(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n private _updateInputOutputTypes() {\r\n // First update the output type with the initial assumption that we'll base it on the left input.\r\n this.output._typeConnectionSource = this.left;\r\n\r\n if (this.left.isConnected && this.right.isConnected) {\r\n // Both inputs are connected, so we need to determine the output type based on the input types.\r\n if (\r\n this.left.type === NodeMaterialBlockConnectionPointTypes.Int ||\r\n (this.left.type === NodeMaterialBlockConnectionPointTypes.Float && this.right.type !== NodeMaterialBlockConnectionPointTypes.Int)\r\n ) {\r\n this.output._typeConnectionSource = this.right;\r\n }\r\n } else if (this.left.isConnected !== this.right.isConnected) {\r\n // Only one input is connected, so we need to determine the output type based on the connected input.\r\n this.output._typeConnectionSource = this.left.isConnected ? this.left : this.right;\r\n }\r\n\r\n // Next update the accepted connection point types for the inputs based on the current input connection state.\r\n if (this.left.isConnected || this.right.isConnected) {\r\n for (const [first, second] of [\r\n [this.left, this.right],\r\n [this.right, this.left],\r\n ]) {\r\n // Always allow Ints and Floats.\r\n first.acceptedConnectionPointTypes = [NodeMaterialBlockConnectionPointTypes.Int, NodeMaterialBlockConnectionPointTypes.Float];\r\n\r\n if (second.isConnected) {\r\n // The same types as the connected input are always allowed.\r\n first.acceptedConnectionPointTypes.push(second.type);\r\n\r\n // If the other input is a scalar, then we also allow Vector/Color/Matrix types.\r\n if (second.type === NodeMaterialBlockConnectionPointTypes.Int || second.type === NodeMaterialBlockConnectionPointTypes.Float) {\r\n first.acceptedConnectionPointTypes.push(\r\n NodeMaterialBlockConnectionPointTypes.Vector2,\r\n NodeMaterialBlockConnectionPointTypes.Vector3,\r\n NodeMaterialBlockConnectionPointTypes.Vector4,\r\n NodeMaterialBlockConnectionPointTypes.Color3,\r\n NodeMaterialBlockConnectionPointTypes.Color4,\r\n NodeMaterialBlockConnectionPointTypes.Matrix\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Release resources\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this._connectionObservers.forEach((observer) => observer.remove());\r\n this._connectionObservers.length = 0;\r\n }\r\n}\r\n", "import type { NodeMaterialBuildState } from \"../nodeMaterialBuildState\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { BaseMathBlock } from \"./baseMathBlock\";\r\n\r\n/**\r\n * Block used to multiply 2 values\r\n */\r\nexport class MultiplyBlock extends BaseMathBlock {\r\n /**\r\n * Creates a new MultiplyBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"MultiplyBlock\";\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n state.compilationString += this._declareOutput(this.output, state) + ` = ${this.left.associatedVariableName} * ${this.right.associatedVariableName};\\n`;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.MultiplyBlock\", MultiplyBlock);\r\n", "/**\r\n * Enum used to define the material modes\r\n */\r\nexport enum NodeMaterialModes {\r\n /** Regular material */\r\n Material = 0,\r\n /** For post process */\r\n PostProcess = 1,\r\n /** For particle system */\r\n Particle = 2,\r\n /** For procedural texture */\r\n ProceduralTexture = 3,\r\n}\r\n", "import { MaterialDefines } from \"./materialDefines\";\r\n/**\r\n * Interface to follow in your material defines to integrate easily the\r\n * Image processing functions.\r\n * @internal\r\n */\r\nexport interface IImageProcessingConfigurationDefines {\r\n IMAGEPROCESSING: boolean;\r\n VIGNETTE: boolean;\r\n VIGNETTEBLENDMODEMULTIPLY: boolean;\r\n VIGNETTEBLENDMODEOPAQUE: boolean;\r\n TONEMAPPING: boolean;\r\n TONEMAPPING_ACES: boolean;\r\n CONTRAST: boolean;\r\n EXPOSURE: boolean;\r\n COLORCURVES: boolean;\r\n COLORGRADING: boolean;\r\n COLORGRADING3D: boolean;\r\n SAMPLER3DGREENDEPTH: boolean;\r\n SAMPLER3DBGRMAP: boolean;\r\n DITHER: boolean;\r\n IMAGEPROCESSINGPOSTPROCESS: boolean;\r\n SKIPFINALCOLORCLAMP: boolean;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ImageProcessingConfigurationDefines extends MaterialDefines implements IImageProcessingConfigurationDefines {\r\n public IMAGEPROCESSING = false;\r\n public VIGNETTE = false;\r\n public VIGNETTEBLENDMODEMULTIPLY = false;\r\n public VIGNETTEBLENDMODEOPAQUE = false;\r\n public TONEMAPPING = false;\r\n public TONEMAPPING_ACES = false;\r\n public CONTRAST = false;\r\n public COLORCURVES = false;\r\n public COLORGRADING = false;\r\n public COLORGRADING3D = false;\r\n public SAMPLER3DGREENDEPTH = false;\r\n public SAMPLER3DBGRMAP = false;\r\n public DITHER = false;\r\n public IMAGEPROCESSINGPOSTPROCESS = false;\r\n public EXPOSURE = false;\r\n public SKIPFINALCOLORCLAMP = false;\r\n\r\n constructor() {\r\n super();\r\n this.rebuild();\r\n }\r\n}\r\n", "/* eslint-disable import/no-internal-modules */\r\nimport type { Nullable } from \"../types\";\r\nimport { Vector2, Vector3 } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { ImageProcessingConfiguration } from \"../Materials/imageProcessingConfiguration\";\r\nimport { ImageProcessingConfigurationDefines } from \"../Materials/imageProcessingConfiguration.defines\";\r\nimport type { ColorGradient, FactorGradient, Color3Gradient, IValueGradient } from \"../Misc/gradients\";\r\nimport type { BoxParticleEmitter } from \"../Particles/EmitterTypes/boxParticleEmitter\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\n\r\nimport \"../Engines/Extensions/engine.dynamicBuffer\";\r\nimport type { IClipPlanesHolder } from \"../Misc/interfaces/iClipPlanesHolder\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport type { Animation } from \"../Animations/animation\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { ProceduralTexture } from \"../Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport type { IParticleEmitterType } from \"./EmitterTypes/IParticleEmitterType\";\r\nimport type { PointParticleEmitter } from \"./EmitterTypes/pointParticleEmitter\";\r\nimport type { HemisphericParticleEmitter } from \"./EmitterTypes/hemisphericParticleEmitter\";\r\nimport type { SphereDirectedParticleEmitter, SphereParticleEmitter } from \"./EmitterTypes/sphereParticleEmitter\";\r\nimport type { CylinderDirectedParticleEmitter, CylinderParticleEmitter } from \"./EmitterTypes/cylinderParticleEmitter\";\r\nimport type { ConeParticleEmitter } from \"./EmitterTypes/coneParticleEmitter\";\r\n\r\n/**\r\n * This represents the base class for particle system in Babylon.\r\n * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust.\r\n * Particles can take different shapes while emitted like box, sphere, cone or you can write your custom function.\r\n * @example https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro\r\n */\r\nexport class BaseParticleSystem implements IClipPlanesHolder {\r\n /**\r\n * Source color is added to the destination color without alpha affecting the result\r\n */\r\n public static BLENDMODE_ONEONE = 0;\r\n /**\r\n * Blend current color and particle color using particle’s alpha\r\n */\r\n public static BLENDMODE_STANDARD = 1;\r\n /**\r\n * Add current color and particle color multiplied by particle’s alpha\r\n */\r\n public static BLENDMODE_ADD = 2;\r\n /**\r\n * Multiply current color with particle color\r\n */\r\n public static BLENDMODE_MULTIPLY = 3;\r\n\r\n /**\r\n * Multiply current color with particle color then add current color and particle color multiplied by particle’s alpha\r\n */\r\n public static BLENDMODE_MULTIPLYADD = 4;\r\n\r\n /**\r\n * List of animations used by the particle system.\r\n */\r\n public animations: Animation[] = [];\r\n\r\n /**\r\n * Gets or sets the unique id of the particle system\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * The id of the Particle system.\r\n */\r\n public id: string;\r\n\r\n /**\r\n * The friendly name of the Particle system.\r\n */\r\n public name: string;\r\n\r\n /**\r\n * Snippet ID if the particle system was created from the snippet server\r\n */\r\n public snippetId: string;\r\n\r\n /**\r\n * The rendering group used by the Particle system to chose when to render.\r\n */\r\n public renderingGroupId = 0;\r\n\r\n /**\r\n * The emitter represents the Mesh or position we are attaching the particle system to.\r\n */\r\n public emitter: Nullable = Vector3.Zero();\r\n\r\n /**\r\n * The maximum number of particles to emit per frame\r\n */\r\n public emitRate = 10;\r\n\r\n /**\r\n * If you want to launch only a few particles at once, that can be done, as well.\r\n */\r\n public manualEmitCount = -1;\r\n\r\n /**\r\n * The overall motion speed (0.01 is default update speed, faster updates = faster animation)\r\n */\r\n public updateSpeed = 0.01;\r\n\r\n /**\r\n * The amount of time the particle system is running (depends of the overall update speed).\r\n */\r\n public targetStopDuration = 0;\r\n\r\n /**\r\n * Specifies whether the particle system will be disposed once it reaches the end of the animation.\r\n */\r\n public disposeOnStop = false;\r\n\r\n /**\r\n * Minimum power of emitting particles.\r\n */\r\n public minEmitPower = 1;\r\n /**\r\n * Maximum power of emitting particles.\r\n */\r\n public maxEmitPower = 1;\r\n\r\n /**\r\n * Minimum life time of emitting particles.\r\n */\r\n public minLifeTime = 1;\r\n /**\r\n * Maximum life time of emitting particles.\r\n */\r\n public maxLifeTime = 1;\r\n\r\n /**\r\n * Minimum Size of emitting particles.\r\n */\r\n public minSize = 1;\r\n /**\r\n * Maximum Size of emitting particles.\r\n */\r\n public maxSize = 1;\r\n\r\n /**\r\n * Minimum scale of emitting particles on X axis.\r\n */\r\n public minScaleX = 1;\r\n /**\r\n * Maximum scale of emitting particles on X axis.\r\n */\r\n public maxScaleX = 1;\r\n\r\n /**\r\n * Minimum scale of emitting particles on Y axis.\r\n */\r\n public minScaleY = 1;\r\n /**\r\n * Maximum scale of emitting particles on Y axis.\r\n */\r\n public maxScaleY = 1;\r\n\r\n /**\r\n * Gets or sets the minimal initial rotation in radians.\r\n */\r\n public minInitialRotation = 0;\r\n /**\r\n * Gets or sets the maximal initial rotation in radians.\r\n */\r\n public maxInitialRotation = 0;\r\n\r\n /**\r\n * Minimum angular speed of emitting particles (Z-axis rotation for each particle).\r\n */\r\n public minAngularSpeed = 0;\r\n /**\r\n * Maximum angular speed of emitting particles (Z-axis rotation for each particle).\r\n */\r\n public maxAngularSpeed = 0;\r\n\r\n /**\r\n * The texture used to render each particle. (this can be a spritesheet)\r\n */\r\n public particleTexture: Nullable;\r\n\r\n /**\r\n * The layer mask we are rendering the particles through.\r\n */\r\n public layerMask: number = 0x0fffffff;\r\n\r\n /**\r\n * This can help using your own shader to render the particle system.\r\n * The according effect will be created\r\n */\r\n public customShader: any = null;\r\n\r\n /**\r\n * By default particle system starts as soon as they are created. This prevents the\r\n * automatic start to happen and let you decide when to start emitting particles.\r\n */\r\n public preventAutoStart: boolean = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this particle system will allow fog to be rendered on it (false by default)\r\n */\r\n public applyFog = false;\r\n\r\n /** @internal */\r\n _wasDispatched = false;\r\n\r\n protected _rootUrl = \"\";\r\n private _noiseTexture: Nullable;\r\n\r\n /**\r\n * Gets or sets a texture used to add random noise to particle positions\r\n */\r\n public get noiseTexture(): Nullable {\r\n return this._noiseTexture;\r\n }\r\n\r\n public set noiseTexture(value: Nullable) {\r\n if (this._noiseTexture === value) {\r\n return;\r\n }\r\n\r\n this._noiseTexture = value;\r\n this._reset();\r\n }\r\n\r\n /** Gets or sets the strength to apply to the noise value (default is (10, 10, 10)) */\r\n public noiseStrength = new Vector3(10, 10, 10);\r\n\r\n /**\r\n * Callback triggered when the particle animation is ending.\r\n */\r\n public onAnimationEnd: Nullable<() => void> = null;\r\n\r\n /**\r\n * Blend mode use to render the particle, it can be either ParticleSystem.BLENDMODE_ONEONE or ParticleSystem.BLENDMODE_STANDARD.\r\n */\r\n public blendMode = BaseParticleSystem.BLENDMODE_ONEONE;\r\n\r\n /**\r\n * Forces the particle to write their depth information to the depth buffer. This can help preventing other draw calls\r\n * to override the particles.\r\n */\r\n public forceDepthWrite = false;\r\n\r\n /** Gets or sets a value indicating how many cycles (or frames) must be executed before first rendering (this value has to be set before starting the system). Default is 0 */\r\n public preWarmCycles = 0;\r\n\r\n /** Gets or sets a value indicating the time step multiplier to use in pre-warm mode (default is 1) */\r\n public preWarmStepOffset = 1;\r\n\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled) defines the speed of the sprite loop (default is 1 meaning the animation will play once during the entire particle lifetime)\r\n */\r\n public spriteCellChangeSpeed = 1;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled) defines the first sprite cell to display\r\n */\r\n public startSpriteCellID = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled) defines the last sprite cell to display\r\n */\r\n public endSpriteCellID = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled), defines the sprite cell width to use\r\n */\r\n public spriteCellWidth = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled), defines the sprite cell height to use\r\n */\r\n public spriteCellHeight = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled), defines wether the sprite animation is looping\r\n */\r\n public spriteCellLoop = true;\r\n /**\r\n * This allows the system to random pick the start cell ID between startSpriteCellID and endSpriteCellID\r\n */\r\n public spriteRandomStartCell = false;\r\n\r\n /** Gets or sets a Vector2 used to move the pivot (by default (0,0)) */\r\n public translationPivot = new Vector2(0, 0);\r\n\r\n /** @internal */\r\n public _isAnimationSheetEnabled: boolean;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that hosted animations (in the system.animations array) must be started when system.start() is called\r\n */\r\n public beginAnimationOnStart = false;\r\n\r\n /**\r\n * Gets or sets the frame to start the animation from when beginAnimationOnStart is true\r\n */\r\n public beginAnimationFrom = 0;\r\n\r\n /**\r\n * Gets or sets the frame to end the animation on when beginAnimationOnStart is true\r\n */\r\n public beginAnimationTo = 60;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if animations must loop when beginAnimationOnStart is true\r\n */\r\n public beginAnimationLoop = false;\r\n\r\n /**\r\n * Gets or sets a world offset applied to all particles\r\n */\r\n public worldOffset = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Gets or sets the active clipplane 1\r\n */\r\n public clipPlane: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 2\r\n */\r\n public clipPlane2: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 3\r\n */\r\n public clipPlane3: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 4\r\n */\r\n public clipPlane4: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 5\r\n */\r\n public clipPlane5: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 6\r\n */\r\n public clipPlane6: Nullable;\r\n\r\n /**\r\n * Gets or sets whether an animation sprite sheet is enabled or not on the particle system\r\n */\r\n public get isAnimationSheetEnabled(): boolean {\r\n return this._isAnimationSheetEnabled;\r\n }\r\n\r\n public set isAnimationSheetEnabled(value: boolean) {\r\n if (this._isAnimationSheetEnabled == value) {\r\n return;\r\n }\r\n\r\n this._isAnimationSheetEnabled = value;\r\n\r\n this._reset();\r\n }\r\n\r\n private _useLogarithmicDepth: boolean = false;\r\n\r\n /**\r\n * Gets or sets a boolean enabling the use of logarithmic depth buffers, which is good for wide depth buffers.\r\n */\r\n public get useLogarithmicDepth(): boolean {\r\n return this._useLogarithmicDepth;\r\n }\r\n\r\n public set useLogarithmicDepth(value: boolean) {\r\n this._useLogarithmicDepth = value && this.getScene()!.getEngine().getCaps().fragmentDepthSupported;\r\n }\r\n\r\n /**\r\n * Get hosting scene\r\n * @returns the scene\r\n */\r\n public getScene(): Nullable {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * You can use gravity if you want to give an orientation to your particles.\r\n */\r\n public gravity = Vector3.Zero();\r\n\r\n protected _colorGradients: Nullable> = null;\r\n protected _sizeGradients: Nullable> = null;\r\n protected _lifeTimeGradients: Nullable> = null;\r\n protected _angularSpeedGradients: Nullable> = null;\r\n protected _velocityGradients: Nullable> = null;\r\n protected _limitVelocityGradients: Nullable> = null;\r\n protected _dragGradients: Nullable> = null;\r\n protected _emitRateGradients: Nullable> = null;\r\n protected _startSizeGradients: Nullable> = null;\r\n protected _rampGradients: Nullable> = null;\r\n protected _colorRemapGradients: Nullable> = null;\r\n protected _alphaRemapGradients: Nullable> = null;\r\n\r\n protected _hasTargetStopDurationDependantGradient() {\r\n return (\r\n (this._startSizeGradients && this._startSizeGradients.length > 0) ||\r\n (this._emitRateGradients && this._emitRateGradients.length > 0) ||\r\n (this._lifeTimeGradients && this._lifeTimeGradients.length > 0)\r\n );\r\n }\r\n\r\n /**\r\n * Defines the delay in milliseconds before starting the system (0 by default)\r\n */\r\n public startDelay = 0;\r\n\r\n /**\r\n * Gets the current list of drag gradients.\r\n * You must use addDragGradient and removeDragGradient to update this list\r\n * @returns the list of drag gradients\r\n */\r\n public getDragGradients(): Nullable> {\r\n return this._dragGradients;\r\n }\r\n\r\n /** Gets or sets a value indicating the damping to apply if the limit velocity factor is reached */\r\n public limitVelocityDamping = 0.4;\r\n\r\n /**\r\n * Gets the current list of limit velocity gradients.\r\n * You must use addLimitVelocityGradient and removeLimitVelocityGradient to update this list\r\n * @returns the list of limit velocity gradients\r\n */\r\n public getLimitVelocityGradients(): Nullable> {\r\n return this._limitVelocityGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of color gradients.\r\n * You must use addColorGradient and removeColorGradient to update this list\r\n * @returns the list of color gradients\r\n */\r\n public getColorGradients(): Nullable> {\r\n return this._colorGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of size gradients.\r\n * You must use addSizeGradient and removeSizeGradient to update this list\r\n * @returns the list of size gradients\r\n */\r\n public getSizeGradients(): Nullable> {\r\n return this._sizeGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of color remap gradients.\r\n * You must use addColorRemapGradient and removeColorRemapGradient to update this list\r\n * @returns the list of color remap gradients\r\n */\r\n public getColorRemapGradients(): Nullable> {\r\n return this._colorRemapGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of alpha remap gradients.\r\n * You must use addAlphaRemapGradient and removeAlphaRemapGradient to update this list\r\n * @returns the list of alpha remap gradients\r\n */\r\n public getAlphaRemapGradients(): Nullable> {\r\n return this._alphaRemapGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of life time gradients.\r\n * You must use addLifeTimeGradient and removeLifeTimeGradient to update this list\r\n * @returns the list of life time gradients\r\n */\r\n public getLifeTimeGradients(): Nullable> {\r\n return this._lifeTimeGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of angular speed gradients.\r\n * You must use addAngularSpeedGradient and removeAngularSpeedGradient to update this list\r\n * @returns the list of angular speed gradients\r\n */\r\n public getAngularSpeedGradients(): Nullable> {\r\n return this._angularSpeedGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of velocity gradients.\r\n * You must use addVelocityGradient and removeVelocityGradient to update this list\r\n * @returns the list of velocity gradients\r\n */\r\n public getVelocityGradients(): Nullable> {\r\n return this._velocityGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of start size gradients.\r\n * You must use addStartSizeGradient and removeStartSizeGradient to update this list\r\n * @returns the list of start size gradients\r\n */\r\n public getStartSizeGradients(): Nullable> {\r\n return this._startSizeGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of emit rate gradients.\r\n * You must use addEmitRateGradient and removeEmitRateGradient to update this list\r\n * @returns the list of emit rate gradients\r\n */\r\n public getEmitRateGradients(): Nullable> {\r\n return this._emitRateGradients;\r\n }\r\n\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get direction1(): Vector3 {\r\n if ((this.particleEmitterType).direction1) {\r\n return (this.particleEmitterType).direction1;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set direction1(value: Vector3) {\r\n if ((this.particleEmitterType).direction1) {\r\n (this.particleEmitterType).direction1 = value;\r\n }\r\n }\r\n\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get direction2(): Vector3 {\r\n if ((this.particleEmitterType).direction2) {\r\n return (this.particleEmitterType).direction2;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set direction2(value: Vector3) {\r\n if ((this.particleEmitterType).direction2) {\r\n (this.particleEmitterType).direction2 = value;\r\n }\r\n }\r\n\r\n /**\r\n * Minimum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get minEmitBox(): Vector3 {\r\n if ((this.particleEmitterType).minEmitBox) {\r\n return (this.particleEmitterType).minEmitBox;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set minEmitBox(value: Vector3) {\r\n if ((this.particleEmitterType).minEmitBox) {\r\n (this.particleEmitterType).minEmitBox = value;\r\n }\r\n }\r\n\r\n /**\r\n * Maximum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get maxEmitBox(): Vector3 {\r\n if ((this.particleEmitterType).maxEmitBox) {\r\n return (this.particleEmitterType).maxEmitBox;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set maxEmitBox(value: Vector3) {\r\n if ((this.particleEmitterType).maxEmitBox) {\r\n (this.particleEmitterType).maxEmitBox = value;\r\n }\r\n }\r\n\r\n /**\r\n * Random color of each particle after it has been emitted, between color1 and color2 vectors\r\n */\r\n public color1 = new Color4(1.0, 1.0, 1.0, 1.0);\r\n /**\r\n * Random color of each particle after it has been emitted, between color1 and color2 vectors\r\n */\r\n public color2 = new Color4(1.0, 1.0, 1.0, 1.0);\r\n /**\r\n * Color the particle will have at the end of its lifetime\r\n */\r\n public colorDead = new Color4(0, 0, 0, 1.0);\r\n\r\n /**\r\n * An optional mask to filter some colors out of the texture, or filter a part of the alpha channel\r\n */\r\n public textureMask = new Color4(1.0, 1.0, 1.0, 1.0);\r\n\r\n /**\r\n * The particle emitter type defines the emitter used by the particle system.\r\n * It can be for example box, sphere, or cone...\r\n */\r\n public particleEmitterType: IParticleEmitterType;\r\n\r\n /** @internal */\r\n public _isSubEmitter = false;\r\n\r\n /** @internal */\r\n public _billboardMode = Constants.PARTICLES_BILLBOARDMODE_ALL;\r\n /**\r\n * Gets or sets the billboard mode to use when isBillboardBased = true.\r\n * Value can be: ParticleSystem.BILLBOARDMODE_ALL, ParticleSystem.BILLBOARDMODE_Y, ParticleSystem.BILLBOARDMODE_STRETCHED\r\n */\r\n public get billboardMode(): number {\r\n return this._billboardMode;\r\n }\r\n\r\n public set billboardMode(value: number) {\r\n if (this._billboardMode === value) {\r\n return;\r\n }\r\n\r\n this._billboardMode = value;\r\n this._reset();\r\n }\r\n\r\n /** @internal */\r\n public _isBillboardBased = true;\r\n /**\r\n * Gets or sets a boolean indicating if the particles must be rendered as billboard or aligned with the direction\r\n */\r\n public get isBillboardBased(): boolean {\r\n return this._isBillboardBased;\r\n }\r\n\r\n public set isBillboardBased(value: boolean) {\r\n if (this._isBillboardBased === value) {\r\n return;\r\n }\r\n\r\n this._isBillboardBased = value;\r\n this._reset();\r\n }\r\n\r\n /**\r\n * The scene the particle system belongs to.\r\n */\r\n protected _scene: Nullable;\r\n\r\n /**\r\n * The engine the particle system belongs to.\r\n */\r\n protected _engine: ThinEngine;\r\n\r\n /**\r\n * Local cache of defines for image processing.\r\n */\r\n protected _imageProcessingConfigurationDefines = new ImageProcessingConfigurationDefines();\r\n\r\n /**\r\n * Default configuration related to image processing available in the standard Material.\r\n */\r\n protected _imageProcessingConfiguration: Nullable;\r\n\r\n /**\r\n * Gets the image processing configuration used either in this material.\r\n */\r\n public get imageProcessingConfiguration(): Nullable {\r\n return this._imageProcessingConfiguration;\r\n }\r\n\r\n /**\r\n * Sets the Default image processing configuration used either in the this material.\r\n *\r\n * If sets to null, the scene one is in use.\r\n */\r\n public set imageProcessingConfiguration(value: Nullable) {\r\n this._attachImageProcessingConfiguration(value);\r\n }\r\n\r\n /**\r\n * Attaches a new image processing configuration to the Standard Material.\r\n * @param configuration\r\n */\r\n protected _attachImageProcessingConfiguration(configuration: Nullable): void {\r\n if (configuration === this._imageProcessingConfiguration) {\r\n return;\r\n }\r\n\r\n // Pick the scene configuration if needed.\r\n if (!configuration && this._scene) {\r\n this._imageProcessingConfiguration = this._scene.imageProcessingConfiguration;\r\n } else {\r\n this._imageProcessingConfiguration = configuration;\r\n }\r\n }\r\n\r\n /** @internal */\r\n protected _reset() {}\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _removeGradientAndTexture(gradient: number, gradients: Nullable, texture: Nullable): BaseParticleSystem {\r\n if (!gradients) {\r\n return this;\r\n }\r\n\r\n let index = 0;\r\n for (const valueGradient of gradients) {\r\n if (valueGradient.gradient === gradient) {\r\n gradients.splice(index, 1);\r\n break;\r\n }\r\n index++;\r\n }\r\n\r\n if (texture) {\r\n texture.dispose();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Instantiates a particle system.\r\n * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust.\r\n * @param name The name of the particle system\r\n */\r\n public constructor(name: string) {\r\n this.id = name;\r\n this.name = name;\r\n }\r\n\r\n /**\r\n * Creates a Point Emitter for the particle system (emits directly from the emitter position)\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the box\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the box\r\n */\r\n public createPointEmitter(direction1: Vector3, direction2: Vector3): PointParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Hemisphere Emitter for the particle system (emits along the hemisphere radius)\r\n * @param radius The radius of the hemisphere to emit from\r\n * @param radiusRange The range of the hemisphere to emit from [0-1] 0 Surface Only, 1 Entire Radius\r\n */\r\n public createHemisphericEmitter(radius = 1, radiusRange = 1): HemisphericParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Sphere Emitter for the particle system (emits along the sphere radius)\r\n * @param radius The radius of the sphere to emit from\r\n * @param radiusRange The range of the sphere to emit from [0-1] 0 Surface Only, 1 Entire Radius\r\n */\r\n public createSphereEmitter(radius = 1, radiusRange = 1): SphereParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Directed Sphere Emitter for the particle system (emits between direction1 and direction2)\r\n * @param radius The radius of the sphere to emit from\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the sphere\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the sphere\r\n */\r\n public createDirectedSphereEmitter(radius = 1, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)): SphereDirectedParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Cylinder Emitter for the particle system (emits from the cylinder to the particle position)\r\n * @param radius The radius of the emission cylinder\r\n * @param height The height of the emission cylinder\r\n * @param radiusRange The range of emission [0-1] 0 Surface only, 1 Entire Radius\r\n * @param directionRandomizer How much to randomize the particle direction [0-1]\r\n */\r\n public createCylinderEmitter(radius = 1, height = 1, radiusRange = 1, directionRandomizer = 0): CylinderParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Directed Cylinder Emitter for the particle system (emits between direction1 and direction2)\r\n * @param radius The radius of the cylinder to emit from\r\n * @param height The height of the emission cylinder\r\n * @param radiusRange the range of the emission cylinder [0-1] 0 Surface only, 1 Entire Radius (1 by default)\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the cylinder\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the cylinder\r\n */\r\n public createDirectedCylinderEmitter(\r\n radius = 1,\r\n height = 1,\r\n radiusRange = 1,\r\n direction1 = new Vector3(0, 1.0, 0),\r\n direction2 = new Vector3(0, 1.0, 0)\r\n ): CylinderDirectedParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Cone Emitter for the particle system (emits from the cone to the particle position)\r\n * @param radius The radius of the cone to emit from\r\n * @param angle The base angle of the cone\r\n */\r\n public createConeEmitter(radius = 1, angle = Math.PI / 4): ConeParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Box Emitter for the particle system. (emits between direction1 and direction2 from withing the box defined by minEmitBox and maxEmitBox)\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the box\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the box\r\n * @param minEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox\r\n * @param maxEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox\r\n */\r\n public createBoxEmitter(direction1: Vector3, direction2: Vector3, minEmitBox: Vector3, maxEmitBox: Vector3): BoxParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n}\r\n", "import { NodeMaterialBlock } from \"../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\n\r\n/**\r\n * Block used to expand a Color3/4 into 4 outputs (one for each component)\r\n */\r\nexport class ColorSplitterBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new ColorSplitterBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerInput(\"rgba\", NodeMaterialBlockConnectionPointTypes.Color4, true);\r\n this.registerInput(\"rgb \", NodeMaterialBlockConnectionPointTypes.Color3, true);\r\n\r\n this.registerOutput(\"rgb\", NodeMaterialBlockConnectionPointTypes.Color3);\r\n this.registerOutput(\"r\", NodeMaterialBlockConnectionPointTypes.Float);\r\n this.registerOutput(\"g\", NodeMaterialBlockConnectionPointTypes.Float);\r\n this.registerOutput(\"b\", NodeMaterialBlockConnectionPointTypes.Float);\r\n this.registerOutput(\"a\", NodeMaterialBlockConnectionPointTypes.Float);\r\n\r\n this.inputsAreExclusive = true;\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"ColorSplitterBlock\";\r\n }\r\n\r\n /**\r\n * Gets the rgba component (input)\r\n */\r\n public get rgba(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgb component (input)\r\n */\r\n public get rgbIn(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the rgb component (output)\r\n */\r\n public get rgbOut(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the r component (output)\r\n */\r\n public get r(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the g component (output)\r\n */\r\n public get g(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n /**\r\n * Gets the b component (output)\r\n */\r\n public get b(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n /**\r\n * Gets the a component (output)\r\n */\r\n public get a(): NodeMaterialConnectionPoint {\r\n return this._outputs[4];\r\n }\r\n\r\n protected _inputRename(name: string) {\r\n if (name === \"rgb \") {\r\n return \"rgbIn\";\r\n }\r\n return name;\r\n }\r\n\r\n protected _outputRename(name: string) {\r\n if (name === \"rgb\") {\r\n return \"rgbOut\";\r\n }\r\n return name;\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const input = this.rgba.isConnected ? this.rgba : this.rgbIn;\r\n\r\n if (!input.isConnected) {\r\n return;\r\n }\r\n\r\n const rgbOutput = this._outputs[0];\r\n const rOutput = this._outputs[1];\r\n const gOutput = this._outputs[2];\r\n const bOutput = this._outputs[3];\r\n const aOutput = this._outputs[4];\r\n\r\n if (rgbOutput.hasEndpoints) {\r\n state.compilationString += this._declareOutput(rgbOutput, state) + ` = ${input.associatedVariableName}.rgb;\\n`;\r\n }\r\n if (rOutput.hasEndpoints) {\r\n state.compilationString += this._declareOutput(rOutput, state) + ` = ${input.associatedVariableName}.r;\\n`;\r\n }\r\n if (gOutput.hasEndpoints) {\r\n state.compilationString += this._declareOutput(gOutput, state) + ` = ${input.associatedVariableName}.g;\\n`;\r\n }\r\n if (bOutput.hasEndpoints) {\r\n state.compilationString += this._declareOutput(bOutput, state) + ` = ${input.associatedVariableName}.b;\\n`;\r\n }\r\n if (aOutput.hasEndpoints) {\r\n state.compilationString += this._declareOutput(aOutput, state) + ` = ${input.associatedVariableName}.a;\\n`;\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ColorSplitterBlock\", ColorSplitterBlock);\r\n", "import type { Nullable } from \"../types\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Effect } from \"./effect\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { DrawWrapper } from \"./drawWrapper\";\r\nimport type { IRenderTargetTexture, RenderTargetWrapper } from \"../Engines/renderTargetWrapper\";\r\nimport type { ShaderLanguage } from \"./shaderLanguage\";\r\n\r\n// Prevents ES6 Crash if not imported.\r\nimport \"../Shaders/postprocess.vertex\";\r\n\r\n/**\r\n * Effect Render Options\r\n */\r\nexport interface IEffectRendererOptions {\r\n /**\r\n * Defines the vertices positions.\r\n */\r\n positions?: number[];\r\n /**\r\n * Defines the indices.\r\n */\r\n indices?: number[];\r\n}\r\n\r\n// Fullscreen quad buffers by default.\r\nconst defaultOptions = {\r\n positions: [1, 1, -1, 1, -1, -1, 1, -1],\r\n indices: [0, 1, 2, 0, 2, 3],\r\n};\r\n\r\n/**\r\n * Helper class to render one or more effects.\r\n * You can access the previous rendering in your shader by declaring a sampler named textureSampler\r\n */\r\nexport class EffectRenderer {\r\n /**\r\n * The engine the effect renderer has been created for.\r\n */\r\n public readonly engine: ThinEngine;\r\n\r\n private _vertexBuffers: { [key: string]: VertexBuffer };\r\n private _indexBuffer: DataBuffer;\r\n\r\n private _fullscreenViewport = new Viewport(0, 0, 1, 1);\r\n private _onContextRestoredObserver: Nullable>;\r\n\r\n private _savedStateDepthTest: boolean;\r\n private _savedStateStencilTest: boolean;\r\n\r\n /**\r\n * Creates an effect renderer\r\n * @param engine the engine to use for rendering\r\n * @param options defines the options of the effect renderer\r\n */\r\n constructor(engine: ThinEngine, options: IEffectRendererOptions = defaultOptions) {\r\n const positions = options.positions ?? defaultOptions.positions;\r\n const indices = options.indices ?? defaultOptions.indices;\r\n\r\n this.engine = engine;\r\n this._vertexBuffers = {\r\n [VertexBuffer.PositionKind]: new VertexBuffer(engine, positions, VertexBuffer.PositionKind, false, false, 2),\r\n };\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n\r\n this._onContextRestoredObserver = engine.onContextRestoredObservable.add(() => {\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n\r\n for (const key in this._vertexBuffers) {\r\n const vertexBuffer = this._vertexBuffers[key];\r\n vertexBuffer._rebuild();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the current viewport in normalized coordinates 0-1\r\n * @param viewport Defines the viewport to set (defaults to 0 0 1 1)\r\n */\r\n public setViewport(viewport = this._fullscreenViewport): void {\r\n this.engine.setViewport(viewport);\r\n }\r\n\r\n /**\r\n * Binds the embedded attributes buffer to the effect.\r\n * @param effect Defines the effect to bind the attributes for\r\n */\r\n public bindBuffers(effect: Effect): void {\r\n this.engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n\r\n /**\r\n * Sets the current effect wrapper to use during draw.\r\n * The effect needs to be ready before calling this api.\r\n * This also sets the default full screen position attribute.\r\n * @param effectWrapper Defines the effect to draw with\r\n */\r\n public applyEffectWrapper(effectWrapper: EffectWrapper): void {\r\n this.engine.setState(true);\r\n this.engine.depthCullingState.depthTest = false;\r\n this.engine.stencilState.stencilTest = false;\r\n this.engine.enableEffect(effectWrapper._drawWrapper);\r\n this.bindBuffers(effectWrapper.effect);\r\n effectWrapper.onApplyObservable.notifyObservers({});\r\n }\r\n\r\n /**\r\n * Saves engine states\r\n */\r\n public saveStates(): void {\r\n this._savedStateDepthTest = this.engine.depthCullingState.depthTest;\r\n this._savedStateStencilTest = this.engine.stencilState.stencilTest;\r\n }\r\n\r\n /**\r\n * Restores engine states\r\n */\r\n public restoreStates(): void {\r\n this.engine.depthCullingState.depthTest = this._savedStateDepthTest;\r\n this.engine.stencilState.stencilTest = this._savedStateStencilTest;\r\n }\r\n\r\n /**\r\n * Draws a full screen quad.\r\n */\r\n public draw(): void {\r\n this.engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, 6);\r\n }\r\n\r\n private _isRenderTargetTexture(texture: RenderTargetWrapper | IRenderTargetTexture): texture is IRenderTargetTexture {\r\n return (texture as IRenderTargetTexture).renderTarget !== undefined;\r\n }\r\n\r\n /**\r\n * renders one or more effects to a specified texture\r\n * @param effectWrapper the effect to renderer\r\n * @param outputTexture texture to draw to, if null it will render to the screen.\r\n */\r\n public render(effectWrapper: EffectWrapper, outputTexture: Nullable = null) {\r\n // Ensure effect is ready\r\n if (!effectWrapper.effect.isReady()) {\r\n return;\r\n }\r\n\r\n this.saveStates();\r\n\r\n // Reset state\r\n this.setViewport();\r\n\r\n const out = outputTexture === null ? null : this._isRenderTargetTexture(outputTexture) ? outputTexture.renderTarget! : outputTexture;\r\n\r\n if (out) {\r\n this.engine.bindFramebuffer(out);\r\n }\r\n\r\n this.applyEffectWrapper(effectWrapper);\r\n\r\n this.draw();\r\n\r\n if (out) {\r\n this.engine.unBindFramebuffer(out);\r\n }\r\n\r\n this.restoreStates();\r\n }\r\n\r\n /**\r\n * Disposes of the effect renderer\r\n */\r\n dispose() {\r\n const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vertexBuffer) {\r\n vertexBuffer.dispose();\r\n delete this._vertexBuffers[VertexBuffer.PositionKind];\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this.engine._releaseBuffer(this._indexBuffer);\r\n }\r\n\r\n if (this._onContextRestoredObserver) {\r\n this.engine.onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Options to create an EffectWrapper\r\n */\r\ninterface EffectWrapperCreationOptions {\r\n /**\r\n * Engine to use to create the effect\r\n */\r\n engine: ThinEngine;\r\n /**\r\n * Fragment shader for the effect\r\n */\r\n fragmentShader: string;\r\n /**\r\n * Use the shader store instead of direct source code\r\n */\r\n useShaderStore?: boolean;\r\n /**\r\n * Vertex shader for the effect\r\n */\r\n vertexShader?: string;\r\n /**\r\n * Attributes to use in the shader\r\n */\r\n attributeNames?: Array;\r\n /**\r\n * Uniforms to use in the shader\r\n */\r\n uniformNames?: Array;\r\n /**\r\n * Texture sampler names to use in the shader\r\n */\r\n samplerNames?: Array;\r\n /**\r\n * Defines to use in the shader\r\n */\r\n defines?: Array;\r\n /**\r\n * Callback when effect is compiled\r\n */\r\n onCompiled?: Nullable<(effect: Effect) => void>;\r\n /**\r\n * The friendly name of the effect displayed in Spector.\r\n */\r\n name?: string;\r\n /**\r\n * The language the shader is written in (default: GLSL)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n}\r\n\r\n/**\r\n * Wraps an effect to be used for rendering\r\n */\r\nexport class EffectWrapper {\r\n /**\r\n * Event that is fired right before the effect is drawn (should be used to update uniforms)\r\n */\r\n public onApplyObservable = new Observable<{}>();\r\n /**\r\n * The underlying effect\r\n */\r\n public get effect(): Effect {\r\n return this._drawWrapper.effect!;\r\n }\r\n\r\n public set effect(effect: Effect) {\r\n this._drawWrapper.effect = effect;\r\n }\r\n\r\n /** @internal */\r\n public _drawWrapper: DrawWrapper;\r\n\r\n private _onContextRestoredObserver: Nullable>;\r\n\r\n /**\r\n * Creates an effect to be renderer\r\n * @param creationOptions options to create the effect\r\n */\r\n constructor(creationOptions: EffectWrapperCreationOptions) {\r\n let effectCreationOptions: any;\r\n const uniformNames = creationOptions.uniformNames || [];\r\n\r\n if (creationOptions.vertexShader) {\r\n effectCreationOptions = {\r\n fragmentSource: creationOptions.fragmentShader,\r\n vertexSource: creationOptions.vertexShader,\r\n spectorName: creationOptions.name || \"effectWrapper\",\r\n };\r\n } else {\r\n // Default scale to use in post process vertex shader.\r\n uniformNames.push(\"scale\");\r\n\r\n effectCreationOptions = {\r\n fragmentSource: creationOptions.fragmentShader,\r\n vertex: \"postprocess\",\r\n spectorName: creationOptions.name || \"effectWrapper\",\r\n };\r\n\r\n // Sets the default scale to identity for the post process vertex shader.\r\n this.onApplyObservable.add(() => {\r\n this.effect.setFloat2(\"scale\", 1, 1);\r\n });\r\n }\r\n\r\n const defines = creationOptions.defines ? creationOptions.defines.join(\"\\n\") : \"\";\r\n this._drawWrapper = new DrawWrapper(creationOptions.engine);\r\n\r\n if (creationOptions.useShaderStore) {\r\n effectCreationOptions.fragment = effectCreationOptions.fragmentSource;\r\n if (!effectCreationOptions.vertex) {\r\n effectCreationOptions.vertex = effectCreationOptions.vertexSource;\r\n }\r\n\r\n delete effectCreationOptions.fragmentSource;\r\n delete effectCreationOptions.vertexSource;\r\n\r\n this.effect = creationOptions.engine.createEffect(\r\n effectCreationOptions,\r\n creationOptions.attributeNames || [\"position\"],\r\n uniformNames,\r\n creationOptions.samplerNames,\r\n defines,\r\n undefined,\r\n creationOptions.onCompiled,\r\n undefined,\r\n undefined,\r\n creationOptions.shaderLanguage\r\n );\r\n } else {\r\n this.effect = new Effect(\r\n effectCreationOptions,\r\n creationOptions.attributeNames || [\"position\"],\r\n uniformNames,\r\n creationOptions.samplerNames,\r\n creationOptions.engine,\r\n defines,\r\n undefined,\r\n creationOptions.onCompiled,\r\n undefined,\r\n undefined,\r\n undefined,\r\n creationOptions.shaderLanguage\r\n );\r\n\r\n this._onContextRestoredObserver = creationOptions.engine.onContextRestoredObservable.add(() => {\r\n this.effect._pipelineContext = null; // because _prepareEffect will try to dispose this pipeline before recreating it and that would lead to webgl errors\r\n this.effect._prepareEffect();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the effect wrapper\r\n */\r\n public dispose() {\r\n if (this._onContextRestoredObserver) {\r\n this.effect.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n this.effect.dispose();\r\n }\r\n}\r\n", "// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"passPixelShader\";\nconst shader = `varying vec2 vUV;uniform sampler2D textureSampler;\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) \n{gl_FragColor=texture2D(textureSampler,vUV);}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const passPixelShader = { name, shader };\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { _WarnImport } from \"./devTools\";\r\nimport type { Engine } from \"../Engines/engine\";\r\n\r\nimport { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { EffectRenderer, EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { Tools } from \"./tools\";\r\nimport type { Nullable } from \"../types\";\r\n\r\nimport { passPixelShader } from \"../Shaders/pass.fragment\";\r\nimport { Scalar } from \"../Maths/math.scalar\";\r\n\r\ntype DumpToolsEngine = {\r\n canvas: HTMLCanvasElement | OffscreenCanvas;\r\n engine: ThinEngine;\r\n renderer: EffectRenderer;\r\n wrapper: EffectWrapper;\r\n};\r\n\r\n/**\r\n * Class containing a set of static utilities functions to dump data from a canvas\r\n */\r\nexport class DumpTools {\r\n private static _DumpToolsEngine: Nullable;\r\n\r\n private static _CreateDumpRenderer(): DumpToolsEngine {\r\n if (!DumpTools._DumpToolsEngine) {\r\n let canvas: HTMLCanvasElement | OffscreenCanvas;\r\n let engine: Nullable = null;\r\n const options = {\r\n preserveDrawingBuffer: true,\r\n depth: false,\r\n stencil: false,\r\n alpha: true,\r\n premultipliedAlpha: false,\r\n antialias: false,\r\n failIfMajorPerformanceCaveat: false,\r\n };\r\n try {\r\n canvas = new OffscreenCanvas(100, 100); // will be resized later\r\n engine = new ThinEngine(canvas, false, options);\r\n } catch (e) {\r\n // The browser either does not support OffscreenCanvas or WebGL context in OffscreenCanvas, fallback on a regular canvas\r\n canvas = document.createElement(\"canvas\");\r\n engine = new ThinEngine(canvas, false, options);\r\n }\r\n engine.getCaps().parallelShaderCompile = undefined;\r\n const renderer = new EffectRenderer(engine);\r\n const wrapper = new EffectWrapper({\r\n engine,\r\n name: passPixelShader.name,\r\n fragmentShader: passPixelShader.shader,\r\n samplerNames: [\"textureSampler\"],\r\n });\r\n DumpTools._DumpToolsEngine = {\r\n canvas,\r\n engine,\r\n renderer,\r\n wrapper,\r\n };\r\n }\r\n return DumpTools._DumpToolsEngine!;\r\n }\r\n\r\n /**\r\n * Dumps the current bound framebuffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param engine defines the hosting engine\r\n * @param successCallback defines the callback triggered once the data are available\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns a void promise\r\n */\r\n public static async DumpFramebuffer(\r\n width: number,\r\n height: number,\r\n engine: Engine,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n quality?: number\r\n ) {\r\n // Read the contents of the framebuffer\r\n const bufferView = await engine.readPixels(0, 0, width, height);\r\n\r\n const data = new Uint8Array(bufferView.buffer);\r\n\r\n DumpTools.DumpData(width, height, data, successCallback as (data: string | ArrayBuffer) => void, mimeType, fileName, true, undefined, quality);\r\n }\r\n\r\n /**\r\n * Dumps an array buffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param data the data array\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param invertY true to invert the picture in the Y dimension\r\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns a promise that resolve to the final data\r\n */\r\n public static DumpDataAsync(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n invertY = false,\r\n toArrayBuffer = false,\r\n quality?: number\r\n ): Promise {\r\n return new Promise((resolve) => {\r\n DumpTools.DumpData(width, height, data, (result) => resolve(result), mimeType, fileName, invertY, toArrayBuffer, quality);\r\n });\r\n }\r\n\r\n /**\r\n * Dumps an array buffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param data the data array\r\n * @param successCallback defines the callback triggered once the data are available\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param invertY true to invert the picture in the Y dimension\r\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n public static DumpData(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n successCallback?: (data: string | ArrayBuffer) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n invertY = false,\r\n toArrayBuffer = false,\r\n quality?: number\r\n ) {\r\n const renderer = DumpTools._CreateDumpRenderer();\r\n renderer.engine.setSize(width, height, true);\r\n\r\n // Convert if data are float32\r\n if (data instanceof Float32Array) {\r\n const data2 = new Uint8Array(data.length);\r\n let n = data.length;\r\n while (n--) {\r\n const v = data[n];\r\n data2[n] = Math.round(Scalar.Clamp(v) * 255);\r\n }\r\n data = data2;\r\n }\r\n\r\n // Create the image\r\n const texture = renderer.engine.createRawTexture(data, width, height, Constants.TEXTUREFORMAT_RGBA, false, !invertY, Constants.TEXTURE_NEAREST_NEAREST);\r\n\r\n renderer.renderer.setViewport();\r\n renderer.renderer.applyEffectWrapper(renderer.wrapper);\r\n renderer.wrapper.effect._bindTexture(\"textureSampler\", texture);\r\n renderer.renderer.draw();\r\n\r\n if (toArrayBuffer) {\r\n Tools.ToBlob(\r\n renderer.canvas,\r\n (blob) => {\r\n const fileReader = new FileReader();\r\n fileReader.onload = (event: any) => {\r\n const arrayBuffer = event.target!.result as ArrayBuffer;\r\n if (successCallback) {\r\n successCallback(arrayBuffer);\r\n }\r\n };\r\n fileReader.readAsArrayBuffer(blob!);\r\n },\r\n mimeType,\r\n quality\r\n );\r\n } else {\r\n Tools.EncodeScreenshotCanvasData(renderer.canvas, successCallback, mimeType, fileName, quality);\r\n }\r\n\r\n texture.dispose();\r\n }\r\n\r\n /**\r\n * Dispose the dump tools associated resources\r\n */\r\n public static Dispose() {\r\n if (DumpTools._DumpToolsEngine) {\r\n DumpTools._DumpToolsEngine.wrapper.dispose();\r\n DumpTools._DumpToolsEngine.renderer.dispose();\r\n DumpTools._DumpToolsEngine.engine.dispose();\r\n }\r\n DumpTools._DumpToolsEngine = null;\r\n }\r\n}\r\n\r\n/**\r\n * This will be executed automatically for UMD and es5.\r\n * If esm dev wants the side effects to execute they will have to run it manually\r\n * Once we build native modules those need to be exported.\r\n * @internal\r\n */\r\nconst initSideEffects = () => {\r\n // References the dependencies.\r\n Tools.DumpData = DumpTools.DumpData;\r\n Tools.DumpDataAsync = DumpTools.DumpDataAsync;\r\n Tools.DumpFramebuffer = DumpTools.DumpFramebuffer;\r\n};\r\n\r\ninitSideEffects();\r\n", "import { InternalTexture, InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { Constants } from \"../constants\";\r\nimport { ThinEngine } from \"../thinEngine\";\r\nimport type { RenderTargetWrapper } from \"../renderTargetWrapper\";\r\nimport type { WebGLRenderTargetWrapper } from \"../WebGL/webGLRenderTargetWrapper\";\r\nimport type { RenderTargetCreationOptions } from \"../../Materials/Textures/textureCreationOptions\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Creates a new render target cube wrapper\r\n * @param size defines the size of the texture\r\n * @param options defines the options used to create the texture\r\n * @returns a new render target cube wrapper\r\n */\r\n createRenderTargetCubeTexture(size: number, options?: RenderTargetCreationOptions): RenderTargetWrapper;\r\n }\r\n}\r\n\r\nThinEngine.prototype.createRenderTargetCubeTexture = function (size: number, options?: RenderTargetCreationOptions): RenderTargetWrapper {\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(false, true, size) as WebGLRenderTargetWrapper;\r\n\r\n const fullOptions = {\r\n generateMipMaps: true,\r\n generateDepthBuffer: true,\r\n generateStencilBuffer: false,\r\n type: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n samplingMode: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n ...options,\r\n };\r\n fullOptions.generateStencilBuffer = fullOptions.generateDepthBuffer && fullOptions.generateStencilBuffer;\r\n\r\n if (fullOptions.type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloatLinearFiltering) {\r\n // if floating point linear (gl.FLOAT) then force to NEAREST_SAMPLINGMODE\r\n fullOptions.samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n } else if (fullOptions.type === Constants.TEXTURETYPE_HALF_FLOAT && !this._caps.textureHalfFloatLinearFiltering) {\r\n // if floating point linear (HALF_FLOAT) then force to NEAREST_SAMPLINGMODE\r\n fullOptions.samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n }\r\n const gl = this._gl;\r\n\r\n const texture = new InternalTexture(this, InternalTextureSource.RenderTarget);\r\n this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, texture, true);\r\n\r\n const filters = this._getSamplingParameters(fullOptions.samplingMode, fullOptions.generateMipMaps);\r\n\r\n if (fullOptions.type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloat) {\r\n fullOptions.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n Logger.Warn(\"Float textures are not supported. Cube render target forced to TEXTURETYPE_UNESIGNED_BYTE type\");\r\n }\r\n\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, filters.mag);\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, filters.min);\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n\r\n for (let face = 0; face < 6; face++) {\r\n gl.texImage2D(\r\n gl.TEXTURE_CUBE_MAP_POSITIVE_X + face,\r\n 0,\r\n this._getRGBABufferInternalSizedFormat(fullOptions.type, fullOptions.format),\r\n size,\r\n size,\r\n 0,\r\n this._getInternalFormat(fullOptions.format),\r\n this._getWebGLTextureType(fullOptions.type),\r\n null\r\n );\r\n }\r\n\r\n // Create the framebuffer\r\n const framebuffer = gl.createFramebuffer();\r\n this._bindUnboundFramebuffer(framebuffer);\r\n\r\n rtWrapper._depthStencilBuffer = this._setupFramebufferDepthAttachments(fullOptions.generateStencilBuffer, fullOptions.generateDepthBuffer, size, size);\r\n\r\n // MipMaps\r\n if (fullOptions.generateMipMaps) {\r\n gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\r\n }\r\n\r\n // Unbind\r\n this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, null);\r\n this._bindUnboundFramebuffer(null);\r\n\r\n rtWrapper._framebuffer = framebuffer;\r\n rtWrapper._generateDepthBuffer = fullOptions.generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = fullOptions.generateStencilBuffer;\r\n\r\n texture.width = size;\r\n texture.height = size;\r\n texture.isReady = true;\r\n texture.isCube = true;\r\n texture.samples = 1;\r\n texture.generateMipMaps = fullOptions.generateMipMaps;\r\n texture.samplingMode = fullOptions.samplingMode;\r\n texture.type = fullOptions.type;\r\n texture.format = fullOptions.format;\r\n\r\n this._internalTexturesCache.push(texture);\r\n rtWrapper.setTextures(texture);\r\n\r\n return rtWrapper;\r\n};\r\n", "import type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { SmartArray } from \"../../Misc/smartArray\";\r\nimport type { Nullable, Immutable } from \"../../types\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { Color4 } from \"../../Maths/math.color\";\r\nimport type { RenderTargetCreationOptions, TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { PostProcessManager } from \"../../PostProcesses/postProcessManager\";\r\nimport type { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport { RenderingManager } from \"../../Rendering/renderingManager\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { IRenderTargetTexture, RenderTargetWrapper } from \"../../Engines/renderTargetWrapper\";\r\n\r\nimport \"../../Engines/Extensions/engine.renderTarget\";\r\nimport \"../../Engines/Extensions/engine.renderTargetCube\";\r\nimport { Engine } from \"../../Engines/engine\";\r\nimport { _ObserveArray } from \"../../Misc/arrayTools\";\r\nimport { DumpTools } from \"../../Misc/dumpTools\";\r\n\r\nimport type { Material } from \"../material\";\r\n\r\n/**\r\n * Options for the RenderTargetTexture constructor\r\n */\r\nexport interface RenderTargetTextureOptions {\r\n /** True (default: false) if mipmaps need to be generated after render */\r\n generateMipMaps?: boolean;\r\n\r\n /** True (default) to not change the aspect ratio of the scene in the RTT */\r\n doNotChangeAspectRatio?: boolean;\r\n\r\n /** The type of the buffer in the RTT (byte (default), half float, float...) */\r\n type?: number;\r\n\r\n /** True (default: false) if a cube texture needs to be created */\r\n isCube?: boolean;\r\n\r\n /** The sampling mode to be used with the render target (Trilinear (default), Linear, Nearest...) */\r\n samplingMode?: number;\r\n\r\n /** True (default) to generate a depth buffer */\r\n generateDepthBuffer?: boolean;\r\n\r\n /** True (default: false) to generate a stencil buffer */\r\n generateStencilBuffer?: boolean;\r\n\r\n /** True (default: false) if multiple textures need to be created (Draw Buffers) */\r\n isMulti?: boolean;\r\n\r\n /** The internal format of the buffer in the RTT (RED, RG, RGB, RGBA (default), ALPHA...) */\r\n format?: number;\r\n\r\n /** True (default: false) if the texture allocation should be delayed */\r\n delayAllocation?: boolean;\r\n\r\n /** Sample count to use when creating the RTT */\r\n samples?: number;\r\n\r\n /** specific flags to use when creating the texture (e.g., Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures) */\r\n creationFlags?: number;\r\n\r\n /** True (default: false) to indicate that no color target should be created. (e.g., if you only want to write to the depth buffer) */\r\n noColorAttachment?: boolean;\r\n\r\n /** Specifies the internal texture to use directly instead of creating one (ignores `noColorAttachment` flag when set) **/\r\n colorAttachment?: InternalTexture;\r\n\r\n /** True (default: false) to create a SRGB texture */\r\n useSRGBBuffer?: boolean;\r\n\r\n /** Defines the underlying texture texture space */\r\n gammaSpace?: boolean;\r\n}\r\n\r\n/**\r\n * This Helps creating a texture that will be created from a camera in your scene.\r\n * It is basically a dynamic texture that could be used to create special effects for instance.\r\n * Actually, It is the base of lot of effects in the framework like post process, shadows, effect layers and rendering pipelines...\r\n */\r\nexport class RenderTargetTexture extends Texture implements IRenderTargetTexture {\r\n /**\r\n * The texture will only be rendered once which can be useful to improve performance if everything in your render is static for instance.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONCE: number = 0;\r\n /**\r\n * The texture will only be rendered rendered every frame and is recommended for dynamic contents.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONEVERYFRAME: number = 1;\r\n /**\r\n * The texture will be rendered every 2 frames which could be enough if your dynamic objects are not\r\n * the central point of your effect and can save a lot of performances.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONEVERYTWOFRAMES: number = 2;\r\n\r\n /**\r\n * Use this predicate to dynamically define the list of mesh you want to render.\r\n * If set, the renderList property will be overwritten.\r\n */\r\n public renderListPredicate: (AbstractMesh: AbstractMesh) => boolean;\r\n\r\n private _renderList: Nullable>;\r\n private _unObserveRenderList: Nullable<() => void> = null;\r\n\r\n /**\r\n * Use this list to define the list of mesh you want to render.\r\n */\r\n public get renderList(): Nullable> {\r\n return this._renderList;\r\n }\r\n\r\n public set renderList(value: Nullable>) {\r\n if (this._unObserveRenderList) {\r\n this._unObserveRenderList();\r\n this._unObserveRenderList = null;\r\n }\r\n\r\n if (value) {\r\n this._unObserveRenderList = _ObserveArray(value, this._renderListHasChanged);\r\n }\r\n\r\n this._renderList = value;\r\n }\r\n\r\n private _renderListHasChanged = (_functionName: String, previousLength: number) => {\r\n const newLength = this._renderList ? this._renderList.length : 0;\r\n if ((previousLength === 0 && newLength > 0) || newLength === 0) {\r\n this.getScene()?.meshes.forEach((mesh) => {\r\n mesh._markSubMeshesAsLightDirty();\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Use this function to overload the renderList array at rendering time.\r\n * Return null to render with the current renderList, else return the list of meshes to use for rendering.\r\n * For 2DArray RTT, layerOrFace is the index of the layer that is going to be rendered, else it is the faceIndex of\r\n * the cube (if the RTT is a cube, else layerOrFace=0).\r\n * The renderList passed to the function is the current render list (the one that will be used if the function returns null).\r\n * The length of this list is passed through renderListLength: don't use renderList.length directly because the array can\r\n * hold dummy elements!\r\n */\r\n public getCustomRenderList: (layerOrFace: number, renderList: Nullable>>, renderListLength: number) => Nullable>;\r\n\r\n /**\r\n * Define if particles should be rendered in your texture.\r\n */\r\n public renderParticles = true;\r\n /**\r\n * Define if sprites should be rendered in your texture.\r\n */\r\n public renderSprites = false;\r\n\r\n /**\r\n * Force checking the layerMask property even if a custom list of meshes is provided (ie. if renderList is not undefined)\r\n */\r\n public forceLayerMaskCheck = false;\r\n\r\n /**\r\n * Define the camera used to render the texture.\r\n */\r\n public activeCamera: Nullable;\r\n /**\r\n * Override the mesh isReady function with your own one.\r\n */\r\n public customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number, preWarm?: boolean) => boolean;\r\n /**\r\n * Override the render function of the texture with your own one.\r\n */\r\n public customRenderFunction: (\r\n opaqueSubMeshes: SmartArray,\r\n alphaTestSubMeshes: SmartArray,\r\n transparentSubMeshes: SmartArray,\r\n depthOnlySubMeshes: SmartArray,\r\n beforeTransparents?: () => void\r\n ) => void;\r\n /**\r\n * Define if camera post processes should be use while rendering the texture.\r\n */\r\n public useCameraPostProcesses: boolean;\r\n /**\r\n * Define if the camera viewport should be respected while rendering the texture or if the render should be done to the entire texture.\r\n */\r\n public ignoreCameraViewport: boolean = false;\r\n\r\n private _postProcessManager: Nullable;\r\n\r\n /**\r\n * Post-processes for this render target\r\n */\r\n public get postProcesses() {\r\n return this._postProcesses;\r\n }\r\n private _postProcesses: PostProcess[];\r\n private _resizeObserver: Nullable>;\r\n\r\n private get _prePassEnabled() {\r\n return !!this._prePassRenderTarget && this._prePassRenderTarget.enabled;\r\n }\r\n\r\n /**\r\n * An event triggered when the texture is unbind.\r\n */\r\n public onBeforeBindObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when the texture is unbind.\r\n */\r\n public onAfterUnbindObservable = new Observable();\r\n\r\n private _onAfterUnbindObserver: Nullable>;\r\n /**\r\n * Set a after unbind callback in the texture.\r\n * This has been kept for backward compatibility and use of onAfterUnbindObservable is recommended.\r\n */\r\n public set onAfterUnbind(callback: () => void) {\r\n if (this._onAfterUnbindObserver) {\r\n this.onAfterUnbindObservable.remove(this._onAfterUnbindObserver);\r\n }\r\n this._onAfterUnbindObserver = this.onAfterUnbindObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered before rendering the texture\r\n */\r\n public onBeforeRenderObservable = new Observable();\r\n\r\n private _onBeforeRenderObserver: Nullable>;\r\n /**\r\n * Set a before render callback in the texture.\r\n * This has been kept for backward compatibility and use of onBeforeRenderObservable is recommended.\r\n */\r\n public set onBeforeRender(callback: (faceIndex: number) => void) {\r\n if (this._onBeforeRenderObserver) {\r\n this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n }\r\n this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered after rendering the texture\r\n */\r\n public onAfterRenderObservable = new Observable();\r\n\r\n private _onAfterRenderObserver: Nullable>;\r\n /**\r\n * Set a after render callback in the texture.\r\n * This has been kept for backward compatibility and use of onAfterRenderObservable is recommended.\r\n */\r\n public set onAfterRender(callback: (faceIndex: number) => void) {\r\n if (this._onAfterRenderObserver) {\r\n this.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n }\r\n this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered after the texture clear\r\n */\r\n public onClearObservable = new Observable();\r\n\r\n private _onClearObserver: Nullable>;\r\n /**\r\n * Set a clear callback in the texture.\r\n * This has been kept for backward compatibility and use of onClearObservable is recommended.\r\n */\r\n public set onClear(callback: (Engine: Engine) => void) {\r\n if (this._onClearObserver) {\r\n this.onClearObservable.remove(this._onClearObserver);\r\n }\r\n this._onClearObserver = this.onClearObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the texture is resized.\r\n */\r\n public onResizeObservable = new Observable();\r\n\r\n /**\r\n * Define the clear color of the Render Target if it should be different from the scene.\r\n */\r\n public clearColor: Color4;\r\n protected _size: TextureSize;\r\n protected _initialSizeParameter: TextureSize | { ratio: number };\r\n protected _sizeRatio: Nullable;\r\n /** @internal */\r\n public _generateMipMaps: boolean;\r\n /** @internal */\r\n public _cleared = false;\r\n /**\r\n * Skip the initial clear of the rtt at the beginning of the frame render loop\r\n */\r\n public skipInitialClear = false;\r\n protected _renderingManager: RenderingManager;\r\n /** @internal */\r\n public _waitingRenderList?: string[];\r\n protected _doNotChangeAspectRatio: boolean;\r\n protected _currentRefreshId = -1;\r\n protected _refreshRate = 1;\r\n protected _textureMatrix: Matrix;\r\n protected _samples = 1;\r\n protected _renderTargetOptions: RenderTargetCreationOptions;\r\n private _canRescale = true;\r\n protected _renderTarget: Nullable = null;\r\n /**\r\n * Current render pass id of the render target texture. Note it can change over the rendering as there's a separate id for each face of a cube / each layer of an array layer!\r\n */\r\n public renderPassId: number;\r\n private _renderPassIds: number[];\r\n /**\r\n * Gets the render pass ids used by the render target texture. For a single render target the array length will be 1, for a cube texture it will be 6 and for\r\n * a 2D texture array it will return an array of ids the size of the 2D texture array\r\n */\r\n public get renderPassIds(): readonly number[] {\r\n return this._renderPassIds;\r\n }\r\n\r\n /**\r\n * Gets the current value of the refreshId counter\r\n */\r\n public get currentRefreshId() {\r\n return this._currentRefreshId;\r\n }\r\n\r\n /**\r\n * Sets a specific material to be used to render a mesh/a list of meshes in this render target texture\r\n * @param mesh mesh or array of meshes\r\n * @param material material or array of materials to use for this render pass. If undefined is passed, no specific material will be used but the regular material instead (mesh.material). It's possible to provide an array of materials to use a different material for each rendering in the case of a cube texture (6 rendering) and a 2D texture array (as many rendering as the length of the array)\r\n */\r\n public setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material | Material[]): void {\r\n let meshes;\r\n if (!Array.isArray(mesh)) {\r\n meshes = [mesh];\r\n } else {\r\n meshes = mesh;\r\n }\r\n for (let j = 0; j < meshes.length; ++j) {\r\n for (let i = 0; i < this._renderPassIds.length; ++i) {\r\n meshes[j].setMaterialForRenderPass(this._renderPassIds[i], material !== undefined ? (Array.isArray(material) ? material[i] : material) : undefined);\r\n }\r\n }\r\n }\r\n\r\n private _isCubeData: boolean;\r\n\r\n /**\r\n * Define if the texture has multiple draw buffers or if false a single draw buffer.\r\n */\r\n public get isMulti(): boolean {\r\n return this._renderTarget?.isMulti ?? false;\r\n }\r\n\r\n /**\r\n * Gets render target creation options that were used.\r\n */\r\n public get renderTargetOptions(): RenderTargetCreationOptions {\r\n return this._renderTargetOptions;\r\n }\r\n\r\n /**\r\n * Gets the render target wrapper associated with this render target\r\n */\r\n public get renderTarget(): Nullable {\r\n return this._renderTarget;\r\n }\r\n\r\n protected _onRatioRescale(): void {\r\n if (this._sizeRatio) {\r\n this.resize(this._initialSizeParameter);\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the center of the bounding box associated with the texture (when in cube mode)\r\n * It must define where the camera used to render the texture is set\r\n */\r\n public boundingBoxPosition = Vector3.Zero();\r\n\r\n private _boundingBoxSize: Vector3;\r\n\r\n /**\r\n * Gets or sets the size of the bounding box associated with the texture (when in cube mode)\r\n * When defined, the cubemap will switch to local mode\r\n * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity\r\n * @example https://www.babylonjs-playground.com/#RNASML\r\n */\r\n public set boundingBoxSize(value: Vector3) {\r\n if (this._boundingBoxSize && this._boundingBoxSize.equals(value)) {\r\n return;\r\n }\r\n this._boundingBoxSize = value;\r\n const scene = this.getScene();\r\n if (scene) {\r\n scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n }\r\n public get boundingBoxSize(): Vector3 {\r\n return this._boundingBoxSize;\r\n }\r\n\r\n /**\r\n * In case the RTT has been created with a depth texture, get the associated\r\n * depth texture.\r\n * Otherwise, return null.\r\n */\r\n public get depthStencilTexture(): Nullable {\r\n return this._renderTarget?._depthStencilTexture ?? null;\r\n }\r\n\r\n /**\r\n * Instantiate a render target texture. This is mainly used to render of screen the scene to for instance apply post process\r\n * or used a shadow, depth texture...\r\n * @param name The friendly name of the texture\r\n * @param size The size of the RTT (number if square, or {width: number, height:number} or {ratio:} to define a ratio from the main scene)\r\n * @param scene The scene the RTT belongs to. Default is the last created scene.\r\n * @param options The options for creating the render target texture.\r\n */\r\n constructor(name: string, size: TextureSize | { ratio: number }, scene?: Nullable, options?: RenderTargetTextureOptions);\r\n\r\n /**\r\n * Instantiate a render target texture. This is mainly used to render of screen the scene to for instance apply post process\r\n * or used a shadow, depth texture...\r\n * @param name The friendly name of the texture\r\n * @param size The size of the RTT (number if square, or {width: number, height:number} or {ratio:} to define a ratio from the main scene)\r\n * @param scene The scene the RTT belongs to. Default is the last created scene\r\n * @param generateMipMaps True (default: false) if mipmaps need to be generated after render\r\n * @param doNotChangeAspectRatio True (default) to not change the aspect ratio of the scene in the RTT\r\n * @param type The type of the buffer in the RTT (byte (default), half float, float...)\r\n * @param isCube True (default: false) if a cube texture needs to be created\r\n * @param samplingMode The sampling mode to be used with the render target (Trilinear (default), Linear, Nearest...)\r\n * @param generateDepthBuffer True (default) to generate a depth buffer\r\n * @param generateStencilBuffer True (default: false) to generate a stencil buffer\r\n * @param isMulti True (default: false) if multiple textures need to be created (Draw Buffers)\r\n * @param format The internal format of the buffer in the RTT (RED, RG, RGB, RGBA (default), ALPHA...)\r\n * @param delayAllocation True (default: false) if the texture allocation should be delayed\r\n * @param samples Sample count to use when creating the RTT\r\n * @param creationFlags specific flags to use when creating the texture (e.g., Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures)\r\n * @param noColorAttachment True (default: false) to indicate that no color target should be created. (e.g., if you only want to write to the depth buffer)\r\n * @param useSRGBBuffer True (default: false) to create a SRGB texture\r\n */\r\n constructor(\r\n name: string,\r\n size: TextureSize | { ratio: number },\r\n scene?: Nullable,\r\n generateMipMaps?: boolean,\r\n doNotChangeAspectRatio?: boolean,\r\n type?: number,\r\n isCube?: boolean,\r\n samplingMode?: number,\r\n generateDepthBuffer?: boolean,\r\n generateStencilBuffer?: boolean,\r\n isMulti?: boolean,\r\n format?: number,\r\n delayAllocation?: boolean,\r\n samples?: number,\r\n creationFlags?: number,\r\n noColorAttachment?: boolean,\r\n useSRGBBuffer?: boolean\r\n );\r\n\r\n /** @internal */\r\n constructor(\r\n name: string,\r\n size: TextureSize | { ratio: number },\r\n scene?: Nullable,\r\n generateMipMaps: boolean | RenderTargetTextureOptions = false,\r\n doNotChangeAspectRatio: boolean = true,\r\n type: number = Constants.TEXTURETYPE_UNSIGNED_INT,\r\n isCube = false,\r\n samplingMode = Texture.TRILINEAR_SAMPLINGMODE,\r\n generateDepthBuffer = true,\r\n generateStencilBuffer = false,\r\n isMulti = false,\r\n format = Constants.TEXTUREFORMAT_RGBA,\r\n delayAllocation = false,\r\n samples?: number,\r\n creationFlags?: number,\r\n noColorAttachment = false,\r\n useSRGBBuffer = false\r\n ) {\r\n let colorAttachment: InternalTexture | undefined = undefined;\r\n let gammaSpace = true;\r\n if (typeof generateMipMaps === \"object\") {\r\n const options = generateMipMaps;\r\n generateMipMaps = !!options.generateMipMaps;\r\n doNotChangeAspectRatio = options.doNotChangeAspectRatio ?? true;\r\n type = options.type ?? Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n isCube = !!options.isCube;\r\n samplingMode = options.samplingMode ?? Texture.TRILINEAR_SAMPLINGMODE;\r\n generateDepthBuffer = options.generateDepthBuffer ?? true;\r\n generateStencilBuffer = !!options.generateStencilBuffer;\r\n isMulti = !!options.isMulti;\r\n format = options.format ?? Constants.TEXTUREFORMAT_RGBA;\r\n delayAllocation = !!options.delayAllocation;\r\n samples = options.samples;\r\n creationFlags = options.creationFlags;\r\n noColorAttachment = !!options.noColorAttachment;\r\n useSRGBBuffer = !!options.useSRGBBuffer;\r\n colorAttachment = options.colorAttachment;\r\n gammaSpace = options.gammaSpace ?? gammaSpace;\r\n }\r\n\r\n super(null, scene, !generateMipMaps, undefined, samplingMode, undefined, undefined, undefined, undefined, format);\r\n\r\n scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n const engine = this.getScene()!.getEngine();\r\n\r\n this._gammaSpace = gammaSpace;\r\n this._coordinatesMode = Texture.PROJECTION_MODE;\r\n this.renderList = [] as AbstractMesh[];\r\n this.name = name;\r\n this.isRenderTarget = true;\r\n this._initialSizeParameter = size;\r\n this._renderPassIds = [];\r\n this._isCubeData = isCube;\r\n\r\n this._processSizeParameter(size);\r\n\r\n this.renderPassId = this._renderPassIds[0];\r\n\r\n this._resizeObserver = engine.onResizeObservable.add(() => {});\r\n\r\n this._generateMipMaps = generateMipMaps ? true : false;\r\n this._doNotChangeAspectRatio = doNotChangeAspectRatio;\r\n\r\n // Rendering groups\r\n this._renderingManager = new RenderingManager(scene);\r\n this._renderingManager._useSceneAutoClearSetup = true;\r\n\r\n if (isMulti) {\r\n return;\r\n }\r\n\r\n this._renderTargetOptions = {\r\n generateMipMaps: generateMipMaps,\r\n type: type,\r\n format: this._format ?? undefined,\r\n samplingMode: this.samplingMode,\r\n generateDepthBuffer: generateDepthBuffer,\r\n generateStencilBuffer: generateStencilBuffer,\r\n samples,\r\n creationFlags,\r\n noColorAttachment: noColorAttachment,\r\n useSRGBBuffer,\r\n colorAttachment: colorAttachment,\r\n label: this.name,\r\n };\r\n\r\n if (this.samplingMode === Texture.NEAREST_SAMPLINGMODE) {\r\n this.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n this.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n }\r\n\r\n if (!delayAllocation) {\r\n if (isCube) {\r\n this._renderTarget = scene.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions);\r\n this.coordinatesMode = Texture.INVCUBIC_MODE;\r\n this._textureMatrix = Matrix.Identity();\r\n } else {\r\n this._renderTarget = scene.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions);\r\n }\r\n this._texture = this._renderTarget.texture;\r\n if (samples !== undefined) {\r\n this.samples = samples;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a depth stencil texture.\r\n * This is only available in WebGL 2 or with the depth texture extension available.\r\n * @param comparisonFunction Specifies the comparison function to set on the texture. If 0 or undefined, the texture is not in comparison mode (default: 0)\r\n * @param bilinearFiltering Specifies whether or not bilinear filtering is enable on the texture (default: true)\r\n * @param generateStencil Specifies whether or not a stencil should be allocated in the texture (default: false)\r\n * @param samples sample count of the depth/stencil texture (default: 1)\r\n * @param format format of the depth texture (default: Constants.TEXTUREFORMAT_DEPTH32_FLOAT)\r\n */\r\n public createDepthStencilTexture(\r\n comparisonFunction: number = 0,\r\n bilinearFiltering: boolean = true,\r\n generateStencil: boolean = false,\r\n samples: number = 1,\r\n format: number = Constants.TEXTUREFORMAT_DEPTH32_FLOAT\r\n ): void {\r\n this._renderTarget?.createDepthStencilTexture(comparisonFunction, bilinearFiltering, generateStencil, samples, format);\r\n }\r\n\r\n private _releaseRenderPassId(): void {\r\n if (this._scene) {\r\n const engine = this._scene.getEngine();\r\n for (let i = 0; i < this._renderPassIds.length; ++i) {\r\n engine.releaseRenderPassId(this._renderPassIds[i]);\r\n }\r\n }\r\n this._renderPassIds = [];\r\n }\r\n\r\n private _createRenderPassId(): void {\r\n this._releaseRenderPassId();\r\n\r\n const engine = this._scene!.getEngine(); // scene can't be null in a RenderTargetTexture, see constructor\r\n const numPasses = this._isCubeData ? 6 : this.getRenderLayers() || 1;\r\n\r\n for (let i = 0; i < numPasses; ++i) {\r\n this._renderPassIds[i] = engine.createRenderPassId(`RenderTargetTexture - ${this.name}#${i}`);\r\n }\r\n }\r\n\r\n protected _processSizeParameter(size: TextureSize | { ratio: number }, createRenderPassIds = true): void {\r\n if ((<{ ratio: number }>size).ratio) {\r\n this._sizeRatio = (<{ ratio: number }>size).ratio;\r\n const engine = this._getEngine()!;\r\n this._size = {\r\n width: this._bestReflectionRenderTargetDimension(engine.getRenderWidth(), this._sizeRatio),\r\n height: this._bestReflectionRenderTargetDimension(engine.getRenderHeight(), this._sizeRatio),\r\n };\r\n } else {\r\n this._size = size;\r\n }\r\n\r\n if (createRenderPassIds) {\r\n this._createRenderPassId();\r\n }\r\n }\r\n\r\n /**\r\n * Define the number of samples to use in case of MSAA.\r\n * It defaults to one meaning no MSAA has been enabled.\r\n */\r\n public get samples(): number {\r\n return this._renderTarget?.samples ?? this._samples;\r\n }\r\n\r\n public set samples(value: number) {\r\n if (this._renderTarget) {\r\n this._samples = this._renderTarget.setSamples(value);\r\n }\r\n }\r\n\r\n /**\r\n * Resets the refresh counter of the texture and start bak from scratch.\r\n * Could be useful to regenerate the texture if it is setup to render only once.\r\n */\r\n public resetRefreshCounter(): void {\r\n this._currentRefreshId = -1;\r\n }\r\n\r\n /**\r\n * Define the refresh rate of the texture or the rendering frequency.\r\n * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...\r\n */\r\n public get refreshRate(): number {\r\n return this._refreshRate;\r\n }\r\n public set refreshRate(value: number) {\r\n this._refreshRate = value;\r\n this.resetRefreshCounter();\r\n }\r\n\r\n /**\r\n * Adds a post process to the render target rendering passes.\r\n * @param postProcess define the post process to add\r\n */\r\n public addPostProcess(postProcess: PostProcess): void {\r\n if (!this._postProcessManager) {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n this._postProcessManager = new PostProcessManager(scene);\r\n this._postProcesses = new Array();\r\n }\r\n\r\n this._postProcesses.push(postProcess);\r\n this._postProcesses[0].autoClear = false;\r\n }\r\n\r\n /**\r\n * Clear all the post processes attached to the render target\r\n * @param dispose define if the cleared post processes should also be disposed (false by default)\r\n */\r\n public clearPostProcesses(dispose: boolean = false): void {\r\n if (!this._postProcesses) {\r\n return;\r\n }\r\n\r\n if (dispose) {\r\n for (const postProcess of this._postProcesses) {\r\n postProcess.dispose();\r\n }\r\n }\r\n\r\n this._postProcesses = [];\r\n }\r\n\r\n /**\r\n * Remove one of the post process from the list of attached post processes to the texture\r\n * @param postProcess define the post process to remove from the list\r\n */\r\n public removePostProcess(postProcess: PostProcess): void {\r\n if (!this._postProcesses) {\r\n return;\r\n }\r\n\r\n const index = this._postProcesses.indexOf(postProcess);\r\n\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n this._postProcesses.splice(index, 1);\r\n\r\n if (this._postProcesses.length > 0) {\r\n this._postProcesses[0].autoClear = false;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _shouldRender(): boolean {\r\n if (this._currentRefreshId === -1) {\r\n // At least render once\r\n this._currentRefreshId = 1;\r\n return true;\r\n }\r\n\r\n if (this.refreshRate === this._currentRefreshId) {\r\n this._currentRefreshId = 1;\r\n return true;\r\n }\r\n\r\n this._currentRefreshId++;\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets the actual render size of the texture.\r\n * @returns the width of the render size\r\n */\r\n public getRenderSize(): number {\r\n return this.getRenderWidth();\r\n }\r\n\r\n /**\r\n * Gets the actual render width of the texture.\r\n * @returns the width of the render size\r\n */\r\n public getRenderWidth(): number {\r\n if ((<{ width: number; height: number }>this._size).width) {\r\n return (<{ width: number; height: number }>this._size).width;\r\n }\r\n\r\n return this._size;\r\n }\r\n\r\n /**\r\n * Gets the actual render height of the texture.\r\n * @returns the height of the render size\r\n */\r\n public getRenderHeight(): number {\r\n if ((<{ width: number; height: number }>this._size).width) {\r\n return (<{ width: number; height: number }>this._size).height;\r\n }\r\n\r\n return this._size;\r\n }\r\n\r\n /**\r\n * Gets the actual number of layers of the texture or, in the case of a 3D texture, return the depth.\r\n * @returns the number of layers\r\n */\r\n public getRenderLayers(): number {\r\n const layers = (<{ width: number; height: number; depth?: number; layers?: number }>this._size).layers;\r\n if (layers) {\r\n return layers;\r\n }\r\n const depth = (<{ width: number; height: number; depth?: number; layers?: number }>this._size).depth;\r\n if (depth) {\r\n return depth;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Don't allow this render target texture to rescale. Mainly used to prevent rescaling by the scene optimizer.\r\n */\r\n public disableRescaling() {\r\n this._canRescale = false;\r\n }\r\n\r\n /**\r\n * Get if the texture can be rescaled or not.\r\n */\r\n public get canRescale(): boolean {\r\n return this._canRescale;\r\n }\r\n\r\n /**\r\n * Resize the texture using a ratio.\r\n * @param ratio the ratio to apply to the texture size in order to compute the new target size\r\n */\r\n public scale(ratio: number): void {\r\n const newSize = Math.max(1, this.getRenderSize() * ratio);\r\n\r\n this.resize(newSize);\r\n }\r\n\r\n /**\r\n * Get the texture reflection matrix used to rotate/transform the reflection.\r\n * @returns the reflection matrix\r\n */\r\n public getReflectionTextureMatrix(): Matrix {\r\n if (this.isCube) {\r\n return this._textureMatrix;\r\n }\r\n\r\n return super.getReflectionTextureMatrix();\r\n }\r\n\r\n /**\r\n * Resize the texture to a new desired size.\r\n * Be careful as it will recreate all the data in the new texture.\r\n * @param size Define the new size. It can be:\r\n * - a number for squared texture,\r\n * - an object containing { width: number, height: number }\r\n * - or an object containing a ratio { ratio: number }\r\n */\r\n public resize(size: TextureSize | { ratio: number }): void {\r\n const wasCube = this.isCube;\r\n\r\n this._renderTarget?.dispose();\r\n this._renderTarget = null;\r\n\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n this._processSizeParameter(size, false);\r\n\r\n if (wasCube) {\r\n this._renderTarget = scene.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions);\r\n } else {\r\n this._renderTarget = scene.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions);\r\n }\r\n this._texture = this._renderTarget.texture;\r\n\r\n if (this._renderTargetOptions.samples !== undefined) {\r\n this.samples = this._renderTargetOptions.samples;\r\n }\r\n\r\n if (this.onResizeObservable.hasObservers()) {\r\n this.onResizeObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n private _defaultRenderListPrepared: boolean;\r\n\r\n /**\r\n * Renders all the objects from the render list into the texture.\r\n * @param useCameraPostProcess Define if camera post processes should be used during the rendering\r\n * @param dumpForDebug Define if the rendering result should be dumped (copied) for debugging purpose\r\n */\r\n public render(useCameraPostProcess: boolean = false, dumpForDebug: boolean = false): void {\r\n this._render(useCameraPostProcess, dumpForDebug);\r\n }\r\n\r\n /**\r\n * This function will check if the render target texture can be rendered (textures are loaded, shaders are compiled)\r\n * @returns true if all required resources are ready\r\n */\r\n public isReadyForRendering(): boolean {\r\n return this._render(false, false, true);\r\n }\r\n\r\n private _render(useCameraPostProcess: boolean = false, dumpForDebug: boolean = false, checkReadiness: boolean = false): boolean {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return checkReadiness;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (this.useCameraPostProcesses !== undefined) {\r\n useCameraPostProcess = this.useCameraPostProcesses;\r\n }\r\n\r\n if (this._waitingRenderList) {\r\n if (!this.renderListPredicate) {\r\n this.renderList = [];\r\n for (let index = 0; index < this._waitingRenderList.length; index++) {\r\n const id = this._waitingRenderList[index];\r\n const mesh = scene.getMeshById(id);\r\n if (mesh) {\r\n this.renderList.push(mesh);\r\n }\r\n }\r\n }\r\n this._waitingRenderList = undefined;\r\n }\r\n\r\n // Is predicate defined?\r\n if (this.renderListPredicate) {\r\n if (this.renderList) {\r\n this.renderList.length = 0; // Clear previous renderList\r\n } else {\r\n this.renderList = [];\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return checkReadiness;\r\n }\r\n\r\n const sceneMeshes = scene.meshes;\r\n\r\n for (let index = 0; index < sceneMeshes.length; index++) {\r\n const mesh = sceneMeshes[index];\r\n if (this.renderListPredicate(mesh)) {\r\n this.renderList.push(mesh);\r\n }\r\n }\r\n }\r\n\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n\r\n this.onBeforeBindObservable.notifyObservers(this);\r\n\r\n // Set custom projection.\r\n // Needs to be before binding to prevent changing the aspect ratio.\r\n const camera: Nullable = this.activeCamera ?? scene.activeCamera;\r\n const sceneCamera = scene.activeCamera;\r\n\r\n if (camera) {\r\n if (camera !== scene.activeCamera) {\r\n scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(true));\r\n scene.activeCamera = camera;\r\n }\r\n engine.setViewport(camera.rigParent ? camera.rigParent.viewport : camera.viewport, this.getRenderWidth(), this.getRenderHeight());\r\n }\r\n\r\n this._defaultRenderListPrepared = false;\r\n\r\n let returnValue = checkReadiness;\r\n\r\n if (!checkReadiness) {\r\n if ((this.is2DArray || this.is3D) && !this.isMulti) {\r\n for (let layer = 0; layer < this.getRenderLayers(); layer++) {\r\n this._renderToTarget(0, useCameraPostProcess, dumpForDebug, layer, camera);\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n }\r\n } else if (this.isCube && !this.isMulti) {\r\n for (let face = 0; face < 6; face++) {\r\n this._renderToTarget(face, useCameraPostProcess, dumpForDebug, undefined, camera);\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n }\r\n } else {\r\n this._renderToTarget(0, useCameraPostProcess, dumpForDebug, undefined, camera);\r\n }\r\n } else {\r\n if (!scene.getViewMatrix()) {\r\n // We probably didn't execute scene.render() yet, so make sure we have a view/projection matrix setup for the scene\r\n scene.updateTransformMatrix();\r\n }\r\n const numLayers = this.is2DArray || this.is3D ? this.getRenderLayers() : this.isCube ? 6 : 1;\r\n for (let layer = 0; layer < numLayers && returnValue; layer++) {\r\n let currentRenderList: Nullable> = null;\r\n const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data;\r\n const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length;\r\n\r\n engine.currentRenderPassId = this._renderPassIds[layer];\r\n\r\n this.onBeforeRenderObservable.notifyObservers(layer);\r\n\r\n if (this.getCustomRenderList) {\r\n currentRenderList = this.getCustomRenderList(layer, defaultRenderList, defaultRenderListLength);\r\n }\r\n\r\n if (!currentRenderList) {\r\n currentRenderList = defaultRenderList;\r\n }\r\n\r\n if (!this._doNotChangeAspectRatio) {\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n for (let i = 0; i < currentRenderList.length && returnValue; ++i) {\r\n const mesh = currentRenderList[i];\r\n\r\n if (!mesh.isEnabled() || mesh.isBlocked || !mesh.isVisible || !mesh.subMeshes) {\r\n continue;\r\n }\r\n\r\n if (this.customIsReadyFunction) {\r\n if (!this.customIsReadyFunction(mesh, this.refreshRate, checkReadiness)) {\r\n returnValue = false;\r\n continue;\r\n }\r\n } else if (!mesh.isReady(true)) {\r\n returnValue = false;\r\n continue;\r\n }\r\n }\r\n\r\n this.onAfterRenderObservable.notifyObservers(layer);\r\n\r\n if (this.is2DArray || this.is3D || this.isCube) {\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n }\r\n }\r\n }\r\n\r\n this.onAfterUnbindObservable.notifyObservers(this);\r\n\r\n engine.currentRenderPassId = currentRenderPassId;\r\n\r\n if (sceneCamera) {\r\n scene.activeCamera = sceneCamera;\r\n if (this.activeCamera && this.activeCamera !== scene.activeCamera) {\r\n scene.setTransformMatrix(scene.activeCamera.getViewMatrix(), scene.activeCamera.getProjectionMatrix(true));\r\n }\r\n engine.setViewport(scene.activeCamera.viewport);\r\n }\r\n\r\n scene.resetCachedMaterial();\r\n\r\n return returnValue;\r\n }\r\n\r\n private _bestReflectionRenderTargetDimension(renderDimension: number, scale: number): number {\r\n const minimum = 128;\r\n const x = renderDimension * scale;\r\n const curved = Engine.NearestPOT(x + (minimum * minimum) / (minimum + x));\r\n\r\n // Ensure we don't exceed the render dimension (while staying POT)\r\n return Math.min(Engine.FloorPOT(renderDimension), curved);\r\n }\r\n\r\n private _prepareRenderingManager(currentRenderList: Array, currentRenderListLength: number, camera: Nullable, checkLayerMask: boolean): void {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n this._renderingManager.reset();\r\n\r\n const sceneRenderId = scene.getRenderId();\r\n for (let meshIndex = 0; meshIndex < currentRenderListLength; meshIndex++) {\r\n const mesh = currentRenderList[meshIndex];\r\n\r\n if (mesh && !mesh.isBlocked) {\r\n if (this.customIsReadyFunction) {\r\n if (!this.customIsReadyFunction(mesh, this.refreshRate, false)) {\r\n this.resetRefreshCounter();\r\n continue;\r\n }\r\n } else if (!mesh.isReady(this.refreshRate === 0)) {\r\n this.resetRefreshCounter();\r\n continue;\r\n }\r\n\r\n if (!mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate && scene.activeCamera) {\r\n mesh._internalAbstractMeshDataInfo._currentLOD = scene.customLODSelector\r\n ? scene.customLODSelector(mesh, this.activeCamera || scene.activeCamera)\r\n : mesh.getLOD(this.activeCamera || scene.activeCamera);\r\n mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate = true;\r\n }\r\n if (!mesh._internalAbstractMeshDataInfo._currentLOD) {\r\n continue;\r\n }\r\n\r\n let meshToRender = mesh._internalAbstractMeshDataInfo._currentLOD;\r\n\r\n meshToRender._preActivateForIntermediateRendering(sceneRenderId);\r\n\r\n let isMasked;\r\n if (checkLayerMask && camera) {\r\n isMasked = (mesh.layerMask & camera.layerMask) === 0;\r\n } else {\r\n isMasked = false;\r\n }\r\n\r\n if (mesh.isEnabled() && mesh.isVisible && mesh.subMeshes && !isMasked) {\r\n if (meshToRender !== mesh) {\r\n meshToRender._activate(sceneRenderId, true);\r\n }\r\n if (mesh._activate(sceneRenderId, true) && mesh.subMeshes.length) {\r\n if (!mesh.isAnInstance) {\r\n meshToRender._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = false;\r\n } else {\r\n if (mesh._internalAbstractMeshDataInfo._actAsRegularMesh) {\r\n meshToRender = mesh;\r\n }\r\n }\r\n meshToRender._internalAbstractMeshDataInfo._isActiveIntermediate = true;\r\n\r\n for (let subIndex = 0; subIndex < meshToRender.subMeshes.length; subIndex++) {\r\n const subMesh = meshToRender.subMeshes[subIndex];\r\n this._renderingManager.dispatch(subMesh, meshToRender);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (let particleIndex = 0; particleIndex < scene.particleSystems.length; particleIndex++) {\r\n const particleSystem = scene.particleSystems[particleIndex];\r\n\r\n const emitter: any = particleSystem.emitter;\r\n\r\n if (!particleSystem.isStarted() || !emitter || (emitter.position && !emitter.isEnabled())) {\r\n continue;\r\n }\r\n\r\n this._renderingManager.dispatchParticles(particleSystem);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * @param faceIndex face index to bind to if this is a cubetexture\r\n * @param layer defines the index of the texture to bind in the array\r\n */\r\n public _bindFrameBuffer(faceIndex: number = 0, layer = 0) {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n if (this._renderTarget) {\r\n engine.bindFramebuffer(this._renderTarget, this.isCube ? faceIndex : undefined, undefined, undefined, this.ignoreCameraViewport, 0, layer);\r\n }\r\n }\r\n\r\n protected _unbindFrameBuffer(engine: Engine, faceIndex: number): void {\r\n if (!this._renderTarget) {\r\n return;\r\n }\r\n engine.unBindFramebuffer(this._renderTarget, this.isCube, () => {\r\n this.onAfterRenderObservable.notifyObservers(faceIndex);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _prepareFrame(scene: Scene, faceIndex?: number, layer?: number, useCameraPostProcess?: boolean) {\r\n if (this._postProcessManager) {\r\n if (!this._prePassEnabled) {\r\n this._postProcessManager._prepareFrame(this._texture, this._postProcesses);\r\n }\r\n } else if (!useCameraPostProcess || !scene.postProcessManager._prepareFrame(this._texture)) {\r\n this._bindFrameBuffer(faceIndex, layer);\r\n }\r\n }\r\n\r\n private _renderToTarget(faceIndex: number, useCameraPostProcess: boolean, dumpForDebug: boolean, layer = 0, camera: Nullable = null): void {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n engine._debugPushGroup?.(`render to face #${faceIndex} layer #${layer}`, 1);\r\n\r\n // Bind\r\n this._prepareFrame(scene, faceIndex, layer, useCameraPostProcess);\r\n\r\n if (this.is2DArray || this.is3D) {\r\n engine.currentRenderPassId = this._renderPassIds[layer];\r\n this.onBeforeRenderObservable.notifyObservers(layer);\r\n } else {\r\n engine.currentRenderPassId = this._renderPassIds[faceIndex];\r\n this.onBeforeRenderObservable.notifyObservers(faceIndex);\r\n }\r\n\r\n const fastPath = engine.snapshotRendering && engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST;\r\n\r\n if (!fastPath) {\r\n // Get the list of meshes to render\r\n let currentRenderList: Nullable> = null;\r\n const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data;\r\n const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length;\r\n\r\n if (this.getCustomRenderList) {\r\n currentRenderList = this.getCustomRenderList(this.is2DArray || this.is3D ? layer : faceIndex, defaultRenderList, defaultRenderListLength);\r\n }\r\n\r\n if (!currentRenderList) {\r\n // No custom render list provided, we prepare the rendering for the default list, but check\r\n // first if we did not already performed the preparation before so as to avoid re-doing it several times\r\n if (!this._defaultRenderListPrepared) {\r\n this._prepareRenderingManager(defaultRenderList, defaultRenderListLength, camera, !this.renderList || this.forceLayerMaskCheck);\r\n this._defaultRenderListPrepared = true;\r\n }\r\n currentRenderList = defaultRenderList;\r\n } else {\r\n // Prepare the rendering for the custom render list provided\r\n this._prepareRenderingManager(currentRenderList, currentRenderList.length, camera, this.forceLayerMaskCheck);\r\n }\r\n\r\n // Before clear\r\n for (const step of scene._beforeRenderTargetClearStage) {\r\n step.action(this, faceIndex, layer);\r\n }\r\n\r\n // Clear\r\n if (this.onClearObservable.hasObservers()) {\r\n this.onClearObservable.notifyObservers(engine);\r\n } else if (!this.skipInitialClear) {\r\n engine.clear(this.clearColor || scene.clearColor, true, true, true);\r\n }\r\n\r\n if (!this._doNotChangeAspectRatio) {\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n // Before Camera Draw\r\n for (const step of scene._beforeRenderTargetDrawStage) {\r\n step.action(this, faceIndex, layer);\r\n }\r\n\r\n // Render\r\n this._renderingManager.render(this.customRenderFunction, currentRenderList, this.renderParticles, this.renderSprites);\r\n\r\n // After Camera Draw\r\n for (const step of scene._afterRenderTargetDrawStage) {\r\n step.action(this, faceIndex, layer);\r\n }\r\n\r\n const saveGenerateMipMaps = this._texture?.generateMipMaps ?? false;\r\n\r\n if (this._texture) {\r\n this._texture.generateMipMaps = false; // if left true, the mipmaps will be generated (if this._texture.generateMipMaps = true) when the first post process binds its own RTT: by doing so it will unbind the current RTT,\r\n // which will trigger a mipmap generation. We don't want this because it's a wasted work, we will do an unbind of the current RTT at the end of the process (see unbindFrameBuffer) which will\r\n // trigger the generation of the final mipmaps\r\n }\r\n\r\n if (this._postProcessManager) {\r\n this._postProcessManager._finalizeFrame(false, this._renderTarget ?? undefined, faceIndex, this._postProcesses, this.ignoreCameraViewport);\r\n } else if (useCameraPostProcess) {\r\n scene.postProcessManager._finalizeFrame(false, this._renderTarget ?? undefined, faceIndex);\r\n }\r\n\r\n for (const step of scene._afterRenderTargetPostProcessStage) {\r\n step.action(this, faceIndex, layer);\r\n }\r\n\r\n if (this._texture) {\r\n this._texture.generateMipMaps = saveGenerateMipMaps;\r\n }\r\n\r\n if (!this._doNotChangeAspectRatio) {\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n // Dump ?\r\n if (dumpForDebug) {\r\n DumpTools.DumpFramebuffer(this.getRenderWidth(), this.getRenderHeight(), engine);\r\n }\r\n } else {\r\n // Clear\r\n if (this.onClearObservable.hasObservers()) {\r\n this.onClearObservable.notifyObservers(engine);\r\n } else {\r\n if (!this.skipInitialClear) {\r\n engine.clear(this.clearColor || scene.clearColor, true, true, true);\r\n }\r\n }\r\n }\r\n\r\n // Unbind\r\n this._unbindFrameBuffer(engine, faceIndex);\r\n\r\n if (this._texture && this.isCube && faceIndex === 5) {\r\n engine.generateMipMapsForCubemap(this._texture);\r\n }\r\n\r\n engine._debugPopGroup?.(1);\r\n }\r\n\r\n /**\r\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\r\n * This allowed control for front to back rendering or reversely depending of the special needs.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\r\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\r\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\r\n */\r\n public setRenderingOrder(\r\n renderingGroupId: number,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ): void {\r\n this._renderingManager.setRenderingOrder(renderingGroupId, opaqueSortCompareFn, alphaTestSortCompareFn, transparentSortCompareFn);\r\n }\r\n\r\n /**\r\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\r\n */\r\n public setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean): void {\r\n this._renderingManager.setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil);\r\n this._renderingManager._useSceneAutoClearSetup = false;\r\n }\r\n\r\n /**\r\n * Clones the texture.\r\n * @returns the cloned texture\r\n */\r\n public clone(): RenderTargetTexture {\r\n const textureSize = this.getSize();\r\n const newTexture = new RenderTargetTexture(\r\n this.name,\r\n textureSize,\r\n this.getScene(),\r\n this._renderTargetOptions.generateMipMaps,\r\n this._doNotChangeAspectRatio,\r\n this._renderTargetOptions.type,\r\n this.isCube,\r\n this._renderTargetOptions.samplingMode,\r\n this._renderTargetOptions.generateDepthBuffer,\r\n this._renderTargetOptions.generateStencilBuffer,\r\n undefined,\r\n this._renderTargetOptions.format,\r\n undefined,\r\n this._renderTargetOptions.samples\r\n );\r\n\r\n // Base texture\r\n newTexture.hasAlpha = this.hasAlpha;\r\n newTexture.level = this.level;\r\n\r\n // RenderTarget Texture\r\n newTexture.coordinatesMode = this.coordinatesMode;\r\n if (this.renderList) {\r\n newTexture.renderList = this.renderList.slice(0);\r\n }\r\n\r\n return newTexture;\r\n }\r\n\r\n /**\r\n * Serialize the texture to a JSON representation we can easily use in the respective Parse function.\r\n * @returns The JSON representation of the texture\r\n */\r\n public serialize(): any {\r\n if (!this.name) {\r\n return null;\r\n }\r\n\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.renderTargetSize = this.getRenderSize();\r\n serializationObject.renderList = [];\r\n\r\n if (this.renderList) {\r\n for (let index = 0; index < this.renderList.length; index++) {\r\n serializationObject.renderList.push(this.renderList[index].id);\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * This will remove the attached framebuffer objects. The texture will not be able to be used as render target anymore\r\n */\r\n public disposeFramebufferObjects(): void {\r\n this._renderTarget?.dispose(true);\r\n }\r\n\r\n /**\r\n * Release and destroy the underlying lower level texture aka internalTexture.\r\n */\r\n public releaseInternalTexture(): void {\r\n this._renderTarget?.releaseTextures();\r\n this._texture = null;\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public dispose(): void {\r\n this.onResizeObservable.clear();\r\n this.onClearObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onAfterUnbindObservable.clear();\r\n this.onBeforeBindObservable.clear();\r\n this.onBeforeRenderObservable.clear();\r\n\r\n if (this._postProcessManager) {\r\n this._postProcessManager.dispose();\r\n this._postProcessManager = null;\r\n }\r\n\r\n if (this._prePassRenderTarget) {\r\n this._prePassRenderTarget.dispose();\r\n }\r\n\r\n this._releaseRenderPassId();\r\n this.clearPostProcesses(true);\r\n\r\n if (this._resizeObserver) {\r\n this.getScene()!.getEngine().onResizeObservable.remove(this._resizeObserver);\r\n this._resizeObserver = null;\r\n }\r\n\r\n this.renderList = null;\r\n\r\n // Remove from custom render targets\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n let index = scene.customRenderTargets.indexOf(this);\r\n\r\n if (index >= 0) {\r\n scene.customRenderTargets.splice(index, 1);\r\n }\r\n\r\n for (const camera of scene.cameras) {\r\n index = camera.customRenderTargets.indexOf(this);\r\n\r\n if (index >= 0) {\r\n camera.customRenderTargets.splice(index, 1);\r\n }\r\n }\r\n\r\n this._renderTarget?.dispose();\r\n this._renderTarget = null;\r\n this._texture = null;\r\n\r\n super.dispose();\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this.refreshRate === RenderTargetTexture.REFRESHRATE_RENDER_ONCE) {\r\n this.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE;\r\n }\r\n\r\n if (this._postProcessManager) {\r\n this._postProcessManager._rebuild();\r\n }\r\n }\r\n\r\n /**\r\n * Clear the info related to rendering groups preventing retention point in material dispose.\r\n */\r\n public freeRenderingGroups(): void {\r\n if (this._renderingManager) {\r\n this._renderingManager.freeRenderingGroups();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the number of views the corresponding to the texture (eg. a MultiviewRenderTarget will have > 1)\r\n * @returns the view count\r\n */\r\n public getViewCount() {\r\n return 1;\r\n }\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nTexture._CreateRenderTargetTexture = (name: string, renderTargetSize: number, scene: Scene, generateMipMaps: boolean, creationFlags?: number) => {\r\n return new RenderTargetTexture(name, renderTargetSize, scene, generateMipMaps);\r\n};\r\n", "import { Tools } from \"../../../Misc/tools\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport type { ISceneComponent } from \"../../../sceneComponent\";\r\nimport { SceneComponentConstants } from \"../../../sceneComponent\";\r\n\r\nimport type { ProceduralTexture } from \"./proceduralTexture\";\r\n\r\ndeclare module \"../../../abstractScene\" {\r\n export interface AbstractScene {\r\n /**\r\n * The list of procedural textures added to the scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures\r\n */\r\n proceduralTextures: Array;\r\n }\r\n}\r\n/**\r\n * Defines the Procedural Texture scene component responsible to manage any Procedural Texture\r\n * in a given scene.\r\n */\r\nexport class ProceduralTextureSceneComponent implements ISceneComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_PROCEDURALTEXTURE;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Creates a new instance of the component for the given scene\r\n * @param scene Defines the scene to register the component in\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n this.scene.proceduralTextures = [] as ProceduralTexture[];\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {\r\n this.scene._beforeClearStage.registerStep(SceneComponentConstants.STEP_BEFORECLEAR_PROCEDURALTEXTURE, this, this._beforeClear);\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n // Nothing to do here.\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources.\r\n */\r\n public dispose(): void {\r\n // Nothing to do here.\r\n }\r\n\r\n private _beforeClear(): void {\r\n if (this.scene.proceduralTexturesEnabled) {\r\n Tools.StartPerformanceCounter(\"Procedural textures\", this.scene.proceduralTextures.length > 0);\r\n for (let proceduralIndex = 0; proceduralIndex < this.scene.proceduralTextures.length; proceduralIndex++) {\r\n const proceduralTexture = this.scene.proceduralTextures[proceduralIndex];\r\n if (proceduralTexture._shouldRender()) {\r\n proceduralTexture.render();\r\n }\r\n }\r\n Tools.EndPerformanceCounter(\"Procedural textures\", this.scene.proceduralTextures.length > 0);\r\n }\r\n }\r\n}\r\n", "// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"proceduralVertexShader\";\nconst shader = `attribute vec2 position;varying vec2 vPosition;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5);\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvPosition=position;vUV=position*madd+madd;gl_Position=vec4(position,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const proceduralVertexShader = { name, shader };\n", "import { serialize } from \"../../../Misc/decorators\";\r\nimport { Observable } from \"../../../Misc/observable\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport type { Matrix, Vector3, Vector2 } from \"../../../Maths/math.vector\";\r\nimport type { Color4, Color3 } from \"../../../Maths/math.color\";\r\nimport type { Engine } from \"../../../Engines/engine\";\r\nimport { VertexBuffer } from \"../../../Buffers/buffer\";\r\nimport { SceneComponentConstants } from \"../../../sceneComponent\";\r\n\r\nimport { Material } from \"../../../Materials/material\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { Texture } from \"../../../Materials/Textures/texture\";\r\nimport type { RenderTargetTextureOptions } from \"../../../Materials/Textures/renderTargetTexture\";\r\nimport { RenderTargetTexture } from \"../../../Materials/Textures/renderTargetTexture\";\r\nimport { ProceduralTextureSceneComponent } from \"./proceduralTextureSceneComponent\";\r\n\r\nimport \"../../../Engines/Extensions/engine.renderTarget\";\r\nimport \"../../../Engines/Extensions/engine.renderTargetCube\";\r\nimport \"../../../Shaders/procedural.vertex\";\r\nimport type { DataBuffer } from \"../../../Buffers/dataBuffer\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport type { NodeMaterial } from \"../../Node/nodeMaterial\";\r\nimport type { TextureSize } from \"../../../Materials/Textures/textureCreationOptions\";\r\nimport { EngineStore } from \"../../../Engines/engineStore\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport { DrawWrapper } from \"../../drawWrapper\";\r\nimport type { RenderTargetWrapper } from \"../../../Engines/renderTargetWrapper\";\r\n\r\n/**\r\n * Options to create a procedural texture\r\n */\r\nexport interface IProceduralTextureCreationOptions extends RenderTargetTextureOptions {\r\n /**\r\n * Defines a fallback texture in case there were issues to create the custom texture\r\n */\r\n fallbackTexture?: Nullable;\r\n}\r\n\r\n/**\r\n * Procedural texturing is a way to programmatically create a texture. There are 2 types of procedural textures: code-only, and code that references some classic 2D images, sometimes calmpler' images.\r\n * This is the base class of any Procedural texture and contains most of the shareable code.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures\r\n */\r\nexport class ProceduralTexture extends Texture {\r\n /**\r\n * Define if the texture is enabled or not (disabled texture will not render)\r\n */\r\n @serialize()\r\n public isEnabled = true;\r\n\r\n /**\r\n * Define if the texture must be cleared before rendering (default is true)\r\n */\r\n @serialize()\r\n public autoClear = true;\r\n\r\n /**\r\n * Callback called when the texture is generated\r\n */\r\n public onGenerated: () => void;\r\n\r\n /**\r\n * Event raised when the texture is generated\r\n */\r\n public onGeneratedObservable = new Observable();\r\n\r\n /**\r\n * Event raised before the texture is generated\r\n */\r\n public onBeforeGenerationObservable = new Observable();\r\n\r\n /**\r\n * Gets or sets the node material used to create this texture (null if the texture was manually created)\r\n */\r\n public nodeMaterialSource: Nullable = null;\r\n\r\n /** @internal */\r\n @serialize()\r\n public _generateMipMaps: boolean;\r\n\r\n private _drawWrapper: DrawWrapper;\r\n\r\n /** @internal */\r\n public _textures: { [key: string]: Texture } = {};\r\n\r\n /** @internal */\r\n protected _fallbackTexture: Nullable;\r\n\r\n @serialize()\r\n private _size: TextureSize;\r\n private _textureType: number;\r\n private _currentRefreshId = -1;\r\n private _frameId = -1;\r\n private _refreshRate = 1;\r\n private _vertexBuffers: { [key: string]: Nullable } = {};\r\n private _indexBuffer: Nullable;\r\n private _uniforms = new Array();\r\n private _samplers = new Array();\r\n private _fragment: any;\r\n\r\n private _floats: { [key: string]: number } = {};\r\n private _ints: { [key: string]: number } = {};\r\n private _floatsArrays: { [key: string]: number[] } = {};\r\n private _colors3: { [key: string]: Color3 } = {};\r\n private _colors4: { [key: string]: Color4 } = {};\r\n private _vectors2: { [key: string]: Vector2 } = {};\r\n private _vectors3: { [key: string]: Vector3 } = {};\r\n private _matrices: { [key: string]: Matrix } = {};\r\n\r\n private _fallbackTextureUsed = false;\r\n private _fullEngine: Engine;\r\n\r\n private _cachedDefines: Nullable = null;\r\n\r\n private _contentUpdateId = -1;\r\n private _contentData: Nullable>;\r\n\r\n private _rtWrapper: Nullable = null;\r\n private _options: IProceduralTextureCreationOptions;\r\n\r\n /**\r\n * Instantiates a new procedural texture.\r\n * Procedural texturing is a way to programmatically create a texture. There are 2 types of procedural textures: code-only, and code that references some classic 2D images, sometimes called 'refMaps' or 'sampler' images.\r\n * This is the base class of any Procedural texture and contains most of the shareable code.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures\r\n * @param name Define the name of the texture\r\n * @param size Define the size of the texture to create\r\n * @param fragment Define the fragment shader to use to generate the texture or null if it is defined later:\r\n * * object: \\{ fragmentElement: \"fragmentShaderCode\" \\}, used with shader code in script tags\r\n * * object: \\{ fragmentSource: \"fragment shader code string\" \\}, the string contains the shader code\r\n * * string: the string contains a name \"XXX\" to lookup in Effect.ShadersStore[\"XXXFragmentShader\"]\r\n * @param scene Define the scene the texture belongs to\r\n * @param fallbackTexture Define a fallback texture in case there were issues to create the custom texture\r\n * @param generateMipMaps Define if the texture should creates mip maps or not\r\n * @param isCube Define if the texture is a cube texture or not (this will render each faces of the cube)\r\n * @param textureType The FBO internal texture type\r\n */\r\n constructor(\r\n name: string,\r\n size: TextureSize,\r\n fragment: any,\r\n scene: Nullable,\r\n fallbackTexture: Nullable | IProceduralTextureCreationOptions = null,\r\n generateMipMaps = true,\r\n isCube = false,\r\n textureType = Constants.TEXTURETYPE_UNSIGNED_INT\r\n ) {\r\n super(null, scene, !generateMipMaps);\r\n\r\n if (fallbackTexture !== null && !(fallbackTexture instanceof Texture)) {\r\n this._options = fallbackTexture;\r\n this._fallbackTexture = fallbackTexture.fallbackTexture ?? null;\r\n } else {\r\n this._options = {};\r\n this._fallbackTexture = fallbackTexture;\r\n }\r\n\r\n scene = this.getScene() || EngineStore.LastCreatedScene!;\r\n let component = scene._getComponent(SceneComponentConstants.NAME_PROCEDURALTEXTURE);\r\n if (!component) {\r\n component = new ProceduralTextureSceneComponent(scene);\r\n scene._addComponent(component);\r\n }\r\n scene.proceduralTextures.push(this);\r\n\r\n this._fullEngine = scene.getEngine();\r\n\r\n this.name = name;\r\n this.isRenderTarget = true;\r\n this._size = size;\r\n this._textureType = textureType;\r\n this._generateMipMaps = generateMipMaps;\r\n this._drawWrapper = new DrawWrapper(this._fullEngine);\r\n\r\n this.setFragment(fragment);\r\n\r\n const rtWrapper = this._createRtWrapper(isCube, size, generateMipMaps, textureType);\r\n this._texture = rtWrapper.texture;\r\n\r\n // VBO\r\n const vertices = [];\r\n vertices.push(1, 1);\r\n vertices.push(-1, 1);\r\n vertices.push(-1, -1);\r\n vertices.push(1, -1);\r\n\r\n this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(this._fullEngine, vertices, VertexBuffer.PositionKind, false, false, 2);\r\n\r\n this._createIndexBuffer();\r\n }\r\n\r\n private _createRtWrapper(isCube: boolean, size: TextureSize, generateMipMaps: boolean, textureType: number) {\r\n if (isCube) {\r\n this._rtWrapper = this._fullEngine.createRenderTargetCubeTexture(size as number, {\r\n generateMipMaps: generateMipMaps,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n type: textureType,\r\n ...this._options,\r\n });\r\n this.setFloat(\"face\", 0);\r\n } else {\r\n this._rtWrapper = this._fullEngine.createRenderTargetTexture(size, {\r\n generateMipMaps: generateMipMaps,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n type: textureType,\r\n ...this._options,\r\n });\r\n }\r\n return this._rtWrapper;\r\n }\r\n\r\n /**\r\n * The effect that is created when initializing the post process.\r\n * @returns The created effect corresponding the postprocess.\r\n */\r\n public getEffect(): Effect {\r\n return this._drawWrapper.effect!;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setEffect(effect: Effect) {\r\n this._drawWrapper.effect = effect;\r\n }\r\n\r\n /**\r\n * Gets texture content (Use this function wisely as reading from a texture can be slow)\r\n * @returns an ArrayBufferView promise (Uint8Array or Float32Array)\r\n */\r\n public getContent(): Nullable> {\r\n if (this._contentData && this._frameId === this._contentUpdateId) {\r\n return this._contentData;\r\n }\r\n\r\n if (this._contentData) {\r\n this._contentData.then((buffer) => {\r\n this._contentData = this.readPixels(0, 0, buffer);\r\n this._contentUpdateId = this._frameId;\r\n });\r\n } else {\r\n this._contentData = this.readPixels(0, 0);\r\n this._contentUpdateId = this._frameId;\r\n }\r\n\r\n return this._contentData;\r\n }\r\n\r\n private _createIndexBuffer(): void {\r\n const engine = this._fullEngine;\r\n\r\n // Indices\r\n const indices = [];\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n const vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n\r\n if (vb) {\r\n vb._rebuild();\r\n }\r\n\r\n this._createIndexBuffer();\r\n\r\n if (this.refreshRate === RenderTargetTexture.REFRESHRATE_RENDER_ONCE) {\r\n this.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE;\r\n }\r\n }\r\n\r\n /**\r\n * Resets the texture in order to recreate its associated resources.\r\n * This can be called in case of context loss or if you change the shader code and need to regenerate the texture with the new code\r\n */\r\n public reset(): void {\r\n this._drawWrapper.effect?.dispose();\r\n this._drawWrapper.effect = null;\r\n this._cachedDefines = null;\r\n }\r\n\r\n protected _getDefines(): string {\r\n return \"\";\r\n }\r\n\r\n /**\r\n * Executes a function when the texture will be ready to be drawn.\r\n * @param func The callback to be used.\r\n */\r\n public executeWhenReady(func: (texture: ProceduralTexture) => void): void {\r\n if (this.isReady()) {\r\n func(this);\r\n return;\r\n }\r\n\r\n const effect = this.getEffect();\r\n if (effect) {\r\n effect.executeWhenCompiled(() => {\r\n func(this);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Is the texture ready to be used ? (rendered at least once)\r\n * @returns true if ready, otherwise, false.\r\n */\r\n public isReady(): boolean {\r\n const engine = this._fullEngine;\r\n\r\n if (this.nodeMaterialSource) {\r\n return this._drawWrapper.effect!.isReady();\r\n }\r\n\r\n if (!this._fragment) {\r\n return false;\r\n }\r\n\r\n if (this._fallbackTextureUsed) {\r\n return true;\r\n }\r\n\r\n if (!this._texture) {\r\n return false;\r\n }\r\n\r\n const defines = this._getDefines();\r\n if (this._drawWrapper.effect && defines === this._cachedDefines && this._drawWrapper.effect.isReady()) {\r\n return true;\r\n }\r\n\r\n const shaders = {\r\n vertex: \"procedural\",\r\n fragmentElement: this._fragment.fragmentElement,\r\n fragmentSource: this._fragment.fragmentSource,\r\n fragment: typeof this._fragment === \"string\" ? this._fragment : undefined,\r\n };\r\n\r\n if (this._cachedDefines !== defines) {\r\n this._cachedDefines = defines;\r\n\r\n this._drawWrapper.effect = engine.createEffect(shaders, [VertexBuffer.PositionKind], this._uniforms, this._samplers, defines, undefined, undefined, () => {\r\n this._rtWrapper?.dispose();\r\n this._rtWrapper = this._texture = null;\r\n\r\n if (this._fallbackTexture) {\r\n this._texture = this._fallbackTexture._texture;\r\n\r\n if (this._texture) {\r\n this._texture.incrementReferences();\r\n }\r\n }\r\n\r\n this._fallbackTextureUsed = true;\r\n });\r\n }\r\n\r\n return this._drawWrapper.effect!.isReady();\r\n }\r\n\r\n /**\r\n * Resets the refresh counter of the texture and start bak from scratch.\r\n * Could be useful to regenerate the texture if it is setup to render only once.\r\n */\r\n public resetRefreshCounter(): void {\r\n this._currentRefreshId = -1;\r\n }\r\n\r\n /**\r\n * Set the fragment shader to use in order to render the texture.\r\n * @param fragment This can be set to a path (into the shader store) or to a json object containing a fragmentElement property.\r\n */\r\n public setFragment(fragment: any) {\r\n this._fragment = fragment;\r\n }\r\n\r\n /**\r\n * Define the refresh rate of the texture or the rendering frequency.\r\n * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...\r\n */\r\n @serialize()\r\n public get refreshRate(): number {\r\n return this._refreshRate;\r\n }\r\n\r\n public set refreshRate(value: number) {\r\n this._refreshRate = value;\r\n this.resetRefreshCounter();\r\n }\r\n\r\n /** @internal */\r\n public _shouldRender(): boolean {\r\n if (!this.isEnabled || !this.isReady() || !this._texture) {\r\n if (this._texture) {\r\n this._texture.isReady = false;\r\n }\r\n return false;\r\n }\r\n\r\n if (this._fallbackTextureUsed) {\r\n return false;\r\n }\r\n\r\n if (this._currentRefreshId === -1) {\r\n // At least render once\r\n this._currentRefreshId = 1;\r\n this._frameId++;\r\n return true;\r\n }\r\n\r\n if (this.refreshRate === this._currentRefreshId) {\r\n this._currentRefreshId = 1;\r\n this._frameId++;\r\n return true;\r\n }\r\n\r\n this._currentRefreshId++;\r\n return false;\r\n }\r\n\r\n /**\r\n * Get the size the texture is rendering at.\r\n * @returns the size (on cube texture it is always squared)\r\n */\r\n public getRenderSize(): TextureSize {\r\n return this._size;\r\n }\r\n\r\n /**\r\n * Resize the texture to new value.\r\n * @param size Define the new size the texture should have\r\n * @param generateMipMaps Define whether the new texture should create mip maps\r\n */\r\n public resize(size: TextureSize, generateMipMaps: boolean): void {\r\n if (this._fallbackTextureUsed || !this._rtWrapper || !this._texture) {\r\n return;\r\n }\r\n\r\n const isCube = this._texture.isCube;\r\n this._rtWrapper.dispose();\r\n\r\n const rtWrapper = this._createRtWrapper(isCube, size, generateMipMaps, this._textureType);\r\n this._texture = rtWrapper.texture;\r\n\r\n // Update properties\r\n this._size = size;\r\n this._generateMipMaps = generateMipMaps;\r\n }\r\n\r\n private _checkUniform(uniformName: string): void {\r\n if (this._uniforms.indexOf(uniformName) === -1) {\r\n this._uniforms.push(uniformName);\r\n }\r\n }\r\n\r\n /**\r\n * Set a texture in the shader program used to render.\r\n * @param name Define the name of the uniform samplers as defined in the shader\r\n * @param texture Define the texture to bind to this sampler\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setTexture(name: string, texture: Texture): ProceduralTexture {\r\n if (this._samplers.indexOf(name) === -1) {\r\n this._samplers.push(name);\r\n }\r\n this._textures[name] = texture;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a float in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setFloat(name: string, value: number): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._floats[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a int in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setInt(name: string, value: number): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._ints[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set an array of floats in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setFloats(name: string, value: number[]): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._floatsArrays[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec3 in the shader from a Color3.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setColor3(name: string, value: Color3): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._colors3[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 in the shader from a Color4.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setColor4(name: string, value: Color4): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._colors4[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec2 in the shader from a Vector2.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setVector2(name: string, value: Vector2): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._vectors2[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec3 in the shader from a Vector3.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setVector3(name: string, value: Vector3): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._vectors3[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a mat4 in the shader from a MAtrix.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setMatrix(name: string, value: Matrix): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._matrices[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Render the texture to its associated render target.\r\n * @param useCameraPostProcess Define if camera post process should be applied to the texture\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public render(useCameraPostProcess?: boolean): void {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n const engine = this._fullEngine;\r\n\r\n // Render\r\n engine.enableEffect(this._drawWrapper);\r\n this.onBeforeGenerationObservable.notifyObservers(this);\r\n engine.setState(false);\r\n\r\n if (!this.nodeMaterialSource) {\r\n // Texture\r\n for (const name in this._textures) {\r\n this._drawWrapper.effect!.setTexture(name, this._textures[name]);\r\n }\r\n\r\n // Float\r\n for (const name in this._ints) {\r\n this._drawWrapper.effect!.setInt(name, this._ints[name]);\r\n }\r\n\r\n // Float\r\n for (const name in this._floats) {\r\n this._drawWrapper.effect!.setFloat(name, this._floats[name]);\r\n }\r\n\r\n // Floats\r\n for (const name in this._floatsArrays) {\r\n this._drawWrapper.effect!.setArray(name, this._floatsArrays[name]);\r\n }\r\n\r\n // Color3\r\n for (const name in this._colors3) {\r\n this._drawWrapper.effect!.setColor3(name, this._colors3[name]);\r\n }\r\n\r\n // Color4\r\n for (const name in this._colors4) {\r\n const color = this._colors4[name];\r\n this._drawWrapper.effect!.setFloat4(name, color.r, color.g, color.b, color.a);\r\n }\r\n\r\n // Vector2\r\n for (const name in this._vectors2) {\r\n this._drawWrapper.effect!.setVector2(name, this._vectors2[name]);\r\n }\r\n\r\n // Vector3\r\n for (const name in this._vectors3) {\r\n this._drawWrapper.effect!.setVector3(name, this._vectors3[name]);\r\n }\r\n\r\n // Matrix\r\n for (const name in this._matrices) {\r\n this._drawWrapper.effect!.setMatrix(name, this._matrices[name]);\r\n }\r\n }\r\n\r\n if (!this._texture || !this._rtWrapper) {\r\n return;\r\n }\r\n\r\n engine._debugPushGroup?.(`procedural texture generation for ${this.name}`, 1);\r\n\r\n const viewPort = engine.currentViewport;\r\n if (this.isCube) {\r\n for (let face = 0; face < 6; face++) {\r\n engine.bindFramebuffer(this._rtWrapper, face, undefined, undefined, true);\r\n\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, this._drawWrapper.effect!);\r\n\r\n this._drawWrapper.effect!.setFloat(\"face\", face);\r\n\r\n // Clear\r\n if (this.autoClear) {\r\n engine.clear(scene.clearColor, true, false, false);\r\n }\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n }\r\n } else {\r\n engine.bindFramebuffer(this._rtWrapper, 0, undefined, undefined, true);\r\n\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, this._drawWrapper.effect!);\r\n\r\n // Clear\r\n if (this.autoClear) {\r\n engine.clear(scene.clearColor, true, false, false);\r\n }\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n }\r\n\r\n // Unbind and restore viewport\r\n engine.unBindFramebuffer(this._rtWrapper, this.isCube);\r\n if (viewPort) {\r\n engine.setViewport(viewPort);\r\n }\r\n\r\n // Mipmaps\r\n if (this.isCube) {\r\n engine.generateMipMapsForCubemap(this._texture);\r\n }\r\n\r\n engine._debugPopGroup?.(1);\r\n\r\n if (this.onGenerated) {\r\n this.onGenerated();\r\n }\r\n\r\n this.onGeneratedObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Clone the texture.\r\n * @returns the cloned texture\r\n */\r\n public clone(): ProceduralTexture {\r\n const textureSize = this.getSize();\r\n const newTexture = new ProceduralTexture(this.name, textureSize.width, this._fragment, this.getScene(), this._fallbackTexture, this._generateMipMaps);\r\n\r\n // Base texture\r\n newTexture.hasAlpha = this.hasAlpha;\r\n newTexture.level = this.level;\r\n\r\n // RenderTarget Texture\r\n newTexture.coordinatesMode = this.coordinatesMode;\r\n\r\n return newTexture;\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public dispose(): void {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n const index = scene.proceduralTextures.indexOf(this);\r\n\r\n if (index >= 0) {\r\n scene.proceduralTextures.splice(index, 1);\r\n }\r\n\r\n const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vertexBuffer) {\r\n vertexBuffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n\r\n if (this._indexBuffer && this._fullEngine._releaseBuffer(this._indexBuffer)) {\r\n this._indexBuffer = null;\r\n }\r\n\r\n this.onGeneratedObservable.clear();\r\n this.onBeforeGenerationObservable.clear();\r\n\r\n super.dispose();\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ProceduralTexture\", ProceduralTexture);\r\n", "import { NodeMaterialBlock } from \"../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../nodeMaterialBuildState\";\r\nimport type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport type { Scene } from \"../../../scene\";\r\n\r\n/**\r\n * Operations supported by the Trigonometry block\r\n */\r\nexport enum TrigonometryBlockOperations {\r\n /** Cos */\r\n Cos,\r\n /** Sin */\r\n Sin,\r\n /** Abs */\r\n Abs,\r\n /** Exp */\r\n Exp,\r\n /** Exp2 */\r\n Exp2,\r\n /** Round */\r\n Round,\r\n /** Floor */\r\n Floor,\r\n /** Ceiling */\r\n Ceiling,\r\n /** Square root */\r\n Sqrt,\r\n /** Log */\r\n Log,\r\n /** Tangent */\r\n Tan,\r\n /** Arc tangent */\r\n ArcTan,\r\n /** Arc cosinus */\r\n ArcCos,\r\n /** Arc sinus */\r\n ArcSin,\r\n /** Fraction */\r\n Fract,\r\n /** Sign */\r\n Sign,\r\n /** To radians (from degrees) */\r\n Radians,\r\n /** To degrees (from radians) */\r\n Degrees,\r\n}\r\n\r\n/**\r\n * Block used to apply trigonometry operation to floats\r\n */\r\nexport class TrigonometryBlock extends NodeMaterialBlock {\r\n /**\r\n * Gets or sets the operation applied by the block\r\n */\r\n public operation = TrigonometryBlockOperations.Cos;\r\n\r\n /**\r\n * Creates a new TrigonometryBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerInput(\"input\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerOutput(\"output\", NodeMaterialBlockConnectionPointTypes.BasedOnInput);\r\n\r\n this._outputs[0]._typeConnectionSource = this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"TrigonometryBlock\";\r\n }\r\n\r\n /**\r\n * Gets the input component\r\n */\r\n public get input(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const output = this._outputs[0];\r\n let operation = \"\";\r\n\r\n switch (this.operation) {\r\n case TrigonometryBlockOperations.Cos: {\r\n operation = \"cos\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Sin: {\r\n operation = \"sin\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Abs: {\r\n operation = \"abs\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Exp: {\r\n operation = \"exp\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Exp2: {\r\n operation = \"exp2\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Round: {\r\n operation = \"round\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Floor: {\r\n operation = \"floor\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Ceiling: {\r\n operation = \"ceil\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Sqrt: {\r\n operation = \"sqrt\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Log: {\r\n operation = \"log\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Tan: {\r\n operation = \"tan\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.ArcTan: {\r\n operation = \"atan\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.ArcCos: {\r\n operation = \"acos\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.ArcSin: {\r\n operation = \"asin\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Fract: {\r\n operation = \"fract\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Sign: {\r\n operation = \"sign\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Radians: {\r\n operation = \"radians\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Degrees: {\r\n operation = \"degrees\";\r\n break;\r\n }\r\n }\r\n\r\n state.compilationString += this._declareOutput(output, state) + ` = ${operation}(${this.input.associatedVariableName});\\n`;\r\n\r\n return this;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.operation = this.operation;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.operation = serializationObject.operation;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n const codeString =\r\n super._dumpPropertiesCode() + `${this._codeVariableName}.operation = BABYLON.TrigonometryBlockOperations.${TrigonometryBlockOperations[this.operation]};\\n`;\r\n return codeString;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TrigonometryBlock\", TrigonometryBlock);\r\n", "import { NodeMaterialBlockConnectionPointTypes } from \"./Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport { NodeMaterialBlockTargets } from \"./Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialBuildStateSharedData } from \"./nodeMaterialBuildStateSharedData\";\r\nimport { Effect } from \"../effect\";\r\n\r\n/**\r\n * Class used to store node based material build state\r\n */\r\nexport class NodeMaterialBuildState {\r\n /** Gets or sets a boolean indicating if the current state can emit uniform buffers */\r\n public supportUniformBuffers = false;\r\n /**\r\n * Gets the list of emitted attributes\r\n */\r\n public attributes: string[] = [];\r\n /**\r\n * Gets the list of emitted uniforms\r\n */\r\n public uniforms: string[] = [];\r\n /**\r\n * Gets the list of emitted constants\r\n */\r\n public constants: string[] = [];\r\n /**\r\n * Gets the list of emitted samplers\r\n */\r\n public samplers: string[] = [];\r\n /**\r\n * Gets the list of emitted functions\r\n */\r\n public functions: { [key: string]: string } = {};\r\n /**\r\n * Gets the list of emitted extensions\r\n */\r\n public extensions: { [key: string]: string } = {};\r\n /**\r\n * Gets the list of emitted prePass outputs - if using the prepass\r\n */\r\n public prePassOutput: { [key: string]: string } = {};\r\n\r\n /**\r\n * Gets the target of the compilation state\r\n */\r\n public target: NodeMaterialBlockTargets;\r\n /**\r\n * Gets the list of emitted counters\r\n */\r\n public counters: { [key: string]: number } = {};\r\n\r\n /**\r\n * Shared data between multiple NodeMaterialBuildState instances\r\n */\r\n public sharedData: NodeMaterialBuildStateSharedData;\r\n\r\n /** @internal */\r\n public _vertexState: NodeMaterialBuildState;\r\n\r\n /** @internal */\r\n public _attributeDeclaration = \"\";\r\n /** @internal */\r\n public _uniformDeclaration = \"\";\r\n /** @internal */\r\n public _constantDeclaration = \"\";\r\n /** @internal */\r\n public _samplerDeclaration = \"\";\r\n /** @internal */\r\n public _varyingTransfer = \"\";\r\n /** @internal */\r\n public _injectAtEnd = \"\";\r\n\r\n private _repeatableContentAnchorIndex = 0;\r\n /** @internal */\r\n public _builtCompilationString = \"\";\r\n\r\n /**\r\n * Gets the emitted compilation strings\r\n */\r\n public compilationString = \"\";\r\n\r\n /**\r\n * Finalize the compilation strings\r\n * @param state defines the current compilation state\r\n */\r\n public finalize(state: NodeMaterialBuildState) {\r\n const emitComments = state.sharedData.emitComments;\r\n const isFragmentMode = this.target === NodeMaterialBlockTargets.Fragment;\r\n\r\n this.compilationString = `\\n${emitComments ? \"//Entry point\\n\" : \"\"}void main(void) {\\n${this.compilationString}`;\r\n\r\n if (this._constantDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Constants\\n\" : \"\"}${this._constantDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n let functionCode = \"\";\r\n for (const functionName in this.functions) {\r\n functionCode += this.functions[functionName] + `\\n`;\r\n }\r\n this.compilationString = `\\n${functionCode}\\n${this.compilationString}`;\r\n\r\n if (!isFragmentMode && this._varyingTransfer) {\r\n this.compilationString = `${this.compilationString}\\n${this._varyingTransfer}`;\r\n }\r\n\r\n if (this._injectAtEnd) {\r\n this.compilationString = `${this.compilationString}\\n${this._injectAtEnd}`;\r\n }\r\n\r\n this.compilationString = `${this.compilationString}\\n}`;\r\n\r\n if (this.sharedData.varyingDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Varyings\\n\" : \"\"}${this.sharedData.varyingDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this._samplerDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Samplers\\n\" : \"\"}${this._samplerDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this._uniformDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Uniforms\\n\" : \"\"}${this._uniformDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this._attributeDeclaration && !isFragmentMode) {\r\n this.compilationString = `\\n${emitComments ? \"//Attributes\\n\" : \"\"}${this._attributeDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n this.compilationString = \"precision highp float;\\n\" + this.compilationString;\r\n this.compilationString = \"#if defined(WEBGL2) || defined(WEBGPU)\\nprecision highp sampler2DArray;\\n#endif\\n\" + this.compilationString;\r\n\r\n if (isFragmentMode) {\r\n this.compilationString =\r\n \"#if defined(PREPASS)\\r\\n#extension GL_EXT_draw_buffers : require\\r\\nlayout(location = 0) out highp vec4 glFragData[SCENE_MRT_COUNT];\\r\\nhighp vec4 gl_FragColor;\\r\\n#endif\\r\\n\" +\r\n this.compilationString;\r\n }\r\n\r\n for (const extensionName in this.extensions) {\r\n const extension = this.extensions[extensionName];\r\n this.compilationString = `\\n${extension}\\n${this.compilationString}`;\r\n }\r\n\r\n this._builtCompilationString = this.compilationString;\r\n }\r\n\r\n /** @internal */\r\n public get _repeatableContentAnchor(): string {\r\n return `###___ANCHOR${this._repeatableContentAnchorIndex++}___###`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getFreeVariableName(prefix: string): string {\r\n prefix = prefix.replace(/[^a-zA-Z_]+/g, \"\");\r\n\r\n if (this.sharedData.variableNames[prefix] === undefined) {\r\n this.sharedData.variableNames[prefix] = 0;\r\n\r\n // Check reserved words\r\n if (prefix === \"output\" || prefix === \"texture\") {\r\n return prefix + this.sharedData.variableNames[prefix];\r\n }\r\n\r\n return prefix;\r\n } else {\r\n this.sharedData.variableNames[prefix]++;\r\n }\r\n\r\n return prefix + this.sharedData.variableNames[prefix];\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getFreeDefineName(prefix: string): string {\r\n if (this.sharedData.defineNames[prefix] === undefined) {\r\n this.sharedData.defineNames[prefix] = 0;\r\n } else {\r\n this.sharedData.defineNames[prefix]++;\r\n }\r\n\r\n return prefix + this.sharedData.defineNames[prefix];\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _excludeVariableName(name: string) {\r\n this.sharedData.variableNames[name] = 0;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emit2DSampler(name: string) {\r\n if (this.samplers.indexOf(name) < 0) {\r\n this._samplerDeclaration += `uniform sampler2D ${name};\\n`;\r\n this.samplers.push(name);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emit2DArraySampler(name: string) {\r\n if (this.samplers.indexOf(name) < 0) {\r\n this._samplerDeclaration += `uniform sampler2DArray ${name};\\n`;\r\n this.samplers.push(name);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getGLType(type: NodeMaterialBlockConnectionPointTypes): string {\r\n switch (type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n return \"float\";\r\n case NodeMaterialBlockConnectionPointTypes.Int:\r\n return \"int\";\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n return \"vec2\";\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n return \"vec3\";\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n return \"vec4\";\r\n case NodeMaterialBlockConnectionPointTypes.Matrix:\r\n return \"mat4\";\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitExtension(name: string, extension: string, define: string = \"\") {\r\n if (this.extensions[name]) {\r\n return;\r\n }\r\n\r\n if (define) {\r\n extension = `#if ${define}\\n${extension}\\n#endif`;\r\n }\r\n this.extensions[name] = extension;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitFunction(name: string, code: string, comments: string) {\r\n if (this.functions[name]) {\r\n return;\r\n }\r\n\r\n if (this.sharedData.emitComments) {\r\n code = comments + `\\n` + code;\r\n }\r\n\r\n this.functions[name] = code;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitCodeFromInclude(\r\n includeName: string,\r\n comments: string,\r\n options?: {\r\n replaceStrings?: { search: RegExp; replace: string }[];\r\n repeatKey?: string;\r\n substitutionVars?: string;\r\n }\r\n ) {\r\n if (options && options.repeatKey) {\r\n return `#include<${includeName}>${options.substitutionVars ? \"(\" + options.substitutionVars + \")\" : \"\"}[0..${options.repeatKey}]\\n`;\r\n }\r\n\r\n let code = Effect.IncludesShadersStore[includeName] + \"\\n\";\r\n\r\n if (this.sharedData.emitComments) {\r\n code = comments + `\\n` + code;\r\n }\r\n\r\n if (!options) {\r\n return code;\r\n }\r\n\r\n if (options.replaceStrings) {\r\n for (let index = 0; index < options.replaceStrings.length; index++) {\r\n const replaceString = options.replaceStrings[index];\r\n code = code.replace(replaceString.search, replaceString.replace);\r\n }\r\n }\r\n\r\n return code;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitFunctionFromInclude(\r\n includeName: string,\r\n comments: string,\r\n options?: {\r\n repeatKey?: string;\r\n substitutionVars?: string;\r\n removeAttributes?: boolean;\r\n removeUniforms?: boolean;\r\n removeVaryings?: boolean;\r\n removeIfDef?: boolean;\r\n replaceStrings?: { search: RegExp; replace: string }[];\r\n },\r\n storeKey: string = \"\"\r\n ) {\r\n const key = includeName + storeKey;\r\n if (this.functions[key]) {\r\n return;\r\n }\r\n\r\n if (!options || (!options.removeAttributes && !options.removeUniforms && !options.removeVaryings && !options.removeIfDef && !options.replaceStrings)) {\r\n if (options && options.repeatKey) {\r\n this.functions[key] = `#include<${includeName}>${options.substitutionVars ? \"(\" + options.substitutionVars + \")\" : \"\"}[0..${options.repeatKey}]\\n`;\r\n } else {\r\n this.functions[key] = `#include<${includeName}>${options?.substitutionVars ? \"(\" + options?.substitutionVars + \")\" : \"\"}\\n`;\r\n }\r\n\r\n if (this.sharedData.emitComments) {\r\n this.functions[key] = comments + `\\n` + this.functions[key];\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.functions[key] = Effect.IncludesShadersStore[includeName];\r\n\r\n if (this.sharedData.emitComments) {\r\n this.functions[key] = comments + `\\n` + this.functions[key];\r\n }\r\n\r\n if (options.removeIfDef) {\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#ifdef.+$/gm, \"\");\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#endif.*$/gm, \"\");\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#else.*$/gm, \"\");\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#elif.*$/gm, \"\");\r\n }\r\n\r\n if (options.removeAttributes) {\r\n this.functions[key] = this.functions[key].replace(/\\s*?attribute .+?;/g, \"\\n\");\r\n }\r\n\r\n if (options.removeUniforms) {\r\n this.functions[key] = this.functions[key].replace(/\\s*?uniform .*?;/g, \"\\n\");\r\n }\r\n\r\n if (options.removeVaryings) {\r\n this.functions[key] = this.functions[key].replace(/\\s*?(varying|in) .+?;/g, \"\\n\");\r\n }\r\n\r\n if (options.replaceStrings) {\r\n for (let index = 0; index < options.replaceStrings.length; index++) {\r\n const replaceString = options.replaceStrings[index];\r\n this.functions[key] = this.functions[key].replace(replaceString.search, replaceString.replace);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _registerTempVariable(name: string) {\r\n if (this.sharedData.temps.indexOf(name) !== -1) {\r\n return false;\r\n }\r\n\r\n this.sharedData.temps.push(name);\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitVaryingFromString(name: string, type: string, define: string = \"\", notDefine = false) {\r\n if (this.sharedData.varyings.indexOf(name) !== -1) {\r\n return false;\r\n }\r\n\r\n this.sharedData.varyings.push(name);\r\n\r\n if (define) {\r\n if (define.startsWith(\"defined(\")) {\r\n this.sharedData.varyingDeclaration += `#if ${define}\\n`;\r\n } else {\r\n this.sharedData.varyingDeclaration += `${notDefine ? \"#ifndef\" : \"#ifdef\"} ${define}\\n`;\r\n }\r\n }\r\n this.sharedData.varyingDeclaration += `varying ${type} ${name};\\n`;\r\n if (define) {\r\n this.sharedData.varyingDeclaration += `#endif\\n`;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitUniformFromString(name: string, type: string, define: string = \"\", notDefine = false) {\r\n if (this.uniforms.indexOf(name) !== -1) {\r\n return;\r\n }\r\n\r\n this.uniforms.push(name);\r\n\r\n if (define) {\r\n if (define.startsWith(\"defined(\")) {\r\n this._uniformDeclaration += `#if ${define}\\n`;\r\n } else {\r\n this._uniformDeclaration += `${notDefine ? \"#ifndef\" : \"#ifdef\"} ${define}\\n`;\r\n }\r\n }\r\n this._uniformDeclaration += `uniform ${type} ${name};\\n`;\r\n if (define) {\r\n this._uniformDeclaration += `#endif\\n`;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitFloat(value: number) {\r\n if (value.toString() === value.toFixed(0)) {\r\n return `${value}.0`;\r\n }\r\n\r\n return value.toString();\r\n }\r\n}\r\n", "import type { NodeMaterialConnectionPoint } from \"./nodeMaterialBlockConnectionPoint\";\r\nimport type { NodeMaterialBlock } from \"./nodeMaterialBlock\";\r\nimport type { InputBlock } from \"./Blocks/Input/inputBlock\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Immutable } from \"../../types\";\r\nimport type { NodeMaterial, NodeMaterialTextureBlocks } from \"./nodeMaterial\";\r\n\r\n/**\r\n * Class used to store shared data between 2 NodeMaterialBuildState\r\n */\r\nexport class NodeMaterialBuildStateSharedData {\r\n /**\r\n * The node material we are currently building\r\n */\r\n public nodeMaterial: NodeMaterial;\r\n\r\n /**\r\n * Gets the list of emitted varyings\r\n */\r\n public temps: string[] = [];\r\n\r\n /**\r\n * Gets the list of emitted varyings\r\n */\r\n public varyings: string[] = [];\r\n\r\n /**\r\n * Gets the varying declaration string\r\n */\r\n public varyingDeclaration = \"\";\r\n\r\n /**\r\n * List of the fragment output nodes\r\n */\r\n public fragmentOutputNodes: Immutable>;\r\n\r\n /**\r\n * Input blocks\r\n */\r\n public inputBlocks: InputBlock[] = [];\r\n\r\n /**\r\n * Input blocks\r\n */\r\n public textureBlocks: NodeMaterialTextureBlocks[] = [];\r\n\r\n /**\r\n * Bindable blocks (Blocks that need to set data to the effect)\r\n */\r\n public bindableBlocks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * Bindable blocks (Blocks that need to set data to the effect) that will always be called (by bindForSubMesh), contrary to bindableBlocks that won't be called if _mustRebind() returns false\r\n */\r\n public forcedBindableBlocks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * List of blocks that can provide a compilation fallback\r\n */\r\n public blocksWithFallbacks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * List of blocks that can provide a define update\r\n */\r\n public blocksWithDefines: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * List of blocks that can provide a repeatable content\r\n */\r\n public repeatableContentBlocks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * List of blocks that can provide a dynamic list of uniforms\r\n */\r\n public dynamicUniformBlocks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * List of blocks that can block the isReady function for the material\r\n */\r\n public blockingBlocks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * Gets the list of animated inputs\r\n */\r\n public animatedInputs: InputBlock[] = [];\r\n\r\n /**\r\n * Build Id used to avoid multiple recompilations\r\n */\r\n public buildId: number;\r\n\r\n /** List of emitted variables */\r\n public variableNames: { [key: string]: number } = {};\r\n\r\n /** List of emitted defines */\r\n public defineNames: { [key: string]: number } = {};\r\n\r\n /** Should emit comments? */\r\n public emitComments: boolean;\r\n\r\n /** Emit build activity */\r\n public verbose: boolean;\r\n\r\n /** Gets or sets the hosting scene */\r\n public scene: Scene;\r\n\r\n /**\r\n * Gets the compilation hints emitted at compilation time\r\n */\r\n public hints = {\r\n needWorldViewMatrix: false,\r\n needWorldViewProjectionMatrix: false,\r\n needAlphaBlending: false,\r\n needAlphaTesting: false,\r\n };\r\n\r\n /**\r\n * List of compilation checks\r\n */\r\n public checks = {\r\n emitVertex: false,\r\n emitFragment: false,\r\n notConnectedNonOptionalInputs: new Array(),\r\n };\r\n\r\n /**\r\n * Is vertex program allowed to be empty?\r\n */\r\n public allowEmptyVertexProgram: boolean = false;\r\n\r\n /** Creates a new shared data */\r\n public constructor() {\r\n // Exclude usual attributes from free variable names\r\n this.variableNames[\"position\"] = 0;\r\n this.variableNames[\"normal\"] = 0;\r\n this.variableNames[\"tangent\"] = 0;\r\n this.variableNames[\"uv\"] = 0;\r\n this.variableNames[\"uv2\"] = 0;\r\n this.variableNames[\"uv3\"] = 0;\r\n this.variableNames[\"uv4\"] = 0;\r\n this.variableNames[\"uv5\"] = 0;\r\n this.variableNames[\"uv6\"] = 0;\r\n this.variableNames[\"color\"] = 0;\r\n this.variableNames[\"matricesIndices\"] = 0;\r\n this.variableNames[\"matricesWeights\"] = 0;\r\n this.variableNames[\"matricesIndicesExtra\"] = 0;\r\n this.variableNames[\"matricesWeightsExtra\"] = 0;\r\n this.variableNames[\"diffuseBase\"] = 0;\r\n this.variableNames[\"specularBase\"] = 0;\r\n this.variableNames[\"worldPos\"] = 0;\r\n this.variableNames[\"shadow\"] = 0;\r\n this.variableNames[\"view\"] = 0;\r\n\r\n // Exclude known varyings\r\n this.variableNames[\"vTBN\"] = 0;\r\n\r\n // Exclude defines\r\n this.defineNames[\"MAINUV0\"] = 0;\r\n this.defineNames[\"MAINUV1\"] = 0;\r\n this.defineNames[\"MAINUV2\"] = 0;\r\n this.defineNames[\"MAINUV3\"] = 0;\r\n this.defineNames[\"MAINUV4\"] = 0;\r\n this.defineNames[\"MAINUV5\"] = 0;\r\n this.defineNames[\"MAINUV6\"] = 0;\r\n this.defineNames[\"MAINUV7\"] = 0;\r\n }\r\n\r\n /**\r\n * Emits console errors and exceptions if there is a failing check\r\n */\r\n public emitErrors() {\r\n let errorMessage = \"\";\r\n\r\n if (!this.checks.emitVertex && !this.allowEmptyVertexProgram) {\r\n errorMessage += \"NodeMaterial does not have a vertex output. You need to at least add a block that generates a glPosition value.\\n\";\r\n }\r\n if (!this.checks.emitFragment) {\r\n errorMessage += \"NodeMaterial does not have a fragment output. You need to at least add a block that generates a glFragColor value.\\n\";\r\n }\r\n for (const notConnectedInput of this.checks.notConnectedNonOptionalInputs) {\r\n errorMessage += `input ${notConnectedInput.name} from block ${\r\n notConnectedInput.ownerBlock.name\r\n }[${notConnectedInput.ownerBlock.getClassName()}] is not connected and is not optional.\\n`;\r\n }\r\n\r\n if (errorMessage) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Build of NodeMaterial failed:\\n\" + errorMessage;\r\n }\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { NodeMaterialBlock } from \"./nodeMaterialBlock\";\r\nimport { PushMaterial } from \"../pushMaterial\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Matrix, Vector2 } from \"../../Maths/math.vector\";\r\nimport { Color3, Color4 } from \"../../Maths/math.color\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport { Engine } from \"../../Engines/engine\";\r\nimport { NodeMaterialBuildState } from \"./nodeMaterialBuildState\";\r\nimport type { IEffectCreationOptions } from \"../effect\";\r\nimport { Effect } from \"../effect\";\r\nimport type { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { NodeMaterialBlockTargets } from \"./Enums/nodeMaterialBlockTargets\";\r\nimport { NodeMaterialBuildStateSharedData } from \"./nodeMaterialBuildStateSharedData\";\r\nimport type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport { MaterialDefines } from \"../../Materials/materialDefines\";\r\nimport type { NodeMaterialOptimizer } from \"./Optimizers/nodeMaterialOptimizer\";\r\nimport type { ImageProcessingConfiguration } from \"../imageProcessingConfiguration\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { TransformBlock } from \"./Blocks/transformBlock\";\r\nimport { VertexOutputBlock } from \"./Blocks/Vertex/vertexOutputBlock\";\r\nimport { FragmentOutputBlock } from \"./Blocks/Fragment/fragmentOutputBlock\";\r\nimport { InputBlock } from \"./Blocks/Input/inputBlock\";\r\nimport { GetClass, RegisterClass } from \"../../Misc/typeStore\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport type { TextureBlock } from \"./Blocks/Dual/textureBlock\";\r\nimport type { ReflectionTextureBaseBlock } from \"./Blocks/Dual/reflectionTextureBaseBlock\";\r\nimport type { RefractionBlock } from \"./Blocks/PBR/refractionBlock\";\r\nimport { CurrentScreenBlock } from \"./Blocks/Dual/currentScreenBlock\";\r\nimport { ParticleTextureBlock } from \"./Blocks/Particle/particleTextureBlock\";\r\nimport { ParticleRampGradientBlock } from \"./Blocks/Particle/particleRampGradientBlock\";\r\nimport { ParticleBlendMultiplyBlock } from \"./Blocks/Particle/particleBlendMultiplyBlock\";\r\nimport { EffectFallbacks } from \"../effectFallbacks\";\r\nimport { WebRequest } from \"../../Misc/webRequest\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport { VectorMergerBlock } from \"./Blocks/vectorMergerBlock\";\r\nimport { RemapBlock } from \"./Blocks/remapBlock\";\r\nimport { MultiplyBlock } from \"./Blocks/multiplyBlock\";\r\nimport { NodeMaterialModes } from \"./Enums/nodeMaterialModes\";\r\nimport { Texture } from \"../Textures/texture\";\r\nimport type { IParticleSystem } from \"../../Particles/IParticleSystem\";\r\nimport { BaseParticleSystem } from \"../../Particles/baseParticleSystem\";\r\nimport { ColorSplitterBlock } from \"./Blocks/colorSplitterBlock\";\r\nimport { TimingTools } from \"../../Misc/timingTools\";\r\nimport { ProceduralTexture } from \"../Textures/Procedurals/proceduralTexture\";\r\nimport { AnimatedInputBlockTypes } from \"./Blocks/Input/animatedInputBlockTypes\";\r\nimport { TrigonometryBlock, TrigonometryBlockOperations } from \"./Blocks/trigonometryBlock\";\r\nimport { NodeMaterialSystemValues } from \"./Enums/nodeMaterialSystemValues\";\r\nimport type { ImageSourceBlock } from \"./Blocks/Dual/imageSourceBlock\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport type { Material } from \"../material\";\r\nimport type { TriPlanarBlock } from \"./Blocks/triPlanarBlock\";\r\nimport type { BiPlanarBlock } from \"./Blocks/biPlanarBlock\";\r\nimport type { PrePassRenderer } from \"../../Rendering/prePassRenderer\";\r\nimport type { PrePassTextureBlock } from \"./Blocks/Input/prePassTextureBlock\";\r\nimport type { PrePassOutputBlock } from \"./Blocks/Fragment/prePassOutputBlock\";\r\nimport type { NodeMaterialTeleportOutBlock } from \"./Blocks/Teleport/teleportOutBlock\";\r\nimport type { NodeMaterialTeleportInBlock } from \"./Blocks/Teleport/teleportInBlock\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { PrepareDefinesForCamera, PrepareDefinesForPrePass } from \"../materialHelper.functions\";\r\nimport type { IImageProcessingConfigurationDefines } from \"../imageProcessingConfiguration.defines\";\r\n\r\nconst onCreatedEffectParameters = { effect: null as unknown as Effect, subMesh: null as unknown as Nullable };\r\n\r\n// declare NODEEDITOR namespace for compilation issue\r\ndeclare let NODEEDITOR: any;\r\ndeclare let BABYLON: any;\r\n\r\n/**\r\n * Interface used to configure the node material editor\r\n */\r\nexport interface INodeMaterialEditorOptions {\r\n /** Define the URL to load node editor script from */\r\n editorURL?: string;\r\n /** Additional configuration for the NME */\r\n nodeEditorConfig?: {\r\n backgroundColor?: Color4;\r\n };\r\n}\r\n\r\n/** @internal */\r\nexport class NodeMaterialDefines extends MaterialDefines implements IImageProcessingConfigurationDefines {\r\n /** Normal */\r\n public NORMAL = false;\r\n /** Tangent */\r\n public TANGENT = false;\r\n /** Vertex color */\r\n public VERTEXCOLOR_NME = false;\r\n /** Uv1 **/\r\n public UV1 = false;\r\n /** Uv2 **/\r\n public UV2 = false;\r\n /** Uv3 **/\r\n public UV3 = false;\r\n /** Uv4 **/\r\n public UV4 = false;\r\n /** Uv5 **/\r\n public UV5 = false;\r\n /** Uv6 **/\r\n public UV6 = false;\r\n\r\n /** Prepass **/\r\n public PREPASS = false;\r\n /** Prepass normal */\r\n public PREPASS_NORMAL = false;\r\n /** Prepass normal index */\r\n public PREPASS_NORMAL_INDEX = -1;\r\n /** Prepass position */\r\n public PREPASS_POSITION = false;\r\n /** Prepass position index */\r\n public PREPASS_POSITION_INDEX = -1;\r\n /** Prepass depth */\r\n public PREPASS_DEPTH = false;\r\n /** Prepass depth index */\r\n public PREPASS_DEPTH_INDEX = -1;\r\n /** Scene MRT count */\r\n public SCENE_MRT_COUNT = 0;\r\n\r\n /** BONES */\r\n public NUM_BONE_INFLUENCERS = 0;\r\n /** Bones per mesh */\r\n public BonesPerMesh = 0;\r\n /** Using texture for bone storage */\r\n public BONETEXTURE = false;\r\n\r\n /** MORPH TARGETS */\r\n public MORPHTARGETS = false;\r\n /** Morph target normal */\r\n public MORPHTARGETS_NORMAL = false;\r\n /** Morph target tangent */\r\n public MORPHTARGETS_TANGENT = false;\r\n /** Morph target uv */\r\n public MORPHTARGETS_UV = false;\r\n /** Number of morph influencers */\r\n public NUM_MORPH_INFLUENCERS = 0;\r\n /** Using a texture to store morph target data */\r\n public MORPHTARGETS_TEXTURE = false;\r\n\r\n /** IMAGE PROCESSING */\r\n public IMAGEPROCESSING = false;\r\n /** Vignette */\r\n public VIGNETTE = false;\r\n /** Multiply blend mode for vignette */\r\n public VIGNETTEBLENDMODEMULTIPLY = false;\r\n /** Opaque blend mode for vignette */\r\n public VIGNETTEBLENDMODEOPAQUE = false;\r\n /** Tone mapping */\r\n public TONEMAPPING = false;\r\n /** ACES tone mapping mode */\r\n public TONEMAPPING_ACES = false;\r\n /** Contrast */\r\n public CONTRAST = false;\r\n /** Exposure */\r\n public EXPOSURE = false;\r\n /** Color curves */\r\n public COLORCURVES = false;\r\n /** Color grading */\r\n public COLORGRADING = false;\r\n /** 3D color grading */\r\n public COLORGRADING3D = false;\r\n /** Sampler green depth */\r\n public SAMPLER3DGREENDEPTH = false;\r\n /** Sampler for BGR map */\r\n public SAMPLER3DBGRMAP = false;\r\n /** Dithering */\r\n public DITHER = false;\r\n /** Using post process for image processing */\r\n public IMAGEPROCESSINGPOSTPROCESS = false;\r\n /** Skip color clamp */\r\n public SKIPFINALCOLORCLAMP = false;\r\n\r\n /** MISC. */\r\n public BUMPDIRECTUV = 0;\r\n /** Camera is orthographic */\r\n public CAMERA_ORTHOGRAPHIC = false;\r\n /** Camera is perspective */\r\n public CAMERA_PERSPECTIVE = false;\r\n\r\n /**\r\n * Creates a new NodeMaterialDefines\r\n */\r\n constructor() {\r\n super();\r\n this.rebuild();\r\n }\r\n\r\n /**\r\n * Set the value of a specific key\r\n * @param name defines the name of the key to set\r\n * @param value defines the value to set\r\n * @param markAsUnprocessedIfDirty Flag to indicate to the cache that this value needs processing\r\n */\r\n public setValue(name: string, value: any, markAsUnprocessedIfDirty = false) {\r\n if (this[name] === undefined) {\r\n this._keys.push(name);\r\n }\r\n\r\n if (markAsUnprocessedIfDirty && this[name] !== value) {\r\n this.markAsUnprocessed();\r\n }\r\n\r\n this[name] = value;\r\n }\r\n}\r\n\r\n/**\r\n * Class used to configure NodeMaterial\r\n */\r\nexport interface INodeMaterialOptions {\r\n /**\r\n * Defines if blocks should emit comments\r\n */\r\n emitComments: boolean;\r\n}\r\n\r\n/**\r\n * Blocks that manage a texture\r\n */\r\nexport type NodeMaterialTextureBlocks =\r\n | TextureBlock\r\n | ReflectionTextureBaseBlock\r\n | RefractionBlock\r\n | CurrentScreenBlock\r\n | ParticleTextureBlock\r\n | ImageSourceBlock\r\n | TriPlanarBlock\r\n | BiPlanarBlock\r\n | PrePassTextureBlock;\r\n\r\n/**\r\n * Class used to create a node based material built by assembling shader blocks\r\n */\r\nexport class NodeMaterial extends PushMaterial {\r\n private static _BuildIdGenerator: number = 0;\r\n private _options: INodeMaterialOptions;\r\n private _vertexCompilationState: NodeMaterialBuildState;\r\n private _fragmentCompilationState: NodeMaterialBuildState;\r\n private _sharedData: NodeMaterialBuildStateSharedData;\r\n private _buildId: number = NodeMaterial._BuildIdGenerator++;\r\n private _buildWasSuccessful = false;\r\n private _cachedWorldViewMatrix = new Matrix();\r\n private _cachedWorldViewProjectionMatrix = new Matrix();\r\n private _optimizers = new Array();\r\n private _animationFrame = -1;\r\n\r\n /** Define the Url to load node editor script */\r\n public static EditorURL = `${Tools._DefaultCdnUrl}/v${Engine.Version}/nodeEditor/babylon.nodeEditor.js`;\r\n\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n /** Gets or sets a boolean indicating that node materials should not deserialize textures from json / snippet content */\r\n public static IgnoreTexturesAtLoadTime = false;\r\n\r\n /**\r\n * Checks if a block is a texture block\r\n * @param block The block to check\r\n * @returns True if the block is a texture block\r\n */\r\n public static _BlockIsTextureBlock(block: NodeMaterialBlock): block is NodeMaterialTextureBlocks {\r\n return (\r\n block.getClassName() === \"TextureBlock\" ||\r\n block.getClassName() === \"ReflectionTextureBaseBlock\" ||\r\n block.getClassName() === \"ReflectionTextureBlock\" ||\r\n block.getClassName() === \"ReflectionBlock\" ||\r\n block.getClassName() === \"RefractionBlock\" ||\r\n block.getClassName() === \"CurrentScreenBlock\" ||\r\n block.getClassName() === \"ParticleTextureBlock\" ||\r\n block.getClassName() === \"ImageSourceBlock\" ||\r\n block.getClassName() === \"TriPlanarBlock\" ||\r\n block.getClassName() === \"BiPlanarBlock\" ||\r\n block.getClassName() === \"PrePassTextureBlock\"\r\n );\r\n }\r\n\r\n private BJSNODEMATERIALEDITOR = this._getGlobalNodeMaterialEditor();\r\n\r\n /** Get the inspector from bundle or global\r\n * @returns the global NME\r\n */\r\n private _getGlobalNodeMaterialEditor(): any {\r\n // UMD Global name detection from Webpack Bundle UMD Name.\r\n if (typeof NODEEDITOR !== \"undefined\") {\r\n return NODEEDITOR;\r\n }\r\n\r\n // In case of module let's check the global emitted from the editor entry point.\r\n if (typeof BABYLON !== \"undefined\" && typeof BABYLON.NodeEditor !== \"undefined\") {\r\n return BABYLON;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Snippet ID if the material was created from the snippet server\r\n */\r\n public snippetId: string;\r\n\r\n /**\r\n * Gets or sets data used by visual editor\r\n * @see https://nme.babylonjs.com\r\n */\r\n public editorData: any = null;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that alpha value must be ignored (This will turn alpha blending off even if an alpha value is produced by the material)\r\n */\r\n @serialize()\r\n public ignoreAlpha = false;\r\n\r\n /**\r\n * Defines the maximum number of lights that can be used in the material\r\n */\r\n @serialize()\r\n public maxSimultaneousLights = 4;\r\n\r\n /**\r\n * Observable raised when the material is built\r\n */\r\n public onBuildObservable = new Observable();\r\n\r\n /**\r\n * Gets or sets the root nodes of the material vertex shader\r\n */\r\n public _vertexOutputNodes = new Array();\r\n\r\n /**\r\n * Gets or sets the root nodes of the material fragment (pixel) shader\r\n */\r\n public _fragmentOutputNodes = new Array();\r\n\r\n /** Gets or sets options to control the node material overall behavior */\r\n public get options() {\r\n return this._options;\r\n }\r\n\r\n public set options(options: INodeMaterialOptions) {\r\n this._options = options;\r\n }\r\n\r\n /**\r\n * Default configuration related to image processing available in the standard Material.\r\n */\r\n protected _imageProcessingConfiguration: ImageProcessingConfiguration;\r\n\r\n /**\r\n * Gets the image processing configuration used either in this material.\r\n */\r\n public get imageProcessingConfiguration(): ImageProcessingConfiguration {\r\n return this._imageProcessingConfiguration;\r\n }\r\n\r\n /**\r\n * Sets the Default image processing configuration used either in the this material.\r\n *\r\n * If sets to null, the scene one is in use.\r\n */\r\n public set imageProcessingConfiguration(value: ImageProcessingConfiguration) {\r\n this._attachImageProcessingConfiguration(value);\r\n\r\n // Ensure the effect will be rebuilt.\r\n this._markAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n /**\r\n * Gets an array of blocks that needs to be serialized even if they are not yet connected\r\n */\r\n public attachedBlocks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * Specifies the mode of the node material\r\n * @internal\r\n */\r\n @serialize(\"mode\")\r\n public _mode: NodeMaterialModes = NodeMaterialModes.Material;\r\n\r\n /**\r\n * Gets or sets the mode property\r\n */\r\n public get mode(): NodeMaterialModes {\r\n return this._mode;\r\n }\r\n\r\n public set mode(value: NodeMaterialModes) {\r\n this._mode = value;\r\n }\r\n\r\n /** Gets or sets the unique identifier used to identified the effect associated with the material */\r\n public get buildId() {\r\n return this._buildId;\r\n }\r\n\r\n public set buildId(value: number) {\r\n this._buildId = value;\r\n }\r\n\r\n /**\r\n * A free comment about the material\r\n */\r\n @serialize(\"comment\")\r\n public comment: string;\r\n\r\n /**\r\n * Create a new node based material\r\n * @param name defines the material name\r\n * @param scene defines the hosting scene\r\n * @param options defines creation option\r\n */\r\n constructor(name: string, scene?: Scene, options: Partial = {}) {\r\n super(name, scene || EngineStore.LastCreatedScene!);\r\n\r\n this._options = {\r\n emitComments: false,\r\n ...options,\r\n };\r\n\r\n // Setup the default processing configuration to the scene.\r\n this._attachImageProcessingConfiguration(null);\r\n }\r\n\r\n /**\r\n * Gets the current class name of the material e.g. \"NodeMaterial\"\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"NodeMaterial\";\r\n }\r\n\r\n /**\r\n * Keep track of the image processing observer to allow dispose and replace.\r\n */\r\n private _imageProcessingObserver: Nullable>;\r\n\r\n /**\r\n * Attaches a new image processing configuration to the Standard Material.\r\n * @param configuration\r\n */\r\n protected _attachImageProcessingConfiguration(configuration: Nullable): void {\r\n if (configuration === this._imageProcessingConfiguration) {\r\n return;\r\n }\r\n\r\n // Detaches observer.\r\n if (this._imageProcessingConfiguration && this._imageProcessingObserver) {\r\n this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver);\r\n }\r\n\r\n // Pick the scene configuration if needed.\r\n if (!configuration) {\r\n this._imageProcessingConfiguration = this.getScene().imageProcessingConfiguration;\r\n } else {\r\n this._imageProcessingConfiguration = configuration;\r\n }\r\n\r\n // Attaches observer.\r\n if (this._imageProcessingConfiguration) {\r\n this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add(() => {\r\n this._markAllSubMeshesAsImageProcessingDirty();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get a block by its name\r\n * @param name defines the name of the block to retrieve\r\n * @returns the required block or null if not found\r\n */\r\n public getBlockByName(name: string) {\r\n let result = null;\r\n for (const block of this.attachedBlocks) {\r\n if (block.name === name) {\r\n if (!result) {\r\n result = block;\r\n } else {\r\n Tools.Warn(\"More than one block was found with the name `\" + name + \"`\");\r\n return result;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get a block using a predicate\r\n * @param predicate defines the predicate used to find the good candidate\r\n * @returns the required block or null if not found\r\n */\r\n public getBlockByPredicate(predicate: (block: NodeMaterialBlock) => boolean) {\r\n for (const block of this.attachedBlocks) {\r\n if (predicate(block)) {\r\n return block;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Get an input block using a predicate\r\n * @param predicate defines the predicate used to find the good candidate\r\n * @returns the required input block or null if not found\r\n */\r\n public getInputBlockByPredicate(predicate: (block: InputBlock) => boolean): Nullable {\r\n for (const block of this.attachedBlocks) {\r\n if (block.isInput && predicate(block as InputBlock)) {\r\n return block as InputBlock;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the list of input blocks attached to this material\r\n * @returns an array of InputBlocks\r\n */\r\n public getInputBlocks() {\r\n const blocks: InputBlock[] = [];\r\n for (const block of this.attachedBlocks) {\r\n if (block.isInput) {\r\n blocks.push(block as InputBlock);\r\n }\r\n }\r\n\r\n return blocks;\r\n }\r\n\r\n /**\r\n * Adds a new optimizer to the list of optimizers\r\n * @param optimizer defines the optimizers to add\r\n * @returns the current material\r\n */\r\n public registerOptimizer(optimizer: NodeMaterialOptimizer) {\r\n const index = this._optimizers.indexOf(optimizer);\r\n\r\n if (index > -1) {\r\n return;\r\n }\r\n\r\n this._optimizers.push(optimizer);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove an optimizer from the list of optimizers\r\n * @param optimizer defines the optimizers to remove\r\n * @returns the current material\r\n */\r\n public unregisterOptimizer(optimizer: NodeMaterialOptimizer) {\r\n const index = this._optimizers.indexOf(optimizer);\r\n\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n this._optimizers.splice(index, 1);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a new block to the list of output nodes\r\n * @param node defines the node to add\r\n * @returns the current material\r\n */\r\n public addOutputNode(node: NodeMaterialBlock) {\r\n if (node.target === null) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"This node is not meant to be an output node. You may want to explicitly set its target value.\";\r\n }\r\n\r\n if ((node.target & NodeMaterialBlockTargets.Vertex) !== 0) {\r\n this._addVertexOutputNode(node);\r\n }\r\n\r\n if ((node.target & NodeMaterialBlockTargets.Fragment) !== 0) {\r\n this._addFragmentOutputNode(node);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a block from the list of root nodes\r\n * @param node defines the node to remove\r\n * @returns the current material\r\n */\r\n public removeOutputNode(node: NodeMaterialBlock) {\r\n if (node.target === null) {\r\n return this;\r\n }\r\n\r\n if ((node.target & NodeMaterialBlockTargets.Vertex) !== 0) {\r\n this._removeVertexOutputNode(node);\r\n }\r\n\r\n if ((node.target & NodeMaterialBlockTargets.Fragment) !== 0) {\r\n this._removeFragmentOutputNode(node);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private _addVertexOutputNode(node: NodeMaterialBlock) {\r\n if (this._vertexOutputNodes.indexOf(node) !== -1) {\r\n return;\r\n }\r\n\r\n node.target = NodeMaterialBlockTargets.Vertex;\r\n this._vertexOutputNodes.push(node);\r\n\r\n return this;\r\n }\r\n\r\n private _removeVertexOutputNode(node: NodeMaterialBlock) {\r\n const index = this._vertexOutputNodes.indexOf(node);\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n this._vertexOutputNodes.splice(index, 1);\r\n\r\n return this;\r\n }\r\n\r\n private _addFragmentOutputNode(node: NodeMaterialBlock) {\r\n if (this._fragmentOutputNodes.indexOf(node) !== -1) {\r\n return;\r\n }\r\n\r\n node.target = NodeMaterialBlockTargets.Fragment;\r\n this._fragmentOutputNodes.push(node);\r\n\r\n return this;\r\n }\r\n\r\n private _removeFragmentOutputNode(node: NodeMaterialBlock) {\r\n const index = this._fragmentOutputNodes.indexOf(node);\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n this._fragmentOutputNodes.splice(index, 1);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that alpha blending must be enabled no matter what alpha value or alpha channel of the FragmentBlock are\r\n */\r\n @serialize()\r\n public forceAlphaBlending = false;\r\n\r\n /**\r\n * Specifies if the material will require alpha blending\r\n * @returns a boolean specifying if alpha blending is needed\r\n */\r\n public needAlphaBlending(): boolean {\r\n if (this.ignoreAlpha) {\r\n return false;\r\n }\r\n return this.forceAlphaBlending || this.alpha < 1.0 || (this._sharedData && this._sharedData.hints.needAlphaBlending);\r\n }\r\n\r\n /**\r\n * Specifies if this material should be rendered in alpha test mode\r\n * @returns a boolean specifying if an alpha test is needed.\r\n */\r\n public needAlphaTesting(): boolean {\r\n return this._sharedData && this._sharedData.hints.needAlphaTesting;\r\n }\r\n\r\n private _processInitializeOnLink(block: NodeMaterialBlock, state: NodeMaterialBuildState, nodesToProcessForOtherBuildState: NodeMaterialBlock[], autoConfigure = true) {\r\n if (block.target === NodeMaterialBlockTargets.VertexAndFragment) {\r\n nodesToProcessForOtherBuildState.push(block);\r\n } else if (state.target === NodeMaterialBlockTargets.Fragment && block.target === NodeMaterialBlockTargets.Vertex && block._preparationId !== this._buildId) {\r\n nodesToProcessForOtherBuildState.push(block);\r\n }\r\n this._initializeBlock(block, state, nodesToProcessForOtherBuildState, autoConfigure);\r\n }\r\n\r\n private _initializeBlock(node: NodeMaterialBlock, state: NodeMaterialBuildState, nodesToProcessForOtherBuildState: NodeMaterialBlock[], autoConfigure = true) {\r\n node.initialize(state);\r\n if (autoConfigure) {\r\n node.autoConfigure(this);\r\n }\r\n node._preparationId = this._buildId;\r\n\r\n if (this.attachedBlocks.indexOf(node) === -1) {\r\n if (node.isUnique) {\r\n const className = node.getClassName();\r\n\r\n for (const other of this.attachedBlocks) {\r\n if (other.getClassName() === className) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw `Cannot have multiple blocks of type ${className} in the same NodeMaterial`;\r\n }\r\n }\r\n }\r\n this.attachedBlocks.push(node);\r\n }\r\n\r\n for (const input of node.inputs) {\r\n input.associatedVariableName = \"\";\r\n\r\n const connectedPoint = input.connectedPoint;\r\n if (connectedPoint) {\r\n const block = connectedPoint.ownerBlock;\r\n if (block !== node) {\r\n this._processInitializeOnLink(block, state, nodesToProcessForOtherBuildState, autoConfigure);\r\n }\r\n }\r\n }\r\n\r\n // Teleportation\r\n if (node.isTeleportOut) {\r\n const teleport = node as NodeMaterialTeleportOutBlock;\r\n if (teleport.entryPoint) {\r\n this._processInitializeOnLink(teleport.entryPoint, state, nodesToProcessForOtherBuildState, autoConfigure);\r\n }\r\n }\r\n\r\n for (const output of node.outputs) {\r\n output.associatedVariableName = \"\";\r\n }\r\n }\r\n\r\n private _resetDualBlocks(node: NodeMaterialBlock, id: number) {\r\n if (node.target === NodeMaterialBlockTargets.VertexAndFragment) {\r\n node.buildId = id;\r\n }\r\n\r\n for (const inputs of node.inputs) {\r\n const connectedPoint = inputs.connectedPoint;\r\n if (connectedPoint) {\r\n const block = connectedPoint.ownerBlock;\r\n if (block !== node) {\r\n this._resetDualBlocks(block, id);\r\n }\r\n }\r\n }\r\n\r\n // If this is a teleport out, we need to reset the connected block\r\n if (node.isTeleportOut) {\r\n const teleportOut = node as NodeMaterialTeleportOutBlock;\r\n if (teleportOut.entryPoint) {\r\n this._resetDualBlocks(teleportOut.entryPoint, id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove a block from the current node material\r\n * @param block defines the block to remove\r\n */\r\n public removeBlock(block: NodeMaterialBlock) {\r\n const attachedBlockIndex = this.attachedBlocks.indexOf(block);\r\n if (attachedBlockIndex > -1) {\r\n this.attachedBlocks.splice(attachedBlockIndex, 1);\r\n }\r\n\r\n if (block.isFinalMerger) {\r\n this.removeOutputNode(block);\r\n }\r\n }\r\n\r\n /**\r\n * Build the material and generates the inner effect\r\n * @param verbose defines if the build should log activity\r\n * @param updateBuildId defines if the internal build Id should be updated (default is true)\r\n * @param autoConfigure defines if the autoConfigure method should be called when initializing blocks (default is false)\r\n */\r\n public build(verbose: boolean = false, updateBuildId = true, autoConfigure = false) {\r\n // First time?\r\n if (!this._vertexCompilationState && !autoConfigure) {\r\n autoConfigure = true;\r\n }\r\n\r\n this._buildWasSuccessful = false;\r\n const engine = this.getScene().getEngine();\r\n\r\n const allowEmptyVertexProgram = this._mode === NodeMaterialModes.Particle;\r\n\r\n if (this._vertexOutputNodes.length === 0 && !allowEmptyVertexProgram) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"You must define at least one vertexOutputNode\";\r\n }\r\n\r\n if (this._fragmentOutputNodes.length === 0) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"You must define at least one fragmentOutputNode\";\r\n }\r\n\r\n // Compilation state\r\n this._vertexCompilationState = new NodeMaterialBuildState();\r\n this._vertexCompilationState.supportUniformBuffers = engine.supportsUniformBuffers;\r\n this._vertexCompilationState.target = NodeMaterialBlockTargets.Vertex;\r\n this._fragmentCompilationState = new NodeMaterialBuildState();\r\n this._fragmentCompilationState.supportUniformBuffers = engine.supportsUniformBuffers;\r\n this._fragmentCompilationState.target = NodeMaterialBlockTargets.Fragment;\r\n\r\n // Shared data\r\n this._sharedData = new NodeMaterialBuildStateSharedData();\r\n this._sharedData.nodeMaterial = this;\r\n this._sharedData.fragmentOutputNodes = this._fragmentOutputNodes;\r\n this._vertexCompilationState.sharedData = this._sharedData;\r\n this._fragmentCompilationState.sharedData = this._sharedData;\r\n this._sharedData.buildId = this._buildId;\r\n this._sharedData.emitComments = this._options.emitComments;\r\n this._sharedData.verbose = verbose;\r\n this._sharedData.scene = this.getScene();\r\n this._sharedData.allowEmptyVertexProgram = allowEmptyVertexProgram;\r\n\r\n // Initialize blocks\r\n const vertexNodes: NodeMaterialBlock[] = [];\r\n const fragmentNodes: NodeMaterialBlock[] = [];\r\n\r\n for (const vertexOutputNode of this._vertexOutputNodes) {\r\n vertexNodes.push(vertexOutputNode);\r\n this._initializeBlock(vertexOutputNode, this._vertexCompilationState, fragmentNodes, autoConfigure);\r\n }\r\n\r\n for (const fragmentOutputNode of this._fragmentOutputNodes) {\r\n fragmentNodes.push(fragmentOutputNode);\r\n this._initializeBlock(fragmentOutputNode, this._fragmentCompilationState, vertexNodes, autoConfigure);\r\n }\r\n\r\n // Optimize\r\n this.optimize();\r\n\r\n // Vertex\r\n for (const vertexOutputNode of vertexNodes) {\r\n vertexOutputNode.build(this._vertexCompilationState, vertexNodes);\r\n }\r\n\r\n // Fragment\r\n this._fragmentCompilationState.uniforms = this._vertexCompilationState.uniforms.slice(0);\r\n this._fragmentCompilationState._uniformDeclaration = this._vertexCompilationState._uniformDeclaration;\r\n this._fragmentCompilationState._constantDeclaration = this._vertexCompilationState._constantDeclaration;\r\n this._fragmentCompilationState._vertexState = this._vertexCompilationState;\r\n\r\n for (const fragmentOutputNode of fragmentNodes) {\r\n this._resetDualBlocks(fragmentOutputNode, this._buildId - 1);\r\n }\r\n\r\n for (const fragmentOutputNode of fragmentNodes) {\r\n fragmentOutputNode.build(this._fragmentCompilationState, fragmentNodes);\r\n }\r\n\r\n // Finalize\r\n this._vertexCompilationState.finalize(this._vertexCompilationState);\r\n this._fragmentCompilationState.finalize(this._fragmentCompilationState);\r\n\r\n if (updateBuildId) {\r\n this._buildId = NodeMaterial._BuildIdGenerator++;\r\n }\r\n\r\n // Errors\r\n this._sharedData.emitErrors();\r\n\r\n if (verbose) {\r\n Logger.Log(\"Vertex shader:\");\r\n Logger.Log(this._vertexCompilationState.compilationString);\r\n Logger.Log(\"Fragment shader:\");\r\n Logger.Log(this._fragmentCompilationState.compilationString);\r\n }\r\n\r\n this._buildWasSuccessful = true;\r\n this.onBuildObservable.notifyObservers(this);\r\n\r\n // Wipe defines\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n if (subMesh.getMaterial() !== this) {\r\n continue;\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n continue;\r\n }\r\n\r\n const defines = subMesh.materialDefines;\r\n defines.markAllAsDirty();\r\n defines.reset();\r\n }\r\n }\r\n\r\n if (this.prePassTextureInputs.length) {\r\n this.getScene().enablePrePassRenderer();\r\n }\r\n const prePassRenderer = this.getScene().prePassRenderer;\r\n if (prePassRenderer) {\r\n prePassRenderer.markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Runs an otpimization phase to try to improve the shader code\r\n */\r\n public optimize() {\r\n for (const optimizer of this._optimizers) {\r\n optimizer.optimize(this._vertexOutputNodes, this._fragmentOutputNodes);\r\n }\r\n }\r\n\r\n private _prepareDefinesForAttributes(mesh: AbstractMesh, defines: NodeMaterialDefines) {\r\n const oldNormal = defines[\"NORMAL\"];\r\n const oldTangent = defines[\"TANGENT\"];\r\n const oldColor = defines[\"VERTEXCOLOR_NME\"];\r\n\r\n defines[\"NORMAL\"] = mesh.isVerticesDataPresent(VertexBuffer.NormalKind);\r\n defines[\"TANGENT\"] = mesh.isVerticesDataPresent(VertexBuffer.TangentKind);\r\n\r\n const hasVertexColors = mesh.useVertexColors && mesh.isVerticesDataPresent(VertexBuffer.ColorKind);\r\n defines[\"VERTEXCOLOR_NME\"] = hasVertexColors;\r\n\r\n let uvChanged = false;\r\n for (let i = 1; i <= Constants.MAX_SUPPORTED_UV_SETS; ++i) {\r\n const oldUV = defines[\"UV\" + i];\r\n defines[\"UV\" + i] = mesh.isVerticesDataPresent(`uv${i === 1 ? \"\" : i}`);\r\n uvChanged = uvChanged || defines[\"UV\" + i] !== oldUV;\r\n }\r\n\r\n // PrePass\r\n const oit = this.needAlphaBlendingForMesh(mesh) && this.getScene().useOrderIndependentTransparency;\r\n PrepareDefinesForPrePass(this.getScene(), defines, !oit);\r\n\r\n if (oldNormal !== defines[\"NORMAL\"] || oldTangent !== defines[\"TANGENT\"] || oldColor !== defines[\"VERTEXCOLOR_NME\"] || uvChanged) {\r\n defines.markAsAttributesDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Can this material render to prepass\r\n */\r\n public get isPrePassCapable(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Outputs written to the prepass\r\n */\r\n public get prePassTextureOutputs(): number[] {\r\n const prePassOutputBlock = this.getBlockByPredicate((block) => block.getClassName() === \"PrePassOutputBlock\") as PrePassOutputBlock;\r\n const result = [Constants.PREPASS_COLOR_TEXTURE_TYPE];\r\n if (!prePassOutputBlock) {\r\n return result;\r\n }\r\n // Cannot write to prepass if we alread read from prepass\r\n if (this.prePassTextureInputs.length) {\r\n return result;\r\n }\r\n\r\n if (prePassOutputBlock.viewDepth.isConnected) {\r\n result.push(Constants.PREPASS_DEPTH_TEXTURE_TYPE);\r\n }\r\n\r\n if (prePassOutputBlock.viewNormal.isConnected) {\r\n result.push(Constants.PREPASS_NORMAL_TEXTURE_TYPE);\r\n }\r\n\r\n if (prePassOutputBlock.worldPosition.isConnected) {\r\n result.push(Constants.PREPASS_POSITION_TEXTURE_TYPE);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the list of prepass texture required\r\n */\r\n public get prePassTextureInputs(): number[] {\r\n const prePassTextureBlocks = this.getAllTextureBlocks().filter((block) => block.getClassName() === \"PrePassTextureBlock\") as PrePassTextureBlock[];\r\n const result = [] as number[];\r\n\r\n for (const block of prePassTextureBlocks) {\r\n if (block.position.isConnected && !result.includes(Constants.PREPASS_POSITION_TEXTURE_TYPE)) {\r\n result.push(Constants.PREPASS_POSITION_TEXTURE_TYPE);\r\n }\r\n if (block.depth.isConnected && !result.includes(Constants.PREPASS_DEPTH_TEXTURE_TYPE)) {\r\n result.push(Constants.PREPASS_DEPTH_TEXTURE_TYPE);\r\n }\r\n if (block.normal.isConnected && !result.includes(Constants.PREPASS_NORMAL_TEXTURE_TYPE)) {\r\n result.push(Constants.PREPASS_NORMAL_TEXTURE_TYPE);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the required values to the prepass renderer.\r\n * @param prePassRenderer defines the prepass renderer to set\r\n * @returns true if the pre pass is needed\r\n */\r\n public setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean {\r\n const prePassTexturesRequired = this.prePassTextureInputs.concat(this.prePassTextureOutputs);\r\n\r\n if (prePassRenderer && prePassTexturesRequired.length > 1) {\r\n let cfg = prePassRenderer.getEffectConfiguration(\"nodeMaterial\");\r\n if (!cfg) {\r\n cfg = prePassRenderer.addEffectConfiguration({\r\n enabled: true,\r\n needsImageProcessing: false,\r\n name: \"nodeMaterial\",\r\n texturesRequired: [],\r\n });\r\n }\r\n for (const prePassTexture of prePassTexturesRequired) {\r\n if (!cfg.texturesRequired.includes(prePassTexture)) {\r\n cfg.texturesRequired.push(prePassTexture);\r\n }\r\n }\r\n cfg.enabled = true;\r\n }\r\n\r\n // COLOR_TEXTURE is always required for prepass, length > 1 means\r\n // we actually need to write to special prepass textures\r\n return prePassTexturesRequired.length > 1;\r\n }\r\n\r\n /**\r\n * Create a post process from the material\r\n * @param camera The camera to apply the render pass to.\r\n * @param options The required width/height ratio to downsize to before computing the render pass. (Use 1.0 for full size)\r\n * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)\r\n * @param engine The engine which the post process will be applied. (default: current engine)\r\n * @param reusable If the post process can be reused on the same frame. (default: false)\r\n * @param textureType Type of textures used when performing the post process. (default: 0)\r\n * @param textureFormat Format of textures used when performing the post process. (default: TEXTUREFORMAT_RGBA)\r\n * @returns the post process created\r\n */\r\n public createPostProcess(\r\n camera: Nullable,\r\n options: number | PostProcessOptions = 1,\r\n samplingMode: number = Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n engine?: Engine,\r\n reusable?: boolean,\r\n textureType: number = Constants.TEXTURETYPE_UNSIGNED_INT,\r\n textureFormat = Constants.TEXTUREFORMAT_RGBA\r\n ): Nullable {\r\n if (this.mode !== NodeMaterialModes.PostProcess) {\r\n Logger.Log(\"Incompatible material mode\");\r\n return null;\r\n }\r\n return this._createEffectForPostProcess(null, camera, options, samplingMode, engine, reusable, textureType, textureFormat);\r\n }\r\n\r\n /**\r\n * Create the post process effect from the material\r\n * @param postProcess The post process to create the effect for\r\n */\r\n public createEffectForPostProcess(postProcess: PostProcess) {\r\n this._createEffectForPostProcess(postProcess);\r\n }\r\n\r\n private _createEffectForPostProcess(\r\n postProcess: Nullable,\r\n camera?: Nullable,\r\n options: number | PostProcessOptions = 1,\r\n samplingMode: number = Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n engine?: Engine,\r\n reusable?: boolean,\r\n textureType: number = Constants.TEXTURETYPE_UNSIGNED_INT,\r\n textureFormat = Constants.TEXTUREFORMAT_RGBA\r\n ): PostProcess {\r\n let tempName = this.name + this._buildId;\r\n\r\n const defines = new NodeMaterialDefines();\r\n\r\n const dummyMesh = new AbstractMesh(tempName + \"PostProcess\", this.getScene());\r\n\r\n let buildId = this._buildId;\r\n\r\n this._processDefines(dummyMesh, defines);\r\n\r\n Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString);\r\n\r\n if (!postProcess) {\r\n postProcess = new PostProcess(\r\n this.name + \"PostProcess\",\r\n tempName,\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n options,\r\n camera!,\r\n samplingMode,\r\n engine,\r\n reusable,\r\n defines.toString(),\r\n textureType,\r\n tempName,\r\n { maxSimultaneousLights: this.maxSimultaneousLights },\r\n false,\r\n textureFormat\r\n );\r\n } else {\r\n postProcess.updateEffect(\r\n defines.toString(),\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n { maxSimultaneousLights: this.maxSimultaneousLights },\r\n undefined,\r\n undefined,\r\n tempName,\r\n tempName\r\n );\r\n }\r\n\r\n postProcess.nodeMaterialSource = this;\r\n\r\n postProcess.onApplyObservable.add((effect) => {\r\n if (buildId !== this._buildId) {\r\n delete Effect.ShadersStore[tempName + \"VertexShader\"];\r\n delete Effect.ShadersStore[tempName + \"PixelShader\"];\r\n\r\n tempName = this.name + this._buildId;\r\n\r\n defines.markAllAsDirty();\r\n\r\n buildId = this._buildId;\r\n }\r\n\r\n const result = this._processDefines(dummyMesh, defines);\r\n\r\n if (result) {\r\n Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString);\r\n\r\n TimingTools.SetImmediate(() =>\r\n postProcess!.updateEffect(\r\n defines.toString(),\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n { maxSimultaneousLights: this.maxSimultaneousLights },\r\n undefined,\r\n undefined,\r\n tempName,\r\n tempName\r\n )\r\n );\r\n }\r\n\r\n this._checkInternals(effect);\r\n });\r\n\r\n return postProcess;\r\n }\r\n\r\n /**\r\n * Create a new procedural texture based on this node material\r\n * @param size defines the size of the texture\r\n * @param scene defines the hosting scene\r\n * @returns the new procedural texture attached to this node material\r\n */\r\n public createProceduralTexture(size: number | { width: number; height: number; layers?: number }, scene: Scene): Nullable {\r\n if (this.mode !== NodeMaterialModes.ProceduralTexture) {\r\n Logger.Log(\"Incompatible material mode\");\r\n return null;\r\n }\r\n\r\n let tempName = this.name + this._buildId;\r\n\r\n const proceduralTexture = new ProceduralTexture(tempName, size, null, scene);\r\n\r\n const dummyMesh = new AbstractMesh(tempName + \"Procedural\", this.getScene());\r\n dummyMesh.reservedDataStore = {\r\n hidden: true,\r\n };\r\n\r\n const defines = new NodeMaterialDefines();\r\n const result = this._processDefines(dummyMesh, defines);\r\n Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString);\r\n\r\n let effect = this.getScene().getEngine().createEffect(\r\n {\r\n vertexElement: tempName,\r\n fragmentElement: tempName,\r\n },\r\n [VertexBuffer.PositionKind],\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n defines.toString(),\r\n result?.fallbacks,\r\n undefined\r\n );\r\n\r\n proceduralTexture.nodeMaterialSource = this;\r\n proceduralTexture._setEffect(effect);\r\n\r\n let buildId = this._buildId;\r\n proceduralTexture.onBeforeGenerationObservable.add(() => {\r\n if (buildId !== this._buildId) {\r\n delete Effect.ShadersStore[tempName + \"VertexShader\"];\r\n delete Effect.ShadersStore[tempName + \"PixelShader\"];\r\n\r\n tempName = this.name + this._buildId;\r\n\r\n defines.markAllAsDirty();\r\n\r\n buildId = this._buildId;\r\n }\r\n\r\n const result = this._processDefines(dummyMesh, defines);\r\n\r\n if (result) {\r\n Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString);\r\n\r\n TimingTools.SetImmediate(() => {\r\n effect = this.getScene().getEngine().createEffect(\r\n {\r\n vertexElement: tempName,\r\n fragmentElement: tempName,\r\n },\r\n [VertexBuffer.PositionKind],\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n defines.toString(),\r\n result?.fallbacks,\r\n undefined\r\n );\r\n\r\n proceduralTexture._setEffect(effect);\r\n });\r\n }\r\n\r\n this._checkInternals(effect);\r\n });\r\n\r\n return proceduralTexture;\r\n }\r\n\r\n private _createEffectForParticles(\r\n particleSystem: IParticleSystem,\r\n blendMode: number,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n effect?: Effect,\r\n defines?: NodeMaterialDefines,\r\n dummyMesh?: Nullable,\r\n particleSystemDefinesJoined = \"\"\r\n ) {\r\n let tempName = this.name + this._buildId + \"_\" + blendMode;\r\n\r\n if (!defines) {\r\n defines = new NodeMaterialDefines();\r\n }\r\n\r\n if (!dummyMesh) {\r\n dummyMesh = this.getScene().getMeshByName(this.name + \"Particle\");\r\n if (!dummyMesh) {\r\n dummyMesh = new AbstractMesh(this.name + \"Particle\", this.getScene());\r\n dummyMesh.reservedDataStore = {\r\n hidden: true,\r\n };\r\n }\r\n }\r\n\r\n let buildId = this._buildId;\r\n\r\n const particleSystemDefines: Array = [];\r\n let join = particleSystemDefinesJoined;\r\n\r\n if (!effect) {\r\n const result = this._processDefines(dummyMesh, defines);\r\n\r\n Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString);\r\n\r\n particleSystem.fillDefines(particleSystemDefines, blendMode);\r\n\r\n join = particleSystemDefines.join(\"\\n\");\r\n\r\n effect = this.getScene()\r\n .getEngine()\r\n .createEffectForParticles(\r\n tempName,\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n defines.toString() + \"\\n\" + join,\r\n result?.fallbacks,\r\n onCompiled,\r\n onError,\r\n particleSystem\r\n );\r\n\r\n particleSystem.setCustomEffect(effect, blendMode);\r\n }\r\n\r\n effect.onBindObservable.add((effect) => {\r\n if (buildId !== this._buildId) {\r\n delete Effect.ShadersStore[tempName + \"PixelShader\"];\r\n\r\n tempName = this.name + this._buildId + \"_\" + blendMode;\r\n\r\n defines!.markAllAsDirty();\r\n\r\n buildId = this._buildId;\r\n }\r\n\r\n particleSystemDefines.length = 0;\r\n\r\n particleSystem.fillDefines(particleSystemDefines, blendMode);\r\n\r\n const particleSystemDefinesJoinedCurrent = particleSystemDefines.join(\"\\n\");\r\n\r\n if (particleSystemDefinesJoinedCurrent !== join) {\r\n defines!.markAllAsDirty();\r\n join = particleSystemDefinesJoinedCurrent;\r\n }\r\n\r\n const result = this._processDefines(dummyMesh!, defines!);\r\n\r\n if (result) {\r\n Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString);\r\n\r\n effect = this.getScene()\r\n .getEngine()\r\n .createEffectForParticles(\r\n tempName,\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n defines!.toString() + \"\\n\" + join,\r\n result?.fallbacks,\r\n onCompiled,\r\n onError,\r\n particleSystem\r\n );\r\n particleSystem.setCustomEffect(effect, blendMode);\r\n this._createEffectForParticles(particleSystem, blendMode, onCompiled, onError, effect, defines, dummyMesh, particleSystemDefinesJoined); // add the effect.onBindObservable observer\r\n return;\r\n }\r\n\r\n this._checkInternals(effect);\r\n });\r\n }\r\n\r\n private _checkInternals(effect: Effect) {\r\n // Animated blocks\r\n if (this._sharedData.animatedInputs) {\r\n const scene = this.getScene();\r\n\r\n const frameId = scene.getFrameId();\r\n\r\n if (this._animationFrame !== frameId) {\r\n for (const input of this._sharedData.animatedInputs) {\r\n input.animate(scene);\r\n }\r\n\r\n this._animationFrame = frameId;\r\n }\r\n }\r\n\r\n // Bindable blocks\r\n for (const block of this._sharedData.bindableBlocks) {\r\n block.bind(effect, this);\r\n }\r\n\r\n // Connection points\r\n for (const inputBlock of this._sharedData.inputBlocks) {\r\n inputBlock._transmit(effect, this.getScene(), this);\r\n }\r\n }\r\n\r\n /**\r\n * Create the effect to be used as the custom effect for a particle system\r\n * @param particleSystem Particle system to create the effect for\r\n * @param onCompiled defines a function to call when the effect creation is successful\r\n * @param onError defines a function to call when the effect creation has failed\r\n */\r\n public createEffectForParticles(particleSystem: IParticleSystem, onCompiled?: (effect: Effect) => void, onError?: (effect: Effect, errors: string) => void) {\r\n if (this.mode !== NodeMaterialModes.Particle) {\r\n Logger.Log(\"Incompatible material mode\");\r\n return;\r\n }\r\n\r\n this._createEffectForParticles(particleSystem, BaseParticleSystem.BLENDMODE_ONEONE, onCompiled, onError);\r\n this._createEffectForParticles(particleSystem, BaseParticleSystem.BLENDMODE_MULTIPLY, onCompiled, onError);\r\n }\r\n\r\n /**\r\n * Use this material as the shadow depth wrapper of a target material\r\n * @param targetMaterial defines the target material\r\n */\r\n public createAsShadowDepthWrapper(targetMaterial: Material) {\r\n if (this.mode !== NodeMaterialModes.Material) {\r\n Logger.Log(\"Incompatible material mode\");\r\n return;\r\n }\r\n\r\n targetMaterial.shadowDepthWrapper = new BABYLON.ShadowDepthWrapper(this, this.getScene());\r\n }\r\n\r\n private _processDefines(\r\n mesh: AbstractMesh,\r\n defines: NodeMaterialDefines,\r\n useInstances = false,\r\n subMesh?: SubMesh\r\n ): Nullable<{\r\n lightDisposed: boolean;\r\n uniformBuffers: string[];\r\n mergedUniforms: string[];\r\n mergedSamplers: string[];\r\n fallbacks: EffectFallbacks;\r\n }> {\r\n let result = null;\r\n\r\n // Global defines\r\n const scene = this.getScene();\r\n if (PrepareDefinesForCamera(scene, defines)) {\r\n defines.markAsMiscDirty();\r\n }\r\n\r\n // Shared defines\r\n this._sharedData.blocksWithDefines.forEach((b) => {\r\n b.initializeDefines(mesh, this, defines, useInstances);\r\n });\r\n\r\n this._sharedData.blocksWithDefines.forEach((b) => {\r\n b.prepareDefines(mesh, this, defines, useInstances, subMesh);\r\n });\r\n\r\n // Need to recompile?\r\n if (defines.isDirty) {\r\n const lightDisposed = defines._areLightsDisposed;\r\n defines.markAsProcessed();\r\n\r\n // Repeatable content generators\r\n this._vertexCompilationState.compilationString = this._vertexCompilationState._builtCompilationString;\r\n this._fragmentCompilationState.compilationString = this._fragmentCompilationState._builtCompilationString;\r\n\r\n this._sharedData.repeatableContentBlocks.forEach((b) => {\r\n b.replaceRepeatableContent(this._vertexCompilationState, this._fragmentCompilationState, mesh, defines);\r\n });\r\n\r\n // Uniforms\r\n const uniformBuffers: string[] = [];\r\n this._sharedData.dynamicUniformBlocks.forEach((b) => {\r\n b.updateUniformsAndSamples(this._vertexCompilationState, this, defines, uniformBuffers);\r\n });\r\n\r\n const mergedUniforms = this._vertexCompilationState.uniforms;\r\n\r\n this._fragmentCompilationState.uniforms.forEach((u) => {\r\n const index = mergedUniforms.indexOf(u);\r\n\r\n if (index === -1) {\r\n mergedUniforms.push(u);\r\n }\r\n });\r\n\r\n // Samplers\r\n const mergedSamplers = this._vertexCompilationState.samplers;\r\n\r\n this._fragmentCompilationState.samplers.forEach((s) => {\r\n const index = mergedSamplers.indexOf(s);\r\n\r\n if (index === -1) {\r\n mergedSamplers.push(s);\r\n }\r\n });\r\n\r\n const fallbacks = new EffectFallbacks();\r\n\r\n this._sharedData.blocksWithFallbacks.forEach((b) => {\r\n b.provideFallbacks(mesh, fallbacks);\r\n });\r\n\r\n result = {\r\n lightDisposed,\r\n uniformBuffers,\r\n mergedUniforms,\r\n mergedSamplers,\r\n fallbacks,\r\n };\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get if the submesh is ready to be used and all its information available.\r\n * Child classes can use it to update shaders\r\n * @param mesh defines the mesh to check\r\n * @param subMesh defines which submesh to check\r\n * @param useInstances specifies that instances should be used\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances: boolean = false): boolean {\r\n if (!this._buildWasSuccessful) {\r\n return false;\r\n }\r\n\r\n const scene = this.getScene();\r\n if (this._sharedData.animatedInputs) {\r\n const frameId = scene.getFrameId();\r\n\r\n if (this._animationFrame !== frameId) {\r\n for (const input of this._sharedData.animatedInputs) {\r\n input.animate(scene);\r\n }\r\n\r\n this._animationFrame = frameId;\r\n }\r\n }\r\n\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (drawWrapper.effect && this.isFrozen) {\r\n if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new NodeMaterialDefines();\r\n }\r\n\r\n const defines = subMesh.materialDefines;\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n this._prepareDefinesForAttributes(mesh, defines);\r\n\r\n // Check if blocks are ready\r\n if (this._sharedData.blockingBlocks.some((b) => !b.isReady(mesh, this, defines, useInstances))) {\r\n return false;\r\n }\r\n\r\n const result = this._processDefines(mesh, defines, useInstances, subMesh);\r\n\r\n if (result) {\r\n const previousEffect = subMesh.effect;\r\n // Compilation\r\n const join = defines.toString();\r\n let effect = engine.createEffect(\r\n {\r\n vertex: \"nodeMaterial\" + this._buildId,\r\n fragment: \"nodeMaterial\" + this._buildId,\r\n vertexSource: this._vertexCompilationState.compilationString,\r\n fragmentSource: this._fragmentCompilationState.compilationString,\r\n },\r\n {\r\n attributes: this._vertexCompilationState.attributes,\r\n uniformsNames: result.mergedUniforms,\r\n uniformBuffersNames: result.uniformBuffers,\r\n samplers: result.mergedSamplers,\r\n defines: join,\r\n fallbacks: result.fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n multiTarget: defines.PREPASS,\r\n indexParameters: { maxSimultaneousLights: this.maxSimultaneousLights, maxSimultaneousMorphTargets: defines.NUM_MORPH_INFLUENCERS },\r\n },\r\n engine\r\n );\r\n\r\n if (effect) {\r\n if (this._onEffectCreatedObservable) {\r\n onCreatedEffectParameters.effect = effect;\r\n onCreatedEffectParameters.subMesh = subMesh;\r\n this._onEffectCreatedObservable.notifyObservers(onCreatedEffectParameters);\r\n }\r\n\r\n // Use previous effect while new one is compiling\r\n if (this.allowShaderHotSwapping && previousEffect && !effect.isReady()) {\r\n effect = previousEffect;\r\n defines.markAsUnprocessed();\r\n\r\n if (result.lightDisposed) {\r\n // re register in case it takes more than one frame.\r\n defines._areLightsDisposed = true;\r\n return false;\r\n }\r\n } else {\r\n scene.resetCachedMaterial();\r\n subMesh.setEffect(effect, defines, this._materialContext);\r\n }\r\n }\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n drawWrapper._wasPreviouslyUsingInstances = useInstances;\r\n\r\n this._checkScenePerformancePriority();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Get a string representing the shaders built by the current node graph\r\n */\r\n public get compiledShaders() {\r\n return `// Vertex shader\\n${this._vertexCompilationState.compilationString}\\n\\n// Fragment shader\\n${this._fragmentCompilationState.compilationString}`;\r\n }\r\n\r\n /**\r\n * Binds the world matrix to the material\r\n * @param world defines the world transformation matrix\r\n */\r\n public bindOnlyWorldMatrix(world: Matrix): void {\r\n const scene = this.getScene();\r\n\r\n if (!this._activeEffect) {\r\n return;\r\n }\r\n\r\n const hints = this._sharedData.hints;\r\n\r\n if (hints.needWorldViewMatrix) {\r\n world.multiplyToRef(scene.getViewMatrix(), this._cachedWorldViewMatrix);\r\n }\r\n\r\n if (hints.needWorldViewProjectionMatrix) {\r\n world.multiplyToRef(scene.getTransformMatrix(), this._cachedWorldViewProjectionMatrix);\r\n }\r\n\r\n // Connection points\r\n for (const inputBlock of this._sharedData.inputBlocks) {\r\n inputBlock._transmitWorld(this._activeEffect, world, this._cachedWorldViewMatrix, this._cachedWorldViewProjectionMatrix);\r\n }\r\n }\r\n\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n\r\n const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility);\r\n const sharedData = this._sharedData;\r\n\r\n if (mustRebind) {\r\n // Bindable blocks\r\n for (const block of sharedData.bindableBlocks) {\r\n block.bind(effect, this, mesh, subMesh);\r\n }\r\n\r\n for (const block of sharedData.forcedBindableBlocks) {\r\n block.bind(effect, this, mesh, subMesh);\r\n }\r\n\r\n // Connection points\r\n for (const inputBlock of sharedData.inputBlocks) {\r\n inputBlock._transmit(effect, scene, this);\r\n }\r\n } else if (!this.isFrozen) {\r\n for (const block of sharedData.forcedBindableBlocks) {\r\n block.bind(effect, this, mesh, subMesh);\r\n }\r\n }\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Gets the active textures from the material\r\n * @returns an array of textures\r\n */\r\n public getActiveTextures(): BaseTexture[] {\r\n const activeTextures = super.getActiveTextures();\r\n\r\n if (this._sharedData) {\r\n activeTextures.push(...this._sharedData.textureBlocks.filter((tb) => tb.texture).map((tb) => tb.texture!));\r\n }\r\n\r\n return activeTextures;\r\n }\r\n\r\n /**\r\n * Gets the list of texture blocks\r\n * Note that this method will only return blocks that are reachable from the final block(s) and only after the material has been built!\r\n * @returns an array of texture blocks\r\n */\r\n public getTextureBlocks(): NodeMaterialTextureBlocks[] {\r\n if (!this._sharedData) {\r\n return [];\r\n }\r\n\r\n return this._sharedData.textureBlocks;\r\n }\r\n\r\n /**\r\n * Gets the list of all texture blocks\r\n * Note that this method will scan all attachedBlocks and return blocks that are texture blocks\r\n * @returns\r\n */\r\n public getAllTextureBlocks(): NodeMaterialTextureBlocks[] {\r\n const textureBlocks: NodeMaterialTextureBlocks[] = [];\r\n\r\n for (const block of this.attachedBlocks) {\r\n if (NodeMaterial._BlockIsTextureBlock(block)) {\r\n textureBlocks.push(block);\r\n }\r\n }\r\n\r\n return textureBlocks;\r\n }\r\n\r\n /**\r\n * Specifies if the material uses a texture\r\n * @param texture defines the texture to check against the material\r\n * @returns a boolean specifying if the material uses the texture\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n if (super.hasTexture(texture)) {\r\n return true;\r\n }\r\n\r\n if (!this._sharedData) {\r\n return false;\r\n }\r\n\r\n for (const t of this._sharedData.textureBlocks) {\r\n if (t.texture === texture) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the material\r\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\r\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\r\n * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh\r\n */\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean): void {\r\n if (forceDisposeTextures) {\r\n for (const texture of this.getTextureBlocks()\r\n .filter((tb) => tb.texture)\r\n .map((tb) => tb.texture!)) {\r\n texture.dispose();\r\n }\r\n }\r\n\r\n for (const block of this.attachedBlocks) {\r\n block.dispose();\r\n }\r\n\r\n this.attachedBlocks.length = 0;\r\n (this._sharedData as any) = null;\r\n (this._vertexCompilationState as any) = null;\r\n (this._fragmentCompilationState as any) = null;\r\n\r\n this.onBuildObservable.clear();\r\n\r\n if (this._imageProcessingObserver) {\r\n this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver);\r\n this._imageProcessingObserver = null;\r\n }\r\n\r\n super.dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh);\r\n }\r\n\r\n /** Creates the node editor window.\r\n * @param additionalConfig Define the configuration of the editor\r\n */\r\n private _createNodeEditor(additionalConfig?: any) {\r\n const nodeEditorConfig: any = {\r\n nodeMaterial: this,\r\n ...additionalConfig,\r\n };\r\n this.BJSNODEMATERIALEDITOR.NodeEditor.Show(nodeEditorConfig);\r\n }\r\n\r\n /**\r\n * Launch the node material editor\r\n * @param config Define the configuration of the editor\r\n * @returns a promise fulfilled when the node editor is visible\r\n */\r\n public edit(config?: INodeMaterialEditorOptions): Promise {\r\n return new Promise((resolve) => {\r\n this.BJSNODEMATERIALEDITOR = this.BJSNODEMATERIALEDITOR || this._getGlobalNodeMaterialEditor();\r\n if (typeof this.BJSNODEMATERIALEDITOR == \"undefined\") {\r\n const editorUrl = config && config.editorURL ? config.editorURL : NodeMaterial.EditorURL;\r\n\r\n // Load editor and add it to the DOM\r\n Tools.LoadBabylonScript(editorUrl, () => {\r\n this.BJSNODEMATERIALEDITOR = this.BJSNODEMATERIALEDITOR || this._getGlobalNodeMaterialEditor();\r\n this._createNodeEditor(config?.nodeEditorConfig);\r\n resolve();\r\n });\r\n } else {\r\n // Otherwise creates the editor\r\n this._createNodeEditor(config?.nodeEditorConfig);\r\n resolve();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Clear the current material\r\n */\r\n public clear() {\r\n this._vertexOutputNodes.length = 0;\r\n this._fragmentOutputNodes.length = 0;\r\n this.attachedBlocks.length = 0;\r\n }\r\n\r\n /**\r\n * Clear the current material and set it to a default state\r\n */\r\n public setToDefault() {\r\n this.clear();\r\n\r\n this.editorData = null;\r\n\r\n const positionInput = new InputBlock(\"Position\");\r\n positionInput.setAsAttribute(\"position\");\r\n\r\n const worldInput = new InputBlock(\"World\");\r\n worldInput.setAsSystemValue(NodeMaterialSystemValues.World);\r\n\r\n const worldPos = new TransformBlock(\"WorldPos\");\r\n positionInput.connectTo(worldPos);\r\n worldInput.connectTo(worldPos);\r\n\r\n const viewProjectionInput = new InputBlock(\"ViewProjection\");\r\n viewProjectionInput.setAsSystemValue(NodeMaterialSystemValues.ViewProjection);\r\n\r\n const worldPosdMultipliedByViewProjection = new TransformBlock(\"WorldPos * ViewProjectionTransform\");\r\n worldPos.connectTo(worldPosdMultipliedByViewProjection);\r\n viewProjectionInput.connectTo(worldPosdMultipliedByViewProjection);\r\n\r\n const vertexOutput = new VertexOutputBlock(\"VertexOutput\");\r\n worldPosdMultipliedByViewProjection.connectTo(vertexOutput);\r\n\r\n // Pixel\r\n const pixelColor = new InputBlock(\"color\");\r\n pixelColor.value = new Color4(0.8, 0.8, 0.8, 1);\r\n\r\n const fragmentOutput = new FragmentOutputBlock(\"FragmentOutput\");\r\n pixelColor.connectTo(fragmentOutput);\r\n\r\n // Add to nodes\r\n this.addOutputNode(vertexOutput);\r\n this.addOutputNode(fragmentOutput);\r\n\r\n this._mode = NodeMaterialModes.Material;\r\n }\r\n\r\n /**\r\n * Clear the current material and set it to a default state for post process\r\n */\r\n public setToDefaultPostProcess() {\r\n this.clear();\r\n\r\n this.editorData = null;\r\n\r\n const position = new InputBlock(\"Position\");\r\n position.setAsAttribute(\"position2d\");\r\n\r\n const const1 = new InputBlock(\"Constant1\");\r\n const1.isConstant = true;\r\n const1.value = 1;\r\n\r\n const vmerger = new VectorMergerBlock(\"Position3D\");\r\n\r\n position.connectTo(vmerger);\r\n const1.connectTo(vmerger, { input: \"w\" });\r\n\r\n const vertexOutput = new VertexOutputBlock(\"VertexOutput\");\r\n vmerger.connectTo(vertexOutput);\r\n\r\n // Pixel\r\n const scale = new InputBlock(\"Scale\");\r\n scale.visibleInInspector = true;\r\n scale.value = new Vector2(1, 1);\r\n\r\n const uv0 = new RemapBlock(\"uv0\");\r\n position.connectTo(uv0);\r\n\r\n const uv = new MultiplyBlock(\"UV scale\");\r\n uv0.connectTo(uv);\r\n scale.connectTo(uv);\r\n\r\n const currentScreen = new CurrentScreenBlock(\"CurrentScreen\");\r\n uv.connectTo(currentScreen);\r\n\r\n currentScreen.texture = new Texture(\"https://assets.babylonjs.com/nme/currentScreenPostProcess.png\", this.getScene());\r\n\r\n const fragmentOutput = new FragmentOutputBlock(\"FragmentOutput\");\r\n currentScreen.connectTo(fragmentOutput, { output: \"rgba\" });\r\n\r\n // Add to nodes\r\n this.addOutputNode(vertexOutput);\r\n this.addOutputNode(fragmentOutput);\r\n\r\n this._mode = NodeMaterialModes.PostProcess;\r\n }\r\n\r\n /**\r\n * Clear the current material and set it to a default state for procedural texture\r\n */\r\n public setToDefaultProceduralTexture() {\r\n this.clear();\r\n\r\n this.editorData = null;\r\n\r\n const position = new InputBlock(\"Position\");\r\n position.setAsAttribute(\"position2d\");\r\n\r\n const const1 = new InputBlock(\"Constant1\");\r\n const1.isConstant = true;\r\n const1.value = 1;\r\n\r\n const vmerger = new VectorMergerBlock(\"Position3D\");\r\n\r\n position.connectTo(vmerger);\r\n const1.connectTo(vmerger, { input: \"w\" });\r\n\r\n const vertexOutput = new VertexOutputBlock(\"VertexOutput\");\r\n vmerger.connectTo(vertexOutput);\r\n\r\n // Pixel\r\n const time = new InputBlock(\"Time\");\r\n time.value = 0;\r\n time.min = 0;\r\n time.max = 0;\r\n time.isBoolean = false;\r\n time.matrixMode = 0;\r\n time.animationType = AnimatedInputBlockTypes.Time;\r\n time.isConstant = false;\r\n\r\n const color = new InputBlock(\"Color3\");\r\n color.value = new Color3(1, 1, 1);\r\n color.isConstant = false;\r\n const fragmentOutput = new FragmentOutputBlock(\"FragmentOutput\");\r\n\r\n const vectorMerger = new VectorMergerBlock(\"VectorMerger\");\r\n vectorMerger.visibleInInspector = false;\r\n\r\n const cos = new TrigonometryBlock(\"Cos\");\r\n cos.operation = TrigonometryBlockOperations.Cos;\r\n\r\n position.connectTo(vectorMerger);\r\n time.output.connectTo(cos.input);\r\n cos.output.connectTo(vectorMerger.z);\r\n vectorMerger.xyzOut.connectTo(fragmentOutput.rgb);\r\n\r\n // Add to nodes\r\n this.addOutputNode(vertexOutput);\r\n this.addOutputNode(fragmentOutput);\r\n\r\n this._mode = NodeMaterialModes.ProceduralTexture;\r\n }\r\n\r\n /**\r\n * Clear the current material and set it to a default state for particle\r\n */\r\n public setToDefaultParticle() {\r\n this.clear();\r\n\r\n this.editorData = null;\r\n\r\n // Pixel\r\n const uv = new InputBlock(\"uv\");\r\n uv.setAsAttribute(\"particle_uv\");\r\n\r\n const texture = new ParticleTextureBlock(\"ParticleTexture\");\r\n uv.connectTo(texture);\r\n\r\n const color = new InputBlock(\"Color\");\r\n color.setAsAttribute(\"particle_color\");\r\n\r\n const multiply = new MultiplyBlock(\"Texture * Color\");\r\n texture.connectTo(multiply);\r\n color.connectTo(multiply);\r\n\r\n const rampGradient = new ParticleRampGradientBlock(\"ParticleRampGradient\");\r\n multiply.connectTo(rampGradient);\r\n\r\n const cSplitter = new ColorSplitterBlock(\"ColorSplitter\");\r\n color.connectTo(cSplitter);\r\n\r\n const blendMultiply = new ParticleBlendMultiplyBlock(\"ParticleBlendMultiply\");\r\n rampGradient.connectTo(blendMultiply);\r\n texture.connectTo(blendMultiply, { output: \"a\" });\r\n cSplitter.connectTo(blendMultiply, { output: \"a\" });\r\n\r\n const fragmentOutput = new FragmentOutputBlock(\"FragmentOutput\");\r\n blendMultiply.connectTo(fragmentOutput);\r\n\r\n // Add to nodes\r\n this.addOutputNode(fragmentOutput);\r\n\r\n this._mode = NodeMaterialModes.Particle;\r\n }\r\n\r\n /**\r\n * Loads the current Node Material from a url pointing to a file save by the Node Material Editor\r\n * @deprecated Please use NodeMaterial.ParseFromFileAsync instead\r\n * @param url defines the url to load from\r\n * @param rootUrl defines the root URL for nested url in the node material\r\n * @returns a promise that will fulfil when the material is fully loaded\r\n */\r\n public async loadAsync(url: string, rootUrl: string = \"\") {\r\n return NodeMaterial.ParseFromFileAsync(\"\", url, this.getScene(), rootUrl, true, this);\r\n }\r\n\r\n private _gatherBlocks(rootNode: NodeMaterialBlock, list: NodeMaterialBlock[]) {\r\n if (list.indexOf(rootNode) !== -1) {\r\n return;\r\n }\r\n list.push(rootNode);\r\n\r\n for (const input of rootNode.inputs) {\r\n const connectedPoint = input.connectedPoint;\r\n if (connectedPoint) {\r\n const block = connectedPoint.ownerBlock;\r\n if (block !== rootNode) {\r\n this._gatherBlocks(block, list);\r\n }\r\n }\r\n }\r\n\r\n // Teleportation\r\n if (rootNode.isTeleportOut) {\r\n const block = rootNode as NodeMaterialTeleportOutBlock;\r\n if (block.entryPoint) {\r\n this._gatherBlocks(block.entryPoint, list);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Generate a string containing the code declaration required to create an equivalent of this material\r\n * @returns a string\r\n */\r\n public generateCode() {\r\n let alreadyDumped: NodeMaterialBlock[] = [];\r\n const vertexBlocks: NodeMaterialBlock[] = [];\r\n const uniqueNames: string[] = [\"const\", \"var\", \"let\"];\r\n // Gets active blocks\r\n for (const outputNode of this._vertexOutputNodes) {\r\n this._gatherBlocks(outputNode, vertexBlocks);\r\n }\r\n\r\n const fragmentBlocks: NodeMaterialBlock[] = [];\r\n for (const outputNode of this._fragmentOutputNodes) {\r\n this._gatherBlocks(outputNode, fragmentBlocks);\r\n }\r\n\r\n // Generate vertex shader\r\n let codeString = `var nodeMaterial = new BABYLON.NodeMaterial(\"${this.name || \"node material\"}\");\\n`;\r\n codeString += `nodeMaterial.mode = BABYLON.NodeMaterialModes.${NodeMaterialModes[this.mode]};\\n`;\r\n for (const node of vertexBlocks) {\r\n if (node.isInput && alreadyDumped.indexOf(node) === -1) {\r\n codeString += node._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n\r\n // Generate fragment shader\r\n for (const node of fragmentBlocks) {\r\n if (node.isInput && alreadyDumped.indexOf(node) === -1) {\r\n codeString += node._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n\r\n // Connections\r\n alreadyDumped = [];\r\n codeString += \"\\n// Connections\\n\";\r\n for (const node of this._vertexOutputNodes) {\r\n codeString += node._dumpCodeForOutputConnections(alreadyDumped);\r\n }\r\n for (const node of this._fragmentOutputNodes) {\r\n codeString += node._dumpCodeForOutputConnections(alreadyDumped);\r\n }\r\n\r\n // Output nodes\r\n codeString += \"\\n// Output nodes\\n\";\r\n for (const node of this._vertexOutputNodes) {\r\n codeString += `nodeMaterial.addOutputNode(${node._codeVariableName});\\n`;\r\n }\r\n\r\n for (const node of this._fragmentOutputNodes) {\r\n codeString += `nodeMaterial.addOutputNode(${node._codeVariableName});\\n`;\r\n }\r\n\r\n codeString += `nodeMaterial.build();\\n`;\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * Serializes this material in a JSON representation\r\n * @param selectedBlocks defines an optional list of blocks to serialize\r\n * @returns the serialized material object\r\n */\r\n public serialize(selectedBlocks?: NodeMaterialBlock[]): any {\r\n const serializationObject = selectedBlocks ? {} : SerializationHelper.Serialize(this);\r\n serializationObject.editorData = JSON.parse(JSON.stringify(this.editorData)); // Copy\r\n\r\n let blocks: NodeMaterialBlock[] = [];\r\n\r\n if (selectedBlocks) {\r\n blocks = selectedBlocks;\r\n } else {\r\n serializationObject.customType = \"BABYLON.NodeMaterial\";\r\n serializationObject.outputNodes = [];\r\n\r\n // Outputs\r\n for (const outputNode of this._vertexOutputNodes) {\r\n this._gatherBlocks(outputNode, blocks);\r\n serializationObject.outputNodes.push(outputNode.uniqueId);\r\n }\r\n\r\n for (const outputNode of this._fragmentOutputNodes) {\r\n this._gatherBlocks(outputNode, blocks);\r\n\r\n if (serializationObject.outputNodes.indexOf(outputNode.uniqueId) === -1) {\r\n serializationObject.outputNodes.push(outputNode.uniqueId);\r\n }\r\n }\r\n }\r\n\r\n // Blocks\r\n serializationObject.blocks = [];\r\n\r\n for (const block of blocks) {\r\n serializationObject.blocks.push(block.serialize());\r\n }\r\n\r\n if (!selectedBlocks) {\r\n for (const block of this.attachedBlocks) {\r\n if (blocks.indexOf(block) !== -1) {\r\n continue;\r\n }\r\n serializationObject.blocks.push(block.serialize());\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n private _restoreConnections(block: NodeMaterialBlock, source: any, map: { [key: number]: NodeMaterialBlock }) {\r\n for (const outputPoint of block.outputs) {\r\n for (const candidate of source.blocks) {\r\n const target = map[candidate.id];\r\n\r\n if (!target) {\r\n continue;\r\n }\r\n\r\n for (const input of candidate.inputs) {\r\n if (map[input.targetBlockId] === block && input.targetConnectionName === outputPoint.name) {\r\n const inputPoint = target.getInputByName(input.inputName);\r\n if (!inputPoint || inputPoint.isConnected) {\r\n continue;\r\n }\r\n\r\n outputPoint.connectTo(inputPoint, true);\r\n this._restoreConnections(target, source, map);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current graph and load a new one from a serialization object\r\n * @param source defines the JSON representation of the material\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @param merge defines whether or not the source must be merged or replace the current content\r\n */\r\n public parseSerializedObject(source: any, rootUrl: string = \"\", merge = false) {\r\n if (!merge) {\r\n this.clear();\r\n }\r\n\r\n const map: { [key: number]: NodeMaterialBlock } = {};\r\n\r\n // Create blocks\r\n for (const parsedBlock of source.blocks) {\r\n const blockType = GetClass(parsedBlock.customType);\r\n if (blockType) {\r\n const block: NodeMaterialBlock = new blockType();\r\n block._deserialize(parsedBlock, this.getScene(), rootUrl);\r\n map[parsedBlock.id] = block;\r\n\r\n this.attachedBlocks.push(block);\r\n }\r\n }\r\n\r\n // Reconnect teleportation\r\n for (const block of this.attachedBlocks) {\r\n if (block.isTeleportOut) {\r\n const teleportOut = block as NodeMaterialTeleportOutBlock;\r\n const id = teleportOut._tempEntryPointUniqueId;\r\n if (id) {\r\n const source = map[id] as NodeMaterialTeleportInBlock;\r\n source.attachToEndpoint(teleportOut);\r\n }\r\n }\r\n }\r\n\r\n // Connections - Starts with input blocks only (except if in \"merge\" mode where we scan all blocks)\r\n for (let blockIndex = 0; blockIndex < source.blocks.length; blockIndex++) {\r\n const parsedBlock = source.blocks[blockIndex];\r\n const block = map[parsedBlock.id];\r\n\r\n if (!block) {\r\n continue;\r\n }\r\n\r\n if (block.inputs.length && !merge) {\r\n continue;\r\n }\r\n this._restoreConnections(block, source, map);\r\n }\r\n\r\n // Outputs\r\n if (source.outputNodes) {\r\n for (const outputNodeId of source.outputNodes) {\r\n this.addOutputNode(map[outputNodeId]);\r\n }\r\n }\r\n\r\n // UI related info\r\n if (source.locations || (source.editorData && source.editorData.locations)) {\r\n const locations: {\r\n blockId: number;\r\n x: number;\r\n y: number;\r\n }[] = source.locations || source.editorData.locations;\r\n\r\n for (const location of locations) {\r\n if (map[location.blockId]) {\r\n location.blockId = map[location.blockId].uniqueId;\r\n }\r\n }\r\n\r\n if (merge && this.editorData && this.editorData.locations) {\r\n locations.concat(this.editorData.locations);\r\n }\r\n\r\n if (source.locations) {\r\n this.editorData = {\r\n locations: locations,\r\n };\r\n } else {\r\n this.editorData = source.editorData;\r\n this.editorData.locations = locations;\r\n }\r\n\r\n const blockMap: number[] = [];\r\n\r\n for (const key in map) {\r\n blockMap[key] = map[key].uniqueId;\r\n }\r\n\r\n this.editorData.map = blockMap;\r\n }\r\n\r\n this.comment = source.comment;\r\n\r\n if (source.forceAlphaBlending !== undefined) {\r\n this.forceAlphaBlending = source.forceAlphaBlending;\r\n }\r\n\r\n if (source.alphaMode !== undefined) {\r\n this.alphaMode = source.alphaMode;\r\n }\r\n\r\n if (!merge) {\r\n this._mode = source.mode ?? NodeMaterialModes.Material;\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current graph and load a new one from a serialization object\r\n * @param source defines the JSON representation of the material\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @param merge defines whether or not the source must be merged or replace the current content\r\n * @deprecated Please use the parseSerializedObject method instead\r\n */\r\n public loadFromSerialization(source: any, rootUrl: string = \"\", merge = false) {\r\n this.parseSerializedObject(source, rootUrl, merge);\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current material.\r\n * @param name defines the name to use for the new material\r\n * @param shareEffect defines if the clone material should share the same effect (default is false)\r\n * @returns the cloned material\r\n */\r\n public clone(name: string, shareEffect: boolean = false): NodeMaterial {\r\n const serializationObject = this.serialize();\r\n\r\n const clone = SerializationHelper.Clone(() => new NodeMaterial(name, this.getScene(), this.options), this);\r\n clone.id = name;\r\n clone.name = name;\r\n\r\n clone.parseSerializedObject(serializationObject);\r\n clone._buildId = this._buildId;\r\n clone.build(false, !shareEffect);\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Awaits for all the material textures to be ready before resolving the returned promise.\r\n * @returns A promise that resolves when the textures are ready.\r\n */\r\n public whenTexturesReadyAsync(): Promise {\r\n // Ensures all textures are ready to render.\r\n const textureReadyPromises: Promise[] = [];\r\n this.getActiveTextures().forEach((texture) => {\r\n const internalTexture = texture.getInternalTexture();\r\n if (internalTexture && !internalTexture.isReady) {\r\n textureReadyPromises.push(\r\n new Promise((textureResolve, textureReject) => {\r\n internalTexture.onLoadedObservable.addOnce(() => {\r\n textureResolve();\r\n });\r\n internalTexture.onErrorObservable.addOnce((e) => {\r\n textureReject(e);\r\n });\r\n })\r\n );\r\n }\r\n });\r\n\r\n return Promise.all(textureReadyPromises);\r\n }\r\n\r\n /**\r\n * Creates a node material from parsed material data\r\n * @param source defines the JSON representation of the material\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a new node material\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string = \"\"): NodeMaterial {\r\n const nodeMaterial = SerializationHelper.Parse(() => new NodeMaterial(source.name, scene), source, scene, rootUrl);\r\n\r\n nodeMaterial.parseSerializedObject(source, rootUrl);\r\n nodeMaterial.build();\r\n\r\n return nodeMaterial;\r\n }\r\n\r\n /**\r\n * Creates a node material from a snippet saved in a remote file\r\n * @param name defines the name of the material to create\r\n * @param url defines the url to load from\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL for nested url in the node material\r\n * @param skipBuild defines whether to build the node material\r\n * @param targetMaterial defines a material to use instead of creating a new one\r\n * @returns a promise that will resolve to the new node material\r\n */\r\n public static async ParseFromFileAsync(\r\n name: string,\r\n url: string,\r\n scene: Scene,\r\n rootUrl: string = \"\",\r\n skipBuild: boolean = false,\r\n targetMaterial?: NodeMaterial\r\n ): Promise {\r\n const material = targetMaterial ?? new NodeMaterial(name, scene);\r\n\r\n const data = await scene._loadFileAsync(url);\r\n const serializationObject = JSON.parse(data);\r\n material.parseSerializedObject(serializationObject, rootUrl);\r\n if (!skipBuild) {\r\n material.build();\r\n }\r\n return material;\r\n }\r\n\r\n /**\r\n * Creates a node material from a snippet saved by the node material editor\r\n * @param snippetId defines the snippet to load\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @param nodeMaterial defines a node material to update (instead of creating a new one)\r\n * @param skipBuild defines whether to build the node material\r\n * @param waitForTextureReadyness defines whether to wait for texture readiness resolving the promise (default: false)\r\n * @returns a promise that will resolve to the new node material\r\n */\r\n public static ParseFromSnippetAsync(\r\n snippetId: string,\r\n scene: Scene = EngineStore.LastCreatedScene!,\r\n rootUrl: string = \"\",\r\n nodeMaterial?: NodeMaterial,\r\n skipBuild: boolean = false,\r\n waitForTextureReadyness: boolean = false\r\n ): Promise {\r\n if (snippetId === \"_BLANK\") {\r\n return Promise.resolve(NodeMaterial.CreateDefault(\"blank\", scene));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n const serializationObject = JSON.parse(snippet.nodeMaterial);\r\n\r\n if (!nodeMaterial) {\r\n nodeMaterial = SerializationHelper.Parse(() => new NodeMaterial(snippetId, scene), serializationObject, scene, rootUrl);\r\n nodeMaterial.uniqueId = scene.getUniqueId();\r\n }\r\n\r\n nodeMaterial.parseSerializedObject(serializationObject);\r\n nodeMaterial.snippetId = snippetId;\r\n\r\n try {\r\n if (!skipBuild) {\r\n nodeMaterial.build();\r\n }\r\n } catch (err) {\r\n reject(err);\r\n }\r\n\r\n if (waitForTextureReadyness) {\r\n nodeMaterial\r\n .whenTexturesReadyAsync()\r\n .then(() => {\r\n resolve(nodeMaterial!);\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n } else {\r\n resolve(nodeMaterial);\r\n }\r\n } else {\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a new node material set to default basic configuration\r\n * @param name defines the name of the material\r\n * @param scene defines the hosting scene\r\n * @returns a new NodeMaterial\r\n */\r\n public static CreateDefault(name: string, scene?: Scene) {\r\n const newMaterial = new NodeMaterial(name, scene);\r\n\r\n newMaterial.setToDefault();\r\n newMaterial.build();\r\n\r\n return newMaterial;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.NodeMaterial\", NodeMaterial);\r\n", "import type { Scene } from \"../../scene\";\r\nimport type { Vector4 } from \"../../Maths/math.vector\";\r\nimport { Vector3, Vector2 } from \"../../Maths/math.vector\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { CompatibilityOptions } from \"../../Compat/compatibilityOptions\";\r\n\r\n/**\r\n * Creates the VertexData of the IcoSphere\r\n * @param options an object used to set the following optional parameters for the IcoSphere, required but can be empty\r\n * * radius the radius of the IcoSphere, optional default 1\r\n * * radiusX allows stretching in the x direction, optional, default radius\r\n * * radiusY allows stretching in the y direction, optional, default radius\r\n * * radiusZ allows stretching in the z direction, optional, default radius\r\n * * flat when true creates a flat shaded mesh, optional, default true\r\n * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the IcoSphere\r\n */\r\nexport function CreateIcoSphereVertexData(options: {\r\n radius?: number;\r\n radiusX?: number;\r\n radiusY?: number;\r\n radiusZ?: number;\r\n flat?: boolean;\r\n subdivisions?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n}): VertexData {\r\n const sideOrientation = options.sideOrientation || VertexData.DEFAULTSIDE;\r\n const radius = options.radius || 1;\r\n const flat = options.flat === undefined ? true : options.flat;\r\n const subdivisions = (options.subdivisions || 4) | 0;\r\n const radiusX = options.radiusX || radius;\r\n const radiusY = options.radiusY || radius;\r\n const radiusZ = options.radiusZ || radius;\r\n\r\n const t = (1 + Math.sqrt(5)) / 2;\r\n\r\n // 12 vertex x,y,z\r\n const icoVertices = [\r\n -1,\r\n t,\r\n -0,\r\n 1,\r\n t,\r\n 0,\r\n -1,\r\n -t,\r\n 0,\r\n 1,\r\n -t,\r\n 0, // v0-3\r\n 0,\r\n -1,\r\n -t,\r\n 0,\r\n 1,\r\n -t,\r\n 0,\r\n -1,\r\n t,\r\n 0,\r\n 1,\r\n t, // v4-7\r\n t,\r\n 0,\r\n 1,\r\n t,\r\n 0,\r\n -1,\r\n -t,\r\n 0,\r\n 1,\r\n -t,\r\n 0,\r\n -1, // v8-11\r\n ];\r\n\r\n // index of 3 vertex makes a face of icopshere\r\n const ico_indices = [\r\n 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 12, 22, 23, 1, 5, 20, 5, 11, 4, 23, 22, 13, 22, 18, 6, 7, 1, 8, 14, 21, 4, 14, 4, 2, 16, 13, 6, 15, 6, 19, 3, 8, 9, 4, 21, 5, 13, 17,\r\n 23, 6, 13, 22, 19, 6, 18, 9, 8, 1,\r\n ];\r\n // vertex for uv have aliased position, not for UV\r\n const vertices_unalias_id = [\r\n 0,\r\n 1,\r\n 2,\r\n 3,\r\n 4,\r\n 5,\r\n 6,\r\n 7,\r\n 8,\r\n 9,\r\n 10,\r\n 11,\r\n // vertex alias\r\n 0, // 12: 0 + 12\r\n 2, // 13: 2 + 11\r\n 3, // 14: 3 + 11\r\n 3, // 15: 3 + 12\r\n 3, // 16: 3 + 13\r\n 4, // 17: 4 + 13\r\n 7, // 18: 7 + 11\r\n 8, // 19: 8 + 11\r\n 9, // 20: 9 + 11\r\n 9, // 21: 9 + 12\r\n 10, // 22: A + 12\r\n 11, // 23: B + 12\r\n ];\r\n\r\n // uv as integer step (not pixels !)\r\n const ico_vertexuv = [\r\n 5,\r\n 1,\r\n 3,\r\n 1,\r\n 6,\r\n 4,\r\n 0,\r\n 0, // v0-3\r\n 5,\r\n 3,\r\n 4,\r\n 2,\r\n 2,\r\n 2,\r\n 4,\r\n 0, // v4-7\r\n 2,\r\n 0,\r\n 1,\r\n 1,\r\n 6,\r\n 0,\r\n 6,\r\n 2, // v8-11\r\n // vertex alias (for same vertex on different faces)\r\n 0,\r\n 4, // 12: 0 + 12\r\n 3,\r\n 3, // 13: 2 + 11\r\n 4,\r\n 4, // 14: 3 + 11\r\n 3,\r\n 1, // 15: 3 + 12\r\n 4,\r\n 2, // 16: 3 + 13\r\n 4,\r\n 4, // 17: 4 + 13\r\n 0,\r\n 2, // 18: 7 + 11\r\n 1,\r\n 1, // 19: 8 + 11\r\n 2,\r\n 2, // 20: 9 + 11\r\n 3,\r\n 3, // 21: 9 + 12\r\n 1,\r\n 3, // 22: A + 12\r\n 2,\r\n 4, // 23: B + 12\r\n ];\r\n\r\n // Vertices[0, 1, ...9, A, B] : position on UV plane\r\n // '+' indicate duplicate position to be fixed (3,9:0,2,3,4,7,8,A,B)\r\n // First island of uv mapping\r\n // v = 4h 3+ 2\r\n // v = 3h 9+ 4\r\n // v = 2h 9+ 5 B\r\n // v = 1h 9 1 0\r\n // v = 0h 3 8 7 A\r\n // u = 0 1 2 3 4 5 6 *a\r\n\r\n // Second island of uv mapping\r\n // v = 4h 0+ B+ 4+\r\n // v = 3h A+ 2+\r\n // v = 2h 7+ 6 3+\r\n // v = 1h 8+ 3+\r\n // v = 0h\r\n // u = 0 1 2 3 4 5 6 *a\r\n\r\n // Face layout on texture UV mapping\r\n // ============\r\n // \\ 4 /\\ 16 / ======\r\n // \\ / \\ / /\\ 11 /\r\n // \\/ 7 \\/ / \\ /\r\n // ======= / 10 \\/\r\n // /\\ 17 /\\ =======\r\n // / \\ / \\ \\ 15 /\\\r\n // / 8 \\/ 12 \\ \\ / \\\r\n // ============ \\/ 6 \\\r\n // \\ 18 /\\ ============\r\n // \\ / \\ \\ 5 /\\ 0 /\r\n // \\/ 13 \\ \\ / \\ /\r\n // ======= \\/ 1 \\/\r\n // =============\r\n // /\\ 19 /\\ 2 /\\\r\n // / \\ / \\ / \\\r\n // / 14 \\/ 9 \\/ 3 \\\r\n // ===================\r\n\r\n // uv step is u:1 or 0.5, v:cos(30)=sqrt(3)/2, ratio approx is 84/97\r\n const ustep = 138 / 1024;\r\n const vstep = 239 / 1024;\r\n const uoffset = 60 / 1024;\r\n const voffset = 26 / 1024;\r\n // Second island should have margin, not to touch the first island\r\n // avoid any borderline artefact in pixel rounding\r\n const island_u_offset = -40 / 1024;\r\n const island_v_offset = +20 / 1024;\r\n // face is either island 0 or 1 :\r\n // second island is for faces : [4, 7, 8, 12, 13, 16, 17, 18]\r\n const island = [\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n 1, // 0 - 4\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n 0, // 5 - 9\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n 0, // 10 - 14\r\n 0,\r\n 1,\r\n 1,\r\n 1,\r\n 0, // 15 - 19\r\n ];\r\n\r\n const indices: number[] = [];\r\n const positions: number[] = [];\r\n const normals: number[] = [];\r\n const uvs: number[] = [];\r\n\r\n let current_indice = 0;\r\n // prepare array of 3 vector (empty) (to be worked in place, shared for each face)\r\n const face_vertex_pos = new Array(3);\r\n const face_vertex_uv = new Array(3);\r\n let v012;\r\n for (v012 = 0; v012 < 3; v012++) {\r\n face_vertex_pos[v012] = Vector3.Zero();\r\n face_vertex_uv[v012] = Vector2.Zero();\r\n }\r\n // create all with normals\r\n for (let face = 0; face < 20; face++) {\r\n // 3 vertex per face\r\n for (v012 = 0; v012 < 3; v012++) {\r\n // look up vertex 0,1,2 to its index in 0 to 11 (or 23 including alias)\r\n const v_id = ico_indices[3 * face + v012];\r\n // vertex have 3D position (x,y,z)\r\n face_vertex_pos[v012].copyFromFloats(\r\n icoVertices[3 * vertices_unalias_id[v_id]],\r\n icoVertices[3 * vertices_unalias_id[v_id] + 1],\r\n icoVertices[3 * vertices_unalias_id[v_id] + 2]\r\n );\r\n // Normalize to get normal\r\n face_vertex_pos[v012].normalize();\r\n\r\n // uv Coordinates from vertex ID\r\n face_vertex_uv[v012].copyFromFloats(\r\n ico_vertexuv[2 * v_id] * ustep + uoffset + island[face] * island_u_offset,\r\n ico_vertexuv[2 * v_id + 1] * vstep + voffset + island[face] * island_v_offset\r\n );\r\n }\r\n\r\n // Subdivide the face (interpolate pos, norm, uv)\r\n // - pos is linear interpolation, then projected to sphere (converge polyhedron to sphere)\r\n // - norm is linear interpolation of vertex corner normal\r\n // (to be checked if better to re-calc from face vertex, or if approximation is OK ??? )\r\n // - uv is linear interpolation\r\n //\r\n // Topology is as below for sub-divide by 2\r\n // vertex shown as v0,v1,v2\r\n // interp index is i1 to progress in range [v0,v1[\r\n // interp index is i2 to progress in range [v0,v2[\r\n // face index as (i1,i2) for /\\ : (i1,i2),(i1+1,i2),(i1,i2+1)\r\n // and (i1,i2)' for \\/ : (i1+1,i2),(i1+1,i2+1),(i1,i2+1)\r\n //\r\n //\r\n // i2 v2\r\n // ^ ^\r\n // / / \\\r\n // / / \\\r\n // / / \\\r\n // / / (0,1) \\\r\n // / #---------\\\r\n // / / \\ (0,0)'/ \\\r\n // / / \\ / \\\r\n // / / \\ / \\\r\n // / / (0,0) \\ / (1,0) \\\r\n // / #---------#---------\\\r\n // v0 v1\r\n //\r\n // --------------------> i1\r\n //\r\n // interp of (i1,i2):\r\n // along i2 : x0=lerp(v0,v2, i2/S) <---> x1=lerp(v1,v2, i2/S)\r\n // along i1 : lerp(x0,x1, i1/(S-i2))\r\n //\r\n // centroid of triangle is needed to get help normal computation\r\n // (c1,c2) are used for centroid location\r\n\r\n const interp_vertex = (i1: number, i2: number, c1: number, c2: number) => {\r\n // vertex is interpolated from\r\n // - face_vertex_pos[0..2]\r\n // - face_vertex_uv[0..2]\r\n const pos_x0 = Vector3.Lerp(face_vertex_pos[0], face_vertex_pos[2], i2 / subdivisions);\r\n const pos_x1 = Vector3.Lerp(face_vertex_pos[1], face_vertex_pos[2], i2 / subdivisions);\r\n const pos_interp = subdivisions === i2 ? face_vertex_pos[2] : Vector3.Lerp(pos_x0, pos_x1, i1 / (subdivisions - i2));\r\n pos_interp.normalize();\r\n\r\n let vertex_normal;\r\n if (flat) {\r\n // in flat mode, recalculate normal as face centroid normal\r\n const centroid_x0 = Vector3.Lerp(face_vertex_pos[0], face_vertex_pos[2], c2 / subdivisions);\r\n const centroid_x1 = Vector3.Lerp(face_vertex_pos[1], face_vertex_pos[2], c2 / subdivisions);\r\n vertex_normal = Vector3.Lerp(centroid_x0, centroid_x1, c1 / (subdivisions - c2));\r\n } else {\r\n // in smooth mode, recalculate normal from each single vertex position\r\n vertex_normal = new Vector3(pos_interp.x, pos_interp.y, pos_interp.z);\r\n }\r\n // Vertex normal need correction due to X,Y,Z radius scaling\r\n vertex_normal.x /= radiusX;\r\n vertex_normal.y /= radiusY;\r\n vertex_normal.z /= radiusZ;\r\n vertex_normal.normalize();\r\n\r\n const uv_x0 = Vector2.Lerp(face_vertex_uv[0], face_vertex_uv[2], i2 / subdivisions);\r\n const uv_x1 = Vector2.Lerp(face_vertex_uv[1], face_vertex_uv[2], i2 / subdivisions);\r\n const uv_interp = subdivisions === i2 ? face_vertex_uv[2] : Vector2.Lerp(uv_x0, uv_x1, i1 / (subdivisions - i2));\r\n positions.push(pos_interp.x * radiusX, pos_interp.y * radiusY, pos_interp.z * radiusZ);\r\n normals.push(vertex_normal.x, vertex_normal.y, vertex_normal.z);\r\n uvs.push(uv_interp.x, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 - uv_interp.y : uv_interp.y);\r\n // push each vertex has member of a face\r\n // Same vertex can belong to multiple face, it is pushed multiple time (duplicate vertex are present)\r\n indices.push(current_indice);\r\n current_indice++;\r\n };\r\n\r\n for (let i2 = 0; i2 < subdivisions; i2++) {\r\n for (let i1 = 0; i1 + i2 < subdivisions; i1++) {\r\n // face : (i1,i2) for /\\ :\r\n // interp for : (i1,i2),(i1+1,i2),(i1,i2+1)\r\n interp_vertex(i1, i2, i1 + 1.0 / 3, i2 + 1.0 / 3);\r\n interp_vertex(i1 + 1, i2, i1 + 1.0 / 3, i2 + 1.0 / 3);\r\n interp_vertex(i1, i2 + 1, i1 + 1.0 / 3, i2 + 1.0 / 3);\r\n if (i1 + i2 + 1 < subdivisions) {\r\n // face : (i1,i2)' for \\/ :\r\n // interp for (i1+1,i2),(i1+1,i2+1),(i1,i2+1)\r\n interp_vertex(i1 + 1, i2, i1 + 2.0 / 3, i2 + 2.0 / 3);\r\n interp_vertex(i1 + 1, i2 + 1, i1 + 2.0 / 3, i2 + 2.0 / 3);\r\n interp_vertex(i1, i2 + 1, i1 + 2.0 / 3, i2 + 2.0 / 3);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Sides\r\n VertexData._ComputeSides(sideOrientation, positions, indices, normals, uvs, options.frontUVs, options.backUVs);\r\n\r\n // Result\r\n const vertexData = new VertexData();\r\n vertexData.indices = indices;\r\n vertexData.positions = positions;\r\n vertexData.normals = normals;\r\n vertexData.uvs = uvs;\r\n return vertexData;\r\n}\r\n\r\n/**\r\n * Creates a sphere based upon an icosahedron with 20 triangular faces which can be subdivided\r\n * * The parameter `radius` sets the radius size (float) of the icosphere (default 1)\r\n * * You can set some different icosphere dimensions, for instance to build an ellipsoid, by using the parameters `radiusX`, `radiusY` and `radiusZ` (all by default have the same value of `radius`)\r\n * * The parameter `subdivisions` sets the number of subdivisions (positive integer, default 4). The more subdivisions, the more faces on the icosphere whatever its size\r\n * * The parameter `flat` (boolean, default true) gives each side its own normals. Set it to false to get a smooth continuous light reflection on the surface\r\n * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE\r\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\r\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\r\n * @param name defines the name of the mesh\r\n * @param options defines the options used to create the mesh\r\n * @param scene defines the hosting scene\r\n * @returns the icosahedron mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/polyhedra#icosphere\r\n */\r\nexport function CreateIcoSphere(\r\n name: string,\r\n options: {\r\n radius?: number;\r\n radiusX?: number;\r\n radiusY?: number;\r\n radiusZ?: number;\r\n flat?: boolean;\r\n subdivisions?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n updatable?: boolean;\r\n } = {},\r\n scene: Nullable = null\r\n): Mesh {\r\n const sphere = new Mesh(name, scene);\r\n\r\n options.sideOrientation = Mesh._GetDefaultSideOrientation(options.sideOrientation);\r\n sphere._originalBuilderSideOrientation = options.sideOrientation;\r\n\r\n const vertexData = CreateIcoSphereVertexData(options);\r\n\r\n vertexData.applyToMesh(sphere, options.updatable);\r\n\r\n return sphere;\r\n}\r\n/**\r\n * Class containing static functions to help procedurally build meshes\r\n * @deprecated use the function directly from the module\r\n */\r\nexport const IcoSphereBuilder = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CreateIcoSphere,\r\n};\r\n\r\nVertexData.CreateIcoSphere = CreateIcoSphereVertexData;\r\n\r\nMesh.CreateIcoSphere = (name: string, options: { radius?: number; flat?: boolean; subdivisions?: number; sideOrientation?: number; updatable?: boolean }, scene: Scene): Mesh => {\r\n return CreateIcoSphere(name, options, scene);\r\n};\r\n", "import { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { WebXRInput } from \"../webXRInput\";\r\nimport type { WebXRInputSource } from \"../webXRInputSource\";\r\nimport { Matrix, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { PhysicsImpostor } from \"../../Physics/v1/physicsImpostor\";\r\n\r\nimport type { IDisposable, Scene } from \"../../scene\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { InstancedMesh } from \"../../Meshes/instancedMesh\";\r\nimport type { ISceneLoaderAsyncResult } from \"../../Loading/sceneLoader\";\r\nimport { SceneLoader } from \"../../Loading/sceneLoader\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { NodeMaterial } from \"../../Materials/Node/nodeMaterial\";\r\nimport type { InputBlock } from \"../../Materials/Node/Blocks/Input/inputBlock\";\r\nimport { Material } from \"../../Materials/material\";\r\nimport { CreateIcoSphere } from \"../../Meshes/Builders/icoSphereBuilder\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Axis } from \"../../Maths/math.axis\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { WebXRCompositionLayerWrapper } from \"./Layers/WebXRCompositionLayer\";\r\n\r\ndeclare const XRHand: XRHand;\r\n\r\n/**\r\n * Configuration interface for the hand tracking feature\r\n */\r\nexport interface IWebXRHandTrackingOptions {\r\n /**\r\n * The xrInput that will be used as source for new hands\r\n */\r\n xrInput: WebXRInput;\r\n\r\n /**\r\n * Configuration object for the joint meshes.\r\n */\r\n jointMeshes?: {\r\n /**\r\n * Should the meshes created be invisible (defaults to false).\r\n */\r\n invisible?: boolean;\r\n /**\r\n * A source mesh to be used to create instances. Defaults to an icosphere with two subdivisions and smooth lighting.\r\n * This mesh will be the source for all other (25) meshes.\r\n * It should have the general size of a single unit, as the instances will be scaled according to the provided radius.\r\n */\r\n sourceMesh?: Mesh;\r\n /**\r\n * This function will be called after a mesh was created for a specific joint.\r\n * Using this function you can either manipulate the instance or return a new mesh.\r\n * When returning a new mesh the instance created before will be disposed.\r\n * @param meshInstance An instance of the original joint mesh being used for the joint.\r\n * @param jointId The joint's index, see https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section for more info.\r\n * @param hand Which hand (\"left\", \"right\") the joint will be on.\r\n */\r\n onHandJointMeshGenerated?: (meshInstance: InstancedMesh, jointId: number, hand: XRHandedness) => AbstractMesh | undefined;\r\n /**\r\n * Should the source mesh stay visible (defaults to false).\r\n */\r\n keepOriginalVisible?: boolean;\r\n /**\r\n * Should each instance have its own physics impostor\r\n */\r\n enablePhysics?: boolean;\r\n /**\r\n * If enabled, override default physics properties\r\n */\r\n physicsProps?: { friction?: number; restitution?: number; impostorType?: number };\r\n /**\r\n * Scale factor for all joint meshes (defaults to 1)\r\n */\r\n scaleFactor?: number;\r\n };\r\n\r\n /**\r\n * Configuration object for the hand meshes.\r\n */\r\n handMeshes?: {\r\n /**\r\n * Should the default hand mesh be disabled. In this case, the spheres will be visible (unless set invisible).\r\n */\r\n disableDefaultMeshes?: boolean;\r\n /**\r\n * Rigged hand meshes that will be tracked to the user's hands. This will override the default hand mesh.\r\n */\r\n customMeshes?: {\r\n right: AbstractMesh;\r\n left: AbstractMesh;\r\n };\r\n /**\r\n * Are the meshes prepared for a left-handed system. Default hand meshes are right-handed.\r\n */\r\n meshesUseLeftHandedCoordinates?: boolean;\r\n /**\r\n * If a hand mesh was provided, this array will define what axis will update which node. This will override the default hand mesh\r\n */\r\n customRigMappings?: {\r\n right: XRHandMeshRigMapping;\r\n left: XRHandMeshRigMapping;\r\n };\r\n\r\n /**\r\n * Override the colors of the hand meshes.\r\n */\r\n customColors?: {\r\n base?: Color3;\r\n fresnel?: Color3;\r\n fingerColor?: Color3;\r\n tipFresnel?: Color3;\r\n };\r\n\r\n /**\r\n * Define whether or not the hand meshes should be disposed on just invisible when the session ends.\r\n * Not setting, or setting to false, will maintain the hand meshes in the scene after the session ends, which will allow q quicker re-entry into XR.\r\n */\r\n disposeOnSessionEnd?: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Parts of the hands divided to writs and finger names\r\n */\r\nexport enum HandPart {\r\n /**\r\n * HandPart - Wrist\r\n */\r\n WRIST = \"wrist\",\r\n /**\r\n * HandPart - The thumb\r\n */\r\n THUMB = \"thumb\",\r\n /**\r\n * HandPart - Index finger\r\n */\r\n INDEX = \"index\",\r\n /**\r\n * HandPart - Middle finger\r\n */\r\n MIDDLE = \"middle\",\r\n /**\r\n * HandPart - Ring finger\r\n */\r\n RING = \"ring\",\r\n /**\r\n * HandPart - Little finger\r\n */\r\n LITTLE = \"little\",\r\n}\r\n\r\n/**\r\n * Joints of the hand as defined by the WebXR specification.\r\n * https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section\r\n */\r\nexport enum WebXRHandJoint {\r\n /** Wrist */\r\n WRIST = \"wrist\",\r\n\r\n /** Thumb near wrist */\r\n THUMB_METACARPAL = \"thumb-metacarpal\",\r\n /** Thumb first knuckle */\r\n THUMB_PHALANX_PROXIMAL = \"thumb-phalanx-proximal\",\r\n /** Thumb second knuckle */\r\n THUMB_PHALANX_DISTAL = \"thumb-phalanx-distal\",\r\n /** Thumb tip */\r\n THUMB_TIP = \"thumb-tip\",\r\n\r\n /** Index finger near wrist */\r\n INDEX_FINGER_METACARPAL = \"index-finger-metacarpal\",\r\n /** Index finger first knuckle */\r\n INDEX_FINGER_PHALANX_PROXIMAL = \"index-finger-phalanx-proximal\",\r\n /** Index finger second knuckle */\r\n INDEX_FINGER_PHALANX_INTERMEDIATE = \"index-finger-phalanx-intermediate\",\r\n /** Index finger third knuckle */\r\n INDEX_FINGER_PHALANX_DISTAL = \"index-finger-phalanx-distal\",\r\n /** Index finger tip */\r\n INDEX_FINGER_TIP = \"index-finger-tip\",\r\n\r\n /** Middle finger near wrist */\r\n MIDDLE_FINGER_METACARPAL = \"middle-finger-metacarpal\",\r\n /** Middle finger first knuckle */\r\n MIDDLE_FINGER_PHALANX_PROXIMAL = \"middle-finger-phalanx-proximal\",\r\n /** Middle finger second knuckle */\r\n MIDDLE_FINGER_PHALANX_INTERMEDIATE = \"middle-finger-phalanx-intermediate\",\r\n /** Middle finger third knuckle */\r\n MIDDLE_FINGER_PHALANX_DISTAL = \"middle-finger-phalanx-distal\",\r\n /** Middle finger tip */\r\n MIDDLE_FINGER_TIP = \"middle-finger-tip\",\r\n\r\n /** Ring finger near wrist */\r\n RING_FINGER_METACARPAL = \"ring-finger-metacarpal\",\r\n /** Ring finger first knuckle */\r\n RING_FINGER_PHALANX_PROXIMAL = \"ring-finger-phalanx-proximal\",\r\n /** Ring finger second knuckle */\r\n RING_FINGER_PHALANX_INTERMEDIATE = \"ring-finger-phalanx-intermediate\",\r\n /** Ring finger third knuckle */\r\n RING_FINGER_PHALANX_DISTAL = \"ring-finger-phalanx-distal\",\r\n /** Ring finger tip */\r\n RING_FINGER_TIP = \"ring-finger-tip\",\r\n\r\n /** Pinky finger near wrist */\r\n PINKY_FINGER_METACARPAL = \"pinky-finger-metacarpal\",\r\n /** Pinky finger first knuckle */\r\n PINKY_FINGER_PHALANX_PROXIMAL = \"pinky-finger-phalanx-proximal\",\r\n /** Pinky finger second knuckle */\r\n PINKY_FINGER_PHALANX_INTERMEDIATE = \"pinky-finger-phalanx-intermediate\",\r\n /** Pinky finger third knuckle */\r\n PINKY_FINGER_PHALANX_DISTAL = \"pinky-finger-phalanx-distal\",\r\n /** Pinky finger tip */\r\n PINKY_FINGER_TIP = \"pinky-finger-tip\",\r\n}\r\n\r\n/** A type encapsulating a dictionary mapping WebXR joints to bone names in a rigged hand mesh. */\r\nexport type XRHandMeshRigMapping = { [webXRJointName in WebXRHandJoint]: string };\r\n\r\nconst handJointReferenceArray: WebXRHandJoint[] = [\r\n WebXRHandJoint.WRIST,\r\n WebXRHandJoint.THUMB_METACARPAL,\r\n WebXRHandJoint.THUMB_PHALANX_PROXIMAL,\r\n WebXRHandJoint.THUMB_PHALANX_DISTAL,\r\n WebXRHandJoint.THUMB_TIP,\r\n WebXRHandJoint.INDEX_FINGER_METACARPAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.INDEX_FINGER_TIP,\r\n WebXRHandJoint.MIDDLE_FINGER_METACARPAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.MIDDLE_FINGER_TIP,\r\n WebXRHandJoint.RING_FINGER_METACARPAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.RING_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.RING_FINGER_TIP,\r\n WebXRHandJoint.PINKY_FINGER_METACARPAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.PINKY_FINGER_TIP,\r\n];\r\n\r\nconst handPartsDefinition: { [key in HandPart]: WebXRHandJoint[] } = {\r\n [HandPart.WRIST]: [WebXRHandJoint.WRIST],\r\n [HandPart.THUMB]: [WebXRHandJoint.THUMB_METACARPAL, WebXRHandJoint.THUMB_PHALANX_PROXIMAL, WebXRHandJoint.THUMB_PHALANX_DISTAL, WebXRHandJoint.THUMB_TIP],\r\n [HandPart.INDEX]: [\r\n WebXRHandJoint.INDEX_FINGER_METACARPAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.INDEX_FINGER_TIP,\r\n ],\r\n [HandPart.MIDDLE]: [\r\n WebXRHandJoint.MIDDLE_FINGER_METACARPAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.MIDDLE_FINGER_TIP,\r\n ],\r\n [HandPart.RING]: [\r\n WebXRHandJoint.RING_FINGER_METACARPAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.RING_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.RING_FINGER_TIP,\r\n ],\r\n [HandPart.LITTLE]: [\r\n WebXRHandJoint.PINKY_FINGER_METACARPAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.PINKY_FINGER_TIP,\r\n ],\r\n};\r\n\r\n/**\r\n * Representing a single hand (with its corresponding native XRHand object)\r\n */\r\nexport class WebXRHand implements IDisposable {\r\n private _scene: Scene;\r\n\r\n /**\r\n * Transform nodes that will directly receive the transforms from the WebXR matrix data.\r\n */\r\n private _jointTransforms = new Array(handJointReferenceArray.length);\r\n\r\n /**\r\n * The float array that will directly receive the transform matrix data from WebXR.\r\n */\r\n private _jointTransformMatrices = new Float32Array(handJointReferenceArray.length * 16);\r\n\r\n private _tempJointMatrix = new Matrix();\r\n\r\n /**\r\n * The float array that will directly receive the joint radii from WebXR.\r\n */\r\n private _jointRadii = new Float32Array(handJointReferenceArray.length);\r\n\r\n /**\r\n * Get the hand mesh.\r\n */\r\n public get handMesh(): Nullable {\r\n return this._handMesh;\r\n }\r\n\r\n /**\r\n * Get meshes of part of the hand.\r\n * @param part The part of hand to get.\r\n * @returns An array of meshes that correlate to the hand part requested.\r\n */\r\n public getHandPartMeshes(part: HandPart): AbstractMesh[] {\r\n return handPartsDefinition[part].map((name) => this._jointMeshes[handJointReferenceArray.indexOf(name)]!);\r\n }\r\n\r\n /**\r\n * Retrieves a mesh linked to a named joint in the hand.\r\n * @param jointName The name of the joint.\r\n * @returns An AbstractMesh whose position corresponds with the joint position.\r\n */\r\n public getJointMesh(jointName: WebXRHandJoint): AbstractMesh {\r\n return this._jointMeshes[handJointReferenceArray.indexOf(jointName)!];\r\n }\r\n\r\n /**\r\n * Construct a new hand object\r\n * @param xrController The controller to which the hand correlates.\r\n * @param _jointMeshes The meshes to be used to track the hand joints.\r\n * @param _handMesh An optional hand mesh.\r\n * @param rigMapping An optional rig mapping for the hand mesh.\r\n * If not provided (but a hand mesh is provided),\r\n * it will be assumed that the hand mesh's bones are named\r\n * directly after the WebXR bone names.\r\n * @param _leftHandedMeshes Are the hand meshes left-handed-system meshes\r\n * @param _jointsInvisible Are the tracked joint meshes visible\r\n * @param _jointScaleFactor Scale factor for all joint meshes\r\n */\r\n constructor(\r\n /** The controller to which the hand correlates. */\r\n public readonly xrController: WebXRInputSource,\r\n private readonly _jointMeshes: AbstractMesh[],\r\n private _handMesh: Nullable,\r\n /** An optional rig mapping for the hand mesh. If not provided (but a hand mesh is provided),\r\n * it will be assumed that the hand mesh's bones are named directly after the WebXR bone names. */\r\n readonly rigMapping: Nullable,\r\n private readonly _leftHandedMeshes: boolean = false,\r\n private readonly _jointsInvisible: boolean = false,\r\n private readonly _jointScaleFactor: number = 1\r\n ) {\r\n this._scene = _jointMeshes[0].getScene();\r\n\r\n // Initialize the joint transform quaternions and link the transforms to the bones.\r\n for (let jointIdx = 0; jointIdx < this._jointTransforms.length; jointIdx++) {\r\n const jointTransform = (this._jointTransforms[jointIdx] = new TransformNode(handJointReferenceArray[jointIdx], this._scene));\r\n jointTransform.rotationQuaternion = new Quaternion();\r\n\r\n // Set the rotation quaternion so we can use it later for tracking.\r\n _jointMeshes[jointIdx].rotationQuaternion = new Quaternion();\r\n }\r\n\r\n if (_handMesh) {\r\n // Note that this logic needs to happen after we initialize the joint tracking transform nodes.\r\n this.setHandMesh(_handMesh, rigMapping);\r\n }\r\n\r\n // hide the motion controller, if available/loaded\r\n if (this.xrController.motionController) {\r\n if (this.xrController.motionController.rootMesh) {\r\n this.xrController.motionController.rootMesh.dispose(false, true);\r\n }\r\n }\r\n\r\n this.xrController.onMotionControllerInitObservable.add((motionController) => {\r\n motionController._doNotLoadControllerMesh = true;\r\n });\r\n }\r\n\r\n /**\r\n * Sets the current hand mesh to render for the WebXRHand.\r\n * @param handMesh The rigged hand mesh that will be tracked to the user's hand.\r\n * @param rigMapping The mapping from XRHandJoint to bone names to use with the mesh.\r\n * @param _xrSessionManager The XRSessionManager used to initialize the hand mesh.\r\n */\r\n public setHandMesh(handMesh: AbstractMesh, rigMapping: Nullable, _xrSessionManager?: WebXRSessionManager) {\r\n this._handMesh = handMesh;\r\n\r\n // Avoid any strange frustum culling. We will manually control visibility via attach and detach.\r\n handMesh.alwaysSelectAsActiveMesh = true;\r\n handMesh.getChildMeshes().forEach((mesh) => {\r\n mesh.alwaysSelectAsActiveMesh = true;\r\n });\r\n\r\n // Link the bones in the hand mesh to the transform nodes that will be bound to the WebXR tracked joints.\r\n if (this._handMesh.skeleton) {\r\n const handMeshSkeleton = this._handMesh.skeleton;\r\n handJointReferenceArray.forEach((jointName, jointIdx) => {\r\n const jointBoneIdx = handMeshSkeleton.getBoneIndexByName(rigMapping ? rigMapping[jointName] : jointName);\r\n if (jointBoneIdx !== -1) {\r\n handMeshSkeleton.bones[jointBoneIdx].linkTransformNode(this._jointTransforms[jointIdx]);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Update this hand from the latest xr frame.\r\n * @param xrFrame The latest frame received from WebXR.\r\n * @param referenceSpace The current viewer reference space.\r\n */\r\n public updateFromXRFrame(xrFrame: XRFrame, referenceSpace: XRReferenceSpace) {\r\n const hand = this.xrController.inputSource.hand;\r\n if (!hand) {\r\n return;\r\n }\r\n\r\n // TODO: Modify webxr.d.ts to better match WebXR IDL so we don't need this any cast.\r\n const anyHand: any = hand;\r\n const jointSpaces: XRJointSpace[] = handJointReferenceArray.map((jointName) => anyHand[jointName] || hand.get(jointName));\r\n let trackingSuccessful = false;\r\n\r\n if (xrFrame.fillPoses && xrFrame.fillJointRadii) {\r\n trackingSuccessful = xrFrame.fillPoses(jointSpaces, referenceSpace, this._jointTransformMatrices) && xrFrame.fillJointRadii(jointSpaces, this._jointRadii);\r\n } else if (xrFrame.getJointPose) {\r\n trackingSuccessful = true;\r\n // Warning: This codepath is slow by comparison, only here for compat.\r\n for (let jointIdx = 0; jointIdx < jointSpaces.length; jointIdx++) {\r\n const jointPose = xrFrame.getJointPose(jointSpaces[jointIdx], referenceSpace);\r\n if (jointPose) {\r\n this._jointTransformMatrices.set(jointPose.transform.matrix, jointIdx * 16);\r\n this._jointRadii[jointIdx] = jointPose.radius || 0.008;\r\n } else {\r\n trackingSuccessful = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!trackingSuccessful) {\r\n return;\r\n }\r\n\r\n handJointReferenceArray.forEach((_jointName, jointIdx) => {\r\n const jointTransform = this._jointTransforms[jointIdx];\r\n Matrix.FromArrayToRef(this._jointTransformMatrices, jointIdx * 16, this._tempJointMatrix);\r\n this._tempJointMatrix.decompose(undefined, jointTransform.rotationQuaternion!, jointTransform.position);\r\n\r\n // The radius we need to make the joint in order for it to roughly cover the joints of the user's real hand.\r\n const scaledJointRadius = this._jointRadii[jointIdx] * this._jointScaleFactor;\r\n\r\n const jointMesh = this._jointMeshes[jointIdx];\r\n jointMesh.isVisible = !this._handMesh && !this._jointsInvisible;\r\n jointMesh.position.copyFrom(jointTransform.position);\r\n jointMesh.rotationQuaternion!.copyFrom(jointTransform.rotationQuaternion!);\r\n jointMesh.scaling.setAll(scaledJointRadius);\r\n\r\n // The WebXR data comes as right-handed, so we might need to do some conversions.\r\n if (!this._scene.useRightHandedSystem) {\r\n jointMesh.position.z *= -1;\r\n jointMesh.rotationQuaternion!.z *= -1;\r\n jointMesh.rotationQuaternion!.w *= -1;\r\n\r\n if (this._leftHandedMeshes && this._handMesh) {\r\n jointTransform.position.z *= -1;\r\n jointTransform.rotationQuaternion!.z *= -1;\r\n jointTransform.rotationQuaternion!.w *= -1;\r\n }\r\n }\r\n });\r\n\r\n if (this._handMesh) {\r\n this._handMesh.isVisible = true;\r\n }\r\n }\r\n\r\n /**\r\n * Dispose this Hand object\r\n * @param disposeMeshes Should the meshes be disposed as well\r\n */\r\n public dispose(disposeMeshes = false) {\r\n if (this._handMesh) {\r\n if (disposeMeshes) {\r\n this._handMesh.skeleton?.dispose();\r\n this._handMesh.dispose(false, true);\r\n } else {\r\n this._handMesh.isVisible = false;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * WebXR Hand Joint tracking feature, available for selected browsers and devices\r\n */\r\nexport class WebXRHandTracking extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.HAND_TRACKING;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /** The base URL for the default hand model. */\r\n public static DEFAULT_HAND_MODEL_BASE_URL = \"https://assets.babylonjs.com/meshes/HandMeshes/\";\r\n /** The filename to use for the default right hand model. */\r\n public static DEFAULT_HAND_MODEL_RIGHT_FILENAME = \"r_hand_rhs.glb\";\r\n /** The filename to use for the default left hand model. */\r\n public static DEFAULT_HAND_MODEL_LEFT_FILENAME = \"l_hand_rhs.glb\";\r\n /** The URL pointing to the default hand model NodeMaterial shader. */\r\n public static DEFAULT_HAND_MODEL_SHADER_URL = \"https://assets.babylonjs.com/meshes/HandMeshes/handsShader.json\";\r\n\r\n // We want to use lightweight models, diameter will initially be 1 but scaled to the values returned from WebXR.\r\n private static readonly _ICOSPHERE_PARAMS = { radius: 0.5, flat: false, subdivisions: 2 };\r\n\r\n private static _RightHandGLB: Nullable = null;\r\n private static _LeftHandGLB: Nullable = null;\r\n\r\n private static _GenerateTrackedJointMeshes(featureOptions: IWebXRHandTrackingOptions): { left: AbstractMesh[]; right: AbstractMesh[] } {\r\n const meshes: { [handedness: string]: AbstractMesh[] } = {};\r\n [\"left\" as XRHandedness, \"right\" as XRHandedness].map((handedness) => {\r\n const trackedMeshes = [];\r\n const originalMesh = featureOptions.jointMeshes?.sourceMesh || CreateIcoSphere(\"jointParent\", WebXRHandTracking._ICOSPHERE_PARAMS);\r\n originalMesh.isVisible = !!featureOptions.jointMeshes?.keepOriginalVisible;\r\n for (let i = 0; i < handJointReferenceArray.length; ++i) {\r\n let newInstance: AbstractMesh = originalMesh.createInstance(`${handedness}-handJoint-${i}`);\r\n if (featureOptions.jointMeshes?.onHandJointMeshGenerated) {\r\n const returnedMesh = featureOptions.jointMeshes.onHandJointMeshGenerated(newInstance as InstancedMesh, i, handedness);\r\n if (returnedMesh) {\r\n if (returnedMesh !== newInstance) {\r\n newInstance.dispose();\r\n newInstance = returnedMesh;\r\n }\r\n }\r\n }\r\n newInstance.isPickable = false;\r\n if (featureOptions.jointMeshes?.enablePhysics) {\r\n const props = featureOptions.jointMeshes?.physicsProps || {};\r\n // downscale the instances so that physics will be initialized correctly\r\n newInstance.scaling.setAll(0.02);\r\n const type = props.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;\r\n newInstance.physicsImpostor = new PhysicsImpostor(newInstance, type, { mass: 0, ...props });\r\n }\r\n newInstance.rotationQuaternion = new Quaternion();\r\n newInstance.isVisible = false;\r\n trackedMeshes.push(newInstance);\r\n }\r\n\r\n meshes[handedness] = trackedMeshes;\r\n });\r\n return { left: meshes.left, right: meshes.right };\r\n }\r\n\r\n private static _GenerateDefaultHandMeshesAsync(\r\n scene: Scene,\r\n xrSessionManager: WebXRSessionManager,\r\n options?: IWebXRHandTrackingOptions\r\n ): Promise<{ left: AbstractMesh; right: AbstractMesh }> {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const riggedMeshes: { [handedness: string]: AbstractMesh } = {};\r\n // check the cache, defensive\r\n if (WebXRHandTracking._RightHandGLB?.meshes[1]?.isDisposed()) {\r\n WebXRHandTracking._RightHandGLB = null;\r\n }\r\n if (WebXRHandTracking._LeftHandGLB?.meshes[1]?.isDisposed()) {\r\n WebXRHandTracking._LeftHandGLB = null;\r\n }\r\n\r\n const handsDefined = !!(WebXRHandTracking._RightHandGLB && WebXRHandTracking._LeftHandGLB);\r\n // load them in parallel\r\n const handGLBs = await Promise.all([\r\n WebXRHandTracking._RightHandGLB ||\r\n SceneLoader.ImportMeshAsync(\"\", WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL, WebXRHandTracking.DEFAULT_HAND_MODEL_RIGHT_FILENAME, scene),\r\n WebXRHandTracking._LeftHandGLB ||\r\n SceneLoader.ImportMeshAsync(\"\", WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL, WebXRHandTracking.DEFAULT_HAND_MODEL_LEFT_FILENAME, scene),\r\n ]);\r\n WebXRHandTracking._RightHandGLB = handGLBs[0];\r\n WebXRHandTracking._LeftHandGLB = handGLBs[1];\r\n\r\n const handShader = await NodeMaterial.ParseFromFileAsync(\"handShader\", WebXRHandTracking.DEFAULT_HAND_MODEL_SHADER_URL, scene);\r\n\r\n // depth prepass and alpha mode\r\n handShader.needDepthPrePass = true;\r\n handShader.transparencyMode = Material.MATERIAL_ALPHABLEND;\r\n handShader.alphaMode = Constants.ALPHA_COMBINE;\r\n\r\n // build node materials\r\n handShader.build(false);\r\n\r\n // shader\r\n const handColors = {\r\n base: Color3.FromInts(116, 63, 203),\r\n fresnel: Color3.FromInts(149, 102, 229),\r\n fingerColor: Color3.FromInts(177, 130, 255),\r\n tipFresnel: Color3.FromInts(220, 200, 255),\r\n ...options?.handMeshes?.customColors,\r\n };\r\n\r\n const handNodes = {\r\n base: handShader.getBlockByName(\"baseColor\") as InputBlock,\r\n fresnel: handShader.getBlockByName(\"fresnelColor\") as InputBlock,\r\n fingerColor: handShader.getBlockByName(\"fingerColor\") as InputBlock,\r\n tipFresnel: handShader.getBlockByName(\"tipFresnelColor\") as InputBlock,\r\n };\r\n\r\n handNodes.base.value = handColors.base;\r\n handNodes.fresnel.value = handColors.fresnel;\r\n handNodes.fingerColor.value = handColors.fingerColor;\r\n handNodes.tipFresnel.value = handColors.tipFresnel;\r\n const isMultiview = (xrSessionManager._getBaseLayerWrapper() as WebXRCompositionLayerWrapper)?.isMultiview;\r\n [\"left\", \"right\"].forEach((handedness) => {\r\n const handGLB = handedness == \"left\" ? WebXRHandTracking._LeftHandGLB : WebXRHandTracking._RightHandGLB;\r\n if (!handGLB) {\r\n // this should never happen!\r\n throw new Error(\"Could not load hand model\");\r\n }\r\n const handMesh = handGLB.meshes[1];\r\n handMesh._internalAbstractMeshDataInfo._computeBonesUsingShaders = true;\r\n // if in multiview do not use the material\r\n if (!isMultiview) {\r\n handMesh.material = handShader.clone(`${handedness}HandShaderClone`, true);\r\n }\r\n handMesh.isVisible = false;\r\n\r\n riggedMeshes[handedness] = handMesh;\r\n\r\n // single change for left handed systems\r\n if (!handsDefined && !scene.useRightHandedSystem) {\r\n handGLB.meshes[1].rotate(Axis.Y, Math.PI);\r\n }\r\n });\r\n\r\n handShader.dispose();\r\n resolve({ left: riggedMeshes.left, right: riggedMeshes.right });\r\n });\r\n }\r\n\r\n /**\r\n * Generates a mapping from XRHandJoint to bone name for the default hand mesh.\r\n * @param handedness The handedness being mapped for.\r\n * @returns A mapping from XRHandJoint to bone name.\r\n */\r\n private static _GenerateDefaultHandMeshRigMapping(handedness: XRHandedness): XRHandMeshRigMapping {\r\n const H = handedness == \"right\" ? \"R\" : \"L\";\r\n return {\r\n [WebXRHandJoint.WRIST]: `wrist_${H}`,\r\n [WebXRHandJoint.THUMB_METACARPAL]: `thumb_metacarpal_${H}`,\r\n [WebXRHandJoint.THUMB_PHALANX_PROXIMAL]: `thumb_proxPhalanx_${H}`,\r\n [WebXRHandJoint.THUMB_PHALANX_DISTAL]: `thumb_distPhalanx_${H}`,\r\n [WebXRHandJoint.THUMB_TIP]: `thumb_tip_${H}`,\r\n [WebXRHandJoint.INDEX_FINGER_METACARPAL]: `index_metacarpal_${H}`,\r\n [WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL]: `index_proxPhalanx_${H}`,\r\n [WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE]: `index_intPhalanx_${H}`,\r\n [WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL]: `index_distPhalanx_${H}`,\r\n [WebXRHandJoint.INDEX_FINGER_TIP]: `index_tip_${H}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_METACARPAL]: `middle_metacarpal_${H}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL]: `middle_proxPhalanx_${H}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE]: `middle_intPhalanx_${H}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL]: `middle_distPhalanx_${H}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_TIP]: `middle_tip_${H}`,\r\n [WebXRHandJoint.RING_FINGER_METACARPAL]: `ring_metacarpal_${H}`,\r\n [WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL]: `ring_proxPhalanx_${H}`,\r\n [WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE]: `ring_intPhalanx_${H}`,\r\n [WebXRHandJoint.RING_FINGER_PHALANX_DISTAL]: `ring_distPhalanx_${H}`,\r\n [WebXRHandJoint.RING_FINGER_TIP]: `ring_tip_${H}`,\r\n [WebXRHandJoint.PINKY_FINGER_METACARPAL]: `little_metacarpal_${H}`,\r\n [WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL]: `little_proxPhalanx_${H}`,\r\n [WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE]: `little_intPhalanx_${H}`,\r\n [WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL]: `little_distPhalanx_${H}`,\r\n [WebXRHandJoint.PINKY_FINGER_TIP]: `little_tip_${H}`,\r\n };\r\n }\r\n\r\n private _attachedHands: {\r\n [uniqueId: string]: WebXRHand;\r\n } = {};\r\n\r\n private _trackingHands: {\r\n left: Nullable;\r\n right: Nullable;\r\n } = { left: null, right: null };\r\n\r\n private _handResources: {\r\n jointMeshes: Nullable<{ left: AbstractMesh[]; right: AbstractMesh[] }>;\r\n handMeshes: Nullable<{ left: AbstractMesh; right: AbstractMesh }>;\r\n rigMappings: Nullable<{ left: XRHandMeshRigMapping; right: XRHandMeshRigMapping }>;\r\n } = { jointMeshes: null, handMeshes: null, rigMappings: null };\r\n\r\n private _worldScaleObserver?: Nullable> = null;\r\n\r\n /**\r\n * This observable will notify registered observers when a new hand object was added and initialized\r\n */\r\n public onHandAddedObservable: Observable = new Observable();\r\n /**\r\n * This observable will notify its observers right before the hand object is disposed\r\n */\r\n public onHandRemovedObservable: Observable = new Observable();\r\n\r\n /**\r\n * Check if the needed objects are defined.\r\n * This does not mean that the feature is enabled, but that the objects needed are well defined.\r\n * @returns true if the needed objects for this feature are defined\r\n */\r\n public isCompatible(): boolean {\r\n return typeof XRHand !== \"undefined\";\r\n }\r\n\r\n /**\r\n * Get the hand object according to the controller id\r\n * @param controllerId the controller id to which we want to get the hand\r\n * @returns null if not found or the WebXRHand object if found\r\n */\r\n public getHandByControllerId(controllerId: string): Nullable {\r\n return this._attachedHands[controllerId];\r\n }\r\n\r\n /**\r\n * Get a hand object according to the requested handedness\r\n * @param handedness the handedness to request\r\n * @returns null if not found or the WebXRHand object if found\r\n */\r\n public getHandByHandedness(handedness: XRHandedness): Nullable {\r\n if (handedness == \"none\") {\r\n return null;\r\n }\r\n return this._trackingHands[handedness];\r\n }\r\n\r\n /**\r\n * Creates a new instance of the XR hand tracking feature.\r\n * @param _xrSessionManager An instance of WebXRSessionManager.\r\n * @param options Options to use when constructing this feature.\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /** Options to use when constructing this feature. */\r\n public readonly options: IWebXRHandTrackingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"hand-tracking\";\r\n\r\n // Support legacy versions of the options object by copying over joint mesh properties\r\n const anyOptions = options as any;\r\n const anyJointMeshOptions = anyOptions.jointMeshes;\r\n if (anyJointMeshOptions) {\r\n if (typeof anyJointMeshOptions.disableDefaultHandMesh !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.disableDefaultMeshes = anyJointMeshOptions.disableDefaultHandMesh;\r\n }\r\n if (typeof anyJointMeshOptions.handMeshes !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.customMeshes = anyJointMeshOptions.handMeshes;\r\n }\r\n if (typeof anyJointMeshOptions.leftHandedSystemMeshes !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.meshesUseLeftHandedCoordinates = anyJointMeshOptions.leftHandedSystemMeshes;\r\n }\r\n if (typeof anyJointMeshOptions.rigMapping !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n const leftRigMapping = {};\r\n const rightRigMapping = {};\r\n [\r\n [anyJointMeshOptions.rigMapping.left, leftRigMapping],\r\n [anyJointMeshOptions.rigMapping.right, rightRigMapping],\r\n ].forEach((rigMappingTuple) => {\r\n const legacyRigMapping = rigMappingTuple[0] as string[];\r\n const rigMapping = rigMappingTuple[1] as XRHandMeshRigMapping;\r\n legacyRigMapping.forEach((modelJointName, index) => {\r\n rigMapping[handJointReferenceArray[index]] = modelJointName;\r\n });\r\n });\r\n options.handMeshes.customRigMappings = {\r\n left: leftRigMapping as XRHandMeshRigMapping,\r\n right: rightRigMapping as XRHandMeshRigMapping,\r\n };\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Attach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n this._handResources = {\r\n jointMeshes: WebXRHandTracking._GenerateTrackedJointMeshes(this.options),\r\n handMeshes: this.options.handMeshes?.customMeshes || null,\r\n rigMappings: this.options.handMeshes?.customRigMappings || null,\r\n };\r\n\r\n // If they didn't supply custom meshes and are not disabling the default meshes...\r\n if (!this.options.handMeshes?.customMeshes && !this.options.handMeshes?.disableDefaultMeshes) {\r\n WebXRHandTracking._GenerateDefaultHandMeshesAsync(EngineStore.LastCreatedScene!, this._xrSessionManager, this.options).then((defaultHandMeshes) => {\r\n this._handResources.handMeshes = defaultHandMeshes;\r\n this._handResources.rigMappings = {\r\n left: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"left\"),\r\n right: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"right\"),\r\n };\r\n\r\n // Apply meshes to existing hands if already tracking.\r\n this._trackingHands.left?.setHandMesh(this._handResources.handMeshes.left, this._handResources.rigMappings.left, this._xrSessionManager);\r\n this._trackingHands.right?.setHandMesh(this._handResources.handMeshes.right, this._handResources.rigMappings.right, this._xrSessionManager);\r\n this._handResources.handMeshes.left.scaling.setAll(this._xrSessionManager.worldScalingFactor);\r\n this._handResources.handMeshes.right.scaling.setAll(this._xrSessionManager.worldScalingFactor);\r\n });\r\n this._worldScaleObserver = this._xrSessionManager.onWorldScaleFactorChangedObservable.add((scalingFactors) => {\r\n if (this._handResources.handMeshes) {\r\n this._handResources.handMeshes.left.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor);\r\n this._handResources.handMeshes.right.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor);\r\n }\r\n });\r\n }\r\n\r\n this.options.xrInput.controllers.forEach(this._attachHand);\r\n this._addNewAttachObserver(this.options.xrInput.onControllerAddedObservable, this._attachHand);\r\n this._addNewAttachObserver(this.options.xrInput.onControllerRemovedObservable, this._detachHand);\r\n\r\n return true;\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n this._trackingHands.left?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace);\r\n this._trackingHands.right?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace);\r\n }\r\n\r\n private _attachHand = (xrController: WebXRInputSource) => {\r\n if (!xrController.inputSource.hand || xrController.inputSource.handedness == \"none\" || !this._handResources.jointMeshes) {\r\n return;\r\n }\r\n\r\n const handedness = xrController.inputSource.handedness;\r\n const webxrHand = new WebXRHand(\r\n xrController,\r\n this._handResources.jointMeshes[handedness],\r\n this._handResources.handMeshes && this._handResources.handMeshes[handedness],\r\n this._handResources.rigMappings && this._handResources.rigMappings[handedness],\r\n this.options.handMeshes?.meshesUseLeftHandedCoordinates,\r\n this.options.jointMeshes?.invisible,\r\n this.options.jointMeshes?.scaleFactor\r\n );\r\n\r\n this._attachedHands[xrController.uniqueId] = webxrHand;\r\n this._trackingHands[handedness] = webxrHand;\r\n\r\n this.onHandAddedObservable.notifyObservers(webxrHand);\r\n };\r\n\r\n private _detachHandById(controllerId: string, disposeMesh?: boolean) {\r\n const hand = this.getHandByControllerId(controllerId);\r\n if (hand) {\r\n const handedness = hand.xrController.inputSource.handedness == \"left\" ? \"left\" : \"right\";\r\n if (this._trackingHands[handedness]?.xrController.uniqueId === controllerId) {\r\n this._trackingHands[handedness] = null;\r\n }\r\n this.onHandRemovedObservable.notifyObservers(hand);\r\n hand.dispose(disposeMesh);\r\n delete this._attachedHands[controllerId];\r\n }\r\n }\r\n\r\n private _detachHand = (xrController: WebXRInputSource) => {\r\n this._detachHandById(xrController.uniqueId);\r\n };\r\n\r\n /**\r\n * Detach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n Object.keys(this._attachedHands).forEach((uniqueId) => this._detachHandById(uniqueId, this.options.handMeshes?.disposeOnSessionEnd));\r\n if (this.options.handMeshes?.disposeOnSessionEnd) {\r\n if (this._handResources.jointMeshes) {\r\n this._handResources.jointMeshes.left.forEach((trackedMesh) => trackedMesh.dispose());\r\n this._handResources.jointMeshes.right.forEach((trackedMesh) => trackedMesh.dispose());\r\n }\r\n }\r\n\r\n // remove world scale observer\r\n if (this._worldScaleObserver) {\r\n this._xrSessionManager.onWorldScaleFactorChangedObservable.remove(this._worldScaleObserver);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n this.onHandAddedObservable.clear();\r\n this.onHandRemovedObservable.clear();\r\n\r\n if (this._handResources.handMeshes && !this.options.handMeshes?.customMeshes) {\r\n // this will dispose the cached meshes\r\n this._handResources.handMeshes.left.dispose();\r\n this._handResources.handMeshes.right.dispose();\r\n // remove the cached meshes\r\n WebXRHandTracking._RightHandGLB = null;\r\n WebXRHandTracking._LeftHandGLB = null;\r\n }\r\n\r\n if (this._handResources.jointMeshes) {\r\n this._handResources.jointMeshes.left.forEach((trackedMesh) => trackedMesh.dispose());\r\n this._handResources.jointMeshes.right.forEach((trackedMesh) => trackedMesh.dispose());\r\n }\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRHandTracking.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRHandTracking(xrSessionManager, options);\r\n },\r\n WebXRHandTracking.Version,\r\n false\r\n);\r\n", "import type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { WebXRFeatureName } from \"../../XR/webXRFeaturesManager\";\r\nimport type { WebXRFeaturesManager } from \"../../XR/webXRFeaturesManager\";\r\nimport type { WebXREyeTracking } from \"../../XR/features/WebXREyeTracking\";\r\nimport type { WebXRHandTracking } from \"../../XR/features/WebXRHandTracking\";\r\nimport { WebXRHandJoint } from \"../../XR/features/WebXRHandTracking\";\r\nimport type { WebXRExperienceHelper } from \"../../XR/webXRExperienceHelper\";\r\nimport type { Behavior } from \"../behavior\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Quaternion, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { Ray } from \"../../Culling/ray\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/**\r\n * Zones around the hand\r\n */\r\nexport enum HandConstraintZone {\r\n /**\r\n * Above finger tips\r\n */\r\n ABOVE_FINGER_TIPS,\r\n /**\r\n * Next to the thumb\r\n */\r\n RADIAL_SIDE,\r\n /**\r\n * Next to the pinky finger\r\n */\r\n ULNAR_SIDE,\r\n /**\r\n * Below the wrist\r\n */\r\n BELOW_WRIST,\r\n}\r\n\r\n/**\r\n * Orientations for the hand zones and for the attached node\r\n */\r\nexport enum HandConstraintOrientation {\r\n /**\r\n * Orientation is towards the camera\r\n */\r\n LOOK_AT_CAMERA,\r\n /**\r\n * Orientation is determined by the rotation of the palm\r\n */\r\n HAND_ROTATION,\r\n}\r\n\r\n/**\r\n * Orientations for the hand zones and for the attached node\r\n */\r\nexport enum HandConstraintVisibility {\r\n /**\r\n * Constraint is always visible\r\n */\r\n ALWAYS_VISIBLE,\r\n /**\r\n * Constraint is only visible when the palm is up\r\n */\r\n PALM_UP,\r\n /**\r\n * Constraint is only visible when the user is looking at the constraint.\r\n * Uses XR Eye Tracking if enabled/available, otherwise uses camera direction\r\n */\r\n GAZE_FOCUS,\r\n /**\r\n * Constraint is only visible when the palm is up and the user is looking at it\r\n */\r\n PALM_AND_GAZE,\r\n}\r\n\r\ntype HandPoseInfo = {\r\n position: Vector3;\r\n quaternion: Quaternion;\r\n id: string;\r\n};\r\n\r\n/**\r\n * Hand constraint behavior that makes the attached `TransformNode` follow hands in XR experiences.\r\n * @since 5.0.0\r\n */\r\nexport class HandConstraintBehavior implements Behavior {\r\n private _scene: Scene;\r\n private _node: TransformNode;\r\n private _eyeTracking: Nullable;\r\n private _handTracking: Nullable;\r\n private _sceneRenderObserver: Nullable> = null;\r\n private _zoneAxis: { [id: number]: Vector3 } = {};\r\n\r\n /**\r\n * Sets the HandConstraintVisibility level for the hand constraint\r\n */\r\n public handConstraintVisibility: HandConstraintVisibility = HandConstraintVisibility.PALM_AND_GAZE;\r\n\r\n /**\r\n * A number from 0.0 to 1.0, marking how restricted the direction the palm faces is for the attached node to be enabled.\r\n * A 1 means the palm must be directly facing the user before the node is enabled, a 0 means it is always enabled.\r\n * Used with HandConstraintVisibility.PALM_UP\r\n */\r\n public palmUpStrictness: number = 0.95;\r\n\r\n /**\r\n * The radius in meters around the center of the hand that the user must gaze inside for the attached node to be enabled and appear.\r\n * Used with HandConstraintVisibility.GAZE_FOCUS\r\n */\r\n public gazeProximityRadius: number = 0.15;\r\n\r\n /**\r\n * Offset distance from the hand in meters\r\n */\r\n public targetOffset: number = 0.1;\r\n\r\n /**\r\n * Where to place the node regarding the center of the hand.\r\n */\r\n public targetZone: HandConstraintZone = HandConstraintZone.ULNAR_SIDE;\r\n\r\n /**\r\n * Orientation mode of the 4 zones around the hand\r\n */\r\n public zoneOrientationMode: HandConstraintOrientation = HandConstraintOrientation.HAND_ROTATION;\r\n /**\r\n * Orientation mode of the node attached to this behavior\r\n */\r\n public nodeOrientationMode: HandConstraintOrientation = HandConstraintOrientation.HAND_ROTATION;\r\n\r\n /**\r\n * Set the hand this behavior should follow. If set to \"none\", it will follow any visible hand (prioritising the left one).\r\n */\r\n public handedness: XRHandedness = \"none\";\r\n\r\n /**\r\n * Rate of interpolation of position and rotation of the attached node.\r\n * Higher values will give a slower interpolation.\r\n */\r\n public lerpTime = 100;\r\n\r\n /**\r\n * Builds a hand constraint behavior\r\n */\r\n constructor() {\r\n // For a right hand\r\n this._zoneAxis[HandConstraintZone.ABOVE_FINGER_TIPS] = new Vector3(0, 1, 0);\r\n this._zoneAxis[HandConstraintZone.RADIAL_SIDE] = new Vector3(-1, 0, 0);\r\n this._zoneAxis[HandConstraintZone.ULNAR_SIDE] = new Vector3(1, 0, 0);\r\n this._zoneAxis[HandConstraintZone.BELOW_WRIST] = new Vector3(0, -1, 0);\r\n }\r\n\r\n /** gets or sets behavior's name */\r\n public get name() {\r\n return \"HandConstraint\";\r\n }\r\n\r\n /** Enable the behavior */\r\n public enable() {\r\n this._node.setEnabled(true);\r\n }\r\n\r\n /** Disable the behavior */\r\n public disable() {\r\n this._node.setEnabled(false);\r\n }\r\n\r\n private _getHandPose(): Nullable {\r\n if (!this._handTracking) {\r\n return null;\r\n }\r\n\r\n // Retrieve any available hand, starting by the left\r\n let hand;\r\n if (this.handedness === \"none\") {\r\n hand = this._handTracking.getHandByHandedness(\"left\") || this._handTracking.getHandByHandedness(\"right\");\r\n } else {\r\n hand = this._handTracking.getHandByHandedness(this.handedness);\r\n }\r\n\r\n if (hand) {\r\n const pinkyMetacarpal = hand.getJointMesh(WebXRHandJoint.PINKY_FINGER_METACARPAL);\r\n const middleMetacarpal = hand.getJointMesh(WebXRHandJoint.MIDDLE_FINGER_METACARPAL);\r\n const wrist = hand.getJointMesh(WebXRHandJoint.WRIST);\r\n\r\n if (wrist && middleMetacarpal && pinkyMetacarpal) {\r\n const handPose: HandPoseInfo = { position: middleMetacarpal.absolutePosition, quaternion: new Quaternion(), id: hand.xrController.uniqueId };\r\n\r\n // palm forward\r\n const up = TmpVectors.Vector3[0];\r\n const forward = TmpVectors.Vector3[1];\r\n const left = TmpVectors.Vector3[2];\r\n up.copyFrom(middleMetacarpal.absolutePosition).subtractInPlace(wrist.absolutePosition).normalize();\r\n forward.copyFrom(pinkyMetacarpal.absolutePosition).subtractInPlace(middleMetacarpal.absolutePosition).normalize();\r\n\r\n // Create vectors for a rotation quaternion, where forward points out from the palm\r\n Vector3.CrossToRef(up, forward, forward);\r\n Vector3.CrossToRef(forward, up, left);\r\n\r\n Quaternion.FromLookDirectionLHToRef(forward, up, handPose.quaternion);\r\n\r\n return handPose;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Initializes the hand constraint behavior\r\n */\r\n public init() {}\r\n\r\n /**\r\n * Attaches the hand constraint to a `TransformNode`\r\n * @param node defines the node to attach the behavior to\r\n */\r\n public attach(node: TransformNode): void {\r\n this._node = node;\r\n this._scene = node.getScene();\r\n\r\n if (!this._node.rotationQuaternion) {\r\n this._node.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._node.rotation.y, this._node.rotation.x, this._node.rotation.z);\r\n }\r\n\r\n let lastTick = Date.now();\r\n this._sceneRenderObserver = this._scene.onBeforeRenderObservable.add(() => {\r\n const pose = this._getHandPose();\r\n\r\n this._node.reservedDataStore = this._node.reservedDataStore || {};\r\n this._node.reservedDataStore.nearInteraction = this._node.reservedDataStore.nearInteraction || {};\r\n this._node.reservedDataStore.nearInteraction.excludedControllerId = null;\r\n\r\n if (pose) {\r\n const zoneOffset = TmpVectors.Vector3[0];\r\n const camera = this._scene.activeCamera;\r\n\r\n zoneOffset.copyFrom(this._zoneAxis[this.targetZone]);\r\n\r\n const cameraLookAtQuaternion = TmpVectors.Quaternion[0];\r\n if (camera && (this.zoneOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA || this.nodeOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA)) {\r\n const toCamera = TmpVectors.Vector3[1];\r\n toCamera.copyFrom(camera.position).subtractInPlace(pose.position).normalize();\r\n if (this._scene.useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion);\r\n }\r\n }\r\n\r\n if (this.zoneOrientationMode === HandConstraintOrientation.HAND_ROTATION) {\r\n pose.quaternion.toRotationMatrix(TmpVectors.Matrix[0]);\r\n } else {\r\n cameraLookAtQuaternion.toRotationMatrix(TmpVectors.Matrix[0]);\r\n }\r\n\r\n Vector3.TransformNormalToRef(zoneOffset, TmpVectors.Matrix[0], zoneOffset);\r\n zoneOffset.scaleInPlace(this.targetOffset);\r\n\r\n const targetPosition = TmpVectors.Vector3[2];\r\n const targetRotation = TmpVectors.Quaternion[1];\r\n targetPosition.copyFrom(pose.position).addInPlace(zoneOffset);\r\n\r\n if (this.nodeOrientationMode === HandConstraintOrientation.HAND_ROTATION) {\r\n targetRotation.copyFrom(pose.quaternion);\r\n } else {\r\n targetRotation.copyFrom(cameraLookAtQuaternion);\r\n }\r\n\r\n const elapsed = Date.now() - lastTick;\r\n\r\n Vector3.SmoothToRef(this._node.position, targetPosition, elapsed, this.lerpTime, this._node.position);\r\n Quaternion.SmoothToRef(this._node.rotationQuaternion!, targetRotation, elapsed, this.lerpTime, this._node.rotationQuaternion!);\r\n\r\n this._node.reservedDataStore.nearInteraction.excludedControllerId = pose.id;\r\n }\r\n\r\n this._setVisibility(pose);\r\n\r\n lastTick = Date.now();\r\n });\r\n }\r\n\r\n private _setVisibility(pose: Nullable) {\r\n let palmVisible = true;\r\n let gazeVisible = true;\r\n const camera = this._scene.activeCamera;\r\n\r\n if (camera) {\r\n const cameraForward = camera.getForwardRay();\r\n\r\n if (this.handConstraintVisibility === HandConstraintVisibility.GAZE_FOCUS || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {\r\n gazeVisible = false;\r\n let gaze: Ray | undefined;\r\n if (this._eyeTracking) {\r\n gaze = this._eyeTracking.getEyeGaze()!;\r\n }\r\n\r\n gaze = gaze || cameraForward;\r\n\r\n const gazeToBehavior = TmpVectors.Vector3[0];\r\n if (pose) {\r\n pose.position.subtractToRef(gaze.origin, gazeToBehavior);\r\n } else {\r\n this._node.getAbsolutePosition().subtractToRef(gaze.origin, gazeToBehavior);\r\n }\r\n\r\n const projectedDistance = Vector3.Dot(gazeToBehavior, gaze.direction);\r\n const projectedSquared = projectedDistance * projectedDistance;\r\n\r\n if (projectedDistance > 0) {\r\n const radiusSquared = gazeToBehavior.lengthSquared() - projectedSquared;\r\n if (radiusSquared < this.gazeProximityRadius * this.gazeProximityRadius) {\r\n gazeVisible = true;\r\n }\r\n }\r\n }\r\n\r\n if (this.handConstraintVisibility === HandConstraintVisibility.PALM_UP || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {\r\n palmVisible = false;\r\n\r\n if (pose) {\r\n const palmDirection = TmpVectors.Vector3[0];\r\n Vector3.LeftHandedForwardReadOnly.rotateByQuaternionToRef(pose.quaternion, palmDirection);\r\n\r\n if (Vector3.Dot(palmDirection, cameraForward.direction) > this.palmUpStrictness * 2 - 1) {\r\n palmVisible = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._node.setEnabled(palmVisible && gazeVisible);\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the `TransformNode`\r\n */\r\n public detach(): void {\r\n this._scene.onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n }\r\n\r\n /**\r\n * Links the behavior to the XR experience in which to retrieve hand transform information.\r\n * @param xr xr experience\r\n */\r\n public linkToXRExperience(xr: WebXRExperienceHelper | WebXRFeaturesManager) {\r\n const featuresManager: WebXRFeaturesManager = (xr as WebXRExperienceHelper).featuresManager ? (xr as WebXRExperienceHelper).featuresManager : (xr as WebXRFeaturesManager);\r\n if (!featuresManager) {\r\n Tools.Error(\"XR features manager must be available or provided directly for the Hand Menu to work\");\r\n } else {\r\n try {\r\n this._eyeTracking = featuresManager.getEnabledFeature(WebXRFeatureName.EYE_TRACKING) as WebXREyeTracking;\r\n } catch {}\r\n\r\n try {\r\n this._handTracking = featuresManager.getEnabledFeature(WebXRFeatureName.HAND_TRACKING) as WebXRHandTracking;\r\n } catch {\r\n Tools.Error(\"Hand tracking must be enabled for the Hand Menu to work\");\r\n }\r\n }\r\n }\r\n}\r\n", "import { Engine } from \"../Engines/engine\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\n/**\r\n * This groups all the flags used to control the materials channel.\r\n */\r\nexport class MaterialFlags {\r\n // Flags used to enable or disable a type of texture for all Standard Materials\r\n private static _DiffuseTextureEnabled = true;\r\n /**\r\n * Are diffuse textures enabled in the application.\r\n */\r\n public static get DiffuseTextureEnabled(): boolean {\r\n return this._DiffuseTextureEnabled;\r\n }\r\n public static set DiffuseTextureEnabled(value: boolean) {\r\n if (this._DiffuseTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._DiffuseTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _DetailTextureEnabled = true;\r\n /**\r\n * Are detail textures enabled in the application.\r\n */\r\n public static get DetailTextureEnabled(): boolean {\r\n return this._DetailTextureEnabled;\r\n }\r\n public static set DetailTextureEnabled(value: boolean) {\r\n if (this._DetailTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._DetailTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _DecalMapEnabled = true;\r\n /**\r\n * Are decal maps enabled in the application.\r\n */\r\n public static get DecalMapEnabled(): boolean {\r\n return this._DecalMapEnabled;\r\n }\r\n public static set DecalMapEnabled(value: boolean) {\r\n if (this._DecalMapEnabled === value) {\r\n return;\r\n }\r\n\r\n this._DecalMapEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _AmbientTextureEnabled = true;\r\n /**\r\n * Are ambient textures enabled in the application.\r\n */\r\n public static get AmbientTextureEnabled(): boolean {\r\n return this._AmbientTextureEnabled;\r\n }\r\n public static set AmbientTextureEnabled(value: boolean) {\r\n if (this._AmbientTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._AmbientTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _OpacityTextureEnabled = true;\r\n /**\r\n * Are opacity textures enabled in the application.\r\n */\r\n public static get OpacityTextureEnabled(): boolean {\r\n return this._OpacityTextureEnabled;\r\n }\r\n public static set OpacityTextureEnabled(value: boolean) {\r\n if (this._OpacityTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._OpacityTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _ReflectionTextureEnabled = true;\r\n /**\r\n * Are reflection textures enabled in the application.\r\n */\r\n public static get ReflectionTextureEnabled(): boolean {\r\n return this._ReflectionTextureEnabled;\r\n }\r\n public static set ReflectionTextureEnabled(value: boolean) {\r\n if (this._ReflectionTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ReflectionTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _EmissiveTextureEnabled = true;\r\n /**\r\n * Are emissive textures enabled in the application.\r\n */\r\n public static get EmissiveTextureEnabled(): boolean {\r\n return this._EmissiveTextureEnabled;\r\n }\r\n public static set EmissiveTextureEnabled(value: boolean) {\r\n if (this._EmissiveTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._EmissiveTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _SpecularTextureEnabled = true;\r\n /**\r\n * Are specular textures enabled in the application.\r\n */\r\n public static get SpecularTextureEnabled(): boolean {\r\n return this._SpecularTextureEnabled;\r\n }\r\n public static set SpecularTextureEnabled(value: boolean) {\r\n if (this._SpecularTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._SpecularTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _BumpTextureEnabled = true;\r\n /**\r\n * Are bump textures enabled in the application.\r\n */\r\n public static get BumpTextureEnabled(): boolean {\r\n return this._BumpTextureEnabled;\r\n }\r\n public static set BumpTextureEnabled(value: boolean) {\r\n if (this._BumpTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._BumpTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _LightmapTextureEnabled = true;\r\n /**\r\n * Are lightmap textures enabled in the application.\r\n */\r\n public static get LightmapTextureEnabled(): boolean {\r\n return this._LightmapTextureEnabled;\r\n }\r\n public static set LightmapTextureEnabled(value: boolean) {\r\n if (this._LightmapTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._LightmapTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _RefractionTextureEnabled = true;\r\n /**\r\n * Are refraction textures enabled in the application.\r\n */\r\n public static get RefractionTextureEnabled(): boolean {\r\n return this._RefractionTextureEnabled;\r\n }\r\n public static set RefractionTextureEnabled(value: boolean) {\r\n if (this._RefractionTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._RefractionTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _ColorGradingTextureEnabled = true;\r\n /**\r\n * Are color grading textures enabled in the application.\r\n */\r\n public static get ColorGradingTextureEnabled(): boolean {\r\n return this._ColorGradingTextureEnabled;\r\n }\r\n public static set ColorGradingTextureEnabled(value: boolean) {\r\n if (this._ColorGradingTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ColorGradingTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _FresnelEnabled = true;\r\n /**\r\n * Are fresnels enabled in the application.\r\n */\r\n public static get FresnelEnabled(): boolean {\r\n return this._FresnelEnabled;\r\n }\r\n public static set FresnelEnabled(value: boolean) {\r\n if (this._FresnelEnabled === value) {\r\n return;\r\n }\r\n\r\n this._FresnelEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_FresnelDirtyFlag);\r\n }\r\n\r\n private static _ClearCoatTextureEnabled = true;\r\n /**\r\n * Are clear coat textures enabled in the application.\r\n */\r\n public static get ClearCoatTextureEnabled(): boolean {\r\n return this._ClearCoatTextureEnabled;\r\n }\r\n public static set ClearCoatTextureEnabled(value: boolean) {\r\n if (this._ClearCoatTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ClearCoatTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _ClearCoatBumpTextureEnabled = true;\r\n /**\r\n * Are clear coat bump textures enabled in the application.\r\n */\r\n public static get ClearCoatBumpTextureEnabled(): boolean {\r\n return this._ClearCoatBumpTextureEnabled;\r\n }\r\n public static set ClearCoatBumpTextureEnabled(value: boolean) {\r\n if (this._ClearCoatBumpTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ClearCoatBumpTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _ClearCoatTintTextureEnabled = true;\r\n /**\r\n * Are clear coat tint textures enabled in the application.\r\n */\r\n public static get ClearCoatTintTextureEnabled(): boolean {\r\n return this._ClearCoatTintTextureEnabled;\r\n }\r\n public static set ClearCoatTintTextureEnabled(value: boolean) {\r\n if (this._ClearCoatTintTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ClearCoatTintTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _SheenTextureEnabled = true;\r\n /**\r\n * Are sheen textures enabled in the application.\r\n */\r\n public static get SheenTextureEnabled(): boolean {\r\n return this._SheenTextureEnabled;\r\n }\r\n public static set SheenTextureEnabled(value: boolean) {\r\n if (this._SheenTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._SheenTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _AnisotropicTextureEnabled = true;\r\n /**\r\n * Are anisotropic textures enabled in the application.\r\n */\r\n public static get AnisotropicTextureEnabled(): boolean {\r\n return this._AnisotropicTextureEnabled;\r\n }\r\n public static set AnisotropicTextureEnabled(value: boolean) {\r\n if (this._AnisotropicTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._AnisotropicTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _ThicknessTextureEnabled = true;\r\n /**\r\n * Are thickness textures enabled in the application.\r\n */\r\n public static get ThicknessTextureEnabled(): boolean {\r\n return this._ThicknessTextureEnabled;\r\n }\r\n public static set ThicknessTextureEnabled(value: boolean) {\r\n if (this._ThicknessTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ThicknessTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _RefractionIntensityTextureEnabled = true;\r\n /**\r\n * Are refraction intensity textures enabled in the application.\r\n */\r\n public static get RefractionIntensityTextureEnabled(): boolean {\r\n return this._ThicknessTextureEnabled;\r\n }\r\n public static set RefractionIntensityTextureEnabled(value: boolean) {\r\n if (this._RefractionIntensityTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._RefractionIntensityTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _TranslucencyIntensityTextureEnabled = true;\r\n /**\r\n * Are translucency intensity textures enabled in the application.\r\n */\r\n public static get TranslucencyIntensityTextureEnabled(): boolean {\r\n return this._ThicknessTextureEnabled;\r\n }\r\n public static set TranslucencyIntensityTextureEnabled(value: boolean) {\r\n if (this._TranslucencyIntensityTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._TranslucencyIntensityTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _IridescenceTextureEnabled = true;\r\n /**\r\n * Are translucency intensity textures enabled in the application.\r\n */\r\n public static get IridescenceTextureEnabled(): boolean {\r\n return this._IridescenceTextureEnabled;\r\n }\r\n public static set IridescenceTextureEnabled(value: boolean) {\r\n if (this._IridescenceTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._IridescenceTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n}\r\n", "import type { ProcessingOptions, ShaderCustomProcessingFunction } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Material } from \"./material\";\r\nimport type {\r\n MaterialPluginPrepareEffect,\r\n MaterialPluginBindForSubMesh,\r\n MaterialPluginDisposed,\r\n MaterialPluginGetActiveTextures,\r\n MaterialPluginGetAnimatables,\r\n MaterialPluginGetDefineNames,\r\n MaterialPluginHasTexture,\r\n MaterialPluginIsReadyForSubMesh,\r\n MaterialPluginPrepareDefines,\r\n MaterialPluginPrepareUniformBuffer,\r\n MaterialPluginHardBindForSubMesh,\r\n MaterialPluginHasRenderTargetTextures,\r\n MaterialPluginFillRenderTargetTextures,\r\n} from \"./materialPluginEvent\";\r\nimport { MaterialPluginEvent } from \"./materialPluginEvent\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\nimport type { Scene } from \"../scene\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { MaterialPluginBase } from \"./materialPluginBase\";\r\nimport { ShaderProcessor } from \"../Engines/Processors/shaderProcessor\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\nimport { ShaderStore } from \"../Engines/shaderStore\";\r\n\r\ndeclare module \"./material\" {\r\n export interface Material {\r\n /**\r\n * Plugin manager for this material\r\n */\r\n pluginManager?: MaterialPluginManager;\r\n }\r\n}\r\n\r\nconst rxOption = new RegExp(\"^([gimus]+)!\");\r\n\r\n/**\r\n * Class that manages the plugins of a material\r\n * @since 5.0\r\n */\r\nexport class MaterialPluginManager {\r\n /** Map a plugin class name to a #define name (used in the vertex/fragment shaders as a marker of the plugin usage) */\r\n private static _MaterialPluginClassToMainDefine: { [name: string]: string } = {};\r\n private static _MaterialPluginCounter: number = 0;\r\n\r\n protected _material: Material;\r\n protected _scene: Scene;\r\n protected _engine: Engine;\r\n /** @internal */\r\n public _plugins: MaterialPluginBase[] = [];\r\n protected _activePlugins: MaterialPluginBase[] = [];\r\n protected _activePluginsForExtraEvents: MaterialPluginBase[] = [];\r\n protected _codeInjectionPoints: { [shaderType: string]: { [codeName: string]: boolean } };\r\n protected _defineNamesFromPlugins?: { [name: string]: { type: string; default: any } };\r\n protected _uboDeclaration: string;\r\n protected _vertexDeclaration: string;\r\n protected _fragmentDeclaration: string;\r\n protected _uniformList: string[];\r\n protected _samplerList: string[];\r\n protected _uboList: string[];\r\n\r\n static {\r\n EngineStore.OnEnginesDisposedObservable.add(() => {\r\n UnregisterAllMaterialPlugins();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a new instance of the plugin manager\r\n * @param material material that this manager will manage the plugins for\r\n */\r\n constructor(material: Material) {\r\n this._material = material;\r\n this._scene = material.getScene();\r\n this._engine = this._scene.getEngine();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _addPlugin(plugin: MaterialPluginBase): boolean {\r\n for (let i = 0; i < this._plugins.length; ++i) {\r\n if (this._plugins[i].name === plugin.name) {\r\n return false;\r\n }\r\n }\r\n\r\n if (this._material._uniformBufferLayoutBuilt) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw `The plugin \"${plugin.name}\" can't be added to the material \"${this._material.name}\" because this material has already been used for rendering! Please add plugins to materials before any rendering with this material occurs.`;\r\n }\r\n\r\n const pluginClassName = plugin.getClassName();\r\n if (!MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName]) {\r\n MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName] = \"MATERIALPLUGIN_\" + ++MaterialPluginManager._MaterialPluginCounter;\r\n }\r\n\r\n this._material._callbackPluginEventGeneric = (id, info) => this._handlePluginEvent(id, info);\r\n\r\n this._plugins.push(plugin);\r\n this._plugins.sort((a, b) => a.priority - b.priority);\r\n\r\n this._codeInjectionPoints = {};\r\n\r\n const defineNamesFromPlugins: { [name: string]: { type: string; default: any } } = {};\r\n defineNamesFromPlugins[MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName]] = {\r\n type: \"boolean\",\r\n default: true,\r\n };\r\n\r\n for (const plugin of this._plugins) {\r\n plugin.collectDefines(defineNamesFromPlugins);\r\n this._collectPointNames(\"vertex\", plugin.getCustomCode(\"vertex\"));\r\n this._collectPointNames(\"fragment\", plugin.getCustomCode(\"fragment\"));\r\n }\r\n\r\n this._defineNamesFromPlugins = defineNamesFromPlugins;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _activatePlugin(plugin: MaterialPluginBase): void {\r\n if (this._activePlugins.indexOf(plugin) === -1) {\r\n this._activePlugins.push(plugin);\r\n this._activePlugins.sort((a, b) => a.priority - b.priority);\r\n\r\n this._material._callbackPluginEventIsReadyForSubMesh = this._handlePluginEventIsReadyForSubMesh.bind(this);\r\n this._material._callbackPluginEventPrepareDefinesBeforeAttributes = this._handlePluginEventPrepareDefinesBeforeAttributes.bind(this);\r\n this._material._callbackPluginEventPrepareDefines = this._handlePluginEventPrepareDefines.bind(this);\r\n this._material._callbackPluginEventBindForSubMesh = this._handlePluginEventBindForSubMesh.bind(this);\r\n\r\n if (plugin.registerForExtraEvents) {\r\n this._activePluginsForExtraEvents.push(plugin);\r\n this._activePluginsForExtraEvents.sort((a, b) => a.priority - b.priority);\r\n this._material._callbackPluginEventHasRenderTargetTextures = this._handlePluginEventHasRenderTargetTextures.bind(this);\r\n this._material._callbackPluginEventFillRenderTargetTextures = this._handlePluginEventFillRenderTargetTextures.bind(this);\r\n this._material._callbackPluginEventHardBindForSubMesh = this._handlePluginEventHardBindForSubMesh.bind(this);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets a plugin from the list of plugins managed by this manager\r\n * @param name name of the plugin\r\n * @returns the plugin if found, else null\r\n */\r\n public getPlugin(name: string): Nullable {\r\n for (let i = 0; i < this._plugins.length; ++i) {\r\n if (this._plugins[i].name === name) {\r\n return this._plugins[i] as T;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n protected _handlePluginEventIsReadyForSubMesh(eventData: MaterialPluginIsReadyForSubMesh): void {\r\n let isReady = true;\r\n for (const plugin of this._activePlugins) {\r\n isReady = isReady && plugin.isReadyForSubMesh(eventData.defines, this._scene, this._engine, eventData.subMesh);\r\n }\r\n eventData.isReadyForSubMesh = isReady;\r\n }\r\n\r\n protected _handlePluginEventPrepareDefinesBeforeAttributes(eventData: MaterialPluginPrepareDefines): void {\r\n for (const plugin of this._activePlugins) {\r\n plugin.prepareDefinesBeforeAttributes(eventData.defines, this._scene, eventData.mesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventPrepareDefines(eventData: MaterialPluginPrepareDefines): void {\r\n for (const plugin of this._activePlugins) {\r\n plugin.prepareDefines(eventData.defines, this._scene, eventData.mesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventHardBindForSubMesh(eventData: MaterialPluginHardBindForSubMesh): void {\r\n for (const plugin of this._activePluginsForExtraEvents) {\r\n plugin.hardBindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, eventData.subMesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventBindForSubMesh(eventData: MaterialPluginBindForSubMesh): void {\r\n for (const plugin of this._activePlugins) {\r\n plugin.bindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, eventData.subMesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventHasRenderTargetTextures(eventData: MaterialPluginHasRenderTargetTextures): void {\r\n let hasRenderTargetTextures = false;\r\n for (const plugin of this._activePluginsForExtraEvents) {\r\n hasRenderTargetTextures = plugin.hasRenderTargetTextures();\r\n if (hasRenderTargetTextures) {\r\n break;\r\n }\r\n }\r\n eventData.hasRenderTargetTextures = hasRenderTargetTextures;\r\n }\r\n\r\n protected _handlePluginEventFillRenderTargetTextures(eventData: MaterialPluginFillRenderTargetTextures): void {\r\n for (const plugin of this._activePluginsForExtraEvents) {\r\n plugin.fillRenderTargetTextures(eventData.renderTargets);\r\n }\r\n }\r\n\r\n protected _handlePluginEvent(\r\n id: number,\r\n info:\r\n | MaterialPluginGetActiveTextures\r\n | MaterialPluginGetAnimatables\r\n | MaterialPluginHasTexture\r\n | MaterialPluginDisposed\r\n | MaterialPluginGetDefineNames\r\n | MaterialPluginPrepareEffect\r\n | MaterialPluginPrepareUniformBuffer\r\n ): void {\r\n switch (id) {\r\n case MaterialPluginEvent.GetActiveTextures: {\r\n const eventData = info as MaterialPluginGetActiveTextures;\r\n for (const plugin of this._activePlugins) {\r\n plugin.getActiveTextures(eventData.activeTextures);\r\n }\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.GetAnimatables: {\r\n const eventData = info as MaterialPluginGetAnimatables;\r\n for (const plugin of this._activePlugins) {\r\n plugin.getAnimatables(eventData.animatables);\r\n }\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.HasTexture: {\r\n const eventData = info as MaterialPluginHasTexture;\r\n let hasTexture = false;\r\n for (const plugin of this._activePlugins) {\r\n hasTexture = plugin.hasTexture(eventData.texture);\r\n if (hasTexture) {\r\n break;\r\n }\r\n }\r\n eventData.hasTexture = hasTexture;\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.Disposed: {\r\n const eventData = info as MaterialPluginDisposed;\r\n for (const plugin of this._plugins) {\r\n plugin.dispose(eventData.forceDisposeTextures);\r\n }\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.GetDefineNames: {\r\n const eventData = info as MaterialPluginGetDefineNames;\r\n eventData.defineNames = this._defineNamesFromPlugins;\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.PrepareEffect: {\r\n const eventData = info as MaterialPluginPrepareEffect;\r\n for (const plugin of this._activePlugins) {\r\n eventData.fallbackRank = plugin.addFallbacks(eventData.defines, eventData.fallbacks, eventData.fallbackRank);\r\n plugin.getAttributes(eventData.attributes, this._scene, eventData.mesh);\r\n }\r\n if (this._uniformList.length > 0) {\r\n eventData.uniforms.push(...this._uniformList);\r\n }\r\n if (this._samplerList.length > 0) {\r\n eventData.samplers.push(...this._samplerList);\r\n }\r\n if (this._uboList.length > 0) {\r\n eventData.uniformBuffersNames.push(...this._uboList);\r\n }\r\n eventData.customCode = this._injectCustomCode(eventData, eventData.customCode);\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.PrepareUniformBuffer: {\r\n const eventData = info as MaterialPluginPrepareUniformBuffer;\r\n this._uboDeclaration = \"\";\r\n this._vertexDeclaration = \"\";\r\n this._fragmentDeclaration = \"\";\r\n this._uniformList = [];\r\n this._samplerList = [];\r\n this._uboList = [];\r\n for (const plugin of this._plugins) {\r\n const uniforms = plugin.getUniforms();\r\n if (uniforms) {\r\n if (uniforms.ubo) {\r\n for (const uniform of uniforms.ubo) {\r\n if (uniform.size && uniform.type) {\r\n const arraySize = uniform.arraySize ?? 0;\r\n eventData.ubo.addUniform(uniform.name, uniform.size, arraySize);\r\n this._uboDeclaration += `${uniform.type} ${uniform.name}${arraySize > 0 ? `[${arraySize}]` : \"\"};\\n`;\r\n }\r\n this._uniformList.push(uniform.name);\r\n }\r\n }\r\n if (uniforms.vertex) {\r\n this._vertexDeclaration += uniforms.vertex + \"\\n\";\r\n }\r\n if (uniforms.fragment) {\r\n this._fragmentDeclaration += uniforms.fragment + \"\\n\";\r\n }\r\n }\r\n plugin.getSamplers(this._samplerList);\r\n plugin.getUniformBuffersNames(this._uboList);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n protected _collectPointNames(shaderType: string, customCode: Nullable<{ [pointName: string]: string }> | undefined): void {\r\n if (!customCode) {\r\n return;\r\n }\r\n for (const pointName in customCode) {\r\n if (!this._codeInjectionPoints[shaderType]) {\r\n this._codeInjectionPoints[shaderType] = {};\r\n }\r\n this._codeInjectionPoints[shaderType][pointName] = true;\r\n }\r\n }\r\n\r\n protected _injectCustomCode(eventData: MaterialPluginPrepareEffect, existingCallback?: (shaderType: string, code: string) => string): ShaderCustomProcessingFunction {\r\n return (shaderType: string, code: string) => {\r\n if (existingCallback) {\r\n code = existingCallback(shaderType, code);\r\n }\r\n if (this._uboDeclaration) {\r\n code = code.replace(\"#define ADDITIONAL_UBO_DECLARATION\", this._uboDeclaration);\r\n }\r\n if (this._vertexDeclaration) {\r\n code = code.replace(\"#define ADDITIONAL_VERTEX_DECLARATION\", this._vertexDeclaration);\r\n }\r\n if (this._fragmentDeclaration) {\r\n code = code.replace(\"#define ADDITIONAL_FRAGMENT_DECLARATION\", this._fragmentDeclaration);\r\n }\r\n const points = this._codeInjectionPoints?.[shaderType];\r\n if (!points) {\r\n return code;\r\n }\r\n let processorOptions: Nullable = null;\r\n for (let pointName in points) {\r\n let injectedCode = \"\";\r\n for (const plugin of this._activePlugins) {\r\n let customCode = plugin.getCustomCode(shaderType)?.[pointName];\r\n if (!customCode) {\r\n continue;\r\n }\r\n if (plugin.resolveIncludes) {\r\n if (processorOptions === null) {\r\n const shaderLanguage = ShaderLanguage.GLSL;\r\n processorOptions = {\r\n defines: [], // not used by _ProcessIncludes\r\n indexParameters: eventData.indexParameters,\r\n isFragment: false,\r\n shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader,\r\n processor: undefined as any, // not used by _ProcessIncludes\r\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\r\n shadersRepository: ShaderStore.GetShadersRepository(shaderLanguage),\r\n includesShadersStore: ShaderStore.GetIncludesShadersStore(shaderLanguage),\r\n version: undefined as any, // not used by _ProcessIncludes\r\n platformName: this._engine.shaderPlatformName,\r\n processingContext: undefined as any, // not used by _ProcessIncludes\r\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\r\n processCodeAfterIncludes: undefined as any, // not used by _ProcessIncludes\r\n };\r\n }\r\n processorOptions.isFragment = shaderType === \"fragment\";\r\n ShaderProcessor._ProcessIncludes(customCode, processorOptions, (code) => (customCode = code));\r\n }\r\n injectedCode += customCode + \"\\n\";\r\n }\r\n if (injectedCode.length > 0) {\r\n if (pointName.charAt(0) === \"!\") {\r\n // pointName is a regular expression\r\n pointName = pointName.substring(1);\r\n\r\n let regexFlags = \"g\";\r\n if (pointName.charAt(0) === \"!\") {\r\n // no flags\r\n regexFlags = \"\";\r\n pointName = pointName.substring(1);\r\n } else {\r\n // get the flag(s)\r\n const matchOption = rxOption.exec(pointName);\r\n if (matchOption && matchOption.length >= 2) {\r\n regexFlags = matchOption[1];\r\n pointName = pointName.substring(regexFlags.length + 1);\r\n }\r\n }\r\n\r\n if (regexFlags.indexOf(\"g\") < 0) {\r\n // we force the \"g\" flag so that the regexp object is stateful!\r\n regexFlags += \"g\";\r\n }\r\n\r\n const sourceCode = code;\r\n const rx = new RegExp(pointName, regexFlags);\r\n let match = rx.exec(sourceCode);\r\n while (match !== null) {\r\n let newCode = injectedCode;\r\n for (let i = 0; i < match.length; ++i) {\r\n newCode = newCode.replace(\"$\" + i, match[i]);\r\n }\r\n code = code.replace(match[0], newCode);\r\n match = rx.exec(sourceCode);\r\n }\r\n } else {\r\n const fullPointName = \"#define \" + pointName;\r\n code = code.replace(fullPointName, \"\\n\" + injectedCode + \"\\n\" + fullPointName);\r\n }\r\n }\r\n }\r\n return code;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Type for plugin material factories.\r\n */\r\nexport type PluginMaterialFactory = (material: Material) => Nullable;\r\n\r\nconst plugins: Array<[string, PluginMaterialFactory]> = [];\r\nlet inited = false;\r\nlet observer: Nullable> = null;\r\n\r\n/**\r\n * Registers a new material plugin through a factory, or updates it. This makes the plugin available to all materials instantiated after its registration.\r\n * @param pluginName The plugin name\r\n * @param factory The factory function which allows to create the plugin\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterMaterialPlugin(pluginName: string, factory: PluginMaterialFactory): void {\r\n if (!inited) {\r\n observer = Material.OnEventObservable.add((material: Material) => {\r\n for (const [, factory] of plugins) {\r\n factory(material);\r\n }\r\n }, MaterialPluginEvent.Created);\r\n inited = true;\r\n }\r\n const existing = plugins.filter(([name, _factory]) => name === pluginName);\r\n if (existing.length > 0) {\r\n existing[0][1] = factory;\r\n } else {\r\n plugins.push([pluginName, factory]);\r\n }\r\n}\r\n\r\n/**\r\n * Removes a material plugin from the list of global plugins.\r\n * @param pluginName The plugin name\r\n * @returns true if the plugin has been removed, else false\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function UnregisterMaterialPlugin(pluginName: string): boolean {\r\n for (let i = 0; i < plugins.length; ++i) {\r\n if (plugins[i][0] === pluginName) {\r\n plugins.splice(i, 1);\r\n if (plugins.length === 0) {\r\n UnregisterAllMaterialPlugins();\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Clear the list of global material plugins\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function UnregisterAllMaterialPlugins(): void {\r\n plugins.length = 0;\r\n inited = false;\r\n Material.OnEventObservable.remove(observer);\r\n observer = null;\r\n}\r\n", "import { serialize } from \"../Misc/decorators\";\r\nimport type { Nullable } from \"../types\";\r\nimport { MaterialPluginManager } from \"./materialPluginManager\";\r\nimport type { SmartArray } from \"../Misc/smartArray\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport type { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { EffectFallbacks } from \"./effectFallbacks\";\r\nimport type { MaterialDefines } from \"./materialDefines\";\r\nimport type { Material } from \"./material\";\r\nimport type { BaseTexture } from \"./Textures/baseTexture\";\r\nimport type { RenderTargetTexture } from \"./Textures/renderTargetTexture\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\n\r\n/**\r\n * Base class for material plugins.\r\n * @since 5.0\r\n */\r\nexport class MaterialPluginBase {\r\n /**\r\n * Defines the name of the plugin\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Defines the priority of the plugin. Lower numbers run first.\r\n */\r\n @serialize()\r\n public priority: number = 500;\r\n\r\n /**\r\n * Indicates that any #include directive in the plugin code must be replaced by the corresponding code.\r\n */\r\n @serialize()\r\n public resolveIncludes: boolean = false;\r\n\r\n /**\r\n * Indicates that this plugin should be notified for the extra events (HasRenderTargetTextures / FillRenderTargetTextures / HardBindForSubMesh)\r\n */\r\n @serialize()\r\n public registerForExtraEvents: boolean = false;\r\n\r\n protected _material: Material;\r\n protected _pluginManager: MaterialPluginManager;\r\n protected _pluginDefineNames?: { [name: string]: any };\r\n\r\n protected _enable(enable: boolean) {\r\n if (enable) {\r\n this._pluginManager._activatePlugin(this);\r\n }\r\n }\r\n\r\n /**\r\n * Helper function to mark defines as being dirty.\r\n */\r\n public readonly markAllDefinesAsDirty: () => void;\r\n\r\n /**\r\n * Creates a new material plugin\r\n * @param material parent material of the plugin\r\n * @param name name of the plugin\r\n * @param priority priority of the plugin\r\n * @param defines list of defines used by the plugin. The value of the property is the default value for this property\r\n * @param addToPluginList true to add the plugin to the list of plugins managed by the material plugin manager of the material (default: true)\r\n * @param enable true to enable the plugin (it is handy if the plugin does not handle properties to switch its current activation)\r\n * @param resolveIncludes Indicates that any #include directive in the plugin code must be replaced by the corresponding code (default: false)\r\n */\r\n constructor(material: Material, name: string, priority: number, defines?: { [key: string]: any }, addToPluginList = true, enable = false, resolveIncludes = false) {\r\n this._material = material;\r\n this.name = name;\r\n this.priority = priority;\r\n this.resolveIncludes = resolveIncludes;\r\n\r\n if (!material.pluginManager) {\r\n material.pluginManager = new MaterialPluginManager(material);\r\n material.onDisposeObservable.add(() => {\r\n material.pluginManager = undefined;\r\n });\r\n }\r\n\r\n this._pluginDefineNames = defines;\r\n this._pluginManager = material.pluginManager;\r\n\r\n if (addToPluginList) {\r\n this._pluginManager._addPlugin(this);\r\n }\r\n\r\n if (enable) {\r\n this._enable(true);\r\n }\r\n\r\n this.markAllDefinesAsDirty = material._dirtyCallbacks[Constants.MATERIAL_AllDirtyFlag];\r\n }\r\n\r\n /**\r\n * Gets the current class name useful for serialization or dynamic coding.\r\n * @returns The class name.\r\n */\r\n public getClassName(): string {\r\n return \"MaterialPluginBase\";\r\n }\r\n\r\n /**\r\n * Specifies that the submesh is ready to be used.\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine the engine this scene belongs to.\r\n * @param subMesh the submesh to check for readiness\r\n * @returns - boolean indicating that the submesh is ready or not.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReadyForSubMesh(defines: MaterialDefines, scene: Scene, engine: Engine, subMesh: SubMesh): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Binds the material data (this function is called even if mustRebind() returns false)\r\n * @param uniformBuffer defines the Uniform buffer to fill in.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine defines the engine the material belongs to.\r\n * @param subMesh the submesh to bind data for\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public hardBindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, subMesh: SubMesh): void {}\r\n\r\n /**\r\n * Binds the material data.\r\n * @param uniformBuffer defines the Uniform buffer to fill in.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine the engine this scene belongs to.\r\n * @param subMesh the submesh to bind data for\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, subMesh: SubMesh): void {}\r\n\r\n /**\r\n * Disposes the resources of the material.\r\n * @param forceDisposeTextures - Forces the disposal of all textures.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public dispose(forceDisposeTextures?: boolean): void {}\r\n\r\n /**\r\n * Returns a list of custom shader code fragments to customize the shader.\r\n * @param shaderType \"vertex\" or \"fragment\"\r\n * @returns null if no code to be added, or a list of pointName =\\> code.\r\n * Note that `pointName` can also be a regular expression if it starts with a `!`.\r\n * In that case, the string found by the regular expression (if any) will be\r\n * replaced by the code provided.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getCustomCode(shaderType: string): Nullable<{ [pointName: string]: string }> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Collects all defines.\r\n * @param defines The object to append to.\r\n */\r\n public collectDefines(defines: { [name: string]: { type: string; default: any } }): void {\r\n if (!this._pluginDefineNames) {\r\n return;\r\n }\r\n for (const key of Object.keys(this._pluginDefineNames)) {\r\n if (key[0] === \"_\") {\r\n continue;\r\n }\r\n\r\n const type = typeof this._pluginDefineNames[key];\r\n defines[key] = {\r\n type: type === \"number\" ? \"number\" : type === \"string\" ? \"string\" : type === \"boolean\" ? \"boolean\" : \"object\",\r\n default: this._pluginDefineNames[key],\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Sets the defines for the next rendering. Called before PrepareDefinesForAttributes is called.\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene to the material belongs to.\r\n * @param mesh the mesh being rendered\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public prepareDefinesBeforeAttributes(defines: MaterialDefines, scene: Scene, mesh: AbstractMesh): void {}\r\n\r\n /**\r\n * Sets the defines for the next rendering\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene to the material belongs to.\r\n * @param mesh the mesh being rendered\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public prepareDefines(defines: MaterialDefines, scene: Scene, mesh: AbstractMesh): void {}\r\n\r\n /**\r\n * Checks to see if a texture is used in the material.\r\n * @param texture - Base texture to use.\r\n * @returns - Boolean specifying if a texture is used in the material.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public hasTexture(texture: BaseTexture): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n * @returns true if this uses a render target otherwise false.\r\n */\r\n public hasRenderTargetTextures(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Fills the list of render target textures.\r\n * @param renderTargets the list of render targets to update\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public fillRenderTargetTextures(renderTargets: SmartArray): void {}\r\n\r\n /**\r\n * Returns an array of the actively used textures.\r\n * @param activeTextures Array of BaseTextures\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getActiveTextures(activeTextures: BaseTexture[]): void {}\r\n\r\n /**\r\n * Returns the animatable textures.\r\n * @param animatables Array of animatable textures.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getAnimatables(animatables: IAnimatable[]): void {}\r\n\r\n /**\r\n * Add fallbacks to the effect fallbacks list.\r\n * @param defines defines the Base texture to use.\r\n * @param fallbacks defines the current fallback list.\r\n * @param currentRank defines the current fallback rank.\r\n * @returns the new fallback rank.\r\n */\r\n public addFallbacks(defines: MaterialDefines, fallbacks: EffectFallbacks, currentRank: number): number {\r\n return currentRank;\r\n }\r\n\r\n /**\r\n * Gets the samplers used by the plugin.\r\n * @param samplers list that the sampler names should be added to.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getSamplers(samplers: string[]): void {}\r\n\r\n /**\r\n * Gets the attributes used by the plugin.\r\n * @param attributes list that the attribute names should be added to.\r\n * @param scene the scene that the material belongs to.\r\n * @param mesh the mesh being rendered.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getAttributes(attributes: string[], scene: Scene, mesh: AbstractMesh): void {}\r\n\r\n /**\r\n * Gets the uniform buffers names added by the plugin.\r\n * @param ubos list that the ubo names should be added to.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getUniformBuffersNames(ubos: string[]): void {}\r\n\r\n /**\r\n * Gets the description of the uniforms to add to the ubo (if engine supports ubos) or to inject directly in the vertex/fragment shaders (if engine does not support ubos)\r\n * @returns the description of the uniforms\r\n */\r\n public getUniforms(): { ubo?: Array<{ name: string; size?: number; type?: string; arraySize?: number }>; vertex?: string; fragment?: string } {\r\n return {};\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current configuration into another one.\r\n * @param plugin define the config where to copy the info\r\n */\r\n public copyTo(plugin: MaterialPluginBase): void {\r\n SerializationHelper.Clone(() => plugin, this);\r\n }\r\n\r\n /**\r\n * Serializes this plugin configuration.\r\n * @returns - An object with the serialized config.\r\n */\r\n public serialize(): any {\r\n return SerializationHelper.Serialize(this);\r\n }\r\n\r\n /**\r\n * Parses a plugin configuration from a serialized object.\r\n * @param source - Serialized object.\r\n * @param scene Defines the scene we are parsing for\r\n * @param rootUrl Defines the rootUrl to load from\r\n */\r\n public parse(source: any, scene: Scene, rootUrl: string): void {\r\n SerializationHelper.Parse(() => this, source, scene, rootUrl);\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"../types\";\r\nimport { Material } from \"./material\";\r\nimport { serialize, expandToProperty, serializeAsTexture } from \"../Misc/decorators\";\r\nimport { MaterialFlags } from \"./materialFlags\";\r\nimport type { BaseTexture } from \"./Textures/baseTexture\";\r\nimport type { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport { MaterialDefines } from \"./materialDefines\";\r\nimport { MaterialPluginBase } from \"./materialPluginBase\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { StandardMaterial } from \"./standardMaterial\";\r\nimport type { PBRBaseMaterial } from \"./PBR/pbrBaseMaterial\";\r\nimport { BindTextureMatrix, PrepareDefinesForMergedUV } from \"./materialHelper.functions\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class MaterialDetailMapDefines extends MaterialDefines {\r\n DETAIL = false;\r\n DETAILDIRECTUV = 0;\r\n DETAIL_NORMALBLENDMETHOD = 0;\r\n}\r\n\r\n/**\r\n * Plugin that implements the detail map component of a material\r\n *\r\n * Inspired from:\r\n * Unity: https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@9.0/manual/Mask-Map-and-Detail-Map.html and https://docs.unity3d.com/Manual/StandardShaderMaterialParameterDetail.html\r\n * Unreal: https://docs.unrealengine.com/en-US/Engine/Rendering/Materials/HowTo/DetailTexturing/index.html\r\n * Cryengine: https://docs.cryengine.com/display/SDKDOC2/Detail+Maps\r\n */\r\nexport class DetailMapConfiguration extends MaterialPluginBase {\r\n private _texture: Nullable = null;\r\n /**\r\n * The detail texture of the material.\r\n */\r\n @serializeAsTexture(\"detailTexture\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public texture: Nullable;\r\n\r\n /**\r\n * Defines how strongly the detail diffuse/albedo channel is blended with the regular diffuse/albedo texture\r\n * Bigger values mean stronger blending\r\n */\r\n @serialize()\r\n public diffuseBlendLevel = 1;\r\n\r\n /**\r\n * Defines how strongly the detail roughness channel is blended with the regular roughness value\r\n * Bigger values mean stronger blending. Only used with PBR materials\r\n */\r\n @serialize()\r\n public roughnessBlendLevel = 1;\r\n\r\n /**\r\n * Defines how strong the bump effect from the detail map is\r\n * Bigger values mean stronger effect\r\n */\r\n @serialize()\r\n public bumpLevel = 1;\r\n\r\n private _normalBlendMethod = Material.MATERIAL_NORMALBLENDMETHOD_WHITEOUT;\r\n /**\r\n * The method used to blend the bump and detail normals together\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public normalBlendMethod: number;\r\n\r\n private _isEnabled = false;\r\n /**\r\n * Enable or disable the detail map on this material\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isEnabled = false;\r\n\r\n /** @internal */\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n\r\n /** @internal */\r\n public _markAllSubMeshesAsTexturesDirty(): void {\r\n this._enable(this._isEnabled);\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n constructor(material: PBRBaseMaterial | StandardMaterial, addToPluginList = true) {\r\n super(material, \"DetailMap\", 140, new MaterialDetailMapDefines(), addToPluginList);\r\n\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n }\r\n\r\n public isReadyForSubMesh(defines: MaterialDetailMapDefines, scene: Scene, engine: Engine): boolean {\r\n if (!this._isEnabled) {\r\n return true;\r\n }\r\n\r\n if (defines._areTexturesDirty && scene.texturesEnabled) {\r\n if (engine.getCaps().standardDerivatives && this._texture && MaterialFlags.DetailTextureEnabled) {\r\n // Detail texture cannot be not blocking.\r\n if (!this._texture.isReady()) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public prepareDefines(defines: MaterialDetailMapDefines, scene: Scene): void {\r\n if (this._isEnabled) {\r\n defines.DETAIL_NORMALBLENDMETHOD = this._normalBlendMethod;\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (defines._areTexturesDirty) {\r\n if (engine.getCaps().standardDerivatives && this._texture && MaterialFlags.DetailTextureEnabled && this._isEnabled) {\r\n PrepareDefinesForMergedUV(this._texture, defines, \"DETAIL\");\r\n defines.DETAIL_NORMALBLENDMETHOD = this._normalBlendMethod;\r\n } else {\r\n defines.DETAIL = false;\r\n }\r\n }\r\n } else {\r\n defines.DETAIL = false;\r\n }\r\n }\r\n\r\n public bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n\r\n const isFrozen = this._material.isFrozen;\r\n\r\n if (!uniformBuffer.useUbo || !isFrozen || !uniformBuffer.isSync) {\r\n if (this._texture && MaterialFlags.DetailTextureEnabled) {\r\n uniformBuffer.updateFloat4(\"vDetailInfos\", this._texture.coordinatesIndex, this.diffuseBlendLevel, this.bumpLevel, this.roughnessBlendLevel);\r\n BindTextureMatrix(this._texture, uniformBuffer, \"detail\");\r\n }\r\n }\r\n\r\n // Textures\r\n if (scene.texturesEnabled) {\r\n if (this._texture && MaterialFlags.DetailTextureEnabled) {\r\n uniformBuffer.setTexture(\"detailSampler\", this._texture);\r\n }\r\n }\r\n }\r\n\r\n public hasTexture(texture: BaseTexture): boolean {\r\n if (this._texture === texture) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public getActiveTextures(activeTextures: BaseTexture[]): void {\r\n if (this._texture) {\r\n activeTextures.push(this._texture);\r\n }\r\n }\r\n\r\n public getAnimatables(animatables: IAnimatable[]): void {\r\n if (this._texture && this._texture.animations && this._texture.animations.length > 0) {\r\n animatables.push(this._texture);\r\n }\r\n }\r\n\r\n public dispose(forceDisposeTextures?: boolean): void {\r\n if (forceDisposeTextures) {\r\n this._texture?.dispose();\r\n }\r\n }\r\n\r\n public getClassName(): string {\r\n return \"DetailMapConfiguration\";\r\n }\r\n\r\n public getSamplers(samplers: string[]): void {\r\n samplers.push(\"detailSampler\");\r\n }\r\n\r\n public getUniforms(): { ubo?: Array<{ name: string; size: number; type: string }>; vertex?: string; fragment?: string } {\r\n return {\r\n ubo: [\r\n { name: \"vDetailInfos\", size: 4, type: \"vec4\" },\r\n { name: \"detailMatrix\", size: 16, type: \"mat4\" },\r\n ],\r\n };\r\n }\r\n}\r\n", "import type { Matrix } from \"../Maths/math.vector\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\n/**\r\n * Configuration needed for prepass-capable materials\r\n */\r\nexport class PrePassConfiguration {\r\n /**\r\n * Previous world matrices of meshes carrying this material\r\n * Used for computing velocity\r\n */\r\n public previousWorldMatrices: { [index: number]: Matrix } = {};\r\n /**\r\n * Previous view project matrix\r\n * Used for computing velocity\r\n */\r\n public previousViewProjection: Matrix;\r\n /**\r\n * Current view projection matrix\r\n * Used for computing velocity\r\n */\r\n public currentViewProjection: Matrix;\r\n /**\r\n * Previous bones of meshes carrying this material\r\n * Used for computing velocity\r\n */\r\n public previousBones: { [index: number]: Float32Array } = {};\r\n\r\n private _lastUpdateFrameId: number;\r\n\r\n /**\r\n * Add the required uniforms to the current list.\r\n * @param uniforms defines the current uniform list.\r\n */\r\n public static AddUniforms(uniforms: string[]): void {\r\n uniforms.push(\"previousWorld\", \"previousViewProjection\", \"mPreviousBones\");\r\n }\r\n\r\n /**\r\n * Add the required samplers to the current list.\r\n * @param samplers defines the current sampler list.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static AddSamplers(samplers: string[]): void {\r\n // pass\r\n }\r\n\r\n /**\r\n * Binds the material data.\r\n * @param effect defines the effect to update\r\n * @param scene defines the scene the material belongs to.\r\n * @param mesh The mesh\r\n * @param world World matrix of this mesh\r\n * @param isFrozen Is the material frozen\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bindForSubMesh(effect: Effect, scene: Scene, mesh: Mesh, world: Matrix, isFrozen: boolean): void {\r\n if (scene.prePassRenderer && scene.prePassRenderer.enabled && scene.prePassRenderer.currentRTisSceneRT) {\r\n if (scene.prePassRenderer.getIndex(Constants.PREPASS_VELOCITY_TEXTURE_TYPE) !== -1) {\r\n if (!this.previousWorldMatrices[mesh.uniqueId]) {\r\n this.previousWorldMatrices[mesh.uniqueId] = world.clone();\r\n }\r\n\r\n if (!this.previousViewProjection) {\r\n this.previousViewProjection = scene.getTransformMatrix().clone();\r\n this.currentViewProjection = scene.getTransformMatrix().clone();\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (this.currentViewProjection.updateFlag !== scene.getTransformMatrix().updateFlag) {\r\n // First update of the prepass configuration for this rendering pass\r\n this._lastUpdateFrameId = engine.frameId;\r\n this.previousViewProjection.copyFrom(this.currentViewProjection);\r\n this.currentViewProjection.copyFrom(scene.getTransformMatrix());\r\n } else if (this._lastUpdateFrameId !== engine.frameId) {\r\n // The scene transformation did not change from the previous frame (so no camera motion), we must update previousViewProjection accordingly\r\n this._lastUpdateFrameId = engine.frameId;\r\n this.previousViewProjection.copyFrom(this.currentViewProjection);\r\n }\r\n\r\n effect.setMatrix(\"previousWorld\", this.previousWorldMatrices[mesh.uniqueId]);\r\n effect.setMatrix(\"previousViewProjection\", this.previousViewProjection);\r\n\r\n this.previousWorldMatrices[mesh.uniqueId] = world.clone();\r\n }\r\n }\r\n }\r\n}\r\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"decalFragmentDeclaration\";\nconst shader = `#ifdef DECAL\nuniform vec4 vDecalInfos;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const decalFragmentDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nimport \"./decalFragmentDeclaration\";\n\nconst name = \"defaultFragmentDeclaration\";\nconst shader = `uniform vec4 vEyePosition;uniform vec4 vDiffuseColor;\n#ifdef SPECULARTERM\nuniform vec4 vSpecularColor;\n#endif\nuniform vec3 vEmissiveColor;uniform vec3 vAmbientColor;uniform float visibility;\n#ifdef DIFFUSE\nuniform vec2 vDiffuseInfos;\n#endif\n#ifdef AMBIENT\nuniform vec2 vAmbientInfos;\n#endif\n#ifdef OPACITY \nuniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;uniform vec2 vTangentSpaceParams;\n#endif\n#ifdef ALPHATEST\nuniform float alphaCutOff;\n#endif\n#if defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_PROJECTION) || defined(REFRACTION) || defined(PREPASS)\nuniform mat4 view;\n#endif\n#ifdef REFRACTION\nuniform vec4 vRefractionInfos;\n#ifndef REFRACTIONMAP_3D\nuniform mat4 refractionMatrix;\n#endif\n#ifdef REFRACTIONFRESNEL\nuniform vec4 refractionLeftColor;uniform vec4 refractionRightColor;\n#endif\n#if defined(USE_LOCAL_REFRACTIONMAP_CUBIC) && defined(REFRACTIONMAP_3D)\nuniform vec3 vRefractionPosition;uniform vec3 vRefractionSize; \n#endif\n#endif\n#if defined(SPECULAR) && defined(SPECULARTERM)\nuniform vec2 vSpecularInfos;\n#endif\n#ifdef DIFFUSEFRESNEL\nuniform vec4 diffuseLeftColor;uniform vec4 diffuseRightColor;\n#endif\n#ifdef OPACITYFRESNEL\nuniform vec4 opacityParts;\n#endif\n#ifdef EMISSIVEFRESNEL\nuniform vec4 emissiveLeftColor;uniform vec4 emissiveRightColor;\n#endif\n#ifdef REFLECTION\nuniform vec2 vReflectionInfos;\n#if defined(REFLECTIONMAP_PLANAR) || defined(REFLECTIONMAP_CUBIC) || defined(REFLECTIONMAP_PROJECTION) || defined(REFLECTIONMAP_EQUIRECTANGULAR) || defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_SKYBOX)\nuniform mat4 reflectionMatrix;\n#endif\n#ifndef REFLECTIONMAP_SKYBOX\n#if defined(USE_LOCAL_REFLECTIONMAP_CUBIC) && defined(REFLECTIONMAP_CUBIC)\nuniform vec3 vReflectionPosition;uniform vec3 vReflectionSize; \n#endif\n#endif\n#ifdef REFLECTIONFRESNEL\nuniform vec4 reflectionLeftColor;uniform vec4 reflectionRightColor;\n#endif\n#endif\n#ifdef DETAIL\nuniform vec4 vDetailInfos;\n#endif\n#include\n#define ADDITIONAL_FRAGMENT_DECLARATION\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const defaultFragmentDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"sceneUboDeclaration\";\nconst shader = `layout(std140,column_major) uniform;uniform Scene {mat4 viewProjection;\n#ifdef MULTIVIEW\nmat4 viewProjectionR;\n#endif \nmat4 view;mat4 projection;vec4 vEyePosition;};\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const sceneUboDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"meshUboDeclaration\";\nconst shader = `#ifdef WEBGL2\nuniform mat4 world;uniform float visibility;\n#else\nlayout(std140,column_major) uniform;uniform Mesh\n{mat4 world;float visibility;};\n#endif\n#define WORLD_UBO\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const meshUboDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nimport \"./sceneUboDeclaration\";\nimport \"./meshUboDeclaration\";\n\nconst name = \"defaultUboDeclaration\";\nconst shader = `layout(std140,column_major) uniform;uniform Material\n{vec4 diffuseLeftColor;vec4 diffuseRightColor;vec4 opacityParts;vec4 reflectionLeftColor;vec4 reflectionRightColor;vec4 refractionLeftColor;vec4 refractionRightColor;vec4 emissiveLeftColor;vec4 emissiveRightColor;vec2 vDiffuseInfos;vec2 vAmbientInfos;vec2 vOpacityInfos;vec2 vReflectionInfos;vec3 vReflectionPosition;vec3 vReflectionSize;vec2 vEmissiveInfos;vec2 vLightmapInfos;vec2 vSpecularInfos;vec3 vBumpInfos;mat4 diffuseMatrix;mat4 ambientMatrix;mat4 opacityMatrix;mat4 reflectionMatrix;mat4 emissiveMatrix;mat4 lightmapMatrix;mat4 specularMatrix;mat4 bumpMatrix;vec2 vTangentSpaceParams;float pointSize;float alphaCutOff;mat4 refractionMatrix;vec4 vRefractionInfos;vec3 vRefractionPosition;vec3 vRefractionSize;vec4 vSpecularColor;vec3 vEmissiveColor;vec4 vDiffuseColor;vec3 vAmbientColor;\n#define ADDITIONAL_UBO_DECLARATION\n};\n#include\n#include\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const defaultUboDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"prePassDeclaration\";\nconst shader = `#ifdef PREPASS\n#extension GL_EXT_draw_buffers : require\nlayout(location=0) out highp vec4 glFragData[{X}];highp vec4 gl_FragColor;\n#ifdef PREPASS_DEPTH\nvarying highp vec3 vViewPos;\n#endif\n#ifdef PREPASS_VELOCITY\nvarying highp vec4 vCurrentPosition;varying highp vec4 vPreviousPosition;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const prePassDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"oitDeclaration\";\nconst shader = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY\n#extension GL_EXT_draw_buffers : require\nlayout(location=0) out vec2 depth; \nlayout(location=1) out vec4 frontColor;layout(location=2) out vec4 backColor;\n#define MAX_DEPTH 99999.0\nhighp vec4 gl_FragColor;uniform sampler2D oitDepthSampler;uniform sampler2D oitFrontColorSampler;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const oitDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"mainUVVaryingDeclaration\";\nconst shader = `#ifdef MAINUV{X}\nvarying vec2 vMainUV{X};\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const mainUVVaryingDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"helperFunctions\";\nconst shader = `const float PI=3.1415926535897932384626433832795;const float RECIPROCAL_PI=0.3183098861837907;const float RECIPROCAL_PI2=0.15915494309189535;const float HALF_MIN=5.96046448e-08; \nconst float LinearEncodePowerApprox=2.2;const float GammaEncodePowerApprox=1.0/LinearEncodePowerApprox;const vec3 LuminanceEncodeApprox=vec3(0.2126,0.7152,0.0722);const float Epsilon=0.0000001;\n#define saturate(x) clamp(x,0.0,1.0)\n#define absEps(x) abs(x)+Epsilon\n#define maxEps(x) max(x,Epsilon)\n#define saturateEps(x) clamp(x,Epsilon,1.0)\nmat3 transposeMat3(mat3 inMatrix) {vec3 i0=inMatrix[0];vec3 i1=inMatrix[1];vec3 i2=inMatrix[2];mat3 outMatrix=mat3(\nvec3(i0.x,i1.x,i2.x),\nvec3(i0.y,i1.y,i2.y),\nvec3(i0.z,i1.z,i2.z)\n);return outMatrix;}\nmat3 inverseMat3(mat3 inMatrix) {float a00=inMatrix[0][0],a01=inMatrix[0][1],a02=inMatrix[0][2];float a10=inMatrix[1][0],a11=inMatrix[1][1],a12=inMatrix[1][2];float a20=inMatrix[2][0],a21=inMatrix[2][1],a22=inMatrix[2][2];float b01=a22*a11-a12*a21;float b11=-a22*a10+a12*a20;float b21=a21*a10-a11*a20;float det=a00*b01+a01*b11+a02*b21;return mat3(b01,(-a22*a01+a02*a21),(a12*a01-a02*a11),\nb11,(a22*a00-a02*a20),(-a12*a00+a02*a10),\nb21,(-a21*a00+a01*a20),(a11*a00-a01*a10))/det;}\n#if USE_EXACT_SRGB_CONVERSIONS\nvec3 toLinearSpaceExact(vec3 color)\n{vec3 nearZeroSection=0.0773993808*color;vec3 remainingSection=pow(0.947867299*(color+vec3(0.055)),vec3(2.4));\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nreturn mix(remainingSection,nearZeroSection,lessThanEqual(color,vec3(0.04045)));\n#else\nreturn\nvec3(\ncolor.r<=0.04045 ? nearZeroSection.r : remainingSection.r,\ncolor.g<=0.04045 ? nearZeroSection.g : remainingSection.g,\ncolor.b<=0.04045 ? nearZeroSection.b : remainingSection.b);\n#endif\n}\nvec3 toGammaSpaceExact(vec3 color)\n{vec3 nearZeroSection=12.92*color;vec3 remainingSection=1.055*pow(color,vec3(0.41666))-vec3(0.055);\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nreturn mix(remainingSection,nearZeroSection,lessThanEqual(color,vec3(0.0031308)));\n#else\nreturn\nvec3(\ncolor.r<=0.0031308 ? nearZeroSection.r : remainingSection.r,\ncolor.g<=0.0031308 ? nearZeroSection.g : remainingSection.g,\ncolor.b<=0.0031308 ? nearZeroSection.b : remainingSection.b);\n#endif\n}\n#endif\nfloat toLinearSpace(float color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nfloat nearZeroSection=0.0773993808*color;float remainingSection=pow(0.947867299*(color+0.055),2.4);return color<=0.04045 ? nearZeroSection : remainingSection;\n#else\nreturn pow(color,LinearEncodePowerApprox);\n#endif\n}\nvec3 toLinearSpace(vec3 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn toLinearSpaceExact(color);\n#else\nreturn pow(color,vec3(LinearEncodePowerApprox));\n#endif\n}\nvec4 toLinearSpace(vec4 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn vec4(toLinearSpaceExact(color.rgb),color.a);\n#else\nreturn vec4(pow(color.rgb,vec3(LinearEncodePowerApprox)),color.a);\n#endif\n}\nfloat toGammaSpace(float color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nfloat nearZeroSection=12.92*color;float remainingSection=1.055*pow(color,0.41666)-0.055;return color<=0.0031308 ? nearZeroSection : remainingSection;\n#else\nreturn pow(color,GammaEncodePowerApprox);\n#endif\n}\nvec3 toGammaSpace(vec3 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn toGammaSpaceExact(color);\n#else\nreturn pow(color,vec3(GammaEncodePowerApprox));\n#endif\n}\nvec4 toGammaSpace(vec4 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn vec4(toGammaSpaceExact(color.rgb),color.a);\n#else\nreturn vec4(pow(color.rgb,vec3(GammaEncodePowerApprox)),color.a);\n#endif\n}\nfloat square(float value)\n{return value*value;}\nvec3 square(vec3 value)\n{return value*value;}\nfloat pow5(float value) {float sq=value*value;return sq*sq*value;}\nfloat getLuminance(vec3 color)\n{return clamp(dot(color,LuminanceEncodeApprox),0.,1.);}\nfloat getRand(vec2 seed) {return fract(sin(dot(seed.xy ,vec2(12.9898,78.233)))*43758.5453);}\nfloat dither(vec2 seed,float varianceAmount) {float rand=getRand(seed);float normVariance=varianceAmount/255.0;float dither=mix(-normVariance,normVariance,rand);return dither;}\nconst float rgbdMaxRange=255.0;vec4 toRGBD(vec3 color) {float maxRGB=maxEps(max(color.r,max(color.g,color.b)));float D =max(rgbdMaxRange/maxRGB,1.);D =clamp(floor(D)/255.0,0.,1.);vec3 rgb=color.rgb*D;rgb=toGammaSpace(rgb);return vec4(clamp(rgb,0.,1.),D); }\nvec3 fromRGBD(vec4 rgbd) {rgbd.rgb=toLinearSpace(rgbd.rgb);return rgbd.rgb/rgbd.a;}\nvec3 parallaxCorrectNormal( vec3 vertexPos,vec3 origVec,vec3 cubeSize,vec3 cubePos ) {vec3 invOrigVec=vec3(1.0,1.0,1.0)/origVec;vec3 halfSize=cubeSize*0.5;vec3 intersecAtMaxPlane=(cubePos+halfSize-vertexPos)*invOrigVec;vec3 intersecAtMinPlane=(cubePos-halfSize-vertexPos)*invOrigVec;vec3 largestIntersec=max(intersecAtMaxPlane,intersecAtMinPlane);float distance=min(min(largestIntersec.x,largestIntersec.y),largestIntersec.z);vec3 intersectPositionWS=vertexPos+origVec*distance;return intersectPositionWS-cubePos;}\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const helperFunctions = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightFragmentDeclaration\";\nconst shader = `#ifdef LIGHT{X}\nuniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X};\n#ifdef SPECULARTERM\nuniform vec4 vLightSpecular{X};\n#else\nvec4 vLightSpecular{X}=vec4(0.);\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];uniform float viewFrustumZ{X}[SHADOWCSMNUM_CASCADES{X}];uniform float frustumLengths{X}[SHADOWCSMNUM_CASCADES{X}];uniform float cascadeBlendFactor{X};varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};uniform highp sampler2DArray depthSampler{X};uniform vec2 lightSizeUVCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float depthCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float penumbraDarkness{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};\n#else\nuniform highp sampler2DArray shadowSampler{X};\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nconst vec3 vCascadeColorsMultiplier{X}[8]=vec3[8]\n(\nvec3 ( 1.5,0.0,0.0 ),\nvec3 ( 0.0,1.5,0.0 ),\nvec3 ( 0.0,0.0,5.5 ),\nvec3 ( 1.5,0.0,5.5 ),\nvec3 ( 1.5,1.5,0.0 ),\nvec3 ( 1.0,1.0,1.0 ),\nvec3 ( 0.0,1.0,5.5 ),\nvec3 ( 0.5,3.5,0.75 )\n);vec3 shadowDebug{X};\n#endif\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nint index{X}=-1;\n#else\nint index{X}=SHADOWCSMNUM_CASCADES{X}-1;\n#endif\nfloat diff{X}=0.;\n#elif defined(SHADOWCUBE{X})\nuniform samplerCube shadowSampler{X};\n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DShadow shadowSampler{X};uniform highp sampler2D depthSampler{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DShadow shadowSampler{X};\n#else\nuniform sampler2D shadowSampler{X};\n#endif\nuniform mat4 lightMatrix{X};\n#endif\nuniform vec4 shadowsInfo{X};uniform vec2 depthValues{X};\n#endif\n#ifdef SPOTLIGHT{X}\nuniform vec4 vLightDirection{X};uniform vec4 vLightFalloff{X};\n#elif defined(POINTLIGHT{X})\nuniform vec4 vLightFalloff{X};\n#elif defined(HEMILIGHT{X})\nuniform vec3 vLightGround{X};\n#endif\n#ifdef PROJECTEDLIGHTTEXTURE{X}\nuniform mat4 textureProjectionMatrix{X};uniform sampler2D projectionLightSampler{X};\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const lightFragmentDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightUboDeclaration\";\nconst shader = `#ifdef LIGHT{X}\nuniform Light{X}\n{vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular;\n#ifdef SPOTLIGHT{X}\nvec4 vLightDirection;vec4 vLightFalloff;\n#elif defined(POINTLIGHT{X})\nvec4 vLightFalloff;\n#elif defined(HEMILIGHT{X})\nvec3 vLightGround;\n#endif\nvec4 shadowsInfo;vec2 depthValues;} light{X};\n#ifdef PROJECTEDLIGHTTEXTURE{X}\nuniform mat4 textureProjectionMatrix{X};uniform sampler2D projectionLightSampler{X};\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];uniform float viewFrustumZ{X}[SHADOWCSMNUM_CASCADES{X}];uniform float frustumLengths{X}[SHADOWCSMNUM_CASCADES{X}];uniform float cascadeBlendFactor{X};varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};uniform highp sampler2DArray depthSampler{X};uniform vec2 lightSizeUVCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float depthCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float penumbraDarkness{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};\n#else\nuniform highp sampler2DArray shadowSampler{X};\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nconst vec3 vCascadeColorsMultiplier{X}[8]=vec3[8]\n(\nvec3 ( 1.5,0.0,0.0 ),\nvec3 ( 0.0,1.5,0.0 ),\nvec3 ( 0.0,0.0,5.5 ),\nvec3 ( 1.5,0.0,5.5 ),\nvec3 ( 1.5,1.5,0.0 ),\nvec3 ( 1.0,1.0,1.0 ),\nvec3 ( 0.0,1.0,5.5 ),\nvec3 ( 0.5,3.5,0.75 )\n);vec3 shadowDebug{X};\n#endif\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nint index{X}=-1;\n#else\nint index{X}=SHADOWCSMNUM_CASCADES{X}-1;\n#endif\nfloat diff{X}=0.;\n#elif defined(SHADOWCUBE{X})\nuniform samplerCube shadowSampler{X}; \n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DShadow shadowSampler{X};uniform highp sampler2D depthSampler{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DShadow shadowSampler{X};\n#else\nuniform sampler2D shadowSampler{X};\n#endif\nuniform mat4 lightMatrix{X};\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const lightUboDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightsFragmentFunctions\";\nconst shader = `struct lightingInfo\n{vec3 diffuse;\n#ifdef SPECULARTERM\nvec3 specular;\n#endif\n#ifdef NDOTL\nfloat ndl;\n#endif\n};lightingInfo computeLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {lightingInfo result;vec3 lightVectorW;float attenuation=1.0;if (lightData.w==0.)\n{vec3 direction=lightData.xyz-vPositionW;attenuation=max(0.,1.0-length(direction)/range);lightVectorW=normalize(direction);}\nelse\n{lightVectorW=normalize(-lightData.xyz);}\nfloat ndl=max(0.,dot(vNormal,lightVectorW));\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=ndl*diffuseColor*attenuation;\n#ifdef SPECULARTERM\nvec3 angleW=normalize(viewDirectionW+lightVectorW);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor*attenuation;\n#endif\nreturn result;}\nlightingInfo computeSpotLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec4 lightDirection,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {lightingInfo result;vec3 direction=lightData.xyz-vPositionW;vec3 lightVectorW=normalize(direction);float attenuation=max(0.,1.0-length(direction)/range);float cosAngle=max(0.,dot(lightDirection.xyz,-lightVectorW));if (cosAngle>=lightDirection.w)\n{cosAngle=max(0.,pow(cosAngle,lightData.w));attenuation*=cosAngle;float ndl=max(0.,dot(vNormal,lightVectorW));\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=ndl*diffuseColor*attenuation;\n#ifdef SPECULARTERM\nvec3 angleW=normalize(viewDirectionW+lightVectorW);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor*attenuation;\n#endif\nreturn result;}\nresult.diffuse=vec3(0.);\n#ifdef SPECULARTERM\nresult.specular=vec3(0.);\n#endif\n#ifdef NDOTL\nresult.ndl=0.;\n#endif\nreturn result;}\nlightingInfo computeHemisphericLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,vec3 groundColor,float glossiness) {lightingInfo result;float ndl=dot(vNormal,lightData.xyz)*0.5+0.5;\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=mix(groundColor,diffuseColor,ndl);\n#ifdef SPECULARTERM\nvec3 angleW=normalize(viewDirectionW+lightData.xyz);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor;\n#endif\nreturn result;}\n#define inline\nvec3 computeProjectionTextureDiffuseLighting(sampler2D projectionLightSampler,mat4 textureProjectionMatrix){vec4 strq=textureProjectionMatrix*vec4(vPositionW,1.0);strq/=strq.w;vec3 textureColor=texture2D(projectionLightSampler,strq.xy).rgb;return textureColor;}`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const lightsFragmentFunctions = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"shadowsFragmentFunctions\";\nconst shader = `#ifdef SHADOWS\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\n#define TEXTUREFUNC(s,c,l) texture2DLodEXT(s,c,l)\n#else\n#define TEXTUREFUNC(s,c,b) texture2D(s,c,b)\n#endif\n#ifndef SHADOWFLOAT\nfloat unpack(vec4 color)\n{const vec4 bit_shift=vec4(1.0/(255.0*255.0*255.0),1.0/(255.0*255.0),1.0/255.0,1.0);return dot(color,bit_shift);}\n#endif\nfloat computeFallOff(float value,vec2 clipSpace,float frustumEdgeFalloff)\n{float mask=smoothstep(1.0-frustumEdgeFalloff,1.00000012,clamp(dot(clipSpace,clipSpace),0.,1.));return mix(value,1.0,mask);}\n#define inline\nfloat computeShadowCube(vec3 worldPos,vec3 lightPosition,samplerCube shadowSampler,float darkness,vec2 depthValues)\n{vec3 directionToLight=worldPos-lightPosition;float depth=length(directionToLight);depth=(depth+depthValues.x)/(depthValues.y);depth=clamp(depth,0.,1.0);directionToLight=normalize(directionToLight);directionToLight.y=-directionToLight.y;\n#ifndef SHADOWFLOAT\nfloat shadow=unpack(textureCube(shadowSampler,directionToLight));\n#else\nfloat shadow=textureCube(shadowSampler,directionToLight).x;\n#endif\nreturn depth>shadow ? darkness : 1.0;}\n#define inline\nfloat computeShadowWithPoissonSamplingCube(vec3 worldPos,vec3 lightPosition,samplerCube shadowSampler,float mapSize,float darkness,vec2 depthValues)\n{vec3 directionToLight=worldPos-lightPosition;float depth=length(directionToLight);depth=(depth+depthValues.x)/(depthValues.y);depth=clamp(depth,0.,1.0);directionToLight=normalize(directionToLight);directionToLight.y=-directionToLight.y;float visibility=1.;vec3 poissonDisk[4];poissonDisk[0]=vec3(-1.0,1.0,-1.0);poissonDisk[1]=vec3(1.0,-1.0,-1.0);poissonDisk[2]=vec3(-1.0,-1.0,-1.0);poissonDisk[3]=vec3(1.0,-1.0,1.0);\n#ifndef SHADOWFLOAT\nif (unpack(textureCube(shadowSampler,directionToLight+poissonDisk[0]*mapSize))shadow ? computeFallOff(darkness,clipSpace.xy,frustumEdgeFalloff) : 1.;}\n#endif\n#define inline\nfloat computeShadow(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0);\n#ifndef SHADOWFLOAT\nfloat shadow=unpack(TEXTUREFUNC(shadowSampler,uv,0.));\n#else\nfloat shadow=TEXTUREFUNC(shadowSampler,uv,0.).x;\n#endif\nreturn shadowPixelDepth>shadow ? computeFallOff(darkness,clipSpace.xy,frustumEdgeFalloff) : 1.;}}\n#define inline\nfloat computeShadowWithPoissonSampling(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float mapSize,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0);float visibility=1.;vec2 poissonDisk[4];poissonDisk[0]=vec2(-0.94201624,-0.39906216);poissonDisk[1]=vec2(0.94558609,-0.76890725);poissonDisk[2]=vec2(-0.094184101,-0.92938870);poissonDisk[3]=vec2(0.34495938,0.29387760);\n#ifndef SHADOWFLOAT\nif (unpack(TEXTUREFUNC(shadowSampler,uv+poissonDisk[0]*mapSize,0.))1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0);\n#ifndef SHADOWFLOAT\nfloat shadowMapSample=unpack(TEXTUREFUNC(shadowSampler,uv,0.));\n#else\nfloat shadowMapSample=TEXTUREFUNC(shadowSampler,uv,0.).x;\n#endif\nfloat esm=1.0-clamp(exp(min(87.,depthScale*shadowPixelDepth))*shadowMapSample,0.,1.-darkness);return computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);}}\n#define inline\nfloat computeShadowWithCloseESM(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float depthScale,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0); \n#ifndef SHADOWFLOAT\nfloat shadowMapSample=unpack(TEXTUREFUNC(shadowSampler,uv,0.));\n#else\nfloat shadowMapSample=TEXTUREFUNC(shadowSampler,uv,0.).x;\n#endif\nfloat esm=clamp(exp(min(87.,-depthScale*(shadowPixelDepth-shadowMapSample))),darkness,1.);return computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);}}\n#ifdef IS_NDC_HALF_ZRANGE\n#define ZINCLIP clipSpace.z\n#else\n#define ZINCLIP uvDepth.z\n#endif\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\n#define GREATEST_LESS_THAN_ONE 0.99999994\n/* disable_uniformity_analysis */\n#define inline\nfloat computeShadowWithCSMPCF1(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec4 uvDepthLayer=vec4(uvDepth.x,uvDepth.y,layer,uvDepth.z);float shadow=texture2D(shadowSampler,uvDepthLayer);shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}\n#define inline\nfloat computeShadowWithCSMPCF3(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=3.-2.*st;vec2 uvw1=1.+2.*st;vec2 u=vec2((2.-st.x)/uvw0.x-1.,st.x/uvw1.x+1.)*shadowMapSizeAndInverse.y;vec2 v=vec2((2.-st.y)/uvw0.y-1.,st.y/uvw1.y+1.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[0]),layer,uvDepth.z));shadow+=uvw1.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[0]),layer,uvDepth.z));shadow+=uvw0.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[1]),layer,uvDepth.z));shadow+=uvw1.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[1]),layer,uvDepth.z));shadow=shadow/16.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}\n#define inline\nfloat computeShadowWithCSMPCF5(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=4.-3.*st;vec2 uvw1=vec2(7.);vec2 uvw2=1.+3.*st;vec3 u=vec3((3.-2.*st.x)/uvw0.x-2.,(3.+st.x)/uvw1.x,st.x/uvw2.x+2.)*shadowMapSizeAndInverse.y;vec3 v=vec3((3.-2.*st.y)/uvw0.y-2.,(3.+st.y)/uvw1.y,st.y/uvw2.y+2.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[0]),layer,uvDepth.z));shadow+=uvw1.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[0]),layer,uvDepth.z));shadow+=uvw2.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[0]),layer,uvDepth.z));shadow+=uvw0.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[1]),layer,uvDepth.z));shadow+=uvw1.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[1]),layer,uvDepth.z));shadow+=uvw2.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[1]),layer,uvDepth.z));shadow+=uvw0.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[2]),layer,uvDepth.z));shadow+=uvw1.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[2]),layer,uvDepth.z));shadow+=uvw2.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[2]),layer,uvDepth.z));shadow=shadow/144.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}\n#define inline\nfloat computeShadowWithPCF1(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,float darkness,float frustumEdgeFalloff)\n{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;float shadow=TEXTUREFUNC(shadowSampler,uvDepth,0.);shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}}\n#define inline\nfloat computeShadowWithPCF3(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=3.-2.*st;vec2 uvw1=1.+2.*st;vec2 u=vec2((2.-st.x)/uvw0.x-1.,st.x/uvw1.x+1.)*shadowMapSizeAndInverse.y;vec2 v=vec2((2.-st.y)/uvw0.y-1.,st.y/uvw1.y+1.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[0]),uvDepth.z),0.);shadow+=uvw1.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[0]),uvDepth.z),0.);shadow+=uvw0.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[1]),uvDepth.z),0.);shadow+=uvw1.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[1]),uvDepth.z),0.);shadow=shadow/16.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}}\n#define inline\nfloat computeShadowWithPCF5(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=4.-3.*st;vec2 uvw1=vec2(7.);vec2 uvw2=1.+3.*st;vec3 u=vec3((3.-2.*st.x)/uvw0.x-2.,(3.+st.x)/uvw1.x,st.x/uvw2.x+2.)*shadowMapSizeAndInverse.y;vec3 v=vec3((3.-2.*st.y)/uvw0.y-2.,(3.+st.y)/uvw1.y,st.y/uvw2.y+2.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[0]),uvDepth.z),0.);shadow+=uvw1.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[0]),uvDepth.z),0.);shadow+=uvw2.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[0]),uvDepth.z),0.);shadow+=uvw0.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[1]),uvDepth.z),0.);shadow+=uvw1.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[1]),uvDepth.z),0.);shadow+=uvw2.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[1]),uvDepth.z),0.);shadow+=uvw0.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[2]),uvDepth.z),0.);shadow+=uvw1.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[2]),uvDepth.z),0.);shadow+=uvw2.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[2]),uvDepth.z),0.);shadow=shadow/144.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}}\nconst vec3 PoissonSamplers32[64]=vec3[64](\nvec3(0.06407013,0.05409927,0.),\nvec3(0.7366577,0.5789394,0.),\nvec3(-0.6270542,-0.5320278,0.),\nvec3(-0.4096107,0.8411095,0.),\nvec3(0.6849564,-0.4990818,0.),\nvec3(-0.874181,-0.04579735,0.),\nvec3(0.9989998,0.0009880066,0.),\nvec3(-0.004920578,-0.9151649,0.),\nvec3(0.1805763,0.9747483,0.),\nvec3(-0.2138451,0.2635818,0.),\nvec3(0.109845,0.3884785,0.),\nvec3(0.06876755,-0.3581074,0.),\nvec3(0.374073,-0.7661266,0.),\nvec3(0.3079132,-0.1216763,0.),\nvec3(-0.3794335,-0.8271583,0.),\nvec3(-0.203878,-0.07715034,0.),\nvec3(0.5912697,0.1469799,0.),\nvec3(-0.88069,0.3031784,0.),\nvec3(0.5040108,0.8283722,0.),\nvec3(-0.5844124,0.5494877,0.),\nvec3(0.6017799,-0.1726654,0.),\nvec3(-0.5554981,0.1559997,0.),\nvec3(-0.3016369,-0.3900928,0.),\nvec3(-0.5550632,-0.1723762,0.),\nvec3(0.925029,0.2995041,0.),\nvec3(-0.2473137,0.5538505,0.),\nvec3(0.9183037,-0.2862392,0.),\nvec3(0.2469421,0.6718712,0.),\nvec3(0.3916397,-0.4328209,0.),\nvec3(-0.03576927,-0.6220032,0.),\nvec3(-0.04661255,0.7995201,0.),\nvec3(0.4402924,0.3640312,0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.)\n);const vec3 PoissonSamplers64[64]=vec3[64](\nvec3(-0.613392,0.617481,0.),\nvec3(0.170019,-0.040254,0.),\nvec3(-0.299417,0.791925,0.),\nvec3(0.645680,0.493210,0.),\nvec3(-0.651784,0.717887,0.),\nvec3(0.421003,0.027070,0.),\nvec3(-0.817194,-0.271096,0.),\nvec3(-0.705374,-0.668203,0.),\nvec3(0.977050,-0.108615,0.),\nvec3(0.063326,0.142369,0.),\nvec3(0.203528,0.214331,0.),\nvec3(-0.667531,0.326090,0.),\nvec3(-0.098422,-0.295755,0.),\nvec3(-0.885922,0.215369,0.),\nvec3(0.566637,0.605213,0.),\nvec3(0.039766,-0.396100,0.),\nvec3(0.751946,0.453352,0.),\nvec3(0.078707,-0.715323,0.),\nvec3(-0.075838,-0.529344,0.),\nvec3(0.724479,-0.580798,0.),\nvec3(0.222999,-0.215125,0.),\nvec3(-0.467574,-0.405438,0.),\nvec3(-0.248268,-0.814753,0.),\nvec3(0.354411,-0.887570,0.),\nvec3(0.175817,0.382366,0.),\nvec3(0.487472,-0.063082,0.),\nvec3(-0.084078,0.898312,0.),\nvec3(0.488876,-0.783441,0.),\nvec3(0.470016,0.217933,0.),\nvec3(-0.696890,-0.549791,0.),\nvec3(-0.149693,0.605762,0.),\nvec3(0.034211,0.979980,0.),\nvec3(0.503098,-0.308878,0.),\nvec3(-0.016205,-0.872921,0.),\nvec3(0.385784,-0.393902,0.),\nvec3(-0.146886,-0.859249,0.),\nvec3(0.643361,0.164098,0.),\nvec3(0.634388,-0.049471,0.),\nvec3(-0.688894,0.007843,0.),\nvec3(0.464034,-0.188818,0.),\nvec3(-0.440840,0.137486,0.),\nvec3(0.364483,0.511704,0.),\nvec3(0.034028,0.325968,0.),\nvec3(0.099094,-0.308023,0.),\nvec3(0.693960,-0.366253,0.),\nvec3(0.678884,-0.204688,0.),\nvec3(0.001801,0.780328,0.),\nvec3(0.145177,-0.898984,0.),\nvec3(0.062655,-0.611866,0.),\nvec3(0.315226,-0.604297,0.),\nvec3(-0.780145,0.486251,0.),\nvec3(-0.371868,0.882138,0.),\nvec3(0.200476,0.494430,0.),\nvec3(-0.494552,-0.711051,0.),\nvec3(0.612476,0.705252,0.),\nvec3(-0.578845,-0.768792,0.),\nvec3(-0.772454,-0.090976,0.),\nvec3(0.504440,0.372295,0.),\nvec3(0.155736,0.065157,0.),\nvec3(0.391522,0.849605,0.),\nvec3(-0.620106,-0.328104,0.),\nvec3(0.789239,-0.419965,0.),\nvec3(-0.545396,0.538133,0.),\nvec3(-0.178564,-0.596057,0.)\n);\n#define inline\nfloat computeShadowWithCSMPCSS(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArray depthSampler,highp sampler2DArrayShadow shadowSampler,float shadowMapSizeInverse,float lightSizeUV,float darkness,float frustumEdgeFalloff,int searchTapCount,int pcfTapCount,vec3[64] poissonSamplers,vec2 lightSizeUVCorrection,float depthCorrection,float penumbraDarkness)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec4 uvDepthLayer=vec4(uvDepth.x,uvDepth.y,layer,uvDepth.z);float blockerDepth=0.0;float sumBlockerDepth=0.0;float numBlocker=0.0;for (int i=0; i1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;float blockerDepth=0.0;float sumBlockerDepth=0.0;float numBlocker=0.0;for (int i=0; i(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_SAMPLERNAME_,bump)\n#endif\n#if defined(DETAIL)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_SAMPLERNAME_,detail)\n#endif\n#if defined(BUMP) && defined(PARALLAX)\nconst float minSamples=4.;const float maxSamples=15.;const int iMaxSamples=15;vec2 parallaxOcclusion(vec3 vViewDirCoT,vec3 vNormalCoT,vec2 texCoord,float parallaxScale) {float parallaxLimit=length(vViewDirCoT.xy)/vViewDirCoT.z;parallaxLimit*=parallaxScale;vec2 vOffsetDir=normalize(vViewDirCoT.xy);vec2 vMaxOffset=vOffsetDir*parallaxLimit;float numSamples=maxSamples+(dot(vViewDirCoT,vNormalCoT)*(minSamples-maxSamples));float stepSize=1.0/numSamples;float currRayHeight=1.0;vec2 vCurrOffset=vec2(0,0);vec2 vLastOffset=vec2(0,0);float lastSampledHeight=1.0;float currSampledHeight=1.0;bool keepWorking=true;for (int i=0; icurrRayHeight)\n{float delta1=currSampledHeight-currRayHeight;float delta2=(currRayHeight+stepSize)-lastSampledHeight;float ratio=delta1/(delta1+delta2);vCurrOffset=(ratio)* vLastOffset+(1.0-ratio)*vCurrOffset;keepWorking=false;}\nelse\n{currRayHeight-=stepSize;vLastOffset=vCurrOffset;\n#ifdef PARALLAX_RHS\nvCurrOffset-=stepSize*vMaxOffset;\n#else\nvCurrOffset+=stepSize*vMaxOffset;\n#endif\nlastSampledHeight=currSampledHeight;}}\nreturn vCurrOffset;}\nvec2 parallaxOffset(vec3 viewDir,float heightScale)\n{float height=texture2D(bumpSampler,vBumpUV).w;vec2 texCoordOffset=heightScale*viewDir.xy*height;\n#ifdef PARALLAX_RHS\nreturn texCoordOffset;\n#else\nreturn -texCoordOffset;\n#endif\n}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bumpFragmentFunctions = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"clipPlaneFragmentDeclaration\";\nconst shader = `#ifdef CLIPPLANE\nvarying float fClipDistance;\n#endif\n#ifdef CLIPPLANE2\nvarying float fClipDistance2;\n#endif\n#ifdef CLIPPLANE3\nvarying float fClipDistance3;\n#endif\n#ifdef CLIPPLANE4\nvarying float fClipDistance4;\n#endif\n#ifdef CLIPPLANE5\nvarying float fClipDistance5;\n#endif\n#ifdef CLIPPLANE6\nvarying float fClipDistance6;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const clipPlaneFragmentDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"logDepthDeclaration\";\nconst shader = `#ifdef LOGARITHMICDEPTH\nuniform float logarithmicDepthConstant;varying float vFragmentDepth;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const logDepthDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"fogFragmentDeclaration\";\nconst shader = `#ifdef FOG\n#define FOGMODE_NONE 0.\n#define FOGMODE_EXP 1.\n#define FOGMODE_EXP2 2.\n#define FOGMODE_LINEAR 3.\n#define E 2.71828\nuniform vec4 vFogInfos;uniform vec3 vFogColor;varying vec3 vFogDistance;float CalcFogFactor()\n{float fogCoeff=1.0;float fogStart=vFogInfos.y;float fogEnd=vFogInfos.z;float fogDensity=vFogInfos.w;float fogDistance=length(vFogDistance);if (FOGMODE_LINEAR==vFogInfos.x)\n{fogCoeff=(fogEnd-fogDistance)/(fogEnd-fogStart);}\nelse if (FOGMODE_EXP==vFogInfos.x)\n{fogCoeff=1.0/pow(E,fogDistance*fogDensity);}\nelse if (FOGMODE_EXP2==vFogInfos.x)\n{fogCoeff=1.0/pow(E,fogDistance*fogDistance*fogDensity*fogDensity);}\nreturn clamp(fogCoeff,0.0,1.0);}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const fogFragmentDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"clipPlaneFragment\";\nconst shader = `#if defined(CLIPPLANE) || defined(CLIPPLANE2) || defined(CLIPPLANE3) || defined(CLIPPLANE4) || defined(CLIPPLANE5) || defined(CLIPPLANE6)\nif (false) {}\n#endif\n#ifdef CLIPPLANE\nelse if (fClipDistance>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE2\nelse if (fClipDistance2>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE3\nelse if (fClipDistance3>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE4\nelse if (fClipDistance4>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE5\nelse if (fClipDistance5>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE6\nelse if (fClipDistance6>0.0)\n{discard;}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const clipPlaneFragment = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bumpFragment\";\nconst shader = `vec2 uvOffset=vec2(0.0,0.0);\n#if defined(BUMP) || defined(PARALLAX) || defined(DETAIL)\n#ifdef NORMALXYSCALE\nfloat normalScale=1.0;\n#elif defined(BUMP)\nfloat normalScale=vBumpInfos.y;\n#else\nfloat normalScale=1.0;\n#endif\n#if defined(TANGENT) && defined(NORMAL)\nmat3 TBN=vTBN;\n#elif defined(BUMP)\nvec2 TBNUV=gl_FrontFacing ? vBumpUV : -vBumpUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vTangentSpaceParams);\n#else\nvec2 TBNUV=gl_FrontFacing ? vDetailUV : -vDetailUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vec2(1.,1.));\n#endif\n#elif defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL)\nmat3 TBN=vTBN;\n#else\nvec2 TBNUV=gl_FrontFacing ? vMainUV1 : -vMainUV1;mat3 TBN=cotangent_frame(normalW,vPositionW,TBNUV,vec2(1.,1.));\n#endif\n#endif\n#ifdef PARALLAX\nmat3 invTBN=transposeMat3(TBN);\n#ifdef PARALLAXOCCLUSION\nuvOffset=parallaxOcclusion(invTBN*-viewDirectionW,invTBN*normalW,vBumpUV,vBumpInfos.z);\n#else\nuvOffset=parallaxOffset(invTBN*viewDirectionW,vBumpInfos.z);\n#endif\n#endif\n#ifdef DETAIL\nvec4 detailColor=texture2D(detailSampler,vDetailUV+uvOffset);vec2 detailNormalRG=detailColor.wy*2.0-1.0;float detailNormalB=sqrt(1.-saturate(dot(detailNormalRG,detailNormalRG)));vec3 detailNormal=vec3(detailNormalRG,detailNormalB);\n#endif\n#ifdef BUMP\n#ifdef OBJECTSPACE_NORMALMAP\n#define CUSTOM_FRAGMENT_BUMP_FRAGMENT\nnormalW=normalize(texture2D(bumpSampler,vBumpUV).xyz *2.0-1.0);normalW=normalize(mat3(normalMatrix)*normalW);\n#elif !defined(DETAIL)\nnormalW=perturbNormal(TBN,texture2D(bumpSampler,vBumpUV+uvOffset).xyz,vBumpInfos.y);\n#else\nvec3 bumpNormal=texture2D(bumpSampler,vBumpUV+uvOffset).xyz*2.0-1.0;\n#if DETAIL_NORMALBLENDMETHOD==0 \ndetailNormal.xy*=vDetailInfos.z;vec3 blendedNormal=normalize(vec3(bumpNormal.xy+detailNormal.xy,bumpNormal.z*detailNormal.z));\n#elif DETAIL_NORMALBLENDMETHOD==1 \ndetailNormal.xy*=vDetailInfos.z;bumpNormal+=vec3(0.0,0.0,1.0);detailNormal*=vec3(-1.0,-1.0,1.0);vec3 blendedNormal=bumpNormal*dot(bumpNormal,detailNormal)/bumpNormal.z-detailNormal;\n#endif\nnormalW=perturbNormalBase(TBN,blendedNormal,vBumpInfos.y);\n#endif\n#elif defined(DETAIL)\ndetailNormal.xy*=vDetailInfos.z;normalW=perturbNormalBase(TBN,detailNormal,vDetailInfos.z);\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bumpFragment = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"decalFragment\";\nconst shader = `#ifdef DECAL\n#ifdef GAMMADECAL\ndecalColor.rgb=toLinearSpace(decalColor.rgb);\n#endif\n#ifdef DECAL_SMOOTHALPHA\ndecalColor.a*=decalColor.a;\n#endif\nsurfaceAlbedo.rgb=mix(surfaceAlbedo.rgb,decalColor.rgb,decalColor.a);\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const decalFragment = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"depthPrePass\";\nconst shader = `#ifdef DEPTHPREPASS\ngl_FragColor=vec4(0.,0.,0.,1.0);return;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const depthPrePass = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightFragment\";\nconst shader = `#ifdef LIGHT{X}\n#if defined(SHADOWONLY) || defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X}) && defined(LIGHTMAPNOSPECULAR{X})\n#else\n#ifdef PBR\n#ifdef SPOTLIGHT{X}\npreInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(POINTLIGHT{X})\npreInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(HEMILIGHT{X})\npreInfo=computeHemisphericPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(DIRLIGHT{X})\npreInfo=computeDirectionalPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#endif\npreInfo.NdotV=NdotV;\n#ifdef SPOTLIGHT{X}\n#ifdef LIGHT_FALLOFF_GLTF{X}\npreInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff_GLTF(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);\n#elif defined(LIGHT_FALLOFF_PHYSICAL{X})\npreInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);preInfo.attenuation*=computeDirectionalLightFalloff_Physical(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w);\n#elif defined(LIGHT_FALLOFF_STANDARD{X})\npreInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);preInfo.attenuation*=computeDirectionalLightFalloff_Standard(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w);\n#else\npreInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);\n#endif\n#elif defined(POINTLIGHT{X})\n#ifdef LIGHT_FALLOFF_GLTF{X}\npreInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);\n#elif defined(LIGHT_FALLOFF_PHYSICAL{X})\npreInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);\n#elif defined(LIGHT_FALLOFF_STANDARD{X})\npreInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);\n#else\npreInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);\n#endif\n#else\npreInfo.attenuation=1.0;\n#endif\n#ifdef HEMILIGHT{X}\npreInfo.roughness=roughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(roughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\n#ifdef IRIDESCENCE\npreInfo.iridescenceIntensity=iridescenceIntensity;\n#endif\n#ifdef HEMILIGHT{X}\ninfo.diffuse=computeHemisphericDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb,light{X}.vLightGround);\n#elif defined(SS_TRANSLUCENCY)\ninfo.diffuse=computeDiffuseAndTransmittedLighting(preInfo,light{X}.vLightDiffuse.rgb,subSurfaceOut.transmittance);\n#else\ninfo.diffuse=computeDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb);\n#endif\n#ifdef SPECULARTERM\n#ifdef ANISOTROPIC\ninfo.specular=computeAnisotropicSpecularLighting(preInfo,viewDirectionW,normalW,anisotropicOut.anisotropicTangent,anisotropicOut.anisotropicBitangent,anisotropicOut.anisotropy,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);\n#else\ninfo.specular=computeSpecularLighting(preInfo,normalW,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);\n#endif\n#endif\n#ifdef SHEEN\n#ifdef SHEEN_LINKWITHALBEDO\npreInfo.roughness=sheenOut.sheenIntensity;\n#else\n#ifdef HEMILIGHT{X}\npreInfo.roughness=sheenOut.sheenRoughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(sheenOut.sheenRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\n#endif\ninfo.sheen=computeSheenLighting(preInfo,normalW,sheenOut.sheenColor,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);\n#endif\n#ifdef CLEARCOAT\n#ifdef HEMILIGHT{X}\npreInfo.roughness=clearcoatOut.clearCoatRoughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(clearcoatOut.clearCoatRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\ninfo.clearCoat=computeClearCoatLighting(preInfo,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatAARoughnessFactors.x,clearcoatOut.clearCoatIntensity,light{X}.vLightDiffuse.rgb);\n#ifdef CLEARCOAT_TINT\nabsorption=computeClearCoatLightingAbsorption(clearcoatOut.clearCoatNdotVRefract,preInfo.L,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatColor,clearcoatOut.clearCoatThickness,clearcoatOut.clearCoatIntensity);info.diffuse*=absorption;\n#ifdef SPECULARTERM\ninfo.specular*=absorption;\n#endif\n#endif\ninfo.diffuse*=info.clearCoat.w;\n#ifdef SPECULARTERM\ninfo.specular*=info.clearCoat.w;\n#endif\n#ifdef SHEEN\ninfo.sheen*=info.clearCoat.w;\n#endif\n#endif\n#else\n#ifdef SPOTLIGHT{X}\ninfo=computeSpotLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDirection,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness);\n#elif defined(HEMILIGHT{X})\ninfo=computeHemisphericLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightGround,glossiness);\n#elif defined(POINTLIGHT{X}) || defined(DIRLIGHT{X})\ninfo=computeLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness);\n#endif\n#endif\n#ifdef PROJECTEDLIGHTTEXTURE{X}\ninfo.diffuse*=computeProjectionTextureDiffuseLighting(projectionLightSampler{X},textureProjectionMatrix{X});\n#endif\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nfor (int i=0; i=0.) {index{X}=i;break;}}\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nif (index{X}>=0)\n#endif\n{\n#if defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#else\nshadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#endif\n#else\nshadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nshadowDebug{X}=vec3(shadow)*vCascadeColorsMultiplier{X}[index{X}];\n#endif\n#ifndef SHADOWCSMNOBLEND{X}\nfloat frustumLength=frustumLengths{X}[index{X}];float diffRatio=clamp(diff{X}/frustumLength,0.,1.)*cascadeBlendFactor{X};if (index{X}<(SHADOWCSMNUM_CASCADES{X}-1) && diffRatio<1.)\n{index{X}+=1;float nextShadow=0.;\n#if defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nnextShadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nnextShadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nnextShadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nnextShadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#elif defined(SHADOWMEDIUMQUALITY{X})\nnextShadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#else\nnextShadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#endif\n#else\nnextShadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\nshadow=mix(nextShadow,shadow,diffRatio);\n#ifdef SHADOWCSMDEBUG{X}\nshadowDebug{X}=mix(vec3(nextShadow)*vCascadeColorsMultiplier{X}[index{X}],shadowDebug{X},diffRatio);\n#endif\n}\n#endif\n}\n#elif defined(SHADOWCLOSEESM{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithCloseESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);\n#else\nshadow=computeShadowWithCloseESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWESM{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);\n#else\nshadow=computeShadowWithESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPOISSON{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithPoissonSamplingCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.depthValues);\n#else\nshadow=computeShadowWithPoissonSampling(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithPCF1(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithPCF3(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithPCF5(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithPCSS16(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithPCSS32(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithPCSS64(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#else\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.depthValues);\n#else\nshadow=computeShadow(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#endif\n#ifdef SHADOWONLY\n#ifndef SHADOWINUSE\n#define SHADOWINUSE\n#endif\nglobalShadow+=shadow;shadowLightCount+=1.0;\n#endif\n#else\nshadow=1.;\n#endif\naggShadow+=shadow;numLights+=1.0;\n#ifndef SHADOWONLY\n#ifdef CUSTOMUSERLIGHTING\ndiffuseBase+=computeCustomDiffuseLighting(info,diffuseBase,shadow);\n#ifdef SPECULARTERM\nspecularBase+=computeCustomSpecularLighting(info,specularBase,shadow);\n#endif\n#elif defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X})\ndiffuseBase+=lightmapColor.rgb*shadow;\n#ifdef SPECULARTERM\n#ifndef LIGHTMAPNOSPECULAR{X}\nspecularBase+=info.specular*shadow*lightmapColor.rgb;\n#endif\n#endif\n#ifdef CLEARCOAT\n#ifndef LIGHTMAPNOSPECULAR{X}\nclearCoatBase+=info.clearCoat.rgb*shadow*lightmapColor.rgb;\n#endif\n#endif\n#ifdef SHEEN\n#ifndef LIGHTMAPNOSPECULAR{X}\nsheenBase+=info.sheen.rgb*shadow;\n#endif\n#endif\n#else\n#ifdef SHADOWCSMDEBUG{X}\ndiffuseBase+=info.diffuse*shadowDebug{X};\n#else \ndiffuseBase+=info.diffuse*shadow;\n#endif\n#ifdef SPECULARTERM\nspecularBase+=info.specular*shadow;\n#endif\n#ifdef CLEARCOAT\nclearCoatBase+=info.clearCoat.rgb*shadow;\n#endif\n#ifdef SHEEN\nsheenBase+=info.sheen.rgb*shadow;\n#endif\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const lightFragment = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"logDepthFragment\";\nconst shader = `#ifdef LOGARITHMICDEPTH\ngl_FragDepthEXT=log2(vFragmentDepth)*logarithmicDepthConstant*0.5;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const logDepthFragment = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"fogFragment\";\nconst shader = `#ifdef FOG\nfloat fog=CalcFogFactor();\n#ifdef PBR\nfog=toLinearSpace(fog);\n#endif\ncolor.rgb=mix(vFogColor,color.rgb,fog);\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const fogFragment = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"oitFragment\";\nconst shader = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY\nfloat fragDepth=gl_FragCoord.z; \n#ifdef ORDER_INDEPENDENT_TRANSPARENCY_16BITS\nuint halfFloat=packHalf2x16(vec2(fragDepth));vec2 full=unpackHalf2x16(halfFloat);fragDepth=full.x;\n#endif\nivec2 fragCoord=ivec2(gl_FragCoord.xy);vec2 lastDepth=texelFetch(oitDepthSampler,fragCoord,0).rg;vec4 lastFrontColor=texelFetch(oitFrontColorSampler,fragCoord,0);depth.rg=vec2(-MAX_DEPTH);frontColor=lastFrontColor;backColor=vec4(0.0);\n#ifdef USE_REVERSE_DEPTHBUFFER\nfloat furthestDepth=-lastDepth.x;float nearestDepth=lastDepth.y;\n#else\nfloat nearestDepth=-lastDepth.x;float furthestDepth=lastDepth.y;\n#endif\nfloat alphaMultiplier=1.0-lastFrontColor.a;\n#ifdef USE_REVERSE_DEPTHBUFFER\nif (fragDepth>nearestDepth || fragDepthfurthestDepth) {\n#endif\nreturn;}\n#ifdef USE_REVERSE_DEPTHBUFFER\nif (fragDepthfurthestDepth) {\n#else\nif (fragDepth>nearestDepth && fragDepth\n#if defined(BUMP) || !defined(NORMAL)\n#extension GL_OES_standard_derivatives : enable\n#endif\n#include[SCENE_MRT_COUNT]\n#include\n#define CUSTOM_FRAGMENT_BEGIN\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#include[1..7]\n#include\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n#include\n#include\n#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse,_SAMPLERNAME_,diffuse)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_SAMPLERNAME_,ambient)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_SAMPLERNAME_,opacity)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_SAMPLERNAME_,emissive)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_SAMPLERNAME_,lightmap)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_SAMPLERNAME_,decal)\n#ifdef REFRACTION\n#ifdef REFRACTIONMAP_3D\nuniform samplerCube refractionCubeSampler;\n#else\nuniform sampler2D refraction2DSampler;\n#endif\n#endif\n#if defined(SPECULARTERM)\n#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular,_SAMPLERNAME_,specular)\n#endif\n#include\n#ifdef REFLECTION\n#ifdef REFLECTIONMAP_3D\nuniform samplerCube reflectionCubeSampler;\n#else\nuniform sampler2D reflection2DSampler;\n#endif\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#else\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#endif\n#include\n#endif\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include\nvec3 viewDirectionW=normalize(vEyePosition.xyz-vPositionW);vec4 baseColor=vec4(1.,1.,1.,1.);vec3 diffuseColor=vDiffuseColor.rgb;float alpha=vDiffuseColor.a;\n#ifdef NORMAL\nvec3 normalW=normalize(vNormalW);\n#else\nvec3 normalW=normalize(-cross(dFdx(vPositionW),dFdy(vPositionW)));\n#endif\n#include\n#ifdef TWOSIDEDLIGHTING\nnormalW=gl_FrontFacing ? normalW : -normalW;\n#endif\n#ifdef DIFFUSE\nbaseColor=texture2D(diffuseSampler,vDiffuseUV+uvOffset);\n#if defined(ALPHATEST) && !defined(ALPHATEST_AFTERALLALPHACOMPUTATIONS)\nif (baseColor.a(surfaceAlbedo,baseColor,GAMMADECAL,_GAMMADECAL_NOTUSED_)\n#endif\n#include\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nbaseColor.rgb*=vColor.rgb;\n#endif\n#ifdef DETAIL\nbaseColor.rgb=baseColor.rgb*2.0*mix(0.5,detailColor.r,vDetailInfos.y);\n#endif\n#if defined(DECAL) && defined(DECAL_AFTER_DETAIL)\nvec4 decalColor=texture2D(decalSampler,vDecalUV+uvOffset);\n#include(surfaceAlbedo,baseColor,GAMMADECAL,_GAMMADECAL_NOTUSED_)\n#endif\n#define CUSTOM_FRAGMENT_UPDATE_DIFFUSE\nvec3 baseAmbientColor=vec3(1.,1.,1.);\n#ifdef AMBIENT\nbaseAmbientColor=texture2D(ambientSampler,vAmbientUV+uvOffset).rgb*vAmbientInfos.y;\n#endif\n#define CUSTOM_FRAGMENT_BEFORE_LIGHTS\n#ifdef SPECULARTERM\nfloat glossiness=vSpecularColor.a;vec3 specularColor=vSpecularColor.rgb;\n#ifdef SPECULAR\nvec4 specularMapColor=texture2D(specularSampler,vSpecularUV+uvOffset);specularColor=specularMapColor.rgb;\n#ifdef GLOSSINESS\nglossiness=glossiness*specularMapColor.a;\n#endif\n#endif\n#else\nfloat glossiness=0.;\n#endif\nvec3 diffuseBase=vec3(0.,0.,0.);lightingInfo info;\n#ifdef SPECULARTERM\nvec3 specularBase=vec3(0.,0.,0.);\n#endif\nfloat shadow=1.;float aggShadow=0.;float numLights=0.;\n#ifdef LIGHTMAP\nvec4 lightmapColor=texture2D(lightmapSampler,vLightmapUV+uvOffset);\n#ifdef RGBDLIGHTMAP\nlightmapColor.rgb=fromRGBD(lightmapColor);\n#endif\nlightmapColor.rgb*=vLightmapInfos.y;\n#endif\n#include[0..maxSimultaneousLights]\naggShadow=aggShadow/numLights;vec4 refractionColor=vec4(0.,0.,0.,1.);\n#ifdef REFRACTION\nvec3 refractionVector=normalize(refract(-viewDirectionW,normalW,vRefractionInfos.y));\n#ifdef REFRACTIONMAP_3D\n#ifdef USE_LOCAL_REFRACTIONMAP_CUBIC\nrefractionVector=parallaxCorrectNormal(vPositionW,refractionVector,vRefractionSize,vRefractionPosition);\n#endif\nrefractionVector.y=refractionVector.y*vRefractionInfos.w;vec4 refractionLookup=textureCube(refractionCubeSampler,refractionVector);if (dot(refractionVector,viewDirectionW)<1.0) {refractionColor=refractionLookup;}\n#else\nvec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*vRefractionInfos.z,1.0)));vec2 refractionCoords=vRefractionUVW.xy/vRefractionUVW.z;refractionCoords.y=1.0-refractionCoords.y;refractionColor=texture2D(refraction2DSampler,refractionCoords);\n#endif\n#ifdef RGBDREFRACTION\nrefractionColor.rgb=fromRGBD(refractionColor);\n#endif\n#ifdef IS_REFRACTION_LINEAR\nrefractionColor.rgb=toGammaSpace(refractionColor.rgb);\n#endif\nrefractionColor.rgb*=vRefractionInfos.x;\n#endif\nvec4 reflectionColor=vec4(0.,0.,0.,1.);\n#ifdef REFLECTION\nvec3 vReflectionUVW=computeReflectionCoords(vec4(vPositionW,1.0),normalW);\n#ifdef REFLECTIONMAP_OPPOSITEZ\nvReflectionUVW.z*=-1.0;\n#endif\n#ifdef REFLECTIONMAP_3D\n#ifdef ROUGHNESS\nfloat bias=vReflectionInfos.y;\n#ifdef SPECULARTERM\n#ifdef SPECULAR\n#ifdef GLOSSINESS\nbias*=(1.0-specularMapColor.a);\n#endif\n#endif\n#endif\nreflectionColor=textureCube(reflectionCubeSampler,vReflectionUVW,bias);\n#else\nreflectionColor=textureCube(reflectionCubeSampler,vReflectionUVW);\n#endif\n#else\nvec2 coords=vReflectionUVW.xy;\n#ifdef REFLECTIONMAP_PROJECTION\ncoords/=vReflectionUVW.z;\n#endif\ncoords.y=1.0-coords.y;reflectionColor=texture2D(reflection2DSampler,coords);\n#endif\n#ifdef RGBDREFLECTION\nreflectionColor.rgb=fromRGBD(reflectionColor);\n#endif\n#ifdef IS_REFLECTION_LINEAR\nreflectionColor.rgb=toGammaSpace(reflectionColor.rgb);\n#endif\nreflectionColor.rgb*=vReflectionInfos.x;\n#ifdef REFLECTIONFRESNEL\nfloat reflectionFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,reflectionRightColor.a,reflectionLeftColor.a);\n#ifdef REFLECTIONFRESNELFROMSPECULAR\n#ifdef SPECULARTERM\nreflectionColor.rgb*=specularColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#else\nreflectionColor.rgb*=reflectionLeftColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#endif\n#else\nreflectionColor.rgb*=reflectionLeftColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#endif\n#endif\n#endif\n#ifdef REFRACTIONFRESNEL\nfloat refractionFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,refractionRightColor.a,refractionLeftColor.a);refractionColor.rgb*=refractionLeftColor.rgb*(1.0-refractionFresnelTerm)+refractionFresnelTerm*refractionRightColor.rgb;\n#endif\n#ifdef OPACITY\nvec4 opacityMap=texture2D(opacitySampler,vOpacityUV+uvOffset);\n#ifdef OPACITYRGB\nopacityMap.rgb=opacityMap.rgb*vec3(0.3,0.59,0.11);alpha*=(opacityMap.x+opacityMap.y+opacityMap.z)* vOpacityInfos.y;\n#else\nalpha*=opacityMap.a*vOpacityInfos.y;\n#endif\n#endif\n#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nalpha*=vColor.a;\n#endif\n#ifdef OPACITYFRESNEL\nfloat opacityFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,opacityParts.z,opacityParts.w);alpha+=opacityParts.x*(1.0-opacityFresnelTerm)+opacityFresnelTerm*opacityParts.y;\n#endif\n#ifdef ALPHATEST\n#ifdef ALPHATEST_AFTERALLALPHACOMPUTATIONS\nif (alpha\n#include\n#ifdef IMAGEPROCESSINGPOSTPROCESS\ncolor.rgb=toLinearSpace(color.rgb);\n#else\n#ifdef IMAGEPROCESSING\ncolor.rgb=toLinearSpace(color.rgb);color=applyImageProcessing(color);\n#endif\n#endif\ncolor.a*=visibility;\n#ifdef PREMULTIPLYALPHA\ncolor.rgb*=color.a;\n#endif\n#define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\n#ifdef PREPASS\nfloat writeGeometryInfo=color.a>0.4 ? 1.0 : 0.0;gl_FragData[0]=color; \n#ifdef PREPASS_POSITION\ngl_FragData[PREPASS_POSITION_INDEX]=vec4(vPositionW,writeGeometryInfo);\n#endif\n#ifdef PREPASS_VELOCITY\nvec2 a=(vCurrentPosition.xy/vCurrentPosition.w)*0.5+0.5;vec2 b=(vPreviousPosition.xy/vPreviousPosition.w)*0.5+0.5;vec2 velocity=abs(a-b);velocity=vec2(pow(velocity.x,1.0/3.0),pow(velocity.y,1.0/3.0))*sign(a-b)*0.5+0.5;gl_FragData[PREPASS_VELOCITY_INDEX]=vec4(velocity,0.0,writeGeometryInfo);\n#endif\n#ifdef PREPASS_IRRADIANCE\ngl_FragData[PREPASS_IRRADIANCE_INDEX]=vec4(0.0,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_DEPTH\ngl_FragData[PREPASS_DEPTH_INDEX]=vec4(vViewPos.z,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_NORMAL\n#ifdef PREPASS_NORMAL_WORLDSPACE\ngl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalW,writeGeometryInfo); \n#else\ngl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalize((view*vec4(normalW,0.0)).rgb),writeGeometryInfo); \n#endif\n#endif\n#ifdef PREPASS_ALBEDO_SQRT\ngl_FragData[PREPASS_ALBEDO_SQRT_INDEX]=vec4(0.0,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_REFLECTIVITY\n#if defined(SPECULARTERM)\n#if defined(SPECULAR)\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(toLinearSpace(specularMapColor))*writeGeometryInfo; \n#else\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(toLinearSpace(specularColor),1.0)*writeGeometryInfo;\n#endif\n#else\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(0.0,0.0,0.0,1.0)*writeGeometryInfo;\n#endif\n#endif\n#endif\n#if !defined(PREPASS) || defined(WEBGL2)\ngl_FragColor=color;\n#endif\n#include\n#if ORDER_INDEPENDENT_TRANSPARENCY\nif (fragDepth==nearestDepth) {frontColor.rgb+=color.rgb*color.a*alphaMultiplier;frontColor.a=1.0-alphaMultiplier*(1.0-color.a);} else {backColor+=color;}\n#endif\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const defaultPixelShader = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"decalVertexDeclaration\";\nconst shader = `#ifdef DECAL\nuniform vec4 vDecalInfos;uniform mat4 decalMatrix;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const decalVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nimport \"./decalVertexDeclaration\";\n\nconst name = \"defaultVertexDeclaration\";\nconst shader = `uniform mat4 viewProjection;uniform mat4 view;\n#ifdef DIFFUSE\nuniform mat4 diffuseMatrix;uniform vec2 vDiffuseInfos;\n#endif\n#ifdef AMBIENT\nuniform mat4 ambientMatrix;uniform vec2 vAmbientInfos;\n#endif\n#ifdef OPACITY\nuniform mat4 opacityMatrix;uniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;uniform mat4 emissiveMatrix;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;uniform mat4 lightmapMatrix;\n#endif\n#if defined(SPECULAR) && defined(SPECULARTERM)\nuniform vec2 vSpecularInfos;uniform mat4 specularMatrix;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;uniform mat4 bumpMatrix;\n#endif\n#ifdef REFLECTION\nuniform mat4 reflectionMatrix;\n#endif\n#ifdef POINTSIZE\nuniform float pointSize;\n#endif\n#ifdef DETAIL\nuniform vec4 vDetailInfos;uniform mat4 detailMatrix;\n#endif\n#include\n#define ADDITIONAL_VERTEX_DECLARATION\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const defaultVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"uvAttributeDeclaration\";\nconst shader = `#ifdef UV{X}\nattribute vec2 uv{X};\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const uvAttributeDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bonesDeclaration\";\nconst shader = `#if NUM_BONE_INFLUENCERS>0\nattribute vec4 matricesIndices;attribute vec4 matricesWeights;\n#if NUM_BONE_INFLUENCERS>4\nattribute vec4 matricesIndicesExtra;attribute vec4 matricesWeightsExtra;\n#endif\n#ifndef BAKED_VERTEX_ANIMATION_TEXTURE\n#ifdef BONETEXTURE\nuniform highp sampler2D boneSampler;uniform float boneTextureWidth;\n#else\nuniform mat4 mBones[BonesPerMesh];\n#endif\n#ifdef BONES_VELOCITY_ENABLED\nuniform mat4 mPreviousBones[BonesPerMesh];\n#endif\n#ifdef BONETEXTURE\n#define inline\nmat4 readMatrixFromRawSampler(sampler2D smp,float index)\n{float offset=index *4.0;float dx=1.0/boneTextureWidth;vec4 m0=texture2D(smp,vec2(dx*(offset+0.5),0.));vec4 m1=texture2D(smp,vec2(dx*(offset+1.5),0.));vec4 m2=texture2D(smp,vec2(dx*(offset+2.5),0.));vec4 m3=texture2D(smp,vec2(dx*(offset+3.5),0.));return mat4(m0,m1,m2,m3);}\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bonesDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bakedVertexAnimationDeclaration\";\nconst shader = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE\nuniform float bakedVertexAnimationTime;uniform vec2 bakedVertexAnimationTextureSizeInverted;uniform vec4 bakedVertexAnimationSettings;uniform sampler2D bakedVertexAnimationTexture;\n#ifdef INSTANCES\nattribute vec4 bakedVertexAnimationSettingsInstanced;\n#endif\n#define inline\nmat4 readMatrixFromRawSamplerVAT(sampler2D smp,float index,float frame)\n{float offset=index*4.0;float frameUV=(frame+0.5)*bakedVertexAnimationTextureSizeInverted.y;float dx=bakedVertexAnimationTextureSizeInverted.x;vec4 m0=texture2D(smp,vec2(dx*(offset+0.5),frameUV));vec4 m1=texture2D(smp,vec2(dx*(offset+1.5),frameUV));vec4 m2=texture2D(smp,vec2(dx*(offset+2.5),frameUV));vec4 m3=texture2D(smp,vec2(dx*(offset+3.5),frameUV));return mat4(m0,m1,m2,m3);}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bakedVertexAnimationDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"instancesDeclaration\";\nconst shader = `#ifdef INSTANCES\nattribute vec4 world0;attribute vec4 world1;attribute vec4 world2;attribute vec4 world3;\n#ifdef INSTANCESCOLOR\nattribute vec4 instanceColor;\n#endif\n#if defined(THIN_INSTANCES) && !defined(WORLD_UBO)\nuniform mat4 world;\n#endif\n#if defined(VELOCITY) || defined(PREPASS_VELOCITY)\nattribute vec4 previousWorld0;attribute vec4 previousWorld1;attribute vec4 previousWorld2;attribute vec4 previousWorld3;\n#ifdef THIN_INSTANCES\nuniform mat4 previousWorld;\n#endif\n#endif\n#else\n#if !defined(WORLD_UBO)\nuniform mat4 world;\n#endif\n#if defined(VELOCITY) || defined(PREPASS_VELOCITY)\nuniform mat4 previousWorld;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const instancesDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"prePassVertexDeclaration\";\nconst shader = `#ifdef PREPASS\n#ifdef PREPASS_DEPTH\nvarying vec3 vViewPos;\n#endif\n#ifdef PREPASS_VELOCITY\nuniform mat4 previousViewProjection;varying vec4 vCurrentPosition;varying vec4 vPreviousPosition;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const prePassVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"samplerVertexDeclaration\";\nconst shader = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0\nvarying vec2 v_VARYINGNAME_UV;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const samplerVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bumpVertexDeclaration\";\nconst shader = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL) \nvarying mat3 vTBN;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bumpVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"clipPlaneVertexDeclaration\";\nconst shader = `#ifdef CLIPPLANE\nuniform vec4 vClipPlane;varying float fClipDistance;\n#endif\n#ifdef CLIPPLANE2\nuniform vec4 vClipPlane2;varying float fClipDistance2;\n#endif\n#ifdef CLIPPLANE3\nuniform vec4 vClipPlane3;varying float fClipDistance3;\n#endif\n#ifdef CLIPPLANE4\nuniform vec4 vClipPlane4;varying float fClipDistance4;\n#endif\n#ifdef CLIPPLANE5\nuniform vec4 vClipPlane5;varying float fClipDistance5;\n#endif\n#ifdef CLIPPLANE6\nuniform vec4 vClipPlane6;varying float fClipDistance6;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const clipPlaneVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"fogVertexDeclaration\";\nconst shader = `#ifdef FOG\nvarying vec3 vFogDistance;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const fogVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightVxFragmentDeclaration\";\nconst shader = `#ifdef LIGHT{X}\nuniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X};\n#ifdef SPECULARTERM\nuniform vec4 vLightSpecular{X};\n#else\nvec4 vLightSpecular{X}=vec4(0.);\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#elif defined(SHADOWCUBE{X})\n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};uniform mat4 lightMatrix{X};\n#endif\nuniform vec4 shadowsInfo{X};uniform vec2 depthValues{X};\n#endif\n#ifdef SPOTLIGHT{X}\nuniform vec4 vLightDirection{X};uniform vec4 vLightFalloff{X};\n#elif defined(POINTLIGHT{X})\nuniform vec4 vLightFalloff{X};\n#elif defined(HEMILIGHT{X})\nuniform vec3 vLightGround{X};\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const lightVxFragmentDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightVxUboDeclaration\";\nconst shader = `#ifdef LIGHT{X}\nuniform Light{X}\n{vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular;\n#ifdef SPOTLIGHT{X}\nvec4 vLightDirection;vec4 vLightFalloff;\n#elif defined(POINTLIGHT{X})\nvec4 vLightFalloff;\n#elif defined(HEMILIGHT{X})\nvec3 vLightGround;\n#endif\nvec4 shadowsInfo;vec2 depthValues;} light{X};\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#elif defined(SHADOWCUBE{X})\n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};uniform mat4 lightMatrix{X};\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const lightVxUboDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"morphTargetsVertexGlobalDeclaration\";\nconst shader = `#ifdef MORPHTARGETS\nuniform float morphTargetInfluences[NUM_MORPH_INFLUENCERS];\n#ifdef MORPHTARGETS_TEXTURE \nuniform float morphTargetTextureIndices[NUM_MORPH_INFLUENCERS];uniform vec3 morphTargetTextureInfo;uniform highp sampler2DArray morphTargets;vec3 readVector3FromRawSampler(int targetIndex,float vertexIndex)\n{ \nfloat y=floor(vertexIndex/morphTargetTextureInfo.y);float x=vertexIndex-y*morphTargetTextureInfo.y;vec3 textureUV=vec3((x+0.5)/morphTargetTextureInfo.y,(y+0.5)/morphTargetTextureInfo.z,morphTargetTextureIndices[targetIndex]);return texture(morphTargets,textureUV).xyz;}\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const morphTargetsVertexGlobalDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"morphTargetsVertexDeclaration\";\nconst shader = `#ifdef MORPHTARGETS\n#ifndef MORPHTARGETS_TEXTURE\nattribute vec3 position{X};\n#ifdef MORPHTARGETS_NORMAL\nattribute vec3 normal{X};\n#endif\n#ifdef MORPHTARGETS_TANGENT\nattribute vec3 tangent{X};\n#endif\n#ifdef MORPHTARGETS_UV\nattribute vec2 uv_{X};\n#endif\n#elif {X}==0\nuniform int morphTargetCount;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const morphTargetsVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"morphTargetsVertexGlobal\";\nconst shader = `#ifdef MORPHTARGETS\n#ifdef MORPHTARGETS_TEXTURE\nfloat vertexID;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const morphTargetsVertexGlobal = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"morphTargetsVertex\";\nconst shader = `#ifdef MORPHTARGETS\n#ifdef MORPHTARGETS_TEXTURE\n#if {X}==0\nfor (int i=0; i=morphTargetCount) break;vertexID=float(gl_VertexID)*morphTargetTextureInfo.x;positionUpdated+=(readVector3FromRawSampler(i,vertexID)-position)*morphTargetInfluences[i];vertexID+=1.0;\n#ifdef MORPHTARGETS_NORMAL\nnormalUpdated+=(readVector3FromRawSampler(i,vertexID) -normal)*morphTargetInfluences[i];vertexID+=1.0;\n#endif\n#ifdef MORPHTARGETS_UV\nuvUpdated+=(readVector3FromRawSampler(i,vertexID).xy-uv)*morphTargetInfluences[i];vertexID+=1.0;\n#endif\n#ifdef MORPHTARGETS_TANGENT\ntangentUpdated.xyz+=(readVector3FromRawSampler(i,vertexID) -tangent.xyz)*morphTargetInfluences[i];\n#endif\n}\n#endif\n#else\npositionUpdated+=(position{X}-position)*morphTargetInfluences[{X}];\n#ifdef MORPHTARGETS_NORMAL\nnormalUpdated+=(normal{X}-normal)*morphTargetInfluences[{X}];\n#endif\n#ifdef MORPHTARGETS_TANGENT\ntangentUpdated.xyz+=(tangent{X}-tangent.xyz)*morphTargetInfluences[{X}];\n#endif\n#ifdef MORPHTARGETS_UV\nuvUpdated+=(uv_{X}-uv)*morphTargetInfluences[{X}];\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const morphTargetsVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"instancesVertex\";\nconst shader = `#ifdef INSTANCES\nmat4 finalWorld=mat4(world0,world1,world2,world3);\n#if defined(PREPASS_VELOCITY) || defined(VELOCITY)\nmat4 finalPreviousWorld=mat4(previousWorld0,previousWorld1,previousWorld2,previousWorld3);\n#endif\n#ifdef THIN_INSTANCES\nfinalWorld=world*finalWorld;\n#if defined(PREPASS_VELOCITY) || defined(VELOCITY)\nfinalPreviousWorld=previousWorld*finalPreviousWorld;\n#endif\n#endif\n#else\nmat4 finalWorld=world;\n#if defined(PREPASS_VELOCITY) || defined(VELOCITY)\nmat4 finalPreviousWorld=previousWorld;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const instancesVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bonesVertex\";\nconst shader = `#ifndef BAKED_VERTEX_ANIMATION_TEXTURE\n#if NUM_BONE_INFLUENCERS>0\nmat4 influence;\n#ifdef BONETEXTURE\ninfluence=readMatrixFromRawSampler(boneSampler,matricesIndices[0])*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndices[1])*matricesWeights[1];\n#endif\n#if NUM_BONE_INFLUENCERS>2\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndices[2])*matricesWeights[2];\n#endif\n#if NUM_BONE_INFLUENCERS>3\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndices[3])*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[0])*matricesWeightsExtra[0];\n#endif\n#if NUM_BONE_INFLUENCERS>5\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[1])*matricesWeightsExtra[1];\n#endif\n#if NUM_BONE_INFLUENCERS>6\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[2])*matricesWeightsExtra[2];\n#endif\n#if NUM_BONE_INFLUENCERS>7\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[3])*matricesWeightsExtra[3];\n#endif\n#else\ninfluence=mBones[int(matricesIndices[0])]*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\ninfluence+=mBones[int(matricesIndices[1])]*matricesWeights[1];\n#endif\n#if NUM_BONE_INFLUENCERS>2\ninfluence+=mBones[int(matricesIndices[2])]*matricesWeights[2];\n#endif\n#if NUM_BONE_INFLUENCERS>3\ninfluence+=mBones[int(matricesIndices[3])]*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\ninfluence+=mBones[int(matricesIndicesExtra[0])]*matricesWeightsExtra[0];\n#endif\n#if NUM_BONE_INFLUENCERS>5\ninfluence+=mBones[int(matricesIndicesExtra[1])]*matricesWeightsExtra[1];\n#endif\n#if NUM_BONE_INFLUENCERS>6\ninfluence+=mBones[int(matricesIndicesExtra[2])]*matricesWeightsExtra[2];\n#endif\n#if NUM_BONE_INFLUENCERS>7\ninfluence+=mBones[int(matricesIndicesExtra[3])]*matricesWeightsExtra[3];\n#endif\n#endif\nfinalWorld=finalWorld*influence;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bonesVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bakedVertexAnimation\";\nconst shader = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE\n{\n#ifdef INSTANCES\n#define BVASNAME bakedVertexAnimationSettingsInstanced\n#else\n#define BVASNAME bakedVertexAnimationSettings\n#endif\nfloat VATStartFrame=BVASNAME.x;float VATEndFrame=BVASNAME.y;float VATOffsetFrame=BVASNAME.z;float VATSpeed=BVASNAME.w;float totalFrames=VATEndFrame-VATStartFrame+1.0;float time=bakedVertexAnimationTime*VATSpeed/totalFrames;float frameCorrection=time<1.0 ? 0.0 : 1.0;float numOfFrames=totalFrames-frameCorrection;float VATFrameNum=fract(time)*numOfFrames;VATFrameNum=mod(VATFrameNum+VATOffsetFrame,numOfFrames);VATFrameNum=floor(VATFrameNum);VATFrameNum+=VATStartFrame+frameCorrection;mat4 VATInfluence;VATInfluence=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[0],VATFrameNum)*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[1],VATFrameNum)*matricesWeights[1];\n#endif\n#if NUM_BONE_INFLUENCERS>2\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[2],VATFrameNum)*matricesWeights[2];\n#endif\n#if NUM_BONE_INFLUENCERS>3\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[3],VATFrameNum)*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[0],VATFrameNum)*matricesWeightsExtra[0];\n#endif\n#if NUM_BONE_INFLUENCERS>5\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[1],VATFrameNum)*matricesWeightsExtra[1];\n#endif\n#if NUM_BONE_INFLUENCERS>6\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[2],VATFrameNum)*matricesWeightsExtra[2];\n#endif\n#if NUM_BONE_INFLUENCERS>7\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[3],VATFrameNum)*matricesWeightsExtra[3];\n#endif\nfinalWorld=finalWorld*VATInfluence;}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bakedVertexAnimation = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"prePassVertex\";\nconst shader = `#ifdef PREPASS_DEPTH\nvViewPos=(view*worldPos).rgb;\n#endif\n#if defined(PREPASS_VELOCITY) && defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*worldPos;\n#if NUM_BONE_INFLUENCERS>0\nmat4 previousInfluence;previousInfluence=mPreviousBones[int(matricesIndices[0])]*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\npreviousInfluence+=mPreviousBones[int(matricesIndices[1])]*matricesWeights[1];\n#endif \n#if NUM_BONE_INFLUENCERS>2\npreviousInfluence+=mPreviousBones[int(matricesIndices[2])]*matricesWeights[2];\n#endif \n#if NUM_BONE_INFLUENCERS>3\npreviousInfluence+=mPreviousBones[int(matricesIndices[3])]*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[0])]*matricesWeightsExtra[0];\n#endif \n#if NUM_BONE_INFLUENCERS>5\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[1])]*matricesWeightsExtra[1];\n#endif \n#if NUM_BONE_INFLUENCERS>6\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[2])]*matricesWeightsExtra[2];\n#endif \n#if NUM_BONE_INFLUENCERS>7\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[3])]*matricesWeightsExtra[3];\n#endif\nvPreviousPosition=previousViewProjection*finalPreviousWorld*previousInfluence*vec4(positionUpdated,1.0);\n#else\nvPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const prePassVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"uvVariableDeclaration\";\nconst shader = `#if !defined(UV{X}) && defined(MAINUV{X})\nvec2 uv{X}=vec2(0.,0.);\n#endif\n#ifdef MAINUV{X}\nvMainUV{X}=uv{X};\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const uvVariableDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"samplerVertexImplementation\";\nconst shader = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0\nif (v_INFONAME_==0.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uvUpdated,1.0,0.0));}\n#ifdef UV2\nelse if (v_INFONAME_==1.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv2,1.0,0.0));}\n#endif\n#ifdef UV3\nelse if (v_INFONAME_==2.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv3,1.0,0.0));}\n#endif\n#ifdef UV4\nelse if (v_INFONAME_==3.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv4,1.0,0.0));}\n#endif\n#ifdef UV5\nelse if (v_INFONAME_==4.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv5,1.0,0.0));}\n#endif\n#ifdef UV6\nelse if (v_INFONAME_==5.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv6,1.0,0.0));}\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const samplerVertexImplementation = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bumpVertex\";\nconst shader = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL)\nvec3 tbnNormal=normalize(normalUpdated);vec3 tbnTangent=normalize(tangentUpdated.xyz);vec3 tbnBitangent=cross(tbnNormal,tbnTangent)*tangentUpdated.w;vTBN=mat3(finalWorld)*mat3(tbnTangent,tbnBitangent,tbnNormal);\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bumpVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"clipPlaneVertex\";\nconst shader = `#ifdef CLIPPLANE\nfClipDistance=dot(worldPos,vClipPlane);\n#endif\n#ifdef CLIPPLANE2\nfClipDistance2=dot(worldPos,vClipPlane2);\n#endif\n#ifdef CLIPPLANE3\nfClipDistance3=dot(worldPos,vClipPlane3);\n#endif\n#ifdef CLIPPLANE4\nfClipDistance4=dot(worldPos,vClipPlane4);\n#endif\n#ifdef CLIPPLANE5\nfClipDistance5=dot(worldPos,vClipPlane5);\n#endif\n#ifdef CLIPPLANE6\nfClipDistance6=dot(worldPos,vClipPlane6);\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const clipPlaneVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"fogVertex\";\nconst shader = `#ifdef FOG\nvFogDistance=(view*worldPos).xyz;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const fogVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"shadowsVertex\";\nconst shader = `#ifdef SHADOWS\n#if defined(SHADOWCSM{X})\nvPositionFromCamera{X}=view*worldPos;for (int i=0; i\n#define CUSTOM_VERTEX_BEGIN\nattribute vec3 position;\n#ifdef NORMAL\nattribute vec3 normal;\n#endif\n#ifdef TANGENT\nattribute vec4 tangent;\n#endif\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#include[2..7]\n#ifdef VERTEXCOLOR\nattribute vec4 color;\n#endif\n#include\n#include\n#include\n#include\n#include\n#include[1..7]\n#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap)\n#if defined(SPECULARTERM)\n#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular)\n#endif\n#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal)\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#include\n#include\n#include\n#include<__decl__lightVxFragment>[0..maxSimultaneousLights]\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#include\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvec3 positionUpdated=position;\n#ifdef NORMAL\nvec3 normalUpdated=normal;\n#endif\n#ifdef TANGENT\nvec4 tangentUpdated=tangent;\n#endif\n#ifdef UV1\nvec2 uvUpdated=uv;\n#endif\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvPositionUVW=positionUpdated;\n#endif\n#define CUSTOM_VERTEX_UPDATE_POSITION\n#define CUSTOM_VERTEX_UPDATE_NORMAL\n#include\n#if defined(PREPASS) && defined(PREPASS_VELOCITY) && !defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*finalWorld*vec4(positionUpdated,1.0);vPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\n#endif\n#include\n#include\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\n#ifdef NORMAL\nmat3 normalWorld=mat3(finalWorld);\n#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvNormalW=normalUpdated/vec3(dot(normalWorld[0],normalWorld[0]),dot(normalWorld[1],normalWorld[1]),dot(normalWorld[2],normalWorld[2]));vNormalW=normalize(normalWorld*vNormalW);\n#else\n#ifdef NONUNIFORMSCALING\nnormalWorld=transposeMat3(inverseMat3(normalWorld));\n#endif\nvNormalW=normalize(normalWorld*normalUpdated);\n#endif\n#endif\n#define CUSTOM_VERTEX_UPDATE_WORLDPOS\n#ifdef MULTIVIEW\nif (gl_ViewID_OVR==0u) {gl_Position=viewProjection*worldPos;} else {gl_Position=viewProjectionR*worldPos;}\n#else\ngl_Position=viewProjection*worldPos;\n#endif\nvPositionW=vec3(worldPos);\n#include\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0)));\n#endif\n#ifndef UV1\nvec2 uvUpdated=vec2(0.,0.);\n#endif\n#ifdef MAINUV1\nvMainUV1=uvUpdated;\n#endif\n#include[2..7]\n#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse,_MATRIXNAME_,diffuse,_INFONAME_,DiffuseInfos.x)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_MATRIXNAME_,emissive,_INFONAME_,EmissiveInfos.x)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_MATRIXNAME_,lightmap,_INFONAME_,LightmapInfos.x)\n#if defined(SPECULARTERM)\n#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular,_MATRIXNAME_,specular,_INFONAME_,SpecularInfos.x)\n#endif\n#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_MATRIXNAME_,bump,_INFONAME_,BumpInfos.x)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_MATRIXNAME_,decal,_INFONAME_,DecalInfos.x)\n#include\n#include\n#include\n#include[0..maxSimultaneousLights]\n#include\n#include\n#include\n#define CUSTOM_VERTEX_MAIN_END\n}\n`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const defaultVertexShader = { name, shader };\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { serialize, serializeAsColor3, expandToProperty, serializeAsFresnelParameters, serializeAsTexture } from \"../Misc/decorators\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\n\r\nimport type { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { Matrix } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { PrePassConfiguration } from \"./prePassConfiguration\";\r\n\r\nimport type { IImageProcessingConfigurationDefines } from \"./imageProcessingConfiguration.defines\";\r\nimport { ImageProcessingConfiguration } from \"./imageProcessingConfiguration\";\r\nimport type { ColorCurves } from \"./colorCurves\";\r\nimport type { FresnelParameters } from \"./fresnelParameters\";\r\nimport type { ICustomShaderNameResolveOptions } from \"../Materials/material\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { MaterialPluginEvent } from \"./materialPluginEvent\";\r\nimport { MaterialDefines } from \"../Materials/materialDefines\";\r\nimport { PushMaterial } from \"./pushMaterial\";\r\n\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport type { CubeTexture } from \"../Materials/Textures/cubeTexture\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport { MaterialFlags } from \"./materialFlags\";\r\n\r\nimport \"../Shaders/default.fragment\";\r\nimport \"../Shaders/default.vertex\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { EffectFallbacks } from \"./effectFallbacks\";\r\nimport type { Effect, IEffectCreationOptions } from \"./effect\";\r\nimport { DetailMapConfiguration } from \"./material.detailMapConfiguration\";\r\nimport { addClipPlaneUniforms, bindClipPlane } from \"./clipPlaneMaterialHelper\";\r\nimport {\r\n BindBonesParameters,\r\n BindFogParameters,\r\n BindLights,\r\n BindLogDepth,\r\n BindMorphTargetParameters,\r\n BindTextureMatrix,\r\n HandleFallbacksForShadows,\r\n PrepareAttributesForBakedVertexAnimation,\r\n PrepareAttributesForBones,\r\n PrepareAttributesForInstances,\r\n PrepareAttributesForMorphTargets,\r\n PrepareDefinesForAttributes,\r\n PrepareDefinesForFrameBoundValues,\r\n PrepareDefinesForLights,\r\n PrepareDefinesForMergedUV,\r\n PrepareDefinesForMisc,\r\n PrepareDefinesForMultiview,\r\n PrepareDefinesForOIT,\r\n PrepareDefinesForPrePass,\r\n PrepareUniformsAndSamplersList,\r\n} from \"./materialHelper.functions\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\n\r\nconst onCreatedEffectParameters = { effect: null as unknown as Effect, subMesh: null as unknown as Nullable };\r\n\r\n/** @internal */\r\nexport class StandardMaterialDefines extends MaterialDefines implements IImageProcessingConfigurationDefines {\r\n public MAINUV1 = false;\r\n public MAINUV2 = false;\r\n public MAINUV3 = false;\r\n public MAINUV4 = false;\r\n public MAINUV5 = false;\r\n public MAINUV6 = false;\r\n public DIFFUSE = false;\r\n public DIFFUSEDIRECTUV = 0;\r\n public BAKED_VERTEX_ANIMATION_TEXTURE = false;\r\n public AMBIENT = false;\r\n public AMBIENTDIRECTUV = 0;\r\n public OPACITY = false;\r\n public OPACITYDIRECTUV = 0;\r\n public OPACITYRGB = false;\r\n public REFLECTION = false;\r\n public EMISSIVE = false;\r\n public EMISSIVEDIRECTUV = 0;\r\n public SPECULAR = false;\r\n public SPECULARDIRECTUV = 0;\r\n public BUMP = false;\r\n public BUMPDIRECTUV = 0;\r\n public PARALLAX = false;\r\n public PARALLAX_RHS = false;\r\n public PARALLAXOCCLUSION = false;\r\n public SPECULAROVERALPHA = false;\r\n public CLIPPLANE = false;\r\n public CLIPPLANE2 = false;\r\n public CLIPPLANE3 = false;\r\n public CLIPPLANE4 = false;\r\n public CLIPPLANE5 = false;\r\n public CLIPPLANE6 = false;\r\n public ALPHATEST = false;\r\n public DEPTHPREPASS = false;\r\n public ALPHAFROMDIFFUSE = false;\r\n public POINTSIZE = false;\r\n public FOG = false;\r\n public SPECULARTERM = false;\r\n public DIFFUSEFRESNEL = false;\r\n public OPACITYFRESNEL = false;\r\n public REFLECTIONFRESNEL = false;\r\n public REFRACTIONFRESNEL = false;\r\n public EMISSIVEFRESNEL = false;\r\n public FRESNEL = false;\r\n public NORMAL = false;\r\n public TANGENT = false;\r\n public UV1 = false;\r\n public UV2 = false;\r\n public UV3 = false;\r\n public UV4 = false;\r\n public UV5 = false;\r\n public UV6 = false;\r\n public VERTEXCOLOR = false;\r\n public VERTEXALPHA = false;\r\n public NUM_BONE_INFLUENCERS = 0;\r\n public BonesPerMesh = 0;\r\n public BONETEXTURE = false;\r\n public BONES_VELOCITY_ENABLED = false;\r\n public INSTANCES = false;\r\n public THIN_INSTANCES = false;\r\n public INSTANCESCOLOR = false;\r\n public GLOSSINESS = false;\r\n public ROUGHNESS = false;\r\n public EMISSIVEASILLUMINATION = false;\r\n public LINKEMISSIVEWITHDIFFUSE = false;\r\n public REFLECTIONFRESNELFROMSPECULAR = false;\r\n public LIGHTMAP = false;\r\n public LIGHTMAPDIRECTUV = 0;\r\n public OBJECTSPACE_NORMALMAP = false;\r\n public USELIGHTMAPASSHADOWMAP = false;\r\n public REFLECTIONMAP_3D = false;\r\n public REFLECTIONMAP_SPHERICAL = false;\r\n public REFLECTIONMAP_PLANAR = false;\r\n public REFLECTIONMAP_CUBIC = false;\r\n public USE_LOCAL_REFLECTIONMAP_CUBIC = false;\r\n public USE_LOCAL_REFRACTIONMAP_CUBIC = false;\r\n public REFLECTIONMAP_PROJECTION = false;\r\n public REFLECTIONMAP_SKYBOX = false;\r\n public REFLECTIONMAP_EXPLICIT = false;\r\n public REFLECTIONMAP_EQUIRECTANGULAR = false;\r\n public REFLECTIONMAP_EQUIRECTANGULAR_FIXED = false;\r\n public REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = false;\r\n public REFLECTIONMAP_OPPOSITEZ = false;\r\n public INVERTCUBICMAP = false;\r\n public LOGARITHMICDEPTH = false;\r\n public REFRACTION = false;\r\n public REFRACTIONMAP_3D = false;\r\n public REFLECTIONOVERALPHA = false;\r\n public TWOSIDEDLIGHTING = false;\r\n public SHADOWFLOAT = false;\r\n public MORPHTARGETS = false;\r\n public MORPHTARGETS_NORMAL = false;\r\n public MORPHTARGETS_TANGENT = false;\r\n public MORPHTARGETS_UV = false;\r\n public NUM_MORPH_INFLUENCERS = 0;\r\n public MORPHTARGETS_TEXTURE = false;\r\n public NONUNIFORMSCALING = false; // https://playground.babylonjs.com#V6DWIH\r\n public PREMULTIPLYALPHA = false; // https://playground.babylonjs.com#LNVJJ7\r\n public ALPHATEST_AFTERALLALPHACOMPUTATIONS = false;\r\n public ALPHABLEND = true;\r\n\r\n public PREPASS = false;\r\n public PREPASS_IRRADIANCE = false;\r\n public PREPASS_IRRADIANCE_INDEX = -1;\r\n public PREPASS_ALBEDO_SQRT = false;\r\n public PREPASS_ALBEDO_SQRT_INDEX = -1;\r\n public PREPASS_DEPTH = false;\r\n public PREPASS_DEPTH_INDEX = -1;\r\n public PREPASS_NORMAL = false;\r\n public PREPASS_NORMAL_INDEX = -1;\r\n public PREPASS_NORMAL_WORLDSPACE = false;\r\n public PREPASS_POSITION = false;\r\n public PREPASS_POSITION_INDEX = -1;\r\n public PREPASS_VELOCITY = false;\r\n public PREPASS_VELOCITY_INDEX = -1;\r\n public PREPASS_REFLECTIVITY = false;\r\n public PREPASS_REFLECTIVITY_INDEX = -1;\r\n public SCENE_MRT_COUNT = 0;\r\n\r\n public RGBDLIGHTMAP = false;\r\n public RGBDREFLECTION = false;\r\n public RGBDREFRACTION = false;\r\n\r\n public IMAGEPROCESSING = false;\r\n public VIGNETTE = false;\r\n public VIGNETTEBLENDMODEMULTIPLY = false;\r\n public VIGNETTEBLENDMODEOPAQUE = false;\r\n public TONEMAPPING = false;\r\n public TONEMAPPING_ACES = false;\r\n public CONTRAST = false;\r\n public COLORCURVES = false;\r\n public COLORGRADING = false;\r\n public COLORGRADING3D = false;\r\n public SAMPLER3DGREENDEPTH = false;\r\n public SAMPLER3DBGRMAP = false;\r\n public DITHER = false;\r\n public IMAGEPROCESSINGPOSTPROCESS = false;\r\n public SKIPFINALCOLORCLAMP = false;\r\n public MULTIVIEW = false;\r\n public ORDER_INDEPENDENT_TRANSPARENCY = false;\r\n public ORDER_INDEPENDENT_TRANSPARENCY_16BITS = false;\r\n public CAMERA_ORTHOGRAPHIC = false;\r\n public CAMERA_PERSPECTIVE = false;\r\n\r\n /**\r\n * If the reflection texture on this material is in linear color space\r\n * @internal\r\n */\r\n public IS_REFLECTION_LINEAR = false;\r\n /**\r\n * If the refraction texture on this material is in linear color space\r\n * @internal\r\n */\r\n public IS_REFRACTION_LINEAR = false;\r\n public EXPOSURE = false;\r\n\r\n public DECAL_AFTER_DETAIL = false;\r\n\r\n /**\r\n * Initializes the Standard Material defines.\r\n * @param externalProperties The external properties\r\n */\r\n constructor(externalProperties?: { [name: string]: { type: string; default: any } }) {\r\n super(externalProperties);\r\n this.rebuild();\r\n }\r\n\r\n public setReflectionMode(modeToEnable: string) {\r\n const modes = [\r\n \"REFLECTIONMAP_CUBIC\",\r\n \"REFLECTIONMAP_EXPLICIT\",\r\n \"REFLECTIONMAP_PLANAR\",\r\n \"REFLECTIONMAP_PROJECTION\",\r\n \"REFLECTIONMAP_PROJECTION\",\r\n \"REFLECTIONMAP_SKYBOX\",\r\n \"REFLECTIONMAP_SPHERICAL\",\r\n \"REFLECTIONMAP_EQUIRECTANGULAR\",\r\n \"REFLECTIONMAP_EQUIRECTANGULAR_FIXED\",\r\n \"REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED\",\r\n ];\r\n\r\n for (const mode of modes) {\r\n (this)[mode] = mode === modeToEnable;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This is the default material used in Babylon. It is the best trade off between quality\r\n * and performances.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction\r\n */\r\nexport class StandardMaterial extends PushMaterial {\r\n @serializeAsTexture(\"diffuseTexture\")\r\n private _diffuseTexture: Nullable = null;\r\n /**\r\n * The basic texture of the material as viewed under a light.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public diffuseTexture: Nullable;\r\n\r\n @serializeAsTexture(\"ambientTexture\")\r\n private _ambientTexture: Nullable = null;\r\n /**\r\n * AKA Occlusion Texture in other nomenclature, it helps adding baked shadows into your material.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public ambientTexture: Nullable;\r\n\r\n @serializeAsTexture(\"opacityTexture\")\r\n private _opacityTexture: Nullable = null;\r\n /**\r\n * Define the transparency of the material from a texture.\r\n * The final alpha value can be read either from the red channel (if texture.getAlphaFromRGB is false)\r\n * or from the luminance or the current texel (if texture.getAlphaFromRGB is true)\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public opacityTexture: Nullable;\r\n\r\n @serializeAsTexture(\"reflectionTexture\")\r\n private _reflectionTexture: Nullable = null;\r\n /**\r\n * Define the texture used to display the reflection.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#how-to-obtain-reflections-and-refractions\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public reflectionTexture: Nullable;\r\n\r\n @serializeAsTexture(\"emissiveTexture\")\r\n private _emissiveTexture: Nullable = null;\r\n /**\r\n * Define texture of the material as if self lit.\r\n * This will be mixed in the final result even in the absence of light.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public emissiveTexture: Nullable;\r\n\r\n @serializeAsTexture(\"specularTexture\")\r\n private _specularTexture: Nullable = null;\r\n /**\r\n * Define how the color and intensity of the highlight given by the light in the material.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public specularTexture: Nullable;\r\n\r\n @serializeAsTexture(\"bumpTexture\")\r\n private _bumpTexture: Nullable = null;\r\n /**\r\n * Bump mapping is a technique to simulate bump and dents on a rendered surface.\r\n * These are made by creating a normal map from an image. The means to do this can be found on the web, a search for 'normal map generator' will bring up free and paid for methods of doing this.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#bump-map\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public bumpTexture: Nullable;\r\n\r\n @serializeAsTexture(\"lightmapTexture\")\r\n private _lightmapTexture: Nullable = null;\r\n /**\r\n * Complex lighting can be computationally expensive to compute at runtime.\r\n * To save on computation, lightmaps may be used to store calculated lighting in a texture which will be applied to a given mesh.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction#lightmaps\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public lightmapTexture: Nullable;\r\n\r\n @serializeAsTexture(\"refractionTexture\")\r\n private _refractionTexture: Nullable = null;\r\n /**\r\n * Define the texture used to display the refraction.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#how-to-obtain-reflections-and-refractions\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public refractionTexture: Nullable;\r\n\r\n /**\r\n * The color of the material lit by the environmental background lighting.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#ambient-color-example\r\n */\r\n @serializeAsColor3(\"ambient\")\r\n public ambientColor = new Color3(0, 0, 0);\r\n\r\n /**\r\n * The basic color of the material as viewed under a light.\r\n */\r\n @serializeAsColor3(\"diffuse\")\r\n public diffuseColor = new Color3(1, 1, 1);\r\n\r\n /**\r\n * Define how the color and intensity of the highlight given by the light in the material.\r\n */\r\n @serializeAsColor3(\"specular\")\r\n public specularColor = new Color3(1, 1, 1);\r\n\r\n /**\r\n * Define the color of the material as if self lit.\r\n * This will be mixed in the final result even in the absence of light.\r\n */\r\n @serializeAsColor3(\"emissive\")\r\n public emissiveColor = new Color3(0, 0, 0);\r\n\r\n /**\r\n * Defines how sharp are the highlights in the material.\r\n * The bigger the value the sharper giving a more glossy feeling to the result.\r\n * Reversely, the smaller the value the blurrier giving a more rough feeling to the result.\r\n */\r\n @serialize()\r\n public specularPower = 64;\r\n\r\n @serialize(\"useAlphaFromDiffuseTexture\")\r\n private _useAlphaFromDiffuseTexture = false;\r\n /**\r\n * Does the transparency come from the diffuse texture alpha channel.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public useAlphaFromDiffuseTexture: boolean;\r\n\r\n @serialize(\"useEmissiveAsIllumination\")\r\n private _useEmissiveAsIllumination = false;\r\n /**\r\n * If true, the emissive value is added into the end result, otherwise it is multiplied in.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useEmissiveAsIllumination: boolean;\r\n\r\n @serialize(\"linkEmissiveWithDiffuse\")\r\n private _linkEmissiveWithDiffuse = false;\r\n /**\r\n * If true, some kind of energy conservation will prevent the end result to be more than 1 by reducing\r\n * the emissive level when the final color is close to one.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public linkEmissiveWithDiffuse: boolean;\r\n\r\n @serialize(\"useSpecularOverAlpha\")\r\n private _useSpecularOverAlpha = false;\r\n /**\r\n * Specifies that the material will keep the specular highlights over a transparent surface (only the most luminous ones).\r\n * A car glass is a good exemple of that. When sun reflects on it you can not see what is behind.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useSpecularOverAlpha: boolean;\r\n\r\n @serialize(\"useReflectionOverAlpha\")\r\n private _useReflectionOverAlpha = false;\r\n /**\r\n * Specifies that the material will keeps the reflection highlights over a transparent surface (only the most luminous ones).\r\n * A car glass is a good exemple of that. When the street lights reflects on it you can not see what is behind.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useReflectionOverAlpha: boolean;\r\n\r\n @serialize(\"disableLighting\")\r\n private _disableLighting = false;\r\n /**\r\n * Does lights from the scene impacts this material.\r\n * It can be a nice trick for performance to disable lighting on a fully emissive material.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsLightsDirty\")\r\n public disableLighting: boolean;\r\n\r\n @serialize(\"useObjectSpaceNormalMap\")\r\n private _useObjectSpaceNormalMap = false;\r\n /**\r\n * Allows using an object space normal map (instead of tangent space).\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useObjectSpaceNormalMap: boolean;\r\n\r\n @serialize(\"useParallax\")\r\n private _useParallax = false;\r\n /**\r\n * Is parallax enabled or not.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/parallaxMapping\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useParallax: boolean;\r\n\r\n @serialize(\"useParallaxOcclusion\")\r\n private _useParallaxOcclusion = false;\r\n /**\r\n * Is parallax occlusion enabled or not.\r\n * If true, the outcome is way more realistic than traditional Parallax but you can expect a performance hit that worthes consideration.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/parallaxMapping\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useParallaxOcclusion: boolean;\r\n\r\n /**\r\n * Apply a scaling factor that determine which \"depth\" the height map should reprensent. A value between 0.05 and 0.1 is reasonnable in Parallax, you can reach 0.2 using Parallax Occlusion.\r\n */\r\n @serialize()\r\n public parallaxScaleBias = 0.05;\r\n\r\n @serialize(\"roughness\")\r\n private _roughness = 0;\r\n /**\r\n * Helps to define how blurry the reflections should appears in the material.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public roughness: number;\r\n\r\n /**\r\n * In case of refraction, define the value of the index of refraction.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#how-to-obtain-reflections-and-refractions\r\n */\r\n @serialize()\r\n public indexOfRefraction = 0.98;\r\n\r\n /**\r\n * Invert the refraction texture alongside the y axis.\r\n * It can be useful with procedural textures or probe for instance.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#how-to-obtain-reflections-and-refractions\r\n */\r\n @serialize()\r\n public invertRefractionY = true;\r\n\r\n /**\r\n * Defines the alpha limits in alpha test mode.\r\n */\r\n @serialize()\r\n public alphaCutOff = 0.4;\r\n\r\n @serialize(\"useLightmapAsShadowmap\")\r\n private _useLightmapAsShadowmap = false;\r\n /**\r\n * In case of light mapping, define whether the map contains light or shadow informations.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useLightmapAsShadowmap: boolean;\r\n\r\n // Fresnel\r\n @serializeAsFresnelParameters(\"diffuseFresnelParameters\")\r\n private _diffuseFresnelParameters: FresnelParameters;\r\n /**\r\n * Define the diffuse fresnel parameters of the material.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsFresnelDirty\")\r\n public diffuseFresnelParameters: FresnelParameters;\r\n\r\n @serializeAsFresnelParameters(\"opacityFresnelParameters\")\r\n private _opacityFresnelParameters: FresnelParameters;\r\n /**\r\n * Define the opacity fresnel parameters of the material.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsFresnelAndMiscDirty\")\r\n public opacityFresnelParameters: FresnelParameters;\r\n\r\n @serializeAsFresnelParameters(\"reflectionFresnelParameters\")\r\n private _reflectionFresnelParameters: FresnelParameters;\r\n /**\r\n * Define the reflection fresnel parameters of the material.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsFresnelDirty\")\r\n public reflectionFresnelParameters: FresnelParameters;\r\n\r\n @serializeAsFresnelParameters(\"refractionFresnelParameters\")\r\n private _refractionFresnelParameters: FresnelParameters;\r\n /**\r\n * Define the refraction fresnel parameters of the material.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsFresnelDirty\")\r\n public refractionFresnelParameters: FresnelParameters;\r\n\r\n @serializeAsFresnelParameters(\"emissiveFresnelParameters\")\r\n private _emissiveFresnelParameters: FresnelParameters;\r\n /**\r\n * Define the emissive fresnel parameters of the material.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsFresnelDirty\")\r\n public emissiveFresnelParameters: FresnelParameters;\r\n\r\n @serialize(\"useReflectionFresnelFromSpecular\")\r\n private _useReflectionFresnelFromSpecular = false;\r\n /**\r\n * If true automatically deducts the fresnels values from the material specularity.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsFresnelDirty\")\r\n public useReflectionFresnelFromSpecular: boolean;\r\n\r\n @serialize(\"useGlossinessFromSpecularMapAlpha\")\r\n private _useGlossinessFromSpecularMapAlpha = false;\r\n /**\r\n * Defines if the glossiness/roughness of the material should be read from the specular map alpha channel\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useGlossinessFromSpecularMapAlpha: boolean;\r\n\r\n @serialize(\"maxSimultaneousLights\")\r\n private _maxSimultaneousLights = 4;\r\n /**\r\n * Defines the maximum number of lights that can be used in the material\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsLightsDirty\")\r\n public maxSimultaneousLights: number;\r\n\r\n @serialize(\"invertNormalMapX\")\r\n private _invertNormalMapX = false;\r\n /**\r\n * If sets to true, x component of normal map value will invert (x = 1.0 - x).\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public invertNormalMapX: boolean;\r\n\r\n @serialize(\"invertNormalMapY\")\r\n private _invertNormalMapY = false;\r\n /**\r\n * If sets to true, y component of normal map value will invert (y = 1.0 - y).\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public invertNormalMapY: boolean;\r\n\r\n @serialize(\"twoSidedLighting\")\r\n private _twoSidedLighting = false;\r\n /**\r\n * If sets to true and backfaceCulling is false, normals will be flipped on the backside.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public twoSidedLighting: boolean;\r\n\r\n @serialize(\"applyDecalMapAfterDetailMap\")\r\n private _applyDecalMapAfterDetailMap = false;\r\n /**\r\n * If sets to true, the decal map will be applied after the detail map. Else, it is applied before (default: false)\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsMiscDirty\")\r\n public applyDecalMapAfterDetailMap: boolean;\r\n\r\n /**\r\n * Default configuration related to image processing available in the standard Material.\r\n */\r\n protected _imageProcessingConfiguration: ImageProcessingConfiguration;\r\n\r\n /**\r\n * Gets the image processing configuration used either in this material.\r\n */\r\n public get imageProcessingConfiguration(): ImageProcessingConfiguration {\r\n return this._imageProcessingConfiguration;\r\n }\r\n\r\n /**\r\n * Sets the Default image processing configuration used either in the this material.\r\n *\r\n * If sets to null, the scene one is in use.\r\n */\r\n public set imageProcessingConfiguration(value: ImageProcessingConfiguration) {\r\n this._attachImageProcessingConfiguration(value);\r\n\r\n // Ensure the effect will be rebuilt.\r\n this._markAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n /**\r\n * Keep track of the image processing observer to allow dispose and replace.\r\n */\r\n private _imageProcessingObserver: Nullable>;\r\n\r\n /**\r\n * Attaches a new image processing configuration to the Standard Material.\r\n * @param configuration\r\n */\r\n protected _attachImageProcessingConfiguration(configuration: Nullable): void {\r\n if (configuration === this._imageProcessingConfiguration) {\r\n return;\r\n }\r\n\r\n // Detaches observer\r\n if (this._imageProcessingConfiguration && this._imageProcessingObserver) {\r\n this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver);\r\n }\r\n\r\n // Pick the scene configuration if needed\r\n if (!configuration) {\r\n this._imageProcessingConfiguration = this.getScene().imageProcessingConfiguration;\r\n } else {\r\n this._imageProcessingConfiguration = configuration;\r\n }\r\n\r\n // Attaches observer\r\n if (this._imageProcessingConfiguration) {\r\n this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add(() => {\r\n this._markAllSubMeshesAsImageProcessingDirty();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Defines additional PrePass parameters for the material.\r\n */\r\n public readonly prePassConfiguration: PrePassConfiguration;\r\n\r\n /**\r\n * Can this material render to prepass\r\n */\r\n public get isPrePassCapable(): boolean {\r\n return !this.disableDepthWrite;\r\n }\r\n\r\n /**\r\n * Gets whether the color curves effect is enabled.\r\n */\r\n public get cameraColorCurvesEnabled(): boolean {\r\n return this.imageProcessingConfiguration.colorCurvesEnabled;\r\n }\r\n /**\r\n * Sets whether the color curves effect is enabled.\r\n */\r\n public set cameraColorCurvesEnabled(value: boolean) {\r\n this.imageProcessingConfiguration.colorCurvesEnabled = value;\r\n }\r\n\r\n /**\r\n * Gets whether the color grading effect is enabled.\r\n */\r\n public get cameraColorGradingEnabled(): boolean {\r\n return this.imageProcessingConfiguration.colorGradingEnabled;\r\n }\r\n /**\r\n * Gets whether the color grading effect is enabled.\r\n */\r\n public set cameraColorGradingEnabled(value: boolean) {\r\n this.imageProcessingConfiguration.colorGradingEnabled = value;\r\n }\r\n\r\n /**\r\n * Gets whether tonemapping is enabled or not.\r\n */\r\n public get cameraToneMappingEnabled(): boolean {\r\n return this._imageProcessingConfiguration.toneMappingEnabled;\r\n }\r\n /**\r\n * Sets whether tonemapping is enabled or not\r\n */\r\n public set cameraToneMappingEnabled(value: boolean) {\r\n this._imageProcessingConfiguration.toneMappingEnabled = value;\r\n }\r\n\r\n /**\r\n * The camera exposure used on this material.\r\n * This property is here and not in the camera to allow controlling exposure without full screen post process.\r\n * This corresponds to a photographic exposure.\r\n */\r\n public get cameraExposure(): number {\r\n return this._imageProcessingConfiguration.exposure;\r\n }\r\n /**\r\n * The camera exposure used on this material.\r\n * This property is here and not in the camera to allow controlling exposure without full screen post process.\r\n * This corresponds to a photographic exposure.\r\n */\r\n public set cameraExposure(value: number) {\r\n this._imageProcessingConfiguration.exposure = value;\r\n }\r\n\r\n /**\r\n * Gets The camera contrast used on this material.\r\n */\r\n public get cameraContrast(): number {\r\n return this._imageProcessingConfiguration.contrast;\r\n }\r\n\r\n /**\r\n * Sets The camera contrast used on this material.\r\n */\r\n public set cameraContrast(value: number) {\r\n this._imageProcessingConfiguration.contrast = value;\r\n }\r\n\r\n /**\r\n * Gets the Color Grading 2D Lookup Texture.\r\n */\r\n public get cameraColorGradingTexture(): Nullable {\r\n return this._imageProcessingConfiguration.colorGradingTexture;\r\n }\r\n /**\r\n * Sets the Color Grading 2D Lookup Texture.\r\n */\r\n public set cameraColorGradingTexture(value: Nullable) {\r\n this._imageProcessingConfiguration.colorGradingTexture = value;\r\n }\r\n\r\n /**\r\n * The color grading curves provide additional color adjustmnent that is applied after any color grading transform (3D LUT).\r\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\r\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\r\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\r\n */\r\n public get cameraColorCurves(): Nullable {\r\n return this._imageProcessingConfiguration.colorCurves;\r\n }\r\n /**\r\n * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT).\r\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\r\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\r\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\r\n */\r\n public set cameraColorCurves(value: Nullable) {\r\n this._imageProcessingConfiguration.colorCurves = value;\r\n }\r\n\r\n /**\r\n * Can this material render to several textures at once\r\n */\r\n public get canRenderToMRT() {\r\n return true;\r\n }\r\n\r\n /**\r\n * Defines the detail map parameters for the material.\r\n */\r\n public readonly detailMap: DetailMapConfiguration;\r\n\r\n protected _renderTargets = new SmartArray(16);\r\n protected _worldViewProjectionMatrix = Matrix.Zero();\r\n protected _globalAmbientColor = new Color3(0, 0, 0);\r\n protected _cacheHasRenderTargetTextures = false;\r\n\r\n /**\r\n * Instantiates a new standard material.\r\n * This is the default material used in Babylon. It is the best trade off between quality\r\n * and performances.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction\r\n * @param name Define the name of the material in the scene\r\n * @param scene Define the scene the material belong to\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n\r\n this.detailMap = new DetailMapConfiguration(this);\r\n\r\n // Setup the default processing configuration to the scene.\r\n this._attachImageProcessingConfiguration(null);\r\n this.prePassConfiguration = new PrePassConfiguration();\r\n\r\n this.getRenderTargetTextures = (): SmartArray => {\r\n this._renderTargets.reset();\r\n\r\n if (StandardMaterial.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget) {\r\n this._renderTargets.push(this._reflectionTexture);\r\n }\r\n\r\n if (StandardMaterial.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget) {\r\n this._renderTargets.push(this._refractionTexture);\r\n }\r\n\r\n this._eventInfo.renderTargets = this._renderTargets;\r\n this._callbackPluginEventFillRenderTargetTextures(this._eventInfo);\r\n\r\n return this._renderTargets;\r\n };\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public get hasRenderTargetTextures(): boolean {\r\n if (StandardMaterial.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget) {\r\n return true;\r\n }\r\n\r\n if (StandardMaterial.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget) {\r\n return true;\r\n }\r\n\r\n return this._cacheHasRenderTargetTextures;\r\n }\r\n\r\n /**\r\n * Gets the current class name of the material e.g. \"StandardMaterial\"\r\n * Mainly use in serialization.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"StandardMaterial\";\r\n }\r\n\r\n /**\r\n * Specifies if the material will require alpha blending\r\n * @returns a boolean specifying if alpha blending is needed\r\n */\r\n public needAlphaBlending(): boolean {\r\n if (this._disableAlphaBlending) {\r\n return false;\r\n }\r\n\r\n return (\r\n this.alpha < 1.0 ||\r\n this._opacityTexture != null ||\r\n this._shouldUseAlphaFromDiffuseTexture() ||\r\n (this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled)\r\n );\r\n }\r\n\r\n /**\r\n * Specifies if this material should be rendered in alpha test mode\r\n * @returns a boolean specifying if an alpha test is needed.\r\n */\r\n public needAlphaTesting(): boolean {\r\n if (this._forceAlphaTest) {\r\n return true;\r\n }\r\n\r\n return this._hasAlphaChannel() && (this._transparencyMode == null || this._transparencyMode === Material.MATERIAL_ALPHATEST);\r\n }\r\n\r\n /**\r\n * @returns whether or not the alpha value of the diffuse texture should be used for alpha blending.\r\n */\r\n protected _shouldUseAlphaFromDiffuseTexture(): boolean {\r\n return this._diffuseTexture != null && this._diffuseTexture.hasAlpha && this._useAlphaFromDiffuseTexture && this._transparencyMode !== Material.MATERIAL_OPAQUE;\r\n }\r\n\r\n /**\r\n * @returns whether or not there is a usable alpha channel for transparency.\r\n */\r\n protected _hasAlphaChannel(): boolean {\r\n return (this._diffuseTexture != null && this._diffuseTexture.hasAlpha) || this._opacityTexture != null;\r\n }\r\n\r\n /**\r\n * Get the texture used for alpha test purpose.\r\n * @returns the diffuse texture in case of the standard material.\r\n */\r\n public getAlphaTestTexture(): Nullable {\r\n return this._diffuseTexture;\r\n }\r\n\r\n /**\r\n * Get if the submesh is ready to be used and all its information available.\r\n * Child classes can use it to update shaders\r\n * @param mesh defines the mesh to check\r\n * @param subMesh defines which submesh to check\r\n * @param useInstances specifies that instances should be used\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances: boolean = false): boolean {\r\n if (!this._uniformBufferLayoutBuilt) {\r\n this.buildUniformLayout();\r\n }\r\n\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (drawWrapper.effect && this.isFrozen) {\r\n if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetDefineNames, this._eventInfo);\r\n subMesh.materialDefines = new StandardMaterialDefines(this._eventInfo.defineNames);\r\n }\r\n\r\n const scene = this.getScene();\r\n const defines = subMesh.materialDefines;\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Lights\r\n defines._needNormals = PrepareDefinesForLights(scene, mesh, defines, true, this._maxSimultaneousLights, this._disableLighting);\r\n\r\n // Multiview\r\n PrepareDefinesForMultiview(scene, defines);\r\n\r\n // PrePass\r\n const oit = this.needAlphaBlendingForMesh(mesh) && this.getScene().useOrderIndependentTransparency;\r\n PrepareDefinesForPrePass(scene, defines, this.canRenderToMRT && !oit);\r\n\r\n // Order independant transparency\r\n PrepareDefinesForOIT(scene, defines, oit);\r\n\r\n // Textures\r\n if (defines._areTexturesDirty) {\r\n this._eventInfo.hasRenderTargetTextures = false;\r\n this._callbackPluginEventHasRenderTargetTextures(this._eventInfo);\r\n this._cacheHasRenderTargetTextures = this._eventInfo.hasRenderTargetTextures;\r\n defines._needUVs = false;\r\n for (let i = 1; i <= Constants.MAX_SUPPORTED_UV_SETS; ++i) {\r\n defines[\"MAINUV\" + i] = false;\r\n }\r\n if (scene.texturesEnabled) {\r\n defines.DIFFUSEDIRECTUV = 0;\r\n defines.BUMPDIRECTUV = 0;\r\n defines.AMBIENTDIRECTUV = 0;\r\n defines.OPACITYDIRECTUV = 0;\r\n defines.EMISSIVEDIRECTUV = 0;\r\n defines.SPECULARDIRECTUV = 0;\r\n defines.LIGHTMAPDIRECTUV = 0;\r\n\r\n if (this._diffuseTexture && StandardMaterial.DiffuseTextureEnabled) {\r\n if (!this._diffuseTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._diffuseTexture, defines, \"DIFFUSE\");\r\n }\r\n } else {\r\n defines.DIFFUSE = false;\r\n }\r\n\r\n if (this._ambientTexture && StandardMaterial.AmbientTextureEnabled) {\r\n if (!this._ambientTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._ambientTexture, defines, \"AMBIENT\");\r\n }\r\n } else {\r\n defines.AMBIENT = false;\r\n }\r\n\r\n if (this._opacityTexture && StandardMaterial.OpacityTextureEnabled) {\r\n if (!this._opacityTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._opacityTexture, defines, \"OPACITY\");\r\n defines.OPACITYRGB = this._opacityTexture.getAlphaFromRGB;\r\n }\r\n } else {\r\n defines.OPACITY = false;\r\n }\r\n\r\n if (this._reflectionTexture && StandardMaterial.ReflectionTextureEnabled) {\r\n if (!this._reflectionTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n defines._needNormals = true;\r\n defines.REFLECTION = true;\r\n\r\n defines.ROUGHNESS = this._roughness > 0;\r\n defines.REFLECTIONOVERALPHA = this._useReflectionOverAlpha;\r\n defines.INVERTCUBICMAP = this._reflectionTexture.coordinatesMode === Texture.INVCUBIC_MODE;\r\n defines.REFLECTIONMAP_3D = this._reflectionTexture.isCube;\r\n defines.REFLECTIONMAP_OPPOSITEZ =\r\n defines.REFLECTIONMAP_3D && this.getScene().useRightHandedSystem ? !this._reflectionTexture.invertZ : this._reflectionTexture.invertZ;\r\n defines.RGBDREFLECTION = this._reflectionTexture.isRGBD;\r\n\r\n switch (this._reflectionTexture.coordinatesMode) {\r\n case Texture.EXPLICIT_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_EXPLICIT\");\r\n break;\r\n case Texture.PLANAR_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_PLANAR\");\r\n break;\r\n case Texture.PROJECTION_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_PROJECTION\");\r\n break;\r\n case Texture.SKYBOX_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_SKYBOX\");\r\n break;\r\n case Texture.SPHERICAL_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_SPHERICAL\");\r\n break;\r\n case Texture.EQUIRECTANGULAR_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_EQUIRECTANGULAR\");\r\n break;\r\n case Texture.FIXED_EQUIRECTANGULAR_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_EQUIRECTANGULAR_FIXED\");\r\n break;\r\n case Texture.FIXED_EQUIRECTANGULAR_MIRRORED_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED\");\r\n break;\r\n case Texture.CUBIC_MODE:\r\n case Texture.INVCUBIC_MODE:\r\n default:\r\n defines.setReflectionMode(\"REFLECTIONMAP_CUBIC\");\r\n break;\r\n }\r\n\r\n defines.USE_LOCAL_REFLECTIONMAP_CUBIC = (this._reflectionTexture).boundingBoxSize ? true : false;\r\n }\r\n } else {\r\n defines.REFLECTION = false;\r\n defines.REFLECTIONMAP_OPPOSITEZ = false;\r\n }\r\n\r\n if (this._emissiveTexture && StandardMaterial.EmissiveTextureEnabled) {\r\n if (!this._emissiveTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._emissiveTexture, defines, \"EMISSIVE\");\r\n }\r\n } else {\r\n defines.EMISSIVE = false;\r\n }\r\n\r\n if (this._lightmapTexture && StandardMaterial.LightmapTextureEnabled) {\r\n if (!this._lightmapTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._lightmapTexture, defines, \"LIGHTMAP\");\r\n defines.USELIGHTMAPASSHADOWMAP = this._useLightmapAsShadowmap;\r\n defines.RGBDLIGHTMAP = this._lightmapTexture.isRGBD;\r\n }\r\n } else {\r\n defines.LIGHTMAP = false;\r\n }\r\n\r\n if (this._specularTexture && StandardMaterial.SpecularTextureEnabled) {\r\n if (!this._specularTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._specularTexture, defines, \"SPECULAR\");\r\n defines.GLOSSINESS = this._useGlossinessFromSpecularMapAlpha;\r\n }\r\n } else {\r\n defines.SPECULAR = false;\r\n }\r\n\r\n if (scene.getEngine().getCaps().standardDerivatives && this._bumpTexture && StandardMaterial.BumpTextureEnabled) {\r\n // Bump texture can not be not blocking.\r\n if (!this._bumpTexture.isReady()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._bumpTexture, defines, \"BUMP\");\r\n\r\n defines.PARALLAX = this._useParallax;\r\n defines.PARALLAX_RHS = scene.useRightHandedSystem;\r\n defines.PARALLAXOCCLUSION = this._useParallaxOcclusion;\r\n }\r\n\r\n defines.OBJECTSPACE_NORMALMAP = this._useObjectSpaceNormalMap;\r\n } else {\r\n defines.BUMP = false;\r\n defines.PARALLAX = false;\r\n defines.PARALLAX_RHS = false;\r\n defines.PARALLAXOCCLUSION = false;\r\n }\r\n\r\n if (this._refractionTexture && StandardMaterial.RefractionTextureEnabled) {\r\n if (!this._refractionTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n defines._needUVs = true;\r\n defines.REFRACTION = true;\r\n\r\n defines.REFRACTIONMAP_3D = this._refractionTexture.isCube;\r\n defines.RGBDREFRACTION = this._refractionTexture.isRGBD;\r\n defines.USE_LOCAL_REFRACTIONMAP_CUBIC = (this._refractionTexture).boundingBoxSize ? true : false;\r\n }\r\n } else {\r\n defines.REFRACTION = false;\r\n }\r\n\r\n defines.TWOSIDEDLIGHTING = !this._backFaceCulling && this._twoSidedLighting;\r\n } else {\r\n defines.DIFFUSE = false;\r\n defines.AMBIENT = false;\r\n defines.OPACITY = false;\r\n defines.REFLECTION = false;\r\n defines.EMISSIVE = false;\r\n defines.LIGHTMAP = false;\r\n defines.BUMP = false;\r\n defines.REFRACTION = false;\r\n }\r\n\r\n defines.ALPHAFROMDIFFUSE = this._shouldUseAlphaFromDiffuseTexture();\r\n\r\n defines.EMISSIVEASILLUMINATION = this._useEmissiveAsIllumination;\r\n\r\n defines.LINKEMISSIVEWITHDIFFUSE = this._linkEmissiveWithDiffuse;\r\n\r\n defines.SPECULAROVERALPHA = this._useSpecularOverAlpha;\r\n\r\n defines.PREMULTIPLYALPHA = this.alphaMode === Constants.ALPHA_PREMULTIPLIED || this.alphaMode === Constants.ALPHA_PREMULTIPLIED_PORTERDUFF;\r\n\r\n defines.ALPHATEST_AFTERALLALPHACOMPUTATIONS = this.transparencyMode !== null;\r\n\r\n defines.ALPHABLEND = this.transparencyMode === null || this.needAlphaBlendingForMesh(mesh); // check on null for backward compatibility\r\n }\r\n\r\n this._eventInfo.isReadyForSubMesh = true;\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventIsReadyForSubMesh(this._eventInfo);\r\n\r\n if (!this._eventInfo.isReadyForSubMesh) {\r\n return false;\r\n }\r\n\r\n if (defines._areImageProcessingDirty && this._imageProcessingConfiguration) {\r\n if (!this._imageProcessingConfiguration.isReady()) {\r\n return false;\r\n }\r\n\r\n this._imageProcessingConfiguration.prepareDefines(defines);\r\n\r\n defines.IS_REFLECTION_LINEAR = this.reflectionTexture != null && !this.reflectionTexture.gammaSpace;\r\n defines.IS_REFRACTION_LINEAR = this.refractionTexture != null && !this.refractionTexture.gammaSpace;\r\n }\r\n\r\n if (defines._areFresnelDirty) {\r\n if (StandardMaterial.FresnelEnabled) {\r\n // Fresnel\r\n if (\r\n this._diffuseFresnelParameters ||\r\n this._opacityFresnelParameters ||\r\n this._emissiveFresnelParameters ||\r\n this._refractionFresnelParameters ||\r\n this._reflectionFresnelParameters\r\n ) {\r\n defines.DIFFUSEFRESNEL = this._diffuseFresnelParameters && this._diffuseFresnelParameters.isEnabled;\r\n\r\n defines.OPACITYFRESNEL = this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled;\r\n\r\n defines.REFLECTIONFRESNEL = this._reflectionFresnelParameters && this._reflectionFresnelParameters.isEnabled;\r\n\r\n defines.REFLECTIONFRESNELFROMSPECULAR = this._useReflectionFresnelFromSpecular;\r\n\r\n defines.REFRACTIONFRESNEL = this._refractionFresnelParameters && this._refractionFresnelParameters.isEnabled;\r\n\r\n defines.EMISSIVEFRESNEL = this._emissiveFresnelParameters && this._emissiveFresnelParameters.isEnabled;\r\n\r\n defines._needNormals = true;\r\n defines.FRESNEL = true;\r\n }\r\n } else {\r\n defines.FRESNEL = false;\r\n }\r\n }\r\n\r\n // Misc.\r\n PrepareDefinesForMisc(\r\n mesh,\r\n scene,\r\n this._useLogarithmicDepth,\r\n this.pointsCloud,\r\n this.fogEnabled,\r\n this._shouldTurnAlphaTestOn(mesh) || this._forceAlphaTest,\r\n defines,\r\n this._applyDecalMapAfterDetailMap\r\n );\r\n\r\n // Values that need to be evaluated on every frame\r\n PrepareDefinesForFrameBoundValues(scene, engine, this, defines, useInstances, null, subMesh.getRenderingMesh().hasThinInstances);\r\n\r\n // External config\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.mesh = mesh;\r\n this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo);\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, true, true, true);\r\n\r\n // External config\r\n this._callbackPluginEventPrepareDefines(this._eventInfo);\r\n\r\n // Get correct effect\r\n let forceWasNotReadyPreviously = false;\r\n\r\n if (defines.isDirty) {\r\n const lightDisposed = defines._areLightsDisposed;\r\n defines.markAsProcessed();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.REFLECTION) {\r\n fallbacks.addFallback(0, \"REFLECTION\");\r\n }\r\n\r\n if (defines.SPECULAR) {\r\n fallbacks.addFallback(0, \"SPECULAR\");\r\n }\r\n\r\n if (defines.BUMP) {\r\n fallbacks.addFallback(0, \"BUMP\");\r\n }\r\n\r\n if (defines.PARALLAX) {\r\n fallbacks.addFallback(1, \"PARALLAX\");\r\n }\r\n\r\n if (defines.PARALLAX_RHS) {\r\n fallbacks.addFallback(1, \"PARALLAX_RHS\");\r\n }\r\n\r\n if (defines.PARALLAXOCCLUSION) {\r\n fallbacks.addFallback(0, \"PARALLAXOCCLUSION\");\r\n }\r\n\r\n if (defines.SPECULAROVERALPHA) {\r\n fallbacks.addFallback(0, \"SPECULAROVERALPHA\");\r\n }\r\n\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n if (defines.POINTSIZE) {\r\n fallbacks.addFallback(0, \"POINTSIZE\");\r\n }\r\n\r\n if (defines.LOGARITHMICDEPTH) {\r\n fallbacks.addFallback(0, \"LOGARITHMICDEPTH\");\r\n }\r\n\r\n HandleFallbacksForShadows(defines, fallbacks, this._maxSimultaneousLights);\r\n\r\n if (defines.SPECULARTERM) {\r\n fallbacks.addFallback(0, \"SPECULARTERM\");\r\n }\r\n\r\n if (defines.DIFFUSEFRESNEL) {\r\n fallbacks.addFallback(1, \"DIFFUSEFRESNEL\");\r\n }\r\n\r\n if (defines.OPACITYFRESNEL) {\r\n fallbacks.addFallback(2, \"OPACITYFRESNEL\");\r\n }\r\n\r\n if (defines.REFLECTIONFRESNEL) {\r\n fallbacks.addFallback(3, \"REFLECTIONFRESNEL\");\r\n }\r\n\r\n if (defines.EMISSIVEFRESNEL) {\r\n fallbacks.addFallback(4, \"EMISSIVEFRESNEL\");\r\n }\r\n\r\n if (defines.FRESNEL) {\r\n fallbacks.addFallback(4, \"FRESNEL\");\r\n }\r\n\r\n if (defines.MULTIVIEW) {\r\n fallbacks.addFallback(0, \"MULTIVIEW\");\r\n }\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.NORMAL) {\r\n attribs.push(VertexBuffer.NormalKind);\r\n }\r\n\r\n if (defines.TANGENT) {\r\n attribs.push(VertexBuffer.TangentKind);\r\n }\r\n\r\n for (let i = 1; i <= Constants.MAX_SUPPORTED_UV_SETS; ++i) {\r\n if (defines[\"UV\" + i]) {\r\n attribs.push(`uv${i === 1 ? \"\" : i}`);\r\n }\r\n }\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n PrepareAttributesForBones(attribs, mesh, defines, fallbacks);\r\n PrepareAttributesForInstances(attribs, defines);\r\n PrepareAttributesForMorphTargets(attribs, mesh, defines);\r\n PrepareAttributesForBakedVertexAnimation(attribs, mesh, defines);\r\n\r\n let shaderName = \"default\";\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"view\",\r\n \"viewProjection\",\r\n \"vEyePosition\",\r\n \"vLightsType\",\r\n \"vAmbientColor\",\r\n \"vDiffuseColor\",\r\n \"vSpecularColor\",\r\n \"vEmissiveColor\",\r\n \"visibility\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"pointSize\",\r\n \"vDiffuseInfos\",\r\n \"vAmbientInfos\",\r\n \"vOpacityInfos\",\r\n \"vReflectionInfos\",\r\n \"vEmissiveInfos\",\r\n \"vSpecularInfos\",\r\n \"vBumpInfos\",\r\n \"vLightmapInfos\",\r\n \"vRefractionInfos\",\r\n \"mBones\",\r\n \"diffuseMatrix\",\r\n \"ambientMatrix\",\r\n \"opacityMatrix\",\r\n \"reflectionMatrix\",\r\n \"emissiveMatrix\",\r\n \"specularMatrix\",\r\n \"bumpMatrix\",\r\n \"normalMatrix\",\r\n \"lightmapMatrix\",\r\n \"refractionMatrix\",\r\n \"diffuseLeftColor\",\r\n \"diffuseRightColor\",\r\n \"opacityParts\",\r\n \"reflectionLeftColor\",\r\n \"reflectionRightColor\",\r\n \"emissiveLeftColor\",\r\n \"emissiveRightColor\",\r\n \"refractionLeftColor\",\r\n \"refractionRightColor\",\r\n \"vReflectionPosition\",\r\n \"vReflectionSize\",\r\n \"vRefractionPosition\",\r\n \"vRefractionSize\",\r\n \"logarithmicDepthConstant\",\r\n \"vTangentSpaceParams\",\r\n \"alphaCutOff\",\r\n \"boneTextureWidth\",\r\n \"morphTargetTextureInfo\",\r\n \"morphTargetTextureIndices\",\r\n ];\r\n\r\n const samplers = [\r\n \"diffuseSampler\",\r\n \"ambientSampler\",\r\n \"opacitySampler\",\r\n \"reflectionCubeSampler\",\r\n \"reflection2DSampler\",\r\n \"emissiveSampler\",\r\n \"specularSampler\",\r\n \"bumpSampler\",\r\n \"lightmapSampler\",\r\n \"refractionCubeSampler\",\r\n \"refraction2DSampler\",\r\n \"boneSampler\",\r\n \"morphTargets\",\r\n \"oitDepthSampler\",\r\n \"oitFrontColorSampler\",\r\n ];\r\n\r\n const uniformBuffers = [\"Material\", \"Scene\", \"Mesh\"];\r\n\r\n const indexParameters = { maxSimultaneousLights: this._maxSimultaneousLights, maxSimultaneousMorphTargets: defines.NUM_MORPH_INFLUENCERS };\r\n\r\n this._eventInfo.fallbacks = fallbacks;\r\n this._eventInfo.fallbackRank = 0;\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.uniforms = uniforms;\r\n this._eventInfo.attributes = attribs;\r\n this._eventInfo.samplers = samplers;\r\n this._eventInfo.uniformBuffersNames = uniformBuffers;\r\n this._eventInfo.customCode = undefined;\r\n this._eventInfo.mesh = mesh;\r\n this._eventInfo.indexParameters = indexParameters;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.PrepareEffect, this._eventInfo);\r\n\r\n PrePassConfiguration.AddUniforms(uniforms);\r\n PrePassConfiguration.AddSamplers(samplers);\r\n\r\n if (ImageProcessingConfiguration) {\r\n ImageProcessingConfiguration.PrepareUniforms(uniforms, defines);\r\n ImageProcessingConfiguration.PrepareSamplers(samplers, defines);\r\n }\r\n\r\n PrepareUniformsAndSamplersList({\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n maxSimultaneousLights: this._maxSimultaneousLights,\r\n });\r\n\r\n addClipPlaneUniforms(uniforms);\r\n\r\n const csnrOptions: ICustomShaderNameResolveOptions = {};\r\n\r\n if (this.customShaderNameResolve) {\r\n shaderName = this.customShaderNameResolve(shaderName, uniforms, uniformBuffers, samplers, defines, attribs, csnrOptions);\r\n }\r\n\r\n const join = defines.toString();\r\n\r\n const previousEffect = subMesh.effect;\r\n let effect = scene.getEngine().createEffect(\r\n shaderName,\r\n {\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters,\r\n processFinalCode: csnrOptions.processFinalCode,\r\n processCodeAfterIncludes: this._eventInfo.customCode,\r\n multiTarget: defines.PREPASS,\r\n },\r\n engine\r\n );\r\n\r\n this._eventInfo.customCode = undefined;\r\n\r\n if (effect) {\r\n if (this._onEffectCreatedObservable) {\r\n onCreatedEffectParameters.effect = effect;\r\n onCreatedEffectParameters.subMesh = subMesh;\r\n this._onEffectCreatedObservable.notifyObservers(onCreatedEffectParameters);\r\n }\r\n\r\n // Use previous effect while new one is compiling\r\n if (this.allowShaderHotSwapping && previousEffect && !effect.isReady()) {\r\n effect = previousEffect;\r\n defines.markAsUnprocessed();\r\n\r\n forceWasNotReadyPreviously = this.isFrozen;\r\n\r\n if (lightDisposed) {\r\n // re register in case it takes more than one frame.\r\n defines._areLightsDisposed = true;\r\n return false;\r\n }\r\n } else {\r\n scene.resetCachedMaterial();\r\n subMesh.setEffect(effect, defines, this._materialContext);\r\n }\r\n }\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = forceWasNotReadyPreviously ? false : true;\r\n drawWrapper._wasPreviouslyUsingInstances = useInstances;\r\n\r\n this._checkScenePerformancePriority();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Builds the material UBO layouts.\r\n * Used internally during the effect preparation.\r\n */\r\n public buildUniformLayout(): void {\r\n // Order is important !\r\n const ubo = this._uniformBuffer;\r\n ubo.addUniform(\"diffuseLeftColor\", 4);\r\n ubo.addUniform(\"diffuseRightColor\", 4);\r\n ubo.addUniform(\"opacityParts\", 4);\r\n ubo.addUniform(\"reflectionLeftColor\", 4);\r\n ubo.addUniform(\"reflectionRightColor\", 4);\r\n ubo.addUniform(\"refractionLeftColor\", 4);\r\n ubo.addUniform(\"refractionRightColor\", 4);\r\n ubo.addUniform(\"emissiveLeftColor\", 4);\r\n ubo.addUniform(\"emissiveRightColor\", 4);\r\n\r\n ubo.addUniform(\"vDiffuseInfos\", 2);\r\n ubo.addUniform(\"vAmbientInfos\", 2);\r\n ubo.addUniform(\"vOpacityInfos\", 2);\r\n ubo.addUniform(\"vReflectionInfos\", 2);\r\n ubo.addUniform(\"vReflectionPosition\", 3);\r\n ubo.addUniform(\"vReflectionSize\", 3);\r\n ubo.addUniform(\"vEmissiveInfos\", 2);\r\n ubo.addUniform(\"vLightmapInfos\", 2);\r\n ubo.addUniform(\"vSpecularInfos\", 2);\r\n ubo.addUniform(\"vBumpInfos\", 3);\r\n\r\n ubo.addUniform(\"diffuseMatrix\", 16);\r\n ubo.addUniform(\"ambientMatrix\", 16);\r\n ubo.addUniform(\"opacityMatrix\", 16);\r\n ubo.addUniform(\"reflectionMatrix\", 16);\r\n ubo.addUniform(\"emissiveMatrix\", 16);\r\n ubo.addUniform(\"lightmapMatrix\", 16);\r\n ubo.addUniform(\"specularMatrix\", 16);\r\n ubo.addUniform(\"bumpMatrix\", 16);\r\n ubo.addUniform(\"vTangentSpaceParams\", 2);\r\n ubo.addUniform(\"pointSize\", 1);\r\n ubo.addUniform(\"alphaCutOff\", 1);\r\n ubo.addUniform(\"refractionMatrix\", 16);\r\n ubo.addUniform(\"vRefractionInfos\", 4);\r\n ubo.addUniform(\"vRefractionPosition\", 3);\r\n ubo.addUniform(\"vRefractionSize\", 3);\r\n ubo.addUniform(\"vSpecularColor\", 4);\r\n ubo.addUniform(\"vEmissiveColor\", 3);\r\n ubo.addUniform(\"vDiffuseColor\", 4);\r\n ubo.addUniform(\"vAmbientColor\", 3);\r\n\r\n super.buildUniformLayout();\r\n }\r\n\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices Mesh.\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n mesh.transferToEffect(world);\r\n\r\n // Binding unconditionally\r\n this._uniformBuffer.bindToEffect(effect, \"Material\");\r\n\r\n this.prePassConfiguration.bindForSubMesh(this._activeEffect, scene, mesh, world, this.isFrozen);\r\n\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventHardBindForSubMesh(this._eventInfo);\r\n\r\n // Normal Matrix\r\n if (defines.OBJECTSPACE_NORMALMAP) {\r\n world.toNormalMatrix(this._normalMatrix);\r\n this.bindOnlyNormalMatrix(this._normalMatrix);\r\n }\r\n\r\n const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility);\r\n\r\n // Bones\r\n BindBonesParameters(mesh, effect);\r\n const ubo = this._uniformBuffer;\r\n if (mustRebind) {\r\n this.bindViewProjection(effect);\r\n if (!ubo.useUbo || !this.isFrozen || !ubo.isSync || subMesh._drawWrapper._forceRebindOnNextCall) {\r\n if (StandardMaterial.FresnelEnabled && defines.FRESNEL) {\r\n // Fresnel\r\n if (this.diffuseFresnelParameters && this.diffuseFresnelParameters.isEnabled) {\r\n ubo.updateColor4(\"diffuseLeftColor\", this.diffuseFresnelParameters.leftColor, this.diffuseFresnelParameters.power);\r\n ubo.updateColor4(\"diffuseRightColor\", this.diffuseFresnelParameters.rightColor, this.diffuseFresnelParameters.bias);\r\n }\r\n\r\n if (this.opacityFresnelParameters && this.opacityFresnelParameters.isEnabled) {\r\n ubo.updateColor4(\r\n \"opacityParts\",\r\n new Color3(\r\n this.opacityFresnelParameters.leftColor.toLuminance(),\r\n this.opacityFresnelParameters.rightColor.toLuminance(),\r\n this.opacityFresnelParameters.bias\r\n ),\r\n this.opacityFresnelParameters.power\r\n );\r\n }\r\n\r\n if (this.reflectionFresnelParameters && this.reflectionFresnelParameters.isEnabled) {\r\n ubo.updateColor4(\"reflectionLeftColor\", this.reflectionFresnelParameters.leftColor, this.reflectionFresnelParameters.power);\r\n ubo.updateColor4(\"reflectionRightColor\", this.reflectionFresnelParameters.rightColor, this.reflectionFresnelParameters.bias);\r\n }\r\n\r\n if (this.refractionFresnelParameters && this.refractionFresnelParameters.isEnabled) {\r\n ubo.updateColor4(\"refractionLeftColor\", this.refractionFresnelParameters.leftColor, this.refractionFresnelParameters.power);\r\n ubo.updateColor4(\"refractionRightColor\", this.refractionFresnelParameters.rightColor, this.refractionFresnelParameters.bias);\r\n }\r\n\r\n if (this.emissiveFresnelParameters && this.emissiveFresnelParameters.isEnabled) {\r\n ubo.updateColor4(\"emissiveLeftColor\", this.emissiveFresnelParameters.leftColor, this.emissiveFresnelParameters.power);\r\n ubo.updateColor4(\"emissiveRightColor\", this.emissiveFresnelParameters.rightColor, this.emissiveFresnelParameters.bias);\r\n }\r\n }\r\n\r\n // Textures\r\n if (scene.texturesEnabled) {\r\n if (this._diffuseTexture && StandardMaterial.DiffuseTextureEnabled) {\r\n ubo.updateFloat2(\"vDiffuseInfos\", this._diffuseTexture.coordinatesIndex, this._diffuseTexture.level);\r\n BindTextureMatrix(this._diffuseTexture, ubo, \"diffuse\");\r\n }\r\n\r\n if (this._ambientTexture && StandardMaterial.AmbientTextureEnabled) {\r\n ubo.updateFloat2(\"vAmbientInfos\", this._ambientTexture.coordinatesIndex, this._ambientTexture.level);\r\n BindTextureMatrix(this._ambientTexture, ubo, \"ambient\");\r\n }\r\n\r\n if (this._opacityTexture && StandardMaterial.OpacityTextureEnabled) {\r\n ubo.updateFloat2(\"vOpacityInfos\", this._opacityTexture.coordinatesIndex, this._opacityTexture.level);\r\n BindTextureMatrix(this._opacityTexture, ubo, \"opacity\");\r\n }\r\n\r\n if (this._hasAlphaChannel()) {\r\n ubo.updateFloat(\"alphaCutOff\", this.alphaCutOff);\r\n }\r\n\r\n if (this._reflectionTexture && StandardMaterial.ReflectionTextureEnabled) {\r\n ubo.updateFloat2(\"vReflectionInfos\", this._reflectionTexture.level, this.roughness);\r\n ubo.updateMatrix(\"reflectionMatrix\", this._reflectionTexture.getReflectionTextureMatrix());\r\n\r\n if ((this._reflectionTexture).boundingBoxSize) {\r\n const cubeTexture = this._reflectionTexture;\r\n\r\n ubo.updateVector3(\"vReflectionPosition\", cubeTexture.boundingBoxPosition);\r\n ubo.updateVector3(\"vReflectionSize\", cubeTexture.boundingBoxSize);\r\n }\r\n }\r\n\r\n if (this._emissiveTexture && StandardMaterial.EmissiveTextureEnabled) {\r\n ubo.updateFloat2(\"vEmissiveInfos\", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level);\r\n BindTextureMatrix(this._emissiveTexture, ubo, \"emissive\");\r\n }\r\n\r\n if (this._lightmapTexture && StandardMaterial.LightmapTextureEnabled) {\r\n ubo.updateFloat2(\"vLightmapInfos\", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level);\r\n BindTextureMatrix(this._lightmapTexture, ubo, \"lightmap\");\r\n }\r\n\r\n if (this._specularTexture && StandardMaterial.SpecularTextureEnabled) {\r\n ubo.updateFloat2(\"vSpecularInfos\", this._specularTexture.coordinatesIndex, this._specularTexture.level);\r\n BindTextureMatrix(this._specularTexture, ubo, \"specular\");\r\n }\r\n\r\n if (this._bumpTexture && scene.getEngine().getCaps().standardDerivatives && StandardMaterial.BumpTextureEnabled) {\r\n ubo.updateFloat3(\"vBumpInfos\", this._bumpTexture.coordinatesIndex, 1.0 / this._bumpTexture.level, this.parallaxScaleBias);\r\n BindTextureMatrix(this._bumpTexture, ubo, \"bump\");\r\n\r\n if (scene._mirroredCameraPosition) {\r\n ubo.updateFloat2(\"vTangentSpaceParams\", this._invertNormalMapX ? 1.0 : -1.0, this._invertNormalMapY ? 1.0 : -1.0);\r\n } else {\r\n ubo.updateFloat2(\"vTangentSpaceParams\", this._invertNormalMapX ? -1.0 : 1.0, this._invertNormalMapY ? -1.0 : 1.0);\r\n }\r\n }\r\n\r\n if (this._refractionTexture && StandardMaterial.RefractionTextureEnabled) {\r\n let depth = 1.0;\r\n if (!this._refractionTexture.isCube) {\r\n ubo.updateMatrix(\"refractionMatrix\", this._refractionTexture.getReflectionTextureMatrix());\r\n\r\n if ((this._refractionTexture).depth) {\r\n depth = (this._refractionTexture).depth;\r\n }\r\n }\r\n ubo.updateFloat4(\"vRefractionInfos\", this._refractionTexture.level, this.indexOfRefraction, depth, this.invertRefractionY ? -1 : 1);\r\n\r\n if ((this._refractionTexture).boundingBoxSize) {\r\n const cubeTexture = this._refractionTexture;\r\n\r\n ubo.updateVector3(\"vRefractionPosition\", cubeTexture.boundingBoxPosition);\r\n ubo.updateVector3(\"vRefractionSize\", cubeTexture.boundingBoxSize);\r\n }\r\n }\r\n }\r\n\r\n // Point size\r\n if (this.pointsCloud) {\r\n ubo.updateFloat(\"pointSize\", this.pointSize);\r\n }\r\n\r\n if (defines.SPECULARTERM) {\r\n ubo.updateColor4(\"vSpecularColor\", this.specularColor, this.specularPower);\r\n }\r\n\r\n ubo.updateColor3(\"vEmissiveColor\", StandardMaterial.EmissiveTextureEnabled ? this.emissiveColor : Color3.BlackReadOnly);\r\n ubo.updateColor4(\"vDiffuseColor\", this.diffuseColor, this.alpha);\r\n\r\n scene.ambientColor.multiplyToRef(this.ambientColor, this._globalAmbientColor);\r\n ubo.updateColor3(\"vAmbientColor\", this._globalAmbientColor);\r\n }\r\n\r\n // Textures\r\n if (scene.texturesEnabled) {\r\n if (this._diffuseTexture && StandardMaterial.DiffuseTextureEnabled) {\r\n effect.setTexture(\"diffuseSampler\", this._diffuseTexture);\r\n }\r\n\r\n if (this._ambientTexture && StandardMaterial.AmbientTextureEnabled) {\r\n effect.setTexture(\"ambientSampler\", this._ambientTexture);\r\n }\r\n\r\n if (this._opacityTexture && StandardMaterial.OpacityTextureEnabled) {\r\n effect.setTexture(\"opacitySampler\", this._opacityTexture);\r\n }\r\n\r\n if (this._reflectionTexture && StandardMaterial.ReflectionTextureEnabled) {\r\n if (this._reflectionTexture.isCube) {\r\n effect.setTexture(\"reflectionCubeSampler\", this._reflectionTexture);\r\n } else {\r\n effect.setTexture(\"reflection2DSampler\", this._reflectionTexture);\r\n }\r\n }\r\n\r\n if (this._emissiveTexture && StandardMaterial.EmissiveTextureEnabled) {\r\n effect.setTexture(\"emissiveSampler\", this._emissiveTexture);\r\n }\r\n\r\n if (this._lightmapTexture && StandardMaterial.LightmapTextureEnabled) {\r\n effect.setTexture(\"lightmapSampler\", this._lightmapTexture);\r\n }\r\n\r\n if (this._specularTexture && StandardMaterial.SpecularTextureEnabled) {\r\n effect.setTexture(\"specularSampler\", this._specularTexture);\r\n }\r\n\r\n if (this._bumpTexture && scene.getEngine().getCaps().standardDerivatives && StandardMaterial.BumpTextureEnabled) {\r\n effect.setTexture(\"bumpSampler\", this._bumpTexture);\r\n }\r\n\r\n if (this._refractionTexture && StandardMaterial.RefractionTextureEnabled) {\r\n if (this._refractionTexture.isCube) {\r\n effect.setTexture(\"refractionCubeSampler\", this._refractionTexture);\r\n } else {\r\n effect.setTexture(\"refraction2DSampler\", this._refractionTexture);\r\n }\r\n }\r\n }\r\n\r\n // OIT with depth peeling\r\n if (this.getScene().useOrderIndependentTransparency && this.needAlphaBlendingForMesh(mesh)) {\r\n this.getScene().depthPeelingRenderer!.bind(effect);\r\n }\r\n\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventBindForSubMesh(this._eventInfo);\r\n\r\n // Clip plane\r\n bindClipPlane(effect, this, scene);\r\n\r\n // Colors\r\n this.bindEyePosition(effect);\r\n } else if (scene.getEngine()._features.needToAlwaysBindUniformBuffers) {\r\n this._needToBindSceneUbo = true;\r\n }\r\n\r\n if (mustRebind || !this.isFrozen) {\r\n // Lights\r\n if (scene.lightsEnabled && !this._disableLighting) {\r\n BindLights(scene, mesh, effect, defines, this._maxSimultaneousLights);\r\n }\r\n\r\n // View\r\n if (\r\n (scene.fogEnabled && mesh.applyFog && scene.fogMode !== Scene.FOGMODE_NONE) ||\r\n this._reflectionTexture ||\r\n this._refractionTexture ||\r\n mesh.receiveShadows ||\r\n defines.PREPASS\r\n ) {\r\n this.bindView(effect);\r\n }\r\n\r\n // Fog\r\n BindFogParameters(scene, mesh, effect);\r\n\r\n // Morph targets\r\n if (defines.NUM_MORPH_INFLUENCERS) {\r\n BindMorphTargetParameters(mesh, effect);\r\n }\r\n\r\n if (defines.BAKED_VERTEX_ANIMATION_TEXTURE) {\r\n mesh.bakedVertexAnimationManager?.bind(effect, defines.INSTANCES);\r\n }\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n\r\n // image processing\r\n if (this._imageProcessingConfiguration && !this._imageProcessingConfiguration.applyByPostProcess) {\r\n this._imageProcessingConfiguration.bind(this._activeEffect);\r\n }\r\n }\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n ubo.update();\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public getAnimatables(): IAnimatable[] {\r\n const results = super.getAnimatables();\r\n\r\n if (this._diffuseTexture && this._diffuseTexture.animations && this._diffuseTexture.animations.length > 0) {\r\n results.push(this._diffuseTexture);\r\n }\r\n\r\n if (this._ambientTexture && this._ambientTexture.animations && this._ambientTexture.animations.length > 0) {\r\n results.push(this._ambientTexture);\r\n }\r\n\r\n if (this._opacityTexture && this._opacityTexture.animations && this._opacityTexture.animations.length > 0) {\r\n results.push(this._opacityTexture);\r\n }\r\n\r\n if (this._reflectionTexture && this._reflectionTexture.animations && this._reflectionTexture.animations.length > 0) {\r\n results.push(this._reflectionTexture);\r\n }\r\n\r\n if (this._emissiveTexture && this._emissiveTexture.animations && this._emissiveTexture.animations.length > 0) {\r\n results.push(this._emissiveTexture);\r\n }\r\n\r\n if (this._specularTexture && this._specularTexture.animations && this._specularTexture.animations.length > 0) {\r\n results.push(this._specularTexture);\r\n }\r\n\r\n if (this._bumpTexture && this._bumpTexture.animations && this._bumpTexture.animations.length > 0) {\r\n results.push(this._bumpTexture);\r\n }\r\n\r\n if (this._lightmapTexture && this._lightmapTexture.animations && this._lightmapTexture.animations.length > 0) {\r\n results.push(this._lightmapTexture);\r\n }\r\n\r\n if (this._refractionTexture && this._refractionTexture.animations && this._refractionTexture.animations.length > 0) {\r\n results.push(this._refractionTexture);\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Gets the active textures from the material\r\n * @returns an array of textures\r\n */\r\n public getActiveTextures(): BaseTexture[] {\r\n const activeTextures = super.getActiveTextures();\r\n\r\n if (this._diffuseTexture) {\r\n activeTextures.push(this._diffuseTexture);\r\n }\r\n\r\n if (this._ambientTexture) {\r\n activeTextures.push(this._ambientTexture);\r\n }\r\n\r\n if (this._opacityTexture) {\r\n activeTextures.push(this._opacityTexture);\r\n }\r\n\r\n if (this._reflectionTexture) {\r\n activeTextures.push(this._reflectionTexture);\r\n }\r\n\r\n if (this._emissiveTexture) {\r\n activeTextures.push(this._emissiveTexture);\r\n }\r\n\r\n if (this._specularTexture) {\r\n activeTextures.push(this._specularTexture);\r\n }\r\n\r\n if (this._bumpTexture) {\r\n activeTextures.push(this._bumpTexture);\r\n }\r\n\r\n if (this._lightmapTexture) {\r\n activeTextures.push(this._lightmapTexture);\r\n }\r\n\r\n if (this._refractionTexture) {\r\n activeTextures.push(this._refractionTexture);\r\n }\r\n\r\n return activeTextures;\r\n }\r\n\r\n /**\r\n * Specifies if the material uses a texture\r\n * @param texture defines the texture to check against the material\r\n * @returns a boolean specifying if the material uses the texture\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n if (super.hasTexture(texture)) {\r\n return true;\r\n }\r\n\r\n if (this._diffuseTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._ambientTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._opacityTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._reflectionTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._emissiveTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._specularTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._bumpTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._lightmapTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._refractionTexture === texture) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the material\r\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\r\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\r\n */\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean): void {\r\n if (forceDisposeTextures) {\r\n this._diffuseTexture?.dispose();\r\n this._ambientTexture?.dispose();\r\n this._opacityTexture?.dispose();\r\n this._reflectionTexture?.dispose();\r\n this._emissiveTexture?.dispose();\r\n this._specularTexture?.dispose();\r\n this._bumpTexture?.dispose();\r\n this._lightmapTexture?.dispose();\r\n this._refractionTexture?.dispose();\r\n }\r\n\r\n if (this._imageProcessingConfiguration && this._imageProcessingObserver) {\r\n this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver);\r\n }\r\n\r\n super.dispose(forceDisposeEffect, forceDisposeTextures);\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the material, and gives it a new name\r\n * @param name defines the new name for the duplicated material\r\n * @param cloneTexturesOnlyOnce - if a texture is used in more than one channel (e.g diffuse and opacity), only clone it once and reuse it on the other channels. Default false.\r\n * @param rootUrl defines the root URL to use to load textures\r\n * @returns the cloned material\r\n */\r\n public clone(name: string, cloneTexturesOnlyOnce: boolean = true, rootUrl = \"\"): StandardMaterial {\r\n const result = SerializationHelper.Clone(() => new StandardMaterial(name, this.getScene()), this, { cloneTexturesOnlyOnce });\r\n\r\n result.name = name;\r\n result.id = name;\r\n\r\n this.stencil.copyTo(result.stencil);\r\n\r\n this._clonePlugins(result, rootUrl);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a standard material from parsed material data\r\n * @param source defines the JSON representation of the material\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a new standard material\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): StandardMaterial {\r\n const material = SerializationHelper.Parse(() => new StandardMaterial(source.name, scene), source, scene, rootUrl);\r\n\r\n if (source.stencil) {\r\n material.stencil.parse(source.stencil, scene, rootUrl);\r\n }\r\n\r\n Material._ParsePlugins(source, material, scene, rootUrl);\r\n\r\n return material;\r\n }\r\n\r\n // Flags used to enable or disable a type of texture for all Standard Materials\r\n /**\r\n * Are diffuse textures enabled in the application.\r\n */\r\n public static get DiffuseTextureEnabled(): boolean {\r\n return MaterialFlags.DiffuseTextureEnabled;\r\n }\r\n public static set DiffuseTextureEnabled(value: boolean) {\r\n MaterialFlags.DiffuseTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are detail textures enabled in the application.\r\n */\r\n public static get DetailTextureEnabled(): boolean {\r\n return MaterialFlags.DetailTextureEnabled;\r\n }\r\n public static set DetailTextureEnabled(value: boolean) {\r\n MaterialFlags.DetailTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are ambient textures enabled in the application.\r\n */\r\n public static get AmbientTextureEnabled(): boolean {\r\n return MaterialFlags.AmbientTextureEnabled;\r\n }\r\n public static set AmbientTextureEnabled(value: boolean) {\r\n MaterialFlags.AmbientTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are opacity textures enabled in the application.\r\n */\r\n public static get OpacityTextureEnabled(): boolean {\r\n return MaterialFlags.OpacityTextureEnabled;\r\n }\r\n public static set OpacityTextureEnabled(value: boolean) {\r\n MaterialFlags.OpacityTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are reflection textures enabled in the application.\r\n */\r\n public static get ReflectionTextureEnabled(): boolean {\r\n return MaterialFlags.ReflectionTextureEnabled;\r\n }\r\n public static set ReflectionTextureEnabled(value: boolean) {\r\n MaterialFlags.ReflectionTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are emissive textures enabled in the application.\r\n */\r\n public static get EmissiveTextureEnabled(): boolean {\r\n return MaterialFlags.EmissiveTextureEnabled;\r\n }\r\n public static set EmissiveTextureEnabled(value: boolean) {\r\n MaterialFlags.EmissiveTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are specular textures enabled in the application.\r\n */\r\n public static get SpecularTextureEnabled(): boolean {\r\n return MaterialFlags.SpecularTextureEnabled;\r\n }\r\n public static set SpecularTextureEnabled(value: boolean) {\r\n MaterialFlags.SpecularTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are bump textures enabled in the application.\r\n */\r\n public static get BumpTextureEnabled(): boolean {\r\n return MaterialFlags.BumpTextureEnabled;\r\n }\r\n public static set BumpTextureEnabled(value: boolean) {\r\n MaterialFlags.BumpTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are lightmap textures enabled in the application.\r\n */\r\n public static get LightmapTextureEnabled(): boolean {\r\n return MaterialFlags.LightmapTextureEnabled;\r\n }\r\n public static set LightmapTextureEnabled(value: boolean) {\r\n MaterialFlags.LightmapTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are refraction textures enabled in the application.\r\n */\r\n public static get RefractionTextureEnabled(): boolean {\r\n return MaterialFlags.RefractionTextureEnabled;\r\n }\r\n public static set RefractionTextureEnabled(value: boolean) {\r\n MaterialFlags.RefractionTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are color grading textures enabled in the application.\r\n */\r\n public static get ColorGradingTextureEnabled(): boolean {\r\n return MaterialFlags.ColorGradingTextureEnabled;\r\n }\r\n public static set ColorGradingTextureEnabled(value: boolean) {\r\n MaterialFlags.ColorGradingTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are fresnels enabled in the application.\r\n */\r\n public static get FresnelEnabled(): boolean {\r\n return MaterialFlags.FresnelEnabled;\r\n }\r\n public static set FresnelEnabled(value: boolean) {\r\n MaterialFlags.FresnelEnabled = value;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.StandardMaterial\", StandardMaterial);\r\n\r\nScene.DefaultMaterialFactory = (scene: Scene) => {\r\n return new StandardMaterial(\"default material\", scene);\r\n};\r\n", "import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { InternalTexture, InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport type { ImageSource, Nullable } from \"../../types\";\r\nimport type { ICanvas } from \"../ICanvas\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Creates a dynamic texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default)\r\n * @returns the dynamic texture inside an InternalTexture\r\n */\r\n createDynamicTexture(width: number, height: number, generateMipMaps: boolean, samplingMode: number): InternalTexture;\r\n\r\n /**\r\n * Update the content of a dynamic texture\r\n * @param texture defines the texture to update\r\n * @param source defines the source containing the data\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param premulAlpha defines if alpha is stored as premultiplied\r\n * @param format defines the format of the data\r\n * @param forceBindTexture if the texture should be forced to be bound eg. after a graphics context loss (Default: false)\r\n * @param allowGPUOptimization true to allow some specific GPU optimizations (subject to engine feature \"allowGPUOptimizationsForGUI\" being true)\r\n */\r\n updateDynamicTexture(\r\n texture: Nullable,\r\n source: ImageSource | ICanvas,\r\n invertY?: boolean,\r\n premulAlpha?: boolean,\r\n format?: number,\r\n forceBindTexture?: boolean,\r\n allowGPUOptimization?: boolean\r\n ): void;\r\n }\r\n}\r\n\r\nThinEngine.prototype.createDynamicTexture = function (width: number, height: number, generateMipMaps: boolean, samplingMode: number): InternalTexture {\r\n const texture = new InternalTexture(this, InternalTextureSource.Dynamic);\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n\r\n if (generateMipMaps) {\r\n width = this.needPOTTextures ? ThinEngine.GetExponentOfTwo(width, this._caps.maxTextureSize) : width;\r\n height = this.needPOTTextures ? ThinEngine.GetExponentOfTwo(height, this._caps.maxTextureSize) : height;\r\n }\r\n\r\n // this.resetTextureCache();\r\n texture.width = width;\r\n texture.height = height;\r\n texture.isReady = false;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n\r\n this.updateTextureSamplingMode(samplingMode, texture);\r\n\r\n this._internalTexturesCache.push(texture);\r\n\r\n return texture;\r\n};\r\n\r\nThinEngine.prototype.updateDynamicTexture = function (\r\n texture: Nullable,\r\n source: ImageSource,\r\n invertY?: boolean,\r\n premulAlpha: boolean = false,\r\n format?: number,\r\n forceBindTexture: boolean = false,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n allowGPUOptimization: boolean = false\r\n): void {\r\n if (!texture) {\r\n return;\r\n }\r\n\r\n const gl = this._gl;\r\n const target = gl.TEXTURE_2D;\r\n\r\n const wasPreviouslyBound = this._bindTextureDirectly(target, texture, true, forceBindTexture);\r\n\r\n this._unpackFlipY(invertY === undefined ? texture.invertY : invertY);\r\n\r\n if (premulAlpha) {\r\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 1);\r\n }\r\n\r\n const textureType = this._getWebGLTextureType(texture.type);\r\n const glformat = this._getInternalFormat(format ? format : texture.format);\r\n const internalFormat = this._getRGBABufferInternalSizedFormat(texture.type, glformat);\r\n\r\n gl.texImage2D(target, 0, internalFormat, glformat, textureType, source as TexImageSource);\r\n\r\n if (texture.generateMipMaps) {\r\n gl.generateMipmap(target);\r\n }\r\n\r\n if (!wasPreviouslyBound) {\r\n this._bindTextureDirectly(target, null);\r\n }\r\n\r\n if (premulAlpha) {\r\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0);\r\n }\r\n\r\n if (format) {\r\n texture.format = format;\r\n }\r\n\r\n texture._dynamicTextureSource = source;\r\n texture._premulAlpha = premulAlpha;\r\n texture.invertY = invertY || false;\r\n texture.isReady = true;\r\n};\r\n", "import { Logger } from \"../../Misc/logger\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { ISize } from \"../../Maths/math.size\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport \"../../Engines/Extensions/engine.dynamicTexture\";\r\nimport type { ICanvas, ICanvasRenderingContext } from \"../../Engines/ICanvas\";\r\n\r\n/**\r\n * A class extending Texture allowing drawing on a texture\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/dynamicTexture\r\n */\r\nexport class DynamicTexture extends Texture {\r\n private _generateMipMaps: boolean;\r\n private _canvas: ICanvas;\r\n private _ownCanvas: boolean;\r\n private _context: ICanvasRenderingContext;\r\n\r\n /**\r\n * Creates a DynamicTexture\r\n * @param name defines the name of the texture\r\n * @param options provides 3 alternatives for width and height of texture, a canvas, object with width and height properties, number for both width and height\r\n * @param scene defines the scene where you want the texture\r\n * @param generateMipMaps defines the use of MinMaps or not (default is false)\r\n * @param samplingMode defines the sampling mode to use (default is Texture.TRILINEAR_SAMPLINGMODE)\r\n * @param format defines the texture format to use (default is Engine.TEXTUREFORMAT_RGBA)\r\n * @param invertY defines if the texture needs to be inverted on the y axis during loading\r\n */\r\n\r\n constructor(\r\n name: string,\r\n options: any,\r\n scene: Nullable = null,\r\n generateMipMaps: boolean = false,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n format: number = Constants.TEXTUREFORMAT_RGBA,\r\n invertY?: boolean\r\n ) {\r\n super(null, scene, !generateMipMaps, invertY, samplingMode, undefined, undefined, undefined, undefined, format);\r\n\r\n this.name = name;\r\n this.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n this.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n\r\n this._generateMipMaps = generateMipMaps;\r\n\r\n const engine = this._getEngine();\r\n if (!engine) {\r\n return;\r\n }\r\n\r\n if (options.getContext) {\r\n this._canvas = options;\r\n this._ownCanvas = false;\r\n this._texture = engine.createDynamicTexture(options.width, options.height, generateMipMaps, samplingMode);\r\n } else {\r\n this._canvas = engine.createCanvas(1, 1);\r\n this._ownCanvas = true;\r\n\r\n if (options.width || options.width === 0) {\r\n this._texture = engine.createDynamicTexture(options.width, options.height, generateMipMaps, samplingMode);\r\n } else {\r\n this._texture = engine.createDynamicTexture(options, options, generateMipMaps, samplingMode);\r\n }\r\n }\r\n\r\n const textureSize = this.getSize();\r\n\r\n if (this._canvas.width !== textureSize.width) {\r\n this._canvas.width = textureSize.width;\r\n }\r\n if (this._canvas.height !== textureSize.height) {\r\n this._canvas.height = textureSize.height;\r\n }\r\n this._context = this._canvas.getContext(\"2d\");\r\n }\r\n\r\n /**\r\n * Get the current class name of the texture useful for serialization or dynamic coding.\r\n * @returns \"DynamicTexture\"\r\n */\r\n public getClassName(): string {\r\n return \"DynamicTexture\";\r\n }\r\n\r\n /**\r\n * Gets the current state of canRescale\r\n */\r\n public get canRescale(): boolean {\r\n return true;\r\n }\r\n\r\n private _recreate(textureSize: ISize): void {\r\n this._canvas.width = textureSize.width;\r\n this._canvas.height = textureSize.height;\r\n\r\n this.releaseInternalTexture();\r\n\r\n this._texture = this._getEngine()!.createDynamicTexture(textureSize.width, textureSize.height, this._generateMipMaps, this.samplingMode);\r\n }\r\n\r\n /**\r\n * Scales the texture\r\n * @param ratio the scale factor to apply to both width and height\r\n */\r\n public scale(ratio: number): void {\r\n const textureSize = this.getSize();\r\n\r\n textureSize.width *= ratio;\r\n textureSize.height *= ratio;\r\n\r\n this._recreate(textureSize);\r\n }\r\n\r\n /**\r\n * Resizes the texture\r\n * @param width the new width\r\n * @param height the new height\r\n */\r\n public scaleTo(width: number, height: number): void {\r\n const textureSize = this.getSize();\r\n\r\n textureSize.width = width;\r\n textureSize.height = height;\r\n\r\n this._recreate(textureSize);\r\n }\r\n\r\n /**\r\n * Gets the context of the canvas used by the texture\r\n * @returns the canvas context of the dynamic texture\r\n */\r\n public getContext(): ICanvasRenderingContext {\r\n return this._context;\r\n }\r\n\r\n /**\r\n * Clears the texture\r\n * @param clearColor Defines the clear color to use\r\n */\r\n public clear(clearColor?: string): void {\r\n const size = this.getSize();\r\n if (clearColor) {\r\n this._context.fillStyle = clearColor;\r\n }\r\n this._context.clearRect(0, 0, size.width, size.height);\r\n }\r\n\r\n /**\r\n * Updates the texture\r\n * @param invertY defines the direction for the Y axis (default is true - y increases downwards)\r\n * @param premulAlpha defines if alpha is stored as premultiplied (default is false)\r\n * @param allowGPUOptimization true to allow some specific GPU optimizations (subject to engine feature \"allowGPUOptimizationsForGUI\" being true)\r\n */\r\n public update(invertY?: boolean, premulAlpha = false, allowGPUOptimization = false): void {\r\n this._getEngine()!.updateDynamicTexture(\r\n this._texture,\r\n this._canvas,\r\n invertY === undefined ? true : invertY,\r\n premulAlpha,\r\n this._format || undefined,\r\n undefined,\r\n allowGPUOptimization\r\n );\r\n }\r\n\r\n /**\r\n * Draws text onto the texture\r\n * @param text defines the text to be drawn\r\n * @param x defines the placement of the text from the left\r\n * @param y defines the placement of the text from the top when invertY is true and from the bottom when false\r\n * @param font defines the font to be used with font-style, font-size, font-name\r\n * @param color defines the color used for the text\r\n * @param fillColor defines the color for the canvas, use null to not overwrite canvas (this bleands with the background to replace, use the clear function)\r\n * @param invertY defines the direction for the Y axis (default is true - y increases downwards)\r\n * @param update defines whether texture is immediately update (default is true)\r\n */\r\n public drawText(\r\n text: string,\r\n x: number | null | undefined,\r\n y: number | null | undefined,\r\n font: string,\r\n color: string | null,\r\n fillColor: string | null,\r\n invertY?: boolean,\r\n update = true\r\n ) {\r\n const size = this.getSize();\r\n if (fillColor) {\r\n this._context.fillStyle = fillColor;\r\n this._context.fillRect(0, 0, size.width, size.height);\r\n }\r\n\r\n this._context.font = font;\r\n if (x === null || x === undefined) {\r\n const textSize = this._context.measureText(text);\r\n x = (size.width - textSize.width) / 2;\r\n }\r\n if (y === null || y === undefined) {\r\n const fontSize = parseInt(font.replace(/\\D/g, \"\"));\r\n y = size.height / 2 + fontSize / 3.65;\r\n }\r\n\r\n this._context.fillStyle = color || \"\";\r\n this._context.fillText(text, x, y);\r\n\r\n if (update) {\r\n this.update(invertY);\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the dynamic texture.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n\r\n if (this._ownCanvas) {\r\n this._canvas?.remove?.();\r\n }\r\n (this._canvas as any) = null;\r\n (this._context as any) = null;\r\n }\r\n\r\n /**\r\n * Clones the texture\r\n * @returns the clone of the texture.\r\n */\r\n public clone(): DynamicTexture {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return this;\r\n }\r\n\r\n const textureSize = this.getSize();\r\n const newTexture = new DynamicTexture(this.name, textureSize, scene, this._generateMipMaps);\r\n\r\n // Base texture\r\n newTexture.hasAlpha = this.hasAlpha;\r\n newTexture.level = this.level;\r\n\r\n // Dynamic Texture\r\n newTexture.wrapU = this.wrapU;\r\n newTexture.wrapV = this.wrapV;\r\n\r\n return newTexture;\r\n }\r\n\r\n /**\r\n * Serializes the dynamic texture. The scene should be ready before the dynamic texture is serialized\r\n * @returns a serialized dynamic texture object\r\n */\r\n public serialize(): any {\r\n const scene = this.getScene();\r\n if (scene && !scene.isReady()) {\r\n Logger.Warn(\"The scene must be ready before serializing the dynamic texture\");\r\n }\r\n\r\n const serializationObject = super.serialize();\r\n if (DynamicTexture._IsCanvasElement(this._canvas)) {\r\n serializationObject.base64String = this._canvas.toDataURL();\r\n }\r\n\r\n serializationObject.invertY = this._invertY;\r\n serializationObject.samplingMode = this.samplingMode;\r\n\r\n return serializationObject;\r\n }\r\n\r\n private static _IsCanvasElement(canvas: HTMLCanvasElement | OffscreenCanvas | ICanvas): canvas is HTMLCanvasElement {\r\n return (canvas as HTMLCanvasElement).toDataURL !== undefined;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n this.update();\r\n }\r\n}\r\n", "import type { Scene } from \"../scene\";\r\nimport { Vector3, Vector2, TmpVectors, Vector4 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\n\r\nMesh._GroundMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n return GroundMesh.Parse(parsedMesh, scene);\r\n};\r\n\r\n/**\r\n * Mesh representing the ground\r\n */\r\nexport class GroundMesh extends Mesh {\r\n /** If octree should be generated */\r\n public generateOctree = false;\r\n\r\n private _heightQuads: { slope: Vector2; facet1: Vector4; facet2: Vector4 }[];\r\n\r\n /** @internal */\r\n public _subdivisionsX: number;\r\n /** @internal */\r\n public _subdivisionsY: number;\r\n /** @internal */\r\n public _width: number;\r\n /** @internal */\r\n public _height: number;\r\n /** @internal */\r\n public _minX: number;\r\n /** @internal */\r\n public _maxX: number;\r\n /** @internal */\r\n public _minZ: number;\r\n /** @internal */\r\n public _maxZ: number;\r\n\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n }\r\n\r\n /**\r\n * \"GroundMesh\"\r\n * @returns \"GroundMesh\"\r\n */\r\n public getClassName(): string {\r\n return \"GroundMesh\";\r\n }\r\n\r\n /**\r\n * The minimum of x and y subdivisions\r\n */\r\n public get subdivisions(): number {\r\n return Math.min(this._subdivisionsX, this._subdivisionsY);\r\n }\r\n\r\n /**\r\n * X subdivisions\r\n */\r\n public get subdivisionsX(): number {\r\n return this._subdivisionsX;\r\n }\r\n\r\n /**\r\n * Y subdivisions\r\n */\r\n public get subdivisionsY(): number {\r\n return this._subdivisionsY;\r\n }\r\n\r\n /**\r\n * This function will divide the mesh into submeshes and update an octree to help to select the right submeshes\r\n * for rendering, picking and collision computations. Please note that you must have a decent number of submeshes\r\n * to get performance improvements when using an octree.\r\n * @param chunksCount the number of submeshes the mesh will be divided into\r\n * @param octreeBlocksSize the maximum size of the octree blocks (Default: 32)\r\n */\r\n public optimize(chunksCount: number, octreeBlocksSize = 32): void {\r\n this._subdivisionsX = chunksCount;\r\n this._subdivisionsY = chunksCount;\r\n this.subdivide(chunksCount);\r\n\r\n // Call the octree system optimization if it is defined.\r\n const thisAsAny = this as any;\r\n if (thisAsAny.createOrUpdateSubmeshesOctree) {\r\n thisAsAny.createOrUpdateSubmeshesOctree(octreeBlocksSize);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a height (y) value in the World system :\r\n * the ground altitude at the coordinates (x, z) expressed in the World system.\r\n * @param x x coordinate\r\n * @param z z coordinate\r\n * @returns the ground y position if (x, z) are outside the ground surface.\r\n */\r\n public getHeightAtCoordinates(x: number, z: number): number {\r\n const world = this.getWorldMatrix();\r\n const invMat = TmpVectors.Matrix[5];\r\n world.invertToRef(invMat);\r\n const tmpVect = TmpVectors.Vector3[8];\r\n Vector3.TransformCoordinatesFromFloatsToRef(x, 0.0, z, invMat, tmpVect); // transform x,z in the mesh local space\r\n x = tmpVect.x;\r\n z = tmpVect.z;\r\n if (x < this._minX || x >= this._maxX || z <= this._minZ || z > this._maxZ) {\r\n return this.position.y;\r\n }\r\n if (!this._heightQuads || this._heightQuads.length == 0) {\r\n this._initHeightQuads();\r\n this._computeHeightQuads();\r\n }\r\n const facet = this._getFacetAt(x, z);\r\n const y = -(facet.x * x + facet.z * z + facet.w) / facet.y;\r\n // return y in the World system\r\n Vector3.TransformCoordinatesFromFloatsToRef(0.0, y, 0.0, world, tmpVect);\r\n return tmpVect.y;\r\n }\r\n\r\n /**\r\n * Returns a normalized vector (Vector3) orthogonal to the ground\r\n * at the ground coordinates (x, z) expressed in the World system.\r\n * @param x x coordinate\r\n * @param z z coordinate\r\n * @returns Vector3(0.0, 1.0, 0.0) if (x, z) are outside the ground surface.\r\n */\r\n public getNormalAtCoordinates(x: number, z: number): Vector3 {\r\n const normal = new Vector3(0.0, 1.0, 0.0);\r\n this.getNormalAtCoordinatesToRef(x, z, normal);\r\n return normal;\r\n }\r\n\r\n /**\r\n * Updates the Vector3 passed a reference with a normalized vector orthogonal to the ground\r\n * at the ground coordinates (x, z) expressed in the World system.\r\n * Doesn't update the reference Vector3 if (x, z) are outside the ground surface.\r\n * @param x x coordinate\r\n * @param z z coordinate\r\n * @param ref vector to store the result\r\n * @returns the GroundMesh.\r\n */\r\n public getNormalAtCoordinatesToRef(x: number, z: number, ref: Vector3): GroundMesh {\r\n const world = this.getWorldMatrix();\r\n const tmpMat = TmpVectors.Matrix[5];\r\n world.invertToRef(tmpMat);\r\n const tmpVect = TmpVectors.Vector3[8];\r\n Vector3.TransformCoordinatesFromFloatsToRef(x, 0.0, z, tmpMat, tmpVect); // transform x,z in the mesh local space\r\n x = tmpVect.x;\r\n z = tmpVect.z;\r\n if (x < this._minX || x > this._maxX || z < this._minZ || z > this._maxZ) {\r\n return this;\r\n }\r\n if (!this._heightQuads || this._heightQuads.length == 0) {\r\n this._initHeightQuads();\r\n this._computeHeightQuads();\r\n }\r\n const facet = this._getFacetAt(x, z);\r\n Vector3.TransformNormalFromFloatsToRef(facet.x, facet.y, facet.z, world, ref);\r\n return this;\r\n }\r\n\r\n /**\r\n * Force the heights to be recomputed for getHeightAtCoordinates() or getNormalAtCoordinates()\r\n * if the ground has been updated.\r\n * This can be used in the render loop.\r\n * @returns the GroundMesh.\r\n */\r\n public updateCoordinateHeights(): GroundMesh {\r\n if (!this._heightQuads || this._heightQuads.length == 0) {\r\n this._initHeightQuads();\r\n }\r\n this._computeHeightQuads();\r\n return this;\r\n }\r\n\r\n // Returns the element \"facet\" from the heightQuads array relative to (x, z) local coordinates\r\n private _getFacetAt(x: number, z: number): Vector4 {\r\n // retrieve col and row from x, z coordinates in the ground local system\r\n const col = Math.floor(((x + this._maxX) * this._subdivisionsX) / this._width);\r\n const row = Math.floor((-(z + this._maxZ) * this._subdivisionsY) / this._height + this._subdivisionsY);\r\n const quad = this._heightQuads[row * this._subdivisionsX + col];\r\n let facet;\r\n if (z < quad.slope.x * x + quad.slope.y) {\r\n facet = quad.facet1;\r\n } else {\r\n facet = quad.facet2;\r\n }\r\n return facet;\r\n }\r\n\r\n // Creates and populates the heightMap array with \"facet\" elements :\r\n // a quad is two triangular facets separated by a slope, so a \"facet\" element is 1 slope + 2 facets\r\n // slope : Vector2(c, h) = 2D diagonal line equation setting apart two triangular facets in a quad : z = cx + h\r\n // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0\r\n // facet2 : Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0\r\n // Returns the GroundMesh.\r\n private _initHeightQuads(): GroundMesh {\r\n const subdivisionsX = this._subdivisionsX;\r\n const subdivisionsY = this._subdivisionsY;\r\n this._heightQuads = new Array();\r\n for (let row = 0; row < subdivisionsY; row++) {\r\n for (let col = 0; col < subdivisionsX; col++) {\r\n const quad = { slope: Vector2.Zero(), facet1: new Vector4(0.0, 0.0, 0.0, 0.0), facet2: new Vector4(0.0, 0.0, 0.0, 0.0) };\r\n this._heightQuads[row * subdivisionsX + col] = quad;\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n // Compute each quad element values and update the heightMap array :\r\n // slope : Vector2(c, h) = 2D diagonal line equation setting apart two triangular facets in a quad : z = cx + h\r\n // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0\r\n // facet2 : Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0\r\n // Returns the GroundMesh.\r\n private _computeHeightQuads(): GroundMesh {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (!positions) {\r\n return this;\r\n }\r\n\r\n const v1 = TmpVectors.Vector3[3];\r\n const v2 = TmpVectors.Vector3[2];\r\n const v3 = TmpVectors.Vector3[1];\r\n const v4 = TmpVectors.Vector3[0];\r\n const v1v2 = TmpVectors.Vector3[4];\r\n const v1v3 = TmpVectors.Vector3[5];\r\n const v1v4 = TmpVectors.Vector3[6];\r\n const norm1 = TmpVectors.Vector3[7];\r\n const norm2 = TmpVectors.Vector3[8];\r\n let i = 0;\r\n let j = 0;\r\n let k = 0;\r\n let cd = 0; // 2D slope coefficient : z = cd * x + h\r\n let h = 0;\r\n let d1 = 0; // facet plane equation : ax + by + cz + d = 0\r\n let d2 = 0;\r\n\r\n const subdivisionsX = this._subdivisionsX;\r\n const subdivisionsY = this._subdivisionsY;\r\n\r\n for (let row = 0; row < subdivisionsY; row++) {\r\n for (let col = 0; col < subdivisionsX; col++) {\r\n i = col * 3;\r\n j = row * (subdivisionsX + 1) * 3;\r\n k = (row + 1) * (subdivisionsX + 1) * 3;\r\n v1.x = positions[j + i];\r\n v1.y = positions[j + i + 1];\r\n v1.z = positions[j + i + 2];\r\n v2.x = positions[j + i + 3];\r\n v2.y = positions[j + i + 4];\r\n v2.z = positions[j + i + 5];\r\n v3.x = positions[k + i];\r\n v3.y = positions[k + i + 1];\r\n v3.z = positions[k + i + 2];\r\n v4.x = positions[k + i + 3];\r\n v4.y = positions[k + i + 4];\r\n v4.z = positions[k + i + 5];\r\n\r\n // 2D slope V1V4\r\n cd = (v4.z - v1.z) / (v4.x - v1.x);\r\n h = v1.z - cd * v1.x; // v1 belongs to the slope\r\n\r\n // facet equations :\r\n // we compute each facet normal vector\r\n // the equation of the facet plane is : norm.x * x + norm.y * y + norm.z * z + d = 0\r\n // we compute the value d by applying the equation to v1 which belongs to the plane\r\n // then we store the facet equation in a Vector4\r\n v2.subtractToRef(v1, v1v2);\r\n v3.subtractToRef(v1, v1v3);\r\n v4.subtractToRef(v1, v1v4);\r\n Vector3.CrossToRef(v1v4, v1v3, norm1); // caution : CrossToRef uses the Tmp class\r\n Vector3.CrossToRef(v1v2, v1v4, norm2);\r\n norm1.normalize();\r\n norm2.normalize();\r\n d1 = -(norm1.x * v1.x + norm1.y * v1.y + norm1.z * v1.z);\r\n d2 = -(norm2.x * v2.x + norm2.y * v2.y + norm2.z * v2.z);\r\n\r\n const quad = this._heightQuads[row * subdivisionsX + col];\r\n quad.slope.copyFromFloats(cd, h);\r\n quad.facet1.copyFromFloats(norm1.x, norm1.y, norm1.z, d1);\r\n quad.facet2.copyFromFloats(norm2.x, norm2.y, norm2.z, d2);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Serializes this ground mesh\r\n * @param serializationObject object to write serialization to\r\n */\r\n public serialize(serializationObject: any): void {\r\n super.serialize(serializationObject);\r\n serializationObject.subdivisionsX = this._subdivisionsX;\r\n serializationObject.subdivisionsY = this._subdivisionsY;\r\n\r\n serializationObject.minX = this._minX;\r\n serializationObject.maxX = this._maxX;\r\n\r\n serializationObject.minZ = this._minZ;\r\n serializationObject.maxZ = this._maxZ;\r\n\r\n serializationObject.width = this._width;\r\n serializationObject.height = this._height;\r\n }\r\n\r\n /**\r\n * Parses a serialized ground mesh\r\n * @param parsedMesh the serialized mesh\r\n * @param scene the scene to create the ground mesh in\r\n * @returns the created ground mesh\r\n */\r\n public static Parse(parsedMesh: any, scene: Scene): GroundMesh {\r\n const result = new GroundMesh(parsedMesh.name, scene);\r\n\r\n result._subdivisionsX = parsedMesh.subdivisionsX || 1;\r\n result._subdivisionsY = parsedMesh.subdivisionsY || 1;\r\n\r\n result._minX = parsedMesh.minX;\r\n result._maxX = parsedMesh.maxX;\r\n\r\n result._minZ = parsedMesh.minZ;\r\n result._maxZ = parsedMesh.maxZ;\r\n\r\n result._width = parsedMesh.width;\r\n result._height = parsedMesh.height;\r\n\r\n return result;\r\n }\r\n}\r\n", "import type { Scene } from \"../../scene\";\r\nimport { Vector3 } from \"../../Maths/math.vector\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport { GroundMesh } from \"../groundMesh\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport { Epsilon } from \"../../Maths/math.constants\";\r\nimport { CompatibilityOptions } from \"../../Compat/compatibilityOptions\";\r\n\r\n/**\r\n * Creates the VertexData for a Ground\r\n * @param options an object used to set the following optional parameters for the Ground, required but can be empty\r\n * @param options.width the width (x direction) of the ground, optional, default 1\r\n * @param options.height the height (z direction) of the ground, optional, default 1\r\n * @param options.subdivisions the number of subdivisions per side, optional, default 1\r\n * @param options.subdivisionsX the number of subdivisions in the x direction, overrides options.subdivisions, optional, default undefined\r\n * @param options.subdivisionsY the number of subdivisions in the y direction, overrides options.subdivisions, optional, default undefined\r\n * @returns the VertexData of the Ground\r\n */\r\nexport function CreateGroundVertexData(options: { width?: number; height?: number; subdivisions?: number; subdivisionsX?: number; subdivisionsY?: number }): VertexData {\r\n const indices = [];\r\n const positions = [];\r\n const normals = [];\r\n const uvs = [];\r\n let row: number, col: number;\r\n\r\n const width: number = options.width || 1;\r\n const height: number = options.height || 1;\r\n const subdivisionsX: number = (options.subdivisionsX || options.subdivisions || 1) | 0;\r\n const subdivisionsY: number = (options.subdivisionsY || options.subdivisions || 1) | 0;\r\n\r\n for (row = 0; row <= subdivisionsY; row++) {\r\n for (col = 0; col <= subdivisionsX; col++) {\r\n const position = new Vector3((col * width) / subdivisionsX - width / 2.0, 0, ((subdivisionsY - row) * height) / subdivisionsY - height / 2.0);\r\n const normal = new Vector3(0, 1.0, 0);\r\n\r\n positions.push(position.x, position.y, position.z);\r\n normals.push(normal.x, normal.y, normal.z);\r\n uvs.push(col / subdivisionsX, CompatibilityOptions.UseOpenGLOrientationForUV ? row / subdivisionsY : 1.0 - row / subdivisionsY);\r\n }\r\n }\r\n\r\n for (row = 0; row < subdivisionsY; row++) {\r\n for (col = 0; col < subdivisionsX; col++) {\r\n indices.push(col + 1 + (row + 1) * (subdivisionsX + 1));\r\n indices.push(col + 1 + row * (subdivisionsX + 1));\r\n indices.push(col + row * (subdivisionsX + 1));\r\n\r\n indices.push(col + (row + 1) * (subdivisionsX + 1));\r\n indices.push(col + 1 + (row + 1) * (subdivisionsX + 1));\r\n indices.push(col + row * (subdivisionsX + 1));\r\n }\r\n }\r\n\r\n // Result\r\n const vertexData = new VertexData();\r\n\r\n vertexData.indices = indices;\r\n vertexData.positions = positions;\r\n vertexData.normals = normals;\r\n vertexData.uvs = uvs;\r\n\r\n return vertexData;\r\n}\r\n\r\n/**\r\n * Creates the VertexData for a TiledGround by subdividing the ground into tiles\r\n * @param options an object used to set the following optional parameters for the Ground\r\n * @param options.xmin ground minimum X coordinate, default -1\r\n * @param options.zmin ground minimum Z coordinate, default -1\r\n * @param options.xmax ground maximum X coordinate, default 1\r\n * @param options.zmax ground maximum Z coordinate, default 1\r\n * @param options.subdivisions a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the ground width and height creating 'tiles', default {w: 6, h: 6}\r\n * @param options.subdivisions.w positive integer, default 6\r\n * @param options.subdivisions.h positive integer, default 6\r\n * @param options.precision a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the tile width and height, default {w: 2, h: 2}\r\n * @param options.precision.w positive integer, default 2\r\n * @param options.precision.h positive integer, default 2\r\n * @returns the VertexData of the TiledGround\r\n */\r\nexport function CreateTiledGroundVertexData(options: {\r\n xmin: number;\r\n zmin: number;\r\n xmax: number;\r\n zmax: number;\r\n subdivisions?: { w: number; h: number };\r\n precision?: { w: number; h: number };\r\n}): VertexData {\r\n const xmin = options.xmin !== undefined && options.xmin !== null ? options.xmin : -1.0;\r\n const zmin = options.zmin !== undefined && options.zmin !== null ? options.zmin : -1.0;\r\n const xmax = options.xmax !== undefined && options.xmax !== null ? options.xmax : 1.0;\r\n const zmax = options.zmax !== undefined && options.zmax !== null ? options.zmax : 1.0;\r\n const subdivisions = options.subdivisions || { w: 1, h: 1 };\r\n const precision = options.precision || { w: 1, h: 1 };\r\n\r\n const indices: number[] = [];\r\n const positions: number[] = [];\r\n const normals: number[] = [];\r\n const uvs: number[] = [];\r\n let row: number, col: number, tileRow: number, tileCol: number;\r\n\r\n subdivisions.h = subdivisions.h < 1 ? 1 : subdivisions.h;\r\n subdivisions.w = subdivisions.w < 1 ? 1 : subdivisions.w;\r\n precision.w = precision.w < 1 ? 1 : precision.w;\r\n precision.h = precision.h < 1 ? 1 : precision.h;\r\n\r\n const tileSize = {\r\n w: (xmax - xmin) / subdivisions.w,\r\n h: (zmax - zmin) / subdivisions.h,\r\n };\r\n\r\n function applyTile(xTileMin: number, zTileMin: number, xTileMax: number, zTileMax: number) {\r\n // Indices\r\n const base = positions.length / 3;\r\n const rowLength = precision.w + 1;\r\n for (row = 0; row < precision.h; row++) {\r\n for (col = 0; col < precision.w; col++) {\r\n const square = [base + col + row * rowLength, base + (col + 1) + row * rowLength, base + (col + 1) + (row + 1) * rowLength, base + col + (row + 1) * rowLength];\r\n\r\n indices.push(square[1]);\r\n indices.push(square[2]);\r\n indices.push(square[3]);\r\n indices.push(square[0]);\r\n indices.push(square[1]);\r\n indices.push(square[3]);\r\n }\r\n }\r\n\r\n // Position, normals and uvs\r\n const position = Vector3.Zero();\r\n const normal = new Vector3(0, 1.0, 0);\r\n for (row = 0; row <= precision.h; row++) {\r\n position.z = (row * (zTileMax - zTileMin)) / precision.h + zTileMin;\r\n for (col = 0; col <= precision.w; col++) {\r\n position.x = (col * (xTileMax - xTileMin)) / precision.w + xTileMin;\r\n position.y = 0;\r\n\r\n positions.push(position.x, position.y, position.z);\r\n normals.push(normal.x, normal.y, normal.z);\r\n uvs.push(col / precision.w, row / precision.h);\r\n }\r\n }\r\n }\r\n\r\n for (tileRow = 0; tileRow < subdivisions.h; tileRow++) {\r\n for (tileCol = 0; tileCol < subdivisions.w; tileCol++) {\r\n applyTile(xmin + tileCol * tileSize.w, zmin + tileRow * tileSize.h, xmin + (tileCol + 1) * tileSize.w, zmin + (tileRow + 1) * tileSize.h);\r\n }\r\n }\r\n\r\n // Result\r\n const vertexData = new VertexData();\r\n\r\n vertexData.indices = indices;\r\n vertexData.positions = positions;\r\n vertexData.normals = normals;\r\n vertexData.uvs = uvs;\r\n\r\n return vertexData;\r\n}\r\n\r\n/**\r\n * Creates the VertexData of the Ground designed from a heightmap\r\n * @param options an object used to set the following parameters for the Ground, required and provided by CreateGroundFromHeightMap\r\n * @param options.width the width (x direction) of the ground\r\n * @param options.height the height (z direction) of the ground\r\n * @param options.subdivisions the number of subdivisions per side\r\n * @param options.minHeight the minimum altitude on the ground, optional, default 0\r\n * @param options.maxHeight the maximum altitude on the ground, optional default 1\r\n * @param options.colorFilter the filter to apply to the image pixel colors to compute the height, optional Color3, default (0.3, 0.59, 0.11)\r\n * @param options.buffer the array holding the image color data\r\n * @param options.bufferWidth the width of image\r\n * @param options.bufferHeight the height of image\r\n * @param options.alphaFilter Remove any data where the alpha channel is below this value, defaults 0 (all data visible)\r\n * @param options.heightBuffer a array of floats where the height data can be saved, if its length is greater than zero.\r\n * @returns the VertexData of the Ground designed from a heightmap\r\n */\r\nexport function CreateGroundFromHeightMapVertexData(options: {\r\n width: number;\r\n height: number;\r\n subdivisions: number;\r\n minHeight: number;\r\n maxHeight: number;\r\n colorFilter: Color3;\r\n buffer: Uint8Array;\r\n bufferWidth: number;\r\n bufferHeight: number;\r\n alphaFilter: number;\r\n heightBuffer?: Float32Array;\r\n}): VertexData {\r\n const indices = [];\r\n const positions = [];\r\n const normals = [];\r\n const uvs = [];\r\n let row, col;\r\n const filter = options.colorFilter || new Color3(0.3, 0.59, 0.11);\r\n const alphaFilter = options.alphaFilter || 0.0;\r\n let invert = false;\r\n\r\n if (options.minHeight > options.maxHeight) {\r\n invert = true;\r\n const temp = options.maxHeight;\r\n options.maxHeight = options.minHeight;\r\n options.minHeight = temp;\r\n }\r\n\r\n // Vertices\r\n for (row = 0; row <= options.subdivisions; row++) {\r\n for (col = 0; col <= options.subdivisions; col++) {\r\n const position = new Vector3(\r\n (col * options.width) / options.subdivisions - options.width / 2.0,\r\n 0,\r\n ((options.subdivisions - row) * options.height) / options.subdivisions - options.height / 2.0\r\n );\r\n\r\n // Compute height\r\n const heightMapX = (((position.x + options.width / 2) / options.width) * (options.bufferWidth - 1)) | 0;\r\n const heightMapY = ((1.0 - (position.z + options.height / 2) / options.height) * (options.bufferHeight - 1)) | 0;\r\n const pos = (heightMapX + heightMapY * options.bufferWidth) * 4;\r\n let r = options.buffer[pos] / 255.0;\r\n let g = options.buffer[pos + 1] / 255.0;\r\n let b = options.buffer[pos + 2] / 255.0;\r\n const a = options.buffer[pos + 3] / 255.0;\r\n\r\n if (invert) {\r\n r = 1.0 - r;\r\n g = 1.0 - g;\r\n b = 1.0 - b;\r\n }\r\n\r\n const gradient = r * filter.r + g * filter.g + b * filter.b;\r\n\r\n // If our alpha channel is not within our filter then we will assign a 'special' height\r\n // Then when building the indices, we will ignore any vertex that is using the special height\r\n if (a >= alphaFilter) {\r\n position.y = options.minHeight + (options.maxHeight - options.minHeight) * gradient;\r\n } else {\r\n position.y = options.minHeight - Epsilon; // We can't have a height below minHeight, normally.\r\n }\r\n if (options.heightBuffer) {\r\n // set the height buffer information in row major order.\r\n options.heightBuffer[row * (options.subdivisions + 1) + col] = position.y;\r\n }\r\n\r\n // Add vertex\r\n positions.push(position.x, position.y, position.z);\r\n normals.push(0, 0, 0);\r\n uvs.push(col / options.subdivisions, 1.0 - row / options.subdivisions);\r\n }\r\n }\r\n\r\n // Indices\r\n for (row = 0; row < options.subdivisions; row++) {\r\n for (col = 0; col < options.subdivisions; col++) {\r\n // Calculate Indices\r\n const idx1 = col + 1 + (row + 1) * (options.subdivisions + 1);\r\n const idx2 = col + 1 + row * (options.subdivisions + 1);\r\n const idx3 = col + row * (options.subdivisions + 1);\r\n const idx4 = col + (row + 1) * (options.subdivisions + 1);\r\n\r\n // Check that all indices are visible (based on our special height)\r\n // Only display the vertex if all Indices are visible\r\n // Positions are stored x,y,z for each vertex, hence the * 3 and + 1 for height\r\n const isVisibleIdx1 = positions[idx1 * 3 + 1] >= options.minHeight;\r\n const isVisibleIdx2 = positions[idx2 * 3 + 1] >= options.minHeight;\r\n const isVisibleIdx3 = positions[idx3 * 3 + 1] >= options.minHeight;\r\n if (isVisibleIdx1 && isVisibleIdx2 && isVisibleIdx3) {\r\n indices.push(idx1);\r\n indices.push(idx2);\r\n indices.push(idx3);\r\n }\r\n\r\n const isVisibleIdx4 = positions[idx4 * 3 + 1] >= options.minHeight;\r\n if (isVisibleIdx4 && isVisibleIdx1 && isVisibleIdx3) {\r\n indices.push(idx4);\r\n indices.push(idx1);\r\n indices.push(idx3);\r\n }\r\n }\r\n }\r\n\r\n // Normals\r\n VertexData.ComputeNormals(positions, indices, normals);\r\n\r\n // Result\r\n const vertexData = new VertexData();\r\n\r\n vertexData.indices = indices;\r\n vertexData.positions = positions;\r\n vertexData.normals = normals;\r\n vertexData.uvs = uvs;\r\n\r\n return vertexData;\r\n}\r\n\r\n/**\r\n * Creates a ground mesh\r\n * @param name defines the name of the mesh\r\n * @param options defines the options used to create the mesh\r\n * @param options.width set the width size (float, default 1)\r\n * @param options.height set the height size (float, default 1)\r\n * @param options.subdivisions sets the number of subdivision per side (default 1)\r\n * @param options.subdivisionsX sets the number of subdivision on the X axis (overrides subdivisions)\r\n * @param options.subdivisionsY sets the number of subdivision on the Y axis (overrides subdivisions)\r\n * @param options.updatable defines if the mesh must be flagged as updatable (default false)\r\n * @param scene defines the hosting scene\r\n * @returns the ground mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#ground\r\n */\r\nexport function CreateGround(\r\n name: string,\r\n options: { width?: number; height?: number; subdivisions?: number; subdivisionsX?: number; subdivisionsY?: number; updatable?: boolean } = {},\r\n scene?: Scene\r\n): GroundMesh {\r\n const ground = new GroundMesh(name, scene);\r\n ground._setReady(false);\r\n ground._subdivisionsX = options.subdivisionsX || options.subdivisions || 1;\r\n ground._subdivisionsY = options.subdivisionsY || options.subdivisions || 1;\r\n ground._width = options.width || 1;\r\n ground._height = options.height || 1;\r\n ground._maxX = ground._width / 2;\r\n ground._maxZ = ground._height / 2;\r\n ground._minX = -ground._maxX;\r\n ground._minZ = -ground._maxZ;\r\n\r\n const vertexData = CreateGroundVertexData(options);\r\n\r\n vertexData.applyToMesh(ground, options.updatable);\r\n\r\n ground._setReady(true);\r\n\r\n return ground;\r\n}\r\n\r\n/**\r\n * Creates a tiled ground mesh\r\n * @param name defines the name of the mesh\r\n * @param options defines the options used to create the mesh\r\n * @param options.xmin ground minimum X coordinate (float, default -1)\r\n * @param options.zmin ground minimum Z coordinate (float, default -1)\r\n * @param options.xmax ground maximum X coordinate (float, default 1)\r\n * @param options.zmax ground maximum Z coordinate (float, default 1)\r\n * @param options.subdivisions a javascript object `{w: positive integer, h: positive integer}` (default `{w: 6, h: 6}`). `w` and `h` are the numbers of subdivisions on the ground width and height. Each subdivision is called a tile\r\n * @param options.subdivisions.w positive integer, default 6\r\n * @param options.subdivisions.h positive integer, default 6\r\n * @param options.precision a javascript object `{w: positive integer, h: positive integer}` (default `{w: 2, h: 2}`). `w` and `h` are the numbers of subdivisions on the ground width and height of each tile\r\n * @param options.precision.w positive integer, default 2\r\n * @param options.precision.h positive integer, default 2\r\n * @param options.updatable boolean, default false, true if the mesh must be flagged as updatable\r\n * @param scene defines the hosting scene\r\n * @returns the tiled ground mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#tiled-ground\r\n */\r\nexport function CreateTiledGround(\r\n name: string,\r\n options: { xmin: number; zmin: number; xmax: number; zmax: number; subdivisions?: { w: number; h: number }; precision?: { w: number; h: number }; updatable?: boolean },\r\n scene: Nullable = null\r\n): Mesh {\r\n const tiledGround = new Mesh(name, scene);\r\n\r\n const vertexData = CreateTiledGroundVertexData(options);\r\n\r\n vertexData.applyToMesh(tiledGround, options.updatable);\r\n\r\n return tiledGround;\r\n}\r\n\r\n/**\r\n * Creates a ground mesh from a height map. The height map download can take some frames,\r\n * so the mesh is not immediately ready. To wait for the mesh to be completely built,\r\n * you should use the `onReady` callback option.\r\n * @param name defines the name of the mesh\r\n * @param url sets the URL of the height map image resource.\r\n * @param options defines the options used to create the mesh\r\n * @param options.width sets the ground width size (positive float, default 10)\r\n * @param options.height sets the ground height size (positive float, default 10)\r\n * @param options.subdivisions sets the number of subdivision per side (positive integer, default 1)\r\n * @param options.minHeight is the minimum altitude on the ground (float, default 0)\r\n * @param options.maxHeight is the maximum altitude on the ground (float, default 1)\r\n * @param options.colorFilter is the filter to apply to the image pixel colors to compute the height (optional Color3, default (0.3, 0.59, 0.11) )\r\n * @param options.alphaFilter will filter any data where the alpha channel is below this value, defaults 0 (all data visible)\r\n * @param options.updatable defines if the mesh must be flagged as updatable\r\n * @param options.onReady is a javascript callback function that will be called once the mesh is just built (the height map download can last some time)\r\n * @param options.onError is a javascript callback function that will be called if there is an error\r\n * @param options.passHeightBufferInCallback a boolean that indicates if the calculated height data will be passed in the onReady callback. Useful if you need the height data for physics, for example.\r\n * @param scene defines the hosting scene\r\n * @returns the ground mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/height_map\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#ground-from-a-height-map\r\n */\r\nexport function CreateGroundFromHeightMap(\r\n name: string,\r\n url: string | { data: Uint8Array; width: number; height: number },\r\n options: {\r\n width?: number;\r\n height?: number;\r\n subdivisions?: number;\r\n minHeight?: number;\r\n maxHeight?: number;\r\n colorFilter?: Color3;\r\n alphaFilter?: number;\r\n updatable?: boolean;\r\n onReady?: (mesh: GroundMesh, heightBuffer?: Float32Array) => void;\r\n onError?: (message?: string, exception?: any) => void;\r\n passHeightBufferInCallback?: boolean;\r\n } = {},\r\n scene: Nullable = null\r\n): GroundMesh {\r\n const width = options.width || 10.0;\r\n const height = options.height || 10.0;\r\n const subdivisions = options.subdivisions || 1 | 0;\r\n const minHeight = options.minHeight || 0.0;\r\n const maxHeight = options.maxHeight || 1.0;\r\n const filter = options.colorFilter || new Color3(0.3, 0.59, 0.11);\r\n const alphaFilter = options.alphaFilter || 0.0;\r\n const updatable = options.updatable;\r\n const onReady = options.onReady;\r\n\r\n scene = scene || EngineStore.LastCreatedScene!;\r\n\r\n const ground = new GroundMesh(name, scene);\r\n ground._subdivisionsX = subdivisions;\r\n ground._subdivisionsY = subdivisions;\r\n ground._width = width;\r\n ground._height = height;\r\n ground._maxX = ground._width / 2.0;\r\n ground._maxZ = ground._height / 2.0;\r\n ground._minX = -ground._maxX;\r\n ground._minZ = -ground._maxZ;\r\n\r\n ground._setReady(false);\r\n\r\n let heightBuffer: Float32Array;\r\n if (options.passHeightBufferInCallback) {\r\n heightBuffer = new Float32Array((subdivisions + 1) * (subdivisions + 1));\r\n }\r\n\r\n const onBufferLoaded = (buffer: Uint8Array, bufferWidth: number, bufferHeight: number) => {\r\n const vertexData = CreateGroundFromHeightMapVertexData({\r\n width: width,\r\n height: height,\r\n subdivisions: subdivisions,\r\n minHeight: minHeight,\r\n maxHeight: maxHeight,\r\n colorFilter: filter,\r\n buffer: buffer,\r\n bufferWidth: bufferWidth,\r\n bufferHeight: bufferHeight,\r\n alphaFilter: alphaFilter,\r\n heightBuffer,\r\n });\r\n\r\n vertexData.applyToMesh(ground, updatable);\r\n\r\n //execute ready callback, if set\r\n if (onReady) {\r\n onReady(ground, heightBuffer);\r\n }\r\n\r\n ground._setReady(true);\r\n };\r\n\r\n if (typeof url === \"string\") {\r\n const onload = (img: HTMLImageElement | ImageBitmap) => {\r\n const bufferWidth = img.width;\r\n const bufferHeight = img.height;\r\n\r\n if (scene!.isDisposed) {\r\n return;\r\n }\r\n\r\n const buffer = scene?.getEngine().resizeImageBitmap(img, bufferWidth, bufferHeight);\r\n\r\n onBufferLoaded(buffer, bufferWidth, bufferHeight);\r\n };\r\n\r\n Tools.LoadImage(url, onload, options.onError ? options.onError : () => {}, scene.offlineProvider);\r\n } else {\r\n onBufferLoaded(url.data, url.width, url.height);\r\n }\r\n\r\n return ground;\r\n}\r\n/**\r\n * Class containing static functions to help procedurally build meshes\r\n * @deprecated use the functions directly from the module\r\n */\r\nexport const GroundBuilder = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CreateGround,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CreateGroundFromHeightMap,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CreateTiledGround,\r\n};\r\n\r\nVertexData.CreateGround = CreateGroundVertexData;\r\nVertexData.CreateTiledGround = CreateTiledGroundVertexData;\r\nVertexData.CreateGroundFromHeightMap = CreateGroundFromHeightMapVertexData;\r\n\r\nMesh.CreateGround = (name: string, width: number, height: number, subdivisions: number, scene?: Scene, updatable?: boolean): Mesh => {\r\n const options = {\r\n width,\r\n height,\r\n subdivisions,\r\n updatable,\r\n };\r\n\r\n return CreateGround(name, options, scene);\r\n};\r\n\r\nMesh.CreateTiledGround = (\r\n name: string,\r\n xmin: number,\r\n zmin: number,\r\n xmax: number,\r\n zmax: number,\r\n subdivisions: { w: number; h: number },\r\n precision: { w: number; h: number },\r\n scene: Scene,\r\n updatable?: boolean\r\n): Mesh => {\r\n const options = {\r\n xmin,\r\n zmin,\r\n xmax,\r\n zmax,\r\n subdivisions,\r\n precision,\r\n updatable,\r\n };\r\n\r\n return CreateTiledGround(name, options, scene);\r\n};\r\n\r\nMesh.CreateGroundFromHeightMap = (\r\n name: string,\r\n url: string,\r\n width: number,\r\n height: number,\r\n subdivisions: number,\r\n minHeight: number,\r\n maxHeight: number,\r\n scene: Scene,\r\n updatable?: boolean,\r\n onReady?: (mesh: GroundMesh) => void,\r\n alphaFilter?: number\r\n): GroundMesh => {\r\n const options = {\r\n width,\r\n height,\r\n subdivisions,\r\n minHeight,\r\n maxHeight,\r\n updatable,\r\n onReady,\r\n alphaFilter,\r\n };\r\n\r\n return CreateGroundFromHeightMap(name, url, options, scene);\r\n};\r\n", "import { serializeAsColor3, serializeAsVector3 } from \"../Misc/decorators\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { Node } from \"../node\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Light } from \"./light\";\r\nimport type { IShadowGenerator } from \"./Shadows/shadowGenerator\";\r\n\r\nNode.AddNodeConstructor(\"Light_Type_3\", (name, scene) => {\r\n return () => new HemisphericLight(name, Vector3.Zero(), scene);\r\n});\r\n\r\n/**\r\n * The HemisphericLight simulates the ambient environment light,\r\n * so the passed direction is the light reflection direction, not the incoming direction.\r\n */\r\nexport class HemisphericLight extends Light {\r\n /**\r\n * The groundColor is the light in the opposite direction to the one specified during creation.\r\n * You can think of the diffuse and specular light as coming from the centre of the object in the given direction and the groundColor light in the opposite direction.\r\n */\r\n @serializeAsColor3()\r\n public groundColor = new Color3(0.0, 0.0, 0.0);\r\n\r\n /**\r\n * The light reflection direction, not the incoming direction.\r\n */\r\n @serializeAsVector3()\r\n public direction: Vector3;\r\n\r\n /**\r\n * Creates a HemisphericLight object in the scene according to the passed direction (Vector3).\r\n * The HemisphericLight simulates the ambient environment light, so the passed direction is the light reflection direction, not the incoming direction.\r\n * The HemisphericLight can't cast shadows.\r\n * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction\r\n * @param name The friendly name of the light\r\n * @param direction The direction of the light reflection\r\n * @param scene The scene the light belongs to\r\n */\r\n constructor(name: string, direction: Vector3, scene?: Scene) {\r\n super(name, scene);\r\n this.direction = direction || Vector3.Up();\r\n }\r\n\r\n protected _buildUniformLayout(): void {\r\n this._uniformBuffer.addUniform(\"vLightData\", 4);\r\n this._uniformBuffer.addUniform(\"vLightDiffuse\", 4);\r\n this._uniformBuffer.addUniform(\"vLightSpecular\", 4);\r\n this._uniformBuffer.addUniform(\"vLightGround\", 3);\r\n this._uniformBuffer.addUniform(\"shadowsInfo\", 3);\r\n this._uniformBuffer.addUniform(\"depthValues\", 2);\r\n this._uniformBuffer.create();\r\n }\r\n\r\n /**\r\n * Returns the string \"HemisphericLight\".\r\n * @returns The class name\r\n */\r\n public getClassName(): string {\r\n return \"HemisphericLight\";\r\n }\r\n\r\n /**\r\n * Sets the HemisphericLight direction towards the passed target (Vector3).\r\n * Returns the updated direction.\r\n * @param target The target the direction should point to\r\n * @returns The computed direction\r\n */\r\n public setDirectionToTarget(target: Vector3): Vector3 {\r\n this.direction = Vector3.Normalize(target.subtract(Vector3.Zero()));\r\n return this.direction;\r\n }\r\n\r\n /**\r\n * Returns the shadow generator associated to the light.\r\n * @returns Always null for hemispheric lights because it does not support shadows.\r\n */\r\n public getShadowGenerator(): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Sets the passed Effect object with the HemisphericLight normalized direction and color and the passed name (string).\r\n * @param _effect The effect to update\r\n * @param lightIndex The index of the light in the effect to update\r\n * @returns The hemispheric light\r\n */\r\n public transferToEffect(_effect: Effect, lightIndex: string): HemisphericLight {\r\n const normalizeDirection = Vector3.Normalize(this.direction);\r\n this._uniformBuffer.updateFloat4(\"vLightData\", normalizeDirection.x, normalizeDirection.y, normalizeDirection.z, 0.0, lightIndex);\r\n this._uniformBuffer.updateColor3(\"vLightGround\", this.groundColor.scale(this.intensity), lightIndex);\r\n return this;\r\n }\r\n\r\n public transferToNodeMaterialEffect(effect: Effect, lightDataUniformName: string) {\r\n const normalizeDirection = Vector3.Normalize(this.direction);\r\n effect.setFloat3(lightDataUniformName, normalizeDirection.x, normalizeDirection.y, normalizeDirection.z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Computes the world matrix of the node\r\n * @returns the world matrix\r\n */\r\n public computeWorldMatrix(): Matrix {\r\n if (!this._worldMatrix) {\r\n this._worldMatrix = Matrix.Identity();\r\n }\r\n return this._worldMatrix;\r\n }\r\n\r\n /**\r\n * Returns the integer 3.\r\n * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x\r\n */\r\n public getTypeID(): number {\r\n return Light.LIGHTTYPEID_HEMISPHERICLIGHT;\r\n }\r\n\r\n /**\r\n * Prepares the list of defines specific to the light type.\r\n * @param defines the list of defines\r\n * @param lightIndex defines the index of the light for the effect\r\n */\r\n public prepareLightSpecificDefines(defines: any, lightIndex: number): void {\r\n defines[\"HEMILIGHT\" + lightIndex] = true;\r\n }\r\n}\r\n", "import type { IDisposable } from \"../scene\";\r\nimport { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { PointerInfoPre } from \"../Events/pointerEvents\";\r\nimport { PointerInfo, PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { HemisphericLight } from \"../Lights/hemisphericLight\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { IPointerEvent } from \"../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Renders a layer on top of an existing scene\r\n */\r\nexport class UtilityLayerRenderer implements IDisposable {\r\n private _pointerCaptures: { [pointerId: number]: boolean } = {};\r\n private _lastPointerEvents: { [pointerId: number]: boolean } = {};\r\n /** @internal */\r\n public static _DefaultUtilityLayer: Nullable = null;\r\n /** @internal */\r\n public static _DefaultKeepDepthUtilityLayer: Nullable = null;\r\n private _sharedGizmoLight: Nullable = null;\r\n\r\n private _renderCamera: Nullable = null;\r\n\r\n /**\r\n * Gets the camera that is used to render the utility layer (when not set, this will be the last active camera)\r\n * @param getRigParentIfPossible if the current active camera is a rig camera, should its parent camera be returned\r\n * @returns the camera that is used when rendering the utility layer\r\n */\r\n public getRenderCamera(getRigParentIfPossible?: boolean) {\r\n if (this._renderCamera) {\r\n return this._renderCamera;\r\n } else {\r\n let activeCam: Camera;\r\n if (this.originalScene.activeCameras && this.originalScene.activeCameras.length > 1) {\r\n activeCam = this.originalScene.activeCameras[this.originalScene.activeCameras.length - 1];\r\n } else {\r\n activeCam = this.originalScene.activeCamera!;\r\n }\r\n\r\n if (getRigParentIfPossible && activeCam && activeCam.isRigCamera) {\r\n return activeCam.rigParent!;\r\n }\r\n return activeCam;\r\n }\r\n }\r\n /**\r\n * Sets the camera that should be used when rendering the utility layer (If set to null the last active camera will be used)\r\n * @param cam the camera that should be used when rendering the utility layer\r\n */\r\n public setRenderCamera(cam: Nullable) {\r\n this._renderCamera = cam;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Light which used by gizmos to get light shading\r\n */\r\n public _getSharedGizmoLight(): HemisphericLight {\r\n if (!this._sharedGizmoLight) {\r\n this._sharedGizmoLight = new HemisphericLight(\"shared gizmo light\", new Vector3(0, 1, 0), this.utilityLayerScene);\r\n this._sharedGizmoLight.intensity = 2;\r\n this._sharedGizmoLight.groundColor = Color3.Gray();\r\n }\r\n return this._sharedGizmoLight;\r\n }\r\n\r\n /**\r\n * If the picking should be done on the utility layer prior to the actual scene (Default: true)\r\n */\r\n public pickUtilitySceneFirst = true;\r\n /**\r\n * A shared utility layer that can be used to overlay objects into a scene (Depth map of the previous scene is cleared before drawing on top of it)\r\n */\r\n public static get DefaultUtilityLayer(): UtilityLayerRenderer {\r\n if (UtilityLayerRenderer._DefaultUtilityLayer == null) {\r\n return UtilityLayerRenderer._CreateDefaultUtilityLayerFromScene(EngineStore.LastCreatedScene!);\r\n }\r\n\r\n return UtilityLayerRenderer._DefaultUtilityLayer;\r\n }\r\n\r\n /**\r\n * Creates an utility layer, and set it as a default utility layer\r\n * @param scene associated scene\r\n * @internal\r\n */\r\n public static _CreateDefaultUtilityLayerFromScene(scene: Scene): UtilityLayerRenderer {\r\n UtilityLayerRenderer._DefaultUtilityLayer = new UtilityLayerRenderer(scene);\r\n UtilityLayerRenderer._DefaultUtilityLayer.originalScene.onDisposeObservable.addOnce(() => {\r\n UtilityLayerRenderer._DefaultUtilityLayer = null;\r\n });\r\n\r\n return UtilityLayerRenderer._DefaultUtilityLayer;\r\n }\r\n /**\r\n * A shared utility layer that can be used to embed objects into a scene (Depth map of the previous scene is not cleared before drawing on top of it)\r\n */\r\n public static get DefaultKeepDepthUtilityLayer(): UtilityLayerRenderer {\r\n if (UtilityLayerRenderer._DefaultKeepDepthUtilityLayer == null) {\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = new UtilityLayerRenderer(EngineStore.LastCreatedScene!);\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.utilityLayerScene.autoClearDepthAndStencil = false;\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.originalScene.onDisposeObservable.addOnce(() => {\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = null;\r\n });\r\n }\r\n return UtilityLayerRenderer._DefaultKeepDepthUtilityLayer;\r\n }\r\n\r\n /**\r\n * The scene that is rendered on top of the original scene\r\n */\r\n public utilityLayerScene: Scene;\r\n\r\n /**\r\n * If the utility layer should automatically be rendered on top of existing scene\r\n */\r\n public shouldRender: boolean = true;\r\n /**\r\n * If set to true, only pointer down onPointerObservable events will be blocked when picking is occluded by original scene\r\n */\r\n public onlyCheckPointerDownEvents = true;\r\n\r\n /**\r\n * If set to false, only pointerUp, pointerDown and pointerMove will be sent to the utilityLayerScene (false by default)\r\n */\r\n public processAllEvents = false;\r\n\r\n /**\r\n * Set to false to disable picking\r\n */\r\n public pickingEnabled = true;\r\n\r\n /**\r\n * Observable raised when the pointer moves from the utility layer scene to the main scene\r\n */\r\n public onPointerOutObservable = new Observable();\r\n\r\n /** Gets or sets a predicate that will be used to indicate utility meshes present in the main scene */\r\n public mainSceneTrackerPredicate: (mesh: Nullable) => boolean;\r\n\r\n private _afterRenderObserver: Nullable>;\r\n private _sceneDisposeObserver: Nullable>;\r\n private _originalPointerObserver: Nullable>;\r\n /**\r\n * Instantiates a UtilityLayerRenderer\r\n * @param originalScene the original scene that will be rendered on top of\r\n * @param handleEvents boolean indicating if the utility layer should handle events\r\n */\r\n constructor(\r\n /** the original scene that will be rendered on top of */\r\n public originalScene: Scene,\r\n handleEvents: boolean = true\r\n ) {\r\n // Create scene which will be rendered in the foreground and remove it from being referenced by engine to avoid interfering with existing app\r\n this.utilityLayerScene = new Scene(originalScene.getEngine(), { virtual: true });\r\n this.utilityLayerScene.useRightHandedSystem = originalScene.useRightHandedSystem;\r\n this.utilityLayerScene._allowPostProcessClearColor = false;\r\n\r\n // Deactivate post processes\r\n this.utilityLayerScene.postProcessesEnabled = false;\r\n\r\n // Detach controls on utility scene, events will be fired by logic below to handle picking priority\r\n this.utilityLayerScene.detachControl();\r\n\r\n if (handleEvents) {\r\n this._originalPointerObserver = originalScene.onPrePointerObservable.add((prePointerInfo) => {\r\n if (!this.utilityLayerScene.activeCamera) {\r\n return;\r\n }\r\n if (!this.pickingEnabled) {\r\n return;\r\n }\r\n\r\n if (!this.processAllEvents) {\r\n if (\r\n prePointerInfo.type !== PointerEventTypes.POINTERMOVE &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERUP &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERDOWN &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERDOUBLETAP\r\n ) {\r\n return;\r\n }\r\n }\r\n this.utilityLayerScene.pointerX = originalScene.pointerX;\r\n this.utilityLayerScene.pointerY = originalScene.pointerY;\r\n const pointerEvent = prePointerInfo.event;\r\n if (originalScene!.isPointerCaptured(pointerEvent.pointerId)) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n return;\r\n }\r\n\r\n const getNearPickDataForScene = (scene: Scene) => {\r\n let scenePick = null;\r\n\r\n if (prePointerInfo.nearInteractionPickingInfo) {\r\n if (prePointerInfo.nearInteractionPickingInfo.pickedMesh!.getScene() == scene) {\r\n scenePick = prePointerInfo.nearInteractionPickingInfo;\r\n } else {\r\n scenePick = new PickingInfo();\r\n }\r\n } else if (scene !== this.utilityLayerScene && prePointerInfo.originalPickingInfo) {\r\n scenePick = prePointerInfo.originalPickingInfo;\r\n } else {\r\n let previousActiveCamera: Nullable = null;\r\n // If a camera is set for rendering with this layer\r\n // it will also be used for the ray computation\r\n // To preserve back compat and because scene.pick always use activeCamera\r\n // it's substituted temporarily and a new scenePick is forced.\r\n // otherwise, the ray with previously active camera is always used.\r\n // It's set back to previous activeCamera after operation.\r\n if (this._renderCamera) {\r\n previousActiveCamera = scene._activeCamera;\r\n scene._activeCamera = this._renderCamera;\r\n prePointerInfo.ray = null;\r\n }\r\n scenePick = prePointerInfo.ray ? scene.pickWithRay(prePointerInfo.ray) : scene.pick(originalScene.pointerX, originalScene.pointerY);\r\n if (previousActiveCamera) {\r\n scene._activeCamera = previousActiveCamera;\r\n }\r\n }\r\n\r\n return scenePick;\r\n };\r\n\r\n const utilityScenePick = getNearPickDataForScene(this.utilityLayerScene);\r\n\r\n if (!prePointerInfo.ray && utilityScenePick) {\r\n prePointerInfo.ray = utilityScenePick.ray;\r\n }\r\n\r\n // always fire the prepointer observable\r\n this.utilityLayerScene.onPrePointerObservable.notifyObservers(prePointerInfo);\r\n\r\n // allow every non pointer down event to flow to the utility layer\r\n if (this.onlyCheckPointerDownEvents && prePointerInfo.type != PointerEventTypes.POINTERDOWN) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(\r\n new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick),\r\n prePointerInfo.type\r\n );\r\n }\r\n if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n }\r\n return;\r\n }\r\n\r\n if (this.utilityLayerScene.autoClearDepthAndStencil || this.pickUtilitySceneFirst) {\r\n // If this layer is an overlay, check if this layer was hit and if so, skip pointer events for the main scene\r\n if (utilityScenePick && utilityScenePick.hit) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(\r\n new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick),\r\n prePointerInfo.type\r\n );\r\n }\r\n prePointerInfo.skipOnPointerObservable = true;\r\n }\r\n } else {\r\n const originalScenePick = getNearPickDataForScene(originalScene);\r\n const pointerEvent = prePointerInfo.event;\r\n\r\n // If the layer can be occluded by the original scene, only fire pointer events to the first layer that hit they ray\r\n if (originalScenePick && utilityScenePick) {\r\n // No pick in utility scene\r\n if (utilityScenePick.distance === 0 && originalScenePick.pickedMesh) {\r\n if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) {\r\n // We touched an utility mesh present in the main scene\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n prePointerInfo.skipOnPointerObservable = true;\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n this._pointerCaptures[pointerEvent.pointerId] = true;\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastPointerEvents[pointerEvent.pointerId]) {\r\n // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete\r\n this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId);\r\n delete this._lastPointerEvents[pointerEvent.pointerId];\r\n }\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n }\r\n } else if (!this._pointerCaptures[pointerEvent.pointerId] && (utilityScenePick.distance < originalScenePick.distance || originalScenePick.distance === 0)) {\r\n // We pick something in utility scene or the pick in utility is closer than the one in main scene\r\n this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent);\r\n // If a previous utility layer set this, do not unset this\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n prePointerInfo.skipOnPointerObservable = utilityScenePick.distance > 0;\r\n }\r\n } else if (!this._pointerCaptures[pointerEvent.pointerId] && utilityScenePick.distance >= originalScenePick.distance) {\r\n // We have a pick in both scenes but main is closer than utility\r\n\r\n // We touched an utility mesh present in the main scene\r\n if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) {\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n prePointerInfo.skipOnPointerObservable = true;\r\n } else {\r\n if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastPointerEvents[pointerEvent.pointerId]) {\r\n // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete\r\n this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId);\r\n delete this._lastPointerEvents[pointerEvent.pointerId];\r\n }\r\n }\r\n this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent);\r\n }\r\n }\r\n\r\n if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n }\r\n }\r\n }\r\n });\r\n\r\n // As a newly added utility layer will be rendered over the screen last, it's pointer events should be processed first\r\n if (this._originalPointerObserver) {\r\n originalScene.onPrePointerObservable.makeObserverTopPriority(this._originalPointerObserver);\r\n }\r\n }\r\n\r\n // Render directly on top of existing scene without clearing\r\n this.utilityLayerScene.autoClear = false;\r\n\r\n this._afterRenderObserver = this.originalScene.onAfterRenderCameraObservable.add((camera) => {\r\n // Only render when the render camera finishes rendering\r\n if (this.shouldRender && camera == this.getRenderCamera()) {\r\n this.render();\r\n }\r\n });\r\n\r\n this._sceneDisposeObserver = this.originalScene.onDisposeObservable.add(() => {\r\n this.dispose();\r\n });\r\n\r\n this._updateCamera();\r\n }\r\n\r\n private _notifyObservers(prePointerInfo: PointerInfoPre, pickInfo: PickingInfo, pointerEvent: IPointerEvent) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(new PointerInfo(prePointerInfo.type, prePointerInfo.event, pickInfo), prePointerInfo.type);\r\n this._lastPointerEvents[pointerEvent.pointerId] = true;\r\n }\r\n }\r\n\r\n /**\r\n * Renders the utility layers scene on top of the original scene\r\n */\r\n public render() {\r\n this._updateCamera();\r\n if (this.utilityLayerScene.activeCamera) {\r\n // Set the camera's scene to utility layers scene\r\n const oldScene = this.utilityLayerScene.activeCamera.getScene();\r\n const camera = this.utilityLayerScene.activeCamera;\r\n camera._scene = this.utilityLayerScene;\r\n if (camera.leftCamera) {\r\n camera.leftCamera._scene = this.utilityLayerScene;\r\n }\r\n if (camera.rightCamera) {\r\n camera.rightCamera._scene = this.utilityLayerScene;\r\n }\r\n\r\n this.utilityLayerScene.render(false);\r\n\r\n // Reset camera's scene back to original\r\n camera._scene = oldScene;\r\n if (camera.leftCamera) {\r\n camera.leftCamera._scene = oldScene;\r\n }\r\n if (camera.rightCamera) {\r\n camera.rightCamera._scene = oldScene;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the renderer\r\n */\r\n public dispose() {\r\n this.onPointerOutObservable.clear();\r\n\r\n if (this._afterRenderObserver) {\r\n this.originalScene.onAfterCameraRenderObservable.remove(this._afterRenderObserver);\r\n }\r\n if (this._sceneDisposeObserver) {\r\n this.originalScene.onDisposeObservable.remove(this._sceneDisposeObserver);\r\n }\r\n if (this._originalPointerObserver) {\r\n this.originalScene.onPrePointerObservable.remove(this._originalPointerObserver);\r\n }\r\n this.utilityLayerScene.dispose();\r\n }\r\n\r\n private _updateCamera() {\r\n this.utilityLayerScene.cameraToUseForPointers = this.getRenderCamera();\r\n this.utilityLayerScene.activeCamera = this.getRenderCamera();\r\n }\r\n}\r\n", "import type { Observer } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { Quaternion, Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport type { TargetCamera } from \"../Cameras/targetCamera\";\r\nimport type { Node } from \"../node\";\r\nimport type { Bone } from \"../Bones/bone\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport type { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { ShadowLight } from \"../Lights/shadowLight\";\r\nimport { Light } from \"../Lights/light\";\r\n\r\n/**\r\n * Cache built by each axis. Used for managing state between all elements of gizmo for enhanced UI\r\n */\r\nexport interface GizmoAxisCache {\r\n /** Mesh used to render the Gizmo */\r\n gizmoMeshes: Mesh[];\r\n /** Mesh used to detect user interaction with Gizmo */\r\n colliderMeshes: Mesh[];\r\n /** Material used to indicate color of gizmo mesh */\r\n material: StandardMaterial;\r\n /** Material used to indicate hover state of the Gizmo */\r\n hoverMaterial: StandardMaterial;\r\n /** Material used to indicate disabled state of the Gizmo */\r\n disableMaterial: StandardMaterial;\r\n /** Used to indicate Active state of the Gizmo */\r\n active: boolean;\r\n /** DragBehavior */\r\n dragBehavior: PointerDragBehavior;\r\n}\r\n\r\n/**\r\n * Anchor options where the Gizmo can be positioned in relation to its anchored node\r\n */\r\nexport enum GizmoAnchorPoint {\r\n /** The origin of the attached node */\r\n Origin,\r\n /** The pivot point of the attached node*/\r\n Pivot,\r\n}\r\n\r\n/**\r\n * Coordinates mode: Local or World. Defines how axis is aligned: either on world axis or transform local axis\r\n */\r\nexport enum GizmoCoordinatesMode {\r\n World,\r\n Local,\r\n}\r\n\r\n/**\r\n * Interface for basic gizmo\r\n */\r\nexport interface IGizmo extends IDisposable {\r\n /** True when the mouse pointer is hovered a gizmo mesh */\r\n readonly isHovered: boolean;\r\n /** The root mesh of the gizmo */\r\n _rootMesh: Mesh;\r\n /** Ratio for the scale of the gizmo */\r\n scaleRatio: number;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedMesh: Nullable;\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedNode: Nullable;\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoRotationToMatchAttachedMesh: boolean;\r\n /** The utility layer the gizmo will be added to */\r\n gizmoLayer: UtilityLayerRenderer;\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoPositionToMatchAttachedMesh: boolean;\r\n /**\r\n * Defines where the gizmo will be positioned if `updateGizmoPositionToMatchAttachedMesh` is enabled.\r\n * (Default: GizmoAnchorPoint.Origin)\r\n */\r\n anchorPoint: GizmoAnchorPoint;\r\n\r\n /**\r\n * Set the coordinate mode to use. By default it's local.\r\n */\r\n coordinatesMode: GizmoCoordinatesMode;\r\n\r\n /**\r\n * When set, the gizmo will always appear the same size no matter where the camera is (default: true)\r\n */\r\n updateScale: boolean;\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n customRotationQuaternion: Nullable;\r\n /**\r\n * Disposes and replaces the current meshes in the gizmo with the specified mesh\r\n * @param mesh The mesh to replace the default mesh of the gizmo\r\n */\r\n setCustomMesh(mesh: Mesh): void;\r\n\r\n /**\r\n * Additional transform applied to the gizmo.\r\n * It's useful when the gizmo is attached to a bone: if the bone is part of a skeleton attached to a mesh, you should define the mesh as additionalTransformNode if you want the gizmo to be displayed at the bone's correct location.\r\n * Otherwise, as the gizmo is relative to the skeleton root, the mesh transformation will not be taken into account.\r\n */\r\n additionalTransformNode?: TransformNode | undefined;\r\n}\r\n/**\r\n * Renders gizmos on top of an existing scene which provide controls for position, rotation, etc.\r\n */\r\nexport class Gizmo implements IGizmo {\r\n /**\r\n * The root mesh of the gizmo\r\n */\r\n public _rootMesh: Mesh;\r\n protected _attachedMesh: Nullable = null;\r\n protected _attachedNode: Nullable = null;\r\n protected _customRotationQuaternion: Nullable = null;\r\n protected _additionalTransformNode?: TransformNode;\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n protected _scaleRatio = 1;\r\n\r\n /**\r\n * boolean updated by pointermove when a gizmo mesh is hovered\r\n */\r\n protected _isHovered = false;\r\n\r\n /**\r\n * When enabled, any gizmo operation will perserve scaling sign. Default is off.\r\n * Only valid for TransformNode derived classes (Mesh, AbstractMesh, ...)\r\n */\r\n public static PreserveScaling = false;\r\n\r\n /**\r\n * There are 2 ways to preserve scaling: using mesh scaling or absolute scaling. Depending of hierarchy, non uniform scaling and LH or RH coordinates. One is preferable than the other.\r\n * If the scaling to be preserved is the local scaling, then set this value to false.\r\n * Default is true which means scaling to be preserved is absolute one (with hierarchy applied)\r\n */\r\n public static UseAbsoluteScaling = true;\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n }\r\n\r\n public get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovered a gizmo mesh\r\n */\r\n public get isHovered() {\r\n return this._isHovered;\r\n }\r\n\r\n /**\r\n * If a custom mesh has been set (Default: false)\r\n */\r\n protected _customMeshSet = false;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedMesh() {\r\n return this._attachedMesh;\r\n }\r\n public set attachedMesh(value) {\r\n this._attachedMesh = value;\r\n if (value) {\r\n this._attachedNode = value;\r\n }\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedNode() {\r\n return this._attachedNode;\r\n }\r\n public set attachedNode(value) {\r\n this._attachedNode = value;\r\n this._attachedMesh = null;\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n\r\n /**\r\n * Disposes and replaces the current meshes in the gizmo with the specified mesh\r\n * @param mesh The mesh to replace the default mesh of the gizmo\r\n */\r\n public setCustomMesh(mesh: Mesh) {\r\n if (mesh.getScene() != this.gizmoLayer.utilityLayerScene) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"When setting a custom mesh on a gizmo, the custom meshes scene must be the same as the gizmos (eg. gizmo.gizmoLayer.utilityLayerScene)\";\r\n }\r\n this._rootMesh.getChildMeshes().forEach((c) => {\r\n c.dispose();\r\n });\r\n mesh.parent = this._rootMesh;\r\n this._customMeshSet = true;\r\n }\r\n\r\n /**\r\n * Additional transform applied to the gizmo.\r\n * It's useful when the gizmo is attached to a bone: if the bone is part of a skeleton attached to a mesh, you should define the mesh as additionalTransformNode if you want the gizmo to be displayed at the bone's correct location.\r\n * Otherwise, as the gizmo is relative to the skeleton root, the mesh transformation will not be taken into account.\r\n */\r\n public get additionalTransformNode() {\r\n return this._additionalTransformNode;\r\n }\r\n\r\n public set additionalTransformNode(value: TransformNode | undefined) {\r\n this._additionalTransformNode = value;\r\n }\r\n\r\n protected _updateGizmoRotationToMatchAttachedMesh = true;\r\n protected _updateGizmoPositionToMatchAttachedMesh = true;\r\n protected _anchorPoint = GizmoAnchorPoint.Origin;\r\n protected _updateScale = true;\r\n protected _coordinatesMode = GizmoCoordinatesMode.Local;\r\n\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n * NOTE: This is only possible for meshes with uniform scaling, as otherwise it's not possible to decompose the rotation\r\n */\r\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoRotationToMatchAttachedMesh() {\r\n return this._updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n public set updateGizmoPositionToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoPositionToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoPositionToMatchAttachedMesh() {\r\n return this._updateGizmoPositionToMatchAttachedMesh;\r\n }\r\n\r\n /**\r\n * Defines where the gizmo will be positioned if `updateGizmoPositionToMatchAttachedMesh` is enabled.\r\n * (Default: GizmoAnchorPoint.Origin)\r\n */\r\n public set anchorPoint(value: GizmoAnchorPoint) {\r\n this._anchorPoint = value;\r\n }\r\n public get anchorPoint() {\r\n return this._anchorPoint;\r\n }\r\n\r\n /**\r\n * Set the coordinate system to use. By default it's local.\r\n * But it's possible for a user to tweak so its local for translation and world for rotation.\r\n * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh`\r\n */\r\n public set coordinatesMode(coordinatesMode: GizmoCoordinatesMode) {\r\n this._coordinatesMode = coordinatesMode;\r\n const local = coordinatesMode == GizmoCoordinatesMode.Local;\r\n this.updateGizmoRotationToMatchAttachedMesh = local;\r\n this.updateGizmoPositionToMatchAttachedMesh = true;\r\n }\r\n\r\n public get coordinatesMode() {\r\n return this._coordinatesMode;\r\n }\r\n\r\n /**\r\n * When set, the gizmo will always appear the same size no matter where the camera is (default: true)\r\n */\r\n\r\n public set updateScale(value: boolean) {\r\n this._updateScale = value;\r\n }\r\n public get updateScale() {\r\n return this._updateScale;\r\n }\r\n protected _interactionsEnabled = true;\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _attachedNodeChanged(value: Nullable) {}\r\n\r\n protected _beforeRenderObserver: Nullable>;\r\n private _rightHandtoLeftHandMatrix = Matrix.RotationY(Math.PI);\r\n\r\n /**\r\n * Creates a gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(\r\n /** The utility layer the gizmo will be added to */\r\n public gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer\r\n ) {\r\n this._rootMesh = new Mesh(\"gizmoRootNode\", gizmoLayer.utilityLayerScene);\r\n this._rootMesh.rotationQuaternion = Quaternion.Identity();\r\n\r\n this._beforeRenderObserver = this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.add(() => {\r\n this._update();\r\n });\r\n }\r\n\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n public get customRotationQuaternion(): Nullable {\r\n return this._customRotationQuaternion;\r\n }\r\n\r\n public set customRotationQuaternion(customRotationQuaternion: Nullable) {\r\n this._customRotationQuaternion = customRotationQuaternion;\r\n }\r\n\r\n /**\r\n * Updates the gizmo to match the attached mesh's position/rotation\r\n */\r\n protected _update() {\r\n if (this.attachedNode) {\r\n let effectiveNode = this.attachedNode;\r\n if (this.attachedMesh) {\r\n effectiveNode = this.attachedMesh || this.attachedNode;\r\n }\r\n\r\n // Position\r\n if (this.updateGizmoPositionToMatchAttachedMesh) {\r\n if (this.anchorPoint == GizmoAnchorPoint.Pivot && (effectiveNode).getAbsolutePivotPoint) {\r\n const position = (effectiveNode).getAbsolutePivotPoint();\r\n this._rootMesh.position.copyFrom(position);\r\n } else {\r\n const row = effectiveNode.getWorldMatrix().getRow(3);\r\n const position = row ? row.toVector3() : new Vector3(0, 0, 0);\r\n this._rootMesh.position.copyFrom(position);\r\n }\r\n }\r\n\r\n // Rotation\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n const supportedNode =\r\n (effectiveNode)._isMesh ||\r\n effectiveNode.getClassName() === \"AbstractMesh\" ||\r\n effectiveNode.getClassName() === \"TransformNode\" ||\r\n effectiveNode.getClassName() === \"InstancedMesh\";\r\n const transformNode = supportedNode ? (effectiveNode as TransformNode) : undefined;\r\n effectiveNode.getWorldMatrix().decompose(undefined, this._rootMesh.rotationQuaternion!, undefined, Gizmo.PreserveScaling ? transformNode : undefined);\r\n this._rootMesh.rotationQuaternion!.normalize();\r\n } else {\r\n if (this._customRotationQuaternion) {\r\n this._rootMesh.rotationQuaternion!.copyFrom(this._customRotationQuaternion);\r\n } else {\r\n this._rootMesh.rotationQuaternion!.set(0, 0, 0, 1);\r\n }\r\n }\r\n\r\n // Scale\r\n if (this.updateScale) {\r\n const activeCamera = this.gizmoLayer.utilityLayerScene.activeCamera!;\r\n const cameraPosition = activeCamera.globalPosition;\r\n this._rootMesh.position.subtractToRef(cameraPosition, TmpVectors.Vector3[0]);\r\n let scale = this.scaleRatio;\r\n if (activeCamera.mode == Camera.ORTHOGRAPHIC_CAMERA) {\r\n if (activeCamera.orthoTop && activeCamera.orthoBottom) {\r\n const orthoHeight = activeCamera.orthoTop - activeCamera.orthoBottom;\r\n scale *= orthoHeight;\r\n }\r\n } else {\r\n const camForward = activeCamera.getScene().useRightHandedSystem ? Vector3.RightHandedForwardReadOnly : Vector3.LeftHandedForwardReadOnly;\r\n const direction = activeCamera.getDirection(camForward);\r\n scale *= Vector3.Dot(TmpVectors.Vector3[0], direction);\r\n }\r\n this._rootMesh.scaling.setAll(scale);\r\n\r\n // Account for handedness, similar to Matrix.decompose\r\n if (effectiveNode._getWorldMatrixDeterminant() < 0 && !Gizmo.PreserveScaling) {\r\n this._rootMesh.scaling.y *= -1;\r\n }\r\n } else {\r\n this._rootMesh.scaling.setAll(this.scaleRatio);\r\n }\r\n }\r\n\r\n if (this.additionalTransformNode) {\r\n this._rootMesh.computeWorldMatrix(true);\r\n this._rootMesh.getWorldMatrix().multiplyToRef(this.additionalTransformNode.getWorldMatrix(), TmpVectors.Matrix[0]);\r\n TmpVectors.Matrix[0].decompose(this._rootMesh.scaling, this._rootMesh.rotationQuaternion!, this._rootMesh.position);\r\n }\r\n }\r\n\r\n /**\r\n * if transform has a pivot and is not using PostMultiplyPivotMatrix, then the worldMatrix contains the pivot matrix (it's not cancelled at the end)\r\n * so, when extracting the world matrix component, the translation (and other components) is containing the pivot translation.\r\n * And the pivot is applied each frame. Removing it anyway here makes it applied only in computeWorldMatrix.\r\n * @param transform local transform that needs to be transform by the pivot inverse matrix\r\n * @param localMatrix local matrix that needs to be transform by the pivot inverse matrix\r\n * @param result resulting matrix transformed by pivot inverse if the transform node is using pivot without using post Multiply Pivot Matrix\r\n */\r\n protected _handlePivotMatrixInverse(transform: TransformNode, localMatrix: Matrix, result: Matrix): void {\r\n if (transform.isUsingPivotMatrix() && !transform.isUsingPostMultiplyPivotMatrix()) {\r\n transform.getPivotMatrix().invertToRef(TmpVectors.Matrix[5]);\r\n TmpVectors.Matrix[5].multiplyToRef(localMatrix, result);\r\n return;\r\n }\r\n result.copyFrom(localMatrix);\r\n }\r\n /**\r\n * computes the rotation/scaling/position of the transform once the Node world matrix has changed.\r\n */\r\n protected _matrixChanged() {\r\n if (!this._attachedNode) {\r\n return;\r\n }\r\n\r\n if ((this._attachedNode)._isCamera) {\r\n const camera = this._attachedNode as Camera;\r\n let worldMatrix;\r\n let worldMatrixUC;\r\n if (camera.parent) {\r\n const parentInv = TmpVectors.Matrix[1];\r\n camera.parent._worldMatrix.invertToRef(parentInv);\r\n this._attachedNode._worldMatrix.multiplyToRef(parentInv, TmpVectors.Matrix[0]);\r\n worldMatrix = TmpVectors.Matrix[0];\r\n } else {\r\n worldMatrix = this._attachedNode._worldMatrix;\r\n }\r\n\r\n if (camera.getScene().useRightHandedSystem) {\r\n // avoid desync with RH matrix computation. Otherwise, rotation of PI around Y axis happens each frame resulting in axis flipped because worldMatrix is computed as inverse of viewMatrix.\r\n this._rightHandtoLeftHandMatrix.multiplyToRef(worldMatrix, TmpVectors.Matrix[1]);\r\n worldMatrixUC = TmpVectors.Matrix[1];\r\n } else {\r\n worldMatrixUC = worldMatrix;\r\n }\r\n\r\n worldMatrixUC.decompose(TmpVectors.Vector3[1], TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n\r\n const inheritsTargetCamera =\r\n this._attachedNode.getClassName() === \"FreeCamera\" ||\r\n this._attachedNode.getClassName() === \"FlyCamera\" ||\r\n this._attachedNode.getClassName() === \"ArcFollowCamera\" ||\r\n this._attachedNode.getClassName() === \"TargetCamera\" ||\r\n this._attachedNode.getClassName() === \"TouchCamera\" ||\r\n this._attachedNode.getClassName() === \"UniversalCamera\";\r\n\r\n if (inheritsTargetCamera) {\r\n const targetCamera = this._attachedNode as TargetCamera;\r\n targetCamera.rotation = TmpVectors.Quaternion[0].toEulerAngles();\r\n\r\n if (targetCamera.rotationQuaternion) {\r\n targetCamera.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]);\r\n targetCamera.rotationQuaternion.normalize();\r\n }\r\n }\r\n\r\n camera.position.copyFrom(TmpVectors.Vector3[0]);\r\n } else if (\r\n (this._attachedNode)._isMesh ||\r\n this._attachedNode.getClassName() === \"AbstractMesh\" ||\r\n this._attachedNode.getClassName() === \"TransformNode\" ||\r\n this._attachedNode.getClassName() === \"InstancedMesh\"\r\n ) {\r\n const transform = this._attachedNode as TransformNode;\r\n if (transform.parent) {\r\n const parentInv = TmpVectors.Matrix[0];\r\n const localMat = TmpVectors.Matrix[1];\r\n transform.parent.getWorldMatrix().invertToRef(parentInv);\r\n this._attachedNode.getWorldMatrix().multiplyToRef(parentInv, localMat);\r\n const matrixToDecompose = TmpVectors.Matrix[4];\r\n this._handlePivotMatrixInverse(transform, localMat, matrixToDecompose);\r\n matrixToDecompose.decompose(\r\n TmpVectors.Vector3[0],\r\n TmpVectors.Quaternion[0],\r\n transform.position,\r\n Gizmo.PreserveScaling ? transform : undefined,\r\n Gizmo.UseAbsoluteScaling\r\n );\r\n TmpVectors.Quaternion[0].normalize();\r\n if (transform.isUsingPivotMatrix()) {\r\n // Calculate the local matrix without the translation.\r\n // Copied from TranslateNode.computeWorldMatrix\r\n const r = TmpVectors.Quaternion[1];\r\n Quaternion.RotationYawPitchRollToRef(transform.rotation.y, transform.rotation.x, transform.rotation.z, r);\r\n\r\n const scaleMatrix = TmpVectors.Matrix[2];\r\n Matrix.ScalingToRef(transform.scaling.x, transform.scaling.y, transform.scaling.z, scaleMatrix);\r\n\r\n const rotationMatrix = TmpVectors.Matrix[2];\r\n r.toRotationMatrix(rotationMatrix);\r\n\r\n const pivotMatrix = transform.getPivotMatrix();\r\n const invPivotMatrix = TmpVectors.Matrix[3];\r\n pivotMatrix.invertToRef(invPivotMatrix);\r\n\r\n pivotMatrix.multiplyToRef(scaleMatrix, TmpVectors.Matrix[4]);\r\n TmpVectors.Matrix[4].multiplyToRef(rotationMatrix, TmpVectors.Matrix[5]);\r\n TmpVectors.Matrix[5].multiplyToRef(invPivotMatrix, TmpVectors.Matrix[6]);\r\n\r\n TmpVectors.Matrix[6].getTranslationToRef(TmpVectors.Vector3[1]);\r\n\r\n transform.position.subtractInPlace(TmpVectors.Vector3[1]);\r\n }\r\n } else {\r\n const matrixToDecompose = TmpVectors.Matrix[4];\r\n this._handlePivotMatrixInverse(transform, this._attachedNode._worldMatrix, matrixToDecompose);\r\n matrixToDecompose.decompose(\r\n TmpVectors.Vector3[0],\r\n TmpVectors.Quaternion[0],\r\n transform.position,\r\n Gizmo.PreserveScaling ? transform : undefined,\r\n Gizmo.UseAbsoluteScaling\r\n );\r\n }\r\n TmpVectors.Vector3[0].scaleInPlace(1.0 / transform.scalingDeterminant);\r\n transform.scaling.copyFrom(TmpVectors.Vector3[0]);\r\n if (!transform.billboardMode) {\r\n if (transform.rotationQuaternion) {\r\n transform.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]);\r\n transform.rotationQuaternion.normalize();\r\n } else {\r\n transform.rotation = TmpVectors.Quaternion[0].toEulerAngles();\r\n }\r\n }\r\n } else if (this._attachedNode.getClassName() === \"Bone\") {\r\n const bone = this._attachedNode as Bone;\r\n const parent = bone.getParent();\r\n\r\n if (parent) {\r\n const invParent = TmpVectors.Matrix[0];\r\n const boneLocalMatrix = TmpVectors.Matrix[1];\r\n parent.getFinalMatrix().invertToRef(invParent);\r\n bone.getFinalMatrix().multiplyToRef(invParent, boneLocalMatrix);\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(boneLocalMatrix);\r\n } else {\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(bone.getFinalMatrix());\r\n }\r\n bone.markAsDirty();\r\n } else {\r\n const light = this._attachedNode as ShadowLight;\r\n if (light.getTypeID) {\r\n const type = light.getTypeID();\r\n if (type === Light.LIGHTTYPEID_DIRECTIONALLIGHT || type === Light.LIGHTTYPEID_SPOTLIGHT || type === Light.LIGHTTYPEID_POINTLIGHT) {\r\n const parent = light.parent;\r\n\r\n if (parent) {\r\n const invParent = TmpVectors.Matrix[0];\r\n const nodeLocalMatrix = TmpVectors.Matrix[1];\r\n parent.getWorldMatrix().invertToRef(invParent);\r\n light.getWorldMatrix().multiplyToRef(invParent, nodeLocalMatrix);\r\n nodeLocalMatrix.decompose(undefined, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n } else {\r\n this._attachedNode._worldMatrix.decompose(undefined, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n }\r\n // setter doesn't copy values. Need a new Vector3\r\n light.position = new Vector3(TmpVectors.Vector3[0].x, TmpVectors.Vector3[0].y, TmpVectors.Vector3[0].z);\r\n if (light.direction) {\r\n light.direction = new Vector3(light.direction.x, light.direction.y, light.direction.z);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * refresh gizmo mesh material\r\n * @param gizmoMeshes\r\n * @param material material to apply\r\n */\r\n protected _setGizmoMeshMaterial(gizmoMeshes: Mesh[], material: StandardMaterial) {\r\n if (gizmoMeshes) {\r\n gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m).color) {\r\n (m).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Subscribes to pointer up, down, and hover events. Used for responsive gizmos.\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI\r\n * @returns {Observer} pointerObserver\r\n */\r\n public static GizmoAxisPointerObserver(gizmoLayer: UtilityLayerRenderer, gizmoAxisCache: Map): Observer {\r\n let dragging = false;\r\n\r\n const pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (pointerInfo.pickInfo) {\r\n // On Hover Logic\r\n if (pointerInfo.type === PointerEventTypes.POINTERMOVE) {\r\n if (dragging) {\r\n return;\r\n }\r\n gizmoAxisCache.forEach((cache) => {\r\n if (cache.colliderMeshes && cache.gizmoMeshes) {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = cache.dragBehavior.enabled ? (isHovered || cache.active ? cache.hoverMaterial : cache.material) : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // On Mouse Down\r\n if (pointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n // If user Clicked Gizmo\r\n if (gizmoAxisCache.has(pointerInfo.pickInfo.pickedMesh?.parent as Mesh)) {\r\n dragging = true;\r\n const statusMap = gizmoAxisCache.get(pointerInfo.pickInfo.pickedMesh?.parent as Mesh);\r\n statusMap!.active = true;\r\n gizmoAxisCache.forEach((cache) => {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = (isHovered || cache.active) && cache.dragBehavior.enabled ? cache.hoverMaterial : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n // On Mouse Up\r\n if (pointerInfo.type === PointerEventTypes.POINTERUP) {\r\n gizmoAxisCache.forEach((cache) => {\r\n cache.active = false;\r\n dragging = false;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = cache.dragBehavior.enabled ? cache.material : cache.disableMaterial;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = cache.material.diffuseColor;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return pointerObserver!;\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this._rootMesh.dispose();\r\n if (this._beforeRenderObserver) {\r\n this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n }\r\n}\r\n", "import type { Nullable } from \"../../types\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector4 } from \"../../Maths/math.vector\";\r\nimport { Color4 } from \"../../Maths/math.color\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport { CompatibilityOptions } from \"../../Compat/compatibilityOptions\";\r\nimport { CreateGroundVertexData } from \"./groundBuilder\";\r\n\r\n/**\r\n * Creates the VertexData for a box\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * size sets the width, height and depth of the box to the value of size, optional default 1\r\n * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size\r\n * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size\r\n * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size\r\n * * faceUV an array of 6 Vector4 elements used to set different images to each box side\r\n * * faceColors an array of 6 Color3 elements used to set different colors to each box side\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the box\r\n */\r\nexport function CreateBoxVertexData(options: {\r\n size?: number;\r\n width?: number;\r\n height?: number;\r\n depth?: number;\r\n faceUV?: Vector4[];\r\n faceColors?: Color4[];\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n wrap?: boolean;\r\n topBaseAt?: number;\r\n bottomBaseAt?: number;\r\n}): VertexData {\r\n const nbFaces = 6;\r\n let indices = [0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23];\r\n const normals = [\r\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0,\r\n 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0,\r\n ];\r\n const uvs = [];\r\n let positions = [];\r\n const width = options.width || options.size || 1;\r\n const height = options.height || options.size || 1;\r\n const depth = options.depth || options.size || 1;\r\n const wrap = options.wrap || false;\r\n let topBaseAt = options.topBaseAt === void 0 ? 1 : options.topBaseAt;\r\n let bottomBaseAt = options.bottomBaseAt === void 0 ? 0 : options.bottomBaseAt;\r\n topBaseAt = (topBaseAt + 4) % 4; // places values as 0 to 3\r\n bottomBaseAt = (bottomBaseAt + 4) % 4; // places values as 0 to 3\r\n const topOrder = [2, 0, 3, 1];\r\n const bottomOrder = [2, 0, 1, 3];\r\n let topIndex = topOrder[topBaseAt];\r\n let bottomIndex = bottomOrder[bottomBaseAt];\r\n let basePositions = [\r\n 1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1,\r\n 1, 1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1,\r\n ];\r\n if (wrap) {\r\n indices = [2, 3, 0, 2, 0, 1, 4, 5, 6, 4, 6, 7, 9, 10, 11, 9, 11, 8, 12, 14, 15, 12, 13, 14];\r\n basePositions = [\r\n -1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1,\r\n ];\r\n let topFaceBase: any = [\r\n [1, 1, 1],\r\n [-1, 1, 1],\r\n [-1, 1, -1],\r\n [1, 1, -1],\r\n ];\r\n let bottomFaceBase: any = [\r\n [-1, -1, 1],\r\n [1, -1, 1],\r\n [1, -1, -1],\r\n [-1, -1, -1],\r\n ];\r\n const topFaceOrder: any = [17, 18, 19, 16];\r\n const bottomFaceOrder: any = [22, 23, 20, 21];\r\n while (topIndex > 0) {\r\n topFaceBase.unshift(topFaceBase.pop());\r\n topFaceOrder.unshift(topFaceOrder.pop());\r\n topIndex--;\r\n }\r\n while (bottomIndex > 0) {\r\n bottomFaceBase.unshift(bottomFaceBase.pop());\r\n bottomFaceOrder.unshift(bottomFaceOrder.pop());\r\n bottomIndex--;\r\n }\r\n topFaceBase = topFaceBase.flat();\r\n bottomFaceBase = bottomFaceBase.flat();\r\n basePositions = basePositions.concat(topFaceBase).concat(bottomFaceBase);\r\n indices.push(topFaceOrder[0], topFaceOrder[2], topFaceOrder[3], topFaceOrder[0], topFaceOrder[1], topFaceOrder[2]);\r\n indices.push(bottomFaceOrder[0], bottomFaceOrder[2], bottomFaceOrder[3], bottomFaceOrder[0], bottomFaceOrder[1], bottomFaceOrder[2]);\r\n }\r\n const scaleArray = [width / 2, height / 2, depth / 2];\r\n positions = basePositions.reduce((accumulator: Array, currentValue, currentIndex) => accumulator.concat(currentValue * scaleArray[currentIndex % 3]), []);\r\n\r\n const sideOrientation = options.sideOrientation === 0 ? 0 : options.sideOrientation || VertexData.DEFAULTSIDE;\r\n\r\n const faceUV: Vector4[] = options.faceUV || new Array(6);\r\n const faceColors = options.faceColors;\r\n const colors = [];\r\n\r\n // default face colors and UV if undefined\r\n for (let f = 0; f < 6; f++) {\r\n if (faceUV[f] === undefined) {\r\n faceUV[f] = new Vector4(0, 0, 1, 1);\r\n }\r\n if (faceColors && faceColors[f] === undefined) {\r\n faceColors[f] = new Color4(1, 1, 1, 1);\r\n }\r\n }\r\n\r\n // Create each face in turn.\r\n for (let index = 0; index < nbFaces; index++) {\r\n uvs.push(faceUV[index].z, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 - faceUV[index].w : faceUV[index].w);\r\n uvs.push(faceUV[index].x, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 - faceUV[index].w : faceUV[index].w);\r\n uvs.push(faceUV[index].x, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 - faceUV[index].y : faceUV[index].y);\r\n uvs.push(faceUV[index].z, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 - faceUV[index].y : faceUV[index].y);\r\n if (faceColors) {\r\n for (let c = 0; c < 4; c++) {\r\n colors.push(faceColors[index].r, faceColors[index].g, faceColors[index].b, faceColors[index].a);\r\n }\r\n }\r\n }\r\n\r\n // sides\r\n VertexData._ComputeSides(sideOrientation, positions, indices, normals, uvs, options.frontUVs, options.backUVs);\r\n\r\n // Result\r\n const vertexData = new VertexData();\r\n\r\n vertexData.indices = indices;\r\n vertexData.positions = positions;\r\n vertexData.normals = normals;\r\n vertexData.uvs = uvs;\r\n\r\n if (faceColors) {\r\n const totalColors = sideOrientation === VertexData.DOUBLESIDE ? colors.concat(colors) : colors;\r\n vertexData.colors = totalColors;\r\n }\r\n\r\n return vertexData;\r\n}\r\n\r\n/**\r\n * Creates the VertexData for a segmented box\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * size sets the width, height and depth of the box to the value of size, optional default 1\r\n * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size\r\n * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size\r\n * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size\r\n * * segments sets the number of segments on the all axis (1 by default)\r\n * * widthSegments sets the number of segments on the x axis (1 by default)\r\n * * heightSegments sets the number of segments on the y axis (1 by default)\r\n * * depthSegments sets the number of segments on the z axis (1 by default)\r\n * @returns the VertexData of the box\r\n */\r\nexport function CreateSegmentedBoxVertexData(options: {\r\n size?: number;\r\n width?: number;\r\n height?: number;\r\n depth?: number;\r\n segments?: number;\r\n widthSegments?: number;\r\n heightSegments?: number;\r\n depthSegments?: number;\r\n}): VertexData {\r\n const width = options.width || options.size || 1;\r\n const height = options.height || options.size || 1;\r\n const depth = options.depth || options.size || 1;\r\n const widthSegments = (options.widthSegments || options.segments || 1) | 0;\r\n const heightSegments = (options.heightSegments || options.segments || 1) | 0;\r\n const depthSegments = (options.depthSegments || options.segments || 1) | 0;\r\n const rotationMatrix = new Matrix();\r\n const translationMatrix = new Matrix();\r\n const transformMatrix = new Matrix();\r\n\r\n const bottomPlane = CreateGroundVertexData({ width: width, height: depth, subdivisionsX: widthSegments, subdivisionsY: depthSegments });\r\n Matrix.TranslationToRef(0, -height / 2, 0, translationMatrix);\r\n Matrix.RotationZToRef(Math.PI, rotationMatrix);\r\n rotationMatrix.multiplyToRef(translationMatrix, transformMatrix);\r\n bottomPlane.transform(transformMatrix);\r\n\r\n const topPlane = CreateGroundVertexData({ width: width, height: depth, subdivisionsX: widthSegments, subdivisionsY: depthSegments });\r\n Matrix.TranslationToRef(0, height / 2, 0, transformMatrix);\r\n topPlane.transform(transformMatrix);\r\n\r\n const negXPlane = CreateGroundVertexData({ width: height, height: depth, subdivisionsX: heightSegments, subdivisionsY: depthSegments });\r\n Matrix.TranslationToRef(-width / 2, 0, 0, translationMatrix);\r\n Matrix.RotationZToRef(Math.PI / 2, rotationMatrix);\r\n rotationMatrix.multiplyToRef(translationMatrix, transformMatrix);\r\n negXPlane.transform(transformMatrix);\r\n\r\n const posXPlane = CreateGroundVertexData({ width: height, height: depth, subdivisionsX: heightSegments, subdivisionsY: depthSegments });\r\n Matrix.TranslationToRef(width / 2, 0, 0, translationMatrix);\r\n Matrix.RotationZToRef(-Math.PI / 2, rotationMatrix);\r\n rotationMatrix.multiplyToRef(translationMatrix, transformMatrix);\r\n posXPlane.transform(transformMatrix);\r\n\r\n const negZPlane = CreateGroundVertexData({ width: width, height: height, subdivisionsX: widthSegments, subdivisionsY: heightSegments });\r\n Matrix.TranslationToRef(0, 0, -depth / 2, translationMatrix);\r\n Matrix.RotationXToRef(-Math.PI / 2, rotationMatrix);\r\n rotationMatrix.multiplyToRef(translationMatrix, transformMatrix);\r\n negZPlane.transform(transformMatrix);\r\n\r\n const posZPlane = CreateGroundVertexData({ width: width, height: height, subdivisionsX: widthSegments, subdivisionsY: heightSegments });\r\n Matrix.TranslationToRef(0, 0, depth / 2, translationMatrix);\r\n Matrix.RotationXToRef(Math.PI / 2, rotationMatrix);\r\n rotationMatrix.multiplyToRef(translationMatrix, transformMatrix);\r\n posZPlane.transform(transformMatrix);\r\n\r\n // Result\r\n bottomPlane.merge([topPlane, posXPlane, negXPlane, negZPlane, posZPlane], true);\r\n\r\n return bottomPlane;\r\n}\r\n\r\n/**\r\n * Creates a box mesh\r\n * * The parameter `size` sets the size (float) of each box side (default 1)\r\n * * You can set some different box dimensions by using the parameters `width`, `height` and `depth` (all by default have the same value of `size`)\r\n * * You can set different colors and different images to each box side by using the parameters `faceColors` (an array of 6 Color3 elements) and `faceUV` (an array of 6 Vector4 elements)\r\n * * Please read this tutorial : https://doc.babylonjs.com/features/featuresDeepDive/materials/using/texturePerBoxFace\r\n * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE\r\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\r\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#box\r\n * @param name defines the name of the mesh\r\n * @param options defines the options used to create the mesh\r\n * @param scene defines the hosting scene\r\n * @returns the box mesh\r\n */\r\nexport function CreateBox(\r\n name: string,\r\n options: {\r\n size?: number;\r\n width?: number;\r\n height?: number;\r\n depth?: number;\r\n faceUV?: Vector4[];\r\n faceColors?: Color4[];\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n wrap?: boolean;\r\n topBaseAt?: number;\r\n bottomBaseAt?: number;\r\n updatable?: boolean;\r\n } = {},\r\n scene: Nullable = null\r\n): Mesh {\r\n const box = new Mesh(name, scene);\r\n\r\n options.sideOrientation = Mesh._GetDefaultSideOrientation(options.sideOrientation);\r\n box._originalBuilderSideOrientation = options.sideOrientation;\r\n\r\n const vertexData = CreateBoxVertexData(options);\r\n\r\n vertexData.applyToMesh(box, options.updatable);\r\n\r\n return box;\r\n}\r\n\r\n/**\r\n * Class containing static functions to help procedurally build meshes\r\n * @deprecated please use CreateBox directly\r\n */\r\nexport const BoxBuilder = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CreateBox,\r\n};\r\n\r\n// Side effects\r\nVertexData.CreateBox = CreateBoxVertexData;\r\n\r\nMesh.CreateBox = (name: string, size: number, scene: Nullable = null, updatable?: boolean, sideOrientation?: number): Mesh => {\r\n const options = {\r\n size,\r\n sideOrientation,\r\n updatable,\r\n };\r\n\r\n return CreateBox(name, options, scene);\r\n};\r\n", "import { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { Matrix, Vector3, Vector2, Vector4, Quaternion } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport type { Effect, IEffectCreationOptions, IShaderPath } from \"./effect\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport { EffectFallbacks } from \"./effectFallbacks\";\r\nimport { WebRequest } from \"../Misc/webRequest\";\r\nimport type { ShaderLanguage } from \"./shaderLanguage\";\r\nimport type { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { TextureSampler } from \"./Textures/textureSampler\";\r\nimport type { StorageBuffer } from \"../Buffers/storageBuffer\";\r\nimport { PushMaterial } from \"./pushMaterial\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { addClipPlaneUniforms, bindClipPlane, prepareStringDefinesForClipPlanes } from \"./clipPlaneMaterialHelper\";\r\n\r\nimport type { ExternalTexture } from \"./Textures/externalTexture\";\r\nimport {\r\n BindBonesParameters,\r\n BindFogParameters,\r\n BindLogDepth,\r\n BindMorphTargetParameters,\r\n BindSceneUniformBuffer,\r\n PrepareAttributesForBakedVertexAnimation,\r\n PushAttributesForInstances,\r\n} from \"./materialHelper.functions\";\r\n\r\nconst onCreatedEffectParameters = { effect: null as unknown as Effect, subMesh: null as unknown as Nullable };\r\n\r\n/**\r\n * Defines the options associated with the creation of a shader material.\r\n */\r\nexport interface IShaderMaterialOptions {\r\n /**\r\n * Does the material work in alpha blend mode\r\n */\r\n needAlphaBlending: boolean;\r\n\r\n /**\r\n * Does the material work in alpha test mode\r\n */\r\n needAlphaTesting: boolean;\r\n\r\n /**\r\n * The list of attribute names used in the shader\r\n */\r\n attributes: string[];\r\n\r\n /**\r\n * The list of uniform names used in the shader\r\n */\r\n uniforms: string[];\r\n\r\n /**\r\n * The list of UBO names used in the shader\r\n */\r\n uniformBuffers: string[];\r\n\r\n /**\r\n * The list of sampler (texture) names used in the shader\r\n */\r\n samplers: string[];\r\n\r\n /**\r\n * The list of external texture names used in the shader\r\n */\r\n externalTextures: string[];\r\n\r\n /**\r\n * The list of sampler object names used in the shader\r\n */\r\n samplerObjects: string[];\r\n\r\n /**\r\n * The list of storage buffer names used in the shader\r\n */\r\n storageBuffers: string[];\r\n\r\n /**\r\n * The list of defines used in the shader\r\n */\r\n defines: string[];\r\n\r\n /**\r\n * Defines if clip planes have to be turned on: true to turn them on, false to turn them off and null to turn them on/off depending on the scene configuration (scene.clipPlaneX)\r\n */\r\n useClipPlane: Nullable;\r\n\r\n /**\r\n * The language the shader is written in (default: GLSL)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n}\r\n\r\n/**\r\n * The ShaderMaterial object has the necessary methods to pass data from your scene to the Vertex and Fragment Shaders and returns a material that can be applied to any mesh.\r\n *\r\n * This returned material effects how the mesh will look based on the code in the shaders.\r\n *\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/shaders/shaderMaterial\r\n */\r\nexport class ShaderMaterial extends PushMaterial {\r\n private _shaderPath: IShaderPath | string;\r\n private _options: IShaderMaterialOptions;\r\n private _textures: { [name: string]: BaseTexture } = {};\r\n private _textureArrays: { [name: string]: BaseTexture[] } = {};\r\n private _externalTextures: { [name: string]: ExternalTexture } = {};\r\n private _floats: { [name: string]: number } = {};\r\n private _ints: { [name: string]: number } = {};\r\n private _uints: { [name: string]: number } = {};\r\n private _floatsArrays: { [name: string]: number[] } = {};\r\n private _colors3: { [name: string]: Color3 } = {};\r\n private _colors3Arrays: { [name: string]: number[] } = {};\r\n private _colors4: { [name: string]: Color4 } = {};\r\n private _colors4Arrays: { [name: string]: number[] } = {};\r\n private _vectors2: { [name: string]: Vector2 } = {};\r\n private _vectors3: { [name: string]: Vector3 } = {};\r\n private _vectors4: { [name: string]: Vector4 } = {};\r\n private _quaternions: { [name: string]: Quaternion } = {};\r\n private _quaternionsArrays: { [name: string]: number[] } = {};\r\n private _matrices: { [name: string]: Matrix } = {};\r\n private _matrixArrays: { [name: string]: Float32Array | Array } = {};\r\n private _matrices3x3: { [name: string]: Float32Array | Array } = {};\r\n private _matrices2x2: { [name: string]: Float32Array | Array } = {};\r\n private _vectors2Arrays: { [name: string]: number[] } = {};\r\n private _vectors3Arrays: { [name: string]: number[] } = {};\r\n private _vectors4Arrays: { [name: string]: number[] } = {};\r\n private _uniformBuffers: { [name: string]: UniformBuffer } = {};\r\n private _textureSamplers: { [name: string]: TextureSampler } = {};\r\n private _storageBuffers: { [name: string]: StorageBuffer } = {};\r\n private _cachedWorldViewMatrix = new Matrix();\r\n private _cachedWorldViewProjectionMatrix = new Matrix();\r\n private _multiview = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _materialHelperNeedsPreviousMatrices = false;\r\n\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n /** Snippet ID if the material was created from the snippet server */\r\n public snippetId: string;\r\n\r\n /**\r\n * Instantiate a new shader material.\r\n * The ShaderMaterial object has the necessary methods to pass data from your scene to the Vertex and Fragment Shaders and returns a material that can be applied to any mesh.\r\n * This returned material effects how the mesh will look based on the code in the shaders.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/shaders/shaderMaterial\r\n * @param name Define the name of the material in the scene\r\n * @param scene Define the scene the material belongs to\r\n * @param shaderPath Defines the route to the shader code.\r\n * @param options Define the options used to create the shader\r\n * @param storeEffectOnSubMeshes true to store effect on submeshes, false to store the effect directly in the material class.\r\n */\r\n constructor(name: string, scene: Scene, shaderPath: IShaderPath | string, options: Partial = {}, storeEffectOnSubMeshes = true) {\r\n super(name, scene, storeEffectOnSubMeshes);\r\n this._shaderPath = shaderPath;\r\n\r\n this._options = {\r\n needAlphaBlending: false,\r\n needAlphaTesting: false,\r\n attributes: [\"position\", \"normal\", \"uv\"],\r\n uniforms: [\"worldViewProjection\"],\r\n uniformBuffers: [],\r\n samplers: [],\r\n externalTextures: [],\r\n samplerObjects: [],\r\n storageBuffers: [],\r\n defines: [],\r\n useClipPlane: false,\r\n ...options,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the shader path used to define the shader code\r\n * It can be modified to trigger a new compilation\r\n */\r\n public get shaderPath() {\r\n return this._shaderPath;\r\n }\r\n\r\n /**\r\n * Sets the shader path used to define the shader code\r\n * It can be modified to trigger a new compilation\r\n */\r\n public set shaderPath(shaderPath: IShaderPath | string) {\r\n this._shaderPath = shaderPath;\r\n }\r\n\r\n /**\r\n * Gets the options used to compile the shader.\r\n * They can be modified to trigger a new compilation\r\n */\r\n public get options(): IShaderMaterialOptions {\r\n return this._options;\r\n }\r\n\r\n /**\r\n * is multiview set to true?\r\n */\r\n public get isMultiview(): boolean {\r\n return this._multiview;\r\n }\r\n\r\n /**\r\n * Gets the current class name of the material e.g. \"ShaderMaterial\"\r\n * Mainly use in serialization.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"ShaderMaterial\";\r\n }\r\n\r\n /**\r\n * Specifies if the material will require alpha blending\r\n * @returns a boolean specifying if alpha blending is needed\r\n */\r\n public needAlphaBlending(): boolean {\r\n return this.alpha < 1.0 || this._options.needAlphaBlending;\r\n }\r\n\r\n /**\r\n * Specifies if this material should be rendered in alpha test mode\r\n * @returns a boolean specifying if an alpha test is needed.\r\n */\r\n public needAlphaTesting(): boolean {\r\n return this._options.needAlphaTesting;\r\n }\r\n\r\n private _checkUniform(uniformName: string): void {\r\n if (this._options.uniforms.indexOf(uniformName) === -1) {\r\n this._options.uniforms.push(uniformName);\r\n }\r\n }\r\n\r\n /**\r\n * Set a texture in the shader.\r\n * @param name Define the name of the uniform samplers as defined in the shader\r\n * @param texture Define the texture to bind to this sampler\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setTexture(name: string, texture: BaseTexture): ShaderMaterial {\r\n if (this._options.samplers.indexOf(name) === -1) {\r\n this._options.samplers.push(name);\r\n }\r\n this._textures[name] = texture;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a texture array in the shader.\r\n * @param name Define the name of the uniform sampler array as defined in the shader\r\n * @param textures Define the list of textures to bind to this sampler\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setTextureArray(name: string, textures: BaseTexture[]): ShaderMaterial {\r\n if (this._options.samplers.indexOf(name) === -1) {\r\n this._options.samplers.push(name);\r\n }\r\n\r\n this._checkUniform(name);\r\n\r\n this._textureArrays[name] = textures;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set an internal texture in the shader.\r\n * @param name Define the name of the uniform samplers as defined in the shader\r\n * @param texture Define the texture to bind to this sampler\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setExternalTexture(name: string, texture: ExternalTexture): ShaderMaterial {\r\n if (this._options.externalTextures.indexOf(name) === -1) {\r\n this._options.externalTextures.push(name);\r\n }\r\n this._externalTextures[name] = texture;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a float in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setFloat(name: string, value: number): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._floats[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a int in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setInt(name: string, value: number): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._ints[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a unsigned int in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setUInt(name: string, value: number): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._uints[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set an array of floats in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setFloats(name: string, value: number[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._floatsArrays[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec3 in the shader from a Color3.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setColor3(name: string, value: Color3): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._colors3[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec3 array in the shader from a Color3 array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setColor3Array(name: string, value: Color3[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._colors3Arrays[name] = value.reduce((arr, color) => {\r\n color.toArray(arr, arr.length);\r\n return arr;\r\n }, []);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 in the shader from a Color4.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setColor4(name: string, value: Color4): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._colors4[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 array in the shader from a Color4 array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setColor4Array(name: string, value: Color4[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._colors4Arrays[name] = value.reduce((arr, color) => {\r\n color.toArray(arr, arr.length);\r\n return arr;\r\n }, []);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec2 in the shader from a Vector2.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setVector2(name: string, value: Vector2): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._vectors2[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec3 in the shader from a Vector3.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setVector3(name: string, value: Vector3): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._vectors3[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 in the shader from a Vector4.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setVector4(name: string, value: Vector4): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._vectors4[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 in the shader from a Quaternion.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setQuaternion(name: string, value: Quaternion): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._quaternions[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 array in the shader from a Quaternion array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setQuaternionArray(name: string, value: Quaternion[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._quaternionsArrays[name] = value.reduce((arr, quaternion) => {\r\n quaternion.toArray(arr, arr.length);\r\n return arr;\r\n }, []);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a mat4 in the shader from a Matrix.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setMatrix(name: string, value: Matrix): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._matrices[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a float32Array in the shader from a matrix array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setMatrices(name: string, value: Matrix[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n\r\n const float32Array = new Float32Array(value.length * 16);\r\n\r\n for (let index = 0; index < value.length; index++) {\r\n const matrix = value[index];\r\n\r\n matrix.copyToArray(float32Array, index * 16);\r\n }\r\n\r\n this._matrixArrays[name] = float32Array;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a mat3 in the shader from a Float32Array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setMatrix3x3(name: string, value: Float32Array | Array): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._matrices3x3[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a mat2 in the shader from a Float32Array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setMatrix2x2(name: string, value: Float32Array | Array): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._matrices2x2[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec2 array in the shader from a number array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setArray2(name: string, value: number[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._vectors2Arrays[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec3 array in the shader from a number array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setArray3(name: string, value: number[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._vectors3Arrays[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 array in the shader from a number array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setArray4(name: string, value: number[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._vectors4Arrays[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a uniform buffer in the shader\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param buffer Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setUniformBuffer(name: string, buffer: UniformBuffer): ShaderMaterial {\r\n if (this._options.uniformBuffers.indexOf(name) === -1) {\r\n this._options.uniformBuffers.push(name);\r\n }\r\n this._uniformBuffers[name] = buffer;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a texture sampler in the shader\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param sampler Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setTextureSampler(name: string, sampler: TextureSampler): ShaderMaterial {\r\n if (this._options.samplerObjects.indexOf(name) === -1) {\r\n this._options.samplerObjects.push(name);\r\n }\r\n this._textureSamplers[name] = sampler;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a storage buffer in the shader\r\n * @param name Define the name of the storage buffer as defined in the shader\r\n * @param buffer Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setStorageBuffer(name: string, buffer: StorageBuffer): ShaderMaterial {\r\n if (this._options.storageBuffers.indexOf(name) === -1) {\r\n this._options.storageBuffers.push(name);\r\n }\r\n this._storageBuffers[name] = buffer;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds, removes, or replaces the specified shader define and value.\r\n * * setDefine(\"MY_DEFINE\", true); // enables a boolean define\r\n * * setDefine(\"MY_DEFINE\", \"0.5\"); // adds \"#define MY_DEFINE 0.5\" to the shader (or sets and replaces the value of any existing define with that name)\r\n * * setDefine(\"MY_DEFINE\", false); // disables and removes the define\r\n * Note if the active defines do change, the shader will be recompiled and this can be expensive.\r\n * @param define the define name e.g., \"OUTPUT_TO_SRGB\" or \"#define OUTPUT_TO_SRGB\". If the define was passed into the constructor already, the version used should match that, and in either case, it should not include any appended value.\r\n * @param value either the value of the define (e.g. a numerical value) or for booleans, true if the define should be enabled or false if it should be disabled\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setDefine(define: string, value: boolean | string): ShaderMaterial {\r\n // First remove any existing define with this name.\r\n const defineName = define.trimEnd() + \" \";\r\n const existingDefineIdx = this.options.defines.findIndex((x) => x === define || x.startsWith(defineName));\r\n if (existingDefineIdx >= 0) {\r\n this.options.defines.splice(existingDefineIdx, 1);\r\n }\r\n\r\n // Then add the new define value. (If it's a boolean value and false, don't add it.)\r\n if (typeof value !== \"boolean\" || value) {\r\n this.options.defines.push(defineName + value);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Specifies that the submesh is ready to be used\r\n * @param mesh defines the mesh to check\r\n * @param subMesh defines which submesh to check\r\n * @param useInstances specifies that instances should be used\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean {\r\n return this.isReady(mesh, useInstances, subMesh);\r\n }\r\n\r\n /**\r\n * Checks if the material is ready to render the requested mesh\r\n * @param mesh Define the mesh to render\r\n * @param useInstances Define whether or not the material is used with instances\r\n * @param subMesh defines which submesh to render\r\n * @returns true if ready, otherwise false\r\n */\r\n public isReady(mesh?: AbstractMesh, useInstances?: boolean, subMesh?: SubMesh): boolean {\r\n const storeEffectOnSubMeshes = subMesh && this._storeEffectOnSubMeshes;\r\n\r\n if (this.isFrozen) {\r\n const drawWrapper = storeEffectOnSubMeshes ? subMesh._drawWrapper : this._drawWrapper;\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n const scene = this.getScene();\r\n const engine = scene.getEngine();\r\n\r\n // Instances\r\n const defines = [];\r\n const attribs = [];\r\n const fallbacks = new EffectFallbacks();\r\n\r\n let shaderName = this._shaderPath,\r\n uniforms = this._options.uniforms,\r\n uniformBuffers = this._options.uniformBuffers,\r\n samplers = this._options.samplers;\r\n\r\n // global multiview\r\n if (engine.getCaps().multiview && scene.activeCamera && scene.activeCamera.outputRenderTarget && scene.activeCamera.outputRenderTarget.getViewCount() > 1) {\r\n this._multiview = true;\r\n defines.push(\"#define MULTIVIEW\");\r\n if (uniforms.indexOf(\"viewProjection\") !== -1 && uniforms.indexOf(\"viewProjectionR\") === -1) {\r\n uniforms.push(\"viewProjectionR\");\r\n }\r\n }\r\n\r\n for (let index = 0; index < this._options.defines.length; index++) {\r\n const defineToAdd = this._options.defines[index].indexOf(\"#define\") === 0 ? this._options.defines[index] : `#define ${this._options.defines[index]}`;\r\n defines.push(defineToAdd);\r\n }\r\n\r\n for (let index = 0; index < this._options.attributes.length; index++) {\r\n attribs.push(this._options.attributes[index]);\r\n }\r\n\r\n if (mesh && mesh.isVerticesDataPresent(VertexBuffer.ColorKind)) {\r\n if (attribs.indexOf(VertexBuffer.ColorKind) === -1) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n defines.push(\"#define VERTEXCOLOR\");\r\n }\r\n\r\n if (useInstances) {\r\n defines.push(\"#define INSTANCES\");\r\n PushAttributesForInstances(attribs, this._materialHelperNeedsPreviousMatrices);\r\n if (mesh?.hasThinInstances) {\r\n defines.push(\"#define THIN_INSTANCES\");\r\n if (mesh && mesh.isVerticesDataPresent(VertexBuffer.ColorInstanceKind)) {\r\n attribs.push(VertexBuffer.ColorInstanceKind);\r\n defines.push(\"#define INSTANCESCOLOR\");\r\n }\r\n }\r\n }\r\n\r\n // Bones\r\n if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n attribs.push(VertexBuffer.MatricesIndicesKind);\r\n attribs.push(VertexBuffer.MatricesWeightsKind);\r\n if (mesh.numBoneInfluencers > 4) {\r\n attribs.push(VertexBuffer.MatricesIndicesExtraKind);\r\n attribs.push(VertexBuffer.MatricesWeightsExtraKind);\r\n }\r\n\r\n const skeleton = mesh.skeleton;\r\n\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n fallbacks.addCPUSkinningFallback(0, mesh);\r\n\r\n if (skeleton.isUsingTextureForMatrices) {\r\n defines.push(\"#define BONETEXTURE\");\r\n\r\n if (uniforms.indexOf(\"boneTextureWidth\") === -1) {\r\n uniforms.push(\"boneTextureWidth\");\r\n }\r\n\r\n if (this._options.samplers.indexOf(\"boneSampler\") === -1) {\r\n this._options.samplers.push(\"boneSampler\");\r\n }\r\n } else {\r\n defines.push(\"#define BonesPerMesh \" + (skeleton.bones.length + 1));\r\n\r\n if (uniforms.indexOf(\"mBones\") === -1) {\r\n uniforms.push(\"mBones\");\r\n }\r\n }\r\n } else {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\r\n }\r\n\r\n // Morph\r\n let numInfluencers = 0;\r\n const manager = mesh ? (mesh).morphTargetManager : null;\r\n if (manager) {\r\n const uv = manager.supportsUVs && defines.indexOf(\"#define UV1\") !== -1;\r\n const tangent = manager.supportsTangents && defines.indexOf(\"#define TANGENT\") !== -1;\r\n const normal = manager.supportsNormals && defines.indexOf(\"#define NORMAL\") !== -1;\r\n numInfluencers = manager.numMaxInfluencers || manager.numInfluencers;\r\n if (uv) {\r\n defines.push(\"#define MORPHTARGETS_UV\");\r\n }\r\n if (tangent) {\r\n defines.push(\"#define MORPHTARGETS_TANGENT\");\r\n }\r\n if (normal) {\r\n defines.push(\"#define MORPHTARGETS_NORMAL\");\r\n }\r\n if (numInfluencers > 0) {\r\n defines.push(\"#define MORPHTARGETS\");\r\n }\r\n if (manager.isUsingTextureForTargets) {\r\n defines.push(\"#define MORPHTARGETS_TEXTURE\");\r\n\r\n if (uniforms.indexOf(\"morphTargetTextureIndices\") === -1) {\r\n uniforms.push(\"morphTargetTextureIndices\");\r\n }\r\n\r\n if (this._options.samplers.indexOf(\"morphTargets\") === -1) {\r\n this._options.samplers.push(\"morphTargets\");\r\n }\r\n }\r\n defines.push(\"#define NUM_MORPH_INFLUENCERS \" + numInfluencers);\r\n for (let index = 0; index < numInfluencers; index++) {\r\n attribs.push(VertexBuffer.PositionKind + index);\r\n\r\n if (normal) {\r\n attribs.push(VertexBuffer.NormalKind + index);\r\n }\r\n\r\n if (tangent) {\r\n attribs.push(VertexBuffer.TangentKind + index);\r\n }\r\n\r\n if (uv) {\r\n attribs.push(VertexBuffer.UVKind + \"_\" + index);\r\n }\r\n }\r\n if (numInfluencers > 0) {\r\n uniforms = uniforms.slice();\r\n uniforms.push(\"morphTargetInfluences\");\r\n uniforms.push(\"morphTargetCount\");\r\n uniforms.push(\"morphTargetTextureInfo\");\r\n uniforms.push(\"morphTargetTextureIndices\");\r\n }\r\n } else {\r\n defines.push(\"#define NUM_MORPH_INFLUENCERS 0\");\r\n }\r\n\r\n // Baked Vertex Animation\r\n if (mesh) {\r\n const bvaManager = (mesh).bakedVertexAnimationManager;\r\n\r\n if (bvaManager && bvaManager.isEnabled) {\r\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\r\n if (uniforms.indexOf(\"bakedVertexAnimationSettings\") === -1) {\r\n uniforms.push(\"bakedVertexAnimationSettings\");\r\n }\r\n if (uniforms.indexOf(\"bakedVertexAnimationTextureSizeInverted\") === -1) {\r\n uniforms.push(\"bakedVertexAnimationTextureSizeInverted\");\r\n }\r\n if (uniforms.indexOf(\"bakedVertexAnimationTime\") === -1) {\r\n uniforms.push(\"bakedVertexAnimationTime\");\r\n }\r\n\r\n if (this._options.samplers.indexOf(\"bakedVertexAnimationTexture\") === -1) {\r\n this._options.samplers.push(\"bakedVertexAnimationTexture\");\r\n }\r\n }\r\n\r\n PrepareAttributesForBakedVertexAnimation(attribs, mesh, defines);\r\n }\r\n\r\n // Textures\r\n for (const name in this._textures) {\r\n if (!this._textures[name].isReady()) {\r\n return false;\r\n }\r\n }\r\n\r\n // Alpha test\r\n if (mesh && this._shouldTurnAlphaTestOn(mesh)) {\r\n defines.push(\"#define ALPHATEST\");\r\n }\r\n\r\n // Clip planes\r\n if (this._options.useClipPlane !== false) {\r\n addClipPlaneUniforms(uniforms);\r\n\r\n prepareStringDefinesForClipPlanes(this, scene, defines);\r\n }\r\n\r\n // Fog\r\n if (scene.fogEnabled && mesh?.applyFog && scene.fogMode !== Scene.FOGMODE_NONE) {\r\n defines.push(\"#define FOG\");\r\n if (uniforms.indexOf(\"view\") === -1) {\r\n uniforms.push(\"view\");\r\n }\r\n if (uniforms.indexOf(\"vFogInfos\") === -1) {\r\n uniforms.push(\"vFogInfos\");\r\n }\r\n if (uniforms.indexOf(\"vFogColor\") === -1) {\r\n uniforms.push(\"vFogColor\");\r\n }\r\n }\r\n\r\n // Misc\r\n if (this._useLogarithmicDepth) {\r\n defines.push(\"#define LOGARITHMICDEPTH\");\r\n if (uniforms.indexOf(\"logarithmicDepthConstant\") === -1) {\r\n uniforms.push(\"logarithmicDepthConstant\");\r\n }\r\n }\r\n\r\n if (this.customShaderNameResolve) {\r\n uniforms = uniforms.slice();\r\n uniformBuffers = uniformBuffers.slice();\r\n samplers = samplers.slice();\r\n shaderName = this.customShaderNameResolve(this.name, uniforms, uniformBuffers, samplers, defines, attribs);\r\n }\r\n\r\n const drawWrapper = storeEffectOnSubMeshes ? subMesh._getDrawWrapper(undefined, true) : this._drawWrapper;\r\n const previousEffect = drawWrapper?.effect ?? null;\r\n const previousDefines = drawWrapper?.defines ?? null;\r\n const join = defines.join(\"\\n\");\r\n\r\n let effect = previousEffect;\r\n if (previousDefines !== join) {\r\n effect = engine.createEffect(\r\n shaderName,\r\n {\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { maxSimultaneousMorphTargets: numInfluencers },\r\n shaderLanguage: this._options.shaderLanguage,\r\n },\r\n engine\r\n );\r\n\r\n if (storeEffectOnSubMeshes) {\r\n subMesh.setEffect(effect, join, this._materialContext);\r\n } else if (drawWrapper) {\r\n drawWrapper.setEffect(effect, join);\r\n }\r\n\r\n if (this._onEffectCreatedObservable) {\r\n onCreatedEffectParameters.effect = effect;\r\n onCreatedEffectParameters.subMesh = subMesh ?? mesh?.subMeshes[0] ?? null;\r\n this._onEffectCreatedObservable.notifyObservers(onCreatedEffectParameters);\r\n }\r\n }\r\n\r\n drawWrapper!._wasPreviouslyUsingInstances = !!useInstances;\r\n\r\n if (!effect?.isReady() ?? true) {\r\n return false;\r\n }\r\n\r\n if (previousEffect !== effect) {\r\n scene.resetCachedMaterial();\r\n }\r\n\r\n drawWrapper!._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Binds the world matrix to the material\r\n * @param world defines the world transformation matrix\r\n * @param effectOverride - If provided, use this effect instead of internal effect\r\n */\r\n public bindOnlyWorldMatrix(world: Matrix, effectOverride?: Nullable): void {\r\n const scene = this.getScene();\r\n\r\n const effect = effectOverride ?? this.getEffect();\r\n\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n if (this._options.uniforms.indexOf(\"world\") !== -1) {\r\n effect.setMatrix(\"world\", world);\r\n }\r\n\r\n if (this._options.uniforms.indexOf(\"worldView\") !== -1) {\r\n world.multiplyToRef(scene.getViewMatrix(), this._cachedWorldViewMatrix);\r\n effect.setMatrix(\"worldView\", this._cachedWorldViewMatrix);\r\n }\r\n\r\n if (this._options.uniforms.indexOf(\"worldViewProjection\") !== -1) {\r\n world.multiplyToRef(scene.getTransformMatrix(), this._cachedWorldViewProjectionMatrix);\r\n effect.setMatrix(\"worldViewProjection\", this._cachedWorldViewProjectionMatrix);\r\n }\r\n\r\n if (this._options.uniforms.indexOf(\"view\") !== -1) {\r\n effect.setMatrix(\"view\", scene.getViewMatrix());\r\n }\r\n }\r\n\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n this.bind(world, mesh, subMesh._drawWrapperOverride?.effect, subMesh);\r\n }\r\n\r\n /**\r\n * Binds the material to the mesh\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh to bind the material to\r\n * @param effectOverride - If provided, use this effect instead of internal effect\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public bind(world: Matrix, mesh?: Mesh, effectOverride?: Nullable, subMesh?: SubMesh): void {\r\n // Std values\r\n const storeEffectOnSubMeshes = subMesh && this._storeEffectOnSubMeshes;\r\n const effect = effectOverride ?? (storeEffectOnSubMeshes ? subMesh.effect : this.getEffect());\r\n\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n this._activeEffect = effect;\r\n\r\n this.bindOnlyWorldMatrix(world, effectOverride);\r\n\r\n const uniformBuffers = this._options.uniformBuffers;\r\n\r\n let useSceneUBO = false;\r\n\r\n if (effect && uniformBuffers && uniformBuffers.length > 0 && scene.getEngine().supportsUniformBuffers) {\r\n for (let i = 0; i < uniformBuffers.length; ++i) {\r\n const bufferName = uniformBuffers[i];\r\n switch (bufferName) {\r\n case \"Mesh\":\r\n if (mesh) {\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n mesh.transferToEffect(world);\r\n }\r\n break;\r\n case \"Scene\":\r\n BindSceneUniformBuffer(effect, scene.getSceneUniformBuffer());\r\n scene.finalizeSceneUbo();\r\n useSceneUBO = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const mustRebind = mesh && storeEffectOnSubMeshes ? this._mustRebind(scene, effect, subMesh, mesh.visibility) : scene.getCachedMaterial() !== this;\r\n\r\n if (effect && mustRebind) {\r\n if (!useSceneUBO && this._options.uniforms.indexOf(\"view\") !== -1) {\r\n effect.setMatrix(\"view\", scene.getViewMatrix());\r\n }\r\n\r\n if (!useSceneUBO && this._options.uniforms.indexOf(\"projection\") !== -1) {\r\n effect.setMatrix(\"projection\", scene.getProjectionMatrix());\r\n }\r\n\r\n if (!useSceneUBO && this._options.uniforms.indexOf(\"viewProjection\") !== -1) {\r\n effect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n if (this._multiview) {\r\n effect.setMatrix(\"viewProjectionR\", scene._transformMatrixR);\r\n }\r\n }\r\n\r\n if (scene.activeCamera && this._options.uniforms.indexOf(\"cameraPosition\") !== -1) {\r\n effect.setVector3(\"cameraPosition\", scene.activeCamera!.globalPosition);\r\n }\r\n\r\n // Bones\r\n BindBonesParameters(mesh, effect);\r\n\r\n // Clip plane\r\n bindClipPlane(effect, this, scene);\r\n\r\n // Misc\r\n if (this._useLogarithmicDepth) {\r\n BindLogDepth(storeEffectOnSubMeshes ? subMesh.materialDefines : effect.defines, effect, scene);\r\n }\r\n\r\n // Fog\r\n if (mesh) {\r\n BindFogParameters(scene, mesh, effect);\r\n }\r\n\r\n let name: string;\r\n // Texture\r\n for (name in this._textures) {\r\n effect.setTexture(name, this._textures[name]);\r\n }\r\n\r\n // Texture arrays\r\n for (name in this._textureArrays) {\r\n effect.setTextureArray(name, this._textureArrays[name]);\r\n }\r\n\r\n // External texture\r\n for (name in this._externalTextures) {\r\n effect.setExternalTexture(name, this._externalTextures[name]);\r\n }\r\n\r\n // Int\r\n for (name in this._ints) {\r\n effect.setInt(name, this._ints[name]);\r\n }\r\n\r\n // UInt\r\n for (name in this._uints) {\r\n effect.setUInt(name, this._uints[name]);\r\n }\r\n\r\n // Float\r\n for (name in this._floats) {\r\n effect.setFloat(name, this._floats[name]);\r\n }\r\n\r\n // Floats\r\n for (name in this._floatsArrays) {\r\n effect.setArray(name, this._floatsArrays[name]);\r\n }\r\n\r\n // Color3\r\n for (name in this._colors3) {\r\n effect.setColor3(name, this._colors3[name]);\r\n }\r\n\r\n // Color3Array\r\n for (name in this._colors3Arrays) {\r\n effect.setArray3(name, this._colors3Arrays[name]);\r\n }\r\n\r\n // Color4\r\n for (name in this._colors4) {\r\n const color = this._colors4[name];\r\n effect.setFloat4(name, color.r, color.g, color.b, color.a);\r\n }\r\n\r\n // Color4Array\r\n for (name in this._colors4Arrays) {\r\n effect.setArray4(name, this._colors4Arrays[name]);\r\n }\r\n\r\n // Vector2\r\n for (name in this._vectors2) {\r\n effect.setVector2(name, this._vectors2[name]);\r\n }\r\n\r\n // Vector3\r\n for (name in this._vectors3) {\r\n effect.setVector3(name, this._vectors3[name]);\r\n }\r\n\r\n // Vector4\r\n for (name in this._vectors4) {\r\n effect.setVector4(name, this._vectors4[name]);\r\n }\r\n\r\n // Quaternion\r\n for (name in this._quaternions) {\r\n effect.setQuaternion(name, this._quaternions[name]);\r\n }\r\n\r\n // Matrix\r\n for (name in this._matrices) {\r\n effect.setMatrix(name, this._matrices[name]);\r\n }\r\n\r\n // MatrixArray\r\n for (name in this._matrixArrays) {\r\n effect.setMatrices(name, this._matrixArrays[name]);\r\n }\r\n\r\n // Matrix 3x3\r\n for (name in this._matrices3x3) {\r\n effect.setMatrix3x3(name, this._matrices3x3[name]);\r\n }\r\n\r\n // Matrix 2x2\r\n for (name in this._matrices2x2) {\r\n effect.setMatrix2x2(name, this._matrices2x2[name]);\r\n }\r\n\r\n // Vector2Array\r\n for (name in this._vectors2Arrays) {\r\n effect.setArray2(name, this._vectors2Arrays[name]);\r\n }\r\n\r\n // Vector3Array\r\n for (name in this._vectors3Arrays) {\r\n effect.setArray3(name, this._vectors3Arrays[name]);\r\n }\r\n\r\n // Vector4Array\r\n for (name in this._vectors4Arrays) {\r\n effect.setArray4(name, this._vectors4Arrays[name]);\r\n }\r\n\r\n // QuaternionArray\r\n for (name in this._quaternionsArrays) {\r\n effect.setArray4(name, this._quaternionsArrays[name]);\r\n }\r\n\r\n // Uniform buffers\r\n for (name in this._uniformBuffers) {\r\n const buffer = this._uniformBuffers[name].getBuffer();\r\n if (buffer) {\r\n effect.bindUniformBuffer(buffer, name);\r\n }\r\n }\r\n\r\n // Samplers\r\n for (name in this._textureSamplers) {\r\n effect.setTextureSampler(name, this._textureSamplers[name]);\r\n }\r\n\r\n // Storage buffers\r\n for (name in this._storageBuffers) {\r\n effect.setStorageBuffer(name, this._storageBuffers[name]);\r\n }\r\n }\r\n\r\n if (effect && mesh && (mustRebind || !this.isFrozen)) {\r\n // Morph targets\r\n const manager = (mesh).morphTargetManager;\r\n if (manager && manager.numInfluencers > 0) {\r\n BindMorphTargetParameters(mesh, effect);\r\n }\r\n\r\n const bvaManager = (mesh).bakedVertexAnimationManager;\r\n\r\n if (bvaManager && bvaManager.isEnabled) {\r\n const drawWrapper = storeEffectOnSubMeshes ? subMesh._drawWrapper : this._drawWrapper;\r\n mesh.bakedVertexAnimationManager?.bind(effect, !!drawWrapper._wasPreviouslyUsingInstances);\r\n }\r\n }\r\n\r\n this._afterBind(mesh, effect, subMesh);\r\n }\r\n\r\n /**\r\n * Gets the active textures from the material\r\n * @returns an array of textures\r\n */\r\n public getActiveTextures(): BaseTexture[] {\r\n const activeTextures = super.getActiveTextures();\r\n\r\n for (const name in this._textures) {\r\n activeTextures.push(this._textures[name]);\r\n }\r\n\r\n for (const name in this._textureArrays) {\r\n const array = this._textureArrays[name];\r\n for (let index = 0; index < array.length; index++) {\r\n activeTextures.push(array[index]);\r\n }\r\n }\r\n\r\n return activeTextures;\r\n }\r\n\r\n /**\r\n * Specifies if the material uses a texture\r\n * @param texture defines the texture to check against the material\r\n * @returns a boolean specifying if the material uses the texture\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n if (super.hasTexture(texture)) {\r\n return true;\r\n }\r\n\r\n for (const name in this._textures) {\r\n if (this._textures[name] === texture) {\r\n return true;\r\n }\r\n }\r\n\r\n for (const name in this._textureArrays) {\r\n const array = this._textureArrays[name];\r\n for (let index = 0; index < array.length; index++) {\r\n if (array[index] === texture) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the material, and gives it a new name\r\n * @param name defines the new name for the duplicated material\r\n * @returns the cloned material\r\n */\r\n public clone(name: string): ShaderMaterial {\r\n const result = SerializationHelper.Clone(() => new ShaderMaterial(name, this.getScene(), this._shaderPath, this._options, this._storeEffectOnSubMeshes), this);\r\n\r\n result.name = name;\r\n result.id = name;\r\n\r\n // Shader code path\r\n if (typeof result._shaderPath === \"object\") {\r\n result._shaderPath = { ...result._shaderPath };\r\n }\r\n\r\n // Options\r\n this._options = { ...this._options };\r\n\r\n (Object.keys(this._options) as Array).forEach((propName) => {\r\n const propValue = this._options[propName];\r\n if (Array.isArray(propValue)) {\r\n (this._options[propName]) = propValue.slice(0);\r\n }\r\n });\r\n\r\n // Stencil\r\n this.stencil.copyTo(result.stencil);\r\n\r\n // Texture\r\n for (const key in this._textures) {\r\n result.setTexture(key, this._textures[key]);\r\n }\r\n\r\n // TextureArray\r\n for (const key in this._textureArrays) {\r\n result.setTextureArray(key, this._textureArrays[key]);\r\n }\r\n\r\n // External texture\r\n for (const key in this._externalTextures) {\r\n result.setExternalTexture(key, this._externalTextures[key]);\r\n }\r\n\r\n // Int\r\n for (const key in this._ints) {\r\n result.setInt(key, this._ints[key]);\r\n }\r\n\r\n // UInt\r\n for (const key in this._uints) {\r\n result.setUInt(key, this._uints[key]);\r\n }\r\n\r\n // Float\r\n for (const key in this._floats) {\r\n result.setFloat(key, this._floats[key]);\r\n }\r\n\r\n // Floats\r\n for (const key in this._floatsArrays) {\r\n result.setFloats(key, this._floatsArrays[key]);\r\n }\r\n\r\n // Color3\r\n for (const key in this._colors3) {\r\n result.setColor3(key, this._colors3[key]);\r\n }\r\n\r\n // Color3Array\r\n for (const key in this._colors3Arrays) {\r\n result._colors3Arrays[key] = this._colors3Arrays[key];\r\n }\r\n\r\n // Color4\r\n for (const key in this._colors4) {\r\n result.setColor4(key, this._colors4[key]);\r\n }\r\n\r\n // Color4Array\r\n for (const key in this._colors4Arrays) {\r\n result._colors4Arrays[key] = this._colors4Arrays[key];\r\n }\r\n\r\n // Vector2\r\n for (const key in this._vectors2) {\r\n result.setVector2(key, this._vectors2[key]);\r\n }\r\n\r\n // Vector3\r\n for (const key in this._vectors3) {\r\n result.setVector3(key, this._vectors3[key]);\r\n }\r\n\r\n // Vector4\r\n for (const key in this._vectors4) {\r\n result.setVector4(key, this._vectors4[key]);\r\n }\r\n\r\n // Quaternion\r\n for (const key in this._quaternions) {\r\n result.setQuaternion(key, this._quaternions[key]);\r\n }\r\n\r\n // QuaternionArray\r\n for (const key in this._quaternionsArrays) {\r\n result._quaternionsArrays[key] = this._quaternionsArrays[key];\r\n }\r\n\r\n // Matrix\r\n for (const key in this._matrices) {\r\n result.setMatrix(key, this._matrices[key]);\r\n }\r\n\r\n // MatrixArray\r\n for (const key in this._matrixArrays) {\r\n result._matrixArrays[key] = this._matrixArrays[key].slice();\r\n }\r\n\r\n // Matrix 3x3\r\n for (const key in this._matrices3x3) {\r\n result.setMatrix3x3(key, this._matrices3x3[key]);\r\n }\r\n\r\n // Matrix 2x2\r\n for (const key in this._matrices2x2) {\r\n result.setMatrix2x2(key, this._matrices2x2[key]);\r\n }\r\n\r\n // Vector2Array\r\n for (const key in this._vectors2Arrays) {\r\n result.setArray2(key, this._vectors2Arrays[key]);\r\n }\r\n\r\n // Vector3Array\r\n for (const key in this._vectors3Arrays) {\r\n result.setArray3(key, this._vectors3Arrays[key]);\r\n }\r\n\r\n // Vector4Array\r\n for (const key in this._vectors4Arrays) {\r\n result.setArray4(key, this._vectors4Arrays[key]);\r\n }\r\n\r\n // Uniform buffers\r\n for (const key in this._uniformBuffers) {\r\n result.setUniformBuffer(key, this._uniformBuffers[key]);\r\n }\r\n\r\n // Samplers\r\n for (const key in this._textureSamplers) {\r\n result.setTextureSampler(key, this._textureSamplers[key]);\r\n }\r\n\r\n // Storag buffers\r\n for (const key in this._storageBuffers) {\r\n result.setStorageBuffer(key, this._storageBuffers[key]);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Disposes the material\r\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\r\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\r\n * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh\r\n */\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean): void {\r\n if (forceDisposeTextures) {\r\n let name: string;\r\n for (name in this._textures) {\r\n this._textures[name].dispose();\r\n }\r\n\r\n for (name in this._textureArrays) {\r\n const array = this._textureArrays[name];\r\n for (let index = 0; index < array.length; index++) {\r\n array[index].dispose();\r\n }\r\n }\r\n }\r\n\r\n this._textures = {};\r\n\r\n super.dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh);\r\n }\r\n\r\n /**\r\n * Serializes this material in a JSON representation\r\n * @returns the serialized material object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"BABYLON.ShaderMaterial\";\r\n serializationObject.uniqueId = this.uniqueId;\r\n\r\n serializationObject.options = this._options;\r\n serializationObject.shaderPath = this._shaderPath;\r\n serializationObject.storeEffectOnSubMeshes = this._storeEffectOnSubMeshes;\r\n\r\n let name: string;\r\n\r\n // Stencil\r\n serializationObject.stencil = this.stencil.serialize();\r\n\r\n // Texture\r\n serializationObject.textures = {};\r\n for (name in this._textures) {\r\n serializationObject.textures[name] = this._textures[name].serialize();\r\n }\r\n\r\n // Texture arrays\r\n serializationObject.textureArrays = {};\r\n for (name in this._textureArrays) {\r\n serializationObject.textureArrays[name] = [];\r\n const array = this._textureArrays[name];\r\n for (let index = 0; index < array.length; index++) {\r\n serializationObject.textureArrays[name].push(array[index].serialize());\r\n }\r\n }\r\n\r\n // Int\r\n serializationObject.ints = {};\r\n for (name in this._ints) {\r\n serializationObject.ints[name] = this._ints[name];\r\n }\r\n\r\n // UInt\r\n serializationObject.uints = {};\r\n for (name in this._uints) {\r\n serializationObject.uints[name] = this._uints[name];\r\n }\r\n\r\n // Float\r\n serializationObject.floats = {};\r\n for (name in this._floats) {\r\n serializationObject.floats[name] = this._floats[name];\r\n }\r\n\r\n // Floats\r\n serializationObject.floatsArrays = {};\r\n for (name in this._floatsArrays) {\r\n serializationObject.floatsArrays[name] = this._floatsArrays[name];\r\n }\r\n\r\n // Color3\r\n serializationObject.colors3 = {};\r\n for (name in this._colors3) {\r\n serializationObject.colors3[name] = this._colors3[name].asArray();\r\n }\r\n\r\n // Color3 array\r\n serializationObject.colors3Arrays = {};\r\n for (name in this._colors3Arrays) {\r\n serializationObject.colors3Arrays[name] = this._colors3Arrays[name];\r\n }\r\n\r\n // Color4\r\n serializationObject.colors4 = {};\r\n for (name in this._colors4) {\r\n serializationObject.colors4[name] = this._colors4[name].asArray();\r\n }\r\n\r\n // Color4 array\r\n serializationObject.colors4Arrays = {};\r\n for (name in this._colors4Arrays) {\r\n serializationObject.colors4Arrays[name] = this._colors4Arrays[name];\r\n }\r\n\r\n // Vector2\r\n serializationObject.vectors2 = {};\r\n for (name in this._vectors2) {\r\n serializationObject.vectors2[name] = this._vectors2[name].asArray();\r\n }\r\n\r\n // Vector3\r\n serializationObject.vectors3 = {};\r\n for (name in this._vectors3) {\r\n serializationObject.vectors3[name] = this._vectors3[name].asArray();\r\n }\r\n\r\n // Vector4\r\n serializationObject.vectors4 = {};\r\n for (name in this._vectors4) {\r\n serializationObject.vectors4[name] = this._vectors4[name].asArray();\r\n }\r\n\r\n // Quaternion\r\n serializationObject.quaternions = {};\r\n for (name in this._quaternions) {\r\n serializationObject.quaternions[name] = this._quaternions[name].asArray();\r\n }\r\n\r\n // Matrix\r\n serializationObject.matrices = {};\r\n for (name in this._matrices) {\r\n serializationObject.matrices[name] = this._matrices[name].asArray();\r\n }\r\n\r\n // MatrixArray\r\n serializationObject.matrixArray = {};\r\n for (name in this._matrixArrays) {\r\n serializationObject.matrixArray[name] = this._matrixArrays[name];\r\n }\r\n\r\n // Matrix 3x3\r\n serializationObject.matrices3x3 = {};\r\n for (name in this._matrices3x3) {\r\n serializationObject.matrices3x3[name] = this._matrices3x3[name];\r\n }\r\n\r\n // Matrix 2x2\r\n serializationObject.matrices2x2 = {};\r\n for (name in this._matrices2x2) {\r\n serializationObject.matrices2x2[name] = this._matrices2x2[name];\r\n }\r\n\r\n // Vector2Array\r\n serializationObject.vectors2Arrays = {};\r\n for (name in this._vectors2Arrays) {\r\n serializationObject.vectors2Arrays[name] = this._vectors2Arrays[name];\r\n }\r\n\r\n // Vector3Array\r\n serializationObject.vectors3Arrays = {};\r\n for (name in this._vectors3Arrays) {\r\n serializationObject.vectors3Arrays[name] = this._vectors3Arrays[name];\r\n }\r\n\r\n // Vector4Array\r\n serializationObject.vectors4Arrays = {};\r\n for (name in this._vectors4Arrays) {\r\n serializationObject.vectors4Arrays[name] = this._vectors4Arrays[name];\r\n }\r\n\r\n // QuaternionArray\r\n serializationObject.quaternionsArrays = {};\r\n for (name in this._quaternionsArrays) {\r\n serializationObject.quaternionsArrays[name] = this._quaternionsArrays[name];\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Creates a shader material from parsed shader material data\r\n * @param source defines the JSON representation of the material\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a new material\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): ShaderMaterial {\r\n const material = SerializationHelper.Parse(\r\n () => new ShaderMaterial(source.name, scene, source.shaderPath, source.options, source.storeEffectOnSubMeshes),\r\n source,\r\n scene,\r\n rootUrl\r\n );\r\n\r\n let name: string;\r\n\r\n // Stencil\r\n if (source.stencil) {\r\n material.stencil.parse(source.stencil, scene, rootUrl);\r\n }\r\n\r\n // Texture\r\n for (name in source.textures) {\r\n material.setTexture(name, Texture.Parse(source.textures[name], scene, rootUrl));\r\n }\r\n\r\n // Texture arrays\r\n for (name in source.textureArrays) {\r\n const array = source.textureArrays[name];\r\n const textureArray: Texture[] = [];\r\n\r\n for (let index = 0; index < array.length; index++) {\r\n textureArray.push(Texture.Parse(array[index], scene, rootUrl));\r\n }\r\n material.setTextureArray(name, textureArray);\r\n }\r\n\r\n // Int\r\n for (name in source.ints) {\r\n material.setInt(name, source.ints[name]);\r\n }\r\n\r\n // UInt\r\n for (name in source.uints) {\r\n material.setUInt(name, source.uints[name]);\r\n }\r\n\r\n // Float\r\n for (name in source.floats) {\r\n material.setFloat(name, source.floats[name]);\r\n }\r\n\r\n // Floats\r\n for (name in source.floatsArrays) {\r\n material.setFloats(name, source.floatsArrays[name]);\r\n }\r\n\r\n // Color3\r\n for (name in source.colors3) {\r\n material.setColor3(name, Color3.FromArray(source.colors3[name]));\r\n }\r\n\r\n // Color3 arrays\r\n for (name in source.colors3Arrays) {\r\n const colors: Color3[] = source.colors3Arrays[name]\r\n .reduce((arr: Array>, num: number, i: number) => {\r\n if (i % 3 === 0) {\r\n arr.push([num]);\r\n } else {\r\n arr[arr.length - 1].push(num);\r\n }\r\n return arr;\r\n }, [])\r\n .map((color: ArrayLike) => Color3.FromArray(color));\r\n material.setColor3Array(name, colors);\r\n }\r\n\r\n // Color4\r\n for (name in source.colors4) {\r\n material.setColor4(name, Color4.FromArray(source.colors4[name]));\r\n }\r\n\r\n // Color4 arrays\r\n for (name in source.colors4Arrays) {\r\n const colors: Color4[] = source.colors4Arrays[name]\r\n .reduce((arr: Array>, num: number, i: number) => {\r\n if (i % 4 === 0) {\r\n arr.push([num]);\r\n } else {\r\n arr[arr.length - 1].push(num);\r\n }\r\n return arr;\r\n }, [])\r\n .map((color: ArrayLike) => Color4.FromArray(color));\r\n material.setColor4Array(name, colors);\r\n }\r\n\r\n // Vector2\r\n for (name in source.vectors2) {\r\n material.setVector2(name, Vector2.FromArray(source.vectors2[name]));\r\n }\r\n\r\n // Vector3\r\n for (name in source.vectors3) {\r\n material.setVector3(name, Vector3.FromArray(source.vectors3[name]));\r\n }\r\n\r\n // Vector4\r\n for (name in source.vectors4) {\r\n material.setVector4(name, Vector4.FromArray(source.vectors4[name]));\r\n }\r\n\r\n // Quaternion\r\n for (name in source.quaternions) {\r\n material.setQuaternion(name, Quaternion.FromArray(source.quaternions[name]));\r\n }\r\n\r\n // Matrix\r\n for (name in source.matrices) {\r\n material.setMatrix(name, Matrix.FromArray(source.matrices[name]));\r\n }\r\n\r\n // MatrixArray\r\n for (name in source.matrixArray) {\r\n material._matrixArrays[name] = new Float32Array(source.matrixArray[name]);\r\n }\r\n\r\n // Matrix 3x3\r\n for (name in source.matrices3x3) {\r\n material.setMatrix3x3(name, source.matrices3x3[name]);\r\n }\r\n\r\n // Matrix 2x2\r\n for (name in source.matrices2x2) {\r\n material.setMatrix2x2(name, source.matrices2x2[name]);\r\n }\r\n\r\n // Vector2Array\r\n for (name in source.vectors2Arrays) {\r\n material.setArray2(name, source.vectors2Arrays[name]);\r\n }\r\n\r\n // Vector3Array\r\n for (name in source.vectors3Arrays) {\r\n material.setArray3(name, source.vectors3Arrays[name]);\r\n }\r\n\r\n // Vector4Array\r\n for (name in source.vectors4Arrays) {\r\n material.setArray4(name, source.vectors4Arrays[name]);\r\n }\r\n\r\n // QuaternionArray\r\n for (name in source.quaternionsArrays) {\r\n material.setArray4(name, source.quaternionsArrays[name]);\r\n }\r\n\r\n return material;\r\n }\r\n\r\n /**\r\n * Creates a new ShaderMaterial from a snippet saved in a remote file\r\n * @param name defines the name of the ShaderMaterial to create (can be null or empty to use the one from the json data)\r\n * @param url defines the url to load from\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new ShaderMaterial\r\n */\r\n public static ParseFromFileAsync(name: Nullable, url: string, scene: Scene, rootUrl = \"\"): Promise {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const serializationObject = JSON.parse(request.responseText);\r\n const output = this.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\r\n\r\n if (name) {\r\n output.name = name;\r\n }\r\n\r\n resolve(output);\r\n } else {\r\n reject(\"Unable to load the ShaderMaterial\");\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", url);\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a ShaderMaterial from a snippet saved by the Inspector\r\n * @param snippetId defines the snippet to load\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new ShaderMaterial\r\n */\r\n public static ParseFromSnippetAsync(snippetId: string, scene: Scene, rootUrl = \"\"): Promise {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n const serializationObject = JSON.parse(snippet.shaderMaterial);\r\n const output = this.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\r\n\r\n output.snippetId = snippetId;\r\n\r\n resolve(output);\r\n } else {\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a ShaderMaterial from a snippet saved by the Inspector\r\n * @deprecated Please use ParseFromSnippetAsync instead\r\n * @param snippetId defines the snippet to load\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new ShaderMaterial\r\n */\r\n public static CreateFromSnippetAsync = ShaderMaterial.ParseFromSnippetAsync;\r\n}\r\n\r\nRegisterClass(\"BABYLON.ShaderMaterial\", ShaderMaterial);\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n/** Defines the cross module used constants to avoid circular dependencies */\r\nexport class Constants {\r\n /** Defines that alpha blending is disabled */\r\n public static readonly ALPHA_DISABLE = 0;\r\n /** Defines that alpha blending is SRC ALPHA * SRC + DEST */\r\n public static readonly ALPHA_ADD = 1;\r\n /** Defines that alpha blending is SRC ALPHA * SRC + (1 - SRC ALPHA) * DEST */\r\n public static readonly ALPHA_COMBINE = 2;\r\n /** Defines that alpha blending is DEST - SRC * DEST */\r\n public static readonly ALPHA_SUBTRACT = 3;\r\n /** Defines that alpha blending is SRC * DEST */\r\n public static readonly ALPHA_MULTIPLY = 4;\r\n /** Defines that alpha blending is SRC ALPHA * SRC + (1 - SRC) * DEST */\r\n public static readonly ALPHA_MAXIMIZED = 5;\r\n /** Defines that alpha blending is SRC + DEST */\r\n public static readonly ALPHA_ONEONE = 6;\r\n /** Defines that alpha blending is SRC + (1 - SRC ALPHA) * DEST */\r\n public static readonly ALPHA_PREMULTIPLIED = 7;\r\n /**\r\n * Defines that alpha blending is SRC + (1 - SRC ALPHA) * DEST\r\n * Alpha will be set to (1 - SRC ALPHA) * DEST ALPHA\r\n */\r\n public static readonly ALPHA_PREMULTIPLIED_PORTERDUFF = 8;\r\n /** Defines that alpha blending is CST * SRC + (1 - CST) * DEST */\r\n public static readonly ALPHA_INTERPOLATE = 9;\r\n /**\r\n * Defines that alpha blending is SRC + (1 - SRC) * DEST\r\n * Alpha will be set to SRC ALPHA + (1 - SRC ALPHA) * DEST ALPHA\r\n */\r\n public static readonly ALPHA_SCREENMODE = 10;\r\n /**\r\n * Defines that alpha blending is SRC + DST\r\n * Alpha will be set to SRC ALPHA + DST ALPHA\r\n */\r\n public static readonly ALPHA_ONEONE_ONEONE = 11;\r\n /**\r\n * Defines that alpha blending is SRC * DST ALPHA + DST\r\n * Alpha will be set to 0\r\n */\r\n public static readonly ALPHA_ALPHATOCOLOR = 12;\r\n /**\r\n * Defines that alpha blending is SRC * (1 - DST) + DST * (1 - SRC)\r\n */\r\n public static readonly ALPHA_REVERSEONEMINUS = 13;\r\n /**\r\n * Defines that alpha blending is SRC + DST * (1 - SRC ALPHA)\r\n * Alpha will be set to SRC ALPHA + DST ALPHA * (1 - SRC ALPHA)\r\n */\r\n public static readonly ALPHA_SRC_DSTONEMINUSSRCALPHA = 14;\r\n /**\r\n * Defines that alpha blending is SRC + DST\r\n * Alpha will be set to SRC ALPHA\r\n */\r\n public static readonly ALPHA_ONEONE_ONEZERO = 15;\r\n /**\r\n * Defines that alpha blending is SRC * (1 - DST) + DST * (1 - SRC)\r\n * Alpha will be set to DST ALPHA\r\n */\r\n public static readonly ALPHA_EXCLUSION = 16;\r\n /**\r\n * Defines that alpha blending is SRC * SRC ALPHA + DST * (1 - SRC ALPHA)\r\n * Alpha will be set to SRC ALPHA + (1 - SRC ALPHA) * DST ALPHA\r\n */\r\n public static readonly ALPHA_LAYER_ACCUMULATE = 17;\r\n\r\n /** Defines that alpha blending equation a SUM */\r\n public static readonly ALPHA_EQUATION_ADD = 0;\r\n /** Defines that alpha blending equation a SUBSTRACTION */\r\n public static readonly ALPHA_EQUATION_SUBSTRACT = 1;\r\n /** Defines that alpha blending equation a REVERSE SUBSTRACTION */\r\n public static readonly ALPHA_EQUATION_REVERSE_SUBTRACT = 2;\r\n /** Defines that alpha blending equation a MAX operation */\r\n public static readonly ALPHA_EQUATION_MAX = 3;\r\n /** Defines that alpha blending equation a MIN operation */\r\n public static readonly ALPHA_EQUATION_MIN = 4;\r\n /**\r\n * Defines that alpha blending equation a DARKEN operation:\r\n * It takes the min of the src and sums the alpha channels.\r\n */\r\n public static readonly ALPHA_EQUATION_DARKEN = 5;\r\n\r\n /** Defines that the resource is not delayed*/\r\n public static readonly DELAYLOADSTATE_NONE = 0;\r\n /** Defines that the resource was successfully delay loaded */\r\n public static readonly DELAYLOADSTATE_LOADED = 1;\r\n /** Defines that the resource is currently delay loading */\r\n public static readonly DELAYLOADSTATE_LOADING = 2;\r\n /** Defines that the resource is delayed and has not started loading */\r\n public static readonly DELAYLOADSTATE_NOTLOADED = 4;\r\n\r\n // Depth or Stencil test Constants.\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will never pass. i.e. Nothing will be drawn */\r\n public static readonly NEVER = 0x0200;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will always pass. i.e. Pixels will be drawn in the order they are drawn */\r\n public static readonly ALWAYS = 0x0207;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than the stored value */\r\n public static readonly LESS = 0x0201;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is equals to the stored value */\r\n public static readonly EQUAL = 0x0202;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than or equal to the stored value */\r\n public static readonly LEQUAL = 0x0203;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than the stored value */\r\n public static readonly GREATER = 0x0204;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than or equal to the stored value */\r\n public static readonly GEQUAL = 0x0206;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is not equal to the stored value */\r\n public static readonly NOTEQUAL = 0x0205;\r\n\r\n // Stencil Actions Constants.\r\n /** Passed to stencilOperation to specify that stencil value must be kept */\r\n public static readonly KEEP = 0x1e00;\r\n /** Passed to stencilOperation to specify that stencil value must be zero */\r\n public static readonly ZERO = 0x0000;\r\n /** Passed to stencilOperation to specify that stencil value must be replaced */\r\n public static readonly REPLACE = 0x1e01;\r\n /** Passed to stencilOperation to specify that stencil value must be incremented */\r\n public static readonly INCR = 0x1e02;\r\n /** Passed to stencilOperation to specify that stencil value must be decremented */\r\n public static readonly DECR = 0x1e03;\r\n /** Passed to stencilOperation to specify that stencil value must be inverted */\r\n public static readonly INVERT = 0x150a;\r\n /** Passed to stencilOperation to specify that stencil value must be incremented with wrapping */\r\n public static readonly INCR_WRAP = 0x8507;\r\n /** Passed to stencilOperation to specify that stencil value must be decremented with wrapping */\r\n public static readonly DECR_WRAP = 0x8508;\r\n\r\n /** Texture is not repeating outside of 0..1 UVs */\r\n public static readonly TEXTURE_CLAMP_ADDRESSMODE = 0;\r\n /** Texture is repeating outside of 0..1 UVs */\r\n public static readonly TEXTURE_WRAP_ADDRESSMODE = 1;\r\n /** Texture is repeating and mirrored */\r\n public static readonly TEXTURE_MIRROR_ADDRESSMODE = 2;\r\n\r\n /** Flag to create a storage texture */\r\n public static readonly TEXTURE_CREATIONFLAG_STORAGE = 1;\r\n\r\n /** ALPHA */\r\n public static readonly TEXTUREFORMAT_ALPHA = 0;\r\n /** LUMINANCE */\r\n public static readonly TEXTUREFORMAT_LUMINANCE = 1;\r\n /** LUMINANCE_ALPHA */\r\n public static readonly TEXTUREFORMAT_LUMINANCE_ALPHA = 2;\r\n /** RGB */\r\n public static readonly TEXTUREFORMAT_RGB = 4;\r\n /** RGBA */\r\n public static readonly TEXTUREFORMAT_RGBA = 5;\r\n /** RED */\r\n public static readonly TEXTUREFORMAT_RED = 6;\r\n /** RED (2nd reference) */\r\n public static readonly TEXTUREFORMAT_R = 6;\r\n /** RG */\r\n public static readonly TEXTUREFORMAT_RG = 7;\r\n /** RED_INTEGER */\r\n public static readonly TEXTUREFORMAT_RED_INTEGER = 8;\r\n /** RED_INTEGER (2nd reference) */\r\n public static readonly TEXTUREFORMAT_R_INTEGER = 8;\r\n /** RG_INTEGER */\r\n public static readonly TEXTUREFORMAT_RG_INTEGER = 9;\r\n /** RGB_INTEGER */\r\n public static readonly TEXTUREFORMAT_RGB_INTEGER = 10;\r\n /** RGBA_INTEGER */\r\n public static readonly TEXTUREFORMAT_RGBA_INTEGER = 11;\r\n /** BGRA */\r\n public static readonly TEXTUREFORMAT_BGRA = 12;\r\n\r\n /** Depth 24 bits + Stencil 8 bits */\r\n public static readonly TEXTUREFORMAT_DEPTH24_STENCIL8 = 13;\r\n /** Depth 32 bits float */\r\n public static readonly TEXTUREFORMAT_DEPTH32_FLOAT = 14;\r\n /** Depth 16 bits */\r\n public static readonly TEXTUREFORMAT_DEPTH16 = 15;\r\n /** Depth 24 bits */\r\n public static readonly TEXTUREFORMAT_DEPTH24 = 16;\r\n /** Depth 24 bits unorm + Stencil 8 bits */\r\n public static readonly TEXTUREFORMAT_DEPTH24UNORM_STENCIL8 = 17;\r\n /** Depth 32 bits float + Stencil 8 bits */\r\n public static readonly TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8 = 18;\r\n /** Stencil 8 bits */\r\n public static readonly TEXTUREFORMAT_STENCIL8 = 19;\r\n /** UNDEFINED */\r\n public static readonly TEXTUREFORMAT_UNDEFINED = 0xffffffff;\r\n\r\n /** Compressed BC7 */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGBA_BPTC_UNORM = 36492;\r\n /** Compressed BC7 (SRGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 36493;\r\n /** Compressed BC6 unsigned float */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 36495;\r\n /** Compressed BC6 signed float */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 36494;\r\n /** Compressed BC3 */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT5 = 33779;\r\n /** Compressed BC3 (SRGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 35919;\r\n /** Compressed BC2 */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT3 = 33778;\r\n /** Compressed BC2 (SRGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 35918;\r\n /** Compressed BC1 (RGBA) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT1 = 33777;\r\n /** Compressed BC1 (RGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGB_S3TC_DXT1 = 33776;\r\n /** Compressed BC1 (SRGB+A) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 35917;\r\n /** Compressed BC1 (SRGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB_S3TC_DXT1_EXT = 35916;\r\n /** Compressed ASTC 4x4 */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGBA_ASTC_4x4 = 37808;\r\n /** Compressed ASTC 4x4 (SRGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 37840;\r\n /** Compressed ETC1 (RGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGB_ETC1_WEBGL = 36196;\r\n /** Compressed ETC2 (RGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGB8_ETC2 = 37492;\r\n /** Compressed ETC2 (SRGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB8_ETC2 = 37493;\r\n /** Compressed ETC2 (RGB+A1) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 37494;\r\n /** Compressed ETC2 (SRGB+A1)*/\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 37495;\r\n /** Compressed ETC2 (RGB+A) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGBA8_ETC2_EAC = 37496;\r\n /** Compressed ETC2 (SRGB+1) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 37497;\r\n\r\n /** UNSIGNED_BYTE */\r\n public static readonly TEXTURETYPE_UNSIGNED_BYTE = 0;\r\n /** UNSIGNED_BYTE (2nd reference) */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT = 0;\r\n /** FLOAT */\r\n public static readonly TEXTURETYPE_FLOAT = 1;\r\n /** HALF_FLOAT */\r\n public static readonly TEXTURETYPE_HALF_FLOAT = 2;\r\n /** BYTE */\r\n public static readonly TEXTURETYPE_BYTE = 3;\r\n /** SHORT */\r\n public static readonly TEXTURETYPE_SHORT = 4;\r\n /** UNSIGNED_SHORT */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT = 5;\r\n /** INT */\r\n public static readonly TEXTURETYPE_INT = 6;\r\n /** UNSIGNED_INT */\r\n public static readonly TEXTURETYPE_UNSIGNED_INTEGER = 7;\r\n /** UNSIGNED_SHORT_4_4_4_4 */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4 = 8;\r\n /** UNSIGNED_SHORT_5_5_5_1 */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1 = 9;\r\n /** UNSIGNED_SHORT_5_6_5 */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT_5_6_5 = 10;\r\n /** UNSIGNED_INT_2_10_10_10_REV */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV = 11;\r\n /** UNSIGNED_INT_24_8 */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_24_8 = 12;\r\n /** UNSIGNED_INT_10F_11F_11F_REV */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV = 13;\r\n /** UNSIGNED_INT_5_9_9_9_REV */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV = 14;\r\n /** FLOAT_32_UNSIGNED_INT_24_8_REV */\r\n public static readonly TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV = 15;\r\n /** UNDEFINED */\r\n public static readonly TEXTURETYPE_UNDEFINED = 16;\r\n\r\n /** 2D Texture target*/\r\n public static readonly TEXTURE_2D = 3553;\r\n /** 2D Array Texture target */\r\n public static readonly TEXTURE_2D_ARRAY = 35866;\r\n /** Cube Map Texture target */\r\n public static readonly TEXTURE_CUBE_MAP = 34067;\r\n /** Cube Map Array Texture target */\r\n public static readonly TEXTURE_CUBE_MAP_ARRAY = 0xdeadbeef;\r\n /** 3D Texture target */\r\n public static readonly TEXTURE_3D = 32879;\r\n\r\n /** nearest is mag = nearest and min = nearest and no mip */\r\n public static readonly TEXTURE_NEAREST_SAMPLINGMODE = 1;\r\n /** mag = nearest and min = nearest and mip = none */\r\n public static readonly TEXTURE_NEAREST_NEAREST = 1;\r\n\r\n /** Bilinear is mag = linear and min = linear and no mip */\r\n public static readonly TEXTURE_BILINEAR_SAMPLINGMODE = 2;\r\n /** mag = linear and min = linear and mip = none */\r\n public static readonly TEXTURE_LINEAR_LINEAR = 2;\r\n\r\n /** Trilinear is mag = linear and min = linear and mip = linear */\r\n public static readonly TEXTURE_TRILINEAR_SAMPLINGMODE = 3;\r\n /** Trilinear is mag = linear and min = linear and mip = linear */\r\n public static readonly TEXTURE_LINEAR_LINEAR_MIPLINEAR = 3;\r\n\r\n /** mag = nearest and min = nearest and mip = nearest */\r\n public static readonly TEXTURE_NEAREST_NEAREST_MIPNEAREST = 4;\r\n /** mag = nearest and min = linear and mip = nearest */\r\n public static readonly TEXTURE_NEAREST_LINEAR_MIPNEAREST = 5;\r\n /** mag = nearest and min = linear and mip = linear */\r\n public static readonly TEXTURE_NEAREST_LINEAR_MIPLINEAR = 6;\r\n /** mag = nearest and min = linear and mip = none */\r\n public static readonly TEXTURE_NEAREST_LINEAR = 7;\r\n /** nearest is mag = nearest and min = nearest and mip = linear */\r\n public static readonly TEXTURE_NEAREST_NEAREST_MIPLINEAR = 8;\r\n /** mag = linear and min = nearest and mip = nearest */\r\n public static readonly TEXTURE_LINEAR_NEAREST_MIPNEAREST = 9;\r\n /** mag = linear and min = nearest and mip = linear */\r\n public static readonly TEXTURE_LINEAR_NEAREST_MIPLINEAR = 10;\r\n /** Bilinear is mag = linear and min = linear and mip = nearest */\r\n public static readonly TEXTURE_LINEAR_LINEAR_MIPNEAREST = 11;\r\n /** mag = linear and min = nearest and mip = none */\r\n public static readonly TEXTURE_LINEAR_NEAREST = 12;\r\n\r\n /** Explicit coordinates mode */\r\n public static readonly TEXTURE_EXPLICIT_MODE = 0;\r\n /** Spherical coordinates mode */\r\n public static readonly TEXTURE_SPHERICAL_MODE = 1;\r\n /** Planar coordinates mode */\r\n public static readonly TEXTURE_PLANAR_MODE = 2;\r\n /** Cubic coordinates mode */\r\n public static readonly TEXTURE_CUBIC_MODE = 3;\r\n /** Projection coordinates mode */\r\n public static readonly TEXTURE_PROJECTION_MODE = 4;\r\n /** Skybox coordinates mode */\r\n public static readonly TEXTURE_SKYBOX_MODE = 5;\r\n /** Inverse Cubic coordinates mode */\r\n public static readonly TEXTURE_INVCUBIC_MODE = 6;\r\n /** Equirectangular coordinates mode */\r\n public static readonly TEXTURE_EQUIRECTANGULAR_MODE = 7;\r\n /** Equirectangular Fixed coordinates mode */\r\n public static readonly TEXTURE_FIXED_EQUIRECTANGULAR_MODE = 8;\r\n /** Equirectangular Fixed Mirrored coordinates mode */\r\n public static readonly TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9;\r\n\r\n /** Offline (baking) quality for texture filtering */\r\n public static readonly TEXTURE_FILTERING_QUALITY_OFFLINE = 4096;\r\n\r\n /** High quality for texture filtering */\r\n public static readonly TEXTURE_FILTERING_QUALITY_HIGH = 64;\r\n\r\n /** Medium quality for texture filtering */\r\n public static readonly TEXTURE_FILTERING_QUALITY_MEDIUM = 16;\r\n\r\n /** Low quality for texture filtering */\r\n public static readonly TEXTURE_FILTERING_QUALITY_LOW = 8;\r\n\r\n // Texture rescaling mode\r\n /** Defines that texture rescaling will use a floor to find the closer power of 2 size */\r\n public static readonly SCALEMODE_FLOOR = 1;\r\n /** Defines that texture rescaling will look for the nearest power of 2 size */\r\n public static readonly SCALEMODE_NEAREST = 2;\r\n /** Defines that texture rescaling will use a ceil to find the closer power of 2 size */\r\n public static readonly SCALEMODE_CEILING = 3;\r\n\r\n /**\r\n * The dirty texture flag value\r\n */\r\n public static readonly MATERIAL_TextureDirtyFlag = 1;\r\n /**\r\n * The dirty light flag value\r\n */\r\n public static readonly MATERIAL_LightDirtyFlag = 2;\r\n /**\r\n * The dirty fresnel flag value\r\n */\r\n public static readonly MATERIAL_FresnelDirtyFlag = 4;\r\n /**\r\n * The dirty attribute flag value\r\n */\r\n public static readonly MATERIAL_AttributesDirtyFlag = 8;\r\n /**\r\n * The dirty misc flag value\r\n */\r\n public static readonly MATERIAL_MiscDirtyFlag = 16;\r\n /**\r\n * The dirty prepass flag value\r\n */\r\n public static readonly MATERIAL_PrePassDirtyFlag = 32;\r\n /**\r\n * The all dirty flag value\r\n */\r\n public static readonly MATERIAL_AllDirtyFlag = 63;\r\n\r\n /**\r\n * Returns the triangle fill mode\r\n */\r\n public static readonly MATERIAL_TriangleFillMode = 0;\r\n /**\r\n * Returns the wireframe mode\r\n */\r\n public static readonly MATERIAL_WireFrameFillMode = 1;\r\n /**\r\n * Returns the point fill mode\r\n */\r\n public static readonly MATERIAL_PointFillMode = 2;\r\n /**\r\n * Returns the point list draw mode\r\n */\r\n public static readonly MATERIAL_PointListDrawMode = 3;\r\n /**\r\n * Returns the line list draw mode\r\n */\r\n public static readonly MATERIAL_LineListDrawMode = 4;\r\n /**\r\n * Returns the line loop draw mode\r\n */\r\n public static readonly MATERIAL_LineLoopDrawMode = 5;\r\n /**\r\n * Returns the line strip draw mode\r\n */\r\n public static readonly MATERIAL_LineStripDrawMode = 6;\r\n\r\n /**\r\n * Returns the triangle strip draw mode\r\n */\r\n public static readonly MATERIAL_TriangleStripDrawMode = 7;\r\n /**\r\n * Returns the triangle fan draw mode\r\n */\r\n public static readonly MATERIAL_TriangleFanDrawMode = 8;\r\n\r\n /**\r\n * Stores the clock-wise side orientation\r\n */\r\n public static readonly MATERIAL_ClockWiseSideOrientation = 0;\r\n /**\r\n * Stores the counter clock-wise side orientation\r\n */\r\n public static readonly MATERIAL_CounterClockWiseSideOrientation = 1;\r\n\r\n /**\r\n * Nothing\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_NothingTrigger = 0;\r\n /**\r\n * On pick\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnPickTrigger = 1;\r\n /**\r\n * On left pick\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnLeftPickTrigger = 2;\r\n /**\r\n * On right pick\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnRightPickTrigger = 3;\r\n /**\r\n * On center pick\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnCenterPickTrigger = 4;\r\n /**\r\n * On pick down\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnPickDownTrigger = 5;\r\n /**\r\n * On double pick\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnDoublePickTrigger = 6;\r\n /**\r\n * On pick up\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnPickUpTrigger = 7;\r\n /**\r\n * On pick out.\r\n * This trigger will only be raised if you also declared a OnPickDown\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnPickOutTrigger = 16;\r\n /**\r\n * On long press\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnLongPressTrigger = 8;\r\n /**\r\n * On pointer over\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnPointerOverTrigger = 9;\r\n /**\r\n * On pointer out\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnPointerOutTrigger = 10;\r\n /**\r\n * On every frame\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnEveryFrameTrigger = 11;\r\n /**\r\n * On intersection enter\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnIntersectionEnterTrigger = 12;\r\n /**\r\n * On intersection exit\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnIntersectionExitTrigger = 13;\r\n /**\r\n * On key down\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnKeyDownTrigger = 14;\r\n /**\r\n * On key up\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnKeyUpTrigger = 15;\r\n\r\n /**\r\n * Billboard mode will only apply to Y axis\r\n */\r\n public static readonly PARTICLES_BILLBOARDMODE_Y = 2;\r\n /**\r\n * Billboard mode will apply to all axes\r\n */\r\n public static readonly PARTICLES_BILLBOARDMODE_ALL = 7;\r\n /**\r\n * Special billboard mode where the particle will be biilboard to the camera but rotated to align with direction\r\n */\r\n public static readonly PARTICLES_BILLBOARDMODE_STRETCHED = 8;\r\n /**\r\n * Special billboard mode where the particle will be billboard to the camera but only around the axis of the direction of particle emission\r\n */\r\n public static readonly PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL = 9;\r\n\r\n /** Default culling strategy : this is an exclusion test and it's the more accurate.\r\n * Test order :\r\n * Is the bounding sphere outside the frustum ?\r\n * If not, are the bounding box vertices outside the frustum ?\r\n * It not, then the cullable object is in the frustum.\r\n */\r\n public static readonly MESHES_CULLINGSTRATEGY_STANDARD = 0;\r\n /** Culling strategy : Bounding Sphere Only.\r\n * This is an exclusion test. It's faster than the standard strategy because the bounding box is not tested.\r\n * It's also less accurate than the standard because some not visible objects can still be selected.\r\n * Test : is the bounding sphere outside the frustum ?\r\n * If not, then the cullable object is in the frustum.\r\n */\r\n public static readonly MESHES_CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY = 1;\r\n /** Culling strategy : Optimistic Inclusion.\r\n * This in an inclusion test first, then the standard exclusion test.\r\n * This can be faster when a cullable object is expected to be almost always in the camera frustum.\r\n * This could also be a little slower than the standard test when the tested object center is not the frustum but one of its bounding box vertex is still inside.\r\n * Anyway, it's as accurate as the standard strategy.\r\n * Test :\r\n * Is the cullable object bounding sphere center in the frustum ?\r\n * If not, apply the default culling strategy.\r\n */\r\n public static readonly MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION = 2;\r\n /** Culling strategy : Optimistic Inclusion then Bounding Sphere Only.\r\n * This in an inclusion test first, then the bounding sphere only exclusion test.\r\n * This can be the fastest test when a cullable object is expected to be almost always in the camera frustum.\r\n * This could also be a little slower than the BoundingSphereOnly strategy when the tested object center is not in the frustum but its bounding sphere still intersects it.\r\n * It's less accurate than the standard strategy and as accurate as the BoundingSphereOnly strategy.\r\n * Test :\r\n * Is the cullable object bounding sphere center in the frustum ?\r\n * If not, apply the Bounding Sphere Only strategy. No Bounding Box is tested here.\r\n */\r\n public static readonly MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY = 3;\r\n\r\n /**\r\n * No logging while loading\r\n */\r\n public static readonly SCENELOADER_NO_LOGGING = 0;\r\n /**\r\n * Minimal logging while loading\r\n */\r\n public static readonly SCENELOADER_MINIMAL_LOGGING = 1;\r\n /**\r\n * Summary logging while loading\r\n */\r\n public static readonly SCENELOADER_SUMMARY_LOGGING = 2;\r\n /**\r\n * Detailed logging while loading\r\n */\r\n public static readonly SCENELOADER_DETAILED_LOGGING = 3;\r\n\r\n /**\r\n * Constant used to retrieve the irradiance texture index in the textures array in the prepass\r\n * using getIndex(Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE)\r\n */\r\n public static readonly PREPASS_IRRADIANCE_TEXTURE_TYPE = 0;\r\n /**\r\n * Constant used to retrieve the position texture index in the textures array in the prepass\r\n * using getIndex(Constants.PREPASS_POSITION_TEXTURE_INDEX)\r\n */\r\n public static readonly PREPASS_POSITION_TEXTURE_TYPE = 1;\r\n /**\r\n * Constant used to retrieve the velocity texture index in the textures array in the prepass\r\n * using getIndex(Constants.PREPASS_VELOCITY_TEXTURE_INDEX)\r\n */\r\n public static readonly PREPASS_VELOCITY_TEXTURE_TYPE = 2;\r\n /**\r\n * Constant used to retrieve the reflectivity texture index in the textures array in the prepass\r\n * using the getIndex(Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE)\r\n */\r\n public static readonly PREPASS_REFLECTIVITY_TEXTURE_TYPE = 3;\r\n /**\r\n * Constant used to retrieve the lit color texture index in the textures array in the prepass\r\n * using the getIndex(Constants.PREPASS_COLOR_TEXTURE_TYPE)\r\n */\r\n public static readonly PREPASS_COLOR_TEXTURE_TYPE = 4;\r\n /**\r\n * Constant used to retrieve depth index in the textures array in the prepass\r\n * using the getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)\r\n */\r\n public static readonly PREPASS_DEPTH_TEXTURE_TYPE = 5;\r\n /**\r\n * Constant used to retrieve normal index in the textures array in the prepass\r\n * using the getIndex(Constants.PREPASS_NORMAL_TEXTURE_TYPE)\r\n */\r\n public static readonly PREPASS_NORMAL_TEXTURE_TYPE = 6;\r\n /**\r\n * Constant used to retrieve albedo index in the textures array in the prepass\r\n * using the getIndex(Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE)\r\n */\r\n public static readonly PREPASS_ALBEDO_SQRT_TEXTURE_TYPE = 7;\r\n\r\n /** Flag to create a readable buffer (the buffer can be the source of a copy) */\r\n public static readonly BUFFER_CREATIONFLAG_READ = 1;\r\n /** Flag to create a writable buffer (the buffer can be the destination of a copy) */\r\n public static readonly BUFFER_CREATIONFLAG_WRITE = 2;\r\n /** Flag to create a readable and writable buffer */\r\n public static readonly BUFFER_CREATIONFLAG_READWRITE = 3;\r\n /** Flag to create a buffer suitable to be used as a uniform buffer */\r\n public static readonly BUFFER_CREATIONFLAG_UNIFORM = 4;\r\n /** Flag to create a buffer suitable to be used as a vertex buffer */\r\n public static readonly BUFFER_CREATIONFLAG_VERTEX = 8;\r\n /** Flag to create a buffer suitable to be used as an index buffer */\r\n public static readonly BUFFER_CREATIONFLAG_INDEX = 16;\r\n /** Flag to create a buffer suitable to be used as a storage buffer */\r\n public static readonly BUFFER_CREATIONFLAG_STORAGE = 32;\r\n\r\n /**\r\n * Prefixes used by the engine for sub mesh draw wrappers\r\n */\r\n\r\n /** @internal */\r\n public static readonly RENDERPASS_MAIN = 0;\r\n\r\n /**\r\n * Constant used as key code for Alt key\r\n */\r\n public static readonly INPUT_ALT_KEY = 18;\r\n\r\n /**\r\n * Constant used as key code for Ctrl key\r\n */\r\n public static readonly INPUT_CTRL_KEY = 17;\r\n\r\n /**\r\n * Constant used as key code for Meta key (Left Win, Left Cmd)\r\n */\r\n public static readonly INPUT_META_KEY1 = 91;\r\n\r\n /**\r\n * Constant used as key code for Meta key (Right Win)\r\n */\r\n public static readonly INPUT_META_KEY2 = 92;\r\n\r\n /**\r\n * Constant used as key code for Meta key (Right Win, Right Cmd)\r\n */\r\n public static readonly INPUT_META_KEY3 = 93;\r\n\r\n /**\r\n * Constant used as key code for Shift key\r\n */\r\n public static readonly INPUT_SHIFT_KEY = 16;\r\n\r\n /** Standard snapshot rendering. In this mode, some form of dynamic behavior is possible (for eg, uniform buffers are still updated) */\r\n public static readonly SNAPSHOTRENDERING_STANDARD = 0;\r\n\r\n /** Fast snapshot rendering. In this mode, everything is static and only some limited form of dynamic behaviour is possible */\r\n public static readonly SNAPSHOTRENDERING_FAST = 1;\r\n\r\n /**\r\n * This is the default projection mode used by the cameras.\r\n * It helps recreating a feeling of perspective and better appreciate depth.\r\n * This is the best way to simulate real life cameras.\r\n */\r\n public static readonly PERSPECTIVE_CAMERA = 0;\r\n /**\r\n * This helps creating camera with an orthographic mode.\r\n * Orthographic is commonly used in engineering as a means to produce object specifications that communicate dimensions unambiguously, each line of 1 unit length (cm, meter..whatever) will appear to have the same length everywhere on the drawing. This allows the drafter to dimension only a subset of lines and let the reader know that other lines of that length on the drawing are also that length in reality. Every parallel line in the drawing is also parallel in the object.\r\n */\r\n public static readonly ORTHOGRAPHIC_CAMERA = 1;\r\n\r\n /**\r\n * This is the default FOV mode for perspective cameras.\r\n * This setting aligns the upper and lower bounds of the viewport to the upper and lower bounds of the camera frustum.\r\n */\r\n public static readonly FOVMODE_VERTICAL_FIXED = 0;\r\n /**\r\n * This setting aligns the left and right bounds of the viewport to the left and right bounds of the camera frustum.\r\n */\r\n public static readonly FOVMODE_HORIZONTAL_FIXED = 1;\r\n\r\n /**\r\n * This specifies there is no need for a camera rig.\r\n * Basically only one eye is rendered corresponding to the camera.\r\n */\r\n public static readonly RIG_MODE_NONE = 0;\r\n /**\r\n * Simulates a camera Rig with one blue eye and one red eye.\r\n * This can be use with 3d blue and red glasses.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_ANAGLYPH = 10;\r\n /**\r\n * Defines that both eyes of the camera will be rendered side by side with a parallel target.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL = 11;\r\n /**\r\n * Defines that both eyes of the camera will be rendered side by side with a none parallel target.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED = 12;\r\n /**\r\n * Defines that both eyes of the camera will be rendered over under each other.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_OVERUNDER = 13;\r\n /**\r\n * Defines that both eyes of the camera will be rendered on successive lines interlaced for passive 3d monitors.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_INTERLACED = 14;\r\n /**\r\n * Defines that both eyes of the camera should be renderered in a VR mode (carbox).\r\n */\r\n public static readonly RIG_MODE_VR = 20;\r\n /**\r\n * Custom rig mode allowing rig cameras to be populated manually with any number of cameras\r\n */\r\n public static readonly RIG_MODE_CUSTOM = 22;\r\n\r\n /**\r\n * Maximum number of uv sets supported\r\n */\r\n public static readonly MAX_SUPPORTED_UV_SETS = 6;\r\n\r\n /**\r\n * GL constants\r\n */\r\n /** Alpha blend equation: ADD */\r\n public static readonly GL_ALPHA_EQUATION_ADD = 0x8006;\r\n /** Alpha equation: MIN */\r\n public static readonly GL_ALPHA_EQUATION_MIN = 0x8007;\r\n /** Alpha equation: MAX */\r\n public static readonly GL_ALPHA_EQUATION_MAX = 0x8008;\r\n /** Alpha equation: SUBTRACT */\r\n public static readonly GL_ALPHA_EQUATION_SUBTRACT = 0x800a;\r\n /** Alpha equation: REVERSE_SUBTRACT */\r\n public static readonly GL_ALPHA_EQUATION_REVERSE_SUBTRACT = 0x800b;\r\n\r\n /** Alpha blend function: SRC */\r\n public static readonly GL_ALPHA_FUNCTION_SRC = 0x0300;\r\n /** Alpha blend function: ONE_MINUS_SRC */\r\n public static readonly GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR = 0x0301;\r\n /** Alpha blend function: SRC_ALPHA */\r\n public static readonly GL_ALPHA_FUNCTION_SRC_ALPHA = 0x0302;\r\n /** Alpha blend function: ONE_MINUS_SRC_ALPHA */\r\n public static readonly GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA = 0x0303;\r\n /** Alpha blend function: DST_ALPHA */\r\n public static readonly GL_ALPHA_FUNCTION_DST_ALPHA = 0x0304;\r\n /** Alpha blend function: ONE_MINUS_DST_ALPHA */\r\n public static readonly GL_ALPHA_FUNCTION_ONE_MINUS_DST_ALPHA = 0x0305;\r\n /** Alpha blend function: ONE_MINUS_DST */\r\n public static readonly GL_ALPHA_FUNCTION_DST_COLOR = 0x0306;\r\n /** Alpha blend function: ONE_MINUS_DST */\r\n public static readonly GL_ALPHA_FUNCTION_ONE_MINUS_DST_COLOR = 0x0307;\r\n /** Alpha blend function: SRC_ALPHA_SATURATED */\r\n public static readonly GL_ALPHA_FUNCTION_SRC_ALPHA_SATURATED = 0x0308;\r\n /** Alpha blend function: CONSTANT */\r\n public static readonly GL_ALPHA_FUNCTION_CONSTANT_COLOR = 0x8001;\r\n /** Alpha blend function: ONE_MINUS_CONSTANT */\r\n public static readonly GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_COLOR = 0x8002;\r\n /** Alpha blend function: CONSTANT_ALPHA */\r\n public static readonly GL_ALPHA_FUNCTION_CONSTANT_ALPHA = 0x8003;\r\n /** Alpha blend function: ONE_MINUS_CONSTANT_ALPHA */\r\n public static readonly GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_ALPHA = 0x8004;\r\n\r\n /** URL to the snippet server. Points to the public snippet server by default */\r\n public static SnippetUrl = \"https://snippet.babylonjs.com\";\r\n\r\n /** The fog is deactivated */\r\n public static FOGMODE_NONE = 0;\r\n /** The fog density is following an exponential function */\r\n public static FOGMODE_EXP = 1;\r\n /** The fog density is following an exponential function faster than FOGMODE_EXP */\r\n public static FOGMODE_EXP2 = 2;\r\n /** The fog density is following a linear function. */\r\n public static FOGMODE_LINEAR = 3;\r\n\r\n /**\r\n * The byte type.\r\n */\r\n public static BYTE = 5120;\r\n\r\n /**\r\n * The unsigned byte type.\r\n */\r\n public static UNSIGNED_BYTE = 5121;\r\n\r\n /**\r\n * The short type.\r\n */\r\n public static SHORT = 5122;\r\n\r\n /**\r\n * The unsigned short type.\r\n */\r\n public static UNSIGNED_SHORT = 5123;\r\n\r\n /**\r\n * The integer type.\r\n */\r\n public static INT = 5124;\r\n\r\n /**\r\n * The unsigned integer type.\r\n */\r\n public static UNSIGNED_INT = 5125;\r\n\r\n /**\r\n * The float type.\r\n */\r\n public static FLOAT = 5126;\r\n\r\n /**\r\n * Positions\r\n */\r\n public static PositionKind = \"position\";\r\n /**\r\n * Normals\r\n */\r\n public static NormalKind = \"normal\";\r\n /**\r\n * Tangents\r\n */\r\n public static TangentKind = \"tangent\";\r\n /**\r\n * Texture coordinates\r\n */\r\n public static UVKind = \"uv\";\r\n /**\r\n * Texture coordinates 2\r\n */\r\n public static UV2Kind = \"uv2\";\r\n /**\r\n * Texture coordinates 3\r\n */\r\n public static UV3Kind = \"uv3\";\r\n /**\r\n * Texture coordinates 4\r\n */\r\n public static UV4Kind = \"uv4\";\r\n /**\r\n * Texture coordinates 5\r\n */\r\n public static UV5Kind = \"uv5\";\r\n /**\r\n * Texture coordinates 6\r\n */\r\n public static UV6Kind = \"uv6\";\r\n /**\r\n * Colors\r\n */\r\n public static ColorKind = \"color\";\r\n /**\r\n * Instance Colors\r\n */\r\n public static ColorInstanceKind = \"instanceColor\";\r\n /**\r\n * Matrix indices (for bones)\r\n */\r\n public static MatricesIndicesKind = \"matricesIndices\";\r\n /**\r\n * Matrix weights (for bones)\r\n */\r\n public static MatricesWeightsKind = \"matricesWeights\";\r\n /**\r\n * Additional matrix indices (for bones)\r\n */\r\n public static MatricesIndicesExtraKind = \"matricesIndicesExtra\";\r\n /**\r\n * Additional matrix weights (for bones)\r\n */\r\n public static MatricesWeightsExtraKind = \"matricesWeightsExtra\";\r\n}\r\n", "/**\r\n * Gather the list of clipboard event types as constants.\r\n */\r\nexport class ClipboardEventTypes {\r\n /**\r\n * The clipboard event is fired when a copy command is active (pressed).\r\n */\r\n public static readonly COPY = 0x01; //\r\n /**\r\n * The clipboard event is fired when a cut command is active (pressed).\r\n */\r\n public static readonly CUT = 0x02;\r\n\r\n /**\r\n * The clipboard event is fired when a paste command is active (pressed).\r\n */\r\n public static readonly PASTE = 0x03;\r\n}\r\n/**\r\n * This class is used to store clipboard related info for the onClipboardObservable event.\r\n */\r\nexport class ClipboardInfo {\r\n /**\r\n *Creates an instance of ClipboardInfo.\r\n * @param type Defines the type of event (BABYLON.ClipboardEventTypes)\r\n * @param event Defines the related dom event\r\n */\r\n constructor(\r\n /**\r\n * Defines the type of event (BABYLON.ClipboardEventTypes)\r\n */\r\n public type: number,\r\n /**\r\n * Defines the related dom event\r\n */\r\n public event: ClipboardEvent\r\n ) {}\r\n\r\n /**\r\n * Get the clipboard event's type from the keycode.\r\n * @param keyCode Defines the keyCode for the current keyboard event.\r\n * @returns {number}\r\n */\r\n public static GetTypeFromCharacter(keyCode: number): number {\r\n const charCode = keyCode;\r\n //TODO: add codes for extended ASCII\r\n switch (charCode) {\r\n case 67:\r\n return ClipboardEventTypes.COPY;\r\n case 86:\r\n return ClipboardEventTypes.PASTE;\r\n case 88:\r\n return ClipboardEventTypes.CUT;\r\n default:\r\n return -1;\r\n }\r\n }\r\n}\r\n", "import type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { ISceneComponent } from \"../sceneComponent\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport type { Layer } from \"./layer\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\ndeclare module \"../abstractScene\" {\r\n export interface AbstractScene {\r\n /**\r\n * The list of layers (background and foreground) of the scene\r\n */\r\n layers: Array;\r\n }\r\n}\r\n\r\n/**\r\n * Defines the layer scene component responsible to manage any layers\r\n * in a given scene.\r\n */\r\nexport class LayerSceneComponent implements ISceneComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_LAYER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n private _engine: Engine;\r\n\r\n /**\r\n * Creates a new instance of the component for the given scene\r\n * @param scene Defines the scene to register the component in\r\n */\r\n constructor(scene?: Scene) {\r\n this.scene = scene || EngineStore.LastCreatedScene;\r\n if (!this.scene) {\r\n return;\r\n }\r\n this._engine = this.scene.getEngine();\r\n this.scene.layers = [] as Layer[];\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {\r\n this.scene._beforeCameraDrawStage.registerStep(SceneComponentConstants.STEP_BEFORECAMERADRAW_LAYER, this, this._drawCameraBackground);\r\n this.scene._afterCameraDrawStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERADRAW_LAYER, this, this._drawCameraForegroundWithPostProcessing);\r\n this.scene._afterCameraPostProcessStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERAPOSTPROCESS_LAYER, this, this._drawCameraForegroundWithoutPostProcessing);\r\n\r\n this.scene._beforeRenderTargetDrawStage.registerStep(SceneComponentConstants.STEP_BEFORERENDERTARGETDRAW_LAYER, this, this._drawRenderTargetBackground);\r\n this.scene._afterRenderTargetDrawStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERTARGETDRAW_LAYER, this, this._drawRenderTargetForegroundWithPostProcessing);\r\n this.scene._afterRenderTargetPostProcessStage.registerStep(\r\n SceneComponentConstants.STEP_AFTERRENDERTARGETPOSTPROCESS_LAYER,\r\n this,\r\n this._drawRenderTargetForegroundWithoutPostProcessing\r\n );\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n const layers = this.scene.layers;\r\n\r\n for (const layer of layers) {\r\n layer._rebuild();\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources.\r\n */\r\n public dispose(): void {\r\n const layers = this.scene.layers;\r\n\r\n while (layers.length) {\r\n layers[0].dispose();\r\n }\r\n }\r\n\r\n private _draw(predicate: (layer: Layer) => boolean): void {\r\n const layers = this.scene.layers;\r\n\r\n if (layers.length) {\r\n this._engine.setDepthBuffer(false);\r\n for (const layer of layers) {\r\n if (predicate(layer)) {\r\n layer.render();\r\n }\r\n }\r\n this._engine.setDepthBuffer(true);\r\n }\r\n }\r\n\r\n private _drawCameraPredicate(layer: Layer, isBackground: boolean, applyPostProcess: boolean, cameraLayerMask: number): boolean {\r\n return (\r\n !layer.renderOnlyInRenderTargetTextures &&\r\n layer.isBackground === isBackground &&\r\n layer.applyPostProcess === applyPostProcess &&\r\n (layer.layerMask & cameraLayerMask) !== 0\r\n );\r\n }\r\n\r\n private _drawCameraBackground(camera: Camera): void {\r\n this._draw((layer: Layer) => {\r\n return this._drawCameraPredicate(layer, true, true, camera.layerMask);\r\n });\r\n }\r\n\r\n private _drawCameraForegroundWithPostProcessing(camera: Camera): void {\r\n this._draw((layer: Layer) => {\r\n return this._drawCameraPredicate(layer, false, true, camera.layerMask);\r\n });\r\n }\r\n\r\n private _drawCameraForegroundWithoutPostProcessing(camera: Camera): void {\r\n this._draw((layer: Layer) => {\r\n return this._drawCameraPredicate(layer, false, false, camera.layerMask);\r\n });\r\n }\r\n\r\n private _drawRenderTargetPredicate(layer: Layer, isBackground: boolean, applyPostProcess: boolean, cameraLayerMask: number, renderTargetTexture: RenderTargetTexture): boolean {\r\n return (\r\n layer.renderTargetTextures.length > 0 &&\r\n layer.isBackground === isBackground &&\r\n layer.applyPostProcess === applyPostProcess &&\r\n layer.renderTargetTextures.indexOf(renderTargetTexture) > -1 &&\r\n (layer.layerMask & cameraLayerMask) !== 0\r\n );\r\n }\r\n\r\n private _drawRenderTargetBackground(renderTarget: RenderTargetTexture): void {\r\n this._draw((layer: Layer) => {\r\n return this._drawRenderTargetPredicate(layer, true, true, this.scene.activeCamera!.layerMask, renderTarget);\r\n });\r\n }\r\n\r\n private _drawRenderTargetForegroundWithPostProcessing(renderTarget: RenderTargetTexture): void {\r\n this._draw((layer: Layer) => {\r\n return this._drawRenderTargetPredicate(layer, false, true, this.scene.activeCamera!.layerMask, renderTarget);\r\n });\r\n }\r\n\r\n private _drawRenderTargetForegroundWithoutPostProcessing(renderTarget: RenderTargetTexture): void {\r\n this._draw((layer: Layer) => {\r\n return this._drawRenderTargetPredicate(layer, false, false, this.scene.activeCamera!.layerMask, renderTarget);\r\n });\r\n }\r\n\r\n /**\r\n * Adds all the elements from the container to the scene\r\n * @param container the container holding the elements\r\n */\r\n public addFromContainer(container: AbstractScene): void {\r\n if (!container.layers) {\r\n return;\r\n }\r\n container.layers.forEach((layer) => {\r\n this.scene.layers.push(layer);\r\n });\r\n }\r\n\r\n /**\r\n * Removes all the elements in the container from the scene\r\n * @param container contains the elements to remove\r\n * @param dispose if the removed element should be disposed (default: false)\r\n */\r\n public removeFromContainer(container: AbstractScene, dispose = false): void {\r\n if (!container.layers) {\r\n return;\r\n }\r\n container.layers.forEach((layer) => {\r\n const index = this.scene.layers.indexOf(layer);\r\n if (index !== -1) {\r\n this.scene.layers.splice(index, 1);\r\n }\r\n if (dispose) {\r\n layer.dispose();\r\n }\r\n });\r\n }\r\n}\r\n", "// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/helperFunctions\";\n\nconst name = \"layerPixelShader\";\nconst shader = `varying vec2 vUV;uniform sampler2D textureSampler;uniform vec4 color;\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\nvec4 baseColor=texture2D(textureSampler,vUV);\n#ifdef LINEAR\nbaseColor.rgb=toGammaSpace(baseColor.rgb);\n#endif\n#ifdef ALPHATEST\nif (baseColor.a<0.4)\ndiscard;\n#endif\ngl_FragColor=baseColor*color;\n#define CUSTOM_FRAGMENT_MAIN_END\n}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const layerPixelShader = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"layerVertexShader\";\nconst shader = `attribute vec2 position;uniform vec2 scale;uniform vec2 offset;uniform mat4 textureMatrix;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5);\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvec2 shiftedPosition=position*scale+offset;vUV=vec2(textureMatrix*vec4(shiftedPosition*madd+madd,1.0,0.0));gl_Position=vec4(shiftedPosition,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const layerVertexShader = { name, shader };\n", "import type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Vector2 } from \"../Maths/math.vector\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { LayerSceneComponent } from \"./layerSceneComponent\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\nimport \"../Shaders/layer.fragment\";\r\nimport \"../Shaders/layer.vertex\";\r\n\r\n/**\r\n * This represents a full screen 2d layer.\r\n * This can be useful to display a picture in the background of your scene for instance.\r\n * @see https://www.babylonjs-playground.com/#08A2BS#1\r\n */\r\nexport class Layer {\r\n /**\r\n * Define the texture the layer should display.\r\n */\r\n public texture: Nullable;\r\n\r\n /**\r\n * Is the layer in background or foreground.\r\n */\r\n public isBackground: boolean;\r\n\r\n private _applyPostProcess: boolean = true;\r\n /**\r\n * Determines if the layer is drawn before (true) or after (false) post-processing.\r\n * If the layer is background, it is always before.\r\n */\r\n public set applyPostProcess(value: boolean) {\r\n this._applyPostProcess = value;\r\n }\r\n public get applyPostProcess(): boolean {\r\n return this.isBackground || this._applyPostProcess;\r\n }\r\n\r\n /**\r\n * Define the color of the layer (instead of texture).\r\n */\r\n public color: Color4;\r\n\r\n /**\r\n * Define the scale of the layer in order to zoom in out of the texture.\r\n */\r\n public scale = new Vector2(1, 1);\r\n\r\n /**\r\n * Define an offset for the layer in order to shift the texture.\r\n */\r\n public offset = new Vector2(0, 0);\r\n\r\n /**\r\n * Define the alpha blending mode used in the layer in case the texture or color has an alpha.\r\n */\r\n public alphaBlendingMode = Constants.ALPHA_COMBINE;\r\n\r\n /**\r\n * Define if the layer should alpha test or alpha blend with the rest of the scene.\r\n * Alpha test will not mix with the background color in case of transparency.\r\n * It will either use the texture color or the background depending on the alpha value of the current pixel.\r\n */\r\n public alphaTest: boolean;\r\n\r\n /**\r\n * Define a mask to restrict the layer to only some of the scene cameras.\r\n */\r\n public layerMask: number = 0x0fffffff;\r\n\r\n /**\r\n * Define the list of render target the layer is visible into.\r\n */\r\n public renderTargetTextures: RenderTargetTexture[] = [];\r\n\r\n /**\r\n * Define if the layer is only used in renderTarget or if it also\r\n * renders in the main frame buffer of the canvas.\r\n */\r\n public renderOnlyInRenderTargetTextures = false;\r\n\r\n /**\r\n * Define if the layer is enabled (ie. should be displayed). Default: true\r\n */\r\n public isEnabled = true;\r\n\r\n private _scene: Scene;\r\n private _vertexBuffers: { [key: string]: Nullable } = {};\r\n private _indexBuffer: Nullable;\r\n private _drawWrapper: DrawWrapper;\r\n private _previousDefines: string;\r\n\r\n /**\r\n * An event triggered when the layer is disposed.\r\n */\r\n public onDisposeObservable = new Observable();\r\n\r\n private _onDisposeObserver: Nullable>;\r\n /**\r\n * Back compatibility with callback before the onDisposeObservable existed.\r\n * The set callback will be triggered when the layer has been disposed.\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered before rendering the scene\r\n */\r\n public onBeforeRenderObservable = new Observable();\r\n\r\n private _onBeforeRenderObserver: Nullable>;\r\n /**\r\n * Back compatibility with callback before the onBeforeRenderObservable existed.\r\n * The set callback will be triggered just before rendering the layer.\r\n */\r\n public set onBeforeRender(callback: () => void) {\r\n if (this._onBeforeRenderObserver) {\r\n this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n }\r\n this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered after rendering the scene\r\n */\r\n public onAfterRenderObservable = new Observable();\r\n\r\n private _onAfterRenderObserver: Nullable>;\r\n /**\r\n * Back compatibility with callback before the onAfterRenderObservable existed.\r\n * The set callback will be triggered just after rendering the layer.\r\n */\r\n public set onAfterRender(callback: () => void) {\r\n if (this._onAfterRenderObserver) {\r\n this.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n }\r\n this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Instantiates a new layer.\r\n * This represents a full screen 2d layer.\r\n * This can be useful to display a picture in the background of your scene for instance.\r\n * @see https://www.babylonjs-playground.com/#08A2BS#1\r\n * @param name Define the name of the layer in the scene\r\n * @param imgUrl Define the url of the texture to display in the layer\r\n * @param scene Define the scene the layer belongs to\r\n * @param isBackground Defines whether the layer is displayed in front or behind the scene\r\n * @param color Defines a color for the layer\r\n */\r\n constructor(\r\n /**\r\n * Define the name of the layer.\r\n */\r\n public name: string,\r\n imgUrl: Nullable,\r\n scene: Nullable,\r\n isBackground?: boolean,\r\n color?: Color4\r\n ) {\r\n this.texture = imgUrl ? new Texture(imgUrl, scene, true) : null;\r\n this.isBackground = isBackground === undefined ? true : isBackground;\r\n this.color = color === undefined ? new Color4(1, 1, 1, 1) : color;\r\n\r\n this._scene = (scene || EngineStore.LastCreatedScene);\r\n let layerComponent = this._scene._getComponent(SceneComponentConstants.NAME_LAYER) as LayerSceneComponent;\r\n if (!layerComponent) {\r\n layerComponent = new LayerSceneComponent(this._scene);\r\n this._scene._addComponent(layerComponent);\r\n }\r\n this._scene.layers.push(this);\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n this._drawWrapper = new DrawWrapper(engine);\r\n\r\n // VBO\r\n const vertices = [];\r\n vertices.push(1, 1);\r\n vertices.push(-1, 1);\r\n vertices.push(-1, -1);\r\n vertices.push(1, -1);\r\n\r\n const vertexBuffer = new VertexBuffer(engine, vertices, VertexBuffer.PositionKind, false, false, 2);\r\n this._vertexBuffers[VertexBuffer.PositionKind] = vertexBuffer;\r\n\r\n this._createIndexBuffer();\r\n }\r\n\r\n private _createIndexBuffer(): void {\r\n const engine = this._scene.getEngine();\r\n\r\n // Indices\r\n const indices = [];\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n const vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n\r\n if (vb) {\r\n vb._rebuild();\r\n }\r\n\r\n this._createIndexBuffer();\r\n }\r\n\r\n /**\r\n * Checks if the layer is ready to be rendered\r\n * @returns true if the layer is ready. False otherwise.\r\n */\r\n public isReady() {\r\n const engine = this._scene.getEngine();\r\n\r\n let defines = \"\";\r\n\r\n if (this.alphaTest) {\r\n defines = \"#define ALPHATEST\";\r\n }\r\n\r\n if (this.texture && !this.texture.gammaSpace) {\r\n defines += \"\\n#define LINEAR\";\r\n }\r\n\r\n if (this._previousDefines !== defines) {\r\n this._previousDefines = defines;\r\n this._drawWrapper.effect = engine.createEffect(\"layer\", [VertexBuffer.PositionKind], [\"textureMatrix\", \"color\", \"scale\", \"offset\"], [\"textureSampler\"], defines);\r\n }\r\n\r\n const currentEffect = this._drawWrapper.effect;\r\n\r\n return currentEffect?.isReady() && this.texture?.isReady();\r\n }\r\n\r\n /**\r\n * Renders the layer in the scene.\r\n */\r\n public render(): void {\r\n if (!this.isEnabled) {\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n // Check\r\n if (!this.isReady()) {\r\n return;\r\n }\r\n\r\n const currentEffect = this._drawWrapper.effect!;\r\n\r\n this.onBeforeRenderObservable.notifyObservers(this);\r\n\r\n // Render\r\n engine.enableEffect(this._drawWrapper);\r\n engine.setState(false);\r\n\r\n // Texture\r\n currentEffect.setTexture(\"textureSampler\", this.texture);\r\n currentEffect.setMatrix(\"textureMatrix\", this.texture!.getTextureMatrix());\r\n\r\n // Color\r\n currentEffect.setFloat4(\"color\", this.color.r, this.color.g, this.color.b, this.color.a);\r\n\r\n // Scale / offset\r\n currentEffect.setVector2(\"offset\", this.offset);\r\n currentEffect.setVector2(\"scale\", this.scale);\r\n\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, currentEffect);\r\n\r\n // Draw order\r\n if (!this.alphaTest) {\r\n engine.setAlphaMode(this.alphaBlendingMode);\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n } else {\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n }\r\n\r\n this.onAfterRenderObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Disposes and releases the associated resources.\r\n */\r\n public dispose(): void {\r\n const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vertexBuffer) {\r\n vertexBuffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._scene.getEngine()._releaseBuffer(this._indexBuffer);\r\n this._indexBuffer = null;\r\n }\r\n\r\n if (this.texture) {\r\n this.texture.dispose();\r\n this.texture = null;\r\n }\r\n\r\n // Clean RTT list\r\n this.renderTargetTextures = [];\r\n\r\n // Remove from scene\r\n const index = this._scene.layers.indexOf(this);\r\n this._scene.layers.splice(index, 1);\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n\r\n this.onDisposeObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onBeforeRenderObservable.clear();\r\n }\r\n}\r\n"], - "mappings": "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", - "names": ["name", "observer", "className", "name", "AnimationKeyInterpolation", "name", "params", "name", "name", "name", "name", "ShaderLanguage", "match", "name", "shader", "InternalTextureSource", "proxy", "name", "index", "cancelAnimationFrame", "name", "shader", "request", "requestAnimationFrame", "url", "DecodeBase64UrlToBinary", "DecodeBase64UrlToString", "FileToolsOptions", "IsBase64DataUrl", "IsFileURL", "LoadFile", "LoadImage", "ReadFile", "RequestFile", "SetCorsBehavior", "className", "className", "quality", "name", "location", "name", "name", "location", "DeviceType", "PointerInput", "NativePointerInput", "DualShockInput", "DualSenseInput", "XboxInput", "SwitchInput", "DeviceInputEventType", "deviceEvent", "observer", "observer", "pickResult", "pi", "ScenePerformancePriority", "name", "len", "index", "request", "Space", "Coordinate", "Orientation", "name", "index", "targetedAnimations", "name", "i", "_a", "transform", "index", "buffer", "name", "cancelAnimationFrame", "name", "translation", "location", "name", "className", "index", "MaterialPluginEvent", "name", "observer", "name", "index", "name", "observer", "subMesh", "data", "vertexData", "name", "index", "name", "texture", "result", "name", "virtualMeshesInfo", "angle", "minMaxAngle", "name", "featureName", "name", "SceneLoaderAnimationGroupLoadingMode", "name", "request", "scene", "name", "NodeMaterialBlockConnectionPointTypes", "NodeMaterialBlockTargets", "name", "NodeMaterialConnectionPointCompatibilityStates", "NodeMaterialConnectionPointDirection", "name", "name", "name", "name", "PropertyTypeForEdition", "name", "NodeMaterialBlockConnectionPointMode", "NodeMaterialSystemValues", "AnimatedInputBlockTypes", "name", "name", "name", "name", "name", "name", "index", "name", "name", "name", "observer", "name", "NodeMaterialModes", "name", "name", "name", "shader", "initSideEffects", "name", "scene", "name", "shader", "name", "TrigonometryBlockOperations", "name", "name", "name", "className", "result", "effect", "source", "location", "name", "HandPart", "WebXRHandJoint", "name", "_a", "_b", "HandConstraintZone", "HandConstraintOrientation", "HandConstraintVisibility", "plugin", "name", "code", "factory", "name", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "onCreatedEffectParameters", "name", "name", "name", "name", "name", "pointerEvent", "GizmoAnchorPoint", "GizmoCoordinatesMode", "_a", "_b", "name", "onCreatedEffectParameters", "name", "drawWrapper", "name", "shader", "name", "shader", "name"] -} diff --git a/docs/.vitepress/cache/deps/chunk-A56RIS75.js b/docs/.vitepress/cache/deps/chunk-F43E4K3S.js similarity index 99% rename from docs/.vitepress/cache/deps/chunk-A56RIS75.js rename to docs/.vitepress/cache/deps/chunk-F43E4K3S.js index 2aaceddf..3841ce7f 100644 --- a/docs/.vitepress/cache/deps/chunk-A56RIS75.js +++ b/docs/.vitepress/cache/deps/chunk-F43E4K3S.js @@ -1,153 +1,100 @@ -// node_modules/@babylonjs/core/abstractScene.js -var AbstractScene = class { - constructor() { - this.rootNodes = []; - this.cameras = []; - this.lights = []; - this.meshes = []; - this.skeletons = []; - this.particleSystems = []; - this.animations = []; - this.animationGroups = []; - this.multiMaterials = []; - this.materials = []; - this.morphTargetManagers = []; - this.geometries = []; - this.transformNodes = []; - this.actionManagers = []; - this.textures = []; - this._environmentTexture = null; - this.postProcesses = []; +// node_modules/@babylonjs/core/Misc/logger.js +var Logger = class _Logger { + static _CheckLimit(message, limit) { + let entry = _Logger._LogLimitOutputs[message]; + if (!entry) { + entry = { limit, current: 1 }; + _Logger._LogLimitOutputs[message] = entry; + } else { + entry.current++; + } + return entry.current <= entry.limit; } - /** - * Adds a parser in the list of available ones - * @param name Defines the name of the parser - * @param parser Defines the parser to add - */ - static AddParser(name69, parser) { - this._BabylonFileParsers[name69] = parser; + static _GenerateLimitMessage(message, level = 1) { + const entry = _Logger._LogLimitOutputs[message]; + if (!entry || !_Logger.MessageLimitReached) { + return; + } + const type = this._Levels[level]; + if (entry.current === entry.limit) { + _Logger[type.name](_Logger.MessageLimitReached.replace(/%LIMIT%/g, "" + entry.limit).replace(/%TYPE%/g, type.name ?? "")); + } } - /** - * Gets a general parser from the list of available ones - * @param name Defines the name of the parser - * @returns the requested parser or null - */ - static GetParser(name69) { - if (this._BabylonFileParsers[name69]) { - return this._BabylonFileParsers[name69]; + static _AddLogEntry(entry) { + _Logger._LogCache = entry + _Logger._LogCache; + if (_Logger.OnNewCacheEntry) { + _Logger.OnNewCacheEntry(entry); } - return null; } - /** - * Adds n individual parser in the list of available ones - * @param name Defines the name of the parser - * @param parser Defines the parser to add - */ - static AddIndividualParser(name69, parser) { - this._IndividualBabylonFileParsers[name69] = parser; + static _FormatMessage(message) { + const padStr = (i) => i < 10 ? "0" + i : "" + i; + const date = /* @__PURE__ */ new Date(); + return "[" + padStr(date.getHours()) + ":" + padStr(date.getMinutes()) + ":" + padStr(date.getSeconds()) + "]: " + message; } - /** - * Gets an individual parser from the list of available ones - * @param name Defines the name of the parser - * @returns the requested parser or null - */ - static GetIndividualParser(name69) { - if (this._IndividualBabylonFileParsers[name69]) { - return this._IndividualBabylonFileParsers[name69]; - } - return null; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + static _LogDisabled(message, limit) { } - /** - * Parser json data and populate both a scene and its associated container object - * @param jsonData Defines the data to parse - * @param scene Defines the scene to parse the data for - * @param container Defines the container attached to the parsing sequence - * @param rootUrl Defines the root url of the data - */ - static Parse(jsonData, scene, container, rootUrl) { - for (const parserName in this._BabylonFileParsers) { - if (Object.prototype.hasOwnProperty.call(this._BabylonFileParsers, parserName)) { - this._BabylonFileParsers[parserName](jsonData, scene, container, rootUrl); - } + static _LogEnabled(level = 1, message, limit) { + const msg = Array.isArray(message) ? message[0] : message; + if (limit !== void 0 && !_Logger._CheckLimit(msg, limit)) { + return; } + const formattedMessage = _Logger._FormatMessage(msg); + const type = this._Levels[level]; + const optionals = Array.isArray(message) ? message.slice(1) : []; + type.logFunc && type.logFunc("BJS - " + formattedMessage, ...optionals); + const entry = `
${formattedMessage}

`; + _Logger._AddLogEntry(entry); + _Logger._GenerateLimitMessage(msg, level); } /** - * Texture used in all pbr material as the reflection texture. - * As in the majority of the scene they are the same (exception for multi room and so on), - * this is easier to reference from here than from all the materials. + * Gets current log cache (list of logs) */ - get environmentTexture() { - return this._environmentTexture; - } - set environmentTexture(value) { - this._environmentTexture = value; + static get LogCache() { + return _Logger._LogCache; } /** - * @returns all meshes, lights, cameras, transformNodes and bones + * Clears the log cache */ - getNodes() { - let nodes = []; - nodes = nodes.concat(this.meshes); - nodes = nodes.concat(this.lights); - nodes = nodes.concat(this.cameras); - nodes = nodes.concat(this.transformNodes); - this.skeletons.forEach((skeleton) => nodes = nodes.concat(skeleton.bones)); - return nodes; - } -}; -AbstractScene._BabylonFileParsers = {}; -AbstractScene._IndividualBabylonFileParsers = {}; - -// node_modules/@babylonjs/core/Actions/abstractActionManager.js -var AbstractActionManager = class _AbstractActionManager { - constructor() { - this.hoverCursor = ""; - this.actions = []; - this.isRecursive = false; - } - /** - * Does exist one action manager with at least one trigger - **/ - static get HasTriggers() { - for (const t in _AbstractActionManager.Triggers) { - if (Object.prototype.hasOwnProperty.call(_AbstractActionManager.Triggers, t)) { - return true; - } - } - return false; - } - /** - * Does exist one action manager with at least one pick trigger - **/ - static get HasPickTriggers() { - for (const t in _AbstractActionManager.Triggers) { - if (Object.prototype.hasOwnProperty.call(_AbstractActionManager.Triggers, t)) { - const tAsInt = parseInt(t); - if (tAsInt >= 1 && tAsInt <= 7) { - return true; - } - } - } - return false; + static ClearLogCache() { + _Logger._LogCache = ""; + _Logger._LogLimitOutputs = {}; + _Logger.errorsCount = 0; } /** - * Does exist one action manager that handles actions of a given trigger - * @param trigger defines the trigger to be tested - * @returns a boolean indicating whether the trigger is handled by at least one action manager - **/ - static HasSpecificTrigger(trigger) { - for (const t in _AbstractActionManager.Triggers) { - if (Object.prototype.hasOwnProperty.call(_AbstractActionManager.Triggers, t)) { - const tAsInt = parseInt(t); - if (tAsInt === trigger) { - return true; - } + * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel) + */ + static set LogLevels(level) { + _Logger.Log = _Logger._LogDisabled; + _Logger.Warn = _Logger._LogDisabled; + _Logger.Error = _Logger._LogDisabled; + [_Logger.MessageLogLevel, _Logger.WarningLogLevel, _Logger.ErrorLogLevel].forEach((l) => { + if ((level & l) === l) { + const type = this._Levels[l]; + _Logger[type.name] = _Logger._LogEnabled.bind(_Logger, l); } - } - return false; + }); } }; -AbstractActionManager.Triggers = {}; +Logger.NoneLogLevel = 0; +Logger.MessageLogLevel = 1; +Logger.WarningLogLevel = 2; +Logger.ErrorLogLevel = 4; +Logger.AllLogLevel = 7; +Logger.MessageLimitReached = "Too many %TYPE%s (%LIMIT%), no more %TYPE%s will be reported for this message."; +Logger._LogCache = ""; +Logger._LogLimitOutputs = {}; +Logger._Levels = [ + {}, + { color: "white", logFunc: console.log, name: "Log" }, + { color: "orange", logFunc: console.warn, name: "Warn" }, + {}, + { color: "red", logFunc: console.error, name: "Error" } +]; +Logger.errorsCount = 0; +Logger.Log = Logger._LogEnabled.bind(Logger, Logger.MessageLogLevel); +Logger.Warn = Logger._LogEnabled.bind(Logger, Logger.WarningLogLevel); +Logger.Error = Logger._LogEnabled.bind(Logger, Logger.ErrorLogLevel); // node_modules/@babylonjs/core/Misc/observable.js var EventState = class { @@ -7839,34922 +7786,31836 @@ RegisterClass("BABYLON.Vector4", Vector4); RegisterClass("BABYLON.Matrix", Matrix); var mtxConvertNDCToHalfZRange = Matrix.FromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 1); -// node_modules/@babylonjs/core/Maths/math.scalar.js -var Scalar = class _Scalar { +// node_modules/@babylonjs/core/Events/pointerEvents.js +var PointerEventTypes = class { +}; +PointerEventTypes.POINTERDOWN = 1; +PointerEventTypes.POINTERUP = 2; +PointerEventTypes.POINTERMOVE = 4; +PointerEventTypes.POINTERWHEEL = 8; +PointerEventTypes.POINTERPICK = 16; +PointerEventTypes.POINTERTAP = 32; +PointerEventTypes.POINTERDOUBLETAP = 64; +var PointerInfoBase = class { /** - * Returns -1 if value is negative and +1 is value is positive. - * @param value the value - * @returns the value itself if it's equal to zero. + * Instantiates the base class of pointers info. + * @param type Defines the type of event (PointerEventTypes) + * @param event Defines the related dom event */ - static Sign(value) { - value = +value; - if (value === 0 || isNaN(value)) { - return value; - } - return value > 0 ? 1 : -1; + constructor(type, event) { + this.type = type; + this.event = event; } +}; +var PointerInfoPre = class extends PointerInfoBase { /** - * the log2 of value. - * @param value the value to compute log2 of - * @returns the log2 of value. + * Instantiates a PointerInfoPre to store pointer related info to the onPrePointerObservable event. + * @param type Defines the type of event (PointerEventTypes) + * @param event Defines the related dom event + * @param localX Defines the local x coordinates of the pointer when the event occured + * @param localY Defines the local y coordinates of the pointer when the event occured */ - static Log2(value) { - return Math.log(value) * Math.LOG2E; + constructor(type, event, localX, localY) { + super(type, event); + this.ray = null; + this.originalPickingInfo = null; + this.skipOnPointerObservable = false; + this.localPosition = new Vector2(localX, localY); } +}; +var PointerInfo = class extends PointerInfoBase { /** - * the floor part of a log2 value. - * @param value the value to compute log2 of - * @returns the log2 of value. + * Defines the picking info associated with this PointerInfo object (if applicable) */ - static ILog2(value) { - if (Math.log2) { - return Math.floor(Math.log2(value)); - } - if (value < 0) { - return NaN; - } else if (value === 0) { - return -Infinity; - } - let n = 0; - if (value < 1) { - while (value < 1) { - n++; - value = value * 2; - } - n = -n; - } else if (value > 1) { - while (value > 1) { - n++; - value = Math.floor(value / 2); - } + get pickInfo() { + if (!this._pickInfo) { + this._generatePickInfo(); } - return n; - } - /** - * Loops the value, so that it is never larger than length and never smaller than 0. - * - * This is similar to the modulo operator but it works with floating point numbers. - * For example, using 3.0 for t and 2.5 for length, the result would be 0.5. - * With t = 5 and length = 2.5, the result would be 0.0. - * Note, however, that the behaviour is not defined for negative numbers as it is for the modulo operator - * @param value the value - * @param length the length - * @returns the looped value - */ - static Repeat(value, length) { - return value - Math.floor(value / length) * length; + return this._pickInfo; } /** - * Normalize the value between 0.0 and 1.0 using min and max values - * @param value value to normalize - * @param min max to normalize between - * @param max min to normalize between - * @returns the normalized value + * Instantiates a PointerInfo to store pointer related info to the onPointerObservable event. + * @param type Defines the type of event (PointerEventTypes) + * @param event Defines the related dom event + * @param pickInfo Defines the picking info associated to the info (if any) + * @param inputManager Defines the InputManager to use if there is no pickInfo */ - static Normalize(value, min, max) { - return (value - min) / (max - min); + constructor(type, event, pickInfo, inputManager = null) { + super(type, event); + this._pickInfo = pickInfo; + this._inputManager = inputManager; } /** - * Denormalize the value from 0.0 and 1.0 using min and max values - * @param normalized value to denormalize - * @param min max to denormalize between - * @param max min to denormalize between - * @returns the denormalized value + * Generates the picking info if needed */ - static Denormalize(normalized, min, max) { - return normalized * (max - min) + min; + /** @internal */ + _generatePickInfo() { + if (this._inputManager) { + this._pickInfo = this._inputManager._pickMove(this.event); + this._inputManager._setRayOnPointerInfo(this._pickInfo, this.event); + this._inputManager = null; + } } - /** - * Calculates the shortest difference between two given angles given in degrees. - * @param current current angle in degrees - * @param target target angle in degrees - * @returns the delta - */ - static DeltaAngle(current, target) { - let num = _Scalar.Repeat(target - current, 360); - if (num > 180) { - num -= 360; +}; + +// node_modules/@babylonjs/core/Misc/domManagement.js +function IsWindowObjectExist() { + return typeof window !== "undefined"; +} +function IsNavigatorAvailable() { + return typeof navigator !== "undefined"; +} +function IsDocumentAvailable() { + return typeof document !== "undefined"; +} +function GetDOMTextContent(element) { + let result = ""; + let child = element.firstChild; + while (child) { + if (child.nodeType === 3) { + result += child.textContent; } - return num; + child = child.nextSibling; } + return result; +} +var DomManagement = { /** - * PingPongs the value t, so that it is never larger than length and never smaller than 0. - * @param tx value - * @param length length - * @returns The returned value will move back and forth between 0 and length + * Checks if the window object exists + * @returns true if the window object exists */ - static PingPong(tx, length) { - const t = _Scalar.Repeat(tx, length * 2); - return length - Math.abs(t - length); - } + IsWindowObjectExist, /** - * Interpolates between min and max with smoothing at the limits. - * - * This function interpolates between min and max in a similar way to Lerp. However, the interpolation will gradually speed up - * from the start and slow down toward the end. This is useful for creating natural-looking animation, fading and other transitions. - * @param from from - * @param to to - * @param tx value - * @returns the smooth stepped value + * Checks if the navigator object exists + * @returns true if the navigator object exists */ - static SmoothStep(from, to, tx) { - let t = _Scalar.Clamp(tx); - t = -2 * t * t * t + 3 * t * t; - return to * t + from * (1 - t); - } + IsNavigatorAvailable, /** - * Moves a value current towards target. - * - * This is essentially the same as Mathf.Lerp but instead the function will ensure that the speed never exceeds maxDelta. - * Negative values of maxDelta pushes the value away from target. - * @param current current value - * @param target target value - * @param maxDelta max distance to move - * @returns resulting value + * Check if the document object exists + * @returns true if the document object exists */ - static MoveTowards(current, target, maxDelta) { - let result = 0; - if (Math.abs(target - current) <= maxDelta) { - result = target; - } else { - result = current + _Scalar.Sign(target - current) * maxDelta; - } - return result; - } + IsDocumentAvailable, /** - * Same as MoveTowards but makes sure the values interpolate correctly when they wrap around 360 degrees. - * - * Variables current and target are assumed to be in degrees. For optimization reasons, negative values of maxDelta - * are not supported and may cause oscillation. To push current away from a target angle, add 180 to that angle instead. - * @param current current value - * @param target target value - * @param maxDelta max distance to move - * @returns resulting angle + * Extracts text content from a DOM element hierarchy + * @param element defines the root element + * @returns a string */ - static MoveTowardsAngle(current, target, maxDelta) { - const num = _Scalar.DeltaAngle(current, target); - let result = 0; - if (-maxDelta < num && num < maxDelta) { - result = target; - } else { - target = current + num; - result = _Scalar.MoveTowards(current, target, maxDelta); - } - return result; + GetDOMTextContent +}; + +// node_modules/@babylonjs/core/Misc/deepCopier.js +var CloneValue = (source, destinationObject, shallowCopyValues) => { + if (!source) { + return null; } - /** - * Same as Lerp but makes sure the values interpolate correctly when they wrap around 360 degrees. - * The parameter t is clamped to the range [0, 1]. Variables a and b are assumed to be in degrees. - * @param start start value - * @param end target value - * @param amount amount to lerp between - * @returns the lerped value - */ - static LerpAngle(start, end, amount) { - let num = _Scalar.Repeat(end - start, 360); - if (num > 180) { - num -= 360; - } - return start + num * Clamp(amount); + if (source.getClassName && source.getClassName() === "Mesh") { + return null; } - /** - * Calculates the linear parameter t that produces the interpolant value within the range [a, b]. - * @param a start value - * @param b target value - * @param value value between a and b - * @returns the inverseLerp value - */ - static InverseLerp(a, b, value) { - let result = 0; - if (a != b) { - result = Clamp((value - a) / (b - a)); - } else { - result = 0; - } - return result; + if (source.getClassName && (source.getClassName() === "SubMesh" || source.getClassName() === "PhysicsBody")) { + return source.clone(destinationObject); + } else if (source.clone) { + return source.clone(); + } else if (Array.isArray(source)) { + return source.slice(); + } else if (shallowCopyValues && typeof source === "object") { + return { ...source }; } + return null; +}; +function GetAllPropertyNames(obj) { + const props = []; + do { + Object.getOwnPropertyNames(obj).forEach(function(prop) { + if (props.indexOf(prop) === -1) { + props.push(prop); + } + }); + } while (obj = Object.getPrototypeOf(obj)); + return props; +} +var DeepCopier = class { /** - * Returns a new scalar located for "amount" (float) on the Hermite spline defined by the scalars "value1", "value3", "tangent1", "tangent2". - * @see http://mathworld.wolfram.com/HermitePolynomial.html - * @param value1 defines the first control point - * @param tangent1 defines the first tangent - * @param value2 defines the second control point - * @param tangent2 defines the second tangent - * @param amount defines the amount on the interpolation spline (between 0 and 1) - * @returns hermite result + * Tries to copy an object by duplicating every property + * @param source defines the source object + * @param destination defines the target object + * @param doNotCopyList defines a list of properties to avoid + * @param mustCopyList defines a list of properties to copy (even if they start with _) + * @param shallowCopyValues defines wether properties referencing objects (none cloneable) must be shallow copied (false by default) + * @remarks shallowCopyValues will not instantite the copied values which makes it only usable for "JSON objects" */ - static Hermite(value1, tangent1, value2, tangent2, amount) { - const squared = amount * amount; - const cubed = amount * squared; - const part1 = 2 * cubed - 3 * squared + 1; - const part2 = -2 * cubed + 3 * squared; - const part3 = cubed - 2 * squared + amount; - const part4 = cubed - squared; - return value1 * part1 + value2 * part2 + tangent1 * part3 + tangent2 * part4; - } - /** - * Returns a new scalar which is the 1st derivative of the Hermite spline defined by the scalars "value1", "value2", "tangent1", "tangent2". - * @param value1 defines the first control point - * @param tangent1 defines the first tangent - * @param value2 defines the second control point - * @param tangent2 defines the second tangent - * @param time define where the derivative must be done - * @returns 1st derivative - */ - static Hermite1stDerivative(value1, tangent1, value2, tangent2, time) { - const t2 = time * time; - return (t2 - time) * 6 * value1 + (3 * t2 - 4 * time + 1) * tangent1 + (-t2 + time) * 6 * value2 + (3 * t2 - 2 * time) * tangent2; - } - /** - * This function returns percentage of a number in a given range. - * - * RangeToPercent(40,20,60) will return 0.5 (50%) - * RangeToPercent(34,0,100) will return 0.34 (34%) - * @param number to convert to percentage - * @param min min range - * @param max max range - * @returns the percentage - */ - static RangeToPercent(number, min, max) { - return (number - min) / (max - min); - } - /** - * This function returns number that corresponds to the percentage in a given range. - * - * PercentToRange(0.34,0,100) will return 34. - * @param percent to convert to number - * @param min min range - * @param max max range - * @returns the number - */ - static PercentToRange(percent, min, max) { - return (max - min) * percent + min; + static DeepCopy(source, destination, doNotCopyList, mustCopyList, shallowCopyValues = false) { + const properties = GetAllPropertyNames(source); + for (const prop of properties) { + if (prop[0] === "_" && (!mustCopyList || mustCopyList.indexOf(prop) === -1)) { + continue; + } + if (prop.endsWith("Observable")) { + continue; + } + if (doNotCopyList && doNotCopyList.indexOf(prop) !== -1) { + continue; + } + const sourceValue = source[prop]; + const typeOfSourceValue = typeof sourceValue; + if (typeOfSourceValue === "function") { + continue; + } + try { + if (typeOfSourceValue === "object") { + if (sourceValue instanceof Uint8Array) { + destination[prop] = Uint8Array.from(sourceValue); + } else if (sourceValue instanceof Array) { + destination[prop] = []; + if (sourceValue.length > 0) { + if (typeof sourceValue[0] == "object") { + for (let index = 0; index < sourceValue.length; index++) { + const clonedValue = CloneValue(sourceValue[index], destination, shallowCopyValues); + if (destination[prop].indexOf(clonedValue) === -1) { + destination[prop].push(clonedValue); + } + } + } else { + destination[prop] = sourceValue.slice(0); + } + } + } else { + destination[prop] = CloneValue(sourceValue, destination, shallowCopyValues); + } + } else { + destination[prop] = sourceValue; + } + } catch (e) { + Logger.Warn(e.message); + } + } } +}; + +// node_modules/@babylonjs/core/Misc/precisionDate.js +var PrecisionDate = class { /** - * Returns the highest common factor of two integers. - * @param a first parameter - * @param b second parameter - * @returns HCF of a and b + * Gets either window.performance.now() if supported or Date.now() else */ - static HCF(a, b) { - const r = a % b; - if (r === 0) { - return b; + static get Now() { + if (IsWindowObjectExist() && window.performance && window.performance.now) { + return window.performance.now(); } - return _Scalar.HCF(b, r); + return Date.now(); } }; -Scalar.TwoPi = Math.PI * 2; -Scalar.WithinEpsilon = WithinEpsilon; -Scalar.ToHex = ToHex; -Scalar.Clamp = Clamp; -Scalar.Lerp = Lerp; -Scalar.RandomRange = RandomRange; -Scalar.NormalizeRadians = NormalizeRadians; -// node_modules/@babylonjs/core/Maths/math.color.js -function colorChannelToLinearSpace(color) { - return Math.pow(color, ToLinearSpace); -} -function colorChannelToLinearSpaceExact(color) { - if (color <= 0.04045) { - return 0.0773993808 * color; - } - return Math.pow(0.947867299 * (color + 0.055), 2.4); -} -function colorChannelToGammaSpace(color) { - return Math.pow(color, ToGammaSpace); -} -function colorChannelToGammaSpaceExact(color) { - if (color <= 31308e-7) { - return 12.92 * color; +// node_modules/@babylonjs/core/Misc/webRequest.js +function createXMLHttpRequest() { + if (typeof _native !== "undefined" && _native.XMLHttpRequest) { + return new _native.XMLHttpRequest(); + } else { + return new XMLHttpRequest(); } - return 1.055 * Math.pow(color, 0.41666) - 0.055; } -var Color3 = class _Color3 { - /** - * Creates a new Color3 object from red, green, blue values, all between 0 and 1 - * @param r defines the red component (between 0 and 1, default is 0) - * @param g defines the green component (between 0 and 1, default is 0) - * @param b defines the blue component (between 0 and 1, default is 0) - */ - constructor(r = 0, g = 0, b = 0) { - this.r = r; - this.g = g; - this.b = b; - } - /** - * Creates a string with the Color3 current values - * @returns the string representation of the Color3 object - */ - toString() { - return "{R: " + this.r + " G:" + this.g + " B:" + this.b + "}"; - } - /** - * Returns the string "Color3" - * @returns "Color3" - */ - getClassName() { - return "Color3"; +var WebRequest = class _WebRequest { + constructor() { + this._xhr = createXMLHttpRequest(); + this._requestURL = ""; } /** - * Compute the Color3 hash code - * @returns an unique number that can be used to hash Color3 objects + * This function can be called to check if there are request modifiers for network requests + * @returns true if there are any custom requests available */ - getHashCode() { - let hash = this.r * 255 | 0; - hash = hash * 397 ^ (this.g * 255 | 0); - hash = hash * 397 ^ (this.b * 255 | 0); - return hash; + static get IsCustomRequestAvailable() { + return Object.keys(_WebRequest.CustomRequestHeaders).length > 0 || _WebRequest.CustomRequestModifiers.length > 0; } - // Operators - /** - * Stores in the given array from the given starting index the red, green, blue values as successive elements - * @param array defines the array where to store the r,g,b components - * @param index defines an optional index in the target array to define where to start storing values - * @returns the current Color3 object - */ - toArray(array, index = 0) { - array[index] = this.r; - array[index + 1] = this.g; - array[index + 2] = this.b; - return this; + _injectCustomRequestHeaders() { + if (this._shouldSkipRequestModifications(this._requestURL)) { + return; + } + for (const key in _WebRequest.CustomRequestHeaders) { + const val = _WebRequest.CustomRequestHeaders[key]; + if (val) { + this._xhr.setRequestHeader(key, val); + } + } } - /** - * Update the current color with values stored in an array from the starting index of the given array - * @param array defines the source array - * @param offset defines an offset in the source array - * @returns the current Color3 object - */ - fromArray(array, offset = 0) { - _Color3.FromArrayToRef(array, offset, this); - return this; + _shouldSkipRequestModifications(url) { + return _WebRequest.SkipRequestModificationForBabylonCDN && (url.includes("preview.babylonjs.com") || url.includes("cdn.babylonjs.com")); } /** - * Returns a new Color4 object from the current Color3 and the given alpha - * @param alpha defines the alpha component on the new Color4 object (default is 1) - * @returns a new Color4 object + * Gets or sets a function to be called when loading progress changes */ - toColor4(alpha = 1) { - return new Color4(this.r, this.g, this.b, alpha); + get onprogress() { + return this._xhr.onprogress; } - /** - * Returns a new array populated with 3 numeric elements : red, green and blue values - * @returns the new array - */ - asArray() { - return [this.r, this.g, this.b]; + set onprogress(value) { + this._xhr.onprogress = value; } /** - * Returns the luminance value - * @returns a float value + * Returns client's state */ - toLuminance() { - return this.r * 0.3 + this.g * 0.59 + this.b * 0.11; + get readyState() { + return this._xhr.readyState; } /** - * Multiply each Color3 rgb values by the given Color3 rgb values in a new Color3 object - * @param otherColor defines the second operand - * @returns the new Color3 object + * Returns client's status */ - multiply(otherColor) { - return new this.constructor(this.r * otherColor.r, this.g * otherColor.g, this.b * otherColor.b); + get status() { + return this._xhr.status; } /** - * Multiply the rgb values of the Color3 and the given Color3 and stores the result in the object "result" - * @param otherColor defines the second operand - * @param result defines the Color3 object where to store the result - * @returns the result Color3 + * Returns client's status as a text */ - multiplyToRef(otherColor, result) { - result.r = this.r * otherColor.r; - result.g = this.g * otherColor.g; - result.b = this.b * otherColor.b; - return result; + get statusText() { + return this._xhr.statusText; } /** - * Multiplies the current Color3 coordinates by the given ones - * @param otherColor defines the second operand - * @returns the current updated Color3 + * Returns client's response */ - multiplyInPlace(otherColor) { - this.r *= otherColor.r; - this.g *= otherColor.g; - this.b *= otherColor.b; - return this; + get response() { + return this._xhr.response; } /** - * Returns a new Color3 set with the result of the multiplication of the current Color3 coordinates by the given floats - * @param r defines the r coordinate of the operand - * @param g defines the g coordinate of the operand - * @param b defines the b coordinate of the operand - * @returns the new Color3 + * Returns client's response url */ - multiplyByFloats(r, g, b) { - return new this.constructor(this.r * r, this.g * g, this.b * b); + get responseURL() { + return this._xhr.responseURL; } /** - * @internal - * Do not use + * Returns client's response as text */ - divide(_other) { - throw new ReferenceError("Can not divide a color"); + get responseText() { + return this._xhr.responseText; } /** - * @internal - * Do not use + * Gets or sets the expected response type */ - divideToRef(_other, _result) { - throw new ReferenceError("Can not divide a color"); + get responseType() { + return this._xhr.responseType; } - /** - * @internal - * Do not use - */ - divideInPlace(_other) { - throw new ReferenceError("Can not divide a color"); + set responseType(value) { + this._xhr.responseType = value; } /** - * Updates the current Color3 with the minimal coordinate values between its and the given color ones - * @param other defines the second operand - * @returns the current updated Color3 + * Gets or sets the timeout value in milliseconds */ - minimizeInPlace(other) { - return this.minimizeInPlaceFromFloats(other.r, other.g, other.b); + get timeout() { + return this._xhr.timeout; } - /** - * Updates the current Color3 with the maximal coordinate values between its and the given color ones. - * @param other defines the second operand - * @returns the current updated Color3 - */ - maximizeInPlace(other) { - return this.maximizeInPlaceFromFloats(other.r, other.g, other.b); + set timeout(value) { + this._xhr.timeout = value; } - /** - * Updates the current Color3 with the minimal coordinate values between its and the given coordinates - * @param r defines the r coordinate of the operand - * @param g defines the g coordinate of the operand - * @param b defines the b coordinate of the operand - * @returns the current updated Color3 - */ - minimizeInPlaceFromFloats(r, g, b) { - this.r = Math.min(r, this.r); - this.g = Math.min(g, this.g); - this.b = Math.min(b, this.b); - return this; + addEventListener(type, listener, options) { + this._xhr.addEventListener(type, listener, options); } - /** - * Updates the current Color3 with the maximal coordinate values between its and the given coordinates. - * @param r defines the r coordinate of the operand - * @param g defines the g coordinate of the operand - * @param b defines the b coordinate of the operand - * @returns the current updated Color3 - */ - maximizeInPlaceFromFloats(r, g, b) { - this.r = Math.max(r, this.r); - this.g = Math.max(g, this.g); - this.b = Math.max(b, this.b); - return this; + removeEventListener(type, listener, options) { + this._xhr.removeEventListener(type, listener, options); } /** - * @internal - * Do not use + * Cancels any network activity */ - floorToRef(_result) { - throw new ReferenceError("Can not floor a color"); + abort() { + this._xhr.abort(); } /** - * @internal - * Do not use + * Initiates the request. The optional argument provides the request body. The argument is ignored if request method is GET or HEAD + * @param body defines an optional request body */ - floor() { - throw new ReferenceError("Can not floor a color"); + send(body) { + if (_WebRequest.CustomRequestHeaders) { + this._injectCustomRequestHeaders(); + } + this._xhr.send(body); } /** - * @internal - * Do not use + * Sets the request method, request URL + * @param method defines the method to use (GET, POST, etc..) + * @param url defines the url to connect with */ - fractToRef(_result) { - throw new ReferenceError("Can not fract a color"); + open(method, url) { + for (const update of _WebRequest.CustomRequestModifiers) { + if (this._shouldSkipRequestModifications(url)) { + return; + } + update(this._xhr, url); + } + url = url.replace("file:http:", "http:"); + url = url.replace("file:https:", "https:"); + this._requestURL = url; + this._xhr.open(method, url, true); } /** - * @internal - * Do not use + * Sets the value of a request header. + * @param name The name of the header whose value is to be set + * @param value The value to set as the body of the header */ - fract() { - throw new ReferenceError("Can not fract a color"); + setRequestHeader(name69, value) { + this._xhr.setRequestHeader(name69, value); } /** - * Determines equality between Color3 objects - * @param otherColor defines the second operand - * @returns true if the rgb values are equal to the given ones + * Get the string containing the text of a particular header's value. + * @param name The name of the header + * @returns The string containing the text of the given header name */ - equals(otherColor) { - return otherColor && this.r === otherColor.r && this.g === otherColor.g && this.b === otherColor.b; + getResponseHeader(name69) { + return this._xhr.getResponseHeader(name69); } +}; +WebRequest.CustomRequestHeaders = {}; +WebRequest.CustomRequestModifiers = new Array(); +WebRequest.SkipRequestModificationForBabylonCDN = true; + +// node_modules/@babylonjs/core/Misc/filesInputStore.js +var FilesInputStore = class { +}; +FilesInputStore.FilesToLoad = {}; + +// node_modules/@babylonjs/core/Misc/retryStrategy.js +var RetryStrategy = class { /** - * Alias for equalsToFloats - * @param r red color component - * @param g green color component - * @param b blue color component - * @returns boolean + * Function used to defines an exponential back off strategy + * @param maxRetries defines the maximum number of retries (3 by default) + * @param baseInterval defines the interval between retries + * @returns the strategy function to use */ - equalsFloats(r, g, b) { - return this.equalsToFloats(r, g, b); + static ExponentialBackoff(maxRetries = 3, baseInterval = 500) { + return (url, request, retryIndex) => { + if (request.status !== 0 || retryIndex >= maxRetries || url.indexOf("file:") !== -1) { + return -1; + } + return Math.pow(2, retryIndex) * baseInterval; + }; } +}; + +// node_modules/@babylonjs/core/Misc/error.js +var BaseError = class extends Error { +}; +BaseError._setPrototypeOf = Object.setPrototypeOf || ((o, proto) => { + o.__proto__ = proto; + return o; +}); +var ErrorCodes = { + // Mesh errors 0-999 + /** Invalid or empty mesh vertex positions. */ + MeshInvalidPositionsError: 0, + // Texture errors 1000-1999 + /** Unsupported texture found. */ + UnsupportedTextureError: 1e3, + // GLTFLoader errors 2000-2999 + /** Unexpected magic number found in GLTF file header. */ + GLTFLoaderUnexpectedMagicError: 2e3, + // SceneLoader errors 3000-3999 + /** SceneLoader generic error code. Ideally wraps the inner exception. */ + SceneLoaderError: 3e3, + // File related errors 4000-4999 + /** Load file error */ + LoadFileError: 4e3, + /** Request file error */ + RequestFileError: 4001, + /** Read file error */ + ReadFileError: 4002 +}; +var RuntimeError = class _RuntimeError extends BaseError { /** - * Determines equality between the current Color3 object and a set of r,b,g values - * @param r defines the red component to check - * @param g defines the green component to check - * @param b defines the blue component to check - * @returns true if the rgb values are equal to the given ones + * Creates a new RuntimeError + * @param message defines the message of the error + * @param errorCode the error code + * @param innerError the error that caused the outer error */ - equalsToFloats(r, g, b) { - return this.r === r && this.g === g && this.b === b; + constructor(message, errorCode, innerError) { + super(message); + this.errorCode = errorCode; + this.innerError = innerError; + this.name = "RuntimeError"; + BaseError._setPrototypeOf(this, _RuntimeError.prototype); } - /** - * Returns true if the current Color3 and the given color coordinates are distant less than epsilon - * @param otherColor defines the second operand - * @param epsilon defines the minimal distance to define values as equals - * @returns true if both colors are distant less than epsilon - */ - equalsWithEpsilon(otherColor, epsilon = Epsilon) { - return Scalar.WithinEpsilon(this.r, otherColor.r, epsilon) && Scalar.WithinEpsilon(this.g, otherColor.g, epsilon) && Scalar.WithinEpsilon(this.b, otherColor.b, epsilon); +}; + +// node_modules/@babylonjs/core/Misc/stringTools.js +var EndsWith = (str, suffix) => { + return str.endsWith(suffix); +}; +var StartsWith = (str, suffix) => { + if (!str) { + return false; } - /** - * @internal - * Do not use - */ - negate() { - throw new ReferenceError("Can not negate a color"); + return str.startsWith(suffix); +}; +var Decode = (buffer) => { + if (typeof TextDecoder !== "undefined") { + return new TextDecoder().decode(buffer); } - /** - * @internal - * Do not use - */ - negateInPlace() { - throw new ReferenceError("Can not negate a color"); + let result = ""; + for (let i = 0; i < buffer.byteLength; i++) { + result += String.fromCharCode(buffer[i]); } - /** - * @internal - * Do not use - */ - negateToRef(_result) { - throw new ReferenceError("Can not negate a color"); - } - /** - * Creates a new Color3 with the current Color3 values multiplied by scale - * @param scale defines the scaling factor to apply - * @returns a new Color3 object - */ - scale(scale) { - return new this.constructor(this.r * scale, this.g * scale, this.b * scale); - } - /** - * Multiplies the Color3 values by the float "scale" - * @param scale defines the scaling factor to apply - * @returns the current updated Color3 - */ - scaleInPlace(scale) { - this.r *= scale; - this.g *= scale; - this.b *= scale; - return this; - } - /** - * Multiplies the rgb values by scale and stores the result into "result" - * @param scale defines the scaling factor - * @param result defines the Color3 object where to store the result - * @returns the result Color3 - */ - scaleToRef(scale, result) { - result.r = this.r * scale; - result.g = this.g * scale; - result.b = this.b * scale; - return result; + return result; +}; +var EncodeArrayBufferToBase64 = (buffer) => { + const keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + let output = ""; + let chr1, chr2, chr3, enc1, enc2, enc3, enc4; + let i = 0; + const bytes = ArrayBuffer.isView(buffer) ? new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength) : new Uint8Array(buffer); + while (i < bytes.length) { + chr1 = bytes[i++]; + chr2 = i < bytes.length ? bytes[i++] : Number.NaN; + chr3 = i < bytes.length ? bytes[i++] : Number.NaN; + enc1 = chr1 >> 2; + enc2 = (chr1 & 3) << 4 | chr2 >> 4; + enc3 = (chr2 & 15) << 2 | chr3 >> 6; + enc4 = chr3 & 63; + if (isNaN(chr2)) { + enc3 = enc4 = 64; + } else if (isNaN(chr3)) { + enc4 = 64; + } + output += keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); } - /** - * Scale the current Color3 values by a factor and add the result to a given Color3 - * @param scale defines the scale factor - * @param result defines color to store the result into - * @returns the result Color3 - */ - scaleAndAddToRef(scale, result) { - result.r += this.r * scale; - result.g += this.g * scale; - result.b += this.b * scale; - return result; + return output; +}; +var DecodeBase64ToString = (base64Data) => { + return atob(base64Data); +}; +var DecodeBase64ToBinary = (base64Data) => { + const decodedString = DecodeBase64ToString(base64Data); + const bufferLength = decodedString.length; + const bufferView = new Uint8Array(new ArrayBuffer(bufferLength)); + for (let i = 0; i < bufferLength; i++) { + bufferView[i] = decodedString.charCodeAt(i); } - /** - * Clamps the rgb values by the min and max values and stores the result into "result" - * @param min defines minimum clamping value (default is 0) - * @param max defines maximum clamping value (default is 1) - * @param result defines color to store the result into - * @returns the result Color3 - */ - clampToRef(min = 0, max = 1, result) { - result.r = Clamp(this.r, min, max); - result.g = Clamp(this.g, min, max); - result.b = Clamp(this.b, min, max); - return result; + return bufferView.buffer; +}; +var PadNumber = (num, length) => { + let str = String(num); + while (str.length < length) { + str = "0" + str; } + return str; +}; +var StringTools = { + EndsWith, + StartsWith, + Decode, + EncodeArrayBufferToBase64, + DecodeBase64ToString, + DecodeBase64ToBinary, + PadNumber +}; + +// node_modules/@babylonjs/core/Materials/shaderLanguage.js +var ShaderLanguage; +(function(ShaderLanguage2) { + ShaderLanguage2[ShaderLanguage2["GLSL"] = 0] = "GLSL"; + ShaderLanguage2[ShaderLanguage2["WGSL"] = 1] = "WGSL"; +})(ShaderLanguage || (ShaderLanguage = {})); + +// node_modules/@babylonjs/core/Engines/shaderStore.js +var ShaderStore = class _ShaderStore { /** - * Creates a new Color3 set with the added values of the current Color3 and of the given one - * @param otherColor defines the second operand - * @returns the new Color3 + * Gets the shaders repository path for a given shader language + * @param shaderLanguage the shader language + * @returns the path to the shaders repository */ - add(otherColor) { - return new this.constructor(this.r + otherColor.r, this.g + otherColor.g, this.b + otherColor.b); + static GetShadersRepository(shaderLanguage = ShaderLanguage.GLSL) { + return shaderLanguage === ShaderLanguage.GLSL ? _ShaderStore.ShadersRepository : _ShaderStore.ShadersRepositoryWGSL; } /** - * Adds the given color to the current Color3 - * @param otherColor defines the second operand - * @returns the current updated Color3 + * Gets the shaders store of a given shader language + * @param shaderLanguage the shader language + * @returns the shaders store */ - addInPlace(otherColor) { - this.r += otherColor.r; - this.g += otherColor.g; - this.b += otherColor.b; - return this; + static GetShadersStore(shaderLanguage = ShaderLanguage.GLSL) { + return shaderLanguage === ShaderLanguage.GLSL ? _ShaderStore.ShadersStore : _ShaderStore.ShadersStoreWGSL; } /** - * Adds the given coordinates to the current Color3 - * @param r defines the r coordinate of the operand - * @param g defines the g coordinate of the operand - * @param b defines the b coordinate of the operand - * @returns the current updated Color3 + * Gets the include shaders store of a given shader language + * @param shaderLanguage the shader language + * @returns the include shaders store */ - addInPlaceFromFloats(r, g, b) { - this.r += r; - this.g += g; - this.b += b; - return this; + static GetIncludesShadersStore(shaderLanguage = ShaderLanguage.GLSL) { + return shaderLanguage === ShaderLanguage.GLSL ? _ShaderStore.IncludesShadersStore : _ShaderStore.IncludesShadersStoreWGSL; } - /** - * Stores the result of the addition of the current Color3 and given one rgb values into "result" - * @param otherColor defines the second operand - * @param result defines Color3 object to store the result into - * @returns the unmodified current Color3 - */ - addToRef(otherColor, result) { - result.r = this.r + otherColor.r; - result.g = this.g + otherColor.g; - result.b = this.b + otherColor.b; - return result; +}; +ShaderStore.ShadersRepository = "src/Shaders/"; +ShaderStore.ShadersStore = {}; +ShaderStore.IncludesShadersStore = {}; +ShaderStore.ShadersRepositoryWGSL = "src/ShadersWGSL/"; +ShaderStore.ShadersStoreWGSL = {}; +ShaderStore.IncludesShadersStoreWGSL = {}; + +// node_modules/@babylonjs/core/Engines/Processors/shaderCodeNode.js +var defaultAttributeKeywordName = "attribute"; +var defaultVaryingKeywordName = "varying"; +var ShaderCodeNode = class { + constructor() { + this.children = []; } - /** - * Returns a new Color3 set with the subtracted values of the given one from the current Color3 - * @param otherColor defines the second operand - * @returns the new Color3 - */ - subtract(otherColor) { - return new this.constructor(this.r - otherColor.r, this.g - otherColor.g, this.b - otherColor.b); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + isValid(preprocessors) { + return true; } - /** - * Stores the result of the subtraction of given one from the current Color3 rgb values into "result" - * @param otherColor defines the second operand - * @param result defines Color3 object to store the result into - * @returns the unmodified current Color3 - */ - subtractToRef(otherColor, result) { - result.r = this.r - otherColor.r; - result.g = this.g - otherColor.g; - result.b = this.b - otherColor.b; + process(preprocessors, options) { + var _a, _b, _c, _d, _e, _f; + let result = ""; + if (this.line) { + let value = this.line; + const processor = options.processor; + if (processor) { + if (processor.lineProcessor) { + value = processor.lineProcessor(value, options.isFragment, options.processingContext); + } + const attributeKeyword = ((_a = options.processor) == null ? void 0 : _a.attributeKeywordName) ?? defaultAttributeKeywordName; + const varyingKeyword = options.isFragment && ((_b = options.processor) == null ? void 0 : _b.varyingFragmentKeywordName) ? (_c = options.processor) == null ? void 0 : _c.varyingFragmentKeywordName : !options.isFragment && ((_d = options.processor) == null ? void 0 : _d.varyingVertexKeywordName) ? (_e = options.processor) == null ? void 0 : _e.varyingVertexKeywordName : defaultVaryingKeywordName; + if (!options.isFragment && processor.attributeProcessor && this.line.startsWith(attributeKeyword)) { + value = processor.attributeProcessor(this.line, preprocessors, options.processingContext); + } else if (processor.varyingProcessor && (((_f = processor.varyingCheck) == null ? void 0 : _f.call(processor, this.line, options.isFragment)) || !processor.varyingCheck && this.line.startsWith(varyingKeyword))) { + value = processor.varyingProcessor(this.line, options.isFragment, preprocessors, options.processingContext); + } else if (processor.uniformProcessor && processor.uniformRegexp && processor.uniformRegexp.test(this.line)) { + if (!options.lookForClosingBracketForUniformBuffer) { + value = processor.uniformProcessor(this.line, options.isFragment, preprocessors, options.processingContext); + } + } else if (processor.uniformBufferProcessor && processor.uniformBufferRegexp && processor.uniformBufferRegexp.test(this.line)) { + if (!options.lookForClosingBracketForUniformBuffer) { + value = processor.uniformBufferProcessor(this.line, options.isFragment, options.processingContext); + options.lookForClosingBracketForUniformBuffer = true; + } + } else if (processor.textureProcessor && processor.textureRegexp && processor.textureRegexp.test(this.line)) { + value = processor.textureProcessor(this.line, options.isFragment, preprocessors, options.processingContext); + } else if ((processor.uniformProcessor || processor.uniformBufferProcessor) && this.line.startsWith("uniform") && !options.lookForClosingBracketForUniformBuffer) { + const regex = /uniform\s+(?:(?:highp)?|(?:lowp)?)\s*(\S+)\s+(\S+)\s*;/; + if (regex.test(this.line)) { + if (processor.uniformProcessor) { + value = processor.uniformProcessor(this.line, options.isFragment, preprocessors, options.processingContext); + } + } else { + if (processor.uniformBufferProcessor) { + value = processor.uniformBufferProcessor(this.line, options.isFragment, options.processingContext); + options.lookForClosingBracketForUniformBuffer = true; + } + } + } + if (options.lookForClosingBracketForUniformBuffer && this.line.indexOf("}") !== -1) { + options.lookForClosingBracketForUniformBuffer = false; + if (processor.endOfUniformBufferProcessor) { + value = processor.endOfUniformBufferProcessor(this.line, options.isFragment, options.processingContext); + } + } + } + result += value + "\n"; + } + this.children.forEach((child) => { + result += child.process(preprocessors, options); + }); + if (this.additionalDefineKey) { + preprocessors[this.additionalDefineKey] = this.additionalDefineValue || "true"; + } return result; } - /** - * Subtract the given color from the current Color3 - * @param otherColor defines the second operand - * @returns the current updated Color3 - */ - subtractInPlace(otherColor) { - this.r -= otherColor.r; - this.g -= otherColor.g; - this.b -= otherColor.b; - return this; - } - /** - * Returns a new Color3 set with the subtraction of the given floats from the current Color3 coordinates - * @param r defines the r coordinate of the operand - * @param g defines the g coordinate of the operand - * @param b defines the b coordinate of the operand - * @returns the resulting Color3 - */ - subtractFromFloats(r, g, b) { - return new this.constructor(this.r - r, this.g - g, this.b - b); - } - /** - * Subtracts the given floats from the current Color3 coordinates and set the given color "result" with this result - * @param r defines the r coordinate of the operand - * @param g defines the g coordinate of the operand - * @param b defines the b coordinate of the operand - * @param result defines the Color3 object where to store the result - * @returns the result - */ - subtractFromFloatsToRef(r, g, b, result) { - return result.copyFromFloats(this.r - r, this.g - g, this.b - b); - } - /** - * Copy the current object - * @returns a new Color3 copied the current one - */ - clone() { - return new this.constructor(this.r, this.g, this.b); +}; + +// node_modules/@babylonjs/core/Engines/Processors/shaderCodeCursor.js +var ShaderCodeCursor = class { + constructor() { + this._lines = []; } - /** - * Copies the rgb values from the source in the current Color3 - * @param source defines the source Color3 object - * @returns the updated Color3 object - */ - copyFrom(source) { - this.r = source.r; - this.g = source.g; - this.b = source.b; - return this; + get currentLine() { + return this._lines[this.lineIndex]; } - /** - * Updates the Color3 rgb values from the given floats - * @param r defines the red component to read from - * @param g defines the green component to read from - * @param b defines the blue component to read from - * @returns the current Color3 object - */ - copyFromFloats(r, g, b) { - this.r = r; - this.g = g; - this.b = b; - return this; + get canRead() { + return this.lineIndex < this._lines.length - 1; } - /** - * Updates the Color3 rgb values from the given floats - * @param r defines the red component to read from - * @param g defines the green component to read from - * @param b defines the blue component to read from - * @returns the current Color3 object - */ - set(r, g, b) { - return this.copyFromFloats(r, g, b); + set lines(value) { + this._lines.length = 0; + for (const line of value) { + if (!line || line === "\r") { + continue; + } + if (line[0] === "#") { + this._lines.push(line); + continue; + } + const trimmedLine = line.trim(); + if (!trimmedLine) { + continue; + } + if (trimmedLine.startsWith("//")) { + this._lines.push(line); + continue; + } + const semicolonIndex = trimmedLine.indexOf(";"); + if (semicolonIndex === -1) { + this._lines.push(trimmedLine); + } else if (semicolonIndex === trimmedLine.length - 1) { + if (trimmedLine.length > 1) { + this._lines.push(trimmedLine); + } + } else { + const split = line.split(";"); + for (let index = 0; index < split.length; index++) { + let subLine = split[index]; + if (!subLine) { + continue; + } + subLine = subLine.trim(); + if (!subLine) { + continue; + } + this._lines.push(subLine + (index !== split.length - 1 ? ";" : "")); + } + } + } } - /** - * Copies the given float to the current Color3 coordinates - * @param v defines the r, g and b coordinates of the operand - * @returns the current updated Color3 - */ - setAll(v) { - this.r = this.g = this.b = v; - return this; +}; + +// node_modules/@babylonjs/core/Engines/Processors/shaderCodeConditionNode.js +var ShaderCodeConditionNode = class extends ShaderCodeNode { + process(preprocessors, options) { + for (let index = 0; index < this.children.length; index++) { + const node = this.children[index]; + if (node.isValid(preprocessors)) { + return node.process(preprocessors, options); + } + } + return ""; } - /** - * Compute the Color3 hexadecimal code as a string - * @returns a string containing the hexadecimal representation of the Color3 object - */ - toHexString() { - const intR = Math.round(this.r * 255); - const intG = Math.round(this.g * 255); - const intB = Math.round(this.b * 255); - return "#" + ToHex(intR) + ToHex(intG) + ToHex(intB); +}; + +// node_modules/@babylonjs/core/Engines/Processors/shaderCodeTestNode.js +var ShaderCodeTestNode = class extends ShaderCodeNode { + isValid(preprocessors) { + return this.testExpression.isTrue(preprocessors); } - /** - * Converts current color in rgb space to HSV values - * @returns a new color3 representing the HSV values - */ - toHSV() { - const result = new this.constructor(); - this.toHSVToRef(result); - return result; +}; + +// node_modules/@babylonjs/core/Engines/Processors/Expressions/shaderDefineExpression.js +var ShaderDefineExpression = class _ShaderDefineExpression { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + isTrue(preprocessors) { + return true; } - /** - * Converts current color in rgb space to HSV values - * @param result defines the Color3 where to store the HSV values - */ - toHSVToRef(result) { - const r = this.r; - const g = this.g; - const b = this.b; - const max = Math.max(r, g, b); - const min = Math.min(r, g, b); - let h = 0; - let s = 0; - const v = max; - const dm = max - min; - if (max !== 0) { - s = dm / max; - } - if (max != min) { - if (max == r) { - h = (g - b) / dm; - if (g < b) { - h += 6; - } - } else if (max == g) { - h = (b - r) / dm + 2; - } else if (max == b) { - h = (r - g) / dm + 4; + static postfixToInfix(postfix) { + const stack = []; + for (const c of postfix) { + if (_ShaderDefineExpression._OperatorPriority[c] === void 0) { + stack.push(c); + } else { + const v1 = stack[stack.length - 1], v2 = stack[stack.length - 2]; + stack.length -= 2; + stack.push(`(${v2}${c}${v1})`); } - h *= 60; } - result.r = h; - result.g = s; - result.b = v; - } - /** - * Computes a new Color3 converted from the current one to linear space - * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) - * @returns a new Color3 object - */ - toLinearSpace(exact = false) { - const convertedColor = new this.constructor(); - this.toLinearSpaceToRef(convertedColor, exact); - return convertedColor; + return stack[stack.length - 1]; } /** - * Converts the Color3 values to linear space and stores the result in "convertedColor" - * @param convertedColor defines the Color3 object where to store the linear space version - * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) - * @returns the unmodified Color3 + * Converts an infix expression to a postfix expression. + * + * This method is used to transform infix expressions, which are more human-readable, + * into postfix expressions, also known as Reverse Polish Notation (RPN), that can be + * evaluated more efficiently by a computer. The conversion is based on the operator + * priority defined in _OperatorPriority. + * + * The function employs a stack-based algorithm for the conversion and caches the result + * to improve performance. The cache keeps track of each converted expression's access time + * to manage the cache size and optimize memory usage. When the cache size exceeds a specified + * limit, the least recently accessed items in the cache are deleted. + * + * The cache mechanism is particularly helpful for shader compilation, where the same infix + * expressions might be encountered repeatedly, hence the caching can speed up the process. + * + * @param infix - The infix expression to be converted. + * @returns The postfix expression as an array of strings. */ - toLinearSpaceToRef(convertedColor, exact = false) { - if (exact) { - convertedColor.r = colorChannelToLinearSpaceExact(this.r); - convertedColor.g = colorChannelToLinearSpaceExact(this.g); - convertedColor.b = colorChannelToLinearSpaceExact(this.b); - } else { - convertedColor.r = colorChannelToLinearSpace(this.r); - convertedColor.g = colorChannelToLinearSpace(this.g); - convertedColor.b = colorChannelToLinearSpace(this.b); + static infixToPostfix(infix) { + const cacheItem = _ShaderDefineExpression._InfixToPostfixCache.get(infix); + if (cacheItem) { + cacheItem.accessTime = Date.now(); + return cacheItem.result; } - return this; - } - /** - * Computes a new Color3 converted from the current one to gamma space - * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) - * @returns a new Color3 object - */ - toGammaSpace(exact = false) { - const convertedColor = new this.constructor(); - this.toGammaSpaceToRef(convertedColor, exact); - return convertedColor; - } - /** - * Converts the Color3 values to gamma space and stores the result in "convertedColor" - * @param convertedColor defines the Color3 object where to store the gamma space version - * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) - * @returns the unmodified Color3 - */ - toGammaSpaceToRef(convertedColor, exact = false) { - if (exact) { - convertedColor.r = colorChannelToGammaSpaceExact(this.r); - convertedColor.g = colorChannelToGammaSpaceExact(this.g); - convertedColor.b = colorChannelToGammaSpaceExact(this.b); - } else { - convertedColor.r = colorChannelToGammaSpace(this.r); - convertedColor.g = colorChannelToGammaSpace(this.g); - convertedColor.b = colorChannelToGammaSpace(this.b); + if (!infix.includes("&&") && !infix.includes("||") && !infix.includes(")") && !infix.includes("(")) { + return [infix]; } - return this; - } - /** - * Converts Hue, saturation and value to a Color3 (RGB) - * @param hue defines the hue (value between 0 and 360) - * @param saturation defines the saturation (value between 0 and 1) - * @param value defines the value (value between 0 and 1) - * @param result defines the Color3 where to store the RGB values - */ - static HSVtoRGBToRef(hue, saturation, value, result) { - const chroma = value * saturation; - const h = hue / 60; - const x = chroma * (1 - Math.abs(h % 2 - 1)); - let r = 0; - let g = 0; - let b = 0; - if (h >= 0 && h <= 1) { - r = chroma; - g = x; - } else if (h >= 1 && h <= 2) { - r = x; - g = chroma; - } else if (h >= 2 && h <= 3) { - g = chroma; - b = x; - } else if (h >= 3 && h <= 4) { - g = x; - b = chroma; - } else if (h >= 4 && h <= 5) { - r = x; - b = chroma; - } else if (h >= 5 && h <= 6) { - r = chroma; - b = x; + const result = []; + let stackIdx = -1; + const pushOperand = () => { + operand = operand.trim(); + if (operand !== "") { + result.push(operand); + operand = ""; + } + }; + const push = (s) => { + if (stackIdx < _ShaderDefineExpression._Stack.length - 1) { + _ShaderDefineExpression._Stack[++stackIdx] = s; + } + }; + const peek = () => _ShaderDefineExpression._Stack[stackIdx]; + const pop = () => stackIdx === -1 ? "!!INVALID EXPRESSION!!" : _ShaderDefineExpression._Stack[stackIdx--]; + let idx = 0, operand = ""; + while (idx < infix.length) { + const c = infix.charAt(idx), token = idx < infix.length - 1 ? infix.substr(idx, 2) : ""; + if (c === "(") { + operand = ""; + push(c); + } else if (c === ")") { + pushOperand(); + while (stackIdx !== -1 && peek() !== "(") { + result.push(pop()); + } + pop(); + } else if (_ShaderDefineExpression._OperatorPriority[token] > 1) { + pushOperand(); + while (stackIdx !== -1 && _ShaderDefineExpression._OperatorPriority[peek()] >= _ShaderDefineExpression._OperatorPriority[token]) { + result.push(pop()); + } + push(token); + idx++; + } else { + operand += c; + } + idx++; } - const m = value - chroma; - result.set(r + m, g + m, b + m); - } - /** - * Converts Hue, saturation and value to a new Color3 (RGB) - * @param hue defines the hue (value between 0 and 360) - * @param saturation defines the saturation (value between 0 and 1) - * @param value defines the value (value between 0 and 1) - * @returns a new Color3 object - */ - static FromHSV(hue, saturation, value) { - const result = new _Color3(0, 0, 0); - _Color3.HSVtoRGBToRef(hue, saturation, value, result); + pushOperand(); + while (stackIdx !== -1) { + if (peek() === "(") { + pop(); + } else { + result.push(pop()); + } + } + if (_ShaderDefineExpression._InfixToPostfixCache.size >= _ShaderDefineExpression.InfixToPostfixCacheLimitSize) { + _ShaderDefineExpression.ClearCache(); + } + _ShaderDefineExpression._InfixToPostfixCache.set(infix, { result, accessTime: Date.now() }); return result; } - /** - * Creates a new Color3 from the string containing valid hexadecimal values - * @param hex defines a string containing valid hexadecimal values - * @returns a new Color3 object - */ - static FromHexString(hex) { - if (hex.substring(0, 1) !== "#" || hex.length !== 7) { - return new _Color3(0, 0, 0); + static ClearCache() { + const sortedCache = Array.from(_ShaderDefineExpression._InfixToPostfixCache.entries()).sort((a, b) => a[1].accessTime - b[1].accessTime); + for (let i = 0; i < _ShaderDefineExpression.InfixToPostfixCacheCleanupSize; i++) { + _ShaderDefineExpression._InfixToPostfixCache.delete(sortedCache[i][0]); } - const r = parseInt(hex.substring(1, 3), 16); - const g = parseInt(hex.substring(3, 5), 16); - const b = parseInt(hex.substring(5, 7), 16); - return _Color3.FromInts(r, g, b); } - /** - * Creates a new Color3 from the starting index of the given array - * @param array defines the source array - * @param offset defines an offset in the source array - * @returns a new Color3 object - */ - static FromArray(array, offset = 0) { - return new _Color3(array[offset], array[offset + 1], array[offset + 2]); +}; +ShaderDefineExpression.InfixToPostfixCacheLimitSize = 5e4; +ShaderDefineExpression.InfixToPostfixCacheCleanupSize = 25e3; +ShaderDefineExpression._InfixToPostfixCache = /* @__PURE__ */ new Map(); +ShaderDefineExpression._OperatorPriority = { + ")": 0, + "(": 1, + "||": 2, + "&&": 3 +}; +ShaderDefineExpression._Stack = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]; + +// node_modules/@babylonjs/core/Engines/Processors/Expressions/Operators/shaderDefineIsDefinedOperator.js +var ShaderDefineIsDefinedOperator = class extends ShaderDefineExpression { + constructor(define, not = false) { + super(); + this.define = define; + this.not = not; } - /** - * Creates a new Color3 from the starting index element of the given array - * @param array defines the source array to read from - * @param offset defines the offset in the source array - * @param result defines the target Color3 object - */ - static FromArrayToRef(array, offset = 0, result) { - result.r = array[offset]; - result.g = array[offset + 1]; - result.b = array[offset + 2]; + isTrue(preprocessors) { + let condition = preprocessors[this.define] !== void 0; + if (this.not) { + condition = !condition; + } + return condition; } - /** - * Creates a new Color3 from integer values (\< 256) - * @param r defines the red component to read from (value between 0 and 255) - * @param g defines the green component to read from (value between 0 and 255) - * @param b defines the blue component to read from (value between 0 and 255) - * @returns a new Color3 object - */ - static FromInts(r, g, b) { - return new _Color3(r / 255, g / 255, b / 255); +}; + +// node_modules/@babylonjs/core/Engines/Processors/Expressions/Operators/shaderDefineOrOperator.js +var ShaderDefineOrOperator = class extends ShaderDefineExpression { + isTrue(preprocessors) { + return this.leftOperand.isTrue(preprocessors) || this.rightOperand.isTrue(preprocessors); } - /** - * Creates a new Color3 with values linearly interpolated of "amount" between the start Color3 and the end Color3 - * @param start defines the start Color3 value - * @param end defines the end Color3 value - * @param amount defines the gradient value between start and end - * @returns a new Color3 object - */ - static Lerp(start, end, amount) { - const result = new _Color3(0, 0, 0); - _Color3.LerpToRef(start, end, amount, result); - return result; +}; + +// node_modules/@babylonjs/core/Engines/Processors/Expressions/Operators/shaderDefineAndOperator.js +var ShaderDefineAndOperator = class extends ShaderDefineExpression { + isTrue(preprocessors) { + return this.leftOperand.isTrue(preprocessors) && this.rightOperand.isTrue(preprocessors); } - /** - * Creates a new Color3 with values linearly interpolated of "amount" between the start Color3 and the end Color3 - * @param left defines the start value - * @param right defines the end value - * @param amount defines the gradient factor - * @param result defines the Color3 object where to store the result - */ - static LerpToRef(left, right, amount, result) { - result.r = left.r + (right.r - left.r) * amount; - result.g = left.g + (right.g - left.g) * amount; - result.b = left.b + (right.b - left.b) * amount; +}; + +// node_modules/@babylonjs/core/Engines/Processors/Expressions/Operators/shaderDefineArithmeticOperator.js +var ShaderDefineArithmeticOperator = class extends ShaderDefineExpression { + constructor(define, operand, testValue) { + super(); + this.define = define; + this.operand = operand; + this.testValue = testValue; } - /** - * Returns a new Color3 located for "amount" (float) on the Hermite interpolation spline defined by the vectors "value1", "tangent1", "value2", "tangent2" - * @param value1 defines the first control point - * @param tangent1 defines the first tangent Color3 - * @param value2 defines the second control point - * @param tangent2 defines the second tangent Color3 - * @param amount defines the amount on the interpolation spline (between 0 and 1) - * @returns the new Color3 - */ - static Hermite(value1, tangent1, value2, tangent2, amount) { - const squared = amount * amount; - const cubed = amount * squared; - const part1 = 2 * cubed - 3 * squared + 1; - const part2 = -2 * cubed + 3 * squared; - const part3 = cubed - 2 * squared + amount; - const part4 = cubed - squared; - const r = value1.r * part1 + value2.r * part2 + tangent1.r * part3 + tangent2.r * part4; - const g = value1.g * part1 + value2.g * part2 + tangent1.g * part3 + tangent2.g * part4; - const b = value1.b * part1 + value2.b * part2 + tangent1.b * part3 + tangent2.b * part4; - return new _Color3(r, g, b); + isTrue(preprocessors) { + let value = preprocessors[this.define]; + if (value === void 0) { + value = this.define; + } + let condition = false; + const left = parseInt(value); + const right = parseInt(this.testValue); + switch (this.operand) { + case ">": + condition = left > right; + break; + case "<": + condition = left < right; + break; + case "<=": + condition = left <= right; + break; + case ">=": + condition = left >= right; + break; + case "==": + condition = left === right; + break; + case "!=": + condition = left !== right; + break; + } + return condition; } - /** - * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors "value1", "value2", "tangent1", "tangent2". - * @param value1 defines the first control point - * @param tangent1 defines the first tangent - * @param value2 defines the second control point - * @param tangent2 defines the second tangent - * @param time define where the derivative must be done - * @returns 1st derivative - */ - static Hermite1stDerivative(value1, tangent1, value2, tangent2, time) { - const result = _Color3.Black(); - this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result); - return result; +}; + +// node_modules/@babylonjs/core/Misc/devTools.js +var warnedMap = {}; +function _WarnImport(name69, warnOnce = false) { + if (warnOnce && warnedMap[name69]) { + return; } - /** - * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors "value1", "value2", "tangent1", "tangent2". - * @param value1 defines the first control point - * @param tangent1 defines the first tangent - * @param value2 defines the second control point - * @param tangent2 defines the second tangent - * @param time define where the derivative must be done - * @param result define where to store the derivative - */ - static Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result) { - const t2 = time * time; - result.r = (t2 - time) * 6 * value1.r + (3 * t2 - 4 * time + 1) * tangent1.r + (-t2 + time) * 6 * value2.r + (3 * t2 - 2 * time) * tangent2.r; - result.g = (t2 - time) * 6 * value1.g + (3 * t2 - 4 * time + 1) * tangent1.g + (-t2 + time) * 6 * value2.g + (3 * t2 - 2 * time) * tangent2.g; - result.b = (t2 - time) * 6 * value1.b + (3 * t2 - 4 * time + 1) * tangent1.b + (-t2 + time) * 6 * value2.b + (3 * t2 - 2 * time) * tangent2.b; + warnedMap[name69] = true; + return `${name69} needs to be imported before as it contains a side-effect required by your code.`; +} + +// node_modules/@babylonjs/core/Engines/Processors/shaderProcessor.js +var regexSE = /defined\s*?\((.+?)\)/g; +var regexSERevert = /defined\s*?\[(.+?)\]/g; +var regexShaderInclude = /#include\s?<(.+)>(\((.*)\))*(\[(.*)\])*/g; +var regexShaderDecl = /__decl__/; +var regexLightX = /light\{X\}.(\w*)/g; +var regexX = /\{X\}/g; +var reusableMatches = []; +var ShaderProcessor = class _ShaderProcessor { + static Initialize(options) { + if (options.processor && options.processor.initializeShaders) { + options.processor.initializeShaders(options.processingContext); + } } - /** - * Returns a Color3 value containing a red color - * @returns a new Color3 object - */ - static Red() { - return new _Color3(1, 0, 0); + static Process(sourceCode, options, callback, engine) { + var _a; + if ((_a = options.processor) == null ? void 0 : _a.preProcessShaderCode) { + sourceCode = options.processor.preProcessShaderCode(sourceCode, options.isFragment); + } + this._ProcessIncludes(sourceCode, options, (codeWithIncludes) => { + if (options.processCodeAfterIncludes) { + codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? "fragment" : "vertex", codeWithIncludes); + } + const migratedCode = this._ProcessShaderConversion(codeWithIncludes, options, engine); + callback(migratedCode, codeWithIncludes); + }); } - /** - * Returns a Color3 value containing a green color - * @returns a new Color3 object - */ - static Green() { - return new _Color3(0, 1, 0); + static PreProcess(sourceCode, options, callback, engine) { + var _a; + if ((_a = options.processor) == null ? void 0 : _a.preProcessShaderCode) { + sourceCode = options.processor.preProcessShaderCode(sourceCode, options.isFragment); + } + this._ProcessIncludes(sourceCode, options, (codeWithIncludes) => { + if (options.processCodeAfterIncludes) { + codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? "fragment" : "vertex", codeWithIncludes); + } + const migratedCode = this._ApplyPreProcessing(codeWithIncludes, options, engine); + callback(migratedCode, codeWithIncludes); + }); } - /** - * Returns a Color3 value containing a blue color - * @returns a new Color3 object - */ - static Blue() { - return new _Color3(0, 0, 1); + static Finalize(vertexCode, fragmentCode, options) { + if (!options.processor || !options.processor.finalizeShaders) { + return { vertexCode, fragmentCode }; + } + return options.processor.finalizeShaders(vertexCode, fragmentCode, options.processingContext); } - /** - * Returns a Color3 value containing a black color - * @returns a new Color3 object - */ - static Black() { - return new _Color3(0, 0, 0); + static _ProcessPrecision(source, options) { + var _a; + if ((_a = options.processor) == null ? void 0 : _a.noPrecision) { + return source; + } + const shouldUseHighPrecisionShader = options.shouldUseHighPrecisionShader; + if (source.indexOf("precision highp float") === -1) { + if (!shouldUseHighPrecisionShader) { + source = "precision mediump float;\n" + source; + } else { + source = "precision highp float;\n" + source; + } + } else { + if (!shouldUseHighPrecisionShader) { + source = source.replace("precision highp float", "precision mediump float"); + } + } + return source; } - /** - * Gets a Color3 value containing a black color that must not be updated - */ - static get BlackReadOnly() { - return _Color3._BlackReadOnly; + static _ExtractOperation(expression) { + const regex = /defined\((.+)\)/; + const match = regex.exec(expression); + if (match && match.length) { + return new ShaderDefineIsDefinedOperator(match[1].trim(), expression[0] === "!"); + } + const operators = ["==", "!=", ">=", "<=", "<", ">"]; + let operator = ""; + let indexOperator = 0; + for (operator of operators) { + indexOperator = expression.indexOf(operator); + if (indexOperator > -1) { + break; + } + } + if (indexOperator === -1) { + return new ShaderDefineIsDefinedOperator(expression); + } + const define = expression.substring(0, indexOperator).trim(); + const value = expression.substring(indexOperator + operator.length).trim(); + return new ShaderDefineArithmeticOperator(define, operator, value); } - /** - * Returns a Color3 value containing a white color - * @returns a new Color3 object - */ - static White() { - return new _Color3(1, 1, 1); + static _BuildSubExpression(expression) { + expression = expression.replace(regexSE, "defined[$1]"); + const postfix = ShaderDefineExpression.infixToPostfix(expression); + const stack = []; + for (const c of postfix) { + if (c !== "||" && c !== "&&") { + stack.push(c); + } else if (stack.length >= 2) { + let v1 = stack[stack.length - 1], v2 = stack[stack.length - 2]; + stack.length -= 2; + const operator = c == "&&" ? new ShaderDefineAndOperator() : new ShaderDefineOrOperator(); + if (typeof v1 === "string") { + v1 = v1.replace(regexSERevert, "defined($1)"); + } + if (typeof v2 === "string") { + v2 = v2.replace(regexSERevert, "defined($1)"); + } + operator.leftOperand = typeof v2 === "string" ? this._ExtractOperation(v2) : v2; + operator.rightOperand = typeof v1 === "string" ? this._ExtractOperation(v1) : v1; + stack.push(operator); + } + } + let result = stack[stack.length - 1]; + if (typeof result === "string") { + result = result.replace(regexSERevert, "defined($1)"); + } + return typeof result === "string" ? this._ExtractOperation(result) : result; } - /** - * Returns a Color3 value containing a purple color - * @returns a new Color3 object - */ - static Purple() { - return new _Color3(0.5, 0, 0.5); + static _BuildExpression(line, start) { + const node = new ShaderCodeTestNode(); + const command = line.substring(0, start); + let expression = line.substring(start); + expression = expression.substring(0, (expression.indexOf("//") + 1 || expression.length + 1) - 1).trim(); + if (command === "#ifdef") { + node.testExpression = new ShaderDefineIsDefinedOperator(expression); + } else if (command === "#ifndef") { + node.testExpression = new ShaderDefineIsDefinedOperator(expression, true); + } else { + node.testExpression = this._BuildSubExpression(expression); + } + return node; } - /** - * Returns a Color3 value containing a magenta color - * @returns a new Color3 object - */ - static Magenta() { - return new _Color3(1, 0, 1); + static _MoveCursorWithinIf(cursor, rootNode, ifNode) { + let line = cursor.currentLine; + while (this._MoveCursor(cursor, ifNode)) { + line = cursor.currentLine; + const first5 = line.substring(0, 5).toLowerCase(); + if (first5 === "#else") { + const elseNode = new ShaderCodeNode(); + rootNode.children.push(elseNode); + this._MoveCursor(cursor, elseNode); + return; + } else if (first5 === "#elif") { + const elifNode = this._BuildExpression(line, 5); + rootNode.children.push(elifNode); + ifNode = elifNode; + } + } } - /** - * Returns a Color3 value containing a yellow color - * @returns a new Color3 object - */ - static Yellow() { - return new _Color3(1, 1, 0); + static _MoveCursor(cursor, rootNode) { + while (cursor.canRead) { + cursor.lineIndex++; + const line = cursor.currentLine; + if (line.indexOf("#") >= 0) { + const matches = _ShaderProcessor._MoveCursorRegex.exec(line); + if (matches && matches.length) { + const keyword = matches[0]; + switch (keyword) { + case "#ifdef": { + const newRootNode = new ShaderCodeConditionNode(); + rootNode.children.push(newRootNode); + const ifNode = this._BuildExpression(line, 6); + newRootNode.children.push(ifNode); + this._MoveCursorWithinIf(cursor, newRootNode, ifNode); + break; + } + case "#else": + case "#elif": + return true; + case "#endif": + return false; + case "#ifndef": { + const newRootNode = new ShaderCodeConditionNode(); + rootNode.children.push(newRootNode); + const ifNode = this._BuildExpression(line, 7); + newRootNode.children.push(ifNode); + this._MoveCursorWithinIf(cursor, newRootNode, ifNode); + break; + } + case "#if": { + const newRootNode = new ShaderCodeConditionNode(); + const ifNode = this._BuildExpression(line, 3); + rootNode.children.push(newRootNode); + newRootNode.children.push(ifNode); + this._MoveCursorWithinIf(cursor, newRootNode, ifNode); + break; + } + } + continue; + } + } + const newNode = new ShaderCodeNode(); + newNode.line = line; + rootNode.children.push(newNode); + if (line[0] === "#" && line[1] === "d") { + const split = line.replace(";", "").split(" "); + newNode.additionalDefineKey = split[1]; + if (split.length === 3) { + newNode.additionalDefineValue = split[2]; + } + } + } + return false; + } + static _EvaluatePreProcessors(sourceCode, preprocessors, options) { + const rootNode = new ShaderCodeNode(); + const cursor = new ShaderCodeCursor(); + cursor.lineIndex = -1; + cursor.lines = sourceCode.split("\n"); + this._MoveCursor(cursor, rootNode); + return rootNode.process(preprocessors, options); + } + static _PreparePreProcessors(options, engine) { + var _a; + const defines = options.defines; + const preprocessors = {}; + for (const define of defines) { + const keyValue = define.replace("#define", "").replace(";", "").trim(); + const split = keyValue.split(" "); + preprocessors[split[0]] = split.length > 1 ? split[1] : ""; + } + if (((_a = options.processor) == null ? void 0 : _a.shaderLanguage) === ShaderLanguage.GLSL) { + preprocessors["GL_ES"] = "true"; + } + preprocessors["__VERSION__"] = options.version; + preprocessors[options.platformName] = "true"; + engine._getGlobalDefines(preprocessors); + return preprocessors; + } + static _ProcessShaderConversion(sourceCode, options, engine) { + let preparedSourceCode = this._ProcessPrecision(sourceCode, options); + if (!options.processor) { + return preparedSourceCode; + } + if (options.processor.shaderLanguage === ShaderLanguage.GLSL && preparedSourceCode.indexOf("#version 3") !== -1) { + preparedSourceCode = preparedSourceCode.replace("#version 300 es", ""); + if (!options.processor.parseGLES3) { + return preparedSourceCode; + } + } + const defines = options.defines; + const preprocessors = this._PreparePreProcessors(options, engine); + if (options.processor.preProcessor) { + preparedSourceCode = options.processor.preProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext); + } + preparedSourceCode = this._EvaluatePreProcessors(preparedSourceCode, preprocessors, options); + if (options.processor.postProcessor) { + preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext, engine); + } + if (engine._features.needShaderCodeInlining) { + preparedSourceCode = engine.inlineShaderCode(preparedSourceCode); + } + return preparedSourceCode; + } + static _ApplyPreProcessing(sourceCode, options, engine) { + var _a, _b; + let preparedSourceCode = sourceCode; + const defines = options.defines; + const preprocessors = this._PreparePreProcessors(options, engine); + if ((_a = options.processor) == null ? void 0 : _a.preProcessor) { + preparedSourceCode = options.processor.preProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext); + } + preparedSourceCode = this._EvaluatePreProcessors(preparedSourceCode, preprocessors, options); + if ((_b = options.processor) == null ? void 0 : _b.postProcessor) { + preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext, engine); + } + if (engine._features.needShaderCodeInlining) { + preparedSourceCode = engine.inlineShaderCode(preparedSourceCode); + } + return preparedSourceCode; + } + /** @internal */ + static _ProcessIncludes(sourceCode, options, callback) { + reusableMatches.length = 0; + let match; + while ((match = regexShaderInclude.exec(sourceCode)) !== null) { + reusableMatches.push(match); + } + let returnValue = String(sourceCode); + let parts = [sourceCode]; + let keepProcessing = false; + for (const match2 of reusableMatches) { + let includeFile = match2[1]; + if (includeFile.indexOf("__decl__") !== -1) { + includeFile = includeFile.replace(regexShaderDecl, ""); + if (options.supportsUniformBuffers) { + includeFile = includeFile.replace("Vertex", "Ubo").replace("Fragment", "Ubo"); + } + includeFile = includeFile + "Declaration"; + } + if (options.includesShadersStore[includeFile]) { + let includeContent = options.includesShadersStore[includeFile]; + if (match2[2]) { + const splits = match2[3].split(","); + for (let index = 0; index < splits.length; index += 2) { + const source = new RegExp(splits[index], "g"); + const dest = splits[index + 1]; + includeContent = includeContent.replace(source, dest); + } + } + if (match2[4]) { + const indexString = match2[5]; + if (indexString.indexOf("..") !== -1) { + const indexSplits = indexString.split(".."); + const minIndex = parseInt(indexSplits[0]); + let maxIndex = parseInt(indexSplits[1]); + let sourceIncludeContent = includeContent.slice(0); + includeContent = ""; + if (isNaN(maxIndex)) { + maxIndex = options.indexParameters[indexSplits[1]]; + } + for (let i = minIndex; i < maxIndex; i++) { + if (!options.supportsUniformBuffers) { + sourceIncludeContent = sourceIncludeContent.replace(regexLightX, (str, p1) => { + return p1 + "{X}"; + }); + } + includeContent += sourceIncludeContent.replace(regexX, i.toString()) + "\n"; + } + } else { + if (!options.supportsUniformBuffers) { + includeContent = includeContent.replace(regexLightX, (str, p1) => { + return p1 + "{X}"; + }); + } + includeContent = includeContent.replace(regexX, indexString); + } + } + const newParts = []; + for (const part of parts) { + const splitPart = part.split(match2[0]); + for (let i = 0; i < splitPart.length - 1; i++) { + newParts.push(splitPart[i]); + newParts.push(includeContent); + } + newParts.push(splitPart[splitPart.length - 1]); + } + parts = newParts; + keepProcessing = keepProcessing || includeContent.indexOf("#include<") >= 0 || includeContent.indexOf("#include <") >= 0; + } else { + const includeShaderUrl = options.shadersRepository + "ShadersInclude/" + includeFile + ".fx"; + _ShaderProcessor._FileToolsLoadFile(includeShaderUrl, (fileContent) => { + options.includesShadersStore[includeFile] = fileContent; + this._ProcessIncludes(parts.join(""), options, callback); + }); + return; + } + } + reusableMatches.length = 0; + returnValue = parts.join(""); + if (keepProcessing) { + this._ProcessIncludes(returnValue.toString(), options, callback); + } else { + callback(returnValue); + } } /** - * Returns a Color3 value containing a gray color - * @returns a new Color3 object + * Loads a file from a url + * @param url url to load + * @param onSuccess callback called when the file successfully loads + * @param onProgress callback called while file is loading (if the server supports this mode) + * @param offlineProvider defines the offline provider for caching + * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer + * @param onError callback called when the file fails to load + * @returns a file request object + * @internal */ - static Gray() { - return new _Color3(0.5, 0.5, 0.5); + static _FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError) { + throw _WarnImport("FileTools"); } +}; +ShaderProcessor._MoveCursorRegex = /(#ifdef)|(#else)|(#elif)|(#endif)|(#ifndef)|(#if)/; + +// node_modules/@babylonjs/core/Materials/effect.js +var Effect = class _Effect { /** - * Returns a Color3 value containing a teal color - * @returns a new Color3 object + * Gets or sets the relative url used to load shaders if using the engine in non-minified mode */ - static Teal() { - return new _Color3(0, 1, 1); + static get ShadersRepository() { + return ShaderStore.ShadersRepository; + } + static set ShadersRepository(repo) { + ShaderStore.ShadersRepository = repo; } /** - * Returns a Color3 value containing a random color - * @returns a new Color3 object + * Observable that will be called when effect is bound. */ - static Random() { - return new _Color3(Math.random(), Math.random(), Math.random()); + get onBindObservable() { + if (!this._onBindObservable) { + this._onBindObservable = new Observable(); + } + return this._onBindObservable; } -}; -Color3._BlackReadOnly = Color3.Black(); -Object.defineProperties(Color3.prototype, { - dimension: { value: [3] }, - rank: { value: 1 } -}); -var Color4 = class _Color4 { /** - * Creates a new Color4 object from red, green, blue values, all between 0 and 1 - * @param r defines the red component (between 0 and 1, default is 0) - * @param g defines the green component (between 0 and 1, default is 0) - * @param b defines the blue component (between 0 and 1, default is 0) - * @param a defines the alpha component (between 0 and 1, default is 1) + * Gets the shader language type used to write vertex and fragment source code. */ - constructor(r = 0, g = 0, b = 0, a = 1) { - this.r = r; - this.g = g; - this.b = b; - this.a = a; + get shaderLanguage() { + return this._shaderLanguage; } - // Operators /** - * Creates a new array populated with 4 numeric elements : red, green, blue, alpha values - * @returns the new array + * Instantiates an effect. + * An effect can be used to create/manage/execute vertex and fragment shaders. + * @param baseName Name of the effect. + * @param attributesNamesOrOptions List of attribute names that will be passed to the shader or set of all options to create the effect. + * @param uniformsNamesOrEngine List of uniform variable names that will be passed to the shader or the engine that will be used to render effect. + * @param samplers List of sampler variables that will be passed to the shader. + * @param engine Engine to be used to render the effect + * @param defines Define statements to be added to the shader. + * @param fallbacks Possible fallbacks for this effect to improve performance when needed. + * @param onCompiled Callback that will be called when the shader is compiled. + * @param onError Callback that will be called if an error occurs during shader compilation. + * @param indexParameters Parameters to be used with Babylons include syntax to iterate over an array (eg. \{lights: 10\}) + * @param key Effect Key identifying uniquely compiled shader variants + * @param shaderLanguage the language the shader is written in (default: GLSL) */ - asArray() { - return [this.r, this.g, this.b, this.a]; + constructor(baseName, attributesNamesOrOptions, uniformsNamesOrEngine, samplers = null, engine, defines = null, fallbacks = null, onCompiled = null, onError = null, indexParameters, key = "", shaderLanguage = ShaderLanguage.GLSL) { + this.defines = ""; + this.onCompiled = null; + this.onError = null; + this.onBind = null; + this.uniqueId = 0; + this.onCompileObservable = new Observable(); + this.onErrorObservable = new Observable(); + this._onBindObservable = null; + this._isDisposed = false; + this._bonesComputationForcedToCPU = false; + this._uniformBuffersNames = {}; + this._multiTarget = false; + this._samplers = {}; + this._isReady = false; + this._compilationError = ""; + this._allFallbacksProcessed = false; + this._uniforms = {}; + this._key = ""; + this._fallbacks = null; + this._vertexSourceCodeOverride = ""; + this._fragmentSourceCodeOverride = ""; + this._transformFeedbackVaryings = null; + this._pipelineContext = null; + this._vertexSourceCode = ""; + this._fragmentSourceCode = ""; + this._vertexSourceCodeBeforeMigration = ""; + this._fragmentSourceCodeBeforeMigration = ""; + this._rawVertexSourceCode = ""; + this._rawFragmentSourceCode = ""; + this._processCodeAfterIncludes = void 0; + this._processFinalCode = null; + this.name = baseName; + this._key = key; + if (attributesNamesOrOptions.attributes) { + const options = attributesNamesOrOptions; + this._engine = uniformsNamesOrEngine; + this._attributesNames = options.attributes; + this._uniformsNames = options.uniformsNames.concat(options.samplers); + this._samplerList = options.samplers.slice(); + this.defines = options.defines; + this.onError = options.onError; + this.onCompiled = options.onCompiled; + this._fallbacks = options.fallbacks; + this._indexParameters = options.indexParameters; + this._transformFeedbackVaryings = options.transformFeedbackVaryings || null; + this._multiTarget = !!options.multiTarget; + this._shaderLanguage = options.shaderLanguage ?? ShaderLanguage.GLSL; + if (options.uniformBuffersNames) { + this._uniformBuffersNamesList = options.uniformBuffersNames.slice(); + for (let i = 0; i < options.uniformBuffersNames.length; i++) { + this._uniformBuffersNames[options.uniformBuffersNames[i]] = i; + } + } + this._processFinalCode = options.processFinalCode ?? null; + this._processCodeAfterIncludes = options.processCodeAfterIncludes ?? void 0; + } else { + this._engine = engine; + this.defines = defines == null ? "" : defines; + this._uniformsNames = uniformsNamesOrEngine.concat(samplers); + this._samplerList = samplers ? samplers.slice() : []; + this._attributesNames = attributesNamesOrOptions; + this._uniformBuffersNamesList = []; + this._shaderLanguage = shaderLanguage; + this.onError = onError; + this.onCompiled = onCompiled; + this._indexParameters = indexParameters; + this._fallbacks = fallbacks; + } + this._attributeLocationByName = {}; + this.uniqueId = _Effect._UniqueIdSeed++; + this._processShaderCode(); + } + /** @internal */ + _processShaderCode(shaderProcessor = null, keepExistingPipelineContext = false) { + let vertexSource; + let fragmentSource; + const baseName = this.name; + const hostDocument = IsWindowObjectExist() ? this._engine.getHostDocument() : null; + if (typeof baseName === "string") { + vertexSource = baseName; + } else if (baseName.vertexSource) { + vertexSource = "source:" + baseName.vertexSource; + } else if (baseName.vertexElement) { + vertexSource = (hostDocument == null ? void 0 : hostDocument.getElementById(baseName.vertexElement)) || baseName.vertexElement; + } else { + vertexSource = baseName.vertex || baseName; + } + if (typeof baseName === "string") { + fragmentSource = baseName; + } else if (baseName.fragmentSource) { + fragmentSource = "source:" + baseName.fragmentSource; + } else if (baseName.fragmentElement) { + fragmentSource = (hostDocument == null ? void 0 : hostDocument.getElementById(baseName.fragmentElement)) || baseName.fragmentElement; + } else { + fragmentSource = baseName.fragment || baseName; + } + this._processingContext = this._engine._getShaderProcessingContext(this._shaderLanguage); + let processorOptions = { + defines: this.defines.split("\n"), + indexParameters: this._indexParameters, + isFragment: false, + shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader, + processor: shaderProcessor ?? this._engine._getShaderProcessor(this._shaderLanguage), + supportsUniformBuffers: this._engine.supportsUniformBuffers, + shadersRepository: ShaderStore.GetShadersRepository(this._shaderLanguage), + includesShadersStore: ShaderStore.GetIncludesShadersStore(this._shaderLanguage), + version: (this._engine.version * 100).toString(), + platformName: this._engine.shaderPlatformName, + processingContext: this._processingContext, + isNDCHalfZRange: this._engine.isNDCHalfZRange, + useReverseDepthBuffer: this._engine.useReverseDepthBuffer, + processCodeAfterIncludes: this._processCodeAfterIncludes + }; + const shaderCodes = [void 0, void 0]; + const shadersLoaded = () => { + if (shaderCodes[0] && shaderCodes[1]) { + processorOptions.isFragment = true; + const [migratedVertexCode, fragmentCode] = shaderCodes; + ShaderProcessor.Process(fragmentCode, processorOptions, (migratedFragmentCode, codeBeforeMigration) => { + this._fragmentSourceCodeBeforeMigration = codeBeforeMigration; + if (this._processFinalCode) { + migratedFragmentCode = this._processFinalCode("fragment", migratedFragmentCode); + } + const finalShaders = ShaderProcessor.Finalize(migratedVertexCode, migratedFragmentCode, processorOptions); + processorOptions = null; + this._useFinalCode(finalShaders.vertexCode, finalShaders.fragmentCode, baseName, keepExistingPipelineContext); + }, this._engine); + } + }; + this._loadShader(vertexSource, "Vertex", "", (vertexCode) => { + ShaderProcessor.Initialize(processorOptions); + ShaderProcessor.Process(vertexCode, processorOptions, (migratedVertexCode, codeBeforeMigration) => { + this._rawVertexSourceCode = vertexCode; + this._vertexSourceCodeBeforeMigration = codeBeforeMigration; + if (this._processFinalCode) { + migratedVertexCode = this._processFinalCode("vertex", migratedVertexCode); + } + shaderCodes[0] = migratedVertexCode; + shadersLoaded(); + }, this._engine); + }); + this._loadShader(fragmentSource, "Fragment", "Pixel", (fragmentCode) => { + this._rawFragmentSourceCode = fragmentCode; + shaderCodes[1] = fragmentCode; + shadersLoaded(); + }); + } + _useFinalCode(migratedVertexCode, migratedFragmentCode, baseName, keepExistingPipelineContext = false) { + if (baseName) { + const vertex = baseName.vertexElement || baseName.vertex || baseName.spectorName || baseName; + const fragment = baseName.fragmentElement || baseName.fragment || baseName.spectorName || baseName; + this._vertexSourceCode = (this._shaderLanguage === ShaderLanguage.WGSL ? "//" : "") + "#define SHADER_NAME vertex:" + vertex + "\n" + migratedVertexCode; + this._fragmentSourceCode = (this._shaderLanguage === ShaderLanguage.WGSL ? "//" : "") + "#define SHADER_NAME fragment:" + fragment + "\n" + migratedFragmentCode; + } else { + this._vertexSourceCode = migratedVertexCode; + this._fragmentSourceCode = migratedFragmentCode; + } + this._prepareEffect(keepExistingPipelineContext); } /** - * Stores from the starting index in the given array the Color4 successive values - * @param array defines the array where to store the r,g,b components - * @param index defines an optional index in the target array to define where to start storing values - * @returns the current Color4 object + * Unique key for this effect */ - toArray(array, index = 0) { - array[index] = this.r; - array[index + 1] = this.g; - array[index + 2] = this.b; - array[index + 3] = this.a; - return this; + get key() { + return this._key; } /** - * Update the current color with values stored in an array from the starting index of the given array - * @param array defines the source array - * @param offset defines an offset in the source array - * @returns the current Color4 object + * If the effect has been compiled and prepared. + * @returns if the effect is compiled and prepared. */ - fromArray(array, offset = 0) { - this.r = array[offset]; - this.g = array[offset + 1]; - this.b = array[offset + 2]; - this.a = array[offset + 3]; - return this; + isReady() { + try { + return this._isReadyInternal(); + } catch { + return false; + } + } + _isReadyInternal() { + if (this._isReady) { + return true; + } + if (this._pipelineContext) { + return this._pipelineContext.isReady; + } + return false; } /** - * Determines equality between Color4 objects - * @param otherColor defines the second operand - * @returns true if the rgba values are equal to the given ones + * The engine the effect was initialized with. + * @returns the engine. */ - equals(otherColor) { - return otherColor && this.r === otherColor.r && this.g === otherColor.g && this.b === otherColor.b && this.a === otherColor.a; + getEngine() { + return this._engine; } /** - * Creates a new Color4 set with the added values of the current Color4 and of the given one - * @param otherColor defines the second operand - * @returns a new Color4 object + * The pipeline context for this effect + * @returns the associated pipeline context */ - add(otherColor) { - return new this.constructor(this.r + otherColor.r, this.g + otherColor.g, this.b + otherColor.b, this.a + otherColor.a); + getPipelineContext() { + return this._pipelineContext; } /** - * Updates the given color "result" with the result of the addition of the current Color4 and the given one. - * @param otherColor the color to add - * @param result the color to store the result - * @returns result input + * The set of names of attribute variables for the shader. + * @returns An array of attribute names. */ - addToRef(otherColor, result) { - result.r = this.r + otherColor.r; - result.g = this.g + otherColor.g; - result.b = this.b + otherColor.b; - result.a = this.a + otherColor.a; - return result; + getAttributesNames() { + return this._attributesNames; } /** - * Adds in place the given Color4 values to the current Color4 object - * @param otherColor defines the second operand - * @returns the current updated Color4 object + * Returns the attribute at the given index. + * @param index The index of the attribute. + * @returns The location of the attribute. */ - addInPlace(otherColor) { - this.r += otherColor.r; - this.g += otherColor.g; - this.b += otherColor.b; - this.a += otherColor.a; - return this; + getAttributeLocation(index) { + return this._attributes[index]; } /** - * Adds the given coordinates to the current Color4 - * @param r defines the r coordinate of the operand - * @param g defines the g coordinate of the operand - * @param b defines the b coordinate of the operand - * @param a defines the a coordinate of the operand - * @returns the current updated Color4 + * Returns the attribute based on the name of the variable. + * @param name of the attribute to look up. + * @returns the attribute location. */ - addInPlaceFromFloats(r, g, b, a) { - this.r += r; - this.g += g; - this.b += b; - this.a += a; - return this; + getAttributeLocationByName(name69) { + return this._attributeLocationByName[name69]; } /** - * Creates a new Color4 set with the subtracted values of the given one from the current Color4 - * @param otherColor defines the second operand - * @returns a new Color4 object + * The number of attributes. + * @returns the number of attributes. */ - subtract(otherColor) { - return new this.constructor(this.r - otherColor.r, this.g - otherColor.g, this.b - otherColor.b, this.a - otherColor.a); + getAttributesCount() { + return this._attributes.length; } /** - * Subtracts the given ones from the current Color4 values and stores the results in "result" - * @param otherColor defines the second operand - * @param result defines the Color4 object where to store the result - * @returns the result Color4 object + * Gets the index of a uniform variable. + * @param uniformName of the uniform to look up. + * @returns the index. */ - subtractToRef(otherColor, result) { - result.r = this.r - otherColor.r; - result.g = this.g - otherColor.g; - result.b = this.b - otherColor.b; - result.a = this.a - otherColor.a; - return result; + getUniformIndex(uniformName) { + return this._uniformsNames.indexOf(uniformName); } /** - * Subtract in place the given color from the current Color4. - * @param otherColor the color to subtract - * @returns the updated Color4. + * Returns the attribute based on the name of the variable. + * @param uniformName of the uniform to look up. + * @returns the location of the uniform. */ - subtractInPlace(otherColor) { - this.r -= otherColor.r; - this.g -= otherColor.g; - this.b -= otherColor.b; - this.a -= otherColor.a; - return this; + getUniform(uniformName) { + return this._uniforms[uniformName]; } /** - * Returns a new Color4 set with the result of the subtraction of the given floats from the current Color4 coordinates. - * @param r value to subtract - * @param g value to subtract - * @param b value to subtract - * @param a value to subtract - * @returns new color containing the result + * Returns an array of sampler variable names + * @returns The array of sampler variable names. */ - subtractFromFloats(r, g, b, a) { - return new this.constructor(this.r - r, this.g - g, this.b - b, this.a - a); + getSamplers() { + return this._samplerList; } /** - * Sets the given color "result" set with the result of the subtraction of the given floats from the current Color4 coordinates. - * @param r value to subtract - * @param g value to subtract - * @param b value to subtract - * @param a value to subtract - * @param result the color to store the result in - * @returns result input + * Returns an array of uniform variable names + * @returns The array of uniform variable names. */ - subtractFromFloatsToRef(r, g, b, a, result) { - result.r = this.r - r; - result.g = this.g - g; - result.b = this.b - b; - result.a = this.a - a; - return result; + getUniformNames() { + return this._uniformsNames; } /** - * Creates a new Color4 with the current Color4 values multiplied by scale - * @param scale defines the scaling factor to apply - * @returns a new Color4 object + * Returns an array of uniform buffer variable names + * @returns The array of uniform buffer variable names. */ - scale(scale) { - return new this.constructor(this.r * scale, this.g * scale, this.b * scale, this.a * scale); + getUniformBuffersNames() { + return this._uniformBuffersNamesList; } /** - * Multiplies the Color4 values by the float "scale" - * @param scale defines the scaling factor to apply - * @returns the current updated Color4 + * Returns the index parameters used to create the effect + * @returns The index parameters object */ - scaleInPlace(scale) { - this.r *= scale; - this.g *= scale; - this.b *= scale; - this.a *= scale; - return this; + getIndexParameters() { + return this._indexParameters; } /** - * Multiplies the current Color4 values by scale and stores the result in "result" - * @param scale defines the scaling factor to apply - * @param result defines the Color4 object where to store the result - * @returns the result Color4 + * The error from the last compilation. + * @returns the error string. */ - scaleToRef(scale, result) { - result.r = this.r * scale; - result.g = this.g * scale; - result.b = this.b * scale; - result.a = this.a * scale; - return result; + getCompilationError() { + return this._compilationError; } /** - * Scale the current Color4 values by a factor and add the result to a given Color4 - * @param scale defines the scale factor - * @param result defines the Color4 object where to store the result - * @returns the result Color4 + * Gets a boolean indicating that all fallbacks were used during compilation + * @returns true if all fallbacks were used */ - scaleAndAddToRef(scale, result) { - result.r += this.r * scale; - result.g += this.g * scale; - result.b += this.b * scale; - result.a += this.a * scale; - return result; + allFallbacksProcessed() { + return this._allFallbacksProcessed; } /** - * Clamps the rgb values by the min and max values and stores the result into "result" - * @param min defines minimum clamping value (default is 0) - * @param max defines maximum clamping value (default is 1) - * @param result defines color to store the result into. - * @returns the result Color4 + * Adds a callback to the onCompiled observable and call the callback immediately if already ready. + * @param func The callback to be used. */ - clampToRef(min = 0, max = 1, result) { - result.r = Clamp(this.r, min, max); - result.g = Clamp(this.g, min, max); - result.b = Clamp(this.b, min, max); - result.a = Clamp(this.a, min, max); - return result; + executeWhenCompiled(func) { + if (this.isReady()) { + func(this); + return; + } + this.onCompileObservable.add((effect) => { + func(effect); + }); + if (!this._pipelineContext || this._pipelineContext.isAsync) { + setTimeout(() => { + this._checkIsReady(null); + }, 16); + } + } + _checkIsReady(previousPipelineContext) { + try { + if (this._isReadyInternal()) { + return; + } + } catch (e) { + this._processCompilationErrors(e, previousPipelineContext); + return; + } + if (this._isDisposed) { + return; + } + setTimeout(() => { + this._checkIsReady(previousPipelineContext); + }, 16); + } + _loadShader(shader69, key, optionalKey, callback) { + if (typeof HTMLElement !== "undefined") { + if (shader69 instanceof HTMLElement) { + const shaderCode = GetDOMTextContent(shader69); + callback(shaderCode); + return; + } + } + if (shader69.substr(0, 7) === "source:") { + callback(shader69.substr(7)); + return; + } + if (shader69.substr(0, 7) === "base64:") { + const shaderBinary = window.atob(shader69.substr(7)); + callback(shaderBinary); + return; + } + const shaderStore = ShaderStore.GetShadersStore(this._shaderLanguage); + if (shaderStore[shader69 + key + "Shader"]) { + callback(shaderStore[shader69 + key + "Shader"]); + return; + } + if (optionalKey && shaderStore[shader69 + optionalKey + "Shader"]) { + callback(shaderStore[shader69 + optionalKey + "Shader"]); + return; + } + let shaderUrl; + if (shader69[0] === "." || shader69[0] === "/" || shader69.indexOf("http") > -1) { + shaderUrl = shader69; + } else { + shaderUrl = ShaderStore.GetShadersRepository(this._shaderLanguage) + shader69; + } + this._engine._loadFile(shaderUrl + "." + key.toLowerCase() + ".fx", callback); } /** - * Multiply an Color4 value by another and return a new Color4 object - * @param color defines the Color4 value to multiply by - * @returns a new Color4 object + * Gets the vertex shader source code of this effect + * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc) */ - multiply(color) { - return new this.constructor(this.r * color.r, this.g * color.g, this.b * color.b, this.a * color.a); + get vertexSourceCode() { + var _a; + return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride ? this._vertexSourceCodeOverride : ((_a = this._pipelineContext) == null ? void 0 : _a._getVertexShaderCode()) ?? this._vertexSourceCode; } /** - * Multiply a Color4 value by another and push the result in a reference value - * @param color defines the Color4 value to multiply by - * @param result defines the Color4 to fill the result in - * @returns the result Color4 + * Gets the fragment shader source code of this effect + * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc) */ - multiplyToRef(color, result) { - result.r = this.r * color.r; - result.g = this.g * color.g; - result.b = this.b * color.b; - result.a = this.a * color.a; - return result; + get fragmentSourceCode() { + var _a; + return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride ? this._fragmentSourceCodeOverride : ((_a = this._pipelineContext) == null ? void 0 : _a._getFragmentShaderCode()) ?? this._fragmentSourceCode; } /** - * Multiplies in place the current Color4 by the given one. - * @param otherColor color to multiple with - * @returns the updated Color4. + * Gets the vertex shader source code before migration. + * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed. + * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL). */ - multiplyInPlace(otherColor) { - this.r *= otherColor.r; - this.g *= otherColor.g; - this.b *= otherColor.b; - this.a *= otherColor.a; - return this; + get vertexSourceCodeBeforeMigration() { + return this._vertexSourceCodeBeforeMigration; } /** - * Returns a new Color4 set with the multiplication result of the given floats and the current Color4 coordinates. - * @param r value multiply with - * @param g value multiply with - * @param b value multiply with - * @param a value multiply with - * @returns resulting new color + * Gets the fragment shader source code before migration. + * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed. + * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL). */ - multiplyByFloats(r, g, b, a) { - return new this.constructor(this.r * r, this.g * g, this.b * b, this.a * a); + get fragmentSourceCodeBeforeMigration() { + return this._fragmentSourceCodeBeforeMigration; } /** - * @internal - * Do not use + * Gets the vertex shader source code before it has been modified by any processing */ - divide(_other) { - throw new ReferenceError("Can not divide a color"); + get rawVertexSourceCode() { + return this._rawVertexSourceCode; } /** - * @internal - * Do not use + * Gets the fragment shader source code before it has been modified by any processing */ - divideToRef(_other, _result) { - throw new ReferenceError("Can not divide a color"); + get rawFragmentSourceCode() { + return this._rawFragmentSourceCode; } /** + * Recompiles the webGL program + * @param vertexSourceCode The source code for the vertex shader. + * @param fragmentSourceCode The source code for the fragment shader. + * @param onCompiled Callback called when completed. + * @param onError Callback called on error. * @internal - * Do not use */ - divideInPlace(_other) { - throw new ReferenceError("Can not divide a color"); + _rebuildProgram(vertexSourceCode, fragmentSourceCode, onCompiled, onError) { + this._isReady = false; + this._vertexSourceCodeOverride = vertexSourceCode; + this._fragmentSourceCodeOverride = fragmentSourceCode; + this.onError = (effect, error) => { + if (onError) { + onError(error); + } + }; + this.onCompiled = () => { + var _a, _b; + const scenes = this.getEngine().scenes; + if (scenes) { + for (let i = 0; i < scenes.length; i++) { + scenes[i].markAllMaterialsAsDirty(63); + } + } + (_b = (_a = this._pipelineContext)._handlesSpectorRebuildCallback) == null ? void 0 : _b.call(_a, onCompiled); + }; + this._fallbacks = null; + this._prepareEffect(); } /** - * Updates the Color4 coordinates with the minimum values between its own and the given color ones - * @param other defines the second operand - * @returns the current updated Color4 + * Prepares the effect + * @internal */ - minimizeInPlace(other) { - this.r = Math.min(this.r, other.r); - this.g = Math.min(this.g, other.g); - this.b = Math.min(this.b, other.b); - this.a = Math.min(this.a, other.a); - return this; + _prepareEffect(keepExistingPipelineContext = false) { + const attributesNames = this._attributesNames; + const defines = this.defines; + const previousPipelineContext = this._pipelineContext; + this._isReady = false; + try { + const engine = this._engine; + this._pipelineContext = (keepExistingPipelineContext ? previousPipelineContext : void 0) ?? engine.createPipelineContext(this._processingContext); + this._pipelineContext._name = this._key.replace(/\r/g, "").replace(/\n/g, "|"); + const rebuildRebind = (vertexSourceCode, fragmentSourceCode, onCompiled, onError) => this._rebuildProgram(vertexSourceCode, fragmentSourceCode, onCompiled, onError); + if (this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride) { + engine._preparePipelineContext(this._pipelineContext, this._vertexSourceCodeOverride, this._fragmentSourceCodeOverride, true, this._rawVertexSourceCode, this._rawFragmentSourceCode, rebuildRebind, null, this._transformFeedbackVaryings, this._key); + } else { + engine._preparePipelineContext(this._pipelineContext, this._vertexSourceCode, this._fragmentSourceCode, false, this._rawVertexSourceCode, this._rawFragmentSourceCode, rebuildRebind, defines, this._transformFeedbackVaryings, this._key); + } + engine._executeWhenRenderingStateIsCompiled(this._pipelineContext, () => { + this._attributes = []; + this._pipelineContext._fillEffectInformation(this, this._uniformBuffersNames, this._uniformsNames, this._uniforms, this._samplerList, this._samplers, attributesNames, this._attributes); + if (attributesNames) { + for (let i = 0; i < attributesNames.length; i++) { + const name69 = attributesNames[i]; + this._attributeLocationByName[name69] = this._attributes[i]; + } + } + engine.bindSamplers(this); + this._compilationError = ""; + this._isReady = true; + if (this.onCompiled) { + this.onCompiled(this); + } + this.onCompileObservable.notifyObservers(this); + this.onCompileObservable.clear(); + if (this._fallbacks) { + this._fallbacks.unBindMesh(); + } + if (previousPipelineContext && !keepExistingPipelineContext) { + this.getEngine()._deletePipelineContext(previousPipelineContext); + } + }); + if (this._pipelineContext.isAsync) { + this._checkIsReady(previousPipelineContext); + } + } catch (e) { + this._processCompilationErrors(e, previousPipelineContext); + } } - /** - * Updates the Color4 coordinates with the maximum values between its own and the given color ones - * @param other defines the second operand - * @returns the current updated Color4 - */ - maximizeInPlace(other) { - this.r = Math.max(this.r, other.r); - this.g = Math.max(this.g, other.g); - this.b = Math.max(this.b, other.b); - this.a = Math.max(this.a, other.a); - return this; + _getShaderCodeAndErrorLine(code, error, isFragment) { + const regexp = isFragment ? /FRAGMENT SHADER ERROR: 0:(\d+?):/ : /VERTEX SHADER ERROR: 0:(\d+?):/; + let errorLine = null; + if (error && code) { + const res = error.match(regexp); + if (res && res.length === 2) { + const lineNumber = parseInt(res[1]); + const lines = code.split("\n", -1); + if (lines.length >= lineNumber) { + errorLine = `Offending line [${lineNumber}] in ${isFragment ? "fragment" : "vertex"} code: ${lines[lineNumber - 1]}`; + } + } + } + return [code, errorLine]; } - /** - * Updates the current Color4 with the minimal coordinate values between its and the given coordinates - * @param r defines the r coordinate of the operand - * @param g defines the g coordinate of the operand - * @param b defines the b coordinate of the operand - * @param a defines the a coordinate of the operand - * @returns the current updated Color4 - */ - minimizeInPlaceFromFloats(r, g, b, a) { - this.r = Math.min(r, this.r); - this.g = Math.min(g, this.g); - this.b = Math.min(b, this.b); - this.a = Math.min(a, this.a); - return this; + _processCompilationErrors(e, previousPipelineContext = null) { + var _a, _b, _c; + this._compilationError = e.message; + const attributesNames = this._attributesNames; + const fallbacks = this._fallbacks; + Logger.Error("Unable to compile effect:"); + Logger.Error("Uniforms: " + this._uniformsNames.map(function(uniform) { + return " " + uniform; + })); + Logger.Error("Attributes: " + attributesNames.map(function(attribute) { + return " " + attribute; + })); + Logger.Error("Defines:\n" + this.defines); + if (_Effect.LogShaderCodeOnCompilationError) { + let lineErrorVertex = null, lineErrorFragment = null, code = null; + if ((_a = this._pipelineContext) == null ? void 0 : _a._getVertexShaderCode()) { + [code, lineErrorVertex] = this._getShaderCodeAndErrorLine(this._pipelineContext._getVertexShaderCode(), this._compilationError, false); + if (code) { + Logger.Error("Vertex code:"); + Logger.Error(code); + } + } + if ((_b = this._pipelineContext) == null ? void 0 : _b._getFragmentShaderCode()) { + [code, lineErrorFragment] = this._getShaderCodeAndErrorLine((_c = this._pipelineContext) == null ? void 0 : _c._getFragmentShaderCode(), this._compilationError, true); + if (code) { + Logger.Error("Fragment code:"); + Logger.Error(code); + } + } + if (lineErrorVertex) { + Logger.Error(lineErrorVertex); + } + if (lineErrorFragment) { + Logger.Error(lineErrorFragment); + } + } + Logger.Error("Error: " + this._compilationError); + const notifyErrors = () => { + if (this.onError) { + this.onError(this, this._compilationError); + } + this.onErrorObservable.notifyObservers(this); + }; + if (previousPipelineContext) { + this._pipelineContext = previousPipelineContext; + this._isReady = true; + notifyErrors(); + } + if (fallbacks) { + this._pipelineContext = null; + if (fallbacks.hasMoreFallbacks) { + this._allFallbacksProcessed = false; + Logger.Error("Trying next fallback."); + this.defines = fallbacks.reduce(this.defines, this); + this._prepareEffect(); + } else { + this._allFallbacksProcessed = true; + notifyErrors(); + this.onErrorObservable.clear(); + if (this._fallbacks) { + this._fallbacks.unBindMesh(); + } + } + } else { + this._allFallbacksProcessed = true; + if (!previousPipelineContext) { + notifyErrors(); + } + } } /** - * Updates the current Color4 with the maximal coordinate values between its and the given coordinates. - * @param r defines the r coordinate of the operand - * @param g defines the g coordinate of the operand - * @param b defines the b coordinate of the operand - * @param a defines the a coordinate of the operand - * @returns the current updated Color4 + * Checks if the effect is supported. (Must be called after compilation) */ - maximizeInPlaceFromFloats(r, g, b, a) { - this.r = Math.max(r, this.r); - this.g = Math.max(g, this.g); - this.b = Math.max(b, this.b); - this.a = Math.max(a, this.a); - return this; + get isSupported() { + return this._compilationError === ""; } /** + * Binds a texture to the engine to be used as output of the shader. + * @param channel Name of the output variable. + * @param texture Texture to bind. * @internal - * Do not use */ - floorToRef(_result) { - throw new ReferenceError("Can not floor a color"); + _bindTexture(channel, texture) { + this._engine._bindTexture(this._samplers[channel], texture, channel); } /** - * @internal - * Do not use + * Sets a texture on the engine to be used in the shader. + * @param channel Name of the sampler variable. + * @param texture Texture to set. */ - floor() { - throw new ReferenceError("Can not floor a color"); + setTexture(channel, texture) { + this._engine.setTexture(this._samplers[channel], this._uniforms[channel], texture, channel); } /** - * @internal - * Do not use + * Sets a depth stencil texture from a render target on the engine to be used in the shader. + * @param channel Name of the sampler variable. + * @param texture Texture to set. */ - fractToRef(_result) { - throw new ReferenceError("Can not fract a color"); + setDepthStencilTexture(channel, texture) { + this._engine.setDepthStencilTexture(this._samplers[channel], this._uniforms[channel], texture, channel); } /** - * @internal - * Do not use + * Sets an array of textures on the engine to be used in the shader. + * @param channel Name of the variable. + * @param textures Textures to set. */ - fract() { - throw new ReferenceError("Can not fract a color"); + setTextureArray(channel, textures) { + const exName = channel + "Ex"; + if (this._samplerList.indexOf(exName + "0") === -1) { + const initialPos = this._samplerList.indexOf(channel); + for (let index = 1; index < textures.length; index++) { + const currentExName = exName + (index - 1).toString(); + this._samplerList.splice(initialPos + index, 0, currentExName); + } + let channelIndex = 0; + for (const key of this._samplerList) { + this._samplers[key] = channelIndex; + channelIndex += 1; + } + } + this._engine.setTextureArray(this._samplers[channel], this._uniforms[channel], textures, channel); } /** - * @internal - * Do not use + * Sets a texture to be the input of the specified post process. (To use the output, pass in the next post process in the pipeline) + * @param channel Name of the sampler variable. + * @param postProcess Post process to get the input texture from. */ - negate() { - throw new ReferenceError("Can not negate a color"); + setTextureFromPostProcess(channel, postProcess) { + this._engine.setTextureFromPostProcess(this._samplers[channel], postProcess, channel); } /** - * @internal - * Do not use + * (Warning! setTextureFromPostProcessOutput may be desired instead) + * Sets the input texture of the passed in post process to be input of this effect. (To use the output of the passed in post process use setTextureFromPostProcessOutput) + * @param channel Name of the sampler variable. + * @param postProcess Post process to get the output texture from. */ - negateInPlace() { - throw new ReferenceError("Can not negate a color"); + setTextureFromPostProcessOutput(channel, postProcess) { + this._engine.setTextureFromPostProcessOutput(this._samplers[channel], postProcess, channel); } /** - * @internal - * Do not use + * Binds a buffer to a uniform. + * @param buffer Buffer to bind. + * @param name Name of the uniform variable to bind to. */ - negateToRef(_result) { - throw new ReferenceError("Can not negate a color"); + bindUniformBuffer(buffer, name69) { + const bufferName = this._uniformBuffersNames[name69]; + if (bufferName === void 0 || _Effect._BaseCache[bufferName] === buffer && this._engine._features.useUBOBindingCache) { + return; + } + _Effect._BaseCache[bufferName] = buffer; + this._engine.bindUniformBufferBase(buffer, bufferName, name69); } /** - * Boolean : True if the current Color4 coordinates are each beneath the distance "epsilon" from the given color ones. - * @param otherColor color to compare against - * @param epsilon (Default: very small number) - * @returns true if they are equal + * Binds block to a uniform. + * @param blockName Name of the block to bind. + * @param index Index to bind. */ - equalsWithEpsilon(otherColor, epsilon = Epsilon) { - return Scalar.WithinEpsilon(this.r, otherColor.r, epsilon) && Scalar.WithinEpsilon(this.g, otherColor.g, epsilon) && Scalar.WithinEpsilon(this.b, otherColor.b, epsilon) && Scalar.WithinEpsilon(this.a, otherColor.a, epsilon); + bindUniformBlock(blockName, index) { + this._engine.bindUniformBlock(this._pipelineContext, blockName, index); } /** - * Boolean : True if the given floats are strictly equal to the current Color4 coordinates. - * @param x x value to compare against - * @param y y value to compare against - * @param z z value to compare against - * @param w w value to compare against - * @returns true if equal + * Sets an integer value on a uniform variable. + * @param uniformName Name of the variable. + * @param value Value to be set. + * @returns this effect. */ - equalsToFloats(x, y, z, w) { - return this.r === x && this.g === y && this.b === z && this.a === w; + setInt(uniformName, value) { + this._pipelineContext.setInt(uniformName, value); + return this; } /** - * Creates a string with the Color4 current values - * @returns the string representation of the Color4 object + * Sets an int2 value on a uniform variable. + * @param uniformName Name of the variable. + * @param x First int in int2. + * @param y Second int in int2. + * @returns this effect. */ - toString() { - return "{R: " + this.r + " G:" + this.g + " B:" + this.b + " A:" + this.a + "}"; + setInt2(uniformName, x, y) { + this._pipelineContext.setInt2(uniformName, x, y); + return this; } /** - * Returns the string "Color4" - * @returns "Color4" + * Sets an int3 value on a uniform variable. + * @param uniformName Name of the variable. + * @param x First int in int3. + * @param y Second int in int3. + * @param z Third int in int3. + * @returns this effect. */ - getClassName() { - return "Color4"; + setInt3(uniformName, x, y, z) { + this._pipelineContext.setInt3(uniformName, x, y, z); + return this; } /** - * Compute the Color4 hash code - * @returns an unique number that can be used to hash Color4 objects + * Sets an int4 value on a uniform variable. + * @param uniformName Name of the variable. + * @param x First int in int4. + * @param y Second int in int4. + * @param z Third int in int4. + * @param w Fourth int in int4. + * @returns this effect. */ - getHashCode() { - let hash = this.r * 255 | 0; - hash = hash * 397 ^ (this.g * 255 | 0); - hash = hash * 397 ^ (this.b * 255 | 0); - hash = hash * 397 ^ (this.a * 255 | 0); - return hash; + setInt4(uniformName, x, y, z, w) { + this._pipelineContext.setInt4(uniformName, x, y, z, w); + return this; } /** - * Creates a new Color4 copied from the current one - * @returns a new Color4 object + * Sets an int array on a uniform variable. + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - clone() { - const result = new this.constructor(); - return result.copyFrom(this); + setIntArray(uniformName, array) { + this._pipelineContext.setIntArray(uniformName, array); + return this; } /** - * Copies the given Color4 values into the current one - * @param source defines the source Color4 object - * @returns the current updated Color4 object + * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - copyFrom(source) { - this.r = source.r; - this.g = source.g; - this.b = source.b; - this.a = source.a; + setIntArray2(uniformName, array) { + this._pipelineContext.setIntArray2(uniformName, array); return this; } /** - * Copies the given float values into the current one - * @param r defines the red component to read from - * @param g defines the green component to read from - * @param b defines the blue component to read from - * @param a defines the alpha component to read from - * @returns the current updated Color4 object + * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - copyFromFloats(r, g, b, a) { - this.r = r; - this.g = g; - this.b = b; - this.a = a; + setIntArray3(uniformName, array) { + this._pipelineContext.setIntArray3(uniformName, array); return this; } /** - * Copies the given float values into the current one - * @param r defines the red component to read from - * @param g defines the green component to read from - * @param b defines the blue component to read from - * @param a defines the alpha component to read from - * @returns the current updated Color4 object + * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - set(r, g, b, a) { - return this.copyFromFloats(r, g, b, a); + setIntArray4(uniformName, array) { + this._pipelineContext.setIntArray4(uniformName, array); + return this; } /** - * Copies the given float to the current Vector4 coordinates - * @param v defines the r, g, b, and a coordinates of the operand - * @returns the current updated Vector4 + * Sets an unsigned integer value on a uniform variable. + * @param uniformName Name of the variable. + * @param value Value to be set. + * @returns this effect. */ - setAll(v) { - this.r = this.g = this.b = this.a = v; + setUInt(uniformName, value) { + this._pipelineContext.setUInt(uniformName, value); return this; } /** - * Compute the Color4 hexadecimal code as a string - * @param returnAsColor3 defines if the string should only contains RGB values (off by default) - * @returns a string containing the hexadecimal representation of the Color4 object + * Sets an unsigned int2 value on a uniform variable. + * @param uniformName Name of the variable. + * @param x First unsigned int in uint2. + * @param y Second unsigned int in uint2. + * @returns this effect. */ - toHexString(returnAsColor3 = false) { - const intR = Math.round(this.r * 255); - const intG = Math.round(this.g * 255); - const intB = Math.round(this.b * 255); - if (returnAsColor3) { - return "#" + ToHex(intR) + ToHex(intG) + ToHex(intB); - } - const intA = Math.round(this.a * 255); - return "#" + ToHex(intR) + ToHex(intG) + ToHex(intB) + ToHex(intA); + setUInt2(uniformName, x, y) { + this._pipelineContext.setUInt2(uniformName, x, y); + return this; } /** - * Computes a new Color4 converted from the current one to linear space - * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) - * @returns a new Color4 object + * Sets an unsigned int3 value on a uniform variable. + * @param uniformName Name of the variable. + * @param x First unsigned int in uint3. + * @param y Second unsigned int in uint3. + * @param z Third unsigned int in uint3. + * @returns this effect. */ - toLinearSpace(exact = false) { - const convertedColor = new _Color4(); - this.toLinearSpaceToRef(convertedColor, exact); - return convertedColor; + setUInt3(uniformName, x, y, z) { + this._pipelineContext.setUInt3(uniformName, x, y, z); + return this; } /** - * Converts the Color4 values to linear space and stores the result in "convertedColor" - * @param convertedColor defines the Color4 object where to store the linear space version - * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) - * @returns the unmodified Color4 + * Sets an unsigned int4 value on a uniform variable. + * @param uniformName Name of the variable. + * @param x First unsigned int in uint4. + * @param y Second unsigned int in uint4. + * @param z Third unsigned int in uint4. + * @param w Fourth unsigned int in uint4. + * @returns this effect. */ - toLinearSpaceToRef(convertedColor, exact = false) { - if (exact) { - convertedColor.r = colorChannelToLinearSpaceExact(this.r); - convertedColor.g = colorChannelToLinearSpaceExact(this.g); - convertedColor.b = colorChannelToLinearSpaceExact(this.b); - } else { - convertedColor.r = colorChannelToLinearSpace(this.r); - convertedColor.g = colorChannelToLinearSpace(this.g); - convertedColor.b = colorChannelToLinearSpace(this.b); - } - convertedColor.a = this.a; + setUInt4(uniformName, x, y, z, w) { + this._pipelineContext.setUInt4(uniformName, x, y, z, w); return this; } /** - * Computes a new Color4 converted from the current one to gamma space - * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) - * @returns a new Color4 object + * Sets an unsigned int array on a uniform variable. + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - toGammaSpace(exact = false) { - const convertedColor = new _Color4(); - this.toGammaSpaceToRef(convertedColor, exact); - return convertedColor; + setUIntArray(uniformName, array) { + this._pipelineContext.setUIntArray(uniformName, array); + return this; } /** - * Converts the Color4 values to gamma space and stores the result in "convertedColor" - * @param convertedColor defines the Color4 object where to store the gamma space version - * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) - * @returns the unmodified Color4 + * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - toGammaSpaceToRef(convertedColor, exact = false) { - if (exact) { - convertedColor.r = colorChannelToGammaSpaceExact(this.r); - convertedColor.g = colorChannelToGammaSpaceExact(this.g); - convertedColor.b = colorChannelToGammaSpaceExact(this.b); - } else { - convertedColor.r = colorChannelToGammaSpace(this.r); - convertedColor.g = colorChannelToGammaSpace(this.g); - convertedColor.b = colorChannelToGammaSpace(this.b); - } - convertedColor.a = this.a; + setUIntArray2(uniformName, array) { + this._pipelineContext.setUIntArray2(uniformName, array); return this; } - // Statics /** - * Creates a new Color4 from the string containing valid hexadecimal values. - * - * A valid hex string is either in the format #RRGGBB or #RRGGBBAA. - * - * When a hex string without alpha is passed, the resulting Color4 has - * its alpha value set to 1.0. - * - * An invalid string results in a Color with all its channels set to 0.0, - * i.e. "transparent black". - * - * @param hex defines a string containing valid hexadecimal values - * @returns a new Color4 object + * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - static FromHexString(hex) { - if (hex.substring(0, 1) !== "#" || hex.length !== 9 && hex.length !== 7) { - return new _Color4(0, 0, 0, 0); - } - const r = parseInt(hex.substring(1, 3), 16); - const g = parseInt(hex.substring(3, 5), 16); - const b = parseInt(hex.substring(5, 7), 16); - const a = hex.length === 9 ? parseInt(hex.substring(7, 9), 16) : 255; - return _Color4.FromInts(r, g, b, a); + setUIntArray3(uniformName, array) { + this._pipelineContext.setUIntArray3(uniformName, array); + return this; } /** - * Creates a new Color4 object set with the linearly interpolated values of "amount" between the left Color4 object and the right Color4 object - * @param left defines the start value - * @param right defines the end value - * @param amount defines the gradient factor - * @returns a new Color4 object + * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - static Lerp(left, right, amount) { - const result = new _Color4(0, 0, 0, 0); - _Color4.LerpToRef(left, right, amount, result); - return result; + setUIntArray4(uniformName, array) { + this._pipelineContext.setUIntArray4(uniformName, array); + return this; } /** - * Set the given "result" with the linearly interpolated values of "amount" between the left Color4 object and the right Color4 object - * @param left defines the start value - * @param right defines the end value - * @param amount defines the gradient factor - * @param result defines the Color4 object where to store data + * Sets an float array on a uniform variable. + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - static LerpToRef(left, right, amount, result) { - result.r = left.r + (right.r - left.r) * amount; - result.g = left.g + (right.g - left.g) * amount; - result.b = left.b + (right.b - left.b) * amount; - result.a = left.a + (right.a - left.a) * amount; + setFloatArray(uniformName, array) { + this._pipelineContext.setArray(uniformName, array); + return this; } /** - * Interpolate between two Color4 using Hermite interpolation - * @param value1 defines first Color4 - * @param tangent1 defines the incoming tangent - * @param value2 defines second Color4 - * @param tangent2 defines the outgoing tangent - * @param amount defines the target Color4 - * @returns the new interpolated Color4 + * Sets an float array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - static Hermite(value1, tangent1, value2, tangent2, amount) { - const squared = amount * amount; - const cubed = amount * squared; - const part1 = 2 * cubed - 3 * squared + 1; - const part2 = -2 * cubed + 3 * squared; - const part3 = cubed - 2 * squared + amount; - const part4 = cubed - squared; - const r = value1.r * part1 + value2.r * part2 + tangent1.r * part3 + tangent2.r * part4; - const g = value1.g * part1 + value2.g * part2 + tangent1.g * part3 + tangent2.g * part4; - const b = value1.b * part1 + value2.b * part2 + tangent1.b * part3 + tangent2.b * part4; - const a = value1.a * part1 + value2.a * part2 + tangent1.a * part3 + tangent2.a * part4; - return new _Color4(r, g, b, a); + setFloatArray2(uniformName, array) { + this._pipelineContext.setArray2(uniformName, array); + return this; } /** - * Returns a new Color4 which is the 1st derivative of the Hermite spline defined by the colors "value1", "value2", "tangent1", "tangent2". - * @param value1 defines the first control point - * @param tangent1 defines the first tangent - * @param value2 defines the second control point - * @param tangent2 defines the second tangent - * @param time define where the derivative must be done - * @returns 1st derivative + * Sets an float array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - static Hermite1stDerivative(value1, tangent1, value2, tangent2, time) { - const result = new _Color4(); - this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result); - return result; + setFloatArray3(uniformName, array) { + this._pipelineContext.setArray3(uniformName, array); + return this; } /** - * Update a Color4 with the 1st derivative of the Hermite spline defined by the colors "value1", "value2", "tangent1", "tangent2". - * @param value1 defines the first control point - * @param tangent1 defines the first tangent - * @param value2 defines the second control point - * @param tangent2 defines the second tangent - * @param time define where the derivative must be done - * @param result define where to store the derivative + * Sets an float array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - static Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result) { - const t2 = time * time; - result.r = (t2 - time) * 6 * value1.r + (3 * t2 - 4 * time + 1) * tangent1.r + (-t2 + time) * 6 * value2.r + (3 * t2 - 2 * time) * tangent2.r; - result.g = (t2 - time) * 6 * value1.g + (3 * t2 - 4 * time + 1) * tangent1.g + (-t2 + time) * 6 * value2.g + (3 * t2 - 2 * time) * tangent2.g; - result.b = (t2 - time) * 6 * value1.b + (3 * t2 - 4 * time + 1) * tangent1.b + (-t2 + time) * 6 * value2.b + (3 * t2 - 2 * time) * tangent2.b; - result.a = (t2 - time) * 6 * value1.a + (3 * t2 - 4 * time + 1) * tangent1.a + (-t2 + time) * 6 * value2.a + (3 * t2 - 2 * time) * tangent2.a; + setFloatArray4(uniformName, array) { + this._pipelineContext.setArray4(uniformName, array); + return this; } /** - * Creates a new Color4 from a Color3 and an alpha value - * @param color3 defines the source Color3 to read from - * @param alpha defines the alpha component (1.0 by default) - * @returns a new Color4 object + * Sets an array on a uniform variable. + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - static FromColor3(color3, alpha = 1) { - return new _Color4(color3.r, color3.g, color3.b, alpha); + setArray(uniformName, array) { + this._pipelineContext.setArray(uniformName, array); + return this; } /** - * Creates a new Color4 from the starting index element of the given array - * @param array defines the source array to read from - * @param offset defines the offset in the source array - * @returns a new Color4 object + * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - static FromArray(array, offset = 0) { - return new _Color4(array[offset], array[offset + 1], array[offset + 2], array[offset + 3]); + setArray2(uniformName, array) { + this._pipelineContext.setArray2(uniformName, array); + return this; } /** - * Creates a new Color4 from the starting index element of the given array - * @param array defines the source array to read from - * @param offset defines the offset in the source array - * @param result defines the target Color4 object + * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - static FromArrayToRef(array, offset = 0, result) { - result.r = array[offset]; - result.g = array[offset + 1]; - result.b = array[offset + 2]; - result.a = array[offset + 3]; + setArray3(uniformName, array) { + this._pipelineContext.setArray3(uniformName, array); + return this; } /** - * Creates a new Color3 from integer values (less than 256) - * @param r defines the red component to read from (value between 0 and 255) - * @param g defines the green component to read from (value between 0 and 255) - * @param b defines the blue component to read from (value between 0 and 255) - * @param a defines the alpha component to read from (value between 0 and 255) - * @returns a new Color3 object + * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + * @returns this effect. */ - static FromInts(r, g, b, a) { - return new _Color4(r / 255, g / 255, b / 255, a / 255); + setArray4(uniformName, array) { + this._pipelineContext.setArray4(uniformName, array); + return this; } /** - * Check the content of a given array and convert it to an array containing RGBA data - * If the original array was already containing count * 4 values then it is returned directly - * @param colors defines the array to check - * @param count defines the number of RGBA data to expect - * @returns an array containing count * 4 values (RGBA) + * Sets matrices on a uniform variable. + * @param uniformName Name of the variable. + * @param matrices matrices to be set. + * @returns this effect. */ - static CheckColors4(colors, count) { - if (colors.length === count * 3) { - const colors4 = []; - for (let index = 0; index < colors.length; index += 3) { - const newIndex = index / 3 * 4; - colors4[newIndex] = colors[index]; - colors4[newIndex + 1] = colors[index + 1]; - colors4[newIndex + 2] = colors[index + 2]; - colors4[newIndex + 3] = 1; - } - return colors4; - } - return colors; - } -}; -Object.defineProperties(Color4.prototype, { - dimension: { value: [4] }, - rank: { value: 1 } -}); -var TmpColors = class { -}; -TmpColors.Color3 = ArrayTools.BuildArray(3, Color3.Black); -TmpColors.Color4 = ArrayTools.BuildArray(3, () => new Color4(0, 0, 0, 0)); -RegisterClass("BABYLON.Color3", Color3); -RegisterClass("BABYLON.Color4", Color4); - -// node_modules/@babylonjs/core/Actions/actionEvent.js -var ActionEvent = class _ActionEvent { + setMatrices(uniformName, matrices) { + this._pipelineContext.setMatrices(uniformName, matrices); + return this; + } /** - * Creates a new ActionEvent - * @param source The mesh or sprite that triggered the action - * @param pointerX The X mouse cursor position at the time of the event - * @param pointerY The Y mouse cursor position at the time of the event - * @param meshUnderPointer The mesh that is currently pointed at (can be null) - * @param sourceEvent the original (browser) event that triggered the ActionEvent - * @param additionalData additional data for the event + * Sets matrix on a uniform variable. + * @param uniformName Name of the variable. + * @param matrix matrix to be set. + * @returns this effect. */ - constructor(source, pointerX, pointerY, meshUnderPointer, sourceEvent, additionalData) { - this.source = source; - this.pointerX = pointerX; - this.pointerY = pointerY; - this.meshUnderPointer = meshUnderPointer; - this.sourceEvent = sourceEvent; - this.additionalData = additionalData; + setMatrix(uniformName, matrix) { + this._pipelineContext.setMatrix(uniformName, matrix); + return this; } /** - * Helper function to auto-create an ActionEvent from a source mesh. - * @param source The source mesh that triggered the event - * @param evt The original (browser) event - * @param additionalData additional data for the event - * @returns the new ActionEvent + * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix) + * @param uniformName Name of the variable. + * @param matrix matrix to be set. + * @returns this effect. */ - static CreateNew(source, evt, additionalData) { - const scene = source.getScene(); - return new _ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer || source, evt, additionalData); + setMatrix3x3(uniformName, matrix) { + this._pipelineContext.setMatrix3x3(uniformName, matrix); + return this; } /** - * Helper function to auto-create an ActionEvent from a source sprite - * @param source The source sprite that triggered the event - * @param scene Scene associated with the sprite - * @param evt The original (browser) event - * @param additionalData additional data for the event - * @returns the new ActionEvent + * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix) + * @param uniformName Name of the variable. + * @param matrix matrix to be set. + * @returns this effect. */ - static CreateNewFromSprite(source, scene, evt, additionalData) { - return new _ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer, evt, additionalData); + setMatrix2x2(uniformName, matrix) { + this._pipelineContext.setMatrix2x2(uniformName, matrix); + return this; } /** - * Helper function to auto-create an ActionEvent from a scene. If triggered by a mesh use ActionEvent.CreateNew - * @param scene the scene where the event occurred - * @param evt The original (browser) event - * @returns the new ActionEvent + * Sets a float on a uniform variable. + * @param uniformName Name of the variable. + * @param value value to be set. + * @returns this effect. */ - static CreateNewFromScene(scene, evt) { - return new _ActionEvent(null, scene.pointerX, scene.pointerY, scene.meshUnderPointer, evt); + setFloat(uniformName, value) { + this._pipelineContext.setFloat(uniformName, value); + return this; } /** - * Helper function to auto-create an ActionEvent from a primitive - * @param prim defines the target primitive - * @param pointerPos defines the pointer position - * @param evt The original (browser) event - * @param additionalData additional data for the event - * @returns the new ActionEvent + * Sets a boolean on a uniform variable. + * @param uniformName Name of the variable. + * @param bool value to be set. + * @returns this effect. */ - static CreateNewFromPrimitive(prim, pointerPos, evt, additionalData) { - return new _ActionEvent(prim, pointerPos.x, pointerPos.y, null, evt, additionalData); - } -}; - -// node_modules/@babylonjs/core/Misc/logger.js -var Logger = class _Logger { - static _CheckLimit(message, limit) { - let entry = _Logger._LogLimitOutputs[message]; - if (!entry) { - entry = { limit, current: 1 }; - _Logger._LogLimitOutputs[message] = entry; - } else { - entry.current++; - } - return entry.current <= entry.limit; - } - static _GenerateLimitMessage(message, level = 1) { - const entry = _Logger._LogLimitOutputs[message]; - if (!entry || !_Logger.MessageLimitReached) { - return; - } - const type = this._Levels[level]; - if (entry.current === entry.limit) { - _Logger[type.name](_Logger.MessageLimitReached.replace(/%LIMIT%/g, "" + entry.limit).replace(/%TYPE%/g, type.name ?? "")); - } - } - static _AddLogEntry(entry) { - _Logger._LogCache = entry + _Logger._LogCache; - if (_Logger.OnNewCacheEntry) { - _Logger.OnNewCacheEntry(entry); - } + setBool(uniformName, bool) { + this._pipelineContext.setInt(uniformName, bool ? 1 : 0); + return this; } - static _FormatMessage(message) { - const padStr = (i) => i < 10 ? "0" + i : "" + i; - const date = /* @__PURE__ */ new Date(); - return "[" + padStr(date.getHours()) + ":" + padStr(date.getMinutes()) + ":" + padStr(date.getSeconds()) + "]: " + message; + /** + * Sets a Vector2 on a uniform variable. + * @param uniformName Name of the variable. + * @param vector2 vector2 to be set. + * @returns this effect. + */ + setVector2(uniformName, vector2) { + this._pipelineContext.setVector2(uniformName, vector2); + return this; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - static _LogDisabled(message, limit) { + /** + * Sets a float2 on a uniform variable. + * @param uniformName Name of the variable. + * @param x First float in float2. + * @param y Second float in float2. + * @returns this effect. + */ + setFloat2(uniformName, x, y) { + this._pipelineContext.setFloat2(uniformName, x, y); + return this; } - static _LogEnabled(level = 1, message, limit) { - const msg = Array.isArray(message) ? message[0] : message; - if (limit !== void 0 && !_Logger._CheckLimit(msg, limit)) { - return; - } - const formattedMessage = _Logger._FormatMessage(msg); - const type = this._Levels[level]; - const optionals = Array.isArray(message) ? message.slice(1) : []; - type.logFunc && type.logFunc("BJS - " + formattedMessage, ...optionals); - const entry = `
${formattedMessage}

`; - _Logger._AddLogEntry(entry); - _Logger._GenerateLimitMessage(msg, level); + /** + * Sets a Vector3 on a uniform variable. + * @param uniformName Name of the variable. + * @param vector3 Value to be set. + * @returns this effect. + */ + setVector3(uniformName, vector3) { + this._pipelineContext.setVector3(uniformName, vector3); + return this; } /** - * Gets current log cache (list of logs) + * Sets a float3 on a uniform variable. + * @param uniformName Name of the variable. + * @param x First float in float3. + * @param y Second float in float3. + * @param z Third float in float3. + * @returns this effect. */ - static get LogCache() { - return _Logger._LogCache; + setFloat3(uniformName, x, y, z) { + this._pipelineContext.setFloat3(uniformName, x, y, z); + return this; } /** - * Clears the log cache + * Sets a Vector4 on a uniform variable. + * @param uniformName Name of the variable. + * @param vector4 Value to be set. + * @returns this effect. */ - static ClearLogCache() { - _Logger._LogCache = ""; - _Logger._LogLimitOutputs = {}; - _Logger.errorsCount = 0; + setVector4(uniformName, vector4) { + this._pipelineContext.setVector4(uniformName, vector4); + return this; } /** - * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel) + * Sets a Quaternion on a uniform variable. + * @param uniformName Name of the variable. + * @param quaternion Value to be set. + * @returns this effect. */ - static set LogLevels(level) { - _Logger.Log = _Logger._LogDisabled; - _Logger.Warn = _Logger._LogDisabled; - _Logger.Error = _Logger._LogDisabled; - [_Logger.MessageLogLevel, _Logger.WarningLogLevel, _Logger.ErrorLogLevel].forEach((l) => { - if ((level & l) === l) { - const type = this._Levels[l]; - _Logger[type.name] = _Logger._LogEnabled.bind(_Logger, l); - } - }); + setQuaternion(uniformName, quaternion) { + this._pipelineContext.setQuaternion(uniformName, quaternion); + return this; } -}; -Logger.NoneLogLevel = 0; -Logger.MessageLogLevel = 1; -Logger.WarningLogLevel = 2; -Logger.ErrorLogLevel = 4; -Logger.AllLogLevel = 7; -Logger.MessageLimitReached = "Too many %TYPE%s (%LIMIT%), no more %TYPE%s will be reported for this message."; -Logger._LogCache = ""; -Logger._LogLimitOutputs = {}; -Logger._Levels = [ - {}, - { color: "white", logFunc: console.log, name: "Log" }, - { color: "orange", logFunc: console.warn, name: "Warn" }, - {}, - { color: "red", logFunc: console.error, name: "Error" } -]; -Logger.errorsCount = 0; -Logger.Log = Logger._LogEnabled.bind(Logger, Logger.MessageLogLevel); -Logger.Warn = Logger._LogEnabled.bind(Logger, Logger.WarningLogLevel); -Logger.Error = Logger._LogEnabled.bind(Logger, Logger.ErrorLogLevel); - -// node_modules/@babylonjs/core/Misc/deepCopier.js -var CloneValue = (source, destinationObject, shallowCopyValues) => { - if (!source) { - return null; + /** + * Sets a float4 on a uniform variable. + * @param uniformName Name of the variable. + * @param x First float in float4. + * @param y Second float in float4. + * @param z Third float in float4. + * @param w Fourth float in float4. + * @returns this effect. + */ + setFloat4(uniformName, x, y, z, w) { + this._pipelineContext.setFloat4(uniformName, x, y, z, w); + return this; } - if (source.getClassName && source.getClassName() === "Mesh") { - return null; + /** + * Sets a Color3 on a uniform variable. + * @param uniformName Name of the variable. + * @param color3 Value to be set. + * @returns this effect. + */ + setColor3(uniformName, color3) { + this._pipelineContext.setColor3(uniformName, color3); + return this; } - if (source.getClassName && (source.getClassName() === "SubMesh" || source.getClassName() === "PhysicsBody")) { - return source.clone(destinationObject); - } else if (source.clone) { - return source.clone(); - } else if (Array.isArray(source)) { - return source.slice(); - } else if (shallowCopyValues && typeof source === "object") { - return { ...source }; + /** + * Sets a Color4 on a uniform variable. + * @param uniformName Name of the variable. + * @param color3 Value to be set. + * @param alpha Alpha value to be set. + * @returns this effect. + */ + setColor4(uniformName, color3, alpha) { + this._pipelineContext.setColor4(uniformName, color3, alpha); + return this; } - return null; -}; -function GetAllPropertyNames(obj) { - const props = []; - do { - Object.getOwnPropertyNames(obj).forEach(function(prop) { - if (props.indexOf(prop) === -1) { - props.push(prop); - } - }); - } while (obj = Object.getPrototypeOf(obj)); - return props; -} -var DeepCopier = class { /** - * Tries to copy an object by duplicating every property - * @param source defines the source object - * @param destination defines the target object - * @param doNotCopyList defines a list of properties to avoid - * @param mustCopyList defines a list of properties to copy (even if they start with _) - * @param shallowCopyValues defines wether properties referencing objects (none cloneable) must be shallow copied (false by default) - * @remarks shallowCopyValues will not instantite the copied values which makes it only usable for "JSON objects" + * Sets a Color4 on a uniform variable + * @param uniformName defines the name of the variable + * @param color4 defines the value to be set + * @returns this effect. */ - static DeepCopy(source, destination, doNotCopyList, mustCopyList, shallowCopyValues = false) { - const properties = GetAllPropertyNames(source); - for (const prop of properties) { - if (prop[0] === "_" && (!mustCopyList || mustCopyList.indexOf(prop) === -1)) { - continue; - } - if (prop.endsWith("Observable")) { - continue; - } - if (doNotCopyList && doNotCopyList.indexOf(prop) !== -1) { - continue; - } - const sourceValue = source[prop]; - const typeOfSourceValue = typeof sourceValue; - if (typeOfSourceValue === "function") { - continue; - } - try { - if (typeOfSourceValue === "object") { - if (sourceValue instanceof Uint8Array) { - destination[prop] = Uint8Array.from(sourceValue); - } else if (sourceValue instanceof Array) { - destination[prop] = []; - if (sourceValue.length > 0) { - if (typeof sourceValue[0] == "object") { - for (let index = 0; index < sourceValue.length; index++) { - const clonedValue = CloneValue(sourceValue[index], destination, shallowCopyValues); - if (destination[prop].indexOf(clonedValue) === -1) { - destination[prop].push(clonedValue); - } - } - } else { - destination[prop] = sourceValue.slice(0); - } - } - } else { - destination[prop] = CloneValue(sourceValue, destination, shallowCopyValues); - } - } else { - destination[prop] = sourceValue; - } - } catch (e) { - Logger.Warn(e.message); - } + setDirectColor4(uniformName, color4) { + this._pipelineContext.setDirectColor4(uniformName, color4); + return this; + } + /** + * Release all associated resources. + **/ + dispose() { + if (this._pipelineContext) { + this._pipelineContext.dispose(); } + this._engine._releaseEffect(this); + this._isDisposed = true; } -}; - -// node_modules/@babylonjs/core/Animations/animationKey.js -var AnimationKeyInterpolation; -(function(AnimationKeyInterpolation2) { - AnimationKeyInterpolation2[AnimationKeyInterpolation2["NONE"] = 0] = "NONE"; - AnimationKeyInterpolation2[AnimationKeyInterpolation2["STEP"] = 1] = "STEP"; -})(AnimationKeyInterpolation || (AnimationKeyInterpolation = {})); - -// node_modules/@babylonjs/core/Animations/animationRange.js -var AnimationRange = class _AnimationRange { /** - * Initializes the range of an animation - * @param name The name of the animation range - * @param from The starting frame of the animation - * @param to The ending frame of the animation + * This function will add a new shader to the shader store + * @param name the name of the shader + * @param pixelShader optional pixel shader content + * @param vertexShader optional vertex shader content + * @param shaderLanguage the language the shader is written in (default: GLSL) */ - constructor(name69, from, to) { - this.name = name69; - this.from = from; - this.to = to; + static RegisterShader(name69, pixelShader, vertexShader, shaderLanguage = ShaderLanguage.GLSL) { + if (pixelShader) { + ShaderStore.GetShadersStore(shaderLanguage)[`${name69}PixelShader`] = pixelShader; + } + if (vertexShader) { + ShaderStore.GetShadersStore(shaderLanguage)[`${name69}VertexShader`] = vertexShader; + } } /** - * Makes a copy of the animation range - * @returns A copy of the animation range + * Resets the cache of effects. */ - clone() { - return new _AnimationRange(this.name, this.from, this.to); + static ResetCache() { + _Effect._BaseCache = {}; } }; +Effect.LogShaderCodeOnCompilationError = true; +Effect._UniqueIdSeed = 0; +Effect._BaseCache = {}; +Effect.ShadersStore = ShaderStore.ShadersStore; +Effect.IncludesShadersStore = ShaderStore.IncludesShadersStore; -// node_modules/@babylonjs/core/Misc/decorators.functions.js -var __mergedStore = {}; -var __decoratorInitialStore = {}; -function GetDirectStore(target) { - const classKey = target.getClassName(); - if (!__decoratorInitialStore[classKey]) { - __decoratorInitialStore[classKey] = {}; +// node_modules/@babylonjs/core/States/depthCullingState.js +var DepthCullingState = class { + /** + * Initializes the state. + * @param reset + */ + constructor(reset = true) { + this._isDepthTestDirty = false; + this._isDepthMaskDirty = false; + this._isDepthFuncDirty = false; + this._isCullFaceDirty = false; + this._isCullDirty = false; + this._isZOffsetDirty = false; + this._isFrontFaceDirty = false; + if (reset) { + this.reset(); + } } - return __decoratorInitialStore[classKey]; -} -function GetMergedStore(target) { - const classKey = target.getClassName(); - if (__mergedStore[classKey]) { - return __mergedStore[classKey]; + get isDirty() { + return this._isDepthFuncDirty || this._isDepthTestDirty || this._isDepthMaskDirty || this._isCullFaceDirty || this._isCullDirty || this._isZOffsetDirty || this._isFrontFaceDirty; } - __mergedStore[classKey] = {}; - const store = __mergedStore[classKey]; - let currentTarget = target; - let currentKey = classKey; - while (currentKey) { - const initialStore = __decoratorInitialStore[currentKey]; - for (const property in initialStore) { - store[property] = initialStore[property]; + get zOffset() { + return this._zOffset; + } + set zOffset(value) { + if (this._zOffset === value) { + return; } - let parent; - let done = false; - do { - parent = Object.getPrototypeOf(currentTarget); - if (!parent.getClassName) { - done = true; - break; - } - if (parent.getClassName() !== currentKey) { - break; - } - currentTarget = parent; - } while (parent); - if (done) { - break; + this._zOffset = value; + this._isZOffsetDirty = true; + } + get zOffsetUnits() { + return this._zOffsetUnits; + } + set zOffsetUnits(value) { + if (this._zOffsetUnits === value) { + return; } - currentKey = parent.getClassName(); - currentTarget = parent; + this._zOffsetUnits = value; + this._isZOffsetDirty = true; } - return store; -} - -// node_modules/@babylonjs/core/Misc/decorators.js -function generateSerializableMember(type, sourceName) { - return (target, propertyKey) => { - const classStore = GetDirectStore(target); - if (!classStore[propertyKey]) { - classStore[propertyKey] = { type, sourceName }; + get cullFace() { + return this._cullFace; + } + set cullFace(value) { + if (this._cullFace === value) { + return; } - }; -} -function generateExpandMember(setCallback, targetKey = null) { - return (target, propertyKey) => { - const key = targetKey || "_" + propertyKey; - Object.defineProperty(target, propertyKey, { - get: function() { - return this[key]; - }, - set: function(value) { - if (typeof this.equals === "function") { - if (this.equals(value)) { - return; - } - } - if (this[key] === value) { - return; - } - this[key] = value; - target[setCallback].apply(this); - }, - enumerable: true, - configurable: true - }); - }; -} -function expandToProperty(callback, targetKey = null) { - return generateExpandMember(callback, targetKey); -} -function serialize(sourceName) { - return generateSerializableMember(0, sourceName); -} -function serializeAsTexture(sourceName) { - return generateSerializableMember(1, sourceName); -} -function serializeAsColor3(sourceName) { - return generateSerializableMember(2, sourceName); -} -function serializeAsFresnelParameters(sourceName) { - return generateSerializableMember(3, sourceName); -} -function serializeAsVector2(sourceName) { - return generateSerializableMember(4, sourceName); -} -function serializeAsVector3(sourceName) { - return generateSerializableMember(5, sourceName); -} -function serializeAsMeshReference(sourceName) { - return generateSerializableMember(6, sourceName); -} -function serializeAsColorCurves(sourceName) { - return generateSerializableMember(7, sourceName); -} -function serializeAsColor4(sourceName) { - return generateSerializableMember(8, sourceName); -} -function serializeAsImageProcessingConfiguration(sourceName) { - return generateSerializableMember(9, sourceName); -} -function serializeAsQuaternion(sourceName) { - return generateSerializableMember(10, sourceName); -} -function serializeAsMatrix(sourceName) { - return generateSerializableMember(12, sourceName); -} -function serializeAsCameraReference(sourceName) { - return generateSerializableMember(11, sourceName); -} -function nativeOverride(target, propertyKey, descriptor, predicate) { - const jsFunc = descriptor.value; - descriptor.value = (...params) => { - let func = jsFunc; - if (typeof _native !== "undefined" && _native[propertyKey]) { - const nativeFunc = _native[propertyKey]; - if (predicate) { - func = (...params2) => predicate(...params2) ? nativeFunc(...params2) : jsFunc(...params2); - } else { - func = nativeFunc; - } - } - target[propertyKey] = func; - return func(...params); - }; -} -nativeOverride.filter = function(predicate) { - return (target, propertyKey, descriptor) => nativeOverride(target, propertyKey, descriptor, predicate); -}; - -// node_modules/@babylonjs/core/Misc/andOrNotEvaluator.js -var AndOrNotEvaluator = class _AndOrNotEvaluator { - /** - * Evaluate a query - * @param query defines the query to evaluate - * @param evaluateCallback defines the callback used to filter result - * @returns true if the query matches - */ - static Eval(query, evaluateCallback) { - if (!query.match(/\([^()]*\)/g)) { - query = _AndOrNotEvaluator._HandleParenthesisContent(query, evaluateCallback); - } else { - query = query.replace(/\([^()]*\)/g, (r) => { - r = r.slice(1, r.length - 1); - return _AndOrNotEvaluator._HandleParenthesisContent(r, evaluateCallback); - }); - } - if (query === "true") { - return true; + this._cullFace = value; + this._isCullFaceDirty = true; + } + get cull() { + return this._cull; + } + set cull(value) { + if (this._cull === value) { + return; } - if (query === "false") { - return false; + this._cull = value; + this._isCullDirty = true; + } + get depthFunc() { + return this._depthFunc; + } + set depthFunc(value) { + if (this._depthFunc === value) { + return; } - return _AndOrNotEvaluator.Eval(query, evaluateCallback); + this._depthFunc = value; + this._isDepthFuncDirty = true; } - static _HandleParenthesisContent(parenthesisContent, evaluateCallback) { - evaluateCallback = evaluateCallback || ((r) => { - return r === "true" ? true : false; - }); - let result; - const or = parenthesisContent.split("||"); - for (const i in or) { - if (Object.prototype.hasOwnProperty.call(or, i)) { - let ori = _AndOrNotEvaluator._SimplifyNegation(or[i].trim()); - const and = ori.split("&&"); - if (and.length > 1) { - for (let j = 0; j < and.length; ++j) { - const andj = _AndOrNotEvaluator._SimplifyNegation(and[j].trim()); - if (andj !== "true" && andj !== "false") { - if (andj[0] === "!") { - result = !evaluateCallback(andj.substring(1)); - } else { - result = evaluateCallback(andj); - } - } else { - result = andj === "true" ? true : false; - } - if (!result) { - ori = "false"; - break; - } - } - } - if (result || ori === "true") { - result = true; - break; - } - if (ori !== "true" && ori !== "false") { - if (ori[0] === "!") { - result = !evaluateCallback(ori.substring(1)); - } else { - result = evaluateCallback(ori); - } - } else { - result = ori === "true" ? true : false; - } - } + get depthMask() { + return this._depthMask; + } + set depthMask(value) { + if (this._depthMask === value) { + return; } - return result ? "true" : "false"; + this._depthMask = value; + this._isDepthMaskDirty = true; } - static _SimplifyNegation(booleanString) { - booleanString = booleanString.replace(/^[\s!]+/, (r) => { - r = r.replace(/[\s]/g, () => ""); - return r.length % 2 ? "!" : ""; - }); - booleanString = booleanString.trim(); - if (booleanString === "!true") { - booleanString = "false"; - } else if (booleanString === "!false") { - booleanString = "true"; + get depthTest() { + return this._depthTest; + } + set depthTest(value) { + if (this._depthTest === value) { + return; } - return booleanString; + this._depthTest = value; + this._isDepthTestDirty = true; } -}; - -// node_modules/@babylonjs/core/Misc/tags.js -var Tags = class _Tags { - /** - * Adds support for tags on the given object - * @param obj defines the object to use - */ - static EnableFor(obj) { - obj._tags = obj._tags || {}; - obj.hasTags = () => { - return _Tags.HasTags(obj); - }; - obj.addTags = (tagsString) => { - return _Tags.AddTagsTo(obj, tagsString); - }; - obj.removeTags = (tagsString) => { - return _Tags.RemoveTagsFrom(obj, tagsString); - }; - obj.matchesTagsQuery = (tagsQuery) => { - return _Tags.MatchesQuery(obj, tagsQuery); - }; + get frontFace() { + return this._frontFace; } - /** - * Removes tags support - * @param obj defines the object to use - */ - static DisableFor(obj) { - delete obj._tags; - delete obj.hasTags; - delete obj.addTags; - delete obj.removeTags; - delete obj.matchesTagsQuery; + set frontFace(value) { + if (this._frontFace === value) { + return; + } + this._frontFace = value; + this._isFrontFaceDirty = true; } - /** - * Gets a boolean indicating if the given object has tags - * @param obj defines the object to use - * @returns a boolean - */ - static HasTags(obj) { - if (!obj._tags) { - return false; + reset() { + this._depthMask = true; + this._depthTest = true; + this._depthFunc = null; + this._cullFace = null; + this._cull = null; + this._zOffset = 0; + this._zOffsetUnits = 0; + this._frontFace = null; + this._isDepthTestDirty = true; + this._isDepthMaskDirty = true; + this._isDepthFuncDirty = false; + this._isCullFaceDirty = false; + this._isCullDirty = false; + this._isZOffsetDirty = true; + this._isFrontFaceDirty = false; + } + apply(gl) { + if (!this.isDirty) { + return; } - const tags = obj._tags; - for (const i in tags) { - if (Object.prototype.hasOwnProperty.call(tags, i)) { - return true; + if (this._isCullDirty) { + if (this.cull) { + gl.enable(gl.CULL_FACE); + } else { + gl.disable(gl.CULL_FACE); } + this._isCullDirty = false; } - return false; - } - /** - * Gets the tags available on a given object - * @param obj defines the object to use - * @param asString defines if the tags must be returned as a string instead of an array of strings - * @returns the tags - */ - static GetTags(obj, asString = true) { - if (!obj._tags) { - return null; + if (this._isCullFaceDirty) { + gl.cullFace(this.cullFace); + this._isCullFaceDirty = false; } - if (asString) { - const tagsArray = []; - for (const tag in obj._tags) { - if (Object.prototype.hasOwnProperty.call(obj._tags, tag) && obj._tags[tag] === true) { - tagsArray.push(tag); - } + if (this._isDepthMaskDirty) { + gl.depthMask(this.depthMask); + this._isDepthMaskDirty = false; + } + if (this._isDepthTestDirty) { + if (this.depthTest) { + gl.enable(gl.DEPTH_TEST); + } else { + gl.disable(gl.DEPTH_TEST); } - return tagsArray.join(" "); - } else { - return obj._tags; + this._isDepthTestDirty = false; + } + if (this._isDepthFuncDirty) { + gl.depthFunc(this.depthFunc); + this._isDepthFuncDirty = false; + } + if (this._isZOffsetDirty) { + if (this.zOffset || this.zOffsetUnits) { + gl.enable(gl.POLYGON_OFFSET_FILL); + gl.polygonOffset(this.zOffset, this.zOffsetUnits); + } else { + gl.disable(gl.POLYGON_OFFSET_FILL); + } + this._isZOffsetDirty = false; + } + if (this._isFrontFaceDirty) { + gl.frontFace(this.frontFace); + this._isFrontFaceDirty = false; } } +}; + +// node_modules/@babylonjs/core/States/stencilState.js +var StencilState = class _StencilState { + constructor() { + this.reset(); + } + reset() { + this.enabled = false; + this.mask = 255; + this.func = _StencilState.ALWAYS; + this.funcRef = 1; + this.funcMask = 255; + this.opStencilFail = _StencilState.KEEP; + this.opDepthFail = _StencilState.KEEP; + this.opStencilDepthPass = _StencilState.REPLACE; + } + get stencilFunc() { + return this.func; + } + set stencilFunc(value) { + this.func = value; + } + get stencilFuncRef() { + return this.funcRef; + } + set stencilFuncRef(value) { + this.funcRef = value; + } + get stencilFuncMask() { + return this.funcMask; + } + set stencilFuncMask(value) { + this.funcMask = value; + } + get stencilOpStencilFail() { + return this.opStencilFail; + } + set stencilOpStencilFail(value) { + this.opStencilFail = value; + } + get stencilOpDepthFail() { + return this.opDepthFail; + } + set stencilOpDepthFail(value) { + this.opDepthFail = value; + } + get stencilOpStencilDepthPass() { + return this.opStencilDepthPass; + } + set stencilOpStencilDepthPass(value) { + this.opStencilDepthPass = value; + } + get stencilMask() { + return this.mask; + } + set stencilMask(value) { + this.mask = value; + } + get stencilTest() { + return this.enabled; + } + set stencilTest(value) { + this.enabled = value; + } +}; +StencilState.ALWAYS = 519; +StencilState.KEEP = 7680; +StencilState.REPLACE = 7681; + +// node_modules/@babylonjs/core/States/alphaCullingState.js +var AlphaState = class { /** - * Adds tags to an object - * @param obj defines the object to use - * @param tagsString defines the tag string. The tags 'true' and 'false' are reserved and cannot be used as tags. - * A tag cannot start with '||', '&&', and '!'. It cannot contain whitespaces + * Initializes the state. */ - static AddTagsTo(obj, tagsString) { - if (!tagsString) { + constructor() { + this._blendFunctionParameters = new Array(4); + this._blendEquationParameters = new Array(2); + this._blendConstants = new Array(4); + this._isBlendConstantsDirty = false; + this._alphaBlend = false; + this._isAlphaBlendDirty = false; + this._isBlendFunctionParametersDirty = false; + this._isBlendEquationParametersDirty = false; + this.reset(); + } + get isDirty() { + return this._isAlphaBlendDirty || this._isBlendFunctionParametersDirty || this._isBlendEquationParametersDirty; + } + get alphaBlend() { + return this._alphaBlend; + } + set alphaBlend(value) { + if (this._alphaBlend === value) { return; } - if (typeof tagsString !== "string") { + this._alphaBlend = value; + this._isAlphaBlendDirty = true; + } + setAlphaBlendConstants(r, g, b, a) { + if (this._blendConstants[0] === r && this._blendConstants[1] === g && this._blendConstants[2] === b && this._blendConstants[3] === a) { return; } - const tags = tagsString.split(" "); - tags.forEach(function(tag) { - _Tags._AddTagTo(obj, tag); - }); + this._blendConstants[0] = r; + this._blendConstants[1] = g; + this._blendConstants[2] = b; + this._blendConstants[3] = a; + this._isBlendConstantsDirty = true; } - /** - * @internal - */ - static _AddTagTo(obj, tag) { - tag = tag.trim(); - if (tag === "" || tag === "true" || tag === "false") { + setAlphaBlendFunctionParameters(value0, value1, value2, value3) { + if (this._blendFunctionParameters[0] === value0 && this._blendFunctionParameters[1] === value1 && this._blendFunctionParameters[2] === value2 && this._blendFunctionParameters[3] === value3) { return; } - if (tag.match(/[\s]/) || tag.match(/^([!]|([|]|[&]){2})/)) { + this._blendFunctionParameters[0] = value0; + this._blendFunctionParameters[1] = value1; + this._blendFunctionParameters[2] = value2; + this._blendFunctionParameters[3] = value3; + this._isBlendFunctionParametersDirty = true; + } + setAlphaEquationParameters(rgb, alpha) { + if (this._blendEquationParameters[0] === rgb && this._blendEquationParameters[1] === alpha) { return; } - _Tags.EnableFor(obj); - obj._tags[tag] = true; + this._blendEquationParameters[0] = rgb; + this._blendEquationParameters[1] = alpha; + this._isBlendEquationParametersDirty = true; } - /** - * Removes specific tags from a specific object - * @param obj defines the object to use - * @param tagsString defines the tags to remove - */ - static RemoveTagsFrom(obj, tagsString) { - if (!_Tags.HasTags(obj)) { + reset() { + this._alphaBlend = false; + this._blendFunctionParameters[0] = null; + this._blendFunctionParameters[1] = null; + this._blendFunctionParameters[2] = null; + this._blendFunctionParameters[3] = null; + this._blendEquationParameters[0] = null; + this._blendEquationParameters[1] = null; + this._blendConstants[0] = null; + this._blendConstants[1] = null; + this._blendConstants[2] = null; + this._blendConstants[3] = null; + this._isAlphaBlendDirty = true; + this._isBlendFunctionParametersDirty = false; + this._isBlendEquationParametersDirty = false; + this._isBlendConstantsDirty = false; + } + apply(gl) { + if (!this.isDirty) { return; } - const tags = tagsString.split(" "); - for (const t in tags) { - _Tags._RemoveTagFrom(obj, tags[t]); + if (this._isAlphaBlendDirty) { + if (this._alphaBlend) { + gl.enable(gl.BLEND); + } else { + gl.disable(gl.BLEND); + } + this._isAlphaBlendDirty = false; } - } - /** - * @internal - */ - static _RemoveTagFrom(obj, tag) { - delete obj._tags[tag]; - } - /** - * Defines if tags hosted on an object match a given query - * @param obj defines the object to use - * @param tagsQuery defines the tag query - * @returns a boolean - */ - static MatchesQuery(obj, tagsQuery) { - if (tagsQuery === void 0) { - return true; + if (this._isBlendFunctionParametersDirty) { + gl.blendFuncSeparate(this._blendFunctionParameters[0], this._blendFunctionParameters[1], this._blendFunctionParameters[2], this._blendFunctionParameters[3]); + this._isBlendFunctionParametersDirty = false; } - if (tagsQuery === "") { - return _Tags.HasTags(obj); + if (this._isBlendEquationParametersDirty) { + gl.blendEquationSeparate(this._blendEquationParameters[0], this._blendEquationParameters[1]); + this._isBlendEquationParametersDirty = false; + } + if (this._isBlendConstantsDirty) { + gl.blendColor(this._blendConstants[0], this._blendConstants[1], this._blendConstants[2], this._blendConstants[3]); + this._isBlendConstantsDirty = false; } - return AndOrNotEvaluator.Eval(tagsQuery, (r) => _Tags.HasTags(obj) && obj._tags[r]); } }; -// node_modules/@babylonjs/core/Misc/devTools.js -var warnedMap = {}; -function _WarnImport(name69, warnOnce = false) { - if (warnOnce && warnedMap[name69]) { - return; - } - warnedMap[name69] = true; - return `${name69} needs to be imported before as it contains a side-effect required by your code.`; -} - -// node_modules/@babylonjs/core/Misc/decorators.serialization.js -var _copySource = function(creationFunction, source, instanciate, options = {}) { - const destination = creationFunction(); - if (Tags && Tags.HasTags(source)) { - Tags.AddTagsTo(destination, Tags.GetTags(source, true)); - } - const classStore = GetMergedStore(destination); - const textureMap = {}; - for (const property in classStore) { - const propertyDescriptor = classStore[property]; - const sourceProperty = source[property]; - const propertyType = propertyDescriptor.type; - if (sourceProperty !== void 0 && sourceProperty !== null && (property !== "uniqueId" || SerializationHelper.AllowLoadingUniqueId)) { - switch (propertyType) { - case 0: - case 6: - case 11: - destination[property] = sourceProperty; - break; - case 1: - if (options.cloneTexturesOnlyOnce && textureMap[sourceProperty.uniqueId]) { - destination[property] = textureMap[sourceProperty.uniqueId]; - } else { - destination[property] = instanciate || sourceProperty.isRenderTarget ? sourceProperty : sourceProperty.clone(); - textureMap[sourceProperty.uniqueId] = destination[property]; - } - break; - case 2: - case 3: - case 4: - case 5: - case 7: - case 10: - case 12: - destination[property] = instanciate ? sourceProperty : sourceProperty.clone(); - break; - } - } - } - return destination; -}; -var SerializationHelper = class _SerializationHelper { - /** - * Appends the serialized animations from the source animations - * @param source Source containing the animations - * @param destination Target to store the animations - */ - static AppendSerializedAnimations(source, destination) { - if (source.animations) { - destination.animations = []; - for (let animationIndex = 0; animationIndex < source.animations.length; animationIndex++) { - const animation = source.animations[animationIndex]; - destination.animations.push(animation.serialize()); - } - } - } +// node_modules/@babylonjs/core/Materials/Textures/textureSampler.js +var TextureSampler = class { /** - * Static function used to serialized a specific entity - * @param entity defines the entity to serialize - * @param serializationObject defines the optional target object where serialization data will be stored - * @returns a JSON compatible object representing the serialization of the entity + * | Value | Type | Description | + * | ----- | ------------------ | ----------- | + * | 0 | CLAMP_ADDRESSMODE | | + * | 1 | WRAP_ADDRESSMODE | | + * | 2 | MIRROR_ADDRESSMODE | | */ - static Serialize(entity, serializationObject) { - if (!serializationObject) { - serializationObject = {}; - } - if (Tags) { - serializationObject.tags = Tags.GetTags(entity); - } - const serializedProperties = GetMergedStore(entity); - for (const property in serializedProperties) { - const propertyDescriptor = serializedProperties[property]; - const targetPropertyName = propertyDescriptor.sourceName || property; - const propertyType = propertyDescriptor.type; - const sourceProperty = entity[property]; - if (sourceProperty !== void 0 && sourceProperty !== null && (property !== "uniqueId" || _SerializationHelper.AllowLoadingUniqueId)) { - switch (propertyType) { - case 0: - serializationObject[targetPropertyName] = sourceProperty; - break; - case 1: - serializationObject[targetPropertyName] = sourceProperty.serialize(); - break; - case 2: - serializationObject[targetPropertyName] = sourceProperty.asArray(); - break; - case 3: - serializationObject[targetPropertyName] = sourceProperty.serialize(); - break; - case 4: - serializationObject[targetPropertyName] = sourceProperty.asArray(); - break; - case 5: - serializationObject[targetPropertyName] = sourceProperty.asArray(); - break; - case 6: - serializationObject[targetPropertyName] = sourceProperty.id; - break; - case 7: - serializationObject[targetPropertyName] = sourceProperty.serialize(); - break; - case 8: - serializationObject[targetPropertyName] = sourceProperty.asArray(); - break; - case 9: - serializationObject[targetPropertyName] = sourceProperty.serialize(); - break; - case 10: - serializationObject[targetPropertyName] = sourceProperty.asArray(); - break; - case 11: - serializationObject[targetPropertyName] = sourceProperty.id; - break; - case 12: - serializationObject[targetPropertyName] = sourceProperty.asArray(); - break; - } - } - } - return serializationObject; + get wrapU() { + return this._cachedWrapU; } - /** - * Given a source json and a destination object in a scene, this function will parse the source and will try to apply its content to the destination object - * @param source the source json data - * @param destination the destination object - * @param scene the scene where the object is - * @param rootUrl root url to use to load assets - */ - static ParseProperties(source, destination, scene, rootUrl) { - if (!rootUrl) { - rootUrl = ""; - } - const classStore = GetMergedStore(destination); - for (const property in classStore) { - const propertyDescriptor = classStore[property]; - const sourceProperty = source[propertyDescriptor.sourceName || property]; - const propertyType = propertyDescriptor.type; - if (sourceProperty !== void 0 && sourceProperty !== null && (property !== "uniqueId" || _SerializationHelper.AllowLoadingUniqueId)) { - const dest = destination; - switch (propertyType) { - case 0: - dest[property] = sourceProperty; - break; - case 1: - if (scene) { - dest[property] = _SerializationHelper._TextureParser(sourceProperty, scene, rootUrl); - } - break; - case 2: - dest[property] = Color3.FromArray(sourceProperty); - break; - case 3: - dest[property] = _SerializationHelper._FresnelParametersParser(sourceProperty); - break; - case 4: - dest[property] = Vector2.FromArray(sourceProperty); - break; - case 5: - dest[property] = Vector3.FromArray(sourceProperty); - break; - case 6: - if (scene) { - dest[property] = scene.getLastMeshById(sourceProperty); - } - break; - case 7: - dest[property] = _SerializationHelper._ColorCurvesParser(sourceProperty); - break; - case 8: - dest[property] = Color4.FromArray(sourceProperty); - break; - case 9: - dest[property] = _SerializationHelper._ImageProcessingConfigurationParser(sourceProperty); - break; - case 10: - dest[property] = Quaternion.FromArray(sourceProperty); - break; - case 11: - if (scene) { - dest[property] = scene.getCameraById(sourceProperty); - } - break; - case 12: - dest[property] = Matrix.FromArray(sourceProperty); - break; - } - } - } + set wrapU(value) { + this._cachedWrapU = value; } /** - * Creates a new entity from a serialization data object - * @param creationFunction defines a function used to instanciated the new entity - * @param source defines the source serialization data - * @param scene defines the hosting scene - * @param rootUrl defines the root url for resources - * @returns a new entity + * | Value | Type | Description | + * | ----- | ------------------ | ----------- | + * | 0 | CLAMP_ADDRESSMODE | | + * | 1 | WRAP_ADDRESSMODE | | + * | 2 | MIRROR_ADDRESSMODE | | */ - static Parse(creationFunction, source, scene, rootUrl = null) { - const destination = creationFunction(); - if (Tags) { - Tags.AddTagsTo(destination, source.tags); - } - _SerializationHelper.ParseProperties(source, destination, scene, rootUrl); - return destination; + get wrapV() { + return this._cachedWrapV; } - /** - * Clones an object - * @param creationFunction defines the function used to instanciate the new object - * @param source defines the source object - * @param options defines the options to use - * @returns the cloned object - */ - static Clone(creationFunction, source, options = {}) { - return _copySource(creationFunction, source, false, options); + set wrapV(value) { + this._cachedWrapV = value; } /** - * Instanciates a new object based on a source one (some data will be shared between both object) - * @param creationFunction defines the function used to instanciate the new object - * @param source defines the source object - * @returns the new object + * | Value | Type | Description | + * | ----- | ------------------ | ----------- | + * | 0 | CLAMP_ADDRESSMODE | | + * | 1 | WRAP_ADDRESSMODE | | + * | 2 | MIRROR_ADDRESSMODE | | */ - static Instanciate(creationFunction, source) { - return _copySource(creationFunction, source, true); + get wrapR() { + return this._cachedWrapR; } -}; -SerializationHelper.AllowLoadingUniqueId = false; -SerializationHelper._ImageProcessingConfigurationParser = (sourceProperty) => { - throw _WarnImport("ImageProcessingConfiguration"); -}; -SerializationHelper._FresnelParametersParser = (sourceProperty) => { - throw _WarnImport("FresnelParameters"); -}; -SerializationHelper._ColorCurvesParser = (sourceProperty) => { - throw _WarnImport("ColorCurves"); -}; -SerializationHelper._TextureParser = (sourceProperty, scene, rootUrl) => { - throw _WarnImport("Texture"); -}; - -// node_modules/@babylonjs/core/tslib.es6.js -function __decorate(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") - r = Reflect.decorate(decorators, target, key, desc); - else - for (var i = decorators.length - 1; i >= 0; i--) - if (d = decorators[i]) - r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -} - -// node_modules/@babylonjs/core/node.js -var _InternalNodeDataInfo = class { - constructor() { - this._doNotSerialize = false; - this._isDisposed = false; - this._sceneRootNodesIndex = -1; - this._isEnabled = true; - this._isParentEnabled = true; - this._isReady = true; - this._onEnabledStateChangedObservable = new Observable(); - this._onClonedObservable = new Observable(); + set wrapR(value) { + this._cachedWrapR = value; } -}; -var Node = class _Node { /** - * Add a new node constructor - * @param type defines the type name of the node to construct - * @param constructorFunc defines the constructor function + * With compliant hardware and browser (supporting anisotropic filtering) + * this defines the level of anisotropic filtering in the texture. + * The higher the better but the slower. */ - static AddNodeConstructor(type, constructorFunc) { - this._NodeConstructors[type] = constructorFunc; + get anisotropicFilteringLevel() { + return this._cachedAnisotropicFilteringLevel; } - /** - * Returns a node constructor based on type name - * @param type defines the type name - * @param name defines the new node name - * @param scene defines the hosting scene - * @param options defines optional options to transmit to constructors - * @returns the new constructor or null - */ - static Construct(type, name69, scene, options) { - const constructorFunc = this._NodeConstructors[type]; - if (!constructorFunc) { - return null; - } - return constructorFunc(name69, scene, options); + set anisotropicFilteringLevel(value) { + this._cachedAnisotropicFilteringLevel = value; } /** - * Gets or sets the accessibility tag to describe the node for accessibility purpose. + * Gets or sets the comparison function (513, 514, etc). Set 0 to not use a comparison function */ - set accessibilityTag(value) { - this._accessibilityTag = value; - this.onAccessibilityTagChangedObservable.notifyObservers(value); + get comparisonFunction() { + return this._comparisonFunction; } - get accessibilityTag() { - return this._accessibilityTag; + set comparisonFunction(value) { + this._comparisonFunction = value; } /** - * Gets or sets a boolean used to define if the node must be serialized + * Indicates to use the mip maps (if available on the texture). + * Thanks to this flag, you can instruct the sampler to not sample the mipmaps even if they exist (and if the sampling mode is set to a value that normally samples the mipmaps!) */ - get doNotSerialize() { - if (this._nodeDataStorage._doNotSerialize) { - return true; - } - if (this._parentNode) { - return this._parentNode.doNotSerialize; - } - return false; + get useMipMaps() { + return this._useMipMaps; } - set doNotSerialize(value) { - this._nodeDataStorage._doNotSerialize = value; + set useMipMaps(value) { + this._useMipMaps = value; } /** - * Gets a boolean indicating if the node has been disposed - * @returns true if the node was disposed + * Creates a Sampler instance */ - isDisposed() { - return this._nodeDataStorage._isDisposed; + constructor() { + this.samplingMode = -1; + this._useMipMaps = true; + this._cachedWrapU = null; + this._cachedWrapV = null; + this._cachedWrapR = null; + this._cachedAnisotropicFilteringLevel = null; + this._comparisonFunction = 0; } /** - * Gets or sets the parent of the node (without keeping the current position in the scene) - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/parent + * Sets all the parameters of the sampler + * @param wrapU u address mode (default: TEXTURE_WRAP_ADDRESSMODE) + * @param wrapV v address mode (default: TEXTURE_WRAP_ADDRESSMODE) + * @param wrapR r address mode (default: TEXTURE_WRAP_ADDRESSMODE) + * @param anisotropicFilteringLevel anisotropic level (default: 1) + * @param samplingMode sampling mode (default: 2) + * @param comparisonFunction comparison function (default: 0 - no comparison function) + * @returns the current sampler instance */ - set parent(parent) { - if (this._parentNode === parent) { - return; - } - const previousParentNode = this._parentNode; - if (this._parentNode && this._parentNode._children !== void 0 && this._parentNode._children !== null) { - const index = this._parentNode._children.indexOf(this); - if (index !== -1) { - this._parentNode._children.splice(index, 1); - } - if (!parent && !this._nodeDataStorage._isDisposed) { - this._addToSceneRootNodes(); - } - } - this._parentNode = parent; - this._isDirty = true; - if (this._parentNode) { - if (this._parentNode._children === void 0 || this._parentNode._children === null) { - this._parentNode._children = new Array(); - } - this._parentNode._children.push(this); - if (!previousParentNode) { - this._removeFromSceneRootNodes(); - } - } - this._syncParentEnabledState(); - } - get parent() { - return this._parentNode; + setParameters(wrapU = 1, wrapV = 1, wrapR = 1, anisotropicFilteringLevel = 1, samplingMode = 2, comparisonFunction = 0) { + this._cachedWrapU = wrapU; + this._cachedWrapV = wrapV; + this._cachedWrapR = wrapR; + this._cachedAnisotropicFilteringLevel = anisotropicFilteringLevel; + this.samplingMode = samplingMode; + this._comparisonFunction = comparisonFunction; + return this; } /** - * @internal + * Compares this sampler with another one + * @param other sampler to compare with + * @returns true if the samplers have the same parametres, else false */ - _serializeAsParent(serializationObject) { - serializationObject.parentId = this.uniqueId; - } - /** @internal */ - _addToSceneRootNodes() { - if (this._nodeDataStorage._sceneRootNodesIndex === -1) { - this._nodeDataStorage._sceneRootNodesIndex = this._scene.rootNodes.length; - this._scene.rootNodes.push(this); - } - } - /** @internal */ - _removeFromSceneRootNodes() { - if (this._nodeDataStorage._sceneRootNodesIndex !== -1) { - const rootNodes = this._scene.rootNodes; - const lastIdx = rootNodes.length - 1; - rootNodes[this._nodeDataStorage._sceneRootNodesIndex] = rootNodes[lastIdx]; - rootNodes[this._nodeDataStorage._sceneRootNodesIndex]._nodeDataStorage._sceneRootNodesIndex = this._nodeDataStorage._sceneRootNodesIndex; - this._scene.rootNodes.pop(); - this._nodeDataStorage._sceneRootNodesIndex = -1; - } + compareSampler(other) { + return this._cachedWrapU === other._cachedWrapU && this._cachedWrapV === other._cachedWrapV && this._cachedWrapR === other._cachedWrapR && this._cachedAnisotropicFilteringLevel === other._cachedAnisotropicFilteringLevel && this.samplingMode === other.samplingMode && this._comparisonFunction === other._comparisonFunction && this._useMipMaps === other._useMipMaps; } +}; + +// node_modules/@babylonjs/core/Materials/Textures/internalTexture.js +var InternalTextureSource; +(function(InternalTextureSource2) { + InternalTextureSource2[InternalTextureSource2["Unknown"] = 0] = "Unknown"; + InternalTextureSource2[InternalTextureSource2["Url"] = 1] = "Url"; + InternalTextureSource2[InternalTextureSource2["Temp"] = 2] = "Temp"; + InternalTextureSource2[InternalTextureSource2["Raw"] = 3] = "Raw"; + InternalTextureSource2[InternalTextureSource2["Dynamic"] = 4] = "Dynamic"; + InternalTextureSource2[InternalTextureSource2["RenderTarget"] = 5] = "RenderTarget"; + InternalTextureSource2[InternalTextureSource2["MultiRenderTarget"] = 6] = "MultiRenderTarget"; + InternalTextureSource2[InternalTextureSource2["Cube"] = 7] = "Cube"; + InternalTextureSource2[InternalTextureSource2["CubeRaw"] = 8] = "CubeRaw"; + InternalTextureSource2[InternalTextureSource2["CubePrefiltered"] = 9] = "CubePrefiltered"; + InternalTextureSource2[InternalTextureSource2["Raw3D"] = 10] = "Raw3D"; + InternalTextureSource2[InternalTextureSource2["Raw2DArray"] = 11] = "Raw2DArray"; + InternalTextureSource2[InternalTextureSource2["DepthStencil"] = 12] = "DepthStencil"; + InternalTextureSource2[InternalTextureSource2["CubeRawRGBD"] = 13] = "CubeRawRGBD"; + InternalTextureSource2[InternalTextureSource2["Depth"] = 14] = "Depth"; +})(InternalTextureSource || (InternalTextureSource = {})); +var InternalTexture = class _InternalTexture extends TextureSampler { /** - * Gets or sets the animation properties override + * Gets a boolean indicating if the texture uses mipmaps + * TODO implements useMipMaps as a separate setting from generateMipMaps */ - get animationPropertiesOverride() { - if (!this._animationPropertiesOverride) { - return this._scene.animationPropertiesOverride; - } - return this._animationPropertiesOverride; + get useMipMaps() { + return this.generateMipMaps; } - set animationPropertiesOverride(value) { - this._animationPropertiesOverride = value; + set useMipMaps(value) { + this.generateMipMaps = value; } - /** - * Gets a string identifying the name of the class - * @returns "Node" string - */ - getClassName() { - return "Node"; + /** Gets the unique id of the internal texture */ + get uniqueId() { + return this._uniqueId; } - /** - * Sets a callback that will be raised when the node will be disposed - */ - set onDispose(callback) { - if (this._onDisposeObserver) { - this.onDisposeObservable.remove(this._onDisposeObserver); - } - this._onDisposeObserver = this.onDisposeObservable.add(callback); + /** @internal */ + _setUniqueId(id) { + this._uniqueId = id; } /** - * An event triggered when the enabled state of the node changes + * Gets the Engine the texture belongs to. + * @returns The babylon engine */ - get onEnabledStateChangedObservable() { - return this._nodeDataStorage._onEnabledStateChangedObservable; + getEngine() { + return this._engine; } /** - * An event triggered when the node is cloned + * Gets the data source type of the texture */ - get onClonedObservable() { - return this._nodeDataStorage._onClonedObservable; + get source() { + return this._source; } /** - * Creates a new Node - * @param name the name and id to be given to this node - * @param scene the scene this node will be added to + * Creates a new InternalTexture + * @param engine defines the engine to use + * @param source defines the type of data that will be used + * @param delayAllocation if the texture allocation should be delayed (default: false) */ - constructor(name69, scene = null) { - this._isDirty = false; - this._nodeDataStorage = new _InternalNodeDataInfo(); - this.state = ""; - this.metadata = null; - this.reservedDataStore = null; - this._accessibilityTag = null; - this.onAccessibilityTagChangedObservable = new Observable(); - this._parentContainer = null; - this.animations = []; - this._ranges = {}; - this.onReady = null; - this._currentRenderId = -1; - this._parentUpdateId = -1; - this._childUpdateId = -1; - this._waitingParentId = null; - this._waitingParentInstanceIndex = null; - this._waitingParsedUniqueId = null; - this._cache = {}; - this._parentNode = null; - this._children = null; - this._worldMatrix = Matrix.Identity(); - this._worldMatrixDeterminant = 0; - this._worldMatrixDeterminantIsDirty = true; - this._animationPropertiesOverride = null; - this._isNode = true; - this.onDisposeObservable = new Observable(); - this._onDisposeObserver = null; - this._behaviors = new Array(); - this.name = name69; - this.id = name69; - this._scene = scene || EngineStore.LastCreatedScene; - this.uniqueId = this._scene.getUniqueId(); - this._initCache(); + constructor(engine, source, delayAllocation = false) { + super(); + this.isReady = false; + this.isCube = false; + this.is3D = false; + this.is2DArray = false; + this.isMultiview = false; + this.url = ""; + this.generateMipMaps = false; + this.samples = 0; + this.type = -1; + this.format = -1; + this.onLoadedObservable = new Observable(); + this.onErrorObservable = new Observable(); + this.onRebuildCallback = null; + this.width = 0; + this.height = 0; + this.depth = 0; + this.baseWidth = 0; + this.baseHeight = 0; + this.baseDepth = 0; + this.invertY = false; + this._invertVScale = false; + this._associatedChannel = -1; + this._source = InternalTextureSource.Unknown; + this._buffer = null; + this._bufferView = null; + this._bufferViewArray = null; + this._bufferViewArrayArray = null; + this._size = 0; + this._extension = ""; + this._files = null; + this._workingCanvas = null; + this._workingContext = null; + this._cachedCoordinatesMode = null; + this._isDisabled = false; + this._compression = null; + this._sphericalPolynomial = null; + this._sphericalPolynomialPromise = null; + this._sphericalPolynomialComputed = false; + this._lodGenerationScale = 0; + this._lodGenerationOffset = 0; + this._useSRGBBuffer = false; + this._creationFlags = 0; + this._lodTextureHigh = null; + this._lodTextureMid = null; + this._lodTextureLow = null; + this._isRGBD = false; + this._linearSpecularLOD = false; + this._irradianceTexture = null; + this._hardwareTexture = null; + this._maxLodLevel = null; + this._references = 1; + this._gammaSpace = null; + this._premulAlpha = false; + this._dynamicTextureSource = null; + this._engine = engine; + this._source = source; + this._uniqueId = _InternalTexture._Counter++; + if (!delayAllocation) { + this._hardwareTexture = engine._createHardwareTexture(); + } } /** - * Gets the scene of the node - * @returns a scene + * Increments the number of references (ie. the number of Texture that point to it) */ - getScene() { - return this._scene; + incrementReferences() { + this._references++; } /** - * Gets the engine of the node - * @returns a Engine + * Change the size of the texture (not the size of the content) + * @param width defines the new width + * @param height defines the new height + * @param depth defines the new depth (1 by default) */ - getEngine() { - return this._scene.getEngine(); + updateSize(width, height, depth = 1) { + this._engine.updateTextureDimensions(this, width, height, depth); + this.width = width; + this.height = height; + this.depth = depth; + this.baseWidth = width; + this.baseHeight = height; + this.baseDepth = depth; + this._size = width * height * depth; + } + /** @internal */ + _rebuild() { + this.isReady = false; + this._cachedCoordinatesMode = null; + this._cachedWrapU = null; + this._cachedWrapV = null; + this._cachedWrapR = null; + this._cachedAnisotropicFilteringLevel = null; + if (this.onRebuildCallback) { + const data = this.onRebuildCallback(this); + const swapAndSetIsReady = (proxyInternalTexture) => { + proxyInternalTexture._swapAndDie(this, false); + this.isReady = data.isReady; + }; + if (data.isAsync) { + data.proxy.then(swapAndSetIsReady); + } else { + swapAndSetIsReady(data.proxy); + } + return; + } + let proxy; + switch (this.source) { + case InternalTextureSource.Temp: + break; + case InternalTextureSource.Url: + proxy = this._engine.createTexture( + this._originalUrl ?? this.url, + !this.generateMipMaps, + this.invertY, + null, + this.samplingMode, + // Do not use Proxy here as it could be fully synchronous + // and proxy would be undefined. + (temp) => { + temp._swapAndDie(this, false); + this.isReady = true; + }, + null, + this._buffer, + void 0, + this.format, + this._extension, + void 0, + void 0, + void 0, + this._useSRGBBuffer + ); + return; + case InternalTextureSource.Raw: + proxy = this._engine.createRawTexture(this._bufferView, this.baseWidth, this.baseHeight, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression, this.type, this._creationFlags, this._useSRGBBuffer); + proxy._swapAndDie(this, false); + this.isReady = true; + break; + case InternalTextureSource.Raw3D: + proxy = this._engine.createRawTexture3D(this._bufferView, this.baseWidth, this.baseHeight, this.baseDepth, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression, this.type); + proxy._swapAndDie(this, false); + this.isReady = true; + break; + case InternalTextureSource.Raw2DArray: + proxy = this._engine.createRawTexture2DArray(this._bufferView, this.baseWidth, this.baseHeight, this.baseDepth, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression, this.type); + proxy._swapAndDie(this, false); + this.isReady = true; + break; + case InternalTextureSource.Dynamic: + proxy = this._engine.createDynamicTexture(this.baseWidth, this.baseHeight, this.generateMipMaps, this.samplingMode); + proxy._swapAndDie(this, false); + if (this._dynamicTextureSource) { + this._engine.updateDynamicTexture(this, this._dynamicTextureSource, this.invertY, this._premulAlpha, this.format, true); + } + break; + case InternalTextureSource.Cube: + proxy = this._engine.createCubeTexture(this.url, null, this._files, !this.generateMipMaps, () => { + proxy._swapAndDie(this, false); + this.isReady = true; + }, null, this.format, this._extension, false, 0, 0, null, void 0, this._useSRGBBuffer); + return; + case InternalTextureSource.CubeRaw: + proxy = this._engine.createRawCubeTexture(this._bufferViewArray, this.width, this._originalFormat ?? this.format, this.type, this.generateMipMaps, this.invertY, this.samplingMode, this._compression); + proxy._swapAndDie(this, false); + this.isReady = true; + break; + case InternalTextureSource.CubeRawRGBD: + return; + case InternalTextureSource.CubePrefiltered: + proxy = this._engine.createPrefilteredCubeTexture(this.url, null, this._lodGenerationScale, this._lodGenerationOffset, (proxy2) => { + if (proxy2) { + proxy2._swapAndDie(this, false); + } + this.isReady = true; + }, null, this.format, this._extension); + proxy._sphericalPolynomial = this._sphericalPolynomial; + return; + case InternalTextureSource.DepthStencil: + case InternalTextureSource.Depth: { + break; + } + } } /** - * Attach a behavior to the node - * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors - * @param behavior defines the behavior to attach - * @param attachImmediately defines that the behavior must be attached even if the scene is still loading - * @returns the current Node + * @internal */ - addBehavior(behavior, attachImmediately = false) { - const index = this._behaviors.indexOf(behavior); + _swapAndDie(target, swapAll = true) { + var _a; + (_a = this._hardwareTexture) == null ? void 0 : _a.setUsage(target._source, this.generateMipMaps, this.is2DArray, this.isCube, this.is3D, this.width, this.height, this.depth); + target._hardwareTexture = this._hardwareTexture; + if (swapAll) { + target._isRGBD = this._isRGBD; + } + if (this._lodTextureHigh) { + if (target._lodTextureHigh) { + target._lodTextureHigh.dispose(); + } + target._lodTextureHigh = this._lodTextureHigh; + } + if (this._lodTextureMid) { + if (target._lodTextureMid) { + target._lodTextureMid.dispose(); + } + target._lodTextureMid = this._lodTextureMid; + } + if (this._lodTextureLow) { + if (target._lodTextureLow) { + target._lodTextureLow.dispose(); + } + target._lodTextureLow = this._lodTextureLow; + } + if (this._irradianceTexture) { + if (target._irradianceTexture) { + target._irradianceTexture.dispose(); + } + target._irradianceTexture = this._irradianceTexture; + } + const cache = this._engine.getLoadedTexturesCache(); + let index = cache.indexOf(this); if (index !== -1) { - return this; + cache.splice(index, 1); } - behavior.init(); - if (this._scene.isLoading && !attachImmediately) { - this._scene.onDataLoadedObservable.addOnce(() => { - behavior.attach(this); - }); - } else { - behavior.attach(this); + index = cache.indexOf(target); + if (index === -1) { + cache.push(target); } - this._behaviors.push(behavior); - return this; } /** - * Remove an attached behavior - * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors - * @param behavior defines the behavior to attach - * @returns the current Node + * Dispose the current allocated resources */ - removeBehavior(behavior) { - const index = this._behaviors.indexOf(behavior); - if (index === -1) { - return this; + dispose() { + this._references--; + this.onLoadedObservable.clear(); + this.onErrorObservable.clear(); + if (this._references === 0) { + this._engine._releaseTexture(this); + this._hardwareTexture = null; + this._dynamicTextureSource = null; } - this._behaviors[index].detach(); - this._behaviors.splice(index, 1); - return this; } +}; +InternalTexture._Counter = 0; + +// node_modules/@babylonjs/core/Engines/WebGL/webGL2ShaderProcessors.js +var varyingRegex = /(flat\s)?\s*varying\s*.*/; +var WebGL2ShaderProcessor = class { + constructor() { + this.shaderLanguage = ShaderLanguage.GLSL; + } + attributeProcessor(attribute) { + return attribute.replace("attribute", "in"); + } + varyingCheck(varying, _isFragment) { + return varyingRegex.test(varying); + } + varyingProcessor(varying, isFragment) { + return varying.replace("varying", isFragment ? "in" : "out"); + } + postProcessor(code, defines, isFragment) { + const hasDrawBuffersExtension = code.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1; + const regex = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g; + code = code.replace(regex, ""); + code = code.replace(/texture2D\s*\(/g, "texture("); + if (isFragment) { + const hasOutput = code.search(/layout *\(location *= *0\) *out/g) !== -1; + code = code.replace(/texture2DLodEXT\s*\(/g, "textureLod("); + code = code.replace(/textureCubeLodEXT\s*\(/g, "textureLod("); + code = code.replace(/textureCube\s*\(/g, "texture("); + code = code.replace(/gl_FragDepthEXT/g, "gl_FragDepth"); + code = code.replace(/gl_FragColor/g, "glFragColor"); + code = code.replace(/gl_FragData/g, "glFragData"); + code = code.replace(/void\s+?main\s*\(/g, (hasDrawBuffersExtension || hasOutput ? "" : "layout(location = 0) out vec4 glFragColor;\n") + "void main("); + } else { + const hasMultiviewExtension = defines.indexOf("#define MULTIVIEW") !== -1; + if (hasMultiviewExtension) { + return "#extension GL_OVR_multiview2 : require\nlayout (num_views = 2) in;\n" + code; + } + } + return code; + } +}; + +// node_modules/@babylonjs/core/Buffers/dataBuffer.js +var DataBuffer = class _DataBuffer { /** - * Gets the list of attached behaviors - * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors + * Gets the underlying buffer */ - get behaviors() { - return this._behaviors; + get underlyingResource() { + return null; } /** - * 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 + * Constructs the buffer */ - getBehaviorByName(name69) { - for (const behavior of this._behaviors) { - if (behavior.name === name69) { - return behavior; + constructor() { + this.references = 0; + this.capacity = 0; + this.is32Bits = false; + this.uniqueId = _DataBuffer._Counter++; + } +}; +DataBuffer._Counter = 0; + +// node_modules/@babylonjs/core/Meshes/WebGL/webGLDataBuffer.js +var WebGLDataBuffer = class extends DataBuffer { + constructor(resource) { + super(); + this._buffer = resource; + } + get underlyingResource() { + return this._buffer; + } +}; + +// node_modules/@babylonjs/core/Engines/WebGL/webGLPipelineContext.js +var WebGLPipelineContext = class { + constructor() { + this._valueCache = {}; + this.vertexCompilationError = null; + this.fragmentCompilationError = null; + this.programLinkError = null; + this.programValidationError = null; + this._isDisposed = false; + } + get isAsync() { + return this.isParallelCompiled; + } + get isReady() { + if (this.program) { + if (this.isParallelCompiled) { + return this.engine._isRenderingStateCompiled(this); } + return true; } - return null; + return false; } - /** - * Returns the latest update of the World matrix - * @returns a Matrix - */ - getWorldMatrix() { - if (this._currentRenderId !== this._scene.getRenderId()) { - this.computeWorldMatrix(); + _handlesSpectorRebuildCallback(onCompiled) { + if (onCompiled && this.program) { + onCompiled(this.program); } - return this._worldMatrix; } - /** @internal */ - _getWorldMatrixDeterminant() { - if (this._worldMatrixDeterminantIsDirty) { - this._worldMatrixDeterminantIsDirty = false; - this._worldMatrixDeterminant = this._worldMatrix.determinant(); + _fillEffectInformation(effect, uniformBuffersNames, uniformsNames, uniforms, samplerList, samplers, attributesNames, attributes) { + const engine = this.engine; + if (engine.supportsUniformBuffers) { + for (const name69 in uniformBuffersNames) { + effect.bindUniformBlock(name69, uniformBuffersNames[name69]); + } + } + const effectAvailableUniforms = this.engine.getUniforms(this, uniformsNames); + effectAvailableUniforms.forEach((uniform, index2) => { + uniforms[uniformsNames[index2]] = uniform; + }); + this._uniforms = uniforms; + let index; + for (index = 0; index < samplerList.length; index++) { + const sampler = effect.getUniform(samplerList[index]); + if (sampler == null) { + samplerList.splice(index, 1); + index--; + } + } + samplerList.forEach((name69, index2) => { + samplers[name69] = index2; + }); + for (const attr of engine.getAttributes(this, attributesNames)) { + attributes.push(attr); } - return this._worldMatrixDeterminant; } /** - * Returns directly the latest state of the mesh World matrix. - * A Matrix is returned. - */ - get worldMatrixFromCache() { - return this._worldMatrix; - } - // override it in derived class if you add new variables to the cache - // and call the parent class method - /** @internal */ - _initCache() { - this._cache = {}; + * Release all associated resources. + **/ + dispose() { + this._uniforms = {}; + this._isDisposed = true; } /** * @internal */ - updateCache(force) { - if (!force && this.isSynchronized()) { - return; + _cacheMatrix(uniformName, matrix) { + const cache = this._valueCache[uniformName]; + const flag = matrix.updateFlag; + if (cache !== void 0 && cache === flag) { + return false; } - this._updateCache(); + this._valueCache[uniformName] = flag; + return true; } /** * @internal */ - _getActionManagerForTrigger(trigger, _initialCall = true) { - if (!this.parent) { - return null; + _cacheFloat2(uniformName, x, y) { + let cache = this._valueCache[uniformName]; + if (!cache || cache.length !== 2) { + cache = [x, y]; + this._valueCache[uniformName] = cache; + return true; } - return this.parent._getActionManagerForTrigger(trigger, false); + let changed = false; + if (cache[0] !== x) { + cache[0] = x; + changed = true; + } + if (cache[1] !== y) { + cache[1] = y; + changed = true; + } + return changed; } - // override it in derived class if you add new variables to the cache - // and call the parent class method if !ignoreParentClass /** * @internal */ - _updateCache(_ignoreParentClass) { - } - // override it in derived class if you add new variables to the cache - /** @internal */ - _isSynchronized() { - return true; - } - /** @internal */ - _markSyncedWithParent() { - if (this._parentNode) { - this._parentUpdateId = this._parentNode._childUpdateId; - } - } - /** @internal */ - isSynchronizedWithParent() { - if (!this._parentNode) { + _cacheFloat3(uniformName, x, y, z) { + let cache = this._valueCache[uniformName]; + if (!cache || cache.length !== 3) { + cache = [x, y, z]; + this._valueCache[uniformName] = cache; return true; } - if (this._parentNode._isDirty || this._parentUpdateId !== this._parentNode._childUpdateId) { - return false; + let changed = false; + if (cache[0] !== x) { + cache[0] = x; + changed = true; } - return this._parentNode.isSynchronized(); - } - /** @internal */ - isSynchronized() { - if (this._parentNode && !this.isSynchronizedWithParent()) { - return false; + if (cache[1] !== y) { + cache[1] = y; + changed = true; } - return this._isSynchronized(); - } - /** - * Is this node ready to be used/rendered - * @param _completeCheck defines if a complete check (including materials and lights) has to be done (false by default) - * @returns true if the node is ready - */ - isReady(_completeCheck = false) { - return this._nodeDataStorage._isReady; - } - /** - * Flag the node as dirty (Forcing it to update everything) - * @param _property helps children apply precise "dirtyfication" - * @returns this node - */ - markAsDirty(_property) { - this._currentRenderId = Number.MAX_VALUE; - this._isDirty = true; - return this; + if (cache[2] !== z) { + cache[2] = z; + changed = true; + } + return changed; } /** - * Is this node enabled? - * If the node has a parent, all ancestors will be checked and false will be returned if any are false (not enabled), otherwise will return true - * @param checkAncestors indicates if this method should check the ancestors. The default is to check the ancestors. If set to false, the method will return the value of this node without checking ancestors - * @returns whether this node (and its parent) is enabled + * @internal */ - isEnabled(checkAncestors = true) { - if (checkAncestors === false) { - return this._nodeDataStorage._isEnabled; + _cacheFloat4(uniformName, x, y, z, w) { + let cache = this._valueCache[uniformName]; + if (!cache || cache.length !== 4) { + cache = [x, y, z, w]; + this._valueCache[uniformName] = cache; + return true; } - if (!this._nodeDataStorage._isEnabled) { - return false; + let changed = false; + if (cache[0] !== x) { + cache[0] = x; + changed = true; } - return this._nodeDataStorage._isParentEnabled; - } - /** @internal */ - _syncParentEnabledState() { - this._nodeDataStorage._isParentEnabled = this._parentNode ? this._parentNode.isEnabled() : true; - if (this._children) { - this._children.forEach((c) => { - c._syncParentEnabledState(); - }); + if (cache[1] !== y) { + cache[1] = y; + changed = true; + } + if (cache[2] !== z) { + cache[2] = z; + changed = true; + } + if (cache[3] !== w) { + cache[3] = w; + changed = true; } + return changed; } /** - * Set the enabled state of this node - * @param value defines the new enabled state + * Sets an integer value on a uniform variable. + * @param uniformName Name of the variable. + * @param value Value to be set. */ - setEnabled(value) { - if (this._nodeDataStorage._isEnabled === value) { + setInt(uniformName, value) { + const cache = this._valueCache[uniformName]; + if (cache !== void 0 && cache === value) { return; } - this._nodeDataStorage._isEnabled = value; - this._syncParentEnabledState(); - this._nodeDataStorage._onEnabledStateChangedObservable.notifyObservers(value); + if (this.engine.setInt(this._uniforms[uniformName], value)) { + this._valueCache[uniformName] = value; + } } /** - * Is this node a descendant of the given node? - * The function will iterate up the hierarchy until the ancestor was found or no more parents defined - * @param ancestor defines the parent node to inspect - * @returns a boolean indicating if this node is a descendant of the given node + * Sets a int2 on a uniform variable. + * @param uniformName Name of the variable. + * @param x First int in int2. + * @param y Second int in int2. */ - isDescendantOf(ancestor) { - if (this.parent) { - if (this.parent === ancestor) { - return true; + setInt2(uniformName, x, y) { + if (this._cacheFloat2(uniformName, x, y)) { + if (!this.engine.setInt2(this._uniforms[uniformName], x, y)) { + this._valueCache[uniformName] = null; } - return this.parent.isDescendantOf(ancestor); } - return false; } /** - * @internal + * Sets a int3 on a uniform variable. + * @param uniformName Name of the variable. + * @param x First int in int3. + * @param y Second int in int3. + * @param z Third int in int3. */ - _getDescendants(results, directDescendantsOnly = false, predicate) { - if (!this._children) { - return; - } - for (let index = 0; index < this._children.length; index++) { - const item = this._children[index]; - if (!predicate || predicate(item)) { - results.push(item); + setInt3(uniformName, x, y, z) { + if (this._cacheFloat3(uniformName, x, y, z)) { + if (!this.engine.setInt3(this._uniforms[uniformName], x, y, z)) { + this._valueCache[uniformName] = null; } - if (!directDescendantsOnly) { - item._getDescendants(results, false, predicate); + } + } + /** + * Sets a int4 on a uniform variable. + * @param uniformName Name of the variable. + * @param x First int in int4. + * @param y Second int in int4. + * @param z Third int in int4. + * @param w Fourth int in int4. + */ + setInt4(uniformName, x, y, z, w) { + if (this._cacheFloat4(uniformName, x, y, z, w)) { + if (!this.engine.setInt4(this._uniforms[uniformName], x, y, z, w)) { + this._valueCache[uniformName] = null; } } } /** - * Will return all nodes that have this node 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 children nodes of all types + * Sets an int array on a uniform variable. + * @param uniformName Name of the variable. + * @param array array to be set. */ - getDescendants(directDescendantsOnly, predicate) { - const results = []; - this._getDescendants(results, directDescendantsOnly, predicate); - return results; + setIntArray(uniformName, array) { + this._valueCache[uniformName] = null; + this.engine.setIntArray(this._uniforms[uniformName], array); } /** - * Get all child-meshes of this node - * @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 (Default: false) - * @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 an array of AbstractMesh + * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. */ - getChildMeshes(directDescendantsOnly, predicate) { - const results = []; - this._getDescendants(results, directDescendantsOnly, (node) => { - return (!predicate || predicate(node)) && node.cullingStrategy !== void 0; - }); - return results; + setIntArray2(uniformName, array) { + this._valueCache[uniformName] = null; + this.engine.setIntArray2(this._uniforms[uniformName], array); } /** - * Get all direct children of this node - * @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 - * @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 (Default: true) - * @returns an array of Node + * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. */ - getChildren(predicate, directDescendantsOnly = true) { - return this.getDescendants(directDescendantsOnly, predicate); + setIntArray3(uniformName, array) { + this._valueCache[uniformName] = null; + this.engine.setIntArray3(this._uniforms[uniformName], array); } /** - * @internal + * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. */ - _setReady(state) { - if (state === this._nodeDataStorage._isReady) { - return; - } - if (!state) { - this._nodeDataStorage._isReady = false; + setIntArray4(uniformName, array) { + this._valueCache[uniformName] = null; + this.engine.setIntArray4(this._uniforms[uniformName], array); + } + /** + * Sets an unsigned integer value on a uniform variable. + * @param uniformName Name of the variable. + * @param value Value to be set. + */ + setUInt(uniformName, value) { + const cache = this._valueCache[uniformName]; + if (cache !== void 0 && cache === value) { return; } - if (this.onReady) { - this.onReady(this); + if (this.engine.setUInt(this._uniforms[uniformName], value)) { + this._valueCache[uniformName] = value; } - this._nodeDataStorage._isReady = true; } /** - * Get an animation by name - * @param name defines the name of the animation to look for - * @returns null if not found else the requested animation + * Sets an unsigned int2 value on a uniform variable. + * @param uniformName Name of the variable. + * @param x First unsigned int in uint2. + * @param y Second unsigned int in uint2. */ - getAnimationByName(name69) { - for (let i = 0; i < this.animations.length; i++) { - const animation = this.animations[i]; - if (animation.name === name69) { - return animation; + setUInt2(uniformName, x, y) { + if (this._cacheFloat2(uniformName, x, y)) { + if (!this.engine.setUInt2(this._uniforms[uniformName], x, y)) { + this._valueCache[uniformName] = null; } } - return null; } /** - * Creates an animation range for this node - * @param name defines the name of the range - * @param from defines the starting key - * @param to defines the end key + * Sets an unsigned int3 value on a uniform variable. + * @param uniformName Name of the variable. + * @param x First unsigned int in uint3. + * @param y Second unsigned int in uint3. + * @param z Third unsigned int in uint3. */ - createAnimationRange(name69, from, to) { - if (!this._ranges[name69]) { - this._ranges[name69] = _Node._AnimationRangeFactory(name69, from, to); - for (let i = 0, nAnimations = this.animations.length; i < nAnimations; i++) { - if (this.animations[i]) { - this.animations[i].createRange(name69, from, to); - } + setUInt3(uniformName, x, y, z) { + if (this._cacheFloat3(uniformName, x, y, z)) { + if (!this.engine.setUInt3(this._uniforms[uniformName], x, y, z)) { + this._valueCache[uniformName] = null; } } } /** - * Delete a specific animation range - * @param name defines the name of the range to delete - * @param deleteFrames defines if animation frames from the range must be deleted as well + * Sets an unsigned int4 value on a uniform variable. + * @param uniformName Name of the variable. + * @param x First unsigned int in uint4. + * @param y Second unsigned int in uint4. + * @param z Third unsigned int in uint4. + * @param w Fourth unsigned int in uint4. */ - deleteAnimationRange(name69, deleteFrames = true) { - for (let i = 0, nAnimations = this.animations.length; i < nAnimations; i++) { - if (this.animations[i]) { - this.animations[i].deleteRange(name69, deleteFrames); + setUInt4(uniformName, x, y, z, w) { + if (this._cacheFloat4(uniformName, x, y, z, w)) { + if (!this.engine.setUInt4(this._uniforms[uniformName], x, y, z, w)) { + this._valueCache[uniformName] = null; } } - this._ranges[name69] = null; } /** - * Get an animation range by name - * @param name defines the name of the animation range to look for - * @returns null if not found else the requested animation range + * Sets an unsigned int array on a uniform variable. + * @param uniformName Name of the variable. + * @param array array to be set. */ - getAnimationRange(name69) { - return this._ranges[name69] || null; + setUIntArray(uniformName, array) { + this._valueCache[uniformName] = null; + this.engine.setUIntArray(this._uniforms[uniformName], array); } /** - * Clone the current node - * @param name Name of the new clone - * @param newParent New parent for the clone - * @param doNotCloneChildren Do not clone children hierarchy - * @returns the new transform node + * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. */ - clone(name69, newParent, doNotCloneChildren) { - const result = SerializationHelper.Clone(() => new _Node(name69, this.getScene()), this); - if (newParent) { - result.parent = newParent; + setUIntArray2(uniformName, array) { + this._valueCache[uniformName] = null; + this.engine.setUIntArray2(this._uniforms[uniformName], array); + } + /** + * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + */ + setUIntArray3(uniformName, array) { + this._valueCache[uniformName] = null; + this.engine.setUIntArray3(this._uniforms[uniformName], array); + } + /** + * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + */ + setUIntArray4(uniformName, array) { + this._valueCache[uniformName] = null; + this.engine.setUIntArray4(this._uniforms[uniformName], array); + } + /** + * Sets an array on a uniform variable. + * @param uniformName Name of the variable. + * @param array array to be set. + */ + setArray(uniformName, array) { + this._valueCache[uniformName] = null; + this.engine.setArray(this._uniforms[uniformName], array); + } + /** + * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + */ + setArray2(uniformName, array) { + this._valueCache[uniformName] = null; + this.engine.setArray2(this._uniforms[uniformName], array); + } + /** + * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + */ + setArray3(uniformName, array) { + this._valueCache[uniformName] = null; + this.engine.setArray3(this._uniforms[uniformName], array); + } + /** + * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) + * @param uniformName Name of the variable. + * @param array array to be set. + */ + setArray4(uniformName, array) { + this._valueCache[uniformName] = null; + this.engine.setArray4(this._uniforms[uniformName], array); + } + /** + * Sets matrices on a uniform variable. + * @param uniformName Name of the variable. + * @param matrices matrices to be set. + */ + setMatrices(uniformName, matrices) { + if (!matrices) { + return; } - if (!doNotCloneChildren) { - const directDescendants = this.getDescendants(true); - for (let index = 0; index < directDescendants.length; index++) { - const child = directDescendants[index]; - child.clone(name69 + "." + child.name, result); + this._valueCache[uniformName] = null; + this.engine.setMatrices(this._uniforms[uniformName], matrices); + } + /** + * Sets matrix on a uniform variable. + * @param uniformName Name of the variable. + * @param matrix matrix to be set. + */ + setMatrix(uniformName, matrix) { + if (this._cacheMatrix(uniformName, matrix)) { + if (!this.engine.setMatrices(this._uniforms[uniformName], matrix.asArray())) { + this._valueCache[uniformName] = null; } } - return result; } /** - * Gets the list of all animation ranges defined on this node - * @returns an array + * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix) + * @param uniformName Name of the variable. + * @param matrix matrix to be set. */ - getAnimationRanges() { - const animationRanges = []; - let name69; - for (name69 in this._ranges) { - animationRanges.push(this._ranges[name69]); - } - return animationRanges; + setMatrix3x3(uniformName, matrix) { + this._valueCache[uniformName] = null; + this.engine.setMatrix3x3(this._uniforms[uniformName], matrix); } /** - * Will start the animation sequence - * @param name defines the range frames for animation sequence - * @param loop defines if the animation should loop (false by default) - * @param speedRatio defines the speed factor in which to run the animation (1 by default) - * @param onAnimationEnd defines a function to be executed when the animation ended (undefined by default) - * @returns the object created for this animation. If range does not exist, it will return null + * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix) + * @param uniformName Name of the variable. + * @param matrix matrix to be set. */ - beginAnimation(name69, loop, speedRatio, onAnimationEnd) { - const range = this.getAnimationRange(name69); - if (!range) { - return null; + setMatrix2x2(uniformName, matrix) { + this._valueCache[uniformName] = null; + this.engine.setMatrix2x2(this._uniforms[uniformName], matrix); + } + /** + * Sets a float on a uniform variable. + * @param uniformName Name of the variable. + * @param value value to be set. + */ + setFloat(uniformName, value) { + const cache = this._valueCache[uniformName]; + if (cache !== void 0 && cache === value) { + return; + } + if (this.engine.setFloat(this._uniforms[uniformName], value)) { + this._valueCache[uniformName] = value; } - return this._scene.beginAnimation(this, range.from, range.to, loop, speedRatio, onAnimationEnd); } /** - * Serialize animation ranges into a JSON compatible object - * @returns serialization object + * Sets a Vector2 on a uniform variable. + * @param uniformName Name of the variable. + * @param vector2 vector2 to be set. */ - serializeAnimationRanges() { - const serializationRanges = []; - for (const name69 in this._ranges) { - const localRange = this._ranges[name69]; - if (!localRange) { - continue; + setVector2(uniformName, vector2) { + if (this._cacheFloat2(uniformName, vector2.x, vector2.y)) { + if (!this.engine.setFloat2(this._uniforms[uniformName], vector2.x, vector2.y)) { + this._valueCache[uniformName] = null; } - const range = {}; - range.name = name69; - range.from = localRange.from; - range.to = localRange.to; - serializationRanges.push(range); } - return serializationRanges; } /** - * Computes the world matrix of the node - * @param _force defines if the cache version should be invalidated forcing the world matrix to be created from scratch - * @returns the world matrix + * Sets a float2 on a uniform variable. + * @param uniformName Name of the variable. + * @param x First float in float2. + * @param y Second float in float2. */ - computeWorldMatrix(_force) { - if (!this._worldMatrix) { - this._worldMatrix = Matrix.Identity(); + setFloat2(uniformName, x, y) { + if (this._cacheFloat2(uniformName, x, y)) { + if (!this.engine.setFloat2(this._uniforms[uniformName], x, y)) { + this._valueCache[uniformName] = null; + } } - return this._worldMatrix; } /** - * Releases resources associated with this node. - * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default) - * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default) + * Sets a Vector3 on a uniform variable. + * @param uniformName Name of the variable. + * @param vector3 Value to be set. */ - dispose(doNotRecurse, disposeMaterialAndTextures = false) { - this._nodeDataStorage._isDisposed = true; - if (!doNotRecurse) { - const nodes = this.getDescendants(true); - for (const node of nodes) { - node.dispose(doNotRecurse, disposeMaterialAndTextures); + setVector3(uniformName, vector3) { + if (this._cacheFloat3(uniformName, vector3.x, vector3.y, vector3.z)) { + if (!this.engine.setFloat3(this._uniforms[uniformName], vector3.x, vector3.y, vector3.z)) { + this._valueCache[uniformName] = null; } } - if (!this.parent) { - this._removeFromSceneRootNodes(); - } else { - this.parent = null; - } - this.onDisposeObservable.notifyObservers(this); - this.onDisposeObservable.clear(); - this.onEnabledStateChangedObservable.clear(); - this.onClonedObservable.clear(); - for (const behavior of this._behaviors) { - behavior.detach(); - } - this._behaviors.length = 0; - this.metadata = null; } /** - * Parse animation range data from a serialization object and store them into a given node - * @param node defines where to store the animation ranges - * @param parsedNode defines the serialization object to read data from - * @param _scene defines the hosting scene + * Sets a float3 on a uniform variable. + * @param uniformName Name of the variable. + * @param x First float in float3. + * @param y Second float in float3. + * @param z Third float in float3. */ - static ParseAnimationRanges(node, parsedNode, _scene) { - if (parsedNode.ranges) { - for (let index = 0; index < parsedNode.ranges.length; index++) { - const data = parsedNode.ranges[index]; - node.createAnimationRange(data.name, data.from, data.to); + setFloat3(uniformName, x, y, z) { + if (this._cacheFloat3(uniformName, x, y, z)) { + if (!this.engine.setFloat3(this._uniforms[uniformName], x, y, z)) { + this._valueCache[uniformName] = null; } } } /** - * Return the minimum and maximum world vectors of the entire hierarchy under current node - * @param includeDescendants Include bounding info from descendants as well (true by default) - * @param predicate defines a callback function that can be customize to filter what meshes should be included in the list used to compute the bounding vectors - * @returns the new bounding vectors + * Sets a Vector4 on a uniform variable. + * @param uniformName Name of the variable. + * @param vector4 Value to be set. */ - getHierarchyBoundingVectors(includeDescendants = true, predicate = null) { - this.getScene().incrementRenderId(); - this.computeWorldMatrix(true); - let min; - let max; - const thisAbstractMesh = this; - if (thisAbstractMesh.getBoundingInfo && thisAbstractMesh.subMeshes) { - const boundingInfo = thisAbstractMesh.getBoundingInfo(); - min = boundingInfo.boundingBox.minimumWorld.clone(); - max = boundingInfo.boundingBox.maximumWorld.clone(); - } else { - min = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); - max = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); - } - if (includeDescendants) { - const descendants = this.getDescendants(false); - for (const descendant of descendants) { - const childMesh = descendant; - childMesh.computeWorldMatrix(true); - if (predicate && !predicate(childMesh)) { - continue; - } - if (!childMesh.getBoundingInfo || childMesh.getTotalVertices() === 0) { - continue; - } - const childBoundingInfo = childMesh.getBoundingInfo(); - const boundingBox = childBoundingInfo.boundingBox; - const minBox = boundingBox.minimumWorld; - const maxBox = boundingBox.maximumWorld; - Vector3.CheckExtends(minBox, min, max); - Vector3.CheckExtends(maxBox, min, max); + setVector4(uniformName, vector4) { + if (this._cacheFloat4(uniformName, vector4.x, vector4.y, vector4.z, vector4.w)) { + if (!this.engine.setFloat4(this._uniforms[uniformName], vector4.x, vector4.y, vector4.z, vector4.w)) { + this._valueCache[uniformName] = null; } } - return { - min, - max - }; - } -}; -Node._AnimationRangeFactory = (_name, _from, _to) => { - throw _WarnImport("AnimationRange"); -}; -Node._NodeConstructors = {}; -__decorate([ - serialize() -], Node.prototype, "name", void 0); -__decorate([ - serialize() -], Node.prototype, "id", void 0); -__decorate([ - serialize() -], Node.prototype, "uniqueId", void 0); -__decorate([ - serialize() -], Node.prototype, "state", void 0); -__decorate([ - serialize() -], Node.prototype, "metadata", void 0); - -// node_modules/@babylonjs/core/Maths/math.size.js -var Size = class _Size { - /** - * Creates a Size object from the given width and height (floats). - * @param width width of the new size - * @param height height of the new size - */ - constructor(width, height) { - this.width = width; - this.height = height; } /** - * Returns a string with the Size width and height - * @returns a string with the Size width and height + * Sets a Quaternion on a uniform variable. + * @param uniformName Name of the variable. + * @param quaternion Value to be set. */ - toString() { - return `{W: ${this.width}, H: ${this.height}}`; + setQuaternion(uniformName, quaternion) { + if (this._cacheFloat4(uniformName, quaternion.x, quaternion.y, quaternion.z, quaternion.w)) { + if (!this.engine.setFloat4(this._uniforms[uniformName], quaternion.x, quaternion.y, quaternion.z, quaternion.w)) { + this._valueCache[uniformName] = null; + } + } } /** - * "Size" - * @returns the string "Size" + * Sets a float4 on a uniform variable. + * @param uniformName Name of the variable. + * @param x First float in float4. + * @param y Second float in float4. + * @param z Third float in float4. + * @param w Fourth float in float4. */ - getClassName() { - return "Size"; + setFloat4(uniformName, x, y, z, w) { + if (this._cacheFloat4(uniformName, x, y, z, w)) { + if (!this.engine.setFloat4(this._uniforms[uniformName], x, y, z, w)) { + this._valueCache[uniformName] = null; + } + } } /** - * Returns the Size hash code. - * @returns a hash code for a unique width and height + * Sets a Color3 on a uniform variable. + * @param uniformName Name of the variable. + * @param color3 Value to be set. */ - getHashCode() { - let hash = this.width | 0; - hash = hash * 397 ^ (this.height | 0); - return hash; + setColor3(uniformName, color3) { + if (this._cacheFloat3(uniformName, color3.r, color3.g, color3.b)) { + if (!this.engine.setFloat3(this._uniforms[uniformName], color3.r, color3.g, color3.b)) { + this._valueCache[uniformName] = null; + } + } } /** - * Updates the current size from the given one. - * @param src the given size + * Sets a Color4 on a uniform variable. + * @param uniformName Name of the variable. + * @param color3 Value to be set. + * @param alpha Alpha value to be set. */ - copyFrom(src) { - this.width = src.width; - this.height = src.height; + setColor4(uniformName, color3, alpha) { + if (this._cacheFloat4(uniformName, color3.r, color3.g, color3.b, alpha)) { + if (!this.engine.setFloat4(this._uniforms[uniformName], color3.r, color3.g, color3.b, alpha)) { + this._valueCache[uniformName] = null; + } + } } /** - * Updates in place the current Size from the given floats. - * @param width width of the new size - * @param height height of the new size - * @returns the updated Size. + * Sets a Color4 on a uniform variable + * @param uniformName defines the name of the variable + * @param color4 defines the value to be set */ - copyFromFloats(width, height) { - this.width = width; - this.height = height; - return this; + setDirectColor4(uniformName, color4) { + if (this._cacheFloat4(uniformName, color4.r, color4.g, color4.b, color4.a)) { + if (!this.engine.setFloat4(this._uniforms[uniformName], color4.r, color4.g, color4.b, color4.a)) { + this._valueCache[uniformName] = null; + } + } } - /** - * Updates in place the current Size from the given floats. - * @param width width to set - * @param height height to set - * @returns the updated Size. - */ - set(width, height) { - return this.copyFromFloats(width, height); + _getVertexShaderCode() { + return this.vertexShader ? this.engine._getShaderSource(this.vertexShader) : null; } - /** - * Multiplies the width and height by numbers - * @param w factor to multiple the width by - * @param h factor to multiple the height by - * @returns a new Size set with the multiplication result of the current Size and the given floats. - */ - multiplyByFloats(w, h) { - return new _Size(this.width * w, this.height * h); + _getFragmentShaderCode() { + return this.fragmentShader ? this.engine._getShaderSource(this.fragmentShader) : null; } - /** - * Clones the size - * @returns a new Size copied from the given one. - */ - clone() { - return new _Size(this.width, this.height); +}; + +// node_modules/@babylonjs/core/Engines/WebGL/webGLHardwareTexture.js +var WebGLHardwareTexture = class { + get underlyingResource() { + return this._webGLTexture; } - /** - * True if the current Size and the given one width and height are strictly equal. - * @param other the other size to compare against - * @returns True if the current Size and the given one width and height are strictly equal. - */ - equals(other) { - if (!other) { - return false; + constructor(existingTexture = null, context) { + this._MSAARenderBuffers = null; + this._context = context; + if (!existingTexture) { + existingTexture = context.createTexture(); + if (!existingTexture) { + throw new Error("Unable to create webGL texture"); + } } - return this.width === other.width && this.height === other.height; + this.set(existingTexture); } - /** - * The surface of the Size : width * height (float). - */ - get surface() { - return this.width * this.height; + setUsage() { } - /** - * Create a new size of zero - * @returns a new Size set to (0.0, 0.0) - */ - static Zero() { - return new _Size(0, 0); + set(hardwareTexture) { + this._webGLTexture = hardwareTexture; } - /** - * Sums the width and height of two sizes - * @param otherSize size to add to this size - * @returns a new Size set as the addition result of the current Size and the given one. - */ - add(otherSize) { - const r = new _Size(this.width + otherSize.width, this.height + otherSize.height); - return r; + reset() { + this._webGLTexture = null; + this._MSAARenderBuffers = null; } - /** - * Subtracts the width and height of two - * @param otherSize size to subtract to this size - * @returns a new Size set as the subtraction result of the given one from the current Size. - */ - subtract(otherSize) { - const r = new _Size(this.width - otherSize.width, this.height - otherSize.height); - return r; + addMSAARenderBuffer(buffer) { + if (!this._MSAARenderBuffers) { + this._MSAARenderBuffers = []; + } + this._MSAARenderBuffers.push(buffer); } - /** - * Scales the width and height - * @param scale the scale to multiply the width and height by - * @returns a new Size set with the multiplication result of the current Size and the given floats. - */ - scale(scale) { - return new _Size(this.width * scale, this.height * scale); + releaseMSAARenderBuffers() { + if (this._MSAARenderBuffers) { + for (const buffer of this._MSAARenderBuffers) { + this._context.deleteRenderbuffer(buffer); + } + this._MSAARenderBuffers = null; + } } - /** - * Creates a new Size set at the linear interpolation "amount" between "start" and "end" - * @param start starting size to lerp between - * @param end end size to lerp between - * @param amount amount to lerp between the start and end values - * @returns a new Size set at the linear interpolation "amount" between "start" and "end" - */ - static Lerp(start, end, amount) { - const w = start.width + (end.width - start.width) * amount; - const h = start.height + (end.height - start.height) * amount; - return new _Size(w, h); + getMSAARenderBuffer(index = 0) { + var _a; + return ((_a = this._MSAARenderBuffers) == null ? void 0 : _a[index]) ?? null; + } + release() { + this.releaseMSAARenderBuffers(); + if (this._webGLTexture) { + this._context.deleteTexture(this._webGLTexture); + } + this.reset(); } }; -// node_modules/@babylonjs/core/Misc/webRequest.js -function createXMLHttpRequest() { - if (typeof _native !== "undefined" && _native.XMLHttpRequest) { - return new _native.XMLHttpRequest(); - } else { - return new XMLHttpRequest(); +// node_modules/@babylonjs/core/Materials/drawWrapper.js +var DrawWrapper = class { + static IsWrapper(effect) { + return effect.getPipelineContext === void 0; } -} -var WebRequest = class _WebRequest { - constructor() { - this._xhr = createXMLHttpRequest(); - this._requestURL = ""; + static GetEffect(effect) { + return effect.getPipelineContext === void 0 ? effect.effect : effect; } - /** - * This function can be called to check if there are request modifiers for network requests - * @returns true if there are any custom requests available - */ - static get IsCustomRequestAvailable() { - return Object.keys(_WebRequest.CustomRequestHeaders).length > 0 || _WebRequest.CustomRequestModifiers.length > 0; + constructor(engine, createMaterialContext = true) { + this._wasPreviouslyReady = false; + this._forceRebindOnNextCall = true; + this._wasPreviouslyUsingInstances = null; + this.effect = null; + this.defines = null; + this.drawContext = engine.createDrawContext(); + if (createMaterialContext) { + this.materialContext = engine.createMaterialContext(); + } } - _injectCustomRequestHeaders() { - if (this._shouldSkipRequestModifications(this._requestURL)) { - return; + setEffect(effect, defines, resetContext = true) { + var _a; + this.effect = effect; + if (defines !== void 0) { + this.defines = defines; } - for (const key in _WebRequest.CustomRequestHeaders) { - const val = _WebRequest.CustomRequestHeaders[key]; - if (val) { - this._xhr.setRequestHeader(key, val); - } + if (resetContext) { + (_a = this.drawContext) == null ? void 0 : _a.reset(); } } - _shouldSkipRequestModifications(url) { - return _WebRequest.SkipRequestModificationForBabylonCDN && (url.includes("preview.babylonjs.com") || url.includes("cdn.babylonjs.com")); - } - /** - * Gets or sets a function to be called when loading progress changes - */ - get onprogress() { - return this._xhr.onprogress; + dispose() { + var _a; + (_a = this.drawContext) == null ? void 0 : _a.dispose(); } - set onprogress(value) { - this._xhr.onprogress = value; +}; + +// node_modules/@babylonjs/core/States/stencilStateComposer.js +var StencilStateComposer = class { + get isDirty() { + return this._isStencilTestDirty || this._isStencilMaskDirty || this._isStencilFuncDirty || this._isStencilOpDirty; } - /** - * Returns client's state - */ - get readyState() { - return this._xhr.readyState; + get func() { + return this._func; } - /** - * Returns client's status - */ - get status() { - return this._xhr.status; + set func(value) { + if (this._func === value) { + return; + } + this._func = value; + this._isStencilFuncDirty = true; } - /** - * Returns client's status as a text - */ - get statusText() { - return this._xhr.statusText; + get funcRef() { + return this._funcRef; } - /** - * Returns client's response - */ - get response() { - return this._xhr.response; + set funcRef(value) { + if (this._funcRef === value) { + return; + } + this._funcRef = value; + this._isStencilFuncDirty = true; } - /** - * Returns client's response url - */ - get responseURL() { - return this._xhr.responseURL; + get funcMask() { + return this._funcMask; } - /** - * Returns client's response as text - */ - get responseText() { - return this._xhr.responseText; + set funcMask(value) { + if (this._funcMask === value) { + return; + } + this._funcMask = value; + this._isStencilFuncDirty = true; } - /** - * Gets or sets the expected response type - */ - get responseType() { - return this._xhr.responseType; + get opStencilFail() { + return this._opStencilFail; } - set responseType(value) { - this._xhr.responseType = value; + set opStencilFail(value) { + if (this._opStencilFail === value) { + return; + } + this._opStencilFail = value; + this._isStencilOpDirty = true; } - /** - * Gets or sets the timeout value in milliseconds - */ - get timeout() { - return this._xhr.timeout; + get opDepthFail() { + return this._opDepthFail; } - set timeout(value) { - this._xhr.timeout = value; + set opDepthFail(value) { + if (this._opDepthFail === value) { + return; + } + this._opDepthFail = value; + this._isStencilOpDirty = true; } - addEventListener(type, listener, options) { - this._xhr.addEventListener(type, listener, options); + get opStencilDepthPass() { + return this._opStencilDepthPass; } - removeEventListener(type, listener, options) { - this._xhr.removeEventListener(type, listener, options); + set opStencilDepthPass(value) { + if (this._opStencilDepthPass === value) { + return; + } + this._opStencilDepthPass = value; + this._isStencilOpDirty = true; } - /** - * Cancels any network activity - */ - abort() { - this._xhr.abort(); + get mask() { + return this._mask; } - /** - * Initiates the request. The optional argument provides the request body. The argument is ignored if request method is GET or HEAD - * @param body defines an optional request body - */ - send(body) { - if (_WebRequest.CustomRequestHeaders) { - this._injectCustomRequestHeaders(); + set mask(value) { + if (this._mask === value) { + return; } - this._xhr.send(body); + this._mask = value; + this._isStencilMaskDirty = true; } - /** - * Sets the request method, request URL - * @param method defines the method to use (GET, POST, etc..) - * @param url defines the url to connect with - */ - open(method, url) { - for (const update of _WebRequest.CustomRequestModifiers) { - if (this._shouldSkipRequestModifications(url)) { - return; - } - update(this._xhr, url); + get enabled() { + return this._enabled; + } + set enabled(value) { + if (this._enabled === value) { + return; } - url = url.replace("file:http:", "http:"); - url = url.replace("file:https:", "https:"); - this._requestURL = url; - this._xhr.open(method, url, true); + this._enabled = value; + this._isStencilTestDirty = true; } - /** - * Sets the value of a request header. - * @param name The name of the header whose value is to be set - * @param value The value to set as the body of the header - */ - setRequestHeader(name69, value) { - this._xhr.setRequestHeader(name69, value); + constructor(reset = true) { + this._isStencilTestDirty = false; + this._isStencilMaskDirty = false; + this._isStencilFuncDirty = false; + this._isStencilOpDirty = false; + this.useStencilGlobalOnly = false; + if (reset) { + this.reset(); + } } - /** - * Get the string containing the text of a particular header's value. - * @param name The name of the header - * @returns The string containing the text of the given header name - */ - getResponseHeader(name69) { - return this._xhr.getResponseHeader(name69); + reset() { + var _a; + this.stencilMaterial = void 0; + (_a = this.stencilGlobal) == null ? void 0 : _a.reset(); + this._isStencilTestDirty = true; + this._isStencilMaskDirty = true; + this._isStencilFuncDirty = true; + this._isStencilOpDirty = true; } -}; -WebRequest.CustomRequestHeaders = {}; -WebRequest.CustomRequestModifiers = new Array(); -WebRequest.SkipRequestModificationForBabylonCDN = true; - -// node_modules/@babylonjs/core/Animations/animation.js -var _staticOffsetValueQuaternion = Object.freeze(new Quaternion(0, 0, 0, 0)); -var _staticOffsetValueVector3 = Object.freeze(Vector3.Zero()); -var _staticOffsetValueVector2 = Object.freeze(Vector2.Zero()); -var _staticOffsetValueSize = Object.freeze(Size.Zero()); -var _staticOffsetValueColor3 = Object.freeze(Color3.Black()); -var _staticOffsetValueColor4 = Object.freeze(new Color4(0, 0, 0, 0)); -var evaluateAnimationState = { - key: 0, - repeatCount: 0, - loopMode: 2 -}; -var Animation = class _Animation { - /** - * @internal Internal use - */ - static _PrepareAnimation(name69, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction) { - let dataType = void 0; - if (!isNaN(parseFloat(from)) && isFinite(from)) { - dataType = _Animation.ANIMATIONTYPE_FLOAT; - } else if (from instanceof Quaternion) { - dataType = _Animation.ANIMATIONTYPE_QUATERNION; - } else if (from instanceof Vector3) { - dataType = _Animation.ANIMATIONTYPE_VECTOR3; - } else if (from instanceof Vector2) { - dataType = _Animation.ANIMATIONTYPE_VECTOR2; - } else if (from instanceof Color3) { - dataType = _Animation.ANIMATIONTYPE_COLOR3; - } else if (from instanceof Color4) { - dataType = _Animation.ANIMATIONTYPE_COLOR4; - } else if (from instanceof Size) { - dataType = _Animation.ANIMATIONTYPE_SIZE; - } - if (dataType == void 0) { - return null; + apply(gl) { + var _a; + if (!gl) { + return; } - const animation = new _Animation(name69, targetProperty, framePerSecond, dataType, loopMode); - const keys = [ - { frame: 0, value: from }, - { frame: totalFrame, value: to } - ]; - animation.setKeys(keys); - if (easingFunction !== void 0) { - animation.setEasingFunction(easingFunction); + const stencilMaterialEnabled = !this.useStencilGlobalOnly && !!((_a = this.stencilMaterial) == null ? void 0 : _a.enabled); + this.enabled = stencilMaterialEnabled ? this.stencilMaterial.enabled : this.stencilGlobal.enabled; + this.func = stencilMaterialEnabled ? this.stencilMaterial.func : this.stencilGlobal.func; + this.funcRef = stencilMaterialEnabled ? this.stencilMaterial.funcRef : this.stencilGlobal.funcRef; + this.funcMask = stencilMaterialEnabled ? this.stencilMaterial.funcMask : this.stencilGlobal.funcMask; + this.opStencilFail = stencilMaterialEnabled ? this.stencilMaterial.opStencilFail : this.stencilGlobal.opStencilFail; + this.opDepthFail = stencilMaterialEnabled ? this.stencilMaterial.opDepthFail : this.stencilGlobal.opDepthFail; + this.opStencilDepthPass = stencilMaterialEnabled ? this.stencilMaterial.opStencilDepthPass : this.stencilGlobal.opStencilDepthPass; + this.mask = stencilMaterialEnabled ? this.stencilMaterial.mask : this.stencilGlobal.mask; + if (!this.isDirty) { + return; } - return animation; - } - /** - * Sets up an animation - * @param property The property to animate - * @param animationType The animation type to apply - * @param framePerSecond The frames per second of the animation - * @param easingFunction The easing function used in the animation - * @returns The created animation - */ - static CreateAnimation(property, animationType, framePerSecond, easingFunction) { - const animation = new _Animation(property + "Animation", property, framePerSecond, animationType, _Animation.ANIMATIONLOOPMODE_CONSTANT); - animation.setEasingFunction(easingFunction); - return animation; - } - /** - * Create and start an animation on a node - * @param name defines the name of the global animation that will be run on all nodes - * @param target defines the target where the animation will take place - * @param targetProperty defines property to animate - * @param framePerSecond defines the number of frame per second yo use - * @param totalFrame defines the number of frames in total - * @param from defines the initial value - * @param to defines the final value - * @param loopMode defines which loop mode you want to use (off by default) - * @param easingFunction defines the easing function to use (linear by default) - * @param onAnimationEnd defines the callback to call when animation end - * @param scene defines the hosting scene - * @returns the animatable created for this animation - */ - static CreateAndStartAnimation(name69, target, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction, onAnimationEnd, scene) { - const animation = _Animation._PrepareAnimation(name69, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction); - if (!animation) { - return null; + if (this._isStencilTestDirty) { + if (this.enabled) { + gl.enable(gl.STENCIL_TEST); + } else { + gl.disable(gl.STENCIL_TEST); + } + this._isStencilTestDirty = false; } - if (target.getScene) { - scene = target.getScene(); + if (this._isStencilMaskDirty) { + gl.stencilMask(this.mask); + this._isStencilMaskDirty = false; } - if (!scene) { - return null; + if (this._isStencilFuncDirty) { + gl.stencilFunc(this.func, this.funcRef, this.funcMask); + this._isStencilFuncDirty = false; } - return scene.beginDirectAnimation(target, [animation], 0, totalFrame, animation.loopMode === 1, 1, onAnimationEnd); - } - /** - * Create and start an animation on a node and its descendants - * @param name defines the name of the global animation that will be run on all nodes - * @param node defines the root node where the animation will take place - * @param directDescendantsOnly if true only direct descendants will be used, if false direct and also indirect (children of children, an so on in a recursive manner) descendants will be used - * @param targetProperty defines property to animate - * @param framePerSecond defines the number of frame per second to use - * @param totalFrame defines the number of frames in total - * @param from defines the initial value - * @param to defines the final value - * @param loopMode defines which loop mode you want to use (off by default) - * @param easingFunction defines the easing function to use (linear by default) - * @param onAnimationEnd defines the callback to call when an animation ends (will be called once per node) - * @returns the list of animatables created for all nodes - * @example https://www.babylonjs-playground.com/#MH0VLI - */ - static CreateAndStartHierarchyAnimation(name69, node, directDescendantsOnly, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction, onAnimationEnd) { - const animation = _Animation._PrepareAnimation(name69, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction); - if (!animation) { - return null; + if (this._isStencilOpDirty) { + gl.stencilOp(this.opStencilFail, this.opDepthFail, this.opStencilDepthPass); + this._isStencilOpDirty = false; } - const scene = node.getScene(); - return scene.beginDirectHierarchyAnimation(node, directDescendantsOnly, [animation], 0, totalFrame, animation.loopMode === 1, 1, onAnimationEnd); } - /** - * Creates a new animation, merges it with the existing animations and starts it - * @param name Name of the animation - * @param node Node which contains the scene that begins the animations - * @param targetProperty Specifies which property to animate - * @param framePerSecond The frames per second of the animation - * @param totalFrame The total number of frames - * @param from The frame at the beginning of the animation - * @param to The frame at the end of the animation - * @param loopMode Specifies the loop mode of the animation - * @param easingFunction (Optional) The easing function of the animation, which allow custom mathematical formulas for animations - * @param onAnimationEnd Callback to run once the animation is complete - * @returns Nullable animation - */ - static CreateMergeAndStartAnimation(name69, node, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction, onAnimationEnd) { - const animation = _Animation._PrepareAnimation(name69, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction); - if (!animation) { - return null; - } - node.animations.push(animation); - return node.getScene().beginAnimation(node, 0, totalFrame, animation.loopMode === 1, 1, onAnimationEnd); +}; + +// node_modules/@babylonjs/core/Engines/WebGL/webGLShaderProcessors.js +var WebGLShaderProcessor = class { + constructor() { + this.shaderLanguage = ShaderLanguage.GLSL; } - /** @internal */ - static MakeAnimationAdditive(sourceAnimation, referenceFrameOrOptions, range, cloneOriginal = false, clonedName) { - let options; - if (typeof referenceFrameOrOptions === "object") { - options = referenceFrameOrOptions; - } else { - options = { - referenceFrame: referenceFrameOrOptions ?? 0, - range, - cloneOriginalAnimation: cloneOriginal, - clonedAnimationName: clonedName - }; - } - let animation = sourceAnimation; - if (options.cloneOriginalAnimation) { - animation = sourceAnimation.clone(); - animation.name = options.clonedAnimationName || animation.name; - } - if (!animation._keys.length) { - return animation; - } - const referenceFrame = options.referenceFrame && options.referenceFrame >= 0 ? options.referenceFrame : 0; - let startIndex = 0; - const firstKey = animation._keys[0]; - let endIndex = animation._keys.length - 1; - const lastKey = animation._keys[endIndex]; - const valueStore = { - referenceValue: firstKey.value, - referencePosition: TmpVectors.Vector3[0], - referenceQuaternion: TmpVectors.Quaternion[0], - referenceScaling: TmpVectors.Vector3[1], - keyPosition: TmpVectors.Vector3[2], - keyQuaternion: TmpVectors.Quaternion[1], - keyScaling: TmpVectors.Vector3[3] - }; - let from = firstKey.frame; - let to = lastKey.frame; - if (options.range) { - const rangeValue = animation.getRange(options.range); - if (rangeValue) { - from = rangeValue.from; - to = rangeValue.to; - } - } else { - from = options.fromFrame ?? from; - to = options.toFrame ?? to; - } - if (from !== firstKey.frame) { - startIndex = animation.createKeyForFrame(from); - } - if (to !== lastKey.frame) { - endIndex = animation.createKeyForFrame(to); - } - if (animation._keys.length === 1) { - const value = animation._getKeyValue(animation._keys[0]); - valueStore.referenceValue = value.clone ? value.clone() : value; - } else if (referenceFrame <= firstKey.frame) { - const value = animation._getKeyValue(firstKey.value); - valueStore.referenceValue = value.clone ? value.clone() : value; - } else if (referenceFrame >= lastKey.frame) { - const value = animation._getKeyValue(lastKey.value); - valueStore.referenceValue = value.clone ? value.clone() : value; - } else { - evaluateAnimationState.key = 0; - const value = animation._interpolate(referenceFrame, evaluateAnimationState); - valueStore.referenceValue = value.clone ? value.clone() : value; - } - if (animation.dataType === _Animation.ANIMATIONTYPE_QUATERNION) { - valueStore.referenceValue.normalize().conjugateInPlace(); - } else if (animation.dataType === _Animation.ANIMATIONTYPE_MATRIX) { - valueStore.referenceValue.decompose(valueStore.referenceScaling, valueStore.referenceQuaternion, valueStore.referencePosition); - valueStore.referenceQuaternion.normalize().conjugateInPlace(); - } - let startFrame = Number.MAX_VALUE; - const clippedKeys = options.clipKeys ? [] : null; - for (let index = startIndex; index <= endIndex; index++) { - let key = animation._keys[index]; - if (clippedKeys) { - key = { - frame: key.frame, - value: key.value.clone ? key.value.clone() : key.value, - inTangent: key.inTangent, - outTangent: key.outTangent, - interpolation: key.interpolation, - lockedTangent: key.lockedTangent - }; - if (startFrame === Number.MAX_VALUE) { - startFrame = key.frame; - } - key.frame -= startFrame; - clippedKeys.push(key); - } - if (index && animation.dataType !== _Animation.ANIMATIONTYPE_FLOAT && key.value === firstKey.value) { - continue; - } - switch (animation.dataType) { - case _Animation.ANIMATIONTYPE_MATRIX: - key.value.decompose(valueStore.keyScaling, valueStore.keyQuaternion, valueStore.keyPosition); - valueStore.keyPosition.subtractInPlace(valueStore.referencePosition); - valueStore.keyScaling.divideInPlace(valueStore.referenceScaling); - valueStore.referenceQuaternion.multiplyToRef(valueStore.keyQuaternion, valueStore.keyQuaternion); - Matrix.ComposeToRef(valueStore.keyScaling, valueStore.keyQuaternion, valueStore.keyPosition, key.value); - break; - case _Animation.ANIMATIONTYPE_QUATERNION: - valueStore.referenceValue.multiplyToRef(key.value, key.value); - break; - case _Animation.ANIMATIONTYPE_VECTOR2: - case _Animation.ANIMATIONTYPE_VECTOR3: - case _Animation.ANIMATIONTYPE_COLOR3: - case _Animation.ANIMATIONTYPE_COLOR4: - key.value.subtractToRef(valueStore.referenceValue, key.value); - break; - case _Animation.ANIMATIONTYPE_SIZE: - key.value.width -= valueStore.referenceValue.width; - key.value.height -= valueStore.referenceValue.height; - break; - default: - key.value -= valueStore.referenceValue; - } - } - if (clippedKeys) { - animation.setKeys(clippedKeys, true); + postProcessor(code, defines, isFragment, processingContext, engine) { + if (!engine.getCaps().drawBuffersExtension) { + const regex = /#extension.+GL_EXT_draw_buffers.+(enable|require)/g; + code = code.replace(regex, ""); } - return animation; + return code; } +}; + +// node_modules/@babylonjs/core/Engines/thinEngine.js +var BufferPointer = class { +}; +var ThinEngine = class _ThinEngine { /** - * Transition property of an host to the target Value - * @param property The property to transition - * @param targetValue The target Value of the property - * @param host The object where the property to animate belongs - * @param scene Scene used to run the animation - * @param frameRate Framerate (in frame/s) to use - * @param transition The transition type we want to use - * @param duration The duration of the animation, in milliseconds - * @param onAnimationEnd Callback trigger at the end of the animation - * @returns Nullable animation + * Returns the current npm package of the sdk */ - static TransitionTo(property, targetValue, host, scene, frameRate, transition, duration, onAnimationEnd = null) { - if (duration <= 0) { - host[property] = targetValue; - if (onAnimationEnd) { - onAnimationEnd(); - } - return null; - } - const endFrame = frameRate * (duration / 1e3); - transition.setKeys([ - { - frame: 0, - value: host[property].clone ? host[property].clone() : host[property] - }, - { - frame: endFrame, - value: targetValue - } - ]); - if (!host.animations) { - host.animations = []; - } - host.animations.push(transition); - const animation = scene.beginAnimation(host, 0, endFrame, false); - animation.onAnimationEnd = onAnimationEnd; - return animation; + // Not mixed with Version for tooling purpose. + static get NpmPackage() { + return "babylonjs@7.1.0"; } /** - * Return the array of runtime animations currently using this animation + * Returns the current version of the framework */ - get runtimeAnimations() { - return this._runtimeAnimations; + static get Version() { + return "7.1.0"; } /** - * Specifies if any of the runtime animations are currently running + * Returns a string describing the current engine */ - get hasRunningRuntimeAnimations() { - for (const runtimeAnimation of this._runtimeAnimations) { - if (!runtimeAnimation.isStopped()) { - return true; - } + get description() { + let description = this.name + this.webGLVersion; + if (this._caps.parallelShaderCompile) { + description += " - Parallel shader compilation"; } - return false; + return description; } /** - * Initializes the animation - * @param name Name of the animation - * @param targetProperty Property to animate - * @param framePerSecond The frames per second of the animation - * @param dataType The data type of the animation - * @param loopMode The loop mode of the animation - * @param enableBlending Specifies if blending should be enabled + * Gets or sets the name of the engine */ - constructor(name69, targetProperty, framePerSecond, dataType, loopMode, enableBlending) { - this.name = name69; - this.targetProperty = targetProperty; - this.framePerSecond = framePerSecond; - this.dataType = dataType; - this.loopMode = loopMode; - this.enableBlending = enableBlending; - this._easingFunction = null; - this._runtimeAnimations = new Array(); - this._events = new Array(); - this.blendingSpeed = 0.01; - this._ranges = {}; - this.targetPropertyPath = targetProperty.split("."); - this.dataType = dataType; - this.loopMode = loopMode === void 0 ? _Animation.ANIMATIONLOOPMODE_CYCLE : loopMode; - this.uniqueId = _Animation._UniqueIdGenerator++; + get name() { + return this._name; } - // Methods - /** - * Converts the animation to a string - * @param fullDetails support for multiple levels of logging within scene loading - * @returns String form of the animation - */ - toString(fullDetails) { - let ret = "Name: " + this.name + ", property: " + this.targetProperty; - ret += ", datatype: " + ["Float", "Vector3", "Quaternion", "Matrix", "Color3", "Vector2"][this.dataType]; - ret += ", nKeys: " + (this._keys ? this._keys.length : "none"); - ret += ", nRanges: " + (this._ranges ? Object.keys(this._ranges).length : "none"); - if (fullDetails) { - ret += ", Ranges: {"; - let first = true; - for (const name69 in this._ranges) { - if (first) { - ret += ", "; - first = false; - } - ret += name69; - } - ret += "}"; - } - return ret; + set name(value) { + this._name = value; } /** - * Add an event to this animation - * @param event Event to add + * Returns the version of the engine */ - addEvent(event) { - this._events.push(event); - this._events.sort((a, b) => a.frame - b.frame); + get version() { + return this._webGLVersion; } - /** - * Remove all events found at the given frame - * @param frame The frame to remove events from - */ - removeEvents(frame) { - for (let index = 0; index < this._events.length; index++) { - if (this._events[index].frame === frame) { - this._events.splice(index, 1); - index--; - } - } + get isDisposed() { + return this._isDisposed; } /** - * Retrieves all the events from the animation - * @returns Events from the animation + * Gets or sets the relative url used to load shaders if using the engine in non-minified mode */ - getEvents() { - return this._events; + static get ShadersRepository() { + return Effect.ShadersRepository; + } + static set ShadersRepository(value) { + Effect.ShadersRepository = value; } /** - * Creates an animation range - * @param name Name of the animation range - * @param from Starting frame of the animation range - * @param to Ending frame of the animation + * @internal */ - createRange(name69, from, to) { - if (!this._ranges[name69]) { - this._ranges[name69] = new AnimationRange(name69, from, to); - } + _getShaderProcessor(shaderLanguage) { + return this._shaderProcessor; } /** - * Deletes an animation range by name - * @param name Name of the animation range to delete - * @param deleteFrames Specifies if the key frames for the range should also be deleted (true) or not (false) + * Gets or sets a boolean indicating if depth buffer should be reverse, going from far to near. + * This can provide greater z depth for distant objects. */ - deleteRange(name69, deleteFrames = true) { - const range = this._ranges[name69]; - if (!range) { + get useReverseDepthBuffer() { + return this._useReverseDepthBuffer; + } + set useReverseDepthBuffer(useReverse) { + if (useReverse === this._useReverseDepthBuffer) { return; } - if (deleteFrames) { - const from = range.from; - const to = range.to; - for (let key = this._keys.length - 1; key >= 0; key--) { - if (this._keys[key].frame >= from && this._keys[key].frame <= to) { - this._keys.splice(key, 1); - } - } + this._useReverseDepthBuffer = useReverse; + if (useReverse) { + this._depthCullingState.depthFunc = 518; + } else { + this._depthCullingState.depthFunc = 515; } - this._ranges[name69] = null; } /** - * Gets the animation range by name, or null if not defined - * @param name Name of the animation range - * @returns Nullable animation range + * Gets the current frame id */ - getRange(name69) { - return this._ranges[name69]; + get frameId() { + return this._frameId; } /** - * Gets the key frames from the animation - * @returns The key frames of the animation + * Gets a boolean indicating that the engine supports uniform buffers + * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets */ - getKeys() { - return this._keys; + get supportsUniformBuffers() { + return this.webGLVersion > 1 && !this.disableUniformBuffers; } /** - * Gets the highest frame rate of the animation - * @returns Highest frame rate of the animation + * Gets the options used for engine creation + * @returns EngineOptions object */ - getHighestFrame() { - let ret = 0; - for (let key = 0, nKeys = this._keys.length; key < nKeys; key++) { - if (ret < this._keys[key].frame) { - ret = this._keys[key].frame; - } - } - return ret; + getCreationOptions() { + return this._creationOptions; + } + /** @internal */ + get _shouldUseHighPrecisionShader() { + return !!(this._caps.highPrecisionShaderSupported && this._highPrecisionShadersAllowed); } /** - * Gets the easing function of the animation - * @returns Easing function of the animation + * Gets a boolean indicating that only power of 2 textures are supported + * Please note that you can still use non power of 2 textures but in this case the engine will forcefully convert them */ - getEasingFunction() { - return this._easingFunction; + get needPOTTextures() { + return this._webGLVersion < 2 || this.forcePOTTextures; } /** - * Sets the easing function of the animation - * @param easingFunction A custom mathematical formula for animation + * Gets the list of current active render loop functions + * @returns a read only array with the current render loop functions */ - setEasingFunction(easingFunction) { - this._easingFunction = easingFunction; + get activeRenderLoops() { + return this._activeRenderLoops; } /** - * Interpolates a scalar linearly - * @param startValue Start value of the animation curve - * @param endValue End value of the animation curve - * @param gradient Scalar amount to interpolate - * @returns Interpolated scalar value + * Gets or sets a boolean indicating if resources should be retained to be able to handle context lost events + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#handling-webgl-context-lost */ - floatInterpolateFunction(startValue, endValue, gradient) { - return Scalar.Lerp(startValue, endValue, gradient); + get doNotHandleContextLost() { + return this._doNotHandleContextLost; } - /** - * Interpolates a scalar cubically - * @param startValue Start value of the animation curve - * @param outTangent End tangent of the animation - * @param endValue End value of the animation curve - * @param inTangent Start tangent of the animation curve - * @param gradient Scalar amount to interpolate - * @returns Interpolated scalar value - */ - floatInterpolateFunctionWithTangents(startValue, outTangent, endValue, inTangent, gradient) { - return Scalar.Hermite(startValue, outTangent, endValue, inTangent, gradient); + set doNotHandleContextLost(value) { + this._doNotHandleContextLost = value; + } + get _supportsHardwareTextureRescaling() { + return false; } /** - * Interpolates a quaternion using a spherical linear interpolation - * @param startValue Start value of the animation curve - * @param endValue End value of the animation curve - * @param gradient Scalar amount to interpolate - * @returns Interpolated quaternion value + * sets the object from which width and height will be taken from when getting render width and height + * Will fallback to the gl object + * @param dimensions the framebuffer width and height that will be used. */ - quaternionInterpolateFunction(startValue, endValue, gradient) { - return Quaternion.Slerp(startValue, endValue, gradient); + set framebufferDimensionsObject(dimensions) { + this._framebufferDimensionsObject = dimensions; } /** - * Interpolates a quaternion cubically - * @param startValue Start value of the animation curve - * @param outTangent End tangent of the animation curve - * @param endValue End value of the animation curve - * @param inTangent Start tangent of the animation curve - * @param gradient Scalar amount to interpolate - * @returns Interpolated quaternion value + * Gets the current viewport */ - quaternionInterpolateFunctionWithTangents(startValue, outTangent, endValue, inTangent, gradient) { - return Quaternion.Hermite(startValue, outTangent, endValue, inTangent, gradient).normalize(); + get currentViewport() { + return this._cachedViewport; } /** - * Interpolates a Vector3 linearly - * @param startValue Start value of the animation curve - * @param endValue End value of the animation curve - * @param gradient Scalar amount to interpolate (value between 0 and 1) - * @returns Interpolated scalar value + * Gets the default empty texture */ - vector3InterpolateFunction(startValue, endValue, gradient) { - return Vector3.Lerp(startValue, endValue, gradient); + get emptyTexture() { + if (!this._emptyTexture) { + this._emptyTexture = this.createRawTexture(new Uint8Array(4), 1, 1, 5, false, false, 1); + } + return this._emptyTexture; } /** - * Interpolates a Vector3 cubically - * @param startValue Start value of the animation curve - * @param outTangent End tangent of the animation - * @param endValue End value of the animation curve - * @param inTangent Start tangent of the animation curve - * @param gradient Scalar amount to interpolate (value between 0 and 1) - * @returns InterpolatedVector3 value + * Gets the default empty 3D texture */ - vector3InterpolateFunctionWithTangents(startValue, outTangent, endValue, inTangent, gradient) { - return Vector3.Hermite(startValue, outTangent, endValue, inTangent, gradient); + get emptyTexture3D() { + if (!this._emptyTexture3D) { + this._emptyTexture3D = this.createRawTexture3D(new Uint8Array(4), 1, 1, 1, 5, false, false, 1); + } + return this._emptyTexture3D; } /** - * Interpolates a Vector2 linearly - * @param startValue Start value of the animation curve - * @param endValue End value of the animation curve - * @param gradient Scalar amount to interpolate (value between 0 and 1) - * @returns Interpolated Vector2 value + * Gets the default empty 2D array texture */ - vector2InterpolateFunction(startValue, endValue, gradient) { - return Vector2.Lerp(startValue, endValue, gradient); + get emptyTexture2DArray() { + if (!this._emptyTexture2DArray) { + this._emptyTexture2DArray = this.createRawTexture2DArray(new Uint8Array(4), 1, 1, 1, 5, false, false, 1); + } + return this._emptyTexture2DArray; } /** - * Interpolates a Vector2 cubically - * @param startValue Start value of the animation curve - * @param outTangent End tangent of the animation - * @param endValue End value of the animation curve - * @param inTangent Start tangent of the animation curve - * @param gradient Scalar amount to interpolate (value between 0 and 1) - * @returns Interpolated Vector2 value + * Gets the default empty cube texture */ - vector2InterpolateFunctionWithTangents(startValue, outTangent, endValue, inTangent, gradient) { - return Vector2.Hermite(startValue, outTangent, endValue, inTangent, gradient); + get emptyCubeTexture() { + if (!this._emptyCubeTexture) { + const faceData = new Uint8Array(4); + const cubeData = [faceData, faceData, faceData, faceData, faceData, faceData]; + this._emptyCubeTexture = this.createRawCubeTexture(cubeData, 1, 5, 0, false, false, 1); + } + return this._emptyCubeTexture; } /** - * Interpolates a size linearly - * @param startValue Start value of the animation curve - * @param endValue End value of the animation curve - * @param gradient Scalar amount to interpolate - * @returns Interpolated Size value + * Gets a boolean indicating if the engine runs in WebGPU or not. */ - sizeInterpolateFunction(startValue, endValue, gradient) { - return Size.Lerp(startValue, endValue, gradient); + get isWebGPU() { + return this._isWebGPU; } /** - * Interpolates a Color3 linearly - * @param startValue Start value of the animation curve - * @param endValue End value of the animation curve - * @param gradient Scalar amount to interpolate - * @returns Interpolated Color3 value + * Gets the shader platform name used by the effects. */ - color3InterpolateFunction(startValue, endValue, gradient) { - return Color3.Lerp(startValue, endValue, gradient); + get shaderPlatformName() { + return this._shaderPlatformName; } /** - * Interpolates a Color3 cubically - * @param startValue Start value of the animation curve - * @param outTangent End tangent of the animation - * @param endValue End value of the animation curve - * @param inTangent Start tangent of the animation curve - * @param gradient Scalar amount to interpolate - * @returns interpolated value + * Enables or disables the snapshot rendering mode + * Note that the WebGL engine does not support snapshot rendering so setting the value won't have any effect for this engine */ - color3InterpolateFunctionWithTangents(startValue, outTangent, endValue, inTangent, gradient) { - return Color3.Hermite(startValue, outTangent, endValue, inTangent, gradient); + get snapshotRendering() { + return false; + } + set snapshotRendering(activate) { } /** - * Interpolates a Color4 linearly - * @param startValue Start value of the animation curve - * @param endValue End value of the animation curve - * @param gradient Scalar amount to interpolate - * @returns Interpolated Color3 value + * Gets or sets the snapshot rendering mode */ - color4InterpolateFunction(startValue, endValue, gradient) { - return Color4.Lerp(startValue, endValue, gradient); + get snapshotRenderingMode() { + return this._snapshotRenderingMode; + } + set snapshotRenderingMode(mode) { + this._snapshotRenderingMode = mode; } /** - * Interpolates a Color4 cubically - * @param startValue Start value of the animation curve - * @param outTangent End tangent of the animation - * @param endValue End value of the animation curve - * @param inTangent Start tangent of the animation curve - * @param gradient Scalar amount to interpolate - * @returns interpolated value + * Creates a new snapshot at the next frame using the current snapshotRenderingMode */ - color4InterpolateFunctionWithTangents(startValue, outTangent, endValue, inTangent, gradient) { - return Color4.Hermite(startValue, outTangent, endValue, inTangent, gradient); + snapshotRenderingReset() { + this.snapshotRendering = false; + } + static _CreateCanvas(width, height) { + if (typeof document === "undefined") { + return new OffscreenCanvas(width, height); + } + const canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + return canvas; } /** - * @internal Internal use only + * Create a canvas. This method is overridden by other engines + * @param width width + * @param height height + * @returns ICanvas interface */ - _getKeyValue(value) { - if (typeof value === "function") { - return value(); - } - return value; + createCanvas(width, height) { + return _ThinEngine._CreateCanvas(width, height); } /** - * Evaluate the animation value at a given frame - * @param currentFrame defines the frame where we want to evaluate the animation - * @returns the animation value + * Create an image to use with canvas + * @returns IImage interface */ - evaluate(currentFrame) { - evaluateAnimationState.key = 0; - return this._interpolate(currentFrame, evaluateAnimationState); + createCanvasImage() { + return document.createElement("img"); } /** - * @internal Internal use only + * Creates a new engine + * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which already used the WebGL context + * @param antialias defines enable antialiasing (default: false) + * @param options defines further options to be sent to the getContext() function + * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false) */ - _interpolate(currentFrame, state, searchClosestKeyOnly = false) { - if (state.loopMode === _Animation.ANIMATIONLOOPMODE_CONSTANT && state.repeatCount > 0) { - return state.highLimitValue.clone ? state.highLimitValue.clone() : state.highLimitValue; - } - const keys = this._keys; - const keysLength = keys.length; - let key = state.key; - while (key >= 0 && currentFrame < keys[key].frame) { - --key; - } - while (key + 1 <= keysLength - 1 && currentFrame >= keys[key + 1].frame) { - ++key; - } - state.key = key; - if (key < 0) { - return searchClosestKeyOnly ? void 0 : this._getKeyValue(keys[0].value); - } else if (key + 1 > keysLength - 1) { - return searchClosestKeyOnly ? void 0 : this._getKeyValue(keys[keysLength - 1].value); - } - const startKey = keys[key]; - const endKey = keys[key + 1]; - if (searchClosestKeyOnly && (currentFrame === startKey.frame || currentFrame === endKey.frame)) { - return void 0; + constructor(canvasOrContext, antialias, options, adaptToDeviceRatio) { + var _a, _b; + this._name = "WebGL"; + this._isDisposed = false; + this.forcePOTTextures = false; + this.isFullscreen = false; + this.cullBackFaces = null; + this.renderEvenInBackground = true; + this.preventCacheWipeBetweenFrames = false; + this.validateShaderPrograms = false; + this._useReverseDepthBuffer = false; + this.isNDCHalfZRange = false; + this.hasOriginBottomLeft = true; + this.disableUniformBuffers = false; + this.onDisposeObservable = new Observable(); + this._frameId = 0; + this._uniformBuffers = new Array(); + this._storageBuffers = new Array(); + this._webGLVersion = 1; + this._windowIsBackground = false; + this._highPrecisionShadersAllowed = true; + this._badOS = false; + this._badDesktopOS = false; + this._activeRenderLoops = new Array(); + this.onContextLostObservable = new Observable(); + this.onContextRestoredObservable = new Observable(); + this._contextWasLost = false; + this._doNotHandleContextLost = false; + this.disableVertexArrayObjects = false; + this._colorWrite = true; + this._colorWriteChanged = true; + this._depthCullingState = new DepthCullingState(); + this._stencilStateComposer = new StencilStateComposer(); + this._stencilState = new StencilState(); + this._alphaState = new AlphaState(); + this._alphaMode = 1; + this._alphaEquation = 0; + this._internalTexturesCache = new Array(); + this._renderTargetWrapperCache = new Array(); + this._activeChannel = 0; + this._currentTextureChannel = -1; + this._boundTexturesCache = {}; + this._compiledEffects = {}; + this._vertexAttribArraysEnabled = []; + this._currentRenderTarget = null; + this._uintIndicesCurrentlySet = false; + this._currentBoundBuffer = new Array(); + this._currentFramebuffer = null; + this._dummyFramebuffer = null; + this._currentBufferPointers = new Array(); + this._currentInstanceLocations = new Array(); + this._currentInstanceBuffers = new Array(); + this._boundRenderFunction = () => this._renderLoop(); + this._vaoRecordInProgress = false; + this._mustWipeVertexAttributes = false; + this._frameHandler = 0; + this._nextFreeTextureSlots = new Array(); + this._maxSimultaneousTextures = 0; + this._maxMSAASamplesOverride = null; + this._activeRequests = new Array(); + this.adaptToDeviceRatio = false; + this._lastDevicePixelRatio = 1; + this._transformTextureUrl = null; + this.hostInformation = { + isMobile: false + }; + this.premultipliedAlpha = true; + this.onBeforeTextureInitObservable = new Observable(); + this._isWebGPU = false; + this._snapshotRenderingMode = 0; + this._viewportCached = { x: 0, y: 0, z: 0, w: 0 }; + this._unpackFlipYCached = null; + this.enableUnpackFlipYCached = true; + this._boundUniforms = {}; + this.startTime = PrecisionDate.Now; + let canvas = null; + options = options || {}; + this._creationOptions = options; + this.adaptToDeviceRatio = adaptToDeviceRatio ?? false; + this._stencilStateComposer.stencilGlobal = this._stencilState; + PerformanceConfigurator.SetMatrixPrecision(!!options.useHighPrecisionMatrix); + options.antialias = antialias ?? options.antialias; + options.deterministicLockstep = options.deterministicLockstep ?? false; + options.lockstepMaxSteps = options.lockstepMaxSteps ?? 4; + options.timeStep = options.timeStep ?? 1 / 60; + options.audioEngine = options.audioEngine ?? true; + options.stencil = options.stencil ?? true; + this._audioContext = ((_a = options.audioEngineOptions) == null ? void 0 : _a.audioContext) ?? null; + this._audioDestination = ((_b = options.audioEngineOptions) == null ? void 0 : _b.audioDestination) ?? null; + this.premultipliedAlpha = options.premultipliedAlpha ?? true; + this.useExactSrgbConversions = options.useExactSrgbConversions ?? false; + this._doNotHandleContextLost = !!options.doNotHandleContextLost; + this._isStencilEnable = options.stencil ? true : false; + adaptToDeviceRatio = adaptToDeviceRatio || options.adaptToDeviceRatio || false; + const devicePixelRatio = IsWindowObjectExist() ? window.devicePixelRatio || 1 : 1; + const limitDeviceRatio = options.limitDeviceRatio || devicePixelRatio; + this._hardwareScalingLevel = adaptToDeviceRatio ? 1 / Math.min(limitDeviceRatio, devicePixelRatio) : 1; + this._lastDevicePixelRatio = devicePixelRatio; + if (!canvasOrContext) { + return; } - const startValue = this._getKeyValue(startKey.value); - const endValue = this._getKeyValue(endKey.value); - if (startKey.interpolation === AnimationKeyInterpolation.STEP) { - if (endKey.frame > currentFrame) { - return startValue; - } else { - return endValue; + if (canvasOrContext.getContext) { + canvas = canvasOrContext; + this._renderingCanvas = canvas; + if (options.preserveDrawingBuffer === void 0) { + options.preserveDrawingBuffer = false; } - } - const useTangent = startKey.outTangent !== void 0 && endKey.inTangent !== void 0; - const frameDelta = endKey.frame - startKey.frame; - let gradient = (currentFrame - startKey.frame) / frameDelta; - const easingFunction = startKey.easingFunction || this.getEasingFunction(); - if (easingFunction !== null) { - gradient = easingFunction.ease(gradient); - } - switch (this.dataType) { - case _Animation.ANIMATIONTYPE_FLOAT: { - const floatValue = useTangent ? this.floatInterpolateFunctionWithTangents(startValue, startKey.outTangent * frameDelta, endValue, endKey.inTangent * frameDelta, gradient) : this.floatInterpolateFunction(startValue, endValue, gradient); - switch (state.loopMode) { - case _Animation.ANIMATIONLOOPMODE_CYCLE: - case _Animation.ANIMATIONLOOPMODE_CONSTANT: - case _Animation.ANIMATIONLOOPMODE_YOYO: - return floatValue; - case _Animation.ANIMATIONLOOPMODE_RELATIVE: - case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: - return (state.offsetValue ?? 0) * state.repeatCount + floatValue; - } - break; + if (options.xrCompatible === void 0) { + options.xrCompatible = true; } - case _Animation.ANIMATIONTYPE_QUATERNION: { - const quatValue = useTangent ? this.quaternionInterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient) : this.quaternionInterpolateFunction(startValue, endValue, gradient); - switch (state.loopMode) { - case _Animation.ANIMATIONLOOPMODE_CYCLE: - case _Animation.ANIMATIONLOOPMODE_CONSTANT: - case _Animation.ANIMATIONLOOPMODE_YOYO: - return quatValue; - case _Animation.ANIMATIONLOOPMODE_RELATIVE: - case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: - return quatValue.addInPlace((state.offsetValue || _staticOffsetValueQuaternion).scale(state.repeatCount)); + if (navigator && navigator.userAgent) { + this._setupMobileChecks(); + const ua = navigator.userAgent; + for (const exception of _ThinEngine.ExceptionList) { + const key = exception.key; + const targets = exception.targets; + const check = new RegExp(key); + if (check.test(ua)) { + if (exception.capture && exception.captureConstraint) { + const capture = exception.capture; + const constraint = exception.captureConstraint; + const regex = new RegExp(capture); + const matches = regex.exec(ua); + if (matches && matches.length > 0) { + const capturedValue = parseInt(matches[matches.length - 1]); + if (capturedValue >= constraint) { + continue; + } + } + } + for (const target of targets) { + switch (target) { + case "uniformBuffer": + this.disableUniformBuffers = true; + break; + case "vao": + this.disableVertexArrayObjects = true; + break; + case "antialias": + options.antialias = false; + break; + case "maxMSAASamples": + this._maxMSAASamplesOverride = 1; + break; + } + } + } } - return quatValue; } - case _Animation.ANIMATIONTYPE_VECTOR3: { - const vec3Value = useTangent ? this.vector3InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient) : this.vector3InterpolateFunction(startValue, endValue, gradient); - switch (state.loopMode) { - case _Animation.ANIMATIONLOOPMODE_CYCLE: - case _Animation.ANIMATIONLOOPMODE_CONSTANT: - case _Animation.ANIMATIONLOOPMODE_YOYO: - return vec3Value; - case _Animation.ANIMATIONLOOPMODE_RELATIVE: - case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: - return vec3Value.add((state.offsetValue || _staticOffsetValueVector3).scale(state.repeatCount)); - } - break; + if (!this._doNotHandleContextLost) { + this._onContextLost = (evt) => { + evt.preventDefault(); + this._contextWasLost = true; + Logger.Warn("WebGL context lost."); + this.onContextLostObservable.notifyObservers(this); + }; + this._onContextRestored = () => { + this._restoreEngineAfterContextLost(() => this._initGLContext()); + }; + canvas.addEventListener("webglcontextlost", this._onContextLost, false); + canvas.addEventListener("webglcontextrestored", this._onContextRestored, false); + options.powerPreference = options.powerPreference || "high-performance"; } - case _Animation.ANIMATIONTYPE_VECTOR2: { - const vec2Value = useTangent ? this.vector2InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient) : this.vector2InterpolateFunction(startValue, endValue, gradient); - switch (state.loopMode) { - case _Animation.ANIMATIONLOOPMODE_CYCLE: - case _Animation.ANIMATIONLOOPMODE_CONSTANT: - case _Animation.ANIMATIONLOOPMODE_YOYO: - return vec2Value; - case _Animation.ANIMATIONLOOPMODE_RELATIVE: - case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: - return vec2Value.add((state.offsetValue || _staticOffsetValueVector2).scale(state.repeatCount)); - } - break; + this._badDesktopOS = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); + if (this._badDesktopOS) { + options.xrCompatible = false; } - case _Animation.ANIMATIONTYPE_SIZE: { - switch (state.loopMode) { - case _Animation.ANIMATIONLOOPMODE_CYCLE: - case _Animation.ANIMATIONLOOPMODE_CONSTANT: - case _Animation.ANIMATIONLOOPMODE_YOYO: - return this.sizeInterpolateFunction(startValue, endValue, gradient); - case _Animation.ANIMATIONLOOPMODE_RELATIVE: - case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: - return this.sizeInterpolateFunction(startValue, endValue, gradient).add((state.offsetValue || _staticOffsetValueSize).scale(state.repeatCount)); + if (!options.disableWebGL2Support) { + try { + this._gl = canvas.getContext("webgl2", options) || canvas.getContext("experimental-webgl2", options); + if (this._gl) { + this._webGLVersion = 2; + this._shaderPlatformName = "WEBGL2"; + if (!this._gl.deleteQuery) { + this._webGLVersion = 1; + this._shaderPlatformName = "WEBGL1"; + } + } + } catch (e) { } - break; } - case _Animation.ANIMATIONTYPE_COLOR3: { - const color3Value = useTangent ? this.color3InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient) : this.color3InterpolateFunction(startValue, endValue, gradient); - switch (state.loopMode) { - case _Animation.ANIMATIONLOOPMODE_CYCLE: - case _Animation.ANIMATIONLOOPMODE_CONSTANT: - case _Animation.ANIMATIONLOOPMODE_YOYO: - return color3Value; - case _Animation.ANIMATIONLOOPMODE_RELATIVE: - case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: - return color3Value.add((state.offsetValue || _staticOffsetValueColor3).scale(state.repeatCount)); + if (!this._gl) { + if (!canvas) { + throw new Error("The provided canvas is null or undefined."); } - break; - } - case _Animation.ANIMATIONTYPE_COLOR4: { - const color4Value = useTangent ? this.color4InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient) : this.color4InterpolateFunction(startValue, endValue, gradient); - switch (state.loopMode) { - case _Animation.ANIMATIONLOOPMODE_CYCLE: - case _Animation.ANIMATIONLOOPMODE_CONSTANT: - case _Animation.ANIMATIONLOOPMODE_YOYO: - return color4Value; - case _Animation.ANIMATIONLOOPMODE_RELATIVE: - case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: - return color4Value.add((state.offsetValue || _staticOffsetValueColor4).scale(state.repeatCount)); + try { + this._gl = canvas.getContext("webgl", options) || canvas.getContext("experimental-webgl", options); + } catch (e) { + throw new Error("WebGL not supported"); } - break; } - case _Animation.ANIMATIONTYPE_MATRIX: { - switch (state.loopMode) { - case _Animation.ANIMATIONLOOPMODE_CYCLE: - case _Animation.ANIMATIONLOOPMODE_CONSTANT: - case _Animation.ANIMATIONLOOPMODE_YOYO: { - if (_Animation.AllowMatricesInterpolation) { - return this.matrixInterpolateFunction(startValue, endValue, gradient, state.workValue); - } - return startValue; - } - case _Animation.ANIMATIONLOOPMODE_RELATIVE: - case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: { - return startValue; - } - } - break; + if (!this._gl) { + throw new Error("WebGL not supported"); } - } - return 0; - } - /** - * Defines the function to use to interpolate matrices - * @param startValue defines the start matrix - * @param endValue defines the end matrix - * @param gradient defines the gradient between both matrices - * @param result defines an optional target matrix where to store the interpolation - * @returns the interpolated matrix - */ - matrixInterpolateFunction(startValue, endValue, gradient, result) { - if (_Animation.AllowMatrixDecomposeForInterpolation) { - if (result) { - Matrix.DecomposeLerpToRef(startValue, endValue, gradient, result); - return result; + } else { + this._gl = canvasOrContext; + this._renderingCanvas = this._gl.canvas; + if (this._gl.renderbufferStorageMultisample) { + this._webGLVersion = 2; + this._shaderPlatformName = "WEBGL2"; + } else { + this._shaderPlatformName = "WEBGL1"; + } + const attributes = this._gl.getContextAttributes(); + if (attributes) { + options.stencil = attributes.stencil; } - return Matrix.DecomposeLerp(startValue, endValue, gradient); } - if (result) { - Matrix.LerpToRef(startValue, endValue, gradient, result); - return result; + this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE); + if (options.useHighPrecisionFloats !== void 0) { + this._highPrecisionShadersAllowed = options.useHighPrecisionFloats; + } + this.resize(); + this._initGLContext(); + this._initFeatures(); + for (let i = 0; i < this._caps.maxVertexAttribs; i++) { + this._currentBufferPointers[i] = new BufferPointer(); + } + this._shaderProcessor = this.webGLVersion > 1 ? new WebGL2ShaderProcessor() : new WebGLShaderProcessor(); + this._badOS = /iPad/i.test(navigator.userAgent) || /iPhone/i.test(navigator.userAgent); + const versionToLog = `Babylon.js v${_ThinEngine.Version}`; + Logger.Log(versionToLog + ` - ${this.description}`); + if (this._renderingCanvas && this._renderingCanvas.setAttribute) { + this._renderingCanvas.setAttribute("data-engine", versionToLog); } - return Matrix.Lerp(startValue, endValue, gradient); } - /** - * Makes a copy of the animation - * @returns Cloned animation - */ - clone() { - const clone = new _Animation(this.name, this.targetPropertyPath.join("."), this.framePerSecond, this.dataType, this.loopMode); - clone.enableBlending = this.enableBlending; - clone.blendingSpeed = this.blendingSpeed; - if (this._keys) { - clone.setKeys(this._keys); + _setupMobileChecks() { + if (!(navigator && navigator.userAgent)) { + return; } - if (this._ranges) { - clone._ranges = {}; - for (const name69 in this._ranges) { - const range = this._ranges[name69]; - if (!range) { - continue; - } - clone._ranges[name69] = range.clone(); - } + this._checkForMobile = () => { + const currentUA = navigator.userAgent; + this.hostInformation.isMobile = currentUA.indexOf("Mobile") !== -1 || // Needed for iOS 13+ detection on iPad (inspired by solution from https://stackoverflow.com/questions/9038625/detect-if-device-is-ios) + currentUA.indexOf("Mac") !== -1 && IsDocumentAvailable() && "ontouchend" in document; + }; + this._checkForMobile(); + if (IsWindowObjectExist()) { + window.addEventListener("resize", this._checkForMobile); } - return clone; + } + _clearEmptyResources() { + this._dummyFramebuffer = null; + this._emptyTexture = null; + this._emptyCubeTexture = null; + this._emptyTexture3D = null; + this._emptyTexture2DArray = null; + } + _rebuildGraphicsResources() { + var _a; + this.wipeCaches(true); + this._rebuildEffects(); + (_a = this._rebuildComputeEffects) == null ? void 0 : _a.call(this); + this._rebuildBuffers(); + this._rebuildInternalTextures(); + this._rebuildTextures(); + this._rebuildRenderTargetWrappers(); + this.wipeCaches(true); + } + _flagContextRestored() { + Logger.Warn(this.name + " context successfully restored."); + this.onContextRestoredObservable.notifyObservers(this); + this._contextWasLost = false; + } + _restoreEngineAfterContextLost(initEngine) { + setTimeout(async () => { + this._clearEmptyResources(); + const depthTest = this._depthCullingState.depthTest; + const depthFunc = this._depthCullingState.depthFunc; + const depthMask = this._depthCullingState.depthMask; + const stencilTest = this._stencilState.stencilTest; + await initEngine(); + this._rebuildGraphicsResources(); + this._depthCullingState.depthTest = depthTest; + this._depthCullingState.depthFunc = depthFunc; + this._depthCullingState.depthMask = depthMask; + this._stencilState.stencilTest = stencilTest; + this._flagContextRestored(); + }, 0); } /** - * Sets the key frames of the animation - * @param values The animation key frames to set - * @param dontClone Whether to clone the keys or not (default is false, so the array of keys is cloned) + * Shared initialization across engines types. + * @param canvas The canvas associated with this instance of the engine. */ - setKeys(values, dontClone = false) { - this._keys = !dontClone ? values.slice(0) : values; + _sharedInit(canvas) { + this._renderingCanvas = canvas; } /** - * Creates a key for the frame passed as a parameter and adds it to the animation IF a key doesn't already exist for that frame - * @param frame Frame number - * @returns The key index if the key was added or the index of the pre existing key if the frame passed as parameter already has a corresponding key + * @internal */ - createKeyForFrame(frame) { - evaluateAnimationState.key = 0; - const value = this._interpolate(frame, evaluateAnimationState, true); - if (!value) { - return this._keys[evaluateAnimationState.key].frame === frame ? evaluateAnimationState.key : evaluateAnimationState.key + 1; + _getShaderProcessingContext(shaderLanguage) { + return null; + } + _rebuildInternalTextures() { + const currentState = this._internalTexturesCache.slice(); + for (const internalTexture of currentState) { + internalTexture._rebuild(); } - const newKey = { - frame, - value: value.clone ? value.clone() : value - }; - this._keys.splice(evaluateAnimationState.key + 1, 0, newKey); - return evaluateAnimationState.key + 1; } - /** - * Serializes the animation to an object - * @returns Serialized object - */ - serialize() { - const serializationObject = {}; - serializationObject.name = this.name; - serializationObject.property = this.targetProperty; - serializationObject.framePerSecond = this.framePerSecond; - serializationObject.dataType = this.dataType; - serializationObject.loopBehavior = this.loopMode; - serializationObject.enableBlending = this.enableBlending; - serializationObject.blendingSpeed = this.blendingSpeed; - const dataType = this.dataType; - serializationObject.keys = []; - const keys = this.getKeys(); - for (let index = 0; index < keys.length; index++) { - const animationKey = keys[index]; - const key = {}; - key.frame = animationKey.frame; - switch (dataType) { - case _Animation.ANIMATIONTYPE_FLOAT: - key.values = [animationKey.value]; - if (animationKey.inTangent !== void 0) { - key.values.push(animationKey.inTangent); - } - if (animationKey.outTangent !== void 0) { - if (animationKey.inTangent === void 0) { - key.values.push(void 0); - } - key.values.push(animationKey.outTangent); - } - if (animationKey.interpolation !== void 0) { - if (animationKey.inTangent === void 0) { - key.values.push(void 0); - } - if (animationKey.outTangent === void 0) { - key.values.push(void 0); - } - key.values.push(animationKey.interpolation); - } - break; - case _Animation.ANIMATIONTYPE_QUATERNION: - case _Animation.ANIMATIONTYPE_MATRIX: - case _Animation.ANIMATIONTYPE_VECTOR3: - case _Animation.ANIMATIONTYPE_COLOR3: - case _Animation.ANIMATIONTYPE_COLOR4: - key.values = animationKey.value.asArray(); - if (animationKey.inTangent != void 0) { - key.values.push(animationKey.inTangent.asArray()); - } - if (animationKey.outTangent != void 0) { - if (animationKey.inTangent === void 0) { - key.values.push(void 0); - } - key.values.push(animationKey.outTangent.asArray()); - } - if (animationKey.interpolation !== void 0) { - if (animationKey.inTangent === void 0) { - key.values.push(void 0); - } - if (animationKey.outTangent === void 0) { - key.values.push(void 0); - } - key.values.push(animationKey.interpolation); - } - break; - } - serializationObject.keys.push(key); + _rebuildRenderTargetWrappers() { + const currentState = this._renderTargetWrapperCache.slice(); + for (const renderTargetWrapper of currentState) { + renderTargetWrapper._rebuild(); } - serializationObject.ranges = []; - for (const name69 in this._ranges) { - const source = this._ranges[name69]; - if (!source) { - continue; - } - const range = {}; - range.name = name69; - range.from = source.from; - range.to = source.to; - serializationObject.ranges.push(range); + } + _rebuildEffects() { + for (const key in this._compiledEffects) { + const effect = this._compiledEffects[key]; + effect._pipelineContext = null; + effect._prepareEffect(); } - return serializationObject; + Effect.ResetCache(); } /** - * @internal + * Gets a boolean indicating if all created effects are ready + * @returns true if all effects are ready */ - static _UniversalLerp(left, right, amount) { - const constructor = left.constructor; - if (constructor.Lerp) { - return constructor.Lerp(left, right, amount); - } else if (constructor.Slerp) { - return constructor.Slerp(left, right, amount); - } else if (left.toFixed) { - return left * (1 - amount) + amount * right; - } else { - return right; + areAllEffectsReady() { + for (const key in this._compiledEffects) { + const effect = this._compiledEffects[key]; + if (!effect.isReady()) { + return false; + } } + return true; } - /** - * Parses an animation object and creates an animation - * @param parsedAnimation Parsed animation object - * @returns Animation object - */ - static Parse(parsedAnimation) { - const animation = new _Animation(parsedAnimation.name, parsedAnimation.property, parsedAnimation.framePerSecond, parsedAnimation.dataType, parsedAnimation.loopBehavior); - const dataType = parsedAnimation.dataType; - const keys = []; - let data; - let index; - if (parsedAnimation.enableBlending) { - animation.enableBlending = parsedAnimation.enableBlending; + _rebuildBuffers() { + for (const uniformBuffer of this._uniformBuffers) { + uniformBuffer._rebuildAfterContextLost(); } - if (parsedAnimation.blendingSpeed) { - animation.blendingSpeed = parsedAnimation.blendingSpeed; + } + _rebuildTextures() { + } + _initGLContext() { + this._caps = { + maxTexturesImageUnits: this._gl.getParameter(this._gl.MAX_TEXTURE_IMAGE_UNITS), + maxCombinedTexturesImageUnits: this._gl.getParameter(this._gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS), + maxVertexTextureImageUnits: this._gl.getParameter(this._gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS), + maxTextureSize: this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE), + maxSamples: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_SAMPLES) : 1, + maxCubemapTextureSize: this._gl.getParameter(this._gl.MAX_CUBE_MAP_TEXTURE_SIZE), + maxRenderTextureSize: this._gl.getParameter(this._gl.MAX_RENDERBUFFER_SIZE), + maxVertexAttribs: this._gl.getParameter(this._gl.MAX_VERTEX_ATTRIBS), + maxVaryingVectors: this._gl.getParameter(this._gl.MAX_VARYING_VECTORS), + maxFragmentUniformVectors: this._gl.getParameter(this._gl.MAX_FRAGMENT_UNIFORM_VECTORS), + maxVertexUniformVectors: this._gl.getParameter(this._gl.MAX_VERTEX_UNIFORM_VECTORS), + parallelShaderCompile: this._gl.getExtension("KHR_parallel_shader_compile") || void 0, + standardDerivatives: this._webGLVersion > 1 || this._gl.getExtension("OES_standard_derivatives") !== null, + maxAnisotropy: 1, + astc: this._gl.getExtension("WEBGL_compressed_texture_astc") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_astc"), + bptc: this._gl.getExtension("EXT_texture_compression_bptc") || this._gl.getExtension("WEBKIT_EXT_texture_compression_bptc"), + s3tc: this._gl.getExtension("WEBGL_compressed_texture_s3tc") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc"), + // eslint-disable-next-line @typescript-eslint/naming-convention + s3tc_srgb: this._gl.getExtension("WEBGL_compressed_texture_s3tc_srgb") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc_srgb"), + pvrtc: this._gl.getExtension("WEBGL_compressed_texture_pvrtc") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"), + etc1: this._gl.getExtension("WEBGL_compressed_texture_etc1") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_etc1"), + etc2: this._gl.getExtension("WEBGL_compressed_texture_etc") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_etc") || this._gl.getExtension("WEBGL_compressed_texture_es3_0"), + textureAnisotropicFilterExtension: this._gl.getExtension("EXT_texture_filter_anisotropic") || this._gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic") || this._gl.getExtension("MOZ_EXT_texture_filter_anisotropic"), + uintIndices: this._webGLVersion > 1 || this._gl.getExtension("OES_element_index_uint") !== null, + fragmentDepthSupported: this._webGLVersion > 1 || this._gl.getExtension("EXT_frag_depth") !== null, + highPrecisionShaderSupported: false, + timerQuery: this._gl.getExtension("EXT_disjoint_timer_query_webgl2") || this._gl.getExtension("EXT_disjoint_timer_query"), + supportOcclusionQuery: this._webGLVersion > 1, + canUseTimestampForTimerQuery: false, + drawBuffersExtension: false, + maxMSAASamples: 1, + colorBufferFloat: !!(this._webGLVersion > 1 && this._gl.getExtension("EXT_color_buffer_float")), + supportFloatTexturesResolve: false, + rg11b10ufColorRenderable: false, + colorBufferHalfFloat: !!(this._webGLVersion > 1 && this._gl.getExtension("EXT_color_buffer_half_float")), + textureFloat: this._webGLVersion > 1 || this._gl.getExtension("OES_texture_float") ? true : false, + textureHalfFloat: this._webGLVersion > 1 || this._gl.getExtension("OES_texture_half_float") ? true : false, + textureHalfFloatRender: false, + textureFloatLinearFiltering: false, + textureFloatRender: false, + textureHalfFloatLinearFiltering: false, + vertexArrayObject: false, + instancedArrays: false, + textureLOD: this._webGLVersion > 1 || this._gl.getExtension("EXT_shader_texture_lod") ? true : false, + texelFetch: this._webGLVersion !== 1, + blendMinMax: false, + multiview: this._gl.getExtension("OVR_multiview2"), + oculusMultiview: this._gl.getExtension("OCULUS_multiview"), + depthTextureExtension: false, + canUseGLInstanceID: this._webGLVersion > 1, + canUseGLVertexID: this._webGLVersion > 1, + supportComputeShaders: false, + supportSRGBBuffers: false, + supportTransformFeedbacks: this._webGLVersion > 1, + textureMaxLevel: this._webGLVersion > 1, + texture2DArrayMaxLayerCount: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_ARRAY_TEXTURE_LAYERS) : 128, + disableMorphTargetTexture: false + }; + this._caps.supportFloatTexturesResolve = this._caps.colorBufferFloat; + this._caps.rg11b10ufColorRenderable = this._caps.colorBufferFloat; + this._glVersion = this._gl.getParameter(this._gl.VERSION); + const rendererInfo = this._gl.getExtension("WEBGL_debug_renderer_info"); + if (rendererInfo != null) { + this._glRenderer = this._gl.getParameter(rendererInfo.UNMASKED_RENDERER_WEBGL); + this._glVendor = this._gl.getParameter(rendererInfo.UNMASKED_VENDOR_WEBGL); } - for (index = 0; index < parsedAnimation.keys.length; index++) { - const key = parsedAnimation.keys[index]; - let inTangent = void 0; - let outTangent = void 0; - let interpolation = void 0; - switch (dataType) { - case _Animation.ANIMATIONTYPE_FLOAT: - data = key.values[0]; - if (key.values.length >= 2) { - inTangent = key.values[1]; - } - if (key.values.length >= 3) { - outTangent = key.values[2]; - } - if (key.values.length >= 4) { - interpolation = key.values[3]; - } - break; - case _Animation.ANIMATIONTYPE_QUATERNION: - data = Quaternion.FromArray(key.values); - if (key.values.length >= 8) { - const _inTangent = Quaternion.FromArray(key.values.slice(4, 8)); - if (!_inTangent.equals(Quaternion.Zero())) { - inTangent = _inTangent; - } - } - if (key.values.length >= 12) { - const _outTangent = Quaternion.FromArray(key.values.slice(8, 12)); - if (!_outTangent.equals(Quaternion.Zero())) { - outTangent = _outTangent; - } - } - if (key.values.length >= 13) { - interpolation = key.values[12]; - } - break; - case _Animation.ANIMATIONTYPE_MATRIX: - data = Matrix.FromArray(key.values); - if (key.values.length >= 17) { - interpolation = key.values[16]; - } - break; - case _Animation.ANIMATIONTYPE_COLOR3: - data = Color3.FromArray(key.values); - if (key.values[3]) { - inTangent = Color3.FromArray(key.values[3]); - } - if (key.values[4]) { - outTangent = Color3.FromArray(key.values[4]); - } - if (key.values[5]) { - interpolation = key.values[5]; - } - break; - case _Animation.ANIMATIONTYPE_COLOR4: - data = Color4.FromArray(key.values); - if (key.values[4]) { - inTangent = Color4.FromArray(key.values[4]); - } - if (key.values[5]) { - outTangent = Color4.FromArray(key.values[5]); - } - if (key.values[6]) { - interpolation = Color4.FromArray(key.values[6]); - } - break; - case _Animation.ANIMATIONTYPE_VECTOR3: - default: - data = Vector3.FromArray(key.values); - if (key.values[3]) { - inTangent = Vector3.FromArray(key.values[3]); - } - if (key.values[4]) { - outTangent = Vector3.FromArray(key.values[4]); - } - if (key.values[5]) { - interpolation = key.values[5]; - } - break; - } - const keyData = {}; - keyData.frame = key.frame; - keyData.value = data; - if (inTangent != void 0) { - keyData.inTangent = inTangent; - } - if (outTangent != void 0) { - keyData.outTangent = outTangent; - } - if (interpolation != void 0) { - keyData.interpolation = interpolation; + if (!this._glVendor) { + this._glVendor = this._gl.getParameter(this._gl.VENDOR) || "Unknown vendor"; + } + if (!this._glRenderer) { + this._glRenderer = this._gl.getParameter(this._gl.RENDERER) || "Unknown renderer"; + } + if (this._gl.HALF_FLOAT_OES !== 36193) { + this._gl.HALF_FLOAT_OES = 36193; + } + if (this._gl.RGBA16F !== 34842) { + this._gl.RGBA16F = 34842; + } + if (this._gl.RGBA32F !== 34836) { + this._gl.RGBA32F = 34836; + } + if (this._gl.DEPTH24_STENCIL8 !== 35056) { + this._gl.DEPTH24_STENCIL8 = 35056; + } + if (this._caps.timerQuery) { + if (this._webGLVersion === 1) { + this._gl.getQuery = this._caps.timerQuery.getQueryEXT.bind(this._caps.timerQuery); } - keys.push(keyData); + this._caps.canUseTimestampForTimerQuery = (this._gl.getQuery(this._caps.timerQuery.TIMESTAMP_EXT, this._caps.timerQuery.QUERY_COUNTER_BITS_EXT) ?? 0) > 0; } - animation.setKeys(keys); - if (parsedAnimation.ranges) { - for (index = 0; index < parsedAnimation.ranges.length; index++) { - data = parsedAnimation.ranges[index]; - animation.createRange(data.name, data.from, data.to); + this._caps.maxAnisotropy = this._caps.textureAnisotropicFilterExtension ? this._gl.getParameter(this._caps.textureAnisotropicFilterExtension.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0; + this._caps.textureFloatLinearFiltering = this._caps.textureFloat && this._gl.getExtension("OES_texture_float_linear") ? true : false; + this._caps.textureFloatRender = this._caps.textureFloat && this._canRenderToFloatFramebuffer() ? true : false; + this._caps.textureHalfFloatLinearFiltering = this._webGLVersion > 1 || this._caps.textureHalfFloat && this._gl.getExtension("OES_texture_half_float_linear") ? true : false; + if (this._caps.astc) { + this._gl.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = this._caps.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR; + } + if (this._caps.bptc) { + this._gl.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT = this._caps.bptc.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT; + } + if (this._caps.s3tc_srgb) { + this._gl.COMPRESSED_SRGB_S3TC_DXT1_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_S3TC_DXT1_EXT; + this._gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; + this._gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; + } + if (this._caps.etc2) { + this._gl.COMPRESSED_SRGB8_ETC2 = this._caps.etc2.COMPRESSED_SRGB8_ETC2; + this._gl.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = this._caps.etc2.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC; + } + if (this._webGLVersion > 1) { + if (this._gl.HALF_FLOAT_OES !== 5131) { + this._gl.HALF_FLOAT_OES = 5131; } } - return animation; - } - /** - * Appends the serialized animations from the source animations - * @param source Source containing the animations - * @param destination Target to store the animations - */ - static AppendSerializedAnimations(source, destination) { - SerializationHelper.AppendSerializedAnimations(source, destination); - } - /** - * Creates a new animation or an array of animations from a snippet saved in a remote file - * @param name defines the name of the animation to create (can be null or empty to use the one from the json data) - * @param url defines the url to load from - * @returns a promise that will resolve to the new animation or an array of animations - */ - static ParseFromFileAsync(name69, url) { - return new Promise((resolve, reject) => { - const request = new WebRequest(); - request.addEventListener("readystatechange", () => { - if (request.readyState == 4) { - if (request.status == 200) { - let serializationObject = JSON.parse(request.responseText); - if (serializationObject.animations) { - serializationObject = serializationObject.animations; - } - if (serializationObject.length) { - const output = []; - for (const serializedAnimation of serializationObject) { - output.push(this.Parse(serializedAnimation)); - } - resolve(output); - } else { - const output = this.Parse(serializationObject); - if (name69) { - output.name = name69; - } - resolve(output); - } - } else { - reject("Unable to load the animation"); - } + this._caps.textureHalfFloatRender = this._caps.textureHalfFloat && this._canRenderToHalfFloatFramebuffer(); + if (this._webGLVersion > 1) { + this._caps.drawBuffersExtension = true; + this._caps.maxMSAASamples = this._maxMSAASamplesOverride !== null ? this._maxMSAASamplesOverride : this._gl.getParameter(this._gl.MAX_SAMPLES); + } else { + const drawBuffersExtension = this._gl.getExtension("WEBGL_draw_buffers"); + if (drawBuffersExtension !== null) { + this._caps.drawBuffersExtension = true; + this._gl.drawBuffers = drawBuffersExtension.drawBuffersWEBGL.bind(drawBuffersExtension); + this._gl.DRAW_FRAMEBUFFER = this._gl.FRAMEBUFFER; + for (let i = 0; i < 16; i++) { + this._gl["COLOR_ATTACHMENT" + i + "_WEBGL"] = drawBuffersExtension["COLOR_ATTACHMENT" + i + "_WEBGL"]; } - }); - request.open("GET", url); - request.send(); - }); - } - /** - * Creates an animation or an array of animations from a snippet saved by the Inspector - * @param snippetId defines the snippet to load - * @returns a promise that will resolve to the new animation or a new array of animations - */ - static ParseFromSnippetAsync(snippetId) { - return new Promise((resolve, reject) => { - const request = new WebRequest(); - request.addEventListener("readystatechange", () => { - if (request.readyState == 4) { - if (request.status == 200) { - const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload); - if (snippet.animations) { - const serializationObject = JSON.parse(snippet.animations); - const outputs = []; - for (const serializedAnimation of serializationObject.animations) { - const output = this.Parse(serializedAnimation); - output.snippetId = snippetId; - outputs.push(output); - } - resolve(outputs); - } else { - const serializationObject = JSON.parse(snippet.animation); - const output = this.Parse(serializationObject); - output.snippetId = snippetId; - resolve(output); - } - } else { - reject("Unable to load the snippet " + snippetId); - } + } + } + if (this._webGLVersion > 1) { + this._caps.depthTextureExtension = true; + } else { + const depthTextureExtension = this._gl.getExtension("WEBGL_depth_texture"); + if (depthTextureExtension != null) { + this._caps.depthTextureExtension = true; + this._gl.UNSIGNED_INT_24_8 = depthTextureExtension.UNSIGNED_INT_24_8_WEBGL; + } + } + if (this.disableVertexArrayObjects) { + this._caps.vertexArrayObject = false; + } else if (this._webGLVersion > 1) { + this._caps.vertexArrayObject = true; + } else { + const vertexArrayObjectExtension = this._gl.getExtension("OES_vertex_array_object"); + if (vertexArrayObjectExtension != null) { + this._caps.vertexArrayObject = true; + this._gl.createVertexArray = vertexArrayObjectExtension.createVertexArrayOES.bind(vertexArrayObjectExtension); + this._gl.bindVertexArray = vertexArrayObjectExtension.bindVertexArrayOES.bind(vertexArrayObjectExtension); + this._gl.deleteVertexArray = vertexArrayObjectExtension.deleteVertexArrayOES.bind(vertexArrayObjectExtension); + } + } + if (this._webGLVersion > 1) { + this._caps.instancedArrays = true; + } else { + const instanceExtension = this._gl.getExtension("ANGLE_instanced_arrays"); + if (instanceExtension != null) { + this._caps.instancedArrays = true; + this._gl.drawArraysInstanced = instanceExtension.drawArraysInstancedANGLE.bind(instanceExtension); + this._gl.drawElementsInstanced = instanceExtension.drawElementsInstancedANGLE.bind(instanceExtension); + this._gl.vertexAttribDivisor = instanceExtension.vertexAttribDivisorANGLE.bind(instanceExtension); + } else { + this._caps.instancedArrays = false; + } + } + if (this._gl.getShaderPrecisionFormat) { + const vertexhighp = this._gl.getShaderPrecisionFormat(this._gl.VERTEX_SHADER, this._gl.HIGH_FLOAT); + const fragmenthighp = this._gl.getShaderPrecisionFormat(this._gl.FRAGMENT_SHADER, this._gl.HIGH_FLOAT); + if (vertexhighp && fragmenthighp) { + this._caps.highPrecisionShaderSupported = vertexhighp.precision !== 0 && fragmenthighp.precision !== 0; + } + } + if (this._webGLVersion > 1) { + this._caps.blendMinMax = true; + } else { + const blendMinMaxExtension = this._gl.getExtension("EXT_blend_minmax"); + if (blendMinMaxExtension != null) { + this._caps.blendMinMax = true; + this._gl.MAX = blendMinMaxExtension.MAX_EXT; + this._gl.MIN = blendMinMaxExtension.MIN_EXT; + } + } + if (!this._caps.supportSRGBBuffers) { + if (this._webGLVersion > 1) { + this._caps.supportSRGBBuffers = true; + this._glSRGBExtensionValues = { + SRGB: WebGL2RenderingContext.SRGB, + SRGB8: WebGL2RenderingContext.SRGB8, + SRGB8_ALPHA8: WebGL2RenderingContext.SRGB8_ALPHA8 + }; + } else { + const sRGBExtension = this._gl.getExtension("EXT_sRGB"); + if (sRGBExtension != null) { + this._caps.supportSRGBBuffers = true; + this._glSRGBExtensionValues = { + SRGB: sRGBExtension.SRGB_EXT, + SRGB8: sRGBExtension.SRGB_ALPHA_EXT, + SRGB8_ALPHA8: sRGBExtension.SRGB_ALPHA_EXT + }; } - }); - request.open("GET", this.SnippetUrl + "/" + snippetId.replace(/#/g, "/")); - request.send(); - }); - } -}; -Animation._UniqueIdGenerator = 0; -Animation.AllowMatricesInterpolation = false; -Animation.AllowMatrixDecomposeForInterpolation = true; -Animation.SnippetUrl = `https://snippet.babylonjs.com`; -Animation.ANIMATIONTYPE_FLOAT = 0; -Animation.ANIMATIONTYPE_VECTOR3 = 1; -Animation.ANIMATIONTYPE_QUATERNION = 2; -Animation.ANIMATIONTYPE_MATRIX = 3; -Animation.ANIMATIONTYPE_COLOR3 = 4; -Animation.ANIMATIONTYPE_COLOR4 = 7; -Animation.ANIMATIONTYPE_VECTOR2 = 5; -Animation.ANIMATIONTYPE_SIZE = 6; -Animation.ANIMATIONLOOPMODE_RELATIVE = 0; -Animation.ANIMATIONLOOPMODE_CYCLE = 1; -Animation.ANIMATIONLOOPMODE_CONSTANT = 2; -Animation.ANIMATIONLOOPMODE_YOYO = 4; -Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT = 5; -Animation.CreateFromSnippetAsync = Animation.ParseFromSnippetAsync; -RegisterClass("BABYLON.Animation", Animation); -Node._AnimationRangeFactory = (name69, from, to) => new AnimationRange(name69, from, to); - -// node_modules/@babylonjs/core/Misc/domManagement.js -function IsWindowObjectExist() { - return typeof window !== "undefined"; -} -function IsNavigatorAvailable() { - return typeof navigator !== "undefined"; -} -function IsDocumentAvailable() { - return typeof document !== "undefined"; -} -function GetDOMTextContent(element) { - let result = ""; - let child = element.firstChild; - while (child) { - if (child.nodeType === 3) { - result += child.textContent; + } + this._caps.supportSRGBBuffers = this._caps.supportSRGBBuffers && !!(this._creationOptions && this._creationOptions.forceSRGBBufferSupportState); + } + this._depthCullingState.depthTest = true; + this._depthCullingState.depthFunc = this._gl.LEQUAL; + this._depthCullingState.depthMask = true; + this._maxSimultaneousTextures = this._caps.maxCombinedTexturesImageUnits; + for (let slot = 0; slot < this._maxSimultaneousTextures; slot++) { + this._nextFreeTextureSlots.push(slot); + } + if (this._glRenderer === "Mali-G72") { + this._caps.disableMorphTargetTexture = true; } - child = child.nextSibling; } - return result; -} -var DomManagement = { + _initFeatures() { + this._features = { + forceBitmapOverHTMLImageElement: typeof HTMLImageElement === "undefined", + supportRenderAndCopyToLodForFloatTextures: this._webGLVersion !== 1, + supportDepthStencilTexture: this._webGLVersion !== 1, + supportShadowSamplers: this._webGLVersion !== 1, + uniformBufferHardCheckMatrix: false, + allowTexturePrefiltering: this._webGLVersion !== 1, + trackUbosInFrame: false, + checkUbosContentBeforeUpload: false, + supportCSM: this._webGLVersion !== 1, + basisNeedsPOT: this._webGLVersion === 1, + support3DTextures: this._webGLVersion !== 1, + needTypeSuffixInShaderConstants: this._webGLVersion !== 1, + supportMSAA: this._webGLVersion !== 1, + supportSSAO2: this._webGLVersion !== 1, + supportExtendedTextureFormats: this._webGLVersion !== 1, + supportSwitchCaseInShader: this._webGLVersion !== 1, + supportSyncTextureRead: true, + needsInvertingBitmap: true, + useUBOBindingCache: true, + needShaderCodeInlining: false, + needToAlwaysBindUniformBuffers: false, + supportRenderPasses: false, + supportSpriteInstancing: true, + forceVertexBufferStrideAndOffsetMultiple4Bytes: false, + _collectUbosUpdatedInFrame: false + }; + } /** - * Checks if the window object exists - * @returns true if the window object exists + * Gets version of the current webGL context + * Keep it for back compat - use version instead */ - IsWindowObjectExist, + get webGLVersion() { + return this._webGLVersion; + } /** - * Checks if the navigator object exists - * @returns true if the navigator object exists + * Gets a string identifying the name of the class + * @returns "Engine" string */ - IsNavigatorAvailable, + getClassName() { + return "ThinEngine"; + } /** - * Check if the document object exists - * @returns true if the document object exists + * Returns true if the stencil buffer has been enabled through the creation option of the context. */ - IsDocumentAvailable, + get isStencilEnable() { + return this._isStencilEnable; + } + /** @internal */ + _prepareWorkingCanvas() { + if (this._workingCanvas) { + return; + } + this._workingCanvas = this.createCanvas(1, 1); + const context = this._workingCanvas.getContext("2d"); + if (context) { + this._workingContext = context; + } + } /** - * Extracts text content from a DOM element hierarchy - * @param element defines the root element - * @returns a string + * Reset the texture cache to empty state */ - GetDOMTextContent -}; - -// node_modules/@babylonjs/core/Misc/precisionDate.js -var PrecisionDate = class { + resetTextureCache() { + for (const key in this._boundTexturesCache) { + if (!Object.prototype.hasOwnProperty.call(this._boundTexturesCache, key)) { + continue; + } + this._boundTexturesCache[key] = null; + } + this._currentTextureChannel = -1; + } /** - * Gets either window.performance.now() if supported or Date.now() else + * Gets an object containing information about the current engine context + * @returns an object containing the vendor, the renderer and the version of the current engine context */ - static get Now() { - if (IsWindowObjectExist() && window.performance && window.performance.now) { - return window.performance.now(); - } - return Date.now(); + getInfo() { + return this.getGlInfo(); } -}; - -// node_modules/@babylonjs/core/Misc/filesInputStore.js -var FilesInputStore = class { -}; -FilesInputStore.FilesToLoad = {}; - -// node_modules/@babylonjs/core/Misc/retryStrategy.js -var RetryStrategy = class { /** - * Function used to defines an exponential back off strategy - * @param maxRetries defines the maximum number of retries (3 by default) - * @param baseInterval defines the interval between retries - * @returns the strategy function to use + * Gets an object containing information about the current webGL context + * @returns an object containing the vendor, the renderer and the version of the current webGL context */ - static ExponentialBackoff(maxRetries = 3, baseInterval = 500) { - return (url, request, retryIndex) => { - if (request.status !== 0 || retryIndex >= maxRetries || url.indexOf("file:") !== -1) { - return -1; - } - return Math.pow(2, retryIndex) * baseInterval; + getGlInfo() { + return { + vendor: this._glVendor, + renderer: this._glRenderer, + version: this._glVersion }; } -}; - -// node_modules/@babylonjs/core/Misc/error.js -var BaseError = class extends Error { -}; -BaseError._setPrototypeOf = Object.setPrototypeOf || ((o, proto) => { - o.__proto__ = proto; - return o; -}); -var ErrorCodes = { - // Mesh errors 0-999 - /** Invalid or empty mesh vertex positions. */ - MeshInvalidPositionsError: 0, - // Texture errors 1000-1999 - /** Unsupported texture found. */ - UnsupportedTextureError: 1e3, - // GLTFLoader errors 2000-2999 - /** Unexpected magic number found in GLTF file header. */ - GLTFLoaderUnexpectedMagicError: 2e3, - // SceneLoader errors 3000-3999 - /** SceneLoader generic error code. Ideally wraps the inner exception. */ - SceneLoaderError: 3e3, - // File related errors 4000-4999 - /** Load file error */ - LoadFileError: 4e3, - /** Request file error */ - RequestFileError: 4001, - /** Read file error */ - ReadFileError: 4002 -}; -var RuntimeError = class _RuntimeError extends BaseError { /** - * Creates a new RuntimeError - * @param message defines the message of the error - * @param errorCode the error code - * @param innerError the error that caused the outer error + * Defines the hardware scaling level. + * By default the hardware scaling level is computed from the window device ratio. + * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas. + * @param level defines the level to use */ - constructor(message, errorCode, innerError) { - super(message); - this.errorCode = errorCode; - this.innerError = innerError; - this.name = "RuntimeError"; - BaseError._setPrototypeOf(this, _RuntimeError.prototype); - } -}; - -// node_modules/@babylonjs/core/Misc/stringTools.js -var EndsWith = (str, suffix) => { - return str.endsWith(suffix); -}; -var StartsWith = (str, suffix) => { - if (!str) { - return false; - } - return str.startsWith(suffix); -}; -var Decode = (buffer) => { - if (typeof TextDecoder !== "undefined") { - return new TextDecoder().decode(buffer); - } - let result = ""; - for (let i = 0; i < buffer.byteLength; i++) { - result += String.fromCharCode(buffer[i]); - } - return result; -}; -var EncodeArrayBufferToBase64 = (buffer) => { - const keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - let output = ""; - let chr1, chr2, chr3, enc1, enc2, enc3, enc4; - let i = 0; - const bytes = ArrayBuffer.isView(buffer) ? new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength) : new Uint8Array(buffer); - while (i < bytes.length) { - chr1 = bytes[i++]; - chr2 = i < bytes.length ? bytes[i++] : Number.NaN; - chr3 = i < bytes.length ? bytes[i++] : Number.NaN; - enc1 = chr1 >> 2; - enc2 = (chr1 & 3) << 4 | chr2 >> 4; - enc3 = (chr2 & 15) << 2 | chr3 >> 6; - enc4 = chr3 & 63; - if (isNaN(chr2)) { - enc3 = enc4 = 64; - } else if (isNaN(chr3)) { - enc4 = 64; - } - output += keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); - } - return output; -}; -var DecodeBase64ToString = (base64Data) => { - return atob(base64Data); -}; -var DecodeBase64ToBinary = (base64Data) => { - const decodedString = DecodeBase64ToString(base64Data); - const bufferLength = decodedString.length; - const bufferView = new Uint8Array(new ArrayBuffer(bufferLength)); - for (let i = 0; i < bufferLength; i++) { - bufferView[i] = decodedString.charCodeAt(i); + setHardwareScalingLevel(level) { + this._hardwareScalingLevel = level; + this.resize(); } - return bufferView.buffer; -}; -var PadNumber = (num, length) => { - let str = String(num); - while (str.length < length) { - str = "0" + str; + /** + * Gets the current hardware scaling level. + * By default the hardware scaling level is computed from the window device ratio. + * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas. + * @returns a number indicating the current hardware scaling level + */ + getHardwareScalingLevel() { + return this._hardwareScalingLevel; } - return str; -}; -var StringTools = { - EndsWith, - StartsWith, - Decode, - EncodeArrayBufferToBase64, - DecodeBase64ToString, - DecodeBase64ToBinary, - PadNumber -}; - -// node_modules/@babylonjs/core/Materials/shaderLanguage.js -var ShaderLanguage; -(function(ShaderLanguage2) { - ShaderLanguage2[ShaderLanguage2["GLSL"] = 0] = "GLSL"; - ShaderLanguage2[ShaderLanguage2["WGSL"] = 1] = "WGSL"; -})(ShaderLanguage || (ShaderLanguage = {})); - -// node_modules/@babylonjs/core/Engines/shaderStore.js -var ShaderStore = class _ShaderStore { /** - * Gets the shaders repository path for a given shader language - * @param shaderLanguage the shader language - * @returns the path to the shaders repository + * Gets the list of loaded textures + * @returns an array containing all loaded textures */ - static GetShadersRepository(shaderLanguage = ShaderLanguage.GLSL) { - return shaderLanguage === ShaderLanguage.GLSL ? _ShaderStore.ShadersRepository : _ShaderStore.ShadersRepositoryWGSL; + getLoadedTexturesCache() { + return this._internalTexturesCache; } /** - * Gets the shaders store of a given shader language - * @param shaderLanguage the shader language - * @returns the shaders store + * Gets the object containing all engine capabilities + * @returns the EngineCapabilities object */ - static GetShadersStore(shaderLanguage = ShaderLanguage.GLSL) { - return shaderLanguage === ShaderLanguage.GLSL ? _ShaderStore.ShadersStore : _ShaderStore.ShadersStoreWGSL; + getCaps() { + return this._caps; } /** - * Gets the include shaders store of a given shader language - * @param shaderLanguage the shader language - * @returns the include shaders store + * stop executing a render loop function and remove it from the execution array + * @param renderFunction defines the function to be removed. If not provided all functions will be removed. */ - static GetIncludesShadersStore(shaderLanguage = ShaderLanguage.GLSL) { - return shaderLanguage === ShaderLanguage.GLSL ? _ShaderStore.IncludesShadersStore : _ShaderStore.IncludesShadersStoreWGSL; + stopRenderLoop(renderFunction) { + if (!renderFunction) { + this._activeRenderLoops.length = 0; + this._cancelFrame(); + return; + } + const index = this._activeRenderLoops.indexOf(renderFunction); + if (index >= 0) { + this._activeRenderLoops.splice(index, 1); + if (this._activeRenderLoops.length == 0) { + this._cancelFrame(); + } + } } -}; -ShaderStore.ShadersRepository = "src/Shaders/"; -ShaderStore.ShadersStore = {}; -ShaderStore.IncludesShadersStore = {}; -ShaderStore.ShadersRepositoryWGSL = "src/ShadersWGSL/"; -ShaderStore.ShadersStoreWGSL = {}; -ShaderStore.IncludesShadersStoreWGSL = {}; - -// node_modules/@babylonjs/core/Engines/Processors/shaderCodeNode.js -var defaultAttributeKeywordName = "attribute"; -var defaultVaryingKeywordName = "varying"; -var ShaderCodeNode = class { - constructor() { - this.children = []; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - isValid(preprocessors) { - return true; - } - process(preprocessors, options) { - var _a, _b, _c, _d, _e, _f; - let result = ""; - if (this.line) { - let value = this.line; - const processor = options.processor; - if (processor) { - if (processor.lineProcessor) { - value = processor.lineProcessor(value, options.isFragment, options.processingContext); + _cancelFrame() { + if (this._frameHandler !== 0) { + const handlerToCancel = this._frameHandler; + this._frameHandler = 0; + if (!IsWindowObjectExist()) { + if (typeof cancelAnimationFrame === "function") { + return cancelAnimationFrame(handlerToCancel); } - const attributeKeyword = ((_a = options.processor) == null ? void 0 : _a.attributeKeywordName) ?? defaultAttributeKeywordName; - const varyingKeyword = options.isFragment && ((_b = options.processor) == null ? void 0 : _b.varyingFragmentKeywordName) ? (_c = options.processor) == null ? void 0 : _c.varyingFragmentKeywordName : !options.isFragment && ((_d = options.processor) == null ? void 0 : _d.varyingVertexKeywordName) ? (_e = options.processor) == null ? void 0 : _e.varyingVertexKeywordName : defaultVaryingKeywordName; - if (!options.isFragment && processor.attributeProcessor && this.line.startsWith(attributeKeyword)) { - value = processor.attributeProcessor(this.line, preprocessors, options.processingContext); - } else if (processor.varyingProcessor && (((_f = processor.varyingCheck) == null ? void 0 : _f.call(processor, this.line, options.isFragment)) || !processor.varyingCheck && this.line.startsWith(varyingKeyword))) { - value = processor.varyingProcessor(this.line, options.isFragment, preprocessors, options.processingContext); - } else if (processor.uniformProcessor && processor.uniformRegexp && processor.uniformRegexp.test(this.line)) { - if (!options.lookForClosingBracketForUniformBuffer) { - value = processor.uniformProcessor(this.line, options.isFragment, preprocessors, options.processingContext); - } - } else if (processor.uniformBufferProcessor && processor.uniformBufferRegexp && processor.uniformBufferRegexp.test(this.line)) { - if (!options.lookForClosingBracketForUniformBuffer) { - value = processor.uniformBufferProcessor(this.line, options.isFragment, options.processingContext); - options.lookForClosingBracketForUniformBuffer = true; - } - } else if (processor.textureProcessor && processor.textureRegexp && processor.textureRegexp.test(this.line)) { - value = processor.textureProcessor(this.line, options.isFragment, preprocessors, options.processingContext); - } else if ((processor.uniformProcessor || processor.uniformBufferProcessor) && this.line.startsWith("uniform") && !options.lookForClosingBracketForUniformBuffer) { - const regex = /uniform\s+(?:(?:highp)?|(?:lowp)?)\s*(\S+)\s+(\S+)\s*;/; - if (regex.test(this.line)) { - if (processor.uniformProcessor) { - value = processor.uniformProcessor(this.line, options.isFragment, preprocessors, options.processingContext); - } - } else { - if (processor.uniformBufferProcessor) { - value = processor.uniformBufferProcessor(this.line, options.isFragment, options.processingContext); - options.lookForClosingBracketForUniformBuffer = true; - } - } + } else { + const { cancelAnimationFrame: cancelAnimationFrame2 } = this.getHostWindow() || window; + if (typeof cancelAnimationFrame2 === "function") { + return cancelAnimationFrame2(handlerToCancel); } - if (options.lookForClosingBracketForUniformBuffer && this.line.indexOf("}") !== -1) { - options.lookForClosingBracketForUniformBuffer = false; - if (processor.endOfUniformBufferProcessor) { - value = processor.endOfUniformBufferProcessor(this.line, options.isFragment, options.processingContext); - } + } + return clearTimeout(handlerToCancel); + } + } + /** @internal */ + _renderLoop() { + this._frameHandler = 0; + if (!this._contextWasLost) { + let shouldRender = true; + if (this._isDisposed || !this.renderEvenInBackground && this._windowIsBackground) { + shouldRender = false; + } + if (shouldRender) { + this.beginFrame(); + for (let index = 0; index < this._activeRenderLoops.length; index++) { + const renderFunction = this._activeRenderLoops[index]; + renderFunction(); } + this.endFrame(); } - result += value + "\n"; } - this.children.forEach((child) => { - result += child.process(preprocessors, options); - }); - if (this.additionalDefineKey) { - preprocessors[this.additionalDefineKey] = this.additionalDefineValue || "true"; + if (this._frameHandler === 0) { + this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow()); } - return result; } -}; - -// node_modules/@babylonjs/core/Engines/Processors/shaderCodeCursor.js -var ShaderCodeCursor = class { - constructor() { - this._lines = []; + /** + * Gets the HTML canvas attached with the current webGL context + * @returns a HTML canvas + */ + getRenderingCanvas() { + return this._renderingCanvas; } - get currentLine() { - return this._lines[this.lineIndex]; + /** + * Gets the audio context specified in engine initialization options + * @returns an Audio Context + */ + getAudioContext() { + return this._audioContext; } - get canRead() { - return this.lineIndex < this._lines.length - 1; + /** + * Gets the audio destination specified in engine initialization options + * @returns an audio destination node + */ + getAudioDestination() { + return this._audioDestination; } - set lines(value) { - this._lines.length = 0; - for (const line of value) { - if (!line || line === "\r") { - continue; - } - if (line[0] === "#") { - this._lines.push(line); - continue; - } - const trimmedLine = line.trim(); - if (!trimmedLine) { - continue; - } - if (trimmedLine.startsWith("//")) { - this._lines.push(line); - continue; - } - const semicolonIndex = trimmedLine.indexOf(";"); - if (semicolonIndex === -1) { - this._lines.push(trimmedLine); - } else if (semicolonIndex === trimmedLine.length - 1) { - if (trimmedLine.length > 1) { - this._lines.push(trimmedLine); - } - } else { - const split = line.split(";"); - for (let index = 0; index < split.length; index++) { - let subLine = split[index]; - if (!subLine) { - continue; - } - subLine = subLine.trim(); - if (!subLine) { - continue; - } - this._lines.push(subLine + (index !== split.length - 1 ? ";" : "")); - } - } + /** + * Gets host window + * @returns the host window object + */ + getHostWindow() { + if (!IsWindowObjectExist()) { + return null; } - } -}; - -// node_modules/@babylonjs/core/Engines/Processors/shaderCodeConditionNode.js -var ShaderCodeConditionNode = class extends ShaderCodeNode { - process(preprocessors, options) { - for (let index = 0; index < this.children.length; index++) { - const node = this.children[index]; - if (node.isValid(preprocessors)) { - return node.process(preprocessors, options); - } + if (this._renderingCanvas && this._renderingCanvas.ownerDocument && this._renderingCanvas.ownerDocument.defaultView) { + return this._renderingCanvas.ownerDocument.defaultView; } - return ""; - } -}; - -// node_modules/@babylonjs/core/Engines/Processors/shaderCodeTestNode.js -var ShaderCodeTestNode = class extends ShaderCodeNode { - isValid(preprocessors) { - return this.testExpression.isTrue(preprocessors); + return window; } -}; - -// node_modules/@babylonjs/core/Engines/Processors/Expressions/shaderDefineExpression.js -var ShaderDefineExpression = class _ShaderDefineExpression { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - isTrue(preprocessors) { - return true; + /** + * Gets the current render width + * @param useScreen defines if screen size must be used (or the current render target if any) + * @returns a number defining the current render width + */ + getRenderWidth(useScreen = false) { + if (!useScreen && this._currentRenderTarget) { + return this._currentRenderTarget.width; + } + return this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferWidth : this._gl.drawingBufferWidth; } - static postfixToInfix(postfix) { - const stack = []; - for (const c of postfix) { - if (_ShaderDefineExpression._OperatorPriority[c] === void 0) { - stack.push(c); - } else { - const v1 = stack[stack.length - 1], v2 = stack[stack.length - 2]; - stack.length -= 2; - stack.push(`(${v2}${c}${v1})`); - } + /** + * Gets the current render height + * @param useScreen defines if screen size must be used (or the current render target if any) + * @returns a number defining the current render height + */ + getRenderHeight(useScreen = false) { + if (!useScreen && this._currentRenderTarget) { + return this._currentRenderTarget.height; } - return stack[stack.length - 1]; + return this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferHeight : this._gl.drawingBufferHeight; } /** - * Converts an infix expression to a postfix expression. - * - * This method is used to transform infix expressions, which are more human-readable, - * into postfix expressions, also known as Reverse Polish Notation (RPN), that can be - * evaluated more efficiently by a computer. The conversion is based on the operator - * priority defined in _OperatorPriority. - * - * The function employs a stack-based algorithm for the conversion and caches the result - * to improve performance. The cache keeps track of each converted expression's access time - * to manage the cache size and optimize memory usage. When the cache size exceeds a specified - * limit, the least recently accessed items in the cache are deleted. - * - * The cache mechanism is particularly helpful for shader compilation, where the same infix - * expressions might be encountered repeatedly, hence the caching can speed up the process. - * - * @param infix - The infix expression to be converted. - * @returns The postfix expression as an array of strings. + * Can be used to override the current requestAnimationFrame requester. + * @internal */ - static infixToPostfix(infix) { - const cacheItem = _ShaderDefineExpression._InfixToPostfixCache.get(infix); - if (cacheItem) { - cacheItem.accessTime = Date.now(); - return cacheItem.result; + _queueNewFrame(bindedRenderFunction, requester) { + return _ThinEngine.QueueNewFrame(bindedRenderFunction, requester); + } + /** + * Register and execute a render loop. The engine can have more than one render function + * @param renderFunction defines the function to continuously execute + */ + runRenderLoop(renderFunction) { + if (this._activeRenderLoops.indexOf(renderFunction) !== -1) { + return; } - if (!infix.includes("&&") && !infix.includes("||") && !infix.includes(")") && !infix.includes("(")) { - return [infix]; + this._activeRenderLoops.push(renderFunction); + if (this._activeRenderLoops.length === 1 && this._frameHandler === 0) { + this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow()); } - const result = []; - let stackIdx = -1; - const pushOperand = () => { - operand = operand.trim(); - if (operand !== "") { - result.push(operand); - operand = ""; - } - }; - const push = (s) => { - if (stackIdx < _ShaderDefineExpression._Stack.length - 1) { - _ShaderDefineExpression._Stack[++stackIdx] = s; - } - }; - const peek = () => _ShaderDefineExpression._Stack[stackIdx]; - const pop = () => stackIdx === -1 ? "!!INVALID EXPRESSION!!" : _ShaderDefineExpression._Stack[stackIdx--]; - let idx = 0, operand = ""; - while (idx < infix.length) { - const c = infix.charAt(idx), token = idx < infix.length - 1 ? infix.substr(idx, 2) : ""; - if (c === "(") { - operand = ""; - push(c); - } else if (c === ")") { - pushOperand(); - while (stackIdx !== -1 && peek() !== "(") { - result.push(pop()); - } - pop(); - } else if (_ShaderDefineExpression._OperatorPriority[token] > 1) { - pushOperand(); - while (stackIdx !== -1 && _ShaderDefineExpression._OperatorPriority[peek()] >= _ShaderDefineExpression._OperatorPriority[token]) { - result.push(pop()); + } + /** + * Clear the current render buffer or the current render target (if any is set up) + * @param color defines the color to use + * @param backBuffer defines if the back buffer must be cleared + * @param depth defines if the depth buffer must be cleared + * @param stencil defines if the stencil buffer must be cleared + */ + clear(color, backBuffer, depth, stencil = false) { + var _a, _b; + const useStencilGlobalOnly = this.stencilStateComposer.useStencilGlobalOnly; + this.stencilStateComposer.useStencilGlobalOnly = true; + this.applyStates(); + this.stencilStateComposer.useStencilGlobalOnly = useStencilGlobalOnly; + let mode = 0; + if (backBuffer && color) { + let setBackBufferColor = true; + if (this._currentRenderTarget) { + const textureFormat = (_a = this._currentRenderTarget.texture) == null ? void 0 : _a.format; + if (textureFormat === 8 || textureFormat === 9 || textureFormat === 10 || textureFormat === 11) { + const textureType = (_b = this._currentRenderTarget.texture) == null ? void 0 : _b.type; + if (textureType === 7 || textureType === 5) { + _ThinEngine._TempClearColorUint32[0] = color.r * 255; + _ThinEngine._TempClearColorUint32[1] = color.g * 255; + _ThinEngine._TempClearColorUint32[2] = color.b * 255; + _ThinEngine._TempClearColorUint32[3] = color.a * 255; + this._gl.clearBufferuiv(this._gl.COLOR, 0, _ThinEngine._TempClearColorUint32); + setBackBufferColor = false; + } else { + _ThinEngine._TempClearColorInt32[0] = color.r * 255; + _ThinEngine._TempClearColorInt32[1] = color.g * 255; + _ThinEngine._TempClearColorInt32[2] = color.b * 255; + _ThinEngine._TempClearColorInt32[3] = color.a * 255; + this._gl.clearBufferiv(this._gl.COLOR, 0, _ThinEngine._TempClearColorInt32); + setBackBufferColor = false; + } } - push(token); - idx++; - } else { - operand += c; } - idx++; + if (setBackBufferColor) { + this._gl.clearColor(color.r, color.g, color.b, color.a !== void 0 ? color.a : 1); + mode |= this._gl.COLOR_BUFFER_BIT; + } } - pushOperand(); - while (stackIdx !== -1) { - if (peek() === "(") { - pop(); + if (depth) { + if (this.useReverseDepthBuffer) { + this._depthCullingState.depthFunc = this._gl.GEQUAL; + this._gl.clearDepth(0); } else { - result.push(pop()); + this._gl.clearDepth(1); } + mode |= this._gl.DEPTH_BUFFER_BIT; } - if (_ShaderDefineExpression._InfixToPostfixCache.size >= _ShaderDefineExpression.InfixToPostfixCacheLimitSize) { - _ShaderDefineExpression.ClearCache(); - } - _ShaderDefineExpression._InfixToPostfixCache.set(infix, { result, accessTime: Date.now() }); - return result; - } - static ClearCache() { - const sortedCache = Array.from(_ShaderDefineExpression._InfixToPostfixCache.entries()).sort((a, b) => a[1].accessTime - b[1].accessTime); - for (let i = 0; i < _ShaderDefineExpression.InfixToPostfixCacheCleanupSize; i++) { - _ShaderDefineExpression._InfixToPostfixCache.delete(sortedCache[i][0]); + if (stencil) { + this._gl.clearStencil(0); + mode |= this._gl.STENCIL_BUFFER_BIT; } + this._gl.clear(mode); } -}; -ShaderDefineExpression.InfixToPostfixCacheLimitSize = 5e4; -ShaderDefineExpression.InfixToPostfixCacheCleanupSize = 25e3; -ShaderDefineExpression._InfixToPostfixCache = /* @__PURE__ */ new Map(); -ShaderDefineExpression._OperatorPriority = { - ")": 0, - "(": 1, - "||": 2, - "&&": 3 -}; -ShaderDefineExpression._Stack = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]; - -// node_modules/@babylonjs/core/Engines/Processors/Expressions/Operators/shaderDefineIsDefinedOperator.js -var ShaderDefineIsDefinedOperator = class extends ShaderDefineExpression { - constructor(define, not = false) { - super(); - this.define = define; - this.not = not; - } - isTrue(preprocessors) { - let condition = preprocessors[this.define] !== void 0; - if (this.not) { - condition = !condition; + /** + * @internal + */ + _viewport(x, y, width, height) { + if (x !== this._viewportCached.x || y !== this._viewportCached.y || width !== this._viewportCached.z || height !== this._viewportCached.w) { + this._viewportCached.x = x; + this._viewportCached.y = y; + this._viewportCached.z = width; + this._viewportCached.w = height; + this._gl.viewport(x, y, width, height); } - return condition; } -}; - -// node_modules/@babylonjs/core/Engines/Processors/Expressions/Operators/shaderDefineOrOperator.js -var ShaderDefineOrOperator = class extends ShaderDefineExpression { - isTrue(preprocessors) { - return this.leftOperand.isTrue(preprocessors) || this.rightOperand.isTrue(preprocessors); + /** + * Set the WebGL's viewport + * @param viewport defines the viewport element to be used + * @param requiredWidth defines the width required for rendering. If not provided the rendering canvas' width is used + * @param requiredHeight defines the height required for rendering. If not provided the rendering canvas' height is used + */ + setViewport(viewport, requiredWidth, requiredHeight) { + const width = requiredWidth || this.getRenderWidth(); + const height = requiredHeight || this.getRenderHeight(); + const x = viewport.x || 0; + const y = viewport.y || 0; + this._cachedViewport = viewport; + this._viewport(x * width, y * height, width * viewport.width, height * viewport.height); } -}; - -// node_modules/@babylonjs/core/Engines/Processors/Expressions/Operators/shaderDefineAndOperator.js -var ShaderDefineAndOperator = class extends ShaderDefineExpression { - isTrue(preprocessors) { - return this.leftOperand.isTrue(preprocessors) && this.rightOperand.isTrue(preprocessors); + /** + * Begin a new frame + */ + beginFrame() { } -}; - -// node_modules/@babylonjs/core/Engines/Processors/Expressions/Operators/shaderDefineArithmeticOperator.js -var ShaderDefineArithmeticOperator = class extends ShaderDefineExpression { - constructor(define, operand, testValue) { - super(); - this.define = define; - this.operand = operand; - this.testValue = testValue; + /** + * Enf the current frame + */ + endFrame() { + if (this._badOS) { + this.flushFramebuffer(); + } + this._frameId++; } - isTrue(preprocessors) { - let value = preprocessors[this.define]; - if (value === void 0) { - value = this.define; + /** + * Resize the view according to the canvas' size + * @param forceSetSize true to force setting the sizes of the underlying canvas + */ + resize(forceSetSize = false) { + let width; + let height; + if (this.adaptToDeviceRatio) { + const devicePixelRatio = IsWindowObjectExist() ? window.devicePixelRatio || 1 : 1; + const changeRatio = this._lastDevicePixelRatio / devicePixelRatio; + this._lastDevicePixelRatio = devicePixelRatio; + this._hardwareScalingLevel *= changeRatio; } - let condition = false; - const left = parseInt(value); - const right = parseInt(this.testValue); - switch (this.operand) { - case ">": - condition = left > right; - break; - case "<": - condition = left < right; - break; - case "<=": - condition = left <= right; - break; - case ">=": - condition = left >= right; - break; - case "==": - condition = left === right; - break; - case "!=": - condition = left !== right; - break; + if (IsWindowObjectExist() && IsDocumentAvailable()) { + if (this._renderingCanvas) { + const boundingRect = this._renderingCanvas.getBoundingClientRect ? this._renderingCanvas.getBoundingClientRect() : { + // fallback to last solution in case the function doesn't exist + width: this._renderingCanvas.width * this._hardwareScalingLevel, + height: this._renderingCanvas.height * this._hardwareScalingLevel + }; + width = this._renderingCanvas.clientWidth || boundingRect.width || this._renderingCanvas.width || 100; + height = this._renderingCanvas.clientHeight || boundingRect.height || this._renderingCanvas.height || 100; + } else { + width = window.innerWidth; + height = window.innerHeight; + } + } else { + width = this._renderingCanvas ? this._renderingCanvas.width : 100; + height = this._renderingCanvas ? this._renderingCanvas.height : 100; } - return condition; + this.setSize(width / this._hardwareScalingLevel, height / this._hardwareScalingLevel, forceSetSize); } -}; - -// node_modules/@babylonjs/core/Engines/Processors/shaderProcessor.js -var regexSE = /defined\s*?\((.+?)\)/g; -var regexSERevert = /defined\s*?\[(.+?)\]/g; -var regexShaderInclude = /#include\s?<(.+)>(\((.*)\))*(\[(.*)\])*/g; -var regexShaderDecl = /__decl__/; -var regexLightX = /light\{X\}.(\w*)/g; -var regexX = /\{X\}/g; -var reusableMatches = []; -var ShaderProcessor = class _ShaderProcessor { - static Initialize(options) { - if (options.processor && options.processor.initializeShaders) { - options.processor.initializeShaders(options.processingContext); - } - } - static Process(sourceCode, options, callback, engine) { - var _a; - if ((_a = options.processor) == null ? void 0 : _a.preProcessShaderCode) { - sourceCode = options.processor.preProcessShaderCode(sourceCode, options.isFragment); - } - this._ProcessIncludes(sourceCode, options, (codeWithIncludes) => { - if (options.processCodeAfterIncludes) { - codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? "fragment" : "vertex", codeWithIncludes); - } - const migratedCode = this._ProcessShaderConversion(codeWithIncludes, options, engine); - callback(migratedCode, codeWithIncludes); - }); - } - static PreProcess(sourceCode, options, callback, engine) { - var _a; - if ((_a = options.processor) == null ? void 0 : _a.preProcessShaderCode) { - sourceCode = options.processor.preProcessShaderCode(sourceCode, options.isFragment); - } - this._ProcessIncludes(sourceCode, options, (codeWithIncludes) => { - if (options.processCodeAfterIncludes) { - codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? "fragment" : "vertex", codeWithIncludes); - } - const migratedCode = this._ApplyPreProcessing(codeWithIncludes, options, engine); - callback(migratedCode, codeWithIncludes); - }); - } - static Finalize(vertexCode, fragmentCode, options) { - if (!options.processor || !options.processor.finalizeShaders) { - return { vertexCode, fragmentCode }; - } - return options.processor.finalizeShaders(vertexCode, fragmentCode, options.processingContext); - } - static _ProcessPrecision(source, options) { - var _a; - if ((_a = options.processor) == null ? void 0 : _a.noPrecision) { - return source; + /** + * Force a specific size of the canvas + * @param width defines the new canvas' width + * @param height defines the new canvas' height + * @param forceSetSize true to force setting the sizes of the underlying canvas + * @returns true if the size was changed + */ + setSize(width, height, forceSetSize = false) { + if (!this._renderingCanvas) { + return false; } - const shouldUseHighPrecisionShader = options.shouldUseHighPrecisionShader; - if (source.indexOf("precision highp float") === -1) { - if (!shouldUseHighPrecisionShader) { - source = "precision mediump float;\n" + source; - } else { - source = "precision highp float;\n" + source; - } - } else { - if (!shouldUseHighPrecisionShader) { - source = source.replace("precision highp float", "precision mediump float"); - } + width = width | 0; + height = height | 0; + if (!forceSetSize && this._renderingCanvas.width === width && this._renderingCanvas.height === height) { + return false; } - return source; + this._renderingCanvas.width = width; + this._renderingCanvas.height = height; + return true; } - static _ExtractOperation(expression) { - const regex = /defined\((.+)\)/; - const match = regex.exec(expression); - if (match && match.length) { - return new ShaderDefineIsDefinedOperator(match[1].trim(), expression[0] === "!"); + /** + * Binds the frame buffer to the specified texture. + * @param rtWrapper The render target wrapper to render to + * @param faceIndex The face of the texture to render to in case of cube texture and if the render target wrapper is not a multi render target + * @param requiredWidth The width of the target to render to + * @param requiredHeight The height of the target to render to + * @param forceFullscreenViewport Forces the viewport to be the entire texture/screen if true + * @param lodLevel Defines the lod level to bind to the frame buffer + * @param layer Defines the 2d array index to bind to the frame buffer if the render target wrapper is not a multi render target + */ + bindFramebuffer(rtWrapper, faceIndex = 0, requiredWidth, requiredHeight, forceFullscreenViewport, lodLevel = 0, layer = 0) { + var _a, _b, _c, _d, _e, _f; + const webglRTWrapper = rtWrapper; + if (this._currentRenderTarget) { + this.unBindFramebuffer(this._currentRenderTarget); } - const operators = ["==", "!=", ">=", "<=", "<", ">"]; - let operator = ""; - let indexOperator = 0; - for (operator of operators) { - indexOperator = expression.indexOf(operator); - if (indexOperator > -1) { - break; + this._currentRenderTarget = rtWrapper; + this._bindUnboundFramebuffer(webglRTWrapper._MSAAFramebuffer ? webglRTWrapper._MSAAFramebuffer : webglRTWrapper._framebuffer); + const gl = this._gl; + if (!rtWrapper.isMulti) { + if (rtWrapper.is2DArray || rtWrapper.is3D) { + gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, (_a = rtWrapper.texture._hardwareTexture) == null ? void 0 : _a.underlyingResource, lodLevel, layer); + } else if (rtWrapper.isCube) { + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, (_b = rtWrapper.texture._hardwareTexture) == null ? void 0 : _b.underlyingResource, lodLevel); + } else if (webglRTWrapper._currentLOD !== lodLevel) { + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, (_c = rtWrapper.texture._hardwareTexture) == null ? void 0 : _c.underlyingResource, lodLevel); + webglRTWrapper._currentLOD = lodLevel; } } - if (indexOperator === -1) { - return new ShaderDefineIsDefinedOperator(expression); - } - const define = expression.substring(0, indexOperator).trim(); - const value = expression.substring(indexOperator + operator.length).trim(); - return new ShaderDefineArithmeticOperator(define, operator, value); - } - static _BuildSubExpression(expression) { - expression = expression.replace(regexSE, "defined[$1]"); - const postfix = ShaderDefineExpression.infixToPostfix(expression); - const stack = []; - for (const c of postfix) { - if (c !== "||" && c !== "&&") { - stack.push(c); - } else if (stack.length >= 2) { - let v1 = stack[stack.length - 1], v2 = stack[stack.length - 2]; - stack.length -= 2; - const operator = c == "&&" ? new ShaderDefineAndOperator() : new ShaderDefineOrOperator(); - if (typeof v1 === "string") { - v1 = v1.replace(regexSERevert, "defined($1)"); - } - if (typeof v2 === "string") { - v2 = v2.replace(regexSERevert, "defined($1)"); + const depthStencilTexture = rtWrapper._depthStencilTexture; + if (depthStencilTexture) { + if (rtWrapper.is3D) { + if (rtWrapper.texture.width !== depthStencilTexture.width || rtWrapper.texture.height !== depthStencilTexture.height || rtWrapper.texture.depth !== depthStencilTexture.depth) { + Logger.Warn("Depth/Stencil attachment for 3D target must have same dimensions as color attachment"); } - operator.leftOperand = typeof v2 === "string" ? this._ExtractOperation(v2) : v2; - operator.rightOperand = typeof v1 === "string" ? this._ExtractOperation(v1) : v1; - stack.push(operator); } - } - let result = stack[stack.length - 1]; - if (typeof result === "string") { - result = result.replace(regexSERevert, "defined($1)"); - } - return typeof result === "string" ? this._ExtractOperation(result) : result; - } - static _BuildExpression(line, start) { - const node = new ShaderCodeTestNode(); - const command = line.substring(0, start); - let expression = line.substring(start); - expression = expression.substring(0, (expression.indexOf("//") + 1 || expression.length + 1) - 1).trim(); - if (command === "#ifdef") { - node.testExpression = new ShaderDefineIsDefinedOperator(expression); - } else if (command === "#ifndef") { - node.testExpression = new ShaderDefineIsDefinedOperator(expression, true); - } else { - node.testExpression = this._BuildSubExpression(expression); - } - return node; - } - static _MoveCursorWithinIf(cursor, rootNode, ifNode) { - let line = cursor.currentLine; - while (this._MoveCursor(cursor, ifNode)) { - line = cursor.currentLine; - const first5 = line.substring(0, 5).toLowerCase(); - if (first5 === "#else") { - const elseNode = new ShaderCodeNode(); - rootNode.children.push(elseNode); - this._MoveCursor(cursor, elseNode); - return; - } else if (first5 === "#elif") { - const elifNode = this._BuildExpression(line, 5); - rootNode.children.push(elifNode); - ifNode = elifNode; + const attachment = rtWrapper._depthStencilTextureWithStencil ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT; + if (rtWrapper.is2DArray || rtWrapper.is3D) { + gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachment, (_d = depthStencilTexture._hardwareTexture) == null ? void 0 : _d.underlyingResource, lodLevel, layer); + } else if (rtWrapper.isCube) { + gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, (_e = depthStencilTexture._hardwareTexture) == null ? void 0 : _e.underlyingResource, lodLevel); + } else { + gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, (_f = depthStencilTexture._hardwareTexture) == null ? void 0 : _f.underlyingResource, lodLevel); } } - } - static _MoveCursor(cursor, rootNode) { - while (cursor.canRead) { - cursor.lineIndex++; - const line = cursor.currentLine; - if (line.indexOf("#") >= 0) { - const matches = _ShaderProcessor._MoveCursorRegex.exec(line); - if (matches && matches.length) { - const keyword = matches[0]; - switch (keyword) { - case "#ifdef": { - const newRootNode = new ShaderCodeConditionNode(); - rootNode.children.push(newRootNode); - const ifNode = this._BuildExpression(line, 6); - newRootNode.children.push(ifNode); - this._MoveCursorWithinIf(cursor, newRootNode, ifNode); - break; - } - case "#else": - case "#elif": - return true; - case "#endif": - return false; - case "#ifndef": { - const newRootNode = new ShaderCodeConditionNode(); - rootNode.children.push(newRootNode); - const ifNode = this._BuildExpression(line, 7); - newRootNode.children.push(ifNode); - this._MoveCursorWithinIf(cursor, newRootNode, ifNode); - break; - } - case "#if": { - const newRootNode = new ShaderCodeConditionNode(); - const ifNode = this._BuildExpression(line, 3); - rootNode.children.push(newRootNode); - newRootNode.children.push(ifNode); - this._MoveCursorWithinIf(cursor, newRootNode, ifNode); - break; - } - } - continue; + if (this._cachedViewport && !forceFullscreenViewport) { + this.setViewport(this._cachedViewport, requiredWidth, requiredHeight); + } else { + if (!requiredWidth) { + requiredWidth = rtWrapper.width; + if (lodLevel) { + requiredWidth = requiredWidth / Math.pow(2, lodLevel); } } - const newNode = new ShaderCodeNode(); - newNode.line = line; - rootNode.children.push(newNode); - if (line[0] === "#" && line[1] === "d") { - const split = line.replace(";", "").split(" "); - newNode.additionalDefineKey = split[1]; - if (split.length === 3) { - newNode.additionalDefineValue = split[2]; + if (!requiredHeight) { + requiredHeight = rtWrapper.height; + if (lodLevel) { + requiredHeight = requiredHeight / Math.pow(2, lodLevel); } } + this._viewport(0, 0, requiredWidth, requiredHeight); } - return false; - } - static _EvaluatePreProcessors(sourceCode, preprocessors, options) { - const rootNode = new ShaderCodeNode(); - const cursor = new ShaderCodeCursor(); - cursor.lineIndex = -1; - cursor.lines = sourceCode.split("\n"); - this._MoveCursor(cursor, rootNode); - return rootNode.process(preprocessors, options); - } - static _PreparePreProcessors(options, engine) { - var _a; - const defines = options.defines; - const preprocessors = {}; - for (const define of defines) { - const keyValue = define.replace("#define", "").replace(";", "").trim(); - const split = keyValue.split(" "); - preprocessors[split[0]] = split.length > 1 ? split[1] : ""; - } - if (((_a = options.processor) == null ? void 0 : _a.shaderLanguage) === ShaderLanguage.GLSL) { - preprocessors["GL_ES"] = "true"; - } - preprocessors["__VERSION__"] = options.version; - preprocessors[options.platformName] = "true"; - engine._getGlobalDefines(preprocessors); - return preprocessors; + this.wipeCaches(); } - static _ProcessShaderConversion(sourceCode, options, engine) { - let preparedSourceCode = this._ProcessPrecision(sourceCode, options); - if (!options.processor) { - return preparedSourceCode; - } - if (options.processor.shaderLanguage === ShaderLanguage.GLSL && preparedSourceCode.indexOf("#version 3") !== -1) { - preparedSourceCode = preparedSourceCode.replace("#version 300 es", ""); - if (!options.processor.parseGLES3) { - return preparedSourceCode; - } - } - const defines = options.defines; - const preprocessors = this._PreparePreProcessors(options, engine); - if (options.processor.preProcessor) { - preparedSourceCode = options.processor.preProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext); + /** + * Set various states to the webGL context + * @param culling defines culling state: true to enable culling, false to disable it + * @param zOffset defines the value to apply to zOffset (0 by default) + * @param force defines if states must be applied even if cache is up to date + * @param reverseSide defines if culling must be reversed (CCW if false, CW if true) + * @param cullBackFaces true to cull back faces, false to cull front faces (if culling is enabled) + * @param stencil stencil states to set + * @param zOffsetUnits defines the value to apply to zOffsetUnits (0 by default) + */ + setState(culling, zOffset = 0, force, reverseSide = false, cullBackFaces, stencil, zOffsetUnits = 0) { + if (this._depthCullingState.cull !== culling || force) { + this._depthCullingState.cull = culling; } - preparedSourceCode = this._EvaluatePreProcessors(preparedSourceCode, preprocessors, options); - if (options.processor.postProcessor) { - preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext, engine); + const cullFace = this.cullBackFaces ?? cullBackFaces ?? true ? this._gl.BACK : this._gl.FRONT; + if (this._depthCullingState.cullFace !== cullFace || force) { + this._depthCullingState.cullFace = cullFace; } - if (engine._features.needShaderCodeInlining) { - preparedSourceCode = engine.inlineShaderCode(preparedSourceCode); + this.setZOffset(zOffset); + this.setZOffsetUnits(zOffsetUnits); + const frontFace = reverseSide ? this._gl.CW : this._gl.CCW; + if (this._depthCullingState.frontFace !== frontFace || force) { + this._depthCullingState.frontFace = frontFace; } - return preparedSourceCode; + this._stencilStateComposer.stencilMaterial = stencil; } - static _ApplyPreProcessing(sourceCode, options, engine) { - var _a, _b; - let preparedSourceCode = sourceCode; - const defines = options.defines; - const preprocessors = this._PreparePreProcessors(options, engine); - if ((_a = options.processor) == null ? void 0 : _a.preProcessor) { - preparedSourceCode = options.processor.preProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext); - } - preparedSourceCode = this._EvaluatePreProcessors(preparedSourceCode, preprocessors, options); - if ((_b = options.processor) == null ? void 0 : _b.postProcessor) { - preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext, engine); - } - if (engine._features.needShaderCodeInlining) { - preparedSourceCode = engine.inlineShaderCode(preparedSourceCode); - } - return preparedSourceCode; + /** + * Gets a boolean indicating if depth testing is enabled + * @returns the current state + */ + getDepthBuffer() { + return this._depthCullingState.depthTest; } - /** @internal */ - static _ProcessIncludes(sourceCode, options, callback) { - reusableMatches.length = 0; - let match; - while ((match = regexShaderInclude.exec(sourceCode)) !== null) { - reusableMatches.push(match); - } - let returnValue = String(sourceCode); - let parts = [sourceCode]; - let keepProcessing = false; - for (const match2 of reusableMatches) { - let includeFile = match2[1]; - if (includeFile.indexOf("__decl__") !== -1) { - includeFile = includeFile.replace(regexShaderDecl, ""); - if (options.supportsUniformBuffers) { - includeFile = includeFile.replace("Vertex", "Ubo").replace("Fragment", "Ubo"); - } - includeFile = includeFile + "Declaration"; - } - if (options.includesShadersStore[includeFile]) { - let includeContent = options.includesShadersStore[includeFile]; - if (match2[2]) { - const splits = match2[3].split(","); - for (let index = 0; index < splits.length; index += 2) { - const source = new RegExp(splits[index], "g"); - const dest = splits[index + 1]; - includeContent = includeContent.replace(source, dest); - } - } - if (match2[4]) { - const indexString = match2[5]; - if (indexString.indexOf("..") !== -1) { - const indexSplits = indexString.split(".."); - const minIndex = parseInt(indexSplits[0]); - let maxIndex = parseInt(indexSplits[1]); - let sourceIncludeContent = includeContent.slice(0); - includeContent = ""; - if (isNaN(maxIndex)) { - maxIndex = options.indexParameters[indexSplits[1]]; - } - for (let i = minIndex; i < maxIndex; i++) { - if (!options.supportsUniformBuffers) { - sourceIncludeContent = sourceIncludeContent.replace(regexLightX, (str, p1) => { - return p1 + "{X}"; - }); - } - includeContent += sourceIncludeContent.replace(regexX, i.toString()) + "\n"; - } - } else { - if (!options.supportsUniformBuffers) { - includeContent = includeContent.replace(regexLightX, (str, p1) => { - return p1 + "{X}"; - }); - } - includeContent = includeContent.replace(regexX, indexString); - } - } - const newParts = []; - for (const part of parts) { - const splitPart = part.split(match2[0]); - for (let i = 0; i < splitPart.length - 1; i++) { - newParts.push(splitPart[i]); - newParts.push(includeContent); - } - newParts.push(splitPart[splitPart.length - 1]); - } - parts = newParts; - keepProcessing = keepProcessing || includeContent.indexOf("#include<") >= 0 || includeContent.indexOf("#include <") >= 0; - } else { - const includeShaderUrl = options.shadersRepository + "ShadersInclude/" + includeFile + ".fx"; - _ShaderProcessor._FileToolsLoadFile(includeShaderUrl, (fileContent) => { - options.includesShadersStore[includeFile] = fileContent; - this._ProcessIncludes(parts.join(""), options, callback); - }); - return; - } - } - reusableMatches.length = 0; - returnValue = parts.join(""); - if (keepProcessing) { - this._ProcessIncludes(returnValue.toString(), options, callback); - } else { - callback(returnValue); - } + /** + * Enable or disable depth buffering + * @param enable defines the state to set + */ + setDepthBuffer(enable) { + this._depthCullingState.depthTest = enable; } /** - * Loads a file from a url - * @param url url to load - * @param onSuccess callback called when the file successfully loads - * @param onProgress callback called while file is loading (if the server supports this mode) - * @param offlineProvider defines the offline provider for caching - * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer - * @param onError callback called when the file fails to load - * @returns a file request object - * @internal + * Set the z offset Factor to apply to current rendering + * @param value defines the offset to apply */ - static _FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError) { - throw _WarnImport("FileTools"); + setZOffset(value) { + this._depthCullingState.zOffset = this.useReverseDepthBuffer ? -value : value; } -}; -ShaderProcessor._MoveCursorRegex = /(#ifdef)|(#else)|(#elif)|(#endif)|(#ifndef)|(#if)/; - -// node_modules/@babylonjs/core/Materials/effect.js -var Effect = class _Effect { /** - * Gets or sets the relative url used to load shaders if using the engine in non-minified mode + * Gets the current value of the zOffset Factor + * @returns the current zOffset Factor state */ - static get ShadersRepository() { - return ShaderStore.ShadersRepository; + getZOffset() { + const zOffset = this._depthCullingState.zOffset; + return this.useReverseDepthBuffer ? -zOffset : zOffset; } - static set ShadersRepository(repo) { - ShaderStore.ShadersRepository = repo; + /** + * Set the z offset Units to apply to current rendering + * @param value defines the offset to apply + */ + setZOffsetUnits(value) { + this._depthCullingState.zOffsetUnits = this.useReverseDepthBuffer ? -value : value; } /** - * Observable that will be called when effect is bound. + * Gets the current value of the zOffset Units + * @returns the current zOffset Units state */ - get onBindObservable() { - if (!this._onBindObservable) { - this._onBindObservable = new Observable(); - } - return this._onBindObservable; + getZOffsetUnits() { + const zOffsetUnits = this._depthCullingState.zOffsetUnits; + return this.useReverseDepthBuffer ? -zOffsetUnits : zOffsetUnits; } /** - * Gets the shader language type used to write vertex and fragment source code. + * @internal */ - get shaderLanguage() { - return this._shaderLanguage; + _bindUnboundFramebuffer(framebuffer) { + if (this._currentFramebuffer !== framebuffer) { + this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer); + this._currentFramebuffer = framebuffer; + } + } + /** @internal */ + _currentFrameBufferIsDefaultFrameBuffer() { + return this._currentFramebuffer === null; } /** - * Instantiates an effect. - * An effect can be used to create/manage/execute vertex and fragment shaders. - * @param baseName Name of the effect. - * @param attributesNamesOrOptions List of attribute names that will be passed to the shader or set of all options to create the effect. - * @param uniformsNamesOrEngine List of uniform variable names that will be passed to the shader or the engine that will be used to render effect. - * @param samplers List of sampler variables that will be passed to the shader. - * @param engine Engine to be used to render the effect - * @param defines Define statements to be added to the shader. - * @param fallbacks Possible fallbacks for this effect to improve performance when needed. - * @param onCompiled Callback that will be called when the shader is compiled. - * @param onError Callback that will be called if an error occurs during shader compilation. - * @param indexParameters Parameters to be used with Babylons include syntax to iterate over an array (eg. \{lights: 10\}) - * @param key Effect Key identifying uniquely compiled shader variants - * @param shaderLanguage the language the shader is written in (default: GLSL) + * Generates the mipmaps for a texture + * @param texture texture to generate the mipmaps for */ - constructor(baseName, attributesNamesOrOptions, uniformsNamesOrEngine, samplers = null, engine, defines = null, fallbacks = null, onCompiled = null, onError = null, indexParameters, key = "", shaderLanguage = ShaderLanguage.GLSL) { - this.defines = ""; - this.onCompiled = null; - this.onError = null; - this.onBind = null; - this.uniqueId = 0; - this.onCompileObservable = new Observable(); - this.onErrorObservable = new Observable(); - this._onBindObservable = null; - this._isDisposed = false; - this._bonesComputationForcedToCPU = false; - this._uniformBuffersNames = {}; - this._multiTarget = false; - this._samplers = {}; - this._isReady = false; - this._compilationError = ""; - this._allFallbacksProcessed = false; - this._uniforms = {}; - this._key = ""; - this._fallbacks = null; - this._vertexSourceCodeOverride = ""; - this._fragmentSourceCodeOverride = ""; - this._transformFeedbackVaryings = null; - this._pipelineContext = null; - this._vertexSourceCode = ""; - this._fragmentSourceCode = ""; - this._vertexSourceCodeBeforeMigration = ""; - this._fragmentSourceCodeBeforeMigration = ""; - this._rawVertexSourceCode = ""; - this._rawFragmentSourceCode = ""; - this._processCodeAfterIncludes = void 0; - this._processFinalCode = null; - this.name = baseName; - this._key = key; - if (attributesNamesOrOptions.attributes) { - const options = attributesNamesOrOptions; - this._engine = uniformsNamesOrEngine; - this._attributesNames = options.attributes; - this._uniformsNames = options.uniformsNames.concat(options.samplers); - this._samplerList = options.samplers.slice(); - this.defines = options.defines; - this.onError = options.onError; - this.onCompiled = options.onCompiled; - this._fallbacks = options.fallbacks; - this._indexParameters = options.indexParameters; - this._transformFeedbackVaryings = options.transformFeedbackVaryings || null; - this._multiTarget = !!options.multiTarget; - this._shaderLanguage = options.shaderLanguage ?? ShaderLanguage.GLSL; - if (options.uniformBuffersNames) { - this._uniformBuffersNamesList = options.uniformBuffersNames.slice(); - for (let i = 0; i < options.uniformBuffersNames.length; i++) { - this._uniformBuffersNames[options.uniformBuffersNames[i]] = i; - } - } - this._processFinalCode = options.processFinalCode ?? null; - this._processCodeAfterIncludes = options.processCodeAfterIncludes ?? void 0; - } else { - this._engine = engine; - this.defines = defines == null ? "" : defines; - this._uniformsNames = uniformsNamesOrEngine.concat(samplers); - this._samplerList = samplers ? samplers.slice() : []; - this._attributesNames = attributesNamesOrOptions; - this._uniformBuffersNamesList = []; - this._shaderLanguage = shaderLanguage; - this.onError = onError; - this.onCompiled = onCompiled; - this._indexParameters = indexParameters; - this._fallbacks = fallbacks; - } - this._attributeLocationByName = {}; - this.uniqueId = _Effect._UniqueIdSeed++; - this._processShaderCode(); + generateMipmaps(texture) { + const target = this._getTextureTarget(texture); + this._bindTextureDirectly(target, texture, true); + this._gl.generateMipmap(target); + this._bindTextureDirectly(target, null); } - /** @internal */ - _processShaderCode(shaderProcessor = null, keepExistingPipelineContext = false) { - let vertexSource; - let fragmentSource; - const baseName = this.name; - const hostDocument = IsWindowObjectExist() ? this._engine.getHostDocument() : null; - if (typeof baseName === "string") { - vertexSource = baseName; - } else if (baseName.vertexSource) { - vertexSource = "source:" + baseName.vertexSource; - } else if (baseName.vertexElement) { - vertexSource = (hostDocument == null ? void 0 : hostDocument.getElementById(baseName.vertexElement)) || baseName.vertexElement; - } else { - vertexSource = baseName.vertex || baseName; + /** + * Unbind the current render target texture from the webGL context + * @param texture defines the render target wrapper to unbind + * @param disableGenerateMipMaps defines a boolean indicating that mipmaps must not be generated + * @param onBeforeUnbind defines a function which will be called before the effective unbind + */ + unBindFramebuffer(texture, disableGenerateMipMaps = false, onBeforeUnbind) { + var _a; + const webglRTWrapper = texture; + this._currentRenderTarget = null; + const gl = this._gl; + if (webglRTWrapper._MSAAFramebuffer) { + if (texture.isMulti) { + this.unBindMultiColorAttachmentFramebuffer(texture, disableGenerateMipMaps, onBeforeUnbind); + return; + } + gl.bindFramebuffer(gl.READ_FRAMEBUFFER, webglRTWrapper._MSAAFramebuffer); + gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, webglRTWrapper._framebuffer); + gl.blitFramebuffer(0, 0, texture.width, texture.height, 0, 0, texture.width, texture.height, gl.COLOR_BUFFER_BIT, gl.NEAREST); } - if (typeof baseName === "string") { - fragmentSource = baseName; - } else if (baseName.fragmentSource) { - fragmentSource = "source:" + baseName.fragmentSource; - } else if (baseName.fragmentElement) { - fragmentSource = (hostDocument == null ? void 0 : hostDocument.getElementById(baseName.fragmentElement)) || baseName.fragmentElement; - } else { - fragmentSource = baseName.fragment || baseName; + if (((_a = texture.texture) == null ? void 0 : _a.generateMipMaps) && !disableGenerateMipMaps && !texture.isCube) { + this.generateMipmaps(texture.texture); } - this._processingContext = this._engine._getShaderProcessingContext(this._shaderLanguage); - let processorOptions = { - defines: this.defines.split("\n"), - indexParameters: this._indexParameters, - isFragment: false, - shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader, - processor: shaderProcessor ?? this._engine._getShaderProcessor(this._shaderLanguage), - supportsUniformBuffers: this._engine.supportsUniformBuffers, - shadersRepository: ShaderStore.GetShadersRepository(this._shaderLanguage), - includesShadersStore: ShaderStore.GetIncludesShadersStore(this._shaderLanguage), - version: (this._engine.version * 100).toString(), - platformName: this._engine.shaderPlatformName, - processingContext: this._processingContext, - isNDCHalfZRange: this._engine.isNDCHalfZRange, - useReverseDepthBuffer: this._engine.useReverseDepthBuffer, - processCodeAfterIncludes: this._processCodeAfterIncludes - }; - const shaderCodes = [void 0, void 0]; - const shadersLoaded = () => { - if (shaderCodes[0] && shaderCodes[1]) { - processorOptions.isFragment = true; - const [migratedVertexCode, fragmentCode] = shaderCodes; - ShaderProcessor.Process(fragmentCode, processorOptions, (migratedFragmentCode, codeBeforeMigration) => { - this._fragmentSourceCodeBeforeMigration = codeBeforeMigration; - if (this._processFinalCode) { - migratedFragmentCode = this._processFinalCode("fragment", migratedFragmentCode); - } - const finalShaders = ShaderProcessor.Finalize(migratedVertexCode, migratedFragmentCode, processorOptions); - processorOptions = null; - this._useFinalCode(finalShaders.vertexCode, finalShaders.fragmentCode, baseName, keepExistingPipelineContext); - }, this._engine); + if (onBeforeUnbind) { + if (webglRTWrapper._MSAAFramebuffer) { + this._bindUnboundFramebuffer(webglRTWrapper._framebuffer); } - }; - this._loadShader(vertexSource, "Vertex", "", (vertexCode) => { - ShaderProcessor.Initialize(processorOptions); - ShaderProcessor.Process(vertexCode, processorOptions, (migratedVertexCode, codeBeforeMigration) => { - this._rawVertexSourceCode = vertexCode; - this._vertexSourceCodeBeforeMigration = codeBeforeMigration; - if (this._processFinalCode) { - migratedVertexCode = this._processFinalCode("vertex", migratedVertexCode); - } - shaderCodes[0] = migratedVertexCode; - shadersLoaded(); - }, this._engine); - }); - this._loadShader(fragmentSource, "Fragment", "Pixel", (fragmentCode) => { - this._rawFragmentSourceCode = fragmentCode; - shaderCodes[1] = fragmentCode; - shadersLoaded(); - }); - } - _useFinalCode(migratedVertexCode, migratedFragmentCode, baseName, keepExistingPipelineContext = false) { - if (baseName) { - const vertex = baseName.vertexElement || baseName.vertex || baseName.spectorName || baseName; - const fragment = baseName.fragmentElement || baseName.fragment || baseName.spectorName || baseName; - this._vertexSourceCode = (this._shaderLanguage === ShaderLanguage.WGSL ? "//" : "") + "#define SHADER_NAME vertex:" + vertex + "\n" + migratedVertexCode; - this._fragmentSourceCode = (this._shaderLanguage === ShaderLanguage.WGSL ? "//" : "") + "#define SHADER_NAME fragment:" + fragment + "\n" + migratedFragmentCode; - } else { - this._vertexSourceCode = migratedVertexCode; - this._fragmentSourceCode = migratedFragmentCode; + onBeforeUnbind(); } - this._prepareEffect(keepExistingPipelineContext); + this._bindUnboundFramebuffer(null); } /** - * Unique key for this effect + * Force a webGL flush (ie. a flush of all waiting webGL commands) */ - get key() { - return this._key; + flushFramebuffer() { + this._gl.flush(); } /** - * If the effect has been compiled and prepared. - * @returns if the effect is compiled and prepared. + * Unbind the current render target and bind the default framebuffer */ - isReady() { - try { - return this._isReadyInternal(); - } catch { - return false; - } - } - _isReadyInternal() { - if (this._isReady) { - return true; + restoreDefaultFramebuffer() { + if (this._currentRenderTarget) { + this.unBindFramebuffer(this._currentRenderTarget); + } else { + this._bindUnboundFramebuffer(null); } - if (this._pipelineContext) { - return this._pipelineContext.isReady; + if (this._cachedViewport) { + this.setViewport(this._cachedViewport); } - return false; - } - /** - * The engine the effect was initialized with. - * @returns the engine. - */ - getEngine() { - return this._engine; - } - /** - * The pipeline context for this effect - * @returns the associated pipeline context - */ - getPipelineContext() { - return this._pipelineContext; + this.wipeCaches(); } - /** - * The set of names of attribute variables for the shader. - * @returns An array of attribute names. - */ - getAttributesNames() { - return this._attributesNames; + // VBOs + /** @internal */ + _resetVertexBufferBinding() { + this.bindArrayBuffer(null); + this._cachedVertexBuffers = null; } /** - * Returns the attribute at the given index. - * @param index The index of the attribute. - * @returns The location of the attribute. + * Creates a vertex buffer + * @param data the data or size for the vertex buffer + * @param _updatable whether the buffer should be created as updatable + * @param _label defines the label of the buffer (for debug purpose) + * @returns the new WebGL static buffer */ - getAttributeLocation(index) { - return this._attributes[index]; + createVertexBuffer(data, _updatable, _label) { + return this._createVertexBuffer(data, this._gl.STATIC_DRAW); } - /** - * Returns the attribute based on the name of the variable. - * @param name of the attribute to look up. - * @returns the attribute location. - */ - getAttributeLocationByName(name69) { - return this._attributeLocationByName[name69]; + _createVertexBuffer(data, usage) { + const vbo = this._gl.createBuffer(); + if (!vbo) { + throw new Error("Unable to create vertex buffer"); + } + const dataBuffer = new WebGLDataBuffer(vbo); + this.bindArrayBuffer(dataBuffer); + if (typeof data !== "number") { + if (data instanceof Array) { + this._gl.bufferData(this._gl.ARRAY_BUFFER, new Float32Array(data), usage); + dataBuffer.capacity = data.length * 4; + } else { + this._gl.bufferData(this._gl.ARRAY_BUFFER, data, usage); + dataBuffer.capacity = data.byteLength; + } + } else { + this._gl.bufferData(this._gl.ARRAY_BUFFER, new Uint8Array(data), usage); + dataBuffer.capacity = data; + } + this._resetVertexBufferBinding(); + dataBuffer.references = 1; + return dataBuffer; } /** - * The number of attributes. - * @returns the number of attributes. + * Creates a dynamic vertex buffer + * @param data the data for the dynamic vertex buffer + * @param _label defines the label of the buffer (for debug purpose) + * @returns the new WebGL dynamic buffer */ - getAttributesCount() { - return this._attributes.length; + createDynamicVertexBuffer(data, _label) { + return this._createVertexBuffer(data, this._gl.DYNAMIC_DRAW); } - /** - * Gets the index of a uniform variable. - * @param uniformName of the uniform to look up. - * @returns the index. - */ - getUniformIndex(uniformName) { - return this._uniformsNames.indexOf(uniformName); + _resetIndexBufferBinding() { + this.bindIndexBuffer(null); + this._cachedIndexBuffer = null; } /** - * Returns the attribute based on the name of the variable. - * @param uniformName of the uniform to look up. - * @returns the location of the uniform. + * Creates a new index buffer + * @param indices defines the content of the index buffer + * @param updatable defines if the index buffer must be updatable + * @param _label defines the label of the buffer (for debug purpose) + * @returns a new webGL buffer */ - getUniform(uniformName) { - return this._uniforms[uniformName]; + createIndexBuffer(indices, updatable, _label) { + const vbo = this._gl.createBuffer(); + const dataBuffer = new WebGLDataBuffer(vbo); + if (!vbo) { + throw new Error("Unable to create index buffer"); + } + this.bindIndexBuffer(dataBuffer); + const data = this._normalizeIndexData(indices); + this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, data, updatable ? this._gl.DYNAMIC_DRAW : this._gl.STATIC_DRAW); + this._resetIndexBufferBinding(); + dataBuffer.references = 1; + dataBuffer.is32Bits = data.BYTES_PER_ELEMENT === 4; + return dataBuffer; } - /** - * Returns an array of sampler variable names - * @returns The array of sampler variable names. - */ - getSamplers() { - return this._samplerList; + _normalizeIndexData(indices) { + const bytesPerElement = indices.BYTES_PER_ELEMENT; + if (bytesPerElement === 2) { + return indices; + } + if (this._caps.uintIndices) { + if (indices instanceof Uint32Array) { + return indices; + } else { + for (let index = 0; index < indices.length; index++) { + if (indices[index] >= 65535) { + return new Uint32Array(indices); + } + } + return new Uint16Array(indices); + } + } + return new Uint16Array(indices); } /** - * Returns an array of uniform variable names - * @returns The array of uniform variable names. + * Bind a webGL buffer to the webGL context + * @param buffer defines the buffer to bind */ - getUniformNames() { - return this._uniformsNames; + bindArrayBuffer(buffer) { + if (!this._vaoRecordInProgress) { + this._unbindVertexArrayObject(); + } + this._bindBuffer(buffer, this._gl.ARRAY_BUFFER); } /** - * Returns an array of uniform buffer variable names - * @returns The array of uniform buffer variable names. + * Bind a specific block at a given index in a specific shader program + * @param pipelineContext defines the pipeline context to use + * @param blockName defines the block name + * @param index defines the index where to bind the block */ - getUniformBuffersNames() { - return this._uniformBuffersNamesList; + bindUniformBlock(pipelineContext, blockName, index) { + const program = pipelineContext.program; + const uniformLocation = this._gl.getUniformBlockIndex(program, blockName); + this._gl.uniformBlockBinding(program, uniformLocation, index); } - /** - * Returns the index parameters used to create the effect - * @returns The index parameters object - */ - getIndexParameters() { - return this._indexParameters; + // eslint-disable-next-line @typescript-eslint/naming-convention + bindIndexBuffer(buffer) { + if (!this._vaoRecordInProgress) { + this._unbindVertexArrayObject(); + } + this._bindBuffer(buffer, this._gl.ELEMENT_ARRAY_BUFFER); } - /** - * The error from the last compilation. - * @returns the error string. - */ - getCompilationError() { - return this._compilationError; + _bindBuffer(buffer, target) { + if (this._vaoRecordInProgress || this._currentBoundBuffer[target] !== buffer) { + this._gl.bindBuffer(target, buffer ? buffer.underlyingResource : null); + this._currentBoundBuffer[target] = buffer; + } } /** - * Gets a boolean indicating that all fallbacks were used during compilation - * @returns true if all fallbacks were used + * update the bound buffer with the given data + * @param data defines the data to update */ - allFallbacksProcessed() { - return this._allFallbacksProcessed; + updateArrayBuffer(data) { + this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data); } - /** - * Adds a callback to the onCompiled observable and call the callback immediately if already ready. - * @param func The callback to be used. - */ - executeWhenCompiled(func) { - if (this.isReady()) { - func(this); + _vertexAttribPointer(buffer, indx, size, type, normalized, stride, offset) { + const pointer = this._currentBufferPointers[indx]; + if (!pointer) { return; } - this.onCompileObservable.add((effect) => { - func(effect); - }); - if (!this._pipelineContext || this._pipelineContext.isAsync) { - setTimeout(() => { - this._checkIsReady(null); - }, 16); - } - } - _checkIsReady(previousPipelineContext) { - try { - if (this._isReadyInternal()) { - return; + let changed = false; + if (!pointer.active) { + changed = true; + pointer.active = true; + pointer.index = indx; + pointer.size = size; + pointer.type = type; + pointer.normalized = normalized; + pointer.stride = stride; + pointer.offset = offset; + pointer.buffer = buffer; + } else { + if (pointer.buffer !== buffer) { + pointer.buffer = buffer; + changed = true; } - } catch (e) { - this._processCompilationErrors(e, previousPipelineContext); - return; - } - if (this._isDisposed) { - return; - } - setTimeout(() => { - this._checkIsReady(previousPipelineContext); - }, 16); - } - _loadShader(shader69, key, optionalKey, callback) { - if (typeof HTMLElement !== "undefined") { - if (shader69 instanceof HTMLElement) { - const shaderCode = GetDOMTextContent(shader69); - callback(shaderCode); - return; + if (pointer.size !== size) { + pointer.size = size; + changed = true; + } + if (pointer.type !== type) { + pointer.type = type; + changed = true; + } + if (pointer.normalized !== normalized) { + pointer.normalized = normalized; + changed = true; + } + if (pointer.stride !== stride) { + pointer.stride = stride; + changed = true; + } + if (pointer.offset !== offset) { + pointer.offset = offset; + changed = true; } } - if (shader69.substr(0, 7) === "source:") { - callback(shader69.substr(7)); - return; - } - if (shader69.substr(0, 7) === "base64:") { - const shaderBinary = window.atob(shader69.substr(7)); - callback(shaderBinary); - return; - } - const shaderStore = ShaderStore.GetShadersStore(this._shaderLanguage); - if (shaderStore[shader69 + key + "Shader"]) { - callback(shaderStore[shader69 + key + "Shader"]); - return; + if (changed || this._vaoRecordInProgress) { + this.bindArrayBuffer(buffer); + if (type === this._gl.UNSIGNED_INT || type === this._gl.INT) { + this._gl.vertexAttribIPointer(indx, size, type, stride, offset); + } else { + this._gl.vertexAttribPointer(indx, size, type, normalized, stride, offset); + } } - if (optionalKey && shaderStore[shader69 + optionalKey + "Shader"]) { - callback(shaderStore[shader69 + optionalKey + "Shader"]); + } + /** + * @internal + */ + _bindIndexBufferWithCache(indexBuffer) { + if (indexBuffer == null) { return; } - let shaderUrl; - if (shader69[0] === "." || shader69[0] === "/" || shader69.indexOf("http") > -1) { - shaderUrl = shader69; - } else { - shaderUrl = ShaderStore.GetShadersRepository(this._shaderLanguage) + shader69; + if (this._cachedIndexBuffer !== indexBuffer) { + this._cachedIndexBuffer = indexBuffer; + this.bindIndexBuffer(indexBuffer); + this._uintIndicesCurrentlySet = indexBuffer.is32Bits; } - this._engine._loadFile(shaderUrl + "." + key.toLowerCase() + ".fx", callback); } - /** - * Gets the vertex shader source code of this effect - * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc) - */ - get vertexSourceCode() { - var _a; - return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride ? this._vertexSourceCodeOverride : ((_a = this._pipelineContext) == null ? void 0 : _a._getVertexShaderCode()) ?? this._vertexSourceCode; + _bindVertexBuffersAttributes(vertexBuffers, effect, overrideVertexBuffers) { + const attributes = effect.getAttributesNames(); + if (!this._vaoRecordInProgress) { + this._unbindVertexArrayObject(); + } + this.unbindAllAttributes(); + for (let index = 0; index < attributes.length; index++) { + const order = effect.getAttributeLocation(index); + if (order >= 0) { + const ai = attributes[index]; + let vertexBuffer = null; + if (overrideVertexBuffers) { + vertexBuffer = overrideVertexBuffers[ai]; + } + if (!vertexBuffer) { + vertexBuffer = vertexBuffers[ai]; + } + if (!vertexBuffer) { + continue; + } + this._gl.enableVertexAttribArray(order); + if (!this._vaoRecordInProgress) { + this._vertexAttribArraysEnabled[order] = true; + } + const buffer = vertexBuffer.getBuffer(); + if (buffer) { + this._vertexAttribPointer(buffer, order, vertexBuffer.getSize(), vertexBuffer.type, vertexBuffer.normalized, vertexBuffer.byteStride, vertexBuffer.byteOffset); + if (vertexBuffer.getIsInstanced()) { + this._gl.vertexAttribDivisor(order, vertexBuffer.getInstanceDivisor()); + if (!this._vaoRecordInProgress) { + this._currentInstanceLocations.push(order); + this._currentInstanceBuffers.push(buffer); + } + } + } + } + } } /** - * Gets the fragment shader source code of this effect - * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc) + * Records a vertex array object + * @see https://doc.babylonjs.com/setup/support/webGL2#vertex-array-objects + * @param vertexBuffers defines the list of vertex buffers to store + * @param indexBuffer defines the index buffer to store + * @param effect defines the effect to store + * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers + * @returns the new vertex array object */ - get fragmentSourceCode() { - var _a; - return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride ? this._fragmentSourceCodeOverride : ((_a = this._pipelineContext) == null ? void 0 : _a._getFragmentShaderCode()) ?? this._fragmentSourceCode; + recordVertexArrayObject(vertexBuffers, indexBuffer, effect, overrideVertexBuffers) { + const vao = this._gl.createVertexArray(); + if (!vao) { + throw new Error("Unable to create VAO"); + } + this._vaoRecordInProgress = true; + this._gl.bindVertexArray(vao); + this._mustWipeVertexAttributes = true; + this._bindVertexBuffersAttributes(vertexBuffers, effect, overrideVertexBuffers); + this.bindIndexBuffer(indexBuffer); + this._vaoRecordInProgress = false; + this._gl.bindVertexArray(null); + return vao; } /** - * Gets the vertex shader source code before migration. - * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed. - * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL). + * Bind a specific vertex array object + * @see https://doc.babylonjs.com/setup/support/webGL2#vertex-array-objects + * @param vertexArrayObject defines the vertex array object to bind + * @param indexBuffer defines the index buffer to bind */ - get vertexSourceCodeBeforeMigration() { - return this._vertexSourceCodeBeforeMigration; + bindVertexArrayObject(vertexArrayObject, indexBuffer) { + if (this._cachedVertexArrayObject !== vertexArrayObject) { + this._cachedVertexArrayObject = vertexArrayObject; + this._gl.bindVertexArray(vertexArrayObject); + this._cachedVertexBuffers = null; + this._cachedIndexBuffer = null; + this._uintIndicesCurrentlySet = indexBuffer != null && indexBuffer.is32Bits; + this._mustWipeVertexAttributes = true; + } } /** - * Gets the fragment shader source code before migration. - * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed. - * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL). + * Bind webGl buffers directly to the webGL context + * @param vertexBuffer defines the vertex buffer to bind + * @param indexBuffer defines the index buffer to bind + * @param vertexDeclaration defines the vertex declaration to use with the vertex buffer + * @param vertexStrideSize defines the vertex stride of the vertex buffer + * @param effect defines the effect associated with the vertex buffer */ - get fragmentSourceCodeBeforeMigration() { - return this._fragmentSourceCodeBeforeMigration; + bindBuffersDirectly(vertexBuffer, indexBuffer, vertexDeclaration, vertexStrideSize, effect) { + if (this._cachedVertexBuffers !== vertexBuffer || this._cachedEffectForVertexBuffers !== effect) { + this._cachedVertexBuffers = vertexBuffer; + this._cachedEffectForVertexBuffers = effect; + const attributesCount = effect.getAttributesCount(); + this._unbindVertexArrayObject(); + this.unbindAllAttributes(); + let offset = 0; + for (let index = 0; index < attributesCount; index++) { + if (index < vertexDeclaration.length) { + const order = effect.getAttributeLocation(index); + if (order >= 0) { + this._gl.enableVertexAttribArray(order); + this._vertexAttribArraysEnabled[order] = true; + this._vertexAttribPointer(vertexBuffer, order, vertexDeclaration[index], this._gl.FLOAT, false, vertexStrideSize, offset); + } + offset += vertexDeclaration[index] * 4; + } + } + } + this._bindIndexBufferWithCache(indexBuffer); + } + _unbindVertexArrayObject() { + if (!this._cachedVertexArrayObject) { + return; + } + this._cachedVertexArrayObject = null; + this._gl.bindVertexArray(null); } /** - * Gets the vertex shader source code before it has been modified by any processing + * Bind a list of vertex buffers to the webGL context + * @param vertexBuffers defines the list of vertex buffers to bind + * @param indexBuffer defines the index buffer to bind + * @param effect defines the effect associated with the vertex buffers + * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers */ - get rawVertexSourceCode() { - return this._rawVertexSourceCode; + bindBuffers(vertexBuffers, indexBuffer, effect, overrideVertexBuffers) { + if (this._cachedVertexBuffers !== vertexBuffers || this._cachedEffectForVertexBuffers !== effect) { + this._cachedVertexBuffers = vertexBuffers; + this._cachedEffectForVertexBuffers = effect; + this._bindVertexBuffersAttributes(vertexBuffers, effect, overrideVertexBuffers); + } + this._bindIndexBufferWithCache(indexBuffer); } /** - * Gets the fragment shader source code before it has been modified by any processing + * Unbind all instance attributes */ - get rawFragmentSourceCode() { - return this._rawFragmentSourceCode; + unbindInstanceAttributes() { + let boundBuffer; + for (let i = 0, ul = this._currentInstanceLocations.length; i < ul; i++) { + const instancesBuffer = this._currentInstanceBuffers[i]; + if (boundBuffer != instancesBuffer && instancesBuffer.references) { + boundBuffer = instancesBuffer; + this.bindArrayBuffer(instancesBuffer); + } + const offsetLocation = this._currentInstanceLocations[i]; + this._gl.vertexAttribDivisor(offsetLocation, 0); + } + this._currentInstanceBuffers.length = 0; + this._currentInstanceLocations.length = 0; } /** - * Recompiles the webGL program - * @param vertexSourceCode The source code for the vertex shader. - * @param fragmentSourceCode The source code for the fragment shader. - * @param onCompiled Callback called when completed. - * @param onError Callback called on error. - * @internal + * Release and free the memory of a vertex array object + * @param vao defines the vertex array object to delete */ - _rebuildProgram(vertexSourceCode, fragmentSourceCode, onCompiled, onError) { - this._isReady = false; - this._vertexSourceCodeOverride = vertexSourceCode; - this._fragmentSourceCodeOverride = fragmentSourceCode; - this.onError = (effect, error) => { - if (onError) { - onError(error); - } - }; - this.onCompiled = () => { - var _a, _b; - const scenes = this.getEngine().scenes; - if (scenes) { - for (let i = 0; i < scenes.length; i++) { - scenes[i].markAllMaterialsAsDirty(63); - } - } - (_b = (_a = this._pipelineContext)._handlesSpectorRebuildCallback) == null ? void 0 : _b.call(_a, onCompiled); - }; - this._fallbacks = null; - this._prepareEffect(); + releaseVertexArrayObject(vao) { + this._gl.deleteVertexArray(vao); } /** - * Prepares the effect * @internal */ - _prepareEffect(keepExistingPipelineContext = false) { - const attributesNames = this._attributesNames; - const defines = this.defines; - const previousPipelineContext = this._pipelineContext; - this._isReady = false; - try { - const engine = this._engine; - this._pipelineContext = (keepExistingPipelineContext ? previousPipelineContext : void 0) ?? engine.createPipelineContext(this._processingContext); - this._pipelineContext._name = this._key.replace(/\r/g, "").replace(/\n/g, "|"); - const rebuildRebind = (vertexSourceCode, fragmentSourceCode, onCompiled, onError) => this._rebuildProgram(vertexSourceCode, fragmentSourceCode, onCompiled, onError); - if (this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride) { - engine._preparePipelineContext(this._pipelineContext, this._vertexSourceCodeOverride, this._fragmentSourceCodeOverride, true, this._rawVertexSourceCode, this._rawFragmentSourceCode, rebuildRebind, null, this._transformFeedbackVaryings, this._key); - } else { - engine._preparePipelineContext(this._pipelineContext, this._vertexSourceCode, this._fragmentSourceCode, false, this._rawVertexSourceCode, this._rawFragmentSourceCode, rebuildRebind, defines, this._transformFeedbackVaryings, this._key); - } - engine._executeWhenRenderingStateIsCompiled(this._pipelineContext, () => { - this._attributes = []; - this._pipelineContext._fillEffectInformation(this, this._uniformBuffersNames, this._uniformsNames, this._uniforms, this._samplerList, this._samplers, attributesNames, this._attributes); - if (attributesNames) { - for (let i = 0; i < attributesNames.length; i++) { - const name69 = attributesNames[i]; - this._attributeLocationByName[name69] = this._attributes[i]; - } - } - engine.bindSamplers(this); - this._compilationError = ""; - this._isReady = true; - if (this.onCompiled) { - this.onCompiled(this); - } - this.onCompileObservable.notifyObservers(this); - this.onCompileObservable.clear(); - if (this._fallbacks) { - this._fallbacks.unBindMesh(); - } - if (previousPipelineContext && !keepExistingPipelineContext) { - this.getEngine()._deletePipelineContext(previousPipelineContext); - } - }); - if (this._pipelineContext.isAsync) { - this._checkIsReady(previousPipelineContext); - } - } catch (e) { - this._processCompilationErrors(e, previousPipelineContext); + _releaseBuffer(buffer) { + buffer.references--; + if (buffer.references === 0) { + this._deleteBuffer(buffer); + return true; } + return false; } - _getShaderCodeAndErrorLine(code, error, isFragment) { - const regexp = isFragment ? /FRAGMENT SHADER ERROR: 0:(\d+?):/ : /VERTEX SHADER ERROR: 0:(\d+?):/; - let errorLine = null; - if (error && code) { - const res = error.match(regexp); - if (res && res.length === 2) { - const lineNumber = parseInt(res[1]); - const lines = code.split("\n", -1); - if (lines.length >= lineNumber) { - errorLine = `Offending line [${lineNumber}] in ${isFragment ? "fragment" : "vertex"} code: ${lines[lineNumber - 1]}`; + _deleteBuffer(buffer) { + this._gl.deleteBuffer(buffer.underlyingResource); + } + /** + * Update the content of a webGL buffer used with instantiation and bind it to the webGL context + * @param instancesBuffer defines the webGL buffer to update and bind + * @param data defines the data to store in the buffer + * @param offsetLocations defines the offsets or attributes information used to determine where data must be stored in the buffer + */ + updateAndBindInstancesBuffer(instancesBuffer, data, offsetLocations) { + this.bindArrayBuffer(instancesBuffer); + if (data) { + this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data); + } + if (offsetLocations[0].index !== void 0) { + this.bindInstancesBuffer(instancesBuffer, offsetLocations, true); + } else { + for (let index = 0; index < 4; index++) { + const offsetLocation = offsetLocations[index]; + if (!this._vertexAttribArraysEnabled[offsetLocation]) { + this._gl.enableVertexAttribArray(offsetLocation); + this._vertexAttribArraysEnabled[offsetLocation] = true; } + this._vertexAttribPointer(instancesBuffer, offsetLocation, 4, this._gl.FLOAT, false, 64, index * 16); + this._gl.vertexAttribDivisor(offsetLocation, 1); + this._currentInstanceLocations.push(offsetLocation); + this._currentInstanceBuffers.push(instancesBuffer); } } - return [code, errorLine]; } - _processCompilationErrors(e, previousPipelineContext = null) { - var _a, _b, _c; - this._compilationError = e.message; - const attributesNames = this._attributesNames; - const fallbacks = this._fallbacks; - Logger.Error("Unable to compile effect:"); - Logger.Error("Uniforms: " + this._uniformsNames.map(function(uniform) { - return " " + uniform; - })); - Logger.Error("Attributes: " + attributesNames.map(function(attribute) { - return " " + attribute; - })); - Logger.Error("Defines:\n" + this.defines); - if (_Effect.LogShaderCodeOnCompilationError) { - let lineErrorVertex = null, lineErrorFragment = null, code = null; - if ((_a = this._pipelineContext) == null ? void 0 : _a._getVertexShaderCode()) { - [code, lineErrorVertex] = this._getShaderCodeAndErrorLine(this._pipelineContext._getVertexShaderCode(), this._compilationError, false); - if (code) { - Logger.Error("Vertex code:"); - Logger.Error(code); - } - } - if ((_b = this._pipelineContext) == null ? void 0 : _b._getFragmentShaderCode()) { - [code, lineErrorFragment] = this._getShaderCodeAndErrorLine((_c = this._pipelineContext) == null ? void 0 : _c._getFragmentShaderCode(), this._compilationError, true); - if (code) { - Logger.Error("Fragment code:"); - Logger.Error(code); - } - } - if (lineErrorVertex) { - Logger.Error(lineErrorVertex); - } - if (lineErrorFragment) { - Logger.Error(lineErrorFragment); + /** + * Bind the content of a webGL buffer used with instantiation + * @param instancesBuffer defines the webGL buffer to bind + * @param attributesInfo defines the offsets or attributes information used to determine where data must be stored in the buffer + * @param computeStride defines Whether to compute the strides from the info or use the default 0 + */ + bindInstancesBuffer(instancesBuffer, attributesInfo, computeStride = true) { + this.bindArrayBuffer(instancesBuffer); + let stride = 0; + if (computeStride) { + for (let i = 0; i < attributesInfo.length; i++) { + const ai = attributesInfo[i]; + stride += ai.attributeSize * 4; } } - Logger.Error("Error: " + this._compilationError); - const notifyErrors = () => { - if (this.onError) { - this.onError(this, this._compilationError); + for (let i = 0; i < attributesInfo.length; i++) { + const ai = attributesInfo[i]; + if (ai.index === void 0) { + ai.index = this._currentEffect.getAttributeLocationByName(ai.attributeName); } - this.onErrorObservable.notifyObservers(this); - }; - if (previousPipelineContext) { - this._pipelineContext = previousPipelineContext; - this._isReady = true; - notifyErrors(); - } - if (fallbacks) { - this._pipelineContext = null; - if (fallbacks.hasMoreFallbacks) { - this._allFallbacksProcessed = false; - Logger.Error("Trying next fallback."); - this.defines = fallbacks.reduce(this.defines, this); - this._prepareEffect(); - } else { - this._allFallbacksProcessed = true; - notifyErrors(); - this.onErrorObservable.clear(); - if (this._fallbacks) { - this._fallbacks.unBindMesh(); - } + if (ai.index < 0) { + continue; } - } else { - this._allFallbacksProcessed = true; - if (!previousPipelineContext) { - notifyErrors(); + if (!this._vertexAttribArraysEnabled[ai.index]) { + this._gl.enableVertexAttribArray(ai.index); + this._vertexAttribArraysEnabled[ai.index] = true; } + this._vertexAttribPointer(instancesBuffer, ai.index, ai.attributeSize, ai.attributeType || this._gl.FLOAT, ai.normalized || false, stride, ai.offset); + this._gl.vertexAttribDivisor(ai.index, ai.divisor === void 0 ? 1 : ai.divisor); + this._currentInstanceLocations.push(ai.index); + this._currentInstanceBuffers.push(instancesBuffer); } } /** - * Checks if the effect is supported. (Must be called after compilation) - */ - get isSupported() { - return this._compilationError === ""; - } - /** - * Binds a texture to the engine to be used as output of the shader. - * @param channel Name of the output variable. - * @param texture Texture to bind. - * @internal + * Disable the instance attribute corresponding to the name in parameter + * @param name defines the name of the attribute to disable */ - _bindTexture(channel, texture) { - this._engine._bindTexture(this._samplers[channel], texture, channel); + disableInstanceAttributeByName(name69) { + if (!this._currentEffect) { + return; + } + const attributeLocation = this._currentEffect.getAttributeLocationByName(name69); + this.disableInstanceAttribute(attributeLocation); } /** - * Sets a texture on the engine to be used in the shader. - * @param channel Name of the sampler variable. - * @param texture Texture to set. + * Disable the instance attribute corresponding to the location in parameter + * @param attributeLocation defines the attribute location of the attribute to disable */ - setTexture(channel, texture) { - this._engine.setTexture(this._samplers[channel], this._uniforms[channel], texture, channel); + disableInstanceAttribute(attributeLocation) { + let shouldClean = false; + let index; + while ((index = this._currentInstanceLocations.indexOf(attributeLocation)) !== -1) { + this._currentInstanceLocations.splice(index, 1); + this._currentInstanceBuffers.splice(index, 1); + shouldClean = true; + index = this._currentInstanceLocations.indexOf(attributeLocation); + } + if (shouldClean) { + this._gl.vertexAttribDivisor(attributeLocation, 0); + this.disableAttributeByIndex(attributeLocation); + } } /** - * Sets a depth stencil texture from a render target on the engine to be used in the shader. - * @param channel Name of the sampler variable. - * @param texture Texture to set. + * Disable the attribute corresponding to the location in parameter + * @param attributeLocation defines the attribute location of the attribute to disable */ - setDepthStencilTexture(channel, texture) { - this._engine.setDepthStencilTexture(this._samplers[channel], this._uniforms[channel], texture, channel); + disableAttributeByIndex(attributeLocation) { + this._gl.disableVertexAttribArray(attributeLocation); + this._vertexAttribArraysEnabled[attributeLocation] = false; + this._currentBufferPointers[attributeLocation].active = false; } /** - * Sets an array of textures on the engine to be used in the shader. - * @param channel Name of the variable. - * @param textures Textures to set. + * Send a draw order + * @param useTriangles defines if triangles must be used to draw (else wireframe will be used) + * @param indexStart defines the starting index + * @param indexCount defines the number of index to draw + * @param instancesCount defines the number of instances to draw (if instantiation is enabled) */ - setTextureArray(channel, textures) { - const exName = channel + "Ex"; - if (this._samplerList.indexOf(exName + "0") === -1) { - const initialPos = this._samplerList.indexOf(channel); - for (let index = 1; index < textures.length; index++) { - const currentExName = exName + (index - 1).toString(); - this._samplerList.splice(initialPos + index, 0, currentExName); - } - let channelIndex = 0; - for (const key of this._samplerList) { - this._samplers[key] = channelIndex; - channelIndex += 1; - } - } - this._engine.setTextureArray(this._samplers[channel], this._uniforms[channel], textures, channel); + draw(useTriangles, indexStart, indexCount, instancesCount) { + this.drawElementsType(useTriangles ? 0 : 1, indexStart, indexCount, instancesCount); } /** - * Sets a texture to be the input of the specified post process. (To use the output, pass in the next post process in the pipeline) - * @param channel Name of the sampler variable. - * @param postProcess Post process to get the input texture from. + * Draw a list of points + * @param verticesStart defines the index of first vertex to draw + * @param verticesCount defines the count of vertices to draw + * @param instancesCount defines the number of instances to draw (if instantiation is enabled) */ - setTextureFromPostProcess(channel, postProcess) { - this._engine.setTextureFromPostProcess(this._samplers[channel], postProcess, channel); + drawPointClouds(verticesStart, verticesCount, instancesCount) { + this.drawArraysType(2, verticesStart, verticesCount, instancesCount); } /** - * (Warning! setTextureFromPostProcessOutput may be desired instead) - * Sets the input texture of the passed in post process to be input of this effect. (To use the output of the passed in post process use setTextureFromPostProcessOutput) - * @param channel Name of the sampler variable. - * @param postProcess Post process to get the output texture from. + * Draw a list of unindexed primitives + * @param useTriangles defines if triangles must be used to draw (else wireframe will be used) + * @param verticesStart defines the index of first vertex to draw + * @param verticesCount defines the count of vertices to draw + * @param instancesCount defines the number of instances to draw (if instantiation is enabled) */ - setTextureFromPostProcessOutput(channel, postProcess) { - this._engine.setTextureFromPostProcessOutput(this._samplers[channel], postProcess, channel); + drawUnIndexed(useTriangles, verticesStart, verticesCount, instancesCount) { + this.drawArraysType(useTriangles ? 0 : 1, verticesStart, verticesCount, instancesCount); } /** - * Binds a buffer to a uniform. - * @param buffer Buffer to bind. - * @param name Name of the uniform variable to bind to. + * Draw a list of indexed primitives + * @param fillMode defines the primitive to use + * @param indexStart defines the starting index + * @param indexCount defines the number of index to draw + * @param instancesCount defines the number of instances to draw (if instantiation is enabled) */ - bindUniformBuffer(buffer, name69) { - const bufferName = this._uniformBuffersNames[name69]; - if (bufferName === void 0 || _Effect._BaseCache[bufferName] === buffer && this._engine._features.useUBOBindingCache) { - return; + drawElementsType(fillMode, indexStart, indexCount, instancesCount) { + this.applyStates(); + this._reportDrawCall(); + const drawMode = this._drawMode(fillMode); + const indexFormat = this._uintIndicesCurrentlySet ? this._gl.UNSIGNED_INT : this._gl.UNSIGNED_SHORT; + const mult = this._uintIndicesCurrentlySet ? 4 : 2; + if (instancesCount) { + this._gl.drawElementsInstanced(drawMode, indexCount, indexFormat, indexStart * mult, instancesCount); + } else { + this._gl.drawElements(drawMode, indexCount, indexFormat, indexStart * mult); } - _Effect._BaseCache[bufferName] = buffer; - this._engine.bindUniformBufferBase(buffer, bufferName, name69); } /** - * Binds block to a uniform. - * @param blockName Name of the block to bind. - * @param index Index to bind. + * Draw a list of unindexed primitives + * @param fillMode defines the primitive to use + * @param verticesStart defines the index of first vertex to draw + * @param verticesCount defines the count of vertices to draw + * @param instancesCount defines the number of instances to draw (if instantiation is enabled) */ - bindUniformBlock(blockName, index) { - this._engine.bindUniformBlock(this._pipelineContext, blockName, index); + drawArraysType(fillMode, verticesStart, verticesCount, instancesCount) { + this.applyStates(); + this._reportDrawCall(); + const drawMode = this._drawMode(fillMode); + if (instancesCount) { + this._gl.drawArraysInstanced(drawMode, verticesStart, verticesCount, instancesCount); + } else { + this._gl.drawArrays(drawMode, verticesStart, verticesCount); + } } - /** - * Sets an integer value on a uniform variable. - * @param uniformName Name of the variable. - * @param value Value to be set. - * @returns this effect. - */ - setInt(uniformName, value) { - this._pipelineContext.setInt(uniformName, value); - return this; + _drawMode(fillMode) { + switch (fillMode) { + case 0: + return this._gl.TRIANGLES; + case 2: + return this._gl.POINTS; + case 1: + return this._gl.LINES; + case 3: + return this._gl.POINTS; + case 4: + return this._gl.LINES; + case 5: + return this._gl.LINE_LOOP; + case 6: + return this._gl.LINE_STRIP; + case 7: + return this._gl.TRIANGLE_STRIP; + case 8: + return this._gl.TRIANGLE_FAN; + default: + return this._gl.TRIANGLES; + } } + /** @internal */ + _reportDrawCall() { + } + // Shaders /** - * Sets an int2 value on a uniform variable. - * @param uniformName Name of the variable. - * @param x First int in int2. - * @param y Second int in int2. - * @returns this effect. + * @internal */ - setInt2(uniformName, x, y) { - this._pipelineContext.setInt2(uniformName, x, y); - return this; + _releaseEffect(effect) { + if (this._compiledEffects[effect._key]) { + delete this._compiledEffects[effect._key]; + } + const pipelineContext = effect.getPipelineContext(); + if (pipelineContext) { + this._deletePipelineContext(pipelineContext); + } } /** - * Sets an int3 value on a uniform variable. - * @param uniformName Name of the variable. - * @param x First int in int3. - * @param y Second int in int3. - * @param z Third int in int3. - * @returns this effect. + * @internal */ - setInt3(uniformName, x, y, z) { - this._pipelineContext.setInt3(uniformName, x, y, z); - return this; + _deletePipelineContext(pipelineContext) { + const webGLPipelineContext = pipelineContext; + if (webGLPipelineContext && webGLPipelineContext.program) { + webGLPipelineContext.program.__SPECTOR_rebuildProgram = null; + this._gl.deleteProgram(webGLPipelineContext.program); + } + } + /** @internal */ + _getGlobalDefines(defines) { + if (defines) { + if (this.isNDCHalfZRange) { + defines["IS_NDC_HALF_ZRANGE"] = ""; + } else { + delete defines["IS_NDC_HALF_ZRANGE"]; + } + if (this.useReverseDepthBuffer) { + defines["USE_REVERSE_DEPTHBUFFER"] = ""; + } else { + delete defines["USE_REVERSE_DEPTHBUFFER"]; + } + if (this.useExactSrgbConversions) { + defines["USE_EXACT_SRGB_CONVERSIONS"] = ""; + } else { + delete defines["USE_EXACT_SRGB_CONVERSIONS"]; + } + return; + } else { + let s = ""; + if (this.isNDCHalfZRange) { + s += "#define IS_NDC_HALF_ZRANGE"; + } + if (this.useReverseDepthBuffer) { + if (s) { + s += "\n"; + } + s += "#define USE_REVERSE_DEPTHBUFFER"; + } + if (this.useExactSrgbConversions) { + if (s) { + s += "\n"; + } + s += "#define USE_EXACT_SRGB_CONVERSIONS"; + } + return s; + } } /** - * Sets an int4 value on a uniform variable. - * @param uniformName Name of the variable. - * @param x First int in int4. - * @param y Second int in int4. - * @param z Third int in int4. - * @param w Fourth int in int4. - * @returns this effect. + * Create a new effect (used to store vertex/fragment shaders) + * @param baseName defines the base name of the effect (The name of file without .fragment.fx or .vertex.fx) + * @param attributesNamesOrOptions defines either a list of attribute names or an IEffectCreationOptions object + * @param uniformsNamesOrEngine defines either a list of uniform names or the engine to use + * @param samplers defines an array of string used to represent textures + * @param defines defines the string containing the defines to use to compile the shaders + * @param fallbacks defines the list of potential fallbacks to use if shader compilation fails + * @param onCompiled defines a function to call when the effect creation is successful + * @param onError defines a function to call when the effect creation has failed + * @param indexParameters defines an object containing the index values to use to compile shaders (like the maximum number of simultaneous lights) + * @param shaderLanguage the language the shader is written in (default: GLSL) + * @returns the new Effect */ - setInt4(uniformName, x, y, z, w) { - this._pipelineContext.setInt4(uniformName, x, y, z, w); - return this; + createEffect(baseName, attributesNamesOrOptions, uniformsNamesOrEngine, samplers, defines, fallbacks, onCompiled, onError, indexParameters, shaderLanguage = ShaderLanguage.GLSL) { + const vertex = typeof baseName === "string" ? baseName : baseName.vertexToken || baseName.vertexSource || baseName.vertexElement || baseName.vertex; + const fragment = typeof baseName === "string" ? baseName : baseName.fragmentToken || baseName.fragmentSource || baseName.fragmentElement || baseName.fragment; + const globalDefines = this._getGlobalDefines(); + let fullDefines = defines ?? attributesNamesOrOptions.defines ?? ""; + if (globalDefines) { + fullDefines += globalDefines; + } + const name69 = vertex + "+" + fragment + "@" + fullDefines; + if (this._compiledEffects[name69]) { + const compiledEffect = this._compiledEffects[name69]; + if (onCompiled && compiledEffect.isReady()) { + onCompiled(compiledEffect); + } + return compiledEffect; + } + const effect = new Effect(baseName, attributesNamesOrOptions, uniformsNamesOrEngine, samplers, this, defines, fallbacks, onCompiled, onError, indexParameters, name69, shaderLanguage); + this._compiledEffects[name69] = effect; + return effect; + } + // eslint-disable-next-line @typescript-eslint/naming-convention + static _ConcatenateShader(source, defines, shaderVersion = "") { + return shaderVersion + (defines ? defines + "\n" : "") + source; + } + _compileShader(source, type, defines, shaderVersion) { + return this._compileRawShader(_ThinEngine._ConcatenateShader(source, defines, shaderVersion), type); + } + _compileRawShader(source, type) { + const gl = this._gl; + const shader69 = gl.createShader(type === "vertex" ? gl.VERTEX_SHADER : gl.FRAGMENT_SHADER); + if (!shader69) { + let error = gl.NO_ERROR; + let tempError = gl.NO_ERROR; + while ((tempError = gl.getError()) !== gl.NO_ERROR) { + error = tempError; + } + throw new Error(`Something went wrong while creating a gl ${type} shader object. gl error=${error}, gl isContextLost=${gl.isContextLost()}, _contextWasLost=${this._contextWasLost}`); + } + gl.shaderSource(shader69, source); + gl.compileShader(shader69); + return shader69; } /** - * Sets an int array on a uniform variable. - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * @internal */ - setIntArray(uniformName, array) { - this._pipelineContext.setIntArray(uniformName, array); - return this; + _getShaderSource(shader69) { + return this._gl.getShaderSource(shader69); } /** - * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * Directly creates a webGL program + * @param pipelineContext defines the pipeline context to attach to + * @param vertexCode defines the vertex shader code to use + * @param fragmentCode defines the fragment shader code to use + * @param context defines the webGL context to use (if not set, the current one will be used) + * @param transformFeedbackVaryings defines the list of transform feedback varyings to use + * @returns the new webGL program */ - setIntArray2(uniformName, array) { - this._pipelineContext.setIntArray2(uniformName, array); - return this; + createRawShaderProgram(pipelineContext, vertexCode, fragmentCode, context, transformFeedbackVaryings = null) { + context = context || this._gl; + const vertexShader = this._compileRawShader(vertexCode, "vertex"); + const fragmentShader = this._compileRawShader(fragmentCode, "fragment"); + return this._createShaderProgram(pipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings); } /** - * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * Creates a webGL program + * @param pipelineContext defines the pipeline context to attach to + * @param vertexCode defines the vertex shader code to use + * @param fragmentCode defines the fragment shader code to use + * @param defines defines the string containing the defines to use to compile the shaders + * @param context defines the webGL context to use (if not set, the current one will be used) + * @param transformFeedbackVaryings defines the list of transform feedback varyings to use + * @returns the new webGL program */ - setIntArray3(uniformName, array) { - this._pipelineContext.setIntArray3(uniformName, array); - return this; + createShaderProgram(pipelineContext, vertexCode, fragmentCode, defines, context, transformFeedbackVaryings = null) { + context = context || this._gl; + const shaderVersion = this._webGLVersion > 1 ? "#version 300 es\n#define WEBGL2 \n" : ""; + const vertexShader = this._compileShader(vertexCode, "vertex", defines, shaderVersion); + const fragmentShader = this._compileShader(fragmentCode, "fragment", defines, shaderVersion); + return this._createShaderProgram(pipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings); } /** - * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * Inline functions in shader code that are marked to be inlined + * @param code code to inline + * @returns inlined code */ - setIntArray4(uniformName, array) { - this._pipelineContext.setIntArray4(uniformName, array); - return this; + inlineShaderCode(code) { + return code; } /** - * Sets an unsigned integer value on a uniform variable. - * @param uniformName Name of the variable. - * @param value Value to be set. - * @returns this effect. + * Creates a new pipeline context + * @param shaderProcessingContext defines the shader processing context used during the processing if available + * @returns the new pipeline */ - setUInt(uniformName, value) { - this._pipelineContext.setUInt(uniformName, value); - return this; + createPipelineContext(shaderProcessingContext) { + const pipelineContext = new WebGLPipelineContext(); + pipelineContext.engine = this; + if (this._caps.parallelShaderCompile) { + pipelineContext.isParallelCompiled = true; + } + return pipelineContext; } /** - * Sets an unsigned int2 value on a uniform variable. - * @param uniformName Name of the variable. - * @param x First unsigned int in uint2. - * @param y Second unsigned int in uint2. - * @returns this effect. + * Creates a new material context + * @returns the new context */ - setUInt2(uniformName, x, y) { - this._pipelineContext.setUInt2(uniformName, x, y); - return this; + createMaterialContext() { + return void 0; } /** - * Sets an unsigned int3 value on a uniform variable. - * @param uniformName Name of the variable. - * @param x First unsigned int in uint3. - * @param y Second unsigned int in uint3. - * @param z Third unsigned int in uint3. - * @returns this effect. + * Creates a new draw context + * @returns the new context */ - setUInt3(uniformName, x, y, z) { - this._pipelineContext.setUInt3(uniformName, x, y, z); - return this; + createDrawContext() { + return void 0; + } + _createShaderProgram(pipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings = null) { + const shaderProgram = context.createProgram(); + pipelineContext.program = shaderProgram; + if (!shaderProgram) { + throw new Error("Unable to create program"); + } + context.attachShader(shaderProgram, vertexShader); + context.attachShader(shaderProgram, fragmentShader); + context.linkProgram(shaderProgram); + pipelineContext.context = context; + pipelineContext.vertexShader = vertexShader; + pipelineContext.fragmentShader = fragmentShader; + if (!pipelineContext.isParallelCompiled) { + this._finalizePipelineContext(pipelineContext); + } + return shaderProgram; + } + _finalizePipelineContext(pipelineContext) { + const context = pipelineContext.context; + const vertexShader = pipelineContext.vertexShader; + const fragmentShader = pipelineContext.fragmentShader; + const program = pipelineContext.program; + const linked = context.getProgramParameter(program, context.LINK_STATUS); + if (!linked) { + if (!this._gl.getShaderParameter(vertexShader, this._gl.COMPILE_STATUS)) { + const log = this._gl.getShaderInfoLog(vertexShader); + if (log) { + pipelineContext.vertexCompilationError = log; + throw new Error("VERTEX SHADER " + log); + } + } + if (!this._gl.getShaderParameter(fragmentShader, this._gl.COMPILE_STATUS)) { + const log = this._gl.getShaderInfoLog(fragmentShader); + if (log) { + pipelineContext.fragmentCompilationError = log; + throw new Error("FRAGMENT SHADER " + log); + } + } + const error = context.getProgramInfoLog(program); + if (error) { + pipelineContext.programLinkError = error; + throw new Error(error); + } + } + if (this.validateShaderPrograms) { + context.validateProgram(program); + const validated = context.getProgramParameter(program, context.VALIDATE_STATUS); + if (!validated) { + const error = context.getProgramInfoLog(program); + if (error) { + pipelineContext.programValidationError = error; + throw new Error(error); + } + } + } + context.deleteShader(vertexShader); + context.deleteShader(fragmentShader); + pipelineContext.vertexShader = void 0; + pipelineContext.fragmentShader = void 0; + if (pipelineContext.onCompiled) { + pipelineContext.onCompiled(); + pipelineContext.onCompiled = void 0; + } } /** - * Sets an unsigned int4 value on a uniform variable. - * @param uniformName Name of the variable. - * @param x First unsigned int in uint4. - * @param y Second unsigned int in uint4. - * @param z Third unsigned int in uint4. - * @param w Fourth unsigned int in uint4. - * @returns this effect. + * @internal */ - setUInt4(uniformName, x, y, z, w) { - this._pipelineContext.setUInt4(uniformName, x, y, z, w); - return this; + _preparePipelineContext(pipelineContext, vertexSourceCode, fragmentSourceCode, createAsRaw, rawVertexSourceCode, rawFragmentSourceCode, rebuildRebind, defines, transformFeedbackVaryings, key) { + const webGLRenderingState = pipelineContext; + if (createAsRaw) { + webGLRenderingState.program = this.createRawShaderProgram(webGLRenderingState, vertexSourceCode, fragmentSourceCode, void 0, transformFeedbackVaryings); + } else { + webGLRenderingState.program = this.createShaderProgram(webGLRenderingState, vertexSourceCode, fragmentSourceCode, defines, void 0, transformFeedbackVaryings); + } + webGLRenderingState.program.__SPECTOR_rebuildProgram = rebuildRebind; } /** - * Sets an unsigned int array on a uniform variable. - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * @internal */ - setUIntArray(uniformName, array) { - this._pipelineContext.setUIntArray(uniformName, array); - return this; + _isRenderingStateCompiled(pipelineContext) { + const webGLPipelineContext = pipelineContext; + if (this._isDisposed || webGLPipelineContext._isDisposed) { + return false; + } + if (this._gl.getProgramParameter(webGLPipelineContext.program, this._caps.parallelShaderCompile.COMPLETION_STATUS_KHR)) { + this._finalizePipelineContext(webGLPipelineContext); + return true; + } + return false; } /** - * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * @internal */ - setUIntArray2(uniformName, array) { - this._pipelineContext.setUIntArray2(uniformName, array); - return this; + _executeWhenRenderingStateIsCompiled(pipelineContext, action) { + const webGLPipelineContext = pipelineContext; + if (!webGLPipelineContext.isParallelCompiled) { + action(); + return; + } + const oldHandler = webGLPipelineContext.onCompiled; + if (oldHandler) { + webGLPipelineContext.onCompiled = () => { + oldHandler(); + action(); + }; + } else { + webGLPipelineContext.onCompiled = action; + } } /** - * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * Gets the list of webGL uniform locations associated with a specific program based on a list of uniform names + * @param pipelineContext defines the pipeline context to use + * @param uniformsNames defines the list of uniform names + * @returns an array of webGL uniform locations */ - setUIntArray3(uniformName, array) { - this._pipelineContext.setUIntArray3(uniformName, array); - return this; + getUniforms(pipelineContext, uniformsNames) { + const results = new Array(); + const webGLPipelineContext = pipelineContext; + for (let index = 0; index < uniformsNames.length; index++) { + results.push(this._gl.getUniformLocation(webGLPipelineContext.program, uniformsNames[index])); + } + return results; } /** - * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * Gets the list of active attributes for a given webGL program + * @param pipelineContext defines the pipeline context to use + * @param attributesNames defines the list of attribute names to get + * @returns an array of indices indicating the offset of each attribute */ - setUIntArray4(uniformName, array) { - this._pipelineContext.setUIntArray4(uniformName, array); - return this; + getAttributes(pipelineContext, attributesNames) { + const results = []; + const webGLPipelineContext = pipelineContext; + for (let index = 0; index < attributesNames.length; index++) { + try { + results.push(this._gl.getAttribLocation(webGLPipelineContext.program, attributesNames[index])); + } catch (e) { + results.push(-1); + } + } + return results; } /** - * Sets an float array on a uniform variable. - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * Activates an effect, making it the current one (ie. the one used for rendering) + * @param effect defines the effect to activate */ - setFloatArray(uniformName, array) { - this._pipelineContext.setArray(uniformName, array); - return this; + enableEffect(effect) { + effect = effect !== null && DrawWrapper.IsWrapper(effect) ? effect.effect : effect; + if (!effect || effect === this._currentEffect) { + return; + } + this._stencilStateComposer.stencilMaterial = void 0; + effect = effect; + this.bindSamplers(effect); + this._currentEffect = effect; + if (effect.onBind) { + effect.onBind(effect); + } + if (effect._onBindObservable) { + effect._onBindObservable.notifyObservers(effect); + } } /** - * Sets an float array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * Set the value of an uniform to a number (int) + * @param uniform defines the webGL uniform location where to store the value + * @param value defines the int number to store + * @returns true if the value was set */ - setFloatArray2(uniformName, array) { - this._pipelineContext.setArray2(uniformName, array); - return this; + setInt(uniform, value) { + if (!uniform) { + return false; + } + this._gl.uniform1i(uniform, value); + return true; } /** - * Sets an float array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * Set the value of an uniform to a int2 + * @param uniform defines the webGL uniform location where to store the value + * @param x defines the 1st component of the value + * @param y defines the 2nd component of the value + * @returns true if the value was set */ - setFloatArray3(uniformName, array) { - this._pipelineContext.setArray3(uniformName, array); - return this; + setInt2(uniform, x, y) { + if (!uniform) { + return false; + } + this._gl.uniform2i(uniform, x, y); + return true; } /** - * Sets an float array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * Set the value of an uniform to a int3 + * @param uniform defines the webGL uniform location where to store the value + * @param x defines the 1st component of the value + * @param y defines the 2nd component of the value + * @param z defines the 3rd component of the value + * @returns true if the value was set */ - setFloatArray4(uniformName, array) { - this._pipelineContext.setArray4(uniformName, array); - return this; + setInt3(uniform, x, y, z) { + if (!uniform) { + return false; + } + this._gl.uniform3i(uniform, x, y, z); + return true; } /** - * Sets an array on a uniform variable. - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * Set the value of an uniform to a int4 + * @param uniform defines the webGL uniform location where to store the value + * @param x defines the 1st component of the value + * @param y defines the 2nd component of the value + * @param z defines the 3rd component of the value + * @param w defines the 4th component of the value + * @returns true if the value was set */ - setArray(uniformName, array) { - this._pipelineContext.setArray(uniformName, array); - return this; + setInt4(uniform, x, y, z, w) { + if (!uniform) { + return false; + } + this._gl.uniform4i(uniform, x, y, z, w); + return true; } /** - * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * Set the value of an uniform to an array of int32 + * @param uniform defines the webGL uniform location where to store the value + * @param array defines the array of int32 to store + * @returns true if the value was set */ - setArray2(uniformName, array) { - this._pipelineContext.setArray2(uniformName, array); - return this; + setIntArray(uniform, array) { + if (!uniform) { + return false; + } + this._gl.uniform1iv(uniform, array); + return true; } /** - * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * Set the value of an uniform to an array of int32 (stored as vec2) + * @param uniform defines the webGL uniform location where to store the value + * @param array defines the array of int32 to store + * @returns true if the value was set */ - setArray3(uniformName, array) { - this._pipelineContext.setArray3(uniformName, array); - return this; + setIntArray2(uniform, array) { + if (!uniform || array.length % 2 !== 0) { + return false; + } + this._gl.uniform2iv(uniform, array); + return true; } /** - * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - * @returns this effect. + * Set the value of an uniform to an array of int32 (stored as vec3) + * @param uniform defines the webGL uniform location where to store the value + * @param array defines the array of int32 to store + * @returns true if the value was set */ - setArray4(uniformName, array) { - this._pipelineContext.setArray4(uniformName, array); - return this; + setIntArray3(uniform, array) { + if (!uniform || array.length % 3 !== 0) { + return false; + } + this._gl.uniform3iv(uniform, array); + return true; } /** - * Sets matrices on a uniform variable. - * @param uniformName Name of the variable. - * @param matrices matrices to be set. - * @returns this effect. + * Set the value of an uniform to an array of int32 (stored as vec4) + * @param uniform defines the webGL uniform location where to store the value + * @param array defines the array of int32 to store + * @returns true if the value was set */ - setMatrices(uniformName, matrices) { - this._pipelineContext.setMatrices(uniformName, matrices); - return this; + setIntArray4(uniform, array) { + if (!uniform || array.length % 4 !== 0) { + return false; + } + this._gl.uniform4iv(uniform, array); + return true; } /** - * Sets matrix on a uniform variable. - * @param uniformName Name of the variable. - * @param matrix matrix to be set. - * @returns this effect. + * Set the value of an uniform to a number (unsigned int) + * @param uniform defines the webGL uniform location where to store the value + * @param value defines the unsigned int number to store + * @returns true if the value was set */ - setMatrix(uniformName, matrix) { - this._pipelineContext.setMatrix(uniformName, matrix); - return this; + setUInt(uniform, value) { + if (!uniform) { + return false; + } + this._gl.uniform1ui(uniform, value); + return true; } /** - * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix) - * @param uniformName Name of the variable. - * @param matrix matrix to be set. - * @returns this effect. + * Set the value of an uniform to a unsigned int2 + * @param uniform defines the webGL uniform location where to store the value + * @param x defines the 1st component of the value + * @param y defines the 2nd component of the value + * @returns true if the value was set */ - setMatrix3x3(uniformName, matrix) { - this._pipelineContext.setMatrix3x3(uniformName, matrix); - return this; + setUInt2(uniform, x, y) { + if (!uniform) { + return false; + } + this._gl.uniform2ui(uniform, x, y); + return true; } /** - * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix) - * @param uniformName Name of the variable. - * @param matrix matrix to be set. - * @returns this effect. + * Set the value of an uniform to a unsigned int3 + * @param uniform defines the webGL uniform location where to store the value + * @param x defines the 1st component of the value + * @param y defines the 2nd component of the value + * @param z defines the 3rd component of the value + * @returns true if the value was set */ - setMatrix2x2(uniformName, matrix) { - this._pipelineContext.setMatrix2x2(uniformName, matrix); - return this; + setUInt3(uniform, x, y, z) { + if (!uniform) { + return false; + } + this._gl.uniform3ui(uniform, x, y, z); + return true; } /** - * Sets a float on a uniform variable. - * @param uniformName Name of the variable. - * @param value value to be set. - * @returns this effect. + * Set the value of an uniform to a unsigned int4 + * @param uniform defines the webGL uniform location where to store the value + * @param x defines the 1st component of the value + * @param y defines the 2nd component of the value + * @param z defines the 3rd component of the value + * @param w defines the 4th component of the value + * @returns true if the value was set */ - setFloat(uniformName, value) { - this._pipelineContext.setFloat(uniformName, value); - return this; + setUInt4(uniform, x, y, z, w) { + if (!uniform) { + return false; + } + this._gl.uniform4ui(uniform, x, y, z, w); + return true; } /** - * Sets a boolean on a uniform variable. - * @param uniformName Name of the variable. - * @param bool value to be set. - * @returns this effect. + * Set the value of an uniform to an array of unsigned int32 + * @param uniform defines the webGL uniform location where to store the value + * @param array defines the array of unsigned int32 to store + * @returns true if the value was set */ - setBool(uniformName, bool) { - this._pipelineContext.setInt(uniformName, bool ? 1 : 0); - return this; + setUIntArray(uniform, array) { + if (!uniform) { + return false; + } + this._gl.uniform1uiv(uniform, array); + return true; } /** - * Sets a Vector2 on a uniform variable. - * @param uniformName Name of the variable. - * @param vector2 vector2 to be set. - * @returns this effect. + * Set the value of an uniform to an array of unsigned int32 (stored as vec2) + * @param uniform defines the webGL uniform location where to store the value + * @param array defines the array of unsigned int32 to store + * @returns true if the value was set */ - setVector2(uniformName, vector2) { - this._pipelineContext.setVector2(uniformName, vector2); - return this; + setUIntArray2(uniform, array) { + if (!uniform || array.length % 2 !== 0) { + return false; + } + this._gl.uniform2uiv(uniform, array); + return true; } /** - * Sets a float2 on a uniform variable. - * @param uniformName Name of the variable. - * @param x First float in float2. - * @param y Second float in float2. - * @returns this effect. + * Set the value of an uniform to an array of unsigned int32 (stored as vec3) + * @param uniform defines the webGL uniform location where to store the value + * @param array defines the array of unsigned int32 to store + * @returns true if the value was set */ - setFloat2(uniformName, x, y) { - this._pipelineContext.setFloat2(uniformName, x, y); - return this; + setUIntArray3(uniform, array) { + if (!uniform || array.length % 3 !== 0) { + return false; + } + this._gl.uniform3uiv(uniform, array); + return true; } /** - * Sets a Vector3 on a uniform variable. - * @param uniformName Name of the variable. - * @param vector3 Value to be set. - * @returns this effect. + * Set the value of an uniform to an array of unsigned int32 (stored as vec4) + * @param uniform defines the webGL uniform location where to store the value + * @param array defines the array of unsigned int32 to store + * @returns true if the value was set */ - setVector3(uniformName, vector3) { - this._pipelineContext.setVector3(uniformName, vector3); - return this; + setUIntArray4(uniform, array) { + if (!uniform || array.length % 4 !== 0) { + return false; + } + this._gl.uniform4uiv(uniform, array); + return true; } /** - * Sets a float3 on a uniform variable. - * @param uniformName Name of the variable. - * @param x First float in float3. - * @param y Second float in float3. - * @param z Third float in float3. - * @returns this effect. + * Set the value of an uniform to an array of number + * @param uniform defines the webGL uniform location where to store the value + * @param array defines the array of number to store + * @returns true if the value was set */ - setFloat3(uniformName, x, y, z) { - this._pipelineContext.setFloat3(uniformName, x, y, z); - return this; + setArray(uniform, array) { + if (!uniform) { + return false; + } + if (array.length < 1) { + return false; + } + this._gl.uniform1fv(uniform, array); + return true; } /** - * Sets a Vector4 on a uniform variable. - * @param uniformName Name of the variable. - * @param vector4 Value to be set. - * @returns this effect. + * Set the value of an uniform to an array of number (stored as vec2) + * @param uniform defines the webGL uniform location where to store the value + * @param array defines the array of number to store + * @returns true if the value was set */ - setVector4(uniformName, vector4) { - this._pipelineContext.setVector4(uniformName, vector4); - return this; + setArray2(uniform, array) { + if (!uniform || array.length % 2 !== 0) { + return false; + } + this._gl.uniform2fv(uniform, array); + return true; } /** - * Sets a Quaternion on a uniform variable. - * @param uniformName Name of the variable. - * @param quaternion Value to be set. - * @returns this effect. + * Set the value of an uniform to an array of number (stored as vec3) + * @param uniform defines the webGL uniform location where to store the value + * @param array defines the array of number to store + * @returns true if the value was set */ - setQuaternion(uniformName, quaternion) { - this._pipelineContext.setQuaternion(uniformName, quaternion); - return this; + setArray3(uniform, array) { + if (!uniform || array.length % 3 !== 0) { + return false; + } + this._gl.uniform3fv(uniform, array); + return true; } /** - * Sets a float4 on a uniform variable. - * @param uniformName Name of the variable. - * @param x First float in float4. - * @param y Second float in float4. - * @param z Third float in float4. - * @param w Fourth float in float4. - * @returns this effect. + * Set the value of an uniform to an array of number (stored as vec4) + * @param uniform defines the webGL uniform location where to store the value + * @param array defines the array of number to store + * @returns true if the value was set */ - setFloat4(uniformName, x, y, z, w) { - this._pipelineContext.setFloat4(uniformName, x, y, z, w); - return this; + setArray4(uniform, array) { + if (!uniform || array.length % 4 !== 0) { + return false; + } + this._gl.uniform4fv(uniform, array); + return true; } /** - * Sets a Color3 on a uniform variable. - * @param uniformName Name of the variable. - * @param color3 Value to be set. - * @returns this effect. + * Set the value of an uniform to an array of float32 (stored as matrices) + * @param uniform defines the webGL uniform location where to store the value + * @param matrices defines the array of float32 to store + * @returns true if the value was set */ - setColor3(uniformName, color3) { - this._pipelineContext.setColor3(uniformName, color3); - return this; + setMatrices(uniform, matrices) { + if (!uniform) { + return false; + } + this._gl.uniformMatrix4fv(uniform, false, matrices); + return true; } /** - * Sets a Color4 on a uniform variable. - * @param uniformName Name of the variable. - * @param color3 Value to be set. - * @param alpha Alpha value to be set. - * @returns this effect. + * Set the value of an uniform to a matrix (3x3) + * @param uniform defines the webGL uniform location where to store the value + * @param matrix defines the Float32Array representing the 3x3 matrix to store + * @returns true if the value was set */ - setColor4(uniformName, color3, alpha) { - this._pipelineContext.setColor4(uniformName, color3, alpha); - return this; + setMatrix3x3(uniform, matrix) { + if (!uniform) { + return false; + } + this._gl.uniformMatrix3fv(uniform, false, matrix); + return true; } /** - * Sets a Color4 on a uniform variable - * @param uniformName defines the name of the variable - * @param color4 defines the value to be set - * @returns this effect. + * Set the value of an uniform to a matrix (2x2) + * @param uniform defines the webGL uniform location where to store the value + * @param matrix defines the Float32Array representing the 2x2 matrix to store + * @returns true if the value was set */ - setDirectColor4(uniformName, color4) { - this._pipelineContext.setDirectColor4(uniformName, color4); - return this; + setMatrix2x2(uniform, matrix) { + if (!uniform) { + return false; + } + this._gl.uniformMatrix2fv(uniform, false, matrix); + return true; } /** - * Release all associated resources. - **/ - dispose() { - if (this._pipelineContext) { - this._pipelineContext.dispose(); + * Set the value of an uniform to a number (float) + * @param uniform defines the webGL uniform location where to store the value + * @param value defines the float number to store + * @returns true if the value was transferred + */ + setFloat(uniform, value) { + if (!uniform) { + return false; } - this._engine._releaseEffect(this); - this._isDisposed = true; + this._gl.uniform1f(uniform, value); + return true; } /** - * This function will add a new shader to the shader store - * @param name the name of the shader - * @param pixelShader optional pixel shader content - * @param vertexShader optional vertex shader content - * @param shaderLanguage the language the shader is written in (default: GLSL) + * Set the value of an uniform to a vec2 + * @param uniform defines the webGL uniform location where to store the value + * @param x defines the 1st component of the value + * @param y defines the 2nd component of the value + * @returns true if the value was set */ - static RegisterShader(name69, pixelShader, vertexShader, shaderLanguage = ShaderLanguage.GLSL) { - if (pixelShader) { - ShaderStore.GetShadersStore(shaderLanguage)[`${name69}PixelShader`] = pixelShader; - } - if (vertexShader) { - ShaderStore.GetShadersStore(shaderLanguage)[`${name69}VertexShader`] = vertexShader; + setFloat2(uniform, x, y) { + if (!uniform) { + return false; } + this._gl.uniform2f(uniform, x, y); + return true; } /** - * Resets the cache of effects. + * Set the value of an uniform to a vec3 + * @param uniform defines the webGL uniform location where to store the value + * @param x defines the 1st component of the value + * @param y defines the 2nd component of the value + * @param z defines the 3rd component of the value + * @returns true if the value was set */ - static ResetCache() { - _Effect._BaseCache = {}; + setFloat3(uniform, x, y, z) { + if (!uniform) { + return false; + } + this._gl.uniform3f(uniform, x, y, z); + return true; } -}; -Effect.LogShaderCodeOnCompilationError = true; -Effect._UniqueIdSeed = 0; -Effect._BaseCache = {}; -Effect.ShadersStore = ShaderStore.ShadersStore; -Effect.IncludesShadersStore = ShaderStore.IncludesShadersStore; - -// node_modules/@babylonjs/core/States/depthCullingState.js -var DepthCullingState = class { /** - * Initializes the state. - * @param reset + * Set the value of an uniform to a vec4 + * @param uniform defines the webGL uniform location where to store the value + * @param x defines the 1st component of the value + * @param y defines the 2nd component of the value + * @param z defines the 3rd component of the value + * @param w defines the 4th component of the value + * @returns true if the value was set */ - constructor(reset = true) { - this._isDepthTestDirty = false; - this._isDepthMaskDirty = false; - this._isDepthFuncDirty = false; - this._isCullFaceDirty = false; - this._isCullDirty = false; - this._isZOffsetDirty = false; - this._isFrontFaceDirty = false; - if (reset) { - this.reset(); + setFloat4(uniform, x, y, z, w) { + if (!uniform) { + return false; } + this._gl.uniform4f(uniform, x, y, z, w); + return true; } - get isDirty() { - return this._isDepthFuncDirty || this._isDepthTestDirty || this._isDepthMaskDirty || this._isCullFaceDirty || this._isCullDirty || this._isZOffsetDirty || this._isFrontFaceDirty; - } - get zOffset() { - return this._zOffset; - } - set zOffset(value) { - if (this._zOffset === value) { - return; + // States + /** + * Apply all cached states (depth, culling, stencil and alpha) + */ + applyStates() { + this._depthCullingState.apply(this._gl); + this._stencilStateComposer.apply(this._gl); + this._alphaState.apply(this._gl); + if (this._colorWriteChanged) { + this._colorWriteChanged = false; + const enable = this._colorWrite; + this._gl.colorMask(enable, enable, enable, enable); } - this._zOffset = value; - this._isZOffsetDirty = true; - } - get zOffsetUnits() { - return this._zOffsetUnits; } - set zOffsetUnits(value) { - if (this._zOffsetUnits === value) { - return; + /** + * Enable or disable color writing + * @param enable defines the state to set + */ + setColorWrite(enable) { + if (enable !== this._colorWrite) { + this._colorWriteChanged = true; + this._colorWrite = enable; } - this._zOffsetUnits = value; - this._isZOffsetDirty = true; } - get cullFace() { - return this._cullFace; + /** + * Gets a boolean indicating if color writing is enabled + * @returns the current color writing state + */ + getColorWrite() { + return this._colorWrite; } - set cullFace(value) { - if (this._cullFace === value) { - return; - } - this._cullFace = value; - this._isCullFaceDirty = true; + /** + * Gets the depth culling state manager + */ + get depthCullingState() { + return this._depthCullingState; } - get cull() { - return this._cull; + /** + * Gets the alpha state manager + */ + get alphaState() { + return this._alphaState; } - set cull(value) { - if (this._cull === value) { - return; - } - this._cull = value; - this._isCullDirty = true; - } - get depthFunc() { - return this._depthFunc; + /** + * Gets the stencil state manager + */ + get stencilState() { + return this._stencilState; } - set depthFunc(value) { - if (this._depthFunc === value) { - return; - } - this._depthFunc = value; - this._isDepthFuncDirty = true; + /** + * Gets the stencil state composer + */ + get stencilStateComposer() { + return this._stencilStateComposer; } - get depthMask() { - return this._depthMask; + // Textures + /** + * Clears the list of texture accessible through engine. + * This can help preventing texture load conflict due to name collision. + */ + clearInternalTexturesCache() { + this._internalTexturesCache.length = 0; } - set depthMask(value) { - if (this._depthMask === value) { + /** + * Force the entire cache to be cleared + * You should not have to use this function unless your engine needs to share the webGL context with another engine + * @param bruteForce defines a boolean to force clearing ALL caches (including stencil, detoh and alpha states) + */ + wipeCaches(bruteForce) { + if (this.preventCacheWipeBetweenFrames && !bruteForce) { return; } - this._depthMask = value; - this._isDepthMaskDirty = true; - } - get depthTest() { - return this._depthTest; - } - set depthTest(value) { - if (this._depthTest === value) { - return; + this._currentEffect = null; + this._viewportCached.x = 0; + this._viewportCached.y = 0; + this._viewportCached.z = 0; + this._viewportCached.w = 0; + this._unbindVertexArrayObject(); + if (bruteForce) { + this._currentProgram = null; + this.resetTextureCache(); + this._stencilStateComposer.reset(); + this._depthCullingState.reset(); + this._depthCullingState.depthFunc = this._gl.LEQUAL; + this._alphaState.reset(); + this._alphaMode = 1; + this._alphaEquation = 0; + this._colorWrite = true; + this._colorWriteChanged = true; + this._unpackFlipYCached = null; + this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE); + this._gl.pixelStorei(this._gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0); + this._mustWipeVertexAttributes = true; + this.unbindAllAttributes(); } - this._depthTest = value; - this._isDepthTestDirty = true; + this._resetVertexBufferBinding(); + this._cachedIndexBuffer = null; + this._cachedEffectForVertexBuffers = null; + this.bindIndexBuffer(null); } - get frontFace() { - return this._frontFace; + /** + * @internal + */ + _getSamplingParameters(samplingMode, generateMipMaps) { + const gl = this._gl; + let magFilter = gl.NEAREST; + let minFilter = gl.NEAREST; + switch (samplingMode) { + case 11: + magFilter = gl.LINEAR; + if (generateMipMaps) { + minFilter = gl.LINEAR_MIPMAP_NEAREST; + } else { + minFilter = gl.LINEAR; + } + break; + case 3: + magFilter = gl.LINEAR; + if (generateMipMaps) { + minFilter = gl.LINEAR_MIPMAP_LINEAR; + } else { + minFilter = gl.LINEAR; + } + break; + case 8: + magFilter = gl.NEAREST; + if (generateMipMaps) { + minFilter = gl.NEAREST_MIPMAP_LINEAR; + } else { + minFilter = gl.NEAREST; + } + break; + case 4: + magFilter = gl.NEAREST; + if (generateMipMaps) { + minFilter = gl.NEAREST_MIPMAP_NEAREST; + } else { + minFilter = gl.NEAREST; + } + break; + case 5: + magFilter = gl.NEAREST; + if (generateMipMaps) { + minFilter = gl.LINEAR_MIPMAP_NEAREST; + } else { + minFilter = gl.LINEAR; + } + break; + case 6: + magFilter = gl.NEAREST; + if (generateMipMaps) { + minFilter = gl.LINEAR_MIPMAP_LINEAR; + } else { + minFilter = gl.LINEAR; + } + break; + case 7: + magFilter = gl.NEAREST; + minFilter = gl.LINEAR; + break; + case 1: + magFilter = gl.NEAREST; + minFilter = gl.NEAREST; + break; + case 9: + magFilter = gl.LINEAR; + if (generateMipMaps) { + minFilter = gl.NEAREST_MIPMAP_NEAREST; + } else { + minFilter = gl.NEAREST; + } + break; + case 10: + magFilter = gl.LINEAR; + if (generateMipMaps) { + minFilter = gl.NEAREST_MIPMAP_LINEAR; + } else { + minFilter = gl.NEAREST; + } + break; + case 2: + magFilter = gl.LINEAR; + minFilter = gl.LINEAR; + break; + case 12: + magFilter = gl.LINEAR; + minFilter = gl.NEAREST; + break; + } + return { + min: minFilter, + mag: magFilter + }; } - set frontFace(value) { - if (this._frontFace === value) { - return; + /** @internal */ + _createTexture() { + const texture = this._gl.createTexture(); + if (!texture) { + throw new Error("Unable to create texture"); } - this._frontFace = value; - this._isFrontFaceDirty = true; + return texture; } - reset() { - this._depthMask = true; - this._depthTest = true; - this._depthFunc = null; - this._cullFace = null; - this._cull = null; - this._zOffset = 0; - this._zOffsetUnits = 0; - this._frontFace = null; - this._isDepthTestDirty = true; - this._isDepthMaskDirty = true; - this._isDepthFuncDirty = false; - this._isCullFaceDirty = false; - this._isCullDirty = false; - this._isZOffsetDirty = true; - this._isFrontFaceDirty = false; + /** @internal */ + _createHardwareTexture() { + return new WebGLHardwareTexture(this._createTexture(), this._gl); } - apply(gl) { - if (!this.isDirty) { - return; - } - if (this._isCullDirty) { - if (this.cull) { - gl.enable(gl.CULL_FACE); - } else { - gl.disable(gl.CULL_FACE); - } - this._isCullDirty = false; - } - if (this._isCullFaceDirty) { - gl.cullFace(this.cullFace); - this._isCullFaceDirty = false; - } - if (this._isDepthMaskDirty) { - gl.depthMask(this.depthMask); - this._isDepthMaskDirty = false; + /** + * Creates an internal texture without binding it to a framebuffer + * @internal + * @param size defines the size of the texture + * @param options defines the options used to create the texture + * @param delayGPUTextureCreation true to delay the texture creation the first time it is really needed. false to create it right away + * @param source source type of the texture + * @returns a new internal texture + */ + _createInternalTexture(size, options, delayGPUTextureCreation = true, source = InternalTextureSource.Unknown) { + let generateMipMaps = false; + let type = 0; + let samplingMode = 3; + let format = 5; + let useSRGBBuffer = false; + let samples = 1; + let label; + if (options !== void 0 && typeof options === "object") { + generateMipMaps = !!options.generateMipMaps; + type = options.type === void 0 ? 0 : options.type; + samplingMode = options.samplingMode === void 0 ? 3 : options.samplingMode; + format = options.format === void 0 ? 5 : options.format; + useSRGBBuffer = options.useSRGBBuffer === void 0 ? false : options.useSRGBBuffer; + samples = options.samples ?? 1; + label = options.label; + } else { + generateMipMaps = !!options; } - if (this._isDepthTestDirty) { - if (this.depthTest) { - gl.enable(gl.DEPTH_TEST); - } else { - gl.disable(gl.DEPTH_TEST); - } - this._isDepthTestDirty = false; + useSRGBBuffer && (useSRGBBuffer = this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU)); + if (type === 1 && !this._caps.textureFloatLinearFiltering) { + samplingMode = 1; + } else if (type === 2 && !this._caps.textureHalfFloatLinearFiltering) { + samplingMode = 1; } - if (this._isDepthFuncDirty) { - gl.depthFunc(this.depthFunc); - this._isDepthFuncDirty = false; + if (type === 1 && !this._caps.textureFloat) { + type = 0; + Logger.Warn("Float textures are not supported. Type forced to TEXTURETYPE_UNSIGNED_BYTE"); } - if (this._isZOffsetDirty) { - if (this.zOffset || this.zOffsetUnits) { - gl.enable(gl.POLYGON_OFFSET_FILL); - gl.polygonOffset(this.zOffset, this.zOffsetUnits); - } else { - gl.disable(gl.POLYGON_OFFSET_FILL); - } - this._isZOffsetDirty = false; + const gl = this._gl; + const texture = new InternalTexture(this, source); + const width = size.width || size; + const height = size.height || size; + const depth = size.depth || 0; + const layers = size.layers || 0; + const filters = this._getSamplingParameters(samplingMode, generateMipMaps); + const target = layers !== 0 ? gl.TEXTURE_2D_ARRAY : depth !== 0 ? gl.TEXTURE_3D : gl.TEXTURE_2D; + const sizedFormat = this._getRGBABufferInternalSizedFormat(type, format, useSRGBBuffer); + const internalFormat = this._getInternalFormat(format); + const textureType = this._getWebGLTextureType(type); + this._bindTextureDirectly(target, texture); + if (layers !== 0) { + texture.is2DArray = true; + gl.texImage3D(target, 0, sizedFormat, width, height, layers, 0, internalFormat, textureType, null); + } else if (depth !== 0) { + texture.is3D = true; + gl.texImage3D(target, 0, sizedFormat, width, height, depth, 0, internalFormat, textureType, null); + } else { + gl.texImage2D(target, 0, sizedFormat, width, height, 0, internalFormat, textureType, null); } - if (this._isFrontFaceDirty) { - gl.frontFace(this.frontFace); - this._isFrontFaceDirty = false; + gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, filters.mag); + gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, filters.min); + gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + if (generateMipMaps) { + this._gl.generateMipmap(target); } + this._bindTextureDirectly(target, null); + texture._useSRGBBuffer = useSRGBBuffer; + texture.baseWidth = width; + texture.baseHeight = height; + texture.width = width; + texture.height = height; + texture.depth = layers; + texture.isReady = true; + texture.samples = samples; + texture.generateMipMaps = generateMipMaps; + texture.samplingMode = samplingMode; + texture.type = type; + texture.format = format; + texture.label = label; + this._internalTexturesCache.push(texture); + return texture; } -}; - -// node_modules/@babylonjs/core/States/stencilState.js -var StencilState = class _StencilState { - constructor() { - this.reset(); - } - reset() { - this.enabled = false; - this.mask = 255; - this.func = _StencilState.ALWAYS; - this.funcRef = 1; - this.funcMask = 255; - this.opStencilFail = _StencilState.KEEP; - this.opDepthFail = _StencilState.KEEP; - this.opStencilDepthPass = _StencilState.REPLACE; - } - get stencilFunc() { - return this.func; - } - set stencilFunc(value) { - this.func = value; - } - get stencilFuncRef() { - return this.funcRef; - } - set stencilFuncRef(value) { - this.funcRef = value; - } - get stencilFuncMask() { - return this.funcMask; - } - set stencilFuncMask(value) { - this.funcMask = value; - } - get stencilOpStencilFail() { - return this.opStencilFail; - } - set stencilOpStencilFail(value) { - this.opStencilFail = value; - } - get stencilOpDepthFail() { - return this.opDepthFail; - } - set stencilOpDepthFail(value) { - this.opDepthFail = value; - } - get stencilOpStencilDepthPass() { - return this.opStencilDepthPass; - } - set stencilOpStencilDepthPass(value) { - this.opStencilDepthPass = value; - } - get stencilMask() { - return this.mask; - } - set stencilMask(value) { - this.mask = value; - } - get stencilTest() { - return this.enabled; - } - set stencilTest(value) { - this.enabled = value; - } -}; -StencilState.ALWAYS = 519; -StencilState.KEEP = 7680; -StencilState.REPLACE = 7681; - -// node_modules/@babylonjs/core/States/alphaCullingState.js -var AlphaState = class { /** - * Initializes the state. + * @internal */ - constructor() { - this._blendFunctionParameters = new Array(4); - this._blendEquationParameters = new Array(2); - this._blendConstants = new Array(4); - this._isBlendConstantsDirty = false; - this._alphaBlend = false; - this._isAlphaBlendDirty = false; - this._isBlendFunctionParametersDirty = false; - this._isBlendEquationParametersDirty = false; - this.reset(); - } - get isDirty() { - return this._isAlphaBlendDirty || this._isBlendFunctionParametersDirty || this._isBlendEquationParametersDirty; - } - get alphaBlend() { - return this._alphaBlend; - } - set alphaBlend(value) { - if (this._alphaBlend === value) { - return; - } - this._alphaBlend = value; - this._isAlphaBlendDirty = true; + _getUseSRGBBuffer(useSRGBBuffer, noMipmap) { + return useSRGBBuffer && this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU || noMipmap); } - setAlphaBlendConstants(r, g, b, a) { - if (this._blendConstants[0] === r && this._blendConstants[1] === g && this._blendConstants[2] === b && this._blendConstants[3] === a) { - return; + _createTextureBase(url, noMipmap, invertY, scene, samplingMode = 3, onLoad = null, onError = null, prepareTexture, prepareTextureProcessFunction, buffer = null, fallback = null, format = null, forcedExtension = null, mimeType, loaderOptions, useSRGBBuffer) { + url = url || ""; + const fromData = url.substr(0, 5) === "data:"; + const fromBlob = url.substr(0, 5) === "blob:"; + const isBase64 = fromData && url.indexOf(";base64,") !== -1; + const texture = fallback ? fallback : new InternalTexture(this, InternalTextureSource.Url); + if (texture !== fallback) { + texture.label = url.substring(0, 60); } - this._blendConstants[0] = r; - this._blendConstants[1] = g; - this._blendConstants[2] = b; - this._blendConstants[3] = a; - this._isBlendConstantsDirty = true; - } - setAlphaBlendFunctionParameters(value0, value1, value2, value3) { - if (this._blendFunctionParameters[0] === value0 && this._blendFunctionParameters[1] === value1 && this._blendFunctionParameters[2] === value2 && this._blendFunctionParameters[3] === value3) { - return; + const originalUrl = url; + if (this._transformTextureUrl && !isBase64 && !fallback && !buffer) { + url = this._transformTextureUrl(url); } - this._blendFunctionParameters[0] = value0; - this._blendFunctionParameters[1] = value1; - this._blendFunctionParameters[2] = value2; - this._blendFunctionParameters[3] = value3; - this._isBlendFunctionParametersDirty = true; - } - setAlphaEquationParameters(rgb, alpha) { - if (this._blendEquationParameters[0] === rgb && this._blendEquationParameters[1] === alpha) { - return; + if (originalUrl !== url) { + texture._originalUrl = originalUrl; } - this._blendEquationParameters[0] = rgb; - this._blendEquationParameters[1] = alpha; - this._isBlendEquationParametersDirty = true; - } - reset() { - this._alphaBlend = false; - this._blendFunctionParameters[0] = null; - this._blendFunctionParameters[1] = null; - this._blendFunctionParameters[2] = null; - this._blendFunctionParameters[3] = null; - this._blendEquationParameters[0] = null; - this._blendEquationParameters[1] = null; - this._blendConstants[0] = null; - this._blendConstants[1] = null; - this._blendConstants[2] = null; - this._blendConstants[3] = null; - this._isAlphaBlendDirty = true; - this._isBlendFunctionParametersDirty = false; - this._isBlendEquationParametersDirty = false; - this._isBlendConstantsDirty = false; - } - apply(gl) { - if (!this.isDirty) { - return; + const lastDot = url.lastIndexOf("."); + let extension = forcedExtension ? forcedExtension : lastDot > -1 ? url.substring(lastDot).toLowerCase() : ""; + let loader = null; + const queryStringIndex = extension.indexOf("?"); + if (queryStringIndex > -1) { + extension = extension.split("?")[0]; } - if (this._isAlphaBlendDirty) { - if (this._alphaBlend) { - gl.enable(gl.BLEND); - } else { - gl.disable(gl.BLEND); + for (const availableLoader of _ThinEngine._TextureLoaders) { + if (availableLoader.canLoad(extension, mimeType)) { + loader = availableLoader; + break; } - this._isAlphaBlendDirty = false; } - if (this._isBlendFunctionParametersDirty) { - gl.blendFuncSeparate(this._blendFunctionParameters[0], this._blendFunctionParameters[1], this._blendFunctionParameters[2], this._blendFunctionParameters[3]); - this._isBlendFunctionParametersDirty = false; + if (scene) { + scene.addPendingData(texture); } - if (this._isBlendEquationParametersDirty) { - gl.blendEquationSeparate(this._blendEquationParameters[0], this._blendEquationParameters[1]); - this._isBlendEquationParametersDirty = false; + texture.url = url; + texture.generateMipMaps = !noMipmap; + texture.samplingMode = samplingMode; + texture.invertY = invertY; + texture._useSRGBBuffer = this._getUseSRGBBuffer(!!useSRGBBuffer, noMipmap); + if (!this._doNotHandleContextLost) { + texture._buffer = buffer; } - if (this._isBlendConstantsDirty) { - gl.blendColor(this._blendConstants[0], this._blendConstants[1], this._blendConstants[2], this._blendConstants[3]); - this._isBlendConstantsDirty = false; + let onLoadObserver = null; + if (onLoad && !fallback) { + onLoadObserver = texture.onLoadedObservable.add(onLoad); } - } -}; - -// node_modules/@babylonjs/core/Materials/Textures/textureSampler.js -var TextureSampler = class { - /** - * | Value | Type | Description | - * | ----- | ------------------ | ----------- | - * | 0 | CLAMP_ADDRESSMODE | | - * | 1 | WRAP_ADDRESSMODE | | - * | 2 | MIRROR_ADDRESSMODE | | - */ - get wrapU() { - return this._cachedWrapU; - } - set wrapU(value) { - this._cachedWrapU = value; + if (!fallback) { + this._internalTexturesCache.push(texture); + } + const onInternalError = (message, exception) => { + if (scene) { + scene.removePendingData(texture); + } + if (url === originalUrl) { + if (onLoadObserver) { + texture.onLoadedObservable.remove(onLoadObserver); + } + if (EngineStore.UseFallbackTexture && url !== EngineStore.FallbackTexture) { + this._createTextureBase(EngineStore.FallbackTexture, noMipmap, texture.invertY, scene, samplingMode, null, onError, prepareTexture, prepareTextureProcessFunction, buffer, texture); + } + message = (message || "Unknown error") + (EngineStore.UseFallbackTexture ? " - Fallback texture was used" : ""); + texture.onErrorObservable.notifyObservers({ message, exception }); + if (onError) { + onError(message, exception); + } + } else { + Logger.Warn(`Failed to load ${url}, falling back to ${originalUrl}`); + this._createTextureBase(originalUrl, noMipmap, texture.invertY, scene, samplingMode, onLoad, onError, prepareTexture, prepareTextureProcessFunction, buffer, texture, format, forcedExtension, mimeType, loaderOptions, useSRGBBuffer); + } + }; + if (loader) { + const callback = (data) => { + loader.loadData(data, texture, (width, height, loadMipmap, isCompressed, done, loadFailed) => { + if (loadFailed) { + onInternalError("TextureLoader failed to load data"); + } else { + prepareTexture(texture, extension, scene, { width, height }, texture.invertY, !loadMipmap, isCompressed, () => { + done(); + return false; + }, samplingMode); + } + }, loaderOptions); + }; + if (!buffer) { + this._loadFile(url, (data) => callback(new Uint8Array(data)), void 0, scene ? scene.offlineProvider : void 0, true, (request, exception) => { + onInternalError("Unable to load " + (request ? request.responseURL : url, exception)); + }); + } else { + if (buffer instanceof ArrayBuffer) { + callback(new Uint8Array(buffer)); + } else if (ArrayBuffer.isView(buffer)) { + callback(buffer); + } else { + if (onError) { + onError("Unable to load: only ArrayBuffer or ArrayBufferView is supported", null); + } + } + } + } else { + const onload = (img) => { + if (fromBlob && !this._doNotHandleContextLost) { + texture._buffer = img; + } + prepareTexture(texture, extension, scene, img, texture.invertY, noMipmap, false, prepareTextureProcessFunction, samplingMode); + }; + if (!fromData || isBase64) { + if (buffer && (typeof buffer.decoding === "string" || buffer.close)) { + onload(buffer); + } else { + _ThinEngine._FileToolsLoadImage(url, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType, texture.invertY && this._features.needsInvertingBitmap ? { imageOrientation: "flipY" } : void 0); + } + } else if (typeof buffer === "string" || buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer) || buffer instanceof Blob) { + _ThinEngine._FileToolsLoadImage(buffer, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType, texture.invertY && this._features.needsInvertingBitmap ? { imageOrientation: "flipY" } : void 0); + } else if (buffer) { + onload(buffer); + } + } + return texture; } /** - * | Value | Type | Description | - * | ----- | ------------------ | ----------- | - * | 0 | CLAMP_ADDRESSMODE | | - * | 1 | WRAP_ADDRESSMODE | | - * | 2 | MIRROR_ADDRESSMODE | | + * Usually called from Texture.ts. + * Passed information to create a WebGLTexture + * @param url defines a value which contains one of the following: + * * A conventional http URL, e.g. 'http://...' or 'file://...' + * * A base64 string of in-line texture data, e.g. 'data:image/jpg;base64,/...' + * * An indicator that data being passed using the buffer parameter, e.g. 'data:mytexture.jpg' + * @param noMipmap defines a boolean indicating that no mipmaps shall be generated. Ignored for compressed textures. They must be in the file + * @param invertY when true, image is flipped when loaded. You probably want true. Certain compressed textures may invert this if their default is inverted (eg. ktx) + * @param scene needed for loading to the correct scene + * @param samplingMode mode with should be used sample / access the texture (Default: Texture.TRILINEAR_SAMPLINGMODE) + * @param onLoad optional callback to be called upon successful completion + * @param onError optional callback to be called upon failure + * @param buffer a source of a file previously fetched as either a base64 string, an ArrayBuffer (compressed or image format), HTMLImageElement (image format), or a Blob + * @param fallback an internal argument in case the function must be called again, due to etc1 not having alpha capabilities + * @param format internal format. Default: RGB when extension is '.jpg' else RGBA. Ignored for compressed textures + * @param forcedExtension defines the extension to use to pick the right loader + * @param mimeType defines an optional mime type + * @param loaderOptions options to be passed to the loader + * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg) + * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU). + * @returns a InternalTexture for assignment back into BABYLON.Texture */ - get wrapV() { - return this._cachedWrapV; - } - set wrapV(value) { - this._cachedWrapV = value; + createTexture(url, noMipmap, invertY, scene, samplingMode = 3, onLoad = null, onError = null, buffer = null, fallback = null, format = null, forcedExtension = null, mimeType, loaderOptions, creationFlags, useSRGBBuffer) { + return this._createTextureBase(url, noMipmap, invertY, scene, samplingMode, onLoad, onError, this._prepareWebGLTexture.bind(this), (potWidth, potHeight, img, extension, texture, continuationCallback) => { + const gl = this._gl; + const isPot = img.width === potWidth && img.height === potHeight; + texture._creationFlags = creationFlags ?? 0; + const tip = this._getTexImageParametersForCreateTexture(format, extension, texture._useSRGBBuffer); + if (isPot) { + gl.texImage2D(gl.TEXTURE_2D, 0, tip.internalFormat, tip.format, tip.type, img); + return false; + } + const maxTextureSize = this._caps.maxTextureSize; + if (img.width > maxTextureSize || img.height > maxTextureSize || !this._supportsHardwareTextureRescaling) { + this._prepareWorkingCanvas(); + if (!this._workingCanvas || !this._workingContext) { + return false; + } + this._workingCanvas.width = potWidth; + this._workingCanvas.height = potHeight; + this._workingContext.drawImage(img, 0, 0, img.width, img.height, 0, 0, potWidth, potHeight); + gl.texImage2D(gl.TEXTURE_2D, 0, tip.internalFormat, tip.format, tip.type, this._workingCanvas); + texture.width = potWidth; + texture.height = potHeight; + return false; + } else { + const source = new InternalTexture(this, InternalTextureSource.Temp); + this._bindTextureDirectly(gl.TEXTURE_2D, source, true); + gl.texImage2D(gl.TEXTURE_2D, 0, tip.internalFormat, tip.format, tip.type, img); + this._rescaleTexture(source, texture, scene, tip.format, () => { + this._releaseTexture(source); + this._bindTextureDirectly(gl.TEXTURE_2D, texture, true); + continuationCallback(); + }); + } + return true; + }, buffer, fallback, format, forcedExtension, mimeType, loaderOptions, useSRGBBuffer); } /** - * | Value | Type | Description | - * | ----- | ------------------ | ----------- | - * | 0 | CLAMP_ADDRESSMODE | | - * | 1 | WRAP_ADDRESSMODE | | - * | 2 | MIRROR_ADDRESSMODE | | + * Calls to the GL texImage2D and texImage3D functions require three arguments describing the pixel format of the texture. + * createTexture derives these from the babylonFormat and useSRGBBuffer arguments and also the file extension of the URL it's working with. + * This function encapsulates that derivation for easy unit testing. + * @param babylonFormat Babylon's format enum, as specified in ITextureCreationOptions. + * @param fileExtension The file extension including the dot, e.g. .jpg. + * @param useSRGBBuffer Use SRGB not linear. + * @returns The options to pass to texImage2D or texImage3D calls. + * @internal */ - get wrapR() { - return this._cachedWrapR; - } - set wrapR(value) { - this._cachedWrapR = value; + _getTexImageParametersForCreateTexture(babylonFormat, fileExtension, useSRGBBuffer) { + if (babylonFormat === void 0 || babylonFormat === null) { + babylonFormat = fileExtension === ".jpg" && !useSRGBBuffer ? 4 : 5; + } + let format, internalFormat; + if (this.webGLVersion === 1) { + format = this._getInternalFormat(babylonFormat, useSRGBBuffer); + internalFormat = format; + } else { + format = this._getInternalFormat(babylonFormat, false); + internalFormat = this._getRGBABufferInternalSizedFormat(0, babylonFormat, useSRGBBuffer); + } + return { + internalFormat, + format, + type: this._gl.UNSIGNED_BYTE + }; } /** - * With compliant hardware and browser (supporting anisotropic filtering) - * this defines the level of anisotropic filtering in the texture. - * The higher the better but the slower. + * Loads an image as an HTMLImageElement. + * @param input url string, ArrayBuffer, or Blob to load + * @param onLoad callback called when the image successfully loads + * @param onError callback called when the image fails to load + * @param offlineProvider offline provider for caching + * @param mimeType optional mime type + * @param imageBitmapOptions optional the options to use when creating an ImageBitmap + * @returns the HTMLImageElement of the loaded image + * @internal */ - get anisotropicFilteringLevel() { - return this._cachedAnisotropicFilteringLevel; - } - set anisotropicFilteringLevel(value) { - this._cachedAnisotropicFilteringLevel = value; + static _FileToolsLoadImage(input, onLoad, onError, offlineProvider, mimeType, imageBitmapOptions) { + throw _WarnImport("FileTools"); } /** - * Gets or sets the comparison function (513, 514, etc). Set 0 to not use a comparison function + * @internal */ - get comparisonFunction() { - return this._comparisonFunction; - } - set comparisonFunction(value) { - this._comparisonFunction = value; + _rescaleTexture(source, destination, scene, internalFormat, onComplete) { } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Indicates to use the mip maps (if available on the texture). - * Thanks to this flag, you can instruct the sampler to not sample the mipmaps even if they exist (and if the sampling mode is set to a value that normally samples the mipmaps!) + * Creates a raw texture + * @param data defines the data to store in the texture + * @param width defines the width of the texture + * @param height defines the height of the texture + * @param format defines the format of the data + * @param generateMipMaps defines if the engine should generate the mip levels + * @param invertY defines if data must be stored with Y axis inverted + * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default) + * @param compression defines the compression used (null by default) + * @param type defines the type fo the data (Engine.TEXTURETYPE_UNSIGNED_INT by default) + * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg) + * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU). + * @returns the raw texture inside an InternalTexture */ - get useMipMaps() { - return this._useMipMaps; - } - set useMipMaps(value) { - this._useMipMaps = value; + createRawTexture(data, width, height, format, generateMipMaps, invertY, samplingMode, compression = null, type = 0, creationFlags = 0, useSRGBBuffer = false) { + throw _WarnImport("Engine.RawTexture"); } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Creates a Sampler instance + * Creates a new raw cube texture + * @param data defines the array of data to use to create each face + * @param size defines the size of the textures + * @param format defines the format of the data + * @param type defines the type of the data (like Engine.TEXTURETYPE_UNSIGNED_INT) + * @param generateMipMaps defines if the engine should generate the mip levels + * @param invertY defines if data must be stored with Y axis inverted + * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE) + * @param compression defines the compression used (null by default) + * @returns the cube texture as an InternalTexture */ - constructor() { - this.samplingMode = -1; - this._useMipMaps = true; - this._cachedWrapU = null; - this._cachedWrapV = null; - this._cachedWrapR = null; - this._cachedAnisotropicFilteringLevel = null; - this._comparisonFunction = 0; + createRawCubeTexture(data, size, format, type, generateMipMaps, invertY, samplingMode, compression = null) { + throw _WarnImport("Engine.RawTexture"); } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Sets all the parameters of the sampler - * @param wrapU u address mode (default: TEXTURE_WRAP_ADDRESSMODE) - * @param wrapV v address mode (default: TEXTURE_WRAP_ADDRESSMODE) - * @param wrapR r address mode (default: TEXTURE_WRAP_ADDRESSMODE) - * @param anisotropicFilteringLevel anisotropic level (default: 1) - * @param samplingMode sampling mode (default: 2) - * @param comparisonFunction comparison function (default: 0 - no comparison function) - * @returns the current sampler instance + * Creates a new raw 3D texture + * @param data defines the data used to create the texture + * @param width defines the width of the texture + * @param height defines the height of the texture + * @param depth defines the depth of the texture + * @param format defines the format of the texture + * @param generateMipMaps defines if the engine must generate mip levels + * @param invertY defines if data must be stored with Y axis inverted + * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE) + * @param compression defines the compressed used (can be null) + * @param textureType defines the compressed used (can be null) + * @returns a new raw 3D texture (stored in an InternalTexture) */ - setParameters(wrapU = 1, wrapV = 1, wrapR = 1, anisotropicFilteringLevel = 1, samplingMode = 2, comparisonFunction = 0) { - this._cachedWrapU = wrapU; - this._cachedWrapV = wrapV; - this._cachedWrapR = wrapR; - this._cachedAnisotropicFilteringLevel = anisotropicFilteringLevel; - this.samplingMode = samplingMode; - this._comparisonFunction = comparisonFunction; - return this; + createRawTexture3D(data, width, height, depth, format, generateMipMaps, invertY, samplingMode, compression = null, textureType = 0) { + throw _WarnImport("Engine.RawTexture"); } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Compares this sampler with another one - * @param other sampler to compare with - * @returns true if the samplers have the same parametres, else false + * Creates a new raw 2D array texture + * @param data defines the data used to create the texture + * @param width defines the width of the texture + * @param height defines the height of the texture + * @param depth defines the number of layers of the texture + * @param format defines the format of the texture + * @param generateMipMaps defines if the engine must generate mip levels + * @param invertY defines if data must be stored with Y axis inverted + * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE) + * @param compression defines the compressed used (can be null) + * @param textureType defines the compressed used (can be null) + * @returns a new raw 2D array texture (stored in an InternalTexture) */ - compareSampler(other) { - return this._cachedWrapU === other._cachedWrapU && this._cachedWrapV === other._cachedWrapV && this._cachedWrapR === other._cachedWrapR && this._cachedAnisotropicFilteringLevel === other._cachedAnisotropicFilteringLevel && this.samplingMode === other.samplingMode && this._comparisonFunction === other._comparisonFunction && this._useMipMaps === other._useMipMaps; + createRawTexture2DArray(data, width, height, depth, format, generateMipMaps, invertY, samplingMode, compression = null, textureType = 0) { + throw _WarnImport("Engine.RawTexture"); } -}; - -// node_modules/@babylonjs/core/Materials/Textures/internalTexture.js -var InternalTextureSource; -(function(InternalTextureSource2) { - InternalTextureSource2[InternalTextureSource2["Unknown"] = 0] = "Unknown"; - InternalTextureSource2[InternalTextureSource2["Url"] = 1] = "Url"; - InternalTextureSource2[InternalTextureSource2["Temp"] = 2] = "Temp"; - InternalTextureSource2[InternalTextureSource2["Raw"] = 3] = "Raw"; - InternalTextureSource2[InternalTextureSource2["Dynamic"] = 4] = "Dynamic"; - InternalTextureSource2[InternalTextureSource2["RenderTarget"] = 5] = "RenderTarget"; - InternalTextureSource2[InternalTextureSource2["MultiRenderTarget"] = 6] = "MultiRenderTarget"; - InternalTextureSource2[InternalTextureSource2["Cube"] = 7] = "Cube"; - InternalTextureSource2[InternalTextureSource2["CubeRaw"] = 8] = "CubeRaw"; - InternalTextureSource2[InternalTextureSource2["CubePrefiltered"] = 9] = "CubePrefiltered"; - InternalTextureSource2[InternalTextureSource2["Raw3D"] = 10] = "Raw3D"; - InternalTextureSource2[InternalTextureSource2["Raw2DArray"] = 11] = "Raw2DArray"; - InternalTextureSource2[InternalTextureSource2["DepthStencil"] = 12] = "DepthStencil"; - InternalTextureSource2[InternalTextureSource2["CubeRawRGBD"] = 13] = "CubeRawRGBD"; - InternalTextureSource2[InternalTextureSource2["Depth"] = 14] = "Depth"; -})(InternalTextureSource || (InternalTextureSource = {})); -var InternalTexture = class _InternalTexture extends TextureSampler { /** - * Gets a boolean indicating if the texture uses mipmaps - * TODO implements useMipMaps as a separate setting from generateMipMaps + * @internal */ - get useMipMaps() { - return this.generateMipMaps; - } - set useMipMaps(value) { - this.generateMipMaps = value; - } - /** Gets the unique id of the internal texture */ - get uniqueId() { - return this._uniqueId; + _unpackFlipY(value) { + if (this._unpackFlipYCached !== value) { + this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, value ? 1 : 0); + if (this.enableUnpackFlipYCached) { + this._unpackFlipYCached = value; + } + } } /** @internal */ - _setUniqueId(id) { - this._uniqueId = id; + _getUnpackAlignement() { + return this._gl.getParameter(this._gl.UNPACK_ALIGNMENT); } - /** - * Gets the Engine the texture belongs to. - * @returns The babylon engine - */ - getEngine() { - return this._engine; + _getTextureTarget(texture) { + if (texture.isCube) { + return this._gl.TEXTURE_CUBE_MAP; + } else if (texture.is3D) { + return this._gl.TEXTURE_3D; + } else if (texture.is2DArray || texture.isMultiview) { + return this._gl.TEXTURE_2D_ARRAY; + } + return this._gl.TEXTURE_2D; } /** - * Gets the data source type of the texture + * Update the sampling mode of a given texture + * @param samplingMode defines the required sampling mode + * @param texture defines the texture to update + * @param generateMipMaps defines whether to generate mipmaps for the texture */ - get source() { - return this._source; + updateTextureSamplingMode(samplingMode, texture, generateMipMaps = false) { + const target = this._getTextureTarget(texture); + const filters = this._getSamplingParameters(samplingMode, texture.useMipMaps || generateMipMaps); + this._setTextureParameterInteger(target, this._gl.TEXTURE_MAG_FILTER, filters.mag, texture); + this._setTextureParameterInteger(target, this._gl.TEXTURE_MIN_FILTER, filters.min); + if (generateMipMaps) { + texture.generateMipMaps = true; + this._gl.generateMipmap(target); + } + this._bindTextureDirectly(target, null); + texture.samplingMode = samplingMode; } /** - * Creates a new InternalTexture - * @param engine defines the engine to use - * @param source defines the type of data that will be used - * @param delayAllocation if the texture allocation should be delayed (default: false) + * Update the dimensions of a texture + * @param texture texture to update + * @param width new width of the texture + * @param height new height of the texture + * @param depth new depth of the texture */ - constructor(engine, source, delayAllocation = false) { - super(); - this.isReady = false; - this.isCube = false; - this.is3D = false; - this.is2DArray = false; - this.isMultiview = false; - this.url = ""; - this.generateMipMaps = false; - this.samples = 0; - this.type = -1; - this.format = -1; - this.onLoadedObservable = new Observable(); - this.onErrorObservable = new Observable(); - this.onRebuildCallback = null; - this.width = 0; - this.height = 0; - this.depth = 0; - this.baseWidth = 0; - this.baseHeight = 0; - this.baseDepth = 0; - this.invertY = false; - this._invertVScale = false; - this._associatedChannel = -1; - this._source = InternalTextureSource.Unknown; - this._buffer = null; - this._bufferView = null; - this._bufferViewArray = null; - this._bufferViewArrayArray = null; - this._size = 0; - this._extension = ""; - this._files = null; - this._workingCanvas = null; - this._workingContext = null; - this._cachedCoordinatesMode = null; - this._isDisabled = false; - this._compression = null; - this._sphericalPolynomial = null; - this._sphericalPolynomialPromise = null; - this._sphericalPolynomialComputed = false; - this._lodGenerationScale = 0; - this._lodGenerationOffset = 0; - this._useSRGBBuffer = false; - this._creationFlags = 0; - this._lodTextureHigh = null; - this._lodTextureMid = null; - this._lodTextureLow = null; - this._isRGBD = false; - this._linearSpecularLOD = false; - this._irradianceTexture = null; - this._hardwareTexture = null; - this._maxLodLevel = null; - this._references = 1; - this._gammaSpace = null; - this._premulAlpha = false; - this._dynamicTextureSource = null; - this._engine = engine; - this._source = source; - this._uniqueId = _InternalTexture._Counter++; - if (!delayAllocation) { - this._hardwareTexture = engine._createHardwareTexture(); - } + updateTextureDimensions(texture, width, height, depth = 1) { } /** - * Increments the number of references (ie. the number of Texture that point to it) + * Update the sampling mode of a given texture + * @param texture defines the texture to update + * @param wrapU defines the texture wrap mode of the u coordinates + * @param wrapV defines the texture wrap mode of the v coordinates + * @param wrapR defines the texture wrap mode of the r coordinates */ - incrementReferences() { - this._references++; + updateTextureWrappingMode(texture, wrapU, wrapV = null, wrapR = null) { + const target = this._getTextureTarget(texture); + if (wrapU !== null) { + this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(wrapU), texture); + texture._cachedWrapU = wrapU; + } + if (wrapV !== null) { + this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(wrapV), texture); + texture._cachedWrapV = wrapV; + } + if ((texture.is2DArray || texture.is3D) && wrapR !== null) { + this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(wrapR), texture); + texture._cachedWrapR = wrapR; + } + this._bindTextureDirectly(target, null); } /** - * Change the size of the texture (not the size of the content) - * @param width defines the new width - * @param height defines the new height - * @param depth defines the new depth (1 by default) + * @internal */ - updateSize(width, height, depth = 1) { - this._engine.updateTextureDimensions(this, width, height, depth); - this.width = width; - this.height = height; - this.depth = depth; - this.baseWidth = width; - this.baseHeight = height; - this.baseDepth = depth; - this._size = width * height * depth; - } - /** @internal */ - _rebuild() { - this.isReady = false; - this._cachedCoordinatesMode = null; - this._cachedWrapU = null; - this._cachedWrapV = null; - this._cachedWrapR = null; - this._cachedAnisotropicFilteringLevel = null; - if (this.onRebuildCallback) { - const data = this.onRebuildCallback(this); - const swapAndSetIsReady = (proxyInternalTexture) => { - proxyInternalTexture._swapAndDie(this, false); - this.isReady = data.isReady; - }; - if (data.isAsync) { - data.proxy.then(swapAndSetIsReady); + _setupDepthStencilTexture(internalTexture, size, generateStencil, bilinearFiltering, comparisonFunction, samples = 1) { + const width = size.width || size; + const height = size.height || size; + const layers = size.layers || 0; + const depth = size.depth || 0; + internalTexture.baseWidth = width; + internalTexture.baseHeight = height; + internalTexture.width = width; + internalTexture.height = height; + internalTexture.is2DArray = layers > 0; + internalTexture.depth = layers || depth; + internalTexture.isReady = true; + internalTexture.samples = samples; + internalTexture.generateMipMaps = false; + internalTexture.samplingMode = bilinearFiltering ? 2 : 1; + internalTexture.type = 0; + internalTexture._comparisonFunction = comparisonFunction; + const gl = this._gl; + const target = this._getTextureTarget(internalTexture); + const samplingParameters = this._getSamplingParameters(internalTexture.samplingMode, false); + gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, samplingParameters.mag); + gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, samplingParameters.min); + gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + if (this.webGLVersion > 1) { + if (comparisonFunction === 0) { + gl.texParameteri(target, gl.TEXTURE_COMPARE_FUNC, 515); + gl.texParameteri(target, gl.TEXTURE_COMPARE_MODE, gl.NONE); } else { - swapAndSetIsReady(data.proxy); - } - return; - } - let proxy; - switch (this.source) { - case InternalTextureSource.Temp: - break; - case InternalTextureSource.Url: - proxy = this._engine.createTexture( - this._originalUrl ?? this.url, - !this.generateMipMaps, - this.invertY, - null, - this.samplingMode, - // Do not use Proxy here as it could be fully synchronous - // and proxy would be undefined. - (temp) => { - temp._swapAndDie(this, false); - this.isReady = true; - }, - null, - this._buffer, - void 0, - this.format, - this._extension, - void 0, - void 0, - void 0, - this._useSRGBBuffer - ); - return; - case InternalTextureSource.Raw: - proxy = this._engine.createRawTexture(this._bufferView, this.baseWidth, this.baseHeight, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression, this.type, this._creationFlags, this._useSRGBBuffer); - proxy._swapAndDie(this, false); - this.isReady = true; - break; - case InternalTextureSource.Raw3D: - proxy = this._engine.createRawTexture3D(this._bufferView, this.baseWidth, this.baseHeight, this.baseDepth, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression, this.type); - proxy._swapAndDie(this, false); - this.isReady = true; - break; - case InternalTextureSource.Raw2DArray: - proxy = this._engine.createRawTexture2DArray(this._bufferView, this.baseWidth, this.baseHeight, this.baseDepth, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression, this.type); - proxy._swapAndDie(this, false); - this.isReady = true; - break; - case InternalTextureSource.Dynamic: - proxy = this._engine.createDynamicTexture(this.baseWidth, this.baseHeight, this.generateMipMaps, this.samplingMode); - proxy._swapAndDie(this, false); - if (this._dynamicTextureSource) { - this._engine.updateDynamicTexture(this, this._dynamicTextureSource, this.invertY, this._premulAlpha, this.format, true); - } - break; - case InternalTextureSource.Cube: - proxy = this._engine.createCubeTexture(this.url, null, this._files, !this.generateMipMaps, () => { - proxy._swapAndDie(this, false); - this.isReady = true; - }, null, this.format, this._extension, false, 0, 0, null, void 0, this._useSRGBBuffer); - return; - case InternalTextureSource.CubeRaw: - proxy = this._engine.createRawCubeTexture(this._bufferViewArray, this.width, this._originalFormat ?? this.format, this.type, this.generateMipMaps, this.invertY, this.samplingMode, this._compression); - proxy._swapAndDie(this, false); - this.isReady = true; - break; - case InternalTextureSource.CubeRawRGBD: - return; - case InternalTextureSource.CubePrefiltered: - proxy = this._engine.createPrefilteredCubeTexture(this.url, null, this._lodGenerationScale, this._lodGenerationOffset, (proxy2) => { - if (proxy2) { - proxy2._swapAndDie(this, false); - } - this.isReady = true; - }, null, this.format, this._extension); - proxy._sphericalPolynomial = this._sphericalPolynomial; - return; - case InternalTextureSource.DepthStencil: - case InternalTextureSource.Depth: { - break; + gl.texParameteri(target, gl.TEXTURE_COMPARE_FUNC, comparisonFunction); + gl.texParameteri(target, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE); } } } /** * @internal */ - _swapAndDie(target, swapAll = true) { - var _a; - (_a = this._hardwareTexture) == null ? void 0 : _a.setUsage(target._source, this.generateMipMaps, this.is2DArray, this.isCube, this.is3D, this.width, this.height, this.depth); - target._hardwareTexture = this._hardwareTexture; - if (swapAll) { - target._isRGBD = this._isRGBD; - } - if (this._lodTextureHigh) { - if (target._lodTextureHigh) { - target._lodTextureHigh.dispose(); - } - target._lodTextureHigh = this._lodTextureHigh; - } - if (this._lodTextureMid) { - if (target._lodTextureMid) { - target._lodTextureMid.dispose(); - } - target._lodTextureMid = this._lodTextureMid; - } - if (this._lodTextureLow) { - if (target._lodTextureLow) { - target._lodTextureLow.dispose(); - } - target._lodTextureLow = this._lodTextureLow; + _uploadCompressedDataToTextureDirectly(texture, internalFormat, width, height, data, faceIndex = 0, lod = 0) { + const gl = this._gl; + let target = gl.TEXTURE_2D; + if (texture.isCube) { + target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex; } - if (this._irradianceTexture) { - if (target._irradianceTexture) { - target._irradianceTexture.dispose(); + if (texture._useSRGBBuffer) { + switch (internalFormat) { + case 37492: + case 36196: + if (this._caps.etc2) { + internalFormat = gl.COMPRESSED_SRGB8_ETC2; + } else { + texture._useSRGBBuffer = false; + } + break; + case 37496: + if (this._caps.etc2) { + internalFormat = gl.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC; + } else { + texture._useSRGBBuffer = false; + } + break; + case 36492: + internalFormat = gl.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT; + break; + case 37808: + internalFormat = gl.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR; + break; + case 33776: + if (this._caps.s3tc_srgb) { + internalFormat = gl.COMPRESSED_SRGB_S3TC_DXT1_EXT; + } else { + texture._useSRGBBuffer = false; + } + break; + case 33777: + if (this._caps.s3tc_srgb) { + internalFormat = gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; + } else { + texture._useSRGBBuffer = false; + } + break; + case 33779: + if (this._caps.s3tc_srgb) { + internalFormat = gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; + } else { + texture._useSRGBBuffer = false; + } + break; + default: + texture._useSRGBBuffer = false; + break; } - target._irradianceTexture = this._irradianceTexture; - } - const cache = this._engine.getLoadedTexturesCache(); - let index = cache.indexOf(this); - if (index !== -1) { - cache.splice(index, 1); - } - index = cache.indexOf(target); - if (index === -1) { - cache.push(target); } + this._gl.compressedTexImage2D(target, lod, internalFormat, width, height, 0, data); } /** - * Dispose the current allocated resources + * @internal */ - dispose() { - this._references--; - this.onLoadedObservable.clear(); - this.onErrorObservable.clear(); - if (this._references === 0) { - this._engine._releaseTexture(this); - this._hardwareTexture = null; - this._dynamicTextureSource = null; - } - } -}; -InternalTexture._Counter = 0; - -// node_modules/@babylonjs/core/Engines/WebGL/webGL2ShaderProcessors.js -var varyingRegex = /(flat\s)?\s*varying\s*.*/; -var WebGL2ShaderProcessor = class { - constructor() { - this.shaderLanguage = ShaderLanguage.GLSL; - } - attributeProcessor(attribute) { - return attribute.replace("attribute", "in"); - } - varyingCheck(varying, _isFragment) { - return varyingRegex.test(varying); - } - varyingProcessor(varying, isFragment) { - return varying.replace("varying", isFragment ? "in" : "out"); - } - postProcessor(code, defines, isFragment) { - const hasDrawBuffersExtension = code.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1; - const regex = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g; - code = code.replace(regex, ""); - code = code.replace(/texture2D\s*\(/g, "texture("); - if (isFragment) { - const hasOutput = code.search(/layout *\(location *= *0\) *out/g) !== -1; - code = code.replace(/texture2DLodEXT\s*\(/g, "textureLod("); - code = code.replace(/textureCubeLodEXT\s*\(/g, "textureLod("); - code = code.replace(/textureCube\s*\(/g, "texture("); - code = code.replace(/gl_FragDepthEXT/g, "gl_FragDepth"); - code = code.replace(/gl_FragColor/g, "glFragColor"); - code = code.replace(/gl_FragData/g, "glFragData"); - code = code.replace(/void\s+?main\s*\(/g, (hasDrawBuffersExtension || hasOutput ? "" : "layout(location = 0) out vec4 glFragColor;\n") + "void main("); - } else { - const hasMultiviewExtension = defines.indexOf("#define MULTIVIEW") !== -1; - if (hasMultiviewExtension) { - return "#extension GL_OVR_multiview2 : require\nlayout (num_views = 2) in;\n" + code; - } + _uploadDataToTextureDirectly(texture, imageData, faceIndex = 0, lod = 0, babylonInternalFormat, useTextureWidthAndHeight = false) { + const gl = this._gl; + const textureType = this._getWebGLTextureType(texture.type); + const format = this._getInternalFormat(texture.format); + const internalFormat = babylonInternalFormat === void 0 ? this._getRGBABufferInternalSizedFormat(texture.type, texture.format, texture._useSRGBBuffer) : this._getInternalFormat(babylonInternalFormat, texture._useSRGBBuffer); + this._unpackFlipY(texture.invertY); + let target = gl.TEXTURE_2D; + if (texture.isCube) { + target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex; } - return code; + const lodMaxWidth = Math.round(Math.log(texture.width) * Math.LOG2E); + const lodMaxHeight = Math.round(Math.log(texture.height) * Math.LOG2E); + const width = useTextureWidthAndHeight ? texture.width : Math.pow(2, Math.max(lodMaxWidth - lod, 0)); + const height = useTextureWidthAndHeight ? texture.height : Math.pow(2, Math.max(lodMaxHeight - lod, 0)); + gl.texImage2D(target, lod, internalFormat, width, height, 0, format, textureType, imageData); } -}; - -// node_modules/@babylonjs/core/Buffers/dataBuffer.js -var DataBuffer = class _DataBuffer { /** - * Gets the underlying buffer + * Update a portion of an internal texture + * @param texture defines the texture to update + * @param imageData defines the data to store into the texture + * @param xOffset defines the x coordinates of the update rectangle + * @param yOffset defines the y coordinates of the update rectangle + * @param width defines the width of the update rectangle + * @param height defines the height of the update rectangle + * @param faceIndex defines the face index if texture is a cube (0 by default) + * @param lod defines the lod level to update (0 by default) + * @param generateMipMaps defines whether to generate mipmaps or not */ - get underlyingResource() { - return null; + updateTextureData(texture, imageData, xOffset, yOffset, width, height, faceIndex = 0, lod = 0, generateMipMaps = false) { + const gl = this._gl; + const textureType = this._getWebGLTextureType(texture.type); + const format = this._getInternalFormat(texture.format); + this._unpackFlipY(texture.invertY); + let targetForBinding = gl.TEXTURE_2D; + let target = gl.TEXTURE_2D; + if (texture.isCube) { + target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex; + targetForBinding = gl.TEXTURE_CUBE_MAP; + } + this._bindTextureDirectly(targetForBinding, texture, true); + gl.texSubImage2D(target, lod, xOffset, yOffset, width, height, format, textureType, imageData); + if (generateMipMaps) { + this._gl.generateMipmap(target); + } + this._bindTextureDirectly(targetForBinding, null); } /** - * Constructs the buffer + * @internal */ - constructor() { - this.references = 0; - this.capacity = 0; - this.is32Bits = false; - this.uniqueId = _DataBuffer._Counter++; - } -}; -DataBuffer._Counter = 0; - -// node_modules/@babylonjs/core/Meshes/WebGL/webGLDataBuffer.js -var WebGLDataBuffer = class extends DataBuffer { - constructor(resource) { - super(); - this._buffer = resource; - } - get underlyingResource() { - return this._buffer; - } -}; - -// node_modules/@babylonjs/core/Engines/WebGL/webGLPipelineContext.js -var WebGLPipelineContext = class { - constructor() { - this._valueCache = {}; - this.vertexCompilationError = null; - this.fragmentCompilationError = null; - this.programLinkError = null; - this.programValidationError = null; - this._isDisposed = false; - } - get isAsync() { - return this.isParallelCompiled; + _uploadArrayBufferViewToTexture(texture, imageData, faceIndex = 0, lod = 0) { + const gl = this._gl; + const bindTarget = texture.isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D; + this._bindTextureDirectly(bindTarget, texture, true); + this._uploadDataToTextureDirectly(texture, imageData, faceIndex, lod); + this._bindTextureDirectly(bindTarget, null, true); } - get isReady() { - if (this.program) { - if (this.isParallelCompiled) { - return this.engine._isRenderingStateCompiled(this); - } - return true; + _prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode) { + const gl = this._gl; + if (!gl) { + return; } - return false; - } - _handlesSpectorRebuildCallback(onCompiled) { - if (onCompiled && this.program) { - onCompiled(this.program); + const filters = this._getSamplingParameters(samplingMode, !noMipmap); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filters.mag); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filters.min); + if (!noMipmap && !isCompressed) { + gl.generateMipmap(gl.TEXTURE_2D); + } + this._bindTextureDirectly(gl.TEXTURE_2D, null); + if (scene) { + scene.removePendingData(texture); } + texture.onLoadedObservable.notifyObservers(texture); + texture.onLoadedObservable.clear(); } - _fillEffectInformation(effect, uniformBuffersNames, uniformsNames, uniforms, samplerList, samplers, attributesNames, attributes) { - const engine = this.engine; - if (engine.supportsUniformBuffers) { - for (const name69 in uniformBuffersNames) { - effect.bindUniformBlock(name69, uniformBuffersNames[name69]); - } + _prepareWebGLTexture(texture, extension, scene, img, invertY, noMipmap, isCompressed, processFunction, samplingMode = 3) { + const maxTextureSize = this.getCaps().maxTextureSize; + const potWidth = Math.min(maxTextureSize, this.needPOTTextures ? _ThinEngine.GetExponentOfTwo(img.width, maxTextureSize) : img.width); + const potHeight = Math.min(maxTextureSize, this.needPOTTextures ? _ThinEngine.GetExponentOfTwo(img.height, maxTextureSize) : img.height); + const gl = this._gl; + if (!gl) { + return; } - const effectAvailableUniforms = this.engine.getUniforms(this, uniformsNames); - effectAvailableUniforms.forEach((uniform, index2) => { - uniforms[uniformsNames[index2]] = uniform; - }); - this._uniforms = uniforms; - let index; - for (index = 0; index < samplerList.length; index++) { - const sampler = effect.getUniform(samplerList[index]); - if (sampler == null) { - samplerList.splice(index, 1); - index--; + if (!texture._hardwareTexture) { + if (scene) { + scene.removePendingData(texture); } + return; } - samplerList.forEach((name69, index2) => { - samplers[name69] = index2; - }); - for (const attr of engine.getAttributes(this, attributesNames)) { - attributes.push(attr); + this._bindTextureDirectly(gl.TEXTURE_2D, texture, true); + this._unpackFlipY(invertY === void 0 ? true : invertY ? true : false); + texture.baseWidth = img.width; + texture.baseHeight = img.height; + texture.width = potWidth; + texture.height = potHeight; + texture.isReady = true; + texture.type = texture.type !== -1 ? texture.type : 0; + texture.format = texture.format !== -1 ? texture.format : extension === ".jpg" && !texture._useSRGBBuffer ? 4 : 5; + if (processFunction(potWidth, potHeight, img, extension, texture, () => { + this._prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode); + })) { + return; } - } - /** - * Release all associated resources. - **/ - dispose() { - this._uniforms = {}; - this._isDisposed = true; + this._prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode); } /** * @internal */ - _cacheMatrix(uniformName, matrix) { - const cache = this._valueCache[uniformName]; - const flag = matrix.updateFlag; - if (cache !== void 0 && cache === flag) { - return false; + _setupFramebufferDepthAttachments(generateStencilBuffer, generateDepthBuffer, width, height, samples = 1) { + const gl = this._gl; + if (generateStencilBuffer && generateDepthBuffer) { + return this._createRenderBuffer(width, height, samples, gl.DEPTH_STENCIL, gl.DEPTH24_STENCIL8, gl.DEPTH_STENCIL_ATTACHMENT); } - this._valueCache[uniformName] = flag; - return true; + if (generateDepthBuffer) { + let depthFormat = gl.DEPTH_COMPONENT16; + if (this._webGLVersion > 1) { + depthFormat = gl.DEPTH_COMPONENT32F; + } + return this._createRenderBuffer(width, height, samples, depthFormat, depthFormat, gl.DEPTH_ATTACHMENT); + } + if (generateStencilBuffer) { + return this._createRenderBuffer(width, height, samples, gl.STENCIL_INDEX8, gl.STENCIL_INDEX8, gl.STENCIL_ATTACHMENT); + } + return null; } /** * @internal */ - _cacheFloat2(uniformName, x, y) { - let cache = this._valueCache[uniformName]; - if (!cache || cache.length !== 2) { - cache = [x, y]; - this._valueCache[uniformName] = cache; - return true; - } - let changed = false; - if (cache[0] !== x) { - cache[0] = x; - changed = true; + _createRenderBuffer(width, height, samples, internalFormat, msInternalFormat, attachment, unbindBuffer = true) { + const gl = this._gl; + const renderBuffer = gl.createRenderbuffer(); + return this._updateRenderBuffer(renderBuffer, width, height, samples, internalFormat, msInternalFormat, attachment, unbindBuffer); + } + _updateRenderBuffer(renderBuffer, width, height, samples, internalFormat, msInternalFormat, attachment, unbindBuffer = true) { + const gl = this._gl; + gl.bindRenderbuffer(gl.RENDERBUFFER, renderBuffer); + if (samples > 1 && gl.renderbufferStorageMultisample) { + gl.renderbufferStorageMultisample(gl.RENDERBUFFER, samples, msInternalFormat, width, height); + } else { + gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, width, height); } - if (cache[1] !== y) { - cache[1] = y; - changed = true; + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, renderBuffer); + if (unbindBuffer) { + gl.bindRenderbuffer(gl.RENDERBUFFER, null); } - return changed; + return renderBuffer; } /** * @internal */ - _cacheFloat3(uniformName, x, y, z) { - let cache = this._valueCache[uniformName]; - if (!cache || cache.length !== 3) { - cache = [x, y, z]; - this._valueCache[uniformName] = cache; - return true; + _releaseTexture(texture) { + var _a; + this._deleteTexture((_a = texture._hardwareTexture) == null ? void 0 : _a.underlyingResource); + this.unbindAllTextures(); + const index = this._internalTexturesCache.indexOf(texture); + if (index !== -1) { + this._internalTexturesCache.splice(index, 1); } - let changed = false; - if (cache[0] !== x) { - cache[0] = x; - changed = true; + if (texture._lodTextureHigh) { + texture._lodTextureHigh.dispose(); } - if (cache[1] !== y) { - cache[1] = y; - changed = true; + if (texture._lodTextureMid) { + texture._lodTextureMid.dispose(); } - if (cache[2] !== z) { - cache[2] = z; - changed = true; + if (texture._lodTextureLow) { + texture._lodTextureLow.dispose(); + } + if (texture._irradianceTexture) { + texture._irradianceTexture.dispose(); } - return changed; } /** * @internal */ - _cacheFloat4(uniformName, x, y, z, w) { - let cache = this._valueCache[uniformName]; - if (!cache || cache.length !== 4) { - cache = [x, y, z, w]; - this._valueCache[uniformName] = cache; - return true; - } - let changed = false; - if (cache[0] !== x) { - cache[0] = x; - changed = true; - } - if (cache[1] !== y) { - cache[1] = y; - changed = true; - } - if (cache[2] !== z) { - cache[2] = z; - changed = true; - } - if (cache[3] !== w) { - cache[3] = w; - changed = true; + _releaseRenderTargetWrapper(rtWrapper) { + const index = this._renderTargetWrapperCache.indexOf(rtWrapper); + if (index !== -1) { + this._renderTargetWrapperCache.splice(index, 1); } - return changed; } - /** - * Sets an integer value on a uniform variable. - * @param uniformName Name of the variable. - * @param value Value to be set. - */ - setInt(uniformName, value) { - const cache = this._valueCache[uniformName]; - if (cache !== void 0 && cache === value) { - return; + _deleteTexture(texture) { + if (texture) { + this._gl.deleteTexture(texture); } - if (this.engine.setInt(this._uniforms[uniformName], value)) { - this._valueCache[uniformName] = value; + } + _setProgram(program) { + if (this._currentProgram !== program) { + this._gl.useProgram(program); + this._currentProgram = program; } } /** - * Sets a int2 on a uniform variable. - * @param uniformName Name of the variable. - * @param x First int in int2. - * @param y Second int in int2. + * Binds an effect to the webGL context + * @param effect defines the effect to bind */ - setInt2(uniformName, x, y) { - if (this._cacheFloat2(uniformName, x, y)) { - if (!this.engine.setInt2(this._uniforms[uniformName], x, y)) { - this._valueCache[uniformName] = null; + bindSamplers(effect) { + const webGLPipelineContext = effect.getPipelineContext(); + this._setProgram(webGLPipelineContext.program); + const samplers = effect.getSamplers(); + for (let index = 0; index < samplers.length; index++) { + const uniform = effect.getUniform(samplers[index]); + if (uniform) { + this._boundUniforms[index] = uniform; } } + this._currentEffect = null; } - /** - * Sets a int3 on a uniform variable. - * @param uniformName Name of the variable. - * @param x First int in int3. - * @param y Second int in int3. - * @param z Third int in int3. - */ - setInt3(uniformName, x, y, z) { - if (this._cacheFloat3(uniformName, x, y, z)) { - if (!this.engine.setInt3(this._uniforms[uniformName], x, y, z)) { - this._valueCache[uniformName] = null; - } + _activateCurrentTexture() { + if (this._currentTextureChannel !== this._activeChannel) { + this._gl.activeTexture(this._gl.TEXTURE0 + this._activeChannel); + this._currentTextureChannel = this._activeChannel; } } /** - * Sets a int4 on a uniform variable. - * @param uniformName Name of the variable. - * @param x First int in int4. - * @param y Second int in int4. - * @param z Third int in int4. - * @param w Fourth int in int4. + * @internal */ - setInt4(uniformName, x, y, z, w) { - if (this._cacheFloat4(uniformName, x, y, z, w)) { - if (!this.engine.setInt4(this._uniforms[uniformName], x, y, z, w)) { - this._valueCache[uniformName] = null; + _bindTextureDirectly(target, texture, forTextureDataUpdate = false, force = false) { + var _a; + let wasPreviouslyBound = false; + const isTextureForRendering = texture && texture._associatedChannel > -1; + if (forTextureDataUpdate && isTextureForRendering) { + this._activeChannel = texture._associatedChannel; + } + const currentTextureBound = this._boundTexturesCache[this._activeChannel]; + if (currentTextureBound !== texture || force) { + this._activateCurrentTexture(); + if (texture && texture.isMultiview) { + Logger.Error(["_bindTextureDirectly called with a multiview texture!", target, texture]); + throw "_bindTextureDirectly called with a multiview texture!"; + } else { + this._gl.bindTexture(target, ((_a = texture == null ? void 0 : texture._hardwareTexture) == null ? void 0 : _a.underlyingResource) ?? null); + } + this._boundTexturesCache[this._activeChannel] = texture; + if (texture) { + texture._associatedChannel = this._activeChannel; } + } else if (forTextureDataUpdate) { + wasPreviouslyBound = true; + this._activateCurrentTexture(); } + if (isTextureForRendering && !forTextureDataUpdate) { + this._bindSamplerUniformToChannel(texture._associatedChannel, this._activeChannel); + } + return wasPreviouslyBound; } /** - * Sets an int array on a uniform variable. - * @param uniformName Name of the variable. - * @param array array to be set. - */ - setIntArray(uniformName, array) { - this._valueCache[uniformName] = null; - this.engine.setIntArray(this._uniforms[uniformName], array); - } - /** - * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. + * @internal */ - setIntArray2(uniformName, array) { - this._valueCache[uniformName] = null; - this.engine.setIntArray2(this._uniforms[uniformName], array); + _bindTexture(channel, texture, name69) { + if (channel === void 0) { + return; + } + if (texture) { + texture._associatedChannel = channel; + } + this._activeChannel = channel; + const target = texture ? this._getTextureTarget(texture) : this._gl.TEXTURE_2D; + this._bindTextureDirectly(target, texture); } /** - * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. + * Unbind all textures from the webGL context */ - setIntArray3(uniformName, array) { - this._valueCache[uniformName] = null; - this.engine.setIntArray3(this._uniforms[uniformName], array); + unbindAllTextures() { + for (let channel = 0; channel < this._maxSimultaneousTextures; channel++) { + this._activeChannel = channel; + this._bindTextureDirectly(this._gl.TEXTURE_2D, null); + this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null); + if (this.webGLVersion > 1) { + this._bindTextureDirectly(this._gl.TEXTURE_3D, null); + this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null); + } + } } /** - * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. + * Sets a texture to the according uniform. + * @param channel The texture channel + * @param uniform The uniform to set + * @param texture The texture to apply + * @param name The name of the uniform in the effect */ - setIntArray4(uniformName, array) { - this._valueCache[uniformName] = null; - this.engine.setIntArray4(this._uniforms[uniformName], array); + setTexture(channel, uniform, texture, name69) { + if (channel === void 0) { + return; + } + if (uniform) { + this._boundUniforms[channel] = uniform; + } + this._setTexture(channel, texture); } - /** - * Sets an unsigned integer value on a uniform variable. - * @param uniformName Name of the variable. - * @param value Value to be set. - */ - setUInt(uniformName, value) { - const cache = this._valueCache[uniformName]; - if (cache !== void 0 && cache === value) { + _bindSamplerUniformToChannel(sourceSlot, destination) { + const uniform = this._boundUniforms[sourceSlot]; + if (!uniform || uniform._currentState === destination) { return; } - if (this.engine.setUInt(this._uniforms[uniformName], value)) { - this._valueCache[uniformName] = value; + this._gl.uniform1i(uniform, destination); + uniform._currentState = destination; + } + _getTextureWrapMode(mode) { + switch (mode) { + case 1: + return this._gl.REPEAT; + case 0: + return this._gl.CLAMP_TO_EDGE; + case 2: + return this._gl.MIRRORED_REPEAT; } + return this._gl.REPEAT; } - /** - * Sets an unsigned int2 value on a uniform variable. - * @param uniformName Name of the variable. - * @param x First unsigned int in uint2. - * @param y Second unsigned int in uint2. - */ - setUInt2(uniformName, x, y) { - if (this._cacheFloat2(uniformName, x, y)) { - if (!this.engine.setUInt2(this._uniforms[uniformName], x, y)) { - this._valueCache[uniformName] = null; + _setTexture(channel, texture, isPartOfTextureArray = false, depthStencilTexture = false, name69 = "") { + if (!texture) { + if (this._boundTexturesCache[channel] != null) { + this._activeChannel = channel; + this._bindTextureDirectly(this._gl.TEXTURE_2D, null); + this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null); + if (this.webGLVersion > 1) { + this._bindTextureDirectly(this._gl.TEXTURE_3D, null); + this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null); + } } + return false; } - } - /** - * Sets an unsigned int3 value on a uniform variable. - * @param uniformName Name of the variable. - * @param x First unsigned int in uint3. - * @param y Second unsigned int in uint3. - * @param z Third unsigned int in uint3. - */ - setUInt3(uniformName, x, y, z) { - if (this._cacheFloat3(uniformName, x, y, z)) { - if (!this.engine.setUInt3(this._uniforms[uniformName], x, y, z)) { - this._valueCache[uniformName] = null; + if (texture.video) { + this._activeChannel = channel; + const videoInternalTexture = texture.getInternalTexture(); + if (videoInternalTexture) { + videoInternalTexture._associatedChannel = channel; + } + texture.update(); + } else if (texture.delayLoadState === 4) { + texture.delayLoad(); + return false; + } + let internalTexture; + if (depthStencilTexture) { + internalTexture = texture.depthStencilTexture; + } else if (texture.isReady()) { + internalTexture = texture.getInternalTexture(); + } else if (texture.isCube) { + internalTexture = this.emptyCubeTexture; + } else if (texture.is3D) { + internalTexture = this.emptyTexture3D; + } else if (texture.is2DArray) { + internalTexture = this.emptyTexture2DArray; + } else { + internalTexture = this.emptyTexture; + } + if (!isPartOfTextureArray && internalTexture) { + internalTexture._associatedChannel = channel; + } + let needToBind = true; + if (this._boundTexturesCache[channel] === internalTexture) { + if (!isPartOfTextureArray) { + this._bindSamplerUniformToChannel(internalTexture._associatedChannel, channel); + } + needToBind = false; + } + this._activeChannel = channel; + const target = this._getTextureTarget(internalTexture); + if (needToBind) { + this._bindTextureDirectly(target, internalTexture, isPartOfTextureArray); + } + if (internalTexture && !internalTexture.isMultiview) { + if (internalTexture.isCube && internalTexture._cachedCoordinatesMode !== texture.coordinatesMode) { + internalTexture._cachedCoordinatesMode = texture.coordinatesMode; + const textureWrapMode = texture.coordinatesMode !== 3 && texture.coordinatesMode !== 5 ? 1 : 0; + texture.wrapU = textureWrapMode; + texture.wrapV = textureWrapMode; + } + if (internalTexture._cachedWrapU !== texture.wrapU) { + internalTexture._cachedWrapU = texture.wrapU; + this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(texture.wrapU), internalTexture); + } + if (internalTexture._cachedWrapV !== texture.wrapV) { + internalTexture._cachedWrapV = texture.wrapV; + this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(texture.wrapV), internalTexture); } + if (internalTexture.is3D && internalTexture._cachedWrapR !== texture.wrapR) { + internalTexture._cachedWrapR = texture.wrapR; + this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(texture.wrapR), internalTexture); + } + this._setAnisotropicLevel(target, internalTexture, texture.anisotropicFilteringLevel); } + return true; } /** - * Sets an unsigned int4 value on a uniform variable. - * @param uniformName Name of the variable. - * @param x First unsigned int in uint4. - * @param y Second unsigned int in uint4. - * @param z Third unsigned int in uint4. - * @param w Fourth unsigned int in uint4. + * Sets an array of texture to the webGL context + * @param channel defines the channel where the texture array must be set + * @param uniform defines the associated uniform location + * @param textures defines the array of textures to bind + * @param name name of the channel */ - setUInt4(uniformName, x, y, z, w) { - if (this._cacheFloat4(uniformName, x, y, z, w)) { - if (!this.engine.setUInt4(this._uniforms[uniformName], x, y, z, w)) { - this._valueCache[uniformName] = null; + setTextureArray(channel, uniform, textures, name69) { + if (channel === void 0 || !uniform) { + return; + } + if (!this._textureUnits || this._textureUnits.length !== textures.length) { + this._textureUnits = new Int32Array(textures.length); + } + for (let i = 0; i < textures.length; i++) { + const texture = textures[i].getInternalTexture(); + if (texture) { + this._textureUnits[i] = channel + i; + texture._associatedChannel = channel + i; + } else { + this._textureUnits[i] = -1; } } + this._gl.uniform1iv(uniform, this._textureUnits); + for (let index = 0; index < textures.length; index++) { + this._setTexture(this._textureUnits[index], textures[index], true); + } } /** - * Sets an unsigned int array on a uniform variable. - * @param uniformName Name of the variable. - * @param array array to be set. + * @internal */ - setUIntArray(uniformName, array) { - this._valueCache[uniformName] = null; - this.engine.setUIntArray(this._uniforms[uniformName], array); + _setAnisotropicLevel(target, internalTexture, anisotropicFilteringLevel) { + const anisotropicFilterExtension = this._caps.textureAnisotropicFilterExtension; + if (internalTexture.samplingMode !== 11 && internalTexture.samplingMode !== 3 && internalTexture.samplingMode !== 2) { + anisotropicFilteringLevel = 1; + } + if (anisotropicFilterExtension && internalTexture._cachedAnisotropicFilteringLevel !== anisotropicFilteringLevel) { + this._setTextureParameterFloat(target, anisotropicFilterExtension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(anisotropicFilteringLevel, this._caps.maxAnisotropy), internalTexture); + internalTexture._cachedAnisotropicFilteringLevel = anisotropicFilteringLevel; + } } - /** - * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - */ - setUIntArray2(uniformName, array) { - this._valueCache[uniformName] = null; - this.engine.setUIntArray2(this._uniforms[uniformName], array); + _setTextureParameterFloat(target, parameter, value, texture) { + this._bindTextureDirectly(target, texture, true, true); + this._gl.texParameterf(target, parameter, value); } - /** - * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. - */ - setUIntArray3(uniformName, array) { - this._valueCache[uniformName] = null; - this.engine.setUIntArray3(this._uniforms[uniformName], array); + _setTextureParameterInteger(target, parameter, value, texture) { + if (texture) { + this._bindTextureDirectly(target, texture, true, true); + } + this._gl.texParameteri(target, parameter, value); } /** - * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. + * Unbind all vertex attributes from the webGL context */ - setUIntArray4(uniformName, array) { - this._valueCache[uniformName] = null; - this.engine.setUIntArray4(this._uniforms[uniformName], array); + unbindAllAttributes() { + if (this._mustWipeVertexAttributes) { + this._mustWipeVertexAttributes = false; + for (let i = 0; i < this._caps.maxVertexAttribs; i++) { + this.disableAttributeByIndex(i); + } + return; + } + for (let i = 0, ul = this._vertexAttribArraysEnabled.length; i < ul; i++) { + if (i >= this._caps.maxVertexAttribs || !this._vertexAttribArraysEnabled[i]) { + continue; + } + this.disableAttributeByIndex(i); + } } /** - * Sets an array on a uniform variable. - * @param uniformName Name of the variable. - * @param array array to be set. + * Force the engine to release all cached effects. This means that next effect compilation will have to be done completely even if a similar effect was already compiled */ - setArray(uniformName, array) { - this._valueCache[uniformName] = null; - this.engine.setArray(this._uniforms[uniformName], array); + releaseEffects() { + for (const name69 in this._compiledEffects) { + const webGLPipelineContext = this._compiledEffects[name69].getPipelineContext(); + this._deletePipelineContext(webGLPipelineContext); + } + this._compiledEffects = {}; } /** - * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. + * Dispose and release all associated resources */ - setArray2(uniformName, array) { - this._valueCache[uniformName] = null; - this.engine.setArray2(this._uniforms[uniformName], array); + dispose() { + var _a, _b; + this._isDisposed = true; + this.stopRenderLoop(); + if (this.onBeforeTextureInitObservable) { + this.onBeforeTextureInitObservable.clear(); + } + if (this._emptyTexture) { + this._releaseTexture(this._emptyTexture); + this._emptyTexture = null; + } + if (this._emptyCubeTexture) { + this._releaseTexture(this._emptyCubeTexture); + this._emptyCubeTexture = null; + } + if (this._dummyFramebuffer) { + this._gl.deleteFramebuffer(this._dummyFramebuffer); + } + this.releaseEffects(); + (_a = this.releaseComputeEffects) == null ? void 0 : _a.call(this); + this.unbindAllAttributes(); + this._boundUniforms = {}; + if (IsWindowObjectExist()) { + if (this._renderingCanvas) { + if (!this._doNotHandleContextLost) { + this._renderingCanvas.removeEventListener("webglcontextlost", this._onContextLost); + this._renderingCanvas.removeEventListener("webglcontextrestored", this._onContextRestored); + } + window.removeEventListener("resize", this._checkForMobile); + } + } + this._workingCanvas = null; + this._workingContext = null; + this._currentBufferPointers.length = 0; + this._renderingCanvas = null; + this._currentProgram = null; + this._boundRenderFunction = null; + Effect.ResetCache(); + for (const request of this._activeRequests) { + request.abort(); + } + this.onDisposeObservable.notifyObservers(this); + this.onDisposeObservable.clear(); + if (this._creationOptions.loseContextOnDispose) { + (_b = this._gl.getExtension("WEBGL_lose_context")) == null ? void 0 : _b.loseContext(); + } } /** - * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. + * Attach a new callback raised when context lost event is fired + * @param callback defines the callback to call */ - setArray3(uniformName, array) { - this._valueCache[uniformName] = null; - this.engine.setArray3(this._uniforms[uniformName], array); + attachContextLostEvent(callback) { + if (this._renderingCanvas) { + this._renderingCanvas.addEventListener("webglcontextlost", callback, false); + } } /** - * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader) - * @param uniformName Name of the variable. - * @param array array to be set. + * Attach a new callback raised when context restored event is fired + * @param callback defines the callback to call */ - setArray4(uniformName, array) { - this._valueCache[uniformName] = null; - this.engine.setArray4(this._uniforms[uniformName], array); + attachContextRestoredEvent(callback) { + if (this._renderingCanvas) { + this._renderingCanvas.addEventListener("webglcontextrestored", callback, false); + } } /** - * Sets matrices on a uniform variable. - * @param uniformName Name of the variable. - * @param matrices matrices to be set. + * Get the current error code of the webGL context + * @returns the error code + * @see https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError */ - setMatrices(uniformName, matrices) { - if (!matrices) { - return; + getError() { + return this._gl.getError(); + } + _canRenderToFloatFramebuffer() { + if (this._webGLVersion > 1) { + return this._caps.colorBufferFloat; } - this._valueCache[uniformName] = null; - this.engine.setMatrices(this._uniforms[uniformName], matrices); + return this._canRenderToFramebuffer(1); } - /** - * Sets matrix on a uniform variable. - * @param uniformName Name of the variable. - * @param matrix matrix to be set. - */ - setMatrix(uniformName, matrix) { - if (this._cacheMatrix(uniformName, matrix)) { - if (!this.engine.setMatrices(this._uniforms[uniformName], matrix.asArray())) { - this._valueCache[uniformName] = null; - } + _canRenderToHalfFloatFramebuffer() { + if (this._webGLVersion > 1) { + return this._caps.colorBufferFloat; } + return this._canRenderToFramebuffer(2); } - /** - * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix) - * @param uniformName Name of the variable. - * @param matrix matrix to be set. - */ - setMatrix3x3(uniformName, matrix) { - this._valueCache[uniformName] = null; - this.engine.setMatrix3x3(this._uniforms[uniformName], matrix); - } - /** - * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix) - * @param uniformName Name of the variable. - * @param matrix matrix to be set. - */ - setMatrix2x2(uniformName, matrix) { - this._valueCache[uniformName] = null; - this.engine.setMatrix2x2(this._uniforms[uniformName], matrix); - } - /** - * Sets a float on a uniform variable. - * @param uniformName Name of the variable. - * @param value value to be set. - */ - setFloat(uniformName, value) { - const cache = this._valueCache[uniformName]; - if (cache !== void 0 && cache === value) { - return; + // Thank you : http://stackoverflow.com/questions/28827511/webgl-ios-render-to-floating-point-texture + _canRenderToFramebuffer(type) { + const gl = this._gl; + while (gl.getError() !== gl.NO_ERROR) { } - if (this.engine.setFloat(this._uniforms[uniformName], value)) { - this._valueCache[uniformName] = value; + let successful = true; + const texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.texImage2D(gl.TEXTURE_2D, 0, this._getRGBABufferInternalSizedFormat(type), 1, 1, 0, gl.RGBA, this._getWebGLTextureType(type), null); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + const fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + successful = successful && status === gl.FRAMEBUFFER_COMPLETE; + successful = successful && gl.getError() === gl.NO_ERROR; + if (successful) { + gl.clear(gl.COLOR_BUFFER_BIT); + successful = successful && gl.getError() === gl.NO_ERROR; + } + if (successful) { + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + const readFormat = gl.RGBA; + const readType = gl.UNSIGNED_BYTE; + const buffer = new Uint8Array(4); + gl.readPixels(0, 0, 1, 1, readFormat, readType, buffer); + successful = successful && gl.getError() === gl.NO_ERROR; + } + gl.deleteTexture(texture); + gl.deleteFramebuffer(fb); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + while (!successful && gl.getError() !== gl.NO_ERROR) { } + return successful; } /** - * Sets a Vector2 on a uniform variable. - * @param uniformName Name of the variable. - * @param vector2 vector2 to be set. + * @internal */ - setVector2(uniformName, vector2) { - if (this._cacheFloat2(uniformName, vector2.x, vector2.y)) { - if (!this.engine.setFloat2(this._uniforms[uniformName], vector2.x, vector2.y)) { - this._valueCache[uniformName] = null; + _getWebGLTextureType(type) { + if (this._webGLVersion === 1) { + switch (type) { + case 1: + return this._gl.FLOAT; + case 2: + return this._gl.HALF_FLOAT_OES; + case 0: + return this._gl.UNSIGNED_BYTE; + case 8: + return this._gl.UNSIGNED_SHORT_4_4_4_4; + case 9: + return this._gl.UNSIGNED_SHORT_5_5_5_1; + case 10: + return this._gl.UNSIGNED_SHORT_5_6_5; } + return this._gl.UNSIGNED_BYTE; + } + switch (type) { + case 3: + return this._gl.BYTE; + case 0: + return this._gl.UNSIGNED_BYTE; + case 4: + return this._gl.SHORT; + case 5: + return this._gl.UNSIGNED_SHORT; + case 6: + return this._gl.INT; + case 7: + return this._gl.UNSIGNED_INT; + case 1: + return this._gl.FLOAT; + case 2: + return this._gl.HALF_FLOAT; + case 8: + return this._gl.UNSIGNED_SHORT_4_4_4_4; + case 9: + return this._gl.UNSIGNED_SHORT_5_5_5_1; + case 10: + return this._gl.UNSIGNED_SHORT_5_6_5; + case 11: + return this._gl.UNSIGNED_INT_2_10_10_10_REV; + case 12: + return this._gl.UNSIGNED_INT_24_8; + case 13: + return this._gl.UNSIGNED_INT_10F_11F_11F_REV; + case 14: + return this._gl.UNSIGNED_INT_5_9_9_9_REV; + case 15: + return this._gl.FLOAT_32_UNSIGNED_INT_24_8_REV; } + return this._gl.UNSIGNED_BYTE; } /** - * Sets a float2 on a uniform variable. - * @param uniformName Name of the variable. - * @param x First float in float2. - * @param y Second float in float2. + * @internal */ - setFloat2(uniformName, x, y) { - if (this._cacheFloat2(uniformName, x, y)) { - if (!this.engine.setFloat2(this._uniforms[uniformName], x, y)) { - this._valueCache[uniformName] = null; + _getInternalFormat(format, useSRGBBuffer = false) { + let internalFormat = useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA; + switch (format) { + case 0: + internalFormat = this._gl.ALPHA; + break; + case 1: + internalFormat = this._gl.LUMINANCE; + break; + case 2: + internalFormat = this._gl.LUMINANCE_ALPHA; + break; + case 6: + internalFormat = this._gl.RED; + break; + case 7: + internalFormat = this._gl.RG; + break; + case 4: + internalFormat = useSRGBBuffer ? this._glSRGBExtensionValues.SRGB : this._gl.RGB; + break; + case 5: + internalFormat = useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA; + break; + } + if (this._webGLVersion > 1) { + switch (format) { + case 8: + internalFormat = this._gl.RED_INTEGER; + break; + case 9: + internalFormat = this._gl.RG_INTEGER; + break; + case 10: + internalFormat = this._gl.RGB_INTEGER; + break; + case 11: + internalFormat = this._gl.RGBA_INTEGER; + break; } } + return internalFormat; } /** - * Sets a Vector3 on a uniform variable. - * @param uniformName Name of the variable. - * @param vector3 Value to be set. + * @internal */ - setVector3(uniformName, vector3) { - if (this._cacheFloat3(uniformName, vector3.x, vector3.y, vector3.z)) { - if (!this.engine.setFloat3(this._uniforms[uniformName], vector3.x, vector3.y, vector3.z)) { - this._valueCache[uniformName] = null; + _getRGBABufferInternalSizedFormat(type, format, useSRGBBuffer = false) { + if (this._webGLVersion === 1) { + if (format !== void 0) { + switch (format) { + case 0: + return this._gl.ALPHA; + case 1: + return this._gl.LUMINANCE; + case 2: + return this._gl.LUMINANCE_ALPHA; + case 4: + return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB : this._gl.RGB; + } } + return this._gl.RGBA; + } + switch (type) { + case 3: + switch (format) { + case 6: + return this._gl.R8_SNORM; + case 7: + return this._gl.RG8_SNORM; + case 4: + return this._gl.RGB8_SNORM; + case 8: + return this._gl.R8I; + case 9: + return this._gl.RG8I; + case 10: + return this._gl.RGB8I; + case 11: + return this._gl.RGBA8I; + default: + return this._gl.RGBA8_SNORM; + } + case 0: + switch (format) { + case 6: + return this._gl.R8; + case 7: + return this._gl.RG8; + case 4: + return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8 : this._gl.RGB8; + case 5: + return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA8; + case 8: + return this._gl.R8UI; + case 9: + return this._gl.RG8UI; + case 10: + return this._gl.RGB8UI; + case 11: + return this._gl.RGBA8UI; + case 0: + return this._gl.ALPHA; + case 1: + return this._gl.LUMINANCE; + case 2: + return this._gl.LUMINANCE_ALPHA; + default: + return this._gl.RGBA8; + } + case 4: + switch (format) { + case 8: + return this._gl.R16I; + case 9: + return this._gl.RG16I; + case 10: + return this._gl.RGB16I; + case 11: + return this._gl.RGBA16I; + default: + return this._gl.RGBA16I; + } + case 5: + switch (format) { + case 8: + return this._gl.R16UI; + case 9: + return this._gl.RG16UI; + case 10: + return this._gl.RGB16UI; + case 11: + return this._gl.RGBA16UI; + default: + return this._gl.RGBA16UI; + } + case 6: + switch (format) { + case 8: + return this._gl.R32I; + case 9: + return this._gl.RG32I; + case 10: + return this._gl.RGB32I; + case 11: + return this._gl.RGBA32I; + default: + return this._gl.RGBA32I; + } + case 7: + switch (format) { + case 8: + return this._gl.R32UI; + case 9: + return this._gl.RG32UI; + case 10: + return this._gl.RGB32UI; + case 11: + return this._gl.RGBA32UI; + default: + return this._gl.RGBA32UI; + } + case 1: + switch (format) { + case 6: + return this._gl.R32F; + case 7: + return this._gl.RG32F; + case 4: + return this._gl.RGB32F; + case 5: + return this._gl.RGBA32F; + default: + return this._gl.RGBA32F; + } + case 2: + switch (format) { + case 6: + return this._gl.R16F; + case 7: + return this._gl.RG16F; + case 4: + return this._gl.RGB16F; + case 5: + return this._gl.RGBA16F; + default: + return this._gl.RGBA16F; + } + case 10: + return this._gl.RGB565; + case 13: + return this._gl.R11F_G11F_B10F; + case 14: + return this._gl.RGB9_E5; + case 8: + return this._gl.RGBA4; + case 9: + return this._gl.RGB5_A1; + case 11: + switch (format) { + case 5: + return this._gl.RGB10_A2; + case 11: + return this._gl.RGB10_A2UI; + default: + return this._gl.RGB10_A2; + } } + return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA8; } /** - * Sets a float3 on a uniform variable. - * @param uniformName Name of the variable. - * @param x First float in float3. - * @param y Second float in float3. - * @param z Third float in float3. + * @internal */ - setFloat3(uniformName, x, y, z) { - if (this._cacheFloat3(uniformName, x, y, z)) { - if (!this.engine.setFloat3(this._uniforms[uniformName], x, y, z)) { - this._valueCache[uniformName] = null; - } - } + _loadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError) { + const request = _ThinEngine._FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError); + this._activeRequests.push(request); + request.onCompleteObservable.add((request2) => { + this._activeRequests.splice(this._activeRequests.indexOf(request2), 1); + }); + return request; } /** - * Sets a Vector4 on a uniform variable. - * @param uniformName Name of the variable. - * @param vector4 Value to be set. + * Loads a file from a url + * @param url url to load + * @param onSuccess callback called when the file successfully loads + * @param onProgress callback called while file is loading (if the server supports this mode) + * @param offlineProvider defines the offline provider for caching + * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer + * @param onError callback called when the file fails to load + * @returns a file request object + * @internal */ - setVector4(uniformName, vector4) { - if (this._cacheFloat4(uniformName, vector4.x, vector4.y, vector4.z, vector4.w)) { - if (!this.engine.setFloat4(this._uniforms[uniformName], vector4.x, vector4.y, vector4.z, vector4.w)) { - this._valueCache[uniformName] = null; - } - } + static _FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError) { + throw _WarnImport("FileTools"); } /** - * Sets a Quaternion on a uniform variable. - * @param uniformName Name of the variable. - * @param quaternion Value to be set. + * Reads pixels from the current frame buffer. Please note that this function can be slow + * @param x defines the x coordinate of the rectangle where pixels must be read + * @param y defines the y coordinate of the rectangle where pixels must be read + * @param width defines the width of the rectangle where pixels must be read + * @param height defines the height of the rectangle where pixels must be read + * @param hasAlpha defines whether the output should have alpha or not (defaults to true) + * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels + * @returns a ArrayBufferView promise (Uint8Array) containing RGBA colors */ - setQuaternion(uniformName, quaternion) { - if (this._cacheFloat4(uniformName, quaternion.x, quaternion.y, quaternion.z, quaternion.w)) { - if (!this.engine.setFloat4(this._uniforms[uniformName], quaternion.x, quaternion.y, quaternion.z, quaternion.w)) { - this._valueCache[uniformName] = null; - } + readPixels(x, y, width, height, hasAlpha = true, flushRenderer = true) { + const numChannels = hasAlpha ? 4 : 3; + const format = hasAlpha ? this._gl.RGBA : this._gl.RGB; + const data = new Uint8Array(height * width * numChannels); + if (flushRenderer) { + this.flushFramebuffer(); } + this._gl.readPixels(x, y, width, height, format, this._gl.UNSIGNED_BYTE, data); + return Promise.resolve(data); } /** - * Sets a float4 on a uniform variable. - * @param uniformName Name of the variable. - * @param x First float in float4. - * @param y Second float in float4. - * @param z Third float in float4. - * @param w Fourth float in float4. + * Gets a Promise indicating if the engine can be instantiated (ie. if a webGL context can be found) */ - setFloat4(uniformName, x, y, z, w) { - if (this._cacheFloat4(uniformName, x, y, z, w)) { - if (!this.engine.setFloat4(this._uniforms[uniformName], x, y, z, w)) { - this._valueCache[uniformName] = null; - } - } + static get IsSupportedAsync() { + return Promise.resolve(this.isSupported()); } /** - * Sets a Color3 on a uniform variable. - * @param uniformName Name of the variable. - * @param color3 Value to be set. + * Gets a boolean indicating if the engine can be instantiated (ie. if a webGL context can be found) */ - setColor3(uniformName, color3) { - if (this._cacheFloat3(uniformName, color3.r, color3.g, color3.b)) { - if (!this.engine.setFloat3(this._uniforms[uniformName], color3.r, color3.g, color3.b)) { - this._valueCache[uniformName] = null; - } - } + static get IsSupported() { + return this.isSupported(); } /** - * Sets a Color4 on a uniform variable. - * @param uniformName Name of the variable. - * @param color3 Value to be set. - * @param alpha Alpha value to be set. + * Gets a boolean indicating if the engine can be instantiated (ie. if a webGL context can be found) + * @returns true if the engine can be created + * @ignorenaming */ - setColor4(uniformName, color3, alpha) { - if (this._cacheFloat4(uniformName, color3.r, color3.g, color3.b, alpha)) { - if (!this.engine.setFloat4(this._uniforms[uniformName], color3.r, color3.g, color3.b, alpha)) { - this._valueCache[uniformName] = null; + // eslint-disable-next-line @typescript-eslint/naming-convention + static isSupported() { + if (this._HasMajorPerformanceCaveat !== null) { + return !this._HasMajorPerformanceCaveat; + } + if (this._IsSupported === null) { + try { + const tempcanvas = this._CreateCanvas(1, 1); + const gl = tempcanvas.getContext("webgl") || tempcanvas.getContext("experimental-webgl"); + this._IsSupported = gl != null && !!window.WebGLRenderingContext; + } catch (e) { + this._IsSupported = false; } } + return this._IsSupported; } /** - * Sets a Color4 on a uniform variable - * @param uniformName defines the name of the variable - * @param color4 defines the value to be set + * Gets a boolean indicating if the engine can be instantiated on a performant device (ie. if a webGL context can be found and it does not use a slow implementation) */ - setDirectColor4(uniformName, color4) { - if (this._cacheFloat4(uniformName, color4.r, color4.g, color4.b, color4.a)) { - if (!this.engine.setFloat4(this._uniforms[uniformName], color4.r, color4.g, color4.b, color4.a)) { - this._valueCache[uniformName] = null; + static get HasMajorPerformanceCaveat() { + if (this._HasMajorPerformanceCaveat === null) { + try { + const tempcanvas = this._CreateCanvas(1, 1); + const gl = tempcanvas.getContext("webgl", { failIfMajorPerformanceCaveat: true }) || tempcanvas.getContext("experimental-webgl", { failIfMajorPerformanceCaveat: true }); + this._HasMajorPerformanceCaveat = !gl; + } catch (e) { + this._HasMajorPerformanceCaveat = false; } } + return this._HasMajorPerformanceCaveat; } - _getVertexShaderCode() { - return this.vertexShader ? this.engine._getShaderSource(this.vertexShader) : null; + /** + * Find the next highest power of two. + * @param x Number to start search from. + * @returns Next highest power of two. + */ + static CeilingPOT(x) { + x--; + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + x++; + return x; } - _getFragmentShaderCode() { - return this.fragmentShader ? this.engine._getShaderSource(this.fragmentShader) : null; + /** + * Find the next lowest power of two. + * @param x Number to start search from. + * @returns Next lowest power of two. + */ + static FloorPOT(x) { + x = x | x >> 1; + x = x | x >> 2; + x = x | x >> 4; + x = x | x >> 8; + x = x | x >> 16; + return x - (x >> 1); } -}; - -// node_modules/@babylonjs/core/Engines/WebGL/webGLHardwareTexture.js -var WebGLHardwareTexture = class { - get underlyingResource() { - return this._webGLTexture; + /** + * Find the nearest power of two. + * @param x Number to start search from. + * @returns Next nearest power of two. + */ + static NearestPOT(x) { + const c = _ThinEngine.CeilingPOT(x); + const f = _ThinEngine.FloorPOT(x); + return c - x > x - f ? f : c; } - constructor(existingTexture = null, context) { - this._MSAARenderBuffers = null; - this._context = context; - if (!existingTexture) { - existingTexture = context.createTexture(); - if (!existingTexture) { - throw new Error("Unable to create webGL texture"); - } - } - this.set(existingTexture); - } - setUsage() { - } - set(hardwareTexture) { - this._webGLTexture = hardwareTexture; - } - reset() { - this._webGLTexture = null; - this._MSAARenderBuffers = null; - } - addMSAARenderBuffer(buffer) { - if (!this._MSAARenderBuffers) { - this._MSAARenderBuffers = []; + /** + * Get the closest exponent of two + * @param value defines the value to approximate + * @param max defines the maximum value to return + * @param mode defines how to define the closest value + * @returns closest exponent of two of the given value + */ + static GetExponentOfTwo(value, max, mode = 2) { + let pot; + switch (mode) { + case 1: + pot = _ThinEngine.FloorPOT(value); + break; + case 2: + pot = _ThinEngine.NearestPOT(value); + break; + case 3: + default: + pot = _ThinEngine.CeilingPOT(value); + break; } - this._MSAARenderBuffers.push(buffer); + return Math.min(pot, max); } - releaseMSAARenderBuffers() { - if (this._MSAARenderBuffers) { - for (const buffer of this._MSAARenderBuffers) { - this._context.deleteRenderbuffer(buffer); + /** + * Queue a new function into the requested animation frame pool (ie. this function will be executed by the browser (or the javascript engine) for the next frame) + * @param func - the function to be called + * @param requester - the object that will request the next frame. Falls back to window. + * @returns frame number + */ + static QueueNewFrame(func, requester) { + if (!IsWindowObjectExist()) { + if (typeof requestAnimationFrame === "function") { + return requestAnimationFrame(func); + } + } else { + const { requestAnimationFrame: requestAnimationFrame2 } = requester || window; + if (typeof requestAnimationFrame2 === "function") { + return requestAnimationFrame2(func); } - this._MSAARenderBuffers = null; - } - } - getMSAARenderBuffer(index = 0) { - var _a; - return ((_a = this._MSAARenderBuffers) == null ? void 0 : _a[index]) ?? null; - } - release() { - this.releaseMSAARenderBuffers(); - if (this._webGLTexture) { - this._context.deleteTexture(this._webGLTexture); - } - this.reset(); - } -}; - -// node_modules/@babylonjs/core/Materials/drawWrapper.js -var DrawWrapper = class { - static IsWrapper(effect) { - return effect.getPipelineContext === void 0; - } - static GetEffect(effect) { - return effect.getPipelineContext === void 0 ? effect.effect : effect; - } - constructor(engine, createMaterialContext = true) { - this._wasPreviouslyReady = false; - this._forceRebindOnNextCall = true; - this._wasPreviouslyUsingInstances = null; - this.effect = null; - this.defines = null; - this.drawContext = engine.createDrawContext(); - if (createMaterialContext) { - this.materialContext = engine.createMaterialContext(); } + return setTimeout(func, 16); } - setEffect(effect, defines, resetContext = true) { - var _a; - this.effect = effect; - if (defines !== void 0) { - this.defines = defines; - } - if (resetContext) { - (_a = this.drawContext) == null ? void 0 : _a.reset(); + /** + * Gets host document + * @returns the host document object + */ + getHostDocument() { + if (this._renderingCanvas && this._renderingCanvas.ownerDocument) { + return this._renderingCanvas.ownerDocument; } - } - dispose() { - var _a; - (_a = this.drawContext) == null ? void 0 : _a.dispose(); + return IsDocumentAvailable() ? document : null; } }; +ThinEngine._TempClearColorUint32 = new Uint32Array(4); +ThinEngine._TempClearColorInt32 = new Int32Array(4); +ThinEngine.ExceptionList = [ + { key: "Chrome/63.0", capture: "63\\.0\\.3239\\.(\\d+)", captureConstraint: 108, targets: ["uniformBuffer"] }, + { key: "Firefox/58", capture: null, captureConstraint: null, targets: ["uniformBuffer"] }, + { key: "Firefox/59", capture: null, captureConstraint: null, targets: ["uniformBuffer"] }, + { key: "Chrome/72.+?Mobile", capture: null, captureConstraint: null, targets: ["vao"] }, + { key: "Chrome/73.+?Mobile", capture: null, captureConstraint: null, targets: ["vao"] }, + { key: "Chrome/74.+?Mobile", capture: null, captureConstraint: null, targets: ["vao"] }, + { key: "Mac OS.+Chrome/71", capture: null, captureConstraint: null, targets: ["vao"] }, + { key: "Mac OS.+Chrome/72", capture: null, captureConstraint: null, targets: ["vao"] }, + { key: "Mac OS.+Chrome", capture: null, captureConstraint: null, targets: ["uniformBuffer"] }, + { key: "Chrome/12\\d\\..+?Mobile", capture: null, captureConstraint: null, targets: ["uniformBuffer"] }, + // desktop osx safari 15.4 + { key: ".*AppleWebKit.*(15.4).*Safari", capture: null, captureConstraint: null, targets: ["antialias", "maxMSAASamples"] }, + // mobile browsers using safari 15.4 on ios + { key: ".*(15.4).*AppleWebKit.*Safari", capture: null, captureConstraint: null, targets: ["antialias", "maxMSAASamples"] } +]; +ThinEngine._TextureLoaders = []; +ThinEngine.CollisionsEpsilon = 1e-3; +ThinEngine._IsSupported = null; +ThinEngine._HasMajorPerformanceCaveat = null; -// node_modules/@babylonjs/core/States/stencilStateComposer.js -var StencilStateComposer = class { - get isDirty() { - return this._isStencilTestDirty || this._isStencilMaskDirty || this._isStencilFuncDirty || this._isStencilOpDirty; - } - get func() { - return this._func; - } - set func(value) { - if (this._func === value) { - return; - } - this._func = value; - this._isStencilFuncDirty = true; - } - get funcRef() { - return this._funcRef; - } - set funcRef(value) { - if (this._funcRef === value) { - return; - } - this._funcRef = value; - this._isStencilFuncDirty = true; - } - get funcMask() { - return this._funcMask; - } - set funcMask(value) { - if (this._funcMask === value) { - return; - } - this._funcMask = value; - this._isStencilFuncDirty = true; - } - get opStencilFail() { - return this._opStencilFail; - } - set opStencilFail(value) { - if (this._opStencilFail === value) { - return; - } - this._opStencilFail = value; - this._isStencilOpDirty = true; - } - get opDepthFail() { - return this._opDepthFail; - } - set opDepthFail(value) { - if (this._opDepthFail === value) { - return; - } - this._opDepthFail = value; - this._isStencilOpDirty = true; - } - get opStencilDepthPass() { - return this._opStencilDepthPass; - } - set opStencilDepthPass(value) { - if (this._opStencilDepthPass === value) { - return; - } - this._opStencilDepthPass = value; - this._isStencilOpDirty = true; - } - get mask() { - return this._mask; - } - set mask(value) { - if (this._mask === value) { - return; - } - this._mask = value; - this._isStencilMaskDirty = true; - } - get enabled() { - return this._enabled; - } - set enabled(value) { - if (this._enabled === value) { - return; - } - this._enabled = value; - this._isStencilTestDirty = true; - } - constructor(reset = true) { - this._isStencilTestDirty = false; - this._isStencilMaskDirty = false; - this._isStencilFuncDirty = false; - this._isStencilOpDirty = false; - this.useStencilGlobalOnly = false; - if (reset) { - this.reset(); - } - } - reset() { - var _a; - this.stencilMaterial = void 0; - (_a = this.stencilGlobal) == null ? void 0 : _a.reset(); - this._isStencilTestDirty = true; - this._isStencilMaskDirty = true; - this._isStencilFuncDirty = true; - this._isStencilOpDirty = true; - } - apply(gl) { - var _a; - if (!gl) { - return; - } - const stencilMaterialEnabled = !this.useStencilGlobalOnly && !!((_a = this.stencilMaterial) == null ? void 0 : _a.enabled); - this.enabled = stencilMaterialEnabled ? this.stencilMaterial.enabled : this.stencilGlobal.enabled; - this.func = stencilMaterialEnabled ? this.stencilMaterial.func : this.stencilGlobal.func; - this.funcRef = stencilMaterialEnabled ? this.stencilMaterial.funcRef : this.stencilGlobal.funcRef; - this.funcMask = stencilMaterialEnabled ? this.stencilMaterial.funcMask : this.stencilGlobal.funcMask; - this.opStencilFail = stencilMaterialEnabled ? this.stencilMaterial.opStencilFail : this.stencilGlobal.opStencilFail; - this.opDepthFail = stencilMaterialEnabled ? this.stencilMaterial.opDepthFail : this.stencilGlobal.opDepthFail; - this.opStencilDepthPass = stencilMaterialEnabled ? this.stencilMaterial.opStencilDepthPass : this.stencilGlobal.opStencilDepthPass; - this.mask = stencilMaterialEnabled ? this.stencilMaterial.mask : this.stencilGlobal.mask; - if (!this.isDirty) { - return; - } - if (this._isStencilTestDirty) { - if (this.enabled) { - gl.enable(gl.STENCIL_TEST); - } else { - gl.disable(gl.STENCIL_TEST); - } - this._isStencilTestDirty = false; - } - if (this._isStencilMaskDirty) { - gl.stencilMask(this.mask); - this._isStencilMaskDirty = false; - } - if (this._isStencilFuncDirty) { - gl.stencilFunc(this.func, this.funcRef, this.funcMask); - this._isStencilFuncDirty = false; - } - if (this._isStencilOpDirty) { - gl.stencilOp(this.opStencilFail, this.opDepthFail, this.opStencilDepthPass); - this._isStencilOpDirty = false; +// node_modules/@babylonjs/core/Misc/timingTools.js +var TimingTools = class { + /** + * Polyfill for setImmediate + * @param action defines the action to execute after the current execution block + */ + static SetImmediate(action) { + if (IsWindowObjectExist() && window.setImmediate) { + window.setImmediate(action); + } else { + setTimeout(action, 1); } } }; -// node_modules/@babylonjs/core/Engines/WebGL/webGLShaderProcessors.js -var WebGLShaderProcessor = class { - constructor() { - this.shaderLanguage = ShaderLanguage.GLSL; - } - postProcessor(code, defines, isFragment, processingContext, engine) { - if (!engine.getCaps().drawBuffersExtension) { - const regex = /#extension.+GL_EXT_draw_buffers.+(enable|require)/g; - code = code.replace(regex, ""); +// node_modules/@babylonjs/core/Misc/fileTools.js +var Base64DataUrlRegEx = new RegExp(/^data:([^,]+\/[^,]+)?;base64,/i); +var LoadFileError = class _LoadFileError extends RuntimeError { + /** + * Creates a new LoadFileError + * @param message defines the message of the error + * @param object defines the optional web request + */ + constructor(message, object) { + super(message, ErrorCodes.LoadFileError); + this.name = "LoadFileError"; + BaseError._setPrototypeOf(this, _LoadFileError.prototype); + if (object instanceof WebRequest) { + this.request = object; + } else { + this.file = object; } - return code; } }; - -// node_modules/@babylonjs/core/Engines/thinEngine.js -var BufferPointer = class { -}; -var ThinEngine = class _ThinEngine { +var RequestFileError = class _RequestFileError extends RuntimeError { /** - * Returns the current npm package of the sdk + * Creates a new LoadFileError + * @param message defines the message of the error + * @param request defines the optional web request */ - // Not mixed with Version for tooling purpose. - static get NpmPackage() { - return "babylonjs@7.1.0"; + constructor(message, request) { + super(message, ErrorCodes.RequestFileError); + this.request = request; + this.name = "RequestFileError"; + BaseError._setPrototypeOf(this, _RequestFileError.prototype); } +}; +var ReadFileError = class _ReadFileError extends RuntimeError { /** - * Returns the current version of the framework + * Creates a new ReadFileError + * @param message defines the message of the error + * @param file defines the optional file */ - static get Version() { - return "7.1.0"; + constructor(message, file) { + super(message, ErrorCodes.ReadFileError); + this.file = file; + this.name = "ReadFileError"; + BaseError._setPrototypeOf(this, _ReadFileError.prototype); } +}; +var FileToolsOptions = { /** - * Returns a string describing the current engine + * Gets or sets the retry strategy to apply when an error happens while loading an asset. + * When defining this function, return the wait time before trying again or return -1 to + * stop retrying and error out. */ - get description() { - let description = this.name + this.webGLVersion; - if (this._caps.parallelShaderCompile) { - description += " - Parallel shader compilation"; - } - return description; - } + DefaultRetryStrategy: RetryStrategy.ExponentialBackoff(), /** - * Gets or sets the name of the engine + * Gets or sets the base URL to use to load assets */ - get name() { - return this._name; - } - set name(value) { - this._name = value; - } + BaseUrl: "", /** - * Returns the version of the engine + * Default behaviour for cors in the application. + * It can be a string if the expected behavior is identical in the entire app. + * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance) */ - get version() { - return this._webGLVersion; - } - get isDisposed() { - return this._isDisposed; - } + CorsBehavior: "anonymous", /** - * Gets or sets the relative url used to load shaders if using the engine in non-minified mode + * Gets or sets a function used to pre-process url before using them to load assets + * @param url + * @returns the processed url */ - static get ShadersRepository() { - return Effect.ShadersRepository; - } - static set ShadersRepository(value) { - Effect.ShadersRepository = value; - } + PreprocessUrl: (url) => url, /** - * @internal + * Gets or sets the base URL to use to load scripts + * Used for both JS and WASM */ - _getShaderProcessor(shaderLanguage) { - return this._shaderProcessor; - } + ScriptBaseUrl: "", /** - * Gets or sets a boolean indicating if depth buffer should be reverse, going from far to near. - * This can provide greater z depth for distant objects. + * Gets or sets a function used to pre-process script url before using them to load. + * Used for both JS and WASM + * @param url defines the url to process + * @returns the processed url */ - get useReverseDepthBuffer() { - return this._useReverseDepthBuffer; + ScriptPreprocessUrl: (url) => url +}; +var _CleanUrl = (url) => { + url = url.replace(/#/gm, "%23"); + return url; +}; +var SetCorsBehavior = (url, element) => { + if (url && url.indexOf("data:") === 0) { + return; } - set useReverseDepthBuffer(useReverse) { - if (useReverse === this._useReverseDepthBuffer) { - return; - } - this._useReverseDepthBuffer = useReverse; - if (useReverse) { - this._depthCullingState.depthFunc = 518; + if (FileToolsOptions.CorsBehavior) { + if (typeof FileToolsOptions.CorsBehavior === "string" || FileToolsOptions.CorsBehavior instanceof String) { + element.crossOrigin = FileToolsOptions.CorsBehavior; } else { - this._depthCullingState.depthFunc = 515; + const result = FileToolsOptions.CorsBehavior(url); + if (result) { + element.crossOrigin = result; + } } } - /** - * Gets the current frame id - */ - get frameId() { - return this._frameId; - } - /** - * Gets a boolean indicating that the engine supports uniform buffers - * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets - */ - get supportsUniformBuffers() { - return this.webGLVersion > 1 && !this.disableUniformBuffers; - } - /** - * Gets the options used for engine creation - * @returns EngineOptions object - */ - getCreationOptions() { - return this._creationOptions; - } - /** @internal */ - get _shouldUseHighPrecisionShader() { - return !!(this._caps.highPrecisionShaderSupported && this._highPrecisionShadersAllowed); +}; +var LoadImage = (input, onLoad, onError, offlineProvider, mimeType = "", imageBitmapOptions) => { + const engine = EngineStore.LastCreatedEngine; + if (typeof HTMLImageElement === "undefined" && !(engine == null ? void 0 : engine._features.forceBitmapOverHTMLImageElement)) { + onError("LoadImage is only supported in web or BabylonNative environments."); + return null; } - /** - * Gets a boolean indicating that only power of 2 textures are supported - * Please note that you can still use non power of 2 textures but in this case the engine will forcefully convert them - */ - get needPOTTextures() { - return this._webGLVersion < 2 || this.forcePOTTextures; + let url; + let usingObjectURL = false; + if (input instanceof ArrayBuffer || ArrayBuffer.isView(input)) { + if (typeof Blob !== "undefined" && typeof URL !== "undefined") { + url = URL.createObjectURL(new Blob([input], { type: mimeType })); + usingObjectURL = true; + } else { + url = `data:${mimeType};base64,` + EncodeArrayBufferToBase64(input); + } + } else if (input instanceof Blob) { + url = URL.createObjectURL(input); + usingObjectURL = true; + } else { + url = _CleanUrl(input); + url = FileToolsOptions.PreprocessUrl(input); } - /** - * Gets the list of current active render loop functions - * @returns a read only array with the current render loop functions - */ - get activeRenderLoops() { - return this._activeRenderLoops; + const onErrorHandler = (exception) => { + if (onError) { + const inputText = url || input.toString(); + onError(`Error while trying to load image: ${inputText.indexOf("http") === 0 || inputText.length <= 128 ? inputText : inputText.slice(0, 128) + "..."}`, exception); + } + }; + if (engine == null ? void 0 : engine._features.forceBitmapOverHTMLImageElement) { + LoadFile(url, (data) => { + engine.createImageBitmap(new Blob([data], { type: mimeType }), { premultiplyAlpha: "none", ...imageBitmapOptions }).then((imgBmp) => { + onLoad(imgBmp); + if (usingObjectURL) { + URL.revokeObjectURL(url); + } + }).catch((reason) => { + if (onError) { + onError("Error while trying to load image: " + input, reason); + } + }); + }, void 0, offlineProvider || void 0, true, (request, exception) => { + onErrorHandler(exception); + }); + return null; } - /** - * Gets or sets a boolean indicating if resources should be retained to be able to handle context lost events - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#handling-webgl-context-lost - */ - get doNotHandleContextLost() { - return this._doNotHandleContextLost; - } - set doNotHandleContextLost(value) { - this._doNotHandleContextLost = value; - } - get _supportsHardwareTextureRescaling() { - return false; - } - /** - * sets the object from which width and height will be taken from when getting render width and height - * Will fallback to the gl object - * @param dimensions the framebuffer width and height that will be used. - */ - set framebufferDimensionsObject(dimensions) { - this._framebufferDimensionsObject = dimensions; - } - /** - * Gets the current viewport - */ - get currentViewport() { - return this._cachedViewport; - } - /** - * Gets the default empty texture - */ - get emptyTexture() { - if (!this._emptyTexture) { - this._emptyTexture = this.createRawTexture(new Uint8Array(4), 1, 1, 5, false, false, 1); + const img = new Image(); + SetCorsBehavior(url, img); + const handlersList = []; + const loadHandlersList = () => { + handlersList.forEach((handler) => { + handler.target.addEventListener(handler.name, handler.handler); + }); + }; + const unloadHandlersList = () => { + handlersList.forEach((handler) => { + handler.target.removeEventListener(handler.name, handler.handler); + }); + handlersList.length = 0; + }; + const loadHandler = () => { + unloadHandlersList(); + onLoad(img); + if (usingObjectURL && img.src) { + URL.revokeObjectURL(img.src); } - return this._emptyTexture; - } - /** - * Gets the default empty 3D texture - */ - get emptyTexture3D() { - if (!this._emptyTexture3D) { - this._emptyTexture3D = this.createRawTexture3D(new Uint8Array(4), 1, 1, 1, 5, false, false, 1); + }; + const errorHandler = (err) => { + unloadHandlersList(); + onErrorHandler(err); + if (usingObjectURL && img.src) { + URL.revokeObjectURL(img.src); } - return this._emptyTexture3D; - } - /** - * Gets the default empty 2D array texture - */ - get emptyTexture2DArray() { - if (!this._emptyTexture2DArray) { - this._emptyTexture2DArray = this.createRawTexture2DArray(new Uint8Array(4), 1, 1, 1, 5, false, false, 1); + }; + const cspHandler = (err) => { + if (err.blockedURI !== img.src) { + return; } - return this._emptyTexture2DArray; - } - /** - * Gets the default empty cube texture - */ - get emptyCubeTexture() { - if (!this._emptyCubeTexture) { - const faceData = new Uint8Array(4); - const cubeData = [faceData, faceData, faceData, faceData, faceData, faceData]; - this._emptyCubeTexture = this.createRawCubeTexture(cubeData, 1, 5, 0, false, false, 1); + unloadHandlersList(); + const cspException = new Error(`CSP violation of policy ${err.effectiveDirective} ${err.blockedURI}. Current policy is ${err.originalPolicy}`); + EngineStore.UseFallbackTexture = false; + onErrorHandler(cspException); + if (usingObjectURL && img.src) { + URL.revokeObjectURL(img.src); } - return this._emptyCubeTexture; - } - /** - * Gets a boolean indicating if the engine runs in WebGPU or not. - */ - get isWebGPU() { - return this._isWebGPU; - } - /** - * Gets the shader platform name used by the effects. - */ - get shaderPlatformName() { - return this._shaderPlatformName; - } - /** - * Enables or disables the snapshot rendering mode - * Note that the WebGL engine does not support snapshot rendering so setting the value won't have any effect for this engine - */ - get snapshotRendering() { - return false; + img.src = ""; + }; + handlersList.push({ target: img, name: "load", handler: loadHandler }); + handlersList.push({ target: img, name: "error", handler: errorHandler }); + handlersList.push({ target: document, name: "securitypolicyviolation", handler: cspHandler }); + loadHandlersList(); + const fromBlob = url.substring(0, 5) === "blob:"; + const fromData = url.substring(0, 5) === "data:"; + const noOfflineSupport = () => { + if (fromBlob || fromData || !WebRequest.IsCustomRequestAvailable) { + img.src = url; + } else { + LoadFile(url, (data, _, contentType) => { + const type = !mimeType && contentType ? contentType : mimeType; + const blob = new Blob([data], { type }); + const url2 = URL.createObjectURL(blob); + usingObjectURL = true; + img.src = url2; + }, void 0, offlineProvider || void 0, true, (_request, exception) => { + onErrorHandler(exception); + }); + } + }; + const loadFromOfflineSupport = () => { + if (offlineProvider) { + offlineProvider.loadImage(url, img); + } + }; + if (!fromBlob && !fromData && offlineProvider && offlineProvider.enableTexturesOffline) { + offlineProvider.open(loadFromOfflineSupport, noOfflineSupport); + } else { + if (url.indexOf("file:") !== -1) { + const textureName = decodeURIComponent(url.substring(5).toLowerCase()); + if (FilesInputStore.FilesToLoad[textureName] && typeof URL !== "undefined") { + try { + let blobURL; + try { + blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]); + } catch (ex) { + blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]); + } + img.src = blobURL; + usingObjectURL = true; + } catch (e) { + img.src = ""; + } + return img; + } + } + noOfflineSupport(); } - set snapshotRendering(activate) { + return img; +}; +var ReadFile = (file, onSuccess, onProgress, useArrayBuffer, onError) => { + const reader = new FileReader(); + const fileRequest = { + onCompleteObservable: new Observable(), + abort: () => reader.abort() + }; + reader.onloadend = () => fileRequest.onCompleteObservable.notifyObservers(fileRequest); + if (onError) { + reader.onerror = () => { + onError(new ReadFileError(`Unable to read ${file.name}`, file)); + }; } - /** - * Gets or sets the snapshot rendering mode - */ - get snapshotRenderingMode() { - return this._snapshotRenderingMode; + reader.onload = (e) => { + onSuccess(e.target["result"]); + }; + if (onProgress) { + reader.onprogress = onProgress; } - set snapshotRenderingMode(mode) { - this._snapshotRenderingMode = mode; + if (!useArrayBuffer) { + reader.readAsText(file); + } else { + reader.readAsArrayBuffer(file); } - /** - * Creates a new snapshot at the next frame using the current snapshotRenderingMode - */ - snapshotRenderingReset() { - this.snapshotRendering = false; + return fileRequest; +}; +var LoadFile = (fileOrUrl, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError, onOpened) => { + if (fileOrUrl.name) { + return ReadFile(fileOrUrl, onSuccess, onProgress, useArrayBuffer, onError ? (error) => { + onError(void 0, error); + } : void 0); } - static _CreateCanvas(width, height) { - if (typeof document === "undefined") { - return new OffscreenCanvas(width, height); + const url = fileOrUrl; + if (url.indexOf("file:") !== -1) { + let fileName = decodeURIComponent(url.substring(5).toLowerCase()); + if (fileName.indexOf("./") === 0) { + fileName = fileName.substring(2); + } + const file = FilesInputStore.FilesToLoad[fileName]; + if (file) { + return ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError ? (error) => onError(void 0, new LoadFileError(error.message, error.file)) : void 0); } - const canvas = document.createElement("canvas"); - canvas.width = width; - canvas.height = height; - return canvas; - } - /** - * Create a canvas. This method is overridden by other engines - * @param width width - * @param height height - * @returns ICanvas interface - */ - createCanvas(width, height) { - return _ThinEngine._CreateCanvas(width, height); - } - /** - * Create an image to use with canvas - * @returns IImage interface - */ - createCanvasImage() { - return document.createElement("img"); } - /** - * Creates a new engine - * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which already used the WebGL context - * @param antialias defines enable antialiasing (default: false) - * @param options defines further options to be sent to the getContext() function - * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false) - */ - constructor(canvasOrContext, antialias, options, adaptToDeviceRatio) { - var _a, _b; - this._name = "WebGL"; - this._isDisposed = false; - this.forcePOTTextures = false; - this.isFullscreen = false; - this.cullBackFaces = null; - this.renderEvenInBackground = true; - this.preventCacheWipeBetweenFrames = false; - this.validateShaderPrograms = false; - this._useReverseDepthBuffer = false; - this.isNDCHalfZRange = false; - this.hasOriginBottomLeft = true; - this.disableUniformBuffers = false; - this.onDisposeObservable = new Observable(); - this._frameId = 0; - this._uniformBuffers = new Array(); - this._storageBuffers = new Array(); - this._webGLVersion = 1; - this._windowIsBackground = false; - this._highPrecisionShadersAllowed = true; - this._badOS = false; - this._badDesktopOS = false; - this._activeRenderLoops = new Array(); - this.onContextLostObservable = new Observable(); - this.onContextRestoredObservable = new Observable(); - this._contextWasLost = false; - this._doNotHandleContextLost = false; - this.disableVertexArrayObjects = false; - this._colorWrite = true; - this._colorWriteChanged = true; - this._depthCullingState = new DepthCullingState(); - this._stencilStateComposer = new StencilStateComposer(); - this._stencilState = new StencilState(); - this._alphaState = new AlphaState(); - this._alphaMode = 1; - this._alphaEquation = 0; - this._internalTexturesCache = new Array(); - this._renderTargetWrapperCache = new Array(); - this._activeChannel = 0; - this._currentTextureChannel = -1; - this._boundTexturesCache = {}; - this._compiledEffects = {}; - this._vertexAttribArraysEnabled = []; - this._currentRenderTarget = null; - this._uintIndicesCurrentlySet = false; - this._currentBoundBuffer = new Array(); - this._currentFramebuffer = null; - this._dummyFramebuffer = null; - this._currentBufferPointers = new Array(); - this._currentInstanceLocations = new Array(); - this._currentInstanceBuffers = new Array(); - this._boundRenderFunction = () => this._renderLoop(); - this._vaoRecordInProgress = false; - this._mustWipeVertexAttributes = false; - this._frameHandler = 0; - this._nextFreeTextureSlots = new Array(); - this._maxSimultaneousTextures = 0; - this._maxMSAASamplesOverride = null; - this._activeRequests = new Array(); - this.adaptToDeviceRatio = false; - this._lastDevicePixelRatio = 1; - this._transformTextureUrl = null; - this.hostInformation = { - isMobile: false + const { match, type } = TestBase64DataUrl(url); + if (match) { + const fileRequest = { + onCompleteObservable: new Observable(), + abort: () => () => { + } }; - this.premultipliedAlpha = true; - this.onBeforeTextureInitObservable = new Observable(); - this._isWebGPU = false; - this._snapshotRenderingMode = 0; - this._viewportCached = { x: 0, y: 0, z: 0, w: 0 }; - this._unpackFlipYCached = null; - this.enableUnpackFlipYCached = true; - this._boundUniforms = {}; - this.startTime = PrecisionDate.Now; - let canvas = null; - options = options || {}; - this._creationOptions = options; - this.adaptToDeviceRatio = adaptToDeviceRatio ?? false; - this._stencilStateComposer.stencilGlobal = this._stencilState; - PerformanceConfigurator.SetMatrixPrecision(!!options.useHighPrecisionMatrix); - options.antialias = antialias ?? options.antialias; - options.deterministicLockstep = options.deterministicLockstep ?? false; - options.lockstepMaxSteps = options.lockstepMaxSteps ?? 4; - options.timeStep = options.timeStep ?? 1 / 60; - options.audioEngine = options.audioEngine ?? true; - options.stencil = options.stencil ?? true; - this._audioContext = ((_a = options.audioEngineOptions) == null ? void 0 : _a.audioContext) ?? null; - this._audioDestination = ((_b = options.audioEngineOptions) == null ? void 0 : _b.audioDestination) ?? null; - this.premultipliedAlpha = options.premultipliedAlpha ?? true; - this.useExactSrgbConversions = options.useExactSrgbConversions ?? false; - this._doNotHandleContextLost = !!options.doNotHandleContextLost; - this._isStencilEnable = options.stencil ? true : false; - adaptToDeviceRatio = adaptToDeviceRatio || options.adaptToDeviceRatio || false; - const devicePixelRatio = IsWindowObjectExist() ? window.devicePixelRatio || 1 : 1; - const limitDeviceRatio = options.limitDeviceRatio || devicePixelRatio; - this._hardwareScalingLevel = adaptToDeviceRatio ? 1 / Math.min(limitDeviceRatio, devicePixelRatio) : 1; - this._lastDevicePixelRatio = devicePixelRatio; - if (!canvasOrContext) { - return; + try { + const data = useArrayBuffer ? DecodeBase64UrlToBinary(url) : DecodeBase64UrlToString(url); + onSuccess(data, void 0, type); + } catch (error) { + if (onError) { + onError(void 0, error); + } else { + Logger.Error(error.message || "Failed to parse the Data URL"); + } } - if (canvasOrContext.getContext) { - canvas = canvasOrContext; - this._renderingCanvas = canvas; - if (options.preserveDrawingBuffer === void 0) { - options.preserveDrawingBuffer = false; + TimingTools.SetImmediate(() => { + fileRequest.onCompleteObservable.notifyObservers(fileRequest); + }); + return fileRequest; + } + return RequestFile(url, (data, request) => { + onSuccess(data, request == null ? void 0 : request.responseURL, request == null ? void 0 : request.getResponseHeader("content-type")); + }, onProgress, offlineProvider, useArrayBuffer, onError ? (error) => { + onError(error.request, new LoadFileError(error.message, error.request)); + } : void 0, onOpened); +}; +var RequestFile = (url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError, onOpened) => { + url = _CleanUrl(url); + url = FileToolsOptions.PreprocessUrl(url); + const loadUrl = FileToolsOptions.BaseUrl + url; + let aborted = false; + const fileRequest = { + onCompleteObservable: new Observable(), + abort: () => aborted = true + }; + const requestFile = () => { + let request = new WebRequest(); + let retryHandle = null; + let onReadyStateChange; + const unbindEvents = () => { + if (!request) { + return; } - if (options.xrCompatible === void 0) { - options.xrCompatible = true; + if (onProgress) { + request.removeEventListener("progress", onProgress); } - if (navigator && navigator.userAgent) { - this._setupMobileChecks(); - const ua = navigator.userAgent; - for (const exception of _ThinEngine.ExceptionList) { - const key = exception.key; - const targets = exception.targets; - const check = new RegExp(key); - if (check.test(ua)) { - if (exception.capture && exception.captureConstraint) { - const capture = exception.capture; - const constraint = exception.captureConstraint; - const regex = new RegExp(capture); - const matches = regex.exec(ua); - if (matches && matches.length > 0) { - const capturedValue = parseInt(matches[matches.length - 1]); - if (capturedValue >= constraint) { - continue; - } - } - } - for (const target of targets) { - switch (target) { - case "uniformBuffer": - this.disableUniformBuffers = true; - break; - case "vao": - this.disableVertexArrayObjects = true; - break; - case "antialias": - options.antialias = false; - break; - case "maxMSAASamples": - this._maxMSAASamplesOverride = 1; - break; - } - } - } - } + if (onReadyStateChange) { + request.removeEventListener("readystatechange", onReadyStateChange); } - if (!this._doNotHandleContextLost) { - this._onContextLost = (evt) => { - evt.preventDefault(); - this._contextWasLost = true; - Logger.Warn("WebGL context lost."); - this.onContextLostObservable.notifyObservers(this); - }; - this._onContextRestored = () => { - this._restoreEngineAfterContextLost(() => this._initGLContext()); - }; - canvas.addEventListener("webglcontextlost", this._onContextLost, false); - canvas.addEventListener("webglcontextrestored", this._onContextRestored, false); - options.powerPreference = options.powerPreference || "high-performance"; + request.removeEventListener("loadend", onLoadEnd); + }; + let onLoadEnd = () => { + unbindEvents(); + fileRequest.onCompleteObservable.notifyObservers(fileRequest); + fileRequest.onCompleteObservable.clear(); + onProgress = void 0; + onReadyStateChange = null; + onLoadEnd = null; + onError = void 0; + onOpened = void 0; + onSuccess = void 0; + }; + fileRequest.abort = () => { + aborted = true; + if (onLoadEnd) { + onLoadEnd(); } - this._badDesktopOS = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); - if (this._badDesktopOS) { - options.xrCompatible = false; + if (request && request.readyState !== (XMLHttpRequest.DONE || 4)) { + request.abort(); } - if (!options.disableWebGL2Support) { - try { - this._gl = canvas.getContext("webgl2", options) || canvas.getContext("experimental-webgl2", options); - if (this._gl) { - this._webGLVersion = 2; - this._shaderPlatformName = "WEBGL2"; - if (!this._gl.deleteQuery) { - this._webGLVersion = 1; - this._shaderPlatformName = "WEBGL1"; - } - } - } catch (e) { - } + if (retryHandle !== null) { + clearTimeout(retryHandle); + retryHandle = null; } - if (!this._gl) { - if (!canvas) { - throw new Error("The provided canvas is null or undefined."); - } + request = null; + }; + const handleError = (error) => { + const message = error.message || "Unknown error"; + if (onError && request) { + onError(new RequestFileError(message, request)); + } else { + Logger.Error(message); + } + }; + const retryLoop = (retryIndex) => { + if (!request) { + return; + } + request.open("GET", loadUrl); + if (onOpened) { try { - this._gl = canvas.getContext("webgl", options) || canvas.getContext("experimental-webgl", options); + onOpened(request); } catch (e) { - throw new Error("WebGL not supported"); + handleError(e); + return; } } - if (!this._gl) { - throw new Error("WebGL not supported"); - } - } else { - this._gl = canvasOrContext; - this._renderingCanvas = this._gl.canvas; - if (this._gl.renderbufferStorageMultisample) { - this._webGLVersion = 2; - this._shaderPlatformName = "WEBGL2"; + if (useArrayBuffer) { + request.responseType = "arraybuffer"; + } + if (onProgress) { + request.addEventListener("progress", onProgress); + } + if (onLoadEnd) { + request.addEventListener("loadend", onLoadEnd); + } + onReadyStateChange = () => { + if (aborted || !request) { + return; + } + if (request.readyState === (XMLHttpRequest.DONE || 4)) { + if (onReadyStateChange) { + request.removeEventListener("readystatechange", onReadyStateChange); + } + if (request.status >= 200 && request.status < 300 || request.status === 0 && (!IsWindowObjectExist() || IsFileURL())) { + try { + if (onSuccess) { + onSuccess(useArrayBuffer ? request.response : request.responseText, request); + } + } catch (e) { + handleError(e); + } + return; + } + const retryStrategy = FileToolsOptions.DefaultRetryStrategy; + if (retryStrategy) { + const waitTime = retryStrategy(loadUrl, request, retryIndex); + if (waitTime !== -1) { + unbindEvents(); + request = new WebRequest(); + retryHandle = setTimeout(() => retryLoop(retryIndex + 1), waitTime); + return; + } + } + const error = new RequestFileError("Error status: " + request.status + " " + request.statusText + " - Unable to load " + loadUrl, request); + if (onError) { + onError(error); + } + } + }; + request.addEventListener("readystatechange", onReadyStateChange); + request.send(); + }; + retryLoop(0); + }; + if (offlineProvider && offlineProvider.enableSceneOffline) { + const noOfflineSupport = (request) => { + if (request && request.status > 400) { + if (onError) { + onError(request); + } } else { - this._shaderPlatformName = "WEBGL1"; + requestFile(); } - const attributes = this._gl.getContextAttributes(); - if (attributes) { - options.stencil = attributes.stencil; + }; + const loadFromOfflineSupport = () => { + if (offlineProvider) { + offlineProvider.loadFile(FileToolsOptions.BaseUrl + url, (data) => { + if (!aborted && onSuccess) { + onSuccess(data); + } + fileRequest.onCompleteObservable.notifyObservers(fileRequest); + }, onProgress ? (event) => { + if (!aborted && onProgress) { + onProgress(event); + } + } : void 0, noOfflineSupport, useArrayBuffer); } + }; + offlineProvider.open(loadFromOfflineSupport, noOfflineSupport); + } else { + requestFile(); + } + return fileRequest; +}; +var IsFileURL = () => { + return typeof location !== "undefined" && location.protocol === "file:"; +}; +var IsBase64DataUrl = (uri) => { + return Base64DataUrlRegEx.test(uri); +}; +var TestBase64DataUrl = (uri) => { + const results = Base64DataUrlRegEx.exec(uri); + if (results === null || results.length === 0) { + return { match: false, type: "" }; + } else { + const type = results[0].replace("data:", "").replace("base64,", ""); + return { match: true, type }; + } +}; +function DecodeBase64UrlToBinary(uri) { + return DecodeBase64ToBinary(uri.split(",")[1]); +} +var DecodeBase64UrlToString = (uri) => { + return DecodeBase64ToString(uri.split(",")[1]); +}; +var initSideEffects = () => { + ThinEngine._FileToolsLoadImage = LoadImage; + ThinEngine._FileToolsLoadFile = LoadFile; + ShaderProcessor._FileToolsLoadFile = LoadFile; +}; +initSideEffects(); +var FileTools; +var _injectLTSFileTools = (DecodeBase64UrlToBinary2, DecodeBase64UrlToString2, FileToolsOptions2, IsBase64DataUrl2, IsFileURL2, LoadFile2, LoadImage2, ReadFile2, RequestFile2, SetCorsBehavior2) => { + FileTools = { + DecodeBase64UrlToBinary: DecodeBase64UrlToBinary2, + DecodeBase64UrlToString: DecodeBase64UrlToString2, + DefaultRetryStrategy: FileToolsOptions2.DefaultRetryStrategy, + BaseUrl: FileToolsOptions2.BaseUrl, + CorsBehavior: FileToolsOptions2.CorsBehavior, + PreprocessUrl: FileToolsOptions2.PreprocessUrl, + IsBase64DataUrl: IsBase64DataUrl2, + IsFileURL: IsFileURL2, + LoadFile: LoadFile2, + LoadImage: LoadImage2, + ReadFile: ReadFile2, + RequestFile: RequestFile2, + SetCorsBehavior: SetCorsBehavior2 + }; + Object.defineProperty(FileTools, "DefaultRetryStrategy", { + get: function() { + return FileToolsOptions2.DefaultRetryStrategy; + }, + set: function(value) { + FileToolsOptions2.DefaultRetryStrategy = value; } - this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE); - if (options.useHighPrecisionFloats !== void 0) { - this._highPrecisionShadersAllowed = options.useHighPrecisionFloats; + }); + Object.defineProperty(FileTools, "BaseUrl", { + get: function() { + return FileToolsOptions2.BaseUrl; + }, + set: function(value) { + FileToolsOptions2.BaseUrl = value; } - this.resize(); - this._initGLContext(); - this._initFeatures(); - for (let i = 0; i < this._caps.maxVertexAttribs; i++) { - this._currentBufferPointers[i] = new BufferPointer(); + }); + Object.defineProperty(FileTools, "PreprocessUrl", { + get: function() { + return FileToolsOptions2.PreprocessUrl; + }, + set: function(value) { + FileToolsOptions2.PreprocessUrl = value; } - this._shaderProcessor = this.webGLVersion > 1 ? new WebGL2ShaderProcessor() : new WebGLShaderProcessor(); - this._badOS = /iPad/i.test(navigator.userAgent) || /iPhone/i.test(navigator.userAgent); - const versionToLog = `Babylon.js v${_ThinEngine.Version}`; - Logger.Log(versionToLog + ` - ${this.description}`); - if (this._renderingCanvas && this._renderingCanvas.setAttribute) { - this._renderingCanvas.setAttribute("data-engine", versionToLog); + }); + Object.defineProperty(FileTools, "CorsBehavior", { + get: function() { + return FileToolsOptions2.CorsBehavior; + }, + set: function(value) { + FileToolsOptions2.CorsBehavior = value; + } + }); +}; +_injectLTSFileTools(DecodeBase64UrlToBinary, DecodeBase64UrlToString, FileToolsOptions, IsBase64DataUrl, IsFileURL, LoadFile, LoadImage, ReadFile, RequestFile, SetCorsBehavior); + +// node_modules/@babylonjs/core/Misc/guid.js +function RandomGUID() { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => { + const r = Math.random() * 16 | 0, v = c === "x" ? r : r & 3 | 8; + return v.toString(16); + }); +} +var GUID = { + /** + * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523 + * Be aware Math.random() could cause collisions, but: + * "All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide" + * @returns a pseudo random id + */ + // eslint-disable-next-line @typescript-eslint/naming-convention + RandomId: RandomGUID +}; + +// node_modules/@babylonjs/core/Misc/instantiationTools.js +var InstantiationTools = class { + /** + * Tries to instantiate a new object from a given class name + * @param className defines the class name to instantiate + * @returns the new object or null if the system was not able to do the instantiation + */ + static Instantiate(className2) { + if (this.RegisteredExternalClasses && this.RegisteredExternalClasses[className2]) { + return this.RegisteredExternalClasses[className2]; + } + const internalClass = GetClass(className2); + if (internalClass) { + return internalClass; + } + Logger.Warn(className2 + " not found, you may have missed an import."); + const arr = className2.split("."); + let fn = window || this; + for (let i = 0, len = arr.length; i < len; i++) { + fn = fn[arr[i]]; + } + if (typeof fn !== "function") { + return null; } + return fn; } - _setupMobileChecks() { - if (!(navigator && navigator.userAgent)) { - return; +}; +InstantiationTools.RegisteredExternalClasses = {}; + +// node_modules/@babylonjs/core/Misc/tools.functions.js +function IsExponentOfTwo(value) { + let count = 1; + do { + count *= 2; + } while (count < value); + return count === value; +} +function Mix(a, b, alpha) { + return a * (1 - alpha) + b * alpha; +} + +// node_modules/@babylonjs/core/Misc/tools.js +var Tools = class _Tools { + /** + * Gets or sets the base URL to use to load assets + */ + static get BaseUrl() { + return FileToolsOptions.BaseUrl; + } + static set BaseUrl(value) { + FileToolsOptions.BaseUrl = value; + } + /** + * This function checks whether a URL is absolute or not. + * It will also detect data and blob URLs + * @param url the url to check + * @returns is the url absolute or relative + */ + static IsAbsoluteUrl(url) { + if (url.indexOf("//") === 0) { + return true; } - this._checkForMobile = () => { - const currentUA = navigator.userAgent; - this.hostInformation.isMobile = currentUA.indexOf("Mobile") !== -1 || // Needed for iOS 13+ detection on iPad (inspired by solution from https://stackoverflow.com/questions/9038625/detect-if-device-is-ios) - currentUA.indexOf("Mac") !== -1 && IsDocumentAvailable() && "ontouchend" in document; - }; - this._checkForMobile(); - if (IsWindowObjectExist()) { - window.addEventListener("resize", this._checkForMobile); + if (url.indexOf("://") === -1) { + return false; + } + if (url.indexOf(".") === -1) { + return false; + } + if (url.indexOf("/") === -1) { + return false; + } + if (url.indexOf(":") > url.indexOf("/")) { + return false; + } + if (url.indexOf("://") < url.indexOf(".")) { + return true; + } + if (url.indexOf("data:") === 0 || url.indexOf("blob:") === 0) { + return true; } + return false; } - _clearEmptyResources() { - this._dummyFramebuffer = null; - this._emptyTexture = null; - this._emptyCubeTexture = null; - this._emptyTexture3D = null; - this._emptyTexture2DArray = null; + /** + * Sets the base URL to use to load scripts + */ + static set ScriptBaseUrl(value) { + FileToolsOptions.ScriptBaseUrl = value; } - _rebuildGraphicsResources() { - var _a; - this.wipeCaches(true); - this._rebuildEffects(); - (_a = this._rebuildComputeEffects) == null ? void 0 : _a.call(this); - this._rebuildBuffers(); - this._rebuildInternalTextures(); - this._rebuildTextures(); - this._rebuildRenderTargetWrappers(); - this.wipeCaches(true); + static get ScriptBaseUrl() { + return FileToolsOptions.ScriptBaseUrl; } - _flagContextRestored() { - Logger.Warn(this.name + " context successfully restored."); - this.onContextRestoredObservable.notifyObservers(this); - this._contextWasLost = false; + /** + * Sets a preprocessing function to run on a source URL before importing it + * Note that this function will execute AFTER the base URL is appended to the URL + */ + static set ScriptPreprocessUrl(func) { + FileToolsOptions.ScriptPreprocessUrl = func; } - _restoreEngineAfterContextLost(initEngine) { - setTimeout(async () => { - this._clearEmptyResources(); - const depthTest = this._depthCullingState.depthTest; - const depthFunc = this._depthCullingState.depthFunc; - const depthMask = this._depthCullingState.depthMask; - const stencilTest = this._stencilState.stencilTest; - await initEngine(); - this._rebuildGraphicsResources(); - this._depthCullingState.depthTest = depthTest; - this._depthCullingState.depthFunc = depthFunc; - this._depthCullingState.depthMask = depthMask; - this._stencilState.stencilTest = stencilTest; - this._flagContextRestored(); - }, 0); + static get ScriptPreprocessUrl() { + return FileToolsOptions.ScriptPreprocessUrl; } /** - * Shared initialization across engines types. - * @param canvas The canvas associated with this instance of the engine. + * Gets or sets the retry strategy to apply when an error happens while loading an asset */ - _sharedInit(canvas) { - this._renderingCanvas = canvas; + static get DefaultRetryStrategy() { + return FileToolsOptions.DefaultRetryStrategy; + } + static set DefaultRetryStrategy(strategy) { + FileToolsOptions.DefaultRetryStrategy = strategy; } /** - * @internal + * Default behavior for cors in the application. + * It can be a string if the expected behavior is identical in the entire app. + * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance) */ - _getShaderProcessingContext(shaderLanguage) { - return null; + static get CorsBehavior() { + return FileToolsOptions.CorsBehavior; } - _rebuildInternalTextures() { - const currentState = this._internalTexturesCache.slice(); - for (const internalTexture of currentState) { - internalTexture._rebuild(); - } + static set CorsBehavior(value) { + FileToolsOptions.CorsBehavior = value; } - _rebuildRenderTargetWrappers() { - const currentState = this._renderTargetWrapperCache.slice(); - for (const renderTargetWrapper of currentState) { - renderTargetWrapper._rebuild(); - } + /** + * Gets or sets a global variable indicating if fallback texture must be used when a texture cannot be loaded + * @ignorenaming + */ + static get UseFallbackTexture() { + return EngineStore.UseFallbackTexture; } - _rebuildEffects() { - for (const key in this._compiledEffects) { - const effect = this._compiledEffects[key]; - effect._pipelineContext = null; - effect._prepareEffect(); + static set UseFallbackTexture(value) { + EngineStore.UseFallbackTexture = value; + } + /** + * Use this object to register external classes like custom textures or material + * to allow the loaders to instantiate them + */ + static get RegisteredExternalClasses() { + return InstantiationTools.RegisteredExternalClasses; + } + static set RegisteredExternalClasses(classes) { + InstantiationTools.RegisteredExternalClasses = classes; + } + /** + * Texture content used if a texture cannot loaded + * @ignorenaming + */ + // eslint-disable-next-line @typescript-eslint/naming-convention + static get fallbackTexture() { + return EngineStore.FallbackTexture; + } + // eslint-disable-next-line @typescript-eslint/naming-convention + static set fallbackTexture(value) { + EngineStore.FallbackTexture = value; + } + /** + * Read the content of a byte array at a specified coordinates (taking in account wrapping) + * @param u defines the coordinate on X axis + * @param v defines the coordinate on Y axis + * @param width defines the width of the source data + * @param height defines the height of the source data + * @param pixels defines the source byte array + * @param color defines the output color + */ + static FetchToRef(u, v, width, height, pixels, color) { + const wrappedU = Math.abs(u) * width % width | 0; + const wrappedV = Math.abs(v) * height % height | 0; + const position = (wrappedU + wrappedV * width) * 4; + color.r = pixels[position] / 255; + color.g = pixels[position + 1] / 255; + color.b = pixels[position + 2] / 255; + color.a = pixels[position + 3] / 255; + } + /** + * Interpolates between a and b via alpha + * @param a The lower value (returned when alpha = 0) + * @param b The upper value (returned when alpha = 1) + * @param alpha The interpolation-factor + * @returns The mixed value + */ + static Mix(a, b, alpha) { + return 0; + } + /** + * Tries to instantiate a new object from a given class name + * @param className defines the class name to instantiate + * @returns the new object or null if the system was not able to do the instantiation + */ + static Instantiate(className2) { + return InstantiationTools.Instantiate(className2); + } + /** + * Polyfill for setImmediate + * @param action defines the action to execute after the current execution block + */ + static SetImmediate(action) { + TimingTools.SetImmediate(action); + } + /** + * Function indicating if a number is an exponent of 2 + * @param value defines the value to test + * @returns true if the value is an exponent of 2 + */ + static IsExponentOfTwo(value) { + return true; + } + /** + * Returns the nearest 32-bit single precision float representation of a Number + * @param value A Number. If the parameter is of a different type, it will get converted + * to a number or to NaN if it cannot be converted + * @returns number + */ + static FloatRound(value) { + return Math.fround(value); + } + /** + * Extracts the filename from a path + * @param path defines the path to use + * @returns the filename + */ + static GetFilename(path) { + const index = path.lastIndexOf("/"); + if (index < 0) { + return path; } - Effect.ResetCache(); + return path.substring(index + 1); } /** - * Gets a boolean indicating if all created effects are ready - * @returns true if all effects are ready + * Extracts the "folder" part of a path (everything before the filename). + * @param uri The URI to extract the info from + * @param returnUnchangedIfNoSlash Do not touch the URI if no slashes are present + * @returns The "folder" part of the path */ - areAllEffectsReady() { - for (const key in this._compiledEffects) { - const effect = this._compiledEffects[key]; - if (!effect.isReady()) { - return false; + static GetFolderPath(uri, returnUnchangedIfNoSlash = false) { + const index = uri.lastIndexOf("/"); + if (index < 0) { + if (returnUnchangedIfNoSlash) { + return uri; } + return ""; } - return true; + return uri.substring(0, index + 1); } - _rebuildBuffers() { - for (const uniformBuffer of this._uniformBuffers) { - uniformBuffer._rebuildAfterContextLost(); - } + /** + * Convert an angle in radians to degrees + * @param angle defines the angle to convert + * @returns the angle in degrees + */ + static ToDegrees(angle) { + return angle * 180 / Math.PI; } - _rebuildTextures() { - } - _initGLContext() { - this._caps = { - maxTexturesImageUnits: this._gl.getParameter(this._gl.MAX_TEXTURE_IMAGE_UNITS), - maxCombinedTexturesImageUnits: this._gl.getParameter(this._gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS), - maxVertexTextureImageUnits: this._gl.getParameter(this._gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS), - maxTextureSize: this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE), - maxSamples: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_SAMPLES) : 1, - maxCubemapTextureSize: this._gl.getParameter(this._gl.MAX_CUBE_MAP_TEXTURE_SIZE), - maxRenderTextureSize: this._gl.getParameter(this._gl.MAX_RENDERBUFFER_SIZE), - maxVertexAttribs: this._gl.getParameter(this._gl.MAX_VERTEX_ATTRIBS), - maxVaryingVectors: this._gl.getParameter(this._gl.MAX_VARYING_VECTORS), - maxFragmentUniformVectors: this._gl.getParameter(this._gl.MAX_FRAGMENT_UNIFORM_VECTORS), - maxVertexUniformVectors: this._gl.getParameter(this._gl.MAX_VERTEX_UNIFORM_VECTORS), - parallelShaderCompile: this._gl.getExtension("KHR_parallel_shader_compile") || void 0, - standardDerivatives: this._webGLVersion > 1 || this._gl.getExtension("OES_standard_derivatives") !== null, - maxAnisotropy: 1, - astc: this._gl.getExtension("WEBGL_compressed_texture_astc") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_astc"), - bptc: this._gl.getExtension("EXT_texture_compression_bptc") || this._gl.getExtension("WEBKIT_EXT_texture_compression_bptc"), - s3tc: this._gl.getExtension("WEBGL_compressed_texture_s3tc") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc"), - // eslint-disable-next-line @typescript-eslint/naming-convention - s3tc_srgb: this._gl.getExtension("WEBGL_compressed_texture_s3tc_srgb") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc_srgb"), - pvrtc: this._gl.getExtension("WEBGL_compressed_texture_pvrtc") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"), - etc1: this._gl.getExtension("WEBGL_compressed_texture_etc1") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_etc1"), - etc2: this._gl.getExtension("WEBGL_compressed_texture_etc") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_etc") || this._gl.getExtension("WEBGL_compressed_texture_es3_0"), - textureAnisotropicFilterExtension: this._gl.getExtension("EXT_texture_filter_anisotropic") || this._gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic") || this._gl.getExtension("MOZ_EXT_texture_filter_anisotropic"), - uintIndices: this._webGLVersion > 1 || this._gl.getExtension("OES_element_index_uint") !== null, - fragmentDepthSupported: this._webGLVersion > 1 || this._gl.getExtension("EXT_frag_depth") !== null, - highPrecisionShaderSupported: false, - timerQuery: this._gl.getExtension("EXT_disjoint_timer_query_webgl2") || this._gl.getExtension("EXT_disjoint_timer_query"), - supportOcclusionQuery: this._webGLVersion > 1, - canUseTimestampForTimerQuery: false, - drawBuffersExtension: false, - maxMSAASamples: 1, - colorBufferFloat: !!(this._webGLVersion > 1 && this._gl.getExtension("EXT_color_buffer_float")), - supportFloatTexturesResolve: false, - rg11b10ufColorRenderable: false, - colorBufferHalfFloat: !!(this._webGLVersion > 1 && this._gl.getExtension("EXT_color_buffer_half_float")), - textureFloat: this._webGLVersion > 1 || this._gl.getExtension("OES_texture_float") ? true : false, - textureHalfFloat: this._webGLVersion > 1 || this._gl.getExtension("OES_texture_half_float") ? true : false, - textureHalfFloatRender: false, - textureFloatLinearFiltering: false, - textureFloatRender: false, - textureHalfFloatLinearFiltering: false, - vertexArrayObject: false, - instancedArrays: false, - textureLOD: this._webGLVersion > 1 || this._gl.getExtension("EXT_shader_texture_lod") ? true : false, - texelFetch: this._webGLVersion !== 1, - blendMinMax: false, - multiview: this._gl.getExtension("OVR_multiview2"), - oculusMultiview: this._gl.getExtension("OCULUS_multiview"), - depthTextureExtension: false, - canUseGLInstanceID: this._webGLVersion > 1, - canUseGLVertexID: this._webGLVersion > 1, - supportComputeShaders: false, - supportSRGBBuffers: false, - supportTransformFeedbacks: this._webGLVersion > 1, - textureMaxLevel: this._webGLVersion > 1, - texture2DArrayMaxLayerCount: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_ARRAY_TEXTURE_LAYERS) : 128, - disableMorphTargetTexture: false - }; - this._caps.supportFloatTexturesResolve = this._caps.colorBufferFloat; - this._caps.rg11b10ufColorRenderable = this._caps.colorBufferFloat; - this._glVersion = this._gl.getParameter(this._gl.VERSION); - const rendererInfo = this._gl.getExtension("WEBGL_debug_renderer_info"); - if (rendererInfo != null) { - this._glRenderer = this._gl.getParameter(rendererInfo.UNMASKED_RENDERER_WEBGL); - this._glVendor = this._gl.getParameter(rendererInfo.UNMASKED_VENDOR_WEBGL); - } - if (!this._glVendor) { - this._glVendor = this._gl.getParameter(this._gl.VENDOR) || "Unknown vendor"; - } - if (!this._glRenderer) { - this._glRenderer = this._gl.getParameter(this._gl.RENDERER) || "Unknown renderer"; - } - if (this._gl.HALF_FLOAT_OES !== 36193) { - this._gl.HALF_FLOAT_OES = 36193; - } - if (this._gl.RGBA16F !== 34842) { - this._gl.RGBA16F = 34842; - } - if (this._gl.RGBA32F !== 34836) { - this._gl.RGBA32F = 34836; - } - if (this._gl.DEPTH24_STENCIL8 !== 35056) { - this._gl.DEPTH24_STENCIL8 = 35056; - } - if (this._caps.timerQuery) { - if (this._webGLVersion === 1) { - this._gl.getQuery = this._caps.timerQuery.getQueryEXT.bind(this._caps.timerQuery); - } - this._caps.canUseTimestampForTimerQuery = (this._gl.getQuery(this._caps.timerQuery.TIMESTAMP_EXT, this._caps.timerQuery.QUERY_COUNTER_BITS_EXT) ?? 0) > 0; - } - this._caps.maxAnisotropy = this._caps.textureAnisotropicFilterExtension ? this._gl.getParameter(this._caps.textureAnisotropicFilterExtension.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0; - this._caps.textureFloatLinearFiltering = this._caps.textureFloat && this._gl.getExtension("OES_texture_float_linear") ? true : false; - this._caps.textureFloatRender = this._caps.textureFloat && this._canRenderToFloatFramebuffer() ? true : false; - this._caps.textureHalfFloatLinearFiltering = this._webGLVersion > 1 || this._caps.textureHalfFloat && this._gl.getExtension("OES_texture_half_float_linear") ? true : false; - if (this._caps.astc) { - this._gl.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = this._caps.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR; - } - if (this._caps.bptc) { - this._gl.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT = this._caps.bptc.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT; - } - if (this._caps.s3tc_srgb) { - this._gl.COMPRESSED_SRGB_S3TC_DXT1_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_S3TC_DXT1_EXT; - this._gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; - this._gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; - } - if (this._caps.etc2) { - this._gl.COMPRESSED_SRGB8_ETC2 = this._caps.etc2.COMPRESSED_SRGB8_ETC2; - this._gl.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = this._caps.etc2.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC; - } - if (this._webGLVersion > 1) { - if (this._gl.HALF_FLOAT_OES !== 5131) { - this._gl.HALF_FLOAT_OES = 5131; - } - } - this._caps.textureHalfFloatRender = this._caps.textureHalfFloat && this._canRenderToHalfFloatFramebuffer(); - if (this._webGLVersion > 1) { - this._caps.drawBuffersExtension = true; - this._caps.maxMSAASamples = this._maxMSAASamplesOverride !== null ? this._maxMSAASamplesOverride : this._gl.getParameter(this._gl.MAX_SAMPLES); - } else { - const drawBuffersExtension = this._gl.getExtension("WEBGL_draw_buffers"); - if (drawBuffersExtension !== null) { - this._caps.drawBuffersExtension = true; - this._gl.drawBuffers = drawBuffersExtension.drawBuffersWEBGL.bind(drawBuffersExtension); - this._gl.DRAW_FRAMEBUFFER = this._gl.FRAMEBUFFER; - for (let i = 0; i < 16; i++) { - this._gl["COLOR_ATTACHMENT" + i + "_WEBGL"] = drawBuffersExtension["COLOR_ATTACHMENT" + i + "_WEBGL"]; - } - } - } - if (this._webGLVersion > 1) { - this._caps.depthTextureExtension = true; - } else { - const depthTextureExtension = this._gl.getExtension("WEBGL_depth_texture"); - if (depthTextureExtension != null) { - this._caps.depthTextureExtension = true; - this._gl.UNSIGNED_INT_24_8 = depthTextureExtension.UNSIGNED_INT_24_8_WEBGL; - } - } - if (this.disableVertexArrayObjects) { - this._caps.vertexArrayObject = false; - } else if (this._webGLVersion > 1) { - this._caps.vertexArrayObject = true; - } else { - const vertexArrayObjectExtension = this._gl.getExtension("OES_vertex_array_object"); - if (vertexArrayObjectExtension != null) { - this._caps.vertexArrayObject = true; - this._gl.createVertexArray = vertexArrayObjectExtension.createVertexArrayOES.bind(vertexArrayObjectExtension); - this._gl.bindVertexArray = vertexArrayObjectExtension.bindVertexArrayOES.bind(vertexArrayObjectExtension); - this._gl.deleteVertexArray = vertexArrayObjectExtension.deleteVertexArrayOES.bind(vertexArrayObjectExtension); - } - } - if (this._webGLVersion > 1) { - this._caps.instancedArrays = true; - } else { - const instanceExtension = this._gl.getExtension("ANGLE_instanced_arrays"); - if (instanceExtension != null) { - this._caps.instancedArrays = true; - this._gl.drawArraysInstanced = instanceExtension.drawArraysInstancedANGLE.bind(instanceExtension); - this._gl.drawElementsInstanced = instanceExtension.drawElementsInstancedANGLE.bind(instanceExtension); - this._gl.vertexAttribDivisor = instanceExtension.vertexAttribDivisorANGLE.bind(instanceExtension); - } else { - this._caps.instancedArrays = false; - } - } - if (this._gl.getShaderPrecisionFormat) { - const vertexhighp = this._gl.getShaderPrecisionFormat(this._gl.VERTEX_SHADER, this._gl.HIGH_FLOAT); - const fragmenthighp = this._gl.getShaderPrecisionFormat(this._gl.FRAGMENT_SHADER, this._gl.HIGH_FLOAT); - if (vertexhighp && fragmenthighp) { - this._caps.highPrecisionShaderSupported = vertexhighp.precision !== 0 && fragmenthighp.precision !== 0; - } - } - if (this._webGLVersion > 1) { - this._caps.blendMinMax = true; - } else { - const blendMinMaxExtension = this._gl.getExtension("EXT_blend_minmax"); - if (blendMinMaxExtension != null) { - this._caps.blendMinMax = true; - this._gl.MAX = blendMinMaxExtension.MAX_EXT; - this._gl.MIN = blendMinMaxExtension.MIN_EXT; - } - } - if (!this._caps.supportSRGBBuffers) { - if (this._webGLVersion > 1) { - this._caps.supportSRGBBuffers = true; - this._glSRGBExtensionValues = { - SRGB: WebGL2RenderingContext.SRGB, - SRGB8: WebGL2RenderingContext.SRGB8, - SRGB8_ALPHA8: WebGL2RenderingContext.SRGB8_ALPHA8 - }; - } else { - const sRGBExtension = this._gl.getExtension("EXT_sRGB"); - if (sRGBExtension != null) { - this._caps.supportSRGBBuffers = true; - this._glSRGBExtensionValues = { - SRGB: sRGBExtension.SRGB_EXT, - SRGB8: sRGBExtension.SRGB_ALPHA_EXT, - SRGB8_ALPHA8: sRGBExtension.SRGB_ALPHA_EXT - }; - } - } - this._caps.supportSRGBBuffers = this._caps.supportSRGBBuffers && !!(this._creationOptions && this._creationOptions.forceSRGBBufferSupportState); - } - this._depthCullingState.depthTest = true; - this._depthCullingState.depthFunc = this._gl.LEQUAL; - this._depthCullingState.depthMask = true; - this._maxSimultaneousTextures = this._caps.maxCombinedTexturesImageUnits; - for (let slot = 0; slot < this._maxSimultaneousTextures; slot++) { - this._nextFreeTextureSlots.push(slot); - } - if (this._glRenderer === "Mali-G72") { - this._caps.disableMorphTargetTexture = true; - } - } - _initFeatures() { - this._features = { - forceBitmapOverHTMLImageElement: typeof HTMLImageElement === "undefined", - supportRenderAndCopyToLodForFloatTextures: this._webGLVersion !== 1, - supportDepthStencilTexture: this._webGLVersion !== 1, - supportShadowSamplers: this._webGLVersion !== 1, - uniformBufferHardCheckMatrix: false, - allowTexturePrefiltering: this._webGLVersion !== 1, - trackUbosInFrame: false, - checkUbosContentBeforeUpload: false, - supportCSM: this._webGLVersion !== 1, - basisNeedsPOT: this._webGLVersion === 1, - support3DTextures: this._webGLVersion !== 1, - needTypeSuffixInShaderConstants: this._webGLVersion !== 1, - supportMSAA: this._webGLVersion !== 1, - supportSSAO2: this._webGLVersion !== 1, - supportExtendedTextureFormats: this._webGLVersion !== 1, - supportSwitchCaseInShader: this._webGLVersion !== 1, - supportSyncTextureRead: true, - needsInvertingBitmap: true, - useUBOBindingCache: true, - needShaderCodeInlining: false, - needToAlwaysBindUniformBuffers: false, - supportRenderPasses: false, - supportSpriteInstancing: true, - forceVertexBufferStrideAndOffsetMultiple4Bytes: false, - _collectUbosUpdatedInFrame: false - }; + /** + * Convert an angle in degrees to radians + * @param angle defines the angle to convert + * @returns the angle in radians + */ + static ToRadians(angle) { + return angle * Math.PI / 180; } /** - * Gets version of the current webGL context - * Keep it for back compat - use version instead + * Smooth angle changes (kind of low-pass filter), in particular for device orientation "shaking" + * Use trigonometric functions to avoid discontinuity (0/360, -180/180) + * @param previousAngle defines last angle value, in degrees + * @param newAngle defines new angle value, in degrees + * @param smoothFactor defines smoothing sensitivity; min 0: no smoothing, max 1: new data ignored + * @returns the angle in degrees */ - get webGLVersion() { - return this._webGLVersion; + static SmoothAngleChange(previousAngle, newAngle, smoothFactor = 0.9) { + const previousAngleRad = this.ToRadians(previousAngle); + const newAngleRad = this.ToRadians(newAngle); + return this.ToDegrees(Math.atan2((1 - smoothFactor) * Math.sin(newAngleRad) + smoothFactor * Math.sin(previousAngleRad), (1 - smoothFactor) * Math.cos(newAngleRad) + smoothFactor * Math.cos(previousAngleRad))); } /** - * Gets a string identifying the name of the class - * @returns "Engine" string + * Returns an array if obj is not an array + * @param obj defines the object to evaluate as an array + * @param allowsNullUndefined defines a boolean indicating if obj is allowed to be null or undefined + * @returns either obj directly if obj is an array or a new array containing obj */ - getClassName() { - return "ThinEngine"; + static MakeArray(obj, allowsNullUndefined) { + if (allowsNullUndefined !== true && (obj === void 0 || obj == null)) { + return null; + } + return Array.isArray(obj) ? obj : [obj]; } /** - * Returns true if the stencil buffer has been enabled through the creation option of the context. + * Gets the pointer prefix to use + * @param engine defines the engine we are finding the prefix for + * @returns "pointer" if touch is enabled. Else returns "mouse" */ - get isStencilEnable() { - return this._isStencilEnable; - } - /** @internal */ - _prepareWorkingCanvas() { - if (this._workingCanvas) { - return; + static GetPointerPrefix(engine) { + let eventPrefix = "pointer"; + if (IsWindowObjectExist() && !window.PointerEvent) { + eventPrefix = "mouse"; } - this._workingCanvas = this.createCanvas(1, 1); - const context = this._workingCanvas.getContext("2d"); - if (context) { - this._workingContext = context; + if (engine._badDesktopOS && !engine._badOS && // And not ipad pros who claim to be macs... + !(document && "ontouchend" in document)) { + eventPrefix = "mouse"; } + return eventPrefix; } /** - * Reset the texture cache to empty state + * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element. + * @param url define the url we are trying + * @param element define the dom element where to configure the cors policy + * @param element.crossOrigin */ - resetTextureCache() { - for (const key in this._boundTexturesCache) { - if (!Object.prototype.hasOwnProperty.call(this._boundTexturesCache, key)) { - continue; - } - this._boundTexturesCache[key] = null; - } - this._currentTextureChannel = -1; + static SetCorsBehavior(url, element) { + SetCorsBehavior(url, element); } /** - * Gets an object containing information about the current engine context - * @returns an object containing the vendor, the renderer and the version of the current engine context + * Sets the referrerPolicy behavior on a dom element. + * @param referrerPolicy define the referrer policy to use + * @param element define the dom element where to configure the referrer policy + * @param element.referrerPolicy */ - getInfo() { - return this.getGlInfo(); + static SetReferrerPolicyBehavior(referrerPolicy, element) { + element.referrerPolicy = referrerPolicy; } + // External files /** - * Gets an object containing information about the current webGL context - * @returns an object containing the vendor, the renderer and the version of the current webGL context + * Removes unwanted characters from an url + * @param url defines the url to clean + * @returns the cleaned url */ - getGlInfo() { - return { - vendor: this._glVendor, - renderer: this._glRenderer, - version: this._glVersion - }; + static CleanUrl(url) { + url = url.replace(/#/gm, "%23"); + return url; } /** - * Defines the hardware scaling level. - * By default the hardware scaling level is computed from the window device ratio. - * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas. - * @param level defines the level to use + * Gets or sets a function used to pre-process url before using them to load assets */ - setHardwareScalingLevel(level) { - this._hardwareScalingLevel = level; - this.resize(); + static get PreprocessUrl() { + return FileToolsOptions.PreprocessUrl; + } + static set PreprocessUrl(processor) { + FileToolsOptions.PreprocessUrl = processor; } /** - * Gets the current hardware scaling level. - * By default the hardware scaling level is computed from the window device ratio. - * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas. - * @returns a number indicating the current hardware scaling level + * Loads an image as an HTMLImageElement. + * @param input url string, ArrayBuffer, or Blob to load + * @param onLoad callback called when the image successfully loads + * @param onError callback called when the image fails to load + * @param offlineProvider offline provider for caching + * @param mimeType optional mime type + * @param imageBitmapOptions optional the options to use when creating an ImageBitmap + * @returns the HTMLImageElement of the loaded image */ - getHardwareScalingLevel() { - return this._hardwareScalingLevel; + static LoadImage(input, onLoad, onError, offlineProvider, mimeType, imageBitmapOptions) { + return LoadImage(input, onLoad, onError, offlineProvider, mimeType, imageBitmapOptions); } /** - * Gets the list of loaded textures - * @returns an array containing all loaded textures + * Loads a file from a url + * @param url url string, ArrayBuffer, or Blob to load + * @param onSuccess callback called when the file successfully loads + * @param onProgress callback called while file is loading (if the server supports this mode) + * @param offlineProvider defines the offline provider for caching + * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer + * @param onError callback called when the file fails to load + * @returns a file request object */ - getLoadedTexturesCache() { - return this._internalTexturesCache; + static LoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError) { + return LoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError); } /** - * Gets the object containing all engine capabilities - * @returns the EngineCapabilities object + * Loads a file from a url + * @param url the file url to load + * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer + * @returns a promise containing an ArrayBuffer corresponding to the loaded file */ - getCaps() { - return this._caps; + static LoadFileAsync(url, useArrayBuffer = true) { + return new Promise((resolve, reject) => { + LoadFile(url, (data) => { + resolve(data); + }, void 0, void 0, useArrayBuffer, (request, exception) => { + reject(exception); + }); + }); } /** - * stop executing a render loop function and remove it from the execution array - * @param renderFunction defines the function to be removed. If not provided all functions will be removed. + * Get a script URL including preprocessing + * @param scriptUrl the script Url to process + * @param forceAbsoluteUrl force the script to be an absolute url (adding the current base url if necessary) + * @returns a modified URL to use */ - stopRenderLoop(renderFunction) { - if (!renderFunction) { - this._activeRenderLoops.length = 0; - this._cancelFrame(); - return; - } - const index = this._activeRenderLoops.indexOf(renderFunction); - if (index >= 0) { - this._activeRenderLoops.splice(index, 1); - if (this._activeRenderLoops.length == 0) { - this._cancelFrame(); - } - } - } - _cancelFrame() { - if (this._frameHandler !== 0) { - const handlerToCancel = this._frameHandler; - this._frameHandler = 0; - if (!IsWindowObjectExist()) { - if (typeof cancelAnimationFrame === "function") { - return cancelAnimationFrame(handlerToCancel); - } - } else { - const { cancelAnimationFrame: cancelAnimationFrame2 } = this.getHostWindow() || window; - if (typeof cancelAnimationFrame2 === "function") { - return cancelAnimationFrame2(handlerToCancel); - } - } - return clearTimeout(handlerToCancel); + static GetBabylonScriptURL(scriptUrl, forceAbsoluteUrl) { + if (!scriptUrl) { + return ""; } - } - /** @internal */ - _renderLoop() { - this._frameHandler = 0; - if (!this._contextWasLost) { - let shouldRender = true; - if (this._isDisposed || !this.renderEvenInBackground && this._windowIsBackground) { - shouldRender = false; - } - if (shouldRender) { - this.beginFrame(); - for (let index = 0; index < this._activeRenderLoops.length; index++) { - const renderFunction = this._activeRenderLoops[index]; - renderFunction(); - } - this.endFrame(); - } + if (_Tools.ScriptBaseUrl && scriptUrl.startsWith(_Tools._DefaultCdnUrl)) { + const baseUrl = _Tools.ScriptBaseUrl[_Tools.ScriptBaseUrl.length - 1] === "/" ? _Tools.ScriptBaseUrl.substring(0, _Tools.ScriptBaseUrl.length - 1) : _Tools.ScriptBaseUrl; + scriptUrl = scriptUrl.replace(_Tools._DefaultCdnUrl, baseUrl); } - if (this._frameHandler === 0) { - this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow()); + scriptUrl = _Tools.ScriptPreprocessUrl(scriptUrl); + if (forceAbsoluteUrl) { + scriptUrl = _Tools.GetAbsoluteUrl(scriptUrl); } + return scriptUrl; } /** - * Gets the HTML canvas attached with the current webGL context - * @returns a HTML canvas - */ - getRenderingCanvas() { - return this._renderingCanvas; - } - /** - * Gets the audio context specified in engine initialization options - * @returns an Audio Context + * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the + * content of this file is added into a new script element, attached to the DOM (body element) + * @param scriptUrl defines the url of the script to load + * @param onSuccess defines the callback called when the script is loaded + * @param onError defines the callback to call if an error occurs + * @param scriptId defines the id of the script element */ - getAudioContext() { - return this._audioContext; + static LoadBabylonScript(scriptUrl, onSuccess, onError, scriptId) { + scriptUrl = _Tools.GetBabylonScriptURL(scriptUrl); + _Tools.LoadScript(scriptUrl, onSuccess, onError); } /** - * Gets the audio destination specified in engine initialization options - * @returns an audio destination node + * Load an asynchronous script (identified by an url). When the url returns, the + * content of this file is added into a new script element, attached to the DOM (body element) + * @param scriptUrl defines the url of the script to laod + * @returns a promise request object */ - getAudioDestination() { - return this._audioDestination; + static LoadBabylonScriptAsync(scriptUrl) { + scriptUrl = _Tools.GetBabylonScriptURL(scriptUrl); + return _Tools.LoadScriptAsync(scriptUrl); } /** - * Gets host window - * @returns the host window object + * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the + * content of this file is added into a new script element, attached to the DOM (body element) + * @param scriptUrl defines the url of the script to load + * @param onSuccess defines the callback called when the script is loaded + * @param onError defines the callback to call if an error occurs + * @param scriptId defines the id of the script element */ - getHostWindow() { - if (!IsWindowObjectExist()) { - return null; - } - if (this._renderingCanvas && this._renderingCanvas.ownerDocument && this._renderingCanvas.ownerDocument.defaultView) { - return this._renderingCanvas.ownerDocument.defaultView; + static LoadScript(scriptUrl, onSuccess, onError, scriptId) { + if (typeof importScripts === "function") { + try { + importScripts(scriptUrl); + onSuccess(); + } catch (e) { + onError == null ? void 0 : onError(`Unable to load script '${scriptUrl}' in worker`, e); + } + return; + } else if (!IsWindowObjectExist()) { + onError == null ? void 0 : onError(`Cannot load script '${scriptUrl}' outside of a window or a worker`); + return; } - return window; - } - /** - * Gets the current render width - * @param useScreen defines if screen size must be used (or the current render target if any) - * @returns a number defining the current render width - */ - getRenderWidth(useScreen = false) { - if (!useScreen && this._currentRenderTarget) { - return this._currentRenderTarget.width; - } - return this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferWidth : this._gl.drawingBufferWidth; - } - /** - * Gets the current render height - * @param useScreen defines if screen size must be used (or the current render target if any) - * @returns a number defining the current render height - */ - getRenderHeight(useScreen = false) { - if (!useScreen && this._currentRenderTarget) { - return this._currentRenderTarget.height; + const head = document.getElementsByTagName("head")[0]; + const script = document.createElement("script"); + script.setAttribute("type", "text/javascript"); + script.setAttribute("src", scriptUrl); + if (scriptId) { + script.id = scriptId; } - return this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferHeight : this._gl.drawingBufferHeight; - } - /** - * Can be used to override the current requestAnimationFrame requester. - * @internal - */ - _queueNewFrame(bindedRenderFunction, requester) { - return _ThinEngine.QueueNewFrame(bindedRenderFunction, requester); + script.onload = () => { + if (onSuccess) { + onSuccess(); + } + }; + script.onerror = (e) => { + if (onError) { + onError(`Unable to load script '${scriptUrl}'`, e); + } + }; + head.appendChild(script); } /** - * Register and execute a render loop. The engine can have more than one render function - * @param renderFunction defines the function to continuously execute + * Load an asynchronous script (identified by an url). When the url returns, the + * content of this file is added into a new script element, attached to the DOM (body element) + * @param scriptUrl defines the url of the script to load + * @param scriptId defines the id of the script element + * @returns a promise request object */ - runRenderLoop(renderFunction) { - if (this._activeRenderLoops.indexOf(renderFunction) !== -1) { - return; - } - this._activeRenderLoops.push(renderFunction); - if (this._activeRenderLoops.length === 1 && this._frameHandler === 0) { - this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow()); - } + static LoadScriptAsync(scriptUrl, scriptId) { + return new Promise((resolve, reject) => { + this.LoadScript(scriptUrl, () => { + resolve(); + }, (message, exception) => { + reject(exception || new Error(message)); + }, scriptId); + }); } /** - * Clear the current render buffer or the current render target (if any is set up) - * @param color defines the color to use - * @param backBuffer defines if the back buffer must be cleared - * @param depth defines if the depth buffer must be cleared - * @param stencil defines if the stencil buffer must be cleared + * Loads a file from a blob + * @param fileToLoad defines the blob to use + * @param callback defines the callback to call when data is loaded + * @param progressCallback defines the callback to call during loading process + * @returns a file request object */ - clear(color, backBuffer, depth, stencil = false) { - var _a, _b; - const useStencilGlobalOnly = this.stencilStateComposer.useStencilGlobalOnly; - this.stencilStateComposer.useStencilGlobalOnly = true; - this.applyStates(); - this.stencilStateComposer.useStencilGlobalOnly = useStencilGlobalOnly; - let mode = 0; - if (backBuffer && color) { - let setBackBufferColor = true; - if (this._currentRenderTarget) { - const textureFormat = (_a = this._currentRenderTarget.texture) == null ? void 0 : _a.format; - if (textureFormat === 8 || textureFormat === 9 || textureFormat === 10 || textureFormat === 11) { - const textureType = (_b = this._currentRenderTarget.texture) == null ? void 0 : _b.type; - if (textureType === 7 || textureType === 5) { - _ThinEngine._TempClearColorUint32[0] = color.r * 255; - _ThinEngine._TempClearColorUint32[1] = color.g * 255; - _ThinEngine._TempClearColorUint32[2] = color.b * 255; - _ThinEngine._TempClearColorUint32[3] = color.a * 255; - this._gl.clearBufferuiv(this._gl.COLOR, 0, _ThinEngine._TempClearColorUint32); - setBackBufferColor = false; - } else { - _ThinEngine._TempClearColorInt32[0] = color.r * 255; - _ThinEngine._TempClearColorInt32[1] = color.g * 255; - _ThinEngine._TempClearColorInt32[2] = color.b * 255; - _ThinEngine._TempClearColorInt32[3] = color.a * 255; - this._gl.clearBufferiv(this._gl.COLOR, 0, _ThinEngine._TempClearColorInt32); - setBackBufferColor = false; - } - } - } - if (setBackBufferColor) { - this._gl.clearColor(color.r, color.g, color.b, color.a !== void 0 ? color.a : 1); - mode |= this._gl.COLOR_BUFFER_BIT; - } - } - if (depth) { - if (this.useReverseDepthBuffer) { - this._depthCullingState.depthFunc = this._gl.GEQUAL; - this._gl.clearDepth(0); - } else { - this._gl.clearDepth(1); - } - mode |= this._gl.DEPTH_BUFFER_BIT; - } - if (stencil) { - this._gl.clearStencil(0); - mode |= this._gl.STENCIL_BUFFER_BIT; - } - this._gl.clear(mode); + static ReadFileAsDataURL(fileToLoad, callback, progressCallback) { + const reader = new FileReader(); + const request = { + onCompleteObservable: new Observable(), + abort: () => reader.abort() + }; + reader.onloadend = () => { + request.onCompleteObservable.notifyObservers(request); + }; + reader.onload = (e) => { + callback(e.target["result"]); + }; + reader.onprogress = progressCallback; + reader.readAsDataURL(fileToLoad); + return request; } /** - * @internal + * Reads a file from a File object + * @param file defines the file to load + * @param onSuccess defines the callback to call when data is loaded + * @param onProgress defines the callback to call during loading process + * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer + * @param onError defines the callback to call when an error occurs + * @returns a file request object */ - _viewport(x, y, width, height) { - if (x !== this._viewportCached.x || y !== this._viewportCached.y || width !== this._viewportCached.z || height !== this._viewportCached.w) { - this._viewportCached.x = x; - this._viewportCached.y = y; - this._viewportCached.z = width; - this._viewportCached.w = height; - this._gl.viewport(x, y, width, height); - } + static ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError) { + return ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError); } /** - * Set the WebGL's viewport - * @param viewport defines the viewport element to be used - * @param requiredWidth defines the width required for rendering. If not provided the rendering canvas' width is used - * @param requiredHeight defines the height required for rendering. If not provided the rendering canvas' height is used + * Creates a data url from a given string content + * @param content defines the content to convert + * @returns the new data url link */ - setViewport(viewport, requiredWidth, requiredHeight) { - const width = requiredWidth || this.getRenderWidth(); - const height = requiredHeight || this.getRenderHeight(); - const x = viewport.x || 0; - const y = viewport.y || 0; - this._cachedViewport = viewport; - this._viewport(x * width, y * height, width * viewport.width, height * viewport.height); + static FileAsURL(content) { + const fileBlob = new Blob([content]); + const url = window.URL; + const link = url.createObjectURL(fileBlob); + return link; } /** - * Begin a new frame + * Format the given number to a specific decimal format + * @param value defines the number to format + * @param decimals defines the number of decimals to use + * @returns the formatted string */ - beginFrame() { + static Format(value, decimals = 2) { + return value.toFixed(decimals); } /** - * Enf the current frame + * Tries to copy an object by duplicating every property + * @param source defines the source object + * @param destination defines the target object + * @param doNotCopyList defines a list of properties to avoid + * @param mustCopyList defines a list of properties to copy (even if they start with _) */ - endFrame() { - if (this._badOS) { - this.flushFramebuffer(); - } - this._frameId++; + static DeepCopy(source, destination, doNotCopyList, mustCopyList) { + DeepCopier.DeepCopy(source, destination, doNotCopyList, mustCopyList); } /** - * Resize the view according to the canvas' size - * @param forceSetSize true to force setting the sizes of the underlying canvas + * Gets a boolean indicating if the given object has no own property + * @param obj defines the object to test + * @returns true if object has no own property */ - resize(forceSetSize = false) { - let width; - let height; - if (this.adaptToDeviceRatio) { - const devicePixelRatio = IsWindowObjectExist() ? window.devicePixelRatio || 1 : 1; - const changeRatio = this._lastDevicePixelRatio / devicePixelRatio; - this._lastDevicePixelRatio = devicePixelRatio; - this._hardwareScalingLevel *= changeRatio; - } - if (IsWindowObjectExist() && IsDocumentAvailable()) { - if (this._renderingCanvas) { - const boundingRect = this._renderingCanvas.getBoundingClientRect ? this._renderingCanvas.getBoundingClientRect() : { - // fallback to last solution in case the function doesn't exist - width: this._renderingCanvas.width * this._hardwareScalingLevel, - height: this._renderingCanvas.height * this._hardwareScalingLevel - }; - width = this._renderingCanvas.clientWidth || boundingRect.width || this._renderingCanvas.width || 100; - height = this._renderingCanvas.clientHeight || boundingRect.height || this._renderingCanvas.height || 100; - } else { - width = window.innerWidth; - height = window.innerHeight; + static IsEmpty(obj) { + for (const i in obj) { + if (Object.prototype.hasOwnProperty.call(obj, i)) { + return false; } - } else { - width = this._renderingCanvas ? this._renderingCanvas.width : 100; - height = this._renderingCanvas ? this._renderingCanvas.height : 100; - } - this.setSize(width / this._hardwareScalingLevel, height / this._hardwareScalingLevel, forceSetSize); - } - /** - * Force a specific size of the canvas - * @param width defines the new canvas' width - * @param height defines the new canvas' height - * @param forceSetSize true to force setting the sizes of the underlying canvas - * @returns true if the size was changed - */ - setSize(width, height, forceSetSize = false) { - if (!this._renderingCanvas) { - return false; - } - width = width | 0; - height = height | 0; - if (!forceSetSize && this._renderingCanvas.width === width && this._renderingCanvas.height === height) { - return false; } - this._renderingCanvas.width = width; - this._renderingCanvas.height = height; return true; } /** - * Binds the frame buffer to the specified texture. - * @param rtWrapper The render target wrapper to render to - * @param faceIndex The face of the texture to render to in case of cube texture and if the render target wrapper is not a multi render target - * @param requiredWidth The width of the target to render to - * @param requiredHeight The height of the target to render to - * @param forceFullscreenViewport Forces the viewport to be the entire texture/screen if true - * @param lodLevel Defines the lod level to bind to the frame buffer - * @param layer Defines the 2d array index to bind to the frame buffer if the render target wrapper is not a multi render target + * Function used to register events at window level + * @param windowElement defines the Window object to use + * @param events defines the events to register */ - bindFramebuffer(rtWrapper, faceIndex = 0, requiredWidth, requiredHeight, forceFullscreenViewport, lodLevel = 0, layer = 0) { - var _a, _b, _c, _d, _e, _f; - const webglRTWrapper = rtWrapper; - if (this._currentRenderTarget) { - this.unBindFramebuffer(this._currentRenderTarget); - } - this._currentRenderTarget = rtWrapper; - this._bindUnboundFramebuffer(webglRTWrapper._MSAAFramebuffer ? webglRTWrapper._MSAAFramebuffer : webglRTWrapper._framebuffer); - const gl = this._gl; - if (!rtWrapper.isMulti) { - if (rtWrapper.is2DArray || rtWrapper.is3D) { - gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, (_a = rtWrapper.texture._hardwareTexture) == null ? void 0 : _a.underlyingResource, lodLevel, layer); - } else if (rtWrapper.isCube) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, (_b = rtWrapper.texture._hardwareTexture) == null ? void 0 : _b.underlyingResource, lodLevel); - } else if (webglRTWrapper._currentLOD !== lodLevel) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, (_c = rtWrapper.texture._hardwareTexture) == null ? void 0 : _c.underlyingResource, lodLevel); - webglRTWrapper._currentLOD = lodLevel; - } - } - const depthStencilTexture = rtWrapper._depthStencilTexture; - if (depthStencilTexture) { - if (rtWrapper.is3D) { - if (rtWrapper.texture.width !== depthStencilTexture.width || rtWrapper.texture.height !== depthStencilTexture.height || rtWrapper.texture.depth !== depthStencilTexture.depth) { - Logger.Warn("Depth/Stencil attachment for 3D target must have same dimensions as color attachment"); - } - } - const attachment = rtWrapper._depthStencilTextureWithStencil ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT; - if (rtWrapper.is2DArray || rtWrapper.is3D) { - gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachment, (_d = depthStencilTexture._hardwareTexture) == null ? void 0 : _d.underlyingResource, lodLevel, layer); - } else if (rtWrapper.isCube) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, (_e = depthStencilTexture._hardwareTexture) == null ? void 0 : _e.underlyingResource, lodLevel); - } else { - gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, (_f = depthStencilTexture._hardwareTexture) == null ? void 0 : _f.underlyingResource, lodLevel); - } - } - if (this._cachedViewport && !forceFullscreenViewport) { - this.setViewport(this._cachedViewport, requiredWidth, requiredHeight); - } else { - if (!requiredWidth) { - requiredWidth = rtWrapper.width; - if (lodLevel) { - requiredWidth = requiredWidth / Math.pow(2, lodLevel); - } - } - if (!requiredHeight) { - requiredHeight = rtWrapper.height; - if (lodLevel) { - requiredHeight = requiredHeight / Math.pow(2, lodLevel); + static RegisterTopRootEvents(windowElement, events) { + for (let index = 0; index < events.length; index++) { + const event = events[index]; + windowElement.addEventListener(event.name, event.handler, false); + try { + if (window.parent) { + window.parent.addEventListener(event.name, event.handler, false); } + } catch (e) { } - this._viewport(0, 0, requiredWidth, requiredHeight); } - this.wipeCaches(); } /** - * Set various states to the webGL context - * @param culling defines culling state: true to enable culling, false to disable it - * @param zOffset defines the value to apply to zOffset (0 by default) - * @param force defines if states must be applied even if cache is up to date - * @param reverseSide defines if culling must be reversed (CCW if false, CW if true) - * @param cullBackFaces true to cull back faces, false to cull front faces (if culling is enabled) - * @param stencil stencil states to set - * @param zOffsetUnits defines the value to apply to zOffsetUnits (0 by default) + * Function used to unregister events from window level + * @param windowElement defines the Window object to use + * @param events defines the events to unregister */ - setState(culling, zOffset = 0, force, reverseSide = false, cullBackFaces, stencil, zOffsetUnits = 0) { - if (this._depthCullingState.cull !== culling || force) { - this._depthCullingState.cull = culling; - } - const cullFace = this.cullBackFaces ?? cullBackFaces ?? true ? this._gl.BACK : this._gl.FRONT; - if (this._depthCullingState.cullFace !== cullFace || force) { - this._depthCullingState.cullFace = cullFace; - } - this.setZOffset(zOffset); - this.setZOffsetUnits(zOffsetUnits); - const frontFace = reverseSide ? this._gl.CW : this._gl.CCW; - if (this._depthCullingState.frontFace !== frontFace || force) { - this._depthCullingState.frontFace = frontFace; + static UnregisterTopRootEvents(windowElement, events) { + for (let index = 0; index < events.length; index++) { + const event = events[index]; + windowElement.removeEventListener(event.name, event.handler); + try { + if (windowElement.parent) { + windowElement.parent.removeEventListener(event.name, event.handler); + } + } catch (e) { + } } - this._stencilStateComposer.stencilMaterial = stencil; } /** - * Gets a boolean indicating if depth testing is enabled - * @returns the current state + * Dumps the current bound framebuffer + * @param width defines the rendering width + * @param height defines the rendering height + * @param engine defines the hosting engine + * @param successCallback defines the callback triggered once the data are available + * @param mimeType defines the mime type of the result + * @param fileName defines the filename to download. If present, the result will automatically be downloaded + * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + * @returns a void promise */ - getDepthBuffer() { - return this._depthCullingState.depthTest; + static async DumpFramebuffer(width, height, engine, successCallback, mimeType = "image/png", fileName, quality) { + throw _WarnImport("DumpTools"); } /** - * Enable or disable depth buffering - * @param enable defines the state to set + * Dumps an array buffer + * @param width defines the rendering width + * @param height defines the rendering height + * @param data the data array + * @param successCallback defines the callback triggered once the data are available + * @param mimeType defines the mime type of the result + * @param fileName defines the filename to download. If present, the result will automatically be downloaded + * @param invertY true to invert the picture in the Y dimension + * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string + * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. */ - setDepthBuffer(enable) { - this._depthCullingState.depthTest = enable; + static DumpData(width, height, data, successCallback, mimeType = "image/png", fileName, invertY = false, toArrayBuffer = false, quality) { + throw _WarnImport("DumpTools"); } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Set the z offset Factor to apply to current rendering - * @param value defines the offset to apply + * Dumps an array buffer + * @param width defines the rendering width + * @param height defines the rendering height + * @param data the data array + * @param mimeType defines the mime type of the result + * @param fileName defines the filename to download. If present, the result will automatically be downloaded + * @param invertY true to invert the picture in the Y dimension + * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string + * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + * @returns a promise that resolve to the final data */ - setZOffset(value) { - this._depthCullingState.zOffset = this.useReverseDepthBuffer ? -value : value; + static DumpDataAsync(width, height, data, mimeType = "image/png", fileName, invertY = false, toArrayBuffer = false, quality) { + throw _WarnImport("DumpTools"); } - /** - * Gets the current value of the zOffset Factor - * @returns the current zOffset Factor state - */ - getZOffset() { - const zOffset = this._depthCullingState.zOffset; - return this.useReverseDepthBuffer ? -zOffset : zOffset; + static _IsOffScreenCanvas(canvas) { + return canvas.convertToBlob !== void 0; } /** - * Set the z offset Units to apply to current rendering - * @param value defines the offset to apply + * Converts the canvas data to blob. + * This acts as a polyfill for browsers not supporting the to blob function. + * @param canvas Defines the canvas to extract the data from (can be an offscreen canvas) + * @param successCallback Defines the callback triggered once the data are available + * @param mimeType Defines the mime type of the result + * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. */ - setZOffsetUnits(value) { - this._depthCullingState.zOffsetUnits = this.useReverseDepthBuffer ? -value : value; + static ToBlob(canvas, successCallback, mimeType = "image/png", quality) { + if (!_Tools._IsOffScreenCanvas(canvas) && !canvas.toBlob) { + canvas.toBlob = function(callback, type, quality2) { + setTimeout(() => { + const binStr = atob(this.toDataURL(type, quality2).split(",")[1]), len = binStr.length, arr = new Uint8Array(len); + for (let i = 0; i < len; i++) { + arr[i] = binStr.charCodeAt(i); + } + callback(new Blob([arr])); + }); + }; + } + if (_Tools._IsOffScreenCanvas(canvas)) { + canvas.convertToBlob({ + type: mimeType, + quality + }).then((blob) => successCallback(blob)); + } else { + canvas.toBlob(function(blob) { + successCallback(blob); + }, mimeType, quality); + } } /** - * Gets the current value of the zOffset Units - * @returns the current zOffset Units state + * Download a Blob object + * @param blob the Blob object + * @param fileName the file name to download */ - getZOffsetUnits() { - const zOffsetUnits = this._depthCullingState.zOffsetUnits; - return this.useReverseDepthBuffer ? -zOffsetUnits : zOffsetUnits; + static DownloadBlob(blob, fileName) { + if ("download" in document.createElement("a")) { + if (!fileName) { + const date = /* @__PURE__ */ new Date(); + const stringDate = (date.getFullYear() + "-" + (date.getMonth() + 1)).slice(2) + "-" + date.getDate() + "_" + date.getHours() + "-" + ("0" + date.getMinutes()).slice(-2); + fileName = "screenshot_" + stringDate + ".png"; + } + _Tools.Download(blob, fileName); + } else { + if (blob && typeof URL !== "undefined") { + const url = URL.createObjectURL(blob); + const newWindow = window.open(""); + if (!newWindow) { + return; + } + const img = newWindow.document.createElement("img"); + img.onload = function() { + URL.revokeObjectURL(url); + }; + img.src = url; + newWindow.document.body.appendChild(img); + } + } } /** - * @internal + * Encodes the canvas data to base 64, or automatically downloads the result if `fileName` is defined. + * @param canvas The canvas to get the data from, which can be an offscreen canvas. + * @param successCallback The callback which is triggered once the data is available. If `fileName` is defined, the callback will be invoked after the download occurs, and the `data` argument will be an empty string. + * @param mimeType The mime type of the result. + * @param fileName The name of the file to download. If defined, the result will automatically be downloaded. If not defined, and `successCallback` is also not defined, the result will automatically be downloaded with an auto-generated file name. + * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. */ - _bindUnboundFramebuffer(framebuffer) { - if (this._currentFramebuffer !== framebuffer) { - this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer); - this._currentFramebuffer = framebuffer; + static EncodeScreenshotCanvasData(canvas, successCallback, mimeType = "image/png", fileName, quality) { + if (typeof fileName === "string" || !successCallback) { + this.ToBlob(canvas, function(blob) { + if (blob) { + _Tools.DownloadBlob(blob, fileName); + } + if (successCallback) { + successCallback(""); + } + }, mimeType, quality); + } else if (successCallback) { + if (_Tools._IsOffScreenCanvas(canvas)) { + canvas.convertToBlob({ + type: mimeType, + quality + }).then((blob) => { + const reader = new FileReader(); + reader.readAsDataURL(blob); + reader.onloadend = () => { + const base64data = reader.result; + successCallback(base64data); + }; + }); + return; + } + const base64Image = canvas.toDataURL(mimeType, quality); + successCallback(base64Image); } } - /** @internal */ - _currentFrameBufferIsDefaultFrameBuffer() { - return this._currentFramebuffer === null; - } /** - * Generates the mipmaps for a texture - * @param texture texture to generate the mipmaps for + * Downloads a blob in the browser + * @param blob defines the blob to download + * @param fileName defines the name of the downloaded file */ - generateMipmaps(texture) { - const target = this._getTextureTarget(texture); - this._bindTextureDirectly(target, texture, true); - this._gl.generateMipmap(target); - this._bindTextureDirectly(target, null); + static Download(blob, fileName) { + if (typeof URL === "undefined") { + return; + } + const url = window.URL.createObjectURL(blob); + const a = document.createElement("a"); + document.body.appendChild(a); + a.style.display = "none"; + a.href = url; + a.download = fileName; + a.addEventListener("click", () => { + if (a.parentElement) { + a.parentElement.removeChild(a); + } + }); + a.click(); + window.URL.revokeObjectURL(url); } /** - * Unbind the current render target texture from the webGL context - * @param texture defines the render target wrapper to unbind - * @param disableGenerateMipMaps defines a boolean indicating that mipmaps must not be generated - * @param onBeforeUnbind defines a function which will be called before the effective unbind + * Will return the right value of the noPreventDefault variable + * Needed to keep backwards compatibility to the old API. + * + * @param args arguments passed to the attachControl function + * @returns the correct value for noPreventDefault */ - unBindFramebuffer(texture, disableGenerateMipMaps = false, onBeforeUnbind) { - var _a; - const webglRTWrapper = texture; - this._currentRenderTarget = null; - const gl = this._gl; - if (webglRTWrapper._MSAAFramebuffer) { - if (texture.isMulti) { - this.unBindMultiColorAttachmentFramebuffer(texture, disableGenerateMipMaps, onBeforeUnbind); - return; - } - gl.bindFramebuffer(gl.READ_FRAMEBUFFER, webglRTWrapper._MSAAFramebuffer); - gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, webglRTWrapper._framebuffer); - gl.blitFramebuffer(0, 0, texture.width, texture.height, 0, 0, texture.width, texture.height, gl.COLOR_BUFFER_BIT, gl.NEAREST); - } - if (((_a = texture.texture) == null ? void 0 : _a.generateMipMaps) && !disableGenerateMipMaps && !texture.isCube) { - this.generateMipmaps(texture.texture); - } - if (onBeforeUnbind) { - if (webglRTWrapper._MSAAFramebuffer) { - this._bindUnboundFramebuffer(webglRTWrapper._framebuffer); - } - onBeforeUnbind(); + static BackCompatCameraNoPreventDefault(args) { + if (typeof args[0] === "boolean") { + return args[0]; + } else if (typeof args[1] === "boolean") { + return args[1]; } - this._bindUnboundFramebuffer(null); + return false; } /** - * Force a webGL flush (ie. a flush of all waiting webGL commands) + * Captures a screenshot of the current rendering + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG + * @param engine defines the rendering engine + * @param camera defines the source camera + * @param size This parameter can be set to a single number or to an object with the + * following (optional) properties: precision, width, height. If a single number is passed, + * it will be used for both width and height. If an object is passed, the screenshot size + * will be derived from the parameters. The precision property is a multiplier allowing + * rendering at a higher or lower resolution + * @param successCallback defines the callback receives a single parameter which contains the + * screenshot as a string of base64-encoded characters. This string can be assigned to the + * src parameter of an to display it + * @param mimeType defines the MIME type of the screenshot image (default: image/png). + * Check your browser for supported MIME types + * @param forceDownload force the system to download the image even if a successCallback is provided + * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. */ - flushFramebuffer() { - this._gl.flush(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + static CreateScreenshot(engine, camera, size, successCallback, mimeType = "image/png", forceDownload = false, quality) { + throw _WarnImport("ScreenshotTools"); } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Unbind the current render target and bind the default framebuffer + * Captures a screenshot of the current rendering + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG + * @param engine defines the rendering engine + * @param camera defines the source camera + * @param size This parameter can be set to a single number or to an object with the + * following (optional) properties: precision, width, height. If a single number is passed, + * it will be used for both width and height. If an object is passed, the screenshot size + * will be derived from the parameters. The precision property is a multiplier allowing + * rendering at a higher or lower resolution + * @param mimeType defines the MIME type of the screenshot image (default: image/png). + * Check your browser for supported MIME types + * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + * @returns screenshot as a string of base64-encoded characters. This string can be assigned + * to the src parameter of an to display it */ - restoreDefaultFramebuffer() { - if (this._currentRenderTarget) { - this.unBindFramebuffer(this._currentRenderTarget); - } else { - this._bindUnboundFramebuffer(null); - } - if (this._cachedViewport) { - this.setViewport(this._cachedViewport); - } - this.wipeCaches(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + static CreateScreenshotAsync(engine, camera, size, mimeType = "image/png", quality) { + throw _WarnImport("ScreenshotTools"); } - // VBOs - /** @internal */ - _resetVertexBufferBinding() { - this.bindArrayBuffer(null); - this._cachedVertexBuffers = null; + /** + * Generates an image screenshot from the specified camera. + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG + * @param engine The engine to use for rendering + * @param camera The camera to use for rendering + * @param size This parameter can be set to a single number or to an object with the + * following (optional) properties: precision, width, height. If a single number is passed, + * it will be used for both width and height. If an object is passed, the screenshot size + * will be derived from the parameters. The precision property is a multiplier allowing + * rendering at a higher or lower resolution + * @param successCallback The callback receives a single parameter which contains the + * screenshot as a string of base64-encoded characters. This string can be assigned to the + * src parameter of an to display it + * @param mimeType The MIME type of the screenshot image (default: image/png). + * Check your browser for supported MIME types + * @param samples Texture samples (default: 1) + * @param antialiasing Whether antialiasing should be turned on or not (default: false) + * @param fileName A name for for the downloaded file. + * @param renderSprites Whether the sprites should be rendered or not (default: false) + * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false) + * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true) + * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + static CreateScreenshotUsingRenderTarget(engine, camera, size, successCallback, mimeType = "image/png", samples = 1, antialiasing = false, fileName, renderSprites = false, enableStencilBuffer = false, useLayerMask = true, quality) { + throw _WarnImport("ScreenshotTools"); } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Creates a vertex buffer - * @param data the data or size for the vertex buffer - * @param _updatable whether the buffer should be created as updatable - * @param _label defines the label of the buffer (for debug purpose) - * @returns the new WebGL static buffer + * Generates an image screenshot from the specified camera. + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG + * @param engine The engine to use for rendering + * @param camera The camera to use for rendering + * @param size This parameter can be set to a single number or to an object with the + * following (optional) properties: precision, width, height. If a single number is passed, + * it will be used for both width and height. If an object is passed, the screenshot size + * will be derived from the parameters. The precision property is a multiplier allowing + * rendering at a higher or lower resolution + * @param mimeType The MIME type of the screenshot image (default: image/png). + * Check your browser for supported MIME types + * @param samples Texture samples (default: 1) + * @param antialiasing Whether antialiasing should be turned on or not (default: false) + * @param fileName A name for for the downloaded file. + * @returns screenshot as a string of base64-encoded characters. This string can be assigned + * @param renderSprites Whether the sprites should be rendered or not (default: false) + * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false) + * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true) + * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + * to the src parameter of an to display it */ - createVertexBuffer(data, _updatable, _label) { - return this._createVertexBuffer(data, this._gl.STATIC_DRAW); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + static CreateScreenshotUsingRenderTargetAsync(engine, camera, size, mimeType = "image/png", samples = 1, antialiasing = false, fileName, renderSprites = false, enableStencilBuffer = false, useLayerMask = true, quality) { + throw _WarnImport("ScreenshotTools"); } - _createVertexBuffer(data, usage) { - const vbo = this._gl.createBuffer(); - if (!vbo) { - throw new Error("Unable to create vertex buffer"); - } - const dataBuffer = new WebGLDataBuffer(vbo); - this.bindArrayBuffer(dataBuffer); - if (typeof data !== "number") { - if (data instanceof Array) { - this._gl.bufferData(this._gl.ARRAY_BUFFER, new Float32Array(data), usage); - dataBuffer.capacity = data.length * 4; - } else { - this._gl.bufferData(this._gl.ARRAY_BUFFER, data, usage); - dataBuffer.capacity = data.byteLength; - } - } else { - this._gl.bufferData(this._gl.ARRAY_BUFFER, new Uint8Array(data), usage); - dataBuffer.capacity = data; - } - this._resetVertexBufferBinding(); - dataBuffer.references = 1; - return dataBuffer; + /** + * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523 + * Be aware Math.random() could cause collisions, but: + * "All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide" + * @returns a pseudo random id + */ + static RandomId() { + return RandomGUID(); } /** - * Creates a dynamic vertex buffer - * @param data the data for the dynamic vertex buffer - * @param _label defines the label of the buffer (for debug purpose) - * @returns the new WebGL dynamic buffer + * Test if the given uri is a base64 string + * @deprecated Please use FileTools.IsBase64DataUrl instead. + * @param uri The uri to test + * @returns True if the uri is a base64 string or false otherwise */ - createDynamicVertexBuffer(data, _label) { - return this._createVertexBuffer(data, this._gl.DYNAMIC_DRAW); + static IsBase64(uri) { + return IsBase64DataUrl(uri); } - _resetIndexBufferBinding() { - this.bindIndexBuffer(null); - this._cachedIndexBuffer = null; + /** + * Decode the given base64 uri. + * @deprecated Please use FileTools.DecodeBase64UrlToBinary instead. + * @param uri The uri to decode + * @returns The decoded base64 data. + */ + static DecodeBase64(uri) { + return DecodeBase64UrlToBinary(uri); } /** - * Creates a new index buffer - * @param indices defines the content of the index buffer - * @param updatable defines if the index buffer must be updatable - * @param _label defines the label of the buffer (for debug purpose) - * @returns a new webGL buffer + * Gets a value indicating the number of loading errors + * @ignorenaming */ - createIndexBuffer(indices, updatable, _label) { - const vbo = this._gl.createBuffer(); - const dataBuffer = new WebGLDataBuffer(vbo); - if (!vbo) { - throw new Error("Unable to create index buffer"); - } - this.bindIndexBuffer(dataBuffer); - const data = this._normalizeIndexData(indices); - this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, data, updatable ? this._gl.DYNAMIC_DRAW : this._gl.STATIC_DRAW); - this._resetIndexBufferBinding(); - dataBuffer.references = 1; - dataBuffer.is32Bits = data.BYTES_PER_ELEMENT === 4; - return dataBuffer; + // eslint-disable-next-line @typescript-eslint/naming-convention + static get errorsCount() { + return Logger.errorsCount; } - _normalizeIndexData(indices) { - const bytesPerElement = indices.BYTES_PER_ELEMENT; - if (bytesPerElement === 2) { - return indices; - } - if (this._caps.uintIndices) { - if (indices instanceof Uint32Array) { - return indices; - } else { - for (let index = 0; index < indices.length; index++) { - if (indices[index] >= 65535) { - return new Uint32Array(indices); - } - } - return new Uint16Array(indices); - } - } - return new Uint16Array(indices); + /** + * Log a message to the console + * @param message defines the message to log + */ + static Log(message) { + Logger.Log(message); } /** - * Bind a webGL buffer to the webGL context - * @param buffer defines the buffer to bind + * Write a warning message to the console + * @param message defines the message to log */ - bindArrayBuffer(buffer) { - if (!this._vaoRecordInProgress) { - this._unbindVertexArrayObject(); - } - this._bindBuffer(buffer, this._gl.ARRAY_BUFFER); + static Warn(message) { + Logger.Warn(message); } /** - * Bind a specific block at a given index in a specific shader program - * @param pipelineContext defines the pipeline context to use - * @param blockName defines the block name - * @param index defines the index where to bind the block + * Write an error message to the console + * @param message defines the message to log */ - bindUniformBlock(pipelineContext, blockName, index) { - const program = pipelineContext.program; - const uniformLocation = this._gl.getUniformBlockIndex(program, blockName); - this._gl.uniformBlockBinding(program, uniformLocation, index); + static Error(message) { + Logger.Error(message); } - // eslint-disable-next-line @typescript-eslint/naming-convention - bindIndexBuffer(buffer) { - if (!this._vaoRecordInProgress) { - this._unbindVertexArrayObject(); - } - this._bindBuffer(buffer, this._gl.ELEMENT_ARRAY_BUFFER); + /** + * Gets current log cache (list of logs) + */ + static get LogCache() { + return Logger.LogCache; } - _bindBuffer(buffer, target) { - if (this._vaoRecordInProgress || this._currentBoundBuffer[target] !== buffer) { - this._gl.bindBuffer(target, buffer ? buffer.underlyingResource : null); - this._currentBoundBuffer[target] = buffer; - } + /** + * Clears the log cache + */ + static ClearLogCache() { + Logger.ClearLogCache(); } /** - * update the bound buffer with the given data - * @param data defines the data to update + * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel) */ - updateArrayBuffer(data) { - this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data); + static set LogLevels(level) { + Logger.LogLevels = level; } - _vertexAttribPointer(buffer, indx, size, type, normalized, stride, offset) { - const pointer = this._currentBufferPointers[indx]; - if (!pointer) { + /** + * Sets the current performance log level + */ + static set PerformanceLogLevel(level) { + if ((level & _Tools.PerformanceUserMarkLogLevel) === _Tools.PerformanceUserMarkLogLevel) { + _Tools.StartPerformanceCounter = _Tools._StartUserMark; + _Tools.EndPerformanceCounter = _Tools._EndUserMark; return; } - let changed = false; - if (!pointer.active) { - changed = true; - pointer.active = true; - pointer.index = indx; - pointer.size = size; - pointer.type = type; - pointer.normalized = normalized; - pointer.stride = stride; - pointer.offset = offset; - pointer.buffer = buffer; - } else { - if (pointer.buffer !== buffer) { - pointer.buffer = buffer; - changed = true; - } - if (pointer.size !== size) { - pointer.size = size; - changed = true; - } - if (pointer.type !== type) { - pointer.type = type; - changed = true; - } - if (pointer.normalized !== normalized) { - pointer.normalized = normalized; - changed = true; - } - if (pointer.stride !== stride) { - pointer.stride = stride; - changed = true; - } - if (pointer.offset !== offset) { - pointer.offset = offset; - changed = true; - } + if ((level & _Tools.PerformanceConsoleLogLevel) === _Tools.PerformanceConsoleLogLevel) { + _Tools.StartPerformanceCounter = _Tools._StartPerformanceConsole; + _Tools.EndPerformanceCounter = _Tools._EndPerformanceConsole; + return; } - if (changed || this._vaoRecordInProgress) { - this.bindArrayBuffer(buffer); - if (type === this._gl.UNSIGNED_INT || type === this._gl.INT) { - this._gl.vertexAttribIPointer(indx, size, type, stride, offset); - } else { - this._gl.vertexAttribPointer(indx, size, type, normalized, stride, offset); + _Tools.StartPerformanceCounter = _Tools._StartPerformanceCounterDisabled; + _Tools.EndPerformanceCounter = _Tools._EndPerformanceCounterDisabled; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + static _StartPerformanceCounterDisabled(counterName, condition) { + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + static _EndPerformanceCounterDisabled(counterName, condition) { + } + static _StartUserMark(counterName, condition = true) { + if (!_Tools._Performance) { + if (!IsWindowObjectExist()) { + return; } + _Tools._Performance = window.performance; } - } - /** - * @internal - */ - _bindIndexBufferWithCache(indexBuffer) { - if (indexBuffer == null) { + if (!condition || !_Tools._Performance.mark) { return; } - if (this._cachedIndexBuffer !== indexBuffer) { - this._cachedIndexBuffer = indexBuffer; - this.bindIndexBuffer(indexBuffer); - this._uintIndicesCurrentlySet = indexBuffer.is32Bits; + _Tools._Performance.mark(counterName + "-Begin"); + } + static _EndUserMark(counterName, condition = true) { + if (!condition || !_Tools._Performance.mark) { + return; } + _Tools._Performance.mark(counterName + "-End"); + _Tools._Performance.measure(counterName, counterName + "-Begin", counterName + "-End"); } - _bindVertexBuffersAttributes(vertexBuffers, effect, overrideVertexBuffers) { - const attributes = effect.getAttributesNames(); - if (!this._vaoRecordInProgress) { - this._unbindVertexArrayObject(); + static _StartPerformanceConsole(counterName, condition = true) { + if (!condition) { + return; } - this.unbindAllAttributes(); - for (let index = 0; index < attributes.length; index++) { - const order = effect.getAttributeLocation(index); - if (order >= 0) { - const ai = attributes[index]; - let vertexBuffer = null; - if (overrideVertexBuffers) { - vertexBuffer = overrideVertexBuffers[ai]; - } - if (!vertexBuffer) { - vertexBuffer = vertexBuffers[ai]; - } - if (!vertexBuffer) { - continue; - } - this._gl.enableVertexAttribArray(order); - if (!this._vaoRecordInProgress) { - this._vertexAttribArraysEnabled[order] = true; - } - const buffer = vertexBuffer.getBuffer(); - if (buffer) { - this._vertexAttribPointer(buffer, order, vertexBuffer.getSize(), vertexBuffer.type, vertexBuffer.normalized, vertexBuffer.byteStride, vertexBuffer.byteOffset); - if (vertexBuffer.getIsInstanced()) { - this._gl.vertexAttribDivisor(order, vertexBuffer.getInstanceDivisor()); - if (!this._vaoRecordInProgress) { - this._currentInstanceLocations.push(order); - this._currentInstanceBuffers.push(buffer); - } - } - } - } + _Tools._StartUserMark(counterName, condition); + if (console.time) { + console.time(counterName); } } - /** - * Records a vertex array object - * @see https://doc.babylonjs.com/setup/support/webGL2#vertex-array-objects - * @param vertexBuffers defines the list of vertex buffers to store - * @param indexBuffer defines the index buffer to store - * @param effect defines the effect to store - * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers - * @returns the new vertex array object - */ - recordVertexArrayObject(vertexBuffers, indexBuffer, effect, overrideVertexBuffers) { - const vao = this._gl.createVertexArray(); - if (!vao) { - throw new Error("Unable to create VAO"); + static _EndPerformanceConsole(counterName, condition = true) { + if (!condition) { + return; } - this._vaoRecordInProgress = true; - this._gl.bindVertexArray(vao); - this._mustWipeVertexAttributes = true; - this._bindVertexBuffersAttributes(vertexBuffers, effect, overrideVertexBuffers); - this.bindIndexBuffer(indexBuffer); - this._vaoRecordInProgress = false; - this._gl.bindVertexArray(null); - return vao; + _Tools._EndUserMark(counterName, condition); + console.timeEnd(counterName); } /** - * Bind a specific vertex array object - * @see https://doc.babylonjs.com/setup/support/webGL2#vertex-array-objects - * @param vertexArrayObject defines the vertex array object to bind - * @param indexBuffer defines the index buffer to bind + * Gets either window.performance.now() if supported or Date.now() else */ - bindVertexArrayObject(vertexArrayObject, indexBuffer) { - if (this._cachedVertexArrayObject !== vertexArrayObject) { - this._cachedVertexArrayObject = vertexArrayObject; - this._gl.bindVertexArray(vertexArrayObject); - this._cachedVertexBuffers = null; - this._cachedIndexBuffer = null; - this._uintIndicesCurrentlySet = indexBuffer != null && indexBuffer.is32Bits; - this._mustWipeVertexAttributes = true; - } + static get Now() { + return PrecisionDate.Now; } /** - * Bind webGl buffers directly to the webGL context - * @param vertexBuffer defines the vertex buffer to bind - * @param indexBuffer defines the index buffer to bind - * @param vertexDeclaration defines the vertex declaration to use with the vertex buffer - * @param vertexStrideSize defines the vertex stride of the vertex buffer - * @param effect defines the effect associated with the vertex buffer - */ - bindBuffersDirectly(vertexBuffer, indexBuffer, vertexDeclaration, vertexStrideSize, effect) { - if (this._cachedVertexBuffers !== vertexBuffer || this._cachedEffectForVertexBuffers !== effect) { - this._cachedVertexBuffers = vertexBuffer; - this._cachedEffectForVertexBuffers = effect; - const attributesCount = effect.getAttributesCount(); - this._unbindVertexArrayObject(); - this.unbindAllAttributes(); - let offset = 0; - for (let index = 0; index < attributesCount; index++) { - if (index < vertexDeclaration.length) { - const order = effect.getAttributeLocation(index); - if (order >= 0) { - this._gl.enableVertexAttribArray(order); - this._vertexAttribArraysEnabled[order] = true; - this._vertexAttribPointer(vertexBuffer, order, vertexDeclaration[index], this._gl.FLOAT, false, vertexStrideSize, offset); - } - offset += vertexDeclaration[index] * 4; - } - } - } - this._bindIndexBufferWithCache(indexBuffer); - } - _unbindVertexArrayObject() { - if (!this._cachedVertexArrayObject) { - return; - } - this._cachedVertexArrayObject = null; - this._gl.bindVertexArray(null); - } - /** - * Bind a list of vertex buffers to the webGL context - * @param vertexBuffers defines the list of vertex buffers to bind - * @param indexBuffer defines the index buffer to bind - * @param effect defines the effect associated with the vertex buffers - * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers - */ - bindBuffers(vertexBuffers, indexBuffer, effect, overrideVertexBuffers) { - if (this._cachedVertexBuffers !== vertexBuffers || this._cachedEffectForVertexBuffers !== effect) { - this._cachedVertexBuffers = vertexBuffers; - this._cachedEffectForVertexBuffers = effect; - this._bindVertexBuffersAttributes(vertexBuffers, effect, overrideVertexBuffers); - } - this._bindIndexBufferWithCache(indexBuffer); - } - /** - * Unbind all instance attributes + * This method will return the name of the class used to create the instance of the given object. + * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator. + * @param object the object to get the class name from + * @param isType defines if the object is actually a type + * @returns the name of the class, will be "object" for a custom data type not using the @className decorator */ - unbindInstanceAttributes() { - let boundBuffer; - for (let i = 0, ul = this._currentInstanceLocations.length; i < ul; i++) { - const instancesBuffer = this._currentInstanceBuffers[i]; - if (boundBuffer != instancesBuffer && instancesBuffer.references) { - boundBuffer = instancesBuffer; - this.bindArrayBuffer(instancesBuffer); + static GetClassName(object, isType = false) { + let name69 = null; + if (!isType && object.getClassName) { + name69 = object.getClassName(); + } else { + if (object instanceof Object) { + const classObj = isType ? object : Object.getPrototypeOf(object); + name69 = classObj.constructor["__bjsclassName__"]; + } + if (!name69) { + name69 = typeof object; } - const offsetLocation = this._currentInstanceLocations[i]; - this._gl.vertexAttribDivisor(offsetLocation, 0); } - this._currentInstanceBuffers.length = 0; - this._currentInstanceLocations.length = 0; - } - /** - * Release and free the memory of a vertex array object - * @param vao defines the vertex array object to delete - */ - releaseVertexArrayObject(vao) { - this._gl.deleteVertexArray(vao); + return name69; } /** - * @internal + * Gets the first element of an array satisfying a given predicate + * @param array defines the array to browse + * @param predicate defines the predicate to use + * @returns null if not found or the element */ - _releaseBuffer(buffer) { - buffer.references--; - if (buffer.references === 0) { - this._deleteBuffer(buffer); - return true; + static First(array, predicate) { + for (const el of array) { + if (predicate(el)) { + return el; + } } - return false; - } - _deleteBuffer(buffer) { - this._gl.deleteBuffer(buffer.underlyingResource); + return null; } /** - * Update the content of a webGL buffer used with instantiation and bind it to the webGL context - * @param instancesBuffer defines the webGL buffer to update and bind - * @param data defines the data to store in the buffer - * @param offsetLocations defines the offsets or attributes information used to determine where data must be stored in the buffer + * This method will return the name of the full name of the class, including its owning module (if any). + * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator or implementing a method getClassName():string (in which case the module won't be specified). + * @param object the object to get the class name from + * @param isType defines if the object is actually a type + * @returns a string that can have two forms: "moduleName.className" if module was specified when the class' Name was registered or "className" if there was not module specified. + * @ignorenaming */ - updateAndBindInstancesBuffer(instancesBuffer, data, offsetLocations) { - this.bindArrayBuffer(instancesBuffer); - if (data) { - this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data); - } - if (offsetLocations[0].index !== void 0) { - this.bindInstancesBuffer(instancesBuffer, offsetLocations, true); + // eslint-disable-next-line @typescript-eslint/naming-convention + static getFullClassName(object, isType = false) { + let className2 = null; + let moduleName = null; + if (!isType && object.getClassName) { + className2 = object.getClassName(); } else { - for (let index = 0; index < 4; index++) { - const offsetLocation = offsetLocations[index]; - if (!this._vertexAttribArraysEnabled[offsetLocation]) { - this._gl.enableVertexAttribArray(offsetLocation); - this._vertexAttribArraysEnabled[offsetLocation] = true; - } - this._vertexAttribPointer(instancesBuffer, offsetLocation, 4, this._gl.FLOAT, false, 64, index * 16); - this._gl.vertexAttribDivisor(offsetLocation, 1); - this._currentInstanceLocations.push(offsetLocation); - this._currentInstanceBuffers.push(instancesBuffer); + if (object instanceof Object) { + const classObj = isType ? object : Object.getPrototypeOf(object); + className2 = classObj.constructor["__bjsclassName__"]; + moduleName = classObj.constructor["__bjsmoduleName__"]; } - } - } - /** - * Bind the content of a webGL buffer used with instantiation - * @param instancesBuffer defines the webGL buffer to bind - * @param attributesInfo defines the offsets or attributes information used to determine where data must be stored in the buffer - * @param computeStride defines Whether to compute the strides from the info or use the default 0 - */ - bindInstancesBuffer(instancesBuffer, attributesInfo, computeStride = true) { - this.bindArrayBuffer(instancesBuffer); - let stride = 0; - if (computeStride) { - for (let i = 0; i < attributesInfo.length; i++) { - const ai = attributesInfo[i]; - stride += ai.attributeSize * 4; + if (!className2) { + className2 = typeof object; } } - for (let i = 0; i < attributesInfo.length; i++) { - const ai = attributesInfo[i]; - if (ai.index === void 0) { - ai.index = this._currentEffect.getAttributeLocationByName(ai.attributeName); - } - if (ai.index < 0) { - continue; - } - if (!this._vertexAttribArraysEnabled[ai.index]) { - this._gl.enableVertexAttribArray(ai.index); - this._vertexAttribArraysEnabled[ai.index] = true; - } - this._vertexAttribPointer(instancesBuffer, ai.index, ai.attributeSize, ai.attributeType || this._gl.FLOAT, ai.normalized || false, stride, ai.offset); - this._gl.vertexAttribDivisor(ai.index, ai.divisor === void 0 ? 1 : ai.divisor); - this._currentInstanceLocations.push(ai.index); - this._currentInstanceBuffers.push(instancesBuffer); + if (!className2) { + return null; } + return (moduleName != null ? moduleName + "." : "") + className2; } /** - * Disable the instance attribute corresponding to the name in parameter - * @param name defines the name of the attribute to disable + * Returns a promise that resolves after the given amount of time. + * @param delay Number of milliseconds to delay + * @returns Promise that resolves after the given amount of time */ - disableInstanceAttributeByName(name69) { - if (!this._currentEffect) { - return; - } - const attributeLocation = this._currentEffect.getAttributeLocationByName(name69); - this.disableInstanceAttribute(attributeLocation); + static DelayAsync(delay) { + return new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, delay); + }); } /** - * Disable the instance attribute corresponding to the location in parameter - * @param attributeLocation defines the attribute location of the attribute to disable + * Utility function to detect if the current user agent is Safari + * @returns whether or not the current user agent is safari */ - disableInstanceAttribute(attributeLocation) { - let shouldClean = false; - let index; - while ((index = this._currentInstanceLocations.indexOf(attributeLocation)) !== -1) { - this._currentInstanceLocations.splice(index, 1); - this._currentInstanceBuffers.splice(index, 1); - shouldClean = true; - index = this._currentInstanceLocations.indexOf(attributeLocation); - } - if (shouldClean) { - this._gl.vertexAttribDivisor(attributeLocation, 0); - this.disableAttributeByIndex(attributeLocation); + static IsSafari() { + if (!IsNavigatorAvailable()) { + return false; } + return /^((?!chrome|android).)*safari/i.test(navigator.userAgent); } +}; +Tools.UseCustomRequestHeaders = false; +Tools.CustomRequestHeaders = WebRequest.CustomRequestHeaders; +Tools.GetDOMTextContent = GetDOMTextContent; +Tools._DefaultCdnUrl = "https://cdn.babylonjs.com"; +Tools.GetAbsoluteUrl = typeof document === "object" ? (url) => { + const a = document.createElement("a"); + a.href = url; + return a.href; +} : typeof URL === "function" && typeof location === "object" ? (url) => new URL(url, location.origin).href : () => { + throw new Error("Unable to get absolute URL. Override BABYLON.Tools.GetAbsoluteUrl to a custom implementation for the current context."); +}; +Tools.NoneLogLevel = Logger.NoneLogLevel; +Tools.MessageLogLevel = Logger.MessageLogLevel; +Tools.WarningLogLevel = Logger.WarningLogLevel; +Tools.ErrorLogLevel = Logger.ErrorLogLevel; +Tools.AllLogLevel = Logger.AllLogLevel; +Tools.IsWindowObjectExist = IsWindowObjectExist; +Tools.PerformanceNoneLogLevel = 0; +Tools.PerformanceUserMarkLogLevel = 1; +Tools.PerformanceConsoleLogLevel = 2; +Tools.StartPerformanceCounter = Tools._StartPerformanceCounterDisabled; +Tools.EndPerformanceCounter = Tools._EndPerformanceCounterDisabled; +function className(name69, module) { + return (target) => { + target["__bjsclassName__"] = name69; + target["__bjsmoduleName__"] = module != null ? module : null; + }; +} +var AsyncLoop = class _AsyncLoop { /** - * Disable the attribute corresponding to the location in parameter - * @param attributeLocation defines the attribute location of the attribute to disable - */ - disableAttributeByIndex(attributeLocation) { - this._gl.disableVertexAttribArray(attributeLocation); - this._vertexAttribArraysEnabled[attributeLocation] = false; - this._currentBufferPointers[attributeLocation].active = false; - } - /** - * Send a draw order - * @param useTriangles defines if triangles must be used to draw (else wireframe will be used) - * @param indexStart defines the starting index - * @param indexCount defines the number of index to draw - * @param instancesCount defines the number of instances to draw (if instantiation is enabled) + * Constructor. + * @param iterations the number of iterations. + * @param func the function to run each iteration + * @param successCallback the callback that will be called upon successful execution + * @param offset starting offset. */ - draw(useTriangles, indexStart, indexCount, instancesCount) { - this.drawElementsType(useTriangles ? 0 : 1, indexStart, indexCount, instancesCount); + constructor(iterations, func, successCallback, offset = 0) { + this.iterations = iterations; + this.index = offset - 1; + this._done = false; + this._fn = func; + this._successCallback = successCallback; } /** - * Draw a list of points - * @param verticesStart defines the index of first vertex to draw - * @param verticesCount defines the count of vertices to draw - * @param instancesCount defines the number of instances to draw (if instantiation is enabled) + * Execute the next iteration. Must be called after the last iteration was finished. */ - drawPointClouds(verticesStart, verticesCount, instancesCount) { - this.drawArraysType(2, verticesStart, verticesCount, instancesCount); + executeNext() { + if (!this._done) { + if (this.index + 1 < this.iterations) { + ++this.index; + this._fn(this); + } else { + this.breakLoop(); + } + } } /** - * Draw a list of unindexed primitives - * @param useTriangles defines if triangles must be used to draw (else wireframe will be used) - * @param verticesStart defines the index of first vertex to draw - * @param verticesCount defines the count of vertices to draw - * @param instancesCount defines the number of instances to draw (if instantiation is enabled) + * Break the loop and run the success callback. */ - drawUnIndexed(useTriangles, verticesStart, verticesCount, instancesCount) { - this.drawArraysType(useTriangles ? 0 : 1, verticesStart, verticesCount, instancesCount); + breakLoop() { + this._done = true; + this._successCallback(); } /** - * Draw a list of indexed primitives - * @param fillMode defines the primitive to use - * @param indexStart defines the starting index - * @param indexCount defines the number of index to draw - * @param instancesCount defines the number of instances to draw (if instantiation is enabled) + * Create and run an async loop. + * @param iterations the number of iterations. + * @param fn the function to run each iteration + * @param successCallback the callback that will be called upon successful execution + * @param offset starting offset. + * @returns the created async loop object */ - drawElementsType(fillMode, indexStart, indexCount, instancesCount) { - this.applyStates(); - this._reportDrawCall(); - const drawMode = this._drawMode(fillMode); - const indexFormat = this._uintIndicesCurrentlySet ? this._gl.UNSIGNED_INT : this._gl.UNSIGNED_SHORT; - const mult = this._uintIndicesCurrentlySet ? 4 : 2; - if (instancesCount) { - this._gl.drawElementsInstanced(drawMode, indexCount, indexFormat, indexStart * mult, instancesCount); - } else { - this._gl.drawElements(drawMode, indexCount, indexFormat, indexStart * mult); - } + static Run(iterations, fn, successCallback, offset = 0) { + const loop = new _AsyncLoop(iterations, fn, successCallback, offset); + loop.executeNext(); + return loop; } /** - * Draw a list of unindexed primitives - * @param fillMode defines the primitive to use - * @param verticesStart defines the index of first vertex to draw - * @param verticesCount defines the count of vertices to draw - * @param instancesCount defines the number of instances to draw (if instantiation is enabled) + * A for-loop that will run a given number of iterations synchronous and the rest async. + * @param iterations total number of iterations + * @param syncedIterations number of synchronous iterations in each async iteration. + * @param fn the function to call each iteration. + * @param callback a success call back that will be called when iterating stops. + * @param breakFunction a break condition (optional) + * @param timeout timeout settings for the setTimeout function. default - 0. + * @returns the created async loop object */ - drawArraysType(fillMode, verticesStart, verticesCount, instancesCount) { - this.applyStates(); - this._reportDrawCall(); - const drawMode = this._drawMode(fillMode); - if (instancesCount) { - this._gl.drawArraysInstanced(drawMode, verticesStart, verticesCount, instancesCount); - } else { - this._gl.drawArrays(drawMode, verticesStart, verticesCount); - } + static SyncAsyncForLoop(iterations, syncedIterations, fn, callback, breakFunction, timeout = 0) { + return _AsyncLoop.Run(Math.ceil(iterations / syncedIterations), (loop) => { + if (breakFunction && breakFunction()) { + loop.breakLoop(); + } else { + setTimeout(() => { + for (let i = 0; i < syncedIterations; ++i) { + const iteration = loop.index * syncedIterations + i; + if (iteration >= iterations) { + break; + } + fn(iteration); + if (breakFunction && breakFunction()) { + loop.breakLoop(); + break; + } + } + loop.executeNext(); + }, timeout); + } + }, callback); } - _drawMode(fillMode) { - switch (fillMode) { - case 0: - return this._gl.TRIANGLES; - case 2: - return this._gl.POINTS; - case 1: - return this._gl.LINES; - case 3: - return this._gl.POINTS; - case 4: - return this._gl.LINES; - case 5: - return this._gl.LINE_LOOP; - case 6: - return this._gl.LINE_STRIP; - case 7: - return this._gl.TRIANGLE_STRIP; - case 8: - return this._gl.TRIANGLE_FAN; - default: - return this._gl.TRIANGLES; - } +}; +Tools.Mix = Mix; +Tools.IsExponentOfTwo = IsExponentOfTwo; +EngineStore.FallbackTexture = "data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QBmRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAAExAAIAAAAQAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQubmV0IDQuMC41AP/bAEMABAIDAwMCBAMDAwQEBAQFCQYFBQUFCwgIBgkNCw0NDQsMDA4QFBEODxMPDAwSGBITFRYXFxcOERkbGRYaFBYXFv/bAEMBBAQEBQUFCgYGChYPDA8WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFv/AABEIAQABAAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APH6KKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76CiiigD5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BQooooA+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/voKKKKAPl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76CiiigD5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BQooooA+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/voKKKKAPl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76P//Z"; + +// node_modules/@babylonjs/core/Misc/decorators.functions.js +var __mergedStore = {}; +var __decoratorInitialStore = {}; +function GetDirectStore(target) { + const classKey = target.getClassName(); + if (!__decoratorInitialStore[classKey]) { + __decoratorInitialStore[classKey] = {}; } - /** @internal */ - _reportDrawCall() { + return __decoratorInitialStore[classKey]; +} +function GetMergedStore(target) { + const classKey = target.getClassName(); + if (__mergedStore[classKey]) { + return __mergedStore[classKey]; } - // Shaders - /** - * @internal - */ - _releaseEffect(effect) { - if (this._compiledEffects[effect._key]) { - delete this._compiledEffects[effect._key]; + __mergedStore[classKey] = {}; + const store = __mergedStore[classKey]; + let currentTarget = target; + let currentKey = classKey; + while (currentKey) { + const initialStore = __decoratorInitialStore[currentKey]; + for (const property in initialStore) { + store[property] = initialStore[property]; } - const pipelineContext = effect.getPipelineContext(); - if (pipelineContext) { - this._deletePipelineContext(pipelineContext); + let parent; + let done = false; + do { + parent = Object.getPrototypeOf(currentTarget); + if (!parent.getClassName) { + done = true; + break; + } + if (parent.getClassName() !== currentKey) { + break; + } + currentTarget = parent; + } while (parent); + if (done) { + break; } + currentKey = parent.getClassName(); + currentTarget = parent; } - /** - * @internal - */ - _deletePipelineContext(pipelineContext) { - const webGLPipelineContext = pipelineContext; - if (webGLPipelineContext && webGLPipelineContext.program) { - webGLPipelineContext.program.__SPECTOR_rebuildProgram = null; - this._gl.deleteProgram(webGLPipelineContext.program); + return store; +} + +// node_modules/@babylonjs/core/Misc/decorators.js +function generateSerializableMember(type, sourceName) { + return (target, propertyKey) => { + const classStore = GetDirectStore(target); + if (!classStore[propertyKey]) { + classStore[propertyKey] = { type, sourceName }; } - } - /** @internal */ - _getGlobalDefines(defines) { - if (defines) { - if (this.isNDCHalfZRange) { - defines["IS_NDC_HALF_ZRANGE"] = ""; - } else { - delete defines["IS_NDC_HALF_ZRANGE"]; - } - if (this.useReverseDepthBuffer) { - defines["USE_REVERSE_DEPTHBUFFER"] = ""; - } else { - delete defines["USE_REVERSE_DEPTHBUFFER"]; - } - if (this.useExactSrgbConversions) { - defines["USE_EXACT_SRGB_CONVERSIONS"] = ""; - } else { - delete defines["USE_EXACT_SRGB_CONVERSIONS"]; - } - return; - } else { - let s = ""; - if (this.isNDCHalfZRange) { - s += "#define IS_NDC_HALF_ZRANGE"; - } - if (this.useReverseDepthBuffer) { - if (s) { - s += "\n"; + }; +} +function generateExpandMember(setCallback, targetKey = null) { + return (target, propertyKey) => { + const key = targetKey || "_" + propertyKey; + Object.defineProperty(target, propertyKey, { + get: function() { + return this[key]; + }, + set: function(value) { + if (typeof this.equals === "function") { + if (this.equals(value)) { + return; + } } - s += "#define USE_REVERSE_DEPTHBUFFER"; - } - if (this.useExactSrgbConversions) { - if (s) { - s += "\n"; + if (this[key] === value) { + return; } - s += "#define USE_EXACT_SRGB_CONVERSIONS"; - } - return s; - } - } + this[key] = value; + target[setCallback].apply(this); + }, + enumerable: true, + configurable: true + }); + }; +} +function expandToProperty(callback, targetKey = null) { + return generateExpandMember(callback, targetKey); +} +function serialize(sourceName) { + return generateSerializableMember(0, sourceName); +} +function serializeAsTexture(sourceName) { + return generateSerializableMember(1, sourceName); +} +function serializeAsColor3(sourceName) { + return generateSerializableMember(2, sourceName); +} +function serializeAsFresnelParameters(sourceName) { + return generateSerializableMember(3, sourceName); +} +function serializeAsVector2(sourceName) { + return generateSerializableMember(4, sourceName); +} +function serializeAsVector3(sourceName) { + return generateSerializableMember(5, sourceName); +} +function serializeAsMeshReference(sourceName) { + return generateSerializableMember(6, sourceName); +} +function serializeAsColorCurves(sourceName) { + return generateSerializableMember(7, sourceName); +} +function serializeAsColor4(sourceName) { + return generateSerializableMember(8, sourceName); +} +function serializeAsImageProcessingConfiguration(sourceName) { + return generateSerializableMember(9, sourceName); +} +function serializeAsQuaternion(sourceName) { + return generateSerializableMember(10, sourceName); +} +function serializeAsMatrix(sourceName) { + return generateSerializableMember(12, sourceName); +} +function serializeAsCameraReference(sourceName) { + return generateSerializableMember(11, sourceName); +} +function nativeOverride(target, propertyKey, descriptor, predicate) { + const jsFunc = descriptor.value; + descriptor.value = (...params) => { + let func = jsFunc; + if (typeof _native !== "undefined" && _native[propertyKey]) { + const nativeFunc = _native[propertyKey]; + if (predicate) { + func = (...params2) => predicate(...params2) ? nativeFunc(...params2) : jsFunc(...params2); + } else { + func = nativeFunc; + } + } + target[propertyKey] = func; + return func(...params); + }; +} +nativeOverride.filter = function(predicate) { + return (target, propertyKey, descriptor) => nativeOverride(target, propertyKey, descriptor, predicate); +}; + +// node_modules/@babylonjs/core/Misc/andOrNotEvaluator.js +var AndOrNotEvaluator = class _AndOrNotEvaluator { /** - * Create a new effect (used to store vertex/fragment shaders) - * @param baseName defines the base name of the effect (The name of file without .fragment.fx or .vertex.fx) - * @param attributesNamesOrOptions defines either a list of attribute names or an IEffectCreationOptions object - * @param uniformsNamesOrEngine defines either a list of uniform names or the engine to use - * @param samplers defines an array of string used to represent textures - * @param defines defines the string containing the defines to use to compile the shaders - * @param fallbacks defines the list of potential fallbacks to use if shader compilation fails - * @param onCompiled defines a function to call when the effect creation is successful - * @param onError defines a function to call when the effect creation has failed - * @param indexParameters defines an object containing the index values to use to compile shaders (like the maximum number of simultaneous lights) - * @param shaderLanguage the language the shader is written in (default: GLSL) - * @returns the new Effect + * Evaluate a query + * @param query defines the query to evaluate + * @param evaluateCallback defines the callback used to filter result + * @returns true if the query matches */ - createEffect(baseName, attributesNamesOrOptions, uniformsNamesOrEngine, samplers, defines, fallbacks, onCompiled, onError, indexParameters, shaderLanguage = ShaderLanguage.GLSL) { - const vertex = typeof baseName === "string" ? baseName : baseName.vertexToken || baseName.vertexSource || baseName.vertexElement || baseName.vertex; - const fragment = typeof baseName === "string" ? baseName : baseName.fragmentToken || baseName.fragmentSource || baseName.fragmentElement || baseName.fragment; - const globalDefines = this._getGlobalDefines(); - let fullDefines = defines ?? attributesNamesOrOptions.defines ?? ""; - if (globalDefines) { - fullDefines += globalDefines; + static Eval(query, evaluateCallback) { + if (!query.match(/\([^()]*\)/g)) { + query = _AndOrNotEvaluator._HandleParenthesisContent(query, evaluateCallback); + } else { + query = query.replace(/\([^()]*\)/g, (r) => { + r = r.slice(1, r.length - 1); + return _AndOrNotEvaluator._HandleParenthesisContent(r, evaluateCallback); + }); } - const name69 = vertex + "+" + fragment + "@" + fullDefines; - if (this._compiledEffects[name69]) { - const compiledEffect = this._compiledEffects[name69]; - if (onCompiled && compiledEffect.isReady()) { - onCompiled(compiledEffect); - } - return compiledEffect; + if (query === "true") { + return true; } - const effect = new Effect(baseName, attributesNamesOrOptions, uniformsNamesOrEngine, samplers, this, defines, fallbacks, onCompiled, onError, indexParameters, name69, shaderLanguage); - this._compiledEffects[name69] = effect; - return effect; - } - // eslint-disable-next-line @typescript-eslint/naming-convention - static _ConcatenateShader(source, defines, shaderVersion = "") { - return shaderVersion + (defines ? defines + "\n" : "") + source; - } - _compileShader(source, type, defines, shaderVersion) { - return this._compileRawShader(_ThinEngine._ConcatenateShader(source, defines, shaderVersion), type); + if (query === "false") { + return false; + } + return _AndOrNotEvaluator.Eval(query, evaluateCallback); } - _compileRawShader(source, type) { - const gl = this._gl; - const shader69 = gl.createShader(type === "vertex" ? gl.VERTEX_SHADER : gl.FRAGMENT_SHADER); - if (!shader69) { - let error = gl.NO_ERROR; - let tempError = gl.NO_ERROR; - while ((tempError = gl.getError()) !== gl.NO_ERROR) { - error = tempError; + static _HandleParenthesisContent(parenthesisContent, evaluateCallback) { + evaluateCallback = evaluateCallback || ((r) => { + return r === "true" ? true : false; + }); + let result; + const or = parenthesisContent.split("||"); + for (const i in or) { + if (Object.prototype.hasOwnProperty.call(or, i)) { + let ori = _AndOrNotEvaluator._SimplifyNegation(or[i].trim()); + const and = ori.split("&&"); + if (and.length > 1) { + for (let j = 0; j < and.length; ++j) { + const andj = _AndOrNotEvaluator._SimplifyNegation(and[j].trim()); + if (andj !== "true" && andj !== "false") { + if (andj[0] === "!") { + result = !evaluateCallback(andj.substring(1)); + } else { + result = evaluateCallback(andj); + } + } else { + result = andj === "true" ? true : false; + } + if (!result) { + ori = "false"; + break; + } + } + } + if (result || ori === "true") { + result = true; + break; + } + if (ori !== "true" && ori !== "false") { + if (ori[0] === "!") { + result = !evaluateCallback(ori.substring(1)); + } else { + result = evaluateCallback(ori); + } + } else { + result = ori === "true" ? true : false; + } } - throw new Error(`Something went wrong while creating a gl ${type} shader object. gl error=${error}, gl isContextLost=${gl.isContextLost()}, _contextWasLost=${this._contextWasLost}`); } - gl.shaderSource(shader69, source); - gl.compileShader(shader69); - return shader69; - } - /** - * @internal - */ - _getShaderSource(shader69) { - return this._gl.getShaderSource(shader69); + return result ? "true" : "false"; } - /** - * Directly creates a webGL program - * @param pipelineContext defines the pipeline context to attach to - * @param vertexCode defines the vertex shader code to use - * @param fragmentCode defines the fragment shader code to use - * @param context defines the webGL context to use (if not set, the current one will be used) - * @param transformFeedbackVaryings defines the list of transform feedback varyings to use - * @returns the new webGL program - */ - createRawShaderProgram(pipelineContext, vertexCode, fragmentCode, context, transformFeedbackVaryings = null) { - context = context || this._gl; - const vertexShader = this._compileRawShader(vertexCode, "vertex"); - const fragmentShader = this._compileRawShader(fragmentCode, "fragment"); - return this._createShaderProgram(pipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings); + static _SimplifyNegation(booleanString) { + booleanString = booleanString.replace(/^[\s!]+/, (r) => { + r = r.replace(/[\s]/g, () => ""); + return r.length % 2 ? "!" : ""; + }); + booleanString = booleanString.trim(); + if (booleanString === "!true") { + booleanString = "false"; + } else if (booleanString === "!false") { + booleanString = "true"; + } + return booleanString; } +}; + +// node_modules/@babylonjs/core/Misc/tags.js +var Tags = class _Tags { /** - * Creates a webGL program - * @param pipelineContext defines the pipeline context to attach to - * @param vertexCode defines the vertex shader code to use - * @param fragmentCode defines the fragment shader code to use - * @param defines defines the string containing the defines to use to compile the shaders - * @param context defines the webGL context to use (if not set, the current one will be used) - * @param transformFeedbackVaryings defines the list of transform feedback varyings to use - * @returns the new webGL program + * Adds support for tags on the given object + * @param obj defines the object to use */ - createShaderProgram(pipelineContext, vertexCode, fragmentCode, defines, context, transformFeedbackVaryings = null) { - context = context || this._gl; - const shaderVersion = this._webGLVersion > 1 ? "#version 300 es\n#define WEBGL2 \n" : ""; - const vertexShader = this._compileShader(vertexCode, "vertex", defines, shaderVersion); - const fragmentShader = this._compileShader(fragmentCode, "fragment", defines, shaderVersion); - return this._createShaderProgram(pipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings); + static EnableFor(obj) { + obj._tags = obj._tags || {}; + obj.hasTags = () => { + return _Tags.HasTags(obj); + }; + obj.addTags = (tagsString) => { + return _Tags.AddTagsTo(obj, tagsString); + }; + obj.removeTags = (tagsString) => { + return _Tags.RemoveTagsFrom(obj, tagsString); + }; + obj.matchesTagsQuery = (tagsQuery) => { + return _Tags.MatchesQuery(obj, tagsQuery); + }; } /** - * Inline functions in shader code that are marked to be inlined - * @param code code to inline - * @returns inlined code + * Removes tags support + * @param obj defines the object to use */ - inlineShaderCode(code) { - return code; + static DisableFor(obj) { + delete obj._tags; + delete obj.hasTags; + delete obj.addTags; + delete obj.removeTags; + delete obj.matchesTagsQuery; } /** - * Creates a new pipeline context - * @param shaderProcessingContext defines the shader processing context used during the processing if available - * @returns the new pipeline + * Gets a boolean indicating if the given object has tags + * @param obj defines the object to use + * @returns a boolean */ - createPipelineContext(shaderProcessingContext) { - const pipelineContext = new WebGLPipelineContext(); - pipelineContext.engine = this; - if (this._caps.parallelShaderCompile) { - pipelineContext.isParallelCompiled = true; + static HasTags(obj) { + if (!obj._tags) { + return false; } - return pipelineContext; - } - /** - * Creates a new material context - * @returns the new context - */ - createMaterialContext() { - return void 0; + const tags = obj._tags; + for (const i in tags) { + if (Object.prototype.hasOwnProperty.call(tags, i)) { + return true; + } + } + return false; } /** - * Creates a new draw context - * @returns the new context + * Gets the tags available on a given object + * @param obj defines the object to use + * @param asString defines if the tags must be returned as a string instead of an array of strings + * @returns the tags */ - createDrawContext() { - return void 0; - } - _createShaderProgram(pipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings = null) { - const shaderProgram = context.createProgram(); - pipelineContext.program = shaderProgram; - if (!shaderProgram) { - throw new Error("Unable to create program"); - } - context.attachShader(shaderProgram, vertexShader); - context.attachShader(shaderProgram, fragmentShader); - context.linkProgram(shaderProgram); - pipelineContext.context = context; - pipelineContext.vertexShader = vertexShader; - pipelineContext.fragmentShader = fragmentShader; - if (!pipelineContext.isParallelCompiled) { - this._finalizePipelineContext(pipelineContext); - } - return shaderProgram; - } - _finalizePipelineContext(pipelineContext) { - const context = pipelineContext.context; - const vertexShader = pipelineContext.vertexShader; - const fragmentShader = pipelineContext.fragmentShader; - const program = pipelineContext.program; - const linked = context.getProgramParameter(program, context.LINK_STATUS); - if (!linked) { - if (!this._gl.getShaderParameter(vertexShader, this._gl.COMPILE_STATUS)) { - const log = this._gl.getShaderInfoLog(vertexShader); - if (log) { - pipelineContext.vertexCompilationError = log; - throw new Error("VERTEX SHADER " + log); - } - } - if (!this._gl.getShaderParameter(fragmentShader, this._gl.COMPILE_STATUS)) { - const log = this._gl.getShaderInfoLog(fragmentShader); - if (log) { - pipelineContext.fragmentCompilationError = log; - throw new Error("FRAGMENT SHADER " + log); - } - } - const error = context.getProgramInfoLog(program); - if (error) { - pipelineContext.programLinkError = error; - throw new Error(error); - } + static GetTags(obj, asString = true) { + if (!obj._tags) { + return null; } - if (this.validateShaderPrograms) { - context.validateProgram(program); - const validated = context.getProgramParameter(program, context.VALIDATE_STATUS); - if (!validated) { - const error = context.getProgramInfoLog(program); - if (error) { - pipelineContext.programValidationError = error; - throw new Error(error); + if (asString) { + const tagsArray = []; + for (const tag in obj._tags) { + if (Object.prototype.hasOwnProperty.call(obj._tags, tag) && obj._tags[tag] === true) { + tagsArray.push(tag); } } - } - context.deleteShader(vertexShader); - context.deleteShader(fragmentShader); - pipelineContext.vertexShader = void 0; - pipelineContext.fragmentShader = void 0; - if (pipelineContext.onCompiled) { - pipelineContext.onCompiled(); - pipelineContext.onCompiled = void 0; - } - } - /** - * @internal - */ - _preparePipelineContext(pipelineContext, vertexSourceCode, fragmentSourceCode, createAsRaw, rawVertexSourceCode, rawFragmentSourceCode, rebuildRebind, defines, transformFeedbackVaryings, key) { - const webGLRenderingState = pipelineContext; - if (createAsRaw) { - webGLRenderingState.program = this.createRawShaderProgram(webGLRenderingState, vertexSourceCode, fragmentSourceCode, void 0, transformFeedbackVaryings); + return tagsArray.join(" "); } else { - webGLRenderingState.program = this.createShaderProgram(webGLRenderingState, vertexSourceCode, fragmentSourceCode, defines, void 0, transformFeedbackVaryings); + return obj._tags; } - webGLRenderingState.program.__SPECTOR_rebuildProgram = rebuildRebind; } /** - * @internal + * Adds tags to an object + * @param obj defines the object to use + * @param tagsString defines the tag string. The tags 'true' and 'false' are reserved and cannot be used as tags. + * A tag cannot start with '||', '&&', and '!'. It cannot contain whitespaces */ - _isRenderingStateCompiled(pipelineContext) { - const webGLPipelineContext = pipelineContext; - if (this._isDisposed || webGLPipelineContext._isDisposed) { - return false; + static AddTagsTo(obj, tagsString) { + if (!tagsString) { + return; } - if (this._gl.getProgramParameter(webGLPipelineContext.program, this._caps.parallelShaderCompile.COMPLETION_STATUS_KHR)) { - this._finalizePipelineContext(webGLPipelineContext); - return true; + if (typeof tagsString !== "string") { + return; } - return false; + const tags = tagsString.split(" "); + tags.forEach(function(tag) { + _Tags._AddTagTo(obj, tag); + }); } /** * @internal */ - _executeWhenRenderingStateIsCompiled(pipelineContext, action) { - const webGLPipelineContext = pipelineContext; - if (!webGLPipelineContext.isParallelCompiled) { - action(); + static _AddTagTo(obj, tag) { + tag = tag.trim(); + if (tag === "" || tag === "true" || tag === "false") { return; } - const oldHandler = webGLPipelineContext.onCompiled; - if (oldHandler) { - webGLPipelineContext.onCompiled = () => { - oldHandler(); - action(); - }; - } else { - webGLPipelineContext.onCompiled = action; + if (tag.match(/[\s]/) || tag.match(/^([!]|([|]|[&]){2})/)) { + return; } + _Tags.EnableFor(obj); + obj._tags[tag] = true; } /** - * Gets the list of webGL uniform locations associated with a specific program based on a list of uniform names - * @param pipelineContext defines the pipeline context to use - * @param uniformsNames defines the list of uniform names - * @returns an array of webGL uniform locations + * Removes specific tags from a specific object + * @param obj defines the object to use + * @param tagsString defines the tags to remove */ - getUniforms(pipelineContext, uniformsNames) { - const results = new Array(); - const webGLPipelineContext = pipelineContext; - for (let index = 0; index < uniformsNames.length; index++) { - results.push(this._gl.getUniformLocation(webGLPipelineContext.program, uniformsNames[index])); + static RemoveTagsFrom(obj, tagsString) { + if (!_Tags.HasTags(obj)) { + return; + } + const tags = tagsString.split(" "); + for (const t in tags) { + _Tags._RemoveTagFrom(obj, tags[t]); } - return results; } /** - * Gets the list of active attributes for a given webGL program - * @param pipelineContext defines the pipeline context to use - * @param attributesNames defines the list of attribute names to get - * @returns an array of indices indicating the offset of each attribute + * @internal */ - getAttributes(pipelineContext, attributesNames) { - const results = []; - const webGLPipelineContext = pipelineContext; - for (let index = 0; index < attributesNames.length; index++) { - try { - results.push(this._gl.getAttribLocation(webGLPipelineContext.program, attributesNames[index])); - } catch (e) { - results.push(-1); - } - } - return results; + static _RemoveTagFrom(obj, tag) { + delete obj._tags[tag]; } /** - * Activates an effect, making it the current one (ie. the one used for rendering) - * @param effect defines the effect to activate + * Defines if tags hosted on an object match a given query + * @param obj defines the object to use + * @param tagsQuery defines the tag query + * @returns a boolean */ - enableEffect(effect) { - effect = effect !== null && DrawWrapper.IsWrapper(effect) ? effect.effect : effect; - if (!effect || effect === this._currentEffect) { - return; - } - this._stencilStateComposer.stencilMaterial = void 0; - effect = effect; - this.bindSamplers(effect); - this._currentEffect = effect; - if (effect.onBind) { - effect.onBind(effect); + static MatchesQuery(obj, tagsQuery) { + if (tagsQuery === void 0) { + return true; } - if (effect._onBindObservable) { - effect._onBindObservable.notifyObservers(effect); + if (tagsQuery === "") { + return _Tags.HasTags(obj); } + return AndOrNotEvaluator.Eval(tagsQuery, (r) => _Tags.HasTags(obj) && obj._tags[r]); } +}; + +// node_modules/@babylonjs/core/Maths/math.scalar.js +var Scalar = class _Scalar { /** - * Set the value of an uniform to a number (int) - * @param uniform defines the webGL uniform location where to store the value - * @param value defines the int number to store - * @returns true if the value was set + * Returns -1 if value is negative and +1 is value is positive. + * @param value the value + * @returns the value itself if it's equal to zero. */ - setInt(uniform, value) { - if (!uniform) { - return false; + static Sign(value) { + value = +value; + if (value === 0 || isNaN(value)) { + return value; } - this._gl.uniform1i(uniform, value); - return true; + return value > 0 ? 1 : -1; } /** - * Set the value of an uniform to a int2 - * @param uniform defines the webGL uniform location where to store the value - * @param x defines the 1st component of the value - * @param y defines the 2nd component of the value - * @returns true if the value was set + * the log2 of value. + * @param value the value to compute log2 of + * @returns the log2 of value. */ - setInt2(uniform, x, y) { - if (!uniform) { - return false; - } - this._gl.uniform2i(uniform, x, y); - return true; + static Log2(value) { + return Math.log(value) * Math.LOG2E; } /** - * Set the value of an uniform to a int3 - * @param uniform defines the webGL uniform location where to store the value - * @param x defines the 1st component of the value - * @param y defines the 2nd component of the value - * @param z defines the 3rd component of the value - * @returns true if the value was set + * the floor part of a log2 value. + * @param value the value to compute log2 of + * @returns the log2 of value. */ - setInt3(uniform, x, y, z) { - if (!uniform) { - return false; + static ILog2(value) { + if (Math.log2) { + return Math.floor(Math.log2(value)); } - this._gl.uniform3i(uniform, x, y, z); - return true; + if (value < 0) { + return NaN; + } else if (value === 0) { + return -Infinity; + } + let n = 0; + if (value < 1) { + while (value < 1) { + n++; + value = value * 2; + } + n = -n; + } else if (value > 1) { + while (value > 1) { + n++; + value = Math.floor(value / 2); + } + } + return n; } /** - * Set the value of an uniform to a int4 - * @param uniform defines the webGL uniform location where to store the value - * @param x defines the 1st component of the value - * @param y defines the 2nd component of the value - * @param z defines the 3rd component of the value - * @param w defines the 4th component of the value - * @returns true if the value was set + * Loops the value, so that it is never larger than length and never smaller than 0. + * + * This is similar to the modulo operator but it works with floating point numbers. + * For example, using 3.0 for t and 2.5 for length, the result would be 0.5. + * With t = 5 and length = 2.5, the result would be 0.0. + * Note, however, that the behaviour is not defined for negative numbers as it is for the modulo operator + * @param value the value + * @param length the length + * @returns the looped value */ - setInt4(uniform, x, y, z, w) { - if (!uniform) { - return false; - } - this._gl.uniform4i(uniform, x, y, z, w); - return true; + static Repeat(value, length) { + return value - Math.floor(value / length) * length; } /** - * Set the value of an uniform to an array of int32 - * @param uniform defines the webGL uniform location where to store the value - * @param array defines the array of int32 to store - * @returns true if the value was set + * Normalize the value between 0.0 and 1.0 using min and max values + * @param value value to normalize + * @param min max to normalize between + * @param max min to normalize between + * @returns the normalized value */ - setIntArray(uniform, array) { - if (!uniform) { - return false; - } - this._gl.uniform1iv(uniform, array); - return true; + static Normalize(value, min, max) { + return (value - min) / (max - min); } /** - * Set the value of an uniform to an array of int32 (stored as vec2) - * @param uniform defines the webGL uniform location where to store the value - * @param array defines the array of int32 to store - * @returns true if the value was set + * Denormalize the value from 0.0 and 1.0 using min and max values + * @param normalized value to denormalize + * @param min max to denormalize between + * @param max min to denormalize between + * @returns the denormalized value */ - setIntArray2(uniform, array) { - if (!uniform || array.length % 2 !== 0) { - return false; - } - this._gl.uniform2iv(uniform, array); - return true; + static Denormalize(normalized, min, max) { + return normalized * (max - min) + min; } /** - * Set the value of an uniform to an array of int32 (stored as vec3) - * @param uniform defines the webGL uniform location where to store the value - * @param array defines the array of int32 to store - * @returns true if the value was set + * Calculates the shortest difference between two given angles given in degrees. + * @param current current angle in degrees + * @param target target angle in degrees + * @returns the delta */ - setIntArray3(uniform, array) { - if (!uniform || array.length % 3 !== 0) { - return false; + static DeltaAngle(current, target) { + let num = _Scalar.Repeat(target - current, 360); + if (num > 180) { + num -= 360; } - this._gl.uniform3iv(uniform, array); - return true; + return num; } /** - * Set the value of an uniform to an array of int32 (stored as vec4) - * @param uniform defines the webGL uniform location where to store the value - * @param array defines the array of int32 to store - * @returns true if the value was set + * PingPongs the value t, so that it is never larger than length and never smaller than 0. + * @param tx value + * @param length length + * @returns The returned value will move back and forth between 0 and length */ - setIntArray4(uniform, array) { - if (!uniform || array.length % 4 !== 0) { - return false; - } - this._gl.uniform4iv(uniform, array); - return true; + static PingPong(tx, length) { + const t = _Scalar.Repeat(tx, length * 2); + return length - Math.abs(t - length); } /** - * Set the value of an uniform to a number (unsigned int) - * @param uniform defines the webGL uniform location where to store the value - * @param value defines the unsigned int number to store - * @returns true if the value was set + * Interpolates between min and max with smoothing at the limits. + * + * This function interpolates between min and max in a similar way to Lerp. However, the interpolation will gradually speed up + * from the start and slow down toward the end. This is useful for creating natural-looking animation, fading and other transitions. + * @param from from + * @param to to + * @param tx value + * @returns the smooth stepped value */ - setUInt(uniform, value) { - if (!uniform) { - return false; - } - this._gl.uniform1ui(uniform, value); - return true; + static SmoothStep(from, to, tx) { + let t = _Scalar.Clamp(tx); + t = -2 * t * t * t + 3 * t * t; + return to * t + from * (1 - t); } /** - * Set the value of an uniform to a unsigned int2 - * @param uniform defines the webGL uniform location where to store the value - * @param x defines the 1st component of the value - * @param y defines the 2nd component of the value - * @returns true if the value was set + * Moves a value current towards target. + * + * This is essentially the same as Mathf.Lerp but instead the function will ensure that the speed never exceeds maxDelta. + * Negative values of maxDelta pushes the value away from target. + * @param current current value + * @param target target value + * @param maxDelta max distance to move + * @returns resulting value */ - setUInt2(uniform, x, y) { - if (!uniform) { - return false; + static MoveTowards(current, target, maxDelta) { + let result = 0; + if (Math.abs(target - current) <= maxDelta) { + result = target; + } else { + result = current + _Scalar.Sign(target - current) * maxDelta; } - this._gl.uniform2ui(uniform, x, y); - return true; + return result; } /** - * Set the value of an uniform to a unsigned int3 - * @param uniform defines the webGL uniform location where to store the value - * @param x defines the 1st component of the value - * @param y defines the 2nd component of the value - * @param z defines the 3rd component of the value - * @returns true if the value was set + * Same as MoveTowards but makes sure the values interpolate correctly when they wrap around 360 degrees. + * + * Variables current and target are assumed to be in degrees. For optimization reasons, negative values of maxDelta + * are not supported and may cause oscillation. To push current away from a target angle, add 180 to that angle instead. + * @param current current value + * @param target target value + * @param maxDelta max distance to move + * @returns resulting angle */ - setUInt3(uniform, x, y, z) { - if (!uniform) { - return false; + static MoveTowardsAngle(current, target, maxDelta) { + const num = _Scalar.DeltaAngle(current, target); + let result = 0; + if (-maxDelta < num && num < maxDelta) { + result = target; + } else { + target = current + num; + result = _Scalar.MoveTowards(current, target, maxDelta); } - this._gl.uniform3ui(uniform, x, y, z); - return true; + return result; } /** - * Set the value of an uniform to a unsigned int4 - * @param uniform defines the webGL uniform location where to store the value - * @param x defines the 1st component of the value - * @param y defines the 2nd component of the value - * @param z defines the 3rd component of the value - * @param w defines the 4th component of the value - * @returns true if the value was set + * Same as Lerp but makes sure the values interpolate correctly when they wrap around 360 degrees. + * The parameter t is clamped to the range [0, 1]. Variables a and b are assumed to be in degrees. + * @param start start value + * @param end target value + * @param amount amount to lerp between + * @returns the lerped value */ - setUInt4(uniform, x, y, z, w) { - if (!uniform) { - return false; + static LerpAngle(start, end, amount) { + let num = _Scalar.Repeat(end - start, 360); + if (num > 180) { + num -= 360; } - this._gl.uniform4ui(uniform, x, y, z, w); - return true; + return start + num * Clamp(amount); } /** - * Set the value of an uniform to an array of unsigned int32 - * @param uniform defines the webGL uniform location where to store the value - * @param array defines the array of unsigned int32 to store - * @returns true if the value was set + * Calculates the linear parameter t that produces the interpolant value within the range [a, b]. + * @param a start value + * @param b target value + * @param value value between a and b + * @returns the inverseLerp value */ - setUIntArray(uniform, array) { - if (!uniform) { - return false; + static InverseLerp(a, b, value) { + let result = 0; + if (a != b) { + result = Clamp((value - a) / (b - a)); + } else { + result = 0; } - this._gl.uniform1uiv(uniform, array); - return true; + return result; } /** - * Set the value of an uniform to an array of unsigned int32 (stored as vec2) - * @param uniform defines the webGL uniform location where to store the value - * @param array defines the array of unsigned int32 to store - * @returns true if the value was set + * Returns a new scalar located for "amount" (float) on the Hermite spline defined by the scalars "value1", "value3", "tangent1", "tangent2". + * @see http://mathworld.wolfram.com/HermitePolynomial.html + * @param value1 defines the first control point + * @param tangent1 defines the first tangent + * @param value2 defines the second control point + * @param tangent2 defines the second tangent + * @param amount defines the amount on the interpolation spline (between 0 and 1) + * @returns hermite result */ - setUIntArray2(uniform, array) { - if (!uniform || array.length % 2 !== 0) { - return false; - } - this._gl.uniform2uiv(uniform, array); - return true; + static Hermite(value1, tangent1, value2, tangent2, amount) { + const squared = amount * amount; + const cubed = amount * squared; + const part1 = 2 * cubed - 3 * squared + 1; + const part2 = -2 * cubed + 3 * squared; + const part3 = cubed - 2 * squared + amount; + const part4 = cubed - squared; + return value1 * part1 + value2 * part2 + tangent1 * part3 + tangent2 * part4; } /** - * Set the value of an uniform to an array of unsigned int32 (stored as vec3) - * @param uniform defines the webGL uniform location where to store the value - * @param array defines the array of unsigned int32 to store - * @returns true if the value was set + * Returns a new scalar which is the 1st derivative of the Hermite spline defined by the scalars "value1", "value2", "tangent1", "tangent2". + * @param value1 defines the first control point + * @param tangent1 defines the first tangent + * @param value2 defines the second control point + * @param tangent2 defines the second tangent + * @param time define where the derivative must be done + * @returns 1st derivative */ - setUIntArray3(uniform, array) { - if (!uniform || array.length % 3 !== 0) { - return false; - } - this._gl.uniform3uiv(uniform, array); - return true; + static Hermite1stDerivative(value1, tangent1, value2, tangent2, time) { + const t2 = time * time; + return (t2 - time) * 6 * value1 + (3 * t2 - 4 * time + 1) * tangent1 + (-t2 + time) * 6 * value2 + (3 * t2 - 2 * time) * tangent2; } /** - * Set the value of an uniform to an array of unsigned int32 (stored as vec4) - * @param uniform defines the webGL uniform location where to store the value - * @param array defines the array of unsigned int32 to store - * @returns true if the value was set + * This function returns percentage of a number in a given range. + * + * RangeToPercent(40,20,60) will return 0.5 (50%) + * RangeToPercent(34,0,100) will return 0.34 (34%) + * @param number to convert to percentage + * @param min min range + * @param max max range + * @returns the percentage */ - setUIntArray4(uniform, array) { - if (!uniform || array.length % 4 !== 0) { - return false; - } - this._gl.uniform4uiv(uniform, array); - return true; + static RangeToPercent(number, min, max) { + return (number - min) / (max - min); } /** - * Set the value of an uniform to an array of number - * @param uniform defines the webGL uniform location where to store the value - * @param array defines the array of number to store - * @returns true if the value was set + * This function returns number that corresponds to the percentage in a given range. + * + * PercentToRange(0.34,0,100) will return 34. + * @param percent to convert to number + * @param min min range + * @param max max range + * @returns the number */ - setArray(uniform, array) { - if (!uniform) { - return false; - } - if (array.length < 1) { - return false; - } - this._gl.uniform1fv(uniform, array); - return true; + static PercentToRange(percent, min, max) { + return (max - min) * percent + min; } /** - * Set the value of an uniform to an array of number (stored as vec2) - * @param uniform defines the webGL uniform location where to store the value - * @param array defines the array of number to store - * @returns true if the value was set + * Returns the highest common factor of two integers. + * @param a first parameter + * @param b second parameter + * @returns HCF of a and b */ - setArray2(uniform, array) { - if (!uniform || array.length % 2 !== 0) { - return false; + static HCF(a, b) { + const r = a % b; + if (r === 0) { + return b; } - this._gl.uniform2fv(uniform, array); - return true; + return _Scalar.HCF(b, r); + } +}; +Scalar.TwoPi = Math.PI * 2; +Scalar.WithinEpsilon = WithinEpsilon; +Scalar.ToHex = ToHex; +Scalar.Clamp = Clamp; +Scalar.Lerp = Lerp; +Scalar.RandomRange = RandomRange; +Scalar.NormalizeRadians = NormalizeRadians; + +// node_modules/@babylonjs/core/Maths/math.color.js +function colorChannelToLinearSpace(color) { + return Math.pow(color, ToLinearSpace); +} +function colorChannelToLinearSpaceExact(color) { + if (color <= 0.04045) { + return 0.0773993808 * color; + } + return Math.pow(0.947867299 * (color + 0.055), 2.4); +} +function colorChannelToGammaSpace(color) { + return Math.pow(color, ToGammaSpace); +} +function colorChannelToGammaSpaceExact(color) { + if (color <= 31308e-7) { + return 12.92 * color; } + return 1.055 * Math.pow(color, 0.41666) - 0.055; +} +var Color3 = class _Color3 { /** - * Set the value of an uniform to an array of number (stored as vec3) - * @param uniform defines the webGL uniform location where to store the value - * @param array defines the array of number to store - * @returns true if the value was set + * Creates a new Color3 object from red, green, blue values, all between 0 and 1 + * @param r defines the red component (between 0 and 1, default is 0) + * @param g defines the green component (between 0 and 1, default is 0) + * @param b defines the blue component (between 0 and 1, default is 0) */ - setArray3(uniform, array) { - if (!uniform || array.length % 3 !== 0) { - return false; - } - this._gl.uniform3fv(uniform, array); - return true; + constructor(r = 0, g = 0, b = 0) { + this.r = r; + this.g = g; + this.b = b; } /** - * Set the value of an uniform to an array of number (stored as vec4) - * @param uniform defines the webGL uniform location where to store the value - * @param array defines the array of number to store - * @returns true if the value was set + * Creates a string with the Color3 current values + * @returns the string representation of the Color3 object */ - setArray4(uniform, array) { - if (!uniform || array.length % 4 !== 0) { - return false; - } - this._gl.uniform4fv(uniform, array); - return true; + toString() { + return "{R: " + this.r + " G:" + this.g + " B:" + this.b + "}"; } /** - * Set the value of an uniform to an array of float32 (stored as matrices) - * @param uniform defines the webGL uniform location where to store the value - * @param matrices defines the array of float32 to store - * @returns true if the value was set + * Returns the string "Color3" + * @returns "Color3" */ - setMatrices(uniform, matrices) { - if (!uniform) { - return false; - } - this._gl.uniformMatrix4fv(uniform, false, matrices); - return true; + getClassName() { + return "Color3"; } /** - * Set the value of an uniform to a matrix (3x3) - * @param uniform defines the webGL uniform location where to store the value - * @param matrix defines the Float32Array representing the 3x3 matrix to store - * @returns true if the value was set + * Compute the Color3 hash code + * @returns an unique number that can be used to hash Color3 objects */ - setMatrix3x3(uniform, matrix) { - if (!uniform) { - return false; - } - this._gl.uniformMatrix3fv(uniform, false, matrix); - return true; + getHashCode() { + let hash = this.r * 255 | 0; + hash = hash * 397 ^ (this.g * 255 | 0); + hash = hash * 397 ^ (this.b * 255 | 0); + return hash; } + // Operators /** - * Set the value of an uniform to a matrix (2x2) - * @param uniform defines the webGL uniform location where to store the value - * @param matrix defines the Float32Array representing the 2x2 matrix to store - * @returns true if the value was set + * Stores in the given array from the given starting index the red, green, blue values as successive elements + * @param array defines the array where to store the r,g,b components + * @param index defines an optional index in the target array to define where to start storing values + * @returns the current Color3 object */ - setMatrix2x2(uniform, matrix) { - if (!uniform) { - return false; - } - this._gl.uniformMatrix2fv(uniform, false, matrix); - return true; + toArray(array, index = 0) { + array[index] = this.r; + array[index + 1] = this.g; + array[index + 2] = this.b; + return this; } /** - * Set the value of an uniform to a number (float) - * @param uniform defines the webGL uniform location where to store the value - * @param value defines the float number to store - * @returns true if the value was transferred + * Update the current color with values stored in an array from the starting index of the given array + * @param array defines the source array + * @param offset defines an offset in the source array + * @returns the current Color3 object */ - setFloat(uniform, value) { - if (!uniform) { - return false; - } - this._gl.uniform1f(uniform, value); - return true; + fromArray(array, offset = 0) { + _Color3.FromArrayToRef(array, offset, this); + return this; } /** - * Set the value of an uniform to a vec2 - * @param uniform defines the webGL uniform location where to store the value - * @param x defines the 1st component of the value - * @param y defines the 2nd component of the value - * @returns true if the value was set + * Returns a new Color4 object from the current Color3 and the given alpha + * @param alpha defines the alpha component on the new Color4 object (default is 1) + * @returns a new Color4 object */ - setFloat2(uniform, x, y) { - if (!uniform) { - return false; - } - this._gl.uniform2f(uniform, x, y); - return true; + toColor4(alpha = 1) { + return new Color4(this.r, this.g, this.b, alpha); } /** - * Set the value of an uniform to a vec3 - * @param uniform defines the webGL uniform location where to store the value - * @param x defines the 1st component of the value - * @param y defines the 2nd component of the value - * @param z defines the 3rd component of the value - * @returns true if the value was set - */ - setFloat3(uniform, x, y, z) { - if (!uniform) { - return false; - } - this._gl.uniform3f(uniform, x, y, z); - return true; + * Returns a new array populated with 3 numeric elements : red, green and blue values + * @returns the new array + */ + asArray() { + return [this.r, this.g, this.b]; } /** - * Set the value of an uniform to a vec4 - * @param uniform defines the webGL uniform location where to store the value - * @param x defines the 1st component of the value - * @param y defines the 2nd component of the value - * @param z defines the 3rd component of the value - * @param w defines the 4th component of the value - * @returns true if the value was set + * Returns the luminance value + * @returns a float value */ - setFloat4(uniform, x, y, z, w) { - if (!uniform) { - return false; - } - this._gl.uniform4f(uniform, x, y, z, w); - return true; + toLuminance() { + return this.r * 0.3 + this.g * 0.59 + this.b * 0.11; } - // States /** - * Apply all cached states (depth, culling, stencil and alpha) + * Multiply each Color3 rgb values by the given Color3 rgb values in a new Color3 object + * @param otherColor defines the second operand + * @returns the new Color3 object */ - applyStates() { - this._depthCullingState.apply(this._gl); - this._stencilStateComposer.apply(this._gl); - this._alphaState.apply(this._gl); - if (this._colorWriteChanged) { - this._colorWriteChanged = false; - const enable = this._colorWrite; - this._gl.colorMask(enable, enable, enable, enable); - } + multiply(otherColor) { + return new this.constructor(this.r * otherColor.r, this.g * otherColor.g, this.b * otherColor.b); } /** - * Enable or disable color writing - * @param enable defines the state to set + * Multiply the rgb values of the Color3 and the given Color3 and stores the result in the object "result" + * @param otherColor defines the second operand + * @param result defines the Color3 object where to store the result + * @returns the result Color3 */ - setColorWrite(enable) { - if (enable !== this._colorWrite) { - this._colorWriteChanged = true; - this._colorWrite = enable; - } + multiplyToRef(otherColor, result) { + result.r = this.r * otherColor.r; + result.g = this.g * otherColor.g; + result.b = this.b * otherColor.b; + return result; } /** - * Gets a boolean indicating if color writing is enabled - * @returns the current color writing state + * Multiplies the current Color3 coordinates by the given ones + * @param otherColor defines the second operand + * @returns the current updated Color3 */ - getColorWrite() { - return this._colorWrite; + multiplyInPlace(otherColor) { + this.r *= otherColor.r; + this.g *= otherColor.g; + this.b *= otherColor.b; + return this; } /** - * Gets the depth culling state manager + * Returns a new Color3 set with the result of the multiplication of the current Color3 coordinates by the given floats + * @param r defines the r coordinate of the operand + * @param g defines the g coordinate of the operand + * @param b defines the b coordinate of the operand + * @returns the new Color3 */ - get depthCullingState() { - return this._depthCullingState; + multiplyByFloats(r, g, b) { + return new this.constructor(this.r * r, this.g * g, this.b * b); } /** - * Gets the alpha state manager + * @internal + * Do not use */ - get alphaState() { - return this._alphaState; + divide(_other) { + throw new ReferenceError("Can not divide a color"); } /** - * Gets the stencil state manager + * @internal + * Do not use */ - get stencilState() { - return this._stencilState; + divideToRef(_other, _result) { + throw new ReferenceError("Can not divide a color"); } /** - * Gets the stencil state composer + * @internal + * Do not use */ - get stencilStateComposer() { - return this._stencilStateComposer; + divideInPlace(_other) { + throw new ReferenceError("Can not divide a color"); } - // Textures /** - * Clears the list of texture accessible through engine. - * This can help preventing texture load conflict due to name collision. + * Updates the current Color3 with the minimal coordinate values between its and the given color ones + * @param other defines the second operand + * @returns the current updated Color3 */ - clearInternalTexturesCache() { - this._internalTexturesCache.length = 0; + minimizeInPlace(other) { + return this.minimizeInPlaceFromFloats(other.r, other.g, other.b); } /** - * Force the entire cache to be cleared - * You should not have to use this function unless your engine needs to share the webGL context with another engine - * @param bruteForce defines a boolean to force clearing ALL caches (including stencil, detoh and alpha states) + * Updates the current Color3 with the maximal coordinate values between its and the given color ones. + * @param other defines the second operand + * @returns the current updated Color3 */ - wipeCaches(bruteForce) { - if (this.preventCacheWipeBetweenFrames && !bruteForce) { - return; - } - this._currentEffect = null; - this._viewportCached.x = 0; - this._viewportCached.y = 0; - this._viewportCached.z = 0; - this._viewportCached.w = 0; - this._unbindVertexArrayObject(); - if (bruteForce) { - this._currentProgram = null; - this.resetTextureCache(); - this._stencilStateComposer.reset(); - this._depthCullingState.reset(); - this._depthCullingState.depthFunc = this._gl.LEQUAL; - this._alphaState.reset(); - this._alphaMode = 1; - this._alphaEquation = 0; - this._colorWrite = true; - this._colorWriteChanged = true; - this._unpackFlipYCached = null; - this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE); - this._gl.pixelStorei(this._gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0); - this._mustWipeVertexAttributes = true; - this.unbindAllAttributes(); - } - this._resetVertexBufferBinding(); - this._cachedIndexBuffer = null; - this._cachedEffectForVertexBuffers = null; - this.bindIndexBuffer(null); + maximizeInPlace(other) { + return this.maximizeInPlaceFromFloats(other.r, other.g, other.b); } /** - * @internal + * Updates the current Color3 with the minimal coordinate values between its and the given coordinates + * @param r defines the r coordinate of the operand + * @param g defines the g coordinate of the operand + * @param b defines the b coordinate of the operand + * @returns the current updated Color3 */ - _getSamplingParameters(samplingMode, generateMipMaps) { - const gl = this._gl; - let magFilter = gl.NEAREST; - let minFilter = gl.NEAREST; - switch (samplingMode) { - case 11: - magFilter = gl.LINEAR; - if (generateMipMaps) { - minFilter = gl.LINEAR_MIPMAP_NEAREST; - } else { - minFilter = gl.LINEAR; - } - break; - case 3: - magFilter = gl.LINEAR; - if (generateMipMaps) { - minFilter = gl.LINEAR_MIPMAP_LINEAR; - } else { - minFilter = gl.LINEAR; - } - break; - case 8: - magFilter = gl.NEAREST; - if (generateMipMaps) { - minFilter = gl.NEAREST_MIPMAP_LINEAR; - } else { - minFilter = gl.NEAREST; - } - break; - case 4: - magFilter = gl.NEAREST; - if (generateMipMaps) { - minFilter = gl.NEAREST_MIPMAP_NEAREST; - } else { - minFilter = gl.NEAREST; - } - break; - case 5: - magFilter = gl.NEAREST; - if (generateMipMaps) { - minFilter = gl.LINEAR_MIPMAP_NEAREST; - } else { - minFilter = gl.LINEAR; - } - break; - case 6: - magFilter = gl.NEAREST; - if (generateMipMaps) { - minFilter = gl.LINEAR_MIPMAP_LINEAR; - } else { - minFilter = gl.LINEAR; - } - break; - case 7: - magFilter = gl.NEAREST; - minFilter = gl.LINEAR; - break; - case 1: - magFilter = gl.NEAREST; - minFilter = gl.NEAREST; - break; - case 9: - magFilter = gl.LINEAR; - if (generateMipMaps) { - minFilter = gl.NEAREST_MIPMAP_NEAREST; - } else { - minFilter = gl.NEAREST; - } - break; - case 10: - magFilter = gl.LINEAR; - if (generateMipMaps) { - minFilter = gl.NEAREST_MIPMAP_LINEAR; - } else { - minFilter = gl.NEAREST; - } - break; - case 2: - magFilter = gl.LINEAR; - minFilter = gl.LINEAR; - break; - case 12: - magFilter = gl.LINEAR; - minFilter = gl.NEAREST; - break; - } - return { - min: minFilter, - mag: magFilter - }; - } - /** @internal */ - _createTexture() { - const texture = this._gl.createTexture(); - if (!texture) { - throw new Error("Unable to create texture"); - } - return texture; + minimizeInPlaceFromFloats(r, g, b) { + this.r = Math.min(r, this.r); + this.g = Math.min(g, this.g); + this.b = Math.min(b, this.b); + return this; } - /** @internal */ - _createHardwareTexture() { - return new WebGLHardwareTexture(this._createTexture(), this._gl); + /** + * Updates the current Color3 with the maximal coordinate values between its and the given coordinates. + * @param r defines the r coordinate of the operand + * @param g defines the g coordinate of the operand + * @param b defines the b coordinate of the operand + * @returns the current updated Color3 + */ + maximizeInPlaceFromFloats(r, g, b) { + this.r = Math.max(r, this.r); + this.g = Math.max(g, this.g); + this.b = Math.max(b, this.b); + return this; } /** - * Creates an internal texture without binding it to a framebuffer * @internal - * @param size defines the size of the texture - * @param options defines the options used to create the texture - * @param delayGPUTextureCreation true to delay the texture creation the first time it is really needed. false to create it right away - * @param source source type of the texture - * @returns a new internal texture + * Do not use */ - _createInternalTexture(size, options, delayGPUTextureCreation = true, source = InternalTextureSource.Unknown) { - let generateMipMaps = false; - let type = 0; - let samplingMode = 3; - let format = 5; - let useSRGBBuffer = false; - let samples = 1; - let label; - if (options !== void 0 && typeof options === "object") { - generateMipMaps = !!options.generateMipMaps; - type = options.type === void 0 ? 0 : options.type; - samplingMode = options.samplingMode === void 0 ? 3 : options.samplingMode; - format = options.format === void 0 ? 5 : options.format; - useSRGBBuffer = options.useSRGBBuffer === void 0 ? false : options.useSRGBBuffer; - samples = options.samples ?? 1; - label = options.label; - } else { - generateMipMaps = !!options; - } - useSRGBBuffer && (useSRGBBuffer = this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU)); - if (type === 1 && !this._caps.textureFloatLinearFiltering) { - samplingMode = 1; - } else if (type === 2 && !this._caps.textureHalfFloatLinearFiltering) { - samplingMode = 1; - } - if (type === 1 && !this._caps.textureFloat) { - type = 0; - Logger.Warn("Float textures are not supported. Type forced to TEXTURETYPE_UNSIGNED_BYTE"); - } - const gl = this._gl; - const texture = new InternalTexture(this, source); - const width = size.width || size; - const height = size.height || size; - const depth = size.depth || 0; - const layers = size.layers || 0; - const filters = this._getSamplingParameters(samplingMode, generateMipMaps); - const target = layers !== 0 ? gl.TEXTURE_2D_ARRAY : depth !== 0 ? gl.TEXTURE_3D : gl.TEXTURE_2D; - const sizedFormat = this._getRGBABufferInternalSizedFormat(type, format, useSRGBBuffer); - const internalFormat = this._getInternalFormat(format); - const textureType = this._getWebGLTextureType(type); - this._bindTextureDirectly(target, texture); - if (layers !== 0) { - texture.is2DArray = true; - gl.texImage3D(target, 0, sizedFormat, width, height, layers, 0, internalFormat, textureType, null); - } else if (depth !== 0) { - texture.is3D = true; - gl.texImage3D(target, 0, sizedFormat, width, height, depth, 0, internalFormat, textureType, null); - } else { - gl.texImage2D(target, 0, sizedFormat, width, height, 0, internalFormat, textureType, null); - } - gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, filters.mag); - gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, filters.min); - gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - if (generateMipMaps) { - this._gl.generateMipmap(target); - } - this._bindTextureDirectly(target, null); - texture._useSRGBBuffer = useSRGBBuffer; - texture.baseWidth = width; - texture.baseHeight = height; - texture.width = width; - texture.height = height; - texture.depth = layers; - texture.isReady = true; - texture.samples = samples; - texture.generateMipMaps = generateMipMaps; - texture.samplingMode = samplingMode; - texture.type = type; - texture.format = format; - texture.label = label; - this._internalTexturesCache.push(texture); - return texture; + floorToRef(_result) { + throw new ReferenceError("Can not floor a color"); } /** * @internal + * Do not use */ - _getUseSRGBBuffer(useSRGBBuffer, noMipmap) { - return useSRGBBuffer && this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU || noMipmap); + floor() { + throw new ReferenceError("Can not floor a color"); } - _createTextureBase(url, noMipmap, invertY, scene, samplingMode = 3, onLoad = null, onError = null, prepareTexture, prepareTextureProcessFunction, buffer = null, fallback = null, format = null, forcedExtension = null, mimeType, loaderOptions, useSRGBBuffer) { - url = url || ""; - const fromData = url.substr(0, 5) === "data:"; - const fromBlob = url.substr(0, 5) === "blob:"; - const isBase64 = fromData && url.indexOf(";base64,") !== -1; - const texture = fallback ? fallback : new InternalTexture(this, InternalTextureSource.Url); - if (texture !== fallback) { - texture.label = url.substring(0, 60); - } - const originalUrl = url; - if (this._transformTextureUrl && !isBase64 && !fallback && !buffer) { - url = this._transformTextureUrl(url); - } - if (originalUrl !== url) { - texture._originalUrl = originalUrl; - } - const lastDot = url.lastIndexOf("."); - let extension = forcedExtension ? forcedExtension : lastDot > -1 ? url.substring(lastDot).toLowerCase() : ""; - let loader = null; - const queryStringIndex = extension.indexOf("?"); - if (queryStringIndex > -1) { - extension = extension.split("?")[0]; - } - for (const availableLoader of _ThinEngine._TextureLoaders) { - if (availableLoader.canLoad(extension, mimeType)) { - loader = availableLoader; - break; - } - } - if (scene) { - scene.addPendingData(texture); - } - texture.url = url; - texture.generateMipMaps = !noMipmap; - texture.samplingMode = samplingMode; - texture.invertY = invertY; - texture._useSRGBBuffer = this._getUseSRGBBuffer(!!useSRGBBuffer, noMipmap); - if (!this._doNotHandleContextLost) { - texture._buffer = buffer; - } - let onLoadObserver = null; - if (onLoad && !fallback) { - onLoadObserver = texture.onLoadedObservable.add(onLoad); - } - if (!fallback) { - this._internalTexturesCache.push(texture); - } - const onInternalError = (message, exception) => { - if (scene) { - scene.removePendingData(texture); - } - if (url === originalUrl) { - if (onLoadObserver) { - texture.onLoadedObservable.remove(onLoadObserver); - } - if (EngineStore.UseFallbackTexture && url !== EngineStore.FallbackTexture) { - this._createTextureBase(EngineStore.FallbackTexture, noMipmap, texture.invertY, scene, samplingMode, null, onError, prepareTexture, prepareTextureProcessFunction, buffer, texture); - } - message = (message || "Unknown error") + (EngineStore.UseFallbackTexture ? " - Fallback texture was used" : ""); - texture.onErrorObservable.notifyObservers({ message, exception }); - if (onError) { - onError(message, exception); - } - } else { - Logger.Warn(`Failed to load ${url}, falling back to ${originalUrl}`); - this._createTextureBase(originalUrl, noMipmap, texture.invertY, scene, samplingMode, onLoad, onError, prepareTexture, prepareTextureProcessFunction, buffer, texture, format, forcedExtension, mimeType, loaderOptions, useSRGBBuffer); - } - }; - if (loader) { - const callback = (data) => { - loader.loadData(data, texture, (width, height, loadMipmap, isCompressed, done, loadFailed) => { - if (loadFailed) { - onInternalError("TextureLoader failed to load data"); - } else { - prepareTexture(texture, extension, scene, { width, height }, texture.invertY, !loadMipmap, isCompressed, () => { - done(); - return false; - }, samplingMode); - } - }, loaderOptions); - }; - if (!buffer) { - this._loadFile(url, (data) => callback(new Uint8Array(data)), void 0, scene ? scene.offlineProvider : void 0, true, (request, exception) => { - onInternalError("Unable to load " + (request ? request.responseURL : url, exception)); - }); - } else { - if (buffer instanceof ArrayBuffer) { - callback(new Uint8Array(buffer)); - } else if (ArrayBuffer.isView(buffer)) { - callback(buffer); - } else { - if (onError) { - onError("Unable to load: only ArrayBuffer or ArrayBufferView is supported", null); - } - } - } - } else { - const onload = (img) => { - if (fromBlob && !this._doNotHandleContextLost) { - texture._buffer = img; - } - prepareTexture(texture, extension, scene, img, texture.invertY, noMipmap, false, prepareTextureProcessFunction, samplingMode); - }; - if (!fromData || isBase64) { - if (buffer && (typeof buffer.decoding === "string" || buffer.close)) { - onload(buffer); - } else { - _ThinEngine._FileToolsLoadImage(url, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType, texture.invertY && this._features.needsInvertingBitmap ? { imageOrientation: "flipY" } : void 0); - } - } else if (typeof buffer === "string" || buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer) || buffer instanceof Blob) { - _ThinEngine._FileToolsLoadImage(buffer, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType, texture.invertY && this._features.needsInvertingBitmap ? { imageOrientation: "flipY" } : void 0); - } else if (buffer) { - onload(buffer); - } - } - return texture; + /** + * @internal + * Do not use + */ + fractToRef(_result) { + throw new ReferenceError("Can not fract a color"); } /** - * Usually called from Texture.ts. - * Passed information to create a WebGLTexture - * @param url defines a value which contains one of the following: - * * A conventional http URL, e.g. 'http://...' or 'file://...' - * * A base64 string of in-line texture data, e.g. 'data:image/jpg;base64,/...' - * * An indicator that data being passed using the buffer parameter, e.g. 'data:mytexture.jpg' - * @param noMipmap defines a boolean indicating that no mipmaps shall be generated. Ignored for compressed textures. They must be in the file - * @param invertY when true, image is flipped when loaded. You probably want true. Certain compressed textures may invert this if their default is inverted (eg. ktx) - * @param scene needed for loading to the correct scene - * @param samplingMode mode with should be used sample / access the texture (Default: Texture.TRILINEAR_SAMPLINGMODE) - * @param onLoad optional callback to be called upon successful completion - * @param onError optional callback to be called upon failure - * @param buffer a source of a file previously fetched as either a base64 string, an ArrayBuffer (compressed or image format), HTMLImageElement (image format), or a Blob - * @param fallback an internal argument in case the function must be called again, due to etc1 not having alpha capabilities - * @param format internal format. Default: RGB when extension is '.jpg' else RGBA. Ignored for compressed textures - * @param forcedExtension defines the extension to use to pick the right loader - * @param mimeType defines an optional mime type - * @param loaderOptions options to be passed to the loader - * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg) - * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU). - * @returns a InternalTexture for assignment back into BABYLON.Texture + * @internal + * Do not use */ - createTexture(url, noMipmap, invertY, scene, samplingMode = 3, onLoad = null, onError = null, buffer = null, fallback = null, format = null, forcedExtension = null, mimeType, loaderOptions, creationFlags, useSRGBBuffer) { - return this._createTextureBase(url, noMipmap, invertY, scene, samplingMode, onLoad, onError, this._prepareWebGLTexture.bind(this), (potWidth, potHeight, img, extension, texture, continuationCallback) => { - const gl = this._gl; - const isPot = img.width === potWidth && img.height === potHeight; - texture._creationFlags = creationFlags ?? 0; - const tip = this._getTexImageParametersForCreateTexture(format, extension, texture._useSRGBBuffer); - if (isPot) { - gl.texImage2D(gl.TEXTURE_2D, 0, tip.internalFormat, tip.format, tip.type, img); - return false; - } - const maxTextureSize = this._caps.maxTextureSize; - if (img.width > maxTextureSize || img.height > maxTextureSize || !this._supportsHardwareTextureRescaling) { - this._prepareWorkingCanvas(); - if (!this._workingCanvas || !this._workingContext) { - return false; - } - this._workingCanvas.width = potWidth; - this._workingCanvas.height = potHeight; - this._workingContext.drawImage(img, 0, 0, img.width, img.height, 0, 0, potWidth, potHeight); - gl.texImage2D(gl.TEXTURE_2D, 0, tip.internalFormat, tip.format, tip.type, this._workingCanvas); - texture.width = potWidth; - texture.height = potHeight; - return false; - } else { - const source = new InternalTexture(this, InternalTextureSource.Temp); - this._bindTextureDirectly(gl.TEXTURE_2D, source, true); - gl.texImage2D(gl.TEXTURE_2D, 0, tip.internalFormat, tip.format, tip.type, img); - this._rescaleTexture(source, texture, scene, tip.format, () => { - this._releaseTexture(source); - this._bindTextureDirectly(gl.TEXTURE_2D, texture, true); - continuationCallback(); - }); - } - return true; - }, buffer, fallback, format, forcedExtension, mimeType, loaderOptions, useSRGBBuffer); + fract() { + throw new ReferenceError("Can not fract a color"); } /** - * Calls to the GL texImage2D and texImage3D functions require three arguments describing the pixel format of the texture. - * createTexture derives these from the babylonFormat and useSRGBBuffer arguments and also the file extension of the URL it's working with. - * This function encapsulates that derivation for easy unit testing. - * @param babylonFormat Babylon's format enum, as specified in ITextureCreationOptions. - * @param fileExtension The file extension including the dot, e.g. .jpg. - * @param useSRGBBuffer Use SRGB not linear. - * @returns The options to pass to texImage2D or texImage3D calls. - * @internal + * Determines equality between Color3 objects + * @param otherColor defines the second operand + * @returns true if the rgb values are equal to the given ones */ - _getTexImageParametersForCreateTexture(babylonFormat, fileExtension, useSRGBBuffer) { - if (babylonFormat === void 0 || babylonFormat === null) { - babylonFormat = fileExtension === ".jpg" && !useSRGBBuffer ? 4 : 5; - } - let format, internalFormat; - if (this.webGLVersion === 1) { - format = this._getInternalFormat(babylonFormat, useSRGBBuffer); - internalFormat = format; - } else { - format = this._getInternalFormat(babylonFormat, false); - internalFormat = this._getRGBABufferInternalSizedFormat(0, babylonFormat, useSRGBBuffer); - } - return { - internalFormat, - format, - type: this._gl.UNSIGNED_BYTE - }; + equals(otherColor) { + return otherColor && this.r === otherColor.r && this.g === otherColor.g && this.b === otherColor.b; + } + /** + * Alias for equalsToFloats + * @param r red color component + * @param g green color component + * @param b blue color component + * @returns boolean + */ + equalsFloats(r, g, b) { + return this.equalsToFloats(r, g, b); + } + /** + * Determines equality between the current Color3 object and a set of r,b,g values + * @param r defines the red component to check + * @param g defines the green component to check + * @param b defines the blue component to check + * @returns true if the rgb values are equal to the given ones + */ + equalsToFloats(r, g, b) { + return this.r === r && this.g === g && this.b === b; + } + /** + * Returns true if the current Color3 and the given color coordinates are distant less than epsilon + * @param otherColor defines the second operand + * @param epsilon defines the minimal distance to define values as equals + * @returns true if both colors are distant less than epsilon + */ + equalsWithEpsilon(otherColor, epsilon = Epsilon) { + return Scalar.WithinEpsilon(this.r, otherColor.r, epsilon) && Scalar.WithinEpsilon(this.g, otherColor.g, epsilon) && Scalar.WithinEpsilon(this.b, otherColor.b, epsilon); } /** - * Loads an image as an HTMLImageElement. - * @param input url string, ArrayBuffer, or Blob to load - * @param onLoad callback called when the image successfully loads - * @param onError callback called when the image fails to load - * @param offlineProvider offline provider for caching - * @param mimeType optional mime type - * @param imageBitmapOptions optional the options to use when creating an ImageBitmap - * @returns the HTMLImageElement of the loaded image * @internal + * Do not use */ - static _FileToolsLoadImage(input, onLoad, onError, offlineProvider, mimeType, imageBitmapOptions) { - throw _WarnImport("FileTools"); + negate() { + throw new ReferenceError("Can not negate a color"); } /** * @internal + * Do not use */ - _rescaleTexture(source, destination, scene, internalFormat, onComplete) { + negateInPlace() { + throw new ReferenceError("Can not negate a color"); } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Creates a raw texture - * @param data defines the data to store in the texture - * @param width defines the width of the texture - * @param height defines the height of the texture - * @param format defines the format of the data - * @param generateMipMaps defines if the engine should generate the mip levels - * @param invertY defines if data must be stored with Y axis inverted - * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default) - * @param compression defines the compression used (null by default) - * @param type defines the type fo the data (Engine.TEXTURETYPE_UNSIGNED_INT by default) - * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg) - * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU). - * @returns the raw texture inside an InternalTexture + * @internal + * Do not use */ - createRawTexture(data, width, height, format, generateMipMaps, invertY, samplingMode, compression = null, type = 0, creationFlags = 0, useSRGBBuffer = false) { - throw _WarnImport("Engine.RawTexture"); + negateToRef(_result) { + throw new ReferenceError("Can not negate a color"); } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Creates a new raw cube texture - * @param data defines the array of data to use to create each face - * @param size defines the size of the textures - * @param format defines the format of the data - * @param type defines the type of the data (like Engine.TEXTURETYPE_UNSIGNED_INT) - * @param generateMipMaps defines if the engine should generate the mip levels - * @param invertY defines if data must be stored with Y axis inverted - * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE) - * @param compression defines the compression used (null by default) - * @returns the cube texture as an InternalTexture + * Creates a new Color3 with the current Color3 values multiplied by scale + * @param scale defines the scaling factor to apply + * @returns a new Color3 object */ - createRawCubeTexture(data, size, format, type, generateMipMaps, invertY, samplingMode, compression = null) { - throw _WarnImport("Engine.RawTexture"); + scale(scale) { + return new this.constructor(this.r * scale, this.g * scale, this.b * scale); } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Creates a new raw 3D texture - * @param data defines the data used to create the texture - * @param width defines the width of the texture - * @param height defines the height of the texture - * @param depth defines the depth of the texture - * @param format defines the format of the texture - * @param generateMipMaps defines if the engine must generate mip levels - * @param invertY defines if data must be stored with Y axis inverted - * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE) - * @param compression defines the compressed used (can be null) - * @param textureType defines the compressed used (can be null) - * @returns a new raw 3D texture (stored in an InternalTexture) + * Multiplies the Color3 values by the float "scale" + * @param scale defines the scaling factor to apply + * @returns the current updated Color3 */ - createRawTexture3D(data, width, height, depth, format, generateMipMaps, invertY, samplingMode, compression = null, textureType = 0) { - throw _WarnImport("Engine.RawTexture"); + scaleInPlace(scale) { + this.r *= scale; + this.g *= scale; + this.b *= scale; + return this; } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Creates a new raw 2D array texture - * @param data defines the data used to create the texture - * @param width defines the width of the texture - * @param height defines the height of the texture - * @param depth defines the number of layers of the texture - * @param format defines the format of the texture - * @param generateMipMaps defines if the engine must generate mip levels - * @param invertY defines if data must be stored with Y axis inverted - * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE) - * @param compression defines the compressed used (can be null) - * @param textureType defines the compressed used (can be null) - * @returns a new raw 2D array texture (stored in an InternalTexture) + * Multiplies the rgb values by scale and stores the result into "result" + * @param scale defines the scaling factor + * @param result defines the Color3 object where to store the result + * @returns the result Color3 */ - createRawTexture2DArray(data, width, height, depth, format, generateMipMaps, invertY, samplingMode, compression = null, textureType = 0) { - throw _WarnImport("Engine.RawTexture"); + scaleToRef(scale, result) { + result.r = this.r * scale; + result.g = this.g * scale; + result.b = this.b * scale; + return result; } /** - * @internal + * Scale the current Color3 values by a factor and add the result to a given Color3 + * @param scale defines the scale factor + * @param result defines color to store the result into + * @returns the result Color3 */ - _unpackFlipY(value) { - if (this._unpackFlipYCached !== value) { - this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, value ? 1 : 0); - if (this.enableUnpackFlipYCached) { - this._unpackFlipYCached = value; - } - } + scaleAndAddToRef(scale, result) { + result.r += this.r * scale; + result.g += this.g * scale; + result.b += this.b * scale; + return result; } - /** @internal */ - _getUnpackAlignement() { - return this._gl.getParameter(this._gl.UNPACK_ALIGNMENT); + /** + * Clamps the rgb values by the min and max values and stores the result into "result" + * @param min defines minimum clamping value (default is 0) + * @param max defines maximum clamping value (default is 1) + * @param result defines color to store the result into + * @returns the result Color3 + */ + clampToRef(min = 0, max = 1, result) { + result.r = Clamp(this.r, min, max); + result.g = Clamp(this.g, min, max); + result.b = Clamp(this.b, min, max); + return result; } - _getTextureTarget(texture) { - if (texture.isCube) { - return this._gl.TEXTURE_CUBE_MAP; - } else if (texture.is3D) { - return this._gl.TEXTURE_3D; - } else if (texture.is2DArray || texture.isMultiview) { - return this._gl.TEXTURE_2D_ARRAY; - } - return this._gl.TEXTURE_2D; + /** + * Creates a new Color3 set with the added values of the current Color3 and of the given one + * @param otherColor defines the second operand + * @returns the new Color3 + */ + add(otherColor) { + return new this.constructor(this.r + otherColor.r, this.g + otherColor.g, this.b + otherColor.b); } /** - * Update the sampling mode of a given texture - * @param samplingMode defines the required sampling mode - * @param texture defines the texture to update - * @param generateMipMaps defines whether to generate mipmaps for the texture + * Adds the given color to the current Color3 + * @param otherColor defines the second operand + * @returns the current updated Color3 */ - updateTextureSamplingMode(samplingMode, texture, generateMipMaps = false) { - const target = this._getTextureTarget(texture); - const filters = this._getSamplingParameters(samplingMode, texture.useMipMaps || generateMipMaps); - this._setTextureParameterInteger(target, this._gl.TEXTURE_MAG_FILTER, filters.mag, texture); - this._setTextureParameterInteger(target, this._gl.TEXTURE_MIN_FILTER, filters.min); - if (generateMipMaps) { - texture.generateMipMaps = true; - this._gl.generateMipmap(target); - } - this._bindTextureDirectly(target, null); - texture.samplingMode = samplingMode; + addInPlace(otherColor) { + this.r += otherColor.r; + this.g += otherColor.g; + this.b += otherColor.b; + return this; } /** - * Update the dimensions of a texture - * @param texture texture to update - * @param width new width of the texture - * @param height new height of the texture - * @param depth new depth of the texture + * Adds the given coordinates to the current Color3 + * @param r defines the r coordinate of the operand + * @param g defines the g coordinate of the operand + * @param b defines the b coordinate of the operand + * @returns the current updated Color3 */ - updateTextureDimensions(texture, width, height, depth = 1) { + addInPlaceFromFloats(r, g, b) { + this.r += r; + this.g += g; + this.b += b; + return this; } /** - * Update the sampling mode of a given texture - * @param texture defines the texture to update - * @param wrapU defines the texture wrap mode of the u coordinates - * @param wrapV defines the texture wrap mode of the v coordinates - * @param wrapR defines the texture wrap mode of the r coordinates + * Stores the result of the addition of the current Color3 and given one rgb values into "result" + * @param otherColor defines the second operand + * @param result defines Color3 object to store the result into + * @returns the unmodified current Color3 */ - updateTextureWrappingMode(texture, wrapU, wrapV = null, wrapR = null) { - const target = this._getTextureTarget(texture); - if (wrapU !== null) { - this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(wrapU), texture); - texture._cachedWrapU = wrapU; - } - if (wrapV !== null) { - this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(wrapV), texture); - texture._cachedWrapV = wrapV; - } - if ((texture.is2DArray || texture.is3D) && wrapR !== null) { - this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(wrapR), texture); - texture._cachedWrapR = wrapR; - } - this._bindTextureDirectly(target, null); + addToRef(otherColor, result) { + result.r = this.r + otherColor.r; + result.g = this.g + otherColor.g; + result.b = this.b + otherColor.b; + return result; } /** - * @internal + * Returns a new Color3 set with the subtracted values of the given one from the current Color3 + * @param otherColor defines the second operand + * @returns the new Color3 */ - _setupDepthStencilTexture(internalTexture, size, generateStencil, bilinearFiltering, comparisonFunction, samples = 1) { - const width = size.width || size; - const height = size.height || size; - const layers = size.layers || 0; - const depth = size.depth || 0; - internalTexture.baseWidth = width; - internalTexture.baseHeight = height; - internalTexture.width = width; - internalTexture.height = height; - internalTexture.is2DArray = layers > 0; - internalTexture.depth = layers || depth; - internalTexture.isReady = true; - internalTexture.samples = samples; - internalTexture.generateMipMaps = false; - internalTexture.samplingMode = bilinearFiltering ? 2 : 1; - internalTexture.type = 0; - internalTexture._comparisonFunction = comparisonFunction; - const gl = this._gl; - const target = this._getTextureTarget(internalTexture); - const samplingParameters = this._getSamplingParameters(internalTexture.samplingMode, false); - gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, samplingParameters.mag); - gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, samplingParameters.min); - gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - if (this.webGLVersion > 1) { - if (comparisonFunction === 0) { - gl.texParameteri(target, gl.TEXTURE_COMPARE_FUNC, 515); - gl.texParameteri(target, gl.TEXTURE_COMPARE_MODE, gl.NONE); - } else { - gl.texParameteri(target, gl.TEXTURE_COMPARE_FUNC, comparisonFunction); - gl.texParameteri(target, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE); - } - } + subtract(otherColor) { + return new this.constructor(this.r - otherColor.r, this.g - otherColor.g, this.b - otherColor.b); } /** - * @internal + * Stores the result of the subtraction of given one from the current Color3 rgb values into "result" + * @param otherColor defines the second operand + * @param result defines Color3 object to store the result into + * @returns the unmodified current Color3 */ - _uploadCompressedDataToTextureDirectly(texture, internalFormat, width, height, data, faceIndex = 0, lod = 0) { - const gl = this._gl; - let target = gl.TEXTURE_2D; - if (texture.isCube) { - target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex; - } - if (texture._useSRGBBuffer) { - switch (internalFormat) { - case 37492: - case 36196: - if (this._caps.etc2) { - internalFormat = gl.COMPRESSED_SRGB8_ETC2; - } else { - texture._useSRGBBuffer = false; - } - break; - case 37496: - if (this._caps.etc2) { - internalFormat = gl.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC; - } else { - texture._useSRGBBuffer = false; - } - break; - case 36492: - internalFormat = gl.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT; - break; - case 37808: - internalFormat = gl.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR; - break; - case 33776: - if (this._caps.s3tc_srgb) { - internalFormat = gl.COMPRESSED_SRGB_S3TC_DXT1_EXT; - } else { - texture._useSRGBBuffer = false; - } - break; - case 33777: - if (this._caps.s3tc_srgb) { - internalFormat = gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; - } else { - texture._useSRGBBuffer = false; - } - break; - case 33779: - if (this._caps.s3tc_srgb) { - internalFormat = gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; - } else { - texture._useSRGBBuffer = false; - } - break; - default: - texture._useSRGBBuffer = false; - break; - } - } - this._gl.compressedTexImage2D(target, lod, internalFormat, width, height, 0, data); + subtractToRef(otherColor, result) { + result.r = this.r - otherColor.r; + result.g = this.g - otherColor.g; + result.b = this.b - otherColor.b; + return result; } /** - * @internal + * Subtract the given color from the current Color3 + * @param otherColor defines the second operand + * @returns the current updated Color3 */ - _uploadDataToTextureDirectly(texture, imageData, faceIndex = 0, lod = 0, babylonInternalFormat, useTextureWidthAndHeight = false) { - const gl = this._gl; - const textureType = this._getWebGLTextureType(texture.type); - const format = this._getInternalFormat(texture.format); - const internalFormat = babylonInternalFormat === void 0 ? this._getRGBABufferInternalSizedFormat(texture.type, texture.format, texture._useSRGBBuffer) : this._getInternalFormat(babylonInternalFormat, texture._useSRGBBuffer); - this._unpackFlipY(texture.invertY); - let target = gl.TEXTURE_2D; - if (texture.isCube) { - target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex; - } - const lodMaxWidth = Math.round(Math.log(texture.width) * Math.LOG2E); - const lodMaxHeight = Math.round(Math.log(texture.height) * Math.LOG2E); - const width = useTextureWidthAndHeight ? texture.width : Math.pow(2, Math.max(lodMaxWidth - lod, 0)); - const height = useTextureWidthAndHeight ? texture.height : Math.pow(2, Math.max(lodMaxHeight - lod, 0)); - gl.texImage2D(target, lod, internalFormat, width, height, 0, format, textureType, imageData); + subtractInPlace(otherColor) { + this.r -= otherColor.r; + this.g -= otherColor.g; + this.b -= otherColor.b; + return this; } /** - * Update a portion of an internal texture - * @param texture defines the texture to update - * @param imageData defines the data to store into the texture - * @param xOffset defines the x coordinates of the update rectangle - * @param yOffset defines the y coordinates of the update rectangle - * @param width defines the width of the update rectangle - * @param height defines the height of the update rectangle - * @param faceIndex defines the face index if texture is a cube (0 by default) - * @param lod defines the lod level to update (0 by default) - * @param generateMipMaps defines whether to generate mipmaps or not + * Returns a new Color3 set with the subtraction of the given floats from the current Color3 coordinates + * @param r defines the r coordinate of the operand + * @param g defines the g coordinate of the operand + * @param b defines the b coordinate of the operand + * @returns the resulting Color3 */ - updateTextureData(texture, imageData, xOffset, yOffset, width, height, faceIndex = 0, lod = 0, generateMipMaps = false) { - const gl = this._gl; - const textureType = this._getWebGLTextureType(texture.type); - const format = this._getInternalFormat(texture.format); - this._unpackFlipY(texture.invertY); - let targetForBinding = gl.TEXTURE_2D; - let target = gl.TEXTURE_2D; - if (texture.isCube) { - target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex; - targetForBinding = gl.TEXTURE_CUBE_MAP; - } - this._bindTextureDirectly(targetForBinding, texture, true); - gl.texSubImage2D(target, lod, xOffset, yOffset, width, height, format, textureType, imageData); - if (generateMipMaps) { - this._gl.generateMipmap(target); - } - this._bindTextureDirectly(targetForBinding, null); + subtractFromFloats(r, g, b) { + return new this.constructor(this.r - r, this.g - g, this.b - b); } /** - * @internal + * Subtracts the given floats from the current Color3 coordinates and set the given color "result" with this result + * @param r defines the r coordinate of the operand + * @param g defines the g coordinate of the operand + * @param b defines the b coordinate of the operand + * @param result defines the Color3 object where to store the result + * @returns the result */ - _uploadArrayBufferViewToTexture(texture, imageData, faceIndex = 0, lod = 0) { - const gl = this._gl; - const bindTarget = texture.isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D; - this._bindTextureDirectly(bindTarget, texture, true); - this._uploadDataToTextureDirectly(texture, imageData, faceIndex, lod); - this._bindTextureDirectly(bindTarget, null, true); + subtractFromFloatsToRef(r, g, b, result) { + return result.copyFromFloats(this.r - r, this.g - g, this.b - b); } - _prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode) { - const gl = this._gl; - if (!gl) { - return; - } - const filters = this._getSamplingParameters(samplingMode, !noMipmap); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filters.mag); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filters.min); - if (!noMipmap && !isCompressed) { - gl.generateMipmap(gl.TEXTURE_2D); - } - this._bindTextureDirectly(gl.TEXTURE_2D, null); - if (scene) { - scene.removePendingData(texture); - } - texture.onLoadedObservable.notifyObservers(texture); - texture.onLoadedObservable.clear(); - } - _prepareWebGLTexture(texture, extension, scene, img, invertY, noMipmap, isCompressed, processFunction, samplingMode = 3) { - const maxTextureSize = this.getCaps().maxTextureSize; - const potWidth = Math.min(maxTextureSize, this.needPOTTextures ? _ThinEngine.GetExponentOfTwo(img.width, maxTextureSize) : img.width); - const potHeight = Math.min(maxTextureSize, this.needPOTTextures ? _ThinEngine.GetExponentOfTwo(img.height, maxTextureSize) : img.height); - const gl = this._gl; - if (!gl) { - return; - } - if (!texture._hardwareTexture) { - if (scene) { - scene.removePendingData(texture); - } - return; - } - this._bindTextureDirectly(gl.TEXTURE_2D, texture, true); - this._unpackFlipY(invertY === void 0 ? true : invertY ? true : false); - texture.baseWidth = img.width; - texture.baseHeight = img.height; - texture.width = potWidth; - texture.height = potHeight; - texture.isReady = true; - texture.type = texture.type !== -1 ? texture.type : 0; - texture.format = texture.format !== -1 ? texture.format : extension === ".jpg" && !texture._useSRGBBuffer ? 4 : 5; - if (processFunction(potWidth, potHeight, img, extension, texture, () => { - this._prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode); - })) { - return; - } - this._prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode); + /** + * Copy the current object + * @returns a new Color3 copied the current one + */ + clone() { + return new this.constructor(this.r, this.g, this.b); } /** - * @internal + * Copies the rgb values from the source in the current Color3 + * @param source defines the source Color3 object + * @returns the updated Color3 object */ - _setupFramebufferDepthAttachments(generateStencilBuffer, generateDepthBuffer, width, height, samples = 1) { - const gl = this._gl; - if (generateStencilBuffer && generateDepthBuffer) { - return this._createRenderBuffer(width, height, samples, gl.DEPTH_STENCIL, gl.DEPTH24_STENCIL8, gl.DEPTH_STENCIL_ATTACHMENT); - } - if (generateDepthBuffer) { - let depthFormat = gl.DEPTH_COMPONENT16; - if (this._webGLVersion > 1) { - depthFormat = gl.DEPTH_COMPONENT32F; - } - return this._createRenderBuffer(width, height, samples, depthFormat, depthFormat, gl.DEPTH_ATTACHMENT); - } - if (generateStencilBuffer) { - return this._createRenderBuffer(width, height, samples, gl.STENCIL_INDEX8, gl.STENCIL_INDEX8, gl.STENCIL_ATTACHMENT); - } - return null; + copyFrom(source) { + this.r = source.r; + this.g = source.g; + this.b = source.b; + return this; } /** - * @internal + * Updates the Color3 rgb values from the given floats + * @param r defines the red component to read from + * @param g defines the green component to read from + * @param b defines the blue component to read from + * @returns the current Color3 object */ - _createRenderBuffer(width, height, samples, internalFormat, msInternalFormat, attachment, unbindBuffer = true) { - const gl = this._gl; - const renderBuffer = gl.createRenderbuffer(); - return this._updateRenderBuffer(renderBuffer, width, height, samples, internalFormat, msInternalFormat, attachment, unbindBuffer); - } - _updateRenderBuffer(renderBuffer, width, height, samples, internalFormat, msInternalFormat, attachment, unbindBuffer = true) { - const gl = this._gl; - gl.bindRenderbuffer(gl.RENDERBUFFER, renderBuffer); - if (samples > 1 && gl.renderbufferStorageMultisample) { - gl.renderbufferStorageMultisample(gl.RENDERBUFFER, samples, msInternalFormat, width, height); - } else { - gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, width, height); - } - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, renderBuffer); - if (unbindBuffer) { - gl.bindRenderbuffer(gl.RENDERBUFFER, null); - } - return renderBuffer; + copyFromFloats(r, g, b) { + this.r = r; + this.g = g; + this.b = b; + return this; } /** - * @internal + * Updates the Color3 rgb values from the given floats + * @param r defines the red component to read from + * @param g defines the green component to read from + * @param b defines the blue component to read from + * @returns the current Color3 object */ - _releaseTexture(texture) { - var _a; - this._deleteTexture((_a = texture._hardwareTexture) == null ? void 0 : _a.underlyingResource); - this.unbindAllTextures(); - const index = this._internalTexturesCache.indexOf(texture); - if (index !== -1) { - this._internalTexturesCache.splice(index, 1); - } - if (texture._lodTextureHigh) { - texture._lodTextureHigh.dispose(); - } - if (texture._lodTextureMid) { - texture._lodTextureMid.dispose(); - } - if (texture._lodTextureLow) { - texture._lodTextureLow.dispose(); - } - if (texture._irradianceTexture) { - texture._irradianceTexture.dispose(); - } + set(r, g, b) { + return this.copyFromFloats(r, g, b); } /** - * @internal + * Copies the given float to the current Color3 coordinates + * @param v defines the r, g and b coordinates of the operand + * @returns the current updated Color3 */ - _releaseRenderTargetWrapper(rtWrapper) { - const index = this._renderTargetWrapperCache.indexOf(rtWrapper); - if (index !== -1) { - this._renderTargetWrapperCache.splice(index, 1); - } - } - _deleteTexture(texture) { - if (texture) { - this._gl.deleteTexture(texture); - } - } - _setProgram(program) { - if (this._currentProgram !== program) { - this._gl.useProgram(program); - this._currentProgram = program; - } + setAll(v) { + this.r = this.g = this.b = v; + return this; } /** - * Binds an effect to the webGL context - * @param effect defines the effect to bind + * Compute the Color3 hexadecimal code as a string + * @returns a string containing the hexadecimal representation of the Color3 object */ - bindSamplers(effect) { - const webGLPipelineContext = effect.getPipelineContext(); - this._setProgram(webGLPipelineContext.program); - const samplers = effect.getSamplers(); - for (let index = 0; index < samplers.length; index++) { - const uniform = effect.getUniform(samplers[index]); - if (uniform) { - this._boundUniforms[index] = uniform; - } - } - this._currentEffect = null; + toHexString() { + const intR = Math.round(this.r * 255); + const intG = Math.round(this.g * 255); + const intB = Math.round(this.b * 255); + return "#" + ToHex(intR) + ToHex(intG) + ToHex(intB); } - _activateCurrentTexture() { - if (this._currentTextureChannel !== this._activeChannel) { - this._gl.activeTexture(this._gl.TEXTURE0 + this._activeChannel); - this._currentTextureChannel = this._activeChannel; - } + /** + * Converts current color in rgb space to HSV values + * @returns a new color3 representing the HSV values + */ + toHSV() { + const result = new this.constructor(); + this.toHSVToRef(result); + return result; } /** - * @internal + * Converts current color in rgb space to HSV values + * @param result defines the Color3 where to store the HSV values */ - _bindTextureDirectly(target, texture, forTextureDataUpdate = false, force = false) { - var _a; - let wasPreviouslyBound = false; - const isTextureForRendering = texture && texture._associatedChannel > -1; - if (forTextureDataUpdate && isTextureForRendering) { - this._activeChannel = texture._associatedChannel; + toHSVToRef(result) { + const r = this.r; + const g = this.g; + const b = this.b; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + let h = 0; + let s = 0; + const v = max; + const dm = max - min; + if (max !== 0) { + s = dm / max; } - const currentTextureBound = this._boundTexturesCache[this._activeChannel]; - if (currentTextureBound !== texture || force) { - this._activateCurrentTexture(); - if (texture && texture.isMultiview) { - Logger.Error(["_bindTextureDirectly called with a multiview texture!", target, texture]); - throw "_bindTextureDirectly called with a multiview texture!"; - } else { - this._gl.bindTexture(target, ((_a = texture == null ? void 0 : texture._hardwareTexture) == null ? void 0 : _a.underlyingResource) ?? null); - } - this._boundTexturesCache[this._activeChannel] = texture; - if (texture) { - texture._associatedChannel = this._activeChannel; + if (max != min) { + if (max == r) { + h = (g - b) / dm; + if (g < b) { + h += 6; + } + } else if (max == g) { + h = (b - r) / dm + 2; + } else if (max == b) { + h = (r - g) / dm + 4; } - } else if (forTextureDataUpdate) { - wasPreviouslyBound = true; - this._activateCurrentTexture(); - } - if (isTextureForRendering && !forTextureDataUpdate) { - this._bindSamplerUniformToChannel(texture._associatedChannel, this._activeChannel); + h *= 60; } - return wasPreviouslyBound; + result.r = h; + result.g = s; + result.b = v; } /** - * @internal + * Computes a new Color3 converted from the current one to linear space + * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) + * @returns a new Color3 object */ - _bindTexture(channel, texture, name69) { - if (channel === void 0) { - return; - } - if (texture) { - texture._associatedChannel = channel; - } - this._activeChannel = channel; - const target = texture ? this._getTextureTarget(texture) : this._gl.TEXTURE_2D; - this._bindTextureDirectly(target, texture); + toLinearSpace(exact = false) { + const convertedColor = new this.constructor(); + this.toLinearSpaceToRef(convertedColor, exact); + return convertedColor; } /** - * Unbind all textures from the webGL context + * Converts the Color3 values to linear space and stores the result in "convertedColor" + * @param convertedColor defines the Color3 object where to store the linear space version + * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) + * @returns the unmodified Color3 */ - unbindAllTextures() { - for (let channel = 0; channel < this._maxSimultaneousTextures; channel++) { - this._activeChannel = channel; - this._bindTextureDirectly(this._gl.TEXTURE_2D, null); - this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null); - if (this.webGLVersion > 1) { - this._bindTextureDirectly(this._gl.TEXTURE_3D, null); - this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null); - } + toLinearSpaceToRef(convertedColor, exact = false) { + if (exact) { + convertedColor.r = colorChannelToLinearSpaceExact(this.r); + convertedColor.g = colorChannelToLinearSpaceExact(this.g); + convertedColor.b = colorChannelToLinearSpaceExact(this.b); + } else { + convertedColor.r = colorChannelToLinearSpace(this.r); + convertedColor.g = colorChannelToLinearSpace(this.g); + convertedColor.b = colorChannelToLinearSpace(this.b); } + return this; } /** - * Sets a texture to the according uniform. - * @param channel The texture channel - * @param uniform The uniform to set - * @param texture The texture to apply - * @param name The name of the uniform in the effect + * Computes a new Color3 converted from the current one to gamma space + * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) + * @returns a new Color3 object */ - setTexture(channel, uniform, texture, name69) { - if (channel === void 0) { - return; - } - if (uniform) { - this._boundUniforms[channel] = uniform; - } - this._setTexture(channel, texture); - } - _bindSamplerUniformToChannel(sourceSlot, destination) { - const uniform = this._boundUniforms[sourceSlot]; - if (!uniform || uniform._currentState === destination) { - return; - } - this._gl.uniform1i(uniform, destination); - uniform._currentState = destination; - } - _getTextureWrapMode(mode) { - switch (mode) { - case 1: - return this._gl.REPEAT; - case 0: - return this._gl.CLAMP_TO_EDGE; - case 2: - return this._gl.MIRRORED_REPEAT; - } - return this._gl.REPEAT; + toGammaSpace(exact = false) { + const convertedColor = new this.constructor(); + this.toGammaSpaceToRef(convertedColor, exact); + return convertedColor; } - _setTexture(channel, texture, isPartOfTextureArray = false, depthStencilTexture = false, name69 = "") { - if (!texture) { - if (this._boundTexturesCache[channel] != null) { - this._activeChannel = channel; - this._bindTextureDirectly(this._gl.TEXTURE_2D, null); - this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null); - if (this.webGLVersion > 1) { - this._bindTextureDirectly(this._gl.TEXTURE_3D, null); - this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null); - } - } - return false; - } - if (texture.video) { - this._activeChannel = channel; - const videoInternalTexture = texture.getInternalTexture(); - if (videoInternalTexture) { - videoInternalTexture._associatedChannel = channel; - } - texture.update(); - } else if (texture.delayLoadState === 4) { - texture.delayLoad(); - return false; - } - let internalTexture; - if (depthStencilTexture) { - internalTexture = texture.depthStencilTexture; - } else if (texture.isReady()) { - internalTexture = texture.getInternalTexture(); - } else if (texture.isCube) { - internalTexture = this.emptyCubeTexture; - } else if (texture.is3D) { - internalTexture = this.emptyTexture3D; - } else if (texture.is2DArray) { - internalTexture = this.emptyTexture2DArray; + /** + * Converts the Color3 values to gamma space and stores the result in "convertedColor" + * @param convertedColor defines the Color3 object where to store the gamma space version + * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) + * @returns the unmodified Color3 + */ + toGammaSpaceToRef(convertedColor, exact = false) { + if (exact) { + convertedColor.r = colorChannelToGammaSpaceExact(this.r); + convertedColor.g = colorChannelToGammaSpaceExact(this.g); + convertedColor.b = colorChannelToGammaSpaceExact(this.b); } else { - internalTexture = this.emptyTexture; - } - if (!isPartOfTextureArray && internalTexture) { - internalTexture._associatedChannel = channel; - } - let needToBind = true; - if (this._boundTexturesCache[channel] === internalTexture) { - if (!isPartOfTextureArray) { - this._bindSamplerUniformToChannel(internalTexture._associatedChannel, channel); - } - needToBind = false; - } - this._activeChannel = channel; - const target = this._getTextureTarget(internalTexture); - if (needToBind) { - this._bindTextureDirectly(target, internalTexture, isPartOfTextureArray); - } - if (internalTexture && !internalTexture.isMultiview) { - if (internalTexture.isCube && internalTexture._cachedCoordinatesMode !== texture.coordinatesMode) { - internalTexture._cachedCoordinatesMode = texture.coordinatesMode; - const textureWrapMode = texture.coordinatesMode !== 3 && texture.coordinatesMode !== 5 ? 1 : 0; - texture.wrapU = textureWrapMode; - texture.wrapV = textureWrapMode; - } - if (internalTexture._cachedWrapU !== texture.wrapU) { - internalTexture._cachedWrapU = texture.wrapU; - this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(texture.wrapU), internalTexture); - } - if (internalTexture._cachedWrapV !== texture.wrapV) { - internalTexture._cachedWrapV = texture.wrapV; - this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(texture.wrapV), internalTexture); - } - if (internalTexture.is3D && internalTexture._cachedWrapR !== texture.wrapR) { - internalTexture._cachedWrapR = texture.wrapR; - this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(texture.wrapR), internalTexture); - } - this._setAnisotropicLevel(target, internalTexture, texture.anisotropicFilteringLevel); + convertedColor.r = colorChannelToGammaSpace(this.r); + convertedColor.g = colorChannelToGammaSpace(this.g); + convertedColor.b = colorChannelToGammaSpace(this.b); } - return true; + return this; } /** - * Sets an array of texture to the webGL context - * @param channel defines the channel where the texture array must be set - * @param uniform defines the associated uniform location - * @param textures defines the array of textures to bind - * @param name name of the channel + * Converts Hue, saturation and value to a Color3 (RGB) + * @param hue defines the hue (value between 0 and 360) + * @param saturation defines the saturation (value between 0 and 1) + * @param value defines the value (value between 0 and 1) + * @param result defines the Color3 where to store the RGB values */ - setTextureArray(channel, uniform, textures, name69) { - if (channel === void 0 || !uniform) { - return; - } - if (!this._textureUnits || this._textureUnits.length !== textures.length) { - this._textureUnits = new Int32Array(textures.length); - } - for (let i = 0; i < textures.length; i++) { - const texture = textures[i].getInternalTexture(); - if (texture) { - this._textureUnits[i] = channel + i; - texture._associatedChannel = channel + i; - } else { - this._textureUnits[i] = -1; - } - } - this._gl.uniform1iv(uniform, this._textureUnits); - for (let index = 0; index < textures.length; index++) { - this._setTexture(this._textureUnits[index], textures[index], true); + static HSVtoRGBToRef(hue, saturation, value, result) { + const chroma = value * saturation; + const h = hue / 60; + const x = chroma * (1 - Math.abs(h % 2 - 1)); + let r = 0; + let g = 0; + let b = 0; + if (h >= 0 && h <= 1) { + r = chroma; + g = x; + } else if (h >= 1 && h <= 2) { + r = x; + g = chroma; + } else if (h >= 2 && h <= 3) { + g = chroma; + b = x; + } else if (h >= 3 && h <= 4) { + g = x; + b = chroma; + } else if (h >= 4 && h <= 5) { + r = x; + b = chroma; + } else if (h >= 5 && h <= 6) { + r = chroma; + b = x; } + const m = value - chroma; + result.set(r + m, g + m, b + m); } /** - * @internal + * Converts Hue, saturation and value to a new Color3 (RGB) + * @param hue defines the hue (value between 0 and 360) + * @param saturation defines the saturation (value between 0 and 1) + * @param value defines the value (value between 0 and 1) + * @returns a new Color3 object */ - _setAnisotropicLevel(target, internalTexture, anisotropicFilteringLevel) { - const anisotropicFilterExtension = this._caps.textureAnisotropicFilterExtension; - if (internalTexture.samplingMode !== 11 && internalTexture.samplingMode !== 3 && internalTexture.samplingMode !== 2) { - anisotropicFilteringLevel = 1; - } - if (anisotropicFilterExtension && internalTexture._cachedAnisotropicFilteringLevel !== anisotropicFilteringLevel) { - this._setTextureParameterFloat(target, anisotropicFilterExtension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(anisotropicFilteringLevel, this._caps.maxAnisotropy), internalTexture); - internalTexture._cachedAnisotropicFilteringLevel = anisotropicFilteringLevel; - } - } - _setTextureParameterFloat(target, parameter, value, texture) { - this._bindTextureDirectly(target, texture, true, true); - this._gl.texParameterf(target, parameter, value); - } - _setTextureParameterInteger(target, parameter, value, texture) { - if (texture) { - this._bindTextureDirectly(target, texture, true, true); - } - this._gl.texParameteri(target, parameter, value); + static FromHSV(hue, saturation, value) { + const result = new _Color3(0, 0, 0); + _Color3.HSVtoRGBToRef(hue, saturation, value, result); + return result; } /** - * Unbind all vertex attributes from the webGL context + * Creates a new Color3 from the string containing valid hexadecimal values + * @param hex defines a string containing valid hexadecimal values + * @returns a new Color3 object */ - unbindAllAttributes() { - if (this._mustWipeVertexAttributes) { - this._mustWipeVertexAttributes = false; - for (let i = 0; i < this._caps.maxVertexAttribs; i++) { - this.disableAttributeByIndex(i); - } - return; - } - for (let i = 0, ul = this._vertexAttribArraysEnabled.length; i < ul; i++) { - if (i >= this._caps.maxVertexAttribs || !this._vertexAttribArraysEnabled[i]) { - continue; - } - this.disableAttributeByIndex(i); + static FromHexString(hex) { + if (hex.substring(0, 1) !== "#" || hex.length !== 7) { + return new _Color3(0, 0, 0); } + const r = parseInt(hex.substring(1, 3), 16); + const g = parseInt(hex.substring(3, 5), 16); + const b = parseInt(hex.substring(5, 7), 16); + return _Color3.FromInts(r, g, b); } /** - * Force the engine to release all cached effects. This means that next effect compilation will have to be done completely even if a similar effect was already compiled + * Creates a new Color3 from the starting index of the given array + * @param array defines the source array + * @param offset defines an offset in the source array + * @returns a new Color3 object */ - releaseEffects() { - for (const name69 in this._compiledEffects) { - const webGLPipelineContext = this._compiledEffects[name69].getPipelineContext(); - this._deletePipelineContext(webGLPipelineContext); - } - this._compiledEffects = {}; + static FromArray(array, offset = 0) { + return new _Color3(array[offset], array[offset + 1], array[offset + 2]); } /** - * Dispose and release all associated resources + * Creates a new Color3 from the starting index element of the given array + * @param array defines the source array to read from + * @param offset defines the offset in the source array + * @param result defines the target Color3 object */ - dispose() { - var _a, _b; - this._isDisposed = true; - this.stopRenderLoop(); - if (this.onBeforeTextureInitObservable) { - this.onBeforeTextureInitObservable.clear(); - } - if (this._emptyTexture) { - this._releaseTexture(this._emptyTexture); - this._emptyTexture = null; - } - if (this._emptyCubeTexture) { - this._releaseTexture(this._emptyCubeTexture); - this._emptyCubeTexture = null; - } - if (this._dummyFramebuffer) { - this._gl.deleteFramebuffer(this._dummyFramebuffer); - } - this.releaseEffects(); - (_a = this.releaseComputeEffects) == null ? void 0 : _a.call(this); - this.unbindAllAttributes(); - this._boundUniforms = {}; - if (IsWindowObjectExist()) { - if (this._renderingCanvas) { - if (!this._doNotHandleContextLost) { - this._renderingCanvas.removeEventListener("webglcontextlost", this._onContextLost); - this._renderingCanvas.removeEventListener("webglcontextrestored", this._onContextRestored); - } - window.removeEventListener("resize", this._checkForMobile); - } - } - this._workingCanvas = null; - this._workingContext = null; - this._currentBufferPointers.length = 0; - this._renderingCanvas = null; - this._currentProgram = null; - this._boundRenderFunction = null; - Effect.ResetCache(); - for (const request of this._activeRequests) { - request.abort(); - } - this.onDisposeObservable.notifyObservers(this); - this.onDisposeObservable.clear(); - if (this._creationOptions.loseContextOnDispose) { - (_b = this._gl.getExtension("WEBGL_lose_context")) == null ? void 0 : _b.loseContext(); - } + static FromArrayToRef(array, offset = 0, result) { + result.r = array[offset]; + result.g = array[offset + 1]; + result.b = array[offset + 2]; } /** - * Attach a new callback raised when context lost event is fired - * @param callback defines the callback to call + * Creates a new Color3 from integer values (\< 256) + * @param r defines the red component to read from (value between 0 and 255) + * @param g defines the green component to read from (value between 0 and 255) + * @param b defines the blue component to read from (value between 0 and 255) + * @returns a new Color3 object */ - attachContextLostEvent(callback) { - if (this._renderingCanvas) { - this._renderingCanvas.addEventListener("webglcontextlost", callback, false); - } + static FromInts(r, g, b) { + return new _Color3(r / 255, g / 255, b / 255); } /** - * Attach a new callback raised when context restored event is fired - * @param callback defines the callback to call + * Creates a new Color3 with values linearly interpolated of "amount" between the start Color3 and the end Color3 + * @param start defines the start Color3 value + * @param end defines the end Color3 value + * @param amount defines the gradient value between start and end + * @returns a new Color3 object */ - attachContextRestoredEvent(callback) { - if (this._renderingCanvas) { - this._renderingCanvas.addEventListener("webglcontextrestored", callback, false); - } + static Lerp(start, end, amount) { + const result = new _Color3(0, 0, 0); + _Color3.LerpToRef(start, end, amount, result); + return result; } /** - * Get the current error code of the webGL context - * @returns the error code - * @see https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError + * Creates a new Color3 with values linearly interpolated of "amount" between the start Color3 and the end Color3 + * @param left defines the start value + * @param right defines the end value + * @param amount defines the gradient factor + * @param result defines the Color3 object where to store the result */ - getError() { - return this._gl.getError(); - } - _canRenderToFloatFramebuffer() { - if (this._webGLVersion > 1) { - return this._caps.colorBufferFloat; - } - return this._canRenderToFramebuffer(1); - } - _canRenderToHalfFloatFramebuffer() { - if (this._webGLVersion > 1) { - return this._caps.colorBufferFloat; - } - return this._canRenderToFramebuffer(2); - } - // Thank you : http://stackoverflow.com/questions/28827511/webgl-ios-render-to-floating-point-texture - _canRenderToFramebuffer(type) { - const gl = this._gl; - while (gl.getError() !== gl.NO_ERROR) { - } - let successful = true; - const texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texImage2D(gl.TEXTURE_2D, 0, this._getRGBABufferInternalSizedFormat(type), 1, 1, 0, gl.RGBA, this._getWebGLTextureType(type), null); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - const fb = gl.createFramebuffer(); - gl.bindFramebuffer(gl.FRAMEBUFFER, fb); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); - const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); - successful = successful && status === gl.FRAMEBUFFER_COMPLETE; - successful = successful && gl.getError() === gl.NO_ERROR; - if (successful) { - gl.clear(gl.COLOR_BUFFER_BIT); - successful = successful && gl.getError() === gl.NO_ERROR; - } - if (successful) { - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - const readFormat = gl.RGBA; - const readType = gl.UNSIGNED_BYTE; - const buffer = new Uint8Array(4); - gl.readPixels(0, 0, 1, 1, readFormat, readType, buffer); - successful = successful && gl.getError() === gl.NO_ERROR; - } - gl.deleteTexture(texture); - gl.deleteFramebuffer(fb); - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - while (!successful && gl.getError() !== gl.NO_ERROR) { - } - return successful; + static LerpToRef(left, right, amount, result) { + result.r = left.r + (right.r - left.r) * amount; + result.g = left.g + (right.g - left.g) * amount; + result.b = left.b + (right.b - left.b) * amount; } /** - * @internal + * Returns a new Color3 located for "amount" (float) on the Hermite interpolation spline defined by the vectors "value1", "tangent1", "value2", "tangent2" + * @param value1 defines the first control point + * @param tangent1 defines the first tangent Color3 + * @param value2 defines the second control point + * @param tangent2 defines the second tangent Color3 + * @param amount defines the amount on the interpolation spline (between 0 and 1) + * @returns the new Color3 */ - _getWebGLTextureType(type) { - if (this._webGLVersion === 1) { - switch (type) { - case 1: - return this._gl.FLOAT; - case 2: - return this._gl.HALF_FLOAT_OES; - case 0: - return this._gl.UNSIGNED_BYTE; - case 8: - return this._gl.UNSIGNED_SHORT_4_4_4_4; - case 9: - return this._gl.UNSIGNED_SHORT_5_5_5_1; - case 10: - return this._gl.UNSIGNED_SHORT_5_6_5; - } - return this._gl.UNSIGNED_BYTE; - } - switch (type) { - case 3: - return this._gl.BYTE; - case 0: - return this._gl.UNSIGNED_BYTE; - case 4: - return this._gl.SHORT; - case 5: - return this._gl.UNSIGNED_SHORT; - case 6: - return this._gl.INT; - case 7: - return this._gl.UNSIGNED_INT; - case 1: - return this._gl.FLOAT; - case 2: - return this._gl.HALF_FLOAT; - case 8: - return this._gl.UNSIGNED_SHORT_4_4_4_4; - case 9: - return this._gl.UNSIGNED_SHORT_5_5_5_1; - case 10: - return this._gl.UNSIGNED_SHORT_5_6_5; - case 11: - return this._gl.UNSIGNED_INT_2_10_10_10_REV; - case 12: - return this._gl.UNSIGNED_INT_24_8; - case 13: - return this._gl.UNSIGNED_INT_10F_11F_11F_REV; - case 14: - return this._gl.UNSIGNED_INT_5_9_9_9_REV; - case 15: - return this._gl.FLOAT_32_UNSIGNED_INT_24_8_REV; - } - return this._gl.UNSIGNED_BYTE; + static Hermite(value1, tangent1, value2, tangent2, amount) { + const squared = amount * amount; + const cubed = amount * squared; + const part1 = 2 * cubed - 3 * squared + 1; + const part2 = -2 * cubed + 3 * squared; + const part3 = cubed - 2 * squared + amount; + const part4 = cubed - squared; + const r = value1.r * part1 + value2.r * part2 + tangent1.r * part3 + tangent2.r * part4; + const g = value1.g * part1 + value2.g * part2 + tangent1.g * part3 + tangent2.g * part4; + const b = value1.b * part1 + value2.b * part2 + tangent1.b * part3 + tangent2.b * part4; + return new _Color3(r, g, b); } /** - * @internal + * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors "value1", "value2", "tangent1", "tangent2". + * @param value1 defines the first control point + * @param tangent1 defines the first tangent + * @param value2 defines the second control point + * @param tangent2 defines the second tangent + * @param time define where the derivative must be done + * @returns 1st derivative */ - _getInternalFormat(format, useSRGBBuffer = false) { - let internalFormat = useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA; - switch (format) { - case 0: - internalFormat = this._gl.ALPHA; - break; - case 1: - internalFormat = this._gl.LUMINANCE; - break; - case 2: - internalFormat = this._gl.LUMINANCE_ALPHA; - break; - case 6: - internalFormat = this._gl.RED; - break; - case 7: - internalFormat = this._gl.RG; - break; - case 4: - internalFormat = useSRGBBuffer ? this._glSRGBExtensionValues.SRGB : this._gl.RGB; - break; - case 5: - internalFormat = useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA; - break; - } - if (this._webGLVersion > 1) { - switch (format) { - case 8: - internalFormat = this._gl.RED_INTEGER; - break; - case 9: - internalFormat = this._gl.RG_INTEGER; - break; - case 10: - internalFormat = this._gl.RGB_INTEGER; - break; - case 11: - internalFormat = this._gl.RGBA_INTEGER; - break; - } - } - return internalFormat; + static Hermite1stDerivative(value1, tangent1, value2, tangent2, time) { + const result = _Color3.Black(); + this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result); + return result; } /** - * @internal + * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors "value1", "value2", "tangent1", "tangent2". + * @param value1 defines the first control point + * @param tangent1 defines the first tangent + * @param value2 defines the second control point + * @param tangent2 defines the second tangent + * @param time define where the derivative must be done + * @param result define where to store the derivative */ - _getRGBABufferInternalSizedFormat(type, format, useSRGBBuffer = false) { - if (this._webGLVersion === 1) { - if (format !== void 0) { - switch (format) { - case 0: - return this._gl.ALPHA; - case 1: - return this._gl.LUMINANCE; - case 2: - return this._gl.LUMINANCE_ALPHA; - case 4: - return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB : this._gl.RGB; - } - } - return this._gl.RGBA; - } - switch (type) { - case 3: - switch (format) { - case 6: - return this._gl.R8_SNORM; - case 7: - return this._gl.RG8_SNORM; - case 4: - return this._gl.RGB8_SNORM; - case 8: - return this._gl.R8I; - case 9: - return this._gl.RG8I; - case 10: - return this._gl.RGB8I; - case 11: - return this._gl.RGBA8I; - default: - return this._gl.RGBA8_SNORM; - } - case 0: - switch (format) { - case 6: - return this._gl.R8; - case 7: - return this._gl.RG8; - case 4: - return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8 : this._gl.RGB8; - case 5: - return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA8; - case 8: - return this._gl.R8UI; - case 9: - return this._gl.RG8UI; - case 10: - return this._gl.RGB8UI; - case 11: - return this._gl.RGBA8UI; - case 0: - return this._gl.ALPHA; - case 1: - return this._gl.LUMINANCE; - case 2: - return this._gl.LUMINANCE_ALPHA; - default: - return this._gl.RGBA8; - } - case 4: - switch (format) { - case 8: - return this._gl.R16I; - case 9: - return this._gl.RG16I; - case 10: - return this._gl.RGB16I; - case 11: - return this._gl.RGBA16I; - default: - return this._gl.RGBA16I; - } - case 5: - switch (format) { - case 8: - return this._gl.R16UI; - case 9: - return this._gl.RG16UI; - case 10: - return this._gl.RGB16UI; - case 11: - return this._gl.RGBA16UI; - default: - return this._gl.RGBA16UI; - } - case 6: - switch (format) { - case 8: - return this._gl.R32I; - case 9: - return this._gl.RG32I; - case 10: - return this._gl.RGB32I; - case 11: - return this._gl.RGBA32I; - default: - return this._gl.RGBA32I; - } - case 7: - switch (format) { - case 8: - return this._gl.R32UI; - case 9: - return this._gl.RG32UI; - case 10: - return this._gl.RGB32UI; - case 11: - return this._gl.RGBA32UI; - default: - return this._gl.RGBA32UI; - } - case 1: - switch (format) { - case 6: - return this._gl.R32F; - case 7: - return this._gl.RG32F; - case 4: - return this._gl.RGB32F; - case 5: - return this._gl.RGBA32F; - default: - return this._gl.RGBA32F; - } - case 2: - switch (format) { - case 6: - return this._gl.R16F; - case 7: - return this._gl.RG16F; - case 4: - return this._gl.RGB16F; - case 5: - return this._gl.RGBA16F; - default: - return this._gl.RGBA16F; - } - case 10: - return this._gl.RGB565; - case 13: - return this._gl.R11F_G11F_B10F; - case 14: - return this._gl.RGB9_E5; - case 8: - return this._gl.RGBA4; - case 9: - return this._gl.RGB5_A1; - case 11: - switch (format) { - case 5: - return this._gl.RGB10_A2; - case 11: - return this._gl.RGB10_A2UI; - default: - return this._gl.RGB10_A2; - } - } - return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA8; + static Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result) { + const t2 = time * time; + result.r = (t2 - time) * 6 * value1.r + (3 * t2 - 4 * time + 1) * tangent1.r + (-t2 + time) * 6 * value2.r + (3 * t2 - 2 * time) * tangent2.r; + result.g = (t2 - time) * 6 * value1.g + (3 * t2 - 4 * time + 1) * tangent1.g + (-t2 + time) * 6 * value2.g + (3 * t2 - 2 * time) * tangent2.g; + result.b = (t2 - time) * 6 * value1.b + (3 * t2 - 4 * time + 1) * tangent1.b + (-t2 + time) * 6 * value2.b + (3 * t2 - 2 * time) * tangent2.b; } /** - * @internal + * Returns a Color3 value containing a red color + * @returns a new Color3 object */ - _loadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError) { - const request = _ThinEngine._FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError); - this._activeRequests.push(request); - request.onCompleteObservable.add((request2) => { - this._activeRequests.splice(this._activeRequests.indexOf(request2), 1); - }); - return request; + static Red() { + return new _Color3(1, 0, 0); } /** - * Loads a file from a url - * @param url url to load - * @param onSuccess callback called when the file successfully loads - * @param onProgress callback called while file is loading (if the server supports this mode) - * @param offlineProvider defines the offline provider for caching - * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer - * @param onError callback called when the file fails to load - * @returns a file request object - * @internal + * Returns a Color3 value containing a green color + * @returns a new Color3 object */ - static _FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError) { - throw _WarnImport("FileTools"); + static Green() { + return new _Color3(0, 1, 0); } /** - * Reads pixels from the current frame buffer. Please note that this function can be slow - * @param x defines the x coordinate of the rectangle where pixels must be read - * @param y defines the y coordinate of the rectangle where pixels must be read - * @param width defines the width of the rectangle where pixels must be read - * @param height defines the height of the rectangle where pixels must be read - * @param hasAlpha defines whether the output should have alpha or not (defaults to true) - * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels - * @returns a ArrayBufferView promise (Uint8Array) containing RGBA colors + * Returns a Color3 value containing a blue color + * @returns a new Color3 object */ - readPixels(x, y, width, height, hasAlpha = true, flushRenderer = true) { - const numChannels = hasAlpha ? 4 : 3; - const format = hasAlpha ? this._gl.RGBA : this._gl.RGB; - const data = new Uint8Array(height * width * numChannels); - if (flushRenderer) { - this.flushFramebuffer(); - } - this._gl.readPixels(x, y, width, height, format, this._gl.UNSIGNED_BYTE, data); - return Promise.resolve(data); + static Blue() { + return new _Color3(0, 0, 1); } /** - * Gets a Promise indicating if the engine can be instantiated (ie. if a webGL context can be found) + * Returns a Color3 value containing a black color + * @returns a new Color3 object */ - static get IsSupportedAsync() { - return Promise.resolve(this.isSupported()); + static Black() { + return new _Color3(0, 0, 0); } /** - * Gets a boolean indicating if the engine can be instantiated (ie. if a webGL context can be found) + * Gets a Color3 value containing a black color that must not be updated */ - static get IsSupported() { - return this.isSupported(); + static get BlackReadOnly() { + return _Color3._BlackReadOnly; } /** - * Gets a boolean indicating if the engine can be instantiated (ie. if a webGL context can be found) - * @returns true if the engine can be created - * @ignorenaming + * Returns a Color3 value containing a white color + * @returns a new Color3 object */ - // eslint-disable-next-line @typescript-eslint/naming-convention - static isSupported() { - if (this._HasMajorPerformanceCaveat !== null) { - return !this._HasMajorPerformanceCaveat; - } - if (this._IsSupported === null) { - try { - const tempcanvas = this._CreateCanvas(1, 1); - const gl = tempcanvas.getContext("webgl") || tempcanvas.getContext("experimental-webgl"); - this._IsSupported = gl != null && !!window.WebGLRenderingContext; - } catch (e) { - this._IsSupported = false; - } - } - return this._IsSupported; + static White() { + return new _Color3(1, 1, 1); } /** - * Gets a boolean indicating if the engine can be instantiated on a performant device (ie. if a webGL context can be found and it does not use a slow implementation) + * Returns a Color3 value containing a purple color + * @returns a new Color3 object */ - static get HasMajorPerformanceCaveat() { - if (this._HasMajorPerformanceCaveat === null) { - try { - const tempcanvas = this._CreateCanvas(1, 1); - const gl = tempcanvas.getContext("webgl", { failIfMajorPerformanceCaveat: true }) || tempcanvas.getContext("experimental-webgl", { failIfMajorPerformanceCaveat: true }); - this._HasMajorPerformanceCaveat = !gl; - } catch (e) { - this._HasMajorPerformanceCaveat = false; - } - } - return this._HasMajorPerformanceCaveat; + static Purple() { + return new _Color3(0.5, 0, 0.5); } /** - * Find the next highest power of two. - * @param x Number to start search from. - * @returns Next highest power of two. + * Returns a Color3 value containing a magenta color + * @returns a new Color3 object */ - static CeilingPOT(x) { - x--; - x |= x >> 1; - x |= x >> 2; - x |= x >> 4; - x |= x >> 8; - x |= x >> 16; - x++; - return x; + static Magenta() { + return new _Color3(1, 0, 1); } /** - * Find the next lowest power of two. - * @param x Number to start search from. - * @returns Next lowest power of two. + * Returns a Color3 value containing a yellow color + * @returns a new Color3 object */ - static FloorPOT(x) { - x = x | x >> 1; - x = x | x >> 2; - x = x | x >> 4; - x = x | x >> 8; - x = x | x >> 16; - return x - (x >> 1); + static Yellow() { + return new _Color3(1, 1, 0); } /** - * Find the nearest power of two. - * @param x Number to start search from. - * @returns Next nearest power of two. + * Returns a Color3 value containing a gray color + * @returns a new Color3 object */ - static NearestPOT(x) { - const c = _ThinEngine.CeilingPOT(x); - const f = _ThinEngine.FloorPOT(x); - return c - x > x - f ? f : c; + static Gray() { + return new _Color3(0.5, 0.5, 0.5); } /** - * Get the closest exponent of two - * @param value defines the value to approximate - * @param max defines the maximum value to return - * @param mode defines how to define the closest value - * @returns closest exponent of two of the given value + * Returns a Color3 value containing a teal color + * @returns a new Color3 object */ - static GetExponentOfTwo(value, max, mode = 2) { - let pot; - switch (mode) { - case 1: - pot = _ThinEngine.FloorPOT(value); - break; - case 2: - pot = _ThinEngine.NearestPOT(value); - break; - case 3: - default: - pot = _ThinEngine.CeilingPOT(value); - break; - } - return Math.min(pot, max); + static Teal() { + return new _Color3(0, 1, 1); } /** - * Queue a new function into the requested animation frame pool (ie. this function will be executed by the browser (or the javascript engine) for the next frame) - * @param func - the function to be called - * @param requester - the object that will request the next frame. Falls back to window. - * @returns frame number + * Returns a Color3 value containing a random color + * @returns a new Color3 object */ - static QueueNewFrame(func, requester) { - if (!IsWindowObjectExist()) { - if (typeof requestAnimationFrame === "function") { - return requestAnimationFrame(func); - } - } else { - const { requestAnimationFrame: requestAnimationFrame2 } = requester || window; - if (typeof requestAnimationFrame2 === "function") { - return requestAnimationFrame2(func); - } - } - return setTimeout(func, 16); + static Random() { + return new _Color3(Math.random(), Math.random(), Math.random()); } +}; +Color3._BlackReadOnly = Color3.Black(); +Object.defineProperties(Color3.prototype, { + dimension: { value: [3] }, + rank: { value: 1 } +}); +var Color4 = class _Color4 { /** - * Gets host document - * @returns the host document object + * Creates a new Color4 object from red, green, blue values, all between 0 and 1 + * @param r defines the red component (between 0 and 1, default is 0) + * @param g defines the green component (between 0 and 1, default is 0) + * @param b defines the blue component (between 0 and 1, default is 0) + * @param a defines the alpha component (between 0 and 1, default is 1) */ - getHostDocument() { - if (this._renderingCanvas && this._renderingCanvas.ownerDocument) { - return this._renderingCanvas.ownerDocument; - } - return IsDocumentAvailable() ? document : null; + constructor(r = 0, g = 0, b = 0, a = 1) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; } -}; -ThinEngine._TempClearColorUint32 = new Uint32Array(4); -ThinEngine._TempClearColorInt32 = new Int32Array(4); -ThinEngine.ExceptionList = [ - { key: "Chrome/63.0", capture: "63\\.0\\.3239\\.(\\d+)", captureConstraint: 108, targets: ["uniformBuffer"] }, - { key: "Firefox/58", capture: null, captureConstraint: null, targets: ["uniformBuffer"] }, - { key: "Firefox/59", capture: null, captureConstraint: null, targets: ["uniformBuffer"] }, - { key: "Chrome/72.+?Mobile", capture: null, captureConstraint: null, targets: ["vao"] }, - { key: "Chrome/73.+?Mobile", capture: null, captureConstraint: null, targets: ["vao"] }, - { key: "Chrome/74.+?Mobile", capture: null, captureConstraint: null, targets: ["vao"] }, - { key: "Mac OS.+Chrome/71", capture: null, captureConstraint: null, targets: ["vao"] }, - { key: "Mac OS.+Chrome/72", capture: null, captureConstraint: null, targets: ["vao"] }, - { key: "Mac OS.+Chrome", capture: null, captureConstraint: null, targets: ["uniformBuffer"] }, - { key: "Chrome/12\\d\\..+?Mobile", capture: null, captureConstraint: null, targets: ["uniformBuffer"] }, - // desktop osx safari 15.4 - { key: ".*AppleWebKit.*(15.4).*Safari", capture: null, captureConstraint: null, targets: ["antialias", "maxMSAASamples"] }, - // mobile browsers using safari 15.4 on ios - { key: ".*(15.4).*AppleWebKit.*Safari", capture: null, captureConstraint: null, targets: ["antialias", "maxMSAASamples"] } -]; -ThinEngine._TextureLoaders = []; -ThinEngine.CollisionsEpsilon = 1e-3; -ThinEngine._IsSupported = null; -ThinEngine._HasMajorPerformanceCaveat = null; - -// node_modules/@babylonjs/core/Misc/timingTools.js -var TimingTools = class { + // Operators /** - * Polyfill for setImmediate - * @param action defines the action to execute after the current execution block + * Creates a new array populated with 4 numeric elements : red, green, blue, alpha values + * @returns the new array */ - static SetImmediate(action) { - if (IsWindowObjectExist() && window.setImmediate) { - window.setImmediate(action); - } else { - setTimeout(action, 1); - } + asArray() { + return [this.r, this.g, this.b, this.a]; } -}; - -// node_modules/@babylonjs/core/Misc/fileTools.js -var Base64DataUrlRegEx = new RegExp(/^data:([^,]+\/[^,]+)?;base64,/i); -var LoadFileError = class _LoadFileError extends RuntimeError { /** - * Creates a new LoadFileError - * @param message defines the message of the error - * @param object defines the optional web request + * Stores from the starting index in the given array the Color4 successive values + * @param array defines the array where to store the r,g,b components + * @param index defines an optional index in the target array to define where to start storing values + * @returns the current Color4 object */ - constructor(message, object) { - super(message, ErrorCodes.LoadFileError); - this.name = "LoadFileError"; - BaseError._setPrototypeOf(this, _LoadFileError.prototype); - if (object instanceof WebRequest) { - this.request = object; - } else { - this.file = object; - } + toArray(array, index = 0) { + array[index] = this.r; + array[index + 1] = this.g; + array[index + 2] = this.b; + array[index + 3] = this.a; + return this; } -}; -var RequestFileError = class _RequestFileError extends RuntimeError { /** - * Creates a new LoadFileError - * @param message defines the message of the error - * @param request defines the optional web request + * Update the current color with values stored in an array from the starting index of the given array + * @param array defines the source array + * @param offset defines an offset in the source array + * @returns the current Color4 object */ - constructor(message, request) { - super(message, ErrorCodes.RequestFileError); - this.request = request; - this.name = "RequestFileError"; - BaseError._setPrototypeOf(this, _RequestFileError.prototype); + fromArray(array, offset = 0) { + this.r = array[offset]; + this.g = array[offset + 1]; + this.b = array[offset + 2]; + this.a = array[offset + 3]; + return this; } -}; -var ReadFileError = class _ReadFileError extends RuntimeError { /** - * Creates a new ReadFileError - * @param message defines the message of the error - * @param file defines the optional file + * Determines equality between Color4 objects + * @param otherColor defines the second operand + * @returns true if the rgba values are equal to the given ones */ - constructor(message, file) { - super(message, ErrorCodes.ReadFileError); - this.file = file; - this.name = "ReadFileError"; - BaseError._setPrototypeOf(this, _ReadFileError.prototype); + equals(otherColor) { + return otherColor && this.r === otherColor.r && this.g === otherColor.g && this.b === otherColor.b && this.a === otherColor.a; } -}; -var FileToolsOptions = { /** - * Gets or sets the retry strategy to apply when an error happens while loading an asset. - * When defining this function, return the wait time before trying again or return -1 to - * stop retrying and error out. + * Creates a new Color4 set with the added values of the current Color4 and of the given one + * @param otherColor defines the second operand + * @returns a new Color4 object */ - DefaultRetryStrategy: RetryStrategy.ExponentialBackoff(), + add(otherColor) { + return new this.constructor(this.r + otherColor.r, this.g + otherColor.g, this.b + otherColor.b, this.a + otherColor.a); + } /** - * Gets or sets the base URL to use to load assets + * Updates the given color "result" with the result of the addition of the current Color4 and the given one. + * @param otherColor the color to add + * @param result the color to store the result + * @returns result input */ - BaseUrl: "", + addToRef(otherColor, result) { + result.r = this.r + otherColor.r; + result.g = this.g + otherColor.g; + result.b = this.b + otherColor.b; + result.a = this.a + otherColor.a; + return result; + } /** - * Default behaviour for cors in the application. - * It can be a string if the expected behavior is identical in the entire app. - * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance) + * Adds in place the given Color4 values to the current Color4 object + * @param otherColor defines the second operand + * @returns the current updated Color4 object */ - CorsBehavior: "anonymous", + addInPlace(otherColor) { + this.r += otherColor.r; + this.g += otherColor.g; + this.b += otherColor.b; + this.a += otherColor.a; + return this; + } /** - * Gets or sets a function used to pre-process url before using them to load assets - * @param url - * @returns the processed url + * Adds the given coordinates to the current Color4 + * @param r defines the r coordinate of the operand + * @param g defines the g coordinate of the operand + * @param b defines the b coordinate of the operand + * @param a defines the a coordinate of the operand + * @returns the current updated Color4 */ - PreprocessUrl: (url) => url, + addInPlaceFromFloats(r, g, b, a) { + this.r += r; + this.g += g; + this.b += b; + this.a += a; + return this; + } /** - * Gets or sets the base URL to use to load scripts - * Used for both JS and WASM + * Creates a new Color4 set with the subtracted values of the given one from the current Color4 + * @param otherColor defines the second operand + * @returns a new Color4 object */ - ScriptBaseUrl: "", + subtract(otherColor) { + return new this.constructor(this.r - otherColor.r, this.g - otherColor.g, this.b - otherColor.b, this.a - otherColor.a); + } /** - * Gets or sets a function used to pre-process script url before using them to load. - * Used for both JS and WASM - * @param url defines the url to process - * @returns the processed url + * Subtracts the given ones from the current Color4 values and stores the results in "result" + * @param otherColor defines the second operand + * @param result defines the Color4 object where to store the result + * @returns the result Color4 object */ - ScriptPreprocessUrl: (url) => url -}; -var _CleanUrl = (url) => { - url = url.replace(/#/gm, "%23"); - return url; -}; -var SetCorsBehavior = (url, element) => { - if (url && url.indexOf("data:") === 0) { - return; + subtractToRef(otherColor, result) { + result.r = this.r - otherColor.r; + result.g = this.g - otherColor.g; + result.b = this.b - otherColor.b; + result.a = this.a - otherColor.a; + return result; } - if (FileToolsOptions.CorsBehavior) { - if (typeof FileToolsOptions.CorsBehavior === "string" || FileToolsOptions.CorsBehavior instanceof String) { - element.crossOrigin = FileToolsOptions.CorsBehavior; - } else { - const result = FileToolsOptions.CorsBehavior(url); - if (result) { - element.crossOrigin = result; - } - } + /** + * Subtract in place the given color from the current Color4. + * @param otherColor the color to subtract + * @returns the updated Color4. + */ + subtractInPlace(otherColor) { + this.r -= otherColor.r; + this.g -= otherColor.g; + this.b -= otherColor.b; + this.a -= otherColor.a; + return this; } -}; -var LoadImage = (input, onLoad, onError, offlineProvider, mimeType = "", imageBitmapOptions) => { - const engine = EngineStore.LastCreatedEngine; - if (typeof HTMLImageElement === "undefined" && !(engine == null ? void 0 : engine._features.forceBitmapOverHTMLImageElement)) { - onError("LoadImage is only supported in web or BabylonNative environments."); - return null; + /** + * Returns a new Color4 set with the result of the subtraction of the given floats from the current Color4 coordinates. + * @param r value to subtract + * @param g value to subtract + * @param b value to subtract + * @param a value to subtract + * @returns new color containing the result + */ + subtractFromFloats(r, g, b, a) { + return new this.constructor(this.r - r, this.g - g, this.b - b, this.a - a); } - let url; - let usingObjectURL = false; - if (input instanceof ArrayBuffer || ArrayBuffer.isView(input)) { - if (typeof Blob !== "undefined" && typeof URL !== "undefined") { - url = URL.createObjectURL(new Blob([input], { type: mimeType })); - usingObjectURL = true; - } else { - url = `data:${mimeType};base64,` + EncodeArrayBufferToBase64(input); - } - } else if (input instanceof Blob) { - url = URL.createObjectURL(input); - usingObjectURL = true; - } else { - url = _CleanUrl(input); - url = FileToolsOptions.PreprocessUrl(input); + /** + * Sets the given color "result" set with the result of the subtraction of the given floats from the current Color4 coordinates. + * @param r value to subtract + * @param g value to subtract + * @param b value to subtract + * @param a value to subtract + * @param result the color to store the result in + * @returns result input + */ + subtractFromFloatsToRef(r, g, b, a, result) { + result.r = this.r - r; + result.g = this.g - g; + result.b = this.b - b; + result.a = this.a - a; + return result; } - const onErrorHandler = (exception) => { - if (onError) { - const inputText = url || input.toString(); - onError(`Error while trying to load image: ${inputText.indexOf("http") === 0 || inputText.length <= 128 ? inputText : inputText.slice(0, 128) + "..."}`, exception); - } - }; - if (engine == null ? void 0 : engine._features.forceBitmapOverHTMLImageElement) { - LoadFile(url, (data) => { - engine.createImageBitmap(new Blob([data], { type: mimeType }), { premultiplyAlpha: "none", ...imageBitmapOptions }).then((imgBmp) => { - onLoad(imgBmp); - if (usingObjectURL) { - URL.revokeObjectURL(url); - } - }).catch((reason) => { - if (onError) { - onError("Error while trying to load image: " + input, reason); - } - }); - }, void 0, offlineProvider || void 0, true, (request, exception) => { - onErrorHandler(exception); - }); - return null; + /** + * Creates a new Color4 with the current Color4 values multiplied by scale + * @param scale defines the scaling factor to apply + * @returns a new Color4 object + */ + scale(scale) { + return new this.constructor(this.r * scale, this.g * scale, this.b * scale, this.a * scale); } - const img = new Image(); - SetCorsBehavior(url, img); - const handlersList = []; - const loadHandlersList = () => { - handlersList.forEach((handler) => { - handler.target.addEventListener(handler.name, handler.handler); - }); - }; - const unloadHandlersList = () => { - handlersList.forEach((handler) => { - handler.target.removeEventListener(handler.name, handler.handler); - }); - handlersList.length = 0; - }; - const loadHandler = () => { - unloadHandlersList(); - onLoad(img); - if (usingObjectURL && img.src) { - URL.revokeObjectURL(img.src); - } - }; - const errorHandler = (err) => { - unloadHandlersList(); - onErrorHandler(err); - if (usingObjectURL && img.src) { - URL.revokeObjectURL(img.src); - } - }; - const cspHandler = (err) => { - if (err.blockedURI !== img.src) { - return; - } - unloadHandlersList(); - const cspException = new Error(`CSP violation of policy ${err.effectiveDirective} ${err.blockedURI}. Current policy is ${err.originalPolicy}`); - EngineStore.UseFallbackTexture = false; - onErrorHandler(cspException); - if (usingObjectURL && img.src) { - URL.revokeObjectURL(img.src); - } - img.src = ""; - }; - handlersList.push({ target: img, name: "load", handler: loadHandler }); - handlersList.push({ target: img, name: "error", handler: errorHandler }); - handlersList.push({ target: document, name: "securitypolicyviolation", handler: cspHandler }); - loadHandlersList(); - const fromBlob = url.substring(0, 5) === "blob:"; - const fromData = url.substring(0, 5) === "data:"; - const noOfflineSupport = () => { - if (fromBlob || fromData || !WebRequest.IsCustomRequestAvailable) { - img.src = url; - } else { - LoadFile(url, (data, _, contentType) => { - const type = !mimeType && contentType ? contentType : mimeType; - const blob = new Blob([data], { type }); - const url2 = URL.createObjectURL(blob); - usingObjectURL = true; - img.src = url2; - }, void 0, offlineProvider || void 0, true, (_request, exception) => { - onErrorHandler(exception); - }); - } - }; - const loadFromOfflineSupport = () => { - if (offlineProvider) { - offlineProvider.loadImage(url, img); - } - }; - if (!fromBlob && !fromData && offlineProvider && offlineProvider.enableTexturesOffline) { - offlineProvider.open(loadFromOfflineSupport, noOfflineSupport); - } else { - if (url.indexOf("file:") !== -1) { - const textureName = decodeURIComponent(url.substring(5).toLowerCase()); - if (FilesInputStore.FilesToLoad[textureName] && typeof URL !== "undefined") { - try { - let blobURL; - try { - blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]); - } catch (ex) { - blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]); - } - img.src = blobURL; - usingObjectURL = true; - } catch (e) { - img.src = ""; - } - return img; - } - } - noOfflineSupport(); - } - return img; -}; -var ReadFile = (file, onSuccess, onProgress, useArrayBuffer, onError) => { - const reader = new FileReader(); - const fileRequest = { - onCompleteObservable: new Observable(), - abort: () => reader.abort() - }; - reader.onloadend = () => fileRequest.onCompleteObservable.notifyObservers(fileRequest); - if (onError) { - reader.onerror = () => { - onError(new ReadFileError(`Unable to read ${file.name}`, file)); - }; - } - reader.onload = (e) => { - onSuccess(e.target["result"]); - }; - if (onProgress) { - reader.onprogress = onProgress; - } - if (!useArrayBuffer) { - reader.readAsText(file); - } else { - reader.readAsArrayBuffer(file); - } - return fileRequest; -}; -var LoadFile = (fileOrUrl, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError, onOpened) => { - if (fileOrUrl.name) { - return ReadFile(fileOrUrl, onSuccess, onProgress, useArrayBuffer, onError ? (error) => { - onError(void 0, error); - } : void 0); - } - const url = fileOrUrl; - if (url.indexOf("file:") !== -1) { - let fileName = decodeURIComponent(url.substring(5).toLowerCase()); - if (fileName.indexOf("./") === 0) { - fileName = fileName.substring(2); - } - const file = FilesInputStore.FilesToLoad[fileName]; - if (file) { - return ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError ? (error) => onError(void 0, new LoadFileError(error.message, error.file)) : void 0); - } - } - const { match, type } = TestBase64DataUrl(url); - if (match) { - const fileRequest = { - onCompleteObservable: new Observable(), - abort: () => () => { - } - }; - try { - const data = useArrayBuffer ? DecodeBase64UrlToBinary(url) : DecodeBase64UrlToString(url); - onSuccess(data, void 0, type); - } catch (error) { - if (onError) { - onError(void 0, error); - } else { - Logger.Error(error.message || "Failed to parse the Data URL"); - } - } - TimingTools.SetImmediate(() => { - fileRequest.onCompleteObservable.notifyObservers(fileRequest); - }); - return fileRequest; - } - return RequestFile(url, (data, request) => { - onSuccess(data, request == null ? void 0 : request.responseURL, request == null ? void 0 : request.getResponseHeader("content-type")); - }, onProgress, offlineProvider, useArrayBuffer, onError ? (error) => { - onError(error.request, new LoadFileError(error.message, error.request)); - } : void 0, onOpened); -}; -var RequestFile = (url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError, onOpened) => { - url = _CleanUrl(url); - url = FileToolsOptions.PreprocessUrl(url); - const loadUrl = FileToolsOptions.BaseUrl + url; - let aborted = false; - const fileRequest = { - onCompleteObservable: new Observable(), - abort: () => aborted = true - }; - const requestFile = () => { - let request = new WebRequest(); - let retryHandle = null; - let onReadyStateChange; - const unbindEvents = () => { - if (!request) { - return; - } - if (onProgress) { - request.removeEventListener("progress", onProgress); - } - if (onReadyStateChange) { - request.removeEventListener("readystatechange", onReadyStateChange); - } - request.removeEventListener("loadend", onLoadEnd); - }; - let onLoadEnd = () => { - unbindEvents(); - fileRequest.onCompleteObservable.notifyObservers(fileRequest); - fileRequest.onCompleteObservable.clear(); - onProgress = void 0; - onReadyStateChange = null; - onLoadEnd = null; - onError = void 0; - onOpened = void 0; - onSuccess = void 0; - }; - fileRequest.abort = () => { - aborted = true; - if (onLoadEnd) { - onLoadEnd(); - } - if (request && request.readyState !== (XMLHttpRequest.DONE || 4)) { - request.abort(); - } - if (retryHandle !== null) { - clearTimeout(retryHandle); - retryHandle = null; - } - request = null; - }; - const handleError = (error) => { - const message = error.message || "Unknown error"; - if (onError && request) { - onError(new RequestFileError(message, request)); - } else { - Logger.Error(message); - } - }; - const retryLoop = (retryIndex) => { - if (!request) { - return; - } - request.open("GET", loadUrl); - if (onOpened) { - try { - onOpened(request); - } catch (e) { - handleError(e); - return; - } - } - if (useArrayBuffer) { - request.responseType = "arraybuffer"; - } - if (onProgress) { - request.addEventListener("progress", onProgress); - } - if (onLoadEnd) { - request.addEventListener("loadend", onLoadEnd); - } - onReadyStateChange = () => { - if (aborted || !request) { - return; - } - if (request.readyState === (XMLHttpRequest.DONE || 4)) { - if (onReadyStateChange) { - request.removeEventListener("readystatechange", onReadyStateChange); - } - if (request.status >= 200 && request.status < 300 || request.status === 0 && (!IsWindowObjectExist() || IsFileURL())) { - try { - if (onSuccess) { - onSuccess(useArrayBuffer ? request.response : request.responseText, request); - } - } catch (e) { - handleError(e); - } - return; - } - const retryStrategy = FileToolsOptions.DefaultRetryStrategy; - if (retryStrategy) { - const waitTime = retryStrategy(loadUrl, request, retryIndex); - if (waitTime !== -1) { - unbindEvents(); - request = new WebRequest(); - retryHandle = setTimeout(() => retryLoop(retryIndex + 1), waitTime); - return; - } - } - const error = new RequestFileError("Error status: " + request.status + " " + request.statusText + " - Unable to load " + loadUrl, request); - if (onError) { - onError(error); - } - } - }; - request.addEventListener("readystatechange", onReadyStateChange); - request.send(); - }; - retryLoop(0); - }; - if (offlineProvider && offlineProvider.enableSceneOffline) { - const noOfflineSupport = (request) => { - if (request && request.status > 400) { - if (onError) { - onError(request); - } - } else { - requestFile(); - } - }; - const loadFromOfflineSupport = () => { - if (offlineProvider) { - offlineProvider.loadFile(FileToolsOptions.BaseUrl + url, (data) => { - if (!aborted && onSuccess) { - onSuccess(data); - } - fileRequest.onCompleteObservable.notifyObservers(fileRequest); - }, onProgress ? (event) => { - if (!aborted && onProgress) { - onProgress(event); - } - } : void 0, noOfflineSupport, useArrayBuffer); - } - }; - offlineProvider.open(loadFromOfflineSupport, noOfflineSupport); - } else { - requestFile(); - } - return fileRequest; -}; -var IsFileURL = () => { - return typeof location !== "undefined" && location.protocol === "file:"; -}; -var IsBase64DataUrl = (uri) => { - return Base64DataUrlRegEx.test(uri); -}; -var TestBase64DataUrl = (uri) => { - const results = Base64DataUrlRegEx.exec(uri); - if (results === null || results.length === 0) { - return { match: false, type: "" }; - } else { - const type = results[0].replace("data:", "").replace("base64,", ""); - return { match: true, type }; - } -}; -function DecodeBase64UrlToBinary(uri) { - return DecodeBase64ToBinary(uri.split(",")[1]); -} -var DecodeBase64UrlToString = (uri) => { - return DecodeBase64ToString(uri.split(",")[1]); -}; -var initSideEffects = () => { - ThinEngine._FileToolsLoadImage = LoadImage; - ThinEngine._FileToolsLoadFile = LoadFile; - ShaderProcessor._FileToolsLoadFile = LoadFile; -}; -initSideEffects(); -var FileTools; -var _injectLTSFileTools = (DecodeBase64UrlToBinary2, DecodeBase64UrlToString2, FileToolsOptions2, IsBase64DataUrl2, IsFileURL2, LoadFile2, LoadImage2, ReadFile2, RequestFile2, SetCorsBehavior2) => { - FileTools = { - DecodeBase64UrlToBinary: DecodeBase64UrlToBinary2, - DecodeBase64UrlToString: DecodeBase64UrlToString2, - DefaultRetryStrategy: FileToolsOptions2.DefaultRetryStrategy, - BaseUrl: FileToolsOptions2.BaseUrl, - CorsBehavior: FileToolsOptions2.CorsBehavior, - PreprocessUrl: FileToolsOptions2.PreprocessUrl, - IsBase64DataUrl: IsBase64DataUrl2, - IsFileURL: IsFileURL2, - LoadFile: LoadFile2, - LoadImage: LoadImage2, - ReadFile: ReadFile2, - RequestFile: RequestFile2, - SetCorsBehavior: SetCorsBehavior2 - }; - Object.defineProperty(FileTools, "DefaultRetryStrategy", { - get: function() { - return FileToolsOptions2.DefaultRetryStrategy; - }, - set: function(value) { - FileToolsOptions2.DefaultRetryStrategy = value; - } - }); - Object.defineProperty(FileTools, "BaseUrl", { - get: function() { - return FileToolsOptions2.BaseUrl; - }, - set: function(value) { - FileToolsOptions2.BaseUrl = value; - } - }); - Object.defineProperty(FileTools, "PreprocessUrl", { - get: function() { - return FileToolsOptions2.PreprocessUrl; - }, - set: function(value) { - FileToolsOptions2.PreprocessUrl = value; - } - }); - Object.defineProperty(FileTools, "CorsBehavior", { - get: function() { - return FileToolsOptions2.CorsBehavior; - }, - set: function(value) { - FileToolsOptions2.CorsBehavior = value; - } - }); -}; -_injectLTSFileTools(DecodeBase64UrlToBinary, DecodeBase64UrlToString, FileToolsOptions, IsBase64DataUrl, IsFileURL, LoadFile, LoadImage, ReadFile, RequestFile, SetCorsBehavior); - -// node_modules/@babylonjs/core/Misc/guid.js -function RandomGUID() { - return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => { - const r = Math.random() * 16 | 0, v = c === "x" ? r : r & 3 | 8; - return v.toString(16); - }); -} -var GUID = { /** - * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523 - * Be aware Math.random() could cause collisions, but: - * "All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide" - * @returns a pseudo random id + * Multiplies the Color4 values by the float "scale" + * @param scale defines the scaling factor to apply + * @returns the current updated Color4 */ - // eslint-disable-next-line @typescript-eslint/naming-convention - RandomId: RandomGUID -}; - -// node_modules/@babylonjs/core/Misc/instantiationTools.js -var InstantiationTools = class { + scaleInPlace(scale) { + this.r *= scale; + this.g *= scale; + this.b *= scale; + this.a *= scale; + return this; + } /** - * Tries to instantiate a new object from a given class name - * @param className defines the class name to instantiate - * @returns the new object or null if the system was not able to do the instantiation + * Multiplies the current Color4 values by scale and stores the result in "result" + * @param scale defines the scaling factor to apply + * @param result defines the Color4 object where to store the result + * @returns the result Color4 */ - static Instantiate(className2) { - if (this.RegisteredExternalClasses && this.RegisteredExternalClasses[className2]) { - return this.RegisteredExternalClasses[className2]; - } - const internalClass = GetClass(className2); - if (internalClass) { - return internalClass; - } - Logger.Warn(className2 + " not found, you may have missed an import."); - const arr = className2.split("."); - let fn = window || this; - for (let i = 0, len = arr.length; i < len; i++) { - fn = fn[arr[i]]; - } - if (typeof fn !== "function") { - return null; - } - return fn; + scaleToRef(scale, result) { + result.r = this.r * scale; + result.g = this.g * scale; + result.b = this.b * scale; + result.a = this.a * scale; + return result; } -}; -InstantiationTools.RegisteredExternalClasses = {}; - -// node_modules/@babylonjs/core/Misc/tools.functions.js -function IsExponentOfTwo(value) { - let count = 1; - do { - count *= 2; - } while (count < value); - return count === value; -} -function Mix(a, b, alpha) { - return a * (1 - alpha) + b * alpha; -} - -// node_modules/@babylonjs/core/Misc/tools.js -var Tools = class _Tools { /** - * Gets or sets the base URL to use to load assets + * Scale the current Color4 values by a factor and add the result to a given Color4 + * @param scale defines the scale factor + * @param result defines the Color4 object where to store the result + * @returns the result Color4 */ - static get BaseUrl() { - return FileToolsOptions.BaseUrl; - } - static set BaseUrl(value) { - FileToolsOptions.BaseUrl = value; + scaleAndAddToRef(scale, result) { + result.r += this.r * scale; + result.g += this.g * scale; + result.b += this.b * scale; + result.a += this.a * scale; + return result; } /** - * This function checks whether a URL is absolute or not. - * It will also detect data and blob URLs - * @param url the url to check - * @returns is the url absolute or relative + * Clamps the rgb values by the min and max values and stores the result into "result" + * @param min defines minimum clamping value (default is 0) + * @param max defines maximum clamping value (default is 1) + * @param result defines color to store the result into. + * @returns the result Color4 */ - static IsAbsoluteUrl(url) { - if (url.indexOf("//") === 0) { - return true; - } - if (url.indexOf("://") === -1) { - return false; - } - if (url.indexOf(".") === -1) { - return false; - } - if (url.indexOf("/") === -1) { - return false; - } - if (url.indexOf(":") > url.indexOf("/")) { - return false; - } - if (url.indexOf("://") < url.indexOf(".")) { - return true; - } - if (url.indexOf("data:") === 0 || url.indexOf("blob:") === 0) { - return true; - } - return false; + clampToRef(min = 0, max = 1, result) { + result.r = Clamp(this.r, min, max); + result.g = Clamp(this.g, min, max); + result.b = Clamp(this.b, min, max); + result.a = Clamp(this.a, min, max); + return result; } /** - * Sets the base URL to use to load scripts + * Multiply an Color4 value by another and return a new Color4 object + * @param color defines the Color4 value to multiply by + * @returns a new Color4 object */ - static set ScriptBaseUrl(value) { - FileToolsOptions.ScriptBaseUrl = value; - } - static get ScriptBaseUrl() { - return FileToolsOptions.ScriptBaseUrl; + multiply(color) { + return new this.constructor(this.r * color.r, this.g * color.g, this.b * color.b, this.a * color.a); } /** - * Sets a preprocessing function to run on a source URL before importing it - * Note that this function will execute AFTER the base URL is appended to the URL + * Multiply a Color4 value by another and push the result in a reference value + * @param color defines the Color4 value to multiply by + * @param result defines the Color4 to fill the result in + * @returns the result Color4 */ - static set ScriptPreprocessUrl(func) { - FileToolsOptions.ScriptPreprocessUrl = func; - } - static get ScriptPreprocessUrl() { - return FileToolsOptions.ScriptPreprocessUrl; + multiplyToRef(color, result) { + result.r = this.r * color.r; + result.g = this.g * color.g; + result.b = this.b * color.b; + result.a = this.a * color.a; + return result; } /** - * Gets or sets the retry strategy to apply when an error happens while loading an asset + * Multiplies in place the current Color4 by the given one. + * @param otherColor color to multiple with + * @returns the updated Color4. */ - static get DefaultRetryStrategy() { - return FileToolsOptions.DefaultRetryStrategy; - } - static set DefaultRetryStrategy(strategy) { - FileToolsOptions.DefaultRetryStrategy = strategy; + multiplyInPlace(otherColor) { + this.r *= otherColor.r; + this.g *= otherColor.g; + this.b *= otherColor.b; + this.a *= otherColor.a; + return this; } /** - * Default behavior for cors in the application. - * It can be a string if the expected behavior is identical in the entire app. - * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance) + * Returns a new Color4 set with the multiplication result of the given floats and the current Color4 coordinates. + * @param r value multiply with + * @param g value multiply with + * @param b value multiply with + * @param a value multiply with + * @returns resulting new color */ - static get CorsBehavior() { - return FileToolsOptions.CorsBehavior; - } - static set CorsBehavior(value) { - FileToolsOptions.CorsBehavior = value; + multiplyByFloats(r, g, b, a) { + return new this.constructor(this.r * r, this.g * g, this.b * b, this.a * a); } /** - * Gets or sets a global variable indicating if fallback texture must be used when a texture cannot be loaded - * @ignorenaming + * @internal + * Do not use */ - static get UseFallbackTexture() { - return EngineStore.UseFallbackTexture; - } - static set UseFallbackTexture(value) { - EngineStore.UseFallbackTexture = value; + divide(_other) { + throw new ReferenceError("Can not divide a color"); } /** - * Use this object to register external classes like custom textures or material - * to allow the loaders to instantiate them + * @internal + * Do not use */ - static get RegisteredExternalClasses() { - return InstantiationTools.RegisteredExternalClasses; - } - static set RegisteredExternalClasses(classes) { - InstantiationTools.RegisteredExternalClasses = classes; + divideToRef(_other, _result) { + throw new ReferenceError("Can not divide a color"); } /** - * Texture content used if a texture cannot loaded - * @ignorenaming + * @internal + * Do not use */ - // eslint-disable-next-line @typescript-eslint/naming-convention - static get fallbackTexture() { - return EngineStore.FallbackTexture; - } - // eslint-disable-next-line @typescript-eslint/naming-convention - static set fallbackTexture(value) { - EngineStore.FallbackTexture = value; + divideInPlace(_other) { + throw new ReferenceError("Can not divide a color"); } /** - * Read the content of a byte array at a specified coordinates (taking in account wrapping) - * @param u defines the coordinate on X axis - * @param v defines the coordinate on Y axis - * @param width defines the width of the source data - * @param height defines the height of the source data - * @param pixels defines the source byte array - * @param color defines the output color + * Updates the Color4 coordinates with the minimum values between its own and the given color ones + * @param other defines the second operand + * @returns the current updated Color4 */ - static FetchToRef(u, v, width, height, pixels, color) { - const wrappedU = Math.abs(u) * width % width | 0; - const wrappedV = Math.abs(v) * height % height | 0; - const position = (wrappedU + wrappedV * width) * 4; - color.r = pixels[position] / 255; - color.g = pixels[position + 1] / 255; - color.b = pixels[position + 2] / 255; - color.a = pixels[position + 3] / 255; + minimizeInPlace(other) { + this.r = Math.min(this.r, other.r); + this.g = Math.min(this.g, other.g); + this.b = Math.min(this.b, other.b); + this.a = Math.min(this.a, other.a); + return this; } /** - * Interpolates between a and b via alpha - * @param a The lower value (returned when alpha = 0) - * @param b The upper value (returned when alpha = 1) - * @param alpha The interpolation-factor - * @returns The mixed value + * Updates the Color4 coordinates with the maximum values between its own and the given color ones + * @param other defines the second operand + * @returns the current updated Color4 */ - static Mix(a, b, alpha) { - return 0; + maximizeInPlace(other) { + this.r = Math.max(this.r, other.r); + this.g = Math.max(this.g, other.g); + this.b = Math.max(this.b, other.b); + this.a = Math.max(this.a, other.a); + return this; } /** - * Tries to instantiate a new object from a given class name - * @param className defines the class name to instantiate - * @returns the new object or null if the system was not able to do the instantiation + * Updates the current Color4 with the minimal coordinate values between its and the given coordinates + * @param r defines the r coordinate of the operand + * @param g defines the g coordinate of the operand + * @param b defines the b coordinate of the operand + * @param a defines the a coordinate of the operand + * @returns the current updated Color4 */ - static Instantiate(className2) { - return InstantiationTools.Instantiate(className2); + minimizeInPlaceFromFloats(r, g, b, a) { + this.r = Math.min(r, this.r); + this.g = Math.min(g, this.g); + this.b = Math.min(b, this.b); + this.a = Math.min(a, this.a); + return this; } /** - * Polyfill for setImmediate - * @param action defines the action to execute after the current execution block + * Updates the current Color4 with the maximal coordinate values between its and the given coordinates. + * @param r defines the r coordinate of the operand + * @param g defines the g coordinate of the operand + * @param b defines the b coordinate of the operand + * @param a defines the a coordinate of the operand + * @returns the current updated Color4 */ - static SetImmediate(action) { - TimingTools.SetImmediate(action); + maximizeInPlaceFromFloats(r, g, b, a) { + this.r = Math.max(r, this.r); + this.g = Math.max(g, this.g); + this.b = Math.max(b, this.b); + this.a = Math.max(a, this.a); + return this; } /** - * Function indicating if a number is an exponent of 2 - * @param value defines the value to test - * @returns true if the value is an exponent of 2 + * @internal + * Do not use */ - static IsExponentOfTwo(value) { - return true; + floorToRef(_result) { + throw new ReferenceError("Can not floor a color"); } /** - * Returns the nearest 32-bit single precision float representation of a Number - * @param value A Number. If the parameter is of a different type, it will get converted - * to a number or to NaN if it cannot be converted - * @returns number + * @internal + * Do not use */ - static FloatRound(value) { - return Math.fround(value); + floor() { + throw new ReferenceError("Can not floor a color"); } /** - * Extracts the filename from a path - * @param path defines the path to use - * @returns the filename + * @internal + * Do not use */ - static GetFilename(path) { - const index = path.lastIndexOf("/"); - if (index < 0) { - return path; - } - return path.substring(index + 1); + fractToRef(_result) { + throw new ReferenceError("Can not fract a color"); } /** - * Extracts the "folder" part of a path (everything before the filename). - * @param uri The URI to extract the info from - * @param returnUnchangedIfNoSlash Do not touch the URI if no slashes are present - * @returns The "folder" part of the path + * @internal + * Do not use */ - static GetFolderPath(uri, returnUnchangedIfNoSlash = false) { - const index = uri.lastIndexOf("/"); - if (index < 0) { - if (returnUnchangedIfNoSlash) { - return uri; - } - return ""; - } - return uri.substring(0, index + 1); + fract() { + throw new ReferenceError("Can not fract a color"); } /** - * Convert an angle in radians to degrees - * @param angle defines the angle to convert - * @returns the angle in degrees + * @internal + * Do not use */ - static ToDegrees(angle) { - return angle * 180 / Math.PI; + negate() { + throw new ReferenceError("Can not negate a color"); } /** - * Convert an angle in degrees to radians - * @param angle defines the angle to convert - * @returns the angle in radians + * @internal + * Do not use */ - static ToRadians(angle) { - return angle * Math.PI / 180; + negateInPlace() { + throw new ReferenceError("Can not negate a color"); } /** - * Smooth angle changes (kind of low-pass filter), in particular for device orientation "shaking" - * Use trigonometric functions to avoid discontinuity (0/360, -180/180) - * @param previousAngle defines last angle value, in degrees - * @param newAngle defines new angle value, in degrees - * @param smoothFactor defines smoothing sensitivity; min 0: no smoothing, max 1: new data ignored - * @returns the angle in degrees + * @internal + * Do not use */ - static SmoothAngleChange(previousAngle, newAngle, smoothFactor = 0.9) { - const previousAngleRad = this.ToRadians(previousAngle); - const newAngleRad = this.ToRadians(newAngle); - return this.ToDegrees(Math.atan2((1 - smoothFactor) * Math.sin(newAngleRad) + smoothFactor * Math.sin(previousAngleRad), (1 - smoothFactor) * Math.cos(newAngleRad) + smoothFactor * Math.cos(previousAngleRad))); + negateToRef(_result) { + throw new ReferenceError("Can not negate a color"); } /** - * Returns an array if obj is not an array - * @param obj defines the object to evaluate as an array - * @param allowsNullUndefined defines a boolean indicating if obj is allowed to be null or undefined - * @returns either obj directly if obj is an array or a new array containing obj + * Boolean : True if the current Color4 coordinates are each beneath the distance "epsilon" from the given color ones. + * @param otherColor color to compare against + * @param epsilon (Default: very small number) + * @returns true if they are equal */ - static MakeArray(obj, allowsNullUndefined) { - if (allowsNullUndefined !== true && (obj === void 0 || obj == null)) { - return null; - } - return Array.isArray(obj) ? obj : [obj]; + equalsWithEpsilon(otherColor, epsilon = Epsilon) { + return Scalar.WithinEpsilon(this.r, otherColor.r, epsilon) && Scalar.WithinEpsilon(this.g, otherColor.g, epsilon) && Scalar.WithinEpsilon(this.b, otherColor.b, epsilon) && Scalar.WithinEpsilon(this.a, otherColor.a, epsilon); } /** - * Gets the pointer prefix to use - * @param engine defines the engine we are finding the prefix for - * @returns "pointer" if touch is enabled. Else returns "mouse" + * Boolean : True if the given floats are strictly equal to the current Color4 coordinates. + * @param x x value to compare against + * @param y y value to compare against + * @param z z value to compare against + * @param w w value to compare against + * @returns true if equal */ - static GetPointerPrefix(engine) { - let eventPrefix = "pointer"; - if (IsWindowObjectExist() && !window.PointerEvent) { - eventPrefix = "mouse"; - } - if (engine._badDesktopOS && !engine._badOS && // And not ipad pros who claim to be macs... - !(document && "ontouchend" in document)) { - eventPrefix = "mouse"; - } - return eventPrefix; + equalsToFloats(x, y, z, w) { + return this.r === x && this.g === y && this.b === z && this.a === w; } /** - * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element. - * @param url define the url we are trying - * @param element define the dom element where to configure the cors policy - * @param element.crossOrigin + * Creates a string with the Color4 current values + * @returns the string representation of the Color4 object */ - static SetCorsBehavior(url, element) { - SetCorsBehavior(url, element); + toString() { + return "{R: " + this.r + " G:" + this.g + " B:" + this.b + " A:" + this.a + "}"; } /** - * Sets the referrerPolicy behavior on a dom element. - * @param referrerPolicy define the referrer policy to use - * @param element define the dom element where to configure the referrer policy - * @param element.referrerPolicy + * Returns the string "Color4" + * @returns "Color4" */ - static SetReferrerPolicyBehavior(referrerPolicy, element) { - element.referrerPolicy = referrerPolicy; + getClassName() { + return "Color4"; } - // External files /** - * Removes unwanted characters from an url - * @param url defines the url to clean - * @returns the cleaned url + * Compute the Color4 hash code + * @returns an unique number that can be used to hash Color4 objects */ - static CleanUrl(url) { - url = url.replace(/#/gm, "%23"); - return url; + getHashCode() { + let hash = this.r * 255 | 0; + hash = hash * 397 ^ (this.g * 255 | 0); + hash = hash * 397 ^ (this.b * 255 | 0); + hash = hash * 397 ^ (this.a * 255 | 0); + return hash; } /** - * Gets or sets a function used to pre-process url before using them to load assets + * Creates a new Color4 copied from the current one + * @returns a new Color4 object */ - static get PreprocessUrl() { - return FileToolsOptions.PreprocessUrl; - } - static set PreprocessUrl(processor) { - FileToolsOptions.PreprocessUrl = processor; + clone() { + const result = new this.constructor(); + return result.copyFrom(this); } /** - * Loads an image as an HTMLImageElement. - * @param input url string, ArrayBuffer, or Blob to load - * @param onLoad callback called when the image successfully loads - * @param onError callback called when the image fails to load - * @param offlineProvider offline provider for caching - * @param mimeType optional mime type - * @param imageBitmapOptions optional the options to use when creating an ImageBitmap - * @returns the HTMLImageElement of the loaded image + * Copies the given Color4 values into the current one + * @param source defines the source Color4 object + * @returns the current updated Color4 object */ - static LoadImage(input, onLoad, onError, offlineProvider, mimeType, imageBitmapOptions) { - return LoadImage(input, onLoad, onError, offlineProvider, mimeType, imageBitmapOptions); + copyFrom(source) { + this.r = source.r; + this.g = source.g; + this.b = source.b; + this.a = source.a; + return this; } /** - * Loads a file from a url - * @param url url string, ArrayBuffer, or Blob to load - * @param onSuccess callback called when the file successfully loads - * @param onProgress callback called while file is loading (if the server supports this mode) - * @param offlineProvider defines the offline provider for caching - * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer - * @param onError callback called when the file fails to load - * @returns a file request object + * Copies the given float values into the current one + * @param r defines the red component to read from + * @param g defines the green component to read from + * @param b defines the blue component to read from + * @param a defines the alpha component to read from + * @returns the current updated Color4 object */ - static LoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError) { - return LoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError); + copyFromFloats(r, g, b, a) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + return this; } /** - * Loads a file from a url - * @param url the file url to load - * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer - * @returns a promise containing an ArrayBuffer corresponding to the loaded file + * Copies the given float values into the current one + * @param r defines the red component to read from + * @param g defines the green component to read from + * @param b defines the blue component to read from + * @param a defines the alpha component to read from + * @returns the current updated Color4 object */ - static LoadFileAsync(url, useArrayBuffer = true) { - return new Promise((resolve, reject) => { - LoadFile(url, (data) => { - resolve(data); - }, void 0, void 0, useArrayBuffer, (request, exception) => { - reject(exception); - }); - }); + set(r, g, b, a) { + return this.copyFromFloats(r, g, b, a); } /** - * Get a script URL including preprocessing - * @param scriptUrl the script Url to process - * @param forceAbsoluteUrl force the script to be an absolute url (adding the current base url if necessary) - * @returns a modified URL to use + * Copies the given float to the current Vector4 coordinates + * @param v defines the r, g, b, and a coordinates of the operand + * @returns the current updated Vector4 */ - static GetBabylonScriptURL(scriptUrl, forceAbsoluteUrl) { - if (!scriptUrl) { - return ""; - } - if (_Tools.ScriptBaseUrl && scriptUrl.startsWith(_Tools._DefaultCdnUrl)) { - const baseUrl = _Tools.ScriptBaseUrl[_Tools.ScriptBaseUrl.length - 1] === "/" ? _Tools.ScriptBaseUrl.substring(0, _Tools.ScriptBaseUrl.length - 1) : _Tools.ScriptBaseUrl; - scriptUrl = scriptUrl.replace(_Tools._DefaultCdnUrl, baseUrl); - } - scriptUrl = _Tools.ScriptPreprocessUrl(scriptUrl); - if (forceAbsoluteUrl) { - scriptUrl = _Tools.GetAbsoluteUrl(scriptUrl); - } - return scriptUrl; + setAll(v) { + this.r = this.g = this.b = this.a = v; + return this; } /** - * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the - * content of this file is added into a new script element, attached to the DOM (body element) - * @param scriptUrl defines the url of the script to load - * @param onSuccess defines the callback called when the script is loaded - * @param onError defines the callback to call if an error occurs - * @param scriptId defines the id of the script element + * Compute the Color4 hexadecimal code as a string + * @param returnAsColor3 defines if the string should only contains RGB values (off by default) + * @returns a string containing the hexadecimal representation of the Color4 object */ - static LoadBabylonScript(scriptUrl, onSuccess, onError, scriptId) { - scriptUrl = _Tools.GetBabylonScriptURL(scriptUrl); - _Tools.LoadScript(scriptUrl, onSuccess, onError); + toHexString(returnAsColor3 = false) { + const intR = Math.round(this.r * 255); + const intG = Math.round(this.g * 255); + const intB = Math.round(this.b * 255); + if (returnAsColor3) { + return "#" + ToHex(intR) + ToHex(intG) + ToHex(intB); + } + const intA = Math.round(this.a * 255); + return "#" + ToHex(intR) + ToHex(intG) + ToHex(intB) + ToHex(intA); } /** - * Load an asynchronous script (identified by an url). When the url returns, the - * content of this file is added into a new script element, attached to the DOM (body element) - * @param scriptUrl defines the url of the script to laod - * @returns a promise request object + * Computes a new Color4 converted from the current one to linear space + * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) + * @returns a new Color4 object */ - static LoadBabylonScriptAsync(scriptUrl) { - scriptUrl = _Tools.GetBabylonScriptURL(scriptUrl); - return _Tools.LoadScriptAsync(scriptUrl); + toLinearSpace(exact = false) { + const convertedColor = new _Color4(); + this.toLinearSpaceToRef(convertedColor, exact); + return convertedColor; } /** - * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the - * content of this file is added into a new script element, attached to the DOM (body element) - * @param scriptUrl defines the url of the script to load - * @param onSuccess defines the callback called when the script is loaded - * @param onError defines the callback to call if an error occurs - * @param scriptId defines the id of the script element + * Converts the Color4 values to linear space and stores the result in "convertedColor" + * @param convertedColor defines the Color4 object where to store the linear space version + * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) + * @returns the unmodified Color4 */ - static LoadScript(scriptUrl, onSuccess, onError, scriptId) { - if (typeof importScripts === "function") { - try { - importScripts(scriptUrl); - onSuccess(); - } catch (e) { - onError == null ? void 0 : onError(`Unable to load script '${scriptUrl}' in worker`, e); - } - return; - } else if (!IsWindowObjectExist()) { - onError == null ? void 0 : onError(`Cannot load script '${scriptUrl}' outside of a window or a worker`); - return; - } - const head = document.getElementsByTagName("head")[0]; - const script = document.createElement("script"); - script.setAttribute("type", "text/javascript"); - script.setAttribute("src", scriptUrl); - if (scriptId) { - script.id = scriptId; + toLinearSpaceToRef(convertedColor, exact = false) { + if (exact) { + convertedColor.r = colorChannelToLinearSpaceExact(this.r); + convertedColor.g = colorChannelToLinearSpaceExact(this.g); + convertedColor.b = colorChannelToLinearSpaceExact(this.b); + } else { + convertedColor.r = colorChannelToLinearSpace(this.r); + convertedColor.g = colorChannelToLinearSpace(this.g); + convertedColor.b = colorChannelToLinearSpace(this.b); } - script.onload = () => { - if (onSuccess) { - onSuccess(); - } - }; - script.onerror = (e) => { - if (onError) { - onError(`Unable to load script '${scriptUrl}'`, e); - } - }; - head.appendChild(script); + convertedColor.a = this.a; + return this; } /** - * Load an asynchronous script (identified by an url). When the url returns, the - * content of this file is added into a new script element, attached to the DOM (body element) - * @param scriptUrl defines the url of the script to load - * @param scriptId defines the id of the script element - * @returns a promise request object + * Computes a new Color4 converted from the current one to gamma space + * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) + * @returns a new Color4 object */ - static LoadScriptAsync(scriptUrl, scriptId) { - return new Promise((resolve, reject) => { - this.LoadScript(scriptUrl, () => { - resolve(); - }, (message, exception) => { - reject(exception || new Error(message)); - }, scriptId); - }); + toGammaSpace(exact = false) { + const convertedColor = new _Color4(); + this.toGammaSpaceToRef(convertedColor, exact); + return convertedColor; } /** - * Loads a file from a blob - * @param fileToLoad defines the blob to use - * @param callback defines the callback to call when data is loaded - * @param progressCallback defines the callback to call during loading process - * @returns a file request object + * Converts the Color4 values to gamma space and stores the result in "convertedColor" + * @param convertedColor defines the Color4 object where to store the gamma space version + * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false) + * @returns the unmodified Color4 */ - static ReadFileAsDataURL(fileToLoad, callback, progressCallback) { - const reader = new FileReader(); - const request = { - onCompleteObservable: new Observable(), - abort: () => reader.abort() - }; - reader.onloadend = () => { - request.onCompleteObservable.notifyObservers(request); - }; - reader.onload = (e) => { - callback(e.target["result"]); - }; - reader.onprogress = progressCallback; - reader.readAsDataURL(fileToLoad); - return request; + toGammaSpaceToRef(convertedColor, exact = false) { + if (exact) { + convertedColor.r = colorChannelToGammaSpaceExact(this.r); + convertedColor.g = colorChannelToGammaSpaceExact(this.g); + convertedColor.b = colorChannelToGammaSpaceExact(this.b); + } else { + convertedColor.r = colorChannelToGammaSpace(this.r); + convertedColor.g = colorChannelToGammaSpace(this.g); + convertedColor.b = colorChannelToGammaSpace(this.b); + } + convertedColor.a = this.a; + return this; } + // Statics /** - * Reads a file from a File object - * @param file defines the file to load - * @param onSuccess defines the callback to call when data is loaded - * @param onProgress defines the callback to call during loading process - * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer - * @param onError defines the callback to call when an error occurs - * @returns a file request object + * Creates a new Color4 from the string containing valid hexadecimal values. + * + * A valid hex string is either in the format #RRGGBB or #RRGGBBAA. + * + * When a hex string without alpha is passed, the resulting Color4 has + * its alpha value set to 1.0. + * + * An invalid string results in a Color with all its channels set to 0.0, + * i.e. "transparent black". + * + * @param hex defines a string containing valid hexadecimal values + * @returns a new Color4 object */ - static ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError) { - return ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError); + static FromHexString(hex) { + if (hex.substring(0, 1) !== "#" || hex.length !== 9 && hex.length !== 7) { + return new _Color4(0, 0, 0, 0); + } + const r = parseInt(hex.substring(1, 3), 16); + const g = parseInt(hex.substring(3, 5), 16); + const b = parseInt(hex.substring(5, 7), 16); + const a = hex.length === 9 ? parseInt(hex.substring(7, 9), 16) : 255; + return _Color4.FromInts(r, g, b, a); } /** - * Creates a data url from a given string content - * @param content defines the content to convert - * @returns the new data url link + * Creates a new Color4 object set with the linearly interpolated values of "amount" between the left Color4 object and the right Color4 object + * @param left defines the start value + * @param right defines the end value + * @param amount defines the gradient factor + * @returns a new Color4 object */ - static FileAsURL(content) { - const fileBlob = new Blob([content]); - const url = window.URL; - const link = url.createObjectURL(fileBlob); - return link; + static Lerp(left, right, amount) { + const result = new _Color4(0, 0, 0, 0); + _Color4.LerpToRef(left, right, amount, result); + return result; } /** - * Format the given number to a specific decimal format - * @param value defines the number to format - * @param decimals defines the number of decimals to use - * @returns the formatted string + * Set the given "result" with the linearly interpolated values of "amount" between the left Color4 object and the right Color4 object + * @param left defines the start value + * @param right defines the end value + * @param amount defines the gradient factor + * @param result defines the Color4 object where to store data */ - static Format(value, decimals = 2) { - return value.toFixed(decimals); + static LerpToRef(left, right, amount, result) { + result.r = left.r + (right.r - left.r) * amount; + result.g = left.g + (right.g - left.g) * amount; + result.b = left.b + (right.b - left.b) * amount; + result.a = left.a + (right.a - left.a) * amount; } /** - * Tries to copy an object by duplicating every property - * @param source defines the source object - * @param destination defines the target object - * @param doNotCopyList defines a list of properties to avoid - * @param mustCopyList defines a list of properties to copy (even if they start with _) + * Interpolate between two Color4 using Hermite interpolation + * @param value1 defines first Color4 + * @param tangent1 defines the incoming tangent + * @param value2 defines second Color4 + * @param tangent2 defines the outgoing tangent + * @param amount defines the target Color4 + * @returns the new interpolated Color4 */ - static DeepCopy(source, destination, doNotCopyList, mustCopyList) { - DeepCopier.DeepCopy(source, destination, doNotCopyList, mustCopyList); + static Hermite(value1, tangent1, value2, tangent2, amount) { + const squared = amount * amount; + const cubed = amount * squared; + const part1 = 2 * cubed - 3 * squared + 1; + const part2 = -2 * cubed + 3 * squared; + const part3 = cubed - 2 * squared + amount; + const part4 = cubed - squared; + const r = value1.r * part1 + value2.r * part2 + tangent1.r * part3 + tangent2.r * part4; + const g = value1.g * part1 + value2.g * part2 + tangent1.g * part3 + tangent2.g * part4; + const b = value1.b * part1 + value2.b * part2 + tangent1.b * part3 + tangent2.b * part4; + const a = value1.a * part1 + value2.a * part2 + tangent1.a * part3 + tangent2.a * part4; + return new _Color4(r, g, b, a); } /** - * Gets a boolean indicating if the given object has no own property - * @param obj defines the object to test - * @returns true if object has no own property + * Returns a new Color4 which is the 1st derivative of the Hermite spline defined by the colors "value1", "value2", "tangent1", "tangent2". + * @param value1 defines the first control point + * @param tangent1 defines the first tangent + * @param value2 defines the second control point + * @param tangent2 defines the second tangent + * @param time define where the derivative must be done + * @returns 1st derivative */ - static IsEmpty(obj) { - for (const i in obj) { - if (Object.prototype.hasOwnProperty.call(obj, i)) { - return false; - } - } - return true; + static Hermite1stDerivative(value1, tangent1, value2, tangent2, time) { + const result = new _Color4(); + this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result); + return result; } /** - * Function used to register events at window level - * @param windowElement defines the Window object to use - * @param events defines the events to register + * Update a Color4 with the 1st derivative of the Hermite spline defined by the colors "value1", "value2", "tangent1", "tangent2". + * @param value1 defines the first control point + * @param tangent1 defines the first tangent + * @param value2 defines the second control point + * @param tangent2 defines the second tangent + * @param time define where the derivative must be done + * @param result define where to store the derivative */ - static RegisterTopRootEvents(windowElement, events) { - for (let index = 0; index < events.length; index++) { - const event = events[index]; - windowElement.addEventListener(event.name, event.handler, false); - try { - if (window.parent) { - window.parent.addEventListener(event.name, event.handler, false); - } - } catch (e) { - } - } + static Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result) { + const t2 = time * time; + result.r = (t2 - time) * 6 * value1.r + (3 * t2 - 4 * time + 1) * tangent1.r + (-t2 + time) * 6 * value2.r + (3 * t2 - 2 * time) * tangent2.r; + result.g = (t2 - time) * 6 * value1.g + (3 * t2 - 4 * time + 1) * tangent1.g + (-t2 + time) * 6 * value2.g + (3 * t2 - 2 * time) * tangent2.g; + result.b = (t2 - time) * 6 * value1.b + (3 * t2 - 4 * time + 1) * tangent1.b + (-t2 + time) * 6 * value2.b + (3 * t2 - 2 * time) * tangent2.b; + result.a = (t2 - time) * 6 * value1.a + (3 * t2 - 4 * time + 1) * tangent1.a + (-t2 + time) * 6 * value2.a + (3 * t2 - 2 * time) * tangent2.a; } /** - * Function used to unregister events from window level - * @param windowElement defines the Window object to use - * @param events defines the events to unregister + * Creates a new Color4 from a Color3 and an alpha value + * @param color3 defines the source Color3 to read from + * @param alpha defines the alpha component (1.0 by default) + * @returns a new Color4 object */ - static UnregisterTopRootEvents(windowElement, events) { - for (let index = 0; index < events.length; index++) { - const event = events[index]; - windowElement.removeEventListener(event.name, event.handler); - try { - if (windowElement.parent) { - windowElement.parent.removeEventListener(event.name, event.handler); - } - } catch (e) { - } - } + static FromColor3(color3, alpha = 1) { + return new _Color4(color3.r, color3.g, color3.b, alpha); } /** - * Dumps the current bound framebuffer - * @param width defines the rendering width - * @param height defines the rendering height - * @param engine defines the hosting engine - * @param successCallback defines the callback triggered once the data are available - * @param mimeType defines the mime type of the result - * @param fileName defines the filename to download. If present, the result will automatically be downloaded - * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. - * @returns a void promise + * Creates a new Color4 from the starting index element of the given array + * @param array defines the source array to read from + * @param offset defines the offset in the source array + * @returns a new Color4 object */ - static async DumpFramebuffer(width, height, engine, successCallback, mimeType = "image/png", fileName, quality) { - throw _WarnImport("DumpTools"); + static FromArray(array, offset = 0) { + return new _Color4(array[offset], array[offset + 1], array[offset + 2], array[offset + 3]); } /** - * Dumps an array buffer - * @param width defines the rendering width - * @param height defines the rendering height - * @param data the data array - * @param successCallback defines the callback triggered once the data are available - * @param mimeType defines the mime type of the result - * @param fileName defines the filename to download. If present, the result will automatically be downloaded - * @param invertY true to invert the picture in the Y dimension - * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string - * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + * Creates a new Color4 from the starting index element of the given array + * @param array defines the source array to read from + * @param offset defines the offset in the source array + * @param result defines the target Color4 object */ - static DumpData(width, height, data, successCallback, mimeType = "image/png", fileName, invertY = false, toArrayBuffer = false, quality) { - throw _WarnImport("DumpTools"); + static FromArrayToRef(array, offset = 0, result) { + result.r = array[offset]; + result.g = array[offset + 1]; + result.b = array[offset + 2]; + result.a = array[offset + 3]; } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Dumps an array buffer - * @param width defines the rendering width - * @param height defines the rendering height - * @param data the data array - * @param mimeType defines the mime type of the result - * @param fileName defines the filename to download. If present, the result will automatically be downloaded - * @param invertY true to invert the picture in the Y dimension - * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string - * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. - * @returns a promise that resolve to the final data + * Creates a new Color3 from integer values (less than 256) + * @param r defines the red component to read from (value between 0 and 255) + * @param g defines the green component to read from (value between 0 and 255) + * @param b defines the blue component to read from (value between 0 and 255) + * @param a defines the alpha component to read from (value between 0 and 255) + * @returns a new Color3 object */ - static DumpDataAsync(width, height, data, mimeType = "image/png", fileName, invertY = false, toArrayBuffer = false, quality) { - throw _WarnImport("DumpTools"); - } - static _IsOffScreenCanvas(canvas) { - return canvas.convertToBlob !== void 0; + static FromInts(r, g, b, a) { + return new _Color4(r / 255, g / 255, b / 255, a / 255); } /** - * Converts the canvas data to blob. - * This acts as a polyfill for browsers not supporting the to blob function. - * @param canvas Defines the canvas to extract the data from (can be an offscreen canvas) - * @param successCallback Defines the callback triggered once the data are available - * @param mimeType Defines the mime type of the result - * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + * Check the content of a given array and convert it to an array containing RGBA data + * If the original array was already containing count * 4 values then it is returned directly + * @param colors defines the array to check + * @param count defines the number of RGBA data to expect + * @returns an array containing count * 4 values (RGBA) */ - static ToBlob(canvas, successCallback, mimeType = "image/png", quality) { - if (!_Tools._IsOffScreenCanvas(canvas) && !canvas.toBlob) { - canvas.toBlob = function(callback, type, quality2) { - setTimeout(() => { - const binStr = atob(this.toDataURL(type, quality2).split(",")[1]), len = binStr.length, arr = new Uint8Array(len); - for (let i = 0; i < len; i++) { - arr[i] = binStr.charCodeAt(i); - } - callback(new Blob([arr])); - }); - }; + static CheckColors4(colors, count) { + if (colors.length === count * 3) { + const colors4 = []; + for (let index = 0; index < colors.length; index += 3) { + const newIndex = index / 3 * 4; + colors4[newIndex] = colors[index]; + colors4[newIndex + 1] = colors[index + 1]; + colors4[newIndex + 2] = colors[index + 2]; + colors4[newIndex + 3] = 1; + } + return colors4; } - if (_Tools._IsOffScreenCanvas(canvas)) { - canvas.convertToBlob({ - type: mimeType, - quality - }).then((blob) => successCallback(blob)); - } else { - canvas.toBlob(function(blob) { - successCallback(blob); - }, mimeType, quality); + return colors; + } +}; +Object.defineProperties(Color4.prototype, { + dimension: { value: [4] }, + rank: { value: 1 } +}); +var TmpColors = class { +}; +TmpColors.Color3 = ArrayTools.BuildArray(3, Color3.Black); +TmpColors.Color4 = ArrayTools.BuildArray(3, () => new Color4(0, 0, 0, 0)); +RegisterClass("BABYLON.Color3", Color3); +RegisterClass("BABYLON.Color4", Color4); + +// node_modules/@babylonjs/core/Misc/decorators.serialization.js +var _copySource = function(creationFunction, source, instanciate, options = {}) { + const destination = creationFunction(); + if (Tags && Tags.HasTags(source)) { + Tags.AddTagsTo(destination, Tags.GetTags(source, true)); + } + const classStore = GetMergedStore(destination); + const textureMap = {}; + for (const property in classStore) { + const propertyDescriptor = classStore[property]; + const sourceProperty = source[property]; + const propertyType = propertyDescriptor.type; + if (sourceProperty !== void 0 && sourceProperty !== null && (property !== "uniqueId" || SerializationHelper.AllowLoadingUniqueId)) { + switch (propertyType) { + case 0: + case 6: + case 11: + destination[property] = sourceProperty; + break; + case 1: + if (options.cloneTexturesOnlyOnce && textureMap[sourceProperty.uniqueId]) { + destination[property] = textureMap[sourceProperty.uniqueId]; + } else { + destination[property] = instanciate || sourceProperty.isRenderTarget ? sourceProperty : sourceProperty.clone(); + textureMap[sourceProperty.uniqueId] = destination[property]; + } + break; + case 2: + case 3: + case 4: + case 5: + case 7: + case 10: + case 12: + destination[property] = instanciate ? sourceProperty : sourceProperty.clone(); + break; + } } } + return destination; +}; +var SerializationHelper = class _SerializationHelper { /** - * Download a Blob object - * @param blob the Blob object - * @param fileName the file name to download + * Appends the serialized animations from the source animations + * @param source Source containing the animations + * @param destination Target to store the animations */ - static DownloadBlob(blob, fileName) { - if ("download" in document.createElement("a")) { - if (!fileName) { - const date = /* @__PURE__ */ new Date(); - const stringDate = (date.getFullYear() + "-" + (date.getMonth() + 1)).slice(2) + "-" + date.getDate() + "_" + date.getHours() + "-" + ("0" + date.getMinutes()).slice(-2); - fileName = "screenshot_" + stringDate + ".png"; - } - _Tools.Download(blob, fileName); - } else { - if (blob && typeof URL !== "undefined") { - const url = URL.createObjectURL(blob); - const newWindow = window.open(""); - if (!newWindow) { - return; - } - const img = newWindow.document.createElement("img"); - img.onload = function() { - URL.revokeObjectURL(url); - }; - img.src = url; - newWindow.document.body.appendChild(img); + static AppendSerializedAnimations(source, destination) { + if (source.animations) { + destination.animations = []; + for (let animationIndex = 0; animationIndex < source.animations.length; animationIndex++) { + const animation = source.animations[animationIndex]; + destination.animations.push(animation.serialize()); } } } /** - * Encodes the canvas data to base 64, or automatically downloads the result if `fileName` is defined. - * @param canvas The canvas to get the data from, which can be an offscreen canvas. - * @param successCallback The callback which is triggered once the data is available. If `fileName` is defined, the callback will be invoked after the download occurs, and the `data` argument will be an empty string. - * @param mimeType The mime type of the result. - * @param fileName The name of the file to download. If defined, the result will automatically be downloaded. If not defined, and `successCallback` is also not defined, the result will automatically be downloaded with an auto-generated file name. - * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + * Static function used to serialized a specific entity + * @param entity defines the entity to serialize + * @param serializationObject defines the optional target object where serialization data will be stored + * @returns a JSON compatible object representing the serialization of the entity */ - static EncodeScreenshotCanvasData(canvas, successCallback, mimeType = "image/png", fileName, quality) { - if (typeof fileName === "string" || !successCallback) { - this.ToBlob(canvas, function(blob) { - if (blob) { - _Tools.DownloadBlob(blob, fileName); - } - if (successCallback) { - successCallback(""); + static Serialize(entity, serializationObject) { + if (!serializationObject) { + serializationObject = {}; + } + if (Tags) { + serializationObject.tags = Tags.GetTags(entity); + } + const serializedProperties = GetMergedStore(entity); + for (const property in serializedProperties) { + const propertyDescriptor = serializedProperties[property]; + const targetPropertyName = propertyDescriptor.sourceName || property; + const propertyType = propertyDescriptor.type; + const sourceProperty = entity[property]; + if (sourceProperty !== void 0 && sourceProperty !== null && (property !== "uniqueId" || _SerializationHelper.AllowLoadingUniqueId)) { + switch (propertyType) { + case 0: + serializationObject[targetPropertyName] = sourceProperty; + break; + case 1: + serializationObject[targetPropertyName] = sourceProperty.serialize(); + break; + case 2: + serializationObject[targetPropertyName] = sourceProperty.asArray(); + break; + case 3: + serializationObject[targetPropertyName] = sourceProperty.serialize(); + break; + case 4: + serializationObject[targetPropertyName] = sourceProperty.asArray(); + break; + case 5: + serializationObject[targetPropertyName] = sourceProperty.asArray(); + break; + case 6: + serializationObject[targetPropertyName] = sourceProperty.id; + break; + case 7: + serializationObject[targetPropertyName] = sourceProperty.serialize(); + break; + case 8: + serializationObject[targetPropertyName] = sourceProperty.asArray(); + break; + case 9: + serializationObject[targetPropertyName] = sourceProperty.serialize(); + break; + case 10: + serializationObject[targetPropertyName] = sourceProperty.asArray(); + break; + case 11: + serializationObject[targetPropertyName] = sourceProperty.id; + break; + case 12: + serializationObject[targetPropertyName] = sourceProperty.asArray(); + break; } - }, mimeType, quality); - } else if (successCallback) { - if (_Tools._IsOffScreenCanvas(canvas)) { - canvas.convertToBlob({ - type: mimeType, - quality - }).then((blob) => { - const reader = new FileReader(); - reader.readAsDataURL(blob); - reader.onloadend = () => { - const base64data = reader.result; - successCallback(base64data); - }; - }); - return; } - const base64Image = canvas.toDataURL(mimeType, quality); - successCallback(base64Image); } + return serializationObject; } /** - * Downloads a blob in the browser - * @param blob defines the blob to download - * @param fileName defines the name of the downloaded file + * Given a source json and a destination object in a scene, this function will parse the source and will try to apply its content to the destination object + * @param source the source json data + * @param destination the destination object + * @param scene the scene where the object is + * @param rootUrl root url to use to load assets */ - static Download(blob, fileName) { - if (typeof URL === "undefined") { - return; + static ParseProperties(source, destination, scene, rootUrl) { + if (!rootUrl) { + rootUrl = ""; } - const url = window.URL.createObjectURL(blob); - const a = document.createElement("a"); - document.body.appendChild(a); - a.style.display = "none"; - a.href = url; - a.download = fileName; - a.addEventListener("click", () => { - if (a.parentElement) { - a.parentElement.removeChild(a); + const classStore = GetMergedStore(destination); + for (const property in classStore) { + const propertyDescriptor = classStore[property]; + const sourceProperty = source[propertyDescriptor.sourceName || property]; + const propertyType = propertyDescriptor.type; + if (sourceProperty !== void 0 && sourceProperty !== null && (property !== "uniqueId" || _SerializationHelper.AllowLoadingUniqueId)) { + const dest = destination; + switch (propertyType) { + case 0: + dest[property] = sourceProperty; + break; + case 1: + if (scene) { + dest[property] = _SerializationHelper._TextureParser(sourceProperty, scene, rootUrl); + } + break; + case 2: + dest[property] = Color3.FromArray(sourceProperty); + break; + case 3: + dest[property] = _SerializationHelper._FresnelParametersParser(sourceProperty); + break; + case 4: + dest[property] = Vector2.FromArray(sourceProperty); + break; + case 5: + dest[property] = Vector3.FromArray(sourceProperty); + break; + case 6: + if (scene) { + dest[property] = scene.getLastMeshById(sourceProperty); + } + break; + case 7: + dest[property] = _SerializationHelper._ColorCurvesParser(sourceProperty); + break; + case 8: + dest[property] = Color4.FromArray(sourceProperty); + break; + case 9: + dest[property] = _SerializationHelper._ImageProcessingConfigurationParser(sourceProperty); + break; + case 10: + dest[property] = Quaternion.FromArray(sourceProperty); + break; + case 11: + if (scene) { + dest[property] = scene.getCameraById(sourceProperty); + } + break; + case 12: + dest[property] = Matrix.FromArray(sourceProperty); + break; + } } - }); - a.click(); - window.URL.revokeObjectURL(url); + } } /** - * Will return the right value of the noPreventDefault variable - * Needed to keep backwards compatibility to the old API. - * - * @param args arguments passed to the attachControl function - * @returns the correct value for noPreventDefault + * Creates a new entity from a serialization data object + * @param creationFunction defines a function used to instanciated the new entity + * @param source defines the source serialization data + * @param scene defines the hosting scene + * @param rootUrl defines the root url for resources + * @returns a new entity */ - static BackCompatCameraNoPreventDefault(args) { - if (typeof args[0] === "boolean") { - return args[0]; - } else if (typeof args[1] === "boolean") { - return args[1]; + static Parse(creationFunction, source, scene, rootUrl = null) { + const destination = creationFunction(); + if (Tags) { + Tags.AddTagsTo(destination, source.tags); } - return false; + _SerializationHelper.ParseProperties(source, destination, scene, rootUrl); + return destination; } /** - * Captures a screenshot of the current rendering - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG - * @param engine defines the rendering engine - * @param camera defines the source camera - * @param size This parameter can be set to a single number or to an object with the - * following (optional) properties: precision, width, height. If a single number is passed, - * it will be used for both width and height. If an object is passed, the screenshot size - * will be derived from the parameters. The precision property is a multiplier allowing - * rendering at a higher or lower resolution - * @param successCallback defines the callback receives a single parameter which contains the - * screenshot as a string of base64-encoded characters. This string can be assigned to the - * src parameter of an to display it - * @param mimeType defines the MIME type of the screenshot image (default: image/png). - * Check your browser for supported MIME types - * @param forceDownload force the system to download the image even if a successCallback is provided - * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + * Clones an object + * @param creationFunction defines the function used to instanciate the new object + * @param source defines the source object + * @param options defines the options to use + * @returns the cloned object */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - static CreateScreenshot(engine, camera, size, successCallback, mimeType = "image/png", forceDownload = false, quality) { - throw _WarnImport("ScreenshotTools"); + static Clone(creationFunction, source, options = {}) { + return _copySource(creationFunction, source, false, options); } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Captures a screenshot of the current rendering - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG - * @param engine defines the rendering engine - * @param camera defines the source camera - * @param size This parameter can be set to a single number or to an object with the - * following (optional) properties: precision, width, height. If a single number is passed, - * it will be used for both width and height. If an object is passed, the screenshot size - * will be derived from the parameters. The precision property is a multiplier allowing - * rendering at a higher or lower resolution - * @param mimeType defines the MIME type of the screenshot image (default: image/png). - * Check your browser for supported MIME types - * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. - * @returns screenshot as a string of base64-encoded characters. This string can be assigned - * to the src parameter of an to display it + * Instanciates a new object based on a source one (some data will be shared between both object) + * @param creationFunction defines the function used to instanciate the new object + * @param source defines the source object + * @returns the new object */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - static CreateScreenshotAsync(engine, camera, size, mimeType = "image/png", quality) { - throw _WarnImport("ScreenshotTools"); + static Instanciate(creationFunction, source) { + return _copySource(creationFunction, source, true); } +}; +SerializationHelper.AllowLoadingUniqueId = false; +SerializationHelper._ImageProcessingConfigurationParser = (sourceProperty) => { + throw _WarnImport("ImageProcessingConfiguration"); +}; +SerializationHelper._FresnelParametersParser = (sourceProperty) => { + throw _WarnImport("FresnelParameters"); +}; +SerializationHelper._ColorCurvesParser = (sourceProperty) => { + throw _WarnImport("ColorCurves"); +}; +SerializationHelper._TextureParser = (sourceProperty, scene, rootUrl) => { + throw _WarnImport("Texture"); +}; + +// node_modules/@babylonjs/core/Maths/math.size.js +var Size = class _Size { /** - * Generates an image screenshot from the specified camera. - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG - * @param engine The engine to use for rendering - * @param camera The camera to use for rendering - * @param size This parameter can be set to a single number or to an object with the - * following (optional) properties: precision, width, height. If a single number is passed, - * it will be used for both width and height. If an object is passed, the screenshot size - * will be derived from the parameters. The precision property is a multiplier allowing - * rendering at a higher or lower resolution - * @param successCallback The callback receives a single parameter which contains the - * screenshot as a string of base64-encoded characters. This string can be assigned to the - * src parameter of an to display it - * @param mimeType The MIME type of the screenshot image (default: image/png). - * Check your browser for supported MIME types - * @param samples Texture samples (default: 1) - * @param antialiasing Whether antialiasing should be turned on or not (default: false) - * @param fileName A name for for the downloaded file. - * @param renderSprites Whether the sprites should be rendered or not (default: false) - * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false) - * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true) - * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + * Creates a Size object from the given width and height (floats). + * @param width width of the new size + * @param height height of the new size */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - static CreateScreenshotUsingRenderTarget(engine, camera, size, successCallback, mimeType = "image/png", samples = 1, antialiasing = false, fileName, renderSprites = false, enableStencilBuffer = false, useLayerMask = true, quality) { - throw _WarnImport("ScreenshotTools"); + constructor(width, height) { + this.width = width; + this.height = height; } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Generates an image screenshot from the specified camera. - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG - * @param engine The engine to use for rendering - * @param camera The camera to use for rendering - * @param size This parameter can be set to a single number or to an object with the - * following (optional) properties: precision, width, height. If a single number is passed, - * it will be used for both width and height. If an object is passed, the screenshot size - * will be derived from the parameters. The precision property is a multiplier allowing - * rendering at a higher or lower resolution - * @param mimeType The MIME type of the screenshot image (default: image/png). - * Check your browser for supported MIME types - * @param samples Texture samples (default: 1) - * @param antialiasing Whether antialiasing should be turned on or not (default: false) - * @param fileName A name for for the downloaded file. - * @returns screenshot as a string of base64-encoded characters. This string can be assigned - * @param renderSprites Whether the sprites should be rendered or not (default: false) - * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false) - * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true) - * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. - * to the src parameter of an to display it + * Returns a string with the Size width and height + * @returns a string with the Size width and height */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - static CreateScreenshotUsingRenderTargetAsync(engine, camera, size, mimeType = "image/png", samples = 1, antialiasing = false, fileName, renderSprites = false, enableStencilBuffer = false, useLayerMask = true, quality) { - throw _WarnImport("ScreenshotTools"); + toString() { + return `{W: ${this.width}, H: ${this.height}}`; } /** - * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523 - * Be aware Math.random() could cause collisions, but: - * "All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide" - * @returns a pseudo random id + * "Size" + * @returns the string "Size" */ - static RandomId() { - return RandomGUID(); + getClassName() { + return "Size"; } /** - * Test if the given uri is a base64 string - * @deprecated Please use FileTools.IsBase64DataUrl instead. - * @param uri The uri to test - * @returns True if the uri is a base64 string or false otherwise + * Returns the Size hash code. + * @returns a hash code for a unique width and height */ - static IsBase64(uri) { - return IsBase64DataUrl(uri); + getHashCode() { + let hash = this.width | 0; + hash = hash * 397 ^ (this.height | 0); + return hash; } /** - * Decode the given base64 uri. - * @deprecated Please use FileTools.DecodeBase64UrlToBinary instead. - * @param uri The uri to decode - * @returns The decoded base64 data. + * Updates the current size from the given one. + * @param src the given size */ - static DecodeBase64(uri) { - return DecodeBase64UrlToBinary(uri); + copyFrom(src) { + this.width = src.width; + this.height = src.height; } /** - * Gets a value indicating the number of loading errors - * @ignorenaming + * Updates in place the current Size from the given floats. + * @param width width of the new size + * @param height height of the new size + * @returns the updated Size. */ - // eslint-disable-next-line @typescript-eslint/naming-convention - static get errorsCount() { - return Logger.errorsCount; + copyFromFloats(width, height) { + this.width = width; + this.height = height; + return this; } /** - * Log a message to the console - * @param message defines the message to log + * Updates in place the current Size from the given floats. + * @param width width to set + * @param height height to set + * @returns the updated Size. */ - static Log(message) { - Logger.Log(message); + set(width, height) { + return this.copyFromFloats(width, height); } /** - * Write a warning message to the console - * @param message defines the message to log + * Multiplies the width and height by numbers + * @param w factor to multiple the width by + * @param h factor to multiple the height by + * @returns a new Size set with the multiplication result of the current Size and the given floats. */ - static Warn(message) { - Logger.Warn(message); + multiplyByFloats(w, h) { + return new _Size(this.width * w, this.height * h); } /** - * Write an error message to the console - * @param message defines the message to log + * Clones the size + * @returns a new Size copied from the given one. */ - static Error(message) { - Logger.Error(message); + clone() { + return new _Size(this.width, this.height); } /** - * Gets current log cache (list of logs) + * True if the current Size and the given one width and height are strictly equal. + * @param other the other size to compare against + * @returns True if the current Size and the given one width and height are strictly equal. */ - static get LogCache() { - return Logger.LogCache; + equals(other) { + if (!other) { + return false; + } + return this.width === other.width && this.height === other.height; } /** - * Clears the log cache + * The surface of the Size : width * height (float). */ - static ClearLogCache() { - Logger.ClearLogCache(); + get surface() { + return this.width * this.height; } /** - * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel) + * Create a new size of zero + * @returns a new Size set to (0.0, 0.0) */ - static set LogLevels(level) { - Logger.LogLevels = level; + static Zero() { + return new _Size(0, 0); } /** - * Sets the current performance log level + * Sums the width and height of two sizes + * @param otherSize size to add to this size + * @returns a new Size set as the addition result of the current Size and the given one. */ - static set PerformanceLogLevel(level) { - if ((level & _Tools.PerformanceUserMarkLogLevel) === _Tools.PerformanceUserMarkLogLevel) { - _Tools.StartPerformanceCounter = _Tools._StartUserMark; - _Tools.EndPerformanceCounter = _Tools._EndUserMark; - return; - } - if ((level & _Tools.PerformanceConsoleLogLevel) === _Tools.PerformanceConsoleLogLevel) { - _Tools.StartPerformanceCounter = _Tools._StartPerformanceConsole; - _Tools.EndPerformanceCounter = _Tools._EndPerformanceConsole; - return; - } - _Tools.StartPerformanceCounter = _Tools._StartPerformanceCounterDisabled; - _Tools.EndPerformanceCounter = _Tools._EndPerformanceCounterDisabled; + add(otherSize) { + const r = new _Size(this.width + otherSize.width, this.height + otherSize.height); + return r; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - static _StartPerformanceCounterDisabled(counterName, condition) { + /** + * Subtracts the width and height of two + * @param otherSize size to subtract to this size + * @returns a new Size set as the subtraction result of the given one from the current Size. + */ + subtract(otherSize) { + const r = new _Size(this.width - otherSize.width, this.height - otherSize.height); + return r; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - static _EndPerformanceCounterDisabled(counterName, condition) { + /** + * Scales the width and height + * @param scale the scale to multiply the width and height by + * @returns a new Size set with the multiplication result of the current Size and the given floats. + */ + scale(scale) { + return new _Size(this.width * scale, this.height * scale); } - static _StartUserMark(counterName, condition = true) { - if (!_Tools._Performance) { - if (!IsWindowObjectExist()) { - return; - } - _Tools._Performance = window.performance; + /** + * Creates a new Size set at the linear interpolation "amount" between "start" and "end" + * @param start starting size to lerp between + * @param end end size to lerp between + * @param amount amount to lerp between the start and end values + * @returns a new Size set at the linear interpolation "amount" between "start" and "end" + */ + static Lerp(start, end, amount) { + const w = start.width + (end.width - start.width) * amount; + const h = start.height + (end.height - start.height) * amount; + return new _Size(w, h); + } +}; + +// node_modules/@babylonjs/core/Materials/Textures/thinTexture.js +var ThinTexture = class _ThinTexture { + /** + * | Value | Type | Description | + * | ----- | ------------------ | ----------- | + * | 0 | CLAMP_ADDRESSMODE | | + * | 1 | WRAP_ADDRESSMODE | | + * | 2 | MIRROR_ADDRESSMODE | | + */ + get wrapU() { + return this._wrapU; + } + set wrapU(value) { + this._wrapU = value; + } + /** + * | Value | Type | Description | + * | ----- | ------------------ | ----------- | + * | 0 | CLAMP_ADDRESSMODE | | + * | 1 | WRAP_ADDRESSMODE | | + * | 2 | MIRROR_ADDRESSMODE | | + */ + get wrapV() { + return this._wrapV; + } + set wrapV(value) { + this._wrapV = value; + } + /** + * How a texture is mapped. + * Unused in thin texture mode. + */ + get coordinatesMode() { + return 0; + } + /** + * Define if the texture is a cube texture or if false a 2d texture. + */ + get isCube() { + if (!this._texture) { + return false; } - if (!condition || !_Tools._Performance.mark) { + return this._texture.isCube; + } + // eslint-disable-next-line @typescript-eslint/naming-convention + set isCube(value) { + if (!this._texture) { return; } - _Tools._Performance.mark(counterName + "-Begin"); + this._texture.isCube = value; } - static _EndUserMark(counterName, condition = true) { - if (!condition || !_Tools._Performance.mark) { - return; + /** + * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture. + */ + get is3D() { + if (!this._texture) { + return false; } - _Tools._Performance.mark(counterName + "-End"); - _Tools._Performance.measure(counterName, counterName + "-Begin", counterName + "-End"); + return this._texture.is3D; } - static _StartPerformanceConsole(counterName, condition = true) { - if (!condition) { + // eslint-disable-next-line @typescript-eslint/naming-convention + set is3D(value) { + if (!this._texture) { return; } - _Tools._StartUserMark(counterName, condition); - if (console.time) { - console.time(counterName); + this._texture.is3D = value; + } + /** + * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture. + */ + get is2DArray() { + if (!this._texture) { + return false; } + return this._texture.is2DArray; } - static _EndPerformanceConsole(counterName, condition = true) { - if (!condition) { + // eslint-disable-next-line @typescript-eslint/naming-convention + set is2DArray(value) { + if (!this._texture) { return; } - _Tools._EndUserMark(counterName, condition); - console.timeEnd(counterName); + this._texture.is2DArray = value; } /** - * Gets either window.performance.now() if supported or Date.now() else + * Get the class name of the texture. + * @returns "ThinTexture" */ - static get Now() { - return PrecisionDate.Now; + getClassName() { + return "ThinTexture"; + } + static _IsRenderTargetWrapper(texture) { + return (texture == null ? void 0 : texture._shareDepth) !== void 0; } /** - * This method will return the name of the class used to create the instance of the given object. - * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator. - * @param object the object to get the class name from - * @param isType defines if the object is actually a type - * @returns the name of the class, will be "object" for a custom data type not using the @className decorator + * Instantiates a new ThinTexture. + * Base class of all the textures in babylon. + * This can be used as an internal texture wrapper in ThinEngine to benefit from the cache + * @param internalTexture Define the internalTexture to wrap. You can also pass a RenderTargetWrapper, in which case the texture will be the render target's texture */ - static GetClassName(object, isType = false) { - let name69 = null; - if (!isType && object.getClassName) { - name69 = object.getClassName(); - } else { - if (object instanceof Object) { - const classObj = isType ? object : Object.getPrototypeOf(object); - name69 = classObj.constructor["__bjsclassName__"]; - } - if (!name69) { - name69 = typeof object; - } + constructor(internalTexture) { + this._wrapU = 1; + this._wrapV = 1; + this.wrapR = 1; + this.anisotropicFilteringLevel = 4; + this.delayLoadState = 0; + this._texture = null; + this._engine = null; + this._cachedSize = Size.Zero(); + this._cachedBaseSize = Size.Zero(); + this._initialSamplingMode = 2; + this._texture = _ThinTexture._IsRenderTargetWrapper(internalTexture) ? internalTexture.texture : internalTexture; + if (this._texture) { + this._engine = this._texture.getEngine(); } - return name69; } /** - * Gets the first element of an array satisfying a given predicate - * @param array defines the array to browse - * @param predicate defines the predicate to use - * @returns null if not found or the element + * Get if the texture is ready to be used (downloaded, converted, mip mapped...). + * @returns true if fully ready */ - static First(array, predicate) { - for (const el of array) { - if (predicate(el)) { - return el; - } + isReady() { + if (this.delayLoadState === 4) { + this.delayLoad(); + return false; } - return null; + if (this._texture) { + return this._texture.isReady; + } + return false; } /** - * This method will return the name of the full name of the class, including its owning module (if any). - * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator or implementing a method getClassName():string (in which case the module won't be specified). - * @param object the object to get the class name from - * @param isType defines if the object is actually a type - * @returns a string that can have two forms: "moduleName.className" if module was specified when the class' Name was registered or "className" if there was not module specified. - * @ignorenaming + * Triggers the load sequence in delayed load mode. */ - // eslint-disable-next-line @typescript-eslint/naming-convention - static getFullClassName(object, isType = false) { - let className2 = null; - let moduleName = null; - if (!isType && object.getClassName) { - className2 = object.getClassName(); - } else { - if (object instanceof Object) { - const classObj = isType ? object : Object.getPrototypeOf(object); - className2 = classObj.constructor["__bjsclassName__"]; - moduleName = classObj.constructor["__bjsmoduleName__"]; + delayLoad() { + } + /** + * Get the underlying lower level texture from Babylon. + * @returns the internal texture + */ + getInternalTexture() { + return this._texture; + } + /** + * Get the size of the texture. + * @returns the texture size. + */ + getSize() { + if (this._texture) { + if (this._texture.width) { + this._cachedSize.width = this._texture.width; + this._cachedSize.height = this._texture.height; + return this._cachedSize; } - if (!className2) { - className2 = typeof object; + if (this._texture._size) { + this._cachedSize.width = this._texture._size; + this._cachedSize.height = this._texture._size; + return this._cachedSize; } } - if (!className2) { - return null; - } - return (moduleName != null ? moduleName + "." : "") + className2; + return this._cachedSize; } /** - * Returns a promise that resolves after the given amount of time. - * @param delay Number of milliseconds to delay - * @returns Promise that resolves after the given amount of time + * Get the base size of the texture. + * It can be different from the size if the texture has been resized for POT for instance + * @returns the base size */ - static DelayAsync(delay) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, delay); - }); + getBaseSize() { + if (!this.isReady() || !this._texture) { + this._cachedBaseSize.width = 0; + this._cachedBaseSize.height = 0; + return this._cachedBaseSize; + } + if (this._texture._size) { + this._cachedBaseSize.width = this._texture._size; + this._cachedBaseSize.height = this._texture._size; + return this._cachedBaseSize; + } + this._cachedBaseSize.width = this._texture.baseWidth; + this._cachedBaseSize.height = this._texture.baseHeight; + return this._cachedBaseSize; } /** - * Utility function to detect if the current user agent is Safari - * @returns whether or not the current user agent is safari + * Get the current sampling mode associated with the texture. */ - static IsSafari() { - if (!IsNavigatorAvailable()) { - return false; - } - return /^((?!chrome|android).)*safari/i.test(navigator.userAgent); - } -}; -Tools.UseCustomRequestHeaders = false; -Tools.CustomRequestHeaders = WebRequest.CustomRequestHeaders; -Tools.GetDOMTextContent = GetDOMTextContent; -Tools._DefaultCdnUrl = "https://cdn.babylonjs.com"; -Tools.GetAbsoluteUrl = typeof document === "object" ? (url) => { - const a = document.createElement("a"); - a.href = url; - return a.href; -} : typeof URL === "function" && typeof location === "object" ? (url) => new URL(url, location.origin).href : () => { - throw new Error("Unable to get absolute URL. Override BABYLON.Tools.GetAbsoluteUrl to a custom implementation for the current context."); -}; -Tools.NoneLogLevel = Logger.NoneLogLevel; -Tools.MessageLogLevel = Logger.MessageLogLevel; -Tools.WarningLogLevel = Logger.WarningLogLevel; -Tools.ErrorLogLevel = Logger.ErrorLogLevel; -Tools.AllLogLevel = Logger.AllLogLevel; -Tools.IsWindowObjectExist = IsWindowObjectExist; -Tools.PerformanceNoneLogLevel = 0; -Tools.PerformanceUserMarkLogLevel = 1; -Tools.PerformanceConsoleLogLevel = 2; -Tools.StartPerformanceCounter = Tools._StartPerformanceCounterDisabled; -Tools.EndPerformanceCounter = Tools._EndPerformanceCounterDisabled; -function className(name69, module) { - return (target) => { - target["__bjsclassName__"] = name69; - target["__bjsmoduleName__"] = module != null ? module : null; - }; -} -var AsyncLoop = class _AsyncLoop { - /** - * Constructor. - * @param iterations the number of iterations. - * @param func the function to run each iteration - * @param successCallback the callback that will be called upon successful execution - * @param offset starting offset. - */ - constructor(iterations, func, successCallback, offset = 0) { - this.iterations = iterations; - this.index = offset - 1; - this._done = false; - this._fn = func; - this._successCallback = successCallback; - } - /** - * Execute the next iteration. Must be called after the last iteration was finished. - */ - executeNext() { - if (!this._done) { - if (this.index + 1 < this.iterations) { - ++this.index; - this._fn(this); - } else { - this.breakLoop(); - } + get samplingMode() { + if (!this._texture) { + return this._initialSamplingMode; } + return this._texture.samplingMode; } /** - * Break the loop and run the success callback. + * Update the sampling mode of the texture. + * Default is Trilinear mode. + * + * | Value | Type | Description | + * | ----- | ------------------ | ----------- | + * | 1 | NEAREST_SAMPLINGMODE or NEAREST_NEAREST_MIPLINEAR | Nearest is: mag = nearest, min = nearest, mip = linear | + * | 2 | BILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPNEAREST | Bilinear is: mag = linear, min = linear, mip = nearest | + * | 3 | TRILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPLINEAR | Trilinear is: mag = linear, min = linear, mip = linear | + * | 4 | NEAREST_NEAREST_MIPNEAREST | | + * | 5 | NEAREST_LINEAR_MIPNEAREST | | + * | 6 | NEAREST_LINEAR_MIPLINEAR | | + * | 7 | NEAREST_LINEAR | | + * | 8 | NEAREST_NEAREST | | + * | 9 | LINEAR_NEAREST_MIPNEAREST | | + * | 10 | LINEAR_NEAREST_MIPLINEAR | | + * | 11 | LINEAR_LINEAR | | + * | 12 | LINEAR_NEAREST | | + * + * > _mag_: magnification filter (close to the viewer) + * > _min_: minification filter (far from the viewer) + * > _mip_: filter used between mip map levels + *@param samplingMode Define the new sampling mode of the texture */ - breakLoop() { - this._done = true; - this._successCallback(); + updateSamplingMode(samplingMode) { + if (this._texture && this._engine) { + this._engine.updateTextureSamplingMode(samplingMode, this._texture); + } } /** - * Create and run an async loop. - * @param iterations the number of iterations. - * @param fn the function to run each iteration - * @param successCallback the callback that will be called upon successful execution - * @param offset starting offset. - * @returns the created async loop object + * Release and destroy the underlying lower level texture aka internalTexture. */ - static Run(iterations, fn, successCallback, offset = 0) { - const loop = new _AsyncLoop(iterations, fn, successCallback, offset); - loop.executeNext(); - return loop; + releaseInternalTexture() { + if (this._texture) { + this._texture.dispose(); + this._texture = null; + } } /** - * A for-loop that will run a given number of iterations synchronous and the rest async. - * @param iterations total number of iterations - * @param syncedIterations number of synchronous iterations in each async iteration. - * @param fn the function to call each iteration. - * @param callback a success call back that will be called when iterating stops. - * @param breakFunction a break condition (optional) - * @param timeout timeout settings for the setTimeout function. default - 0. - * @returns the created async loop object + * Dispose the texture and release its associated resources. */ - static SyncAsyncForLoop(iterations, syncedIterations, fn, callback, breakFunction, timeout = 0) { - return _AsyncLoop.Run(Math.ceil(iterations / syncedIterations), (loop) => { - if (breakFunction && breakFunction()) { - loop.breakLoop(); - } else { - setTimeout(() => { - for (let i = 0; i < syncedIterations; ++i) { - const iteration = loop.index * syncedIterations + i; - if (iteration >= iterations) { - break; - } - fn(iteration); - if (breakFunction && breakFunction()) { - loop.breakLoop(); - break; - } - } - loop.executeNext(); - }, timeout); - } - }, callback); + dispose() { + if (this._texture) { + this.releaseInternalTexture(); + this._engine = null; + } } }; -Tools.Mix = Mix; -Tools.IsExponentOfTwo = IsExponentOfTwo; -EngineStore.FallbackTexture = "data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QBmRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAAExAAIAAAAQAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQubmV0IDQuMC41AP/bAEMABAIDAwMCBAMDAwQEBAQFCQYFBQUFCwgIBgkNCw0NDQsMDA4QFBEODxMPDAwSGBITFRYXFxcOERkbGRYaFBYXFv/bAEMBBAQEBQUFCgYGChYPDA8WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFv/AABEIAQABAAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APH6KKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76CiiigD5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BQooooA+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/voKKKKAPl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76CiiigD5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BQooooA+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/voKKKKAPl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76P//Z"; -// node_modules/@babylonjs/core/Misc/smartArray.js -var SmartArray = class _SmartArray { +// node_modules/@babylonjs/core/tslib.es6.js +function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") + r = Reflect.decorate(decorators, target, key, desc); + else + for (var i = decorators.length - 1; i >= 0; i--) + if (d = decorators[i]) + r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +// node_modules/@babylonjs/core/Materials/Textures/baseTexture.js +var BaseTexture = class _BaseTexture extends ThinTexture { /** - * Instantiates a Smart Array. - * @param capacity defines the default capacity of the array. + * Define if the texture is having a usable alpha value (can be use for transparency or glossiness for instance). */ - constructor(capacity) { - this.length = 0; - this.data = new Array(capacity); - this._id = _SmartArray._GlobalId++; + set hasAlpha(value) { + if (this._hasAlpha === value) { + return; + } + this._hasAlpha = value; + if (this._scene) { + this._scene.markAllMaterialsAsDirty(1, (mat) => { + return mat.hasTexture(this); + }); + } + } + get hasAlpha() { + return this._hasAlpha; } /** - * Pushes a value at the end of the active data. - * @param value defines the object to push in the array. + * Defines if the alpha value should be determined via the rgb values. + * If true the luminance of the pixel might be used to find the corresponding alpha value. */ - push(value) { - this.data[this.length++] = value; - if (this.length > this.data.length) { - this.data.length *= 2; + set getAlphaFromRGB(value) { + if (this._getAlphaFromRGB === value) { + return; } + this._getAlphaFromRGB = value; + if (this._scene) { + this._scene.markAllMaterialsAsDirty(1, (mat) => { + return mat.hasTexture(this); + }); + } + } + get getAlphaFromRGB() { + return this._getAlphaFromRGB; } /** - * Iterates over the active data and apply the lambda to them. - * @param func defines the action to apply on each value. + * Define the UV channel to use starting from 0 and defaulting to 0. + * This is part of the texture as textures usually maps to one uv set. */ - forEach(func) { - for (let index = 0; index < this.length; index++) { - func(this.data[index]); + set coordinatesIndex(value) { + if (this._coordinatesIndex === value) { + return; + } + this._coordinatesIndex = value; + if (this._scene) { + this._scene.markAllMaterialsAsDirty(1, (mat) => { + return mat.hasTexture(this); + }); } } + get coordinatesIndex() { + return this._coordinatesIndex; + } /** - * Sorts the full sets of data. - * @param compareFn defines the comparison function to apply. + * How a texture is mapped. + * + * | Value | Type | Description | + * | ----- | ----------------------------------- | ----------- | + * | 0 | EXPLICIT_MODE | | + * | 1 | SPHERICAL_MODE | | + * | 2 | PLANAR_MODE | | + * | 3 | CUBIC_MODE | | + * | 4 | PROJECTION_MODE | | + * | 5 | SKYBOX_MODE | | + * | 6 | INVCUBIC_MODE | | + * | 7 | EQUIRECTANGULAR_MODE | | + * | 8 | FIXED_EQUIRECTANGULAR_MODE | | + * | 9 | FIXED_EQUIRECTANGULAR_MIRRORED_MODE | | */ - sort(compareFn) { - this.data.sort(compareFn); + set coordinatesMode(value) { + if (this._coordinatesMode === value) { + return; + } + this._coordinatesMode = value; + if (this._scene) { + this._scene.markAllMaterialsAsDirty(1, (mat) => { + return mat.hasTexture(this); + }); + } + } + get coordinatesMode() { + return this._coordinatesMode; } /** - * Resets the active data to an empty array. + * | Value | Type | Description | + * | ----- | ------------------ | ----------- | + * | 0 | CLAMP_ADDRESSMODE | | + * | 1 | WRAP_ADDRESSMODE | | + * | 2 | MIRROR_ADDRESSMODE | | */ - reset() { - this.length = 0; + get wrapU() { + return this._wrapU; + } + set wrapU(value) { + this._wrapU = value; } /** - * Releases all the data from the array as well as the array. + * | Value | Type | Description | + * | ----- | ------------------ | ----------- | + * | 0 | CLAMP_ADDRESSMODE | | + * | 1 | WRAP_ADDRESSMODE | | + * | 2 | MIRROR_ADDRESSMODE | | */ - dispose() { - this.reset(); - if (this.data) { - this.data.length = 0; - } + get wrapV() { + return this._wrapV; + } + set wrapV(value) { + this._wrapV = value; } /** - * Concats the active data with a given array. - * @param array defines the data to concatenate with. + * Define if the texture is a cube texture or if false a 2d texture. */ - concat(array) { - if (array.length === 0) { - return; - } - if (this.length + array.length > this.data.length) { - this.data.length = (this.length + array.length) * 2; + get isCube() { + if (!this._texture) { + return this._isCube; } - for (let index = 0; index < array.length; index++) { - this.data[this.length++] = (array.data || array)[index]; + return this._texture.isCube; + } + // eslint-disable-next-line @typescript-eslint/naming-convention + set isCube(value) { + if (!this._texture) { + this._isCube = value; + } else { + this._texture.isCube = value; } } /** - * Returns the position of a value in the active data. - * @param value defines the value to find the index for - * @returns the index if found in the active data otherwise -1 + * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture. */ - indexOf(value) { - const position = this.data.indexOf(value); - if (position >= this.length) { - return -1; + get is3D() { + if (!this._texture) { + return false; } - return position; + return this._texture.is3D; + } + // eslint-disable-next-line @typescript-eslint/naming-convention + set is3D(value) { + if (!this._texture) { + return; + } + this._texture.is3D = value; } /** - * Returns whether an element is part of the active data. - * @param value defines the value to look for - * @returns true if found in the active data otherwise false + * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture. */ - contains(value) { - return this.indexOf(value) !== -1; + get is2DArray() { + if (!this._texture) { + return false; + } + return this._texture.is2DArray; } -}; -SmartArray._GlobalId = 0; -var SmartArrayNoDuplicate = class extends SmartArray { - constructor() { - super(...arguments); - this._duplicateId = 0; + // eslint-disable-next-line @typescript-eslint/naming-convention + set is2DArray(value) { + if (!this._texture) { + return; + } + this._texture.is2DArray = value; } /** - * Pushes a value at the end of the active data. - * THIS DOES NOT PREVENT DUPPLICATE DATA - * @param value defines the object to push in the array. + * Define if the texture contains data in gamma space (most of the png/jpg aside bump). + * HDR texture are usually stored in linear space. + * This only impacts the PBR and Background materials */ - push(value) { - super.push(value); - if (!value.__smartArrayFlags) { - value.__smartArrayFlags = {}; + get gammaSpace() { + if (!this._texture) { + return this._gammaSpace; + } else { + if (this._texture._gammaSpace === null) { + this._texture._gammaSpace = this._gammaSpace; + } } - value.__smartArrayFlags[this._id] = this._duplicateId; + return this._texture._gammaSpace && !this._texture._useSRGBBuffer; } - /** - * Pushes a value at the end of the active data. - * If the data is already present, it won t be added again - * @param value defines the object to push in the array. - * @returns true if added false if it was already present - */ - pushNoDuplicate(value) { - if (value.__smartArrayFlags && value.__smartArrayFlags[this._id] === this._duplicateId) { - return false; + set gammaSpace(gamma) { + var _a; + if (!this._texture) { + if (this._gammaSpace === gamma) { + return; + } + this._gammaSpace = gamma; + } else { + if (this._texture._gammaSpace === gamma) { + return; + } + this._texture._gammaSpace = gamma; } - this.push(value); - return true; + (_a = this.getScene()) == null ? void 0 : _a.markAllMaterialsAsDirty(1, (mat) => { + return mat.hasTexture(this); + }); } /** - * Resets the active data to an empty array. + * Gets or sets whether or not the texture contains RGBD data. */ - reset() { - super.reset(); - this._duplicateId++; + get isRGBD() { + return this._texture != null && this._texture._isRGBD; } - /** - * Concats the active data with a given array. - * This ensures no duplicate will be present in the result. - * @param array defines the data to concatenate with. - */ - concatWithNoDuplicate(array) { - if (array.length === 0) { + set isRGBD(value) { + var _a; + if (value === this.isRGBD) { return; } - if (this.length + array.length > this.data.length) { - this.data.length = (this.length + array.length) * 2; - } - for (let index = 0; index < array.length; index++) { - const item = (array.data || array)[index]; - this.pushNoDuplicate(item); + if (this._texture) { + this._texture._isRGBD = value; } - } -}; - -// node_modules/@babylonjs/core/Misc/stringDictionary.js -var StringDictionary = class { - constructor() { - this._count = 0; - this._data = {}; + (_a = this.getScene()) == null ? void 0 : _a.markAllMaterialsAsDirty(1, (mat) => { + return mat.hasTexture(this); + }); } /** - * This will clear this dictionary and copy the content from the 'source' one. - * If the T value is a custom object, it won't be copied/cloned, the same object will be used - * @param source the dictionary to take the content from and copy to this dictionary + * Are mip maps generated for this texture or not. */ - copyFrom(source) { - this.clear(); - source.forEach((t, v) => this.add(t, v)); + get noMipmap() { + return false; } /** - * Get a value based from its key - * @param key the given key to get the matching value from - * @returns the value if found, otherwise undefined is returned + * With prefiltered texture, defined the offset used during the prefiltering steps. */ - get(key) { - const val = this._data[key]; - if (val !== void 0) { - return val; + get lodGenerationOffset() { + if (this._texture) { + return this._texture._lodGenerationOffset; + } + return 0; + } + set lodGenerationOffset(value) { + if (this._texture) { + this._texture._lodGenerationOffset = value; } - return void 0; } /** - * Get a value from its key or add it if it doesn't exist. - * This method will ensure you that a given key/data will be present in the dictionary. - * @param key the given key to get the matching value from - * @param factory the factory that will create the value if the key is not present in the dictionary. - * The factory will only be invoked if there's no data for the given key. - * @returns the value corresponding to the key. + * With prefiltered texture, defined the scale used during the prefiltering steps. */ - getOrAddWithFactory(key, factory) { - let val = this.get(key); - if (val !== void 0) { - return val; + get lodGenerationScale() { + if (this._texture) { + return this._texture._lodGenerationScale; } - val = factory(key); - if (val) { - this.add(key, val); + return 0; + } + set lodGenerationScale(value) { + if (this._texture) { + this._texture._lodGenerationScale = value; } - return val; } /** - * Get a value from its key if present in the dictionary otherwise add it - * @param key the key to get the value from - * @param val if there's no such key/value pair in the dictionary add it with this value - * @returns the value corresponding to the key + * With prefiltered texture, defined if the specular generation is based on a linear ramp. + * By default we are using a log2 of the linear roughness helping to keep a better resolution for + * average roughness values. */ - getOrAdd(key, val) { - const curVal = this.get(key); - if (curVal !== void 0) { - return curVal; + get linearSpecularLOD() { + if (this._texture) { + return this._texture._linearSpecularLOD; } - this.add(key, val); - return val; + return false; } - /** - * Check if there's a given key in the dictionary - * @param key the key to check for - * @returns true if the key is present, false otherwise - */ - contains(key) { - return this._data[key] !== void 0; + set linearSpecularLOD(value) { + if (this._texture) { + this._texture._linearSpecularLOD = value; + } } /** - * Add a new key and its corresponding value - * @param key the key to add - * @param value the value corresponding to the key - * @returns true if the operation completed successfully, false if we couldn't insert the key/value because there was already this key in the dictionary + * In case a better definition than spherical harmonics is required for the diffuse part of the environment. + * You can set the irradiance texture to rely on a texture instead of the spherical approach. + * This texture need to have the same characteristics than its parent (Cube vs 2d, coordinates mode, Gamma/Linear, RGBD). */ - add(key, value) { - if (this._data[key] !== void 0) { - return false; - } - this._data[key] = value; - ++this._count; - return true; - } - /** - * Update a specific value associated to a key - * @param key defines the key to use - * @param value defines the value to store - * @returns true if the value was updated (or false if the key was not found) - */ - set(key, value) { - if (this._data[key] === void 0) { - return false; + get irradianceTexture() { + if (this._texture) { + return this._texture._irradianceTexture; } - this._data[key] = value; - return true; + return null; } - /** - * Get the element of the given key and remove it from the dictionary - * @param key defines the key to search - * @returns the value associated with the key or null if not found - */ - getAndRemove(key) { - const val = this.get(key); - if (val !== void 0) { - delete this._data[key]; - --this._count; - return val; + set irradianceTexture(value) { + if (this._texture) { + this._texture._irradianceTexture = value; } - return null; } /** - * Remove a key/value from the dictionary. - * @param key the key to remove - * @returns true if the item was successfully deleted, false if no item with such key exist in the dictionary + * Define the unique id of the texture in the scene. */ - remove(key) { - if (this.contains(key)) { - delete this._data[key]; - --this._count; - return true; + get uid() { + if (!this._uid) { + this._uid = RandomGUID(); } - return false; + return this._uid; } /** - * Clear the whole content of the dictionary + * Return a string representation of the texture. + * @returns the texture as a string */ - clear() { - this._data = {}; - this._count = 0; + toString() { + return this.name; } /** - * Gets the current count + * Get the class name of the texture. + * @returns "BaseTexture" */ - get count() { - return this._count; + getClassName() { + return "BaseTexture"; } /** - * Execute a callback on each key/val of the dictionary. - * Note that you can remove any element in this dictionary in the callback implementation - * @param callback the callback to execute on a given key/value pair + * Callback triggered when the texture has been disposed. + * Kept for back compatibility, you can use the onDisposeObservable instead. */ - forEach(callback) { - for (const cur in this._data) { - const val = this._data[cur]; - callback(cur, val); + set onDispose(callback) { + if (this._onDisposeObserver) { + this.onDisposeObservable.remove(this._onDisposeObserver); } + this._onDisposeObserver = this.onDisposeObservable.add(callback); } /** - * Execute a callback on every occurrence of the dictionary until it returns a valid TRes object. - * If the callback returns null or undefined the method will iterate to the next key/value pair - * Note that you can remove any element in this dictionary in the callback implementation - * @param callback the callback to execute, if it return a valid T instanced object the enumeration will stop and the object will be returned - * @returns the first item + * Define if the texture is preventing a material to render or not. + * If not and the texture is not ready, the engine will use a default black texture instead. */ - first(callback) { - for (const cur in this._data) { - const val = this._data[cur]; - const res = callback(cur, val); - if (res) { - return res; - } - } - return null; - } -}; - -// node_modules/@babylonjs/core/Materials/colorCurves.functions.js -function PrepareUniformsForColorCurves(uniformsList) { - uniformsList.push("vCameraColorCurveNeutral", "vCameraColorCurvePositive", "vCameraColorCurveNegative"); -} - -// node_modules/@babylonjs/core/Materials/colorCurves.js -var ColorCurves = class _ColorCurves { - constructor() { - this._dirty = true; - this._tempColor = new Color4(0, 0, 0, 0); - this._globalCurve = new Color4(0, 0, 0, 0); - this._highlightsCurve = new Color4(0, 0, 0, 0); - this._midtonesCurve = new Color4(0, 0, 0, 0); - this._shadowsCurve = new Color4(0, 0, 0, 0); - this._positiveCurve = new Color4(0, 0, 0, 0); - this._negativeCurve = new Color4(0, 0, 0, 0); - this._globalHue = 30; - this._globalDensity = 0; - this._globalSaturation = 0; - this._globalExposure = 0; - this._highlightsHue = 30; - this._highlightsDensity = 0; - this._highlightsSaturation = 0; - this._highlightsExposure = 0; - this._midtonesHue = 30; - this._midtonesDensity = 0; - this._midtonesSaturation = 0; - this._midtonesExposure = 0; - this._shadowsHue = 30; - this._shadowsDensity = 0; - this._shadowsSaturation = 0; - this._shadowsExposure = 0; + get isBlocking() { + return true; } /** - * Gets the global Hue value. - * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). + * Was there any loading error? */ - get globalHue() { - return this._globalHue; + get loadingError() { + return this._loadingError; } /** - * Sets the global Hue value. - * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). + * If a loading error occurred this object will be populated with information about the error. */ - set globalHue(value) { - this._globalHue = value; - this._dirty = true; + get errorObject() { + return this._errorObject; } /** - * Gets the global Density value. - * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. - * Values less than zero provide a filter of opposite hue. + * Instantiates a new BaseTexture. + * Base class of all the textures in babylon. + * It groups all the common properties the materials, post process, lights... might need + * in order to make a correct use of the texture. + * @param sceneOrEngine Define the scene or engine the texture belongs to + * @param internalTexture Define the internal texture associated with the texture */ - get globalDensity() { - return this._globalDensity; + constructor(sceneOrEngine, internalTexture = null) { + super(null); + this.metadata = null; + this.reservedDataStore = null; + this._hasAlpha = false; + this._getAlphaFromRGB = false; + this.level = 1; + this._coordinatesIndex = 0; + this.optimizeUVAllocation = true; + this._coordinatesMode = 0; + this.wrapR = 1; + this.anisotropicFilteringLevel = _BaseTexture.DEFAULT_ANISOTROPIC_FILTERING_LEVEL; + this._isCube = false; + this._gammaSpace = true; + this.invertZ = false; + this.lodLevelInAlpha = false; + this.isRenderTarget = false; + this._prefiltered = false; + this._forceSerialize = false; + this.animations = []; + this.onDisposeObservable = new Observable(); + this._onDisposeObserver = null; + this._scene = null; + this._uid = null; + this._parentContainer = null; + this._loadingError = false; + if (sceneOrEngine) { + if (_BaseTexture._IsScene(sceneOrEngine)) { + this._scene = sceneOrEngine; + } else { + this._engine = sceneOrEngine; + } + } else { + this._scene = EngineStore.LastCreatedScene; + } + if (this._scene) { + this.uniqueId = this._scene.getUniqueId(); + this._scene.addTexture(this); + this._engine = this._scene.getEngine(); + } + this._texture = internalTexture; + this._uid = null; } /** - * Sets the global Density value. - * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. - * Values less than zero provide a filter of opposite hue. + * Get the scene the texture belongs to. + * @returns the scene or null if undefined */ - set globalDensity(value) { - this._globalDensity = value; - this._dirty = true; + getScene() { + return this._scene; } - /** - * Gets the global Saturation value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. - */ - get globalSaturation() { - return this._globalSaturation; + /** @internal */ + _getEngine() { + return this._engine; } /** - * Sets the global Saturation value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. + * Checks if the texture has the same transform matrix than another texture + * @param texture texture to check against + * @returns true if the transforms are the same, else false */ - set globalSaturation(value) { - this._globalSaturation = value; - this._dirty = true; + checkTransformsAreIdentical(texture) { + return texture !== null; } /** - * Gets the global Exposure value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. + * Get the texture transform matrix used to offset tile the texture for instance. + * @returns the transformation matrix */ - get globalExposure() { - return this._globalExposure; + getTextureMatrix() { + return Matrix.IdentityReadOnly; } /** - * Sets the global Exposure value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. + * Get the texture reflection matrix used to rotate/transform the reflection. + * @returns the reflection matrix */ - set globalExposure(value) { - this._globalExposure = value; - this._dirty = true; + getReflectionTextureMatrix() { + return Matrix.IdentityReadOnly; } /** - * Gets the highlights Hue value. - * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). + * Gets a suitable rotate/transform matrix when the texture is used for refraction. + * There's a separate function from getReflectionTextureMatrix because refraction requires a special configuration of the matrix in right-handed mode. + * @returns The refraction matrix */ - get highlightsHue() { - return this._highlightsHue; + getRefractionTextureMatrix() { + return this.getReflectionTextureMatrix(); } /** - * Sets the highlights Hue value. - * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). + * Get if the texture is ready to be consumed (either it is ready or it is not blocking) + * @returns true if ready, not blocking or if there was an error loading the texture */ - set highlightsHue(value) { - this._highlightsHue = value; - this._dirty = true; + isReadyOrNotBlocking() { + return !this.isBlocking || this.isReady() || this.loadingError; } /** - * Gets the highlights Density value. - * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. - * Values less than zero provide a filter of opposite hue. + * Scales the texture if is `canRescale()` + * @param ratio the resize factor we want to use to rescale */ - get highlightsDensity() { - return this._highlightsDensity; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + scale(ratio) { } /** - * Sets the highlights Density value. - * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. - * Values less than zero provide a filter of opposite hue. + * Get if the texture can rescale. */ - set highlightsDensity(value) { - this._highlightsDensity = value; - this._dirty = true; + get canRescale() { + return false; } /** - * Gets the highlights Saturation value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. + * @internal */ - get highlightsSaturation() { - return this._highlightsSaturation; + _getFromCache(url, noMipmap, sampling, invertY, useSRGBBuffer, isCube) { + const engine = this._getEngine(); + if (!engine) { + return null; + } + const correctedUseSRGBBuffer = engine._getUseSRGBBuffer(!!useSRGBBuffer, noMipmap); + const texturesCache = engine.getLoadedTexturesCache(); + for (let index = 0; index < texturesCache.length; index++) { + const texturesCacheEntry = texturesCache[index]; + if (useSRGBBuffer === void 0 || correctedUseSRGBBuffer === texturesCacheEntry._useSRGBBuffer) { + if (invertY === void 0 || invertY === texturesCacheEntry.invertY) { + if (texturesCacheEntry.url === url && texturesCacheEntry.generateMipMaps === !noMipmap) { + if (!sampling || sampling === texturesCacheEntry.samplingMode) { + if (isCube === void 0 || isCube === texturesCacheEntry.isCube) { + texturesCacheEntry.incrementReferences(); + return texturesCacheEntry; + } + } + } + } + } + } + return null; } - /** - * Sets the highlights Saturation value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. - */ - set highlightsSaturation(value) { - this._highlightsSaturation = value; - this._dirty = true; + /** @internal */ + _rebuild(_fromContextLost = false) { } /** - * Gets the highlights Exposure value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. + * Clones the texture. + * @returns the cloned texture */ - get highlightsExposure() { - return this._highlightsExposure; + clone() { + return null; } /** - * Sets the highlights Exposure value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. + * Get the texture underlying type (INT, FLOAT...) */ - set highlightsExposure(value) { - this._highlightsExposure = value; - this._dirty = true; + get textureType() { + if (!this._texture) { + return 0; + } + return this._texture.type !== void 0 ? this._texture.type : 0; } /** - * Gets the midtones Hue value. - * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). + * Get the texture underlying format (RGB, RGBA...) */ - get midtonesHue() { - return this._midtonesHue; + get textureFormat() { + if (!this._texture) { + return 5; + } + return this._texture.format !== void 0 ? this._texture.format : 5; } /** - * Sets the midtones Hue value. - * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). + * Indicates that textures need to be re-calculated for all materials */ - set midtonesHue(value) { - this._midtonesHue = value; - this._dirty = true; + _markAllSubMeshesAsTexturesDirty() { + const scene = this.getScene(); + if (!scene) { + return; + } + scene.markAllMaterialsAsDirty(1); } /** - * Gets the midtones Density value. - * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. - * Values less than zero provide a filter of opposite hue. + * Reads the pixels stored in the webgl texture and returns them as an ArrayBuffer. + * This will returns an RGBA array buffer containing either in values (0-255) or + * float values (0-1) depending of the underlying buffer type. + * @param faceIndex defines the face of the texture to read (in case of cube texture) + * @param level defines the LOD level of the texture to read (in case of Mip Maps) + * @param buffer defines a user defined buffer to fill with data (can be null) + * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels + * @param noDataConversion false to convert the data to Uint8Array (if texture type is UNSIGNED_BYTE) or to Float32Array (if texture type is anything but UNSIGNED_BYTE). If true, the type of the generated buffer (if buffer==null) will depend on the type of the texture + * @param x defines the region x coordinates to start reading from (default to 0) + * @param y defines the region y coordinates to start reading from (default to 0) + * @param width defines the region width to read from (default to the texture size at level) + * @param height defines the region width to read from (default to the texture size at level) + * @returns The Array buffer promise containing the pixels data. */ - get midtonesDensity() { - return this._midtonesDensity; + readPixels(faceIndex = 0, level = 0, buffer = null, flushRenderer = true, noDataConversion = false, x = 0, y = 0, width = Number.MAX_VALUE, height = Number.MAX_VALUE) { + if (!this._texture) { + return null; + } + const engine = this._getEngine(); + if (!engine) { + return null; + } + const size = this.getSize(); + let maxWidth = size.width; + let maxHeight = size.height; + if (level !== 0) { + maxWidth = maxWidth / Math.pow(2, level); + maxHeight = maxHeight / Math.pow(2, level); + maxWidth = Math.round(maxWidth); + maxHeight = Math.round(maxHeight); + } + width = Math.min(maxWidth, width); + height = Math.min(maxHeight, height); + try { + if (this._texture.isCube) { + return engine._readTexturePixels(this._texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion, x, y); + } + return engine._readTexturePixels(this._texture, width, height, -1, level, buffer, flushRenderer, noDataConversion, x, y); + } catch (e) { + return null; + } } /** - * Sets the midtones Density value. - * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. - * Values less than zero provide a filter of opposite hue. + * @internal */ - set midtonesDensity(value) { - this._midtonesDensity = value; - this._dirty = true; + _readPixelsSync(faceIndex = 0, level = 0, buffer = null, flushRenderer = true, noDataConversion = false) { + if (!this._texture) { + return null; + } + const size = this.getSize(); + let width = size.width; + let height = size.height; + const engine = this._getEngine(); + if (!engine) { + return null; + } + if (level != 0) { + width = width / Math.pow(2, level); + height = height / Math.pow(2, level); + width = Math.round(width); + height = Math.round(height); + } + try { + if (this._texture.isCube) { + return engine._readTexturePixelsSync(this._texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion); + } + return engine._readTexturePixelsSync(this._texture, width, height, -1, level, buffer, flushRenderer, noDataConversion); + } catch (e) { + return null; + } } - /** - * Gets the midtones Saturation value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. - */ - get midtonesSaturation() { - return this._midtonesSaturation; + /** @internal */ + get _lodTextureHigh() { + if (this._texture) { + return this._texture._lodTextureHigh; + } + return null; + } + /** @internal */ + get _lodTextureMid() { + if (this._texture) { + return this._texture._lodTextureMid; + } + return null; + } + /** @internal */ + get _lodTextureLow() { + if (this._texture) { + return this._texture._lodTextureLow; + } + return null; } /** - * Sets the midtones Saturation value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. + * Dispose the texture and release its associated resources. */ - set midtonesSaturation(value) { - this._midtonesSaturation = value; - this._dirty = true; + dispose() { + if (this._scene) { + if (this._scene.stopAnimation) { + this._scene.stopAnimation(this); + } + this._scene.removePendingData(this); + const index = this._scene.textures.indexOf(this); + if (index >= 0) { + this._scene.textures.splice(index, 1); + } + this._scene.onTextureRemovedObservable.notifyObservers(this); + this._scene = null; + if (this._parentContainer) { + const index2 = this._parentContainer.textures.indexOf(this); + if (index2 > -1) { + this._parentContainer.textures.splice(index2, 1); + } + this._parentContainer = null; + } + } + this.onDisposeObservable.notifyObservers(this); + this.onDisposeObservable.clear(); + this.metadata = null; + super.dispose(); } /** - * Gets the midtones Exposure value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. + * Serialize the texture into a JSON representation that can be parsed later on. + * @param allowEmptyName True to force serialization even if name is empty. Default: false + * @returns the JSON representation of the texture */ - get midtonesExposure() { - return this._midtonesExposure; + serialize(allowEmptyName = false) { + if (!this.name && !allowEmptyName) { + return null; + } + const serializationObject = SerializationHelper.Serialize(this); + SerializationHelper.AppendSerializedAnimations(this, serializationObject); + return serializationObject; } /** - * Sets the midtones Exposure value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. + * Helper function to be called back once a list of texture contains only ready textures. + * @param textures Define the list of textures to wait for + * @param callback Define the callback triggered once the entire list will be ready */ - set midtonesExposure(value) { - this._midtonesExposure = value; - this._dirty = true; - } - /** - * Gets the shadows Hue value. - * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). - */ - get shadowsHue() { - return this._shadowsHue; - } - /** - * Sets the shadows Hue value. - * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). - */ - set shadowsHue(value) { - this._shadowsHue = value; - this._dirty = true; - } - /** - * Gets the shadows Density value. - * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. - * Values less than zero provide a filter of opposite hue. - */ - get shadowsDensity() { - return this._shadowsDensity; - } - /** - * Sets the shadows Density value. - * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. - * Values less than zero provide a filter of opposite hue. - */ - set shadowsDensity(value) { - this._shadowsDensity = value; - this._dirty = true; - } - /** - * Gets the shadows Saturation value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. - */ - get shadowsSaturation() { - return this._shadowsSaturation; - } - /** - * Sets the shadows Saturation value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. - */ - set shadowsSaturation(value) { - this._shadowsSaturation = value; - this._dirty = true; - } - /** - * Gets the shadows Exposure value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. - */ - get shadowsExposure() { - return this._shadowsExposure; - } - /** - * Sets the shadows Exposure value. - * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. - */ - set shadowsExposure(value) { - this._shadowsExposure = value; - this._dirty = true; - } - /** - * Returns the class name - * @returns The class name - */ - getClassName() { - return "ColorCurves"; - } - /** - * Binds the color curves to the shader. - * @param colorCurves The color curve to bind - * @param effect The effect to bind to - * @param positiveUniform The positive uniform shader parameter - * @param neutralUniform The neutral uniform shader parameter - * @param negativeUniform The negative uniform shader parameter - */ - static Bind(colorCurves, effect, positiveUniform = "vCameraColorCurvePositive", neutralUniform = "vCameraColorCurveNeutral", negativeUniform = "vCameraColorCurveNegative") { - if (colorCurves._dirty) { - colorCurves._dirty = false; - colorCurves._getColorGradingDataToRef(colorCurves._globalHue, colorCurves._globalDensity, colorCurves._globalSaturation, colorCurves._globalExposure, colorCurves._globalCurve); - colorCurves._getColorGradingDataToRef(colorCurves._highlightsHue, colorCurves._highlightsDensity, colorCurves._highlightsSaturation, colorCurves._highlightsExposure, colorCurves._tempColor); - colorCurves._tempColor.multiplyToRef(colorCurves._globalCurve, colorCurves._highlightsCurve); - colorCurves._getColorGradingDataToRef(colorCurves._midtonesHue, colorCurves._midtonesDensity, colorCurves._midtonesSaturation, colorCurves._midtonesExposure, colorCurves._tempColor); - colorCurves._tempColor.multiplyToRef(colorCurves._globalCurve, colorCurves._midtonesCurve); - colorCurves._getColorGradingDataToRef(colorCurves._shadowsHue, colorCurves._shadowsDensity, colorCurves._shadowsSaturation, colorCurves._shadowsExposure, colorCurves._tempColor); - colorCurves._tempColor.multiplyToRef(colorCurves._globalCurve, colorCurves._shadowsCurve); - colorCurves._highlightsCurve.subtractToRef(colorCurves._midtonesCurve, colorCurves._positiveCurve); - colorCurves._midtonesCurve.subtractToRef(colorCurves._shadowsCurve, colorCurves._negativeCurve); - } - if (effect) { - effect.setFloat4(positiveUniform, colorCurves._positiveCurve.r, colorCurves._positiveCurve.g, colorCurves._positiveCurve.b, colorCurves._positiveCurve.a); - effect.setFloat4(neutralUniform, colorCurves._midtonesCurve.r, colorCurves._midtonesCurve.g, colorCurves._midtonesCurve.b, colorCurves._midtonesCurve.a); - effect.setFloat4(negativeUniform, colorCurves._negativeCurve.r, colorCurves._negativeCurve.g, colorCurves._negativeCurve.b, colorCurves._negativeCurve.a); - } - } - /** - * Returns color grading data based on a hue, density, saturation and exposure value. - * @param hue - * @param density - * @param saturation The saturation. - * @param exposure The exposure. - * @param result The result data container. - */ - _getColorGradingDataToRef(hue, density, saturation, exposure, result) { - if (hue == null) { + static WhenAllReady(textures, callback) { + let numRemaining = textures.length; + if (numRemaining === 0) { + callback(); return; } - hue = _ColorCurves._Clamp(hue, 0, 360); - density = _ColorCurves._Clamp(density, -100, 100); - saturation = _ColorCurves._Clamp(saturation, -100, 100); - exposure = _ColorCurves._Clamp(exposure, -100, 100); - density = _ColorCurves._ApplyColorGradingSliderNonlinear(density); - density *= 0.5; - exposure = _ColorCurves._ApplyColorGradingSliderNonlinear(exposure); - if (density < 0) { - density *= -1; - hue = (hue + 180) % 360; - } - _ColorCurves._FromHSBToRef(hue, density, 50 + 0.25 * exposure, result); - result.scaleToRef(2, result); - result.a = 1 + 0.01 * saturation; - } - /** - * Takes an input slider value and returns an adjusted value that provides extra control near the centre. - * @param value The input slider value in range [-100,100]. - * @returns Adjusted value. - */ - static _ApplyColorGradingSliderNonlinear(value) { - value /= 100; - let x = Math.abs(value); - x = Math.pow(x, 2); - if (value < 0) { - x *= -1; - } - x *= 100; - return x; - } - /** - * Returns an RGBA Color4 based on Hue, Saturation and Brightness (also referred to as value, HSV). - * @param hue The hue (H) input. - * @param saturation The saturation (S) input. - * @param brightness The brightness (B) input. - * @param result - * @result An RGBA color represented as Vector4. - */ - static _FromHSBToRef(hue, saturation, brightness, result) { - let h = _ColorCurves._Clamp(hue, 0, 360); - const s = _ColorCurves._Clamp(saturation / 100, 0, 1); - const v = _ColorCurves._Clamp(brightness / 100, 0, 1); - if (s === 0) { - result.r = v; - result.g = v; - result.b = v; - } else { - h /= 60; - const i = Math.floor(h); - const f = h - i; - const p = v * (1 - s); - const q = v * (1 - s * f); - const t = v * (1 - s * (1 - f)); - switch (i) { - case 0: - result.r = v; - result.g = t; - result.b = p; - break; - case 1: - result.r = q; - result.g = v; - result.b = p; - break; - case 2: - result.r = p; - result.g = v; - result.b = t; - break; - case 3: - result.r = p; - result.g = q; - result.b = v; - break; - case 4: - result.r = t; - result.g = p; - result.b = v; - break; - default: - result.r = v; - result.g = p; - result.b = q; - break; + for (let i = 0; i < textures.length; i++) { + const texture = textures[i]; + if (texture.isReady()) { + if (--numRemaining === 0) { + callback(); + } + } else { + const onLoadObservable = texture.onLoadObservable; + if (onLoadObservable) { + onLoadObservable.addOnce(() => { + if (--numRemaining === 0) { + callback(); + } + }); + } else { + if (--numRemaining === 0) { + callback(); + } + } } } - result.a = 1; - } - /** - * Returns a value clamped between min and max - * @param value The value to clamp - * @param min The minimum of value - * @param max The maximum of value - * @returns The clamped value. - */ - static _Clamp(value, min, max) { - return Math.min(Math.max(value, min), max); - } - /** - * Clones the current color curve instance. - * @returns The cloned curves - */ - clone() { - return SerializationHelper.Clone(() => new _ColorCurves(), this); - } - /** - * Serializes the current color curve instance to a json representation. - * @returns a JSON representation - */ - serialize() { - return SerializationHelper.Serialize(this); } - /** - * Parses the color curve from a json representation. - * @param source the JSON source to parse - * @returns The parsed curves - */ - static Parse(source) { - return SerializationHelper.Parse(() => new _ColorCurves(), source, null, null); + static _IsScene(sceneOrEngine) { + return sceneOrEngine.getClassName() === "Scene"; } }; -ColorCurves.PrepareUniforms = PrepareUniformsForColorCurves; +BaseTexture.DEFAULT_ANISOTROPIC_FILTERING_LEVEL = 4; __decorate([ serialize() -], ColorCurves.prototype, "_globalHue", void 0); +], BaseTexture.prototype, "uniqueId", void 0); __decorate([ serialize() -], ColorCurves.prototype, "_globalDensity", void 0); +], BaseTexture.prototype, "name", void 0); __decorate([ serialize() -], ColorCurves.prototype, "_globalSaturation", void 0); +], BaseTexture.prototype, "metadata", void 0); +__decorate([ + serialize("hasAlpha") +], BaseTexture.prototype, "_hasAlpha", void 0); +__decorate([ + serialize("getAlphaFromRGB") +], BaseTexture.prototype, "_getAlphaFromRGB", void 0); __decorate([ serialize() -], ColorCurves.prototype, "_globalExposure", void 0); +], BaseTexture.prototype, "level", void 0); +__decorate([ + serialize("coordinatesIndex") +], BaseTexture.prototype, "_coordinatesIndex", void 0); __decorate([ serialize() -], ColorCurves.prototype, "_highlightsHue", void 0); +], BaseTexture.prototype, "optimizeUVAllocation", void 0); +__decorate([ + serialize("coordinatesMode") +], BaseTexture.prototype, "_coordinatesMode", void 0); __decorate([ serialize() -], ColorCurves.prototype, "_highlightsDensity", void 0); +], BaseTexture.prototype, "wrapU", null); __decorate([ serialize() -], ColorCurves.prototype, "_highlightsSaturation", void 0); +], BaseTexture.prototype, "wrapV", null); __decorate([ serialize() -], ColorCurves.prototype, "_highlightsExposure", void 0); +], BaseTexture.prototype, "wrapR", void 0); __decorate([ serialize() -], ColorCurves.prototype, "_midtonesHue", void 0); +], BaseTexture.prototype, "anisotropicFilteringLevel", void 0); __decorate([ serialize() -], ColorCurves.prototype, "_midtonesDensity", void 0); +], BaseTexture.prototype, "isCube", null); __decorate([ serialize() -], ColorCurves.prototype, "_midtonesSaturation", void 0); +], BaseTexture.prototype, "is3D", null); __decorate([ serialize() -], ColorCurves.prototype, "_midtonesExposure", void 0); -SerializationHelper._ColorCurvesParser = ColorCurves.Parse; - -// node_modules/@babylonjs/core/Materials/imageProcessingConfiguration.functions.js -function PrepareUniformsForImageProcessing(uniforms, defines) { - if (defines.EXPOSURE) { - uniforms.push("exposureLinear"); - } - if (defines.CONTRAST) { - uniforms.push("contrast"); - } - if (defines.COLORGRADING) { - uniforms.push("colorTransformSettings"); - } - if (defines.VIGNETTE || defines.DITHER) { - uniforms.push("vInverseScreenSize"); - } - if (defines.VIGNETTE) { - uniforms.push("vignetteSettings1"); - uniforms.push("vignetteSettings2"); - } - if (defines.COLORCURVES) { - PrepareUniformsForColorCurves(uniforms); - } - if (defines.DITHER) { - uniforms.push("ditherIntensity"); - } -} -function PrepareSamplersForImageProcessing(samplersList, defines) { - if (defines.COLORGRADING) { - samplersList.push("txColorTransform"); - } -} +], BaseTexture.prototype, "is2DArray", null); +__decorate([ + serialize() +], BaseTexture.prototype, "gammaSpace", null); +__decorate([ + serialize() +], BaseTexture.prototype, "invertZ", void 0); +__decorate([ + serialize() +], BaseTexture.prototype, "lodLevelInAlpha", void 0); +__decorate([ + serialize() +], BaseTexture.prototype, "lodGenerationOffset", null); +__decorate([ + serialize() +], BaseTexture.prototype, "lodGenerationScale", null); +__decorate([ + serialize() +], BaseTexture.prototype, "linearSpecularLOD", null); +__decorate([ + serializeAsTexture() +], BaseTexture.prototype, "irradianceTexture", null); +__decorate([ + serialize() +], BaseTexture.prototype, "isRenderTarget", void 0); -// node_modules/@babylonjs/core/Materials/imageProcessingConfiguration.js -var ImageProcessingConfiguration = class _ImageProcessingConfiguration { - constructor() { - this.colorCurves = new ColorCurves(); - this._colorCurvesEnabled = false; - this._colorGradingEnabled = false; - this._colorGradingWithGreenDepth = true; - this._colorGradingBGR = true; - this._exposure = 1; - this._toneMappingEnabled = false; - this._toneMappingType = _ImageProcessingConfiguration.TONEMAPPING_STANDARD; - this._contrast = 1; - this.vignetteStretch = 0; - this.vignetteCenterX = 0; - this.vignetteCenterY = 0; - this.vignetteWeight = 1.5; - this.vignetteColor = new Color4(0, 0, 0, 0); - this.vignetteCameraFov = 0.5; - this._vignetteBlendMode = _ImageProcessingConfiguration.VIGNETTEMODE_MULTIPLY; - this._vignetteEnabled = false; - this._ditheringEnabled = false; - this._ditheringIntensity = 1 / 255; - this._skipFinalColorClamp = false; - this._applyByPostProcess = false; - this._isEnabled = true; - this.onUpdateParameters = new Observable(); - } +// node_modules/@babylonjs/core/Maths/math.plane.js +var Plane = class _Plane { /** - * Gets whether the color curves effect is enabled. + * Creates a Plane object according to the given floats a, b, c, d and the plane equation : ax + by + cz + d = 0 + * @param a a component of the plane + * @param b b component of the plane + * @param c c component of the plane + * @param d d component of the plane */ - get colorCurvesEnabled() { - return this._colorCurvesEnabled; + constructor(a, b, c, d) { + this.normal = new Vector3(a, b, c); + this.d = d; } /** - * Sets whether the color curves effect is enabled. + * @returns the plane coordinates as a new array of 4 elements [a, b, c, d]. */ - set colorCurvesEnabled(value) { - if (this._colorCurvesEnabled === value) { - return; - } - this._colorCurvesEnabled = value; - this._updateParameters(); + asArray() { + return [this.normal.x, this.normal.y, this.normal.z, this.d]; } + // Methods /** - * Color grading LUT texture used in the effect if colorGradingEnabled is set to true + * @returns a new plane copied from the current Plane. */ - get colorGradingTexture() { - return this._colorGradingTexture; + clone() { + return new _Plane(this.normal.x, this.normal.y, this.normal.z, this.d); } /** - * Color grading LUT texture used in the effect if colorGradingEnabled is set to true + * @returns the string "Plane". */ - set colorGradingTexture(value) { - if (this._colorGradingTexture === value) { - return; - } - this._colorGradingTexture = value; - this._updateParameters(); + getClassName() { + return "Plane"; } /** - * Gets whether the color grading effect is enabled. + * @returns the Plane hash code. */ - get colorGradingEnabled() { - return this._colorGradingEnabled; + getHashCode() { + let hash = this.normal.getHashCode(); + hash = hash * 397 ^ (this.d | 0); + return hash; } /** - * Sets whether the color grading effect is enabled. + * Normalize the current Plane in place. + * @returns the updated Plane. */ - set colorGradingEnabled(value) { - if (this._colorGradingEnabled === value) { - return; + normalize() { + const norm = Math.sqrt(this.normal.x * this.normal.x + this.normal.y * this.normal.y + this.normal.z * this.normal.z); + let magnitude = 0; + if (norm !== 0) { + magnitude = 1 / norm; } - this._colorGradingEnabled = value; - this._updateParameters(); - } - /** - * Gets whether the color grading effect is using a green depth for the 3d Texture. - */ - get colorGradingWithGreenDepth() { - return this._colorGradingWithGreenDepth; + this.normal.x *= magnitude; + this.normal.y *= magnitude; + this.normal.z *= magnitude; + this.d *= magnitude; + return this; } /** - * Sets whether the color grading effect is using a green depth for the 3d Texture. + * Applies a transformation the plane and returns the result + * @param transformation the transformation matrix to be applied to the plane + * @returns a new Plane as the result of the transformation of the current Plane by the given matrix. */ - set colorGradingWithGreenDepth(value) { - if (this._colorGradingWithGreenDepth === value) { - return; - } - this._colorGradingWithGreenDepth = value; - this._updateParameters(); + transform(transformation) { + const invertedMatrix = _Plane._TmpMatrix; + transformation.invertToRef(invertedMatrix); + const m = invertedMatrix.m; + const x = this.normal.x; + const y = this.normal.y; + const z = this.normal.z; + const d = this.d; + const normalX = x * m[0] + y * m[1] + z * m[2] + d * m[3]; + const normalY = x * m[4] + y * m[5] + z * m[6] + d * m[7]; + const normalZ = x * m[8] + y * m[9] + z * m[10] + d * m[11]; + const finalD = x * m[12] + y * m[13] + z * m[14] + d * m[15]; + return new _Plane(normalX, normalY, normalZ, finalD); } /** - * Gets whether the color grading texture contains BGR values. + * Compute the dot product between the point and the plane normal + * @param point point to calculate the dot product with + * @returns the dot product (float) of the point coordinates and the plane normal. */ - get colorGradingBGR() { - return this._colorGradingBGR; + dotCoordinate(point) { + return this.normal.x * point.x + this.normal.y * point.y + this.normal.z * point.z + this.d; } /** - * Sets whether the color grading texture contains BGR values. + * Updates the current Plane from the plane defined by the three given points. + * @param point1 one of the points used to construct the plane + * @param point2 one of the points used to construct the plane + * @param point3 one of the points used to construct the plane + * @returns the updated Plane. */ - set colorGradingBGR(value) { - if (this._colorGradingBGR === value) { - return; + copyFromPoints(point1, point2, point3) { + const x1 = point2.x - point1.x; + const y1 = point2.y - point1.y; + const z1 = point2.z - point1.z; + const x2 = point3.x - point1.x; + const y2 = point3.y - point1.y; + const z2 = point3.z - point1.z; + const yz = y1 * z2 - z1 * y2; + const xz = z1 * x2 - x1 * z2; + const xy = x1 * y2 - y1 * x2; + const pyth = Math.sqrt(yz * yz + xz * xz + xy * xy); + let invPyth; + if (pyth !== 0) { + invPyth = 1 / pyth; + } else { + invPyth = 0; } - this._colorGradingBGR = value; - this._updateParameters(); + this.normal.x = yz * invPyth; + this.normal.y = xz * invPyth; + this.normal.z = xy * invPyth; + this.d = -(this.normal.x * point1.x + this.normal.y * point1.y + this.normal.z * point1.z); + return this; } /** - * Gets the Exposure used in the effect. - */ - get exposure() { - return this._exposure; - } - /** - * Sets the Exposure used in the effect. + * Checks if the plane is facing a given direction (meaning if the plane's normal is pointing in the opposite direction of the given vector). + * Note that for this function to work as expected you should make sure that: + * - direction and the plane normal are normalized + * - epsilon is a number just bigger than -1, something like -0.99 for eg + * @param direction the direction to check if the plane is facing + * @param epsilon value the dot product is compared against (returns true if dot <= epsilon) + * @returns True if the plane is facing the given direction */ - set exposure(value) { - if (this._exposure === value) { - return; - } - this._exposure = value; - this._updateParameters(); + isFrontFacingTo(direction, epsilon) { + const dot = Vector3.Dot(this.normal, direction); + return dot <= epsilon; } /** - * Gets whether the tone mapping effect is enabled. + * Calculates the distance to a point + * @param point point to calculate distance to + * @returns the signed distance (float) from the given point to the Plane. */ - get toneMappingEnabled() { - return this._toneMappingEnabled; + signedDistanceTo(point) { + return Vector3.Dot(point, this.normal) + this.d; } + // Statics /** - * Sets whether the tone mapping effect is enabled. + * Creates a plane from an array + * @param array the array to create a plane from + * @returns a new Plane from the given array. */ - set toneMappingEnabled(value) { - if (this._toneMappingEnabled === value) { - return; - } - this._toneMappingEnabled = value; - this._updateParameters(); + static FromArray(array) { + return new _Plane(array[0], array[1], array[2], array[3]); } /** - * Gets the type of tone mapping effect. + * Creates a plane from three points + * @param point1 point used to create the plane + * @param point2 point used to create the plane + * @param point3 point used to create the plane + * @returns a new Plane defined by the three given points. */ - get toneMappingType() { - return this._toneMappingType; + static FromPoints(point1, point2, point3) { + const result = new _Plane(0, 0, 0, 0); + result.copyFromPoints(point1, point2, point3); + return result; } /** - * Sets the type of tone mapping effect used in BabylonJS. + * Creates a plane from an origin point and a normal + * @param origin origin of the plane to be constructed + * @param normal normal of the plane to be constructed + * @returns a new Plane the normal vector to this plane at the given origin point. */ - set toneMappingType(value) { - if (this._toneMappingType === value) { - return; - } - this._toneMappingType = value; - this._updateParameters(); + static FromPositionAndNormal(origin, normal) { + const plane = new _Plane(0, 0, 0, 0); + return this.FromPositionAndNormalToRef(origin, normal, plane); } /** - * Gets the contrast used in the effect. + * Updates the given Plane "result" from an origin point and a normal. + * @param origin origin of the plane to be constructed + * @param normal the normalized normals of the plane to be constructed + * @param result defines the Plane where to store the result + * @returns result input */ - get contrast() { - return this._contrast; + static FromPositionAndNormalToRef(origin, normal, result) { + result.normal.copyFrom(normal); + result.normal.normalize(); + result.d = -origin.dot(result.normal); + return result; } /** - * Sets the contrast used in the effect. + * Calculates the distance from a plane and a point + * @param origin origin of the plane to be constructed + * @param normal normal of the plane to be constructed + * @param point point to calculate distance to + * @returns the signed distance between the plane defined by the normal vector at the "origin"" point and the given other point. */ - set contrast(value) { - if (this._contrast === value) { - return; + static SignedDistanceToPlaneFromPositionAndNormal(origin, normal, point) { + const d = -(normal.x * origin.x + normal.y * origin.y + normal.z * origin.z); + return Vector3.Dot(point, normal) + d; + } +}; +Plane._TmpMatrix = Matrix.Identity(); + +// node_modules/@babylonjs/core/Misc/copyTools.js +function GenerateBase64StringFromPixelData(pixels, size, invertY = false) { + const width = size.width; + const height = size.height; + if (pixels instanceof Float32Array) { + let len = pixels.byteLength / pixels.BYTES_PER_ELEMENT; + const npixels = new Uint8Array(len); + while (--len >= 0) { + let val = pixels[len]; + if (val < 0) { + val = 0; + } else if (val > 1) { + val = 1; + } + npixels[len] = val * 255; } - this._contrast = value; - this._updateParameters(); + pixels = npixels; } - /** - * Back Compat: Vignette center Y Offset. - * @deprecated use vignetteCenterY instead - */ - get vignetteCentreY() { - return this.vignetteCenterY; + const canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + const ctx = canvas.getContext("2d"); + if (!ctx) { + return null; } - set vignetteCentreY(value) { - this.vignetteCenterY = value; + const imageData = ctx.createImageData(width, height); + const castData = imageData.data; + castData.set(pixels); + ctx.putImageData(imageData, 0, 0); + if (invertY) { + const canvas2 = document.createElement("canvas"); + canvas2.width = width; + canvas2.height = height; + const ctx2 = canvas2.getContext("2d"); + if (!ctx2) { + return null; + } + ctx2.translate(0, height); + ctx2.scale(1, -1); + ctx2.drawImage(canvas, 0, 0); + return canvas2.toDataURL("image/png"); } - /** - * Back Compat: Vignette center X Offset. - * @deprecated use vignetteCenterX instead - */ - get vignetteCentreX() { - return this.vignetteCenterX; + return canvas.toDataURL("image/png"); +} +function GenerateBase64StringFromTexture(texture, faceIndex = 0, level = 0) { + const internalTexture = texture.getInternalTexture(); + if (!internalTexture) { + return null; } - set vignetteCentreX(value) { - this.vignetteCenterX = value; + const pixels = texture._readPixelsSync(faceIndex, level); + if (!pixels) { + return null; } - /** - * Gets the vignette blend mode allowing different kind of effect. - */ - get vignetteBlendMode() { - return this._vignetteBlendMode; + return GenerateBase64StringFromPixelData(pixels, texture.getSize(), internalTexture.invertY); +} +async function GenerateBase64StringFromTextureAsync(texture, faceIndex = 0, level = 0) { + const internalTexture = texture.getInternalTexture(); + if (!internalTexture) { + return null; } - /** - * Sets the vignette blend mode allowing different kind of effect. - */ - set vignetteBlendMode(value) { - if (this._vignetteBlendMode === value) { - return; - } - this._vignetteBlendMode = value; - this._updateParameters(); + const pixels = await texture.readPixels(faceIndex, level); + if (!pixels) { + return null; } + return GenerateBase64StringFromPixelData(pixels, texture.getSize(), internalTexture.invertY); +} +var CopyTools = { /** - * Gets whether the vignette effect is enabled. + * Transform some pixel data to a base64 string + * @param pixels defines the pixel data to transform to base64 + * @param size defines the width and height of the (texture) data + * @param invertY true if the data must be inverted for the Y coordinate during the conversion + * @returns The base64 encoded string or null */ - get vignetteEnabled() { - return this._vignetteEnabled; - } + GenerateBase64StringFromPixelData, /** - * Sets whether the vignette effect is enabled. + * Reads the pixels stored in the webgl texture and returns them as a base64 string + * @param texture defines the texture to read pixels from + * @param faceIndex defines the face of the texture to read (in case of cube texture) + * @param level defines the LOD level of the texture to read (in case of Mip Maps) + * @returns The base64 encoded string or null */ - set vignetteEnabled(value) { - if (this._vignetteEnabled === value) { - return; - } - this._vignetteEnabled = value; - this._updateParameters(); - } + GenerateBase64StringFromTexture, /** - * Gets whether the dithering effect is enabled. - * The dithering effect can be used to reduce banding. + * Reads the pixels stored in the webgl texture and returns them as a base64 string + * @param texture defines the texture to read pixels from + * @param faceIndex defines the face of the texture to read (in case of cube texture) + * @param level defines the LOD level of the texture to read (in case of Mip Maps) + * @returns The base64 encoded string or null wrapped in a promise */ - get ditheringEnabled() { - return this._ditheringEnabled; - } + GenerateBase64StringFromTextureAsync +}; + +// node_modules/@babylonjs/core/Compat/compatibilityOptions.js +var CompatibilityOptions = class { +}; +CompatibilityOptions.UseOpenGLOrientationForUV = false; + +// node_modules/@babylonjs/core/Materials/Textures/texture.js +var Texture = class _Texture extends BaseTexture { /** - * Sets whether the dithering effect is enabled. - * The dithering effect can be used to reduce banding. + * @internal */ - set ditheringEnabled(value) { - if (this._ditheringEnabled === value) { - return; - } - this._ditheringEnabled = value; - this._updateParameters(); + static _CreateVideoTexture(name69, src, scene, generateMipMaps = false, invertY = false, samplingMode = _Texture.TRILINEAR_SAMPLINGMODE, settings = {}, onError, format = 5) { + throw _WarnImport("VideoTexture"); } /** - * Gets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0. + * Are mip maps generated for this texture or not. */ - get ditheringIntensity() { - return this._ditheringIntensity; + get noMipmap() { + return this._noMipmap; } - /** - * Sets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0. - */ - set ditheringIntensity(value) { - if (this._ditheringIntensity === value) { - return; - } - this._ditheringIntensity = value; - this._updateParameters(); + /** Returns the texture mime type if it was defined by a loader (undefined else) */ + get mimeType() { + return this._mimeType; } /** - * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader - * Applies to PBR materials. + * Is the texture preventing material to render while loading. + * If false, a default texture will be used instead of the loading one during the preparation step. */ - get skipFinalColorClamp() { - return this._skipFinalColorClamp; + set isBlocking(value) { + this._isBlocking = value; } - /** - * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader - * Applies to PBR materials. - */ - set skipFinalColorClamp(value) { - if (this._skipFinalColorClamp === value) { - return; - } - this._skipFinalColorClamp = value; - this._updateParameters(); + get isBlocking() { + return this._isBlocking; } /** - * Gets whether the image processing is applied through a post process or not. + * Gets a boolean indicating if the texture needs to be inverted on the y axis during loading */ - get applyByPostProcess() { - return this._applyByPostProcess; + get invertY() { + return this._invertY; } /** - * Sets whether the image processing is applied through a post process or not. + * Instantiates a new texture. + * This represents a texture in babylon. It can be easily loaded from a network, base64 or html input. + * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#texture + * @param url defines the url of the picture to load as a texture + * @param sceneOrEngine defines the scene or engine the texture will belong to + * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture + * @param invertY defines if the texture needs to be inverted on the y axis during loading + * @param samplingMode defines the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...) + * @param onLoad defines a callback triggered when the texture has been loaded + * @param onError defines a callback triggered when an error occurred during the loading session + * @param buffer defines the buffer to load the texture from in case the texture is loaded from a buffer representation + * @param deleteBuffer defines if the buffer we are loading the texture from should be deleted after load + * @param format defines the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...) + * @param mimeType defines an optional mime type information + * @param loaderOptions options to be passed to the loader + * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg) + * @param forcedExtension defines the extension to use to pick the right loader */ - set applyByPostProcess(value) { - if (this._applyByPostProcess === value) { + constructor(url, sceneOrEngine, noMipmapOrOptions, invertY, samplingMode = _Texture.TRILINEAR_SAMPLINGMODE, onLoad = null, onError = null, buffer = null, deleteBuffer = false, format, mimeType, loaderOptions, creationFlags, forcedExtension) { + super(sceneOrEngine); + this.url = null; + this.uOffset = 0; + this.vOffset = 0; + this.uScale = 1; + this.vScale = 1; + this.uAng = 0; + this.vAng = 0; + this.wAng = 0; + this.uRotationCenter = 0.5; + this.vRotationCenter = 0.5; + this.wRotationCenter = 0.5; + this.homogeneousRotationInUVTransform = false; + this.inspectableCustomProperties = null; + this._noMipmap = false; + this._invertY = false; + this._rowGenerationMatrix = null; + this._cachedTextureMatrix = null; + this._projectionModeMatrix = null; + this._t0 = null; + this._t1 = null; + this._t2 = null; + this._cachedUOffset = -1; + this._cachedVOffset = -1; + this._cachedUScale = 0; + this._cachedVScale = 0; + this._cachedUAng = -1; + this._cachedVAng = -1; + this._cachedWAng = -1; + this._cachedReflectionProjectionMatrixId = -1; + this._cachedURotationCenter = -1; + this._cachedVRotationCenter = -1; + this._cachedWRotationCenter = -1; + this._cachedHomogeneousRotationInUVTransform = false; + this._cachedIdentity3x2 = true; + this._cachedReflectionTextureMatrix = null; + this._cachedReflectionUOffset = -1; + this._cachedReflectionVOffset = -1; + this._cachedReflectionUScale = 0; + this._cachedReflectionVScale = 0; + this._cachedReflectionCoordinatesMode = -1; + this._buffer = null; + this._deleteBuffer = false; + this._format = null; + this._delayedOnLoad = null; + this._delayedOnError = null; + this.onLoadObservable = new Observable(); + this._isBlocking = true; + this.name = url || ""; + this.url = url; + let noMipmap; + let useSRGBBuffer = false; + let internalTexture = null; + let gammaSpace = true; + if (typeof noMipmapOrOptions === "object" && noMipmapOrOptions !== null) { + noMipmap = noMipmapOrOptions.noMipmap ?? false; + invertY = noMipmapOrOptions.invertY ?? (CompatibilityOptions.UseOpenGLOrientationForUV ? false : true); + samplingMode = noMipmapOrOptions.samplingMode ?? _Texture.TRILINEAR_SAMPLINGMODE; + onLoad = noMipmapOrOptions.onLoad ?? null; + onError = noMipmapOrOptions.onError ?? null; + buffer = noMipmapOrOptions.buffer ?? null; + deleteBuffer = noMipmapOrOptions.deleteBuffer ?? false; + format = noMipmapOrOptions.format; + mimeType = noMipmapOrOptions.mimeType; + loaderOptions = noMipmapOrOptions.loaderOptions; + creationFlags = noMipmapOrOptions.creationFlags; + useSRGBBuffer = noMipmapOrOptions.useSRGBBuffer ?? false; + internalTexture = noMipmapOrOptions.internalTexture ?? null; + gammaSpace = noMipmapOrOptions.gammaSpace ?? gammaSpace; + } else { + noMipmap = !!noMipmapOrOptions; + } + this._gammaSpace = gammaSpace; + this._noMipmap = noMipmap; + this._invertY = invertY === void 0 ? CompatibilityOptions.UseOpenGLOrientationForUV ? false : true : invertY; + this._initialSamplingMode = samplingMode; + this._buffer = buffer; + this._deleteBuffer = deleteBuffer; + this._mimeType = mimeType; + this._loaderOptions = loaderOptions; + this._creationFlags = creationFlags; + this._useSRGBBuffer = useSRGBBuffer; + this._forcedExtension = forcedExtension; + if (format) { + this._format = format; + } + const scene = this.getScene(); + const engine = this._getEngine(); + if (!engine) { return; } - this._applyByPostProcess = value; - this._updateParameters(); - } - /** - * Gets whether the image processing is enabled or not. - */ - get isEnabled() { - return this._isEnabled; - } - /** - * Sets whether the image processing is enabled or not. - */ - set isEnabled(value) { - if (this._isEnabled === value) { + engine.onBeforeTextureInitObservable.notifyObservers(this); + const load = () => { + if (this._texture) { + if (this._texture._invertVScale) { + this.vScale *= -1; + this.vOffset += 1; + } + if (this._texture._cachedWrapU !== null) { + this.wrapU = this._texture._cachedWrapU; + this._texture._cachedWrapU = null; + } + if (this._texture._cachedWrapV !== null) { + this.wrapV = this._texture._cachedWrapV; + this._texture._cachedWrapV = null; + } + if (this._texture._cachedWrapR !== null) { + this.wrapR = this._texture._cachedWrapR; + this._texture._cachedWrapR = null; + } + } + if (this.onLoadObservable.hasObservers()) { + this.onLoadObservable.notifyObservers(this); + } + if (onLoad) { + onLoad(); + } + if (!this.isBlocking && scene) { + scene.resetCachedMaterial(); + } + }; + const errorHandler = (message, exception) => { + this._loadingError = true; + this._errorObject = { message, exception }; + if (onError) { + onError(message, exception); + } + _Texture.OnTextureLoadErrorObservable.notifyObservers(this); + }; + if (!this.url && !internalTexture) { + this._delayedOnLoad = load; + this._delayedOnError = errorHandler; return; } - this._isEnabled = value; - this._updateParameters(); + this._texture = internalTexture ?? this._getFromCache(this.url, noMipmap, samplingMode, this._invertY, useSRGBBuffer, this.isCube); + if (!this._texture) { + if (!scene || !scene.useDelayedTextureLoading) { + try { + this._texture = engine.createTexture(this.url, noMipmap, this._invertY, scene, samplingMode, load, errorHandler, this._buffer, void 0, this._format, this._forcedExtension, mimeType, loaderOptions, creationFlags, useSRGBBuffer); + } catch (e) { + errorHandler("error loading", e); + throw e; + } + if (deleteBuffer) { + this._buffer = null; + } + } else { + this.delayLoadState = 4; + this._delayedOnLoad = load; + this._delayedOnError = errorHandler; + } + } else { + if (this._texture.isReady) { + TimingTools.SetImmediate(() => load()); + } else { + const loadObserver = this._texture.onLoadedObservable.add(load); + this._texture.onErrorObservable.add((e) => { + var _a; + errorHandler(e.message, e.exception); + (_a = this._texture) == null ? void 0 : _a.onLoadedObservable.remove(loadObserver); + }); + } + } } /** - * Method called each time the image processing information changes requires to recompile the effect. + * Update the url (and optional buffer) of this texture if url was null during construction. + * @param url the url of the texture + * @param buffer the buffer of the texture (defaults to null) + * @param onLoad callback called when the texture is loaded (defaults to null) + * @param forcedExtension defines the extension to use to pick the right loader */ - _updateParameters() { - this.onUpdateParameters.notifyObservers(this); + updateURL(url, buffer = null, onLoad, forcedExtension) { + if (this.url) { + this.releaseInternalTexture(); + this.getScene().markAllMaterialsAsDirty(1, (mat) => { + return mat.hasTexture(this); + }); + } + if (!this.name || this.name.startsWith("data:")) { + this.name = url; + } + this.url = url; + this._buffer = buffer; + this._forcedExtension = forcedExtension; + this.delayLoadState = 4; + if (onLoad) { + this._delayedOnLoad = onLoad; + } + this.delayLoad(); } /** - * Gets the current class name. - * @returns "ImageProcessingConfiguration" + * Finish the loading sequence of a texture flagged as delayed load. + * @internal */ - getClassName() { - return "ImageProcessingConfiguration"; + delayLoad() { + if (this.delayLoadState !== 4) { + return; + } + const scene = this.getScene(); + if (!scene) { + return; + } + this.delayLoadState = 1; + this._texture = this._getFromCache(this.url, this._noMipmap, this.samplingMode, this._invertY, this._useSRGBBuffer, this.isCube); + if (!this._texture) { + this._texture = scene.getEngine().createTexture(this.url, this._noMipmap, this._invertY, scene, this.samplingMode, this._delayedOnLoad, this._delayedOnError, this._buffer, null, this._format, this._forcedExtension, this._mimeType, this._loaderOptions, this._creationFlags, this._useSRGBBuffer); + if (this._deleteBuffer) { + this._buffer = null; + } + } else { + if (this._delayedOnLoad) { + if (this._texture.isReady) { + TimingTools.SetImmediate(this._delayedOnLoad); + } else { + this._texture.onLoadedObservable.add(this._delayedOnLoad); + } + } + } + this._delayedOnLoad = null; + this._delayedOnError = null; + } + _prepareRowForTextureGeneration(x, y, z, t) { + x *= this._cachedUScale; + y *= this._cachedVScale; + x -= this.uRotationCenter * this._cachedUScale; + y -= this.vRotationCenter * this._cachedVScale; + z -= this.wRotationCenter; + Vector3.TransformCoordinatesFromFloatsToRef(x, y, z, this._rowGenerationMatrix, t); + t.x += this.uRotationCenter * this._cachedUScale + this._cachedUOffset; + t.y += this.vRotationCenter * this._cachedVScale + this._cachedVOffset; + t.z += this.wRotationCenter; } /** - * Prepare the list of defines associated to the shader. - * @param defines the list of defines to complete - * @param forPostProcess Define if we are currently in post process mode or not + * Checks if the texture has the same transform matrix than another texture + * @param texture texture to check against + * @returns true if the transforms are the same, else false */ - prepareDefines(defines, forPostProcess = false) { - if (forPostProcess !== this.applyByPostProcess || !this._isEnabled) { - defines.VIGNETTE = false; - defines.TONEMAPPING = false; - defines.TONEMAPPING_ACES = false; - defines.CONTRAST = false; - defines.EXPOSURE = false; - defines.COLORCURVES = false; - defines.COLORGRADING = false; - defines.COLORGRADING3D = false; - defines.DITHER = false; - defines.IMAGEPROCESSING = false; - defines.SKIPFINALCOLORCLAMP = this.skipFinalColorClamp; - defines.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess && this._isEnabled; - return; + checkTransformsAreIdentical(texture) { + return texture !== null && this.uOffset === texture.uOffset && this.vOffset === texture.vOffset && this.uScale === texture.uScale && this.vScale === texture.vScale && this.uAng === texture.uAng && this.vAng === texture.vAng && this.wAng === texture.wAng; + } + /** + * Get the current texture matrix which includes the requested offsetting, tiling and rotation components. + * @param uBase The horizontal base offset multiplier (1 by default) + * @returns the transform matrix of the texture. + */ + getTextureMatrix(uBase = 1) { + if (this.uOffset === this._cachedUOffset && this.vOffset === this._cachedVOffset && this.uScale * uBase === this._cachedUScale && this.vScale === this._cachedVScale && this.uAng === this._cachedUAng && this.vAng === this._cachedVAng && this.wAng === this._cachedWAng && this.uRotationCenter === this._cachedURotationCenter && this.vRotationCenter === this._cachedVRotationCenter && this.wRotationCenter === this._cachedWRotationCenter && this.homogeneousRotationInUVTransform === this._cachedHomogeneousRotationInUVTransform) { + return this._cachedTextureMatrix; } - defines.VIGNETTE = this.vignetteEnabled; - defines.VIGNETTEBLENDMODEMULTIPLY = this.vignetteBlendMode === _ImageProcessingConfiguration._VIGNETTEMODE_MULTIPLY; - defines.VIGNETTEBLENDMODEOPAQUE = !defines.VIGNETTEBLENDMODEMULTIPLY; - defines.TONEMAPPING = this.toneMappingEnabled; - switch (this._toneMappingType) { - case _ImageProcessingConfiguration.TONEMAPPING_ACES: - defines.TONEMAPPING_ACES = true; + this._cachedUOffset = this.uOffset; + this._cachedVOffset = this.vOffset; + this._cachedUScale = this.uScale * uBase; + this._cachedVScale = this.vScale; + this._cachedUAng = this.uAng; + this._cachedVAng = this.vAng; + this._cachedWAng = this.wAng; + this._cachedURotationCenter = this.uRotationCenter; + this._cachedVRotationCenter = this.vRotationCenter; + this._cachedWRotationCenter = this.wRotationCenter; + this._cachedHomogeneousRotationInUVTransform = this.homogeneousRotationInUVTransform; + if (!this._cachedTextureMatrix || !this._rowGenerationMatrix) { + this._cachedTextureMatrix = Matrix.Zero(); + this._rowGenerationMatrix = new Matrix(); + this._t0 = Vector3.Zero(); + this._t1 = Vector3.Zero(); + this._t2 = Vector3.Zero(); + } + Matrix.RotationYawPitchRollToRef(this.vAng, this.uAng, this.wAng, this._rowGenerationMatrix); + if (this.homogeneousRotationInUVTransform) { + Matrix.TranslationToRef(-this._cachedURotationCenter, -this._cachedVRotationCenter, -this._cachedWRotationCenter, TmpVectors.Matrix[0]); + Matrix.TranslationToRef(this._cachedURotationCenter, this._cachedVRotationCenter, this._cachedWRotationCenter, TmpVectors.Matrix[1]); + Matrix.ScalingToRef(this._cachedUScale, this._cachedVScale, 0, TmpVectors.Matrix[2]); + Matrix.TranslationToRef(this._cachedUOffset, this._cachedVOffset, 0, TmpVectors.Matrix[3]); + TmpVectors.Matrix[0].multiplyToRef(this._rowGenerationMatrix, this._cachedTextureMatrix); + this._cachedTextureMatrix.multiplyToRef(TmpVectors.Matrix[1], this._cachedTextureMatrix); + this._cachedTextureMatrix.multiplyToRef(TmpVectors.Matrix[2], this._cachedTextureMatrix); + this._cachedTextureMatrix.multiplyToRef(TmpVectors.Matrix[3], this._cachedTextureMatrix); + this._cachedTextureMatrix.setRowFromFloats(2, this._cachedTextureMatrix.m[12], this._cachedTextureMatrix.m[13], this._cachedTextureMatrix.m[14], 1); + } else { + this._prepareRowForTextureGeneration(0, 0, 0, this._t0); + this._prepareRowForTextureGeneration(1, 0, 0, this._t1); + this._prepareRowForTextureGeneration(0, 1, 0, this._t2); + this._t1.subtractInPlace(this._t0); + this._t2.subtractInPlace(this._t0); + Matrix.FromValuesToRef(this._t1.x, this._t1.y, this._t1.z, 0, this._t2.x, this._t2.y, this._t2.z, 0, this._t0.x, this._t0.y, this._t0.z, 0, 0, 0, 0, 1, this._cachedTextureMatrix); + } + const scene = this.getScene(); + if (!scene) { + return this._cachedTextureMatrix; + } + const previousIdentity3x2 = this._cachedIdentity3x2; + this._cachedIdentity3x2 = this._cachedTextureMatrix.isIdentityAs3x2(); + if (this.optimizeUVAllocation && previousIdentity3x2 !== this._cachedIdentity3x2) { + scene.markAllMaterialsAsDirty(1, (mat) => { + return mat.hasTexture(this); + }); + } + return this._cachedTextureMatrix; + } + /** + * Get the current matrix used to apply reflection. This is useful to rotate an environment texture for instance. + * @returns The reflection texture transform + */ + getReflectionTextureMatrix() { + const scene = this.getScene(); + if (!scene) { + return this._cachedReflectionTextureMatrix; + } + if (this.uOffset === this._cachedReflectionUOffset && this.vOffset === this._cachedReflectionVOffset && this.uScale === this._cachedReflectionUScale && this.vScale === this._cachedReflectionVScale && this.coordinatesMode === this._cachedReflectionCoordinatesMode) { + if (this.coordinatesMode === _Texture.PROJECTION_MODE) { + if (this._cachedReflectionProjectionMatrixId === scene.getProjectionMatrix().updateFlag) { + return this._cachedReflectionTextureMatrix; + } + } else { + return this._cachedReflectionTextureMatrix; + } + } + if (!this._cachedReflectionTextureMatrix) { + this._cachedReflectionTextureMatrix = Matrix.Zero(); + } + if (!this._projectionModeMatrix) { + this._projectionModeMatrix = Matrix.Zero(); + } + const flagMaterialsAsTextureDirty = this._cachedReflectionCoordinatesMode !== this.coordinatesMode; + this._cachedReflectionUOffset = this.uOffset; + this._cachedReflectionVOffset = this.vOffset; + this._cachedReflectionUScale = this.uScale; + this._cachedReflectionVScale = this.vScale; + this._cachedReflectionCoordinatesMode = this.coordinatesMode; + switch (this.coordinatesMode) { + case _Texture.PLANAR_MODE: { + Matrix.IdentityToRef(this._cachedReflectionTextureMatrix); + this._cachedReflectionTextureMatrix[0] = this.uScale; + this._cachedReflectionTextureMatrix[5] = this.vScale; + this._cachedReflectionTextureMatrix[12] = this.uOffset; + this._cachedReflectionTextureMatrix[13] = this.vOffset; + break; + } + case _Texture.PROJECTION_MODE: { + Matrix.FromValuesToRef(0.5, 0, 0, 0, 0, -0.5, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 1, 1, this._projectionModeMatrix); + const projectionMatrix = scene.getProjectionMatrix(); + this._cachedReflectionProjectionMatrixId = projectionMatrix.updateFlag; + projectionMatrix.multiplyToRef(this._projectionModeMatrix, this._cachedReflectionTextureMatrix); break; + } default: - defines.TONEMAPPING_ACES = false; + Matrix.IdentityToRef(this._cachedReflectionTextureMatrix); break; } - defines.CONTRAST = this.contrast !== 1; - defines.EXPOSURE = this.exposure !== 1; - defines.COLORCURVES = this.colorCurvesEnabled && !!this.colorCurves; - defines.COLORGRADING = this.colorGradingEnabled && !!this.colorGradingTexture; - if (defines.COLORGRADING) { - defines.COLORGRADING3D = this.colorGradingTexture.is3D; - } else { - defines.COLORGRADING3D = false; + if (flagMaterialsAsTextureDirty) { + scene.markAllMaterialsAsDirty(1, (mat) => { + return mat.hasTexture(this); + }); } - defines.SAMPLER3DGREENDEPTH = this.colorGradingWithGreenDepth; - defines.SAMPLER3DBGRMAP = this.colorGradingBGR; - defines.DITHER = this._ditheringEnabled; - defines.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess; - defines.SKIPFINALCOLORCLAMP = this.skipFinalColorClamp; - defines.IMAGEPROCESSING = defines.VIGNETTE || defines.TONEMAPPING || defines.CONTRAST || defines.EXPOSURE || defines.COLORCURVES || defines.COLORGRADING || defines.DITHER; + return this._cachedReflectionTextureMatrix; } /** - * Returns true if all the image processing information are ready. - * @returns True if ready, otherwise, false + * Clones the texture. + * @returns the cloned texture */ - isReady() { - return !this.colorGradingEnabled || !this.colorGradingTexture || this.colorGradingTexture.isReady(); + clone() { + const options = { + noMipmap: this._noMipmap, + invertY: this._invertY, + samplingMode: this.samplingMode, + onLoad: void 0, + onError: void 0, + buffer: this._texture ? this._texture._buffer : void 0, + deleteBuffer: this._deleteBuffer, + format: this.textureFormat, + mimeType: this.mimeType, + loaderOptions: this._loaderOptions, + creationFlags: this._creationFlags, + useSRGBBuffer: this._useSRGBBuffer + }; + return SerializationHelper.Clone(() => { + return new _Texture(this._texture ? this._texture.url : null, this.getScene(), options); + }, this); } /** - * Binds the image processing to the shader. - * @param effect The effect to bind to - * @param overrideAspectRatio Override the aspect ratio of the effect + * Serialize the texture to a JSON representation we can easily use in the respective Parse function. + * @returns The JSON representation of the texture */ - bind(effect, overrideAspectRatio) { - if (this._colorCurvesEnabled && this.colorCurves) { - ColorCurves.Bind(this.colorCurves, effect); - } - if (this._vignetteEnabled || this._ditheringEnabled) { - const inverseWidth = 1 / effect.getEngine().getRenderWidth(); - const inverseHeight = 1 / effect.getEngine().getRenderHeight(); - effect.setFloat2("vInverseScreenSize", inverseWidth, inverseHeight); - if (this._ditheringEnabled) { - effect.setFloat("ditherIntensity", 0.5 * this._ditheringIntensity); + serialize() { + var _a; + const savedName = this.name; + if (!_Texture.SerializeBuffers) { + if (this.name.startsWith("data:")) { + this.name = ""; } - if (this._vignetteEnabled) { - const aspectRatio = overrideAspectRatio != null ? overrideAspectRatio : inverseHeight / inverseWidth; - let vignetteScaleY = Math.tan(this.vignetteCameraFov * 0.5); - let vignetteScaleX = vignetteScaleY * aspectRatio; - const vignetteScaleGeometricMean = Math.sqrt(vignetteScaleX * vignetteScaleY); - vignetteScaleX = Mix(vignetteScaleX, vignetteScaleGeometricMean, this.vignetteStretch); - vignetteScaleY = Mix(vignetteScaleY, vignetteScaleGeometricMean, this.vignetteStretch); - effect.setFloat4("vignetteSettings1", vignetteScaleX, vignetteScaleY, -vignetteScaleX * this.vignetteCenterX, -vignetteScaleY * this.vignetteCenterY); - const vignettePower = -2 * this.vignetteWeight; - effect.setFloat4("vignetteSettings2", this.vignetteColor.r, this.vignetteColor.g, this.vignetteColor.b, vignettePower); + } + if (this.name.startsWith("data:") && this.url === this.name) { + this.url = ""; + } + const serializationObject = super.serialize(_Texture._SerializeInternalTextureUniqueId); + if (!serializationObject) { + return null; + } + if (_Texture.SerializeBuffers || _Texture.ForceSerializeBuffers) { + if (typeof this._buffer === "string" && this._buffer.substr(0, 5) === "data:") { + serializationObject.base64String = this._buffer; + serializationObject.name = serializationObject.name.replace("data:", ""); + } else if (this.url && this.url.startsWith("data:") && this._buffer instanceof Uint8Array) { + serializationObject.base64String = "data:image/png;base64," + EncodeArrayBufferToBase64(this._buffer); + } else if (_Texture.ForceSerializeBuffers || this.url && this.url.startsWith("blob:") || this._forceSerialize) { + serializationObject.base64String = !this._engine || this._engine._features.supportSyncTextureRead ? GenerateBase64StringFromTexture(this) : GenerateBase64StringFromTextureAsync(this); } } - effect.setFloat("exposureLinear", this.exposure); - effect.setFloat("contrast", this.contrast); - if (this.colorGradingTexture) { - effect.setTexture("txColorTransform", this.colorGradingTexture); - const textureSize = this.colorGradingTexture.getSize().height; - effect.setFloat4( - "colorTransformSettings", - (textureSize - 1) / textureSize, - // textureScale - 0.5 / textureSize, - // textureOffset - textureSize, - // textureSize - this.colorGradingTexture.level - // weight - ); + serializationObject.invertY = this._invertY; + serializationObject.samplingMode = this.samplingMode; + serializationObject._creationFlags = this._creationFlags; + serializationObject._useSRGBBuffer = this._useSRGBBuffer; + if (_Texture._SerializeInternalTextureUniqueId) { + serializationObject.internalTextureUniqueId = ((_a = this._texture) == null ? void 0 : _a.uniqueId) ?? void 0; } + serializationObject.noMipmap = this._noMipmap; + this.name = savedName; + return serializationObject; } /** - * Clones the current image processing instance. - * @returns The cloned image processing + * Get the current class name of the texture useful for serialization or dynamic coding. + * @returns "Texture" */ - clone() { - return SerializationHelper.Clone(() => new _ImageProcessingConfiguration(), this); + getClassName() { + return "Texture"; } /** - * Serializes the current image processing instance to a json representation. - * @returns a JSON representation + * Dispose the texture and release its associated resources. */ - serialize() { - return SerializationHelper.Serialize(this); + dispose() { + super.dispose(); + this.onLoadObservable.clear(); + this._delayedOnLoad = null; + this._delayedOnError = null; + this._buffer = null; } /** - * Parses the image processing from a json representation. - * @param source the JSON source to parse - * @returns The parsed image processing + * Parse the JSON representation of a texture in order to recreate the texture in the given scene. + * @param parsedTexture Define the JSON representation of the texture + * @param scene Define the scene the parsed texture should be instantiated in + * @param rootUrl Define the root url of the parsing sequence in the case of relative dependencies + * @returns The parsed texture if successful */ - static Parse(source) { - const parsed = SerializationHelper.Parse(() => new _ImageProcessingConfiguration(), source, null, null); - if (source.vignetteCentreX !== void 0) { - parsed.vignetteCenterX = source.vignetteCentreX; + static Parse(parsedTexture, scene, rootUrl) { + if (parsedTexture.customType) { + const customTexture = InstantiationTools.Instantiate(parsedTexture.customType); + const parsedCustomTexture = customTexture.Parse(parsedTexture, scene, rootUrl); + if (parsedTexture.samplingMode && parsedCustomTexture.updateSamplingMode && parsedCustomTexture._samplingMode) { + if (parsedCustomTexture._samplingMode !== parsedTexture.samplingMode) { + parsedCustomTexture.updateSamplingMode(parsedTexture.samplingMode); + } + } + return parsedCustomTexture; } - if (source.vignetteCentreY !== void 0) { - parsed.vignetteCenterY = source.vignetteCentreY; + if (parsedTexture.isCube && !parsedTexture.isRenderTarget) { + return _Texture._CubeTextureParser(parsedTexture, scene, rootUrl); } - return parsed; + const hasInternalTextureUniqueId = parsedTexture.internalTextureUniqueId !== void 0; + if (!parsedTexture.name && !parsedTexture.isRenderTarget && !hasInternalTextureUniqueId) { + return null; + } + let internalTexture; + if (hasInternalTextureUniqueId) { + const cache = scene.getEngine().getLoadedTexturesCache(); + for (const texture2 of cache) { + if (texture2.uniqueId === parsedTexture.internalTextureUniqueId) { + internalTexture = texture2; + break; + } + } + } + const onLoaded = (texture2) => { + var _a; + if (texture2 && texture2._texture) { + texture2._texture._cachedWrapU = null; + texture2._texture._cachedWrapV = null; + texture2._texture._cachedWrapR = null; + } + if (parsedTexture.samplingMode) { + const sampling = parsedTexture.samplingMode; + if (texture2 && texture2.samplingMode !== sampling) { + texture2.updateSamplingMode(sampling); + } + } + if (texture2 && parsedTexture.animations) { + for (let animationIndex = 0; animationIndex < parsedTexture.animations.length; animationIndex++) { + const parsedAnimation = parsedTexture.animations[animationIndex]; + const internalClass = GetClass("BABYLON.Animation"); + if (internalClass) { + texture2.animations.push(internalClass.Parse(parsedAnimation)); + } + } + } + if (hasInternalTextureUniqueId && !internalTexture) { + (_a = texture2 == null ? void 0 : texture2._texture) == null ? void 0 : _a._setUniqueId(parsedTexture.internalTextureUniqueId); + } + }; + const texture = SerializationHelper.Parse(() => { + let generateMipMaps = true; + if (parsedTexture.noMipmap) { + generateMipMaps = false; + } + if (parsedTexture.mirrorPlane) { + const mirrorTexture = _Texture._CreateMirror(parsedTexture.name, parsedTexture.renderTargetSize, scene, generateMipMaps); + mirrorTexture._waitingRenderList = parsedTexture.renderList; + mirrorTexture.mirrorPlane = Plane.FromArray(parsedTexture.mirrorPlane); + onLoaded(mirrorTexture); + return mirrorTexture; + } else if (parsedTexture.isRenderTarget) { + let renderTargetTexture = null; + if (parsedTexture.isCube) { + if (scene.reflectionProbes) { + for (let index = 0; index < scene.reflectionProbes.length; index++) { + const probe = scene.reflectionProbes[index]; + if (probe.name === parsedTexture.name) { + return probe.cubeTexture; + } + } + } + } else { + renderTargetTexture = _Texture._CreateRenderTargetTexture(parsedTexture.name, parsedTexture.renderTargetSize, scene, generateMipMaps, parsedTexture._creationFlags ?? 0); + renderTargetTexture._waitingRenderList = parsedTexture.renderList; + } + onLoaded(renderTargetTexture); + return renderTargetTexture; + } else if (parsedTexture.isVideo) { + const texture2 = _Texture._CreateVideoTexture(rootUrl + (parsedTexture.url || parsedTexture.name), rootUrl + (parsedTexture.src || parsedTexture.url), scene, generateMipMaps, parsedTexture.invertY, parsedTexture.samplingMode, parsedTexture.settings || {}); + onLoaded(texture2); + return texture2; + } else { + let texture2; + if (parsedTexture.base64String && !internalTexture) { + texture2 = _Texture.CreateFromBase64String(parsedTexture.base64String, parsedTexture.base64String, scene, !generateMipMaps, parsedTexture.invertY, parsedTexture.samplingMode, () => { + onLoaded(texture2); + }, parsedTexture._creationFlags ?? 0, parsedTexture._useSRGBBuffer ?? false); + texture2.name = parsedTexture.name; + } else { + let url; + if (parsedTexture.name && (parsedTexture.name.indexOf("://") > 0 || parsedTexture.name.startsWith("data:"))) { + url = parsedTexture.name; + } else { + url = rootUrl + parsedTexture.name; + } + if (parsedTexture.url && (parsedTexture.url.startsWith("data:") || _Texture.UseSerializedUrlIfAny)) { + url = parsedTexture.url; + } + const options = { + noMipmap: !generateMipMaps, + invertY: parsedTexture.invertY, + samplingMode: parsedTexture.samplingMode, + onLoad: () => { + onLoaded(texture2); + }, + internalTexture + }; + texture2 = new _Texture(url, scene, options); + } + return texture2; + } + }, parsedTexture, scene); + return texture; } /** - * Used to apply the vignette as a mix with the pixel color. + * Creates a texture from its base 64 representation. + * @param data Define the base64 payload without the data: prefix + * @param name Define the name of the texture in the scene useful fo caching purpose for instance + * @param scene Define the scene the texture should belong to + * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture + * @param invertY define if the texture needs to be inverted on the y axis during loading + * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...) + * @param onLoad define a callback triggered when the texture has been loaded + * @param onError define a callback triggered when an error occurred during the loading session + * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...) + * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg) + * @param forcedExtension defines the extension to use to pick the right loader + * @returns the created texture */ - static get VIGNETTEMODE_MULTIPLY() { - return this._VIGNETTEMODE_MULTIPLY; + static CreateFromBase64String(data, name69, scene, noMipmapOrOptions, invertY, samplingMode = _Texture.TRILINEAR_SAMPLINGMODE, onLoad = null, onError = null, format = 5, creationFlags, forcedExtension) { + return new _Texture("data:" + name69, scene, noMipmapOrOptions, invertY, samplingMode, onLoad, onError, data, false, format, void 0, void 0, creationFlags, forcedExtension); } /** - * Used to apply the vignette as a replacement of the pixel color. + * Creates a texture from its data: representation. (data: will be added in case only the payload has been passed in) + * @param name Define the name of the texture in the scene useful fo caching purpose for instance + * @param buffer define the buffer to load the texture from in case the texture is loaded from a buffer representation + * @param scene Define the scene the texture should belong to + * @param deleteBuffer define if the buffer we are loading the texture from should be deleted after load + * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture + * @param invertY define if the texture needs to be inverted on the y axis during loading + * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...) + * @param onLoad define a callback triggered when the texture has been loaded + * @param onError define a callback triggered when an error occurred during the loading session + * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...) + * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg) + * @param forcedExtension defines the extension to use to pick the right loader + * @returns the created texture */ - static get VIGNETTEMODE_OPAQUE() { - return this._VIGNETTEMODE_OPAQUE; + static LoadFromDataString(name69, buffer, scene, deleteBuffer = false, noMipmapOrOptions, invertY = true, samplingMode = _Texture.TRILINEAR_SAMPLINGMODE, onLoad = null, onError = null, format = 5, creationFlags, forcedExtension) { + if (name69.substr(0, 5) !== "data:") { + name69 = "data:" + name69; + } + return new _Texture(name69, scene, noMipmapOrOptions, invertY, samplingMode, onLoad, onError, buffer, deleteBuffer, format, void 0, void 0, creationFlags, forcedExtension); } }; -ImageProcessingConfiguration.TONEMAPPING_STANDARD = 0; -ImageProcessingConfiguration.TONEMAPPING_ACES = 1; -ImageProcessingConfiguration.PrepareUniforms = PrepareUniformsForImageProcessing; -ImageProcessingConfiguration.PrepareSamplers = PrepareSamplersForImageProcessing; -ImageProcessingConfiguration._VIGNETTEMODE_MULTIPLY = 0; -ImageProcessingConfiguration._VIGNETTEMODE_OPAQUE = 1; -__decorate([ - serializeAsColorCurves() -], ImageProcessingConfiguration.prototype, "colorCurves", void 0); -__decorate([ - serialize() -], ImageProcessingConfiguration.prototype, "_colorCurvesEnabled", void 0); -__decorate([ - serializeAsTexture("colorGradingTexture") -], ImageProcessingConfiguration.prototype, "_colorGradingTexture", void 0); -__decorate([ - serialize() -], ImageProcessingConfiguration.prototype, "_colorGradingEnabled", void 0); -__decorate([ - serialize() -], ImageProcessingConfiguration.prototype, "_colorGradingWithGreenDepth", void 0); -__decorate([ - serialize() -], ImageProcessingConfiguration.prototype, "_colorGradingBGR", void 0); -__decorate([ - serialize() -], ImageProcessingConfiguration.prototype, "_exposure", void 0); -__decorate([ - serialize() -], ImageProcessingConfiguration.prototype, "_toneMappingEnabled", void 0); -__decorate([ - serialize() -], ImageProcessingConfiguration.prototype, "_toneMappingType", void 0); -__decorate([ - serialize() -], ImageProcessingConfiguration.prototype, "_contrast", void 0); +Texture.SerializeBuffers = true; +Texture.ForceSerializeBuffers = false; +Texture.OnTextureLoadErrorObservable = new Observable(); +Texture._SerializeInternalTextureUniqueId = false; +Texture._CubeTextureParser = (jsonTexture, scene, rootUrl) => { + throw _WarnImport("CubeTexture"); +}; +Texture._CreateMirror = (name69, renderTargetSize, scene, generateMipMaps) => { + throw _WarnImport("MirrorTexture"); +}; +Texture._CreateRenderTargetTexture = (name69, renderTargetSize, scene, generateMipMaps, creationFlags) => { + throw _WarnImport("RenderTargetTexture"); +}; +Texture.NEAREST_SAMPLINGMODE = 1; +Texture.NEAREST_NEAREST_MIPLINEAR = 8; +Texture.BILINEAR_SAMPLINGMODE = 2; +Texture.LINEAR_LINEAR_MIPNEAREST = 11; +Texture.TRILINEAR_SAMPLINGMODE = 3; +Texture.LINEAR_LINEAR_MIPLINEAR = 3; +Texture.NEAREST_NEAREST_MIPNEAREST = 4; +Texture.NEAREST_LINEAR_MIPNEAREST = 5; +Texture.NEAREST_LINEAR_MIPLINEAR = 6; +Texture.NEAREST_LINEAR = 7; +Texture.NEAREST_NEAREST = 1; +Texture.LINEAR_NEAREST_MIPNEAREST = 9; +Texture.LINEAR_NEAREST_MIPLINEAR = 10; +Texture.LINEAR_LINEAR = 2; +Texture.LINEAR_NEAREST = 12; +Texture.EXPLICIT_MODE = 0; +Texture.SPHERICAL_MODE = 1; +Texture.PLANAR_MODE = 2; +Texture.CUBIC_MODE = 3; +Texture.PROJECTION_MODE = 4; +Texture.SKYBOX_MODE = 5; +Texture.INVCUBIC_MODE = 6; +Texture.EQUIRECTANGULAR_MODE = 7; +Texture.FIXED_EQUIRECTANGULAR_MODE = 8; +Texture.FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9; +Texture.CLAMP_ADDRESSMODE = 0; +Texture.WRAP_ADDRESSMODE = 1; +Texture.MIRROR_ADDRESSMODE = 2; +Texture.UseSerializedUrlIfAny = false; __decorate([ serialize() -], ImageProcessingConfiguration.prototype, "vignetteStretch", void 0); +], Texture.prototype, "url", void 0); __decorate([ serialize() -], ImageProcessingConfiguration.prototype, "vignetteCenterX", void 0); +], Texture.prototype, "uOffset", void 0); __decorate([ serialize() -], ImageProcessingConfiguration.prototype, "vignetteCenterY", void 0); +], Texture.prototype, "vOffset", void 0); __decorate([ serialize() -], ImageProcessingConfiguration.prototype, "vignetteWeight", void 0); +], Texture.prototype, "uScale", void 0); __decorate([ - serializeAsColor4() -], ImageProcessingConfiguration.prototype, "vignetteColor", void 0); + serialize() +], Texture.prototype, "vScale", void 0); __decorate([ serialize() -], ImageProcessingConfiguration.prototype, "vignetteCameraFov", void 0); +], Texture.prototype, "uAng", void 0); __decorate([ serialize() -], ImageProcessingConfiguration.prototype, "_vignetteBlendMode", void 0); +], Texture.prototype, "vAng", void 0); __decorate([ serialize() -], ImageProcessingConfiguration.prototype, "_vignetteEnabled", void 0); +], Texture.prototype, "wAng", void 0); __decorate([ serialize() -], ImageProcessingConfiguration.prototype, "_ditheringEnabled", void 0); +], Texture.prototype, "uRotationCenter", void 0); __decorate([ serialize() -], ImageProcessingConfiguration.prototype, "_ditheringIntensity", void 0); +], Texture.prototype, "vRotationCenter", void 0); __decorate([ serialize() -], ImageProcessingConfiguration.prototype, "_skipFinalColorClamp", void 0); +], Texture.prototype, "wRotationCenter", void 0); __decorate([ serialize() -], ImageProcessingConfiguration.prototype, "_applyByPostProcess", void 0); +], Texture.prototype, "homogeneousRotationInUVTransform", void 0); __decorate([ serialize() -], ImageProcessingConfiguration.prototype, "_isEnabled", void 0); -SerializationHelper._ImageProcessingConfigurationParser = ImageProcessingConfiguration.Parse; +], Texture.prototype, "isBlocking", null); +RegisterClass("BABYLON.Texture", Texture); +SerializationHelper._TextureParser = Texture.Parse; -// node_modules/@babylonjs/core/Engines/Extensions/engine.uniformBuffer.js -ThinEngine.prototype.createUniformBuffer = function(elements, _label) { - const ubo = this._gl.createBuffer(); - if (!ubo) { - throw new Error("Unable to create uniform buffer"); - } - const result = new WebGLDataBuffer(ubo); - this.bindUniformBuffer(result); - if (elements instanceof Float32Array) { - this._gl.bufferData(this._gl.UNIFORM_BUFFER, elements, this._gl.STATIC_DRAW); - } else { - this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(elements), this._gl.STATIC_DRAW); +// node_modules/@babylonjs/core/Engines/Extensions/engine.dynamicTexture.js +ThinEngine.prototype.createDynamicTexture = function(width, height, generateMipMaps, samplingMode) { + const texture = new InternalTexture(this, InternalTextureSource.Dynamic); + texture.baseWidth = width; + texture.baseHeight = height; + if (generateMipMaps) { + width = this.needPOTTextures ? ThinEngine.GetExponentOfTwo(width, this._caps.maxTextureSize) : width; + height = this.needPOTTextures ? ThinEngine.GetExponentOfTwo(height, this._caps.maxTextureSize) : height; } - this.bindUniformBuffer(null); - result.references = 1; - return result; + texture.width = width; + texture.height = height; + texture.isReady = false; + texture.generateMipMaps = generateMipMaps; + texture.samplingMode = samplingMode; + this.updateTextureSamplingMode(samplingMode, texture); + this._internalTexturesCache.push(texture); + return texture; }; -ThinEngine.prototype.createDynamicUniformBuffer = function(elements, _label) { - const ubo = this._gl.createBuffer(); - if (!ubo) { - throw new Error("Unable to create dynamic uniform buffer"); +ThinEngine.prototype.updateDynamicTexture = function(texture, source, invertY, premulAlpha = false, format, forceBindTexture = false, allowGPUOptimization = false) { + if (!texture) { + return; } - const result = new WebGLDataBuffer(ubo); - this.bindUniformBuffer(result); - if (elements instanceof Float32Array) { - this._gl.bufferData(this._gl.UNIFORM_BUFFER, elements, this._gl.DYNAMIC_DRAW); - } else { - this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(elements), this._gl.DYNAMIC_DRAW); + const gl = this._gl; + const target = gl.TEXTURE_2D; + const wasPreviouslyBound = this._bindTextureDirectly(target, texture, true, forceBindTexture); + this._unpackFlipY(invertY === void 0 ? texture.invertY : invertY); + if (premulAlpha) { + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 1); } - this.bindUniformBuffer(null); - result.references = 1; - return result; -}; -ThinEngine.prototype.updateUniformBuffer = function(uniformBuffer, elements, offset, count) { - this.bindUniformBuffer(uniformBuffer); - if (offset === void 0) { - offset = 0; + const textureType = this._getWebGLTextureType(texture.type); + const glformat = this._getInternalFormat(format ? format : texture.format); + const internalFormat = this._getRGBABufferInternalSizedFormat(texture.type, glformat); + gl.texImage2D(target, 0, internalFormat, glformat, textureType, source); + if (texture.generateMipMaps) { + gl.generateMipmap(target); } - if (count === void 0) { - if (elements instanceof Float32Array) { - this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, offset, elements); - } else { - this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, offset, new Float32Array(elements)); - } - } else { - if (elements instanceof Float32Array) { - this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, elements.subarray(offset, offset + count)); - } else { - this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, new Float32Array(elements).subarray(offset, offset + count)); - } + if (!wasPreviouslyBound) { + this._bindTextureDirectly(target, null); } - this.bindUniformBuffer(null); -}; -ThinEngine.prototype.bindUniformBuffer = function(buffer) { - this._gl.bindBuffer(this._gl.UNIFORM_BUFFER, buffer ? buffer.underlyingResource : null); -}; -ThinEngine.prototype.bindUniformBufferBase = function(buffer, location2, name69) { - this._gl.bindBufferBase(this._gl.UNIFORM_BUFFER, location2, buffer ? buffer.underlyingResource : null); -}; -ThinEngine.prototype.bindUniformBlock = function(pipelineContext, blockName, index) { - const program = pipelineContext.program; - const uniformLocation = this._gl.getUniformBlockIndex(program, blockName); - if (uniformLocation !== 4294967295) { - this._gl.uniformBlockBinding(program, uniformLocation, index); + if (premulAlpha) { + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0); } + if (format) { + texture.format = format; + } + texture._dynamicTextureSource = source; + texture._premulAlpha = premulAlpha; + texture.invertY = invertY || false; + texture.isReady = true; }; -// node_modules/@babylonjs/core/Materials/uniformBuffer.js -var UniformBuffer = class _UniformBuffer { +// node_modules/@babylonjs/core/Materials/Textures/dynamicTexture.js +var DynamicTexture = class _DynamicTexture extends Texture { /** - * Instantiates a new Uniform buffer objects. - * - * Handles blocks of uniform on the GPU. - * - * If WebGL 2 is not available, this class falls back on traditional setUniformXXX calls. - * - * For more information, please refer to : - * @see https://www.khronos.org/opengl/wiki/Uniform_Buffer_Object - * @param engine Define the engine the buffer is associated with - * @param data Define the data contained in the buffer - * @param dynamic Define if the buffer is updatable - * @param name to assign to the buffer (debugging purpose) - * @param forceNoUniformBuffer define that this object must not rely on UBO objects + * Creates a DynamicTexture + * @param name defines the name of the texture + * @param options provides 3 alternatives for width and height of texture, a canvas, object with width and height properties, number for both width and height + * @param scene defines the scene where you want the texture + * @param generateMipMaps defines the use of MinMaps or not (default is false) + * @param samplingMode defines the sampling mode to use (default is Texture.TRILINEAR_SAMPLINGMODE) + * @param format defines the texture format to use (default is Engine.TEXTUREFORMAT_RGBA) + * @param invertY defines if the texture needs to be inverted on the y axis during loading */ - constructor(engine, data, dynamic, name69, forceNoUniformBuffer = false) { - this._valueCache = {}; - this._engine = engine; - this._noUBO = !engine.supportsUniformBuffers || forceNoUniformBuffer; - this._dynamic = dynamic; - this._name = name69 ?? "no-name"; - this._data = data || []; - this._uniformLocations = {}; - this._uniformSizes = {}; - this._uniformArraySizes = {}; - this._uniformLocationPointer = 0; - this._needSync = false; - if (this._engine._features.trackUbosInFrame) { - this._buffers = []; - this._bufferIndex = -1; - this._createBufferOnWrite = false; - this._currentFrameId = 0; + constructor(name69, options, scene = null, generateMipMaps = false, samplingMode = 3, format = 5, invertY) { + super(null, scene, !generateMipMaps, invertY, samplingMode, void 0, void 0, void 0, void 0, format); + this.name = name69; + this.wrapU = Texture.CLAMP_ADDRESSMODE; + this.wrapV = Texture.CLAMP_ADDRESSMODE; + this._generateMipMaps = generateMipMaps; + const engine = this._getEngine(); + if (!engine) { + return; } - if (this._noUBO) { - this.updateMatrix3x3 = this._updateMatrix3x3ForEffect; - this.updateMatrix2x2 = this._updateMatrix2x2ForEffect; - this.updateFloat = this._updateFloatForEffect; - this.updateFloat2 = this._updateFloat2ForEffect; - this.updateFloat3 = this._updateFloat3ForEffect; - this.updateFloat4 = this._updateFloat4ForEffect; - this.updateFloatArray = this._updateFloatArrayForEffect; - this.updateArray = this._updateArrayForEffect; - this.updateIntArray = this._updateIntArrayForEffect; - this.updateUIntArray = this._updateUIntArrayForEffect; - this.updateMatrix = this._updateMatrixForEffect; - this.updateMatrices = this._updateMatricesForEffect; - this.updateVector3 = this._updateVector3ForEffect; - this.updateVector4 = this._updateVector4ForEffect; - this.updateColor3 = this._updateColor3ForEffect; - this.updateColor4 = this._updateColor4ForEffect; - this.updateDirectColor4 = this._updateDirectColor4ForEffect; - this.updateInt = this._updateIntForEffect; - this.updateInt2 = this._updateInt2ForEffect; - this.updateInt3 = this._updateInt3ForEffect; - this.updateInt4 = this._updateInt4ForEffect; - this.updateUInt = this._updateUIntForEffect; - this.updateUInt2 = this._updateUInt2ForEffect; - this.updateUInt3 = this._updateUInt3ForEffect; - this.updateUInt4 = this._updateUInt4ForEffect; + if (options.getContext) { + this._canvas = options; + this._ownCanvas = false; + this._texture = engine.createDynamicTexture(options.width, options.height, generateMipMaps, samplingMode); } else { - this._engine._uniformBuffers.push(this); - this.updateMatrix3x3 = this._updateMatrix3x3ForUniform; - this.updateMatrix2x2 = this._updateMatrix2x2ForUniform; - this.updateFloat = this._updateFloatForUniform; - this.updateFloat2 = this._updateFloat2ForUniform; - this.updateFloat3 = this._updateFloat3ForUniform; - this.updateFloat4 = this._updateFloat4ForUniform; - this.updateFloatArray = this._updateFloatArrayForUniform; - this.updateArray = this._updateArrayForUniform; - this.updateIntArray = this._updateIntArrayForUniform; - this.updateUIntArray = this._updateUIntArrayForUniform; - this.updateMatrix = this._updateMatrixForUniform; - this.updateMatrices = this._updateMatricesForUniform; - this.updateVector3 = this._updateVector3ForUniform; - this.updateVector4 = this._updateVector4ForUniform; - this.updateColor3 = this._updateColor3ForUniform; - this.updateColor4 = this._updateColor4ForUniform; - this.updateDirectColor4 = this._updateDirectColor4ForUniform; - this.updateInt = this._updateIntForUniform; - this.updateInt2 = this._updateInt2ForUniform; - this.updateInt3 = this._updateInt3ForUniform; - this.updateInt4 = this._updateInt4ForUniform; - this.updateUInt = this._updateUIntForUniform; - this.updateUInt2 = this._updateUInt2ForUniform; - this.updateUInt3 = this._updateUInt3ForUniform; - this.updateUInt4 = this._updateUInt4ForUniform; + this._canvas = engine.createCanvas(1, 1); + this._ownCanvas = true; + if (options.width || options.width === 0) { + this._texture = engine.createDynamicTexture(options.width, options.height, generateMipMaps, samplingMode); + } else { + this._texture = engine.createDynamicTexture(options, options, generateMipMaps, samplingMode); + } + } + const textureSize = this.getSize(); + if (this._canvas.width !== textureSize.width) { + this._canvas.width = textureSize.width; + } + if (this._canvas.height !== textureSize.height) { + this._canvas.height = textureSize.height; } + this._context = this._canvas.getContext("2d"); } /** - * Indicates if the buffer is using the WebGL2 UBO implementation, - * or just falling back on setUniformXXX calls. + * Get the current class name of the texture useful for serialization or dynamic coding. + * @returns "DynamicTexture" */ - get useUbo() { - return !this._noUBO; + getClassName() { + return "DynamicTexture"; } /** - * Indicates if the WebGL underlying uniform buffer is in sync - * with the javascript cache data. + * Gets the current state of canRescale */ - get isSync() { - return !this._needSync; + get canRescale() { + return true; + } + _recreate(textureSize) { + this._canvas.width = textureSize.width; + this._canvas.height = textureSize.height; + this.releaseInternalTexture(); + this._texture = this._getEngine().createDynamicTexture(textureSize.width, textureSize.height, this._generateMipMaps, this.samplingMode); } /** - * Indicates if the WebGL underlying uniform buffer is dynamic. - * Also, a dynamic UniformBuffer will disable cache verification and always - * update the underlying WebGL uniform buffer to the GPU. - * @returns if Dynamic, otherwise false + * Scales the texture + * @param ratio the scale factor to apply to both width and height */ - isDynamic() { - return this._dynamic !== void 0; + scale(ratio) { + const textureSize = this.getSize(); + textureSize.width *= ratio; + textureSize.height *= ratio; + this._recreate(textureSize); } /** - * The data cache on JS side. - * @returns the underlying data as a float array + * Resizes the texture + * @param width the new width + * @param height the new height */ - getData() { - return this._bufferData; + scaleTo(width, height) { + const textureSize = this.getSize(); + textureSize.width = width; + textureSize.height = height; + this._recreate(textureSize); } /** - * The underlying WebGL Uniform buffer. - * @returns the webgl buffer + * Gets the context of the canvas used by the texture + * @returns the canvas context of the dynamic texture */ - getBuffer() { - return this._buffer; + getContext() { + return this._context; } /** - * std140 layout specifies how to align data within an UBO structure. - * See https://khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf#page=159 - * for specs. - * @param size + * Clears the texture + * @param clearColor Defines the clear color to use */ - _fillAlignment(size) { - let alignment; - if (size <= 2) { - alignment = size; - } else { - alignment = 4; - } - if (this._uniformLocationPointer % alignment !== 0) { - const oldPointer = this._uniformLocationPointer; - this._uniformLocationPointer += alignment - this._uniformLocationPointer % alignment; - const diff = this._uniformLocationPointer - oldPointer; - for (let i = 0; i < diff; i++) { - this._data.push(0); - } + clear(clearColor) { + const size = this.getSize(); + if (clearColor) { + this._context.fillStyle = clearColor; } + this._context.clearRect(0, 0, size.width, size.height); } /** - * Adds an uniform in the buffer. - * Warning : the subsequents calls of this function must be in the same order as declared in the shader - * for the layout to be correct ! The addUniform function only handles types like float, vec2, vec3, vec4, mat4, - * meaning size=1,2,3,4 or 16. It does not handle struct types. - * @param name Name of the uniform, as used in the uniform block in the shader. - * @param size Data size, or data directly. - * @param arraySize The number of elements in the array, 0 if not an array. + * Updates the texture + * @param invertY defines the direction for the Y axis (default is true - y increases downwards) + * @param premulAlpha defines if alpha is stored as premultiplied (default is false) + * @param allowGPUOptimization true to allow some specific GPU optimizations (subject to engine feature "allowGPUOptimizationsForGUI" being true) */ - addUniform(name69, size, arraySize = 0) { - if (this._noUBO) { - return; + update(invertY, premulAlpha = false, allowGPUOptimization = false) { + this._getEngine().updateDynamicTexture(this._texture, this._canvas, invertY === void 0 ? true : invertY, premulAlpha, this._format || void 0, void 0, allowGPUOptimization); + } + /** + * Draws text onto the texture + * @param text defines the text to be drawn + * @param x defines the placement of the text from the left + * @param y defines the placement of the text from the top when invertY is true and from the bottom when false + * @param font defines the font to be used with font-style, font-size, font-name + * @param color defines the color used for the text + * @param fillColor defines the color for the canvas, use null to not overwrite canvas (this bleands with the background to replace, use the clear function) + * @param invertY defines the direction for the Y axis (default is true - y increases downwards) + * @param update defines whether texture is immediately update (default is true) + */ + drawText(text, x, y, font, color, fillColor, invertY, update = true) { + const size = this.getSize(); + if (fillColor) { + this._context.fillStyle = fillColor; + this._context.fillRect(0, 0, size.width, size.height); } - if (this._uniformLocations[name69] !== void 0) { - return; + this._context.font = font; + if (x === null || x === void 0) { + const textSize = this._context.measureText(text); + x = (size.width - textSize.width) / 2; } - let data; - if (arraySize > 0) { - if (size instanceof Array) { - throw "addUniform should not be use with Array in UBO: " + name69; - } - this._fillAlignment(4); - this._uniformArraySizes[name69] = { strideSize: size, arraySize }; - if (size == 16) { - size = size * arraySize; - } else { - const perElementPadding = 4 - size; - const totalPadding = perElementPadding * arraySize; - size = size * arraySize + totalPadding; - } - data = []; - for (let i = 0; i < size; i++) { - data.push(0); - } - } else { - if (size instanceof Array) { - data = size; - size = data.length; - } else { - size = size; - data = []; - for (let i = 0; i < size; i++) { - data.push(0); - } - } - this._fillAlignment(size); + if (y === null || y === void 0) { + const fontSize = parseInt(font.replace(/\D/g, "")); + y = size.height / 2 + fontSize / 3.65; } - this._uniformSizes[name69] = size; - this._uniformLocations[name69] = this._uniformLocationPointer; - this._uniformLocationPointer += size; - for (let i = 0; i < size; i++) { - this._data.push(data[i]); + this._context.fillStyle = color || ""; + this._context.fillText(text, x, y); + if (update) { + this.update(invertY); } - this._needSync = true; - } - /** - * Adds a Matrix 4x4 to the uniform buffer. - * @param name Name of the uniform, as used in the uniform block in the shader. - * @param mat A 4x4 matrix. - */ - addMatrix(name69, mat) { - this.addUniform(name69, Array.prototype.slice.call(mat.asArray())); } /** - * Adds a vec2 to the uniform buffer. - * @param name Name of the uniform, as used in the uniform block in the shader. - * @param x Define the x component value of the vec2 - * @param y Define the y component value of the vec2 + * Disposes the dynamic texture. */ - addFloat2(name69, x, y) { - const temp = [x, y]; - this.addUniform(name69, temp); + dispose() { + var _a, _b; + super.dispose(); + if (this._ownCanvas) { + (_b = (_a = this._canvas) == null ? void 0 : _a.remove) == null ? void 0 : _b.call(_a); + } + this._canvas = null; + this._context = null; } /** - * Adds a vec3 to the uniform buffer. - * @param name Name of the uniform, as used in the uniform block in the shader. - * @param x Define the x component value of the vec3 - * @param y Define the y component value of the vec3 - * @param z Define the z component value of the vec3 + * Clones the texture + * @returns the clone of the texture. */ - addFloat3(name69, x, y, z) { - const temp = [x, y, z]; - this.addUniform(name69, temp); + clone() { + const scene = this.getScene(); + if (!scene) { + return this; + } + const textureSize = this.getSize(); + const newTexture = new _DynamicTexture(this.name, textureSize, scene, this._generateMipMaps); + newTexture.hasAlpha = this.hasAlpha; + newTexture.level = this.level; + newTexture.wrapU = this.wrapU; + newTexture.wrapV = this.wrapV; + return newTexture; } /** - * Adds a vec3 to the uniform buffer. - * @param name Name of the uniform, as used in the uniform block in the shader. - * @param color Define the vec3 from a Color + * Serializes the dynamic texture. The scene should be ready before the dynamic texture is serialized + * @returns a serialized dynamic texture object */ - addColor3(name69, color) { - const temp = [color.r, color.g, color.b]; - this.addUniform(name69, temp); + serialize() { + const scene = this.getScene(); + if (scene && !scene.isReady()) { + Logger.Warn("The scene must be ready before serializing the dynamic texture"); + } + const serializationObject = super.serialize(); + if (_DynamicTexture._IsCanvasElement(this._canvas)) { + serializationObject.base64String = this._canvas.toDataURL(); + } + serializationObject.invertY = this._invertY; + serializationObject.samplingMode = this.samplingMode; + return serializationObject; + } + static _IsCanvasElement(canvas) { + return canvas.toDataURL !== void 0; + } + /** @internal */ + _rebuild() { + this.update(); } +}; + +// node_modules/@babylonjs/core/Engines/constants.js +var Constants = class { +}; +Constants.ALPHA_DISABLE = 0; +Constants.ALPHA_ADD = 1; +Constants.ALPHA_COMBINE = 2; +Constants.ALPHA_SUBTRACT = 3; +Constants.ALPHA_MULTIPLY = 4; +Constants.ALPHA_MAXIMIZED = 5; +Constants.ALPHA_ONEONE = 6; +Constants.ALPHA_PREMULTIPLIED = 7; +Constants.ALPHA_PREMULTIPLIED_PORTERDUFF = 8; +Constants.ALPHA_INTERPOLATE = 9; +Constants.ALPHA_SCREENMODE = 10; +Constants.ALPHA_ONEONE_ONEONE = 11; +Constants.ALPHA_ALPHATOCOLOR = 12; +Constants.ALPHA_REVERSEONEMINUS = 13; +Constants.ALPHA_SRC_DSTONEMINUSSRCALPHA = 14; +Constants.ALPHA_ONEONE_ONEZERO = 15; +Constants.ALPHA_EXCLUSION = 16; +Constants.ALPHA_LAYER_ACCUMULATE = 17; +Constants.ALPHA_EQUATION_ADD = 0; +Constants.ALPHA_EQUATION_SUBSTRACT = 1; +Constants.ALPHA_EQUATION_REVERSE_SUBTRACT = 2; +Constants.ALPHA_EQUATION_MAX = 3; +Constants.ALPHA_EQUATION_MIN = 4; +Constants.ALPHA_EQUATION_DARKEN = 5; +Constants.DELAYLOADSTATE_NONE = 0; +Constants.DELAYLOADSTATE_LOADED = 1; +Constants.DELAYLOADSTATE_LOADING = 2; +Constants.DELAYLOADSTATE_NOTLOADED = 4; +Constants.NEVER = 512; +Constants.ALWAYS = 519; +Constants.LESS = 513; +Constants.EQUAL = 514; +Constants.LEQUAL = 515; +Constants.GREATER = 516; +Constants.GEQUAL = 518; +Constants.NOTEQUAL = 517; +Constants.KEEP = 7680; +Constants.ZERO = 0; +Constants.REPLACE = 7681; +Constants.INCR = 7682; +Constants.DECR = 7683; +Constants.INVERT = 5386; +Constants.INCR_WRAP = 34055; +Constants.DECR_WRAP = 34056; +Constants.TEXTURE_CLAMP_ADDRESSMODE = 0; +Constants.TEXTURE_WRAP_ADDRESSMODE = 1; +Constants.TEXTURE_MIRROR_ADDRESSMODE = 2; +Constants.TEXTURE_CREATIONFLAG_STORAGE = 1; +Constants.TEXTUREFORMAT_ALPHA = 0; +Constants.TEXTUREFORMAT_LUMINANCE = 1; +Constants.TEXTUREFORMAT_LUMINANCE_ALPHA = 2; +Constants.TEXTUREFORMAT_RGB = 4; +Constants.TEXTUREFORMAT_RGBA = 5; +Constants.TEXTUREFORMAT_RED = 6; +Constants.TEXTUREFORMAT_R = 6; +Constants.TEXTUREFORMAT_RG = 7; +Constants.TEXTUREFORMAT_RED_INTEGER = 8; +Constants.TEXTUREFORMAT_R_INTEGER = 8; +Constants.TEXTUREFORMAT_RG_INTEGER = 9; +Constants.TEXTUREFORMAT_RGB_INTEGER = 10; +Constants.TEXTUREFORMAT_RGBA_INTEGER = 11; +Constants.TEXTUREFORMAT_BGRA = 12; +Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 = 13; +Constants.TEXTUREFORMAT_DEPTH32_FLOAT = 14; +Constants.TEXTUREFORMAT_DEPTH16 = 15; +Constants.TEXTUREFORMAT_DEPTH24 = 16; +Constants.TEXTUREFORMAT_DEPTH24UNORM_STENCIL8 = 17; +Constants.TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8 = 18; +Constants.TEXTUREFORMAT_STENCIL8 = 19; +Constants.TEXTUREFORMAT_UNDEFINED = 4294967295; +Constants.TEXTUREFORMAT_COMPRESSED_RGBA_BPTC_UNORM = 36492; +Constants.TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 36493; +Constants.TEXTUREFORMAT_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 36495; +Constants.TEXTUREFORMAT_COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 36494; +Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT5 = 33779; +Constants.TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 35919; +Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT3 = 33778; +Constants.TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 35918; +Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT1 = 33777; +Constants.TEXTUREFORMAT_COMPRESSED_RGB_S3TC_DXT1 = 33776; +Constants.TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 35917; +Constants.TEXTUREFORMAT_COMPRESSED_SRGB_S3TC_DXT1_EXT = 35916; +Constants.TEXTUREFORMAT_COMPRESSED_RGBA_ASTC_4x4 = 37808; +Constants.TEXTUREFORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 37840; +Constants.TEXTUREFORMAT_COMPRESSED_RGB_ETC1_WEBGL = 36196; +Constants.TEXTUREFORMAT_COMPRESSED_RGB8_ETC2 = 37492; +Constants.TEXTUREFORMAT_COMPRESSED_SRGB8_ETC2 = 37493; +Constants.TEXTUREFORMAT_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 37494; +Constants.TEXTUREFORMAT_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 37495; +Constants.TEXTUREFORMAT_COMPRESSED_RGBA8_ETC2_EAC = 37496; +Constants.TEXTUREFORMAT_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 37497; +Constants.TEXTURETYPE_UNSIGNED_BYTE = 0; +Constants.TEXTURETYPE_UNSIGNED_INT = 0; +Constants.TEXTURETYPE_FLOAT = 1; +Constants.TEXTURETYPE_HALF_FLOAT = 2; +Constants.TEXTURETYPE_BYTE = 3; +Constants.TEXTURETYPE_SHORT = 4; +Constants.TEXTURETYPE_UNSIGNED_SHORT = 5; +Constants.TEXTURETYPE_INT = 6; +Constants.TEXTURETYPE_UNSIGNED_INTEGER = 7; +Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4 = 8; +Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1 = 9; +Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5 = 10; +Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV = 11; +Constants.TEXTURETYPE_UNSIGNED_INT_24_8 = 12; +Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV = 13; +Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV = 14; +Constants.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV = 15; +Constants.TEXTURETYPE_UNDEFINED = 16; +Constants.TEXTURE_2D = 3553; +Constants.TEXTURE_2D_ARRAY = 35866; +Constants.TEXTURE_CUBE_MAP = 34067; +Constants.TEXTURE_CUBE_MAP_ARRAY = 3735928559; +Constants.TEXTURE_3D = 32879; +Constants.TEXTURE_NEAREST_SAMPLINGMODE = 1; +Constants.TEXTURE_NEAREST_NEAREST = 1; +Constants.TEXTURE_BILINEAR_SAMPLINGMODE = 2; +Constants.TEXTURE_LINEAR_LINEAR = 2; +Constants.TEXTURE_TRILINEAR_SAMPLINGMODE = 3; +Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR = 3; +Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST = 4; +Constants.TEXTURE_NEAREST_LINEAR_MIPNEAREST = 5; +Constants.TEXTURE_NEAREST_LINEAR_MIPLINEAR = 6; +Constants.TEXTURE_NEAREST_LINEAR = 7; +Constants.TEXTURE_NEAREST_NEAREST_MIPLINEAR = 8; +Constants.TEXTURE_LINEAR_NEAREST_MIPNEAREST = 9; +Constants.TEXTURE_LINEAR_NEAREST_MIPLINEAR = 10; +Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST = 11; +Constants.TEXTURE_LINEAR_NEAREST = 12; +Constants.TEXTURE_EXPLICIT_MODE = 0; +Constants.TEXTURE_SPHERICAL_MODE = 1; +Constants.TEXTURE_PLANAR_MODE = 2; +Constants.TEXTURE_CUBIC_MODE = 3; +Constants.TEXTURE_PROJECTION_MODE = 4; +Constants.TEXTURE_SKYBOX_MODE = 5; +Constants.TEXTURE_INVCUBIC_MODE = 6; +Constants.TEXTURE_EQUIRECTANGULAR_MODE = 7; +Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MODE = 8; +Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9; +Constants.TEXTURE_FILTERING_QUALITY_OFFLINE = 4096; +Constants.TEXTURE_FILTERING_QUALITY_HIGH = 64; +Constants.TEXTURE_FILTERING_QUALITY_MEDIUM = 16; +Constants.TEXTURE_FILTERING_QUALITY_LOW = 8; +Constants.SCALEMODE_FLOOR = 1; +Constants.SCALEMODE_NEAREST = 2; +Constants.SCALEMODE_CEILING = 3; +Constants.MATERIAL_TextureDirtyFlag = 1; +Constants.MATERIAL_LightDirtyFlag = 2; +Constants.MATERIAL_FresnelDirtyFlag = 4; +Constants.MATERIAL_AttributesDirtyFlag = 8; +Constants.MATERIAL_MiscDirtyFlag = 16; +Constants.MATERIAL_PrePassDirtyFlag = 32; +Constants.MATERIAL_AllDirtyFlag = 63; +Constants.MATERIAL_TriangleFillMode = 0; +Constants.MATERIAL_WireFrameFillMode = 1; +Constants.MATERIAL_PointFillMode = 2; +Constants.MATERIAL_PointListDrawMode = 3; +Constants.MATERIAL_LineListDrawMode = 4; +Constants.MATERIAL_LineLoopDrawMode = 5; +Constants.MATERIAL_LineStripDrawMode = 6; +Constants.MATERIAL_TriangleStripDrawMode = 7; +Constants.MATERIAL_TriangleFanDrawMode = 8; +Constants.MATERIAL_ClockWiseSideOrientation = 0; +Constants.MATERIAL_CounterClockWiseSideOrientation = 1; +Constants.ACTION_NothingTrigger = 0; +Constants.ACTION_OnPickTrigger = 1; +Constants.ACTION_OnLeftPickTrigger = 2; +Constants.ACTION_OnRightPickTrigger = 3; +Constants.ACTION_OnCenterPickTrigger = 4; +Constants.ACTION_OnPickDownTrigger = 5; +Constants.ACTION_OnDoublePickTrigger = 6; +Constants.ACTION_OnPickUpTrigger = 7; +Constants.ACTION_OnPickOutTrigger = 16; +Constants.ACTION_OnLongPressTrigger = 8; +Constants.ACTION_OnPointerOverTrigger = 9; +Constants.ACTION_OnPointerOutTrigger = 10; +Constants.ACTION_OnEveryFrameTrigger = 11; +Constants.ACTION_OnIntersectionEnterTrigger = 12; +Constants.ACTION_OnIntersectionExitTrigger = 13; +Constants.ACTION_OnKeyDownTrigger = 14; +Constants.ACTION_OnKeyUpTrigger = 15; +Constants.PARTICLES_BILLBOARDMODE_Y = 2; +Constants.PARTICLES_BILLBOARDMODE_ALL = 7; +Constants.PARTICLES_BILLBOARDMODE_STRETCHED = 8; +Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL = 9; +Constants.MESHES_CULLINGSTRATEGY_STANDARD = 0; +Constants.MESHES_CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY = 1; +Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION = 2; +Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY = 3; +Constants.SCENELOADER_NO_LOGGING = 0; +Constants.SCENELOADER_MINIMAL_LOGGING = 1; +Constants.SCENELOADER_SUMMARY_LOGGING = 2; +Constants.SCENELOADER_DETAILED_LOGGING = 3; +Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE = 0; +Constants.PREPASS_POSITION_TEXTURE_TYPE = 1; +Constants.PREPASS_VELOCITY_TEXTURE_TYPE = 2; +Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE = 3; +Constants.PREPASS_COLOR_TEXTURE_TYPE = 4; +Constants.PREPASS_DEPTH_TEXTURE_TYPE = 5; +Constants.PREPASS_NORMAL_TEXTURE_TYPE = 6; +Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE = 7; +Constants.BUFFER_CREATIONFLAG_READ = 1; +Constants.BUFFER_CREATIONFLAG_WRITE = 2; +Constants.BUFFER_CREATIONFLAG_READWRITE = 3; +Constants.BUFFER_CREATIONFLAG_UNIFORM = 4; +Constants.BUFFER_CREATIONFLAG_VERTEX = 8; +Constants.BUFFER_CREATIONFLAG_INDEX = 16; +Constants.BUFFER_CREATIONFLAG_STORAGE = 32; +Constants.RENDERPASS_MAIN = 0; +Constants.INPUT_ALT_KEY = 18; +Constants.INPUT_CTRL_KEY = 17; +Constants.INPUT_META_KEY1 = 91; +Constants.INPUT_META_KEY2 = 92; +Constants.INPUT_META_KEY3 = 93; +Constants.INPUT_SHIFT_KEY = 16; +Constants.SNAPSHOTRENDERING_STANDARD = 0; +Constants.SNAPSHOTRENDERING_FAST = 1; +Constants.PERSPECTIVE_CAMERA = 0; +Constants.ORTHOGRAPHIC_CAMERA = 1; +Constants.FOVMODE_VERTICAL_FIXED = 0; +Constants.FOVMODE_HORIZONTAL_FIXED = 1; +Constants.RIG_MODE_NONE = 0; +Constants.RIG_MODE_STEREOSCOPIC_ANAGLYPH = 10; +Constants.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL = 11; +Constants.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED = 12; +Constants.RIG_MODE_STEREOSCOPIC_OVERUNDER = 13; +Constants.RIG_MODE_STEREOSCOPIC_INTERLACED = 14; +Constants.RIG_MODE_VR = 20; +Constants.RIG_MODE_CUSTOM = 22; +Constants.MAX_SUPPORTED_UV_SETS = 6; +Constants.GL_ALPHA_EQUATION_ADD = 32774; +Constants.GL_ALPHA_EQUATION_MIN = 32775; +Constants.GL_ALPHA_EQUATION_MAX = 32776; +Constants.GL_ALPHA_EQUATION_SUBTRACT = 32778; +Constants.GL_ALPHA_EQUATION_REVERSE_SUBTRACT = 32779; +Constants.GL_ALPHA_FUNCTION_SRC = 768; +Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR = 769; +Constants.GL_ALPHA_FUNCTION_SRC_ALPHA = 770; +Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA = 771; +Constants.GL_ALPHA_FUNCTION_DST_ALPHA = 772; +Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_ALPHA = 773; +Constants.GL_ALPHA_FUNCTION_DST_COLOR = 774; +Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_COLOR = 775; +Constants.GL_ALPHA_FUNCTION_SRC_ALPHA_SATURATED = 776; +Constants.GL_ALPHA_FUNCTION_CONSTANT_COLOR = 32769; +Constants.GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_COLOR = 32770; +Constants.GL_ALPHA_FUNCTION_CONSTANT_ALPHA = 32771; +Constants.GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_ALPHA = 32772; +Constants.SnippetUrl = "https://snippet.babylonjs.com"; +Constants.FOGMODE_NONE = 0; +Constants.FOGMODE_EXP = 1; +Constants.FOGMODE_EXP2 = 2; +Constants.FOGMODE_LINEAR = 3; +Constants.BYTE = 5120; +Constants.UNSIGNED_BYTE = 5121; +Constants.SHORT = 5122; +Constants.UNSIGNED_SHORT = 5123; +Constants.INT = 5124; +Constants.UNSIGNED_INT = 5125; +Constants.FLOAT = 5126; +Constants.PositionKind = "position"; +Constants.NormalKind = "normal"; +Constants.TangentKind = "tangent"; +Constants.UVKind = "uv"; +Constants.UV2Kind = "uv2"; +Constants.UV3Kind = "uv3"; +Constants.UV4Kind = "uv4"; +Constants.UV5Kind = "uv5"; +Constants.UV6Kind = "uv6"; +Constants.ColorKind = "color"; +Constants.ColorInstanceKind = "instanceColor"; +Constants.MatricesIndicesKind = "matricesIndices"; +Constants.MatricesWeightsKind = "matricesWeights"; +Constants.MatricesIndicesExtraKind = "matricesIndicesExtra"; +Constants.MatricesWeightsExtraKind = "matricesWeightsExtra"; + +// node_modules/@babylonjs/core/Events/clipboardEvents.js +var ClipboardEventTypes = class { +}; +ClipboardEventTypes.COPY = 1; +ClipboardEventTypes.CUT = 2; +ClipboardEventTypes.PASTE = 3; +var ClipboardInfo = class { /** - * Adds a vec4 to the uniform buffer. - * @param name Name of the uniform, as used in the uniform block in the shader. - * @param color Define the rgb components from a Color - * @param alpha Define the a component of the vec4 + *Creates an instance of ClipboardInfo. + * @param type Defines the type of event (BABYLON.ClipboardEventTypes) + * @param event Defines the related dom event */ - addColor4(name69, color, alpha) { - const temp = [color.r, color.g, color.b, alpha]; - this.addUniform(name69, temp); + constructor(type, event) { + this.type = type; + this.event = event; } /** - * Adds a vec3 to the uniform buffer. - * @param name Name of the uniform, as used in the uniform block in the shader. - * @param vector Define the vec3 components from a Vector + * Get the clipboard event's type from the keycode. + * @param keyCode Defines the keyCode for the current keyboard event. + * @returns {number} */ - addVector3(name69, vector) { - const temp = [vector.x, vector.y, vector.z]; - this.addUniform(name69, temp); + static GetTypeFromCharacter(keyCode) { + const charCode = keyCode; + switch (charCode) { + case 67: + return ClipboardEventTypes.COPY; + case 86: + return ClipboardEventTypes.PASTE; + case 88: + return ClipboardEventTypes.CUT; + default: + return -1; + } } +}; + +// node_modules/@babylonjs/core/Misc/smartArray.js +var SmartArray = class _SmartArray { /** - * Adds a Matrix 3x3 to the uniform buffer. - * @param name Name of the uniform, as used in the uniform block in the shader. + * Instantiates a Smart Array. + * @param capacity defines the default capacity of the array. */ - addMatrix3x3(name69) { - this.addUniform(name69, 12); + constructor(capacity) { + this.length = 0; + this.data = new Array(capacity); + this._id = _SmartArray._GlobalId++; } /** - * Adds a Matrix 2x2 to the uniform buffer. - * @param name Name of the uniform, as used in the uniform block in the shader. + * Pushes a value at the end of the active data. + * @param value defines the object to push in the array. */ - addMatrix2x2(name69) { - this.addUniform(name69, 8); + push(value) { + this.data[this.length++] = value; + if (this.length > this.data.length) { + this.data.length *= 2; + } } /** - * Effectively creates the WebGL Uniform Buffer, once layout is completed with `addUniform`. + * Iterates over the active data and apply the lambda to them. + * @param func defines the action to apply on each value. */ - create() { - if (this._noUBO) { - return; - } - if (this._buffer) { - return; + forEach(func) { + for (let index = 0; index < this.length; index++) { + func(this.data[index]); } - this._fillAlignment(4); - this._bufferData = new Float32Array(this._data); - this._rebuild(); - this._needSync = true; } - // The result of this method is used for debugging purpose, as part of the buffer name - // It is meant to more easily know what this buffer is about when debugging - // Some buffers can have a lot of uniforms (several dozens), so the method only returns the first 10 of them - // (should be enough to understand what the buffer is for) - _getNames() { - const names = []; - let i = 0; - for (const name69 in this._uniformLocations) { - names.push(name69); - if (++i === 10) { - break; - } + /** + * Sorts the full sets of data. + * @param compareFn defines the comparison function to apply. + */ + sort(compareFn) { + this.data.sort(compareFn); + } + /** + * Resets the active data to an empty array. + */ + reset() { + this.length = 0; + } + /** + * Releases all the data from the array as well as the array. + */ + dispose() { + this.reset(); + if (this.data) { + this.data.length = 0; } - return names.join(","); } - /** @internal */ - _rebuild() { - if (this._noUBO || !this._bufferData) { + /** + * Concats the active data with a given array. + * @param array defines the data to concatenate with. + */ + concat(array) { + if (array.length === 0) { return; } - if (this._dynamic) { - this._buffer = this._engine.createDynamicUniformBuffer(this._bufferData, this._name + "_UniformList:" + this._getNames()); - } else { - this._buffer = this._engine.createUniformBuffer(this._bufferData, this._name + "_UniformList:" + this._getNames()); + if (this.length + array.length > this.data.length) { + this.data.length = (this.length + array.length) * 2; } - if (this._engine._features.trackUbosInFrame) { - this._buffers.push([this._buffer, this._engine._features.checkUbosContentBeforeUpload ? this._bufferData.slice() : void 0]); - this._bufferIndex = this._buffers.length - 1; - this._createBufferOnWrite = false; + for (let index = 0; index < array.length; index++) { + this.data[this.length++] = (array.data || array)[index]; } } - /** @internal */ - _rebuildAfterContextLost() { - if (this._engine._features.trackUbosInFrame) { - this._buffers = []; - this._currentFrameId = 0; + /** + * Returns the position of a value in the active data. + * @param value defines the value to find the index for + * @returns the index if found in the active data otherwise -1 + */ + indexOf(value) { + const position = this.data.indexOf(value); + if (position >= this.length) { + return -1; } - this._rebuild(); - } - /** @internal */ - get _numBuffers() { - return this._buffers.length; - } - /** @internal */ - get _indexBuffer() { - return this._bufferIndex; + return position; } - /** Gets the name of this buffer */ - get name() { - return this._name; + /** + * Returns whether an element is part of the active data. + * @param value defines the value to look for + * @returns true if found in the active data otherwise false + */ + contains(value) { + return this.indexOf(value) !== -1; } - /** Gets the current effect */ - get currentEffect() { - return this._currentEffect; +}; +SmartArray._GlobalId = 0; +var SmartArrayNoDuplicate = class extends SmartArray { + constructor() { + super(...arguments); + this._duplicateId = 0; } - _buffersEqual(buf1, buf2) { - for (let i = 0; i < buf1.length; ++i) { - if (buf1[i] !== buf2[i]) { - return false; - } + /** + * Pushes a value at the end of the active data. + * THIS DOES NOT PREVENT DUPPLICATE DATA + * @param value defines the object to push in the array. + */ + push(value) { + super.push(value); + if (!value.__smartArrayFlags) { + value.__smartArrayFlags = {}; } - return true; + value.__smartArrayFlags[this._id] = this._duplicateId; } - _copyBuffer(src, dst) { - for (let i = 0; i < src.length; ++i) { - dst[i] = src[i]; + /** + * Pushes a value at the end of the active data. + * If the data is already present, it won t be added again + * @param value defines the object to push in the array. + * @returns true if added false if it was already present + */ + pushNoDuplicate(value) { + if (value.__smartArrayFlags && value.__smartArrayFlags[this._id] === this._duplicateId) { + return false; } + this.push(value); + return true; } /** - * Updates the WebGL Uniform Buffer on the GPU. - * If the `dynamic` flag is set to true, no cache comparison is done. - * Otherwise, the buffer will be updated only if the cache differs. + * Resets the active data to an empty array. */ - update() { - if (this._noUBO) { - return; - } - this.bindUniformBuffer(); - if (!this._buffer) { - this.create(); - return; - } - if (!this._dynamic && !this._needSync) { - this._createBufferOnWrite = this._engine._features.trackUbosInFrame; + reset() { + super.reset(); + this._duplicateId++; + } + /** + * Concats the active data with a given array. + * This ensures no duplicate will be present in the result. + * @param array defines the data to concatenate with. + */ + concatWithNoDuplicate(array) { + if (array.length === 0) { return; } - if (this._buffers && this._buffers.length > 1 && this._buffers[this._bufferIndex][1]) { - if (this._buffersEqual(this._bufferData, this._buffers[this._bufferIndex][1])) { - this._needSync = false; - this._createBufferOnWrite = this._engine._features.trackUbosInFrame; - return; - } else { - this._copyBuffer(this._bufferData, this._buffers[this._bufferIndex][1]); - } + if (this.length + array.length > this.data.length) { + this.data.length = (this.length + array.length) * 2; } - this._engine.updateUniformBuffer(this._buffer, this._bufferData); - if (this._engine._features._collectUbosUpdatedInFrame) { - if (!_UniformBuffer._UpdatedUbosInFrame[this._name]) { - _UniformBuffer._UpdatedUbosInFrame[this._name] = 0; - } - _UniformBuffer._UpdatedUbosInFrame[this._name]++; + for (let index = 0; index < array.length; index++) { + const item = (array.data || array)[index]; + this.pushNoDuplicate(item); } - this._needSync = false; - this._createBufferOnWrite = this._engine._features.trackUbosInFrame; } - _createNewBuffer() { - if (this._bufferIndex + 1 < this._buffers.length) { - this._bufferIndex++; - this._buffer = this._buffers[this._bufferIndex][0]; - this._createBufferOnWrite = false; - this._needSync = true; - } else { - this._rebuild(); - } +}; + +// node_modules/@babylonjs/core/Misc/stringDictionary.js +var StringDictionary = class { + constructor() { + this._count = 0; + this._data = {}; } - _checkNewFrame() { - if (this._engine._features.trackUbosInFrame && this._currentFrameId !== this._engine.frameId) { - this._currentFrameId = this._engine.frameId; - this._createBufferOnWrite = false; - if (this._buffers && this._buffers.length > 0) { - this._needSync = this._bufferIndex !== 0; - this._bufferIndex = 0; - this._buffer = this._buffers[this._bufferIndex][0]; - } else { - this._bufferIndex = -1; - } - } + /** + * This will clear this dictionary and copy the content from the 'source' one. + * If the T value is a custom object, it won't be copied/cloned, the same object will be used + * @param source the dictionary to take the content from and copy to this dictionary + */ + copyFrom(source) { + this.clear(); + source.forEach((t, v) => this.add(t, v)); } /** - * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU. - * @param uniformName Define the name of the uniform, as used in the uniform block in the shader. - * @param data Define the flattened data - * @param size Define the size of the data. + * Get a value based from its key + * @param key the given key to get the matching value from + * @returns the value if found, otherwise undefined is returned */ - updateUniform(uniformName, data, size) { - this._checkNewFrame(); - let location2 = this._uniformLocations[uniformName]; - if (location2 === void 0) { - if (this._buffer) { - Logger.Error("Cannot add an uniform after UBO has been created. uniformName=" + uniformName); - return; - } - this.addUniform(uniformName, size); - location2 = this._uniformLocations[uniformName]; - } - if (!this._buffer) { - this.create(); - } - if (!this._dynamic) { - let changed = false; - for (let i = 0; i < size; i++) { - if (size === 16 && !this._engine._features.uniformBufferHardCheckMatrix || this._bufferData[location2 + i] !== Math.fround(data[i])) { - changed = true; - if (this._createBufferOnWrite) { - this._createNewBuffer(); - } - this._bufferData[location2 + i] = data[i]; - } - } - this._needSync = this._needSync || changed; - } else { - for (let i = 0; i < size; i++) { - this._bufferData[location2 + i] = data[i]; - } + get(key) { + const val = this._data[key]; + if (val !== void 0) { + return val; } + return void 0; } /** - * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU. - * @param uniformName Define the name of the uniform, as used in the uniform block in the shader. - * @param data Define the flattened data - * @param size Define the size of the data. + * Get a value from its key or add it if it doesn't exist. + * This method will ensure you that a given key/data will be present in the dictionary. + * @param key the given key to get the matching value from + * @param factory the factory that will create the value if the key is not present in the dictionary. + * The factory will only be invoked if there's no data for the given key. + * @returns the value corresponding to the key. */ - updateUniformArray(uniformName, data, size) { - this._checkNewFrame(); - const location2 = this._uniformLocations[uniformName]; - if (location2 === void 0) { - Logger.Error("Cannot add an uniform Array dynamically. Please, add it using addUniform and make sure that uniform buffers are supported by the current engine."); - return; + getOrAddWithFactory(key, factory) { + let val = this.get(key); + if (val !== void 0) { + return val; } - if (!this._buffer) { - this.create(); + val = factory(key); + if (val) { + this.add(key, val); } - const arraySizes = this._uniformArraySizes[uniformName]; - if (!this._dynamic) { - let changed = false; - let countToFour = 0; - let baseStride = 0; - for (let i = 0; i < size; i++) { - if (this._bufferData[location2 + baseStride * 4 + countToFour] !== Tools.FloatRound(data[i])) { - changed = true; - if (this._createBufferOnWrite) { - this._createNewBuffer(); - } - this._bufferData[location2 + baseStride * 4 + countToFour] = data[i]; - } - countToFour++; - if (countToFour === arraySizes.strideSize) { - for (; countToFour < 4; countToFour++) { - this._bufferData[location2 + baseStride * 4 + countToFour] = 0; - } - countToFour = 0; - baseStride++; - } - } - this._needSync = this._needSync || changed; - } else { - for (let i = 0; i < size; i++) { - this._bufferData[location2 + i] = data[i]; - } + return val; + } + /** + * Get a value from its key if present in the dictionary otherwise add it + * @param key the key to get the value from + * @param val if there's no such key/value pair in the dictionary add it with this value + * @returns the value corresponding to the key + */ + getOrAdd(key, val) { + const curVal = this.get(key); + if (curVal !== void 0) { + return curVal; } + this.add(key, val); + return val; } - _cacheMatrix(name69, matrix) { - this._checkNewFrame(); - const cache = this._valueCache[name69]; - const flag = matrix.updateFlag; - if (cache !== void 0 && cache === flag) { + /** + * Check if there's a given key in the dictionary + * @param key the key to check for + * @returns true if the key is present, false otherwise + */ + contains(key) { + return this._data[key] !== void 0; + } + /** + * Add a new key and its corresponding value + * @param key the key to add + * @param value the value corresponding to the key + * @returns true if the operation completed successfully, false if we couldn't insert the key/value because there was already this key in the dictionary + */ + add(key, value) { + if (this._data[key] !== void 0) { return false; } - this._valueCache[name69] = flag; + this._data[key] = value; + ++this._count; return true; } - // Update methods - _updateMatrix3x3ForUniform(name69, matrix) { - for (let i = 0; i < 3; i++) { - _UniformBuffer._TempBuffer[i * 4] = matrix[i * 3]; - _UniformBuffer._TempBuffer[i * 4 + 1] = matrix[i * 3 + 1]; - _UniformBuffer._TempBuffer[i * 4 + 2] = matrix[i * 3 + 2]; - _UniformBuffer._TempBuffer[i * 4 + 3] = 0; + /** + * Update a specific value associated to a key + * @param key defines the key to use + * @param value defines the value to store + * @returns true if the value was updated (or false if the key was not found) + */ + set(key, value) { + if (this._data[key] === void 0) { + return false; } - this.updateUniform(name69, _UniformBuffer._TempBuffer, 12); - } - _updateMatrix3x3ForEffect(name69, matrix) { - this._currentEffect.setMatrix3x3(name69, matrix); - } - _updateMatrix2x2ForEffect(name69, matrix) { - this._currentEffect.setMatrix2x2(name69, matrix); + this._data[key] = value; + return true; } - _updateMatrix2x2ForUniform(name69, matrix) { - for (let i = 0; i < 2; i++) { - _UniformBuffer._TempBuffer[i * 4] = matrix[i * 2]; - _UniformBuffer._TempBuffer[i * 4 + 1] = matrix[i * 2 + 1]; - _UniformBuffer._TempBuffer[i * 4 + 2] = 0; - _UniformBuffer._TempBuffer[i * 4 + 3] = 0; + /** + * Get the element of the given key and remove it from the dictionary + * @param key defines the key to search + * @returns the value associated with the key or null if not found + */ + getAndRemove(key) { + const val = this.get(key); + if (val !== void 0) { + delete this._data[key]; + --this._count; + return val; } - this.updateUniform(name69, _UniformBuffer._TempBuffer, 8); + return null; } - _updateFloatForEffect(name69, x) { - this._currentEffect.setFloat(name69, x); + /** + * Remove a key/value from the dictionary. + * @param key the key to remove + * @returns true if the item was successfully deleted, false if no item with such key exist in the dictionary + */ + remove(key) { + if (this.contains(key)) { + delete this._data[key]; + --this._count; + return true; + } + return false; } - _updateFloatForUniform(name69, x) { - _UniformBuffer._TempBuffer[0] = x; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 1); + /** + * Clear the whole content of the dictionary + */ + clear() { + this._data = {}; + this._count = 0; } - _updateFloat2ForEffect(name69, x, y, suffix = "") { - this._currentEffect.setFloat2(name69 + suffix, x, y); + /** + * Gets the current count + */ + get count() { + return this._count; } - _updateFloat2ForUniform(name69, x, y) { - _UniformBuffer._TempBuffer[0] = x; - _UniformBuffer._TempBuffer[1] = y; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 2); + /** + * Execute a callback on each key/val of the dictionary. + * Note that you can remove any element in this dictionary in the callback implementation + * @param callback the callback to execute on a given key/value pair + */ + forEach(callback) { + for (const cur in this._data) { + const val = this._data[cur]; + callback(cur, val); + } } - _updateFloat3ForEffect(name69, x, y, z, suffix = "") { - this._currentEffect.setFloat3(name69 + suffix, x, y, z); + /** + * Execute a callback on every occurrence of the dictionary until it returns a valid TRes object. + * If the callback returns null or undefined the method will iterate to the next key/value pair + * Note that you can remove any element in this dictionary in the callback implementation + * @param callback the callback to execute, if it return a valid T instanced object the enumeration will stop and the object will be returned + * @returns the first item + */ + first(callback) { + for (const cur in this._data) { + const val = this._data[cur]; + const res = callback(cur, val); + if (res) { + return res; + } + } + return null; } - _updateFloat3ForUniform(name69, x, y, z) { - _UniformBuffer._TempBuffer[0] = x; - _UniformBuffer._TempBuffer[1] = y; - _UniformBuffer._TempBuffer[2] = z; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 3); +}; + +// node_modules/@babylonjs/core/abstractScene.js +var AbstractScene = class { + constructor() { + this.rootNodes = []; + this.cameras = []; + this.lights = []; + this.meshes = []; + this.skeletons = []; + this.particleSystems = []; + this.animations = []; + this.animationGroups = []; + this.multiMaterials = []; + this.materials = []; + this.morphTargetManagers = []; + this.geometries = []; + this.transformNodes = []; + this.actionManagers = []; + this.textures = []; + this._environmentTexture = null; + this.postProcesses = []; } - _updateFloat4ForEffect(name69, x, y, z, w, suffix = "") { - this._currentEffect.setFloat4(name69 + suffix, x, y, z, w); + /** + * Adds a parser in the list of available ones + * @param name Defines the name of the parser + * @param parser Defines the parser to add + */ + static AddParser(name69, parser) { + this._BabylonFileParsers[name69] = parser; } - _updateFloat4ForUniform(name69, x, y, z, w) { - _UniformBuffer._TempBuffer[0] = x; - _UniformBuffer._TempBuffer[1] = y; - _UniformBuffer._TempBuffer[2] = z; - _UniformBuffer._TempBuffer[3] = w; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 4); + /** + * Gets a general parser from the list of available ones + * @param name Defines the name of the parser + * @returns the requested parser or null + */ + static GetParser(name69) { + if (this._BabylonFileParsers[name69]) { + return this._BabylonFileParsers[name69]; + } + return null; } - _updateFloatArrayForEffect(name69, array) { - this._currentEffect.setFloatArray(name69, array); + /** + * Adds n individual parser in the list of available ones + * @param name Defines the name of the parser + * @param parser Defines the parser to add + */ + static AddIndividualParser(name69, parser) { + this._IndividualBabylonFileParsers[name69] = parser; } - _updateFloatArrayForUniform(name69, array) { - this.updateUniformArray(name69, array, array.length); + /** + * Gets an individual parser from the list of available ones + * @param name Defines the name of the parser + * @returns the requested parser or null + */ + static GetIndividualParser(name69) { + if (this._IndividualBabylonFileParsers[name69]) { + return this._IndividualBabylonFileParsers[name69]; + } + return null; } - _updateArrayForEffect(name69, array) { - this._currentEffect.setArray(name69, array); + /** + * Parser json data and populate both a scene and its associated container object + * @param jsonData Defines the data to parse + * @param scene Defines the scene to parse the data for + * @param container Defines the container attached to the parsing sequence + * @param rootUrl Defines the root url of the data + */ + static Parse(jsonData, scene, container, rootUrl) { + for (const parserName in this._BabylonFileParsers) { + if (Object.prototype.hasOwnProperty.call(this._BabylonFileParsers, parserName)) { + this._BabylonFileParsers[parserName](jsonData, scene, container, rootUrl); + } + } } - _updateArrayForUniform(name69, array) { - this.updateUniformArray(name69, array, array.length); + /** + * Texture used in all pbr material as the reflection texture. + * As in the majority of the scene they are the same (exception for multi room and so on), + * this is easier to reference from here than from all the materials. + */ + get environmentTexture() { + return this._environmentTexture; } - _updateIntArrayForEffect(name69, array) { - this._currentEffect.setIntArray(name69, array); + set environmentTexture(value) { + this._environmentTexture = value; } - _updateIntArrayForUniform(name69, array) { - _UniformBuffer._TempBufferInt32View.set(array); - this.updateUniformArray(name69, _UniformBuffer._TempBuffer, array.length); + /** + * @returns all meshes, lights, cameras, transformNodes and bones + */ + getNodes() { + let nodes = []; + nodes = nodes.concat(this.meshes); + nodes = nodes.concat(this.lights); + nodes = nodes.concat(this.cameras); + nodes = nodes.concat(this.transformNodes); + this.skeletons.forEach((skeleton) => nodes = nodes.concat(skeleton.bones)); + return nodes; } - _updateUIntArrayForEffect(name69, array) { - this._currentEffect.setUIntArray(name69, array); +}; +AbstractScene._BabylonFileParsers = {}; +AbstractScene._IndividualBabylonFileParsers = {}; + +// node_modules/@babylonjs/core/Materials/colorCurves.functions.js +function PrepareUniformsForColorCurves(uniformsList) { + uniformsList.push("vCameraColorCurveNeutral", "vCameraColorCurvePositive", "vCameraColorCurveNegative"); +} + +// node_modules/@babylonjs/core/Materials/colorCurves.js +var ColorCurves = class _ColorCurves { + constructor() { + this._dirty = true; + this._tempColor = new Color4(0, 0, 0, 0); + this._globalCurve = new Color4(0, 0, 0, 0); + this._highlightsCurve = new Color4(0, 0, 0, 0); + this._midtonesCurve = new Color4(0, 0, 0, 0); + this._shadowsCurve = new Color4(0, 0, 0, 0); + this._positiveCurve = new Color4(0, 0, 0, 0); + this._negativeCurve = new Color4(0, 0, 0, 0); + this._globalHue = 30; + this._globalDensity = 0; + this._globalSaturation = 0; + this._globalExposure = 0; + this._highlightsHue = 30; + this._highlightsDensity = 0; + this._highlightsSaturation = 0; + this._highlightsExposure = 0; + this._midtonesHue = 30; + this._midtonesDensity = 0; + this._midtonesSaturation = 0; + this._midtonesExposure = 0; + this._shadowsHue = 30; + this._shadowsDensity = 0; + this._shadowsSaturation = 0; + this._shadowsExposure = 0; } - _updateUIntArrayForUniform(name69, array) { - _UniformBuffer._TempBufferUInt32View.set(array); - this.updateUniformArray(name69, _UniformBuffer._TempBuffer, array.length); + /** + * Gets the global Hue value. + * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). + */ + get globalHue() { + return this._globalHue; } - _updateMatrixForEffect(name69, mat) { - this._currentEffect.setMatrix(name69, mat); + /** + * Sets the global Hue value. + * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). + */ + set globalHue(value) { + this._globalHue = value; + this._dirty = true; } - _updateMatrixForUniform(name69, mat) { - if (this._cacheMatrix(name69, mat)) { - this.updateUniform(name69, mat.asArray(), 16); - } + /** + * Gets the global Density value. + * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. + * Values less than zero provide a filter of opposite hue. + */ + get globalDensity() { + return this._globalDensity; } - _updateMatricesForEffect(name69, mat) { - this._currentEffect.setMatrices(name69, mat); + /** + * Sets the global Density value. + * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. + * Values less than zero provide a filter of opposite hue. + */ + set globalDensity(value) { + this._globalDensity = value; + this._dirty = true; } - _updateMatricesForUniform(name69, mat) { - this.updateUniform(name69, mat, mat.length); - } - _updateVector3ForEffect(name69, vector) { - this._currentEffect.setVector3(name69, vector); - } - _updateVector3ForUniform(name69, vector) { - _UniformBuffer._TempBuffer[0] = vector.x; - _UniformBuffer._TempBuffer[1] = vector.y; - _UniformBuffer._TempBuffer[2] = vector.z; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 3); - } - _updateVector4ForEffect(name69, vector) { - this._currentEffect.setVector4(name69, vector); - } - _updateVector4ForUniform(name69, vector) { - _UniformBuffer._TempBuffer[0] = vector.x; - _UniformBuffer._TempBuffer[1] = vector.y; - _UniformBuffer._TempBuffer[2] = vector.z; - _UniformBuffer._TempBuffer[3] = vector.w; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 4); - } - _updateColor3ForEffect(name69, color, suffix = "") { - this._currentEffect.setColor3(name69 + suffix, color); - } - _updateColor3ForUniform(name69, color) { - _UniformBuffer._TempBuffer[0] = color.r; - _UniformBuffer._TempBuffer[1] = color.g; - _UniformBuffer._TempBuffer[2] = color.b; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 3); - } - _updateColor4ForEffect(name69, color, alpha, suffix = "") { - this._currentEffect.setColor4(name69 + suffix, color, alpha); - } - _updateDirectColor4ForEffect(name69, color, suffix = "") { - this._currentEffect.setDirectColor4(name69 + suffix, color); - } - _updateColor4ForUniform(name69, color, alpha) { - _UniformBuffer._TempBuffer[0] = color.r; - _UniformBuffer._TempBuffer[1] = color.g; - _UniformBuffer._TempBuffer[2] = color.b; - _UniformBuffer._TempBuffer[3] = alpha; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 4); - } - _updateDirectColor4ForUniform(name69, color) { - _UniformBuffer._TempBuffer[0] = color.r; - _UniformBuffer._TempBuffer[1] = color.g; - _UniformBuffer._TempBuffer[2] = color.b; - _UniformBuffer._TempBuffer[3] = color.a; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 4); - } - _updateIntForEffect(name69, x, suffix = "") { - this._currentEffect.setInt(name69 + suffix, x); - } - _updateIntForUniform(name69, x) { - _UniformBuffer._TempBufferInt32View[0] = x; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 1); - } - _updateInt2ForEffect(name69, x, y, suffix = "") { - this._currentEffect.setInt2(name69 + suffix, x, y); - } - _updateInt2ForUniform(name69, x, y) { - _UniformBuffer._TempBufferInt32View[0] = x; - _UniformBuffer._TempBufferInt32View[1] = y; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 2); - } - _updateInt3ForEffect(name69, x, y, z, suffix = "") { - this._currentEffect.setInt3(name69 + suffix, x, y, z); - } - _updateInt3ForUniform(name69, x, y, z) { - _UniformBuffer._TempBufferInt32View[0] = x; - _UniformBuffer._TempBufferInt32View[1] = y; - _UniformBuffer._TempBufferInt32View[2] = z; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 3); - } - _updateInt4ForEffect(name69, x, y, z, w, suffix = "") { - this._currentEffect.setInt4(name69 + suffix, x, y, z, w); - } - _updateInt4ForUniform(name69, x, y, z, w) { - _UniformBuffer._TempBufferInt32View[0] = x; - _UniformBuffer._TempBufferInt32View[1] = y; - _UniformBuffer._TempBufferInt32View[2] = z; - _UniformBuffer._TempBufferInt32View[3] = w; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 4); - } - _updateUIntForEffect(name69, x, suffix = "") { - this._currentEffect.setUInt(name69 + suffix, x); - } - _updateUIntForUniform(name69, x) { - _UniformBuffer._TempBufferUInt32View[0] = x; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 1); - } - _updateUInt2ForEffect(name69, x, y, suffix = "") { - this._currentEffect.setUInt2(name69 + suffix, x, y); - } - _updateUInt2ForUniform(name69, x, y) { - _UniformBuffer._TempBufferUInt32View[0] = x; - _UniformBuffer._TempBufferUInt32View[1] = y; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 2); - } - _updateUInt3ForEffect(name69, x, y, z, suffix = "") { - this._currentEffect.setUInt3(name69 + suffix, x, y, z); + /** + * Gets the global Saturation value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. + */ + get globalSaturation() { + return this._globalSaturation; } - _updateUInt3ForUniform(name69, x, y, z) { - _UniformBuffer._TempBufferUInt32View[0] = x; - _UniformBuffer._TempBufferUInt32View[1] = y; - _UniformBuffer._TempBufferUInt32View[2] = z; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 3); + /** + * Sets the global Saturation value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. + */ + set globalSaturation(value) { + this._globalSaturation = value; + this._dirty = true; } - _updateUInt4ForEffect(name69, x, y, z, w, suffix = "") { - this._currentEffect.setUInt4(name69 + suffix, x, y, z, w); + /** + * Gets the global Exposure value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. + */ + get globalExposure() { + return this._globalExposure; } - _updateUInt4ForUniform(name69, x, y, z, w) { - _UniformBuffer._TempBufferUInt32View[0] = x; - _UniformBuffer._TempBufferUInt32View[1] = y; - _UniformBuffer._TempBufferUInt32View[2] = z; - _UniformBuffer._TempBufferUInt32View[3] = w; - this.updateUniform(name69, _UniformBuffer._TempBuffer, 4); + /** + * Sets the global Exposure value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. + */ + set globalExposure(value) { + this._globalExposure = value; + this._dirty = true; } /** - * Sets a sampler uniform on the effect. - * @param name Define the name of the sampler. - * @param texture Define the texture to set in the sampler + * Gets the highlights Hue value. + * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). */ - setTexture(name69, texture) { - this._currentEffect.setTexture(name69, texture); + get highlightsHue() { + return this._highlightsHue; } /** - * Sets a sampler uniform on the effect. - * @param name Define the name of the sampler. - * @param texture Define the (internal) texture to set in the sampler + * Sets the highlights Hue value. + * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). */ - bindTexture(name69, texture) { - this._currentEffect._bindTexture(name69, texture); + set highlightsHue(value) { + this._highlightsHue = value; + this._dirty = true; } /** - * Directly updates the value of the uniform in the cache AND on the GPU. - * @param uniformName Define the name of the uniform, as used in the uniform block in the shader. - * @param data Define the flattened data + * Gets the highlights Density value. + * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. + * Values less than zero provide a filter of opposite hue. */ - updateUniformDirectly(uniformName, data) { - this.updateUniform(uniformName, data, data.length); - this.update(); + get highlightsDensity() { + return this._highlightsDensity; } /** - * Associates an effect to this uniform buffer - * @param effect Define the effect to associate the buffer to - * @param name Name of the uniform block in the shader. + * Sets the highlights Density value. + * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. + * Values less than zero provide a filter of opposite hue. */ - bindToEffect(effect, name69) { - this._currentEffect = effect; - this._currentEffectName = name69; + set highlightsDensity(value) { + this._highlightsDensity = value; + this._dirty = true; } /** - * Binds the current (GPU) buffer to the effect + * Gets the highlights Saturation value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. */ - bindUniformBuffer() { - if (!this._noUBO && this._buffer && this._currentEffect) { - this._currentEffect.bindUniformBuffer(this._buffer, this._currentEffectName); - } + get highlightsSaturation() { + return this._highlightsSaturation; } /** - * Dissociates the current effect from this uniform buffer + * Sets the highlights Saturation value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. */ - unbindEffect() { - this._currentEffect = void 0; - this._currentEffectName = void 0; + set highlightsSaturation(value) { + this._highlightsSaturation = value; + this._dirty = true; } /** - * Sets the current state of the class (_bufferIndex, _buffer) to point to the data buffer passed in parameter if this buffer is one of the buffers handled by the class (meaning if it can be found in the _buffers array) - * This method is meant to be able to update a buffer at any time: just call setDataBuffer to set the class in the right state, call some updateXXX methods and then call udpate() => that will update the GPU buffer on the graphic card - * @param dataBuffer buffer to look for - * @returns true if the buffer has been found and the class internal state points to it, else false + * Gets the highlights Exposure value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. */ - setDataBuffer(dataBuffer) { - if (!this._buffers) { - return this._buffer === dataBuffer; - } - for (let b = 0; b < this._buffers.length; ++b) { - const buffer = this._buffers[b]; - if (buffer[0] === dataBuffer) { - this._bufferIndex = b; - this._buffer = dataBuffer; - this._createBufferOnWrite = false; - this._currentEffect = void 0; - return true; - } - } - return false; + get highlightsExposure() { + return this._highlightsExposure; } /** - * Disposes the uniform buffer. + * Sets the highlights Exposure value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. */ - dispose() { - if (this._noUBO) { - return; - } - const uniformBuffers = this._engine._uniformBuffers; - const index = uniformBuffers.indexOf(this); - if (index !== -1) { - uniformBuffers[index] = uniformBuffers[uniformBuffers.length - 1]; - uniformBuffers.pop(); - } - if (this._engine._features.trackUbosInFrame && this._buffers) { - for (let i = 0; i < this._buffers.length; ++i) { - const buffer = this._buffers[i][0]; - this._engine._releaseBuffer(buffer); - } - } else if (this._buffer && this._engine._releaseBuffer(this._buffer)) { - this._buffer = null; - } + set highlightsExposure(value) { + this._highlightsExposure = value; + this._dirty = true; } -}; -UniformBuffer._UpdatedUbosInFrame = {}; -UniformBuffer._MAX_UNIFORM_SIZE = 256; -UniformBuffer._TempBuffer = new Float32Array(UniformBuffer._MAX_UNIFORM_SIZE); -UniformBuffer._TempBufferInt32View = new Int32Array(UniformBuffer._TempBuffer.buffer); -UniformBuffer._TempBufferUInt32View = new Uint32Array(UniformBuffer._TempBuffer.buffer); - -// node_modules/@babylonjs/core/Buffers/buffer.js -var Buffer = class { /** - * Gets a boolean indicating if the Buffer is disposed + * Gets the midtones Hue value. + * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). */ - get isDisposed() { - return this._isDisposed; + get midtonesHue() { + return this._midtonesHue; } /** - * Constructor - * @param engine the engine - * @param data the data to use for this buffer - * @param updatable whether the data is updatable - * @param stride the stride (optional) - * @param postponeInternalCreation whether to postpone creating the internal WebGL buffer (optional) - * @param instanced whether the buffer is instanced (optional) - * @param useBytes set to true if the stride in in bytes (optional) - * @param divisor sets an optional divisor for instances (1 by default) - * @param label defines the label of the buffer (for debug purpose) + * Sets the midtones Hue value. + * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). */ - constructor(engine, data, updatable, stride = 0, postponeInternalCreation = false, instanced = false, useBytes = false, divisor, label) { - this._isAlreadyOwned = false; - this._isDisposed = false; - if (engine && engine.getScene) { - this._engine = engine.getScene().getEngine(); - } else { - this._engine = engine; - } - this._updatable = updatable; - this._instanced = instanced; - this._divisor = divisor || 1; - this._label = label; - if (data instanceof DataBuffer) { - this._data = null; - this._buffer = data; - } else { - this._data = data; - this._buffer = null; - } - this.byteStride = useBytes ? stride : stride * Float32Array.BYTES_PER_ELEMENT; - if (!postponeInternalCreation) { - this.create(); - } + set midtonesHue(value) { + this._midtonesHue = value; + this._dirty = true; } /** - * Create a new VertexBuffer based on the current buffer - * @param kind defines the vertex buffer kind (position, normal, etc.) - * @param offset defines offset in the buffer (0 by default) - * @param size defines the size in floats of attributes (position is 3 for instance) - * @param stride defines the stride size in floats in the buffer (the offset to apply to reach next value when data is interleaved) - * @param instanced defines if the vertex buffer contains indexed data - * @param useBytes defines if the offset and stride are in bytes * - * @param divisor sets an optional divisor for instances (1 by default) - * @returns the new vertex buffer + * Gets the midtones Density value. + * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. + * Values less than zero provide a filter of opposite hue. */ - createVertexBuffer(kind, offset, size, stride, instanced, useBytes = false, divisor) { - const byteOffset = useBytes ? offset : offset * Float32Array.BYTES_PER_ELEMENT; - const byteStride = stride ? useBytes ? stride : stride * Float32Array.BYTES_PER_ELEMENT : this.byteStride; - return new VertexBuffer(this._engine, this, kind, this._updatable, true, byteStride, instanced === void 0 ? this._instanced : instanced, byteOffset, size, void 0, void 0, true, this._divisor || divisor); + get midtonesDensity() { + return this._midtonesDensity; } - // Properties /** - * Gets a boolean indicating if the Buffer is updatable? - * @returns true if the buffer is updatable + * Sets the midtones Density value. + * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. + * Values less than zero provide a filter of opposite hue. */ - isUpdatable() { - return this._updatable; + set midtonesDensity(value) { + this._midtonesDensity = value; + this._dirty = true; } /** - * Gets current buffer's data - * @returns a DataArray or null + * Gets the midtones Saturation value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. */ - getData() { - return this._data; + get midtonesSaturation() { + return this._midtonesSaturation; } /** - * Gets underlying native buffer - * @returns underlying native buffer + * Sets the midtones Saturation value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. */ - getBuffer() { - return this._buffer; + set midtonesSaturation(value) { + this._midtonesSaturation = value; + this._dirty = true; } /** - * Gets the stride in float32 units (i.e. byte stride / 4). - * May not be an integer if the byte stride is not divisible by 4. - * @returns the stride in float32 units - * @deprecated Please use byteStride instead. + * Gets the midtones Exposure value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. */ - getStrideSize() { - return this.byteStride / Float32Array.BYTES_PER_ELEMENT; + get midtonesExposure() { + return this._midtonesExposure; } - // Methods /** - * Store data into the buffer. Creates the buffer if not used already. - * If the buffer was already used, it will be updated only if it is updatable, otherwise it will do nothing. - * @param data defines the data to store + * Sets the midtones Exposure value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. */ - create(data = null) { - if (!data && this._buffer) { - return; - } - data = data || this._data; - if (!data) { - return; - } - if (!this._buffer) { - if (this._updatable) { - this._buffer = this._engine.createDynamicVertexBuffer(data, this._label); - this._data = data; - } else { - this._buffer = this._engine.createVertexBuffer(data, void 0, this._label); - } - } else if (this._updatable) { - this._engine.updateDynamicVertexBuffer(this._buffer, data); - this._data = data; - } + set midtonesExposure(value) { + this._midtonesExposure = value; + this._dirty = true; } - /** @internal */ - _rebuild() { - if (!this._data) { - if (!this._buffer) { - return; - } - if (this._buffer.capacity > 0) { - if (this._updatable) { - this._buffer = this._engine.createDynamicVertexBuffer(this._buffer.capacity, this._label); - } else { - this._buffer = this._engine.createVertexBuffer(this._buffer.capacity, void 0, this._label); - } - return; - } - Logger.Warn(`Missing data for buffer "${this._label}" ${this._buffer ? "(uniqueId: " + this._buffer.uniqueId + ")" : ""}. Buffer reconstruction failed.`); - this._buffer = null; - } else { - this._buffer = null; - this.create(this._data); - } + /** + * Gets the shadows Hue value. + * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). + */ + get shadowsHue() { + return this._shadowsHue; } /** - * Update current buffer data - * @param data defines the data to store + * Sets the shadows Hue value. + * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange). */ - update(data) { - this.create(data); + set shadowsHue(value) { + this._shadowsHue = value; + this._dirty = true; } /** - * Updates the data directly. - * @param data the new data - * @param offset the new offset - * @param vertexCount the vertex count (optional) - * @param useBytes set to true if the offset is in bytes + * Gets the shadows Density value. + * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. + * Values less than zero provide a filter of opposite hue. */ - updateDirectly(data, offset, vertexCount, useBytes = false) { - if (!this._buffer) { - return; - } - if (this._updatable) { - this._engine.updateDynamicVertexBuffer(this._buffer, data, useBytes ? offset : offset * Float32Array.BYTES_PER_ELEMENT, vertexCount ? vertexCount * this.byteStride : void 0); - if (offset === 0 && vertexCount === void 0) { - this._data = data; - } else { - this._data = null; - } - } + get shadowsDensity() { + return this._shadowsDensity; } - /** @internal */ - _increaseReferences() { - if (!this._buffer) { - return; - } - if (!this._isAlreadyOwned) { - this._isAlreadyOwned = true; - return; - } - this._buffer.references++; + /** + * Sets the shadows Density value. + * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect. + * Values less than zero provide a filter of opposite hue. + */ + set shadowsDensity(value) { + this._shadowsDensity = value; + this._dirty = true; } /** - * Release all resources + * Gets the shadows Saturation value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. */ - dispose() { - if (!this._buffer) { - return; - } - if (this._engine._releaseBuffer(this._buffer)) { - this._isDisposed = true; - this._data = null; - this._buffer = null; - } + get shadowsSaturation() { + return this._shadowsSaturation; } -}; -var VertexBuffer = class _VertexBuffer { /** - * Gets a boolean indicating if the Buffer is disposed + * Sets the shadows Saturation value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation. */ - get isDisposed() { - return this._isDisposed; + set shadowsSaturation(value) { + this._shadowsSaturation = value; + this._dirty = true; } /** - * Gets or sets the instance divisor when in instanced mode + * Gets the shadows Exposure value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. */ - get instanceDivisor() { - return this._instanceDivisor; + get shadowsExposure() { + return this._shadowsExposure; } - set instanceDivisor(value) { - const isInstanced = value != 0; - this._instanceDivisor = value; - if (isInstanced !== this._instanced) { - this._instanced = isInstanced; - this._computeHashCode(); - } + /** + * Sets the shadows Exposure value. + * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure. + */ + set shadowsExposure(value) { + this._shadowsExposure = value; + this._dirty = true; } /** - * Gets the max possible amount of vertices stored within the current vertex buffer. - * We do not have the end offset or count so this will be too big for concatenated vertex buffers. - * @internal + * Returns the class name + * @returns The class name */ - get _maxVerticesCount() { - const data = this.getData(); - if (!data) { - return 0; + getClassName() { + return "ColorCurves"; + } + /** + * Binds the color curves to the shader. + * @param colorCurves The color curve to bind + * @param effect The effect to bind to + * @param positiveUniform The positive uniform shader parameter + * @param neutralUniform The neutral uniform shader parameter + * @param negativeUniform The negative uniform shader parameter + */ + static Bind(colorCurves, effect, positiveUniform = "vCameraColorCurvePositive", neutralUniform = "vCameraColorCurveNeutral", negativeUniform = "vCameraColorCurveNegative") { + if (colorCurves._dirty) { + colorCurves._dirty = false; + colorCurves._getColorGradingDataToRef(colorCurves._globalHue, colorCurves._globalDensity, colorCurves._globalSaturation, colorCurves._globalExposure, colorCurves._globalCurve); + colorCurves._getColorGradingDataToRef(colorCurves._highlightsHue, colorCurves._highlightsDensity, colorCurves._highlightsSaturation, colorCurves._highlightsExposure, colorCurves._tempColor); + colorCurves._tempColor.multiplyToRef(colorCurves._globalCurve, colorCurves._highlightsCurve); + colorCurves._getColorGradingDataToRef(colorCurves._midtonesHue, colorCurves._midtonesDensity, colorCurves._midtonesSaturation, colorCurves._midtonesExposure, colorCurves._tempColor); + colorCurves._tempColor.multiplyToRef(colorCurves._globalCurve, colorCurves._midtonesCurve); + colorCurves._getColorGradingDataToRef(colorCurves._shadowsHue, colorCurves._shadowsDensity, colorCurves._shadowsSaturation, colorCurves._shadowsExposure, colorCurves._tempColor); + colorCurves._tempColor.multiplyToRef(colorCurves._globalCurve, colorCurves._shadowsCurve); + colorCurves._highlightsCurve.subtractToRef(colorCurves._midtonesCurve, colorCurves._positiveCurve); + colorCurves._midtonesCurve.subtractToRef(colorCurves._shadowsCurve, colorCurves._negativeCurve); } - if (Array.isArray(data)) { - return data.length / (this.byteStride / 4) - this.byteOffset / 4; + if (effect) { + effect.setFloat4(positiveUniform, colorCurves._positiveCurve.r, colorCurves._positiveCurve.g, colorCurves._positiveCurve.b, colorCurves._positiveCurve.a); + effect.setFloat4(neutralUniform, colorCurves._midtonesCurve.r, colorCurves._midtonesCurve.g, colorCurves._midtonesCurve.b, colorCurves._midtonesCurve.a); + effect.setFloat4(negativeUniform, colorCurves._negativeCurve.r, colorCurves._negativeCurve.g, colorCurves._negativeCurve.b, colorCurves._negativeCurve.a); } - return (data.byteLength - this.byteOffset) / this.byteStride; } - /** @internal */ - constructor(engine, data, kind, updatableOrOptions, postponeInternalCreation, stride, instanced, offset, size, type, normalized = false, useBytes = false, divisor = 1, takeBufferOwnership = false) { - this._isDisposed = false; - let updatable = false; - this.engine = engine; - if (typeof updatableOrOptions === "object" && updatableOrOptions !== null) { - updatable = updatableOrOptions.updatable ?? false; - postponeInternalCreation = updatableOrOptions.postponeInternalCreation; - stride = updatableOrOptions.stride; - instanced = updatableOrOptions.instanced; - offset = updatableOrOptions.offset; - size = updatableOrOptions.size; - type = updatableOrOptions.type; - normalized = updatableOrOptions.normalized ?? false; - useBytes = updatableOrOptions.useBytes ?? false; - divisor = updatableOrOptions.divisor ?? 1; - takeBufferOwnership = updatableOrOptions.takeBufferOwnership ?? false; - this._label = updatableOrOptions.label; - } else { - updatable = !!updatableOrOptions; + /** + * Returns color grading data based on a hue, density, saturation and exposure value. + * @param hue + * @param density + * @param saturation The saturation. + * @param exposure The exposure. + * @param result The result data container. + */ + _getColorGradingDataToRef(hue, density, saturation, exposure, result) { + if (hue == null) { + return; } - if (data instanceof Buffer) { - this._buffer = data; - this._ownsBuffer = takeBufferOwnership; - } else { - this._buffer = new Buffer(engine, data, updatable, stride, postponeInternalCreation, instanced, useBytes, divisor, this._label); - this._ownsBuffer = true; + hue = _ColorCurves._Clamp(hue, 0, 360); + density = _ColorCurves._Clamp(density, -100, 100); + saturation = _ColorCurves._Clamp(saturation, -100, 100); + exposure = _ColorCurves._Clamp(exposure, -100, 100); + density = _ColorCurves._ApplyColorGradingSliderNonlinear(density); + density *= 0.5; + exposure = _ColorCurves._ApplyColorGradingSliderNonlinear(exposure); + if (density < 0) { + density *= -1; + hue = (hue + 180) % 360; } - this.uniqueId = _VertexBuffer._Counter++; - this._kind = kind; - if (type === void 0) { - const vertexData = this.getData(); - this.type = vertexData ? _VertexBuffer.GetDataType(vertexData) : _VertexBuffer.FLOAT; - } else { - this.type = type; + _ColorCurves._FromHSBToRef(hue, density, 50 + 0.25 * exposure, result); + result.scaleToRef(2, result); + result.a = 1 + 0.01 * saturation; + } + /** + * Takes an input slider value and returns an adjusted value that provides extra control near the centre. + * @param value The input slider value in range [-100,100]. + * @returns Adjusted value. + */ + static _ApplyColorGradingSliderNonlinear(value) { + value /= 100; + let x = Math.abs(value); + x = Math.pow(x, 2); + if (value < 0) { + x *= -1; } - const typeByteLength = _VertexBuffer.GetTypeByteLength(this.type); - if (useBytes) { - this._size = size || (stride ? stride / typeByteLength : _VertexBuffer.DeduceStride(kind)); - this.byteStride = stride || this._buffer.byteStride || this._size * typeByteLength; - this.byteOffset = offset || 0; + x *= 100; + return x; + } + /** + * Returns an RGBA Color4 based on Hue, Saturation and Brightness (also referred to as value, HSV). + * @param hue The hue (H) input. + * @param saturation The saturation (S) input. + * @param brightness The brightness (B) input. + * @param result + * @result An RGBA color represented as Vector4. + */ + static _FromHSBToRef(hue, saturation, brightness, result) { + let h = _ColorCurves._Clamp(hue, 0, 360); + const s = _ColorCurves._Clamp(saturation / 100, 0, 1); + const v = _ColorCurves._Clamp(brightness / 100, 0, 1); + if (s === 0) { + result.r = v; + result.g = v; + result.b = v; } else { - this._size = size || stride || _VertexBuffer.DeduceStride(kind); - this.byteStride = stride ? stride * typeByteLength : this._buffer.byteStride || this._size * typeByteLength; - this.byteOffset = (offset || 0) * typeByteLength; + h /= 60; + const i = Math.floor(h); + const f = h - i; + const p = v * (1 - s); + const q = v * (1 - s * f); + const t = v * (1 - s * (1 - f)); + switch (i) { + case 0: + result.r = v; + result.g = t; + result.b = p; + break; + case 1: + result.r = q; + result.g = v; + result.b = p; + break; + case 2: + result.r = p; + result.g = v; + result.b = t; + break; + case 3: + result.r = p; + result.g = q; + result.b = v; + break; + case 4: + result.r = t; + result.g = p; + result.b = v; + break; + default: + result.r = v; + result.g = p; + result.b = q; + break; + } } - this.normalized = normalized; - this._instanced = instanced !== void 0 ? instanced : false; - this._instanceDivisor = instanced ? divisor : 0; - this._alignBuffer(); - this._computeHashCode(); - } - _computeHashCode() { - this.hashCode = (this.type - 5120 << 0) + ((this.normalized ? 1 : 0) << 3) + (this._size << 4) + ((this._instanced ? 1 : 0) << 6) + /* keep 5 bits free */ - (this.byteStride << 12); + result.a = 1; } - /** @internal */ - _rebuild() { - var _a; - (_a = this._buffer) == null ? void 0 : _a._rebuild(); + /** + * Returns a value clamped between min and max + * @param value The value to clamp + * @param min The minimum of value + * @param max The maximum of value + * @returns The clamped value. + */ + static _Clamp(value, min, max) { + return Math.min(Math.max(value, min), max); } /** - * Returns the kind of the VertexBuffer (string) - * @returns a string + * Clones the current color curve instance. + * @returns The cloned curves */ - getKind() { - return this._kind; + clone() { + return SerializationHelper.Clone(() => new _ColorCurves(), this); } - // Properties /** - * Gets a boolean indicating if the VertexBuffer is updatable? - * @returns true if the buffer is updatable + * Serializes the current color curve instance to a json representation. + * @returns a JSON representation */ - isUpdatable() { - return this._buffer.isUpdatable(); + serialize() { + return SerializationHelper.Serialize(this); } /** - * Gets current buffer's data - * @returns a DataArray or null + * Parses the color curve from a json representation. + * @param source the JSON source to parse + * @returns The parsed curves */ - getData() { - return this._buffer.getData(); + static Parse(source) { + return SerializationHelper.Parse(() => new _ColorCurves(), source, null, null); + } +}; +ColorCurves.PrepareUniforms = PrepareUniformsForColorCurves; +__decorate([ + serialize() +], ColorCurves.prototype, "_globalHue", void 0); +__decorate([ + serialize() +], ColorCurves.prototype, "_globalDensity", void 0); +__decorate([ + serialize() +], ColorCurves.prototype, "_globalSaturation", void 0); +__decorate([ + serialize() +], ColorCurves.prototype, "_globalExposure", void 0); +__decorate([ + serialize() +], ColorCurves.prototype, "_highlightsHue", void 0); +__decorate([ + serialize() +], ColorCurves.prototype, "_highlightsDensity", void 0); +__decorate([ + serialize() +], ColorCurves.prototype, "_highlightsSaturation", void 0); +__decorate([ + serialize() +], ColorCurves.prototype, "_highlightsExposure", void 0); +__decorate([ + serialize() +], ColorCurves.prototype, "_midtonesHue", void 0); +__decorate([ + serialize() +], ColorCurves.prototype, "_midtonesDensity", void 0); +__decorate([ + serialize() +], ColorCurves.prototype, "_midtonesSaturation", void 0); +__decorate([ + serialize() +], ColorCurves.prototype, "_midtonesExposure", void 0); +SerializationHelper._ColorCurvesParser = ColorCurves.Parse; + +// node_modules/@babylonjs/core/Materials/imageProcessingConfiguration.functions.js +function PrepareUniformsForImageProcessing(uniforms, defines) { + if (defines.EXPOSURE) { + uniforms.push("exposureLinear"); + } + if (defines.CONTRAST) { + uniforms.push("contrast"); + } + if (defines.COLORGRADING) { + uniforms.push("colorTransformSettings"); + } + if (defines.VIGNETTE || defines.DITHER) { + uniforms.push("vInverseScreenSize"); + } + if (defines.VIGNETTE) { + uniforms.push("vignetteSettings1"); + uniforms.push("vignetteSettings2"); + } + if (defines.COLORCURVES) { + PrepareUniformsForColorCurves(uniforms); + } + if (defines.DITHER) { + uniforms.push("ditherIntensity"); + } +} +function PrepareSamplersForImageProcessing(samplersList, defines) { + if (defines.COLORGRADING) { + samplersList.push("txColorTransform"); + } +} + +// node_modules/@babylonjs/core/Materials/imageProcessingConfiguration.js +var ImageProcessingConfiguration = class _ImageProcessingConfiguration { + constructor() { + this.colorCurves = new ColorCurves(); + this._colorCurvesEnabled = false; + this._colorGradingEnabled = false; + this._colorGradingWithGreenDepth = true; + this._colorGradingBGR = true; + this._exposure = 1; + this._toneMappingEnabled = false; + this._toneMappingType = _ImageProcessingConfiguration.TONEMAPPING_STANDARD; + this._contrast = 1; + this.vignetteStretch = 0; + this.vignetteCenterX = 0; + this.vignetteCenterY = 0; + this.vignetteWeight = 1.5; + this.vignetteColor = new Color4(0, 0, 0, 0); + this.vignetteCameraFov = 0.5; + this._vignetteBlendMode = _ImageProcessingConfiguration.VIGNETTEMODE_MULTIPLY; + this._vignetteEnabled = false; + this._ditheringEnabled = false; + this._ditheringIntensity = 1 / 255; + this._skipFinalColorClamp = false; + this._applyByPostProcess = false; + this._isEnabled = true; + this.onUpdateParameters = new Observable(); } /** - * Gets current buffer's data as a float array. Float data is constructed if the vertex buffer data cannot be returned directly. - * @param totalVertices number of vertices in the buffer to take into account - * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it - * @returns a float array containing vertex data + * Gets whether the color curves effect is enabled. */ - getFloatData(totalVertices, forceCopy) { - const data = this.getData(); - if (!data) { - return null; - } - return _VertexBuffer.GetFloatData(data, this._size, this.type, this.byteOffset, this.byteStride, this.normalized, totalVertices, forceCopy); + get colorCurvesEnabled() { + return this._colorCurvesEnabled; } /** - * Gets underlying native buffer - * @returns underlying native buffer + * Sets whether the color curves effect is enabled. */ - getBuffer() { - return this._buffer.getBuffer(); + set colorCurvesEnabled(value) { + if (this._colorCurvesEnabled === value) { + return; + } + this._colorCurvesEnabled = value; + this._updateParameters(); } /** - * Gets the Buffer instance that wraps the native GPU buffer - * @returns the wrapper buffer + * Color grading LUT texture used in the effect if colorGradingEnabled is set to true */ - getWrapperBuffer() { - return this._buffer; + get colorGradingTexture() { + return this._colorGradingTexture; } /** - * Gets the stride in float32 units (i.e. byte stride / 4). - * May not be an integer if the byte stride is not divisible by 4. - * @returns the stride in float32 units - * @deprecated Please use byteStride instead. + * Color grading LUT texture used in the effect if colorGradingEnabled is set to true */ - getStrideSize() { - return this.byteStride / _VertexBuffer.GetTypeByteLength(this.type); + set colorGradingTexture(value) { + if (this._colorGradingTexture === value) { + return; + } + this._colorGradingTexture = value; + this._updateParameters(); } /** - * Returns the offset as a multiple of the type byte length. - * @returns the offset in bytes - * @deprecated Please use byteOffset instead. + * Gets whether the color grading effect is enabled. */ - getOffset() { - return this.byteOffset / _VertexBuffer.GetTypeByteLength(this.type); + get colorGradingEnabled() { + return this._colorGradingEnabled; } /** - * Returns the number of components or the byte size per vertex attribute - * @param sizeInBytes If true, returns the size in bytes or else the size in number of components of the vertex attribute (default: false) - * @returns the number of components + * Sets whether the color grading effect is enabled. */ - getSize(sizeInBytes = false) { - return sizeInBytes ? this._size * _VertexBuffer.GetTypeByteLength(this.type) : this._size; + set colorGradingEnabled(value) { + if (this._colorGradingEnabled === value) { + return; + } + this._colorGradingEnabled = value; + this._updateParameters(); } /** - * Gets a boolean indicating is the internal buffer of the VertexBuffer is instanced - * @returns true if this buffer is instanced + * Gets whether the color grading effect is using a green depth for the 3d Texture. */ - getIsInstanced() { - return this._instanced; + get colorGradingWithGreenDepth() { + return this._colorGradingWithGreenDepth; } /** - * Returns the instancing divisor, zero for non-instanced (integer). - * @returns a number + * Sets whether the color grading effect is using a green depth for the 3d Texture. */ - getInstanceDivisor() { - return this._instanceDivisor; + set colorGradingWithGreenDepth(value) { + if (this._colorGradingWithGreenDepth === value) { + return; + } + this._colorGradingWithGreenDepth = value; + this._updateParameters(); } - // Methods /** - * Store data into the buffer. If the buffer was already used it will be either recreated or updated depending on isUpdatable property - * @param data defines the data to store + * Gets whether the color grading texture contains BGR values. */ - create(data) { - this._buffer.create(data); - this._alignBuffer(); + get colorGradingBGR() { + return this._colorGradingBGR; } /** - * Updates the underlying buffer according to the passed numeric array or Float32Array. - * This function will create a new buffer if the current one is not updatable - * @param data defines the data to store + * Sets whether the color grading texture contains BGR values. */ - update(data) { - this._buffer.update(data); - this._alignBuffer(); + set colorGradingBGR(value) { + if (this._colorGradingBGR === value) { + return; + } + this._colorGradingBGR = value; + this._updateParameters(); } /** - * Updates directly the underlying WebGLBuffer according to the passed numeric array or Float32Array. - * Returns the directly updated WebGLBuffer. - * @param data the new data - * @param offset the new offset - * @param useBytes set to true if the offset is in bytes + * Gets the Exposure used in the effect. */ - updateDirectly(data, offset, useBytes = false) { - this._buffer.updateDirectly(data, offset, void 0, useBytes); - this._alignBuffer(); + get exposure() { + return this._exposure; } /** - * Disposes the VertexBuffer and the underlying WebGLBuffer. + * Sets the Exposure used in the effect. */ - dispose() { - if (this._ownsBuffer) { - this._buffer.dispose(); + set exposure(value) { + if (this._exposure === value) { + return; } - this._isDisposed = true; + this._exposure = value; + this._updateParameters(); } /** - * Enumerates each value of this vertex buffer as numbers. - * @param count the number of values to enumerate - * @param callback the callback function called for each value + * Gets whether the tone mapping effect is enabled. */ - forEach(count, callback) { - _VertexBuffer.ForEach(this._buffer.getData(), this.byteOffset, this.byteStride, this._size, this.type, count, this.normalized, callback); - } - /** @internal */ - _alignBuffer() { + get toneMappingEnabled() { + return this._toneMappingEnabled; } /** - * Deduces the stride given a kind. - * @param kind The kind string to deduce - * @returns The deduced stride + * Sets whether the tone mapping effect is enabled. */ - static DeduceStride(kind) { - switch (kind) { - case _VertexBuffer.UVKind: - case _VertexBuffer.UV2Kind: - case _VertexBuffer.UV3Kind: - case _VertexBuffer.UV4Kind: - case _VertexBuffer.UV5Kind: - case _VertexBuffer.UV6Kind: - return 2; - case _VertexBuffer.NormalKind: - case _VertexBuffer.PositionKind: - return 3; - case _VertexBuffer.ColorKind: - case _VertexBuffer.ColorInstanceKind: - case _VertexBuffer.MatricesIndicesKind: - case _VertexBuffer.MatricesIndicesExtraKind: - case _VertexBuffer.MatricesWeightsKind: - case _VertexBuffer.MatricesWeightsExtraKind: - case _VertexBuffer.TangentKind: - return 4; - default: - throw new Error("Invalid kind '" + kind + "'"); + set toneMappingEnabled(value) { + if (this._toneMappingEnabled === value) { + return; } + this._toneMappingEnabled = value; + this._updateParameters(); } /** - * Gets the vertex buffer type of the given data array. - * @param data the data array - * @returns the vertex buffer type + * Gets the type of tone mapping effect. */ - static GetDataType(data) { - if (data instanceof Int8Array) { - return _VertexBuffer.BYTE; - } else if (data instanceof Uint8Array) { - return _VertexBuffer.UNSIGNED_BYTE; - } else if (data instanceof Int16Array) { - return _VertexBuffer.SHORT; - } else if (data instanceof Uint16Array) { - return _VertexBuffer.UNSIGNED_SHORT; - } else if (data instanceof Int32Array) { - return _VertexBuffer.INT; - } else if (data instanceof Uint32Array) { - return _VertexBuffer.UNSIGNED_INT; - } else { - return _VertexBuffer.FLOAT; - } + get toneMappingType() { + return this._toneMappingType; } /** - * Gets the byte length of the given type. - * @param type the type - * @returns the number of bytes + * Sets the type of tone mapping effect used in BabylonJS. */ - static GetTypeByteLength(type) { - switch (type) { - case _VertexBuffer.BYTE: - case _VertexBuffer.UNSIGNED_BYTE: - return 1; - case _VertexBuffer.SHORT: - case _VertexBuffer.UNSIGNED_SHORT: - return 2; - case _VertexBuffer.INT: - case _VertexBuffer.UNSIGNED_INT: - case _VertexBuffer.FLOAT: - return 4; - default: - throw new Error(`Invalid type '${type}'`); + set toneMappingType(value) { + if (this._toneMappingType === value) { + return; } + this._toneMappingType = value; + this._updateParameters(); } /** - * Enumerates each value of the given parameters as numbers. - * @param data the data to enumerate - * @param byteOffset the byte offset of the data - * @param byteStride the byte stride of the data - * @param componentCount the number of components per element - * @param componentType the type of the component - * @param count the number of values to enumerate - * @param normalized whether the data is normalized - * @param callback the callback function called for each value + * Gets the contrast used in the effect. */ - static ForEach(data, byteOffset, byteStride, componentCount, componentType, count, normalized, callback) { - if (data instanceof Array) { - let offset = byteOffset / 4; - const stride = byteStride / 4; - for (let index = 0; index < count; index += componentCount) { - for (let componentIndex = 0; componentIndex < componentCount; componentIndex++) { - callback(data[offset + componentIndex], index + componentIndex); - } - offset += stride; - } - } else { - const dataView = data instanceof ArrayBuffer ? new DataView(data) : new DataView(data.buffer, data.byteOffset, data.byteLength); - const componentByteLength = _VertexBuffer.GetTypeByteLength(componentType); - for (let index = 0; index < count; index += componentCount) { - let componentByteOffset = byteOffset; - for (let componentIndex = 0; componentIndex < componentCount; componentIndex++) { - const value = _VertexBuffer._GetFloatValue(dataView, componentType, componentByteOffset, normalized); - callback(value, index + componentIndex); - componentByteOffset += componentByteLength; - } - byteOffset += byteStride; - } - } + get contrast() { + return this._contrast; } - static _GetFloatValue(dataView, type, byteOffset, normalized) { - switch (type) { - case _VertexBuffer.BYTE: { - let value = dataView.getInt8(byteOffset); - if (normalized) { - value = Math.max(value / 127, -1); - } - return value; - } - case _VertexBuffer.UNSIGNED_BYTE: { - let value = dataView.getUint8(byteOffset); - if (normalized) { - value = value / 255; - } - return value; - } - case _VertexBuffer.SHORT: { - let value = dataView.getInt16(byteOffset, true); - if (normalized) { - value = Math.max(value / 32767, -1); - } - return value; - } - case _VertexBuffer.UNSIGNED_SHORT: { - let value = dataView.getUint16(byteOffset, true); - if (normalized) { - value = value / 65535; - } - return value; - } - case _VertexBuffer.INT: { - return dataView.getInt32(byteOffset, true); - } - case _VertexBuffer.UNSIGNED_INT: { - return dataView.getUint32(byteOffset, true); - } - case _VertexBuffer.FLOAT: { - return dataView.getFloat32(byteOffset, true); - } - default: { - throw new Error(`Invalid component type ${type}`); - } + /** + * Sets the contrast used in the effect. + */ + set contrast(value) { + if (this._contrast === value) { + return; } + this._contrast = value; + this._updateParameters(); } /** - * Gets the given data array as a float array. Float data is constructed if the data array cannot be returned directly. - * @param data the input data array - * @param size the number of components - * @param type the component type - * @param byteOffset the byte offset of the data - * @param byteStride the byte stride of the data - * @param normalized whether the data is normalized - * @param totalVertices number of vertices in the buffer to take into account - * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it - * @returns a float array containing vertex data + * Back Compat: Vignette center Y Offset. + * @deprecated use vignetteCenterY instead */ - static GetFloatData(data, size, type, byteOffset, byteStride, normalized, totalVertices, forceCopy) { - const tightlyPackedByteStride = size * _VertexBuffer.GetTypeByteLength(type); - const count = totalVertices * size; - if (type !== _VertexBuffer.FLOAT || byteStride !== tightlyPackedByteStride) { - const copy = new Float32Array(count); - _VertexBuffer.ForEach(data, byteOffset, byteStride, size, type, count, normalized, (value, index) => copy[index] = value); - return copy; - } - if (!(data instanceof Array || data instanceof Float32Array) || byteOffset !== 0 || data.length !== count) { - if (data instanceof Array) { - const offset = byteOffset / 4; - return data.slice(offset, offset + count); - } else if (data instanceof ArrayBuffer) { - return new Float32Array(data, byteOffset, count); - } else { - let offset = data.byteOffset + byteOffset; - if (forceCopy) { - const result = new Float32Array(count); - const source = new Float32Array(data.buffer, offset, count); - result.set(source); - return result; - } - const remainder = offset % 4; - if (remainder) { - offset = Math.max(0, offset - remainder); - } - return new Float32Array(data.buffer, offset, count); - } - } - if (forceCopy) { - return data.slice(); - } - return data; + get vignetteCentreY() { + return this.vignetteCenterY; } -}; -VertexBuffer._Counter = 0; -VertexBuffer.BYTE = 5120; -VertexBuffer.UNSIGNED_BYTE = 5121; -VertexBuffer.SHORT = 5122; -VertexBuffer.UNSIGNED_SHORT = 5123; -VertexBuffer.INT = 5124; -VertexBuffer.UNSIGNED_INT = 5125; -VertexBuffer.FLOAT = 5126; -VertexBuffer.PositionKind = `position`; -VertexBuffer.NormalKind = `normal`; -VertexBuffer.TangentKind = `tangent`; -VertexBuffer.UVKind = `uv`; -VertexBuffer.UV2Kind = `uv2`; -VertexBuffer.UV3Kind = `uv3`; -VertexBuffer.UV4Kind = `uv4`; -VertexBuffer.UV5Kind = `uv5`; -VertexBuffer.UV6Kind = `uv6`; -VertexBuffer.ColorKind = `color`; -VertexBuffer.ColorInstanceKind = `instanceColor`; -VertexBuffer.MatricesIndicesKind = `matricesIndices`; -VertexBuffer.MatricesWeightsKind = `matricesWeights`; -VertexBuffer.MatricesIndicesExtraKind = `matricesIndicesExtra`; -VertexBuffer.MatricesWeightsExtraKind = `matricesWeightsExtra`; - -// node_modules/@babylonjs/core/Collisions/pickingInfo.js -var PickingInfo = class { - constructor() { - this.hit = false; - this.distance = 0; - this.pickedPoint = null; - this.pickedMesh = null; - this.bu = 0; - this.bv = 0; - this.faceId = -1; - this.subMeshFaceId = -1; - this.subMeshId = 0; - this.pickedSprite = null; - this.thinInstanceIndex = -1; - this.ray = null; - this.originMesh = null; - this.aimTransform = null; - this.gripTransform = null; + set vignetteCentreY(value) { + this.vignetteCenterY = value; } /** - * Gets the normal corresponding to the face the pick collided with - * @param useWorldCoordinates If the resulting normal should be relative to the world (default: false) - * @param useVerticesNormals If the vertices normals should be used to calculate the normal instead of the normal map (default: true) - * @returns The normal corresponding to the face the pick collided with - * @remarks Note that the returned normal will always point towards the picking ray. + * Back Compat: Vignette center X Offset. + * @deprecated use vignetteCenterX instead */ - getNormal(useWorldCoordinates = false, useVerticesNormals = true) { - if (!this.pickedMesh || useVerticesNormals && !this.pickedMesh.isVerticesDataPresent(VertexBuffer.NormalKind)) { - return null; - } - let indices = this.pickedMesh.getIndices(); - if ((indices == null ? void 0 : indices.length) === 0) { - indices = null; - } - let result; - const tmp0 = TmpVectors.Vector3[0]; - const tmp1 = TmpVectors.Vector3[1]; - const tmp2 = TmpVectors.Vector3[2]; - if (useVerticesNormals) { - const normals = this.pickedMesh.getVerticesData(VertexBuffer.NormalKind); - let normal0 = indices ? Vector3.FromArrayToRef(normals, indices[this.faceId * 3] * 3, tmp0) : tmp0.copyFromFloats(normals[this.faceId * 3 * 3], normals[this.faceId * 3 * 3 + 1], normals[this.faceId * 3 * 3 + 2]); - let normal1 = indices ? Vector3.FromArrayToRef(normals, indices[this.faceId * 3 + 1] * 3, tmp1) : tmp1.copyFromFloats(normals[(this.faceId * 3 + 1) * 3], normals[(this.faceId * 3 + 1) * 3 + 1], normals[(this.faceId * 3 + 1) * 3 + 2]); - let normal2 = indices ? Vector3.FromArrayToRef(normals, indices[this.faceId * 3 + 2] * 3, tmp2) : tmp2.copyFromFloats(normals[(this.faceId * 3 + 2) * 3], normals[(this.faceId * 3 + 2) * 3 + 1], normals[(this.faceId * 3 + 2) * 3 + 2]); - normal0 = normal0.scale(this.bu); - normal1 = normal1.scale(this.bv); - normal2 = normal2.scale(1 - this.bu - this.bv); - result = new Vector3(normal0.x + normal1.x + normal2.x, normal0.y + normal1.y + normal2.y, normal0.z + normal1.z + normal2.z); - } else { - const positions = this.pickedMesh.getVerticesData(VertexBuffer.PositionKind); - const vertex1 = indices ? Vector3.FromArrayToRef(positions, indices[this.faceId * 3] * 3, tmp0) : tmp0.copyFromFloats(positions[this.faceId * 3 * 3], positions[this.faceId * 3 * 3 + 1], positions[this.faceId * 3 * 3 + 2]); - const vertex2 = indices ? Vector3.FromArrayToRef(positions, indices[this.faceId * 3 + 1] * 3, tmp1) : tmp1.copyFromFloats(positions[(this.faceId * 3 + 1) * 3], positions[(this.faceId * 3 + 1) * 3 + 1], positions[(this.faceId * 3 + 1) * 3 + 2]); - const vertex3 = indices ? Vector3.FromArrayToRef(positions, indices[this.faceId * 3 + 2] * 3, tmp2) : tmp2.copyFromFloats(positions[(this.faceId * 3 + 2) * 3], positions[(this.faceId * 3 + 2) * 3 + 1], positions[(this.faceId * 3 + 2) * 3 + 2]); - const p1p2 = vertex1.subtract(vertex2); - const p3p2 = vertex3.subtract(vertex2); - result = Vector3.Cross(p1p2, p3p2); - } - const transformNormalToWorld = (pickedMesh, n) => { - let wm = pickedMesh.getWorldMatrix(); - if (pickedMesh.nonUniformScaling) { - TmpVectors.Matrix[0].copyFrom(wm); - wm = TmpVectors.Matrix[0]; - wm.setTranslationFromFloats(0, 0, 0); - wm.invert(); - wm.transposeToRef(TmpVectors.Matrix[1]); - wm = TmpVectors.Matrix[1]; - } - Vector3.TransformNormalToRef(n, wm, n); - }; - if (useWorldCoordinates) { - transformNormalToWorld(this.pickedMesh, result); - } - if (this.ray) { - const normalForDirectionChecking = TmpVectors.Vector3[0].copyFrom(result); - if (!useWorldCoordinates) { - transformNormalToWorld(this.pickedMesh, normalForDirectionChecking); - } - if (Vector3.Dot(normalForDirectionChecking, this.ray.direction) > 0) { - result.negateInPlace(); - } - } - result.normalize(); - return result; + get vignetteCentreX() { + return this.vignetteCenterX; + } + set vignetteCentreX(value) { + this.vignetteCenterX = value; } /** - * Gets the texture coordinates of where the pick occurred - * @param uvSet The UV set to use to calculate the texture coordinates (default: VertexBuffer.UVKind) - * @returns The vector containing the coordinates of the texture + * Gets the vignette blend mode allowing different kind of effect. */ - getTextureCoordinates(uvSet = VertexBuffer.UVKind) { - if (!this.pickedMesh || !this.pickedMesh.isVerticesDataPresent(uvSet)) { - return null; - } - const indices = this.pickedMesh.getIndices(); - if (!indices) { - return null; - } - const uvs = this.pickedMesh.getVerticesData(uvSet); - if (!uvs) { - return null; - } - let uv0 = Vector2.FromArray(uvs, indices[this.faceId * 3] * 2); - let uv1 = Vector2.FromArray(uvs, indices[this.faceId * 3 + 1] * 2); - let uv2 = Vector2.FromArray(uvs, indices[this.faceId * 3 + 2] * 2); - uv0 = uv0.scale(this.bu); - uv1 = uv1.scale(this.bv); - uv2 = uv2.scale(1 - this.bu - this.bv); - return new Vector2(uv0.x + uv1.x + uv2.x, uv0.y + uv1.y + uv2.y); + get vignetteBlendMode() { + return this._vignetteBlendMode; } -}; - -// node_modules/@babylonjs/core/PostProcesses/postProcessManager.js -var PostProcessManager = class { /** - * Creates a new instance PostProcess - * @param scene The scene that the post process is associated with. + * Sets the vignette blend mode allowing different kind of effect. */ - constructor(scene) { - this._vertexBuffers = {}; - this._scene = scene; - } - _prepareBuffers() { - if (this._vertexBuffers[VertexBuffer.PositionKind]) { + set vignetteBlendMode(value) { + if (this._vignetteBlendMode === value) { return; } - const vertices = []; - vertices.push(1, 1); - vertices.push(-1, 1); - vertices.push(-1, -1); - vertices.push(1, -1); - this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(this._scene.getEngine(), vertices, VertexBuffer.PositionKind, false, false, 2); - this._buildIndexBuffer(); - } - _buildIndexBuffer() { - const indices = []; - indices.push(0); - indices.push(1); - indices.push(2); - indices.push(0); - indices.push(2); - indices.push(3); - this._indexBuffer = this._scene.getEngine().createIndexBuffer(indices); + this._vignetteBlendMode = value; + this._updateParameters(); } /** - * Rebuilds the vertex buffers of the manager. - * @internal + * Gets whether the vignette effect is enabled. */ - _rebuild() { - const vb = this._vertexBuffers[VertexBuffer.PositionKind]; - if (!vb) { - return; - } - vb._rebuild(); - this._buildIndexBuffer(); + get vignetteEnabled() { + return this._vignetteEnabled; } - // Methods /** - * Prepares a frame to be run through a post process. - * @param sourceTexture The input texture to the post processes. (default: null) - * @param postProcesses An array of post processes to be run. (default: null) - * @returns True if the post processes were able to be run. - * @internal + * Sets whether the vignette effect is enabled. */ - _prepareFrame(sourceTexture = null, postProcesses = null) { - const camera = this._scene.activeCamera; - if (!camera) { - return false; - } - postProcesses = postProcesses || camera._postProcesses.filter((pp) => { - return pp != null; - }); - if (!postProcesses || postProcesses.length === 0 || !this._scene.postProcessesEnabled) { - return false; + set vignetteEnabled(value) { + if (this._vignetteEnabled === value) { + return; } - postProcesses[0].activate(camera, sourceTexture, postProcesses !== null && postProcesses !== void 0); - return true; + this._vignetteEnabled = value; + this._updateParameters(); } /** - * Manually render a set of post processes to a texture. - * Please note, the frame buffer won't be unbound after the call in case you have more render to do. - * @param postProcesses An array of post processes to be run. - * @param targetTexture The render target wrapper to render to. - * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight - * @param faceIndex defines the face to render to if a cubemap is defined as the target - * @param lodLevel defines which lod of the texture to render to - * @param doNotBindFrambuffer If set to true, assumes that the framebuffer has been bound previously + * Gets whether the dithering effect is enabled. + * The dithering effect can be used to reduce banding. */ - directRender(postProcesses, targetTexture = null, forceFullscreenViewport = false, faceIndex = 0, lodLevel = 0, doNotBindFrambuffer = false) { - var _a; - const engine = this._scene.getEngine(); - for (let index = 0; index < postProcesses.length; index++) { - if (index < postProcesses.length - 1) { - postProcesses[index + 1].activate(this._scene.activeCamera, targetTexture == null ? void 0 : targetTexture.texture); - } else { - if (targetTexture) { - engine.bindFramebuffer(targetTexture, faceIndex, void 0, void 0, forceFullscreenViewport, lodLevel); - } else if (!doNotBindFrambuffer) { - engine.restoreDefaultFramebuffer(); - } - (_a = engine._debugInsertMarker) == null ? void 0 : _a.call(engine, `post process ${postProcesses[index].name} output`); - } - const pp = postProcesses[index]; - const effect = pp.apply(); - if (effect) { - pp.onBeforeRenderObservable.notifyObservers(effect); - this._prepareBuffers(); - engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect); - engine.drawElementsType(0, 0, 6); - pp.onAfterRenderObservable.notifyObservers(effect); - } - } - engine.setDepthBuffer(true); - engine.setDepthWrite(true); + get ditheringEnabled() { + return this._ditheringEnabled; } /** - * Finalize the result of the output of the postprocesses. - * @param doNotPresent If true the result will not be displayed to the screen. - * @param targetTexture The render target wrapper to render to. - * @param faceIndex The index of the face to bind the target texture to. - * @param postProcesses The array of post processes to render. - * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight (default: false) - * @internal + * Sets whether the dithering effect is enabled. + * The dithering effect can be used to reduce banding. */ - _finalizeFrame(doNotPresent, targetTexture, faceIndex, postProcesses, forceFullscreenViewport = false) { - var _a; - const camera = this._scene.activeCamera; - if (!camera) { - return; - } - postProcesses = postProcesses || camera._postProcesses.filter((pp) => { - return pp != null; - }); - if (postProcesses.length === 0 || !this._scene.postProcessesEnabled) { + set ditheringEnabled(value) { + if (this._ditheringEnabled === value) { return; } - const engine = this._scene.getEngine(); - for (let index = 0, len = postProcesses.length; index < len; index++) { - const pp = postProcesses[index]; - if (index < len - 1) { - pp._outputTexture = postProcesses[index + 1].activate(camera, targetTexture == null ? void 0 : targetTexture.texture); - } else { - if (targetTexture) { - engine.bindFramebuffer(targetTexture, faceIndex, void 0, void 0, forceFullscreenViewport); - pp._outputTexture = targetTexture; - } else { - engine.restoreDefaultFramebuffer(); - pp._outputTexture = null; - } - (_a = engine._debugInsertMarker) == null ? void 0 : _a.call(engine, `post process ${postProcesses[index].name} output`); - } - if (doNotPresent) { - break; - } - const effect = pp.apply(); - if (effect) { - pp.onBeforeRenderObservable.notifyObservers(effect); - this._prepareBuffers(); - engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect); - engine.drawElementsType(0, 0, 6); - pp.onAfterRenderObservable.notifyObservers(effect); - } - } - engine.setDepthBuffer(true); - engine.setDepthWrite(true); - engine.setAlphaMode(0); + this._ditheringEnabled = value; + this._updateParameters(); } /** - * Disposes of the post process manager. + * Gets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0. */ - dispose() { - const buffer = this._vertexBuffers[VertexBuffer.PositionKind]; - if (buffer) { - buffer.dispose(); - this._vertexBuffers[VertexBuffer.PositionKind] = null; - } - if (this._indexBuffer) { - this._scene.getEngine()._releaseBuffer(this._indexBuffer); - this._indexBuffer = null; - } + get ditheringIntensity() { + return this._ditheringIntensity; } -}; - -// node_modules/@babylonjs/core/Rendering/renderingGroup.js -var RenderingGroup = class _RenderingGroup { /** - * Set the opaque sort comparison function. - * If null the sub meshes will be render in the order they were created + * Sets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0. */ - set opaqueSortCompareFn(value) { - if (value) { - this._opaqueSortCompareFn = value; - } else { - this._opaqueSortCompareFn = _RenderingGroup.PainterSortCompare; + set ditheringIntensity(value) { + if (this._ditheringIntensity === value) { + return; } - this._renderOpaque = this._renderOpaqueSorted; + this._ditheringIntensity = value; + this._updateParameters(); } /** - * Set the alpha test sort comparison function. - * If null the sub meshes will be render in the order they were created + * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader + * Applies to PBR materials. */ - set alphaTestSortCompareFn(value) { - if (value) { - this._alphaTestSortCompareFn = value; - } else { - this._alphaTestSortCompareFn = _RenderingGroup.PainterSortCompare; - } - this._renderAlphaTest = this._renderAlphaTestSorted; + get skipFinalColorClamp() { + return this._skipFinalColorClamp; } /** - * Set the transparent sort comparison function. - * If null the sub meshes will be render in the order they were created + * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader + * Applies to PBR materials. */ - set transparentSortCompareFn(value) { - if (value) { - this._transparentSortCompareFn = value; - } else { - this._transparentSortCompareFn = _RenderingGroup.defaultTransparentSortCompare; + set skipFinalColorClamp(value) { + if (this._skipFinalColorClamp === value) { + return; } - this._renderTransparent = this._renderTransparentSorted; + this._skipFinalColorClamp = value; + this._updateParameters(); } /** - * Creates a new rendering group. - * @param index The rendering group index - * @param scene - * @param opaqueSortCompareFn The opaque sort comparison function. If null no order is applied - * @param alphaTestSortCompareFn The alpha test sort comparison function. If null no order is applied - * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied + * Gets whether the image processing is applied through a post process or not. */ - constructor(index, scene, opaqueSortCompareFn = null, alphaTestSortCompareFn = null, transparentSortCompareFn = null) { - this.index = index; - this._opaqueSubMeshes = new SmartArray(256); - this._transparentSubMeshes = new SmartArray(256); - this._alphaTestSubMeshes = new SmartArray(256); - this._depthOnlySubMeshes = new SmartArray(256); - this._particleSystems = new SmartArray(256); - this._spriteManagers = new SmartArray(256); - this._empty = true; - this._edgesRenderers = new SmartArrayNoDuplicate(16); - this._scene = scene; - this.opaqueSortCompareFn = opaqueSortCompareFn; - this.alphaTestSortCompareFn = alphaTestSortCompareFn; - this.transparentSortCompareFn = transparentSortCompareFn; + get applyByPostProcess() { + return this._applyByPostProcess; } /** - * Render all the sub meshes contained in the group. - * @param customRenderFunction Used to override the default render behaviour of the group. - * @param renderSprites - * @param renderParticles - * @param activeMeshes + * Sets whether the image processing is applied through a post process or not. */ - render(customRenderFunction, renderSprites, renderParticles, activeMeshes) { - if (customRenderFunction) { - customRenderFunction(this._opaqueSubMeshes, this._alphaTestSubMeshes, this._transparentSubMeshes, this._depthOnlySubMeshes); + set applyByPostProcess(value) { + if (this._applyByPostProcess === value) { return; } - const engine = this._scene.getEngine(); - if (this._depthOnlySubMeshes.length !== 0) { - engine.setColorWrite(false); - this._renderAlphaTest(this._depthOnlySubMeshes); - engine.setColorWrite(true); - } - if (this._opaqueSubMeshes.length !== 0) { - this._renderOpaque(this._opaqueSubMeshes); - } - if (this._alphaTestSubMeshes.length !== 0) { - this._renderAlphaTest(this._alphaTestSubMeshes); - } - const stencilState = engine.getStencilBuffer(); - engine.setStencilBuffer(false); - if (renderSprites) { - this._renderSprites(); - } - if (renderParticles) { - this._renderParticles(activeMeshes); - } - if (this.onBeforeTransparentRendering) { - this.onBeforeTransparentRendering(); - } - if (this._transparentSubMeshes.length !== 0 || this._scene.useOrderIndependentTransparency) { - engine.setStencilBuffer(stencilState); - if (this._scene.useOrderIndependentTransparency) { - const excludedMeshes = this._scene.depthPeelingRenderer.render(this._transparentSubMeshes); - if (excludedMeshes.length) { - this._renderTransparent(excludedMeshes); - } - } else { - this._renderTransparent(this._transparentSubMeshes); - } - engine.setAlphaMode(0); - } - engine.setStencilBuffer(false); - if (this._edgesRenderers.length) { - for (let edgesRendererIndex = 0; edgesRendererIndex < this._edgesRenderers.length; edgesRendererIndex++) { - this._edgesRenderers.data[edgesRendererIndex].render(); - } - engine.setAlphaMode(0); - } - engine.setStencilBuffer(stencilState); - } - /** - * Renders the opaque submeshes in the order from the opaqueSortCompareFn. - * @param subMeshes The submeshes to render - */ - _renderOpaqueSorted(subMeshes) { - _RenderingGroup._RenderSorted(subMeshes, this._opaqueSortCompareFn, this._scene.activeCamera, false); - } - /** - * Renders the opaque submeshes in the order from the alphatestSortCompareFn. - * @param subMeshes The submeshes to render - */ - _renderAlphaTestSorted(subMeshes) { - _RenderingGroup._RenderSorted(subMeshes, this._alphaTestSortCompareFn, this._scene.activeCamera, false); + this._applyByPostProcess = value; + this._updateParameters(); } /** - * Renders the opaque submeshes in the order from the transparentSortCompareFn. - * @param subMeshes The submeshes to render + * Gets whether the image processing is enabled or not. */ - _renderTransparentSorted(subMeshes) { - _RenderingGroup._RenderSorted(subMeshes, this._transparentSortCompareFn, this._scene.activeCamera, true); + get isEnabled() { + return this._isEnabled; } /** - * Renders the submeshes in a specified order. - * @param subMeshes The submeshes to sort before render - * @param sortCompareFn The comparison function use to sort - * @param camera The camera position use to preprocess the submeshes to help sorting - * @param transparent Specifies to activate blending if true + * Sets whether the image processing is enabled or not. */ - static _RenderSorted(subMeshes, sortCompareFn, camera, transparent) { - let subIndex = 0; - let subMesh; - const cameraPosition = camera ? camera.globalPosition : _RenderingGroup._ZeroVector; - if (transparent) { - for (; subIndex < subMeshes.length; subIndex++) { - subMesh = subMeshes.data[subIndex]; - subMesh._alphaIndex = subMesh.getMesh().alphaIndex; - subMesh._distanceToCamera = Vector3.Distance(subMesh.getBoundingInfo().boundingSphere.centerWorld, cameraPosition); - } - } - const sortedArray = subMeshes.length === subMeshes.data.length ? subMeshes.data : subMeshes.data.slice(0, subMeshes.length); - if (sortCompareFn) { - sortedArray.sort(sortCompareFn); - } - const scene = sortedArray[0].getMesh().getScene(); - for (subIndex = 0; subIndex < sortedArray.length; subIndex++) { - subMesh = sortedArray[subIndex]; - if (scene._activeMeshesFrozenButKeepClipping && !subMesh.isInFrustum(scene._frustumPlanes)) { - continue; - } - if (transparent) { - const material = subMesh.getMaterial(); - if (material && material.needDepthPrePass) { - const engine = material.getScene().getEngine(); - engine.setColorWrite(false); - engine.setAlphaMode(0); - subMesh.render(false); - engine.setColorWrite(true); - } - } - subMesh.render(transparent); + set isEnabled(value) { + if (this._isEnabled === value) { + return; } + this._isEnabled = value; + this._updateParameters(); } /** - * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent) - * are rendered back to front if in the same alpha index. - * - * @param a The first submesh - * @param b The second submesh - * @returns The result of the comparison + * Method called each time the image processing information changes requires to recompile the effect. */ - // eslint-disable-next-line @typescript-eslint/naming-convention - static defaultTransparentSortCompare(a, b) { - if (a._alphaIndex > b._alphaIndex) { - return 1; - } - if (a._alphaIndex < b._alphaIndex) { - return -1; - } - return _RenderingGroup.backToFrontSortCompare(a, b); + _updateParameters() { + this.onUpdateParameters.notifyObservers(this); } /** - * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent) - * are rendered back to front. - * - * @param a The first submesh - * @param b The second submesh - * @returns The result of the comparison + * Gets the current class name. + * @returns "ImageProcessingConfiguration" */ - // eslint-disable-next-line @typescript-eslint/naming-convention - static backToFrontSortCompare(a, b) { - if (a._distanceToCamera < b._distanceToCamera) { - return 1; - } - if (a._distanceToCamera > b._distanceToCamera) { - return -1; - } - return 0; + getClassName() { + return "ImageProcessingConfiguration"; } /** - * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent) - * are rendered front to back (prevent overdraw). - * - * @param a The first submesh - * @param b The second submesh - * @returns The result of the comparison + * Prepare the list of defines associated to the shader. + * @param defines the list of defines to complete + * @param forPostProcess Define if we are currently in post process mode or not */ - // eslint-disable-next-line @typescript-eslint/naming-convention - static frontToBackSortCompare(a, b) { - if (a._distanceToCamera < b._distanceToCamera) { - return -1; + prepareDefines(defines, forPostProcess = false) { + if (forPostProcess !== this.applyByPostProcess || !this._isEnabled) { + defines.VIGNETTE = false; + defines.TONEMAPPING = false; + defines.TONEMAPPING_ACES = false; + defines.CONTRAST = false; + defines.EXPOSURE = false; + defines.COLORCURVES = false; + defines.COLORGRADING = false; + defines.COLORGRADING3D = false; + defines.DITHER = false; + defines.IMAGEPROCESSING = false; + defines.SKIPFINALCOLORCLAMP = this.skipFinalColorClamp; + defines.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess && this._isEnabled; + return; } - if (a._distanceToCamera > b._distanceToCamera) { - return 1; + defines.VIGNETTE = this.vignetteEnabled; + defines.VIGNETTEBLENDMODEMULTIPLY = this.vignetteBlendMode === _ImageProcessingConfiguration._VIGNETTEMODE_MULTIPLY; + defines.VIGNETTEBLENDMODEOPAQUE = !defines.VIGNETTEBLENDMODEMULTIPLY; + defines.TONEMAPPING = this.toneMappingEnabled; + switch (this._toneMappingType) { + case _ImageProcessingConfiguration.TONEMAPPING_ACES: + defines.TONEMAPPING_ACES = true; + break; + default: + defines.TONEMAPPING_ACES = false; + break; } - return 0; - } - /** - * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent) - * are grouped by material then geometry. - * - * @param a The first submesh - * @param b The second submesh - * @returns The result of the comparison - */ - static PainterSortCompare(a, b) { - const meshA = a.getMesh(); - const meshB = b.getMesh(); - if (meshA.material && meshB.material) { - return meshA.material.uniqueId - meshB.material.uniqueId; + defines.CONTRAST = this.contrast !== 1; + defines.EXPOSURE = this.exposure !== 1; + defines.COLORCURVES = this.colorCurvesEnabled && !!this.colorCurves; + defines.COLORGRADING = this.colorGradingEnabled && !!this.colorGradingTexture; + if (defines.COLORGRADING) { + defines.COLORGRADING3D = this.colorGradingTexture.is3D; + } else { + defines.COLORGRADING3D = false; } - return meshA.uniqueId - meshB.uniqueId; - } - /** - * Resets the different lists of submeshes to prepare a new frame. - */ - prepare() { - this._opaqueSubMeshes.reset(); - this._transparentSubMeshes.reset(); - this._alphaTestSubMeshes.reset(); - this._depthOnlySubMeshes.reset(); - this._particleSystems.reset(); - this.prepareSprites(); - this._edgesRenderers.reset(); - this._empty = true; + defines.SAMPLER3DGREENDEPTH = this.colorGradingWithGreenDepth; + defines.SAMPLER3DBGRMAP = this.colorGradingBGR; + defines.DITHER = this._ditheringEnabled; + defines.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess; + defines.SKIPFINALCOLORCLAMP = this.skipFinalColorClamp; + defines.IMAGEPROCESSING = defines.VIGNETTE || defines.TONEMAPPING || defines.CONTRAST || defines.EXPOSURE || defines.COLORCURVES || defines.COLORGRADING || defines.DITHER; } /** - * Resets the different lists of sprites to prepare a new frame. + * Returns true if all the image processing information are ready. + * @returns True if ready, otherwise, false */ - prepareSprites() { - this._spriteManagers.reset(); - } - dispose() { - this._opaqueSubMeshes.dispose(); - this._transparentSubMeshes.dispose(); - this._alphaTestSubMeshes.dispose(); - this._depthOnlySubMeshes.dispose(); - this._particleSystems.dispose(); - this._spriteManagers.dispose(); - this._edgesRenderers.dispose(); + isReady() { + return !this.colorGradingEnabled || !this.colorGradingTexture || this.colorGradingTexture.isReady(); } /** - * Inserts the submesh in its correct queue depending on its material. - * @param subMesh The submesh to dispatch - * @param [mesh] Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance. - * @param [material] Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance. + * Binds the image processing to the shader. + * @param effect The effect to bind to + * @param overrideAspectRatio Override the aspect ratio of the effect */ - dispatch(subMesh, mesh, material) { - if (mesh === void 0) { - mesh = subMesh.getMesh(); - } - if (material === void 0) { - material = subMesh.getMaterial(); - } - if (material === null || material === void 0) { - return; - } - if (material.needAlphaBlendingForMesh(mesh)) { - this._transparentSubMeshes.push(subMesh); - } else if (material.needAlphaTesting()) { - if (material.needDepthPrePass) { - this._depthOnlySubMeshes.push(subMesh); - } - this._alphaTestSubMeshes.push(subMesh); - } else { - if (material.needDepthPrePass) { - this._depthOnlySubMeshes.push(subMesh); - } - this._opaqueSubMeshes.push(subMesh); - } - mesh._renderingGroup = this; - if (mesh._edgesRenderer && mesh._edgesRenderer.isEnabled) { - this._edgesRenderers.pushNoDuplicate(mesh._edgesRenderer); - } - this._empty = false; - } - dispatchSprites(spriteManager) { - this._spriteManagers.push(spriteManager); - this._empty = false; - } - dispatchParticles(particleSystem) { - this._particleSystems.push(particleSystem); - this._empty = false; - } - _renderParticles(activeMeshes) { - if (this._particleSystems.length === 0) { - return; + bind(effect, overrideAspectRatio) { + if (this._colorCurvesEnabled && this.colorCurves) { + ColorCurves.Bind(this.colorCurves, effect); } - const activeCamera = this._scene.activeCamera; - this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene); - for (let particleIndex = 0; particleIndex < this._particleSystems.length; particleIndex++) { - const particleSystem = this._particleSystems.data[particleIndex]; - if ((activeCamera && activeCamera.layerMask & particleSystem.layerMask) === 0) { - continue; + if (this._vignetteEnabled || this._ditheringEnabled) { + const inverseWidth = 1 / effect.getEngine().getRenderWidth(); + const inverseHeight = 1 / effect.getEngine().getRenderHeight(); + effect.setFloat2("vInverseScreenSize", inverseWidth, inverseHeight); + if (this._ditheringEnabled) { + effect.setFloat("ditherIntensity", 0.5 * this._ditheringIntensity); } - const emitter = particleSystem.emitter; - if (!emitter.position || !activeMeshes || activeMeshes.indexOf(emitter) !== -1) { - this._scene._activeParticles.addCount(particleSystem.render(), false); + if (this._vignetteEnabled) { + const aspectRatio = overrideAspectRatio != null ? overrideAspectRatio : inverseHeight / inverseWidth; + let vignetteScaleY = Math.tan(this.vignetteCameraFov * 0.5); + let vignetteScaleX = vignetteScaleY * aspectRatio; + const vignetteScaleGeometricMean = Math.sqrt(vignetteScaleX * vignetteScaleY); + vignetteScaleX = Mix(vignetteScaleX, vignetteScaleGeometricMean, this.vignetteStretch); + vignetteScaleY = Mix(vignetteScaleY, vignetteScaleGeometricMean, this.vignetteStretch); + effect.setFloat4("vignetteSettings1", vignetteScaleX, vignetteScaleY, -vignetteScaleX * this.vignetteCenterX, -vignetteScaleY * this.vignetteCenterY); + const vignettePower = -2 * this.vignetteWeight; + effect.setFloat4("vignetteSettings2", this.vignetteColor.r, this.vignetteColor.g, this.vignetteColor.b, vignettePower); } } - this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene); - } - _renderSprites() { - if (!this._scene.spritesEnabled || this._spriteManagers.length === 0) { - return; - } - const activeCamera = this._scene.activeCamera; - this._scene.onBeforeSpritesRenderingObservable.notifyObservers(this._scene); - for (let id = 0; id < this._spriteManagers.length; id++) { - const spriteManager = this._spriteManagers.data[id]; - if ((activeCamera && activeCamera.layerMask & spriteManager.layerMask) !== 0) { - spriteManager.render(); - } + effect.setFloat("exposureLinear", this.exposure); + effect.setFloat("contrast", this.contrast); + if (this.colorGradingTexture) { + effect.setTexture("txColorTransform", this.colorGradingTexture); + const textureSize = this.colorGradingTexture.getSize().height; + effect.setFloat4( + "colorTransformSettings", + (textureSize - 1) / textureSize, + // textureScale + 0.5 / textureSize, + // textureOffset + textureSize, + // textureSize + this.colorGradingTexture.level + // weight + ); } - this._scene.onAfterSpritesRenderingObservable.notifyObservers(this._scene); } -}; -RenderingGroup._ZeroVector = Vector3.Zero(); - -// node_modules/@babylonjs/core/Rendering/renderingManager.js -var RenderingGroupInfo = class { -}; -var RenderingManager = class _RenderingManager { /** - * Gets or sets a boolean indicating that the manager will not reset between frames. - * This means that if a mesh becomes invisible or transparent it will not be visible until this boolean is set to false again. - * By default, the rendering manager will dispatch all active meshes per frame (moving them to the transparent, opaque or alpha testing lists). - * By turning this property on, you will accelerate the rendering by keeping all these lists unchanged between frames. + * Clones the current image processing instance. + * @returns The cloned image processing */ - get maintainStateBetweenFrames() { - return this._maintainStateBetweenFrames; - } - set maintainStateBetweenFrames(value) { - if (value === this._maintainStateBetweenFrames) { - return; - } - this._maintainStateBetweenFrames = value; - if (!this._maintainStateBetweenFrames) { - this.restoreDispachedFlags(); - } + clone() { + return SerializationHelper.Clone(() => new _ImageProcessingConfiguration(), this); } /** - * Restore wasDispatched flags on the lists of elements to render. + * Serializes the current image processing instance to a json representation. + * @returns a JSON representation */ - restoreDispachedFlags() { - for (const mesh of this._scene.meshes) { - if (mesh.subMeshes) { - for (const subMesh of mesh.subMeshes) { - subMesh._wasDispatched = false; - } - } - } - if (this._scene.spriteManagers) { - for (const spriteManager of this._scene.spriteManagers) { - spriteManager._wasDispatched = false; - } - } - for (const particleSystem of this._scene.particleSystems) { - particleSystem._wasDispatched = false; - } + serialize() { + return SerializationHelper.Serialize(this); } /** - * Instantiates a new rendering group for a particular scene - * @param scene Defines the scene the groups belongs to + * Parses the image processing from a json representation. + * @param source the JSON source to parse + * @returns The parsed image processing */ - constructor(scene) { - this._useSceneAutoClearSetup = false; - this._renderingGroups = new Array(); - this._autoClearDepthStencil = {}; - this._customOpaqueSortCompareFn = {}; - this._customAlphaTestSortCompareFn = {}; - this._customTransparentSortCompareFn = {}; - this._renderingGroupInfo = new RenderingGroupInfo(); - this._maintainStateBetweenFrames = false; - this._scene = scene; - for (let i = _RenderingManager.MIN_RENDERINGGROUPS; i < _RenderingManager.MAX_RENDERINGGROUPS; i++) { - this._autoClearDepthStencil[i] = { autoClear: true, depth: true, stencil: true }; + static Parse(source) { + const parsed = SerializationHelper.Parse(() => new _ImageProcessingConfiguration(), source, null, null); + if (source.vignetteCentreX !== void 0) { + parsed.vignetteCenterX = source.vignetteCentreX; } - } - /** - * @returns the rendering group with the specified id. - * @param id the id of the rendering group (0 by default) - */ - getRenderingGroup(id) { - const renderingGroupId = id || 0; - this._prepareRenderingGroup(renderingGroupId); - return this._renderingGroups[renderingGroupId]; - } - _clearDepthStencilBuffer(depth = true, stencil = true) { - if (this._depthStencilBufferAlreadyCleaned) { - return; + if (source.vignetteCentreY !== void 0) { + parsed.vignetteCenterY = source.vignetteCentreY; } - this._scene.getEngine().clear(null, false, depth, stencil); - this._depthStencilBufferAlreadyCleaned = true; + return parsed; } /** - * Renders the entire managed groups. This is used by the scene or the different render targets. - * @internal + * Used to apply the vignette as a mix with the pixel color. */ - render(customRenderFunction, activeMeshes, renderParticles, renderSprites) { - const info = this._renderingGroupInfo; - info.scene = this._scene; - info.camera = this._scene.activeCamera; - if (this._scene.spriteManagers && renderSprites) { - for (let index = 0; index < this._scene.spriteManagers.length; index++) { - const manager = this._scene.spriteManagers[index]; - this.dispatchSprites(manager); - } - } - for (let index = _RenderingManager.MIN_RENDERINGGROUPS; index < _RenderingManager.MAX_RENDERINGGROUPS; index++) { - this._depthStencilBufferAlreadyCleaned = index === _RenderingManager.MIN_RENDERINGGROUPS; - const renderingGroup = this._renderingGroups[index]; - if (!renderingGroup || renderingGroup._empty) { - continue; - } - const renderingGroupMask = 1 << index; - info.renderingGroupId = index; - this._scene.onBeforeRenderingGroupObservable.notifyObservers(info, renderingGroupMask); - if (_RenderingManager.AUTOCLEAR) { - const autoClear = this._useSceneAutoClearSetup ? this._scene.getAutoClearDepthStencilSetup(index) : this._autoClearDepthStencil[index]; - if (autoClear && autoClear.autoClear) { - this._clearDepthStencilBuffer(autoClear.depth, autoClear.stencil); - } - } - for (const step of this._scene._beforeRenderingGroupDrawStage) { - step.action(index); - } - renderingGroup.render(customRenderFunction, renderSprites, renderParticles, activeMeshes); - for (const step of this._scene._afterRenderingGroupDrawStage) { - step.action(index); - } - this._scene.onAfterRenderingGroupObservable.notifyObservers(info, renderingGroupMask); - } + static get VIGNETTEMODE_MULTIPLY() { + return this._VIGNETTEMODE_MULTIPLY; } /** - * Resets the different information of the group to prepare a new frame - * @internal + * Used to apply the vignette as a replacement of the pixel color. */ - reset() { - if (this.maintainStateBetweenFrames) { - return; - } - for (let index = _RenderingManager.MIN_RENDERINGGROUPS; index < _RenderingManager.MAX_RENDERINGGROUPS; index++) { - const renderingGroup = this._renderingGroups[index]; - if (renderingGroup) { - renderingGroup.prepare(); - } + static get VIGNETTEMODE_OPAQUE() { + return this._VIGNETTEMODE_OPAQUE; + } +}; +ImageProcessingConfiguration.TONEMAPPING_STANDARD = 0; +ImageProcessingConfiguration.TONEMAPPING_ACES = 1; +ImageProcessingConfiguration.PrepareUniforms = PrepareUniformsForImageProcessing; +ImageProcessingConfiguration.PrepareSamplers = PrepareSamplersForImageProcessing; +ImageProcessingConfiguration._VIGNETTEMODE_MULTIPLY = 0; +ImageProcessingConfiguration._VIGNETTEMODE_OPAQUE = 1; +__decorate([ + serializeAsColorCurves() +], ImageProcessingConfiguration.prototype, "colorCurves", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_colorCurvesEnabled", void 0); +__decorate([ + serializeAsTexture("colorGradingTexture") +], ImageProcessingConfiguration.prototype, "_colorGradingTexture", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_colorGradingEnabled", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_colorGradingWithGreenDepth", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_colorGradingBGR", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_exposure", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_toneMappingEnabled", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_toneMappingType", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_contrast", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "vignetteStretch", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "vignetteCenterX", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "vignetteCenterY", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "vignetteWeight", void 0); +__decorate([ + serializeAsColor4() +], ImageProcessingConfiguration.prototype, "vignetteColor", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "vignetteCameraFov", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_vignetteBlendMode", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_vignetteEnabled", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_ditheringEnabled", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_ditheringIntensity", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_skipFinalColorClamp", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_applyByPostProcess", void 0); +__decorate([ + serialize() +], ImageProcessingConfiguration.prototype, "_isEnabled", void 0); +SerializationHelper._ImageProcessingConfigurationParser = ImageProcessingConfiguration.Parse; + +// node_modules/@babylonjs/core/Engines/Extensions/engine.uniformBuffer.js +ThinEngine.prototype.createUniformBuffer = function(elements, _label) { + const ubo = this._gl.createBuffer(); + if (!ubo) { + throw new Error("Unable to create uniform buffer"); + } + const result = new WebGLDataBuffer(ubo); + this.bindUniformBuffer(result); + if (elements instanceof Float32Array) { + this._gl.bufferData(this._gl.UNIFORM_BUFFER, elements, this._gl.STATIC_DRAW); + } else { + this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(elements), this._gl.STATIC_DRAW); + } + this.bindUniformBuffer(null); + result.references = 1; + return result; +}; +ThinEngine.prototype.createDynamicUniformBuffer = function(elements, _label) { + const ubo = this._gl.createBuffer(); + if (!ubo) { + throw new Error("Unable to create dynamic uniform buffer"); + } + const result = new WebGLDataBuffer(ubo); + this.bindUniformBuffer(result); + if (elements instanceof Float32Array) { + this._gl.bufferData(this._gl.UNIFORM_BUFFER, elements, this._gl.DYNAMIC_DRAW); + } else { + this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(elements), this._gl.DYNAMIC_DRAW); + } + this.bindUniformBuffer(null); + result.references = 1; + return result; +}; +ThinEngine.prototype.updateUniformBuffer = function(uniformBuffer, elements, offset, count) { + this.bindUniformBuffer(uniformBuffer); + if (offset === void 0) { + offset = 0; + } + if (count === void 0) { + if (elements instanceof Float32Array) { + this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, offset, elements); + } else { + this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, offset, new Float32Array(elements)); + } + } else { + if (elements instanceof Float32Array) { + this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, elements.subarray(offset, offset + count)); + } else { + this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, new Float32Array(elements).subarray(offset, offset + count)); } } + this.bindUniformBuffer(null); +}; +ThinEngine.prototype.bindUniformBuffer = function(buffer) { + this._gl.bindBuffer(this._gl.UNIFORM_BUFFER, buffer ? buffer.underlyingResource : null); +}; +ThinEngine.prototype.bindUniformBufferBase = function(buffer, location2, name69) { + this._gl.bindBufferBase(this._gl.UNIFORM_BUFFER, location2, buffer ? buffer.underlyingResource : null); +}; +ThinEngine.prototype.bindUniformBlock = function(pipelineContext, blockName, index) { + const program = pipelineContext.program; + const uniformLocation = this._gl.getUniformBlockIndex(program, blockName); + if (uniformLocation !== 4294967295) { + this._gl.uniformBlockBinding(program, uniformLocation, index); + } +}; + +// node_modules/@babylonjs/core/Materials/uniformBuffer.js +var UniformBuffer = class _UniformBuffer { /** - * Resets the sprites information of the group to prepare a new frame - * @internal + * Instantiates a new Uniform buffer objects. + * + * Handles blocks of uniform on the GPU. + * + * If WebGL 2 is not available, this class falls back on traditional setUniformXXX calls. + * + * For more information, please refer to : + * @see https://www.khronos.org/opengl/wiki/Uniform_Buffer_Object + * @param engine Define the engine the buffer is associated with + * @param data Define the data contained in the buffer + * @param dynamic Define if the buffer is updatable + * @param name to assign to the buffer (debugging purpose) + * @param forceNoUniformBuffer define that this object must not rely on UBO objects */ - resetSprites() { - if (this.maintainStateBetweenFrames) { - return; + constructor(engine, data, dynamic, name69, forceNoUniformBuffer = false) { + this._valueCache = {}; + this._engine = engine; + this._noUBO = !engine.supportsUniformBuffers || forceNoUniformBuffer; + this._dynamic = dynamic; + this._name = name69 ?? "no-name"; + this._data = data || []; + this._uniformLocations = {}; + this._uniformSizes = {}; + this._uniformArraySizes = {}; + this._uniformLocationPointer = 0; + this._needSync = false; + if (this._engine._features.trackUbosInFrame) { + this._buffers = []; + this._bufferIndex = -1; + this._createBufferOnWrite = false; + this._currentFrameId = 0; } - for (let index = _RenderingManager.MIN_RENDERINGGROUPS; index < _RenderingManager.MAX_RENDERINGGROUPS; index++) { - const renderingGroup = this._renderingGroups[index]; - if (renderingGroup) { - renderingGroup.prepareSprites(); - } + if (this._noUBO) { + this.updateMatrix3x3 = this._updateMatrix3x3ForEffect; + this.updateMatrix2x2 = this._updateMatrix2x2ForEffect; + this.updateFloat = this._updateFloatForEffect; + this.updateFloat2 = this._updateFloat2ForEffect; + this.updateFloat3 = this._updateFloat3ForEffect; + this.updateFloat4 = this._updateFloat4ForEffect; + this.updateFloatArray = this._updateFloatArrayForEffect; + this.updateArray = this._updateArrayForEffect; + this.updateIntArray = this._updateIntArrayForEffect; + this.updateUIntArray = this._updateUIntArrayForEffect; + this.updateMatrix = this._updateMatrixForEffect; + this.updateMatrices = this._updateMatricesForEffect; + this.updateVector3 = this._updateVector3ForEffect; + this.updateVector4 = this._updateVector4ForEffect; + this.updateColor3 = this._updateColor3ForEffect; + this.updateColor4 = this._updateColor4ForEffect; + this.updateDirectColor4 = this._updateDirectColor4ForEffect; + this.updateInt = this._updateIntForEffect; + this.updateInt2 = this._updateInt2ForEffect; + this.updateInt3 = this._updateInt3ForEffect; + this.updateInt4 = this._updateInt4ForEffect; + this.updateUInt = this._updateUIntForEffect; + this.updateUInt2 = this._updateUInt2ForEffect; + this.updateUInt3 = this._updateUInt3ForEffect; + this.updateUInt4 = this._updateUInt4ForEffect; + } else { + this._engine._uniformBuffers.push(this); + this.updateMatrix3x3 = this._updateMatrix3x3ForUniform; + this.updateMatrix2x2 = this._updateMatrix2x2ForUniform; + this.updateFloat = this._updateFloatForUniform; + this.updateFloat2 = this._updateFloat2ForUniform; + this.updateFloat3 = this._updateFloat3ForUniform; + this.updateFloat4 = this._updateFloat4ForUniform; + this.updateFloatArray = this._updateFloatArrayForUniform; + this.updateArray = this._updateArrayForUniform; + this.updateIntArray = this._updateIntArrayForUniform; + this.updateUIntArray = this._updateUIntArrayForUniform; + this.updateMatrix = this._updateMatrixForUniform; + this.updateMatrices = this._updateMatricesForUniform; + this.updateVector3 = this._updateVector3ForUniform; + this.updateVector4 = this._updateVector4ForUniform; + this.updateColor3 = this._updateColor3ForUniform; + this.updateColor4 = this._updateColor4ForUniform; + this.updateDirectColor4 = this._updateDirectColor4ForUniform; + this.updateInt = this._updateIntForUniform; + this.updateInt2 = this._updateInt2ForUniform; + this.updateInt3 = this._updateInt3ForUniform; + this.updateInt4 = this._updateInt4ForUniform; + this.updateUInt = this._updateUIntForUniform; + this.updateUInt2 = this._updateUInt2ForUniform; + this.updateUInt3 = this._updateUInt3ForUniform; + this.updateUInt4 = this._updateUInt4ForUniform; } } /** - * Dispose and release the group and its associated resources. - * @internal + * Indicates if the buffer is using the WebGL2 UBO implementation, + * or just falling back on setUniformXXX calls. */ - dispose() { - this.freeRenderingGroups(); - this._renderingGroups.length = 0; - this._renderingGroupInfo = null; + get useUbo() { + return !this._noUBO; } /** - * Clear the info related to rendering groups preventing retention points during dispose. + * Indicates if the WebGL underlying uniform buffer is in sync + * with the javascript cache data. */ - freeRenderingGroups() { - for (let index = _RenderingManager.MIN_RENDERINGGROUPS; index < _RenderingManager.MAX_RENDERINGGROUPS; index++) { - const renderingGroup = this._renderingGroups[index]; - if (renderingGroup) { - renderingGroup.dispose(); - } - } + get isSync() { + return !this._needSync; } - _prepareRenderingGroup(renderingGroupId) { - if (this._renderingGroups[renderingGroupId] === void 0) { - this._renderingGroups[renderingGroupId] = new RenderingGroup(renderingGroupId, this._scene, this._customOpaqueSortCompareFn[renderingGroupId], this._customAlphaTestSortCompareFn[renderingGroupId], this._customTransparentSortCompareFn[renderingGroupId]); - } + /** + * Indicates if the WebGL underlying uniform buffer is dynamic. + * Also, a dynamic UniformBuffer will disable cache verification and always + * update the underlying WebGL uniform buffer to the GPU. + * @returns if Dynamic, otherwise false + */ + isDynamic() { + return this._dynamic !== void 0; } /** - * Add a sprite manager to the rendering manager in order to render it this frame. - * @param spriteManager Define the sprite manager to render + * The data cache on JS side. + * @returns the underlying data as a float array */ - dispatchSprites(spriteManager) { - if (this.maintainStateBetweenFrames && spriteManager._wasDispatched) { - return; - } - spriteManager._wasDispatched = true; - this.getRenderingGroup(spriteManager.renderingGroupId).dispatchSprites(spriteManager); + getData() { + return this._bufferData; } /** - * Add a particle system to the rendering manager in order to render it this frame. - * @param particleSystem Define the particle system to render + * The underlying WebGL Uniform buffer. + * @returns the webgl buffer */ - dispatchParticles(particleSystem) { - if (this.maintainStateBetweenFrames && particleSystem._wasDispatched) { - return; - } - particleSystem._wasDispatched = true; - this.getRenderingGroup(particleSystem.renderingGroupId).dispatchParticles(particleSystem); + getBuffer() { + return this._buffer; } /** - * Add a submesh to the manager in order to render it this frame - * @param subMesh The submesh to dispatch - * @param mesh Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance. - * @param material Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance. + * std140 layout specifies how to align data within an UBO structure. + * See https://khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf#page=159 + * for specs. + * @param size */ - dispatch(subMesh, mesh, material) { - if (mesh === void 0) { - mesh = subMesh.getMesh(); + _fillAlignment(size) { + let alignment; + if (size <= 2) { + alignment = size; + } else { + alignment = 4; } - if (this.maintainStateBetweenFrames && subMesh._wasDispatched) { - return; + if (this._uniformLocationPointer % alignment !== 0) { + const oldPointer = this._uniformLocationPointer; + this._uniformLocationPointer += alignment - this._uniformLocationPointer % alignment; + const diff = this._uniformLocationPointer - oldPointer; + for (let i = 0; i < diff; i++) { + this._data.push(0); + } } - subMesh._wasDispatched = true; - this.getRenderingGroup(mesh.renderingGroupId).dispatch(subMesh, mesh, material); } /** - * Overrides the default sort function applied in the rendering group to prepare the meshes. - * This allowed control for front to back rendering or reversely depending of the special needs. - * - * @param renderingGroupId The rendering group id corresponding to its index - * @param opaqueSortCompareFn The opaque queue comparison function use to sort. - * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort. - * @param transparentSortCompareFn The transparent queue comparison function use to sort. + * Adds an uniform in the buffer. + * Warning : the subsequents calls of this function must be in the same order as declared in the shader + * for the layout to be correct ! The addUniform function only handles types like float, vec2, vec3, vec4, mat4, + * meaning size=1,2,3,4 or 16. It does not handle struct types. + * @param name Name of the uniform, as used in the uniform block in the shader. + * @param size Data size, or data directly. + * @param arraySize The number of elements in the array, 0 if not an array. */ - setRenderingOrder(renderingGroupId, opaqueSortCompareFn = null, alphaTestSortCompareFn = null, transparentSortCompareFn = null) { - this._customOpaqueSortCompareFn[renderingGroupId] = opaqueSortCompareFn; - this._customAlphaTestSortCompareFn[renderingGroupId] = alphaTestSortCompareFn; - this._customTransparentSortCompareFn[renderingGroupId] = transparentSortCompareFn; - if (this._renderingGroups[renderingGroupId]) { - const group = this._renderingGroups[renderingGroupId]; - group.opaqueSortCompareFn = this._customOpaqueSortCompareFn[renderingGroupId]; - group.alphaTestSortCompareFn = this._customAlphaTestSortCompareFn[renderingGroupId]; - group.transparentSortCompareFn = this._customTransparentSortCompareFn[renderingGroupId]; + addUniform(name69, size, arraySize = 0) { + if (this._noUBO) { + return; + } + if (this._uniformLocations[name69] !== void 0) { + return; + } + let data; + if (arraySize > 0) { + if (size instanceof Array) { + throw "addUniform should not be use with Array in UBO: " + name69; + } + this._fillAlignment(4); + this._uniformArraySizes[name69] = { strideSize: size, arraySize }; + if (size == 16) { + size = size * arraySize; + } else { + const perElementPadding = 4 - size; + const totalPadding = perElementPadding * arraySize; + size = size * arraySize + totalPadding; + } + data = []; + for (let i = 0; i < size; i++) { + data.push(0); + } + } else { + if (size instanceof Array) { + data = size; + size = data.length; + } else { + size = size; + data = []; + for (let i = 0; i < size; i++) { + data.push(0); + } + } + this._fillAlignment(size); + } + this._uniformSizes[name69] = size; + this._uniformLocations[name69] = this._uniformLocationPointer; + this._uniformLocationPointer += size; + for (let i = 0; i < size; i++) { + this._data.push(data[i]); } + this._needSync = true; } /** - * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups. - * - * @param renderingGroupId The rendering group id corresponding to its index - * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true. - * @param depth Automatically clears depth between groups if true and autoClear is true. - * @param stencil Automatically clears stencil between groups if true and autoClear is true. + * Adds a Matrix 4x4 to the uniform buffer. + * @param name Name of the uniform, as used in the uniform block in the shader. + * @param mat A 4x4 matrix. */ - setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil, depth = true, stencil = true) { - this._autoClearDepthStencil[renderingGroupId] = { - autoClear: autoClearDepthStencil, - depth, - stencil - }; + addMatrix(name69, mat) { + this.addUniform(name69, Array.prototype.slice.call(mat.asArray())); } /** - * Gets the current auto clear configuration for one rendering group of the rendering - * manager. - * @param index the rendering group index to get the information for - * @returns The auto clear setup for the requested rendering group + * Adds a vec2 to the uniform buffer. + * @param name Name of the uniform, as used in the uniform block in the shader. + * @param x Define the x component value of the vec2 + * @param y Define the y component value of the vec2 */ - getAutoClearDepthStencilSetup(index) { - return this._autoClearDepthStencil[index]; + addFloat2(name69, x, y) { + const temp = [x, y]; + this.addUniform(name69, temp); } -}; -RenderingManager.MAX_RENDERINGGROUPS = 4; -RenderingManager.MIN_RENDERINGGROUPS = 0; -RenderingManager.AUTOCLEAR = true; - -// node_modules/@babylonjs/core/sceneComponent.js -var SceneComponentConstants = class { -}; -SceneComponentConstants.NAME_EFFECTLAYER = "EffectLayer"; -SceneComponentConstants.NAME_LAYER = "Layer"; -SceneComponentConstants.NAME_LENSFLARESYSTEM = "LensFlareSystem"; -SceneComponentConstants.NAME_BOUNDINGBOXRENDERER = "BoundingBoxRenderer"; -SceneComponentConstants.NAME_PARTICLESYSTEM = "ParticleSystem"; -SceneComponentConstants.NAME_GAMEPAD = "Gamepad"; -SceneComponentConstants.NAME_SIMPLIFICATIONQUEUE = "SimplificationQueue"; -SceneComponentConstants.NAME_GEOMETRYBUFFERRENDERER = "GeometryBufferRenderer"; -SceneComponentConstants.NAME_PREPASSRENDERER = "PrePassRenderer"; -SceneComponentConstants.NAME_DEPTHRENDERER = "DepthRenderer"; -SceneComponentConstants.NAME_DEPTHPEELINGRENDERER = "DepthPeelingRenderer"; -SceneComponentConstants.NAME_POSTPROCESSRENDERPIPELINEMANAGER = "PostProcessRenderPipelineManager"; -SceneComponentConstants.NAME_SPRITE = "Sprite"; -SceneComponentConstants.NAME_SUBSURFACE = "SubSurface"; -SceneComponentConstants.NAME_OUTLINERENDERER = "Outline"; -SceneComponentConstants.NAME_PROCEDURALTEXTURE = "ProceduralTexture"; -SceneComponentConstants.NAME_SHADOWGENERATOR = "ShadowGenerator"; -SceneComponentConstants.NAME_OCTREE = "Octree"; -SceneComponentConstants.NAME_PHYSICSENGINE = "PhysicsEngine"; -SceneComponentConstants.NAME_AUDIO = "Audio"; -SceneComponentConstants.NAME_FLUIDRENDERER = "FluidRenderer"; -SceneComponentConstants.STEP_ISREADYFORMESH_EFFECTLAYER = 0; -SceneComponentConstants.STEP_BEFOREEVALUATEACTIVEMESH_BOUNDINGBOXRENDERER = 0; -SceneComponentConstants.STEP_EVALUATESUBMESH_BOUNDINGBOXRENDERER = 0; -SceneComponentConstants.STEP_PREACTIVEMESH_BOUNDINGBOXRENDERER = 0; -SceneComponentConstants.STEP_CAMERADRAWRENDERTARGET_EFFECTLAYER = 1; -SceneComponentConstants.STEP_BEFORECAMERADRAW_PREPASS = 0; -SceneComponentConstants.STEP_BEFORECAMERADRAW_EFFECTLAYER = 1; -SceneComponentConstants.STEP_BEFORECAMERADRAW_LAYER = 2; -SceneComponentConstants.STEP_BEFORERENDERTARGETDRAW_PREPASS = 0; -SceneComponentConstants.STEP_BEFORERENDERTARGETDRAW_LAYER = 1; -SceneComponentConstants.STEP_BEFORERENDERINGMESH_PREPASS = 0; -SceneComponentConstants.STEP_BEFORERENDERINGMESH_OUTLINE = 1; -SceneComponentConstants.STEP_AFTERRENDERINGMESH_PREPASS = 0; -SceneComponentConstants.STEP_AFTERRENDERINGMESH_OUTLINE = 1; -SceneComponentConstants.STEP_AFTERRENDERINGGROUPDRAW_EFFECTLAYER_DRAW = 0; -SceneComponentConstants.STEP_AFTERRENDERINGGROUPDRAW_BOUNDINGBOXRENDERER = 1; -SceneComponentConstants.STEP_BEFORECAMERAUPDATE_SIMPLIFICATIONQUEUE = 0; -SceneComponentConstants.STEP_BEFORECAMERAUPDATE_GAMEPAD = 1; -SceneComponentConstants.STEP_BEFORECLEAR_PROCEDURALTEXTURE = 0; -SceneComponentConstants.STEP_BEFORECLEAR_PREPASS = 1; -SceneComponentConstants.STEP_BEFORERENDERTARGETCLEAR_PREPASS = 0; -SceneComponentConstants.STEP_AFTERRENDERTARGETDRAW_PREPASS = 0; -SceneComponentConstants.STEP_AFTERRENDERTARGETDRAW_LAYER = 1; -SceneComponentConstants.STEP_AFTERCAMERADRAW_PREPASS = 0; -SceneComponentConstants.STEP_AFTERCAMERADRAW_EFFECTLAYER = 1; -SceneComponentConstants.STEP_AFTERCAMERADRAW_LENSFLARESYSTEM = 2; -SceneComponentConstants.STEP_AFTERCAMERADRAW_EFFECTLAYER_DRAW = 3; -SceneComponentConstants.STEP_AFTERCAMERADRAW_LAYER = 4; -SceneComponentConstants.STEP_AFTERCAMERADRAW_FLUIDRENDERER = 5; -SceneComponentConstants.STEP_AFTERCAMERAPOSTPROCESS_LAYER = 0; -SceneComponentConstants.STEP_AFTERRENDERTARGETPOSTPROCESS_LAYER = 0; -SceneComponentConstants.STEP_AFTERRENDER_AUDIO = 0; -SceneComponentConstants.STEP_GATHERRENDERTARGETS_DEPTHRENDERER = 0; -SceneComponentConstants.STEP_GATHERRENDERTARGETS_GEOMETRYBUFFERRENDERER = 1; -SceneComponentConstants.STEP_GATHERRENDERTARGETS_SHADOWGENERATOR = 2; -SceneComponentConstants.STEP_GATHERRENDERTARGETS_POSTPROCESSRENDERPIPELINEMANAGER = 3; -SceneComponentConstants.STEP_GATHERACTIVECAMERARENDERTARGETS_DEPTHRENDERER = 0; -SceneComponentConstants.STEP_GATHERACTIVECAMERARENDERTARGETS_FLUIDRENDERER = 1; -SceneComponentConstants.STEP_POINTERMOVE_SPRITE = 0; -SceneComponentConstants.STEP_POINTERDOWN_SPRITE = 0; -SceneComponentConstants.STEP_POINTERUP_SPRITE = 0; -var Stage = class _Stage extends Array { /** - * Hide ctor from the rest of the world. - * @param items The items to add. + * Adds a vec3 to the uniform buffer. + * @param name Name of the uniform, as used in the uniform block in the shader. + * @param x Define the x component value of the vec3 + * @param y Define the y component value of the vec3 + * @param z Define the z component value of the vec3 */ - constructor(items) { - super(...items); + addFloat3(name69, x, y, z) { + const temp = [x, y, z]; + this.addUniform(name69, temp); } /** - * Creates a new Stage. - * @returns A new instance of a Stage - */ - static Create() { - return Object.create(_Stage.prototype); + * Adds a vec3 to the uniform buffer. + * @param name Name of the uniform, as used in the uniform block in the shader. + * @param color Define the vec3 from a Color + */ + addColor3(name69, color) { + const temp = [color.r, color.g, color.b]; + this.addUniform(name69, temp); } /** - * Registers a step in an ordered way in the targeted stage. - * @param index Defines the position to register the step in - * @param component Defines the component attached to the step - * @param action Defines the action to launch during the step + * Adds a vec4 to the uniform buffer. + * @param name Name of the uniform, as used in the uniform block in the shader. + * @param color Define the rgb components from a Color + * @param alpha Define the a component of the vec4 */ - registerStep(index, component, action) { - let i = 0; - let maxIndex = Number.MAX_VALUE; - for (; i < this.length; i++) { - const step = this[i]; - maxIndex = step.index; - if (index < maxIndex) { - break; - } - } - this.splice(i, 0, { index, component, action: action.bind(component) }); + addColor4(name69, color, alpha) { + const temp = [color.r, color.g, color.b, alpha]; + this.addUniform(name69, temp); } /** - * Clears all the steps from the stage. + * Adds a vec3 to the uniform buffer. + * @param name Name of the uniform, as used in the uniform block in the shader. + * @param vector Define the vec3 components from a Vector */ - clear() { - this.length = 0; + addVector3(name69, vector) { + const temp = [vector.x, vector.y, vector.z]; + this.addUniform(name69, temp); } -}; - -// node_modules/@babylonjs/core/Events/pointerEvents.js -var PointerEventTypes = class { -}; -PointerEventTypes.POINTERDOWN = 1; -PointerEventTypes.POINTERUP = 2; -PointerEventTypes.POINTERMOVE = 4; -PointerEventTypes.POINTERWHEEL = 8; -PointerEventTypes.POINTERPICK = 16; -PointerEventTypes.POINTERTAP = 32; -PointerEventTypes.POINTERDOUBLETAP = 64; -var PointerInfoBase = class { /** - * Instantiates the base class of pointers info. - * @param type Defines the type of event (PointerEventTypes) - * @param event Defines the related dom event + * Adds a Matrix 3x3 to the uniform buffer. + * @param name Name of the uniform, as used in the uniform block in the shader. */ - constructor(type, event) { - this.type = type; - this.event = event; + addMatrix3x3(name69) { + this.addUniform(name69, 12); } -}; -var PointerInfoPre = class extends PointerInfoBase { /** - * Instantiates a PointerInfoPre to store pointer related info to the onPrePointerObservable event. - * @param type Defines the type of event (PointerEventTypes) - * @param event Defines the related dom event - * @param localX Defines the local x coordinates of the pointer when the event occured - * @param localY Defines the local y coordinates of the pointer when the event occured + * Adds a Matrix 2x2 to the uniform buffer. + * @param name Name of the uniform, as used in the uniform block in the shader. */ - constructor(type, event, localX, localY) { - super(type, event); - this.ray = null; - this.originalPickingInfo = null; - this.skipOnPointerObservable = false; - this.localPosition = new Vector2(localX, localY); + addMatrix2x2(name69) { + this.addUniform(name69, 8); } -}; -var PointerInfo = class extends PointerInfoBase { /** - * Defines the picking info associated with this PointerInfo object (if applicable) + * Effectively creates the WebGL Uniform Buffer, once layout is completed with `addUniform`. */ - get pickInfo() { - if (!this._pickInfo) { - this._generatePickInfo(); + create() { + if (this._noUBO) { + return; } - return this._pickInfo; + if (this._buffer) { + return; + } + this._fillAlignment(4); + this._bufferData = new Float32Array(this._data); + this._rebuild(); + this._needSync = true; } - /** - * Instantiates a PointerInfo to store pointer related info to the onPointerObservable event. - * @param type Defines the type of event (PointerEventTypes) - * @param event Defines the related dom event - * @param pickInfo Defines the picking info associated to the info (if any) - * @param inputManager Defines the InputManager to use if there is no pickInfo - */ - constructor(type, event, pickInfo, inputManager = null) { - super(type, event); - this._pickInfo = pickInfo; - this._inputManager = inputManager; + // The result of this method is used for debugging purpose, as part of the buffer name + // It is meant to more easily know what this buffer is about when debugging + // Some buffers can have a lot of uniforms (several dozens), so the method only returns the first 10 of them + // (should be enough to understand what the buffer is for) + _getNames() { + const names = []; + let i = 0; + for (const name69 in this._uniformLocations) { + names.push(name69); + if (++i === 10) { + break; + } + } + return names.join(","); } - /** - * Generates the picking info if needed - */ /** @internal */ - _generatePickInfo() { - if (this._inputManager) { - this._pickInfo = this._inputManager._pickMove(this.event); - this._inputManager._setRayOnPointerInfo(this._pickInfo, this.event); - this._inputManager = null; + _rebuild() { + if (this._noUBO || !this._bufferData) { + return; + } + if (this._dynamic) { + this._buffer = this._engine.createDynamicUniformBuffer(this._bufferData, this._name + "_UniformList:" + this._getNames()); + } else { + this._buffer = this._engine.createUniformBuffer(this._bufferData, this._name + "_UniformList:" + this._getNames()); + } + if (this._engine._features.trackUbosInFrame) { + this._buffers.push([this._buffer, this._engine._features.checkUbosContentBeforeUpload ? this._bufferData.slice() : void 0]); + this._bufferIndex = this._buffers.length - 1; + this._createBufferOnWrite = false; } } -}; - -// node_modules/@babylonjs/core/Events/keyboardEvents.js -var KeyboardEventTypes = class { -}; -KeyboardEventTypes.KEYDOWN = 1; -KeyboardEventTypes.KEYUP = 2; -var KeyboardInfo = class { - /** - * Instantiates a new keyboard info. - * This class is used to store keyboard related info for the onKeyboardObservable event. - * @param type Defines the type of event (KeyboardEventTypes) - * @param event Defines the related dom event - */ - constructor(type, event) { - this.type = type; - this.event = event; + /** @internal */ + _rebuildAfterContextLost() { + if (this._engine._features.trackUbosInFrame) { + this._buffers = []; + this._currentFrameId = 0; + } + this._rebuild(); } -}; -var KeyboardInfoPre = class extends KeyboardInfo { - /** - * Defines whether the engine should skip the next onKeyboardObservable associated to this pre. - * @deprecated use skipOnKeyboardObservable property instead - */ - get skipOnPointerObservable() { - return this.skipOnKeyboardObservable; + /** @internal */ + get _numBuffers() { + return this._buffers.length; } - set skipOnPointerObservable(value) { - this.skipOnKeyboardObservable = value; + /** @internal */ + get _indexBuffer() { + return this._bufferIndex; } - /** - * Instantiates a new keyboard pre info. - * This class is used to store keyboard related info for the onPreKeyboardObservable event. - * @param type Defines the type of event (KeyboardEventTypes) - * @param event Defines the related dom event - */ - constructor(type, event) { - super(type, event); - this.type = type; - this.event = event; - this.skipOnKeyboardObservable = false; + /** Gets the name of this buffer */ + get name() { + return this._name; } -}; - -// node_modules/@babylonjs/core/DeviceInput/InputDevices/deviceEnums.js -var DeviceType; -(function(DeviceType2) { - DeviceType2[DeviceType2["Generic"] = 0] = "Generic"; - DeviceType2[DeviceType2["Keyboard"] = 1] = "Keyboard"; - DeviceType2[DeviceType2["Mouse"] = 2] = "Mouse"; - DeviceType2[DeviceType2["Touch"] = 3] = "Touch"; - DeviceType2[DeviceType2["DualShock"] = 4] = "DualShock"; - DeviceType2[DeviceType2["Xbox"] = 5] = "Xbox"; - DeviceType2[DeviceType2["Switch"] = 6] = "Switch"; - DeviceType2[DeviceType2["DualSense"] = 7] = "DualSense"; -})(DeviceType || (DeviceType = {})); -var PointerInput; -(function(PointerInput2) { - PointerInput2[PointerInput2["Horizontal"] = 0] = "Horizontal"; - PointerInput2[PointerInput2["Vertical"] = 1] = "Vertical"; - PointerInput2[PointerInput2["LeftClick"] = 2] = "LeftClick"; - PointerInput2[PointerInput2["MiddleClick"] = 3] = "MiddleClick"; - PointerInput2[PointerInput2["RightClick"] = 4] = "RightClick"; - PointerInput2[PointerInput2["BrowserBack"] = 5] = "BrowserBack"; - PointerInput2[PointerInput2["BrowserForward"] = 6] = "BrowserForward"; - PointerInput2[PointerInput2["MouseWheelX"] = 7] = "MouseWheelX"; - PointerInput2[PointerInput2["MouseWheelY"] = 8] = "MouseWheelY"; - PointerInput2[PointerInput2["MouseWheelZ"] = 9] = "MouseWheelZ"; - PointerInput2[PointerInput2["Move"] = 12] = "Move"; -})(PointerInput || (PointerInput = {})); -var NativePointerInput; -(function(NativePointerInput2) { - NativePointerInput2[NativePointerInput2["Horizontal"] = 0] = "Horizontal"; - NativePointerInput2[NativePointerInput2["Vertical"] = 1] = "Vertical"; - NativePointerInput2[NativePointerInput2["LeftClick"] = 2] = "LeftClick"; - NativePointerInput2[NativePointerInput2["MiddleClick"] = 3] = "MiddleClick"; - NativePointerInput2[NativePointerInput2["RightClick"] = 4] = "RightClick"; - NativePointerInput2[NativePointerInput2["BrowserBack"] = 5] = "BrowserBack"; - NativePointerInput2[NativePointerInput2["BrowserForward"] = 6] = "BrowserForward"; - NativePointerInput2[NativePointerInput2["MouseWheelX"] = 7] = "MouseWheelX"; - NativePointerInput2[NativePointerInput2["MouseWheelY"] = 8] = "MouseWheelY"; - NativePointerInput2[NativePointerInput2["MouseWheelZ"] = 9] = "MouseWheelZ"; - NativePointerInput2[NativePointerInput2["DeltaHorizontal"] = 10] = "DeltaHorizontal"; - NativePointerInput2[NativePointerInput2["DeltaVertical"] = 11] = "DeltaVertical"; -})(NativePointerInput || (NativePointerInput = {})); -var DualShockInput; -(function(DualShockInput2) { - DualShockInput2[DualShockInput2["Cross"] = 0] = "Cross"; - DualShockInput2[DualShockInput2["Circle"] = 1] = "Circle"; - DualShockInput2[DualShockInput2["Square"] = 2] = "Square"; - DualShockInput2[DualShockInput2["Triangle"] = 3] = "Triangle"; - DualShockInput2[DualShockInput2["L1"] = 4] = "L1"; - DualShockInput2[DualShockInput2["R1"] = 5] = "R1"; - DualShockInput2[DualShockInput2["L2"] = 6] = "L2"; - DualShockInput2[DualShockInput2["R2"] = 7] = "R2"; - DualShockInput2[DualShockInput2["Share"] = 8] = "Share"; - DualShockInput2[DualShockInput2["Options"] = 9] = "Options"; - DualShockInput2[DualShockInput2["L3"] = 10] = "L3"; - DualShockInput2[DualShockInput2["R3"] = 11] = "R3"; - DualShockInput2[DualShockInput2["DPadUp"] = 12] = "DPadUp"; - DualShockInput2[DualShockInput2["DPadDown"] = 13] = "DPadDown"; - DualShockInput2[DualShockInput2["DPadLeft"] = 14] = "DPadLeft"; - DualShockInput2[DualShockInput2["DPadRight"] = 15] = "DPadRight"; - DualShockInput2[DualShockInput2["Home"] = 16] = "Home"; - DualShockInput2[DualShockInput2["TouchPad"] = 17] = "TouchPad"; - DualShockInput2[DualShockInput2["LStickXAxis"] = 18] = "LStickXAxis"; - DualShockInput2[DualShockInput2["LStickYAxis"] = 19] = "LStickYAxis"; - DualShockInput2[DualShockInput2["RStickXAxis"] = 20] = "RStickXAxis"; - DualShockInput2[DualShockInput2["RStickYAxis"] = 21] = "RStickYAxis"; -})(DualShockInput || (DualShockInput = {})); -var DualSenseInput; -(function(DualSenseInput2) { - DualSenseInput2[DualSenseInput2["Cross"] = 0] = "Cross"; - DualSenseInput2[DualSenseInput2["Circle"] = 1] = "Circle"; - DualSenseInput2[DualSenseInput2["Square"] = 2] = "Square"; - DualSenseInput2[DualSenseInput2["Triangle"] = 3] = "Triangle"; - DualSenseInput2[DualSenseInput2["L1"] = 4] = "L1"; - DualSenseInput2[DualSenseInput2["R1"] = 5] = "R1"; - DualSenseInput2[DualSenseInput2["L2"] = 6] = "L2"; - DualSenseInput2[DualSenseInput2["R2"] = 7] = "R2"; - DualSenseInput2[DualSenseInput2["Create"] = 8] = "Create"; - DualSenseInput2[DualSenseInput2["Options"] = 9] = "Options"; - DualSenseInput2[DualSenseInput2["L3"] = 10] = "L3"; - DualSenseInput2[DualSenseInput2["R3"] = 11] = "R3"; - DualSenseInput2[DualSenseInput2["DPadUp"] = 12] = "DPadUp"; - DualSenseInput2[DualSenseInput2["DPadDown"] = 13] = "DPadDown"; - DualSenseInput2[DualSenseInput2["DPadLeft"] = 14] = "DPadLeft"; - DualSenseInput2[DualSenseInput2["DPadRight"] = 15] = "DPadRight"; - DualSenseInput2[DualSenseInput2["Home"] = 16] = "Home"; - DualSenseInput2[DualSenseInput2["TouchPad"] = 17] = "TouchPad"; - DualSenseInput2[DualSenseInput2["LStickXAxis"] = 18] = "LStickXAxis"; - DualSenseInput2[DualSenseInput2["LStickYAxis"] = 19] = "LStickYAxis"; - DualSenseInput2[DualSenseInput2["RStickXAxis"] = 20] = "RStickXAxis"; - DualSenseInput2[DualSenseInput2["RStickYAxis"] = 21] = "RStickYAxis"; -})(DualSenseInput || (DualSenseInput = {})); -var XboxInput; -(function(XboxInput2) { - XboxInput2[XboxInput2["A"] = 0] = "A"; - XboxInput2[XboxInput2["B"] = 1] = "B"; - XboxInput2[XboxInput2["X"] = 2] = "X"; - XboxInput2[XboxInput2["Y"] = 3] = "Y"; - XboxInput2[XboxInput2["LB"] = 4] = "LB"; - XboxInput2[XboxInput2["RB"] = 5] = "RB"; - XboxInput2[XboxInput2["LT"] = 6] = "LT"; - XboxInput2[XboxInput2["RT"] = 7] = "RT"; - XboxInput2[XboxInput2["Back"] = 8] = "Back"; - XboxInput2[XboxInput2["Start"] = 9] = "Start"; - XboxInput2[XboxInput2["LS"] = 10] = "LS"; - XboxInput2[XboxInput2["RS"] = 11] = "RS"; - XboxInput2[XboxInput2["DPadUp"] = 12] = "DPadUp"; - XboxInput2[XboxInput2["DPadDown"] = 13] = "DPadDown"; - XboxInput2[XboxInput2["DPadLeft"] = 14] = "DPadLeft"; - XboxInput2[XboxInput2["DPadRight"] = 15] = "DPadRight"; - XboxInput2[XboxInput2["Home"] = 16] = "Home"; - XboxInput2[XboxInput2["LStickXAxis"] = 17] = "LStickXAxis"; - XboxInput2[XboxInput2["LStickYAxis"] = 18] = "LStickYAxis"; - XboxInput2[XboxInput2["RStickXAxis"] = 19] = "RStickXAxis"; - XboxInput2[XboxInput2["RStickYAxis"] = 20] = "RStickYAxis"; -})(XboxInput || (XboxInput = {})); -var SwitchInput; -(function(SwitchInput2) { - SwitchInput2[SwitchInput2["B"] = 0] = "B"; - SwitchInput2[SwitchInput2["A"] = 1] = "A"; - SwitchInput2[SwitchInput2["Y"] = 2] = "Y"; - SwitchInput2[SwitchInput2["X"] = 3] = "X"; - SwitchInput2[SwitchInput2["L"] = 4] = "L"; - SwitchInput2[SwitchInput2["R"] = 5] = "R"; - SwitchInput2[SwitchInput2["ZL"] = 6] = "ZL"; - SwitchInput2[SwitchInput2["ZR"] = 7] = "ZR"; - SwitchInput2[SwitchInput2["Minus"] = 8] = "Minus"; - SwitchInput2[SwitchInput2["Plus"] = 9] = "Plus"; - SwitchInput2[SwitchInput2["LS"] = 10] = "LS"; - SwitchInput2[SwitchInput2["RS"] = 11] = "RS"; - SwitchInput2[SwitchInput2["DPadUp"] = 12] = "DPadUp"; - SwitchInput2[SwitchInput2["DPadDown"] = 13] = "DPadDown"; - SwitchInput2[SwitchInput2["DPadLeft"] = 14] = "DPadLeft"; - SwitchInput2[SwitchInput2["DPadRight"] = 15] = "DPadRight"; - SwitchInput2[SwitchInput2["Home"] = 16] = "Home"; - SwitchInput2[SwitchInput2["Capture"] = 17] = "Capture"; - SwitchInput2[SwitchInput2["LStickXAxis"] = 18] = "LStickXAxis"; - SwitchInput2[SwitchInput2["LStickYAxis"] = 19] = "LStickYAxis"; - SwitchInput2[SwitchInput2["RStickXAxis"] = 20] = "RStickXAxis"; - SwitchInput2[SwitchInput2["RStickYAxis"] = 21] = "RStickYAxis"; -})(SwitchInput || (SwitchInput = {})); - -// node_modules/@babylonjs/core/Events/deviceInputEvents.js -var DeviceInputEventType; -(function(DeviceInputEventType2) { - DeviceInputEventType2[DeviceInputEventType2["PointerMove"] = 0] = "PointerMove"; - DeviceInputEventType2[DeviceInputEventType2["PointerDown"] = 1] = "PointerDown"; - DeviceInputEventType2[DeviceInputEventType2["PointerUp"] = 2] = "PointerUp"; -})(DeviceInputEventType || (DeviceInputEventType = {})); -var EventConstants = class { -}; -EventConstants.DOM_DELTA_PIXEL = 0; -EventConstants.DOM_DELTA_LINE = 1; -EventConstants.DOM_DELTA_PAGE = 2; - -// node_modules/@babylonjs/core/DeviceInput/InputDevices/deviceSource.js -var DeviceSource = class { - /** - * Default Constructor - * @param deviceInputSystem - Reference to DeviceInputSystem - * @param deviceType - Type of device - * @param deviceSlot - "Slot" or index that device is referenced in - */ - constructor(deviceInputSystem, deviceType, deviceSlot = 0) { - this.deviceType = deviceType; - this.deviceSlot = deviceSlot; - this.onInputChangedObservable = new Observable(); - this._deviceInputSystem = deviceInputSystem; + /** Gets the current effect */ + get currentEffect() { + return this._currentEffect; } - /** - * Get input for specific input - * @param inputIndex - index of specific input on device - * @returns Input value from DeviceInputSystem - */ - getInput(inputIndex) { - return this._deviceInputSystem.pollInput(this.deviceType, this.deviceSlot, inputIndex); + _buffersEqual(buf1, buf2) { + for (let i = 0; i < buf1.length; ++i) { + if (buf1[i] !== buf2[i]) { + return false; + } + } + return true; } -}; - -// node_modules/@babylonjs/core/DeviceInput/eventFactory.js -var DeviceEventFactory = class { - /** - * Create device input events based on provided type and slot - * - * @param deviceType Type of device - * @param deviceSlot "Slot" or index that device is referenced in - * @param inputIndex Id of input to be checked - * @param currentState Current value for given input - * @param deviceInputSystem Reference to DeviceInputSystem - * @param elementToAttachTo HTMLElement to reference as target for inputs - * @param pointerId PointerId to use for pointer events - * @returns IUIEvent object - */ - static CreateDeviceEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo, pointerId) { - switch (deviceType) { - case DeviceType.Keyboard: - return this._CreateKeyboardEvent(inputIndex, currentState, deviceInputSystem, elementToAttachTo); - case DeviceType.Mouse: - if (inputIndex === PointerInput.MouseWheelX || inputIndex === PointerInput.MouseWheelY || inputIndex === PointerInput.MouseWheelZ) { - return this._CreateWheelEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo); - } - case DeviceType.Touch: - return this._CreatePointerEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo, pointerId); - default: - throw `Unable to generate event for device ${DeviceType[deviceType]}`; + _copyBuffer(src, dst) { + for (let i = 0; i < src.length; ++i) { + dst[i] = src[i]; } } /** - * Creates pointer event - * - * @param deviceType Type of device - * @param deviceSlot "Slot" or index that device is referenced in - * @param inputIndex Id of input to be checked - * @param currentState Current value for given input - * @param deviceInputSystem Reference to DeviceInputSystem - * @param elementToAttachTo HTMLElement to reference as target for inputs - * @param pointerId PointerId to use for pointer events - * @returns IUIEvent object (Pointer) + * Updates the WebGL Uniform Buffer on the GPU. + * If the `dynamic` flag is set to true, no cache comparison is done. + * Otherwise, the buffer will be updated only if the cache differs. */ - static _CreatePointerEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo, pointerId) { - const evt = this._CreateMouseEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo); - if (deviceType === DeviceType.Mouse) { - evt.deviceType = DeviceType.Mouse; - evt.pointerId = 1; - evt.pointerType = "mouse"; + update() { + if (this._noUBO) { + return; + } + this.bindUniformBuffer(); + if (!this._buffer) { + this.create(); + return; + } + if (!this._dynamic && !this._needSync) { + this._createBufferOnWrite = this._engine._features.trackUbosInFrame; + return; + } + if (this._buffers && this._buffers.length > 1 && this._buffers[this._bufferIndex][1]) { + if (this._buffersEqual(this._bufferData, this._buffers[this._bufferIndex][1])) { + this._needSync = false; + this._createBufferOnWrite = this._engine._features.trackUbosInFrame; + return; + } else { + this._copyBuffer(this._bufferData, this._buffers[this._bufferIndex][1]); + } + } + this._engine.updateUniformBuffer(this._buffer, this._bufferData); + if (this._engine._features._collectUbosUpdatedInFrame) { + if (!_UniformBuffer._UpdatedUbosInFrame[this._name]) { + _UniformBuffer._UpdatedUbosInFrame[this._name] = 0; + } + _UniformBuffer._UpdatedUbosInFrame[this._name]++; + } + this._needSync = false; + this._createBufferOnWrite = this._engine._features.trackUbosInFrame; + } + _createNewBuffer() { + if (this._bufferIndex + 1 < this._buffers.length) { + this._bufferIndex++; + this._buffer = this._buffers[this._bufferIndex][0]; + this._createBufferOnWrite = false; + this._needSync = true; } else { - evt.deviceType = DeviceType.Touch; - evt.pointerId = pointerId ?? deviceSlot; - evt.pointerType = "touch"; + this._rebuild(); } - let buttons = 0; - buttons += deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.LeftClick); - buttons += deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.RightClick) * 2; - buttons += deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.MiddleClick) * 4; - evt.buttons = buttons; - if (inputIndex === PointerInput.Move) { - evt.type = "pointermove"; - } else if (inputIndex >= PointerInput.LeftClick && inputIndex <= PointerInput.RightClick) { - evt.type = currentState === 1 ? "pointerdown" : "pointerup"; - evt.button = inputIndex - 2; + } + _checkNewFrame() { + if (this._engine._features.trackUbosInFrame && this._currentFrameId !== this._engine.frameId) { + this._currentFrameId = this._engine.frameId; + this._createBufferOnWrite = false; + if (this._buffers && this._buffers.length > 0) { + this._needSync = this._bufferIndex !== 0; + this._bufferIndex = 0; + this._buffer = this._buffers[this._bufferIndex][0]; + } else { + this._bufferIndex = -1; + } } - return evt; } /** - * Create Mouse Wheel Event - * @param deviceType Type of device - * @param deviceSlot "Slot" or index that device is referenced in - * @param inputIndex Id of input to be checked - * @param currentState Current value for given input - * @param deviceInputSystem Reference to DeviceInputSystem - * @param elementToAttachTo HTMLElement to reference as target for inputs - * @returns IUIEvent object (Wheel) + * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU. + * @param uniformName Define the name of the uniform, as used in the uniform block in the shader. + * @param data Define the flattened data + * @param size Define the size of the data. */ - static _CreateWheelEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo) { - const evt = this._CreateMouseEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo); - evt.pointerId = 1; - evt.type = "wheel"; - evt.deltaMode = EventConstants.DOM_DELTA_PIXEL; - evt.deltaX = 0; - evt.deltaY = 0; - evt.deltaZ = 0; - switch (inputIndex) { - case PointerInput.MouseWheelX: - evt.deltaX = currentState; - break; - case PointerInput.MouseWheelY: - evt.deltaY = currentState; - break; - case PointerInput.MouseWheelZ: - evt.deltaZ = currentState; - break; + updateUniform(uniformName, data, size) { + this._checkNewFrame(); + let location2 = this._uniformLocations[uniformName]; + if (location2 === void 0) { + if (this._buffer) { + Logger.Error("Cannot add an uniform after UBO has been created. uniformName=" + uniformName); + return; + } + this.addUniform(uniformName, size); + location2 = this._uniformLocations[uniformName]; + } + if (!this._buffer) { + this.create(); + } + if (!this._dynamic) { + let changed = false; + for (let i = 0; i < size; i++) { + if (size === 16 && !this._engine._features.uniformBufferHardCheckMatrix || this._bufferData[location2 + i] !== Math.fround(data[i])) { + changed = true; + if (this._createBufferOnWrite) { + this._createNewBuffer(); + } + this._bufferData[location2 + i] = data[i]; + } + } + this._needSync = this._needSync || changed; + } else { + for (let i = 0; i < size; i++) { + this._bufferData[location2 + i] = data[i]; + } } - return evt; } /** - * Create Mouse Event - * @param deviceType Type of device - * @param deviceSlot "Slot" or index that device is referenced in - * @param inputIndex Id of input to be checked - * @param currentState Current value for given input - * @param deviceInputSystem Reference to DeviceInputSystem - * @param elementToAttachTo HTMLElement to reference as target for inputs - * @returns IUIEvent object (Mouse) + * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU. + * @param uniformName Define the name of the uniform, as used in the uniform block in the shader. + * @param data Define the flattened data + * @param size Define the size of the data. */ - static _CreateMouseEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo) { - const evt = this._CreateEvent(elementToAttachTo); - const pointerX = deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.Horizontal); - const pointerY = deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.Vertical); - if (elementToAttachTo) { - evt.movementX = 0; - evt.movementY = 0; - evt.offsetX = evt.movementX - elementToAttachTo.getBoundingClientRect().x; - evt.offsetY = evt.movementY - elementToAttachTo.getBoundingClientRect().y; + updateUniformArray(uniformName, data, size) { + this._checkNewFrame(); + const location2 = this._uniformLocations[uniformName]; + if (location2 === void 0) { + Logger.Error("Cannot add an uniform Array dynamically. Please, add it using addUniform and make sure that uniform buffers are supported by the current engine."); + return; + } + if (!this._buffer) { + this.create(); + } + const arraySizes = this._uniformArraySizes[uniformName]; + if (!this._dynamic) { + let changed = false; + let countToFour = 0; + let baseStride = 0; + for (let i = 0; i < size; i++) { + if (this._bufferData[location2 + baseStride * 4 + countToFour] !== Tools.FloatRound(data[i])) { + changed = true; + if (this._createBufferOnWrite) { + this._createNewBuffer(); + } + this._bufferData[location2 + baseStride * 4 + countToFour] = data[i]; + } + countToFour++; + if (countToFour === arraySizes.strideSize) { + for (; countToFour < 4; countToFour++) { + this._bufferData[location2 + baseStride * 4 + countToFour] = 0; + } + countToFour = 0; + baseStride++; + } + } + this._needSync = this._needSync || changed; } else { - evt.movementX = deviceInputSystem.pollInput(deviceType, deviceSlot, NativePointerInput.DeltaHorizontal); - evt.movementY = deviceInputSystem.pollInput(deviceType, deviceSlot, NativePointerInput.DeltaVertical); - evt.offsetX = 0; - evt.offsetY = 0; + for (let i = 0; i < size; i++) { + this._bufferData[location2 + i] = data[i]; + } } - this._CheckNonCharacterKeys(evt, deviceInputSystem); - evt.clientX = pointerX; - evt.clientY = pointerY; - evt.x = pointerX; - evt.y = pointerY; - evt.deviceType = deviceType; - evt.deviceSlot = deviceSlot; - evt.inputIndex = inputIndex; - return evt; + } + _cacheMatrix(name69, matrix) { + this._checkNewFrame(); + const cache = this._valueCache[name69]; + const flag = matrix.updateFlag; + if (cache !== void 0 && cache === flag) { + return false; + } + this._valueCache[name69] = flag; + return true; + } + // Update methods + _updateMatrix3x3ForUniform(name69, matrix) { + for (let i = 0; i < 3; i++) { + _UniformBuffer._TempBuffer[i * 4] = matrix[i * 3]; + _UniformBuffer._TempBuffer[i * 4 + 1] = matrix[i * 3 + 1]; + _UniformBuffer._TempBuffer[i * 4 + 2] = matrix[i * 3 + 2]; + _UniformBuffer._TempBuffer[i * 4 + 3] = 0; + } + this.updateUniform(name69, _UniformBuffer._TempBuffer, 12); + } + _updateMatrix3x3ForEffect(name69, matrix) { + this._currentEffect.setMatrix3x3(name69, matrix); + } + _updateMatrix2x2ForEffect(name69, matrix) { + this._currentEffect.setMatrix2x2(name69, matrix); + } + _updateMatrix2x2ForUniform(name69, matrix) { + for (let i = 0; i < 2; i++) { + _UniformBuffer._TempBuffer[i * 4] = matrix[i * 2]; + _UniformBuffer._TempBuffer[i * 4 + 1] = matrix[i * 2 + 1]; + _UniformBuffer._TempBuffer[i * 4 + 2] = 0; + _UniformBuffer._TempBuffer[i * 4 + 3] = 0; + } + this.updateUniform(name69, _UniformBuffer._TempBuffer, 8); + } + _updateFloatForEffect(name69, x) { + this._currentEffect.setFloat(name69, x); + } + _updateFloatForUniform(name69, x) { + _UniformBuffer._TempBuffer[0] = x; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 1); + } + _updateFloat2ForEffect(name69, x, y, suffix = "") { + this._currentEffect.setFloat2(name69 + suffix, x, y); + } + _updateFloat2ForUniform(name69, x, y) { + _UniformBuffer._TempBuffer[0] = x; + _UniformBuffer._TempBuffer[1] = y; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 2); + } + _updateFloat3ForEffect(name69, x, y, z, suffix = "") { + this._currentEffect.setFloat3(name69 + suffix, x, y, z); + } + _updateFloat3ForUniform(name69, x, y, z) { + _UniformBuffer._TempBuffer[0] = x; + _UniformBuffer._TempBuffer[1] = y; + _UniformBuffer._TempBuffer[2] = z; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 3); + } + _updateFloat4ForEffect(name69, x, y, z, w, suffix = "") { + this._currentEffect.setFloat4(name69 + suffix, x, y, z, w); + } + _updateFloat4ForUniform(name69, x, y, z, w) { + _UniformBuffer._TempBuffer[0] = x; + _UniformBuffer._TempBuffer[1] = y; + _UniformBuffer._TempBuffer[2] = z; + _UniformBuffer._TempBuffer[3] = w; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 4); + } + _updateFloatArrayForEffect(name69, array) { + this._currentEffect.setFloatArray(name69, array); + } + _updateFloatArrayForUniform(name69, array) { + this.updateUniformArray(name69, array, array.length); + } + _updateArrayForEffect(name69, array) { + this._currentEffect.setArray(name69, array); + } + _updateArrayForUniform(name69, array) { + this.updateUniformArray(name69, array, array.length); + } + _updateIntArrayForEffect(name69, array) { + this._currentEffect.setIntArray(name69, array); + } + _updateIntArrayForUniform(name69, array) { + _UniformBuffer._TempBufferInt32View.set(array); + this.updateUniformArray(name69, _UniformBuffer._TempBuffer, array.length); + } + _updateUIntArrayForEffect(name69, array) { + this._currentEffect.setUIntArray(name69, array); + } + _updateUIntArrayForUniform(name69, array) { + _UniformBuffer._TempBufferUInt32View.set(array); + this.updateUniformArray(name69, _UniformBuffer._TempBuffer, array.length); + } + _updateMatrixForEffect(name69, mat) { + this._currentEffect.setMatrix(name69, mat); + } + _updateMatrixForUniform(name69, mat) { + if (this._cacheMatrix(name69, mat)) { + this.updateUniform(name69, mat.asArray(), 16); + } + } + _updateMatricesForEffect(name69, mat) { + this._currentEffect.setMatrices(name69, mat); + } + _updateMatricesForUniform(name69, mat) { + this.updateUniform(name69, mat, mat.length); + } + _updateVector3ForEffect(name69, vector) { + this._currentEffect.setVector3(name69, vector); + } + _updateVector3ForUniform(name69, vector) { + _UniformBuffer._TempBuffer[0] = vector.x; + _UniformBuffer._TempBuffer[1] = vector.y; + _UniformBuffer._TempBuffer[2] = vector.z; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 3); + } + _updateVector4ForEffect(name69, vector) { + this._currentEffect.setVector4(name69, vector); + } + _updateVector4ForUniform(name69, vector) { + _UniformBuffer._TempBuffer[0] = vector.x; + _UniformBuffer._TempBuffer[1] = vector.y; + _UniformBuffer._TempBuffer[2] = vector.z; + _UniformBuffer._TempBuffer[3] = vector.w; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 4); + } + _updateColor3ForEffect(name69, color, suffix = "") { + this._currentEffect.setColor3(name69 + suffix, color); + } + _updateColor3ForUniform(name69, color) { + _UniformBuffer._TempBuffer[0] = color.r; + _UniformBuffer._TempBuffer[1] = color.g; + _UniformBuffer._TempBuffer[2] = color.b; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 3); + } + _updateColor4ForEffect(name69, color, alpha, suffix = "") { + this._currentEffect.setColor4(name69 + suffix, color, alpha); + } + _updateDirectColor4ForEffect(name69, color, suffix = "") { + this._currentEffect.setDirectColor4(name69 + suffix, color); + } + _updateColor4ForUniform(name69, color, alpha) { + _UniformBuffer._TempBuffer[0] = color.r; + _UniformBuffer._TempBuffer[1] = color.g; + _UniformBuffer._TempBuffer[2] = color.b; + _UniformBuffer._TempBuffer[3] = alpha; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 4); + } + _updateDirectColor4ForUniform(name69, color) { + _UniformBuffer._TempBuffer[0] = color.r; + _UniformBuffer._TempBuffer[1] = color.g; + _UniformBuffer._TempBuffer[2] = color.b; + _UniformBuffer._TempBuffer[3] = color.a; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 4); + } + _updateIntForEffect(name69, x, suffix = "") { + this._currentEffect.setInt(name69 + suffix, x); + } + _updateIntForUniform(name69, x) { + _UniformBuffer._TempBufferInt32View[0] = x; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 1); + } + _updateInt2ForEffect(name69, x, y, suffix = "") { + this._currentEffect.setInt2(name69 + suffix, x, y); + } + _updateInt2ForUniform(name69, x, y) { + _UniformBuffer._TempBufferInt32View[0] = x; + _UniformBuffer._TempBufferInt32View[1] = y; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 2); + } + _updateInt3ForEffect(name69, x, y, z, suffix = "") { + this._currentEffect.setInt3(name69 + suffix, x, y, z); + } + _updateInt3ForUniform(name69, x, y, z) { + _UniformBuffer._TempBufferInt32View[0] = x; + _UniformBuffer._TempBufferInt32View[1] = y; + _UniformBuffer._TempBufferInt32View[2] = z; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 3); + } + _updateInt4ForEffect(name69, x, y, z, w, suffix = "") { + this._currentEffect.setInt4(name69 + suffix, x, y, z, w); + } + _updateInt4ForUniform(name69, x, y, z, w) { + _UniformBuffer._TempBufferInt32View[0] = x; + _UniformBuffer._TempBufferInt32View[1] = y; + _UniformBuffer._TempBufferInt32View[2] = z; + _UniformBuffer._TempBufferInt32View[3] = w; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 4); + } + _updateUIntForEffect(name69, x, suffix = "") { + this._currentEffect.setUInt(name69 + suffix, x); + } + _updateUIntForUniform(name69, x) { + _UniformBuffer._TempBufferUInt32View[0] = x; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 1); + } + _updateUInt2ForEffect(name69, x, y, suffix = "") { + this._currentEffect.setUInt2(name69 + suffix, x, y); + } + _updateUInt2ForUniform(name69, x, y) { + _UniformBuffer._TempBufferUInt32View[0] = x; + _UniformBuffer._TempBufferUInt32View[1] = y; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 2); + } + _updateUInt3ForEffect(name69, x, y, z, suffix = "") { + this._currentEffect.setUInt3(name69 + suffix, x, y, z); + } + _updateUInt3ForUniform(name69, x, y, z) { + _UniformBuffer._TempBufferUInt32View[0] = x; + _UniformBuffer._TempBufferUInt32View[1] = y; + _UniformBuffer._TempBufferUInt32View[2] = z; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 3); + } + _updateUInt4ForEffect(name69, x, y, z, w, suffix = "") { + this._currentEffect.setUInt4(name69 + suffix, x, y, z, w); + } + _updateUInt4ForUniform(name69, x, y, z, w) { + _UniformBuffer._TempBufferUInt32View[0] = x; + _UniformBuffer._TempBufferUInt32View[1] = y; + _UniformBuffer._TempBufferUInt32View[2] = z; + _UniformBuffer._TempBufferUInt32View[3] = w; + this.updateUniform(name69, _UniformBuffer._TempBuffer, 4); } /** - * Create Keyboard Event - * @param inputIndex Id of input to be checked - * @param currentState Current value for given input - * @param deviceInputSystem Reference to DeviceInputSystem - * @param elementToAttachTo HTMLElement to reference as target for inputs - * @returns IEvent object (Keyboard) + * Sets a sampler uniform on the effect. + * @param name Define the name of the sampler. + * @param texture Define the texture to set in the sampler */ - static _CreateKeyboardEvent(inputIndex, currentState, deviceInputSystem, elementToAttachTo) { - const evt = this._CreateEvent(elementToAttachTo); - this._CheckNonCharacterKeys(evt, deviceInputSystem); - evt.deviceType = DeviceType.Keyboard; - evt.deviceSlot = 0; - evt.inputIndex = inputIndex; - evt.type = currentState === 1 ? "keydown" : "keyup"; - evt.key = String.fromCharCode(inputIndex); - evt.keyCode = inputIndex; - return evt; + setTexture(name69, texture) { + this._currentEffect.setTexture(name69, texture); } /** - * Add parameters for non-character keys (Ctrl, Alt, Meta, Shift) - * @param evt Event object to add parameters to - * @param deviceInputSystem DeviceInputSystem to pull values from + * Sets a sampler uniform on the effect. + * @param name Define the name of the sampler. + * @param texture Define the (internal) texture to set in the sampler */ - static _CheckNonCharacterKeys(evt, deviceInputSystem) { - const isKeyboardActive = deviceInputSystem.isDeviceAvailable(DeviceType.Keyboard); - const altKey = isKeyboardActive && deviceInputSystem.pollInput(DeviceType.Keyboard, 0, 18) === 1; - const ctrlKey = isKeyboardActive && deviceInputSystem.pollInput(DeviceType.Keyboard, 0, 17) === 1; - const metaKey = isKeyboardActive && (deviceInputSystem.pollInput(DeviceType.Keyboard, 0, 91) === 1 || deviceInputSystem.pollInput(DeviceType.Keyboard, 0, 92) === 1 || deviceInputSystem.pollInput(DeviceType.Keyboard, 0, 93) === 1); - const shiftKey = isKeyboardActive && deviceInputSystem.pollInput(DeviceType.Keyboard, 0, 16) === 1; - evt.altKey = altKey; - evt.ctrlKey = ctrlKey; - evt.metaKey = metaKey; - evt.shiftKey = shiftKey; + bindTexture(name69, texture) { + this._currentEffect._bindTexture(name69, texture); } /** - * Create base event object - * @param elementToAttachTo Value to use as event target - * @returns + * Directly updates the value of the uniform in the cache AND on the GPU. + * @param uniformName Define the name of the uniform, as used in the uniform block in the shader. + * @param data Define the flattened data */ - static _CreateEvent(elementToAttachTo) { - const evt = {}; - evt.preventDefault = () => { - }; - evt.target = elementToAttachTo; - return evt; + updateUniformDirectly(uniformName, data) { + this.updateUniform(uniformName, data, data.length); + this.update(); } -}; - -// node_modules/@babylonjs/core/DeviceInput/nativeDeviceInputSystem.js -var NativeDeviceInputSystem = class { - constructor(onDeviceConnected, onDeviceDisconnected, onInputChanged) { - this._nativeInput = _native.DeviceInputSystem ? new _native.DeviceInputSystem(onDeviceConnected, onDeviceDisconnected, (deviceType, deviceSlot, inputIndex, currentState) => { - const evt = DeviceEventFactory.CreateDeviceEvent(deviceType, deviceSlot, inputIndex, currentState, this); - onInputChanged(deviceType, deviceSlot, evt); - }) : this._createDummyNativeInput(); + /** + * Associates an effect to this uniform buffer + * @param effect Define the effect to associate the buffer to + * @param name Name of the uniform block in the shader. + */ + bindToEffect(effect, name69) { + this._currentEffect = effect; + this._currentEffectName = name69; } - // Public functions /** - * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized. - * @param deviceType Enum specifying device type - * @param deviceSlot "Slot" or index that device is referenced in - * @param inputIndex Id of input to be checked - * @returns Current value of input + * Binds the current (GPU) buffer to the effect */ - pollInput(deviceType, deviceSlot, inputIndex) { - return this._nativeInput.pollInput(deviceType, deviceSlot, inputIndex); + bindUniformBuffer() { + if (!this._noUBO && this._buffer && this._currentEffect) { + this._currentEffect.bindUniformBuffer(this._buffer, this._currentEffectName); + } } /** - * Check for a specific device in the DeviceInputSystem - * @param deviceType Type of device to check for - * @returns bool with status of device's existence + * Dissociates the current effect from this uniform buffer */ - isDeviceAvailable(deviceType) { - return deviceType === DeviceType.Mouse || deviceType === DeviceType.Touch; + unbindEffect() { + this._currentEffect = void 0; + this._currentEffectName = void 0; } /** - * Dispose of all the observables + * Sets the current state of the class (_bufferIndex, _buffer) to point to the data buffer passed in parameter if this buffer is one of the buffers handled by the class (meaning if it can be found in the _buffers array) + * This method is meant to be able to update a buffer at any time: just call setDataBuffer to set the class in the right state, call some updateXXX methods and then call udpate() => that will update the GPU buffer on the graphic card + * @param dataBuffer buffer to look for + * @returns true if the buffer has been found and the class internal state points to it, else false */ - dispose() { - this._nativeInput.dispose(); + setDataBuffer(dataBuffer) { + if (!this._buffers) { + return this._buffer === dataBuffer; + } + for (let b = 0; b < this._buffers.length; ++b) { + const buffer = this._buffers[b]; + if (buffer[0] === dataBuffer) { + this._bufferIndex = b; + this._buffer = dataBuffer; + this._createBufferOnWrite = false; + this._currentEffect = void 0; + return true; + } + } + return false; } /** - * For versions of BabylonNative that don't have the NativeInput plugin initialized, create a dummy version - * @returns Object with dummy functions + * Disposes the uniform buffer. */ - _createDummyNativeInput() { - const nativeInput = { - pollInput: () => { - return 0; - }, - isDeviceAvailable: () => { - return false; - }, - dispose: () => { + dispose() { + if (this._noUBO) { + return; + } + const uniformBuffers = this._engine._uniformBuffers; + const index = uniformBuffers.indexOf(this); + if (index !== -1) { + uniformBuffers[index] = uniformBuffers[uniformBuffers.length - 1]; + uniformBuffers.pop(); + } + if (this._engine._features.trackUbosInFrame && this._buffers) { + for (let i = 0; i < this._buffers.length; ++i) { + const buffer = this._buffers[i][0]; + this._engine._releaseBuffer(buffer); } - }; - return nativeInput; + } else if (this._buffer && this._engine._releaseBuffer(this._buffer)) { + this._buffer = null; + } } }; +UniformBuffer._UpdatedUbosInFrame = {}; +UniformBuffer._MAX_UNIFORM_SIZE = 256; +UniformBuffer._TempBuffer = new Float32Array(UniformBuffer._MAX_UNIFORM_SIZE); +UniformBuffer._TempBufferInt32View = new Int32Array(UniformBuffer._TempBuffer.buffer); +UniformBuffer._TempBufferUInt32View = new Uint32Array(UniformBuffer._TempBuffer.buffer); -// node_modules/@babylonjs/core/DeviceInput/webDeviceInputSystem.js -var MAX_KEYCODES = 255; -var MAX_POINTER_INPUTS = Object.keys(PointerInput).length / 2; -var WebDeviceInputSystem = class { +// node_modules/@babylonjs/core/Buffers/buffer.js +var Buffer = class { /** - * Constructor for the WebDeviceInputSystem - * @param engine Engine to reference - * @param onDeviceConnected Callback to execute when device is connected - * @param onDeviceDisconnected Callback to execute when device is disconnected - * @param onInputChanged Callback to execute when input changes on device + * Gets a boolean indicating if the Buffer is disposed */ - constructor(engine, onDeviceConnected, onDeviceDisconnected, onInputChanged) { - this._inputs = []; - this._keyboardActive = false; - this._pointerActive = false; - this._usingSafari = Tools.IsSafari(); - this._usingMacOS = IsNavigatorAvailable() && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform); - this._keyboardDownEvent = (evt) => { - }; - this._keyboardUpEvent = (evt) => { - }; - this._keyboardBlurEvent = (evt) => { - }; - this._pointerMoveEvent = (evt) => { - }; - this._pointerDownEvent = (evt) => { - }; - this._pointerUpEvent = (evt) => { - }; - this._pointerCancelEvent = (evt) => { - }; - this._pointerWheelEvent = (evt) => { - }; - this._pointerBlurEvent = (evt) => { - }; - this._pointerMacOSChromeOutEvent = (evt) => { - }; - this._eventsAttached = false; - this._mouseId = -1; - this._isUsingFirefox = IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf("Firefox") !== -1; - this._isUsingChromium = IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf("Chrome") !== -1; - this._maxTouchPoints = 0; - this._pointerInputClearObserver = null; - this._gamepadConnectedEvent = (evt) => { - }; - this._gamepadDisconnectedEvent = (evt) => { - }; - this._eventPrefix = Tools.GetPointerPrefix(engine); - this._engine = engine; - this._onDeviceConnected = onDeviceConnected; - this._onDeviceDisconnected = onDeviceDisconnected; - this._onInputChanged = onInputChanged; - this._mouseId = this._isUsingFirefox ? 0 : 1; - this._enableEvents(); - if (this._usingMacOS) { - this._metaKeys = []; - } - if (!this._engine._onEngineViewChanged) { - this._engine._onEngineViewChanged = () => { - this._enableEvents(); - }; - } + get isDisposed() { + return this._isDisposed; } - // Public functions /** - * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized. - * @param deviceType Enum specifying device type - * @param deviceSlot "Slot" or index that device is referenced in - * @param inputIndex Id of input to be checked - * @returns Current value of input + * Constructor + * @param engine the engine + * @param data the data to use for this buffer + * @param updatable whether the data is updatable + * @param stride the stride (optional) + * @param postponeInternalCreation whether to postpone creating the internal WebGL buffer (optional) + * @param instanced whether the buffer is instanced (optional) + * @param useBytes set to true if the stride in in bytes (optional) + * @param divisor sets an optional divisor for instances (1 by default) + * @param label defines the label of the buffer (for debug purpose) */ - pollInput(deviceType, deviceSlot, inputIndex) { - const device = this._inputs[deviceType][deviceSlot]; - if (!device) { - throw `Unable to find device ${DeviceType[deviceType]}`; - } - if (deviceType >= DeviceType.DualShock && deviceType <= DeviceType.DualSense) { - this._updateDevice(deviceType, deviceSlot, inputIndex); + constructor(engine, data, updatable, stride = 0, postponeInternalCreation = false, instanced = false, useBytes = false, divisor, label) { + this._isAlreadyOwned = false; + this._isDisposed = false; + if (engine && engine.getScene) { + this._engine = engine.getScene().getEngine(); + } else { + this._engine = engine; } - const currentValue = device[inputIndex]; - if (currentValue === void 0) { - throw `Unable to find input ${inputIndex} for device ${DeviceType[deviceType]} in slot ${deviceSlot}`; + this._updatable = updatable; + this._instanced = instanced; + this._divisor = divisor || 1; + this._label = label; + if (data instanceof DataBuffer) { + this._data = null; + this._buffer = data; + } else { + this._data = data; + this._buffer = null; } - if (inputIndex === PointerInput.Move) { - Tools.Warn(`Unable to provide information for PointerInput.Move. Try using PointerInput.Horizontal or PointerInput.Vertical for move data.`); + this.byteStride = useBytes ? stride : stride * Float32Array.BYTES_PER_ELEMENT; + if (!postponeInternalCreation) { + this.create(); } - return currentValue; } /** - * Check for a specific device in the DeviceInputSystem - * @param deviceType Type of device to check for - * @returns bool with status of device's existence + * Create a new VertexBuffer based on the current buffer + * @param kind defines the vertex buffer kind (position, normal, etc.) + * @param offset defines offset in the buffer (0 by default) + * @param size defines the size in floats of attributes (position is 3 for instance) + * @param stride defines the stride size in floats in the buffer (the offset to apply to reach next value when data is interleaved) + * @param instanced defines if the vertex buffer contains indexed data + * @param useBytes defines if the offset and stride are in bytes * + * @param divisor sets an optional divisor for instances (1 by default) + * @returns the new vertex buffer */ - isDeviceAvailable(deviceType) { - return this._inputs[deviceType] !== void 0; + createVertexBuffer(kind, offset, size, stride, instanced, useBytes = false, divisor) { + const byteOffset = useBytes ? offset : offset * Float32Array.BYTES_PER_ELEMENT; + const byteStride = stride ? useBytes ? stride : stride * Float32Array.BYTES_PER_ELEMENT : this.byteStride; + return new VertexBuffer(this._engine, this, kind, this._updatable, true, byteStride, instanced === void 0 ? this._instanced : instanced, byteOffset, size, void 0, void 0, true, this._divisor || divisor); } + // Properties /** - * Dispose of all the eventlisteners + * Gets a boolean indicating if the Buffer is updatable? + * @returns true if the buffer is updatable */ - dispose() { - this._onDeviceConnected = () => { - }; - this._onDeviceDisconnected = () => { - }; - this._onInputChanged = () => { - }; - delete this._engine._onEngineViewChanged; - if (this._elementToAttachTo) { - this._disableEvents(); - } + isUpdatable() { + return this._updatable; } /** - * Enable listening for user input events + * Gets current buffer's data + * @returns a DataArray or null */ - _enableEvents() { - const inputElement = this == null ? void 0 : this._engine.getInputElement(); - if (inputElement && (!this._eventsAttached || this._elementToAttachTo !== inputElement)) { - this._disableEvents(); - if (this._inputs) { - for (const inputs of this._inputs) { - if (inputs) { - for (const deviceSlotKey in inputs) { - const deviceSlot = +deviceSlotKey; - const device = inputs[deviceSlot]; - if (device) { - for (let inputIndex = 0; inputIndex < device.length; inputIndex++) { - device[inputIndex] = 0; - } - } - } - } + getData() { + return this._data; + } + /** + * Gets underlying native buffer + * @returns underlying native buffer + */ + getBuffer() { + return this._buffer; + } + /** + * Gets the stride in float32 units (i.e. byte stride / 4). + * May not be an integer if the byte stride is not divisible by 4. + * @returns the stride in float32 units + * @deprecated Please use byteStride instead. + */ + getStrideSize() { + return this.byteStride / Float32Array.BYTES_PER_ELEMENT; + } + // Methods + /** + * Store data into the buffer. Creates the buffer if not used already. + * If the buffer was already used, it will be updated only if it is updatable, otherwise it will do nothing. + * @param data defines the data to store + */ + create(data = null) { + if (!data && this._buffer) { + return; + } + data = data || this._data; + if (!data) { + return; + } + if (!this._buffer) { + if (this._updatable) { + this._buffer = this._engine.createDynamicVertexBuffer(data, this._label); + this._data = data; + } else { + this._buffer = this._engine.createVertexBuffer(data, void 0, this._label); + } + } else if (this._updatable) { + this._engine.updateDynamicVertexBuffer(this._buffer, data); + this._data = data; + } + } + /** @internal */ + _rebuild() { + if (!this._data) { + if (!this._buffer) { + return; + } + if (this._buffer.capacity > 0) { + if (this._updatable) { + this._buffer = this._engine.createDynamicVertexBuffer(this._buffer.capacity, this._label); + } else { + this._buffer = this._engine.createVertexBuffer(this._buffer.capacity, void 0, this._label); } + return; } - this._elementToAttachTo = inputElement; - this._elementToAttachTo.tabIndex = this._elementToAttachTo.tabIndex !== -1 ? this._elementToAttachTo.tabIndex : this._engine.canvasTabIndex; - this._handleKeyActions(); - this._handlePointerActions(); - this._handleGamepadActions(); - this._eventsAttached = true; - this._checkForConnectedDevices(); + Logger.Warn(`Missing data for buffer "${this._label}" ${this._buffer ? "(uniqueId: " + this._buffer.uniqueId + ")" : ""}. Buffer reconstruction failed.`); + this._buffer = null; + } else { + this._buffer = null; + this.create(this._data); } } /** - * Disable listening for user input events + * Update current buffer data + * @param data defines the data to store */ - _disableEvents() { - if (this._elementToAttachTo) { - this._elementToAttachTo.removeEventListener("blur", this._keyboardBlurEvent); - this._elementToAttachTo.removeEventListener("blur", this._pointerBlurEvent); - this._elementToAttachTo.removeEventListener("keydown", this._keyboardDownEvent); - this._elementToAttachTo.removeEventListener("keyup", this._keyboardUpEvent); - this._elementToAttachTo.removeEventListener(this._eventPrefix + "move", this._pointerMoveEvent); - this._elementToAttachTo.removeEventListener(this._eventPrefix + "down", this._pointerDownEvent); - this._elementToAttachTo.removeEventListener(this._eventPrefix + "up", this._pointerUpEvent); - this._elementToAttachTo.removeEventListener(this._eventPrefix + "cancel", this._pointerCancelEvent); - this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent); - if (this._usingMacOS && this._isUsingChromium) { - this._elementToAttachTo.removeEventListener("lostpointercapture", this._pointerMacOSChromeOutEvent); + update(data) { + this.create(data); + } + /** + * Updates the data directly. + * @param data the new data + * @param offset the new offset + * @param vertexCount the vertex count (optional) + * @param useBytes set to true if the offset is in bytes + */ + updateDirectly(data, offset, vertexCount, useBytes = false) { + if (!this._buffer) { + return; + } + if (this._updatable) { + this._engine.updateDynamicVertexBuffer(this._buffer, data, useBytes ? offset : offset * Float32Array.BYTES_PER_ELEMENT, vertexCount ? vertexCount * this.byteStride : void 0); + if (offset === 0 && vertexCount === void 0) { + this._data = data; + } else { + this._data = null; } - window.removeEventListener("gamepadconnected", this._gamepadConnectedEvent); - window.removeEventListener("gamepaddisconnected", this._gamepadDisconnectedEvent); } - if (this._pointerInputClearObserver) { - this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver); + } + /** @internal */ + _increaseReferences() { + if (!this._buffer) { + return; } - this._eventsAttached = false; + if (!this._isAlreadyOwned) { + this._isAlreadyOwned = true; + return; + } + this._buffer.references++; } /** - * Checks for existing connections to devices and register them, if necessary - * Currently handles gamepads and mouse + * Release all resources */ - _checkForConnectedDevices() { - if (navigator.getGamepads) { - const gamepads = navigator.getGamepads(); - for (const gamepad of gamepads) { - if (gamepad) { - this._addGamePad(gamepad); - } - } + dispose() { + if (!this._buffer) { + return; } - if (typeof matchMedia === "function" && matchMedia("(pointer:fine)").matches) { - this._addPointerDevice(DeviceType.Mouse, 0, 0, 0); + if (this._engine._releaseBuffer(this._buffer)) { + this._isDisposed = true; + this._data = null; + this._buffer = null; } } - // Private functions +}; +var VertexBuffer = class _VertexBuffer { /** - * Add a gamepad to the DeviceInputSystem - * @param gamepad A single DOM Gamepad object + * Gets a boolean indicating if the Buffer is disposed */ - _addGamePad(gamepad) { - const deviceType = this._getGamepadDeviceType(gamepad.id); - const deviceSlot = gamepad.index; - this._gamepads = this._gamepads || new Array(gamepad.index + 1); - this._registerDevice(deviceType, deviceSlot, gamepad.buttons.length + gamepad.axes.length); - this._gamepads[deviceSlot] = deviceType; + get isDisposed() { + return this._isDisposed; } /** - * Add pointer device to DeviceInputSystem - * @param deviceType Type of Pointer to add - * @param deviceSlot Pointer ID (0 for mouse, pointerId for Touch) - * @param currentX Current X at point of adding - * @param currentY Current Y at point of adding + * Gets or sets the instance divisor when in instanced mode */ - _addPointerDevice(deviceType, deviceSlot, currentX, currentY) { - if (!this._pointerActive) { - this._pointerActive = true; + get instanceDivisor() { + return this._instanceDivisor; + } + set instanceDivisor(value) { + const isInstanced = value != 0; + this._instanceDivisor = value; + if (isInstanced !== this._instanced) { + this._instanced = isInstanced; + this._computeHashCode(); } - this._registerDevice(deviceType, deviceSlot, MAX_POINTER_INPUTS); - const pointer = this._inputs[deviceType][deviceSlot]; - pointer[0] = currentX; - pointer[1] = currentY; } /** - * Add device and inputs to device array - * @param deviceType Enum specifying device type - * @param deviceSlot "Slot" or index that device is referenced in - * @param numberOfInputs Number of input entries to create for given device + * Gets the max possible amount of vertices stored within the current vertex buffer. + * We do not have the end offset or count so this will be too big for concatenated vertex buffers. + * @internal */ - _registerDevice(deviceType, deviceSlot, numberOfInputs) { - if (deviceSlot === void 0) { - throw `Unable to register device ${DeviceType[deviceType]} to undefined slot.`; + get _maxVerticesCount() { + const data = this.getData(); + if (!data) { + return 0; } - if (!this._inputs[deviceType]) { - this._inputs[deviceType] = {}; + if (Array.isArray(data)) { + return data.length / (this.byteStride / 4) - this.byteOffset / 4; } - if (!this._inputs[deviceType][deviceSlot]) { - const device = new Array(numberOfInputs); - device.fill(0); - this._inputs[deviceType][deviceSlot] = device; - this._onDeviceConnected(deviceType, deviceSlot); + return (data.byteLength - this.byteOffset) / this.byteStride; + } + /** @internal */ + constructor(engine, data, kind, updatableOrOptions, postponeInternalCreation, stride, instanced, offset, size, type, normalized = false, useBytes = false, divisor = 1, takeBufferOwnership = false) { + this._isDisposed = false; + let updatable = false; + this.engine = engine; + if (typeof updatableOrOptions === "object" && updatableOrOptions !== null) { + updatable = updatableOrOptions.updatable ?? false; + postponeInternalCreation = updatableOrOptions.postponeInternalCreation; + stride = updatableOrOptions.stride; + instanced = updatableOrOptions.instanced; + offset = updatableOrOptions.offset; + size = updatableOrOptions.size; + type = updatableOrOptions.type; + normalized = updatableOrOptions.normalized ?? false; + useBytes = updatableOrOptions.useBytes ?? false; + divisor = updatableOrOptions.divisor ?? 1; + takeBufferOwnership = updatableOrOptions.takeBufferOwnership ?? false; + this._label = updatableOrOptions.label; + } else { + updatable = !!updatableOrOptions; + } + if (data instanceof Buffer) { + this._buffer = data; + this._ownsBuffer = takeBufferOwnership; + } else { + this._buffer = new Buffer(engine, data, updatable, stride, postponeInternalCreation, instanced, useBytes, divisor, this._label); + this._ownsBuffer = true; + } + this.uniqueId = _VertexBuffer._Counter++; + this._kind = kind; + if (type === void 0) { + const vertexData = this.getData(); + this.type = vertexData ? _VertexBuffer.GetDataType(vertexData) : _VertexBuffer.FLOAT; + } else { + this.type = type; + } + const typeByteLength = _VertexBuffer.GetTypeByteLength(this.type); + if (useBytes) { + this._size = size || (stride ? stride / typeByteLength : _VertexBuffer.DeduceStride(kind)); + this.byteStride = stride || this._buffer.byteStride || this._size * typeByteLength; + this.byteOffset = offset || 0; + } else { + this._size = size || stride || _VertexBuffer.DeduceStride(kind); + this.byteStride = stride ? stride * typeByteLength : this._buffer.byteStride || this._size * typeByteLength; + this.byteOffset = (offset || 0) * typeByteLength; } + this.normalized = normalized; + this._instanced = instanced !== void 0 ? instanced : false; + this._instanceDivisor = instanced ? divisor : 0; + this._alignBuffer(); + this._computeHashCode(); + } + _computeHashCode() { + this.hashCode = (this.type - 5120 << 0) + ((this.normalized ? 1 : 0) << 3) + (this._size << 4) + ((this._instanced ? 1 : 0) << 6) + /* keep 5 bits free */ + (this.byteStride << 12); + } + /** @internal */ + _rebuild() { + var _a; + (_a = this._buffer) == null ? void 0 : _a._rebuild(); } /** - * Given a specific device name, remove that device from the device map - * @param deviceType Enum specifying device type - * @param deviceSlot "Slot" or index that device is referenced in + * Returns the kind of the VertexBuffer (string) + * @returns a string */ - _unregisterDevice(deviceType, deviceSlot) { - if (this._inputs[deviceType][deviceSlot]) { - delete this._inputs[deviceType][deviceSlot]; - this._onDeviceDisconnected(deviceType, deviceSlot); - } + getKind() { + return this._kind; } + // Properties /** - * Handle all actions that come from keyboard interaction + * Gets a boolean indicating if the VertexBuffer is updatable? + * @returns true if the buffer is updatable */ - _handleKeyActions() { - this._keyboardDownEvent = (evt) => { - if (!this._keyboardActive) { - this._keyboardActive = true; - this._registerDevice(DeviceType.Keyboard, 0, MAX_KEYCODES); - } - const kbKey = this._inputs[DeviceType.Keyboard][0]; - if (kbKey) { - kbKey[evt.keyCode] = 1; - const deviceEvent = evt; - deviceEvent.inputIndex = evt.keyCode; - if (this._usingMacOS && evt.metaKey && evt.key !== "Meta") { - if (!this._metaKeys.includes(evt.keyCode)) { - this._metaKeys.push(evt.keyCode); - } - } - this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent); - } - }; - this._keyboardUpEvent = (evt) => { - if (!this._keyboardActive) { - this._keyboardActive = true; - this._registerDevice(DeviceType.Keyboard, 0, MAX_KEYCODES); - } - const kbKey = this._inputs[DeviceType.Keyboard][0]; - if (kbKey) { - kbKey[evt.keyCode] = 0; - const deviceEvent = evt; - deviceEvent.inputIndex = evt.keyCode; - if (this._usingMacOS && evt.key === "Meta" && this._metaKeys.length > 0) { - for (const keyCode of this._metaKeys) { - const deviceEvent2 = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, keyCode, 0, this, this._elementToAttachTo); - kbKey[keyCode] = 0; - this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent2); - } - this._metaKeys.splice(0, this._metaKeys.length); - } - this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent); - } - }; - this._keyboardBlurEvent = () => { - if (this._keyboardActive) { - const kbKey = this._inputs[DeviceType.Keyboard][0]; - for (let i = 0; i < kbKey.length; i++) { - if (kbKey[i] !== 0) { - kbKey[i] = 0; - const deviceEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, i, 0, this, this._elementToAttachTo); - this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent); - } - } - if (this._usingMacOS) { - this._metaKeys.splice(0, this._metaKeys.length); - } - } - }; - this._elementToAttachTo.addEventListener("keydown", this._keyboardDownEvent); - this._elementToAttachTo.addEventListener("keyup", this._keyboardUpEvent); - this._elementToAttachTo.addEventListener("blur", this._keyboardBlurEvent); + isUpdatable() { + return this._buffer.isUpdatable(); } /** - * Handle all actions that come from pointer interaction + * Gets current buffer's data + * @returns a DataArray or null */ - _handlePointerActions() { - this._maxTouchPoints = IsNavigatorAvailable() && navigator.maxTouchPoints || 2; - if (!this._activeTouchIds) { - this._activeTouchIds = new Array(this._maxTouchPoints); - } - for (let i = 0; i < this._maxTouchPoints; i++) { - this._activeTouchIds[i] = -1; + getData() { + return this._buffer.getData(); + } + /** + * Gets current buffer's data as a float array. Float data is constructed if the vertex buffer data cannot be returned directly. + * @param totalVertices number of vertices in the buffer to take into account + * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it + * @returns a float array containing vertex data + */ + getFloatData(totalVertices, forceCopy) { + const data = this.getData(); + if (!data) { + return null; } - this._pointerMoveEvent = (evt) => { - const deviceType = this._getPointerType(evt); - let deviceSlot = deviceType === DeviceType.Mouse ? 0 : this._activeTouchIds.indexOf(evt.pointerId); - if (deviceType === DeviceType.Touch && deviceSlot === -1) { - const idx = this._activeTouchIds.indexOf(-1); - if (idx >= 0) { - deviceSlot = idx; - this._activeTouchIds[idx] = evt.pointerId; - this._onDeviceConnected(deviceType, deviceSlot); - } else { - Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`); - return; - } - } - if (!this._inputs[deviceType]) { - this._inputs[deviceType] = {}; - } - if (!this._inputs[deviceType][deviceSlot]) { - this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY); - } - const pointer = this._inputs[deviceType][deviceSlot]; - if (pointer) { - const deviceEvent = evt; - deviceEvent.inputIndex = PointerInput.Move; - pointer[PointerInput.Horizontal] = evt.clientX; - pointer[PointerInput.Vertical] = evt.clientY; - if (deviceType === DeviceType.Touch && pointer[PointerInput.LeftClick] === 0) { - pointer[PointerInput.LeftClick] = 1; - } - if (evt.pointerId === void 0) { - evt.pointerId = this._mouseId; - } - this._onInputChanged(deviceType, deviceSlot, deviceEvent); - if (!this._usingSafari && evt.button !== -1) { - deviceEvent.inputIndex = evt.button + 2; - pointer[evt.button + 2] = pointer[evt.button + 2] ? 0 : 1; - this._onInputChanged(deviceType, deviceSlot, deviceEvent); - } - } - }; - this._pointerDownEvent = (evt) => { - const deviceType = this._getPointerType(evt); - let deviceSlot = deviceType === DeviceType.Mouse ? 0 : evt.pointerId; - if (deviceType === DeviceType.Touch) { - const idx = this._activeTouchIds.indexOf(-1); - if (idx >= 0) { - deviceSlot = idx; - this._activeTouchIds[idx] = evt.pointerId; - } else { - Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`); - return; - } - } - if (!this._inputs[deviceType]) { - this._inputs[deviceType] = {}; - } - if (!this._inputs[deviceType][deviceSlot]) { - this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY); - } else if (deviceType === DeviceType.Touch) { - this._onDeviceConnected(deviceType, deviceSlot); - } - const pointer = this._inputs[deviceType][deviceSlot]; - if (pointer) { - const previousHorizontal = pointer[PointerInput.Horizontal]; - const previousVertical = pointer[PointerInput.Vertical]; - if (deviceType === DeviceType.Mouse) { - if (evt.pointerId === void 0) { - evt.pointerId = this._mouseId; - } - if (!document.pointerLockElement) { - try { - this._elementToAttachTo.setPointerCapture(this._mouseId); - } catch (e) { - } - } - } else { - if (evt.pointerId && !document.pointerLockElement) { - try { - this._elementToAttachTo.setPointerCapture(evt.pointerId); - } catch (e) { - } - } - } - pointer[PointerInput.Horizontal] = evt.clientX; - pointer[PointerInput.Vertical] = evt.clientY; - pointer[evt.button + 2] = 1; - const deviceEvent = evt; - deviceEvent.inputIndex = evt.button + 2; - this._onInputChanged(deviceType, deviceSlot, deviceEvent); - if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) { - deviceEvent.inputIndex = PointerInput.Move; - this._onInputChanged(deviceType, deviceSlot, deviceEvent); - } - } - }; - this._pointerUpEvent = (evt) => { - var _a, _b, _c, _d, _e; - const deviceType = this._getPointerType(evt); - const deviceSlot = deviceType === DeviceType.Mouse ? 0 : this._activeTouchIds.indexOf(evt.pointerId); - if (deviceType === DeviceType.Touch) { - if (deviceSlot === -1) { - return; - } else { - this._activeTouchIds[deviceSlot] = -1; - } - } - const pointer = (_a = this._inputs[deviceType]) == null ? void 0 : _a[deviceSlot]; - if (pointer && pointer[evt.button + 2] !== 0) { - const previousHorizontal = pointer[PointerInput.Horizontal]; - const previousVertical = pointer[PointerInput.Vertical]; - pointer[PointerInput.Horizontal] = evt.clientX; - pointer[PointerInput.Vertical] = evt.clientY; - pointer[evt.button + 2] = 0; - const deviceEvent = evt; - if (evt.pointerId === void 0) { - evt.pointerId = this._mouseId; - } - if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) { - deviceEvent.inputIndex = PointerInput.Move; - this._onInputChanged(deviceType, deviceSlot, deviceEvent); - } - deviceEvent.inputIndex = evt.button + 2; - if (deviceType === DeviceType.Mouse && this._mouseId >= 0 && ((_c = (_b = this._elementToAttachTo).hasPointerCapture) == null ? void 0 : _c.call(_b, this._mouseId))) { - this._elementToAttachTo.releasePointerCapture(this._mouseId); - } else if (evt.pointerId && ((_e = (_d = this._elementToAttachTo).hasPointerCapture) == null ? void 0 : _e.call(_d, evt.pointerId))) { - this._elementToAttachTo.releasePointerCapture(evt.pointerId); - } - this._onInputChanged(deviceType, deviceSlot, deviceEvent); - if (deviceType === DeviceType.Touch) { - this._onDeviceDisconnected(deviceType, deviceSlot); - } - } - }; - this._pointerCancelEvent = (evt) => { - var _a, _b, _c, _d; - if (evt.pointerType === "mouse") { - const pointer = this._inputs[DeviceType.Mouse][0]; - if (this._mouseId >= 0 && ((_b = (_a = this._elementToAttachTo).hasPointerCapture) == null ? void 0 : _b.call(_a, this._mouseId))) { - this._elementToAttachTo.releasePointerCapture(this._mouseId); - } - for (let inputIndex = PointerInput.LeftClick; inputIndex <= PointerInput.BrowserForward; inputIndex++) { - if (pointer[inputIndex] === 1) { - pointer[inputIndex] = 0; - const deviceEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, inputIndex, 0, this, this._elementToAttachTo); - this._onInputChanged(DeviceType.Mouse, 0, deviceEvent); - } - } - } else { - const deviceSlot = this._activeTouchIds.indexOf(evt.pointerId); - if (deviceSlot === -1) { - return; - } - if ((_d = (_c = this._elementToAttachTo).hasPointerCapture) == null ? void 0 : _d.call(_c, evt.pointerId)) { - this._elementToAttachTo.releasePointerCapture(evt.pointerId); - } - this._inputs[DeviceType.Touch][deviceSlot][PointerInput.LeftClick] = 0; - const deviceEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Touch, deviceSlot, PointerInput.LeftClick, 0, this, this._elementToAttachTo, evt.pointerId); - this._onInputChanged(DeviceType.Touch, deviceSlot, deviceEvent); - this._activeTouchIds[deviceSlot] = -1; - this._onDeviceDisconnected(DeviceType.Touch, deviceSlot); - } - }; - this._wheelEventName = "onwheel" in document.createElement("div") ? "wheel" : document.onmousewheel !== void 0 ? "mousewheel" : "DOMMouseScroll"; - let passiveSupported = false; - const noop = function() { - }; - try { - const options = Object.defineProperty({}, "passive", { - get: function() { - passiveSupported = true; - } - }); - this._elementToAttachTo.addEventListener("test", noop, options); - this._elementToAttachTo.removeEventListener("test", noop, options); - } catch (e) { - } - this._pointerBlurEvent = () => { - var _a, _b, _c, _d, _e; - if (this.isDeviceAvailable(DeviceType.Mouse)) { - const pointer = this._inputs[DeviceType.Mouse][0]; - if (this._mouseId >= 0 && ((_b = (_a = this._elementToAttachTo).hasPointerCapture) == null ? void 0 : _b.call(_a, this._mouseId))) { - this._elementToAttachTo.releasePointerCapture(this._mouseId); - } - for (let inputIndex = PointerInput.LeftClick; inputIndex <= PointerInput.BrowserForward; inputIndex++) { - if (pointer[inputIndex] === 1) { - pointer[inputIndex] = 0; - const deviceEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, inputIndex, 0, this, this._elementToAttachTo); - this._onInputChanged(DeviceType.Mouse, 0, deviceEvent); - } - } - } - if (this.isDeviceAvailable(DeviceType.Touch)) { - const pointer = this._inputs[DeviceType.Touch]; - for (let deviceSlot = 0; deviceSlot < this._activeTouchIds.length; deviceSlot++) { - const pointerId = this._activeTouchIds[deviceSlot]; - if ((_d = (_c = this._elementToAttachTo).hasPointerCapture) == null ? void 0 : _d.call(_c, pointerId)) { - this._elementToAttachTo.releasePointerCapture(pointerId); - } - if (pointerId !== -1 && ((_e = pointer[deviceSlot]) == null ? void 0 : _e[PointerInput.LeftClick]) === 1) { - pointer[deviceSlot][PointerInput.LeftClick] = 0; - const deviceEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Touch, deviceSlot, PointerInput.LeftClick, 0, this, this._elementToAttachTo, pointerId); - this._onInputChanged(DeviceType.Touch, deviceSlot, deviceEvent); - this._activeTouchIds[deviceSlot] = -1; - this._onDeviceDisconnected(DeviceType.Touch, deviceSlot); - } - } - } - }; - this._pointerWheelEvent = (evt) => { - const deviceType = DeviceType.Mouse; - const deviceSlot = 0; - if (!this._inputs[deviceType]) { - this._inputs[deviceType] = []; - } - if (!this._inputs[deviceType][deviceSlot]) { - this._pointerActive = true; - this._registerDevice(deviceType, deviceSlot, MAX_POINTER_INPUTS); - } - const pointer = this._inputs[deviceType][deviceSlot]; - if (pointer) { - pointer[PointerInput.MouseWheelX] = evt.deltaX || 0; - pointer[PointerInput.MouseWheelY] = evt.deltaY || evt.wheelDelta || 0; - pointer[PointerInput.MouseWheelZ] = evt.deltaZ || 0; - const deviceEvent = evt; - if (evt.pointerId === void 0) { - evt.pointerId = this._mouseId; - } - if (pointer[PointerInput.MouseWheelX] !== 0) { - deviceEvent.inputIndex = PointerInput.MouseWheelX; - this._onInputChanged(deviceType, deviceSlot, deviceEvent); - } - if (pointer[PointerInput.MouseWheelY] !== 0) { - deviceEvent.inputIndex = PointerInput.MouseWheelY; - this._onInputChanged(deviceType, deviceSlot, deviceEvent); - } - if (pointer[PointerInput.MouseWheelZ] !== 0) { - deviceEvent.inputIndex = PointerInput.MouseWheelZ; - this._onInputChanged(deviceType, deviceSlot, deviceEvent); - } - } - }; - if (this._usingMacOS && this._isUsingChromium) { - this._pointerMacOSChromeOutEvent = (evt) => { - if (evt.buttons > 1) { - this._pointerCancelEvent(evt); - } - }; - this._elementToAttachTo.addEventListener("lostpointercapture", this._pointerMacOSChromeOutEvent); - } - this._elementToAttachTo.addEventListener(this._eventPrefix + "move", this._pointerMoveEvent); - this._elementToAttachTo.addEventListener(this._eventPrefix + "down", this._pointerDownEvent); - this._elementToAttachTo.addEventListener(this._eventPrefix + "up", this._pointerUpEvent); - this._elementToAttachTo.addEventListener(this._eventPrefix + "cancel", this._pointerCancelEvent); - this._elementToAttachTo.addEventListener("blur", this._pointerBlurEvent); - this._elementToAttachTo.addEventListener(this._wheelEventName, this._pointerWheelEvent, passiveSupported ? { passive: false } : false); - this._pointerInputClearObserver = this._engine.onEndFrameObservable.add(() => { - if (this.isDeviceAvailable(DeviceType.Mouse)) { - const pointer = this._inputs[DeviceType.Mouse][0]; - pointer[PointerInput.MouseWheelX] = 0; - pointer[PointerInput.MouseWheelY] = 0; - pointer[PointerInput.MouseWheelZ] = 0; - } - }); + return _VertexBuffer.GetFloatData(data, this._size, this.type, this.byteOffset, this.byteStride, this.normalized, totalVertices, forceCopy); } /** - * Handle all actions that come from gamepad interaction + * Gets underlying native buffer + * @returns underlying native buffer */ - _handleGamepadActions() { - this._gamepadConnectedEvent = (evt) => { - this._addGamePad(evt.gamepad); - }; - this._gamepadDisconnectedEvent = (evt) => { - if (this._gamepads) { - const deviceType = this._getGamepadDeviceType(evt.gamepad.id); - const deviceSlot = evt.gamepad.index; - this._unregisterDevice(deviceType, deviceSlot); - delete this._gamepads[deviceSlot]; - } - }; - window.addEventListener("gamepadconnected", this._gamepadConnectedEvent); - window.addEventListener("gamepaddisconnected", this._gamepadDisconnectedEvent); + getBuffer() { + return this._buffer.getBuffer(); } /** - * Update all non-event based devices with each frame - * @param deviceType Enum specifying device type - * @param deviceSlot "Slot" or index that device is referenced in - * @param inputIndex Id of input to be checked + * Gets the Buffer instance that wraps the native GPU buffer + * @returns the wrapper buffer */ - _updateDevice(deviceType, deviceSlot, inputIndex) { - const gp = navigator.getGamepads()[deviceSlot]; - if (gp && deviceType === this._gamepads[deviceSlot]) { - const device = this._inputs[deviceType][deviceSlot]; - if (inputIndex >= gp.buttons.length) { - device[inputIndex] = gp.axes[inputIndex - gp.buttons.length].valueOf(); - } else { - device[inputIndex] = gp.buttons[inputIndex].value; - } - } + getWrapperBuffer() { + return this._buffer; } /** - * Gets DeviceType from the device name - * @param deviceName Name of Device from DeviceInputSystem - * @returns DeviceType enum value + * Gets the stride in float32 units (i.e. byte stride / 4). + * May not be an integer if the byte stride is not divisible by 4. + * @returns the stride in float32 units + * @deprecated Please use byteStride instead. */ - _getGamepadDeviceType(deviceName) { - if (deviceName.indexOf("054c") !== -1) { - return deviceName.indexOf("0ce6") !== -1 ? DeviceType.DualSense : DeviceType.DualShock; - } else if (deviceName.indexOf("Xbox One") !== -1 || deviceName.search("Xbox 360") !== -1 || deviceName.search("xinput") !== -1) { - return DeviceType.Xbox; - } else if (deviceName.indexOf("057e") !== -1) { - return DeviceType.Switch; - } - return DeviceType.Generic; + getStrideSize() { + return this.byteStride / _VertexBuffer.GetTypeByteLength(this.type); } /** - * Get DeviceType from a given pointer/mouse/touch event. - * @param evt PointerEvent to evaluate - * @returns DeviceType interpreted from event + * Returns the offset as a multiple of the type byte length. + * @returns the offset in bytes + * @deprecated Please use byteOffset instead. */ - _getPointerType(evt) { - let deviceType = DeviceType.Mouse; - if (evt.pointerType === "touch" || evt.pointerType === "pen" || evt.touches) { - deviceType = DeviceType.Touch; - } - return deviceType; - } -}; - -// node_modules/@babylonjs/core/DeviceInput/internalDeviceSourceManager.js -var InternalDeviceSourceManager = class { - constructor(engine) { - this._registeredManagers = new Array(); - this._refCount = 0; - this.registerManager = (manager) => { - for (let deviceType = 0; deviceType < this._devices.length; deviceType++) { - const device = this._devices[deviceType]; - for (const deviceSlotKey in device) { - const deviceSlot = +deviceSlotKey; - manager._addDevice(new DeviceSource(this._deviceInputSystem, deviceType, deviceSlot)); - } - } - this._registeredManagers.push(manager); - }; - this.unregisterManager = (manager) => { - const idx = this._registeredManagers.indexOf(manager); - if (idx > -1) { - this._registeredManagers.splice(idx, 1); - } - }; - const numberOfDeviceTypes = Object.keys(DeviceType).length / 2; - this._devices = new Array(numberOfDeviceTypes); - const onDeviceConnected = (deviceType, deviceSlot) => { - if (!this._devices[deviceType]) { - this._devices[deviceType] = new Array(); - } - if (!this._devices[deviceType][deviceSlot]) { - this._devices[deviceType][deviceSlot] = deviceSlot; - } - for (const manager of this._registeredManagers) { - const deviceSource = new DeviceSource(this._deviceInputSystem, deviceType, deviceSlot); - manager._addDevice(deviceSource); - } - }; - const onDeviceDisconnected = (deviceType, deviceSlot) => { - var _a; - if ((_a = this._devices[deviceType]) == null ? void 0 : _a[deviceSlot]) { - delete this._devices[deviceType][deviceSlot]; - } - for (const manager of this._registeredManagers) { - manager._removeDevice(deviceType, deviceSlot); - } - }; - const onInputChanged = (deviceType, deviceSlot, eventData) => { - if (eventData) { - for (const manager of this._registeredManagers) { - manager._onInputChanged(deviceType, deviceSlot, eventData); - } - } - }; - if (typeof _native !== "undefined") { - this._deviceInputSystem = new NativeDeviceInputSystem(onDeviceConnected, onDeviceDisconnected, onInputChanged); - } else { - this._deviceInputSystem = new WebDeviceInputSystem(engine, onDeviceConnected, onDeviceDisconnected, onInputChanged); - } + getOffset() { + return this.byteOffset / _VertexBuffer.GetTypeByteLength(this.type); } - dispose() { - this._deviceInputSystem.dispose(); + /** + * Returns the number of components or the byte size per vertex attribute + * @param sizeInBytes If true, returns the size in bytes or else the size in number of components of the vertex attribute (default: false) + * @returns the number of components + */ + getSize(sizeInBytes = false) { + return sizeInBytes ? this._size * _VertexBuffer.GetTypeByteLength(this.type) : this._size; } -}; - -// node_modules/@babylonjs/core/DeviceInput/InputDevices/deviceSourceManager.js -var DeviceSourceManager = class { - // Public Functions /** - * Gets a DeviceSource, given a type and slot - * @param deviceType - Type of Device - * @param deviceSlot - Slot or ID of device - * @returns DeviceSource + * Gets a boolean indicating is the internal buffer of the VertexBuffer is instanced + * @returns true if this buffer is instanced */ - getDeviceSource(deviceType, deviceSlot) { - if (deviceSlot === void 0) { - if (this._firstDevice[deviceType] === void 0) { - return null; - } - deviceSlot = this._firstDevice[deviceType]; - } - if (!this._devices[deviceType] || this._devices[deviceType][deviceSlot] === void 0) { - return null; - } - return this._devices[deviceType][deviceSlot]; + getIsInstanced() { + return this._instanced; } /** - * Gets an array of DeviceSource objects for a given device type - * @param deviceType - Type of Device - * @returns All available DeviceSources of a given type + * Returns the instancing divisor, zero for non-instanced (integer). + * @returns a number */ - getDeviceSources(deviceType) { - if (!this._devices[deviceType]) { - return []; - } - return this._devices[deviceType].filter((source) => { - return !!source; - }); + getInstanceDivisor() { + return this._instanceDivisor; } + // Methods /** - * Default constructor - * @param engine - Used to get canvas (if applicable) + * Store data into the buffer. If the buffer was already used it will be either recreated or updated depending on isUpdatable property + * @param data defines the data to store */ - constructor(engine) { - const numberOfDeviceTypes = Object.keys(DeviceType).length / 2; - this._devices = new Array(numberOfDeviceTypes); - this._firstDevice = new Array(numberOfDeviceTypes); - this._engine = engine; - if (!this._engine._deviceSourceManager) { - this._engine._deviceSourceManager = new InternalDeviceSourceManager(engine); - } - this._engine._deviceSourceManager._refCount++; - this.onDeviceConnectedObservable = new Observable((observer2) => { - for (const devices of this._devices) { - if (devices) { - for (const device of devices) { - if (device) { - this.onDeviceConnectedObservable.notifyObserver(observer2, device); - } - } - } - } - }); - this.onDeviceDisconnectedObservable = new Observable(); - this._engine._deviceSourceManager.registerManager(this); - this._onDisposeObserver = engine.onDisposeObservable.add(() => { - this.dispose(); - }); + create(data) { + this._buffer.create(data); + this._alignBuffer(); } /** - * Dispose of DeviceSourceManager + * Updates the underlying buffer according to the passed numeric array or Float32Array. + * This function will create a new buffer if the current one is not updatable + * @param data defines the data to store */ - dispose() { - this.onDeviceConnectedObservable.clear(); - this.onDeviceDisconnectedObservable.clear(); - if (this._engine._deviceSourceManager) { - this._engine._deviceSourceManager.unregisterManager(this); - if (--this._engine._deviceSourceManager._refCount < 1) { - this._engine._deviceSourceManager.dispose(); - delete this._engine._deviceSourceManager; - } - } - this._engine.onDisposeObservable.remove(this._onDisposeObserver); + update(data) { + this._buffer.update(data); + this._alignBuffer(); } - // Hidden Functions /** - * @param deviceSource - Source to add - * @internal + * Updates directly the underlying WebGLBuffer according to the passed numeric array or Float32Array. + * Returns the directly updated WebGLBuffer. + * @param data the new data + * @param offset the new offset + * @param useBytes set to true if the offset is in bytes */ - _addDevice(deviceSource) { - if (!this._devices[deviceSource.deviceType]) { - this._devices[deviceSource.deviceType] = new Array(); - } - if (!this._devices[deviceSource.deviceType][deviceSource.deviceSlot]) { - this._devices[deviceSource.deviceType][deviceSource.deviceSlot] = deviceSource; - this._updateFirstDevices(deviceSource.deviceType); - } - this.onDeviceConnectedObservable.notifyObservers(deviceSource); + updateDirectly(data, offset, useBytes = false) { + this._buffer.updateDirectly(data, offset, void 0, useBytes); + this._alignBuffer(); } /** - * @param deviceType - DeviceType - * @param deviceSlot - DeviceSlot - * @internal + * Disposes the VertexBuffer and the underlying WebGLBuffer. */ - _removeDevice(deviceType, deviceSlot) { - var _a, _b; - const deviceSource = (_a = this._devices[deviceType]) == null ? void 0 : _a[deviceSlot]; - this.onDeviceDisconnectedObservable.notifyObservers(deviceSource); - if ((_b = this._devices[deviceType]) == null ? void 0 : _b[deviceSlot]) { - delete this._devices[deviceType][deviceSlot]; + dispose() { + if (this._ownsBuffer) { + this._buffer.dispose(); } - this._updateFirstDevices(deviceType); + this._isDisposed = true; } /** - * @param deviceType - DeviceType - * @param deviceSlot - DeviceSlot - * @param eventData - Event - * @internal + * Enumerates each value of this vertex buffer as numbers. + * @param count the number of values to enumerate + * @param callback the callback function called for each value */ - _onInputChanged(deviceType, deviceSlot, eventData) { - var _a, _b; - (_b = (_a = this._devices[deviceType]) == null ? void 0 : _a[deviceSlot]) == null ? void 0 : _b.onInputChangedObservable.notifyObservers(eventData); - } - // Private Functions - _updateFirstDevices(type) { - switch (type) { - case DeviceType.Keyboard: - case DeviceType.Mouse: - this._firstDevice[type] = 0; - break; - case DeviceType.Touch: - case DeviceType.DualSense: - case DeviceType.DualShock: - case DeviceType.Xbox: - case DeviceType.Switch: - case DeviceType.Generic: { - delete this._firstDevice[type]; - const devices = this._devices[type]; - if (devices) { - for (let i = 0; i < devices.length; i++) { - if (devices[i]) { - this._firstDevice[type] = i; - break; - } - } - } - break; - } - } + forEach(count, callback) { + _VertexBuffer.ForEach(this._buffer.getData(), this.byteOffset, this.byteStride, this._size, this.type, count, this.normalized, callback); } -}; - -// node_modules/@babylonjs/core/Misc/perfCounter.js -var PerfCounter = class _PerfCounter { - /** - * Returns the smallest value ever - */ - get min() { - return this._min; + /** @internal */ + _alignBuffer() { } /** - * Returns the biggest value ever + * Deduces the stride given a kind. + * @param kind The kind string to deduce + * @returns The deduced stride */ - get max() { - return this._max; + static DeduceStride(kind) { + switch (kind) { + case _VertexBuffer.UVKind: + case _VertexBuffer.UV2Kind: + case _VertexBuffer.UV3Kind: + case _VertexBuffer.UV4Kind: + case _VertexBuffer.UV5Kind: + case _VertexBuffer.UV6Kind: + return 2; + case _VertexBuffer.NormalKind: + case _VertexBuffer.PositionKind: + return 3; + case _VertexBuffer.ColorKind: + case _VertexBuffer.ColorInstanceKind: + case _VertexBuffer.MatricesIndicesKind: + case _VertexBuffer.MatricesIndicesExtraKind: + case _VertexBuffer.MatricesWeightsKind: + case _VertexBuffer.MatricesWeightsExtraKind: + case _VertexBuffer.TangentKind: + return 4; + default: + throw new Error("Invalid kind '" + kind + "'"); + } } /** - * Returns the average value since the performance counter is running + * Gets the vertex buffer type of the given data array. + * @param data the data array + * @returns the vertex buffer type */ - get average() { - return this._average; + static GetDataType(data) { + if (data instanceof Int8Array) { + return _VertexBuffer.BYTE; + } else if (data instanceof Uint8Array) { + return _VertexBuffer.UNSIGNED_BYTE; + } else if (data instanceof Int16Array) { + return _VertexBuffer.SHORT; + } else if (data instanceof Uint16Array) { + return _VertexBuffer.UNSIGNED_SHORT; + } else if (data instanceof Int32Array) { + return _VertexBuffer.INT; + } else if (data instanceof Uint32Array) { + return _VertexBuffer.UNSIGNED_INT; + } else { + return _VertexBuffer.FLOAT; + } } /** - * Returns the average value of the last second the counter was monitored + * Gets the byte length of the given type. + * @param type the type + * @returns the number of bytes */ - get lastSecAverage() { - return this._lastSecAverage; + static GetTypeByteLength(type) { + switch (type) { + case _VertexBuffer.BYTE: + case _VertexBuffer.UNSIGNED_BYTE: + return 1; + case _VertexBuffer.SHORT: + case _VertexBuffer.UNSIGNED_SHORT: + return 2; + case _VertexBuffer.INT: + case _VertexBuffer.UNSIGNED_INT: + case _VertexBuffer.FLOAT: + return 4; + default: + throw new Error(`Invalid type '${type}'`); + } } /** - * Returns the current value + * Enumerates each value of the given parameters as numbers. + * @param data the data to enumerate + * @param byteOffset the byte offset of the data + * @param byteStride the byte stride of the data + * @param componentCount the number of components per element + * @param componentType the type of the component + * @param count the number of values to enumerate + * @param normalized whether the data is normalized + * @param callback the callback function called for each value */ - get current() { - return this._current; + static ForEach(data, byteOffset, byteStride, componentCount, componentType, count, normalized, callback) { + if (data instanceof Array) { + let offset = byteOffset / 4; + const stride = byteStride / 4; + for (let index = 0; index < count; index += componentCount) { + for (let componentIndex = 0; componentIndex < componentCount; componentIndex++) { + callback(data[offset + componentIndex], index + componentIndex); + } + offset += stride; + } + } else { + const dataView = data instanceof ArrayBuffer ? new DataView(data) : new DataView(data.buffer, data.byteOffset, data.byteLength); + const componentByteLength = _VertexBuffer.GetTypeByteLength(componentType); + for (let index = 0; index < count; index += componentCount) { + let componentByteOffset = byteOffset; + for (let componentIndex = 0; componentIndex < componentCount; componentIndex++) { + const value = _VertexBuffer._GetFloatValue(dataView, componentType, componentByteOffset, normalized); + callback(value, index + componentIndex); + componentByteOffset += componentByteLength; + } + byteOffset += byteStride; + } + } } - /** - * Gets the accumulated total - */ - get total() { - return this._totalAccumulated; + static _GetFloatValue(dataView, type, byteOffset, normalized) { + switch (type) { + case _VertexBuffer.BYTE: { + let value = dataView.getInt8(byteOffset); + if (normalized) { + value = Math.max(value / 127, -1); + } + return value; + } + case _VertexBuffer.UNSIGNED_BYTE: { + let value = dataView.getUint8(byteOffset); + if (normalized) { + value = value / 255; + } + return value; + } + case _VertexBuffer.SHORT: { + let value = dataView.getInt16(byteOffset, true); + if (normalized) { + value = Math.max(value / 32767, -1); + } + return value; + } + case _VertexBuffer.UNSIGNED_SHORT: { + let value = dataView.getUint16(byteOffset, true); + if (normalized) { + value = value / 65535; + } + return value; + } + case _VertexBuffer.INT: { + return dataView.getInt32(byteOffset, true); + } + case _VertexBuffer.UNSIGNED_INT: { + return dataView.getUint32(byteOffset, true); + } + case _VertexBuffer.FLOAT: { + return dataView.getFloat32(byteOffset, true); + } + default: { + throw new Error(`Invalid component type ${type}`); + } + } } /** - * Gets the total value count + * Gets the given data array as a float array. Float data is constructed if the data array cannot be returned directly. + * @param data the input data array + * @param size the number of components + * @param type the component type + * @param byteOffset the byte offset of the data + * @param byteStride the byte stride of the data + * @param normalized whether the data is normalized + * @param totalVertices number of vertices in the buffer to take into account + * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it + * @returns a float array containing vertex data */ - get count() { - return this._totalValueCount; + static GetFloatData(data, size, type, byteOffset, byteStride, normalized, totalVertices, forceCopy) { + const tightlyPackedByteStride = size * _VertexBuffer.GetTypeByteLength(type); + const count = totalVertices * size; + if (type !== _VertexBuffer.FLOAT || byteStride !== tightlyPackedByteStride) { + const copy = new Float32Array(count); + _VertexBuffer.ForEach(data, byteOffset, byteStride, size, type, count, normalized, (value, index) => copy[index] = value); + return copy; + } + if (!(data instanceof Array || data instanceof Float32Array) || byteOffset !== 0 || data.length !== count) { + if (data instanceof Array) { + const offset = byteOffset / 4; + return data.slice(offset, offset + count); + } else if (data instanceof ArrayBuffer) { + return new Float32Array(data, byteOffset, count); + } else { + let offset = data.byteOffset + byteOffset; + if (forceCopy) { + const result = new Float32Array(count); + const source = new Float32Array(data.buffer, offset, count); + result.set(source); + return result; + } + const remainder = offset % 4; + if (remainder) { + offset = Math.max(0, offset - remainder); + } + return new Float32Array(data.buffer, offset, count); + } + } + if (forceCopy) { + return data.slice(); + } + return data; } - /** - * Creates a new counter - */ +}; +VertexBuffer._Counter = 0; +VertexBuffer.BYTE = 5120; +VertexBuffer.UNSIGNED_BYTE = 5121; +VertexBuffer.SHORT = 5122; +VertexBuffer.UNSIGNED_SHORT = 5123; +VertexBuffer.INT = 5124; +VertexBuffer.UNSIGNED_INT = 5125; +VertexBuffer.FLOAT = 5126; +VertexBuffer.PositionKind = `position`; +VertexBuffer.NormalKind = `normal`; +VertexBuffer.TangentKind = `tangent`; +VertexBuffer.UVKind = `uv`; +VertexBuffer.UV2Kind = `uv2`; +VertexBuffer.UV3Kind = `uv3`; +VertexBuffer.UV4Kind = `uv4`; +VertexBuffer.UV5Kind = `uv5`; +VertexBuffer.UV6Kind = `uv6`; +VertexBuffer.ColorKind = `color`; +VertexBuffer.ColorInstanceKind = `instanceColor`; +VertexBuffer.MatricesIndicesKind = `matricesIndices`; +VertexBuffer.MatricesWeightsKind = `matricesWeights`; +VertexBuffer.MatricesIndicesExtraKind = `matricesIndicesExtra`; +VertexBuffer.MatricesWeightsExtraKind = `matricesWeightsExtra`; + +// node_modules/@babylonjs/core/Collisions/pickingInfo.js +var PickingInfo = class { constructor() { - this._startMonitoringTime = 0; - this._min = 0; - this._max = 0; - this._average = 0; - this._lastSecAverage = 0; - this._current = 0; - this._totalValueCount = 0; - this._totalAccumulated = 0; - this._lastSecAccumulated = 0; - this._lastSecTime = 0; - this._lastSecValueCount = 0; - } - /** - * Call this method to start monitoring a new frame. - * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the start of the frame, then beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count. - */ - fetchNewFrame() { - this._totalValueCount++; - this._current = 0; - this._lastSecValueCount++; + this.hit = false; + this.distance = 0; + this.pickedPoint = null; + this.pickedMesh = null; + this.bu = 0; + this.bv = 0; + this.faceId = -1; + this.subMeshFaceId = -1; + this.subMeshId = 0; + this.pickedSprite = null; + this.thinInstanceIndex = -1; + this.ray = null; + this.originMesh = null; + this.aimTransform = null; + this.gripTransform = null; } /** - * Call this method to monitor a count of something (e.g. mesh drawn in viewport count) - * @param newCount the count value to add to the monitored count - * @param fetchResult true when it's the last time in the frame you add to the counter and you wish to update the statistics properties (min/max/average), false if you only want to update statistics. + * Gets the normal corresponding to the face the pick collided with + * @param useWorldCoordinates If the resulting normal should be relative to the world (default: false) + * @param useVerticesNormals If the vertices normals should be used to calculate the normal instead of the normal map (default: true) + * @returns The normal corresponding to the face the pick collided with + * @remarks Note that the returned normal will always point towards the picking ray. */ - addCount(newCount, fetchResult) { - if (!_PerfCounter.Enabled) { - return; - } - this._current += newCount; - if (fetchResult) { - this._fetchResult(); + getNormal(useWorldCoordinates = false, useVerticesNormals = true) { + if (!this.pickedMesh || useVerticesNormals && !this.pickedMesh.isVerticesDataPresent(VertexBuffer.NormalKind)) { + return null; } - } - /** - * Start monitoring this performance counter - */ - beginMonitoring() { - if (!_PerfCounter.Enabled) { - return; + let indices = this.pickedMesh.getIndices(); + if ((indices == null ? void 0 : indices.length) === 0) { + indices = null; } - this._startMonitoringTime = PrecisionDate.Now; - } - /** - * Compute the time lapsed since the previous beginMonitoring() call. - * @param newFrame true by default to fetch the result and monitor a new frame, if false the time monitored will be added to the current frame counter - */ - endMonitoring(newFrame = true) { - if (!_PerfCounter.Enabled) { - return; + let result; + const tmp0 = TmpVectors.Vector3[0]; + const tmp1 = TmpVectors.Vector3[1]; + const tmp2 = TmpVectors.Vector3[2]; + if (useVerticesNormals) { + const normals = this.pickedMesh.getVerticesData(VertexBuffer.NormalKind); + let normal0 = indices ? Vector3.FromArrayToRef(normals, indices[this.faceId * 3] * 3, tmp0) : tmp0.copyFromFloats(normals[this.faceId * 3 * 3], normals[this.faceId * 3 * 3 + 1], normals[this.faceId * 3 * 3 + 2]); + let normal1 = indices ? Vector3.FromArrayToRef(normals, indices[this.faceId * 3 + 1] * 3, tmp1) : tmp1.copyFromFloats(normals[(this.faceId * 3 + 1) * 3], normals[(this.faceId * 3 + 1) * 3 + 1], normals[(this.faceId * 3 + 1) * 3 + 2]); + let normal2 = indices ? Vector3.FromArrayToRef(normals, indices[this.faceId * 3 + 2] * 3, tmp2) : tmp2.copyFromFloats(normals[(this.faceId * 3 + 2) * 3], normals[(this.faceId * 3 + 2) * 3 + 1], normals[(this.faceId * 3 + 2) * 3 + 2]); + normal0 = normal0.scale(this.bu); + normal1 = normal1.scale(this.bv); + normal2 = normal2.scale(1 - this.bu - this.bv); + result = new Vector3(normal0.x + normal1.x + normal2.x, normal0.y + normal1.y + normal2.y, normal0.z + normal1.z + normal2.z); + } else { + const positions = this.pickedMesh.getVerticesData(VertexBuffer.PositionKind); + const vertex1 = indices ? Vector3.FromArrayToRef(positions, indices[this.faceId * 3] * 3, tmp0) : tmp0.copyFromFloats(positions[this.faceId * 3 * 3], positions[this.faceId * 3 * 3 + 1], positions[this.faceId * 3 * 3 + 2]); + const vertex2 = indices ? Vector3.FromArrayToRef(positions, indices[this.faceId * 3 + 1] * 3, tmp1) : tmp1.copyFromFloats(positions[(this.faceId * 3 + 1) * 3], positions[(this.faceId * 3 + 1) * 3 + 1], positions[(this.faceId * 3 + 1) * 3 + 2]); + const vertex3 = indices ? Vector3.FromArrayToRef(positions, indices[this.faceId * 3 + 2] * 3, tmp2) : tmp2.copyFromFloats(positions[(this.faceId * 3 + 2) * 3], positions[(this.faceId * 3 + 2) * 3 + 1], positions[(this.faceId * 3 + 2) * 3 + 2]); + const p1p2 = vertex1.subtract(vertex2); + const p3p2 = vertex3.subtract(vertex2); + result = Vector3.Cross(p1p2, p3p2); } - if (newFrame) { - this.fetchNewFrame(); + const transformNormalToWorld = (pickedMesh, n) => { + let wm = pickedMesh.getWorldMatrix(); + if (pickedMesh.nonUniformScaling) { + TmpVectors.Matrix[0].copyFrom(wm); + wm = TmpVectors.Matrix[0]; + wm.setTranslationFromFloats(0, 0, 0); + wm.invert(); + wm.transposeToRef(TmpVectors.Matrix[1]); + wm = TmpVectors.Matrix[1]; + } + Vector3.TransformNormalToRef(n, wm, n); + }; + if (useWorldCoordinates) { + transformNormalToWorld(this.pickedMesh, result); } - const currentTime = PrecisionDate.Now; - this._current = currentTime - this._startMonitoringTime; - if (newFrame) { - this._fetchResult(); + if (this.ray) { + const normalForDirectionChecking = TmpVectors.Vector3[0].copyFrom(result); + if (!useWorldCoordinates) { + transformNormalToWorld(this.pickedMesh, normalForDirectionChecking); + } + if (Vector3.Dot(normalForDirectionChecking, this.ray.direction) > 0) { + result.negateInPlace(); + } } + result.normalize(); + return result; } /** - * Call this method to end the monitoring of a frame. - * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the end of the frame, after beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count. + * Gets the texture coordinates of where the pick occurred + * @param uvSet The UV set to use to calculate the texture coordinates (default: VertexBuffer.UVKind) + * @returns The vector containing the coordinates of the texture */ - endFrame() { - this._fetchResult(); - } - /** @internal */ - _fetchResult() { - this._totalAccumulated += this._current; - this._lastSecAccumulated += this._current; - this._min = Math.min(this._min, this._current); - this._max = Math.max(this._max, this._current); - this._average = this._totalAccumulated / this._totalValueCount; - const now = PrecisionDate.Now; - if (now - this._lastSecTime > 1e3) { - this._lastSecAverage = this._lastSecAccumulated / this._lastSecValueCount; - this._lastSecTime = now; - this._lastSecAccumulated = 0; - this._lastSecValueCount = 0; + getTextureCoordinates(uvSet = VertexBuffer.UVKind) { + if (!this.pickedMesh || !this.pickedMesh.isVerticesDataPresent(uvSet)) { + return null; + } + const indices = this.pickedMesh.getIndices(); + if (!indices) { + return null; + } + const uvs = this.pickedMesh.getVerticesData(uvSet); + if (!uvs) { + return null; } + let uv0 = Vector2.FromArray(uvs, indices[this.faceId * 3] * 2); + let uv1 = Vector2.FromArray(uvs, indices[this.faceId * 3 + 1] * 2); + let uv2 = Vector2.FromArray(uvs, indices[this.faceId * 3 + 2] * 2); + uv0 = uv0.scale(this.bu); + uv1 = uv1.scale(this.bv); + uv2 = uv2.scale(1 - this.bu - this.bv); + return new Vector2(uv0.x + uv1.x + uv2.x, uv0.y + uv1.y + uv2.y); } }; -PerfCounter.Enabled = true; -// node_modules/@babylonjs/core/Maths/math.plane.js -var Plane = class _Plane { +// node_modules/@babylonjs/core/Actions/actionEvent.js +var ActionEvent = class _ActionEvent { /** - * Creates a Plane object according to the given floats a, b, c, d and the plane equation : ax + by + cz + d = 0 - * @param a a component of the plane - * @param b b component of the plane - * @param c c component of the plane - * @param d d component of the plane + * Creates a new ActionEvent + * @param source The mesh or sprite that triggered the action + * @param pointerX The X mouse cursor position at the time of the event + * @param pointerY The Y mouse cursor position at the time of the event + * @param meshUnderPointer The mesh that is currently pointed at (can be null) + * @param sourceEvent the original (browser) event that triggered the ActionEvent + * @param additionalData additional data for the event */ - constructor(a, b, c, d) { - this.normal = new Vector3(a, b, c); - this.d = d; + constructor(source, pointerX, pointerY, meshUnderPointer, sourceEvent, additionalData) { + this.source = source; + this.pointerX = pointerX; + this.pointerY = pointerY; + this.meshUnderPointer = meshUnderPointer; + this.sourceEvent = sourceEvent; + this.additionalData = additionalData; } /** - * @returns the plane coordinates as a new array of 4 elements [a, b, c, d]. + * Helper function to auto-create an ActionEvent from a source mesh. + * @param source The source mesh that triggered the event + * @param evt The original (browser) event + * @param additionalData additional data for the event + * @returns the new ActionEvent */ - asArray() { - return [this.normal.x, this.normal.y, this.normal.z, this.d]; + static CreateNew(source, evt, additionalData) { + const scene = source.getScene(); + return new _ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer || source, evt, additionalData); } - // Methods /** - * @returns a new plane copied from the current Plane. + * Helper function to auto-create an ActionEvent from a source sprite + * @param source The source sprite that triggered the event + * @param scene Scene associated with the sprite + * @param evt The original (browser) event + * @param additionalData additional data for the event + * @returns the new ActionEvent */ - clone() { - return new _Plane(this.normal.x, this.normal.y, this.normal.z, this.d); + static CreateNewFromSprite(source, scene, evt, additionalData) { + return new _ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer, evt, additionalData); } /** - * @returns the string "Plane". + * Helper function to auto-create an ActionEvent from a scene. If triggered by a mesh use ActionEvent.CreateNew + * @param scene the scene where the event occurred + * @param evt The original (browser) event + * @returns the new ActionEvent */ - getClassName() { - return "Plane"; - } - /** - * @returns the Plane hash code. - */ - getHashCode() { - let hash = this.normal.getHashCode(); - hash = hash * 397 ^ (this.d | 0); - return hash; - } - /** - * Normalize the current Plane in place. - * @returns the updated Plane. - */ - normalize() { - const norm = Math.sqrt(this.normal.x * this.normal.x + this.normal.y * this.normal.y + this.normal.z * this.normal.z); - let magnitude = 0; - if (norm !== 0) { - magnitude = 1 / norm; - } - this.normal.x *= magnitude; - this.normal.y *= magnitude; - this.normal.z *= magnitude; - this.d *= magnitude; - return this; + static CreateNewFromScene(scene, evt) { + return new _ActionEvent(null, scene.pointerX, scene.pointerY, scene.meshUnderPointer, evt); } /** - * Applies a transformation the plane and returns the result - * @param transformation the transformation matrix to be applied to the plane - * @returns a new Plane as the result of the transformation of the current Plane by the given matrix. + * Helper function to auto-create an ActionEvent from a primitive + * @param prim defines the target primitive + * @param pointerPos defines the pointer position + * @param evt The original (browser) event + * @param additionalData additional data for the event + * @returns the new ActionEvent */ - transform(transformation) { - const invertedMatrix = _Plane._TmpMatrix; - transformation.invertToRef(invertedMatrix); - const m = invertedMatrix.m; - const x = this.normal.x; - const y = this.normal.y; - const z = this.normal.z; - const d = this.d; - const normalX = x * m[0] + y * m[1] + z * m[2] + d * m[3]; - const normalY = x * m[4] + y * m[5] + z * m[6] + d * m[7]; - const normalZ = x * m[8] + y * m[9] + z * m[10] + d * m[11]; - const finalD = x * m[12] + y * m[13] + z * m[14] + d * m[15]; - return new _Plane(normalX, normalY, normalZ, finalD); + static CreateNewFromPrimitive(prim, pointerPos, evt, additionalData) { + return new _ActionEvent(prim, pointerPos.x, pointerPos.y, null, evt, additionalData); } +}; + +// node_modules/@babylonjs/core/PostProcesses/postProcessManager.js +var PostProcessManager = class { /** - * Compute the dot product between the point and the plane normal - * @param point point to calculate the dot product with - * @returns the dot product (float) of the point coordinates and the plane normal. + * Creates a new instance PostProcess + * @param scene The scene that the post process is associated with. */ - dotCoordinate(point) { - return this.normal.x * point.x + this.normal.y * point.y + this.normal.z * point.z + this.d; + constructor(scene) { + this._vertexBuffers = {}; + this._scene = scene; } - /** - * Updates the current Plane from the plane defined by the three given points. - * @param point1 one of the points used to construct the plane - * @param point2 one of the points used to construct the plane - * @param point3 one of the points used to construct the plane - * @returns the updated Plane. - */ - copyFromPoints(point1, point2, point3) { - const x1 = point2.x - point1.x; - const y1 = point2.y - point1.y; - const z1 = point2.z - point1.z; - const x2 = point3.x - point1.x; - const y2 = point3.y - point1.y; - const z2 = point3.z - point1.z; - const yz = y1 * z2 - z1 * y2; - const xz = z1 * x2 - x1 * z2; - const xy = x1 * y2 - y1 * x2; - const pyth = Math.sqrt(yz * yz + xz * xz + xy * xy); - let invPyth; - if (pyth !== 0) { - invPyth = 1 / pyth; - } else { - invPyth = 0; + _prepareBuffers() { + if (this._vertexBuffers[VertexBuffer.PositionKind]) { + return; } - this.normal.x = yz * invPyth; - this.normal.y = xz * invPyth; - this.normal.z = xy * invPyth; - this.d = -(this.normal.x * point1.x + this.normal.y * point1.y + this.normal.z * point1.z); - return this; - } - /** - * Checks if the plane is facing a given direction (meaning if the plane's normal is pointing in the opposite direction of the given vector). - * Note that for this function to work as expected you should make sure that: - * - direction and the plane normal are normalized - * - epsilon is a number just bigger than -1, something like -0.99 for eg - * @param direction the direction to check if the plane is facing - * @param epsilon value the dot product is compared against (returns true if dot <= epsilon) - * @returns True if the plane is facing the given direction - */ - isFrontFacingTo(direction, epsilon) { - const dot = Vector3.Dot(this.normal, direction); - return dot <= epsilon; + const vertices = []; + vertices.push(1, 1); + vertices.push(-1, 1); + vertices.push(-1, -1); + vertices.push(1, -1); + this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(this._scene.getEngine(), vertices, VertexBuffer.PositionKind, false, false, 2); + this._buildIndexBuffer(); } - /** - * Calculates the distance to a point - * @param point point to calculate distance to - * @returns the signed distance (float) from the given point to the Plane. - */ - signedDistanceTo(point) { - return Vector3.Dot(point, this.normal) + this.d; + _buildIndexBuffer() { + const indices = []; + indices.push(0); + indices.push(1); + indices.push(2); + indices.push(0); + indices.push(2); + indices.push(3); + this._indexBuffer = this._scene.getEngine().createIndexBuffer(indices); } - // Statics /** - * Creates a plane from an array - * @param array the array to create a plane from - * @returns a new Plane from the given array. + * Rebuilds the vertex buffers of the manager. + * @internal */ - static FromArray(array) { - return new _Plane(array[0], array[1], array[2], array[3]); + _rebuild() { + const vb = this._vertexBuffers[VertexBuffer.PositionKind]; + if (!vb) { + return; + } + vb._rebuild(); + this._buildIndexBuffer(); } + // Methods /** - * Creates a plane from three points - * @param point1 point used to create the plane - * @param point2 point used to create the plane - * @param point3 point used to create the plane - * @returns a new Plane defined by the three given points. + * Prepares a frame to be run through a post process. + * @param sourceTexture The input texture to the post processes. (default: null) + * @param postProcesses An array of post processes to be run. (default: null) + * @returns True if the post processes were able to be run. + * @internal */ - static FromPoints(point1, point2, point3) { - const result = new _Plane(0, 0, 0, 0); - result.copyFromPoints(point1, point2, point3); - return result; + _prepareFrame(sourceTexture = null, postProcesses = null) { + const camera = this._scene.activeCamera; + if (!camera) { + return false; + } + postProcesses = postProcesses || camera._postProcesses.filter((pp) => { + return pp != null; + }); + if (!postProcesses || postProcesses.length === 0 || !this._scene.postProcessesEnabled) { + return false; + } + postProcesses[0].activate(camera, sourceTexture, postProcesses !== null && postProcesses !== void 0); + return true; } /** - * Creates a plane from an origin point and a normal - * @param origin origin of the plane to be constructed - * @param normal normal of the plane to be constructed - * @returns a new Plane the normal vector to this plane at the given origin point. + * Manually render a set of post processes to a texture. + * Please note, the frame buffer won't be unbound after the call in case you have more render to do. + * @param postProcesses An array of post processes to be run. + * @param targetTexture The render target wrapper to render to. + * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight + * @param faceIndex defines the face to render to if a cubemap is defined as the target + * @param lodLevel defines which lod of the texture to render to + * @param doNotBindFrambuffer If set to true, assumes that the framebuffer has been bound previously */ - static FromPositionAndNormal(origin, normal) { - const plane = new _Plane(0, 0, 0, 0); - return this.FromPositionAndNormalToRef(origin, normal, plane); + directRender(postProcesses, targetTexture = null, forceFullscreenViewport = false, faceIndex = 0, lodLevel = 0, doNotBindFrambuffer = false) { + var _a; + const engine = this._scene.getEngine(); + for (let index = 0; index < postProcesses.length; index++) { + if (index < postProcesses.length - 1) { + postProcesses[index + 1].activate(this._scene.activeCamera, targetTexture == null ? void 0 : targetTexture.texture); + } else { + if (targetTexture) { + engine.bindFramebuffer(targetTexture, faceIndex, void 0, void 0, forceFullscreenViewport, lodLevel); + } else if (!doNotBindFrambuffer) { + engine.restoreDefaultFramebuffer(); + } + (_a = engine._debugInsertMarker) == null ? void 0 : _a.call(engine, `post process ${postProcesses[index].name} output`); + } + const pp = postProcesses[index]; + const effect = pp.apply(); + if (effect) { + pp.onBeforeRenderObservable.notifyObservers(effect); + this._prepareBuffers(); + engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect); + engine.drawElementsType(0, 0, 6); + pp.onAfterRenderObservable.notifyObservers(effect); + } + } + engine.setDepthBuffer(true); + engine.setDepthWrite(true); } /** - * Updates the given Plane "result" from an origin point and a normal. - * @param origin origin of the plane to be constructed - * @param normal the normalized normals of the plane to be constructed - * @param result defines the Plane where to store the result - * @returns result input + * Finalize the result of the output of the postprocesses. + * @param doNotPresent If true the result will not be displayed to the screen. + * @param targetTexture The render target wrapper to render to. + * @param faceIndex The index of the face to bind the target texture to. + * @param postProcesses The array of post processes to render. + * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight (default: false) + * @internal */ - static FromPositionAndNormalToRef(origin, normal, result) { - result.normal.copyFrom(normal); - result.normal.normalize(); - result.d = -origin.dot(result.normal); - return result; + _finalizeFrame(doNotPresent, targetTexture, faceIndex, postProcesses, forceFullscreenViewport = false) { + var _a; + const camera = this._scene.activeCamera; + if (!camera) { + return; + } + postProcesses = postProcesses || camera._postProcesses.filter((pp) => { + return pp != null; + }); + if (postProcesses.length === 0 || !this._scene.postProcessesEnabled) { + return; + } + const engine = this._scene.getEngine(); + for (let index = 0, len = postProcesses.length; index < len; index++) { + const pp = postProcesses[index]; + if (index < len - 1) { + pp._outputTexture = postProcesses[index + 1].activate(camera, targetTexture == null ? void 0 : targetTexture.texture); + } else { + if (targetTexture) { + engine.bindFramebuffer(targetTexture, faceIndex, void 0, void 0, forceFullscreenViewport); + pp._outputTexture = targetTexture; + } else { + engine.restoreDefaultFramebuffer(); + pp._outputTexture = null; + } + (_a = engine._debugInsertMarker) == null ? void 0 : _a.call(engine, `post process ${postProcesses[index].name} output`); + } + if (doNotPresent) { + break; + } + const effect = pp.apply(); + if (effect) { + pp.onBeforeRenderObservable.notifyObservers(effect); + this._prepareBuffers(); + engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect); + engine.drawElementsType(0, 0, 6); + pp.onAfterRenderObservable.notifyObservers(effect); + } + } + engine.setDepthBuffer(true); + engine.setDepthWrite(true); + engine.setAlphaMode(0); } /** - * Calculates the distance from a plane and a point - * @param origin origin of the plane to be constructed - * @param normal normal of the plane to be constructed - * @param point point to calculate distance to - * @returns the signed distance between the plane defined by the normal vector at the "origin"" point and the given other point. + * Disposes of the post process manager. */ - static SignedDistanceToPlaneFromPositionAndNormal(origin, normal, point) { - const d = -(normal.x * origin.x + normal.y * origin.y + normal.z * origin.z); - return Vector3.Dot(point, normal) + d; + dispose() { + const buffer = this._vertexBuffers[VertexBuffer.PositionKind]; + if (buffer) { + buffer.dispose(); + this._vertexBuffers[VertexBuffer.PositionKind] = null; + } + if (this._indexBuffer) { + this._scene.getEngine()._releaseBuffer(this._indexBuffer); + this._indexBuffer = null; + } } }; -Plane._TmpMatrix = Matrix.Identity(); -// node_modules/@babylonjs/core/Maths/math.frustum.js -var Frustum = class _Frustum { +// node_modules/@babylonjs/core/Rendering/renderingGroup.js +var RenderingGroup = class _RenderingGroup { /** - * Gets the planes representing the frustum - * @param transform matrix to be applied to the returned planes - * @returns a new array of 6 Frustum planes computed by the given transformation matrix. + * Set the opaque sort comparison function. + * If null the sub meshes will be render in the order they were created */ - static GetPlanes(transform) { - const frustumPlanes = []; - for (let index = 0; index < 6; index++) { - frustumPlanes.push(new Plane(0, 0, 0, 0)); + set opaqueSortCompareFn(value) { + if (value) { + this._opaqueSortCompareFn = value; + } else { + this._opaqueSortCompareFn = _RenderingGroup.PainterSortCompare; } - _Frustum.GetPlanesToRef(transform, frustumPlanes); - return frustumPlanes; + this._renderOpaque = this._renderOpaqueSorted; } /** - * Gets the near frustum plane transformed by the transform matrix - * @param transform transformation matrix to be applied to the resulting frustum plane - * @param frustumPlane the resulting frustum plane + * Set the alpha test sort comparison function. + * If null the sub meshes will be render in the order they were created */ - static GetNearPlaneToRef(transform, frustumPlane) { - const m = transform.m; - frustumPlane.normal.x = m[3] + m[2]; - frustumPlane.normal.y = m[7] + m[6]; - frustumPlane.normal.z = m[11] + m[10]; - frustumPlane.d = m[15] + m[14]; - frustumPlane.normalize(); + set alphaTestSortCompareFn(value) { + if (value) { + this._alphaTestSortCompareFn = value; + } else { + this._alphaTestSortCompareFn = _RenderingGroup.PainterSortCompare; + } + this._renderAlphaTest = this._renderAlphaTestSorted; } /** - * Gets the far frustum plane transformed by the transform matrix - * @param transform transformation matrix to be applied to the resulting frustum plane - * @param frustumPlane the resulting frustum plane + * Set the transparent sort comparison function. + * If null the sub meshes will be render in the order they were created */ - static GetFarPlaneToRef(transform, frustumPlane) { - const m = transform.m; - frustumPlane.normal.x = m[3] - m[2]; - frustumPlane.normal.y = m[7] - m[6]; - frustumPlane.normal.z = m[11] - m[10]; - frustumPlane.d = m[15] - m[14]; - frustumPlane.normalize(); + set transparentSortCompareFn(value) { + if (value) { + this._transparentSortCompareFn = value; + } else { + this._transparentSortCompareFn = _RenderingGroup.defaultTransparentSortCompare; + } + this._renderTransparent = this._renderTransparentSorted; } /** - * Gets the left frustum plane transformed by the transform matrix - * @param transform transformation matrix to be applied to the resulting frustum plane - * @param frustumPlane the resulting frustum plane + * Creates a new rendering group. + * @param index The rendering group index + * @param scene + * @param opaqueSortCompareFn The opaque sort comparison function. If null no order is applied + * @param alphaTestSortCompareFn The alpha test sort comparison function. If null no order is applied + * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied */ - static GetLeftPlaneToRef(transform, frustumPlane) { - const m = transform.m; - frustumPlane.normal.x = m[3] + m[0]; - frustumPlane.normal.y = m[7] + m[4]; - frustumPlane.normal.z = m[11] + m[8]; - frustumPlane.d = m[15] + m[12]; - frustumPlane.normalize(); + constructor(index, scene, opaqueSortCompareFn = null, alphaTestSortCompareFn = null, transparentSortCompareFn = null) { + this.index = index; + this._opaqueSubMeshes = new SmartArray(256); + this._transparentSubMeshes = new SmartArray(256); + this._alphaTestSubMeshes = new SmartArray(256); + this._depthOnlySubMeshes = new SmartArray(256); + this._particleSystems = new SmartArray(256); + this._spriteManagers = new SmartArray(256); + this._empty = true; + this._edgesRenderers = new SmartArrayNoDuplicate(16); + this._scene = scene; + this.opaqueSortCompareFn = opaqueSortCompareFn; + this.alphaTestSortCompareFn = alphaTestSortCompareFn; + this.transparentSortCompareFn = transparentSortCompareFn; } /** - * Gets the right frustum plane transformed by the transform matrix - * @param transform transformation matrix to be applied to the resulting frustum plane - * @param frustumPlane the resulting frustum plane + * Render all the sub meshes contained in the group. + * @param customRenderFunction Used to override the default render behaviour of the group. + * @param renderSprites + * @param renderParticles + * @param activeMeshes */ - static GetRightPlaneToRef(transform, frustumPlane) { - const m = transform.m; - frustumPlane.normal.x = m[3] - m[0]; - frustumPlane.normal.y = m[7] - m[4]; - frustumPlane.normal.z = m[11] - m[8]; - frustumPlane.d = m[15] - m[12]; - frustumPlane.normalize(); + render(customRenderFunction, renderSprites, renderParticles, activeMeshes) { + if (customRenderFunction) { + customRenderFunction(this._opaqueSubMeshes, this._alphaTestSubMeshes, this._transparentSubMeshes, this._depthOnlySubMeshes); + return; + } + const engine = this._scene.getEngine(); + if (this._depthOnlySubMeshes.length !== 0) { + engine.setColorWrite(false); + this._renderAlphaTest(this._depthOnlySubMeshes); + engine.setColorWrite(true); + } + if (this._opaqueSubMeshes.length !== 0) { + this._renderOpaque(this._opaqueSubMeshes); + } + if (this._alphaTestSubMeshes.length !== 0) { + this._renderAlphaTest(this._alphaTestSubMeshes); + } + const stencilState = engine.getStencilBuffer(); + engine.setStencilBuffer(false); + if (renderSprites) { + this._renderSprites(); + } + if (renderParticles) { + this._renderParticles(activeMeshes); + } + if (this.onBeforeTransparentRendering) { + this.onBeforeTransparentRendering(); + } + if (this._transparentSubMeshes.length !== 0 || this._scene.useOrderIndependentTransparency) { + engine.setStencilBuffer(stencilState); + if (this._scene.useOrderIndependentTransparency) { + const excludedMeshes = this._scene.depthPeelingRenderer.render(this._transparentSubMeshes); + if (excludedMeshes.length) { + this._renderTransparent(excludedMeshes); + } + } else { + this._renderTransparent(this._transparentSubMeshes); + } + engine.setAlphaMode(0); + } + engine.setStencilBuffer(false); + if (this._edgesRenderers.length) { + for (let edgesRendererIndex = 0; edgesRendererIndex < this._edgesRenderers.length; edgesRendererIndex++) { + this._edgesRenderers.data[edgesRendererIndex].render(); + } + engine.setAlphaMode(0); + } + engine.setStencilBuffer(stencilState); } /** - * Gets the top frustum plane transformed by the transform matrix - * @param transform transformation matrix to be applied to the resulting frustum plane - * @param frustumPlane the resulting frustum plane + * Renders the opaque submeshes in the order from the opaqueSortCompareFn. + * @param subMeshes The submeshes to render */ - static GetTopPlaneToRef(transform, frustumPlane) { - const m = transform.m; - frustumPlane.normal.x = m[3] - m[1]; - frustumPlane.normal.y = m[7] - m[5]; - frustumPlane.normal.z = m[11] - m[9]; - frustumPlane.d = m[15] - m[13]; - frustumPlane.normalize(); + _renderOpaqueSorted(subMeshes) { + _RenderingGroup._RenderSorted(subMeshes, this._opaqueSortCompareFn, this._scene.activeCamera, false); } /** - * Gets the bottom frustum plane transformed by the transform matrix - * @param transform transformation matrix to be applied to the resulting frustum plane - * @param frustumPlane the resulting frustum plane + * Renders the opaque submeshes in the order from the alphatestSortCompareFn. + * @param subMeshes The submeshes to render */ - static GetBottomPlaneToRef(transform, frustumPlane) { - const m = transform.m; - frustumPlane.normal.x = m[3] + m[1]; - frustumPlane.normal.y = m[7] + m[5]; - frustumPlane.normal.z = m[11] + m[9]; - frustumPlane.d = m[15] + m[13]; - frustumPlane.normalize(); + _renderAlphaTestSorted(subMeshes) { + _RenderingGroup._RenderSorted(subMeshes, this._alphaTestSortCompareFn, this._scene.activeCamera, false); } /** - * Sets the given array "frustumPlanes" with the 6 Frustum planes computed by the given transformation matrix. - * @param transform transformation matrix to be applied to the resulting frustum planes - * @param frustumPlanes the resulting frustum planes + * Renders the opaque submeshes in the order from the transparentSortCompareFn. + * @param subMeshes The submeshes to render */ - static GetPlanesToRef(transform, frustumPlanes) { - _Frustum.GetNearPlaneToRef(transform, frustumPlanes[0]); - _Frustum.GetFarPlaneToRef(transform, frustumPlanes[1]); - _Frustum.GetLeftPlaneToRef(transform, frustumPlanes[2]); - _Frustum.GetRightPlaneToRef(transform, frustumPlanes[3]); - _Frustum.GetTopPlaneToRef(transform, frustumPlanes[4]); - _Frustum.GetBottomPlaneToRef(transform, frustumPlanes[5]); + _renderTransparentSorted(subMeshes) { + _RenderingGroup._RenderSorted(subMeshes, this._transparentSortCompareFn, this._scene.activeCamera, true); } /** - * Tests if a point is located between the frustum planes. - * @param point defines the point to test - * @param frustumPlanes defines the frustum planes to test - * @returns true if the point is located between the frustum planes + * Renders the submeshes in a specified order. + * @param subMeshes The submeshes to sort before render + * @param sortCompareFn The comparison function use to sort + * @param camera The camera position use to preprocess the submeshes to help sorting + * @param transparent Specifies to activate blending if true */ - static IsPointInFrustum(point, frustumPlanes) { - for (let i = 0; i < 6; i++) { - if (frustumPlanes[i].dotCoordinate(point) < 0) { - return false; + static _RenderSorted(subMeshes, sortCompareFn, camera, transparent) { + let subIndex = 0; + let subMesh; + const cameraPosition = camera ? camera.globalPosition : _RenderingGroup._ZeroVector; + if (transparent) { + for (; subIndex < subMeshes.length; subIndex++) { + subMesh = subMeshes.data[subIndex]; + subMesh._alphaIndex = subMesh.getMesh().alphaIndex; + subMesh._distanceToCamera = Vector3.Distance(subMesh.getBoundingInfo().boundingSphere.centerWorld, cameraPosition); } } - return true; - } -}; - -// node_modules/@babylonjs/core/Inputs/scene.inputManager.js -var _ClickInfo = class { - constructor() { - this._singleClick = false; - this._doubleClick = false; - this._hasSwiped = false; - this._ignore = false; - } - get singleClick() { - return this._singleClick; - } - get doubleClick() { - return this._doubleClick; - } - get hasSwiped() { - return this._hasSwiped; - } - get ignore() { - return this._ignore; - } - set singleClick(b) { - this._singleClick = b; - } - set doubleClick(b) { - this._doubleClick = b; - } - set hasSwiped(b) { - this._hasSwiped = b; - } - set ignore(b) { - this._ignore = b; + const sortedArray = subMeshes.length === subMeshes.data.length ? subMeshes.data : subMeshes.data.slice(0, subMeshes.length); + if (sortCompareFn) { + sortedArray.sort(sortCompareFn); + } + const scene = sortedArray[0].getMesh().getScene(); + for (subIndex = 0; subIndex < sortedArray.length; subIndex++) { + subMesh = sortedArray[subIndex]; + if (scene._activeMeshesFrozenButKeepClipping && !subMesh.isInFrustum(scene._frustumPlanes)) { + continue; + } + if (transparent) { + const material = subMesh.getMaterial(); + if (material && material.needDepthPrePass) { + const engine = material.getScene().getEngine(); + engine.setColorWrite(false); + engine.setAlphaMode(0); + subMesh.render(false); + engine.setColorWrite(true); + } + } + subMesh.render(transparent); + } } -}; -var InputManager = class _InputManager { /** - * Creates a new InputManager - * @param scene - defines the hosting scene + * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent) + * are rendered back to front if in the same alpha index. + * + * @param a The first submesh + * @param b The second submesh + * @returns The result of the comparison */ - constructor(scene) { - this._alreadyAttached = false; - this._meshPickProceed = false; - this._currentPickResult = null; - this._previousPickResult = null; - this._totalPointersPressed = 0; - this._doubleClickOccured = false; - this._isSwiping = false; - this._swipeButtonPressed = -1; - this._skipPointerTap = false; - this._isMultiTouchGesture = false; - this._pointerX = 0; - this._pointerY = 0; - this._startingPointerPosition = new Vector2(0, 0); - this._previousStartingPointerPosition = new Vector2(0, 0); - this._startingPointerTime = 0; - this._previousStartingPointerTime = 0; - this._pointerCaptures = {}; - this._meshUnderPointerId = {}; - this._movePointerInfo = null; - this._cameraObserverCount = 0; - this._delayedClicks = [null, null, null, null, null]; - this._deviceSourceManager = null; - this._scene = scene || EngineStore.LastCreatedScene; - if (!this._scene) { - return; + // eslint-disable-next-line @typescript-eslint/naming-convention + static defaultTransparentSortCompare(a, b) { + if (a._alphaIndex > b._alphaIndex) { + return 1; + } + if (a._alphaIndex < b._alphaIndex) { + return -1; } + return _RenderingGroup.backToFrontSortCompare(a, b); } /** - * Gets the mesh that is currently under the pointer - * @returns Mesh that the pointer is pointer is hovering over + * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent) + * are rendered back to front. + * + * @param a The first submesh + * @param b The second submesh + * @returns The result of the comparison */ - get meshUnderPointer() { - if (this._movePointerInfo) { - this._movePointerInfo._generatePickInfo(); - this._movePointerInfo = null; + // eslint-disable-next-line @typescript-eslint/naming-convention + static backToFrontSortCompare(a, b) { + if (a._distanceToCamera < b._distanceToCamera) { + return 1; } - return this._pointerOverMesh; + if (a._distanceToCamera > b._distanceToCamera) { + return -1; + } + return 0; } /** - * When using more than one pointer (for example in XR) you can get the mesh under the specific pointer - * @param pointerId - the pointer id to use - * @returns The mesh under this pointer id or null if not found + * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent) + * are rendered front to back (prevent overdraw). + * + * @param a The first submesh + * @param b The second submesh + * @returns The result of the comparison */ - getMeshUnderPointerByPointerId(pointerId) { - return this._meshUnderPointerId[pointerId] || null; + // eslint-disable-next-line @typescript-eslint/naming-convention + static frontToBackSortCompare(a, b) { + if (a._distanceToCamera < b._distanceToCamera) { + return -1; + } + if (a._distanceToCamera > b._distanceToCamera) { + return 1; + } + return 0; } /** - * Gets the pointer coordinates in 2D without any translation (ie. straight out of the pointer event) - * @returns Vector with X/Y values directly from pointer event + * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent) + * are grouped by material then geometry. + * + * @param a The first submesh + * @param b The second submesh + * @returns The result of the comparison */ - get unTranslatedPointer() { - return new Vector2(this._unTranslatedPointerX, this._unTranslatedPointerY); + static PainterSortCompare(a, b) { + const meshA = a.getMesh(); + const meshB = b.getMesh(); + if (meshA.material && meshB.material) { + return meshA.material.uniqueId - meshB.material.uniqueId; + } + return meshA.uniqueId - meshB.uniqueId; } /** - * Gets or sets the current on-screen X position of the pointer - * @returns Translated X with respect to screen + * Resets the different lists of submeshes to prepare a new frame. */ - get pointerX() { - return this._pointerX; - } - set pointerX(value) { - this._pointerX = value; + prepare() { + this._opaqueSubMeshes.reset(); + this._transparentSubMeshes.reset(); + this._alphaTestSubMeshes.reset(); + this._depthOnlySubMeshes.reset(); + this._particleSystems.reset(); + this.prepareSprites(); + this._edgesRenderers.reset(); + this._empty = true; } /** - * Gets or sets the current on-screen Y position of the pointer - * @returns Translated Y with respect to screen + * Resets the different lists of sprites to prepare a new frame. */ - get pointerY() { - return this._pointerY; - } - set pointerY(value) { - this._pointerY = value; + prepareSprites() { + this._spriteManagers.reset(); } - _updatePointerPosition(evt) { - const canvasRect = this._scene.getEngine().getInputElementClientRect(); - if (!canvasRect) { - return; - } - this._pointerX = evt.clientX - canvasRect.left; - this._pointerY = evt.clientY - canvasRect.top; - this._unTranslatedPointerX = this._pointerX; - this._unTranslatedPointerY = this._pointerY; + dispose() { + this._opaqueSubMeshes.dispose(); + this._transparentSubMeshes.dispose(); + this._alphaTestSubMeshes.dispose(); + this._depthOnlySubMeshes.dispose(); + this._particleSystems.dispose(); + this._spriteManagers.dispose(); + this._edgesRenderers.dispose(); } - _processPointerMove(pickResult, evt) { - const scene = this._scene; - const engine = scene.getEngine(); - const canvas = engine.getInputElement(); - if (canvas) { - canvas.tabIndex = engine.canvasTabIndex; - if (!scene.doNotHandleCursors) { - canvas.style.cursor = scene.defaultCursor; - } + /** + * Inserts the submesh in its correct queue depending on its material. + * @param subMesh The submesh to dispatch + * @param [mesh] Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance. + * @param [material] Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance. + */ + dispatch(subMesh, mesh, material) { + if (mesh === void 0) { + mesh = subMesh.getMesh(); } - this._setCursorAndPointerOverMesh(pickResult, evt, scene); - for (const step of scene._pointerMoveStage) { - pickResult = pickResult || this._pickMove(evt); - const isMeshPicked = (pickResult == null ? void 0 : pickResult.pickedMesh) ? true : false; - pickResult = step.action(this._unTranslatedPointerX, this._unTranslatedPointerY, pickResult, isMeshPicked, canvas); + if (material === void 0) { + material = subMesh.getMaterial(); } - const type = evt.inputIndex >= PointerInput.MouseWheelX && evt.inputIndex <= PointerInput.MouseWheelZ ? PointerEventTypes.POINTERWHEEL : PointerEventTypes.POINTERMOVE; - if (scene.onPointerMove) { - pickResult = pickResult || this._pickMove(evt); - scene.onPointerMove(evt, pickResult, type); + if (material === null || material === void 0) { + return; } - let pointerInfo; - if (pickResult) { - pointerInfo = new PointerInfo(type, evt, pickResult); - this._setRayOnPointerInfo(pickResult, evt); + if (material.needAlphaBlendingForMesh(mesh)) { + this._transparentSubMeshes.push(subMesh); + } else if (material.needAlphaTesting()) { + if (material.needDepthPrePass) { + this._depthOnlySubMeshes.push(subMesh); + } + this._alphaTestSubMeshes.push(subMesh); } else { - pointerInfo = new PointerInfo(type, evt, null, this); - this._movePointerInfo = pointerInfo; - } - if (scene.onPointerObservable.hasObservers()) { - scene.onPointerObservable.notifyObservers(pointerInfo, type); - } - } - // Pointers handling - /** @internal */ - _setRayOnPointerInfo(pickInfo, event) { - const scene = this._scene; - if (pickInfo && scene._pickingAvailable) { - if (!pickInfo.ray) { - pickInfo.ray = scene.createPickingRay(event.offsetX, event.offsetY, Matrix.Identity(), scene.activeCamera); + if (material.needDepthPrePass) { + this._depthOnlySubMeshes.push(subMesh); } + this._opaqueSubMeshes.push(subMesh); } + mesh._renderingGroup = this; + if (mesh._edgesRenderer && mesh._edgesRenderer.isEnabled) { + this._edgesRenderers.pushNoDuplicate(mesh._edgesRenderer); + } + this._empty = false; } - /** @internal */ - _addCameraPointerObserver(observer2, mask) { - this._cameraObserverCount++; - return this._scene.onPointerObservable.add(observer2, mask); - } - /** @internal */ - _removeCameraPointerObserver(observer2) { - this._cameraObserverCount--; - return this._scene.onPointerObservable.remove(observer2); + dispatchSprites(spriteManager) { + this._spriteManagers.push(spriteManager); + this._empty = false; } - _checkForPicking() { - return !!(this._scene.onPointerObservable.observers.length > this._cameraObserverCount || this._scene.onPointerPick); + dispatchParticles(particleSystem) { + this._particleSystems.push(particleSystem); + this._empty = false; } - _checkPrePointerObservable(pickResult, evt, type) { - const scene = this._scene; - const pi = new PointerInfoPre(type, evt, this._unTranslatedPointerX, this._unTranslatedPointerY); - if (pickResult) { - pi.originalPickingInfo = pickResult; - pi.ray = pickResult.ray; - if (evt.pointerType === "xr-near" && pickResult.originMesh) { - pi.nearInteractionPickingInfo = pickResult; - } + _renderParticles(activeMeshes) { + if (this._particleSystems.length === 0) { + return; } - scene.onPrePointerObservable.notifyObservers(pi, type); - if (pi.skipOnPointerObservable) { - return true; - } else { - return false; + const activeCamera = this._scene.activeCamera; + this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene); + for (let particleIndex = 0; particleIndex < this._particleSystems.length; particleIndex++) { + const particleSystem = this._particleSystems.data[particleIndex]; + if ((activeCamera && activeCamera.layerMask & particleSystem.layerMask) === 0) { + continue; + } + const emitter = particleSystem.emitter; + if (!emitter.position || !activeMeshes || activeMeshes.indexOf(emitter) !== -1) { + this._scene._activeParticles.addCount(particleSystem.render(), false); + } } + this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene); } - /** @internal */ - _pickMove(evt) { - const scene = this._scene; - const pickResult = scene.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, scene.pointerMovePredicate, scene.pointerMoveFastCheck, scene.cameraToUseForPointers, scene.pointerMoveTrianglePredicate); - this._setCursorAndPointerOverMesh(pickResult, evt, scene); - return pickResult; - } - _setCursorAndPointerOverMesh(pickResult, evt, scene) { - const engine = scene.getEngine(); - const canvas = engine.getInputElement(); - if (pickResult == null ? void 0 : pickResult.pickedMesh) { - this.setPointerOverMesh(pickResult.pickedMesh, evt.pointerId, pickResult, evt); - if (!scene.doNotHandleCursors && canvas && this._pointerOverMesh) { - const actionManager = this._pointerOverMesh._getActionManagerForTrigger(); - if (actionManager && actionManager.hasPointerTriggers) { - canvas.style.cursor = actionManager.hoverCursor || scene.hoverCursor; - } + _renderSprites() { + if (!this._scene.spritesEnabled || this._spriteManagers.length === 0) { + return; + } + const activeCamera = this._scene.activeCamera; + this._scene.onBeforeSpritesRenderingObservable.notifyObservers(this._scene); + for (let id = 0; id < this._spriteManagers.length; id++) { + const spriteManager = this._spriteManagers.data[id]; + if ((activeCamera && activeCamera.layerMask & spriteManager.layerMask) !== 0) { + spriteManager.render(); } - } else { - this.setPointerOverMesh(null, evt.pointerId, pickResult, evt); } + this._scene.onAfterSpritesRenderingObservable.notifyObservers(this._scene); } +}; +RenderingGroup._ZeroVector = Vector3.Zero(); + +// node_modules/@babylonjs/core/Rendering/renderingManager.js +var RenderingGroupInfo = class { +}; +var RenderingManager = class _RenderingManager { /** - * Use this method to simulate a pointer move on a mesh - * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay - * @param pickResult - pickingInfo of the object wished to simulate pointer event on - * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch) + * Gets or sets a boolean indicating that the manager will not reset between frames. + * This means that if a mesh becomes invisible or transparent it will not be visible until this boolean is set to false again. + * By default, the rendering manager will dispatch all active meshes per frame (moving them to the transparent, opaque or alpha testing lists). + * By turning this property on, you will accelerate the rendering by keeping all these lists unchanged between frames. */ - simulatePointerMove(pickResult, pointerEventInit) { - const evt = new PointerEvent("pointermove", pointerEventInit); - evt.inputIndex = PointerInput.Move; - if (this._checkPrePointerObservable(pickResult, evt, PointerEventTypes.POINTERMOVE)) { + get maintainStateBetweenFrames() { + return this._maintainStateBetweenFrames; + } + set maintainStateBetweenFrames(value) { + if (value === this._maintainStateBetweenFrames) { return; } - this._processPointerMove(pickResult, evt); + this._maintainStateBetweenFrames = value; + if (!this._maintainStateBetweenFrames) { + this.restoreDispachedFlags(); + } } /** - * Use this method to simulate a pointer down on a mesh - * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay - * @param pickResult - pickingInfo of the object wished to simulate pointer event on - * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch) + * Restore wasDispatched flags on the lists of elements to render. */ - simulatePointerDown(pickResult, pointerEventInit) { - const evt = new PointerEvent("pointerdown", pointerEventInit); - evt.inputIndex = evt.button + 2; - if (this._checkPrePointerObservable(pickResult, evt, PointerEventTypes.POINTERDOWN)) { - return; - } - this._processPointerDown(pickResult, evt); - } - _processPointerDown(pickResult, evt) { - const scene = this._scene; - if (pickResult == null ? void 0 : pickResult.pickedMesh) { - this._pickedDownMesh = pickResult.pickedMesh; - const actionManager = pickResult.pickedMesh._getActionManagerForTrigger(); - if (actionManager) { - if (actionManager.hasPickTriggers) { - actionManager.processTrigger(5, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); - switch (evt.button) { - case 0: - actionManager.processTrigger(2, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); - break; - case 1: - actionManager.processTrigger(4, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); - break; - case 2: - actionManager.processTrigger(3, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); - break; - } - } - if (actionManager.hasSpecificTrigger(8)) { - window.setTimeout(() => { - const pickResult2 = scene.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, (mesh) => mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.actionManager && mesh.actionManager.hasSpecificTrigger(8) && mesh === this._pickedDownMesh, false, scene.cameraToUseForPointers); - if ((pickResult2 == null ? void 0 : pickResult2.pickedMesh) && actionManager) { - if (this._totalPointersPressed !== 0 && Date.now() - this._startingPointerTime > _InputManager.LongPressDelay && !this._isPointerSwiping()) { - this._startingPointerTime = 0; - actionManager.processTrigger(8, ActionEvent.CreateNew(pickResult2.pickedMesh, evt)); - } - } - }, _InputManager.LongPressDelay); + restoreDispachedFlags() { + for (const mesh of this._scene.meshes) { + if (mesh.subMeshes) { + for (const subMesh of mesh.subMeshes) { + subMesh._wasDispatched = false; } } - } else { - for (const step of scene._pointerDownStage) { - pickResult = step.action(this._unTranslatedPointerX, this._unTranslatedPointerY, pickResult, evt, false); - } } - let pointerInfo; - const type = PointerEventTypes.POINTERDOWN; - if (pickResult) { - if (scene.onPointerDown) { - scene.onPointerDown(evt, pickResult, type); + if (this._scene.spriteManagers) { + for (const spriteManager of this._scene.spriteManagers) { + spriteManager._wasDispatched = false; } - pointerInfo = new PointerInfo(type, evt, pickResult); - this._setRayOnPointerInfo(pickResult, evt); - } else { - pointerInfo = new PointerInfo(type, evt, null, this); } - if (scene.onPointerObservable.hasObservers()) { - scene.onPointerObservable.notifyObservers(pointerInfo, type); + for (const particleSystem of this._scene.particleSystems) { + particleSystem._wasDispatched = false; } } /** - * @internal - * @internals Boolean if delta for pointer exceeds drag movement threshold + * Instantiates a new rendering group for a particular scene + * @param scene Defines the scene the groups belongs to */ - _isPointerSwiping() { - return this._isSwiping; + constructor(scene) { + this._useSceneAutoClearSetup = false; + this._renderingGroups = new Array(); + this._autoClearDepthStencil = {}; + this._customOpaqueSortCompareFn = {}; + this._customAlphaTestSortCompareFn = {}; + this._customTransparentSortCompareFn = {}; + this._renderingGroupInfo = new RenderingGroupInfo(); + this._maintainStateBetweenFrames = false; + this._scene = scene; + for (let i = _RenderingManager.MIN_RENDERINGGROUPS; i < _RenderingManager.MAX_RENDERINGGROUPS; i++) { + this._autoClearDepthStencil[i] = { autoClear: true, depth: true, stencil: true }; + } } /** - * Use this method to simulate a pointer up on a mesh - * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay - * @param pickResult - pickingInfo of the object wished to simulate pointer event on - * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch) - * @param doubleTap - indicates that the pointer up event should be considered as part of a double click (false by default) + * @returns the rendering group with the specified id. + * @param id the id of the rendering group (0 by default) */ - simulatePointerUp(pickResult, pointerEventInit, doubleTap) { - const evt = new PointerEvent("pointerup", pointerEventInit); - evt.inputIndex = PointerInput.Move; - const clickInfo = new _ClickInfo(); - if (doubleTap) { - clickInfo.doubleClick = true; - } else { - clickInfo.singleClick = true; - } - if (this._checkPrePointerObservable(pickResult, evt, PointerEventTypes.POINTERUP)) { + getRenderingGroup(id) { + const renderingGroupId = id || 0; + this._prepareRenderingGroup(renderingGroupId); + return this._renderingGroups[renderingGroupId]; + } + _clearDepthStencilBuffer(depth = true, stencil = true) { + if (this._depthStencilBufferAlreadyCleaned) { return; } - this._processPointerUp(pickResult, evt, clickInfo); + this._scene.getEngine().clear(null, false, depth, stencil); + this._depthStencilBufferAlreadyCleaned = true; } - _processPointerUp(pickResult, evt, clickInfo) { - const scene = this._scene; - if (pickResult == null ? void 0 : pickResult.pickedMesh) { - this._pickedUpMesh = pickResult.pickedMesh; - if (this._pickedDownMesh === this._pickedUpMesh) { - if (scene.onPointerPick) { - scene.onPointerPick(evt, pickResult); - } - if (clickInfo.singleClick && !clickInfo.ignore && scene.onPointerObservable.observers.length > this._cameraObserverCount) { - const type = PointerEventTypes.POINTERPICK; - const pi = new PointerInfo(type, evt, pickResult); - this._setRayOnPointerInfo(pickResult, evt); - scene.onPointerObservable.notifyObservers(pi, type); - } + /** + * Renders the entire managed groups. This is used by the scene or the different render targets. + * @internal + */ + render(customRenderFunction, activeMeshes, renderParticles, renderSprites) { + const info = this._renderingGroupInfo; + info.scene = this._scene; + info.camera = this._scene.activeCamera; + if (this._scene.spriteManagers && renderSprites) { + for (let index = 0; index < this._scene.spriteManagers.length; index++) { + const manager = this._scene.spriteManagers[index]; + this.dispatchSprites(manager); } - const actionManager = pickResult.pickedMesh._getActionManagerForTrigger(); - if (actionManager && !clickInfo.ignore) { - actionManager.processTrigger(7, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); - if (!clickInfo.hasSwiped && clickInfo.singleClick) { - actionManager.processTrigger(1, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); - } - const doubleClickActionManager = pickResult.pickedMesh._getActionManagerForTrigger(6); - if (clickInfo.doubleClick && doubleClickActionManager) { - doubleClickActionManager.processTrigger(6, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); - } + } + for (let index = _RenderingManager.MIN_RENDERINGGROUPS; index < _RenderingManager.MAX_RENDERINGGROUPS; index++) { + this._depthStencilBufferAlreadyCleaned = index === _RenderingManager.MIN_RENDERINGGROUPS; + const renderingGroup = this._renderingGroups[index]; + if (!renderingGroup || renderingGroup._empty) { + continue; } - } else { - if (!clickInfo.ignore) { - for (const step of scene._pointerUpStage) { - pickResult = step.action(this._unTranslatedPointerX, this._unTranslatedPointerY, pickResult, evt, clickInfo.doubleClick); + const renderingGroupMask = 1 << index; + info.renderingGroupId = index; + this._scene.onBeforeRenderingGroupObservable.notifyObservers(info, renderingGroupMask); + if (_RenderingManager.AUTOCLEAR) { + const autoClear = this._useSceneAutoClearSetup ? this._scene.getAutoClearDepthStencilSetup(index) : this._autoClearDepthStencil[index]; + if (autoClear && autoClear.autoClear) { + this._clearDepthStencilBuffer(autoClear.depth, autoClear.stencil); } } - } - if (this._pickedDownMesh && this._pickedDownMesh !== this._pickedUpMesh) { - const pickedDownActionManager = this._pickedDownMesh._getActionManagerForTrigger(16); - if (pickedDownActionManager) { - pickedDownActionManager.processTrigger(16, ActionEvent.CreateNew(this._pickedDownMesh, evt)); - } - } - if (!clickInfo.ignore) { - const pi = new PointerInfo(PointerEventTypes.POINTERUP, evt, pickResult); - this._setRayOnPointerInfo(pickResult, evt); - scene.onPointerObservable.notifyObservers(pi, PointerEventTypes.POINTERUP); - if (scene.onPointerUp) { - scene.onPointerUp(evt, pickResult, PointerEventTypes.POINTERUP); + for (const step of this._scene._beforeRenderingGroupDrawStage) { + step.action(index); } - if (!clickInfo.hasSwiped && !this._skipPointerTap && !this._isMultiTouchGesture) { - let type = 0; - if (clickInfo.singleClick) { - type = PointerEventTypes.POINTERTAP; - } else if (clickInfo.doubleClick) { - type = PointerEventTypes.POINTERDOUBLETAP; - } - if (type) { - const pi2 = new PointerInfo(type, evt, pickResult); - if (scene.onPointerObservable.hasObservers() && scene.onPointerObservable.hasSpecificMask(type)) { - scene.onPointerObservable.notifyObservers(pi2, type); - } - } + renderingGroup.render(customRenderFunction, renderSprites, renderParticles, activeMeshes); + for (const step of this._scene._afterRenderingGroupDrawStage) { + step.action(index); } + this._scene.onAfterRenderingGroupObservable.notifyObservers(info, renderingGroupMask); } } /** - * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down) - * @param pointerId - defines the pointer id to use in a multi-touch scenario (0 by default) - * @returns true if the pointer was captured - */ - isPointerCaptured(pointerId = 0) { - return this._pointerCaptures[pointerId]; - } - /** - * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp - * @param attachUp - defines if you want to attach events to pointerup - * @param attachDown - defines if you want to attach events to pointerdown - * @param attachMove - defines if you want to attach events to pointermove - * @param elementToAttachTo - defines the target DOM element to attach to (will use the canvas by default) + * Resets the different information of the group to prepare a new frame + * @internal */ - attachControl(attachUp = true, attachDown = true, attachMove = true, elementToAttachTo = null) { - const scene = this._scene; - const engine = scene.getEngine(); - if (!elementToAttachTo) { - elementToAttachTo = engine.getInputElement(); - } - if (this._alreadyAttached) { - this.detachControl(); - } - if (elementToAttachTo) { - this._alreadyAttachedTo = elementToAttachTo; + reset() { + if (this.maintainStateBetweenFrames) { + return; } - this._deviceSourceManager = new DeviceSourceManager(engine); - this._initActionManager = (act) => { - if (!this._meshPickProceed) { - const pickResult = scene.skipPointerUpPicking || scene._registeredActions === 0 && !this._checkForPicking() && !scene.onPointerUp ? null : scene.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, scene.pointerUpPredicate, scene.pointerUpFastCheck, scene.cameraToUseForPointers, scene.pointerUpTrianglePredicate); - this._currentPickResult = pickResult; - if (pickResult) { - act = pickResult.hit && pickResult.pickedMesh ? pickResult.pickedMesh._getActionManagerForTrigger() : null; - } - this._meshPickProceed = true; - } - return act; - }; - this._delayedSimpleClick = (btn, clickInfo, cb) => { - if (Date.now() - this._previousStartingPointerTime > _InputManager.DoubleClickDelay && !this._doubleClickOccured || btn !== this._previousButtonPressed) { - this._doubleClickOccured = false; - clickInfo.singleClick = true; - clickInfo.ignore = false; - if (this._delayedClicks[btn]) { - const evt = this._delayedClicks[btn].evt; - const type = PointerEventTypes.POINTERTAP; - const pi = new PointerInfo(type, evt, this._currentPickResult); - if (scene.onPointerObservable.hasObservers() && scene.onPointerObservable.hasSpecificMask(type)) { - scene.onPointerObservable.notifyObservers(pi, type); - } - this._delayedClicks[btn] = null; - } - } - }; - this._initClickEvent = (obs1, obs2, evt, cb) => { - var _a, _b; - const clickInfo = new _ClickInfo(); - this._currentPickResult = null; - let act = null; - let checkPicking = obs1.hasSpecificMask(PointerEventTypes.POINTERPICK) || obs2.hasSpecificMask(PointerEventTypes.POINTERPICK) || obs1.hasSpecificMask(PointerEventTypes.POINTERTAP) || obs2.hasSpecificMask(PointerEventTypes.POINTERTAP) || obs1.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP) || obs2.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP); - if (!checkPicking && AbstractActionManager) { - act = this._initActionManager(act, clickInfo); - if (act) { - checkPicking = act.hasPickTriggers; - } - } - let needToIgnoreNext = false; - if (checkPicking) { - const btn = evt.button; - clickInfo.hasSwiped = this._isPointerSwiping(); - if (!clickInfo.hasSwiped) { - let checkSingleClickImmediately = !_InputManager.ExclusiveDoubleClickMode; - if (!checkSingleClickImmediately) { - checkSingleClickImmediately = !obs1.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP) && !obs2.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP); - if (checkSingleClickImmediately && !AbstractActionManager.HasSpecificTrigger(6)) { - act = this._initActionManager(act, clickInfo); - if (act) { - checkSingleClickImmediately = !act.hasSpecificTrigger(6); - } - } - } - if (checkSingleClickImmediately) { - if (Date.now() - this._previousStartingPointerTime > _InputManager.DoubleClickDelay || btn !== this._previousButtonPressed) { - clickInfo.singleClick = true; - cb(clickInfo, this._currentPickResult); - needToIgnoreNext = true; - } - } else { - const delayedClick = { - evt, - clickInfo, - timeoutId: window.setTimeout(this._delayedSimpleClick.bind(this, btn, clickInfo, cb), _InputManager.DoubleClickDelay) - }; - this._delayedClicks[btn] = delayedClick; - } - let checkDoubleClick = obs1.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP) || obs2.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP); - if (!checkDoubleClick && AbstractActionManager.HasSpecificTrigger(6)) { - act = this._initActionManager(act, clickInfo); - if (act) { - checkDoubleClick = act.hasSpecificTrigger(6); - } - } - if (checkDoubleClick) { - if (btn === this._previousButtonPressed && Date.now() - this._previousStartingPointerTime < _InputManager.DoubleClickDelay && !this._doubleClickOccured) { - if (!clickInfo.hasSwiped && !this._isPointerSwiping()) { - this._previousStartingPointerTime = 0; - this._doubleClickOccured = true; - clickInfo.doubleClick = true; - clickInfo.ignore = false; - if (_InputManager.ExclusiveDoubleClickMode && this._delayedClicks[btn]) { - clearTimeout((_a = this._delayedClicks[btn]) == null ? void 0 : _a.timeoutId); - this._delayedClicks[btn] = null; - } - cb(clickInfo, this._currentPickResult); - } else { - this._doubleClickOccured = false; - this._previousStartingPointerTime = this._startingPointerTime; - this._previousStartingPointerPosition.x = this._startingPointerPosition.x; - this._previousStartingPointerPosition.y = this._startingPointerPosition.y; - this._previousButtonPressed = btn; - if (_InputManager.ExclusiveDoubleClickMode) { - if (this._delayedClicks[btn]) { - clearTimeout((_b = this._delayedClicks[btn]) == null ? void 0 : _b.timeoutId); - this._delayedClicks[btn] = null; - } - cb(clickInfo, this._previousPickResult); - } else { - cb(clickInfo, this._currentPickResult); - } - } - needToIgnoreNext = true; - } else { - this._doubleClickOccured = false; - this._previousStartingPointerTime = this._startingPointerTime; - this._previousStartingPointerPosition.x = this._startingPointerPosition.x; - this._previousStartingPointerPosition.y = this._startingPointerPosition.y; - this._previousButtonPressed = btn; - } - } - } - } - if (!needToIgnoreNext) { - cb(clickInfo, this._currentPickResult); - } - }; - this._onPointerMove = (evt) => { - this._updatePointerPosition(evt); - if (!this._isSwiping && this._swipeButtonPressed !== -1) { - this._isSwiping = Math.abs(this._startingPointerPosition.x - this._pointerX) > _InputManager.DragMovementThreshold || Math.abs(this._startingPointerPosition.y - this._pointerY) > _InputManager.DragMovementThreshold; - } - if (engine.isPointerLock) { - engine._verifyPointerLock(); - } - if (this._checkPrePointerObservable(null, evt, evt.inputIndex >= PointerInput.MouseWheelX && evt.inputIndex <= PointerInput.MouseWheelZ ? PointerEventTypes.POINTERWHEEL : PointerEventTypes.POINTERMOVE)) { - return; - } - if (!scene.cameraToUseForPointers && !scene.activeCamera) { - return; - } - if (scene.skipPointerMovePicking) { - this._processPointerMove(new PickingInfo(), evt); - return; - } - if (!scene.pointerMovePredicate) { - scene.pointerMovePredicate = (mesh) => mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.isEnabled() && (mesh.enablePointerMoveEvents || scene.constantlyUpdateMeshUnderPointer || mesh._getActionManagerForTrigger() !== null) && (!scene.cameraToUseForPointers || (scene.cameraToUseForPointers.layerMask & mesh.layerMask) !== 0); - } - const pickResult = scene._registeredActions > 0 || scene.constantlyUpdateMeshUnderPointer ? this._pickMove(evt) : null; - this._processPointerMove(pickResult, evt); - }; - this._onPointerDown = (evt) => { - var _a; - this._totalPointersPressed++; - this._pickedDownMesh = null; - this._meshPickProceed = false; - if (_InputManager.ExclusiveDoubleClickMode) { - for (let i = 0; i < this._delayedClicks.length; i++) { - if (this._delayedClicks[i]) { - if (evt.button === i) { - clearTimeout((_a = this._delayedClicks[i]) == null ? void 0 : _a.timeoutId); - } else { - const clickInfo = this._delayedClicks[i].clickInfo; - this._doubleClickOccured = false; - clickInfo.singleClick = true; - clickInfo.ignore = false; - const prevEvt = this._delayedClicks[i].evt; - const type = PointerEventTypes.POINTERTAP; - const pi = new PointerInfo(type, prevEvt, this._currentPickResult); - if (scene.onPointerObservable.hasObservers() && scene.onPointerObservable.hasSpecificMask(type)) { - scene.onPointerObservable.notifyObservers(pi, type); - } - this._delayedClicks[i] = null; - } - } - } - } - this._updatePointerPosition(evt); - if (this._swipeButtonPressed === -1) { - this._swipeButtonPressed = evt.button; - } - if (scene.preventDefaultOnPointerDown && elementToAttachTo) { - evt.preventDefault(); - elementToAttachTo.focus(); - } - this._startingPointerPosition.x = this._pointerX; - this._startingPointerPosition.y = this._pointerY; - this._startingPointerTime = Date.now(); - if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERDOWN)) { - return; - } - if (!scene.cameraToUseForPointers && !scene.activeCamera) { - return; - } - this._pointerCaptures[evt.pointerId] = true; - if (!scene.pointerDownPredicate) { - scene.pointerDownPredicate = (mesh) => { - return mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.isEnabled() && (!scene.cameraToUseForPointers || (scene.cameraToUseForPointers.layerMask & mesh.layerMask) !== 0); - }; - } - this._pickedDownMesh = null; - let pickResult; - if (scene.skipPointerDownPicking || scene._registeredActions === 0 && !this._checkForPicking() && !scene.onPointerDown) { - pickResult = new PickingInfo(); - } else { - pickResult = scene.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, scene.pointerDownPredicate, scene.pointerDownFastCheck, scene.cameraToUseForPointers, scene.pointerDownTrianglePredicate); - } - this._processPointerDown(pickResult, evt); - }; - this._onPointerUp = (evt) => { - if (this._totalPointersPressed === 0) { - return; - } - this._totalPointersPressed--; - this._pickedUpMesh = null; - this._meshPickProceed = false; - this._updatePointerPosition(evt); - if (scene.preventDefaultOnPointerUp && elementToAttachTo) { - evt.preventDefault(); - elementToAttachTo.focus(); - } - this._initClickEvent(scene.onPrePointerObservable, scene.onPointerObservable, evt, (clickInfo, pickResult) => { - if (scene.onPrePointerObservable.hasObservers()) { - this._skipPointerTap = false; - if (!clickInfo.ignore) { - if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERUP)) { - if (this._swipeButtonPressed === evt.button) { - this._isSwiping = false; - this._swipeButtonPressed = -1; - } - if (evt.buttons === 0) { - this._pointerCaptures[evt.pointerId] = false; - } - return; - } - if (!clickInfo.hasSwiped) { - if (clickInfo.singleClick && scene.onPrePointerObservable.hasSpecificMask(PointerEventTypes.POINTERTAP)) { - if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERTAP)) { - this._skipPointerTap = true; - } - } - if (clickInfo.doubleClick && scene.onPrePointerObservable.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP)) { - if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERDOUBLETAP)) { - this._skipPointerTap = true; - } - } - } - } - } - if (!this._pointerCaptures[evt.pointerId]) { - if (this._swipeButtonPressed === evt.button) { - this._isSwiping = false; - this._swipeButtonPressed = -1; - } - return; - } - if (evt.buttons === 0) { - this._pointerCaptures[evt.pointerId] = false; - } - if (!scene.cameraToUseForPointers && !scene.activeCamera) { - return; - } - if (!scene.pointerUpPredicate) { - scene.pointerUpPredicate = (mesh) => { - return mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.isEnabled() && (!scene.cameraToUseForPointers || (scene.cameraToUseForPointers.layerMask & mesh.layerMask) !== 0); - }; - } - if (!this._meshPickProceed && (AbstractActionManager && AbstractActionManager.HasTriggers || this._checkForPicking() || scene.onPointerUp)) { - this._initActionManager(null, clickInfo); - } - if (!pickResult) { - pickResult = this._currentPickResult; - } - this._processPointerUp(pickResult, evt, clickInfo); - this._previousPickResult = this._currentPickResult; - if (this._swipeButtonPressed === evt.button) { - this._isSwiping = false; - this._swipeButtonPressed = -1; - } - }); - }; - this._onKeyDown = (evt) => { - const type = KeyboardEventTypes.KEYDOWN; - if (scene.onPreKeyboardObservable.hasObservers()) { - const pi = new KeyboardInfoPre(type, evt); - scene.onPreKeyboardObservable.notifyObservers(pi, type); - if (pi.skipOnKeyboardObservable) { - return; - } - } - if (scene.onKeyboardObservable.hasObservers()) { - const pi = new KeyboardInfo(type, evt); - scene.onKeyboardObservable.notifyObservers(pi, type); - } - if (scene.actionManager) { - scene.actionManager.processTrigger(14, ActionEvent.CreateNewFromScene(scene, evt)); - } - }; - this._onKeyUp = (evt) => { - const type = KeyboardEventTypes.KEYUP; - if (scene.onPreKeyboardObservable.hasObservers()) { - const pi = new KeyboardInfoPre(type, evt); - scene.onPreKeyboardObservable.notifyObservers(pi, type); - if (pi.skipOnKeyboardObservable) { - return; - } - } - if (scene.onKeyboardObservable.hasObservers()) { - const pi = new KeyboardInfo(type, evt); - scene.onKeyboardObservable.notifyObservers(pi, type); - } - if (scene.actionManager) { - scene.actionManager.processTrigger(15, ActionEvent.CreateNewFromScene(scene, evt)); - } - }; - this._deviceSourceManager.onDeviceConnectedObservable.add((deviceSource) => { - if (deviceSource.deviceType === DeviceType.Mouse) { - deviceSource.onInputChangedObservable.add((eventData) => { - if (eventData.inputIndex === PointerInput.LeftClick || eventData.inputIndex === PointerInput.MiddleClick || eventData.inputIndex === PointerInput.RightClick || eventData.inputIndex === PointerInput.BrowserBack || eventData.inputIndex === PointerInput.BrowserForward) { - if (attachDown && deviceSource.getInput(eventData.inputIndex) === 1) { - this._onPointerDown(eventData); - } else if (attachUp && deviceSource.getInput(eventData.inputIndex) === 0) { - this._onPointerUp(eventData); - } - } else if (attachMove) { - if (eventData.inputIndex === PointerInput.Move) { - this._onPointerMove(eventData); - } else if (eventData.inputIndex === PointerInput.MouseWheelX || eventData.inputIndex === PointerInput.MouseWheelY || eventData.inputIndex === PointerInput.MouseWheelZ) { - this._onPointerMove(eventData); - } - } - }); - } else if (deviceSource.deviceType === DeviceType.Touch) { - deviceSource.onInputChangedObservable.add((eventData) => { - if (eventData.inputIndex === PointerInput.LeftClick) { - if (attachDown && deviceSource.getInput(eventData.inputIndex) === 1) { - this._onPointerDown(eventData); - if (this._totalPointersPressed > 1) { - this._isMultiTouchGesture = true; - } - } else if (attachUp && deviceSource.getInput(eventData.inputIndex) === 0) { - this._onPointerUp(eventData); - if (this._totalPointersPressed === 0) { - this._isMultiTouchGesture = false; - } - } - } - if (attachMove && eventData.inputIndex === PointerInput.Move) { - this._onPointerMove(eventData); - } - }); - } else if (deviceSource.deviceType === DeviceType.Keyboard) { - deviceSource.onInputChangedObservable.add((eventData) => { - if (eventData.type === "keydown") { - this._onKeyDown(eventData); - } else if (eventData.type === "keyup") { - this._onKeyUp(eventData); - } - }); - } - }); - this._alreadyAttached = true; - } - /** - * Detaches all event handlers - */ - detachControl() { - if (this._alreadyAttached) { - this._deviceSourceManager.dispose(); - this._deviceSourceManager = null; - if (this._alreadyAttachedTo && !this._scene.doNotHandleCursors) { - this._alreadyAttachedTo.style.cursor = this._scene.defaultCursor; + for (let index = _RenderingManager.MIN_RENDERINGGROUPS; index < _RenderingManager.MAX_RENDERINGGROUPS; index++) { + const renderingGroup = this._renderingGroups[index]; + if (renderingGroup) { + renderingGroup.prepare(); } - this._alreadyAttached = false; - this._alreadyAttachedTo = null; } } /** - * Force the value of meshUnderPointer - * @param mesh - defines the mesh to use - * @param pointerId - optional pointer id when using more than one pointer. Defaults to 0 - * @param pickResult - optional pickingInfo data used to find mesh - * @param evt - optional pointer event + * Resets the sprites information of the group to prepare a new frame + * @internal */ - setPointerOverMesh(mesh, pointerId = 0, pickResult, evt) { - if (this._meshUnderPointerId[pointerId] === mesh && (!mesh || !mesh._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting)) { + resetSprites() { + if (this.maintainStateBetweenFrames) { return; } - const underPointerMesh = this._meshUnderPointerId[pointerId]; - let actionManager; - if (underPointerMesh) { - actionManager = underPointerMesh._getActionManagerForTrigger(10); - if (actionManager) { - actionManager.processTrigger(10, ActionEvent.CreateNew(underPointerMesh, evt, { pointerId })); - } - } - if (mesh) { - this._meshUnderPointerId[pointerId] = mesh; - this._pointerOverMesh = mesh; - actionManager = mesh._getActionManagerForTrigger(9); - if (actionManager) { - actionManager.processTrigger(9, ActionEvent.CreateNew(mesh, evt, { pointerId, pickResult })); + for (let index = _RenderingManager.MIN_RENDERINGGROUPS; index < _RenderingManager.MAX_RENDERINGGROUPS; index++) { + const renderingGroup = this._renderingGroups[index]; + if (renderingGroup) { + renderingGroup.prepareSprites(); } - } else { - delete this._meshUnderPointerId[pointerId]; - this._pointerOverMesh = null; } } /** - * Gets the mesh under the pointer - * @returns a Mesh or null if no mesh is under the pointer + * Dispose and release the group and its associated resources. + * @internal */ - getPointerOverMesh() { - return this.meshUnderPointer; + dispose() { + this.freeRenderingGroups(); + this._renderingGroups.length = 0; + this._renderingGroupInfo = null; } /** - * @param mesh - Mesh to invalidate - * @internal + * Clear the info related to rendering groups preventing retention points during dispose. */ - _invalidateMesh(mesh) { - if (this._pointerOverMesh === mesh) { - this._pointerOverMesh = null; - } - if (this._pickedDownMesh === mesh) { - this._pickedDownMesh = null; + freeRenderingGroups() { + for (let index = _RenderingManager.MIN_RENDERINGGROUPS; index < _RenderingManager.MAX_RENDERINGGROUPS; index++) { + const renderingGroup = this._renderingGroups[index]; + if (renderingGroup) { + renderingGroup.dispose(); + } } - if (this._pickedUpMesh === mesh) { - this._pickedUpMesh = null; - } - for (const pointerId in this._meshUnderPointerId) { - if (this._meshUnderPointerId[pointerId] === mesh) { - delete this._meshUnderPointerId[pointerId]; - } - } - } -}; -InputManager.DragMovementThreshold = 10; -InputManager.LongPressDelay = 500; -InputManager.DoubleClickDelay = 300; -InputManager.ExclusiveDoubleClickMode = false; - -// node_modules/@babylonjs/core/Misc/uniqueIdGenerator.js -var UniqueIdGenerator = class { - /** - * Gets an unique (relatively to the current scene) Id - */ - static get UniqueId() { - const result = this._UniqueIdCounter; - this._UniqueIdCounter++; - return result; } -}; -UniqueIdGenerator._UniqueIdCounter = 1; - -// node_modules/@babylonjs/core/Lights/lightConstants.js -var LightConstants = class { - /** - * Sort function to order lights for rendering. - * @param a First Light object to compare to second. - * @param b Second Light object to compare first. - * @returns -1 to reduce's a's index relative to be, 0 for no change, 1 to increase a's index relative to b. - */ - static CompareLightsPriority(a, b) { - if (a.shadowEnabled !== b.shadowEnabled) { - return (b.shadowEnabled ? 1 : 0) - (a.shadowEnabled ? 1 : 0); + _prepareRenderingGroup(renderingGroupId) { + if (this._renderingGroups[renderingGroupId] === void 0) { + this._renderingGroups[renderingGroupId] = new RenderingGroup(renderingGroupId, this._scene, this._customOpaqueSortCompareFn[renderingGroupId], this._customAlphaTestSortCompareFn[renderingGroupId], this._customTransparentSortCompareFn[renderingGroupId]); } - return b.renderPriority - a.renderPriority; - } -}; -LightConstants.FALLOFF_DEFAULT = 0; -LightConstants.FALLOFF_PHYSICAL = 1; -LightConstants.FALLOFF_GLTF = 2; -LightConstants.FALLOFF_STANDARD = 3; -LightConstants.LIGHTMAP_DEFAULT = 0; -LightConstants.LIGHTMAP_SPECULAR = 1; -LightConstants.LIGHTMAP_SHADOWSONLY = 2; -LightConstants.INTENSITYMODE_AUTOMATIC = 0; -LightConstants.INTENSITYMODE_LUMINOUSPOWER = 1; -LightConstants.INTENSITYMODE_LUMINOUSINTENSITY = 2; -LightConstants.INTENSITYMODE_ILLUMINANCE = 3; -LightConstants.INTENSITYMODE_LUMINANCE = 4; -LightConstants.LIGHTTYPEID_POINTLIGHT = 0; -LightConstants.LIGHTTYPEID_DIRECTIONALLIGHT = 1; -LightConstants.LIGHTTYPEID_SPOTLIGHT = 2; -LightConstants.LIGHTTYPEID_HEMISPHERICLIGHT = 3; - -// node_modules/@babylonjs/core/Inputs/pointerPickingConfiguration.js -var PointerPickingConfiguration = class { - constructor() { - this.pointerDownFastCheck = false; - this.pointerUpFastCheck = false; - this.pointerMoveFastCheck = false; - this.skipPointerMovePicking = false; - this.skipPointerDownPicking = false; - this.skipPointerUpPicking = false; - } -}; - -// node_modules/@babylonjs/core/scene.js -var ScenePerformancePriority; -(function(ScenePerformancePriority2) { - ScenePerformancePriority2[ScenePerformancePriority2["BackwardCompatible"] = 0] = "BackwardCompatible"; - ScenePerformancePriority2[ScenePerformancePriority2["Intermediate"] = 1] = "Intermediate"; - ScenePerformancePriority2[ScenePerformancePriority2["Aggressive"] = 2] = "Aggressive"; -})(ScenePerformancePriority || (ScenePerformancePriority = {})); -var Scene = class _Scene extends AbstractScene { - // eslint-disable-next-line jsdoc/require-returns-check - /** - * Factory used to create the default material. - * @param scene The scene to create the material for - * @returns The default material - */ - static DefaultMaterialFactory(scene) { - throw _WarnImport("StandardMaterial"); - } - // eslint-disable-next-line jsdoc/require-returns-check - /** - * Factory used to create the a collision coordinator. - * @returns The collision coordinator - */ - static CollisionCoordinatorFactory() { - throw _WarnImport("DefaultCollisionCoordinator"); - } - /** - * Texture used in all pbr material as the reflection texture. - * As in the majority of the scene they are the same (exception for multi room and so on), - * this is easier to reference from here than from all the materials. - */ - get environmentTexture() { - return this._environmentTexture; } /** - * Texture used in all pbr material as the reflection texture. - * As in the majority of the scene they are the same (exception for multi room and so on), - * this is easier to set here than in all the materials. + * Add a sprite manager to the rendering manager in order to render it this frame. + * @param spriteManager Define the sprite manager to render */ - set environmentTexture(value) { - if (this._environmentTexture === value) { + dispatchSprites(spriteManager) { + if (this.maintainStateBetweenFrames && spriteManager._wasDispatched) { return; } - this._environmentTexture = value; - this.markAllMaterialsAsDirty(1); - } - /** - * Default image processing configuration used either in the rendering - * Forward main pass or through the imageProcessingPostProcess if present. - * As in the majority of the scene they are the same (exception for multi camera), - * this is easier to reference from here than from all the materials and post process. - * - * No setter as we it is a shared configuration, you can set the values instead. - */ - get imageProcessingConfiguration() { - return this._imageProcessingConfiguration; + spriteManager._wasDispatched = true; + this.getRenderingGroup(spriteManager.renderingGroupId).dispatchSprites(spriteManager); } /** - * Gets or sets a value indicating how to treat performance relatively to ease of use and backward compatibility + * Add a particle system to the rendering manager in order to render it this frame. + * @param particleSystem Define the particle system to render */ - get performancePriority() { - return this._performancePriority; - } - set performancePriority(value) { - if (value === this._performancePriority) { + dispatchParticles(particleSystem) { + if (this.maintainStateBetweenFrames && particleSystem._wasDispatched) { return; } - this._performancePriority = value; - switch (value) { - case ScenePerformancePriority.BackwardCompatible: - this.skipFrustumClipping = false; - this._renderingManager.maintainStateBetweenFrames = false; - this.skipPointerMovePicking = false; - this.autoClear = true; - break; - case ScenePerformancePriority.Intermediate: - this.skipFrustumClipping = false; - this._renderingManager.maintainStateBetweenFrames = false; - this.skipPointerMovePicking = true; - this.autoClear = false; - break; - case ScenePerformancePriority.Aggressive: - this.skipFrustumClipping = true; - this._renderingManager.maintainStateBetweenFrames = true; - this.skipPointerMovePicking = true; - this.autoClear = false; - break; - } - this.onScenePerformancePriorityChangedObservable.notifyObservers(value); + particleSystem._wasDispatched = true; + this.getRenderingGroup(particleSystem.renderingGroupId).dispatchParticles(particleSystem); } /** - * Gets or sets a boolean indicating if all rendering must be done in wireframe + * Add a submesh to the manager in order to render it this frame + * @param subMesh The submesh to dispatch + * @param mesh Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance. + * @param material Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance. */ - set forceWireframe(value) { - if (this._forceWireframe === value) { - return; + dispatch(subMesh, mesh, material) { + if (mesh === void 0) { + mesh = subMesh.getMesh(); } - this._forceWireframe = value; - this.markAllMaterialsAsDirty(16); - } - get forceWireframe() { - return this._forceWireframe; - } - /** - * Gets or sets a boolean indicating if we should skip the frustum clipping part of the active meshes selection - */ - set skipFrustumClipping(value) { - if (this._skipFrustumClipping === value) { + if (this.maintainStateBetweenFrames && subMesh._wasDispatched) { return; } - this._skipFrustumClipping = value; - } - get skipFrustumClipping() { - return this._skipFrustumClipping; + subMesh._wasDispatched = true; + this.getRenderingGroup(mesh.renderingGroupId).dispatch(subMesh, mesh, material); } /** - * Gets or sets a boolean indicating if all rendering must be done in point cloud + * Overrides the default sort function applied in the rendering group to prepare the meshes. + * This allowed control for front to back rendering or reversely depending of the special needs. + * + * @param renderingGroupId The rendering group id corresponding to its index + * @param opaqueSortCompareFn The opaque queue comparison function use to sort. + * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort. + * @param transparentSortCompareFn The transparent queue comparison function use to sort. */ - set forcePointsCloud(value) { - if (this._forcePointsCloud === value) { - return; + setRenderingOrder(renderingGroupId, opaqueSortCompareFn = null, alphaTestSortCompareFn = null, transparentSortCompareFn = null) { + this._customOpaqueSortCompareFn[renderingGroupId] = opaqueSortCompareFn; + this._customAlphaTestSortCompareFn[renderingGroupId] = alphaTestSortCompareFn; + this._customTransparentSortCompareFn[renderingGroupId] = transparentSortCompareFn; + if (this._renderingGroups[renderingGroupId]) { + const group = this._renderingGroups[renderingGroupId]; + group.opaqueSortCompareFn = this._customOpaqueSortCompareFn[renderingGroupId]; + group.alphaTestSortCompareFn = this._customAlphaTestSortCompareFn[renderingGroupId]; + group.transparentSortCompareFn = this._customTransparentSortCompareFn[renderingGroupId]; } - this._forcePointsCloud = value; - this.markAllMaterialsAsDirty(16); - } - get forcePointsCloud() { - return this._forcePointsCloud; } /** - * Gets or sets the animation properties override + * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups. + * + * @param renderingGroupId The rendering group id corresponding to its index + * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true. + * @param depth Automatically clears depth between groups if true and autoClear is true. + * @param stencil Automatically clears stencil between groups if true and autoClear is true. */ - get animationPropertiesOverride() { - return this._animationPropertiesOverride; - } - set animationPropertiesOverride(value) { - this._animationPropertiesOverride = value; - } - /** Sets a function to be executed when this scene is disposed. */ - set onDispose(callback) { - if (this._onDisposeObserver) { - this.onDisposeObservable.remove(this._onDisposeObserver); - } - this._onDisposeObserver = this.onDisposeObservable.add(callback); - } - /** Sets a function to be executed before rendering this scene */ - set beforeRender(callback) { - if (this._onBeforeRenderObserver) { - this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver); - } - if (callback) { - this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback); - } - } - /** Sets a function to be executed after rendering this scene */ - set afterRender(callback) { - if (this._onAfterRenderObserver) { - this.onAfterRenderObservable.remove(this._onAfterRenderObserver); - } - if (callback) { - this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback); - } - } - /** Sets a function to be executed before rendering a camera*/ - set beforeCameraRender(callback) { - if (this._onBeforeCameraRenderObserver) { - this.onBeforeCameraRenderObservable.remove(this._onBeforeCameraRenderObserver); - } - this._onBeforeCameraRenderObserver = this.onBeforeCameraRenderObservable.add(callback); - } - /** Sets a function to be executed after rendering a camera*/ - set afterCameraRender(callback) { - if (this._onAfterCameraRenderObserver) { - this.onAfterCameraRenderObservable.remove(this._onAfterCameraRenderObserver); - } - this._onAfterCameraRenderObserver = this.onAfterCameraRenderObservable.add(callback); + setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil, depth = true, stencil = true) { + this._autoClearDepthStencil[renderingGroupId] = { + autoClear: autoClearDepthStencil, + depth, + stencil + }; } /** - * Gets or sets a predicate used to select candidate meshes for a pointer down event + * Gets the current auto clear configuration for one rendering group of the rendering + * manager. + * @param index the rendering group index to get the information for + * @returns The auto clear setup for the requested rendering group */ - get pointerDownPredicate() { - return this._pointerPickingConfiguration.pointerDownPredicate; - } - set pointerDownPredicate(value) { - this._pointerPickingConfiguration.pointerDownPredicate = value; + getAutoClearDepthStencilSetup(index) { + return this._autoClearDepthStencil[index]; } +}; +RenderingManager.MAX_RENDERINGGROUPS = 4; +RenderingManager.MIN_RENDERINGGROUPS = 0; +RenderingManager.AUTOCLEAR = true; + +// node_modules/@babylonjs/core/sceneComponent.js +var SceneComponentConstants = class { +}; +SceneComponentConstants.NAME_EFFECTLAYER = "EffectLayer"; +SceneComponentConstants.NAME_LAYER = "Layer"; +SceneComponentConstants.NAME_LENSFLARESYSTEM = "LensFlareSystem"; +SceneComponentConstants.NAME_BOUNDINGBOXRENDERER = "BoundingBoxRenderer"; +SceneComponentConstants.NAME_PARTICLESYSTEM = "ParticleSystem"; +SceneComponentConstants.NAME_GAMEPAD = "Gamepad"; +SceneComponentConstants.NAME_SIMPLIFICATIONQUEUE = "SimplificationQueue"; +SceneComponentConstants.NAME_GEOMETRYBUFFERRENDERER = "GeometryBufferRenderer"; +SceneComponentConstants.NAME_PREPASSRENDERER = "PrePassRenderer"; +SceneComponentConstants.NAME_DEPTHRENDERER = "DepthRenderer"; +SceneComponentConstants.NAME_DEPTHPEELINGRENDERER = "DepthPeelingRenderer"; +SceneComponentConstants.NAME_POSTPROCESSRENDERPIPELINEMANAGER = "PostProcessRenderPipelineManager"; +SceneComponentConstants.NAME_SPRITE = "Sprite"; +SceneComponentConstants.NAME_SUBSURFACE = "SubSurface"; +SceneComponentConstants.NAME_OUTLINERENDERER = "Outline"; +SceneComponentConstants.NAME_PROCEDURALTEXTURE = "ProceduralTexture"; +SceneComponentConstants.NAME_SHADOWGENERATOR = "ShadowGenerator"; +SceneComponentConstants.NAME_OCTREE = "Octree"; +SceneComponentConstants.NAME_PHYSICSENGINE = "PhysicsEngine"; +SceneComponentConstants.NAME_AUDIO = "Audio"; +SceneComponentConstants.NAME_FLUIDRENDERER = "FluidRenderer"; +SceneComponentConstants.STEP_ISREADYFORMESH_EFFECTLAYER = 0; +SceneComponentConstants.STEP_BEFOREEVALUATEACTIVEMESH_BOUNDINGBOXRENDERER = 0; +SceneComponentConstants.STEP_EVALUATESUBMESH_BOUNDINGBOXRENDERER = 0; +SceneComponentConstants.STEP_PREACTIVEMESH_BOUNDINGBOXRENDERER = 0; +SceneComponentConstants.STEP_CAMERADRAWRENDERTARGET_EFFECTLAYER = 1; +SceneComponentConstants.STEP_BEFORECAMERADRAW_PREPASS = 0; +SceneComponentConstants.STEP_BEFORECAMERADRAW_EFFECTLAYER = 1; +SceneComponentConstants.STEP_BEFORECAMERADRAW_LAYER = 2; +SceneComponentConstants.STEP_BEFORERENDERTARGETDRAW_PREPASS = 0; +SceneComponentConstants.STEP_BEFORERENDERTARGETDRAW_LAYER = 1; +SceneComponentConstants.STEP_BEFORERENDERINGMESH_PREPASS = 0; +SceneComponentConstants.STEP_BEFORERENDERINGMESH_OUTLINE = 1; +SceneComponentConstants.STEP_AFTERRENDERINGMESH_PREPASS = 0; +SceneComponentConstants.STEP_AFTERRENDERINGMESH_OUTLINE = 1; +SceneComponentConstants.STEP_AFTERRENDERINGGROUPDRAW_EFFECTLAYER_DRAW = 0; +SceneComponentConstants.STEP_AFTERRENDERINGGROUPDRAW_BOUNDINGBOXRENDERER = 1; +SceneComponentConstants.STEP_BEFORECAMERAUPDATE_SIMPLIFICATIONQUEUE = 0; +SceneComponentConstants.STEP_BEFORECAMERAUPDATE_GAMEPAD = 1; +SceneComponentConstants.STEP_BEFORECLEAR_PROCEDURALTEXTURE = 0; +SceneComponentConstants.STEP_BEFORECLEAR_PREPASS = 1; +SceneComponentConstants.STEP_BEFORERENDERTARGETCLEAR_PREPASS = 0; +SceneComponentConstants.STEP_AFTERRENDERTARGETDRAW_PREPASS = 0; +SceneComponentConstants.STEP_AFTERRENDERTARGETDRAW_LAYER = 1; +SceneComponentConstants.STEP_AFTERCAMERADRAW_PREPASS = 0; +SceneComponentConstants.STEP_AFTERCAMERADRAW_EFFECTLAYER = 1; +SceneComponentConstants.STEP_AFTERCAMERADRAW_LENSFLARESYSTEM = 2; +SceneComponentConstants.STEP_AFTERCAMERADRAW_EFFECTLAYER_DRAW = 3; +SceneComponentConstants.STEP_AFTERCAMERADRAW_LAYER = 4; +SceneComponentConstants.STEP_AFTERCAMERADRAW_FLUIDRENDERER = 5; +SceneComponentConstants.STEP_AFTERCAMERAPOSTPROCESS_LAYER = 0; +SceneComponentConstants.STEP_AFTERRENDERTARGETPOSTPROCESS_LAYER = 0; +SceneComponentConstants.STEP_AFTERRENDER_AUDIO = 0; +SceneComponentConstants.STEP_GATHERRENDERTARGETS_DEPTHRENDERER = 0; +SceneComponentConstants.STEP_GATHERRENDERTARGETS_GEOMETRYBUFFERRENDERER = 1; +SceneComponentConstants.STEP_GATHERRENDERTARGETS_SHADOWGENERATOR = 2; +SceneComponentConstants.STEP_GATHERRENDERTARGETS_POSTPROCESSRENDERPIPELINEMANAGER = 3; +SceneComponentConstants.STEP_GATHERACTIVECAMERARENDERTARGETS_DEPTHRENDERER = 0; +SceneComponentConstants.STEP_GATHERACTIVECAMERARENDERTARGETS_FLUIDRENDERER = 1; +SceneComponentConstants.STEP_POINTERMOVE_SPRITE = 0; +SceneComponentConstants.STEP_POINTERDOWN_SPRITE = 0; +SceneComponentConstants.STEP_POINTERUP_SPRITE = 0; +var Stage = class _Stage extends Array { /** - * Gets or sets a predicate used to select candidate meshes for a pointer up event + * Hide ctor from the rest of the world. + * @param items The items to add. */ - get pointerUpPredicate() { - return this._pointerPickingConfiguration.pointerUpPredicate; - } - set pointerUpPredicate(value) { - this._pointerPickingConfiguration.pointerUpPredicate = value; + constructor(items) { + super(...items); } /** - * Gets or sets a predicate used to select candidate meshes for a pointer move event + * Creates a new Stage. + * @returns A new instance of a Stage */ - get pointerMovePredicate() { - return this._pointerPickingConfiguration.pointerMovePredicate; - } - set pointerMovePredicate(value) { - this._pointerPickingConfiguration.pointerMovePredicate = value; + static Create() { + return Object.create(_Stage.prototype); } /** - * Gets or sets a predicate used to select candidate meshes for a pointer down event + * Registers a step in an ordered way in the targeted stage. + * @param index Defines the position to register the step in + * @param component Defines the component attached to the step + * @param action Defines the action to launch during the step */ - get pointerDownFastCheck() { - return this._pointerPickingConfiguration.pointerDownFastCheck; - } - set pointerDownFastCheck(value) { - this._pointerPickingConfiguration.pointerDownFastCheck = value; + registerStep(index, component, action) { + let i = 0; + let maxIndex = Number.MAX_VALUE; + for (; i < this.length; i++) { + const step = this[i]; + maxIndex = step.index; + if (index < maxIndex) { + break; + } + } + this.splice(i, 0, { index, component, action: action.bind(component) }); } /** - * Gets or sets a predicate used to select candidate meshes for a pointer up event + * Clears all the steps from the stage. */ - get pointerUpFastCheck() { - return this._pointerPickingConfiguration.pointerUpFastCheck; + clear() { + this.length = 0; } - set pointerUpFastCheck(value) { - this._pointerPickingConfiguration.pointerUpFastCheck = value; +}; + +// node_modules/@babylonjs/core/Actions/abstractActionManager.js +var AbstractActionManager = class _AbstractActionManager { + constructor() { + this.hoverCursor = ""; + this.actions = []; + this.isRecursive = false; } /** - * Gets or sets a predicate used to select candidate meshes for a pointer move event - */ - get pointerMoveFastCheck() { - return this._pointerPickingConfiguration.pointerMoveFastCheck; - } - set pointerMoveFastCheck(value) { - this._pointerPickingConfiguration.pointerMoveFastCheck = value; + * Does exist one action manager with at least one trigger + **/ + static get HasTriggers() { + for (const t in _AbstractActionManager.Triggers) { + if (Object.prototype.hasOwnProperty.call(_AbstractActionManager.Triggers, t)) { + return true; + } + } + return false; } /** - * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer move event occurs. - */ - get skipPointerMovePicking() { - return this._pointerPickingConfiguration.skipPointerMovePicking; + * Does exist one action manager with at least one pick trigger + **/ + static get HasPickTriggers() { + for (const t in _AbstractActionManager.Triggers) { + if (Object.prototype.hasOwnProperty.call(_AbstractActionManager.Triggers, t)) { + const tAsInt = parseInt(t); + if (tAsInt >= 1 && tAsInt <= 7) { + return true; + } + } + } + return false; } - set skipPointerMovePicking(value) { - this._pointerPickingConfiguration.skipPointerMovePicking = value; + /** + * Does exist one action manager that handles actions of a given trigger + * @param trigger defines the trigger to be tested + * @returns a boolean indicating whether the trigger is handled by at least one action manager + **/ + static HasSpecificTrigger(trigger) { + for (const t in _AbstractActionManager.Triggers) { + if (Object.prototype.hasOwnProperty.call(_AbstractActionManager.Triggers, t)) { + const tAsInt = parseInt(t); + if (tAsInt === trigger) { + return true; + } + } + } + return false; } +}; +AbstractActionManager.Triggers = {}; + +// node_modules/@babylonjs/core/Events/keyboardEvents.js +var KeyboardEventTypes = class { +}; +KeyboardEventTypes.KEYDOWN = 1; +KeyboardEventTypes.KEYUP = 2; +var KeyboardInfo = class { /** - * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer down event occurs. + * Instantiates a new keyboard info. + * This class is used to store keyboard related info for the onKeyboardObservable event. + * @param type Defines the type of event (KeyboardEventTypes) + * @param event Defines the related dom event */ - get skipPointerDownPicking() { - return this._pointerPickingConfiguration.skipPointerDownPicking; - } - set skipPointerDownPicking(value) { - this._pointerPickingConfiguration.skipPointerDownPicking = value; + constructor(type, event) { + this.type = type; + this.event = event; } +}; +var KeyboardInfoPre = class extends KeyboardInfo { /** - * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer up event occurs. Off by default. + * Defines whether the engine should skip the next onKeyboardObservable associated to this pre. + * @deprecated use skipOnKeyboardObservable property instead */ - get skipPointerUpPicking() { - return this._pointerPickingConfiguration.skipPointerUpPicking; + get skipOnPointerObservable() { + return this.skipOnKeyboardObservable; } - set skipPointerUpPicking(value) { - this._pointerPickingConfiguration.skipPointerUpPicking = value; + set skipOnPointerObservable(value) { + this.skipOnKeyboardObservable = value; } /** - * Gets the pointer coordinates without any translation (ie. straight out of the pointer event) + * Instantiates a new keyboard pre info. + * This class is used to store keyboard related info for the onPreKeyboardObservable event. + * @param type Defines the type of event (KeyboardEventTypes) + * @param event Defines the related dom event */ - get unTranslatedPointer() { - return this._inputManager.unTranslatedPointer; - } - /** - * Gets or sets the distance in pixel that you have to move to prevent some events. Default is 10 pixels - */ - static get DragMovementThreshold() { - return InputManager.DragMovementThreshold; - } - static set DragMovementThreshold(value) { - InputManager.DragMovementThreshold = value; + constructor(type, event) { + super(type, event); + this.type = type; + this.event = event; + this.skipOnKeyboardObservable = false; } +}; + +// node_modules/@babylonjs/core/DeviceInput/InputDevices/deviceEnums.js +var DeviceType; +(function(DeviceType2) { + DeviceType2[DeviceType2["Generic"] = 0] = "Generic"; + DeviceType2[DeviceType2["Keyboard"] = 1] = "Keyboard"; + DeviceType2[DeviceType2["Mouse"] = 2] = "Mouse"; + DeviceType2[DeviceType2["Touch"] = 3] = "Touch"; + DeviceType2[DeviceType2["DualShock"] = 4] = "DualShock"; + DeviceType2[DeviceType2["Xbox"] = 5] = "Xbox"; + DeviceType2[DeviceType2["Switch"] = 6] = "Switch"; + DeviceType2[DeviceType2["DualSense"] = 7] = "DualSense"; +})(DeviceType || (DeviceType = {})); +var PointerInput; +(function(PointerInput2) { + PointerInput2[PointerInput2["Horizontal"] = 0] = "Horizontal"; + PointerInput2[PointerInput2["Vertical"] = 1] = "Vertical"; + PointerInput2[PointerInput2["LeftClick"] = 2] = "LeftClick"; + PointerInput2[PointerInput2["MiddleClick"] = 3] = "MiddleClick"; + PointerInput2[PointerInput2["RightClick"] = 4] = "RightClick"; + PointerInput2[PointerInput2["BrowserBack"] = 5] = "BrowserBack"; + PointerInput2[PointerInput2["BrowserForward"] = 6] = "BrowserForward"; + PointerInput2[PointerInput2["MouseWheelX"] = 7] = "MouseWheelX"; + PointerInput2[PointerInput2["MouseWheelY"] = 8] = "MouseWheelY"; + PointerInput2[PointerInput2["MouseWheelZ"] = 9] = "MouseWheelZ"; + PointerInput2[PointerInput2["Move"] = 12] = "Move"; +})(PointerInput || (PointerInput = {})); +var NativePointerInput; +(function(NativePointerInput2) { + NativePointerInput2[NativePointerInput2["Horizontal"] = 0] = "Horizontal"; + NativePointerInput2[NativePointerInput2["Vertical"] = 1] = "Vertical"; + NativePointerInput2[NativePointerInput2["LeftClick"] = 2] = "LeftClick"; + NativePointerInput2[NativePointerInput2["MiddleClick"] = 3] = "MiddleClick"; + NativePointerInput2[NativePointerInput2["RightClick"] = 4] = "RightClick"; + NativePointerInput2[NativePointerInput2["BrowserBack"] = 5] = "BrowserBack"; + NativePointerInput2[NativePointerInput2["BrowserForward"] = 6] = "BrowserForward"; + NativePointerInput2[NativePointerInput2["MouseWheelX"] = 7] = "MouseWheelX"; + NativePointerInput2[NativePointerInput2["MouseWheelY"] = 8] = "MouseWheelY"; + NativePointerInput2[NativePointerInput2["MouseWheelZ"] = 9] = "MouseWheelZ"; + NativePointerInput2[NativePointerInput2["DeltaHorizontal"] = 10] = "DeltaHorizontal"; + NativePointerInput2[NativePointerInput2["DeltaVertical"] = 11] = "DeltaVertical"; +})(NativePointerInput || (NativePointerInput = {})); +var DualShockInput; +(function(DualShockInput2) { + DualShockInput2[DualShockInput2["Cross"] = 0] = "Cross"; + DualShockInput2[DualShockInput2["Circle"] = 1] = "Circle"; + DualShockInput2[DualShockInput2["Square"] = 2] = "Square"; + DualShockInput2[DualShockInput2["Triangle"] = 3] = "Triangle"; + DualShockInput2[DualShockInput2["L1"] = 4] = "L1"; + DualShockInput2[DualShockInput2["R1"] = 5] = "R1"; + DualShockInput2[DualShockInput2["L2"] = 6] = "L2"; + DualShockInput2[DualShockInput2["R2"] = 7] = "R2"; + DualShockInput2[DualShockInput2["Share"] = 8] = "Share"; + DualShockInput2[DualShockInput2["Options"] = 9] = "Options"; + DualShockInput2[DualShockInput2["L3"] = 10] = "L3"; + DualShockInput2[DualShockInput2["R3"] = 11] = "R3"; + DualShockInput2[DualShockInput2["DPadUp"] = 12] = "DPadUp"; + DualShockInput2[DualShockInput2["DPadDown"] = 13] = "DPadDown"; + DualShockInput2[DualShockInput2["DPadLeft"] = 14] = "DPadLeft"; + DualShockInput2[DualShockInput2["DPadRight"] = 15] = "DPadRight"; + DualShockInput2[DualShockInput2["Home"] = 16] = "Home"; + DualShockInput2[DualShockInput2["TouchPad"] = 17] = "TouchPad"; + DualShockInput2[DualShockInput2["LStickXAxis"] = 18] = "LStickXAxis"; + DualShockInput2[DualShockInput2["LStickYAxis"] = 19] = "LStickYAxis"; + DualShockInput2[DualShockInput2["RStickXAxis"] = 20] = "RStickXAxis"; + DualShockInput2[DualShockInput2["RStickYAxis"] = 21] = "RStickYAxis"; +})(DualShockInput || (DualShockInput = {})); +var DualSenseInput; +(function(DualSenseInput2) { + DualSenseInput2[DualSenseInput2["Cross"] = 0] = "Cross"; + DualSenseInput2[DualSenseInput2["Circle"] = 1] = "Circle"; + DualSenseInput2[DualSenseInput2["Square"] = 2] = "Square"; + DualSenseInput2[DualSenseInput2["Triangle"] = 3] = "Triangle"; + DualSenseInput2[DualSenseInput2["L1"] = 4] = "L1"; + DualSenseInput2[DualSenseInput2["R1"] = 5] = "R1"; + DualSenseInput2[DualSenseInput2["L2"] = 6] = "L2"; + DualSenseInput2[DualSenseInput2["R2"] = 7] = "R2"; + DualSenseInput2[DualSenseInput2["Create"] = 8] = "Create"; + DualSenseInput2[DualSenseInput2["Options"] = 9] = "Options"; + DualSenseInput2[DualSenseInput2["L3"] = 10] = "L3"; + DualSenseInput2[DualSenseInput2["R3"] = 11] = "R3"; + DualSenseInput2[DualSenseInput2["DPadUp"] = 12] = "DPadUp"; + DualSenseInput2[DualSenseInput2["DPadDown"] = 13] = "DPadDown"; + DualSenseInput2[DualSenseInput2["DPadLeft"] = 14] = "DPadLeft"; + DualSenseInput2[DualSenseInput2["DPadRight"] = 15] = "DPadRight"; + DualSenseInput2[DualSenseInput2["Home"] = 16] = "Home"; + DualSenseInput2[DualSenseInput2["TouchPad"] = 17] = "TouchPad"; + DualSenseInput2[DualSenseInput2["LStickXAxis"] = 18] = "LStickXAxis"; + DualSenseInput2[DualSenseInput2["LStickYAxis"] = 19] = "LStickYAxis"; + DualSenseInput2[DualSenseInput2["RStickXAxis"] = 20] = "RStickXAxis"; + DualSenseInput2[DualSenseInput2["RStickYAxis"] = 21] = "RStickYAxis"; +})(DualSenseInput || (DualSenseInput = {})); +var XboxInput; +(function(XboxInput2) { + XboxInput2[XboxInput2["A"] = 0] = "A"; + XboxInput2[XboxInput2["B"] = 1] = "B"; + XboxInput2[XboxInput2["X"] = 2] = "X"; + XboxInput2[XboxInput2["Y"] = 3] = "Y"; + XboxInput2[XboxInput2["LB"] = 4] = "LB"; + XboxInput2[XboxInput2["RB"] = 5] = "RB"; + XboxInput2[XboxInput2["LT"] = 6] = "LT"; + XboxInput2[XboxInput2["RT"] = 7] = "RT"; + XboxInput2[XboxInput2["Back"] = 8] = "Back"; + XboxInput2[XboxInput2["Start"] = 9] = "Start"; + XboxInput2[XboxInput2["LS"] = 10] = "LS"; + XboxInput2[XboxInput2["RS"] = 11] = "RS"; + XboxInput2[XboxInput2["DPadUp"] = 12] = "DPadUp"; + XboxInput2[XboxInput2["DPadDown"] = 13] = "DPadDown"; + XboxInput2[XboxInput2["DPadLeft"] = 14] = "DPadLeft"; + XboxInput2[XboxInput2["DPadRight"] = 15] = "DPadRight"; + XboxInput2[XboxInput2["Home"] = 16] = "Home"; + XboxInput2[XboxInput2["LStickXAxis"] = 17] = "LStickXAxis"; + XboxInput2[XboxInput2["LStickYAxis"] = 18] = "LStickYAxis"; + XboxInput2[XboxInput2["RStickXAxis"] = 19] = "RStickXAxis"; + XboxInput2[XboxInput2["RStickYAxis"] = 20] = "RStickYAxis"; +})(XboxInput || (XboxInput = {})); +var SwitchInput; +(function(SwitchInput2) { + SwitchInput2[SwitchInput2["B"] = 0] = "B"; + SwitchInput2[SwitchInput2["A"] = 1] = "A"; + SwitchInput2[SwitchInput2["Y"] = 2] = "Y"; + SwitchInput2[SwitchInput2["X"] = 3] = "X"; + SwitchInput2[SwitchInput2["L"] = 4] = "L"; + SwitchInput2[SwitchInput2["R"] = 5] = "R"; + SwitchInput2[SwitchInput2["ZL"] = 6] = "ZL"; + SwitchInput2[SwitchInput2["ZR"] = 7] = "ZR"; + SwitchInput2[SwitchInput2["Minus"] = 8] = "Minus"; + SwitchInput2[SwitchInput2["Plus"] = 9] = "Plus"; + SwitchInput2[SwitchInput2["LS"] = 10] = "LS"; + SwitchInput2[SwitchInput2["RS"] = 11] = "RS"; + SwitchInput2[SwitchInput2["DPadUp"] = 12] = "DPadUp"; + SwitchInput2[SwitchInput2["DPadDown"] = 13] = "DPadDown"; + SwitchInput2[SwitchInput2["DPadLeft"] = 14] = "DPadLeft"; + SwitchInput2[SwitchInput2["DPadRight"] = 15] = "DPadRight"; + SwitchInput2[SwitchInput2["Home"] = 16] = "Home"; + SwitchInput2[SwitchInput2["Capture"] = 17] = "Capture"; + SwitchInput2[SwitchInput2["LStickXAxis"] = 18] = "LStickXAxis"; + SwitchInput2[SwitchInput2["LStickYAxis"] = 19] = "LStickYAxis"; + SwitchInput2[SwitchInput2["RStickXAxis"] = 20] = "RStickXAxis"; + SwitchInput2[SwitchInput2["RStickYAxis"] = 21] = "RStickYAxis"; +})(SwitchInput || (SwitchInput = {})); + +// node_modules/@babylonjs/core/Events/deviceInputEvents.js +var DeviceInputEventType; +(function(DeviceInputEventType2) { + DeviceInputEventType2[DeviceInputEventType2["PointerMove"] = 0] = "PointerMove"; + DeviceInputEventType2[DeviceInputEventType2["PointerDown"] = 1] = "PointerDown"; + DeviceInputEventType2[DeviceInputEventType2["PointerUp"] = 2] = "PointerUp"; +})(DeviceInputEventType || (DeviceInputEventType = {})); +var EventConstants = class { +}; +EventConstants.DOM_DELTA_PIXEL = 0; +EventConstants.DOM_DELTA_LINE = 1; +EventConstants.DOM_DELTA_PAGE = 2; + +// node_modules/@babylonjs/core/DeviceInput/InputDevices/deviceSource.js +var DeviceSource = class { /** - * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 500 ms + * Default Constructor + * @param deviceInputSystem - Reference to DeviceInputSystem + * @param deviceType - Type of device + * @param deviceSlot - "Slot" or index that device is referenced in */ - static get LongPressDelay() { - return InputManager.LongPressDelay; - } - static set LongPressDelay(value) { - InputManager.LongPressDelay = value; + constructor(deviceInputSystem, deviceType, deviceSlot = 0) { + this.deviceType = deviceType; + this.deviceSlot = deviceSlot; + this.onInputChangedObservable = new Observable(); + this._deviceInputSystem = deviceInputSystem; } /** - * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 300 ms + * Get input for specific input + * @param inputIndex - index of specific input on device + * @returns Input value from DeviceInputSystem */ - static get DoubleClickDelay() { - return InputManager.DoubleClickDelay; - } - static set DoubleClickDelay(value) { - InputManager.DoubleClickDelay = value; - } - /** If you need to check double click without raising a single click at first click, enable this flag */ - static get ExclusiveDoubleClickMode() { - return InputManager.ExclusiveDoubleClickMode; - } - static set ExclusiveDoubleClickMode(value) { - InputManager.ExclusiveDoubleClickMode = value; + getInput(inputIndex) { + return this._deviceInputSystem.pollInput(this.deviceType, this.deviceSlot, inputIndex); } +}; + +// node_modules/@babylonjs/core/DeviceInput/eventFactory.js +var DeviceEventFactory = class { /** - * Bind the current view position to an effect. - * @param effect The effect to be bound - * @param variableName name of the shader variable that will hold the eye position - * @param isVector3 true to indicates that variableName is a Vector3 and not a Vector4 - * @returns the computed eye position + * Create device input events based on provided type and slot + * + * @param deviceType Type of device + * @param deviceSlot "Slot" or index that device is referenced in + * @param inputIndex Id of input to be checked + * @param currentState Current value for given input + * @param deviceInputSystem Reference to DeviceInputSystem + * @param elementToAttachTo HTMLElement to reference as target for inputs + * @param pointerId PointerId to use for pointer events + * @returns IUIEvent object */ - bindEyePosition(effect, variableName = "vEyePosition", isVector3 = false) { - const eyePosition = this._forcedViewPosition ? this._forcedViewPosition : this._mirroredCameraPosition ? this._mirroredCameraPosition : this.activeCamera.globalPosition; - const invertNormal = this.useRightHandedSystem === (this._mirroredCameraPosition != null); - TmpVectors.Vector4[0].set(eyePosition.x, eyePosition.y, eyePosition.z, invertNormal ? -1 : 1); - if (effect) { - if (isVector3) { - effect.setFloat3(variableName, TmpVectors.Vector4[0].x, TmpVectors.Vector4[0].y, TmpVectors.Vector4[0].z); - } else { - effect.setVector4(variableName, TmpVectors.Vector4[0]); - } + static CreateDeviceEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo, pointerId) { + switch (deviceType) { + case DeviceType.Keyboard: + return this._CreateKeyboardEvent(inputIndex, currentState, deviceInputSystem, elementToAttachTo); + case DeviceType.Mouse: + if (inputIndex === PointerInput.MouseWheelX || inputIndex === PointerInput.MouseWheelY || inputIndex === PointerInput.MouseWheelZ) { + return this._CreateWheelEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo); + } + case DeviceType.Touch: + return this._CreatePointerEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo, pointerId); + default: + throw `Unable to generate event for device ${DeviceType[deviceType]}`; } - return TmpVectors.Vector4[0]; } /** - * Update the scene ubo before it can be used in rendering processing - * @returns the scene UniformBuffer + * Creates pointer event + * + * @param deviceType Type of device + * @param deviceSlot "Slot" or index that device is referenced in + * @param inputIndex Id of input to be checked + * @param currentState Current value for given input + * @param deviceInputSystem Reference to DeviceInputSystem + * @param elementToAttachTo HTMLElement to reference as target for inputs + * @param pointerId PointerId to use for pointer events + * @returns IUIEvent object (Pointer) */ - finalizeSceneUbo() { - const ubo = this.getSceneUniformBuffer(); - const eyePosition = this.bindEyePosition(null); - ubo.updateFloat4("vEyePosition", eyePosition.x, eyePosition.y, eyePosition.z, eyePosition.w); - ubo.update(); - return ubo; + static _CreatePointerEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo, pointerId) { + const evt = this._CreateMouseEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo); + if (deviceType === DeviceType.Mouse) { + evt.deviceType = DeviceType.Mouse; + evt.pointerId = 1; + evt.pointerType = "mouse"; + } else { + evt.deviceType = DeviceType.Touch; + evt.pointerId = pointerId ?? deviceSlot; + evt.pointerType = "touch"; + } + let buttons = 0; + buttons += deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.LeftClick); + buttons += deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.RightClick) * 2; + buttons += deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.MiddleClick) * 4; + evt.buttons = buttons; + if (inputIndex === PointerInput.Move) { + evt.type = "pointermove"; + } else if (inputIndex >= PointerInput.LeftClick && inputIndex <= PointerInput.RightClick) { + evt.type = currentState === 1 ? "pointerdown" : "pointerup"; + evt.button = inputIndex - 2; + } + return evt; } /** - * Gets or sets a boolean indicating if the scene must use right-handed coordinates system + * Create Mouse Wheel Event + * @param deviceType Type of device + * @param deviceSlot "Slot" or index that device is referenced in + * @param inputIndex Id of input to be checked + * @param currentState Current value for given input + * @param deviceInputSystem Reference to DeviceInputSystem + * @param elementToAttachTo HTMLElement to reference as target for inputs + * @returns IUIEvent object (Wheel) */ - set useRightHandedSystem(value) { - if (this._useRightHandedSystem === value) { - return; + static _CreateWheelEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo) { + const evt = this._CreateMouseEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo); + evt.pointerId = 1; + evt.type = "wheel"; + evt.deltaMode = EventConstants.DOM_DELTA_PIXEL; + evt.deltaX = 0; + evt.deltaY = 0; + evt.deltaZ = 0; + switch (inputIndex) { + case PointerInput.MouseWheelX: + evt.deltaX = currentState; + break; + case PointerInput.MouseWheelY: + evt.deltaY = currentState; + break; + case PointerInput.MouseWheelZ: + evt.deltaZ = currentState; + break; } - this._useRightHandedSystem = value; - this.markAllMaterialsAsDirty(16); - } - get useRightHandedSystem() { - return this._useRightHandedSystem; + return evt; } /** - * Sets the step Id used by deterministic lock step - * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep - * @param newStepId defines the step Id + * Create Mouse Event + * @param deviceType Type of device + * @param deviceSlot "Slot" or index that device is referenced in + * @param inputIndex Id of input to be checked + * @param currentState Current value for given input + * @param deviceInputSystem Reference to DeviceInputSystem + * @param elementToAttachTo HTMLElement to reference as target for inputs + * @returns IUIEvent object (Mouse) */ - setStepId(newStepId) { - this._currentStepId = newStepId; + static _CreateMouseEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo) { + const evt = this._CreateEvent(elementToAttachTo); + const pointerX = deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.Horizontal); + const pointerY = deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.Vertical); + if (elementToAttachTo) { + evt.movementX = 0; + evt.movementY = 0; + evt.offsetX = evt.movementX - elementToAttachTo.getBoundingClientRect().x; + evt.offsetY = evt.movementY - elementToAttachTo.getBoundingClientRect().y; + } else { + evt.movementX = deviceInputSystem.pollInput(deviceType, deviceSlot, NativePointerInput.DeltaHorizontal); + evt.movementY = deviceInputSystem.pollInput(deviceType, deviceSlot, NativePointerInput.DeltaVertical); + evt.offsetX = 0; + evt.offsetY = 0; + } + this._CheckNonCharacterKeys(evt, deviceInputSystem); + evt.clientX = pointerX; + evt.clientY = pointerY; + evt.x = pointerX; + evt.y = pointerY; + evt.deviceType = deviceType; + evt.deviceSlot = deviceSlot; + evt.inputIndex = inputIndex; + return evt; } /** - * Gets the step Id used by deterministic lock step - * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep - * @returns the step Id + * Create Keyboard Event + * @param inputIndex Id of input to be checked + * @param currentState Current value for given input + * @param deviceInputSystem Reference to DeviceInputSystem + * @param elementToAttachTo HTMLElement to reference as target for inputs + * @returns IEvent object (Keyboard) */ - getStepId() { - return this._currentStepId; + static _CreateKeyboardEvent(inputIndex, currentState, deviceInputSystem, elementToAttachTo) { + const evt = this._CreateEvent(elementToAttachTo); + this._CheckNonCharacterKeys(evt, deviceInputSystem); + evt.deviceType = DeviceType.Keyboard; + evt.deviceSlot = 0; + evt.inputIndex = inputIndex; + evt.type = currentState === 1 ? "keydown" : "keyup"; + evt.key = String.fromCharCode(inputIndex); + evt.keyCode = inputIndex; + return evt; } /** - * Gets the internal step used by deterministic lock step - * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep - * @returns the internal step + * Add parameters for non-character keys (Ctrl, Alt, Meta, Shift) + * @param evt Event object to add parameters to + * @param deviceInputSystem DeviceInputSystem to pull values from */ - getInternalStep() { - return this._currentInternalStep; + static _CheckNonCharacterKeys(evt, deviceInputSystem) { + const isKeyboardActive = deviceInputSystem.isDeviceAvailable(DeviceType.Keyboard); + const altKey = isKeyboardActive && deviceInputSystem.pollInput(DeviceType.Keyboard, 0, 18) === 1; + const ctrlKey = isKeyboardActive && deviceInputSystem.pollInput(DeviceType.Keyboard, 0, 17) === 1; + const metaKey = isKeyboardActive && (deviceInputSystem.pollInput(DeviceType.Keyboard, 0, 91) === 1 || deviceInputSystem.pollInput(DeviceType.Keyboard, 0, 92) === 1 || deviceInputSystem.pollInput(DeviceType.Keyboard, 0, 93) === 1); + const shiftKey = isKeyboardActive && deviceInputSystem.pollInput(DeviceType.Keyboard, 0, 16) === 1; + evt.altKey = altKey; + evt.ctrlKey = ctrlKey; + evt.metaKey = metaKey; + evt.shiftKey = shiftKey; } /** - * Gets or sets a boolean indicating if fog is enabled on this scene - * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog - * (Default is true) + * Create base event object + * @param elementToAttachTo Value to use as event target + * @returns */ - set fogEnabled(value) { - if (this._fogEnabled === value) { - return; - } - this._fogEnabled = value; - this.markAllMaterialsAsDirty(16); + static _CreateEvent(elementToAttachTo) { + const evt = {}; + evt.preventDefault = () => { + }; + evt.target = elementToAttachTo; + return evt; } - get fogEnabled() { - return this._fogEnabled; +}; + +// node_modules/@babylonjs/core/DeviceInput/nativeDeviceInputSystem.js +var NativeDeviceInputSystem = class { + constructor(onDeviceConnected, onDeviceDisconnected, onInputChanged) { + this._nativeInput = _native.DeviceInputSystem ? new _native.DeviceInputSystem(onDeviceConnected, onDeviceDisconnected, (deviceType, deviceSlot, inputIndex, currentState) => { + const evt = DeviceEventFactory.CreateDeviceEvent(deviceType, deviceSlot, inputIndex, currentState, this); + onInputChanged(deviceType, deviceSlot, evt); + }) : this._createDummyNativeInput(); } + // Public functions /** - * Gets or sets the fog mode to use - * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog - * | mode | value | - * | --- | --- | - * | FOGMODE_NONE | 0 | - * | FOGMODE_EXP | 1 | - * | FOGMODE_EXP2 | 2 | - * | FOGMODE_LINEAR | 3 | + * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized. + * @param deviceType Enum specifying device type + * @param deviceSlot "Slot" or index that device is referenced in + * @param inputIndex Id of input to be checked + * @returns Current value of input */ - set fogMode(value) { - if (this._fogMode === value) { - return; - } - this._fogMode = value; - this.markAllMaterialsAsDirty(16); - } - get fogMode() { - return this._fogMode; + pollInput(deviceType, deviceSlot, inputIndex) { + return this._nativeInput.pollInput(deviceType, deviceSlot, inputIndex); } /** - * Flag indicating that the frame buffer binding is handled by another component + * Check for a specific device in the DeviceInputSystem + * @param deviceType Type of device to check for + * @returns bool with status of device's existence */ - get prePass() { - return !!this.prePassRenderer && this.prePassRenderer.defaultRT.enabled; + isDeviceAvailable(deviceType) { + return deviceType === DeviceType.Mouse || deviceType === DeviceType.Touch; } /** - * Gets or sets a boolean indicating if shadows are enabled on this scene + * Dispose of all the observables */ - set shadowsEnabled(value) { - if (this._shadowsEnabled === value) { - return; - } - this._shadowsEnabled = value; - this.markAllMaterialsAsDirty(2); - } - get shadowsEnabled() { - return this._shadowsEnabled; + dispose() { + this._nativeInput.dispose(); } /** - * Gets or sets a boolean indicating if lights are enabled on this scene + * For versions of BabylonNative that don't have the NativeInput plugin initialized, create a dummy version + * @returns Object with dummy functions */ - set lightsEnabled(value) { - if (this._lightsEnabled === value) { - return; - } - this._lightsEnabled = value; - this.markAllMaterialsAsDirty(2); - } - get lightsEnabled() { - return this._lightsEnabled; - } - /** All of the active cameras added to this scene. */ - get activeCameras() { - return this._activeCameras; - } - set activeCameras(cameras) { - if (this._unObserveActiveCameras) { - this._unObserveActiveCameras(); - this._unObserveActiveCameras = null; - } - if (cameras) { - this._unObserveActiveCameras = _ObserveArray(cameras, () => { - this.onActiveCamerasChanged.notifyObservers(this); - }); - } - this._activeCameras = cameras; - } - /** Gets or sets the current active camera */ - get activeCamera() { - return this._activeCamera; - } - set activeCamera(value) { - if (value === this._activeCamera) { - return; - } - this._activeCamera = value; - this.onActiveCameraChanged.notifyObservers(this); - } - /** The default material used on meshes when no material is affected */ - get defaultMaterial() { - if (!this._defaultMaterial) { - this._defaultMaterial = _Scene.DefaultMaterialFactory(this); - } - return this._defaultMaterial; - } - /** The default material used on meshes when no material is affected */ - set defaultMaterial(value) { - this._defaultMaterial = value; + _createDummyNativeInput() { + const nativeInput = { + pollInput: () => { + return 0; + }, + isDeviceAvailable: () => { + return false; + }, + dispose: () => { + } + }; + return nativeInput; } +}; + +// node_modules/@babylonjs/core/DeviceInput/webDeviceInputSystem.js +var MAX_KEYCODES = 255; +var MAX_POINTER_INPUTS = Object.keys(PointerInput).length / 2; +var WebDeviceInputSystem = class { /** - * Gets or sets a boolean indicating if textures are enabled on this scene + * Constructor for the WebDeviceInputSystem + * @param engine Engine to reference + * @param onDeviceConnected Callback to execute when device is connected + * @param onDeviceDisconnected Callback to execute when device is disconnected + * @param onInputChanged Callback to execute when input changes on device */ - set texturesEnabled(value) { - if (this._texturesEnabled === value) { - return; + constructor(engine, onDeviceConnected, onDeviceDisconnected, onInputChanged) { + this._inputs = []; + this._keyboardActive = false; + this._pointerActive = false; + this._usingSafari = Tools.IsSafari(); + this._usingMacOS = IsNavigatorAvailable() && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform); + this._keyboardDownEvent = (evt) => { + }; + this._keyboardUpEvent = (evt) => { + }; + this._keyboardBlurEvent = (evt) => { + }; + this._pointerMoveEvent = (evt) => { + }; + this._pointerDownEvent = (evt) => { + }; + this._pointerUpEvent = (evt) => { + }; + this._pointerCancelEvent = (evt) => { + }; + this._pointerWheelEvent = (evt) => { + }; + this._pointerBlurEvent = (evt) => { + }; + this._pointerMacOSChromeOutEvent = (evt) => { + }; + this._eventsAttached = false; + this._mouseId = -1; + this._isUsingFirefox = IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf("Firefox") !== -1; + this._isUsingChromium = IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf("Chrome") !== -1; + this._maxTouchPoints = 0; + this._pointerInputClearObserver = null; + this._gamepadConnectedEvent = (evt) => { + }; + this._gamepadDisconnectedEvent = (evt) => { + }; + this._eventPrefix = Tools.GetPointerPrefix(engine); + this._engine = engine; + this._onDeviceConnected = onDeviceConnected; + this._onDeviceDisconnected = onDeviceDisconnected; + this._onInputChanged = onInputChanged; + this._mouseId = this._isUsingFirefox ? 0 : 1; + this._enableEvents(); + if (this._usingMacOS) { + this._metaKeys = []; + } + if (!this._engine._onEngineViewChanged) { + this._engine._onEngineViewChanged = () => { + this._enableEvents(); + }; } - this._texturesEnabled = value; - this.markAllMaterialsAsDirty(1); - } - get texturesEnabled() { - return this._texturesEnabled; } + // Public functions /** - * Gets or sets a boolean indicating if skeletons are enabled on this scene + * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized. + * @param deviceType Enum specifying device type + * @param deviceSlot "Slot" or index that device is referenced in + * @param inputIndex Id of input to be checked + * @returns Current value of input */ - set skeletonsEnabled(value) { - if (this._skeletonsEnabled === value) { - return; + pollInput(deviceType, deviceSlot, inputIndex) { + const device = this._inputs[deviceType][deviceSlot]; + if (!device) { + throw `Unable to find device ${DeviceType[deviceType]}`; } - this._skeletonsEnabled = value; - this.markAllMaterialsAsDirty(8); - } - get skeletonsEnabled() { - return this._skeletonsEnabled; - } - /** @internal */ - get collisionCoordinator() { - if (!this._collisionCoordinator) { - this._collisionCoordinator = _Scene.CollisionCoordinatorFactory(); - this._collisionCoordinator.init(this); + if (deviceType >= DeviceType.DualShock && deviceType <= DeviceType.DualSense) { + this._updateDevice(deviceType, deviceSlot, inputIndex); } - return this._collisionCoordinator; + const currentValue = device[inputIndex]; + if (currentValue === void 0) { + throw `Unable to find input ${inputIndex} for device ${DeviceType[deviceType]} in slot ${deviceSlot}`; + } + if (inputIndex === PointerInput.Move) { + Tools.Warn(`Unable to provide information for PointerInput.Move. Try using PointerInput.Horizontal or PointerInput.Vertical for move data.`); + } + return currentValue; } /** - * Gets the scene's rendering manager + * Check for a specific device in the DeviceInputSystem + * @param deviceType Type of device to check for + * @returns bool with status of device's existence */ - get renderingManager() { - return this._renderingManager; + isDeviceAvailable(deviceType) { + return this._inputs[deviceType] !== void 0; } /** - * Gets the list of frustum planes (built from the active camera) + * Dispose of all the eventlisteners */ - get frustumPlanes() { - return this._frustumPlanes; + dispose() { + this._onDeviceConnected = () => { + }; + this._onDeviceDisconnected = () => { + }; + this._onInputChanged = () => { + }; + delete this._engine._onEngineViewChanged; + if (this._elementToAttachTo) { + this._disableEvents(); + } } /** - * Registers the transient components if needed. + * Enable listening for user input events */ - _registerTransientComponents() { - if (this._transientComponents.length > 0) { - for (const component of this._transientComponents) { - component.register(); + _enableEvents() { + const inputElement = this == null ? void 0 : this._engine.getInputElement(); + if (inputElement && (!this._eventsAttached || this._elementToAttachTo !== inputElement)) { + this._disableEvents(); + if (this._inputs) { + for (const inputs of this._inputs) { + if (inputs) { + for (const deviceSlotKey in inputs) { + const deviceSlot = +deviceSlotKey; + const device = inputs[deviceSlot]; + if (device) { + for (let inputIndex = 0; inputIndex < device.length; inputIndex++) { + device[inputIndex] = 0; + } + } + } + } + } } - this._transientComponents.length = 0; + this._elementToAttachTo = inputElement; + this._elementToAttachTo.tabIndex = this._elementToAttachTo.tabIndex !== -1 ? this._elementToAttachTo.tabIndex : this._engine.canvasTabIndex; + this._handleKeyActions(); + this._handlePointerActions(); + this._handleGamepadActions(); + this._eventsAttached = true; + this._checkForConnectedDevices(); } } /** - * @internal - * Add a component to the scene. - * Note that the ccomponent could be registered on th next frame if this is called after - * the register component stage. - * @param component Defines the component to add to the scene + * Disable listening for user input events */ - _addComponent(component) { - this._components.push(component); - this._transientComponents.push(component); - const serializableComponent = component; - if (serializableComponent.addFromContainer && serializableComponent.serialize) { - this._serializableComponents.push(serializableComponent); + _disableEvents() { + if (this._elementToAttachTo) { + this._elementToAttachTo.removeEventListener("blur", this._keyboardBlurEvent); + this._elementToAttachTo.removeEventListener("blur", this._pointerBlurEvent); + this._elementToAttachTo.removeEventListener("keydown", this._keyboardDownEvent); + this._elementToAttachTo.removeEventListener("keyup", this._keyboardUpEvent); + this._elementToAttachTo.removeEventListener(this._eventPrefix + "move", this._pointerMoveEvent); + this._elementToAttachTo.removeEventListener(this._eventPrefix + "down", this._pointerDownEvent); + this._elementToAttachTo.removeEventListener(this._eventPrefix + "up", this._pointerUpEvent); + this._elementToAttachTo.removeEventListener(this._eventPrefix + "cancel", this._pointerCancelEvent); + this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent); + if (this._usingMacOS && this._isUsingChromium) { + this._elementToAttachTo.removeEventListener("lostpointercapture", this._pointerMacOSChromeOutEvent); + } + window.removeEventListener("gamepadconnected", this._gamepadConnectedEvent); + window.removeEventListener("gamepaddisconnected", this._gamepadDisconnectedEvent); + } + if (this._pointerInputClearObserver) { + this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver); } + this._eventsAttached = false; } /** - * @internal - * Gets a component from the scene. - * @param name defines the name of the component to retrieve - * @returns the component or null if not present + * Checks for existing connections to devices and register them, if necessary + * Currently handles gamepads and mouse */ - _getComponent(name69) { - for (const component of this._components) { - if (component.name === name69) { - return component; + _checkForConnectedDevices() { + if (navigator.getGamepads) { + const gamepads = navigator.getGamepads(); + for (const gamepad of gamepads) { + if (gamepad) { + this._addGamePad(gamepad); + } } } - return null; + if (typeof matchMedia === "function" && matchMedia("(pointer:fine)").matches) { + this._addPointerDevice(DeviceType.Mouse, 0, 0, 0); + } } + // Private functions /** - * Creates a new Scene - * @param engine defines the engine to use to render this scene - * @param options defines the scene options + * Add a gamepad to the DeviceInputSystem + * @param gamepad A single DOM Gamepad object */ - constructor(engine, options) { - super(); - this._inputManager = new InputManager(this); - this.cameraToUseForPointers = null; - this._isScene = true; - this._blockEntityCollection = false; - this.autoClear = true; - this.autoClearDepthAndStencil = true; - this.clearColor = new Color4(0.2, 0.2, 0.3, 1); - this.ambientColor = new Color3(0, 0, 0); - this.environmentIntensity = 1; - this._performancePriority = ScenePerformancePriority.BackwardCompatible; - this.onScenePerformancePriorityChangedObservable = new Observable(); - this._forceWireframe = false; - this._skipFrustumClipping = false; - this._forcePointsCloud = false; - this.animationsEnabled = true; - this._animationPropertiesOverride = null; - this.useConstantAnimationDeltaTime = false; - this.constantlyUpdateMeshUnderPointer = false; - this.hoverCursor = "pointer"; - this.defaultCursor = ""; - this.doNotHandleCursors = false; - this.preventDefaultOnPointerDown = true; - this.preventDefaultOnPointerUp = true; - this.metadata = null; - this.reservedDataStore = null; - this.disableOfflineSupportExceptionRules = []; - this.onDisposeObservable = new Observable(); - this._onDisposeObserver = null; - this.onBeforeRenderObservable = new Observable(); - this._onBeforeRenderObserver = null; - this.onAfterRenderObservable = new Observable(); - this.onAfterRenderCameraObservable = new Observable(); - this._onAfterRenderObserver = null; - this.onBeforeAnimationsObservable = new Observable(); - this.onAfterAnimationsObservable = new Observable(); - this.onBeforeDrawPhaseObservable = new Observable(); - this.onAfterDrawPhaseObservable = new Observable(); - this.onReadyObservable = new Observable(); - this.onBeforeCameraRenderObservable = new Observable(); - this._onBeforeCameraRenderObserver = null; - this.onAfterCameraRenderObservable = new Observable(); - this._onAfterCameraRenderObserver = null; - this.onBeforeActiveMeshesEvaluationObservable = new Observable(); - this.onAfterActiveMeshesEvaluationObservable = new Observable(); - this.onBeforeParticlesRenderingObservable = new Observable(); - this.onAfterParticlesRenderingObservable = new Observable(); - this.onDataLoadedObservable = new Observable(); - this.onNewCameraAddedObservable = new Observable(); - this.onCameraRemovedObservable = new Observable(); - this.onNewLightAddedObservable = new Observable(); - this.onLightRemovedObservable = new Observable(); - this.onNewGeometryAddedObservable = new Observable(); - this.onGeometryRemovedObservable = new Observable(); - this.onNewTransformNodeAddedObservable = new Observable(); - this.onTransformNodeRemovedObservable = new Observable(); - this.onNewMeshAddedObservable = new Observable(); - this.onMeshRemovedObservable = new Observable(); - this.onNewSkeletonAddedObservable = new Observable(); - this.onSkeletonRemovedObservable = new Observable(); - this.onNewMaterialAddedObservable = new Observable(); - this.onNewMultiMaterialAddedObservable = new Observable(); - this.onMaterialRemovedObservable = new Observable(); - this.onMultiMaterialRemovedObservable = new Observable(); - this.onNewTextureAddedObservable = new Observable(); - this.onTextureRemovedObservable = new Observable(); - this.onBeforeRenderTargetsRenderObservable = new Observable(); - this.onAfterRenderTargetsRenderObservable = new Observable(); - this.onBeforeStepObservable = new Observable(); - this.onAfterStepObservable = new Observable(); - this.onActiveCameraChanged = new Observable(); - this.onActiveCamerasChanged = new Observable(); - this.onBeforeRenderingGroupObservable = new Observable(); - this.onAfterRenderingGroupObservable = new Observable(); - this.onMeshImportedObservable = new Observable(); - this.onAnimationFileImportedObservable = new Observable(); - this._registeredForLateAnimationBindings = new SmartArrayNoDuplicate(256); - this._pointerPickingConfiguration = new PointerPickingConfiguration(); - this.onPrePointerObservable = new Observable(); - this.onPointerObservable = new Observable(); - this.onPreKeyboardObservable = new Observable(); - this.onKeyboardObservable = new Observable(); - this._useRightHandedSystem = false; - this._timeAccumulator = 0; - this._currentStepId = 0; - this._currentInternalStep = 0; - this._fogEnabled = true; - this._fogMode = _Scene.FOGMODE_NONE; - this.fogColor = new Color3(0.2, 0.2, 0.3); - this.fogDensity = 0.1; - this.fogStart = 0; - this.fogEnd = 1e3; - this.needsPreviousWorldMatrices = false; - this._shadowsEnabled = true; - this._lightsEnabled = true; - this._unObserveActiveCameras = null; - this._texturesEnabled = true; - this.physicsEnabled = true; - this.particlesEnabled = true; - this.spritesEnabled = true; - this._skeletonsEnabled = true; - this.lensFlaresEnabled = true; - this.collisionsEnabled = true; - this.gravity = new Vector3(0, -9.807, 0); - this.postProcessesEnabled = true; - this.renderTargetsEnabled = true; - this.dumpNextRenderTargets = false; - this.customRenderTargets = []; - this.importedMeshesFiles = []; - this.probesEnabled = true; - this._meshesForIntersections = new SmartArrayNoDuplicate(256); - this.proceduralTexturesEnabled = true; - this._totalVertices = new PerfCounter(); - this._activeIndices = new PerfCounter(); - this._activeParticles = new PerfCounter(); - this._activeBones = new PerfCounter(); - this._animationTime = 0; - this.animationTimeScale = 1; - this._renderId = 0; - this._frameId = 0; - this._executeWhenReadyTimeoutId = null; - this._intermediateRendering = false; - this._defaultFrameBufferCleared = false; - this._viewUpdateFlag = -1; - this._projectionUpdateFlag = -1; - this._toBeDisposed = new Array(256); - this._activeRequests = new Array(); - this._pendingData = new Array(); - this._isDisposed = false; - this.dispatchAllSubMeshesOfActiveMeshes = false; - this._activeMeshes = new SmartArray(256); - this._processedMaterials = new SmartArray(256); - this._renderTargets = new SmartArrayNoDuplicate(256); - this._materialsRenderTargets = new SmartArrayNoDuplicate(256); - this._activeParticleSystems = new SmartArray(256); - this._activeSkeletons = new SmartArrayNoDuplicate(32); - this._softwareSkinnedMeshes = new SmartArrayNoDuplicate(32); - this._activeAnimatables = new Array(); - this._transformMatrix = Matrix.Zero(); - this.requireLightSorting = false; - this._components = []; - this._serializableComponents = []; - this._transientComponents = []; - this._beforeCameraUpdateStage = Stage.Create(); - this._beforeClearStage = Stage.Create(); - this._beforeRenderTargetClearStage = Stage.Create(); - this._gatherRenderTargetsStage = Stage.Create(); - this._gatherActiveCameraRenderTargetsStage = Stage.Create(); - this._isReadyForMeshStage = Stage.Create(); - this._beforeEvaluateActiveMeshStage = Stage.Create(); - this._evaluateSubMeshStage = Stage.Create(); - this._preActiveMeshStage = Stage.Create(); - this._cameraDrawRenderTargetStage = Stage.Create(); - this._beforeCameraDrawStage = Stage.Create(); - this._beforeRenderTargetDrawStage = Stage.Create(); - this._beforeRenderingGroupDrawStage = Stage.Create(); - this._beforeRenderingMeshStage = Stage.Create(); - this._afterRenderingMeshStage = Stage.Create(); - this._afterRenderingGroupDrawStage = Stage.Create(); - this._afterCameraDrawStage = Stage.Create(); - this._afterCameraPostProcessStage = Stage.Create(); - this._afterRenderTargetDrawStage = Stage.Create(); - this._afterRenderTargetPostProcessStage = Stage.Create(); - this._afterRenderStage = Stage.Create(); - this._pointerMoveStage = Stage.Create(); - this._pointerDownStage = Stage.Create(); - this._pointerUpStage = Stage.Create(); - this._geometriesByUniqueId = null; - this._defaultMeshCandidates = { - data: [], - length: 0 - }; - this._defaultSubMeshCandidates = { - data: [], - length: 0 - }; - this._preventFreeActiveMeshesAndRenderingGroups = false; - this._activeMeshesFrozen = false; - this._activeMeshesFrozenButKeepClipping = false; - this._skipEvaluateActiveMeshesCompletely = false; - this._allowPostProcessClearColor = true; - this.getDeterministicFrameTime = () => { - return this._engine.getTimeStep(); - }; - this._registeredActions = 0; - this._blockMaterialDirtyMechanism = false; - this._perfCollector = null; - this.activeCameras = []; - const fullOptions = { - useGeometryUniqueIdsMap: true, - useMaterialMeshMap: true, - useClonedMeshMap: true, - virtual: false, - ...options - }; - engine = this._engine = engine || EngineStore.LastCreatedEngine; - if (fullOptions.virtual) { - engine._virtualScenes.push(this); - } else { - EngineStore._LastCreatedScene = this; - engine.scenes.push(this); - } - this._uid = null; - this._renderingManager = new RenderingManager(this); - if (PostProcessManager) { - this.postProcessManager = new PostProcessManager(this); - } - if (IsWindowObjectExist()) { - this.attachControl(); + _addGamePad(gamepad) { + const deviceType = this._getGamepadDeviceType(gamepad.id); + const deviceSlot = gamepad.index; + this._gamepads = this._gamepads || new Array(gamepad.index + 1); + this._registerDevice(deviceType, deviceSlot, gamepad.buttons.length + gamepad.axes.length); + this._gamepads[deviceSlot] = deviceType; + } + /** + * Add pointer device to DeviceInputSystem + * @param deviceType Type of Pointer to add + * @param deviceSlot Pointer ID (0 for mouse, pointerId for Touch) + * @param currentX Current X at point of adding + * @param currentY Current Y at point of adding + */ + _addPointerDevice(deviceType, deviceSlot, currentX, currentY) { + if (!this._pointerActive) { + this._pointerActive = true; } - this._createUbo(); - if (ImageProcessingConfiguration) { - this._imageProcessingConfiguration = new ImageProcessingConfiguration(); + this._registerDevice(deviceType, deviceSlot, MAX_POINTER_INPUTS); + const pointer = this._inputs[deviceType][deviceSlot]; + pointer[0] = currentX; + pointer[1] = currentY; + } + /** + * Add device and inputs to device array + * @param deviceType Enum specifying device type + * @param deviceSlot "Slot" or index that device is referenced in + * @param numberOfInputs Number of input entries to create for given device + */ + _registerDevice(deviceType, deviceSlot, numberOfInputs) { + if (deviceSlot === void 0) { + throw `Unable to register device ${DeviceType[deviceType]} to undefined slot.`; } - this.setDefaultCandidateProviders(); - if (fullOptions.useGeometryUniqueIdsMap) { - this._geometriesByUniqueId = {}; + if (!this._inputs[deviceType]) { + this._inputs[deviceType] = {}; } - this.useMaterialMeshMap = fullOptions.useMaterialMeshMap; - this.useClonedMeshMap = fullOptions.useClonedMeshMap; - if (!options || !options.virtual) { - engine.onNewSceneAddedObservable.notifyObservers(this); + if (!this._inputs[deviceType][deviceSlot]) { + const device = new Array(numberOfInputs); + device.fill(0); + this._inputs[deviceType][deviceSlot] = device; + this._onDeviceConnected(deviceType, deviceSlot); } } /** - * Gets a string identifying the name of the class - * @returns "Scene" string + * Given a specific device name, remove that device from the device map + * @param deviceType Enum specifying device type + * @param deviceSlot "Slot" or index that device is referenced in */ - getClassName() { - return "Scene"; + _unregisterDevice(deviceType, deviceSlot) { + if (this._inputs[deviceType][deviceSlot]) { + delete this._inputs[deviceType][deviceSlot]; + this._onDeviceDisconnected(deviceType, deviceSlot); + } } /** - * @internal + * Handle all actions that come from keyboard interaction */ - _getDefaultMeshCandidates() { - this._defaultMeshCandidates.data = this.meshes; - this._defaultMeshCandidates.length = this.meshes.length; - return this._defaultMeshCandidates; + _handleKeyActions() { + this._keyboardDownEvent = (evt) => { + if (!this._keyboardActive) { + this._keyboardActive = true; + this._registerDevice(DeviceType.Keyboard, 0, MAX_KEYCODES); + } + const kbKey = this._inputs[DeviceType.Keyboard][0]; + if (kbKey) { + kbKey[evt.keyCode] = 1; + const deviceEvent = evt; + deviceEvent.inputIndex = evt.keyCode; + if (this._usingMacOS && evt.metaKey && evt.key !== "Meta") { + if (!this._metaKeys.includes(evt.keyCode)) { + this._metaKeys.push(evt.keyCode); + } + } + this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent); + } + }; + this._keyboardUpEvent = (evt) => { + if (!this._keyboardActive) { + this._keyboardActive = true; + this._registerDevice(DeviceType.Keyboard, 0, MAX_KEYCODES); + } + const kbKey = this._inputs[DeviceType.Keyboard][0]; + if (kbKey) { + kbKey[evt.keyCode] = 0; + const deviceEvent = evt; + deviceEvent.inputIndex = evt.keyCode; + if (this._usingMacOS && evt.key === "Meta" && this._metaKeys.length > 0) { + for (const keyCode of this._metaKeys) { + const deviceEvent2 = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, keyCode, 0, this, this._elementToAttachTo); + kbKey[keyCode] = 0; + this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent2); + } + this._metaKeys.splice(0, this._metaKeys.length); + } + this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent); + } + }; + this._keyboardBlurEvent = () => { + if (this._keyboardActive) { + const kbKey = this._inputs[DeviceType.Keyboard][0]; + for (let i = 0; i < kbKey.length; i++) { + if (kbKey[i] !== 0) { + kbKey[i] = 0; + const deviceEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, i, 0, this, this._elementToAttachTo); + this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent); + } + } + if (this._usingMacOS) { + this._metaKeys.splice(0, this._metaKeys.length); + } + } + }; + this._elementToAttachTo.addEventListener("keydown", this._keyboardDownEvent); + this._elementToAttachTo.addEventListener("keyup", this._keyboardUpEvent); + this._elementToAttachTo.addEventListener("blur", this._keyboardBlurEvent); } /** - * @internal + * Handle all actions that come from pointer interaction */ - _getDefaultSubMeshCandidates(mesh) { - this._defaultSubMeshCandidates.data = mesh.subMeshes; - this._defaultSubMeshCandidates.length = mesh.subMeshes.length; - return this._defaultSubMeshCandidates; + _handlePointerActions() { + this._maxTouchPoints = IsNavigatorAvailable() && navigator.maxTouchPoints || 2; + if (!this._activeTouchIds) { + this._activeTouchIds = new Array(this._maxTouchPoints); + } + for (let i = 0; i < this._maxTouchPoints; i++) { + this._activeTouchIds[i] = -1; + } + this._pointerMoveEvent = (evt) => { + const deviceType = this._getPointerType(evt); + let deviceSlot = deviceType === DeviceType.Mouse ? 0 : this._activeTouchIds.indexOf(evt.pointerId); + if (deviceType === DeviceType.Touch && deviceSlot === -1) { + const idx = this._activeTouchIds.indexOf(-1); + if (idx >= 0) { + deviceSlot = idx; + this._activeTouchIds[idx] = evt.pointerId; + this._onDeviceConnected(deviceType, deviceSlot); + } else { + Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`); + return; + } + } + if (!this._inputs[deviceType]) { + this._inputs[deviceType] = {}; + } + if (!this._inputs[deviceType][deviceSlot]) { + this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY); + } + const pointer = this._inputs[deviceType][deviceSlot]; + if (pointer) { + const deviceEvent = evt; + deviceEvent.inputIndex = PointerInput.Move; + pointer[PointerInput.Horizontal] = evt.clientX; + pointer[PointerInput.Vertical] = evt.clientY; + if (deviceType === DeviceType.Touch && pointer[PointerInput.LeftClick] === 0) { + pointer[PointerInput.LeftClick] = 1; + } + if (evt.pointerId === void 0) { + evt.pointerId = this._mouseId; + } + this._onInputChanged(deviceType, deviceSlot, deviceEvent); + if (!this._usingSafari && evt.button !== -1) { + deviceEvent.inputIndex = evt.button + 2; + pointer[evt.button + 2] = pointer[evt.button + 2] ? 0 : 1; + this._onInputChanged(deviceType, deviceSlot, deviceEvent); + } + } + }; + this._pointerDownEvent = (evt) => { + const deviceType = this._getPointerType(evt); + let deviceSlot = deviceType === DeviceType.Mouse ? 0 : evt.pointerId; + if (deviceType === DeviceType.Touch) { + const idx = this._activeTouchIds.indexOf(-1); + if (idx >= 0) { + deviceSlot = idx; + this._activeTouchIds[idx] = evt.pointerId; + } else { + Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`); + return; + } + } + if (!this._inputs[deviceType]) { + this._inputs[deviceType] = {}; + } + if (!this._inputs[deviceType][deviceSlot]) { + this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY); + } else if (deviceType === DeviceType.Touch) { + this._onDeviceConnected(deviceType, deviceSlot); + } + const pointer = this._inputs[deviceType][deviceSlot]; + if (pointer) { + const previousHorizontal = pointer[PointerInput.Horizontal]; + const previousVertical = pointer[PointerInput.Vertical]; + if (deviceType === DeviceType.Mouse) { + if (evt.pointerId === void 0) { + evt.pointerId = this._mouseId; + } + if (!document.pointerLockElement) { + try { + this._elementToAttachTo.setPointerCapture(this._mouseId); + } catch (e) { + } + } + } else { + if (evt.pointerId && !document.pointerLockElement) { + try { + this._elementToAttachTo.setPointerCapture(evt.pointerId); + } catch (e) { + } + } + } + pointer[PointerInput.Horizontal] = evt.clientX; + pointer[PointerInput.Vertical] = evt.clientY; + pointer[evt.button + 2] = 1; + const deviceEvent = evt; + deviceEvent.inputIndex = evt.button + 2; + this._onInputChanged(deviceType, deviceSlot, deviceEvent); + if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) { + deviceEvent.inputIndex = PointerInput.Move; + this._onInputChanged(deviceType, deviceSlot, deviceEvent); + } + } + }; + this._pointerUpEvent = (evt) => { + var _a, _b, _c, _d, _e; + const deviceType = this._getPointerType(evt); + const deviceSlot = deviceType === DeviceType.Mouse ? 0 : this._activeTouchIds.indexOf(evt.pointerId); + if (deviceType === DeviceType.Touch) { + if (deviceSlot === -1) { + return; + } else { + this._activeTouchIds[deviceSlot] = -1; + } + } + const pointer = (_a = this._inputs[deviceType]) == null ? void 0 : _a[deviceSlot]; + if (pointer && pointer[evt.button + 2] !== 0) { + const previousHorizontal = pointer[PointerInput.Horizontal]; + const previousVertical = pointer[PointerInput.Vertical]; + pointer[PointerInput.Horizontal] = evt.clientX; + pointer[PointerInput.Vertical] = evt.clientY; + pointer[evt.button + 2] = 0; + const deviceEvent = evt; + if (evt.pointerId === void 0) { + evt.pointerId = this._mouseId; + } + if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) { + deviceEvent.inputIndex = PointerInput.Move; + this._onInputChanged(deviceType, deviceSlot, deviceEvent); + } + deviceEvent.inputIndex = evt.button + 2; + if (deviceType === DeviceType.Mouse && this._mouseId >= 0 && ((_c = (_b = this._elementToAttachTo).hasPointerCapture) == null ? void 0 : _c.call(_b, this._mouseId))) { + this._elementToAttachTo.releasePointerCapture(this._mouseId); + } else if (evt.pointerId && ((_e = (_d = this._elementToAttachTo).hasPointerCapture) == null ? void 0 : _e.call(_d, evt.pointerId))) { + this._elementToAttachTo.releasePointerCapture(evt.pointerId); + } + this._onInputChanged(deviceType, deviceSlot, deviceEvent); + if (deviceType === DeviceType.Touch) { + this._onDeviceDisconnected(deviceType, deviceSlot); + } + } + }; + this._pointerCancelEvent = (evt) => { + var _a, _b, _c, _d; + if (evt.pointerType === "mouse") { + const pointer = this._inputs[DeviceType.Mouse][0]; + if (this._mouseId >= 0 && ((_b = (_a = this._elementToAttachTo).hasPointerCapture) == null ? void 0 : _b.call(_a, this._mouseId))) { + this._elementToAttachTo.releasePointerCapture(this._mouseId); + } + for (let inputIndex = PointerInput.LeftClick; inputIndex <= PointerInput.BrowserForward; inputIndex++) { + if (pointer[inputIndex] === 1) { + pointer[inputIndex] = 0; + const deviceEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, inputIndex, 0, this, this._elementToAttachTo); + this._onInputChanged(DeviceType.Mouse, 0, deviceEvent); + } + } + } else { + const deviceSlot = this._activeTouchIds.indexOf(evt.pointerId); + if (deviceSlot === -1) { + return; + } + if ((_d = (_c = this._elementToAttachTo).hasPointerCapture) == null ? void 0 : _d.call(_c, evt.pointerId)) { + this._elementToAttachTo.releasePointerCapture(evt.pointerId); + } + this._inputs[DeviceType.Touch][deviceSlot][PointerInput.LeftClick] = 0; + const deviceEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Touch, deviceSlot, PointerInput.LeftClick, 0, this, this._elementToAttachTo, evt.pointerId); + this._onInputChanged(DeviceType.Touch, deviceSlot, deviceEvent); + this._activeTouchIds[deviceSlot] = -1; + this._onDeviceDisconnected(DeviceType.Touch, deviceSlot); + } + }; + this._wheelEventName = "onwheel" in document.createElement("div") ? "wheel" : document.onmousewheel !== void 0 ? "mousewheel" : "DOMMouseScroll"; + let passiveSupported = false; + const noop = function() { + }; + try { + const options = Object.defineProperty({}, "passive", { + get: function() { + passiveSupported = true; + } + }); + this._elementToAttachTo.addEventListener("test", noop, options); + this._elementToAttachTo.removeEventListener("test", noop, options); + } catch (e) { + } + this._pointerBlurEvent = () => { + var _a, _b, _c, _d, _e; + if (this.isDeviceAvailable(DeviceType.Mouse)) { + const pointer = this._inputs[DeviceType.Mouse][0]; + if (this._mouseId >= 0 && ((_b = (_a = this._elementToAttachTo).hasPointerCapture) == null ? void 0 : _b.call(_a, this._mouseId))) { + this._elementToAttachTo.releasePointerCapture(this._mouseId); + } + for (let inputIndex = PointerInput.LeftClick; inputIndex <= PointerInput.BrowserForward; inputIndex++) { + if (pointer[inputIndex] === 1) { + pointer[inputIndex] = 0; + const deviceEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, inputIndex, 0, this, this._elementToAttachTo); + this._onInputChanged(DeviceType.Mouse, 0, deviceEvent); + } + } + } + if (this.isDeviceAvailable(DeviceType.Touch)) { + const pointer = this._inputs[DeviceType.Touch]; + for (let deviceSlot = 0; deviceSlot < this._activeTouchIds.length; deviceSlot++) { + const pointerId = this._activeTouchIds[deviceSlot]; + if ((_d = (_c = this._elementToAttachTo).hasPointerCapture) == null ? void 0 : _d.call(_c, pointerId)) { + this._elementToAttachTo.releasePointerCapture(pointerId); + } + if (pointerId !== -1 && ((_e = pointer[deviceSlot]) == null ? void 0 : _e[PointerInput.LeftClick]) === 1) { + pointer[deviceSlot][PointerInput.LeftClick] = 0; + const deviceEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Touch, deviceSlot, PointerInput.LeftClick, 0, this, this._elementToAttachTo, pointerId); + this._onInputChanged(DeviceType.Touch, deviceSlot, deviceEvent); + this._activeTouchIds[deviceSlot] = -1; + this._onDeviceDisconnected(DeviceType.Touch, deviceSlot); + } + } + } + }; + this._pointerWheelEvent = (evt) => { + const deviceType = DeviceType.Mouse; + const deviceSlot = 0; + if (!this._inputs[deviceType]) { + this._inputs[deviceType] = []; + } + if (!this._inputs[deviceType][deviceSlot]) { + this._pointerActive = true; + this._registerDevice(deviceType, deviceSlot, MAX_POINTER_INPUTS); + } + const pointer = this._inputs[deviceType][deviceSlot]; + if (pointer) { + pointer[PointerInput.MouseWheelX] = evt.deltaX || 0; + pointer[PointerInput.MouseWheelY] = evt.deltaY || evt.wheelDelta || 0; + pointer[PointerInput.MouseWheelZ] = evt.deltaZ || 0; + const deviceEvent = evt; + if (evt.pointerId === void 0) { + evt.pointerId = this._mouseId; + } + if (pointer[PointerInput.MouseWheelX] !== 0) { + deviceEvent.inputIndex = PointerInput.MouseWheelX; + this._onInputChanged(deviceType, deviceSlot, deviceEvent); + } + if (pointer[PointerInput.MouseWheelY] !== 0) { + deviceEvent.inputIndex = PointerInput.MouseWheelY; + this._onInputChanged(deviceType, deviceSlot, deviceEvent); + } + if (pointer[PointerInput.MouseWheelZ] !== 0) { + deviceEvent.inputIndex = PointerInput.MouseWheelZ; + this._onInputChanged(deviceType, deviceSlot, deviceEvent); + } + } + }; + if (this._usingMacOS && this._isUsingChromium) { + this._pointerMacOSChromeOutEvent = (evt) => { + if (evt.buttons > 1) { + this._pointerCancelEvent(evt); + } + }; + this._elementToAttachTo.addEventListener("lostpointercapture", this._pointerMacOSChromeOutEvent); + } + this._elementToAttachTo.addEventListener(this._eventPrefix + "move", this._pointerMoveEvent); + this._elementToAttachTo.addEventListener(this._eventPrefix + "down", this._pointerDownEvent); + this._elementToAttachTo.addEventListener(this._eventPrefix + "up", this._pointerUpEvent); + this._elementToAttachTo.addEventListener(this._eventPrefix + "cancel", this._pointerCancelEvent); + this._elementToAttachTo.addEventListener("blur", this._pointerBlurEvent); + this._elementToAttachTo.addEventListener(this._wheelEventName, this._pointerWheelEvent, passiveSupported ? { passive: false } : false); + this._pointerInputClearObserver = this._engine.onEndFrameObservable.add(() => { + if (this.isDeviceAvailable(DeviceType.Mouse)) { + const pointer = this._inputs[DeviceType.Mouse][0]; + pointer[PointerInput.MouseWheelX] = 0; + pointer[PointerInput.MouseWheelY] = 0; + pointer[PointerInput.MouseWheelZ] = 0; + } + }); } /** - * Sets the default candidate providers for the scene. - * This sets the getActiveMeshCandidates, getActiveSubMeshCandidates, getIntersectingSubMeshCandidates - * and getCollidingSubMeshCandidates to their default function + * Handle all actions that come from gamepad interaction */ - setDefaultCandidateProviders() { - this.getActiveMeshCandidates = () => this._getDefaultMeshCandidates(); - this.getActiveSubMeshCandidates = (mesh) => this._getDefaultSubMeshCandidates(mesh); - this.getIntersectingSubMeshCandidates = (mesh, localRay) => this._getDefaultSubMeshCandidates(mesh); - this.getCollidingSubMeshCandidates = (mesh, collider) => this._getDefaultSubMeshCandidates(mesh); + _handleGamepadActions() { + this._gamepadConnectedEvent = (evt) => { + this._addGamePad(evt.gamepad); + }; + this._gamepadDisconnectedEvent = (evt) => { + if (this._gamepads) { + const deviceType = this._getGamepadDeviceType(evt.gamepad.id); + const deviceSlot = evt.gamepad.index; + this._unregisterDevice(deviceType, deviceSlot); + delete this._gamepads[deviceSlot]; + } + }; + window.addEventListener("gamepadconnected", this._gamepadConnectedEvent); + window.addEventListener("gamepaddisconnected", this._gamepadDisconnectedEvent); } /** - * Gets the mesh that is currently under the pointer + * Update all non-event based devices with each frame + * @param deviceType Enum specifying device type + * @param deviceSlot "Slot" or index that device is referenced in + * @param inputIndex Id of input to be checked */ - get meshUnderPointer() { - return this._inputManager.meshUnderPointer; + _updateDevice(deviceType, deviceSlot, inputIndex) { + const gp = navigator.getGamepads()[deviceSlot]; + if (gp && deviceType === this._gamepads[deviceSlot]) { + const device = this._inputs[deviceType][deviceSlot]; + if (inputIndex >= gp.buttons.length) { + device[inputIndex] = gp.axes[inputIndex - gp.buttons.length].valueOf(); + } else { + device[inputIndex] = gp.buttons[inputIndex].value; + } + } } /** - * Gets or sets the current on-screen X position of the pointer + * Gets DeviceType from the device name + * @param deviceName Name of Device from DeviceInputSystem + * @returns DeviceType enum value */ - get pointerX() { - return this._inputManager.pointerX; - } - set pointerX(value) { - this._inputManager.pointerX = value; + _getGamepadDeviceType(deviceName) { + if (deviceName.indexOf("054c") !== -1) { + return deviceName.indexOf("0ce6") !== -1 ? DeviceType.DualSense : DeviceType.DualShock; + } else if (deviceName.indexOf("Xbox One") !== -1 || deviceName.search("Xbox 360") !== -1 || deviceName.search("xinput") !== -1) { + return DeviceType.Xbox; + } else if (deviceName.indexOf("057e") !== -1) { + return DeviceType.Switch; + } + return DeviceType.Generic; } /** - * Gets or sets the current on-screen Y position of the pointer + * Get DeviceType from a given pointer/mouse/touch event. + * @param evt PointerEvent to evaluate + * @returns DeviceType interpreted from event */ - get pointerY() { - return this._inputManager.pointerY; + _getPointerType(evt) { + let deviceType = DeviceType.Mouse; + if (evt.pointerType === "touch" || evt.pointerType === "pen" || evt.touches) { + deviceType = DeviceType.Touch; + } + return deviceType; } - set pointerY(value) { - this._inputManager.pointerY = value; +}; + +// node_modules/@babylonjs/core/DeviceInput/internalDeviceSourceManager.js +var InternalDeviceSourceManager = class { + constructor(engine) { + this._registeredManagers = new Array(); + this._refCount = 0; + this.registerManager = (manager) => { + for (let deviceType = 0; deviceType < this._devices.length; deviceType++) { + const device = this._devices[deviceType]; + for (const deviceSlotKey in device) { + const deviceSlot = +deviceSlotKey; + manager._addDevice(new DeviceSource(this._deviceInputSystem, deviceType, deviceSlot)); + } + } + this._registeredManagers.push(manager); + }; + this.unregisterManager = (manager) => { + const idx = this._registeredManagers.indexOf(manager); + if (idx > -1) { + this._registeredManagers.splice(idx, 1); + } + }; + const numberOfDeviceTypes = Object.keys(DeviceType).length / 2; + this._devices = new Array(numberOfDeviceTypes); + const onDeviceConnected = (deviceType, deviceSlot) => { + if (!this._devices[deviceType]) { + this._devices[deviceType] = new Array(); + } + if (!this._devices[deviceType][deviceSlot]) { + this._devices[deviceType][deviceSlot] = deviceSlot; + } + for (const manager of this._registeredManagers) { + const deviceSource = new DeviceSource(this._deviceInputSystem, deviceType, deviceSlot); + manager._addDevice(deviceSource); + } + }; + const onDeviceDisconnected = (deviceType, deviceSlot) => { + var _a; + if ((_a = this._devices[deviceType]) == null ? void 0 : _a[deviceSlot]) { + delete this._devices[deviceType][deviceSlot]; + } + for (const manager of this._registeredManagers) { + manager._removeDevice(deviceType, deviceSlot); + } + }; + const onInputChanged = (deviceType, deviceSlot, eventData) => { + if (eventData) { + for (const manager of this._registeredManagers) { + manager._onInputChanged(deviceType, deviceSlot, eventData); + } + } + }; + if (typeof _native !== "undefined") { + this._deviceInputSystem = new NativeDeviceInputSystem(onDeviceConnected, onDeviceDisconnected, onInputChanged); + } else { + this._deviceInputSystem = new WebDeviceInputSystem(engine, onDeviceConnected, onDeviceDisconnected, onInputChanged); + } + } + dispose() { + this._deviceInputSystem.dispose(); } +}; + +// node_modules/@babylonjs/core/DeviceInput/InputDevices/deviceSourceManager.js +var DeviceSourceManager = class { + // Public Functions /** - * Gets the cached material (ie. the latest rendered one) - * @returns the cached material + * Gets a DeviceSource, given a type and slot + * @param deviceType - Type of Device + * @param deviceSlot - Slot or ID of device + * @returns DeviceSource */ - getCachedMaterial() { - return this._cachedMaterial; + getDeviceSource(deviceType, deviceSlot) { + if (deviceSlot === void 0) { + if (this._firstDevice[deviceType] === void 0) { + return null; + } + deviceSlot = this._firstDevice[deviceType]; + } + if (!this._devices[deviceType] || this._devices[deviceType][deviceSlot] === void 0) { + return null; + } + return this._devices[deviceType][deviceSlot]; } /** - * Gets the cached effect (ie. the latest rendered one) - * @returns the cached effect + * Gets an array of DeviceSource objects for a given device type + * @param deviceType - Type of Device + * @returns All available DeviceSources of a given type */ - getCachedEffect() { - return this._cachedEffect; + getDeviceSources(deviceType) { + if (!this._devices[deviceType]) { + return []; + } + return this._devices[deviceType].filter((source) => { + return !!source; + }); } /** - * Gets the cached visibility state (ie. the latest rendered one) - * @returns the cached visibility state + * Default constructor + * @param engine - Used to get canvas (if applicable) */ - getCachedVisibility() { - return this._cachedVisibility; - } - /** - * Gets a boolean indicating if the current material / effect / visibility must be bind again - * @param material defines the current material - * @param effect defines the current effect - * @param visibility defines the current visibility state - * @returns true if one parameter is not cached - */ - isCachedMaterialInvalid(material, effect, visibility = 1) { - return this._cachedEffect !== effect || this._cachedMaterial !== material || this._cachedVisibility !== visibility; + constructor(engine) { + const numberOfDeviceTypes = Object.keys(DeviceType).length / 2; + this._devices = new Array(numberOfDeviceTypes); + this._firstDevice = new Array(numberOfDeviceTypes); + this._engine = engine; + if (!this._engine._deviceSourceManager) { + this._engine._deviceSourceManager = new InternalDeviceSourceManager(engine); + } + this._engine._deviceSourceManager._refCount++; + this.onDeviceConnectedObservable = new Observable((observer2) => { + for (const devices of this._devices) { + if (devices) { + for (const device of devices) { + if (device) { + this.onDeviceConnectedObservable.notifyObserver(observer2, device); + } + } + } + } + }); + this.onDeviceDisconnectedObservable = new Observable(); + this._engine._deviceSourceManager.registerManager(this); + this._onDisposeObserver = engine.onDisposeObservable.add(() => { + this.dispose(); + }); } /** - * Gets the engine associated with the scene - * @returns an Engine + * Dispose of DeviceSourceManager */ - getEngine() { - return this._engine; + dispose() { + this.onDeviceConnectedObservable.clear(); + this.onDeviceDisconnectedObservable.clear(); + if (this._engine._deviceSourceManager) { + this._engine._deviceSourceManager.unregisterManager(this); + if (--this._engine._deviceSourceManager._refCount < 1) { + this._engine._deviceSourceManager.dispose(); + delete this._engine._deviceSourceManager; + } + } + this._engine.onDisposeObservable.remove(this._onDisposeObserver); } + // Hidden Functions /** - * Gets the total number of vertices rendered per frame - * @returns the total number of vertices rendered per frame + * @param deviceSource - Source to add + * @internal */ - getTotalVertices() { - return this._totalVertices.current; + _addDevice(deviceSource) { + if (!this._devices[deviceSource.deviceType]) { + this._devices[deviceSource.deviceType] = new Array(); + } + if (!this._devices[deviceSource.deviceType][deviceSource.deviceSlot]) { + this._devices[deviceSource.deviceType][deviceSource.deviceSlot] = deviceSource; + this._updateFirstDevices(deviceSource.deviceType); + } + this.onDeviceConnectedObservable.notifyObservers(deviceSource); } /** - * Gets the performance counter for total vertices - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation + * @param deviceType - DeviceType + * @param deviceSlot - DeviceSlot + * @internal */ - get totalVerticesPerfCounter() { - return this._totalVertices; + _removeDevice(deviceType, deviceSlot) { + var _a, _b; + const deviceSource = (_a = this._devices[deviceType]) == null ? void 0 : _a[deviceSlot]; + this.onDeviceDisconnectedObservable.notifyObservers(deviceSource); + if ((_b = this._devices[deviceType]) == null ? void 0 : _b[deviceSlot]) { + delete this._devices[deviceType][deviceSlot]; + } + this._updateFirstDevices(deviceType); } /** - * Gets the total number of active indices rendered per frame (You can deduce the number of rendered triangles by dividing this number by 3) - * @returns the total number of active indices rendered per frame + * @param deviceType - DeviceType + * @param deviceSlot - DeviceSlot + * @param eventData - Event + * @internal */ - getActiveIndices() { - return this._activeIndices.current; + _onInputChanged(deviceType, deviceSlot, eventData) { + var _a, _b; + (_b = (_a = this._devices[deviceType]) == null ? void 0 : _a[deviceSlot]) == null ? void 0 : _b.onInputChangedObservable.notifyObservers(eventData); } - /** - * Gets the performance counter for active indices - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation - */ - get totalActiveIndicesPerfCounter() { - return this._activeIndices; + // Private Functions + _updateFirstDevices(type) { + switch (type) { + case DeviceType.Keyboard: + case DeviceType.Mouse: + this._firstDevice[type] = 0; + break; + case DeviceType.Touch: + case DeviceType.DualSense: + case DeviceType.DualShock: + case DeviceType.Xbox: + case DeviceType.Switch: + case DeviceType.Generic: { + delete this._firstDevice[type]; + const devices = this._devices[type]; + if (devices) { + for (let i = 0; i < devices.length; i++) { + if (devices[i]) { + this._firstDevice[type] = i; + break; + } + } + } + break; + } + } } +}; + +// node_modules/@babylonjs/core/Misc/perfCounter.js +var PerfCounter = class _PerfCounter { /** - * Gets the total number of active particles rendered per frame - * @returns the total number of active particles rendered per frame + * Returns the smallest value ever */ - getActiveParticles() { - return this._activeParticles.current; + get min() { + return this._min; } /** - * Gets the performance counter for active particles - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation + * Returns the biggest value ever */ - get activeParticlesPerfCounter() { - return this._activeParticles; + get max() { + return this._max; } /** - * Gets the total number of active bones rendered per frame - * @returns the total number of active bones rendered per frame + * Returns the average value since the performance counter is running */ - getActiveBones() { - return this._activeBones.current; + get average() { + return this._average; } /** - * Gets the performance counter for active bones - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation + * Returns the average value of the last second the counter was monitored */ - get activeBonesPerfCounter() { - return this._activeBones; + get lastSecAverage() { + return this._lastSecAverage; } /** - * Gets the array of active meshes - * @returns an array of AbstractMesh + * Returns the current value */ - getActiveMeshes() { - return this._activeMeshes; + get current() { + return this._current; } /** - * Gets the animation ratio (which is 1.0 is the scene renders at 60fps and 2 if the scene renders at 30fps, etc.) - * @returns a number + * Gets the accumulated total */ - getAnimationRatio() { - return this._animationRatio !== void 0 ? this._animationRatio : 1; + get total() { + return this._totalAccumulated; } /** - * Gets an unique Id for the current render phase - * @returns a number + * Gets the total value count */ - getRenderId() { - return this._renderId; + get count() { + return this._totalValueCount; } /** - * Gets an unique Id for the current frame - * @returns a number + * Creates a new counter */ - getFrameId() { - return this._frameId; - } - /** Call this function if you want to manually increment the render Id*/ - incrementRenderId() { - this._renderId++; - } - _createUbo() { - this.setSceneUniformBuffer(this.createSceneUniformBuffer()); + constructor() { + this._startMonitoringTime = 0; + this._min = 0; + this._max = 0; + this._average = 0; + this._lastSecAverage = 0; + this._current = 0; + this._totalValueCount = 0; + this._totalAccumulated = 0; + this._lastSecAccumulated = 0; + this._lastSecTime = 0; + this._lastSecValueCount = 0; } /** - * Use this method to simulate a pointer move on a mesh - * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay - * @param pickResult pickingInfo of the object wished to simulate pointer event on - * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch) - * @returns the current scene + * Call this method to start monitoring a new frame. + * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the start of the frame, then beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count. */ - simulatePointerMove(pickResult, pointerEventInit) { - this._inputManager.simulatePointerMove(pickResult, pointerEventInit); - return this; + fetchNewFrame() { + this._totalValueCount++; + this._current = 0; + this._lastSecValueCount++; } /** - * Use this method to simulate a pointer down on a mesh - * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay - * @param pickResult pickingInfo of the object wished to simulate pointer event on - * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch) - * @returns the current scene + * Call this method to monitor a count of something (e.g. mesh drawn in viewport count) + * @param newCount the count value to add to the monitored count + * @param fetchResult true when it's the last time in the frame you add to the counter and you wish to update the statistics properties (min/max/average), false if you only want to update statistics. */ - simulatePointerDown(pickResult, pointerEventInit) { - this._inputManager.simulatePointerDown(pickResult, pointerEventInit); - return this; + addCount(newCount, fetchResult) { + if (!_PerfCounter.Enabled) { + return; + } + this._current += newCount; + if (fetchResult) { + this._fetchResult(); + } } /** - * Use this method to simulate a pointer up on a mesh - * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay - * @param pickResult pickingInfo of the object wished to simulate pointer event on - * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch) - * @param doubleTap indicates that the pointer up event should be considered as part of a double click (false by default) - * @returns the current scene + * Start monitoring this performance counter */ - simulatePointerUp(pickResult, pointerEventInit, doubleTap) { - this._inputManager.simulatePointerUp(pickResult, pointerEventInit, doubleTap); - return this; + beginMonitoring() { + if (!_PerfCounter.Enabled) { + return; + } + this._startMonitoringTime = PrecisionDate.Now; } /** - * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down) - * @param pointerId defines the pointer id to use in a multi-touch scenario (0 by default) - * @returns true if the pointer was captured + * Compute the time lapsed since the previous beginMonitoring() call. + * @param newFrame true by default to fetch the result and monitor a new frame, if false the time monitored will be added to the current frame counter */ - isPointerCaptured(pointerId = 0) { - return this._inputManager.isPointerCaptured(pointerId); + endMonitoring(newFrame = true) { + if (!_PerfCounter.Enabled) { + return; + } + if (newFrame) { + this.fetchNewFrame(); + } + const currentTime = PrecisionDate.Now; + this._current = currentTime - this._startMonitoringTime; + if (newFrame) { + this._fetchResult(); + } } /** - * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp - * @param attachUp defines if you want to attach events to pointerup - * @param attachDown defines if you want to attach events to pointerdown - * @param attachMove defines if you want to attach events to pointermove + * Call this method to end the monitoring of a frame. + * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the end of the frame, after beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count. */ - attachControl(attachUp = true, attachDown = true, attachMove = true) { - this._inputManager.attachControl(attachUp, attachDown, attachMove); + endFrame() { + this._fetchResult(); } - /** Detaches all event handlers*/ - detachControl() { - this._inputManager.detachControl(); + /** @internal */ + _fetchResult() { + this._totalAccumulated += this._current; + this._lastSecAccumulated += this._current; + this._min = Math.min(this._min, this._current); + this._max = Math.max(this._max, this._current); + this._average = this._totalAccumulated / this._totalValueCount; + const now = PrecisionDate.Now; + if (now - this._lastSecTime > 1e3) { + this._lastSecAverage = this._lastSecAccumulated / this._lastSecValueCount; + this._lastSecTime = now; + this._lastSecAccumulated = 0; + this._lastSecValueCount = 0; + } } +}; +PerfCounter.Enabled = true; + +// node_modules/@babylonjs/core/Maths/math.frustum.js +var Frustum = class _Frustum { /** - * This function will check if the scene can be rendered (textures are loaded, shaders are compiled) - * Delay loaded resources are not taking in account - * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: true) - * @returns true if all required resources are ready + * Gets the planes representing the frustum + * @param transform matrix to be applied to the returned planes + * @returns a new array of 6 Frustum planes computed by the given transformation matrix. */ - isReady(checkRenderTargets = true) { - var _a, _b; - if (this._isDisposed) { - return false; - } - let index; - const engine = this.getEngine(); - const currentRenderPassId = engine.currentRenderPassId; - engine.currentRenderPassId = ((_a = this.activeCamera) == null ? void 0 : _a.renderPassId) ?? currentRenderPassId; - let isReady = true; - if (this._pendingData.length > 0) { - isReady = false; - } - (_b = this.prePassRenderer) == null ? void 0 : _b.update(); - if (this.useOrderIndependentTransparency && this.depthPeelingRenderer) { - isReady && (isReady = this.depthPeelingRenderer.isReady()); - } - if (checkRenderTargets) { - this._processedMaterials.reset(); - this._materialsRenderTargets.reset(); - } - for (index = 0; index < this.meshes.length; index++) { - const mesh = this.meshes[index]; - if (!mesh.subMeshes || mesh.subMeshes.length === 0) { - continue; - } - if (!mesh.isReady(true)) { - isReady = false; - continue; - } - const hardwareInstancedRendering = mesh.hasThinInstances || mesh.getClassName() === "InstancedMesh" || mesh.getClassName() === "InstancedLinesMesh" || engine.getCaps().instancedArrays && mesh.instances.length > 0; - for (const step of this._isReadyForMeshStage) { - if (!step.action(mesh, hardwareInstancedRendering)) { - isReady = false; - } - } - if (!checkRenderTargets) { - continue; - } - const mat = mesh.material || this.defaultMaterial; - if (mat) { - if (mat._storeEffectOnSubMeshes) { - for (const subMesh of mesh.subMeshes) { - const material = subMesh.getMaterial(); - if (material && material.hasRenderTargetTextures && material.getRenderTargetTextures != null) { - if (this._processedMaterials.indexOf(material) === -1) { - this._processedMaterials.push(material); - this._materialsRenderTargets.concatWithNoDuplicate(material.getRenderTargetTextures()); - } - } - } - } else { - if (mat.hasRenderTargetTextures && mat.getRenderTargetTextures != null) { - if (this._processedMaterials.indexOf(mat) === -1) { - this._processedMaterials.push(mat); - this._materialsRenderTargets.concatWithNoDuplicate(mat.getRenderTargetTextures()); - } - } - } - } - } - if (checkRenderTargets) { - for (index = 0; index < this._materialsRenderTargets.length; ++index) { - const rtt = this._materialsRenderTargets.data[index]; - if (!rtt.isReadyForRendering()) { - isReady = false; - } - } - } - for (index = 0; index < this.geometries.length; index++) { - const geometry = this.geometries[index]; - if (geometry.delayLoadState === 2) { - isReady = false; - } - } - if (this.activeCameras && this.activeCameras.length > 0) { - for (const camera of this.activeCameras) { - if (!camera.isReady(true)) { - isReady = false; - } - } - } else if (this.activeCamera) { - if (!this.activeCamera.isReady(true)) { - isReady = false; - } - } - for (const particleSystem of this.particleSystems) { - if (!particleSystem.isReady()) { - isReady = false; - } - } - if (this.layers) { - for (const layer of this.layers) { - if (!layer.isReady()) { - isReady = false; - } - } - } - if (!engine.areAllEffectsReady()) { - isReady = false; + static GetPlanes(transform) { + const frustumPlanes = []; + for (let index = 0; index < 6; index++) { + frustumPlanes.push(new Plane(0, 0, 0, 0)); } - engine.currentRenderPassId = currentRenderPassId; - return isReady; - } - /** Resets all cached information relative to material (including effect and visibility) */ - resetCachedMaterial() { - this._cachedMaterial = null; - this._cachedEffect = null; - this._cachedVisibility = null; + _Frustum.GetPlanesToRef(transform, frustumPlanes); + return frustumPlanes; } /** - * Registers a function to be called before every frame render - * @param func defines the function to register + * Gets the near frustum plane transformed by the transform matrix + * @param transform transformation matrix to be applied to the resulting frustum plane + * @param frustumPlane the resulting frustum plane */ - registerBeforeRender(func) { - this.onBeforeRenderObservable.add(func); + static GetNearPlaneToRef(transform, frustumPlane) { + const m = transform.m; + frustumPlane.normal.x = m[3] + m[2]; + frustumPlane.normal.y = m[7] + m[6]; + frustumPlane.normal.z = m[11] + m[10]; + frustumPlane.d = m[15] + m[14]; + frustumPlane.normalize(); } /** - * Unregisters a function called before every frame render - * @param func defines the function to unregister + * Gets the far frustum plane transformed by the transform matrix + * @param transform transformation matrix to be applied to the resulting frustum plane + * @param frustumPlane the resulting frustum plane */ - unregisterBeforeRender(func) { - this.onBeforeRenderObservable.removeCallback(func); + static GetFarPlaneToRef(transform, frustumPlane) { + const m = transform.m; + frustumPlane.normal.x = m[3] - m[2]; + frustumPlane.normal.y = m[7] - m[6]; + frustumPlane.normal.z = m[11] - m[10]; + frustumPlane.d = m[15] - m[14]; + frustumPlane.normalize(); } /** - * Registers a function to be called after every frame render - * @param func defines the function to register + * Gets the left frustum plane transformed by the transform matrix + * @param transform transformation matrix to be applied to the resulting frustum plane + * @param frustumPlane the resulting frustum plane */ - registerAfterRender(func) { - this.onAfterRenderObservable.add(func); + static GetLeftPlaneToRef(transform, frustumPlane) { + const m = transform.m; + frustumPlane.normal.x = m[3] + m[0]; + frustumPlane.normal.y = m[7] + m[4]; + frustumPlane.normal.z = m[11] + m[8]; + frustumPlane.d = m[15] + m[12]; + frustumPlane.normalize(); } /** - * Unregisters a function called after every frame render - * @param func defines the function to unregister + * Gets the right frustum plane transformed by the transform matrix + * @param transform transformation matrix to be applied to the resulting frustum plane + * @param frustumPlane the resulting frustum plane */ - unregisterAfterRender(func) { - this.onAfterRenderObservable.removeCallback(func); - } - _executeOnceBeforeRender(func) { - const execFunc = () => { - func(); - setTimeout(() => { - this.unregisterBeforeRender(execFunc); - }); - }; - this.registerBeforeRender(execFunc); + static GetRightPlaneToRef(transform, frustumPlane) { + const m = transform.m; + frustumPlane.normal.x = m[3] - m[0]; + frustumPlane.normal.y = m[7] - m[4]; + frustumPlane.normal.z = m[11] - m[8]; + frustumPlane.d = m[15] - m[12]; + frustumPlane.normalize(); } /** - * The provided function will run before render once and will be disposed afterwards. - * A timeout delay can be provided so that the function will be executed in N ms. - * The timeout is using the browser's native setTimeout so time percision cannot be guaranteed. - * @param func The function to be executed. - * @param timeout optional delay in ms + * Gets the top frustum plane transformed by the transform matrix + * @param transform transformation matrix to be applied to the resulting frustum plane + * @param frustumPlane the resulting frustum plane */ - executeOnceBeforeRender(func, timeout) { - if (timeout !== void 0) { - setTimeout(() => { - this._executeOnceBeforeRender(func); - }, timeout); - } else { - this._executeOnceBeforeRender(func); - } + static GetTopPlaneToRef(transform, frustumPlane) { + const m = transform.m; + frustumPlane.normal.x = m[3] - m[1]; + frustumPlane.normal.y = m[7] - m[5]; + frustumPlane.normal.z = m[11] - m[9]; + frustumPlane.d = m[15] - m[13]; + frustumPlane.normalize(); } /** - * This function can help adding any object to the list of data awaited to be ready in order to check for a complete scene loading. - * @param data defines the object to wait for + * Gets the bottom frustum plane transformed by the transform matrix + * @param transform transformation matrix to be applied to the resulting frustum plane + * @param frustumPlane the resulting frustum plane */ - addPendingData(data) { - this._pendingData.push(data); + static GetBottomPlaneToRef(transform, frustumPlane) { + const m = transform.m; + frustumPlane.normal.x = m[3] + m[1]; + frustumPlane.normal.y = m[7] + m[5]; + frustumPlane.normal.z = m[11] + m[9]; + frustumPlane.d = m[15] + m[13]; + frustumPlane.normalize(); } /** - * Remove a pending data from the loading list which has previously been added with addPendingData. - * @param data defines the object to remove from the pending list + * Sets the given array "frustumPlanes" with the 6 Frustum planes computed by the given transformation matrix. + * @param transform transformation matrix to be applied to the resulting frustum planes + * @param frustumPlanes the resulting frustum planes */ - removePendingData(data) { - const wasLoading = this.isLoading; - const index = this._pendingData.indexOf(data); - if (index !== -1) { - this._pendingData.splice(index, 1); - } - if (wasLoading && !this.isLoading) { - this.onDataLoadedObservable.notifyObservers(this); - } + static GetPlanesToRef(transform, frustumPlanes) { + _Frustum.GetNearPlaneToRef(transform, frustumPlanes[0]); + _Frustum.GetFarPlaneToRef(transform, frustumPlanes[1]); + _Frustum.GetLeftPlaneToRef(transform, frustumPlanes[2]); + _Frustum.GetRightPlaneToRef(transform, frustumPlanes[3]); + _Frustum.GetTopPlaneToRef(transform, frustumPlanes[4]); + _Frustum.GetBottomPlaneToRef(transform, frustumPlanes[5]); } /** - * Returns the number of items waiting to be loaded - * @returns the number of items waiting to be loaded + * Tests if a point is located between the frustum planes. + * @param point defines the point to test + * @param frustumPlanes defines the frustum planes to test + * @returns true if the point is located between the frustum planes */ - getWaitingItemsCount() { - return this._pendingData.length; + static IsPointInFrustum(point, frustumPlanes) { + for (let i = 0; i < 6; i++) { + if (frustumPlanes[i].dotCoordinate(point) < 0) { + return false; + } + } + return true; } - /** - * Returns a boolean indicating if the scene is still loading data - */ - get isLoading() { - return this._pendingData.length > 0; +}; + +// node_modules/@babylonjs/core/Inputs/scene.inputManager.js +var _ClickInfo = class { + constructor() { + this._singleClick = false; + this._doubleClick = false; + this._hasSwiped = false; + this._ignore = false; } - /** - * Registers a function to be executed when the scene is ready - * @param func - the function to be executed - * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false) - */ - executeWhenReady(func, checkRenderTargets = false) { - this.onReadyObservable.addOnce(func); - if (this._executeWhenReadyTimeoutId !== null) { - return; - } - this._checkIsReady(checkRenderTargets); + get singleClick() { + return this._singleClick; } - /** - * Returns a promise that resolves when the scene is ready - * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false) - * @returns A promise that resolves when the scene is ready - */ - whenReadyAsync(checkRenderTargets = false) { - return new Promise((resolve) => { - this.executeWhenReady(() => { - resolve(); - }, checkRenderTargets); - }); + get doubleClick() { + return this._doubleClick; } - /** - * @internal - */ - _checkIsReady(checkRenderTargets = false) { - this._registerTransientComponents(); - if (this.isReady(checkRenderTargets)) { - this.onReadyObservable.notifyObservers(this); - this.onReadyObservable.clear(); - this._executeWhenReadyTimeoutId = null; - return; - } - if (this._isDisposed) { - this.onReadyObservable.clear(); - this._executeWhenReadyTimeoutId = null; - return; - } - this._executeWhenReadyTimeoutId = setTimeout(() => { - this.incrementRenderId(); - this._checkIsReady(checkRenderTargets); - }, 100); + get hasSwiped() { + return this._hasSwiped; } - /** - * Gets all animatable attached to the scene - */ - get animatables() { - return this._activeAnimatables; + get ignore() { + return this._ignore; } - /** - * Resets the last animation time frame. - * Useful to override when animations start running when loading a scene for the first time. - */ - resetLastAnimationTimeFrame() { - this._animationTimeLast = PrecisionDate.Now; + set singleClick(b) { + this._singleClick = b; } - // Matrix - /** - * Gets the current view matrix - * @returns a Matrix - */ - getViewMatrix() { - return this._viewMatrix; + set doubleClick(b) { + this._doubleClick = b; } - /** - * Gets the current projection matrix - * @returns a Matrix - */ - getProjectionMatrix() { - return this._projectionMatrix; + set hasSwiped(b) { + this._hasSwiped = b; } - /** - * Gets the current transform matrix - * @returns a Matrix made of View * Projection - */ - getTransformMatrix() { - return this._transformMatrix; + set ignore(b) { + this._ignore = b; } +}; +var InputManager = class _InputManager { /** - * Sets the current transform matrix - * @param viewL defines the View matrix to use - * @param projectionL defines the Projection matrix to use - * @param viewR defines the right View matrix to use (if provided) - * @param projectionR defines the right Projection matrix to use (if provided) + * Creates a new InputManager + * @param scene - defines the hosting scene */ - setTransformMatrix(viewL, projectionL, viewR, projectionR) { - if (!viewR && !projectionR && this._multiviewSceneUbo) { - this._multiviewSceneUbo.dispose(); - this._multiviewSceneUbo = null; - } - if (this._viewUpdateFlag === viewL.updateFlag && this._projectionUpdateFlag === projectionL.updateFlag) { + constructor(scene) { + this._alreadyAttached = false; + this._meshPickProceed = false; + this._currentPickResult = null; + this._previousPickResult = null; + this._totalPointersPressed = 0; + this._doubleClickOccured = false; + this._isSwiping = false; + this._swipeButtonPressed = -1; + this._skipPointerTap = false; + this._isMultiTouchGesture = false; + this._pointerX = 0; + this._pointerY = 0; + this._startingPointerPosition = new Vector2(0, 0); + this._previousStartingPointerPosition = new Vector2(0, 0); + this._startingPointerTime = 0; + this._previousStartingPointerTime = 0; + this._pointerCaptures = {}; + this._meshUnderPointerId = {}; + this._movePointerInfo = null; + this._cameraObserverCount = 0; + this._delayedClicks = [null, null, null, null, null]; + this._deviceSourceManager = null; + this._scene = scene || EngineStore.LastCreatedScene; + if (!this._scene) { return; } - this._viewUpdateFlag = viewL.updateFlag; - this._projectionUpdateFlag = projectionL.updateFlag; - this._viewMatrix = viewL; - this._projectionMatrix = projectionL; - this._viewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix); - if (!this._frustumPlanes) { - this._frustumPlanes = Frustum.GetPlanes(this._transformMatrix); - } else { - Frustum.GetPlanesToRef(this._transformMatrix, this._frustumPlanes); - } - if (this._multiviewSceneUbo && this._multiviewSceneUbo.useUbo) { - this._updateMultiviewUbo(viewR, projectionR); - } else if (this._sceneUbo.useUbo) { - this._sceneUbo.updateMatrix("viewProjection", this._transformMatrix); - this._sceneUbo.updateMatrix("view", this._viewMatrix); - this._sceneUbo.updateMatrix("projection", this._projectionMatrix); - } } /** - * Gets the uniform buffer used to store scene data - * @returns a UniformBuffer + * Gets the mesh that is currently under the pointer + * @returns Mesh that the pointer is pointer is hovering over */ - getSceneUniformBuffer() { - return this._multiviewSceneUbo ? this._multiviewSceneUbo : this._sceneUbo; + get meshUnderPointer() { + if (this._movePointerInfo) { + this._movePointerInfo._generatePickInfo(); + this._movePointerInfo = null; + } + return this._pointerOverMesh; } /** - * Creates a scene UBO - * @param name name of the uniform buffer (optional, for debugging purpose only) - * @returns a new ubo + * When using more than one pointer (for example in XR) you can get the mesh under the specific pointer + * @param pointerId - the pointer id to use + * @returns The mesh under this pointer id or null if not found */ - createSceneUniformBuffer(name69) { - const sceneUbo = new UniformBuffer(this._engine, void 0, false, name69 ?? "scene"); - sceneUbo.addUniform("viewProjection", 16); - sceneUbo.addUniform("view", 16); - sceneUbo.addUniform("projection", 16); - sceneUbo.addUniform("vEyePosition", 4); - return sceneUbo; + getMeshUnderPointerByPointerId(pointerId) { + return this._meshUnderPointerId[pointerId] || null; } /** - * Sets the scene ubo - * @param ubo the ubo to set for the scene + * Gets the pointer coordinates in 2D without any translation (ie. straight out of the pointer event) + * @returns Vector with X/Y values directly from pointer event */ - setSceneUniformBuffer(ubo) { - this._sceneUbo = ubo; - this._viewUpdateFlag = -1; - this._projectionUpdateFlag = -1; + get unTranslatedPointer() { + return new Vector2(this._unTranslatedPointerX, this._unTranslatedPointerY); } /** - * Gets an unique (relatively to the current scene) Id - * @returns an unique number for the scene + * Gets or sets the current on-screen X position of the pointer + * @returns Translated X with respect to screen */ - getUniqueId() { - return UniqueIdGenerator.UniqueId; + get pointerX() { + return this._pointerX; + } + set pointerX(value) { + this._pointerX = value; } /** - * Add a mesh to the list of scene's meshes - * @param newMesh defines the mesh to add - * @param recursive if all child meshes should also be added to the scene + * Gets or sets the current on-screen Y position of the pointer + * @returns Translated Y with respect to screen */ - addMesh(newMesh, recursive = false) { - if (this._blockEntityCollection) { + get pointerY() { + return this._pointerY; + } + set pointerY(value) { + this._pointerY = value; + } + _updatePointerPosition(evt) { + const canvasRect = this._scene.getEngine().getInputElementClientRect(); + if (!canvasRect) { return; } - this.meshes.push(newMesh); - newMesh._resyncLightSources(); - if (!newMesh.parent) { - newMesh._addToSceneRootNodes(); - } - this.onNewMeshAddedObservable.notifyObservers(newMesh); - if (recursive) { - newMesh.getChildMeshes().forEach((m) => { - this.addMesh(m); - }); - } + this._pointerX = evt.clientX - canvasRect.left; + this._pointerY = evt.clientY - canvasRect.top; + this._unTranslatedPointerX = this._pointerX; + this._unTranslatedPointerY = this._pointerY; } - /** - * Remove a mesh for the list of scene's meshes - * @param toRemove defines the mesh to remove - * @param recursive if all child meshes should also be removed from the scene - * @returns the index where the mesh was in the mesh list - */ - removeMesh(toRemove, recursive = false) { - const index = this.meshes.indexOf(toRemove); - if (index !== -1) { - this.meshes[index] = this.meshes[this.meshes.length - 1]; - this.meshes.pop(); - if (!toRemove.parent) { - toRemove._removeFromSceneRootNodes(); + _processPointerMove(pickResult, evt) { + const scene = this._scene; + const engine = scene.getEngine(); + const canvas = engine.getInputElement(); + if (canvas) { + canvas.tabIndex = engine.canvasTabIndex; + if (!scene.doNotHandleCursors) { + canvas.style.cursor = scene.defaultCursor; } } - this._inputManager._invalidateMesh(toRemove); - this.onMeshRemovedObservable.notifyObservers(toRemove); - if (recursive) { - toRemove.getChildMeshes().forEach((m) => { - this.removeMesh(m); - }); + this._setCursorAndPointerOverMesh(pickResult, evt, scene); + for (const step of scene._pointerMoveStage) { + pickResult = pickResult || this._pickMove(evt); + const isMeshPicked = (pickResult == null ? void 0 : pickResult.pickedMesh) ? true : false; + pickResult = step.action(this._unTranslatedPointerX, this._unTranslatedPointerY, pickResult, isMeshPicked, canvas); } - return index; - } - /** - * Add a transform node to the list of scene's transform nodes - * @param newTransformNode defines the transform node to add - */ - addTransformNode(newTransformNode) { - if (this._blockEntityCollection) { - return; + const type = evt.inputIndex >= PointerInput.MouseWheelX && evt.inputIndex <= PointerInput.MouseWheelZ ? PointerEventTypes.POINTERWHEEL : PointerEventTypes.POINTERMOVE; + if (scene.onPointerMove) { + pickResult = pickResult || this._pickMove(evt); + scene.onPointerMove(evt, pickResult, type); } - if (newTransformNode.getScene() === this && newTransformNode._indexInSceneTransformNodesArray !== -1) { - return; + let pointerInfo; + if (pickResult) { + pointerInfo = new PointerInfo(type, evt, pickResult); + this._setRayOnPointerInfo(pickResult, evt); + } else { + pointerInfo = new PointerInfo(type, evt, null, this); + this._movePointerInfo = pointerInfo; } - newTransformNode._indexInSceneTransformNodesArray = this.transformNodes.length; - this.transformNodes.push(newTransformNode); - if (!newTransformNode.parent) { - newTransformNode._addToSceneRootNodes(); + if (scene.onPointerObservable.hasObservers()) { + scene.onPointerObservable.notifyObservers(pointerInfo, type); } - this.onNewTransformNodeAddedObservable.notifyObservers(newTransformNode); } - /** - * Remove a transform node for the list of scene's transform nodes - * @param toRemove defines the transform node to remove - * @returns the index where the transform node was in the transform node list - */ - removeTransformNode(toRemove) { - const index = toRemove._indexInSceneTransformNodesArray; - if (index !== -1) { - if (index !== this.transformNodes.length - 1) { - const lastNode = this.transformNodes[this.transformNodes.length - 1]; - this.transformNodes[index] = lastNode; - lastNode._indexInSceneTransformNodesArray = index; - } - toRemove._indexInSceneTransformNodesArray = -1; - this.transformNodes.pop(); - if (!toRemove.parent) { - toRemove._removeFromSceneRootNodes(); + // Pointers handling + /** @internal */ + _setRayOnPointerInfo(pickInfo, event) { + const scene = this._scene; + if (pickInfo && scene._pickingAvailable) { + if (!pickInfo.ray) { + pickInfo.ray = scene.createPickingRay(event.offsetX, event.offsetY, Matrix.Identity(), scene.activeCamera); } } - this.onTransformNodeRemovedObservable.notifyObservers(toRemove); - return index; } - /** - * Remove a skeleton for the list of scene's skeletons - * @param toRemove defines the skeleton to remove - * @returns the index where the skeleton was in the skeleton list - */ - removeSkeleton(toRemove) { - const index = this.skeletons.indexOf(toRemove); - if (index !== -1) { - this.skeletons.splice(index, 1); - this.onSkeletonRemovedObservable.notifyObservers(toRemove); - this._executeActiveContainerCleanup(this._activeSkeletons); - } - return index; + /** @internal */ + _addCameraPointerObserver(observer2, mask) { + this._cameraObserverCount++; + return this._scene.onPointerObservable.add(observer2, mask); } - /** - * Remove a morph target for the list of scene's morph targets - * @param toRemove defines the morph target to remove - * @returns the index where the morph target was in the morph target list - */ - removeMorphTargetManager(toRemove) { - const index = this.morphTargetManagers.indexOf(toRemove); - if (index !== -1) { - this.morphTargetManagers.splice(index, 1); - } - return index; + /** @internal */ + _removeCameraPointerObserver(observer2) { + this._cameraObserverCount--; + return this._scene.onPointerObservable.remove(observer2); } - /** - * Remove a light for the list of scene's lights - * @param toRemove defines the light to remove - * @returns the index where the light was in the light list - */ - removeLight(toRemove) { - const index = this.lights.indexOf(toRemove); - if (index !== -1) { - for (const mesh of this.meshes) { - mesh._removeLightSource(toRemove, false); - } - this.lights.splice(index, 1); - this.sortLightsByPriority(); - if (!toRemove.parent) { - toRemove._removeFromSceneRootNodes(); - } - } - this.onLightRemovedObservable.notifyObservers(toRemove); - return index; + _checkForPicking() { + return !!(this._scene.onPointerObservable.observers.length > this._cameraObserverCount || this._scene.onPointerPick); } - /** - * Remove a camera for the list of scene's cameras - * @param toRemove defines the camera to remove - * @returns the index where the camera was in the camera list - */ - removeCamera(toRemove) { - const index = this.cameras.indexOf(toRemove); - if (index !== -1) { - this.cameras.splice(index, 1); - if (!toRemove.parent) { - toRemove._removeFromSceneRootNodes(); + _checkPrePointerObservable(pickResult, evt, type) { + const scene = this._scene; + const pi = new PointerInfoPre(type, evt, this._unTranslatedPointerX, this._unTranslatedPointerY); + if (pickResult) { + pi.originalPickingInfo = pickResult; + pi.ray = pickResult.ray; + if (evt.pointerType === "xr-near" && pickResult.originMesh) { + pi.nearInteractionPickingInfo = pickResult; } } - if (this.activeCameras) { - const index2 = this.activeCameras.indexOf(toRemove); - if (index2 !== -1) { - this.activeCameras.splice(index2, 1); - } + scene.onPrePointerObservable.notifyObservers(pi, type); + if (pi.skipOnPointerObservable) { + return true; + } else { + return false; } - if (this.activeCamera === toRemove) { - if (this.cameras.length > 0) { - this.activeCamera = this.cameras[0]; - } else { - this.activeCamera = null; + } + /** @internal */ + _pickMove(evt) { + const scene = this._scene; + const pickResult = scene.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, scene.pointerMovePredicate, scene.pointerMoveFastCheck, scene.cameraToUseForPointers, scene.pointerMoveTrianglePredicate); + this._setCursorAndPointerOverMesh(pickResult, evt, scene); + return pickResult; + } + _setCursorAndPointerOverMesh(pickResult, evt, scene) { + const engine = scene.getEngine(); + const canvas = engine.getInputElement(); + if (pickResult == null ? void 0 : pickResult.pickedMesh) { + this.setPointerOverMesh(pickResult.pickedMesh, evt.pointerId, pickResult, evt); + if (!scene.doNotHandleCursors && canvas && this._pointerOverMesh) { + const actionManager = this._pointerOverMesh._getActionManagerForTrigger(); + if (actionManager && actionManager.hasPointerTriggers) { + canvas.style.cursor = actionManager.hoverCursor || scene.hoverCursor; + } } + } else { + this.setPointerOverMesh(null, evt.pointerId, pickResult, evt); } - this.onCameraRemovedObservable.notifyObservers(toRemove); - return index; } /** - * Remove a particle system for the list of scene's particle systems - * @param toRemove defines the particle system to remove - * @returns the index where the particle system was in the particle system list + * Use this method to simulate a pointer move on a mesh + * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay + * @param pickResult - pickingInfo of the object wished to simulate pointer event on + * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch) */ - removeParticleSystem(toRemove) { - const index = this.particleSystems.indexOf(toRemove); - if (index !== -1) { - this.particleSystems.splice(index, 1); - this._executeActiveContainerCleanup(this._activeParticleSystems); + simulatePointerMove(pickResult, pointerEventInit) { + const evt = new PointerEvent("pointermove", pointerEventInit); + evt.inputIndex = PointerInput.Move; + if (this._checkPrePointerObservable(pickResult, evt, PointerEventTypes.POINTERMOVE)) { + return; } - return index; + this._processPointerMove(pickResult, evt); } /** - * Remove a animation for the list of scene's animations - * @param toRemove defines the animation to remove - * @returns the index where the animation was in the animation list + * Use this method to simulate a pointer down on a mesh + * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay + * @param pickResult - pickingInfo of the object wished to simulate pointer event on + * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch) */ - removeAnimation(toRemove) { - const index = this.animations.indexOf(toRemove); - if (index !== -1) { - this.animations.splice(index, 1); - } - return index; - } - /** - * Will stop the animation of the given target - * @param target - the target - * @param animationName - the name of the animation to stop (all animations will be stopped if both this and targetMask are empty) - * @param targetMask - a function that determines if the animation should be stopped based on its target (all animations will be stopped if both this and animationName are empty) - */ - stopAnimation(target, animationName, targetMask) { - } - /** - * Removes the given animation group from this scene. - * @param toRemove The animation group to remove - * @returns The index of the removed animation group - */ - removeAnimationGroup(toRemove) { - const index = this.animationGroups.indexOf(toRemove); - if (index !== -1) { - this.animationGroups.splice(index, 1); - } - return index; - } - /** - * Removes the given multi-material from this scene. - * @param toRemove The multi-material to remove - * @returns The index of the removed multi-material - */ - removeMultiMaterial(toRemove) { - const index = this.multiMaterials.indexOf(toRemove); - if (index !== -1) { - this.multiMaterials.splice(index, 1); + simulatePointerDown(pickResult, pointerEventInit) { + const evt = new PointerEvent("pointerdown", pointerEventInit); + evt.inputIndex = evt.button + 2; + if (this._checkPrePointerObservable(pickResult, evt, PointerEventTypes.POINTERDOWN)) { + return; } - this.onMultiMaterialRemovedObservable.notifyObservers(toRemove); - return index; + this._processPointerDown(pickResult, evt); } - /** - * Removes the given material from this scene. - * @param toRemove The material to remove - * @returns The index of the removed material - */ - removeMaterial(toRemove) { - const index = toRemove._indexInSceneMaterialArray; - if (index !== -1 && index < this.materials.length) { - if (index !== this.materials.length - 1) { - const lastMaterial = this.materials[this.materials.length - 1]; - this.materials[index] = lastMaterial; - lastMaterial._indexInSceneMaterialArray = index; + _processPointerDown(pickResult, evt) { + const scene = this._scene; + if (pickResult == null ? void 0 : pickResult.pickedMesh) { + this._pickedDownMesh = pickResult.pickedMesh; + const actionManager = pickResult.pickedMesh._getActionManagerForTrigger(); + if (actionManager) { + if (actionManager.hasPickTriggers) { + actionManager.processTrigger(5, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); + switch (evt.button) { + case 0: + actionManager.processTrigger(2, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); + break; + case 1: + actionManager.processTrigger(4, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); + break; + case 2: + actionManager.processTrigger(3, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); + break; + } + } + if (actionManager.hasSpecificTrigger(8)) { + window.setTimeout(() => { + const pickResult2 = scene.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, (mesh) => mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.actionManager && mesh.actionManager.hasSpecificTrigger(8) && mesh === this._pickedDownMesh, false, scene.cameraToUseForPointers); + if ((pickResult2 == null ? void 0 : pickResult2.pickedMesh) && actionManager) { + if (this._totalPointersPressed !== 0 && Date.now() - this._startingPointerTime > _InputManager.LongPressDelay && !this._isPointerSwiping()) { + this._startingPointerTime = 0; + actionManager.processTrigger(8, ActionEvent.CreateNew(pickResult2.pickedMesh, evt)); + } + } + }, _InputManager.LongPressDelay); + } } - toRemove._indexInSceneMaterialArray = -1; - this.materials.pop(); - } - this.onMaterialRemovedObservable.notifyObservers(toRemove); - return index; - } - /** - * Removes the given action manager from this scene. - * @deprecated - * @param toRemove The action manager to remove - * @returns The index of the removed action manager - */ - removeActionManager(toRemove) { - const index = this.actionManagers.indexOf(toRemove); - if (index !== -1) { - this.actionManagers.splice(index, 1); - } - return index; - } - /** - * Removes the given texture from this scene. - * @param toRemove The texture to remove - * @returns The index of the removed texture - */ - removeTexture(toRemove) { - const index = this.textures.indexOf(toRemove); - if (index !== -1) { - this.textures.splice(index, 1); - } - this.onTextureRemovedObservable.notifyObservers(toRemove); - return index; - } - /** - * Adds the given light to this scene - * @param newLight The light to add - */ - addLight(newLight) { - if (this._blockEntityCollection) { - return; - } - this.lights.push(newLight); - this.sortLightsByPriority(); - if (!newLight.parent) { - newLight._addToSceneRootNodes(); - } - for (const mesh of this.meshes) { - if (mesh.lightSources.indexOf(newLight) === -1) { - mesh.lightSources.push(newLight); - mesh._resyncLightSources(); + } else { + for (const step of scene._pointerDownStage) { + pickResult = step.action(this._unTranslatedPointerX, this._unTranslatedPointerY, pickResult, evt, false); } } - this.onNewLightAddedObservable.notifyObservers(newLight); - } - /** - * Sorts the list list based on light priorities - */ - sortLightsByPriority() { - if (this.requireLightSorting) { - this.lights.sort(LightConstants.CompareLightsPriority); - } - } - /** - * Adds the given camera to this scene - * @param newCamera The camera to add - */ - addCamera(newCamera) { - if (this._blockEntityCollection) { - return; - } - this.cameras.push(newCamera); - this.onNewCameraAddedObservable.notifyObservers(newCamera); - if (!newCamera.parent) { - newCamera._addToSceneRootNodes(); - } - } - /** - * Adds the given skeleton to this scene - * @param newSkeleton The skeleton to add - */ - addSkeleton(newSkeleton) { - if (this._blockEntityCollection) { - return; - } - this.skeletons.push(newSkeleton); - this.onNewSkeletonAddedObservable.notifyObservers(newSkeleton); - } - /** - * Adds the given particle system to this scene - * @param newParticleSystem The particle system to add - */ - addParticleSystem(newParticleSystem) { - if (this._blockEntityCollection) { - return; - } - this.particleSystems.push(newParticleSystem); - } - /** - * Adds the given animation to this scene - * @param newAnimation The animation to add - */ - addAnimation(newAnimation) { - if (this._blockEntityCollection) { - return; - } - this.animations.push(newAnimation); - } - /** - * Adds the given animation group to this scene. - * @param newAnimationGroup The animation group to add - */ - addAnimationGroup(newAnimationGroup) { - if (this._blockEntityCollection) { - return; - } - this.animationGroups.push(newAnimationGroup); - } - /** - * Adds the given multi-material to this scene - * @param newMultiMaterial The multi-material to add - */ - addMultiMaterial(newMultiMaterial) { - if (this._blockEntityCollection) { - return; - } - this.multiMaterials.push(newMultiMaterial); - this.onNewMultiMaterialAddedObservable.notifyObservers(newMultiMaterial); - } - /** - * Adds the given material to this scene - * @param newMaterial The material to add - */ - addMaterial(newMaterial) { - if (this._blockEntityCollection) { - return; - } - if (newMaterial.getScene() === this && newMaterial._indexInSceneMaterialArray !== -1) { - return; - } - newMaterial._indexInSceneMaterialArray = this.materials.length; - this.materials.push(newMaterial); - this.onNewMaterialAddedObservable.notifyObservers(newMaterial); - } - /** - * Adds the given morph target to this scene - * @param newMorphTargetManager The morph target to add - */ - addMorphTargetManager(newMorphTargetManager) { - if (this._blockEntityCollection) { - return; - } - this.morphTargetManagers.push(newMorphTargetManager); - } - /** - * Adds the given geometry to this scene - * @param newGeometry The geometry to add - */ - addGeometry(newGeometry) { - if (this._blockEntityCollection) { - return; + let pointerInfo; + const type = PointerEventTypes.POINTERDOWN; + if (pickResult) { + if (scene.onPointerDown) { + scene.onPointerDown(evt, pickResult, type); + } + pointerInfo = new PointerInfo(type, evt, pickResult); + this._setRayOnPointerInfo(pickResult, evt); + } else { + pointerInfo = new PointerInfo(type, evt, null, this); } - if (this._geometriesByUniqueId) { - this._geometriesByUniqueId[newGeometry.uniqueId] = this.geometries.length; + if (scene.onPointerObservable.hasObservers()) { + scene.onPointerObservable.notifyObservers(pointerInfo, type); } - this.geometries.push(newGeometry); } /** - * Adds the given action manager to this scene - * @deprecated - * @param newActionManager The action manager to add + * @internal + * @internals Boolean if delta for pointer exceeds drag movement threshold */ - addActionManager(newActionManager) { - this.actionManagers.push(newActionManager); + _isPointerSwiping() { + return this._isSwiping; } /** - * Adds the given texture to this scene. - * @param newTexture The texture to add + * Use this method to simulate a pointer up on a mesh + * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay + * @param pickResult - pickingInfo of the object wished to simulate pointer event on + * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch) + * @param doubleTap - indicates that the pointer up event should be considered as part of a double click (false by default) */ - addTexture(newTexture) { - if (this._blockEntityCollection) { - return; + simulatePointerUp(pickResult, pointerEventInit, doubleTap) { + const evt = new PointerEvent("pointerup", pointerEventInit); + evt.inputIndex = PointerInput.Move; + const clickInfo = new _ClickInfo(); + if (doubleTap) { + clickInfo.doubleClick = true; + } else { + clickInfo.singleClick = true; } - this.textures.push(newTexture); - this.onNewTextureAddedObservable.notifyObservers(newTexture); - } - /** - * Switch active camera - * @param newCamera defines the new active camera - * @param attachControl defines if attachControl must be called for the new active camera (default: true) - */ - switchActiveCamera(newCamera, attachControl = true) { - const canvas = this._engine.getInputElement(); - if (!canvas) { + if (this._checkPrePointerObservable(pickResult, evt, PointerEventTypes.POINTERUP)) { return; } - if (this.activeCamera) { - this.activeCamera.detachControl(); - } - this.activeCamera = newCamera; - if (attachControl) { - newCamera.attachControl(); - } - } - /** - * sets the active camera of the scene using its Id - * @param id defines the camera's Id - * @returns the new active camera or null if none found. - */ - setActiveCameraById(id) { - const camera = this.getCameraById(id); - if (camera) { - this.activeCamera = camera; - return camera; - } - return null; - } - /** - * sets the active camera of the scene using its name - * @param name defines the camera's name - * @returns the new active camera or null if none found. - */ - setActiveCameraByName(name69) { - const camera = this.getCameraByName(name69); - if (camera) { - this.activeCamera = camera; - return camera; - } - return null; + this._processPointerUp(pickResult, evt, clickInfo); } - /** - * get an animation group using its name - * @param name defines the material's name - * @returns the animation group or null if none found. - */ - getAnimationGroupByName(name69) { - for (let index = 0; index < this.animationGroups.length; index++) { - if (this.animationGroups[index].name === name69) { - return this.animationGroups[index]; + _processPointerUp(pickResult, evt, clickInfo) { + const scene = this._scene; + if (pickResult == null ? void 0 : pickResult.pickedMesh) { + this._pickedUpMesh = pickResult.pickedMesh; + if (this._pickedDownMesh === this._pickedUpMesh) { + if (scene.onPointerPick) { + scene.onPointerPick(evt, pickResult); + } + if (clickInfo.singleClick && !clickInfo.ignore && scene.onPointerObservable.observers.length > this._cameraObserverCount) { + const type = PointerEventTypes.POINTERPICK; + const pi = new PointerInfo(type, evt, pickResult); + this._setRayOnPointerInfo(pickResult, evt); + scene.onPointerObservable.notifyObservers(pi, type); + } } - } - return null; - } - _getMaterial(allowMultiMaterials, predicate) { - for (let index = 0; index < this.materials.length; index++) { - const material = this.materials[index]; - if (predicate(material)) { - return material; + const actionManager = pickResult.pickedMesh._getActionManagerForTrigger(); + if (actionManager && !clickInfo.ignore) { + actionManager.processTrigger(7, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); + if (!clickInfo.hasSwiped && clickInfo.singleClick) { + actionManager.processTrigger(1, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); + } + const doubleClickActionManager = pickResult.pickedMesh._getActionManagerForTrigger(6); + if (clickInfo.doubleClick && doubleClickActionManager) { + doubleClickActionManager.processTrigger(6, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult)); + } } - } - if (allowMultiMaterials) { - for (let index = 0; index < this.multiMaterials.length; index++) { - const material = this.multiMaterials[index]; - if (predicate(material)) { - return material; + } else { + if (!clickInfo.ignore) { + for (const step of scene._pointerUpStage) { + pickResult = step.action(this._unTranslatedPointerX, this._unTranslatedPointerY, pickResult, evt, clickInfo.doubleClick); } } } - return null; - } - /** - * Get a material using its unique id - * @param uniqueId defines the material's unique id - * @param allowMultiMaterials determines whether multimaterials should be considered - * @returns the material or null if none found. - */ - getMaterialByUniqueID(uniqueId, allowMultiMaterials = false) { - return this._getMaterial(allowMultiMaterials, (m) => m.uniqueId === uniqueId); - } - /** - * get a material using its id - * @param id defines the material's Id - * @param allowMultiMaterials determines whether multimaterials should be considered - * @returns the material or null if none found. - */ - getMaterialById(id, allowMultiMaterials = false) { - return this._getMaterial(allowMultiMaterials, (m) => m.id === id); - } - /** - * Gets a material using its name - * @param name defines the material's name - * @param allowMultiMaterials determines whether multimaterials should be considered - * @returns the material or null if none found. - */ - getMaterialByName(name69, allowMultiMaterials = false) { - return this._getMaterial(allowMultiMaterials, (m) => m.name === name69); - } - /** - * Gets a last added material using a given id - * @param id defines the material's id - * @param allowMultiMaterials determines whether multimaterials should be considered - * @returns the last material with the given id or null if none found. - */ - getLastMaterialById(id, allowMultiMaterials = false) { - for (let index = this.materials.length - 1; index >= 0; index--) { - if (this.materials[index].id === id) { - return this.materials[index]; + if (this._pickedDownMesh && this._pickedDownMesh !== this._pickedUpMesh) { + const pickedDownActionManager = this._pickedDownMesh._getActionManagerForTrigger(16); + if (pickedDownActionManager) { + pickedDownActionManager.processTrigger(16, ActionEvent.CreateNew(this._pickedDownMesh, evt)); } } - if (allowMultiMaterials) { - for (let index = this.multiMaterials.length - 1; index >= 0; index--) { - if (this.multiMaterials[index].id === id) { - return this.multiMaterials[index]; + if (!clickInfo.ignore) { + const pi = new PointerInfo(PointerEventTypes.POINTERUP, evt, pickResult); + this._setRayOnPointerInfo(pickResult, evt); + scene.onPointerObservable.notifyObservers(pi, PointerEventTypes.POINTERUP); + if (scene.onPointerUp) { + scene.onPointerUp(evt, pickResult, PointerEventTypes.POINTERUP); + } + if (!clickInfo.hasSwiped && !this._skipPointerTap && !this._isMultiTouchGesture) { + let type = 0; + if (clickInfo.singleClick) { + type = PointerEventTypes.POINTERTAP; + } else if (clickInfo.doubleClick) { + type = PointerEventTypes.POINTERDOUBLETAP; + } + if (type) { + const pi2 = new PointerInfo(type, evt, pickResult); + if (scene.onPointerObservable.hasObservers() && scene.onPointerObservable.hasSpecificMask(type)) { + scene.onPointerObservable.notifyObservers(pi2, type); + } } } } - return null; } /** - * Get a texture using its unique id - * @param uniqueId defines the texture's unique id - * @returns the texture or null if none found. + * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down) + * @param pointerId - defines the pointer id to use in a multi-touch scenario (0 by default) + * @returns true if the pointer was captured */ - getTextureByUniqueId(uniqueId) { - for (let index = 0; index < this.textures.length; index++) { - if (this.textures[index].uniqueId === uniqueId) { - return this.textures[index]; - } - } - return null; + isPointerCaptured(pointerId = 0) { + return this._pointerCaptures[pointerId]; } /** - * Gets a texture using its name - * @param name defines the texture's name - * @returns the texture or null if none found. + * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp + * @param attachUp - defines if you want to attach events to pointerup + * @param attachDown - defines if you want to attach events to pointerdown + * @param attachMove - defines if you want to attach events to pointermove + * @param elementToAttachTo - defines the target DOM element to attach to (will use the canvas by default) */ - getTextureByName(name69) { - for (let index = 0; index < this.textures.length; index++) { - if (this.textures[index].name === name69) { - return this.textures[index]; - } + attachControl(attachUp = true, attachDown = true, attachMove = true, elementToAttachTo = null) { + const scene = this._scene; + const engine = scene.getEngine(); + if (!elementToAttachTo) { + elementToAttachTo = engine.getInputElement(); } - return null; - } - /** - * Gets a camera using its Id - * @param id defines the Id to look for - * @returns the camera or null if not found - */ - getCameraById(id) { - for (let index = 0; index < this.cameras.length; index++) { - if (this.cameras[index].id === id) { - return this.cameras[index]; - } + if (this._alreadyAttached) { + this.detachControl(); } - return null; - } - /** - * Gets a camera using its unique Id - * @param uniqueId defines the unique Id to look for - * @returns the camera or null if not found - */ - getCameraByUniqueId(uniqueId) { - for (let index = 0; index < this.cameras.length; index++) { - if (this.cameras[index].uniqueId === uniqueId) { - return this.cameras[index]; - } + if (elementToAttachTo) { + this._alreadyAttachedTo = elementToAttachTo; } - return null; - } - /** - * Gets a camera using its name - * @param name defines the camera's name - * @returns the camera or null if none found. - */ - getCameraByName(name69) { - for (let index = 0; index < this.cameras.length; index++) { - if (this.cameras[index].name === name69) { - return this.cameras[index]; + this._deviceSourceManager = new DeviceSourceManager(engine); + this._initActionManager = (act) => { + if (!this._meshPickProceed) { + const pickResult = scene.skipPointerUpPicking || scene._registeredActions === 0 && !this._checkForPicking() && !scene.onPointerUp ? null : scene.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, scene.pointerUpPredicate, scene.pointerUpFastCheck, scene.cameraToUseForPointers, scene.pointerUpTrianglePredicate); + this._currentPickResult = pickResult; + if (pickResult) { + act = pickResult.hit && pickResult.pickedMesh ? pickResult.pickedMesh._getActionManagerForTrigger() : null; + } + this._meshPickProceed = true; } - } - return null; - } - /** - * Gets a bone using its Id - * @param id defines the bone's Id - * @returns the bone or null if not found - */ - getBoneById(id) { - for (let skeletonIndex = 0; skeletonIndex < this.skeletons.length; skeletonIndex++) { - const skeleton = this.skeletons[skeletonIndex]; - for (let boneIndex = 0; boneIndex < skeleton.bones.length; boneIndex++) { - if (skeleton.bones[boneIndex].id === id) { - return skeleton.bones[boneIndex]; + return act; + }; + this._delayedSimpleClick = (btn, clickInfo, cb) => { + if (Date.now() - this._previousStartingPointerTime > _InputManager.DoubleClickDelay && !this._doubleClickOccured || btn !== this._previousButtonPressed) { + this._doubleClickOccured = false; + clickInfo.singleClick = true; + clickInfo.ignore = false; + if (this._delayedClicks[btn]) { + const evt = this._delayedClicks[btn].evt; + const type = PointerEventTypes.POINTERTAP; + const pi = new PointerInfo(type, evt, this._currentPickResult); + if (scene.onPointerObservable.hasObservers() && scene.onPointerObservable.hasSpecificMask(type)) { + scene.onPointerObservable.notifyObservers(pi, type); + } + this._delayedClicks[btn] = null; } } - } - return null; - } - /** - * Gets a bone using its id - * @param name defines the bone's name - * @returns the bone or null if not found - */ - getBoneByName(name69) { - for (let skeletonIndex = 0; skeletonIndex < this.skeletons.length; skeletonIndex++) { - const skeleton = this.skeletons[skeletonIndex]; - for (let boneIndex = 0; boneIndex < skeleton.bones.length; boneIndex++) { - if (skeleton.bones[boneIndex].name === name69) { - return skeleton.bones[boneIndex]; + }; + this._initClickEvent = (obs1, obs2, evt, cb) => { + var _a, _b; + const clickInfo = new _ClickInfo(); + this._currentPickResult = null; + let act = null; + let checkPicking = obs1.hasSpecificMask(PointerEventTypes.POINTERPICK) || obs2.hasSpecificMask(PointerEventTypes.POINTERPICK) || obs1.hasSpecificMask(PointerEventTypes.POINTERTAP) || obs2.hasSpecificMask(PointerEventTypes.POINTERTAP) || obs1.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP) || obs2.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP); + if (!checkPicking && AbstractActionManager) { + act = this._initActionManager(act, clickInfo); + if (act) { + checkPicking = act.hasPickTriggers; } } - } - return null; + let needToIgnoreNext = false; + if (checkPicking) { + const btn = evt.button; + clickInfo.hasSwiped = this._isPointerSwiping(); + if (!clickInfo.hasSwiped) { + let checkSingleClickImmediately = !_InputManager.ExclusiveDoubleClickMode; + if (!checkSingleClickImmediately) { + checkSingleClickImmediately = !obs1.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP) && !obs2.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP); + if (checkSingleClickImmediately && !AbstractActionManager.HasSpecificTrigger(6)) { + act = this._initActionManager(act, clickInfo); + if (act) { + checkSingleClickImmediately = !act.hasSpecificTrigger(6); + } + } + } + if (checkSingleClickImmediately) { + if (Date.now() - this._previousStartingPointerTime > _InputManager.DoubleClickDelay || btn !== this._previousButtonPressed) { + clickInfo.singleClick = true; + cb(clickInfo, this._currentPickResult); + needToIgnoreNext = true; + } + } else { + const delayedClick = { + evt, + clickInfo, + timeoutId: window.setTimeout(this._delayedSimpleClick.bind(this, btn, clickInfo, cb), _InputManager.DoubleClickDelay) + }; + this._delayedClicks[btn] = delayedClick; + } + let checkDoubleClick = obs1.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP) || obs2.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP); + if (!checkDoubleClick && AbstractActionManager.HasSpecificTrigger(6)) { + act = this._initActionManager(act, clickInfo); + if (act) { + checkDoubleClick = act.hasSpecificTrigger(6); + } + } + if (checkDoubleClick) { + if (btn === this._previousButtonPressed && Date.now() - this._previousStartingPointerTime < _InputManager.DoubleClickDelay && !this._doubleClickOccured) { + if (!clickInfo.hasSwiped && !this._isPointerSwiping()) { + this._previousStartingPointerTime = 0; + this._doubleClickOccured = true; + clickInfo.doubleClick = true; + clickInfo.ignore = false; + if (_InputManager.ExclusiveDoubleClickMode && this._delayedClicks[btn]) { + clearTimeout((_a = this._delayedClicks[btn]) == null ? void 0 : _a.timeoutId); + this._delayedClicks[btn] = null; + } + cb(clickInfo, this._currentPickResult); + } else { + this._doubleClickOccured = false; + this._previousStartingPointerTime = this._startingPointerTime; + this._previousStartingPointerPosition.x = this._startingPointerPosition.x; + this._previousStartingPointerPosition.y = this._startingPointerPosition.y; + this._previousButtonPressed = btn; + if (_InputManager.ExclusiveDoubleClickMode) { + if (this._delayedClicks[btn]) { + clearTimeout((_b = this._delayedClicks[btn]) == null ? void 0 : _b.timeoutId); + this._delayedClicks[btn] = null; + } + cb(clickInfo, this._previousPickResult); + } else { + cb(clickInfo, this._currentPickResult); + } + } + needToIgnoreNext = true; + } else { + this._doubleClickOccured = false; + this._previousStartingPointerTime = this._startingPointerTime; + this._previousStartingPointerPosition.x = this._startingPointerPosition.x; + this._previousStartingPointerPosition.y = this._startingPointerPosition.y; + this._previousButtonPressed = btn; + } + } + } + } + if (!needToIgnoreNext) { + cb(clickInfo, this._currentPickResult); + } + }; + this._onPointerMove = (evt) => { + this._updatePointerPosition(evt); + if (!this._isSwiping && this._swipeButtonPressed !== -1) { + this._isSwiping = Math.abs(this._startingPointerPosition.x - this._pointerX) > _InputManager.DragMovementThreshold || Math.abs(this._startingPointerPosition.y - this._pointerY) > _InputManager.DragMovementThreshold; + } + if (engine.isPointerLock) { + engine._verifyPointerLock(); + } + if (this._checkPrePointerObservable(null, evt, evt.inputIndex >= PointerInput.MouseWheelX && evt.inputIndex <= PointerInput.MouseWheelZ ? PointerEventTypes.POINTERWHEEL : PointerEventTypes.POINTERMOVE)) { + return; + } + if (!scene.cameraToUseForPointers && !scene.activeCamera) { + return; + } + if (scene.skipPointerMovePicking) { + this._processPointerMove(new PickingInfo(), evt); + return; + } + if (!scene.pointerMovePredicate) { + scene.pointerMovePredicate = (mesh) => mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.isEnabled() && (mesh.enablePointerMoveEvents || scene.constantlyUpdateMeshUnderPointer || mesh._getActionManagerForTrigger() !== null) && (!scene.cameraToUseForPointers || (scene.cameraToUseForPointers.layerMask & mesh.layerMask) !== 0); + } + const pickResult = scene._registeredActions > 0 || scene.constantlyUpdateMeshUnderPointer ? this._pickMove(evt) : null; + this._processPointerMove(pickResult, evt); + }; + this._onPointerDown = (evt) => { + var _a; + this._totalPointersPressed++; + this._pickedDownMesh = null; + this._meshPickProceed = false; + if (_InputManager.ExclusiveDoubleClickMode) { + for (let i = 0; i < this._delayedClicks.length; i++) { + if (this._delayedClicks[i]) { + if (evt.button === i) { + clearTimeout((_a = this._delayedClicks[i]) == null ? void 0 : _a.timeoutId); + } else { + const clickInfo = this._delayedClicks[i].clickInfo; + this._doubleClickOccured = false; + clickInfo.singleClick = true; + clickInfo.ignore = false; + const prevEvt = this._delayedClicks[i].evt; + const type = PointerEventTypes.POINTERTAP; + const pi = new PointerInfo(type, prevEvt, this._currentPickResult); + if (scene.onPointerObservable.hasObservers() && scene.onPointerObservable.hasSpecificMask(type)) { + scene.onPointerObservable.notifyObservers(pi, type); + } + this._delayedClicks[i] = null; + } + } + } + } + this._updatePointerPosition(evt); + if (this._swipeButtonPressed === -1) { + this._swipeButtonPressed = evt.button; + } + if (scene.preventDefaultOnPointerDown && elementToAttachTo) { + evt.preventDefault(); + elementToAttachTo.focus(); + } + this._startingPointerPosition.x = this._pointerX; + this._startingPointerPosition.y = this._pointerY; + this._startingPointerTime = Date.now(); + if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERDOWN)) { + return; + } + if (!scene.cameraToUseForPointers && !scene.activeCamera) { + return; + } + this._pointerCaptures[evt.pointerId] = true; + if (!scene.pointerDownPredicate) { + scene.pointerDownPredicate = (mesh) => { + return mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.isEnabled() && (!scene.cameraToUseForPointers || (scene.cameraToUseForPointers.layerMask & mesh.layerMask) !== 0); + }; + } + this._pickedDownMesh = null; + let pickResult; + if (scene.skipPointerDownPicking || scene._registeredActions === 0 && !this._checkForPicking() && !scene.onPointerDown) { + pickResult = new PickingInfo(); + } else { + pickResult = scene.pick(this._unTranslatedPointerX, this._unTranslatedPointerY, scene.pointerDownPredicate, scene.pointerDownFastCheck, scene.cameraToUseForPointers, scene.pointerDownTrianglePredicate); + } + this._processPointerDown(pickResult, evt); + }; + this._onPointerUp = (evt) => { + if (this._totalPointersPressed === 0) { + return; + } + this._totalPointersPressed--; + this._pickedUpMesh = null; + this._meshPickProceed = false; + this._updatePointerPosition(evt); + if (scene.preventDefaultOnPointerUp && elementToAttachTo) { + evt.preventDefault(); + elementToAttachTo.focus(); + } + this._initClickEvent(scene.onPrePointerObservable, scene.onPointerObservable, evt, (clickInfo, pickResult) => { + if (scene.onPrePointerObservable.hasObservers()) { + this._skipPointerTap = false; + if (!clickInfo.ignore) { + if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERUP)) { + if (this._swipeButtonPressed === evt.button) { + this._isSwiping = false; + this._swipeButtonPressed = -1; + } + if (evt.buttons === 0) { + this._pointerCaptures[evt.pointerId] = false; + } + return; + } + if (!clickInfo.hasSwiped) { + if (clickInfo.singleClick && scene.onPrePointerObservable.hasSpecificMask(PointerEventTypes.POINTERTAP)) { + if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERTAP)) { + this._skipPointerTap = true; + } + } + if (clickInfo.doubleClick && scene.onPrePointerObservable.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP)) { + if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERDOUBLETAP)) { + this._skipPointerTap = true; + } + } + } + } + } + if (!this._pointerCaptures[evt.pointerId]) { + if (this._swipeButtonPressed === evt.button) { + this._isSwiping = false; + this._swipeButtonPressed = -1; + } + return; + } + if (evt.buttons === 0) { + this._pointerCaptures[evt.pointerId] = false; + } + if (!scene.cameraToUseForPointers && !scene.activeCamera) { + return; + } + if (!scene.pointerUpPredicate) { + scene.pointerUpPredicate = (mesh) => { + return mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.isEnabled() && (!scene.cameraToUseForPointers || (scene.cameraToUseForPointers.layerMask & mesh.layerMask) !== 0); + }; + } + if (!this._meshPickProceed && (AbstractActionManager && AbstractActionManager.HasTriggers || this._checkForPicking() || scene.onPointerUp)) { + this._initActionManager(null, clickInfo); + } + if (!pickResult) { + pickResult = this._currentPickResult; + } + this._processPointerUp(pickResult, evt, clickInfo); + this._previousPickResult = this._currentPickResult; + if (this._swipeButtonPressed === evt.button) { + this._isSwiping = false; + this._swipeButtonPressed = -1; + } + }); + }; + this._onKeyDown = (evt) => { + const type = KeyboardEventTypes.KEYDOWN; + if (scene.onPreKeyboardObservable.hasObservers()) { + const pi = new KeyboardInfoPre(type, evt); + scene.onPreKeyboardObservable.notifyObservers(pi, type); + if (pi.skipOnKeyboardObservable) { + return; + } + } + if (scene.onKeyboardObservable.hasObservers()) { + const pi = new KeyboardInfo(type, evt); + scene.onKeyboardObservable.notifyObservers(pi, type); + } + if (scene.actionManager) { + scene.actionManager.processTrigger(14, ActionEvent.CreateNewFromScene(scene, evt)); + } + }; + this._onKeyUp = (evt) => { + const type = KeyboardEventTypes.KEYUP; + if (scene.onPreKeyboardObservable.hasObservers()) { + const pi = new KeyboardInfoPre(type, evt); + scene.onPreKeyboardObservable.notifyObservers(pi, type); + if (pi.skipOnKeyboardObservable) { + return; + } + } + if (scene.onKeyboardObservable.hasObservers()) { + const pi = new KeyboardInfo(type, evt); + scene.onKeyboardObservable.notifyObservers(pi, type); + } + if (scene.actionManager) { + scene.actionManager.processTrigger(15, ActionEvent.CreateNewFromScene(scene, evt)); + } + }; + this._deviceSourceManager.onDeviceConnectedObservable.add((deviceSource) => { + if (deviceSource.deviceType === DeviceType.Mouse) { + deviceSource.onInputChangedObservable.add((eventData) => { + if (eventData.inputIndex === PointerInput.LeftClick || eventData.inputIndex === PointerInput.MiddleClick || eventData.inputIndex === PointerInput.RightClick || eventData.inputIndex === PointerInput.BrowserBack || eventData.inputIndex === PointerInput.BrowserForward) { + if (attachDown && deviceSource.getInput(eventData.inputIndex) === 1) { + this._onPointerDown(eventData); + } else if (attachUp && deviceSource.getInput(eventData.inputIndex) === 0) { + this._onPointerUp(eventData); + } + } else if (attachMove) { + if (eventData.inputIndex === PointerInput.Move) { + this._onPointerMove(eventData); + } else if (eventData.inputIndex === PointerInput.MouseWheelX || eventData.inputIndex === PointerInput.MouseWheelY || eventData.inputIndex === PointerInput.MouseWheelZ) { + this._onPointerMove(eventData); + } + } + }); + } else if (deviceSource.deviceType === DeviceType.Touch) { + deviceSource.onInputChangedObservable.add((eventData) => { + if (eventData.inputIndex === PointerInput.LeftClick) { + if (attachDown && deviceSource.getInput(eventData.inputIndex) === 1) { + this._onPointerDown(eventData); + if (this._totalPointersPressed > 1) { + this._isMultiTouchGesture = true; + } + } else if (attachUp && deviceSource.getInput(eventData.inputIndex) === 0) { + this._onPointerUp(eventData); + if (this._totalPointersPressed === 0) { + this._isMultiTouchGesture = false; + } + } + } + if (attachMove && eventData.inputIndex === PointerInput.Move) { + this._onPointerMove(eventData); + } + }); + } else if (deviceSource.deviceType === DeviceType.Keyboard) { + deviceSource.onInputChangedObservable.add((eventData) => { + if (eventData.type === "keydown") { + this._onKeyDown(eventData); + } else if (eventData.type === "keyup") { + this._onKeyUp(eventData); + } + }); + } + }); + this._alreadyAttached = true; } /** - * Gets a light node using its name - * @param name defines the light's name - * @returns the light or null if none found. + * Detaches all event handlers */ - getLightByName(name69) { - for (let index = 0; index < this.lights.length; index++) { - if (this.lights[index].name === name69) { - return this.lights[index]; + detachControl() { + if (this._alreadyAttached) { + this._deviceSourceManager.dispose(); + this._deviceSourceManager = null; + if (this._alreadyAttachedTo && !this._scene.doNotHandleCursors) { + this._alreadyAttachedTo.style.cursor = this._scene.defaultCursor; } + this._alreadyAttached = false; + this._alreadyAttachedTo = null; } - return null; } /** - * Gets a light node using its Id - * @param id defines the light's Id - * @returns the light or null if none found. + * Force the value of meshUnderPointer + * @param mesh - defines the mesh to use + * @param pointerId - optional pointer id when using more than one pointer. Defaults to 0 + * @param pickResult - optional pickingInfo data used to find mesh + * @param evt - optional pointer event */ - getLightById(id) { - for (let index = 0; index < this.lights.length; index++) { - if (this.lights[index].id === id) { - return this.lights[index]; + setPointerOverMesh(mesh, pointerId = 0, pickResult, evt) { + if (this._meshUnderPointerId[pointerId] === mesh && (!mesh || !mesh._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting)) { + return; + } + const underPointerMesh = this._meshUnderPointerId[pointerId]; + let actionManager; + if (underPointerMesh) { + actionManager = underPointerMesh._getActionManagerForTrigger(10); + if (actionManager) { + actionManager.processTrigger(10, ActionEvent.CreateNew(underPointerMesh, evt, { pointerId })); } } - return null; - } - /** - * Gets a light node using its scene-generated unique Id - * @param uniqueId defines the light's unique Id - * @returns the light or null if none found. - */ - getLightByUniqueId(uniqueId) { - for (let index = 0; index < this.lights.length; index++) { - if (this.lights[index].uniqueId === uniqueId) { - return this.lights[index]; + if (mesh) { + this._meshUnderPointerId[pointerId] = mesh; + this._pointerOverMesh = mesh; + actionManager = mesh._getActionManagerForTrigger(9); + if (actionManager) { + actionManager.processTrigger(9, ActionEvent.CreateNew(mesh, evt, { pointerId, pickResult })); } + } else { + delete this._meshUnderPointerId[pointerId]; + this._pointerOverMesh = null; } - return null; } /** - * Gets a particle system by Id - * @param id defines the particle system Id - * @returns the corresponding system or null if none found + * Gets the mesh under the pointer + * @returns a Mesh or null if no mesh is under the pointer */ - getParticleSystemById(id) { - for (let index = 0; index < this.particleSystems.length; index++) { - if (this.particleSystems[index].id === id) { - return this.particleSystems[index]; - } - } - return null; + getPointerOverMesh() { + return this.meshUnderPointer; } /** - * Gets a geometry using its Id - * @param id defines the geometry's Id - * @returns the geometry or null if none found. + * @param mesh - Mesh to invalidate + * @internal */ - getGeometryById(id) { - for (let index = 0; index < this.geometries.length; index++) { - if (this.geometries[index].id === id) { - return this.geometries[index]; - } + _invalidateMesh(mesh) { + if (this._pointerOverMesh === mesh) { + this._pointerOverMesh = null; } - return null; - } - _getGeometryByUniqueId(uniqueId) { - if (this._geometriesByUniqueId) { - const index = this._geometriesByUniqueId[uniqueId]; - if (index !== void 0) { - return this.geometries[index]; - } - } else { - for (let index = 0; index < this.geometries.length; index++) { - if (this.geometries[index].uniqueId === uniqueId) { - return this.geometries[index]; - } + if (this._pickedDownMesh === mesh) { + this._pickedDownMesh = null; + } + if (this._pickedUpMesh === mesh) { + this._pickedUpMesh = null; + } + for (const pointerId in this._meshUnderPointerId) { + if (this._meshUnderPointerId[pointerId] === mesh) { + delete this._meshUnderPointerId[pointerId]; } } - return null; } +}; +InputManager.DragMovementThreshold = 10; +InputManager.LongPressDelay = 500; +InputManager.DoubleClickDelay = 300; +InputManager.ExclusiveDoubleClickMode = false; + +// node_modules/@babylonjs/core/Misc/uniqueIdGenerator.js +var UniqueIdGenerator = class { /** - * Add a new geometry to this scene - * @param geometry defines the geometry to be added to the scene. - * @param force defines if the geometry must be pushed even if a geometry with this id already exists - * @returns a boolean defining if the geometry was added or not + * Gets an unique (relatively to the current scene) Id */ - pushGeometry(geometry, force) { - if (!force && this._getGeometryByUniqueId(geometry.uniqueId)) { - return false; - } - this.addGeometry(geometry); - this.onNewGeometryAddedObservable.notifyObservers(geometry); - return true; + static get UniqueId() { + const result = this._UniqueIdCounter; + this._UniqueIdCounter++; + return result; } +}; +UniqueIdGenerator._UniqueIdCounter = 1; + +// node_modules/@babylonjs/core/Lights/lightConstants.js +var LightConstants = class { /** - * Removes an existing geometry - * @param geometry defines the geometry to be removed from the scene - * @returns a boolean defining if the geometry was removed or not + * Sort function to order lights for rendering. + * @param a First Light object to compare to second. + * @param b Second Light object to compare first. + * @returns -1 to reduce's a's index relative to be, 0 for no change, 1 to increase a's index relative to b. */ - removeGeometry(geometry) { - let index; - if (this._geometriesByUniqueId) { - index = this._geometriesByUniqueId[geometry.uniqueId]; - if (index === void 0) { - return false; - } - } else { - index = this.geometries.indexOf(geometry); - if (index < 0) { - return false; - } - } - if (index !== this.geometries.length - 1) { - const lastGeometry = this.geometries[this.geometries.length - 1]; - if (lastGeometry) { - this.geometries[index] = lastGeometry; - if (this._geometriesByUniqueId) { - this._geometriesByUniqueId[lastGeometry.uniqueId] = index; - } - } - } - if (this._geometriesByUniqueId) { - this._geometriesByUniqueId[geometry.uniqueId] = void 0; + static CompareLightsPriority(a, b) { + if (a.shadowEnabled !== b.shadowEnabled) { + return (b.shadowEnabled ? 1 : 0) - (a.shadowEnabled ? 1 : 0); } - this.geometries.pop(); - this.onGeometryRemovedObservable.notifyObservers(geometry); - return true; + return b.renderPriority - a.renderPriority; } - /** - * Gets the list of geometries attached to the scene - * @returns an array of Geometry - */ - getGeometries() { - return this.geometries; +}; +LightConstants.FALLOFF_DEFAULT = 0; +LightConstants.FALLOFF_PHYSICAL = 1; +LightConstants.FALLOFF_GLTF = 2; +LightConstants.FALLOFF_STANDARD = 3; +LightConstants.LIGHTMAP_DEFAULT = 0; +LightConstants.LIGHTMAP_SPECULAR = 1; +LightConstants.LIGHTMAP_SHADOWSONLY = 2; +LightConstants.INTENSITYMODE_AUTOMATIC = 0; +LightConstants.INTENSITYMODE_LUMINOUSPOWER = 1; +LightConstants.INTENSITYMODE_LUMINOUSINTENSITY = 2; +LightConstants.INTENSITYMODE_ILLUMINANCE = 3; +LightConstants.INTENSITYMODE_LUMINANCE = 4; +LightConstants.LIGHTTYPEID_POINTLIGHT = 0; +LightConstants.LIGHTTYPEID_DIRECTIONALLIGHT = 1; +LightConstants.LIGHTTYPEID_SPOTLIGHT = 2; +LightConstants.LIGHTTYPEID_HEMISPHERICLIGHT = 3; + +// node_modules/@babylonjs/core/Inputs/pointerPickingConfiguration.js +var PointerPickingConfiguration = class { + constructor() { + this.pointerDownFastCheck = false; + this.pointerUpFastCheck = false; + this.pointerMoveFastCheck = false; + this.skipPointerMovePicking = false; + this.skipPointerDownPicking = false; + this.skipPointerUpPicking = false; } +}; + +// node_modules/@babylonjs/core/scene.js +var ScenePerformancePriority; +(function(ScenePerformancePriority2) { + ScenePerformancePriority2[ScenePerformancePriority2["BackwardCompatible"] = 0] = "BackwardCompatible"; + ScenePerformancePriority2[ScenePerformancePriority2["Intermediate"] = 1] = "Intermediate"; + ScenePerformancePriority2[ScenePerformancePriority2["Aggressive"] = 2] = "Aggressive"; +})(ScenePerformancePriority || (ScenePerformancePriority = {})); +var Scene = class _Scene extends AbstractScene { + // eslint-disable-next-line jsdoc/require-returns-check /** - * Gets the first added mesh found of a given Id - * @param id defines the Id to search for - * @returns the mesh found or null if not found at all + * Factory used to create the default material. + * @param scene The scene to create the material for + * @returns The default material */ - getMeshById(id) { - for (let index = 0; index < this.meshes.length; index++) { - if (this.meshes[index].id === id) { - return this.meshes[index]; - } - } - return null; + static DefaultMaterialFactory(scene) { + throw _WarnImport("StandardMaterial"); } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Gets a list of meshes using their Id - * @param id defines the Id to search for - * @returns a list of meshes + * Factory used to create the a collision coordinator. + * @returns The collision coordinator */ - getMeshesById(id) { - return this.meshes.filter(function(m) { - return m.id === id; - }); + static CollisionCoordinatorFactory() { + throw _WarnImport("DefaultCollisionCoordinator"); } /** - * Gets the first added transform node found of a given Id - * @param id defines the Id to search for - * @returns the found transform node or null if not found at all. + * Texture used in all pbr material as the reflection texture. + * As in the majority of the scene they are the same (exception for multi room and so on), + * this is easier to reference from here than from all the materials. */ - getTransformNodeById(id) { - for (let index = 0; index < this.transformNodes.length; index++) { - if (this.transformNodes[index].id === id) { - return this.transformNodes[index]; - } - } - return null; + get environmentTexture() { + return this._environmentTexture; } /** - * Gets a transform node with its auto-generated unique Id - * @param uniqueId defines the unique Id to search for - * @returns the found transform node or null if not found at all. + * Texture used in all pbr material as the reflection texture. + * As in the majority of the scene they are the same (exception for multi room and so on), + * this is easier to set here than in all the materials. */ - getTransformNodeByUniqueId(uniqueId) { - for (let index = 0; index < this.transformNodes.length; index++) { - if (this.transformNodes[index].uniqueId === uniqueId) { - return this.transformNodes[index]; - } + set environmentTexture(value) { + if (this._environmentTexture === value) { + return; } - return null; + this._environmentTexture = value; + this.markAllMaterialsAsDirty(1); } /** - * Gets a list of transform nodes using their Id - * @param id defines the Id to search for - * @returns a list of transform nodes + * Default image processing configuration used either in the rendering + * Forward main pass or through the imageProcessingPostProcess if present. + * As in the majority of the scene they are the same (exception for multi camera), + * this is easier to reference from here than from all the materials and post process. + * + * No setter as we it is a shared configuration, you can set the values instead. */ - getTransformNodesById(id) { - return this.transformNodes.filter(function(m) { - return m.id === id; - }); + get imageProcessingConfiguration() { + return this._imageProcessingConfiguration; } /** - * Gets a mesh with its auto-generated unique Id - * @param uniqueId defines the unique Id to search for - * @returns the found mesh or null if not found at all. + * Gets or sets a value indicating how to treat performance relatively to ease of use and backward compatibility */ - getMeshByUniqueId(uniqueId) { - for (let index = 0; index < this.meshes.length; index++) { - if (this.meshes[index].uniqueId === uniqueId) { - return this.meshes[index]; - } + get performancePriority() { + return this._performancePriority; + } + set performancePriority(value) { + if (value === this._performancePriority) { + return; } - return null; + this._performancePriority = value; + switch (value) { + case ScenePerformancePriority.BackwardCompatible: + this.skipFrustumClipping = false; + this._renderingManager.maintainStateBetweenFrames = false; + this.skipPointerMovePicking = false; + this.autoClear = true; + break; + case ScenePerformancePriority.Intermediate: + this.skipFrustumClipping = false; + this._renderingManager.maintainStateBetweenFrames = false; + this.skipPointerMovePicking = true; + this.autoClear = false; + break; + case ScenePerformancePriority.Aggressive: + this.skipFrustumClipping = true; + this._renderingManager.maintainStateBetweenFrames = true; + this.skipPointerMovePicking = true; + this.autoClear = false; + break; + } + this.onScenePerformancePriorityChangedObservable.notifyObservers(value); } /** - * Gets a the last added mesh using a given Id - * @param id defines the Id to search for - * @returns the found mesh or null if not found at all. + * Gets or sets a boolean indicating if all rendering must be done in wireframe */ - getLastMeshById(id) { - for (let index = this.meshes.length - 1; index >= 0; index--) { - if (this.meshes[index].id === id) { - return this.meshes[index]; - } + set forceWireframe(value) { + if (this._forceWireframe === value) { + return; } - return null; + this._forceWireframe = value; + this.markAllMaterialsAsDirty(16); + } + get forceWireframe() { + return this._forceWireframe; } /** - * Gets a the last transform node using a given Id - * @param id defines the Id to search for - * @returns the found mesh or null if not found at all. + * Gets or sets a boolean indicating if we should skip the frustum clipping part of the active meshes selection */ - getLastTransformNodeById(id) { - for (let index = this.transformNodes.length - 1; index >= 0; index--) { - if (this.transformNodes[index].id === id) { - return this.transformNodes[index]; - } + set skipFrustumClipping(value) { + if (this._skipFrustumClipping === value) { + return; } - return null; + this._skipFrustumClipping = value; + } + get skipFrustumClipping() { + return this._skipFrustumClipping; } /** - * Gets a the last added node (Mesh, Camera, Light) using a given Id - * @param id defines the Id to search for - * @returns the found node or null if not found at all + * Gets or sets a boolean indicating if all rendering must be done in point cloud */ - getLastEntryById(id) { - let index; - for (index = this.meshes.length - 1; index >= 0; index--) { - if (this.meshes[index].id === id) { - return this.meshes[index]; - } - } - for (index = this.transformNodes.length - 1; index >= 0; index--) { - if (this.transformNodes[index].id === id) { - return this.transformNodes[index]; - } - } - for (index = this.cameras.length - 1; index >= 0; index--) { - if (this.cameras[index].id === id) { - return this.cameras[index]; - } - } - for (index = this.lights.length - 1; index >= 0; index--) { - if (this.lights[index].id === id) { - return this.lights[index]; - } + set forcePointsCloud(value) { + if (this._forcePointsCloud === value) { + return; } - return null; + this._forcePointsCloud = value; + this.markAllMaterialsAsDirty(16); + } + get forcePointsCloud() { + return this._forcePointsCloud; } /** - * Gets a node (Mesh, Camera, Light) using a given Id - * @param id defines the Id to search for - * @returns the found node or null if not found at all + * Gets or sets the animation properties override */ - getNodeById(id) { - const mesh = this.getMeshById(id); - if (mesh) { - return mesh; - } - const transformNode = this.getTransformNodeById(id); - if (transformNode) { - return transformNode; - } - const light = this.getLightById(id); - if (light) { - return light; + get animationPropertiesOverride() { + return this._animationPropertiesOverride; + } + set animationPropertiesOverride(value) { + this._animationPropertiesOverride = value; + } + /** Sets a function to be executed when this scene is disposed. */ + set onDispose(callback) { + if (this._onDisposeObserver) { + this.onDisposeObservable.remove(this._onDisposeObserver); } - const camera = this.getCameraById(id); - if (camera) { - return camera; + this._onDisposeObserver = this.onDisposeObservable.add(callback); + } + /** Sets a function to be executed before rendering this scene */ + set beforeRender(callback) { + if (this._onBeforeRenderObserver) { + this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver); } - const bone = this.getBoneById(id); - if (bone) { - return bone; + if (callback) { + this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback); } - return null; } - /** - * Gets a node (Mesh, Camera, Light) using a given name - * @param name defines the name to search for - * @returns the found node or null if not found at all. - */ - getNodeByName(name69) { - const mesh = this.getMeshByName(name69); - if (mesh) { - return mesh; - } - const transformNode = this.getTransformNodeByName(name69); - if (transformNode) { - return transformNode; + /** Sets a function to be executed after rendering this scene */ + set afterRender(callback) { + if (this._onAfterRenderObserver) { + this.onAfterRenderObservable.remove(this._onAfterRenderObserver); } - const light = this.getLightByName(name69); - if (light) { - return light; + if (callback) { + this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback); } - const camera = this.getCameraByName(name69); - if (camera) { - return camera; + } + /** Sets a function to be executed before rendering a camera*/ + set beforeCameraRender(callback) { + if (this._onBeforeCameraRenderObserver) { + this.onBeforeCameraRenderObservable.remove(this._onBeforeCameraRenderObserver); } - const bone = this.getBoneByName(name69); - if (bone) { - return bone; + this._onBeforeCameraRenderObserver = this.onBeforeCameraRenderObservable.add(callback); + } + /** Sets a function to be executed after rendering a camera*/ + set afterCameraRender(callback) { + if (this._onAfterCameraRenderObserver) { + this.onAfterCameraRenderObservable.remove(this._onAfterCameraRenderObserver); } - return null; + this._onAfterCameraRenderObserver = this.onAfterCameraRenderObservable.add(callback); } /** - * Gets a mesh using a given name - * @param name defines the name to search for - * @returns the found mesh or null if not found at all. + * Gets or sets a predicate used to select candidate meshes for a pointer down event */ - getMeshByName(name69) { - for (let index = 0; index < this.meshes.length; index++) { - if (this.meshes[index].name === name69) { - return this.meshes[index]; - } - } - return null; + get pointerDownPredicate() { + return this._pointerPickingConfiguration.pointerDownPredicate; + } + set pointerDownPredicate(value) { + this._pointerPickingConfiguration.pointerDownPredicate = value; } /** - * Gets a transform node using a given name - * @param name defines the name to search for - * @returns the found transform node or null if not found at all. + * Gets or sets a predicate used to select candidate meshes for a pointer up event */ - getTransformNodeByName(name69) { - for (let index = 0; index < this.transformNodes.length; index++) { - if (this.transformNodes[index].name === name69) { - return this.transformNodes[index]; - } - } - return null; + get pointerUpPredicate() { + return this._pointerPickingConfiguration.pointerUpPredicate; + } + set pointerUpPredicate(value) { + this._pointerPickingConfiguration.pointerUpPredicate = value; } /** - * Gets a skeleton using a given Id (if many are found, this function will pick the last one) - * @param id defines the Id to search for - * @returns the found skeleton or null if not found at all. + * Gets or sets a predicate used to select candidate meshes for a pointer move event */ - getLastSkeletonById(id) { - for (let index = this.skeletons.length - 1; index >= 0; index--) { - if (this.skeletons[index].id === id) { - return this.skeletons[index]; - } - } - return null; + get pointerMovePredicate() { + return this._pointerPickingConfiguration.pointerMovePredicate; + } + set pointerMovePredicate(value) { + this._pointerPickingConfiguration.pointerMovePredicate = value; } /** - * Gets a skeleton using a given auto generated unique id - * @param uniqueId defines the unique id to search for - * @returns the found skeleton or null if not found at all. + * Gets or sets a predicate used to select candidate meshes for a pointer down event */ - getSkeletonByUniqueId(uniqueId) { - for (let index = 0; index < this.skeletons.length; index++) { - if (this.skeletons[index].uniqueId === uniqueId) { - return this.skeletons[index]; - } - } - return null; + get pointerDownFastCheck() { + return this._pointerPickingConfiguration.pointerDownFastCheck; + } + set pointerDownFastCheck(value) { + this._pointerPickingConfiguration.pointerDownFastCheck = value; } /** - * Gets a skeleton using a given id (if many are found, this function will pick the first one) - * @param id defines the id to search for - * @returns the found skeleton or null if not found at all. + * Gets or sets a predicate used to select candidate meshes for a pointer up event */ - getSkeletonById(id) { - for (let index = 0; index < this.skeletons.length; index++) { - if (this.skeletons[index].id === id) { - return this.skeletons[index]; - } - } - return null; + get pointerUpFastCheck() { + return this._pointerPickingConfiguration.pointerUpFastCheck; + } + set pointerUpFastCheck(value) { + this._pointerPickingConfiguration.pointerUpFastCheck = value; } /** - * Gets a skeleton using a given name - * @param name defines the name to search for - * @returns the found skeleton or null if not found at all. + * Gets or sets a predicate used to select candidate meshes for a pointer move event */ - getSkeletonByName(name69) { - for (let index = 0; index < this.skeletons.length; index++) { - if (this.skeletons[index].name === name69) { - return this.skeletons[index]; - } - } - return null; + get pointerMoveFastCheck() { + return this._pointerPickingConfiguration.pointerMoveFastCheck; + } + set pointerMoveFastCheck(value) { + this._pointerPickingConfiguration.pointerMoveFastCheck = value; } /** - * Gets a morph target manager using a given id (if many are found, this function will pick the last one) - * @param id defines the id to search for - * @returns the found morph target manager or null if not found at all. + * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer move event occurs. */ - getMorphTargetManagerById(id) { - for (let index = 0; index < this.morphTargetManagers.length; index++) { - if (this.morphTargetManagers[index].uniqueId === id) { - return this.morphTargetManagers[index]; - } - } - return null; + get skipPointerMovePicking() { + return this._pointerPickingConfiguration.skipPointerMovePicking; + } + set skipPointerMovePicking(value) { + this._pointerPickingConfiguration.skipPointerMovePicking = value; } /** - * Gets a morph target using a given id (if many are found, this function will pick the first one) - * @param id defines the id to search for - * @returns the found morph target or null if not found at all. + * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer down event occurs. */ - getMorphTargetById(id) { - for (let managerIndex = 0; managerIndex < this.morphTargetManagers.length; ++managerIndex) { - const morphTargetManager = this.morphTargetManagers[managerIndex]; - for (let index = 0; index < morphTargetManager.numTargets; ++index) { - const target = morphTargetManager.getTarget(index); - if (target.id === id) { - return target; - } - } - } - return null; + get skipPointerDownPicking() { + return this._pointerPickingConfiguration.skipPointerDownPicking; + } + set skipPointerDownPicking(value) { + this._pointerPickingConfiguration.skipPointerDownPicking = value; } /** - * Gets a morph target using a given name (if many are found, this function will pick the first one) - * @param name defines the name to search for - * @returns the found morph target or null if not found at all. + * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer up event occurs. Off by default. */ - getMorphTargetByName(name69) { - for (let managerIndex = 0; managerIndex < this.morphTargetManagers.length; ++managerIndex) { - const morphTargetManager = this.morphTargetManagers[managerIndex]; - for (let index = 0; index < morphTargetManager.numTargets; ++index) { - const target = morphTargetManager.getTarget(index); - if (target.name === name69) { - return target; - } - } - } - return null; + get skipPointerUpPicking() { + return this._pointerPickingConfiguration.skipPointerUpPicking; } - /** - * Gets a post process using a given name (if many are found, this function will pick the first one) - * @param name defines the name to search for - * @returns the found post process or null if not found at all. - */ - getPostProcessByName(name69) { - for (let postProcessIndex = 0; postProcessIndex < this.postProcesses.length; ++postProcessIndex) { - const postProcess = this.postProcesses[postProcessIndex]; - if (postProcess.name === name69) { - return postProcess; - } - } - return null; + set skipPointerUpPicking(value) { + this._pointerPickingConfiguration.skipPointerUpPicking = value; } /** - * Gets a boolean indicating if the given mesh is active - * @param mesh defines the mesh to look for - * @returns true if the mesh is in the active list + * Gets the pointer coordinates without any translation (ie. straight out of the pointer event) */ - isActiveMesh(mesh) { - return this._activeMeshes.indexOf(mesh) !== -1; + get unTranslatedPointer() { + return this._inputManager.unTranslatedPointer; } /** - * Return a unique id as a string which can serve as an identifier for the scene + * Gets or sets the distance in pixel that you have to move to prevent some events. Default is 10 pixels */ - get uid() { - if (!this._uid) { - this._uid = Tools.RandomId(); - } - return this._uid; + static get DragMovementThreshold() { + return InputManager.DragMovementThreshold; + } + static set DragMovementThreshold(value) { + InputManager.DragMovementThreshold = value; } /** - * Add an externally attached data from its key. - * This method call will fail and return false, if such key already exists. - * If you don't care and just want to get the data no matter what, use the more convenient getOrAddExternalDataWithFactory() method. - * @param key the unique key that identifies the data - * @param data the data object to associate to the key for this Engine instance - * @returns true if no such key were already present and the data was added successfully, false otherwise + * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 500 ms */ - addExternalData(key, data) { - if (!this._externalData) { - this._externalData = new StringDictionary(); - } - return this._externalData.add(key, data); + static get LongPressDelay() { + return InputManager.LongPressDelay; + } + static set LongPressDelay(value) { + InputManager.LongPressDelay = value; } /** - * Get an externally attached data from its key - * @param key the unique key that identifies the data - * @returns the associated data, if present (can be null), or undefined if not present + * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 300 ms */ - getExternalData(key) { - if (!this._externalData) { - return null; - } - return this._externalData.get(key); + static get DoubleClickDelay() { + return InputManager.DoubleClickDelay; + } + static set DoubleClickDelay(value) { + InputManager.DoubleClickDelay = value; + } + /** If you need to check double click without raising a single click at first click, enable this flag */ + static get ExclusiveDoubleClickMode() { + return InputManager.ExclusiveDoubleClickMode; + } + static set ExclusiveDoubleClickMode(value) { + InputManager.ExclusiveDoubleClickMode = value; } /** - * Get an externally attached data from its key, create it using a factory if it's not already present - * @param key the unique key that identifies the data - * @param factory the factory that will be called to create the instance if and only if it doesn't exists - * @returns the associated data, can be null if the factory returned null. + * Bind the current view position to an effect. + * @param effect The effect to be bound + * @param variableName name of the shader variable that will hold the eye position + * @param isVector3 true to indicates that variableName is a Vector3 and not a Vector4 + * @returns the computed eye position */ - getOrAddExternalDataWithFactory(key, factory) { - if (!this._externalData) { - this._externalData = new StringDictionary(); + bindEyePosition(effect, variableName = "vEyePosition", isVector3 = false) { + const eyePosition = this._forcedViewPosition ? this._forcedViewPosition : this._mirroredCameraPosition ? this._mirroredCameraPosition : this.activeCamera.globalPosition; + const invertNormal = this.useRightHandedSystem === (this._mirroredCameraPosition != null); + TmpVectors.Vector4[0].set(eyePosition.x, eyePosition.y, eyePosition.z, invertNormal ? -1 : 1); + if (effect) { + if (isVector3) { + effect.setFloat3(variableName, TmpVectors.Vector4[0].x, TmpVectors.Vector4[0].y, TmpVectors.Vector4[0].z); + } else { + effect.setVector4(variableName, TmpVectors.Vector4[0]); + } } - return this._externalData.getOrAddWithFactory(key, factory); + return TmpVectors.Vector4[0]; } /** - * Remove an externally attached data from the Engine instance - * @param key the unique key that identifies the data - * @returns true if the data was successfully removed, false if it doesn't exist + * Update the scene ubo before it can be used in rendering processing + * @returns the scene UniformBuffer */ - removeExternalData(key) { - return this._externalData.remove(key); + finalizeSceneUbo() { + const ubo = this.getSceneUniformBuffer(); + const eyePosition = this.bindEyePosition(null); + ubo.updateFloat4("vEyePosition", eyePosition.x, eyePosition.y, eyePosition.z, eyePosition.w); + ubo.update(); + return ubo; } - _evaluateSubMesh(subMesh, mesh, initialMesh, forcePush) { - if (forcePush || subMesh.isInFrustum(this._frustumPlanes)) { - for (const step of this._evaluateSubMeshStage) { - step.action(mesh, subMesh); - } - const material = subMesh.getMaterial(); - if (material !== null && material !== void 0) { - if (material.hasRenderTargetTextures && material.getRenderTargetTextures != null) { - if (this._processedMaterials.indexOf(material) === -1) { - this._processedMaterials.push(material); - this._materialsRenderTargets.concatWithNoDuplicate(material.getRenderTargetTextures()); - } - } - this._renderingManager.dispatch(subMesh, mesh, material); - } + /** + * Gets or sets a boolean indicating if the scene must use right-handed coordinates system + */ + set useRightHandedSystem(value) { + if (this._useRightHandedSystem === value) { + return; } + this._useRightHandedSystem = value; + this.markAllMaterialsAsDirty(16); + } + get useRightHandedSystem() { + return this._useRightHandedSystem; } /** - * Clear the processed materials smart array preventing retention point in material dispose. + * Sets the step Id used by deterministic lock step + * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep + * @param newStepId defines the step Id */ - freeProcessedMaterials() { - this._processedMaterials.dispose(); + setStepId(newStepId) { + this._currentStepId = newStepId; } - /** Gets or sets a boolean blocking all the calls to freeActiveMeshes and freeRenderingGroups - * It can be used in order to prevent going through methods freeRenderingGroups and freeActiveMeshes several times to improve performance - * when disposing several meshes in a row or a hierarchy of meshes. - * When used, it is the responsibility of the user to blockfreeActiveMeshesAndRenderingGroups back to false. + /** + * Gets the step Id used by deterministic lock step + * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep + * @returns the step Id */ - get blockfreeActiveMeshesAndRenderingGroups() { - return this._preventFreeActiveMeshesAndRenderingGroups; + getStepId() { + return this._currentStepId; } - set blockfreeActiveMeshesAndRenderingGroups(value) { - if (this._preventFreeActiveMeshesAndRenderingGroups === value) { - return; - } - if (value) { - this.freeActiveMeshes(); - this.freeRenderingGroups(); - } - this._preventFreeActiveMeshesAndRenderingGroups = value; + /** + * Gets the internal step used by deterministic lock step + * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep + * @returns the internal step + */ + getInternalStep() { + return this._currentInternalStep; } /** - * Clear the active meshes smart array preventing retention point in mesh dispose. + * Gets or sets a boolean indicating if fog is enabled on this scene + * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog + * (Default is true) */ - freeActiveMeshes() { - if (this.blockfreeActiveMeshesAndRenderingGroups) { + set fogEnabled(value) { + if (this._fogEnabled === value) { return; } - this._activeMeshes.dispose(); - if (this.activeCamera && this.activeCamera._activeMeshes) { - this.activeCamera._activeMeshes.dispose(); - } - if (this.activeCameras) { - for (let i = 0; i < this.activeCameras.length; i++) { - const activeCamera = this.activeCameras[i]; - if (activeCamera && activeCamera._activeMeshes) { - activeCamera._activeMeshes.dispose(); - } - } - } + this._fogEnabled = value; + this.markAllMaterialsAsDirty(16); + } + get fogEnabled() { + return this._fogEnabled; } /** - * Clear the info related to rendering groups preventing retention points during dispose. + * Gets or sets the fog mode to use + * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog + * | mode | value | + * | --- | --- | + * | FOGMODE_NONE | 0 | + * | FOGMODE_EXP | 1 | + * | FOGMODE_EXP2 | 2 | + * | FOGMODE_LINEAR | 3 | */ - freeRenderingGroups() { - if (this.blockfreeActiveMeshesAndRenderingGroups) { + set fogMode(value) { + if (this._fogMode === value) { return; } - if (this._renderingManager) { - this._renderingManager.freeRenderingGroups(); - } - if (this.textures) { - for (let i = 0; i < this.textures.length; i++) { - const texture = this.textures[i]; - if (texture && texture.renderList) { - texture.freeRenderingGroups(); - } - } - } + this._fogMode = value; + this.markAllMaterialsAsDirty(16); } - /** @internal */ - _isInIntermediateRendering() { - return this._intermediateRendering; + get fogMode() { + return this._fogMode; } /** - * Use this function to stop evaluating active meshes. The current list will be keep alive between frames - * @param skipEvaluateActiveMeshes defines an optional boolean indicating that the evaluate active meshes step must be completely skipped - * @param onSuccess optional success callback - * @param onError optional error callback - * @param freezeMeshes defines if meshes should be frozen (true by default) - * @param keepFrustumCulling defines if you want to keep running the frustum clipping (false by default) - * @returns the current scene + * Flag indicating that the frame buffer binding is handled by another component */ - freezeActiveMeshes(skipEvaluateActiveMeshes = false, onSuccess, onError, freezeMeshes = true, keepFrustumCulling = false) { - this.executeWhenReady(() => { - if (!this.activeCamera) { - onError && onError("No active camera found"); - return; - } - if (!this._frustumPlanes) { - this.updateTransformMatrix(); - } - this._evaluateActiveMeshes(); - this._activeMeshesFrozen = true; - this._activeMeshesFrozenButKeepClipping = keepFrustumCulling; - this._skipEvaluateActiveMeshesCompletely = skipEvaluateActiveMeshes; - if (freezeMeshes) { - for (let index = 0; index < this._activeMeshes.length; index++) { - this._activeMeshes.data[index]._freeze(); - } - } - onSuccess && onSuccess(); - }); - return this; + get prePass() { + return !!this.prePassRenderer && this.prePassRenderer.defaultRT.enabled; } /** - * Use this function to restart evaluating active meshes on every frame - * @returns the current scene + * Gets or sets a boolean indicating if shadows are enabled on this scene */ - unfreezeActiveMeshes() { - for (let index = 0; index < this.meshes.length; index++) { - const mesh = this.meshes[index]; - if (mesh._internalAbstractMeshDataInfo) { - mesh._internalAbstractMeshDataInfo._isActive = false; - } - } - for (let index = 0; index < this._activeMeshes.length; index++) { - this._activeMeshes.data[index]._unFreeze(); + set shadowsEnabled(value) { + if (this._shadowsEnabled === value) { + return; } - this._activeMeshesFrozen = false; - return this; + this._shadowsEnabled = value; + this.markAllMaterialsAsDirty(2); } - _executeActiveContainerCleanup(container) { - const isInFastMode = this._engine.snapshotRendering && this._engine.snapshotRenderingMode === 1; - if (!isInFastMode && this._activeMeshesFrozen && this._activeMeshes.length) { + get shadowsEnabled() { + return this._shadowsEnabled; + } + /** + * Gets or sets a boolean indicating if lights are enabled on this scene + */ + set lightsEnabled(value) { + if (this._lightsEnabled === value) { return; } - this.onBeforeRenderObservable.addOnce(() => container.dispose()); + this._lightsEnabled = value; + this.markAllMaterialsAsDirty(2); } - _evaluateActiveMeshes() { - var _a; - if (this._engine.snapshotRendering && this._engine.snapshotRenderingMode === 1) { - if (this._activeMeshes.length > 0) { - (_a = this.activeCamera) == null ? void 0 : _a._activeMeshes.reset(); - this._activeMeshes.reset(); - this._renderingManager.reset(); - this._processedMaterials.reset(); - this._activeParticleSystems.reset(); - this._activeSkeletons.reset(); - this._softwareSkinnedMeshes.reset(); - } - return; + get lightsEnabled() { + return this._lightsEnabled; + } + /** All of the active cameras added to this scene. */ + get activeCameras() { + return this._activeCameras; + } + set activeCameras(cameras) { + if (this._unObserveActiveCameras) { + this._unObserveActiveCameras(); + this._unObserveActiveCameras = null; } - if (this._activeMeshesFrozen && this._activeMeshes.length) { - if (!this._skipEvaluateActiveMeshesCompletely) { - const len2 = this._activeMeshes.length; - for (let i = 0; i < len2; i++) { - const mesh = this._activeMeshes.data[i]; - mesh.computeWorldMatrix(); - } - } - if (this._activeParticleSystems) { - const psLength = this._activeParticleSystems.length; - for (let i = 0; i < psLength; i++) { - this._activeParticleSystems.data[i].animate(); - } - } - this._renderingManager.resetSprites(); - return; + if (cameras) { + this._unObserveActiveCameras = _ObserveArray(cameras, () => { + this.onActiveCamerasChanged.notifyObservers(this); + }); } - if (!this.activeCamera) { + this._activeCameras = cameras; + } + /** Gets or sets the current active camera */ + get activeCamera() { + return this._activeCamera; + } + set activeCamera(value) { + if (value === this._activeCamera) { return; } - this.onBeforeActiveMeshesEvaluationObservable.notifyObservers(this); - this.activeCamera._activeMeshes.reset(); - this._activeMeshes.reset(); - this._renderingManager.reset(); - this._processedMaterials.reset(); - this._activeParticleSystems.reset(); - this._activeSkeletons.reset(); - this._softwareSkinnedMeshes.reset(); - this._materialsRenderTargets.reset(); - for (const step of this._beforeEvaluateActiveMeshStage) { - step.action(); - } - const meshes = this.getActiveMeshCandidates(); - const len = meshes.length; - for (let i = 0; i < len; i++) { - const mesh = meshes.data[i]; - mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate = false; - if (mesh.isBlocked) { - continue; - } - this._totalVertices.addCount(mesh.getTotalVertices(), false); - if (!mesh.isReady() || !mesh.isEnabled() || mesh.scaling.hasAZeroComponent) { - continue; - } - mesh.computeWorldMatrix(); - if (mesh.actionManager && mesh.actionManager.hasSpecificTriggers2(12, 13)) { - this._meshesForIntersections.pushNoDuplicate(mesh); - } - let meshToRender = this.customLODSelector ? this.customLODSelector(mesh, this.activeCamera) : mesh.getLOD(this.activeCamera); - mesh._internalAbstractMeshDataInfo._currentLOD = meshToRender; - mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate = true; - if (meshToRender === void 0 || meshToRender === null) { - continue; - } - if (meshToRender !== mesh && meshToRender.billboardMode !== 0) { - meshToRender.computeWorldMatrix(); - } - mesh._preActivate(); - if (mesh.isVisible && mesh.visibility > 0 && (mesh.layerMask & this.activeCamera.layerMask) !== 0 && (this._skipFrustumClipping || mesh.alwaysSelectAsActiveMesh || mesh.isInFrustum(this._frustumPlanes))) { - this._activeMeshes.push(mesh); - this.activeCamera._activeMeshes.push(mesh); - if (meshToRender !== mesh) { - meshToRender._activate(this._renderId, false); - } - for (const step of this._preActiveMeshStage) { - step.action(mesh); - } - if (mesh._activate(this._renderId, false)) { - if (!mesh.isAnInstance) { - meshToRender._internalAbstractMeshDataInfo._onlyForInstances = false; - } else { - if (mesh._internalAbstractMeshDataInfo._actAsRegularMesh) { - meshToRender = mesh; - } - } - meshToRender._internalAbstractMeshDataInfo._isActive = true; - this._activeMesh(mesh, meshToRender); - } - mesh._postActivate(); - } - } - this.onAfterActiveMeshesEvaluationObservable.notifyObservers(this); - if (this.particlesEnabled) { - this.onBeforeParticlesRenderingObservable.notifyObservers(this); - for (let particleIndex = 0; particleIndex < this.particleSystems.length; particleIndex++) { - const particleSystem = this.particleSystems[particleIndex]; - if (!particleSystem.isStarted() || !particleSystem.emitter) { - continue; - } - const emitter = particleSystem.emitter; - if (!emitter.position || emitter.isEnabled()) { - this._activeParticleSystems.push(particleSystem); - particleSystem.animate(); - this._renderingManager.dispatchParticles(particleSystem); - } - } - this.onAfterParticlesRenderingObservable.notifyObservers(this); - } + this._activeCamera = value; + this.onActiveCameraChanged.notifyObservers(this); } - _activeMesh(sourceMesh, mesh) { - if (this._skeletonsEnabled && mesh.skeleton !== null && mesh.skeleton !== void 0) { - if (this._activeSkeletons.pushNoDuplicate(mesh.skeleton)) { - mesh.skeleton.prepare(); - this._activeBones.addCount(mesh.skeleton.bones.length, false); - } - if (!mesh.computeBonesUsingShaders) { - this._softwareSkinnedMeshes.pushNoDuplicate(mesh); - } - } - let forcePush = sourceMesh.hasInstances || sourceMesh.isAnInstance || this.dispatchAllSubMeshesOfActiveMeshes || this._skipFrustumClipping || mesh.alwaysSelectAsActiveMesh; - if (mesh && mesh.subMeshes && mesh.subMeshes.length > 0) { - const subMeshes = this.getActiveSubMeshCandidates(mesh); - const len = subMeshes.length; - forcePush = forcePush || len === 1; - for (let i = 0; i < len; i++) { - const subMesh = subMeshes.data[i]; - this._evaluateSubMesh(subMesh, mesh, sourceMesh, forcePush); - } + /** The default material used on meshes when no material is affected */ + get defaultMaterial() { + if (!this._defaultMaterial) { + this._defaultMaterial = _Scene.DefaultMaterialFactory(this); } + return this._defaultMaterial; + } + /** The default material used on meshes when no material is affected */ + set defaultMaterial(value) { + this._defaultMaterial = value; } /** - * Update the transform matrix to update from the current active camera - * @param force defines a boolean used to force the update even if cache is up to date + * Gets or sets a boolean indicating if textures are enabled on this scene */ - updateTransformMatrix(force) { - const activeCamera = this.activeCamera; - if (!activeCamera) { + set texturesEnabled(value) { + if (this._texturesEnabled === value) { return; } - if (activeCamera._renderingMultiview) { - const leftCamera = activeCamera._rigCameras[0]; - const rightCamera = activeCamera._rigCameras[1]; - this.setTransformMatrix(leftCamera.getViewMatrix(), leftCamera.getProjectionMatrix(force), rightCamera.getViewMatrix(), rightCamera.getProjectionMatrix(force)); - } else { - this.setTransformMatrix(activeCamera.getViewMatrix(), activeCamera.getProjectionMatrix(force)); - } - } - _bindFrameBuffer(camera, clear = true) { - if (camera && camera._multiviewTexture) { - camera._multiviewTexture._bindFrameBuffer(); - } else if (camera && camera.outputRenderTarget) { - camera.outputRenderTarget._bindFrameBuffer(); - } else { - if (!this._engine._currentFrameBufferIsDefaultFrameBuffer()) { - this._engine.restoreDefaultFramebuffer(); - } - } - if (clear) { - this._clearFrameBuffer(camera); - } + this._texturesEnabled = value; + this.markAllMaterialsAsDirty(1); } - _clearFrameBuffer(camera) { - if (camera && camera._multiviewTexture) { - } else if (camera && camera.outputRenderTarget && !camera._renderingMultiview) { - const rtt = camera.outputRenderTarget; - if (rtt.onClearObservable.hasObservers()) { - rtt.onClearObservable.notifyObservers(this._engine); - } else if (!rtt.skipInitialClear && !camera.isRightCamera) { - if (this.autoClear) { - this._engine.clear(rtt.clearColor || this.clearColor, !rtt._cleared, true, true); - } - rtt._cleared = true; - } - } else { - if (!this._defaultFrameBufferCleared) { - this._defaultFrameBufferCleared = true; - this._clear(); - } else { - this._engine.clear(null, false, true, true); - } - } + get texturesEnabled() { + return this._texturesEnabled; } /** - * @internal + * Gets or sets a boolean indicating if skeletons are enabled on this scene */ - _renderForCamera(camera, rigParent, bindFrameBuffer = true) { - var _a; - if (camera && camera._skipRendering) { + set skeletonsEnabled(value) { + if (this._skeletonsEnabled === value) { return; } - const engine = this._engine; - this._activeCamera = camera; - if (!this.activeCamera) { - throw new Error("Active camera not set"); - } - engine.setViewport(this.activeCamera.viewport); - this.resetCachedMaterial(); - this._renderId++; - if (!this.prePass && bindFrameBuffer) { - let skipInitialClear = true; - if (camera._renderingMultiview && camera.outputRenderTarget) { - skipInitialClear = camera.outputRenderTarget.skipInitialClear; - if (this.autoClear) { - this._defaultFrameBufferCleared = false; - camera.outputRenderTarget.skipInitialClear = false; - } - } - this._bindFrameBuffer(this._activeCamera); - if (camera._renderingMultiview && camera.outputRenderTarget) { - camera.outputRenderTarget.skipInitialClear = skipInitialClear; - } - } - this.updateTransformMatrix(); - this.onBeforeCameraRenderObservable.notifyObservers(this.activeCamera); - this._evaluateActiveMeshes(); - for (let softwareSkinnedMeshIndex = 0; softwareSkinnedMeshIndex < this._softwareSkinnedMeshes.length; softwareSkinnedMeshIndex++) { - const mesh = this._softwareSkinnedMeshes.data[softwareSkinnedMeshIndex]; - mesh.applySkeleton(mesh.skeleton); - } - this.onBeforeRenderTargetsRenderObservable.notifyObservers(this); - this._renderTargets.concatWithNoDuplicate(this._materialsRenderTargets); - if (camera.customRenderTargets && camera.customRenderTargets.length > 0) { - this._renderTargets.concatWithNoDuplicate(camera.customRenderTargets); - } - if (rigParent && rigParent.customRenderTargets && rigParent.customRenderTargets.length > 0) { - this._renderTargets.concatWithNoDuplicate(rigParent.customRenderTargets); - } - if (this.environmentTexture && this.environmentTexture.isRenderTarget) { - this._renderTargets.pushNoDuplicate(this.environmentTexture); - } - for (const step of this._gatherActiveCameraRenderTargetsStage) { - step.action(this._renderTargets); - } - let needRebind = false; - if (this.renderTargetsEnabled) { - this._intermediateRendering = true; - if (this._renderTargets.length > 0) { - Tools.StartPerformanceCounter("Render targets", this._renderTargets.length > 0); - for (let renderIndex = 0; renderIndex < this._renderTargets.length; renderIndex++) { - const renderTarget = this._renderTargets.data[renderIndex]; - if (renderTarget._shouldRender()) { - this._renderId++; - const hasSpecialRenderTargetCamera = renderTarget.activeCamera && renderTarget.activeCamera !== this.activeCamera; - renderTarget.render(hasSpecialRenderTargetCamera, this.dumpNextRenderTargets); - needRebind = true; - } - } - Tools.EndPerformanceCounter("Render targets", this._renderTargets.length > 0); - this._renderId++; - } - for (const step of this._cameraDrawRenderTargetStage) { - needRebind = step.action(this.activeCamera) || needRebind; - } - this._intermediateRendering = false; - } - this._engine.currentRenderPassId = ((_a = camera.outputRenderTarget) == null ? void 0 : _a.renderPassId) ?? camera.renderPassId ?? 0; - if (needRebind && !this.prePass) { - this._bindFrameBuffer(this._activeCamera, false); - this.updateTransformMatrix(); - } - this.onAfterRenderTargetsRenderObservable.notifyObservers(this); - if (this.postProcessManager && !camera._multiviewTexture && !this.prePass) { - this.postProcessManager._prepareFrame(); - } - for (const step of this._beforeCameraDrawStage) { - step.action(this.activeCamera); - } - this.onBeforeDrawPhaseObservable.notifyObservers(this); - if (engine.snapshotRendering && engine.snapshotRenderingMode === 1) { - this.finalizeSceneUbo(); - } - this._renderingManager.render(null, null, true, true); - this.onAfterDrawPhaseObservable.notifyObservers(this); - for (const step of this._afterCameraDrawStage) { - step.action(this.activeCamera); - } - if (this.postProcessManager && !camera._multiviewTexture) { - const texture = camera.outputRenderTarget ? camera.outputRenderTarget.renderTarget : void 0; - this.postProcessManager._finalizeFrame(camera.isIntermediate, texture); - } - for (const step of this._afterCameraPostProcessStage) { - step.action(this.activeCamera); - } - this._renderTargets.reset(); - this.onAfterCameraRenderObservable.notifyObservers(this.activeCamera); + this._skeletonsEnabled = value; + this.markAllMaterialsAsDirty(8); } - _processSubCameras(camera, bindFrameBuffer = true) { - if (camera.cameraRigMode === 0 || camera._renderingMultiview) { - if (camera._renderingMultiview && !this._multiviewSceneUbo) { - this._createMultiviewUbo(); - } - this._renderForCamera(camera, void 0, bindFrameBuffer); - this.onAfterRenderCameraObservable.notifyObservers(camera); - return; - } - if (camera._useMultiviewToSingleView) { - this._renderMultiviewToSingleView(camera); - } else { - this.onBeforeCameraRenderObservable.notifyObservers(camera); - for (let index = 0; index < camera._rigCameras.length; index++) { - this._renderForCamera(camera._rigCameras[index], camera); - } - } - this._activeCamera = camera; - this.updateTransformMatrix(); - this.onAfterRenderCameraObservable.notifyObservers(camera); + get skeletonsEnabled() { + return this._skeletonsEnabled; } - _checkIntersections() { - for (let index = 0; index < this._meshesForIntersections.length; index++) { - const sourceMesh = this._meshesForIntersections.data[index]; - if (!sourceMesh.actionManager) { - continue; - } - for (let actionIndex = 0; sourceMesh.actionManager && actionIndex < sourceMesh.actionManager.actions.length; actionIndex++) { - const action = sourceMesh.actionManager.actions[actionIndex]; - if (action.trigger === 12 || action.trigger === 13) { - const parameters = action.getTriggerParameter(); - const otherMesh = parameters.mesh ? parameters.mesh : parameters; - const areIntersecting = otherMesh.intersectsMesh(sourceMesh, parameters.usePreciseIntersection); - const currentIntersectionInProgress = sourceMesh._intersectionsInProgress.indexOf(otherMesh); - if (areIntersecting && currentIntersectionInProgress === -1) { - if (action.trigger === 12) { - action._executeCurrent(ActionEvent.CreateNew(sourceMesh, void 0, otherMesh)); - sourceMesh._intersectionsInProgress.push(otherMesh); - } else if (action.trigger === 13) { - sourceMesh._intersectionsInProgress.push(otherMesh); - } - } else if (!areIntersecting && currentIntersectionInProgress > -1) { - if (action.trigger === 13) { - action._executeCurrent(ActionEvent.CreateNew(sourceMesh, void 0, otherMesh)); - } - if (!sourceMesh.actionManager.hasSpecificTrigger(13, (parameter) => { - const parameterMesh = parameter.mesh ? parameter.mesh : parameter; - return otherMesh === parameterMesh; - }) || action.trigger === 13) { - sourceMesh._intersectionsInProgress.splice(currentIntersectionInProgress, 1); - } - } - } - } + /** @internal */ + get collisionCoordinator() { + if (!this._collisionCoordinator) { + this._collisionCoordinator = _Scene.CollisionCoordinatorFactory(); + this._collisionCoordinator.init(this); } + return this._collisionCoordinator; } /** - * @internal + * Gets the scene's rendering manager */ - _advancePhysicsEngineStep(step) { - } - /** @internal */ - _animate(customDeltaTime) { - } - /** Execute all animations (for a frame) */ - animate() { - if (this._engine.isDeterministicLockStep()) { - let deltaTime = Math.max(_Scene.MinDeltaTime, Math.min(this._engine.getDeltaTime(), _Scene.MaxDeltaTime)) + this._timeAccumulator; - const defaultFrameTime = this._engine.getTimeStep(); - const defaultFPS = 1e3 / defaultFrameTime / 1e3; - let stepsTaken = 0; - const maxSubSteps = this._engine.getLockstepMaxSteps(); - let internalSteps = Math.floor(deltaTime / defaultFrameTime); - internalSteps = Math.min(internalSteps, maxSubSteps); - while (deltaTime > 0 && stepsTaken < internalSteps) { - this.onBeforeStepObservable.notifyObservers(this); - this._animationRatio = defaultFrameTime * defaultFPS; - this._animate(defaultFrameTime); - this.onAfterAnimationsObservable.notifyObservers(this); - if (this.physicsEnabled) { - this._advancePhysicsEngineStep(defaultFrameTime); - } - this.onAfterStepObservable.notifyObservers(this); - this._currentStepId++; - stepsTaken++; - deltaTime -= defaultFrameTime; - } - this._timeAccumulator = deltaTime < 0 ? 0 : deltaTime; - } else { - const deltaTime = this.useConstantAnimationDeltaTime ? 16 : Math.max(_Scene.MinDeltaTime, Math.min(this._engine.getDeltaTime(), _Scene.MaxDeltaTime)); - this._animationRatio = deltaTime * (60 / 1e3); - this._animate(); - this.onAfterAnimationsObservable.notifyObservers(this); - if (this.physicsEnabled) { - this._advancePhysicsEngineStep(deltaTime); - } - } - } - _clear() { - if (this.autoClearDepthAndStencil || this.autoClear) { - this._engine.clear(this.clearColor, this.autoClear || this.forceWireframe || this.forcePointsCloud, this.autoClearDepthAndStencil, this.autoClearDepthAndStencil); - } - } - _checkCameraRenderTarget(camera) { - var _a; - if ((camera == null ? void 0 : camera.outputRenderTarget) && !(camera == null ? void 0 : camera.isRigCamera)) { - camera.outputRenderTarget._cleared = false; - } - if ((_a = camera == null ? void 0 : camera.rigCameras) == null ? void 0 : _a.length) { - for (let i = 0; i < camera.rigCameras.length; ++i) { - const rtt = camera.rigCameras[i].outputRenderTarget; - if (rtt) { - rtt._cleared = false; - } - } - } + get renderingManager() { + return this._renderingManager; } /** - * Resets the draw wrappers cache of all meshes - * @param passId If provided, releases only the draw wrapper corresponding to this render pass id + * Gets the list of frustum planes (built from the active camera) */ - resetDrawCache(passId) { - if (!this.meshes) { - return; - } - for (const mesh of this.meshes) { - mesh.resetDrawCache(passId); - } + get frustumPlanes() { + return this._frustumPlanes; } /** - * Render the scene - * @param updateCameras defines a boolean indicating if cameras must update according to their inputs (true by default) - * @param ignoreAnimations defines a boolean indicating if animations should not be executed (false by default) + * Registers the transient components if needed. */ - render(updateCameras = true, ignoreAnimations = false) { - var _a, _b; - if (this.isDisposed) { - return; - } - if (this.onReadyObservable.hasObservers() && this._executeWhenReadyTimeoutId === null) { - this._checkIsReady(); - } - this._frameId++; - this._defaultFrameBufferCleared = false; - this._checkCameraRenderTarget(this.activeCamera); - if ((_a = this.activeCameras) == null ? void 0 : _a.length) { - this.activeCameras.forEach(this._checkCameraRenderTarget); - } - this._registerTransientComponents(); - this._activeParticles.fetchNewFrame(); - this._totalVertices.fetchNewFrame(); - this._activeIndices.fetchNewFrame(); - this._activeBones.fetchNewFrame(); - this._meshesForIntersections.reset(); - this.resetCachedMaterial(); - this.onBeforeAnimationsObservable.notifyObservers(this); - if (this.actionManager) { - this.actionManager.processTrigger(11); - } - if (!ignoreAnimations) { - this.animate(); - } - for (const step of this._beforeCameraUpdateStage) { - step.action(); - } - if (updateCameras) { - if (this.activeCameras && this.activeCameras.length > 0) { - for (let cameraIndex = 0; cameraIndex < this.activeCameras.length; cameraIndex++) { - const camera = this.activeCameras[cameraIndex]; - camera.update(); - if (camera.cameraRigMode !== 0) { - for (let index = 0; index < camera._rigCameras.length; index++) { - camera._rigCameras[index].update(); - } - } - } - } else if (this.activeCamera) { - this.activeCamera.update(); - if (this.activeCamera.cameraRigMode !== 0) { - for (let index = 0; index < this.activeCamera._rigCameras.length; index++) { - this.activeCamera._rigCameras[index].update(); - } - } - } - } - this.onBeforeRenderObservable.notifyObservers(this); - const engine = this.getEngine(); - this.onBeforeRenderTargetsRenderObservable.notifyObservers(this); - const currentActiveCamera = ((_b = this.activeCameras) == null ? void 0 : _b.length) ? this.activeCameras[0] : this.activeCamera; - if (this.renderTargetsEnabled) { - Tools.StartPerformanceCounter("Custom render targets", this.customRenderTargets.length > 0); - this._intermediateRendering = true; - for (let customIndex = 0; customIndex < this.customRenderTargets.length; customIndex++) { - const renderTarget = this.customRenderTargets[customIndex]; - if (renderTarget._shouldRender()) { - this._renderId++; - this.activeCamera = renderTarget.activeCamera || this.activeCamera; - if (!this.activeCamera) { - throw new Error("Active camera not set"); - } - engine.setViewport(this.activeCamera.viewport); - this.updateTransformMatrix(); - renderTarget.render(currentActiveCamera !== this.activeCamera, this.dumpNextRenderTargets); - } - } - Tools.EndPerformanceCounter("Custom render targets", this.customRenderTargets.length > 0); - this._intermediateRendering = false; - this._renderId++; - } - this._engine.currentRenderPassId = (currentActiveCamera == null ? void 0 : currentActiveCamera.renderPassId) ?? 0; - this.activeCamera = currentActiveCamera; - if (this._activeCamera && this._activeCamera.cameraRigMode !== 22 && !this.prePass) { - this._bindFrameBuffer(this._activeCamera, false); - } - this.onAfterRenderTargetsRenderObservable.notifyObservers(this); - for (const step of this._beforeClearStage) { - step.action(); - } - this._clearFrameBuffer(this.activeCamera); - for (const step of this._gatherRenderTargetsStage) { - step.action(this._renderTargets); - } - if (this.activeCameras && this.activeCameras.length > 0) { - for (let cameraIndex = 0; cameraIndex < this.activeCameras.length; cameraIndex++) { - this._processSubCameras(this.activeCameras[cameraIndex], cameraIndex > 0); - } - } else { - if (!this.activeCamera) { - throw new Error("No camera defined"); - } - this._processSubCameras(this.activeCamera, !!this.activeCamera.outputRenderTarget); - } - this._checkIntersections(); - for (const step of this._afterRenderStage) { - step.action(); - } - if (this.afterRender) { - this.afterRender(); - } - this.onAfterRenderObservable.notifyObservers(this); - if (this._toBeDisposed.length) { - for (let index = 0; index < this._toBeDisposed.length; index++) { - const data = this._toBeDisposed[index]; - if (data) { - data.dispose(); - } + _registerTransientComponents() { + if (this._transientComponents.length > 0) { + for (const component of this._transientComponents) { + component.register(); } - this._toBeDisposed.length = 0; - } - if (this.dumpNextRenderTargets) { - this.dumpNextRenderTargets = false; + this._transientComponents.length = 0; } - this._activeBones.addCount(0, true); - this._activeIndices.addCount(0, true); - this._activeParticles.addCount(0, true); - this._engine.restoreDefaultFramebuffer(); } /** - * Freeze all materials - * A frozen material will not be updatable but should be faster to render - * Note: multimaterials will not be frozen, but their submaterials will + * @internal + * Add a component to the scene. + * Note that the ccomponent could be registered on th next frame if this is called after + * the register component stage. + * @param component Defines the component to add to the scene */ - freezeMaterials() { - for (let i = 0; i < this.materials.length; i++) { - this.materials[i].freeze(); + _addComponent(component) { + this._components.push(component); + this._transientComponents.push(component); + const serializableComponent = component; + if (serializableComponent.addFromContainer && serializableComponent.serialize) { + this._serializableComponents.push(serializableComponent); } } /** - * Unfreeze all materials - * A frozen material will not be updatable but should be faster to render + * @internal + * Gets a component from the scene. + * @param name defines the name of the component to retrieve + * @returns the component or null if not present */ - unfreezeMaterials() { - for (let i = 0; i < this.materials.length; i++) { - this.materials[i].unfreeze(); + _getComponent(name69) { + for (const component of this._components) { + if (component.name === name69) { + return component; + } } + return null; } /** - * Releases all held resources + * Creates a new Scene + * @param engine defines the engine to use to render this scene + * @param options defines the scene options */ - dispose() { - if (this.isDisposed) { - return; - } - this.beforeRender = null; - this.afterRender = null; + constructor(engine, options) { + super(); + this._inputManager = new InputManager(this); + this.cameraToUseForPointers = null; + this._isScene = true; + this._blockEntityCollection = false; + this.autoClear = true; + this.autoClearDepthAndStencil = true; + this.clearColor = new Color4(0.2, 0.2, 0.3, 1); + this.ambientColor = new Color3(0, 0, 0); + this.environmentIntensity = 1; + this._performancePriority = ScenePerformancePriority.BackwardCompatible; + this.onScenePerformancePriorityChangedObservable = new Observable(); + this._forceWireframe = false; + this._skipFrustumClipping = false; + this._forcePointsCloud = false; + this.animationsEnabled = true; + this._animationPropertiesOverride = null; + this.useConstantAnimationDeltaTime = false; + this.constantlyUpdateMeshUnderPointer = false; + this.hoverCursor = "pointer"; + this.defaultCursor = ""; + this.doNotHandleCursors = false; + this.preventDefaultOnPointerDown = true; + this.preventDefaultOnPointerUp = true; this.metadata = null; - this.skeletons.length = 0; - this.morphTargetManagers.length = 0; - this._transientComponents.length = 0; - this._isReadyForMeshStage.clear(); - this._beforeEvaluateActiveMeshStage.clear(); - this._evaluateSubMeshStage.clear(); - this._preActiveMeshStage.clear(); - this._cameraDrawRenderTargetStage.clear(); - this._beforeCameraDrawStage.clear(); - this._beforeRenderTargetDrawStage.clear(); - this._beforeRenderingGroupDrawStage.clear(); - this._beforeRenderingMeshStage.clear(); - this._afterRenderingMeshStage.clear(); - this._afterRenderingGroupDrawStage.clear(); - this._afterCameraDrawStage.clear(); - this._afterRenderTargetDrawStage.clear(); - this._afterRenderStage.clear(); - this._beforeCameraUpdateStage.clear(); - this._beforeClearStage.clear(); - this._gatherRenderTargetsStage.clear(); - this._gatherActiveCameraRenderTargetsStage.clear(); - this._pointerMoveStage.clear(); - this._pointerDownStage.clear(); - this._pointerUpStage.clear(); - this.importedMeshesFiles = []; - if (this.stopAllAnimations) { - this._activeAnimatables.forEach((animatable) => { - animatable.onAnimationEndObservable.clear(); - animatable.onAnimationEnd = null; - }); - this.stopAllAnimations(); - } - this.resetCachedMaterial(); - if (this.activeCamera) { - this.activeCamera._activeMeshes.dispose(); - this.activeCamera = null; - } - this.activeCameras = null; - this._activeMeshes.dispose(); - this._renderingManager.dispose(); - this._processedMaterials.dispose(); - this._activeParticleSystems.dispose(); - this._activeSkeletons.dispose(); - this._softwareSkinnedMeshes.dispose(); - this._renderTargets.dispose(); - this._materialsRenderTargets.dispose(); - this._registeredForLateAnimationBindings.dispose(); - this._meshesForIntersections.dispose(); - this._toBeDisposed.length = 0; - const activeRequests = this._activeRequests.slice(); - for (const request of activeRequests) { - request.abort(); - } - this._activeRequests.length = 0; - try { - this.onDisposeObservable.notifyObservers(this); - } catch (e) { - Logger.Error("An error occurred while calling onDisposeObservable!", e); - } - this.detachControl(); - const canvas = this._engine.getInputElement(); - if (canvas) { - for (let index2 = 0; index2 < this.cameras.length; index2++) { - this.cameras[index2].detachControl(); - } - } - this._disposeList(this.animationGroups); - this._disposeList(this.lights); - this._disposeList(this.meshes, (item) => item.dispose(true)); - this._disposeList(this.transformNodes, (item) => item.dispose(true)); - const cameras = this.cameras; - this._disposeList(cameras); - if (this._defaultMaterial) { - this._defaultMaterial.dispose(); - } - this._disposeList(this.multiMaterials); - this._disposeList(this.materials); - this._disposeList(this.particleSystems); - this._disposeList(this.postProcesses); - this._disposeList(this.textures); - this._disposeList(this.morphTargetManagers); - this._sceneUbo.dispose(); - if (this._multiviewSceneUbo) { - this._multiviewSceneUbo.dispose(); - } - this.postProcessManager.dispose(); - this._disposeList(this._components); - let index = this._engine.scenes.indexOf(this); - if (index > -1) { - this._engine.scenes.splice(index, 1); + this.reservedDataStore = null; + this.disableOfflineSupportExceptionRules = []; + this.onDisposeObservable = new Observable(); + this._onDisposeObserver = null; + this.onBeforeRenderObservable = new Observable(); + this._onBeforeRenderObserver = null; + this.onAfterRenderObservable = new Observable(); + this.onAfterRenderCameraObservable = new Observable(); + this._onAfterRenderObserver = null; + this.onBeforeAnimationsObservable = new Observable(); + this.onAfterAnimationsObservable = new Observable(); + this.onBeforeDrawPhaseObservable = new Observable(); + this.onAfterDrawPhaseObservable = new Observable(); + this.onReadyObservable = new Observable(); + this.onBeforeCameraRenderObservable = new Observable(); + this._onBeforeCameraRenderObserver = null; + this.onAfterCameraRenderObservable = new Observable(); + this._onAfterCameraRenderObserver = null; + this.onBeforeActiveMeshesEvaluationObservable = new Observable(); + this.onAfterActiveMeshesEvaluationObservable = new Observable(); + this.onBeforeParticlesRenderingObservable = new Observable(); + this.onAfterParticlesRenderingObservable = new Observable(); + this.onDataLoadedObservable = new Observable(); + this.onNewCameraAddedObservable = new Observable(); + this.onCameraRemovedObservable = new Observable(); + this.onNewLightAddedObservable = new Observable(); + this.onLightRemovedObservable = new Observable(); + this.onNewGeometryAddedObservable = new Observable(); + this.onGeometryRemovedObservable = new Observable(); + this.onNewTransformNodeAddedObservable = new Observable(); + this.onTransformNodeRemovedObservable = new Observable(); + this.onNewMeshAddedObservable = new Observable(); + this.onMeshRemovedObservable = new Observable(); + this.onNewSkeletonAddedObservable = new Observable(); + this.onSkeletonRemovedObservable = new Observable(); + this.onNewMaterialAddedObservable = new Observable(); + this.onNewMultiMaterialAddedObservable = new Observable(); + this.onMaterialRemovedObservable = new Observable(); + this.onMultiMaterialRemovedObservable = new Observable(); + this.onNewTextureAddedObservable = new Observable(); + this.onTextureRemovedObservable = new Observable(); + this.onBeforeRenderTargetsRenderObservable = new Observable(); + this.onAfterRenderTargetsRenderObservable = new Observable(); + this.onBeforeStepObservable = new Observable(); + this.onAfterStepObservable = new Observable(); + this.onActiveCameraChanged = new Observable(); + this.onActiveCamerasChanged = new Observable(); + this.onBeforeRenderingGroupObservable = new Observable(); + this.onAfterRenderingGroupObservable = new Observable(); + this.onMeshImportedObservable = new Observable(); + this.onAnimationFileImportedObservable = new Observable(); + this._registeredForLateAnimationBindings = new SmartArrayNoDuplicate(256); + this._pointerPickingConfiguration = new PointerPickingConfiguration(); + this.onPrePointerObservable = new Observable(); + this.onPointerObservable = new Observable(); + this.onPreKeyboardObservable = new Observable(); + this.onKeyboardObservable = new Observable(); + this._useRightHandedSystem = false; + this._timeAccumulator = 0; + this._currentStepId = 0; + this._currentInternalStep = 0; + this._fogEnabled = true; + this._fogMode = _Scene.FOGMODE_NONE; + this.fogColor = new Color3(0.2, 0.2, 0.3); + this.fogDensity = 0.1; + this.fogStart = 0; + this.fogEnd = 1e3; + this.needsPreviousWorldMatrices = false; + this._shadowsEnabled = true; + this._lightsEnabled = true; + this._unObserveActiveCameras = null; + this._texturesEnabled = true; + this.physicsEnabled = true; + this.particlesEnabled = true; + this.spritesEnabled = true; + this._skeletonsEnabled = true; + this.lensFlaresEnabled = true; + this.collisionsEnabled = true; + this.gravity = new Vector3(0, -9.807, 0); + this.postProcessesEnabled = true; + this.renderTargetsEnabled = true; + this.dumpNextRenderTargets = false; + this.customRenderTargets = []; + this.importedMeshesFiles = []; + this.probesEnabled = true; + this._meshesForIntersections = new SmartArrayNoDuplicate(256); + this.proceduralTexturesEnabled = true; + this._totalVertices = new PerfCounter(); + this._activeIndices = new PerfCounter(); + this._activeParticles = new PerfCounter(); + this._activeBones = new PerfCounter(); + this._animationTime = 0; + this.animationTimeScale = 1; + this._renderId = 0; + this._frameId = 0; + this._executeWhenReadyTimeoutId = null; + this._intermediateRendering = false; + this._defaultFrameBufferCleared = false; + this._viewUpdateFlag = -1; + this._projectionUpdateFlag = -1; + this._toBeDisposed = new Array(256); + this._activeRequests = new Array(); + this._pendingData = new Array(); + this._isDisposed = false; + this.dispatchAllSubMeshesOfActiveMeshes = false; + this._activeMeshes = new SmartArray(256); + this._processedMaterials = new SmartArray(256); + this._renderTargets = new SmartArrayNoDuplicate(256); + this._materialsRenderTargets = new SmartArrayNoDuplicate(256); + this._activeParticleSystems = new SmartArray(256); + this._activeSkeletons = new SmartArrayNoDuplicate(32); + this._softwareSkinnedMeshes = new SmartArrayNoDuplicate(32); + this._activeAnimatables = new Array(); + this._transformMatrix = Matrix.Zero(); + this.requireLightSorting = false; + this._components = []; + this._serializableComponents = []; + this._transientComponents = []; + this._beforeCameraUpdateStage = Stage.Create(); + this._beforeClearStage = Stage.Create(); + this._beforeRenderTargetClearStage = Stage.Create(); + this._gatherRenderTargetsStage = Stage.Create(); + this._gatherActiveCameraRenderTargetsStage = Stage.Create(); + this._isReadyForMeshStage = Stage.Create(); + this._beforeEvaluateActiveMeshStage = Stage.Create(); + this._evaluateSubMeshStage = Stage.Create(); + this._preActiveMeshStage = Stage.Create(); + this._cameraDrawRenderTargetStage = Stage.Create(); + this._beforeCameraDrawStage = Stage.Create(); + this._beforeRenderTargetDrawStage = Stage.Create(); + this._beforeRenderingGroupDrawStage = Stage.Create(); + this._beforeRenderingMeshStage = Stage.Create(); + this._afterRenderingMeshStage = Stage.Create(); + this._afterRenderingGroupDrawStage = Stage.Create(); + this._afterCameraDrawStage = Stage.Create(); + this._afterCameraPostProcessStage = Stage.Create(); + this._afterRenderTargetDrawStage = Stage.Create(); + this._afterRenderTargetPostProcessStage = Stage.Create(); + this._afterRenderStage = Stage.Create(); + this._pointerMoveStage = Stage.Create(); + this._pointerDownStage = Stage.Create(); + this._pointerUpStage = Stage.Create(); + this._geometriesByUniqueId = null; + this._defaultMeshCandidates = { + data: [], + length: 0 + }; + this._defaultSubMeshCandidates = { + data: [], + length: 0 + }; + this._preventFreeActiveMeshesAndRenderingGroups = false; + this._activeMeshesFrozen = false; + this._activeMeshesFrozenButKeepClipping = false; + this._skipEvaluateActiveMeshesCompletely = false; + this._allowPostProcessClearColor = true; + this.getDeterministicFrameTime = () => { + return this._engine.getTimeStep(); + }; + this._registeredActions = 0; + this._blockMaterialDirtyMechanism = false; + this._perfCollector = null; + this.activeCameras = []; + const fullOptions = { + useGeometryUniqueIdsMap: true, + useMaterialMeshMap: true, + useClonedMeshMap: true, + virtual: false, + ...options + }; + engine = this._engine = engine || EngineStore.LastCreatedEngine; + if (fullOptions.virtual) { + engine._virtualScenes.push(this); + } else { + EngineStore._LastCreatedScene = this; + engine.scenes.push(this); } - if (EngineStore._LastCreatedScene === this) { - if (this._engine.scenes.length > 0) { - EngineStore._LastCreatedScene = this._engine.scenes[this._engine.scenes.length - 1]; - } else { - EngineStore._LastCreatedScene = null; - } + this._uid = null; + this._renderingManager = new RenderingManager(this); + if (PostProcessManager) { + this.postProcessManager = new PostProcessManager(this); } - index = this._engine._virtualScenes.indexOf(this); - if (index > -1) { - this._engine._virtualScenes.splice(index, 1); + if (IsWindowObjectExist()) { + this.attachControl(); } - this._engine.wipeCaches(true); - this.onDisposeObservable.clear(); - this.onBeforeRenderObservable.clear(); - this.onAfterRenderObservable.clear(); - this.onBeforeRenderTargetsRenderObservable.clear(); - this.onAfterRenderTargetsRenderObservable.clear(); - this.onAfterStepObservable.clear(); - this.onBeforeStepObservable.clear(); - this.onBeforeActiveMeshesEvaluationObservable.clear(); - this.onAfterActiveMeshesEvaluationObservable.clear(); - this.onBeforeParticlesRenderingObservable.clear(); - this.onAfterParticlesRenderingObservable.clear(); - this.onBeforeDrawPhaseObservable.clear(); - this.onAfterDrawPhaseObservable.clear(); - this.onBeforeAnimationsObservable.clear(); - this.onAfterAnimationsObservable.clear(); - this.onDataLoadedObservable.clear(); - this.onBeforeRenderingGroupObservable.clear(); - this.onAfterRenderingGroupObservable.clear(); - this.onMeshImportedObservable.clear(); - this.onBeforeCameraRenderObservable.clear(); - this.onAfterCameraRenderObservable.clear(); - this.onAfterRenderCameraObservable.clear(); - this.onReadyObservable.clear(); - this.onNewCameraAddedObservable.clear(); - this.onCameraRemovedObservable.clear(); - this.onNewLightAddedObservable.clear(); - this.onLightRemovedObservable.clear(); - this.onNewGeometryAddedObservable.clear(); - this.onGeometryRemovedObservable.clear(); - this.onNewTransformNodeAddedObservable.clear(); - this.onTransformNodeRemovedObservable.clear(); - this.onNewMeshAddedObservable.clear(); - this.onMeshRemovedObservable.clear(); - this.onNewSkeletonAddedObservable.clear(); - this.onSkeletonRemovedObservable.clear(); - this.onNewMaterialAddedObservable.clear(); - this.onNewMultiMaterialAddedObservable.clear(); - this.onMaterialRemovedObservable.clear(); - this.onMultiMaterialRemovedObservable.clear(); - this.onNewTextureAddedObservable.clear(); - this.onTextureRemovedObservable.clear(); - this.onPrePointerObservable.clear(); - this.onPointerObservable.clear(); - this.onPreKeyboardObservable.clear(); - this.onKeyboardObservable.clear(); - this.onActiveCameraChanged.clear(); - this.onScenePerformancePriorityChangedObservable.clear(); - this._isDisposed = true; - } - _disposeList(items, callback) { - const itemsCopy = items.slice(0); - callback = callback ?? ((item) => item.dispose()); - for (const item of itemsCopy) { - callback(item); + this._createUbo(); + if (ImageProcessingConfiguration) { + this._imageProcessingConfiguration = new ImageProcessingConfiguration(); + } + this.setDefaultCandidateProviders(); + if (fullOptions.useGeometryUniqueIdsMap) { + this._geometriesByUniqueId = {}; + } + this.useMaterialMeshMap = fullOptions.useMaterialMeshMap; + this.useClonedMeshMap = fullOptions.useClonedMeshMap; + if (!options || !options.virtual) { + engine.onNewSceneAddedObservable.notifyObservers(this); } - items.length = 0; } /** - * Gets if the scene is already disposed + * Gets a string identifying the name of the class + * @returns "Scene" string */ - get isDisposed() { - return this._isDisposed; + getClassName() { + return "Scene"; } /** - * Call this function to reduce memory footprint of the scene. - * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly) + * @internal */ - clearCachedVertexData() { - for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) { - const mesh = this.meshes[meshIndex]; - const geometry = mesh.geometry; - if (geometry) { - geometry.clearCachedData(); - } - } + _getDefaultMeshCandidates() { + this._defaultMeshCandidates.data = this.meshes; + this._defaultMeshCandidates.length = this.meshes.length; + return this._defaultMeshCandidates; } /** - * This function will remove the local cached buffer data from texture. - * It will save memory but will prevent the texture from being rebuilt + * @internal */ - cleanCachedTextureBuffer() { - for (const baseTexture of this.textures) { - const buffer = baseTexture._buffer; - if (buffer) { - baseTexture._buffer = null; - } - } + _getDefaultSubMeshCandidates(mesh) { + this._defaultSubMeshCandidates.data = mesh.subMeshes; + this._defaultSubMeshCandidates.length = mesh.subMeshes.length; + return this._defaultSubMeshCandidates; } /** - * Get the world extend vectors with an optional filter - * - * @param filterPredicate the predicate - which meshes should be included when calculating the world size - * @returns {{ min: Vector3; max: Vector3 }} min and max vectors + * Sets the default candidate providers for the scene. + * This sets the getActiveMeshCandidates, getActiveSubMeshCandidates, getIntersectingSubMeshCandidates + * and getCollidingSubMeshCandidates to their default function */ - getWorldExtends(filterPredicate) { - const min = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); - const max = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); - filterPredicate = filterPredicate || (() => true); - this.meshes.filter(filterPredicate).forEach((mesh) => { - mesh.computeWorldMatrix(true); - if (!mesh.subMeshes || mesh.subMeshes.length === 0 || mesh.infiniteDistance) { - return; - } - const boundingInfo = mesh.getBoundingInfo(); - const minBox = boundingInfo.boundingBox.minimumWorld; - const maxBox = boundingInfo.boundingBox.maximumWorld; - Vector3.CheckExtends(minBox, min, max); - Vector3.CheckExtends(maxBox, min, max); - }); - return { - min, - max - }; + setDefaultCandidateProviders() { + this.getActiveMeshCandidates = () => this._getDefaultMeshCandidates(); + this.getActiveSubMeshCandidates = (mesh) => this._getDefaultSubMeshCandidates(mesh); + this.getIntersectingSubMeshCandidates = (mesh, localRay) => this._getDefaultSubMeshCandidates(mesh); + this.getCollidingSubMeshCandidates = (mesh, collider) => this._getDefaultSubMeshCandidates(mesh); } - // Picking - // eslint-disable-next-line jsdoc/require-returns-check /** - * Creates a ray that can be used to pick in the scene - * @param x defines the x coordinate of the origin (on-screen) - * @param y defines the y coordinate of the origin (on-screen) - * @param world defines the world matrix to use if you want to pick in object space (instead of world space) - * @param camera defines the camera to use for the picking - * @param cameraViewSpace defines if picking will be done in view space (false by default) - * @returns a Ray + * Gets the mesh that is currently under the pointer */ - createPickingRay(x, y, world, camera, cameraViewSpace = false) { - throw _WarnImport("Ray"); + get meshUnderPointer() { + return this._inputManager.meshUnderPointer; } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Creates a ray that can be used to pick in the scene - * @param x defines the x coordinate of the origin (on-screen) - * @param y defines the y coordinate of the origin (on-screen) - * @param world defines the world matrix to use if you want to pick in object space (instead of world space) - * @param result defines the ray where to store the picking ray - * @param camera defines the camera to use for the picking - * @param cameraViewSpace defines if picking will be done in view space (false by default) - * @param enableDistantPicking defines if picking should handle large values for mesh position/scaling (false by default) - * @returns the current scene + * Gets or sets the current on-screen X position of the pointer */ - createPickingRayToRef(x, y, world, result, camera, cameraViewSpace = false, enableDistantPicking = false) { - throw _WarnImport("Ray"); + get pointerX() { + return this._inputManager.pointerX; + } + set pointerX(value) { + this._inputManager.pointerX = value; } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Creates a ray that can be used to pick in the scene - * @param x defines the x coordinate of the origin (on-screen) - * @param y defines the y coordinate of the origin (on-screen) - * @param camera defines the camera to use for the picking - * @returns a Ray + * Gets or sets the current on-screen Y position of the pointer */ - createPickingRayInCameraSpace(x, y, camera) { - throw _WarnImport("Ray"); + get pointerY() { + return this._inputManager.pointerY; + } + set pointerY(value) { + this._inputManager.pointerY = value; } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Creates a ray that can be used to pick in the scene - * @param x defines the x coordinate of the origin (on-screen) - * @param y defines the y coordinate of the origin (on-screen) - * @param result defines the ray where to store the picking ray - * @param camera defines the camera to use for the picking - * @returns the current scene + * Gets the cached material (ie. the latest rendered one) + * @returns the cached material */ - createPickingRayInCameraSpaceToRef(x, y, result, camera) { - throw _WarnImport("Ray"); + getCachedMaterial() { + return this._cachedMaterial; } - /** @internal */ - get _pickingAvailable() { - return false; + /** + * Gets the cached effect (ie. the latest rendered one) + * @returns the cached effect + */ + getCachedEffect() { + return this._cachedEffect; } - /** Launch a ray to try to pick a mesh in the scene - * @param x position on screen - * @param y position on screen - * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true - * @param fastCheck defines if the first intersection will be used (and not the closest) - * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used - * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected - * @returns a PickingInfo + /** + * Gets the cached visibility state (ie. the latest rendered one) + * @returns the cached visibility state */ - pick(x, y, predicate, fastCheck, camera, trianglePredicate) { - const warn = _WarnImport("Ray", true); - if (warn) { - Logger.Warn(warn); - } - return new PickingInfo(); + getCachedVisibility() { + return this._cachedVisibility; } - /** Launch a ray to try to pick a mesh in the scene using only bounding information of the main mesh (not using submeshes) - * @param x position on screen - * @param y position on screen - * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true - * @param fastCheck defines if the first intersection will be used (and not the closest) - * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used - * @returns a PickingInfo (Please note that some info will not be set like distance, bv, bu and everything that cannot be capture by only using bounding infos) + /** + * Gets a boolean indicating if the current material / effect / visibility must be bind again + * @param material defines the current material + * @param effect defines the current effect + * @param visibility defines the current visibility state + * @returns true if one parameter is not cached */ - pickWithBoundingInfo(x, y, predicate, fastCheck, camera) { - const warn = _WarnImport("Ray", true); - if (warn) { - Logger.Warn(warn); - } - return new PickingInfo(); + isCachedMaterialInvalid(material, effect, visibility = 1) { + return this._cachedEffect !== effect || this._cachedMaterial !== material || this._cachedVisibility !== visibility; } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Use the given ray to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides, - * irrespective of orientation. - * @param ray The ray to use to pick meshes - * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must have isPickable set to true - * @param fastCheck defines if the first intersection will be used (and not the closest) - * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected - * @returns a PickingInfo + * Gets the engine associated with the scene + * @returns an Engine */ - pickWithRay(ray, predicate, fastCheck, trianglePredicate) { - throw _WarnImport("Ray"); + getEngine() { + return this._engine; } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Launch a ray to try to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides, - * irrespective of orientation. - * @param x X position on screen - * @param y Y position on screen - * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true - * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used - * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected - * @returns an array of PickingInfo + * Gets the total number of vertices rendered per frame + * @returns the total number of vertices rendered per frame */ - multiPick(x, y, predicate, camera, trianglePredicate) { - throw _WarnImport("Ray"); + getTotalVertices() { + return this._totalVertices.current; } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Launch a ray to try to pick a mesh in the scene - * @param ray Ray to use - * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true - * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected - * @returns an array of PickingInfo + * Gets the performance counter for total vertices + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation */ - multiPickWithRay(ray, predicate, trianglePredicate) { - throw _WarnImport("Ray"); + get totalVerticesPerfCounter() { + return this._totalVertices; } /** - * Force the value of meshUnderPointer - * @param mesh defines the mesh to use - * @param pointerId optional pointer id when using more than one pointer - * @param pickResult optional pickingInfo data used to find mesh + * Gets the total number of active indices rendered per frame (You can deduce the number of rendered triangles by dividing this number by 3) + * @returns the total number of active indices rendered per frame */ - setPointerOverMesh(mesh, pointerId, pickResult) { - this._inputManager.setPointerOverMesh(mesh, pointerId, pickResult); + getActiveIndices() { + return this._activeIndices.current; } /** - * Gets the mesh under the pointer - * @returns a Mesh or null if no mesh is under the pointer + * Gets the performance counter for active indices + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation */ - getPointerOverMesh() { - return this._inputManager.getPointerOverMesh(); + get totalActiveIndicesPerfCounter() { + return this._activeIndices; } - // Misc. - /** @internal */ - _rebuildGeometries() { - for (const geometry of this.geometries) { - geometry._rebuild(); - } - for (const mesh of this.meshes) { - mesh._rebuild(); - } - if (this.postProcessManager) { - this.postProcessManager._rebuild(); - } - for (const component of this._components) { - component.rebuild(); - } - for (const system of this.particleSystems) { - system.rebuild(); - } - if (this.spriteManagers) { - for (const spriteMgr of this.spriteManagers) { - spriteMgr.rebuild(); - } - } + /** + * Gets the total number of active particles rendered per frame + * @returns the total number of active particles rendered per frame + */ + getActiveParticles() { + return this._activeParticles.current; } - /** @internal */ - _rebuildTextures() { - for (const texture of this.textures) { - texture._rebuild(true); - } - this.markAllMaterialsAsDirty(1); + /** + * Gets the performance counter for active particles + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation + */ + get activeParticlesPerfCounter() { + return this._activeParticles; } /** - * Get from a list of objects by tags - * @param list the list of objects to use - * @param tagsQuery the query to use - * @param filter a predicate to filter for tags - * @returns + * Gets the total number of active bones rendered per frame + * @returns the total number of active bones rendered per frame */ - _getByTags(list, tagsQuery, filter) { - if (tagsQuery === void 0) { - return list; - } - const listByTags = []; - for (const i in list) { - const item = list[i]; - if (Tags && Tags.MatchesQuery(item, tagsQuery) && (!filter || filter(item))) { - listByTags.push(item); - } - } - return listByTags; + getActiveBones() { + return this._activeBones.current; } /** - * Get a list of meshes by tags - * @param tagsQuery defines the tags query to use - * @param filter defines a predicate used to filter results - * @returns an array of Mesh + * Gets the performance counter for active bones + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation */ - getMeshesByTags(tagsQuery, filter) { - return this._getByTags(this.meshes, tagsQuery, filter); + get activeBonesPerfCounter() { + return this._activeBones; } /** - * Get a list of cameras by tags - * @param tagsQuery defines the tags query to use - * @param filter defines a predicate used to filter results - * @returns an array of Camera + * Gets the array of active meshes + * @returns an array of AbstractMesh */ - getCamerasByTags(tagsQuery, filter) { - return this._getByTags(this.cameras, tagsQuery, filter); + getActiveMeshes() { + return this._activeMeshes; } /** - * Get a list of lights by tags - * @param tagsQuery defines the tags query to use - * @param filter defines a predicate used to filter results - * @returns an array of Light + * Gets the animation ratio (which is 1.0 is the scene renders at 60fps and 2 if the scene renders at 30fps, etc.) + * @returns a number */ - getLightsByTags(tagsQuery, filter) { - return this._getByTags(this.lights, tagsQuery, filter); + getAnimationRatio() { + return this._animationRatio !== void 0 ? this._animationRatio : 1; } /** - * Get a list of materials by tags - * @param tagsQuery defines the tags query to use - * @param filter defines a predicate used to filter results - * @returns an array of Material + * Gets an unique Id for the current render phase + * @returns a number */ - getMaterialByTags(tagsQuery, filter) { - return this._getByTags(this.materials, tagsQuery, filter).concat(this._getByTags(this.multiMaterials, tagsQuery, filter)); + getRenderId() { + return this._renderId; } /** - * Get a list of transform nodes by tags - * @param tagsQuery defines the tags query to use - * @param filter defines a predicate used to filter results - * @returns an array of TransformNode + * Gets an unique Id for the current frame + * @returns a number */ - getTransformNodesByTags(tagsQuery, filter) { - return this._getByTags(this.transformNodes, tagsQuery, filter); + getFrameId() { + return this._frameId; + } + /** Call this function if you want to manually increment the render Id*/ + incrementRenderId() { + this._renderId++; + } + _createUbo() { + this.setSceneUniformBuffer(this.createSceneUniformBuffer()); } /** - * Overrides the default sort function applied in the rendering group to prepare the meshes. - * This allowed control for front to back rendering or reversly depending of the special needs. - * - * @param renderingGroupId The rendering group id corresponding to its index - * @param opaqueSortCompareFn The opaque queue comparison function use to sort. - * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort. - * @param transparentSortCompareFn The transparent queue comparison function use to sort. + * Use this method to simulate a pointer move on a mesh + * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay + * @param pickResult pickingInfo of the object wished to simulate pointer event on + * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch) + * @returns the current scene */ - setRenderingOrder(renderingGroupId, opaqueSortCompareFn = null, alphaTestSortCompareFn = null, transparentSortCompareFn = null) { - this._renderingManager.setRenderingOrder(renderingGroupId, opaqueSortCompareFn, alphaTestSortCompareFn, transparentSortCompareFn); + simulatePointerMove(pickResult, pointerEventInit) { + this._inputManager.simulatePointerMove(pickResult, pointerEventInit); + return this; } /** - * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups. - * - * @param renderingGroupId The rendering group id corresponding to its index - * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true. - * @param depth Automatically clears depth between groups if true and autoClear is true. - * @param stencil Automatically clears stencil between groups if true and autoClear is true. + * Use this method to simulate a pointer down on a mesh + * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay + * @param pickResult pickingInfo of the object wished to simulate pointer event on + * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch) + * @returns the current scene */ - setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil, depth = true, stencil = true) { - this._renderingManager.setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil, depth, stencil); + simulatePointerDown(pickResult, pointerEventInit) { + this._inputManager.simulatePointerDown(pickResult, pointerEventInit); + return this; } /** - * Gets the current auto clear configuration for one rendering group of the rendering - * manager. - * @param index the rendering group index to get the information for - * @returns The auto clear setup for the requested rendering group + * Use this method to simulate a pointer up on a mesh + * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay + * @param pickResult pickingInfo of the object wished to simulate pointer event on + * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch) + * @param doubleTap indicates that the pointer up event should be considered as part of a double click (false by default) + * @returns the current scene */ - getAutoClearDepthStencilSetup(index) { - return this._renderingManager.getAutoClearDepthStencilSetup(index); + simulatePointerUp(pickResult, pointerEventInit, doubleTap) { + this._inputManager.simulatePointerUp(pickResult, pointerEventInit, doubleTap); + return this; } - /** @internal */ - _forceBlockMaterialDirtyMechanism(value) { - this._blockMaterialDirtyMechanism = value; + /** + * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down) + * @param pointerId defines the pointer id to use in a multi-touch scenario (0 by default) + * @returns true if the pointer was captured + */ + isPointerCaptured(pointerId = 0) { + return this._inputManager.isPointerCaptured(pointerId); } - /** Gets or sets a boolean blocking all the calls to markAllMaterialsAsDirty (ie. the materials won't be updated if they are out of sync) */ - get blockMaterialDirtyMechanism() { - return this._blockMaterialDirtyMechanism; + /** + * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp + * @param attachUp defines if you want to attach events to pointerup + * @param attachDown defines if you want to attach events to pointerdown + * @param attachMove defines if you want to attach events to pointermove + */ + attachControl(attachUp = true, attachDown = true, attachMove = true) { + this._inputManager.attachControl(attachUp, attachDown, attachMove); } - set blockMaterialDirtyMechanism(value) { - if (this._blockMaterialDirtyMechanism === value) { - return; - } - this._blockMaterialDirtyMechanism = value; - if (!value) { - this.markAllMaterialsAsDirty(63); - } + /** Detaches all event handlers*/ + detachControl() { + this._inputManager.detachControl(); } /** - * Will flag all materials as dirty to trigger new shader compilation - * @param flag defines the flag used to specify which material part must be marked as dirty - * @param predicate If not null, it will be used to specify if a material has to be marked as dirty + * This function will check if the scene can be rendered (textures are loaded, shaders are compiled) + * Delay loaded resources are not taking in account + * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: true) + * @returns true if all required resources are ready */ - markAllMaterialsAsDirty(flag, predicate) { - if (this._blockMaterialDirtyMechanism) { - return; + isReady(checkRenderTargets = true) { + var _a, _b; + if (this._isDisposed) { + return false; } - for (const material of this.materials) { - if (predicate && !predicate(material)) { + let index; + const engine = this.getEngine(); + const currentRenderPassId = engine.currentRenderPassId; + engine.currentRenderPassId = ((_a = this.activeCamera) == null ? void 0 : _a.renderPassId) ?? currentRenderPassId; + let isReady = true; + if (this._pendingData.length > 0) { + isReady = false; + } + (_b = this.prePassRenderer) == null ? void 0 : _b.update(); + if (this.useOrderIndependentTransparency && this.depthPeelingRenderer) { + isReady && (isReady = this.depthPeelingRenderer.isReady()); + } + if (checkRenderTargets) { + this._processedMaterials.reset(); + this._materialsRenderTargets.reset(); + } + for (index = 0; index < this.meshes.length; index++) { + const mesh = this.meshes[index]; + if (!mesh.subMeshes || mesh.subMeshes.length === 0) { continue; } - material.markAsDirty(flag); + if (!mesh.isReady(true)) { + isReady = false; + continue; + } + const hardwareInstancedRendering = mesh.hasThinInstances || mesh.getClassName() === "InstancedMesh" || mesh.getClassName() === "InstancedLinesMesh" || engine.getCaps().instancedArrays && mesh.instances.length > 0; + for (const step of this._isReadyForMeshStage) { + if (!step.action(mesh, hardwareInstancedRendering)) { + isReady = false; + } + } + if (!checkRenderTargets) { + continue; + } + const mat = mesh.material || this.defaultMaterial; + if (mat) { + if (mat._storeEffectOnSubMeshes) { + for (const subMesh of mesh.subMeshes) { + const material = subMesh.getMaterial(); + if (material && material.hasRenderTargetTextures && material.getRenderTargetTextures != null) { + if (this._processedMaterials.indexOf(material) === -1) { + this._processedMaterials.push(material); + this._materialsRenderTargets.concatWithNoDuplicate(material.getRenderTargetTextures()); + } + } + } + } else { + if (mat.hasRenderTargetTextures && mat.getRenderTargetTextures != null) { + if (this._processedMaterials.indexOf(mat) === -1) { + this._processedMaterials.push(mat); + this._materialsRenderTargets.concatWithNoDuplicate(mat.getRenderTargetTextures()); + } + } + } + } + } + if (checkRenderTargets) { + for (index = 0; index < this._materialsRenderTargets.length; ++index) { + const rtt = this._materialsRenderTargets.data[index]; + if (!rtt.isReadyForRendering()) { + isReady = false; + } + } + } + for (index = 0; index < this.geometries.length; index++) { + const geometry = this.geometries[index]; + if (geometry.delayLoadState === 2) { + isReady = false; + } + } + if (this.activeCameras && this.activeCameras.length > 0) { + for (const camera of this.activeCameras) { + if (!camera.isReady(true)) { + isReady = false; + } + } + } else if (this.activeCamera) { + if (!this.activeCamera.isReady(true)) { + isReady = false; + } + } + for (const particleSystem of this.particleSystems) { + if (!particleSystem.isReady()) { + isReady = false; + } + } + if (this.layers) { + for (const layer of this.layers) { + if (!layer.isReady()) { + isReady = false; + } + } } + if (!engine.areAllEffectsReady()) { + isReady = false; + } + engine.currentRenderPassId = currentRenderPassId; + return isReady; + } + /** Resets all cached information relative to material (including effect and visibility) */ + resetCachedMaterial() { + this._cachedMaterial = null; + this._cachedEffect = null; + this._cachedVisibility = null; } /** - * @internal + * Registers a function to be called before every frame render + * @param func defines the function to register */ - _loadFile(fileOrUrl, onSuccess, onProgress, useOfflineSupport, useArrayBuffer, onError, onOpened) { - const request = LoadFile(fileOrUrl, onSuccess, onProgress, useOfflineSupport ? this.offlineProvider : void 0, useArrayBuffer, onError, onOpened); - this._activeRequests.push(request); - request.onCompleteObservable.add((request2) => { - this._activeRequests.splice(this._activeRequests.indexOf(request2), 1); - }); - return request; + registerBeforeRender(func) { + this.onBeforeRenderObservable.add(func); } /** - * @internal + * Unregisters a function called before every frame render + * @param func defines the function to unregister */ - _loadFileAsync(fileOrUrl, onProgress, useOfflineSupport, useArrayBuffer, onOpened) { - return new Promise((resolve, reject) => { - this._loadFile(fileOrUrl, (data) => { - resolve(data); - }, onProgress, useOfflineSupport, useArrayBuffer, (request, exception) => { - reject(exception); - }, onOpened); - }); + unregisterBeforeRender(func) { + this.onBeforeRenderObservable.removeCallback(func); } /** - * @internal + * Registers a function to be called after every frame render + * @param func defines the function to register */ - _requestFile(url, onSuccess, onProgress, useOfflineSupport, useArrayBuffer, onError, onOpened) { - const request = RequestFile(url, onSuccess, onProgress, useOfflineSupport ? this.offlineProvider : void 0, useArrayBuffer, onError, onOpened); - this._activeRequests.push(request); - request.onCompleteObservable.add((request2) => { - this._activeRequests.splice(this._activeRequests.indexOf(request2), 1); - }); - return request; + registerAfterRender(func) { + this.onAfterRenderObservable.add(func); } /** - * @internal + * Unregisters a function called after every frame render + * @param func defines the function to unregister */ - _requestFileAsync(url, onProgress, useOfflineSupport, useArrayBuffer, onOpened) { - return new Promise((resolve, reject) => { - this._requestFile(url, (data) => { - resolve(data); - }, onProgress, useOfflineSupport, useArrayBuffer, (error) => { - reject(error); - }, onOpened); - }); + unregisterAfterRender(func) { + this.onAfterRenderObservable.removeCallback(func); + } + _executeOnceBeforeRender(func) { + const execFunc = () => { + func(); + setTimeout(() => { + this.unregisterBeforeRender(execFunc); + }); + }; + this.registerBeforeRender(execFunc); } /** - * @internal + * The provided function will run before render once and will be disposed afterwards. + * A timeout delay can be provided so that the function will be executed in N ms. + * The timeout is using the browser's native setTimeout so time percision cannot be guaranteed. + * @param func The function to be executed. + * @param timeout optional delay in ms */ - _readFile(file, onSuccess, onProgress, useArrayBuffer, onError) { - const request = ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError); - this._activeRequests.push(request); - request.onCompleteObservable.add((request2) => { - this._activeRequests.splice(this._activeRequests.indexOf(request2), 1); - }); - return request; + executeOnceBeforeRender(func, timeout) { + if (timeout !== void 0) { + setTimeout(() => { + this._executeOnceBeforeRender(func); + }, timeout); + } else { + this._executeOnceBeforeRender(func); + } } /** - * @internal + * This function can help adding any object to the list of data awaited to be ready in order to check for a complete scene loading. + * @param data defines the object to wait for */ - _readFileAsync(file, onProgress, useArrayBuffer) { - return new Promise((resolve, reject) => { - this._readFile(file, (data) => { - resolve(data); - }, onProgress, useArrayBuffer, (error) => { - reject(error); - }); - }); + addPendingData(data) { + this._pendingData.push(data); } - // eslint-disable-next-line jsdoc/require-returns-check /** - * This method gets the performance collector belonging to the scene, which is generally shared with the inspector. - * @returns the perf collector belonging to the scene. + * Remove a pending data from the loading list which has previously been added with addPendingData. + * @param data defines the object to remove from the pending list */ - getPerfCollector() { - throw _WarnImport("performanceViewerSceneExtension"); + removePendingData(data) { + const wasLoading = this.isLoading; + const index = this._pendingData.indexOf(data); + if (index !== -1) { + this._pendingData.splice(index, 1); + } + if (wasLoading && !this.isLoading) { + this.onDataLoadedObservable.notifyObservers(this); + } } - // deprecated /** - * Sets the active camera of the scene using its Id - * @param id defines the camera's Id - * @returns the new active camera or null if none found. - * @deprecated Please use setActiveCameraById instead + * Returns the number of items waiting to be loaded + * @returns the number of items waiting to be loaded */ - setActiveCameraByID(id) { - return this.setActiveCameraById(id); + getWaitingItemsCount() { + return this._pendingData.length; } /** - * Get a material using its id - * @param id defines the material's Id - * @returns the material or null if none found. - * @deprecated Please use getMaterialById instead + * Returns a boolean indicating if the scene is still loading data */ - getMaterialByID(id) { - return this.getMaterialById(id); + get isLoading() { + return this._pendingData.length > 0; } /** - * Gets a the last added material using a given id - * @param id defines the material's Id - * @returns the last material with the given id or null if none found. - * @deprecated Please use getLastMaterialById instead + * Registers a function to be executed when the scene is ready + * @param func - the function to be executed + * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false) */ - getLastMaterialByID(id) { - return this.getLastMaterialById(id); + executeWhenReady(func, checkRenderTargets = false) { + this.onReadyObservable.addOnce(func); + if (this._executeWhenReadyTimeoutId !== null) { + return; + } + this._checkIsReady(checkRenderTargets); } /** - * Get a texture using its unique id - * @param uniqueId defines the texture's unique id - * @returns the texture or null if none found. - * @deprecated Please use getTextureByUniqueId instead + * Returns a promise that resolves when the scene is ready + * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false) + * @returns A promise that resolves when the scene is ready */ - getTextureByUniqueID(uniqueId) { - return this.getTextureByUniqueId(uniqueId); + whenReadyAsync(checkRenderTargets = false) { + return new Promise((resolve) => { + this.executeWhenReady(() => { + resolve(); + }, checkRenderTargets); + }); } /** - * Gets a camera using its Id - * @param id defines the Id to look for - * @returns the camera or null if not found - * @deprecated Please use getCameraById instead + * @internal */ - getCameraByID(id) { - return this.getCameraById(id); + _checkIsReady(checkRenderTargets = false) { + this._registerTransientComponents(); + if (this.isReady(checkRenderTargets)) { + this.onReadyObservable.notifyObservers(this); + this.onReadyObservable.clear(); + this._executeWhenReadyTimeoutId = null; + return; + } + if (this._isDisposed) { + this.onReadyObservable.clear(); + this._executeWhenReadyTimeoutId = null; + return; + } + this._executeWhenReadyTimeoutId = setTimeout(() => { + this.incrementRenderId(); + this._checkIsReady(checkRenderTargets); + }, 100); } /** - * Gets a camera using its unique Id - * @param uniqueId defines the unique Id to look for - * @returns the camera or null if not found - * @deprecated Please use getCameraByUniqueId instead + * Gets all animatable attached to the scene */ - getCameraByUniqueID(uniqueId) { - return this.getCameraByUniqueId(uniqueId); + get animatables() { + return this._activeAnimatables; } /** - * Gets a bone using its Id - * @param id defines the bone's Id - * @returns the bone or null if not found - * @deprecated Please use getBoneById instead + * Resets the last animation time frame. + * Useful to override when animations start running when loading a scene for the first time. */ - getBoneByID(id) { - return this.getBoneById(id); + resetLastAnimationTimeFrame() { + this._animationTimeLast = PrecisionDate.Now; } + // Matrix /** - * Gets a light node using its Id - * @param id defines the light's Id - * @returns the light or null if none found. - * @deprecated Please use getLightById instead + * Gets the current view matrix + * @returns a Matrix */ - getLightByID(id) { - return this.getLightById(id); + getViewMatrix() { + return this._viewMatrix; } /** - * Gets a light node using its scene-generated unique Id - * @param uniqueId defines the light's unique Id - * @returns the light or null if none found. - * @deprecated Please use getLightByUniqueId instead + * Gets the current projection matrix + * @returns a Matrix */ - getLightByUniqueID(uniqueId) { - return this.getLightByUniqueId(uniqueId); + getProjectionMatrix() { + return this._projectionMatrix; } /** - * Gets a particle system by Id - * @param id defines the particle system Id - * @returns the corresponding system or null if none found - * @deprecated Please use getParticleSystemById instead + * Gets the current transform matrix + * @returns a Matrix made of View * Projection */ - getParticleSystemByID(id) { - return this.getParticleSystemById(id); + getTransformMatrix() { + return this._transformMatrix; } /** - * Gets a geometry using its Id - * @param id defines the geometry's Id - * @returns the geometry or null if none found. - * @deprecated Please use getGeometryById instead + * Sets the current transform matrix + * @param viewL defines the View matrix to use + * @param projectionL defines the Projection matrix to use + * @param viewR defines the right View matrix to use (if provided) + * @param projectionR defines the right Projection matrix to use (if provided) */ - getGeometryByID(id) { - return this.getGeometryById(id); + setTransformMatrix(viewL, projectionL, viewR, projectionR) { + if (!viewR && !projectionR && this._multiviewSceneUbo) { + this._multiviewSceneUbo.dispose(); + this._multiviewSceneUbo = null; + } + if (this._viewUpdateFlag === viewL.updateFlag && this._projectionUpdateFlag === projectionL.updateFlag) { + return; + } + this._viewUpdateFlag = viewL.updateFlag; + this._projectionUpdateFlag = projectionL.updateFlag; + this._viewMatrix = viewL; + this._projectionMatrix = projectionL; + this._viewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix); + if (!this._frustumPlanes) { + this._frustumPlanes = Frustum.GetPlanes(this._transformMatrix); + } else { + Frustum.GetPlanesToRef(this._transformMatrix, this._frustumPlanes); + } + if (this._multiviewSceneUbo && this._multiviewSceneUbo.useUbo) { + this._updateMultiviewUbo(viewR, projectionR); + } else if (this._sceneUbo.useUbo) { + this._sceneUbo.updateMatrix("viewProjection", this._transformMatrix); + this._sceneUbo.updateMatrix("view", this._viewMatrix); + this._sceneUbo.updateMatrix("projection", this._projectionMatrix); + } } /** - * Gets the first added mesh found of a given Id - * @param id defines the Id to search for - * @returns the mesh found or null if not found at all - * @deprecated Please use getMeshById instead + * Gets the uniform buffer used to store scene data + * @returns a UniformBuffer */ - getMeshByID(id) { - return this.getMeshById(id); + getSceneUniformBuffer() { + return this._multiviewSceneUbo ? this._multiviewSceneUbo : this._sceneUbo; } /** - * Gets a mesh with its auto-generated unique Id - * @param uniqueId defines the unique Id to search for - * @returns the found mesh or null if not found at all. - * @deprecated Please use getMeshByUniqueId instead + * Creates a scene UBO + * @param name name of the uniform buffer (optional, for debugging purpose only) + * @returns a new ubo */ - getMeshByUniqueID(uniqueId) { - return this.getMeshByUniqueId(uniqueId); + createSceneUniformBuffer(name69) { + const sceneUbo = new UniformBuffer(this._engine, void 0, false, name69 ?? "scene"); + sceneUbo.addUniform("viewProjection", 16); + sceneUbo.addUniform("view", 16); + sceneUbo.addUniform("projection", 16); + sceneUbo.addUniform("vEyePosition", 4); + return sceneUbo; } /** - * Gets a the last added mesh using a given Id - * @param id defines the Id to search for - * @returns the found mesh or null if not found at all. - * @deprecated Please use getLastMeshById instead + * Sets the scene ubo + * @param ubo the ubo to set for the scene */ - getLastMeshByID(id) { - return this.getLastMeshById(id); + setSceneUniformBuffer(ubo) { + this._sceneUbo = ubo; + this._viewUpdateFlag = -1; + this._projectionUpdateFlag = -1; } /** - * Gets a list of meshes using their Id - * @param id defines the Id to search for - * @returns a list of meshes - * @deprecated Please use getMeshesById instead + * Gets an unique (relatively to the current scene) Id + * @returns an unique number for the scene */ - getMeshesByID(id) { - return this.getMeshesById(id); + getUniqueId() { + return UniqueIdGenerator.UniqueId; } /** - * Gets the first added transform node found of a given Id - * @param id defines the Id to search for - * @returns the found transform node or null if not found at all. - * @deprecated Please use getTransformNodeById instead + * Add a mesh to the list of scene's meshes + * @param newMesh defines the mesh to add + * @param recursive if all child meshes should also be added to the scene */ - getTransformNodeByID(id) { - return this.getTransformNodeById(id); + addMesh(newMesh, recursive = false) { + if (this._blockEntityCollection) { + return; + } + this.meshes.push(newMesh); + newMesh._resyncLightSources(); + if (!newMesh.parent) { + newMesh._addToSceneRootNodes(); + } + this.onNewMeshAddedObservable.notifyObservers(newMesh); + if (recursive) { + newMesh.getChildMeshes().forEach((m) => { + this.addMesh(m); + }); + } } /** - * Gets a transform node with its auto-generated unique Id - * @param uniqueId defines the unique Id to search for - * @returns the found transform node or null if not found at all. - * @deprecated Please use getTransformNodeByUniqueId instead + * Remove a mesh for the list of scene's meshes + * @param toRemove defines the mesh to remove + * @param recursive if all child meshes should also be removed from the scene + * @returns the index where the mesh was in the mesh list */ - getTransformNodeByUniqueID(uniqueId) { - return this.getTransformNodeByUniqueId(uniqueId); + removeMesh(toRemove, recursive = false) { + const index = this.meshes.indexOf(toRemove); + if (index !== -1) { + this.meshes[index] = this.meshes[this.meshes.length - 1]; + this.meshes.pop(); + if (!toRemove.parent) { + toRemove._removeFromSceneRootNodes(); + } + } + this._inputManager._invalidateMesh(toRemove); + this.onMeshRemovedObservable.notifyObservers(toRemove); + if (recursive) { + toRemove.getChildMeshes().forEach((m) => { + this.removeMesh(m); + }); + } + return index; } /** - * Gets a list of transform nodes using their Id - * @param id defines the Id to search for - * @returns a list of transform nodes - * @deprecated Please use getTransformNodesById instead + * Add a transform node to the list of scene's transform nodes + * @param newTransformNode defines the transform node to add */ - getTransformNodesByID(id) { - return this.getTransformNodesById(id); + addTransformNode(newTransformNode) { + if (this._blockEntityCollection) { + return; + } + if (newTransformNode.getScene() === this && newTransformNode._indexInSceneTransformNodesArray !== -1) { + return; + } + newTransformNode._indexInSceneTransformNodesArray = this.transformNodes.length; + this.transformNodes.push(newTransformNode); + if (!newTransformNode.parent) { + newTransformNode._addToSceneRootNodes(); + } + this.onNewTransformNodeAddedObservable.notifyObservers(newTransformNode); } /** - * Gets a node (Mesh, Camera, Light) using a given Id - * @param id defines the Id to search for - * @returns the found node or null if not found at all - * @deprecated Please use getNodeById instead + * Remove a transform node for the list of scene's transform nodes + * @param toRemove defines the transform node to remove + * @returns the index where the transform node was in the transform node list */ - getNodeByID(id) { - return this.getNodeById(id); + removeTransformNode(toRemove) { + const index = toRemove._indexInSceneTransformNodesArray; + if (index !== -1) { + if (index !== this.transformNodes.length - 1) { + const lastNode = this.transformNodes[this.transformNodes.length - 1]; + this.transformNodes[index] = lastNode; + lastNode._indexInSceneTransformNodesArray = index; + } + toRemove._indexInSceneTransformNodesArray = -1; + this.transformNodes.pop(); + if (!toRemove.parent) { + toRemove._removeFromSceneRootNodes(); + } + } + this.onTransformNodeRemovedObservable.notifyObservers(toRemove); + return index; } /** - * Gets a the last added node (Mesh, Camera, Light) using a given Id - * @param id defines the Id to search for - * @returns the found node or null if not found at all - * @deprecated Please use getLastEntryById instead + * Remove a skeleton for the list of scene's skeletons + * @param toRemove defines the skeleton to remove + * @returns the index where the skeleton was in the skeleton list */ - getLastEntryByID(id) { - return this.getLastEntryById(id); + removeSkeleton(toRemove) { + const index = this.skeletons.indexOf(toRemove); + if (index !== -1) { + this.skeletons.splice(index, 1); + this.onSkeletonRemovedObservable.notifyObservers(toRemove); + this._executeActiveContainerCleanup(this._activeSkeletons); + } + return index; } /** - * Gets a skeleton using a given Id (if many are found, this function will pick the last one) - * @param id defines the Id to search for - * @returns the found skeleton or null if not found at all. - * @deprecated Please use getLastSkeletonById instead + * Remove a morph target for the list of scene's morph targets + * @param toRemove defines the morph target to remove + * @returns the index where the morph target was in the morph target list */ - getLastSkeletonByID(id) { - return this.getLastSkeletonById(id); + removeMorphTargetManager(toRemove) { + const index = this.morphTargetManagers.indexOf(toRemove); + if (index !== -1) { + this.morphTargetManagers.splice(index, 1); + } + return index; } -}; -Scene.FOGMODE_NONE = 0; -Scene.FOGMODE_EXP = 1; -Scene.FOGMODE_EXP2 = 2; -Scene.FOGMODE_LINEAR = 3; -Scene.MinDeltaTime = 1; -Scene.MaxDeltaTime = 1e3; - -// node_modules/@babylonjs/core/Maths/math.axis.js -var Space; -(function(Space2) { - Space2[Space2["LOCAL"] = 0] = "LOCAL"; - Space2[Space2["WORLD"] = 1] = "WORLD"; - Space2[Space2["BONE"] = 2] = "BONE"; -})(Space || (Space = {})); -var Axis = class { -}; -Axis.X = new Vector3(1, 0, 0); -Axis.Y = new Vector3(0, 1, 0); -Axis.Z = new Vector3(0, 0, 1); -var Coordinate; -(function(Coordinate2) { - Coordinate2[Coordinate2["X"] = 0] = "X"; - Coordinate2[Coordinate2["Y"] = 1] = "Y"; - Coordinate2[Coordinate2["Z"] = 2] = "Z"; -})(Coordinate || (Coordinate = {})); - -// node_modules/@babylonjs/core/Maths/math.path.js -var Orientation; -(function(Orientation2) { - Orientation2[Orientation2["CW"] = 0] = "CW"; - Orientation2[Orientation2["CCW"] = 1] = "CCW"; -})(Orientation || (Orientation = {})); -var BezierCurve = class { /** - * Returns the cubic Bezier interpolated value (float) at "t" (float) from the given x1, y1, x2, y2 floats - * @param t defines the time - * @param x1 defines the left coordinate on X axis - * @param y1 defines the left coordinate on Y axis - * @param x2 defines the right coordinate on X axis - * @param y2 defines the right coordinate on Y axis - * @returns the interpolated value + * Remove a light for the list of scene's lights + * @param toRemove defines the light to remove + * @returns the index where the light was in the light list */ - static Interpolate(t, x1, y1, x2, y2) { - const f0 = 1 - 3 * x2 + 3 * x1; - const f1 = 3 * x2 - 6 * x1; - const f2 = 3 * x1; - let refinedT = t; - for (let i = 0; i < 5; i++) { - const refinedT2 = refinedT * refinedT; - const refinedT3 = refinedT2 * refinedT; - const x = f0 * refinedT3 + f1 * refinedT2 + f2 * refinedT; - const slope = 1 / (3 * f0 * refinedT2 + 2 * f1 * refinedT + f2); - refinedT -= (x - t) * slope; - refinedT = Math.min(1, Math.max(0, refinedT)); + removeLight(toRemove) { + const index = this.lights.indexOf(toRemove); + if (index !== -1) { + for (const mesh of this.meshes) { + mesh._removeLightSource(toRemove, false); + } + this.lights.splice(index, 1); + this.sortLightsByPriority(); + if (!toRemove.parent) { + toRemove._removeFromSceneRootNodes(); + } } - return 3 * Math.pow(1 - refinedT, 2) * refinedT * y1 + 3 * (1 - refinedT) * Math.pow(refinedT, 2) * y2 + Math.pow(refinedT, 3); + this.onLightRemovedObservable.notifyObservers(toRemove); + return index; } -}; -var Angle = class _Angle { /** - * Creates an Angle object of "radians" radians (float). - * @param radians the angle in radians + * Remove a camera for the list of scene's cameras + * @param toRemove defines the camera to remove + * @returns the index where the camera was in the camera list */ - constructor(radians) { - this._radians = radians; - if (this._radians < 0) { - this._radians += 2 * Math.PI; + removeCamera(toRemove) { + const index = this.cameras.indexOf(toRemove); + if (index !== -1) { + this.cameras.splice(index, 1); + if (!toRemove.parent) { + toRemove._removeFromSceneRootNodes(); + } + } + if (this.activeCameras) { + const index2 = this.activeCameras.indexOf(toRemove); + if (index2 !== -1) { + this.activeCameras.splice(index2, 1); + } + } + if (this.activeCamera === toRemove) { + if (this.cameras.length > 0) { + this.activeCamera = this.cameras[0]; + } else { + this.activeCamera = null; + } } + this.onCameraRemovedObservable.notifyObservers(toRemove); + return index; } /** - * Get value in degrees - * @returns the Angle value in degrees (float) + * Remove a particle system for the list of scene's particle systems + * @param toRemove defines the particle system to remove + * @returns the index where the particle system was in the particle system list */ - degrees() { - return this._radians * 180 / Math.PI; + removeParticleSystem(toRemove) { + const index = this.particleSystems.indexOf(toRemove); + if (index !== -1) { + this.particleSystems.splice(index, 1); + this._executeActiveContainerCleanup(this._activeParticleSystems); + } + return index; } /** - * Get value in radians - * @returns the Angle value in radians (float) + * Remove a animation for the list of scene's animations + * @param toRemove defines the animation to remove + * @returns the index where the animation was in the animation list */ - radians() { - return this._radians; + removeAnimation(toRemove) { + const index = this.animations.indexOf(toRemove); + if (index !== -1) { + this.animations.splice(index, 1); + } + return index; } /** - * Gets a new Angle object with a value of the angle (in radians) between the line connecting the two points and the x-axis - * @param a defines first point as the origin - * @param b defines point - * @returns a new Angle + * Will stop the animation of the given target + * @param target - the target + * @param animationName - the name of the animation to stop (all animations will be stopped if both this and targetMask are empty) + * @param targetMask - a function that determines if the animation should be stopped based on its target (all animations will be stopped if both this and animationName are empty) */ - static BetweenTwoPoints(a, b) { - const delta = b.subtract(a); - const theta = Math.atan2(delta.y, delta.x); - return new _Angle(theta); + stopAnimation(target, animationName, targetMask) { } /** - * Gets the angle between the two vectors - * @param a defines first vector - * @param b defines vector - * @returns Returns an new Angle between 0 and PI + * Removes the given animation group from this scene. + * @param toRemove The animation group to remove + * @returns The index of the removed animation group */ - static BetweenTwoVectors(a, b) { - let product = a.lengthSquared() * b.lengthSquared(); - if (product === 0) - return new _Angle(Math.PI / 2); - product = Math.sqrt(product); - let cosVal = a.dot(b) / product; - cosVal = Scalar.Clamp(cosVal, -1, 1); - const angle = Math.acos(cosVal); - return new _Angle(angle); + removeAnimationGroup(toRemove) { + const index = this.animationGroups.indexOf(toRemove); + if (index !== -1) { + this.animationGroups.splice(index, 1); + } + return index; } /** - * Gets a new Angle object from the given float in radians - * @param radians defines the angle value in radians - * @returns a new Angle + * Removes the given multi-material from this scene. + * @param toRemove The multi-material to remove + * @returns The index of the removed multi-material */ - static FromRadians(radians) { - return new _Angle(radians); + removeMultiMaterial(toRemove) { + const index = this.multiMaterials.indexOf(toRemove); + if (index !== -1) { + this.multiMaterials.splice(index, 1); + } + this.onMultiMaterialRemovedObservable.notifyObservers(toRemove); + return index; } /** - * Gets a new Angle object from the given float in degrees - * @param degrees defines the angle value in degrees - * @returns a new Angle + * Removes the given material from this scene. + * @param toRemove The material to remove + * @returns The index of the removed material */ - static FromDegrees(degrees) { - return new _Angle(degrees * Math.PI / 180); + removeMaterial(toRemove) { + const index = toRemove._indexInSceneMaterialArray; + if (index !== -1 && index < this.materials.length) { + if (index !== this.materials.length - 1) { + const lastMaterial = this.materials[this.materials.length - 1]; + this.materials[index] = lastMaterial; + lastMaterial._indexInSceneMaterialArray = index; + } + toRemove._indexInSceneMaterialArray = -1; + this.materials.pop(); + } + this.onMaterialRemovedObservable.notifyObservers(toRemove); + return index; } -}; -var Arc2 = class { /** - * Creates an Arc object from the three given points : start, middle and end. - * @param startPoint Defines the start point of the arc - * @param midPoint Defines the middle point of the arc - * @param endPoint Defines the end point of the arc + * Removes the given action manager from this scene. + * @deprecated + * @param toRemove The action manager to remove + * @returns The index of the removed action manager */ - constructor(startPoint, midPoint, endPoint) { - this.startPoint = startPoint; - this.midPoint = midPoint; - this.endPoint = endPoint; - const temp = Math.pow(midPoint.x, 2) + Math.pow(midPoint.y, 2); - const startToMid = (Math.pow(startPoint.x, 2) + Math.pow(startPoint.y, 2) - temp) / 2; - const midToEnd = (temp - Math.pow(endPoint.x, 2) - Math.pow(endPoint.y, 2)) / 2; - const det = (startPoint.x - midPoint.x) * (midPoint.y - endPoint.y) - (midPoint.x - endPoint.x) * (startPoint.y - midPoint.y); - this.centerPoint = new Vector2((startToMid * (midPoint.y - endPoint.y) - midToEnd * (startPoint.y - midPoint.y)) / det, ((startPoint.x - midPoint.x) * midToEnd - (midPoint.x - endPoint.x) * startToMid) / det); - this.radius = this.centerPoint.subtract(this.startPoint).length(); - this.startAngle = Angle.BetweenTwoPoints(this.centerPoint, this.startPoint); - const a1 = this.startAngle.degrees(); - let a2 = Angle.BetweenTwoPoints(this.centerPoint, this.midPoint).degrees(); - let a3 = Angle.BetweenTwoPoints(this.centerPoint, this.endPoint).degrees(); - if (a2 - a1 > 180) { - a2 -= 360; - } - if (a2 - a1 < -180) { - a2 += 360; - } - if (a3 - a2 > 180) { - a3 -= 360; - } - if (a3 - a2 < -180) { - a3 += 360; + removeActionManager(toRemove) { + const index = this.actionManagers.indexOf(toRemove); + if (index !== -1) { + this.actionManagers.splice(index, 1); } - this.orientation = a2 - a1 < 0 ? Orientation.CW : Orientation.CCW; - this.angle = Angle.FromDegrees(this.orientation === Orientation.CW ? a1 - a3 : a3 - a1); + return index; } -}; -var Path2 = class _Path2 { /** - * Creates a Path2 object from the starting 2D coordinates x and y. - * @param x the starting points x value - * @param y the starting points y value + * Removes the given texture from this scene. + * @param toRemove The texture to remove + * @returns The index of the removed texture */ - constructor(x, y) { - this._points = new Array(); - this._length = 0; - this.closed = false; - this._points.push(new Vector2(x, y)); + removeTexture(toRemove) { + const index = this.textures.indexOf(toRemove); + if (index !== -1) { + this.textures.splice(index, 1); + } + this.onTextureRemovedObservable.notifyObservers(toRemove); + return index; } /** - * Adds a new segment until the given coordinates (x, y) to the current Path2. - * @param x the added points x value - * @param y the added points y value - * @returns the updated Path2. + * Adds the given light to this scene + * @param newLight The light to add */ - addLineTo(x, y) { - if (this.closed) { - return this; + addLight(newLight) { + if (this._blockEntityCollection) { + return; } - const newPoint = new Vector2(x, y); - const previousPoint = this._points[this._points.length - 1]; - this._points.push(newPoint); - this._length += newPoint.subtract(previousPoint).length(); - return this; - } - /** - * Adds _numberOfSegments_ segments according to the arc definition (middle point coordinates, end point coordinates, the arc start point being the current Path2 last point) to the current Path2. - * @param midX middle point x value - * @param midY middle point y value - * @param endX end point x value - * @param endY end point y value - * @param numberOfSegments (default: 36) - * @returns the updated Path2. - */ - addArcTo(midX, midY, endX, endY, numberOfSegments = 36) { - if (this.closed) { - return this; - } - const startPoint = this._points[this._points.length - 1]; - const midPoint = new Vector2(midX, midY); - const endPoint = new Vector2(endX, endY); - const arc = new Arc2(startPoint, midPoint, endPoint); - let increment = arc.angle.radians() / numberOfSegments; - if (arc.orientation === Orientation.CW) { - increment *= -1; + this.lights.push(newLight); + this.sortLightsByPriority(); + if (!newLight.parent) { + newLight._addToSceneRootNodes(); } - let currentAngle = arc.startAngle.radians() + increment; - for (let i = 0; i < numberOfSegments; i++) { - const x = Math.cos(currentAngle) * arc.radius + arc.centerPoint.x; - const y = Math.sin(currentAngle) * arc.radius + arc.centerPoint.y; - this.addLineTo(x, y); - currentAngle += increment; + for (const mesh of this.meshes) { + if (mesh.lightSources.indexOf(newLight) === -1) { + mesh.lightSources.push(newLight); + mesh._resyncLightSources(); + } } - return this; + this.onNewLightAddedObservable.notifyObservers(newLight); } /** - * Adds _numberOfSegments_ segments according to the quadratic curve definition to the current Path2. - * @param controlX control point x value - * @param controlY control point y value - * @param endX end point x value - * @param endY end point y value - * @param numberOfSegments (default: 36) - * @returns the updated Path2. + * Sorts the list list based on light priorities */ - addQuadraticCurveTo(controlX, controlY, endX, endY, numberOfSegments = 36) { - if (this.closed) { - return this; - } - const equation = (t, val0, val1, val2) => { - const res = (1 - t) * (1 - t) * val0 + 2 * t * (1 - t) * val1 + t * t * val2; - return res; - }; - const startPoint = this._points[this._points.length - 1]; - for (let i = 0; i <= numberOfSegments; i++) { - const step = i / numberOfSegments; - const x = equation(step, startPoint.x, controlX, endX); - const y = equation(step, startPoint.y, controlY, endY); - this.addLineTo(x, y); + sortLightsByPriority() { + if (this.requireLightSorting) { + this.lights.sort(LightConstants.CompareLightsPriority); } - return this; } /** - * Adds _numberOfSegments_ segments according to the bezier curve definition to the current Path2. - * @param originTangentX tangent vector at the origin point x value - * @param originTangentY tangent vector at the origin point y value - * @param destinationTangentX tangent vector at the destination point x value - * @param destinationTangentY tangent vector at the destination point y value - * @param endX end point x value - * @param endY end point y value - * @param numberOfSegments (default: 36) - * @returns the updated Path2. + * Adds the given camera to this scene + * @param newCamera The camera to add */ - addBezierCurveTo(originTangentX, originTangentY, destinationTangentX, destinationTangentY, endX, endY, numberOfSegments = 36) { - if (this.closed) { - return this; + addCamera(newCamera) { + if (this._blockEntityCollection) { + return; } - const equation = (t, val0, val1, val2, val3) => { - const res = (1 - t) * (1 - t) * (1 - t) * val0 + 3 * t * (1 - t) * (1 - t) * val1 + 3 * t * t * (1 - t) * val2 + t * t * t * val3; - return res; - }; - const startPoint = this._points[this._points.length - 1]; - for (let i = 0; i <= numberOfSegments; i++) { - const step = i / numberOfSegments; - const x = equation(step, startPoint.x, originTangentX, destinationTangentX, endX); - const y = equation(step, startPoint.y, originTangentY, destinationTangentY, endY); - this.addLineTo(x, y); + this.cameras.push(newCamera); + this.onNewCameraAddedObservable.notifyObservers(newCamera); + if (!newCamera.parent) { + newCamera._addToSceneRootNodes(); } - return this; } /** - * Defines if a given point is inside the polygon defines by the path - * @param point defines the point to test - * @returns true if the point is inside + * Adds the given skeleton to this scene + * @param newSkeleton The skeleton to add */ - isPointInside(point) { - let isInside = false; - const count = this._points.length; - for (let p = count - 1, q = 0; q < count; p = q++) { - let edgeLow = this._points[p]; - let edgeHigh = this._points[q]; - let edgeDx = edgeHigh.x - edgeLow.x; - let edgeDy = edgeHigh.y - edgeLow.y; - if (Math.abs(edgeDy) > Number.EPSILON) { - if (edgeDy < 0) { - edgeLow = this._points[q]; - edgeDx = -edgeDx; - edgeHigh = this._points[p]; - edgeDy = -edgeDy; - } - if (point.y < edgeLow.y || point.y > edgeHigh.y) { - continue; - } - if (point.y === edgeLow.y && point.x === edgeLow.x) { - return true; - } else { - const perpEdge = edgeDy * (point.x - edgeLow.x) - edgeDx * (point.y - edgeLow.y); - if (perpEdge === 0) { - return true; - } - if (perpEdge < 0) { - continue; - } - isInside = !isInside; - } - } else { - if (point.y !== edgeLow.y) { - continue; - } - if (edgeHigh.x <= point.x && point.x <= edgeLow.x || edgeLow.x <= point.x && point.x <= edgeHigh.x) { - return true; - } - } + addSkeleton(newSkeleton) { + if (this._blockEntityCollection) { + return; } - return isInside; + this.skeletons.push(newSkeleton); + this.onNewSkeletonAddedObservable.notifyObservers(newSkeleton); } /** - * Closes the Path2. - * @returns the Path2. + * Adds the given particle system to this scene + * @param newParticleSystem The particle system to add */ - close() { - this.closed = true; - return this; + addParticleSystem(newParticleSystem) { + if (this._blockEntityCollection) { + return; + } + this.particleSystems.push(newParticleSystem); } /** - * Gets the sum of the distance between each sequential point in the path - * @returns the Path2 total length (float). + * Adds the given animation to this scene + * @param newAnimation The animation to add */ - length() { - let result = this._length; - if (this.closed) { - const lastPoint = this._points[this._points.length - 1]; - const firstPoint = this._points[0]; - result += firstPoint.subtract(lastPoint).length(); + addAnimation(newAnimation) { + if (this._blockEntityCollection) { + return; } - return result; + this.animations.push(newAnimation); } /** - * Gets the area of the polygon defined by the path - * @returns area value + * Adds the given animation group to this scene. + * @param newAnimationGroup The animation group to add */ - area() { - const n = this._points.length; - let value = 0; - for (let p = n - 1, q = 0; q < n; p = q++) { - value += this._points[p].x * this._points[q].y - this._points[q].x * this._points[p].y; + addAnimationGroup(newAnimationGroup) { + if (this._blockEntityCollection) { + return; } - return value * 0.5; + this.animationGroups.push(newAnimationGroup); } /** - * Gets the points which construct the path - * @returns the Path2 internal array of points. + * Adds the given multi-material to this scene + * @param newMultiMaterial The multi-material to add */ - getPoints() { - return this._points; + addMultiMaterial(newMultiMaterial) { + if (this._blockEntityCollection) { + return; + } + this.multiMaterials.push(newMultiMaterial); + this.onNewMultiMaterialAddedObservable.notifyObservers(newMultiMaterial); } /** - * Retrieves the point at the distance aways from the starting point - * @param normalizedLengthPosition the length along the path to retrieve the point from - * @returns a new Vector2 located at a percentage of the Path2 total length on this path. + * Adds the given material to this scene + * @param newMaterial The material to add */ - getPointAtLengthPosition(normalizedLengthPosition) { - if (normalizedLengthPosition < 0 || normalizedLengthPosition > 1) { - return Vector2.Zero(); + addMaterial(newMaterial) { + if (this._blockEntityCollection) { + return; } - const lengthPosition = normalizedLengthPosition * this.length(); - let previousOffset = 0; - for (let i = 0; i < this._points.length; i++) { - const j = (i + 1) % this._points.length; - const a = this._points[i]; - const b = this._points[j]; - const bToA = b.subtract(a); - const nextOffset = bToA.length() + previousOffset; - if (lengthPosition >= previousOffset && lengthPosition <= nextOffset) { - const dir = bToA.normalize(); - const localOffset = lengthPosition - previousOffset; - return new Vector2(a.x + dir.x * localOffset, a.y + dir.y * localOffset); - } - previousOffset = nextOffset; + if (newMaterial.getScene() === this && newMaterial._indexInSceneMaterialArray !== -1) { + return; } - return Vector2.Zero(); + newMaterial._indexInSceneMaterialArray = this.materials.length; + this.materials.push(newMaterial); + this.onNewMaterialAddedObservable.notifyObservers(newMaterial); } /** - * Creates a new path starting from an x and y position - * @param x starting x value - * @param y starting y value - * @returns a new Path2 starting at the coordinates (x, y). + * Adds the given morph target to this scene + * @param newMorphTargetManager The morph target to add */ - static StartingAt(x, y) { - return new _Path2(x, y); + addMorphTargetManager(newMorphTargetManager) { + if (this._blockEntityCollection) { + return; + } + this.morphTargetManagers.push(newMorphTargetManager); } -}; -var Path3D = class _Path3D { /** - * new Path3D(path, normal, raw) - * Creates a Path3D. A Path3D is a logical math object, so not a mesh. - * please read the description in the tutorial : https://doc.babylonjs.com/features/featuresDeepDive/mesh/path3D - * @param path an array of Vector3, the curve axis of the Path3D - * @param firstNormal (options) Vector3, the first wanted normal to the curve. Ex (0, 1, 0) for a vertical normal. - * @param raw (optional, default false) : boolean, if true the returned Path3D isn't normalized. Useful to depict path acceleration or speed. - * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path. + * Adds the given geometry to this scene + * @param newGeometry The geometry to add */ - constructor(path, firstNormal = null, raw, alignTangentsWithPath = false) { - this.path = path; - this._curve = new Array(); - this._distances = new Array(); - this._tangents = new Array(); - this._normals = new Array(); - this._binormals = new Array(); - this._pointAtData = { - id: 0, - point: Vector3.Zero(), - previousPointArrayIndex: 0, - position: 0, - subPosition: 0, - interpolateReady: false, - interpolationMatrix: Matrix.Identity() - }; - for (let p = 0; p < path.length; p++) { - this._curve[p] = path[p].clone(); + addGeometry(newGeometry) { + if (this._blockEntityCollection) { + return; } - this._raw = raw || false; - this._alignTangentsWithPath = alignTangentsWithPath; - this._compute(firstNormal, alignTangentsWithPath); + if (this._geometriesByUniqueId) { + this._geometriesByUniqueId[newGeometry.uniqueId] = this.geometries.length; + } + this.geometries.push(newGeometry); } /** - * Returns the Path3D array of successive Vector3 designing its curve. - * @returns the Path3D array of successive Vector3 designing its curve. + * Adds the given action manager to this scene + * @deprecated + * @param newActionManager The action manager to add */ - getCurve() { - return this._curve; + addActionManager(newActionManager) { + this.actionManagers.push(newActionManager); } /** - * Returns the Path3D array of successive Vector3 designing its curve. - * @returns the Path3D array of successive Vector3 designing its curve. + * Adds the given texture to this scene. + * @param newTexture The texture to add */ - getPoints() { - return this._curve; + addTexture(newTexture) { + if (this._blockEntityCollection) { + return; + } + this.textures.push(newTexture); + this.onNewTextureAddedObservable.notifyObservers(newTexture); } /** - * @returns the computed length (float) of the path. + * Switch active camera + * @param newCamera defines the new active camera + * @param attachControl defines if attachControl must be called for the new active camera (default: true) */ - length() { - return this._distances[this._distances.length - 1]; + switchActiveCamera(newCamera, attachControl = true) { + const canvas = this._engine.getInputElement(); + if (!canvas) { + return; + } + if (this.activeCamera) { + this.activeCamera.detachControl(); + } + this.activeCamera = newCamera; + if (attachControl) { + newCamera.attachControl(); + } } /** - * Returns an array populated with tangent vectors on each Path3D curve point. - * @returns an array populated with tangent vectors on each Path3D curve point. + * sets the active camera of the scene using its Id + * @param id defines the camera's Id + * @returns the new active camera or null if none found. */ - getTangents() { - return this._tangents; + setActiveCameraById(id) { + const camera = this.getCameraById(id); + if (camera) { + this.activeCamera = camera; + return camera; + } + return null; } /** - * Returns an array populated with normal vectors on each Path3D curve point. - * @returns an array populated with normal vectors on each Path3D curve point. + * sets the active camera of the scene using its name + * @param name defines the camera's name + * @returns the new active camera or null if none found. */ - getNormals() { - return this._normals; + setActiveCameraByName(name69) { + const camera = this.getCameraByName(name69); + if (camera) { + this.activeCamera = camera; + return camera; + } + return null; } /** - * Returns an array populated with binormal vectors on each Path3D curve point. - * @returns an array populated with binormal vectors on each Path3D curve point. + * get an animation group using its name + * @param name defines the material's name + * @returns the animation group or null if none found. */ - getBinormals() { - return this._binormals; + getAnimationGroupByName(name69) { + for (let index = 0; index < this.animationGroups.length; index++) { + if (this.animationGroups[index].name === name69) { + return this.animationGroups[index]; + } + } + return null; + } + _getMaterial(allowMultiMaterials, predicate) { + for (let index = 0; index < this.materials.length; index++) { + const material = this.materials[index]; + if (predicate(material)) { + return material; + } + } + if (allowMultiMaterials) { + for (let index = 0; index < this.multiMaterials.length; index++) { + const material = this.multiMaterials[index]; + if (predicate(material)) { + return material; + } + } + } + return null; } /** - * Returns an array populated with distances (float) of the i-th point from the first curve point. - * @returns an array populated with distances (float) of the i-th point from the first curve point. + * Get a material using its unique id + * @param uniqueId defines the material's unique id + * @param allowMultiMaterials determines whether multimaterials should be considered + * @returns the material or null if none found. */ - getDistances() { - return this._distances; + getMaterialByUniqueID(uniqueId, allowMultiMaterials = false) { + return this._getMaterial(allowMultiMaterials, (m) => m.uniqueId === uniqueId); } /** - * Returns an interpolated point along this path - * @param position the position of the point along this path, from 0.0 to 1.0 - * @returns a new Vector3 as the point + * get a material using its id + * @param id defines the material's Id + * @param allowMultiMaterials determines whether multimaterials should be considered + * @returns the material or null if none found. */ - getPointAt(position) { - return this._updatePointAtData(position).point; + getMaterialById(id, allowMultiMaterials = false) { + return this._getMaterial(allowMultiMaterials, (m) => m.id === id); } /** - * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path. - * @param position the position of the point along this path, from 0.0 to 1.0 - * @param interpolated (optional, default false) : boolean, if true returns an interpolated tangent instead of the tangent of the previous path point. - * @returns a tangent vector corresponding to the interpolated Path3D curve point, if not interpolated, the tangent is taken from the precomputed tangents array. + * Gets a material using its name + * @param name defines the material's name + * @param allowMultiMaterials determines whether multimaterials should be considered + * @returns the material or null if none found. */ - getTangentAt(position, interpolated = false) { - this._updatePointAtData(position, interpolated); - return interpolated ? Vector3.TransformCoordinates(Vector3.Forward(), this._pointAtData.interpolationMatrix) : this._tangents[this._pointAtData.previousPointArrayIndex]; + getMaterialByName(name69, allowMultiMaterials = false) { + return this._getMaterial(allowMultiMaterials, (m) => m.name === name69); } /** - * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path. - * @param position the position of the point along this path, from 0.0 to 1.0 - * @param interpolated (optional, default false) : boolean, if true returns an interpolated normal instead of the normal of the previous path point. - * @returns a normal vector corresponding to the interpolated Path3D curve point, if not interpolated, the normal is taken from the precomputed normals array. + * Gets a last added material using a given id + * @param id defines the material's id + * @param allowMultiMaterials determines whether multimaterials should be considered + * @returns the last material with the given id or null if none found. */ - getNormalAt(position, interpolated = false) { - this._updatePointAtData(position, interpolated); - return interpolated ? Vector3.TransformCoordinates(Vector3.Right(), this._pointAtData.interpolationMatrix) : this._normals[this._pointAtData.previousPointArrayIndex]; + getLastMaterialById(id, allowMultiMaterials = false) { + for (let index = this.materials.length - 1; index >= 0; index--) { + if (this.materials[index].id === id) { + return this.materials[index]; + } + } + if (allowMultiMaterials) { + for (let index = this.multiMaterials.length - 1; index >= 0; index--) { + if (this.multiMaterials[index].id === id) { + return this.multiMaterials[index]; + } + } + } + return null; } /** - * Returns the binormal vector of an interpolated Path3D curve point at the specified position along this path. - * @param position the position of the point along this path, from 0.0 to 1.0 - * @param interpolated (optional, default false) : boolean, if true returns an interpolated binormal instead of the binormal of the previous path point. - * @returns a binormal vector corresponding to the interpolated Path3D curve point, if not interpolated, the binormal is taken from the precomputed binormals array. + * Get a texture using its unique id + * @param uniqueId defines the texture's unique id + * @returns the texture or null if none found. */ - getBinormalAt(position, interpolated = false) { - this._updatePointAtData(position, interpolated); - return interpolated ? Vector3.TransformCoordinates(Vector3.UpReadOnly, this._pointAtData.interpolationMatrix) : this._binormals[this._pointAtData.previousPointArrayIndex]; + getTextureByUniqueId(uniqueId) { + for (let index = 0; index < this.textures.length; index++) { + if (this.textures[index].uniqueId === uniqueId) { + return this.textures[index]; + } + } + return null; } /** - * Returns the distance (float) of an interpolated Path3D curve point at the specified position along this path. - * @param position the position of the point along this path, from 0.0 to 1.0 - * @returns the distance of the interpolated Path3D curve point at the specified position along this path. + * Gets a texture using its name + * @param name defines the texture's name + * @returns the texture or null if none found. */ - getDistanceAt(position) { - return this.length() * position; + getTextureByName(name69) { + for (let index = 0; index < this.textures.length; index++) { + if (this.textures[index].name === name69) { + return this.textures[index]; + } + } + return null; } /** - * Returns the array index of the previous point of an interpolated point along this path - * @param position the position of the point to interpolate along this path, from 0.0 to 1.0 - * @returns the array index + * Gets a camera using its Id + * @param id defines the Id to look for + * @returns the camera or null if not found */ - getPreviousPointIndexAt(position) { - this._updatePointAtData(position); - return this._pointAtData.previousPointArrayIndex; + getCameraById(id) { + for (let index = 0; index < this.cameras.length; index++) { + if (this.cameras[index].id === id) { + return this.cameras[index]; + } + } + return null; } /** - * Returns the position of an interpolated point relative to the two path points it lies between, from 0.0 (point A) to 1.0 (point B) - * @param position the position of the point to interpolate along this path, from 0.0 to 1.0 - * @returns the sub position + * Gets a camera using its unique Id + * @param uniqueId defines the unique Id to look for + * @returns the camera or null if not found */ - getSubPositionAt(position) { - this._updatePointAtData(position); - return this._pointAtData.subPosition; + getCameraByUniqueId(uniqueId) { + for (let index = 0; index < this.cameras.length; index++) { + if (this.cameras[index].uniqueId === uniqueId) { + return this.cameras[index]; + } + } + return null; } /** - * Returns the position of the closest virtual point on this path to an arbitrary Vector3, from 0.0 to 1.0 - * @param target the vector of which to get the closest position to - * @returns the position of the closest virtual point on this path to the target vector - */ - getClosestPositionTo(target) { - let smallestDistance = Number.MAX_VALUE; - let closestPosition = 0; - for (let i = 0; i < this._curve.length - 1; i++) { - const point = this._curve[i + 0]; - const tangent = this._curve[i + 1].subtract(point).normalize(); - const subLength = this._distances[i + 1] - this._distances[i + 0]; - const subPosition = Math.min(Math.max(Vector3.Dot(tangent, target.subtract(point).normalize()), 0) * Vector3.Distance(point, target) / subLength, 1); - const distance = Vector3.Distance(point.add(tangent.scale(subPosition * subLength)), target); - if (distance < smallestDistance) { - smallestDistance = distance; - closestPosition = (this._distances[i + 0] + subLength * subPosition) / this.length(); + * Gets a camera using its name + * @param name defines the camera's name + * @returns the camera or null if none found. + */ + getCameraByName(name69) { + for (let index = 0; index < this.cameras.length; index++) { + if (this.cameras[index].name === name69) { + return this.cameras[index]; } } - return closestPosition; + return null; } /** - * Returns a sub path (slice) of this path - * @param start the position of the fist path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values - * @param end the position of the last path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values - * @returns a sub path (slice) of this path + * Gets a bone using its Id + * @param id defines the bone's Id + * @returns the bone or null if not found */ - slice(start = 0, end = 1) { - if (start < 0) { - start = 1 - start * -1 % 1; - } - if (end < 0) { - end = 1 - end * -1 % 1; - } - if (start > end) { - const _start = start; - start = end; - end = _start; - } - const curvePoints = this.getCurve(); - const startPoint = this.getPointAt(start); - let startIndex = this.getPreviousPointIndexAt(start); - const endPoint = this.getPointAt(end); - const endIndex = this.getPreviousPointIndexAt(end) + 1; - const slicePoints = []; - if (start !== 0) { - startIndex++; - slicePoints.push(startPoint); - } - slicePoints.push(...curvePoints.slice(startIndex, endIndex)); - if (end !== 1 || start === 1) { - slicePoints.push(endPoint); + getBoneById(id) { + for (let skeletonIndex = 0; skeletonIndex < this.skeletons.length; skeletonIndex++) { + const skeleton = this.skeletons[skeletonIndex]; + for (let boneIndex = 0; boneIndex < skeleton.bones.length; boneIndex++) { + if (skeleton.bones[boneIndex].id === id) { + return skeleton.bones[boneIndex]; + } + } } - return new _Path3D(slicePoints, this.getNormalAt(start), this._raw, this._alignTangentsWithPath); + return null; } /** - * Forces the Path3D tangent, normal, binormal and distance recomputation. - * @param path path which all values are copied into the curves points - * @param firstNormal which should be projected onto the curve - * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path - * @returns the same object updated. + * Gets a bone using its id + * @param name defines the bone's name + * @returns the bone or null if not found */ - update(path, firstNormal = null, alignTangentsWithPath = false) { - for (let p = 0; p < path.length; p++) { - this._curve[p].x = path[p].x; - this._curve[p].y = path[p].y; - this._curve[p].z = path[p].z; + getBoneByName(name69) { + for (let skeletonIndex = 0; skeletonIndex < this.skeletons.length; skeletonIndex++) { + const skeleton = this.skeletons[skeletonIndex]; + for (let boneIndex = 0; boneIndex < skeleton.bones.length; boneIndex++) { + if (skeleton.bones[boneIndex].name === name69) { + return skeleton.bones[boneIndex]; + } + } } - this._compute(firstNormal, alignTangentsWithPath); - return this; + return null; } - // private function compute() : computes tangents, normals and binormals - _compute(firstNormal, alignTangentsWithPath = false) { - const l = this._curve.length; - if (l < 2) { - return; - } - this._tangents[0] = this._getFirstNonNullVector(0); - if (!this._raw) { - this._tangents[0].normalize(); - } - this._tangents[l - 1] = this._curve[l - 1].subtract(this._curve[l - 2]); - if (!this._raw) { - this._tangents[l - 1].normalize(); - } - const tg0 = this._tangents[0]; - const pp0 = this._normalVector(tg0, firstNormal); - this._normals[0] = pp0; - if (!this._raw) { - this._normals[0].normalize(); - } - this._binormals[0] = Vector3.Cross(tg0, this._normals[0]); - if (!this._raw) { - this._binormals[0].normalize(); - } - this._distances[0] = 0; - let prev; - let cur; - let curTang; - let prevNor; - let prevBinor; - for (let i = 1; i < l; i++) { - prev = this._getLastNonNullVector(i); - if (i < l - 1) { - cur = this._getFirstNonNullVector(i); - this._tangents[i] = alignTangentsWithPath ? cur : prev.add(cur); - this._tangents[i].normalize(); - } - this._distances[i] = this._distances[i - 1] + this._curve[i].subtract(this._curve[i - 1]).length(); - curTang = this._tangents[i]; - prevBinor = this._binormals[i - 1]; - this._normals[i] = Vector3.Cross(prevBinor, curTang); - if (!this._raw) { - if (this._normals[i].length() === 0) { - prevNor = this._normals[i - 1]; - this._normals[i] = prevNor.clone(); - } else { - this._normals[i].normalize(); - } + /** + * Gets a light node using its name + * @param name defines the light's name + * @returns the light or null if none found. + */ + getLightByName(name69) { + for (let index = 0; index < this.lights.length; index++) { + if (this.lights[index].name === name69) { + return this.lights[index]; } - this._binormals[i] = Vector3.Cross(curTang, this._normals[i]); - if (!this._raw) { - this._binormals[i].normalize(); + } + return null; + } + /** + * Gets a light node using its Id + * @param id defines the light's Id + * @returns the light or null if none found. + */ + getLightById(id) { + for (let index = 0; index < this.lights.length; index++) { + if (this.lights[index].id === id) { + return this.lights[index]; } } - this._pointAtData.id = NaN; + return null; } - // private function getFirstNonNullVector(index) - // returns the first non null vector from index : curve[index + N].subtract(curve[index]) - _getFirstNonNullVector(index) { - let i = 1; - let nNVector = this._curve[index + i].subtract(this._curve[index]); - while (nNVector.length() === 0 && index + i + 1 < this._curve.length) { - i++; - nNVector = this._curve[index + i].subtract(this._curve[index]); + /** + * Gets a light node using its scene-generated unique Id + * @param uniqueId defines the light's unique Id + * @returns the light or null if none found. + */ + getLightByUniqueId(uniqueId) { + for (let index = 0; index < this.lights.length; index++) { + if (this.lights[index].uniqueId === uniqueId) { + return this.lights[index]; + } } - return nNVector; + return null; } - // private function getLastNonNullVector(index) - // returns the last non null vector from index : curve[index].subtract(curve[index - N]) - _getLastNonNullVector(index) { - let i = 1; - let nLVector = this._curve[index].subtract(this._curve[index - i]); - while (nLVector.length() === 0 && index > i + 1) { - i++; - nLVector = this._curve[index].subtract(this._curve[index - i]); + /** + * Gets a particle system by Id + * @param id defines the particle system Id + * @returns the corresponding system or null if none found + */ + getParticleSystemById(id) { + for (let index = 0; index < this.particleSystems.length; index++) { + if (this.particleSystems[index].id === id) { + return this.particleSystems[index]; + } } - return nLVector; + return null; } - // private function normalVector(v0, vt, va) : - // returns an arbitrary point in the plane defined by the point v0 and the vector vt orthogonal to this plane - // if va is passed, it returns the va projection on the plane orthogonal to vt at the point v0 - _normalVector(vt, va) { - let normal0; - let tgl = vt.length(); - if (tgl === 0) { - tgl = 1; + /** + * Gets a geometry using its Id + * @param id defines the geometry's Id + * @returns the geometry or null if none found. + */ + getGeometryById(id) { + for (let index = 0; index < this.geometries.length; index++) { + if (this.geometries[index].id === id) { + return this.geometries[index]; + } } - if (va === void 0 || va === null) { - let point; - if (!Scalar.WithinEpsilon(Math.abs(vt.y) / tgl, 1, Epsilon)) { - point = new Vector3(0, -1, 0); - } else if (!Scalar.WithinEpsilon(Math.abs(vt.x) / tgl, 1, Epsilon)) { - point = new Vector3(1, 0, 0); - } else if (!Scalar.WithinEpsilon(Math.abs(vt.z) / tgl, 1, Epsilon)) { - point = new Vector3(0, 0, 1); - } else { - point = Vector3.Zero(); + return null; + } + _getGeometryByUniqueId(uniqueId) { + if (this._geometriesByUniqueId) { + const index = this._geometriesByUniqueId[uniqueId]; + if (index !== void 0) { + return this.geometries[index]; } - normal0 = Vector3.Cross(vt, point); } else { - normal0 = Vector3.Cross(vt, va); - Vector3.CrossToRef(normal0, vt, normal0); + for (let index = 0; index < this.geometries.length; index++) { + if (this.geometries[index].uniqueId === uniqueId) { + return this.geometries[index]; + } + } } - normal0.normalize(); - return normal0; + return null; } /** - * Updates the point at data for an interpolated point along this curve - * @param position the position of the point along this curve, from 0.0 to 1.0 - * @param interpolateTNB - * @interpolateTNB whether to compute the interpolated tangent, normal and binormal - * @returns the (updated) point at data + * Add a new geometry to this scene + * @param geometry defines the geometry to be added to the scene. + * @param force defines if the geometry must be pushed even if a geometry with this id already exists + * @returns a boolean defining if the geometry was added or not */ - _updatePointAtData(position, interpolateTNB = false) { - if (this._pointAtData.id === position) { - if (!this._pointAtData.interpolateReady) { - this._updateInterpolationMatrix(); + pushGeometry(geometry, force) { + if (!force && this._getGeometryByUniqueId(geometry.uniqueId)) { + return false; + } + this.addGeometry(geometry); + this.onNewGeometryAddedObservable.notifyObservers(geometry); + return true; + } + /** + * Removes an existing geometry + * @param geometry defines the geometry to be removed from the scene + * @returns a boolean defining if the geometry was removed or not + */ + removeGeometry(geometry) { + let index; + if (this._geometriesByUniqueId) { + index = this._geometriesByUniqueId[geometry.uniqueId]; + if (index === void 0) { + return false; } - return this._pointAtData; } else { - this._pointAtData.id = position; - } - const curvePoints = this.getPoints(); - if (position <= 0) { - return this._setPointAtData(0, 0, curvePoints[0], 0, interpolateTNB); - } else if (position >= 1) { - return this._setPointAtData(1, 1, curvePoints[curvePoints.length - 1], curvePoints.length - 1, interpolateTNB); + index = this.geometries.indexOf(geometry); + if (index < 0) { + return false; + } } - let previousPoint = curvePoints[0]; - let currentPoint; - let currentLength = 0; - const targetLength = position * this.length(); - for (let i = 1; i < curvePoints.length; i++) { - currentPoint = curvePoints[i]; - const distance = Vector3.Distance(previousPoint, currentPoint); - currentLength += distance; - if (currentLength === targetLength) { - return this._setPointAtData(position, 1, currentPoint, i, interpolateTNB); - } else if (currentLength > targetLength) { - const toLength = currentLength - targetLength; - const diff = toLength / distance; - const dir = previousPoint.subtract(currentPoint); - const point = currentPoint.add(dir.scaleInPlace(diff)); - return this._setPointAtData(position, 1 - diff, point, i - 1, interpolateTNB); + if (index !== this.geometries.length - 1) { + const lastGeometry = this.geometries[this.geometries.length - 1]; + if (lastGeometry) { + this.geometries[index] = lastGeometry; + if (this._geometriesByUniqueId) { + this._geometriesByUniqueId[lastGeometry.uniqueId] = index; + } } - previousPoint = currentPoint; } - return this._pointAtData; + if (this._geometriesByUniqueId) { + this._geometriesByUniqueId[geometry.uniqueId] = void 0; + } + this.geometries.pop(); + this.onGeometryRemovedObservable.notifyObservers(geometry); + return true; } /** - * Updates the point at data from the specified parameters - * @param position where along the path the interpolated point is, from 0.0 to 1.0 - * @param subPosition - * @param point the interpolated point - * @param parentIndex the index of an existing curve point that is on, or else positionally the first behind, the interpolated point - * @param interpolateTNB whether to compute the interpolated tangent, normal and binormal - * @returns the (updated) point at data + * Gets the list of geometries attached to the scene + * @returns an array of Geometry */ - _setPointAtData(position, subPosition, point, parentIndex, interpolateTNB) { - this._pointAtData.point = point; - this._pointAtData.position = position; - this._pointAtData.subPosition = subPosition; - this._pointAtData.previousPointArrayIndex = parentIndex; - this._pointAtData.interpolateReady = interpolateTNB; - if (interpolateTNB) { - this._updateInterpolationMatrix(); - } - return this._pointAtData; + getGeometries() { + return this.geometries; } /** - * Updates the point at interpolation matrix for the tangents, normals and binormals + * Gets the first added mesh found of a given Id + * @param id defines the Id to search for + * @returns the mesh found or null if not found at all */ - _updateInterpolationMatrix() { - this._pointAtData.interpolationMatrix = Matrix.Identity(); - const parentIndex = this._pointAtData.previousPointArrayIndex; - if (parentIndex !== this._tangents.length - 1) { - const index = parentIndex + 1; - const tangentFrom = this._tangents[parentIndex].clone(); - const normalFrom = this._normals[parentIndex].clone(); - const binormalFrom = this._binormals[parentIndex].clone(); - const tangentTo = this._tangents[index].clone(); - const normalTo = this._normals[index].clone(); - const binormalTo = this._binormals[index].clone(); - const quatFrom = Quaternion.RotationQuaternionFromAxis(normalFrom, binormalFrom, tangentFrom); - const quatTo = Quaternion.RotationQuaternionFromAxis(normalTo, binormalTo, tangentTo); - const quatAt = Quaternion.Slerp(quatFrom, quatTo, this._pointAtData.subPosition); - quatAt.toRotationMatrix(this._pointAtData.interpolationMatrix); + getMeshById(id) { + for (let index = 0; index < this.meshes.length; index++) { + if (this.meshes[index].id === id) { + return this.meshes[index]; + } } + return null; } -}; -var Curve3 = class _Curve3 { /** - * Returns a Curve3 object along a Quadratic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#quadratic-bezier-curve - * @param v0 (Vector3) the origin point of the Quadratic Bezier - * @param v1 (Vector3) the control point - * @param v2 (Vector3) the end point of the Quadratic Bezier - * @param nbPoints (integer) the wanted number of points in the curve - * @returns the created Curve3 + * Gets a list of meshes using their Id + * @param id defines the Id to search for + * @returns a list of meshes */ - static CreateQuadraticBezier(v0, v1, v2, nbPoints) { - nbPoints = nbPoints > 2 ? nbPoints : 3; - const bez = []; - const equation = (t, val0, val1, val2) => { - const res = (1 - t) * (1 - t) * val0 + 2 * t * (1 - t) * val1 + t * t * val2; - return res; - }; - for (let i = 0; i <= nbPoints; i++) { - bez.push(new Vector3(equation(i / nbPoints, v0.x, v1.x, v2.x), equation(i / nbPoints, v0.y, v1.y, v2.y), equation(i / nbPoints, v0.z, v1.z, v2.z))); - } - return new _Curve3(bez); + getMeshesById(id) { + return this.meshes.filter(function(m) { + return m.id === id; + }); } /** - * Returns a Curve3 object along a Cubic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#cubic-bezier-curve - * @param v0 (Vector3) the origin point of the Cubic Bezier - * @param v1 (Vector3) the first control point - * @param v2 (Vector3) the second control point - * @param v3 (Vector3) the end point of the Cubic Bezier - * @param nbPoints (integer) the wanted number of points in the curve - * @returns the created Curve3 + * Gets the first added transform node found of a given Id + * @param id defines the Id to search for + * @returns the found transform node or null if not found at all. */ - static CreateCubicBezier(v0, v1, v2, v3, nbPoints) { - nbPoints = nbPoints > 3 ? nbPoints : 4; - const bez = []; - const equation = (t, val0, val1, val2, val3) => { - const res = (1 - t) * (1 - t) * (1 - t) * val0 + 3 * t * (1 - t) * (1 - t) * val1 + 3 * t * t * (1 - t) * val2 + t * t * t * val3; - return res; - }; - for (let i = 0; i <= nbPoints; i++) { - bez.push(new Vector3(equation(i / nbPoints, v0.x, v1.x, v2.x, v3.x), equation(i / nbPoints, v0.y, v1.y, v2.y, v3.y), equation(i / nbPoints, v0.z, v1.z, v2.z, v3.z))); + getTransformNodeById(id) { + for (let index = 0; index < this.transformNodes.length; index++) { + if (this.transformNodes[index].id === id) { + return this.transformNodes[index]; + } } - return new _Curve3(bez); + return null; } /** - * Returns a Curve3 object along a Hermite Spline curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#hermite-spline - * @param p1 (Vector3) the origin point of the Hermite Spline - * @param t1 (Vector3) the tangent vector at the origin point - * @param p2 (Vector3) the end point of the Hermite Spline - * @param t2 (Vector3) the tangent vector at the end point - * @param nSeg (integer) the number of curve segments or nSeg + 1 points in the array - * @returns the created Curve3 + * Gets a transform node with its auto-generated unique Id + * @param uniqueId defines the unique Id to search for + * @returns the found transform node or null if not found at all. */ - static CreateHermiteSpline(p1, t1, p2, t2, nSeg) { - const hermite = []; - const step = 1 / nSeg; - for (let i = 0; i <= nSeg; i++) { - hermite.push(Vector3.Hermite(p1, t1, p2, t2, i * step)); + getTransformNodeByUniqueId(uniqueId) { + for (let index = 0; index < this.transformNodes.length; index++) { + if (this.transformNodes[index].uniqueId === uniqueId) { + return this.transformNodes[index]; + } } - return new _Curve3(hermite); + return null; } /** - * Returns a Curve3 object along a CatmullRom Spline curve : - * @param points (array of Vector3) the points the spline must pass through. At least, four points required - * @param nbPoints (integer) the wanted number of points between each curve control points - * @param closed (boolean) optional with default false, when true forms a closed loop from the points - * @returns the created Curve3 + * Gets a list of transform nodes using their Id + * @param id defines the Id to search for + * @returns a list of transform nodes */ - static CreateCatmullRomSpline(points, nbPoints, closed) { - const catmullRom = []; - const step = 1 / nbPoints; - let amount = 0; - if (closed) { - const pointsCount = points.length; - for (let i = 0; i < pointsCount; i++) { - amount = 0; - for (let c = 0; c < nbPoints; c++) { - catmullRom.push(Vector3.CatmullRom(points[i % pointsCount], points[(i + 1) % pointsCount], points[(i + 2) % pointsCount], points[(i + 3) % pointsCount], amount)); - amount += step; - } - } - catmullRom.push(catmullRom[0]); - } else { - const totalPoints = []; - totalPoints.push(points[0].clone()); - Array.prototype.push.apply(totalPoints, points); - totalPoints.push(points[points.length - 1].clone()); - let i = 0; - for (; i < totalPoints.length - 3; i++) { - amount = 0; - for (let c = 0; c < nbPoints; c++) { - catmullRom.push(Vector3.CatmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount)); - amount += step; - } + getTransformNodesById(id) { + return this.transformNodes.filter(function(m) { + return m.id === id; + }); + } + /** + * Gets a mesh with its auto-generated unique Id + * @param uniqueId defines the unique Id to search for + * @returns the found mesh or null if not found at all. + */ + getMeshByUniqueId(uniqueId) { + for (let index = 0; index < this.meshes.length; index++) { + if (this.meshes[index].uniqueId === uniqueId) { + return this.meshes[index]; } - i--; - catmullRom.push(Vector3.CatmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount)); } - return new _Curve3(catmullRom); + return null; } /** - * Returns a Curve3 object along an arc through three vector3 points: - * The three points should not be colinear. When they are the Curve3 is empty. - * @param first (Vector3) the first point the arc must pass through. - * @param second (Vector3) the second point the arc must pass through. - * @param third (Vector3) the third point the arc must pass through. - * @param steps (number) the larger the number of steps the more detailed the arc. - * @param closed (boolean) optional with default false, when true forms the chord from the first and third point - * @param fullCircle Circle (boolean) optional with default false, when true forms the complete circle through the three points - * @returns the created Curve3 + * Gets a the last added mesh using a given Id + * @param id defines the Id to search for + * @returns the found mesh or null if not found at all. */ - static ArcThru3Points(first, second, third, steps = 32, closed = false, fullCircle = false) { - const arc = []; - const vec1 = second.subtract(first); - const vec2 = third.subtract(second); - const vec3 = first.subtract(third); - const zAxis = Vector3.Cross(vec1, vec2); - const len4 = zAxis.length(); - if (len4 < Math.pow(10, -8)) { - return new _Curve3(arc); - } - const len1_sq = vec1.lengthSquared(); - const len2_sq = vec2.lengthSquared(); - const len3_sq = vec3.lengthSquared(); - const len4_sq = zAxis.lengthSquared(); - const len1 = vec1.length(); - const len2 = vec2.length(); - const len3 = vec3.length(); - const radius = 0.5 * len1 * len2 * len3 / len4; - const dot1 = Vector3.Dot(vec1, vec3); - const dot2 = Vector3.Dot(vec1, vec2); - const dot3 = Vector3.Dot(vec2, vec3); - const a = -0.5 * len2_sq * dot1 / len4_sq; - const b = -0.5 * len3_sq * dot2 / len4_sq; - const c = -0.5 * len1_sq * dot3 / len4_sq; - const center = first.scale(a).add(second.scale(b)).add(third.scale(c)); - const radiusVec = first.subtract(center); - const xAxis = radiusVec.normalize(); - const yAxis = Vector3.Cross(zAxis, xAxis).normalize(); - if (fullCircle) { - const dStep = 2 * Math.PI / steps; - for (let theta = 0; theta <= 2 * Math.PI; theta += dStep) { - arc.push(center.add(xAxis.scale(radius * Math.cos(theta)).add(yAxis.scale(radius * Math.sin(theta))))); - } - arc.push(first); - } else { - const dStep = 1 / steps; - let theta = 0; - let point = Vector3.Zero(); - do { - point = center.add(xAxis.scale(radius * Math.cos(theta)).add(yAxis.scale(radius * Math.sin(theta)))); - arc.push(point); - theta += dStep; - } while (!point.equalsWithEpsilon(third, radius * dStep * 1.1)); - arc.push(third); - if (closed) { - arc.push(first); + getLastMeshById(id) { + for (let index = this.meshes.length - 1; index >= 0; index--) { + if (this.meshes[index].id === id) { + return this.meshes[index]; } } - return new _Curve3(arc); + return null; } /** - * A Curve3 object is a logical object, so not a mesh, to handle curves in the 3D geometric space. - * A Curve3 is designed from a series of successive Vector3. - * Tuto : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#curve3-object - * @param points points which make up the curve + * Gets a the last transform node using a given Id + * @param id defines the Id to search for + * @returns the found mesh or null if not found at all. */ - constructor(points) { - this._length = 0; - this._points = points; - this._length = this._computeLength(points); + getLastTransformNodeById(id) { + for (let index = this.transformNodes.length - 1; index >= 0; index--) { + if (this.transformNodes[index].id === id) { + return this.transformNodes[index]; + } + } + return null; } /** - * @returns the Curve3 stored array of successive Vector3 + * Gets a the last added node (Mesh, Camera, Light) using a given Id + * @param id defines the Id to search for + * @returns the found node or null if not found at all */ - getPoints() { - return this._points; + getLastEntryById(id) { + let index; + for (index = this.meshes.length - 1; index >= 0; index--) { + if (this.meshes[index].id === id) { + return this.meshes[index]; + } + } + for (index = this.transformNodes.length - 1; index >= 0; index--) { + if (this.transformNodes[index].id === id) { + return this.transformNodes[index]; + } + } + for (index = this.cameras.length - 1; index >= 0; index--) { + if (this.cameras[index].id === id) { + return this.cameras[index]; + } + } + for (index = this.lights.length - 1; index >= 0; index--) { + if (this.lights[index].id === id) { + return this.lights[index]; + } + } + return null; } /** - * @returns the computed length (float) of the curve. + * Gets a node (Mesh, Camera, Light) using a given Id + * @param id defines the Id to search for + * @returns the found node or null if not found at all */ - length() { - return this._length; + getNodeById(id) { + const mesh = this.getMeshById(id); + if (mesh) { + return mesh; + } + const transformNode = this.getTransformNodeById(id); + if (transformNode) { + return transformNode; + } + const light = this.getLightById(id); + if (light) { + return light; + } + const camera = this.getCameraById(id); + if (camera) { + return camera; + } + const bone = this.getBoneById(id); + if (bone) { + return bone; + } + return null; } /** - * Returns a new instance of Curve3 object : var curve = curveA.continue(curveB); - * This new Curve3 is built by translating and sticking the curveB at the end of the curveA. - * curveA and curveB keep unchanged. - * @param curve the curve to continue from this curve - * @returns the newly constructed curve + * Gets a node (Mesh, Camera, Light) using a given name + * @param name defines the name to search for + * @returns the found node or null if not found at all. */ - continue(curve) { - const lastPoint = this._points[this._points.length - 1]; - const continuedPoints = this._points.slice(); - const curvePoints = curve.getPoints(); - for (let i = 1; i < curvePoints.length; i++) { - continuedPoints.push(curvePoints[i].subtract(curvePoints[0]).add(lastPoint)); + getNodeByName(name69) { + const mesh = this.getMeshByName(name69); + if (mesh) { + return mesh; } - const continuedCurve = new _Curve3(continuedPoints); - return continuedCurve; - } - _computeLength(path) { - let l = 0; - for (let i = 1; i < path.length; i++) { - l += path[i].subtract(path[i - 1]).length(); + const transformNode = this.getTransformNodeByName(name69); + if (transformNode) { + return transformNode; } - return l; + const light = this.getLightByName(name69); + if (light) { + return light; + } + const camera = this.getCameraByName(name69); + if (camera) { + return camera; + } + const bone = this.getBoneByName(name69); + if (bone) { + return bone; + } + return null; } -}; - -// node_modules/@babylonjs/core/Animations/animationGroup.js -var TargetedAnimation = class { /** - * Returns the string "TargetedAnimation" - * @returns "TargetedAnimation" + * Gets a mesh using a given name + * @param name defines the name to search for + * @returns the found mesh or null if not found at all. */ - getClassName() { - return "TargetedAnimation"; + getMeshByName(name69) { + for (let index = 0; index < this.meshes.length; index++) { + if (this.meshes[index].name === name69) { + return this.meshes[index]; + } + } + return null; } /** - * Serialize the object - * @returns the JSON object representing the current entity + * Gets a transform node using a given name + * @param name defines the name to search for + * @returns the found transform node or null if not found at all. */ - serialize() { - const serializationObject = {}; - serializationObject.animation = this.animation.serialize(); - serializationObject.targetId = this.target.id; - return serializationObject; + getTransformNodeByName(name69) { + for (let index = 0; index < this.transformNodes.length; index++) { + if (this.transformNodes[index].name === name69) { + return this.transformNodes[index]; + } + } + return null; } -}; -var AnimationGroup = class _AnimationGroup { /** - * Gets or sets the mask associated with this animation group. This mask is used to filter which objects should be animated. + * Gets a skeleton using a given Id (if many are found, this function will pick the last one) + * @param id defines the Id to search for + * @returns the found skeleton or null if not found at all. */ - get mask() { - return this._mask; - } - set mask(value) { - if (this._mask === value) { - return; + getLastSkeletonById(id) { + for (let index = this.skeletons.length - 1; index >= 0; index--) { + if (this.skeletons[index].id === id) { + return this.skeletons[index]; + } } - this._mask = value; - this.syncWithMask(true); + return null; } /** - * Makes sure that the animations are either played or stopped according to the animation group mask. - * Note however that the call won't have any effect if the animation group has not been started yet. - * @param forceUpdate If true, forces to loop over the animatables even if no mask is defined (used internally, you shouldn't need to use it). Default: false. + * Gets a skeleton using a given auto generated unique id + * @param uniqueId defines the unique id to search for + * @returns the found skeleton or null if not found at all. */ - syncWithMask(forceUpdate = false) { - if (!this.mask && !forceUpdate) { - this._numActiveAnimatables = this._targetedAnimations.length; - return; - } - this._numActiveAnimatables = 0; - for (let i = 0; i < this._animatables.length; ++i) { - const animatable = this._animatables[i]; - if (!this.mask || this.mask.disabled || this.mask.retainsTarget(animatable.target.name)) { - this._numActiveAnimatables++; - if (animatable.paused) { - animatable.restart(); - } - } else { - if (!animatable.paused) { - animatable.pause(); - } + getSkeletonByUniqueId(uniqueId) { + for (let index = 0; index < this.skeletons.length; index++) { + if (this.skeletons[index].uniqueId === uniqueId) { + return this.skeletons[index]; } } + return null; } /** - * Removes all animations for the targets not retained by the animation group mask. - * Use this function if you know you won't need those animations anymore and if you want to free memory. + * Gets a skeleton using a given id (if many are found, this function will pick the first one) + * @param id defines the id to search for + * @returns the found skeleton or null if not found at all. */ - removeUnmaskedAnimations() { - if (!this.mask || this.mask.disabled) { - return; - } - for (let i = 0; i < this._animatables.length; ++i) { - const animatable = this._animatables[i]; - if (!this.mask.retainsTarget(animatable.target.name)) { - animatable.stop(); - this._animatables.splice(i, 1); - --i; + getSkeletonById(id) { + for (let index = 0; index < this.skeletons.length; index++) { + if (this.skeletons[index].id === id) { + return this.skeletons[index]; } } - for (let index = 0; index < this._targetedAnimations.length; index++) { - const targetedAnimation = this._targetedAnimations[index]; - if (!this.mask.retainsTarget(targetedAnimation.target.name)) { - this._targetedAnimations.splice(index, 1); - --index; + return null; + } + /** + * Gets a skeleton using a given name + * @param name defines the name to search for + * @returns the found skeleton or null if not found at all. + */ + getSkeletonByName(name69) { + for (let index = 0; index < this.skeletons.length; index++) { + if (this.skeletons[index].name === name69) { + return this.skeletons[index]; } } + return null; } /** - * Gets or sets the first frame + * Gets a morph target manager using a given id (if many are found, this function will pick the last one) + * @param id defines the id to search for + * @returns the found morph target manager or null if not found at all. */ - get from() { - return this._from; - } - set from(value) { - if (this._from === value) { - return; - } - this._from = value; - for (let index = 0; index < this._animatables.length; index++) { - const animatable = this._animatables[index]; - animatable.fromFrame = this._from; + getMorphTargetManagerById(id) { + for (let index = 0; index < this.morphTargetManagers.length; index++) { + if (this.morphTargetManagers[index].uniqueId === id) { + return this.morphTargetManagers[index]; + } } + return null; } /** - * Gets or sets the last frame + * Gets a morph target using a given id (if many are found, this function will pick the first one) + * @param id defines the id to search for + * @returns the found morph target or null if not found at all. */ - get to() { - return this._to; - } - set to(value) { - if (this._to === value) { - return; - } - this._to = value; - for (let index = 0; index < this._animatables.length; index++) { - const animatable = this._animatables[index]; - animatable.toFrame = this._to; + getMorphTargetById(id) { + for (let managerIndex = 0; managerIndex < this.morphTargetManagers.length; ++managerIndex) { + const morphTargetManager = this.morphTargetManagers[managerIndex]; + for (let index = 0; index < morphTargetManager.numTargets; ++index) { + const target = morphTargetManager.getTarget(index); + if (target.id === id) { + return target; + } + } } + return null; } /** - * Define if the animations are started + * Gets a morph target using a given name (if many are found, this function will pick the first one) + * @param name defines the name to search for + * @returns the found morph target or null if not found at all. */ - get isStarted() { - return this._isStarted; + getMorphTargetByName(name69) { + for (let managerIndex = 0; managerIndex < this.morphTargetManagers.length; ++managerIndex) { + const morphTargetManager = this.morphTargetManagers[managerIndex]; + for (let index = 0; index < morphTargetManager.numTargets; ++index) { + const target = morphTargetManager.getTarget(index); + if (target.name === name69) { + return target; + } + } + } + return null; } /** - * Gets a value indicating that the current group is playing + * Gets a post process using a given name (if many are found, this function will pick the first one) + * @param name defines the name to search for + * @returns the found post process or null if not found at all. */ - get isPlaying() { - return this._isStarted && !this._isPaused; + getPostProcessByName(name69) { + for (let postProcessIndex = 0; postProcessIndex < this.postProcesses.length; ++postProcessIndex) { + const postProcess = this.postProcesses[postProcessIndex]; + if (postProcess.name === name69) { + return postProcess; + } + } + return null; } /** - * Gets or sets the speed ratio to use for all animations + * Gets a boolean indicating if the given mesh is active + * @param mesh defines the mesh to look for + * @returns true if the mesh is in the active list */ - get speedRatio() { - return this._speedRatio; + isActiveMesh(mesh) { + return this._activeMeshes.indexOf(mesh) !== -1; } /** - * Gets or sets the speed ratio to use for all animations + * Return a unique id as a string which can serve as an identifier for the scene */ - set speedRatio(value) { - if (this._speedRatio === value) { - return; - } - this._speedRatio = value; - for (let index = 0; index < this._animatables.length; index++) { - const animatable = this._animatables[index]; - animatable.speedRatio = this._speedRatio; + get uid() { + if (!this._uid) { + this._uid = Tools.RandomId(); } + return this._uid; } /** - * Gets or sets if all animations should loop or not + * Add an externally attached data from its key. + * This method call will fail and return false, if such key already exists. + * If you don't care and just want to get the data no matter what, use the more convenient getOrAddExternalDataWithFactory() method. + * @param key the unique key that identifies the data + * @param data the data object to associate to the key for this Engine instance + * @returns true if no such key were already present and the data was added successfully, false otherwise */ - get loopAnimation() { - return this._loopAnimation; - } - set loopAnimation(value) { - if (this._loopAnimation === value) { - return; - } - this._loopAnimation = value; - for (let index = 0; index < this._animatables.length; index++) { - const animatable = this._animatables[index]; - animatable.loopAnimation = this._loopAnimation; + addExternalData(key, data) { + if (!this._externalData) { + this._externalData = new StringDictionary(); } + return this._externalData.add(key, data); } /** - * Gets or sets if all animations should be evaluated additively + * Get an externally attached data from its key + * @param key the unique key that identifies the data + * @returns the associated data, if present (can be null), or undefined if not present */ - get isAdditive() { - return this._isAdditive; - } - set isAdditive(value) { - if (this._isAdditive === value) { - return; - } - this._isAdditive = value; - for (let index = 0; index < this._animatables.length; index++) { - const animatable = this._animatables[index]; - animatable.isAdditive = this._isAdditive; + getExternalData(key) { + if (!this._externalData) { + return null; } + return this._externalData.get(key); } /** - * Gets or sets the weight to apply to all animations of the group + * Get an externally attached data from its key, create it using a factory if it's not already present + * @param key the unique key that identifies the data + * @param factory the factory that will be called to create the instance if and only if it doesn't exists + * @returns the associated data, can be null if the factory returned null. */ - get weight() { - return this._weight; - } - set weight(value) { - if (this._weight === value) { - return; + getOrAddExternalDataWithFactory(key, factory) { + if (!this._externalData) { + this._externalData = new StringDictionary(); } - this._weight = value; - this.setWeightForAllAnimatables(this._weight); + return this._externalData.getOrAddWithFactory(key, factory); } /** - * Gets the targeted animations for this animation group + * Remove an externally attached data from the Engine instance + * @param key the unique key that identifies the data + * @returns true if the data was successfully removed, false if it doesn't exist */ - get targetedAnimations() { - return this._targetedAnimations; + removeExternalData(key) { + return this._externalData.remove(key); } - /** - * returning the list of animatables controlled by this animation group. - */ - get animatables() { - return this._animatables; + _evaluateSubMesh(subMesh, mesh, initialMesh, forcePush) { + if (forcePush || subMesh.isInFrustum(this._frustumPlanes)) { + for (const step of this._evaluateSubMeshStage) { + step.action(mesh, subMesh); + } + const material = subMesh.getMaterial(); + if (material !== null && material !== void 0) { + if (material.hasRenderTargetTextures && material.getRenderTargetTextures != null) { + if (this._processedMaterials.indexOf(material) === -1) { + this._processedMaterials.push(material); + this._materialsRenderTargets.concatWithNoDuplicate(material.getRenderTargetTextures()); + } + } + this._renderingManager.dispatch(subMesh, mesh, material); + } + } } /** - * Gets the list of target animations + * Clear the processed materials smart array preventing retention point in material dispose. */ - get children() { - return this._targetedAnimations; + freeProcessedMaterials() { + this._processedMaterials.dispose(); } - /** - * Gets or sets the order of play of the animation group (default: 0) + /** Gets or sets a boolean blocking all the calls to freeActiveMeshes and freeRenderingGroups + * It can be used in order to prevent going through methods freeRenderingGroups and freeActiveMeshes several times to improve performance + * when disposing several meshes in a row or a hierarchy of meshes. + * When used, it is the responsibility of the user to blockfreeActiveMeshesAndRenderingGroups back to false. */ - get playOrder() { - return this._playOrder; + get blockfreeActiveMeshesAndRenderingGroups() { + return this._preventFreeActiveMeshesAndRenderingGroups; } - set playOrder(value) { - if (this._playOrder === value) { + set blockfreeActiveMeshesAndRenderingGroups(value) { + if (this._preventFreeActiveMeshesAndRenderingGroups === value) { return; } - this._playOrder = value; - if (this._animatables.length > 0) { - for (let i = 0; i < this._animatables.length; i++) { - this._animatables[i].playOrder = this._playOrder; - } - this._scene.sortActiveAnimatables(); + if (value) { + this.freeActiveMeshes(); + this.freeRenderingGroups(); } + this._preventFreeActiveMeshesAndRenderingGroups = value; } /** - * Allows the animations of the animation group to blend with current running animations - * Note that a null value means that each animation will use their own existing blending configuration (Animation.enableBlending) + * Clear the active meshes smart array preventing retention point in mesh dispose. */ - get enableBlending() { - return this._enableBlending; - } - set enableBlending(value) { - if (this._enableBlending === value) { + freeActiveMeshes() { + if (this.blockfreeActiveMeshesAndRenderingGroups) { return; } - this._enableBlending = value; - if (value !== null) { - for (let i = 0; i < this._targetedAnimations.length; ++i) { - this._targetedAnimations[i].animation.enableBlending = value; + this._activeMeshes.dispose(); + if (this.activeCamera && this.activeCamera._activeMeshes) { + this.activeCamera._activeMeshes.dispose(); + } + if (this.activeCameras) { + for (let i = 0; i < this.activeCameras.length; i++) { + const activeCamera = this.activeCameras[i]; + if (activeCamera && activeCamera._activeMeshes) { + activeCamera._activeMeshes.dispose(); + } } } } /** - * Gets or sets the animation blending speed - * Note that a null value means that each animation will use their own existing blending configuration (Animation.blendingSpeed) + * Clear the info related to rendering groups preventing retention points during dispose. */ - get blendingSpeed() { - return this._blendingSpeed; - } - set blendingSpeed(value) { - if (this._blendingSpeed === value) { + freeRenderingGroups() { + if (this.blockfreeActiveMeshesAndRenderingGroups) { return; } - this._blendingSpeed = value; - if (value !== null) { - for (let i = 0; i < this._targetedAnimations.length; ++i) { - this._targetedAnimations[i].animation.blendingSpeed = value; + if (this._renderingManager) { + this._renderingManager.freeRenderingGroups(); + } + if (this.textures) { + for (let i = 0; i < this.textures.length; i++) { + const texture = this.textures[i]; + if (texture && texture.renderList) { + texture.freeRenderingGroups(); + } } } } - /** - * Gets the length (in seconds) of the animation group - * This function assumes that all animations are played at the same framePerSecond speed! - * Note: you can only call this method after you've added at least one targeted animation! - * @param from Starting frame range (default is AnimationGroup.from) - * @param to Ending frame range (default is AnimationGroup.to) - * @returns The length in seconds - */ - getLength(from, to) { - from = from ?? this._from; - to = to ?? this._to; - const fps = this.targetedAnimations[0].animation.framePerSecond * this._speedRatio; - return (to - from) / fps; + /** @internal */ + _isInIntermediateRendering() { + return this._intermediateRendering; } /** - * Merge the array of animation groups into a new animation group - * @param animationGroups List of animation groups to merge - * @param disposeSource If true, animation groups will be disposed after being merged (default: true) - * @param normalize If true, animation groups will be normalized before being merged, so that all animations have the same "from" and "to" frame (default: false) - * @param weight Weight for the new animation group. If not provided, it will inherit the weight from the first animation group of the array - * @returns The new animation group or null if no animation groups were passed + * Use this function to stop evaluating active meshes. The current list will be keep alive between frames + * @param skipEvaluateActiveMeshes defines an optional boolean indicating that the evaluate active meshes step must be completely skipped + * @param onSuccess optional success callback + * @param onError optional error callback + * @param freezeMeshes defines if meshes should be frozen (true by default) + * @param keepFrustumCulling defines if you want to keep running the frustum clipping (false by default) + * @returns the current scene */ - static MergeAnimationGroups(animationGroups, disposeSource = true, normalize = false, weight) { - if (animationGroups.length === 0) { - return null; - } - weight = weight ?? animationGroups[0].weight; - let beginFrame = Number.MAX_VALUE; - let endFrame = -Number.MAX_VALUE; - if (normalize) { - for (const animationGroup of animationGroups) { - if (animationGroup.from < beginFrame) { - beginFrame = animationGroup.from; - } - if (animationGroup.to > endFrame) { - endFrame = animationGroup.to; - } - } - } - const mergedAnimationGroup = new _AnimationGroup(animationGroups[0].name + "_merged", animationGroups[0]._scene, weight); - for (const animationGroup of animationGroups) { - if (normalize) { - animationGroup.normalize(beginFrame, endFrame); + freezeActiveMeshes(skipEvaluateActiveMeshes = false, onSuccess, onError, freezeMeshes = true, keepFrustumCulling = false) { + this.executeWhenReady(() => { + if (!this.activeCamera) { + onError && onError("No active camera found"); + return; } - for (const targetedAnimation of animationGroup.targetedAnimations) { - mergedAnimationGroup.addTargetedAnimation(targetedAnimation.animation, targetedAnimation.target); + if (!this._frustumPlanes) { + this.updateTransformMatrix(); } - if (disposeSource) { - animationGroup.dispose(); + this._evaluateActiveMeshes(); + this._activeMeshesFrozen = true; + this._activeMeshesFrozenButKeepClipping = keepFrustumCulling; + this._skipEvaluateActiveMeshesCompletely = skipEvaluateActiveMeshes; + if (freezeMeshes) { + for (let index = 0; index < this._activeMeshes.length; index++) { + this._activeMeshes.data[index]._freeze(); + } } - } - return mergedAnimationGroup; - } - /** - * Instantiates a new Animation Group. - * This helps managing several animations at once. - * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/groupAnimations - * @param name Defines the name of the group - * @param scene Defines the scene the group belongs to - * @param weight Defines the weight to use for animations in the group (-1.0 by default, meaning "no weight") - * @param playOrder Defines the order of play of the animation group (default is 0) - */ - constructor(name69, scene = null, weight = -1, playOrder = 0) { - this.name = name69; - this._targetedAnimations = new Array(); - this._animatables = new Array(); - this._from = Number.MAX_VALUE; - this._to = -Number.MAX_VALUE; - this._speedRatio = 1; - this._loopAnimation = false; - this._isAdditive = false; - this._weight = -1; - this._playOrder = 0; - this._enableBlending = null; - this._blendingSpeed = null; - this._numActiveAnimatables = 0; - this._parentContainer = null; - this.onAnimationEndObservable = new Observable(); - this.onAnimationLoopObservable = new Observable(); - this.onAnimationGroupLoopObservable = new Observable(); - this.onAnimationGroupEndObservable = new Observable(); - this.onAnimationGroupPauseObservable = new Observable(); - this.onAnimationGroupPlayObservable = new Observable(); - this.metadata = null; - this._mask = null; - this._animationLoopFlags = []; - this._scene = scene || EngineStore.LastCreatedScene; - this._weight = weight; - this._playOrder = playOrder; - this.uniqueId = this._scene.getUniqueId(); - this._scene.addAnimationGroup(this); + onSuccess && onSuccess(); + }); + return this; } /** - * Add an animation (with its target) in the group - * @param animation defines the animation we want to add - * @param target defines the target of the animation - * @returns the TargetedAnimation object + * Use this function to restart evaluating active meshes on every frame + * @returns the current scene */ - addTargetedAnimation(animation, target) { - const targetedAnimation = new TargetedAnimation(); - targetedAnimation.animation = animation; - targetedAnimation.target = target; - const keys = animation.getKeys(); - if (this._from > keys[0].frame) { - this._from = keys[0].frame; - } - if (this._to < keys[keys.length - 1].frame) { - this._to = keys[keys.length - 1].frame; + unfreezeActiveMeshes() { + for (let index = 0; index < this.meshes.length; index++) { + const mesh = this.meshes[index]; + if (mesh._internalAbstractMeshDataInfo) { + mesh._internalAbstractMeshDataInfo._isActive = false; + } } - if (this._enableBlending !== null) { - animation.enableBlending = this._enableBlending; + for (let index = 0; index < this._activeMeshes.length; index++) { + this._activeMeshes.data[index]._unFreeze(); } - if (this._blendingSpeed !== null) { - animation.blendingSpeed = this._blendingSpeed; + this._activeMeshesFrozen = false; + return this; + } + _executeActiveContainerCleanup(container) { + const isInFastMode = this._engine.snapshotRendering && this._engine.snapshotRenderingMode === 1; + if (!isInFastMode && this._activeMeshesFrozen && this._activeMeshes.length) { + return; } - this._targetedAnimations.push(targetedAnimation); - return targetedAnimation; + this.onBeforeRenderObservable.addOnce(() => container.dispose()); } - /** - * Remove an animation from the group - * @param animation defines the animation we want to remove - */ - removeTargetedAnimation(animation) { - for (let index = this._targetedAnimations.length - 1; index > -1; index--) { - const targetedAnimation = this._targetedAnimations[index]; - if (targetedAnimation.animation === animation) { - this._targetedAnimations.splice(index, 1); + _evaluateActiveMeshes() { + var _a; + if (this._engine.snapshotRendering && this._engine.snapshotRenderingMode === 1) { + if (this._activeMeshes.length > 0) { + (_a = this.activeCamera) == null ? void 0 : _a._activeMeshes.reset(); + this._activeMeshes.reset(); + this._renderingManager.reset(); + this._processedMaterials.reset(); + this._activeParticleSystems.reset(); + this._activeSkeletons.reset(); + this._softwareSkinnedMeshes.reset(); } + return; } - } - /** - * This function will normalize every animation in the group to make sure they all go from beginFrame to endFrame - * It can add constant keys at begin or end - * @param beginFrame defines the new begin frame for all animations or the smallest begin frame of all animations if null (defaults to null) - * @param endFrame defines the new end frame for all animations or the largest end frame of all animations if null (defaults to null) - * @returns the animation group - */ - normalize(beginFrame = null, endFrame = null) { - if (beginFrame == null) { - beginFrame = this._from; + if (this._activeMeshesFrozen && this._activeMeshes.length) { + if (!this._skipEvaluateActiveMeshesCompletely) { + const len2 = this._activeMeshes.length; + for (let i = 0; i < len2; i++) { + const mesh = this._activeMeshes.data[i]; + mesh.computeWorldMatrix(); + } + } + if (this._activeParticleSystems) { + const psLength = this._activeParticleSystems.length; + for (let i = 0; i < psLength; i++) { + this._activeParticleSystems.data[i].animate(); + } + } + this._renderingManager.resetSprites(); + return; } - if (endFrame == null) { - endFrame = this._to; + if (!this.activeCamera) { + return; } - for (let index = 0; index < this._targetedAnimations.length; index++) { - const targetedAnimation = this._targetedAnimations[index]; - const keys = targetedAnimation.animation.getKeys(); - const startKey = keys[0]; - const endKey = keys[keys.length - 1]; - if (startKey.frame > beginFrame) { - const newKey = { - frame: beginFrame, - value: startKey.value, - inTangent: startKey.inTangent, - outTangent: startKey.outTangent, - interpolation: startKey.interpolation - }; - keys.splice(0, 0, newKey); + this.onBeforeActiveMeshesEvaluationObservable.notifyObservers(this); + this.activeCamera._activeMeshes.reset(); + this._activeMeshes.reset(); + this._renderingManager.reset(); + this._processedMaterials.reset(); + this._activeParticleSystems.reset(); + this._activeSkeletons.reset(); + this._softwareSkinnedMeshes.reset(); + this._materialsRenderTargets.reset(); + for (const step of this._beforeEvaluateActiveMeshStage) { + step.action(); + } + const meshes = this.getActiveMeshCandidates(); + const len = meshes.length; + for (let i = 0; i < len; i++) { + const mesh = meshes.data[i]; + mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate = false; + if (mesh.isBlocked) { + continue; } - if (endKey.frame < endFrame) { - const newKey = { - frame: endFrame, - value: endKey.value, - inTangent: endKey.inTangent, - outTangent: endKey.outTangent, - interpolation: endKey.interpolation - }; - keys.push(newKey); + this._totalVertices.addCount(mesh.getTotalVertices(), false); + if (!mesh.isReady() || !mesh.isEnabled() || mesh.scaling.hasAZeroComponent) { + continue; + } + mesh.computeWorldMatrix(); + if (mesh.actionManager && mesh.actionManager.hasSpecificTriggers2(12, 13)) { + this._meshesForIntersections.pushNoDuplicate(mesh); + } + let meshToRender = this.customLODSelector ? this.customLODSelector(mesh, this.activeCamera) : mesh.getLOD(this.activeCamera); + mesh._internalAbstractMeshDataInfo._currentLOD = meshToRender; + mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate = true; + if (meshToRender === void 0 || meshToRender === null) { + continue; + } + if (meshToRender !== mesh && meshToRender.billboardMode !== 0) { + meshToRender.computeWorldMatrix(); + } + mesh._preActivate(); + if (mesh.isVisible && mesh.visibility > 0 && (mesh.layerMask & this.activeCamera.layerMask) !== 0 && (this._skipFrustumClipping || mesh.alwaysSelectAsActiveMesh || mesh.isInFrustum(this._frustumPlanes))) { + this._activeMeshes.push(mesh); + this.activeCamera._activeMeshes.push(mesh); + if (meshToRender !== mesh) { + meshToRender._activate(this._renderId, false); + } + for (const step of this._preActiveMeshStage) { + step.action(mesh); + } + if (mesh._activate(this._renderId, false)) { + if (!mesh.isAnInstance) { + meshToRender._internalAbstractMeshDataInfo._onlyForInstances = false; + } else { + if (mesh._internalAbstractMeshDataInfo._actAsRegularMesh) { + meshToRender = mesh; + } + } + meshToRender._internalAbstractMeshDataInfo._isActive = true; + this._activeMesh(mesh, meshToRender); + } + mesh._postActivate(); } } - this._from = beginFrame; - this._to = endFrame; - return this; + this.onAfterActiveMeshesEvaluationObservable.notifyObservers(this); + if (this.particlesEnabled) { + this.onBeforeParticlesRenderingObservable.notifyObservers(this); + for (let particleIndex = 0; particleIndex < this.particleSystems.length; particleIndex++) { + const particleSystem = this.particleSystems[particleIndex]; + if (!particleSystem.isStarted() || !particleSystem.emitter) { + continue; + } + const emitter = particleSystem.emitter; + if (!emitter.position || emitter.isEnabled()) { + this._activeParticleSystems.push(particleSystem); + particleSystem.animate(); + this._renderingManager.dispatchParticles(particleSystem); + } + } + this.onAfterParticlesRenderingObservable.notifyObservers(this); + } } - _processLoop(animatable, targetedAnimation, index) { - animatable.onAnimationLoop = () => { - this.onAnimationLoopObservable.notifyObservers(targetedAnimation); - if (this._animationLoopFlags[index]) { - return; + _activeMesh(sourceMesh, mesh) { + if (this._skeletonsEnabled && mesh.skeleton !== null && mesh.skeleton !== void 0) { + if (this._activeSkeletons.pushNoDuplicate(mesh.skeleton)) { + mesh.skeleton.prepare(); + this._activeBones.addCount(mesh.skeleton.bones.length, false); } - this._animationLoopFlags[index] = true; - this._animationLoopCount++; - if (this._animationLoopCount === this._numActiveAnimatables) { - this.onAnimationGroupLoopObservable.notifyObservers(this); - this._animationLoopCount = 0; - this._animationLoopFlags.length = 0; + if (!mesh.computeBonesUsingShaders) { + this._softwareSkinnedMeshes.pushNoDuplicate(mesh); } - }; + } + let forcePush = sourceMesh.hasInstances || sourceMesh.isAnInstance || this.dispatchAllSubMeshesOfActiveMeshes || this._skipFrustumClipping || mesh.alwaysSelectAsActiveMesh; + if (mesh && mesh.subMeshes && mesh.subMeshes.length > 0) { + const subMeshes = this.getActiveSubMeshCandidates(mesh); + const len = subMeshes.length; + forcePush = forcePush || len === 1; + for (let i = 0; i < len; i++) { + const subMesh = subMeshes.data[i]; + this._evaluateSubMesh(subMesh, mesh, sourceMesh, forcePush); + } + } } /** - * Start all animations on given targets - * @param loop defines if animations must loop - * @param speedRatio defines the ratio to apply to animation speed (1 by default) - * @param from defines the from key (optional) - * @param to defines the to key (optional) - * @param isAdditive defines the additive state for the resulting animatables (optional) - * @returns the current animation group + * Update the transform matrix to update from the current active camera + * @param force defines a boolean used to force the update even if cache is up to date */ - start(loop = false, speedRatio = 1, from, to, isAdditive) { - if (this._isStarted || this._targetedAnimations.length === 0) { - return this; + updateTransformMatrix(force) { + const activeCamera = this.activeCamera; + if (!activeCamera) { + return; } - this._loopAnimation = loop; - this._animationLoopCount = 0; - this._animationLoopFlags.length = 0; - for (let index = 0; index < this._targetedAnimations.length; index++) { - const targetedAnimation = this._targetedAnimations[index]; - const animatable = this._scene.beginDirectAnimation(targetedAnimation.target, [targetedAnimation.animation], from !== void 0 ? from : this._from, to !== void 0 ? to : this._to, loop, speedRatio, void 0, void 0, isAdditive !== void 0 ? isAdditive : this._isAdditive); - animatable.weight = this._weight; - animatable.playOrder = this._playOrder; - animatable.onAnimationEnd = () => { - this.onAnimationEndObservable.notifyObservers(targetedAnimation); - this._checkAnimationGroupEnded(animatable); - }; - this._processLoop(animatable, targetedAnimation, index); - this._animatables.push(animatable); + if (activeCamera._renderingMultiview) { + const leftCamera = activeCamera._rigCameras[0]; + const rightCamera = activeCamera._rigCameras[1]; + this.setTransformMatrix(leftCamera.getViewMatrix(), leftCamera.getProjectionMatrix(force), rightCamera.getViewMatrix(), rightCamera.getProjectionMatrix(force)); + } else { + this.setTransformMatrix(activeCamera.getViewMatrix(), activeCamera.getProjectionMatrix(force)); } - this.syncWithMask(); - this._scene.sortActiveAnimatables(); - this._speedRatio = speedRatio; - this._isStarted = true; - this._isPaused = false; - this.onAnimationGroupPlayObservable.notifyObservers(this); - return this; } - /** - * Pause all animations - * @returns the animation group - */ - pause() { - if (!this._isStarted) { - return this; + _bindFrameBuffer(camera, clear = true) { + if (camera && camera._multiviewTexture) { + camera._multiviewTexture._bindFrameBuffer(); + } else if (camera && camera.outputRenderTarget) { + camera.outputRenderTarget._bindFrameBuffer(); + } else { + if (!this._engine._currentFrameBufferIsDefaultFrameBuffer()) { + this._engine.restoreDefaultFramebuffer(); + } } - this._isPaused = true; - for (let index = 0; index < this._animatables.length; index++) { - const animatable = this._animatables[index]; - animatable.pause(); + if (clear) { + this._clearFrameBuffer(camera); } - this.onAnimationGroupPauseObservable.notifyObservers(this); - return this; } - /** - * Play all animations to initial state - * This function will start() the animations if they were not started or will restart() them if they were paused - * @param loop defines if animations must loop - * @returns the animation group - */ - play(loop) { - if (this.isStarted && this._animatables.length === this._targetedAnimations.length) { - if (loop !== void 0) { - this.loopAnimation = loop; + _clearFrameBuffer(camera) { + if (camera && camera._multiviewTexture) { + } else if (camera && camera.outputRenderTarget && !camera._renderingMultiview) { + const rtt = camera.outputRenderTarget; + if (rtt.onClearObservable.hasObservers()) { + rtt.onClearObservable.notifyObservers(this._engine); + } else if (!rtt.skipInitialClear && !camera.isRightCamera) { + if (this.autoClear) { + this._engine.clear(rtt.clearColor || this.clearColor, !rtt._cleared, true, true); + } + rtt._cleared = true; } - this.restart(); } else { - this.stop(); - this.start(loop, this._speedRatio); + if (!this._defaultFrameBufferCleared) { + this._defaultFrameBufferCleared = true; + this._clear(); + } else { + this._engine.clear(null, false, true, true); + } } - this._isPaused = false; - return this; } /** - * Reset all animations to initial state - * @returns the animation group + * @internal */ - reset() { - if (!this._isStarted) { - this.play(); - this.goToFrame(0); - this.stop(); - return this; + _renderForCamera(camera, rigParent, bindFrameBuffer = true) { + var _a; + if (camera && camera._skipRendering) { + return; } - for (let index = 0; index < this._animatables.length; index++) { - const animatable = this._animatables[index]; - animatable.reset(); + const engine = this._engine; + this._activeCamera = camera; + if (!this.activeCamera) { + throw new Error("Active camera not set"); } - return this; - } - /** - * Restart animations from key 0 - * @returns the animation group - */ - restart() { - if (!this._isStarted) { - return this; + engine.setViewport(this.activeCamera.viewport); + this.resetCachedMaterial(); + this._renderId++; + if (!this.prePass && bindFrameBuffer) { + let skipInitialClear = true; + if (camera._renderingMultiview && camera.outputRenderTarget) { + skipInitialClear = camera.outputRenderTarget.skipInitialClear; + if (this.autoClear) { + this._defaultFrameBufferCleared = false; + camera.outputRenderTarget.skipInitialClear = false; + } + } + this._bindFrameBuffer(this._activeCamera); + if (camera._renderingMultiview && camera.outputRenderTarget) { + camera.outputRenderTarget.skipInitialClear = skipInitialClear; + } } - for (let index = 0; index < this._animatables.length; index++) { - const animatable = this._animatables[index]; - animatable.restart(); + this.updateTransformMatrix(); + this.onBeforeCameraRenderObservable.notifyObservers(this.activeCamera); + this._evaluateActiveMeshes(); + for (let softwareSkinnedMeshIndex = 0; softwareSkinnedMeshIndex < this._softwareSkinnedMeshes.length; softwareSkinnedMeshIndex++) { + const mesh = this._softwareSkinnedMeshes.data[softwareSkinnedMeshIndex]; + mesh.applySkeleton(mesh.skeleton); } - this.syncWithMask(); - this.onAnimationGroupPlayObservable.notifyObservers(this); - return this; - } - /** - * Stop all animations - * @returns the animation group - */ - stop() { - if (!this._isStarted) { - return this; + this.onBeforeRenderTargetsRenderObservable.notifyObservers(this); + this._renderTargets.concatWithNoDuplicate(this._materialsRenderTargets); + if (camera.customRenderTargets && camera.customRenderTargets.length > 0) { + this._renderTargets.concatWithNoDuplicate(camera.customRenderTargets); } - const list = this._animatables.slice(); - for (let index = 0; index < list.length; index++) { - list[index].stop(void 0, void 0, true); + if (rigParent && rigParent.customRenderTargets && rigParent.customRenderTargets.length > 0) { + this._renderTargets.concatWithNoDuplicate(rigParent.customRenderTargets); } - let curIndex = 0; - for (let index = 0; index < this._scene._activeAnimatables.length; index++) { - const animatable = this._scene._activeAnimatables[index]; - if (animatable._runtimeAnimations.length > 0) { - this._scene._activeAnimatables[curIndex++] = animatable; + if (this.environmentTexture && this.environmentTexture.isRenderTarget) { + this._renderTargets.pushNoDuplicate(this.environmentTexture); + } + for (const step of this._gatherActiveCameraRenderTargetsStage) { + step.action(this._renderTargets); + } + let needRebind = false; + if (this.renderTargetsEnabled) { + this._intermediateRendering = true; + if (this._renderTargets.length > 0) { + Tools.StartPerformanceCounter("Render targets", this._renderTargets.length > 0); + for (let renderIndex = 0; renderIndex < this._renderTargets.length; renderIndex++) { + const renderTarget = this._renderTargets.data[renderIndex]; + if (renderTarget._shouldRender()) { + this._renderId++; + const hasSpecialRenderTargetCamera = renderTarget.activeCamera && renderTarget.activeCamera !== this.activeCamera; + renderTarget.render(hasSpecialRenderTargetCamera, this.dumpNextRenderTargets); + needRebind = true; + } + } + Tools.EndPerformanceCounter("Render targets", this._renderTargets.length > 0); + this._renderId++; + } + for (const step of this._cameraDrawRenderTargetStage) { + needRebind = step.action(this.activeCamera) || needRebind; } + this._intermediateRendering = false; } - this._scene._activeAnimatables.length = curIndex; - this._isStarted = false; - return this; - } - /** - * Set animation weight for all animatables - * - * @since 6.12.4 - * You can pass the weight to the AnimationGroup constructor, or use the weight property to set it after the group has been created, - * making it easier to define the overall animation weight than calling setWeightForAllAnimatables() after the animation group has been started - * @param weight defines the weight to use - * @returns the animationGroup - * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#animation-weights - */ - setWeightForAllAnimatables(weight) { - for (let index = 0; index < this._animatables.length; index++) { - const animatable = this._animatables[index]; - animatable.weight = weight; + this._engine.currentRenderPassId = ((_a = camera.outputRenderTarget) == null ? void 0 : _a.renderPassId) ?? camera.renderPassId ?? 0; + if (needRebind && !this.prePass) { + this._bindFrameBuffer(this._activeCamera, false); + this.updateTransformMatrix(); } - return this; - } - /** - * Synchronize and normalize all animatables with a source animatable - * @param root defines the root animatable to synchronize with (null to stop synchronizing) - * @returns the animationGroup - * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#animation-weights - */ - syncAllAnimationsWith(root) { - for (let index = 0; index < this._animatables.length; index++) { - const animatable = this._animatables[index]; - animatable.syncWith(root); + this.onAfterRenderTargetsRenderObservable.notifyObservers(this); + if (this.postProcessManager && !camera._multiviewTexture && !this.prePass) { + this.postProcessManager._prepareFrame(); } - return this; - } - /** - * Goes to a specific frame in this animation group - * @param frame the frame number to go to - * @returns the animationGroup - */ - goToFrame(frame) { - if (!this._isStarted) { - return this; + for (const step of this._beforeCameraDrawStage) { + step.action(this.activeCamera); } - for (let index = 0; index < this._animatables.length; index++) { - const animatable = this._animatables[index]; - animatable.goToFrame(frame); + this.onBeforeDrawPhaseObservable.notifyObservers(this); + if (engine.snapshotRendering && engine.snapshotRenderingMode === 1) { + this.finalizeSceneUbo(); } - return this; + this._renderingManager.render(null, null, true, true); + this.onAfterDrawPhaseObservable.notifyObservers(this); + for (const step of this._afterCameraDrawStage) { + step.action(this.activeCamera); + } + if (this.postProcessManager && !camera._multiviewTexture) { + const texture = camera.outputRenderTarget ? camera.outputRenderTarget.renderTarget : void 0; + this.postProcessManager._finalizeFrame(camera.isIntermediate, texture); + } + for (const step of this._afterCameraPostProcessStage) { + step.action(this.activeCamera); + } + this._renderTargets.reset(); + this.onAfterCameraRenderObservable.notifyObservers(this.activeCamera); } - /** - * Dispose all associated resources - */ - dispose() { - this._targetedAnimations.length = 0; - this._animatables.length = 0; - const index = this._scene.animationGroups.indexOf(this); - if (index > -1) { - this._scene.animationGroups.splice(index, 1); + _processSubCameras(camera, bindFrameBuffer = true) { + if (camera.cameraRigMode === 0 || camera._renderingMultiview) { + if (camera._renderingMultiview && !this._multiviewSceneUbo) { + this._createMultiviewUbo(); + } + this._renderForCamera(camera, void 0, bindFrameBuffer); + this.onAfterRenderCameraObservable.notifyObservers(camera); + return; } - if (this._parentContainer) { - const index2 = this._parentContainer.animationGroups.indexOf(this); - if (index2 > -1) { - this._parentContainer.animationGroups.splice(index2, 1); + if (camera._useMultiviewToSingleView) { + this._renderMultiviewToSingleView(camera); + } else { + this.onBeforeCameraRenderObservable.notifyObservers(camera); + for (let index = 0; index < camera._rigCameras.length; index++) { + this._renderForCamera(camera._rigCameras[index], camera); } - this._parentContainer = null; } - this.onAnimationEndObservable.clear(); - this.onAnimationGroupEndObservable.clear(); - this.onAnimationGroupPauseObservable.clear(); - this.onAnimationGroupPlayObservable.clear(); - this.onAnimationLoopObservable.clear(); - this.onAnimationGroupLoopObservable.clear(); + this._activeCamera = camera; + this.updateTransformMatrix(); + this.onAfterRenderCameraObservable.notifyObservers(camera); } - _checkAnimationGroupEnded(animatable) { - const idx = this._animatables.indexOf(animatable); - if (idx > -1) { - this._animatables.splice(idx, 1); - } - if (this._animatables.length === 0) { - this._isStarted = false; - this.onAnimationGroupEndObservable.notifyObservers(this); + _checkIntersections() { + for (let index = 0; index < this._meshesForIntersections.length; index++) { + const sourceMesh = this._meshesForIntersections.data[index]; + if (!sourceMesh.actionManager) { + continue; + } + for (let actionIndex = 0; sourceMesh.actionManager && actionIndex < sourceMesh.actionManager.actions.length; actionIndex++) { + const action = sourceMesh.actionManager.actions[actionIndex]; + if (action.trigger === 12 || action.trigger === 13) { + const parameters = action.getTriggerParameter(); + const otherMesh = parameters.mesh ? parameters.mesh : parameters; + const areIntersecting = otherMesh.intersectsMesh(sourceMesh, parameters.usePreciseIntersection); + const currentIntersectionInProgress = sourceMesh._intersectionsInProgress.indexOf(otherMesh); + if (areIntersecting && currentIntersectionInProgress === -1) { + if (action.trigger === 12) { + action._executeCurrent(ActionEvent.CreateNew(sourceMesh, void 0, otherMesh)); + sourceMesh._intersectionsInProgress.push(otherMesh); + } else if (action.trigger === 13) { + sourceMesh._intersectionsInProgress.push(otherMesh); + } + } else if (!areIntersecting && currentIntersectionInProgress > -1) { + if (action.trigger === 13) { + action._executeCurrent(ActionEvent.CreateNew(sourceMesh, void 0, otherMesh)); + } + if (!sourceMesh.actionManager.hasSpecificTrigger(13, (parameter) => { + const parameterMesh = parameter.mesh ? parameter.mesh : parameter; + return otherMesh === parameterMesh; + }) || action.trigger === 13) { + sourceMesh._intersectionsInProgress.splice(currentIntersectionInProgress, 1); + } + } + } + } } } /** - * Clone the current animation group and returns a copy - * @param newName defines the name of the new group - * @param targetConverter defines an optional function used to convert current animation targets to new ones - * @param cloneAnimations defines if the animations should be cloned or referenced - * @returns the new animation group + * @internal */ - clone(newName, targetConverter, cloneAnimations = false) { - const newGroup = new _AnimationGroup(newName || this.name, this._scene, this._weight, this._playOrder); - newGroup._from = this.from; - newGroup._to = this.to; - newGroup._speedRatio = this.speedRatio; - newGroup._loopAnimation = this.loopAnimation; - newGroup._isAdditive = this.isAdditive; - newGroup._enableBlending = this.enableBlending; - newGroup._blendingSpeed = this.blendingSpeed; - newGroup.metadata = this.metadata; - newGroup.mask = this.mask; - for (const targetAnimation of this._targetedAnimations) { - newGroup.addTargetedAnimation(cloneAnimations ? targetAnimation.animation.clone() : targetAnimation.animation, targetConverter ? targetConverter(targetAnimation.target) : targetAnimation.target); + _advancePhysicsEngineStep(step) { + } + /** @internal */ + _animate(customDeltaTime) { + } + /** Execute all animations (for a frame) */ + animate() { + if (this._engine.isDeterministicLockStep()) { + let deltaTime = Math.max(_Scene.MinDeltaTime, Math.min(this._engine.getDeltaTime(), _Scene.MaxDeltaTime)) + this._timeAccumulator; + const defaultFrameTime = this._engine.getTimeStep(); + const defaultFPS = 1e3 / defaultFrameTime / 1e3; + let stepsTaken = 0; + const maxSubSteps = this._engine.getLockstepMaxSteps(); + let internalSteps = Math.floor(deltaTime / defaultFrameTime); + internalSteps = Math.min(internalSteps, maxSubSteps); + while (deltaTime > 0 && stepsTaken < internalSteps) { + this.onBeforeStepObservable.notifyObservers(this); + this._animationRatio = defaultFrameTime * defaultFPS; + this._animate(defaultFrameTime); + this.onAfterAnimationsObservable.notifyObservers(this); + if (this.physicsEnabled) { + this._advancePhysicsEngineStep(defaultFrameTime); + } + this.onAfterStepObservable.notifyObservers(this); + this._currentStepId++; + stepsTaken++; + deltaTime -= defaultFrameTime; + } + this._timeAccumulator = deltaTime < 0 ? 0 : deltaTime; + } else { + const deltaTime = this.useConstantAnimationDeltaTime ? 16 : Math.max(_Scene.MinDeltaTime, Math.min(this._engine.getDeltaTime(), _Scene.MaxDeltaTime)); + this._animationRatio = deltaTime * (60 / 1e3); + this._animate(); + this.onAfterAnimationsObservable.notifyObservers(this); + if (this.physicsEnabled) { + this._advancePhysicsEngineStep(deltaTime); + } + } + } + _clear() { + if (this.autoClearDepthAndStencil || this.autoClear) { + this._engine.clear(this.clearColor, this.autoClear || this.forceWireframe || this.forcePointsCloud, this.autoClearDepthAndStencil, this.autoClearDepthAndStencil); + } + } + _checkCameraRenderTarget(camera) { + var _a; + if ((camera == null ? void 0 : camera.outputRenderTarget) && !(camera == null ? void 0 : camera.isRigCamera)) { + camera.outputRenderTarget._cleared = false; + } + if ((_a = camera == null ? void 0 : camera.rigCameras) == null ? void 0 : _a.length) { + for (let i = 0; i < camera.rigCameras.length; ++i) { + const rtt = camera.rigCameras[i].outputRenderTarget; + if (rtt) { + rtt._cleared = false; + } + } } - return newGroup; } /** - * Serializes the animationGroup to an object - * @returns Serialized object + * Resets the draw wrappers cache of all meshes + * @param passId If provided, releases only the draw wrapper corresponding to this render pass id */ - serialize() { - const serializationObject = {}; - serializationObject.name = this.name; - serializationObject.from = this.from; - serializationObject.to = this.to; - serializationObject.speedRatio = this.speedRatio; - serializationObject.loopAnimation = this.loopAnimation; - serializationObject.isAdditive = this.isAdditive; - serializationObject.weight = this.weight; - serializationObject.playOrder = this.playOrder; - serializationObject.enableBlending = this.enableBlending; - serializationObject.blendingSpeed = this.blendingSpeed; - serializationObject.targetedAnimations = []; - for (let targetedAnimationIndex = 0; targetedAnimationIndex < this.targetedAnimations.length; targetedAnimationIndex++) { - const targetedAnimation = this.targetedAnimations[targetedAnimationIndex]; - serializationObject.targetedAnimations[targetedAnimationIndex] = targetedAnimation.serialize(); - } - if (Tags && Tags.HasTags(this)) { - serializationObject.tags = Tags.GetTags(this); + resetDrawCache(passId) { + if (!this.meshes) { + return; } - if (this.metadata) { - serializationObject.metadata = this.metadata; + for (const mesh of this.meshes) { + mesh.resetDrawCache(passId); } - return serializationObject; } - // Statics /** - * Returns a new AnimationGroup object parsed from the source provided. - * @param parsedAnimationGroup defines the source - * @param scene defines the scene that will receive the animationGroup - * @returns a new AnimationGroup + * Render the scene + * @param updateCameras defines a boolean indicating if cameras must update according to their inputs (true by default) + * @param ignoreAnimations defines a boolean indicating if animations should not be executed (false by default) */ - static Parse(parsedAnimationGroup, scene) { - const animationGroup = new _AnimationGroup(parsedAnimationGroup.name, scene, parsedAnimationGroup.weight, parsedAnimationGroup.playOrder); - for (let i = 0; i < parsedAnimationGroup.targetedAnimations.length; i++) { - const targetedAnimation = parsedAnimationGroup.targetedAnimations[i]; - const animation = Animation.Parse(targetedAnimation.animation); - const id = targetedAnimation.targetId; - if (targetedAnimation.animation.property === "influence") { - const morphTarget = scene.getMorphTargetById(id); - if (morphTarget) { - animationGroup.addTargetedAnimation(animation, morphTarget); - } - } else { - const targetNode = scene.getNodeById(id); - if (targetNode != null) { - animationGroup.addTargetedAnimation(animation, targetNode); - } - } + render(updateCameras = true, ignoreAnimations = false) { + var _a, _b; + if (this.isDisposed) { + return; } - if (Tags) { - Tags.AddTagsTo(animationGroup, parsedAnimationGroup.tags); + if (this.onReadyObservable.hasObservers() && this._executeWhenReadyTimeoutId === null) { + this._checkIsReady(); } - if (parsedAnimationGroup.from !== null && parsedAnimationGroup.to !== null) { - animationGroup.normalize(parsedAnimationGroup.from, parsedAnimationGroup.to); + this._frameId++; + this._defaultFrameBufferCleared = false; + this._checkCameraRenderTarget(this.activeCamera); + if ((_a = this.activeCameras) == null ? void 0 : _a.length) { + this.activeCameras.forEach(this._checkCameraRenderTarget); } - if (parsedAnimationGroup.speedRatio !== void 0) { - animationGroup._speedRatio = parsedAnimationGroup.speedRatio; + this._registerTransientComponents(); + this._activeParticles.fetchNewFrame(); + this._totalVertices.fetchNewFrame(); + this._activeIndices.fetchNewFrame(); + this._activeBones.fetchNewFrame(); + this._meshesForIntersections.reset(); + this.resetCachedMaterial(); + this.onBeforeAnimationsObservable.notifyObservers(this); + if (this.actionManager) { + this.actionManager.processTrigger(11); } - if (parsedAnimationGroup.loopAnimation !== void 0) { - animationGroup._loopAnimation = parsedAnimationGroup.loopAnimation; + if (!ignoreAnimations) { + this.animate(); } - if (parsedAnimationGroup.isAdditive !== void 0) { - animationGroup._isAdditive = parsedAnimationGroup.isAdditive; + for (const step of this._beforeCameraUpdateStage) { + step.action(); } - if (parsedAnimationGroup.weight !== void 0) { - animationGroup._weight = parsedAnimationGroup.weight; + if (updateCameras) { + if (this.activeCameras && this.activeCameras.length > 0) { + for (let cameraIndex = 0; cameraIndex < this.activeCameras.length; cameraIndex++) { + const camera = this.activeCameras[cameraIndex]; + camera.update(); + if (camera.cameraRigMode !== 0) { + for (let index = 0; index < camera._rigCameras.length; index++) { + camera._rigCameras[index].update(); + } + } + } + } else if (this.activeCamera) { + this.activeCamera.update(); + if (this.activeCamera.cameraRigMode !== 0) { + for (let index = 0; index < this.activeCamera._rigCameras.length; index++) { + this.activeCamera._rigCameras[index].update(); + } + } + } } - if (parsedAnimationGroup.playOrder !== void 0) { - animationGroup._playOrder = parsedAnimationGroup.playOrder; + this.onBeforeRenderObservable.notifyObservers(this); + const engine = this.getEngine(); + this.onBeforeRenderTargetsRenderObservable.notifyObservers(this); + const currentActiveCamera = ((_b = this.activeCameras) == null ? void 0 : _b.length) ? this.activeCameras[0] : this.activeCamera; + if (this.renderTargetsEnabled) { + Tools.StartPerformanceCounter("Custom render targets", this.customRenderTargets.length > 0); + this._intermediateRendering = true; + for (let customIndex = 0; customIndex < this.customRenderTargets.length; customIndex++) { + const renderTarget = this.customRenderTargets[customIndex]; + if (renderTarget._shouldRender()) { + this._renderId++; + this.activeCamera = renderTarget.activeCamera || this.activeCamera; + if (!this.activeCamera) { + throw new Error("Active camera not set"); + } + engine.setViewport(this.activeCamera.viewport); + this.updateTransformMatrix(); + renderTarget.render(currentActiveCamera !== this.activeCamera, this.dumpNextRenderTargets); + } + } + Tools.EndPerformanceCounter("Custom render targets", this.customRenderTargets.length > 0); + this._intermediateRendering = false; + this._renderId++; } - if (parsedAnimationGroup.enableBlending !== void 0) { - animationGroup._enableBlending = parsedAnimationGroup.enableBlending; + this._engine.currentRenderPassId = (currentActiveCamera == null ? void 0 : currentActiveCamera.renderPassId) ?? 0; + this.activeCamera = currentActiveCamera; + if (this._activeCamera && this._activeCamera.cameraRigMode !== 22 && !this.prePass) { + this._bindFrameBuffer(this._activeCamera, false); } - if (parsedAnimationGroup.blendingSpeed !== void 0) { - animationGroup._blendingSpeed = parsedAnimationGroup.blendingSpeed; + this.onAfterRenderTargetsRenderObservable.notifyObservers(this); + for (const step of this._beforeClearStage) { + step.action(); } - if (parsedAnimationGroup.metadata !== void 0) { - animationGroup.metadata = parsedAnimationGroup.metadata; + this._clearFrameBuffer(this.activeCamera); + for (const step of this._gatherRenderTargetsStage) { + step.action(this._renderTargets); } - return animationGroup; - } - /** @internal */ - static MakeAnimationAdditive(sourceAnimationGroup, referenceFrameOrOptions, range, cloneOriginal = false, clonedName) { - let options; - if (typeof referenceFrameOrOptions === "object") { - options = referenceFrameOrOptions; + if (this.activeCameras && this.activeCameras.length > 0) { + for (let cameraIndex = 0; cameraIndex < this.activeCameras.length; cameraIndex++) { + this._processSubCameras(this.activeCameras[cameraIndex], cameraIndex > 0); + } } else { - options = { - referenceFrame: referenceFrameOrOptions, - range, - cloneOriginalAnimationGroup: cloneOriginal, - clonedAnimationName: clonedName - }; + if (!this.activeCamera) { + throw new Error("No camera defined"); + } + this._processSubCameras(this.activeCamera, !!this.activeCamera.outputRenderTarget); } - let animationGroup = sourceAnimationGroup; - if (options.cloneOriginalAnimationGroup) { - animationGroup = sourceAnimationGroup.clone(options.clonedAnimationGroupName || animationGroup.name); + this._checkIntersections(); + for (const step of this._afterRenderStage) { + step.action(); } - const targetedAnimations = animationGroup.targetedAnimations; - for (let index = 0; index < targetedAnimations.length; index++) { - const targetedAnimation = targetedAnimations[index]; - targetedAnimation.animation = Animation.MakeAnimationAdditive(targetedAnimation.animation, options); + if (this.afterRender) { + this.afterRender(); } - animationGroup.isAdditive = true; - if (options.clipKeys) { - let from = Number.MAX_VALUE; - let to = -Number.MAX_VALUE; - const targetedAnimations2 = animationGroup.targetedAnimations; - for (let index = 0; index < targetedAnimations2.length; index++) { - const targetedAnimation = targetedAnimations2[index]; - const animation = targetedAnimation.animation; - const keys = animation.getKeys(); - if (from > keys[0].frame) { - from = keys[0].frame; - } - if (to < keys[keys.length - 1].frame) { - to = keys[keys.length - 1].frame; + this.onAfterRenderObservable.notifyObservers(this); + if (this._toBeDisposed.length) { + for (let index = 0; index < this._toBeDisposed.length; index++) { + const data = this._toBeDisposed[index]; + if (data) { + data.dispose(); } } - animationGroup._from = from; - animationGroup._to = to; + this._toBeDisposed.length = 0; } - return animationGroup; + if (this.dumpNextRenderTargets) { + this.dumpNextRenderTargets = false; + } + this._activeBones.addCount(0, true); + this._activeIndices.addCount(0, true); + this._activeParticles.addCount(0, true); + this._engine.restoreDefaultFramebuffer(); } /** - * Creates a new animation, keeping only the keys that are inside a given key range - * @param sourceAnimationGroup defines the animation group on which to operate - * @param fromKey defines the lower bound of the range - * @param toKey defines the upper bound of the range - * @param name defines the name of the new animation group. If not provided, use the same name as animationGroup - * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the keys. Default is false, so animations will be cloned - * @returns a new animation group stripped from all the keys outside the given range + * Freeze all materials + * A frozen material will not be updatable but should be faster to render + * Note: multimaterials will not be frozen, but their submaterials will */ - static ClipKeys(sourceAnimationGroup, fromKey, toKey, name69, dontCloneAnimations) { - const animationGroup = sourceAnimationGroup.clone(name69 || sourceAnimationGroup.name); - return _AnimationGroup.ClipKeysInPlace(animationGroup, fromKey, toKey, dontCloneAnimations); + freezeMaterials() { + for (let i = 0; i < this.materials.length; i++) { + this.materials[i].freeze(); + } } /** - * Updates an existing animation, keeping only the keys that are inside a given key range - * @param animationGroup defines the animation group on which to operate - * @param fromKey defines the lower bound of the range - * @param toKey defines the upper bound of the range - * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the keys. Default is false, so animations will be cloned - * @returns the animationGroup stripped from all the keys outside the given range + * Unfreeze all materials + * A frozen material will not be updatable but should be faster to render */ - static ClipKeysInPlace(animationGroup, fromKey, toKey, dontCloneAnimations) { - return _AnimationGroup.ClipInPlace(animationGroup, fromKey, toKey, dontCloneAnimations, false); + unfreezeMaterials() { + for (let i = 0; i < this.materials.length; i++) { + this.materials[i].unfreeze(); + } } /** - * Creates a new animation, keeping only the frames that are inside a given frame range - * @param sourceAnimationGroup defines the animation group on which to operate - * @param fromFrame defines the lower bound of the range - * @param toFrame defines the upper bound of the range - * @param name defines the name of the new animation group. If not provided, use the same name as animationGroup - * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the frames. Default is false, so animations will be cloned - * @returns a new animation group stripped from all the frames outside the given range + * Releases all held resources */ - static ClipFrames(sourceAnimationGroup, fromFrame, toFrame, name69, dontCloneAnimations) { - const animationGroup = sourceAnimationGroup.clone(name69 || sourceAnimationGroup.name); - return _AnimationGroup.ClipFramesInPlace(animationGroup, fromFrame, toFrame, dontCloneAnimations); + dispose() { + if (this.isDisposed) { + return; + } + this.beforeRender = null; + this.afterRender = null; + this.metadata = null; + this.skeletons.length = 0; + this.morphTargetManagers.length = 0; + this._transientComponents.length = 0; + this._isReadyForMeshStage.clear(); + this._beforeEvaluateActiveMeshStage.clear(); + this._evaluateSubMeshStage.clear(); + this._preActiveMeshStage.clear(); + this._cameraDrawRenderTargetStage.clear(); + this._beforeCameraDrawStage.clear(); + this._beforeRenderTargetDrawStage.clear(); + this._beforeRenderingGroupDrawStage.clear(); + this._beforeRenderingMeshStage.clear(); + this._afterRenderingMeshStage.clear(); + this._afterRenderingGroupDrawStage.clear(); + this._afterCameraDrawStage.clear(); + this._afterRenderTargetDrawStage.clear(); + this._afterRenderStage.clear(); + this._beforeCameraUpdateStage.clear(); + this._beforeClearStage.clear(); + this._gatherRenderTargetsStage.clear(); + this._gatherActiveCameraRenderTargetsStage.clear(); + this._pointerMoveStage.clear(); + this._pointerDownStage.clear(); + this._pointerUpStage.clear(); + this.importedMeshesFiles = []; + if (this.stopAllAnimations) { + this._activeAnimatables.forEach((animatable) => { + animatable.onAnimationEndObservable.clear(); + animatable.onAnimationEnd = null; + }); + this.stopAllAnimations(); + } + this.resetCachedMaterial(); + if (this.activeCamera) { + this.activeCamera._activeMeshes.dispose(); + this.activeCamera = null; + } + this.activeCameras = null; + this._activeMeshes.dispose(); + this._renderingManager.dispose(); + this._processedMaterials.dispose(); + this._activeParticleSystems.dispose(); + this._activeSkeletons.dispose(); + this._softwareSkinnedMeshes.dispose(); + this._renderTargets.dispose(); + this._materialsRenderTargets.dispose(); + this._registeredForLateAnimationBindings.dispose(); + this._meshesForIntersections.dispose(); + this._toBeDisposed.length = 0; + const activeRequests = this._activeRequests.slice(); + for (const request of activeRequests) { + request.abort(); + } + this._activeRequests.length = 0; + try { + this.onDisposeObservable.notifyObservers(this); + } catch (e) { + Logger.Error("An error occurred while calling onDisposeObservable!", e); + } + this.detachControl(); + const canvas = this._engine.getInputElement(); + if (canvas) { + for (let index2 = 0; index2 < this.cameras.length; index2++) { + this.cameras[index2].detachControl(); + } + } + this._disposeList(this.animationGroups); + this._disposeList(this.lights); + this._disposeList(this.meshes, (item) => item.dispose(true)); + this._disposeList(this.transformNodes, (item) => item.dispose(true)); + const cameras = this.cameras; + this._disposeList(cameras); + if (this._defaultMaterial) { + this._defaultMaterial.dispose(); + } + this._disposeList(this.multiMaterials); + this._disposeList(this.materials); + this._disposeList(this.particleSystems); + this._disposeList(this.postProcesses); + this._disposeList(this.textures); + this._disposeList(this.morphTargetManagers); + this._sceneUbo.dispose(); + if (this._multiviewSceneUbo) { + this._multiviewSceneUbo.dispose(); + } + this.postProcessManager.dispose(); + this._disposeList(this._components); + let index = this._engine.scenes.indexOf(this); + if (index > -1) { + this._engine.scenes.splice(index, 1); + } + if (EngineStore._LastCreatedScene === this) { + if (this._engine.scenes.length > 0) { + EngineStore._LastCreatedScene = this._engine.scenes[this._engine.scenes.length - 1]; + } else { + EngineStore._LastCreatedScene = null; + } + } + index = this._engine._virtualScenes.indexOf(this); + if (index > -1) { + this._engine._virtualScenes.splice(index, 1); + } + this._engine.wipeCaches(true); + this.onDisposeObservable.clear(); + this.onBeforeRenderObservable.clear(); + this.onAfterRenderObservable.clear(); + this.onBeforeRenderTargetsRenderObservable.clear(); + this.onAfterRenderTargetsRenderObservable.clear(); + this.onAfterStepObservable.clear(); + this.onBeforeStepObservable.clear(); + this.onBeforeActiveMeshesEvaluationObservable.clear(); + this.onAfterActiveMeshesEvaluationObservable.clear(); + this.onBeforeParticlesRenderingObservable.clear(); + this.onAfterParticlesRenderingObservable.clear(); + this.onBeforeDrawPhaseObservable.clear(); + this.onAfterDrawPhaseObservable.clear(); + this.onBeforeAnimationsObservable.clear(); + this.onAfterAnimationsObservable.clear(); + this.onDataLoadedObservable.clear(); + this.onBeforeRenderingGroupObservable.clear(); + this.onAfterRenderingGroupObservable.clear(); + this.onMeshImportedObservable.clear(); + this.onBeforeCameraRenderObservable.clear(); + this.onAfterCameraRenderObservable.clear(); + this.onAfterRenderCameraObservable.clear(); + this.onReadyObservable.clear(); + this.onNewCameraAddedObservable.clear(); + this.onCameraRemovedObservable.clear(); + this.onNewLightAddedObservable.clear(); + this.onLightRemovedObservable.clear(); + this.onNewGeometryAddedObservable.clear(); + this.onGeometryRemovedObservable.clear(); + this.onNewTransformNodeAddedObservable.clear(); + this.onTransformNodeRemovedObservable.clear(); + this.onNewMeshAddedObservable.clear(); + this.onMeshRemovedObservable.clear(); + this.onNewSkeletonAddedObservable.clear(); + this.onSkeletonRemovedObservable.clear(); + this.onNewMaterialAddedObservable.clear(); + this.onNewMultiMaterialAddedObservable.clear(); + this.onMaterialRemovedObservable.clear(); + this.onMultiMaterialRemovedObservable.clear(); + this.onNewTextureAddedObservable.clear(); + this.onTextureRemovedObservable.clear(); + this.onPrePointerObservable.clear(); + this.onPointerObservable.clear(); + this.onPreKeyboardObservable.clear(); + this.onKeyboardObservable.clear(); + this.onActiveCameraChanged.clear(); + this.onScenePerformancePriorityChangedObservable.clear(); + this._isDisposed = true; + } + _disposeList(items, callback) { + const itemsCopy = items.slice(0); + callback = callback ?? ((item) => item.dispose()); + for (const item of itemsCopy) { + callback(item); + } + items.length = 0; } /** - * Updates an existing animation, keeping only the frames that are inside a given frame range - * @param animationGroup defines the animation group on which to operate - * @param fromFrame defines the lower bound of the range - * @param toFrame defines the upper bound of the range - * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the frames. Default is false, so animations will be cloned - * @returns the animationGroup stripped from all the frames outside the given range + * Gets if the scene is already disposed */ - static ClipFramesInPlace(animationGroup, fromFrame, toFrame, dontCloneAnimations) { - return _AnimationGroup.ClipInPlace(animationGroup, fromFrame, toFrame, dontCloneAnimations, true); + get isDisposed() { + return this._isDisposed; } /** - * Updates an existing animation, keeping only the keys that are inside a given key or frame range - * @param animationGroup defines the animation group on which to operate - * @param start defines the lower bound of the range - * @param end defines the upper bound of the range - * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the keys. Default is false, so animations will be cloned - * @param useFrame defines if the range is defined by frame numbers or key indices (default is false which means use key indices) - * @returns the animationGroup stripped from all the keys outside the given range + * Call this function to reduce memory footprint of the scene. + * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly) */ - static ClipInPlace(animationGroup, start, end, dontCloneAnimations, useFrame = false) { - let from = Number.MAX_VALUE; - let to = -Number.MAX_VALUE; - const targetedAnimations = animationGroup.targetedAnimations; - for (let index = 0; index < targetedAnimations.length; index++) { - const targetedAnimation = targetedAnimations[index]; - const animation = dontCloneAnimations ? targetedAnimation.animation : targetedAnimation.animation.clone(); - if (useFrame) { - animation.createKeyForFrame(start); - animation.createKeyForFrame(end); - } - const keys = animation.getKeys(); - const newKeys = []; - let startFrame = Number.MAX_VALUE; - for (let k = 0; k < keys.length; k++) { - const key = keys[k]; - if (!useFrame && k >= start && k <= end || useFrame && key.frame >= start && key.frame <= end) { - const newKey = { - frame: key.frame, - value: key.value.clone ? key.value.clone() : key.value, - inTangent: key.inTangent, - outTangent: key.outTangent, - interpolation: key.interpolation, - lockedTangent: key.lockedTangent - }; - if (startFrame === Number.MAX_VALUE) { - startFrame = newKey.frame; - } - newKey.frame -= startFrame; - newKeys.push(newKey); - } - } - if (newKeys.length === 0) { - targetedAnimations.splice(index, 1); - index--; - continue; - } - if (from > newKeys[0].frame) { - from = newKeys[0].frame; - } - if (to < newKeys[newKeys.length - 1].frame) { - to = newKeys[newKeys.length - 1].frame; + clearCachedVertexData() { + for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) { + const mesh = this.meshes[meshIndex]; + const geometry = mesh.geometry; + if (geometry) { + geometry.clearCachedData(); } - animation.setKeys(newKeys, true); - targetedAnimation.animation = animation; } - animationGroup._from = from; - animationGroup._to = to; - return animationGroup; } /** - * Returns the string "AnimationGroup" - * @returns "AnimationGroup" + * This function will remove the local cached buffer data from texture. + * It will save memory but will prevent the texture from being rebuilt */ - getClassName() { - return "AnimationGroup"; + cleanCachedTextureBuffer() { + for (const baseTexture of this.textures) { + const buffer = baseTexture._buffer; + if (buffer) { + baseTexture._buffer = null; + } + } } /** - * Creates a detailed string about the object - * @param fullDetails defines if the output string will support multiple levels of logging within scene loading - * @returns a string representing the object + * Get the world extend vectors with an optional filter + * + * @param filterPredicate the predicate - which meshes should be included when calculating the world size + * @returns {{ min: Vector3; max: Vector3 }} min and max vectors */ - toString(fullDetails) { - let ret = "Name: " + this.name; - ret += ", type: " + this.getClassName(); - if (fullDetails) { - ret += ", from: " + this._from; - ret += ", to: " + this._to; - ret += ", isStarted: " + this._isStarted; - ret += ", speedRatio: " + this._speedRatio; - ret += ", targetedAnimations length: " + this._targetedAnimations.length; - ret += ", animatables length: " + this._animatables; - } - return ret; - } -}; - -// node_modules/@babylonjs/core/Misc/coroutine.js -function inlineScheduler(coroutine, onStep, onError) { - try { - const step = coroutine.next(); - if (step.done) { - onStep(step); - } else if (!step.value) { - onStep(step); - } else { - step.value.then(() => { - step.value = void 0; - onStep(step); - }, onError); - } - } catch (error) { - onError(error); - } -} -function createYieldingScheduler(yieldAfterMS = 25) { - let startTime; - return (coroutine, onStep, onError) => { - const currentTime = performance.now(); - if (startTime === void 0 || currentTime - startTime > yieldAfterMS) { - startTime = currentTime; - setTimeout(() => { - inlineScheduler(coroutine, onStep, onError); - }, 0); - } else { - inlineScheduler(coroutine, onStep, onError); - } - }; -} -function runCoroutine(coroutine, scheduler, onSuccess, onError, abortSignal) { - const resume = () => { - let reschedule; - const onStep = (stepResult) => { - if (stepResult.done) { - onSuccess(stepResult.value); - } else { - if (reschedule === void 0) { - reschedule = true; - } else { - resume(); - } + getWorldExtends(filterPredicate) { + const min = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); + const max = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); + filterPredicate = filterPredicate || (() => true); + this.meshes.filter(filterPredicate).forEach((mesh) => { + mesh.computeWorldMatrix(true); + if (!mesh.subMeshes || mesh.subMeshes.length === 0 || mesh.infiniteDistance) { + return; } + const boundingInfo = mesh.getBoundingInfo(); + const minBox = boundingInfo.boundingBox.minimumWorld; + const maxBox = boundingInfo.boundingBox.maximumWorld; + Vector3.CheckExtends(minBox, min, max); + Vector3.CheckExtends(maxBox, min, max); + }); + return { + min, + max }; - do { - reschedule = void 0; - if (!abortSignal || !abortSignal.aborted) { - scheduler(coroutine, onStep, onError); - } else { - onError(new Error("Aborted")); - } - if (reschedule === void 0) { - reschedule = false; - } - } while (reschedule); - }; - resume(); -} -function runCoroutineSync(coroutine, abortSignal) { - let result; - runCoroutine(coroutine, inlineScheduler, (r) => result = r, (e) => { - throw e; - }, abortSignal); - return result; -} -function runCoroutineAsync(coroutine, scheduler, abortSignal) { - return new Promise((resolve, reject) => { - runCoroutine(coroutine, scheduler, resolve, reject, abortSignal); - }); -} -function makeSyncFunction(coroutineFactory, abortSignal) { - return (...params) => { - return runCoroutineSync(coroutineFactory(...params), abortSignal); - }; -} -function makeAsyncFunction(coroutineFactory, scheduler, abortSignal) { - return (...params) => { - return runCoroutineAsync(coroutineFactory(...params), scheduler, abortSignal); - }; -} - -// node_modules/@babylonjs/core/Maths/math.viewport.js -var Viewport = class _Viewport { - /** - * Creates a Viewport object located at (x, y) and sized (width, height) - * @param x defines viewport left coordinate - * @param y defines viewport top coordinate - * @param width defines the viewport width - * @param height defines the viewport height - */ - constructor(x, y, width, height) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; } + // Picking + // eslint-disable-next-line jsdoc/require-returns-check /** - * Creates a new viewport using absolute sizing (from 0-> width, 0-> height instead of 0->1) - * @param renderWidth defines the rendering width - * @param renderHeight defines the rendering height - * @returns a new Viewport + * Creates a ray that can be used to pick in the scene + * @param x defines the x coordinate of the origin (on-screen) + * @param y defines the y coordinate of the origin (on-screen) + * @param world defines the world matrix to use if you want to pick in object space (instead of world space) + * @param camera defines the camera to use for the picking + * @param cameraViewSpace defines if picking will be done in view space (false by default) + * @returns a Ray */ - toGlobal(renderWidth, renderHeight) { - return new _Viewport(this.x * renderWidth, this.y * renderHeight, this.width * renderWidth, this.height * renderHeight); + createPickingRay(x, y, world, camera, cameraViewSpace = false) { + throw _WarnImport("Ray"); } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Stores absolute viewport value into a target viewport (from 0-> width, 0-> height instead of 0->1) - * @param renderWidth defines the rendering width - * @param renderHeight defines the rendering height - * @param ref defines the target viewport - * @returns the current viewport + * Creates a ray that can be used to pick in the scene + * @param x defines the x coordinate of the origin (on-screen) + * @param y defines the y coordinate of the origin (on-screen) + * @param world defines the world matrix to use if you want to pick in object space (instead of world space) + * @param result defines the ray where to store the picking ray + * @param camera defines the camera to use for the picking + * @param cameraViewSpace defines if picking will be done in view space (false by default) + * @param enableDistantPicking defines if picking should handle large values for mesh position/scaling (false by default) + * @returns the current scene */ - toGlobalToRef(renderWidth, renderHeight, ref) { - ref.x = this.x * renderWidth; - ref.y = this.y * renderHeight; - ref.width = this.width * renderWidth; - ref.height = this.height * renderHeight; - return this; + createPickingRayToRef(x, y, world, result, camera, cameraViewSpace = false, enableDistantPicking = false) { + throw _WarnImport("Ray"); } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Returns a new Viewport copied from the current one - * @returns a new Viewport + * Creates a ray that can be used to pick in the scene + * @param x defines the x coordinate of the origin (on-screen) + * @param y defines the y coordinate of the origin (on-screen) + * @param camera defines the camera to use for the picking + * @returns a Ray */ - clone() { - return new _Viewport(this.x, this.y, this.width, this.height); + createPickingRayInCameraSpace(x, y, camera) { + throw _WarnImport("Ray"); } -}; - -// node_modules/@babylonjs/core/Cameras/camera.js -var Camera = class _Camera extends Node { + // eslint-disable-next-line jsdoc/require-returns-check /** - * Define the current local position of the camera in the scene + * Creates a ray that can be used to pick in the scene + * @param x defines the x coordinate of the origin (on-screen) + * @param y defines the y coordinate of the origin (on-screen) + * @param result defines the ray where to store the picking ray + * @param camera defines the camera to use for the picking + * @returns the current scene */ - get position() { - return this._position; + createPickingRayInCameraSpaceToRef(x, y, result, camera) { + throw _WarnImport("Ray"); } - set position(newPosition) { - this._position = newPosition; + /** @internal */ + get _pickingAvailable() { + return false; } - /** - * The vector the camera should consider as up. - * (default is Vector3(0, 1, 0) aka Vector3.Up()) + /** Launch a ray to try to pick a mesh in the scene + * @param x position on screen + * @param y position on screen + * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true + * @param fastCheck defines if the first intersection will be used (and not the closest) + * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used + * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected + * @returns a PickingInfo */ - set upVector(vec) { - this._upVector = vec; - } - get upVector() { - return this._upVector; + pick(x, y, predicate, fastCheck, camera, trianglePredicate) { + const warn = _WarnImport("Ray", true); + if (warn) { + Logger.Warn(warn); + } + return new PickingInfo(); } - /** - * The screen area in scene units squared + /** Launch a ray to try to pick a mesh in the scene using only bounding information of the main mesh (not using submeshes) + * @param x position on screen + * @param y position on screen + * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true + * @param fastCheck defines if the first intersection will be used (and not the closest) + * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used + * @returns a PickingInfo (Please note that some info will not be set like distance, bv, bu and everything that cannot be capture by only using bounding infos) */ - get screenArea() { - let x = 0; - let y = 0; - if (this.mode === _Camera.PERSPECTIVE_CAMERA) { - if (this.fovMode === _Camera.FOVMODE_VERTICAL_FIXED) { - y = this.minZ * 2 * Math.tan(this.fov / 2); - x = this.getEngine().getAspectRatio(this) * y; - } else { - x = this.minZ * 2 * Math.tan(this.fov / 2); - y = x / this.getEngine().getAspectRatio(this); - } - } else { - const halfWidth = this.getEngine().getRenderWidth() / 2; - const halfHeight = this.getEngine().getRenderHeight() / 2; - x = (this.orthoRight ?? halfWidth) - (this.orthoLeft ?? -halfWidth); - y = (this.orthoTop ?? halfHeight) - (this.orthoBottom ?? -halfHeight); + pickWithBoundingInfo(x, y, predicate, fastCheck, camera) { + const warn = _WarnImport("Ray", true); + if (warn) { + Logger.Warn(warn); } - return x * y; + return new PickingInfo(); } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Define the current limit on the left side for an orthographic camera - * In scene unit + * Use the given ray to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides, + * irrespective of orientation. + * @param ray The ray to use to pick meshes + * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must have isPickable set to true + * @param fastCheck defines if the first intersection will be used (and not the closest) + * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected + * @returns a PickingInfo */ - set orthoLeft(value) { - this._orthoLeft = value; - for (const rigCamera of this._rigCameras) { - rigCamera.orthoLeft = value; - } + pickWithRay(ray, predicate, fastCheck, trianglePredicate) { + throw _WarnImport("Ray"); } - get orthoLeft() { - return this._orthoLeft; + // eslint-disable-next-line jsdoc/require-returns-check + /** + * Launch a ray to try to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides, + * irrespective of orientation. + * @param x X position on screen + * @param y Y position on screen + * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true + * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used + * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected + * @returns an array of PickingInfo + */ + multiPick(x, y, predicate, camera, trianglePredicate) { + throw _WarnImport("Ray"); } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Define the current limit on the right side for an orthographic camera - * In scene unit + * Launch a ray to try to pick a mesh in the scene + * @param ray Ray to use + * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true + * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected + * @returns an array of PickingInfo */ - set orthoRight(value) { - this._orthoRight = value; - for (const rigCamera of this._rigCameras) { - rigCamera.orthoRight = value; - } + multiPickWithRay(ray, predicate, trianglePredicate) { + throw _WarnImport("Ray"); } - get orthoRight() { - return this._orthoRight; + /** + * Force the value of meshUnderPointer + * @param mesh defines the mesh to use + * @param pointerId optional pointer id when using more than one pointer + * @param pickResult optional pickingInfo data used to find mesh + */ + setPointerOverMesh(mesh, pointerId, pickResult) { + this._inputManager.setPointerOverMesh(mesh, pointerId, pickResult); } /** - * Define the current limit on the bottom side for an orthographic camera - * In scene unit + * Gets the mesh under the pointer + * @returns a Mesh or null if no mesh is under the pointer */ - set orthoBottom(value) { - this._orthoBottom = value; - for (const rigCamera of this._rigCameras) { - rigCamera.orthoBottom = value; + getPointerOverMesh() { + return this._inputManager.getPointerOverMesh(); + } + // Misc. + /** @internal */ + _rebuildGeometries() { + for (const geometry of this.geometries) { + geometry._rebuild(); + } + for (const mesh of this.meshes) { + mesh._rebuild(); + } + if (this.postProcessManager) { + this.postProcessManager._rebuild(); + } + for (const component of this._components) { + component.rebuild(); + } + for (const system of this.particleSystems) { + system.rebuild(); + } + if (this.spriteManagers) { + for (const spriteMgr of this.spriteManagers) { + spriteMgr.rebuild(); + } } } - get orthoBottom() { - return this._orthoBottom; + /** @internal */ + _rebuildTextures() { + for (const texture of this.textures) { + texture._rebuild(true); + } + this.markAllMaterialsAsDirty(1); } /** - * Define the current limit on the top side for an orthographic camera - * In scene unit + * Get from a list of objects by tags + * @param list the list of objects to use + * @param tagsQuery the query to use + * @param filter a predicate to filter for tags + * @returns */ - set orthoTop(value) { - this._orthoTop = value; - for (const rigCamera of this._rigCameras) { - rigCamera.orthoTop = value; + _getByTags(list, tagsQuery, filter) { + if (tagsQuery === void 0) { + return list; } - } - get orthoTop() { - return this._orthoTop; + const listByTags = []; + for (const i in list) { + const item = list[i]; + if (Tags && Tags.MatchesQuery(item, tagsQuery) && (!filter || filter(item))) { + listByTags.push(item); + } + } + return listByTags; } /** - * Define the mode of the camera (Camera.PERSPECTIVE_CAMERA or Camera.ORTHOGRAPHIC_CAMERA) + * Get a list of meshes by tags + * @param tagsQuery defines the tags query to use + * @param filter defines a predicate used to filter results + * @returns an array of Mesh */ - set mode(mode) { - this._mode = mode; - for (const rigCamera of this._rigCameras) { - rigCamera.mode = mode; - } + getMeshesByTags(tagsQuery, filter) { + return this._getByTags(this.meshes, tagsQuery, filter); } - get mode() { - return this._mode; + /** + * Get a list of cameras by tags + * @param tagsQuery defines the tags query to use + * @param filter defines a predicate used to filter results + * @returns an array of Camera + */ + getCamerasByTags(tagsQuery, filter) { + return this._getByTags(this.cameras, tagsQuery, filter); } /** - * Gets a flag indicating that the camera has moved in some way since the last call to Camera.update() + * Get a list of lights by tags + * @param tagsQuery defines the tags query to use + * @param filter defines a predicate used to filter results + * @returns an array of Light */ - get hasMoved() { - return this._hasMoved; + getLightsByTags(tagsQuery, filter) { + return this._getByTags(this.lights, tagsQuery, filter); } /** - * Instantiates a new camera object. - * This should not be used directly but through the inherited cameras: ArcRotate, Free... - * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras - * @param name Defines the name of the camera in the scene - * @param position Defines the position of the camera - * @param scene Defines the scene the camera belongs too - * @param setActiveOnSceneIfNoneActive Defines if the camera should be set as active after creation if no other camera have been defined in the scene + * Get a list of materials by tags + * @param tagsQuery defines the tags query to use + * @param filter defines a predicate used to filter results + * @returns an array of Material */ - constructor(name69, position, scene, setActiveOnSceneIfNoneActive = true) { - super(name69, scene); - this._position = Vector3.Zero(); - this._upVector = Vector3.Up(); - this.oblique = null; - this._orthoLeft = null; - this._orthoRight = null; - this._orthoBottom = null; - this._orthoTop = null; - this.fov = 0.8; - this.projectionPlaneTilt = 0; - this.minZ = 1; - this.maxZ = 1e4; - this.inertia = 0.9; - this._mode = _Camera.PERSPECTIVE_CAMERA; - this.isIntermediate = false; - this.viewport = new Viewport(0, 0, 1, 1); - this.layerMask = 268435455; - this.fovMode = _Camera.FOVMODE_VERTICAL_FIXED; - this.cameraRigMode = _Camera.RIG_MODE_NONE; - this.customRenderTargets = []; - this.outputRenderTarget = null; - this.onViewMatrixChangedObservable = new Observable(); - this.onProjectionMatrixChangedObservable = new Observable(); - this.onAfterCheckInputsObservable = new Observable(); - this.onRestoreStateObservable = new Observable(); - this.isRigCamera = false; - this._hasMoved = false; - this._rigCameras = new Array(); - this._skipRendering = false; - this._projectionMatrix = new Matrix(); - this._postProcesses = new Array(); - this._activeMeshes = new SmartArray(256); - this._globalPosition = Vector3.Zero(); - this._computedViewMatrix = Matrix.Identity(); - this._doNotComputeProjectionMatrix = false; - this._transformMatrix = Matrix.Zero(); - this._refreshFrustumPlanes = true; - this._absoluteRotation = Quaternion.Identity(); - this._isCamera = true; - this._isLeftCamera = false; - this._isRightCamera = false; - this.getScene().addCamera(this); - if (setActiveOnSceneIfNoneActive && !this.getScene().activeCamera) { - this.getScene().activeCamera = this; - } - this.position = position; - this.renderPassId = this.getScene().getEngine().createRenderPassId(`Camera ${name69}`); + getMaterialByTags(tagsQuery, filter) { + return this._getByTags(this.materials, tagsQuery, filter).concat(this._getByTags(this.multiMaterials, tagsQuery, filter)); } /** - * Store current camera state (fov, position, etc..) - * @returns the camera + * Get a list of transform nodes by tags + * @param tagsQuery defines the tags query to use + * @param filter defines a predicate used to filter results + * @returns an array of TransformNode */ - storeState() { - this._stateStored = true; - this._storedFov = this.fov; - return this; + getTransformNodesByTags(tagsQuery, filter) { + return this._getByTags(this.transformNodes, tagsQuery, filter); } /** - * Restores the camera state values if it has been stored. You must call storeState() first - * @returns true if restored and false otherwise + * Overrides the default sort function applied in the rendering group to prepare the meshes. + * This allowed control for front to back rendering or reversly depending of the special needs. + * + * @param renderingGroupId The rendering group id corresponding to its index + * @param opaqueSortCompareFn The opaque queue comparison function use to sort. + * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort. + * @param transparentSortCompareFn The transparent queue comparison function use to sort. */ - _restoreStateValues() { - if (!this._stateStored) { - return false; - } - this.fov = this._storedFov; - return true; + setRenderingOrder(renderingGroupId, opaqueSortCompareFn = null, alphaTestSortCompareFn = null, transparentSortCompareFn = null) { + this._renderingManager.setRenderingOrder(renderingGroupId, opaqueSortCompareFn, alphaTestSortCompareFn, transparentSortCompareFn); } /** - * Restored camera state. You must call storeState() first. - * @returns true if restored and false otherwise + * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups. + * + * @param renderingGroupId The rendering group id corresponding to its index + * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true. + * @param depth Automatically clears depth between groups if true and autoClear is true. + * @param stencil Automatically clears stencil between groups if true and autoClear is true. */ - restoreState() { - if (this._restoreStateValues()) { - this.onRestoreStateObservable.notifyObservers(this); - return true; - } - return false; + setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil, depth = true, stencil = true) { + this._renderingManager.setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil, depth, stencil); } /** - * Gets the class name of the camera. - * @returns the class name + * Gets the current auto clear configuration for one rendering group of the rendering + * manager. + * @param index the rendering group index to get the information for + * @returns The auto clear setup for the requested rendering group */ - getClassName() { - return "Camera"; + getAutoClearDepthStencilSetup(index) { + return this._renderingManager.getAutoClearDepthStencilSetup(index); + } + /** @internal */ + _forceBlockMaterialDirtyMechanism(value) { + this._blockMaterialDirtyMechanism = value; + } + /** Gets or sets a boolean blocking all the calls to markAllMaterialsAsDirty (ie. the materials won't be updated if they are out of sync) */ + get blockMaterialDirtyMechanism() { + return this._blockMaterialDirtyMechanism; + } + set blockMaterialDirtyMechanism(value) { + if (this._blockMaterialDirtyMechanism === value) { + return; + } + this._blockMaterialDirtyMechanism = value; + if (!value) { + this.markAllMaterialsAsDirty(63); + } } /** - * Gets a string representation of the camera useful for debug purpose. - * @param fullDetails Defines that a more verbose level of logging is required - * @returns the string representation + * Will flag all materials as dirty to trigger new shader compilation + * @param flag defines the flag used to specify which material part must be marked as dirty + * @param predicate If not null, it will be used to specify if a material has to be marked as dirty */ - toString(fullDetails) { - let ret = "Name: " + this.name; - ret += ", type: " + this.getClassName(); - if (this.animations) { - for (let i = 0; i < this.animations.length; i++) { - ret += ", animation[0]: " + this.animations[i].toString(fullDetails); + markAllMaterialsAsDirty(flag, predicate) { + if (this._blockMaterialDirtyMechanism) { + return; + } + for (const material of this.materials) { + if (predicate && !predicate(material)) { + continue; } + material.markAsDirty(flag); } - return ret; } /** - * Automatically tilts the projection plane, using `projectionPlaneTilt`, to correct the perspective effect on vertical lines. + * @internal */ - applyVerticalCorrection() { - const rot = this.absoluteRotation.toEulerAngles(); - this.projectionPlaneTilt = this._scene.useRightHandedSystem ? -rot.x : rot.x; + _loadFile(fileOrUrl, onSuccess, onProgress, useOfflineSupport, useArrayBuffer, onError, onOpened) { + const request = LoadFile(fileOrUrl, onSuccess, onProgress, useOfflineSupport ? this.offlineProvider : void 0, useArrayBuffer, onError, onOpened); + this._activeRequests.push(request); + request.onCompleteObservable.add((request2) => { + this._activeRequests.splice(this._activeRequests.indexOf(request2), 1); + }); + return request; } /** - * Gets the current world space position of the camera. + * @internal */ - get globalPosition() { - return this._globalPosition; + _loadFileAsync(fileOrUrl, onProgress, useOfflineSupport, useArrayBuffer, onOpened) { + return new Promise((resolve, reject) => { + this._loadFile(fileOrUrl, (data) => { + resolve(data); + }, onProgress, useOfflineSupport, useArrayBuffer, (request, exception) => { + reject(exception); + }, onOpened); + }); } /** - * Gets the list of active meshes this frame (meshes no culled or excluded by lod s in the frame) - * @returns the active meshe list + * @internal */ - getActiveMeshes() { - return this._activeMeshes; + _requestFile(url, onSuccess, onProgress, useOfflineSupport, useArrayBuffer, onError, onOpened) { + const request = RequestFile(url, onSuccess, onProgress, useOfflineSupport ? this.offlineProvider : void 0, useArrayBuffer, onError, onOpened); + this._activeRequests.push(request); + request.onCompleteObservable.add((request2) => { + this._activeRequests.splice(this._activeRequests.indexOf(request2), 1); + }); + return request; } /** - * Check whether a mesh is part of the current active mesh list of the camera - * @param mesh Defines the mesh to check - * @returns true if active, false otherwise + * @internal */ - isActiveMesh(mesh) { - return this._activeMeshes.indexOf(mesh) !== -1; + _requestFileAsync(url, onProgress, useOfflineSupport, useArrayBuffer, onOpened) { + return new Promise((resolve, reject) => { + this._requestFile(url, (data) => { + resolve(data); + }, onProgress, useOfflineSupport, useArrayBuffer, (error) => { + reject(error); + }, onOpened); + }); } /** - * Is this camera ready to be used/rendered - * @param completeCheck defines if a complete check (including post processes) has to be done (false by default) - * @returns true if the camera is ready + * @internal */ - isReady(completeCheck = false) { - if (completeCheck) { - for (const pp of this._postProcesses) { - if (pp && !pp.isReady()) { - return false; - } - } - } - return super.isReady(completeCheck); - } - /** @internal */ - _initCache() { - super._initCache(); - this._cache.position = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); - this._cache.upVector = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); - this._cache.mode = void 0; - this._cache.minZ = void 0; - this._cache.maxZ = void 0; - this._cache.fov = void 0; - this._cache.fovMode = void 0; - this._cache.aspectRatio = void 0; - this._cache.orthoLeft = void 0; - this._cache.orthoRight = void 0; - this._cache.orthoBottom = void 0; - this._cache.orthoTop = void 0; - this._cache.obliqueAngle = void 0; - this._cache.obliqueLength = void 0; - this._cache.obliqueOffset = void 0; - this._cache.renderWidth = void 0; - this._cache.renderHeight = void 0; + _readFile(file, onSuccess, onProgress, useArrayBuffer, onError) { + const request = ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError); + this._activeRequests.push(request); + request.onCompleteObservable.add((request2) => { + this._activeRequests.splice(this._activeRequests.indexOf(request2), 1); + }); + return request; } /** * @internal */ - _updateCache(ignoreParentClass) { - if (!ignoreParentClass) { - super._updateCache(); - } - this._cache.position.copyFrom(this.position); - this._cache.upVector.copyFrom(this.upVector); - } - /** @internal */ - _isSynchronized() { - return this._isSynchronizedViewMatrix() && this._isSynchronizedProjectionMatrix(); + _readFileAsync(file, onProgress, useArrayBuffer) { + return new Promise((resolve, reject) => { + this._readFile(file, (data) => { + resolve(data); + }, onProgress, useArrayBuffer, (error) => { + reject(error); + }); + }); } - /** @internal */ - _isSynchronizedViewMatrix() { - if (!super._isSynchronized()) { - return false; - } - return this._cache.position.equals(this.position) && this._cache.upVector.equals(this.upVector) && this.isSynchronizedWithParent(); + // eslint-disable-next-line jsdoc/require-returns-check + /** + * This method gets the performance collector belonging to the scene, which is generally shared with the inspector. + * @returns the perf collector belonging to the scene. + */ + getPerfCollector() { + throw _WarnImport("performanceViewerSceneExtension"); } - /** @internal */ - _isSynchronizedProjectionMatrix() { - let isSynchronized = this._cache.mode === this.mode && this._cache.minZ === this.minZ && this._cache.maxZ === this.maxZ; - if (!isSynchronized) { - return false; - } - const engine = this.getEngine(); - if (this.mode === _Camera.PERSPECTIVE_CAMERA) { - isSynchronized = this._cache.fov === this.fov && this._cache.fovMode === this.fovMode && this._cache.aspectRatio === engine.getAspectRatio(this) && this._cache.projectionPlaneTilt === this.projectionPlaneTilt; - } else { - isSynchronized = this._cache.orthoLeft === this.orthoLeft && this._cache.orthoRight === this.orthoRight && this._cache.orthoBottom === this.orthoBottom && this._cache.orthoTop === this.orthoTop && this._cache.renderWidth === engine.getRenderWidth() && this._cache.renderHeight === engine.getRenderHeight(); - if (this.oblique) { - isSynchronized = isSynchronized && this._cache.obliqueAngle === this.oblique.angle && this._cache.obliqueLength === this.oblique.length && this._cache.obliqueOffset === this.oblique.offset; - } - } - return isSynchronized; + // deprecated + /** + * Sets the active camera of the scene using its Id + * @param id defines the camera's Id + * @returns the new active camera or null if none found. + * @deprecated Please use setActiveCameraById instead + */ + setActiveCameraByID(id) { + return this.setActiveCameraById(id); } /** - * Attach the input controls to a specific dom element to get the input from. - * This function is here because typescript removes the typing of the last function. - * @param _ignored defines an ignored parameter kept for backward compatibility. - * @param _noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault) + * Get a material using its id + * @param id defines the material's Id + * @returns the material or null if none found. + * @deprecated Please use getMaterialById instead */ - attachControl(_ignored, _noPreventDefault) { + getMaterialByID(id) { + return this.getMaterialById(id); } /** - * Detach the current controls from the specified dom element. - * This function is here because typescript removes the typing of the last function. - * @param _ignored defines an ignored parameter kept for backward compatibility. + * Gets a the last added material using a given id + * @param id defines the material's Id + * @returns the last material with the given id or null if none found. + * @deprecated Please use getLastMaterialById instead */ - detachControl(_ignored) { + getLastMaterialByID(id) { + return this.getLastMaterialById(id); } /** - * Update the camera state according to the different inputs gathered during the frame. + * Get a texture using its unique id + * @param uniqueId defines the texture's unique id + * @returns the texture or null if none found. + * @deprecated Please use getTextureByUniqueId instead */ - update() { - this._hasMoved = false; - this._checkInputs(); - if (this.cameraRigMode !== _Camera.RIG_MODE_NONE) { - this._updateRigCameras(); - } - this.getViewMatrix(); - this.getProjectionMatrix(); - } - /** @internal */ - _checkInputs() { - this.onAfterCheckInputsObservable.notifyObservers(this); - } - /** @internal */ - get rigCameras() { - return this._rigCameras; + getTextureByUniqueID(uniqueId) { + return this.getTextureByUniqueId(uniqueId); } /** - * Gets the post process used by the rig cameras + * Gets a camera using its Id + * @param id defines the Id to look for + * @returns the camera or null if not found + * @deprecated Please use getCameraById instead */ - get rigPostProcess() { - return this._rigPostProcess; + getCameraByID(id) { + return this.getCameraById(id); } /** - * Internal, gets the first post process. - * @returns the first post process to be run on this camera. + * Gets a camera using its unique Id + * @param uniqueId defines the unique Id to look for + * @returns the camera or null if not found + * @deprecated Please use getCameraByUniqueId instead */ - _getFirstPostProcess() { - for (let ppIndex = 0; ppIndex < this._postProcesses.length; ppIndex++) { - if (this._postProcesses[ppIndex] !== null) { - return this._postProcesses[ppIndex]; - } - } - return null; + getCameraByUniqueID(uniqueId) { + return this.getCameraByUniqueId(uniqueId); } - _cascadePostProcessesToRigCams() { - const firstPostProcess = this._getFirstPostProcess(); - if (firstPostProcess) { - firstPostProcess.markTextureDirty(); - } - for (let i = 0, len = this._rigCameras.length; i < len; i++) { - const cam = this._rigCameras[i]; - const rigPostProcess = cam._rigPostProcess; - if (rigPostProcess) { - const isPass = rigPostProcess.getEffectName() === "pass"; - if (isPass) { - cam.isIntermediate = this._postProcesses.length === 0; - } - cam._postProcesses = this._postProcesses.slice(0).concat(rigPostProcess); - rigPostProcess.markTextureDirty(); - } else { - cam._postProcesses = this._postProcesses.slice(0); - } - } + /** + * Gets a bone using its Id + * @param id defines the bone's Id + * @returns the bone or null if not found + * @deprecated Please use getBoneById instead + */ + getBoneByID(id) { + return this.getBoneById(id); } /** - * Attach a post process to the camera. - * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#attach-postprocess - * @param postProcess The post process to attach to the camera - * @param insertAt The position of the post process in case several of them are in use in the scene - * @returns the position the post process has been inserted at + * Gets a light node using its Id + * @param id defines the light's Id + * @returns the light or null if none found. + * @deprecated Please use getLightById instead */ - attachPostProcess(postProcess, insertAt = null) { - if (!postProcess.isReusable() && this._postProcesses.indexOf(postProcess) > -1) { - Logger.Error("You're trying to reuse a post process not defined as reusable."); - return 0; - } - if (insertAt == null || insertAt < 0) { - this._postProcesses.push(postProcess); - } else if (this._postProcesses[insertAt] === null) { - this._postProcesses[insertAt] = postProcess; - } else { - this._postProcesses.splice(insertAt, 0, postProcess); - } - this._cascadePostProcessesToRigCams(); - if (this._scene.prePassRenderer) { - this._scene.prePassRenderer.markAsDirty(); - } - return this._postProcesses.indexOf(postProcess); + getLightByID(id) { + return this.getLightById(id); } /** - * Detach a post process to the camera. - * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#attach-postprocess - * @param postProcess The post process to detach from the camera + * Gets a light node using its scene-generated unique Id + * @param uniqueId defines the light's unique Id + * @returns the light or null if none found. + * @deprecated Please use getLightByUniqueId instead */ - detachPostProcess(postProcess) { - const idx = this._postProcesses.indexOf(postProcess); - if (idx !== -1) { - this._postProcesses[idx] = null; - } - if (this._scene.prePassRenderer) { - this._scene.prePassRenderer.markAsDirty(); - } - this._cascadePostProcessesToRigCams(); + getLightByUniqueID(uniqueId) { + return this.getLightByUniqueId(uniqueId); } /** - * Gets the current world matrix of the camera - * @returns the world matrix + * Gets a particle system by Id + * @param id defines the particle system Id + * @returns the corresponding system or null if none found + * @deprecated Please use getParticleSystemById instead */ - getWorldMatrix() { - if (this._isSynchronizedViewMatrix()) { - return this._worldMatrix; - } - this.getViewMatrix(); - return this._worldMatrix; + getParticleSystemByID(id) { + return this.getParticleSystemById(id); } - /** @internal */ - _getViewMatrix() { - return Matrix.Identity(); + /** + * Gets a geometry using its Id + * @param id defines the geometry's Id + * @returns the geometry or null if none found. + * @deprecated Please use getGeometryById instead + */ + getGeometryByID(id) { + return this.getGeometryById(id); } /** - * Gets the current view matrix of the camera. - * @param force forces the camera to recompute the matrix without looking at the cached state - * @returns the view matrix + * Gets the first added mesh found of a given Id + * @param id defines the Id to search for + * @returns the mesh found or null if not found at all + * @deprecated Please use getMeshById instead */ - getViewMatrix(force) { - if (!force && this._isSynchronizedViewMatrix()) { - return this._computedViewMatrix; - } - this._hasMoved = true; - this.updateCache(); - this._computedViewMatrix = this._getViewMatrix(); - this._currentRenderId = this.getScene().getRenderId(); - this._childUpdateId++; - this._refreshFrustumPlanes = true; - if (this._cameraRigParams && this._cameraRigParams.vrPreViewMatrix) { - this._computedViewMatrix.multiplyToRef(this._cameraRigParams.vrPreViewMatrix, this._computedViewMatrix); - } - if (this.parent && this.parent.onViewMatrixChangedObservable) { - this.parent.onViewMatrixChangedObservable.notifyObservers(this.parent); - } - this.onViewMatrixChangedObservable.notifyObservers(this); - this._computedViewMatrix.invertToRef(this._worldMatrix); - return this._computedViewMatrix; + getMeshByID(id) { + return this.getMeshById(id); } /** - * Freeze the projection matrix. - * It will prevent the cache check of the camera projection compute and can speed up perf - * if no parameter of the camera are meant to change - * @param projection Defines manually a projection if necessary + * Gets a mesh with its auto-generated unique Id + * @param uniqueId defines the unique Id to search for + * @returns the found mesh or null if not found at all. + * @deprecated Please use getMeshByUniqueId instead */ - freezeProjectionMatrix(projection) { - this._doNotComputeProjectionMatrix = true; - if (projection !== void 0) { - this._projectionMatrix = projection; - } + getMeshByUniqueID(uniqueId) { + return this.getMeshByUniqueId(uniqueId); } /** - * Unfreeze the projection matrix if it has previously been freezed by freezeProjectionMatrix. + * Gets a the last added mesh using a given Id + * @param id defines the Id to search for + * @returns the found mesh or null if not found at all. + * @deprecated Please use getLastMeshById instead */ - unfreezeProjectionMatrix() { - this._doNotComputeProjectionMatrix = false; + getLastMeshByID(id) { + return this.getLastMeshById(id); } /** - * Gets the current projection matrix of the camera. - * @param force forces the camera to recompute the matrix without looking at the cached state - * @returns the projection matrix + * Gets a list of meshes using their Id + * @param id defines the Id to search for + * @returns a list of meshes + * @deprecated Please use getMeshesById instead */ - getProjectionMatrix(force) { - var _a, _b, _c; - if (this._doNotComputeProjectionMatrix || !force && this._isSynchronizedProjectionMatrix()) { - return this._projectionMatrix; - } - this._cache.mode = this.mode; - this._cache.minZ = this.minZ; - this._cache.maxZ = this.maxZ; - this._refreshFrustumPlanes = true; - const engine = this.getEngine(); - const scene = this.getScene(); - const reverseDepth = engine.useReverseDepthBuffer; - if (this.mode === _Camera.PERSPECTIVE_CAMERA) { - this._cache.fov = this.fov; - this._cache.fovMode = this.fovMode; - this._cache.aspectRatio = engine.getAspectRatio(this); - this._cache.projectionPlaneTilt = this.projectionPlaneTilt; - if (this.minZ <= 0) { - this.minZ = 0.1; - } - let getProjectionMatrix; - if (scene.useRightHandedSystem) { - getProjectionMatrix = Matrix.PerspectiveFovRHToRef; - } else { - getProjectionMatrix = Matrix.PerspectiveFovLHToRef; - } - getProjectionMatrix(this.fov, engine.getAspectRatio(this), reverseDepth ? this.maxZ : this.minZ, reverseDepth ? this.minZ : this.maxZ, this._projectionMatrix, this.fovMode === _Camera.FOVMODE_VERTICAL_FIXED, engine.isNDCHalfZRange, this.projectionPlaneTilt, reverseDepth); - } else { - const halfWidth = engine.getRenderWidth() / 2; - const halfHeight = engine.getRenderHeight() / 2; - if (scene.useRightHandedSystem) { - if (this.oblique) { - Matrix.ObliqueOffCenterRHToRef(this.orthoLeft ?? -halfWidth, this.orthoRight ?? halfWidth, this.orthoBottom ?? -halfHeight, this.orthoTop ?? halfHeight, reverseDepth ? this.maxZ : this.minZ, reverseDepth ? this.minZ : this.maxZ, this.oblique.length, this.oblique.angle, this._computeObliqueDistance(this.oblique.offset), this._projectionMatrix, engine.isNDCHalfZRange); - } else { - Matrix.OrthoOffCenterRHToRef(this.orthoLeft ?? -halfWidth, this.orthoRight ?? halfWidth, this.orthoBottom ?? -halfHeight, this.orthoTop ?? halfHeight, reverseDepth ? this.maxZ : this.minZ, reverseDepth ? this.minZ : this.maxZ, this._projectionMatrix, engine.isNDCHalfZRange); - } - } else { - if (this.oblique) { - Matrix.ObliqueOffCenterLHToRef(this.orthoLeft ?? -halfWidth, this.orthoRight ?? halfWidth, this.orthoBottom ?? -halfHeight, this.orthoTop ?? halfHeight, reverseDepth ? this.maxZ : this.minZ, reverseDepth ? this.minZ : this.maxZ, this.oblique.length, this.oblique.angle, this._computeObliqueDistance(this.oblique.offset), this._projectionMatrix, engine.isNDCHalfZRange); - } else { - Matrix.OrthoOffCenterLHToRef(this.orthoLeft ?? -halfWidth, this.orthoRight ?? halfWidth, this.orthoBottom ?? -halfHeight, this.orthoTop ?? halfHeight, reverseDepth ? this.maxZ : this.minZ, reverseDepth ? this.minZ : this.maxZ, this._projectionMatrix, engine.isNDCHalfZRange); - } - } - this._cache.orthoLeft = this.orthoLeft; - this._cache.orthoRight = this.orthoRight; - this._cache.orthoBottom = this.orthoBottom; - this._cache.orthoTop = this.orthoTop; - this._cache.obliqueAngle = (_a = this.oblique) == null ? void 0 : _a.angle; - this._cache.obliqueLength = (_b = this.oblique) == null ? void 0 : _b.length; - this._cache.obliqueOffset = (_c = this.oblique) == null ? void 0 : _c.offset; - this._cache.renderWidth = engine.getRenderWidth(); - this._cache.renderHeight = engine.getRenderHeight(); - } - this.onProjectionMatrixChangedObservable.notifyObservers(this); - return this._projectionMatrix; + getMeshesByID(id) { + return this.getMeshesById(id); } /** - * Gets the transformation matrix (ie. the multiplication of view by projection matrices) - * @returns a Matrix + * Gets the first added transform node found of a given Id + * @param id defines the Id to search for + * @returns the found transform node or null if not found at all. + * @deprecated Please use getTransformNodeById instead */ - getTransformationMatrix() { - this._computedViewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix); - return this._transformMatrix; + getTransformNodeByID(id) { + return this.getTransformNodeById(id); } - _computeObliqueDistance(offset) { - const arcRotateCamera = this; - const targetCamera = this; - return (arcRotateCamera.radius || (targetCamera.target ? Vector3.Distance(this.position, targetCamera.target) : this.position.length())) + offset; + /** + * Gets a transform node with its auto-generated unique Id + * @param uniqueId defines the unique Id to search for + * @returns the found transform node or null if not found at all. + * @deprecated Please use getTransformNodeByUniqueId instead + */ + getTransformNodeByUniqueID(uniqueId) { + return this.getTransformNodeByUniqueId(uniqueId); } - _updateFrustumPlanes() { - if (!this._refreshFrustumPlanes) { - return; - } - this.getTransformationMatrix(); - if (!this._frustumPlanes) { - this._frustumPlanes = Frustum.GetPlanes(this._transformMatrix); - } else { - Frustum.GetPlanesToRef(this._transformMatrix, this._frustumPlanes); - } - this._refreshFrustumPlanes = false; + /** + * Gets a list of transform nodes using their Id + * @param id defines the Id to search for + * @returns a list of transform nodes + * @deprecated Please use getTransformNodesById instead + */ + getTransformNodesByID(id) { + return this.getTransformNodesById(id); } /** - * Checks if a cullable object (mesh...) is in the camera frustum - * This checks the bounding box center. See isCompletelyInFrustum for a full bounding check - * @param target The object to check - * @param checkRigCameras If the rig cameras should be checked (eg. with VR camera both eyes should be checked) (Default: false) - * @returns true if the object is in frustum otherwise false + * Gets a node (Mesh, Camera, Light) using a given Id + * @param id defines the Id to search for + * @returns the found node or null if not found at all + * @deprecated Please use getNodeById instead */ - isInFrustum(target, checkRigCameras = false) { - this._updateFrustumPlanes(); - if (checkRigCameras && this.rigCameras.length > 0) { - let result = false; - this.rigCameras.forEach((cam) => { - cam._updateFrustumPlanes(); - result = result || target.isInFrustum(cam._frustumPlanes); - }); - return result; - } else { - return target.isInFrustum(this._frustumPlanes); - } + getNodeByID(id) { + return this.getNodeById(id); } /** - * Checks if a cullable object (mesh...) is in the camera frustum - * Unlike isInFrustum this checks the full bounding box - * @param target The object to check - * @returns true if the object is in frustum otherwise false + * Gets a the last added node (Mesh, Camera, Light) using a given Id + * @param id defines the Id to search for + * @returns the found node or null if not found at all + * @deprecated Please use getLastEntryById instead */ - isCompletelyInFrustum(target) { - this._updateFrustumPlanes(); - return target.isCompletelyInFrustum(this._frustumPlanes); + getLastEntryByID(id) { + return this.getLastEntryById(id); } - // eslint-disable-next-line jsdoc/require-returns-check /** - * Gets a ray in the forward direction from the camera. - * @param length Defines the length of the ray to create - * @param transform Defines the transform to apply to the ray, by default the world matrix is used to create a workd space ray - * @param origin Defines the start point of the ray which defaults to the camera position - * @returns the forward ray + * Gets a skeleton using a given Id (if many are found, this function will pick the last one) + * @param id defines the Id to search for + * @returns the found skeleton or null if not found at all. + * @deprecated Please use getLastSkeletonById instead */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getForwardRay(length = 100, transform, origin) { - throw _WarnImport("Ray"); + getLastSkeletonByID(id) { + return this.getLastSkeletonById(id); } - // eslint-disable-next-line jsdoc/require-returns-check +}; +Scene.FOGMODE_NONE = 0; +Scene.FOGMODE_EXP = 1; +Scene.FOGMODE_EXP2 = 2; +Scene.FOGMODE_LINEAR = 3; +Scene.MinDeltaTime = 1; +Scene.MaxDeltaTime = 1e3; + +// node_modules/@babylonjs/core/Misc/performanceMonitor.js +var PerformanceMonitor = class { /** - * Gets a ray in the forward direction from the camera. - * @param refRay the ray to (re)use when setting the values - * @param length Defines the length of the ray to create - * @param transform Defines the transform to apply to the ray, by default the world matrx is used to create a workd space ray - * @param origin Defines the start point of the ray which defaults to the camera position - * @returns the forward ray + * constructor + * @param frameSampleSize The number of samples required to saturate the sliding window */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getForwardRayToRef(refRay, length = 100, transform, origin) { - throw _WarnImport("Ray"); + constructor(frameSampleSize = 30) { + this._enabled = true; + this._rollingFrameTime = new RollingAverage(frameSampleSize); } /** - * Releases resources associated with this node. - * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default) - * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default) + * Samples current frame + * @param timeMs A timestamp in milliseconds of the current frame to compare with other frames */ - dispose(doNotRecurse, disposeMaterialAndTextures = false) { - this.onViewMatrixChangedObservable.clear(); - this.onProjectionMatrixChangedObservable.clear(); - this.onAfterCheckInputsObservable.clear(); - this.onRestoreStateObservable.clear(); - if (this.inputs) { - this.inputs.clear(); - } - this.getScene().stopAnimation(this); - this.getScene().removeCamera(this); - while (this._rigCameras.length > 0) { - const camera = this._rigCameras.pop(); - if (camera) { - camera.dispose(); - } - } - if (this._parentContainer) { - const index = this._parentContainer.cameras.indexOf(this); - if (index > -1) { - this._parentContainer.cameras.splice(index, 1); - } - this._parentContainer = null; - } - if (this._rigPostProcess) { - this._rigPostProcess.dispose(this); - this._rigPostProcess = null; - this._postProcesses.length = 0; - } else if (this.cameraRigMode !== _Camera.RIG_MODE_NONE) { - this._rigPostProcess = null; - this._postProcesses.length = 0; - } else { - let i2 = this._postProcesses.length; - while (--i2 >= 0) { - const postProcess = this._postProcesses[i2]; - if (postProcess) { - postProcess.dispose(this); - } - } + sampleFrame(timeMs = PrecisionDate.Now) { + if (!this._enabled) { + return; } - let i = this.customRenderTargets.length; - while (--i >= 0) { - this.customRenderTargets[i].dispose(); + if (this._lastFrameTimeMs != null) { + const dt = timeMs - this._lastFrameTimeMs; + this._rollingFrameTime.add(dt); } - this.customRenderTargets.length = 0; - this._activeMeshes.dispose(); - this.getScene().getEngine().releaseRenderPassId(this.renderPassId); - super.dispose(doNotRecurse, disposeMaterialAndTextures); + this._lastFrameTimeMs = timeMs; } /** - * Gets the left camera of a rig setup in case of Rigged Camera + * Returns the average frame time in milliseconds over the sliding window (or the subset of frames sampled so far) */ - get isLeftCamera() { - return this._isLeftCamera; + get averageFrameTime() { + return this._rollingFrameTime.average; } /** - * Gets the right camera of a rig setup in case of Rigged Camera + * Returns the variance frame time in milliseconds over the sliding window (or the subset of frames sampled so far) */ - get isRightCamera() { - return this._isRightCamera; + get averageFrameTimeVariance() { + return this._rollingFrameTime.variance; } /** - * Gets the left camera of a rig setup in case of Rigged Camera + * Returns the frame time of the most recent frame */ - get leftCamera() { - if (this._rigCameras.length < 1) { - return null; - } - return this._rigCameras[0]; + get instantaneousFrameTime() { + return this._rollingFrameTime.history(0); } /** - * Gets the right camera of a rig setup in case of Rigged Camera + * Returns the average framerate in frames per second over the sliding window (or the subset of frames sampled so far) */ - get rightCamera() { - if (this._rigCameras.length < 2) { - return null; - } - return this._rigCameras[1]; + get averageFPS() { + return 1e3 / this._rollingFrameTime.average; } /** - * Gets the left camera target of a rig setup in case of Rigged Camera - * @returns the target position + * Returns the average framerate in frames per second using the most recent frame time */ - getLeftTarget() { - if (this._rigCameras.length < 1) { - return null; + get instantaneousFPS() { + const history = this._rollingFrameTime.history(0); + if (history === 0) { + return 0; } - return this._rigCameras[0].getTarget(); + return 1e3 / history; } /** - * Gets the right camera target of a rig setup in case of Rigged Camera - * @returns the target position + * Returns true if enough samples have been taken to completely fill the sliding window */ - getRightTarget() { - if (this._rigCameras.length < 2) { - return null; - } - return this._rigCameras[1].getTarget(); + get isSaturated() { + return this._rollingFrameTime.isSaturated(); } /** - * @internal + * Enables contributions to the sliding window sample set */ - setCameraRigMode(mode, rigParams) { - if (this.cameraRigMode === mode) { - return; - } - while (this._rigCameras.length > 0) { - const camera = this._rigCameras.pop(); - if (camera) { - camera.dispose(); - } - } - this.cameraRigMode = mode; - this._cameraRigParams = {}; - this._cameraRigParams.interaxialDistance = rigParams.interaxialDistance || 0.0637; - this._cameraRigParams.stereoHalfAngle = Tools.ToRadians(this._cameraRigParams.interaxialDistance / 0.0637); - if (this.cameraRigMode !== _Camera.RIG_MODE_NONE) { - const leftCamera = this.createRigCamera(this.name + "_L", 0); - if (leftCamera) { - leftCamera._isLeftCamera = true; - } - const rightCamera = this.createRigCamera(this.name + "_R", 1); - if (rightCamera) { - rightCamera._isRightCamera = true; - } - if (leftCamera && rightCamera) { - this._rigCameras.push(leftCamera); - this._rigCameras.push(rightCamera); - } - } - this._setRigMode(rigParams); - this._cascadePostProcessesToRigCams(); - this.update(); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _setRigMode(rigParams) { - } - /** @internal */ - _getVRProjectionMatrix() { - Matrix.PerspectiveFovLHToRef(this._cameraRigParams.vrMetrics.aspectRatioFov, this._cameraRigParams.vrMetrics.aspectRatio, this.minZ, this.maxZ, this._cameraRigParams.vrWorkMatrix, true, this.getEngine().isNDCHalfZRange); - this._cameraRigParams.vrWorkMatrix.multiplyToRef(this._cameraRigParams.vrHMatrix, this._projectionMatrix); - return this._projectionMatrix; - } - /** - * @internal - */ - setCameraRigParameter(name69, value) { - if (!this._cameraRigParams) { - this._cameraRigParams = {}; - } - this._cameraRigParams[name69] = value; - if (name69 === "interaxialDistance") { - this._cameraRigParams.stereoHalfAngle = Tools.ToRadians(value / 0.0637); - } + enable() { + this._enabled = true; } /** - * needs to be overridden by children so sub has required properties to be copied - * @internal + * Disables contributions to the sliding window sample set + * Samples will not be interpolated over the disabled period */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - createRigCamera(name69, cameraIndex) { - return null; + disable() { + this._enabled = false; + this._lastFrameTimeMs = null; } /** - * May need to be overridden by children - * @internal + * Returns true if sampling is enabled */ - _updateRigCameras() { - for (let i = 0; i < this._rigCameras.length; i++) { - this._rigCameras[i].minZ = this.minZ; - this._rigCameras[i].maxZ = this.maxZ; - this._rigCameras[i].fov = this.fov; - this._rigCameras[i].upVector.copyFrom(this.upVector); - } - if (this.cameraRigMode === _Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH) { - this._rigCameras[0].viewport = this._rigCameras[1].viewport = this.viewport; - } - } - /** @internal */ - _setupInputs() { + get isEnabled() { + return this._enabled; } /** - * Serialiaze the camera setup to a json representation - * @returns the JSON representation + * Resets performance monitor */ - serialize() { - const serializationObject = SerializationHelper.Serialize(this); - serializationObject.uniqueId = this.uniqueId; - serializationObject.type = this.getClassName(); - if (this.parent) { - this.parent._serializeAsParent(serializationObject); - } - if (this.inputs) { - this.inputs.serialize(serializationObject); - } - SerializationHelper.AppendSerializedAnimations(this, serializationObject); - serializationObject.ranges = this.serializeAnimationRanges(); - serializationObject.isEnabled = this.isEnabled(); - return serializationObject; + reset() { + this._lastFrameTimeMs = null; + this._rollingFrameTime.reset(); } +}; +var RollingAverage = class { /** - * Clones the current camera. - * @param name The cloned camera name - * @param newParent The cloned camera's new parent (none by default) - * @returns the cloned camera + * constructor + * @param length The number of samples required to saturate the sliding window */ - clone(name69, newParent = null) { - const camera = SerializationHelper.Clone(_Camera.GetConstructorFromName(this.getClassName(), name69, this.getScene(), this.interaxialDistance, this.isStereoscopicSideBySide), this); - camera.name = name69; - camera.parent = newParent; - this.onClonedObservable.notifyObservers(camera); - return camera; + constructor(length) { + this._samples = new Array(length); + this.reset(); } /** - * Gets the direction of the camera relative to a given local axis. - * @param localAxis Defines the reference axis to provide a relative direction. - * @returns the direction + * Adds a sample to the sample set + * @param v The sample value */ - getDirection(localAxis) { - const result = Vector3.Zero(); - this.getDirectionToRef(localAxis, result); - return result; + add(v) { + let delta; + if (this.isSaturated()) { + const bottomValue = this._samples[this._pos]; + delta = bottomValue - this.average; + this.average -= delta / (this._sampleCount - 1); + this._m2 -= delta * (bottomValue - this.average); + } else { + this._sampleCount++; + } + delta = v - this.average; + this.average += delta / this._sampleCount; + this._m2 += delta * (v - this.average); + this.variance = this._m2 / (this._sampleCount - 1); + this._samples[this._pos] = v; + this._pos++; + this._pos %= this._samples.length; } /** - * Returns the current camera absolute rotation + * Returns previously added values or null if outside of history or outside the sliding window domain + * @param i Index in history. For example, pass 0 for the most recent value and 1 for the value before that + * @returns Value previously recorded with add() or null if outside of range */ - get absoluteRotation() { - this.getWorldMatrix().decompose(void 0, this._absoluteRotation); - return this._absoluteRotation; + history(i) { + if (i >= this._sampleCount || i >= this._samples.length) { + return 0; + } + const i0 = this._wrapPosition(this._pos - 1); + return this._samples[this._wrapPosition(i0 - i)]; } /** - * Gets the direction of the camera relative to a given local axis into a passed vector. - * @param localAxis Defines the reference axis to provide a relative direction. - * @param result Defines the vector to store the result in + * Returns true if enough samples have been taken to completely fill the sliding window + * @returns true if sample-set saturated */ - getDirectionToRef(localAxis, result) { - Vector3.TransformNormalToRef(localAxis, this.getWorldMatrix(), result); + isSaturated() { + return this._sampleCount >= this._samples.length; } /** - * Gets a camera constructor for a given camera type - * @param type The type of the camera to construct (should be equal to one of the camera class name) - * @param name The name of the camera the result will be able to instantiate - * @param scene The scene the result will construct the camera in - * @param interaxial_distance In case of stereoscopic setup, the distance between both eyes - * @param isStereoscopicSideBySide In case of stereoscopic setup, should the sereo be side b side - * @returns a factory method to construct the camera + * Resets the rolling average (equivalent to 0 samples taken so far) */ - // eslint-disable-next-line @typescript-eslint/naming-convention - static GetConstructorFromName(type, name69, scene, interaxial_distance = 0, isStereoscopicSideBySide = true) { - const constructorFunc = Node.Construct(type, name69, scene, { - // eslint-disable-next-line @typescript-eslint/naming-convention - interaxial_distance, - isStereoscopicSideBySide - }); - if (constructorFunc) { - return constructorFunc; - } - return () => _Camera._CreateDefaultParsedCamera(name69, scene); + reset() { + this.average = 0; + this.variance = 0; + this._sampleCount = 0; + this._pos = 0; + this._m2 = 0; } /** - * Compute the world matrix of the camera. - * @returns the camera world matrix + * Wraps a value around the sample range boundaries + * @param i Position in sample range, for example if the sample length is 5, and i is -3, then 2 will be returned. + * @returns Wrapped position in sample range */ - computeWorldMatrix() { - return this.getWorldMatrix(); + _wrapPosition(i) { + const max = this._samples.length; + return (i % max + max) % max; } - /** - * Parse a JSON and creates the camera from the parsed information - * @param parsedCamera The JSON to parse - * @param scene The scene to instantiate the camera in - * @returns the newly constructed camera - */ - static Parse(parsedCamera, scene) { - const type = parsedCamera.type; - const construct = _Camera.GetConstructorFromName(type, parsedCamera.name, scene, parsedCamera.interaxial_distance, parsedCamera.isStereoscopicSideBySide); - const camera = SerializationHelper.Parse(construct, parsedCamera, scene); - if (parsedCamera.parentId !== void 0) { - camera._waitingParentId = parsedCamera.parentId; - } - if (parsedCamera.parentInstanceIndex !== void 0) { - camera._waitingParentInstanceIndex = parsedCamera.parentInstanceIndex; - } - if (camera.inputs) { - camera.inputs.parse(parsedCamera); - camera._setupInputs(); +}; + +// node_modules/@babylonjs/core/Engines/Extensions/engine.readTexture.js +function allocateAndCopyTypedBuffer(type, sizeOrDstBuffer, sizeInBytes = false, copyBuffer) { + switch (type) { + case 3: { + const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Int8Array(sizeOrDstBuffer) : new Int8Array(sizeOrDstBuffer); + if (copyBuffer) { + buffer2.set(new Int8Array(copyBuffer)); + } + return buffer2; } - if (parsedCamera.upVector) { - camera.upVector = Vector3.FromArray(parsedCamera.upVector); + case 0: { + const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint8Array(sizeOrDstBuffer) : new Uint8Array(sizeOrDstBuffer); + if (copyBuffer) { + buffer2.set(new Uint8Array(copyBuffer)); + } + return buffer2; } - if (camera.setPosition) { - camera.position.copyFromFloats(0, 0, 0); - camera.setPosition(Vector3.FromArray(parsedCamera.position)); + case 4: { + const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Int16Array(sizeOrDstBuffer) : new Int16Array(sizeInBytes ? sizeOrDstBuffer / 2 : sizeOrDstBuffer); + if (copyBuffer) { + buffer2.set(new Int16Array(copyBuffer)); + } + return buffer2; } - if (parsedCamera.target) { - if (camera.setTarget) { - camera.setTarget(Vector3.FromArray(parsedCamera.target)); + case 5: + case 8: + case 9: + case 10: + case 2: { + const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint16Array(sizeOrDstBuffer) : new Uint16Array(sizeInBytes ? sizeOrDstBuffer / 2 : sizeOrDstBuffer); + if (copyBuffer) { + buffer2.set(new Uint16Array(copyBuffer)); } + return buffer2; } - if (parsedCamera.cameraRigMode) { - const rigParams = parsedCamera.interaxial_distance ? { interaxialDistance: parsedCamera.interaxial_distance } : {}; - camera.setCameraRigMode(parsedCamera.cameraRigMode, rigParams); + case 6: { + const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Int32Array(sizeOrDstBuffer) : new Int32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer); + if (copyBuffer) { + buffer2.set(new Int32Array(copyBuffer)); + } + return buffer2; } - if (parsedCamera.animations) { - for (let animationIndex = 0; animationIndex < parsedCamera.animations.length; animationIndex++) { - const parsedAnimation = parsedCamera.animations[animationIndex]; - const internalClass = GetClass("BABYLON.Animation"); - if (internalClass) { - camera.animations.push(internalClass.Parse(parsedAnimation)); - } + case 7: + case 11: + case 12: + case 13: + case 14: + case 15: { + const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint32Array(sizeOrDstBuffer) : new Uint32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer); + if (copyBuffer) { + buffer2.set(new Uint32Array(copyBuffer)); } - Node.ParseAnimationRanges(camera, parsedCamera, scene); + return buffer2; } - if (parsedCamera.autoAnimate) { - scene.beginAnimation(camera, parsedCamera.autoAnimateFrom, parsedCamera.autoAnimateTo, parsedCamera.autoAnimateLoop, parsedCamera.autoAnimateSpeed || 1); + case 1: { + const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Float32Array(sizeOrDstBuffer) : new Float32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer); + if (copyBuffer) { + buffer2.set(new Float32Array(copyBuffer)); + } + return buffer2; } - if (parsedCamera.isEnabled !== void 0) { - camera.setEnabled(parsedCamera.isEnabled); + } + const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint8Array(sizeOrDstBuffer) : new Uint8Array(sizeOrDstBuffer); + if (copyBuffer) { + buffer.set(new Uint8Array(copyBuffer)); + } + return buffer; +} +ThinEngine.prototype._readTexturePixelsSync = function(texture, width, height, faceIndex = -1, level = 0, buffer = null, flushRenderer = true, noDataConversion = false, x = 0, y = 0) { + var _a, _b; + const gl = this._gl; + if (!gl) { + throw new Error("Engine does not have gl rendering context."); + } + if (!this._dummyFramebuffer) { + const dummy = gl.createFramebuffer(); + if (!dummy) { + throw new Error("Unable to create dummy framebuffer"); } - return camera; + this._dummyFramebuffer = dummy; } - /** @internal */ - _calculateHandednessMultiplier() { - let handednessMultiplier = this.getScene().useRightHandedSystem ? -1 : 1; - if (this.parent && this.parent._getWorldMatrixDeterminant() < 0) { - handednessMultiplier *= -1; + gl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFramebuffer); + if (faceIndex > -1) { + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, (_a = texture._hardwareTexture) == null ? void 0 : _a.underlyingResource, level); + } else { + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, (_b = texture._hardwareTexture) == null ? void 0 : _b.underlyingResource, level); + } + let readType = texture.type !== void 0 ? this._getWebGLTextureType(texture.type) : gl.UNSIGNED_BYTE; + if (!noDataConversion) { + switch (readType) { + case gl.UNSIGNED_BYTE: + if (!buffer) { + buffer = new Uint8Array(4 * width * height); + } + readType = gl.UNSIGNED_BYTE; + break; + default: + if (!buffer) { + buffer = new Float32Array(4 * width * height); + } + readType = gl.FLOAT; + break; } - return handednessMultiplier; + } else if (!buffer) { + buffer = allocateAndCopyTypedBuffer(texture.type, 4 * width * height); + } + if (flushRenderer) { + this.flushFramebuffer(); } + gl.readPixels(x, y, width, height, gl.RGBA, readType, buffer); + gl.bindFramebuffer(gl.FRAMEBUFFER, this._currentFramebuffer); + return buffer; }; -Camera._CreateDefaultParsedCamera = (name69, scene) => { - throw _WarnImport("UniversalCamera"); +ThinEngine.prototype._readTexturePixels = function(texture, width, height, faceIndex = -1, level = 0, buffer = null, flushRenderer = true, noDataConversion = false, x = 0, y = 0) { + return Promise.resolve(this._readTexturePixelsSync(texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion, x, y)); }; -Camera.PERSPECTIVE_CAMERA = 0; -Camera.ORTHOGRAPHIC_CAMERA = 1; -Camera.FOVMODE_VERTICAL_FIXED = 0; -Camera.FOVMODE_HORIZONTAL_FIXED = 1; -Camera.RIG_MODE_NONE = 0; -Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH = 10; -Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL = 11; -Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED = 12; -Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER = 13; -Camera.RIG_MODE_STEREOSCOPIC_INTERLACED = 14; -Camera.RIG_MODE_VR = 20; -Camera.RIG_MODE_CUSTOM = 22; -Camera.ForceAttachControlToAlwaysPreventDefault = false; -__decorate([ - serializeAsVector3("position") -], Camera.prototype, "_position", void 0); -__decorate([ - serializeAsVector3("upVector") -], Camera.prototype, "_upVector", void 0); -__decorate([ - serialize() -], Camera.prototype, "orthoLeft", null); -__decorate([ - serialize() -], Camera.prototype, "orthoRight", null); -__decorate([ - serialize() -], Camera.prototype, "orthoBottom", null); -__decorate([ - serialize() -], Camera.prototype, "orthoTop", null); -__decorate([ - serialize() -], Camera.prototype, "fov", void 0); -__decorate([ - serialize() -], Camera.prototype, "projectionPlaneTilt", void 0); -__decorate([ - serialize() -], Camera.prototype, "minZ", void 0); -__decorate([ - serialize() -], Camera.prototype, "maxZ", void 0); -__decorate([ - serialize() -], Camera.prototype, "inertia", void 0); -__decorate([ - serialize() -], Camera.prototype, "mode", null); -__decorate([ - serialize() -], Camera.prototype, "layerMask", void 0); -__decorate([ - serialize() -], Camera.prototype, "fovMode", void 0); -__decorate([ - serialize() -], Camera.prototype, "cameraRigMode", void 0); -__decorate([ - serialize() -], Camera.prototype, "interaxialDistance", void 0); -__decorate([ - serialize() -], Camera.prototype, "isStereoscopicSideBySide", void 0); -// node_modules/@babylonjs/core/Collisions/intersectionInfo.js -var IntersectionInfo = class { - constructor(bu, bv, distance) { - this.bu = bu; - this.bv = bv; - this.distance = distance; - this.faceId = 0; - this.subMeshId = 0; - } +// node_modules/@babylonjs/core/Engines/Extensions/engine.alpha.js +ThinEngine.prototype.setAlphaConstants = function(r, g, b, a) { + this._alphaState.setAlphaBlendConstants(r, g, b, a); }; - -// node_modules/@babylonjs/core/Culling/boundingBox.js -var BoundingBox = class _BoundingBox { - /** - * Creates a new bounding box - * @param min defines the minimum vector (in local space) - * @param max defines the maximum vector (in local space) - * @param worldMatrix defines the new world matrix - */ - constructor(min, max, worldMatrix) { - this.vectors = ArrayTools.BuildArray(8, Vector3.Zero); - this.center = Vector3.Zero(); - this.centerWorld = Vector3.Zero(); - this.extendSize = Vector3.Zero(); - this.extendSizeWorld = Vector3.Zero(); - this.directions = ArrayTools.BuildArray(3, Vector3.Zero); - this.vectorsWorld = ArrayTools.BuildArray(8, Vector3.Zero); - this.minimumWorld = Vector3.Zero(); - this.maximumWorld = Vector3.Zero(); - this.minimum = Vector3.Zero(); - this.maximum = Vector3.Zero(); - this._drawWrapperFront = null; - this._drawWrapperBack = null; - this.reConstruct(min, max, worldMatrix); - } - // Methods - /** - * Recreates the entire bounding box from scratch as if we call the constructor in place - * @param min defines the new minimum vector (in local space) - * @param max defines the new maximum vector (in local space) - * @param worldMatrix defines the new world matrix - */ - reConstruct(min, max, worldMatrix) { - const minX = min.x, minY = min.y, minZ = min.z, maxX = max.x, maxY = max.y, maxZ = max.z; - const vectors = this.vectors; - this.minimum.copyFromFloats(minX, minY, minZ); - this.maximum.copyFromFloats(maxX, maxY, maxZ); - vectors[0].copyFromFloats(minX, minY, minZ); - vectors[1].copyFromFloats(maxX, maxY, maxZ); - vectors[2].copyFromFloats(maxX, minY, minZ); - vectors[3].copyFromFloats(minX, maxY, minZ); - vectors[4].copyFromFloats(minX, minY, maxZ); - vectors[5].copyFromFloats(maxX, maxY, minZ); - vectors[6].copyFromFloats(minX, maxY, maxZ); - vectors[7].copyFromFloats(maxX, minY, maxZ); - max.addToRef(min, this.center).scaleInPlace(0.5); - max.subtractToRef(min, this.extendSize).scaleInPlace(0.5); - this._worldMatrix = worldMatrix || Matrix.IdentityReadOnly; - this._update(this._worldMatrix); - } - /** - * Scale the current bounding box by applying a scale factor - * @param factor defines the scale factor to apply - * @returns the current bounding box - */ - scale(factor) { - const tmpVectors = _BoundingBox._TmpVector3; - const diff = this.maximum.subtractToRef(this.minimum, tmpVectors[0]); - const len = diff.length(); - diff.normalizeFromLength(len); - const distance = len * factor; - const newRadius = diff.scaleInPlace(distance * 0.5); - const min = this.center.subtractToRef(newRadius, tmpVectors[1]); - const max = this.center.addToRef(newRadius, tmpVectors[2]); - this.reConstruct(min, max, this._worldMatrix); - return this; - } - /** - * Gets the world matrix of the bounding box - * @returns a matrix - */ - getWorldMatrix() { - return this._worldMatrix; - } - /** - * @internal - */ - _update(world) { - const minWorld = this.minimumWorld; - const maxWorld = this.maximumWorld; - const directions = this.directions; - const vectorsWorld = this.vectorsWorld; - const vectors = this.vectors; - if (!world.isIdentity()) { - minWorld.setAll(Number.MAX_VALUE); - maxWorld.setAll(-Number.MAX_VALUE); - for (let index = 0; index < 8; ++index) { - const v = vectorsWorld[index]; - Vector3.TransformCoordinatesToRef(vectors[index], world, v); - minWorld.minimizeInPlace(v); - maxWorld.maximizeInPlace(v); - } - maxWorld.subtractToRef(minWorld, this.extendSizeWorld).scaleInPlace(0.5); - maxWorld.addToRef(minWorld, this.centerWorld).scaleInPlace(0.5); - } else { - minWorld.copyFrom(this.minimum); - maxWorld.copyFrom(this.maximum); - for (let index = 0; index < 8; ++index) { - vectorsWorld[index].copyFrom(vectors[index]); +ThinEngine.prototype.setAlphaMode = function(mode, noDepthWriteChange = false) { + if (this._alphaMode === mode) { + if (!noDepthWriteChange) { + const depthMask = mode === 0; + if (this.depthCullingState.depthMask !== depthMask) { + this.depthCullingState.depthMask = depthMask; } - this.extendSizeWorld.copyFrom(this.extendSize); - this.centerWorld.copyFrom(this.center); } - Vector3.FromArrayToRef(world.m, 0, directions[0]); - Vector3.FromArrayToRef(world.m, 4, directions[1]); - Vector3.FromArrayToRef(world.m, 8, directions[2]); - this._worldMatrix = world; + return; } - /** - * Tests if the bounding box is intersecting the frustum planes - * @param frustumPlanes defines the frustum planes to test - * @returns true if there is an intersection - */ - isInFrustum(frustumPlanes) { - return _BoundingBox.IsInFrustum(this.vectorsWorld, frustumPlanes); + switch (mode) { + case 0: + this._alphaState.alphaBlend = false; + break; + case 7: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE); + this._alphaState.alphaBlend = true; + break; + case 8: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA); + this._alphaState.alphaBlend = true; + break; + case 2: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE); + this._alphaState.alphaBlend = true; + break; + case 6: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ZERO, this._gl.ONE); + this._alphaState.alphaBlend = true; + break; + case 1: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ONE); + this._alphaState.alphaBlend = true; + break; + case 3: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.ZERO, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE); + this._alphaState.alphaBlend = true; + break; + case 4: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_COLOR, this._gl.ZERO, this._gl.ONE, this._gl.ONE); + this._alphaState.alphaBlend = true; + break; + case 5: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE); + this._alphaState.alphaBlend = true; + break; + case 9: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.CONSTANT_COLOR, this._gl.ONE_MINUS_CONSTANT_COLOR, this._gl.CONSTANT_ALPHA, this._gl.ONE_MINUS_CONSTANT_ALPHA); + this._alphaState.alphaBlend = true; + break; + case 10: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA); + this._alphaState.alphaBlend = true; + break; + case 11: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ONE); + this._alphaState.alphaBlend = true; + break; + case 12: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ZERO); + this._alphaState.alphaBlend = true; + break; + case 13: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE_MINUS_DST_COLOR, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE_MINUS_DST_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA); + this._alphaState.alphaBlend = true; + break; + case 14: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA); + this._alphaState.alphaBlend = true; + break; + case 15: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ZERO); + this._alphaState.alphaBlend = true; + break; + case 16: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE_MINUS_DST_COLOR, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ZERO, this._gl.ONE); + this._alphaState.alphaBlend = true; + break; + case 17: + this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA); + this._alphaState.alphaBlend = true; + break; } - /** - * Tests if the bounding box is entirely inside the frustum planes - * @param frustumPlanes defines the frustum planes to test - * @returns true if there is an inclusion - */ - isCompletelyInFrustum(frustumPlanes) { - return _BoundingBox.IsCompletelyInFrustum(this.vectorsWorld, frustumPlanes); + if (!noDepthWriteChange) { + this.depthCullingState.depthMask = mode === 0; } - /** - * Tests if a point is inside the bounding box - * @param point defines the point to test - * @returns true if the point is inside the bounding box - */ - intersectsPoint(point) { - const min = this.minimumWorld; - const max = this.maximumWorld; - const minX = min.x, minY = min.y, minZ = min.z, maxX = max.x, maxY = max.y, maxZ = max.z; - const pointX = point.x, pointY = point.y, pointZ = point.z; - const delta = -Epsilon; - if (maxX - pointX < delta || delta > pointX - minX) { - return false; - } - if (maxY - pointY < delta || delta > pointY - minY) { - return false; + this._alphaMode = mode; +}; +ThinEngine.prototype.getAlphaMode = function() { + return this._alphaMode; +}; +ThinEngine.prototype.setAlphaEquation = function(equation) { + if (this._alphaEquation === equation) { + return; + } + switch (equation) { + case 0: + this._alphaState.setAlphaEquationParameters(32774, 32774); + break; + case 1: + this._alphaState.setAlphaEquationParameters(32778, 32778); + break; + case 2: + this._alphaState.setAlphaEquationParameters(32779, 32779); + break; + case 3: + this._alphaState.setAlphaEquationParameters(32776, 32776); + break; + case 4: + this._alphaState.setAlphaEquationParameters(32775, 32775); + break; + case 5: + this._alphaState.setAlphaEquationParameters(32775, 32774); + break; + } + this._alphaEquation = equation; +}; +ThinEngine.prototype.getAlphaEquation = function() { + return this._alphaEquation; +}; + +// node_modules/@babylonjs/core/Engines/Extensions/engine.dynamicBuffer.js +ThinEngine.prototype.updateDynamicIndexBuffer = function(indexBuffer, indices, offset = 0) { + this._currentBoundBuffer[this._gl.ELEMENT_ARRAY_BUFFER] = null; + this.bindIndexBuffer(indexBuffer); + let view; + if (indexBuffer.is32Bits) { + view = indices instanceof Uint32Array ? indices : new Uint32Array(indices); + } else { + view = indices instanceof Uint16Array ? indices : new Uint16Array(indices); + } + this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, view, this._gl.DYNAMIC_DRAW); + this._resetIndexBufferBinding(); +}; +ThinEngine.prototype.updateDynamicVertexBuffer = function(vertexBuffer, data, byteOffset, byteLength) { + this.bindArrayBuffer(vertexBuffer); + if (byteOffset === void 0) { + byteOffset = 0; + } + const dataLength = data.byteLength || data.length; + if (byteLength === void 0 || byteLength >= dataLength && byteOffset === 0) { + if (data instanceof Array) { + this._gl.bufferSubData(this._gl.ARRAY_BUFFER, byteOffset, new Float32Array(data)); + } else { + this._gl.bufferSubData(this._gl.ARRAY_BUFFER, byteOffset, data); } - if (maxZ - pointZ < delta || delta > pointZ - minZ) { - return false; + } else { + if (data instanceof Array) { + this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, new Float32Array(data).subarray(byteOffset, byteOffset + byteLength)); + } else { + if (data instanceof ArrayBuffer) { + data = new Uint8Array(data, byteOffset, byteLength); + } else { + data = new Uint8Array(data.buffer, data.byteOffset + byteOffset, byteLength); + } + this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data); } - return true; } + this._resetVertexBufferBinding(); +}; + +// node_modules/@babylonjs/core/Engines/engine.js +var Engine = class _Engine extends ThinEngine { /** - * Tests if the bounding box intersects with a bounding sphere - * @param sphere defines the sphere to test - * @returns true if there is an intersection + * Returns the current npm package of the sdk */ - intersectsSphere(sphere) { - return _BoundingBox.IntersectsSphere(this.minimumWorld, this.maximumWorld, sphere.centerWorld, sphere.radiusWorld); + // Not mixed with Version for tooling purpose. + static get NpmPackage() { + return ThinEngine.NpmPackage; } /** - * Tests if the bounding box intersects with a box defined by a min and max vectors - * @param min defines the min vector to use - * @param max defines the max vector to use - * @returns true if there is an intersection + * Returns the current version of the framework */ - intersectsMinMax(min, max) { - const myMin = this.minimumWorld; - const myMax = this.maximumWorld; - const myMinX = myMin.x, myMinY = myMin.y, myMinZ = myMin.z, myMaxX = myMax.x, myMaxY = myMax.y, myMaxZ = myMax.z; - const minX = min.x, minY = min.y, minZ = min.z, maxX = max.x, maxY = max.y, maxZ = max.z; - if (myMaxX < minX || myMinX > maxX) { - return false; - } - if (myMaxY < minY || myMinY > maxY) { - return false; - } - if (myMaxZ < minZ || myMinZ > maxZ) { - return false; - } - return true; + static get Version() { + return ThinEngine.Version; + } + /** Gets the list of created engines */ + static get Instances() { + return EngineStore.Instances; } /** - * Disposes the resources of the class + * Gets the latest created engine */ - dispose() { - var _a, _b; - (_a = this._drawWrapperFront) == null ? void 0 : _a.dispose(); - (_b = this._drawWrapperBack) == null ? void 0 : _b.dispose(); + static get LastCreatedEngine() { + return EngineStore.LastCreatedEngine; } - // Statics /** - * Tests if two bounding boxes are intersections - * @param box0 defines the first box to test - * @param box1 defines the second box to test - * @returns true if there is an intersection + * Gets the latest created scene */ - static Intersects(box0, box1) { - return box0.intersectsMinMax(box1.minimumWorld, box1.maximumWorld); + static get LastCreatedScene() { + return EngineStore.LastCreatedScene; } + /** @internal */ /** - * Tests if a bounding box defines by a min/max vectors intersects a sphere - * @param minPoint defines the minimum vector of the bounding box - * @param maxPoint defines the maximum vector of the bounding box - * @param sphereCenter defines the sphere center - * @param sphereRadius defines the sphere radius - * @returns true if there is an intersection + * Engine abstraction for loading and creating an image bitmap from a given source string. + * @param imageSource source to load the image from. + * @param options An object that sets options for the image's extraction. + * @returns ImageBitmap. */ - static IntersectsSphere(minPoint, maxPoint, sphereCenter, sphereRadius) { - const vector = _BoundingBox._TmpVector3[0]; - Vector3.ClampToRef(sphereCenter, minPoint, maxPoint, vector); - const num = Vector3.DistanceSquared(sphereCenter, vector); - return num <= sphereRadius * sphereRadius; + _createImageBitmapFromSource(imageSource, options) { + const promise = new Promise((resolve, reject) => { + const image = new Image(); + image.onload = () => { + image.decode().then(() => { + this.createImageBitmap(image, options).then((imageBitmap) => { + resolve(imageBitmap); + }); + }); + }; + image.onerror = () => { + reject(`Error loading image ${image.src}`); + }; + image.src = imageSource; + }); + return promise; } /** - * Tests if a bounding box defined with 8 vectors is entirely inside frustum planes - * @param boundingVectors defines an array of 8 vectors representing a bounding box - * @param frustumPlanes defines the frustum planes to test - * @returns true if there is an inclusion + * Engine abstraction for createImageBitmap + * @param image source for image + * @param options An object that sets options for the image's extraction. + * @returns ImageBitmap */ - static IsCompletelyInFrustum(boundingVectors, frustumPlanes) { - for (let p = 0; p < 6; ++p) { - const frustumPlane = frustumPlanes[p]; - for (let i = 0; i < 8; ++i) { - if (frustumPlane.dotCoordinate(boundingVectors[i]) < 0) { - return false; - } - } - } - return true; + createImageBitmap(image, options) { + return createImageBitmap(image, options); } /** - * Tests if a bounding box defined with 8 vectors intersects frustum planes - * @param boundingVectors defines an array of 8 vectors representing a bounding box - * @param frustumPlanes defines the frustum planes to test - * @returns true if there is an intersection + * Resize an image and returns the image data as an uint8array + * @param image image to resize + * @param bufferWidth destination buffer width + * @param bufferHeight destination buffer height + * @returns an uint8array containing RGBA values of bufferWidth * bufferHeight size */ - static IsInFrustum(boundingVectors, frustumPlanes) { - for (let p = 0; p < 6; ++p) { - let canReturnFalse = true; - const frustumPlane = frustumPlanes[p]; - for (let i = 0; i < 8; ++i) { - if (frustumPlane.dotCoordinate(boundingVectors[i]) >= 0) { - canReturnFalse = false; - break; - } - } - if (canReturnFalse) { - return false; - } + resizeImageBitmap(image, bufferWidth, bufferHeight) { + const canvas = this.createCanvas(bufferWidth, bufferHeight); + const context = canvas.getContext("2d"); + if (!context) { + throw new Error("Unable to get 2d context for resizeImageBitmap"); } - return true; + context.drawImage(image, 0, 0); + const buffer = context.getImageData(0, 0, bufferWidth, bufferHeight).data; + return buffer; } -}; -BoundingBox._TmpVector3 = ArrayTools.BuildArray(3, Vector3.Zero); - -// node_modules/@babylonjs/core/Culling/boundingSphere.js -var BoundingSphere = class _BoundingSphere { /** - * Creates a new bounding sphere - * @param min defines the minimum vector (in local space) - * @param max defines the maximum vector (in local space) - * @param worldMatrix defines the new world matrix + * Will flag all materials in all scenes in all engines as dirty to trigger new shader compilation + * @param flag defines which part of the materials must be marked as dirty + * @param predicate defines a predicate used to filter which materials should be affected */ - constructor(min, max, worldMatrix) { - this.center = Vector3.Zero(); - this.centerWorld = Vector3.Zero(); - this.minimum = Vector3.Zero(); - this.maximum = Vector3.Zero(); - this.reConstruct(min, max, worldMatrix); + static MarkAllMaterialsAsDirty(flag, predicate) { + for (let engineIndex = 0; engineIndex < _Engine.Instances.length; engineIndex++) { + const engine = _Engine.Instances[engineIndex]; + for (let sceneIndex = 0; sceneIndex < engine.scenes.length; sceneIndex++) { + engine.scenes[sceneIndex].markAllMaterialsAsDirty(flag, predicate); + } + } } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Recreates the entire bounding sphere from scratch as if we call the constructor in place - * @param min defines the new minimum vector (in local space) - * @param max defines the new maximum vector (in local space) - * @param worldMatrix defines the new world matrix + * Method called to create the default loading screen. + * This can be overridden in your own app. + * @param canvas The rendering canvas element + * @returns The loading screen */ - reConstruct(min, max, worldMatrix) { - this.minimum.copyFrom(min); - this.maximum.copyFrom(max); - const distance = Vector3.Distance(min, max); - max.addToRef(min, this.center).scaleInPlace(0.5); - this.radius = distance * 0.5; - this._update(worldMatrix || Matrix.IdentityReadOnly); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + static DefaultLoadingScreenFactory(canvas) { + throw _WarnImport("LoadingScreen"); } - /** - * Scale the current bounding sphere by applying a scale factor - * @param factor defines the scale factor to apply - * @returns the current bounding box - */ - scale(factor) { - const newRadius = this.radius * factor; - const tmpVectors = _BoundingSphere._TmpVector3; - const tempRadiusVector = tmpVectors[0].setAll(newRadius); - const min = this.center.subtractToRef(tempRadiusVector, tmpVectors[1]); - const max = this.center.addToRef(tempRadiusVector, tmpVectors[2]); - this.reConstruct(min, max, this._worldMatrix); - return this; + get _supportsHardwareTextureRescaling() { + return !!_Engine._RescalePostProcessFactory; } /** - * Gets the world matrix of the bounding box - * @returns a matrix + * Gets the performance monitor attached to this engine + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation */ - getWorldMatrix() { - return this._worldMatrix; + get performanceMonitor() { + return this._performanceMonitor; } - // Methods /** - * @internal + * (WebGPU only) True (default) to be in compatibility mode, meaning rendering all existing scenes without artifacts (same rendering than WebGL). + * Setting the property to false will improve performances but may not work in some scenes if some precautions are not taken. + * See https://doc.babylonjs.com/setup/support/webGPU/webGPUOptimization/webGPUNonCompatibilityMode for more details */ - _update(worldMatrix) { - if (!worldMatrix.isIdentity()) { - Vector3.TransformCoordinatesToRef(this.center, worldMatrix, this.centerWorld); - const tempVector = _BoundingSphere._TmpVector3[0]; - Vector3.TransformNormalFromFloatsToRef(1, 1, 1, worldMatrix, tempVector); - this.radiusWorld = Math.max(Math.abs(tempVector.x), Math.abs(tempVector.y), Math.abs(tempVector.z)) * this.radius; - } else { - this.centerWorld.copyFrom(this.center); - this.radiusWorld = this.radius; - } + get compatibilityMode() { + return this._compatibilityMode; } - /** - * Tests if the bounding sphere is intersecting the frustum planes - * @param frustumPlanes defines the frustum planes to test - * @returns true if there is an intersection - */ - isInFrustum(frustumPlanes) { - const center = this.centerWorld; - const radius = this.radiusWorld; - for (let i = 0; i < 6; i++) { - if (frustumPlanes[i].dotCoordinate(center) <= -radius) { - return false; - } - } - return true; + set compatibilityMode(mode) { + this._compatibilityMode = true; } + // Events /** - * Tests if the bounding sphere center is in between the frustum planes. - * Used for optimistic fast inclusion. - * @param frustumPlanes defines the frustum planes to test - * @returns true if the sphere center is in between the frustum planes + * Gets the HTML element used to attach event listeners + * @returns a HTML element */ - isCenterInFrustum(frustumPlanes) { - const center = this.centerWorld; - for (let i = 0; i < 6; i++) { - if (frustumPlanes[i].dotCoordinate(center) < 0) { - return false; - } - } - return true; + getInputElement() { + return this._renderingCanvas; } /** - * Tests if a point is inside the bounding sphere - * @param point defines the point to test - * @returns true if the point is inside the bounding sphere + * Creates a new engine + * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which already used the WebGL context + * @param antialias defines enable antialiasing (default: false) + * @param options defines further options to be sent to the getContext() function + * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false) */ - intersectsPoint(point) { - const squareDistance = Vector3.DistanceSquared(this.centerWorld, point); - if (this.radiusWorld * this.radiusWorld < squareDistance) { - return false; + constructor(canvasOrContext, antialias, options, adaptToDeviceRatio = false) { + super(canvasOrContext, antialias, options, adaptToDeviceRatio); + this.enableOfflineSupport = false; + this.disableManifestCheck = false; + this.disableContextMenu = true; + this.scenes = []; + this._virtualScenes = new Array(); + this.onNewSceneAddedObservable = new Observable(); + this.postProcesses = []; + this.isPointerLock = false; + this.onResizeObservable = new Observable(); + this.onCanvasBlurObservable = new Observable(); + this.onCanvasFocusObservable = new Observable(); + this.onCanvasPointerOutObservable = new Observable(); + this.onBeginFrameObservable = new Observable(); + this.customAnimationFrameRequester = null; + this.onEndFrameObservable = new Observable(); + this.onBeforeShaderCompilationObservable = new Observable(); + this.onAfterShaderCompilationObservable = new Observable(); + this._deterministicLockstep = false; + this._lockstepMaxSteps = 4; + this._timeStep = 1 / 60; + this._fps = 60; + this._deltaTime = 0; + this._drawCalls = new PerfCounter(); + this.canvasTabIndex = 1; + this.disablePerformanceMonitorInBackground = false; + this._performanceMonitor = new PerformanceMonitor(); + this._compatibilityMode = true; + this.currentRenderPassId = 0; + this._renderPassNames = ["main"]; + _Engine.Instances.push(this); + if (!canvasOrContext) { + return; } - return true; - } - // Statics - /** - * Checks if two sphere intersect - * @param sphere0 sphere 0 - * @param sphere1 sphere 1 - * @returns true if the spheres intersect - */ - static Intersects(sphere0, sphere1) { - const squareDistance = Vector3.DistanceSquared(sphere0.centerWorld, sphere1.centerWorld); - const radiusSum = sphere0.radiusWorld + sphere1.radiusWorld; - if (radiusSum * radiusSum < squareDistance) { - return false; + this._features.supportRenderPasses = true; + options = this._creationOptions; + if (canvasOrContext.getContext) { + const canvas = canvasOrContext; + this._sharedInit(canvas); } - return true; + } + _initGLContext() { + super._initGLContext(); + this._rescalePostProcess = null; } /** - * Creates a sphere from a center and a radius - * @param center The center - * @param radius radius - * @param matrix Optional worldMatrix - * @returns The sphere + * Shared initialization across engines types. + * @param canvas The canvas associated with this instance of the engine. */ - static CreateFromCenterAndRadius(center, radius, matrix) { - this._TmpVector3[0].copyFrom(center); - this._TmpVector3[1].copyFromFloats(0, 0, radius); - this._TmpVector3[2].copyFrom(center); - this._TmpVector3[0].addInPlace(this._TmpVector3[1]); - this._TmpVector3[2].subtractInPlace(this._TmpVector3[1]); - const sphere = new _BoundingSphere(this._TmpVector3[0], this._TmpVector3[2]); - if (matrix) { - sphere._worldMatrix = matrix; - } else { - sphere._worldMatrix = Matrix.Identity(); + _sharedInit(canvas) { + super._sharedInit(canvas); + this._onCanvasFocus = () => { + this.onCanvasFocusObservable.notifyObservers(this); + }; + this._onCanvasBlur = () => { + this.onCanvasBlurObservable.notifyObservers(this); + }; + this._onCanvasContextMenu = (evt) => { + if (this.disableContextMenu) { + evt.preventDefault(); + } + }; + canvas.addEventListener("focus", this._onCanvasFocus); + canvas.addEventListener("blur", this._onCanvasBlur); + canvas.addEventListener("contextmenu", this._onCanvasContextMenu); + this._onBlur = () => { + if (this.disablePerformanceMonitorInBackground) { + this._performanceMonitor.disable(); + } + this._windowIsBackground = true; + }; + this._onFocus = () => { + if (this.disablePerformanceMonitorInBackground) { + this._performanceMonitor.enable(); + } + this._windowIsBackground = false; + }; + this._onCanvasPointerOut = (ev) => { + if (document.elementFromPoint(ev.clientX, ev.clientY) !== canvas) { + this.onCanvasPointerOutObservable.notifyObservers(ev); + } + }; + const hostWindow = this.getHostWindow(); + if (hostWindow && typeof hostWindow.addEventListener === "function") { + hostWindow.addEventListener("blur", this._onBlur); + hostWindow.addEventListener("focus", this._onFocus); } - return sphere; + canvas.addEventListener("pointerout", this._onCanvasPointerOut); + if (!this._creationOptions.doNotHandleTouchAction) { + this._disableTouchAction(); + } + if (!_Engine.audioEngine && this._creationOptions.audioEngine && _Engine.AudioEngineFactory) { + _Engine.audioEngine = _Engine.AudioEngineFactory(this.getRenderingCanvas(), this.getAudioContext(), this.getAudioDestination()); + } + if (IsDocumentAvailable()) { + this._onFullscreenChange = () => { + this.isFullscreen = !!document.fullscreenElement; + if (this.isFullscreen && this._pointerLockRequested && canvas) { + _Engine._RequestPointerlock(canvas); + } + }; + document.addEventListener("fullscreenchange", this._onFullscreenChange, false); + document.addEventListener("webkitfullscreenchange", this._onFullscreenChange, false); + this._onPointerLockChange = () => { + this.isPointerLock = document.pointerLockElement === canvas; + }; + document.addEventListener("pointerlockchange", this._onPointerLockChange, false); + document.addEventListener("webkitpointerlockchange", this._onPointerLockChange, false); + } + this.enableOfflineSupport = _Engine.OfflineProviderFactory !== void 0; + this._deterministicLockstep = !!this._creationOptions.deterministicLockstep; + this._lockstepMaxSteps = this._creationOptions.lockstepMaxSteps || 0; + this._timeStep = this._creationOptions.timeStep || 1 / 60; + } + /** @internal */ + _verifyPointerLock() { + var _a; + (_a = this._onPointerLockChange) == null ? void 0 : _a.call(this); } -}; -BoundingSphere._TmpVector3 = ArrayTools.BuildArray(3, Vector3.Zero); - -// node_modules/@babylonjs/core/Culling/boundingInfo.js -var _result0 = { min: 0, max: 0 }; -var _result1 = { min: 0, max: 0 }; -var computeBoxExtents = (axis, box, result) => { - const p = Vector3.Dot(box.centerWorld, axis); - const r0 = Math.abs(Vector3.Dot(box.directions[0], axis)) * box.extendSize.x; - const r1 = Math.abs(Vector3.Dot(box.directions[1], axis)) * box.extendSize.y; - const r2 = Math.abs(Vector3.Dot(box.directions[2], axis)) * box.extendSize.z; - const r = r0 + r1 + r2; - result.min = p - r; - result.max = p + r; -}; -var axisOverlap = (axis, box0, box1) => { - computeBoxExtents(axis, box0, _result0); - computeBoxExtents(axis, box1, _result1); - return !(_result0.min > _result1.max || _result1.min > _result0.max); -}; -var BoundingInfo = class _BoundingInfo { /** - * Constructs bounding info - * @param minimum min vector of the bounding box/sphere - * @param maximum max vector of the bounding box/sphere - * @param worldMatrix defines the new world matrix + * Gets current aspect ratio + * @param viewportOwner defines the camera to use to get the aspect ratio + * @param useScreen defines if screen size must be used (or the current render target if any) + * @returns a number defining the aspect ratio */ - constructor(minimum, maximum, worldMatrix) { - this._isLocked = false; - this.boundingBox = new BoundingBox(minimum, maximum, worldMatrix); - this.boundingSphere = new BoundingSphere(minimum, maximum, worldMatrix); + getAspectRatio(viewportOwner, useScreen = false) { + const viewport = viewportOwner.viewport; + return this.getRenderWidth(useScreen) * viewport.width / (this.getRenderHeight(useScreen) * viewport.height); } /** - * Recreates the entire bounding info from scratch as if we call the constructor in place - * @param min defines the new minimum vector (in local space) - * @param max defines the new maximum vector (in local space) - * @param worldMatrix defines the new world matrix + * Gets current screen aspect ratio + * @returns a number defining the aspect ratio */ - reConstruct(min, max, worldMatrix) { - this.boundingBox.reConstruct(min, max, worldMatrix); - this.boundingSphere.reConstruct(min, max, worldMatrix); + getScreenAspectRatio() { + return this.getRenderWidth(true) / this.getRenderHeight(true); } /** - * min vector of the bounding box/sphere + * Gets the client rect of the HTML canvas attached with the current webGL context + * @returns a client rectangle */ - get minimum() { - return this.boundingBox.minimum; + getRenderingCanvasClientRect() { + if (!this._renderingCanvas) { + return null; + } + return this._renderingCanvas.getBoundingClientRect(); } /** - * max vector of the bounding box/sphere + * Gets the client rect of the HTML element used for events + * @returns a client rectangle */ - get maximum() { - return this.boundingBox.maximum; + getInputElementClientRect() { + if (!this._renderingCanvas) { + return null; + } + return this.getInputElement().getBoundingClientRect(); } /** - * If the info is locked and won't be updated to avoid perf overhead + * Gets a boolean indicating that the engine is running in deterministic lock step mode + * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep + * @returns true if engine is in deterministic lock step mode */ - get isLocked() { - return this._isLocked; - } - set isLocked(value) { - this._isLocked = value; + isDeterministicLockStep() { + return this._deterministicLockstep; } - // Methods /** - * Updates the bounding sphere and box - * @param world world matrix to be used to update + * Gets the max steps when engine is running in deterministic lock step + * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep + * @returns the max steps */ - update(world) { - if (this._isLocked) { - return; - } - this.boundingBox._update(world); - this.boundingSphere._update(world); + getLockstepMaxSteps() { + return this._lockstepMaxSteps; } /** - * Recreate the bounding info to be centered around a specific point given a specific extend. - * @param center New center of the bounding info - * @param extend New extend of the bounding info - * @returns the current bounding info + * Returns the time in ms between steps when using deterministic lock step. + * @returns time step in (ms) */ - centerOn(center, extend) { - const minimum = _BoundingInfo._TmpVector3[0].copyFrom(center).subtractInPlace(extend); - const maximum = _BoundingInfo._TmpVector3[1].copyFrom(center).addInPlace(extend); - this.boundingBox.reConstruct(minimum, maximum, this.boundingBox.getWorldMatrix()); - this.boundingSphere.reConstruct(minimum, maximum, this.boundingBox.getWorldMatrix()); - return this; + getTimeStep() { + return this._timeStep * 1e3; } /** - * Grows the bounding info to include the given point. - * @param point The point that will be included in the current bounding info (in local space) - * @returns the current bounding info + * Force the mipmap generation for the given render target texture + * @param texture defines the render target texture to use + * @param unbind defines whether or not to unbind the texture after generation. Defaults to true. */ - encapsulate(point) { - const minimum = Vector3.Minimize(this.minimum, point); - const maximum = Vector3.Maximize(this.maximum, point); - this.reConstruct(minimum, maximum, this.boundingBox.getWorldMatrix()); - return this; + generateMipMapsForCubemap(texture, unbind = true) { + if (texture.generateMipMaps) { + const gl = this._gl; + this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, texture, true); + gl.generateMipmap(gl.TEXTURE_CUBE_MAP); + if (unbind) { + this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, null); + } + } } + /** States */ /** - * Grows the bounding info to encapsulate the given bounding info. - * @param toEncapsulate The bounding info that will be encapsulated in the current bounding info - * @returns the current bounding info + * Gets a boolean indicating if depth writing is enabled + * @returns the current depth writing state */ - encapsulateBoundingInfo(toEncapsulate) { - const invw = TmpVectors.Matrix[0]; - this.boundingBox.getWorldMatrix().invertToRef(invw); - const v = TmpVectors.Vector3[0]; - Vector3.TransformCoordinatesToRef(toEncapsulate.boundingBox.minimumWorld, invw, v); - this.encapsulate(v); - Vector3.TransformCoordinatesToRef(toEncapsulate.boundingBox.maximumWorld, invw, v); - this.encapsulate(v); - return this; + getDepthWrite() { + return this._depthCullingState.depthMask; } /** - * Scale the current bounding info by applying a scale factor - * @param factor defines the scale factor to apply - * @returns the current bounding info + * Enable or disable depth writing + * @param enable defines the state to set */ - scale(factor) { - this.boundingBox.scale(factor); - this.boundingSphere.scale(factor); - return this; + setDepthWrite(enable) { + this._depthCullingState.depthMask = enable; } /** - * Returns `true` if the bounding info is within the frustum defined by the passed array of planes. - * @param frustumPlanes defines the frustum to test - * @param strategy defines the strategy to use for the culling (default is BABYLON.AbstractMesh.CULLINGSTRATEGY_STANDARD) - * The different strategies available are: - * * BABYLON.AbstractMesh.CULLINGSTRATEGY_STANDARD most accurate but slower @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_STANDARD - * * BABYLON.AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY faster but less accurate @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY - * * BABYLON.AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION can be faster if always visible @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_OPTIMISTIC_INCLUSION - * * BABYLON.AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY can be faster if always visible @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY - * @returns true if the bounding info is in the frustum planes + * Gets a boolean indicating if stencil buffer is enabled + * @returns the current stencil buffer state */ - isInFrustum(frustumPlanes, strategy = 0) { - const inclusionTest = strategy === 2 || strategy === 3; - if (inclusionTest) { - if (this.boundingSphere.isCenterInFrustum(frustumPlanes)) { - return true; - } - } - if (!this.boundingSphere.isInFrustum(frustumPlanes)) { - return false; - } - const bSphereOnlyTest = strategy === 1 || strategy === 3; - if (bSphereOnlyTest) { - return true; - } - return this.boundingBox.isInFrustum(frustumPlanes); + getStencilBuffer() { + return this._stencilState.stencilTest; } /** - * Gets the world distance between the min and max points of the bounding box + * Enable or disable the stencil buffer + * @param enable defines if the stencil buffer must be enabled or disabled */ - get diagonalLength() { - const boundingBox = this.boundingBox; - const diag = boundingBox.maximumWorld.subtractToRef(boundingBox.minimumWorld, _BoundingInfo._TmpVector3[0]); - return diag.length(); + setStencilBuffer(enable) { + this._stencilState.stencilTest = enable; } /** - * Checks if a cullable object (mesh...) is in the camera frustum - * Unlike isInFrustum this checks the full bounding box - * @param frustumPlanes Camera near/planes - * @returns true if the object is in frustum otherwise false + * Gets the current stencil mask + * @returns a number defining the new stencil mask to use */ - isCompletelyInFrustum(frustumPlanes) { - return this.boundingBox.isCompletelyInFrustum(frustumPlanes); + getStencilMask() { + return this._stencilState.stencilMask; } /** - * @internal + * Sets the current stencil mask + * @param mask defines the new stencil mask to use */ - _checkCollision(collider) { - return collider._canDoCollision(this.boundingSphere.centerWorld, this.boundingSphere.radiusWorld, this.boundingBox.minimumWorld, this.boundingBox.maximumWorld); + setStencilMask(mask) { + this._stencilState.stencilMask = mask; } /** - * Checks if a point is inside the bounding box and bounding sphere or the mesh - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect - * @param point the point to check intersection with - * @returns if the point intersects + * Gets the current stencil function + * @returns a number defining the stencil function to use */ - intersectsPoint(point) { - if (!this.boundingSphere.centerWorld) { - return false; - } - if (!this.boundingSphere.intersectsPoint(point)) { - return false; - } - if (!this.boundingBox.intersectsPoint(point)) { - return false; - } - return true; + getStencilFunction() { + return this._stencilState.stencilFunc; } /** - * Checks if another bounding info intersects the bounding box and bounding sphere or the mesh - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect - * @param boundingInfo the bounding info to check intersection with - * @param precise if the intersection should be done using OBB - * @returns if the bounding info intersects + * Gets the current stencil reference value + * @returns a number defining the stencil reference value to use */ - intersects(boundingInfo, precise) { - if (!BoundingSphere.Intersects(this.boundingSphere, boundingInfo.boundingSphere)) { - return false; - } - if (!BoundingBox.Intersects(this.boundingBox, boundingInfo.boundingBox)) { - return false; - } - if (!precise) { - return true; - } - const box0 = this.boundingBox; - const box1 = boundingInfo.boundingBox; - if (!axisOverlap(box0.directions[0], box0, box1)) { - return false; - } - if (!axisOverlap(box0.directions[1], box0, box1)) { - return false; - } - if (!axisOverlap(box0.directions[2], box0, box1)) { - return false; - } - if (!axisOverlap(box1.directions[0], box0, box1)) { - return false; - } - if (!axisOverlap(box1.directions[1], box0, box1)) { - return false; - } - if (!axisOverlap(box1.directions[2], box0, box1)) { - return false; - } - if (!axisOverlap(Vector3.Cross(box0.directions[0], box1.directions[0]), box0, box1)) { - return false; - } - if (!axisOverlap(Vector3.Cross(box0.directions[0], box1.directions[1]), box0, box1)) { - return false; - } - if (!axisOverlap(Vector3.Cross(box0.directions[0], box1.directions[2]), box0, box1)) { - return false; - } - if (!axisOverlap(Vector3.Cross(box0.directions[1], box1.directions[0]), box0, box1)) { - return false; - } - if (!axisOverlap(Vector3.Cross(box0.directions[1], box1.directions[1]), box0, box1)) { - return false; - } - if (!axisOverlap(Vector3.Cross(box0.directions[1], box1.directions[2]), box0, box1)) { - return false; - } - if (!axisOverlap(Vector3.Cross(box0.directions[2], box1.directions[0]), box0, box1)) { - return false; - } - if (!axisOverlap(Vector3.Cross(box0.directions[2], box1.directions[1]), box0, box1)) { - return false; - } - if (!axisOverlap(Vector3.Cross(box0.directions[2], box1.directions[2]), box0, box1)) { - return false; - } - return true; - } -}; -BoundingInfo._TmpVector3 = ArrayTools.BuildArray(2, Vector3.Zero); - -// node_modules/@babylonjs/core/Maths/math.functions.js -var MathHelpers = class { - static extractMinAndMaxIndexed(positions, indices, indexStart, indexCount, minimum, maximum) { - for (let index = indexStart; index < indexStart + indexCount; index++) { - const offset = indices[index] * 3; - const x = positions[offset]; - const y = positions[offset + 1]; - const z = positions[offset + 2]; - minimum.minimizeInPlaceFromFloats(x, y, z); - maximum.maximizeInPlaceFromFloats(x, y, z); - } - } - static extractMinAndMax(positions, start, count, stride, minimum, maximum) { - for (let index = start, offset = start * stride; index < start + count; index++, offset += stride) { - const x = positions[offset]; - const y = positions[offset + 1]; - const z = positions[offset + 2]; - minimum.minimizeInPlaceFromFloats(x, y, z); - maximum.maximizeInPlaceFromFloats(x, y, z); - } - } -}; -__decorate([ - nativeOverride.filter((...[positions, indices]) => !Array.isArray(positions) && !Array.isArray(indices)) - // eslint-disable-next-line @typescript-eslint/naming-convention -], MathHelpers, "extractMinAndMaxIndexed", null); -__decorate([ - nativeOverride.filter((...[positions]) => !Array.isArray(positions)) - // eslint-disable-next-line @typescript-eslint/naming-convention -], MathHelpers, "extractMinAndMax", null); -function extractMinAndMaxIndexed(positions, indices, indexStart, indexCount, bias = null) { - const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); - const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); - MathHelpers.extractMinAndMaxIndexed(positions, indices, indexStart, indexCount, minimum, maximum); - if (bias) { - minimum.x -= minimum.x * bias.x + bias.y; - minimum.y -= minimum.y * bias.x + bias.y; - minimum.z -= minimum.z * bias.x + bias.y; - maximum.x += maximum.x * bias.x + bias.y; - maximum.y += maximum.y * bias.x + bias.y; - maximum.z += maximum.z * bias.x + bias.y; - } - return { - minimum, - maximum - }; -} -function extractMinAndMax(positions, start, count, bias = null, stride) { - const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); - const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); - if (!stride) { - stride = 3; - } - MathHelpers.extractMinAndMax(positions, start, count, stride, minimum, maximum); - if (bias) { - minimum.x -= minimum.x * bias.x + bias.y; - minimum.y -= minimum.y * bias.x + bias.y; - minimum.z -= minimum.z * bias.x + bias.y; - maximum.x += maximum.x * bias.x + bias.y; - maximum.y += maximum.y * bias.x + bias.y; - maximum.z += maximum.z * bias.x + bias.y; + getStencilFunctionReference() { + return this._stencilState.stencilFuncRef; } - return { - minimum, - maximum - }; -} - -// node_modules/@babylonjs/core/Meshes/subMesh.js -var SubMesh = class _SubMesh { /** - * Gets material defines used by the effect associated to the sub mesh + * Gets the current stencil mask + * @returns a number defining the stencil mask to use */ - get materialDefines() { - var _a; - return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.defines : (_a = this._getDrawWrapper()) == null ? void 0 : _a.defines; + getStencilFunctionMask() { + return this._stencilState.stencilFuncMask; } /** - * Sets material defines used by the effect associated to the sub mesh + * Sets the current stencil function + * @param stencilFunc defines the new stencil function to use */ - set materialDefines(defines) { - const drawWrapper = this._mainDrawWrapperOverride ?? this._getDrawWrapper(void 0, true); - drawWrapper.defines = defines; + setStencilFunction(stencilFunc) { + this._stencilState.stencilFunc = stencilFunc; } /** - * @internal + * Sets the current stencil reference + * @param reference defines the new stencil reference to use */ - _getDrawWrapper(passId, createIfNotExisting = false) { - passId = passId ?? this._engine.currentRenderPassId; - let drawWrapper = this._drawWrappers[passId]; - if (!drawWrapper && createIfNotExisting) { - this._drawWrappers[passId] = drawWrapper = new DrawWrapper(this._mesh.getScene().getEngine()); - } - return drawWrapper; + setStencilFunctionReference(reference) { + this._stencilState.stencilFuncRef = reference; } /** - * @internal + * Sets the current stencil mask + * @param mask defines the new stencil mask to use */ - _removeDrawWrapper(passId, disposeWrapper = true) { - var _a; - if (disposeWrapper) { - (_a = this._drawWrappers[passId]) == null ? void 0 : _a.dispose(); - } - this._drawWrappers[passId] = void 0; + setStencilFunctionMask(mask) { + this._stencilState.stencilFuncMask = mask; } /** - * Gets associated (main) effect (possibly the effect override if defined) + * Gets the current stencil operation when stencil fails + * @returns a number defining stencil operation to use when stencil fails */ - get effect() { - var _a; - return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : ((_a = this._getDrawWrapper()) == null ? void 0 : _a.effect) ?? null; - } - /** @internal */ - get _drawWrapper() { - return this._mainDrawWrapperOverride ?? this._getDrawWrapper(void 0, true); - } - /** @internal */ - get _drawWrapperOverride() { - return this._mainDrawWrapperOverride; + getStencilOperationFail() { + return this._stencilState.stencilOpStencilFail; } /** - * @internal + * Gets the current stencil operation when depth fails + * @returns a number defining stencil operation to use when depth fails */ - _setMainDrawWrapperOverride(wrapper) { - this._mainDrawWrapperOverride = wrapper; + getStencilOperationDepthFail() { + return this._stencilState.stencilOpDepthFail; } /** - * Sets associated effect (effect used to render this submesh) - * @param effect defines the effect to associate with - * @param defines defines the set of defines used to compile this effect - * @param materialContext material context associated to the effect - * @param resetContext true to reset the draw context + * Gets the current stencil operation when stencil passes + * @returns a number defining stencil operation to use when stencil passes */ - setEffect(effect, defines = null, materialContext, resetContext = true) { - const drawWrapper = this._drawWrapper; - drawWrapper.setEffect(effect, defines, resetContext); - if (materialContext !== void 0) { - drawWrapper.materialContext = materialContext; - } - if (!effect) { - drawWrapper.defines = null; - drawWrapper.materialContext = void 0; - } + getStencilOperationPass() { + return this._stencilState.stencilOpStencilDepthPass; } /** - * Resets the draw wrappers cache - * @param passId If provided, releases only the draw wrapper corresponding to this render pass id + * Sets the stencil operation to use when stencil fails + * @param operation defines the stencil operation to use when stencil fails */ - resetDrawCache(passId) { - if (this._drawWrappers) { - if (passId !== void 0) { - this._removeDrawWrapper(passId); - return; - } else { - for (const drawWrapper of this._drawWrappers) { - drawWrapper == null ? void 0 : drawWrapper.dispose(); - } - } - } - this._drawWrappers = []; + setStencilOperationFail(operation) { + this._stencilState.stencilOpStencilFail = operation; } /** - * Add a new submesh to a mesh - * @param materialIndex defines the material index to use - * @param verticesStart defines vertex index start - * @param verticesCount defines vertices count - * @param indexStart defines index start - * @param indexCount defines indices count - * @param mesh defines the parent mesh - * @param renderingMesh defines an optional rendering mesh - * @param createBoundingBox defines if bounding box should be created for this submesh - * @returns the new submesh + * Sets the stencil operation to use when depth fails + * @param operation defines the stencil operation to use when depth fails */ - static AddToMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox = true) { - return new _SubMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox); + setStencilOperationDepthFail(operation) { + this._stencilState.stencilOpDepthFail = operation; } /** - * Creates a new submesh - * @param materialIndex defines the material index to use - * @param verticesStart defines vertex index start - * @param verticesCount defines vertices count - * @param indexStart defines index start - * @param indexCount defines indices count - * @param mesh defines the parent mesh - * @param renderingMesh defines an optional rendering mesh - * @param createBoundingBox defines if bounding box should be created for this submesh - * @param addToMesh defines a boolean indicating that the submesh must be added to the mesh.subMeshes array (true by default) + * Sets the stencil operation to use when stencil passes + * @param operation defines the stencil operation to use when stencil passes */ - constructor(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox = true, addToMesh = true) { - this.materialIndex = materialIndex; - this.verticesStart = verticesStart; - this.verticesCount = verticesCount; - this.indexStart = indexStart; - this.indexCount = indexCount; - this._mainDrawWrapperOverride = null; - this._linesIndexCount = 0; - this._linesIndexBuffer = null; - this._lastColliderWorldVertices = null; - this._lastColliderTransformMatrix = null; - this._wasDispatched = false; - this._renderId = 0; - this._alphaIndex = 0; - this._distanceToCamera = 0; - this._currentMaterial = null; - this._mesh = mesh; - this._renderingMesh = renderingMesh || mesh; - if (addToMesh) { - mesh.subMeshes.push(this); - } - this._engine = this._mesh.getScene().getEngine(); - this.resetDrawCache(); - this._trianglePlanes = []; - this._id = mesh.subMeshes.length - 1; - if (createBoundingBox) { - this.refreshBoundingInfo(); - mesh.computeWorldMatrix(true); - } + setStencilOperationPass(operation) { + this._stencilState.stencilOpStencilDepthPass = operation; } /** - * Returns true if this submesh covers the entire parent mesh - * @ignorenaming + * Sets a boolean indicating if the dithering state is enabled or disabled + * @param value defines the dithering state */ - // eslint-disable-next-line @typescript-eslint/naming-convention - get IsGlobal() { - return this.verticesStart === 0 && this.verticesCount === this._mesh.getTotalVertices() && this.indexStart === 0 && this.indexCount === this._mesh.getTotalIndices(); + setDitheringState(value) { + if (value) { + this._gl.enable(this._gl.DITHER); + } else { + this._gl.disable(this._gl.DITHER); + } } /** - * Returns the submesh BoundingInfo object - * @returns current bounding info (or mesh's one if the submesh is global) + * Sets a boolean indicating if the rasterizer state is enabled or disabled + * @param value defines the rasterizer state */ - getBoundingInfo() { - if (this.IsGlobal || this._mesh.hasThinInstances) { - return this._mesh.getBoundingInfo(); + setRasterizerState(value) { + if (value) { + this._gl.disable(this._gl.RASTERIZER_DISCARD); + } else { + this._gl.enable(this._gl.RASTERIZER_DISCARD); } - return this._boundingInfo; } /** - * Sets the submesh BoundingInfo - * @param boundingInfo defines the new bounding info to use - * @returns the SubMesh + * Gets the current depth function + * @returns a number defining the depth function */ - setBoundingInfo(boundingInfo) { - this._boundingInfo = boundingInfo; - return this; + getDepthFunction() { + return this._depthCullingState.depthFunc; } /** - * Returns the mesh of the current submesh - * @returns the parent mesh + * Sets the current depth function + * @param depthFunc defines the function to use */ - getMesh() { - return this._mesh; + setDepthFunction(depthFunc) { + this._depthCullingState.depthFunc = depthFunc; } /** - * Returns the rendering mesh of the submesh - * @returns the rendering mesh (could be different from parent mesh) + * Sets the current depth function to GREATER */ - getRenderingMesh() { - return this._renderingMesh; + setDepthFunctionToGreater() { + this.setDepthFunction(516); } /** - * Returns the replacement mesh of the submesh - * @returns the replacement mesh (could be different from parent mesh) + * Sets the current depth function to GEQUAL */ - getReplacementMesh() { - return this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null; + setDepthFunctionToGreaterOrEqual() { + this.setDepthFunction(518); } /** - * Returns the effective mesh of the submesh - * @returns the effective mesh (could be different from parent mesh) + * Sets the current depth function to LESS */ - getEffectiveMesh() { - const replacementMesh = this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null; - return replacementMesh ? replacementMesh : this._renderingMesh; + setDepthFunctionToLess() { + this.setDepthFunction(513); } /** - * Returns the submesh material - * @param getDefaultMaterial Defines whether or not to get the default material if nothing has been defined. - * @returns null or the current material + * Sets the current depth function to LEQUAL */ - getMaterial(getDefaultMaterial = true) { - const rootMaterial = this._renderingMesh.getMaterialForRenderPass(this._engine.currentRenderPassId) ?? this._renderingMesh.material; - if (!rootMaterial) { - return getDefaultMaterial ? this._mesh.getScene().defaultMaterial : null; - } else if (this._isMultiMaterial(rootMaterial)) { - const effectiveMaterial = rootMaterial.getSubMaterial(this.materialIndex); - if (this._currentMaterial !== effectiveMaterial) { - this._currentMaterial = effectiveMaterial; - this.resetDrawCache(); - } - return effectiveMaterial; - } - return rootMaterial; + setDepthFunctionToLessOrEqual() { + this.setDepthFunction(515); } - _isMultiMaterial(material) { - return material.getSubMaterial !== void 0; + /** + * Caches the state of the stencil buffer + */ + cacheStencilState() { + this._cachedStencilBuffer = this.getStencilBuffer(); + this._cachedStencilFunction = this.getStencilFunction(); + this._cachedStencilMask = this.getStencilMask(); + this._cachedStencilOperationPass = this.getStencilOperationPass(); + this._cachedStencilOperationFail = this.getStencilOperationFail(); + this._cachedStencilOperationDepthFail = this.getStencilOperationDepthFail(); + this._cachedStencilReference = this.getStencilFunctionReference(); } - // Methods /** - * Sets a new updated BoundingInfo object to the submesh - * @param data defines an optional position array to use to determine the bounding info - * @returns the SubMesh + * Restores the state of the stencil buffer */ - refreshBoundingInfo(data = null) { - this._lastColliderWorldVertices = null; - if (this.IsGlobal || !this._renderingMesh || !this._renderingMesh.geometry) { - return this; - } - if (!data) { - data = this._renderingMesh.getVerticesData(VertexBuffer.PositionKind); - } - if (!data) { - this._boundingInfo = this._mesh.getBoundingInfo(); - return this; - } - const indices = this._renderingMesh.getIndices(); - let extend; - if (this.indexStart === 0 && this.indexCount === indices.length) { - const boundingInfo = this._renderingMesh.getBoundingInfo(); - extend = { minimum: boundingInfo.minimum.clone(), maximum: boundingInfo.maximum.clone() }; - } else { - extend = extractMinAndMaxIndexed(data, indices, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias); - } - if (this._boundingInfo) { - this._boundingInfo.reConstruct(extend.minimum, extend.maximum); - } else { - this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum); - } - return this; + restoreStencilState() { + this.setStencilFunction(this._cachedStencilFunction); + this.setStencilMask(this._cachedStencilMask); + this.setStencilBuffer(this._cachedStencilBuffer); + this.setStencilOperationPass(this._cachedStencilOperationPass); + this.setStencilOperationFail(this._cachedStencilOperationFail); + this.setStencilOperationDepthFail(this._cachedStencilOperationDepthFail); + this.setStencilFunctionReference(this._cachedStencilReference); } /** - * @internal + * Directly set the WebGL Viewport + * @param x defines the x coordinate of the viewport (in screen space) + * @param y defines the y coordinate of the viewport (in screen space) + * @param width defines the width of the viewport (in screen space) + * @param height defines the height of the viewport (in screen space) + * @returns the current viewport Object (if any) that is being replaced by this call. You can restore this viewport later on to go back to the original state */ - _checkCollision(collider) { - const boundingInfo = this.getBoundingInfo(); - return boundingInfo._checkCollision(collider); + setDirectViewport(x, y, width, height) { + const currentViewport = this._cachedViewport; + this._cachedViewport = null; + this._viewport(x, y, width, height); + return currentViewport; } /** - * Updates the submesh BoundingInfo - * @param world defines the world matrix to use to update the bounding info - * @returns the submesh + * Executes a scissor clear (ie. a clear on a specific portion of the screen) + * @param x defines the x-coordinate of the bottom left corner of the clear rectangle + * @param y defines the y-coordinate of the corner of the clear rectangle + * @param width defines the width of the clear rectangle + * @param height defines the height of the clear rectangle + * @param clearColor defines the clear color */ - updateBoundingInfo(world) { - let boundingInfo = this.getBoundingInfo(); - if (!boundingInfo) { - this.refreshBoundingInfo(); - boundingInfo = this.getBoundingInfo(); - } - if (boundingInfo) { - boundingInfo.update(world); - } - return this; + scissorClear(x, y, width, height, clearColor) { + this.enableScissor(x, y, width, height); + this.clear(clearColor, true, true, true); + this.disableScissor(); } /** - * True is the submesh bounding box intersects the frustum defined by the passed array of planes. - * @param frustumPlanes defines the frustum planes - * @returns true if the submesh is intersecting with the frustum + * Enable scissor test on a specific rectangle (ie. render will only be executed on a specific portion of the screen) + * @param x defines the x-coordinate of the bottom left corner of the clear rectangle + * @param y defines the y-coordinate of the corner of the clear rectangle + * @param width defines the width of the clear rectangle + * @param height defines the height of the clear rectangle */ - isInFrustum(frustumPlanes) { - const boundingInfo = this.getBoundingInfo(); - if (!boundingInfo) { - return false; - } - return boundingInfo.isInFrustum(frustumPlanes, this._mesh.cullingStrategy); + enableScissor(x, y, width, height) { + const gl = this._gl; + gl.enable(gl.SCISSOR_TEST); + gl.scissor(x, y, width, height); } /** - * True is the submesh bounding box is completely inside the frustum defined by the passed array of planes - * @param frustumPlanes defines the frustum planes - * @returns true if the submesh is inside the frustum + * Disable previously set scissor test rectangle */ - isCompletelyInFrustum(frustumPlanes) { - const boundingInfo = this.getBoundingInfo(); - if (!boundingInfo) { - return false; - } - return boundingInfo.isCompletelyInFrustum(frustumPlanes); + disableScissor() { + const gl = this._gl; + gl.disable(gl.SCISSOR_TEST); } /** - * Renders the submesh - * @param enableAlphaMode defines if alpha needs to be used - * @returns the submesh + * @internal */ - render(enableAlphaMode) { - this._renderingMesh.render(this, enableAlphaMode, this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : void 0); - return this; + _reportDrawCall(numDrawCalls = 1) { + this._drawCalls.addCount(numDrawCalls, false); } /** * @internal */ - _getLinesIndexBuffer(indices, engine) { - if (!this._linesIndexBuffer) { - const linesIndices = []; - for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 3) { - linesIndices.push(indices[index], indices[index + 1], indices[index + 1], indices[index + 2], indices[index + 2], indices[index]); - } - this._linesIndexBuffer = engine.createIndexBuffer(linesIndices); - this._linesIndexCount = linesIndices.length; - } - return this._linesIndexBuffer; + _loadFileAsync(url, offlineProvider, useArrayBuffer) { + return new Promise((resolve, reject) => { + this._loadFile(url, (data) => { + resolve(data); + }, void 0, offlineProvider, useArrayBuffer, (request, exception) => { + reject(exception); + }); + }); } /** - * Checks if the submesh intersects with a ray - * @param ray defines the ray to test - * @returns true is the passed ray intersects the submesh bounding box + * Gets the source code of the vertex shader associated with a specific webGL program + * @param program defines the program to use + * @returns a string containing the source code of the vertex shader associated with the program */ - canIntersects(ray) { - const boundingInfo = this.getBoundingInfo(); - if (!boundingInfo) { - return false; + getVertexShaderSource(program) { + const shaders = this._gl.getAttachedShaders(program); + if (!shaders) { + return null; } - return ray.intersectsBox(boundingInfo.boundingBox); + return this._gl.getShaderSource(shaders[0]); } /** - * Intersects current submesh with a ray - * @param ray defines the ray to test - * @param positions defines mesh's positions array - * @param indices defines mesh's indices array - * @param fastCheck defines if the first intersection will be used (and not the closest) - * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected - * @returns intersection info or null if no intersection + * Gets the source code of the fragment shader associated with a specific webGL program + * @param program defines the program to use + * @returns a string containing the source code of the fragment shader associated with the program */ - intersects(ray, positions, indices, fastCheck, trianglePredicate) { - const material = this.getMaterial(); - if (!material) { + getFragmentShaderSource(program) { + const shaders = this._gl.getAttachedShaders(program); + if (!shaders) { return null; } - let step = 3; - let checkStopper = false; - switch (material.fillMode) { - case 3: - case 5: - case 6: - case 8: - return null; - case 7: - step = 1; - checkStopper = true; - break; - default: - break; + return this._gl.getShaderSource(shaders[1]); + } + /** + * Sets a depth stencil texture from a render target to the according uniform. + * @param channel The texture channel + * @param uniform The uniform to set + * @param texture The render target texture containing the depth stencil texture to apply + * @param name The texture name + */ + setDepthStencilTexture(channel, uniform, texture, name69) { + if (channel === void 0) { + return; } - if (material.fillMode === 4) { - if (!indices.length) { - return this._intersectUnIndexedLines(ray, positions, indices, this._mesh.intersectionThreshold, fastCheck); - } - return this._intersectLines(ray, positions, indices, this._mesh.intersectionThreshold, fastCheck); + if (uniform) { + this._boundUniforms[channel] = uniform; + } + if (!texture || !texture.depthStencilTexture) { + this._setTexture(channel, null, void 0, void 0, name69); } else { - if (!indices.length && this._mesh._unIndexed) { - return this._intersectUnIndexedTriangles(ray, positions, indices, fastCheck, trianglePredicate); - } - return this._intersectTriangles(ray, positions, indices, step, checkStopper, fastCheck, trianglePredicate); + this._setTexture(channel, texture, false, true, name69); } } /** - * @internal + * Sets a texture to the webGL context from a postprocess + * @param channel defines the channel to use + * @param postProcess defines the source postprocess + * @param name name of the channel */ - _intersectLines(ray, positions, indices, intersectionThreshold, fastCheck) { - let intersectInfo = null; - for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 2) { - const p0 = positions[indices[index]]; - const p1 = positions[indices[index + 1]]; - const length = ray.intersectionSegment(p0, p1, intersectionThreshold); - if (length < 0) { - continue; - } - if (fastCheck || !intersectInfo || length < intersectInfo.distance) { - intersectInfo = new IntersectionInfo(null, null, length); - intersectInfo.faceId = index / 2; - if (fastCheck) { - break; - } + setTextureFromPostProcess(channel, postProcess, name69) { + let postProcessInput = null; + if (postProcess) { + if (postProcess._forcedOutputTexture) { + postProcessInput = postProcess._forcedOutputTexture; + } else if (postProcess._textures.data[postProcess._currentRenderTextureInd]) { + postProcessInput = postProcess._textures.data[postProcess._currentRenderTextureInd]; } } - return intersectInfo; + this._bindTexture(channel, (postProcessInput == null ? void 0 : postProcessInput.texture) ?? null, name69); } /** - * @internal + * Binds the output of the passed in post process to the texture channel specified + * @param channel The channel the texture should be bound to + * @param postProcess The post process which's output should be bound + * @param name name of the channel */ - _intersectUnIndexedLines(ray, positions, indices, intersectionThreshold, fastCheck) { - let intersectInfo = null; - for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 2) { - const p0 = positions[index]; - const p1 = positions[index + 1]; - const length = ray.intersectionSegment(p0, p1, intersectionThreshold); - if (length < 0) { - continue; - } - if (fastCheck || !intersectInfo || length < intersectInfo.distance) { - intersectInfo = new IntersectionInfo(null, null, length); - intersectInfo.faceId = index / 2; - if (fastCheck) { - break; - } - } - } - return intersectInfo; + setTextureFromPostProcessOutput(channel, postProcess, name69) { + var _a; + this._bindTexture(channel, ((_a = postProcess == null ? void 0 : postProcess._outputTexture) == null ? void 0 : _a.texture) ?? null, name69); } /** - * @internal + * sets the object from which width and height will be taken from when getting render width and height + * Will fallback to the gl object + * @param dimensions the framebuffer width and height that will be used. */ - _intersectTriangles(ray, positions, indices, step, checkStopper, fastCheck, trianglePredicate) { - let intersectInfo = null; - let faceId = -1; - for (let index = this.indexStart; index < this.indexStart + this.indexCount - (3 - step); index += step) { - faceId++; - const indexA = indices[index]; - const indexB = indices[index + 1]; - const indexC = indices[index + 2]; - if (checkStopper && indexC === 4294967295) { - index += 2; - continue; - } - const p0 = positions[indexA]; - const p1 = positions[indexB]; - const p2 = positions[indexC]; - if (!p0 || !p1 || !p2) { - continue; - } - if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray, indexA, indexB, indexC)) { - continue; - } - const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2); - if (currentIntersectInfo) { - if (currentIntersectInfo.distance < 0) { - continue; - } - if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) { - intersectInfo = currentIntersectInfo; - intersectInfo.faceId = faceId; - if (fastCheck) { - break; - } - } - } + set framebufferDimensionsObject(dimensions) { + this._framebufferDimensionsObject = dimensions; + if (this._framebufferDimensionsObject) { + this.onResizeObservable.notifyObservers(this); } - return intersectInfo; } - /** - * @internal - */ - _intersectUnIndexedTriangles(ray, positions, indices, fastCheck, trianglePredicate) { - let intersectInfo = null; - for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 3) { - const p0 = positions[index]; - const p1 = positions[index + 1]; - const p2 = positions[index + 2]; - if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray, -1, -1, -1)) { - continue; - } - const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2); - if (currentIntersectInfo) { - if (currentIntersectInfo.distance < 0) { - continue; - } - if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) { - intersectInfo = currentIntersectInfo; - intersectInfo.faceId = index / 3; - if (fastCheck) { - break; - } - } - } + _rebuildBuffers() { + for (const scene of this.scenes) { + scene.resetCachedMaterial(); + scene._rebuildGeometries(); } - return intersectInfo; + for (const scene of this._virtualScenes) { + scene.resetCachedMaterial(); + scene._rebuildGeometries(); + } + super._rebuildBuffers(); + } + _rebuildTextures() { + for (const scene of this.scenes) { + scene._rebuildTextures(); + } + for (const scene of this._virtualScenes) { + scene._rebuildTextures(); + } + super._rebuildTextures(); } /** @internal */ - _rebuild() { - if (this._linesIndexBuffer) { - this._linesIndexBuffer = null; + _renderFrame() { + for (let index = 0; index < this._activeRenderLoops.length; index++) { + const renderFunction = this._activeRenderLoops[index]; + renderFunction(); } } - // Clone - /** - * Creates a new submesh from the passed mesh - * @param newMesh defines the new hosting mesh - * @param newRenderingMesh defines an optional rendering mesh - * @returns the new submesh - */ - clone(newMesh, newRenderingMesh) { - const result = new _SubMesh(this.materialIndex, this.verticesStart, this.verticesCount, this.indexStart, this.indexCount, newMesh, newRenderingMesh, false); - if (!this.IsGlobal) { - const boundingInfo = this.getBoundingInfo(); - if (!boundingInfo) { - return result; + _cancelFrame() { + if (this.customAnimationFrameRequester) { + if (this._frameHandler !== 0) { + this._frameHandler = 0; + const { cancelAnimationFrame: cancelAnimationFrame2 } = this.customAnimationFrameRequester; + if (cancelAnimationFrame2) { + cancelAnimationFrame2(this.customAnimationFrameRequester.requestID); + } } - result._boundingInfo = new BoundingInfo(boundingInfo.minimum, boundingInfo.maximum); + } else { + super._cancelFrame(); } - return result; } - // Dispose - /** - * Release associated resources - */ - dispose() { - if (this._linesIndexBuffer) { - this._mesh.getScene().getEngine()._releaseBuffer(this._linesIndexBuffer); - this._linesIndexBuffer = null; + _renderLoop() { + this._frameHandler = 0; + if (!this._contextWasLost) { + let shouldRender = true; + if (this.isDisposed || !this.renderEvenInBackground && this._windowIsBackground) { + shouldRender = false; + } + if (shouldRender) { + this.beginFrame(); + if (!this._renderViews()) { + this._renderFrame(); + } + this.endFrame(); + } + } + if (this._frameHandler === 0) { + if (this.customAnimationFrameRequester) { + this.customAnimationFrameRequester.requestID = this._queueNewFrame(this.customAnimationFrameRequester.renderFunction || this._boundRenderFunction, this.customAnimationFrameRequester); + this._frameHandler = this.customAnimationFrameRequester.requestID; + } else { + this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow()); + } } - const index = this._mesh.subMeshes.indexOf(this); - this._mesh.subMeshes.splice(index, 1); - this.resetDrawCache(); } - /** - * Gets the class name - * @returns the string "SubMesh". - */ - getClassName() { - return "SubMesh"; + /** @internal */ + _renderViews() { + return false; } - // Statics /** - * Creates a new submesh from indices data - * @param materialIndex the index of the main mesh material - * @param startIndex the index where to start the copy in the mesh indices array - * @param indexCount the number of indices to copy then from the startIndex - * @param mesh the main mesh to create the submesh from - * @param renderingMesh the optional rendering mesh - * @param createBoundingBox defines if bounding box should be created for this submesh - * @returns a new submesh + * Toggle full screen mode + * @param requestPointerLock defines if a pointer lock should be requested from the user */ - static CreateFromIndices(materialIndex, startIndex, indexCount, mesh, renderingMesh, createBoundingBox = true) { - let minVertexIndex = Number.MAX_VALUE; - let maxVertexIndex = -Number.MAX_VALUE; - const whatWillRender = renderingMesh || mesh; - const indices = whatWillRender.getIndices(); - for (let index = startIndex; index < startIndex + indexCount; index++) { - const vertexIndex = indices[index]; - if (vertexIndex < minVertexIndex) { - minVertexIndex = vertexIndex; - } - if (vertexIndex > maxVertexIndex) { - maxVertexIndex = vertexIndex; - } + switchFullscreen(requestPointerLock) { + if (this.isFullscreen) { + this.exitFullscreen(); + } else { + this.enterFullscreen(requestPointerLock); } - return new _SubMesh(materialIndex, minVertexIndex, maxVertexIndex - minVertexIndex + 1, startIndex, indexCount, mesh, renderingMesh, createBoundingBox); } -}; - -// node_modules/@babylonjs/core/Meshes/mesh.vertexData.js -var VertexDataMaterialInfo = class { -}; -var VertexData = class _VertexData { /** - * Creates a new VertexData + * Enters full screen mode + * @param requestPointerLock defines if a pointer lock should be requested from the user */ - constructor() { - this.uniqueId = 0; - this.metadata = {}; - this._applyTo = makeSyncFunction(this._applyToCoroutine.bind(this)); - this.uniqueId = _VertexData._UniqueIDGenerator; - _VertexData._UniqueIDGenerator++; + enterFullscreen(requestPointerLock) { + if (!this.isFullscreen) { + this._pointerLockRequested = requestPointerLock; + if (this._renderingCanvas) { + _Engine._RequestFullscreen(this._renderingCanvas); + } + } } /** - * Uses the passed data array to set the set the values for the specified kind of data - * @param data a linear array of floating numbers - * @param kind the type of data that is being set, eg positions, colors etc + * Exits full screen mode */ - set(data, kind) { - if (!data.length) { - Logger.Warn(`Setting vertex data kind '${kind}' with an empty array`); - } - switch (kind) { - case VertexBuffer.PositionKind: - this.positions = data; - break; - case VertexBuffer.NormalKind: - this.normals = data; - break; - case VertexBuffer.TangentKind: - this.tangents = data; - break; - case VertexBuffer.UVKind: - this.uvs = data; - break; - case VertexBuffer.UV2Kind: - this.uvs2 = data; - break; - case VertexBuffer.UV3Kind: - this.uvs3 = data; - break; - case VertexBuffer.UV4Kind: - this.uvs4 = data; - break; - case VertexBuffer.UV5Kind: - this.uvs5 = data; - break; - case VertexBuffer.UV6Kind: - this.uvs6 = data; - break; - case VertexBuffer.ColorKind: - this.colors = data; - break; - case VertexBuffer.MatricesIndicesKind: - this.matricesIndices = data; - break; - case VertexBuffer.MatricesWeightsKind: - this.matricesWeights = data; - break; - case VertexBuffer.MatricesIndicesExtraKind: - this.matricesIndicesExtra = data; - break; - case VertexBuffer.MatricesWeightsExtraKind: - this.matricesWeightsExtra = data; - break; + exitFullscreen() { + if (this.isFullscreen) { + _Engine._ExitFullscreen(); } } /** - * Associates the vertexData to the passed Mesh. - * Sets it as updatable or not (default `false`) - * @param mesh the mesh the vertexData is applied to - * @param updatable when used and having the value true allows new data to update the vertexData - * @returns the VertexData + * Enters Pointerlock mode */ - applyToMesh(mesh, updatable) { - this._applyTo(mesh, updatable, false); - return this; + enterPointerlock() { + if (this._renderingCanvas) { + _Engine._RequestPointerlock(this._renderingCanvas); + } } /** - * Associates the vertexData to the passed Geometry. - * Sets it as updatable or not (default `false`) - * @param geometry the geometry the vertexData is applied to - * @param updatable when used and having the value true allows new data to update the vertexData - * @returns VertexData + * Exits Pointerlock mode */ - applyToGeometry(geometry, updatable) { - this._applyTo(geometry, updatable, false); - return this; + exitPointerlock() { + _Engine._ExitPointerlock(); } /** - * Updates the associated mesh - * @param mesh the mesh to be updated - * @returns VertexData + * Begin a new frame */ - updateMesh(mesh) { - this._update(mesh); - return this; + beginFrame() { + this._measureFps(); + this.onBeginFrameObservable.notifyObservers(this); + super.beginFrame(); } /** - * Updates the associated geometry - * @param geometry the geometry to be updated - * @returns VertexData. + * End the current frame */ - updateGeometry(geometry) { - this._update(geometry); - return this; + endFrame() { + super.endFrame(); + this.onEndFrameObservable.notifyObservers(this); } /** - * @internal + * Force a specific size of the canvas + * @param width defines the new canvas' width + * @param height defines the new canvas' height + * @param forceSetSize true to force setting the sizes of the underlying canvas + * @returns true if the size was changed */ - *_applyToCoroutine(meshOrGeometry, updatable = false, isAsync) { - if (this.positions) { - meshOrGeometry.setVerticesData(VertexBuffer.PositionKind, this.positions, updatable); - if (isAsync) { - yield; - } - } - if (this.normals) { - meshOrGeometry.setVerticesData(VertexBuffer.NormalKind, this.normals, updatable); - if (isAsync) { - yield; - } - } - if (this.tangents) { - meshOrGeometry.setVerticesData(VertexBuffer.TangentKind, this.tangents, updatable); - if (isAsync) { - yield; - } - } - if (this.uvs) { - meshOrGeometry.setVerticesData(VertexBuffer.UVKind, this.uvs, updatable); - if (isAsync) { - yield; - } - } - if (this.uvs2) { - meshOrGeometry.setVerticesData(VertexBuffer.UV2Kind, this.uvs2, updatable); - if (isAsync) { - yield; - } - } - if (this.uvs3) { - meshOrGeometry.setVerticesData(VertexBuffer.UV3Kind, this.uvs3, updatable); - if (isAsync) { - yield; - } - } - if (this.uvs4) { - meshOrGeometry.setVerticesData(VertexBuffer.UV4Kind, this.uvs4, updatable); - if (isAsync) { - yield; - } - } - if (this.uvs5) { - meshOrGeometry.setVerticesData(VertexBuffer.UV5Kind, this.uvs5, updatable); - if (isAsync) { - yield; - } - } - if (this.uvs6) { - meshOrGeometry.setVerticesData(VertexBuffer.UV6Kind, this.uvs6, updatable); - if (isAsync) { - yield; - } - } - if (this.colors) { - meshOrGeometry.setVerticesData(VertexBuffer.ColorKind, this.colors, updatable); - if (this.hasVertexAlpha && meshOrGeometry.hasVertexAlpha !== void 0) { - meshOrGeometry.hasVertexAlpha = true; - } - if (isAsync) { - yield; - } - } - if (this.matricesIndices) { - meshOrGeometry.setVerticesData(VertexBuffer.MatricesIndicesKind, this.matricesIndices, updatable); - if (isAsync) { - yield; - } - } - if (this.matricesWeights) { - meshOrGeometry.setVerticesData(VertexBuffer.MatricesWeightsKind, this.matricesWeights, updatable); - if (isAsync) { - yield; - } + setSize(width, height, forceSetSize = false) { + if (!this._renderingCanvas) { + return false; } - if (this.matricesIndicesExtra) { - meshOrGeometry.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra, updatable); - if (isAsync) { - yield; - } + if (!super.setSize(width, height, forceSetSize)) { + return false; } - if (this.matricesWeightsExtra) { - meshOrGeometry.setVerticesData(VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra, updatable); - if (isAsync) { - yield; + if (this.scenes) { + for (let index = 0; index < this.scenes.length; index++) { + const scene = this.scenes[index]; + for (let camIndex = 0; camIndex < scene.cameras.length; camIndex++) { + const cam = scene.cameras[camIndex]; + cam._currentRenderId = 0; + } } - } - if (this.indices) { - meshOrGeometry.setIndices(this.indices, null, updatable); - if (isAsync) { - yield; + if (this.onResizeObservable.hasObservers()) { + this.onResizeObservable.notifyObservers(this); } - } else { - meshOrGeometry.setIndices([], null); } - if (meshOrGeometry.subMeshes && this.materialInfos && this.materialInfos.length > 1) { - const mesh = meshOrGeometry; - mesh.subMeshes = []; - for (const matInfo of this.materialInfos) { - new SubMesh(matInfo.materialIndex, matInfo.verticesStart, matInfo.verticesCount, matInfo.indexStart, matInfo.indexCount, mesh); + return true; + } + _deletePipelineContext(pipelineContext) { + const webGLPipelineContext = pipelineContext; + if (webGLPipelineContext && webGLPipelineContext.program) { + if (webGLPipelineContext.transformFeedback) { + this.deleteTransformFeedback(webGLPipelineContext.transformFeedback); + webGLPipelineContext.transformFeedback = null; } } - return this; + super._deletePipelineContext(pipelineContext); } - _update(meshOrGeometry, updateExtends, makeItUnique) { - if (this.positions) { - meshOrGeometry.updateVerticesData(VertexBuffer.PositionKind, this.positions, updateExtends, makeItUnique); - } - if (this.normals) { - meshOrGeometry.updateVerticesData(VertexBuffer.NormalKind, this.normals, updateExtends, makeItUnique); - } - if (this.tangents) { - meshOrGeometry.updateVerticesData(VertexBuffer.TangentKind, this.tangents, updateExtends, makeItUnique); - } - if (this.uvs) { - meshOrGeometry.updateVerticesData(VertexBuffer.UVKind, this.uvs, updateExtends, makeItUnique); - } - if (this.uvs2) { - meshOrGeometry.updateVerticesData(VertexBuffer.UV2Kind, this.uvs2, updateExtends, makeItUnique); - } - if (this.uvs3) { - meshOrGeometry.updateVerticesData(VertexBuffer.UV3Kind, this.uvs3, updateExtends, makeItUnique); - } - if (this.uvs4) { - meshOrGeometry.updateVerticesData(VertexBuffer.UV4Kind, this.uvs4, updateExtends, makeItUnique); - } - if (this.uvs5) { - meshOrGeometry.updateVerticesData(VertexBuffer.UV5Kind, this.uvs5, updateExtends, makeItUnique); - } - if (this.uvs6) { - meshOrGeometry.updateVerticesData(VertexBuffer.UV6Kind, this.uvs6, updateExtends, makeItUnique); - } - if (this.colors) { - meshOrGeometry.updateVerticesData(VertexBuffer.ColorKind, this.colors, updateExtends, makeItUnique); - } - if (this.matricesIndices) { - meshOrGeometry.updateVerticesData(VertexBuffer.MatricesIndicesKind, this.matricesIndices, updateExtends, makeItUnique); - } - if (this.matricesWeights) { - meshOrGeometry.updateVerticesData(VertexBuffer.MatricesWeightsKind, this.matricesWeights, updateExtends, makeItUnique); - } - if (this.matricesIndicesExtra) { - meshOrGeometry.updateVerticesData(VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra, updateExtends, makeItUnique); - } - if (this.matricesWeightsExtra) { - meshOrGeometry.updateVerticesData(VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra, updateExtends, makeItUnique); - } - if (this.indices) { - meshOrGeometry.setIndices(this.indices, null); - } - return this; + createShaderProgram(pipelineContext, vertexCode, fragmentCode, defines, context, transformFeedbackVaryings = null) { + context = context || this._gl; + this.onBeforeShaderCompilationObservable.notifyObservers(this); + const program = super.createShaderProgram(pipelineContext, vertexCode, fragmentCode, defines, context, transformFeedbackVaryings); + this.onAfterShaderCompilationObservable.notifyObservers(this); + return program; } - static _TransformVector3Coordinates(coordinates, transformation, offset = 0, length = coordinates.length) { - const coordinate = TmpVectors.Vector3[0]; - const transformedCoordinate = TmpVectors.Vector3[1]; - for (let index = offset; index < offset + length; index += 3) { - Vector3.FromArrayToRef(coordinates, index, coordinate); - Vector3.TransformCoordinatesToRef(coordinate, transformation, transformedCoordinate); - coordinates[index] = transformedCoordinate.x; - coordinates[index + 1] = transformedCoordinate.y; - coordinates[index + 2] = transformedCoordinate.z; + _createShaderProgram(pipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings = null) { + const shaderProgram = context.createProgram(); + pipelineContext.program = shaderProgram; + if (!shaderProgram) { + throw new Error("Unable to create program"); } - } - static _TransformVector3Normals(normals, transformation, offset = 0, length = normals.length) { - const normal = TmpVectors.Vector3[0]; - const transformedNormal = TmpVectors.Vector3[1]; - for (let index = offset; index < offset + length; index += 3) { - Vector3.FromArrayToRef(normals, index, normal); - Vector3.TransformNormalToRef(normal, transformation, transformedNormal); - normals[index] = transformedNormal.x; - normals[index + 1] = transformedNormal.y; - normals[index + 2] = transformedNormal.z; + context.attachShader(shaderProgram, vertexShader); + context.attachShader(shaderProgram, fragmentShader); + if (this.webGLVersion > 1 && transformFeedbackVaryings) { + const transformFeedback = this.createTransformFeedback(); + this.bindTransformFeedback(transformFeedback); + this.setTranformFeedbackVaryings(shaderProgram, transformFeedbackVaryings); + pipelineContext.transformFeedback = transformFeedback; } - } - static _TransformVector4Normals(normals, transformation, offset = 0, length = normals.length) { - const normal = TmpVectors.Vector4[0]; - const transformedNormal = TmpVectors.Vector4[1]; - for (let index = offset; index < offset + length; index += 4) { - Vector4.FromArrayToRef(normals, index, normal); - Vector4.TransformNormalToRef(normal, transformation, transformedNormal); - normals[index] = transformedNormal.x; - normals[index + 1] = transformedNormal.y; - normals[index + 2] = transformedNormal.z; - normals[index + 3] = transformedNormal.w; + context.linkProgram(shaderProgram); + if (this.webGLVersion > 1 && transformFeedbackVaryings) { + this.bindTransformFeedback(null); } - } - static _FlipFaces(indices, offset = 0, length = indices.length) { - for (let index = offset; index < offset + length; index += 3) { - const tmp = indices[index + 1]; - indices[index + 1] = indices[index + 2]; - indices[index + 2] = tmp; + pipelineContext.context = context; + pipelineContext.vertexShader = vertexShader; + pipelineContext.fragmentShader = fragmentShader; + if (!pipelineContext.isParallelCompiled) { + this._finalizePipelineContext(pipelineContext); } + return shaderProgram; } /** - * Transforms each position and each normal of the vertexData according to the passed Matrix - * @param matrix the transforming matrix - * @returns the VertexData + * @internal */ - transform(matrix) { - const flip = matrix.determinant() < 0; - if (this.positions) { - _VertexData._TransformVector3Coordinates(this.positions, matrix); - } - if (this.normals) { - _VertexData._TransformVector3Normals(this.normals, matrix); - } - if (this.tangents) { - _VertexData._TransformVector4Normals(this.tangents, matrix); - } - if (flip && this.indices) { - _VertexData._FlipFaces(this.indices); - } - return this; + _releaseTexture(texture) { + super._releaseTexture(texture); } /** - * Generates an array of vertex data where each vertex data only has one material info - * @returns An array of VertexData + * @internal */ - splitBasedOnMaterialID() { - if (!this.materialInfos || this.materialInfos.length < 2) { - return [this]; - } - const result = []; - for (const materialInfo of this.materialInfos) { - const vertexData = new _VertexData(); - if (this.positions) { - vertexData.positions = this.positions.slice(materialInfo.verticesStart * 3, (materialInfo.verticesCount + materialInfo.verticesStart) * 3); - } - if (this.normals) { - vertexData.normals = this.normals.slice(materialInfo.verticesStart * 3, (materialInfo.verticesCount + materialInfo.verticesStart) * 3); - } - if (this.tangents) { - vertexData.tangents = this.tangents.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4); - } - if (this.colors) { - vertexData.colors = this.colors.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4); - } - if (this.uvs) { - vertexData.uvs = this.uvs.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2); - } - if (this.uvs2) { - vertexData.uvs2 = this.uvs2.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2); - } - if (this.uvs3) { - vertexData.uvs3 = this.uvs3.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2); - } - if (this.uvs4) { - vertexData.uvs4 = this.uvs4.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2); - } - if (this.uvs5) { - vertexData.uvs5 = this.uvs5.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2); - } - if (this.uvs6) { - vertexData.uvs6 = this.uvs6.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2); - } - if (this.matricesIndices) { - vertexData.matricesIndices = this.matricesIndices.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4); - } - if (this.matricesIndicesExtra) { - vertexData.matricesIndicesExtra = this.matricesIndicesExtra.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4); - } - if (this.matricesWeights) { - vertexData.matricesWeights = this.matricesWeights.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4); - } - if (this.matricesWeightsExtra) { - vertexData.matricesWeightsExtra = this.matricesWeightsExtra.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4); - } - if (this.indices) { - vertexData.indices = []; - for (let index = materialInfo.indexStart; index < materialInfo.indexStart + materialInfo.indexCount; index++) { - vertexData.indices.push(this.indices[index] - materialInfo.verticesStart); + _releaseRenderTargetWrapper(rtWrapper) { + super._releaseRenderTargetWrapper(rtWrapper); + this.scenes.forEach((scene) => { + scene.postProcesses.forEach((postProcess) => { + if (postProcess._outputTexture === rtWrapper) { + postProcess._outputTexture = null; } - } - const newMaterialInfo = new VertexDataMaterialInfo(); - newMaterialInfo.indexStart = 0; - newMaterialInfo.indexCount = vertexData.indices ? vertexData.indices.length : 0; - newMaterialInfo.materialIndex = materialInfo.materialIndex; - newMaterialInfo.verticesStart = 0; - newMaterialInfo.verticesCount = (vertexData.positions ? vertexData.positions.length : 0) / 3; - vertexData.materialInfos = [newMaterialInfo]; - result.push(vertexData); - } - return result; + }); + scene.cameras.forEach((camera) => { + camera._postProcesses.forEach((postProcess) => { + if (postProcess) { + if (postProcess._outputTexture === rtWrapper) { + postProcess._outputTexture = null; + } + } + }); + }); + }); } /** - * Merges the passed VertexData into the current one - * @param others the VertexData to be merged into the current one - * @param use32BitsIndices defines a boolean indicating if indices must be store in a 32 bits array - * @param forceCloneIndices defines a boolean indicating if indices are forced to be cloned - * @param mergeMaterialIds defines a boolean indicating if we need to merge the material infos - * @param enableCompletion defines a boolean indicating if the vertex data should be completed to be compatible - * @returns the modified VertexData + * Gets the names of the render passes that are currently created + * @returns list of the render pass names */ - merge(others, use32BitsIndices = false, forceCloneIndices = false, mergeMaterialIds = false, enableCompletion = false) { - const vertexDatas = Array.isArray(others) ? others.map((other) => { - return { vertexData: other }; - }) : [{ vertexData: others }]; - return runCoroutineSync(this._mergeCoroutine(void 0, vertexDatas, use32BitsIndices, false, forceCloneIndices, mergeMaterialIds, enableCompletion)); + getRenderPassNames() { + return this._renderPassNames; } /** - * @internal + * Gets the name of the current render pass + * @returns name of the current render pass */ - *_mergeCoroutine(transform, vertexDatas, use32BitsIndices = false, isAsync, forceCloneIndices, mergeMaterialIds = false, enableCompletion = false) { - var _a, _b; - this._validate(); - let others = vertexDatas.map((vertexData) => vertexData.vertexData); - let root = this; - if (enableCompletion) { - for (const other of others) { - if (!other) { - continue; - } - other._validate(); - if (!this.normals && other.normals) { - this.normals = new Float32Array(this.positions.length); - } - if (!this.tangents && other.tangents) { - this.tangents = new Float32Array(this.positions.length / 3 * 4); - } - if (!this.uvs && other.uvs) { - this.uvs = new Float32Array(this.positions.length / 3 * 2); - } - if (!this.uvs2 && other.uvs2) { - this.uvs2 = new Float32Array(this.positions.length / 3 * 2); - } - if (!this.uvs3 && other.uvs3) { - this.uvs3 = new Float32Array(this.positions.length / 3 * 2); - } - if (!this.uvs4 && other.uvs4) { - this.uvs4 = new Float32Array(this.positions.length / 3 * 2); - } - if (!this.uvs5 && other.uvs5) { - this.uvs5 = new Float32Array(this.positions.length / 3 * 2); - } - if (!this.uvs6 && other.uvs6) { - this.uvs6 = new Float32Array(this.positions.length / 3 * 2); - } - if (!this.colors && other.colors) { - this.colors = new Float32Array(this.positions.length / 3 * 4); - this.colors.fill(1); - } - if (!this.matricesIndices && other.matricesIndices) { - this.matricesIndices = new Float32Array(this.positions.length / 3 * 4); - } - if (!this.matricesWeights && other.matricesWeights) { - this.matricesWeights = new Float32Array(this.positions.length / 3 * 4); - } - if (!this.matricesIndicesExtra && other.matricesIndicesExtra) { - this.matricesIndicesExtra = new Float32Array(this.positions.length / 3 * 4); - } - if (!this.matricesWeightsExtra && other.matricesWeightsExtra) { - this.matricesWeightsExtra = new Float32Array(this.positions.length / 3 * 4); + getCurrentRenderPassName() { + return this._renderPassNames[this.currentRenderPassId]; + } + /** + * Creates a render pass id + * @param name Name of the render pass (for debug purpose only) + * @returns the id of the new render pass + */ + createRenderPassId(name69) { + const id = ++_Engine._RenderPassIdCounter; + this._renderPassNames[id] = name69 ?? "NONAME"; + return id; + } + /** + * Releases a render pass id + * @param id id of the render pass to release + */ + releaseRenderPassId(id) { + this._renderPassNames[id] = void 0; + for (let s = 0; s < this.scenes.length; ++s) { + const scene = this.scenes[s]; + for (let m = 0; m < scene.meshes.length; ++m) { + const mesh = scene.meshes[m]; + if (mesh.subMeshes) { + for (let b = 0; b < mesh.subMeshes.length; ++b) { + const subMesh = mesh.subMeshes[b]; + subMesh._removeDrawWrapper(id); + } } } } - for (const other of others) { - if (!other) { - continue; - } - if (!enableCompletion) { - other._validate(); - if (!this.normals !== !other.normals || !this.tangents !== !other.tangents || !this.uvs !== !other.uvs || !this.uvs2 !== !other.uvs2 || !this.uvs3 !== !other.uvs3 || !this.uvs4 !== !other.uvs4 || !this.uvs5 !== !other.uvs5 || !this.uvs6 !== !other.uvs6 || !this.colors !== !other.colors || !this.matricesIndices !== !other.matricesIndices || !this.matricesWeights !== !other.matricesWeights || !this.matricesIndicesExtra !== !other.matricesIndicesExtra || !this.matricesWeightsExtra !== !other.matricesWeightsExtra) { - throw new Error("Cannot merge vertex data that do not have the same set of attributes"); - } - } else { - if (this.normals && !other.normals) { - other.normals = new Float32Array(other.positions.length); - } - if (this.tangents && !other.tangents) { - other.tangents = new Float32Array(other.positions.length / 3 * 4); - } - if (this.uvs && !other.uvs) { - other.uvs = new Float32Array(other.positions.length / 3 * 2); - } - if (this.uvs2 && !other.uvs2) { - other.uvs2 = new Float32Array(other.positions.length / 3 * 2); - } - if (this.uvs3 && !other.uvs3) { - other.uvs3 = new Float32Array(other.positions.length / 3 * 2); - } - if (this.uvs4 && !other.uvs4) { - other.uvs4 = new Float32Array(other.positions.length / 3 * 2); - } - if (this.uvs5 && !other.uvs5) { - other.uvs5 = new Float32Array(other.positions.length / 3 * 2); - } - if (this.uvs6 && !other.uvs6) { - other.uvs6 = new Float32Array(other.positions.length / 3 * 2); - } - if (this.colors && !other.colors) { - other.colors = new Float32Array(other.positions.length / 3 * 4); - other.colors.fill(1); - } - if (this.matricesIndices && !other.matricesIndices) { - other.matricesIndices = new Float32Array(other.positions.length / 3 * 4); - } - if (this.matricesWeights && !other.matricesWeights) { - other.matricesWeights = new Float32Array(other.positions.length / 3 * 4); - } - if (this.matricesIndicesExtra && !other.matricesIndicesExtra) { - other.matricesIndicesExtra = new Float32Array(other.positions.length / 3 * 4); - } - if (this.matricesWeightsExtra && !other.matricesWeightsExtra) { - other.matricesWeightsExtra = new Float32Array(other.positions.length / 3 * 4); - } - } + } + /** + * @internal + * Rescales a texture + * @param source input texture + * @param destination destination texture + * @param scene scene to use to render the resize + * @param internalFormat format to use when resizing + * @param onComplete callback to be called when resize has completed + */ + _rescaleTexture(source, destination, scene, internalFormat, onComplete) { + this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.LINEAR); + this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.LINEAR); + this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE); + this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE); + const rtt = this.createRenderTargetTexture({ + width: destination.width, + height: destination.height + }, { + generateMipMaps: false, + type: 0, + samplingMode: 2, + generateDepthBuffer: false, + generateStencilBuffer: false + }); + if (!this._rescalePostProcess && _Engine._RescalePostProcessFactory) { + this._rescalePostProcess = _Engine._RescalePostProcessFactory(this); } - if (mergeMaterialIds) { - let materialIndex = 0; - let indexOffset = 0; - let vertexOffset = 0; - const materialInfos = []; - let currentMaterialInfo = null; - const vertexDataList = []; - for (const split of this.splitBasedOnMaterialID()) { - vertexDataList.push({ vertexData: split, transform }); - } - for (const data of vertexDatas) { - if (!data.vertexData) { - continue; - } - for (const split of data.vertexData.splitBasedOnMaterialID()) { - vertexDataList.push({ vertexData: split, transform: data.transform }); - } - } - vertexDataList.sort((a, b) => { - const matInfoA = a.vertexData.materialInfos ? a.vertexData.materialInfos[0].materialIndex : 0; - const matInfoB = b.vertexData.materialInfos ? b.vertexData.materialInfos[0].materialIndex : 0; - if (matInfoA > matInfoB) { - return 1; + if (this._rescalePostProcess) { + this._rescalePostProcess.externalTextureSamplerBinding = true; + this._rescalePostProcess.getEffect().executeWhenCompiled(() => { + this._rescalePostProcess.onApply = function(effect) { + effect._bindTexture("textureSampler", source); + }; + let hostingScene = scene; + if (!hostingScene) { + hostingScene = this.scenes[this.scenes.length - 1]; } - if (matInfoA === matInfoB) { - return 0; + hostingScene.postProcessManager.directRender([this._rescalePostProcess], rtt, true); + this._bindTextureDirectly(this._gl.TEXTURE_2D, destination, true); + this._gl.copyTexImage2D(this._gl.TEXTURE_2D, 0, internalFormat, 0, 0, destination.width, destination.height, 0); + this.unBindFramebuffer(rtt); + rtt.dispose(); + if (onComplete) { + onComplete(); } - return -1; }); - for (const vertexDataSource of vertexDataList) { - const vertexData = vertexDataSource.vertexData; - if (vertexData.materialInfos) { - materialIndex = vertexData.materialInfos[0].materialIndex; - } else { - materialIndex = 0; - } - if (currentMaterialInfo && currentMaterialInfo.materialIndex === materialIndex) { - currentMaterialInfo.indexCount += vertexData.indices.length; - currentMaterialInfo.verticesCount += vertexData.positions.length / 3; - } else { - const materialInfo = new VertexDataMaterialInfo(); - materialInfo.materialIndex = materialIndex; - materialInfo.indexStart = indexOffset; - materialInfo.indexCount = vertexData.indices.length; - materialInfo.verticesStart = vertexOffset; - materialInfo.verticesCount = vertexData.positions.length / 3; - materialInfos.push(materialInfo); - currentMaterialInfo = materialInfo; - } - indexOffset += vertexData.indices.length; - vertexOffset += vertexData.positions.length / 3; - } - const first = vertexDataList.splice(0, 1)[0]; - root = first.vertexData; - transform = first.transform; - others = vertexDataList.map((v) => v.vertexData); - vertexDatas = vertexDataList; - this.materialInfos = materialInfos; - } - const totalIndices = others.reduce((indexSum, vertexData) => { - var _a2; - return indexSum + (((_a2 = vertexData.indices) == null ? void 0 : _a2.length) ?? 0); - }, ((_a = root.indices) == null ? void 0 : _a.length) ?? 0); - const sliceIndices = forceCloneIndices || others.some((vertexData) => vertexData.indices === root.indices); - let indices = sliceIndices ? (_b = root.indices) == null ? void 0 : _b.slice() : root.indices; - if (totalIndices > 0) { - let indicesOffset = (indices == null ? void 0 : indices.length) ?? 0; - if (!indices) { - indices = new Array(totalIndices); - } - if (indices.length !== totalIndices) { - if (Array.isArray(indices)) { - indices.length = totalIndices; - } else { - const temp = use32BitsIndices || indices instanceof Uint32Array ? new Uint32Array(totalIndices) : new Uint16Array(totalIndices); - temp.set(indices); - indices = temp; - } - if (transform && transform.determinant() < 0) { - _VertexData._FlipFaces(indices, 0, indicesOffset); - } - } - let positionsOffset = root.positions ? root.positions.length / 3 : 0; - for (const { vertexData: other, transform: transform2 } of vertexDatas) { - if (other.indices) { - for (let index = 0; index < other.indices.length; index++) { - indices[indicesOffset + index] = other.indices[index] + positionsOffset; - } - if (transform2 && transform2.determinant() < 0) { - _VertexData._FlipFaces(indices, indicesOffset, other.indices.length); - } - positionsOffset += other.positions.length / 3; - indicesOffset += other.indices.length; - if (isAsync) { - yield; - } - } - } - } - this.indices = indices; - this.positions = _VertexData._MergeElement(VertexBuffer.PositionKind, root.positions, transform, vertexDatas.map((other) => [other.vertexData.positions, other.transform])); - if (isAsync) { - yield; - } - if (root.normals) { - this.normals = _VertexData._MergeElement(VertexBuffer.NormalKind, root.normals, transform, vertexDatas.map((other) => [other.vertexData.normals, other.transform])); - if (isAsync) { - yield; - } } - if (root.tangents) { - this.tangents = _VertexData._MergeElement(VertexBuffer.TangentKind, root.tangents, transform, vertexDatas.map((other) => [other.vertexData.tangents, other.transform])); - if (isAsync) { - yield; - } + } + // FPS + /** + * Gets the current framerate + * @returns a number representing the framerate + */ + getFps() { + return this._fps; + } + /** + * Gets the time spent between current and previous frame + * @returns a number representing the delta time in ms + */ + getDeltaTime() { + return this._deltaTime; + } + _measureFps() { + this._performanceMonitor.sampleFrame(); + this._fps = this._performanceMonitor.averageFPS; + this._deltaTime = this._performanceMonitor.instantaneousFrameTime || 0; + } + /** + * Wraps an external web gl texture in a Babylon texture. + * @param texture defines the external texture + * @param hasMipMaps defines whether the external texture has mip maps (default: false) + * @param samplingMode defines the sampling mode for the external texture (default: 3) + * @param width defines the width for the external texture (default: 0) + * @param height defines the height for the external texture (default: 0) + * @returns the babylon internal texture + */ + wrapWebGLTexture(texture, hasMipMaps = false, samplingMode = 3, width = 0, height = 0) { + const hardwareTexture = new WebGLHardwareTexture(texture, this._gl); + const internalTexture = new InternalTexture(this, InternalTextureSource.Unknown, true); + internalTexture._hardwareTexture = hardwareTexture; + internalTexture.baseWidth = width; + internalTexture.baseHeight = height; + internalTexture.width = width; + internalTexture.height = height; + internalTexture.isReady = true; + internalTexture.useMipMaps = hasMipMaps; + this.updateTextureSamplingMode(samplingMode, internalTexture); + return internalTexture; + } + /** + * @internal + */ + _uploadImageToTexture(texture, image, faceIndex = 0, lod = 0) { + const gl = this._gl; + const textureType = this._getWebGLTextureType(texture.type); + const format = this._getInternalFormat(texture.format); + const internalFormat = this._getRGBABufferInternalSizedFormat(texture.type, format); + const bindTarget = texture.isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D; + this._bindTextureDirectly(bindTarget, texture, true); + this._unpackFlipY(texture.invertY); + let target = gl.TEXTURE_2D; + if (texture.isCube) { + target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex; } - if (root.uvs) { - this.uvs = _VertexData._MergeElement(VertexBuffer.UVKind, root.uvs, transform, vertexDatas.map((other) => [other.vertexData.uvs, other.transform])); - if (isAsync) { - yield; - } + gl.texImage2D(target, lod, internalFormat, format, textureType, image); + this._bindTextureDirectly(bindTarget, null, true); + } + /** + * Updates a depth texture Comparison Mode and Function. + * If the comparison Function is equal to 0, the mode will be set to none. + * Otherwise, this only works in webgl 2 and requires a shadow sampler in the shader. + * @param texture The texture to set the comparison function for + * @param comparisonFunction The comparison function to set, 0 if no comparison required + */ + updateTextureComparisonFunction(texture, comparisonFunction) { + if (this.webGLVersion === 1) { + Logger.Error("WebGL 1 does not support texture comparison."); + return; } - if (root.uvs2) { - this.uvs2 = _VertexData._MergeElement(VertexBuffer.UV2Kind, root.uvs2, transform, vertexDatas.map((other) => [other.vertexData.uvs2, other.transform])); - if (isAsync) { - yield; + const gl = this._gl; + if (texture.isCube) { + this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, texture, true); + if (comparisonFunction === 0) { + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_FUNC, 515); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_MODE, gl.NONE); + } else { + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_FUNC, comparisonFunction); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE); } - } - if (root.uvs3) { - this.uvs3 = _VertexData._MergeElement(VertexBuffer.UV3Kind, root.uvs3, transform, vertexDatas.map((other) => [other.vertexData.uvs3, other.transform])); - if (isAsync) { - yield; + this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null); + } else { + this._bindTextureDirectly(this._gl.TEXTURE_2D, texture, true); + if (comparisonFunction === 0) { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_FUNC, 515); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_MODE, gl.NONE); + } else { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_FUNC, comparisonFunction); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE); } + this._bindTextureDirectly(this._gl.TEXTURE_2D, null); } - if (root.uvs4) { - this.uvs4 = _VertexData._MergeElement(VertexBuffer.UV4Kind, root.uvs4, transform, vertexDatas.map((other) => [other.vertexData.uvs4, other.transform])); - if (isAsync) { - yield; - } + texture._comparisonFunction = comparisonFunction; + } + /** + * Creates a webGL buffer to use with instantiation + * @param capacity defines the size of the buffer + * @returns the webGL buffer + */ + createInstancesBuffer(capacity) { + const buffer = this._gl.createBuffer(); + if (!buffer) { + throw new Error("Unable to create instance buffer"); } - if (root.uvs5) { - this.uvs5 = _VertexData._MergeElement(VertexBuffer.UV5Kind, root.uvs5, transform, vertexDatas.map((other) => [other.vertexData.uvs5, other.transform])); - if (isAsync) { - yield; - } - } - if (root.uvs6) { - this.uvs6 = _VertexData._MergeElement(VertexBuffer.UV6Kind, root.uvs6, transform, vertexDatas.map((other) => [other.vertexData.uvs6, other.transform])); - if (isAsync) { - yield; - } - } - if (root.colors) { - this.colors = _VertexData._MergeElement(VertexBuffer.ColorKind, root.colors, transform, vertexDatas.map((other) => [other.vertexData.colors, other.transform])); - if (root.hasVertexAlpha !== void 0 || vertexDatas.some((other) => other.vertexData.hasVertexAlpha !== void 0)) { - this.hasVertexAlpha = root.hasVertexAlpha || vertexDatas.some((other) => other.vertexData.hasVertexAlpha); - } - if (isAsync) { - yield; - } - } - if (root.matricesIndices) { - this.matricesIndices = _VertexData._MergeElement(VertexBuffer.MatricesIndicesKind, root.matricesIndices, transform, vertexDatas.map((other) => [other.vertexData.matricesIndices, other.transform])); - if (isAsync) { - yield; - } - } - if (root.matricesWeights) { - this.matricesWeights = _VertexData._MergeElement(VertexBuffer.MatricesWeightsKind, root.matricesWeights, transform, vertexDatas.map((other) => [other.vertexData.matricesWeights, other.transform])); - if (isAsync) { - yield; - } - } - if (root.matricesIndicesExtra) { - this.matricesIndicesExtra = _VertexData._MergeElement(VertexBuffer.MatricesIndicesExtraKind, root.matricesIndicesExtra, transform, vertexDatas.map((other) => [other.vertexData.matricesIndicesExtra, other.transform])); - if (isAsync) { - yield; - } - } - if (root.matricesWeightsExtra) { - this.matricesWeightsExtra = _VertexData._MergeElement(VertexBuffer.MatricesWeightsExtraKind, root.matricesWeightsExtra, transform, vertexDatas.map((other) => [other.vertexData.matricesWeightsExtra, other.transform])); - } - return this; + const result = new WebGLDataBuffer(buffer); + result.capacity = capacity; + this.bindArrayBuffer(result); + this._gl.bufferData(this._gl.ARRAY_BUFFER, capacity, this._gl.DYNAMIC_DRAW); + result.references = 1; + return result; } - static _MergeElement(kind, source, transform, others) { - const nonNullOthers = others.filter((other) => other[0] !== null && other[0] !== void 0); - if (!source && nonNullOthers.length == 0) { - return source; - } - if (!source) { - return this._MergeElement(kind, nonNullOthers[0][0], nonNullOthers[0][1], nonNullOthers.slice(1)); - } - const len = nonNullOthers.reduce((sumLen, elements) => sumLen + elements[0].length, source.length); - const transformRange = kind === VertexBuffer.PositionKind ? _VertexData._TransformVector3Coordinates : kind === VertexBuffer.NormalKind ? _VertexData._TransformVector3Normals : kind === VertexBuffer.TangentKind ? _VertexData._TransformVector4Normals : () => { - }; - if (source instanceof Float32Array) { - const ret32 = new Float32Array(len); - ret32.set(source); - transform && transformRange(ret32, transform, 0, source.length); - let offset = source.length; - for (const [vertexData, transform2] of nonNullOthers) { - ret32.set(vertexData, offset); - transform2 && transformRange(ret32, transform2, offset, vertexData.length); - offset += vertexData.length; - } - return ret32; - } else { - const ret = new Array(len); - for (let i = 0; i < source.length; i++) { - ret[i] = source[i]; - } - transform && transformRange(ret, transform, 0, source.length); - let offset = source.length; - for (const [vertexData, transform2] of nonNullOthers) { - for (let i = 0; i < vertexData.length; i++) { - ret[offset + i] = vertexData[i]; + /** + * Delete a webGL buffer used with instantiation + * @param buffer defines the webGL buffer to delete + */ + deleteInstancesBuffer(buffer) { + this._gl.deleteBuffer(buffer); + } + _clientWaitAsync(sync, flags = 0, intervalms = 10) { + const gl = this._gl; + return new Promise((resolve, reject) => { + const check = () => { + const res = gl.clientWaitSync(sync, flags, 0); + if (res == gl.WAIT_FAILED) { + reject(); + return; } - transform2 && transformRange(ret, transform2, offset, vertexData.length); - offset += vertexData.length; - } - return ret; - } + if (res == gl.TIMEOUT_EXPIRED) { + setTimeout(check, intervalms); + return; + } + resolve(); + }; + check(); + }); } - _validate() { - if (!this.positions) { - throw new RuntimeError("Positions are required", ErrorCodes.MeshInvalidPositionsError); - } - const getElementCount = (kind, values) => { - const stride = VertexBuffer.DeduceStride(kind); - if (values.length % stride !== 0) { - throw new Error("The " + kind + "s array count must be a multiple of " + stride); - } - return values.length / stride; - }; - const positionsElementCount = getElementCount(VertexBuffer.PositionKind, this.positions); - const validateElementCount = (kind, values) => { - const elementCount = getElementCount(kind, values); - if (elementCount !== positionsElementCount) { - throw new Error("The " + kind + "s element count (" + elementCount + ") does not match the positions count (" + positionsElementCount + ")"); - } - }; - if (this.normals) { - validateElementCount(VertexBuffer.NormalKind, this.normals); + /** + * @internal + */ + _readPixelsAsync(x, y, w, h, format, type, outputBuffer) { + if (this._webGLVersion < 2) { + throw new Error("_readPixelsAsync only work on WebGL2+"); } - if (this.tangents) { - validateElementCount(VertexBuffer.TangentKind, this.tangents); + const gl = this._gl; + const buf = gl.createBuffer(); + gl.bindBuffer(gl.PIXEL_PACK_BUFFER, buf); + gl.bufferData(gl.PIXEL_PACK_BUFFER, outputBuffer.byteLength, gl.STREAM_READ); + gl.readPixels(x, y, w, h, format, type, 0); + gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null); + const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0); + if (!sync) { + return null; } - if (this.uvs) { - validateElementCount(VertexBuffer.UVKind, this.uvs); + gl.flush(); + return this._clientWaitAsync(sync, 0, 10).then(() => { + gl.deleteSync(sync); + gl.bindBuffer(gl.PIXEL_PACK_BUFFER, buf); + gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, outputBuffer); + gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null); + gl.deleteBuffer(buf); + return outputBuffer; + }); + } + dispose() { + this.hideLoadingUI(); + this.onNewSceneAddedObservable.clear(); + while (this.postProcesses.length) { + this.postProcesses[0].dispose(); } - if (this.uvs2) { - validateElementCount(VertexBuffer.UV2Kind, this.uvs2); + if (this._rescalePostProcess) { + this._rescalePostProcess.dispose(); } - if (this.uvs3) { - validateElementCount(VertexBuffer.UV3Kind, this.uvs3); + while (this.scenes.length) { + this.scenes[0].dispose(); } - if (this.uvs4) { - validateElementCount(VertexBuffer.UV4Kind, this.uvs4); + while (this._virtualScenes.length) { + this._virtualScenes[0].dispose(); } - if (this.uvs5) { - validateElementCount(VertexBuffer.UV5Kind, this.uvs5); + if (EngineStore.Instances.length === 1 && _Engine.audioEngine) { + _Engine.audioEngine.dispose(); + _Engine.audioEngine = null; } - if (this.uvs6) { - validateElementCount(VertexBuffer.UV6Kind, this.uvs6); + const hostWindow = this.getHostWindow(); + if (hostWindow && typeof hostWindow.removeEventListener === "function") { + hostWindow.removeEventListener("blur", this._onBlur); + hostWindow.removeEventListener("focus", this._onFocus); } - if (this.colors) { - validateElementCount(VertexBuffer.ColorKind, this.colors); + if (this._renderingCanvas) { + this._renderingCanvas.removeEventListener("focus", this._onCanvasFocus); + this._renderingCanvas.removeEventListener("blur", this._onCanvasBlur); + this._renderingCanvas.removeEventListener("pointerout", this._onCanvasPointerOut); + this._renderingCanvas.removeEventListener("contextmenu", this._onCanvasContextMenu); } - if (this.matricesIndices) { - validateElementCount(VertexBuffer.MatricesIndicesKind, this.matricesIndices); + if (IsDocumentAvailable()) { + document.removeEventListener("fullscreenchange", this._onFullscreenChange); + document.removeEventListener("mozfullscreenchange", this._onFullscreenChange); + document.removeEventListener("webkitfullscreenchange", this._onFullscreenChange); + document.removeEventListener("msfullscreenchange", this._onFullscreenChange); + document.removeEventListener("pointerlockchange", this._onPointerLockChange); + document.removeEventListener("mspointerlockchange", this._onPointerLockChange); + document.removeEventListener("mozpointerlockchange", this._onPointerLockChange); + document.removeEventListener("webkitpointerlockchange", this._onPointerLockChange); } - if (this.matricesWeights) { - validateElementCount(VertexBuffer.MatricesWeightsKind, this.matricesWeights); + super.dispose(); + const index = EngineStore.Instances.indexOf(this); + if (index >= 0) { + EngineStore.Instances.splice(index, 1); } - if (this.matricesIndicesExtra) { - validateElementCount(VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra); + if (!_Engine.Instances.length) { + EngineStore.OnEnginesDisposedObservable.notifyObservers(this); } - if (this.matricesWeightsExtra) { - validateElementCount(VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra); + this.onResizeObservable.clear(); + this.onCanvasBlurObservable.clear(); + this.onCanvasFocusObservable.clear(); + this.onCanvasPointerOutObservable.clear(); + this.onBeginFrameObservable.clear(); + this.onEndFrameObservable.clear(); + } + _disableTouchAction() { + if (!this._renderingCanvas || !this._renderingCanvas.setAttribute) { + return; } + this._renderingCanvas.setAttribute("touch-action", "none"); + this._renderingCanvas.style.touchAction = "none"; + this._renderingCanvas.style.webkitTapHighlightColor = "transparent"; } + // Loading screen /** - * Clone the current vertex data - * @returns a copy of the current data + * Display the loading screen + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen */ - clone() { - const serializationObject = this.serialize(); - return _VertexData.Parse(serializationObject); + displayLoadingUI() { + if (!IsWindowObjectExist()) { + return; + } + const loadingScreen = this.loadingScreen; + if (loadingScreen) { + loadingScreen.displayLoadingUI(); + } } /** - * Serializes the VertexData - * @returns a serialized object + * Hide the loading screen + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen */ - serialize() { - const serializationObject = {}; - if (this.positions) { - serializationObject.positions = Array.from(this.positions); - } - if (this.normals) { - serializationObject.normals = Array.from(this.normals); - } - if (this.tangents) { - serializationObject.tangents = Array.from(this.tangents); - } - if (this.uvs) { - serializationObject.uvs = Array.from(this.uvs); - } - if (this.uvs2) { - serializationObject.uvs2 = Array.from(this.uvs2); - } - if (this.uvs3) { - serializationObject.uvs3 = Array.from(this.uvs3); - } - if (this.uvs4) { - serializationObject.uvs4 = Array.from(this.uvs4); - } - if (this.uvs5) { - serializationObject.uvs5 = Array.from(this.uvs5); - } - if (this.uvs6) { - serializationObject.uvs6 = Array.from(this.uvs6); - } - if (this.colors) { - serializationObject.colors = Array.from(this.colors); - serializationObject.hasVertexAlpha = this.hasVertexAlpha; - } - if (this.matricesIndices) { - serializationObject.matricesIndices = Array.from(this.matricesIndices); - serializationObject.matricesIndices._isExpanded = true; - } - if (this.matricesWeights) { - serializationObject.matricesWeights = Array.from(this.matricesWeights); - } - if (this.matricesIndicesExtra) { - serializationObject.matricesIndicesExtra = Array.from(this.matricesIndicesExtra); - serializationObject.matricesIndicesExtra._isExpanded = true; - } - if (this.matricesWeightsExtra) { - serializationObject.matricesWeightsExtra = Array.from(this.matricesWeightsExtra); + hideLoadingUI() { + if (!IsWindowObjectExist()) { + return; } - serializationObject.indices = Array.from(this.indices); - if (this.materialInfos) { - serializationObject.materialInfos = []; - for (const materialInfo of this.materialInfos) { - const materialInfoSerializationObject = { - indexStart: materialInfo.indexStart, - indexCount: materialInfo.indexCount, - materialIndex: materialInfo.materialIndex, - verticesStart: materialInfo.verticesStart, - verticesCount: materialInfo.verticesCount - }; - serializationObject.materialInfos.push(materialInfoSerializationObject); - } + const loadingScreen = this._loadingScreen; + if (loadingScreen) { + loadingScreen.hideLoadingUI(); } - return serializationObject; } - // Statics /** - * Extracts the vertexData from a mesh - * @param mesh the mesh from which to extract the VertexData - * @param copyWhenShared defines if the VertexData must be cloned when shared between multiple meshes, optional, default false - * @param forceCopy indicating that the VertexData must be cloned, optional, default false - * @returns the object VertexData associated to the passed mesh + * Gets the current loading screen object + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen */ - static ExtractFromMesh(mesh, copyWhenShared, forceCopy) { - return _VertexData._ExtractFrom(mesh, copyWhenShared, forceCopy); + get loadingScreen() { + if (!this._loadingScreen && this._renderingCanvas) { + this._loadingScreen = _Engine.DefaultLoadingScreenFactory(this._renderingCanvas); + } + return this._loadingScreen; } /** - * Extracts the vertexData from the geometry - * @param geometry the geometry from which to extract the VertexData - * @param copyWhenShared defines if the VertexData must be cloned when the geometry is shared between multiple meshes, optional, default false - * @param forceCopy indicating that the VertexData must be cloned, optional, default false - * @returns the object VertexData associated to the passed mesh + * Sets the current loading screen object + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen */ - static ExtractFromGeometry(geometry, copyWhenShared, forceCopy) { - return _VertexData._ExtractFrom(geometry, copyWhenShared, forceCopy); + set loadingScreen(loadingScreen) { + this._loadingScreen = loadingScreen; } - static _ExtractFrom(meshOrGeometry, copyWhenShared, forceCopy) { - const result = new _VertexData(); - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.PositionKind)) { - result.positions = meshOrGeometry.getVerticesData(VertexBuffer.PositionKind, copyWhenShared, forceCopy); - } - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.NormalKind)) { - result.normals = meshOrGeometry.getVerticesData(VertexBuffer.NormalKind, copyWhenShared, forceCopy); - } - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.TangentKind)) { - result.tangents = meshOrGeometry.getVerticesData(VertexBuffer.TangentKind, copyWhenShared, forceCopy); - } - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UVKind)) { - result.uvs = meshOrGeometry.getVerticesData(VertexBuffer.UVKind, copyWhenShared, forceCopy); - } - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV2Kind)) { - result.uvs2 = meshOrGeometry.getVerticesData(VertexBuffer.UV2Kind, copyWhenShared, forceCopy); - } - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV3Kind)) { - result.uvs3 = meshOrGeometry.getVerticesData(VertexBuffer.UV3Kind, copyWhenShared, forceCopy); - } - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV4Kind)) { - result.uvs4 = meshOrGeometry.getVerticesData(VertexBuffer.UV4Kind, copyWhenShared, forceCopy); - } - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV5Kind)) { - result.uvs5 = meshOrGeometry.getVerticesData(VertexBuffer.UV5Kind, copyWhenShared, forceCopy); - } - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV6Kind)) { - result.uvs6 = meshOrGeometry.getVerticesData(VertexBuffer.UV6Kind, copyWhenShared, forceCopy); - } - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.ColorKind)) { - result.colors = meshOrGeometry.getVerticesData(VertexBuffer.ColorKind, copyWhenShared, forceCopy); - } - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind)) { - result.matricesIndices = meshOrGeometry.getVerticesData(VertexBuffer.MatricesIndicesKind, copyWhenShared, forceCopy); - } - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) { - result.matricesWeights = meshOrGeometry.getVerticesData(VertexBuffer.MatricesWeightsKind, copyWhenShared, forceCopy); - } - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesIndicesExtraKind)) { - result.matricesIndicesExtra = meshOrGeometry.getVerticesData(VertexBuffer.MatricesIndicesExtraKind, copyWhenShared, forceCopy); - } - if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesWeightsExtraKind)) { - result.matricesWeightsExtra = meshOrGeometry.getVerticesData(VertexBuffer.MatricesWeightsExtraKind, copyWhenShared, forceCopy); - } - result.indices = meshOrGeometry.getIndices(copyWhenShared, forceCopy); - return result; + /** + * Sets the current loading screen text + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen + */ + set loadingUIText(text) { + this.loadingScreen.loadingUIText = text; } /** - * Creates the VertexData for a Ribbon - * @param options an object used to set the following optional parameters for the ribbon, required but can be empty - * * pathArray array of paths, each of which an array of successive Vector3 - * * closeArray creates a seam between the first and the last paths of the pathArray, optional, default false - * * closePath creates a seam between the first and the last points of each path of the path array, optional, default false - * * offset a positive integer, only used when pathArray contains a single path (offset = 10 means the point 1 is joined to the point 11), default rounded half size of the pathArray length - * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) - * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) - * * invertUV swaps in the U and V coordinates when applying a texture, optional, default false - * * uvs a linear array, of length 2 * number of vertices, of custom UV values, optional - * * colors a linear array, of length 4 * number of vertices, of custom color values, optional - * @returns the VertexData of the ribbon - * @deprecated use CreateRibbonVertexData instead + * Sets the current loading screen background color + * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen */ - static CreateRibbon(options) { - throw _WarnImport("ribbonBuilder"); + set loadingUIBackgroundColor(color) { + this.loadingScreen.loadingUIBackgroundColor = color; } /** - * Creates the VertexData for a box - * @param options an object used to set the following optional parameters for the box, required but can be empty - * * size sets the width, height and depth of the box to the value of size, optional default 1 - * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size - * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size - * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size - * * faceUV an array of 6 Vector4 elements used to set different images to each box side - * * faceColors an array of 6 Color3 elements used to set different colors to each box side - * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) - * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) - * @returns the VertexData of the box - * @deprecated Please use CreateBoxVertexData from the BoxBuilder file instead + * creates and returns a new video element + * @param constraints video constraints + * @returns video element */ - static CreateBox(options) { - throw _WarnImport("boxBuilder"); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + createVideoElement(constraints) { + return document.createElement("video"); } + /** Pointerlock and fullscreen */ /** - * Creates the VertexData for a tiled box - * @param options an object used to set the following optional parameters for the box, required but can be empty - * * faceTiles sets the pattern, tile size and number of tiles for a face - * * faceUV an array of 6 Vector4 elements used to set different images to each box side - * * faceColors an array of 6 Color3 elements used to set different colors to each box side - * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * @param options.pattern - * @param options.width - * @param options.height - * @param options.depth - * @param options.tileSize - * @param options.tileWidth - * @param options.tileHeight - * @param options.alignHorizontal - * @param options.alignVertical - * @param options.faceUV - * @param options.faceColors - * @param options.sideOrientation - * @returns the VertexData of the box - * @deprecated Please use CreateTiledBoxVertexData instead + * Ask the browser to promote the current element to pointerlock mode + * @param element defines the DOM element to promote */ - static CreateTiledBox(options) { - throw _WarnImport("tiledBoxBuilder"); + static _RequestPointerlock(element) { + if (element.requestPointerLock) { + const promise = element.requestPointerLock(); + if (promise instanceof Promise) + promise.then(() => { + element.focus(); + }).catch(() => { + }); + else + element.focus(); + } } /** - * Creates the VertexData for a tiled plane - * @param options an object used to set the following optional parameters for the box, required but can be empty - * * pattern a limited pattern arrangement depending on the number - * * tileSize sets the width, height and depth of the tile to the value of size, optional default 1 - * * tileWidth sets the width (x direction) of the tile, overwrites the width set by size, optional, default size - * * tileHeight sets the height (y direction) of the tile, overwrites the height set by size, optional, default size - * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) - * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) - * @returns the VertexData of the tiled plane - * @deprecated use CreateTiledPlaneVertexData instead + * Asks the browser to exit pointerlock mode */ - static CreateTiledPlane(options) { - throw _WarnImport("tiledPlaneBuilder"); + static _ExitPointerlock() { + if (document.exitPointerLock) { + document.exitPointerLock(); + } } /** - * Creates the VertexData for an ellipsoid, defaults to a sphere - * @param options an object used to set the following optional parameters for the box, required but can be empty - * * segments sets the number of horizontal strips optional, default 32 - * * diameter sets the axes dimensions, diameterX, diameterY and diameterZ to the value of diameter, optional default 1 - * * diameterX sets the diameterX (x direction) of the ellipsoid, overwrites the diameterX set by diameter, optional, default diameter - * * diameterY sets the diameterY (y direction) of the ellipsoid, overwrites the diameterY set by diameter, optional, default diameter - * * diameterZ sets the diameterZ (z direction) of the ellipsoid, overwrites the diameterZ set by diameter, optional, default diameter - * * arc a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the circumference (latitude) given by the arc value, optional, default 1 - * * slice a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the height (latitude) given by the arc value, optional, default 1 - * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) - * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) - * @returns the VertexData of the ellipsoid - * @deprecated use CreateSphereVertexData instead + * Ask the browser to promote the current element to fullscreen rendering mode + * @param element defines the DOM element to promote */ - static CreateSphere(options) { - throw _WarnImport("sphereBuilder"); + static _RequestFullscreen(element) { + const requestFunction = element.requestFullscreen || element.webkitRequestFullscreen; + if (!requestFunction) { + return; + } + requestFunction.call(element); } /** - * Creates the VertexData for a cylinder, cone or prism - * @param options an object used to set the following optional parameters for the box, required but can be empty - * * height sets the height (y direction) of the cylinder, optional, default 2 - * * diameterTop sets the diameter of the top of the cone, overwrites diameter, optional, default diameter - * * diameterBottom sets the diameter of the bottom of the cone, overwrites diameter, optional, default diameter - * * diameter sets the diameter of the top and bottom of the cone, optional default 1 - * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24 - * * subdivisions` the number of rings along the cylinder height, optional, default 1 - * * arc a number from 0 to 1, to create an unclosed cylinder based on the fraction of the circumference given by the arc value, optional, default 1 - * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively - * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively - * * hasRings when true makes each subdivision independently treated as a face for faceUV and faceColors, optional, default false - * * enclose when true closes an open cylinder by adding extra flat faces between the height axis and vertical edges, think cut cake - * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) - * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) - * @returns the VertexData of the cylinder, cone or prism - * @deprecated please use CreateCylinderVertexData instead + * Asks the browser to exit fullscreen mode */ - static CreateCylinder(options) { - throw _WarnImport("cylinderBuilder"); + static _ExitFullscreen() { + const anyDoc = document; + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (anyDoc.webkitCancelFullScreen) { + anyDoc.webkitCancelFullScreen(); + } } /** - * Creates the VertexData for a torus - * @param options an object used to set the following optional parameters for the box, required but can be empty - * * diameter the diameter of the torus, optional default 1 - * * thickness the diameter of the tube forming the torus, optional default 0.5 - * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24 - * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) - * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) - * @returns the VertexData of the torus - * @deprecated use CreateTorusVertexData instead + * Get Font size information + * @param font font name + * @returns an object containing ascent, height and descent */ - static CreateTorus(options) { - throw _WarnImport("torusBuilder"); + getFontOffset(font) { + const text = document.createElement("span"); + text.innerHTML = "Hg"; + text.setAttribute("style", `font: ${font} !important`); + const block = document.createElement("div"); + block.style.display = "inline-block"; + block.style.width = "1px"; + block.style.height = "0px"; + block.style.verticalAlign = "bottom"; + const div = document.createElement("div"); + div.style.whiteSpace = "nowrap"; + div.appendChild(text); + div.appendChild(block); + document.body.appendChild(div); + let fontAscent = 0; + let fontHeight = 0; + try { + fontHeight = block.getBoundingClientRect().top - text.getBoundingClientRect().top; + block.style.verticalAlign = "baseline"; + fontAscent = block.getBoundingClientRect().top - text.getBoundingClientRect().top; + } finally { + document.body.removeChild(div); + } + return { ascent: fontAscent, height: fontHeight, descent: fontHeight - fontAscent }; } - /** - * Creates the VertexData of the LineSystem - * @param options an object used to set the following optional parameters for the LineSystem, required but can be empty - * - lines an array of lines, each line being an array of successive Vector3 - * - colors an array of line colors, each of the line colors being an array of successive Color4, one per line point - * @returns the VertexData of the LineSystem - * @deprecated use CreateLineSystemVertexData instead - */ - static CreateLineSystem(options) { - throw _WarnImport("linesBuilder"); +}; +Engine.ALPHA_DISABLE = 0; +Engine.ALPHA_ADD = 1; +Engine.ALPHA_COMBINE = 2; +Engine.ALPHA_SUBTRACT = 3; +Engine.ALPHA_MULTIPLY = 4; +Engine.ALPHA_MAXIMIZED = 5; +Engine.ALPHA_ONEONE = 6; +Engine.ALPHA_PREMULTIPLIED = 7; +Engine.ALPHA_PREMULTIPLIED_PORTERDUFF = 8; +Engine.ALPHA_INTERPOLATE = 9; +Engine.ALPHA_SCREENMODE = 10; +Engine.DELAYLOADSTATE_NONE = 0; +Engine.DELAYLOADSTATE_LOADED = 1; +Engine.DELAYLOADSTATE_LOADING = 2; +Engine.DELAYLOADSTATE_NOTLOADED = 4; +Engine.NEVER = 512; +Engine.ALWAYS = 519; +Engine.LESS = 513; +Engine.EQUAL = 514; +Engine.LEQUAL = 515; +Engine.GREATER = 516; +Engine.GEQUAL = 518; +Engine.NOTEQUAL = 517; +Engine.KEEP = 7680; +Engine.REPLACE = 7681; +Engine.INCR = 7682; +Engine.DECR = 7683; +Engine.INVERT = 5386; +Engine.INCR_WRAP = 34055; +Engine.DECR_WRAP = 34056; +Engine.TEXTURE_CLAMP_ADDRESSMODE = 0; +Engine.TEXTURE_WRAP_ADDRESSMODE = 1; +Engine.TEXTURE_MIRROR_ADDRESSMODE = 2; +Engine.TEXTUREFORMAT_ALPHA = 0; +Engine.TEXTUREFORMAT_LUMINANCE = 1; +Engine.TEXTUREFORMAT_LUMINANCE_ALPHA = 2; +Engine.TEXTUREFORMAT_RGB = 4; +Engine.TEXTUREFORMAT_RGBA = 5; +Engine.TEXTUREFORMAT_RED = 6; +Engine.TEXTUREFORMAT_R = 6; +Engine.TEXTUREFORMAT_RG = 7; +Engine.TEXTUREFORMAT_RED_INTEGER = 8; +Engine.TEXTUREFORMAT_R_INTEGER = 8; +Engine.TEXTUREFORMAT_RG_INTEGER = 9; +Engine.TEXTUREFORMAT_RGB_INTEGER = 10; +Engine.TEXTUREFORMAT_RGBA_INTEGER = 11; +Engine.TEXTURETYPE_UNSIGNED_BYTE = 0; +Engine.TEXTURETYPE_UNSIGNED_INT = 0; +Engine.TEXTURETYPE_FLOAT = 1; +Engine.TEXTURETYPE_HALF_FLOAT = 2; +Engine.TEXTURETYPE_BYTE = 3; +Engine.TEXTURETYPE_SHORT = 4; +Engine.TEXTURETYPE_UNSIGNED_SHORT = 5; +Engine.TEXTURETYPE_INT = 6; +Engine.TEXTURETYPE_UNSIGNED_INTEGER = 7; +Engine.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4 = 8; +Engine.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1 = 9; +Engine.TEXTURETYPE_UNSIGNED_SHORT_5_6_5 = 10; +Engine.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV = 11; +Engine.TEXTURETYPE_UNSIGNED_INT_24_8 = 12; +Engine.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV = 13; +Engine.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV = 14; +Engine.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV = 15; +Engine.TEXTURE_NEAREST_SAMPLINGMODE = 1; +Engine.TEXTURE_BILINEAR_SAMPLINGMODE = 2; +Engine.TEXTURE_TRILINEAR_SAMPLINGMODE = 3; +Engine.TEXTURE_NEAREST_NEAREST_MIPLINEAR = 8; +Engine.TEXTURE_LINEAR_LINEAR_MIPNEAREST = 11; +Engine.TEXTURE_LINEAR_LINEAR_MIPLINEAR = 3; +Engine.TEXTURE_NEAREST_NEAREST_MIPNEAREST = 4; +Engine.TEXTURE_NEAREST_LINEAR_MIPNEAREST = 5; +Engine.TEXTURE_NEAREST_LINEAR_MIPLINEAR = 6; +Engine.TEXTURE_NEAREST_LINEAR = 7; +Engine.TEXTURE_NEAREST_NEAREST = 1; +Engine.TEXTURE_LINEAR_NEAREST_MIPNEAREST = 9; +Engine.TEXTURE_LINEAR_NEAREST_MIPLINEAR = 10; +Engine.TEXTURE_LINEAR_LINEAR = 2; +Engine.TEXTURE_LINEAR_NEAREST = 12; +Engine.TEXTURE_EXPLICIT_MODE = 0; +Engine.TEXTURE_SPHERICAL_MODE = 1; +Engine.TEXTURE_PLANAR_MODE = 2; +Engine.TEXTURE_CUBIC_MODE = 3; +Engine.TEXTURE_PROJECTION_MODE = 4; +Engine.TEXTURE_SKYBOX_MODE = 5; +Engine.TEXTURE_INVCUBIC_MODE = 6; +Engine.TEXTURE_EQUIRECTANGULAR_MODE = 7; +Engine.TEXTURE_FIXED_EQUIRECTANGULAR_MODE = 8; +Engine.TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9; +Engine.SCALEMODE_FLOOR = 1; +Engine.SCALEMODE_NEAREST = 2; +Engine.SCALEMODE_CEILING = 3; +Engine._RescalePostProcessFactory = null; +Engine._RenderPassIdCounter = 0; + +// node_modules/@babylonjs/core/Misc/coroutine.js +function inlineScheduler(coroutine, onStep, onError) { + try { + const step = coroutine.next(); + if (step.done) { + onStep(step); + } else if (!step.value) { + onStep(step); + } else { + step.value.then(() => { + step.value = void 0; + onStep(step); + }, onError); + } + } catch (error) { + onError(error); + } +} +function createYieldingScheduler(yieldAfterMS = 25) { + let startTime; + return (coroutine, onStep, onError) => { + const currentTime = performance.now(); + if (startTime === void 0 || currentTime - startTime > yieldAfterMS) { + startTime = currentTime; + setTimeout(() => { + inlineScheduler(coroutine, onStep, onError); + }, 0); + } else { + inlineScheduler(coroutine, onStep, onError); + } + }; +} +function runCoroutine(coroutine, scheduler, onSuccess, onError, abortSignal) { + const resume = () => { + let reschedule; + const onStep = (stepResult) => { + if (stepResult.done) { + onSuccess(stepResult.value); + } else { + if (reschedule === void 0) { + reschedule = true; + } else { + resume(); + } + } + }; + do { + reschedule = void 0; + if (!abortSignal || !abortSignal.aborted) { + scheduler(coroutine, onStep, onError); + } else { + onError(new Error("Aborted")); + } + if (reschedule === void 0) { + reschedule = false; + } + } while (reschedule); + }; + resume(); +} +function runCoroutineSync(coroutine, abortSignal) { + let result; + runCoroutine(coroutine, inlineScheduler, (r) => result = r, (e) => { + throw e; + }, abortSignal); + return result; +} +function runCoroutineAsync(coroutine, scheduler, abortSignal) { + return new Promise((resolve, reject) => { + runCoroutine(coroutine, scheduler, resolve, reject, abortSignal); + }); +} +function makeSyncFunction(coroutineFactory, abortSignal) { + return (...params) => { + return runCoroutineSync(coroutineFactory(...params), abortSignal); + }; +} +function makeAsyncFunction(coroutineFactory, scheduler, abortSignal) { + return (...params) => { + return runCoroutineAsync(coroutineFactory(...params), scheduler, abortSignal); + }; +} + +// node_modules/@babylonjs/core/Collisions/intersectionInfo.js +var IntersectionInfo = class { + constructor(bu, bv, distance) { + this.bu = bu; + this.bv = bv; + this.distance = distance; + this.faceId = 0; + this.subMeshId = 0; } +}; + +// node_modules/@babylonjs/core/Culling/boundingBox.js +var BoundingBox = class _BoundingBox { /** - * Create the VertexData for a DashedLines - * @param options an object used to set the following optional parameters for the DashedLines, required but can be empty - * - points an array successive Vector3 - * - dashSize the size of the dashes relative to the dash number, optional, default 3 - * - gapSize the size of the gap between two successive dashes relative to the dash number, optional, default 1 - * - dashNb the intended total number of dashes, optional, default 200 - * @returns the VertexData for the DashedLines - * @deprecated use CreateDashedLinesVertexData instead + * Creates a new bounding box + * @param min defines the minimum vector (in local space) + * @param max defines the maximum vector (in local space) + * @param worldMatrix defines the new world matrix */ - static CreateDashedLines(options) { - throw _WarnImport("linesBuilder"); + constructor(min, max, worldMatrix) { + this.vectors = ArrayTools.BuildArray(8, Vector3.Zero); + this.center = Vector3.Zero(); + this.centerWorld = Vector3.Zero(); + this.extendSize = Vector3.Zero(); + this.extendSizeWorld = Vector3.Zero(); + this.directions = ArrayTools.BuildArray(3, Vector3.Zero); + this.vectorsWorld = ArrayTools.BuildArray(8, Vector3.Zero); + this.minimumWorld = Vector3.Zero(); + this.maximumWorld = Vector3.Zero(); + this.minimum = Vector3.Zero(); + this.maximum = Vector3.Zero(); + this._drawWrapperFront = null; + this._drawWrapperBack = null; + this.reConstruct(min, max, worldMatrix); } + // Methods /** - * Creates the VertexData for a Ground - * @param options an object used to set the following optional parameters for the Ground, required but can be empty - * - width the width (x direction) of the ground, optional, default 1 - * - height the height (z direction) of the ground, optional, default 1 - * - subdivisions the number of subdivisions per side, optional, default 1 - * @returns the VertexData of the Ground - * @deprecated Please use CreateGroundVertexData instead + * Recreates the entire bounding box from scratch as if we call the constructor in place + * @param min defines the new minimum vector (in local space) + * @param max defines the new maximum vector (in local space) + * @param worldMatrix defines the new world matrix */ - static CreateGround(options) { - throw _WarnImport("groundBuilder"); + reConstruct(min, max, worldMatrix) { + const minX = min.x, minY = min.y, minZ = min.z, maxX = max.x, maxY = max.y, maxZ = max.z; + const vectors = this.vectors; + this.minimum.copyFromFloats(minX, minY, minZ); + this.maximum.copyFromFloats(maxX, maxY, maxZ); + vectors[0].copyFromFloats(minX, minY, minZ); + vectors[1].copyFromFloats(maxX, maxY, maxZ); + vectors[2].copyFromFloats(maxX, minY, minZ); + vectors[3].copyFromFloats(minX, maxY, minZ); + vectors[4].copyFromFloats(minX, minY, maxZ); + vectors[5].copyFromFloats(maxX, maxY, minZ); + vectors[6].copyFromFloats(minX, maxY, maxZ); + vectors[7].copyFromFloats(maxX, minY, maxZ); + max.addToRef(min, this.center).scaleInPlace(0.5); + max.subtractToRef(min, this.extendSize).scaleInPlace(0.5); + this._worldMatrix = worldMatrix || Matrix.IdentityReadOnly; + this._update(this._worldMatrix); } /** - * Creates the VertexData for a TiledGround by subdividing the ground into tiles - * @param options an object used to set the following optional parameters for the Ground, required but can be empty - * * xmin the ground minimum X coordinate, optional, default -1 - * * zmin the ground minimum Z coordinate, optional, default -1 - * * xmax the ground maximum X coordinate, optional, default 1 - * * zmax the ground maximum Z coordinate, optional, default 1 - * * subdivisions a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the ground width and height creating 'tiles', default {w: 6, h: 6} - * * precision a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the tile width and height, default {w: 2, h: 2} - * @returns the VertexData of the TiledGround - * @deprecated use CreateTiledGroundVertexData instead + * Scale the current bounding box by applying a scale factor + * @param factor defines the scale factor to apply + * @returns the current bounding box */ - static CreateTiledGround(options) { - throw _WarnImport("groundBuilder"); + scale(factor) { + const tmpVectors = _BoundingBox._TmpVector3; + const diff = this.maximum.subtractToRef(this.minimum, tmpVectors[0]); + const len = diff.length(); + diff.normalizeFromLength(len); + const distance = len * factor; + const newRadius = diff.scaleInPlace(distance * 0.5); + const min = this.center.subtractToRef(newRadius, tmpVectors[1]); + const max = this.center.addToRef(newRadius, tmpVectors[2]); + this.reConstruct(min, max, this._worldMatrix); + return this; } /** - * Creates the VertexData of the Ground designed from a heightmap - * @param options an object used to set the following parameters for the Ground, required and provided by CreateGroundFromHeightMap - * * width the width (x direction) of the ground - * * height the height (z direction) of the ground - * * subdivisions the number of subdivisions per side - * * minHeight the minimum altitude on the ground, optional, default 0 - * * maxHeight the maximum altitude on the ground, optional default 1 - * * colorFilter the filter to apply to the image pixel colors to compute the height, optional Color3, default (0.3, 0.59, 0.11) - * * buffer the array holding the image color data - * * bufferWidth the width of image - * * bufferHeight the height of image - * * alphaFilter Remove any data where the alpha channel is below this value, defaults 0 (all data visible) - * @returns the VertexData of the Ground designed from a heightmap - * @deprecated use CreateGroundFromHeightMapVertexData instead + * Gets the world matrix of the bounding box + * @returns a matrix */ - static CreateGroundFromHeightMap(options) { - throw _WarnImport("groundBuilder"); + getWorldMatrix() { + return this._worldMatrix; } /** - * Creates the VertexData for a Plane - * @param options an object used to set the following optional parameters for the plane, required but can be empty - * * size sets the width and height of the plane to the value of size, optional default 1 - * * width sets the width (x direction) of the plane, overwrites the width set by size, optional, default size - * * height sets the height (y direction) of the plane, overwrites the height set by size, optional, default size - * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) - * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) - * @returns the VertexData of the box - * @deprecated use CreatePlaneVertexData instead + * @internal */ - static CreatePlane(options) { - throw _WarnImport("planeBuilder"); + _update(world) { + const minWorld = this.minimumWorld; + const maxWorld = this.maximumWorld; + const directions = this.directions; + const vectorsWorld = this.vectorsWorld; + const vectors = this.vectors; + if (!world.isIdentity()) { + minWorld.setAll(Number.MAX_VALUE); + maxWorld.setAll(-Number.MAX_VALUE); + for (let index = 0; index < 8; ++index) { + const v = vectorsWorld[index]; + Vector3.TransformCoordinatesToRef(vectors[index], world, v); + minWorld.minimizeInPlace(v); + maxWorld.maximizeInPlace(v); + } + maxWorld.subtractToRef(minWorld, this.extendSizeWorld).scaleInPlace(0.5); + maxWorld.addToRef(minWorld, this.centerWorld).scaleInPlace(0.5); + } else { + minWorld.copyFrom(this.minimum); + maxWorld.copyFrom(this.maximum); + for (let index = 0; index < 8; ++index) { + vectorsWorld[index].copyFrom(vectors[index]); + } + this.extendSizeWorld.copyFrom(this.extendSize); + this.centerWorld.copyFrom(this.center); + } + Vector3.FromArrayToRef(world.m, 0, directions[0]); + Vector3.FromArrayToRef(world.m, 4, directions[1]); + Vector3.FromArrayToRef(world.m, 8, directions[2]); + this._worldMatrix = world; } /** - * Creates the VertexData of the Disc or regular Polygon - * @param options an object used to set the following optional parameters for the disc, required but can be empty - * * radius the radius of the disc, optional default 0.5 - * * tessellation the number of polygon sides, optional, default 64 - * * arc a number from 0 to 1, to create an unclosed polygon based on the fraction of the circumference given by the arc value, optional, default 1 - * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) - * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) - * @returns the VertexData of the box - * @deprecated use CreateDiscVertexData instead + * Tests if the bounding box is intersecting the frustum planes + * @param frustumPlanes defines the frustum planes to test + * @returns true if there is an intersection */ - static CreateDisc(options) { - throw _WarnImport("discBuilder"); + isInFrustum(frustumPlanes) { + return _BoundingBox.IsInFrustum(this.vectorsWorld, frustumPlanes); } /** - * Creates the VertexData for an irregular Polygon in the XoZ plane using a mesh built by polygonTriangulation.build() - * All parameters are provided by CreatePolygon as needed - * @param polygon a mesh built from polygonTriangulation.build() - * @param sideOrientation takes the values Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * @param fUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively - * @param fColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively - * @param frontUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) - * @param backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) - * @param wrap a boolean, default false, when true and fUVs used texture is wrapped around all sides, when false texture is applied side - * @returns the VertexData of the Polygon - * @deprecated use CreatePolygonVertexData instead + * Tests if the bounding box is entirely inside the frustum planes + * @param frustumPlanes defines the frustum planes to test + * @returns true if there is an inclusion */ - static CreatePolygon(polygon, sideOrientation, fUV, fColors, frontUVs, backUVs, wrap) { - throw _WarnImport("polygonBuilder"); + isCompletelyInFrustum(frustumPlanes) { + return _BoundingBox.IsCompletelyInFrustum(this.vectorsWorld, frustumPlanes); } /** - * Creates the VertexData of the IcoSphere - * @param options an object used to set the following optional parameters for the IcoSphere, required but can be empty - * * radius the radius of the IcoSphere, optional default 1 - * * radiusX allows stretching in the x direction, optional, default radius - * * radiusY allows stretching in the y direction, optional, default radius - * * radiusZ allows stretching in the z direction, optional, default radius - * * flat when true creates a flat shaded mesh, optional, default true - * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4 - * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) - * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) - * @returns the VertexData of the IcoSphere - * @deprecated use CreateIcoSphereVertexData instead + * Tests if a point is inside the bounding box + * @param point defines the point to test + * @returns true if the point is inside the bounding box */ - static CreateIcoSphere(options) { - throw _WarnImport("icoSphereBuilder"); + intersectsPoint(point) { + const min = this.minimumWorld; + const max = this.maximumWorld; + const minX = min.x, minY = min.y, minZ = min.z, maxX = max.x, maxY = max.y, maxZ = max.z; + const pointX = point.x, pointY = point.y, pointZ = point.z; + const delta = -Epsilon; + if (maxX - pointX < delta || delta > pointX - minX) { + return false; + } + if (maxY - pointY < delta || delta > pointY - minY) { + return false; + } + if (maxZ - pointZ < delta || delta > pointZ - minZ) { + return false; + } + return true; } - // inspired from // http://stemkoski.github.io/Three.js/Polyhedra.html /** - * Creates the VertexData for a Polyhedron - * @param options an object used to set the following optional parameters for the polyhedron, required but can be empty - * * type provided types are: - * * 0 : Tetrahedron, 1 : Octahedron, 2 : Dodecahedron, 3 : Icosahedron, 4 : Rhombicuboctahedron, 5 : Triangular Prism, 6 : Pentagonal Prism, 7 : Hexagonal Prism, 8 : Square Pyramid (J1) - * * 9 : Pentagonal Pyramid (J2), 10 : Triangular Dipyramid (J12), 11 : Pentagonal Dipyramid (J13), 12 : Elongated Square Dipyramid (J15), 13 : Elongated Pentagonal Dipyramid (J16), 14 : Elongated Pentagonal Cupola (J20) - * * size the size of the IcoSphere, optional default 1 - * * sizeX allows stretching in the x direction, optional, default size - * * sizeY allows stretching in the y direction, optional, default size - * * sizeZ allows stretching in the z direction, optional, default size - * * custom a number that overwrites the type to create from an extended set of polyhedron from https://www.babylonjs-playground.com/#21QRSK#15 with minimised editor - * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively - * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively - * * flat when true creates a flat shaded mesh, optional, default true - * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4 - * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) - * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) - * @returns the VertexData of the Polyhedron - * @deprecated use CreatePolyhedronVertexData instead + * Tests if the bounding box intersects with a bounding sphere + * @param sphere defines the sphere to test + * @returns true if there is an intersection */ - static CreatePolyhedron(options) { - throw _WarnImport("polyhedronBuilder"); + intersectsSphere(sphere) { + return _BoundingBox.IntersectsSphere(this.minimumWorld, this.maximumWorld, sphere.centerWorld, sphere.radiusWorld); } /** - * Creates the VertexData for a Capsule, inspired from https://github.com/maximeq/three-js-capsule-geometry/blob/master/src/CapsuleBufferGeometry.js - * @param options an object used to set the following optional parameters for the capsule, required but can be empty - * @returns the VertexData of the Capsule - * @deprecated Please use CreateCapsuleVertexData from the capsuleBuilder file instead + * Tests if the bounding box intersects with a box defined by a min and max vectors + * @param min defines the min vector to use + * @param max defines the max vector to use + * @returns true if there is an intersection */ - static CreateCapsule(options = { - orientation: Vector3.Up(), - subdivisions: 2, - tessellation: 16, - height: 1, - radius: 0.25, - capSubdivisions: 6 - }) { - throw _WarnImport("capsuleBuilder"); + intersectsMinMax(min, max) { + const myMin = this.minimumWorld; + const myMax = this.maximumWorld; + const myMinX = myMin.x, myMinY = myMin.y, myMinZ = myMin.z, myMaxX = myMax.x, myMaxY = myMax.y, myMaxZ = myMax.z; + const minX = min.x, minY = min.y, minZ = min.z, maxX = max.x, maxY = max.y, maxZ = max.z; + if (myMaxX < minX || myMinX > maxX) { + return false; + } + if (myMaxY < minY || myMinY > maxY) { + return false; + } + if (myMaxZ < minZ || myMinZ > maxZ) { + return false; + } + return true; } - // based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3D/src/away3d/primitives/TorusKnot.as?spec=svn2473&r=2473 /** - * Creates the VertexData for a TorusKnot - * @param options an object used to set the following optional parameters for the TorusKnot, required but can be empty - * * radius the radius of the torus knot, optional, default 2 - * * tube the thickness of the tube, optional, default 0.5 - * * radialSegments the number of sides on each tube segments, optional, default 32 - * * tubularSegments the number of tubes to decompose the knot into, optional, default 32 - * * p the number of windings around the z axis, optional, default 2 - * * q the number of windings around the x axis, optional, default 3 - * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) - * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) - * @returns the VertexData of the Torus Knot - * @deprecated use CreateTorusKnotVertexData instead + * Disposes the resources of the class */ - static CreateTorusKnot(options) { - throw _WarnImport("torusKnotBuilder"); + dispose() { + var _a, _b; + (_a = this._drawWrapperFront) == null ? void 0 : _a.dispose(); + (_b = this._drawWrapperBack) == null ? void 0 : _b.dispose(); } - // Tools + // Statics /** - * Compute normals for given positions and indices - * @param positions an array of vertex positions, [...., x, y, z, ......] - * @param indices an array of indices in groups of three for each triangular facet, [...., i, j, k, ......] - * @param normals an array of vertex normals, [...., x, y, z, ......] - * @param options an object used to set the following optional parameters for the TorusKnot, optional - * * facetNormals : optional array of facet normals (vector3) - * * facetPositions : optional array of facet positions (vector3) - * * facetPartitioning : optional partitioning array. facetPositions is required for facetPartitioning computation - * * ratio : optional partitioning ratio / bounding box, required for facetPartitioning computation - * * bInfo : optional bounding info, required for facetPartitioning computation - * * bbSize : optional bounding box size data, required for facetPartitioning computation - * * subDiv : optional partitioning data about subdivisions on each axis (int), required for facetPartitioning computation - * * useRightHandedSystem: optional boolean to for right handed system computation - * * depthSort : optional boolean to enable the facet depth sort computation - * * distanceTo : optional Vector3 to compute the facet depth from this location - * * depthSortedFacets : optional array of depthSortedFacets to store the facet distances from the reference location + * Tests if two bounding boxes are intersections + * @param box0 defines the first box to test + * @param box1 defines the second box to test + * @returns true if there is an intersection */ - static ComputeNormals(positions, indices, normals, options) { - let index = 0; - let p1p2x = 0; - let p1p2y = 0; - let p1p2z = 0; - let p3p2x = 0; - let p3p2y = 0; - let p3p2z = 0; - let faceNormalx = 0; - let faceNormaly = 0; - let faceNormalz = 0; - let length = 0; - let v1x = 0; - let v1y = 0; - let v1z = 0; - let v2x = 0; - let v2y = 0; - let v2z = 0; - let v3x = 0; - let v3y = 0; - let v3z = 0; - let computeFacetNormals = false; - let computeFacetPositions = false; - let computeFacetPartitioning = false; - let computeDepthSort = false; - let faceNormalSign = 1; - let ratio = 0; - let distanceTo = null; - if (options) { - computeFacetNormals = options.facetNormals ? true : false; - computeFacetPositions = options.facetPositions ? true : false; - computeFacetPartitioning = options.facetPartitioning ? true : false; - faceNormalSign = options.useRightHandedSystem === true ? -1 : 1; - ratio = options.ratio || 0; - computeDepthSort = options.depthSort ? true : false; - distanceTo = options.distanceTo; - if (computeDepthSort) { - if (distanceTo === void 0) { - distanceTo = Vector3.Zero(); - } - } - } - let xSubRatio = 0; - let ySubRatio = 0; - let zSubRatio = 0; - let subSq = 0; - if (computeFacetPartitioning && options && options.bbSize) { - xSubRatio = options.subDiv.X * ratio / options.bbSize.x; - ySubRatio = options.subDiv.Y * ratio / options.bbSize.y; - zSubRatio = options.subDiv.Z * ratio / options.bbSize.z; - subSq = options.subDiv.max * options.subDiv.max; - options.facetPartitioning.length = 0; - } - for (index = 0; index < positions.length; index++) { - normals[index] = 0; - } - const nbFaces = indices.length / 3 | 0; - for (index = 0; index < nbFaces; index++) { - v1x = indices[index * 3] * 3; - v1y = v1x + 1; - v1z = v1x + 2; - v2x = indices[index * 3 + 1] * 3; - v2y = v2x + 1; - v2z = v2x + 2; - v3x = indices[index * 3 + 2] * 3; - v3y = v3x + 1; - v3z = v3x + 2; - p1p2x = positions[v1x] - positions[v2x]; - p1p2y = positions[v1y] - positions[v2y]; - p1p2z = positions[v1z] - positions[v2z]; - p3p2x = positions[v3x] - positions[v2x]; - p3p2y = positions[v3y] - positions[v2y]; - p3p2z = positions[v3z] - positions[v2z]; - faceNormalx = faceNormalSign * (p1p2y * p3p2z - p1p2z * p3p2y); - faceNormaly = faceNormalSign * (p1p2z * p3p2x - p1p2x * p3p2z); - faceNormalz = faceNormalSign * (p1p2x * p3p2y - p1p2y * p3p2x); - length = Math.sqrt(faceNormalx * faceNormalx + faceNormaly * faceNormaly + faceNormalz * faceNormalz); - length = length === 0 ? 1 : length; - faceNormalx /= length; - faceNormaly /= length; - faceNormalz /= length; - if (computeFacetNormals && options) { - options.facetNormals[index].x = faceNormalx; - options.facetNormals[index].y = faceNormaly; - options.facetNormals[index].z = faceNormalz; - } - if (computeFacetPositions && options) { - options.facetPositions[index].x = (positions[v1x] + positions[v2x] + positions[v3x]) / 3; - options.facetPositions[index].y = (positions[v1y] + positions[v2y] + positions[v3y]) / 3; - options.facetPositions[index].z = (positions[v1z] + positions[v2z] + positions[v3z]) / 3; - } - if (computeFacetPartitioning && options) { - const ox = Math.floor((options.facetPositions[index].x - options.bInfo.minimum.x * ratio) * xSubRatio); - const oy = Math.floor((options.facetPositions[index].y - options.bInfo.minimum.y * ratio) * ySubRatio); - const oz = Math.floor((options.facetPositions[index].z - options.bInfo.minimum.z * ratio) * zSubRatio); - const b1x = Math.floor((positions[v1x] - options.bInfo.minimum.x * ratio) * xSubRatio); - const b1y = Math.floor((positions[v1y] - options.bInfo.minimum.y * ratio) * ySubRatio); - const b1z = Math.floor((positions[v1z] - options.bInfo.minimum.z * ratio) * zSubRatio); - const b2x = Math.floor((positions[v2x] - options.bInfo.minimum.x * ratio) * xSubRatio); - const b2y = Math.floor((positions[v2y] - options.bInfo.minimum.y * ratio) * ySubRatio); - const b2z = Math.floor((positions[v2z] - options.bInfo.minimum.z * ratio) * zSubRatio); - const b3x = Math.floor((positions[v3x] - options.bInfo.minimum.x * ratio) * xSubRatio); - const b3y = Math.floor((positions[v3y] - options.bInfo.minimum.y * ratio) * ySubRatio); - const b3z = Math.floor((positions[v3z] - options.bInfo.minimum.z * ratio) * zSubRatio); - const block_idx_v1 = b1x + options.subDiv.max * b1y + subSq * b1z; - const block_idx_v2 = b2x + options.subDiv.max * b2y + subSq * b2z; - const block_idx_v3 = b3x + options.subDiv.max * b3y + subSq * b3z; - const block_idx_o = ox + options.subDiv.max * oy + subSq * oz; - options.facetPartitioning[block_idx_o] = options.facetPartitioning[block_idx_o] ? options.facetPartitioning[block_idx_o] : new Array(); - options.facetPartitioning[block_idx_v1] = options.facetPartitioning[block_idx_v1] ? options.facetPartitioning[block_idx_v1] : new Array(); - options.facetPartitioning[block_idx_v2] = options.facetPartitioning[block_idx_v2] ? options.facetPartitioning[block_idx_v2] : new Array(); - options.facetPartitioning[block_idx_v3] = options.facetPartitioning[block_idx_v3] ? options.facetPartitioning[block_idx_v3] : new Array(); - options.facetPartitioning[block_idx_v1].push(index); - if (block_idx_v2 != block_idx_v1) { - options.facetPartitioning[block_idx_v2].push(index); - } - if (!(block_idx_v3 == block_idx_v2 || block_idx_v3 == block_idx_v1)) { - options.facetPartitioning[block_idx_v3].push(index); - } - if (!(block_idx_o == block_idx_v1 || block_idx_o == block_idx_v2 || block_idx_o == block_idx_v3)) { - options.facetPartitioning[block_idx_o].push(index); - } - } - if (computeDepthSort && options && options.facetPositions) { - const dsf = options.depthSortedFacets[index]; - dsf.ind = index * 3; - dsf.sqDistance = Vector3.DistanceSquared(options.facetPositions[index], distanceTo); - } - normals[v1x] += faceNormalx; - normals[v1y] += faceNormaly; - normals[v1z] += faceNormalz; - normals[v2x] += faceNormalx; - normals[v2y] += faceNormaly; - normals[v2z] += faceNormalz; - normals[v3x] += faceNormalx; - normals[v3y] += faceNormaly; - normals[v3z] += faceNormalz; - } - for (index = 0; index < normals.length / 3; index++) { - faceNormalx = normals[index * 3]; - faceNormaly = normals[index * 3 + 1]; - faceNormalz = normals[index * 3 + 2]; - length = Math.sqrt(faceNormalx * faceNormalx + faceNormaly * faceNormaly + faceNormalz * faceNormalz); - length = length === 0 ? 1 : length; - faceNormalx /= length; - faceNormaly /= length; - faceNormalz /= length; - normals[index * 3] = faceNormalx; - normals[index * 3 + 1] = faceNormaly; - normals[index * 3 + 2] = faceNormalz; - } + static Intersects(box0, box1) { + return box0.intersectsMinMax(box1.minimumWorld, box1.maximumWorld); } /** - * @internal + * Tests if a bounding box defines by a min/max vectors intersects a sphere + * @param minPoint defines the minimum vector of the bounding box + * @param maxPoint defines the maximum vector of the bounding box + * @param sphereCenter defines the sphere center + * @param sphereRadius defines the sphere radius + * @returns true if there is an intersection */ - static _ComputeSides(sideOrientation, positions, indices, normals, uvs, frontUVs, backUVs) { - const li = indices.length; - const ln = normals.length; - let i; - let n; - sideOrientation = sideOrientation || _VertexData.DEFAULTSIDE; - switch (sideOrientation) { - case _VertexData.FRONTSIDE: - break; - case _VertexData.BACKSIDE: - for (i = 0; i < li; i += 3) { - const tmp = indices[i]; - indices[i] = indices[i + 2]; - indices[i + 2] = tmp; - } - for (n = 0; n < ln; n++) { - normals[n] = -normals[n]; - } - break; - case _VertexData.DOUBLESIDE: { - const lp = positions.length; - const l = lp / 3; - for (let p = 0; p < lp; p++) { - positions[lp + p] = positions[p]; - } - for (i = 0; i < li; i += 3) { - indices[i + li] = indices[i + 2] + l; - indices[i + 1 + li] = indices[i + 1] + l; - indices[i + 2 + li] = indices[i] + l; - } - for (n = 0; n < ln; n++) { - normals[ln + n] = -normals[n]; - } - const lu = uvs.length; - let u = 0; - for (u = 0; u < lu; u++) { - uvs[u + lu] = uvs[u]; - } - frontUVs = frontUVs ? frontUVs : new Vector4(0, 0, 1, 1); - backUVs = backUVs ? backUVs : new Vector4(0, 0, 1, 1); - u = 0; - for (i = 0; i < lu / 2; i++) { - uvs[u] = frontUVs.x + (frontUVs.z - frontUVs.x) * uvs[u]; - uvs[u + 1] = frontUVs.y + (frontUVs.w - frontUVs.y) * uvs[u + 1]; - uvs[u + lu] = backUVs.x + (backUVs.z - backUVs.x) * uvs[u + lu]; - uvs[u + lu + 1] = backUVs.y + (backUVs.w - backUVs.y) * uvs[u + lu + 1]; - u += 2; + static IntersectsSphere(minPoint, maxPoint, sphereCenter, sphereRadius) { + const vector = _BoundingBox._TmpVector3[0]; + Vector3.ClampToRef(sphereCenter, minPoint, maxPoint, vector); + const num = Vector3.DistanceSquared(sphereCenter, vector); + return num <= sphereRadius * sphereRadius; + } + /** + * Tests if a bounding box defined with 8 vectors is entirely inside frustum planes + * @param boundingVectors defines an array of 8 vectors representing a bounding box + * @param frustumPlanes defines the frustum planes to test + * @returns true if there is an inclusion + */ + static IsCompletelyInFrustum(boundingVectors, frustumPlanes) { + for (let p = 0; p < 6; ++p) { + const frustumPlane = frustumPlanes[p]; + for (let i = 0; i < 8; ++i) { + if (frustumPlane.dotCoordinate(boundingVectors[i]) < 0) { + return false; } - break; } } + return true; } /** - * Creates a VertexData from serialized data - * @param parsedVertexData the parsed data from an imported file - * @returns a VertexData + * Tests if a bounding box defined with 8 vectors intersects frustum planes + * @param boundingVectors defines an array of 8 vectors representing a bounding box + * @param frustumPlanes defines the frustum planes to test + * @returns true if there is an intersection */ - static Parse(parsedVertexData) { - const vertexData = new _VertexData(); - const positions = parsedVertexData.positions; - if (positions) { - vertexData.set(positions, VertexBuffer.PositionKind); - } - const normals = parsedVertexData.normals; - if (normals) { - vertexData.set(normals, VertexBuffer.NormalKind); - } - const tangents = parsedVertexData.tangents; - if (tangents) { - vertexData.set(tangents, VertexBuffer.TangentKind); - } - const uvs = parsedVertexData.uvs; - if (uvs) { - vertexData.set(uvs, VertexBuffer.UVKind); - } - const uvs2 = parsedVertexData.uvs2; - if (uvs2) { - vertexData.set(uvs2, VertexBuffer.UV2Kind); - } - const uvs3 = parsedVertexData.uvs3; - if (uvs3) { - vertexData.set(uvs3, VertexBuffer.UV3Kind); - } - const uvs4 = parsedVertexData.uvs4; - if (uvs4) { - vertexData.set(uvs4, VertexBuffer.UV4Kind); - } - const uvs5 = parsedVertexData.uvs5; - if (uvs5) { - vertexData.set(uvs5, VertexBuffer.UV5Kind); - } - const uvs6 = parsedVertexData.uvs6; - if (uvs6) { - vertexData.set(uvs6, VertexBuffer.UV6Kind); - } - const colors = parsedVertexData.colors; - if (colors) { - vertexData.set(Color4.CheckColors4(colors, positions.length / 3), VertexBuffer.ColorKind); - if (parsedVertexData.hasVertexAlpha !== void 0) { - vertexData.hasVertexAlpha = parsedVertexData.hasVertexAlpha; + static IsInFrustum(boundingVectors, frustumPlanes) { + for (let p = 0; p < 6; ++p) { + let canReturnFalse = true; + const frustumPlane = frustumPlanes[p]; + for (let i = 0; i < 8; ++i) { + if (frustumPlane.dotCoordinate(boundingVectors[i]) >= 0) { + canReturnFalse = false; + break; + } } - } - const matricesIndices = parsedVertexData.matricesIndices; - if (matricesIndices) { - vertexData.set(matricesIndices, VertexBuffer.MatricesIndicesKind); - } - const matricesWeights = parsedVertexData.matricesWeights; - if (matricesWeights) { - vertexData.set(matricesWeights, VertexBuffer.MatricesWeightsKind); - } - const indices = parsedVertexData.indices; - if (indices) { - vertexData.indices = indices; - } - const materialInfos = parsedVertexData.materialInfos; - if (materialInfos) { - vertexData.materialInfos = []; - for (const materialInfoFromJSON of materialInfos) { - const materialInfo = new VertexDataMaterialInfo(); - materialInfo.indexCount = materialInfoFromJSON.indexCount; - materialInfo.indexStart = materialInfoFromJSON.indexStart; - materialInfo.verticesCount = materialInfoFromJSON.verticesCount; - materialInfo.verticesStart = materialInfoFromJSON.verticesStart; - materialInfo.materialIndex = materialInfoFromJSON.materialIndex; - vertexData.materialInfos.push(materialInfo); + if (canReturnFalse) { + return false; } } - return vertexData; - } - /** - * Applies VertexData created from the imported parameters to the geometry - * @param parsedVertexData the parsed data from an imported file - * @param geometry the geometry to apply the VertexData to - */ - static ImportVertexData(parsedVertexData, geometry) { - const vertexData = _VertexData.Parse(parsedVertexData); - geometry.setAllVerticesData(vertexData, parsedVertexData.updatable); + return true; } }; -VertexData.FRONTSIDE = 0; -VertexData.BACKSIDE = 1; -VertexData.DOUBLESIDE = 2; -VertexData.DEFAULTSIDE = 0; -VertexData._UniqueIDGenerator = 0; -__decorate([ - nativeOverride.filter((...[coordinates]) => !Array.isArray(coordinates)) -], VertexData, "_TransformVector3Coordinates", null); -__decorate([ - nativeOverride.filter((...[normals]) => !Array.isArray(normals)) -], VertexData, "_TransformVector3Normals", null); -__decorate([ - nativeOverride.filter((...[normals]) => !Array.isArray(normals)) -], VertexData, "_TransformVector4Normals", null); -__decorate([ - nativeOverride.filter((...[indices]) => !Array.isArray(indices)) -], VertexData, "_FlipFaces", null); +BoundingBox._TmpVector3 = ArrayTools.BuildArray(3, Vector3.Zero); -// node_modules/@babylonjs/core/Loading/sceneLoaderFlags.js -var SceneLoaderFlags = class _SceneLoaderFlags { +// node_modules/@babylonjs/core/Culling/boundingSphere.js +var BoundingSphere = class _BoundingSphere { /** - * Gets or sets a boolean indicating if entire scene must be loaded even if scene contains incremental data + * Creates a new bounding sphere + * @param min defines the minimum vector (in local space) + * @param max defines the maximum vector (in local space) + * @param worldMatrix defines the new world matrix */ - static get ForceFullSceneLoadingForIncremental() { - return _SceneLoaderFlags._ForceFullSceneLoadingForIncremental; - } - static set ForceFullSceneLoadingForIncremental(value) { - _SceneLoaderFlags._ForceFullSceneLoadingForIncremental = value; + constructor(min, max, worldMatrix) { + this.center = Vector3.Zero(); + this.centerWorld = Vector3.Zero(); + this.minimum = Vector3.Zero(); + this.maximum = Vector3.Zero(); + this.reConstruct(min, max, worldMatrix); } /** - * Gets or sets a boolean indicating if loading screen must be displayed while loading a scene + * Recreates the entire bounding sphere from scratch as if we call the constructor in place + * @param min defines the new minimum vector (in local space) + * @param max defines the new maximum vector (in local space) + * @param worldMatrix defines the new world matrix */ - static get ShowLoadingScreen() { - return _SceneLoaderFlags._ShowLoadingScreen; - } - static set ShowLoadingScreen(value) { - _SceneLoaderFlags._ShowLoadingScreen = value; + reConstruct(min, max, worldMatrix) { + this.minimum.copyFrom(min); + this.maximum.copyFrom(max); + const distance = Vector3.Distance(min, max); + max.addToRef(min, this.center).scaleInPlace(0.5); + this.radius = distance * 0.5; + this._update(worldMatrix || Matrix.IdentityReadOnly); } /** - * Defines the current logging level (while loading the scene) - * @ignorenaming + * Scale the current bounding sphere by applying a scale factor + * @param factor defines the scale factor to apply + * @returns the current bounding box */ - // eslint-disable-next-line @typescript-eslint/naming-convention - static get loggingLevel() { - return _SceneLoaderFlags._LoggingLevel; - } - // eslint-disable-next-line @typescript-eslint/naming-convention - static set loggingLevel(value) { - _SceneLoaderFlags._LoggingLevel = value; + scale(factor) { + const newRadius = this.radius * factor; + const tmpVectors = _BoundingSphere._TmpVector3; + const tempRadiusVector = tmpVectors[0].setAll(newRadius); + const min = this.center.subtractToRef(tempRadiusVector, tmpVectors[1]); + const max = this.center.addToRef(tempRadiusVector, tmpVectors[2]); + this.reConstruct(min, max, this._worldMatrix); + return this; } /** - * Gets or set a boolean indicating if matrix weights must be cleaned upon loading + * Gets the world matrix of the bounding box + * @returns a matrix */ - static get CleanBoneMatrixWeights() { - return _SceneLoaderFlags._CleanBoneMatrixWeights; - } - static set CleanBoneMatrixWeights(value) { - _SceneLoaderFlags._CleanBoneMatrixWeights = value; + getWorldMatrix() { + return this._worldMatrix; } -}; -SceneLoaderFlags._ForceFullSceneLoadingForIncremental = false; -SceneLoaderFlags._ShowLoadingScreen = true; -SceneLoaderFlags._CleanBoneMatrixWeights = false; -SceneLoaderFlags._LoggingLevel = 0; - -// node_modules/@babylonjs/core/Compat/compatibilityOptions.js -var CompatibilityOptions = class { -}; -CompatibilityOptions.UseOpenGLOrientationForUV = false; - -// node_modules/@babylonjs/core/Meshes/geometry.js -var Geometry = class _Geometry { + // Methods /** - * Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y + * @internal */ - get boundingBias() { - return this._boundingBias; + _update(worldMatrix) { + if (!worldMatrix.isIdentity()) { + Vector3.TransformCoordinatesToRef(this.center, worldMatrix, this.centerWorld); + const tempVector = _BoundingSphere._TmpVector3[0]; + Vector3.TransformNormalFromFloatsToRef(1, 1, 1, worldMatrix, tempVector); + this.radiusWorld = Math.max(Math.abs(tempVector.x), Math.abs(tempVector.y), Math.abs(tempVector.z)) * this.radius; + } else { + this.centerWorld.copyFrom(this.center); + this.radiusWorld = this.radius; + } } /** - * Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y + * Tests if the bounding sphere is intersecting the frustum planes + * @param frustumPlanes defines the frustum planes to test + * @returns true if there is an intersection */ - set boundingBias(value) { - if (this._boundingBias) { - this._boundingBias.copyFrom(value); - } else { - this._boundingBias = value.clone(); + isInFrustum(frustumPlanes) { + const center = this.centerWorld; + const radius = this.radiusWorld; + for (let i = 0; i < 6; i++) { + if (frustumPlanes[i].dotCoordinate(center) <= -radius) { + return false; + } } - this._updateBoundingInfo(true, null); + return true; } /** - * Static function used to attach a new empty geometry to a mesh - * @param mesh defines the mesh to attach the geometry to - * @returns the new Geometry + * Tests if the bounding sphere center is in between the frustum planes. + * Used for optimistic fast inclusion. + * @param frustumPlanes defines the frustum planes to test + * @returns true if the sphere center is in between the frustum planes */ - static CreateGeometryForMesh(mesh) { - const geometry = new _Geometry(_Geometry.RandomId(), mesh.getScene()); - geometry.applyToMesh(mesh); - return geometry; + isCenterInFrustum(frustumPlanes) { + const center = this.centerWorld; + for (let i = 0; i < 6; i++) { + if (frustumPlanes[i].dotCoordinate(center) < 0) { + return false; + } + } + return true; } - /** Get the list of meshes using this geometry */ - get meshes() { - return this._meshes; + /** + * Tests if a point is inside the bounding sphere + * @param point defines the point to test + * @returns true if the point is inside the bounding sphere + */ + intersectsPoint(point) { + const squareDistance = Vector3.DistanceSquared(this.centerWorld, point); + if (this.radiusWorld * this.radiusWorld < squareDistance) { + return false; + } + return true; } + // Statics /** - * Creates a new geometry - * @param id defines the unique ID - * @param scene defines the hosting scene - * @param vertexData defines the VertexData used to get geometry data - * @param updatable defines if geometry must be updatable (false by default) - * @param mesh defines the mesh that will be associated with the geometry + * Checks if two sphere intersect + * @param sphere0 sphere 0 + * @param sphere1 sphere 1 + * @returns true if the spheres intersect */ - constructor(id, scene, vertexData, updatable = false, mesh = null) { - this.delayLoadState = 0; - this._totalVertices = 0; - this._isDisposed = false; - this._indexBufferIsUpdatable = false; - this._positionsCache = []; - this._parentContainer = null; - this.useBoundingInfoFromGeometry = false; - this._scene = scene || EngineStore.LastCreatedScene; - if (!this._scene) { - return; + static Intersects(sphere0, sphere1) { + const squareDistance = Vector3.DistanceSquared(sphere0.centerWorld, sphere1.centerWorld); + const radiusSum = sphere0.radiusWorld + sphere1.radiusWorld; + if (radiusSum * radiusSum < squareDistance) { + return false; } - this.id = id; - this.uniqueId = this._scene.getUniqueId(); - this._engine = this._scene.getEngine(); - this._meshes = []; - this._vertexBuffers = {}; - this._indices = []; - this._updatable = updatable; - if (vertexData) { - this.setAllVerticesData(vertexData, updatable); + return true; + } + /** + * Creates a sphere from a center and a radius + * @param center The center + * @param radius radius + * @param matrix Optional worldMatrix + * @returns The sphere + */ + static CreateFromCenterAndRadius(center, radius, matrix) { + this._TmpVector3[0].copyFrom(center); + this._TmpVector3[1].copyFromFloats(0, 0, radius); + this._TmpVector3[2].copyFrom(center); + this._TmpVector3[0].addInPlace(this._TmpVector3[1]); + this._TmpVector3[2].subtractInPlace(this._TmpVector3[1]); + const sphere = new _BoundingSphere(this._TmpVector3[0], this._TmpVector3[2]); + if (matrix) { + sphere._worldMatrix = matrix; } else { - this._totalVertices = 0; - } - if (this._engine.getCaps().vertexArrayObject) { - this._vertexArrayObjects = {}; - } - if (mesh) { - this.applyToMesh(mesh); - mesh.computeWorldMatrix(true); + sphere._worldMatrix = Matrix.Identity(); } + return sphere; } +}; +BoundingSphere._TmpVector3 = ArrayTools.BuildArray(3, Vector3.Zero); + +// node_modules/@babylonjs/core/Culling/boundingInfo.js +var _result0 = { min: 0, max: 0 }; +var _result1 = { min: 0, max: 0 }; +var computeBoxExtents = (axis, box, result) => { + const p = Vector3.Dot(box.centerWorld, axis); + const r0 = Math.abs(Vector3.Dot(box.directions[0], axis)) * box.extendSize.x; + const r1 = Math.abs(Vector3.Dot(box.directions[1], axis)) * box.extendSize.y; + const r2 = Math.abs(Vector3.Dot(box.directions[2], axis)) * box.extendSize.z; + const r = r0 + r1 + r2; + result.min = p - r; + result.max = p + r; +}; +var axisOverlap = (axis, box0, box1) => { + computeBoxExtents(axis, box0, _result0); + computeBoxExtents(axis, box1, _result1); + return !(_result0.min > _result1.max || _result1.min > _result0.max); +}; +var BoundingInfo = class _BoundingInfo { /** - * Gets the current extend of the geometry + * Constructs bounding info + * @param minimum min vector of the bounding box/sphere + * @param maximum max vector of the bounding box/sphere + * @param worldMatrix defines the new world matrix */ - get extend() { - return this._extend; + constructor(minimum, maximum, worldMatrix) { + this._isLocked = false; + this.boundingBox = new BoundingBox(minimum, maximum, worldMatrix); + this.boundingSphere = new BoundingSphere(minimum, maximum, worldMatrix); } /** - * Gets the hosting scene - * @returns the hosting Scene + * Recreates the entire bounding info from scratch as if we call the constructor in place + * @param min defines the new minimum vector (in local space) + * @param max defines the new maximum vector (in local space) + * @param worldMatrix defines the new world matrix */ - getScene() { - return this._scene; + reConstruct(min, max, worldMatrix) { + this.boundingBox.reConstruct(min, max, worldMatrix); + this.boundingSphere.reConstruct(min, max, worldMatrix); } /** - * Gets the hosting engine - * @returns the hosting Engine + * min vector of the bounding box/sphere */ - getEngine() { - return this._engine; + get minimum() { + return this.boundingBox.minimum; } /** - * Defines if the geometry is ready to use - * @returns true if the geometry is ready to be used + * max vector of the bounding box/sphere */ - isReady() { - return this.delayLoadState === 1 || this.delayLoadState === 0; + get maximum() { + return this.boundingBox.maximum; } /** - * Gets a value indicating that the geometry should not be serialized + * If the info is locked and won't be updated to avoid perf overhead */ - get doNotSerialize() { - for (let index = 0; index < this._meshes.length; index++) { - if (!this._meshes[index].doNotSerialize) { - return false; - } - } - return true; + get isLocked() { + return this._isLocked; } - /** @internal */ - _rebuild() { - if (this._vertexArrayObjects) { - this._vertexArrayObjects = {}; - } - if (this._meshes.length !== 0 && this._indices) { - this._indexBuffer = this._engine.createIndexBuffer(this._indices, this._updatable, "Geometry_" + this.id + "_IndexBuffer"); - } - const buffers = /* @__PURE__ */ new Set(); - for (const key in this._vertexBuffers) { - buffers.add(this._vertexBuffers[key].getWrapperBuffer()); - } - buffers.forEach((buffer) => { - buffer._rebuild(); - }); + set isLocked(value) { + this._isLocked = value; } + // Methods /** - * Affects all geometry data in one call - * @param vertexData defines the geometry data - * @param updatable defines if the geometry must be flagged as updatable (false as default) + * Updates the bounding sphere and box + * @param world world matrix to be used to update */ - setAllVerticesData(vertexData, updatable) { - vertexData.applyToGeometry(this, updatable); - this._notifyUpdate(); + update(world) { + if (this._isLocked) { + return; + } + this.boundingBox._update(world); + this.boundingSphere._update(world); } /** - * Set specific vertex data - * @param kind defines the data kind (Position, normal, etc...) - * @param data defines the vertex data to use - * @param updatable defines if the vertex must be flagged as updatable (false as default) - * @param stride defines the stride to use (0 by default). This value is deduced from the kind value if not specified + * Recreate the bounding info to be centered around a specific point given a specific extend. + * @param center New center of the bounding info + * @param extend New extend of the bounding info + * @returns the current bounding info */ - setVerticesData(kind, data, updatable = false, stride) { - if (updatable && Array.isArray(data)) { - data = new Float32Array(data); - } - const buffer = new VertexBuffer(this._engine, data, kind, { - updatable, - postponeInternalCreation: this._meshes.length === 0, - stride, - label: "Geometry_" + this.id + "_" + kind - }); - this.setVerticesBuffer(buffer); + centerOn(center, extend) { + const minimum = _BoundingInfo._TmpVector3[0].copyFrom(center).subtractInPlace(extend); + const maximum = _BoundingInfo._TmpVector3[1].copyFrom(center).addInPlace(extend); + this.boundingBox.reConstruct(minimum, maximum, this.boundingBox.getWorldMatrix()); + this.boundingSphere.reConstruct(minimum, maximum, this.boundingBox.getWorldMatrix()); + return this; } /** - * Removes a specific vertex data - * @param kind defines the data kind (Position, normal, etc...) + * Grows the bounding info to include the given point. + * @param point The point that will be included in the current bounding info (in local space) + * @returns the current bounding info */ - removeVerticesData(kind) { - if (this._vertexBuffers[kind]) { - this._vertexBuffers[kind].dispose(); - delete this._vertexBuffers[kind]; - } - if (this._vertexArrayObjects) { - this._disposeVertexArrayObjects(); - } + encapsulate(point) { + const minimum = Vector3.Minimize(this.minimum, point); + const maximum = Vector3.Maximize(this.maximum, point); + this.reConstruct(minimum, maximum, this.boundingBox.getWorldMatrix()); + return this; } /** - * Affect a vertex buffer to the geometry. the vertexBuffer.getKind() function is used to determine where to store the data - * @param buffer defines the vertex buffer to use - * @param totalVertices defines the total number of vertices for position kind (could be null) - * @param disposeExistingBuffer disposes the existing buffer, if any (default: true) + * Grows the bounding info to encapsulate the given bounding info. + * @param toEncapsulate The bounding info that will be encapsulated in the current bounding info + * @returns the current bounding info */ - setVerticesBuffer(buffer, totalVertices = null, disposeExistingBuffer = true) { - const kind = buffer.getKind(); - if (this._vertexBuffers[kind] && disposeExistingBuffer) { - this._vertexBuffers[kind].dispose(); - } - if (buffer._buffer) { - buffer._buffer._increaseReferences(); - } - this._vertexBuffers[kind] = buffer; - const meshes = this._meshes; - const numOfMeshes = meshes.length; - if (kind === VertexBuffer.PositionKind) { - this._totalVertices = totalVertices ?? buffer._maxVerticesCount; - this._updateExtend(buffer.getFloatData(this._totalVertices)); - this._resetPointsArrayCache(); - const minimum = this._extend && this._extend.minimum || new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); - const maximum = this._extend && this._extend.maximum || new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); - for (let index = 0; index < numOfMeshes; index++) { - const mesh = meshes[index]; - mesh.buildBoundingInfo(minimum, maximum); - mesh._createGlobalSubMesh(mesh.isUnIndexed); - mesh.computeWorldMatrix(true); - mesh.synchronizeInstances(); - } - } - this._notifyUpdate(kind); + encapsulateBoundingInfo(toEncapsulate) { + const invw = TmpVectors.Matrix[0]; + this.boundingBox.getWorldMatrix().invertToRef(invw); + const v = TmpVectors.Vector3[0]; + Vector3.TransformCoordinatesToRef(toEncapsulate.boundingBox.minimumWorld, invw, v); + this.encapsulate(v); + Vector3.TransformCoordinatesToRef(toEncapsulate.boundingBox.maximumWorld, invw, v); + this.encapsulate(v); + return this; } /** - * Update a specific vertex buffer - * This function will directly update the underlying DataBuffer according to the passed numeric array or Float32Array - * It will do nothing if the buffer is not updatable - * @param kind defines the data kind (Position, normal, etc...) - * @param data defines the data to use - * @param offset defines the offset in the target buffer where to store the data - * @param useBytes set to true if the offset is in bytes + * Scale the current bounding info by applying a scale factor + * @param factor defines the scale factor to apply + * @returns the current bounding info */ - updateVerticesDataDirectly(kind, data, offset, useBytes = false) { - const vertexBuffer = this.getVertexBuffer(kind); - if (!vertexBuffer) { - return; - } - vertexBuffer.updateDirectly(data, offset, useBytes); - this._notifyUpdate(kind); + scale(factor) { + this.boundingBox.scale(factor); + this.boundingSphere.scale(factor); + return this; } /** - * Update a specific vertex buffer - * This function will create a new buffer if the current one is not updatable - * @param kind defines the data kind (Position, normal, etc...) - * @param data defines the data to use - * @param updateExtends defines if the geometry extends must be recomputed (false by default) + * Returns `true` if the bounding info is within the frustum defined by the passed array of planes. + * @param frustumPlanes defines the frustum to test + * @param strategy defines the strategy to use for the culling (default is BABYLON.AbstractMesh.CULLINGSTRATEGY_STANDARD) + * The different strategies available are: + * * BABYLON.AbstractMesh.CULLINGSTRATEGY_STANDARD most accurate but slower @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_STANDARD + * * BABYLON.AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY faster but less accurate @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY + * * BABYLON.AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION can be faster if always visible @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_OPTIMISTIC_INCLUSION + * * BABYLON.AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY can be faster if always visible @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY + * @returns true if the bounding info is in the frustum planes */ - updateVerticesData(kind, data, updateExtends = false) { - const vertexBuffer = this.getVertexBuffer(kind); - if (!vertexBuffer) { - return; - } - vertexBuffer.update(data); - if (kind === VertexBuffer.PositionKind) { - this._updateBoundingInfo(updateExtends, data); + isInFrustum(frustumPlanes, strategy = 0) { + const inclusionTest = strategy === 2 || strategy === 3; + if (inclusionTest) { + if (this.boundingSphere.isCenterInFrustum(frustumPlanes)) { + return true; + } } - this._notifyUpdate(kind); - } - _updateBoundingInfo(updateExtends, data) { - if (updateExtends) { - this._updateExtend(data); + if (!this.boundingSphere.isInFrustum(frustumPlanes)) { + return false; } - this._resetPointsArrayCache(); - if (updateExtends) { - const meshes = this._meshes; - for (const mesh of meshes) { - if (mesh.hasBoundingInfo) { - mesh.getBoundingInfo().reConstruct(this._extend.minimum, this._extend.maximum); - } else { - mesh.buildBoundingInfo(this._extend.minimum, this._extend.maximum); - } - const subMeshes = mesh.subMeshes; - for (const subMesh of subMeshes) { - subMesh.refreshBoundingInfo(); - } - } + const bSphereOnlyTest = strategy === 1 || strategy === 3; + if (bSphereOnlyTest) { + return true; } + return this.boundingBox.isInFrustum(frustumPlanes); } /** - * @internal + * Gets the world distance between the min and max points of the bounding box */ - _bind(effect, indexToBind, overrideVertexBuffers, overrideVertexArrayObjects) { - if (!effect) { - return; - } - if (indexToBind === void 0) { - indexToBind = this._indexBuffer; - } - const vbs = this.getVertexBuffers(); - if (!vbs) { - return; - } - if (indexToBind != this._indexBuffer || !this._vertexArrayObjects && !overrideVertexArrayObjects) { - this._engine.bindBuffers(vbs, indexToBind, effect, overrideVertexBuffers); - return; - } - const vaos = overrideVertexArrayObjects ? overrideVertexArrayObjects : this._vertexArrayObjects; - if (!vaos[effect.key]) { - vaos[effect.key] = this._engine.recordVertexArrayObject(vbs, indexToBind, effect, overrideVertexBuffers); - } - this._engine.bindVertexArrayObject(vaos[effect.key], indexToBind); + get diagonalLength() { + const boundingBox = this.boundingBox; + const diag = boundingBox.maximumWorld.subtractToRef(boundingBox.minimumWorld, _BoundingInfo._TmpVector3[0]); + return diag.length(); } /** - * Gets total number of vertices - * @returns the total number of vertices + * Checks if a cullable object (mesh...) is in the camera frustum + * Unlike isInFrustum this checks the full bounding box + * @param frustumPlanes Camera near/planes + * @returns true if the object is in frustum otherwise false */ - getTotalVertices() { - if (!this.isReady()) { - return 0; - } - return this._totalVertices; + isCompletelyInFrustum(frustumPlanes) { + return this.boundingBox.isCompletelyInFrustum(frustumPlanes); } /** - * Gets a specific vertex data attached to this geometry. Float data is constructed if the vertex buffer data cannot be returned directly. - * @param kind defines the data kind (Position, normal, etc...) - * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes - * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it - * @returns a float array containing vertex data + * @internal */ - getVerticesData(kind, copyWhenShared, forceCopy) { - const vertexBuffer = this.getVertexBuffer(kind); - if (!vertexBuffer) { - return null; - } - return vertexBuffer.getFloatData(this._totalVertices, forceCopy || copyWhenShared && this._meshes.length !== 1); + _checkCollision(collider) { + return collider._canDoCollision(this.boundingSphere.centerWorld, this.boundingSphere.radiusWorld, this.boundingBox.minimumWorld, this.boundingBox.maximumWorld); } /** - * Returns a boolean defining if the vertex data for the requested `kind` is updatable - * @param kind defines the data kind (Position, normal, etc...) - * @returns true if the vertex buffer with the specified kind is updatable + * Checks if a point is inside the bounding box and bounding sphere or the mesh + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect + * @param point the point to check intersection with + * @returns if the point intersects */ - isVertexBufferUpdatable(kind) { - const vb = this._vertexBuffers[kind]; - if (!vb) { + intersectsPoint(point) { + if (!this.boundingSphere.centerWorld) { return false; } - return vb.isUpdatable(); - } - /** - * Gets a specific vertex buffer - * @param kind defines the data kind (Position, normal, etc...) - * @returns a VertexBuffer - */ - getVertexBuffer(kind) { - if (!this.isReady()) { - return null; + if (!this.boundingSphere.intersectsPoint(point)) { + return false; } - return this._vertexBuffers[kind]; - } - /** - * Returns all vertex buffers - * @returns an object holding all vertex buffers indexed by kind - */ - getVertexBuffers() { - if (!this.isReady()) { - return null; + if (!this.boundingBox.intersectsPoint(point)) { + return false; } - return this._vertexBuffers; + return true; } /** - * Gets a boolean indicating if specific vertex buffer is present - * @param kind defines the data kind (Position, normal, etc...) - * @returns true if data is present + * Checks if another bounding info intersects the bounding box and bounding sphere or the mesh + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect + * @param boundingInfo the bounding info to check intersection with + * @param precise if the intersection should be done using OBB + * @returns if the bounding info intersects */ - isVerticesDataPresent(kind) { - if (!this._vertexBuffers) { - if (this._delayInfo) { - return this._delayInfo.indexOf(kind) !== -1; - } + intersects(boundingInfo, precise) { + if (!BoundingSphere.Intersects(this.boundingSphere, boundingInfo.boundingSphere)) { return false; } - return this._vertexBuffers[kind] !== void 0; - } - /** - * Gets a list of all attached data kinds (Position, normal, etc...) - * @returns a list of string containing all kinds - */ - getVerticesDataKinds() { - const result = []; - let kind; - if (!this._vertexBuffers && this._delayInfo) { - for (kind in this._delayInfo) { - result.push(kind); - } - } else { - for (kind in this._vertexBuffers) { - result.push(kind); - } + if (!BoundingBox.Intersects(this.boundingBox, boundingInfo.boundingBox)) { + return false; } - return result; - } - /** - * Update index buffer - * @param indices defines the indices to store in the index buffer - * @param offset defines the offset in the target buffer where to store the data - * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default) - */ - updateIndices(indices, offset, gpuMemoryOnly = false) { - if (!this._indexBuffer) { - return; + if (!precise) { + return true; } - if (!this._indexBufferIsUpdatable) { - this.setIndices(indices, null, true); - } else { - const needToUpdateSubMeshes = indices.length !== this._indices.length; - if (!gpuMemoryOnly) { - this._indices = indices.slice(); - } - this._engine.updateDynamicIndexBuffer(this._indexBuffer, indices, offset); - if (needToUpdateSubMeshes) { - for (const mesh of this._meshes) { - mesh._createGlobalSubMesh(true); - } - } + const box0 = this.boundingBox; + const box1 = boundingInfo.boundingBox; + if (!axisOverlap(box0.directions[0], box0, box1)) { + return false; } - } - /** - * Sets the index buffer for this geometry. - * @param indexBuffer Defines the index buffer to use for this geometry - * @param totalVertices Defines the total number of vertices used by the buffer - * @param totalIndices Defines the total number of indices in the index buffer - */ - setIndexBuffer(indexBuffer, totalVertices, totalIndices) { - this._indices = []; - this._indexBufferIsUpdatable = false; - this._indexBuffer = indexBuffer; - this._totalVertices = totalVertices; - this._totalIndices = totalIndices; - indexBuffer.is32Bits || (indexBuffer.is32Bits = this._totalIndices > 65535); - for (const mesh of this._meshes) { - mesh._createGlobalSubMesh(true); - mesh.synchronizeInstances(); + if (!axisOverlap(box0.directions[1], box0, box1)) { + return false; } - this._notifyUpdate(); - } - /** - * Creates a new index buffer - * @param indices defines the indices to store in the index buffer - * @param totalVertices defines the total number of vertices (could be null) - * @param updatable defines if the index buffer must be flagged as updatable (false by default) - */ - setIndices(indices, totalVertices = null, updatable = false) { - if (this._indexBuffer) { - this._engine._releaseBuffer(this._indexBuffer); + if (!axisOverlap(box0.directions[2], box0, box1)) { + return false; } - this._indices = indices; - this._indexBufferIsUpdatable = updatable; - if (this._meshes.length !== 0 && this._indices) { - this._indexBuffer = this._engine.createIndexBuffer(this._indices, updatable, "Geometry_" + this.id + "_IndexBuffer"); + if (!axisOverlap(box1.directions[0], box0, box1)) { + return false; } - if (totalVertices != void 0) { - this._totalVertices = totalVertices; + if (!axisOverlap(box1.directions[1], box0, box1)) { + return false; } - for (const mesh of this._meshes) { - mesh._createGlobalSubMesh(true); - mesh.synchronizeInstances(); + if (!axisOverlap(box1.directions[2], box0, box1)) { + return false; } - this._notifyUpdate(); + if (!axisOverlap(Vector3.Cross(box0.directions[0], box1.directions[0]), box0, box1)) { + return false; + } + if (!axisOverlap(Vector3.Cross(box0.directions[0], box1.directions[1]), box0, box1)) { + return false; + } + if (!axisOverlap(Vector3.Cross(box0.directions[0], box1.directions[2]), box0, box1)) { + return false; + } + if (!axisOverlap(Vector3.Cross(box0.directions[1], box1.directions[0]), box0, box1)) { + return false; + } + if (!axisOverlap(Vector3.Cross(box0.directions[1], box1.directions[1]), box0, box1)) { + return false; + } + if (!axisOverlap(Vector3.Cross(box0.directions[1], box1.directions[2]), box0, box1)) { + return false; + } + if (!axisOverlap(Vector3.Cross(box0.directions[2], box1.directions[0]), box0, box1)) { + return false; + } + if (!axisOverlap(Vector3.Cross(box0.directions[2], box1.directions[1]), box0, box1)) { + return false; + } + if (!axisOverlap(Vector3.Cross(box0.directions[2], box1.directions[2]), box0, box1)) { + return false; + } + return true; } - /** - * Return the total number of indices - * @returns the total number of indices - */ - getTotalIndices() { - if (!this.isReady()) { - return 0; +}; +BoundingInfo._TmpVector3 = ArrayTools.BuildArray(2, Vector3.Zero); + +// node_modules/@babylonjs/core/Maths/math.functions.js +var MathHelpers = class { + static extractMinAndMaxIndexed(positions, indices, indexStart, indexCount, minimum, maximum) { + for (let index = indexStart; index < indexStart + indexCount; index++) { + const offset = indices[index] * 3; + const x = positions[offset]; + const y = positions[offset + 1]; + const z = positions[offset + 2]; + minimum.minimizeInPlaceFromFloats(x, y, z); + maximum.maximizeInPlaceFromFloats(x, y, z); } - return this._totalIndices !== void 0 ? this._totalIndices : this._indices.length; } + static extractMinAndMax(positions, start, count, stride, minimum, maximum) { + for (let index = start, offset = start * stride; index < start + count; index++, offset += stride) { + const x = positions[offset]; + const y = positions[offset + 1]; + const z = positions[offset + 2]; + minimum.minimizeInPlaceFromFloats(x, y, z); + maximum.maximizeInPlaceFromFloats(x, y, z); + } + } +}; +__decorate([ + nativeOverride.filter((...[positions, indices]) => !Array.isArray(positions) && !Array.isArray(indices)) + // eslint-disable-next-line @typescript-eslint/naming-convention +], MathHelpers, "extractMinAndMaxIndexed", null); +__decorate([ + nativeOverride.filter((...[positions]) => !Array.isArray(positions)) + // eslint-disable-next-line @typescript-eslint/naming-convention +], MathHelpers, "extractMinAndMax", null); +function extractMinAndMaxIndexed(positions, indices, indexStart, indexCount, bias = null) { + const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); + const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); + MathHelpers.extractMinAndMaxIndexed(positions, indices, indexStart, indexCount, minimum, maximum); + if (bias) { + minimum.x -= minimum.x * bias.x + bias.y; + minimum.y -= minimum.y * bias.x + bias.y; + minimum.z -= minimum.z * bias.x + bias.y; + maximum.x += maximum.x * bias.x + bias.y; + maximum.y += maximum.y * bias.x + bias.y; + maximum.z += maximum.z * bias.x + bias.y; + } + return { + minimum, + maximum + }; +} +function extractMinAndMax(positions, start, count, bias = null, stride) { + const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); + const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); + if (!stride) { + stride = 3; + } + MathHelpers.extractMinAndMax(positions, start, count, stride, minimum, maximum); + if (bias) { + minimum.x -= minimum.x * bias.x + bias.y; + minimum.y -= minimum.y * bias.x + bias.y; + minimum.z -= minimum.z * bias.x + bias.y; + maximum.x += maximum.x * bias.x + bias.y; + maximum.y += maximum.y * bias.x + bias.y; + maximum.z += maximum.z * bias.x + bias.y; + } + return { + minimum, + maximum + }; +} + +// node_modules/@babylonjs/core/Meshes/subMesh.js +var SubMesh = class _SubMesh { /** - * Gets the index buffer array - * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes - * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it - * @returns the index buffer array + * Gets material defines used by the effect associated to the sub mesh */ - getIndices(copyWhenShared, forceCopy) { - if (!this.isReady()) { - return null; - } - const orig = this._indices; - if (!forceCopy && (!copyWhenShared || this._meshes.length === 1)) { - return orig; - } else { - return orig.slice(); - } + get materialDefines() { + var _a; + return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.defines : (_a = this._getDrawWrapper()) == null ? void 0 : _a.defines; } /** - * Gets the index buffer - * @returns the index buffer + * Sets material defines used by the effect associated to the sub mesh */ - getIndexBuffer() { - if (!this.isReady()) { - return null; - } - return this._indexBuffer; + set materialDefines(defines) { + const drawWrapper = this._mainDrawWrapperOverride ?? this._getDrawWrapper(void 0, true); + drawWrapper.defines = defines; } /** * @internal */ - _releaseVertexArrayObject(effect = null) { - if (!effect || !this._vertexArrayObjects) { - return; - } - if (this._vertexArrayObjects[effect.key]) { - this._engine.releaseVertexArrayObject(this._vertexArrayObjects[effect.key]); - delete this._vertexArrayObjects[effect.key]; + _getDrawWrapper(passId, createIfNotExisting = false) { + passId = passId ?? this._engine.currentRenderPassId; + let drawWrapper = this._drawWrappers[passId]; + if (!drawWrapper && createIfNotExisting) { + this._drawWrappers[passId] = drawWrapper = new DrawWrapper(this._mesh.getScene().getEngine()); } + return drawWrapper; } /** - * Release the associated resources for a specific mesh - * @param mesh defines the source mesh - * @param shouldDispose defines if the geometry must be disposed if there is no more mesh pointing to it + * @internal */ - releaseForMesh(mesh, shouldDispose) { - const meshes = this._meshes; - const index = meshes.indexOf(mesh); - if (index === -1) { - return; - } - meshes.splice(index, 1); - if (this._vertexArrayObjects) { - mesh._invalidateInstanceVertexArrayObject(); - } - mesh._geometry = null; - if (meshes.length === 0 && shouldDispose) { - this.dispose(); + _removeDrawWrapper(passId, disposeWrapper = true) { + var _a; + if (disposeWrapper) { + (_a = this._drawWrappers[passId]) == null ? void 0 : _a.dispose(); } + this._drawWrappers[passId] = void 0; } /** - * Apply current geometry to a given mesh - * @param mesh defines the mesh to apply geometry to + * Gets associated (main) effect (possibly the effect override if defined) */ - applyToMesh(mesh) { - if (mesh._geometry === this) { - return; - } - const previousGeometry = mesh._geometry; - if (previousGeometry) { - previousGeometry.releaseForMesh(mesh); - } - if (this._vertexArrayObjects) { - mesh._invalidateInstanceVertexArrayObject(); - } - const meshes = this._meshes; - mesh._geometry = this; - mesh._internalAbstractMeshDataInfo._positions = null; - this._scene.pushGeometry(this); - meshes.push(mesh); - if (this.isReady()) { - this._applyToMesh(mesh); - } else if (this._boundingInfo) { - mesh.setBoundingInfo(this._boundingInfo); - } + get effect() { + var _a; + return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : ((_a = this._getDrawWrapper()) == null ? void 0 : _a.effect) ?? null; } - _updateExtend(data = null) { - if (this.useBoundingInfoFromGeometry && this._boundingInfo) { - this._extend = { - minimum: this._boundingInfo.minimum.clone(), - maximum: this._boundingInfo.maximum.clone() - }; - } else { - if (!data) { - data = this.getVerticesData(VertexBuffer.PositionKind); - if (!data) { - return; - } - } - this._extend = extractMinAndMax(data, 0, this._totalVertices, this.boundingBias, 3); - } + /** @internal */ + get _drawWrapper() { + return this._mainDrawWrapperOverride ?? this._getDrawWrapper(void 0, true); } - _applyToMesh(mesh) { - const numOfMeshes = this._meshes.length; - for (const kind in this._vertexBuffers) { - if (numOfMeshes === 1) { - this._vertexBuffers[kind].create(); - } - if (kind === VertexBuffer.PositionKind) { - if (!this._extend) { - this._updateExtend(); - } - mesh.buildBoundingInfo(this._extend.minimum, this._extend.maximum); - mesh._createGlobalSubMesh(mesh.isUnIndexed); - mesh._updateBoundingInfo(); - } - } - if (numOfMeshes === 1 && this._indices && this._indices.length > 0) { - this._indexBuffer = this._engine.createIndexBuffer(this._indices, this._updatable, "Geometry_" + this.id + "_IndexBuffer"); - } - mesh._syncGeometryWithMorphTargetManager(); - mesh.synchronizeInstances(); + /** @internal */ + get _drawWrapperOverride() { + return this._mainDrawWrapperOverride; } - _notifyUpdate(kind) { - if (this.onGeometryUpdated) { - this.onGeometryUpdated(this, kind); - } - if (this._vertexArrayObjects) { - this._disposeVertexArrayObjects(); - } - for (const mesh of this._meshes) { - mesh._markSubMeshesAsAttributesDirty(); - } + /** + * @internal + */ + _setMainDrawWrapperOverride(wrapper) { + this._mainDrawWrapperOverride = wrapper; } /** - * Load the geometry if it was flagged as delay loaded - * @param scene defines the hosting scene - * @param onLoaded defines a callback called when the geometry is loaded + * Sets associated effect (effect used to render this submesh) + * @param effect defines the effect to associate with + * @param defines defines the set of defines used to compile this effect + * @param materialContext material context associated to the effect + * @param resetContext true to reset the draw context */ - load(scene, onLoaded) { - if (this.delayLoadState === 2) { - return; - } - if (this.isReady()) { - if (onLoaded) { - onLoaded(); - } - return; + setEffect(effect, defines = null, materialContext, resetContext = true) { + const drawWrapper = this._drawWrapper; + drawWrapper.setEffect(effect, defines, resetContext); + if (materialContext !== void 0) { + drawWrapper.materialContext = materialContext; } - this.delayLoadState = 2; - this._queueLoad(scene, onLoaded); - } - _queueLoad(scene, onLoaded) { - if (!this.delayLoadingFile) { - return; + if (!effect) { + drawWrapper.defines = null; + drawWrapper.materialContext = void 0; } - scene.addPendingData(this); - scene._loadFile(this.delayLoadingFile, (data) => { - if (!this._delayLoadingFunction) { - return; - } - this._delayLoadingFunction(JSON.parse(data), this); - this.delayLoadState = 1; - this._delayInfo = []; - scene.removePendingData(this); - const meshes = this._meshes; - const numOfMeshes = meshes.length; - for (let index = 0; index < numOfMeshes; index++) { - this._applyToMesh(meshes[index]); - } - if (onLoaded) { - onLoaded(); - } - }, void 0, true); } /** - * Invert the geometry to move from a right handed system to a left handed one. + * Resets the draw wrappers cache + * @param passId If provided, releases only the draw wrapper corresponding to this render pass id */ - toLeftHanded() { - const tIndices = this.getIndices(false); - if (tIndices != null && tIndices.length > 0) { - for (let i = 0; i < tIndices.length; i += 3) { - const tTemp = tIndices[i + 0]; - tIndices[i + 0] = tIndices[i + 2]; - tIndices[i + 2] = tTemp; - } - this.setIndices(tIndices); - } - const tPositions = this.getVerticesData(VertexBuffer.PositionKind, false); - if (tPositions != null && tPositions.length > 0) { - for (let i = 0; i < tPositions.length; i += 3) { - tPositions[i + 2] = -tPositions[i + 2]; - } - this.setVerticesData(VertexBuffer.PositionKind, tPositions, false); - } - const tNormals = this.getVerticesData(VertexBuffer.NormalKind, false); - if (tNormals != null && tNormals.length > 0) { - for (let i = 0; i < tNormals.length; i += 3) { - tNormals[i + 2] = -tNormals[i + 2]; + resetDrawCache(passId) { + if (this._drawWrappers) { + if (passId !== void 0) { + this._removeDrawWrapper(passId); + return; + } else { + for (const drawWrapper of this._drawWrappers) { + drawWrapper == null ? void 0 : drawWrapper.dispose(); + } } - this.setVerticesData(VertexBuffer.NormalKind, tNormals, false); } + this._drawWrappers = []; } - // Cache - /** @internal */ - _resetPointsArrayCache() { - this._positions = null; + /** + * Add a new submesh to a mesh + * @param materialIndex defines the material index to use + * @param verticesStart defines vertex index start + * @param verticesCount defines vertices count + * @param indexStart defines index start + * @param indexCount defines indices count + * @param mesh defines the parent mesh + * @param renderingMesh defines an optional rendering mesh + * @param createBoundingBox defines if bounding box should be created for this submesh + * @returns the new submesh + */ + static AddToMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox = true) { + return new _SubMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox); } - /** @internal */ - _generatePointsArray() { - if (this._positions) { - return true; - } - const data = this.getVerticesData(VertexBuffer.PositionKind); - if (!data || data.length === 0) { - return false; - } - for (let index = this._positionsCache.length * 3, arrayIdx = this._positionsCache.length; index < data.length; index += 3, ++arrayIdx) { - this._positionsCache[arrayIdx] = Vector3.FromArray(data, index); + /** + * Creates a new submesh + * @param materialIndex defines the material index to use + * @param verticesStart defines vertex index start + * @param verticesCount defines vertices count + * @param indexStart defines index start + * @param indexCount defines indices count + * @param mesh defines the parent mesh + * @param renderingMesh defines an optional rendering mesh + * @param createBoundingBox defines if bounding box should be created for this submesh + * @param addToMesh defines a boolean indicating that the submesh must be added to the mesh.subMeshes array (true by default) + */ + constructor(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox = true, addToMesh = true) { + this.materialIndex = materialIndex; + this.verticesStart = verticesStart; + this.verticesCount = verticesCount; + this.indexStart = indexStart; + this.indexCount = indexCount; + this._mainDrawWrapperOverride = null; + this._linesIndexCount = 0; + this._linesIndexBuffer = null; + this._lastColliderWorldVertices = null; + this._lastColliderTransformMatrix = null; + this._wasDispatched = false; + this._renderId = 0; + this._alphaIndex = 0; + this._distanceToCamera = 0; + this._currentMaterial = null; + this._mesh = mesh; + this._renderingMesh = renderingMesh || mesh; + if (addToMesh) { + mesh.subMeshes.push(this); } - for (let index = 0, arrayIdx = 0; index < data.length; index += 3, ++arrayIdx) { - this._positionsCache[arrayIdx].set(data[0 + index], data[1 + index], data[2 + index]); + this._engine = this._mesh.getScene().getEngine(); + this.resetDrawCache(); + this._trianglePlanes = []; + this._id = mesh.subMeshes.length - 1; + if (createBoundingBox) { + this.refreshBoundingInfo(); + mesh.computeWorldMatrix(true); } - this._positionsCache.length = data.length / 3; - this._positions = this._positionsCache; - return true; } /** - * Gets a value indicating if the geometry is disposed - * @returns true if the geometry was disposed + * Returns true if this submesh covers the entire parent mesh + * @ignorenaming */ - isDisposed() { - return this._isDisposed; + // eslint-disable-next-line @typescript-eslint/naming-convention + get IsGlobal() { + return this.verticesStart === 0 && this.verticesCount === this._mesh.getTotalVertices() && this.indexStart === 0 && this.indexCount === this._mesh.getTotalIndices(); } - _disposeVertexArrayObjects() { - if (this._vertexArrayObjects) { - for (const kind in this._vertexArrayObjects) { - this._engine.releaseVertexArrayObject(this._vertexArrayObjects[kind]); - } - this._vertexArrayObjects = {}; - const meshes = this._meshes; - const numOfMeshes = meshes.length; - for (let index = 0; index < numOfMeshes; index++) { - meshes[index]._invalidateInstanceVertexArrayObject(); - } + /** + * Returns the submesh BoundingInfo object + * @returns current bounding info (or mesh's one if the submesh is global) + */ + getBoundingInfo() { + if (this.IsGlobal || this._mesh.hasThinInstances) { + return this._mesh.getBoundingInfo(); } + return this._boundingInfo; } /** - * Free all associated resources + * Sets the submesh BoundingInfo + * @param boundingInfo defines the new bounding info to use + * @returns the SubMesh */ - dispose() { - const meshes = this._meshes; - const numOfMeshes = meshes.length; - let index; - for (index = 0; index < numOfMeshes; index++) { - this.releaseForMesh(meshes[index]); - } - this._meshes.length = 0; - this._disposeVertexArrayObjects(); - for (const kind in this._vertexBuffers) { - this._vertexBuffers[kind].dispose(); - } - this._vertexBuffers = {}; - this._totalVertices = 0; - if (this._indexBuffer) { - this._engine._releaseBuffer(this._indexBuffer); - } - this._indexBuffer = null; - this._indices = []; - this.delayLoadState = 0; - this.delayLoadingFile = null; - this._delayLoadingFunction = null; - this._delayInfo = []; - this._boundingInfo = null; - this._scene.removeGeometry(this); - if (this._parentContainer) { - const index2 = this._parentContainer.geometries.indexOf(this); - if (index2 > -1) { - this._parentContainer.geometries.splice(index2, 1); - } - this._parentContainer = null; - } - this._isDisposed = true; + setBoundingInfo(boundingInfo) { + this._boundingInfo = boundingInfo; + return this; } /** - * Clone the current geometry into a new geometry - * @param id defines the unique ID of the new geometry - * @returns a new geometry object + * Returns the mesh of the current submesh + * @returns the parent mesh */ - copy(id) { - const vertexData = new VertexData(); - vertexData.indices = []; - const indices = this.getIndices(); - if (indices) { - for (let index = 0; index < indices.length; index++) { - vertexData.indices.push(indices[index]); - } - } - let updatable = false; - let stopChecking = false; - let kind; - for (kind in this._vertexBuffers) { - const data = this.getVerticesData(kind); - if (data) { - if (data instanceof Float32Array) { - vertexData.set(new Float32Array(data), kind); - } else { - vertexData.set(data.slice(0), kind); - } - if (!stopChecking) { - const vb = this.getVertexBuffer(kind); - if (vb) { - updatable = vb.isUpdatable(); - stopChecking = !updatable; - } - } - } - } - const geometry = new _Geometry(id, this._scene, vertexData, updatable); - geometry.delayLoadState = this.delayLoadState; - geometry.delayLoadingFile = this.delayLoadingFile; - geometry._delayLoadingFunction = this._delayLoadingFunction; - for (kind in this._delayInfo) { - geometry._delayInfo = geometry._delayInfo || []; - geometry._delayInfo.push(kind); - } - geometry._boundingInfo = new BoundingInfo(this._extend.minimum, this._extend.maximum); - return geometry; + getMesh() { + return this._mesh; } /** - * Serialize the current geometry info (and not the vertices data) into a JSON object - * @returns a JSON representation of the current geometry data (without the vertices data) + * Returns the rendering mesh of the submesh + * @returns the rendering mesh (could be different from parent mesh) */ - serialize() { - const serializationObject = {}; - serializationObject.id = this.id; - serializationObject.uniqueId = this.uniqueId; - serializationObject.updatable = this._updatable; - if (Tags && Tags.HasTags(this)) { - serializationObject.tags = Tags.GetTags(this); - } - return serializationObject; + getRenderingMesh() { + return this._renderingMesh; } - _toNumberArray(origin) { - if (Array.isArray(origin)) { - return origin; - } else { - return Array.prototype.slice.call(origin); - } + /** + * Returns the replacement mesh of the submesh + * @returns the replacement mesh (could be different from parent mesh) + */ + getReplacementMesh() { + return this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null; } /** - * Release any memory retained by the cached data on the Geometry. - * - * Call this function to reduce memory footprint of the mesh. - * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly) + * Returns the effective mesh of the submesh + * @returns the effective mesh (could be different from parent mesh) */ - clearCachedData() { - this._indices = []; - this._resetPointsArrayCache(); - for (const vbName in this._vertexBuffers) { - if (!Object.prototype.hasOwnProperty.call(this._vertexBuffers, vbName)) { - continue; - } - this._vertexBuffers[vbName]._buffer._data = null; - } + getEffectiveMesh() { + const replacementMesh = this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null; + return replacementMesh ? replacementMesh : this._renderingMesh; } /** - * Serialize all vertices data into a JSON object - * @returns a JSON representation of the current geometry data + * Returns the submesh material + * @param getDefaultMaterial Defines whether or not to get the default material if nothing has been defined. + * @returns null or the current material */ - serializeVerticeData() { - const serializationObject = this.serialize(); - if (this.isVerticesDataPresent(VertexBuffer.PositionKind)) { - serializationObject.positions = this._toNumberArray(this.getVerticesData(VertexBuffer.PositionKind)); - if (this.isVertexBufferUpdatable(VertexBuffer.PositionKind)) { - serializationObject.positions._updatable = true; + getMaterial(getDefaultMaterial = true) { + const rootMaterial = this._renderingMesh.getMaterialForRenderPass(this._engine.currentRenderPassId) ?? this._renderingMesh.material; + if (!rootMaterial) { + return getDefaultMaterial ? this._mesh.getScene().defaultMaterial : null; + } else if (this._isMultiMaterial(rootMaterial)) { + const effectiveMaterial = rootMaterial.getSubMaterial(this.materialIndex); + if (this._currentMaterial !== effectiveMaterial) { + this._currentMaterial = effectiveMaterial; + this.resetDrawCache(); } + return effectiveMaterial; } - if (this.isVerticesDataPresent(VertexBuffer.NormalKind)) { - serializationObject.normals = this._toNumberArray(this.getVerticesData(VertexBuffer.NormalKind)); - if (this.isVertexBufferUpdatable(VertexBuffer.NormalKind)) { - serializationObject.normals._updatable = true; - } + return rootMaterial; + } + _isMultiMaterial(material) { + return material.getSubMaterial !== void 0; + } + // Methods + /** + * Sets a new updated BoundingInfo object to the submesh + * @param data defines an optional position array to use to determine the bounding info + * @returns the SubMesh + */ + refreshBoundingInfo(data = null) { + this._lastColliderWorldVertices = null; + if (this.IsGlobal || !this._renderingMesh || !this._renderingMesh.geometry) { + return this; } - if (this.isVerticesDataPresent(VertexBuffer.TangentKind)) { - serializationObject.tangents = this._toNumberArray(this.getVerticesData(VertexBuffer.TangentKind)); - if (this.isVertexBufferUpdatable(VertexBuffer.TangentKind)) { - serializationObject.tangents._updatable = true; - } + if (!data) { + data = this._renderingMesh.getVerticesData(VertexBuffer.PositionKind); } - if (this.isVerticesDataPresent(VertexBuffer.UVKind)) { - serializationObject.uvs = this._toNumberArray(this.getVerticesData(VertexBuffer.UVKind)); - if (this.isVertexBufferUpdatable(VertexBuffer.UVKind)) { - serializationObject.uvs._updatable = true; - } + if (!data) { + this._boundingInfo = this._mesh.getBoundingInfo(); + return this; } - if (this.isVerticesDataPresent(VertexBuffer.UV2Kind)) { - serializationObject.uvs2 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV2Kind)); - if (this.isVertexBufferUpdatable(VertexBuffer.UV2Kind)) { - serializationObject.uvs2._updatable = true; - } + const indices = this._renderingMesh.getIndices(); + let extend; + if (this.indexStart === 0 && this.indexCount === indices.length) { + const boundingInfo = this._renderingMesh.getBoundingInfo(); + extend = { minimum: boundingInfo.minimum.clone(), maximum: boundingInfo.maximum.clone() }; + } else { + extend = extractMinAndMaxIndexed(data, indices, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias); } - if (this.isVerticesDataPresent(VertexBuffer.UV3Kind)) { - serializationObject.uvs3 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV3Kind)); - if (this.isVertexBufferUpdatable(VertexBuffer.UV3Kind)) { - serializationObject.uvs3._updatable = true; - } + if (this._boundingInfo) { + this._boundingInfo.reConstruct(extend.minimum, extend.maximum); + } else { + this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum); } - if (this.isVerticesDataPresent(VertexBuffer.UV4Kind)) { - serializationObject.uvs4 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV4Kind)); - if (this.isVertexBufferUpdatable(VertexBuffer.UV4Kind)) { - serializationObject.uvs4._updatable = true; - } + return this; + } + /** + * @internal + */ + _checkCollision(collider) { + const boundingInfo = this.getBoundingInfo(); + return boundingInfo._checkCollision(collider); + } + /** + * Updates the submesh BoundingInfo + * @param world defines the world matrix to use to update the bounding info + * @returns the submesh + */ + updateBoundingInfo(world) { + let boundingInfo = this.getBoundingInfo(); + if (!boundingInfo) { + this.refreshBoundingInfo(); + boundingInfo = this.getBoundingInfo(); } - if (this.isVerticesDataPresent(VertexBuffer.UV5Kind)) { - serializationObject.uvs5 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV5Kind)); - if (this.isVertexBufferUpdatable(VertexBuffer.UV5Kind)) { - serializationObject.uvs5._updatable = true; - } + if (boundingInfo) { + boundingInfo.update(world); } - if (this.isVerticesDataPresent(VertexBuffer.UV6Kind)) { - serializationObject.uvs6 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV6Kind)); - if (this.isVertexBufferUpdatable(VertexBuffer.UV6Kind)) { - serializationObject.uvs6._updatable = true; - } + return this; + } + /** + * True is the submesh bounding box intersects the frustum defined by the passed array of planes. + * @param frustumPlanes defines the frustum planes + * @returns true if the submesh is intersecting with the frustum + */ + isInFrustum(frustumPlanes) { + const boundingInfo = this.getBoundingInfo(); + if (!boundingInfo) { + return false; } - if (this.isVerticesDataPresent(VertexBuffer.ColorKind)) { - serializationObject.colors = this._toNumberArray(this.getVerticesData(VertexBuffer.ColorKind)); - if (this.isVertexBufferUpdatable(VertexBuffer.ColorKind)) { - serializationObject.colors._updatable = true; - } + return boundingInfo.isInFrustum(frustumPlanes, this._mesh.cullingStrategy); + } + /** + * True is the submesh bounding box is completely inside the frustum defined by the passed array of planes + * @param frustumPlanes defines the frustum planes + * @returns true if the submesh is inside the frustum + */ + isCompletelyInFrustum(frustumPlanes) { + const boundingInfo = this.getBoundingInfo(); + if (!boundingInfo) { + return false; } - if (this.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind)) { - serializationObject.matricesIndices = this._toNumberArray(this.getVerticesData(VertexBuffer.MatricesIndicesKind)); - serializationObject.matricesIndices._isExpanded = true; - if (this.isVertexBufferUpdatable(VertexBuffer.MatricesIndicesKind)) { - serializationObject.matricesIndices._updatable = true; + return boundingInfo.isCompletelyInFrustum(frustumPlanes); + } + /** + * Renders the submesh + * @param enableAlphaMode defines if alpha needs to be used + * @returns the submesh + */ + render(enableAlphaMode) { + this._renderingMesh.render(this, enableAlphaMode, this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : void 0); + return this; + } + /** + * @internal + */ + _getLinesIndexBuffer(indices, engine) { + if (!this._linesIndexBuffer) { + const linesIndices = []; + for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 3) { + linesIndices.push(indices[index], indices[index + 1], indices[index + 1], indices[index + 2], indices[index + 2], indices[index]); } + this._linesIndexBuffer = engine.createIndexBuffer(linesIndices); + this._linesIndexCount = linesIndices.length; } - if (this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) { - serializationObject.matricesWeights = this._toNumberArray(this.getVerticesData(VertexBuffer.MatricesWeightsKind)); - if (this.isVertexBufferUpdatable(VertexBuffer.MatricesWeightsKind)) { - serializationObject.matricesWeights._updatable = true; - } + return this._linesIndexBuffer; + } + /** + * Checks if the submesh intersects with a ray + * @param ray defines the ray to test + * @returns true is the passed ray intersects the submesh bounding box + */ + canIntersects(ray) { + const boundingInfo = this.getBoundingInfo(); + if (!boundingInfo) { + return false; } - serializationObject.indices = this._toNumberArray(this.getIndices()); - return serializationObject; + return ray.intersectsBox(boundingInfo.boundingBox); } - // Statics /** - * Extracts a clone of a mesh geometry - * @param mesh defines the source mesh - * @param id defines the unique ID of the new geometry object - * @returns the new geometry object + * Intersects current submesh with a ray + * @param ray defines the ray to test + * @param positions defines mesh's positions array + * @param indices defines mesh's indices array + * @param fastCheck defines if the first intersection will be used (and not the closest) + * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected + * @returns intersection info or null if no intersection */ - static ExtractFromMesh(mesh, id) { - const geometry = mesh._geometry; - if (!geometry) { + intersects(ray, positions, indices, fastCheck, trianglePredicate) { + const material = this.getMaterial(); + if (!material) { return null; } - return geometry.copy(id); + let step = 3; + let checkStopper = false; + switch (material.fillMode) { + case 3: + case 5: + case 6: + case 8: + return null; + case 7: + step = 1; + checkStopper = true; + break; + default: + break; + } + if (material.fillMode === 4) { + if (!indices.length) { + return this._intersectUnIndexedLines(ray, positions, indices, this._mesh.intersectionThreshold, fastCheck); + } + return this._intersectLines(ray, positions, indices, this._mesh.intersectionThreshold, fastCheck); + } else { + if (!indices.length && this._mesh._unIndexed) { + return this._intersectUnIndexedTriangles(ray, positions, indices, fastCheck, trianglePredicate); + } + return this._intersectTriangles(ray, positions, indices, step, checkStopper, fastCheck, trianglePredicate); + } } /** - * You should now use Tools.RandomId(), this method is still here for legacy reasons. - * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523 - * Be aware Math.random() could cause collisions, but: - * "All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide" - * @returns a string containing a new GUID + * @internal */ - static RandomId() { - return Tools.RandomId(); - } - static _GetGeometryByLoadedUniqueId(uniqueId, scene) { - for (let index = 0; index < scene.geometries.length; index++) { - if (scene.geometries[index]._loadedUniqueId === uniqueId) { - return scene.geometries[index]; + _intersectLines(ray, positions, indices, intersectionThreshold, fastCheck) { + let intersectInfo = null; + for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 2) { + const p0 = positions[indices[index]]; + const p1 = positions[indices[index + 1]]; + const length = ray.intersectionSegment(p0, p1, intersectionThreshold); + if (length < 0) { + continue; + } + if (fastCheck || !intersectInfo || length < intersectInfo.distance) { + intersectInfo = new IntersectionInfo(null, null, length); + intersectInfo.faceId = index / 2; + if (fastCheck) { + break; + } } } - return null; + return intersectInfo; } /** * @internal */ - static _ImportGeometry(parsedGeometry, mesh) { - const scene = mesh.getScene(); - const geometryUniqueId = parsedGeometry.geometryUniqueId; - const geometryId = parsedGeometry.geometryId; - if (geometryUniqueId || geometryId) { - const geometry = geometryUniqueId ? this._GetGeometryByLoadedUniqueId(geometryUniqueId, scene) : scene.getGeometryById(geometryId); - if (geometry) { - geometry.applyToMesh(mesh); + _intersectUnIndexedLines(ray, positions, indices, intersectionThreshold, fastCheck) { + let intersectInfo = null; + for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 2) { + const p0 = positions[index]; + const p1 = positions[index + 1]; + const length = ray.intersectionSegment(p0, p1, intersectionThreshold); + if (length < 0) { + continue; } - } else if (parsedGeometry instanceof ArrayBuffer) { - const binaryInfo = mesh._binaryInfo; - if (binaryInfo.positionsAttrDesc && binaryInfo.positionsAttrDesc.count > 0) { - const positionsData = new Float32Array(parsedGeometry, binaryInfo.positionsAttrDesc.offset, binaryInfo.positionsAttrDesc.count); - mesh.setVerticesData(VertexBuffer.PositionKind, positionsData, false); + if (fastCheck || !intersectInfo || length < intersectInfo.distance) { + intersectInfo = new IntersectionInfo(null, null, length); + intersectInfo.faceId = index / 2; + if (fastCheck) { + break; + } } - if (binaryInfo.normalsAttrDesc && binaryInfo.normalsAttrDesc.count > 0) { - const normalsData = new Float32Array(parsedGeometry, binaryInfo.normalsAttrDesc.offset, binaryInfo.normalsAttrDesc.count); - mesh.setVerticesData(VertexBuffer.NormalKind, normalsData, false); + } + return intersectInfo; + } + /** + * @internal + */ + _intersectTriangles(ray, positions, indices, step, checkStopper, fastCheck, trianglePredicate) { + let intersectInfo = null; + let faceId = -1; + for (let index = this.indexStart; index < this.indexStart + this.indexCount - (3 - step); index += step) { + faceId++; + const indexA = indices[index]; + const indexB = indices[index + 1]; + const indexC = indices[index + 2]; + if (checkStopper && indexC === 4294967295) { + index += 2; + continue; } - if (binaryInfo.tangetsAttrDesc && binaryInfo.tangetsAttrDesc.count > 0) { - const tangentsData = new Float32Array(parsedGeometry, binaryInfo.tangetsAttrDesc.offset, binaryInfo.tangetsAttrDesc.count); - mesh.setVerticesData(VertexBuffer.TangentKind, tangentsData, false); + const p0 = positions[indexA]; + const p1 = positions[indexB]; + const p2 = positions[indexC]; + if (!p0 || !p1 || !p2) { + continue; } - if (binaryInfo.uvsAttrDesc && binaryInfo.uvsAttrDesc.count > 0) { - const uvsData = new Float32Array(parsedGeometry, binaryInfo.uvsAttrDesc.offset, binaryInfo.uvsAttrDesc.count); - if (CompatibilityOptions.UseOpenGLOrientationForUV) { - for (let index = 1; index < uvsData.length; index += 2) { - uvsData[index] = 1 - uvsData[index]; - } - } - mesh.setVerticesData(VertexBuffer.UVKind, uvsData, false); + if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray, indexA, indexB, indexC)) { + continue; } - if (binaryInfo.uvs2AttrDesc && binaryInfo.uvs2AttrDesc.count > 0) { - const uvs2Data = new Float32Array(parsedGeometry, binaryInfo.uvs2AttrDesc.offset, binaryInfo.uvs2AttrDesc.count); - if (CompatibilityOptions.UseOpenGLOrientationForUV) { - for (let index = 1; index < uvs2Data.length; index += 2) { - uvs2Data[index] = 1 - uvs2Data[index]; - } + const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2); + if (currentIntersectInfo) { + if (currentIntersectInfo.distance < 0) { + continue; } - mesh.setVerticesData(VertexBuffer.UV2Kind, uvs2Data, false); - } - if (binaryInfo.uvs3AttrDesc && binaryInfo.uvs3AttrDesc.count > 0) { - const uvs3Data = new Float32Array(parsedGeometry, binaryInfo.uvs3AttrDesc.offset, binaryInfo.uvs3AttrDesc.count); - if (CompatibilityOptions.UseOpenGLOrientationForUV) { - for (let index = 1; index < uvs3Data.length; index += 2) { - uvs3Data[index] = 1 - uvs3Data[index]; + if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) { + intersectInfo = currentIntersectInfo; + intersectInfo.faceId = faceId; + if (fastCheck) { + break; } } - mesh.setVerticesData(VertexBuffer.UV3Kind, uvs3Data, false); } - if (binaryInfo.uvs4AttrDesc && binaryInfo.uvs4AttrDesc.count > 0) { - const uvs4Data = new Float32Array(parsedGeometry, binaryInfo.uvs4AttrDesc.offset, binaryInfo.uvs4AttrDesc.count); - if (CompatibilityOptions.UseOpenGLOrientationForUV) { - for (let index = 1; index < uvs4Data.length; index += 2) { - uvs4Data[index] = 1 - uvs4Data[index]; - } - } - mesh.setVerticesData(VertexBuffer.UV4Kind, uvs4Data, false); + } + return intersectInfo; + } + /** + * @internal + */ + _intersectUnIndexedTriangles(ray, positions, indices, fastCheck, trianglePredicate) { + let intersectInfo = null; + for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 3) { + const p0 = positions[index]; + const p1 = positions[index + 1]; + const p2 = positions[index + 2]; + if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray, -1, -1, -1)) { + continue; } - if (binaryInfo.uvs5AttrDesc && binaryInfo.uvs5AttrDesc.count > 0) { - const uvs5Data = new Float32Array(parsedGeometry, binaryInfo.uvs5AttrDesc.offset, binaryInfo.uvs5AttrDesc.count); - if (CompatibilityOptions.UseOpenGLOrientationForUV) { - for (let index = 1; index < uvs5Data.length; index += 2) { - uvs5Data[index] = 1 - uvs5Data[index]; - } + const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2); + if (currentIntersectInfo) { + if (currentIntersectInfo.distance < 0) { + continue; } - mesh.setVerticesData(VertexBuffer.UV5Kind, uvs5Data, false); - } - if (binaryInfo.uvs6AttrDesc && binaryInfo.uvs6AttrDesc.count > 0) { - const uvs6Data = new Float32Array(parsedGeometry, binaryInfo.uvs6AttrDesc.offset, binaryInfo.uvs6AttrDesc.count); - if (CompatibilityOptions.UseOpenGLOrientationForUV) { - for (let index = 1; index < uvs6Data.length; index += 2) { - uvs6Data[index] = 1 - uvs6Data[index]; + if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) { + intersectInfo = currentIntersectInfo; + intersectInfo.faceId = index / 3; + if (fastCheck) { + break; } } - mesh.setVerticesData(VertexBuffer.UV6Kind, uvs6Data, false); } - if (binaryInfo.colorsAttrDesc && binaryInfo.colorsAttrDesc.count > 0) { - const colorsData = new Float32Array(parsedGeometry, binaryInfo.colorsAttrDesc.offset, binaryInfo.colorsAttrDesc.count); - mesh.setVerticesData(VertexBuffer.ColorKind, colorsData, false, binaryInfo.colorsAttrDesc.stride); - } - if (binaryInfo.matricesIndicesAttrDesc && binaryInfo.matricesIndicesAttrDesc.count > 0) { - const matricesIndicesData = new Int32Array(parsedGeometry, binaryInfo.matricesIndicesAttrDesc.offset, binaryInfo.matricesIndicesAttrDesc.count); - const floatIndices = []; - for (let i = 0; i < matricesIndicesData.length; i++) { - const index = matricesIndicesData[i]; - floatIndices.push(index & 255); - floatIndices.push((index & 65280) >> 8); - floatIndices.push((index & 16711680) >> 16); - floatIndices.push(index >> 24 & 255); - } - mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, floatIndices, false); - } - if (binaryInfo.matricesIndicesExtraAttrDesc && binaryInfo.matricesIndicesExtraAttrDesc.count > 0) { - const matricesIndicesData = new Int32Array(parsedGeometry, binaryInfo.matricesIndicesExtraAttrDesc.offset, binaryInfo.matricesIndicesExtraAttrDesc.count); - const floatIndices = []; - for (let i = 0; i < matricesIndicesData.length; i++) { - const index = matricesIndicesData[i]; - floatIndices.push(index & 255); - floatIndices.push((index & 65280) >> 8); - floatIndices.push((index & 16711680) >> 16); - floatIndices.push(index >> 24 & 255); - } - mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, floatIndices, false); - } - if (binaryInfo.matricesWeightsAttrDesc && binaryInfo.matricesWeightsAttrDesc.count > 0) { - const matricesWeightsData = new Float32Array(parsedGeometry, binaryInfo.matricesWeightsAttrDesc.offset, binaryInfo.matricesWeightsAttrDesc.count); - mesh.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeightsData, false); - } - if (binaryInfo.indicesAttrDesc && binaryInfo.indicesAttrDesc.count > 0) { - const indicesData = new Int32Array(parsedGeometry, binaryInfo.indicesAttrDesc.offset, binaryInfo.indicesAttrDesc.count); - mesh.setIndices(indicesData, null); - } - if (binaryInfo.subMeshesAttrDesc && binaryInfo.subMeshesAttrDesc.count > 0) { - const subMeshesData = new Int32Array(parsedGeometry, binaryInfo.subMeshesAttrDesc.offset, binaryInfo.subMeshesAttrDesc.count * 5); - mesh.subMeshes = []; - for (let i = 0; i < binaryInfo.subMeshesAttrDesc.count; i++) { - const materialIndex = subMeshesData[i * 5 + 0]; - const verticesStart = subMeshesData[i * 5 + 1]; - const verticesCount = subMeshesData[i * 5 + 2]; - const indexStart = subMeshesData[i * 5 + 3]; - const indexCount = subMeshesData[i * 5 + 4]; - SubMesh.AddToMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh); - } - } - } else if (parsedGeometry.positions && parsedGeometry.normals && parsedGeometry.indices) { - mesh.setVerticesData(VertexBuffer.PositionKind, parsedGeometry.positions, parsedGeometry.positions._updatable); - mesh.setVerticesData(VertexBuffer.NormalKind, parsedGeometry.normals, parsedGeometry.normals._updatable); - if (parsedGeometry.tangents) { - mesh.setVerticesData(VertexBuffer.TangentKind, parsedGeometry.tangents, parsedGeometry.tangents._updatable); - } - if (parsedGeometry.uvs) { - mesh.setVerticesData(VertexBuffer.UVKind, parsedGeometry.uvs, parsedGeometry.uvs._updatable); - } - if (parsedGeometry.uvs2) { - mesh.setVerticesData(VertexBuffer.UV2Kind, parsedGeometry.uvs2, parsedGeometry.uvs2._updatable); - } - if (parsedGeometry.uvs3) { - mesh.setVerticesData(VertexBuffer.UV3Kind, parsedGeometry.uvs3, parsedGeometry.uvs3._updatable); - } - if (parsedGeometry.uvs4) { - mesh.setVerticesData(VertexBuffer.UV4Kind, parsedGeometry.uvs4, parsedGeometry.uvs4._updatable); - } - if (parsedGeometry.uvs5) { - mesh.setVerticesData(VertexBuffer.UV5Kind, parsedGeometry.uvs5, parsedGeometry.uvs5._updatable); - } - if (parsedGeometry.uvs6) { - mesh.setVerticesData(VertexBuffer.UV6Kind, parsedGeometry.uvs6, parsedGeometry.uvs6._updatable); - } - if (parsedGeometry.colors) { - mesh.setVerticesData(VertexBuffer.ColorKind, Color4.CheckColors4(parsedGeometry.colors, parsedGeometry.positions.length / 3), parsedGeometry.colors._updatable); - } - if (parsedGeometry.matricesIndices) { - if (!parsedGeometry.matricesIndices._isExpanded) { - const floatIndices = []; - for (let i = 0; i < parsedGeometry.matricesIndices.length; i++) { - const matricesIndex = parsedGeometry.matricesIndices[i]; - floatIndices.push(matricesIndex & 255); - floatIndices.push((matricesIndex & 65280) >> 8); - floatIndices.push((matricesIndex & 16711680) >> 16); - floatIndices.push(matricesIndex >> 24 & 255); - } - mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, floatIndices, parsedGeometry.matricesIndices._updatable); - } else { - delete parsedGeometry.matricesIndices._isExpanded; - mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, parsedGeometry.matricesIndices, parsedGeometry.matricesIndices._updatable); - } - } - if (parsedGeometry.matricesIndicesExtra) { - if (!parsedGeometry.matricesIndicesExtra._isExpanded) { - const floatIndices = []; - for (let i = 0; i < parsedGeometry.matricesIndicesExtra.length; i++) { - const matricesIndex = parsedGeometry.matricesIndicesExtra[i]; - floatIndices.push(matricesIndex & 255); - floatIndices.push((matricesIndex & 65280) >> 8); - floatIndices.push((matricesIndex & 16711680) >> 16); - floatIndices.push(matricesIndex >> 24 & 255); - } - mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, floatIndices, parsedGeometry.matricesIndicesExtra._updatable); - } else { - delete parsedGeometry.matricesIndices._isExpanded; - mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, parsedGeometry.matricesIndicesExtra, parsedGeometry.matricesIndicesExtra._updatable); - } - } - if (parsedGeometry.matricesWeights) { - _Geometry._CleanMatricesWeights(parsedGeometry, mesh); - mesh.setVerticesData(VertexBuffer.MatricesWeightsKind, parsedGeometry.matricesWeights, parsedGeometry.matricesWeights._updatable); - } - if (parsedGeometry.matricesWeightsExtra) { - mesh.setVerticesData(VertexBuffer.MatricesWeightsExtraKind, parsedGeometry.matricesWeightsExtra, parsedGeometry.matricesWeights._updatable); - } - mesh.setIndices(parsedGeometry.indices, null); - } - if (parsedGeometry.subMeshes) { - mesh.subMeshes = []; - for (let subIndex = 0; subIndex < parsedGeometry.subMeshes.length; subIndex++) { - const parsedSubMesh = parsedGeometry.subMeshes[subIndex]; - SubMesh.AddToMesh(parsedSubMesh.materialIndex, parsedSubMesh.verticesStart, parsedSubMesh.verticesCount, parsedSubMesh.indexStart, parsedSubMesh.indexCount, mesh); - } - } - if (mesh._shouldGenerateFlatShading) { - mesh.convertToFlatShadedMesh(); - mesh._shouldGenerateFlatShading = false; } - mesh.computeWorldMatrix(true); - scene.onMeshImportedObservable.notifyObservers(mesh); + return intersectInfo; } - static _CleanMatricesWeights(parsedGeometry, mesh) { - const epsilon = 1e-3; - if (!SceneLoaderFlags.CleanBoneMatrixWeights) { - return; - } - let noInfluenceBoneIndex = 0; - if (parsedGeometry.skeletonId > -1) { - const skeleton = mesh.getScene().getLastSkeletonById(parsedGeometry.skeletonId); - if (!skeleton) { - return; - } - noInfluenceBoneIndex = skeleton.bones.length; - } else { - return; - } - const matricesIndices = mesh.getVerticesData(VertexBuffer.MatricesIndicesKind); - const matricesIndicesExtra = mesh.getVerticesData(VertexBuffer.MatricesIndicesExtraKind); - const matricesWeights = parsedGeometry.matricesWeights; - const matricesWeightsExtra = parsedGeometry.matricesWeightsExtra; - const influencers = parsedGeometry.numBoneInfluencer; - const size = matricesWeights.length; - for (let i = 0; i < size; i += 4) { - let weight = 0; - let firstZeroWeight = -1; - for (let j = 0; j < 4; j++) { - const w = matricesWeights[i + j]; - weight += w; - if (w < epsilon && firstZeroWeight < 0) { - firstZeroWeight = j; - } - } - if (matricesWeightsExtra) { - for (let j = 0; j < 4; j++) { - const w = matricesWeightsExtra[i + j]; - weight += w; - if (w < epsilon && firstZeroWeight < 0) { - firstZeroWeight = j + 4; - } - } - } - if (firstZeroWeight < 0 || firstZeroWeight > influencers - 1) { - firstZeroWeight = influencers - 1; - } - if (weight > epsilon) { - const mweight = 1 / weight; - for (let j = 0; j < 4; j++) { - matricesWeights[i + j] *= mweight; - } - if (matricesWeightsExtra) { - for (let j = 0; j < 4; j++) { - matricesWeightsExtra[i + j] *= mweight; - } - } - } else { - if (firstZeroWeight >= 4) { - matricesWeightsExtra[i + firstZeroWeight - 4] = 1 - weight; - matricesIndicesExtra[i + firstZeroWeight - 4] = noInfluenceBoneIndex; - } else { - matricesWeights[i + firstZeroWeight] = 1 - weight; - matricesIndices[i + firstZeroWeight] = noInfluenceBoneIndex; - } - } - } - mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, matricesIndices); - if (parsedGeometry.matricesWeightsExtra) { - mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, matricesIndicesExtra); + /** @internal */ + _rebuild() { + if (this._linesIndexBuffer) { + this._linesIndexBuffer = null; } } + // Clone /** - * Create a new geometry from persisted data (Using .babylon file format) - * @param parsedVertexData defines the persisted data - * @param scene defines the hosting scene - * @param rootUrl defines the root url to use to load assets (like delayed data) - * @returns the new geometry object + * Creates a new submesh from the passed mesh + * @param newMesh defines the new hosting mesh + * @param newRenderingMesh defines an optional rendering mesh + * @returns the new submesh */ - static Parse(parsedVertexData, scene, rootUrl) { - const geometry = new _Geometry(parsedVertexData.id, scene, void 0, parsedVertexData.updatable); - geometry._loadedUniqueId = parsedVertexData.uniqueId; - if (Tags) { - Tags.AddTagsTo(geometry, parsedVertexData.tags); - } - if (parsedVertexData.delayLoadingFile) { - geometry.delayLoadState = 4; - geometry.delayLoadingFile = rootUrl + parsedVertexData.delayLoadingFile; - geometry._boundingInfo = new BoundingInfo(Vector3.FromArray(parsedVertexData.boundingBoxMinimum), Vector3.FromArray(parsedVertexData.boundingBoxMaximum)); - geometry._delayInfo = []; - if (parsedVertexData.hasUVs) { - geometry._delayInfo.push(VertexBuffer.UVKind); - } - if (parsedVertexData.hasUVs2) { - geometry._delayInfo.push(VertexBuffer.UV2Kind); - } - if (parsedVertexData.hasUVs3) { - geometry._delayInfo.push(VertexBuffer.UV3Kind); - } - if (parsedVertexData.hasUVs4) { - geometry._delayInfo.push(VertexBuffer.UV4Kind); - } - if (parsedVertexData.hasUVs5) { - geometry._delayInfo.push(VertexBuffer.UV5Kind); - } - if (parsedVertexData.hasUVs6) { - geometry._delayInfo.push(VertexBuffer.UV6Kind); - } - if (parsedVertexData.hasColors) { - geometry._delayInfo.push(VertexBuffer.ColorKind); - } - if (parsedVertexData.hasMatricesIndices) { - geometry._delayInfo.push(VertexBuffer.MatricesIndicesKind); - } - if (parsedVertexData.hasMatricesWeights) { - geometry._delayInfo.push(VertexBuffer.MatricesWeightsKind); + clone(newMesh, newRenderingMesh) { + const result = new _SubMesh(this.materialIndex, this.verticesStart, this.verticesCount, this.indexStart, this.indexCount, newMesh, newRenderingMesh, false); + if (!this.IsGlobal) { + const boundingInfo = this.getBoundingInfo(); + if (!boundingInfo) { + return result; } - geometry._delayLoadingFunction = VertexData.ImportVertexData; - } else { - VertexData.ImportVertexData(parsedVertexData, geometry); + result._boundingInfo = new BoundingInfo(boundingInfo.minimum, boundingInfo.maximum); } - scene.pushGeometry(geometry, true); - return geometry; - } -}; - -// node_modules/@babylonjs/core/Misc/performanceMonitor.js -var PerformanceMonitor = class { - /** - * constructor - * @param frameSampleSize The number of samples required to saturate the sliding window - */ - constructor(frameSampleSize = 30) { - this._enabled = true; - this._rollingFrameTime = new RollingAverage(frameSampleSize); + return result; } + // Dispose /** - * Samples current frame - * @param timeMs A timestamp in milliseconds of the current frame to compare with other frames + * Release associated resources */ - sampleFrame(timeMs = PrecisionDate.Now) { - if (!this._enabled) { - return; - } - if (this._lastFrameTimeMs != null) { - const dt = timeMs - this._lastFrameTimeMs; - this._rollingFrameTime.add(dt); + dispose() { + if (this._linesIndexBuffer) { + this._mesh.getScene().getEngine()._releaseBuffer(this._linesIndexBuffer); + this._linesIndexBuffer = null; } - this._lastFrameTimeMs = timeMs; - } - /** - * Returns the average frame time in milliseconds over the sliding window (or the subset of frames sampled so far) - */ - get averageFrameTime() { - return this._rollingFrameTime.average; - } - /** - * Returns the variance frame time in milliseconds over the sliding window (or the subset of frames sampled so far) - */ - get averageFrameTimeVariance() { - return this._rollingFrameTime.variance; - } - /** - * Returns the frame time of the most recent frame - */ - get instantaneousFrameTime() { - return this._rollingFrameTime.history(0); + const index = this._mesh.subMeshes.indexOf(this); + this._mesh.subMeshes.splice(index, 1); + this.resetDrawCache(); } /** - * Returns the average framerate in frames per second over the sliding window (or the subset of frames sampled so far) + * Gets the class name + * @returns the string "SubMesh". */ - get averageFPS() { - return 1e3 / this._rollingFrameTime.average; + getClassName() { + return "SubMesh"; } + // Statics /** - * Returns the average framerate in frames per second using the most recent frame time + * Creates a new submesh from indices data + * @param materialIndex the index of the main mesh material + * @param startIndex the index where to start the copy in the mesh indices array + * @param indexCount the number of indices to copy then from the startIndex + * @param mesh the main mesh to create the submesh from + * @param renderingMesh the optional rendering mesh + * @param createBoundingBox defines if bounding box should be created for this submesh + * @returns a new submesh */ - get instantaneousFPS() { - const history = this._rollingFrameTime.history(0); - if (history === 0) { - return 0; + static CreateFromIndices(materialIndex, startIndex, indexCount, mesh, renderingMesh, createBoundingBox = true) { + let minVertexIndex = Number.MAX_VALUE; + let maxVertexIndex = -Number.MAX_VALUE; + const whatWillRender = renderingMesh || mesh; + const indices = whatWillRender.getIndices(); + for (let index = startIndex; index < startIndex + indexCount; index++) { + const vertexIndex = indices[index]; + if (vertexIndex < minVertexIndex) { + minVertexIndex = vertexIndex; + } + if (vertexIndex > maxVertexIndex) { + maxVertexIndex = vertexIndex; + } } - return 1e3 / history; + return new _SubMesh(materialIndex, minVertexIndex, maxVertexIndex - minVertexIndex + 1, startIndex, indexCount, mesh, renderingMesh, createBoundingBox); } +}; + +// node_modules/@babylonjs/core/Meshes/mesh.vertexData.js +var VertexDataMaterialInfo = class { +}; +var VertexData = class _VertexData { /** - * Returns true if enough samples have been taken to completely fill the sliding window + * Creates a new VertexData */ - get isSaturated() { - return this._rollingFrameTime.isSaturated(); + constructor() { + this.uniqueId = 0; + this.metadata = {}; + this._applyTo = makeSyncFunction(this._applyToCoroutine.bind(this)); + this.uniqueId = _VertexData._UniqueIDGenerator; + _VertexData._UniqueIDGenerator++; } /** - * Enables contributions to the sliding window sample set + * Uses the passed data array to set the set the values for the specified kind of data + * @param data a linear array of floating numbers + * @param kind the type of data that is being set, eg positions, colors etc */ - enable() { - this._enabled = true; + set(data, kind) { + if (!data.length) { + Logger.Warn(`Setting vertex data kind '${kind}' with an empty array`); + } + switch (kind) { + case VertexBuffer.PositionKind: + this.positions = data; + break; + case VertexBuffer.NormalKind: + this.normals = data; + break; + case VertexBuffer.TangentKind: + this.tangents = data; + break; + case VertexBuffer.UVKind: + this.uvs = data; + break; + case VertexBuffer.UV2Kind: + this.uvs2 = data; + break; + case VertexBuffer.UV3Kind: + this.uvs3 = data; + break; + case VertexBuffer.UV4Kind: + this.uvs4 = data; + break; + case VertexBuffer.UV5Kind: + this.uvs5 = data; + break; + case VertexBuffer.UV6Kind: + this.uvs6 = data; + break; + case VertexBuffer.ColorKind: + this.colors = data; + break; + case VertexBuffer.MatricesIndicesKind: + this.matricesIndices = data; + break; + case VertexBuffer.MatricesWeightsKind: + this.matricesWeights = data; + break; + case VertexBuffer.MatricesIndicesExtraKind: + this.matricesIndicesExtra = data; + break; + case VertexBuffer.MatricesWeightsExtraKind: + this.matricesWeightsExtra = data; + break; + } } /** - * Disables contributions to the sliding window sample set - * Samples will not be interpolated over the disabled period + * Associates the vertexData to the passed Mesh. + * Sets it as updatable or not (default `false`) + * @param mesh the mesh the vertexData is applied to + * @param updatable when used and having the value true allows new data to update the vertexData + * @returns the VertexData */ - disable() { - this._enabled = false; - this._lastFrameTimeMs = null; + applyToMesh(mesh, updatable) { + this._applyTo(mesh, updatable, false); + return this; } /** - * Returns true if sampling is enabled + * Associates the vertexData to the passed Geometry. + * Sets it as updatable or not (default `false`) + * @param geometry the geometry the vertexData is applied to + * @param updatable when used and having the value true allows new data to update the vertexData + * @returns VertexData */ - get isEnabled() { - return this._enabled; + applyToGeometry(geometry, updatable) { + this._applyTo(geometry, updatable, false); + return this; } /** - * Resets performance monitor + * Updates the associated mesh + * @param mesh the mesh to be updated + * @returns VertexData */ - reset() { - this._lastFrameTimeMs = null; - this._rollingFrameTime.reset(); + updateMesh(mesh) { + this._update(mesh); + return this; } -}; -var RollingAverage = class { /** - * constructor - * @param length The number of samples required to saturate the sliding window + * Updates the associated geometry + * @param geometry the geometry to be updated + * @returns VertexData. */ - constructor(length) { - this._samples = new Array(length); - this.reset(); + updateGeometry(geometry) { + this._update(geometry); + return this; } /** - * Adds a sample to the sample set - * @param v The sample value + * @internal */ - add(v) { - let delta; - if (this.isSaturated()) { - const bottomValue = this._samples[this._pos]; - delta = bottomValue - this.average; - this.average -= delta / (this._sampleCount - 1); - this._m2 -= delta * (bottomValue - this.average); - } else { - this._sampleCount++; + *_applyToCoroutine(meshOrGeometry, updatable = false, isAsync) { + if (this.positions) { + meshOrGeometry.setVerticesData(VertexBuffer.PositionKind, this.positions, updatable); + if (isAsync) { + yield; + } } - delta = v - this.average; - this.average += delta / this._sampleCount; - this._m2 += delta * (v - this.average); - this.variance = this._m2 / (this._sampleCount - 1); - this._samples[this._pos] = v; - this._pos++; - this._pos %= this._samples.length; - } - /** - * Returns previously added values or null if outside of history or outside the sliding window domain - * @param i Index in history. For example, pass 0 for the most recent value and 1 for the value before that - * @returns Value previously recorded with add() or null if outside of range - */ - history(i) { - if (i >= this._sampleCount || i >= this._samples.length) { - return 0; + if (this.normals) { + meshOrGeometry.setVerticesData(VertexBuffer.NormalKind, this.normals, updatable); + if (isAsync) { + yield; + } } - const i0 = this._wrapPosition(this._pos - 1); - return this._samples[this._wrapPosition(i0 - i)]; - } - /** - * Returns true if enough samples have been taken to completely fill the sliding window - * @returns true if sample-set saturated - */ - isSaturated() { - return this._sampleCount >= this._samples.length; - } - /** - * Resets the rolling average (equivalent to 0 samples taken so far) - */ - reset() { - this.average = 0; - this.variance = 0; - this._sampleCount = 0; - this._pos = 0; - this._m2 = 0; - } - /** - * Wraps a value around the sample range boundaries - * @param i Position in sample range, for example if the sample length is 5, and i is -3, then 2 will be returned. - * @returns Wrapped position in sample range - */ - _wrapPosition(i) { - const max = this._samples.length; - return (i % max + max) % max; - } -}; - -// node_modules/@babylonjs/core/Engines/Extensions/engine.readTexture.js -function allocateAndCopyTypedBuffer(type, sizeOrDstBuffer, sizeInBytes = false, copyBuffer) { - switch (type) { - case 3: { - const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Int8Array(sizeOrDstBuffer) : new Int8Array(sizeOrDstBuffer); - if (copyBuffer) { - buffer2.set(new Int8Array(copyBuffer)); + if (this.tangents) { + meshOrGeometry.setVerticesData(VertexBuffer.TangentKind, this.tangents, updatable); + if (isAsync) { + yield; } - return buffer2; } - case 0: { - const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint8Array(sizeOrDstBuffer) : new Uint8Array(sizeOrDstBuffer); - if (copyBuffer) { - buffer2.set(new Uint8Array(copyBuffer)); + if (this.uvs) { + meshOrGeometry.setVerticesData(VertexBuffer.UVKind, this.uvs, updatable); + if (isAsync) { + yield; } - return buffer2; } - case 4: { - const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Int16Array(sizeOrDstBuffer) : new Int16Array(sizeInBytes ? sizeOrDstBuffer / 2 : sizeOrDstBuffer); - if (copyBuffer) { - buffer2.set(new Int16Array(copyBuffer)); + if (this.uvs2) { + meshOrGeometry.setVerticesData(VertexBuffer.UV2Kind, this.uvs2, updatable); + if (isAsync) { + yield; } - return buffer2; } - case 5: - case 8: - case 9: - case 10: - case 2: { - const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint16Array(sizeOrDstBuffer) : new Uint16Array(sizeInBytes ? sizeOrDstBuffer / 2 : sizeOrDstBuffer); - if (copyBuffer) { - buffer2.set(new Uint16Array(copyBuffer)); + if (this.uvs3) { + meshOrGeometry.setVerticesData(VertexBuffer.UV3Kind, this.uvs3, updatable); + if (isAsync) { + yield; } - return buffer2; } - case 6: { - const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Int32Array(sizeOrDstBuffer) : new Int32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer); - if (copyBuffer) { - buffer2.set(new Int32Array(copyBuffer)); + if (this.uvs4) { + meshOrGeometry.setVerticesData(VertexBuffer.UV4Kind, this.uvs4, updatable); + if (isAsync) { + yield; } - return buffer2; } - case 7: - case 11: - case 12: - case 13: - case 14: - case 15: { - const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint32Array(sizeOrDstBuffer) : new Uint32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer); - if (copyBuffer) { - buffer2.set(new Uint32Array(copyBuffer)); + if (this.uvs5) { + meshOrGeometry.setVerticesData(VertexBuffer.UV5Kind, this.uvs5, updatable); + if (isAsync) { + yield; } - return buffer2; } - case 1: { - const buffer2 = sizeOrDstBuffer instanceof ArrayBuffer ? new Float32Array(sizeOrDstBuffer) : new Float32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer); - if (copyBuffer) { - buffer2.set(new Float32Array(copyBuffer)); + if (this.uvs6) { + meshOrGeometry.setVerticesData(VertexBuffer.UV6Kind, this.uvs6, updatable); + if (isAsync) { + yield; } - return buffer2; } - } - const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint8Array(sizeOrDstBuffer) : new Uint8Array(sizeOrDstBuffer); - if (copyBuffer) { - buffer.set(new Uint8Array(copyBuffer)); - } - return buffer; -} -ThinEngine.prototype._readTexturePixelsSync = function(texture, width, height, faceIndex = -1, level = 0, buffer = null, flushRenderer = true, noDataConversion = false, x = 0, y = 0) { - var _a, _b; - const gl = this._gl; - if (!gl) { - throw new Error("Engine does not have gl rendering context."); - } - if (!this._dummyFramebuffer) { - const dummy = gl.createFramebuffer(); - if (!dummy) { - throw new Error("Unable to create dummy framebuffer"); + if (this.colors) { + meshOrGeometry.setVerticesData(VertexBuffer.ColorKind, this.colors, updatable); + if (this.hasVertexAlpha && meshOrGeometry.hasVertexAlpha !== void 0) { + meshOrGeometry.hasVertexAlpha = true; + } + if (isAsync) { + yield; + } } - this._dummyFramebuffer = dummy; - } - gl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFramebuffer); - if (faceIndex > -1) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, (_a = texture._hardwareTexture) == null ? void 0 : _a.underlyingResource, level); - } else { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, (_b = texture._hardwareTexture) == null ? void 0 : _b.underlyingResource, level); - } - let readType = texture.type !== void 0 ? this._getWebGLTextureType(texture.type) : gl.UNSIGNED_BYTE; - if (!noDataConversion) { - switch (readType) { - case gl.UNSIGNED_BYTE: - if (!buffer) { - buffer = new Uint8Array(4 * width * height); - } - readType = gl.UNSIGNED_BYTE; - break; - default: - if (!buffer) { - buffer = new Float32Array(4 * width * height); - } - readType = gl.FLOAT; - break; + if (this.matricesIndices) { + meshOrGeometry.setVerticesData(VertexBuffer.MatricesIndicesKind, this.matricesIndices, updatable); + if (isAsync) { + yield; + } } - } else if (!buffer) { - buffer = allocateAndCopyTypedBuffer(texture.type, 4 * width * height); - } - if (flushRenderer) { - this.flushFramebuffer(); - } - gl.readPixels(x, y, width, height, gl.RGBA, readType, buffer); - gl.bindFramebuffer(gl.FRAMEBUFFER, this._currentFramebuffer); - return buffer; -}; -ThinEngine.prototype._readTexturePixels = function(texture, width, height, faceIndex = -1, level = 0, buffer = null, flushRenderer = true, noDataConversion = false, x = 0, y = 0) { - return Promise.resolve(this._readTexturePixelsSync(texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion, x, y)); -}; - -// node_modules/@babylonjs/core/Engines/Extensions/engine.alpha.js -ThinEngine.prototype.setAlphaConstants = function(r, g, b, a) { - this._alphaState.setAlphaBlendConstants(r, g, b, a); -}; -ThinEngine.prototype.setAlphaMode = function(mode, noDepthWriteChange = false) { - if (this._alphaMode === mode) { - if (!noDepthWriteChange) { - const depthMask = mode === 0; - if (this.depthCullingState.depthMask !== depthMask) { - this.depthCullingState.depthMask = depthMask; + if (this.matricesWeights) { + meshOrGeometry.setVerticesData(VertexBuffer.MatricesWeightsKind, this.matricesWeights, updatable); + if (isAsync) { + yield; } } - return; - } - switch (mode) { - case 0: - this._alphaState.alphaBlend = false; - break; - case 7: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE); - this._alphaState.alphaBlend = true; - break; - case 8: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA); - this._alphaState.alphaBlend = true; - break; - case 2: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE); - this._alphaState.alphaBlend = true; - break; - case 6: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ZERO, this._gl.ONE); - this._alphaState.alphaBlend = true; - break; - case 1: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ONE); - this._alphaState.alphaBlend = true; - break; - case 3: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.ZERO, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE); - this._alphaState.alphaBlend = true; - break; - case 4: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_COLOR, this._gl.ZERO, this._gl.ONE, this._gl.ONE); - this._alphaState.alphaBlend = true; - break; - case 5: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE); - this._alphaState.alphaBlend = true; - break; - case 9: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.CONSTANT_COLOR, this._gl.ONE_MINUS_CONSTANT_COLOR, this._gl.CONSTANT_ALPHA, this._gl.ONE_MINUS_CONSTANT_ALPHA); - this._alphaState.alphaBlend = true; - break; - case 10: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA); - this._alphaState.alphaBlend = true; - break; - case 11: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ONE); - this._alphaState.alphaBlend = true; - break; - case 12: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ZERO); - this._alphaState.alphaBlend = true; - break; - case 13: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE_MINUS_DST_COLOR, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE_MINUS_DST_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA); - this._alphaState.alphaBlend = true; - break; - case 14: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA); - this._alphaState.alphaBlend = true; - break; - case 15: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ZERO); - this._alphaState.alphaBlend = true; - break; - case 16: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE_MINUS_DST_COLOR, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ZERO, this._gl.ONE); - this._alphaState.alphaBlend = true; - break; - case 17: - this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA); - this._alphaState.alphaBlend = true; - break; - } - if (!noDepthWriteChange) { - this.depthCullingState.depthMask = mode === 0; - } - this._alphaMode = mode; -}; -ThinEngine.prototype.getAlphaMode = function() { - return this._alphaMode; -}; -ThinEngine.prototype.setAlphaEquation = function(equation) { - if (this._alphaEquation === equation) { - return; - } - switch (equation) { - case 0: - this._alphaState.setAlphaEquationParameters(32774, 32774); - break; - case 1: - this._alphaState.setAlphaEquationParameters(32778, 32778); - break; - case 2: - this._alphaState.setAlphaEquationParameters(32779, 32779); - break; - case 3: - this._alphaState.setAlphaEquationParameters(32776, 32776); - break; - case 4: - this._alphaState.setAlphaEquationParameters(32775, 32775); - break; - case 5: - this._alphaState.setAlphaEquationParameters(32775, 32774); - break; - } - this._alphaEquation = equation; -}; -ThinEngine.prototype.getAlphaEquation = function() { - return this._alphaEquation; -}; - -// node_modules/@babylonjs/core/Engines/Extensions/engine.dynamicBuffer.js -ThinEngine.prototype.updateDynamicIndexBuffer = function(indexBuffer, indices, offset = 0) { - this._currentBoundBuffer[this._gl.ELEMENT_ARRAY_BUFFER] = null; - this.bindIndexBuffer(indexBuffer); - let view; - if (indexBuffer.is32Bits) { - view = indices instanceof Uint32Array ? indices : new Uint32Array(indices); - } else { - view = indices instanceof Uint16Array ? indices : new Uint16Array(indices); - } - this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, view, this._gl.DYNAMIC_DRAW); - this._resetIndexBufferBinding(); -}; -ThinEngine.prototype.updateDynamicVertexBuffer = function(vertexBuffer, data, byteOffset, byteLength) { - this.bindArrayBuffer(vertexBuffer); - if (byteOffset === void 0) { - byteOffset = 0; - } - const dataLength = data.byteLength || data.length; - if (byteLength === void 0 || byteLength >= dataLength && byteOffset === 0) { - if (data instanceof Array) { - this._gl.bufferSubData(this._gl.ARRAY_BUFFER, byteOffset, new Float32Array(data)); - } else { - this._gl.bufferSubData(this._gl.ARRAY_BUFFER, byteOffset, data); + if (this.matricesIndicesExtra) { + meshOrGeometry.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra, updatable); + if (isAsync) { + yield; + } } - } else { - if (data instanceof Array) { - this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, new Float32Array(data).subarray(byteOffset, byteOffset + byteLength)); + if (this.matricesWeightsExtra) { + meshOrGeometry.setVerticesData(VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra, updatable); + if (isAsync) { + yield; + } + } + if (this.indices) { + meshOrGeometry.setIndices(this.indices, null, updatable); + if (isAsync) { + yield; + } } else { - if (data instanceof ArrayBuffer) { - data = new Uint8Array(data, byteOffset, byteLength); - } else { - data = new Uint8Array(data.buffer, data.byteOffset + byteOffset, byteLength); + meshOrGeometry.setIndices([], null); + } + if (meshOrGeometry.subMeshes && this.materialInfos && this.materialInfos.length > 1) { + const mesh = meshOrGeometry; + mesh.subMeshes = []; + for (const matInfo of this.materialInfos) { + new SubMesh(matInfo.materialIndex, matInfo.verticesStart, matInfo.verticesCount, matInfo.indexStart, matInfo.indexCount, mesh); } - this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data); } + return this; } - this._resetVertexBufferBinding(); -}; - -// node_modules/@babylonjs/core/Engines/engine.js -var Engine = class _Engine extends ThinEngine { - /** - * Returns the current npm package of the sdk - */ - // Not mixed with Version for tooling purpose. - static get NpmPackage() { - return ThinEngine.NpmPackage; - } - /** - * Returns the current version of the framework - */ - static get Version() { - return ThinEngine.Version; + _update(meshOrGeometry, updateExtends, makeItUnique) { + if (this.positions) { + meshOrGeometry.updateVerticesData(VertexBuffer.PositionKind, this.positions, updateExtends, makeItUnique); + } + if (this.normals) { + meshOrGeometry.updateVerticesData(VertexBuffer.NormalKind, this.normals, updateExtends, makeItUnique); + } + if (this.tangents) { + meshOrGeometry.updateVerticesData(VertexBuffer.TangentKind, this.tangents, updateExtends, makeItUnique); + } + if (this.uvs) { + meshOrGeometry.updateVerticesData(VertexBuffer.UVKind, this.uvs, updateExtends, makeItUnique); + } + if (this.uvs2) { + meshOrGeometry.updateVerticesData(VertexBuffer.UV2Kind, this.uvs2, updateExtends, makeItUnique); + } + if (this.uvs3) { + meshOrGeometry.updateVerticesData(VertexBuffer.UV3Kind, this.uvs3, updateExtends, makeItUnique); + } + if (this.uvs4) { + meshOrGeometry.updateVerticesData(VertexBuffer.UV4Kind, this.uvs4, updateExtends, makeItUnique); + } + if (this.uvs5) { + meshOrGeometry.updateVerticesData(VertexBuffer.UV5Kind, this.uvs5, updateExtends, makeItUnique); + } + if (this.uvs6) { + meshOrGeometry.updateVerticesData(VertexBuffer.UV6Kind, this.uvs6, updateExtends, makeItUnique); + } + if (this.colors) { + meshOrGeometry.updateVerticesData(VertexBuffer.ColorKind, this.colors, updateExtends, makeItUnique); + } + if (this.matricesIndices) { + meshOrGeometry.updateVerticesData(VertexBuffer.MatricesIndicesKind, this.matricesIndices, updateExtends, makeItUnique); + } + if (this.matricesWeights) { + meshOrGeometry.updateVerticesData(VertexBuffer.MatricesWeightsKind, this.matricesWeights, updateExtends, makeItUnique); + } + if (this.matricesIndicesExtra) { + meshOrGeometry.updateVerticesData(VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra, updateExtends, makeItUnique); + } + if (this.matricesWeightsExtra) { + meshOrGeometry.updateVerticesData(VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra, updateExtends, makeItUnique); + } + if (this.indices) { + meshOrGeometry.setIndices(this.indices, null); + } + return this; } - /** Gets the list of created engines */ - static get Instances() { - return EngineStore.Instances; + static _TransformVector3Coordinates(coordinates, transformation, offset = 0, length = coordinates.length) { + const coordinate = TmpVectors.Vector3[0]; + const transformedCoordinate = TmpVectors.Vector3[1]; + for (let index = offset; index < offset + length; index += 3) { + Vector3.FromArrayToRef(coordinates, index, coordinate); + Vector3.TransformCoordinatesToRef(coordinate, transformation, transformedCoordinate); + coordinates[index] = transformedCoordinate.x; + coordinates[index + 1] = transformedCoordinate.y; + coordinates[index + 2] = transformedCoordinate.z; + } } - /** - * Gets the latest created engine - */ - static get LastCreatedEngine() { - return EngineStore.LastCreatedEngine; + static _TransformVector3Normals(normals, transformation, offset = 0, length = normals.length) { + const normal = TmpVectors.Vector3[0]; + const transformedNormal = TmpVectors.Vector3[1]; + for (let index = offset; index < offset + length; index += 3) { + Vector3.FromArrayToRef(normals, index, normal); + Vector3.TransformNormalToRef(normal, transformation, transformedNormal); + normals[index] = transformedNormal.x; + normals[index + 1] = transformedNormal.y; + normals[index + 2] = transformedNormal.z; + } } - /** - * Gets the latest created scene - */ - static get LastCreatedScene() { - return EngineStore.LastCreatedScene; + static _TransformVector4Normals(normals, transformation, offset = 0, length = normals.length) { + const normal = TmpVectors.Vector4[0]; + const transformedNormal = TmpVectors.Vector4[1]; + for (let index = offset; index < offset + length; index += 4) { + Vector4.FromArrayToRef(normals, index, normal); + Vector4.TransformNormalToRef(normal, transformation, transformedNormal); + normals[index] = transformedNormal.x; + normals[index + 1] = transformedNormal.y; + normals[index + 2] = transformedNormal.z; + normals[index + 3] = transformedNormal.w; + } } - /** @internal */ - /** - * Engine abstraction for loading and creating an image bitmap from a given source string. - * @param imageSource source to load the image from. - * @param options An object that sets options for the image's extraction. - * @returns ImageBitmap. - */ - _createImageBitmapFromSource(imageSource, options) { - const promise = new Promise((resolve, reject) => { - const image = new Image(); - image.onload = () => { - image.decode().then(() => { - this.createImageBitmap(image, options).then((imageBitmap) => { - resolve(imageBitmap); - }); - }); - }; - image.onerror = () => { - reject(`Error loading image ${image.src}`); - }; - image.src = imageSource; - }); - return promise; + static _FlipFaces(indices, offset = 0, length = indices.length) { + for (let index = offset; index < offset + length; index += 3) { + const tmp = indices[index + 1]; + indices[index + 1] = indices[index + 2]; + indices[index + 2] = tmp; + } } /** - * Engine abstraction for createImageBitmap - * @param image source for image - * @param options An object that sets options for the image's extraction. - * @returns ImageBitmap + * Transforms each position and each normal of the vertexData according to the passed Matrix + * @param matrix the transforming matrix + * @returns the VertexData */ - createImageBitmap(image, options) { - return createImageBitmap(image, options); + transform(matrix) { + const flip = matrix.determinant() < 0; + if (this.positions) { + _VertexData._TransformVector3Coordinates(this.positions, matrix); + } + if (this.normals) { + _VertexData._TransformVector3Normals(this.normals, matrix); + } + if (this.tangents) { + _VertexData._TransformVector4Normals(this.tangents, matrix); + } + if (flip && this.indices) { + _VertexData._FlipFaces(this.indices); + } + return this; } /** - * Resize an image and returns the image data as an uint8array - * @param image image to resize - * @param bufferWidth destination buffer width - * @param bufferHeight destination buffer height - * @returns an uint8array containing RGBA values of bufferWidth * bufferHeight size + * Generates an array of vertex data where each vertex data only has one material info + * @returns An array of VertexData */ - resizeImageBitmap(image, bufferWidth, bufferHeight) { - const canvas = this.createCanvas(bufferWidth, bufferHeight); - const context = canvas.getContext("2d"); - if (!context) { - throw new Error("Unable to get 2d context for resizeImageBitmap"); + splitBasedOnMaterialID() { + if (!this.materialInfos || this.materialInfos.length < 2) { + return [this]; } - context.drawImage(image, 0, 0); - const buffer = context.getImageData(0, 0, bufferWidth, bufferHeight).data; - return buffer; - } - /** - * Will flag all materials in all scenes in all engines as dirty to trigger new shader compilation - * @param flag defines which part of the materials must be marked as dirty - * @param predicate defines a predicate used to filter which materials should be affected - */ - static MarkAllMaterialsAsDirty(flag, predicate) { - for (let engineIndex = 0; engineIndex < _Engine.Instances.length; engineIndex++) { - const engine = _Engine.Instances[engineIndex]; - for (let sceneIndex = 0; sceneIndex < engine.scenes.length; sceneIndex++) { - engine.scenes[sceneIndex].markAllMaterialsAsDirty(flag, predicate); + const result = []; + for (const materialInfo of this.materialInfos) { + const vertexData = new _VertexData(); + if (this.positions) { + vertexData.positions = this.positions.slice(materialInfo.verticesStart * 3, (materialInfo.verticesCount + materialInfo.verticesStart) * 3); + } + if (this.normals) { + vertexData.normals = this.normals.slice(materialInfo.verticesStart * 3, (materialInfo.verticesCount + materialInfo.verticesStart) * 3); + } + if (this.tangents) { + vertexData.tangents = this.tangents.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4); + } + if (this.colors) { + vertexData.colors = this.colors.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4); + } + if (this.uvs) { + vertexData.uvs = this.uvs.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2); + } + if (this.uvs2) { + vertexData.uvs2 = this.uvs2.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2); + } + if (this.uvs3) { + vertexData.uvs3 = this.uvs3.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2); + } + if (this.uvs4) { + vertexData.uvs4 = this.uvs4.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2); + } + if (this.uvs5) { + vertexData.uvs5 = this.uvs5.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2); + } + if (this.uvs6) { + vertexData.uvs6 = this.uvs6.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2); + } + if (this.matricesIndices) { + vertexData.matricesIndices = this.matricesIndices.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4); + } + if (this.matricesIndicesExtra) { + vertexData.matricesIndicesExtra = this.matricesIndicesExtra.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4); + } + if (this.matricesWeights) { + vertexData.matricesWeights = this.matricesWeights.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4); + } + if (this.matricesWeightsExtra) { + vertexData.matricesWeightsExtra = this.matricesWeightsExtra.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4); + } + if (this.indices) { + vertexData.indices = []; + for (let index = materialInfo.indexStart; index < materialInfo.indexStart + materialInfo.indexCount; index++) { + vertexData.indices.push(this.indices[index] - materialInfo.verticesStart); + } } + const newMaterialInfo = new VertexDataMaterialInfo(); + newMaterialInfo.indexStart = 0; + newMaterialInfo.indexCount = vertexData.indices ? vertexData.indices.length : 0; + newMaterialInfo.materialIndex = materialInfo.materialIndex; + newMaterialInfo.verticesStart = 0; + newMaterialInfo.verticesCount = (vertexData.positions ? vertexData.positions.length : 0) / 3; + vertexData.materialInfos = [newMaterialInfo]; + result.push(vertexData); } + return result; } - // eslint-disable-next-line jsdoc/require-returns-check - /** - * Method called to create the default loading screen. - * This can be overridden in your own app. - * @param canvas The rendering canvas element - * @returns The loading screen - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - static DefaultLoadingScreenFactory(canvas) { - throw _WarnImport("LoadingScreen"); - } - get _supportsHardwareTextureRescaling() { - return !!_Engine._RescalePostProcessFactory; - } - /** - * Gets the performance monitor attached to this engine - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation - */ - get performanceMonitor() { - return this._performanceMonitor; - } - /** - * (WebGPU only) True (default) to be in compatibility mode, meaning rendering all existing scenes without artifacts (same rendering than WebGL). - * Setting the property to false will improve performances but may not work in some scenes if some precautions are not taken. - * See https://doc.babylonjs.com/setup/support/webGPU/webGPUOptimization/webGPUNonCompatibilityMode for more details - */ - get compatibilityMode() { - return this._compatibilityMode; - } - set compatibilityMode(mode) { - this._compatibilityMode = true; - } - // Events /** - * Gets the HTML element used to attach event listeners - * @returns a HTML element + * Merges the passed VertexData into the current one + * @param others the VertexData to be merged into the current one + * @param use32BitsIndices defines a boolean indicating if indices must be store in a 32 bits array + * @param forceCloneIndices defines a boolean indicating if indices are forced to be cloned + * @param mergeMaterialIds defines a boolean indicating if we need to merge the material infos + * @param enableCompletion defines a boolean indicating if the vertex data should be completed to be compatible + * @returns the modified VertexData */ - getInputElement() { - return this._renderingCanvas; + merge(others, use32BitsIndices = false, forceCloneIndices = false, mergeMaterialIds = false, enableCompletion = false) { + const vertexDatas = Array.isArray(others) ? others.map((other) => { + return { vertexData: other }; + }) : [{ vertexData: others }]; + return runCoroutineSync(this._mergeCoroutine(void 0, vertexDatas, use32BitsIndices, false, forceCloneIndices, mergeMaterialIds, enableCompletion)); } /** - * Creates a new engine - * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which already used the WebGL context - * @param antialias defines enable antialiasing (default: false) - * @param options defines further options to be sent to the getContext() function - * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false) + * @internal */ - constructor(canvasOrContext, antialias, options, adaptToDeviceRatio = false) { - super(canvasOrContext, antialias, options, adaptToDeviceRatio); - this.enableOfflineSupport = false; - this.disableManifestCheck = false; - this.disableContextMenu = true; - this.scenes = []; - this._virtualScenes = new Array(); - this.onNewSceneAddedObservable = new Observable(); - this.postProcesses = []; - this.isPointerLock = false; - this.onResizeObservable = new Observable(); - this.onCanvasBlurObservable = new Observable(); - this.onCanvasFocusObservable = new Observable(); - this.onCanvasPointerOutObservable = new Observable(); - this.onBeginFrameObservable = new Observable(); - this.customAnimationFrameRequester = null; - this.onEndFrameObservable = new Observable(); - this.onBeforeShaderCompilationObservable = new Observable(); - this.onAfterShaderCompilationObservable = new Observable(); - this._deterministicLockstep = false; - this._lockstepMaxSteps = 4; - this._timeStep = 1 / 60; - this._fps = 60; - this._deltaTime = 0; - this._drawCalls = new PerfCounter(); - this.canvasTabIndex = 1; - this.disablePerformanceMonitorInBackground = false; - this._performanceMonitor = new PerformanceMonitor(); - this._compatibilityMode = true; - this.currentRenderPassId = 0; - this._renderPassNames = ["main"]; - _Engine.Instances.push(this); - if (!canvasOrContext) { - return; + *_mergeCoroutine(transform, vertexDatas, use32BitsIndices = false, isAsync, forceCloneIndices, mergeMaterialIds = false, enableCompletion = false) { + var _a, _b; + this._validate(); + let others = vertexDatas.map((vertexData) => vertexData.vertexData); + let root = this; + if (enableCompletion) { + for (const other of others) { + if (!other) { + continue; + } + other._validate(); + if (!this.normals && other.normals) { + this.normals = new Float32Array(this.positions.length); + } + if (!this.tangents && other.tangents) { + this.tangents = new Float32Array(this.positions.length / 3 * 4); + } + if (!this.uvs && other.uvs) { + this.uvs = new Float32Array(this.positions.length / 3 * 2); + } + if (!this.uvs2 && other.uvs2) { + this.uvs2 = new Float32Array(this.positions.length / 3 * 2); + } + if (!this.uvs3 && other.uvs3) { + this.uvs3 = new Float32Array(this.positions.length / 3 * 2); + } + if (!this.uvs4 && other.uvs4) { + this.uvs4 = new Float32Array(this.positions.length / 3 * 2); + } + if (!this.uvs5 && other.uvs5) { + this.uvs5 = new Float32Array(this.positions.length / 3 * 2); + } + if (!this.uvs6 && other.uvs6) { + this.uvs6 = new Float32Array(this.positions.length / 3 * 2); + } + if (!this.colors && other.colors) { + this.colors = new Float32Array(this.positions.length / 3 * 4); + this.colors.fill(1); + } + if (!this.matricesIndices && other.matricesIndices) { + this.matricesIndices = new Float32Array(this.positions.length / 3 * 4); + } + if (!this.matricesWeights && other.matricesWeights) { + this.matricesWeights = new Float32Array(this.positions.length / 3 * 4); + } + if (!this.matricesIndicesExtra && other.matricesIndicesExtra) { + this.matricesIndicesExtra = new Float32Array(this.positions.length / 3 * 4); + } + if (!this.matricesWeightsExtra && other.matricesWeightsExtra) { + this.matricesWeightsExtra = new Float32Array(this.positions.length / 3 * 4); + } + } } - this._features.supportRenderPasses = true; - options = this._creationOptions; - if (canvasOrContext.getContext) { - const canvas = canvasOrContext; - this._sharedInit(canvas); + for (const other of others) { + if (!other) { + continue; + } + if (!enableCompletion) { + other._validate(); + if (!this.normals !== !other.normals || !this.tangents !== !other.tangents || !this.uvs !== !other.uvs || !this.uvs2 !== !other.uvs2 || !this.uvs3 !== !other.uvs3 || !this.uvs4 !== !other.uvs4 || !this.uvs5 !== !other.uvs5 || !this.uvs6 !== !other.uvs6 || !this.colors !== !other.colors || !this.matricesIndices !== !other.matricesIndices || !this.matricesWeights !== !other.matricesWeights || !this.matricesIndicesExtra !== !other.matricesIndicesExtra || !this.matricesWeightsExtra !== !other.matricesWeightsExtra) { + throw new Error("Cannot merge vertex data that do not have the same set of attributes"); + } + } else { + if (this.normals && !other.normals) { + other.normals = new Float32Array(other.positions.length); + } + if (this.tangents && !other.tangents) { + other.tangents = new Float32Array(other.positions.length / 3 * 4); + } + if (this.uvs && !other.uvs) { + other.uvs = new Float32Array(other.positions.length / 3 * 2); + } + if (this.uvs2 && !other.uvs2) { + other.uvs2 = new Float32Array(other.positions.length / 3 * 2); + } + if (this.uvs3 && !other.uvs3) { + other.uvs3 = new Float32Array(other.positions.length / 3 * 2); + } + if (this.uvs4 && !other.uvs4) { + other.uvs4 = new Float32Array(other.positions.length / 3 * 2); + } + if (this.uvs5 && !other.uvs5) { + other.uvs5 = new Float32Array(other.positions.length / 3 * 2); + } + if (this.uvs6 && !other.uvs6) { + other.uvs6 = new Float32Array(other.positions.length / 3 * 2); + } + if (this.colors && !other.colors) { + other.colors = new Float32Array(other.positions.length / 3 * 4); + other.colors.fill(1); + } + if (this.matricesIndices && !other.matricesIndices) { + other.matricesIndices = new Float32Array(other.positions.length / 3 * 4); + } + if (this.matricesWeights && !other.matricesWeights) { + other.matricesWeights = new Float32Array(other.positions.length / 3 * 4); + } + if (this.matricesIndicesExtra && !other.matricesIndicesExtra) { + other.matricesIndicesExtra = new Float32Array(other.positions.length / 3 * 4); + } + if (this.matricesWeightsExtra && !other.matricesWeightsExtra) { + other.matricesWeightsExtra = new Float32Array(other.positions.length / 3 * 4); + } + } } - } - _initGLContext() { - super._initGLContext(); - this._rescalePostProcess = null; - } - /** - * Shared initialization across engines types. - * @param canvas The canvas associated with this instance of the engine. - */ - _sharedInit(canvas) { - super._sharedInit(canvas); - this._onCanvasFocus = () => { - this.onCanvasFocusObservable.notifyObservers(this); - }; - this._onCanvasBlur = () => { - this.onCanvasBlurObservable.notifyObservers(this); - }; - this._onCanvasContextMenu = (evt) => { - if (this.disableContextMenu) { - evt.preventDefault(); + if (mergeMaterialIds) { + let materialIndex = 0; + let indexOffset = 0; + let vertexOffset = 0; + const materialInfos = []; + let currentMaterialInfo = null; + const vertexDataList = []; + for (const split of this.splitBasedOnMaterialID()) { + vertexDataList.push({ vertexData: split, transform }); } - }; - canvas.addEventListener("focus", this._onCanvasFocus); - canvas.addEventListener("blur", this._onCanvasBlur); - canvas.addEventListener("contextmenu", this._onCanvasContextMenu); - this._onBlur = () => { - if (this.disablePerformanceMonitorInBackground) { - this._performanceMonitor.disable(); + for (const data of vertexDatas) { + if (!data.vertexData) { + continue; + } + for (const split of data.vertexData.splitBasedOnMaterialID()) { + vertexDataList.push({ vertexData: split, transform: data.transform }); + } } - this._windowIsBackground = true; - }; - this._onFocus = () => { - if (this.disablePerformanceMonitorInBackground) { - this._performanceMonitor.enable(); + vertexDataList.sort((a, b) => { + const matInfoA = a.vertexData.materialInfos ? a.vertexData.materialInfos[0].materialIndex : 0; + const matInfoB = b.vertexData.materialInfos ? b.vertexData.materialInfos[0].materialIndex : 0; + if (matInfoA > matInfoB) { + return 1; + } + if (matInfoA === matInfoB) { + return 0; + } + return -1; + }); + for (const vertexDataSource of vertexDataList) { + const vertexData = vertexDataSource.vertexData; + if (vertexData.materialInfos) { + materialIndex = vertexData.materialInfos[0].materialIndex; + } else { + materialIndex = 0; + } + if (currentMaterialInfo && currentMaterialInfo.materialIndex === materialIndex) { + currentMaterialInfo.indexCount += vertexData.indices.length; + currentMaterialInfo.verticesCount += vertexData.positions.length / 3; + } else { + const materialInfo = new VertexDataMaterialInfo(); + materialInfo.materialIndex = materialIndex; + materialInfo.indexStart = indexOffset; + materialInfo.indexCount = vertexData.indices.length; + materialInfo.verticesStart = vertexOffset; + materialInfo.verticesCount = vertexData.positions.length / 3; + materialInfos.push(materialInfo); + currentMaterialInfo = materialInfo; + } + indexOffset += vertexData.indices.length; + vertexOffset += vertexData.positions.length / 3; } - this._windowIsBackground = false; - }; - this._onCanvasPointerOut = (ev) => { - if (document.elementFromPoint(ev.clientX, ev.clientY) !== canvas) { - this.onCanvasPointerOutObservable.notifyObservers(ev); + const first = vertexDataList.splice(0, 1)[0]; + root = first.vertexData; + transform = first.transform; + others = vertexDataList.map((v) => v.vertexData); + vertexDatas = vertexDataList; + this.materialInfos = materialInfos; + } + const totalIndices = others.reduce((indexSum, vertexData) => { + var _a2; + return indexSum + (((_a2 = vertexData.indices) == null ? void 0 : _a2.length) ?? 0); + }, ((_a = root.indices) == null ? void 0 : _a.length) ?? 0); + const sliceIndices = forceCloneIndices || others.some((vertexData) => vertexData.indices === root.indices); + let indices = sliceIndices ? (_b = root.indices) == null ? void 0 : _b.slice() : root.indices; + if (totalIndices > 0) { + let indicesOffset = (indices == null ? void 0 : indices.length) ?? 0; + if (!indices) { + indices = new Array(totalIndices); + } + if (indices.length !== totalIndices) { + if (Array.isArray(indices)) { + indices.length = totalIndices; + } else { + const temp = use32BitsIndices || indices instanceof Uint32Array ? new Uint32Array(totalIndices) : new Uint16Array(totalIndices); + temp.set(indices); + indices = temp; + } + if (transform && transform.determinant() < 0) { + _VertexData._FlipFaces(indices, 0, indicesOffset); + } + } + let positionsOffset = root.positions ? root.positions.length / 3 : 0; + for (const { vertexData: other, transform: transform2 } of vertexDatas) { + if (other.indices) { + for (let index = 0; index < other.indices.length; index++) { + indices[indicesOffset + index] = other.indices[index] + positionsOffset; + } + if (transform2 && transform2.determinant() < 0) { + _VertexData._FlipFaces(indices, indicesOffset, other.indices.length); + } + positionsOffset += other.positions.length / 3; + indicesOffset += other.indices.length; + if (isAsync) { + yield; + } + } } - }; - const hostWindow = this.getHostWindow(); - if (hostWindow && typeof hostWindow.addEventListener === "function") { - hostWindow.addEventListener("blur", this._onBlur); - hostWindow.addEventListener("focus", this._onFocus); } - canvas.addEventListener("pointerout", this._onCanvasPointerOut); - if (!this._creationOptions.doNotHandleTouchAction) { - this._disableTouchAction(); + this.indices = indices; + this.positions = _VertexData._MergeElement(VertexBuffer.PositionKind, root.positions, transform, vertexDatas.map((other) => [other.vertexData.positions, other.transform])); + if (isAsync) { + yield; } - if (!_Engine.audioEngine && this._creationOptions.audioEngine && _Engine.AudioEngineFactory) { - _Engine.audioEngine = _Engine.AudioEngineFactory(this.getRenderingCanvas(), this.getAudioContext(), this.getAudioDestination()); + if (root.normals) { + this.normals = _VertexData._MergeElement(VertexBuffer.NormalKind, root.normals, transform, vertexDatas.map((other) => [other.vertexData.normals, other.transform])); + if (isAsync) { + yield; + } } - if (IsDocumentAvailable()) { - this._onFullscreenChange = () => { - this.isFullscreen = !!document.fullscreenElement; - if (this.isFullscreen && this._pointerLockRequested && canvas) { - _Engine._RequestPointerlock(canvas); - } - }; - document.addEventListener("fullscreenchange", this._onFullscreenChange, false); - document.addEventListener("webkitfullscreenchange", this._onFullscreenChange, false); - this._onPointerLockChange = () => { - this.isPointerLock = document.pointerLockElement === canvas; - }; - document.addEventListener("pointerlockchange", this._onPointerLockChange, false); - document.addEventListener("webkitpointerlockchange", this._onPointerLockChange, false); + if (root.tangents) { + this.tangents = _VertexData._MergeElement(VertexBuffer.TangentKind, root.tangents, transform, vertexDatas.map((other) => [other.vertexData.tangents, other.transform])); + if (isAsync) { + yield; + } } - this.enableOfflineSupport = _Engine.OfflineProviderFactory !== void 0; - this._deterministicLockstep = !!this._creationOptions.deterministicLockstep; - this._lockstepMaxSteps = this._creationOptions.lockstepMaxSteps || 0; - this._timeStep = this._creationOptions.timeStep || 1 / 60; - } - /** @internal */ - _verifyPointerLock() { - var _a; - (_a = this._onPointerLockChange) == null ? void 0 : _a.call(this); - } - /** - * Gets current aspect ratio - * @param viewportOwner defines the camera to use to get the aspect ratio - * @param useScreen defines if screen size must be used (or the current render target if any) - * @returns a number defining the aspect ratio - */ - getAspectRatio(viewportOwner, useScreen = false) { - const viewport = viewportOwner.viewport; - return this.getRenderWidth(useScreen) * viewport.width / (this.getRenderHeight(useScreen) * viewport.height); - } - /** - * Gets current screen aspect ratio - * @returns a number defining the aspect ratio - */ - getScreenAspectRatio() { - return this.getRenderWidth(true) / this.getRenderHeight(true); - } - /** - * Gets the client rect of the HTML canvas attached with the current webGL context - * @returns a client rectangle - */ - getRenderingCanvasClientRect() { - if (!this._renderingCanvas) { - return null; + if (root.uvs) { + this.uvs = _VertexData._MergeElement(VertexBuffer.UVKind, root.uvs, transform, vertexDatas.map((other) => [other.vertexData.uvs, other.transform])); + if (isAsync) { + yield; + } } - return this._renderingCanvas.getBoundingClientRect(); - } - /** - * Gets the client rect of the HTML element used for events - * @returns a client rectangle - */ - getInputElementClientRect() { - if (!this._renderingCanvas) { - return null; + if (root.uvs2) { + this.uvs2 = _VertexData._MergeElement(VertexBuffer.UV2Kind, root.uvs2, transform, vertexDatas.map((other) => [other.vertexData.uvs2, other.transform])); + if (isAsync) { + yield; + } + } + if (root.uvs3) { + this.uvs3 = _VertexData._MergeElement(VertexBuffer.UV3Kind, root.uvs3, transform, vertexDatas.map((other) => [other.vertexData.uvs3, other.transform])); + if (isAsync) { + yield; + } + } + if (root.uvs4) { + this.uvs4 = _VertexData._MergeElement(VertexBuffer.UV4Kind, root.uvs4, transform, vertexDatas.map((other) => [other.vertexData.uvs4, other.transform])); + if (isAsync) { + yield; + } + } + if (root.uvs5) { + this.uvs5 = _VertexData._MergeElement(VertexBuffer.UV5Kind, root.uvs5, transform, vertexDatas.map((other) => [other.vertexData.uvs5, other.transform])); + if (isAsync) { + yield; + } + } + if (root.uvs6) { + this.uvs6 = _VertexData._MergeElement(VertexBuffer.UV6Kind, root.uvs6, transform, vertexDatas.map((other) => [other.vertexData.uvs6, other.transform])); + if (isAsync) { + yield; + } + } + if (root.colors) { + this.colors = _VertexData._MergeElement(VertexBuffer.ColorKind, root.colors, transform, vertexDatas.map((other) => [other.vertexData.colors, other.transform])); + if (root.hasVertexAlpha !== void 0 || vertexDatas.some((other) => other.vertexData.hasVertexAlpha !== void 0)) { + this.hasVertexAlpha = root.hasVertexAlpha || vertexDatas.some((other) => other.vertexData.hasVertexAlpha); + } + if (isAsync) { + yield; + } + } + if (root.matricesIndices) { + this.matricesIndices = _VertexData._MergeElement(VertexBuffer.MatricesIndicesKind, root.matricesIndices, transform, vertexDatas.map((other) => [other.vertexData.matricesIndices, other.transform])); + if (isAsync) { + yield; + } + } + if (root.matricesWeights) { + this.matricesWeights = _VertexData._MergeElement(VertexBuffer.MatricesWeightsKind, root.matricesWeights, transform, vertexDatas.map((other) => [other.vertexData.matricesWeights, other.transform])); + if (isAsync) { + yield; + } + } + if (root.matricesIndicesExtra) { + this.matricesIndicesExtra = _VertexData._MergeElement(VertexBuffer.MatricesIndicesExtraKind, root.matricesIndicesExtra, transform, vertexDatas.map((other) => [other.vertexData.matricesIndicesExtra, other.transform])); + if (isAsync) { + yield; + } + } + if (root.matricesWeightsExtra) { + this.matricesWeightsExtra = _VertexData._MergeElement(VertexBuffer.MatricesWeightsExtraKind, root.matricesWeightsExtra, transform, vertexDatas.map((other) => [other.vertexData.matricesWeightsExtra, other.transform])); + } + return this; + } + static _MergeElement(kind, source, transform, others) { + const nonNullOthers = others.filter((other) => other[0] !== null && other[0] !== void 0); + if (!source && nonNullOthers.length == 0) { + return source; + } + if (!source) { + return this._MergeElement(kind, nonNullOthers[0][0], nonNullOthers[0][1], nonNullOthers.slice(1)); + } + const len = nonNullOthers.reduce((sumLen, elements) => sumLen + elements[0].length, source.length); + const transformRange = kind === VertexBuffer.PositionKind ? _VertexData._TransformVector3Coordinates : kind === VertexBuffer.NormalKind ? _VertexData._TransformVector3Normals : kind === VertexBuffer.TangentKind ? _VertexData._TransformVector4Normals : () => { + }; + if (source instanceof Float32Array) { + const ret32 = new Float32Array(len); + ret32.set(source); + transform && transformRange(ret32, transform, 0, source.length); + let offset = source.length; + for (const [vertexData, transform2] of nonNullOthers) { + ret32.set(vertexData, offset); + transform2 && transformRange(ret32, transform2, offset, vertexData.length); + offset += vertexData.length; + } + return ret32; + } else { + const ret = new Array(len); + for (let i = 0; i < source.length; i++) { + ret[i] = source[i]; + } + transform && transformRange(ret, transform, 0, source.length); + let offset = source.length; + for (const [vertexData, transform2] of nonNullOthers) { + for (let i = 0; i < vertexData.length; i++) { + ret[offset + i] = vertexData[i]; + } + transform2 && transformRange(ret, transform2, offset, vertexData.length); + offset += vertexData.length; + } + return ret; + } + } + _validate() { + if (!this.positions) { + throw new RuntimeError("Positions are required", ErrorCodes.MeshInvalidPositionsError); + } + const getElementCount = (kind, values) => { + const stride = VertexBuffer.DeduceStride(kind); + if (values.length % stride !== 0) { + throw new Error("The " + kind + "s array count must be a multiple of " + stride); + } + return values.length / stride; + }; + const positionsElementCount = getElementCount(VertexBuffer.PositionKind, this.positions); + const validateElementCount = (kind, values) => { + const elementCount = getElementCount(kind, values); + if (elementCount !== positionsElementCount) { + throw new Error("The " + kind + "s element count (" + elementCount + ") does not match the positions count (" + positionsElementCount + ")"); + } + }; + if (this.normals) { + validateElementCount(VertexBuffer.NormalKind, this.normals); + } + if (this.tangents) { + validateElementCount(VertexBuffer.TangentKind, this.tangents); + } + if (this.uvs) { + validateElementCount(VertexBuffer.UVKind, this.uvs); + } + if (this.uvs2) { + validateElementCount(VertexBuffer.UV2Kind, this.uvs2); + } + if (this.uvs3) { + validateElementCount(VertexBuffer.UV3Kind, this.uvs3); + } + if (this.uvs4) { + validateElementCount(VertexBuffer.UV4Kind, this.uvs4); + } + if (this.uvs5) { + validateElementCount(VertexBuffer.UV5Kind, this.uvs5); + } + if (this.uvs6) { + validateElementCount(VertexBuffer.UV6Kind, this.uvs6); + } + if (this.colors) { + validateElementCount(VertexBuffer.ColorKind, this.colors); + } + if (this.matricesIndices) { + validateElementCount(VertexBuffer.MatricesIndicesKind, this.matricesIndices); + } + if (this.matricesWeights) { + validateElementCount(VertexBuffer.MatricesWeightsKind, this.matricesWeights); + } + if (this.matricesIndicesExtra) { + validateElementCount(VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra); + } + if (this.matricesWeightsExtra) { + validateElementCount(VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra); } - return this.getInputElement().getBoundingClientRect(); - } - /** - * Gets a boolean indicating that the engine is running in deterministic lock step mode - * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep - * @returns true if engine is in deterministic lock step mode - */ - isDeterministicLockStep() { - return this._deterministicLockstep; - } - /** - * Gets the max steps when engine is running in deterministic lock step - * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep - * @returns the max steps - */ - getLockstepMaxSteps() { - return this._lockstepMaxSteps; } /** - * Returns the time in ms between steps when using deterministic lock step. - * @returns time step in (ms) + * Clone the current vertex data + * @returns a copy of the current data */ - getTimeStep() { - return this._timeStep * 1e3; + clone() { + const serializationObject = this.serialize(); + return _VertexData.Parse(serializationObject); } /** - * Force the mipmap generation for the given render target texture - * @param texture defines the render target texture to use - * @param unbind defines whether or not to unbind the texture after generation. Defaults to true. + * Serializes the VertexData + * @returns a serialized object */ - generateMipMapsForCubemap(texture, unbind = true) { - if (texture.generateMipMaps) { - const gl = this._gl; - this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, texture, true); - gl.generateMipmap(gl.TEXTURE_CUBE_MAP); - if (unbind) { - this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, null); + serialize() { + const serializationObject = {}; + if (this.positions) { + serializationObject.positions = Array.from(this.positions); + } + if (this.normals) { + serializationObject.normals = Array.from(this.normals); + } + if (this.tangents) { + serializationObject.tangents = Array.from(this.tangents); + } + if (this.uvs) { + serializationObject.uvs = Array.from(this.uvs); + } + if (this.uvs2) { + serializationObject.uvs2 = Array.from(this.uvs2); + } + if (this.uvs3) { + serializationObject.uvs3 = Array.from(this.uvs3); + } + if (this.uvs4) { + serializationObject.uvs4 = Array.from(this.uvs4); + } + if (this.uvs5) { + serializationObject.uvs5 = Array.from(this.uvs5); + } + if (this.uvs6) { + serializationObject.uvs6 = Array.from(this.uvs6); + } + if (this.colors) { + serializationObject.colors = Array.from(this.colors); + serializationObject.hasVertexAlpha = this.hasVertexAlpha; + } + if (this.matricesIndices) { + serializationObject.matricesIndices = Array.from(this.matricesIndices); + serializationObject.matricesIndices._isExpanded = true; + } + if (this.matricesWeights) { + serializationObject.matricesWeights = Array.from(this.matricesWeights); + } + if (this.matricesIndicesExtra) { + serializationObject.matricesIndicesExtra = Array.from(this.matricesIndicesExtra); + serializationObject.matricesIndicesExtra._isExpanded = true; + } + if (this.matricesWeightsExtra) { + serializationObject.matricesWeightsExtra = Array.from(this.matricesWeightsExtra); + } + serializationObject.indices = Array.from(this.indices); + if (this.materialInfos) { + serializationObject.materialInfos = []; + for (const materialInfo of this.materialInfos) { + const materialInfoSerializationObject = { + indexStart: materialInfo.indexStart, + indexCount: materialInfo.indexCount, + materialIndex: materialInfo.materialIndex, + verticesStart: materialInfo.verticesStart, + verticesCount: materialInfo.verticesCount + }; + serializationObject.materialInfos.push(materialInfoSerializationObject); } } + return serializationObject; } - /** States */ + // Statics /** - * Gets a boolean indicating if depth writing is enabled - * @returns the current depth writing state + * Extracts the vertexData from a mesh + * @param mesh the mesh from which to extract the VertexData + * @param copyWhenShared defines if the VertexData must be cloned when shared between multiple meshes, optional, default false + * @param forceCopy indicating that the VertexData must be cloned, optional, default false + * @returns the object VertexData associated to the passed mesh */ - getDepthWrite() { - return this._depthCullingState.depthMask; + static ExtractFromMesh(mesh, copyWhenShared, forceCopy) { + return _VertexData._ExtractFrom(mesh, copyWhenShared, forceCopy); } /** - * Enable or disable depth writing - * @param enable defines the state to set + * Extracts the vertexData from the geometry + * @param geometry the geometry from which to extract the VertexData + * @param copyWhenShared defines if the VertexData must be cloned when the geometry is shared between multiple meshes, optional, default false + * @param forceCopy indicating that the VertexData must be cloned, optional, default false + * @returns the object VertexData associated to the passed mesh */ - setDepthWrite(enable) { - this._depthCullingState.depthMask = enable; + static ExtractFromGeometry(geometry, copyWhenShared, forceCopy) { + return _VertexData._ExtractFrom(geometry, copyWhenShared, forceCopy); } - /** - * Gets a boolean indicating if stencil buffer is enabled - * @returns the current stencil buffer state - */ - getStencilBuffer() { - return this._stencilState.stencilTest; + static _ExtractFrom(meshOrGeometry, copyWhenShared, forceCopy) { + const result = new _VertexData(); + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.PositionKind)) { + result.positions = meshOrGeometry.getVerticesData(VertexBuffer.PositionKind, copyWhenShared, forceCopy); + } + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.NormalKind)) { + result.normals = meshOrGeometry.getVerticesData(VertexBuffer.NormalKind, copyWhenShared, forceCopy); + } + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.TangentKind)) { + result.tangents = meshOrGeometry.getVerticesData(VertexBuffer.TangentKind, copyWhenShared, forceCopy); + } + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UVKind)) { + result.uvs = meshOrGeometry.getVerticesData(VertexBuffer.UVKind, copyWhenShared, forceCopy); + } + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV2Kind)) { + result.uvs2 = meshOrGeometry.getVerticesData(VertexBuffer.UV2Kind, copyWhenShared, forceCopy); + } + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV3Kind)) { + result.uvs3 = meshOrGeometry.getVerticesData(VertexBuffer.UV3Kind, copyWhenShared, forceCopy); + } + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV4Kind)) { + result.uvs4 = meshOrGeometry.getVerticesData(VertexBuffer.UV4Kind, copyWhenShared, forceCopy); + } + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV5Kind)) { + result.uvs5 = meshOrGeometry.getVerticesData(VertexBuffer.UV5Kind, copyWhenShared, forceCopy); + } + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV6Kind)) { + result.uvs6 = meshOrGeometry.getVerticesData(VertexBuffer.UV6Kind, copyWhenShared, forceCopy); + } + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.ColorKind)) { + result.colors = meshOrGeometry.getVerticesData(VertexBuffer.ColorKind, copyWhenShared, forceCopy); + } + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind)) { + result.matricesIndices = meshOrGeometry.getVerticesData(VertexBuffer.MatricesIndicesKind, copyWhenShared, forceCopy); + } + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) { + result.matricesWeights = meshOrGeometry.getVerticesData(VertexBuffer.MatricesWeightsKind, copyWhenShared, forceCopy); + } + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesIndicesExtraKind)) { + result.matricesIndicesExtra = meshOrGeometry.getVerticesData(VertexBuffer.MatricesIndicesExtraKind, copyWhenShared, forceCopy); + } + if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesWeightsExtraKind)) { + result.matricesWeightsExtra = meshOrGeometry.getVerticesData(VertexBuffer.MatricesWeightsExtraKind, copyWhenShared, forceCopy); + } + result.indices = meshOrGeometry.getIndices(copyWhenShared, forceCopy); + return result; } /** - * Enable or disable the stencil buffer - * @param enable defines if the stencil buffer must be enabled or disabled + * Creates the VertexData for a Ribbon + * @param options an object used to set the following optional parameters for the ribbon, required but can be empty + * * pathArray array of paths, each of which an array of successive Vector3 + * * closeArray creates a seam between the first and the last paths of the pathArray, optional, default false + * * closePath creates a seam between the first and the last points of each path of the path array, optional, default false + * * offset a positive integer, only used when pathArray contains a single path (offset = 10 means the point 1 is joined to the point 11), default rounded half size of the pathArray length + * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) + * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) + * * invertUV swaps in the U and V coordinates when applying a texture, optional, default false + * * uvs a linear array, of length 2 * number of vertices, of custom UV values, optional + * * colors a linear array, of length 4 * number of vertices, of custom color values, optional + * @returns the VertexData of the ribbon + * @deprecated use CreateRibbonVertexData instead */ - setStencilBuffer(enable) { - this._stencilState.stencilTest = enable; + static CreateRibbon(options) { + throw _WarnImport("ribbonBuilder"); } /** - * Gets the current stencil mask - * @returns a number defining the new stencil mask to use + * Creates the VertexData for a box + * @param options an object used to set the following optional parameters for the box, required but can be empty + * * size sets the width, height and depth of the box to the value of size, optional default 1 + * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size + * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size + * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size + * * faceUV an array of 6 Vector4 elements used to set different images to each box side + * * faceColors an array of 6 Color3 elements used to set different colors to each box side + * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) + * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) + * @returns the VertexData of the box + * @deprecated Please use CreateBoxVertexData from the BoxBuilder file instead */ - getStencilMask() { - return this._stencilState.stencilMask; + static CreateBox(options) { + throw _WarnImport("boxBuilder"); } /** - * Sets the current stencil mask - * @param mask defines the new stencil mask to use + * Creates the VertexData for a tiled box + * @param options an object used to set the following optional parameters for the box, required but can be empty + * * faceTiles sets the pattern, tile size and number of tiles for a face + * * faceUV an array of 6 Vector4 elements used to set different images to each box side + * * faceColors an array of 6 Color3 elements used to set different colors to each box side + * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * @param options.pattern + * @param options.width + * @param options.height + * @param options.depth + * @param options.tileSize + * @param options.tileWidth + * @param options.tileHeight + * @param options.alignHorizontal + * @param options.alignVertical + * @param options.faceUV + * @param options.faceColors + * @param options.sideOrientation + * @returns the VertexData of the box + * @deprecated Please use CreateTiledBoxVertexData instead */ - setStencilMask(mask) { - this._stencilState.stencilMask = mask; + static CreateTiledBox(options) { + throw _WarnImport("tiledBoxBuilder"); } /** - * Gets the current stencil function - * @returns a number defining the stencil function to use + * Creates the VertexData for a tiled plane + * @param options an object used to set the following optional parameters for the box, required but can be empty + * * pattern a limited pattern arrangement depending on the number + * * tileSize sets the width, height and depth of the tile to the value of size, optional default 1 + * * tileWidth sets the width (x direction) of the tile, overwrites the width set by size, optional, default size + * * tileHeight sets the height (y direction) of the tile, overwrites the height set by size, optional, default size + * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) + * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) + * @returns the VertexData of the tiled plane + * @deprecated use CreateTiledPlaneVertexData instead */ - getStencilFunction() { - return this._stencilState.stencilFunc; + static CreateTiledPlane(options) { + throw _WarnImport("tiledPlaneBuilder"); } /** - * Gets the current stencil reference value - * @returns a number defining the stencil reference value to use + * Creates the VertexData for an ellipsoid, defaults to a sphere + * @param options an object used to set the following optional parameters for the box, required but can be empty + * * segments sets the number of horizontal strips optional, default 32 + * * diameter sets the axes dimensions, diameterX, diameterY and diameterZ to the value of diameter, optional default 1 + * * diameterX sets the diameterX (x direction) of the ellipsoid, overwrites the diameterX set by diameter, optional, default diameter + * * diameterY sets the diameterY (y direction) of the ellipsoid, overwrites the diameterY set by diameter, optional, default diameter + * * diameterZ sets the diameterZ (z direction) of the ellipsoid, overwrites the diameterZ set by diameter, optional, default diameter + * * arc a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the circumference (latitude) given by the arc value, optional, default 1 + * * slice a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the height (latitude) given by the arc value, optional, default 1 + * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) + * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) + * @returns the VertexData of the ellipsoid + * @deprecated use CreateSphereVertexData instead */ - getStencilFunctionReference() { - return this._stencilState.stencilFuncRef; + static CreateSphere(options) { + throw _WarnImport("sphereBuilder"); } /** - * Gets the current stencil mask - * @returns a number defining the stencil mask to use + * Creates the VertexData for a cylinder, cone or prism + * @param options an object used to set the following optional parameters for the box, required but can be empty + * * height sets the height (y direction) of the cylinder, optional, default 2 + * * diameterTop sets the diameter of the top of the cone, overwrites diameter, optional, default diameter + * * diameterBottom sets the diameter of the bottom of the cone, overwrites diameter, optional, default diameter + * * diameter sets the diameter of the top and bottom of the cone, optional default 1 + * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24 + * * subdivisions` the number of rings along the cylinder height, optional, default 1 + * * arc a number from 0 to 1, to create an unclosed cylinder based on the fraction of the circumference given by the arc value, optional, default 1 + * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively + * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively + * * hasRings when true makes each subdivision independently treated as a face for faceUV and faceColors, optional, default false + * * enclose when true closes an open cylinder by adding extra flat faces between the height axis and vertical edges, think cut cake + * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) + * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) + * @returns the VertexData of the cylinder, cone or prism + * @deprecated please use CreateCylinderVertexData instead */ - getStencilFunctionMask() { - return this._stencilState.stencilFuncMask; + static CreateCylinder(options) { + throw _WarnImport("cylinderBuilder"); } /** - * Sets the current stencil function - * @param stencilFunc defines the new stencil function to use + * Creates the VertexData for a torus + * @param options an object used to set the following optional parameters for the box, required but can be empty + * * diameter the diameter of the torus, optional default 1 + * * thickness the diameter of the tube forming the torus, optional default 0.5 + * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24 + * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) + * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) + * @returns the VertexData of the torus + * @deprecated use CreateTorusVertexData instead */ - setStencilFunction(stencilFunc) { - this._stencilState.stencilFunc = stencilFunc; + static CreateTorus(options) { + throw _WarnImport("torusBuilder"); } /** - * Sets the current stencil reference - * @param reference defines the new stencil reference to use + * Creates the VertexData of the LineSystem + * @param options an object used to set the following optional parameters for the LineSystem, required but can be empty + * - lines an array of lines, each line being an array of successive Vector3 + * - colors an array of line colors, each of the line colors being an array of successive Color4, one per line point + * @returns the VertexData of the LineSystem + * @deprecated use CreateLineSystemVertexData instead */ - setStencilFunctionReference(reference) { - this._stencilState.stencilFuncRef = reference; + static CreateLineSystem(options) { + throw _WarnImport("linesBuilder"); } /** - * Sets the current stencil mask - * @param mask defines the new stencil mask to use + * Create the VertexData for a DashedLines + * @param options an object used to set the following optional parameters for the DashedLines, required but can be empty + * - points an array successive Vector3 + * - dashSize the size of the dashes relative to the dash number, optional, default 3 + * - gapSize the size of the gap between two successive dashes relative to the dash number, optional, default 1 + * - dashNb the intended total number of dashes, optional, default 200 + * @returns the VertexData for the DashedLines + * @deprecated use CreateDashedLinesVertexData instead */ - setStencilFunctionMask(mask) { - this._stencilState.stencilFuncMask = mask; + static CreateDashedLines(options) { + throw _WarnImport("linesBuilder"); } /** - * Gets the current stencil operation when stencil fails - * @returns a number defining stencil operation to use when stencil fails + * Creates the VertexData for a Ground + * @param options an object used to set the following optional parameters for the Ground, required but can be empty + * - width the width (x direction) of the ground, optional, default 1 + * - height the height (z direction) of the ground, optional, default 1 + * - subdivisions the number of subdivisions per side, optional, default 1 + * @returns the VertexData of the Ground + * @deprecated Please use CreateGroundVertexData instead */ - getStencilOperationFail() { - return this._stencilState.stencilOpStencilFail; + static CreateGround(options) { + throw _WarnImport("groundBuilder"); } /** - * Gets the current stencil operation when depth fails - * @returns a number defining stencil operation to use when depth fails + * Creates the VertexData for a TiledGround by subdividing the ground into tiles + * @param options an object used to set the following optional parameters for the Ground, required but can be empty + * * xmin the ground minimum X coordinate, optional, default -1 + * * zmin the ground minimum Z coordinate, optional, default -1 + * * xmax the ground maximum X coordinate, optional, default 1 + * * zmax the ground maximum Z coordinate, optional, default 1 + * * subdivisions a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the ground width and height creating 'tiles', default {w: 6, h: 6} + * * precision a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the tile width and height, default {w: 2, h: 2} + * @returns the VertexData of the TiledGround + * @deprecated use CreateTiledGroundVertexData instead */ - getStencilOperationDepthFail() { - return this._stencilState.stencilOpDepthFail; + static CreateTiledGround(options) { + throw _WarnImport("groundBuilder"); } /** - * Gets the current stencil operation when stencil passes - * @returns a number defining stencil operation to use when stencil passes + * Creates the VertexData of the Ground designed from a heightmap + * @param options an object used to set the following parameters for the Ground, required and provided by CreateGroundFromHeightMap + * * width the width (x direction) of the ground + * * height the height (z direction) of the ground + * * subdivisions the number of subdivisions per side + * * minHeight the minimum altitude on the ground, optional, default 0 + * * maxHeight the maximum altitude on the ground, optional default 1 + * * colorFilter the filter to apply to the image pixel colors to compute the height, optional Color3, default (0.3, 0.59, 0.11) + * * buffer the array holding the image color data + * * bufferWidth the width of image + * * bufferHeight the height of image + * * alphaFilter Remove any data where the alpha channel is below this value, defaults 0 (all data visible) + * @returns the VertexData of the Ground designed from a heightmap + * @deprecated use CreateGroundFromHeightMapVertexData instead */ - getStencilOperationPass() { - return this._stencilState.stencilOpStencilDepthPass; + static CreateGroundFromHeightMap(options) { + throw _WarnImport("groundBuilder"); } /** - * Sets the stencil operation to use when stencil fails - * @param operation defines the stencil operation to use when stencil fails + * Creates the VertexData for a Plane + * @param options an object used to set the following optional parameters for the plane, required but can be empty + * * size sets the width and height of the plane to the value of size, optional default 1 + * * width sets the width (x direction) of the plane, overwrites the width set by size, optional, default size + * * height sets the height (y direction) of the plane, overwrites the height set by size, optional, default size + * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) + * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) + * @returns the VertexData of the box + * @deprecated use CreatePlaneVertexData instead */ - setStencilOperationFail(operation) { - this._stencilState.stencilOpStencilFail = operation; + static CreatePlane(options) { + throw _WarnImport("planeBuilder"); } /** - * Sets the stencil operation to use when depth fails - * @param operation defines the stencil operation to use when depth fails + * Creates the VertexData of the Disc or regular Polygon + * @param options an object used to set the following optional parameters for the disc, required but can be empty + * * radius the radius of the disc, optional default 0.5 + * * tessellation the number of polygon sides, optional, default 64 + * * arc a number from 0 to 1, to create an unclosed polygon based on the fraction of the circumference given by the arc value, optional, default 1 + * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) + * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) + * @returns the VertexData of the box + * @deprecated use CreateDiscVertexData instead */ - setStencilOperationDepthFail(operation) { - this._stencilState.stencilOpDepthFail = operation; + static CreateDisc(options) { + throw _WarnImport("discBuilder"); } /** - * Sets the stencil operation to use when stencil passes - * @param operation defines the stencil operation to use when stencil passes + * Creates the VertexData for an irregular Polygon in the XoZ plane using a mesh built by polygonTriangulation.build() + * All parameters are provided by CreatePolygon as needed + * @param polygon a mesh built from polygonTriangulation.build() + * @param sideOrientation takes the values Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * @param fUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively + * @param fColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively + * @param frontUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) + * @param backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) + * @param wrap a boolean, default false, when true and fUVs used texture is wrapped around all sides, when false texture is applied side + * @returns the VertexData of the Polygon + * @deprecated use CreatePolygonVertexData instead */ - setStencilOperationPass(operation) { - this._stencilState.stencilOpStencilDepthPass = operation; + static CreatePolygon(polygon, sideOrientation, fUV, fColors, frontUVs, backUVs, wrap) { + throw _WarnImport("polygonBuilder"); } /** - * Sets a boolean indicating if the dithering state is enabled or disabled - * @param value defines the dithering state + * Creates the VertexData of the IcoSphere + * @param options an object used to set the following optional parameters for the IcoSphere, required but can be empty + * * radius the radius of the IcoSphere, optional default 1 + * * radiusX allows stretching in the x direction, optional, default radius + * * radiusY allows stretching in the y direction, optional, default radius + * * radiusZ allows stretching in the z direction, optional, default radius + * * flat when true creates a flat shaded mesh, optional, default true + * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4 + * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) + * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) + * @returns the VertexData of the IcoSphere + * @deprecated use CreateIcoSphereVertexData instead */ - setDitheringState(value) { - if (value) { - this._gl.enable(this._gl.DITHER); - } else { - this._gl.disable(this._gl.DITHER); - } + static CreateIcoSphere(options) { + throw _WarnImport("icoSphereBuilder"); } + // inspired from // http://stemkoski.github.io/Three.js/Polyhedra.html /** - * Sets a boolean indicating if the rasterizer state is enabled or disabled - * @param value defines the rasterizer state + * Creates the VertexData for a Polyhedron + * @param options an object used to set the following optional parameters for the polyhedron, required but can be empty + * * type provided types are: + * * 0 : Tetrahedron, 1 : Octahedron, 2 : Dodecahedron, 3 : Icosahedron, 4 : Rhombicuboctahedron, 5 : Triangular Prism, 6 : Pentagonal Prism, 7 : Hexagonal Prism, 8 : Square Pyramid (J1) + * * 9 : Pentagonal Pyramid (J2), 10 : Triangular Dipyramid (J12), 11 : Pentagonal Dipyramid (J13), 12 : Elongated Square Dipyramid (J15), 13 : Elongated Pentagonal Dipyramid (J16), 14 : Elongated Pentagonal Cupola (J20) + * * size the size of the IcoSphere, optional default 1 + * * sizeX allows stretching in the x direction, optional, default size + * * sizeY allows stretching in the y direction, optional, default size + * * sizeZ allows stretching in the z direction, optional, default size + * * custom a number that overwrites the type to create from an extended set of polyhedron from https://www.babylonjs-playground.com/#21QRSK#15 with minimised editor + * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively + * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively + * * flat when true creates a flat shaded mesh, optional, default true + * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4 + * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) + * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) + * @returns the VertexData of the Polyhedron + * @deprecated use CreatePolyhedronVertexData instead */ - setRasterizerState(value) { - if (value) { - this._gl.disable(this._gl.RASTERIZER_DISCARD); - } else { - this._gl.enable(this._gl.RASTERIZER_DISCARD); - } + static CreatePolyhedron(options) { + throw _WarnImport("polyhedronBuilder"); } /** - * Gets the current depth function - * @returns a number defining the depth function + * Creates the VertexData for a Capsule, inspired from https://github.com/maximeq/three-js-capsule-geometry/blob/master/src/CapsuleBufferGeometry.js + * @param options an object used to set the following optional parameters for the capsule, required but can be empty + * @returns the VertexData of the Capsule + * @deprecated Please use CreateCapsuleVertexData from the capsuleBuilder file instead */ - getDepthFunction() { - return this._depthCullingState.depthFunc; + static CreateCapsule(options = { + orientation: Vector3.Up(), + subdivisions: 2, + tessellation: 16, + height: 1, + radius: 0.25, + capSubdivisions: 6 + }) { + throw _WarnImport("capsuleBuilder"); } + // based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3D/src/away3d/primitives/TorusKnot.as?spec=svn2473&r=2473 /** - * Sets the current depth function - * @param depthFunc defines the function to use + * Creates the VertexData for a TorusKnot + * @param options an object used to set the following optional parameters for the TorusKnot, required but can be empty + * * radius the radius of the torus knot, optional, default 2 + * * tube the thickness of the tube, optional, default 0.5 + * * radialSegments the number of sides on each tube segments, optional, default 32 + * * tubularSegments the number of tubes to decompose the knot into, optional, default 32 + * * p the number of windings around the z axis, optional, default 2 + * * q the number of windings around the x axis, optional, default 3 + * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1) + * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) + * @returns the VertexData of the Torus Knot + * @deprecated use CreateTorusKnotVertexData instead */ - setDepthFunction(depthFunc) { - this._depthCullingState.depthFunc = depthFunc; + static CreateTorusKnot(options) { + throw _WarnImport("torusKnotBuilder"); } + // Tools /** - * Sets the current depth function to GREATER + * Compute normals for given positions and indices + * @param positions an array of vertex positions, [...., x, y, z, ......] + * @param indices an array of indices in groups of three for each triangular facet, [...., i, j, k, ......] + * @param normals an array of vertex normals, [...., x, y, z, ......] + * @param options an object used to set the following optional parameters for the TorusKnot, optional + * * facetNormals : optional array of facet normals (vector3) + * * facetPositions : optional array of facet positions (vector3) + * * facetPartitioning : optional partitioning array. facetPositions is required for facetPartitioning computation + * * ratio : optional partitioning ratio / bounding box, required for facetPartitioning computation + * * bInfo : optional bounding info, required for facetPartitioning computation + * * bbSize : optional bounding box size data, required for facetPartitioning computation + * * subDiv : optional partitioning data about subdivisions on each axis (int), required for facetPartitioning computation + * * useRightHandedSystem: optional boolean to for right handed system computation + * * depthSort : optional boolean to enable the facet depth sort computation + * * distanceTo : optional Vector3 to compute the facet depth from this location + * * depthSortedFacets : optional array of depthSortedFacets to store the facet distances from the reference location */ - setDepthFunctionToGreater() { - this.setDepthFunction(516); + static ComputeNormals(positions, indices, normals, options) { + let index = 0; + let p1p2x = 0; + let p1p2y = 0; + let p1p2z = 0; + let p3p2x = 0; + let p3p2y = 0; + let p3p2z = 0; + let faceNormalx = 0; + let faceNormaly = 0; + let faceNormalz = 0; + let length = 0; + let v1x = 0; + let v1y = 0; + let v1z = 0; + let v2x = 0; + let v2y = 0; + let v2z = 0; + let v3x = 0; + let v3y = 0; + let v3z = 0; + let computeFacetNormals = false; + let computeFacetPositions = false; + let computeFacetPartitioning = false; + let computeDepthSort = false; + let faceNormalSign = 1; + let ratio = 0; + let distanceTo = null; + if (options) { + computeFacetNormals = options.facetNormals ? true : false; + computeFacetPositions = options.facetPositions ? true : false; + computeFacetPartitioning = options.facetPartitioning ? true : false; + faceNormalSign = options.useRightHandedSystem === true ? -1 : 1; + ratio = options.ratio || 0; + computeDepthSort = options.depthSort ? true : false; + distanceTo = options.distanceTo; + if (computeDepthSort) { + if (distanceTo === void 0) { + distanceTo = Vector3.Zero(); + } + } + } + let xSubRatio = 0; + let ySubRatio = 0; + let zSubRatio = 0; + let subSq = 0; + if (computeFacetPartitioning && options && options.bbSize) { + xSubRatio = options.subDiv.X * ratio / options.bbSize.x; + ySubRatio = options.subDiv.Y * ratio / options.bbSize.y; + zSubRatio = options.subDiv.Z * ratio / options.bbSize.z; + subSq = options.subDiv.max * options.subDiv.max; + options.facetPartitioning.length = 0; + } + for (index = 0; index < positions.length; index++) { + normals[index] = 0; + } + const nbFaces = indices.length / 3 | 0; + for (index = 0; index < nbFaces; index++) { + v1x = indices[index * 3] * 3; + v1y = v1x + 1; + v1z = v1x + 2; + v2x = indices[index * 3 + 1] * 3; + v2y = v2x + 1; + v2z = v2x + 2; + v3x = indices[index * 3 + 2] * 3; + v3y = v3x + 1; + v3z = v3x + 2; + p1p2x = positions[v1x] - positions[v2x]; + p1p2y = positions[v1y] - positions[v2y]; + p1p2z = positions[v1z] - positions[v2z]; + p3p2x = positions[v3x] - positions[v2x]; + p3p2y = positions[v3y] - positions[v2y]; + p3p2z = positions[v3z] - positions[v2z]; + faceNormalx = faceNormalSign * (p1p2y * p3p2z - p1p2z * p3p2y); + faceNormaly = faceNormalSign * (p1p2z * p3p2x - p1p2x * p3p2z); + faceNormalz = faceNormalSign * (p1p2x * p3p2y - p1p2y * p3p2x); + length = Math.sqrt(faceNormalx * faceNormalx + faceNormaly * faceNormaly + faceNormalz * faceNormalz); + length = length === 0 ? 1 : length; + faceNormalx /= length; + faceNormaly /= length; + faceNormalz /= length; + if (computeFacetNormals && options) { + options.facetNormals[index].x = faceNormalx; + options.facetNormals[index].y = faceNormaly; + options.facetNormals[index].z = faceNormalz; + } + if (computeFacetPositions && options) { + options.facetPositions[index].x = (positions[v1x] + positions[v2x] + positions[v3x]) / 3; + options.facetPositions[index].y = (positions[v1y] + positions[v2y] + positions[v3y]) / 3; + options.facetPositions[index].z = (positions[v1z] + positions[v2z] + positions[v3z]) / 3; + } + if (computeFacetPartitioning && options) { + const ox = Math.floor((options.facetPositions[index].x - options.bInfo.minimum.x * ratio) * xSubRatio); + const oy = Math.floor((options.facetPositions[index].y - options.bInfo.minimum.y * ratio) * ySubRatio); + const oz = Math.floor((options.facetPositions[index].z - options.bInfo.minimum.z * ratio) * zSubRatio); + const b1x = Math.floor((positions[v1x] - options.bInfo.minimum.x * ratio) * xSubRatio); + const b1y = Math.floor((positions[v1y] - options.bInfo.minimum.y * ratio) * ySubRatio); + const b1z = Math.floor((positions[v1z] - options.bInfo.minimum.z * ratio) * zSubRatio); + const b2x = Math.floor((positions[v2x] - options.bInfo.minimum.x * ratio) * xSubRatio); + const b2y = Math.floor((positions[v2y] - options.bInfo.minimum.y * ratio) * ySubRatio); + const b2z = Math.floor((positions[v2z] - options.bInfo.minimum.z * ratio) * zSubRatio); + const b3x = Math.floor((positions[v3x] - options.bInfo.minimum.x * ratio) * xSubRatio); + const b3y = Math.floor((positions[v3y] - options.bInfo.minimum.y * ratio) * ySubRatio); + const b3z = Math.floor((positions[v3z] - options.bInfo.minimum.z * ratio) * zSubRatio); + const block_idx_v1 = b1x + options.subDiv.max * b1y + subSq * b1z; + const block_idx_v2 = b2x + options.subDiv.max * b2y + subSq * b2z; + const block_idx_v3 = b3x + options.subDiv.max * b3y + subSq * b3z; + const block_idx_o = ox + options.subDiv.max * oy + subSq * oz; + options.facetPartitioning[block_idx_o] = options.facetPartitioning[block_idx_o] ? options.facetPartitioning[block_idx_o] : new Array(); + options.facetPartitioning[block_idx_v1] = options.facetPartitioning[block_idx_v1] ? options.facetPartitioning[block_idx_v1] : new Array(); + options.facetPartitioning[block_idx_v2] = options.facetPartitioning[block_idx_v2] ? options.facetPartitioning[block_idx_v2] : new Array(); + options.facetPartitioning[block_idx_v3] = options.facetPartitioning[block_idx_v3] ? options.facetPartitioning[block_idx_v3] : new Array(); + options.facetPartitioning[block_idx_v1].push(index); + if (block_idx_v2 != block_idx_v1) { + options.facetPartitioning[block_idx_v2].push(index); + } + if (!(block_idx_v3 == block_idx_v2 || block_idx_v3 == block_idx_v1)) { + options.facetPartitioning[block_idx_v3].push(index); + } + if (!(block_idx_o == block_idx_v1 || block_idx_o == block_idx_v2 || block_idx_o == block_idx_v3)) { + options.facetPartitioning[block_idx_o].push(index); + } + } + if (computeDepthSort && options && options.facetPositions) { + const dsf = options.depthSortedFacets[index]; + dsf.ind = index * 3; + dsf.sqDistance = Vector3.DistanceSquared(options.facetPositions[index], distanceTo); + } + normals[v1x] += faceNormalx; + normals[v1y] += faceNormaly; + normals[v1z] += faceNormalz; + normals[v2x] += faceNormalx; + normals[v2y] += faceNormaly; + normals[v2z] += faceNormalz; + normals[v3x] += faceNormalx; + normals[v3y] += faceNormaly; + normals[v3z] += faceNormalz; + } + for (index = 0; index < normals.length / 3; index++) { + faceNormalx = normals[index * 3]; + faceNormaly = normals[index * 3 + 1]; + faceNormalz = normals[index * 3 + 2]; + length = Math.sqrt(faceNormalx * faceNormalx + faceNormaly * faceNormaly + faceNormalz * faceNormalz); + length = length === 0 ? 1 : length; + faceNormalx /= length; + faceNormaly /= length; + faceNormalz /= length; + normals[index * 3] = faceNormalx; + normals[index * 3 + 1] = faceNormaly; + normals[index * 3 + 2] = faceNormalz; + } } /** - * Sets the current depth function to GEQUAL + * @internal */ - setDepthFunctionToGreaterOrEqual() { - this.setDepthFunction(518); + static _ComputeSides(sideOrientation, positions, indices, normals, uvs, frontUVs, backUVs) { + const li = indices.length; + const ln = normals.length; + let i; + let n; + sideOrientation = sideOrientation || _VertexData.DEFAULTSIDE; + switch (sideOrientation) { + case _VertexData.FRONTSIDE: + break; + case _VertexData.BACKSIDE: + for (i = 0; i < li; i += 3) { + const tmp = indices[i]; + indices[i] = indices[i + 2]; + indices[i + 2] = tmp; + } + for (n = 0; n < ln; n++) { + normals[n] = -normals[n]; + } + break; + case _VertexData.DOUBLESIDE: { + const lp = positions.length; + const l = lp / 3; + for (let p = 0; p < lp; p++) { + positions[lp + p] = positions[p]; + } + for (i = 0; i < li; i += 3) { + indices[i + li] = indices[i + 2] + l; + indices[i + 1 + li] = indices[i + 1] + l; + indices[i + 2 + li] = indices[i] + l; + } + for (n = 0; n < ln; n++) { + normals[ln + n] = -normals[n]; + } + const lu = uvs.length; + let u = 0; + for (u = 0; u < lu; u++) { + uvs[u + lu] = uvs[u]; + } + frontUVs = frontUVs ? frontUVs : new Vector4(0, 0, 1, 1); + backUVs = backUVs ? backUVs : new Vector4(0, 0, 1, 1); + u = 0; + for (i = 0; i < lu / 2; i++) { + uvs[u] = frontUVs.x + (frontUVs.z - frontUVs.x) * uvs[u]; + uvs[u + 1] = frontUVs.y + (frontUVs.w - frontUVs.y) * uvs[u + 1]; + uvs[u + lu] = backUVs.x + (backUVs.z - backUVs.x) * uvs[u + lu]; + uvs[u + lu + 1] = backUVs.y + (backUVs.w - backUVs.y) * uvs[u + lu + 1]; + u += 2; + } + break; + } + } } /** - * Sets the current depth function to LESS + * Creates a VertexData from serialized data + * @param parsedVertexData the parsed data from an imported file + * @returns a VertexData */ - setDepthFunctionToLess() { - this.setDepthFunction(513); + static Parse(parsedVertexData) { + const vertexData = new _VertexData(); + const positions = parsedVertexData.positions; + if (positions) { + vertexData.set(positions, VertexBuffer.PositionKind); + } + const normals = parsedVertexData.normals; + if (normals) { + vertexData.set(normals, VertexBuffer.NormalKind); + } + const tangents = parsedVertexData.tangents; + if (tangents) { + vertexData.set(tangents, VertexBuffer.TangentKind); + } + const uvs = parsedVertexData.uvs; + if (uvs) { + vertexData.set(uvs, VertexBuffer.UVKind); + } + const uvs2 = parsedVertexData.uvs2; + if (uvs2) { + vertexData.set(uvs2, VertexBuffer.UV2Kind); + } + const uvs3 = parsedVertexData.uvs3; + if (uvs3) { + vertexData.set(uvs3, VertexBuffer.UV3Kind); + } + const uvs4 = parsedVertexData.uvs4; + if (uvs4) { + vertexData.set(uvs4, VertexBuffer.UV4Kind); + } + const uvs5 = parsedVertexData.uvs5; + if (uvs5) { + vertexData.set(uvs5, VertexBuffer.UV5Kind); + } + const uvs6 = parsedVertexData.uvs6; + if (uvs6) { + vertexData.set(uvs6, VertexBuffer.UV6Kind); + } + const colors = parsedVertexData.colors; + if (colors) { + vertexData.set(Color4.CheckColors4(colors, positions.length / 3), VertexBuffer.ColorKind); + if (parsedVertexData.hasVertexAlpha !== void 0) { + vertexData.hasVertexAlpha = parsedVertexData.hasVertexAlpha; + } + } + const matricesIndices = parsedVertexData.matricesIndices; + if (matricesIndices) { + vertexData.set(matricesIndices, VertexBuffer.MatricesIndicesKind); + } + const matricesWeights = parsedVertexData.matricesWeights; + if (matricesWeights) { + vertexData.set(matricesWeights, VertexBuffer.MatricesWeightsKind); + } + const indices = parsedVertexData.indices; + if (indices) { + vertexData.indices = indices; + } + const materialInfos = parsedVertexData.materialInfos; + if (materialInfos) { + vertexData.materialInfos = []; + for (const materialInfoFromJSON of materialInfos) { + const materialInfo = new VertexDataMaterialInfo(); + materialInfo.indexCount = materialInfoFromJSON.indexCount; + materialInfo.indexStart = materialInfoFromJSON.indexStart; + materialInfo.verticesCount = materialInfoFromJSON.verticesCount; + materialInfo.verticesStart = materialInfoFromJSON.verticesStart; + materialInfo.materialIndex = materialInfoFromJSON.materialIndex; + vertexData.materialInfos.push(materialInfo); + } + } + return vertexData; } /** - * Sets the current depth function to LEQUAL + * Applies VertexData created from the imported parameters to the geometry + * @param parsedVertexData the parsed data from an imported file + * @param geometry the geometry to apply the VertexData to */ - setDepthFunctionToLessOrEqual() { - this.setDepthFunction(515); + static ImportVertexData(parsedVertexData, geometry) { + const vertexData = _VertexData.Parse(parsedVertexData); + geometry.setAllVerticesData(vertexData, parsedVertexData.updatable); } - /** - * Caches the state of the stencil buffer - */ - cacheStencilState() { - this._cachedStencilBuffer = this.getStencilBuffer(); - this._cachedStencilFunction = this.getStencilFunction(); - this._cachedStencilMask = this.getStencilMask(); - this._cachedStencilOperationPass = this.getStencilOperationPass(); - this._cachedStencilOperationFail = this.getStencilOperationFail(); - this._cachedStencilOperationDepthFail = this.getStencilOperationDepthFail(); - this._cachedStencilReference = this.getStencilFunctionReference(); +}; +VertexData.FRONTSIDE = 0; +VertexData.BACKSIDE = 1; +VertexData.DOUBLESIDE = 2; +VertexData.DEFAULTSIDE = 0; +VertexData._UniqueIDGenerator = 0; +__decorate([ + nativeOverride.filter((...[coordinates]) => !Array.isArray(coordinates)) +], VertexData, "_TransformVector3Coordinates", null); +__decorate([ + nativeOverride.filter((...[normals]) => !Array.isArray(normals)) +], VertexData, "_TransformVector3Normals", null); +__decorate([ + nativeOverride.filter((...[normals]) => !Array.isArray(normals)) +], VertexData, "_TransformVector4Normals", null); +__decorate([ + nativeOverride.filter((...[indices]) => !Array.isArray(indices)) +], VertexData, "_FlipFaces", null); + +// node_modules/@babylonjs/core/node.js +var _InternalNodeDataInfo = class { + constructor() { + this._doNotSerialize = false; + this._isDisposed = false; + this._sceneRootNodesIndex = -1; + this._isEnabled = true; + this._isParentEnabled = true; + this._isReady = true; + this._onEnabledStateChangedObservable = new Observable(); + this._onClonedObservable = new Observable(); } +}; +var Node = class _Node { /** - * Restores the state of the stencil buffer + * Add a new node constructor + * @param type defines the type name of the node to construct + * @param constructorFunc defines the constructor function */ - restoreStencilState() { - this.setStencilFunction(this._cachedStencilFunction); - this.setStencilMask(this._cachedStencilMask); - this.setStencilBuffer(this._cachedStencilBuffer); - this.setStencilOperationPass(this._cachedStencilOperationPass); - this.setStencilOperationFail(this._cachedStencilOperationFail); - this.setStencilOperationDepthFail(this._cachedStencilOperationDepthFail); - this.setStencilFunctionReference(this._cachedStencilReference); + static AddNodeConstructor(type, constructorFunc) { + this._NodeConstructors[type] = constructorFunc; } /** - * Directly set the WebGL Viewport - * @param x defines the x coordinate of the viewport (in screen space) - * @param y defines the y coordinate of the viewport (in screen space) - * @param width defines the width of the viewport (in screen space) - * @param height defines the height of the viewport (in screen space) - * @returns the current viewport Object (if any) that is being replaced by this call. You can restore this viewport later on to go back to the original state + * Returns a node constructor based on type name + * @param type defines the type name + * @param name defines the new node name + * @param scene defines the hosting scene + * @param options defines optional options to transmit to constructors + * @returns the new constructor or null */ - setDirectViewport(x, y, width, height) { - const currentViewport = this._cachedViewport; - this._cachedViewport = null; - this._viewport(x, y, width, height); - return currentViewport; + static Construct(type, name69, scene, options) { + const constructorFunc = this._NodeConstructors[type]; + if (!constructorFunc) { + return null; + } + return constructorFunc(name69, scene, options); } /** - * Executes a scissor clear (ie. a clear on a specific portion of the screen) - * @param x defines the x-coordinate of the bottom left corner of the clear rectangle - * @param y defines the y-coordinate of the corner of the clear rectangle - * @param width defines the width of the clear rectangle - * @param height defines the height of the clear rectangle - * @param clearColor defines the clear color + * Gets or sets the accessibility tag to describe the node for accessibility purpose. */ - scissorClear(x, y, width, height, clearColor) { - this.enableScissor(x, y, width, height); - this.clear(clearColor, true, true, true); - this.disableScissor(); + set accessibilityTag(value) { + this._accessibilityTag = value; + this.onAccessibilityTagChangedObservable.notifyObservers(value); + } + get accessibilityTag() { + return this._accessibilityTag; } /** - * Enable scissor test on a specific rectangle (ie. render will only be executed on a specific portion of the screen) - * @param x defines the x-coordinate of the bottom left corner of the clear rectangle - * @param y defines the y-coordinate of the corner of the clear rectangle - * @param width defines the width of the clear rectangle - * @param height defines the height of the clear rectangle + * Gets or sets a boolean used to define if the node must be serialized */ - enableScissor(x, y, width, height) { - const gl = this._gl; - gl.enable(gl.SCISSOR_TEST); - gl.scissor(x, y, width, height); + get doNotSerialize() { + if (this._nodeDataStorage._doNotSerialize) { + return true; + } + if (this._parentNode) { + return this._parentNode.doNotSerialize; + } + return false; + } + set doNotSerialize(value) { + this._nodeDataStorage._doNotSerialize = value; } /** - * Disable previously set scissor test rectangle + * Gets a boolean indicating if the node has been disposed + * @returns true if the node was disposed */ - disableScissor() { - const gl = this._gl; - gl.disable(gl.SCISSOR_TEST); + isDisposed() { + return this._nodeDataStorage._isDisposed; } /** - * @internal + * Gets or sets the parent of the node (without keeping the current position in the scene) + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/parent */ - _reportDrawCall(numDrawCalls = 1) { - this._drawCalls.addCount(numDrawCalls, false); + set parent(parent) { + if (this._parentNode === parent) { + return; + } + const previousParentNode = this._parentNode; + if (this._parentNode && this._parentNode._children !== void 0 && this._parentNode._children !== null) { + const index = this._parentNode._children.indexOf(this); + if (index !== -1) { + this._parentNode._children.splice(index, 1); + } + if (!parent && !this._nodeDataStorage._isDisposed) { + this._addToSceneRootNodes(); + } + } + this._parentNode = parent; + this._isDirty = true; + if (this._parentNode) { + if (this._parentNode._children === void 0 || this._parentNode._children === null) { + this._parentNode._children = new Array(); + } + this._parentNode._children.push(this); + if (!previousParentNode) { + this._removeFromSceneRootNodes(); + } + } + this._syncParentEnabledState(); + } + get parent() { + return this._parentNode; } /** * @internal */ - _loadFileAsync(url, offlineProvider, useArrayBuffer) { - return new Promise((resolve, reject) => { - this._loadFile(url, (data) => { - resolve(data); - }, void 0, offlineProvider, useArrayBuffer, (request, exception) => { - reject(exception); - }); - }); + _serializeAsParent(serializationObject) { + serializationObject.parentId = this.uniqueId; + } + /** @internal */ + _addToSceneRootNodes() { + if (this._nodeDataStorage._sceneRootNodesIndex === -1) { + this._nodeDataStorage._sceneRootNodesIndex = this._scene.rootNodes.length; + this._scene.rootNodes.push(this); + } + } + /** @internal */ + _removeFromSceneRootNodes() { + if (this._nodeDataStorage._sceneRootNodesIndex !== -1) { + const rootNodes = this._scene.rootNodes; + const lastIdx = rootNodes.length - 1; + rootNodes[this._nodeDataStorage._sceneRootNodesIndex] = rootNodes[lastIdx]; + rootNodes[this._nodeDataStorage._sceneRootNodesIndex]._nodeDataStorage._sceneRootNodesIndex = this._nodeDataStorage._sceneRootNodesIndex; + this._scene.rootNodes.pop(); + this._nodeDataStorage._sceneRootNodesIndex = -1; + } } /** - * Gets the source code of the vertex shader associated with a specific webGL program - * @param program defines the program to use - * @returns a string containing the source code of the vertex shader associated with the program + * Gets or sets the animation properties override */ - getVertexShaderSource(program) { - const shaders = this._gl.getAttachedShaders(program); - if (!shaders) { - return null; + get animationPropertiesOverride() { + if (!this._animationPropertiesOverride) { + return this._scene.animationPropertiesOverride; } - return this._gl.getShaderSource(shaders[0]); + return this._animationPropertiesOverride; + } + set animationPropertiesOverride(value) { + this._animationPropertiesOverride = value; } /** - * Gets the source code of the fragment shader associated with a specific webGL program - * @param program defines the program to use - * @returns a string containing the source code of the fragment shader associated with the program + * Gets a string identifying the name of the class + * @returns "Node" string */ - getFragmentShaderSource(program) { - const shaders = this._gl.getAttachedShaders(program); - if (!shaders) { - return null; - } - return this._gl.getShaderSource(shaders[1]); + getClassName() { + return "Node"; } /** - * Sets a depth stencil texture from a render target to the according uniform. - * @param channel The texture channel - * @param uniform The uniform to set - * @param texture The render target texture containing the depth stencil texture to apply - * @param name The texture name + * Sets a callback that will be raised when the node will be disposed */ - setDepthStencilTexture(channel, uniform, texture, name69) { - if (channel === void 0) { - return; - } - if (uniform) { - this._boundUniforms[channel] = uniform; - } - if (!texture || !texture.depthStencilTexture) { - this._setTexture(channel, null, void 0, void 0, name69); - } else { - this._setTexture(channel, texture, false, true, name69); + set onDispose(callback) { + if (this._onDisposeObserver) { + this.onDisposeObservable.remove(this._onDisposeObserver); } + this._onDisposeObserver = this.onDisposeObservable.add(callback); } /** - * Sets a texture to the webGL context from a postprocess - * @param channel defines the channel to use - * @param postProcess defines the source postprocess - * @param name name of the channel + * An event triggered when the enabled state of the node changes */ - setTextureFromPostProcess(channel, postProcess, name69) { - let postProcessInput = null; - if (postProcess) { - if (postProcess._forcedOutputTexture) { - postProcessInput = postProcess._forcedOutputTexture; - } else if (postProcess._textures.data[postProcess._currentRenderTextureInd]) { - postProcessInput = postProcess._textures.data[postProcess._currentRenderTextureInd]; - } - } - this._bindTexture(channel, (postProcessInput == null ? void 0 : postProcessInput.texture) ?? null, name69); + get onEnabledStateChangedObservable() { + return this._nodeDataStorage._onEnabledStateChangedObservable; } /** - * Binds the output of the passed in post process to the texture channel specified - * @param channel The channel the texture should be bound to - * @param postProcess The post process which's output should be bound - * @param name name of the channel + * An event triggered when the node is cloned */ - setTextureFromPostProcessOutput(channel, postProcess, name69) { - var _a; - this._bindTexture(channel, ((_a = postProcess == null ? void 0 : postProcess._outputTexture) == null ? void 0 : _a.texture) ?? null, name69); + get onClonedObservable() { + return this._nodeDataStorage._onClonedObservable; } /** - * sets the object from which width and height will be taken from when getting render width and height - * Will fallback to the gl object - * @param dimensions the framebuffer width and height that will be used. + * Creates a new Node + * @param name the name and id to be given to this node + * @param scene the scene this node will be added to */ - set framebufferDimensionsObject(dimensions) { - this._framebufferDimensionsObject = dimensions; - if (this._framebufferDimensionsObject) { - this.onResizeObservable.notifyObservers(this); - } + constructor(name69, scene = null) { + this._isDirty = false; + this._nodeDataStorage = new _InternalNodeDataInfo(); + this.state = ""; + this.metadata = null; + this.reservedDataStore = null; + this._accessibilityTag = null; + this.onAccessibilityTagChangedObservable = new Observable(); + this._parentContainer = null; + this.animations = []; + this._ranges = {}; + this.onReady = null; + this._currentRenderId = -1; + this._parentUpdateId = -1; + this._childUpdateId = -1; + this._waitingParentId = null; + this._waitingParentInstanceIndex = null; + this._waitingParsedUniqueId = null; + this._cache = {}; + this._parentNode = null; + this._children = null; + this._worldMatrix = Matrix.Identity(); + this._worldMatrixDeterminant = 0; + this._worldMatrixDeterminantIsDirty = true; + this._animationPropertiesOverride = null; + this._isNode = true; + this.onDisposeObservable = new Observable(); + this._onDisposeObserver = null; + this._behaviors = new Array(); + this.name = name69; + this.id = name69; + this._scene = scene || EngineStore.LastCreatedScene; + this.uniqueId = this._scene.getUniqueId(); + this._initCache(); } - _rebuildBuffers() { - for (const scene of this.scenes) { - scene.resetCachedMaterial(); - scene._rebuildGeometries(); - } - for (const scene of this._virtualScenes) { - scene.resetCachedMaterial(); - scene._rebuildGeometries(); - } - super._rebuildBuffers(); + /** + * Gets the scene of the node + * @returns a scene + */ + getScene() { + return this._scene; } - _rebuildTextures() { - for (const scene of this.scenes) { - scene._rebuildTextures(); - } - for (const scene of this._virtualScenes) { - scene._rebuildTextures(); - } - super._rebuildTextures(); + /** + * Gets the engine of the node + * @returns a Engine + */ + getEngine() { + return this._scene.getEngine(); } - /** @internal */ - _renderFrame() { - for (let index = 0; index < this._activeRenderLoops.length; index++) { - const renderFunction = this._activeRenderLoops[index]; - renderFunction(); + /** + * Attach a behavior to the node + * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors + * @param behavior defines the behavior to attach + * @param attachImmediately defines that the behavior must be attached even if the scene is still loading + * @returns the current Node + */ + addBehavior(behavior, attachImmediately = false) { + const index = this._behaviors.indexOf(behavior); + if (index !== -1) { + return this; } - } - _cancelFrame() { - if (this.customAnimationFrameRequester) { - if (this._frameHandler !== 0) { - this._frameHandler = 0; - const { cancelAnimationFrame: cancelAnimationFrame2 } = this.customAnimationFrameRequester; - if (cancelAnimationFrame2) { - cancelAnimationFrame2(this.customAnimationFrameRequester.requestID); - } - } + behavior.init(); + if (this._scene.isLoading && !attachImmediately) { + this._scene.onDataLoadedObservable.addOnce(() => { + behavior.attach(this); + }); } else { - super._cancelFrame(); + behavior.attach(this); } + this._behaviors.push(behavior); + return this; } - _renderLoop() { - this._frameHandler = 0; - if (!this._contextWasLost) { - let shouldRender = true; - if (this.isDisposed || !this.renderEvenInBackground && this._windowIsBackground) { - shouldRender = false; - } - if (shouldRender) { - this.beginFrame(); - if (!this._renderViews()) { - this._renderFrame(); - } - this.endFrame(); - } - } - if (this._frameHandler === 0) { - if (this.customAnimationFrameRequester) { - this.customAnimationFrameRequester.requestID = this._queueNewFrame(this.customAnimationFrameRequester.renderFunction || this._boundRenderFunction, this.customAnimationFrameRequester); - this._frameHandler = this.customAnimationFrameRequester.requestID; - } else { - this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow()); - } + /** + * Remove an attached behavior + * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors + * @param behavior defines the behavior to attach + * @returns the current Node + */ + removeBehavior(behavior) { + const index = this._behaviors.indexOf(behavior); + if (index === -1) { + return this; } - } - /** @internal */ - _renderViews() { - return false; + this._behaviors[index].detach(); + this._behaviors.splice(index, 1); + return this; } /** - * Toggle full screen mode - * @param requestPointerLock defines if a pointer lock should be requested from the user + * Gets the list of attached behaviors + * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors */ - switchFullscreen(requestPointerLock) { - if (this.isFullscreen) { - this.exitFullscreen(); - } else { - this.enterFullscreen(requestPointerLock); - } + get behaviors() { + return this._behaviors; } /** - * Enters full screen mode - * @param requestPointerLock defines if a pointer lock should be requested from the user + * 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 */ - enterFullscreen(requestPointerLock) { - if (!this.isFullscreen) { - this._pointerLockRequested = requestPointerLock; - if (this._renderingCanvas) { - _Engine._RequestFullscreen(this._renderingCanvas); + getBehaviorByName(name69) { + for (const behavior of this._behaviors) { + if (behavior.name === name69) { + return behavior; } } + return null; } /** - * Exits full screen mode + * Returns the latest update of the World matrix + * @returns a Matrix */ - exitFullscreen() { - if (this.isFullscreen) { - _Engine._ExitFullscreen(); + getWorldMatrix() { + if (this._currentRenderId !== this._scene.getRenderId()) { + this.computeWorldMatrix(); } + return this._worldMatrix; } - /** - * Enters Pointerlock mode - */ - enterPointerlock() { - if (this._renderingCanvas) { - _Engine._RequestPointerlock(this._renderingCanvas); + /** @internal */ + _getWorldMatrixDeterminant() { + if (this._worldMatrixDeterminantIsDirty) { + this._worldMatrixDeterminantIsDirty = false; + this._worldMatrixDeterminant = this._worldMatrix.determinant(); } + return this._worldMatrixDeterminant; } /** - * Exits Pointerlock mode + * Returns directly the latest state of the mesh World matrix. + * A Matrix is returned. */ - exitPointerlock() { - _Engine._ExitPointerlock(); + get worldMatrixFromCache() { + return this._worldMatrix; + } + // override it in derived class if you add new variables to the cache + // and call the parent class method + /** @internal */ + _initCache() { + this._cache = {}; } /** - * Begin a new frame + * @internal */ - beginFrame() { - this._measureFps(); - this.onBeginFrameObservable.notifyObservers(this); - super.beginFrame(); + updateCache(force) { + if (!force && this.isSynchronized()) { + return; + } + this._updateCache(); } /** - * End the current frame + * @internal */ - endFrame() { - super.endFrame(); - this.onEndFrameObservable.notifyObservers(this); + _getActionManagerForTrigger(trigger, _initialCall = true) { + if (!this.parent) { + return null; + } + return this.parent._getActionManagerForTrigger(trigger, false); } + // override it in derived class if you add new variables to the cache + // and call the parent class method if !ignoreParentClass /** - * Force a specific size of the canvas - * @param width defines the new canvas' width - * @param height defines the new canvas' height - * @param forceSetSize true to force setting the sizes of the underlying canvas - * @returns true if the size was changed + * @internal */ - setSize(width, height, forceSetSize = false) { - if (!this._renderingCanvas) { - return false; + _updateCache(_ignoreParentClass) { + } + // override it in derived class if you add new variables to the cache + /** @internal */ + _isSynchronized() { + return true; + } + /** @internal */ + _markSyncedWithParent() { + if (this._parentNode) { + this._parentUpdateId = this._parentNode._childUpdateId; } - if (!super.setSize(width, height, forceSetSize)) { - return false; + } + /** @internal */ + isSynchronizedWithParent() { + if (!this._parentNode) { + return true; } - if (this.scenes) { - for (let index = 0; index < this.scenes.length; index++) { - const scene = this.scenes[index]; - for (let camIndex = 0; camIndex < scene.cameras.length; camIndex++) { - const cam = scene.cameras[camIndex]; - cam._currentRenderId = 0; - } - } - if (this.onResizeObservable.hasObservers()) { - this.onResizeObservable.notifyObservers(this); - } + if (this._parentNode._isDirty || this._parentUpdateId !== this._parentNode._childUpdateId) { + return false; } - return true; + return this._parentNode.isSynchronized(); } - _deletePipelineContext(pipelineContext) { - const webGLPipelineContext = pipelineContext; - if (webGLPipelineContext && webGLPipelineContext.program) { - if (webGLPipelineContext.transformFeedback) { - this.deleteTransformFeedback(webGLPipelineContext.transformFeedback); - webGLPipelineContext.transformFeedback = null; - } + /** @internal */ + isSynchronized() { + if (this._parentNode && !this.isSynchronizedWithParent()) { + return false; } - super._deletePipelineContext(pipelineContext); - } - createShaderProgram(pipelineContext, vertexCode, fragmentCode, defines, context, transformFeedbackVaryings = null) { - context = context || this._gl; - this.onBeforeShaderCompilationObservable.notifyObservers(this); - const program = super.createShaderProgram(pipelineContext, vertexCode, fragmentCode, defines, context, transformFeedbackVaryings); - this.onAfterShaderCompilationObservable.notifyObservers(this); - return program; - } - _createShaderProgram(pipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings = null) { - const shaderProgram = context.createProgram(); - pipelineContext.program = shaderProgram; - if (!shaderProgram) { - throw new Error("Unable to create program"); - } - context.attachShader(shaderProgram, vertexShader); - context.attachShader(shaderProgram, fragmentShader); - if (this.webGLVersion > 1 && transformFeedbackVaryings) { - const transformFeedback = this.createTransformFeedback(); - this.bindTransformFeedback(transformFeedback); - this.setTranformFeedbackVaryings(shaderProgram, transformFeedbackVaryings); - pipelineContext.transformFeedback = transformFeedback; - } - context.linkProgram(shaderProgram); - if (this.webGLVersion > 1 && transformFeedbackVaryings) { - this.bindTransformFeedback(null); - } - pipelineContext.context = context; - pipelineContext.vertexShader = vertexShader; - pipelineContext.fragmentShader = fragmentShader; - if (!pipelineContext.isParallelCompiled) { - this._finalizePipelineContext(pipelineContext); - } - return shaderProgram; + return this._isSynchronized(); } /** - * @internal + * Is this node ready to be used/rendered + * @param _completeCheck defines if a complete check (including materials and lights) has to be done (false by default) + * @returns true if the node is ready */ - _releaseTexture(texture) { - super._releaseTexture(texture); + isReady(_completeCheck = false) { + return this._nodeDataStorage._isReady; } /** - * @internal + * Flag the node as dirty (Forcing it to update everything) + * @param _property helps children apply precise "dirtyfication" + * @returns this node */ - _releaseRenderTargetWrapper(rtWrapper) { - super._releaseRenderTargetWrapper(rtWrapper); - this.scenes.forEach((scene) => { - scene.postProcesses.forEach((postProcess) => { - if (postProcess._outputTexture === rtWrapper) { - postProcess._outputTexture = null; - } - }); - scene.cameras.forEach((camera) => { - camera._postProcesses.forEach((postProcess) => { - if (postProcess) { - if (postProcess._outputTexture === rtWrapper) { - postProcess._outputTexture = null; - } - } - }); - }); - }); + markAsDirty(_property) { + this._currentRenderId = Number.MAX_VALUE; + this._isDirty = true; + return this; } /** - * Gets the names of the render passes that are currently created - * @returns list of the render pass names + * Is this node enabled? + * If the node has a parent, all ancestors will be checked and false will be returned if any are false (not enabled), otherwise will return true + * @param checkAncestors indicates if this method should check the ancestors. The default is to check the ancestors. If set to false, the method will return the value of this node without checking ancestors + * @returns whether this node (and its parent) is enabled */ - getRenderPassNames() { - return this._renderPassNames; + isEnabled(checkAncestors = true) { + if (checkAncestors === false) { + return this._nodeDataStorage._isEnabled; + } + if (!this._nodeDataStorage._isEnabled) { + return false; + } + return this._nodeDataStorage._isParentEnabled; } - /** - * Gets the name of the current render pass - * @returns name of the current render pass - */ - getCurrentRenderPassName() { - return this._renderPassNames[this.currentRenderPassId]; + /** @internal */ + _syncParentEnabledState() { + this._nodeDataStorage._isParentEnabled = this._parentNode ? this._parentNode.isEnabled() : true; + if (this._children) { + this._children.forEach((c) => { + c._syncParentEnabledState(); + }); + } } /** - * Creates a render pass id - * @param name Name of the render pass (for debug purpose only) - * @returns the id of the new render pass + * Set the enabled state of this node + * @param value defines the new enabled state */ - createRenderPassId(name69) { - const id = ++_Engine._RenderPassIdCounter; - this._renderPassNames[id] = name69 ?? "NONAME"; - return id; + setEnabled(value) { + if (this._nodeDataStorage._isEnabled === value) { + return; + } + this._nodeDataStorage._isEnabled = value; + this._syncParentEnabledState(); + this._nodeDataStorage._onEnabledStateChangedObservable.notifyObservers(value); } /** - * Releases a render pass id - * @param id id of the render pass to release + * Is this node a descendant of the given node? + * The function will iterate up the hierarchy until the ancestor was found or no more parents defined + * @param ancestor defines the parent node to inspect + * @returns a boolean indicating if this node is a descendant of the given node */ - releaseRenderPassId(id) { - this._renderPassNames[id] = void 0; - for (let s = 0; s < this.scenes.length; ++s) { - const scene = this.scenes[s]; - for (let m = 0; m < scene.meshes.length; ++m) { - const mesh = scene.meshes[m]; - if (mesh.subMeshes) { - for (let b = 0; b < mesh.subMeshes.length; ++b) { - const subMesh = mesh.subMeshes[b]; - subMesh._removeDrawWrapper(id); - } - } + isDescendantOf(ancestor) { + if (this.parent) { + if (this.parent === ancestor) { + return true; } + return this.parent.isDescendantOf(ancestor); } + return false; } /** * @internal - * Rescales a texture - * @param source input texture - * @param destination destination texture - * @param scene scene to use to render the resize - * @param internalFormat format to use when resizing - * @param onComplete callback to be called when resize has completed */ - _rescaleTexture(source, destination, scene, internalFormat, onComplete) { - this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.LINEAR); - this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.LINEAR); - this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE); - this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE); - const rtt = this.createRenderTargetTexture({ - width: destination.width, - height: destination.height - }, { - generateMipMaps: false, - type: 0, - samplingMode: 2, - generateDepthBuffer: false, - generateStencilBuffer: false - }); - if (!this._rescalePostProcess && _Engine._RescalePostProcessFactory) { - this._rescalePostProcess = _Engine._RescalePostProcessFactory(this); + _getDescendants(results, directDescendantsOnly = false, predicate) { + if (!this._children) { + return; } - if (this._rescalePostProcess) { - this._rescalePostProcess.externalTextureSamplerBinding = true; - this._rescalePostProcess.getEffect().executeWhenCompiled(() => { - this._rescalePostProcess.onApply = function(effect) { - effect._bindTexture("textureSampler", source); - }; - let hostingScene = scene; - if (!hostingScene) { - hostingScene = this.scenes[this.scenes.length - 1]; - } - hostingScene.postProcessManager.directRender([this._rescalePostProcess], rtt, true); - this._bindTextureDirectly(this._gl.TEXTURE_2D, destination, true); - this._gl.copyTexImage2D(this._gl.TEXTURE_2D, 0, internalFormat, 0, 0, destination.width, destination.height, 0); - this.unBindFramebuffer(rtt); - rtt.dispose(); - if (onComplete) { - onComplete(); - } - }); + for (let index = 0; index < this._children.length; index++) { + const item = this._children[index]; + if (!predicate || predicate(item)) { + results.push(item); + } + if (!directDescendantsOnly) { + item._getDescendants(results, false, predicate); + } } } - // FPS /** - * Gets the current framerate - * @returns a number representing the framerate + * Will return all nodes that have this node 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 children nodes of all types */ - getFps() { - return this._fps; + getDescendants(directDescendantsOnly, predicate) { + const results = []; + this._getDescendants(results, directDescendantsOnly, predicate); + return results; } /** - * Gets the time spent between current and previous frame - * @returns a number representing the delta time in ms + * Get all child-meshes of this node + * @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 (Default: false) + * @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 an array of AbstractMesh */ - getDeltaTime() { - return this._deltaTime; - } - _measureFps() { - this._performanceMonitor.sampleFrame(); - this._fps = this._performanceMonitor.averageFPS; - this._deltaTime = this._performanceMonitor.instantaneousFrameTime || 0; + getChildMeshes(directDescendantsOnly, predicate) { + const results = []; + this._getDescendants(results, directDescendantsOnly, (node) => { + return (!predicate || predicate(node)) && node.cullingStrategy !== void 0; + }); + return results; } /** - * Wraps an external web gl texture in a Babylon texture. - * @param texture defines the external texture - * @param hasMipMaps defines whether the external texture has mip maps (default: false) - * @param samplingMode defines the sampling mode for the external texture (default: 3) - * @param width defines the width for the external texture (default: 0) - * @param height defines the height for the external texture (default: 0) - * @returns the babylon internal texture + * Get all direct children of this node + * @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 + * @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 (Default: true) + * @returns an array of Node */ - wrapWebGLTexture(texture, hasMipMaps = false, samplingMode = 3, width = 0, height = 0) { - const hardwareTexture = new WebGLHardwareTexture(texture, this._gl); - const internalTexture = new InternalTexture(this, InternalTextureSource.Unknown, true); - internalTexture._hardwareTexture = hardwareTexture; - internalTexture.baseWidth = width; - internalTexture.baseHeight = height; - internalTexture.width = width; - internalTexture.height = height; - internalTexture.isReady = true; - internalTexture.useMipMaps = hasMipMaps; - this.updateTextureSamplingMode(samplingMode, internalTexture); - return internalTexture; + getChildren(predicate, directDescendantsOnly = true) { + return this.getDescendants(directDescendantsOnly, predicate); } /** * @internal */ - _uploadImageToTexture(texture, image, faceIndex = 0, lod = 0) { - const gl = this._gl; - const textureType = this._getWebGLTextureType(texture.type); - const format = this._getInternalFormat(texture.format); - const internalFormat = this._getRGBABufferInternalSizedFormat(texture.type, format); - const bindTarget = texture.isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D; - this._bindTextureDirectly(bindTarget, texture, true); - this._unpackFlipY(texture.invertY); - let target = gl.TEXTURE_2D; - if (texture.isCube) { - target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex; + _setReady(state) { + if (state === this._nodeDataStorage._isReady) { + return; } - gl.texImage2D(target, lod, internalFormat, format, textureType, image); - this._bindTextureDirectly(bindTarget, null, true); - } - /** - * Updates a depth texture Comparison Mode and Function. - * If the comparison Function is equal to 0, the mode will be set to none. - * Otherwise, this only works in webgl 2 and requires a shadow sampler in the shader. - * @param texture The texture to set the comparison function for - * @param comparisonFunction The comparison function to set, 0 if no comparison required - */ - updateTextureComparisonFunction(texture, comparisonFunction) { - if (this.webGLVersion === 1) { - Logger.Error("WebGL 1 does not support texture comparison."); + if (!state) { + this._nodeDataStorage._isReady = false; return; } - const gl = this._gl; - if (texture.isCube) { - this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, texture, true); - if (comparisonFunction === 0) { - gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_FUNC, 515); - gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_MODE, gl.NONE); - } else { - gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_FUNC, comparisonFunction); - gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE); - } - this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null); - } else { - this._bindTextureDirectly(this._gl.TEXTURE_2D, texture, true); - if (comparisonFunction === 0) { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_FUNC, 515); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_MODE, gl.NONE); - } else { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_FUNC, comparisonFunction); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE); - } - this._bindTextureDirectly(this._gl.TEXTURE_2D, null); + if (this.onReady) { + this.onReady(this); } - texture._comparisonFunction = comparisonFunction; + this._nodeDataStorage._isReady = true; } /** - * Creates a webGL buffer to use with instantiation - * @param capacity defines the size of the buffer - * @returns the webGL buffer + * Get an animation by name + * @param name defines the name of the animation to look for + * @returns null if not found else the requested animation */ - createInstancesBuffer(capacity) { - const buffer = this._gl.createBuffer(); - if (!buffer) { - throw new Error("Unable to create instance buffer"); + getAnimationByName(name69) { + for (let i = 0; i < this.animations.length; i++) { + const animation = this.animations[i]; + if (animation.name === name69) { + return animation; + } } - const result = new WebGLDataBuffer(buffer); - result.capacity = capacity; - this.bindArrayBuffer(result); - this._gl.bufferData(this._gl.ARRAY_BUFFER, capacity, this._gl.DYNAMIC_DRAW); - result.references = 1; - return result; + return null; } /** - * Delete a webGL buffer used with instantiation - * @param buffer defines the webGL buffer to delete + * Creates an animation range for this node + * @param name defines the name of the range + * @param from defines the starting key + * @param to defines the end key */ - deleteInstancesBuffer(buffer) { - this._gl.deleteBuffer(buffer); - } - _clientWaitAsync(sync, flags = 0, intervalms = 10) { - const gl = this._gl; - return new Promise((resolve, reject) => { - const check = () => { - const res = gl.clientWaitSync(sync, flags, 0); - if (res == gl.WAIT_FAILED) { - reject(); - return; - } - if (res == gl.TIMEOUT_EXPIRED) { - setTimeout(check, intervalms); - return; + createAnimationRange(name69, from, to) { + if (!this._ranges[name69]) { + this._ranges[name69] = _Node._AnimationRangeFactory(name69, from, to); + for (let i = 0, nAnimations = this.animations.length; i < nAnimations; i++) { + if (this.animations[i]) { + this.animations[i].createRange(name69, from, to); } - resolve(); - }; - check(); - }); + } + } } /** - * @internal + * Delete a specific animation range + * @param name defines the name of the range to delete + * @param deleteFrames defines if animation frames from the range must be deleted as well */ - _readPixelsAsync(x, y, w, h, format, type, outputBuffer) { - if (this._webGLVersion < 2) { - throw new Error("_readPixelsAsync only work on WebGL2+"); - } - const gl = this._gl; - const buf = gl.createBuffer(); - gl.bindBuffer(gl.PIXEL_PACK_BUFFER, buf); - gl.bufferData(gl.PIXEL_PACK_BUFFER, outputBuffer.byteLength, gl.STREAM_READ); - gl.readPixels(x, y, w, h, format, type, 0); - gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null); - const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0); - if (!sync) { - return null; - } - gl.flush(); - return this._clientWaitAsync(sync, 0, 10).then(() => { - gl.deleteSync(sync); - gl.bindBuffer(gl.PIXEL_PACK_BUFFER, buf); - gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, outputBuffer); - gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null); - gl.deleteBuffer(buf); - return outputBuffer; - }); - } - dispose() { - this.hideLoadingUI(); - this.onNewSceneAddedObservable.clear(); - while (this.postProcesses.length) { - this.postProcesses[0].dispose(); - } - if (this._rescalePostProcess) { - this._rescalePostProcess.dispose(); - } - while (this.scenes.length) { - this.scenes[0].dispose(); - } - while (this._virtualScenes.length) { - this._virtualScenes[0].dispose(); - } - if (EngineStore.Instances.length === 1 && _Engine.audioEngine) { - _Engine.audioEngine.dispose(); - _Engine.audioEngine = null; - } - const hostWindow = this.getHostWindow(); - if (hostWindow && typeof hostWindow.removeEventListener === "function") { - hostWindow.removeEventListener("blur", this._onBlur); - hostWindow.removeEventListener("focus", this._onFocus); - } - if (this._renderingCanvas) { - this._renderingCanvas.removeEventListener("focus", this._onCanvasFocus); - this._renderingCanvas.removeEventListener("blur", this._onCanvasBlur); - this._renderingCanvas.removeEventListener("pointerout", this._onCanvasPointerOut); - this._renderingCanvas.removeEventListener("contextmenu", this._onCanvasContextMenu); - } - if (IsDocumentAvailable()) { - document.removeEventListener("fullscreenchange", this._onFullscreenChange); - document.removeEventListener("mozfullscreenchange", this._onFullscreenChange); - document.removeEventListener("webkitfullscreenchange", this._onFullscreenChange); - document.removeEventListener("msfullscreenchange", this._onFullscreenChange); - document.removeEventListener("pointerlockchange", this._onPointerLockChange); - document.removeEventListener("mspointerlockchange", this._onPointerLockChange); - document.removeEventListener("mozpointerlockchange", this._onPointerLockChange); - document.removeEventListener("webkitpointerlockchange", this._onPointerLockChange); - } - super.dispose(); - const index = EngineStore.Instances.indexOf(this); - if (index >= 0) { - EngineStore.Instances.splice(index, 1); - } - if (!_Engine.Instances.length) { - EngineStore.OnEnginesDisposedObservable.notifyObservers(this); - } - this.onResizeObservable.clear(); - this.onCanvasBlurObservable.clear(); - this.onCanvasFocusObservable.clear(); - this.onCanvasPointerOutObservable.clear(); - this.onBeginFrameObservable.clear(); - this.onEndFrameObservable.clear(); - } - _disableTouchAction() { - if (!this._renderingCanvas || !this._renderingCanvas.setAttribute) { - return; + deleteAnimationRange(name69, deleteFrames = true) { + for (let i = 0, nAnimations = this.animations.length; i < nAnimations; i++) { + if (this.animations[i]) { + this.animations[i].deleteRange(name69, deleteFrames); + } } - this._renderingCanvas.setAttribute("touch-action", "none"); - this._renderingCanvas.style.touchAction = "none"; - this._renderingCanvas.style.webkitTapHighlightColor = "transparent"; + this._ranges[name69] = null; } - // Loading screen /** - * Display the loading screen - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen + * Get an animation range by name + * @param name defines the name of the animation range to look for + * @returns null if not found else the requested animation range */ - displayLoadingUI() { - if (!IsWindowObjectExist()) { - return; - } - const loadingScreen = this.loadingScreen; - if (loadingScreen) { - loadingScreen.displayLoadingUI(); - } + getAnimationRange(name69) { + return this._ranges[name69] || null; } /** - * Hide the loading screen - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen + * Clone the current node + * @param name Name of the new clone + * @param newParent New parent for the clone + * @param doNotCloneChildren Do not clone children hierarchy + * @returns the new transform node */ - hideLoadingUI() { - if (!IsWindowObjectExist()) { - return; + clone(name69, newParent, doNotCloneChildren) { + const result = SerializationHelper.Clone(() => new _Node(name69, this.getScene()), this); + if (newParent) { + result.parent = newParent; } - const loadingScreen = this._loadingScreen; - if (loadingScreen) { - loadingScreen.hideLoadingUI(); + if (!doNotCloneChildren) { + const directDescendants = this.getDescendants(true); + for (let index = 0; index < directDescendants.length; index++) { + const child = directDescendants[index]; + child.clone(name69 + "." + child.name, result); + } } + return result; } /** - * Gets the current loading screen object - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen + * Gets the list of all animation ranges defined on this node + * @returns an array */ - get loadingScreen() { - if (!this._loadingScreen && this._renderingCanvas) { - this._loadingScreen = _Engine.DefaultLoadingScreenFactory(this._renderingCanvas); + getAnimationRanges() { + const animationRanges = []; + let name69; + for (name69 in this._ranges) { + animationRanges.push(this._ranges[name69]); } - return this._loadingScreen; + return animationRanges; } /** - * Sets the current loading screen object - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen - */ - set loadingScreen(loadingScreen) { - this._loadingScreen = loadingScreen; - } - /** - * Sets the current loading screen text - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen - */ - set loadingUIText(text) { - this.loadingScreen.loadingUIText = text; - } - /** - * Sets the current loading screen background color - * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen - */ - set loadingUIBackgroundColor(color) { - this.loadingScreen.loadingUIBackgroundColor = color; - } - /** - * creates and returns a new video element - * @param constraints video constraints - * @returns video element + * Will start the animation sequence + * @param name defines the range frames for animation sequence + * @param loop defines if the animation should loop (false by default) + * @param speedRatio defines the speed factor in which to run the animation (1 by default) + * @param onAnimationEnd defines a function to be executed when the animation ended (undefined by default) + * @returns the object created for this animation. If range does not exist, it will return null */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - createVideoElement(constraints) { - return document.createElement("video"); + beginAnimation(name69, loop, speedRatio, onAnimationEnd) { + const range = this.getAnimationRange(name69); + if (!range) { + return null; + } + return this._scene.beginAnimation(this, range.from, range.to, loop, speedRatio, onAnimationEnd); } - /** Pointerlock and fullscreen */ /** - * Ask the browser to promote the current element to pointerlock mode - * @param element defines the DOM element to promote + * Serialize animation ranges into a JSON compatible object + * @returns serialization object */ - static _RequestPointerlock(element) { - if (element.requestPointerLock) { - const promise = element.requestPointerLock(); - if (promise instanceof Promise) - promise.then(() => { - element.focus(); - }).catch(() => { - }); - else - element.focus(); + serializeAnimationRanges() { + const serializationRanges = []; + for (const name69 in this._ranges) { + const localRange = this._ranges[name69]; + if (!localRange) { + continue; + } + const range = {}; + range.name = name69; + range.from = localRange.from; + range.to = localRange.to; + serializationRanges.push(range); } + return serializationRanges; } /** - * Asks the browser to exit pointerlock mode + * Computes the world matrix of the node + * @param _force defines if the cache version should be invalidated forcing the world matrix to be created from scratch + * @returns the world matrix */ - static _ExitPointerlock() { - if (document.exitPointerLock) { - document.exitPointerLock(); + computeWorldMatrix(_force) { + if (!this._worldMatrix) { + this._worldMatrix = Matrix.Identity(); } + return this._worldMatrix; } /** - * Ask the browser to promote the current element to fullscreen rendering mode - * @param element defines the DOM element to promote + * Releases resources associated with this node. + * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default) + * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default) */ - static _RequestFullscreen(element) { - const requestFunction = element.requestFullscreen || element.webkitRequestFullscreen; - if (!requestFunction) { - return; + dispose(doNotRecurse, disposeMaterialAndTextures = false) { + this._nodeDataStorage._isDisposed = true; + if (!doNotRecurse) { + const nodes = this.getDescendants(true); + for (const node of nodes) { + node.dispose(doNotRecurse, disposeMaterialAndTextures); + } } - requestFunction.call(element); + if (!this.parent) { + this._removeFromSceneRootNodes(); + } else { + this.parent = null; + } + this.onDisposeObservable.notifyObservers(this); + this.onDisposeObservable.clear(); + this.onEnabledStateChangedObservable.clear(); + this.onClonedObservable.clear(); + for (const behavior of this._behaviors) { + behavior.detach(); + } + this._behaviors.length = 0; + this.metadata = null; } /** - * Asks the browser to exit fullscreen mode + * Parse animation range data from a serialization object and store them into a given node + * @param node defines where to store the animation ranges + * @param parsedNode defines the serialization object to read data from + * @param _scene defines the hosting scene */ - static _ExitFullscreen() { - const anyDoc = document; - if (document.exitFullscreen) { - document.exitFullscreen(); - } else if (anyDoc.webkitCancelFullScreen) { - anyDoc.webkitCancelFullScreen(); + static ParseAnimationRanges(node, parsedNode, _scene) { + if (parsedNode.ranges) { + for (let index = 0; index < parsedNode.ranges.length; index++) { + const data = parsedNode.ranges[index]; + node.createAnimationRange(data.name, data.from, data.to); + } } } /** - * Get Font size information - * @param font font name - * @returns an object containing ascent, height and descent + * Return the minimum and maximum world vectors of the entire hierarchy under current node + * @param includeDescendants Include bounding info from descendants as well (true by default) + * @param predicate defines a callback function that can be customize to filter what meshes should be included in the list used to compute the bounding vectors + * @returns the new bounding vectors */ - getFontOffset(font) { - const text = document.createElement("span"); - text.innerHTML = "Hg"; - text.setAttribute("style", `font: ${font} !important`); - const block = document.createElement("div"); - block.style.display = "inline-block"; - block.style.width = "1px"; - block.style.height = "0px"; - block.style.verticalAlign = "bottom"; - const div = document.createElement("div"); - div.style.whiteSpace = "nowrap"; - div.appendChild(text); - div.appendChild(block); - document.body.appendChild(div); - let fontAscent = 0; - let fontHeight = 0; - try { - fontHeight = block.getBoundingClientRect().top - text.getBoundingClientRect().top; - block.style.verticalAlign = "baseline"; - fontAscent = block.getBoundingClientRect().top - text.getBoundingClientRect().top; - } finally { - document.body.removeChild(div); + getHierarchyBoundingVectors(includeDescendants = true, predicate = null) { + this.getScene().incrementRenderId(); + this.computeWorldMatrix(true); + let min; + let max; + const thisAbstractMesh = this; + if (thisAbstractMesh.getBoundingInfo && thisAbstractMesh.subMeshes) { + const boundingInfo = thisAbstractMesh.getBoundingInfo(); + min = boundingInfo.boundingBox.minimumWorld.clone(); + max = boundingInfo.boundingBox.maximumWorld.clone(); + } else { + min = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); + max = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); } - return { ascent: fontAscent, height: fontHeight, descent: fontHeight - fontAscent }; + if (includeDescendants) { + const descendants = this.getDescendants(false); + for (const descendant of descendants) { + const childMesh = descendant; + childMesh.computeWorldMatrix(true); + if (predicate && !predicate(childMesh)) { + continue; + } + if (!childMesh.getBoundingInfo || childMesh.getTotalVertices() === 0) { + continue; + } + const childBoundingInfo = childMesh.getBoundingInfo(); + const boundingBox = childBoundingInfo.boundingBox; + const minBox = boundingBox.minimumWorld; + const maxBox = boundingBox.maximumWorld; + Vector3.CheckExtends(minBox, min, max); + Vector3.CheckExtends(maxBox, min, max); + } + } + return { + min, + max + }; } }; -Engine.ALPHA_DISABLE = 0; -Engine.ALPHA_ADD = 1; -Engine.ALPHA_COMBINE = 2; -Engine.ALPHA_SUBTRACT = 3; -Engine.ALPHA_MULTIPLY = 4; -Engine.ALPHA_MAXIMIZED = 5; -Engine.ALPHA_ONEONE = 6; -Engine.ALPHA_PREMULTIPLIED = 7; -Engine.ALPHA_PREMULTIPLIED_PORTERDUFF = 8; -Engine.ALPHA_INTERPOLATE = 9; -Engine.ALPHA_SCREENMODE = 10; -Engine.DELAYLOADSTATE_NONE = 0; -Engine.DELAYLOADSTATE_LOADED = 1; -Engine.DELAYLOADSTATE_LOADING = 2; -Engine.DELAYLOADSTATE_NOTLOADED = 4; -Engine.NEVER = 512; -Engine.ALWAYS = 519; -Engine.LESS = 513; -Engine.EQUAL = 514; -Engine.LEQUAL = 515; -Engine.GREATER = 516; -Engine.GEQUAL = 518; -Engine.NOTEQUAL = 517; -Engine.KEEP = 7680; -Engine.REPLACE = 7681; -Engine.INCR = 7682; -Engine.DECR = 7683; -Engine.INVERT = 5386; -Engine.INCR_WRAP = 34055; -Engine.DECR_WRAP = 34056; -Engine.TEXTURE_CLAMP_ADDRESSMODE = 0; -Engine.TEXTURE_WRAP_ADDRESSMODE = 1; -Engine.TEXTURE_MIRROR_ADDRESSMODE = 2; -Engine.TEXTUREFORMAT_ALPHA = 0; -Engine.TEXTUREFORMAT_LUMINANCE = 1; -Engine.TEXTUREFORMAT_LUMINANCE_ALPHA = 2; -Engine.TEXTUREFORMAT_RGB = 4; -Engine.TEXTUREFORMAT_RGBA = 5; -Engine.TEXTUREFORMAT_RED = 6; -Engine.TEXTUREFORMAT_R = 6; -Engine.TEXTUREFORMAT_RG = 7; -Engine.TEXTUREFORMAT_RED_INTEGER = 8; -Engine.TEXTUREFORMAT_R_INTEGER = 8; -Engine.TEXTUREFORMAT_RG_INTEGER = 9; -Engine.TEXTUREFORMAT_RGB_INTEGER = 10; -Engine.TEXTUREFORMAT_RGBA_INTEGER = 11; -Engine.TEXTURETYPE_UNSIGNED_BYTE = 0; -Engine.TEXTURETYPE_UNSIGNED_INT = 0; -Engine.TEXTURETYPE_FLOAT = 1; -Engine.TEXTURETYPE_HALF_FLOAT = 2; -Engine.TEXTURETYPE_BYTE = 3; -Engine.TEXTURETYPE_SHORT = 4; -Engine.TEXTURETYPE_UNSIGNED_SHORT = 5; -Engine.TEXTURETYPE_INT = 6; -Engine.TEXTURETYPE_UNSIGNED_INTEGER = 7; -Engine.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4 = 8; -Engine.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1 = 9; -Engine.TEXTURETYPE_UNSIGNED_SHORT_5_6_5 = 10; -Engine.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV = 11; -Engine.TEXTURETYPE_UNSIGNED_INT_24_8 = 12; -Engine.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV = 13; -Engine.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV = 14; -Engine.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV = 15; -Engine.TEXTURE_NEAREST_SAMPLINGMODE = 1; -Engine.TEXTURE_BILINEAR_SAMPLINGMODE = 2; -Engine.TEXTURE_TRILINEAR_SAMPLINGMODE = 3; -Engine.TEXTURE_NEAREST_NEAREST_MIPLINEAR = 8; -Engine.TEXTURE_LINEAR_LINEAR_MIPNEAREST = 11; -Engine.TEXTURE_LINEAR_LINEAR_MIPLINEAR = 3; -Engine.TEXTURE_NEAREST_NEAREST_MIPNEAREST = 4; -Engine.TEXTURE_NEAREST_LINEAR_MIPNEAREST = 5; -Engine.TEXTURE_NEAREST_LINEAR_MIPLINEAR = 6; -Engine.TEXTURE_NEAREST_LINEAR = 7; -Engine.TEXTURE_NEAREST_NEAREST = 1; -Engine.TEXTURE_LINEAR_NEAREST_MIPNEAREST = 9; -Engine.TEXTURE_LINEAR_NEAREST_MIPLINEAR = 10; -Engine.TEXTURE_LINEAR_LINEAR = 2; -Engine.TEXTURE_LINEAR_NEAREST = 12; -Engine.TEXTURE_EXPLICIT_MODE = 0; -Engine.TEXTURE_SPHERICAL_MODE = 1; -Engine.TEXTURE_PLANAR_MODE = 2; -Engine.TEXTURE_CUBIC_MODE = 3; -Engine.TEXTURE_PROJECTION_MODE = 4; -Engine.TEXTURE_SKYBOX_MODE = 5; -Engine.TEXTURE_INVCUBIC_MODE = 6; -Engine.TEXTURE_EQUIRECTANGULAR_MODE = 7; -Engine.TEXTURE_FIXED_EQUIRECTANGULAR_MODE = 8; -Engine.TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9; -Engine.SCALEMODE_FLOOR = 1; -Engine.SCALEMODE_NEAREST = 2; -Engine.SCALEMODE_CEILING = 3; -Engine._RescalePostProcessFactory = null; -Engine._RenderPassIdCounter = 0; +Node._AnimationRangeFactory = (_name, _from, _to) => { + throw _WarnImport("AnimationRange"); +}; +Node._NodeConstructors = {}; +__decorate([ + serialize() +], Node.prototype, "name", void 0); +__decorate([ + serialize() +], Node.prototype, "id", void 0); +__decorate([ + serialize() +], Node.prototype, "uniqueId", void 0); +__decorate([ + serialize() +], Node.prototype, "state", void 0); +__decorate([ + serialize() +], Node.prototype, "metadata", void 0); + +// node_modules/@babylonjs/core/Maths/math.axis.js +var Space; +(function(Space2) { + Space2[Space2["LOCAL"] = 0] = "LOCAL"; + Space2[Space2["WORLD"] = 1] = "WORLD"; + Space2[Space2["BONE"] = 2] = "BONE"; +})(Space || (Space = {})); +var Axis = class { +}; +Axis.X = new Vector3(1, 0, 0); +Axis.Y = new Vector3(0, 1, 0); +Axis.Z = new Vector3(0, 0, 1); +var Coordinate; +(function(Coordinate2) { + Coordinate2[Coordinate2["X"] = 0] = "X"; + Coordinate2[Coordinate2["Y"] = 1] = "Y"; + Coordinate2[Coordinate2["Z"] = 2] = "Z"; +})(Coordinate || (Coordinate = {})); // node_modules/@babylonjs/core/Meshes/transformNode.js var convertRHSToLHS = Matrix.Compose(Vector3.One(), Quaternion.FromEulerAngles(0, Math.PI, 0), Vector3.Zero()); @@ -48251,31639 +45112,34778 @@ __decorate([ serialize() ], Material.prototype, "transparencyMode", null); -// node_modules/@babylonjs/core/Materials/multiMaterial.js -var MultiMaterial = class _MultiMaterial extends Material { +// node_modules/@babylonjs/core/Layers/layerSceneComponent.js +var LayerSceneComponent = class { /** - * Gets or Sets the list of Materials used within the multi material. - * They need to be ordered according to the submeshes order in the associated mesh + * Creates a new instance of the component for the given scene + * @param scene Defines the scene to register the component in */ - get subMaterials() { - return this._subMaterials; + constructor(scene) { + this.name = SceneComponentConstants.NAME_LAYER; + this.scene = scene || EngineStore.LastCreatedScene; + if (!this.scene) { + return; + } + this._engine = this.scene.getEngine(); + this.scene.layers = []; } - set subMaterials(value) { - this._subMaterials = value; - this._hookArray(value); + /** + * Registers the component in a given scene + */ + register() { + this.scene._beforeCameraDrawStage.registerStep(SceneComponentConstants.STEP_BEFORECAMERADRAW_LAYER, this, this._drawCameraBackground); + this.scene._afterCameraDrawStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERADRAW_LAYER, this, this._drawCameraForegroundWithPostProcessing); + this.scene._afterCameraPostProcessStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERAPOSTPROCESS_LAYER, this, this._drawCameraForegroundWithoutPostProcessing); + this.scene._beforeRenderTargetDrawStage.registerStep(SceneComponentConstants.STEP_BEFORERENDERTARGETDRAW_LAYER, this, this._drawRenderTargetBackground); + this.scene._afterRenderTargetDrawStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERTARGETDRAW_LAYER, this, this._drawRenderTargetForegroundWithPostProcessing); + this.scene._afterRenderTargetPostProcessStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERTARGETPOSTPROCESS_LAYER, this, this._drawRenderTargetForegroundWithoutPostProcessing); } /** - * Function used to align with Node.getChildren() - * @returns the list of Materials used within the multi material + * Rebuilds the elements related to this component in case of + * context lost for instance. */ - getChildren() { - return this.subMaterials; + rebuild() { + const layers = this.scene.layers; + for (const layer of layers) { + layer._rebuild(); + } } /** - * Instantiates a new Multi Material - * A multi-material is used to apply different materials to different parts of the same object without the need of - * separate meshes. This can be use to improve performances. - * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials - * @param name Define the name in the scene - * @param scene Define the scene the material belongs to + * Disposes the component and the associated resources. */ - constructor(name69, scene) { - super(name69, scene, true); - this._waitingSubMaterialsUniqueIds = []; - this.getScene().addMultiMaterial(this); - this.subMaterials = []; - this._storeEffectOnSubMeshes = true; + dispose() { + const layers = this.scene.layers; + while (layers.length) { + layers[0].dispose(); + } } - _hookArray(array) { - const oldPush = array.push; - array.push = (...items) => { - const result = oldPush.apply(array, items); - this._markAllSubMeshesAsTexturesDirty(); - return result; - }; - const oldSplice = array.splice; - array.splice = (index, deleteCount) => { - const deleted = oldSplice.apply(array, [index, deleteCount]); - this._markAllSubMeshesAsTexturesDirty(); - return deleted; - }; + _draw(predicate) { + const layers = this.scene.layers; + if (layers.length) { + this._engine.setDepthBuffer(false); + for (const layer of layers) { + if (predicate(layer)) { + layer.render(); + } + } + this._engine.setDepthBuffer(true); + } + } + _drawCameraPredicate(layer, isBackground, applyPostProcess, cameraLayerMask) { + return !layer.renderOnlyInRenderTargetTextures && layer.isBackground === isBackground && layer.applyPostProcess === applyPostProcess && (layer.layerMask & cameraLayerMask) !== 0; + } + _drawCameraBackground(camera) { + this._draw((layer) => { + return this._drawCameraPredicate(layer, true, true, camera.layerMask); + }); + } + _drawCameraForegroundWithPostProcessing(camera) { + this._draw((layer) => { + return this._drawCameraPredicate(layer, false, true, camera.layerMask); + }); + } + _drawCameraForegroundWithoutPostProcessing(camera) { + this._draw((layer) => { + return this._drawCameraPredicate(layer, false, false, camera.layerMask); + }); + } + _drawRenderTargetPredicate(layer, isBackground, applyPostProcess, cameraLayerMask, renderTargetTexture) { + return layer.renderTargetTextures.length > 0 && layer.isBackground === isBackground && layer.applyPostProcess === applyPostProcess && layer.renderTargetTextures.indexOf(renderTargetTexture) > -1 && (layer.layerMask & cameraLayerMask) !== 0; + } + _drawRenderTargetBackground(renderTarget) { + this._draw((layer) => { + return this._drawRenderTargetPredicate(layer, true, true, this.scene.activeCamera.layerMask, renderTarget); + }); + } + _drawRenderTargetForegroundWithPostProcessing(renderTarget) { + this._draw((layer) => { + return this._drawRenderTargetPredicate(layer, false, true, this.scene.activeCamera.layerMask, renderTarget); + }); + } + _drawRenderTargetForegroundWithoutPostProcessing(renderTarget) { + this._draw((layer) => { + return this._drawRenderTargetPredicate(layer, false, false, this.scene.activeCamera.layerMask, renderTarget); + }); } /** - * Get one of the submaterial by its index in the submaterials array - * @param index The index to look the sub material at - * @returns The Material if the index has been defined + * Adds all the elements from the container to the scene + * @param container the container holding the elements */ - getSubMaterial(index) { - if (index < 0 || index >= this.subMaterials.length) { - return this.getScene().defaultMaterial; + addFromContainer(container) { + if (!container.layers) { + return; } - return this.subMaterials[index]; + container.layers.forEach((layer) => { + this.scene.layers.push(layer); + }); } /** - * Get the list of active textures for the whole sub materials list. - * @returns All the textures that will be used during the rendering + * Removes all the elements in the container from the scene + * @param container contains the elements to remove + * @param dispose if the removed element should be disposed (default: false) */ - getActiveTextures() { - return super.getActiveTextures().concat(...this.subMaterials.map((subMaterial) => { - if (subMaterial) { - return subMaterial.getActiveTextures(); - } else { - return []; + removeFromContainer(container, dispose = false) { + if (!container.layers) { + return; + } + container.layers.forEach((layer) => { + const index = this.scene.layers.indexOf(layer); + if (index !== -1) { + this.scene.layers.splice(index, 1); } - })); + if (dispose) { + layer.dispose(); + } + }); } +}; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/helperFunctions.js +var name = "helperFunctions"; +var shader = `const float PI=3.1415926535897932384626433832795;const float RECIPROCAL_PI=0.3183098861837907;const float RECIPROCAL_PI2=0.15915494309189535;const float HALF_MIN=5.96046448e-08; +const float LinearEncodePowerApprox=2.2;const float GammaEncodePowerApprox=1.0/LinearEncodePowerApprox;const vec3 LuminanceEncodeApprox=vec3(0.2126,0.7152,0.0722);const float Epsilon=0.0000001; +#define saturate(x) clamp(x,0.0,1.0) +#define absEps(x) abs(x)+Epsilon +#define maxEps(x) max(x,Epsilon) +#define saturateEps(x) clamp(x,Epsilon,1.0) +mat3 transposeMat3(mat3 inMatrix) {vec3 i0=inMatrix[0];vec3 i1=inMatrix[1];vec3 i2=inMatrix[2];mat3 outMatrix=mat3( +vec3(i0.x,i1.x,i2.x), +vec3(i0.y,i1.y,i2.y), +vec3(i0.z,i1.z,i2.z) +);return outMatrix;} +mat3 inverseMat3(mat3 inMatrix) {float a00=inMatrix[0][0],a01=inMatrix[0][1],a02=inMatrix[0][2];float a10=inMatrix[1][0],a11=inMatrix[1][1],a12=inMatrix[1][2];float a20=inMatrix[2][0],a21=inMatrix[2][1],a22=inMatrix[2][2];float b01=a22*a11-a12*a21;float b11=-a22*a10+a12*a20;float b21=a21*a10-a11*a20;float det=a00*b01+a01*b11+a02*b21;return mat3(b01,(-a22*a01+a02*a21),(a12*a01-a02*a11), +b11,(a22*a00-a02*a20),(-a12*a00+a02*a10), +b21,(-a21*a00+a01*a20),(a11*a00-a01*a10))/det;} +#if USE_EXACT_SRGB_CONVERSIONS +vec3 toLinearSpaceExact(vec3 color) +{vec3 nearZeroSection=0.0773993808*color;vec3 remainingSection=pow(0.947867299*(color+vec3(0.055)),vec3(2.4)); +#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE) +return mix(remainingSection,nearZeroSection,lessThanEqual(color,vec3(0.04045))); +#else +return +vec3( +color.r<=0.04045 ? nearZeroSection.r : remainingSection.r, +color.g<=0.04045 ? nearZeroSection.g : remainingSection.g, +color.b<=0.04045 ? nearZeroSection.b : remainingSection.b); +#endif +} +vec3 toGammaSpaceExact(vec3 color) +{vec3 nearZeroSection=12.92*color;vec3 remainingSection=1.055*pow(color,vec3(0.41666))-vec3(0.055); +#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE) +return mix(remainingSection,nearZeroSection,lessThanEqual(color,vec3(0.0031308))); +#else +return +vec3( +color.r<=0.0031308 ? nearZeroSection.r : remainingSection.r, +color.g<=0.0031308 ? nearZeroSection.g : remainingSection.g, +color.b<=0.0031308 ? nearZeroSection.b : remainingSection.b); +#endif +} +#endif +float toLinearSpace(float color) +{ +#if USE_EXACT_SRGB_CONVERSIONS +float nearZeroSection=0.0773993808*color;float remainingSection=pow(0.947867299*(color+0.055),2.4);return color<=0.04045 ? nearZeroSection : remainingSection; +#else +return pow(color,LinearEncodePowerApprox); +#endif +} +vec3 toLinearSpace(vec3 color) +{ +#if USE_EXACT_SRGB_CONVERSIONS +return toLinearSpaceExact(color); +#else +return pow(color,vec3(LinearEncodePowerApprox)); +#endif +} +vec4 toLinearSpace(vec4 color) +{ +#if USE_EXACT_SRGB_CONVERSIONS +return vec4(toLinearSpaceExact(color.rgb),color.a); +#else +return vec4(pow(color.rgb,vec3(LinearEncodePowerApprox)),color.a); +#endif +} +float toGammaSpace(float color) +{ +#if USE_EXACT_SRGB_CONVERSIONS +float nearZeroSection=12.92*color;float remainingSection=1.055*pow(color,0.41666)-0.055;return color<=0.0031308 ? nearZeroSection : remainingSection; +#else +return pow(color,GammaEncodePowerApprox); +#endif +} +vec3 toGammaSpace(vec3 color) +{ +#if USE_EXACT_SRGB_CONVERSIONS +return toGammaSpaceExact(color); +#else +return pow(color,vec3(GammaEncodePowerApprox)); +#endif +} +vec4 toGammaSpace(vec4 color) +{ +#if USE_EXACT_SRGB_CONVERSIONS +return vec4(toGammaSpaceExact(color.rgb),color.a); +#else +return vec4(pow(color.rgb,vec3(GammaEncodePowerApprox)),color.a); +#endif +} +float square(float value) +{return value*value;} +vec3 square(vec3 value) +{return value*value;} +float pow5(float value) {float sq=value*value;return sq*sq*value;} +float getLuminance(vec3 color) +{return clamp(dot(color,LuminanceEncodeApprox),0.,1.);} +float getRand(vec2 seed) {return fract(sin(dot(seed.xy ,vec2(12.9898,78.233)))*43758.5453);} +float dither(vec2 seed,float varianceAmount) {float rand=getRand(seed);float normVariance=varianceAmount/255.0;float dither=mix(-normVariance,normVariance,rand);return dither;} +const float rgbdMaxRange=255.0;vec4 toRGBD(vec3 color) {float maxRGB=maxEps(max(color.r,max(color.g,color.b)));float D =max(rgbdMaxRange/maxRGB,1.);D =clamp(floor(D)/255.0,0.,1.);vec3 rgb=color.rgb*D;rgb=toGammaSpace(rgb);return vec4(clamp(rgb,0.,1.),D); } +vec3 fromRGBD(vec4 rgbd) {rgbd.rgb=toLinearSpace(rgbd.rgb);return rgbd.rgb/rgbd.a;} +vec3 parallaxCorrectNormal( vec3 vertexPos,vec3 origVec,vec3 cubeSize,vec3 cubePos ) {vec3 invOrigVec=vec3(1.0,1.0,1.0)/origVec;vec3 halfSize=cubeSize*0.5;vec3 intersecAtMaxPlane=(cubePos+halfSize-vertexPos)*invOrigVec;vec3 intersecAtMinPlane=(cubePos-halfSize-vertexPos)*invOrigVec;vec3 largestIntersec=max(intersecAtMaxPlane,intersecAtMinPlane);float distance=min(min(largestIntersec.x,largestIntersec.y),largestIntersec.z);vec3 intersectPositionWS=vertexPos+origVec*distance;return intersectPositionWS-cubePos;} +`; +ShaderStore.IncludesShadersStore[name] = shader; + +// node_modules/@babylonjs/core/Shaders/layer.fragment.js +var name2 = "layerPixelShader"; +var shader2 = `varying vec2 vUV;uniform sampler2D textureSampler;uniform vec4 color; +#include +#define CUSTOM_FRAGMENT_DEFINITIONS +void main(void) { +#define CUSTOM_FRAGMENT_MAIN_BEGIN +vec4 baseColor=texture2D(textureSampler,vUV); +#ifdef LINEAR +baseColor.rgb=toGammaSpace(baseColor.rgb); +#endif +#ifdef ALPHATEST +if (baseColor.a<0.4) +discard; +#endif +gl_FragColor=baseColor*color; +#define CUSTOM_FRAGMENT_MAIN_END +}`; +ShaderStore.ShadersStore[name2] = shader2; + +// node_modules/@babylonjs/core/Shaders/layer.vertex.js +var name3 = "layerVertexShader"; +var shader3 = `attribute vec2 position;uniform vec2 scale;uniform vec2 offset;uniform mat4 textureMatrix;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5); +#define CUSTOM_VERTEX_DEFINITIONS +void main(void) { +#define CUSTOM_VERTEX_MAIN_BEGIN +vec2 shiftedPosition=position*scale+offset;vUV=vec2(textureMatrix*vec4(shiftedPosition*madd+madd,1.0,0.0));gl_Position=vec4(shiftedPosition,0.0,1.0); +#define CUSTOM_VERTEX_MAIN_END +}`; +ShaderStore.ShadersStore[name3] = shader3; + +// node_modules/@babylonjs/core/Layers/layer.js +var Layer = class { /** - * Specifies if any sub-materials of this multi-material use a given texture. - * @param texture Defines the texture to check against this multi-material's sub-materials. - * @returns A boolean specifying if any sub-material of this multi-material uses the texture. + * Determines if the layer is drawn before (true) or after (false) post-processing. + * If the layer is background, it is always before. */ - hasTexture(texture) { - var _a; - if (super.hasTexture(texture)) { - return true; - } - for (let i = 0; i < this.subMaterials.length; i++) { - if ((_a = this.subMaterials[i]) == null ? void 0 : _a.hasTexture(texture)) { - return true; - } - } - return false; + set applyPostProcess(value) { + this._applyPostProcess = value; + } + get applyPostProcess() { + return this.isBackground || this._applyPostProcess; } /** - * Gets the current class name of the material e.g. "MultiMaterial" - * Mainly use in serialization. - * @returns the class name + * Back compatibility with callback before the onDisposeObservable existed. + * The set callback will be triggered when the layer has been disposed. */ - getClassName() { - return "MultiMaterial"; + set onDispose(callback) { + if (this._onDisposeObserver) { + this.onDisposeObservable.remove(this._onDisposeObserver); + } + this._onDisposeObserver = this.onDisposeObservable.add(callback); } /** - * Checks if the material is ready to render the requested sub mesh - * @param mesh Define the mesh the submesh belongs to - * @param subMesh Define the sub mesh to look readiness for - * @param useInstances Define whether or not the material is used with instances - * @returns true if ready, otherwise false + * Back compatibility with callback before the onBeforeRenderObservable existed. + * The set callback will be triggered just before rendering the layer. */ - isReadyForSubMesh(mesh, subMesh, useInstances) { - for (let index = 0; index < this.subMaterials.length; index++) { - const subMaterial = this.subMaterials[index]; - if (subMaterial) { - if (subMaterial._storeEffectOnSubMeshes) { - if (!subMaterial.isReadyForSubMesh(mesh, subMesh, useInstances)) { - return false; - } - continue; - } - if (!subMaterial.isReady(mesh)) { - return false; - } - } + set onBeforeRender(callback) { + if (this._onBeforeRenderObserver) { + this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver); } - return true; + this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback); } /** - * Clones the current material and its related sub materials - * @param name Define the name of the newly cloned material - * @param cloneChildren Define if submaterial will be cloned or shared with the parent instance - * @returns the cloned material + * Back compatibility with callback before the onAfterRenderObservable existed. + * The set callback will be triggered just after rendering the layer. */ - clone(name69, cloneChildren) { - const newMultiMaterial = new _MultiMaterial(name69, this.getScene()); - for (let index = 0; index < this.subMaterials.length; index++) { - let subMaterial = null; - const current = this.subMaterials[index]; - if (cloneChildren && current) { - subMaterial = current.clone(name69 + "-" + current.name); - } else { - subMaterial = this.subMaterials[index]; - } - newMultiMaterial.subMaterials.push(subMaterial); + set onAfterRender(callback) { + if (this._onAfterRenderObserver) { + this.onAfterRenderObservable.remove(this._onAfterRenderObserver); } - return newMultiMaterial; + this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback); } /** - * Serializes the materials into a JSON representation. - * @returns the JSON representation + * Instantiates a new layer. + * This represents a full screen 2d layer. + * This can be useful to display a picture in the background of your scene for instance. + * @see https://www.babylonjs-playground.com/#08A2BS#1 + * @param name Define the name of the layer in the scene + * @param imgUrl Define the url of the texture to display in the layer + * @param scene Define the scene the layer belongs to + * @param isBackground Defines whether the layer is displayed in front or behind the scene + * @param color Defines a color for the layer */ - serialize() { - const serializationObject = {}; - serializationObject.name = this.name; - serializationObject.id = this.id; - serializationObject.uniqueId = this.uniqueId; - if (Tags) { - serializationObject.tags = Tags.GetTags(this); + constructor(name69, imgUrl, scene, isBackground, color) { + this.name = name69; + this._applyPostProcess = true; + this.scale = new Vector2(1, 1); + this.offset = new Vector2(0, 0); + this.alphaBlendingMode = 2; + this.layerMask = 268435455; + this.renderTargetTextures = []; + this.renderOnlyInRenderTargetTextures = false; + this.isEnabled = true; + this._vertexBuffers = {}; + this.onDisposeObservable = new Observable(); + this.onBeforeRenderObservable = new Observable(); + this.onAfterRenderObservable = new Observable(); + this.texture = imgUrl ? new Texture(imgUrl, scene, true) : null; + this.isBackground = isBackground === void 0 ? true : isBackground; + this.color = color === void 0 ? new Color4(1, 1, 1, 1) : color; + this._scene = scene || EngineStore.LastCreatedScene; + let layerComponent = this._scene._getComponent(SceneComponentConstants.NAME_LAYER); + if (!layerComponent) { + layerComponent = new LayerSceneComponent(this._scene); + this._scene._addComponent(layerComponent); } - serializationObject.materialsUniqueIds = []; - serializationObject.materials = []; - for (let matIndex = 0; matIndex < this.subMaterials.length; matIndex++) { - const subMat = this.subMaterials[matIndex]; - if (subMat) { - serializationObject.materialsUniqueIds.push(subMat.uniqueId); - serializationObject.materials.push(subMat.id); - } else { - serializationObject.materialsUniqueIds.push(null); - serializationObject.materials.push(null); - } + this._scene.layers.push(this); + const engine = this._scene.getEngine(); + this._drawWrapper = new DrawWrapper(engine); + const vertices = []; + vertices.push(1, 1); + vertices.push(-1, 1); + vertices.push(-1, -1); + vertices.push(1, -1); + const vertexBuffer = new VertexBuffer(engine, vertices, VertexBuffer.PositionKind, false, false, 2); + this._vertexBuffers[VertexBuffer.PositionKind] = vertexBuffer; + this._createIndexBuffer(); + } + _createIndexBuffer() { + const engine = this._scene.getEngine(); + const indices = []; + indices.push(0); + indices.push(1); + indices.push(2); + indices.push(0); + indices.push(2); + indices.push(3); + this._indexBuffer = engine.createIndexBuffer(indices); + } + /** @internal */ + _rebuild() { + const vb = this._vertexBuffers[VertexBuffer.PositionKind]; + if (vb) { + vb._rebuild(); } - return serializationObject; + this._createIndexBuffer(); } /** - * Dispose the material and release its associated resources - * @param forceDisposeEffect Define if we want to force disposing the associated effect (if false the shader is not released and could be reuse later on) - * @param forceDisposeTextures Define if we want to force disposing the associated textures (if false, they will not be disposed and can still be use elsewhere in the app) - * @param forceDisposeChildren Define if we want to force disposing the associated submaterials (if false, they will not be disposed and can still be use elsewhere in the app) + * Checks if the layer is ready to be rendered + * @returns true if the layer is ready. False otherwise. */ - dispose(forceDisposeEffect, forceDisposeTextures, forceDisposeChildren) { - const scene = this.getScene(); - if (!scene) { - return; + isReady() { + var _a; + const engine = this._scene.getEngine(); + let defines = ""; + if (this.alphaTest) { + defines = "#define ALPHATEST"; } - if (forceDisposeChildren) { - for (let index2 = 0; index2 < this.subMaterials.length; index2++) { - const subMaterial = this.subMaterials[index2]; - if (subMaterial) { - subMaterial.dispose(forceDisposeEffect, forceDisposeTextures); - } - } + if (this.texture && !this.texture.gammaSpace) { + defines += "\n#define LINEAR"; } - const index = scene.multiMaterials.indexOf(this); - if (index >= 0) { - scene.multiMaterials.splice(index, 1); + if (this._previousDefines !== defines) { + this._previousDefines = defines; + this._drawWrapper.effect = engine.createEffect("layer", [VertexBuffer.PositionKind], ["textureMatrix", "color", "scale", "offset"], ["textureSampler"], defines); } - super.dispose(forceDisposeEffect, forceDisposeTextures); + const currentEffect = this._drawWrapper.effect; + return (currentEffect == null ? void 0 : currentEffect.isReady()) && ((_a = this.texture) == null ? void 0 : _a.isReady()); } /** - * Creates a MultiMaterial from parsed MultiMaterial data. - * @param parsedMultiMaterial defines parsed MultiMaterial data. - * @param scene defines the hosting scene - * @returns a new MultiMaterial + * Renders the layer in the scene. */ - static ParseMultiMaterial(parsedMultiMaterial, scene) { - const multiMaterial = new _MultiMaterial(parsedMultiMaterial.name, scene); - multiMaterial.id = parsedMultiMaterial.id; - multiMaterial._loadedUniqueId = parsedMultiMaterial.uniqueId; - if (Tags) { - Tags.AddTagsTo(multiMaterial, parsedMultiMaterial.tags); + render() { + if (!this.isEnabled) { + return; } - if (parsedMultiMaterial.materialsUniqueIds) { - multiMaterial._waitingSubMaterialsUniqueIds = parsedMultiMaterial.materialsUniqueIds; - } else { - parsedMultiMaterial.materials.forEach((subMatId) => multiMaterial.subMaterials.push(scene.getLastMaterialById(subMatId))); + const engine = this._scene.getEngine(); + if (!this.isReady()) { + return; } - return multiMaterial; - } -}; -RegisterClass("BABYLON.MultiMaterial", MultiMaterial); - -// node_modules/@babylonjs/core/Meshes/meshLODLevel.js -var MeshLODLevel = class { + const currentEffect = this._drawWrapper.effect; + this.onBeforeRenderObservable.notifyObservers(this); + engine.enableEffect(this._drawWrapper); + engine.setState(false); + currentEffect.setTexture("textureSampler", this.texture); + currentEffect.setMatrix("textureMatrix", this.texture.getTextureMatrix()); + currentEffect.setFloat4("color", this.color.r, this.color.g, this.color.b, this.color.a); + currentEffect.setVector2("offset", this.offset); + currentEffect.setVector2("scale", this.scale); + engine.bindBuffers(this._vertexBuffers, this._indexBuffer, currentEffect); + if (!this.alphaTest) { + engine.setAlphaMode(this.alphaBlendingMode); + engine.drawElementsType(Material.TriangleFillMode, 0, 6); + engine.setAlphaMode(0); + } else { + engine.drawElementsType(Material.TriangleFillMode, 0, 6); + } + this.onAfterRenderObservable.notifyObservers(this); + } /** - * Creates a new LOD level - * @param distanceOrScreenCoverage defines either the distance or the screen coverage where this level should start being displayed - * @param mesh defines the mesh to use to render this level + * Disposes and releases the associated resources. */ - constructor(distanceOrScreenCoverage, mesh) { - this.distanceOrScreenCoverage = distanceOrScreenCoverage; - this.mesh = mesh; + dispose() { + const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind]; + if (vertexBuffer) { + vertexBuffer.dispose(); + this._vertexBuffers[VertexBuffer.PositionKind] = null; + } + if (this._indexBuffer) { + this._scene.getEngine()._releaseBuffer(this._indexBuffer); + this._indexBuffer = null; + } + if (this.texture) { + this.texture.dispose(); + this.texture = null; + } + this.renderTargetTextures = []; + const index = this._scene.layers.indexOf(this); + this._scene.layers.splice(index, 1); + this.onDisposeObservable.notifyObservers(this); + this.onDisposeObservable.clear(); + this.onAfterRenderObservable.clear(); + this.onBeforeRenderObservable.clear(); } }; -// node_modules/@babylonjs/core/Meshes/mesh.js -var _CreationDataStorage = class { -}; -var _InstanceDataStorage = class { - constructor() { - this.visibleInstances = {}; - this.batchCache = new _InstancesBatch(); - this.batchCacheReplacementModeInFrozenMode = new _InstancesBatch(); - this.instancesBufferSize = 32 * 16 * 4; +// node_modules/@babylonjs/core/Maths/math.viewport.js +var Viewport = class _Viewport { + /** + * Creates a Viewport object located at (x, y) and sized (width, height) + * @param x defines viewport left coordinate + * @param y defines viewport top coordinate + * @param width defines the viewport width + * @param height defines the viewport height + */ + constructor(x, y, width, height) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; } -}; -var _InstancesBatch = class { - constructor() { - this.mustReturn = false; - this.visibleInstances = new Array(); - this.renderSelf = []; - this.hardwareInstancedRendering = []; + /** + * Creates a new viewport using absolute sizing (from 0-> width, 0-> height instead of 0->1) + * @param renderWidth defines the rendering width + * @param renderHeight defines the rendering height + * @returns a new Viewport + */ + toGlobal(renderWidth, renderHeight) { + return new _Viewport(this.x * renderWidth, this.y * renderHeight, this.width * renderWidth, this.height * renderHeight); } -}; -var _ThinInstanceDataStorage = class { - constructor() { - this.instancesCount = 0; - this.matrixBuffer = null; - this.previousMatrixBuffer = null; - this.matrixBufferSize = 32 * 16; - this.matrixData = null; - this.boundingVectors = []; - this.worldMatrices = null; + /** + * Stores absolute viewport value into a target viewport (from 0-> width, 0-> height instead of 0->1) + * @param renderWidth defines the rendering width + * @param renderHeight defines the rendering height + * @param ref defines the target viewport + * @returns the current viewport + */ + toGlobalToRef(renderWidth, renderHeight, ref) { + ref.x = this.x * renderWidth; + ref.y = this.y * renderHeight; + ref.width = this.width * renderWidth; + ref.height = this.height * renderHeight; + return this; } -}; -var _InternalMeshDataInfo = class { - constructor() { - this._areNormalsFrozen = false; - this._source = null; - this.meshMap = null; - this._preActivateId = -1; - this._LODLevels = new Array(); - this._useLODScreenCoverage = false; - this._effectiveMaterial = null; - this._forcedInstanceCount = 0; - this._overrideRenderingFillMode = null; + /** + * Returns a new Viewport copied from the current one + * @returns a new Viewport + */ + clone() { + return new _Viewport(this.x, this.y, this.width, this.height); } }; -var Mesh = class _Mesh extends AbstractMesh { + +// node_modules/@babylonjs/core/Cameras/camera.js +var Camera = class _Camera extends Node { /** - * Gets the default side orientation. - * @param orientation the orientation to value to attempt to get - * @returns the default orientation - * @internal + * Define the current local position of the camera in the scene */ - static _GetDefaultSideOrientation(orientation) { - return orientation || _Mesh.FRONTSIDE; + get position() { + return this._position; + } + set position(newPosition) { + this._position = newPosition; } /** - * Determines if the LOD levels are intended to be calculated using screen coverage (surface area ratio) instead of distance. + * The vector the camera should consider as up. + * (default is Vector3(0, 1, 0) aka Vector3.Up()) */ - get useLODScreenCoverage() { - return this._internalMeshDataInfo._useLODScreenCoverage; - } - set useLODScreenCoverage(value) { - this._internalMeshDataInfo._useLODScreenCoverage = value; - this._sortLODLevels(); + set upVector(vec) { + this._upVector = vec; } - get computeBonesUsingShaders() { - return this._internalAbstractMeshDataInfo._computeBonesUsingShaders; + get upVector() { + return this._upVector; } - set computeBonesUsingShaders(value) { - if (this._internalAbstractMeshDataInfo._computeBonesUsingShaders === value) { - return; - } - if (value && this._internalMeshDataInfo._sourcePositions) { - this.setVerticesData(VertexBuffer.PositionKind, this._internalMeshDataInfo._sourcePositions, true); - if (this._internalMeshDataInfo._sourceNormals) { - this.setVerticesData(VertexBuffer.NormalKind, this._internalMeshDataInfo._sourceNormals, true); + /** + * The screen area in scene units squared + */ + get screenArea() { + let x = 0; + let y = 0; + if (this.mode === _Camera.PERSPECTIVE_CAMERA) { + if (this.fovMode === _Camera.FOVMODE_VERTICAL_FIXED) { + y = this.minZ * 2 * Math.tan(this.fov / 2); + x = this.getEngine().getAspectRatio(this) * y; + } else { + x = this.minZ * 2 * Math.tan(this.fov / 2); + y = x / this.getEngine().getAspectRatio(this); } - this._internalMeshDataInfo._sourcePositions = null; - this._internalMeshDataInfo._sourceNormals = null; + } else { + const halfWidth = this.getEngine().getRenderWidth() / 2; + const halfHeight = this.getEngine().getRenderHeight() / 2; + x = (this.orthoRight ?? halfWidth) - (this.orthoLeft ?? -halfWidth); + y = (this.orthoTop ?? halfHeight) - (this.orthoBottom ?? -halfHeight); } - this._internalAbstractMeshDataInfo._computeBonesUsingShaders = value; - this._markSubMeshesAsAttributesDirty(); + return x * y; } /** - * An event triggered before rendering the mesh + * Define the current limit on the left side for an orthographic camera + * In scene unit */ - get onBeforeRenderObservable() { - if (!this._internalMeshDataInfo._onBeforeRenderObservable) { - this._internalMeshDataInfo._onBeforeRenderObservable = new Observable(); + set orthoLeft(value) { + this._orthoLeft = value; + for (const rigCamera of this._rigCameras) { + rigCamera.orthoLeft = value; } - return this._internalMeshDataInfo._onBeforeRenderObservable; + } + get orthoLeft() { + return this._orthoLeft; } /** - * An event triggered before binding the mesh + * Define the current limit on the right side for an orthographic camera + * In scene unit */ - get onBeforeBindObservable() { - if (!this._internalMeshDataInfo._onBeforeBindObservable) { - this._internalMeshDataInfo._onBeforeBindObservable = new Observable(); + set orthoRight(value) { + this._orthoRight = value; + for (const rigCamera of this._rigCameras) { + rigCamera.orthoRight = value; } - return this._internalMeshDataInfo._onBeforeBindObservable; + } + get orthoRight() { + return this._orthoRight; } /** - * An event triggered after rendering the mesh + * Define the current limit on the bottom side for an orthographic camera + * In scene unit */ - get onAfterRenderObservable() { - if (!this._internalMeshDataInfo._onAfterRenderObservable) { - this._internalMeshDataInfo._onAfterRenderObservable = new Observable(); + set orthoBottom(value) { + this._orthoBottom = value; + for (const rigCamera of this._rigCameras) { + rigCamera.orthoBottom = value; } - return this._internalMeshDataInfo._onAfterRenderObservable; + } + get orthoBottom() { + return this._orthoBottom; } /** - * An event triggeredbetween rendering pass when using separateCullingPass = true + * Define the current limit on the top side for an orthographic camera + * In scene unit */ - get onBetweenPassObservable() { - if (!this._internalMeshDataInfo._onBetweenPassObservable) { - this._internalMeshDataInfo._onBetweenPassObservable = new Observable(); + set orthoTop(value) { + this._orthoTop = value; + for (const rigCamera of this._rigCameras) { + rigCamera.orthoTop = value; } - return this._internalMeshDataInfo._onBetweenPassObservable; + } + get orthoTop() { + return this._orthoTop; } /** - * An event triggered before drawing the mesh + * Define the mode of the camera (Camera.PERSPECTIVE_CAMERA or Camera.ORTHOGRAPHIC_CAMERA) */ - get onBeforeDrawObservable() { - if (!this._internalMeshDataInfo._onBeforeDrawObservable) { - this._internalMeshDataInfo._onBeforeDrawObservable = new Observable(); + set mode(mode) { + this._mode = mode; + for (const rigCamera of this._rigCameras) { + rigCamera.mode = mode; } - return this._internalMeshDataInfo._onBeforeDrawObservable; + } + get mode() { + return this._mode; } /** - * Sets a callback to call before drawing the mesh. It is recommended to use onBeforeDrawObservable instead + * Gets a flag indicating that the camera has moved in some way since the last call to Camera.update() */ - set onBeforeDraw(callback) { - if (this._onBeforeDrawObserver) { - this.onBeforeDrawObservable.remove(this._onBeforeDrawObserver); + get hasMoved() { + return this._hasMoved; + } + /** + * Instantiates a new camera object. + * This should not be used directly but through the inherited cameras: ArcRotate, Free... + * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras + * @param name Defines the name of the camera in the scene + * @param position Defines the position of the camera + * @param scene Defines the scene the camera belongs too + * @param setActiveOnSceneIfNoneActive Defines if the camera should be set as active after creation if no other camera have been defined in the scene + */ + constructor(name69, position, scene, setActiveOnSceneIfNoneActive = true) { + super(name69, scene); + this._position = Vector3.Zero(); + this._upVector = Vector3.Up(); + this.oblique = null; + this._orthoLeft = null; + this._orthoRight = null; + this._orthoBottom = null; + this._orthoTop = null; + this.fov = 0.8; + this.projectionPlaneTilt = 0; + this.minZ = 1; + this.maxZ = 1e4; + this.inertia = 0.9; + this._mode = _Camera.PERSPECTIVE_CAMERA; + this.isIntermediate = false; + this.viewport = new Viewport(0, 0, 1, 1); + this.layerMask = 268435455; + this.fovMode = _Camera.FOVMODE_VERTICAL_FIXED; + this.cameraRigMode = _Camera.RIG_MODE_NONE; + this.customRenderTargets = []; + this.outputRenderTarget = null; + this.onViewMatrixChangedObservable = new Observable(); + this.onProjectionMatrixChangedObservable = new Observable(); + this.onAfterCheckInputsObservable = new Observable(); + this.onRestoreStateObservable = new Observable(); + this.isRigCamera = false; + this._hasMoved = false; + this._rigCameras = new Array(); + this._skipRendering = false; + this._projectionMatrix = new Matrix(); + this._postProcesses = new Array(); + this._activeMeshes = new SmartArray(256); + this._globalPosition = Vector3.Zero(); + this._computedViewMatrix = Matrix.Identity(); + this._doNotComputeProjectionMatrix = false; + this._transformMatrix = Matrix.Zero(); + this._refreshFrustumPlanes = true; + this._absoluteRotation = Quaternion.Identity(); + this._isCamera = true; + this._isLeftCamera = false; + this._isRightCamera = false; + this.getScene().addCamera(this); + if (setActiveOnSceneIfNoneActive && !this.getScene().activeCamera) { + this.getScene().activeCamera = this; } - this._onBeforeDrawObserver = this.onBeforeDrawObservable.add(callback); + this.position = position; + this.renderPassId = this.getScene().getEngine().createRenderPassId(`Camera ${name69}`); } - get hasInstances() { - return this.instances.length > 0; + /** + * Store current camera state (fov, position, etc..) + * @returns the camera + */ + storeState() { + this._stateStored = true; + this._storedFov = this.fov; + return this; } - get hasThinInstances() { - return (this.forcedInstanceCount || this._thinInstanceDataStorage.instancesCount || 0) > 0; + /** + * Restores the camera state values if it has been stored. You must call storeState() first + * @returns true if restored and false otherwise + */ + _restoreStateValues() { + if (!this._stateStored) { + return false; + } + this.fov = this._storedFov; + return true; } /** - * Gets or sets the forced number of instances to display. - * If 0 (default value), the number of instances is not forced and depends on the draw type - * (regular / instance / thin instances mesh) + * Restored camera state. You must call storeState() first. + * @returns true if restored and false otherwise */ - get forcedInstanceCount() { - return this._internalMeshDataInfo._forcedInstanceCount; + restoreState() { + if (this._restoreStateValues()) { + this.onRestoreStateObservable.notifyObservers(this); + return true; + } + return false; } - set forcedInstanceCount(count) { - this._internalMeshDataInfo._forcedInstanceCount = count; + /** + * Gets the class name of the camera. + * @returns the class name + */ + getClassName() { + return "Camera"; } /** - * Use this property to override the Material's fillMode value + * Gets a string representation of the camera useful for debug purpose. + * @param fullDetails Defines that a more verbose level of logging is required + * @returns the string representation */ - get overrideRenderingFillMode() { - return this._internalMeshDataInfo._overrideRenderingFillMode; + toString(fullDetails) { + let ret = "Name: " + this.name; + ret += ", type: " + this.getClassName(); + if (this.animations) { + for (let i = 0; i < this.animations.length; i++) { + ret += ", animation[0]: " + this.animations[i].toString(fullDetails); + } + } + return ret; } - set overrideRenderingFillMode(fillMode) { - this._internalMeshDataInfo._overrideRenderingFillMode = fillMode; + /** + * Automatically tilts the projection plane, using `projectionPlaneTilt`, to correct the perspective effect on vertical lines. + */ + applyVerticalCorrection() { + const rot = this.absoluteRotation.toEulerAngles(); + this.projectionPlaneTilt = this._scene.useRightHandedSystem ? -rot.x : rot.x; } /** - * Gets the source mesh (the one used to clone this one from) + * Gets the current world space position of the camera. */ - get source() { - return this._internalMeshDataInfo._source; + get globalPosition() { + return this._globalPosition; } /** - * Gets the list of clones of this mesh - * The scene must have been constructed with useClonedMeshMap=true for this to work! - * Note that useClonedMeshMap=true is the default setting + * Gets the list of active meshes this frame (meshes no culled or excluded by lod s in the frame) + * @returns the active meshe list */ - get cloneMeshMap() { - return this._internalMeshDataInfo.meshMap; + getActiveMeshes() { + return this._activeMeshes; } /** - * Gets or sets a boolean indicating that this mesh does not use index buffer + * Check whether a mesh is part of the current active mesh list of the camera + * @param mesh Defines the mesh to check + * @returns true if active, false otherwise */ - get isUnIndexed() { - return this._unIndexed; + isActiveMesh(mesh) { + return this._activeMeshes.indexOf(mesh) !== -1; } - set isUnIndexed(value) { - if (this._unIndexed !== value) { - this._unIndexed = value; - this._markSubMeshesAsAttributesDirty(); + /** + * Is this camera ready to be used/rendered + * @param completeCheck defines if a complete check (including post processes) has to be done (false by default) + * @returns true if the camera is ready + */ + isReady(completeCheck = false) { + if (completeCheck) { + for (const pp of this._postProcesses) { + if (pp && !pp.isReady()) { + return false; + } + } } + return super.isReady(completeCheck); } - /** Gets the array buffer used to store the instanced buffer used for instances' world matrices */ - get worldMatrixInstancedBuffer() { - return this._instanceDataStorage.instancesData; - } - /** Gets the array buffer used to store the instanced buffer used for instances' previous world matrices */ - get previousWorldMatrixInstancedBuffer() { - return this._instanceDataStorage.instancesPreviousData; - } - /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */ - get manualUpdateOfWorldMatrixInstancedBuffer() { - return this._instanceDataStorage.manualUpdate; - } - set manualUpdateOfWorldMatrixInstancedBuffer(value) { - this._instanceDataStorage.manualUpdate = value; + /** @internal */ + _initCache() { + super._initCache(); + this._cache.position = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); + this._cache.upVector = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); + this._cache.mode = void 0; + this._cache.minZ = void 0; + this._cache.maxZ = void 0; + this._cache.fov = void 0; + this._cache.fovMode = void 0; + this._cache.aspectRatio = void 0; + this._cache.orthoLeft = void 0; + this._cache.orthoRight = void 0; + this._cache.orthoBottom = void 0; + this._cache.orthoTop = void 0; + this._cache.obliqueAngle = void 0; + this._cache.obliqueLength = void 0; + this._cache.obliqueOffset = void 0; + this._cache.renderWidth = void 0; + this._cache.renderHeight = void 0; } - /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */ - get manualUpdateOfPreviousWorldMatrixInstancedBuffer() { - return this._instanceDataStorage.previousManualUpdate; + /** + * @internal + */ + _updateCache(ignoreParentClass) { + if (!ignoreParentClass) { + super._updateCache(); + } + this._cache.position.copyFrom(this.position); + this._cache.upVector.copyFrom(this.upVector); } - set manualUpdateOfPreviousWorldMatrixInstancedBuffer(value) { - this._instanceDataStorage.previousManualUpdate = value; + /** @internal */ + _isSynchronized() { + return this._isSynchronizedViewMatrix() && this._isSynchronizedProjectionMatrix(); } - /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices must be performed in all cases (and notably even in frozen mode) */ - get forceWorldMatrixInstancedBufferUpdate() { - return this._instanceDataStorage.forceMatrixUpdates; + /** @internal */ + _isSynchronizedViewMatrix() { + if (!super._isSynchronized()) { + return false; + } + return this._cache.position.equals(this.position) && this._cache.upVector.equals(this.upVector) && this.isSynchronizedWithParent(); } - set forceWorldMatrixInstancedBufferUpdate(value) { - this._instanceDataStorage.forceMatrixUpdates = value; + /** @internal */ + _isSynchronizedProjectionMatrix() { + let isSynchronized = this._cache.mode === this.mode && this._cache.minZ === this.minZ && this._cache.maxZ === this.maxZ; + if (!isSynchronized) { + return false; + } + const engine = this.getEngine(); + if (this.mode === _Camera.PERSPECTIVE_CAMERA) { + isSynchronized = this._cache.fov === this.fov && this._cache.fovMode === this.fovMode && this._cache.aspectRatio === engine.getAspectRatio(this) && this._cache.projectionPlaneTilt === this.projectionPlaneTilt; + } else { + isSynchronized = this._cache.orthoLeft === this.orthoLeft && this._cache.orthoRight === this.orthoRight && this._cache.orthoBottom === this.orthoBottom && this._cache.orthoTop === this.orthoTop && this._cache.renderWidth === engine.getRenderWidth() && this._cache.renderHeight === engine.getRenderHeight(); + if (this.oblique) { + isSynchronized = isSynchronized && this._cache.obliqueAngle === this.oblique.angle && this._cache.obliqueLength === this.oblique.length && this._cache.obliqueOffset === this.oblique.offset; + } + } + return isSynchronized; } /** - * @constructor - * @param name The value used by scene.getMeshByName() to do a lookup. - * @param scene The scene to add this mesh to. - * @param parent The parent of this mesh, if it has one - * @param source An optional Mesh from which geometry is shared, cloned. - * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False. - * When false, achieved by calling a clone(), also passing False. - * This will make creation of children, recursive. - * @param clonePhysicsImpostor When cloning, include cloning mesh physics impostor, default True. + * Attach the input controls to a specific dom element to get the input from. + * This function is here because typescript removes the typing of the last function. + * @param _ignored defines an ignored parameter kept for backward compatibility. + * @param _noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault) */ - constructor(name69, scene = null, parent = null, source = null, doNotCloneChildren, clonePhysicsImpostor = true) { - super(name69, scene); - this._internalMeshDataInfo = new _InternalMeshDataInfo(); - this.delayLoadState = 0; - this.instances = []; - this._creationDataStorage = null; - this._geometry = null; - this._instanceDataStorage = new _InstanceDataStorage(); - this._thinInstanceDataStorage = new _ThinInstanceDataStorage(); - this._shouldGenerateFlatShading = false; - this._originalBuilderSideOrientation = _Mesh.DEFAULTSIDE; - this.overrideMaterialSideOrientation = null; - this.ignoreCameraMaxZ = false; - scene = this.getScene(); - this._onBeforeDraw = (isInstance, world, effectiveMaterial) => { - if (isInstance && effectiveMaterial) { - if (this._uniformBuffer) { - this.transferToEffect(world); - } else { - effectiveMaterial.bindOnlyWorldMatrix(world); - } - } - }; - if (source) { - if (source._geometry) { - source._geometry.applyToMesh(this); - } - DeepCopier.DeepCopy(source, this, [ - "name", - "material", - "skeleton", - "instances", - "parent", - "uniqueId", - "source", - "metadata", - "morphTargetManager", - "hasInstances", - "worldMatrixInstancedBuffer", - "previousWorldMatrixInstancedBuffer", - "hasLODLevels", - "geometry", - "isBlocked", - "areNormalsFrozen", - "facetNb", - "isFacetDataEnabled", - "lightSources", - "useBones", - "isAnInstance", - "collider", - "edgesRenderer", - "forward", - "up", - "right", - "absolutePosition", - "absoluteScaling", - "absoluteRotationQuaternion", - "isWorldMatrixFrozen", - "nonUniformScaling", - "behaviors", - "worldMatrixFromCache", - "hasThinInstances", - "cloneMeshMap", - "hasBoundingInfo", - "physicsBody", - "physicsImpostor" - ], ["_poseMatrix"]); - this._internalMeshDataInfo._source = source; - if (scene.useClonedMeshMap) { - if (!source._internalMeshDataInfo.meshMap) { - source._internalMeshDataInfo.meshMap = {}; - } - source._internalMeshDataInfo.meshMap[this.uniqueId] = this; - } - this._originalBuilderSideOrientation = source._originalBuilderSideOrientation; - this._creationDataStorage = source._creationDataStorage; - if (source._ranges) { - const ranges = source._ranges; - for (const name70 in ranges) { - if (!Object.prototype.hasOwnProperty.call(ranges, name70)) { - continue; - } - if (!ranges[name70]) { - continue; - } - this.createAnimationRange(name70, ranges[name70].from, ranges[name70].to); - } - } - if (source.metadata && source.metadata.clone) { - this.metadata = source.metadata.clone(); - } else { - this.metadata = source.metadata; - } - this._internalMetadata = source._internalMetadata; - if (Tags && Tags.HasTags(source)) { - Tags.AddTagsTo(this, Tags.GetTags(source, true)); - } - this.setEnabled(source.isEnabled(false)); - this.parent = source.parent; - this.setPivotMatrix(source.getPivotMatrix(), this._postMultiplyPivotMatrix); - this.id = name69 + "." + source.id; - this.material = source.material; - if (!doNotCloneChildren) { - const directDescendants = source.getDescendants(true); - for (let index = 0; index < directDescendants.length; index++) { - const child = directDescendants[index]; - if (child.clone) { - child.clone(name69 + "." + child.name, this); - } - } - } - if (source.morphTargetManager) { - this.morphTargetManager = source.morphTargetManager; - } - if (scene.getPhysicsEngine) { - const physicsEngine = scene.getPhysicsEngine(); - if (clonePhysicsImpostor && physicsEngine) { - if (physicsEngine.getPluginVersion() === 1) { - const impostor = physicsEngine.getImpostorForPhysicsObject(source); - if (impostor) { - this.physicsImpostor = impostor.clone(this); - } - } else if (physicsEngine.getPluginVersion() === 2) { - if (source.physicsBody) { - source.physicsBody.clone(this); - } - } - } - } - for (let index = 0; index < scene.particleSystems.length; index++) { - const system = scene.particleSystems[index]; - if (system.emitter === source) { - system.clone(system.name, this); - } - } - this.skeleton = source.skeleton; - this.refreshBoundingInfo(true, true); - this.computeWorldMatrix(true); - } - if (parent !== null) { - this.parent = parent; - } - this._instanceDataStorage.hardwareInstancedRendering = this.getEngine().getCaps().instancedArrays; - this._internalMeshDataInfo._onMeshReadyObserverAdded = (observer2) => { - observer2.unregisterOnNextCall = true; - if (this.isReady(true)) { - this.onMeshReadyObservable.notifyObservers(this); - } else { - if (!this._internalMeshDataInfo._checkReadinessObserver) { - this._internalMeshDataInfo._checkReadinessObserver = this._scene.onBeforeRenderObservable.add(() => { - if (this.isReady(true)) { - this._scene.onBeforeRenderObservable.remove(this._internalMeshDataInfo._checkReadinessObserver); - this._internalMeshDataInfo._checkReadinessObserver = null; - this.onMeshReadyObservable.notifyObservers(this); - } - }); - } - } - }; - this.onMeshReadyObservable = new Observable(this._internalMeshDataInfo._onMeshReadyObserverAdded); - if (source) { - source.onClonedObservable.notifyObservers(this); - } - } - instantiateHierarchy(newParent = null, options, onNewNodeCreated) { - const instance = this.getTotalVertices() === 0 || options && options.doNotInstantiate && (options.doNotInstantiate === true || options.doNotInstantiate(this)) ? this.clone("Clone of " + (this.name || this.id), newParent || this.parent, true) : this.createInstance("instance of " + (this.name || this.id)); - instance.parent = newParent || this.parent; - instance.position = this.position.clone(); - instance.scaling = this.scaling.clone(); - if (this.rotationQuaternion) { - instance.rotationQuaternion = this.rotationQuaternion.clone(); - } else { - instance.rotation = this.rotation.clone(); - } - if (onNewNodeCreated) { - onNewNodeCreated(this, instance); - } - for (const child of this.getChildTransformNodes(true)) { - if (child.getClassName() === "InstancedMesh" && instance.getClassName() === "Mesh" && child.sourceMesh === this) { - child.instantiateHierarchy(instance, { - doNotInstantiate: options && options.doNotInstantiate || false, - newSourcedMesh: instance - }, onNewNodeCreated); - } else { - child.instantiateHierarchy(instance, options, onNewNodeCreated); - } - } - return instance; + attachControl(_ignored, _noPreventDefault) { } /** - * Gets the class name - * @returns the string "Mesh". + * Detach the current controls from the specified dom element. + * This function is here because typescript removes the typing of the last function. + * @param _ignored defines an ignored parameter kept for backward compatibility. */ - getClassName() { - return "Mesh"; - } - /** @internal */ - get _isMesh() { - return true; + detachControl(_ignored) { } /** - * Returns a description of this mesh - * @param fullDetails define if full details about this mesh must be used - * @returns a descriptive string representing this mesh + * Update the camera state according to the different inputs gathered during the frame. */ - toString(fullDetails) { - let ret = super.toString(fullDetails); - ret += ", n vertices: " + this.getTotalVertices(); - ret += ", parent: " + (this._waitingParentId ? this._waitingParentId : this.parent ? this.parent.name : "NONE"); - if (this.animations) { - for (let i = 0; i < this.animations.length; i++) { - ret += ", animation[0]: " + this.animations[i].toString(fullDetails); - } - } - if (fullDetails) { - if (this._geometry) { - const ib = this.getIndices(); - const vb = this.getVerticesData(VertexBuffer.PositionKind); - if (vb && ib) { - ret += ", flat shading: " + (vb.length / 3 === ib.length ? "YES" : "NO"); - } - } else { - ret += ", flat shading: UNKNOWN"; - } + update() { + this._hasMoved = false; + this._checkInputs(); + if (this.cameraRigMode !== _Camera.RIG_MODE_NONE) { + this._updateRigCameras(); } - return ret; + this.getViewMatrix(); + this.getProjectionMatrix(); } /** @internal */ - _unBindEffect() { - super._unBindEffect(); - for (const instance of this.instances) { - instance._unBindEffect(); - } + _checkInputs() { + this.onAfterCheckInputsObservable.notifyObservers(this); + } + /** @internal */ + get rigCameras() { + return this._rigCameras; } /** - * Gets a boolean indicating if this mesh has LOD + * Gets the post process used by the rig cameras */ - get hasLODLevels() { - return this._internalMeshDataInfo._LODLevels.length > 0; + get rigPostProcess() { + return this._rigPostProcess; } /** - * Gets the list of MeshLODLevel associated with the current mesh - * @returns an array of MeshLODLevel + * Internal, gets the first post process. + * @returns the first post process to be run on this camera. */ - getLODLevels() { - return this._internalMeshDataInfo._LODLevels; - } - _sortLODLevels() { - const sortingOrderFactor = this._internalMeshDataInfo._useLODScreenCoverage ? -1 : 1; - this._internalMeshDataInfo._LODLevels.sort((a, b) => { - if (a.distanceOrScreenCoverage < b.distanceOrScreenCoverage) { - return sortingOrderFactor; + _getFirstPostProcess() { + for (let ppIndex = 0; ppIndex < this._postProcesses.length; ppIndex++) { + if (this._postProcesses[ppIndex] !== null) { + return this._postProcesses[ppIndex]; } - if (a.distanceOrScreenCoverage > b.distanceOrScreenCoverage) { - return -sortingOrderFactor; + } + return null; + } + _cascadePostProcessesToRigCams() { + const firstPostProcess = this._getFirstPostProcess(); + if (firstPostProcess) { + firstPostProcess.markTextureDirty(); + } + for (let i = 0, len = this._rigCameras.length; i < len; i++) { + const cam = this._rigCameras[i]; + const rigPostProcess = cam._rigPostProcess; + if (rigPostProcess) { + const isPass = rigPostProcess.getEffectName() === "pass"; + if (isPass) { + cam.isIntermediate = this._postProcesses.length === 0; + } + cam._postProcesses = this._postProcesses.slice(0).concat(rigPostProcess); + rigPostProcess.markTextureDirty(); + } else { + cam._postProcesses = this._postProcesses.slice(0); } - return 0; - }); + } } /** - * Add a mesh as LOD level triggered at the given distance. - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD - * @param distanceOrScreenCoverage Either distance from the center of the object to show this level or the screen coverage if `useScreenCoverage` is set to `true`. - * If screen coverage, value is a fraction of the screen's total surface, between 0 and 1. - * Example Playground for distance https://playground.babylonjs.com/#QE7KM#197 - * Example Playground for screen coverage https://playground.babylonjs.com/#QE7KM#196 - * @param mesh The mesh to be added as LOD level (can be null) - * @returns This mesh (for chaining) + * Attach a post process to the camera. + * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#attach-postprocess + * @param postProcess The post process to attach to the camera + * @param insertAt The position of the post process in case several of them are in use in the scene + * @returns the position the post process has been inserted at */ - addLODLevel(distanceOrScreenCoverage, mesh) { - if (mesh && mesh._masterMesh) { - Logger.Warn("You cannot use a mesh as LOD level twice"); - return this; + attachPostProcess(postProcess, insertAt = null) { + if (!postProcess.isReusable() && this._postProcesses.indexOf(postProcess) > -1) { + Logger.Error("You're trying to reuse a post process not defined as reusable."); + return 0; } - const level = new MeshLODLevel(distanceOrScreenCoverage, mesh); - this._internalMeshDataInfo._LODLevels.push(level); - if (mesh) { - mesh._masterMesh = this; + if (insertAt == null || insertAt < 0) { + this._postProcesses.push(postProcess); + } else if (this._postProcesses[insertAt] === null) { + this._postProcesses[insertAt] = postProcess; + } else { + this._postProcesses.splice(insertAt, 0, postProcess); } - this._sortLODLevels(); - return this; + this._cascadePostProcessesToRigCams(); + if (this._scene.prePassRenderer) { + this._scene.prePassRenderer.markAsDirty(); + } + return this._postProcesses.indexOf(postProcess); } /** - * Returns the LOD level mesh at the passed distance or null if not found. - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD - * @param distance The distance from the center of the object to show this level - * @returns a Mesh or `null` + * Detach a post process to the camera. + * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#attach-postprocess + * @param postProcess The post process to detach from the camera */ - getLODLevelAtDistance(distance) { - const internalDataInfo = this._internalMeshDataInfo; - for (let index = 0; index < internalDataInfo._LODLevels.length; index++) { - const level = internalDataInfo._LODLevels[index]; - if (level.distanceOrScreenCoverage === distance) { - return level.mesh; - } + detachPostProcess(postProcess) { + const idx = this._postProcesses.indexOf(postProcess); + if (idx !== -1) { + this._postProcesses[idx] = null; } - return null; + if (this._scene.prePassRenderer) { + this._scene.prePassRenderer.markAsDirty(); + } + this._cascadePostProcessesToRigCams(); } /** - * Remove a mesh from the LOD array - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD - * @param mesh defines the mesh to be removed - * @returns This mesh (for chaining) + * Gets the current world matrix of the camera + * @returns the world matrix */ - removeLODLevel(mesh) { - const internalDataInfo = this._internalMeshDataInfo; - for (let index = 0; index < internalDataInfo._LODLevels.length; index++) { - if (internalDataInfo._LODLevels[index].mesh === mesh) { - internalDataInfo._LODLevels.splice(index, 1); - if (mesh) { - mesh._masterMesh = null; - } - } + getWorldMatrix() { + if (this._isSynchronizedViewMatrix()) { + return this._worldMatrix; } - this._sortLODLevels(); - return this; + this.getViewMatrix(); + return this._worldMatrix; + } + /** @internal */ + _getViewMatrix() { + return Matrix.Identity(); } /** - * Returns the registered LOD mesh distant from the parameter `camera` position if any, else returns the current mesh. - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD - * @param camera defines the camera to use to compute distance - * @param boundingSphere defines a custom bounding sphere to use instead of the one from this mesh - * @returns This mesh (for chaining) + * Gets the current view matrix of the camera. + * @param force forces the camera to recompute the matrix without looking at the cached state + * @returns the view matrix */ - getLOD(camera, boundingSphere) { - const internalDataInfo = this._internalMeshDataInfo; - if (!internalDataInfo._LODLevels || internalDataInfo._LODLevels.length === 0) { - return this; - } - const bSphere = boundingSphere || this.getBoundingInfo().boundingSphere; - const distanceToCamera = camera.mode === Camera.ORTHOGRAPHIC_CAMERA ? camera.minZ : bSphere.centerWorld.subtract(camera.globalPosition).length(); - let compareValue = distanceToCamera; - let compareSign = 1; - if (internalDataInfo._useLODScreenCoverage) { - const screenArea = camera.screenArea; - let meshArea = bSphere.radiusWorld * camera.minZ / distanceToCamera; - meshArea = meshArea * meshArea * Math.PI; - compareValue = meshArea / screenArea; - compareSign = -1; - } - if (compareSign * internalDataInfo._LODLevels[internalDataInfo._LODLevels.length - 1].distanceOrScreenCoverage > compareSign * compareValue) { - if (this.onLODLevelSelection) { - this.onLODLevelSelection(compareValue, this, this); - } - return this; + getViewMatrix(force) { + if (!force && this._isSynchronizedViewMatrix()) { + return this._computedViewMatrix; } - for (let index = 0; index < internalDataInfo._LODLevels.length; index++) { - const level = internalDataInfo._LODLevels[index]; - if (compareSign * level.distanceOrScreenCoverage < compareSign * compareValue) { - if (level.mesh) { - if (level.mesh.delayLoadState === 4) { - level.mesh._checkDelayState(); - return this; - } - if (level.mesh.delayLoadState === 2) { - return this; - } - level.mesh._preActivate(); - level.mesh._updateSubMeshesBoundingInfo(this.worldMatrixFromCache); - } - if (this.onLODLevelSelection) { - this.onLODLevelSelection(compareValue, this, level.mesh); - } - return level.mesh; - } + this._hasMoved = true; + this.updateCache(); + this._computedViewMatrix = this._getViewMatrix(); + this._currentRenderId = this.getScene().getRenderId(); + this._childUpdateId++; + this._refreshFrustumPlanes = true; + if (this._cameraRigParams && this._cameraRigParams.vrPreViewMatrix) { + this._computedViewMatrix.multiplyToRef(this._cameraRigParams.vrPreViewMatrix, this._computedViewMatrix); } - if (this.onLODLevelSelection) { - this.onLODLevelSelection(compareValue, this, this); + if (this.parent && this.parent.onViewMatrixChangedObservable) { + this.parent.onViewMatrixChangedObservable.notifyObservers(this.parent); } - return this; + this.onViewMatrixChangedObservable.notifyObservers(this); + this._computedViewMatrix.invertToRef(this._worldMatrix); + return this._computedViewMatrix; } /** - * Gets the mesh internal Geometry object + * Freeze the projection matrix. + * It will prevent the cache check of the camera projection compute and can speed up perf + * if no parameter of the camera are meant to change + * @param projection Defines manually a projection if necessary */ - get geometry() { - return this._geometry; + freezeProjectionMatrix(projection) { + this._doNotComputeProjectionMatrix = true; + if (projection !== void 0) { + this._projectionMatrix = projection; + } } /** - * Returns the total number of vertices within the mesh geometry or zero if the mesh has no geometry. - * @returns the total number of vertices + * Unfreeze the projection matrix if it has previously been freezed by freezeProjectionMatrix. */ - getTotalVertices() { - if (this._geometry === null || this._geometry === void 0) { - return 0; - } - return this._geometry.getTotalVertices(); + unfreezeProjectionMatrix() { + this._doNotComputeProjectionMatrix = false; } /** - * Returns the content of an associated vertex buffer - * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values : - * - VertexBuffer.PositionKind - * - VertexBuffer.UVKind - * - VertexBuffer.UV2Kind - * - VertexBuffer.UV3Kind - * - VertexBuffer.UV4Kind - * - VertexBuffer.UV5Kind - * - VertexBuffer.UV6Kind - * - VertexBuffer.ColorKind - * - VertexBuffer.MatricesIndicesKind - * - VertexBuffer.MatricesIndicesExtraKind - * - VertexBuffer.MatricesWeightsKind - * - VertexBuffer.MatricesWeightsExtraKind - * @param copyWhenShared defines a boolean indicating that if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one - * @param forceCopy defines a boolean forcing the copy of the buffer no matter what the value of copyWhenShared is - * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false - * @returns a FloatArray or null if the mesh has no geometry or no vertex buffer for this kind. + * Gets the current projection matrix of the camera. + * @param force forces the camera to recompute the matrix without looking at the cached state + * @returns the projection matrix */ - getVerticesData(kind, copyWhenShared, forceCopy, bypassInstanceData) { - var _a, _b; - if (!this._geometry) { - return null; + getProjectionMatrix(force) { + var _a, _b, _c; + if (this._doNotComputeProjectionMatrix || !force && this._isSynchronizedProjectionMatrix()) { + return this._projectionMatrix; } - let data = bypassInstanceData ? void 0 : (_b = (_a = this._userInstancedBuffersStorage) == null ? void 0 : _a.vertexBuffers[kind]) == null ? void 0 : _b.getFloatData( - this.instances.length + 1, - // +1 because the master mesh is not included in the instances array - forceCopy || copyWhenShared && this._geometry.meshes.length !== 1 - ); - if (!data) { - data = this._geometry.getVerticesData(kind, copyWhenShared, forceCopy); + this._cache.mode = this.mode; + this._cache.minZ = this.minZ; + this._cache.maxZ = this.maxZ; + this._refreshFrustumPlanes = true; + const engine = this.getEngine(); + const scene = this.getScene(); + const reverseDepth = engine.useReverseDepthBuffer; + if (this.mode === _Camera.PERSPECTIVE_CAMERA) { + this._cache.fov = this.fov; + this._cache.fovMode = this.fovMode; + this._cache.aspectRatio = engine.getAspectRatio(this); + this._cache.projectionPlaneTilt = this.projectionPlaneTilt; + if (this.minZ <= 0) { + this.minZ = 0.1; + } + let getProjectionMatrix; + if (scene.useRightHandedSystem) { + getProjectionMatrix = Matrix.PerspectiveFovRHToRef; + } else { + getProjectionMatrix = Matrix.PerspectiveFovLHToRef; + } + getProjectionMatrix(this.fov, engine.getAspectRatio(this), reverseDepth ? this.maxZ : this.minZ, reverseDepth ? this.minZ : this.maxZ, this._projectionMatrix, this.fovMode === _Camera.FOVMODE_VERTICAL_FIXED, engine.isNDCHalfZRange, this.projectionPlaneTilt, reverseDepth); + } else { + const halfWidth = engine.getRenderWidth() / 2; + const halfHeight = engine.getRenderHeight() / 2; + if (scene.useRightHandedSystem) { + if (this.oblique) { + Matrix.ObliqueOffCenterRHToRef(this.orthoLeft ?? -halfWidth, this.orthoRight ?? halfWidth, this.orthoBottom ?? -halfHeight, this.orthoTop ?? halfHeight, reverseDepth ? this.maxZ : this.minZ, reverseDepth ? this.minZ : this.maxZ, this.oblique.length, this.oblique.angle, this._computeObliqueDistance(this.oblique.offset), this._projectionMatrix, engine.isNDCHalfZRange); + } else { + Matrix.OrthoOffCenterRHToRef(this.orthoLeft ?? -halfWidth, this.orthoRight ?? halfWidth, this.orthoBottom ?? -halfHeight, this.orthoTop ?? halfHeight, reverseDepth ? this.maxZ : this.minZ, reverseDepth ? this.minZ : this.maxZ, this._projectionMatrix, engine.isNDCHalfZRange); + } + } else { + if (this.oblique) { + Matrix.ObliqueOffCenterLHToRef(this.orthoLeft ?? -halfWidth, this.orthoRight ?? halfWidth, this.orthoBottom ?? -halfHeight, this.orthoTop ?? halfHeight, reverseDepth ? this.maxZ : this.minZ, reverseDepth ? this.minZ : this.maxZ, this.oblique.length, this.oblique.angle, this._computeObliqueDistance(this.oblique.offset), this._projectionMatrix, engine.isNDCHalfZRange); + } else { + Matrix.OrthoOffCenterLHToRef(this.orthoLeft ?? -halfWidth, this.orthoRight ?? halfWidth, this.orthoBottom ?? -halfHeight, this.orthoTop ?? halfHeight, reverseDepth ? this.maxZ : this.minZ, reverseDepth ? this.minZ : this.maxZ, this._projectionMatrix, engine.isNDCHalfZRange); + } + } + this._cache.orthoLeft = this.orthoLeft; + this._cache.orthoRight = this.orthoRight; + this._cache.orthoBottom = this.orthoBottom; + this._cache.orthoTop = this.orthoTop; + this._cache.obliqueAngle = (_a = this.oblique) == null ? void 0 : _a.angle; + this._cache.obliqueLength = (_b = this.oblique) == null ? void 0 : _b.length; + this._cache.obliqueOffset = (_c = this.oblique) == null ? void 0 : _c.offset; + this._cache.renderWidth = engine.getRenderWidth(); + this._cache.renderHeight = engine.getRenderHeight(); } - return data; + this.onProjectionMatrixChangedObservable.notifyObservers(this); + return this._projectionMatrix; } /** - * Returns the mesh VertexBuffer object from the requested `kind` - * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values : - * - VertexBuffer.PositionKind - * - VertexBuffer.NormalKind - * - VertexBuffer.UVKind - * - VertexBuffer.UV2Kind - * - VertexBuffer.UV3Kind - * - VertexBuffer.UV4Kind - * - VertexBuffer.UV5Kind - * - VertexBuffer.UV6Kind - * - VertexBuffer.ColorKind - * - VertexBuffer.MatricesIndicesKind - * - VertexBuffer.MatricesIndicesExtraKind - * - VertexBuffer.MatricesWeightsKind - * - VertexBuffer.MatricesWeightsExtraKind - * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false - * @returns a FloatArray or null if the mesh has no vertex buffer for this kind. + * Gets the transformation matrix (ie. the multiplication of view by projection matrices) + * @returns a Matrix */ - getVertexBuffer(kind, bypassInstanceData) { - var _a; - if (!this._geometry) { - return null; - } - return (bypassInstanceData ? void 0 : (_a = this._userInstancedBuffersStorage) == null ? void 0 : _a.vertexBuffers[kind]) ?? this._geometry.getVertexBuffer(kind); + getTransformationMatrix() { + this._computedViewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix); + return this._transformMatrix; } - /** - * Tests if a specific vertex buffer is associated with this mesh - * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values : - * - VertexBuffer.PositionKind - * - VertexBuffer.NormalKind - * - VertexBuffer.UVKind - * - VertexBuffer.UV2Kind - * - VertexBuffer.UV3Kind - * - VertexBuffer.UV4Kind - * - VertexBuffer.UV5Kind - * - VertexBuffer.UV6Kind - * - VertexBuffer.ColorKind - * - VertexBuffer.MatricesIndicesKind - * - VertexBuffer.MatricesIndicesExtraKind - * - VertexBuffer.MatricesWeightsKind - * - VertexBuffer.MatricesWeightsExtraKind - * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false - * @returns a boolean - */ - isVerticesDataPresent(kind, bypassInstanceData) { - var _a; - if (!this._geometry) { - if (this._delayInfo) { - return this._delayInfo.indexOf(kind) !== -1; - } - return false; - } - return !bypassInstanceData && ((_a = this._userInstancedBuffersStorage) == null ? void 0 : _a.vertexBuffers[kind]) !== void 0 || this._geometry.isVerticesDataPresent(kind); + _computeObliqueDistance(offset) { + const arcRotateCamera = this; + const targetCamera = this; + return (arcRotateCamera.radius || (targetCamera.target ? Vector3.Distance(this.position, targetCamera.target) : this.position.length())) + offset; } - /** - * Returns a boolean defining if the vertex data for the requested `kind` is updatable. - * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values : - * - VertexBuffer.PositionKind - * - VertexBuffer.UVKind - * - VertexBuffer.UV2Kind - * - VertexBuffer.UV3Kind - * - VertexBuffer.UV4Kind - * - VertexBuffer.UV5Kind - * - VertexBuffer.UV6Kind - * - VertexBuffer.ColorKind - * - VertexBuffer.MatricesIndicesKind - * - VertexBuffer.MatricesIndicesExtraKind - * - VertexBuffer.MatricesWeightsKind - * - VertexBuffer.MatricesWeightsExtraKind - * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false - * @returns a boolean - */ - isVertexBufferUpdatable(kind, bypassInstanceData) { - var _a; - if (!this._geometry) { - if (this._delayInfo) { - return this._delayInfo.indexOf(kind) !== -1; - } - return false; + _updateFrustumPlanes() { + if (!this._refreshFrustumPlanes) { + return; } - if (!bypassInstanceData) { - const buffer = (_a = this._userInstancedBuffersStorage) == null ? void 0 : _a.vertexBuffers[kind]; - if (buffer) { - return buffer.isUpdatable(); - } + this.getTransformationMatrix(); + if (!this._frustumPlanes) { + this._frustumPlanes = Frustum.GetPlanes(this._transformMatrix); + } else { + Frustum.GetPlanesToRef(this._transformMatrix, this._frustumPlanes); } - return this._geometry.isVertexBufferUpdatable(kind); + this._refreshFrustumPlanes = false; } /** - * Returns a string which contains the list of existing `kinds` of Vertex Data associated with this mesh. - * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false - * @returns an array of strings + * Checks if a cullable object (mesh...) is in the camera frustum + * This checks the bounding box center. See isCompletelyInFrustum for a full bounding check + * @param target The object to check + * @param checkRigCameras If the rig cameras should be checked (eg. with VR camera both eyes should be checked) (Default: false) + * @returns true if the object is in frustum otherwise false */ - getVerticesDataKinds(bypassInstanceData) { - if (!this._geometry) { - const result = []; - if (this._delayInfo) { - this._delayInfo.forEach(function(kind) { - result.push(kind); - }); - } + isInFrustum(target, checkRigCameras = false) { + this._updateFrustumPlanes(); + if (checkRigCameras && this.rigCameras.length > 0) { + let result = false; + this.rigCameras.forEach((cam) => { + cam._updateFrustumPlanes(); + result = result || target.isInFrustum(cam._frustumPlanes); + }); return result; + } else { + return target.isInFrustum(this._frustumPlanes); } - const kinds = this._geometry.getVerticesDataKinds(); - if (!bypassInstanceData && this._userInstancedBuffersStorage) { - for (const kind in this._userInstancedBuffersStorage.vertexBuffers) { - if (kinds.indexOf(kind) === -1) { - kinds.push(kind); - } - } - } - return kinds; } /** - * Returns a positive integer : the total number of indices in this mesh geometry. - * @returns the numner of indices or zero if the mesh has no geometry. + * Checks if a cullable object (mesh...) is in the camera frustum + * Unlike isInFrustum this checks the full bounding box + * @param target The object to check + * @returns true if the object is in frustum otherwise false */ - getTotalIndices() { - if (!this._geometry) { - return 0; - } - return this._geometry.getTotalIndices(); + isCompletelyInFrustum(target) { + this._updateFrustumPlanes(); + return target.isCompletelyInFrustum(this._frustumPlanes); } + // eslint-disable-next-line jsdoc/require-returns-check /** - * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices. - * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one. - * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it - * @returns the indices array or an empty array if the mesh has no geometry + * Gets a ray in the forward direction from the camera. + * @param length Defines the length of the ray to create + * @param transform Defines the transform to apply to the ray, by default the world matrix is used to create a workd space ray + * @param origin Defines the start point of the ray which defaults to the camera position + * @returns the forward ray */ - getIndices(copyWhenShared, forceCopy) { - if (!this._geometry) { - return []; - } - return this._geometry.getIndices(copyWhenShared, forceCopy); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getForwardRay(length = 100, transform, origin) { + throw _WarnImport("Ray"); } - get isBlocked() { - return this._masterMesh !== null && this._masterMesh !== void 0; + // eslint-disable-next-line jsdoc/require-returns-check + /** + * Gets a ray in the forward direction from the camera. + * @param refRay the ray to (re)use when setting the values + * @param length Defines the length of the ray to create + * @param transform Defines the transform to apply to the ray, by default the world matrx is used to create a workd space ray + * @param origin Defines the start point of the ray which defaults to the camera position + * @returns the forward ray + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getForwardRayToRef(refRay, length = 100, transform, origin) { + throw _WarnImport("Ray"); } /** - * Determine if the current mesh is ready to be rendered - * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default) - * @param forceInstanceSupport will check if the mesh will be ready when used with instances (false by default) - * @returns true if all associated assets are ready (material, textures, shaders) + * Releases resources associated with this node. + * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default) + * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default) */ - isReady(completeCheck = false, forceInstanceSupport = false) { - var _a, _b, _c, _d, _e; - if (this.delayLoadState === 2) { - return false; - } - if (!super.isReady(completeCheck)) { - return false; - } - if (!this.subMeshes || this.subMeshes.length === 0) { - return true; - } - if (!completeCheck) { - return true; + dispose(doNotRecurse, disposeMaterialAndTextures = false) { + this.onViewMatrixChangedObservable.clear(); + this.onProjectionMatrixChangedObservable.clear(); + this.onAfterCheckInputsObservable.clear(); + this.onRestoreStateObservable.clear(); + if (this.inputs) { + this.inputs.clear(); } - const engine = this.getEngine(); - const scene = this.getScene(); - const hardwareInstancedRendering = forceInstanceSupport || engine.getCaps().instancedArrays && (this.instances.length > 0 || this.hasThinInstances); - this.computeWorldMatrix(); - const mat = this.material || scene.defaultMaterial; - if (mat) { - if (mat._storeEffectOnSubMeshes) { - for (const subMesh of this.subMeshes) { - const effectiveMaterial = subMesh.getMaterial(); - if (effectiveMaterial) { - if (effectiveMaterial._storeEffectOnSubMeshes) { - if (!effectiveMaterial.isReadyForSubMesh(this, subMesh, hardwareInstancedRendering)) { - return false; - } - } else { - if (!effectiveMaterial.isReady(this, hardwareInstancedRendering)) { - return false; - } - } - } - } - } else { - if (!mat.isReady(this, hardwareInstancedRendering)) { - return false; - } + this.getScene().stopAnimation(this); + this.getScene().removeCamera(this); + while (this._rigCameras.length > 0) { + const camera = this._rigCameras.pop(); + if (camera) { + camera.dispose(); } } - const currentRenderPassId = engine.currentRenderPassId; - for (const light of this.lightSources) { - const generators = light.getShadowGenerators(); - if (!generators) { - continue; + if (this._parentContainer) { + const index = this._parentContainer.cameras.indexOf(this); + if (index > -1) { + this._parentContainer.cameras.splice(index, 1); } - const iterator = generators.values(); - for (let key = iterator.next(); key.done !== true; key = iterator.next()) { - const generator = key.value; - if (generator && (!((_a = generator.getShadowMap()) == null ? void 0 : _a.renderList) || ((_b = generator.getShadowMap()) == null ? void 0 : _b.renderList) && ((_d = (_c = generator.getShadowMap()) == null ? void 0 : _c.renderList) == null ? void 0 : _d.indexOf(this)) !== -1)) { - const shadowMap = generator.getShadowMap(); - const renderPassIds = shadowMap.renderPassIds ?? [engine.currentRenderPassId]; - for (let p = 0; p < renderPassIds.length; ++p) { - engine.currentRenderPassId = renderPassIds[p]; - for (const subMesh of this.subMeshes) { - if (!generator.isReady(subMesh, hardwareInstancedRendering, ((_e = subMesh.getMaterial()) == null ? void 0 : _e.needAlphaBlendingForMesh(this)) ?? false)) { - engine.currentRenderPassId = currentRenderPassId; - return false; - } - } - } - engine.currentRenderPassId = currentRenderPassId; + this._parentContainer = null; + } + if (this._rigPostProcess) { + this._rigPostProcess.dispose(this); + this._rigPostProcess = null; + this._postProcesses.length = 0; + } else if (this.cameraRigMode !== _Camera.RIG_MODE_NONE) { + this._rigPostProcess = null; + this._postProcesses.length = 0; + } else { + let i2 = this._postProcesses.length; + while (--i2 >= 0) { + const postProcess = this._postProcesses[i2]; + if (postProcess) { + postProcess.dispose(this); } } } - for (const lod of this._internalMeshDataInfo._LODLevels) { - if (lod.mesh && !lod.mesh.isReady(hardwareInstancedRendering)) { - return false; - } + let i = this.customRenderTargets.length; + while (--i >= 0) { + this.customRenderTargets[i].dispose(); } - return true; + this.customRenderTargets.length = 0; + this._activeMeshes.dispose(); + this.getScene().getEngine().releaseRenderPassId(this.renderPassId); + super.dispose(doNotRecurse, disposeMaterialAndTextures); } /** - * Gets a boolean indicating if the normals aren't to be recomputed on next mesh `positions` array update. This property is pertinent only for updatable parametric shapes. + * Gets the left camera of a rig setup in case of Rigged Camera */ - get areNormalsFrozen() { - return this._internalMeshDataInfo._areNormalsFrozen; + get isLeftCamera() { + return this._isLeftCamera; } /** - * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It prevents the mesh normals from being recomputed on next `positions` array update. - * @returns the current mesh + * Gets the right camera of a rig setup in case of Rigged Camera */ - freezeNormals() { - this._internalMeshDataInfo._areNormalsFrozen = true; - return this; + get isRightCamera() { + return this._isRightCamera; } /** - * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It reactivates the mesh normals computation if it was previously frozen - * @returns the current mesh + * Gets the left camera of a rig setup in case of Rigged Camera */ - unfreezeNormals() { - this._internalMeshDataInfo._areNormalsFrozen = false; - return this; + get leftCamera() { + if (this._rigCameras.length < 1) { + return null; + } + return this._rigCameras[0]; } /** - * Sets a value overriding the instance count. Only applicable when custom instanced InterleavedVertexBuffer are used rather than InstancedMeshs + * Gets the right camera of a rig setup in case of Rigged Camera */ - set overridenInstanceCount(count) { - this._instanceDataStorage.overridenInstanceCount = count; + get rightCamera() { + if (this._rigCameras.length < 2) { + return null; + } + return this._rigCameras[1]; } - // Methods - /** @internal */ - _preActivate() { - const internalDataInfo = this._internalMeshDataInfo; - const sceneRenderId = this.getScene().getRenderId(); - if (internalDataInfo._preActivateId === sceneRenderId) { - return this; + /** + * Gets the left camera target of a rig setup in case of Rigged Camera + * @returns the target position + */ + getLeftTarget() { + if (this._rigCameras.length < 1) { + return null; } - internalDataInfo._preActivateId = sceneRenderId; - this._instanceDataStorage.visibleInstances = null; - return this; + return this._rigCameras[0].getTarget(); } /** - * @internal + * Gets the right camera target of a rig setup in case of Rigged Camera + * @returns the target position */ - _preActivateForIntermediateRendering(renderId) { - if (this._instanceDataStorage.visibleInstances) { - this._instanceDataStorage.visibleInstances.intermediateDefaultRenderId = renderId; + getRightTarget() { + if (this._rigCameras.length < 2) { + return null; } - return this; + return this._rigCameras[1].getTarget(); } /** * @internal */ - _registerInstanceForRenderId(instance, renderId) { - if (!this._instanceDataStorage.visibleInstances) { - this._instanceDataStorage.visibleInstances = { - defaultRenderId: renderId, - selfDefaultRenderId: this._renderId - }; + setCameraRigMode(mode, rigParams) { + if (this.cameraRigMode === mode) { + return; } - if (!this._instanceDataStorage.visibleInstances[renderId]) { - if (this._instanceDataStorage.previousRenderId !== void 0 && this._instanceDataStorage.isFrozen) { - this._instanceDataStorage.visibleInstances[this._instanceDataStorage.previousRenderId] = null; + while (this._rigCameras.length > 0) { + const camera = this._rigCameras.pop(); + if (camera) { + camera.dispose(); } - this._instanceDataStorage.previousRenderId = renderId; - this._instanceDataStorage.visibleInstances[renderId] = new Array(); - } - this._instanceDataStorage.visibleInstances[renderId].push(instance); - return this; - } - _afterComputeWorldMatrix() { - super._afterComputeWorldMatrix(); - if (!this.hasThinInstances) { - return; } - if (!this.doNotSyncBoundingInfo) { - this.thinInstanceRefreshBoundingInfo(false); + this.cameraRigMode = mode; + this._cameraRigParams = {}; + this._cameraRigParams.interaxialDistance = rigParams.interaxialDistance || 0.0637; + this._cameraRigParams.stereoHalfAngle = Tools.ToRadians(this._cameraRigParams.interaxialDistance / 0.0637); + if (this.cameraRigMode !== _Camera.RIG_MODE_NONE) { + const leftCamera = this.createRigCamera(this.name + "_L", 0); + if (leftCamera) { + leftCamera._isLeftCamera = true; + } + const rightCamera = this.createRigCamera(this.name + "_R", 1); + if (rightCamera) { + rightCamera._isRightCamera = true; + } + if (leftCamera && rightCamera) { + this._rigCameras.push(leftCamera); + this._rigCameras.push(rightCamera); + } } + this._setRigMode(rigParams); + this._cascadePostProcessesToRigCams(); + this.update(); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _setRigMode(rigParams) { } /** @internal */ - _postActivate() { - if (this.edgesShareWithInstances && this.edgesRenderer && this.edgesRenderer.isEnabled && this._renderingGroup) { - this._renderingGroup._edgesRenderers.pushNoDuplicate(this.edgesRenderer); - this.edgesRenderer.customInstances.push(this.getWorldMatrix()); - } + _getVRProjectionMatrix() { + Matrix.PerspectiveFovLHToRef(this._cameraRigParams.vrMetrics.aspectRatioFov, this._cameraRigParams.vrMetrics.aspectRatio, this.minZ, this.maxZ, this._cameraRigParams.vrWorkMatrix, true, this.getEngine().isNDCHalfZRange); + this._cameraRigParams.vrWorkMatrix.multiplyToRef(this._cameraRigParams.vrHMatrix, this._projectionMatrix); + return this._projectionMatrix; } /** - * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked. - * This means the mesh underlying bounding box and sphere are recomputed. - * @param applySkeleton defines whether to apply the skeleton before computing the bounding info - * @param applyMorph defines whether to apply the morph target before computing the bounding info - * @returns the current mesh + * @internal */ - refreshBoundingInfo(applySkeleton = false, applyMorph = false) { - if (this.hasBoundingInfo && this.getBoundingInfo().isLocked) { - return this; + setCameraRigParameter(name69, value) { + if (!this._cameraRigParams) { + this._cameraRigParams = {}; + } + this._cameraRigParams[name69] = value; + if (name69 === "interaxialDistance") { + this._cameraRigParams.stereoHalfAngle = Tools.ToRadians(value / 0.0637); } - const bias = this.geometry ? this.geometry.boundingBias : null; - this._refreshBoundingInfo(this._getPositionData(applySkeleton, applyMorph), bias); - return this; } /** + * needs to be overridden by children so sub has required properties to be copied * @internal */ - _createGlobalSubMesh(force) { - const totalVertices = this.getTotalVertices(); - if (!totalVertices || !this.getIndices()) { - return null; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + createRigCamera(name69, cameraIndex) { + return null; + } + /** + * May need to be overridden by children + * @internal + */ + _updateRigCameras() { + for (let i = 0; i < this._rigCameras.length; i++) { + this._rigCameras[i].minZ = this.minZ; + this._rigCameras[i].maxZ = this.maxZ; + this._rigCameras[i].fov = this.fov; + this._rigCameras[i].upVector.copyFrom(this.upVector); } - if (this.subMeshes && this.subMeshes.length > 0) { - const ib = this.getIndices(); - if (!ib) { - return null; - } - const totalIndices = ib.length; - let needToRecreate = false; - if (force) { - needToRecreate = true; - } else { - for (const submesh of this.subMeshes) { - if (submesh.indexStart + submesh.indexCount > totalIndices) { - needToRecreate = true; - break; - } - if (submesh.verticesStart + submesh.verticesCount > totalVertices) { - needToRecreate = true; - break; - } - } - } - if (!needToRecreate) { - return this.subMeshes[0]; - } + if (this.cameraRigMode === _Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH) { + this._rigCameras[0].viewport = this._rigCameras[1].viewport = this.viewport; } - this.releaseSubMeshes(); - return new SubMesh(0, 0, totalVertices, 0, this.getTotalIndices(), this); } - /** - * This function will subdivide the mesh into multiple submeshes - * @param count defines the expected number of submeshes - */ - subdivide(count) { - if (count < 1) { - return; - } - const totalIndices = this.getTotalIndices(); - let subdivisionSize = totalIndices / count | 0; - let offset = 0; - while (subdivisionSize % 3 !== 0) { - subdivisionSize++; - } - this.releaseSubMeshes(); - for (let index = 0; index < count; index++) { - if (offset >= totalIndices) { - break; - } - SubMesh.CreateFromIndices(0, offset, index === count - 1 ? totalIndices - offset : subdivisionSize, this, void 0, false); - offset += subdivisionSize; - } - this.refreshBoundingInfo(); - this.synchronizeInstances(); + /** @internal */ + _setupInputs() { } /** - * Copy a FloatArray into a specific associated vertex buffer - * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values : - * - VertexBuffer.PositionKind - * - VertexBuffer.UVKind - * - VertexBuffer.UV2Kind - * - VertexBuffer.UV3Kind - * - VertexBuffer.UV4Kind - * - VertexBuffer.UV5Kind - * - VertexBuffer.UV6Kind - * - VertexBuffer.ColorKind - * - VertexBuffer.MatricesIndicesKind - * - VertexBuffer.MatricesIndicesExtraKind - * - VertexBuffer.MatricesWeightsKind - * - VertexBuffer.MatricesWeightsExtraKind - * @param data defines the data source - * @param updatable defines if the updated vertex buffer must be flagged as updatable - * @param stride defines the data stride size (can be null) - * @returns the current mesh + * Serialiaze the camera setup to a json representation + * @returns the JSON representation */ - setVerticesData(kind, data, updatable = false, stride) { - if (!this._geometry) { - const vertexData = new VertexData(); - vertexData.set(data, kind); - const scene = this.getScene(); - new Geometry(Geometry.RandomId(), scene, vertexData, updatable, this); - } else { - this._geometry.setVerticesData(kind, data, updatable, stride); + serialize() { + const serializationObject = SerializationHelper.Serialize(this); + serializationObject.uniqueId = this.uniqueId; + serializationObject.type = this.getClassName(); + if (this.parent) { + this.parent._serializeAsParent(serializationObject); } - return this; - } - /** - * Delete a vertex buffer associated with this mesh - * @param kind defines which buffer to delete (positions, indices, normals, etc). Possible `kind` values : - * - VertexBuffer.PositionKind - * - VertexBuffer.UVKind - * - VertexBuffer.UV2Kind - * - VertexBuffer.UV3Kind - * - VertexBuffer.UV4Kind - * - VertexBuffer.UV5Kind - * - VertexBuffer.UV6Kind - * - VertexBuffer.ColorKind - * - VertexBuffer.MatricesIndicesKind - * - VertexBuffer.MatricesIndicesExtraKind - * - VertexBuffer.MatricesWeightsKind - * - VertexBuffer.MatricesWeightsExtraKind - */ - removeVerticesData(kind) { - if (!this._geometry) { - return; + if (this.inputs) { + this.inputs.serialize(serializationObject); } - this._geometry.removeVerticesData(kind); + SerializationHelper.AppendSerializedAnimations(this, serializationObject); + serializationObject.ranges = this.serializeAnimationRanges(); + serializationObject.isEnabled = this.isEnabled(); + return serializationObject; } /** - * Flags an associated vertex buffer as updatable - * @param kind defines which buffer to use (positions, indices, normals, etc). Possible `kind` values : - * - VertexBuffer.PositionKind - * - VertexBuffer.UVKind - * - VertexBuffer.UV2Kind - * - VertexBuffer.UV3Kind - * - VertexBuffer.UV4Kind - * - VertexBuffer.UV5Kind - * - VertexBuffer.UV6Kind - * - VertexBuffer.ColorKind - * - VertexBuffer.MatricesIndicesKind - * - VertexBuffer.MatricesIndicesExtraKind - * - VertexBuffer.MatricesWeightsKind - * - VertexBuffer.MatricesWeightsExtraKind - * @param updatable defines if the updated vertex buffer must be flagged as updatable + * Clones the current camera. + * @param name The cloned camera name + * @param newParent The cloned camera's new parent (none by default) + * @returns the cloned camera */ - markVerticesDataAsUpdatable(kind, updatable = true) { - const vb = this.getVertexBuffer(kind); - if (!vb || vb.isUpdatable() === updatable) { - return; - } - this.setVerticesData(kind, this.getVerticesData(kind), updatable); + clone(name69, newParent = null) { + const camera = SerializationHelper.Clone(_Camera.GetConstructorFromName(this.getClassName(), name69, this.getScene(), this.interaxialDistance, this.isStereoscopicSideBySide), this); + camera.name = name69; + camera.parent = newParent; + this.onClonedObservable.notifyObservers(camera); + return camera; } /** - * Sets the mesh global Vertex Buffer - * @param buffer defines the buffer to use - * @param disposeExistingBuffer disposes the existing buffer, if any (default: true) - * @returns the current mesh + * Gets the direction of the camera relative to a given local axis. + * @param localAxis Defines the reference axis to provide a relative direction. + * @returns the direction */ - setVerticesBuffer(buffer, disposeExistingBuffer = true) { - if (!this._geometry) { - this._geometry = Geometry.CreateGeometryForMesh(this); - } - this._geometry.setVerticesBuffer(buffer, null, disposeExistingBuffer); - return this; + getDirection(localAxis) { + const result = Vector3.Zero(); + this.getDirectionToRef(localAxis, result); + return result; } /** - * Update a specific associated vertex buffer - * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values : - * - VertexBuffer.PositionKind - * - VertexBuffer.UVKind - * - VertexBuffer.UV2Kind - * - VertexBuffer.UV3Kind - * - VertexBuffer.UV4Kind - * - VertexBuffer.UV5Kind - * - VertexBuffer.UV6Kind - * - VertexBuffer.ColorKind - * - VertexBuffer.MatricesIndicesKind - * - VertexBuffer.MatricesIndicesExtraKind - * - VertexBuffer.MatricesWeightsKind - * - VertexBuffer.MatricesWeightsExtraKind - * @param data defines the data source - * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for "position" kind - * @param makeItUnique defines if the geometry associated with the mesh must be cloned to make the change only for this mesh (and not all meshes associated with the same geometry) - * @returns the current mesh + * Returns the current camera absolute rotation */ - updateVerticesData(kind, data, updateExtends, makeItUnique) { - if (!this._geometry) { - return this; - } - if (!makeItUnique) { - this._geometry.updateVerticesData(kind, data, updateExtends); - } else { - this.makeGeometryUnique(); - this.updateVerticesData(kind, data, updateExtends, false); - } - return this; + get absoluteRotation() { + this.getWorldMatrix().decompose(void 0, this._absoluteRotation); + return this._absoluteRotation; } /** - * This method updates the vertex positions of an updatable mesh according to the `positionFunction` returned values. - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#other-shapes-updatemeshpositions - * @param positionFunction is a simple JS function what is passed the mesh `positions` array. It doesn't need to return anything - * @param computeNormals is a boolean (default true) to enable/disable the mesh normal recomputation after the vertex position update - * @returns the current mesh + * Gets the direction of the camera relative to a given local axis into a passed vector. + * @param localAxis Defines the reference axis to provide a relative direction. + * @param result Defines the vector to store the result in */ - updateMeshPositions(positionFunction, computeNormals = true) { - const positions = this.getVerticesData(VertexBuffer.PositionKind); - if (!positions) { - return this; - } - positionFunction(positions); - this.updateVerticesData(VertexBuffer.PositionKind, positions, false, false); - if (computeNormals) { - const indices = this.getIndices(); - const normals = this.getVerticesData(VertexBuffer.NormalKind); - if (!normals) { - return this; - } - VertexData.ComputeNormals(positions, indices, normals); - this.updateVerticesData(VertexBuffer.NormalKind, normals, false, false); - } - return this; + getDirectionToRef(localAxis, result) { + Vector3.TransformNormalToRef(localAxis, this.getWorldMatrix(), result); } /** - * Creates a un-shared specific occurence of the geometry for the mesh. - * @returns the current mesh + * Gets a camera constructor for a given camera type + * @param type The type of the camera to construct (should be equal to one of the camera class name) + * @param name The name of the camera the result will be able to instantiate + * @param scene The scene the result will construct the camera in + * @param interaxial_distance In case of stereoscopic setup, the distance between both eyes + * @param isStereoscopicSideBySide In case of stereoscopic setup, should the sereo be side b side + * @returns a factory method to construct the camera */ - makeGeometryUnique() { - if (!this._geometry) { - return this; - } - if (this._geometry.meshes.length === 1) { - return this; + // eslint-disable-next-line @typescript-eslint/naming-convention + static GetConstructorFromName(type, name69, scene, interaxial_distance = 0, isStereoscopicSideBySide = true) { + const constructorFunc = Node.Construct(type, name69, scene, { + // eslint-disable-next-line @typescript-eslint/naming-convention + interaxial_distance, + isStereoscopicSideBySide + }); + if (constructorFunc) { + return constructorFunc; } - const oldGeometry = this._geometry; - const geometry = this._geometry.copy(Geometry.RandomId()); - oldGeometry.releaseForMesh(this, true); - geometry.applyToMesh(this); - return this; + return () => _Camera._CreateDefaultParsedCamera(name69, scene); } /** - * Sets the index buffer of this mesh. - * @param indexBuffer Defines the index buffer to use for this mesh - * @param totalVertices Defines the total number of vertices used by the buffer - * @param totalIndices Defines the total number of indices in the index buffer + * Compute the world matrix of the camera. + * @returns the camera world matrix */ - setIndexBuffer(indexBuffer, totalVertices, totalIndices) { - let geometry = this._geometry; - if (!geometry) { - geometry = new Geometry(Geometry.RandomId(), this.getScene(), void 0, void 0, this); - } - geometry.setIndexBuffer(indexBuffer, totalVertices, totalIndices); + computeWorldMatrix() { + return this.getWorldMatrix(); } /** - * Set the index buffer of this mesh - * @param indices defines the source data - * @param totalVertices defines the total number of vertices referenced by this index data (can be null) - * @param updatable defines if the updated index buffer must be flagged as updatable (default is false) - * @returns the current mesh + * Parse a JSON and creates the camera from the parsed information + * @param parsedCamera The JSON to parse + * @param scene The scene to instantiate the camera in + * @returns the newly constructed camera */ - setIndices(indices, totalVertices = null, updatable = false) { - if (!this._geometry) { - const vertexData = new VertexData(); - vertexData.indices = indices; - const scene = this.getScene(); - new Geometry(Geometry.RandomId(), scene, vertexData, updatable, this); - } else { - this._geometry.setIndices(indices, totalVertices, updatable); + static Parse(parsedCamera, scene) { + const type = parsedCamera.type; + const construct = _Camera.GetConstructorFromName(type, parsedCamera.name, scene, parsedCamera.interaxial_distance, parsedCamera.isStereoscopicSideBySide); + const camera = SerializationHelper.Parse(construct, parsedCamera, scene); + if (parsedCamera.parentId !== void 0) { + camera._waitingParentId = parsedCamera.parentId; } - return this; - } - /** - * Update the current index buffer - * @param indices defines the source data - * @param offset defines the offset in the index buffer where to store the new data (can be null) - * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default) - * @returns the current mesh - */ - updateIndices(indices, offset, gpuMemoryOnly = false) { - if (!this._geometry) { - return this; + if (parsedCamera.parentInstanceIndex !== void 0) { + camera._waitingParentInstanceIndex = parsedCamera.parentInstanceIndex; } - this._geometry.updateIndices(indices, offset, gpuMemoryOnly); - return this; - } - /** - * Invert the geometry to move from a right handed system to a left handed one. - * @returns the current mesh - */ - toLeftHanded() { - if (!this._geometry) { - return this; + if (camera.inputs) { + camera.inputs.parse(parsedCamera); + camera._setupInputs(); } - this._geometry.toLeftHanded(); - return this; - } - /** - * @internal - */ - _bind(subMesh, effect, fillMode, allowInstancedRendering = true) { - if (!this._geometry) { - return this; + if (parsedCamera.upVector) { + camera.upVector = Vector3.FromArray(parsedCamera.upVector); } - const engine = this.getScene().getEngine(); - if (this.morphTargetManager && this.morphTargetManager.isUsingTextureForTargets) { - this.morphTargetManager._bind(effect); + if (camera.setPosition) { + camera.position.copyFromFloats(0, 0, 0); + camera.setPosition(Vector3.FromArray(parsedCamera.position)); } - let indexToBind; - if (this._unIndexed) { - indexToBind = null; - } else { - switch (this._getRenderingFillMode(fillMode)) { - case Material.PointFillMode: - indexToBind = null; - break; - case Material.WireFrameFillMode: - indexToBind = subMesh._getLinesIndexBuffer(this.getIndices(), engine); - break; - default: - case Material.TriangleFillMode: - indexToBind = this._geometry.getIndexBuffer(); - break; + if (parsedCamera.target) { + if (camera.setTarget) { + camera.setTarget(Vector3.FromArray(parsedCamera.target)); } } - if (!allowInstancedRendering || !this._userInstancedBuffersStorage || this.hasThinInstances) { - this._geometry._bind(effect, indexToBind); - } else { - this._geometry._bind(effect, indexToBind, this._userInstancedBuffersStorage.vertexBuffers, this._userInstancedBuffersStorage.vertexArrayObjects); + if (parsedCamera.cameraRigMode) { + const rigParams = parsedCamera.interaxial_distance ? { interaxialDistance: parsedCamera.interaxial_distance } : {}; + camera.setCameraRigMode(parsedCamera.cameraRigMode, rigParams); } - return this; - } - /** - * @internal - */ - _draw(subMesh, fillMode, instancesCount) { - if (!this._geometry || !this._geometry.getVertexBuffers() || !this._unIndexed && !this._geometry.getIndexBuffer()) { - return this; + if (parsedCamera.animations) { + for (let animationIndex = 0; animationIndex < parsedCamera.animations.length; animationIndex++) { + const parsedAnimation = parsedCamera.animations[animationIndex]; + const internalClass = GetClass("BABYLON.Animation"); + if (internalClass) { + camera.animations.push(internalClass.Parse(parsedAnimation)); + } + } + Node.ParseAnimationRanges(camera, parsedCamera, scene); } - if (this._internalMeshDataInfo._onBeforeDrawObservable) { - this._internalMeshDataInfo._onBeforeDrawObservable.notifyObservers(this); + if (parsedCamera.autoAnimate) { + scene.beginAnimation(camera, parsedCamera.autoAnimateFrom, parsedCamera.autoAnimateTo, parsedCamera.autoAnimateLoop, parsedCamera.autoAnimateSpeed || 1); } - const scene = this.getScene(); - const engine = scene.getEngine(); - if (this._unIndexed || fillMode == Material.PointFillMode) { - engine.drawArraysType(fillMode, subMesh.verticesStart, subMesh.verticesCount, this.forcedInstanceCount || instancesCount); - } else if (fillMode == Material.WireFrameFillMode) { - engine.drawElementsType(fillMode, 0, subMesh._linesIndexCount, this.forcedInstanceCount || instancesCount); - } else { - engine.drawElementsType(fillMode, subMesh.indexStart, subMesh.indexCount, this.forcedInstanceCount || instancesCount); + if (parsedCamera.isEnabled !== void 0) { + camera.setEnabled(parsedCamera.isEnabled); } - return this; + return camera; } - /** - * Registers for this mesh a javascript function called just before the rendering process - * @param func defines the function to call before rendering this mesh - * @returns the current mesh - */ - registerBeforeRender(func) { - this.onBeforeRenderObservable.add(func); - return this; + /** @internal */ + _calculateHandednessMultiplier() { + let handednessMultiplier = this.getScene().useRightHandedSystem ? -1 : 1; + if (this.parent && this.parent._getWorldMatrixDeterminant() < 0) { + handednessMultiplier *= -1; + } + return handednessMultiplier; } +}; +Camera._CreateDefaultParsedCamera = (name69, scene) => { + throw _WarnImport("UniversalCamera"); +}; +Camera.PERSPECTIVE_CAMERA = 0; +Camera.ORTHOGRAPHIC_CAMERA = 1; +Camera.FOVMODE_VERTICAL_FIXED = 0; +Camera.FOVMODE_HORIZONTAL_FIXED = 1; +Camera.RIG_MODE_NONE = 0; +Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH = 10; +Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL = 11; +Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED = 12; +Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER = 13; +Camera.RIG_MODE_STEREOSCOPIC_INTERLACED = 14; +Camera.RIG_MODE_VR = 20; +Camera.RIG_MODE_CUSTOM = 22; +Camera.ForceAttachControlToAlwaysPreventDefault = false; +__decorate([ + serializeAsVector3("position") +], Camera.prototype, "_position", void 0); +__decorate([ + serializeAsVector3("upVector") +], Camera.prototype, "_upVector", void 0); +__decorate([ + serialize() +], Camera.prototype, "orthoLeft", null); +__decorate([ + serialize() +], Camera.prototype, "orthoRight", null); +__decorate([ + serialize() +], Camera.prototype, "orthoBottom", null); +__decorate([ + serialize() +], Camera.prototype, "orthoTop", null); +__decorate([ + serialize() +], Camera.prototype, "fov", void 0); +__decorate([ + serialize() +], Camera.prototype, "projectionPlaneTilt", void 0); +__decorate([ + serialize() +], Camera.prototype, "minZ", void 0); +__decorate([ + serialize() +], Camera.prototype, "maxZ", void 0); +__decorate([ + serialize() +], Camera.prototype, "inertia", void 0); +__decorate([ + serialize() +], Camera.prototype, "mode", null); +__decorate([ + serialize() +], Camera.prototype, "layerMask", void 0); +__decorate([ + serialize() +], Camera.prototype, "fovMode", void 0); +__decorate([ + serialize() +], Camera.prototype, "cameraRigMode", void 0); +__decorate([ + serialize() +], Camera.prototype, "interaxialDistance", void 0); +__decorate([ + serialize() +], Camera.prototype, "isStereoscopicSideBySide", void 0); + +// node_modules/@babylonjs/core/Loading/sceneLoaderFlags.js +var SceneLoaderFlags = class _SceneLoaderFlags { /** - * Disposes a previously registered javascript function called before the rendering - * @param func defines the function to remove - * @returns the current mesh + * Gets or sets a boolean indicating if entire scene must be loaded even if scene contains incremental data */ - unregisterBeforeRender(func) { - this.onBeforeRenderObservable.removeCallback(func); - return this; + static get ForceFullSceneLoadingForIncremental() { + return _SceneLoaderFlags._ForceFullSceneLoadingForIncremental; + } + static set ForceFullSceneLoadingForIncremental(value) { + _SceneLoaderFlags._ForceFullSceneLoadingForIncremental = value; } /** - * Registers for this mesh a javascript function called just after the rendering is complete - * @param func defines the function to call after rendering this mesh - * @returns the current mesh + * Gets or sets a boolean indicating if loading screen must be displayed while loading a scene */ - registerAfterRender(func) { - this.onAfterRenderObservable.add(func); - return this; + static get ShowLoadingScreen() { + return _SceneLoaderFlags._ShowLoadingScreen; + } + static set ShowLoadingScreen(value) { + _SceneLoaderFlags._ShowLoadingScreen = value; } /** - * Disposes a previously registered javascript function called after the rendering. - * @param func defines the function to remove - * @returns the current mesh + * Defines the current logging level (while loading the scene) + * @ignorenaming */ - unregisterAfterRender(func) { - this.onAfterRenderObservable.removeCallback(func); - return this; + // eslint-disable-next-line @typescript-eslint/naming-convention + static get loggingLevel() { + return _SceneLoaderFlags._LoggingLevel; + } + // eslint-disable-next-line @typescript-eslint/naming-convention + static set loggingLevel(value) { + _SceneLoaderFlags._LoggingLevel = value; } /** - * @internal + * Gets or set a boolean indicating if matrix weights must be cleaned upon loading */ - _getInstancesRenderList(subMeshId, isReplacementMode = false) { - if (this._instanceDataStorage.isFrozen) { - if (isReplacementMode) { - this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.hardwareInstancedRendering[subMeshId] = false; - this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.renderSelf[subMeshId] = true; - return this._instanceDataStorage.batchCacheReplacementModeInFrozenMode; - } - if (this._instanceDataStorage.previousBatch) { - return this._instanceDataStorage.previousBatch; - } - } - const scene = this.getScene(); - const isInIntermediateRendering = scene._isInIntermediateRendering(); - const onlyForInstances = isInIntermediateRendering ? this._internalAbstractMeshDataInfo._onlyForInstancesIntermediate : this._internalAbstractMeshDataInfo._onlyForInstances; - const batchCache = this._instanceDataStorage.batchCache; - batchCache.mustReturn = false; - batchCache.renderSelf[subMeshId] = isReplacementMode || !onlyForInstances && this.isEnabled() && this.isVisible; - batchCache.visibleInstances[subMeshId] = null; - if (this._instanceDataStorage.visibleInstances && !isReplacementMode) { - const visibleInstances = this._instanceDataStorage.visibleInstances; - const currentRenderId = scene.getRenderId(); - const defaultRenderId = isInIntermediateRendering ? visibleInstances.intermediateDefaultRenderId : visibleInstances.defaultRenderId; - batchCache.visibleInstances[subMeshId] = visibleInstances[currentRenderId]; - if (!batchCache.visibleInstances[subMeshId] && defaultRenderId) { - batchCache.visibleInstances[subMeshId] = visibleInstances[defaultRenderId]; - } + static get CleanBoneMatrixWeights() { + return _SceneLoaderFlags._CleanBoneMatrixWeights; + } + static set CleanBoneMatrixWeights(value) { + _SceneLoaderFlags._CleanBoneMatrixWeights = value; + } +}; +SceneLoaderFlags._ForceFullSceneLoadingForIncremental = false; +SceneLoaderFlags._ShowLoadingScreen = true; +SceneLoaderFlags._CleanBoneMatrixWeights = false; +SceneLoaderFlags._LoggingLevel = 0; + +// node_modules/@babylonjs/core/Meshes/geometry.js +var Geometry = class _Geometry { + /** + * Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y + */ + get boundingBias() { + return this._boundingBias; + } + /** + * Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y + */ + set boundingBias(value) { + if (this._boundingBias) { + this._boundingBias.copyFrom(value); + } else { + this._boundingBias = value.clone(); } - batchCache.hardwareInstancedRendering[subMeshId] = !isReplacementMode && this._instanceDataStorage.hardwareInstancedRendering && batchCache.visibleInstances[subMeshId] !== null && batchCache.visibleInstances[subMeshId] !== void 0; - this._instanceDataStorage.previousBatch = batchCache; - return batchCache; + this._updateBoundingInfo(true, null); } /** - * @internal + * Static function used to attach a new empty geometry to a mesh + * @param mesh defines the mesh to attach the geometry to + * @returns the new Geometry */ - _renderWithInstances(subMesh, fillMode, batch, effect, engine) { - var _a; - const visibleInstances = batch.visibleInstances[subMesh._id]; - const visibleInstanceCount = visibleInstances ? visibleInstances.length : 0; - const instanceStorage = this._instanceDataStorage; - const currentInstancesBufferSize = instanceStorage.instancesBufferSize; - let instancesBuffer = instanceStorage.instancesBuffer; - let instancesPreviousBuffer = instanceStorage.instancesPreviousBuffer; - const matricesCount = visibleInstanceCount + 1; - const bufferSize = matricesCount * 16 * 4; - while (instanceStorage.instancesBufferSize < bufferSize) { - instanceStorage.instancesBufferSize *= 2; + static CreateGeometryForMesh(mesh) { + const geometry = new _Geometry(_Geometry.RandomId(), mesh.getScene()); + geometry.applyToMesh(mesh); + return geometry; + } + /** Get the list of meshes using this geometry */ + get meshes() { + return this._meshes; + } + /** + * Creates a new geometry + * @param id defines the unique ID + * @param scene defines the hosting scene + * @param vertexData defines the VertexData used to get geometry data + * @param updatable defines if geometry must be updatable (false by default) + * @param mesh defines the mesh that will be associated with the geometry + */ + constructor(id, scene, vertexData, updatable = false, mesh = null) { + this.delayLoadState = 0; + this._totalVertices = 0; + this._isDisposed = false; + this._indexBufferIsUpdatable = false; + this._positionsCache = []; + this._parentContainer = null; + this.useBoundingInfoFromGeometry = false; + this._scene = scene || EngineStore.LastCreatedScene; + if (!this._scene) { + return; } - if (!instanceStorage.instancesData || currentInstancesBufferSize != instanceStorage.instancesBufferSize) { - instanceStorage.instancesData = new Float32Array(instanceStorage.instancesBufferSize / 4); + this.id = id; + this.uniqueId = this._scene.getUniqueId(); + this._engine = this._scene.getEngine(); + this._meshes = []; + this._vertexBuffers = {}; + this._indices = []; + this._updatable = updatable; + if (vertexData) { + this.setAllVerticesData(vertexData, updatable); + } else { + this._totalVertices = 0; } - if (this._scene.needsPreviousWorldMatrices && !instanceStorage.instancesPreviousData || currentInstancesBufferSize != instanceStorage.instancesBufferSize) { - instanceStorage.instancesPreviousData = new Float32Array(instanceStorage.instancesBufferSize / 4); + if (this._engine.getCaps().vertexArrayObject) { + this._vertexArrayObjects = {}; } - let offset = 0; - let instancesCount = 0; - const renderSelf = batch.renderSelf[subMesh._id]; - const needUpdateBuffer = !instancesBuffer || currentInstancesBufferSize !== instanceStorage.instancesBufferSize || this._scene.needsPreviousWorldMatrices && !instanceStorage.instancesPreviousBuffer; - if (!this._instanceDataStorage.manualUpdate && (!instanceStorage.isFrozen || needUpdateBuffer)) { - const world = this.getWorldMatrix(); - if (renderSelf) { - if (this._scene.needsPreviousWorldMatrices) { - if (!instanceStorage.masterMeshPreviousWorldMatrix) { - instanceStorage.masterMeshPreviousWorldMatrix = world.clone(); - instanceStorage.masterMeshPreviousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset); - } else { - instanceStorage.masterMeshPreviousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset); - instanceStorage.masterMeshPreviousWorldMatrix.copyFrom(world); - } - } - world.copyToArray(instanceStorage.instancesData, offset); - offset += 16; - instancesCount++; - } - if (visibleInstances) { - if (_Mesh.INSTANCEDMESH_SORT_TRANSPARENT && this._scene.activeCamera && ((_a = subMesh.getMaterial()) == null ? void 0 : _a.needAlphaBlendingForMesh(subMesh.getRenderingMesh()))) { - const cameraPosition = this._scene.activeCamera.globalPosition; - for (let instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) { - const instanceMesh = visibleInstances[instanceIndex]; - instanceMesh._distanceToCamera = Vector3.Distance(instanceMesh.getBoundingInfo().boundingSphere.centerWorld, cameraPosition); - } - visibleInstances.sort((m1, m2) => { - return m1._distanceToCamera > m2._distanceToCamera ? -1 : m1._distanceToCamera < m2._distanceToCamera ? 1 : 0; - }); - } - for (let instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) { - const instance = visibleInstances[instanceIndex]; - const matrix = instance.getWorldMatrix(); - matrix.copyToArray(instanceStorage.instancesData, offset); - if (this._scene.needsPreviousWorldMatrices) { - if (!instance._previousWorldMatrix) { - instance._previousWorldMatrix = matrix.clone(); - instance._previousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset); - } else { - instance._previousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset); - instance._previousWorldMatrix.copyFrom(matrix); - } - } - offset += 16; - instancesCount++; - } - } - } else { - instancesCount = (renderSelf ? 1 : 0) + visibleInstanceCount; + if (mesh) { + this.applyToMesh(mesh); + mesh.computeWorldMatrix(true); } - if (needUpdateBuffer) { - if (instancesBuffer) { - instancesBuffer.dispose(); - } - if (instancesPreviousBuffer) { - instancesPreviousBuffer.dispose(); - } - instancesBuffer = new Buffer(engine, instanceStorage.instancesData, true, 16, false, true); - instanceStorage.instancesBuffer = instancesBuffer; - if (!this._userInstancedBuffersStorage) { - this._userInstancedBuffersStorage = { - data: {}, - vertexBuffers: {}, - strides: {}, - sizes: {}, - vertexArrayObjects: this.getEngine().getCaps().vertexArrayObject ? {} : void 0 - }; - } - this._userInstancedBuffersStorage.vertexBuffers["world0"] = instancesBuffer.createVertexBuffer("world0", 0, 4); - this._userInstancedBuffersStorage.vertexBuffers["world1"] = instancesBuffer.createVertexBuffer("world1", 4, 4); - this._userInstancedBuffersStorage.vertexBuffers["world2"] = instancesBuffer.createVertexBuffer("world2", 8, 4); - this._userInstancedBuffersStorage.vertexBuffers["world3"] = instancesBuffer.createVertexBuffer("world3", 12, 4); - if (this._scene.needsPreviousWorldMatrices) { - instancesPreviousBuffer = new Buffer(engine, instanceStorage.instancesPreviousData, true, 16, false, true); - instanceStorage.instancesPreviousBuffer = instancesPreviousBuffer; - this._userInstancedBuffersStorage.vertexBuffers["previousWorld0"] = instancesPreviousBuffer.createVertexBuffer("previousWorld0", 0, 4); - this._userInstancedBuffersStorage.vertexBuffers["previousWorld1"] = instancesPreviousBuffer.createVertexBuffer("previousWorld1", 4, 4); - this._userInstancedBuffersStorage.vertexBuffers["previousWorld2"] = instancesPreviousBuffer.createVertexBuffer("previousWorld2", 8, 4); - this._userInstancedBuffersStorage.vertexBuffers["previousWorld3"] = instancesPreviousBuffer.createVertexBuffer("previousWorld3", 12, 4); - } - this._invalidateInstanceVertexArrayObject(); - } else { - if (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) { - instancesBuffer.updateDirectly(instanceStorage.instancesData, 0, instancesCount); - if (this._scene.needsPreviousWorldMatrices && (!this._instanceDataStorage.manualUpdate || this._instanceDataStorage.previousManualUpdate)) { - instancesPreviousBuffer.updateDirectly(instanceStorage.instancesPreviousData, 0, instancesCount); - } + } + /** + * Gets the current extend of the geometry + */ + get extend() { + return this._extend; + } + /** + * Gets the hosting scene + * @returns the hosting Scene + */ + getScene() { + return this._scene; + } + /** + * Gets the hosting engine + * @returns the hosting Engine + */ + getEngine() { + return this._engine; + } + /** + * Defines if the geometry is ready to use + * @returns true if the geometry is ready to be used + */ + isReady() { + return this.delayLoadState === 1 || this.delayLoadState === 0; + } + /** + * Gets a value indicating that the geometry should not be serialized + */ + get doNotSerialize() { + for (let index = 0; index < this._meshes.length; index++) { + if (!this._meshes[index].doNotSerialize) { + return false; } } - this._processInstancedBuffers(visibleInstances, renderSelf); - this.getScene()._activeIndices.addCount(subMesh.indexCount * instancesCount, false); - if (engine._currentDrawContext) { - engine._currentDrawContext.useInstancing = true; + return true; + } + /** @internal */ + _rebuild() { + if (this._vertexArrayObjects) { + this._vertexArrayObjects = {}; } - this._bind(subMesh, effect, fillMode); - this._draw(subMesh, fillMode, instancesCount); - if (this._scene.needsPreviousWorldMatrices && !needUpdateBuffer && this._instanceDataStorage.manualUpdate && (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) && !this._instanceDataStorage.previousManualUpdate) { - instancesPreviousBuffer.updateDirectly(instanceStorage.instancesData, 0, instancesCount); + if (this._meshes.length !== 0 && this._indices) { + this._indexBuffer = this._engine.createIndexBuffer(this._indices, this._updatable, "Geometry_" + this.id + "_IndexBuffer"); } - engine.unbindInstanceAttributes(); - return this; + const buffers = /* @__PURE__ */ new Set(); + for (const key in this._vertexBuffers) { + buffers.add(this._vertexBuffers[key].getWrapperBuffer()); + } + buffers.forEach((buffer) => { + buffer._rebuild(); + }); } /** - * @internal + * Affects all geometry data in one call + * @param vertexData defines the geometry data + * @param updatable defines if the geometry must be flagged as updatable (false as default) */ - _renderWithThinInstances(subMesh, fillMode, effect, engine) { - var _a; - const instancesCount = ((_a = this._thinInstanceDataStorage) == null ? void 0 : _a.instancesCount) ?? 0; - this.getScene()._activeIndices.addCount(subMesh.indexCount * instancesCount, false); - if (engine._currentDrawContext) { - engine._currentDrawContext.useInstancing = true; - } - this._bind(subMesh, effect, fillMode); - this._draw(subMesh, fillMode, instancesCount); - if (this._scene.needsPreviousWorldMatrices && !this._thinInstanceDataStorage.previousMatrixData && this._thinInstanceDataStorage.matrixData) { - if (!this._thinInstanceDataStorage.previousMatrixBuffer) { - this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer("previousWorld", this._thinInstanceDataStorage.matrixData, false); - } else { - this._thinInstanceDataStorage.previousMatrixBuffer.updateDirectly(this._thinInstanceDataStorage.matrixData, 0, instancesCount); - } - } - engine.unbindInstanceAttributes(); + setAllVerticesData(vertexData, updatable) { + vertexData.applyToGeometry(this, updatable); + this._notifyUpdate(); } /** - * @internal + * Set specific vertex data + * @param kind defines the data kind (Position, normal, etc...) + * @param data defines the vertex data to use + * @param updatable defines if the vertex must be flagged as updatable (false as default) + * @param stride defines the stride to use (0 by default). This value is deduced from the kind value if not specified */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _processInstancedBuffers(visibleInstances, renderSelf) { + setVerticesData(kind, data, updatable = false, stride) { + if (updatable && Array.isArray(data)) { + data = new Float32Array(data); + } + const buffer = new VertexBuffer(this._engine, data, kind, { + updatable, + postponeInternalCreation: this._meshes.length === 0, + stride, + label: "Geometry_" + this.id + "_" + kind + }); + this.setVerticesBuffer(buffer); } /** - * @internal + * Removes a specific vertex data + * @param kind defines the data kind (Position, normal, etc...) */ - _processRendering(renderingMesh, subMesh, effect, fillMode, batch, hardwareInstancedRendering, onBeforeDraw, effectiveMaterial) { - const scene = this.getScene(); - const engine = scene.getEngine(); - fillMode = this._getRenderingFillMode(fillMode); - if (hardwareInstancedRendering && subMesh.getRenderingMesh().hasThinInstances) { - this._renderWithThinInstances(subMesh, fillMode, effect, engine); - return this; + removeVerticesData(kind) { + if (this._vertexBuffers[kind]) { + this._vertexBuffers[kind].dispose(); + delete this._vertexBuffers[kind]; } - if (hardwareInstancedRendering) { - this._renderWithInstances(subMesh, fillMode, batch, effect, engine); - } else { - if (engine._currentDrawContext) { - engine._currentDrawContext.useInstancing = false; - } - let instanceCount = 0; - if (batch.renderSelf[subMesh._id]) { - if (onBeforeDraw) { - onBeforeDraw(false, renderingMesh.getWorldMatrix(), effectiveMaterial); - } - instanceCount++; - this._draw(subMesh, fillMode, this._instanceDataStorage.overridenInstanceCount); - } - const visibleInstancesForSubMesh = batch.visibleInstances[subMesh._id]; - if (visibleInstancesForSubMesh) { - const visibleInstanceCount = visibleInstancesForSubMesh.length; - instanceCount += visibleInstanceCount; - for (let instanceIndex = 0; instanceIndex < visibleInstanceCount; instanceIndex++) { - const instance = visibleInstancesForSubMesh[instanceIndex]; - const world = instance.getWorldMatrix(); - if (onBeforeDraw) { - onBeforeDraw(true, world, effectiveMaterial); - } - this._draw(subMesh, fillMode); - } - } - scene._activeIndices.addCount(subMesh.indexCount * instanceCount, false); + if (this._vertexArrayObjects) { + this._disposeVertexArrayObjects(); } - return this; } /** - * @internal + * Affect a vertex buffer to the geometry. the vertexBuffer.getKind() function is used to determine where to store the data + * @param buffer defines the vertex buffer to use + * @param totalVertices defines the total number of vertices for position kind (could be null) + * @param disposeExistingBuffer disposes the existing buffer, if any (default: true) */ - _rebuild(dispose = false) { - if (this._instanceDataStorage.instancesBuffer) { - if (dispose) { - this._instanceDataStorage.instancesBuffer.dispose(); - } - this._instanceDataStorage.instancesBuffer = null; + setVerticesBuffer(buffer, totalVertices = null, disposeExistingBuffer = true) { + const kind = buffer.getKind(); + if (this._vertexBuffers[kind] && disposeExistingBuffer) { + this._vertexBuffers[kind].dispose(); } - if (this._userInstancedBuffersStorage) { - for (const kind in this._userInstancedBuffersStorage.vertexBuffers) { - const buffer = this._userInstancedBuffersStorage.vertexBuffers[kind]; - if (buffer) { - if (dispose) { - buffer.dispose(); - } - this._userInstancedBuffersStorage.vertexBuffers[kind] = null; - } - } - if (this._userInstancedBuffersStorage.vertexArrayObjects) { - this._userInstancedBuffersStorage.vertexArrayObjects = {}; + if (buffer._buffer) { + buffer._buffer._increaseReferences(); + } + this._vertexBuffers[kind] = buffer; + const meshes = this._meshes; + const numOfMeshes = meshes.length; + if (kind === VertexBuffer.PositionKind) { + this._totalVertices = totalVertices ?? buffer._maxVerticesCount; + this._updateExtend(buffer.getFloatData(this._totalVertices)); + this._resetPointsArrayCache(); + const minimum = this._extend && this._extend.minimum || new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); + const maximum = this._extend && this._extend.maximum || new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); + for (let index = 0; index < numOfMeshes; index++) { + const mesh = meshes[index]; + mesh.buildBoundingInfo(minimum, maximum); + mesh._createGlobalSubMesh(mesh.isUnIndexed); + mesh.computeWorldMatrix(true); + mesh.synchronizeInstances(); } } - this._internalMeshDataInfo._effectiveMaterial = null; - super._rebuild(dispose); + this._notifyUpdate(kind); } - /** @internal */ - _freeze() { - if (!this.subMeshes) { + /** + * Update a specific vertex buffer + * This function will directly update the underlying DataBuffer according to the passed numeric array or Float32Array + * It will do nothing if the buffer is not updatable + * @param kind defines the data kind (Position, normal, etc...) + * @param data defines the data to use + * @param offset defines the offset in the target buffer where to store the data + * @param useBytes set to true if the offset is in bytes + */ + updateVerticesDataDirectly(kind, data, offset, useBytes = false) { + const vertexBuffer = this.getVertexBuffer(kind); + if (!vertexBuffer) { return; } - for (let index = 0; index < this.subMeshes.length; index++) { - this._getInstancesRenderList(index); - } - this._internalMeshDataInfo._effectiveMaterial = null; - this._instanceDataStorage.isFrozen = true; - } - /** @internal */ - _unFreeze() { - this._instanceDataStorage.isFrozen = false; - this._instanceDataStorage.previousBatch = null; + vertexBuffer.updateDirectly(data, offset, useBytes); + this._notifyUpdate(kind); } /** - * Triggers the draw call for the mesh (or a submesh), for a specific render pass id - * @param renderPassId defines the render pass id to use to draw the mesh / submesh. If not provided, use the current renderPassId of the engine. - * @param enableAlphaMode defines if alpha mode can be changed (default: false) - * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering (default: undefined) - * @param subMesh defines the subMesh to render. If not provided, draw all mesh submeshes (default: undefined) - * @param checkFrustumCulling defines if frustum culling must be checked (default: true). If you know the mesh is in the frustum (or if you don't care!), you can pass false to optimize. - * @returns the current mesh + * Update a specific vertex buffer + * This function will create a new buffer if the current one is not updatable + * @param kind defines the data kind (Position, normal, etc...) + * @param data defines the data to use + * @param updateExtends defines if the geometry extends must be recomputed (false by default) */ - renderWithRenderPassId(renderPassId, enableAlphaMode, effectiveMeshReplacement, subMesh, checkFrustumCulling = true) { - const engine = this._scene.getEngine(); - const currentRenderPassId = engine.currentRenderPassId; - if (renderPassId !== void 0) { - engine.currentRenderPassId = renderPassId; + updateVerticesData(kind, data, updateExtends = false) { + const vertexBuffer = this.getVertexBuffer(kind); + if (!vertexBuffer) { + return; } - if (subMesh) { - if (!checkFrustumCulling || checkFrustumCulling && subMesh.isInFrustum(this._scene._frustumPlanes)) { - this.render(subMesh, !!enableAlphaMode, effectiveMeshReplacement); - } - } else { - for (let s = 0; s < this.subMeshes.length; s++) { - const subMesh2 = this.subMeshes[s]; - if (!checkFrustumCulling || checkFrustumCulling && subMesh2.isInFrustum(this._scene._frustumPlanes)) { - this.render(subMesh2, !!enableAlphaMode, effectiveMeshReplacement); + vertexBuffer.update(data); + if (kind === VertexBuffer.PositionKind) { + this._updateBoundingInfo(updateExtends, data); + } + this._notifyUpdate(kind); + } + _updateBoundingInfo(updateExtends, data) { + if (updateExtends) { + this._updateExtend(data); + } + this._resetPointsArrayCache(); + if (updateExtends) { + const meshes = this._meshes; + for (const mesh of meshes) { + if (mesh.hasBoundingInfo) { + mesh.getBoundingInfo().reConstruct(this._extend.minimum, this._extend.maximum); + } else { + mesh.buildBoundingInfo(this._extend.minimum, this._extend.maximum); + } + const subMeshes = mesh.subMeshes; + for (const subMesh of subMeshes) { + subMesh.refreshBoundingInfo(); } } } - if (renderPassId !== void 0) { - engine.currentRenderPassId = currentRenderPassId; - } - return this; } /** - * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager - * @param subMesh defines the subMesh to render - * @param enableAlphaMode defines if alpha mode can be changed - * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering - * @returns the current mesh + * @internal */ - render(subMesh, enableAlphaMode, effectiveMeshReplacement) { - var _a, _b; - const scene = this.getScene(); - if (this._internalAbstractMeshDataInfo._isActiveIntermediate) { - this._internalAbstractMeshDataInfo._isActiveIntermediate = false; - } else { - this._internalAbstractMeshDataInfo._isActive = false; + _bind(effect, indexToBind, overrideVertexBuffers, overrideVertexArrayObjects) { + if (!effect) { + return; } - const numActiveCameras = ((_a = scene.activeCameras) == null ? void 0 : _a.length) ?? 0; - const canCheckOcclusionQuery = numActiveCameras > 1 && scene.activeCamera === scene.activeCameras[0] || numActiveCameras <= 1; - if (canCheckOcclusionQuery && this._checkOcclusionQuery() && !this._occlusionDataStorage.forceRenderingWhenOccluded) { - return this; + if (indexToBind === void 0) { + indexToBind = this._indexBuffer; } - const batch = this._getInstancesRenderList(subMesh._id, !!effectiveMeshReplacement); - if (batch.mustReturn) { - return this; - } - if (!this._geometry || !this._geometry.getVertexBuffers() || !this._unIndexed && !this._geometry.getIndexBuffer()) { - return this; + const vbs = this.getVertexBuffers(); + if (!vbs) { + return; } - const engine = scene.getEngine(); - let oldCameraMaxZ = 0; - let oldCamera = null; - if (this.ignoreCameraMaxZ && scene.activeCamera && !scene._isInIntermediateRendering()) { - oldCameraMaxZ = scene.activeCamera.maxZ; - oldCamera = scene.activeCamera; - scene.activeCamera.maxZ = 0; - scene.updateTransformMatrix(true); + if (indexToBind != this._indexBuffer || !this._vertexArrayObjects && !overrideVertexArrayObjects) { + this._engine.bindBuffers(vbs, indexToBind, effect, overrideVertexBuffers); + return; } - if (this._internalMeshDataInfo._onBeforeRenderObservable) { - this._internalMeshDataInfo._onBeforeRenderObservable.notifyObservers(this); + const vaos = overrideVertexArrayObjects ? overrideVertexArrayObjects : this._vertexArrayObjects; + if (!vaos[effect.key]) { + vaos[effect.key] = this._engine.recordVertexArrayObject(vbs, indexToBind, effect, overrideVertexBuffers); } - const renderingMesh = subMesh.getRenderingMesh(); - const hardwareInstancedRendering = batch.hardwareInstancedRendering[subMesh._id] || renderingMesh.hasThinInstances || !!this._userInstancedBuffersStorage && !subMesh.getMesh()._internalAbstractMeshDataInfo._actAsRegularMesh; - const instanceDataStorage = this._instanceDataStorage; - const material = subMesh.getMaterial(); - if (!material) { - if (oldCamera) { - oldCamera.maxZ = oldCameraMaxZ; - scene.updateTransformMatrix(true); - } - return this; + this._engine.bindVertexArrayObject(vaos[effect.key], indexToBind); + } + /** + * Gets total number of vertices + * @returns the total number of vertices + */ + getTotalVertices() { + if (!this.isReady()) { + return 0; } - if (!instanceDataStorage.isFrozen || !this._internalMeshDataInfo._effectiveMaterial || this._internalMeshDataInfo._effectiveMaterial !== material) { - if (material._storeEffectOnSubMeshes) { - if (!material.isReadyForSubMesh(this, subMesh, hardwareInstancedRendering)) { - if (oldCamera) { - oldCamera.maxZ = oldCameraMaxZ; - scene.updateTransformMatrix(true); - } - return this; - } - } else if (!material.isReady(this, hardwareInstancedRendering)) { - if (oldCamera) { - oldCamera.maxZ = oldCameraMaxZ; - scene.updateTransformMatrix(true); - } - return this; - } - this._internalMeshDataInfo._effectiveMaterial = material; - } else if (material._storeEffectOnSubMeshes && !((_b = subMesh._drawWrapper) == null ? void 0 : _b._wasPreviouslyReady) || !material._storeEffectOnSubMeshes && !material._getDrawWrapper()._wasPreviouslyReady) { - if (oldCamera) { - oldCamera.maxZ = oldCameraMaxZ; - scene.updateTransformMatrix(true); - } - return this; + return this._totalVertices; + } + /** + * Gets a specific vertex data attached to this geometry. Float data is constructed if the vertex buffer data cannot be returned directly. + * @param kind defines the data kind (Position, normal, etc...) + * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes + * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it + * @returns a float array containing vertex data + */ + getVerticesData(kind, copyWhenShared, forceCopy) { + const vertexBuffer = this.getVertexBuffer(kind); + if (!vertexBuffer) { + return null; } - if (enableAlphaMode) { - engine.setAlphaMode(this._internalMeshDataInfo._effectiveMaterial.alphaMode); + return vertexBuffer.getFloatData(this._totalVertices, forceCopy || copyWhenShared && this._meshes.length !== 1); + } + /** + * Returns a boolean defining if the vertex data for the requested `kind` is updatable + * @param kind defines the data kind (Position, normal, etc...) + * @returns true if the vertex buffer with the specified kind is updatable + */ + isVertexBufferUpdatable(kind) { + const vb = this._vertexBuffers[kind]; + if (!vb) { + return false; } - let drawWrapper; - if (this._internalMeshDataInfo._effectiveMaterial._storeEffectOnSubMeshes) { - drawWrapper = subMesh._drawWrapper; - } else { - drawWrapper = this._internalMeshDataInfo._effectiveMaterial._getDrawWrapper(); + return vb.isUpdatable(); + } + /** + * Gets a specific vertex buffer + * @param kind defines the data kind (Position, normal, etc...) + * @returns a VertexBuffer + */ + getVertexBuffer(kind) { + if (!this.isReady()) { + return null; } - const effect = (drawWrapper == null ? void 0 : drawWrapper.effect) ?? null; - for (const step of scene._beforeRenderingMeshStage) { - step.action(this, subMesh, batch, effect); + return this._vertexBuffers[kind]; + } + /** + * Returns all vertex buffers + * @returns an object holding all vertex buffers indexed by kind + */ + getVertexBuffers() { + if (!this.isReady()) { + return null; } - if (!drawWrapper || !effect) { - if (oldCamera) { - oldCamera.maxZ = oldCameraMaxZ; - scene.updateTransformMatrix(true); + return this._vertexBuffers; + } + /** + * Gets a boolean indicating if specific vertex buffer is present + * @param kind defines the data kind (Position, normal, etc...) + * @returns true if data is present + */ + isVerticesDataPresent(kind) { + if (!this._vertexBuffers) { + if (this._delayInfo) { + return this._delayInfo.indexOf(kind) !== -1; } - return this; + return false; } - const effectiveMesh = effectiveMeshReplacement || this; - let sideOrientation; - if (!instanceDataStorage.isFrozen && (this._internalMeshDataInfo._effectiveMaterial.backFaceCulling || this.overrideMaterialSideOrientation !== null || this._internalMeshDataInfo._effectiveMaterial.twoSidedLighting)) { - const mainDeterminant = effectiveMesh._getWorldMatrixDeterminant(); - sideOrientation = this.overrideMaterialSideOrientation; - if (sideOrientation == null) { - sideOrientation = this._internalMeshDataInfo._effectiveMaterial.sideOrientation; - } - if (mainDeterminant < 0) { - sideOrientation = sideOrientation === Material.ClockWiseSideOrientation ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation; + return this._vertexBuffers[kind] !== void 0; + } + /** + * Gets a list of all attached data kinds (Position, normal, etc...) + * @returns a list of string containing all kinds + */ + getVerticesDataKinds() { + const result = []; + let kind; + if (!this._vertexBuffers && this._delayInfo) { + for (kind in this._delayInfo) { + result.push(kind); } - instanceDataStorage.sideOrientation = sideOrientation; - } else { - sideOrientation = instanceDataStorage.sideOrientation; - } - const reverse = this._internalMeshDataInfo._effectiveMaterial._preBind(drawWrapper, sideOrientation); - if (this._internalMeshDataInfo._effectiveMaterial.forceDepthWrite) { - engine.setDepthWrite(true); - } - const effectiveMaterial = this._internalMeshDataInfo._effectiveMaterial; - const fillMode = effectiveMaterial.fillMode; - if (this._internalMeshDataInfo._onBeforeBindObservable) { - this._internalMeshDataInfo._onBeforeBindObservable.notifyObservers(this); - } - if (!hardwareInstancedRendering) { - this._bind(subMesh, effect, fillMode, false); - } - const world = effectiveMesh.getWorldMatrix(); - if (effectiveMaterial._storeEffectOnSubMeshes) { - effectiveMaterial.bindForSubMesh(world, this, subMesh); } else { - effectiveMaterial.bind(world, this); - } - if (!effectiveMaterial.backFaceCulling && effectiveMaterial.separateCullingPass) { - engine.setState(true, effectiveMaterial.zOffset, false, !reverse, effectiveMaterial.cullBackFaces, effectiveMaterial.stencil, effectiveMaterial.zOffsetUnits); - this._processRendering(this, subMesh, effect, fillMode, batch, hardwareInstancedRendering, this._onBeforeDraw, this._internalMeshDataInfo._effectiveMaterial); - engine.setState(true, effectiveMaterial.zOffset, false, reverse, effectiveMaterial.cullBackFaces, effectiveMaterial.stencil, effectiveMaterial.zOffsetUnits); - if (this._internalMeshDataInfo._onBetweenPassObservable) { - this._internalMeshDataInfo._onBetweenPassObservable.notifyObservers(subMesh); + for (kind in this._vertexBuffers) { + result.push(kind); } } - this._processRendering(this, subMesh, effect, fillMode, batch, hardwareInstancedRendering, this._onBeforeDraw, this._internalMeshDataInfo._effectiveMaterial); - this._internalMeshDataInfo._effectiveMaterial.unbind(); - for (const step of scene._afterRenderingMeshStage) { - step.action(this, subMesh, batch, effect); - } - if (this._internalMeshDataInfo._onAfterRenderObservable) { - this._internalMeshDataInfo._onAfterRenderObservable.notifyObservers(this); - } - if (oldCamera) { - oldCamera.maxZ = oldCameraMaxZ; - scene.updateTransformMatrix(true); - } - if (scene.performancePriority === ScenePerformancePriority.Aggressive && !instanceDataStorage.isFrozen) { - this._freeze(); - } - return this; + return result; } /** - * Renormalize the mesh and patch it up if there are no weights - * Similar to normalization by adding the weights compute the reciprocal and multiply all elements, this wil ensure that everything adds to 1. - * However in the case of zero weights then we set just a single influence to 1. - * We check in the function for extra's present and if so we use the normalizeSkinWeightsWithExtras rather than the FourWeights version. + * Update index buffer + * @param indices defines the indices to store in the index buffer + * @param offset defines the offset in the target buffer where to store the data + * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default) */ - cleanMatrixWeights() { - if (this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) { - if (this.isVerticesDataPresent(VertexBuffer.MatricesWeightsExtraKind)) { - this._normalizeSkinWeightsAndExtra(); - } else { - this._normalizeSkinFourWeights(); - } + updateIndices(indices, offset, gpuMemoryOnly = false) { + if (!this._indexBuffer) { + return; } - } - // faster 4 weight version. - _normalizeSkinFourWeights() { - const matricesWeights = this.getVerticesData(VertexBuffer.MatricesWeightsKind); - const numWeights = matricesWeights.length; - for (let a = 0; a < numWeights; a += 4) { - const t = matricesWeights[a] + matricesWeights[a + 1] + matricesWeights[a + 2] + matricesWeights[a + 3]; - if (t === 0) { - matricesWeights[a] = 1; - } else { - const recip = 1 / t; - matricesWeights[a] *= recip; - matricesWeights[a + 1] *= recip; - matricesWeights[a + 2] *= recip; - matricesWeights[a + 3] *= recip; + if (!this._indexBufferIsUpdatable) { + this.setIndices(indices, null, true); + } else { + const needToUpdateSubMeshes = indices.length !== this._indices.length; + if (!gpuMemoryOnly) { + this._indices = indices.slice(); + } + this._engine.updateDynamicIndexBuffer(this._indexBuffer, indices, offset); + if (needToUpdateSubMeshes) { + for (const mesh of this._meshes) { + mesh._createGlobalSubMesh(true); + } } } - this.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeights); } - // handle special case of extra verts. (in theory gltf can handle 12 influences) - _normalizeSkinWeightsAndExtra() { - const matricesWeightsExtra = this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind); - const matricesWeights = this.getVerticesData(VertexBuffer.MatricesWeightsKind); - const numWeights = matricesWeights.length; - for (let a = 0; a < numWeights; a += 4) { - let t = matricesWeights[a] + matricesWeights[a + 1] + matricesWeights[a + 2] + matricesWeights[a + 3]; - t += matricesWeightsExtra[a] + matricesWeightsExtra[a + 1] + matricesWeightsExtra[a + 2] + matricesWeightsExtra[a + 3]; - if (t === 0) { - matricesWeights[a] = 1; - } else { - const recip = 1 / t; - matricesWeights[a] *= recip; - matricesWeights[a + 1] *= recip; - matricesWeights[a + 2] *= recip; - matricesWeights[a + 3] *= recip; - matricesWeightsExtra[a] *= recip; - matricesWeightsExtra[a + 1] *= recip; - matricesWeightsExtra[a + 2] *= recip; - matricesWeightsExtra[a + 3] *= recip; - } + /** + * Sets the index buffer for this geometry. + * @param indexBuffer Defines the index buffer to use for this geometry + * @param totalVertices Defines the total number of vertices used by the buffer + * @param totalIndices Defines the total number of indices in the index buffer + */ + setIndexBuffer(indexBuffer, totalVertices, totalIndices) { + this._indices = []; + this._indexBufferIsUpdatable = false; + this._indexBuffer = indexBuffer; + this._totalVertices = totalVertices; + this._totalIndices = totalIndices; + indexBuffer.is32Bits || (indexBuffer.is32Bits = this._totalIndices > 65535); + for (const mesh of this._meshes) { + mesh._createGlobalSubMesh(true); + mesh.synchronizeInstances(); } - this.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeights); - this.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeightsExtra); + this._notifyUpdate(); } /** - * ValidateSkinning is used to determine that a mesh has valid skinning data along with skin metrics, if missing weights, - * or not normalized it is returned as invalid mesh the string can be used for console logs, or on screen messages to let - * the user know there was an issue with importing the mesh - * @returns a validation object with skinned, valid and report string + * Creates a new index buffer + * @param indices defines the indices to store in the index buffer + * @param totalVertices defines the total number of vertices (could be null) + * @param updatable defines if the index buffer must be flagged as updatable (false by default) */ - validateSkinning() { - const matricesWeightsExtra = this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind); - const matricesWeights = this.getVerticesData(VertexBuffer.MatricesWeightsKind); - if (matricesWeights === null || this.skeleton == null) { - return { skinned: false, valid: true, report: "not skinned" }; + setIndices(indices, totalVertices = null, updatable = false) { + if (this._indexBuffer) { + this._engine._releaseBuffer(this._indexBuffer); } - const numWeights = matricesWeights.length; - let numberNotSorted = 0; - let missingWeights = 0; - let maxUsedWeights = 0; - let numberNotNormalized = 0; - const numInfluences = matricesWeightsExtra === null ? 4 : 8; - const usedWeightCounts = []; - for (let a = 0; a <= numInfluences; a++) { - usedWeightCounts[a] = 0; + this._indices = indices; + this._indexBufferIsUpdatable = updatable; + if (this._meshes.length !== 0 && this._indices) { + this._indexBuffer = this._engine.createIndexBuffer(this._indices, updatable, "Geometry_" + this.id + "_IndexBuffer"); } - const toleranceEpsilon = 1e-3; - for (let a = 0; a < numWeights; a += 4) { - let lastWeight = matricesWeights[a]; - let t = lastWeight; - let usedWeights = t === 0 ? 0 : 1; - for (let b = 1; b < numInfluences; b++) { - const d = b < 4 ? matricesWeights[a + b] : matricesWeightsExtra[a + b - 4]; - if (d > lastWeight) { - numberNotSorted++; - } - if (d !== 0) { - usedWeights++; - } - t += d; - lastWeight = d; - } - usedWeightCounts[usedWeights]++; - if (usedWeights > maxUsedWeights) { - maxUsedWeights = usedWeights; - } - if (t === 0) { - missingWeights++; - } else { - const recip = 1 / t; - let tolerance = 0; - for (let b = 0; b < numInfluences; b++) { - if (b < 4) { - tolerance += Math.abs(matricesWeights[a + b] - matricesWeights[a + b] * recip); - } else { - tolerance += Math.abs(matricesWeightsExtra[a + b - 4] - matricesWeightsExtra[a + b - 4] * recip); - } - } - if (tolerance > toleranceEpsilon) { - numberNotNormalized++; - } - } + if (totalVertices != void 0) { + this._totalVertices = totalVertices; } - const numBones = this.skeleton.bones.length; - const matricesIndices = this.getVerticesData(VertexBuffer.MatricesIndicesKind); - const matricesIndicesExtra = this.getVerticesData(VertexBuffer.MatricesIndicesExtraKind); - let numBadBoneIndices = 0; - for (let a = 0; a < numWeights; a += 4) { - for (let b = 0; b < numInfluences; b++) { - const index = b < 4 ? matricesIndices[a + b] : matricesIndicesExtra[a + b - 4]; - if (index >= numBones || index < 0) { - numBadBoneIndices++; - } - } + for (const mesh of this._meshes) { + mesh._createGlobalSubMesh(true); + mesh.synchronizeInstances(); } - const output = "Number of Weights = " + numWeights / 4 + "\nMaximum influences = " + maxUsedWeights + "\nMissing Weights = " + missingWeights + "\nNot Sorted = " + numberNotSorted + "\nNot Normalized = " + numberNotNormalized + "\nWeightCounts = [" + usedWeightCounts + "]\nNumber of bones = " + numBones + "\nBad Bone Indices = " + numBadBoneIndices; - return { skinned: true, valid: missingWeights === 0 && numberNotNormalized === 0 && numBadBoneIndices === 0, report: output }; + this._notifyUpdate(); } - /** @internal */ - _checkDelayState() { - const scene = this.getScene(); - if (this._geometry) { - this._geometry.load(scene); - } else if (this.delayLoadState === 4) { - this.delayLoadState = 2; - this._queueLoad(scene); + /** + * Return the total number of indices + * @returns the total number of indices + */ + getTotalIndices() { + if (!this.isReady()) { + return 0; } - return this; - } - _queueLoad(scene) { - scene.addPendingData(this); - const getBinaryData = this.delayLoadingFile.indexOf(".babylonbinarymeshdata") !== -1; - Tools.LoadFile(this.delayLoadingFile, (data) => { - if (data instanceof ArrayBuffer) { - this._delayLoadingFunction(data, this); - } else { - this._delayLoadingFunction(JSON.parse(data), this); - } - this.instances.forEach((instance) => { - instance.refreshBoundingInfo(); - instance._syncSubMeshes(); - }); - this.delayLoadState = 1; - scene.removePendingData(this); - }, () => { - }, scene.offlineProvider, getBinaryData); - return this; + return this._totalIndices !== void 0 ? this._totalIndices : this._indices.length; } /** - * Returns `true` if the mesh is within the frustum defined by the passed array of planes. - * A mesh is in the frustum if its bounding box intersects the frustum - * @param frustumPlanes defines the frustum to test - * @returns true if the mesh is in the frustum planes + * Gets the index buffer array + * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes + * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it + * @returns the index buffer array */ - isInFrustum(frustumPlanes) { - if (this.delayLoadState === 2) { - return false; + getIndices(copyWhenShared, forceCopy) { + if (!this.isReady()) { + return null; } - if (!super.isInFrustum(frustumPlanes)) { - return false; + const orig = this._indices; + if (!forceCopy && (!copyWhenShared || this._meshes.length === 1)) { + return orig; + } else { + return orig.slice(); } - this._checkDelayState(); - return true; } /** - * Sets the mesh material by the material or multiMaterial `id` property - * @param id is a string identifying the material or the multiMaterial - * @returns the current mesh + * Gets the index buffer + * @returns the index buffer */ - setMaterialById(id) { - const materials = this.getScene().materials; - let index; - for (index = materials.length - 1; index > -1; index--) { - if (materials[index].id === id) { - this.material = materials[index]; - return this; - } - } - const multiMaterials = this.getScene().multiMaterials; - for (index = multiMaterials.length - 1; index > -1; index--) { - if (multiMaterials[index].id === id) { - this.material = multiMaterials[index]; - return this; - } + getIndexBuffer() { + if (!this.isReady()) { + return null; } - return this; + return this._indexBuffer; } /** - * Returns as a new array populated with the mesh material and/or skeleton, if any. - * @returns an array of IAnimatable + * @internal */ - getAnimatables() { - const results = []; - if (this.material) { - results.push(this.material); + _releaseVertexArrayObject(effect = null) { + if (!effect || !this._vertexArrayObjects) { + return; } - if (this.skeleton) { - results.push(this.skeleton); + if (this._vertexArrayObjects[effect.key]) { + this._engine.releaseVertexArrayObject(this._vertexArrayObjects[effect.key]); + delete this._vertexArrayObjects[effect.key]; } - return results; } /** - * Modifies the mesh geometry according to the passed transformation matrix. - * This method returns nothing, but it really modifies the mesh even if it's originally not set as updatable. - * The mesh normals are modified using the same transformation. - * Note that, under the hood, this method sets a new VertexBuffer each call. - * @param transform defines the transform matrix to use - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms - * @returns the current mesh + * Release the associated resources for a specific mesh + * @param mesh defines the source mesh + * @param shouldDispose defines if the geometry must be disposed if there is no more mesh pointing to it */ - bakeTransformIntoVertices(transform) { - if (!this.isVerticesDataPresent(VertexBuffer.PositionKind)) { - return this; + releaseForMesh(mesh, shouldDispose) { + const meshes = this._meshes; + const index = meshes.indexOf(mesh); + if (index === -1) { + return; } - const submeshes = this.subMeshes.splice(0); - this._resetPointsArrayCache(); - let data = this.getVerticesData(VertexBuffer.PositionKind); - const temp = Vector3.Zero(); - let index; - for (index = 0; index < data.length; index += 3) { - Vector3.TransformCoordinatesFromFloatsToRef(data[index], data[index + 1], data[index + 2], transform, temp).toArray(data, index); + meshes.splice(index, 1); + if (this._vertexArrayObjects) { + mesh._invalidateInstanceVertexArrayObject(); } - this.setVerticesData(VertexBuffer.PositionKind, data, this.getVertexBuffer(VertexBuffer.PositionKind).isUpdatable()); - if (this.isVerticesDataPresent(VertexBuffer.NormalKind)) { - data = this.getVerticesData(VertexBuffer.NormalKind); - for (index = 0; index < data.length; index += 3) { - Vector3.TransformNormalFromFloatsToRef(data[index], data[index + 1], data[index + 2], transform, temp).normalize().toArray(data, index); - } - this.setVerticesData(VertexBuffer.NormalKind, data, this.getVertexBuffer(VertexBuffer.NormalKind).isUpdatable()); + mesh._geometry = null; + if (meshes.length === 0 && shouldDispose) { + this.dispose(); } - if (this.isVerticesDataPresent(VertexBuffer.TangentKind)) { - data = this.getVerticesData(VertexBuffer.TangentKind); - for (index = 0; index < data.length; index += 4) { - Vector3.TransformNormalFromFloatsToRef(data[index], data[index + 1], data[index + 2], transform, temp).normalize().toArray(data, index); - } - this.setVerticesData(VertexBuffer.TangentKind, data, this.getVertexBuffer(VertexBuffer.TangentKind).isUpdatable()); - } - if (transform.determinant() < 0) { - this.flipFaces(); - } - this.releaseSubMeshes(); - this.subMeshes = submeshes; - return this; } /** - * Modifies the mesh geometry according to its own current World Matrix. - * The mesh World Matrix is then reset. - * This method returns nothing but really modifies the mesh even if it's originally not set as updatable. - * Note that, under the hood, this method sets a new VertexBuffer each call. - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms - * @param bakeIndependentlyOfChildren indicates whether to preserve all child nodes' World Matrix during baking - * @returns the current mesh + * Apply current geometry to a given mesh + * @param mesh defines the mesh to apply geometry to */ - bakeCurrentTransformIntoVertices(bakeIndependentlyOfChildren = true) { - this.bakeTransformIntoVertices(this.computeWorldMatrix(true)); - this.resetLocalMatrix(bakeIndependentlyOfChildren); - return this; - } - // Cache - /** @internal */ - get _positions() { - if (this._internalAbstractMeshDataInfo._positions) { - return this._internalAbstractMeshDataInfo._positions; + applyToMesh(mesh) { + if (mesh._geometry === this) { + return; } - if (this._geometry) { - return this._geometry._positions; + const previousGeometry = mesh._geometry; + if (previousGeometry) { + previousGeometry.releaseForMesh(mesh); } - return null; - } - /** @internal */ - _resetPointsArrayCache() { - if (this._geometry) { - this._geometry._resetPointsArrayCache(); + if (this._vertexArrayObjects) { + mesh._invalidateInstanceVertexArrayObject(); + } + const meshes = this._meshes; + mesh._geometry = this; + mesh._internalAbstractMeshDataInfo._positions = null; + this._scene.pushGeometry(this); + meshes.push(mesh); + if (this.isReady()) { + this._applyToMesh(mesh); + } else if (this._boundingInfo) { + mesh.setBoundingInfo(this._boundingInfo); } - return this; } - /** @internal */ - _generatePointsArray() { - if (this._geometry) { - return this._geometry._generatePointsArray(); + _updateExtend(data = null) { + if (this.useBoundingInfoFromGeometry && this._boundingInfo) { + this._extend = { + minimum: this._boundingInfo.minimum.clone(), + maximum: this._boundingInfo.maximum.clone() + }; + } else { + if (!data) { + data = this.getVerticesData(VertexBuffer.PositionKind); + if (!data) { + return; + } + } + this._extend = extractMinAndMax(data, 0, this._totalVertices, this.boundingBias, 3); } - return false; } - /** - * Returns a new Mesh object generated from the current mesh properties. - * This method must not get confused with createInstance() - * @param name is a string, the name given to the new mesh - * @param newParent can be any Node object (default `null`) - * @param doNotCloneChildren allows/denies the recursive cloning of the original mesh children if any (default `false`) - * @param clonePhysicsImpostor allows/denies the cloning in the same time of the original mesh `body` used by the physics engine, if any (default `true`) - * @returns a new mesh - */ - clone(name69 = "", newParent = null, doNotCloneChildren, clonePhysicsImpostor = true) { - return new _Mesh(name69, this.getScene(), newParent, this, doNotCloneChildren, clonePhysicsImpostor); + _applyToMesh(mesh) { + const numOfMeshes = this._meshes.length; + for (const kind in this._vertexBuffers) { + if (numOfMeshes === 1) { + this._vertexBuffers[kind].create(); + } + if (kind === VertexBuffer.PositionKind) { + if (!this._extend) { + this._updateExtend(); + } + mesh.buildBoundingInfo(this._extend.minimum, this._extend.maximum); + mesh._createGlobalSubMesh(mesh.isUnIndexed); + mesh._updateBoundingInfo(); + } + } + if (numOfMeshes === 1 && this._indices && this._indices.length > 0) { + this._indexBuffer = this._engine.createIndexBuffer(this._indices, this._updatable, "Geometry_" + this.id + "_IndexBuffer"); + } + mesh._syncGeometryWithMorphTargetManager(); + mesh.synchronizeInstances(); } - /** - * Releases resources associated with this mesh. - * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default) - * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default) - */ - dispose(doNotRecurse, disposeMaterialAndTextures = false) { - this.morphTargetManager = null; - if (this._geometry) { - this._geometry.releaseForMesh(this, true); + _notifyUpdate(kind) { + if (this.onGeometryUpdated) { + this.onGeometryUpdated(this, kind); } - const internalDataInfo = this._internalMeshDataInfo; - if (internalDataInfo._onBeforeDrawObservable) { - internalDataInfo._onBeforeDrawObservable.clear(); + if (this._vertexArrayObjects) { + this._disposeVertexArrayObjects(); } - if (internalDataInfo._onBeforeBindObservable) { - internalDataInfo._onBeforeBindObservable.clear(); + for (const mesh of this._meshes) { + mesh._markSubMeshesAsAttributesDirty(); } - if (internalDataInfo._onBeforeRenderObservable) { - internalDataInfo._onBeforeRenderObservable.clear(); + } + /** + * Load the geometry if it was flagged as delay loaded + * @param scene defines the hosting scene + * @param onLoaded defines a callback called when the geometry is loaded + */ + load(scene, onLoaded) { + if (this.delayLoadState === 2) { + return; } - if (internalDataInfo._onAfterRenderObservable) { - internalDataInfo._onAfterRenderObservable.clear(); + if (this.isReady()) { + if (onLoaded) { + onLoaded(); + } + return; } - if (internalDataInfo._onBetweenPassObservable) { - internalDataInfo._onBetweenPassObservable.clear(); + this.delayLoadState = 2; + this._queueLoad(scene, onLoaded); + } + _queueLoad(scene, onLoaded) { + if (!this.delayLoadingFile) { + return; } - if (this._scene.useClonedMeshMap) { - if (internalDataInfo.meshMap) { - for (const uniqueId in internalDataInfo.meshMap) { - const mesh = internalDataInfo.meshMap[uniqueId]; - if (mesh) { - mesh._internalMeshDataInfo._source = null; - internalDataInfo.meshMap[uniqueId] = void 0; - } - } + scene.addPendingData(this); + scene._loadFile(this.delayLoadingFile, (data) => { + if (!this._delayLoadingFunction) { + return; } - if (internalDataInfo._source && internalDataInfo._source._internalMeshDataInfo.meshMap) { - internalDataInfo._source._internalMeshDataInfo.meshMap[this.uniqueId] = void 0; + this._delayLoadingFunction(JSON.parse(data), this); + this.delayLoadState = 1; + this._delayInfo = []; + scene.removePendingData(this); + const meshes = this._meshes; + const numOfMeshes = meshes.length; + for (let index = 0; index < numOfMeshes; index++) { + this._applyToMesh(meshes[index]); } - } else { - const meshes = this.getScene().meshes; - for (const abstractMesh of meshes) { - const mesh = abstractMesh; - if (mesh._internalMeshDataInfo && mesh._internalMeshDataInfo._source && mesh._internalMeshDataInfo._source === this) { - mesh._internalMeshDataInfo._source = null; - } + if (onLoaded) { + onLoaded(); + } + }, void 0, true); + } + /** + * Invert the geometry to move from a right handed system to a left handed one. + */ + toLeftHanded() { + const tIndices = this.getIndices(false); + if (tIndices != null && tIndices.length > 0) { + for (let i = 0; i < tIndices.length; i += 3) { + const tTemp = tIndices[i + 0]; + tIndices[i + 0] = tIndices[i + 2]; + tIndices[i + 2] = tTemp; } + this.setIndices(tIndices); } - internalDataInfo._source = null; - this._instanceDataStorage.visibleInstances = {}; - this._disposeInstanceSpecificData(); - this._disposeThinInstanceSpecificData(); - if (this._internalMeshDataInfo._checkReadinessObserver) { - this._scene.onBeforeRenderObservable.remove(this._internalMeshDataInfo._checkReadinessObserver); + const tPositions = this.getVerticesData(VertexBuffer.PositionKind, false); + if (tPositions != null && tPositions.length > 0) { + for (let i = 0; i < tPositions.length; i += 3) { + tPositions[i + 2] = -tPositions[i + 2]; + } + this.setVerticesData(VertexBuffer.PositionKind, tPositions, false); + } + const tNormals = this.getVerticesData(VertexBuffer.NormalKind, false); + if (tNormals != null && tNormals.length > 0) { + for (let i = 0; i < tNormals.length; i += 3) { + tNormals[i + 2] = -tNormals[i + 2]; + } + this.setVerticesData(VertexBuffer.NormalKind, tNormals, false); } - super.dispose(doNotRecurse, disposeMaterialAndTextures); - } - /** @internal */ - _disposeInstanceSpecificData() { } + // Cache /** @internal */ - _disposeThinInstanceSpecificData() { + _resetPointsArrayCache() { + this._positions = null; } /** @internal */ - _invalidateInstanceVertexArrayObject() { + _generatePointsArray() { + if (this._positions) { + return true; + } + const data = this.getVerticesData(VertexBuffer.PositionKind); + if (!data || data.length === 0) { + return false; + } + for (let index = this._positionsCache.length * 3, arrayIdx = this._positionsCache.length; index < data.length; index += 3, ++arrayIdx) { + this._positionsCache[arrayIdx] = Vector3.FromArray(data, index); + } + for (let index = 0, arrayIdx = 0; index < data.length; index += 3, ++arrayIdx) { + this._positionsCache[arrayIdx].set(data[0 + index], data[1 + index], data[2 + index]); + } + this._positionsCache.length = data.length / 3; + this._positions = this._positionsCache; + return true; } /** - * Modifies the mesh geometry according to a displacement map. - * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex. - * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated. - * @param url is a string, the URL from the image file is to be downloaded. - * @param minHeight is the lower limit of the displacement. - * @param maxHeight is the upper limit of the displacement. - * @param onSuccess is an optional Javascript function to be called just after the mesh is modified. It is passed the modified mesh and must return nothing. - * @param uvOffset is an optional vector2 used to offset UV. - * @param uvScale is an optional vector2 used to scale UV. - * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance. - * @param onError defines a callback called when an error occurs during the processing of the request. - * @returns the Mesh. + * Gets a value indicating if the geometry is disposed + * @returns true if the geometry was disposed */ - applyDisplacementMap(url, minHeight, maxHeight, onSuccess, uvOffset, uvScale, forceUpdate = false, onError) { - const scene = this.getScene(); - const onload = (img) => { - const heightMapWidth = img.width; - const heightMapHeight = img.height; - const canvas = this.getEngine().createCanvas(heightMapWidth, heightMapHeight); - const context = canvas.getContext("2d"); - context.drawImage(img, 0, 0); - const buffer = context.getImageData(0, 0, heightMapWidth, heightMapHeight).data; - this.applyDisplacementMapFromBuffer(buffer, heightMapWidth, heightMapHeight, minHeight, maxHeight, uvOffset, uvScale, forceUpdate); - if (onSuccess) { - onSuccess(this); + isDisposed() { + return this._isDisposed; + } + _disposeVertexArrayObjects() { + if (this._vertexArrayObjects) { + for (const kind in this._vertexArrayObjects) { + this._engine.releaseVertexArrayObject(this._vertexArrayObjects[kind]); } - }; - Tools.LoadImage(url, onload, onError ? onError : () => { - }, scene.offlineProvider); - return this; + this._vertexArrayObjects = {}; + const meshes = this._meshes; + const numOfMeshes = meshes.length; + for (let index = 0; index < numOfMeshes; index++) { + meshes[index]._invalidateInstanceVertexArrayObject(); + } + } } /** - * Modifies the mesh geometry according to a displacementMap buffer. - * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex. - * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated. - * @param buffer is a `Uint8Array` buffer containing series of `Uint8` lower than 255, the red, green, blue and alpha values of each successive pixel. - * @param heightMapWidth is the width of the buffer image. - * @param heightMapHeight is the height of the buffer image. - * @param minHeight is the lower limit of the displacement. - * @param maxHeight is the upper limit of the displacement. - * @param uvOffset is an optional vector2 used to offset UV. - * @param uvScale is an optional vector2 used to scale UV. - * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance. - * @returns the Mesh. + * Free all associated resources */ - applyDisplacementMapFromBuffer(buffer, heightMapWidth, heightMapHeight, minHeight, maxHeight, uvOffset, uvScale, forceUpdate = false) { - if (!this.isVerticesDataPresent(VertexBuffer.PositionKind) || !this.isVerticesDataPresent(VertexBuffer.NormalKind) || !this.isVerticesDataPresent(VertexBuffer.UVKind)) { - Logger.Warn("Cannot call applyDisplacementMap: Given mesh is not complete. Position, Normal or UV are missing"); - return this; + dispose() { + const meshes = this._meshes; + const numOfMeshes = meshes.length; + let index; + for (index = 0; index < numOfMeshes; index++) { + this.releaseForMesh(meshes[index]); } - const positions = this.getVerticesData(VertexBuffer.PositionKind, true, true); - const normals = this.getVerticesData(VertexBuffer.NormalKind); - const uvs = this.getVerticesData(VertexBuffer.UVKind); - let position = Vector3.Zero(); - const normal = Vector3.Zero(); - const uv = Vector2.Zero(); - uvOffset = uvOffset || Vector2.Zero(); - uvScale = uvScale || new Vector2(1, 1); - for (let index = 0; index < positions.length; index += 3) { - Vector3.FromArrayToRef(positions, index, position); - Vector3.FromArrayToRef(normals, index, normal); - Vector2.FromArrayToRef(uvs, index / 3 * 2, uv); - const u = Math.abs(uv.x * uvScale.x + uvOffset.x % 1) * (heightMapWidth - 1) % heightMapWidth | 0; - const v = Math.abs(uv.y * uvScale.y + uvOffset.y % 1) * (heightMapHeight - 1) % heightMapHeight | 0; - const pos = (u + v * heightMapWidth) * 4; - const r = buffer[pos] / 255; - const g = buffer[pos + 1] / 255; - const b = buffer[pos + 2] / 255; - const gradient = r * 0.3 + g * 0.59 + b * 0.11; - normal.normalize(); - normal.scaleInPlace(minHeight + (maxHeight - minHeight) * gradient); - position = position.add(normal); - position.toArray(positions, index); + this._meshes.length = 0; + this._disposeVertexArrayObjects(); + for (const kind in this._vertexBuffers) { + this._vertexBuffers[kind].dispose(); } - VertexData.ComputeNormals(positions, this.getIndices(), normals); - if (forceUpdate) { - this.setVerticesData(VertexBuffer.PositionKind, positions); - this.setVerticesData(VertexBuffer.NormalKind, normals); - this.setVerticesData(VertexBuffer.UVKind, uvs); - } else { - this.updateVerticesData(VertexBuffer.PositionKind, positions); - this.updateVerticesData(VertexBuffer.NormalKind, normals); + this._vertexBuffers = {}; + this._totalVertices = 0; + if (this._indexBuffer) { + this._engine._releaseBuffer(this._indexBuffer); } - return this; - } - _getFlattenedNormals(indices, positions) { - const normals = new Float32Array(indices.length * 3); - let normalsCount = 0; - const flipNormalGeneration = this.overrideMaterialSideOrientation === (this._scene.useRightHandedSystem ? 1 : 0); - for (let index = 0; index < indices.length; index += 3) { - const p1 = Vector3.FromArray(positions, indices[index] * 3); - const p2 = Vector3.FromArray(positions, indices[index + 1] * 3); - const p3 = Vector3.FromArray(positions, indices[index + 2] * 3); - const p1p2 = p1.subtract(p2); - const p3p2 = p3.subtract(p2); - const normal = Vector3.Normalize(Vector3.Cross(p1p2, p3p2)); - if (flipNormalGeneration) { - normal.scaleInPlace(-1); - } - for (let localIndex = 0; localIndex < 3; localIndex++) { - normals[normalsCount++] = normal.x; - normals[normalsCount++] = normal.y; - normals[normalsCount++] = normal.z; + this._indexBuffer = null; + this._indices = []; + this.delayLoadState = 0; + this.delayLoadingFile = null; + this._delayLoadingFunction = null; + this._delayInfo = []; + this._boundingInfo = null; + this._scene.removeGeometry(this); + if (this._parentContainer) { + const index2 = this._parentContainer.geometries.indexOf(this); + if (index2 > -1) { + this._parentContainer.geometries.splice(index2, 1); } + this._parentContainer = null; } - return normals; + this._isDisposed = true; } - _convertToUnIndexedMesh(flattenNormals = false) { - const kinds = this.getVerticesDataKinds(); + /** + * Clone the current geometry into a new geometry + * @param id defines the unique ID of the new geometry + * @returns a new geometry object + */ + copy(id) { + const vertexData = new VertexData(); + vertexData.indices = []; const indices = this.getIndices(); - const data = {}; - const separateVertices = (data2, stride) => { - const newData = new Float32Array(indices.length * stride); - let count = 0; + if (indices) { for (let index = 0; index < indices.length; index++) { - for (let offset = 0; offset < stride; offset++) { - newData[count++] = data2[indices[index] * stride + offset]; - } - } - return newData; - }; - const previousSubmeshes = this.geometry ? this.subMeshes.slice(0) : []; - for (const kind of kinds) { - data[kind] = this.getVerticesData(kind); - } - for (const kind of kinds) { - const vertexBuffer = this.getVertexBuffer(kind); - const stride = vertexBuffer.getStrideSize(); - if (flattenNormals && kind === VertexBuffer.NormalKind) { - const normals = this._getFlattenedNormals(indices, data[VertexBuffer.PositionKind]); - this.setVerticesData(VertexBuffer.NormalKind, normals, vertexBuffer.isUpdatable(), stride); - } else { - this.setVerticesData(kind, separateVertices(data[kind], stride), vertexBuffer.isUpdatable(), stride); + vertexData.indices.push(indices[index]); } } - if (this.morphTargetManager) { - for (let targetIndex = 0; targetIndex < this.morphTargetManager.numTargets; targetIndex++) { - const target = this.morphTargetManager.getTarget(targetIndex); - const positions = target.getPositions(); - target.setPositions(separateVertices(positions, 3)); - const normals = target.getNormals(); - if (normals) { - target.setNormals(flattenNormals ? this._getFlattenedNormals(indices, positions) : separateVertices(normals, 3)); - } - const tangents = target.getTangents(); - if (tangents) { - target.setTangents(separateVertices(tangents, 3)); + let updatable = false; + let stopChecking = false; + let kind; + for (kind in this._vertexBuffers) { + const data = this.getVerticesData(kind); + if (data) { + if (data instanceof Float32Array) { + vertexData.set(new Float32Array(data), kind); + } else { + vertexData.set(data.slice(0), kind); } - const uvs = target.getUVs(); - if (uvs) { - target.setUVs(separateVertices(uvs, 2)); + if (!stopChecking) { + const vb = this.getVertexBuffer(kind); + if (vb) { + updatable = vb.isUpdatable(); + stopChecking = !updatable; + } } } - this.morphTargetManager.synchronize(); } - for (let index = 0; index < indices.length; index++) { - indices[index] = index; - } - this.setIndices(indices); - this._unIndexed = true; - this.releaseSubMeshes(); - for (const previousOne of previousSubmeshes) { - SubMesh.AddToMesh(previousOne.materialIndex, previousOne.indexStart, previousOne.indexCount, previousOne.indexStart, previousOne.indexCount, this); + const geometry = new _Geometry(id, this._scene, vertexData, updatable); + geometry.delayLoadState = this.delayLoadState; + geometry.delayLoadingFile = this.delayLoadingFile; + geometry._delayLoadingFunction = this._delayLoadingFunction; + for (kind in this._delayInfo) { + geometry._delayInfo = geometry._delayInfo || []; + geometry._delayInfo.push(kind); } - this.synchronizeInstances(); - return this; + geometry._boundingInfo = new BoundingInfo(this._extend.minimum, this._extend.maximum); + return geometry; } /** - * Modify the mesh to get a flat shading rendering. - * This means each mesh facet will then have its own normals. Usually new vertices are added in the mesh geometry to get this result. - * Warning : the mesh is really modified even if not set originally as updatable and, under the hood, a new VertexBuffer is allocated. - * @returns current mesh + * Serialize the current geometry info (and not the vertices data) into a JSON object + * @returns a JSON representation of the current geometry data (without the vertices data) */ - convertToFlatShadedMesh() { - return this._convertToUnIndexedMesh(true); + serialize() { + const serializationObject = {}; + serializationObject.id = this.id; + serializationObject.uniqueId = this.uniqueId; + serializationObject.updatable = this._updatable; + if (Tags && Tags.HasTags(this)) { + serializationObject.tags = Tags.GetTags(this); + } + return serializationObject; } - /** - * This method removes all the mesh indices and add new vertices (duplication) in order to unfold facets into buffers. - * In other words, more vertices, no more indices and a single bigger VBO. - * The mesh is really modified even if not set originally as updatable. Under the hood, a new VertexBuffer is allocated. - * @returns current mesh - */ - convertToUnIndexedMesh() { - return this._convertToUnIndexedMesh(); + _toNumberArray(origin) { + if (Array.isArray(origin)) { + return origin; + } else { + return Array.prototype.slice.call(origin); + } } /** - * Inverses facet orientations. - * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call. - * @param flipNormals will also inverts the normals - * @returns current mesh + * Release any memory retained by the cached data on the Geometry. + * + * Call this function to reduce memory footprint of the mesh. + * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly) */ - flipFaces(flipNormals = false) { - const vertex_data = VertexData.ExtractFromMesh(this); - let i; - if (flipNormals && this.isVerticesDataPresent(VertexBuffer.NormalKind) && vertex_data.normals) { - for (i = 0; i < vertex_data.normals.length; i++) { - vertex_data.normals[i] *= -1; - } - } - if (vertex_data.indices) { - let temp; - for (i = 0; i < vertex_data.indices.length; i += 3) { - temp = vertex_data.indices[i + 1]; - vertex_data.indices[i + 1] = vertex_data.indices[i + 2]; - vertex_data.indices[i + 2] = temp; + clearCachedData() { + this._indices = []; + this._resetPointsArrayCache(); + for (const vbName in this._vertexBuffers) { + if (!Object.prototype.hasOwnProperty.call(this._vertexBuffers, vbName)) { + continue; } + this._vertexBuffers[vbName]._buffer._data = null; } - vertex_data.applyToMesh(this, this.isVertexBufferUpdatable(VertexBuffer.PositionKind)); - return this; } /** - * Increase the number of facets and hence vertices in a mesh - * Vertex normals are interpolated from existing vertex normals - * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call. - * @param numberPerEdge the number of new vertices to add to each edge of a facet, optional default 1 + * Serialize all vertices data into a JSON object + * @returns a JSON representation of the current geometry data */ - increaseVertices(numberPerEdge = 1) { - const vertex_data = VertexData.ExtractFromMesh(this); - const currentIndices = vertex_data.indices && !Array.isArray(vertex_data.indices) && Array.from ? Array.from(vertex_data.indices) : vertex_data.indices; - const positions = vertex_data.positions && !Array.isArray(vertex_data.positions) && Array.from ? Array.from(vertex_data.positions) : vertex_data.positions; - const uvs = vertex_data.uvs && !Array.isArray(vertex_data.uvs) && Array.from ? Array.from(vertex_data.uvs) : vertex_data.uvs; - const normals = vertex_data.normals && !Array.isArray(vertex_data.normals) && Array.from ? Array.from(vertex_data.normals) : vertex_data.normals; - if (!currentIndices || !positions) { - Logger.Warn("Couldn't increase number of vertices : VertexData must contain at least indices and positions"); - } else { - vertex_data.indices = currentIndices; - vertex_data.positions = positions; - if (uvs) { - vertex_data.uvs = uvs; - } - if (normals) { - vertex_data.normals = normals; + serializeVerticeData() { + const serializationObject = this.serialize(); + if (this.isVerticesDataPresent(VertexBuffer.PositionKind)) { + serializationObject.positions = this._toNumberArray(this.getVerticesData(VertexBuffer.PositionKind)); + if (this.isVertexBufferUpdatable(VertexBuffer.PositionKind)) { + serializationObject.positions._updatable = true; } - const segments = numberPerEdge + 1; - const tempIndices = new Array(); - for (let i = 0; i < segments + 1; i++) { - tempIndices[i] = new Array(); + } + if (this.isVerticesDataPresent(VertexBuffer.NormalKind)) { + serializationObject.normals = this._toNumberArray(this.getVerticesData(VertexBuffer.NormalKind)); + if (this.isVertexBufferUpdatable(VertexBuffer.NormalKind)) { + serializationObject.normals._updatable = true; } - let a; - let b; - const deltaPosition = new Vector3(0, 0, 0); - const deltaNormal = new Vector3(0, 0, 0); - const deltaUV = new Vector2(0, 0); - const indices = new Array(); - const vertexIndex = new Array(); - const side = new Array(); - let len; - let positionPtr = positions.length; - let uvPtr; - if (uvs) { - uvPtr = uvs.length; + } + if (this.isVerticesDataPresent(VertexBuffer.TangentKind)) { + serializationObject.tangents = this._toNumberArray(this.getVerticesData(VertexBuffer.TangentKind)); + if (this.isVertexBufferUpdatable(VertexBuffer.TangentKind)) { + serializationObject.tangents._updatable = true; } - let normalsPtr; - if (normals) { - normalsPtr = normals.length; + } + if (this.isVerticesDataPresent(VertexBuffer.UVKind)) { + serializationObject.uvs = this._toNumberArray(this.getVerticesData(VertexBuffer.UVKind)); + if (this.isVertexBufferUpdatable(VertexBuffer.UVKind)) { + serializationObject.uvs._updatable = true; } - for (let i = 0; i < currentIndices.length; i += 3) { - vertexIndex[0] = currentIndices[i]; - vertexIndex[1] = currentIndices[i + 1]; - vertexIndex[2] = currentIndices[i + 2]; - for (let j = 0; j < 3; j++) { - a = vertexIndex[j]; - b = vertexIndex[(j + 1) % 3]; - if (side[a] === void 0 && side[b] === void 0) { - side[a] = new Array(); - side[b] = new Array(); - } else { - if (side[a] === void 0) { - side[a] = new Array(); - } - if (side[b] === void 0) { - side[b] = new Array(); - } - } - if (side[a][b] === void 0 && side[b][a] === void 0) { - side[a][b] = []; - deltaPosition.x = (positions[3 * b] - positions[3 * a]) / segments; - deltaPosition.y = (positions[3 * b + 1] - positions[3 * a + 1]) / segments; - deltaPosition.z = (positions[3 * b + 2] - positions[3 * a + 2]) / segments; - if (normals) { - deltaNormal.x = (normals[3 * b] - normals[3 * a]) / segments; - deltaNormal.y = (normals[3 * b + 1] - normals[3 * a + 1]) / segments; - deltaNormal.z = (normals[3 * b + 2] - normals[3 * a + 2]) / segments; - } - if (uvs) { - deltaUV.x = (uvs[2 * b] - uvs[2 * a]) / segments; - deltaUV.y = (uvs[2 * b + 1] - uvs[2 * a + 1]) / segments; - } - side[a][b].push(a); - for (let k = 1; k < segments; k++) { - side[a][b].push(positions.length / 3); - positions[positionPtr++] = positions[3 * a] + k * deltaPosition.x; - positions[positionPtr++] = positions[3 * a + 1] + k * deltaPosition.y; - positions[positionPtr++] = positions[3 * a + 2] + k * deltaPosition.z; - if (normals) { - normals[normalsPtr++] = normals[3 * a] + k * deltaNormal.x; - normals[normalsPtr++] = normals[3 * a + 1] + k * deltaNormal.y; - normals[normalsPtr++] = normals[3 * a + 2] + k * deltaNormal.z; - } - if (uvs) { - uvs[uvPtr++] = uvs[2 * a] + k * deltaUV.x; - uvs[uvPtr++] = uvs[2 * a + 1] + k * deltaUV.y; - } - } - side[a][b].push(b); - side[b][a] = new Array(); - len = side[a][b].length; - for (let idx = 0; idx < len; idx++) { - side[b][a][idx] = side[a][b][len - 1 - idx]; - } - } - } - tempIndices[0][0] = currentIndices[i]; - tempIndices[1][0] = side[currentIndices[i]][currentIndices[i + 1]][1]; - tempIndices[1][1] = side[currentIndices[i]][currentIndices[i + 2]][1]; - for (let k = 2; k < segments; k++) { - tempIndices[k][0] = side[currentIndices[i]][currentIndices[i + 1]][k]; - tempIndices[k][k] = side[currentIndices[i]][currentIndices[i + 2]][k]; - deltaPosition.x = (positions[3 * tempIndices[k][k]] - positions[3 * tempIndices[k][0]]) / k; - deltaPosition.y = (positions[3 * tempIndices[k][k] + 1] - positions[3 * tempIndices[k][0] + 1]) / k; - deltaPosition.z = (positions[3 * tempIndices[k][k] + 2] - positions[3 * tempIndices[k][0] + 2]) / k; - if (normals) { - deltaNormal.x = (normals[3 * tempIndices[k][k]] - normals[3 * tempIndices[k][0]]) / k; - deltaNormal.y = (normals[3 * tempIndices[k][k] + 1] - normals[3 * tempIndices[k][0] + 1]) / k; - deltaNormal.z = (normals[3 * tempIndices[k][k] + 2] - normals[3 * tempIndices[k][0] + 2]) / k; - } - if (uvs) { - deltaUV.x = (uvs[2 * tempIndices[k][k]] - uvs[2 * tempIndices[k][0]]) / k; - deltaUV.y = (uvs[2 * tempIndices[k][k] + 1] - uvs[2 * tempIndices[k][0] + 1]) / k; - } - for (let j = 1; j < k; j++) { - tempIndices[k][j] = positions.length / 3; - positions[positionPtr++] = positions[3 * tempIndices[k][0]] + j * deltaPosition.x; - positions[positionPtr++] = positions[3 * tempIndices[k][0] + 1] + j * deltaPosition.y; - positions[positionPtr++] = positions[3 * tempIndices[k][0] + 2] + j * deltaPosition.z; - if (normals) { - normals[normalsPtr++] = normals[3 * tempIndices[k][0]] + j * deltaNormal.x; - normals[normalsPtr++] = normals[3 * tempIndices[k][0] + 1] + j * deltaNormal.y; - normals[normalsPtr++] = normals[3 * tempIndices[k][0] + 2] + j * deltaNormal.z; - } - if (uvs) { - uvs[uvPtr++] = uvs[2 * tempIndices[k][0]] + j * deltaUV.x; - uvs[uvPtr++] = uvs[2 * tempIndices[k][0] + 1] + j * deltaUV.y; - } - } - } - tempIndices[segments] = side[currentIndices[i + 1]][currentIndices[i + 2]]; - indices.push(tempIndices[0][0], tempIndices[1][0], tempIndices[1][1]); - for (let k = 1; k < segments; k++) { - let j; - for (j = 0; j < k; j++) { - indices.push(tempIndices[k][j], tempIndices[k + 1][j], tempIndices[k + 1][j + 1]); - indices.push(tempIndices[k][j], tempIndices[k + 1][j + 1], tempIndices[k][j + 1]); - } - indices.push(tempIndices[k][j], tempIndices[k + 1][j], tempIndices[k + 1][j + 1]); - } + } + if (this.isVerticesDataPresent(VertexBuffer.UV2Kind)) { + serializationObject.uvs2 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV2Kind)); + if (this.isVertexBufferUpdatable(VertexBuffer.UV2Kind)) { + serializationObject.uvs2._updatable = true; } - vertex_data.indices = indices; - vertex_data.applyToMesh(this, this.isVertexBufferUpdatable(VertexBuffer.PositionKind)); } - } - /** - * Force adjacent facets to share vertices and remove any facets that have all vertices in a line - * This will undo any application of covertToFlatShadedMesh - * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call. - */ - forceSharedVertices() { - const vertex_data = VertexData.ExtractFromMesh(this); - const currentUVs = vertex_data.uvs; - const currentIndices = vertex_data.indices; - const currentPositions = vertex_data.positions; - const currentColors = vertex_data.colors; - const currentMatrixIndices = vertex_data.matricesIndices; - const currentMatrixWeights = vertex_data.matricesWeights; - const currentMatrixIndicesExtra = vertex_data.matricesIndicesExtra; - const currentMatrixWeightsExtra = vertex_data.matricesWeightsExtra; - if (currentIndices === void 0 || currentPositions === void 0 || currentIndices === null || currentPositions === null) { - Logger.Warn("VertexData contains empty entries"); - } else { - const positions = new Array(); - const indices = new Array(); - const uvs = new Array(); - const colors = new Array(); - const matrixIndices = new Array(); - const matrixWeights = new Array(); - const matrixIndicesExtra = new Array(); - const matrixWeightsExtra = new Array(); - let pstring = new Array(); - let indexPtr = 0; - const uniquePositions = {}; - let ptr; - let facet; - for (let i = 0; i < currentIndices.length; i += 3) { - facet = [currentIndices[i], currentIndices[i + 1], currentIndices[i + 2]]; - pstring = []; - for (let j = 0; j < 3; j++) { - pstring[j] = ""; - for (let k = 0; k < 3; k++) { - if (Math.abs(currentPositions[3 * facet[j] + k]) < 1e-8) { - currentPositions[3 * facet[j] + k] = 0; - } - pstring[j] += currentPositions[3 * facet[j] + k] + "|"; - } - } - if (!(pstring[0] == pstring[1] || pstring[0] == pstring[2] || pstring[1] == pstring[2])) { - for (let j = 0; j < 3; j++) { - ptr = uniquePositions[pstring[j]]; - if (ptr === void 0) { - uniquePositions[pstring[j]] = indexPtr; - ptr = indexPtr++; - for (let k = 0; k < 3; k++) { - positions.push(currentPositions[3 * facet[j] + k]); - } - if (currentColors !== null && currentColors !== void 0) { - for (let k = 0; k < 4; k++) { - colors.push(currentColors[4 * facet[j] + k]); - } - } - if (currentUVs !== null && currentUVs !== void 0) { - for (let k = 0; k < 2; k++) { - uvs.push(currentUVs[2 * facet[j] + k]); - } - } - if (currentMatrixIndices !== null && currentMatrixIndices !== void 0) { - for (let k = 0; k < 4; k++) { - matrixIndices.push(currentMatrixIndices[4 * facet[j] + k]); - } - } - if (currentMatrixWeights !== null && currentMatrixWeights !== void 0) { - for (let k = 0; k < 4; k++) { - matrixWeights.push(currentMatrixWeights[4 * facet[j] + k]); - } - } - if (currentMatrixIndicesExtra !== null && currentMatrixIndicesExtra !== void 0) { - for (let k = 0; k < 4; k++) { - matrixIndicesExtra.push(currentMatrixIndicesExtra[4 * facet[j] + k]); - } - } - if (currentMatrixWeightsExtra !== null && currentMatrixWeightsExtra !== void 0) { - for (let k = 0; k < 4; k++) { - matrixWeightsExtra.push(currentMatrixWeightsExtra[4 * facet[j] + k]); - } - } - } - indices.push(ptr); - } - } + if (this.isVerticesDataPresent(VertexBuffer.UV3Kind)) { + serializationObject.uvs3 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV3Kind)); + if (this.isVertexBufferUpdatable(VertexBuffer.UV3Kind)) { + serializationObject.uvs3._updatable = true; } - const normals = new Array(); - VertexData.ComputeNormals(positions, indices, normals); - vertex_data.positions = positions; - vertex_data.indices = indices; - vertex_data.normals = normals; - if (currentUVs !== null && currentUVs !== void 0) { - vertex_data.uvs = uvs; + } + if (this.isVerticesDataPresent(VertexBuffer.UV4Kind)) { + serializationObject.uvs4 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV4Kind)); + if (this.isVertexBufferUpdatable(VertexBuffer.UV4Kind)) { + serializationObject.uvs4._updatable = true; } - if (currentColors !== null && currentColors !== void 0) { - vertex_data.colors = colors; + } + if (this.isVerticesDataPresent(VertexBuffer.UV5Kind)) { + serializationObject.uvs5 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV5Kind)); + if (this.isVertexBufferUpdatable(VertexBuffer.UV5Kind)) { + serializationObject.uvs5._updatable = true; } - if (currentMatrixIndices !== null && currentMatrixIndices !== void 0) { - vertex_data.matricesIndices = matrixIndices; + } + if (this.isVerticesDataPresent(VertexBuffer.UV6Kind)) { + serializationObject.uvs6 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV6Kind)); + if (this.isVertexBufferUpdatable(VertexBuffer.UV6Kind)) { + serializationObject.uvs6._updatable = true; } - if (currentMatrixWeights !== null && currentMatrixWeights !== void 0) { - vertex_data.matricesWeights = matrixWeights; + } + if (this.isVerticesDataPresent(VertexBuffer.ColorKind)) { + serializationObject.colors = this._toNumberArray(this.getVerticesData(VertexBuffer.ColorKind)); + if (this.isVertexBufferUpdatable(VertexBuffer.ColorKind)) { + serializationObject.colors._updatable = true; } - if (currentMatrixIndicesExtra !== null && currentMatrixIndicesExtra !== void 0) { - vertex_data.matricesIndicesExtra = matrixIndicesExtra; + } + if (this.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind)) { + serializationObject.matricesIndices = this._toNumberArray(this.getVerticesData(VertexBuffer.MatricesIndicesKind)); + serializationObject.matricesIndices._isExpanded = true; + if (this.isVertexBufferUpdatable(VertexBuffer.MatricesIndicesKind)) { + serializationObject.matricesIndices._updatable = true; } - if (currentMatrixWeights !== null && currentMatrixWeights !== void 0) { - vertex_data.matricesWeightsExtra = matrixWeightsExtra; + } + if (this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) { + serializationObject.matricesWeights = this._toNumberArray(this.getVerticesData(VertexBuffer.MatricesWeightsKind)); + if (this.isVertexBufferUpdatable(VertexBuffer.MatricesWeightsKind)) { + serializationObject.matricesWeights._updatable = true; } - vertex_data.applyToMesh(this, this.isVertexBufferUpdatable(VertexBuffer.PositionKind)); } + serializationObject.indices = this._toNumberArray(this.getIndices()); + return serializationObject; } - // Instances - /** - * @internal - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/naming-convention - static _instancedMeshFactory(name69, mesh) { - throw _WarnImport("InstancedMesh"); - } + // Statics /** - * @internal + * Extracts a clone of a mesh geometry + * @param mesh defines the source mesh + * @param id defines the unique ID of the new geometry object + * @returns the new geometry object */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - static _PhysicsImpostorParser(scene, physicObject, jsonObject) { - throw _WarnImport("PhysicsImpostor"); + static ExtractFromMesh(mesh, id) { + const geometry = mesh._geometry; + if (!geometry) { + return null; + } + return geometry.copy(id); } /** - * Creates a new InstancedMesh object from the mesh model. - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances - * @param name defines the name of the new instance - * @returns a new InstancedMesh + * You should now use Tools.RandomId(), this method is still here for legacy reasons. + * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523 + * Be aware Math.random() could cause collisions, but: + * "All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide" + * @returns a string containing a new GUID */ - createInstance(name69) { - return _Mesh._instancedMeshFactory(name69, this); + static RandomId() { + return Tools.RandomId(); } - /** - * Synchronises all the mesh instance submeshes to the current mesh submeshes, if any. - * After this call, all the mesh instances have the same submeshes than the current mesh. - * @returns the current mesh - */ - synchronizeInstances() { - for (let instanceIndex = 0; instanceIndex < this.instances.length; instanceIndex++) { - const instance = this.instances[instanceIndex]; - instance._syncSubMeshes(); + static _GetGeometryByLoadedUniqueId(uniqueId, scene) { + for (let index = 0; index < scene.geometries.length; index++) { + if (scene.geometries[index]._loadedUniqueId === uniqueId) { + return scene.geometries[index]; + } } - return this; + return null; } /** - * Optimization of the mesh's indices, in case a mesh has duplicated vertices. - * The function will only reorder the indices and will not remove unused vertices to avoid problems with submeshes. - * This should be used together with the simplification to avoid disappearing triangles. - * @param successCallback an optional success callback to be called after the optimization finished. - * @returns the current mesh + * @internal */ - optimizeIndices(successCallback) { - const indices = this.getIndices(); - const positions = this.getVerticesData(VertexBuffer.PositionKind); - if (!positions || !indices) { - return this; - } - const vectorPositions = []; - for (let pos = 0; pos < positions.length; pos = pos + 3) { - vectorPositions.push(Vector3.FromArray(positions, pos)); - } - const dupes = []; - AsyncLoop.SyncAsyncForLoop(vectorPositions.length, 40, (iteration) => { - const realPos = vectorPositions.length - 1 - iteration; - const testedPosition = vectorPositions[realPos]; - for (let j = 0; j < realPos; ++j) { - const againstPosition = vectorPositions[j]; - if (testedPosition.equals(againstPosition)) { - dupes[realPos] = j; - break; - } + static _ImportGeometry(parsedGeometry, mesh) { + const scene = mesh.getScene(); + const geometryUniqueId = parsedGeometry.geometryUniqueId; + const geometryId = parsedGeometry.geometryId; + if (geometryUniqueId || geometryId) { + const geometry = geometryUniqueId ? this._GetGeometryByLoadedUniqueId(geometryUniqueId, scene) : scene.getGeometryById(geometryId); + if (geometry) { + geometry.applyToMesh(mesh); } - }, () => { - for (let i = 0; i < indices.length; ++i) { - indices[i] = dupes[indices[i]] || indices[i]; + } else if (parsedGeometry instanceof ArrayBuffer) { + const binaryInfo = mesh._binaryInfo; + if (binaryInfo.positionsAttrDesc && binaryInfo.positionsAttrDesc.count > 0) { + const positionsData = new Float32Array(parsedGeometry, binaryInfo.positionsAttrDesc.offset, binaryInfo.positionsAttrDesc.count); + mesh.setVerticesData(VertexBuffer.PositionKind, positionsData, false); } - const originalSubMeshes = this.subMeshes.slice(0); - this.setIndices(indices); - this.subMeshes = originalSubMeshes; - if (successCallback) { - successCallback(this); + if (binaryInfo.normalsAttrDesc && binaryInfo.normalsAttrDesc.count > 0) { + const normalsData = new Float32Array(parsedGeometry, binaryInfo.normalsAttrDesc.offset, binaryInfo.normalsAttrDesc.count); + mesh.setVerticesData(VertexBuffer.NormalKind, normalsData, false); } - }); - return this; - } - /** - * Serialize current mesh - * @param serializationObject defines the object which will receive the serialization data - * @returns the serialized object - */ - serialize(serializationObject = {}) { - serializationObject.name = this.name; - serializationObject.id = this.id; - serializationObject.uniqueId = this.uniqueId; - serializationObject.type = this.getClassName(); - if (Tags && Tags.HasTags(this)) { - serializationObject.tags = Tags.GetTags(this); - } - serializationObject.position = this.position.asArray(); - if (this.rotationQuaternion) { - serializationObject.rotationQuaternion = this.rotationQuaternion.asArray(); - } else if (this.rotation) { - serializationObject.rotation = this.rotation.asArray(); - } - serializationObject.scaling = this.scaling.asArray(); - if (this._postMultiplyPivotMatrix) { - serializationObject.pivotMatrix = this.getPivotMatrix().asArray(); - } else { - serializationObject.localMatrix = this.getPivotMatrix().asArray(); - } - serializationObject.isEnabled = this.isEnabled(false); - serializationObject.isVisible = this.isVisible; - serializationObject.infiniteDistance = this.infiniteDistance; - serializationObject.pickable = this.isPickable; - serializationObject.receiveShadows = this.receiveShadows; - serializationObject.billboardMode = this.billboardMode; - serializationObject.visibility = this.visibility; - serializationObject.alwaysSelectAsActiveMesh = this.alwaysSelectAsActiveMesh; - serializationObject.checkCollisions = this.checkCollisions; - serializationObject.ellipsoid = this.ellipsoid.asArray(); - serializationObject.ellipsoidOffset = this.ellipsoidOffset.asArray(); - serializationObject.doNotSyncBoundingInfo = this.doNotSyncBoundingInfo; - serializationObject.isBlocker = this.isBlocker; - serializationObject.overrideMaterialSideOrientation = this.overrideMaterialSideOrientation; - if (this.parent) { - this.parent._serializeAsParent(serializationObject); - } - serializationObject.isUnIndexed = this.isUnIndexed; - const geometry = this._geometry; - if (geometry && this.subMeshes) { - serializationObject.geometryUniqueId = geometry.uniqueId; - serializationObject.geometryId = geometry.id; - serializationObject.subMeshes = []; - for (let subIndex = 0; subIndex < this.subMeshes.length; subIndex++) { - const subMesh = this.subMeshes[subIndex]; - serializationObject.subMeshes.push({ - materialIndex: subMesh.materialIndex, - verticesStart: subMesh.verticesStart, - verticesCount: subMesh.verticesCount, - indexStart: subMesh.indexStart, - indexCount: subMesh.indexCount - }); + if (binaryInfo.tangetsAttrDesc && binaryInfo.tangetsAttrDesc.count > 0) { + const tangentsData = new Float32Array(parsedGeometry, binaryInfo.tangetsAttrDesc.offset, binaryInfo.tangetsAttrDesc.count); + mesh.setVerticesData(VertexBuffer.TangentKind, tangentsData, false); } - } - if (this.material) { - if (!this.material.doNotSerialize) { - serializationObject.materialUniqueId = this.material.uniqueId; - serializationObject.materialId = this.material.id; + if (binaryInfo.uvsAttrDesc && binaryInfo.uvsAttrDesc.count > 0) { + const uvsData = new Float32Array(parsedGeometry, binaryInfo.uvsAttrDesc.offset, binaryInfo.uvsAttrDesc.count); + if (CompatibilityOptions.UseOpenGLOrientationForUV) { + for (let index = 1; index < uvsData.length; index += 2) { + uvsData[index] = 1 - uvsData[index]; + } + } + mesh.setVerticesData(VertexBuffer.UVKind, uvsData, false); } - } else { - this.material = null; - serializationObject.materialUniqueId = this._scene.defaultMaterial.uniqueId; - serializationObject.materialId = this._scene.defaultMaterial.id; - } - if (this.morphTargetManager) { - serializationObject.morphTargetManagerId = this.morphTargetManager.uniqueId; - } - if (this.skeleton) { - serializationObject.skeletonId = this.skeleton.id; - serializationObject.numBoneInfluencers = this.numBoneInfluencers; - } - if (this.getScene()._getComponent(SceneComponentConstants.NAME_PHYSICSENGINE)) { - const impostor = this.getPhysicsImpostor(); - if (impostor) { - serializationObject.physicsMass = impostor.getParam("mass"); - serializationObject.physicsFriction = impostor.getParam("friction"); - serializationObject.physicsRestitution = impostor.getParam("mass"); - serializationObject.physicsImpostor = impostor.type; + if (binaryInfo.uvs2AttrDesc && binaryInfo.uvs2AttrDesc.count > 0) { + const uvs2Data = new Float32Array(parsedGeometry, binaryInfo.uvs2AttrDesc.offset, binaryInfo.uvs2AttrDesc.count); + if (CompatibilityOptions.UseOpenGLOrientationForUV) { + for (let index = 1; index < uvs2Data.length; index += 2) { + uvs2Data[index] = 1 - uvs2Data[index]; + } + } + mesh.setVerticesData(VertexBuffer.UV2Kind, uvs2Data, false); } - } - if (this.metadata) { - serializationObject.metadata = this.metadata; - } - serializationObject.instances = []; - for (let index = 0; index < this.instances.length; index++) { - const instance = this.instances[index]; - if (instance.doNotSerialize) { - continue; + if (binaryInfo.uvs3AttrDesc && binaryInfo.uvs3AttrDesc.count > 0) { + const uvs3Data = new Float32Array(parsedGeometry, binaryInfo.uvs3AttrDesc.offset, binaryInfo.uvs3AttrDesc.count); + if (CompatibilityOptions.UseOpenGLOrientationForUV) { + for (let index = 1; index < uvs3Data.length; index += 2) { + uvs3Data[index] = 1 - uvs3Data[index]; + } + } + mesh.setVerticesData(VertexBuffer.UV3Kind, uvs3Data, false); } - const serializationInstance = { - name: instance.name, - id: instance.id, - isEnabled: instance.isEnabled(false), - isVisible: instance.isVisible, - isPickable: instance.isPickable, - checkCollisions: instance.checkCollisions, - position: instance.position.asArray(), - scaling: instance.scaling.asArray() - }; - if (instance.parent) { - instance.parent._serializeAsParent(serializationInstance); + if (binaryInfo.uvs4AttrDesc && binaryInfo.uvs4AttrDesc.count > 0) { + const uvs4Data = new Float32Array(parsedGeometry, binaryInfo.uvs4AttrDesc.offset, binaryInfo.uvs4AttrDesc.count); + if (CompatibilityOptions.UseOpenGLOrientationForUV) { + for (let index = 1; index < uvs4Data.length; index += 2) { + uvs4Data[index] = 1 - uvs4Data[index]; + } + } + mesh.setVerticesData(VertexBuffer.UV4Kind, uvs4Data, false); } - if (instance.rotationQuaternion) { - serializationInstance.rotationQuaternion = instance.rotationQuaternion.asArray(); - } else if (instance.rotation) { - serializationInstance.rotation = instance.rotation.asArray(); + if (binaryInfo.uvs5AttrDesc && binaryInfo.uvs5AttrDesc.count > 0) { + const uvs5Data = new Float32Array(parsedGeometry, binaryInfo.uvs5AttrDesc.offset, binaryInfo.uvs5AttrDesc.count); + if (CompatibilityOptions.UseOpenGLOrientationForUV) { + for (let index = 1; index < uvs5Data.length; index += 2) { + uvs5Data[index] = 1 - uvs5Data[index]; + } + } + mesh.setVerticesData(VertexBuffer.UV5Kind, uvs5Data, false); } - if (this.getScene()._getComponent(SceneComponentConstants.NAME_PHYSICSENGINE)) { - const impostor = instance.getPhysicsImpostor(); - if (impostor) { - serializationInstance.physicsMass = impostor.getParam("mass"); - serializationInstance.physicsFriction = impostor.getParam("friction"); - serializationInstance.physicsRestitution = impostor.getParam("mass"); - serializationInstance.physicsImpostor = impostor.type; + if (binaryInfo.uvs6AttrDesc && binaryInfo.uvs6AttrDesc.count > 0) { + const uvs6Data = new Float32Array(parsedGeometry, binaryInfo.uvs6AttrDesc.offset, binaryInfo.uvs6AttrDesc.count); + if (CompatibilityOptions.UseOpenGLOrientationForUV) { + for (let index = 1; index < uvs6Data.length; index += 2) { + uvs6Data[index] = 1 - uvs6Data[index]; + } } + mesh.setVerticesData(VertexBuffer.UV6Kind, uvs6Data, false); } - if (instance.metadata) { - serializationInstance.metadata = instance.metadata; + if (binaryInfo.colorsAttrDesc && binaryInfo.colorsAttrDesc.count > 0) { + const colorsData = new Float32Array(parsedGeometry, binaryInfo.colorsAttrDesc.offset, binaryInfo.colorsAttrDesc.count); + mesh.setVerticesData(VertexBuffer.ColorKind, colorsData, false, binaryInfo.colorsAttrDesc.stride); } - if (instance.actionManager) { - serializationInstance.actions = instance.actionManager.serialize(instance.name); + if (binaryInfo.matricesIndicesAttrDesc && binaryInfo.matricesIndicesAttrDesc.count > 0) { + const matricesIndicesData = new Int32Array(parsedGeometry, binaryInfo.matricesIndicesAttrDesc.offset, binaryInfo.matricesIndicesAttrDesc.count); + const floatIndices = []; + for (let i = 0; i < matricesIndicesData.length; i++) { + const index = matricesIndicesData[i]; + floatIndices.push(index & 255); + floatIndices.push((index & 65280) >> 8); + floatIndices.push((index & 16711680) >> 16); + floatIndices.push(index >> 24 & 255); + } + mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, floatIndices, false); } - serializationObject.instances.push(serializationInstance); - SerializationHelper.AppendSerializedAnimations(instance, serializationInstance); - serializationInstance.ranges = instance.serializeAnimationRanges(); - } - if (this._thinInstanceDataStorage.instancesCount && this._thinInstanceDataStorage.matrixData) { - serializationObject.thinInstances = { - instancesCount: this._thinInstanceDataStorage.instancesCount, - matrixData: Array.from(this._thinInstanceDataStorage.matrixData), - matrixBufferSize: this._thinInstanceDataStorage.matrixBufferSize, - enablePicking: this.thinInstanceEnablePicking - }; - if (this._userThinInstanceBuffersStorage) { - const userThinInstance = { - data: {}, - sizes: {}, - strides: {} - }; - for (const kind in this._userThinInstanceBuffersStorage.data) { - userThinInstance.data[kind] = Array.from(this._userThinInstanceBuffersStorage.data[kind]); - userThinInstance.sizes[kind] = this._userThinInstanceBuffersStorage.sizes[kind]; - userThinInstance.strides[kind] = this._userThinInstanceBuffersStorage.strides[kind]; + if (binaryInfo.matricesIndicesExtraAttrDesc && binaryInfo.matricesIndicesExtraAttrDesc.count > 0) { + const matricesIndicesData = new Int32Array(parsedGeometry, binaryInfo.matricesIndicesExtraAttrDesc.offset, binaryInfo.matricesIndicesExtraAttrDesc.count); + const floatIndices = []; + for (let i = 0; i < matricesIndicesData.length; i++) { + const index = matricesIndicesData[i]; + floatIndices.push(index & 255); + floatIndices.push((index & 65280) >> 8); + floatIndices.push((index & 16711680) >> 16); + floatIndices.push(index >> 24 & 255); } - serializationObject.thinInstances.userThinInstance = userThinInstance; + mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, floatIndices, false); + } + if (binaryInfo.matricesWeightsAttrDesc && binaryInfo.matricesWeightsAttrDesc.count > 0) { + const matricesWeightsData = new Float32Array(parsedGeometry, binaryInfo.matricesWeightsAttrDesc.offset, binaryInfo.matricesWeightsAttrDesc.count); + mesh.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeightsData, false); + } + if (binaryInfo.indicesAttrDesc && binaryInfo.indicesAttrDesc.count > 0) { + const indicesData = new Int32Array(parsedGeometry, binaryInfo.indicesAttrDesc.offset, binaryInfo.indicesAttrDesc.count); + mesh.setIndices(indicesData, null); + } + if (binaryInfo.subMeshesAttrDesc && binaryInfo.subMeshesAttrDesc.count > 0) { + const subMeshesData = new Int32Array(parsedGeometry, binaryInfo.subMeshesAttrDesc.offset, binaryInfo.subMeshesAttrDesc.count * 5); + mesh.subMeshes = []; + for (let i = 0; i < binaryInfo.subMeshesAttrDesc.count; i++) { + const materialIndex = subMeshesData[i * 5 + 0]; + const verticesStart = subMeshesData[i * 5 + 1]; + const verticesCount = subMeshesData[i * 5 + 2]; + const indexStart = subMeshesData[i * 5 + 3]; + const indexCount = subMeshesData[i * 5 + 4]; + SubMesh.AddToMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh); + } + } + } else if (parsedGeometry.positions && parsedGeometry.normals && parsedGeometry.indices) { + mesh.setVerticesData(VertexBuffer.PositionKind, parsedGeometry.positions, parsedGeometry.positions._updatable); + mesh.setVerticesData(VertexBuffer.NormalKind, parsedGeometry.normals, parsedGeometry.normals._updatable); + if (parsedGeometry.tangents) { + mesh.setVerticesData(VertexBuffer.TangentKind, parsedGeometry.tangents, parsedGeometry.tangents._updatable); + } + if (parsedGeometry.uvs) { + mesh.setVerticesData(VertexBuffer.UVKind, parsedGeometry.uvs, parsedGeometry.uvs._updatable); + } + if (parsedGeometry.uvs2) { + mesh.setVerticesData(VertexBuffer.UV2Kind, parsedGeometry.uvs2, parsedGeometry.uvs2._updatable); + } + if (parsedGeometry.uvs3) { + mesh.setVerticesData(VertexBuffer.UV3Kind, parsedGeometry.uvs3, parsedGeometry.uvs3._updatable); + } + if (parsedGeometry.uvs4) { + mesh.setVerticesData(VertexBuffer.UV4Kind, parsedGeometry.uvs4, parsedGeometry.uvs4._updatable); + } + if (parsedGeometry.uvs5) { + mesh.setVerticesData(VertexBuffer.UV5Kind, parsedGeometry.uvs5, parsedGeometry.uvs5._updatable); + } + if (parsedGeometry.uvs6) { + mesh.setVerticesData(VertexBuffer.UV6Kind, parsedGeometry.uvs6, parsedGeometry.uvs6._updatable); + } + if (parsedGeometry.colors) { + mesh.setVerticesData(VertexBuffer.ColorKind, Color4.CheckColors4(parsedGeometry.colors, parsedGeometry.positions.length / 3), parsedGeometry.colors._updatable); + } + if (parsedGeometry.matricesIndices) { + if (!parsedGeometry.matricesIndices._isExpanded) { + const floatIndices = []; + for (let i = 0; i < parsedGeometry.matricesIndices.length; i++) { + const matricesIndex = parsedGeometry.matricesIndices[i]; + floatIndices.push(matricesIndex & 255); + floatIndices.push((matricesIndex & 65280) >> 8); + floatIndices.push((matricesIndex & 16711680) >> 16); + floatIndices.push(matricesIndex >> 24 & 255); + } + mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, floatIndices, parsedGeometry.matricesIndices._updatable); + } else { + delete parsedGeometry.matricesIndices._isExpanded; + mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, parsedGeometry.matricesIndices, parsedGeometry.matricesIndices._updatable); + } + } + if (parsedGeometry.matricesIndicesExtra) { + if (!parsedGeometry.matricesIndicesExtra._isExpanded) { + const floatIndices = []; + for (let i = 0; i < parsedGeometry.matricesIndicesExtra.length; i++) { + const matricesIndex = parsedGeometry.matricesIndicesExtra[i]; + floatIndices.push(matricesIndex & 255); + floatIndices.push((matricesIndex & 65280) >> 8); + floatIndices.push((matricesIndex & 16711680) >> 16); + floatIndices.push(matricesIndex >> 24 & 255); + } + mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, floatIndices, parsedGeometry.matricesIndicesExtra._updatable); + } else { + delete parsedGeometry.matricesIndices._isExpanded; + mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, parsedGeometry.matricesIndicesExtra, parsedGeometry.matricesIndicesExtra._updatable); + } + } + if (parsedGeometry.matricesWeights) { + _Geometry._CleanMatricesWeights(parsedGeometry, mesh); + mesh.setVerticesData(VertexBuffer.MatricesWeightsKind, parsedGeometry.matricesWeights, parsedGeometry.matricesWeights._updatable); + } + if (parsedGeometry.matricesWeightsExtra) { + mesh.setVerticesData(VertexBuffer.MatricesWeightsExtraKind, parsedGeometry.matricesWeightsExtra, parsedGeometry.matricesWeights._updatable); } + mesh.setIndices(parsedGeometry.indices, null); } - SerializationHelper.AppendSerializedAnimations(this, serializationObject); - serializationObject.ranges = this.serializeAnimationRanges(); - serializationObject.layerMask = this.layerMask; - serializationObject.alphaIndex = this.alphaIndex; - serializationObject.hasVertexAlpha = this.hasVertexAlpha; - serializationObject.overlayAlpha = this.overlayAlpha; - serializationObject.overlayColor = this.overlayColor.asArray(); - serializationObject.renderOverlay = this.renderOverlay; - serializationObject.applyFog = this.applyFog; - if (this.actionManager) { - serializationObject.actions = this.actionManager.serialize(this.name); + if (parsedGeometry.subMeshes) { + mesh.subMeshes = []; + for (let subIndex = 0; subIndex < parsedGeometry.subMeshes.length; subIndex++) { + const parsedSubMesh = parsedGeometry.subMeshes[subIndex]; + SubMesh.AddToMesh(parsedSubMesh.materialIndex, parsedSubMesh.verticesStart, parsedSubMesh.verticesCount, parsedSubMesh.indexStart, parsedSubMesh.indexCount, mesh); + } } - return serializationObject; + if (mesh._shouldGenerateFlatShading) { + mesh.convertToFlatShadedMesh(); + mesh._shouldGenerateFlatShading = false; + } + mesh.computeWorldMatrix(true); + scene.onMeshImportedObservable.notifyObservers(mesh); } - /** @internal */ - _syncGeometryWithMorphTargetManager() { - if (!this.geometry) { + static _CleanMatricesWeights(parsedGeometry, mesh) { + const epsilon = 1e-3; + if (!SceneLoaderFlags.CleanBoneMatrixWeights) { return; } - this._markSubMeshesAsAttributesDirty(); - const morphTargetManager = this._internalAbstractMeshDataInfo._morphTargetManager; - if (morphTargetManager && morphTargetManager.vertexCount) { - if (morphTargetManager.vertexCount !== this.getTotalVertices()) { - Logger.Error("Mesh is incompatible with morph targets. Targets and mesh must all have the same vertices count."); - this.morphTargetManager = null; - return; - } - if (morphTargetManager.isUsingTextureForTargets) { + let noInfluenceBoneIndex = 0; + if (parsedGeometry.skeletonId > -1) { + const skeleton = mesh.getScene().getLastSkeletonById(parsedGeometry.skeletonId); + if (!skeleton) { return; } - for (let index = 0; index < morphTargetManager.numInfluencers; index++) { - const morphTarget = morphTargetManager.getActiveTarget(index); - const positions = morphTarget.getPositions(); - if (!positions) { - Logger.Error("Invalid morph target. Target must have positions."); - return; - } - this.geometry.setVerticesData(VertexBuffer.PositionKind + index, positions, false, 3); - const normals = morphTarget.getNormals(); - if (normals) { - this.geometry.setVerticesData(VertexBuffer.NormalKind + index, normals, false, 3); - } - const tangents = morphTarget.getTangents(); - if (tangents) { - this.geometry.setVerticesData(VertexBuffer.TangentKind + index, tangents, false, 3); + noInfluenceBoneIndex = skeleton.bones.length; + } else { + return; + } + const matricesIndices = mesh.getVerticesData(VertexBuffer.MatricesIndicesKind); + const matricesIndicesExtra = mesh.getVerticesData(VertexBuffer.MatricesIndicesExtraKind); + const matricesWeights = parsedGeometry.matricesWeights; + const matricesWeightsExtra = parsedGeometry.matricesWeightsExtra; + const influencers = parsedGeometry.numBoneInfluencer; + const size = matricesWeights.length; + for (let i = 0; i < size; i += 4) { + let weight = 0; + let firstZeroWeight = -1; + for (let j = 0; j < 4; j++) { + const w = matricesWeights[i + j]; + weight += w; + if (w < epsilon && firstZeroWeight < 0) { + firstZeroWeight = j; } - const uvs = morphTarget.getUVs(); - if (uvs) { - this.geometry.setVerticesData(VertexBuffer.UVKind + "_" + index, uvs, false, 2); + } + if (matricesWeightsExtra) { + for (let j = 0; j < 4; j++) { + const w = matricesWeightsExtra[i + j]; + weight += w; + if (w < epsilon && firstZeroWeight < 0) { + firstZeroWeight = j + 4; + } } } - } else { - let index = 0; - while (this.geometry.isVerticesDataPresent(VertexBuffer.PositionKind + index)) { - this.geometry.removeVerticesData(VertexBuffer.PositionKind + index); - if (this.geometry.isVerticesDataPresent(VertexBuffer.NormalKind + index)) { - this.geometry.removeVerticesData(VertexBuffer.NormalKind + index); + if (firstZeroWeight < 0 || firstZeroWeight > influencers - 1) { + firstZeroWeight = influencers - 1; + } + if (weight > epsilon) { + const mweight = 1 / weight; + for (let j = 0; j < 4; j++) { + matricesWeights[i + j] *= mweight; } - if (this.geometry.isVerticesDataPresent(VertexBuffer.TangentKind + index)) { - this.geometry.removeVerticesData(VertexBuffer.TangentKind + index); + if (matricesWeightsExtra) { + for (let j = 0; j < 4; j++) { + matricesWeightsExtra[i + j] *= mweight; + } } - if (this.geometry.isVerticesDataPresent(VertexBuffer.UVKind + index)) { - this.geometry.removeVerticesData(VertexBuffer.UVKind + "_" + index); + } else { + if (firstZeroWeight >= 4) { + matricesWeightsExtra[i + firstZeroWeight - 4] = 1 - weight; + matricesIndicesExtra[i + firstZeroWeight - 4] = noInfluenceBoneIndex; + } else { + matricesWeights[i + firstZeroWeight] = 1 - weight; + matricesIndices[i + firstZeroWeight] = noInfluenceBoneIndex; } - index++; } } + mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, matricesIndices); + if (parsedGeometry.matricesWeightsExtra) { + mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, matricesIndicesExtra); + } } /** - * Returns a new Mesh object parsed from the source provided. - * @param parsedMesh is the source + * Create a new geometry from persisted data (Using .babylon file format) + * @param parsedVertexData defines the persisted data * @param scene defines the hosting scene - * @param rootUrl is the root URL to prefix the `delayLoadingFile` property with - * @returns a new Mesh + * @param rootUrl defines the root url to use to load assets (like delayed data) + * @returns the new geometry object */ - static Parse(parsedMesh, scene, rootUrl) { - let mesh; - if (parsedMesh.type && parsedMesh.type === "LinesMesh") { - mesh = _Mesh._LinesMeshParser(parsedMesh, scene); - } else if (parsedMesh.type && parsedMesh.type === "GroundMesh") { - mesh = _Mesh._GroundMeshParser(parsedMesh, scene); - } else if (parsedMesh.type && parsedMesh.type === "GoldbergMesh") { - mesh = _Mesh._GoldbergMeshParser(parsedMesh, scene); - } else if (parsedMesh.type && parsedMesh.type === "GreasedLineMesh") { - mesh = _Mesh._GreasedLineMeshParser(parsedMesh, scene); - } else if (parsedMesh.type && parsedMesh.type === "TrailMesh") { - mesh = _Mesh._TrailMeshParser(parsedMesh, scene); - } else { - mesh = new _Mesh(parsedMesh.name, scene); - } - mesh.id = parsedMesh.id; - mesh._waitingParsedUniqueId = parsedMesh.uniqueId; + static Parse(parsedVertexData, scene, rootUrl) { + const geometry = new _Geometry(parsedVertexData.id, scene, void 0, parsedVertexData.updatable); + geometry._loadedUniqueId = parsedVertexData.uniqueId; if (Tags) { - Tags.AddTagsTo(mesh, parsedMesh.tags); - } - mesh.position = Vector3.FromArray(parsedMesh.position); - if (parsedMesh.metadata !== void 0) { - mesh.metadata = parsedMesh.metadata; - } - if (parsedMesh.rotationQuaternion) { - mesh.rotationQuaternion = Quaternion.FromArray(parsedMesh.rotationQuaternion); - } else if (parsedMesh.rotation) { - mesh.rotation = Vector3.FromArray(parsedMesh.rotation); - } - mesh.scaling = Vector3.FromArray(parsedMesh.scaling); - if (parsedMesh.localMatrix) { - mesh.setPreTransformMatrix(Matrix.FromArray(parsedMesh.localMatrix)); - } else if (parsedMesh.pivotMatrix) { - mesh.setPivotMatrix(Matrix.FromArray(parsedMesh.pivotMatrix)); - } - mesh.setEnabled(parsedMesh.isEnabled); - mesh.isVisible = parsedMesh.isVisible; - mesh.infiniteDistance = parsedMesh.infiniteDistance; - mesh.alwaysSelectAsActiveMesh = !!parsedMesh.alwaysSelectAsActiveMesh; - mesh.showBoundingBox = parsedMesh.showBoundingBox; - mesh.showSubMeshesBoundingBox = parsedMesh.showSubMeshesBoundingBox; - if (parsedMesh.applyFog !== void 0) { - mesh.applyFog = parsedMesh.applyFog; - } - if (parsedMesh.pickable !== void 0) { - mesh.isPickable = parsedMesh.pickable; - } - if (parsedMesh.alphaIndex !== void 0) { - mesh.alphaIndex = parsedMesh.alphaIndex; - } - mesh.receiveShadows = parsedMesh.receiveShadows; - if (parsedMesh.billboardMode !== void 0) { - mesh.billboardMode = parsedMesh.billboardMode; - } - if (parsedMesh.visibility !== void 0) { - mesh.visibility = parsedMesh.visibility; - } - mesh.checkCollisions = parsedMesh.checkCollisions; - mesh.doNotSyncBoundingInfo = !!parsedMesh.doNotSyncBoundingInfo; - if (parsedMesh.ellipsoid) { - mesh.ellipsoid = Vector3.FromArray(parsedMesh.ellipsoid); - } - if (parsedMesh.ellipsoidOffset) { - mesh.ellipsoidOffset = Vector3.FromArray(parsedMesh.ellipsoidOffset); - } - if (parsedMesh.overrideMaterialSideOrientation !== void 0) { - mesh.overrideMaterialSideOrientation = parsedMesh.overrideMaterialSideOrientation; - } - if (parsedMesh.isBlocker !== void 0) { - mesh.isBlocker = parsedMesh.isBlocker; - } - mesh._shouldGenerateFlatShading = parsedMesh.useFlatShading; - if (parsedMesh.freezeWorldMatrix) { - mesh._waitingData.freezeWorldMatrix = parsedMesh.freezeWorldMatrix; - } - if (parsedMesh.parentId !== void 0) { - mesh._waitingParentId = parsedMesh.parentId; - } - if (parsedMesh.parentInstanceIndex !== void 0) { - mesh._waitingParentInstanceIndex = parsedMesh.parentInstanceIndex; - } - if (parsedMesh.actions !== void 0) { - mesh._waitingData.actions = parsedMesh.actions; - } - if (parsedMesh.overlayAlpha !== void 0) { - mesh.overlayAlpha = parsedMesh.overlayAlpha; - } - if (parsedMesh.overlayColor !== void 0) { - mesh.overlayColor = Color3.FromArray(parsedMesh.overlayColor); - } - if (parsedMesh.renderOverlay !== void 0) { - mesh.renderOverlay = parsedMesh.renderOverlay; + Tags.AddTagsTo(geometry, parsedVertexData.tags); } - mesh.isUnIndexed = !!parsedMesh.isUnIndexed; - mesh.hasVertexAlpha = parsedMesh.hasVertexAlpha; - if (parsedMesh.delayLoadingFile) { - mesh.delayLoadState = 4; - mesh.delayLoadingFile = rootUrl + parsedMesh.delayLoadingFile; - mesh.buildBoundingInfo(Vector3.FromArray(parsedMesh.boundingBoxMinimum), Vector3.FromArray(parsedMesh.boundingBoxMaximum)); - if (parsedMesh._binaryInfo) { - mesh._binaryInfo = parsedMesh._binaryInfo; - } - mesh._delayInfo = []; - if (parsedMesh.hasUVs) { - mesh._delayInfo.push(VertexBuffer.UVKind); - } - if (parsedMesh.hasUVs2) { - mesh._delayInfo.push(VertexBuffer.UV2Kind); + if (parsedVertexData.delayLoadingFile) { + geometry.delayLoadState = 4; + geometry.delayLoadingFile = rootUrl + parsedVertexData.delayLoadingFile; + geometry._boundingInfo = new BoundingInfo(Vector3.FromArray(parsedVertexData.boundingBoxMinimum), Vector3.FromArray(parsedVertexData.boundingBoxMaximum)); + geometry._delayInfo = []; + if (parsedVertexData.hasUVs) { + geometry._delayInfo.push(VertexBuffer.UVKind); } - if (parsedMesh.hasUVs3) { - mesh._delayInfo.push(VertexBuffer.UV3Kind); + if (parsedVertexData.hasUVs2) { + geometry._delayInfo.push(VertexBuffer.UV2Kind); } - if (parsedMesh.hasUVs4) { - mesh._delayInfo.push(VertexBuffer.UV4Kind); + if (parsedVertexData.hasUVs3) { + geometry._delayInfo.push(VertexBuffer.UV3Kind); } - if (parsedMesh.hasUVs5) { - mesh._delayInfo.push(VertexBuffer.UV5Kind); + if (parsedVertexData.hasUVs4) { + geometry._delayInfo.push(VertexBuffer.UV4Kind); } - if (parsedMesh.hasUVs6) { - mesh._delayInfo.push(VertexBuffer.UV6Kind); + if (parsedVertexData.hasUVs5) { + geometry._delayInfo.push(VertexBuffer.UV5Kind); } - if (parsedMesh.hasColors) { - mesh._delayInfo.push(VertexBuffer.ColorKind); + if (parsedVertexData.hasUVs6) { + geometry._delayInfo.push(VertexBuffer.UV6Kind); } - if (parsedMesh.hasMatricesIndices) { - mesh._delayInfo.push(VertexBuffer.MatricesIndicesKind); + if (parsedVertexData.hasColors) { + geometry._delayInfo.push(VertexBuffer.ColorKind); } - if (parsedMesh.hasMatricesWeights) { - mesh._delayInfo.push(VertexBuffer.MatricesWeightsKind); + if (parsedVertexData.hasMatricesIndices) { + geometry._delayInfo.push(VertexBuffer.MatricesIndicesKind); } - mesh._delayLoadingFunction = Geometry._ImportGeometry; - if (SceneLoaderFlags.ForceFullSceneLoadingForIncremental) { - mesh._checkDelayState(); + if (parsedVertexData.hasMatricesWeights) { + geometry._delayInfo.push(VertexBuffer.MatricesWeightsKind); } + geometry._delayLoadingFunction = VertexData.ImportVertexData; } else { - Geometry._ImportGeometry(parsedMesh, mesh); - } - if (parsedMesh.materialUniqueId) { - mesh._waitingMaterialId = parsedMesh.materialUniqueId; - } else if (parsedMesh.materialId) { - mesh._waitingMaterialId = parsedMesh.materialId; + VertexData.ImportVertexData(parsedVertexData, geometry); } - if (parsedMesh.morphTargetManagerId > -1) { - mesh.morphTargetManager = scene.getMorphTargetManagerById(parsedMesh.morphTargetManagerId); + scene.pushGeometry(geometry, true); + return geometry; + } +}; + +// node_modules/@babylonjs/core/Materials/multiMaterial.js +var MultiMaterial = class _MultiMaterial extends Material { + /** + * Gets or Sets the list of Materials used within the multi material. + * They need to be ordered according to the submeshes order in the associated mesh + */ + get subMaterials() { + return this._subMaterials; + } + set subMaterials(value) { + this._subMaterials = value; + this._hookArray(value); + } + /** + * Function used to align with Node.getChildren() + * @returns the list of Materials used within the multi material + */ + getChildren() { + return this.subMaterials; + } + /** + * Instantiates a new Multi Material + * A multi-material is used to apply different materials to different parts of the same object without the need of + * separate meshes. This can be use to improve performances. + * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials + * @param name Define the name in the scene + * @param scene Define the scene the material belongs to + */ + constructor(name69, scene) { + super(name69, scene, true); + this._waitingSubMaterialsUniqueIds = []; + this.getScene().addMultiMaterial(this); + this.subMaterials = []; + this._storeEffectOnSubMeshes = true; + } + _hookArray(array) { + const oldPush = array.push; + array.push = (...items) => { + const result = oldPush.apply(array, items); + this._markAllSubMeshesAsTexturesDirty(); + return result; + }; + const oldSplice = array.splice; + array.splice = (index, deleteCount) => { + const deleted = oldSplice.apply(array, [index, deleteCount]); + this._markAllSubMeshesAsTexturesDirty(); + return deleted; + }; + } + /** + * Get one of the submaterial by its index in the submaterials array + * @param index The index to look the sub material at + * @returns The Material if the index has been defined + */ + getSubMaterial(index) { + if (index < 0 || index >= this.subMaterials.length) { + return this.getScene().defaultMaterial; } - if (parsedMesh.skeletonId !== void 0 && parsedMesh.skeletonId !== null) { - mesh.skeleton = scene.getLastSkeletonById(parsedMesh.skeletonId); - if (parsedMesh.numBoneInfluencers) { - mesh.numBoneInfluencers = parsedMesh.numBoneInfluencers; + return this.subMaterials[index]; + } + /** + * Get the list of active textures for the whole sub materials list. + * @returns All the textures that will be used during the rendering + */ + getActiveTextures() { + return super.getActiveTextures().concat(...this.subMaterials.map((subMaterial) => { + if (subMaterial) { + return subMaterial.getActiveTextures(); + } else { + return []; } + })); + } + /** + * Specifies if any sub-materials of this multi-material use a given texture. + * @param texture Defines the texture to check against this multi-material's sub-materials. + * @returns A boolean specifying if any sub-material of this multi-material uses the texture. + */ + hasTexture(texture) { + var _a; + if (super.hasTexture(texture)) { + return true; } - if (parsedMesh.animations) { - for (let animationIndex = 0; animationIndex < parsedMesh.animations.length; animationIndex++) { - const parsedAnimation = parsedMesh.animations[animationIndex]; - const internalClass = GetClass("BABYLON.Animation"); - if (internalClass) { - mesh.animations.push(internalClass.Parse(parsedAnimation)); - } + for (let i = 0; i < this.subMaterials.length; i++) { + if ((_a = this.subMaterials[i]) == null ? void 0 : _a.hasTexture(texture)) { + return true; } - Node.ParseAnimationRanges(mesh, parsedMesh, scene); - } - if (parsedMesh.autoAnimate) { - scene.beginAnimation(mesh, parsedMesh.autoAnimateFrom, parsedMesh.autoAnimateTo, parsedMesh.autoAnimateLoop, parsedMesh.autoAnimateSpeed || 1); - } - if (parsedMesh.layerMask && !isNaN(parsedMesh.layerMask)) { - mesh.layerMask = Math.abs(parseInt(parsedMesh.layerMask)); - } else { - mesh.layerMask = 268435455; - } - if (parsedMesh.physicsImpostor) { - _Mesh._PhysicsImpostorParser(scene, mesh, parsedMesh); - } - if (parsedMesh.lodMeshIds) { - mesh._waitingData.lods = { - ids: parsedMesh.lodMeshIds, - distances: parsedMesh.lodDistances ? parsedMesh.lodDistances : null, - coverages: parsedMesh.lodCoverages ? parsedMesh.lodCoverages : null - }; } - if (parsedMesh.instances) { - for (let index = 0; index < parsedMesh.instances.length; index++) { - const parsedInstance = parsedMesh.instances[index]; - const instance = mesh.createInstance(parsedInstance.name); - if (parsedInstance.id) { - instance.id = parsedInstance.id; - } - if (Tags) { - if (parsedInstance.tags) { - Tags.AddTagsTo(instance, parsedInstance.tags); - } else { - Tags.AddTagsTo(instance, parsedMesh.tags); - } - } - instance.position = Vector3.FromArray(parsedInstance.position); - if (parsedInstance.metadata !== void 0) { - instance.metadata = parsedInstance.metadata; - } - if (parsedInstance.parentId !== void 0) { - instance._waitingParentId = parsedInstance.parentId; - } - if (parsedInstance.parentInstanceIndex !== void 0) { - instance._waitingParentInstanceIndex = parsedInstance.parentInstanceIndex; - } - if (parsedInstance.isEnabled !== void 0 && parsedInstance.isEnabled !== null) { - instance.setEnabled(parsedInstance.isEnabled); - } - if (parsedInstance.isVisible !== void 0 && parsedInstance.isVisible !== null) { - instance.isVisible = parsedInstance.isVisible; - } - if (parsedInstance.isPickable !== void 0 && parsedInstance.isPickable !== null) { - instance.isPickable = parsedInstance.isPickable; - } - if (parsedInstance.rotationQuaternion) { - instance.rotationQuaternion = Quaternion.FromArray(parsedInstance.rotationQuaternion); - } else if (parsedInstance.rotation) { - instance.rotation = Vector3.FromArray(parsedInstance.rotation); - } - instance.scaling = Vector3.FromArray(parsedInstance.scaling); - if (parsedInstance.checkCollisions != void 0 && parsedInstance.checkCollisions != null) { - instance.checkCollisions = parsedInstance.checkCollisions; - } - if (parsedInstance.pickable != void 0 && parsedInstance.pickable != null) { - instance.isPickable = parsedInstance.pickable; - } - if (parsedInstance.showBoundingBox != void 0 && parsedInstance.showBoundingBox != null) { - instance.showBoundingBox = parsedInstance.showBoundingBox; - } - if (parsedInstance.showSubMeshesBoundingBox != void 0 && parsedInstance.showSubMeshesBoundingBox != null) { - instance.showSubMeshesBoundingBox = parsedInstance.showSubMeshesBoundingBox; - } - if (parsedInstance.alphaIndex != void 0 && parsedInstance.showSubMeshesBoundingBox != null) { - instance.alphaIndex = parsedInstance.alphaIndex; - } - if (parsedInstance.physicsImpostor) { - _Mesh._PhysicsImpostorParser(scene, instance, parsedInstance); - } - if (parsedInstance.actions !== void 0) { - instance._waitingData.actions = parsedInstance.actions; - } - if (parsedInstance.animations) { - for (let animationIndex = 0; animationIndex < parsedInstance.animations.length; animationIndex++) { - const parsedAnimation = parsedInstance.animations[animationIndex]; - const internalClass = GetClass("BABYLON.Animation"); - if (internalClass) { - instance.animations.push(internalClass.Parse(parsedAnimation)); - } - } - Node.ParseAnimationRanges(instance, parsedInstance, scene); - if (parsedInstance.autoAnimate) { - scene.beginAnimation(instance, parsedInstance.autoAnimateFrom, parsedInstance.autoAnimateTo, parsedInstance.autoAnimateLoop, parsedInstance.autoAnimateSpeed || 1); + return false; + } + /** + * Gets the current class name of the material e.g. "MultiMaterial" + * Mainly use in serialization. + * @returns the class name + */ + getClassName() { + return "MultiMaterial"; + } + /** + * Checks if the material is ready to render the requested sub mesh + * @param mesh Define the mesh the submesh belongs to + * @param subMesh Define the sub mesh to look readiness for + * @param useInstances Define whether or not the material is used with instances + * @returns true if ready, otherwise false + */ + isReadyForSubMesh(mesh, subMesh, useInstances) { + for (let index = 0; index < this.subMaterials.length; index++) { + const subMaterial = this.subMaterials[index]; + if (subMaterial) { + if (subMaterial._storeEffectOnSubMeshes) { + if (!subMaterial.isReadyForSubMesh(mesh, subMesh, useInstances)) { + return false; } + continue; } - } - } - if (parsedMesh.thinInstances) { - const thinInstances = parsedMesh.thinInstances; - mesh.thinInstanceEnablePicking = !!thinInstances.enablePicking; - if (thinInstances.matrixData) { - mesh.thinInstanceSetBuffer("matrix", new Float32Array(thinInstances.matrixData), 16, false); - mesh._thinInstanceDataStorage.matrixBufferSize = thinInstances.matrixBufferSize; - mesh._thinInstanceDataStorage.instancesCount = thinInstances.instancesCount; - } else { - mesh._thinInstanceDataStorage.matrixBufferSize = thinInstances.matrixBufferSize; - } - if (parsedMesh.thinInstances.userThinInstance) { - const userThinInstance = parsedMesh.thinInstances.userThinInstance; - for (const kind in userThinInstance.data) { - mesh.thinInstanceSetBuffer(kind, new Float32Array(userThinInstance.data[kind]), userThinInstance.strides[kind], false); - mesh._userThinInstanceBuffersStorage.sizes[kind] = userThinInstance.sizes[kind]; + if (!subMaterial.isReady(mesh)) { + return false; } } } - return mesh; + return true; } - // Skeletons /** - * Prepare internal position array for software CPU skinning - * @returns original positions used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh + * Clones the current material and its related sub materials + * @param name Define the name of the newly cloned material + * @param cloneChildren Define if submaterial will be cloned or shared with the parent instance + * @returns the cloned material */ - setPositionsForCPUSkinning() { - const internalDataInfo = this._internalMeshDataInfo; - if (!internalDataInfo._sourcePositions) { - const source = this.getVerticesData(VertexBuffer.PositionKind); - if (!source) { - return internalDataInfo._sourcePositions; - } - internalDataInfo._sourcePositions = new Float32Array(source); - if (!this.isVertexBufferUpdatable(VertexBuffer.PositionKind)) { - this.setVerticesData(VertexBuffer.PositionKind, source, true); + clone(name69, cloneChildren) { + const newMultiMaterial = new _MultiMaterial(name69, this.getScene()); + for (let index = 0; index < this.subMaterials.length; index++) { + let subMaterial = null; + const current = this.subMaterials[index]; + if (cloneChildren && current) { + subMaterial = current.clone(name69 + "-" + current.name); + } else { + subMaterial = this.subMaterials[index]; } + newMultiMaterial.subMaterials.push(subMaterial); } - return internalDataInfo._sourcePositions; + return newMultiMaterial; } /** - * Prepare internal normal array for software CPU skinning - * @returns original normals used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh. + * Serializes the materials into a JSON representation. + * @returns the JSON representation */ - setNormalsForCPUSkinning() { - const internalDataInfo = this._internalMeshDataInfo; - if (!internalDataInfo._sourceNormals) { - const source = this.getVerticesData(VertexBuffer.NormalKind); - if (!source) { - return internalDataInfo._sourceNormals; - } - internalDataInfo._sourceNormals = new Float32Array(source); - if (!this.isVertexBufferUpdatable(VertexBuffer.NormalKind)) { - this.setVerticesData(VertexBuffer.NormalKind, source, true); + serialize() { + const serializationObject = {}; + serializationObject.name = this.name; + serializationObject.id = this.id; + serializationObject.uniqueId = this.uniqueId; + if (Tags) { + serializationObject.tags = Tags.GetTags(this); + } + serializationObject.materialsUniqueIds = []; + serializationObject.materials = []; + for (let matIndex = 0; matIndex < this.subMaterials.length; matIndex++) { + const subMat = this.subMaterials[matIndex]; + if (subMat) { + serializationObject.materialsUniqueIds.push(subMat.uniqueId); + serializationObject.materials.push(subMat.id); + } else { + serializationObject.materialsUniqueIds.push(null); + serializationObject.materials.push(null); } } - return internalDataInfo._sourceNormals; + return serializationObject; } /** - * Updates the vertex buffer by applying transformation from the bones - * @param skeleton defines the skeleton to apply to current mesh - * @returns the current mesh + * Dispose the material and release its associated resources + * @param forceDisposeEffect Define if we want to force disposing the associated effect (if false the shader is not released and could be reuse later on) + * @param forceDisposeTextures Define if we want to force disposing the associated textures (if false, they will not be disposed and can still be use elsewhere in the app) + * @param forceDisposeChildren Define if we want to force disposing the associated submaterials (if false, they will not be disposed and can still be use elsewhere in the app) */ - applySkeleton(skeleton) { - if (!this.geometry) { - return this; - } - if (this.geometry._softwareSkinningFrameId == this.getScene().getFrameId()) { - return this; - } - this.geometry._softwareSkinningFrameId = this.getScene().getFrameId(); - if (!this.isVerticesDataPresent(VertexBuffer.PositionKind)) { - return this; - } - if (!this.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind)) { - return this; - } - if (!this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) { - return this; - } - const hasNormals = this.isVerticesDataPresent(VertexBuffer.NormalKind); - const internalDataInfo = this._internalMeshDataInfo; - if (!internalDataInfo._sourcePositions) { - const submeshes = this.subMeshes.slice(); - this.setPositionsForCPUSkinning(); - this.subMeshes = submeshes; - } - if (hasNormals && !internalDataInfo._sourceNormals) { - this.setNormalsForCPUSkinning(); - } - let positionsData = this.getVerticesData(VertexBuffer.PositionKind); - if (!positionsData) { - return this; - } - if (!(positionsData instanceof Float32Array)) { - positionsData = new Float32Array(positionsData); - } - let normalsData = this.getVerticesData(VertexBuffer.NormalKind); - if (hasNormals) { - if (!normalsData) { - return this; - } - if (!(normalsData instanceof Float32Array)) { - normalsData = new Float32Array(normalsData); - } - } - const matricesIndicesData = this.getVerticesData(VertexBuffer.MatricesIndicesKind); - const matricesWeightsData = this.getVerticesData(VertexBuffer.MatricesWeightsKind); - if (!matricesWeightsData || !matricesIndicesData) { - return this; + dispose(forceDisposeEffect, forceDisposeTextures, forceDisposeChildren) { + const scene = this.getScene(); + if (!scene) { + return; } - const needExtras = this.numBoneInfluencers > 4; - const matricesIndicesExtraData = needExtras ? this.getVerticesData(VertexBuffer.MatricesIndicesExtraKind) : null; - const matricesWeightsExtraData = needExtras ? this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind) : null; - const skeletonMatrices = skeleton.getTransformMatrices(this); - const tempVector3 = Vector3.Zero(); - const finalMatrix = new Matrix(); - const tempMatrix = new Matrix(); - let matWeightIdx = 0; - let inf; - for (let index = 0; index < positionsData.length; index += 3, matWeightIdx += 4) { - let weight; - for (inf = 0; inf < 4; inf++) { - weight = matricesWeightsData[matWeightIdx + inf]; - if (weight > 0) { - Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesData[matWeightIdx + inf] * 16), weight, tempMatrix); - finalMatrix.addToSelf(tempMatrix); - } - } - if (needExtras) { - for (inf = 0; inf < 4; inf++) { - weight = matricesWeightsExtraData[matWeightIdx + inf]; - if (weight > 0) { - Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesExtraData[matWeightIdx + inf] * 16), weight, tempMatrix); - finalMatrix.addToSelf(tempMatrix); - } + if (forceDisposeChildren) { + for (let index2 = 0; index2 < this.subMaterials.length; index2++) { + const subMaterial = this.subMaterials[index2]; + if (subMaterial) { + subMaterial.dispose(forceDisposeEffect, forceDisposeTextures); } } - Vector3.TransformCoordinatesFromFloatsToRef(internalDataInfo._sourcePositions[index], internalDataInfo._sourcePositions[index + 1], internalDataInfo._sourcePositions[index + 2], finalMatrix, tempVector3); - tempVector3.toArray(positionsData, index); - if (hasNormals) { - Vector3.TransformNormalFromFloatsToRef(internalDataInfo._sourceNormals[index], internalDataInfo._sourceNormals[index + 1], internalDataInfo._sourceNormals[index + 2], finalMatrix, tempVector3); - tempVector3.toArray(normalsData, index); - } - finalMatrix.reset(); } - this.updateVerticesData(VertexBuffer.PositionKind, positionsData); - if (hasNormals) { - this.updateVerticesData(VertexBuffer.NormalKind, normalsData); + const index = scene.multiMaterials.indexOf(this); + if (index >= 0) { + scene.multiMaterials.splice(index, 1); } - return this; + super.dispose(forceDisposeEffect, forceDisposeTextures); } - // Tools /** - * Returns an object containing a min and max Vector3 which are the minimum and maximum vectors of each mesh bounding box from the passed array, in the world coordinates - * @param meshes defines the list of meshes to scan - * @returns an object `{min:` Vector3`, max:` Vector3`}` + * Creates a MultiMaterial from parsed MultiMaterial data. + * @param parsedMultiMaterial defines parsed MultiMaterial data. + * @param scene defines the hosting scene + * @returns a new MultiMaterial */ - static MinMax(meshes) { - let minVector = null; - let maxVector = null; - meshes.forEach(function(mesh) { - const boundingInfo = mesh.getBoundingInfo(); - const boundingBox = boundingInfo.boundingBox; - if (!minVector || !maxVector) { - minVector = boundingBox.minimumWorld; - maxVector = boundingBox.maximumWorld; - } else { - minVector.minimizeInPlace(boundingBox.minimumWorld); - maxVector.maximizeInPlace(boundingBox.maximumWorld); - } - }); - if (!minVector || !maxVector) { - return { - min: Vector3.Zero(), - max: Vector3.Zero() - }; + static ParseMultiMaterial(parsedMultiMaterial, scene) { + const multiMaterial = new _MultiMaterial(parsedMultiMaterial.name, scene); + multiMaterial.id = parsedMultiMaterial.id; + multiMaterial._loadedUniqueId = parsedMultiMaterial.uniqueId; + if (Tags) { + Tags.AddTagsTo(multiMaterial, parsedMultiMaterial.tags); } - return { - min: minVector, - max: maxVector - }; + if (parsedMultiMaterial.materialsUniqueIds) { + multiMaterial._waitingSubMaterialsUniqueIds = parsedMultiMaterial.materialsUniqueIds; + } else { + parsedMultiMaterial.materials.forEach((subMatId) => multiMaterial.subMaterials.push(scene.getLastMaterialById(subMatId))); + } + return multiMaterial; } +}; +RegisterClass("BABYLON.MultiMaterial", MultiMaterial); + +// node_modules/@babylonjs/core/Meshes/meshLODLevel.js +var MeshLODLevel = class { /** - * Returns the center of the `{min:` Vector3`, max:` Vector3`}` or the center of MinMax vector3 computed from a mesh array - * @param meshesOrMinMaxVector could be an array of meshes or a `{min:` Vector3`, max:` Vector3`}` object - * @returns a vector3 + * Creates a new LOD level + * @param distanceOrScreenCoverage defines either the distance or the screen coverage where this level should start being displayed + * @param mesh defines the mesh to use to render this level */ - static Center(meshesOrMinMaxVector) { - const minMaxVector = meshesOrMinMaxVector instanceof Array ? _Mesh.MinMax(meshesOrMinMaxVector) : meshesOrMinMaxVector; - return Vector3.Center(minMaxVector.min, minMaxVector.max); + constructor(distanceOrScreenCoverage, mesh) { + this.distanceOrScreenCoverage = distanceOrScreenCoverage; + this.mesh = mesh; } - /** - * Merge the array of meshes into a single mesh for performance reasons. - * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes. - * @param disposeSource when true (default), dispose of the vertices from the source meshes. - * @param allow32BitsIndices when the sum of the vertices > 64k, this must be set to true. - * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted. - * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes. - * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes. - * @returns a new mesh - */ - static MergeMeshes(meshes, disposeSource = true, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials) { - return runCoroutineSync(_Mesh._MergeMeshesCoroutine(meshes, disposeSource, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials, false)); +}; + +// node_modules/@babylonjs/core/Meshes/mesh.js +var _CreationDataStorage = class { +}; +var _InstanceDataStorage = class { + constructor() { + this.visibleInstances = {}; + this.batchCache = new _InstancesBatch(); + this.batchCacheReplacementModeInFrozenMode = new _InstancesBatch(); + this.instancesBufferSize = 32 * 16 * 4; } - /** - * Merge the array of meshes into a single mesh for performance reasons. - * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes. - * @param disposeSource when true (default), dispose of the vertices from the source meshes. - * @param allow32BitsIndices when the sum of the vertices > 64k, this must be set to true. - * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted. - * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes. - * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes. - * @returns a new mesh - */ - static MergeMeshesAsync(meshes, disposeSource = true, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials) { - return runCoroutineAsync(_Mesh._MergeMeshesCoroutine(meshes, disposeSource, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials, true), createYieldingScheduler()); +}; +var _InstancesBatch = class { + constructor() { + this.mustReturn = false; + this.visibleInstances = new Array(); + this.renderSelf = []; + this.hardwareInstancedRendering = []; } - static *_MergeMeshesCoroutine(meshes, disposeSource = true, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials, isAsync) { - meshes = meshes.filter(Boolean); - if (meshes.length === 0) { - return null; - } - let index; - if (!allow32BitsIndices) { - let totalVertices = 0; - for (index = 0; index < meshes.length; index++) { - totalVertices += meshes[index].getTotalVertices(); - if (totalVertices >= 65536) { - Logger.Warn("Cannot merge meshes because resulting mesh will have more than 65536 vertices. Please use allow32BitsIndices = true to use 32 bits indices"); - return null; - } - } - } - if (multiMultiMaterials) { - subdivideWithSubMeshes = false; - } - const materialArray = new Array(); - const materialIndexArray = new Array(); - const indiceArray = new Array(); - const currentOverrideMaterialSideOrientation = meshes[0].overrideMaterialSideOrientation; - for (index = 0; index < meshes.length; index++) { - const mesh = meshes[index]; - if (mesh.isAnInstance) { - Logger.Warn("Cannot merge instance meshes."); - return null; - } - if (currentOverrideMaterialSideOrientation !== mesh.overrideMaterialSideOrientation) { - Logger.Warn("Cannot merge meshes with different overrideMaterialSideOrientation values."); - return null; - } - if (subdivideWithSubMeshes) { - indiceArray.push(mesh.getTotalIndices()); - } - if (multiMultiMaterials) { - if (mesh.material) { - const material = mesh.material; - if (material instanceof MultiMaterial) { - for (let matIndex = 0; matIndex < material.subMaterials.length; matIndex++) { - if (materialArray.indexOf(material.subMaterials[matIndex]) < 0) { - materialArray.push(material.subMaterials[matIndex]); - } - } - for (let subIndex = 0; subIndex < mesh.subMeshes.length; subIndex++) { - materialIndexArray.push(materialArray.indexOf(material.subMaterials[mesh.subMeshes[subIndex].materialIndex])); - indiceArray.push(mesh.subMeshes[subIndex].indexCount); - } - } else { - if (materialArray.indexOf(material) < 0) { - materialArray.push(material); - } - for (let subIndex = 0; subIndex < mesh.subMeshes.length; subIndex++) { - materialIndexArray.push(materialArray.indexOf(material)); - indiceArray.push(mesh.subMeshes[subIndex].indexCount); - } - } - } else { - for (let subIndex = 0; subIndex < mesh.subMeshes.length; subIndex++) { - materialIndexArray.push(0); - indiceArray.push(mesh.subMeshes[subIndex].indexCount); - } - } - } - } - const source = meshes[0]; - const getVertexDataFromMesh = (mesh) => { - const wm = mesh.computeWorldMatrix(true); - const vertexData2 = VertexData.ExtractFromMesh(mesh, false, false); - return { vertexData: vertexData2, transform: wm }; - }; - const { vertexData: sourceVertexData, transform: sourceTransform } = getVertexDataFromMesh(source); - if (isAsync) { - yield; - } - const meshVertexDatas = new Array(meshes.length - 1); - for (let i = 1; i < meshes.length; i++) { - meshVertexDatas[i - 1] = getVertexDataFromMesh(meshes[i]); - if (isAsync) { - yield; - } - } - const mergeCoroutine = sourceVertexData._mergeCoroutine(sourceTransform, meshVertexDatas, allow32BitsIndices, isAsync, !disposeSource); - let mergeCoroutineStep = mergeCoroutine.next(); - while (!mergeCoroutineStep.done) { - if (isAsync) { - yield; - } - mergeCoroutineStep = mergeCoroutine.next(); - } - const vertexData = mergeCoroutineStep.value; - if (!meshSubclass) { - meshSubclass = new _Mesh(source.name + "_merged", source.getScene()); - } - const applyToCoroutine = vertexData._applyToCoroutine(meshSubclass, void 0, isAsync); - let applyToCoroutineStep = applyToCoroutine.next(); - while (!applyToCoroutineStep.done) { - if (isAsync) { - yield; - } - applyToCoroutineStep = applyToCoroutine.next(); - } - meshSubclass.checkCollisions = source.checkCollisions; - meshSubclass.overrideMaterialSideOrientation = source.overrideMaterialSideOrientation; - if (disposeSource) { - for (index = 0; index < meshes.length; index++) { - meshes[index].dispose(); - } - } - if (subdivideWithSubMeshes || multiMultiMaterials) { - meshSubclass.releaseSubMeshes(); - index = 0; - let offset = 0; - while (index < indiceArray.length) { - SubMesh.CreateFromIndices(0, offset, indiceArray[index], meshSubclass, void 0, false); - offset += indiceArray[index]; - index++; - } - for (const subMesh of meshSubclass.subMeshes) { - subMesh.refreshBoundingInfo(); - } - meshSubclass.computeWorldMatrix(true); - } - if (multiMultiMaterials) { - const newMultiMaterial = new MultiMaterial(source.name + "_merged", source.getScene()); - newMultiMaterial.subMaterials = materialArray; - for (let subIndex = 0; subIndex < meshSubclass.subMeshes.length; subIndex++) { - meshSubclass.subMeshes[subIndex].materialIndex = materialIndexArray[subIndex]; - } - meshSubclass.material = newMultiMaterial; - } else { - meshSubclass.material = source.material; - } - return meshSubclass; +}; +var _ThinInstanceDataStorage = class { + constructor() { + this.instancesCount = 0; + this.matrixBuffer = null; + this.previousMatrixBuffer = null; + this.matrixBufferSize = 32 * 16; + this.matrixData = null; + this.boundingVectors = []; + this.worldMatrices = null; + } +}; +var _InternalMeshDataInfo = class { + constructor() { + this._areNormalsFrozen = false; + this._source = null; + this.meshMap = null; + this._preActivateId = -1; + this._LODLevels = new Array(); + this._useLODScreenCoverage = false; + this._effectiveMaterial = null; + this._forcedInstanceCount = 0; + this._overrideRenderingFillMode = null; } +}; +var Mesh = class _Mesh extends AbstractMesh { /** + * Gets the default side orientation. + * @param orientation the orientation to value to attempt to get + * @returns the default orientation * @internal */ - addInstance(instance) { - instance._indexInSourceMeshInstanceArray = this.instances.length; - this.instances.push(instance); + static _GetDefaultSideOrientation(orientation) { + return orientation || _Mesh.FRONTSIDE; } /** - * @internal + * Determines if the LOD levels are intended to be calculated using screen coverage (surface area ratio) instead of distance. */ - removeInstance(instance) { - const index = instance._indexInSourceMeshInstanceArray; - if (index != -1) { - if (index !== this.instances.length - 1) { - const last = this.instances[this.instances.length - 1]; - this.instances[index] = last; - last._indexInSourceMeshInstanceArray = index; - } - instance._indexInSourceMeshInstanceArray = -1; - this.instances.pop(); - } + get useLODScreenCoverage() { + return this._internalMeshDataInfo._useLODScreenCoverage; } - /** @internal */ - _shouldConvertRHS() { - return this.overrideMaterialSideOrientation === Material.CounterClockWiseSideOrientation; + set useLODScreenCoverage(value) { + this._internalMeshDataInfo._useLODScreenCoverage = value; + this._sortLODLevels(); } - /** @internal */ - _getRenderingFillMode(fillMode) { - const scene = this.getScene(); - if (scene.forcePointsCloud) - return Material.PointFillMode; - if (scene.forceWireframe) - return Material.WireFrameFillMode; - return this.overrideRenderingFillMode ?? fillMode; + get computeBonesUsingShaders() { + return this._internalAbstractMeshDataInfo._computeBonesUsingShaders; } - // deprecated methods - /** - * Sets the mesh material by the material or multiMaterial `id` property - * @param id is a string identifying the material or the multiMaterial - * @returns the current mesh - * @deprecated Please use MeshBuilder instead Please use setMaterialById instead - */ - setMaterialByID(id) { - return this.setMaterialById(id); + set computeBonesUsingShaders(value) { + if (this._internalAbstractMeshDataInfo._computeBonesUsingShaders === value) { + return; + } + if (value && this._internalMeshDataInfo._sourcePositions) { + this.setVerticesData(VertexBuffer.PositionKind, this._internalMeshDataInfo._sourcePositions, true); + if (this._internalMeshDataInfo._sourceNormals) { + this.setVerticesData(VertexBuffer.NormalKind, this._internalMeshDataInfo._sourceNormals, true); + } + this._internalMeshDataInfo._sourcePositions = null; + this._internalMeshDataInfo._sourceNormals = null; + } + this._internalAbstractMeshDataInfo._computeBonesUsingShaders = value; + this._markSubMeshesAsAttributesDirty(); } /** - * Creates a ribbon mesh. - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param - * @param name defines the name of the mesh to create - * @param pathArray is a required array of paths, what are each an array of successive Vector3. The pathArray parameter depicts the ribbon geometry. - * @param closeArray creates a seam between the first and the last paths of the path array (default is false) - * @param closePath creates a seam between the first and the last points of each path of the path array - * @param offset is taken in account only if the `pathArray` is containing a single path - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @param instance defines an instance of an existing Ribbon object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#ribbon) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead + * An event triggered before rendering the mesh */ - static CreateRibbon(name69, pathArray, closeArray, closePath, offset, scene, updatable, sideOrientation, instance) { - throw new Error("Import MeshBuilder to populate this function"); + get onBeforeRenderObservable() { + if (!this._internalMeshDataInfo._onBeforeRenderObservable) { + this._internalMeshDataInfo._onBeforeRenderObservable = new Observable(); + } + return this._internalMeshDataInfo._onBeforeRenderObservable; } /** - * Creates a plane polygonal mesh. By default, this is a disc. - * @param name defines the name of the mesh to create - * @param radius sets the radius size (float) of the polygon (default 0.5) - * @param tessellation sets the number of polygon sides (positive integer, default 64). So a tessellation valued to 3 will build a triangle, to 4 a square, etc - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead + * An event triggered before binding the mesh */ - static CreateDisc(name69, radius, tessellation, scene, updatable, sideOrientation) { - throw new Error("Import MeshBuilder to populate this function"); + get onBeforeBindObservable() { + if (!this._internalMeshDataInfo._onBeforeBindObservable) { + this._internalMeshDataInfo._onBeforeBindObservable = new Observable(); + } + return this._internalMeshDataInfo._onBeforeBindObservable; } /** - * Creates a box mesh. - * @param name defines the name of the mesh to create - * @param size sets the size (float) of each box side (default 1) - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead + * An event triggered after rendering the mesh */ - static CreateBox(name69, size, scene, updatable, sideOrientation) { - throw new Error("Import MeshBuilder to populate this function"); + get onAfterRenderObservable() { + if (!this._internalMeshDataInfo._onAfterRenderObservable) { + this._internalMeshDataInfo._onAfterRenderObservable = new Observable(); + } + return this._internalMeshDataInfo._onAfterRenderObservable; } /** - * Creates a sphere mesh. - * @param name defines the name of the mesh to create - * @param segments sets the sphere number of horizontal stripes (positive integer, default 32) - * @param diameter sets the diameter size (float) of the sphere (default 1) - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead + * An event triggeredbetween rendering pass when using separateCullingPass = true */ - static CreateSphere(name69, segments, diameter, scene, updatable, sideOrientation) { - throw new Error("Import MeshBuilder to populate this function"); + get onBetweenPassObservable() { + if (!this._internalMeshDataInfo._onBetweenPassObservable) { + this._internalMeshDataInfo._onBetweenPassObservable = new Observable(); + } + return this._internalMeshDataInfo._onBetweenPassObservable; } /** - * Creates a hemisphere mesh. - * @param name defines the name of the mesh to create - * @param segments sets the sphere number of horizontal stripes (positive integer, default 32) - * @param diameter sets the diameter size (float) of the sphere (default 1) - * @param scene defines the hosting scene - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead + * An event triggered before drawing the mesh */ - static CreateHemisphere(name69, segments, diameter, scene) { - throw new Error("Import MeshBuilder to populate this function"); + get onBeforeDrawObservable() { + if (!this._internalMeshDataInfo._onBeforeDrawObservable) { + this._internalMeshDataInfo._onBeforeDrawObservable = new Observable(); + } + return this._internalMeshDataInfo._onBeforeDrawObservable; } /** - * Creates a cylinder or a cone mesh. - * @param name defines the name of the mesh to create - * @param height sets the height size (float) of the cylinder/cone (float, default 2) - * @param diameterTop set the top cap diameter (floats, default 1) - * @param diameterBottom set the bottom cap diameter (floats, default 1). This value can't be zero - * @param tessellation sets the number of cylinder sides (positive integer, default 24). Set it to 3 to get a prism for instance - * @param subdivisions sets the number of rings along the cylinder height (positive integer, default 1) - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead + * Sets a callback to call before drawing the mesh. It is recommended to use onBeforeDrawObservable instead */ - static CreateCylinder(name69, height, diameterTop, diameterBottom, tessellation, subdivisions, scene, updatable, sideOrientation) { - throw new Error("Import MeshBuilder to populate this function"); + set onBeforeDraw(callback) { + if (this._onBeforeDrawObserver) { + this.onBeforeDrawObservable.remove(this._onBeforeDrawObserver); + } + this._onBeforeDrawObserver = this.onBeforeDrawObservable.add(callback); } - // Torus (Code from SharpDX.org) - /** - * Creates a torus mesh. - * @param name defines the name of the mesh to create - * @param diameter sets the diameter size (float) of the torus (default 1) - * @param thickness sets the diameter size of the tube of the torus (float, default 0.5) - * @param tessellation sets the number of torus sides (positive integer, default 16) - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead - */ - static CreateTorus(name69, diameter, thickness, tessellation, scene, updatable, sideOrientation) { - throw new Error("Import MeshBuilder to populate this function"); + get hasInstances() { + return this.instances.length > 0; } - /** - * Creates a torus knot mesh. - * @param name defines the name of the mesh to create - * @param radius sets the global radius size (float) of the torus knot (default 2) - * @param tube sets the diameter size of the tube of the torus (float, default 0.5) - * @param radialSegments sets the number of sides on each tube segments (positive integer, default 32) - * @param tubularSegments sets the number of tubes to decompose the knot into (positive integer, default 32) - * @param p the number of windings on X axis (positive integers, default 2) - * @param q the number of windings on Y axis (positive integers, default 3) - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead - */ - static CreateTorusKnot(name69, radius, tube, radialSegments, tubularSegments, p, q, scene, updatable, sideOrientation) { - throw new Error("Import MeshBuilder to populate this function"); + get hasThinInstances() { + return (this.forcedInstanceCount || this._thinInstanceDataStorage.instancesCount || 0) > 0; } /** - * Creates a line mesh.. - * @param name defines the name of the mesh to create - * @param points is an array successive Vector3 - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines). - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead + * Gets or sets the forced number of instances to display. + * If 0 (default value), the number of instances is not forced and depends on the draw type + * (regular / instance / thin instances mesh) */ - static CreateLines(name69, points, scene, updatable, instance) { - throw new Error("Import MeshBuilder to populate this function"); + get forcedInstanceCount() { + return this._internalMeshDataInfo._forcedInstanceCount; } - /** - * Creates a dashed line mesh. - * @param name defines the name of the mesh to create - * @param points is an array successive Vector3 - * @param dashSize is the size of the dashes relatively the dash number (positive float, default 3) - * @param gapSize is the size of the gap between two successive dashes relatively the dash number (positive float, default 1) - * @param dashNb is the intended total number of dashes (positive integer, default 200) - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead - */ - static CreateDashedLines(name69, points, dashSize, gapSize, dashNb, scene, updatable, instance) { - throw new Error("Import MeshBuilder to populate this function"); + set forcedInstanceCount(count) { + this._internalMeshDataInfo._forcedInstanceCount = count; } /** - * Creates a polygon mesh.Please consider using the same method from the MeshBuilder class instead - * The polygon's shape will depend on the input parameters and is constructed parallel to a ground mesh. - * The parameter `shape` is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors. - * You can set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created. - * Remember you can only change the shape positions, not their number when updating a polygon. - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#non-regular-polygon - * @param name defines the name of the mesh to create - * @param shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors - * @param scene defines the hosting scene - * @param holes is a required array of arrays of successive Vector3 used to defines holes in the polygon - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @param earcutInjection can be used to inject your own earcut reference - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead + * Use this property to override the Material's fillMode value */ - static CreatePolygon(name69, shape, scene, holes, updatable, sideOrientation, earcutInjection) { - throw new Error("Import MeshBuilder to populate this function"); + get overrideRenderingFillMode() { + return this._internalMeshDataInfo._overrideRenderingFillMode; } - /** - * Creates an extruded polygon mesh, with depth in the Y direction.. - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-non-regular-polygon - * @param name defines the name of the mesh to create - * @param shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors - * @param depth defines the height of extrusion - * @param scene defines the hosting scene - * @param holes is a required array of arrays of successive Vector3 used to defines holes in the polygon - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @param earcutInjection can be used to inject your own earcut reference - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead - */ - static ExtrudePolygon(name69, shape, depth, scene, holes, updatable, sideOrientation, earcutInjection) { - throw new Error("Import MeshBuilder to populate this function"); + set overrideRenderingFillMode(fillMode) { + this._internalMeshDataInfo._overrideRenderingFillMode = fillMode; } /** - * Creates an extruded shape mesh. - * The extrusion is a parametric shape. It has no predefined shape. Its final shape will depend on the input parameters. - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes - * @param name defines the name of the mesh to create - * @param shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis - * @param path is a required array of successive Vector3. This is the axis curve the shape is extruded along - * @param scale is the value to scale the shape - * @param rotation is the angle value to rotate the shape each step (each path point), from the former step (so rotation added each step) along the curve - * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @param instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#extruded-shape) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead + * Gets the source mesh (the one used to clone this one from) */ - static ExtrudeShape(name69, shape, path, scale, rotation, cap, scene, updatable, sideOrientation, instance) { - throw new Error("Import MeshBuilder to populate this function"); + get source() { + return this._internalMeshDataInfo._source; } /** - * Creates an custom extruded shape mesh. - * The custom extrusion is a parametric shape. - * It has no predefined shape. Its final shape will depend on the input parameters. - * - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes - * @param name defines the name of the mesh to create - * @param shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis - * @param path is a required array of successive Vector3. This is the axis curve the shape is extruded along - * @param scaleFunction is a custom Javascript function called on each path point - * @param rotationFunction is a custom Javascript function called on each path point - * @param ribbonCloseArray forces the extrusion underlying ribbon to close all the paths in its `pathArray` - * @param ribbonClosePath forces the extrusion underlying ribbon to close its `pathArray` - * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @param instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#extruded-shape) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead + * Gets the list of clones of this mesh + * The scene must have been constructed with useClonedMeshMap=true for this to work! + * Note that useClonedMeshMap=true is the default setting */ - static ExtrudeShapeCustom(name69, shape, path, scaleFunction, rotationFunction, ribbonCloseArray, ribbonClosePath, cap, scene, updatable, sideOrientation, instance) { - throw new Error("Import MeshBuilder to populate this function"); + get cloneMeshMap() { + return this._internalMeshDataInfo.meshMap; } /** - * Creates lathe mesh. - * The lathe is a shape with a symmetry axis : a 2D model shape is rotated around this axis to design the lathe. - * @param name defines the name of the mesh to create - * @param shape is a required array of successive Vector3. This array depicts the shape to be rotated in its local space : the shape must be designed in the xOy plane and will be rotated around the Y axis. It's usually a 2D shape, so the Vector3 z coordinates are often set to zero - * @param radius is the radius value of the lathe - * @param tessellation is the side number of the lathe. - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead + * Gets or sets a boolean indicating that this mesh does not use index buffer */ - static CreateLathe(name69, shape, radius, tessellation, scene, updatable, sideOrientation) { - throw new Error("Import MeshBuilder to populate this function"); + get isUnIndexed() { + return this._unIndexed; } - /** - * Creates a plane mesh. - * @param name defines the name of the mesh to create - * @param size sets the size (float) of both sides of the plane at once (default 1) - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead - */ - static CreatePlane(name69, size, scene, updatable, sideOrientation) { - throw new Error("Import MeshBuilder to populate this function"); + set isUnIndexed(value) { + if (this._unIndexed !== value) { + this._unIndexed = value; + this._markSubMeshesAsAttributesDirty(); + } } - /** - * Creates a ground mesh. - * @param name defines the name of the mesh to create - * @param width set the width of the ground - * @param height set the height of the ground - * @param subdivisions sets the number of subdivisions per side - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead - */ - static CreateGround(name69, width, height, subdivisions, scene, updatable) { - throw new Error("Import MeshBuilder to populate this function"); + /** Gets the array buffer used to store the instanced buffer used for instances' world matrices */ + get worldMatrixInstancedBuffer() { + return this._instanceDataStorage.instancesData; } - /** - * Creates a tiled ground mesh. - * @param name defines the name of the mesh to create - * @param xmin set the ground minimum X coordinate - * @param zmin set the ground minimum Y coordinate - * @param xmax set the ground maximum X coordinate - * @param zmax set the ground maximum Z coordinate - * @param subdivisions is an object `{w: positive integer, h: positive integer}` (default `{w: 6, h: 6}`). `w` and `h` are the numbers of subdivisions on the ground width and height. Each subdivision is called a tile - * @param precision is an object `{w: positive integer, h: positive integer}` (default `{w: 2, h: 2}`). `w` and `h` are the numbers of subdivisions on the ground width and height of each tile - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead - */ - static CreateTiledGround(name69, xmin, zmin, xmax, zmax, subdivisions, precision, scene, updatable) { - throw new Error("Import MeshBuilder to populate this function"); + /** Gets the array buffer used to store the instanced buffer used for instances' previous world matrices */ + get previousWorldMatrixInstancedBuffer() { + return this._instanceDataStorage.instancesPreviousData; } - /** - * Creates a ground mesh from a height map. - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/height_map - * @param name defines the name of the mesh to create - * @param url sets the URL of the height map image resource - * @param width set the ground width size - * @param height set the ground height size - * @param subdivisions sets the number of subdivision per side - * @param minHeight is the minimum altitude on the ground - * @param maxHeight is the maximum altitude on the ground - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param onReady is a callback function that will be called once the mesh is built (the height map download can last some time) - * @param alphaFilter will filter any data where the alpha channel is below this value, defaults 0 (all data visible) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead - */ - static CreateGroundFromHeightMap(name69, url, width, height, subdivisions, minHeight, maxHeight, scene, updatable, onReady, alphaFilter) { - throw new Error("Import MeshBuilder to populate this function"); + /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */ + get manualUpdateOfWorldMatrixInstancedBuffer() { + return this._instanceDataStorage.manualUpdate; } - /** - * Creates a tube mesh. - * The tube is a parametric shape. - * It has no predefined shape. Its final shape will depend on the input parameters. - * - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param - * @param name defines the name of the mesh to create - * @param path is a required array of successive Vector3. It is the curve used as the axis of the tube - * @param radius sets the tube radius size - * @param tessellation is the number of sides on the tubular surface - * @param radiusFunction is a custom function. If it is not null, it overrides the parameter `radius`. This function is called on each point of the tube path and is passed the index `i` of the i-th point and the distance of this point from the first point of the path - * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL - * @param scene defines the hosting scene - * @param updatable defines if the mesh must be flagged as updatable - * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) - * @param instance is an instance of an existing Tube object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#tube) - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead - */ - static CreateTube(name69, path, radius, tessellation, radiusFunction, cap, scene, updatable, sideOrientation, instance) { - throw new Error("Import MeshBuilder to populate this function"); + set manualUpdateOfWorldMatrixInstancedBuffer(value) { + this._instanceDataStorage.manualUpdate = value; } - /** - * Creates a polyhedron mesh. - *. - * * The parameter `type` (positive integer, max 14, default 0) sets the polyhedron type to build among the 15 embedded types. Please refer to the type sheet in the tutorial to choose the wanted type - * * The parameter `size` (positive float, default 1) sets the polygon size - * * You can overwrite the `size` on each dimension bu using the parameters `sizeX`, `sizeY` or `sizeZ` (positive floats, default to `size` value) - * * You can build other polyhedron types than the 15 embbeded ones by setting the parameter `custom` (`polyhedronObject`, default null). If you set the parameter `custom`, this overwrittes the parameter `type` - * * A `polyhedronObject` is a formatted javascript object. You'll find a full file with pre-set polyhedra here : https://github.com/BabylonJS/Extensions/tree/master/Polyhedron - * * You can set the color and the UV of each side of the polyhedron with the parameters `faceColors` (Color4, default `(1, 1, 1, 1)`) and faceUV (Vector4, default `(0, 0, 1, 1)`) - * * To understand how to set `faceUV` or `faceColors`, please read this by considering the right number of faces of your polyhedron, instead of only 6 for the box : https://doc.babylonjs.com/features/featuresDeepDive/materials/using/texturePerBoxFace - * * The parameter `flat` (boolean, default true). If set to false, it gives the polyhedron a single global face, so less vertices and shared normals. In this case, `faceColors` and `faceUV` are ignored - * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation - * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created - * @param name defines the name of the mesh to create - * @param options defines the options used to create the mesh - * @param scene defines the hosting scene - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead - */ - static CreatePolyhedron(name69, options, scene) { - throw new Error("Import MeshBuilder to populate this function"); + /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */ + get manualUpdateOfPreviousWorldMatrixInstancedBuffer() { + return this._instanceDataStorage.previousManualUpdate; } - /** - * Creates a sphere based upon an icosahedron with 20 triangular faces which can be subdivided - * * The parameter `radius` sets the radius size (float) of the icosphere (default 1) - * * You can set some different icosphere dimensions, for instance to build an ellipsoid, by using the parameters `radiusX`, `radiusY` and `radiusZ` (all by default have the same value than `radius`) - * * The parameter `subdivisions` sets the number of subdivisions (positive integer, default 4). The more subdivisions, the more faces on the icosphere whatever its size - * * The parameter `flat` (boolean, default true) gives each side its own normals. Set it to false to get a smooth continuous light reflection on the surface - * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE - * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation - * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created - * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/polyhedra#icosphere - * @param name defines the name of the mesh - * @param options defines the options used to create the mesh - * @param scene defines the hosting scene - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead - */ - static CreateIcoSphere(name69, options, scene) { - throw new Error("Import MeshBuilder to populate this function"); + set manualUpdateOfPreviousWorldMatrixInstancedBuffer(value) { + this._instanceDataStorage.previousManualUpdate = value; } - /** - * Creates a decal mesh. - *. - * A decal is a mesh usually applied as a model onto the surface of another mesh - * @param name defines the name of the mesh - * @param sourceMesh defines the mesh receiving the decal - * @param position sets the position of the decal in world coordinates - * @param normal sets the normal of the mesh where the decal is applied onto in world coordinates - * @param size sets the decal scaling - * @param angle sets the angle to rotate the decal - * @returns a new Mesh - * @deprecated Please use MeshBuilder instead - */ - static CreateDecal(name69, sourceMesh, position, normal, size, angle) { - throw new Error("Import MeshBuilder to populate this function"); + /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices must be performed in all cases (and notably even in frozen mode) */ + get forceWorldMatrixInstancedBufferUpdate() { + return this._instanceDataStorage.forceMatrixUpdates; } - /** Creates a Capsule Mesh - * @param name defines the name of the mesh. - * @param options the constructors options used to shape the mesh. - * @param scene defines the scene the mesh is scoped to. - * @returns the capsule mesh - * @see https://doc.babylonjs.com/how_to/capsule_shape - * @deprecated Please use MeshBuilder instead - */ - static CreateCapsule(name69, options, scene) { - throw new Error("Import MeshBuilder to populate this function"); + set forceWorldMatrixInstancedBufferUpdate(value) { + this._instanceDataStorage.forceMatrixUpdates = value; } /** - * Extends a mesh to a Goldberg mesh - * Warning the mesh to convert MUST be an import of a perviously exported Goldberg mesh - * @param mesh the mesh to convert - * @returns the extended mesh - * @deprecated Please use ExtendMeshToGoldberg instead + * @constructor + * @param name The value used by scene.getMeshByName() to do a lookup. + * @param scene The scene to add this mesh to. + * @param parent The parent of this mesh, if it has one + * @param source An optional Mesh from which geometry is shared, cloned. + * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False. + * When false, achieved by calling a clone(), also passing False. + * This will make creation of children, recursive. + * @param clonePhysicsImpostor When cloning, include cloning mesh physics impostor, default True. */ - static ExtendToGoldberg(mesh) { - throw new Error("Import MeshBuilder to populate this function"); + constructor(name69, scene = null, parent = null, source = null, doNotCloneChildren, clonePhysicsImpostor = true) { + super(name69, scene); + this._internalMeshDataInfo = new _InternalMeshDataInfo(); + this.delayLoadState = 0; + this.instances = []; + this._creationDataStorage = null; + this._geometry = null; + this._instanceDataStorage = new _InstanceDataStorage(); + this._thinInstanceDataStorage = new _ThinInstanceDataStorage(); + this._shouldGenerateFlatShading = false; + this._originalBuilderSideOrientation = _Mesh.DEFAULTSIDE; + this.overrideMaterialSideOrientation = null; + this.ignoreCameraMaxZ = false; + scene = this.getScene(); + this._onBeforeDraw = (isInstance, world, effectiveMaterial) => { + if (isInstance && effectiveMaterial) { + if (this._uniformBuffer) { + this.transferToEffect(world); + } else { + effectiveMaterial.bindOnlyWorldMatrix(world); + } + } + }; + if (source) { + if (source._geometry) { + source._geometry.applyToMesh(this); + } + DeepCopier.DeepCopy(source, this, [ + "name", + "material", + "skeleton", + "instances", + "parent", + "uniqueId", + "source", + "metadata", + "morphTargetManager", + "hasInstances", + "worldMatrixInstancedBuffer", + "previousWorldMatrixInstancedBuffer", + "hasLODLevels", + "geometry", + "isBlocked", + "areNormalsFrozen", + "facetNb", + "isFacetDataEnabled", + "lightSources", + "useBones", + "isAnInstance", + "collider", + "edgesRenderer", + "forward", + "up", + "right", + "absolutePosition", + "absoluteScaling", + "absoluteRotationQuaternion", + "isWorldMatrixFrozen", + "nonUniformScaling", + "behaviors", + "worldMatrixFromCache", + "hasThinInstances", + "cloneMeshMap", + "hasBoundingInfo", + "physicsBody", + "physicsImpostor" + ], ["_poseMatrix"]); + this._internalMeshDataInfo._source = source; + if (scene.useClonedMeshMap) { + if (!source._internalMeshDataInfo.meshMap) { + source._internalMeshDataInfo.meshMap = {}; + } + source._internalMeshDataInfo.meshMap[this.uniqueId] = this; + } + this._originalBuilderSideOrientation = source._originalBuilderSideOrientation; + this._creationDataStorage = source._creationDataStorage; + if (source._ranges) { + const ranges = source._ranges; + for (const name70 in ranges) { + if (!Object.prototype.hasOwnProperty.call(ranges, name70)) { + continue; + } + if (!ranges[name70]) { + continue; + } + this.createAnimationRange(name70, ranges[name70].from, ranges[name70].to); + } + } + if (source.metadata && source.metadata.clone) { + this.metadata = source.metadata.clone(); + } else { + this.metadata = source.metadata; + } + this._internalMetadata = source._internalMetadata; + if (Tags && Tags.HasTags(source)) { + Tags.AddTagsTo(this, Tags.GetTags(source, true)); + } + this.setEnabled(source.isEnabled(false)); + this.parent = source.parent; + this.setPivotMatrix(source.getPivotMatrix(), this._postMultiplyPivotMatrix); + this.id = name69 + "." + source.id; + this.material = source.material; + if (!doNotCloneChildren) { + const directDescendants = source.getDescendants(true); + for (let index = 0; index < directDescendants.length; index++) { + const child = directDescendants[index]; + if (child.clone) { + child.clone(name69 + "." + child.name, this); + } + } + } + if (source.morphTargetManager) { + this.morphTargetManager = source.morphTargetManager; + } + if (scene.getPhysicsEngine) { + const physicsEngine = scene.getPhysicsEngine(); + if (clonePhysicsImpostor && physicsEngine) { + if (physicsEngine.getPluginVersion() === 1) { + const impostor = physicsEngine.getImpostorForPhysicsObject(source); + if (impostor) { + this.physicsImpostor = impostor.clone(this); + } + } else if (physicsEngine.getPluginVersion() === 2) { + if (source.physicsBody) { + source.physicsBody.clone(this); + } + } + } + } + for (let index = 0; index < scene.particleSystems.length; index++) { + const system = scene.particleSystems[index]; + if (system.emitter === source) { + system.clone(system.name, this); + } + } + this.skeleton = source.skeleton; + this.refreshBoundingInfo(true, true); + this.computeWorldMatrix(true); + } + if (parent !== null) { + this.parent = parent; + } + this._instanceDataStorage.hardwareInstancedRendering = this.getEngine().getCaps().instancedArrays; + this._internalMeshDataInfo._onMeshReadyObserverAdded = (observer2) => { + observer2.unregisterOnNextCall = true; + if (this.isReady(true)) { + this.onMeshReadyObservable.notifyObservers(this); + } else { + if (!this._internalMeshDataInfo._checkReadinessObserver) { + this._internalMeshDataInfo._checkReadinessObserver = this._scene.onBeforeRenderObservable.add(() => { + if (this.isReady(true)) { + this._scene.onBeforeRenderObservable.remove(this._internalMeshDataInfo._checkReadinessObserver); + this._internalMeshDataInfo._checkReadinessObserver = null; + this.onMeshReadyObservable.notifyObservers(this); + } + }); + } + } + }; + this.onMeshReadyObservable = new Observable(this._internalMeshDataInfo._onMeshReadyObserverAdded); + if (source) { + source.onClonedObservable.notifyObservers(this); + } } -}; -Mesh.FRONTSIDE = VertexData.FRONTSIDE; -Mesh.BACKSIDE = VertexData.BACKSIDE; -Mesh.DOUBLESIDE = VertexData.DOUBLESIDE; -Mesh.DEFAULTSIDE = VertexData.DEFAULTSIDE; -Mesh.NO_CAP = 0; -Mesh.CAP_START = 1; -Mesh.CAP_END = 2; -Mesh.CAP_ALL = 3; -Mesh.NO_FLIP = 0; -Mesh.FLIP_TILE = 1; -Mesh.ROTATE_TILE = 2; -Mesh.FLIP_ROW = 3; -Mesh.ROTATE_ROW = 4; -Mesh.FLIP_N_ROTATE_TILE = 5; -Mesh.FLIP_N_ROTATE_ROW = 6; -Mesh.CENTER = 0; -Mesh.LEFT = 1; -Mesh.RIGHT = 2; -Mesh.TOP = 3; -Mesh.BOTTOM = 4; -Mesh.INSTANCEDMESH_SORT_TRANSPARENT = false; -Mesh._GroundMeshParser = (parsedMesh, scene) => { - throw _WarnImport("GroundMesh"); -}; -Mesh._GoldbergMeshParser = (parsedMesh, scene) => { - throw _WarnImport("GoldbergMesh"); -}; -Mesh._LinesMeshParser = (parsedMesh, scene) => { - throw _WarnImport("LinesMesh"); -}; -Mesh._GreasedLineMeshParser = (parsedMesh, scene) => { - throw _WarnImport("GreasedLineMesh"); -}; -Mesh._GreasedLineRibbonMeshParser = (parsedMesh, scene) => { - throw _WarnImport("GreasedLineRibbonMesh"); -}; -Mesh._TrailMeshParser = (parsedMesh, scene) => { - throw _WarnImport("TrailMesh"); -}; -RegisterClass("BABYLON.Mesh", Mesh); - -// node_modules/@babylonjs/core/Lights/light.js -var Light = class _Light extends Node { - /** - * Defines how far from the source the light is impacting in scene units. - * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff. - */ - get range() { - return this._range; + instantiateHierarchy(newParent = null, options, onNewNodeCreated) { + const instance = this.getTotalVertices() === 0 || options && options.doNotInstantiate && (options.doNotInstantiate === true || options.doNotInstantiate(this)) ? this.clone("Clone of " + (this.name || this.id), newParent || this.parent, true) : this.createInstance("instance of " + (this.name || this.id)); + instance.parent = newParent || this.parent; + instance.position = this.position.clone(); + instance.scaling = this.scaling.clone(); + if (this.rotationQuaternion) { + instance.rotationQuaternion = this.rotationQuaternion.clone(); + } else { + instance.rotation = this.rotation.clone(); + } + if (onNewNodeCreated) { + onNewNodeCreated(this, instance); + } + for (const child of this.getChildTransformNodes(true)) { + if (child.getClassName() === "InstancedMesh" && instance.getClassName() === "Mesh" && child.sourceMesh === this) { + child.instantiateHierarchy(instance, { + doNotInstantiate: options && options.doNotInstantiate || false, + newSourcedMesh: instance + }, onNewNodeCreated); + } else { + child.instantiateHierarchy(instance, options, onNewNodeCreated); + } + } + return instance; } /** - * Defines how far from the source the light is impacting in scene units. - * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff. + * Gets the class name + * @returns the string "Mesh". */ - set range(value) { - this._range = value; - this._inverseSquaredRange = 1 / (this.range * this.range); + getClassName() { + return "Mesh"; } - /** - * Gets the photometric scale used to interpret the intensity. - * This is only relevant with PBR Materials where the light intensity can be defined in a physical way. - */ - get intensityMode() { - return this._intensityMode; + /** @internal */ + get _isMesh() { + return true; } /** - * Sets the photometric scale used to interpret the intensity. - * This is only relevant with PBR Materials where the light intensity can be defined in a physical way. + * Returns a description of this mesh + * @param fullDetails define if full details about this mesh must be used + * @returns a descriptive string representing this mesh */ - set intensityMode(value) { - this._intensityMode = value; - this._computePhotometricScale(); + toString(fullDetails) { + let ret = super.toString(fullDetails); + ret += ", n vertices: " + this.getTotalVertices(); + ret += ", parent: " + (this._waitingParentId ? this._waitingParentId : this.parent ? this.parent.name : "NONE"); + if (this.animations) { + for (let i = 0; i < this.animations.length; i++) { + ret += ", animation[0]: " + this.animations[i].toString(fullDetails); + } + } + if (fullDetails) { + if (this._geometry) { + const ib = this.getIndices(); + const vb = this.getVerticesData(VertexBuffer.PositionKind); + if (vb && ib) { + ret += ", flat shading: " + (vb.length / 3 === ib.length ? "YES" : "NO"); + } + } else { + ret += ", flat shading: UNKNOWN"; + } + } + return ret; } - /** - * Gets the light radius used by PBR Materials to simulate soft area lights. - */ - get radius() { - return this._radius; + /** @internal */ + _unBindEffect() { + super._unBindEffect(); + for (const instance of this.instances) { + instance._unBindEffect(); + } } /** - * sets the light radius used by PBR Materials to simulate soft area lights. + * Gets a boolean indicating if this mesh has LOD */ - set radius(value) { - this._radius = value; - this._computePhotometricScale(); + get hasLODLevels() { + return this._internalMeshDataInfo._LODLevels.length > 0; } /** - * Gets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching - * the current shadow generator. + * Gets the list of MeshLODLevel associated with the current mesh + * @returns an array of MeshLODLevel */ - get shadowEnabled() { - return this._shadowEnabled; + getLODLevels() { + return this._internalMeshDataInfo._LODLevels; } - /** - * Sets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching - * the current shadow generator. - */ - set shadowEnabled(value) { - if (this._shadowEnabled === value) { - return; - } - this._shadowEnabled = value; - this._markMeshesAsLightDirty(); + _sortLODLevels() { + const sortingOrderFactor = this._internalMeshDataInfo._useLODScreenCoverage ? -1 : 1; + this._internalMeshDataInfo._LODLevels.sort((a, b) => { + if (a.distanceOrScreenCoverage < b.distanceOrScreenCoverage) { + return sortingOrderFactor; + } + if (a.distanceOrScreenCoverage > b.distanceOrScreenCoverage) { + return -sortingOrderFactor; + } + return 0; + }); } /** - * Gets the only meshes impacted by this light. + * Add a mesh as LOD level triggered at the given distance. + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD + * @param distanceOrScreenCoverage Either distance from the center of the object to show this level or the screen coverage if `useScreenCoverage` is set to `true`. + * If screen coverage, value is a fraction of the screen's total surface, between 0 and 1. + * Example Playground for distance https://playground.babylonjs.com/#QE7KM#197 + * Example Playground for screen coverage https://playground.babylonjs.com/#QE7KM#196 + * @param mesh The mesh to be added as LOD level (can be null) + * @returns This mesh (for chaining) */ - get includedOnlyMeshes() { - return this._includedOnlyMeshes; - } - /** - * Sets the only meshes impacted by this light. - */ - set includedOnlyMeshes(value) { - this._includedOnlyMeshes = value; - this._hookArrayForIncludedOnly(value); + addLODLevel(distanceOrScreenCoverage, mesh) { + if (mesh && mesh._masterMesh) { + Logger.Warn("You cannot use a mesh as LOD level twice"); + return this; + } + const level = new MeshLODLevel(distanceOrScreenCoverage, mesh); + this._internalMeshDataInfo._LODLevels.push(level); + if (mesh) { + mesh._masterMesh = this; + } + this._sortLODLevels(); + return this; } /** - * Gets the meshes not impacted by this light. + * Returns the LOD level mesh at the passed distance or null if not found. + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD + * @param distance The distance from the center of the object to show this level + * @returns a Mesh or `null` */ - get excludedMeshes() { - return this._excludedMeshes; + getLODLevelAtDistance(distance) { + const internalDataInfo = this._internalMeshDataInfo; + for (let index = 0; index < internalDataInfo._LODLevels.length; index++) { + const level = internalDataInfo._LODLevels[index]; + if (level.distanceOrScreenCoverage === distance) { + return level.mesh; + } + } + return null; } /** - * Sets the meshes not impacted by this light. + * Remove a mesh from the LOD array + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD + * @param mesh defines the mesh to be removed + * @returns This mesh (for chaining) */ - set excludedMeshes(value) { - this._excludedMeshes = value; - this._hookArrayForExcluded(value); + removeLODLevel(mesh) { + const internalDataInfo = this._internalMeshDataInfo; + for (let index = 0; index < internalDataInfo._LODLevels.length; index++) { + if (internalDataInfo._LODLevels[index].mesh === mesh) { + internalDataInfo._LODLevels.splice(index, 1); + if (mesh) { + mesh._masterMesh = null; + } + } + } + this._sortLODLevels(); + return this; } /** - * Gets the layer id use to find what meshes are not impacted by the light. - * Inactive if 0 + * Returns the registered LOD mesh distant from the parameter `camera` position if any, else returns the current mesh. + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD + * @param camera defines the camera to use to compute distance + * @param boundingSphere defines a custom bounding sphere to use instead of the one from this mesh + * @returns This mesh (for chaining) */ - get excludeWithLayerMask() { - return this._excludeWithLayerMask; + getLOD(camera, boundingSphere) { + const internalDataInfo = this._internalMeshDataInfo; + if (!internalDataInfo._LODLevels || internalDataInfo._LODLevels.length === 0) { + return this; + } + const bSphere = boundingSphere || this.getBoundingInfo().boundingSphere; + const distanceToCamera = camera.mode === Camera.ORTHOGRAPHIC_CAMERA ? camera.minZ : bSphere.centerWorld.subtract(camera.globalPosition).length(); + let compareValue = distanceToCamera; + let compareSign = 1; + if (internalDataInfo._useLODScreenCoverage) { + const screenArea = camera.screenArea; + let meshArea = bSphere.radiusWorld * camera.minZ / distanceToCamera; + meshArea = meshArea * meshArea * Math.PI; + compareValue = meshArea / screenArea; + compareSign = -1; + } + if (compareSign * internalDataInfo._LODLevels[internalDataInfo._LODLevels.length - 1].distanceOrScreenCoverage > compareSign * compareValue) { + if (this.onLODLevelSelection) { + this.onLODLevelSelection(compareValue, this, this); + } + return this; + } + for (let index = 0; index < internalDataInfo._LODLevels.length; index++) { + const level = internalDataInfo._LODLevels[index]; + if (compareSign * level.distanceOrScreenCoverage < compareSign * compareValue) { + if (level.mesh) { + if (level.mesh.delayLoadState === 4) { + level.mesh._checkDelayState(); + return this; + } + if (level.mesh.delayLoadState === 2) { + return this; + } + level.mesh._preActivate(); + level.mesh._updateSubMeshesBoundingInfo(this.worldMatrixFromCache); + } + if (this.onLODLevelSelection) { + this.onLODLevelSelection(compareValue, this, level.mesh); + } + return level.mesh; + } + } + if (this.onLODLevelSelection) { + this.onLODLevelSelection(compareValue, this, this); + } + return this; } /** - * Sets the layer id use to find what meshes are not impacted by the light. - * Inactive if 0 + * Gets the mesh internal Geometry object */ - set excludeWithLayerMask(value) { - this._excludeWithLayerMask = value; - this._resyncMeshes(); + get geometry() { + return this._geometry; } /** - * Gets the layer id use to find what meshes are impacted by the light. - * Inactive if 0 + * Returns the total number of vertices within the mesh geometry or zero if the mesh has no geometry. + * @returns the total number of vertices */ - get includeOnlyWithLayerMask() { - return this._includeOnlyWithLayerMask; + getTotalVertices() { + if (this._geometry === null || this._geometry === void 0) { + return 0; + } + return this._geometry.getTotalVertices(); } /** - * Sets the layer id use to find what meshes are impacted by the light. - * Inactive if 0 + * Returns the content of an associated vertex buffer + * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values : + * - VertexBuffer.PositionKind + * - VertexBuffer.UVKind + * - VertexBuffer.UV2Kind + * - VertexBuffer.UV3Kind + * - VertexBuffer.UV4Kind + * - VertexBuffer.UV5Kind + * - VertexBuffer.UV6Kind + * - VertexBuffer.ColorKind + * - VertexBuffer.MatricesIndicesKind + * - VertexBuffer.MatricesIndicesExtraKind + * - VertexBuffer.MatricesWeightsKind + * - VertexBuffer.MatricesWeightsExtraKind + * @param copyWhenShared defines a boolean indicating that if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one + * @param forceCopy defines a boolean forcing the copy of the buffer no matter what the value of copyWhenShared is + * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false + * @returns a FloatArray or null if the mesh has no geometry or no vertex buffer for this kind. */ - set includeOnlyWithLayerMask(value) { - this._includeOnlyWithLayerMask = value; - this._resyncMeshes(); + getVerticesData(kind, copyWhenShared, forceCopy, bypassInstanceData) { + var _a, _b; + if (!this._geometry) { + return null; + } + let data = bypassInstanceData ? void 0 : (_b = (_a = this._userInstancedBuffersStorage) == null ? void 0 : _a.vertexBuffers[kind]) == null ? void 0 : _b.getFloatData( + this.instances.length + 1, + // +1 because the master mesh is not included in the instances array + forceCopy || copyWhenShared && this._geometry.meshes.length !== 1 + ); + if (!data) { + data = this._geometry.getVerticesData(kind, copyWhenShared, forceCopy); + } + return data; } /** - * Gets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x) + * Returns the mesh VertexBuffer object from the requested `kind` + * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values : + * - VertexBuffer.PositionKind + * - VertexBuffer.NormalKind + * - VertexBuffer.UVKind + * - VertexBuffer.UV2Kind + * - VertexBuffer.UV3Kind + * - VertexBuffer.UV4Kind + * - VertexBuffer.UV5Kind + * - VertexBuffer.UV6Kind + * - VertexBuffer.ColorKind + * - VertexBuffer.MatricesIndicesKind + * - VertexBuffer.MatricesIndicesExtraKind + * - VertexBuffer.MatricesWeightsKind + * - VertexBuffer.MatricesWeightsExtraKind + * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false + * @returns a FloatArray or null if the mesh has no vertex buffer for this kind. */ - get lightmapMode() { - return this._lightmapMode; + getVertexBuffer(kind, bypassInstanceData) { + var _a; + if (!this._geometry) { + return null; + } + return (bypassInstanceData ? void 0 : (_a = this._userInstancedBuffersStorage) == null ? void 0 : _a.vertexBuffers[kind]) ?? this._geometry.getVertexBuffer(kind); } /** - * Sets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x) + * Tests if a specific vertex buffer is associated with this mesh + * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values : + * - VertexBuffer.PositionKind + * - VertexBuffer.NormalKind + * - VertexBuffer.UVKind + * - VertexBuffer.UV2Kind + * - VertexBuffer.UV3Kind + * - VertexBuffer.UV4Kind + * - VertexBuffer.UV5Kind + * - VertexBuffer.UV6Kind + * - VertexBuffer.ColorKind + * - VertexBuffer.MatricesIndicesKind + * - VertexBuffer.MatricesIndicesExtraKind + * - VertexBuffer.MatricesWeightsKind + * - VertexBuffer.MatricesWeightsExtraKind + * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false + * @returns a boolean */ - set lightmapMode(value) { - if (this._lightmapMode === value) { - return; + isVerticesDataPresent(kind, bypassInstanceData) { + var _a; + if (!this._geometry) { + if (this._delayInfo) { + return this._delayInfo.indexOf(kind) !== -1; + } + return false; } - this._lightmapMode = value; - this._markMeshesAsLightDirty(); + return !bypassInstanceData && ((_a = this._userInstancedBuffersStorage) == null ? void 0 : _a.vertexBuffers[kind]) !== void 0 || this._geometry.isVerticesDataPresent(kind); } /** - * Returns the view matrix. - * @param _faceIndex The index of the face for which we want to extract the view matrix. Only used for point light types. - * @returns The view matrix. Can be null, if a view matrix cannot be defined for the type of light considered (as for a hemispherical light, for example). + * Returns a boolean defining if the vertex data for the requested `kind` is updatable. + * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values : + * - VertexBuffer.PositionKind + * - VertexBuffer.UVKind + * - VertexBuffer.UV2Kind + * - VertexBuffer.UV3Kind + * - VertexBuffer.UV4Kind + * - VertexBuffer.UV5Kind + * - VertexBuffer.UV6Kind + * - VertexBuffer.ColorKind + * - VertexBuffer.MatricesIndicesKind + * - VertexBuffer.MatricesIndicesExtraKind + * - VertexBuffer.MatricesWeightsKind + * - VertexBuffer.MatricesWeightsExtraKind + * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false + * @returns a boolean */ - getViewMatrix(_faceIndex) { - return null; + isVertexBufferUpdatable(kind, bypassInstanceData) { + var _a; + if (!this._geometry) { + if (this._delayInfo) { + return this._delayInfo.indexOf(kind) !== -1; + } + return false; + } + if (!bypassInstanceData) { + const buffer = (_a = this._userInstancedBuffersStorage) == null ? void 0 : _a.vertexBuffers[kind]; + if (buffer) { + return buffer.isUpdatable(); + } + } + return this._geometry.isVertexBufferUpdatable(kind); } /** - * Returns the projection matrix. - * Note that viewMatrix and renderList are optional and are only used by lights that calculate the projection matrix from a list of meshes (e.g. directional lights with automatic extents calculation). - * @param _viewMatrix The view transform matrix of the light (optional). - * @param _renderList The list of meshes to take into account when calculating the projection matrix (optional). - * @returns The projection matrix. Can be null, if a projection matrix cannot be defined for the type of light considered (as for a hemispherical light, for example). + * Returns a string which contains the list of existing `kinds` of Vertex Data associated with this mesh. + * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false + * @returns an array of strings */ - getProjectionMatrix(_viewMatrix, _renderList) { - return null; + getVerticesDataKinds(bypassInstanceData) { + if (!this._geometry) { + const result = []; + if (this._delayInfo) { + this._delayInfo.forEach(function(kind) { + result.push(kind); + }); + } + return result; + } + const kinds = this._geometry.getVerticesDataKinds(); + if (!bypassInstanceData && this._userInstancedBuffersStorage) { + for (const kind in this._userInstancedBuffersStorage.vertexBuffers) { + if (kinds.indexOf(kind) === -1) { + kinds.push(kind); + } + } + } + return kinds; } /** - * Creates a Light object in the scene. - * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction - * @param name The friendly name of the light - * @param scene The scene the light belongs too + * Returns a positive integer : the total number of indices in this mesh geometry. + * @returns the numner of indices or zero if the mesh has no geometry. */ - constructor(name69, scene) { - super(name69, scene); - this.diffuse = new Color3(1, 1, 1); - this.specular = new Color3(1, 1, 1); - this.falloffType = _Light.FALLOFF_DEFAULT; - this.intensity = 1; - this._range = Number.MAX_VALUE; - this._inverseSquaredRange = 0; - this._photometricScale = 1; - this._intensityMode = _Light.INTENSITYMODE_AUTOMATIC; - this._radius = 1e-5; - this.renderPriority = 0; - this._shadowEnabled = true; - this._excludeWithLayerMask = 0; - this._includeOnlyWithLayerMask = 0; - this._lightmapMode = 0; - this._shadowGenerators = null; - this._excludedMeshesIds = new Array(); - this._includedOnlyMeshesIds = new Array(); - this._isLight = true; - this.getScene().addLight(this); - this._uniformBuffer = new UniformBuffer(this.getScene().getEngine(), void 0, void 0, name69); - this._buildUniformLayout(); - this.includedOnlyMeshes = []; - this.excludedMeshes = []; - this._resyncMeshes(); + getTotalIndices() { + if (!this._geometry) { + return 0; + } + return this._geometry.getTotalIndices(); } /** - * Sets the passed Effect "effect" with the Light textures. - * @param effect The effect to update - * @param lightIndex The index of the light in the effect to update - * @returns The light + * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices. + * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one. + * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it + * @returns the indices array or an empty array if the mesh has no geometry */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - transferTexturesToEffect(effect, lightIndex) { - return this; + getIndices(copyWhenShared, forceCopy) { + if (!this._geometry) { + return []; + } + return this._geometry.getIndices(copyWhenShared, forceCopy); + } + get isBlocked() { + return this._masterMesh !== null && this._masterMesh !== void 0; } /** - * Binds the lights information from the scene to the effect for the given mesh. - * @param lightIndex Light index - * @param scene The scene where the light belongs to - * @param effect The effect we are binding the data to - * @param useSpecular Defines if specular is supported - * @param receiveShadows Defines if the effect (mesh) we bind the light for receives shadows + * Determine if the current mesh is ready to be rendered + * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default) + * @param forceInstanceSupport will check if the mesh will be ready when used with instances (false by default) + * @returns true if all associated assets are ready (material, textures, shaders) */ - _bindLight(lightIndex, scene, effect, useSpecular, receiveShadows = true) { - const iAsString = lightIndex.toString(); - let needUpdate = false; - this._uniformBuffer.bindToEffect(effect, "Light" + iAsString); - if (this._renderId !== scene.getRenderId() || this._lastUseSpecular !== useSpecular || !this._uniformBuffer.useUbo) { - this._renderId = scene.getRenderId(); - this._lastUseSpecular = useSpecular; - const scaledIntensity = this.getScaledIntensity(); - this.transferToEffect(effect, iAsString); - this.diffuse.scaleToRef(scaledIntensity, TmpColors.Color3[0]); - this._uniformBuffer.updateColor4("vLightDiffuse", TmpColors.Color3[0], this.range, iAsString); - if (useSpecular) { - this.specular.scaleToRef(scaledIntensity, TmpColors.Color3[1]); - this._uniformBuffer.updateColor4("vLightSpecular", TmpColors.Color3[1], this.radius, iAsString); + isReady(completeCheck = false, forceInstanceSupport = false) { + var _a, _b, _c, _d, _e; + if (this.delayLoadState === 2) { + return false; + } + if (!super.isReady(completeCheck)) { + return false; + } + if (!this.subMeshes || this.subMeshes.length === 0) { + return true; + } + if (!completeCheck) { + return true; + } + const engine = this.getEngine(); + const scene = this.getScene(); + const hardwareInstancedRendering = forceInstanceSupport || engine.getCaps().instancedArrays && (this.instances.length > 0 || this.hasThinInstances); + this.computeWorldMatrix(); + const mat = this.material || scene.defaultMaterial; + if (mat) { + if (mat._storeEffectOnSubMeshes) { + for (const subMesh of this.subMeshes) { + const effectiveMaterial = subMesh.getMaterial(); + if (effectiveMaterial) { + if (effectiveMaterial._storeEffectOnSubMeshes) { + if (!effectiveMaterial.isReadyForSubMesh(this, subMesh, hardwareInstancedRendering)) { + return false; + } + } else { + if (!effectiveMaterial.isReady(this, hardwareInstancedRendering)) { + return false; + } + } + } + } + } else { + if (!mat.isReady(this, hardwareInstancedRendering)) { + return false; + } } - needUpdate = true; } - this.transferTexturesToEffect(effect, iAsString); - if (scene.shadowsEnabled && this.shadowEnabled && receiveShadows) { - const shadowGenerator = this.getShadowGenerator(scene.activeCamera) ?? this.getShadowGenerator(); - if (shadowGenerator) { - shadowGenerator.bindShadowLight(iAsString, effect); - needUpdate = true; + const currentRenderPassId = engine.currentRenderPassId; + for (const light of this.lightSources) { + const generators = light.getShadowGenerators(); + if (!generators) { + continue; + } + const iterator = generators.values(); + for (let key = iterator.next(); key.done !== true; key = iterator.next()) { + const generator = key.value; + if (generator && (!((_a = generator.getShadowMap()) == null ? void 0 : _a.renderList) || ((_b = generator.getShadowMap()) == null ? void 0 : _b.renderList) && ((_d = (_c = generator.getShadowMap()) == null ? void 0 : _c.renderList) == null ? void 0 : _d.indexOf(this)) !== -1)) { + const shadowMap = generator.getShadowMap(); + const renderPassIds = shadowMap.renderPassIds ?? [engine.currentRenderPassId]; + for (let p = 0; p < renderPassIds.length; ++p) { + engine.currentRenderPassId = renderPassIds[p]; + for (const subMesh of this.subMeshes) { + if (!generator.isReady(subMesh, hardwareInstancedRendering, ((_e = subMesh.getMaterial()) == null ? void 0 : _e.needAlphaBlendingForMesh(this)) ?? false)) { + engine.currentRenderPassId = currentRenderPassId; + return false; + } + } + } + engine.currentRenderPassId = currentRenderPassId; + } } } - if (needUpdate) { - this._uniformBuffer.update(); - } else { - this._uniformBuffer.bindUniformBuffer(); + for (const lod of this._internalMeshDataInfo._LODLevels) { + if (lod.mesh && !lod.mesh.isReady(hardwareInstancedRendering)) { + return false; + } } + return true; } /** - * Returns the string "Light". - * @returns the class name + * Gets a boolean indicating if the normals aren't to be recomputed on next mesh `positions` array update. This property is pertinent only for updatable parametric shapes. */ - getClassName() { - return "Light"; + get areNormalsFrozen() { + return this._internalMeshDataInfo._areNormalsFrozen; } /** - * Converts the light information to a readable string for debug purpose. - * @param fullDetails Supports for multiple levels of logging within scene loading - * @returns the human readable light info + * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It prevents the mesh normals from being recomputed on next `positions` array update. + * @returns the current mesh */ - toString(fullDetails) { - let ret = "Name: " + this.name; - ret += ", type: " + ["Point", "Directional", "Spot", "Hemispheric"][this.getTypeID()]; - if (this.animations) { - for (let i = 0; i < this.animations.length; i++) { - ret += ", animation[0]: " + this.animations[i].toString(fullDetails); - } - } - return ret; - } - /** @internal */ - _syncParentEnabledState() { - super._syncParentEnabledState(); - if (!this.isDisposed()) { - this._resyncMeshes(); - } + freezeNormals() { + this._internalMeshDataInfo._areNormalsFrozen = true; + return this; } /** - * Set the enabled state of this node. - * @param value - the new enabled state + * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It reactivates the mesh normals computation if it was previously frozen + * @returns the current mesh */ - setEnabled(value) { - super.setEnabled(value); - this._resyncMeshes(); + unfreezeNormals() { + this._internalMeshDataInfo._areNormalsFrozen = false; + return this; } /** - * Returns the Light associated shadow generator if any. - * @param camera Camera for which the shadow generator should be retrieved (default: null). If null, retrieves the default shadow generator - * @returns the associated shadow generator. + * Sets a value overriding the instance count. Only applicable when custom instanced InterleavedVertexBuffer are used rather than InstancedMeshs */ - getShadowGenerator(camera = null) { - if (this._shadowGenerators === null) { - return null; + set overridenInstanceCount(count) { + this._instanceDataStorage.overridenInstanceCount = count; + } + // Methods + /** @internal */ + _preActivate() { + const internalDataInfo = this._internalMeshDataInfo; + const sceneRenderId = this.getScene().getRenderId(); + if (internalDataInfo._preActivateId === sceneRenderId) { + return this; } - return this._shadowGenerators.get(camera) ?? null; + internalDataInfo._preActivateId = sceneRenderId; + this._instanceDataStorage.visibleInstances = null; + return this; } /** - * Returns all the shadow generators associated to this light - * @returns + * @internal */ - getShadowGenerators() { - return this._shadowGenerators; - } - /** - * Returns a Vector3, the absolute light position in the World. - * @returns the world space position of the light - */ - getAbsolutePosition() { - return Vector3.Zero(); + _preActivateForIntermediateRendering(renderId) { + if (this._instanceDataStorage.visibleInstances) { + this._instanceDataStorage.visibleInstances.intermediateDefaultRenderId = renderId; + } + return this; } /** - * Specifies if the light will affect the passed mesh. - * @param mesh The mesh to test against the light - * @returns true the mesh is affected otherwise, false. + * @internal */ - canAffectMesh(mesh) { - if (!mesh) { - return true; + _registerInstanceForRenderId(instance, renderId) { + if (!this._instanceDataStorage.visibleInstances) { + this._instanceDataStorage.visibleInstances = { + defaultRenderId: renderId, + selfDefaultRenderId: this._renderId + }; } - if (this.includedOnlyMeshes && this.includedOnlyMeshes.length > 0 && this.includedOnlyMeshes.indexOf(mesh) === -1) { - return false; + if (!this._instanceDataStorage.visibleInstances[renderId]) { + if (this._instanceDataStorage.previousRenderId !== void 0 && this._instanceDataStorage.isFrozen) { + this._instanceDataStorage.visibleInstances[this._instanceDataStorage.previousRenderId] = null; + } + this._instanceDataStorage.previousRenderId = renderId; + this._instanceDataStorage.visibleInstances[renderId] = new Array(); } - if (this.excludedMeshes && this.excludedMeshes.length > 0 && this.excludedMeshes.indexOf(mesh) !== -1) { - return false; + this._instanceDataStorage.visibleInstances[renderId].push(instance); + return this; + } + _afterComputeWorldMatrix() { + super._afterComputeWorldMatrix(); + if (!this.hasThinInstances) { + return; } - if (this.includeOnlyWithLayerMask !== 0 && (this.includeOnlyWithLayerMask & mesh.layerMask) === 0) { - return false; + if (!this.doNotSyncBoundingInfo) { + this.thinInstanceRefreshBoundingInfo(false); } - if (this.excludeWithLayerMask !== 0 && this.excludeWithLayerMask & mesh.layerMask) { - return false; + } + /** @internal */ + _postActivate() { + if (this.edgesShareWithInstances && this.edgesRenderer && this.edgesRenderer.isEnabled && this._renderingGroup) { + this._renderingGroup._edgesRenderers.pushNoDuplicate(this.edgesRenderer); + this.edgesRenderer.customInstances.push(this.getWorldMatrix()); } - return true; } /** - * Releases resources associated with this node. - * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default) - * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default) + * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked. + * This means the mesh underlying bounding box and sphere are recomputed. + * @param applySkeleton defines whether to apply the skeleton before computing the bounding info + * @param applyMorph defines whether to apply the morph target before computing the bounding info + * @returns the current mesh */ - dispose(doNotRecurse, disposeMaterialAndTextures = false) { - if (this._shadowGenerators) { - const iterator = this._shadowGenerators.values(); - for (let key = iterator.next(); key.done !== true; key = iterator.next()) { - const shadowGenerator = key.value; - shadowGenerator.dispose(); - } - this._shadowGenerators = null; + refreshBoundingInfo(applySkeleton = false, applyMorph = false) { + if (this.hasBoundingInfo && this.getBoundingInfo().isLocked) { + return this; } - this.getScene().stopAnimation(this); - if (this._parentContainer) { - const index = this._parentContainer.lights.indexOf(this); - if (index > -1) { - this._parentContainer.lights.splice(index, 1); - } - this._parentContainer = null; + const bias = this.geometry ? this.geometry.boundingBias : null; + this._refreshBoundingInfo(this._getPositionData(applySkeleton, applyMorph), bias); + return this; + } + /** + * @internal + */ + _createGlobalSubMesh(force) { + const totalVertices = this.getTotalVertices(); + if (!totalVertices || !this.getIndices()) { + return null; } - for (const mesh of this.getScene().meshes) { - mesh._removeLightSource(this, true); + if (this.subMeshes && this.subMeshes.length > 0) { + const ib = this.getIndices(); + if (!ib) { + return null; + } + const totalIndices = ib.length; + let needToRecreate = false; + if (force) { + needToRecreate = true; + } else { + for (const submesh of this.subMeshes) { + if (submesh.indexStart + submesh.indexCount > totalIndices) { + needToRecreate = true; + break; + } + if (submesh.verticesStart + submesh.verticesCount > totalVertices) { + needToRecreate = true; + break; + } + } + } + if (!needToRecreate) { + return this.subMeshes[0]; + } } - this._uniformBuffer.dispose(); - this.getScene().removeLight(this); - super.dispose(doNotRecurse, disposeMaterialAndTextures); + this.releaseSubMeshes(); + return new SubMesh(0, 0, totalVertices, 0, this.getTotalIndices(), this); } /** - * Returns the light type ID (integer). - * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x + * This function will subdivide the mesh into multiple submeshes + * @param count defines the expected number of submeshes */ - getTypeID() { - return 0; + subdivide(count) { + if (count < 1) { + return; + } + const totalIndices = this.getTotalIndices(); + let subdivisionSize = totalIndices / count | 0; + let offset = 0; + while (subdivisionSize % 3 !== 0) { + subdivisionSize++; + } + this.releaseSubMeshes(); + for (let index = 0; index < count; index++) { + if (offset >= totalIndices) { + break; + } + SubMesh.CreateFromIndices(0, offset, index === count - 1 ? totalIndices - offset : subdivisionSize, this, void 0, false); + offset += subdivisionSize; + } + this.refreshBoundingInfo(); + this.synchronizeInstances(); } /** - * Returns the intensity scaled by the Photometric Scale according to the light type and intensity mode. - * @returns the scaled intensity in intensity mode unit + * Copy a FloatArray into a specific associated vertex buffer + * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values : + * - VertexBuffer.PositionKind + * - VertexBuffer.UVKind + * - VertexBuffer.UV2Kind + * - VertexBuffer.UV3Kind + * - VertexBuffer.UV4Kind + * - VertexBuffer.UV5Kind + * - VertexBuffer.UV6Kind + * - VertexBuffer.ColorKind + * - VertexBuffer.MatricesIndicesKind + * - VertexBuffer.MatricesIndicesExtraKind + * - VertexBuffer.MatricesWeightsKind + * - VertexBuffer.MatricesWeightsExtraKind + * @param data defines the data source + * @param updatable defines if the updated vertex buffer must be flagged as updatable + * @param stride defines the data stride size (can be null) + * @returns the current mesh */ - getScaledIntensity() { - return this._photometricScale * this.intensity; + setVerticesData(kind, data, updatable = false, stride) { + if (!this._geometry) { + const vertexData = new VertexData(); + vertexData.set(data, kind); + const scene = this.getScene(); + new Geometry(Geometry.RandomId(), scene, vertexData, updatable, this); + } else { + this._geometry.setVerticesData(kind, data, updatable, stride); + } + return this; } /** - * Returns a new Light object, named "name", from the current one. - * @param name The name of the cloned light - * @param newParent The parent of this light, if it has one - * @returns the new created light + * Delete a vertex buffer associated with this mesh + * @param kind defines which buffer to delete (positions, indices, normals, etc). Possible `kind` values : + * - VertexBuffer.PositionKind + * - VertexBuffer.UVKind + * - VertexBuffer.UV2Kind + * - VertexBuffer.UV3Kind + * - VertexBuffer.UV4Kind + * - VertexBuffer.UV5Kind + * - VertexBuffer.UV6Kind + * - VertexBuffer.ColorKind + * - VertexBuffer.MatricesIndicesKind + * - VertexBuffer.MatricesIndicesExtraKind + * - VertexBuffer.MatricesWeightsKind + * - VertexBuffer.MatricesWeightsExtraKind */ - clone(name69, newParent = null) { - const constructor = _Light.GetConstructorFromName(this.getTypeID(), name69, this.getScene()); - if (!constructor) { - return null; - } - const clonedLight = SerializationHelper.Clone(constructor, this); - if (name69) { - clonedLight.name = name69; - } - if (newParent) { - clonedLight.parent = newParent; + removeVerticesData(kind) { + if (!this._geometry) { + return; } - clonedLight.setEnabled(this.isEnabled()); - this.onClonedObservable.notifyObservers(clonedLight); - return clonedLight; + this._geometry.removeVerticesData(kind); } /** - * Serializes the current light into a Serialization object. - * @returns the serialized object. + * Flags an associated vertex buffer as updatable + * @param kind defines which buffer to use (positions, indices, normals, etc). Possible `kind` values : + * - VertexBuffer.PositionKind + * - VertexBuffer.UVKind + * - VertexBuffer.UV2Kind + * - VertexBuffer.UV3Kind + * - VertexBuffer.UV4Kind + * - VertexBuffer.UV5Kind + * - VertexBuffer.UV6Kind + * - VertexBuffer.ColorKind + * - VertexBuffer.MatricesIndicesKind + * - VertexBuffer.MatricesIndicesExtraKind + * - VertexBuffer.MatricesWeightsKind + * - VertexBuffer.MatricesWeightsExtraKind + * @param updatable defines if the updated vertex buffer must be flagged as updatable */ - serialize() { - const serializationObject = SerializationHelper.Serialize(this); - serializationObject.uniqueId = this.uniqueId; - serializationObject.type = this.getTypeID(); - if (this.parent) { - this.parent._serializeAsParent(serializationObject); - } - if (this.excludedMeshes.length > 0) { - serializationObject.excludedMeshesIds = []; - this.excludedMeshes.forEach((mesh) => { - serializationObject.excludedMeshesIds.push(mesh.id); - }); - } - if (this.includedOnlyMeshes.length > 0) { - serializationObject.includedOnlyMeshesIds = []; - this.includedOnlyMeshes.forEach((mesh) => { - serializationObject.includedOnlyMeshesIds.push(mesh.id); - }); + markVerticesDataAsUpdatable(kind, updatable = true) { + const vb = this.getVertexBuffer(kind); + if (!vb || vb.isUpdatable() === updatable) { + return; } - SerializationHelper.AppendSerializedAnimations(this, serializationObject); - serializationObject.ranges = this.serializeAnimationRanges(); - serializationObject.isEnabled = this.isEnabled(); - return serializationObject; + this.setVerticesData(kind, this.getVerticesData(kind), updatable); } /** - * Creates a new typed light from the passed type (integer) : point light = 0, directional light = 1, spot light = 2, hemispheric light = 3. - * This new light is named "name" and added to the passed scene. - * @param type Type according to the types available in Light.LIGHTTYPEID_x - * @param name The friendly name of the light - * @param scene The scene the new light will belong to - * @returns the constructor function + * Sets the mesh global Vertex Buffer + * @param buffer defines the buffer to use + * @param disposeExistingBuffer disposes the existing buffer, if any (default: true) + * @returns the current mesh */ - static GetConstructorFromName(type, name69, scene) { - const constructorFunc = Node.Construct("Light_Type_" + type, name69, scene); - if (constructorFunc) { - return constructorFunc; + setVerticesBuffer(buffer, disposeExistingBuffer = true) { + if (!this._geometry) { + this._geometry = Geometry.CreateGeometryForMesh(this); } - return null; + this._geometry.setVerticesBuffer(buffer, null, disposeExistingBuffer); + return this; } /** - * Parses the passed "parsedLight" and returns a new instanced Light from this parsing. - * @param parsedLight The JSON representation of the light - * @param scene The scene to create the parsed light in - * @returns the created light after parsing + * Update a specific associated vertex buffer + * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values : + * - VertexBuffer.PositionKind + * - VertexBuffer.UVKind + * - VertexBuffer.UV2Kind + * - VertexBuffer.UV3Kind + * - VertexBuffer.UV4Kind + * - VertexBuffer.UV5Kind + * - VertexBuffer.UV6Kind + * - VertexBuffer.ColorKind + * - VertexBuffer.MatricesIndicesKind + * - VertexBuffer.MatricesIndicesExtraKind + * - VertexBuffer.MatricesWeightsKind + * - VertexBuffer.MatricesWeightsExtraKind + * @param data defines the data source + * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for "position" kind + * @param makeItUnique defines if the geometry associated with the mesh must be cloned to make the change only for this mesh (and not all meshes associated with the same geometry) + * @returns the current mesh */ - static Parse(parsedLight, scene) { - const constructor = _Light.GetConstructorFromName(parsedLight.type, parsedLight.name, scene); - if (!constructor) { - return null; - } - const light = SerializationHelper.Parse(constructor, parsedLight, scene); - if (parsedLight.excludedMeshesIds) { - light._excludedMeshesIds = parsedLight.excludedMeshesIds; - } - if (parsedLight.includedOnlyMeshesIds) { - light._includedOnlyMeshesIds = parsedLight.includedOnlyMeshesIds; - } - if (parsedLight.parentId !== void 0) { - light._waitingParentId = parsedLight.parentId; - } - if (parsedLight.parentInstanceIndex !== void 0) { - light._waitingParentInstanceIndex = parsedLight.parentInstanceIndex; + updateVerticesData(kind, data, updateExtends, makeItUnique) { + if (!this._geometry) { + return this; } - if (parsedLight.falloffType !== void 0) { - light.falloffType = parsedLight.falloffType; + if (!makeItUnique) { + this._geometry.updateVerticesData(kind, data, updateExtends); + } else { + this.makeGeometryUnique(); + this.updateVerticesData(kind, data, updateExtends, false); } - if (parsedLight.lightmapMode !== void 0) { - light.lightmapMode = parsedLight.lightmapMode; + return this; + } + /** + * This method updates the vertex positions of an updatable mesh according to the `positionFunction` returned values. + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#other-shapes-updatemeshpositions + * @param positionFunction is a simple JS function what is passed the mesh `positions` array. It doesn't need to return anything + * @param computeNormals is a boolean (default true) to enable/disable the mesh normal recomputation after the vertex position update + * @returns the current mesh + */ + updateMeshPositions(positionFunction, computeNormals = true) { + const positions = this.getVerticesData(VertexBuffer.PositionKind); + if (!positions) { + return this; } - if (parsedLight.animations) { - for (let animationIndex = 0; animationIndex < parsedLight.animations.length; animationIndex++) { - const parsedAnimation = parsedLight.animations[animationIndex]; - const internalClass = GetClass("BABYLON.Animation"); - if (internalClass) { - light.animations.push(internalClass.Parse(parsedAnimation)); - } + positionFunction(positions); + this.updateVerticesData(VertexBuffer.PositionKind, positions, false, false); + if (computeNormals) { + const indices = this.getIndices(); + const normals = this.getVerticesData(VertexBuffer.NormalKind); + if (!normals) { + return this; } - Node.ParseAnimationRanges(light, parsedLight, scene); + VertexData.ComputeNormals(positions, indices, normals); + this.updateVerticesData(VertexBuffer.NormalKind, normals, false, false); } - if (parsedLight.autoAnimate) { - scene.beginAnimation(light, parsedLight.autoAnimateFrom, parsedLight.autoAnimateTo, parsedLight.autoAnimateLoop, parsedLight.autoAnimateSpeed || 1); + return this; + } + /** + * Creates a un-shared specific occurence of the geometry for the mesh. + * @returns the current mesh + */ + makeGeometryUnique() { + if (!this._geometry) { + return this; } - if (parsedLight.isEnabled !== void 0) { - light.setEnabled(parsedLight.isEnabled); + if (this._geometry.meshes.length === 1) { + return this; } - return light; + const oldGeometry = this._geometry; + const geometry = this._geometry.copy(Geometry.RandomId()); + oldGeometry.releaseForMesh(this, true); + geometry.applyToMesh(this); + return this; } - _hookArrayForExcluded(array) { - const oldPush = array.push; - array.push = (...items) => { - const result = oldPush.apply(array, items); - for (const item of items) { - item._resyncLightSource(this); - } - return result; - }; - const oldSplice = array.splice; - array.splice = (index, deleteCount) => { - const deleted = oldSplice.apply(array, [index, deleteCount]); - for (const item of deleted) { - item._resyncLightSource(this); - } - return deleted; - }; - for (const item of array) { - item._resyncLightSource(this); + /** + * Sets the index buffer of this mesh. + * @param indexBuffer Defines the index buffer to use for this mesh + * @param totalVertices Defines the total number of vertices used by the buffer + * @param totalIndices Defines the total number of indices in the index buffer + */ + setIndexBuffer(indexBuffer, totalVertices, totalIndices) { + let geometry = this._geometry; + if (!geometry) { + geometry = new Geometry(Geometry.RandomId(), this.getScene(), void 0, void 0, this); } + geometry.setIndexBuffer(indexBuffer, totalVertices, totalIndices); } - _hookArrayForIncludedOnly(array) { - const oldPush = array.push; - array.push = (...items) => { - const result = oldPush.apply(array, items); - this._resyncMeshes(); - return result; - }; - const oldSplice = array.splice; - array.splice = (index, deleteCount) => { - const deleted = oldSplice.apply(array, [index, deleteCount]); - this._resyncMeshes(); - return deleted; - }; - this._resyncMeshes(); - } - _resyncMeshes() { - for (const mesh of this.getScene().meshes) { - mesh._resyncLightSource(this); + /** + * Set the index buffer of this mesh + * @param indices defines the source data + * @param totalVertices defines the total number of vertices referenced by this index data (can be null) + * @param updatable defines if the updated index buffer must be flagged as updatable (default is false) + * @returns the current mesh + */ + setIndices(indices, totalVertices = null, updatable = false) { + if (!this._geometry) { + const vertexData = new VertexData(); + vertexData.indices = indices; + const scene = this.getScene(); + new Geometry(Geometry.RandomId(), scene, vertexData, updatable, this); + } else { + this._geometry.setIndices(indices, totalVertices, updatable); } + return this; } /** - * Forces the meshes to update their light related information in their rendering used effects - * @internal Internal Use Only + * Update the current index buffer + * @param indices defines the source data + * @param offset defines the offset in the index buffer where to store the new data (can be null) + * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default) + * @returns the current mesh */ - _markMeshesAsLightDirty() { - for (const mesh of this.getScene().meshes) { - if (mesh.lightSources.indexOf(this) !== -1) { - mesh._markSubMeshesAsLightDirty(); - } + updateIndices(indices, offset, gpuMemoryOnly = false) { + if (!this._geometry) { + return this; } + this._geometry.updateIndices(indices, offset, gpuMemoryOnly); + return this; } /** - * Recomputes the cached photometric scale if needed. + * Invert the geometry to move from a right handed system to a left handed one. + * @returns the current mesh */ - _computePhotometricScale() { - this._photometricScale = this._getPhotometricScale(); - this.getScene().resetCachedMaterial(); + toLeftHanded() { + if (!this._geometry) { + return this; + } + this._geometry.toLeftHanded(); + return this; } /** - * @returns the Photometric Scale according to the light type and intensity mode. + * @internal */ - _getPhotometricScale() { - let photometricScale = 0; - const lightTypeID = this.getTypeID(); - let photometricMode = this.intensityMode; - if (photometricMode === _Light.INTENSITYMODE_AUTOMATIC) { - if (lightTypeID === _Light.LIGHTTYPEID_DIRECTIONALLIGHT) { - photometricMode = _Light.INTENSITYMODE_ILLUMINANCE; - } else { - photometricMode = _Light.INTENSITYMODE_LUMINOUSINTENSITY; + _bind(subMesh, effect, fillMode, allowInstancedRendering = true) { + if (!this._geometry) { + return this; + } + const engine = this.getScene().getEngine(); + if (this.morphTargetManager && this.morphTargetManager.isUsingTextureForTargets) { + this.morphTargetManager._bind(effect); + } + let indexToBind; + if (this._unIndexed) { + indexToBind = null; + } else { + switch (this._getRenderingFillMode(fillMode)) { + case Material.PointFillMode: + indexToBind = null; + break; + case Material.WireFrameFillMode: + indexToBind = subMesh._getLinesIndexBuffer(this.getIndices(), engine); + break; + default: + case Material.TriangleFillMode: + indexToBind = this._geometry.getIndexBuffer(); + break; } } - switch (lightTypeID) { - case _Light.LIGHTTYPEID_POINTLIGHT: - case _Light.LIGHTTYPEID_SPOTLIGHT: - switch (photometricMode) { - case _Light.INTENSITYMODE_LUMINOUSPOWER: - photometricScale = 1 / (4 * Math.PI); - break; - case _Light.INTENSITYMODE_LUMINOUSINTENSITY: - photometricScale = 1; - break; - case _Light.INTENSITYMODE_LUMINANCE: - photometricScale = this.radius * this.radius; - break; - } - break; - case _Light.LIGHTTYPEID_DIRECTIONALLIGHT: - switch (photometricMode) { - case _Light.INTENSITYMODE_ILLUMINANCE: - photometricScale = 1; - break; - case _Light.INTENSITYMODE_LUMINANCE: { - let apexAngleRadians = this.radius; - apexAngleRadians = Math.max(apexAngleRadians, 1e-3); - const solidAngle = 2 * Math.PI * (1 - Math.cos(apexAngleRadians)); - photometricScale = solidAngle; - break; - } - } - break; - case _Light.LIGHTTYPEID_HEMISPHERICLIGHT: - photometricScale = 1; - break; + if (!allowInstancedRendering || !this._userInstancedBuffersStorage || this.hasThinInstances) { + this._geometry._bind(effect, indexToBind); + } else { + this._geometry._bind(effect, indexToBind, this._userInstancedBuffersStorage.vertexBuffers, this._userInstancedBuffersStorage.vertexArrayObjects); } - return photometricScale; + return this; } /** - * Reorder the light in the scene according to their defined priority. - * @internal Internal Use Only + * @internal */ - _reorderLightsInScene() { + _draw(subMesh, fillMode, instancesCount) { + if (!this._geometry || !this._geometry.getVertexBuffers() || !this._unIndexed && !this._geometry.getIndexBuffer()) { + return this; + } + if (this._internalMeshDataInfo._onBeforeDrawObservable) { + this._internalMeshDataInfo._onBeforeDrawObservable.notifyObservers(this); + } const scene = this.getScene(); - if (this._renderPriority != 0) { - scene.requireLightSorting = true; + const engine = scene.getEngine(); + if (this._unIndexed || fillMode == Material.PointFillMode) { + engine.drawArraysType(fillMode, subMesh.verticesStart, subMesh.verticesCount, this.forcedInstanceCount || instancesCount); + } else if (fillMode == Material.WireFrameFillMode) { + engine.drawElementsType(fillMode, 0, subMesh._linesIndexCount, this.forcedInstanceCount || instancesCount); + } else { + engine.drawElementsType(fillMode, subMesh.indexStart, subMesh.indexCount, this.forcedInstanceCount || instancesCount); } - this.getScene().sortLightsByPriority(); + return this; } -}; -Light.FALLOFF_DEFAULT = LightConstants.FALLOFF_DEFAULT; -Light.FALLOFF_PHYSICAL = LightConstants.FALLOFF_PHYSICAL; -Light.FALLOFF_GLTF = LightConstants.FALLOFF_GLTF; -Light.FALLOFF_STANDARD = LightConstants.FALLOFF_STANDARD; -Light.LIGHTMAP_DEFAULT = LightConstants.LIGHTMAP_DEFAULT; -Light.LIGHTMAP_SPECULAR = LightConstants.LIGHTMAP_SPECULAR; -Light.LIGHTMAP_SHADOWSONLY = LightConstants.LIGHTMAP_SHADOWSONLY; -Light.INTENSITYMODE_AUTOMATIC = LightConstants.INTENSITYMODE_AUTOMATIC; -Light.INTENSITYMODE_LUMINOUSPOWER = LightConstants.INTENSITYMODE_LUMINOUSPOWER; -Light.INTENSITYMODE_LUMINOUSINTENSITY = LightConstants.INTENSITYMODE_LUMINOUSINTENSITY; -Light.INTENSITYMODE_ILLUMINANCE = LightConstants.INTENSITYMODE_ILLUMINANCE; -Light.INTENSITYMODE_LUMINANCE = LightConstants.INTENSITYMODE_LUMINANCE; -Light.LIGHTTYPEID_POINTLIGHT = LightConstants.LIGHTTYPEID_POINTLIGHT; -Light.LIGHTTYPEID_DIRECTIONALLIGHT = LightConstants.LIGHTTYPEID_DIRECTIONALLIGHT; -Light.LIGHTTYPEID_SPOTLIGHT = LightConstants.LIGHTTYPEID_SPOTLIGHT; -Light.LIGHTTYPEID_HEMISPHERICLIGHT = LightConstants.LIGHTTYPEID_HEMISPHERICLIGHT; -__decorate([ - serializeAsColor3() -], Light.prototype, "diffuse", void 0); -__decorate([ - serializeAsColor3() -], Light.prototype, "specular", void 0); -__decorate([ - serialize() -], Light.prototype, "falloffType", void 0); -__decorate([ - serialize() -], Light.prototype, "intensity", void 0); -__decorate([ - serialize() -], Light.prototype, "range", null); -__decorate([ - serialize() -], Light.prototype, "intensityMode", null); -__decorate([ - serialize() -], Light.prototype, "radius", null); -__decorate([ - serialize() -], Light.prototype, "_renderPriority", void 0); -__decorate([ - expandToProperty("_reorderLightsInScene") -], Light.prototype, "renderPriority", void 0); -__decorate([ - serialize("shadowEnabled") -], Light.prototype, "_shadowEnabled", void 0); -__decorate([ - serialize("excludeWithLayerMask") -], Light.prototype, "_excludeWithLayerMask", void 0); -__decorate([ - serialize("includeOnlyWithLayerMask") -], Light.prototype, "_includeOnlyWithLayerMask", void 0); -__decorate([ - serialize("lightmapMode") -], Light.prototype, "_lightmapMode", void 0); - -// node_modules/@babylonjs/core/Materials/Textures/thinTexture.js -var ThinTexture = class _ThinTexture { /** - * | Value | Type | Description | - * | ----- | ------------------ | ----------- | - * | 0 | CLAMP_ADDRESSMODE | | - * | 1 | WRAP_ADDRESSMODE | | - * | 2 | MIRROR_ADDRESSMODE | | + * Registers for this mesh a javascript function called just before the rendering process + * @param func defines the function to call before rendering this mesh + * @returns the current mesh */ - get wrapU() { - return this._wrapU; - } - set wrapU(value) { - this._wrapU = value; + registerBeforeRender(func) { + this.onBeforeRenderObservable.add(func); + return this; } /** - * | Value | Type | Description | - * | ----- | ------------------ | ----------- | - * | 0 | CLAMP_ADDRESSMODE | | - * | 1 | WRAP_ADDRESSMODE | | - * | 2 | MIRROR_ADDRESSMODE | | + * Disposes a previously registered javascript function called before the rendering + * @param func defines the function to remove + * @returns the current mesh */ - get wrapV() { - return this._wrapV; - } - set wrapV(value) { - this._wrapV = value; + unregisterBeforeRender(func) { + this.onBeforeRenderObservable.removeCallback(func); + return this; } /** - * How a texture is mapped. - * Unused in thin texture mode. + * Registers for this mesh a javascript function called just after the rendering is complete + * @param func defines the function to call after rendering this mesh + * @returns the current mesh */ - get coordinatesMode() { - return 0; + registerAfterRender(func) { + this.onAfterRenderObservable.add(func); + return this; } /** - * Define if the texture is a cube texture or if false a 2d texture. + * Disposes a previously registered javascript function called after the rendering. + * @param func defines the function to remove + * @returns the current mesh */ - get isCube() { - if (!this._texture) { - return false; - } - return this._texture.isCube; - } - // eslint-disable-next-line @typescript-eslint/naming-convention - set isCube(value) { - if (!this._texture) { - return; - } - this._texture.isCube = value; + unregisterAfterRender(func) { + this.onAfterRenderObservable.removeCallback(func); + return this; } /** - * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture. + * @internal */ - get is3D() { - if (!this._texture) { - return false; + _getInstancesRenderList(subMeshId, isReplacementMode = false) { + if (this._instanceDataStorage.isFrozen) { + if (isReplacementMode) { + this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.hardwareInstancedRendering[subMeshId] = false; + this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.renderSelf[subMeshId] = true; + return this._instanceDataStorage.batchCacheReplacementModeInFrozenMode; + } + if (this._instanceDataStorage.previousBatch) { + return this._instanceDataStorage.previousBatch; + } } - return this._texture.is3D; - } - // eslint-disable-next-line @typescript-eslint/naming-convention - set is3D(value) { - if (!this._texture) { - return; + const scene = this.getScene(); + const isInIntermediateRendering = scene._isInIntermediateRendering(); + const onlyForInstances = isInIntermediateRendering ? this._internalAbstractMeshDataInfo._onlyForInstancesIntermediate : this._internalAbstractMeshDataInfo._onlyForInstances; + const batchCache = this._instanceDataStorage.batchCache; + batchCache.mustReturn = false; + batchCache.renderSelf[subMeshId] = isReplacementMode || !onlyForInstances && this.isEnabled() && this.isVisible; + batchCache.visibleInstances[subMeshId] = null; + if (this._instanceDataStorage.visibleInstances && !isReplacementMode) { + const visibleInstances = this._instanceDataStorage.visibleInstances; + const currentRenderId = scene.getRenderId(); + const defaultRenderId = isInIntermediateRendering ? visibleInstances.intermediateDefaultRenderId : visibleInstances.defaultRenderId; + batchCache.visibleInstances[subMeshId] = visibleInstances[currentRenderId]; + if (!batchCache.visibleInstances[subMeshId] && defaultRenderId) { + batchCache.visibleInstances[subMeshId] = visibleInstances[defaultRenderId]; + } } - this._texture.is3D = value; + batchCache.hardwareInstancedRendering[subMeshId] = !isReplacementMode && this._instanceDataStorage.hardwareInstancedRendering && batchCache.visibleInstances[subMeshId] !== null && batchCache.visibleInstances[subMeshId] !== void 0; + this._instanceDataStorage.previousBatch = batchCache; + return batchCache; } /** - * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture. + * @internal */ - get is2DArray() { - if (!this._texture) { - return false; + _renderWithInstances(subMesh, fillMode, batch, effect, engine) { + var _a; + const visibleInstances = batch.visibleInstances[subMesh._id]; + const visibleInstanceCount = visibleInstances ? visibleInstances.length : 0; + const instanceStorage = this._instanceDataStorage; + const currentInstancesBufferSize = instanceStorage.instancesBufferSize; + let instancesBuffer = instanceStorage.instancesBuffer; + let instancesPreviousBuffer = instanceStorage.instancesPreviousBuffer; + const matricesCount = visibleInstanceCount + 1; + const bufferSize = matricesCount * 16 * 4; + while (instanceStorage.instancesBufferSize < bufferSize) { + instanceStorage.instancesBufferSize *= 2; } - return this._texture.is2DArray; - } - // eslint-disable-next-line @typescript-eslint/naming-convention - set is2DArray(value) { - if (!this._texture) { - return; + if (!instanceStorage.instancesData || currentInstancesBufferSize != instanceStorage.instancesBufferSize) { + instanceStorage.instancesData = new Float32Array(instanceStorage.instancesBufferSize / 4); } - this._texture.is2DArray = value; - } - /** - * Get the class name of the texture. - * @returns "ThinTexture" - */ - getClassName() { - return "ThinTexture"; - } - static _IsRenderTargetWrapper(texture) { - return (texture == null ? void 0 : texture._shareDepth) !== void 0; - } - /** - * Instantiates a new ThinTexture. - * Base class of all the textures in babylon. - * This can be used as an internal texture wrapper in ThinEngine to benefit from the cache - * @param internalTexture Define the internalTexture to wrap. You can also pass a RenderTargetWrapper, in which case the texture will be the render target's texture - */ - constructor(internalTexture) { - this._wrapU = 1; - this._wrapV = 1; - this.wrapR = 1; - this.anisotropicFilteringLevel = 4; - this.delayLoadState = 0; - this._texture = null; - this._engine = null; - this._cachedSize = Size.Zero(); - this._cachedBaseSize = Size.Zero(); - this._initialSamplingMode = 2; - this._texture = _ThinTexture._IsRenderTargetWrapper(internalTexture) ? internalTexture.texture : internalTexture; - if (this._texture) { - this._engine = this._texture.getEngine(); + if (this._scene.needsPreviousWorldMatrices && !instanceStorage.instancesPreviousData || currentInstancesBufferSize != instanceStorage.instancesBufferSize) { + instanceStorage.instancesPreviousData = new Float32Array(instanceStorage.instancesBufferSize / 4); } - } - /** - * Get if the texture is ready to be used (downloaded, converted, mip mapped...). - * @returns true if fully ready - */ - isReady() { - if (this.delayLoadState === 4) { - this.delayLoad(); - return false; + let offset = 0; + let instancesCount = 0; + const renderSelf = batch.renderSelf[subMesh._id]; + const needUpdateBuffer = !instancesBuffer || currentInstancesBufferSize !== instanceStorage.instancesBufferSize || this._scene.needsPreviousWorldMatrices && !instanceStorage.instancesPreviousBuffer; + if (!this._instanceDataStorage.manualUpdate && (!instanceStorage.isFrozen || needUpdateBuffer)) { + const world = this.getWorldMatrix(); + if (renderSelf) { + if (this._scene.needsPreviousWorldMatrices) { + if (!instanceStorage.masterMeshPreviousWorldMatrix) { + instanceStorage.masterMeshPreviousWorldMatrix = world.clone(); + instanceStorage.masterMeshPreviousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset); + } else { + instanceStorage.masterMeshPreviousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset); + instanceStorage.masterMeshPreviousWorldMatrix.copyFrom(world); + } + } + world.copyToArray(instanceStorage.instancesData, offset); + offset += 16; + instancesCount++; + } + if (visibleInstances) { + if (_Mesh.INSTANCEDMESH_SORT_TRANSPARENT && this._scene.activeCamera && ((_a = subMesh.getMaterial()) == null ? void 0 : _a.needAlphaBlendingForMesh(subMesh.getRenderingMesh()))) { + const cameraPosition = this._scene.activeCamera.globalPosition; + for (let instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) { + const instanceMesh = visibleInstances[instanceIndex]; + instanceMesh._distanceToCamera = Vector3.Distance(instanceMesh.getBoundingInfo().boundingSphere.centerWorld, cameraPosition); + } + visibleInstances.sort((m1, m2) => { + return m1._distanceToCamera > m2._distanceToCamera ? -1 : m1._distanceToCamera < m2._distanceToCamera ? 1 : 0; + }); + } + for (let instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) { + const instance = visibleInstances[instanceIndex]; + const matrix = instance.getWorldMatrix(); + matrix.copyToArray(instanceStorage.instancesData, offset); + if (this._scene.needsPreviousWorldMatrices) { + if (!instance._previousWorldMatrix) { + instance._previousWorldMatrix = matrix.clone(); + instance._previousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset); + } else { + instance._previousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset); + instance._previousWorldMatrix.copyFrom(matrix); + } + } + offset += 16; + instancesCount++; + } + } + } else { + instancesCount = (renderSelf ? 1 : 0) + visibleInstanceCount; } - if (this._texture) { - return this._texture.isReady; + if (needUpdateBuffer) { + if (instancesBuffer) { + instancesBuffer.dispose(); + } + if (instancesPreviousBuffer) { + instancesPreviousBuffer.dispose(); + } + instancesBuffer = new Buffer(engine, instanceStorage.instancesData, true, 16, false, true); + instanceStorage.instancesBuffer = instancesBuffer; + if (!this._userInstancedBuffersStorage) { + this._userInstancedBuffersStorage = { + data: {}, + vertexBuffers: {}, + strides: {}, + sizes: {}, + vertexArrayObjects: this.getEngine().getCaps().vertexArrayObject ? {} : void 0 + }; + } + this._userInstancedBuffersStorage.vertexBuffers["world0"] = instancesBuffer.createVertexBuffer("world0", 0, 4); + this._userInstancedBuffersStorage.vertexBuffers["world1"] = instancesBuffer.createVertexBuffer("world1", 4, 4); + this._userInstancedBuffersStorage.vertexBuffers["world2"] = instancesBuffer.createVertexBuffer("world2", 8, 4); + this._userInstancedBuffersStorage.vertexBuffers["world3"] = instancesBuffer.createVertexBuffer("world3", 12, 4); + if (this._scene.needsPreviousWorldMatrices) { + instancesPreviousBuffer = new Buffer(engine, instanceStorage.instancesPreviousData, true, 16, false, true); + instanceStorage.instancesPreviousBuffer = instancesPreviousBuffer; + this._userInstancedBuffersStorage.vertexBuffers["previousWorld0"] = instancesPreviousBuffer.createVertexBuffer("previousWorld0", 0, 4); + this._userInstancedBuffersStorage.vertexBuffers["previousWorld1"] = instancesPreviousBuffer.createVertexBuffer("previousWorld1", 4, 4); + this._userInstancedBuffersStorage.vertexBuffers["previousWorld2"] = instancesPreviousBuffer.createVertexBuffer("previousWorld2", 8, 4); + this._userInstancedBuffersStorage.vertexBuffers["previousWorld3"] = instancesPreviousBuffer.createVertexBuffer("previousWorld3", 12, 4); + } + this._invalidateInstanceVertexArrayObject(); + } else { + if (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) { + instancesBuffer.updateDirectly(instanceStorage.instancesData, 0, instancesCount); + if (this._scene.needsPreviousWorldMatrices && (!this._instanceDataStorage.manualUpdate || this._instanceDataStorage.previousManualUpdate)) { + instancesPreviousBuffer.updateDirectly(instanceStorage.instancesPreviousData, 0, instancesCount); + } + } } - return false; + this._processInstancedBuffers(visibleInstances, renderSelf); + this.getScene()._activeIndices.addCount(subMesh.indexCount * instancesCount, false); + if (engine._currentDrawContext) { + engine._currentDrawContext.useInstancing = true; + } + this._bind(subMesh, effect, fillMode); + this._draw(subMesh, fillMode, instancesCount); + if (this._scene.needsPreviousWorldMatrices && !needUpdateBuffer && this._instanceDataStorage.manualUpdate && (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) && !this._instanceDataStorage.previousManualUpdate) { + instancesPreviousBuffer.updateDirectly(instanceStorage.instancesData, 0, instancesCount); + } + engine.unbindInstanceAttributes(); + return this; } /** - * Triggers the load sequence in delayed load mode. + * @internal */ - delayLoad() { + _renderWithThinInstances(subMesh, fillMode, effect, engine) { + var _a; + const instancesCount = ((_a = this._thinInstanceDataStorage) == null ? void 0 : _a.instancesCount) ?? 0; + this.getScene()._activeIndices.addCount(subMesh.indexCount * instancesCount, false); + if (engine._currentDrawContext) { + engine._currentDrawContext.useInstancing = true; + } + this._bind(subMesh, effect, fillMode); + this._draw(subMesh, fillMode, instancesCount); + if (this._scene.needsPreviousWorldMatrices && !this._thinInstanceDataStorage.previousMatrixData && this._thinInstanceDataStorage.matrixData) { + if (!this._thinInstanceDataStorage.previousMatrixBuffer) { + this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer("previousWorld", this._thinInstanceDataStorage.matrixData, false); + } else { + this._thinInstanceDataStorage.previousMatrixBuffer.updateDirectly(this._thinInstanceDataStorage.matrixData, 0, instancesCount); + } + } + engine.unbindInstanceAttributes(); } /** - * Get the underlying lower level texture from Babylon. - * @returns the internal texture + * @internal */ - getInternalTexture() { - return this._texture; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _processInstancedBuffers(visibleInstances, renderSelf) { } /** - * Get the size of the texture. - * @returns the texture size. + * @internal */ - getSize() { - if (this._texture) { - if (this._texture.width) { - this._cachedSize.width = this._texture.width; - this._cachedSize.height = this._texture.height; - return this._cachedSize; + _processRendering(renderingMesh, subMesh, effect, fillMode, batch, hardwareInstancedRendering, onBeforeDraw, effectiveMaterial) { + const scene = this.getScene(); + const engine = scene.getEngine(); + fillMode = this._getRenderingFillMode(fillMode); + if (hardwareInstancedRendering && subMesh.getRenderingMesh().hasThinInstances) { + this._renderWithThinInstances(subMesh, fillMode, effect, engine); + return this; + } + if (hardwareInstancedRendering) { + this._renderWithInstances(subMesh, fillMode, batch, effect, engine); + } else { + if (engine._currentDrawContext) { + engine._currentDrawContext.useInstancing = false; } - if (this._texture._size) { - this._cachedSize.width = this._texture._size; - this._cachedSize.height = this._texture._size; - return this._cachedSize; + let instanceCount = 0; + if (batch.renderSelf[subMesh._id]) { + if (onBeforeDraw) { + onBeforeDraw(false, renderingMesh.getWorldMatrix(), effectiveMaterial); + } + instanceCount++; + this._draw(subMesh, fillMode, this._instanceDataStorage.overridenInstanceCount); + } + const visibleInstancesForSubMesh = batch.visibleInstances[subMesh._id]; + if (visibleInstancesForSubMesh) { + const visibleInstanceCount = visibleInstancesForSubMesh.length; + instanceCount += visibleInstanceCount; + for (let instanceIndex = 0; instanceIndex < visibleInstanceCount; instanceIndex++) { + const instance = visibleInstancesForSubMesh[instanceIndex]; + const world = instance.getWorldMatrix(); + if (onBeforeDraw) { + onBeforeDraw(true, world, effectiveMaterial); + } + this._draw(subMesh, fillMode); + } } + scene._activeIndices.addCount(subMesh.indexCount * instanceCount, false); } - return this._cachedSize; + return this; } /** - * Get the base size of the texture. - * It can be different from the size if the texture has been resized for POT for instance - * @returns the base size + * @internal */ - getBaseSize() { - if (!this.isReady() || !this._texture) { - this._cachedBaseSize.width = 0; - this._cachedBaseSize.height = 0; - return this._cachedBaseSize; + _rebuild(dispose = false) { + if (this._instanceDataStorage.instancesBuffer) { + if (dispose) { + this._instanceDataStorage.instancesBuffer.dispose(); + } + this._instanceDataStorage.instancesBuffer = null; } - if (this._texture._size) { - this._cachedBaseSize.width = this._texture._size; - this._cachedBaseSize.height = this._texture._size; - return this._cachedBaseSize; + if (this._userInstancedBuffersStorage) { + for (const kind in this._userInstancedBuffersStorage.vertexBuffers) { + const buffer = this._userInstancedBuffersStorage.vertexBuffers[kind]; + if (buffer) { + if (dispose) { + buffer.dispose(); + } + this._userInstancedBuffersStorage.vertexBuffers[kind] = null; + } + } + if (this._userInstancedBuffersStorage.vertexArrayObjects) { + this._userInstancedBuffersStorage.vertexArrayObjects = {}; + } } - this._cachedBaseSize.width = this._texture.baseWidth; - this._cachedBaseSize.height = this._texture.baseHeight; - return this._cachedBaseSize; + this._internalMeshDataInfo._effectiveMaterial = null; + super._rebuild(dispose); } - /** - * Get the current sampling mode associated with the texture. - */ - get samplingMode() { - if (!this._texture) { - return this._initialSamplingMode; + /** @internal */ + _freeze() { + if (!this.subMeshes) { + return; } - return this._texture.samplingMode; - } - /** - * Update the sampling mode of the texture. - * Default is Trilinear mode. - * - * | Value | Type | Description | - * | ----- | ------------------ | ----------- | - * | 1 | NEAREST_SAMPLINGMODE or NEAREST_NEAREST_MIPLINEAR | Nearest is: mag = nearest, min = nearest, mip = linear | - * | 2 | BILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPNEAREST | Bilinear is: mag = linear, min = linear, mip = nearest | - * | 3 | TRILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPLINEAR | Trilinear is: mag = linear, min = linear, mip = linear | - * | 4 | NEAREST_NEAREST_MIPNEAREST | | - * | 5 | NEAREST_LINEAR_MIPNEAREST | | - * | 6 | NEAREST_LINEAR_MIPLINEAR | | - * | 7 | NEAREST_LINEAR | | - * | 8 | NEAREST_NEAREST | | - * | 9 | LINEAR_NEAREST_MIPNEAREST | | - * | 10 | LINEAR_NEAREST_MIPLINEAR | | - * | 11 | LINEAR_LINEAR | | - * | 12 | LINEAR_NEAREST | | - * - * > _mag_: magnification filter (close to the viewer) - * > _min_: minification filter (far from the viewer) - * > _mip_: filter used between mip map levels - *@param samplingMode Define the new sampling mode of the texture - */ - updateSamplingMode(samplingMode) { - if (this._texture && this._engine) { - this._engine.updateTextureSamplingMode(samplingMode, this._texture); + for (let index = 0; index < this.subMeshes.length; index++) { + this._getInstancesRenderList(index); } + this._internalMeshDataInfo._effectiveMaterial = null; + this._instanceDataStorage.isFrozen = true; } - /** - * Release and destroy the underlying lower level texture aka internalTexture. - */ - releaseInternalTexture() { - if (this._texture) { - this._texture.dispose(); - this._texture = null; - } + /** @internal */ + _unFreeze() { + this._instanceDataStorage.isFrozen = false; + this._instanceDataStorage.previousBatch = null; } /** - * Dispose the texture and release its associated resources. + * Triggers the draw call for the mesh (or a submesh), for a specific render pass id + * @param renderPassId defines the render pass id to use to draw the mesh / submesh. If not provided, use the current renderPassId of the engine. + * @param enableAlphaMode defines if alpha mode can be changed (default: false) + * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering (default: undefined) + * @param subMesh defines the subMesh to render. If not provided, draw all mesh submeshes (default: undefined) + * @param checkFrustumCulling defines if frustum culling must be checked (default: true). If you know the mesh is in the frustum (or if you don't care!), you can pass false to optimize. + * @returns the current mesh */ - dispose() { - if (this._texture) { - this.releaseInternalTexture(); - this._engine = null; + renderWithRenderPassId(renderPassId, enableAlphaMode, effectiveMeshReplacement, subMesh, checkFrustumCulling = true) { + const engine = this._scene.getEngine(); + const currentRenderPassId = engine.currentRenderPassId; + if (renderPassId !== void 0) { + engine.currentRenderPassId = renderPassId; } - } -}; - -// node_modules/@babylonjs/core/Materials/Textures/baseTexture.js -var BaseTexture = class _BaseTexture extends ThinTexture { - /** - * Define if the texture is having a usable alpha value (can be use for transparency or glossiness for instance). - */ - set hasAlpha(value) { - if (this._hasAlpha === value) { - return; + if (subMesh) { + if (!checkFrustumCulling || checkFrustumCulling && subMesh.isInFrustum(this._scene._frustumPlanes)) { + this.render(subMesh, !!enableAlphaMode, effectiveMeshReplacement); + } + } else { + for (let s = 0; s < this.subMeshes.length; s++) { + const subMesh2 = this.subMeshes[s]; + if (!checkFrustumCulling || checkFrustumCulling && subMesh2.isInFrustum(this._scene._frustumPlanes)) { + this.render(subMesh2, !!enableAlphaMode, effectiveMeshReplacement); + } + } } - this._hasAlpha = value; - if (this._scene) { - this._scene.markAllMaterialsAsDirty(1, (mat) => { - return mat.hasTexture(this); - }); + if (renderPassId !== void 0) { + engine.currentRenderPassId = currentRenderPassId; } - } - get hasAlpha() { - return this._hasAlpha; + return this; } /** - * Defines if the alpha value should be determined via the rgb values. - * If true the luminance of the pixel might be used to find the corresponding alpha value. + * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager + * @param subMesh defines the subMesh to render + * @param enableAlphaMode defines if alpha mode can be changed + * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering + * @returns the current mesh */ - set getAlphaFromRGB(value) { - if (this._getAlphaFromRGB === value) { - return; - } - this._getAlphaFromRGB = value; - if (this._scene) { - this._scene.markAllMaterialsAsDirty(1, (mat) => { - return mat.hasTexture(this); - }); + render(subMesh, enableAlphaMode, effectiveMeshReplacement) { + var _a, _b; + const scene = this.getScene(); + if (this._internalAbstractMeshDataInfo._isActiveIntermediate) { + this._internalAbstractMeshDataInfo._isActiveIntermediate = false; + } else { + this._internalAbstractMeshDataInfo._isActive = false; } - } - get getAlphaFromRGB() { - return this._getAlphaFromRGB; - } - /** - * Define the UV channel to use starting from 0 and defaulting to 0. - * This is part of the texture as textures usually maps to one uv set. - */ - set coordinatesIndex(value) { - if (this._coordinatesIndex === value) { - return; + const numActiveCameras = ((_a = scene.activeCameras) == null ? void 0 : _a.length) ?? 0; + const canCheckOcclusionQuery = numActiveCameras > 1 && scene.activeCamera === scene.activeCameras[0] || numActiveCameras <= 1; + if (canCheckOcclusionQuery && this._checkOcclusionQuery() && !this._occlusionDataStorage.forceRenderingWhenOccluded) { + return this; } - this._coordinatesIndex = value; - if (this._scene) { - this._scene.markAllMaterialsAsDirty(1, (mat) => { - return mat.hasTexture(this); - }); + const batch = this._getInstancesRenderList(subMesh._id, !!effectiveMeshReplacement); + if (batch.mustReturn) { + return this; } - } - get coordinatesIndex() { - return this._coordinatesIndex; - } - /** - * How a texture is mapped. - * - * | Value | Type | Description | - * | ----- | ----------------------------------- | ----------- | - * | 0 | EXPLICIT_MODE | | - * | 1 | SPHERICAL_MODE | | - * | 2 | PLANAR_MODE | | - * | 3 | CUBIC_MODE | | - * | 4 | PROJECTION_MODE | | - * | 5 | SKYBOX_MODE | | - * | 6 | INVCUBIC_MODE | | - * | 7 | EQUIRECTANGULAR_MODE | | - * | 8 | FIXED_EQUIRECTANGULAR_MODE | | - * | 9 | FIXED_EQUIRECTANGULAR_MIRRORED_MODE | | - */ - set coordinatesMode(value) { - if (this._coordinatesMode === value) { - return; + if (!this._geometry || !this._geometry.getVertexBuffers() || !this._unIndexed && !this._geometry.getIndexBuffer()) { + return this; } - this._coordinatesMode = value; - if (this._scene) { - this._scene.markAllMaterialsAsDirty(1, (mat) => { - return mat.hasTexture(this); - }); + const engine = scene.getEngine(); + let oldCameraMaxZ = 0; + let oldCamera = null; + if (this.ignoreCameraMaxZ && scene.activeCamera && !scene._isInIntermediateRendering()) { + oldCameraMaxZ = scene.activeCamera.maxZ; + oldCamera = scene.activeCamera; + scene.activeCamera.maxZ = 0; + scene.updateTransformMatrix(true); } - } - get coordinatesMode() { - return this._coordinatesMode; - } - /** - * | Value | Type | Description | - * | ----- | ------------------ | ----------- | - * | 0 | CLAMP_ADDRESSMODE | | - * | 1 | WRAP_ADDRESSMODE | | - * | 2 | MIRROR_ADDRESSMODE | | - */ - get wrapU() { - return this._wrapU; - } - set wrapU(value) { - this._wrapU = value; - } - /** - * | Value | Type | Description | - * | ----- | ------------------ | ----------- | - * | 0 | CLAMP_ADDRESSMODE | | - * | 1 | WRAP_ADDRESSMODE | | - * | 2 | MIRROR_ADDRESSMODE | | - */ - get wrapV() { - return this._wrapV; - } - set wrapV(value) { - this._wrapV = value; - } - /** - * Define if the texture is a cube texture or if false a 2d texture. - */ - get isCube() { - if (!this._texture) { - return this._isCube; + if (this._internalMeshDataInfo._onBeforeRenderObservable) { + this._internalMeshDataInfo._onBeforeRenderObservable.notifyObservers(this); } - return this._texture.isCube; - } - // eslint-disable-next-line @typescript-eslint/naming-convention - set isCube(value) { - if (!this._texture) { - this._isCube = value; - } else { - this._texture.isCube = value; + const renderingMesh = subMesh.getRenderingMesh(); + const hardwareInstancedRendering = batch.hardwareInstancedRendering[subMesh._id] || renderingMesh.hasThinInstances || !!this._userInstancedBuffersStorage && !subMesh.getMesh()._internalAbstractMeshDataInfo._actAsRegularMesh; + const instanceDataStorage = this._instanceDataStorage; + const material = subMesh.getMaterial(); + if (!material) { + if (oldCamera) { + oldCamera.maxZ = oldCameraMaxZ; + scene.updateTransformMatrix(true); + } + return this; } - } - /** - * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture. - */ - get is3D() { - if (!this._texture) { - return false; + if (!instanceDataStorage.isFrozen || !this._internalMeshDataInfo._effectiveMaterial || this._internalMeshDataInfo._effectiveMaterial !== material) { + if (material._storeEffectOnSubMeshes) { + if (!material.isReadyForSubMesh(this, subMesh, hardwareInstancedRendering)) { + if (oldCamera) { + oldCamera.maxZ = oldCameraMaxZ; + scene.updateTransformMatrix(true); + } + return this; + } + } else if (!material.isReady(this, hardwareInstancedRendering)) { + if (oldCamera) { + oldCamera.maxZ = oldCameraMaxZ; + scene.updateTransformMatrix(true); + } + return this; + } + this._internalMeshDataInfo._effectiveMaterial = material; + } else if (material._storeEffectOnSubMeshes && !((_b = subMesh._drawWrapper) == null ? void 0 : _b._wasPreviouslyReady) || !material._storeEffectOnSubMeshes && !material._getDrawWrapper()._wasPreviouslyReady) { + if (oldCamera) { + oldCamera.maxZ = oldCameraMaxZ; + scene.updateTransformMatrix(true); + } + return this; } - return this._texture.is3D; - } - // eslint-disable-next-line @typescript-eslint/naming-convention - set is3D(value) { - if (!this._texture) { - return; + if (enableAlphaMode) { + engine.setAlphaMode(this._internalMeshDataInfo._effectiveMaterial.alphaMode); } - this._texture.is3D = value; - } - /** - * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture. - */ - get is2DArray() { - if (!this._texture) { - return false; + let drawWrapper; + if (this._internalMeshDataInfo._effectiveMaterial._storeEffectOnSubMeshes) { + drawWrapper = subMesh._drawWrapper; + } else { + drawWrapper = this._internalMeshDataInfo._effectiveMaterial._getDrawWrapper(); } - return this._texture.is2DArray; - } - // eslint-disable-next-line @typescript-eslint/naming-convention - set is2DArray(value) { - if (!this._texture) { - return; + const effect = (drawWrapper == null ? void 0 : drawWrapper.effect) ?? null; + for (const step of scene._beforeRenderingMeshStage) { + step.action(this, subMesh, batch, effect); } - this._texture.is2DArray = value; - } - /** - * Define if the texture contains data in gamma space (most of the png/jpg aside bump). - * HDR texture are usually stored in linear space. - * This only impacts the PBR and Background materials - */ - get gammaSpace() { - if (!this._texture) { - return this._gammaSpace; - } else { - if (this._texture._gammaSpace === null) { - this._texture._gammaSpace = this._gammaSpace; + if (!drawWrapper || !effect) { + if (oldCamera) { + oldCamera.maxZ = oldCameraMaxZ; + scene.updateTransformMatrix(true); } + return this; } - return this._texture._gammaSpace && !this._texture._useSRGBBuffer; - } - set gammaSpace(gamma) { - var _a; - if (!this._texture) { - if (this._gammaSpace === gamma) { - return; + const effectiveMesh = effectiveMeshReplacement || this; + let sideOrientation; + if (!instanceDataStorage.isFrozen && (this._internalMeshDataInfo._effectiveMaterial.backFaceCulling || this.overrideMaterialSideOrientation !== null || this._internalMeshDataInfo._effectiveMaterial.twoSidedLighting)) { + const mainDeterminant = effectiveMesh._getWorldMatrixDeterminant(); + sideOrientation = this.overrideMaterialSideOrientation; + if (sideOrientation == null) { + sideOrientation = this._internalMeshDataInfo._effectiveMaterial.sideOrientation; } - this._gammaSpace = gamma; - } else { - if (this._texture._gammaSpace === gamma) { - return; + if (mainDeterminant < 0) { + sideOrientation = sideOrientation === Material.ClockWiseSideOrientation ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation; } - this._texture._gammaSpace = gamma; + instanceDataStorage.sideOrientation = sideOrientation; + } else { + sideOrientation = instanceDataStorage.sideOrientation; } - (_a = this.getScene()) == null ? void 0 : _a.markAllMaterialsAsDirty(1, (mat) => { - return mat.hasTexture(this); - }); - } - /** - * Gets or sets whether or not the texture contains RGBD data. - */ - get isRGBD() { - return this._texture != null && this._texture._isRGBD; - } - set isRGBD(value) { - var _a; - if (value === this.isRGBD) { - return; + const reverse = this._internalMeshDataInfo._effectiveMaterial._preBind(drawWrapper, sideOrientation); + if (this._internalMeshDataInfo._effectiveMaterial.forceDepthWrite) { + engine.setDepthWrite(true); } - if (this._texture) { - this._texture._isRGBD = value; + const effectiveMaterial = this._internalMeshDataInfo._effectiveMaterial; + const fillMode = effectiveMaterial.fillMode; + if (this._internalMeshDataInfo._onBeforeBindObservable) { + this._internalMeshDataInfo._onBeforeBindObservable.notifyObservers(this); } - (_a = this.getScene()) == null ? void 0 : _a.markAllMaterialsAsDirty(1, (mat) => { - return mat.hasTexture(this); - }); - } - /** - * Are mip maps generated for this texture or not. - */ - get noMipmap() { - return false; - } - /** - * With prefiltered texture, defined the offset used during the prefiltering steps. - */ - get lodGenerationOffset() { - if (this._texture) { - return this._texture._lodGenerationOffset; + if (!hardwareInstancedRendering) { + this._bind(subMesh, effect, fillMode, false); } - return 0; - } - set lodGenerationOffset(value) { - if (this._texture) { - this._texture._lodGenerationOffset = value; + const world = effectiveMesh.getWorldMatrix(); + if (effectiveMaterial._storeEffectOnSubMeshes) { + effectiveMaterial.bindForSubMesh(world, this, subMesh); + } else { + effectiveMaterial.bind(world, this); } - } - /** - * With prefiltered texture, defined the scale used during the prefiltering steps. - */ - get lodGenerationScale() { - if (this._texture) { - return this._texture._lodGenerationScale; + if (!effectiveMaterial.backFaceCulling && effectiveMaterial.separateCullingPass) { + engine.setState(true, effectiveMaterial.zOffset, false, !reverse, effectiveMaterial.cullBackFaces, effectiveMaterial.stencil, effectiveMaterial.zOffsetUnits); + this._processRendering(this, subMesh, effect, fillMode, batch, hardwareInstancedRendering, this._onBeforeDraw, this._internalMeshDataInfo._effectiveMaterial); + engine.setState(true, effectiveMaterial.zOffset, false, reverse, effectiveMaterial.cullBackFaces, effectiveMaterial.stencil, effectiveMaterial.zOffsetUnits); + if (this._internalMeshDataInfo._onBetweenPassObservable) { + this._internalMeshDataInfo._onBetweenPassObservable.notifyObservers(subMesh); + } } - return 0; - } - set lodGenerationScale(value) { - if (this._texture) { - this._texture._lodGenerationScale = value; + this._processRendering(this, subMesh, effect, fillMode, batch, hardwareInstancedRendering, this._onBeforeDraw, this._internalMeshDataInfo._effectiveMaterial); + this._internalMeshDataInfo._effectiveMaterial.unbind(); + for (const step of scene._afterRenderingMeshStage) { + step.action(this, subMesh, batch, effect); } - } - /** - * With prefiltered texture, defined if the specular generation is based on a linear ramp. - * By default we are using a log2 of the linear roughness helping to keep a better resolution for - * average roughness values. - */ - get linearSpecularLOD() { - if (this._texture) { - return this._texture._linearSpecularLOD; + if (this._internalMeshDataInfo._onAfterRenderObservable) { + this._internalMeshDataInfo._onAfterRenderObservable.notifyObservers(this); } - return false; - } - set linearSpecularLOD(value) { - if (this._texture) { - this._texture._linearSpecularLOD = value; + if (oldCamera) { + oldCamera.maxZ = oldCameraMaxZ; + scene.updateTransformMatrix(true); } + if (scene.performancePriority === ScenePerformancePriority.Aggressive && !instanceDataStorage.isFrozen) { + this._freeze(); + } + return this; } /** - * In case a better definition than spherical harmonics is required for the diffuse part of the environment. - * You can set the irradiance texture to rely on a texture instead of the spherical approach. - * This texture need to have the same characteristics than its parent (Cube vs 2d, coordinates mode, Gamma/Linear, RGBD). + * Renormalize the mesh and patch it up if there are no weights + * Similar to normalization by adding the weights compute the reciprocal and multiply all elements, this wil ensure that everything adds to 1. + * However in the case of zero weights then we set just a single influence to 1. + * We check in the function for extra's present and if so we use the normalizeSkinWeightsWithExtras rather than the FourWeights version. */ - get irradianceTexture() { - if (this._texture) { - return this._texture._irradianceTexture; + cleanMatrixWeights() { + if (this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) { + if (this.isVerticesDataPresent(VertexBuffer.MatricesWeightsExtraKind)) { + this._normalizeSkinWeightsAndExtra(); + } else { + this._normalizeSkinFourWeights(); + } } - return null; } - set irradianceTexture(value) { - if (this._texture) { - this._texture._irradianceTexture = value; + // faster 4 weight version. + _normalizeSkinFourWeights() { + const matricesWeights = this.getVerticesData(VertexBuffer.MatricesWeightsKind); + const numWeights = matricesWeights.length; + for (let a = 0; a < numWeights; a += 4) { + const t = matricesWeights[a] + matricesWeights[a + 1] + matricesWeights[a + 2] + matricesWeights[a + 3]; + if (t === 0) { + matricesWeights[a] = 1; + } else { + const recip = 1 / t; + matricesWeights[a] *= recip; + matricesWeights[a + 1] *= recip; + matricesWeights[a + 2] *= recip; + matricesWeights[a + 3] *= recip; + } } + this.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeights); } - /** - * Define the unique id of the texture in the scene. - */ - get uid() { - if (!this._uid) { - this._uid = RandomGUID(); + // handle special case of extra verts. (in theory gltf can handle 12 influences) + _normalizeSkinWeightsAndExtra() { + const matricesWeightsExtra = this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind); + const matricesWeights = this.getVerticesData(VertexBuffer.MatricesWeightsKind); + const numWeights = matricesWeights.length; + for (let a = 0; a < numWeights; a += 4) { + let t = matricesWeights[a] + matricesWeights[a + 1] + matricesWeights[a + 2] + matricesWeights[a + 3]; + t += matricesWeightsExtra[a] + matricesWeightsExtra[a + 1] + matricesWeightsExtra[a + 2] + matricesWeightsExtra[a + 3]; + if (t === 0) { + matricesWeights[a] = 1; + } else { + const recip = 1 / t; + matricesWeights[a] *= recip; + matricesWeights[a + 1] *= recip; + matricesWeights[a + 2] *= recip; + matricesWeights[a + 3] *= recip; + matricesWeightsExtra[a] *= recip; + matricesWeightsExtra[a + 1] *= recip; + matricesWeightsExtra[a + 2] *= recip; + matricesWeightsExtra[a + 3] *= recip; + } } - return this._uid; - } - /** - * Return a string representation of the texture. - * @returns the texture as a string - */ - toString() { - return this.name; + this.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeights); + this.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeightsExtra); } /** - * Get the class name of the texture. - * @returns "BaseTexture" + * ValidateSkinning is used to determine that a mesh has valid skinning data along with skin metrics, if missing weights, + * or not normalized it is returned as invalid mesh the string can be used for console logs, or on screen messages to let + * the user know there was an issue with importing the mesh + * @returns a validation object with skinned, valid and report string */ - getClassName() { - return "BaseTexture"; - } - /** - * Callback triggered when the texture has been disposed. - * Kept for back compatibility, you can use the onDisposeObservable instead. - */ - set onDispose(callback) { - if (this._onDisposeObserver) { - this.onDisposeObservable.remove(this._onDisposeObserver); + validateSkinning() { + const matricesWeightsExtra = this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind); + const matricesWeights = this.getVerticesData(VertexBuffer.MatricesWeightsKind); + if (matricesWeights === null || this.skeleton == null) { + return { skinned: false, valid: true, report: "not skinned" }; } - this._onDisposeObserver = this.onDisposeObservable.add(callback); - } - /** - * Define if the texture is preventing a material to render or not. - * If not and the texture is not ready, the engine will use a default black texture instead. - */ - get isBlocking() { - return true; - } - /** - * Was there any loading error? - */ - get loadingError() { - return this._loadingError; - } - /** - * If a loading error occurred this object will be populated with information about the error. - */ - get errorObject() { - return this._errorObject; - } - /** - * Instantiates a new BaseTexture. - * Base class of all the textures in babylon. - * It groups all the common properties the materials, post process, lights... might need - * in order to make a correct use of the texture. - * @param sceneOrEngine Define the scene or engine the texture belongs to - * @param internalTexture Define the internal texture associated with the texture - */ - constructor(sceneOrEngine, internalTexture = null) { - super(null); - this.metadata = null; - this.reservedDataStore = null; - this._hasAlpha = false; - this._getAlphaFromRGB = false; - this.level = 1; - this._coordinatesIndex = 0; - this.optimizeUVAllocation = true; - this._coordinatesMode = 0; - this.wrapR = 1; - this.anisotropicFilteringLevel = _BaseTexture.DEFAULT_ANISOTROPIC_FILTERING_LEVEL; - this._isCube = false; - this._gammaSpace = true; - this.invertZ = false; - this.lodLevelInAlpha = false; - this.isRenderTarget = false; - this._prefiltered = false; - this._forceSerialize = false; - this.animations = []; - this.onDisposeObservable = new Observable(); - this._onDisposeObserver = null; - this._scene = null; - this._uid = null; - this._parentContainer = null; - this._loadingError = false; - if (sceneOrEngine) { - if (_BaseTexture._IsScene(sceneOrEngine)) { - this._scene = sceneOrEngine; + const numWeights = matricesWeights.length; + let numberNotSorted = 0; + let missingWeights = 0; + let maxUsedWeights = 0; + let numberNotNormalized = 0; + const numInfluences = matricesWeightsExtra === null ? 4 : 8; + const usedWeightCounts = []; + for (let a = 0; a <= numInfluences; a++) { + usedWeightCounts[a] = 0; + } + const toleranceEpsilon = 1e-3; + for (let a = 0; a < numWeights; a += 4) { + let lastWeight = matricesWeights[a]; + let t = lastWeight; + let usedWeights = t === 0 ? 0 : 1; + for (let b = 1; b < numInfluences; b++) { + const d = b < 4 ? matricesWeights[a + b] : matricesWeightsExtra[a + b - 4]; + if (d > lastWeight) { + numberNotSorted++; + } + if (d !== 0) { + usedWeights++; + } + t += d; + lastWeight = d; + } + usedWeightCounts[usedWeights]++; + if (usedWeights > maxUsedWeights) { + maxUsedWeights = usedWeights; + } + if (t === 0) { + missingWeights++; } else { - this._engine = sceneOrEngine; + const recip = 1 / t; + let tolerance = 0; + for (let b = 0; b < numInfluences; b++) { + if (b < 4) { + tolerance += Math.abs(matricesWeights[a + b] - matricesWeights[a + b] * recip); + } else { + tolerance += Math.abs(matricesWeightsExtra[a + b - 4] - matricesWeightsExtra[a + b - 4] * recip); + } + } + if (tolerance > toleranceEpsilon) { + numberNotNormalized++; + } } - } else { - this._scene = EngineStore.LastCreatedScene; } - if (this._scene) { - this.uniqueId = this._scene.getUniqueId(); - this._scene.addTexture(this); - this._engine = this._scene.getEngine(); + const numBones = this.skeleton.bones.length; + const matricesIndices = this.getVerticesData(VertexBuffer.MatricesIndicesKind); + const matricesIndicesExtra = this.getVerticesData(VertexBuffer.MatricesIndicesExtraKind); + let numBadBoneIndices = 0; + for (let a = 0; a < numWeights; a += 4) { + for (let b = 0; b < numInfluences; b++) { + const index = b < 4 ? matricesIndices[a + b] : matricesIndicesExtra[a + b - 4]; + if (index >= numBones || index < 0) { + numBadBoneIndices++; + } + } } - this._texture = internalTexture; - this._uid = null; - } - /** - * Get the scene the texture belongs to. - * @returns the scene or null if undefined - */ - getScene() { - return this._scene; + const output = "Number of Weights = " + numWeights / 4 + "\nMaximum influences = " + maxUsedWeights + "\nMissing Weights = " + missingWeights + "\nNot Sorted = " + numberNotSorted + "\nNot Normalized = " + numberNotNormalized + "\nWeightCounts = [" + usedWeightCounts + "]\nNumber of bones = " + numBones + "\nBad Bone Indices = " + numBadBoneIndices; + return { skinned: true, valid: missingWeights === 0 && numberNotNormalized === 0 && numBadBoneIndices === 0, report: output }; } /** @internal */ - _getEngine() { - return this._engine; - } - /** - * Checks if the texture has the same transform matrix than another texture - * @param texture texture to check against - * @returns true if the transforms are the same, else false - */ - checkTransformsAreIdentical(texture) { - return texture !== null; + _checkDelayState() { + const scene = this.getScene(); + if (this._geometry) { + this._geometry.load(scene); + } else if (this.delayLoadState === 4) { + this.delayLoadState = 2; + this._queueLoad(scene); + } + return this; } - /** - * Get the texture transform matrix used to offset tile the texture for instance. - * @returns the transformation matrix - */ - getTextureMatrix() { - return Matrix.IdentityReadOnly; + _queueLoad(scene) { + scene.addPendingData(this); + const getBinaryData = this.delayLoadingFile.indexOf(".babylonbinarymeshdata") !== -1; + Tools.LoadFile(this.delayLoadingFile, (data) => { + if (data instanceof ArrayBuffer) { + this._delayLoadingFunction(data, this); + } else { + this._delayLoadingFunction(JSON.parse(data), this); + } + this.instances.forEach((instance) => { + instance.refreshBoundingInfo(); + instance._syncSubMeshes(); + }); + this.delayLoadState = 1; + scene.removePendingData(this); + }, () => { + }, scene.offlineProvider, getBinaryData); + return this; } /** - * Get the texture reflection matrix used to rotate/transform the reflection. - * @returns the reflection matrix + * Returns `true` if the mesh is within the frustum defined by the passed array of planes. + * A mesh is in the frustum if its bounding box intersects the frustum + * @param frustumPlanes defines the frustum to test + * @returns true if the mesh is in the frustum planes */ - getReflectionTextureMatrix() { - return Matrix.IdentityReadOnly; + isInFrustum(frustumPlanes) { + if (this.delayLoadState === 2) { + return false; + } + if (!super.isInFrustum(frustumPlanes)) { + return false; + } + this._checkDelayState(); + return true; } /** - * Gets a suitable rotate/transform matrix when the texture is used for refraction. - * There's a separate function from getReflectionTextureMatrix because refraction requires a special configuration of the matrix in right-handed mode. - * @returns The refraction matrix + * Sets the mesh material by the material or multiMaterial `id` property + * @param id is a string identifying the material or the multiMaterial + * @returns the current mesh */ - getRefractionTextureMatrix() { - return this.getReflectionTextureMatrix(); + setMaterialById(id) { + const materials = this.getScene().materials; + let index; + for (index = materials.length - 1; index > -1; index--) { + if (materials[index].id === id) { + this.material = materials[index]; + return this; + } + } + const multiMaterials = this.getScene().multiMaterials; + for (index = multiMaterials.length - 1; index > -1; index--) { + if (multiMaterials[index].id === id) { + this.material = multiMaterials[index]; + return this; + } + } + return this; } /** - * Get if the texture is ready to be consumed (either it is ready or it is not blocking) - * @returns true if ready, not blocking or if there was an error loading the texture + * Returns as a new array populated with the mesh material and/or skeleton, if any. + * @returns an array of IAnimatable */ - isReadyOrNotBlocking() { - return !this.isBlocking || this.isReady() || this.loadingError; + getAnimatables() { + const results = []; + if (this.material) { + results.push(this.material); + } + if (this.skeleton) { + results.push(this.skeleton); + } + return results; } /** - * Scales the texture if is `canRescale()` - * @param ratio the resize factor we want to use to rescale + * Modifies the mesh geometry according to the passed transformation matrix. + * This method returns nothing, but it really modifies the mesh even if it's originally not set as updatable. + * The mesh normals are modified using the same transformation. + * Note that, under the hood, this method sets a new VertexBuffer each call. + * @param transform defines the transform matrix to use + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms + * @returns the current mesh */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - scale(ratio) { + bakeTransformIntoVertices(transform) { + if (!this.isVerticesDataPresent(VertexBuffer.PositionKind)) { + return this; + } + const submeshes = this.subMeshes.splice(0); + this._resetPointsArrayCache(); + let data = this.getVerticesData(VertexBuffer.PositionKind); + const temp = Vector3.Zero(); + let index; + for (index = 0; index < data.length; index += 3) { + Vector3.TransformCoordinatesFromFloatsToRef(data[index], data[index + 1], data[index + 2], transform, temp).toArray(data, index); + } + this.setVerticesData(VertexBuffer.PositionKind, data, this.getVertexBuffer(VertexBuffer.PositionKind).isUpdatable()); + if (this.isVerticesDataPresent(VertexBuffer.NormalKind)) { + data = this.getVerticesData(VertexBuffer.NormalKind); + for (index = 0; index < data.length; index += 3) { + Vector3.TransformNormalFromFloatsToRef(data[index], data[index + 1], data[index + 2], transform, temp).normalize().toArray(data, index); + } + this.setVerticesData(VertexBuffer.NormalKind, data, this.getVertexBuffer(VertexBuffer.NormalKind).isUpdatable()); + } + if (this.isVerticesDataPresent(VertexBuffer.TangentKind)) { + data = this.getVerticesData(VertexBuffer.TangentKind); + for (index = 0; index < data.length; index += 4) { + Vector3.TransformNormalFromFloatsToRef(data[index], data[index + 1], data[index + 2], transform, temp).normalize().toArray(data, index); + } + this.setVerticesData(VertexBuffer.TangentKind, data, this.getVertexBuffer(VertexBuffer.TangentKind).isUpdatable()); + } + if (transform.determinant() < 0) { + this.flipFaces(); + } + this.releaseSubMeshes(); + this.subMeshes = submeshes; + return this; } /** - * Get if the texture can rescale. + * Modifies the mesh geometry according to its own current World Matrix. + * The mesh World Matrix is then reset. + * This method returns nothing but really modifies the mesh even if it's originally not set as updatable. + * Note that, under the hood, this method sets a new VertexBuffer each call. + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms + * @param bakeIndependentlyOfChildren indicates whether to preserve all child nodes' World Matrix during baking + * @returns the current mesh */ - get canRescale() { - return false; + bakeCurrentTransformIntoVertices(bakeIndependentlyOfChildren = true) { + this.bakeTransformIntoVertices(this.computeWorldMatrix(true)); + this.resetLocalMatrix(bakeIndependentlyOfChildren); + return this; } - /** - * @internal - */ - _getFromCache(url, noMipmap, sampling, invertY, useSRGBBuffer, isCube) { - const engine = this._getEngine(); - if (!engine) { - return null; + // Cache + /** @internal */ + get _positions() { + if (this._internalAbstractMeshDataInfo._positions) { + return this._internalAbstractMeshDataInfo._positions; } - const correctedUseSRGBBuffer = engine._getUseSRGBBuffer(!!useSRGBBuffer, noMipmap); - const texturesCache = engine.getLoadedTexturesCache(); - for (let index = 0; index < texturesCache.length; index++) { - const texturesCacheEntry = texturesCache[index]; - if (useSRGBBuffer === void 0 || correctedUseSRGBBuffer === texturesCacheEntry._useSRGBBuffer) { - if (invertY === void 0 || invertY === texturesCacheEntry.invertY) { - if (texturesCacheEntry.url === url && texturesCacheEntry.generateMipMaps === !noMipmap) { - if (!sampling || sampling === texturesCacheEntry.samplingMode) { - if (isCube === void 0 || isCube === texturesCacheEntry.isCube) { - texturesCacheEntry.incrementReferences(); - return texturesCacheEntry; - } - } - } - } - } + if (this._geometry) { + return this._geometry._positions; } return null; } /** @internal */ - _rebuild(_fromContextLost = false) { - } - /** - * Clones the texture. - * @returns the cloned texture - */ - clone() { - return null; - } - /** - * Get the texture underlying type (INT, FLOAT...) - */ - get textureType() { - if (!this._texture) { - return 0; + _resetPointsArrayCache() { + if (this._geometry) { + this._geometry._resetPointsArrayCache(); } - return this._texture.type !== void 0 ? this._texture.type : 0; + return this; } - /** - * Get the texture underlying format (RGB, RGBA...) - */ - get textureFormat() { - if (!this._texture) { - return 5; + /** @internal */ + _generatePointsArray() { + if (this._geometry) { + return this._geometry._generatePointsArray(); } - return this._texture.format !== void 0 ? this._texture.format : 5; + return false; } /** - * Indicates that textures need to be re-calculated for all materials + * Returns a new Mesh object generated from the current mesh properties. + * This method must not get confused with createInstance() + * @param name is a string, the name given to the new mesh + * @param newParent can be any Node object (default `null`) + * @param doNotCloneChildren allows/denies the recursive cloning of the original mesh children if any (default `false`) + * @param clonePhysicsImpostor allows/denies the cloning in the same time of the original mesh `body` used by the physics engine, if any (default `true`) + * @returns a new mesh */ - _markAllSubMeshesAsTexturesDirty() { - const scene = this.getScene(); - if (!scene) { - return; - } - scene.markAllMaterialsAsDirty(1); + clone(name69 = "", newParent = null, doNotCloneChildren, clonePhysicsImpostor = true) { + return new _Mesh(name69, this.getScene(), newParent, this, doNotCloneChildren, clonePhysicsImpostor); } /** - * Reads the pixels stored in the webgl texture and returns them as an ArrayBuffer. - * This will returns an RGBA array buffer containing either in values (0-255) or - * float values (0-1) depending of the underlying buffer type. - * @param faceIndex defines the face of the texture to read (in case of cube texture) - * @param level defines the LOD level of the texture to read (in case of Mip Maps) - * @param buffer defines a user defined buffer to fill with data (can be null) - * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels - * @param noDataConversion false to convert the data to Uint8Array (if texture type is UNSIGNED_BYTE) or to Float32Array (if texture type is anything but UNSIGNED_BYTE). If true, the type of the generated buffer (if buffer==null) will depend on the type of the texture - * @param x defines the region x coordinates to start reading from (default to 0) - * @param y defines the region y coordinates to start reading from (default to 0) - * @param width defines the region width to read from (default to the texture size at level) - * @param height defines the region width to read from (default to the texture size at level) - * @returns The Array buffer promise containing the pixels data. + * Releases resources associated with this mesh. + * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default) + * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default) */ - readPixels(faceIndex = 0, level = 0, buffer = null, flushRenderer = true, noDataConversion = false, x = 0, y = 0, width = Number.MAX_VALUE, height = Number.MAX_VALUE) { - if (!this._texture) { - return null; - } - const engine = this._getEngine(); - if (!engine) { - return null; + dispose(doNotRecurse, disposeMaterialAndTextures = false) { + this.morphTargetManager = null; + if (this._geometry) { + this._geometry.releaseForMesh(this, true); } - const size = this.getSize(); - let maxWidth = size.width; - let maxHeight = size.height; - if (level !== 0) { - maxWidth = maxWidth / Math.pow(2, level); - maxHeight = maxHeight / Math.pow(2, level); - maxWidth = Math.round(maxWidth); - maxHeight = Math.round(maxHeight); + const internalDataInfo = this._internalMeshDataInfo; + if (internalDataInfo._onBeforeDrawObservable) { + internalDataInfo._onBeforeDrawObservable.clear(); } - width = Math.min(maxWidth, width); - height = Math.min(maxHeight, height); - try { - if (this._texture.isCube) { - return engine._readTexturePixels(this._texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion, x, y); - } - return engine._readTexturePixels(this._texture, width, height, -1, level, buffer, flushRenderer, noDataConversion, x, y); - } catch (e) { - return null; + if (internalDataInfo._onBeforeBindObservable) { + internalDataInfo._onBeforeBindObservable.clear(); } - } - /** - * @internal - */ - _readPixelsSync(faceIndex = 0, level = 0, buffer = null, flushRenderer = true, noDataConversion = false) { - if (!this._texture) { - return null; + if (internalDataInfo._onBeforeRenderObservable) { + internalDataInfo._onBeforeRenderObservable.clear(); } - const size = this.getSize(); - let width = size.width; - let height = size.height; - const engine = this._getEngine(); - if (!engine) { - return null; + if (internalDataInfo._onAfterRenderObservable) { + internalDataInfo._onAfterRenderObservable.clear(); } - if (level != 0) { - width = width / Math.pow(2, level); - height = height / Math.pow(2, level); - width = Math.round(width); - height = Math.round(height); + if (internalDataInfo._onBetweenPassObservable) { + internalDataInfo._onBetweenPassObservable.clear(); } - try { - if (this._texture.isCube) { - return engine._readTexturePixelsSync(this._texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion); + if (this._scene.useClonedMeshMap) { + if (internalDataInfo.meshMap) { + for (const uniqueId in internalDataInfo.meshMap) { + const mesh = internalDataInfo.meshMap[uniqueId]; + if (mesh) { + mesh._internalMeshDataInfo._source = null; + internalDataInfo.meshMap[uniqueId] = void 0; + } + } } - return engine._readTexturePixelsSync(this._texture, width, height, -1, level, buffer, flushRenderer, noDataConversion); - } catch (e) { - return null; + if (internalDataInfo._source && internalDataInfo._source._internalMeshDataInfo.meshMap) { + internalDataInfo._source._internalMeshDataInfo.meshMap[this.uniqueId] = void 0; + } + } else { + const meshes = this.getScene().meshes; + for (const abstractMesh of meshes) { + const mesh = abstractMesh; + if (mesh._internalMeshDataInfo && mesh._internalMeshDataInfo._source && mesh._internalMeshDataInfo._source === this) { + mesh._internalMeshDataInfo._source = null; + } + } + } + internalDataInfo._source = null; + this._instanceDataStorage.visibleInstances = {}; + this._disposeInstanceSpecificData(); + this._disposeThinInstanceSpecificData(); + if (this._internalMeshDataInfo._checkReadinessObserver) { + this._scene.onBeforeRenderObservable.remove(this._internalMeshDataInfo._checkReadinessObserver); } + super.dispose(doNotRecurse, disposeMaterialAndTextures); } /** @internal */ - get _lodTextureHigh() { - if (this._texture) { - return this._texture._lodTextureHigh; - } - return null; + _disposeInstanceSpecificData() { } /** @internal */ - get _lodTextureMid() { - if (this._texture) { - return this._texture._lodTextureMid; - } - return null; + _disposeThinInstanceSpecificData() { } /** @internal */ - get _lodTextureLow() { - if (this._texture) { - return this._texture._lodTextureLow; - } - return null; + _invalidateInstanceVertexArrayObject() { } /** - * Dispose the texture and release its associated resources. - */ - dispose() { - if (this._scene) { - if (this._scene.stopAnimation) { - this._scene.stopAnimation(this); - } - this._scene.removePendingData(this); - const index = this._scene.textures.indexOf(this); - if (index >= 0) { - this._scene.textures.splice(index, 1); - } - this._scene.onTextureRemovedObservable.notifyObservers(this); - this._scene = null; - if (this._parentContainer) { - const index2 = this._parentContainer.textures.indexOf(this); - if (index2 > -1) { - this._parentContainer.textures.splice(index2, 1); - } - this._parentContainer = null; + * Modifies the mesh geometry according to a displacement map. + * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex. + * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated. + * @param url is a string, the URL from the image file is to be downloaded. + * @param minHeight is the lower limit of the displacement. + * @param maxHeight is the upper limit of the displacement. + * @param onSuccess is an optional Javascript function to be called just after the mesh is modified. It is passed the modified mesh and must return nothing. + * @param uvOffset is an optional vector2 used to offset UV. + * @param uvScale is an optional vector2 used to scale UV. + * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance. + * @param onError defines a callback called when an error occurs during the processing of the request. + * @returns the Mesh. + */ + applyDisplacementMap(url, minHeight, maxHeight, onSuccess, uvOffset, uvScale, forceUpdate = false, onError) { + const scene = this.getScene(); + const onload = (img) => { + const heightMapWidth = img.width; + const heightMapHeight = img.height; + const canvas = this.getEngine().createCanvas(heightMapWidth, heightMapHeight); + const context = canvas.getContext("2d"); + context.drawImage(img, 0, 0); + const buffer = context.getImageData(0, 0, heightMapWidth, heightMapHeight).data; + this.applyDisplacementMapFromBuffer(buffer, heightMapWidth, heightMapHeight, minHeight, maxHeight, uvOffset, uvScale, forceUpdate); + if (onSuccess) { + onSuccess(this); } - } - this.onDisposeObservable.notifyObservers(this); - this.onDisposeObservable.clear(); - this.metadata = null; - super.dispose(); + }; + Tools.LoadImage(url, onload, onError ? onError : () => { + }, scene.offlineProvider); + return this; } /** - * Serialize the texture into a JSON representation that can be parsed later on. - * @param allowEmptyName True to force serialization even if name is empty. Default: false - * @returns the JSON representation of the texture + * Modifies the mesh geometry according to a displacementMap buffer. + * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex. + * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated. + * @param buffer is a `Uint8Array` buffer containing series of `Uint8` lower than 255, the red, green, blue and alpha values of each successive pixel. + * @param heightMapWidth is the width of the buffer image. + * @param heightMapHeight is the height of the buffer image. + * @param minHeight is the lower limit of the displacement. + * @param maxHeight is the upper limit of the displacement. + * @param uvOffset is an optional vector2 used to offset UV. + * @param uvScale is an optional vector2 used to scale UV. + * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance. + * @returns the Mesh. */ - serialize(allowEmptyName = false) { - if (!this.name && !allowEmptyName) { - return null; + applyDisplacementMapFromBuffer(buffer, heightMapWidth, heightMapHeight, minHeight, maxHeight, uvOffset, uvScale, forceUpdate = false) { + if (!this.isVerticesDataPresent(VertexBuffer.PositionKind) || !this.isVerticesDataPresent(VertexBuffer.NormalKind) || !this.isVerticesDataPresent(VertexBuffer.UVKind)) { + Logger.Warn("Cannot call applyDisplacementMap: Given mesh is not complete. Position, Normal or UV are missing"); + return this; } - const serializationObject = SerializationHelper.Serialize(this); - SerializationHelper.AppendSerializedAnimations(this, serializationObject); - return serializationObject; + const positions = this.getVerticesData(VertexBuffer.PositionKind, true, true); + const normals = this.getVerticesData(VertexBuffer.NormalKind); + const uvs = this.getVerticesData(VertexBuffer.UVKind); + let position = Vector3.Zero(); + const normal = Vector3.Zero(); + const uv = Vector2.Zero(); + uvOffset = uvOffset || Vector2.Zero(); + uvScale = uvScale || new Vector2(1, 1); + for (let index = 0; index < positions.length; index += 3) { + Vector3.FromArrayToRef(positions, index, position); + Vector3.FromArrayToRef(normals, index, normal); + Vector2.FromArrayToRef(uvs, index / 3 * 2, uv); + const u = Math.abs(uv.x * uvScale.x + uvOffset.x % 1) * (heightMapWidth - 1) % heightMapWidth | 0; + const v = Math.abs(uv.y * uvScale.y + uvOffset.y % 1) * (heightMapHeight - 1) % heightMapHeight | 0; + const pos = (u + v * heightMapWidth) * 4; + const r = buffer[pos] / 255; + const g = buffer[pos + 1] / 255; + const b = buffer[pos + 2] / 255; + const gradient = r * 0.3 + g * 0.59 + b * 0.11; + normal.normalize(); + normal.scaleInPlace(minHeight + (maxHeight - minHeight) * gradient); + position = position.add(normal); + position.toArray(positions, index); + } + VertexData.ComputeNormals(positions, this.getIndices(), normals); + if (forceUpdate) { + this.setVerticesData(VertexBuffer.PositionKind, positions); + this.setVerticesData(VertexBuffer.NormalKind, normals); + this.setVerticesData(VertexBuffer.UVKind, uvs); + } else { + this.updateVerticesData(VertexBuffer.PositionKind, positions); + this.updateVerticesData(VertexBuffer.NormalKind, normals); + } + return this; } - /** - * Helper function to be called back once a list of texture contains only ready textures. - * @param textures Define the list of textures to wait for - * @param callback Define the callback triggered once the entire list will be ready - */ - static WhenAllReady(textures, callback) { - let numRemaining = textures.length; - if (numRemaining === 0) { - callback(); - return; + _getFlattenedNormals(indices, positions) { + const normals = new Float32Array(indices.length * 3); + let normalsCount = 0; + const flipNormalGeneration = this.overrideMaterialSideOrientation === (this._scene.useRightHandedSystem ? 1 : 0); + for (let index = 0; index < indices.length; index += 3) { + const p1 = Vector3.FromArray(positions, indices[index] * 3); + const p2 = Vector3.FromArray(positions, indices[index + 1] * 3); + const p3 = Vector3.FromArray(positions, indices[index + 2] * 3); + const p1p2 = p1.subtract(p2); + const p3p2 = p3.subtract(p2); + const normal = Vector3.Normalize(Vector3.Cross(p1p2, p3p2)); + if (flipNormalGeneration) { + normal.scaleInPlace(-1); + } + for (let localIndex = 0; localIndex < 3; localIndex++) { + normals[normalsCount++] = normal.x; + normals[normalsCount++] = normal.y; + normals[normalsCount++] = normal.z; + } } - for (let i = 0; i < textures.length; i++) { - const texture = textures[i]; - if (texture.isReady()) { - if (--numRemaining === 0) { - callback(); + return normals; + } + _convertToUnIndexedMesh(flattenNormals = false) { + const kinds = this.getVerticesDataKinds(); + const indices = this.getIndices(); + const data = {}; + const separateVertices = (data2, stride) => { + const newData = new Float32Array(indices.length * stride); + let count = 0; + for (let index = 0; index < indices.length; index++) { + for (let offset = 0; offset < stride; offset++) { + newData[count++] = data2[indices[index] * stride + offset]; } + } + return newData; + }; + const previousSubmeshes = this.geometry ? this.subMeshes.slice(0) : []; + for (const kind of kinds) { + data[kind] = this.getVerticesData(kind); + } + for (const kind of kinds) { + const vertexBuffer = this.getVertexBuffer(kind); + const stride = vertexBuffer.getStrideSize(); + if (flattenNormals && kind === VertexBuffer.NormalKind) { + const normals = this._getFlattenedNormals(indices, data[VertexBuffer.PositionKind]); + this.setVerticesData(VertexBuffer.NormalKind, normals, vertexBuffer.isUpdatable(), stride); } else { - const onLoadObservable = texture.onLoadObservable; - if (onLoadObservable) { - onLoadObservable.addOnce(() => { - if (--numRemaining === 0) { - callback(); - } - }); - } else { - if (--numRemaining === 0) { - callback(); - } - } + this.setVerticesData(kind, separateVertices(data[kind], stride), vertexBuffer.isUpdatable(), stride); } } - } - static _IsScene(sceneOrEngine) { - return sceneOrEngine.getClassName() === "Scene"; - } -}; -BaseTexture.DEFAULT_ANISOTROPIC_FILTERING_LEVEL = 4; -__decorate([ - serialize() -], BaseTexture.prototype, "uniqueId", void 0); -__decorate([ - serialize() -], BaseTexture.prototype, "name", void 0); -__decorate([ - serialize() -], BaseTexture.prototype, "metadata", void 0); -__decorate([ - serialize("hasAlpha") -], BaseTexture.prototype, "_hasAlpha", void 0); -__decorate([ - serialize("getAlphaFromRGB") -], BaseTexture.prototype, "_getAlphaFromRGB", void 0); -__decorate([ - serialize() -], BaseTexture.prototype, "level", void 0); -__decorate([ - serialize("coordinatesIndex") -], BaseTexture.prototype, "_coordinatesIndex", void 0); -__decorate([ - serialize() -], BaseTexture.prototype, "optimizeUVAllocation", void 0); -__decorate([ - serialize("coordinatesMode") -], BaseTexture.prototype, "_coordinatesMode", void 0); -__decorate([ - serialize() -], BaseTexture.prototype, "wrapU", null); -__decorate([ - serialize() -], BaseTexture.prototype, "wrapV", null); -__decorate([ - serialize() -], BaseTexture.prototype, "wrapR", void 0); -__decorate([ - serialize() -], BaseTexture.prototype, "anisotropicFilteringLevel", void 0); -__decorate([ - serialize() -], BaseTexture.prototype, "isCube", null); -__decorate([ - serialize() -], BaseTexture.prototype, "is3D", null); -__decorate([ - serialize() -], BaseTexture.prototype, "is2DArray", null); -__decorate([ - serialize() -], BaseTexture.prototype, "gammaSpace", null); -__decorate([ - serialize() -], BaseTexture.prototype, "invertZ", void 0); -__decorate([ - serialize() -], BaseTexture.prototype, "lodLevelInAlpha", void 0); -__decorate([ - serialize() -], BaseTexture.prototype, "lodGenerationOffset", null); -__decorate([ - serialize() -], BaseTexture.prototype, "lodGenerationScale", null); -__decorate([ - serialize() -], BaseTexture.prototype, "linearSpecularLOD", null); -__decorate([ - serializeAsTexture() -], BaseTexture.prototype, "irradianceTexture", null); -__decorate([ - serialize() -], BaseTexture.prototype, "isRenderTarget", void 0); - -// node_modules/@babylonjs/core/Misc/copyTools.js -function GenerateBase64StringFromPixelData(pixels, size, invertY = false) { - const width = size.width; - const height = size.height; - if (pixels instanceof Float32Array) { - let len = pixels.byteLength / pixels.BYTES_PER_ELEMENT; - const npixels = new Uint8Array(len); - while (--len >= 0) { - let val = pixels[len]; - if (val < 0) { - val = 0; - } else if (val > 1) { - val = 1; + if (this.morphTargetManager) { + for (let targetIndex = 0; targetIndex < this.morphTargetManager.numTargets; targetIndex++) { + const target = this.morphTargetManager.getTarget(targetIndex); + const positions = target.getPositions(); + target.setPositions(separateVertices(positions, 3)); + const normals = target.getNormals(); + if (normals) { + target.setNormals(flattenNormals ? this._getFlattenedNormals(indices, positions) : separateVertices(normals, 3)); + } + const tangents = target.getTangents(); + if (tangents) { + target.setTangents(separateVertices(tangents, 3)); + } + const uvs = target.getUVs(); + if (uvs) { + target.setUVs(separateVertices(uvs, 2)); + } } - npixels[len] = val * 255; + this.morphTargetManager.synchronize(); } - pixels = npixels; - } - const canvas = document.createElement("canvas"); - canvas.width = width; - canvas.height = height; - const ctx = canvas.getContext("2d"); - if (!ctx) { - return null; - } - const imageData = ctx.createImageData(width, height); - const castData = imageData.data; - castData.set(pixels); - ctx.putImageData(imageData, 0, 0); - if (invertY) { - const canvas2 = document.createElement("canvas"); - canvas2.width = width; - canvas2.height = height; - const ctx2 = canvas2.getContext("2d"); - if (!ctx2) { - return null; + for (let index = 0; index < indices.length; index++) { + indices[index] = index; } - ctx2.translate(0, height); - ctx2.scale(1, -1); - ctx2.drawImage(canvas, 0, 0); - return canvas2.toDataURL("image/png"); - } - return canvas.toDataURL("image/png"); -} -function GenerateBase64StringFromTexture(texture, faceIndex = 0, level = 0) { - const internalTexture = texture.getInternalTexture(); - if (!internalTexture) { - return null; - } - const pixels = texture._readPixelsSync(faceIndex, level); - if (!pixels) { - return null; - } - return GenerateBase64StringFromPixelData(pixels, texture.getSize(), internalTexture.invertY); -} -async function GenerateBase64StringFromTextureAsync(texture, faceIndex = 0, level = 0) { - const internalTexture = texture.getInternalTexture(); - if (!internalTexture) { - return null; - } - const pixels = await texture.readPixels(faceIndex, level); - if (!pixels) { - return null; - } - return GenerateBase64StringFromPixelData(pixels, texture.getSize(), internalTexture.invertY); -} -var CopyTools = { - /** - * Transform some pixel data to a base64 string - * @param pixels defines the pixel data to transform to base64 - * @param size defines the width and height of the (texture) data - * @param invertY true if the data must be inverted for the Y coordinate during the conversion - * @returns The base64 encoded string or null - */ - GenerateBase64StringFromPixelData, - /** - * Reads the pixels stored in the webgl texture and returns them as a base64 string - * @param texture defines the texture to read pixels from - * @param faceIndex defines the face of the texture to read (in case of cube texture) - * @param level defines the LOD level of the texture to read (in case of Mip Maps) - * @returns The base64 encoded string or null - */ - GenerateBase64StringFromTexture, - /** - * Reads the pixels stored in the webgl texture and returns them as a base64 string - * @param texture defines the texture to read pixels from - * @param faceIndex defines the face of the texture to read (in case of cube texture) - * @param level defines the LOD level of the texture to read (in case of Mip Maps) - * @returns The base64 encoded string or null wrapped in a promise - */ - GenerateBase64StringFromTextureAsync -}; - -// node_modules/@babylonjs/core/Materials/Textures/texture.js -var Texture = class _Texture extends BaseTexture { - /** - * @internal - */ - static _CreateVideoTexture(name69, src, scene, generateMipMaps = false, invertY = false, samplingMode = _Texture.TRILINEAR_SAMPLINGMODE, settings = {}, onError, format = 5) { - throw _WarnImport("VideoTexture"); + this.setIndices(indices); + this._unIndexed = true; + this.releaseSubMeshes(); + for (const previousOne of previousSubmeshes) { + SubMesh.AddToMesh(previousOne.materialIndex, previousOne.indexStart, previousOne.indexCount, previousOne.indexStart, previousOne.indexCount, this); + } + this.synchronizeInstances(); + return this; } /** - * Are mip maps generated for this texture or not. + * Modify the mesh to get a flat shading rendering. + * This means each mesh facet will then have its own normals. Usually new vertices are added in the mesh geometry to get this result. + * Warning : the mesh is really modified even if not set originally as updatable and, under the hood, a new VertexBuffer is allocated. + * @returns current mesh */ - get noMipmap() { - return this._noMipmap; - } - /** Returns the texture mime type if it was defined by a loader (undefined else) */ - get mimeType() { - return this._mimeType; + convertToFlatShadedMesh() { + return this._convertToUnIndexedMesh(true); } /** - * Is the texture preventing material to render while loading. - * If false, a default texture will be used instead of the loading one during the preparation step. + * This method removes all the mesh indices and add new vertices (duplication) in order to unfold facets into buffers. + * In other words, more vertices, no more indices and a single bigger VBO. + * The mesh is really modified even if not set originally as updatable. Under the hood, a new VertexBuffer is allocated. + * @returns current mesh */ - set isBlocking(value) { - this._isBlocking = value; - } - get isBlocking() { - return this._isBlocking; + convertToUnIndexedMesh() { + return this._convertToUnIndexedMesh(); } /** - * Gets a boolean indicating if the texture needs to be inverted on the y axis during loading + * Inverses facet orientations. + * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call. + * @param flipNormals will also inverts the normals + * @returns current mesh */ - get invertY() { - return this._invertY; + flipFaces(flipNormals = false) { + const vertex_data = VertexData.ExtractFromMesh(this); + let i; + if (flipNormals && this.isVerticesDataPresent(VertexBuffer.NormalKind) && vertex_data.normals) { + for (i = 0; i < vertex_data.normals.length; i++) { + vertex_data.normals[i] *= -1; + } + } + if (vertex_data.indices) { + let temp; + for (i = 0; i < vertex_data.indices.length; i += 3) { + temp = vertex_data.indices[i + 1]; + vertex_data.indices[i + 1] = vertex_data.indices[i + 2]; + vertex_data.indices[i + 2] = temp; + } + } + vertex_data.applyToMesh(this, this.isVertexBufferUpdatable(VertexBuffer.PositionKind)); + return this; } /** - * Instantiates a new texture. - * This represents a texture in babylon. It can be easily loaded from a network, base64 or html input. - * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#texture - * @param url defines the url of the picture to load as a texture - * @param sceneOrEngine defines the scene or engine the texture will belong to - * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture - * @param invertY defines if the texture needs to be inverted on the y axis during loading - * @param samplingMode defines the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...) - * @param onLoad defines a callback triggered when the texture has been loaded - * @param onError defines a callback triggered when an error occurred during the loading session - * @param buffer defines the buffer to load the texture from in case the texture is loaded from a buffer representation - * @param deleteBuffer defines if the buffer we are loading the texture from should be deleted after load - * @param format defines the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...) - * @param mimeType defines an optional mime type information - * @param loaderOptions options to be passed to the loader - * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg) - * @param forcedExtension defines the extension to use to pick the right loader + * Increase the number of facets and hence vertices in a mesh + * Vertex normals are interpolated from existing vertex normals + * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call. + * @param numberPerEdge the number of new vertices to add to each edge of a facet, optional default 1 */ - constructor(url, sceneOrEngine, noMipmapOrOptions, invertY, samplingMode = _Texture.TRILINEAR_SAMPLINGMODE, onLoad = null, onError = null, buffer = null, deleteBuffer = false, format, mimeType, loaderOptions, creationFlags, forcedExtension) { - super(sceneOrEngine); - this.url = null; - this.uOffset = 0; - this.vOffset = 0; - this.uScale = 1; - this.vScale = 1; - this.uAng = 0; - this.vAng = 0; - this.wAng = 0; - this.uRotationCenter = 0.5; - this.vRotationCenter = 0.5; - this.wRotationCenter = 0.5; - this.homogeneousRotationInUVTransform = false; - this.inspectableCustomProperties = null; - this._noMipmap = false; - this._invertY = false; - this._rowGenerationMatrix = null; - this._cachedTextureMatrix = null; - this._projectionModeMatrix = null; - this._t0 = null; - this._t1 = null; - this._t2 = null; - this._cachedUOffset = -1; - this._cachedVOffset = -1; - this._cachedUScale = 0; - this._cachedVScale = 0; - this._cachedUAng = -1; - this._cachedVAng = -1; - this._cachedWAng = -1; - this._cachedReflectionProjectionMatrixId = -1; - this._cachedURotationCenter = -1; - this._cachedVRotationCenter = -1; - this._cachedWRotationCenter = -1; - this._cachedHomogeneousRotationInUVTransform = false; - this._cachedIdentity3x2 = true; - this._cachedReflectionTextureMatrix = null; - this._cachedReflectionUOffset = -1; - this._cachedReflectionVOffset = -1; - this._cachedReflectionUScale = 0; - this._cachedReflectionVScale = 0; - this._cachedReflectionCoordinatesMode = -1; - this._buffer = null; - this._deleteBuffer = false; - this._format = null; - this._delayedOnLoad = null; - this._delayedOnError = null; - this.onLoadObservable = new Observable(); - this._isBlocking = true; - this.name = url || ""; - this.url = url; - let noMipmap; - let useSRGBBuffer = false; - let internalTexture = null; - let gammaSpace = true; - if (typeof noMipmapOrOptions === "object" && noMipmapOrOptions !== null) { - noMipmap = noMipmapOrOptions.noMipmap ?? false; - invertY = noMipmapOrOptions.invertY ?? (CompatibilityOptions.UseOpenGLOrientationForUV ? false : true); - samplingMode = noMipmapOrOptions.samplingMode ?? _Texture.TRILINEAR_SAMPLINGMODE; - onLoad = noMipmapOrOptions.onLoad ?? null; - onError = noMipmapOrOptions.onError ?? null; - buffer = noMipmapOrOptions.buffer ?? null; - deleteBuffer = noMipmapOrOptions.deleteBuffer ?? false; - format = noMipmapOrOptions.format; - mimeType = noMipmapOrOptions.mimeType; - loaderOptions = noMipmapOrOptions.loaderOptions; - creationFlags = noMipmapOrOptions.creationFlags; - useSRGBBuffer = noMipmapOrOptions.useSRGBBuffer ?? false; - internalTexture = noMipmapOrOptions.internalTexture ?? null; - gammaSpace = noMipmapOrOptions.gammaSpace ?? gammaSpace; + increaseVertices(numberPerEdge = 1) { + const vertex_data = VertexData.ExtractFromMesh(this); + const currentIndices = vertex_data.indices && !Array.isArray(vertex_data.indices) && Array.from ? Array.from(vertex_data.indices) : vertex_data.indices; + const positions = vertex_data.positions && !Array.isArray(vertex_data.positions) && Array.from ? Array.from(vertex_data.positions) : vertex_data.positions; + const uvs = vertex_data.uvs && !Array.isArray(vertex_data.uvs) && Array.from ? Array.from(vertex_data.uvs) : vertex_data.uvs; + const normals = vertex_data.normals && !Array.isArray(vertex_data.normals) && Array.from ? Array.from(vertex_data.normals) : vertex_data.normals; + if (!currentIndices || !positions) { + Logger.Warn("Couldn't increase number of vertices : VertexData must contain at least indices and positions"); } else { - noMipmap = !!noMipmapOrOptions; - } - this._gammaSpace = gammaSpace; - this._noMipmap = noMipmap; - this._invertY = invertY === void 0 ? CompatibilityOptions.UseOpenGLOrientationForUV ? false : true : invertY; - this._initialSamplingMode = samplingMode; - this._buffer = buffer; - this._deleteBuffer = deleteBuffer; - this._mimeType = mimeType; - this._loaderOptions = loaderOptions; - this._creationFlags = creationFlags; - this._useSRGBBuffer = useSRGBBuffer; - this._forcedExtension = forcedExtension; - if (format) { - this._format = format; - } - const scene = this.getScene(); - const engine = this._getEngine(); - if (!engine) { - return; - } - engine.onBeforeTextureInitObservable.notifyObservers(this); - const load = () => { - if (this._texture) { - if (this._texture._invertVScale) { - this.vScale *= -1; - this.vOffset += 1; + vertex_data.indices = currentIndices; + vertex_data.positions = positions; + if (uvs) { + vertex_data.uvs = uvs; + } + if (normals) { + vertex_data.normals = normals; + } + const segments = numberPerEdge + 1; + const tempIndices = new Array(); + for (let i = 0; i < segments + 1; i++) { + tempIndices[i] = new Array(); + } + let a; + let b; + const deltaPosition = new Vector3(0, 0, 0); + const deltaNormal = new Vector3(0, 0, 0); + const deltaUV = new Vector2(0, 0); + const indices = new Array(); + const vertexIndex = new Array(); + const side = new Array(); + let len; + let positionPtr = positions.length; + let uvPtr; + if (uvs) { + uvPtr = uvs.length; + } + let normalsPtr; + if (normals) { + normalsPtr = normals.length; + } + for (let i = 0; i < currentIndices.length; i += 3) { + vertexIndex[0] = currentIndices[i]; + vertexIndex[1] = currentIndices[i + 1]; + vertexIndex[2] = currentIndices[i + 2]; + for (let j = 0; j < 3; j++) { + a = vertexIndex[j]; + b = vertexIndex[(j + 1) % 3]; + if (side[a] === void 0 && side[b] === void 0) { + side[a] = new Array(); + side[b] = new Array(); + } else { + if (side[a] === void 0) { + side[a] = new Array(); + } + if (side[b] === void 0) { + side[b] = new Array(); + } + } + if (side[a][b] === void 0 && side[b][a] === void 0) { + side[a][b] = []; + deltaPosition.x = (positions[3 * b] - positions[3 * a]) / segments; + deltaPosition.y = (positions[3 * b + 1] - positions[3 * a + 1]) / segments; + deltaPosition.z = (positions[3 * b + 2] - positions[3 * a + 2]) / segments; + if (normals) { + deltaNormal.x = (normals[3 * b] - normals[3 * a]) / segments; + deltaNormal.y = (normals[3 * b + 1] - normals[3 * a + 1]) / segments; + deltaNormal.z = (normals[3 * b + 2] - normals[3 * a + 2]) / segments; + } + if (uvs) { + deltaUV.x = (uvs[2 * b] - uvs[2 * a]) / segments; + deltaUV.y = (uvs[2 * b + 1] - uvs[2 * a + 1]) / segments; + } + side[a][b].push(a); + for (let k = 1; k < segments; k++) { + side[a][b].push(positions.length / 3); + positions[positionPtr++] = positions[3 * a] + k * deltaPosition.x; + positions[positionPtr++] = positions[3 * a + 1] + k * deltaPosition.y; + positions[positionPtr++] = positions[3 * a + 2] + k * deltaPosition.z; + if (normals) { + normals[normalsPtr++] = normals[3 * a] + k * deltaNormal.x; + normals[normalsPtr++] = normals[3 * a + 1] + k * deltaNormal.y; + normals[normalsPtr++] = normals[3 * a + 2] + k * deltaNormal.z; + } + if (uvs) { + uvs[uvPtr++] = uvs[2 * a] + k * deltaUV.x; + uvs[uvPtr++] = uvs[2 * a + 1] + k * deltaUV.y; + } + } + side[a][b].push(b); + side[b][a] = new Array(); + len = side[a][b].length; + for (let idx = 0; idx < len; idx++) { + side[b][a][idx] = side[a][b][len - 1 - idx]; + } + } } - if (this._texture._cachedWrapU !== null) { - this.wrapU = this._texture._cachedWrapU; - this._texture._cachedWrapU = null; + tempIndices[0][0] = currentIndices[i]; + tempIndices[1][0] = side[currentIndices[i]][currentIndices[i + 1]][1]; + tempIndices[1][1] = side[currentIndices[i]][currentIndices[i + 2]][1]; + for (let k = 2; k < segments; k++) { + tempIndices[k][0] = side[currentIndices[i]][currentIndices[i + 1]][k]; + tempIndices[k][k] = side[currentIndices[i]][currentIndices[i + 2]][k]; + deltaPosition.x = (positions[3 * tempIndices[k][k]] - positions[3 * tempIndices[k][0]]) / k; + deltaPosition.y = (positions[3 * tempIndices[k][k] + 1] - positions[3 * tempIndices[k][0] + 1]) / k; + deltaPosition.z = (positions[3 * tempIndices[k][k] + 2] - positions[3 * tempIndices[k][0] + 2]) / k; + if (normals) { + deltaNormal.x = (normals[3 * tempIndices[k][k]] - normals[3 * tempIndices[k][0]]) / k; + deltaNormal.y = (normals[3 * tempIndices[k][k] + 1] - normals[3 * tempIndices[k][0] + 1]) / k; + deltaNormal.z = (normals[3 * tempIndices[k][k] + 2] - normals[3 * tempIndices[k][0] + 2]) / k; + } + if (uvs) { + deltaUV.x = (uvs[2 * tempIndices[k][k]] - uvs[2 * tempIndices[k][0]]) / k; + deltaUV.y = (uvs[2 * tempIndices[k][k] + 1] - uvs[2 * tempIndices[k][0] + 1]) / k; + } + for (let j = 1; j < k; j++) { + tempIndices[k][j] = positions.length / 3; + positions[positionPtr++] = positions[3 * tempIndices[k][0]] + j * deltaPosition.x; + positions[positionPtr++] = positions[3 * tempIndices[k][0] + 1] + j * deltaPosition.y; + positions[positionPtr++] = positions[3 * tempIndices[k][0] + 2] + j * deltaPosition.z; + if (normals) { + normals[normalsPtr++] = normals[3 * tempIndices[k][0]] + j * deltaNormal.x; + normals[normalsPtr++] = normals[3 * tempIndices[k][0] + 1] + j * deltaNormal.y; + normals[normalsPtr++] = normals[3 * tempIndices[k][0] + 2] + j * deltaNormal.z; + } + if (uvs) { + uvs[uvPtr++] = uvs[2 * tempIndices[k][0]] + j * deltaUV.x; + uvs[uvPtr++] = uvs[2 * tempIndices[k][0] + 1] + j * deltaUV.y; + } + } } - if (this._texture._cachedWrapV !== null) { - this.wrapV = this._texture._cachedWrapV; - this._texture._cachedWrapV = null; + tempIndices[segments] = side[currentIndices[i + 1]][currentIndices[i + 2]]; + indices.push(tempIndices[0][0], tempIndices[1][0], tempIndices[1][1]); + for (let k = 1; k < segments; k++) { + let j; + for (j = 0; j < k; j++) { + indices.push(tempIndices[k][j], tempIndices[k + 1][j], tempIndices[k + 1][j + 1]); + indices.push(tempIndices[k][j], tempIndices[k + 1][j + 1], tempIndices[k][j + 1]); + } + indices.push(tempIndices[k][j], tempIndices[k + 1][j], tempIndices[k + 1][j + 1]); } - if (this._texture._cachedWrapR !== null) { - this.wrapR = this._texture._cachedWrapR; - this._texture._cachedWrapR = null; + } + vertex_data.indices = indices; + vertex_data.applyToMesh(this, this.isVertexBufferUpdatable(VertexBuffer.PositionKind)); + } + } + /** + * Force adjacent facets to share vertices and remove any facets that have all vertices in a line + * This will undo any application of covertToFlatShadedMesh + * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call. + */ + forceSharedVertices() { + const vertex_data = VertexData.ExtractFromMesh(this); + const currentUVs = vertex_data.uvs; + const currentIndices = vertex_data.indices; + const currentPositions = vertex_data.positions; + const currentColors = vertex_data.colors; + const currentMatrixIndices = vertex_data.matricesIndices; + const currentMatrixWeights = vertex_data.matricesWeights; + const currentMatrixIndicesExtra = vertex_data.matricesIndicesExtra; + const currentMatrixWeightsExtra = vertex_data.matricesWeightsExtra; + if (currentIndices === void 0 || currentPositions === void 0 || currentIndices === null || currentPositions === null) { + Logger.Warn("VertexData contains empty entries"); + } else { + const positions = new Array(); + const indices = new Array(); + const uvs = new Array(); + const colors = new Array(); + const matrixIndices = new Array(); + const matrixWeights = new Array(); + const matrixIndicesExtra = new Array(); + const matrixWeightsExtra = new Array(); + let pstring = new Array(); + let indexPtr = 0; + const uniquePositions = {}; + let ptr; + let facet; + for (let i = 0; i < currentIndices.length; i += 3) { + facet = [currentIndices[i], currentIndices[i + 1], currentIndices[i + 2]]; + pstring = []; + for (let j = 0; j < 3; j++) { + pstring[j] = ""; + for (let k = 0; k < 3; k++) { + if (Math.abs(currentPositions[3 * facet[j] + k]) < 1e-8) { + currentPositions[3 * facet[j] + k] = 0; + } + pstring[j] += currentPositions[3 * facet[j] + k] + "|"; + } + } + if (!(pstring[0] == pstring[1] || pstring[0] == pstring[2] || pstring[1] == pstring[2])) { + for (let j = 0; j < 3; j++) { + ptr = uniquePositions[pstring[j]]; + if (ptr === void 0) { + uniquePositions[pstring[j]] = indexPtr; + ptr = indexPtr++; + for (let k = 0; k < 3; k++) { + positions.push(currentPositions[3 * facet[j] + k]); + } + if (currentColors !== null && currentColors !== void 0) { + for (let k = 0; k < 4; k++) { + colors.push(currentColors[4 * facet[j] + k]); + } + } + if (currentUVs !== null && currentUVs !== void 0) { + for (let k = 0; k < 2; k++) { + uvs.push(currentUVs[2 * facet[j] + k]); + } + } + if (currentMatrixIndices !== null && currentMatrixIndices !== void 0) { + for (let k = 0; k < 4; k++) { + matrixIndices.push(currentMatrixIndices[4 * facet[j] + k]); + } + } + if (currentMatrixWeights !== null && currentMatrixWeights !== void 0) { + for (let k = 0; k < 4; k++) { + matrixWeights.push(currentMatrixWeights[4 * facet[j] + k]); + } + } + if (currentMatrixIndicesExtra !== null && currentMatrixIndicesExtra !== void 0) { + for (let k = 0; k < 4; k++) { + matrixIndicesExtra.push(currentMatrixIndicesExtra[4 * facet[j] + k]); + } + } + if (currentMatrixWeightsExtra !== null && currentMatrixWeightsExtra !== void 0) { + for (let k = 0; k < 4; k++) { + matrixWeightsExtra.push(currentMatrixWeightsExtra[4 * facet[j] + k]); + } + } + } + indices.push(ptr); + } } } - if (this.onLoadObservable.hasObservers()) { - this.onLoadObservable.notifyObservers(this); + const normals = new Array(); + VertexData.ComputeNormals(positions, indices, normals); + vertex_data.positions = positions; + vertex_data.indices = indices; + vertex_data.normals = normals; + if (currentUVs !== null && currentUVs !== void 0) { + vertex_data.uvs = uvs; } - if (onLoad) { - onLoad(); + if (currentColors !== null && currentColors !== void 0) { + vertex_data.colors = colors; } - if (!this.isBlocking && scene) { - scene.resetCachedMaterial(); + if (currentMatrixIndices !== null && currentMatrixIndices !== void 0) { + vertex_data.matricesIndices = matrixIndices; } - }; - const errorHandler = (message, exception) => { - this._loadingError = true; - this._errorObject = { message, exception }; - if (onError) { - onError(message, exception); + if (currentMatrixWeights !== null && currentMatrixWeights !== void 0) { + vertex_data.matricesWeights = matrixWeights; } - _Texture.OnTextureLoadErrorObservable.notifyObservers(this); - }; - if (!this.url && !internalTexture) { - this._delayedOnLoad = load; - this._delayedOnError = errorHandler; - return; - } - this._texture = internalTexture ?? this._getFromCache(this.url, noMipmap, samplingMode, this._invertY, useSRGBBuffer, this.isCube); - if (!this._texture) { - if (!scene || !scene.useDelayedTextureLoading) { - try { - this._texture = engine.createTexture(this.url, noMipmap, this._invertY, scene, samplingMode, load, errorHandler, this._buffer, void 0, this._format, this._forcedExtension, mimeType, loaderOptions, creationFlags, useSRGBBuffer); - } catch (e) { - errorHandler("error loading", e); - throw e; - } - if (deleteBuffer) { - this._buffer = null; - } - } else { - this.delayLoadState = 4; - this._delayedOnLoad = load; - this._delayedOnError = errorHandler; + if (currentMatrixIndicesExtra !== null && currentMatrixIndicesExtra !== void 0) { + vertex_data.matricesIndicesExtra = matrixIndicesExtra; } - } else { - if (this._texture.isReady) { - TimingTools.SetImmediate(() => load()); - } else { - const loadObserver = this._texture.onLoadedObservable.add(load); - this._texture.onErrorObservable.add((e) => { - var _a; - errorHandler(e.message, e.exception); - (_a = this._texture) == null ? void 0 : _a.onLoadedObservable.remove(loadObserver); - }); + if (currentMatrixWeights !== null && currentMatrixWeights !== void 0) { + vertex_data.matricesWeightsExtra = matrixWeightsExtra; } + vertex_data.applyToMesh(this, this.isVertexBufferUpdatable(VertexBuffer.PositionKind)); } } + // Instances /** - * Update the url (and optional buffer) of this texture if url was null during construction. - * @param url the url of the texture - * @param buffer the buffer of the texture (defaults to null) - * @param onLoad callback called when the texture is loaded (defaults to null) - * @param forcedExtension defines the extension to use to pick the right loader + * @internal */ - updateURL(url, buffer = null, onLoad, forcedExtension) { - if (this.url) { - this.releaseInternalTexture(); - this.getScene().markAllMaterialsAsDirty(1, (mat) => { - return mat.hasTexture(this); - }); - } - if (!this.name || this.name.startsWith("data:")) { - this.name = url; - } - this.url = url; - this._buffer = buffer; - this._forcedExtension = forcedExtension; - this.delayLoadState = 4; - if (onLoad) { - this._delayedOnLoad = onLoad; - } - this.delayLoad(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/naming-convention + static _instancedMeshFactory(name69, mesh) { + throw _WarnImport("InstancedMesh"); } /** - * Finish the loading sequence of a texture flagged as delayed load. * @internal */ - delayLoad() { - if (this.delayLoadState !== 4) { - return; - } - const scene = this.getScene(); - if (!scene) { - return; - } - this.delayLoadState = 1; - this._texture = this._getFromCache(this.url, this._noMipmap, this.samplingMode, this._invertY, this._useSRGBBuffer, this.isCube); - if (!this._texture) { - this._texture = scene.getEngine().createTexture(this.url, this._noMipmap, this._invertY, scene, this.samplingMode, this._delayedOnLoad, this._delayedOnError, this._buffer, null, this._format, this._forcedExtension, this._mimeType, this._loaderOptions, this._creationFlags, this._useSRGBBuffer); - if (this._deleteBuffer) { - this._buffer = null; - } - } else { - if (this._delayedOnLoad) { - if (this._texture.isReady) { - TimingTools.SetImmediate(this._delayedOnLoad); - } else { - this._texture.onLoadedObservable.add(this._delayedOnLoad); - } - } - } - this._delayedOnLoad = null; - this._delayedOnError = null; - } - _prepareRowForTextureGeneration(x, y, z, t) { - x *= this._cachedUScale; - y *= this._cachedVScale; - x -= this.uRotationCenter * this._cachedUScale; - y -= this.vRotationCenter * this._cachedVScale; - z -= this.wRotationCenter; - Vector3.TransformCoordinatesFromFloatsToRef(x, y, z, this._rowGenerationMatrix, t); - t.x += this.uRotationCenter * this._cachedUScale + this._cachedUOffset; - t.y += this.vRotationCenter * this._cachedVScale + this._cachedVOffset; - t.z += this.wRotationCenter; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + static _PhysicsImpostorParser(scene, physicObject, jsonObject) { + throw _WarnImport("PhysicsImpostor"); } /** - * Checks if the texture has the same transform matrix than another texture - * @param texture texture to check against - * @returns true if the transforms are the same, else false + * Creates a new InstancedMesh object from the mesh model. + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances + * @param name defines the name of the new instance + * @returns a new InstancedMesh */ - checkTransformsAreIdentical(texture) { - return texture !== null && this.uOffset === texture.uOffset && this.vOffset === texture.vOffset && this.uScale === texture.uScale && this.vScale === texture.vScale && this.uAng === texture.uAng && this.vAng === texture.vAng && this.wAng === texture.wAng; + createInstance(name69) { + return _Mesh._instancedMeshFactory(name69, this); } /** - * Get the current texture matrix which includes the requested offsetting, tiling and rotation components. - * @param uBase The horizontal base offset multiplier (1 by default) - * @returns the transform matrix of the texture. + * Synchronises all the mesh instance submeshes to the current mesh submeshes, if any. + * After this call, all the mesh instances have the same submeshes than the current mesh. + * @returns the current mesh */ - getTextureMatrix(uBase = 1) { - if (this.uOffset === this._cachedUOffset && this.vOffset === this._cachedVOffset && this.uScale * uBase === this._cachedUScale && this.vScale === this._cachedVScale && this.uAng === this._cachedUAng && this.vAng === this._cachedVAng && this.wAng === this._cachedWAng && this.uRotationCenter === this._cachedURotationCenter && this.vRotationCenter === this._cachedVRotationCenter && this.wRotationCenter === this._cachedWRotationCenter && this.homogeneousRotationInUVTransform === this._cachedHomogeneousRotationInUVTransform) { - return this._cachedTextureMatrix; - } - this._cachedUOffset = this.uOffset; - this._cachedVOffset = this.vOffset; - this._cachedUScale = this.uScale * uBase; - this._cachedVScale = this.vScale; - this._cachedUAng = this.uAng; - this._cachedVAng = this.vAng; - this._cachedWAng = this.wAng; - this._cachedURotationCenter = this.uRotationCenter; - this._cachedVRotationCenter = this.vRotationCenter; - this._cachedWRotationCenter = this.wRotationCenter; - this._cachedHomogeneousRotationInUVTransform = this.homogeneousRotationInUVTransform; - if (!this._cachedTextureMatrix || !this._rowGenerationMatrix) { - this._cachedTextureMatrix = Matrix.Zero(); - this._rowGenerationMatrix = new Matrix(); - this._t0 = Vector3.Zero(); - this._t1 = Vector3.Zero(); - this._t2 = Vector3.Zero(); - } - Matrix.RotationYawPitchRollToRef(this.vAng, this.uAng, this.wAng, this._rowGenerationMatrix); - if (this.homogeneousRotationInUVTransform) { - Matrix.TranslationToRef(-this._cachedURotationCenter, -this._cachedVRotationCenter, -this._cachedWRotationCenter, TmpVectors.Matrix[0]); - Matrix.TranslationToRef(this._cachedURotationCenter, this._cachedVRotationCenter, this._cachedWRotationCenter, TmpVectors.Matrix[1]); - Matrix.ScalingToRef(this._cachedUScale, this._cachedVScale, 0, TmpVectors.Matrix[2]); - Matrix.TranslationToRef(this._cachedUOffset, this._cachedVOffset, 0, TmpVectors.Matrix[3]); - TmpVectors.Matrix[0].multiplyToRef(this._rowGenerationMatrix, this._cachedTextureMatrix); - this._cachedTextureMatrix.multiplyToRef(TmpVectors.Matrix[1], this._cachedTextureMatrix); - this._cachedTextureMatrix.multiplyToRef(TmpVectors.Matrix[2], this._cachedTextureMatrix); - this._cachedTextureMatrix.multiplyToRef(TmpVectors.Matrix[3], this._cachedTextureMatrix); - this._cachedTextureMatrix.setRowFromFloats(2, this._cachedTextureMatrix.m[12], this._cachedTextureMatrix.m[13], this._cachedTextureMatrix.m[14], 1); - } else { - this._prepareRowForTextureGeneration(0, 0, 0, this._t0); - this._prepareRowForTextureGeneration(1, 0, 0, this._t1); - this._prepareRowForTextureGeneration(0, 1, 0, this._t2); - this._t1.subtractInPlace(this._t0); - this._t2.subtractInPlace(this._t0); - Matrix.FromValuesToRef(this._t1.x, this._t1.y, this._t1.z, 0, this._t2.x, this._t2.y, this._t2.z, 0, this._t0.x, this._t0.y, this._t0.z, 0, 0, 0, 0, 1, this._cachedTextureMatrix); - } - const scene = this.getScene(); - if (!scene) { - return this._cachedTextureMatrix; - } - const previousIdentity3x2 = this._cachedIdentity3x2; - this._cachedIdentity3x2 = this._cachedTextureMatrix.isIdentityAs3x2(); - if (this.optimizeUVAllocation && previousIdentity3x2 !== this._cachedIdentity3x2) { - scene.markAllMaterialsAsDirty(1, (mat) => { - return mat.hasTexture(this); - }); + synchronizeInstances() { + for (let instanceIndex = 0; instanceIndex < this.instances.length; instanceIndex++) { + const instance = this.instances[instanceIndex]; + instance._syncSubMeshes(); } - return this._cachedTextureMatrix; + return this; } /** - * Get the current matrix used to apply reflection. This is useful to rotate an environment texture for instance. - * @returns The reflection texture transform + * Optimization of the mesh's indices, in case a mesh has duplicated vertices. + * The function will only reorder the indices and will not remove unused vertices to avoid problems with submeshes. + * This should be used together with the simplification to avoid disappearing triangles. + * @param successCallback an optional success callback to be called after the optimization finished. + * @returns the current mesh */ - getReflectionTextureMatrix() { - const scene = this.getScene(); - if (!scene) { - return this._cachedReflectionTextureMatrix; - } - if (this.uOffset === this._cachedReflectionUOffset && this.vOffset === this._cachedReflectionVOffset && this.uScale === this._cachedReflectionUScale && this.vScale === this._cachedReflectionVScale && this.coordinatesMode === this._cachedReflectionCoordinatesMode) { - if (this.coordinatesMode === _Texture.PROJECTION_MODE) { - if (this._cachedReflectionProjectionMatrixId === scene.getProjectionMatrix().updateFlag) { - return this._cachedReflectionTextureMatrix; - } - } else { - return this._cachedReflectionTextureMatrix; - } + optimizeIndices(successCallback) { + const indices = this.getIndices(); + const positions = this.getVerticesData(VertexBuffer.PositionKind); + if (!positions || !indices) { + return this; } - if (!this._cachedReflectionTextureMatrix) { - this._cachedReflectionTextureMatrix = Matrix.Zero(); + const vectorPositions = []; + for (let pos = 0; pos < positions.length; pos = pos + 3) { + vectorPositions.push(Vector3.FromArray(positions, pos)); } - if (!this._projectionModeMatrix) { - this._projectionModeMatrix = Matrix.Zero(); - } - const flagMaterialsAsTextureDirty = this._cachedReflectionCoordinatesMode !== this.coordinatesMode; - this._cachedReflectionUOffset = this.uOffset; - this._cachedReflectionVOffset = this.vOffset; - this._cachedReflectionUScale = this.uScale; - this._cachedReflectionVScale = this.vScale; - this._cachedReflectionCoordinatesMode = this.coordinatesMode; - switch (this.coordinatesMode) { - case _Texture.PLANAR_MODE: { - Matrix.IdentityToRef(this._cachedReflectionTextureMatrix); - this._cachedReflectionTextureMatrix[0] = this.uScale; - this._cachedReflectionTextureMatrix[5] = this.vScale; - this._cachedReflectionTextureMatrix[12] = this.uOffset; - this._cachedReflectionTextureMatrix[13] = this.vOffset; - break; + const dupes = []; + AsyncLoop.SyncAsyncForLoop(vectorPositions.length, 40, (iteration) => { + const realPos = vectorPositions.length - 1 - iteration; + const testedPosition = vectorPositions[realPos]; + for (let j = 0; j < realPos; ++j) { + const againstPosition = vectorPositions[j]; + if (testedPosition.equals(againstPosition)) { + dupes[realPos] = j; + break; + } } - case _Texture.PROJECTION_MODE: { - Matrix.FromValuesToRef(0.5, 0, 0, 0, 0, -0.5, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 1, 1, this._projectionModeMatrix); - const projectionMatrix = scene.getProjectionMatrix(); - this._cachedReflectionProjectionMatrixId = projectionMatrix.updateFlag; - projectionMatrix.multiplyToRef(this._projectionModeMatrix, this._cachedReflectionTextureMatrix); - break; + }, () => { + for (let i = 0; i < indices.length; ++i) { + indices[i] = dupes[indices[i]] || indices[i]; } - default: - Matrix.IdentityToRef(this._cachedReflectionTextureMatrix); - break; - } - if (flagMaterialsAsTextureDirty) { - scene.markAllMaterialsAsDirty(1, (mat) => { - return mat.hasTexture(this); - }); - } - return this._cachedReflectionTextureMatrix; - } - /** - * Clones the texture. - * @returns the cloned texture - */ - clone() { - const options = { - noMipmap: this._noMipmap, - invertY: this._invertY, - samplingMode: this.samplingMode, - onLoad: void 0, - onError: void 0, - buffer: this._texture ? this._texture._buffer : void 0, - deleteBuffer: this._deleteBuffer, - format: this.textureFormat, - mimeType: this.mimeType, - loaderOptions: this._loaderOptions, - creationFlags: this._creationFlags, - useSRGBBuffer: this._useSRGBBuffer - }; - return SerializationHelper.Clone(() => { - return new _Texture(this._texture ? this._texture.url : null, this.getScene(), options); - }, this); + const originalSubMeshes = this.subMeshes.slice(0); + this.setIndices(indices); + this.subMeshes = originalSubMeshes; + if (successCallback) { + successCallback(this); + } + }); + return this; } /** - * Serialize the texture to a JSON representation we can easily use in the respective Parse function. - * @returns The JSON representation of the texture + * Serialize current mesh + * @param serializationObject defines the object which will receive the serialization data + * @returns the serialized object */ - serialize() { - var _a; - const savedName = this.name; - if (!_Texture.SerializeBuffers) { - if (this.name.startsWith("data:")) { - this.name = ""; - } + serialize(serializationObject = {}) { + serializationObject.name = this.name; + serializationObject.id = this.id; + serializationObject.uniqueId = this.uniqueId; + serializationObject.type = this.getClassName(); + if (Tags && Tags.HasTags(this)) { + serializationObject.tags = Tags.GetTags(this); } - if (this.name.startsWith("data:") && this.url === this.name) { - this.url = ""; + serializationObject.position = this.position.asArray(); + if (this.rotationQuaternion) { + serializationObject.rotationQuaternion = this.rotationQuaternion.asArray(); + } else if (this.rotation) { + serializationObject.rotation = this.rotation.asArray(); } - const serializationObject = super.serialize(_Texture._SerializeInternalTextureUniqueId); - if (!serializationObject) { - return null; + serializationObject.scaling = this.scaling.asArray(); + if (this._postMultiplyPivotMatrix) { + serializationObject.pivotMatrix = this.getPivotMatrix().asArray(); + } else { + serializationObject.localMatrix = this.getPivotMatrix().asArray(); } - if (_Texture.SerializeBuffers || _Texture.ForceSerializeBuffers) { - if (typeof this._buffer === "string" && this._buffer.substr(0, 5) === "data:") { - serializationObject.base64String = this._buffer; - serializationObject.name = serializationObject.name.replace("data:", ""); - } else if (this.url && this.url.startsWith("data:") && this._buffer instanceof Uint8Array) { - serializationObject.base64String = "data:image/png;base64," + EncodeArrayBufferToBase64(this._buffer); - } else if (_Texture.ForceSerializeBuffers || this.url && this.url.startsWith("blob:") || this._forceSerialize) { - serializationObject.base64String = !this._engine || this._engine._features.supportSyncTextureRead ? GenerateBase64StringFromTexture(this) : GenerateBase64StringFromTextureAsync(this); - } + serializationObject.isEnabled = this.isEnabled(false); + serializationObject.isVisible = this.isVisible; + serializationObject.infiniteDistance = this.infiniteDistance; + serializationObject.pickable = this.isPickable; + serializationObject.receiveShadows = this.receiveShadows; + serializationObject.billboardMode = this.billboardMode; + serializationObject.visibility = this.visibility; + serializationObject.alwaysSelectAsActiveMesh = this.alwaysSelectAsActiveMesh; + serializationObject.checkCollisions = this.checkCollisions; + serializationObject.ellipsoid = this.ellipsoid.asArray(); + serializationObject.ellipsoidOffset = this.ellipsoidOffset.asArray(); + serializationObject.doNotSyncBoundingInfo = this.doNotSyncBoundingInfo; + serializationObject.isBlocker = this.isBlocker; + serializationObject.overrideMaterialSideOrientation = this.overrideMaterialSideOrientation; + if (this.parent) { + this.parent._serializeAsParent(serializationObject); } - serializationObject.invertY = this._invertY; - serializationObject.samplingMode = this.samplingMode; - serializationObject._creationFlags = this._creationFlags; - serializationObject._useSRGBBuffer = this._useSRGBBuffer; - if (_Texture._SerializeInternalTextureUniqueId) { - serializationObject.internalTextureUniqueId = ((_a = this._texture) == null ? void 0 : _a.uniqueId) ?? void 0; + serializationObject.isUnIndexed = this.isUnIndexed; + const geometry = this._geometry; + if (geometry && this.subMeshes) { + serializationObject.geometryUniqueId = geometry.uniqueId; + serializationObject.geometryId = geometry.id; + serializationObject.subMeshes = []; + for (let subIndex = 0; subIndex < this.subMeshes.length; subIndex++) { + const subMesh = this.subMeshes[subIndex]; + serializationObject.subMeshes.push({ + materialIndex: subMesh.materialIndex, + verticesStart: subMesh.verticesStart, + verticesCount: subMesh.verticesCount, + indexStart: subMesh.indexStart, + indexCount: subMesh.indexCount + }); + } } - serializationObject.noMipmap = this._noMipmap; - this.name = savedName; - return serializationObject; - } - /** - * Get the current class name of the texture useful for serialization or dynamic coding. - * @returns "Texture" - */ - getClassName() { - return "Texture"; - } - /** - * Dispose the texture and release its associated resources. - */ - dispose() { - super.dispose(); - this.onLoadObservable.clear(); - this._delayedOnLoad = null; - this._delayedOnError = null; - this._buffer = null; - } - /** - * Parse the JSON representation of a texture in order to recreate the texture in the given scene. - * @param parsedTexture Define the JSON representation of the texture - * @param scene Define the scene the parsed texture should be instantiated in - * @param rootUrl Define the root url of the parsing sequence in the case of relative dependencies - * @returns The parsed texture if successful - */ - static Parse(parsedTexture, scene, rootUrl) { - if (parsedTexture.customType) { - const customTexture = InstantiationTools.Instantiate(parsedTexture.customType); - const parsedCustomTexture = customTexture.Parse(parsedTexture, scene, rootUrl); - if (parsedTexture.samplingMode && parsedCustomTexture.updateSamplingMode && parsedCustomTexture._samplingMode) { - if (parsedCustomTexture._samplingMode !== parsedTexture.samplingMode) { - parsedCustomTexture.updateSamplingMode(parsedTexture.samplingMode); - } + if (this.material) { + if (!this.material.doNotSerialize) { + serializationObject.materialUniqueId = this.material.uniqueId; + serializationObject.materialId = this.material.id; } - return parsedCustomTexture; + } else { + this.material = null; + serializationObject.materialUniqueId = this._scene.defaultMaterial.uniqueId; + serializationObject.materialId = this._scene.defaultMaterial.id; } - if (parsedTexture.isCube && !parsedTexture.isRenderTarget) { - return _Texture._CubeTextureParser(parsedTexture, scene, rootUrl); + if (this.morphTargetManager) { + serializationObject.morphTargetManagerId = this.morphTargetManager.uniqueId; } - const hasInternalTextureUniqueId = parsedTexture.internalTextureUniqueId !== void 0; - if (!parsedTexture.name && !parsedTexture.isRenderTarget && !hasInternalTextureUniqueId) { - return null; + if (this.skeleton) { + serializationObject.skeletonId = this.skeleton.id; + serializationObject.numBoneInfluencers = this.numBoneInfluencers; } - let internalTexture; - if (hasInternalTextureUniqueId) { - const cache = scene.getEngine().getLoadedTexturesCache(); - for (const texture2 of cache) { - if (texture2.uniqueId === parsedTexture.internalTextureUniqueId) { - internalTexture = texture2; - break; - } + if (this.getScene()._getComponent(SceneComponentConstants.NAME_PHYSICSENGINE)) { + const impostor = this.getPhysicsImpostor(); + if (impostor) { + serializationObject.physicsMass = impostor.getParam("mass"); + serializationObject.physicsFriction = impostor.getParam("friction"); + serializationObject.physicsRestitution = impostor.getParam("mass"); + serializationObject.physicsImpostor = impostor.type; } } - const onLoaded = (texture2) => { - var _a; - if (texture2 && texture2._texture) { - texture2._texture._cachedWrapU = null; - texture2._texture._cachedWrapV = null; - texture2._texture._cachedWrapR = null; + if (this.metadata) { + serializationObject.metadata = this.metadata; + } + serializationObject.instances = []; + for (let index = 0; index < this.instances.length; index++) { + const instance = this.instances[index]; + if (instance.doNotSerialize) { + continue; } - if (parsedTexture.samplingMode) { - const sampling = parsedTexture.samplingMode; - if (texture2 && texture2.samplingMode !== sampling) { - texture2.updateSamplingMode(sampling); + const serializationInstance = { + name: instance.name, + id: instance.id, + isEnabled: instance.isEnabled(false), + isVisible: instance.isVisible, + isPickable: instance.isPickable, + checkCollisions: instance.checkCollisions, + position: instance.position.asArray(), + scaling: instance.scaling.asArray() + }; + if (instance.parent) { + instance.parent._serializeAsParent(serializationInstance); + } + if (instance.rotationQuaternion) { + serializationInstance.rotationQuaternion = instance.rotationQuaternion.asArray(); + } else if (instance.rotation) { + serializationInstance.rotation = instance.rotation.asArray(); + } + if (this.getScene()._getComponent(SceneComponentConstants.NAME_PHYSICSENGINE)) { + const impostor = instance.getPhysicsImpostor(); + if (impostor) { + serializationInstance.physicsMass = impostor.getParam("mass"); + serializationInstance.physicsFriction = impostor.getParam("friction"); + serializationInstance.physicsRestitution = impostor.getParam("mass"); + serializationInstance.physicsImpostor = impostor.type; } } - if (texture2 && parsedTexture.animations) { - for (let animationIndex = 0; animationIndex < parsedTexture.animations.length; animationIndex++) { - const parsedAnimation = parsedTexture.animations[animationIndex]; - const internalClass = GetClass("BABYLON.Animation"); - if (internalClass) { - texture2.animations.push(internalClass.Parse(parsedAnimation)); - } + if (instance.metadata) { + serializationInstance.metadata = instance.metadata; + } + if (instance.actionManager) { + serializationInstance.actions = instance.actionManager.serialize(instance.name); + } + serializationObject.instances.push(serializationInstance); + SerializationHelper.AppendSerializedAnimations(instance, serializationInstance); + serializationInstance.ranges = instance.serializeAnimationRanges(); + } + if (this._thinInstanceDataStorage.instancesCount && this._thinInstanceDataStorage.matrixData) { + serializationObject.thinInstances = { + instancesCount: this._thinInstanceDataStorage.instancesCount, + matrixData: Array.from(this._thinInstanceDataStorage.matrixData), + matrixBufferSize: this._thinInstanceDataStorage.matrixBufferSize, + enablePicking: this.thinInstanceEnablePicking + }; + if (this._userThinInstanceBuffersStorage) { + const userThinInstance = { + data: {}, + sizes: {}, + strides: {} + }; + for (const kind in this._userThinInstanceBuffersStorage.data) { + userThinInstance.data[kind] = Array.from(this._userThinInstanceBuffersStorage.data[kind]); + userThinInstance.sizes[kind] = this._userThinInstanceBuffersStorage.sizes[kind]; + userThinInstance.strides[kind] = this._userThinInstanceBuffersStorage.strides[kind]; } + serializationObject.thinInstances.userThinInstance = userThinInstance; } - if (hasInternalTextureUniqueId && !internalTexture) { - (_a = texture2 == null ? void 0 : texture2._texture) == null ? void 0 : _a._setUniqueId(parsedTexture.internalTextureUniqueId); + } + SerializationHelper.AppendSerializedAnimations(this, serializationObject); + serializationObject.ranges = this.serializeAnimationRanges(); + serializationObject.layerMask = this.layerMask; + serializationObject.alphaIndex = this.alphaIndex; + serializationObject.hasVertexAlpha = this.hasVertexAlpha; + serializationObject.overlayAlpha = this.overlayAlpha; + serializationObject.overlayColor = this.overlayColor.asArray(); + serializationObject.renderOverlay = this.renderOverlay; + serializationObject.applyFog = this.applyFog; + if (this.actionManager) { + serializationObject.actions = this.actionManager.serialize(this.name); + } + return serializationObject; + } + /** @internal */ + _syncGeometryWithMorphTargetManager() { + if (!this.geometry) { + return; + } + this._markSubMeshesAsAttributesDirty(); + const morphTargetManager = this._internalAbstractMeshDataInfo._morphTargetManager; + if (morphTargetManager && morphTargetManager.vertexCount) { + if (morphTargetManager.vertexCount !== this.getTotalVertices()) { + Logger.Error("Mesh is incompatible with morph targets. Targets and mesh must all have the same vertices count."); + this.morphTargetManager = null; + return; } - }; - const texture = SerializationHelper.Parse(() => { - let generateMipMaps = true; - if (parsedTexture.noMipmap) { - generateMipMaps = false; + if (morphTargetManager.isUsingTextureForTargets) { + return; } - if (parsedTexture.mirrorPlane) { - const mirrorTexture = _Texture._CreateMirror(parsedTexture.name, parsedTexture.renderTargetSize, scene, generateMipMaps); - mirrorTexture._waitingRenderList = parsedTexture.renderList; - mirrorTexture.mirrorPlane = Plane.FromArray(parsedTexture.mirrorPlane); - onLoaded(mirrorTexture); - return mirrorTexture; - } else if (parsedTexture.isRenderTarget) { - let renderTargetTexture = null; - if (parsedTexture.isCube) { - if (scene.reflectionProbes) { - for (let index = 0; index < scene.reflectionProbes.length; index++) { - const probe = scene.reflectionProbes[index]; - if (probe.name === parsedTexture.name) { - return probe.cubeTexture; - } - } - } - } else { - renderTargetTexture = _Texture._CreateRenderTargetTexture(parsedTexture.name, parsedTexture.renderTargetSize, scene, generateMipMaps, parsedTexture._creationFlags ?? 0); - renderTargetTexture._waitingRenderList = parsedTexture.renderList; + for (let index = 0; index < morphTargetManager.numInfluencers; index++) { + const morphTarget = morphTargetManager.getActiveTarget(index); + const positions = morphTarget.getPositions(); + if (!positions) { + Logger.Error("Invalid morph target. Target must have positions."); + return; } - onLoaded(renderTargetTexture); - return renderTargetTexture; - } else if (parsedTexture.isVideo) { - const texture2 = _Texture._CreateVideoTexture(rootUrl + (parsedTexture.url || parsedTexture.name), rootUrl + (parsedTexture.src || parsedTexture.url), scene, generateMipMaps, parsedTexture.invertY, parsedTexture.samplingMode, parsedTexture.settings || {}); - onLoaded(texture2); - return texture2; - } else { - let texture2; - if (parsedTexture.base64String && !internalTexture) { - texture2 = _Texture.CreateFromBase64String(parsedTexture.base64String, parsedTexture.base64String, scene, !generateMipMaps, parsedTexture.invertY, parsedTexture.samplingMode, () => { - onLoaded(texture2); - }, parsedTexture._creationFlags ?? 0, parsedTexture._useSRGBBuffer ?? false); - texture2.name = parsedTexture.name; - } else { - let url; - if (parsedTexture.name && (parsedTexture.name.indexOf("://") > 0 || parsedTexture.name.startsWith("data:"))) { - url = parsedTexture.name; - } else { - url = rootUrl + parsedTexture.name; - } - if (parsedTexture.url && (parsedTexture.url.startsWith("data:") || _Texture.UseSerializedUrlIfAny)) { - url = parsedTexture.url; - } - const options = { - noMipmap: !generateMipMaps, - invertY: parsedTexture.invertY, - samplingMode: parsedTexture.samplingMode, - onLoad: () => { - onLoaded(texture2); - }, - internalTexture - }; - texture2 = new _Texture(url, scene, options); + this.geometry.setVerticesData(VertexBuffer.PositionKind + index, positions, false, 3); + const normals = morphTarget.getNormals(); + if (normals) { + this.geometry.setVerticesData(VertexBuffer.NormalKind + index, normals, false, 3); + } + const tangents = morphTarget.getTangents(); + if (tangents) { + this.geometry.setVerticesData(VertexBuffer.TangentKind + index, tangents, false, 3); + } + const uvs = morphTarget.getUVs(); + if (uvs) { + this.geometry.setVerticesData(VertexBuffer.UVKind + "_" + index, uvs, false, 2); } - return texture2; } - }, parsedTexture, scene); - return texture; - } - /** - * Creates a texture from its base 64 representation. - * @param data Define the base64 payload without the data: prefix - * @param name Define the name of the texture in the scene useful fo caching purpose for instance - * @param scene Define the scene the texture should belong to - * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture - * @param invertY define if the texture needs to be inverted on the y axis during loading - * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...) - * @param onLoad define a callback triggered when the texture has been loaded - * @param onError define a callback triggered when an error occurred during the loading session - * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...) - * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg) - * @param forcedExtension defines the extension to use to pick the right loader - * @returns the created texture - */ - static CreateFromBase64String(data, name69, scene, noMipmapOrOptions, invertY, samplingMode = _Texture.TRILINEAR_SAMPLINGMODE, onLoad = null, onError = null, format = 5, creationFlags, forcedExtension) { - return new _Texture("data:" + name69, scene, noMipmapOrOptions, invertY, samplingMode, onLoad, onError, data, false, format, void 0, void 0, creationFlags, forcedExtension); + } else { + let index = 0; + while (this.geometry.isVerticesDataPresent(VertexBuffer.PositionKind + index)) { + this.geometry.removeVerticesData(VertexBuffer.PositionKind + index); + if (this.geometry.isVerticesDataPresent(VertexBuffer.NormalKind + index)) { + this.geometry.removeVerticesData(VertexBuffer.NormalKind + index); + } + if (this.geometry.isVerticesDataPresent(VertexBuffer.TangentKind + index)) { + this.geometry.removeVerticesData(VertexBuffer.TangentKind + index); + } + if (this.geometry.isVerticesDataPresent(VertexBuffer.UVKind + index)) { + this.geometry.removeVerticesData(VertexBuffer.UVKind + "_" + index); + } + index++; + } + } } /** - * Creates a texture from its data: representation. (data: will be added in case only the payload has been passed in) - * @param name Define the name of the texture in the scene useful fo caching purpose for instance - * @param buffer define the buffer to load the texture from in case the texture is loaded from a buffer representation - * @param scene Define the scene the texture should belong to - * @param deleteBuffer define if the buffer we are loading the texture from should be deleted after load - * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture - * @param invertY define if the texture needs to be inverted on the y axis during loading - * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...) - * @param onLoad define a callback triggered when the texture has been loaded - * @param onError define a callback triggered when an error occurred during the loading session - * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...) - * @param creationFlags specific flags to use when creating the texture (1 for storage textures, for eg) - * @param forcedExtension defines the extension to use to pick the right loader - * @returns the created texture + * Returns a new Mesh object parsed from the source provided. + * @param parsedMesh is the source + * @param scene defines the hosting scene + * @param rootUrl is the root URL to prefix the `delayLoadingFile` property with + * @returns a new Mesh */ - static LoadFromDataString(name69, buffer, scene, deleteBuffer = false, noMipmapOrOptions, invertY = true, samplingMode = _Texture.TRILINEAR_SAMPLINGMODE, onLoad = null, onError = null, format = 5, creationFlags, forcedExtension) { - if (name69.substr(0, 5) !== "data:") { - name69 = "data:" + name69; + static Parse(parsedMesh, scene, rootUrl) { + let mesh; + if (parsedMesh.type && parsedMesh.type === "LinesMesh") { + mesh = _Mesh._LinesMeshParser(parsedMesh, scene); + } else if (parsedMesh.type && parsedMesh.type === "GroundMesh") { + mesh = _Mesh._GroundMeshParser(parsedMesh, scene); + } else if (parsedMesh.type && parsedMesh.type === "GoldbergMesh") { + mesh = _Mesh._GoldbergMeshParser(parsedMesh, scene); + } else if (parsedMesh.type && parsedMesh.type === "GreasedLineMesh") { + mesh = _Mesh._GreasedLineMeshParser(parsedMesh, scene); + } else if (parsedMesh.type && parsedMesh.type === "TrailMesh") { + mesh = _Mesh._TrailMeshParser(parsedMesh, scene); + } else { + mesh = new _Mesh(parsedMesh.name, scene); } - return new _Texture(name69, scene, noMipmapOrOptions, invertY, samplingMode, onLoad, onError, buffer, deleteBuffer, format, void 0, void 0, creationFlags, forcedExtension); - } -}; -Texture.SerializeBuffers = true; -Texture.ForceSerializeBuffers = false; -Texture.OnTextureLoadErrorObservable = new Observable(); -Texture._SerializeInternalTextureUniqueId = false; -Texture._CubeTextureParser = (jsonTexture, scene, rootUrl) => { - throw _WarnImport("CubeTexture"); -}; -Texture._CreateMirror = (name69, renderTargetSize, scene, generateMipMaps) => { - throw _WarnImport("MirrorTexture"); -}; -Texture._CreateRenderTargetTexture = (name69, renderTargetSize, scene, generateMipMaps, creationFlags) => { - throw _WarnImport("RenderTargetTexture"); -}; -Texture.NEAREST_SAMPLINGMODE = 1; -Texture.NEAREST_NEAREST_MIPLINEAR = 8; -Texture.BILINEAR_SAMPLINGMODE = 2; -Texture.LINEAR_LINEAR_MIPNEAREST = 11; -Texture.TRILINEAR_SAMPLINGMODE = 3; -Texture.LINEAR_LINEAR_MIPLINEAR = 3; -Texture.NEAREST_NEAREST_MIPNEAREST = 4; -Texture.NEAREST_LINEAR_MIPNEAREST = 5; -Texture.NEAREST_LINEAR_MIPLINEAR = 6; -Texture.NEAREST_LINEAR = 7; -Texture.NEAREST_NEAREST = 1; -Texture.LINEAR_NEAREST_MIPNEAREST = 9; -Texture.LINEAR_NEAREST_MIPLINEAR = 10; -Texture.LINEAR_LINEAR = 2; -Texture.LINEAR_NEAREST = 12; -Texture.EXPLICIT_MODE = 0; -Texture.SPHERICAL_MODE = 1; -Texture.PLANAR_MODE = 2; -Texture.CUBIC_MODE = 3; -Texture.PROJECTION_MODE = 4; -Texture.SKYBOX_MODE = 5; -Texture.INVCUBIC_MODE = 6; -Texture.EQUIRECTANGULAR_MODE = 7; -Texture.FIXED_EQUIRECTANGULAR_MODE = 8; -Texture.FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9; -Texture.CLAMP_ADDRESSMODE = 0; -Texture.WRAP_ADDRESSMODE = 1; -Texture.MIRROR_ADDRESSMODE = 2; -Texture.UseSerializedUrlIfAny = false; -__decorate([ - serialize() -], Texture.prototype, "url", void 0); -__decorate([ - serialize() -], Texture.prototype, "uOffset", void 0); -__decorate([ - serialize() -], Texture.prototype, "vOffset", void 0); -__decorate([ - serialize() -], Texture.prototype, "uScale", void 0); -__decorate([ - serialize() -], Texture.prototype, "vScale", void 0); -__decorate([ - serialize() -], Texture.prototype, "uAng", void 0); -__decorate([ - serialize() -], Texture.prototype, "vAng", void 0); -__decorate([ - serialize() -], Texture.prototype, "wAng", void 0); -__decorate([ - serialize() -], Texture.prototype, "uRotationCenter", void 0); -__decorate([ - serialize() -], Texture.prototype, "vRotationCenter", void 0); -__decorate([ - serialize() -], Texture.prototype, "wRotationCenter", void 0); -__decorate([ - serialize() -], Texture.prototype, "homogeneousRotationInUVTransform", void 0); -__decorate([ - serialize() -], Texture.prototype, "isBlocking", null); -RegisterClass("BABYLON.Texture", Texture); -SerializationHelper._TextureParser = Texture.Parse; - -// node_modules/@babylonjs/core/Behaviors/Meshes/fadeInOutBehavior.js -var FadeInOutBehavior = class { - /** - * Time in milliseconds to delay before fading in (Default: 0) - * Will set both fade in and out delay to the same value - */ - get delay() { - return this.fadeInDelay; - } - set delay(value) { - this.fadeInDelay = value; - this.fadeOutDelay = value; - } - /** - * Instantiates the FadeInOutBehavior - */ - constructor() { - this.fadeInDelay = 0; - this.fadeOutDelay = 0; - this.fadeInTime = 300; - this.fadeOutTime = 300; - this._millisecondsPerFrame = 1e3 / 60; - this._hovered = false; - this._hoverValue = 0; - this._ownerNode = null; - this._delay = 0; - this._time = 300; - this._update = () => { - if (this._ownerNode) { - this._hoverValue += this._hovered ? this._millisecondsPerFrame : -this._millisecondsPerFrame; - this._setAllVisibility(this._ownerNode, (this._hoverValue - this._delay) / this._time); - if (this._ownerNode.visibility > 1) { - this._setAllVisibility(this._ownerNode, 1); - if (this._hoverValue > this._time) { - this._hoverValue = this._time; - this._detachObserver(); - return; - } - } else if (this._ownerNode.visibility < 0) { - this._setAllVisibility(this._ownerNode, 0); - if (this._hoverValue < 0) { - this._hoverValue = 0; - this._detachObserver(); - return; - } - } - this._attachObserver(); - } - }; - } - /** - * The name of the behavior - */ - get name() { - return "FadeInOut"; - } - /** - * Initializes the behavior - */ - init() { - } - /** - * Attaches the fade behavior on the passed in mesh - * @param ownerNode The mesh that will be faded in/out once attached - */ - attach(ownerNode) { - this._ownerNode = ownerNode; - this._setAllVisibility(this._ownerNode, 0); - } - /** - * Detaches the behavior from the mesh - */ - detach() { - this._ownerNode = null; - } - /** - * Triggers the mesh to begin fading in (or out) - * @param fadeIn if the object should fade in or out (true to fade in) - */ - fadeIn(fadeIn = true) { - this._delay = fadeIn ? this.fadeInDelay : this.fadeOutDelay; - this._time = fadeIn ? this.fadeInTime : this.fadeOutTime; - this._detachObserver(); - if (this._ownerNode && (fadeIn && this._ownerNode.visibility >= 1 || !fadeIn && this._ownerNode.visibility <= 0)) { - return; + mesh.id = parsedMesh.id; + mesh._waitingParsedUniqueId = parsedMesh.uniqueId; + if (Tags) { + Tags.AddTagsTo(mesh, parsedMesh.tags); } - this._hovered = fadeIn; - if (!this._hovered) { - this._delay *= -1; + mesh.position = Vector3.FromArray(parsedMesh.position); + if (parsedMesh.metadata !== void 0) { + mesh.metadata = parsedMesh.metadata; } - if (this._ownerNode.visibility >= 1) { - this._hoverValue = this._time; - } else if (this._ownerNode.visibility <= 0) { - this._hoverValue = 0; + if (parsedMesh.rotationQuaternion) { + mesh.rotationQuaternion = Quaternion.FromArray(parsedMesh.rotationQuaternion); + } else if (parsedMesh.rotation) { + mesh.rotation = Vector3.FromArray(parsedMesh.rotation); } - this._update(); - } - /** - * Triggers the mesh to begin fading out - */ - fadeOut() { - this.fadeIn(false); - } - _setAllVisibility(mesh, value) { - mesh.visibility = value; - mesh.getChildMeshes().forEach((c) => { - this._setAllVisibility(c, value); - }); - } - _attachObserver() { - var _a; - if (!this._onBeforeRenderObserver) { - this._onBeforeRenderObserver = (_a = this._ownerNode) == null ? void 0 : _a.getScene().onBeforeRenderObservable.add(this._update); + mesh.scaling = Vector3.FromArray(parsedMesh.scaling); + if (parsedMesh.localMatrix) { + mesh.setPreTransformMatrix(Matrix.FromArray(parsedMesh.localMatrix)); + } else if (parsedMesh.pivotMatrix) { + mesh.setPivotMatrix(Matrix.FromArray(parsedMesh.pivotMatrix)); } - } - _detachObserver() { - var _a; - if (this._onBeforeRenderObserver) { - (_a = this._ownerNode) == null ? void 0 : _a.getScene().onBeforeRenderObservable.remove(this._onBeforeRenderObserver); - this._onBeforeRenderObserver = null; + mesh.setEnabled(parsedMesh.isEnabled); + mesh.isVisible = parsedMesh.isVisible; + mesh.infiniteDistance = parsedMesh.infiniteDistance; + mesh.alwaysSelectAsActiveMesh = !!parsedMesh.alwaysSelectAsActiveMesh; + mesh.showBoundingBox = parsedMesh.showBoundingBox; + mesh.showSubMeshesBoundingBox = parsedMesh.showSubMeshesBoundingBox; + if (parsedMesh.applyFog !== void 0) { + mesh.applyFog = parsedMesh.applyFog; } - } -}; - -// node_modules/@babylonjs/core/Culling/ray.js -var Ray = class _Ray { - /** - * Creates a new ray - * @param origin origin point - * @param direction direction - * @param length length of the ray - * @param epsilon The epsilon value to use when calculating the ray/triangle intersection (default: 0) - */ - constructor(origin, direction, length = Number.MAX_VALUE, epsilon = Epsilon) { - this.origin = origin; - this.direction = direction; - this.length = length; - this.epsilon = epsilon; - } - // Methods - /** - * Clone the current ray - * @returns a new ray - */ - clone() { - return new _Ray(this.origin.clone(), this.direction.clone(), this.length); - } - /** - * Checks if the ray intersects a box - * This does not account for the ray length by design to improve perfs. - * @param minimum bound of the box - * @param maximum bound of the box - * @param intersectionTreshold extra extend to be added to the box in all direction - * @returns if the box was hit - */ - intersectsBoxMinMax(minimum, maximum, intersectionTreshold = 0) { - const newMinimum = _Ray._TmpVector3[0].copyFromFloats(minimum.x - intersectionTreshold, minimum.y - intersectionTreshold, minimum.z - intersectionTreshold); - const newMaximum = _Ray._TmpVector3[1].copyFromFloats(maximum.x + intersectionTreshold, maximum.y + intersectionTreshold, maximum.z + intersectionTreshold); - let d = 0; - let maxValue = Number.MAX_VALUE; - let inv; - let min; - let max; - let temp; - if (Math.abs(this.direction.x) < 1e-7) { - if (this.origin.x < newMinimum.x || this.origin.x > newMaximum.x) { - return false; - } - } else { - inv = 1 / this.direction.x; - min = (newMinimum.x - this.origin.x) * inv; - max = (newMaximum.x - this.origin.x) * inv; - if (max === -Infinity) { - max = Infinity; + if (parsedMesh.pickable !== void 0) { + mesh.isPickable = parsedMesh.pickable; + } + if (parsedMesh.alphaIndex !== void 0) { + mesh.alphaIndex = parsedMesh.alphaIndex; + } + mesh.receiveShadows = parsedMesh.receiveShadows; + if (parsedMesh.billboardMode !== void 0) { + mesh.billboardMode = parsedMesh.billboardMode; + } + if (parsedMesh.visibility !== void 0) { + mesh.visibility = parsedMesh.visibility; + } + mesh.checkCollisions = parsedMesh.checkCollisions; + mesh.doNotSyncBoundingInfo = !!parsedMesh.doNotSyncBoundingInfo; + if (parsedMesh.ellipsoid) { + mesh.ellipsoid = Vector3.FromArray(parsedMesh.ellipsoid); + } + if (parsedMesh.ellipsoidOffset) { + mesh.ellipsoidOffset = Vector3.FromArray(parsedMesh.ellipsoidOffset); + } + if (parsedMesh.overrideMaterialSideOrientation !== void 0) { + mesh.overrideMaterialSideOrientation = parsedMesh.overrideMaterialSideOrientation; + } + if (parsedMesh.isBlocker !== void 0) { + mesh.isBlocker = parsedMesh.isBlocker; + } + mesh._shouldGenerateFlatShading = parsedMesh.useFlatShading; + if (parsedMesh.freezeWorldMatrix) { + mesh._waitingData.freezeWorldMatrix = parsedMesh.freezeWorldMatrix; + } + if (parsedMesh.parentId !== void 0) { + mesh._waitingParentId = parsedMesh.parentId; + } + if (parsedMesh.parentInstanceIndex !== void 0) { + mesh._waitingParentInstanceIndex = parsedMesh.parentInstanceIndex; + } + if (parsedMesh.actions !== void 0) { + mesh._waitingData.actions = parsedMesh.actions; + } + if (parsedMesh.overlayAlpha !== void 0) { + mesh.overlayAlpha = parsedMesh.overlayAlpha; + } + if (parsedMesh.overlayColor !== void 0) { + mesh.overlayColor = Color3.FromArray(parsedMesh.overlayColor); + } + if (parsedMesh.renderOverlay !== void 0) { + mesh.renderOverlay = parsedMesh.renderOverlay; + } + mesh.isUnIndexed = !!parsedMesh.isUnIndexed; + mesh.hasVertexAlpha = parsedMesh.hasVertexAlpha; + if (parsedMesh.delayLoadingFile) { + mesh.delayLoadState = 4; + mesh.delayLoadingFile = rootUrl + parsedMesh.delayLoadingFile; + mesh.buildBoundingInfo(Vector3.FromArray(parsedMesh.boundingBoxMinimum), Vector3.FromArray(parsedMesh.boundingBoxMaximum)); + if (parsedMesh._binaryInfo) { + mesh._binaryInfo = parsedMesh._binaryInfo; } - if (min > max) { - temp = min; - min = max; - max = temp; + mesh._delayInfo = []; + if (parsedMesh.hasUVs) { + mesh._delayInfo.push(VertexBuffer.UVKind); } - d = Math.max(min, d); - maxValue = Math.min(max, maxValue); - if (d > maxValue) { - return false; + if (parsedMesh.hasUVs2) { + mesh._delayInfo.push(VertexBuffer.UV2Kind); } - } - if (Math.abs(this.direction.y) < 1e-7) { - if (this.origin.y < newMinimum.y || this.origin.y > newMaximum.y) { - return false; + if (parsedMesh.hasUVs3) { + mesh._delayInfo.push(VertexBuffer.UV3Kind); } - } else { - inv = 1 / this.direction.y; - min = (newMinimum.y - this.origin.y) * inv; - max = (newMaximum.y - this.origin.y) * inv; - if (max === -Infinity) { - max = Infinity; + if (parsedMesh.hasUVs4) { + mesh._delayInfo.push(VertexBuffer.UV4Kind); } - if (min > max) { - temp = min; - min = max; - max = temp; + if (parsedMesh.hasUVs5) { + mesh._delayInfo.push(VertexBuffer.UV5Kind); } - d = Math.max(min, d); - maxValue = Math.min(max, maxValue); - if (d > maxValue) { - return false; + if (parsedMesh.hasUVs6) { + mesh._delayInfo.push(VertexBuffer.UV6Kind); } - } - if (Math.abs(this.direction.z) < 1e-7) { - if (this.origin.z < newMinimum.z || this.origin.z > newMaximum.z) { - return false; + if (parsedMesh.hasColors) { + mesh._delayInfo.push(VertexBuffer.ColorKind); } - } else { - inv = 1 / this.direction.z; - min = (newMinimum.z - this.origin.z) * inv; - max = (newMaximum.z - this.origin.z) * inv; - if (max === -Infinity) { - max = Infinity; + if (parsedMesh.hasMatricesIndices) { + mesh._delayInfo.push(VertexBuffer.MatricesIndicesKind); } - if (min > max) { - temp = min; - min = max; - max = temp; + if (parsedMesh.hasMatricesWeights) { + mesh._delayInfo.push(VertexBuffer.MatricesWeightsKind); } - d = Math.max(min, d); - maxValue = Math.min(max, maxValue); - if (d > maxValue) { - return false; + mesh._delayLoadingFunction = Geometry._ImportGeometry; + if (SceneLoaderFlags.ForceFullSceneLoadingForIncremental) { + mesh._checkDelayState(); } + } else { + Geometry._ImportGeometry(parsedMesh, mesh); } - return true; - } - /** - * Checks if the ray intersects a box - * This does not account for the ray lenght by design to improve perfs. - * @param box the bounding box to check - * @param intersectionTreshold extra extend to be added to the BoundingBox in all direction - * @returns if the box was hit - */ - intersectsBox(box, intersectionTreshold = 0) { - return this.intersectsBoxMinMax(box.minimum, box.maximum, intersectionTreshold); - } - /** - * If the ray hits a sphere - * @param sphere the bounding sphere to check - * @param intersectionTreshold extra extend to be added to the BoundingSphere in all direction - * @returns true if it hits the sphere - */ - intersectsSphere(sphere, intersectionTreshold = 0) { - const x = sphere.center.x - this.origin.x; - const y = sphere.center.y - this.origin.y; - const z = sphere.center.z - this.origin.z; - const pyth = x * x + y * y + z * z; - const radius = sphere.radius + intersectionTreshold; - const rr = radius * radius; - if (pyth <= rr) { - return true; - } - const dot = x * this.direction.x + y * this.direction.y + z * this.direction.z; - if (dot < 0) { - return false; + if (parsedMesh.materialUniqueId) { + mesh._waitingMaterialId = parsedMesh.materialUniqueId; + } else if (parsedMesh.materialId) { + mesh._waitingMaterialId = parsedMesh.materialId; } - const temp = pyth - dot * dot; - return temp <= rr; - } - /** - * If the ray hits a triange - * @param vertex0 triangle vertex - * @param vertex1 triangle vertex - * @param vertex2 triangle vertex - * @returns intersection information if hit - */ - intersectsTriangle(vertex0, vertex1, vertex2) { - const edge1 = _Ray._TmpVector3[0]; - const edge2 = _Ray._TmpVector3[1]; - const pvec = _Ray._TmpVector3[2]; - const tvec = _Ray._TmpVector3[3]; - const qvec = _Ray._TmpVector3[4]; - vertex1.subtractToRef(vertex0, edge1); - vertex2.subtractToRef(vertex0, edge2); - Vector3.CrossToRef(this.direction, edge2, pvec); - const det = Vector3.Dot(edge1, pvec); - if (det === 0) { - return null; + if (parsedMesh.morphTargetManagerId > -1) { + mesh.morphTargetManager = scene.getMorphTargetManagerById(parsedMesh.morphTargetManagerId); } - const invdet = 1 / det; - this.origin.subtractToRef(vertex0, tvec); - const bv = Vector3.Dot(tvec, pvec) * invdet; - if (bv < -this.epsilon || bv > 1 + this.epsilon) { - return null; + if (parsedMesh.skeletonId !== void 0 && parsedMesh.skeletonId !== null) { + mesh.skeleton = scene.getLastSkeletonById(parsedMesh.skeletonId); + if (parsedMesh.numBoneInfluencers) { + mesh.numBoneInfluencers = parsedMesh.numBoneInfluencers; + } } - Vector3.CrossToRef(tvec, edge1, qvec); - const bw = Vector3.Dot(this.direction, qvec) * invdet; - if (bw < -this.epsilon || bv + bw > 1 + this.epsilon) { - return null; + if (parsedMesh.animations) { + for (let animationIndex = 0; animationIndex < parsedMesh.animations.length; animationIndex++) { + const parsedAnimation = parsedMesh.animations[animationIndex]; + const internalClass = GetClass("BABYLON.Animation"); + if (internalClass) { + mesh.animations.push(internalClass.Parse(parsedAnimation)); + } + } + Node.ParseAnimationRanges(mesh, parsedMesh, scene); } - const distance = Vector3.Dot(edge2, qvec) * invdet; - if (distance > this.length) { - return null; + if (parsedMesh.autoAnimate) { + scene.beginAnimation(mesh, parsedMesh.autoAnimateFrom, parsedMesh.autoAnimateTo, parsedMesh.autoAnimateLoop, parsedMesh.autoAnimateSpeed || 1); } - return new IntersectionInfo(1 - bv - bw, bv, distance); - } - /** - * Checks if ray intersects a plane - * @param plane the plane to check - * @returns the distance away it was hit - */ - intersectsPlane(plane) { - let distance; - const result1 = Vector3.Dot(plane.normal, this.direction); - if (Math.abs(result1) < 999999997475243e-21) { - return null; + if (parsedMesh.layerMask && !isNaN(parsedMesh.layerMask)) { + mesh.layerMask = Math.abs(parseInt(parsedMesh.layerMask)); } else { - const result2 = Vector3.Dot(plane.normal, this.origin); - distance = (-plane.d - result2) / result1; - if (distance < 0) { - if (distance < -999999997475243e-21) { - return null; - } else { - return 0; - } - } - return distance; + mesh.layerMask = 268435455; } - } - /** - * Calculate the intercept of a ray on a given axis - * @param axis to check 'x' | 'y' | 'z' - * @param offset from axis interception (i.e. an offset of 1y is intercepted above ground) - * @returns a vector containing the coordinates where 'axis' is equal to zero (else offset), or null if there is no intercept. - */ - intersectsAxis(axis, offset = 0) { - switch (axis) { - case "y": { - const t = (this.origin.y - offset) / this.direction.y; - if (t > 0) { - return null; - } - return new Vector3(this.origin.x + this.direction.x * -t, offset, this.origin.z + this.direction.z * -t); - } - case "x": { - const t = (this.origin.x - offset) / this.direction.x; - if (t > 0) { - return null; - } - return new Vector3(offset, this.origin.y + this.direction.y * -t, this.origin.z + this.direction.z * -t); + if (parsedMesh.physicsImpostor) { + _Mesh._PhysicsImpostorParser(scene, mesh, parsedMesh); + } + if (parsedMesh.lodMeshIds) { + mesh._waitingData.lods = { + ids: parsedMesh.lodMeshIds, + distances: parsedMesh.lodDistances ? parsedMesh.lodDistances : null, + coverages: parsedMesh.lodCoverages ? parsedMesh.lodCoverages : null + }; + } + if (parsedMesh.instances) { + for (let index = 0; index < parsedMesh.instances.length; index++) { + const parsedInstance = parsedMesh.instances[index]; + const instance = mesh.createInstance(parsedInstance.name); + if (parsedInstance.id) { + instance.id = parsedInstance.id; + } + if (Tags) { + if (parsedInstance.tags) { + Tags.AddTagsTo(instance, parsedInstance.tags); + } else { + Tags.AddTagsTo(instance, parsedMesh.tags); + } + } + instance.position = Vector3.FromArray(parsedInstance.position); + if (parsedInstance.metadata !== void 0) { + instance.metadata = parsedInstance.metadata; + } + if (parsedInstance.parentId !== void 0) { + instance._waitingParentId = parsedInstance.parentId; + } + if (parsedInstance.parentInstanceIndex !== void 0) { + instance._waitingParentInstanceIndex = parsedInstance.parentInstanceIndex; + } + if (parsedInstance.isEnabled !== void 0 && parsedInstance.isEnabled !== null) { + instance.setEnabled(parsedInstance.isEnabled); + } + if (parsedInstance.isVisible !== void 0 && parsedInstance.isVisible !== null) { + instance.isVisible = parsedInstance.isVisible; + } + if (parsedInstance.isPickable !== void 0 && parsedInstance.isPickable !== null) { + instance.isPickable = parsedInstance.isPickable; + } + if (parsedInstance.rotationQuaternion) { + instance.rotationQuaternion = Quaternion.FromArray(parsedInstance.rotationQuaternion); + } else if (parsedInstance.rotation) { + instance.rotation = Vector3.FromArray(parsedInstance.rotation); + } + instance.scaling = Vector3.FromArray(parsedInstance.scaling); + if (parsedInstance.checkCollisions != void 0 && parsedInstance.checkCollisions != null) { + instance.checkCollisions = parsedInstance.checkCollisions; + } + if (parsedInstance.pickable != void 0 && parsedInstance.pickable != null) { + instance.isPickable = parsedInstance.pickable; + } + if (parsedInstance.showBoundingBox != void 0 && parsedInstance.showBoundingBox != null) { + instance.showBoundingBox = parsedInstance.showBoundingBox; + } + if (parsedInstance.showSubMeshesBoundingBox != void 0 && parsedInstance.showSubMeshesBoundingBox != null) { + instance.showSubMeshesBoundingBox = parsedInstance.showSubMeshesBoundingBox; + } + if (parsedInstance.alphaIndex != void 0 && parsedInstance.showSubMeshesBoundingBox != null) { + instance.alphaIndex = parsedInstance.alphaIndex; + } + if (parsedInstance.physicsImpostor) { + _Mesh._PhysicsImpostorParser(scene, instance, parsedInstance); + } + if (parsedInstance.actions !== void 0) { + instance._waitingData.actions = parsedInstance.actions; + } + if (parsedInstance.animations) { + for (let animationIndex = 0; animationIndex < parsedInstance.animations.length; animationIndex++) { + const parsedAnimation = parsedInstance.animations[animationIndex]; + const internalClass = GetClass("BABYLON.Animation"); + if (internalClass) { + instance.animations.push(internalClass.Parse(parsedAnimation)); + } + } + Node.ParseAnimationRanges(instance, parsedInstance, scene); + if (parsedInstance.autoAnimate) { + scene.beginAnimation(instance, parsedInstance.autoAnimateFrom, parsedInstance.autoAnimateTo, parsedInstance.autoAnimateLoop, parsedInstance.autoAnimateSpeed || 1); + } + } } - case "z": { - const t = (this.origin.z - offset) / this.direction.z; - if (t > 0) { - return null; + } + if (parsedMesh.thinInstances) { + const thinInstances = parsedMesh.thinInstances; + mesh.thinInstanceEnablePicking = !!thinInstances.enablePicking; + if (thinInstances.matrixData) { + mesh.thinInstanceSetBuffer("matrix", new Float32Array(thinInstances.matrixData), 16, false); + mesh._thinInstanceDataStorage.matrixBufferSize = thinInstances.matrixBufferSize; + mesh._thinInstanceDataStorage.instancesCount = thinInstances.instancesCount; + } else { + mesh._thinInstanceDataStorage.matrixBufferSize = thinInstances.matrixBufferSize; + } + if (parsedMesh.thinInstances.userThinInstance) { + const userThinInstance = parsedMesh.thinInstances.userThinInstance; + for (const kind in userThinInstance.data) { + mesh.thinInstanceSetBuffer(kind, new Float32Array(userThinInstance.data[kind]), userThinInstance.strides[kind], false); + mesh._userThinInstanceBuffersStorage.sizes[kind] = userThinInstance.sizes[kind]; } - return new Vector3(this.origin.x + this.direction.x * -t, this.origin.y + this.direction.y * -t, offset); } - default: - return null; } + return mesh; } + // Skeletons /** - * Checks if ray intersects a mesh. The ray is defined in WORLD space. A mesh triangle can be picked both from its front and back sides, - * irrespective of orientation. - * @param mesh the mesh to check - * @param fastCheck defines if the first intersection will be used (and not the closest) - * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected - * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default) - * @param worldToUse defines the world matrix to use to get the world coordinate of the intersection point - * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check - * @returns picking info of the intersection + * Prepare internal position array for software CPU skinning + * @returns original positions used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh */ - intersectsMesh(mesh, fastCheck, trianglePredicate, onlyBoundingInfo = false, worldToUse, skipBoundingInfo = false) { - const tm = TmpVectors.Matrix[0]; - mesh.getWorldMatrix().invertToRef(tm); - if (this._tmpRay) { - _Ray.TransformToRef(this, tm, this._tmpRay); - } else { - this._tmpRay = _Ray.Transform(this, tm); + setPositionsForCPUSkinning() { + const internalDataInfo = this._internalMeshDataInfo; + if (!internalDataInfo._sourcePositions) { + const source = this.getVerticesData(VertexBuffer.PositionKind); + if (!source) { + return internalDataInfo._sourcePositions; + } + internalDataInfo._sourcePositions = new Float32Array(source); + if (!this.isVertexBufferUpdatable(VertexBuffer.PositionKind)) { + this.setVerticesData(VertexBuffer.PositionKind, source, true); + } } - return mesh.intersects(this._tmpRay, fastCheck, trianglePredicate, onlyBoundingInfo, worldToUse, skipBoundingInfo); + return internalDataInfo._sourcePositions; } /** - * Checks if ray intersects a mesh - * @param meshes the meshes to check - * @param fastCheck defines if the first intersection will be used (and not the closest) - * @param results array to store result in - * @returns Array of picking infos + * Prepare internal normal array for software CPU skinning + * @returns original normals used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh. */ - intersectsMeshes(meshes, fastCheck, results) { - if (results) { - results.length = 0; - } else { - results = []; - } - for (let i = 0; i < meshes.length; i++) { - const pickInfo = this.intersectsMesh(meshes[i], fastCheck); - if (pickInfo.hit) { - results.push(pickInfo); + setNormalsForCPUSkinning() { + const internalDataInfo = this._internalMeshDataInfo; + if (!internalDataInfo._sourceNormals) { + const source = this.getVerticesData(VertexBuffer.NormalKind); + if (!source) { + return internalDataInfo._sourceNormals; + } + internalDataInfo._sourceNormals = new Float32Array(source); + if (!this.isVertexBufferUpdatable(VertexBuffer.NormalKind)) { + this.setVerticesData(VertexBuffer.NormalKind, source, true); } } - results.sort(this._comparePickingInfo); - return results; - } - _comparePickingInfo(pickingInfoA, pickingInfoB) { - if (pickingInfoA.distance < pickingInfoB.distance) { - return -1; - } else if (pickingInfoA.distance > pickingInfoB.distance) { - return 1; - } else { - return 0; - } + return internalDataInfo._sourceNormals; } /** - * Intersection test between the ray and a given segment within a given tolerance (threshold) - * @param sega the first point of the segment to test the intersection against - * @param segb the second point of the segment to test the intersection against - * @param threshold the tolerance margin, if the ray doesn't intersect the segment but is close to the given threshold, the intersection is successful - * @returns the distance from the ray origin to the intersection point if there's intersection, or -1 if there's no intersection + * Updates the vertex buffer by applying transformation from the bones + * @param skeleton defines the skeleton to apply to current mesh + * @returns the current mesh */ - intersectionSegment(sega, segb, threshold) { - const o = this.origin; - const u = TmpVectors.Vector3[0]; - const rsegb = TmpVectors.Vector3[1]; - const v = TmpVectors.Vector3[2]; - const w = TmpVectors.Vector3[3]; - segb.subtractToRef(sega, u); - this.direction.scaleToRef(_Ray._Rayl, v); - o.addToRef(v, rsegb); - sega.subtractToRef(o, w); - const a = Vector3.Dot(u, u); - const b = Vector3.Dot(u, v); - const c = Vector3.Dot(v, v); - const d = Vector3.Dot(u, w); - const e = Vector3.Dot(v, w); - const D = a * c - b * b; - let sN, sD = D; - let tN, tD = D; - if (D < _Ray._Smallnum) { - sN = 0; - sD = 1; - tN = e; - tD = c; - } else { - sN = b * e - c * d; - tN = a * e - b * d; - if (sN < 0) { - sN = 0; - tN = e; - tD = c; - } else if (sN > sD) { - sN = sD; - tN = e + b; - tD = c; - } + applySkeleton(skeleton) { + if (!this.geometry) { + return this; } - if (tN < 0) { - tN = 0; - if (-d < 0) { - sN = 0; - } else if (-d > a) { - sN = sD; - } else { - sN = -d; - sD = a; + if (this.geometry._softwareSkinningFrameId == this.getScene().getFrameId()) { + return this; + } + this.geometry._softwareSkinningFrameId = this.getScene().getFrameId(); + if (!this.isVerticesDataPresent(VertexBuffer.PositionKind)) { + return this; + } + if (!this.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind)) { + return this; + } + if (!this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) { + return this; + } + const hasNormals = this.isVerticesDataPresent(VertexBuffer.NormalKind); + const internalDataInfo = this._internalMeshDataInfo; + if (!internalDataInfo._sourcePositions) { + const submeshes = this.subMeshes.slice(); + this.setPositionsForCPUSkinning(); + this.subMeshes = submeshes; + } + if (hasNormals && !internalDataInfo._sourceNormals) { + this.setNormalsForCPUSkinning(); + } + let positionsData = this.getVerticesData(VertexBuffer.PositionKind); + if (!positionsData) { + return this; + } + if (!(positionsData instanceof Float32Array)) { + positionsData = new Float32Array(positionsData); + } + let normalsData = this.getVerticesData(VertexBuffer.NormalKind); + if (hasNormals) { + if (!normalsData) { + return this; } - } else if (tN > tD) { - tN = tD; - if (-d + b < 0) { - sN = 0; - } else if (-d + b > a) { - sN = sD; - } else { - sN = -d + b; - sD = a; + if (!(normalsData instanceof Float32Array)) { + normalsData = new Float32Array(normalsData); } } - const sc = Math.abs(sN) < _Ray._Smallnum ? 0 : sN / sD; - const tc = Math.abs(tN) < _Ray._Smallnum ? 0 : tN / tD; - const qtc = TmpVectors.Vector3[4]; - v.scaleToRef(tc, qtc); - const qsc = TmpVectors.Vector3[5]; - u.scaleToRef(sc, qsc); - qsc.addInPlace(w); - const dP = TmpVectors.Vector3[6]; - qsc.subtractToRef(qtc, dP); - const isIntersected = tc > 0 && tc <= this.length && dP.lengthSquared() < threshold * threshold; - if (isIntersected) { - return qsc.length(); + const matricesIndicesData = this.getVerticesData(VertexBuffer.MatricesIndicesKind); + const matricesWeightsData = this.getVerticesData(VertexBuffer.MatricesWeightsKind); + if (!matricesWeightsData || !matricesIndicesData) { + return this; } - return -1; - } - /** - * Update the ray from viewport position - * @param x position - * @param y y position - * @param viewportWidth viewport width - * @param viewportHeight viewport height - * @param world world matrix - * @param view view matrix - * @param projection projection matrix - * @param enableDistantPicking defines if picking should handle large values for mesh position/scaling (false by default) - * @returns this ray updated - */ - update(x, y, viewportWidth, viewportHeight, world, view, projection, enableDistantPicking = false) { - if (enableDistantPicking) { - if (!_Ray._RayDistant) { - _Ray._RayDistant = _Ray.Zero(); + const needExtras = this.numBoneInfluencers > 4; + const matricesIndicesExtraData = needExtras ? this.getVerticesData(VertexBuffer.MatricesIndicesExtraKind) : null; + const matricesWeightsExtraData = needExtras ? this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind) : null; + const skeletonMatrices = skeleton.getTransformMatrices(this); + const tempVector3 = Vector3.Zero(); + const finalMatrix = new Matrix(); + const tempMatrix = new Matrix(); + let matWeightIdx = 0; + let inf; + for (let index = 0; index < positionsData.length; index += 3, matWeightIdx += 4) { + let weight; + for (inf = 0; inf < 4; inf++) { + weight = matricesWeightsData[matWeightIdx + inf]; + if (weight > 0) { + Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesData[matWeightIdx + inf] * 16), weight, tempMatrix); + finalMatrix.addToSelf(tempMatrix); + } } - _Ray._RayDistant.unprojectRayToRef(x, y, viewportWidth, viewportHeight, Matrix.IdentityReadOnly, view, projection); - const tm = TmpVectors.Matrix[0]; - world.invertToRef(tm); - _Ray.TransformToRef(_Ray._RayDistant, tm, this); - } else { - this.unprojectRayToRef(x, y, viewportWidth, viewportHeight, world, view, projection); + if (needExtras) { + for (inf = 0; inf < 4; inf++) { + weight = matricesWeightsExtraData[matWeightIdx + inf]; + if (weight > 0) { + Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesExtraData[matWeightIdx + inf] * 16), weight, tempMatrix); + finalMatrix.addToSelf(tempMatrix); + } + } + } + Vector3.TransformCoordinatesFromFloatsToRef(internalDataInfo._sourcePositions[index], internalDataInfo._sourcePositions[index + 1], internalDataInfo._sourcePositions[index + 2], finalMatrix, tempVector3); + tempVector3.toArray(positionsData, index); + if (hasNormals) { + Vector3.TransformNormalFromFloatsToRef(internalDataInfo._sourceNormals[index], internalDataInfo._sourceNormals[index + 1], internalDataInfo._sourceNormals[index + 2], finalMatrix, tempVector3); + tempVector3.toArray(normalsData, index); + } + finalMatrix.reset(); + } + this.updateVerticesData(VertexBuffer.PositionKind, positionsData); + if (hasNormals) { + this.updateVerticesData(VertexBuffer.NormalKind, normalsData); } return this; } - // Statics - /** - * Creates a ray with origin and direction of 0,0,0 - * @returns the new ray - */ - static Zero() { - return new _Ray(Vector3.Zero(), Vector3.Zero()); - } + // Tools /** - * Creates a new ray from screen space and viewport - * @param x position - * @param y y position - * @param viewportWidth viewport width - * @param viewportHeight viewport height - * @param world world matrix - * @param view view matrix - * @param projection projection matrix - * @returns new ray + * Returns an object containing a min and max Vector3 which are the minimum and maximum vectors of each mesh bounding box from the passed array, in the world coordinates + * @param meshes defines the list of meshes to scan + * @returns an object `{min:` Vector3`, max:` Vector3`}` */ - static CreateNew(x, y, viewportWidth, viewportHeight, world, view, projection) { - const result = _Ray.Zero(); - return result.update(x, y, viewportWidth, viewportHeight, world, view, projection); + static MinMax(meshes) { + let minVector = null; + let maxVector = null; + meshes.forEach(function(mesh) { + const boundingInfo = mesh.getBoundingInfo(); + const boundingBox = boundingInfo.boundingBox; + if (!minVector || !maxVector) { + minVector = boundingBox.minimumWorld; + maxVector = boundingBox.maximumWorld; + } else { + minVector.minimizeInPlace(boundingBox.minimumWorld); + maxVector.maximizeInPlace(boundingBox.maximumWorld); + } + }); + if (!minVector || !maxVector) { + return { + min: Vector3.Zero(), + max: Vector3.Zero() + }; + } + return { + min: minVector, + max: maxVector + }; } /** - * Function will create a new transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be - * transformed to the given world matrix. - * @param origin The origin point - * @param end The end point - * @param world a matrix to transform the ray to. Default is the identity matrix. - * @returns the new ray + * Returns the center of the `{min:` Vector3`, max:` Vector3`}` or the center of MinMax vector3 computed from a mesh array + * @param meshesOrMinMaxVector could be an array of meshes or a `{min:` Vector3`, max:` Vector3`}` object + * @returns a vector3 */ - static CreateNewFromTo(origin, end, world = Matrix.IdentityReadOnly) { - const result = new _Ray(new Vector3(0, 0, 0), new Vector3(0, 0, 0)); - return _Ray.CreateFromToToRef(origin, end, result, world); + static Center(meshesOrMinMaxVector) { + const minMaxVector = meshesOrMinMaxVector instanceof Array ? _Mesh.MinMax(meshesOrMinMaxVector) : meshesOrMinMaxVector; + return Vector3.Center(minMaxVector.min, minMaxVector.max); } /** - * Function will update a transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be - * transformed to the given world matrix. - * @param origin The origin point - * @param end The end point - * @param result the object to store the result - * @param world a matrix to transform the ray to. Default is the identity matrix. - * @returns the ref ray + * Merge the array of meshes into a single mesh for performance reasons. + * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes. + * @param disposeSource when true (default), dispose of the vertices from the source meshes. + * @param allow32BitsIndices when the sum of the vertices > 64k, this must be set to true. + * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted. + * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes. + * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes. + * @returns a new mesh */ - static CreateFromToToRef(origin, end, result, world = Matrix.IdentityReadOnly) { - result.origin.copyFrom(origin); - const direction = end.subtractToRef(origin, result.direction); - const length = Math.sqrt(direction.x * direction.x + direction.y * direction.y + direction.z * direction.z); - result.length = length; - result.direction.normalize(); - return _Ray.TransformToRef(result, world, result); + static MergeMeshes(meshes, disposeSource = true, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials) { + return runCoroutineSync(_Mesh._MergeMeshesCoroutine(meshes, disposeSource, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials, false)); } /** - * Transforms a ray by a matrix - * @param ray ray to transform - * @param matrix matrix to apply - * @returns the resulting new ray + * Merge the array of meshes into a single mesh for performance reasons. + * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes. + * @param disposeSource when true (default), dispose of the vertices from the source meshes. + * @param allow32BitsIndices when the sum of the vertices > 64k, this must be set to true. + * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted. + * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes. + * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes. + * @returns a new mesh */ - static Transform(ray, matrix) { - const result = new _Ray(new Vector3(0, 0, 0), new Vector3(0, 0, 0)); - _Ray.TransformToRef(ray, matrix, result); - return result; + static MergeMeshesAsync(meshes, disposeSource = true, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials) { + return runCoroutineAsync(_Mesh._MergeMeshesCoroutine(meshes, disposeSource, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials, true), createYieldingScheduler()); } - /** - * Transforms a ray by a matrix - * @param ray ray to transform - * @param matrix matrix to apply - * @param result ray to store result in - * @returns the updated result ray - */ - static TransformToRef(ray, matrix, result) { - Vector3.TransformCoordinatesToRef(ray.origin, matrix, result.origin); - Vector3.TransformNormalToRef(ray.direction, matrix, result.direction); - result.length = ray.length; - result.epsilon = ray.epsilon; - const dir = result.direction; - const len = dir.length(); - if (!(len === 0 || len === 1)) { - const num = 1 / len; - dir.x *= num; - dir.y *= num; - dir.z *= num; - result.length *= len; + static *_MergeMeshesCoroutine(meshes, disposeSource = true, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials, isAsync) { + meshes = meshes.filter(Boolean); + if (meshes.length === 0) { + return null; } - return result; - } - /** - * Unproject a ray from screen space to object space - * @param sourceX defines the screen space x coordinate to use - * @param sourceY defines the screen space y coordinate to use - * @param viewportWidth defines the current width of the viewport - * @param viewportHeight defines the current height of the viewport - * @param world defines the world matrix to use (can be set to Identity to go to world space) - * @param view defines the view matrix to use - * @param projection defines the projection matrix to use - */ - unprojectRayToRef(sourceX, sourceY, viewportWidth, viewportHeight, world, view, projection) { - const matrix = TmpVectors.Matrix[0]; - world.multiplyToRef(view, matrix); - matrix.multiplyToRef(projection, matrix); - matrix.invert(); - const engine = EngineStore.LastCreatedEngine; - const nearScreenSource = TmpVectors.Vector3[0]; - nearScreenSource.x = sourceX / viewportWidth * 2 - 1; - nearScreenSource.y = -(sourceY / viewportHeight * 2 - 1); - nearScreenSource.z = (engine == null ? void 0 : engine.useReverseDepthBuffer) ? 1 : (engine == null ? void 0 : engine.isNDCHalfZRange) ? 0 : -1; - const farScreenSource = TmpVectors.Vector3[1].copyFromFloats(nearScreenSource.x, nearScreenSource.y, 1 - 1e-8); - const nearVec3 = TmpVectors.Vector3[2]; - const farVec3 = TmpVectors.Vector3[3]; - Vector3._UnprojectFromInvertedMatrixToRef(nearScreenSource, matrix, nearVec3); - Vector3._UnprojectFromInvertedMatrixToRef(farScreenSource, matrix, farVec3); - this.origin.copyFrom(nearVec3); - farVec3.subtractToRef(nearVec3, this.direction); - this.direction.normalize(); - } -}; -Ray._TmpVector3 = ArrayTools.BuildArray(6, Vector3.Zero); -Ray._RayDistant = Ray.Zero(); -Ray._Smallnum = 1e-8; -Ray._Rayl = 1e9; -Scene.prototype.createPickingRay = function(x, y, world, camera, cameraViewSpace = false) { - const result = Ray.Zero(); - this.createPickingRayToRef(x, y, world, result, camera, cameraViewSpace); - return result; -}; -Scene.prototype.createPickingRayToRef = function(x, y, world, result, camera, cameraViewSpace = false, enableDistantPicking = false) { - const engine = this.getEngine(); - if (!camera && !(camera = this.activeCamera)) { - return this; - } - const cameraViewport = camera.viewport; - const renderHeight = engine.getRenderHeight(); - const { x: vx, y: vy, width, height } = cameraViewport.toGlobal(engine.getRenderWidth(), renderHeight); - const levelInv = 1 / engine.getHardwareScalingLevel(); - x = x * levelInv - vx; - y = y * levelInv - (renderHeight - vy - height); - result.update(x, y, width, height, world ? world : Matrix.IdentityReadOnly, cameraViewSpace ? Matrix.IdentityReadOnly : camera.getViewMatrix(), camera.getProjectionMatrix(), enableDistantPicking); - return this; -}; -Scene.prototype.createPickingRayInCameraSpace = function(x, y, camera) { - const result = Ray.Zero(); - this.createPickingRayInCameraSpaceToRef(x, y, result, camera); - return result; -}; -Scene.prototype.createPickingRayInCameraSpaceToRef = function(x, y, result, camera) { - if (!PickingInfo) { - return this; - } - const engine = this.getEngine(); - if (!camera && !(camera = this.activeCamera)) { - throw new Error("Active camera not set"); - } - const cameraViewport = camera.viewport; - const renderHeight = engine.getRenderHeight(); - const { x: vx, y: vy, width, height } = cameraViewport.toGlobal(engine.getRenderWidth(), renderHeight); - const identity = Matrix.Identity(); - const levelInv = 1 / engine.getHardwareScalingLevel(); - x = x * levelInv - vx; - y = y * levelInv - (renderHeight - vy - height); - result.update(x, y, width, height, identity, identity, camera.getProjectionMatrix()); - return this; -}; -Scene.prototype._internalPickForMesh = function(pickingInfo, rayFunction, mesh, world, fastCheck, onlyBoundingInfo, trianglePredicate, skipBoundingInfo) { - const ray = rayFunction(world, mesh.enableDistantPicking); - const result = mesh.intersects(ray, fastCheck, trianglePredicate, onlyBoundingInfo, world, skipBoundingInfo); - if (!result || !result.hit) { - return null; - } - if (!fastCheck && pickingInfo != null && result.distance >= pickingInfo.distance) { - return null; - } - return result; -}; -Scene.prototype._internalPick = function(rayFunction, predicate, fastCheck, onlyBoundingInfo, trianglePredicate) { - let pickingInfo = null; - const computeWorldMatrixForCamera = !!(this.activeCameras && this.activeCameras.length > 1 && this.cameraToUseForPointers !== this.activeCamera); - const currentCamera = this.cameraToUseForPointers || this.activeCamera; - for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) { - const mesh = this.meshes[meshIndex]; - if (predicate) { - if (!predicate(mesh)) { - continue; + let index; + if (!allow32BitsIndices) { + let totalVertices = 0; + for (index = 0; index < meshes.length; index++) { + totalVertices += meshes[index].getTotalVertices(); + if (totalVertices >= 65536) { + Logger.Warn("Cannot merge meshes because resulting mesh will have more than 65536 vertices. Please use allow32BitsIndices = true to use 32 bits indices"); + return null; + } } - } else if (!mesh.isEnabled() || !mesh.isVisible || !mesh.isPickable) { - continue; } - const forceCompute = computeWorldMatrixForCamera && mesh.isWorldMatrixCameraDependent(); - const world = mesh.computeWorldMatrix(forceCompute, currentCamera); - if (mesh.hasThinInstances && mesh.thinInstanceEnablePicking) { - const result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, world, true, true, trianglePredicate); - if (result) { - if (onlyBoundingInfo) { - return result; - } - const tmpMatrix = TmpVectors.Matrix[1]; - const thinMatrices = mesh.thinInstanceGetWorldMatrices(); - for (let index = 0; index < thinMatrices.length; index++) { - const thinMatrix = thinMatrices[index]; - thinMatrix.multiplyToRef(world, tmpMatrix); - const result2 = this._internalPickForMesh(pickingInfo, rayFunction, mesh, tmpMatrix, fastCheck, onlyBoundingInfo, trianglePredicate, true); - if (result2) { - pickingInfo = result2; - pickingInfo.thinInstanceIndex = index; - if (fastCheck) { - return pickingInfo; - } - } - } + if (multiMultiMaterials) { + subdivideWithSubMeshes = false; + } + const materialArray = new Array(); + const materialIndexArray = new Array(); + const indiceArray = new Array(); + const currentOverrideMaterialSideOrientation = meshes[0].overrideMaterialSideOrientation; + for (index = 0; index < meshes.length; index++) { + const mesh = meshes[index]; + if (mesh.isAnInstance) { + Logger.Warn("Cannot merge instance meshes."); + return null; } - } else { - const result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, world, fastCheck, onlyBoundingInfo, trianglePredicate); - if (result) { - pickingInfo = result; - if (fastCheck) { - return pickingInfo; - } + if (currentOverrideMaterialSideOrientation !== mesh.overrideMaterialSideOrientation) { + Logger.Warn("Cannot merge meshes with different overrideMaterialSideOrientation values."); + return null; } - } - } - return pickingInfo || new PickingInfo(); -}; -Scene.prototype._internalMultiPick = function(rayFunction, predicate, trianglePredicate) { - if (!PickingInfo) { - return null; - } - const pickingInfos = []; - const computeWorldMatrixForCamera = !!(this.activeCameras && this.activeCameras.length > 1 && this.cameraToUseForPointers !== this.activeCamera); - const currentCamera = this.cameraToUseForPointers || this.activeCamera; - for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) { - const mesh = this.meshes[meshIndex]; - if (predicate) { - if (!predicate(mesh)) { - continue; + if (subdivideWithSubMeshes) { + indiceArray.push(mesh.getTotalIndices()); } - } else if (!mesh.isEnabled() || !mesh.isVisible || !mesh.isPickable) { - continue; - } - const forceCompute = computeWorldMatrixForCamera && mesh.isWorldMatrixCameraDependent(); - const world = mesh.computeWorldMatrix(forceCompute, currentCamera); - if (mesh.hasThinInstances && mesh.thinInstanceEnablePicking) { - const result = this._internalPickForMesh(null, rayFunction, mesh, world, true, true, trianglePredicate); - if (result) { - const tmpMatrix = TmpVectors.Matrix[1]; - const thinMatrices = mesh.thinInstanceGetWorldMatrices(); - for (let index = 0; index < thinMatrices.length; index++) { - const thinMatrix = thinMatrices[index]; - thinMatrix.multiplyToRef(world, tmpMatrix); - const result2 = this._internalPickForMesh(null, rayFunction, mesh, tmpMatrix, false, false, trianglePredicate, true); - if (result2) { - result2.thinInstanceIndex = index; - pickingInfos.push(result2); + if (multiMultiMaterials) { + if (mesh.material) { + const material = mesh.material; + if (material instanceof MultiMaterial) { + for (let matIndex = 0; matIndex < material.subMaterials.length; matIndex++) { + if (materialArray.indexOf(material.subMaterials[matIndex]) < 0) { + materialArray.push(material.subMaterials[matIndex]); + } + } + for (let subIndex = 0; subIndex < mesh.subMeshes.length; subIndex++) { + materialIndexArray.push(materialArray.indexOf(material.subMaterials[mesh.subMeshes[subIndex].materialIndex])); + indiceArray.push(mesh.subMeshes[subIndex].indexCount); + } + } else { + if (materialArray.indexOf(material) < 0) { + materialArray.push(material); + } + for (let subIndex = 0; subIndex < mesh.subMeshes.length; subIndex++) { + materialIndexArray.push(materialArray.indexOf(material)); + indiceArray.push(mesh.subMeshes[subIndex].indexCount); + } + } + } else { + for (let subIndex = 0; subIndex < mesh.subMeshes.length; subIndex++) { + materialIndexArray.push(0); + indiceArray.push(mesh.subMeshes[subIndex].indexCount); } } } - } else { - const result = this._internalPickForMesh(null, rayFunction, mesh, world, false, false, trianglePredicate); - if (result) { - pickingInfos.push(result); + } + const source = meshes[0]; + const getVertexDataFromMesh = (mesh) => { + const wm = mesh.computeWorldMatrix(true); + const vertexData2 = VertexData.ExtractFromMesh(mesh, false, false); + return { vertexData: vertexData2, transform: wm }; + }; + const { vertexData: sourceVertexData, transform: sourceTransform } = getVertexDataFromMesh(source); + if (isAsync) { + yield; + } + const meshVertexDatas = new Array(meshes.length - 1); + for (let i = 1; i < meshes.length; i++) { + meshVertexDatas[i - 1] = getVertexDataFromMesh(meshes[i]); + if (isAsync) { + yield; } } - } - return pickingInfos; -}; -Scene.prototype.pickWithBoundingInfo = function(x, y, predicate, fastCheck, camera) { - if (!PickingInfo) { - return null; - } - const result = this._internalPick((world) => { - if (!this._tempPickingRay) { - this._tempPickingRay = Ray.Zero(); + const mergeCoroutine = sourceVertexData._mergeCoroutine(sourceTransform, meshVertexDatas, allow32BitsIndices, isAsync, !disposeSource); + let mergeCoroutineStep = mergeCoroutine.next(); + while (!mergeCoroutineStep.done) { + if (isAsync) { + yield; + } + mergeCoroutineStep = mergeCoroutine.next(); } - this.createPickingRayToRef(x, y, world, this._tempPickingRay, camera || null); - return this._tempPickingRay; - }, predicate, fastCheck, true); - if (result) { - result.ray = this.createPickingRay(x, y, Matrix.Identity(), camera || null); - } - return result; -}; -Object.defineProperty(Scene.prototype, "_pickingAvailable", { - get: () => true, - enumerable: false, - configurable: false -}); -Scene.prototype.pick = function(x, y, predicate, fastCheck, camera, trianglePredicate, _enableDistantPicking = false) { - const result = this._internalPick((world, enableDistantPicking) => { - if (!this._tempPickingRay) { - this._tempPickingRay = Ray.Zero(); + const vertexData = mergeCoroutineStep.value; + if (!meshSubclass) { + meshSubclass = new _Mesh(source.name + "_merged", source.getScene()); } - this.createPickingRayToRef(x, y, world, this._tempPickingRay, camera || null, false, enableDistantPicking); - return this._tempPickingRay; - }, predicate, fastCheck, false, trianglePredicate); - if (result) { - result.ray = this.createPickingRay(x, y, Matrix.Identity(), camera || null); - } - return result; -}; -Scene.prototype.pickWithRay = function(ray, predicate, fastCheck, trianglePredicate) { - const result = this._internalPick((world) => { - if (!this._pickWithRayInverseMatrix) { - this._pickWithRayInverseMatrix = Matrix.Identity(); + const applyToCoroutine = vertexData._applyToCoroutine(meshSubclass, void 0, isAsync); + let applyToCoroutineStep = applyToCoroutine.next(); + while (!applyToCoroutineStep.done) { + if (isAsync) { + yield; + } + applyToCoroutineStep = applyToCoroutine.next(); } - world.invertToRef(this._pickWithRayInverseMatrix); - if (!this._cachedRayForTransform) { - this._cachedRayForTransform = Ray.Zero(); + meshSubclass.checkCollisions = source.checkCollisions; + meshSubclass.overrideMaterialSideOrientation = source.overrideMaterialSideOrientation; + if (disposeSource) { + for (index = 0; index < meshes.length; index++) { + meshes[index].dispose(); + } } - Ray.TransformToRef(ray, this._pickWithRayInverseMatrix, this._cachedRayForTransform); - return this._cachedRayForTransform; - }, predicate, fastCheck, false, trianglePredicate); - if (result) { - result.ray = ray; - } - return result; -}; -Scene.prototype.multiPick = function(x, y, predicate, camera, trianglePredicate) { - return this._internalMultiPick((world) => this.createPickingRay(x, y, world, camera || null), predicate, trianglePredicate); -}; -Scene.prototype.multiPickWithRay = function(ray, predicate, trianglePredicate) { - return this._internalMultiPick((world) => { - if (!this._pickWithRayInverseMatrix) { - this._pickWithRayInverseMatrix = Matrix.Identity(); + if (subdivideWithSubMeshes || multiMultiMaterials) { + meshSubclass.releaseSubMeshes(); + index = 0; + let offset = 0; + while (index < indiceArray.length) { + SubMesh.CreateFromIndices(0, offset, indiceArray[index], meshSubclass, void 0, false); + offset += indiceArray[index]; + index++; + } + for (const subMesh of meshSubclass.subMeshes) { + subMesh.refreshBoundingInfo(); + } + meshSubclass.computeWorldMatrix(true); } - world.invertToRef(this._pickWithRayInverseMatrix); - if (!this._cachedRayForTransform) { - this._cachedRayForTransform = Ray.Zero(); + if (multiMultiMaterials) { + const newMultiMaterial = new MultiMaterial(source.name + "_merged", source.getScene()); + newMultiMaterial.subMaterials = materialArray; + for (let subIndex = 0; subIndex < meshSubclass.subMeshes.length; subIndex++) { + meshSubclass.subMeshes[subIndex].materialIndex = materialIndexArray[subIndex]; + } + meshSubclass.material = newMultiMaterial; + } else { + meshSubclass.material = source.material; } - Ray.TransformToRef(ray, this._pickWithRayInverseMatrix, this._cachedRayForTransform); - return this._cachedRayForTransform; - }, predicate, trianglePredicate); -}; -Camera.prototype.getForwardRay = function(length = 100, transform, origin) { - return this.getForwardRayToRef(new Ray(Vector3.Zero(), Vector3.Zero(), length), length, transform, origin); -}; -Camera.prototype.getForwardRayToRef = function(refRay, length = 100, transform, origin) { - if (!transform) { - transform = this.getWorldMatrix(); - } - refRay.length = length; - if (origin) { - refRay.origin.copyFrom(origin); - } else { - refRay.origin.copyFrom(this.position); + return meshSubclass; } - const forward = TmpVectors.Vector3[2]; - forward.set(0, 0, this._scene.useRightHandedSystem ? -1 : 1); - const worldForward = TmpVectors.Vector3[3]; - Vector3.TransformNormalToRef(forward, transform, worldForward); - Vector3.NormalizeToRef(worldForward, refRay.direction); - return refRay; -}; - -// node_modules/@babylonjs/core/Misc/pivotTools.js -var PivotTools = class _PivotTools { /** * @internal */ - static _RemoveAndStorePivotPoint(mesh) { - if (mesh && _PivotTools._PivotCached === 0) { - mesh.getPivotPointToRef(_PivotTools._OldPivotPoint); - _PivotTools._PivotPostMultiplyPivotMatrix = mesh._postMultiplyPivotMatrix; - if (!_PivotTools._OldPivotPoint.equalsToFloats(0, 0, 0)) { - mesh.setPivotMatrix(Matrix.IdentityReadOnly); - _PivotTools._OldPivotPoint.subtractToRef(mesh.getPivotPoint(), _PivotTools._PivotTranslation); - _PivotTools._PivotTmpVector.copyFromFloats(1, 1, 1); - _PivotTools._PivotTmpVector.subtractInPlace(mesh.scaling); - _PivotTools._PivotTmpVector.multiplyInPlace(_PivotTools._PivotTranslation); - mesh.position.addInPlace(_PivotTools._PivotTmpVector); - } - } - _PivotTools._PivotCached++; + addInstance(instance) { + instance._indexInSourceMeshInstanceArray = this.instances.length; + this.instances.push(instance); } /** * @internal */ - static _RestorePivotPoint(mesh) { - if (mesh && !_PivotTools._OldPivotPoint.equalsToFloats(0, 0, 0) && _PivotTools._PivotCached === 1) { - mesh.setPivotPoint(_PivotTools._OldPivotPoint); - mesh._postMultiplyPivotMatrix = _PivotTools._PivotPostMultiplyPivotMatrix; - _PivotTools._PivotTmpVector.copyFromFloats(1, 1, 1); - _PivotTools._PivotTmpVector.subtractInPlace(mesh.scaling); - _PivotTools._PivotTmpVector.multiplyInPlace(_PivotTools._PivotTranslation); - mesh.position.subtractInPlace(_PivotTools._PivotTmpVector); + removeInstance(instance) { + const index = instance._indexInSourceMeshInstanceArray; + if (index != -1) { + if (index !== this.instances.length - 1) { + const last = this.instances[this.instances.length - 1]; + this.instances[index] = last; + last._indexInSourceMeshInstanceArray = index; + } + instance._indexInSourceMeshInstanceArray = -1; + this.instances.pop(); } - this._PivotCached--; } -}; -PivotTools._PivotCached = 0; -PivotTools._OldPivotPoint = new Vector3(); -PivotTools._PivotTranslation = new Vector3(); -PivotTools._PivotTmpVector = new Vector3(); -PivotTools._PivotPostMultiplyPivotMatrix = false; - -// node_modules/@babylonjs/core/Meshes/Builders/planeBuilder.js -function CreatePlaneVertexData(options) { - const indices = []; - const positions = []; - const normals = []; - const uvs = []; - const width = options.width || options.size || 1; - const height = options.height || options.size || 1; - const sideOrientation = options.sideOrientation === 0 ? 0 : options.sideOrientation || VertexData.DEFAULTSIDE; - const halfWidth = width / 2; - const halfHeight = height / 2; - positions.push(-halfWidth, -halfHeight, 0); - normals.push(0, 0, -1); - uvs.push(0, CompatibilityOptions.UseOpenGLOrientationForUV ? 1 : 0); - positions.push(halfWidth, -halfHeight, 0); - normals.push(0, 0, -1); - uvs.push(1, CompatibilityOptions.UseOpenGLOrientationForUV ? 1 : 0); - positions.push(halfWidth, halfHeight, 0); - normals.push(0, 0, -1); - uvs.push(1, CompatibilityOptions.UseOpenGLOrientationForUV ? 0 : 1); - positions.push(-halfWidth, halfHeight, 0); - normals.push(0, 0, -1); - uvs.push(0, CompatibilityOptions.UseOpenGLOrientationForUV ? 0 : 1); - indices.push(0); - indices.push(1); - indices.push(2); - indices.push(0); - indices.push(2); - indices.push(3); - VertexData._ComputeSides(sideOrientation, positions, indices, normals, uvs, options.frontUVs, options.backUVs); - const vertexData = new VertexData(); - vertexData.indices = indices; - vertexData.positions = positions; - vertexData.normals = normals; - vertexData.uvs = uvs; - return vertexData; -} -function CreatePlane(name69, options = {}, scene = null) { - const plane = new Mesh(name69, scene); - options.sideOrientation = Mesh._GetDefaultSideOrientation(options.sideOrientation); - plane._originalBuilderSideOrientation = options.sideOrientation; - const vertexData = CreatePlaneVertexData(options); - vertexData.applyToMesh(plane, options.updatable); - if (options.sourcePlane) { - plane.translate(options.sourcePlane.normal, -options.sourcePlane.d); - plane.setDirection(options.sourcePlane.normal.scale(-1)); + /** @internal */ + _shouldConvertRHS() { + return this.overrideMaterialSideOrientation === Material.CounterClockWiseSideOrientation; } - return plane; -} -var PlaneBuilder = { - // eslint-disable-next-line @typescript-eslint/naming-convention - CreatePlane -}; -VertexData.CreatePlane = CreatePlaneVertexData; -Mesh.CreatePlane = (name69, size, scene, updatable, sideOrientation) => { - const options = { - size, - width: size, - height: size, - sideOrientation, - updatable - }; - return CreatePlane(name69, options, scene); -}; - -// node_modules/@babylonjs/core/Behaviors/Meshes/pointerDragBehavior.js -var PointerDragBehavior = class _PointerDragBehavior { + /** @internal */ + _getRenderingFillMode(fillMode) { + const scene = this.getScene(); + if (scene.forcePointsCloud) + return Material.PointFillMode; + if (scene.forceWireframe) + return Material.WireFrameFillMode; + return this.overrideRenderingFillMode ?? fillMode; + } + // deprecated methods /** - * Get or set the currentDraggingPointerId - * @deprecated Please use currentDraggingPointerId instead + * Sets the mesh material by the material or multiMaterial `id` property + * @param id is a string identifying the material or the multiMaterial + * @returns the current mesh + * @deprecated Please use MeshBuilder instead Please use setMaterialById instead */ - get currentDraggingPointerID() { - return this.currentDraggingPointerId; - } - set currentDraggingPointerID(currentDraggingPointerID) { - this.currentDraggingPointerId = currentDraggingPointerID; + setMaterialByID(id) { + return this.setMaterialById(id); } /** - * If the drag behavior will react to drag events (Default: true) + * Creates a ribbon mesh. + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param + * @param name defines the name of the mesh to create + * @param pathArray is a required array of paths, what are each an array of successive Vector3. The pathArray parameter depicts the ribbon geometry. + * @param closeArray creates a seam between the first and the last paths of the path array (default is false) + * @param closePath creates a seam between the first and the last points of each path of the path array + * @param offset is taken in account only if the `pathArray` is containing a single path + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @param instance defines an instance of an existing Ribbon object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#ribbon) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - set enabled(value) { - if (value != this._enabled) { - this.onEnabledObservable.notifyObservers(value); - } - this._enabled = value; - } - get enabled() { - return this._enabled; + static CreateRibbon(name69, pathArray, closeArray, closePath, offset, scene, updatable, sideOrientation, instance) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * Gets the options used by the behavior + * Creates a plane polygonal mesh. By default, this is a disc. + * @param name defines the name of the mesh to create + * @param radius sets the radius size (float) of the polygon (default 0.5) + * @param tessellation sets the number of polygon sides (positive integer, default 64). So a tessellation valued to 3 will build a triangle, to 4 a square, etc + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - get options() { - return this._options; + static CreateDisc(name69, radius, tessellation, scene, updatable, sideOrientation) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * Sets the options used by the behavior - */ - set options(options) { - this._options = options; - } - /** - * Creates a pointer drag behavior that can be attached to a mesh - * @param options The drag axis or normal of the plane that will be dragged across. If no options are specified the drag plane will always face the ray's origin (eg. camera) - * @param options.dragAxis - * @param options.dragPlaneNormal - */ - constructor(options) { - this._useAlternatePickedPointAboveMaxDragAngleDragSpeed = -1.1; - this._activeDragButton = -1; - this.maxDragAngle = 0; - this.dragButtons = [0, 1, 2]; - this._useAlternatePickedPointAboveMaxDragAngle = false; - this.currentDraggingPointerId = -1; - this.dragging = false; - this.dragDeltaRatio = 0.2; - this.updateDragPlane = true; - this._debugMode = false; - this._moving = false; - this.onDragObservable = new Observable(); - this.onDragStartObservable = new Observable(); - this.onDragEndObservable = new Observable(); - this.onEnabledObservable = new Observable(); - this.moveAttached = true; - this._enabled = true; - this.startAndReleaseDragOnPointerEvents = true; - this.detachCameraControls = true; - this.useObjectOrientationForDragging = true; - this.validateDrag = (target) => { - return true; - }; - this._tmpVector = new Vector3(0, 0, 0); - this._alternatePickedPoint = new Vector3(0, 0, 0); - this._worldDragAxis = new Vector3(0, 0, 0); - this._targetPosition = new Vector3(0, 0, 0); - this._attachedToElement = false; - this._startDragRay = new Ray(new Vector3(), new Vector3()); - this._lastPointerRay = {}; - this._dragDelta = new Vector3(); - this._pointA = new Vector3(0, 0, 0); - this._pointC = new Vector3(0, 0, 0); - this._localAxis = new Vector3(0, 0, 0); - this._lookAt = new Vector3(0, 0, 0); - this._options = options ? options : {}; - let optionCount = 0; - if (this._options.dragAxis) { - optionCount++; - } - if (this._options.dragPlaneNormal) { - optionCount++; - } - if (optionCount > 1) { - throw "Multiple drag modes specified in dragBehavior options. Only one expected"; - } - } - /** - * The name of the behavior + * Creates a box mesh. + * @param name defines the name of the mesh to create + * @param size sets the size (float) of each box side (default 1) + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - get name() { - return "PointerDrag"; + static CreateBox(name69, size, scene, updatable, sideOrientation) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * Initializes the behavior + * Creates a sphere mesh. + * @param name defines the name of the mesh to create + * @param segments sets the sphere number of horizontal stripes (positive integer, default 32) + * @param diameter sets the diameter size (float) of the sphere (default 1) + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - init() { + static CreateSphere(name69, segments, diameter, scene, updatable, sideOrientation) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * Attaches the drag behavior the passed in mesh - * @param ownerNode The mesh that will be dragged around once attached - * @param predicate Predicate to use for pick filtering + * Creates a hemisphere mesh. + * @param name defines the name of the mesh to create + * @param segments sets the sphere number of horizontal stripes (positive integer, default 32) + * @param diameter sets the diameter size (float) of the sphere (default 1) + * @param scene defines the hosting scene + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - attach(ownerNode, predicate) { - this._scene = ownerNode.getScene(); - ownerNode.isNearGrabbable = true; - this.attachedNode = ownerNode; - if (!_PointerDragBehavior._PlaneScene) { - if (this._debugMode) { - _PointerDragBehavior._PlaneScene = this._scene; - } else { - _PointerDragBehavior._PlaneScene = new Scene(this._scene.getEngine(), { virtual: true }); - _PointerDragBehavior._PlaneScene.detachControl(); - this._scene.onDisposeObservable.addOnce(() => { - _PointerDragBehavior._PlaneScene.dispose(); - _PointerDragBehavior._PlaneScene = null; - }); - } - } - this._dragPlane = CreatePlane("pointerDragPlane", { size: this._debugMode ? 1 : 1e4, updatable: false, sideOrientation: Mesh.DOUBLESIDE }, _PointerDragBehavior._PlaneScene); - this.lastDragPosition = new Vector3(0, 0, 0); - const pickPredicate = predicate ? predicate : (m) => { - return this.attachedNode == m || m.isDescendantOf(this.attachedNode); - }; - this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => { - if (!this.enabled) { - if (this._attachedToElement) { - this.releaseDrag(); - } - return; - } - if (pointerInfo.type == PointerEventTypes.POINTERDOWN) { - if (this.startAndReleaseDragOnPointerEvents && !this.dragging && pointerInfo.pickInfo && pointerInfo.pickInfo.hit && pointerInfo.pickInfo.pickedMesh && pointerInfo.pickInfo.pickedPoint && pointerInfo.pickInfo.ray && pickPredicate(pointerInfo.pickInfo.pickedMesh)) { - if (this._activeDragButton === -1 && this.dragButtons.indexOf(pointerInfo.event.button) !== -1) { - this._activeDragButton = pointerInfo.event.button; - this._activePointerInfo = pointerInfo; - this._startDrag(pointerInfo.event.pointerId, pointerInfo.pickInfo.ray, pointerInfo.pickInfo.pickedPoint); - } - } - } else if (pointerInfo.type == PointerEventTypes.POINTERUP) { - if (this.startAndReleaseDragOnPointerEvents && this.currentDraggingPointerId == pointerInfo.event.pointerId && (this._activeDragButton === pointerInfo.event.button || this._activeDragButton === -1)) { - this.releaseDrag(); - } - } else if (pointerInfo.type == PointerEventTypes.POINTERMOVE) { - const pointerId = pointerInfo.event.pointerId; - if (this.currentDraggingPointerId === _PointerDragBehavior._AnyMouseId && pointerId !== _PointerDragBehavior._AnyMouseId) { - const evt = pointerInfo.event; - const isMouseEvent = evt.pointerType === "mouse" || !this._scene.getEngine().hostInformation.isMobile && evt instanceof MouseEvent; - if (isMouseEvent) { - if (this._lastPointerRay[this.currentDraggingPointerId]) { - this._lastPointerRay[pointerId] = this._lastPointerRay[this.currentDraggingPointerId]; - delete this._lastPointerRay[this.currentDraggingPointerId]; - } - this.currentDraggingPointerId = pointerId; - } - } - if (!this._lastPointerRay[pointerId]) { - this._lastPointerRay[pointerId] = new Ray(new Vector3(), new Vector3()); - } - if (pointerInfo.pickInfo && pointerInfo.pickInfo.ray) { - this._lastPointerRay[pointerId].origin.copyFrom(pointerInfo.pickInfo.ray.origin); - this._lastPointerRay[pointerId].direction.copyFrom(pointerInfo.pickInfo.ray.direction); - if (this.currentDraggingPointerId == pointerId && this.dragging) { - this._moveDrag(pointerInfo.pickInfo.ray); - } - } - } - }); - this._beforeRenderObserver = this._scene.onBeforeRenderObservable.add(() => { - if (this._moving && this.moveAttached) { - let needMatrixUpdate = false; - PivotTools._RemoveAndStorePivotPoint(this.attachedNode); - this._targetPosition.subtractToRef(this.attachedNode.absolutePosition, this._tmpVector); - this._tmpVector.scaleInPlace(this.dragDeltaRatio); - this.attachedNode.getAbsolutePosition().addToRef(this._tmpVector, this._tmpVector); - if (this.validateDrag(this._tmpVector)) { - this.attachedNode.setAbsolutePosition(this._tmpVector); - needMatrixUpdate = true; - } - PivotTools._RestorePivotPoint(this.attachedNode); - if (needMatrixUpdate) { - this.attachedNode.computeWorldMatrix(); - } - } - }); + static CreateHemisphere(name69, segments, diameter, scene) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * Force release the drag action by code. + * Creates a cylinder or a cone mesh. + * @param name defines the name of the mesh to create + * @param height sets the height size (float) of the cylinder/cone (float, default 2) + * @param diameterTop set the top cap diameter (floats, default 1) + * @param diameterBottom set the bottom cap diameter (floats, default 1). This value can't be zero + * @param tessellation sets the number of cylinder sides (positive integer, default 24). Set it to 3 to get a prism for instance + * @param subdivisions sets the number of rings along the cylinder height (positive integer, default 1) + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - releaseDrag() { - if (this.dragging) { - this.dragging = false; - this.onDragEndObservable.notifyObservers({ dragPlanePoint: this.lastDragPosition, pointerId: this.currentDraggingPointerId, pointerInfo: this._activePointerInfo }); - } - this.currentDraggingPointerId = -1; - this._activeDragButton = -1; - this._activePointerInfo = null; - this._moving = false; - if (this.detachCameraControls && this._attachedToElement && this._scene.activeCamera && !this._scene.activeCamera.leftCamera) { - if (this._scene.activeCamera.getClassName() === "ArcRotateCamera") { - const arcRotateCamera = this._scene.activeCamera; - arcRotateCamera.attachControl(arcRotateCamera.inputs ? arcRotateCamera.inputs.noPreventDefault : true, arcRotateCamera._useCtrlForPanning, arcRotateCamera._panningMouseButton); - } else { - this._scene.activeCamera.attachControl(this._scene.activeCamera.inputs ? this._scene.activeCamera.inputs.noPreventDefault : true); - } - this._attachedToElement = false; - } + static CreateCylinder(name69, height, diameterTop, diameterBottom, tessellation, subdivisions, scene, updatable, sideOrientation) { + throw new Error("Import MeshBuilder to populate this function"); } + // Torus (Code from SharpDX.org) /** - * Simulates the start of a pointer drag event on the behavior - * @param pointerId pointerID of the pointer that should be simulated (Default: Any mouse pointer ID) - * @param fromRay initial ray of the pointer to be simulated (Default: Ray from camera to attached mesh) - * @param startPickedPoint picked point of the pointer to be simulated (Default: attached mesh position) + * Creates a torus mesh. + * @param name defines the name of the mesh to create + * @param diameter sets the diameter size (float) of the torus (default 1) + * @param thickness sets the diameter size of the tube of the torus (float, default 0.5) + * @param tessellation sets the number of torus sides (positive integer, default 16) + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - startDrag(pointerId = _PointerDragBehavior._AnyMouseId, fromRay, startPickedPoint) { - this._startDrag(pointerId, fromRay, startPickedPoint); - let lastRay = this._lastPointerRay[pointerId]; - if (pointerId === _PointerDragBehavior._AnyMouseId) { - lastRay = this._lastPointerRay[Object.keys(this._lastPointerRay)[0]]; - } - if (lastRay) { - this._moveDrag(lastRay); - } - } - _startDrag(pointerId, fromRay, startPickedPoint) { - if (!this._scene.activeCamera || this.dragging || !this.attachedNode) { - return; - } - PivotTools._RemoveAndStorePivotPoint(this.attachedNode); - if (fromRay) { - this._startDragRay.direction.copyFrom(fromRay.direction); - this._startDragRay.origin.copyFrom(fromRay.origin); - } else { - this._startDragRay.origin.copyFrom(this._scene.activeCamera.position); - this.attachedNode.getWorldMatrix().getTranslationToRef(this._tmpVector); - this._tmpVector.subtractToRef(this._scene.activeCamera.position, this._startDragRay.direction); - } - this._updateDragPlanePosition(this._startDragRay, startPickedPoint ? startPickedPoint : this._tmpVector); - const pickedPoint = this._pickWithRayOnDragPlane(this._startDragRay); - if (pickedPoint) { - this.dragging = true; - this.currentDraggingPointerId = pointerId; - this.lastDragPosition.copyFrom(pickedPoint); - this.onDragStartObservable.notifyObservers({ dragPlanePoint: pickedPoint, pointerId: this.currentDraggingPointerId, pointerInfo: this._activePointerInfo }); - this._targetPosition.copyFrom(this.attachedNode.getAbsolutePosition()); - if (this.detachCameraControls && this._scene.activeCamera && this._scene.activeCamera.inputs && !this._scene.activeCamera.leftCamera) { - if (this._scene.activeCamera.inputs.attachedToElement) { - this._scene.activeCamera.detachControl(); - this._attachedToElement = true; - } else { - this._attachedToElement = false; - } - } - } else { - this.releaseDrag(); - } - PivotTools._RestorePivotPoint(this.attachedNode); - } - _moveDrag(ray) { - this._moving = true; - const pickedPoint = this._pickWithRayOnDragPlane(ray); - if (pickedPoint) { - PivotTools._RemoveAndStorePivotPoint(this.attachedNode); - if (this.updateDragPlane) { - this._updateDragPlanePosition(ray, pickedPoint); - } - let dragLength = 0; - if (this._options.dragAxis) { - this.useObjectOrientationForDragging ? Vector3.TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._worldDragAxis) : this._worldDragAxis.copyFrom(this._options.dragAxis); - pickedPoint.subtractToRef(this.lastDragPosition, this._tmpVector); - dragLength = Vector3.Dot(this._tmpVector, this._worldDragAxis); - this._worldDragAxis.scaleToRef(dragLength, this._dragDelta); - } else { - dragLength = this._dragDelta.length(); - pickedPoint.subtractToRef(this.lastDragPosition, this._dragDelta); - } - this._targetPosition.addInPlace(this._dragDelta); - this.onDragObservable.notifyObservers({ - dragDistance: dragLength, - delta: this._dragDelta, - dragPlanePoint: pickedPoint, - dragPlaneNormal: this._dragPlane.forward, - pointerId: this.currentDraggingPointerId, - pointerInfo: this._activePointerInfo - }); - this.lastDragPosition.copyFrom(pickedPoint); - PivotTools._RestorePivotPoint(this.attachedNode); - } - } - _pickWithRayOnDragPlane(ray) { - if (!ray) { - return null; - } - let angle = Math.acos(Vector3.Dot(this._dragPlane.forward, ray.direction)); - if (angle > Math.PI / 2) { - angle = Math.PI - angle; - } - if (this.maxDragAngle > 0 && angle > this.maxDragAngle) { - if (this._useAlternatePickedPointAboveMaxDragAngle) { - this._tmpVector.copyFrom(ray.direction); - this.attachedNode.absolutePosition.subtractToRef(ray.origin, this._alternatePickedPoint); - this._alternatePickedPoint.normalize(); - this._alternatePickedPoint.scaleInPlace(this._useAlternatePickedPointAboveMaxDragAngleDragSpeed * Vector3.Dot(this._alternatePickedPoint, this._tmpVector)); - this._tmpVector.addInPlace(this._alternatePickedPoint); - const dot = Vector3.Dot(this._dragPlane.forward, this._tmpVector); - this._dragPlane.forward.scaleToRef(-dot, this._alternatePickedPoint); - this._alternatePickedPoint.addInPlace(this._tmpVector); - this._alternatePickedPoint.addInPlace(this.attachedNode.absolutePosition); - return this._alternatePickedPoint; - } else { - return null; - } - } - const planeNormal = this._dragPlane.forward; - const planePosition = this._dragPlane.position; - const dotProduct = ray.direction.dot(planeNormal); - if (Math.abs(dotProduct) < Epsilon) { - return null; - } - planePosition.subtractToRef(ray.origin, TmpVectors.Vector3[0]); - const t = TmpVectors.Vector3[0].dot(planeNormal) / dotProduct; - if (t < 0) { - return null; - } - ray.direction.scaleToRef(t, TmpVectors.Vector3[0]); - const intersectionPoint = ray.origin.add(TmpVectors.Vector3[0]); - return intersectionPoint; - } - // Position the drag plane based on the attached mesh position, for single axis rotate the plane along the axis to face the camera - _updateDragPlanePosition(ray, dragPlanePosition) { - this._pointA.copyFrom(dragPlanePosition); - if (this._options.dragAxis) { - this.useObjectOrientationForDragging ? Vector3.TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis) : this._localAxis.copyFrom(this._options.dragAxis); - ray.origin.subtractToRef(this._pointA, this._pointC); - this._pointC.normalize(); - if (Math.abs(Vector3.Dot(this._localAxis, this._pointC)) > 0.999) { - if (Math.abs(Vector3.Dot(Vector3.UpReadOnly, this._pointC)) > 0.999) { - this._lookAt.copyFrom(Vector3.Right()); - } else { - this._lookAt.copyFrom(Vector3.UpReadOnly); - } - } else { - Vector3.CrossToRef(this._localAxis, this._pointC, this._lookAt); - Vector3.CrossToRef(this._localAxis, this._lookAt, this._lookAt); - this._lookAt.normalize(); - } - this._dragPlane.position.copyFrom(this._pointA); - this._pointA.addToRef(this._lookAt, this._lookAt); - this._dragPlane.lookAt(this._lookAt); - } else if (this._options.dragPlaneNormal) { - this.useObjectOrientationForDragging ? Vector3.TransformCoordinatesToRef(this._options.dragPlaneNormal, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis) : this._localAxis.copyFrom(this._options.dragPlaneNormal); - this._dragPlane.position.copyFrom(this._pointA); - this._pointA.addToRef(this._localAxis, this._lookAt); - this._dragPlane.lookAt(this._lookAt); - } else { - this._dragPlane.position.copyFrom(this._pointA); - this._dragPlane.lookAt(ray.origin); - } - this._dragPlane.position.copyFrom(this.attachedNode.getAbsolutePosition()); - this._dragPlane.computeWorldMatrix(true); + static CreateTorus(name69, diameter, thickness, tessellation, scene, updatable, sideOrientation) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * Detaches the behavior from the mesh + * Creates a torus knot mesh. + * @param name defines the name of the mesh to create + * @param radius sets the global radius size (float) of the torus knot (default 2) + * @param tube sets the diameter size of the tube of the torus (float, default 0.5) + * @param radialSegments sets the number of sides on each tube segments (positive integer, default 32) + * @param tubularSegments sets the number of tubes to decompose the knot into (positive integer, default 32) + * @param p the number of windings on X axis (positive integers, default 2) + * @param q the number of windings on Y axis (positive integers, default 3) + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - detach() { - this._lastPointerRay = {}; - if (this.attachedNode) { - this.attachedNode.isNearGrabbable = false; - } - if (this._pointerObserver) { - this._scene.onPointerObservable.remove(this._pointerObserver); - } - if (this._beforeRenderObserver) { - this._scene.onBeforeRenderObservable.remove(this._beforeRenderObserver); - } - if (this._dragPlane) { - this._dragPlane.dispose(); - } - this.releaseDrag(); - } -}; -PointerDragBehavior._AnyMouseId = -2; - -// node_modules/@babylonjs/core/Behaviors/Meshes/baseSixDofDragBehavior.js -var BaseSixDofDragBehavior = class _BaseSixDofDragBehavior { - constructor() { - this._attachedToElement = false; - this._virtualMeshesInfo = {}; - this._tmpVector = new Vector3(); - this._tmpQuaternion = new Quaternion(); - this._dragType = { - NONE: 0, - DRAG: 1, - DRAG_WITH_CONTROLLER: 2, - NEAR_DRAG: 3 - }; - this._moving = false; - this._dragging = this._dragType.NONE; - this.draggableMeshes = null; - this.zDragFactor = 3; - this.currentDraggingPointerIds = []; - this.detachCameraControls = true; - this.onDragStartObservable = new Observable(); - this.onDragObservable = new Observable(); - this.onDragEndObservable = new Observable(); - this.allowMultiPointer = true; + static CreateTorusKnot(name69, radius, tube, radialSegments, tubularSegments, p, q, scene, updatable, sideOrientation) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * The id of the pointer that is currently interacting with the behavior (-1 when no pointer is active) + * Creates a line mesh.. + * @param name defines the name of the mesh to create + * @param points is an array successive Vector3 + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines). + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - get currentDraggingPointerId() { - if (this.currentDraggingPointerIds[0] !== void 0) { - return this.currentDraggingPointerIds[0]; - } - return -1; - } - set currentDraggingPointerId(value) { - this.currentDraggingPointerIds[0] = value; + static CreateLines(name69, points, scene, updatable, instance) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * Get or set the currentDraggingPointerId - * @deprecated Please use currentDraggingPointerId instead + * Creates a dashed line mesh. + * @param name defines the name of the mesh to create + * @param points is an array successive Vector3 + * @param dashSize is the size of the dashes relatively the dash number (positive float, default 3) + * @param gapSize is the size of the gap between two successive dashes relatively the dash number (positive float, default 1) + * @param dashNb is the intended total number of dashes (positive integer, default 200) + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - get currentDraggingPointerID() { - return this.currentDraggingPointerId; - } - set currentDraggingPointerID(currentDraggingPointerID) { - this.currentDraggingPointerId = currentDraggingPointerID; + static CreateDashedLines(name69, points, dashSize, gapSize, dashNb, scene, updatable, instance) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * The name of the behavior + * Creates a polygon mesh.Please consider using the same method from the MeshBuilder class instead + * The polygon's shape will depend on the input parameters and is constructed parallel to a ground mesh. + * The parameter `shape` is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors. + * You can set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created. + * Remember you can only change the shape positions, not their number when updating a polygon. + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#non-regular-polygon + * @param name defines the name of the mesh to create + * @param shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors + * @param scene defines the hosting scene + * @param holes is a required array of arrays of successive Vector3 used to defines holes in the polygon + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @param earcutInjection can be used to inject your own earcut reference + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - get name() { - return "BaseSixDofDrag"; + static CreatePolygon(name69, shape, scene, holes, updatable, sideOrientation, earcutInjection) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * Returns true if the attached mesh is currently moving with this behavior + * Creates an extruded polygon mesh, with depth in the Y direction.. + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-non-regular-polygon + * @param name defines the name of the mesh to create + * @param shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors + * @param depth defines the height of extrusion + * @param scene defines the hosting scene + * @param holes is a required array of arrays of successive Vector3 used to defines holes in the polygon + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @param earcutInjection can be used to inject your own earcut reference + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - get isMoving() { - return this._moving; + static ExtrudePolygon(name69, shape, depth, scene, holes, updatable, sideOrientation, earcutInjection) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * Initializes the behavior + * Creates an extruded shape mesh. + * The extrusion is a parametric shape. It has no predefined shape. Its final shape will depend on the input parameters. + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes + * @param name defines the name of the mesh to create + * @param shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis + * @param path is a required array of successive Vector3. This is the axis curve the shape is extruded along + * @param scale is the value to scale the shape + * @param rotation is the angle value to rotate the shape each step (each path point), from the former step (so rotation added each step) along the curve + * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @param instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#extruded-shape) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - init() { + static ExtrudeShape(name69, shape, path, scale, rotation, cap, scene, updatable, sideOrientation, instance) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * In the case of multiple active cameras, the cameraToUseForPointers should be used if set instead of active camera + * Creates an custom extruded shape mesh. + * The custom extrusion is a parametric shape. + * It has no predefined shape. Its final shape will depend on the input parameters. + * + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes + * @param name defines the name of the mesh to create + * @param shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis + * @param path is a required array of successive Vector3. This is the axis curve the shape is extruded along + * @param scaleFunction is a custom Javascript function called on each path point + * @param rotationFunction is a custom Javascript function called on each path point + * @param ribbonCloseArray forces the extrusion underlying ribbon to close all the paths in its `pathArray` + * @param ribbonClosePath forces the extrusion underlying ribbon to close its `pathArray` + * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @param instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#extruded-shape) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - get _pointerCamera() { - if (this._scene.cameraToUseForPointers) { - return this._scene.cameraToUseForPointers; - } else { - return this._scene.activeCamera; - } - } - _createVirtualMeshInfo() { - const dragMesh = new AbstractMesh("", _BaseSixDofDragBehavior._virtualScene); - dragMesh.rotationQuaternion = new Quaternion(); - const originMesh = new AbstractMesh("", _BaseSixDofDragBehavior._virtualScene); - originMesh.rotationQuaternion = new Quaternion(); - const pivotMesh = new AbstractMesh("", _BaseSixDofDragBehavior._virtualScene); - pivotMesh.rotationQuaternion = new Quaternion(); - return { - dragging: false, - moving: false, - dragMesh, - originMesh, - pivotMesh, - startingPivotPosition: new Vector3(), - startingPivotOrientation: new Quaternion(), - startingPosition: new Vector3(), - startingOrientation: new Quaternion(), - lastOriginPosition: new Vector3(), - lastDragPosition: new Vector3() - }; - } - _resetVirtualMeshesPosition() { - for (let i = 0; i < this.currentDraggingPointerIds.length; i++) { - this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.position.copyFrom(this._ownerNode.getAbsolutePivotPoint()); - this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.rotationQuaternion.copyFrom(this._ownerNode.rotationQuaternion); - this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingPivotPosition.copyFrom(this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.position); - this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingPivotOrientation.copyFrom(this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.rotationQuaternion); - this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingPosition.copyFrom(this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].dragMesh.position); - this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingOrientation.copyFrom(this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].dragMesh.rotationQuaternion); - } - } - _pointerUpdate2D(ray, pointerId, zDragFactor) { - if (this._pointerCamera && this._pointerCamera.cameraRigMode == Camera.RIG_MODE_NONE && !this._pointerCamera._isLeftCamera && !this._pointerCamera._isRightCamera) { - ray.origin.copyFrom(this._pointerCamera.globalPosition); - zDragFactor = 0; - } - const virtualMeshesInfo = this._virtualMeshesInfo[pointerId]; - const originDragDifference = TmpVectors.Vector3[0]; - ray.origin.subtractToRef(virtualMeshesInfo.lastOriginPosition, originDragDifference); - virtualMeshesInfo.lastOriginPosition.copyFrom(ray.origin); - const localOriginDragDifference = -Vector3.Dot(originDragDifference, ray.direction); - virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.dragMesh); - virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.pivotMesh); - this._applyZOffset(virtualMeshesInfo.dragMesh, localOriginDragDifference, zDragFactor); - this._applyZOffset(virtualMeshesInfo.pivotMesh, localOriginDragDifference, zDragFactor); - virtualMeshesInfo.originMesh.position.copyFrom(ray.origin); - const lookAt = TmpVectors.Vector3[0]; - ray.origin.addToRef(ray.direction, lookAt); - virtualMeshesInfo.originMesh.lookAt(lookAt); - virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.dragMesh); - virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.pivotMesh); - } - _pointerUpdateXR(controllerAimTransform, controllerGripTransform, pointerId, zDragFactor) { - const virtualMeshesInfo = this._virtualMeshesInfo[pointerId]; - virtualMeshesInfo.originMesh.position.copyFrom(controllerAimTransform.position); - if (this._dragging === this._dragType.NEAR_DRAG && controllerGripTransform) { - virtualMeshesInfo.originMesh.rotationQuaternion.copyFrom(controllerGripTransform.rotationQuaternion); - } else { - virtualMeshesInfo.originMesh.rotationQuaternion.copyFrom(controllerAimTransform.rotationQuaternion); - } - virtualMeshesInfo.pivotMesh.computeWorldMatrix(true); - virtualMeshesInfo.dragMesh.computeWorldMatrix(true); - if (zDragFactor !== 0) { - const cameraForwardVec = TmpVectors.Vector3[0]; - const originDragDirection = TmpVectors.Vector3[1]; - cameraForwardVec.copyFrom(this._pointerCamera.getForwardRay().direction); - virtualMeshesInfo.originMesh.position.subtractToRef(virtualMeshesInfo.lastOriginPosition, originDragDirection); - virtualMeshesInfo.lastOriginPosition.copyFrom(virtualMeshesInfo.originMesh.position); - const controllerDragDistance = originDragDirection.length(); - originDragDirection.normalize(); - const cameraToDrag = TmpVectors.Vector3[2]; - const controllerToDrag = TmpVectors.Vector3[3]; - virtualMeshesInfo.dragMesh.absolutePosition.subtractToRef(this._pointerCamera.globalPosition, cameraToDrag); - virtualMeshesInfo.dragMesh.absolutePosition.subtractToRef(virtualMeshesInfo.originMesh.position, controllerToDrag); - const controllerToDragDistance = controllerToDrag.length(); - cameraToDrag.normalize(); - controllerToDrag.normalize(); - const controllerDragScaling = Math.abs(Vector3.Dot(originDragDirection, controllerToDrag)) * Vector3.Dot(originDragDirection, cameraForwardVec); - let zOffsetScaling = controllerDragScaling * zDragFactor * controllerDragDistance * controllerToDragDistance; - const minDistanceFromControllerToDragMesh = 0.01; - if (zOffsetScaling < 0 && minDistanceFromControllerToDragMesh - controllerToDragDistance > zOffsetScaling) { - zOffsetScaling = Math.min(minDistanceFromControllerToDragMesh - controllerToDragDistance, 0); - } - controllerToDrag.scaleInPlace(zOffsetScaling); - controllerToDrag.addToRef(virtualMeshesInfo.pivotMesh.absolutePosition, this._tmpVector); - virtualMeshesInfo.pivotMesh.setAbsolutePosition(this._tmpVector); - controllerToDrag.addToRef(virtualMeshesInfo.dragMesh.absolutePosition, this._tmpVector); - virtualMeshesInfo.dragMesh.setAbsolutePosition(this._tmpVector); - } + static ExtrudeShapeCustom(name69, shape, path, scaleFunction, rotationFunction, ribbonCloseArray, ribbonClosePath, cap, scene, updatable, sideOrientation, instance) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * Attaches the scale behavior the passed in mesh - * @param ownerNode The mesh that will be scaled around once attached + * Creates lathe mesh. + * The lathe is a shape with a symmetry axis : a 2D model shape is rotated around this axis to design the lathe. + * @param name defines the name of the mesh to create + * @param shape is a required array of successive Vector3. This array depicts the shape to be rotated in its local space : the shape must be designed in the xOy plane and will be rotated around the Y axis. It's usually a 2D shape, so the Vector3 z coordinates are often set to zero + * @param radius is the radius value of the lathe + * @param tessellation is the side number of the lathe. + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - attach(ownerNode) { - this._ownerNode = ownerNode; - this._scene = this._ownerNode.getScene(); - if (!_BaseSixDofDragBehavior._virtualScene) { - _BaseSixDofDragBehavior._virtualScene = new Scene(this._scene.getEngine(), { virtual: true }); - _BaseSixDofDragBehavior._virtualScene.detachControl(); - } - const pickPredicate = (m) => { - return this._ownerNode === m || m.isDescendantOf(this._ownerNode) && (!this.draggableMeshes || this.draggableMeshes.indexOf(m) !== -1); - }; - this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => { - const pointerId = pointerInfo.event.pointerId; - if (!this._virtualMeshesInfo[pointerId]) { - this._virtualMeshesInfo[pointerId] = this._createVirtualMeshInfo(); - } - const virtualMeshesInfo = this._virtualMeshesInfo[pointerId]; - const isXRPointer = pointerInfo.event.pointerType === "xr-near" || pointerInfo.event.pointerType === "xr"; - if (pointerInfo.type == PointerEventTypes.POINTERDOWN) { - if (!virtualMeshesInfo.dragging && pointerInfo.pickInfo && pointerInfo.pickInfo.hit && pointerInfo.pickInfo.pickedMesh && pointerInfo.pickInfo.pickedPoint && pointerInfo.pickInfo.ray && (!isXRPointer || pointerInfo.pickInfo.aimTransform) && pickPredicate(pointerInfo.pickInfo.pickedMesh)) { - if ((!this.allowMultiPointer || isXRPointer) && this.currentDraggingPointerIds.length > 0) { - return; - } - if (this._pointerCamera && this._pointerCamera.cameraRigMode === Camera.RIG_MODE_NONE && !this._pointerCamera._isLeftCamera && !this._pointerCamera._isRightCamera) { - pointerInfo.pickInfo.ray.origin.copyFrom(this._pointerCamera.globalPosition); - } - this._ownerNode.computeWorldMatrix(true); - const virtualMeshesInfo2 = this._virtualMeshesInfo[pointerId]; - if (isXRPointer) { - this._dragging = pointerInfo.pickInfo.originMesh ? this._dragType.NEAR_DRAG : this._dragType.DRAG_WITH_CONTROLLER; - virtualMeshesInfo2.originMesh.position.copyFrom(pointerInfo.pickInfo.aimTransform.position); - if (this._dragging === this._dragType.NEAR_DRAG && pointerInfo.pickInfo.gripTransform) { - virtualMeshesInfo2.originMesh.rotationQuaternion.copyFrom(pointerInfo.pickInfo.gripTransform.rotationQuaternion); - } else { - virtualMeshesInfo2.originMesh.rotationQuaternion.copyFrom(pointerInfo.pickInfo.aimTransform.rotationQuaternion); - } - } else { - this._dragging = this._dragType.DRAG; - virtualMeshesInfo2.originMesh.position.copyFrom(pointerInfo.pickInfo.ray.origin); - } - virtualMeshesInfo2.lastOriginPosition.copyFrom(virtualMeshesInfo2.originMesh.position); - virtualMeshesInfo2.dragMesh.position.copyFrom(pointerInfo.pickInfo.pickedPoint); - virtualMeshesInfo2.lastDragPosition.copyFrom(pointerInfo.pickInfo.pickedPoint); - virtualMeshesInfo2.pivotMesh.position.copyFrom(this._ownerNode.getAbsolutePivotPoint()); - virtualMeshesInfo2.pivotMesh.rotationQuaternion.copyFrom(this._ownerNode.absoluteRotationQuaternion); - virtualMeshesInfo2.startingPosition.copyFrom(virtualMeshesInfo2.dragMesh.position); - virtualMeshesInfo2.startingPivotPosition.copyFrom(virtualMeshesInfo2.pivotMesh.position); - virtualMeshesInfo2.startingOrientation.copyFrom(virtualMeshesInfo2.dragMesh.rotationQuaternion); - virtualMeshesInfo2.startingPivotOrientation.copyFrom(virtualMeshesInfo2.pivotMesh.rotationQuaternion); - if (isXRPointer) { - virtualMeshesInfo2.originMesh.addChild(virtualMeshesInfo2.dragMesh); - virtualMeshesInfo2.originMesh.addChild(virtualMeshesInfo2.pivotMesh); - } else { - virtualMeshesInfo2.originMesh.lookAt(virtualMeshesInfo2.dragMesh.position); - } - virtualMeshesInfo2.dragging = true; - if (this.currentDraggingPointerIds.indexOf(pointerId) === -1) { - this.currentDraggingPointerIds.push(pointerId); - } - if (this.detachCameraControls && this._pointerCamera && !this._pointerCamera.leftCamera) { - if (this._pointerCamera.inputs && this._pointerCamera.inputs.attachedToElement) { - this._pointerCamera.detachControl(); - this._attachedToElement = true; - } else if (!this.allowMultiPointer || this.currentDraggingPointerIds.length === 0) { - this._attachedToElement = false; - } - } - this._targetDragStart(virtualMeshesInfo2.pivotMesh.position, virtualMeshesInfo2.pivotMesh.rotationQuaternion, pointerId); - this.onDragStartObservable.notifyObservers({ position: virtualMeshesInfo2.pivotMesh.position }); - } - } else if (pointerInfo.type == PointerEventTypes.POINTERUP || pointerInfo.type == PointerEventTypes.POINTERDOUBLETAP) { - const registeredPointerIndex = this.currentDraggingPointerIds.indexOf(pointerId); - virtualMeshesInfo.dragging = false; - if (registeredPointerIndex !== -1) { - this.currentDraggingPointerIds.splice(registeredPointerIndex, 1); - if (this.currentDraggingPointerIds.length === 0) { - this._moving = false; - this._dragging = this._dragType.NONE; - if (this.detachCameraControls && this._attachedToElement && this._pointerCamera && !this._pointerCamera.leftCamera) { - this._reattachCameraControls(); - this._attachedToElement = false; - } - } - virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.dragMesh); - virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.pivotMesh); - this._targetDragEnd(pointerId); - this.onDragEndObservable.notifyObservers({}); - } - } else if (pointerInfo.type == PointerEventTypes.POINTERMOVE) { - const registeredPointerIndex = this.currentDraggingPointerIds.indexOf(pointerId); - if (registeredPointerIndex !== -1 && virtualMeshesInfo.dragging && pointerInfo.pickInfo && (pointerInfo.pickInfo.ray || pointerInfo.pickInfo.aimTransform)) { - let zDragFactor = this.zDragFactor; - if (this.currentDraggingPointerIds.length > 1 || pointerInfo.pickInfo.originMesh) { - zDragFactor = 0; - } - this._ownerNode.computeWorldMatrix(true); - if (!isXRPointer) { - this._pointerUpdate2D(pointerInfo.pickInfo.ray, pointerId, zDragFactor); - } else { - this._pointerUpdateXR(pointerInfo.pickInfo.aimTransform, pointerInfo.pickInfo.gripTransform, pointerId, zDragFactor); - } - this._tmpQuaternion.copyFrom(virtualMeshesInfo.startingPivotOrientation); - this._tmpQuaternion.x = -this._tmpQuaternion.x; - this._tmpQuaternion.y = -this._tmpQuaternion.y; - this._tmpQuaternion.z = -this._tmpQuaternion.z; - virtualMeshesInfo.pivotMesh.absoluteRotationQuaternion.multiplyToRef(this._tmpQuaternion, this._tmpQuaternion); - virtualMeshesInfo.pivotMesh.absolutePosition.subtractToRef(virtualMeshesInfo.startingPivotPosition, this._tmpVector); - this.onDragObservable.notifyObservers({ delta: this._tmpVector, position: virtualMeshesInfo.pivotMesh.position, pickInfo: pointerInfo.pickInfo }); - this._targetDrag(this._tmpVector, this._tmpQuaternion, pointerId); - virtualMeshesInfo.lastDragPosition.copyFrom(virtualMeshesInfo.dragMesh.absolutePosition); - this._moving = true; - } - } - }); + static CreateLathe(name69, shape, radius, tessellation, scene, updatable, sideOrientation) { + throw new Error("Import MeshBuilder to populate this function"); } - _applyZOffset(node, localOriginDragDifference, zDragFactor) { - node.position.z -= node.position.z < 1 ? localOriginDragDifference * zDragFactor : localOriginDragDifference * zDragFactor * node.position.z; - if (node.position.z < 0) { - node.position.z = 0; - } + /** + * Creates a plane mesh. + * @param name defines the name of the mesh to create + * @param size sets the size (float) of both sides of the plane at once (default 1) + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead + */ + static CreatePlane(name69, size, scene, updatable, sideOrientation) { + throw new Error("Import MeshBuilder to populate this function"); } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _targetDragStart(worldPosition, worldRotation, pointerId) { + /** + * Creates a ground mesh. + * @param name defines the name of the mesh to create + * @param width set the width of the ground + * @param height set the height of the ground + * @param subdivisions sets the number of subdivisions per side + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead + */ + static CreateGround(name69, width, height, subdivisions, scene, updatable) { + throw new Error("Import MeshBuilder to populate this function"); } - _targetDrag(worldDeltaPosition, worldDeltaRotation, pointerId) { + /** + * Creates a tiled ground mesh. + * @param name defines the name of the mesh to create + * @param xmin set the ground minimum X coordinate + * @param zmin set the ground minimum Y coordinate + * @param xmax set the ground maximum X coordinate + * @param zmax set the ground maximum Z coordinate + * @param subdivisions is an object `{w: positive integer, h: positive integer}` (default `{w: 6, h: 6}`). `w` and `h` are the numbers of subdivisions on the ground width and height. Each subdivision is called a tile + * @param precision is an object `{w: positive integer, h: positive integer}` (default `{w: 2, h: 2}`). `w` and `h` are the numbers of subdivisions on the ground width and height of each tile + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead + */ + static CreateTiledGround(name69, xmin, zmin, xmax, zmax, subdivisions, precision, scene, updatable) { + throw new Error("Import MeshBuilder to populate this function"); } - _targetDragEnd(pointerId) { + /** + * Creates a ground mesh from a height map. + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/height_map + * @param name defines the name of the mesh to create + * @param url sets the URL of the height map image resource + * @param width set the ground width size + * @param height set the ground height size + * @param subdivisions sets the number of subdivision per side + * @param minHeight is the minimum altitude on the ground + * @param maxHeight is the maximum altitude on the ground + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param onReady is a callback function that will be called once the mesh is built (the height map download can last some time) + * @param alphaFilter will filter any data where the alpha channel is below this value, defaults 0 (all data visible) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead + */ + static CreateGroundFromHeightMap(name69, url, width, height, subdivisions, minHeight, maxHeight, scene, updatable, onReady, alphaFilter) { + throw new Error("Import MeshBuilder to populate this function"); } - _reattachCameraControls() { - if (this._pointerCamera) { - if (this._pointerCamera.getClassName() === "ArcRotateCamera") { - const arcRotateCamera = this._pointerCamera; - arcRotateCamera.attachControl(arcRotateCamera.inputs ? arcRotateCamera.inputs.noPreventDefault : true, arcRotateCamera._useCtrlForPanning, arcRotateCamera._panningMouseButton); - } else { - this._pointerCamera.attachControl(this._pointerCamera.inputs ? this._pointerCamera.inputs.noPreventDefault : true); - } - } + /** + * Creates a tube mesh. + * The tube is a parametric shape. + * It has no predefined shape. Its final shape will depend on the input parameters. + * + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param + * @param name defines the name of the mesh to create + * @param path is a required array of successive Vector3. It is the curve used as the axis of the tube + * @param radius sets the tube radius size + * @param tessellation is the number of sides on the tubular surface + * @param radiusFunction is a custom function. If it is not null, it overrides the parameter `radius`. This function is called on each point of the tube path and is passed the index `i` of the i-th point and the distance of this point from the first point of the path + * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL + * @param scene defines the hosting scene + * @param updatable defines if the mesh must be flagged as updatable + * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation) + * @param instance is an instance of an existing Tube object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#tube) + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead + */ + static CreateTube(name69, path, radius, tessellation, radiusFunction, cap, scene, updatable, sideOrientation, instance) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * Detaches the behavior from the mesh + * Creates a polyhedron mesh. + *. + * * The parameter `type` (positive integer, max 14, default 0) sets the polyhedron type to build among the 15 embedded types. Please refer to the type sheet in the tutorial to choose the wanted type + * * The parameter `size` (positive float, default 1) sets the polygon size + * * You can overwrite the `size` on each dimension bu using the parameters `sizeX`, `sizeY` or `sizeZ` (positive floats, default to `size` value) + * * You can build other polyhedron types than the 15 embbeded ones by setting the parameter `custom` (`polyhedronObject`, default null). If you set the parameter `custom`, this overwrittes the parameter `type` + * * A `polyhedronObject` is a formatted javascript object. You'll find a full file with pre-set polyhedra here : https://github.com/BabylonJS/Extensions/tree/master/Polyhedron + * * You can set the color and the UV of each side of the polyhedron with the parameters `faceColors` (Color4, default `(1, 1, 1, 1)`) and faceUV (Vector4, default `(0, 0, 1, 1)`) + * * To understand how to set `faceUV` or `faceColors`, please read this by considering the right number of faces of your polyhedron, instead of only 6 for the box : https://doc.babylonjs.com/features/featuresDeepDive/materials/using/texturePerBoxFace + * * The parameter `flat` (boolean, default true). If set to false, it gives the polyhedron a single global face, so less vertices and shared normals. In this case, `faceColors` and `faceUV` are ignored + * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation + * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created + * @param name defines the name of the mesh to create + * @param options defines the options used to create the mesh + * @param scene defines the hosting scene + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - detach() { - if (this._scene) { - if (this.detachCameraControls && this._attachedToElement && this._pointerCamera && !this._pointerCamera.leftCamera) { - this._reattachCameraControls(); - this._attachedToElement = false; - } - this._scene.onPointerObservable.remove(this._pointerObserver); - } - for (const pointerId in this._virtualMeshesInfo) { - this._virtualMeshesInfo[pointerId].originMesh.dispose(); - this._virtualMeshesInfo[pointerId].dragMesh.dispose(); - } - this.onDragEndObservable.clear(); - this.onDragObservable.clear(); - this.onDragStartObservable.clear(); + static CreatePolyhedron(name69, options, scene) { + throw new Error("Import MeshBuilder to populate this function"); } -}; - -// node_modules/@babylonjs/core/Behaviors/Meshes/sixDofDragBehavior.js -var SixDofDragBehavior = class extends BaseSixDofDragBehavior { - constructor() { - super(...arguments); - this._sceneRenderObserver = null; - this._targetPosition = new Vector3(0, 0, 0); - this._targetOrientation = new Quaternion(); - this._targetScaling = new Vector3(1, 1, 1); - this._startingPosition = new Vector3(0, 0, 0); - this._startingOrientation = new Quaternion(); - this._startingScaling = new Vector3(1, 1, 1); - this.onPositionChangedObservable = new Observable(); - this.dragDeltaRatio = 0.2; - this.rotateDraggedObject = true; - this.rotateAroundYOnly = false; - this.rotateWithMotionController = true; - this.disableMovement = false; - this.faceCameraOnDragStart = false; + /** + * Creates a sphere based upon an icosahedron with 20 triangular faces which can be subdivided + * * The parameter `radius` sets the radius size (float) of the icosphere (default 1) + * * You can set some different icosphere dimensions, for instance to build an ellipsoid, by using the parameters `radiusX`, `radiusY` and `radiusZ` (all by default have the same value than `radius`) + * * The parameter `subdivisions` sets the number of subdivisions (positive integer, default 4). The more subdivisions, the more faces on the icosphere whatever its size + * * The parameter `flat` (boolean, default true) gives each side its own normals. Set it to false to get a smooth continuous light reflection on the surface + * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE + * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation + * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created + * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/polyhedra#icosphere + * @param name defines the name of the mesh + * @param options defines the options used to create the mesh + * @param scene defines the hosting scene + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead + */ + static CreateIcoSphere(name69, options, scene) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * The name of the behavior + * Creates a decal mesh. + *. + * A decal is a mesh usually applied as a model onto the surface of another mesh + * @param name defines the name of the mesh + * @param sourceMesh defines the mesh receiving the decal + * @param position sets the position of the decal in world coordinates + * @param normal sets the normal of the mesh where the decal is applied onto in world coordinates + * @param size sets the decal scaling + * @param angle sets the angle to rotate the decal + * @returns a new Mesh + * @deprecated Please use MeshBuilder instead */ - get name() { - return "SixDofDrag"; + static CreateDecal(name69, sourceMesh, position, normal, size, angle) { + throw new Error("Import MeshBuilder to populate this function"); + } + /** Creates a Capsule Mesh + * @param name defines the name of the mesh. + * @param options the constructors options used to shape the mesh. + * @param scene defines the scene the mesh is scoped to. + * @returns the capsule mesh + * @see https://doc.babylonjs.com/how_to/capsule_shape + * @deprecated Please use MeshBuilder instead + */ + static CreateCapsule(name69, options, scene) { + throw new Error("Import MeshBuilder to populate this function"); } /** - * Attaches the six DoF drag behavior - * In XR mode the mesh and its children will have their isNearGrabbable property set to true - * @param ownerNode The mesh that will be dragged around once attached + * Extends a mesh to a Goldberg mesh + * Warning the mesh to convert MUST be an import of a perviously exported Goldberg mesh + * @param mesh the mesh to convert + * @returns the extended mesh + * @deprecated Please use ExtendMeshToGoldberg instead */ - attach(ownerNode) { - super.attach(ownerNode); - ownerNode.isNearGrabbable = true; - ownerNode.getChildMeshes().forEach((m) => { - m.isNearGrabbable = true; - }); - this._virtualTransformNode = new TransformNode("virtual_sixDof", BaseSixDofDragBehavior._virtualScene); - this._virtualTransformNode.rotationQuaternion = Quaternion.Identity(); - this._sceneRenderObserver = ownerNode.getScene().onBeforeRenderObservable.add(() => { - if (this.currentDraggingPointerIds.length === 1 && this._moving && !this.disableMovement) { - const deltaToAdd = TmpVectors.Vector3[0]; - deltaToAdd.copyFrom(this._targetPosition).subtractInPlace(ownerNode.absolutePosition).scaleInPlace(this.dragDeltaRatio); - const deltaToAddTransformed = TmpVectors.Vector3[1]; - deltaToAddTransformed.copyFrom(deltaToAdd); - if (ownerNode.parent) { - const parentRotationMatrixInverse = TmpVectors.Matrix[0]; - ownerNode.parent.absoluteRotationQuaternion.toRotationMatrix(parentRotationMatrixInverse); - parentRotationMatrixInverse.invert(); - Vector3.TransformNormalToRef(deltaToAdd, parentRotationMatrixInverse, deltaToAddTransformed); - } - ownerNode.position.addInPlace(deltaToAddTransformed); - this.onPositionChangedObservable.notifyObservers({ position: ownerNode.absolutePosition }); - if (!ownerNode.parent || ownerNode.parent.scaling && !ownerNode.parent.scaling.isNonUniformWithinEpsilon(1e-3)) { - const rotationToApply = TmpVectors.Quaternion[0]; - rotationToApply.copyFrom(this._targetOrientation); - if (ownerNode.parent) { - const parentRotationInverse = TmpVectors.Quaternion[0]; - parentRotationInverse.copyFrom(ownerNode.parent.absoluteRotationQuaternion); - parentRotationInverse.invertInPlace(); - parentRotationInverse.multiplyToRef(this._targetOrientation, rotationToApply); - } - Quaternion.SlerpToRef(ownerNode.rotationQuaternion, rotationToApply, this.dragDeltaRatio, ownerNode.rotationQuaternion); - } - } - }); + static ExtendToGoldberg(mesh) { + throw new Error("Import MeshBuilder to populate this function"); } - _getPositionOffsetAround(transformationLocalOrigin, scaling, rotation) { - const translationMatrix = TmpVectors.Matrix[0]; - const translationMatrixInv = TmpVectors.Matrix[1]; - const rotationMatrix = TmpVectors.Matrix[2]; - const scaleMatrix = TmpVectors.Matrix[3]; - const finalMatrix = TmpVectors.Matrix[4]; - Matrix.TranslationToRef(transformationLocalOrigin.x, transformationLocalOrigin.y, transformationLocalOrigin.z, translationMatrix); - Matrix.TranslationToRef(-transformationLocalOrigin.x, -transformationLocalOrigin.y, -transformationLocalOrigin.z, translationMatrixInv); - Matrix.FromQuaternionToRef(rotation, rotationMatrix); - Matrix.ScalingToRef(scaling, scaling, scaling, scaleMatrix); - translationMatrixInv.multiplyToRef(rotationMatrix, finalMatrix); - finalMatrix.multiplyToRef(scaleMatrix, finalMatrix); - finalMatrix.multiplyToRef(translationMatrix, finalMatrix); - return finalMatrix.getTranslation(); - } - _onePointerPositionUpdated(worldDeltaPosition, worldDeltaRotation) { - const pointerDelta = TmpVectors.Vector3[0]; - pointerDelta.setAll(0); - if (this._dragging === this._dragType.DRAG) { - if (this.rotateDraggedObject) { - if (this.rotateAroundYOnly) { - Quaternion.RotationYawPitchRollToRef(worldDeltaRotation.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]); - } else { - TmpVectors.Quaternion[0].copyFrom(worldDeltaRotation); - } - TmpVectors.Quaternion[0].multiplyToRef(this._startingOrientation, this._targetOrientation); - } - } else if (this._dragging === this._dragType.NEAR_DRAG || this._dragging === this._dragType.DRAG_WITH_CONTROLLER && this.rotateWithMotionController) { - worldDeltaRotation.multiplyToRef(this._startingOrientation, this._targetOrientation); - } - this._targetPosition.copyFrom(this._startingPosition).addInPlace(worldDeltaPosition); - } - _twoPointersPositionUpdated() { - const startingPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].startingPosition; - const startingPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].startingPosition; - const startingCenter = TmpVectors.Vector3[0]; - startingPosition0.addToRef(startingPosition1, startingCenter); - startingCenter.scaleInPlace(0.5); - const startingVector = TmpVectors.Vector3[1]; - startingPosition1.subtractToRef(startingPosition0, startingVector); - const currentPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].dragMesh.absolutePosition; - const currentPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].dragMesh.absolutePosition; - const currentCenter = TmpVectors.Vector3[2]; - currentPosition0.addToRef(currentPosition1, currentCenter); - currentCenter.scaleInPlace(0.5); - const currentVector = TmpVectors.Vector3[3]; - currentPosition1.subtractToRef(currentPosition0, currentVector); - const scaling = currentVector.length() / startingVector.length(); - const translation = currentCenter.subtract(startingCenter); - const rotationQuaternion = Quaternion.FromEulerAngles(0, Vector3.GetAngleBetweenVectorsOnPlane(startingVector.normalize(), currentVector.normalize(), Vector3.UpReadOnly), 0); - const oldParent = this._ownerNode.parent; - this._ownerNode.setParent(null); - const positionOffset = this._getPositionOffsetAround(startingCenter.subtract(this._virtualTransformNode.getAbsolutePivotPoint()), scaling, rotationQuaternion); - this._virtualTransformNode.rotationQuaternion.multiplyToRef(rotationQuaternion, this._ownerNode.rotationQuaternion); - this._virtualTransformNode.scaling.scaleToRef(scaling, this._ownerNode.scaling); - this._virtualTransformNode.position.addToRef(translation.addInPlace(positionOffset), this._ownerNode.position); - this.onPositionChangedObservable.notifyObservers({ position: this._ownerNode.position }); - this._ownerNode.setParent(oldParent); - } - _targetDragStart() { - const pointerCount = this.currentDraggingPointerIds.length; - if (!this._ownerNode.rotationQuaternion) { - this._ownerNode.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._ownerNode.rotation.y, this._ownerNode.rotation.x, this._ownerNode.rotation.z); - } - const worldPivot = this._ownerNode.getAbsolutePivotPoint(); - if (pointerCount === 1) { - this._targetPosition.copyFrom(this._ownerNode.absolutePosition); - this._targetOrientation.copyFrom(this._ownerNode.absoluteRotationQuaternion); - this._targetScaling.copyFrom(this._ownerNode.absoluteScaling); - if (this.faceCameraOnDragStart && this._scene.activeCamera) { - const toCamera = TmpVectors.Vector3[0]; - this._scene.activeCamera.position.subtractToRef(worldPivot, toCamera); - toCamera.normalize(); - const quat = TmpVectors.Quaternion[0]; - if (this._scene.useRightHandedSystem) { - Quaternion.FromLookDirectionRHToRef(toCamera, new Vector3(0, 1, 0), quat); - } else { - Quaternion.FromLookDirectionLHToRef(toCamera, new Vector3(0, 1, 0), quat); - } - quat.normalize(); - Quaternion.RotationYawPitchRollToRef(quat.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]); - this._targetOrientation.copyFrom(TmpVectors.Quaternion[0]); - } - this._startingPosition.copyFrom(this._targetPosition); - this._startingOrientation.copyFrom(this._targetOrientation); - this._startingScaling.copyFrom(this._targetScaling); - } else if (pointerCount === 2) { - this._virtualTransformNode.setPivotPoint(new Vector3(0, 0, 0), Space.LOCAL); - this._virtualTransformNode.position.copyFrom(this._ownerNode.absolutePosition); - this._virtualTransformNode.scaling.copyFrom(this._ownerNode.absoluteScaling); - this._virtualTransformNode.rotationQuaternion.copyFrom(this._ownerNode.absoluteRotationQuaternion); - this._virtualTransformNode.setPivotPoint(worldPivot, Space.WORLD); - this._resetVirtualMeshesPosition(); - } - } - _targetDrag(worldDeltaPosition, worldDeltaRotation) { - if (this.currentDraggingPointerIds.length === 1) { - this._onePointerPositionUpdated(worldDeltaPosition, worldDeltaRotation); - } else if (this.currentDraggingPointerIds.length === 2) { - this._twoPointersPositionUpdated(); - } - } - _targetDragEnd() { - if (this.currentDraggingPointerIds.length === 1) { - this._resetVirtualMeshesPosition(); - const previousFaceCameraFlag = this.faceCameraOnDragStart; - this.faceCameraOnDragStart = false; - this._targetDragStart(); - this.faceCameraOnDragStart = previousFaceCameraFlag; - } +}; +Mesh.FRONTSIDE = VertexData.FRONTSIDE; +Mesh.BACKSIDE = VertexData.BACKSIDE; +Mesh.DOUBLESIDE = VertexData.DOUBLESIDE; +Mesh.DEFAULTSIDE = VertexData.DEFAULTSIDE; +Mesh.NO_CAP = 0; +Mesh.CAP_START = 1; +Mesh.CAP_END = 2; +Mesh.CAP_ALL = 3; +Mesh.NO_FLIP = 0; +Mesh.FLIP_TILE = 1; +Mesh.ROTATE_TILE = 2; +Mesh.FLIP_ROW = 3; +Mesh.ROTATE_ROW = 4; +Mesh.FLIP_N_ROTATE_TILE = 5; +Mesh.FLIP_N_ROTATE_ROW = 6; +Mesh.CENTER = 0; +Mesh.LEFT = 1; +Mesh.RIGHT = 2; +Mesh.TOP = 3; +Mesh.BOTTOM = 4; +Mesh.INSTANCEDMESH_SORT_TRANSPARENT = false; +Mesh._GroundMeshParser = (parsedMesh, scene) => { + throw _WarnImport("GroundMesh"); +}; +Mesh._GoldbergMeshParser = (parsedMesh, scene) => { + throw _WarnImport("GoldbergMesh"); +}; +Mesh._LinesMeshParser = (parsedMesh, scene) => { + throw _WarnImport("LinesMesh"); +}; +Mesh._GreasedLineMeshParser = (parsedMesh, scene) => { + throw _WarnImport("GreasedLineMesh"); +}; +Mesh._GreasedLineRibbonMeshParser = (parsedMesh, scene) => { + throw _WarnImport("GreasedLineRibbonMesh"); +}; +Mesh._TrailMeshParser = (parsedMesh, scene) => { + throw _WarnImport("TrailMesh"); +}; +RegisterClass("BABYLON.Mesh", Mesh); + +// node_modules/@babylonjs/core/Meshes/groundMesh.js +Mesh._GroundMeshParser = (parsedMesh, scene) => { + return GroundMesh.Parse(parsedMesh, scene); +}; +var GroundMesh = class _GroundMesh extends Mesh { + constructor(name69, scene) { + super(name69, scene); + this.generateOctree = false; } /** - * Detaches the behavior from the mesh + * "GroundMesh" + * @returns "GroundMesh" */ - detach() { - super.detach(); - if (this._ownerNode) { - this._ownerNode.getScene().onBeforeRenderObservable.remove(this._sceneRenderObserver); - } - if (this._virtualTransformNode) { - this._virtualTransformNode.dispose(); - } + getClassName() { + return "GroundMesh"; } -}; - -// node_modules/@babylonjs/core/Behaviors/Meshes/surfaceMagnetismBehavior.js -var SurfaceMagnetismBehavior = class { - constructor() { - this._attachPointLocalOffset = new Vector3(); - this._workingPosition = new Vector3(); - this._workingQuaternion = new Quaternion(); - this._lastTick = -1; - this._hit = false; - this.hitNormalOffset = 0.05; - this.meshes = []; - this.interpolatePose = true; - this.lerpTime = 250; - this.keepOrientationVertical = true; - this.enabled = true; - this.maxStickingDistance = 0.8; + /** + * The minimum of x and y subdivisions + */ + get subdivisions() { + return Math.min(this._subdivisionsX, this._subdivisionsY); } /** - * Name of the behavior + * X subdivisions */ - get name() { - return "SurfaceMagnetism"; + get subdivisionsX() { + return this._subdivisionsX; } /** - * Function called when the behavior needs to be initialized (after attaching it to a target) + * Y subdivisions */ - init() { + get subdivisionsY() { + return this._subdivisionsY; } /** - * Attaches the behavior to a transform node - * @param target defines the target where the behavior is attached to - * @param scene the scene + * This function will divide the mesh into submeshes and update an octree to help to select the right submeshes + * for rendering, picking and collision computations. Please note that you must have a decent number of submeshes + * to get performance improvements when using an octree. + * @param chunksCount the number of submeshes the mesh will be divided into + * @param octreeBlocksSize the maximum size of the octree blocks (Default: 32) */ - attach(target, scene) { - this._attachedMesh = target; - this._scene = scene || target.getScene(); - if (!this._attachedMesh.rotationQuaternion) { - this._attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._attachedMesh.rotation.y, this._attachedMesh.rotation.x, this._attachedMesh.rotation.z); + optimize(chunksCount, octreeBlocksSize = 32) { + this._subdivisionsX = chunksCount; + this._subdivisionsY = chunksCount; + this.subdivide(chunksCount); + const thisAsAny = this; + if (thisAsAny.createOrUpdateSubmeshesOctree) { + thisAsAny.createOrUpdateSubmeshesOctree(octreeBlocksSize); } - this.updateAttachPoint(); - this._workingPosition.copyFrom(this._attachedMesh.position); - this._workingQuaternion.copyFrom(this._attachedMesh.rotationQuaternion); - this._addObservables(); } /** - * Detaches the behavior + * Returns a height (y) value in the World system : + * the ground altitude at the coordinates (x, z) expressed in the World system. + * @param x x coordinate + * @param z z coordinate + * @returns the ground y position if (x, z) are outside the ground surface. */ - detach() { - this._attachedMesh = null; - this._removeObservables(); - } - _getTargetPose(pickingInfo) { - if (!this._attachedMesh) { - return null; + getHeightAtCoordinates(x, z) { + const world = this.getWorldMatrix(); + const invMat = TmpVectors.Matrix[5]; + world.invertToRef(invMat); + const tmpVect = TmpVectors.Vector3[8]; + Vector3.TransformCoordinatesFromFloatsToRef(x, 0, z, invMat, tmpVect); + x = tmpVect.x; + z = tmpVect.z; + if (x < this._minX || x >= this._maxX || z <= this._minZ || z > this._maxZ) { + return this.position.y; } - if (pickingInfo && pickingInfo.hit) { - const pickedNormal = pickingInfo.getNormal(true, true); - const pickedPoint = pickingInfo.pickedPoint; - if (!pickedNormal || !pickedPoint) { - return null; - } - pickedNormal.normalize(); - const worldTarget = TmpVectors.Vector3[0]; - worldTarget.copyFrom(pickedNormal); - worldTarget.scaleInPlace(this.hitNormalOffset); - worldTarget.addInPlace(pickedPoint); - if (this._attachedMesh.parent) { - TmpVectors.Matrix[0].copyFrom(this._attachedMesh.parent.getWorldMatrix()).invert(); - Vector3.TransformNormalToRef(worldTarget, TmpVectors.Matrix[0], worldTarget); - } - return { - position: worldTarget, - quaternion: Quaternion.RotationYawPitchRoll(-Math.atan2(pickedNormal.x, -pickedNormal.z), this.keepOrientationVertical ? 0 : Math.atan2(pickedNormal.y, Math.sqrt(pickedNormal.z * pickedNormal.z + pickedNormal.x * pickedNormal.x)), 0) - }; + if (!this._heightQuads || this._heightQuads.length == 0) { + this._initHeightQuads(); + this._computeHeightQuads(); } - return null; + const facet = this._getFacetAt(x, z); + const y = -(facet.x * x + facet.z * z + facet.w) / facet.y; + Vector3.TransformCoordinatesFromFloatsToRef(0, y, 0, world, tmpVect); + return tmpVect.y; } /** - * Updates the attach point with the current geometry extents of the attached mesh + * Returns a normalized vector (Vector3) orthogonal to the ground + * at the ground coordinates (x, z) expressed in the World system. + * @param x x coordinate + * @param z z coordinate + * @returns Vector3(0.0, 1.0, 0.0) if (x, z) are outside the ground surface. */ - updateAttachPoint() { - this._getAttachPointOffsetToRef(this._attachPointLocalOffset); + getNormalAtCoordinates(x, z) { + const normal = new Vector3(0, 1, 0); + this.getNormalAtCoordinatesToRef(x, z, normal); + return normal; } /** - * Finds the intersection point of the given ray onto the meshes and updates the target. - * Transformation will be interpolated according to `interpolatePose` and `lerpTime` properties. - * If no mesh of `meshes` are hit, this does nothing. - * @param pickInfo The input pickingInfo that will be used to intersect the meshes - * @returns a boolean indicating if we found a hit to stick to + * Updates the Vector3 passed a reference with a normalized vector orthogonal to the ground + * at the ground coordinates (x, z) expressed in the World system. + * Doesn't update the reference Vector3 if (x, z) are outside the ground surface. + * @param x x coordinate + * @param z z coordinate + * @param ref vector to store the result + * @returns the GroundMesh. */ - findAndUpdateTarget(pickInfo) { - this._hit = false; - if (!pickInfo.ray) { - return false; + getNormalAtCoordinatesToRef(x, z, ref) { + const world = this.getWorldMatrix(); + const tmpMat = TmpVectors.Matrix[5]; + world.invertToRef(tmpMat); + const tmpVect = TmpVectors.Vector3[8]; + Vector3.TransformCoordinatesFromFloatsToRef(x, 0, z, tmpMat, tmpVect); + x = tmpVect.x; + z = tmpVect.z; + if (x < this._minX || x > this._maxX || z < this._minZ || z > this._maxZ) { + return this; } - const subPicking = pickInfo.ray.intersectsMeshes(this.meshes)[0]; - if (this._attachedMesh && subPicking && subPicking.hit && subPicking.pickedMesh) { - const pose = this._getTargetPose(subPicking); - if (pose && Vector3.Distance(this._attachedMesh.position, pose.position) < this.maxStickingDistance) { - this._workingPosition.copyFrom(pose.position); - this._workingQuaternion.copyFrom(pose.quaternion); - this._hit = true; - } + if (!this._heightQuads || this._heightQuads.length == 0) { + this._initHeightQuads(); + this._computeHeightQuads(); } - return this._hit; + const facet = this._getFacetAt(x, z); + Vector3.TransformNormalFromFloatsToRef(facet.x, facet.y, facet.z, world, ref); + return this; } - _getAttachPointOffsetToRef(ref) { - if (!this._attachedMesh) { - ref.setAll(0); - return; + /** + * Force the heights to be recomputed for getHeightAtCoordinates() or getNormalAtCoordinates() + * if the ground has been updated. + * This can be used in the render loop. + * @returns the GroundMesh. + */ + updateCoordinateHeights() { + if (!this._heightQuads || this._heightQuads.length == 0) { + this._initHeightQuads(); } - const storedQuat = TmpVectors.Quaternion[0]; - storedQuat.copyFrom(this._attachedMesh.rotationQuaternion); - this._attachedMesh.rotationQuaternion.copyFromFloats(0, 0, 0, 1); - this._attachedMesh.computeWorldMatrix(); - const boundingMinMax = this._attachedMesh.getHierarchyBoundingVectors(); - const center = TmpVectors.Vector3[0]; - boundingMinMax.max.addToRef(boundingMinMax.min, center); - center.scaleInPlace(0.5); - center.z = boundingMinMax.max.z; - const invWorld = TmpVectors.Matrix[0]; - this._attachedMesh.getWorldMatrix().invertToRef(invWorld); - Vector3.TransformCoordinatesToRef(center, invWorld, ref); - this._attachedMesh.rotationQuaternion.copyFrom(storedQuat); + this._computeHeightQuads(); + return this; } - _updateTransformToGoal(elapsed) { - if (!this._attachedMesh || !this._hit) { - return; + // Returns the element "facet" from the heightQuads array relative to (x, z) local coordinates + _getFacetAt(x, z) { + const col = Math.floor((x + this._maxX) * this._subdivisionsX / this._width); + const row = Math.floor(-(z + this._maxZ) * this._subdivisionsY / this._height + this._subdivisionsY); + const quad = this._heightQuads[row * this._subdivisionsX + col]; + let facet; + if (z < quad.slope.x * x + quad.slope.y) { + facet = quad.facet1; + } else { + facet = quad.facet2; } - const oldParent = this._attachedMesh.parent; - this._attachedMesh.setParent(null); - const worldOffset = TmpVectors.Vector3[0]; - Vector3.TransformNormalToRef(this._attachPointLocalOffset, this._attachedMesh.getWorldMatrix(), worldOffset); - if (!this.interpolatePose) { - this._attachedMesh.position.copyFrom(this._workingPosition).subtractInPlace(worldOffset); - this._attachedMesh.rotationQuaternion.copyFrom(this._workingQuaternion); - return; + return facet; + } + // Creates and populates the heightMap array with "facet" elements : + // a quad is two triangular facets separated by a slope, so a "facet" element is 1 slope + 2 facets + // slope : Vector2(c, h) = 2D diagonal line equation setting apart two triangular facets in a quad : z = cx + h + // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0 + // facet2 : Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0 + // Returns the GroundMesh. + _initHeightQuads() { + const subdivisionsX = this._subdivisionsX; + const subdivisionsY = this._subdivisionsY; + this._heightQuads = new Array(); + for (let row = 0; row < subdivisionsY; row++) { + for (let col = 0; col < subdivisionsX; col++) { + const quad = { slope: Vector2.Zero(), facet1: new Vector4(0, 0, 0, 0), facet2: new Vector4(0, 0, 0, 0) }; + this._heightQuads[row * subdivisionsX + col] = quad; + } } - const interpolatedPosition = new Vector3(); - Vector3.SmoothToRef(this._attachedMesh.position, this._workingPosition, elapsed, this.lerpTime, interpolatedPosition); - this._attachedMesh.position.copyFrom(interpolatedPosition); - const currentRotation = new Quaternion(); - currentRotation.copyFrom(this._attachedMesh.rotationQuaternion); - Quaternion.SmoothToRef(currentRotation, this._workingQuaternion, elapsed, this.lerpTime, this._attachedMesh.rotationQuaternion); - this._attachedMesh.setParent(oldParent); + return this; } - _addObservables() { - this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => { - if (this.enabled && pointerInfo.type == PointerEventTypes.POINTERMOVE && pointerInfo.pickInfo) { - this.findAndUpdateTarget(pointerInfo.pickInfo); + // Compute each quad element values and update the heightMap array : + // slope : Vector2(c, h) = 2D diagonal line equation setting apart two triangular facets in a quad : z = cx + h + // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0 + // facet2 : Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0 + // Returns the GroundMesh. + _computeHeightQuads() { + const positions = this.getVerticesData(VertexBuffer.PositionKind); + if (!positions) { + return this; + } + const v1 = TmpVectors.Vector3[3]; + const v2 = TmpVectors.Vector3[2]; + const v3 = TmpVectors.Vector3[1]; + const v4 = TmpVectors.Vector3[0]; + const v1v2 = TmpVectors.Vector3[4]; + const v1v3 = TmpVectors.Vector3[5]; + const v1v4 = TmpVectors.Vector3[6]; + const norm1 = TmpVectors.Vector3[7]; + const norm2 = TmpVectors.Vector3[8]; + let i = 0; + let j = 0; + let k = 0; + let cd = 0; + let h = 0; + let d1 = 0; + let d2 = 0; + const subdivisionsX = this._subdivisionsX; + const subdivisionsY = this._subdivisionsY; + for (let row = 0; row < subdivisionsY; row++) { + for (let col = 0; col < subdivisionsX; col++) { + i = col * 3; + j = row * (subdivisionsX + 1) * 3; + k = (row + 1) * (subdivisionsX + 1) * 3; + v1.x = positions[j + i]; + v1.y = positions[j + i + 1]; + v1.z = positions[j + i + 2]; + v2.x = positions[j + i + 3]; + v2.y = positions[j + i + 4]; + v2.z = positions[j + i + 5]; + v3.x = positions[k + i]; + v3.y = positions[k + i + 1]; + v3.z = positions[k + i + 2]; + v4.x = positions[k + i + 3]; + v4.y = positions[k + i + 4]; + v4.z = positions[k + i + 5]; + cd = (v4.z - v1.z) / (v4.x - v1.x); + h = v1.z - cd * v1.x; + v2.subtractToRef(v1, v1v2); + v3.subtractToRef(v1, v1v3); + v4.subtractToRef(v1, v1v4); + Vector3.CrossToRef(v1v4, v1v3, norm1); + Vector3.CrossToRef(v1v2, v1v4, norm2); + norm1.normalize(); + norm2.normalize(); + d1 = -(norm1.x * v1.x + norm1.y * v1.y + norm1.z * v1.z); + d2 = -(norm2.x * v2.x + norm2.y * v2.y + norm2.z * v2.z); + const quad = this._heightQuads[row * subdivisionsX + col]; + quad.slope.copyFromFloats(cd, h); + quad.facet1.copyFromFloats(norm1.x, norm1.y, norm1.z, d1); + quad.facet2.copyFromFloats(norm2.x, norm2.y, norm2.z, d2); } - }); - this._lastTick = Date.now(); - this._onBeforeRender = this._scene.onBeforeRenderObservable.add(() => { - const tick = Date.now(); - this._updateTransformToGoal(tick - this._lastTick); - this._lastTick = tick; - }); + } + return this; } - _removeObservables() { - this._scene.onPointerObservable.remove(this._pointerObserver); - this._scene.onBeforeRenderObservable.remove(this._onBeforeRender); - this._pointerObserver = null; - this._onBeforeRender = null; - } -}; - -// node_modules/@babylonjs/core/Behaviors/Meshes/followBehavior.js -var FollowBehavior = class { - constructor() { - this._tmpQuaternion = new Quaternion(); - this._tmpVectors = [new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3()]; - this._tmpMatrix = new Matrix(); - this._tmpInvertView = new Matrix(); - this._tmpForward = new Vector3(); - this._tmpNodeForward = new Vector3(); - this._tmpPosition = new Vector3(); - this._workingPosition = new Vector3(); - this._workingQuaternion = new Quaternion(); - this._lastTick = -1; - this._recenterNextUpdate = true; - this.interpolatePose = true; - this.lerpTime = 500; - this.ignoreCameraPitchAndRoll = false; - this.pitchOffset = 15; - this.maxViewVerticalDegrees = 30; - this.maxViewHorizontalDegrees = 30; - this.orientToCameraDeadzoneDegrees = 60; - this.ignoreDistanceClamp = false; - this.ignoreAngleClamp = false; - this.verticalMaxDistance = 0; - this.defaultDistance = 0.8; - this.maximumDistance = 2; - this.minimumDistance = 0.3; - this.useFixedVerticalOffset = false; - this.fixedVerticalOffset = 0; - this._enabled = true; - } - /** - * The camera that should be followed by this behavior - */ - get followedCamera() { - return this._followedCamera || this._scene.activeCamera; - } - set followedCamera(camera) { - this._followedCamera = camera; - } - /** - * The name of the behavior - */ - get name() { - return "Follow"; - } - /** - * Initializes the behavior - */ - init() { - } - /** - * Attaches the follow behavior - * @param ownerNode The mesh that will be following once attached - * @param followedCamera The camera that should be followed by the node - */ - attach(ownerNode, followedCamera) { - this._scene = ownerNode.getScene(); - this.attachedNode = ownerNode; - if (followedCamera) { - this.followedCamera = followedCamera; - } - this._addObservables(); - } - /** - * Detaches the behavior from the mesh - */ - detach() { - this.attachedNode = null; - this._removeObservables(); + /** + * Serializes this ground mesh + * @param serializationObject object to write serialization to + */ + serialize(serializationObject) { + super.serialize(serializationObject); + serializationObject.subdivisionsX = this._subdivisionsX; + serializationObject.subdivisionsY = this._subdivisionsY; + serializationObject.minX = this._minX; + serializationObject.maxX = this._maxX; + serializationObject.minZ = this._minZ; + serializationObject.maxZ = this._maxZ; + serializationObject.width = this._width; + serializationObject.height = this._height; } /** - * Recenters the attached node in front of the camera on the next update + * Parses a serialized ground mesh + * @param parsedMesh the serialized mesh + * @param scene the scene to create the ground mesh in + * @returns the created ground mesh */ - recenter() { - this._recenterNextUpdate = true; - } - _angleBetweenVectorAndPlane(vector, normal) { - this._tmpVectors[0].copyFrom(vector); - vector = this._tmpVectors[0]; - this._tmpVectors[1].copyFrom(normal); - normal = this._tmpVectors[1]; - vector.normalize(); - normal.normalize(); - return Math.PI / 2 - Math.acos(Vector3.Dot(vector, normal)); - } - _length2D(vector) { - return Math.sqrt(vector.x * vector.x + vector.z * vector.z); + static Parse(parsedMesh, scene) { + const result = new _GroundMesh(parsedMesh.name, scene); + result._subdivisionsX = parsedMesh.subdivisionsX || 1; + result._subdivisionsY = parsedMesh.subdivisionsY || 1; + result._minX = parsedMesh.minX; + result._maxX = parsedMesh.maxX; + result._minZ = parsedMesh.minZ; + result._maxZ = parsedMesh.maxZ; + result._width = parsedMesh.width; + result._height = parsedMesh.height; + return result; } - _distanceClamp(currentToTarget, moveToDefault = false) { - let minDistance = this.minimumDistance; - let maxDistance = this.maximumDistance; - const defaultDistance = this.defaultDistance; - const direction = this._tmpVectors[0]; - direction.copyFrom(currentToTarget); - let currentDistance = direction.length(); - direction.normalizeFromLength(currentDistance); - if (this.ignoreCameraPitchAndRoll) { - minDistance = this._length2D(direction) * minDistance; - maxDistance = this._length2D(direction) * maxDistance; - const currentDistance2D = this._length2D(currentToTarget); - direction.scaleInPlace(currentDistance / currentDistance2D); - currentDistance = currentDistance2D; - } - let clampedDistance = currentDistance; - if (moveToDefault) { - clampedDistance = defaultDistance; - } else { - clampedDistance = Scalar.Clamp(currentDistance, minDistance, maxDistance); +}; + +// node_modules/@babylonjs/core/Meshes/Builders/groundBuilder.js +function CreateGroundVertexData(options) { + const indices = []; + const positions = []; + const normals = []; + const uvs = []; + let row, col; + const width = options.width || 1; + const height = options.height || 1; + const subdivisionsX = (options.subdivisionsX || options.subdivisions || 1) | 0; + const subdivisionsY = (options.subdivisionsY || options.subdivisions || 1) | 0; + for (row = 0; row <= subdivisionsY; row++) { + for (col = 0; col <= subdivisionsX; col++) { + const position = new Vector3(col * width / subdivisionsX - width / 2, 0, (subdivisionsY - row) * height / subdivisionsY - height / 2); + const normal = new Vector3(0, 1, 0); + positions.push(position.x, position.y, position.z); + normals.push(normal.x, normal.y, normal.z); + uvs.push(col / subdivisionsX, CompatibilityOptions.UseOpenGLOrientationForUV ? row / subdivisionsY : 1 - row / subdivisionsY); } - currentToTarget.copyFrom(direction).scaleInPlace(clampedDistance); - return currentDistance !== clampedDistance; } - _applyVerticalClamp(currentToTarget) { - if (this.verticalMaxDistance !== 0) { - currentToTarget.y = Scalar.Clamp(currentToTarget.y, -this.verticalMaxDistance, this.verticalMaxDistance); + for (row = 0; row < subdivisionsY; row++) { + for (col = 0; col < subdivisionsX; col++) { + indices.push(col + 1 + (row + 1) * (subdivisionsX + 1)); + indices.push(col + 1 + row * (subdivisionsX + 1)); + indices.push(col + row * (subdivisionsX + 1)); + indices.push(col + (row + 1) * (subdivisionsX + 1)); + indices.push(col + 1 + (row + 1) * (subdivisionsX + 1)); + indices.push(col + row * (subdivisionsX + 1)); } } - _toOrientationQuatToRef(vector, quaternion) { - Quaternion.RotationYawPitchRollToRef(Math.atan2(vector.x, vector.z), Math.atan2(vector.y, Math.sqrt(vector.z * vector.z + vector.x * vector.x)), 0, quaternion); - } - _applyPitchOffset(invertView) { - const forward = this._tmpVectors[0]; - const right = this._tmpVectors[1]; - forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1); - right.copyFromFloats(1, 0, 0); - Vector3.TransformNormalToRef(forward, invertView, forward); - forward.y = 0; - forward.normalize(); - Vector3.TransformNormalToRef(right, invertView, right); - Quaternion.RotationAxisToRef(right, this.pitchOffset * Math.PI / 180, this._tmpQuaternion); - forward.rotateByQuaternionToRef(this._tmpQuaternion, forward); - this._toOrientationQuatToRef(forward, this._tmpQuaternion); - this._tmpQuaternion.toRotationMatrix(this._tmpMatrix); - invertView.copyFrom(this._tmpMatrix); - } - _angularClamp(invertView, currentToTarget) { - const forward = this._tmpVectors[5]; - forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1); - const right = this._tmpVectors[6]; - right.copyFromFloats(1, 0, 0); - Vector3.TransformNormalToRef(forward, invertView, forward); - Vector3.TransformNormalToRef(right, invertView, right); - const up = Vector3.UpReadOnly; - const dist = currentToTarget.length(); - if (dist < Epsilon) { - return false; - } - let angularClamped = false; - const rotationQuat = this._tmpQuaternion; - if (this.ignoreCameraPitchAndRoll) { - const angle2 = Vector3.GetAngleBetweenVectorsOnPlane(currentToTarget, forward, right); - Quaternion.RotationAxisToRef(right, angle2, rotationQuat); - currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget); - } else { - const angle2 = -Vector3.GetAngleBetweenVectorsOnPlane(currentToTarget, forward, right); - const minMaxAngle2 = this.maxViewVerticalDegrees * Math.PI / 180 * 0.5; - if (angle2 < -minMaxAngle2) { - Quaternion.RotationAxisToRef(right, -angle2 - minMaxAngle2, rotationQuat); - currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget); - angularClamped = true; - } else if (angle2 > minMaxAngle2) { - Quaternion.RotationAxisToRef(right, -angle2 + minMaxAngle2, rotationQuat); - currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget); - angularClamped = true; + const vertexData = new VertexData(); + vertexData.indices = indices; + vertexData.positions = positions; + vertexData.normals = normals; + vertexData.uvs = uvs; + return vertexData; +} +function CreateTiledGroundVertexData(options) { + const xmin = options.xmin !== void 0 && options.xmin !== null ? options.xmin : -1; + const zmin = options.zmin !== void 0 && options.zmin !== null ? options.zmin : -1; + const xmax = options.xmax !== void 0 && options.xmax !== null ? options.xmax : 1; + const zmax = options.zmax !== void 0 && options.zmax !== null ? options.zmax : 1; + const subdivisions = options.subdivisions || { w: 1, h: 1 }; + const precision = options.precision || { w: 1, h: 1 }; + const indices = []; + const positions = []; + const normals = []; + const uvs = []; + let row, col, tileRow, tileCol; + subdivisions.h = subdivisions.h < 1 ? 1 : subdivisions.h; + subdivisions.w = subdivisions.w < 1 ? 1 : subdivisions.w; + precision.w = precision.w < 1 ? 1 : precision.w; + precision.h = precision.h < 1 ? 1 : precision.h; + const tileSize = { + w: (xmax - xmin) / subdivisions.w, + h: (zmax - zmin) / subdivisions.h + }; + function applyTile(xTileMin, zTileMin, xTileMax, zTileMax) { + const base = positions.length / 3; + const rowLength = precision.w + 1; + for (row = 0; row < precision.h; row++) { + for (col = 0; col < precision.w; col++) { + const square = [base + col + row * rowLength, base + (col + 1) + row * rowLength, base + (col + 1) + (row + 1) * rowLength, base + col + (row + 1) * rowLength]; + indices.push(square[1]); + indices.push(square[2]); + indices.push(square[3]); + indices.push(square[0]); + indices.push(square[1]); + indices.push(square[3]); } } - const angle = this._angleBetweenVectorAndPlane(currentToTarget, right) * (this._scene.useRightHandedSystem ? -1 : 1); - const minMaxAngle = this.maxViewHorizontalDegrees * Math.PI / 180 * 0.5; - if (angle < -minMaxAngle) { - Quaternion.RotationAxisToRef(up, -angle - minMaxAngle, rotationQuat); - currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget); - angularClamped = true; - } else if (angle > minMaxAngle) { - Quaternion.RotationAxisToRef(up, -angle + minMaxAngle, rotationQuat); - currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget); - angularClamped = true; + const position = Vector3.Zero(); + const normal = new Vector3(0, 1, 0); + for (row = 0; row <= precision.h; row++) { + position.z = row * (zTileMax - zTileMin) / precision.h + zTileMin; + for (col = 0; col <= precision.w; col++) { + position.x = col * (xTileMax - xTileMin) / precision.w + xTileMin; + position.y = 0; + positions.push(position.x, position.y, position.z); + normals.push(normal.x, normal.y, normal.z); + uvs.push(col / precision.w, row / precision.h); + } } - return angularClamped; } - _orientationClamp(currentToTarget, rotationQuaternion) { - var _a; - const toFollowed = this._tmpVectors[0]; - toFollowed.copyFrom(currentToTarget).scaleInPlace(-1).normalize(); - const up = this._tmpVectors[1]; - const right = this._tmpVectors[2]; - up.copyFromFloats(0, 1, 0); - Vector3.CrossToRef(toFollowed, up, right); - const length = right.length(); - if (length < Epsilon) { - return; - } - right.normalizeFromLength(length); - Vector3.CrossToRef(right, toFollowed, up); - if ((_a = this.attachedNode) == null ? void 0 : _a.getScene().useRightHandedSystem) { - Quaternion.FromLookDirectionRHToRef(toFollowed, up, rotationQuaternion); - } else { - Quaternion.FromLookDirectionLHToRef(toFollowed, up, rotationQuaternion); + for (tileRow = 0; tileRow < subdivisions.h; tileRow++) { + for (tileCol = 0; tileCol < subdivisions.w; tileCol++) { + applyTile(xmin + tileCol * tileSize.w, zmin + tileRow * tileSize.h, xmin + (tileCol + 1) * tileSize.w, zmin + (tileRow + 1) * tileSize.h); } } - _passedOrientationDeadzone(currentToTarget, forward) { - const leashToFollow = this._tmpVectors[5]; - leashToFollow.copyFrom(currentToTarget); - leashToFollow.normalize(); - const angle = Math.abs(Vector3.GetAngleBetweenVectorsOnPlane(forward, leashToFollow, Vector3.UpReadOnly)); - return angle * 180 / Math.PI > this.orientToCameraDeadzoneDegrees; + const vertexData = new VertexData(); + vertexData.indices = indices; + vertexData.positions = positions; + vertexData.normals = normals; + vertexData.uvs = uvs; + return vertexData; +} +function CreateGroundFromHeightMapVertexData(options) { + const indices = []; + const positions = []; + const normals = []; + const uvs = []; + let row, col; + const filter = options.colorFilter || new Color3(0.3, 0.59, 0.11); + const alphaFilter = options.alphaFilter || 0; + let invert = false; + if (options.minHeight > options.maxHeight) { + invert = true; + const temp = options.maxHeight; + options.maxHeight = options.minHeight; + options.minHeight = temp; } - _updateLeashing(camera) { - if (this.attachedNode && this._enabled) { - const oldParent = this.attachedNode.parent; - this.attachedNode.setParent(null); - const worldMatrix = this.attachedNode.getWorldMatrix(); - const currentToTarget = this._workingPosition; - const rotationQuaternion = this._workingQuaternion; - const pivot = this.attachedNode.getPivotPoint(); - const invertView = this._tmpInvertView; - invertView.copyFrom(camera.getViewMatrix()); - invertView.invert(); - Vector3.TransformCoordinatesToRef(pivot, worldMatrix, currentToTarget); - const position = this._tmpPosition; - position.copyFromFloats(0, 0, 0); - Vector3.TransformCoordinatesToRef(position, worldMatrix, position); - position.scaleInPlace(-1).subtractInPlace(pivot); - currentToTarget.subtractInPlace(camera.globalPosition); - if (this.ignoreCameraPitchAndRoll) { - this._applyPitchOffset(invertView); + for (row = 0; row <= options.subdivisions; row++) { + for (col = 0; col <= options.subdivisions; col++) { + const position = new Vector3(col * options.width / options.subdivisions - options.width / 2, 0, (options.subdivisions - row) * options.height / options.subdivisions - options.height / 2); + const heightMapX = (position.x + options.width / 2) / options.width * (options.bufferWidth - 1) | 0; + const heightMapY = (1 - (position.z + options.height / 2) / options.height) * (options.bufferHeight - 1) | 0; + const pos = (heightMapX + heightMapY * options.bufferWidth) * 4; + let r = options.buffer[pos] / 255; + let g = options.buffer[pos + 1] / 255; + let b = options.buffer[pos + 2] / 255; + const a = options.buffer[pos + 3] / 255; + if (invert) { + r = 1 - r; + g = 1 - g; + b = 1 - b; } - let angularClamped = false; - const forward = this._tmpForward; - forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1); - Vector3.TransformNormalToRef(forward, invertView, forward); - const nodeForward = this._tmpNodeForward; - nodeForward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1); - Vector3.TransformNormalToRef(nodeForward, worldMatrix, nodeForward); - if (this._recenterNextUpdate) { - currentToTarget.copyFrom(forward).scaleInPlace(this.defaultDistance); + const gradient = r * filter.r + g * filter.g + b * filter.b; + if (a >= alphaFilter) { + position.y = options.minHeight + (options.maxHeight - options.minHeight) * gradient; } else { - if (this.ignoreAngleClamp) { - const currentDistance = currentToTarget.length(); - currentToTarget.copyFrom(forward).scaleInPlace(currentDistance); - } else { - angularClamped = this._angularClamp(invertView, currentToTarget); - } + position.y = options.minHeight - Epsilon; } - let distanceClamped = false; - if (!this.ignoreDistanceClamp) { - distanceClamped = this._distanceClamp(currentToTarget, angularClamped); - this._applyVerticalClamp(currentToTarget); + if (options.heightBuffer) { + options.heightBuffer[row * (options.subdivisions + 1) + col] = position.y; } - if (this.useFixedVerticalOffset) { - currentToTarget.y = position.y - camera.globalPosition.y + this.fixedVerticalOffset; + positions.push(position.x, position.y, position.z); + normals.push(0, 0, 0); + uvs.push(col / options.subdivisions, 1 - row / options.subdivisions); + } + } + for (row = 0; row < options.subdivisions; row++) { + for (col = 0; col < options.subdivisions; col++) { + const idx1 = col + 1 + (row + 1) * (options.subdivisions + 1); + const idx2 = col + 1 + row * (options.subdivisions + 1); + const idx3 = col + row * (options.subdivisions + 1); + const idx4 = col + (row + 1) * (options.subdivisions + 1); + const isVisibleIdx1 = positions[idx1 * 3 + 1] >= options.minHeight; + const isVisibleIdx2 = positions[idx2 * 3 + 1] >= options.minHeight; + const isVisibleIdx3 = positions[idx3 * 3 + 1] >= options.minHeight; + if (isVisibleIdx1 && isVisibleIdx2 && isVisibleIdx3) { + indices.push(idx1); + indices.push(idx2); + indices.push(idx3); } - if (angularClamped || distanceClamped || this._passedOrientationDeadzone(currentToTarget, nodeForward) || this._recenterNextUpdate) { - this._orientationClamp(currentToTarget, rotationQuaternion); + const isVisibleIdx4 = positions[idx4 * 3 + 1] >= options.minHeight; + if (isVisibleIdx4 && isVisibleIdx1 && isVisibleIdx3) { + indices.push(idx4); + indices.push(idx1); + indices.push(idx3); } - this._workingPosition.subtractInPlace(pivot); - this._recenterNextUpdate = false; - this.attachedNode.setParent(oldParent); } } - _updateTransformToGoal(elapsed) { - if (!this.attachedNode || !this.followedCamera || !this._enabled) { - return; - } - if (!this.attachedNode.rotationQuaternion) { - this.attachedNode.rotationQuaternion = Quaternion.Identity(); - } - const oldParent = this.attachedNode.parent; - this.attachedNode.setParent(null); - if (!this.interpolatePose) { - this.attachedNode.position.copyFrom(this.followedCamera.globalPosition).addInPlace(this._workingPosition); - this.attachedNode.rotationQuaternion.copyFrom(this._workingQuaternion); - return; - } - const currentDirection = new Vector3(); - currentDirection.copyFrom(this.attachedNode.position).subtractInPlace(this.followedCamera.globalPosition); - Vector3.SmoothToRef(currentDirection, this._workingPosition, elapsed, this.lerpTime, currentDirection); - currentDirection.addInPlace(this.followedCamera.globalPosition); - this.attachedNode.position.copyFrom(currentDirection); - const currentRotation = new Quaternion(); - currentRotation.copyFrom(this.attachedNode.rotationQuaternion); - Quaternion.SmoothToRef(currentRotation, this._workingQuaternion, elapsed, this.lerpTime, this.attachedNode.rotationQuaternion); - this.attachedNode.setParent(oldParent); + VertexData.ComputeNormals(positions, indices, normals); + const vertexData = new VertexData(); + vertexData.indices = indices; + vertexData.positions = positions; + vertexData.normals = normals; + vertexData.uvs = uvs; + return vertexData; +} +function CreateGround(name69, options = {}, scene) { + const ground = new GroundMesh(name69, scene); + ground._setReady(false); + ground._subdivisionsX = options.subdivisionsX || options.subdivisions || 1; + ground._subdivisionsY = options.subdivisionsY || options.subdivisions || 1; + ground._width = options.width || 1; + ground._height = options.height || 1; + ground._maxX = ground._width / 2; + ground._maxZ = ground._height / 2; + ground._minX = -ground._maxX; + ground._minZ = -ground._maxZ; + const vertexData = CreateGroundVertexData(options); + vertexData.applyToMesh(ground, options.updatable); + ground._setReady(true); + return ground; +} +function CreateTiledGround(name69, options, scene = null) { + const tiledGround = new Mesh(name69, scene); + const vertexData = CreateTiledGroundVertexData(options); + vertexData.applyToMesh(tiledGround, options.updatable); + return tiledGround; +} +function CreateGroundFromHeightMap(name69, url, options = {}, scene = null) { + const width = options.width || 10; + const height = options.height || 10; + const subdivisions = options.subdivisions || 1 | 0; + const minHeight = options.minHeight || 0; + const maxHeight = options.maxHeight || 1; + const filter = options.colorFilter || new Color3(0.3, 0.59, 0.11); + const alphaFilter = options.alphaFilter || 0; + const updatable = options.updatable; + const onReady = options.onReady; + scene = scene || EngineStore.LastCreatedScene; + const ground = new GroundMesh(name69, scene); + ground._subdivisionsX = subdivisions; + ground._subdivisionsY = subdivisions; + ground._width = width; + ground._height = height; + ground._maxX = ground._width / 2; + ground._maxZ = ground._height / 2; + ground._minX = -ground._maxX; + ground._minZ = -ground._maxZ; + ground._setReady(false); + let heightBuffer; + if (options.passHeightBufferInCallback) { + heightBuffer = new Float32Array((subdivisions + 1) * (subdivisions + 1)); } - _addObservables() { - this._lastTick = Date.now(); - this._onBeforeRender = this._scene.onBeforeRenderObservable.add(() => { - if (!this.followedCamera) { - return; - } - const tick = Date.now(); - this._updateLeashing(this.followedCamera); - this._updateTransformToGoal(tick - this._lastTick); - this._lastTick = tick; + const onBufferLoaded = (buffer, bufferWidth, bufferHeight) => { + const vertexData = CreateGroundFromHeightMapVertexData({ + width, + height, + subdivisions, + minHeight, + maxHeight, + colorFilter: filter, + buffer, + bufferWidth, + bufferHeight, + alphaFilter, + heightBuffer }); - } - _removeObservables() { - if (this._onBeforeRender) { - this._scene.onBeforeRenderObservable.remove(this._onBeforeRender); + vertexData.applyToMesh(ground, updatable); + if (onReady) { + onReady(ground, heightBuffer); } + ground._setReady(true); + }; + if (typeof url === "string") { + const onload = (img) => { + const bufferWidth = img.width; + const bufferHeight = img.height; + if (scene.isDisposed) { + return; + } + const buffer = scene == null ? void 0 : scene.getEngine().resizeImageBitmap(img, bufferWidth, bufferHeight); + onBufferLoaded(buffer, bufferWidth, bufferHeight); + }; + Tools.LoadImage(url, onload, options.onError ? options.onError : () => { + }, scene.offlineProvider); + } else { + onBufferLoaded(url.data, url.width, url.height); } + return ground; +} +var GroundBuilder = { + // eslint-disable-next-line @typescript-eslint/naming-convention + CreateGround, + // eslint-disable-next-line @typescript-eslint/naming-convention + CreateGroundFromHeightMap, + // eslint-disable-next-line @typescript-eslint/naming-convention + CreateTiledGround }; - -// node_modules/@babylonjs/core/XR/webXRFeaturesManager.js -var WebXRFeatureName = class { -}; -WebXRFeatureName.ANCHOR_SYSTEM = "xr-anchor-system"; -WebXRFeatureName.BACKGROUND_REMOVER = "xr-background-remover"; -WebXRFeatureName.HIT_TEST = "xr-hit-test"; -WebXRFeatureName.MESH_DETECTION = "xr-mesh-detection"; -WebXRFeatureName.PHYSICS_CONTROLLERS = "xr-physics-controller"; -WebXRFeatureName.PLANE_DETECTION = "xr-plane-detection"; -WebXRFeatureName.POINTER_SELECTION = "xr-controller-pointer-selection"; -WebXRFeatureName.TELEPORTATION = "xr-controller-teleportation"; -WebXRFeatureName.FEATURE_POINTS = "xr-feature-points"; -WebXRFeatureName.HAND_TRACKING = "xr-hand-tracking"; -WebXRFeatureName.IMAGE_TRACKING = "xr-image-tracking"; -WebXRFeatureName.NEAR_INTERACTION = "xr-near-interaction"; -WebXRFeatureName.DOM_OVERLAY = "xr-dom-overlay"; -WebXRFeatureName.MOVEMENT = "xr-controller-movement"; -WebXRFeatureName.LIGHT_ESTIMATION = "xr-light-estimation"; -WebXRFeatureName.EYE_TRACKING = "xr-eye-tracking"; -WebXRFeatureName.WALKING_LOCOMOTION = "xr-walking-locomotion"; -WebXRFeatureName.LAYERS = "xr-layers"; -WebXRFeatureName.DEPTH_SENSING = "xr-depth-sensing"; -WebXRFeatureName.SPACE_WARP = "xr-space-warp"; -WebXRFeatureName.RAW_CAMERA_ACCESS = "xr-raw-camera-access"; -var WebXRFeaturesManager = class _WebXRFeaturesManager { - /** - * constructs a new features manages. - * - * @param _xrSessionManager an instance of WebXRSessionManager - */ - constructor(_xrSessionManager) { - this._xrSessionManager = _xrSessionManager; - this._features = {}; - this._xrSessionManager.onXRSessionInit.add(() => { - this.getEnabledFeatures().forEach((featureName) => { - const feature = this._features[featureName]; - if (feature.enabled && !feature.featureImplementation.attached && !feature.featureImplementation.disableAutoAttach) { - this.attachFeature(featureName); - } - }); - }); - this._xrSessionManager.onXRSessionEnded.add(() => { - this.getEnabledFeatures().forEach((featureName) => { - const feature = this._features[featureName]; - if (feature.enabled && feature.featureImplementation.attached) { - this.detachFeature(featureName); - } - }); - }); +VertexData.CreateGround = CreateGroundVertexData; +VertexData.CreateTiledGround = CreateTiledGroundVertexData; +VertexData.CreateGroundFromHeightMap = CreateGroundFromHeightMapVertexData; +Mesh.CreateGround = (name69, width, height, subdivisions, scene, updatable) => { + const options = { + width, + height, + subdivisions, + updatable + }; + return CreateGround(name69, options, scene); +}; +Mesh.CreateTiledGround = (name69, xmin, zmin, xmax, zmax, subdivisions, precision, scene, updatable) => { + const options = { + xmin, + zmin, + xmax, + zmax, + subdivisions, + precision, + updatable + }; + return CreateTiledGround(name69, options, scene); +}; +Mesh.CreateGroundFromHeightMap = (name69, url, width, height, subdivisions, minHeight, maxHeight, scene, updatable, onReady, alphaFilter) => { + const options = { + width, + height, + subdivisions, + minHeight, + maxHeight, + updatable, + onReady, + alphaFilter + }; + return CreateGroundFromHeightMap(name69, url, options, scene); +}; + +// node_modules/@babylonjs/core/Meshes/Builders/boxBuilder.js +function CreateBoxVertexData(options) { + const nbFaces = 6; + let indices = [0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23]; + const normals = [ + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 0 + ]; + const uvs = []; + let positions = []; + const width = options.width || options.size || 1; + const height = options.height || options.size || 1; + const depth = options.depth || options.size || 1; + const wrap = options.wrap || false; + let topBaseAt = options.topBaseAt === void 0 ? 1 : options.topBaseAt; + let bottomBaseAt = options.bottomBaseAt === void 0 ? 0 : options.bottomBaseAt; + topBaseAt = (topBaseAt + 4) % 4; + bottomBaseAt = (bottomBaseAt + 4) % 4; + const topOrder = [2, 0, 3, 1]; + const bottomOrder = [2, 0, 1, 3]; + let topIndex = topOrder[topBaseAt]; + let bottomIndex = bottomOrder[bottomBaseAt]; + let basePositions = [ + 1, + -1, + 1, + -1, + -1, + 1, + -1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + -1, + -1, + 1, + -1, + -1, + -1, + -1, + 1, + -1, + -1, + 1, + 1, + -1, + 1, + -1, + -1, + 1, + -1, + 1, + 1, + 1, + 1, + -1, + 1, + 1, + -1, + -1, + 1, + -1, + -1, + -1, + -1, + 1, + -1, + -1, + 1, + 1, + -1, + 1, + -1, + 1, + 1, + -1, + 1, + 1, + 1, + 1, + -1, + 1, + 1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 1 + ]; + if (wrap) { + indices = [2, 3, 0, 2, 0, 1, 4, 5, 6, 4, 6, 7, 9, 10, 11, 9, 11, 8, 12, 14, 15, 12, 13, 14]; + basePositions = [ + -1, + 1, + 1, + 1, + 1, + 1, + 1, + -1, + 1, + -1, + -1, + 1, + 1, + 1, + -1, + -1, + 1, + -1, + -1, + -1, + -1, + 1, + -1, + -1, + 1, + 1, + 1, + 1, + 1, + -1, + 1, + -1, + -1, + 1, + -1, + 1, + -1, + 1, + -1, + -1, + 1, + 1, + -1, + -1, + 1, + -1, + -1, + -1 + ]; + let topFaceBase = [ + [1, 1, 1], + [-1, 1, 1], + [-1, 1, -1], + [1, 1, -1] + ]; + let bottomFaceBase = [ + [-1, -1, 1], + [1, -1, 1], + [1, -1, -1], + [-1, -1, -1] + ]; + const topFaceOrder = [17, 18, 19, 16]; + const bottomFaceOrder = [22, 23, 20, 21]; + while (topIndex > 0) { + topFaceBase.unshift(topFaceBase.pop()); + topFaceOrder.unshift(topFaceOrder.pop()); + topIndex--; + } + while (bottomIndex > 0) { + bottomFaceBase.unshift(bottomFaceBase.pop()); + bottomFaceOrder.unshift(bottomFaceOrder.pop()); + bottomIndex--; + } + topFaceBase = topFaceBase.flat(); + bottomFaceBase = bottomFaceBase.flat(); + basePositions = basePositions.concat(topFaceBase).concat(bottomFaceBase); + indices.push(topFaceOrder[0], topFaceOrder[2], topFaceOrder[3], topFaceOrder[0], topFaceOrder[1], topFaceOrder[2]); + indices.push(bottomFaceOrder[0], bottomFaceOrder[2], bottomFaceOrder[3], bottomFaceOrder[0], bottomFaceOrder[1], bottomFaceOrder[2]); } - /** - * Used to register a module. After calling this function a developer can use this feature in the scene. - * Mainly used internally. - * - * @param featureName the name of the feature to register - * @param constructorFunction the function used to construct the module - * @param version the (babylon) version of the module - * @param stable is that a stable version of this module - */ - static AddWebXRFeature(featureName, constructorFunction, version = 1, stable = false) { - this._AvailableFeatures[featureName] = this._AvailableFeatures[featureName] || { latest: version }; - if (version > this._AvailableFeatures[featureName].latest) { - this._AvailableFeatures[featureName].latest = version; + const scaleArray = [width / 2, height / 2, depth / 2]; + positions = basePositions.reduce((accumulator, currentValue, currentIndex) => accumulator.concat(currentValue * scaleArray[currentIndex % 3]), []); + const sideOrientation = options.sideOrientation === 0 ? 0 : options.sideOrientation || VertexData.DEFAULTSIDE; + const faceUV = options.faceUV || new Array(6); + const faceColors = options.faceColors; + const colors = []; + for (let f = 0; f < 6; f++) { + if (faceUV[f] === void 0) { + faceUV[f] = new Vector4(0, 0, 1, 1); } - if (stable) { - this._AvailableFeatures[featureName].stable = version; + if (faceColors && faceColors[f] === void 0) { + faceColors[f] = new Color4(1, 1, 1, 1); } - this._AvailableFeatures[featureName][version] = constructorFunction; } - /** - * Returns a constructor of a specific feature. - * - * @param featureName the name of the feature to construct - * @param version the version of the feature to load - * @param xrSessionManager the xrSessionManager. Used to construct the module - * @param options optional options provided to the module. - * @returns a function that, when called, will return a new instance of this feature - */ - static ConstructFeature(featureName, version = 1, xrSessionManager, options) { - const constructorFunction = this._AvailableFeatures[featureName][version]; - if (!constructorFunction) { - throw new Error("feature not found"); + for (let index = 0; index < nbFaces; index++) { + uvs.push(faceUV[index].z, CompatibilityOptions.UseOpenGLOrientationForUV ? 1 - faceUV[index].w : faceUV[index].w); + uvs.push(faceUV[index].x, CompatibilityOptions.UseOpenGLOrientationForUV ? 1 - faceUV[index].w : faceUV[index].w); + uvs.push(faceUV[index].x, CompatibilityOptions.UseOpenGLOrientationForUV ? 1 - faceUV[index].y : faceUV[index].y); + uvs.push(faceUV[index].z, CompatibilityOptions.UseOpenGLOrientationForUV ? 1 - faceUV[index].y : faceUV[index].y); + if (faceColors) { + for (let c = 0; c < 4; c++) { + colors.push(faceColors[index].r, faceColors[index].g, faceColors[index].b, faceColors[index].a); + } } - return constructorFunction(xrSessionManager, options); } - /** - * Can be used to return the list of features currently registered - * - * @returns an Array of available features - */ - static GetAvailableFeatures() { - return Object.keys(this._AvailableFeatures); + VertexData._ComputeSides(sideOrientation, positions, indices, normals, uvs, options.frontUVs, options.backUVs); + const vertexData = new VertexData(); + vertexData.indices = indices; + vertexData.positions = positions; + vertexData.normals = normals; + vertexData.uvs = uvs; + if (faceColors) { + const totalColors = sideOrientation === VertexData.DOUBLESIDE ? colors.concat(colors) : colors; + vertexData.colors = totalColors; } + return vertexData; +} +function CreateSegmentedBoxVertexData(options) { + const width = options.width || options.size || 1; + const height = options.height || options.size || 1; + const depth = options.depth || options.size || 1; + const widthSegments = (options.widthSegments || options.segments || 1) | 0; + const heightSegments = (options.heightSegments || options.segments || 1) | 0; + const depthSegments = (options.depthSegments || options.segments || 1) | 0; + const rotationMatrix = new Matrix(); + const translationMatrix = new Matrix(); + const transformMatrix = new Matrix(); + const bottomPlane = CreateGroundVertexData({ width, height: depth, subdivisionsX: widthSegments, subdivisionsY: depthSegments }); + Matrix.TranslationToRef(0, -height / 2, 0, translationMatrix); + Matrix.RotationZToRef(Math.PI, rotationMatrix); + rotationMatrix.multiplyToRef(translationMatrix, transformMatrix); + bottomPlane.transform(transformMatrix); + const topPlane = CreateGroundVertexData({ width, height: depth, subdivisionsX: widthSegments, subdivisionsY: depthSegments }); + Matrix.TranslationToRef(0, height / 2, 0, transformMatrix); + topPlane.transform(transformMatrix); + const negXPlane = CreateGroundVertexData({ width: height, height: depth, subdivisionsX: heightSegments, subdivisionsY: depthSegments }); + Matrix.TranslationToRef(-width / 2, 0, 0, translationMatrix); + Matrix.RotationZToRef(Math.PI / 2, rotationMatrix); + rotationMatrix.multiplyToRef(translationMatrix, transformMatrix); + negXPlane.transform(transformMatrix); + const posXPlane = CreateGroundVertexData({ width: height, height: depth, subdivisionsX: heightSegments, subdivisionsY: depthSegments }); + Matrix.TranslationToRef(width / 2, 0, 0, translationMatrix); + Matrix.RotationZToRef(-Math.PI / 2, rotationMatrix); + rotationMatrix.multiplyToRef(translationMatrix, transformMatrix); + posXPlane.transform(transformMatrix); + const negZPlane = CreateGroundVertexData({ width, height, subdivisionsX: widthSegments, subdivisionsY: heightSegments }); + Matrix.TranslationToRef(0, 0, -depth / 2, translationMatrix); + Matrix.RotationXToRef(-Math.PI / 2, rotationMatrix); + rotationMatrix.multiplyToRef(translationMatrix, transformMatrix); + negZPlane.transform(transformMatrix); + const posZPlane = CreateGroundVertexData({ width, height, subdivisionsX: widthSegments, subdivisionsY: heightSegments }); + Matrix.TranslationToRef(0, 0, depth / 2, translationMatrix); + Matrix.RotationXToRef(Math.PI / 2, rotationMatrix); + rotationMatrix.multiplyToRef(translationMatrix, transformMatrix); + posZPlane.transform(transformMatrix); + bottomPlane.merge([topPlane, posXPlane, negXPlane, negZPlane, posZPlane], true); + return bottomPlane; +} +function CreateBox(name69, options = {}, scene = null) { + const box = new Mesh(name69, scene); + options.sideOrientation = Mesh._GetDefaultSideOrientation(options.sideOrientation); + box._originalBuilderSideOrientation = options.sideOrientation; + const vertexData = CreateBoxVertexData(options); + vertexData.applyToMesh(box, options.updatable); + return box; +} +var BoxBuilder = { + // eslint-disable-next-line @typescript-eslint/naming-convention + CreateBox +}; +VertexData.CreateBox = CreateBoxVertexData; +Mesh.CreateBox = (name69, size, scene = null, updatable, sideOrientation) => { + const options = { + size, + sideOrientation, + updatable + }; + return CreateBox(name69, options, scene); +}; + +// node_modules/@babylonjs/core/Materials/materialDefines.js +var MaterialDefines = class { /** - * Gets the versions available for a specific feature - * @param featureName the name of the feature - * @returns an array with the available versions + * Creates a new instance + * @param externalProperties list of external properties to inject into the object */ - static GetAvailableVersions(featureName) { - return Object.keys(this._AvailableFeatures[featureName]); + constructor(externalProperties) { + this._keys = []; + this._isDirty = true; + this._areLightsDirty = true; + this._areLightsDisposed = false; + this._areAttributesDirty = true; + this._areTexturesDirty = true; + this._areFresnelDirty = true; + this._areMiscDirty = true; + this._arePrePassDirty = true; + this._areImageProcessingDirty = true; + this._normals = false; + this._uvs = false; + this._needNormals = false; + this._needUVs = false; + this._externalProperties = externalProperties; + if (externalProperties) { + for (const prop in externalProperties) { + if (Object.prototype.hasOwnProperty.call(externalProperties, prop)) { + this._setDefaultValue(prop); + } + } + } } /** - * Return the latest unstable version of this feature - * @param featureName the name of the feature to search - * @returns the version number. if not found will return -1 + * Specifies if the material needs to be re-calculated */ - static GetLatestVersionOfFeature(featureName) { - return this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].latest || -1; + get isDirty() { + return this._isDirty; } /** - * Return the latest stable version of this feature - * @param featureName the name of the feature to search - * @returns the version number. if not found will return -1 + * Marks the material to indicate that it has been re-calculated */ - static GetStableVersionOfFeature(featureName) { - return this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].stable || -1; + markAsProcessed() { + this._isDirty = false; + this._areAttributesDirty = false; + this._areTexturesDirty = false; + this._areFresnelDirty = false; + this._areLightsDirty = false; + this._areLightsDisposed = false; + this._areMiscDirty = false; + this._arePrePassDirty = false; + this._areImageProcessingDirty = false; } /** - * Attach a feature to the current session. Mainly used when session started to start the feature effect. - * Can be used during a session to start a feature - * @param featureName the name of feature to attach + * Marks the material to indicate that it needs to be re-calculated */ - attachFeature(featureName) { - const feature = this._features[featureName]; - if (feature && feature.enabled && !feature.featureImplementation.attached) { - const attached = feature.featureImplementation.attach(); - if (!attached) { - Tools.Warn(`Feature ${featureName} failed to attach`); - } - } + markAsUnprocessed() { + this._isDirty = true; } /** - * Can be used inside a session or when the session ends to detach a specific feature - * @param featureName the name of the feature to detach + * Marks the material to indicate all of its defines need to be re-calculated */ - detachFeature(featureName) { - const feature = this._features[featureName]; - if (feature && feature.featureImplementation.attached) { - const detached = feature.featureImplementation.detach(); - if (!detached) { - Tools.Warn(`Feature ${featureName} failed to detach`); - } - } + markAllAsDirty() { + this._areTexturesDirty = true; + this._areAttributesDirty = true; + this._areLightsDirty = true; + this._areFresnelDirty = true; + this._areMiscDirty = true; + this._arePrePassDirty = false; + this._areImageProcessingDirty = true; + this._isDirty = true; } /** - * Used to disable an already-enabled feature - * The feature will be disposed and will be recreated once enabled. - * @param featureName the feature to disable - * @returns true if disable was successful + * Marks the material to indicate that image processing needs to be re-calculated */ - // eslint-disable-next-line @typescript-eslint/naming-convention - disableFeature(featureName) { - const name69 = typeof featureName === "string" ? featureName : featureName.Name; - const feature = this._features[name69]; - if (feature && feature.enabled) { - feature.enabled = false; - this.detachFeature(name69); - feature.featureImplementation.dispose(); - delete this._features[name69]; - return true; - } - return false; + markAsImageProcessingDirty() { + this._areImageProcessingDirty = true; + this._isDirty = true; } /** - * dispose this features manager + * Marks the material to indicate the lights need to be re-calculated + * @param disposed Defines whether the light is dirty due to dispose or not */ - dispose() { - this.getEnabledFeatures().forEach((feature) => { - this.disableFeature(feature); - }); + markAsLightDirty(disposed = false) { + this._areLightsDirty = true; + this._areLightsDisposed = this._areLightsDisposed || disposed; + this._isDirty = true; } /** - * Enable a feature using its name and a version. This will enable it in the scene, and will be responsible to attach it when the session starts. - * If used twice, the old version will be disposed and a new one will be constructed. This way you can re-enable with different configuration. - * - * @param featureName the name of the feature to load or the class of the feature - * @param version optional version to load. if not provided the latest version will be enabled - * @param moduleOptions options provided to the module. Ses the module documentation / constructor - * @param attachIfPossible if set to true (default) the feature will be automatically attached, if it is currently possible - * @param required is this feature required to the app. If set to true the session init will fail if the feature is not available. - * @returns a new constructed feature or throws an error if feature not found or conflicts with another enabled feature. + * Marks the attribute state as changed */ - enableFeature(featureName, version = "latest", moduleOptions = {}, attachIfPossible = true, required = true) { - const name69 = typeof featureName === "string" ? featureName : featureName.Name; - let versionToLoad = 0; - if (typeof version === "string") { - if (!version) { - throw new Error(`Error in provided version - ${name69} (${version})`); - } - if (version === "stable") { - versionToLoad = _WebXRFeaturesManager.GetStableVersionOfFeature(name69); - } else if (version === "latest") { - versionToLoad = _WebXRFeaturesManager.GetLatestVersionOfFeature(name69); - } else { - versionToLoad = +version; - } - if (versionToLoad === -1 || isNaN(versionToLoad)) { - throw new Error(`feature not found - ${name69} (${version})`); - } - } else { - versionToLoad = version; - } - const conflictingFeature = _WebXRFeaturesManager._ConflictingFeatures[name69]; - if (conflictingFeature !== void 0 && this.getEnabledFeatures().indexOf(conflictingFeature) !== -1) { - throw new Error(`Feature ${name69} cannot be enabled while ${conflictingFeature} is enabled.`); - } - const feature = this._features[name69]; - const constructFunction = _WebXRFeaturesManager.ConstructFeature(name69, versionToLoad, this._xrSessionManager, moduleOptions); - if (!constructFunction) { - throw new Error(`feature not found - ${name69}`); - } - if (feature) { - this.disableFeature(name69); - } - const constructed = constructFunction(); - if (constructed.dependsOn) { - const dependentsFound = constructed.dependsOn.every((featureName2) => !!this._features[featureName2]); - if (!dependentsFound) { - throw new Error(`Dependant features missing. Make sure the following features are enabled - ${constructed.dependsOn.join(", ")}`); - } - } - if (constructed.isCompatible()) { - this._features[name69] = { - featureImplementation: constructed, - enabled: true, - version: versionToLoad, - required - }; - if (attachIfPossible) { - if (this._xrSessionManager.session && !this._features[name69].featureImplementation.attached) { - this.attachFeature(name69); - } - } else { - this._features[name69].featureImplementation.disableAutoAttach = true; - } - return this._features[name69].featureImplementation; - } else { - if (required) { - throw new Error("required feature not compatible"); - } else { - Tools.Warn(`Feature ${name69} not compatible with the current environment/browser and was not enabled.`); - return constructed; - } - } + markAsAttributesDirty() { + this._areAttributesDirty = true; + this._isDirty = true; } /** - * get the implementation of an enabled feature. - * @param featureName the name of the feature to load - * @returns the feature class, if found + * Marks the texture state as changed */ - getEnabledFeature(featureName) { - return this._features[featureName] && this._features[featureName].featureImplementation; + markAsTexturesDirty() { + this._areTexturesDirty = true; + this._isDirty = true; } /** - * Get the list of enabled features - * @returns an array of enabled features + * Marks the fresnel state as changed */ - getEnabledFeatures() { - return Object.keys(this._features); + markAsFresnelDirty() { + this._areFresnelDirty = true; + this._isDirty = true; } /** - * This function will extend the session creation configuration object with enabled features. - * If, for example, the anchors feature is enabled, it will be automatically added to the optional or required features list, - * according to the defined "required" variable, provided during enableFeature call - * @param xrSessionInit the xr Session init object to extend - * - * @returns an extended XRSessionInit object + * Marks the misc state as changed */ - async _extendXRSessionInitObject(xrSessionInit) { - const enabledFeatures = this.getEnabledFeatures(); - for (const featureName of enabledFeatures) { - const feature = this._features[featureName]; - const nativeName = feature.featureImplementation.xrNativeFeatureName; - if (nativeName) { - if (feature.required) { - xrSessionInit.requiredFeatures = xrSessionInit.requiredFeatures || []; - if (xrSessionInit.requiredFeatures.indexOf(nativeName) === -1) { - xrSessionInit.requiredFeatures.push(nativeName); - } - } else { - xrSessionInit.optionalFeatures = xrSessionInit.optionalFeatures || []; - if (xrSessionInit.optionalFeatures.indexOf(nativeName) === -1) { - xrSessionInit.optionalFeatures.push(nativeName); - } - } + markAsMiscDirty() { + this._areMiscDirty = true; + this._isDirty = true; + } + /** + * Marks the prepass state as changed + */ + markAsPrePassDirty() { + this._arePrePassDirty = true; + this._isDirty = true; + } + /** + * Rebuilds the material defines + */ + rebuild() { + this._keys.length = 0; + for (const key of Object.keys(this)) { + if (key[0] === "_") { + continue; } - if (feature.featureImplementation.getXRSessionInitExtension) { - const extended = await feature.featureImplementation.getXRSessionInitExtension(); - xrSessionInit = { - ...xrSessionInit, - ...extended - }; + this._keys.push(key); + } + if (this._externalProperties) { + for (const name69 in this._externalProperties) { + if (this._keys.indexOf(name69) === -1) { + this._keys.push(name69); + } } } - return xrSessionInit; } -}; -WebXRFeaturesManager._AvailableFeatures = {}; -WebXRFeaturesManager._ConflictingFeatures = { - [WebXRFeatureName.TELEPORTATION]: WebXRFeatureName.MOVEMENT, - [WebXRFeatureName.MOVEMENT]: WebXRFeatureName.TELEPORTATION -}; - -// node_modules/@babylonjs/core/XR/features/WebXRAbstractFeature.js -var WebXRAbstractFeature = class { /** - * The name of the native xr feature name (like anchor, hit-test, or hand-tracking) + * Specifies if two material defines are equal + * @param other - A material define instance to compare to + * @returns - Boolean indicating if the material defines are equal (true) or not (false) */ - get xrNativeFeatureName() { - return this._xrNativeFeatureName; - } - set xrNativeFeatureName(name69) { - var _a; - if (!this._xrSessionManager.isNative && name69 && this._xrSessionManager.inXRSession && ((_a = this._xrSessionManager.enabledFeatures) == null ? void 0 : _a.indexOf(name69)) === -1) { - Logger.Warn(`The feature ${name69} needs to be enabled before starting the XR session. Note - It is still possible it is not supported.`); + isEqual(other) { + if (this._keys.length !== other._keys.length) { + return false; } - this._xrNativeFeatureName = name69; + for (let index = 0; index < this._keys.length; index++) { + const prop = this._keys[index]; + if (this[prop] !== other[prop]) { + return false; + } + } + return true; } /** - * Construct a new (abstract) WebXR feature - * @param _xrSessionManager the xr session manager for this feature + * Clones this instance's defines to another instance + * @param other - material defines to clone values to */ - constructor(_xrSessionManager) { - this._xrSessionManager = _xrSessionManager; - this._attached = false; - this._removeOnDetach = []; - this.isDisposed = false; - this.disableAutoAttach = false; - this._xrNativeFeatureName = ""; - this.onFeatureAttachObservable = new Observable(); - this.onFeatureDetachObservable = new Observable(); + cloneTo(other) { + if (this._keys.length !== other._keys.length) { + other._keys = this._keys.slice(0); + } + for (let index = 0; index < this._keys.length; index++) { + const prop = this._keys[index]; + other[prop] = this[prop]; + } } /** - * Is this feature attached + * Resets the material define values */ - get attached() { - return this._attached; + reset() { + this._keys.forEach((prop) => this._setDefaultValue(prop)); + } + _setDefaultValue(prop) { + var _a, _b, _c, _d; + const type = ((_b = (_a = this._externalProperties) == null ? void 0 : _a[prop]) == null ? void 0 : _b.type) ?? typeof this[prop]; + const defValue = (_d = (_c = this._externalProperties) == null ? void 0 : _c[prop]) == null ? void 0 : _d.default; + switch (type) { + case "number": + this[prop] = defValue ?? 0; + break; + case "string": + this[prop] = defValue ?? ""; + break; + default: + this[prop] = defValue ?? false; + break; + } } /** - * attach this feature - * - * @param force should attachment be forced (even when already attached) - * @returns true if successful, false is failed or already attached + * Converts the material define values to a string + * @returns - String of material define information */ - attach(force) { - if (this.isDisposed) { - return false; - } - if (!force) { - if (this.attached) { - return false; - } - } else { - if (this.attached) { - this.detach(); + toString() { + let result = ""; + for (let index = 0; index < this._keys.length; index++) { + const prop = this._keys[index]; + const value = this[prop]; + const type = typeof value; + switch (type) { + case "number": + case "string": + result += "#define " + prop + " " + value + "\n"; + break; + default: + if (value) { + result += "#define " + prop + "\n"; + } + break; } } - if (!this._xrSessionManager.enabledFeatures) { - Logger.Warn("session.enabledFeatures is not available on this device. It is possible that this feature is not supported."); - } else if (!this._xrSessionManager.isNative && this.xrNativeFeatureName && this._xrSessionManager.enabledFeatures.indexOf(this.xrNativeFeatureName) === -1) { + return result; + } +}; + +// node_modules/@babylonjs/core/Materials/pushMaterial.js +var PushMaterial = class extends Material { + constructor(name69, scene, storeEffectOnSubMeshes = true) { + super(name69, scene); + this._normalMatrix = new Matrix(); + this._storeEffectOnSubMeshes = storeEffectOnSubMeshes; + } + getEffect() { + return this._storeEffectOnSubMeshes ? this._activeEffect : super.getEffect(); + } + isReady(mesh, useInstances) { + if (!mesh) { return false; } - this._attached = true; - this._addNewAttachObserver(this._xrSessionManager.onXRFrameObservable, (frame) => this._onXRFrame(frame)); - this.onFeatureAttachObservable.notifyObservers(this); - return true; + if (!this._storeEffectOnSubMeshes) { + return true; + } + if (!mesh.subMeshes || mesh.subMeshes.length === 0) { + return true; + } + return this.isReadyForSubMesh(mesh, mesh.subMeshes[0], useInstances); } - /** - * detach this feature. - * - * @returns true if successful, false if failed or already detached - */ - detach() { - if (!this._attached) { - this.disableAutoAttach = true; - return false; + _isReadyForSubMesh(subMesh) { + const defines = subMesh.materialDefines; + if (!this.checkReadyOnEveryCall && subMesh.effect && defines) { + if (defines._renderId === this.getScene().getRenderId()) { + return true; + } } - this._attached = false; - this._removeOnDetach.forEach((toRemove) => { - toRemove.observable.remove(toRemove.observer); - }); - this.onFeatureDetachObservable.notifyObservers(this); - return true; + return false; } /** - * Dispose this feature and all of the resources attached + * Binds the given world matrix to the active effect + * + * @param world the matrix to bind */ - dispose() { - this.detach(); - this.isDisposed = true; - this.onFeatureAttachObservable.clear(); - this.onFeatureDetachObservable.clear(); + bindOnlyWorldMatrix(world) { + this._activeEffect.setMatrix("world", world); } /** - * This function will be executed during before enabling the feature and can be used to not-allow enabling it. - * Note that at this point the session has NOT started, so this is purely checking if the browser supports it + * Binds the given normal matrix to the active effect * - * @returns whether or not the feature is compatible in this environment + * @param normalMatrix the matrix to bind */ - isCompatible() { - return true; + bindOnlyNormalMatrix(normalMatrix) { + this._activeEffect.setMatrix("normalMatrix", normalMatrix); } - /** - * This is used to register callbacks that will automatically be removed when detach is called. - * @param observable the observable to which the observer will be attached - * @param callback the callback to register - * @param insertFirst should the callback be executed as soon as it is registered - */ - _addNewAttachObserver(observable, callback, insertFirst) { - this._removeOnDetach.push({ - observable, - observer: observable.add(callback, void 0, insertFirst) - }); + bind(world, mesh) { + if (!mesh) { + return; + } + this.bindForSubMesh(world, mesh, mesh.subMeshes[0]); + } + _afterBind(mesh, effect = null, subMesh) { + super._afterBind(mesh, effect, subMesh); + this.getScene()._cachedEffect = effect; + if (subMesh) { + subMesh._drawWrapper._forceRebindOnNextCall = false; + } else { + this._drawWrapper._forceRebindOnNextCall = false; + } + } + _mustRebind(scene, effect, subMesh, visibility = 1) { + return subMesh._drawWrapper._forceRebindOnNextCall || scene.isCachedMaterialInvalid(this, effect, visibility); + } + dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh) { + this._activeEffect = void 0; + super.dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh); } }; -// node_modules/@babylonjs/core/Physics/v1/physicsJoint.js -var PhysicsJoint = class { +// node_modules/@babylonjs/core/Materials/materialFlags.js +var MaterialFlags = class { /** - * Initializes the physics joint - * @param type The type of the physics joint - * @param jointData The data for the physics joint + * Are diffuse textures enabled in the application. */ - constructor(type, jointData) { - this.type = type; - this.jointData = jointData; - jointData.nativeParams = jointData.nativeParams || {}; + static get DiffuseTextureEnabled() { + return this._DiffuseTextureEnabled; + } + static set DiffuseTextureEnabled(value) { + if (this._DiffuseTextureEnabled === value) { + return; + } + this._DiffuseTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Gets the physics joint + * Are detail textures enabled in the application. */ - get physicsJoint() { - return this._physicsJoint; + static get DetailTextureEnabled() { + return this._DetailTextureEnabled; + } + static set DetailTextureEnabled(value) { + if (this._DetailTextureEnabled === value) { + return; + } + this._DetailTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Sets the physics joint + * Are decal maps enabled in the application. */ - set physicsJoint(newJoint) { - if (this._physicsJoint) { + static get DecalMapEnabled() { + return this._DecalMapEnabled; + } + static set DecalMapEnabled(value) { + if (this._DecalMapEnabled === value) { + return; } - this._physicsJoint = newJoint; + this._DecalMapEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Sets the physics plugin + * Are ambient textures enabled in the application. */ - set physicsPlugin(physicsPlugin) { - this._physicsPlugin = physicsPlugin; + static get AmbientTextureEnabled() { + return this._AmbientTextureEnabled; + } + static set AmbientTextureEnabled(value) { + if (this._AmbientTextureEnabled === value) { + return; + } + this._AmbientTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Execute a function that is physics-plugin specific. - * @param {Function} func the function that will be executed. - * It accepts two parameters: the physics world and the physics joint + * Are opacity textures enabled in the application. */ - executeNativeFunction(func) { - func(this._physicsPlugin.world, this._physicsJoint); + static get OpacityTextureEnabled() { + return this._OpacityTextureEnabled; } -}; -PhysicsJoint.DistanceJoint = 0; -PhysicsJoint.HingeJoint = 1; -PhysicsJoint.BallAndSocketJoint = 2; -PhysicsJoint.WheelJoint = 3; -PhysicsJoint.SliderJoint = 4; -PhysicsJoint.PrismaticJoint = 5; -PhysicsJoint.UniversalJoint = 6; -PhysicsJoint.Hinge2Joint = PhysicsJoint.WheelJoint; -PhysicsJoint.PointToPointJoint = 8; -PhysicsJoint.SpringJoint = 9; -PhysicsJoint.LockJoint = 10; -var DistanceJoint = class extends PhysicsJoint { - /** - * - * @param jointData The data for the Distance-Joint - */ - constructor(jointData) { - super(PhysicsJoint.DistanceJoint, jointData); + static set OpacityTextureEnabled(value) { + if (this._OpacityTextureEnabled === value) { + return; + } + this._OpacityTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Update the predefined distance. - * @param maxDistance The maximum preferred distance - * @param minDistance The minimum preferred distance + * Are reflection textures enabled in the application. */ - updateDistance(maxDistance, minDistance) { - this._physicsPlugin.updateDistanceJoint(this, maxDistance, minDistance); + static get ReflectionTextureEnabled() { + return this._ReflectionTextureEnabled; } -}; -var MotorEnabledJoint = class extends PhysicsJoint { - /** - * Initializes the Motor-Enabled Joint - * @param type The type of the joint - * @param jointData The physical joint data for the joint - */ - constructor(type, jointData) { - super(type, jointData); + static set ReflectionTextureEnabled(value) { + if (this._ReflectionTextureEnabled === value) { + return; + } + this._ReflectionTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Set the motor values. - * Attention, this function is plugin specific. Engines won't react 100% the same. - * @param force the force to apply - * @param maxForce max force for this motor. + * Are emissive textures enabled in the application. */ - setMotor(force, maxForce) { - this._physicsPlugin.setMotor(this, force || 0, maxForce); + static get EmissiveTextureEnabled() { + return this._EmissiveTextureEnabled; } - /** - * Set the motor's limits. - * Attention, this function is plugin specific. Engines won't react 100% the same. - * @param upperLimit The upper limit of the motor - * @param lowerLimit The lower limit of the motor - */ - setLimit(upperLimit, lowerLimit) { - this._physicsPlugin.setLimit(this, upperLimit, lowerLimit); + static set EmissiveTextureEnabled(value) { + if (this._EmissiveTextureEnabled === value) { + return; + } + this._EmissiveTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } -}; -var HingeJoint = class extends MotorEnabledJoint { /** - * Initializes the Hinge-Joint - * @param jointData The joint data for the Hinge-Joint + * Are specular textures enabled in the application. */ - constructor(jointData) { - super(PhysicsJoint.HingeJoint, jointData); + static get SpecularTextureEnabled() { + return this._SpecularTextureEnabled; + } + static set SpecularTextureEnabled(value) { + if (this._SpecularTextureEnabled === value) { + return; + } + this._SpecularTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Set the motor values. - * Attention, this function is plugin specific. Engines won't react 100% the same. - * @param {number} force the force to apply - * @param {number} maxForce max force for this motor. + * Are bump textures enabled in the application. */ - setMotor(force, maxForce) { - this._physicsPlugin.setMotor(this, force || 0, maxForce); + static get BumpTextureEnabled() { + return this._BumpTextureEnabled; + } + static set BumpTextureEnabled(value) { + if (this._BumpTextureEnabled === value) { + return; + } + this._BumpTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Set the motor's limits. - * Attention, this function is plugin specific. Engines won't react 100% the same. - * @param upperLimit The upper limit of the motor - * @param lowerLimit The lower limit of the motor + * Are lightmap textures enabled in the application. */ - setLimit(upperLimit, lowerLimit) { - this._physicsPlugin.setLimit(this, upperLimit, lowerLimit); + static get LightmapTextureEnabled() { + return this._LightmapTextureEnabled; + } + static set LightmapTextureEnabled(value) { + if (this._LightmapTextureEnabled === value) { + return; + } + this._LightmapTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } -}; -var Hinge2Joint = class extends MotorEnabledJoint { /** - * Initializes the Hinge2-Joint - * @param jointData The joint data for the Hinge2-Joint + * Are refraction textures enabled in the application. */ - constructor(jointData) { - super(PhysicsJoint.Hinge2Joint, jointData); + static get RefractionTextureEnabled() { + return this._RefractionTextureEnabled; + } + static set RefractionTextureEnabled(value) { + if (this._RefractionTextureEnabled === value) { + return; + } + this._RefractionTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Set the motor values. - * Attention, this function is plugin specific. Engines won't react 100% the same. - * @param targetSpeed the speed the motor is to reach - * @param maxForce max force for this motor. - * @param motorIndex motor's index, 0 or 1. + * Are color grading textures enabled in the application. */ - setMotor(targetSpeed, maxForce, motorIndex = 0) { - this._physicsPlugin.setMotor(this, targetSpeed || 0, maxForce, motorIndex); + static get ColorGradingTextureEnabled() { + return this._ColorGradingTextureEnabled; + } + static set ColorGradingTextureEnabled(value) { + if (this._ColorGradingTextureEnabled === value) { + return; + } + this._ColorGradingTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Set the motor limits. - * Attention, this function is plugin specific. Engines won't react 100% the same. - * @param upperLimit the upper limit - * @param lowerLimit lower limit - * @param motorIndex the motor's index, 0 or 1. + * Are fresnels enabled in the application. */ - setLimit(upperLimit, lowerLimit, motorIndex = 0) { - this._physicsPlugin.setLimit(this, upperLimit, lowerLimit, motorIndex); + static get FresnelEnabled() { + return this._FresnelEnabled; + } + static set FresnelEnabled(value) { + if (this._FresnelEnabled === value) { + return; + } + this._FresnelEnabled = value; + Engine.MarkAllMaterialsAsDirty(4); } -}; - -// node_modules/@babylonjs/core/Physics/v1/physicsImpostor.js -Mesh._PhysicsImpostorParser = function(scene, physicObject, jsonObject) { - return new PhysicsImpostor(physicObject, jsonObject.physicsImpostor, { - mass: jsonObject.physicsMass, - friction: jsonObject.physicsFriction, - restitution: jsonObject.physicsRestitution - }, scene); -}; -var PhysicsImpostor = class _PhysicsImpostor { /** - * Specifies if the physics imposter is disposed + * Are clear coat textures enabled in the application. */ - get isDisposed() { - return this._isDisposed; + static get ClearCoatTextureEnabled() { + return this._ClearCoatTextureEnabled; + } + static set ClearCoatTextureEnabled(value) { + if (this._ClearCoatTextureEnabled === value) { + return; + } + this._ClearCoatTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Gets the mass of the physics imposter + * Are clear coat bump textures enabled in the application. */ - get mass() { - return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyMass(this) : 0; + static get ClearCoatBumpTextureEnabled() { + return this._ClearCoatBumpTextureEnabled; } - set mass(value) { - this.setMass(value); + static set ClearCoatBumpTextureEnabled(value) { + if (this._ClearCoatBumpTextureEnabled === value) { + return; + } + this._ClearCoatBumpTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Gets the coefficient of friction + * Are clear coat tint textures enabled in the application. */ - get friction() { - return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyFriction(this) : 0; + static get ClearCoatTintTextureEnabled() { + return this._ClearCoatTintTextureEnabled; + } + static set ClearCoatTintTextureEnabled(value) { + if (this._ClearCoatTintTextureEnabled === value) { + return; + } + this._ClearCoatTintTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Sets the coefficient of friction + * Are sheen textures enabled in the application. */ - set friction(value) { - if (!this._physicsEngine) { + static get SheenTextureEnabled() { + return this._SheenTextureEnabled; + } + static set SheenTextureEnabled(value) { + if (this._SheenTextureEnabled === value) { return; } - this._physicsEngine.getPhysicsPlugin().setBodyFriction(this, value); + this._SheenTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Gets the coefficient of restitution + * Are anisotropic textures enabled in the application. */ - get restitution() { - return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyRestitution(this) : 0; + static get AnisotropicTextureEnabled() { + return this._AnisotropicTextureEnabled; + } + static set AnisotropicTextureEnabled(value) { + if (this._AnisotropicTextureEnabled === value) { + return; + } + this._AnisotropicTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Sets the coefficient of restitution + * Are thickness textures enabled in the application. */ - set restitution(value) { - if (!this._physicsEngine) { + static get ThicknessTextureEnabled() { + return this._ThicknessTextureEnabled; + } + static set ThicknessTextureEnabled(value) { + if (this._ThicknessTextureEnabled === value) { return; } - this._physicsEngine.getPhysicsPlugin().setBodyRestitution(this, value); + this._ThicknessTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Gets the pressure of a soft body; only supported by the AmmoJSPlugin + * Are refraction intensity textures enabled in the application. */ - get pressure() { - if (!this._physicsEngine) { - return 0; - } - const plugin = this._physicsEngine.getPhysicsPlugin(); - if (!plugin.setBodyPressure) { - return 0; + static get RefractionIntensityTextureEnabled() { + return this._ThicknessTextureEnabled; + } + static set RefractionIntensityTextureEnabled(value) { + if (this._RefractionIntensityTextureEnabled === value) { + return; } - return plugin.getBodyPressure(this); + this._RefractionIntensityTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); } /** - * Sets the pressure of a soft body; only supported by the AmmoJSPlugin + * Are translucency intensity textures enabled in the application. */ - set pressure(value) { - if (!this._physicsEngine) { + static get TranslucencyIntensityTextureEnabled() { + return this._ThicknessTextureEnabled; + } + static set TranslucencyIntensityTextureEnabled(value) { + if (this._TranslucencyIntensityTextureEnabled === value) { return; } - const plugin = this._physicsEngine.getPhysicsPlugin(); - if (!plugin.setBodyPressure) { + this._TranslucencyIntensityTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); + } + /** + * Are translucency intensity textures enabled in the application. + */ + static get IridescenceTextureEnabled() { + return this._IridescenceTextureEnabled; + } + static set IridescenceTextureEnabled(value) { + if (this._IridescenceTextureEnabled === value) { return; } - plugin.setBodyPressure(this, value); + this._IridescenceTextureEnabled = value; + Engine.MarkAllMaterialsAsDirty(1); + } +}; +MaterialFlags._DiffuseTextureEnabled = true; +MaterialFlags._DetailTextureEnabled = true; +MaterialFlags._DecalMapEnabled = true; +MaterialFlags._AmbientTextureEnabled = true; +MaterialFlags._OpacityTextureEnabled = true; +MaterialFlags._ReflectionTextureEnabled = true; +MaterialFlags._EmissiveTextureEnabled = true; +MaterialFlags._SpecularTextureEnabled = true; +MaterialFlags._BumpTextureEnabled = true; +MaterialFlags._LightmapTextureEnabled = true; +MaterialFlags._RefractionTextureEnabled = true; +MaterialFlags._ColorGradingTextureEnabled = true; +MaterialFlags._FresnelEnabled = true; +MaterialFlags._ClearCoatTextureEnabled = true; +MaterialFlags._ClearCoatBumpTextureEnabled = true; +MaterialFlags._ClearCoatTintTextureEnabled = true; +MaterialFlags._SheenTextureEnabled = true; +MaterialFlags._AnisotropicTextureEnabled = true; +MaterialFlags._ThicknessTextureEnabled = true; +MaterialFlags._RefractionIntensityTextureEnabled = true; +MaterialFlags._TranslucencyIntensityTextureEnabled = true; +MaterialFlags._IridescenceTextureEnabled = true; + +// node_modules/@babylonjs/core/Materials/effectFallbacks.js +var EffectFallbacks = class { + constructor() { + this._defines = {}; + this._currentRank = 32; + this._maxRank = -1; + this._mesh = null; } /** - * Gets the stiffness of a soft body; only supported by the AmmoJSPlugin + * Removes the fallback from the bound mesh. */ - get stiffness() { - if (!this._physicsEngine) { - return 0; - } - const plugin = this._physicsEngine.getPhysicsPlugin(); - if (!plugin.getBodyStiffness) { - return 0; - } - return plugin.getBodyStiffness(this); + unBindMesh() { + this._mesh = null; } /** - * Sets the stiffness of a soft body; only supported by the AmmoJSPlugin + * Adds a fallback on the specified property. + * @param rank The rank of the fallback (Lower ranks will be fallbacked to first) + * @param define The name of the define in the shader */ - set stiffness(value) { - if (!this._physicsEngine) { - return; - } - const plugin = this._physicsEngine.getPhysicsPlugin(); - if (!plugin.setBodyStiffness) { - return; + addFallback(rank, define) { + if (!this._defines[rank]) { + if (rank < this._currentRank) { + this._currentRank = rank; + } + if (rank > this._maxRank) { + this._maxRank = rank; + } + this._defines[rank] = new Array(); } - plugin.setBodyStiffness(this, value); + this._defines[rank].push(define); } /** - * Gets the velocityIterations of a soft body; only supported by the AmmoJSPlugin + * Sets the mesh to use CPU skinning when needing to fallback. + * @param rank The rank of the fallback (Lower ranks will be fallbacked to first) + * @param mesh The mesh to use the fallbacks. */ - get velocityIterations() { - if (!this._physicsEngine) { - return 0; + addCPUSkinningFallback(rank, mesh) { + this._mesh = mesh; + if (rank < this._currentRank) { + this._currentRank = rank; } - const plugin = this._physicsEngine.getPhysicsPlugin(); - if (!plugin.getBodyVelocityIterations) { - return 0; + if (rank > this._maxRank) { + this._maxRank = rank; } - return plugin.getBodyVelocityIterations(this); } /** - * Sets the velocityIterations of a soft body; only supported by the AmmoJSPlugin + * Checks to see if more fallbacks are still available. */ - set velocityIterations(value) { - if (!this._physicsEngine) { - return; - } - const plugin = this._physicsEngine.getPhysicsPlugin(); - if (!plugin.setBodyVelocityIterations) { - return; - } - plugin.setBodyVelocityIterations(this, value); + get hasMoreFallbacks() { + return this._currentRank <= this._maxRank; } /** - * Gets the positionIterations of a soft body; only supported by the AmmoJSPlugin + * Removes the defines that should be removed when falling back. + * @param currentDefines defines the current define statements for the shader. + * @param effect defines the current effect we try to compile + * @returns The resulting defines with defines of the current rank removed. */ - get positionIterations() { - if (!this._physicsEngine) { - return 0; - } - const plugin = this._physicsEngine.getPhysicsPlugin(); - if (!plugin.getBodyPositionIterations) { - return 0; + reduce(currentDefines, effect) { + if (this._mesh && this._mesh.computeBonesUsingShaders && this._mesh.numBoneInfluencers > 0) { + this._mesh.computeBonesUsingShaders = false; + currentDefines = currentDefines.replace("#define NUM_BONE_INFLUENCERS " + this._mesh.numBoneInfluencers, "#define NUM_BONE_INFLUENCERS 0"); + effect._bonesComputationForcedToCPU = true; + const scene = this._mesh.getScene(); + for (let index = 0; index < scene.meshes.length; index++) { + const otherMesh = scene.meshes[index]; + if (!otherMesh.material) { + if (!this._mesh.material && otherMesh.computeBonesUsingShaders && otherMesh.numBoneInfluencers > 0) { + otherMesh.computeBonesUsingShaders = false; + } + continue; + } + if (!otherMesh.computeBonesUsingShaders || otherMesh.numBoneInfluencers === 0) { + continue; + } + if (otherMesh.material.getEffect() === effect) { + otherMesh.computeBonesUsingShaders = false; + } else if (otherMesh.subMeshes) { + for (const subMesh of otherMesh.subMeshes) { + const subMeshEffect = subMesh.effect; + if (subMeshEffect === effect) { + otherMesh.computeBonesUsingShaders = false; + break; + } + } + } + } + } else { + const currentFallbacks = this._defines[this._currentRank]; + if (currentFallbacks) { + for (let index = 0; index < currentFallbacks.length; index++) { + currentDefines = currentDefines.replace("#define " + currentFallbacks[index], ""); + } + } + this._currentRank++; } - return plugin.getBodyPositionIterations(this); + return currentDefines; + } +}; + +// node_modules/@babylonjs/core/Materials/materialPluginManager.js +var rxOption = new RegExp("^([gimus]+)!"); +var MaterialPluginManager = class _MaterialPluginManager { + /** + * Creates a new instance of the plugin manager + * @param material material that this manager will manage the plugins for + */ + constructor(material) { + this._plugins = []; + this._activePlugins = []; + this._activePluginsForExtraEvents = []; + this._material = material; + this._scene = material.getScene(); + this._engine = this._scene.getEngine(); } /** - * Sets the positionIterations of a soft body; only supported by the AmmoJSPlugin + * @internal */ - set positionIterations(value) { - if (!this._physicsEngine) { - return; + _addPlugin(plugin) { + for (let i = 0; i < this._plugins.length; ++i) { + if (this._plugins[i].name === plugin.name) { + return false; + } } - const plugin = this._physicsEngine.getPhysicsPlugin(); - if (!plugin.setBodyPositionIterations) { - return; + if (this._material._uniformBufferLayoutBuilt) { + throw `The plugin "${plugin.name}" can't be added to the material "${this._material.name}" because this material has already been used for rendering! Please add plugins to materials before any rendering with this material occurs.`; } - plugin.setBodyPositionIterations(this, value); + const pluginClassName = plugin.getClassName(); + if (!_MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName]) { + _MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName] = "MATERIALPLUGIN_" + ++_MaterialPluginManager._MaterialPluginCounter; + } + this._material._callbackPluginEventGeneric = (id, info) => this._handlePluginEvent(id, info); + this._plugins.push(plugin); + this._plugins.sort((a, b) => a.priority - b.priority); + this._codeInjectionPoints = {}; + const defineNamesFromPlugins = {}; + defineNamesFromPlugins[_MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName]] = { + type: "boolean", + default: true + }; + for (const plugin2 of this._plugins) { + plugin2.collectDefines(defineNamesFromPlugins); + this._collectPointNames("vertex", plugin2.getCustomCode("vertex")); + this._collectPointNames("fragment", plugin2.getCustomCode("fragment")); + } + this._defineNamesFromPlugins = defineNamesFromPlugins; + return true; } /** - * Initializes the physics imposter - * @param object The physics-enabled object used as the physics imposter - * @param type The type of the physics imposter. Types are available as static members of this class. - * @param _options The options for the physics imposter - * @param _scene The Babylon scene + * @internal */ - constructor(object, type, _options = { mass: 0 }, _scene) { - this.object = object; - this.type = type; - this._options = _options; - this._scene = _scene; - this._pluginData = {}; - this._bodyUpdateRequired = false; - this._onBeforePhysicsStepCallbacks = new Array(); - this._onAfterPhysicsStepCallbacks = new Array(); - this._onPhysicsCollideCallbacks = []; - this._deltaPosition = Vector3.Zero(); - this._isDisposed = false; - this.soft = false; - this.segments = 0; - this._tmpQuat = new Quaternion(); - this._tmpQuat2 = new Quaternion(); - this.beforeStep = () => { - if (!this._physicsEngine) { - return; + _activatePlugin(plugin) { + if (this._activePlugins.indexOf(plugin) === -1) { + this._activePlugins.push(plugin); + this._activePlugins.sort((a, b) => a.priority - b.priority); + this._material._callbackPluginEventIsReadyForSubMesh = this._handlePluginEventIsReadyForSubMesh.bind(this); + this._material._callbackPluginEventPrepareDefinesBeforeAttributes = this._handlePluginEventPrepareDefinesBeforeAttributes.bind(this); + this._material._callbackPluginEventPrepareDefines = this._handlePluginEventPrepareDefines.bind(this); + this._material._callbackPluginEventBindForSubMesh = this._handlePluginEventBindForSubMesh.bind(this); + if (plugin.registerForExtraEvents) { + this._activePluginsForExtraEvents.push(plugin); + this._activePluginsForExtraEvents.sort((a, b) => a.priority - b.priority); + this._material._callbackPluginEventHasRenderTargetTextures = this._handlePluginEventHasRenderTargetTextures.bind(this); + this._material._callbackPluginEventFillRenderTargetTextures = this._handlePluginEventFillRenderTargetTextures.bind(this); + this._material._callbackPluginEventHardBindForSubMesh = this._handlePluginEventHardBindForSubMesh.bind(this); } - this.object.translate(this._deltaPosition, -1); - this._deltaRotationConjugated && this.object.rotationQuaternion && this.object.rotationQuaternion.multiplyToRef(this._deltaRotationConjugated, this.object.rotationQuaternion); - this.object.computeWorldMatrix(false); - if (this.object.parent && this.object.rotationQuaternion) { - this.getParentsRotation(); - this._tmpQuat.multiplyToRef(this.object.rotationQuaternion, this._tmpQuat); - } else { - this._tmpQuat.copyFrom(this.object.rotationQuaternion || new Quaternion()); + } + } + /** + * Gets a plugin from the list of plugins managed by this manager + * @param name name of the plugin + * @returns the plugin if found, else null + */ + getPlugin(name69) { + for (let i = 0; i < this._plugins.length; ++i) { + if (this._plugins[i].name === name69) { + return this._plugins[i]; } - if (!this._options.disableBidirectionalTransformation) { - this.object.rotationQuaternion && this._physicsEngine.getPhysicsPlugin().setPhysicsBodyTransformation( - this, - /*bInfo.boundingBox.centerWorld*/ - this.object.getAbsolutePosition(), - this._tmpQuat - ); + } + return null; + } + _handlePluginEventIsReadyForSubMesh(eventData) { + let isReady = true; + for (const plugin of this._activePlugins) { + isReady = isReady && plugin.isReadyForSubMesh(eventData.defines, this._scene, this._engine, eventData.subMesh); + } + eventData.isReadyForSubMesh = isReady; + } + _handlePluginEventPrepareDefinesBeforeAttributes(eventData) { + for (const plugin of this._activePlugins) { + plugin.prepareDefinesBeforeAttributes(eventData.defines, this._scene, eventData.mesh); + } + } + _handlePluginEventPrepareDefines(eventData) { + for (const plugin of this._activePlugins) { + plugin.prepareDefines(eventData.defines, this._scene, eventData.mesh); + } + } + _handlePluginEventHardBindForSubMesh(eventData) { + for (const plugin of this._activePluginsForExtraEvents) { + plugin.hardBindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, eventData.subMesh); + } + } + _handlePluginEventBindForSubMesh(eventData) { + for (const plugin of this._activePlugins) { + plugin.bindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, eventData.subMesh); + } + } + _handlePluginEventHasRenderTargetTextures(eventData) { + let hasRenderTargetTextures = false; + for (const plugin of this._activePluginsForExtraEvents) { + hasRenderTargetTextures = plugin.hasRenderTargetTextures(); + if (hasRenderTargetTextures) { + break; } - this._onBeforePhysicsStepCallbacks.forEach((func) => { - func(this); - }); - }; - this.afterStep = () => { - if (!this._physicsEngine) { - return; + } + eventData.hasRenderTargetTextures = hasRenderTargetTextures; + } + _handlePluginEventFillRenderTargetTextures(eventData) { + for (const plugin of this._activePluginsForExtraEvents) { + plugin.fillRenderTargetTextures(eventData.renderTargets); + } + } + _handlePluginEvent(id, info) { + switch (id) { + case MaterialPluginEvent.GetActiveTextures: { + const eventData = info; + for (const plugin of this._activePlugins) { + plugin.getActiveTextures(eventData.activeTextures); + } + break; } - this._onAfterPhysicsStepCallbacks.forEach((func) => { - func(this); - }); - this._physicsEngine.getPhysicsPlugin().setTransformationFromPhysicsBody(this); - if (this.object.parent && this.object.rotationQuaternion) { - this.getParentsRotation(); - this._tmpQuat.conjugateInPlace(); - this._tmpQuat.multiplyToRef(this.object.rotationQuaternion, this.object.rotationQuaternion); + case MaterialPluginEvent.GetAnimatables: { + const eventData = info; + for (const plugin of this._activePlugins) { + plugin.getAnimatables(eventData.animatables); + } + break; } - this.object.setAbsolutePosition(this.object.position); - if (this._deltaRotation) { - this.object.rotationQuaternion && this.object.rotationQuaternion.multiplyToRef(this._deltaRotation, this.object.rotationQuaternion); - this._deltaPosition.applyRotationQuaternionToRef(this._deltaRotation, _PhysicsImpostor._TmpVecs[0]); - this.object.translate(_PhysicsImpostor._TmpVecs[0], 1); - } else { - this.object.translate(this._deltaPosition, 1); + case MaterialPluginEvent.HasTexture: { + const eventData = info; + let hasTexture = false; + for (const plugin of this._activePlugins) { + hasTexture = plugin.hasTexture(eventData.texture); + if (hasTexture) { + break; + } + } + eventData.hasTexture = hasTexture; + break; } - this.object.computeWorldMatrix(true); - }; - this.onCollideEvent = null; - this.onCollide = (e) => { - if (!this._onPhysicsCollideCallbacks.length && !this.onCollideEvent) { - return; + case MaterialPluginEvent.Disposed: { + const eventData = info; + for (const plugin of this._plugins) { + plugin.dispose(eventData.forceDisposeTextures); + } + break; } - if (!this._physicsEngine) { - return; + case MaterialPluginEvent.GetDefineNames: { + const eventData = info; + eventData.defineNames = this._defineNamesFromPlugins; + break; } - const otherImpostor = this._physicsEngine.getImpostorWithPhysicsBody(e.body); - if (otherImpostor) { - if (this.onCollideEvent) { - this.onCollideEvent(this, otherImpostor); + case MaterialPluginEvent.PrepareEffect: { + const eventData = info; + for (const plugin of this._activePlugins) { + eventData.fallbackRank = plugin.addFallbacks(eventData.defines, eventData.fallbacks, eventData.fallbackRank); + plugin.getAttributes(eventData.attributes, this._scene, eventData.mesh); } - this._onPhysicsCollideCallbacks.filter((obj) => { - return obj.otherImpostors.indexOf(otherImpostor) !== -1; - }).forEach((obj) => { - obj.callback(this, otherImpostor, e.point, e.distance, e.impulse, e.normal); - }); + if (this._uniformList.length > 0) { + eventData.uniforms.push(...this._uniformList); + } + if (this._samplerList.length > 0) { + eventData.samplers.push(...this._samplerList); + } + if (this._uboList.length > 0) { + eventData.uniformBuffersNames.push(...this._uboList); + } + eventData.customCode = this._injectCustomCode(eventData, eventData.customCode); + break; + } + case MaterialPluginEvent.PrepareUniformBuffer: { + const eventData = info; + this._uboDeclaration = ""; + this._vertexDeclaration = ""; + this._fragmentDeclaration = ""; + this._uniformList = []; + this._samplerList = []; + this._uboList = []; + for (const plugin of this._plugins) { + const uniforms = plugin.getUniforms(); + if (uniforms) { + if (uniforms.ubo) { + for (const uniform of uniforms.ubo) { + if (uniform.size && uniform.type) { + const arraySize = uniform.arraySize ?? 0; + eventData.ubo.addUniform(uniform.name, uniform.size, arraySize); + this._uboDeclaration += `${uniform.type} ${uniform.name}${arraySize > 0 ? `[${arraySize}]` : ""}; +`; + } + this._uniformList.push(uniform.name); + } + } + if (uniforms.vertex) { + this._vertexDeclaration += uniforms.vertex + "\n"; + } + if (uniforms.fragment) { + this._fragmentDeclaration += uniforms.fragment + "\n"; + } + } + plugin.getSamplers(this._samplerList); + plugin.getUniformBuffersNames(this._uboList); + } + break; } - }; - if (!this.object) { - Logger.Error("No object was provided. A physics object is obligatory"); - return; - } - if (this.object.parent && _options.mass !== 0) { - Logger.Warn("A physics impostor has been created for an object which has a parent. Babylon physics currently works in local space so unexpected issues may occur."); - } - if (!this._scene && object.getScene) { - this._scene = object.getScene(); } - if (!this._scene) { + } + _collectPointNames(shaderType, customCode) { + if (!customCode) { return; } - if (this.type > 100) { - this.soft = true; + for (const pointName in customCode) { + if (!this._codeInjectionPoints[shaderType]) { + this._codeInjectionPoints[shaderType] = {}; + } + this._codeInjectionPoints[shaderType][pointName] = true; } - this._physicsEngine = this._scene.getPhysicsEngine(); - if (!this._physicsEngine) { - Logger.Error("Physics not enabled. Please use scene.enablePhysics(...) before creating impostors."); - } else { - if (!this.object.rotationQuaternion) { - if (this.object.rotation) { - this.object.rotationQuaternion = Quaternion.RotationYawPitchRoll(this.object.rotation.y, this.object.rotation.x, this.object.rotation.z); - } else { - this.object.rotationQuaternion = new Quaternion(); + } + _injectCustomCode(eventData, existingCallback) { + return (shaderType, code) => { + var _a, _b; + if (existingCallback) { + code = existingCallback(shaderType, code); + } + if (this._uboDeclaration) { + code = code.replace("#define ADDITIONAL_UBO_DECLARATION", this._uboDeclaration); + } + if (this._vertexDeclaration) { + code = code.replace("#define ADDITIONAL_VERTEX_DECLARATION", this._vertexDeclaration); + } + if (this._fragmentDeclaration) { + code = code.replace("#define ADDITIONAL_FRAGMENT_DECLARATION", this._fragmentDeclaration); + } + const points = (_a = this._codeInjectionPoints) == null ? void 0 : _a[shaderType]; + if (!points) { + return code; + } + let processorOptions = null; + for (let pointName in points) { + let injectedCode = ""; + for (const plugin of this._activePlugins) { + let customCode = (_b = plugin.getCustomCode(shaderType)) == null ? void 0 : _b[pointName]; + if (!customCode) { + continue; + } + if (plugin.resolveIncludes) { + if (processorOptions === null) { + const shaderLanguage = ShaderLanguage.GLSL; + processorOptions = { + defines: [], + indexParameters: eventData.indexParameters, + isFragment: false, + shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader, + processor: void 0, + supportsUniformBuffers: this._engine.supportsUniformBuffers, + shadersRepository: ShaderStore.GetShadersRepository(shaderLanguage), + includesShadersStore: ShaderStore.GetIncludesShadersStore(shaderLanguage), + version: void 0, + platformName: this._engine.shaderPlatformName, + processingContext: void 0, + isNDCHalfZRange: this._engine.isNDCHalfZRange, + useReverseDepthBuffer: this._engine.useReverseDepthBuffer, + processCodeAfterIncludes: void 0 + // not used by _ProcessIncludes + }; + } + processorOptions.isFragment = shaderType === "fragment"; + ShaderProcessor._ProcessIncludes(customCode, processorOptions, (code2) => customCode = code2); + } + injectedCode += customCode + "\n"; + } + if (injectedCode.length > 0) { + if (pointName.charAt(0) === "!") { + pointName = pointName.substring(1); + let regexFlags = "g"; + if (pointName.charAt(0) === "!") { + regexFlags = ""; + pointName = pointName.substring(1); + } else { + const matchOption = rxOption.exec(pointName); + if (matchOption && matchOption.length >= 2) { + regexFlags = matchOption[1]; + pointName = pointName.substring(regexFlags.length + 1); + } + } + if (regexFlags.indexOf("g") < 0) { + regexFlags += "g"; + } + const sourceCode = code; + const rx = new RegExp(pointName, regexFlags); + let match = rx.exec(sourceCode); + while (match !== null) { + let newCode = injectedCode; + for (let i = 0; i < match.length; ++i) { + newCode = newCode.replace("$" + i, match[i]); + } + code = code.replace(match[0], newCode); + match = rx.exec(sourceCode); + } + } else { + const fullPointName = "#define " + pointName; + code = code.replace(fullPointName, "\n" + injectedCode + "\n" + fullPointName); + } } } - this._options.mass = _options.mass === void 0 ? 0 : _options.mass; - this._options.friction = _options.friction === void 0 ? 0.2 : _options.friction; - this._options.restitution = _options.restitution === void 0 ? 0.2 : _options.restitution; - if (this.soft) { - this._options.mass = this._options.mass > 0 ? this._options.mass : 1; - this._options.pressure = _options.pressure === void 0 ? 200 : _options.pressure; - this._options.stiffness = _options.stiffness === void 0 ? 1 : _options.stiffness; - this._options.velocityIterations = _options.velocityIterations === void 0 ? 20 : _options.velocityIterations; - this._options.positionIterations = _options.positionIterations === void 0 ? 20 : _options.positionIterations; - this._options.fixedPoints = _options.fixedPoints === void 0 ? 0 : _options.fixedPoints; - this._options.margin = _options.margin === void 0 ? 0 : _options.margin; - this._options.damping = _options.damping === void 0 ? 0 : _options.damping; - this._options.path = _options.path === void 0 ? null : _options.path; - this._options.shape = _options.shape === void 0 ? null : _options.shape; + return code; + }; + } +}; +MaterialPluginManager._MaterialPluginClassToMainDefine = {}; +MaterialPluginManager._MaterialPluginCounter = 0; +(() => { + EngineStore.OnEnginesDisposedObservable.add(() => { + UnregisterAllMaterialPlugins(); + }); +})(); +var plugins = []; +var inited = false; +var observer = null; +function RegisterMaterialPlugin(pluginName, factory) { + if (!inited) { + observer = Material.OnEventObservable.add((material) => { + for (const [, factory2] of plugins) { + factory2(material); } - this._joints = []; - if (!this.object.parent || this._options.ignoreParent) { - this._init(); - } else if (this.object.parent.physicsImpostor) { - Logger.Warn("You must affect impostors to children before affecting impostor to parent."); + }, MaterialPluginEvent.Created); + inited = true; + } + const existing = plugins.filter(([name69, _factory]) => name69 === pluginName); + if (existing.length > 0) { + existing[0][1] = factory; + } else { + plugins.push([pluginName, factory]); + } +} +function UnregisterMaterialPlugin(pluginName) { + for (let i = 0; i < plugins.length; ++i) { + if (plugins[i][0] === pluginName) { + plugins.splice(i, 1); + if (plugins.length === 0) { + UnregisterAllMaterialPlugins(); } + return true; + } + } + return false; +} +function UnregisterAllMaterialPlugins() { + plugins.length = 0; + inited = false; + Material.OnEventObservable.remove(observer); + observer = null; +} + +// node_modules/@babylonjs/core/Materials/materialPluginBase.js +var MaterialPluginBase = class { + _enable(enable) { + if (enable) { + this._pluginManager._activatePlugin(this); } } /** - * This function will completely initialize this impostor. - * It will create a new body - but only if this mesh has no parent. - * If it has, this impostor will not be used other than to define the impostor - * of the child mesh. - * @internal + * Creates a new material plugin + * @param material parent material of the plugin + * @param name name of the plugin + * @param priority priority of the plugin + * @param defines list of defines used by the plugin. The value of the property is the default value for this property + * @param addToPluginList true to add the plugin to the list of plugins managed by the material plugin manager of the material (default: true) + * @param enable true to enable the plugin (it is handy if the plugin does not handle properties to switch its current activation) + * @param resolveIncludes Indicates that any #include directive in the plugin code must be replaced by the corresponding code (default: false) */ - _init() { - if (!this._physicsEngine) { - return; + constructor(material, name69, priority, defines, addToPluginList = true, enable = false, resolveIncludes = false) { + this.priority = 500; + this.resolveIncludes = false; + this.registerForExtraEvents = false; + this._material = material; + this.name = name69; + this.priority = priority; + this.resolveIncludes = resolveIncludes; + if (!material.pluginManager) { + material.pluginManager = new MaterialPluginManager(material); + material.onDisposeObservable.add(() => { + material.pluginManager = void 0; + }); } - this._physicsEngine.removeImpostor(this); - this.physicsBody = null; - this._parent = this._parent || this._getPhysicsParent(); - if (!this._isDisposed && (!this.parent || this._options.ignoreParent)) { - this._physicsEngine.addImpostor(this); + this._pluginDefineNames = defines; + this._pluginManager = material.pluginManager; + if (addToPluginList) { + this._pluginManager._addPlugin(this); } - } - _getPhysicsParent() { - if (this.object.parent instanceof AbstractMesh) { - const parentMesh = this.object.parent; - return parentMesh.physicsImpostor; + if (enable) { + this._enable(true); } - return null; + this.markAllDefinesAsDirty = material._dirtyCallbacks[63]; } /** - * Should a new body be generated. - * @returns boolean specifying if body initialization is required + * Gets the current class name useful for serialization or dynamic coding. + * @returns The class name. */ - isBodyInitRequired() { - return this._bodyUpdateRequired || !this._physicsBody && (!this._parent || !!this._options.ignoreParent); + getClassName() { + return "MaterialPluginBase"; } /** - * Sets the updated scaling + * Specifies that the submesh is ready to be used. + * @param defines the list of "defines" to update. + * @param scene defines the scene the material belongs to. + * @param engine the engine this scene belongs to. + * @param subMesh the submesh to check for readiness + * @returns - boolean indicating that the submesh is ready or not. */ - setScalingUpdated() { - this.forceUpdate(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + isReadyForSubMesh(defines, scene, engine, subMesh) { + return true; } /** - * Force a regeneration of this or the parent's impostor's body. - * Use with caution - This will remove all previously-instantiated joints. + * Binds the material data (this function is called even if mustRebind() returns false) + * @param uniformBuffer defines the Uniform buffer to fill in. + * @param scene defines the scene the material belongs to. + * @param engine defines the engine the material belongs to. + * @param subMesh the submesh to bind data for */ - forceUpdate() { - this._init(); - if (this.parent && !this._options.ignoreParent) { - this.parent.forceUpdate(); - } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + hardBindForSubMesh(uniformBuffer, scene, engine, subMesh) { } - /*public get mesh(): AbstractMesh { - return this._mesh; - }*/ /** - * Gets the body that holds this impostor. Either its own, or its parent. + * Binds the material data. + * @param uniformBuffer defines the Uniform buffer to fill in. + * @param scene defines the scene the material belongs to. + * @param engine the engine this scene belongs to. + * @param subMesh the submesh to bind data for */ - get physicsBody() { - return this._parent && !this._options.ignoreParent ? this._parent.physicsBody : this._physicsBody; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + bindForSubMesh(uniformBuffer, scene, engine, subMesh) { } /** - * Get the parent of the physics imposter - * @returns Physics imposter or null + * Disposes the resources of the material. + * @param forceDisposeTextures - Forces the disposal of all textures. */ - get parent() { - return !this._options.ignoreParent && this._parent ? this._parent : null; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + dispose(forceDisposeTextures) { } /** - * Sets the parent of the physics imposter - */ - set parent(value) { - this._parent = value; - } - /** - * Set the physics body. Used mainly by the physics engine/plugin - */ - set physicsBody(physicsBody) { - if (this._physicsBody && this._physicsEngine) { - this._physicsEngine.getPhysicsPlugin().removePhysicsBody(this); - } - this._physicsBody = physicsBody; - this.resetUpdateFlags(); - } - /** - * Resets the update flags + * Returns a list of custom shader code fragments to customize the shader. + * @param shaderType "vertex" or "fragment" + * @returns null if no code to be added, or a list of pointName =\> code. + * Note that `pointName` can also be a regular expression if it starts with a `!`. + * In that case, the string found by the regular expression (if any) will be + * replaced by the code provided. */ - resetUpdateFlags() { - this._bodyUpdateRequired = false; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getCustomCode(shaderType) { + return null; } /** - * Gets the object extents - * @returns the object extents + * Collects all defines. + * @param defines The object to append to. */ - getObjectExtents() { - if (this.object.getBoundingInfo) { - const q = this.object.rotationQuaternion; - const scaling = this.object.scaling.clone(); - this.object.rotationQuaternion = _PhysicsImpostor.IDENTITY_QUATERNION; - const worldMatrix = this.object.computeWorldMatrix && this.object.computeWorldMatrix(true); - if (worldMatrix) { - worldMatrix.decompose(scaling, void 0, void 0); + collectDefines(defines) { + if (!this._pluginDefineNames) { + return; + } + for (const key of Object.keys(this._pluginDefineNames)) { + if (key[0] === "_") { + continue; } - const boundingInfo = this.object.getBoundingInfo(); - const size = boundingInfo.boundingBox.extendSize.scale(2).multiplyInPlace(scaling); - size.x = Math.abs(size.x); - size.y = Math.abs(size.y); - size.z = Math.abs(size.z); - this.object.rotationQuaternion = q; - this.object.computeWorldMatrix && this.object.computeWorldMatrix(true); - return size; - } else { - return _PhysicsImpostor.DEFAULT_OBJECT_SIZE; + const type = typeof this._pluginDefineNames[key]; + defines[key] = { + type: type === "number" ? "number" : type === "string" ? "string" : type === "boolean" ? "boolean" : "object", + default: this._pluginDefineNames[key] + }; } } /** - * Gets the object center - * @returns The object center + * Sets the defines for the next rendering. Called before PrepareDefinesForAttributes is called. + * @param defines the list of "defines" to update. + * @param scene defines the scene to the material belongs to. + * @param mesh the mesh being rendered */ - getObjectCenter() { - if (this.object.getBoundingInfo) { - const boundingInfo = this.object.getBoundingInfo(); - return boundingInfo.boundingBox.centerWorld; - } else { - return this.object.position; - } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + prepareDefinesBeforeAttributes(defines, scene, mesh) { } /** - * Get a specific parameter from the options parameters - * @param paramName The object parameter name - * @returns The object parameter + * Sets the defines for the next rendering + * @param defines the list of "defines" to update. + * @param scene defines the scene to the material belongs to. + * @param mesh the mesh being rendered */ - getParam(paramName) { - return this._options[paramName]; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + prepareDefines(defines, scene, mesh) { } /** - * Sets a specific parameter in the options given to the physics plugin - * @param paramName The parameter name - * @param value The value of the parameter + * Checks to see if a texture is used in the material. + * @param texture - Base texture to use. + * @returns - Boolean specifying if a texture is used in the material. */ - setParam(paramName, value) { - this._options[paramName] = value; - this._bodyUpdateRequired = true; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + hasTexture(texture) { + return false; } /** - * Specifically change the body's mass. Won't recreate the physics body object - * @param mass The mass of the physics imposter + * Gets a boolean indicating that current material needs to register RTT + * @returns true if this uses a render target otherwise false. */ - setMass(mass) { - if (this.getParam("mass") !== mass) { - this.setParam("mass", mass); - } - if (this._physicsEngine) { - this._physicsEngine.getPhysicsPlugin().setBodyMass(this, mass); - } + hasRenderTargetTextures() { + return false; } /** - * Gets the linear velocity - * @returns linear velocity or null + * Fills the list of render target textures. + * @param renderTargets the list of render targets to update */ - getLinearVelocity() { - return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getLinearVelocity(this) : Vector3.Zero(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + fillRenderTargetTextures(renderTargets) { } /** - * Sets the linear velocity - * @param velocity linear velocity or null + * Returns an array of the actively used textures. + * @param activeTextures Array of BaseTextures */ - setLinearVelocity(velocity) { - if (this._physicsEngine) { - this._physicsEngine.getPhysicsPlugin().setLinearVelocity(this, velocity); - } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getActiveTextures(activeTextures) { } /** - * Gets the angular velocity - * @returns angular velocity or null + * Returns the animatable textures. + * @param animatables Array of animatable textures. */ - getAngularVelocity() { - return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getAngularVelocity(this) : Vector3.Zero(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getAnimatables(animatables) { } /** - * Sets the angular velocity - * @param velocity The velocity or null + * Add fallbacks to the effect fallbacks list. + * @param defines defines the Base texture to use. + * @param fallbacks defines the current fallback list. + * @param currentRank defines the current fallback rank. + * @returns the new fallback rank. */ - setAngularVelocity(velocity) { - if (this._physicsEngine) { - this._physicsEngine.getPhysicsPlugin().setAngularVelocity(this, velocity); - } + addFallbacks(defines, fallbacks, currentRank) { + return currentRank; } /** - * Execute a function with the physics plugin native code - * Provide a function the will have two variables - the world object and the physics body object - * @param func The function to execute with the physics plugin native code + * Gets the samplers used by the plugin. + * @param samplers list that the sampler names should be added to. */ - executeNativeFunction(func) { - if (this._physicsEngine) { - func(this._physicsEngine.getPhysicsPlugin().world, this.physicsBody); - } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getSamplers(samplers) { } /** - * Register a function that will be executed before the physics world is stepping forward - * @param func The function to execute before the physics world is stepped forward + * Gets the attributes used by the plugin. + * @param attributes list that the attribute names should be added to. + * @param scene the scene that the material belongs to. + * @param mesh the mesh being rendered. */ - registerBeforePhysicsStep(func) { - this._onBeforePhysicsStepCallbacks.push(func); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getAttributes(attributes, scene, mesh) { } /** - * Unregister a function that will be executed before the physics world is stepping forward - * @param func The function to execute before the physics world is stepped forward + * Gets the uniform buffers names added by the plugin. + * @param ubos list that the ubo names should be added to. */ - unregisterBeforePhysicsStep(func) { - const index = this._onBeforePhysicsStepCallbacks.indexOf(func); - if (index > -1) { - this._onBeforePhysicsStepCallbacks.splice(index, 1); - } else { - Logger.Warn("Function to remove was not found"); - } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getUniformBuffersNames(ubos) { } /** - * Register a function that will be executed after the physics step - * @param func The function to execute after physics step + * Gets the description of the uniforms to add to the ubo (if engine supports ubos) or to inject directly in the vertex/fragment shaders (if engine does not support ubos) + * @returns the description of the uniforms */ - registerAfterPhysicsStep(func) { - this._onAfterPhysicsStepCallbacks.push(func); + getUniforms() { + return {}; } /** - * Unregisters a function that will be executed after the physics step - * @param func The function to execute after physics step + * Makes a duplicate of the current configuration into another one. + * @param plugin define the config where to copy the info */ - unregisterAfterPhysicsStep(func) { - const index = this._onAfterPhysicsStepCallbacks.indexOf(func); - if (index > -1) { - this._onAfterPhysicsStepCallbacks.splice(index, 1); - } else { - Logger.Warn("Function to remove was not found"); - } + copyTo(plugin) { + SerializationHelper.Clone(() => plugin, this); } /** - * register a function that will be executed when this impostor collides against a different body - * @param collideAgainst Physics imposter, or array of physics imposters to collide against - * @param func Callback that is executed on collision + * Serializes this plugin configuration. + * @returns - An object with the serialized config. */ - registerOnPhysicsCollide(collideAgainst, func) { - const collidedAgainstList = collideAgainst instanceof Array ? collideAgainst : [collideAgainst]; - this._onPhysicsCollideCallbacks.push({ callback: func, otherImpostors: collidedAgainstList }); + serialize() { + return SerializationHelper.Serialize(this); } /** - * Unregisters the physics imposter's collision callback - * @param collideAgainst The physics object to collide against - * @param func Callback to execute on collision + * Parses a plugin configuration from a serialized object. + * @param source - Serialized object. + * @param scene Defines the scene we are parsing for + * @param rootUrl Defines the rootUrl to load from */ - unregisterOnPhysicsCollide(collideAgainst, func) { - const collidedAgainstList = collideAgainst instanceof Array ? collideAgainst : [collideAgainst]; - let index = -1; - const found = this._onPhysicsCollideCallbacks.some((cbDef, idx) => { - if (cbDef.callback === func && cbDef.otherImpostors.length === collidedAgainstList.length) { - const sameList = cbDef.otherImpostors.every((impostor) => { - return collidedAgainstList.indexOf(impostor) > -1; - }); - if (sameList) { - index = idx; + parse(source, scene, rootUrl) { + SerializationHelper.Parse(() => this, source, scene, rootUrl); + } +}; +__decorate([ + serialize() +], MaterialPluginBase.prototype, "name", void 0); +__decorate([ + serialize() +], MaterialPluginBase.prototype, "priority", void 0); +__decorate([ + serialize() +], MaterialPluginBase.prototype, "resolveIncludes", void 0); +__decorate([ + serialize() +], MaterialPluginBase.prototype, "registerForExtraEvents", void 0); + +// node_modules/@babylonjs/core/Materials/material.detailMapConfiguration.js +var MaterialDetailMapDefines = class extends MaterialDefines { + constructor() { + super(...arguments); + this.DETAIL = false; + this.DETAILDIRECTUV = 0; + this.DETAIL_NORMALBLENDMETHOD = 0; + } +}; +var DetailMapConfiguration = class extends MaterialPluginBase { + /** @internal */ + _markAllSubMeshesAsTexturesDirty() { + this._enable(this._isEnabled); + this._internalMarkAllSubMeshesAsTexturesDirty(); + } + constructor(material, addToPluginList = true) { + super(material, "DetailMap", 140, new MaterialDetailMapDefines(), addToPluginList); + this._texture = null; + this.diffuseBlendLevel = 1; + this.roughnessBlendLevel = 1; + this.bumpLevel = 1; + this._normalBlendMethod = Material.MATERIAL_NORMALBLENDMETHOD_WHITEOUT; + this._isEnabled = false; + this.isEnabled = false; + this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[1]; + } + isReadyForSubMesh(defines, scene, engine) { + if (!this._isEnabled) { + return true; + } + if (defines._areTexturesDirty && scene.texturesEnabled) { + if (engine.getCaps().standardDerivatives && this._texture && MaterialFlags.DetailTextureEnabled) { + if (!this._texture.isReady()) { + return false; } - return sameList; } - return false; - }); - if (found) { - this._onPhysicsCollideCallbacks.splice(index, 1); - } else { - Logger.Warn("Function to remove was not found"); } + return true; } - /** - * Get the parent rotation - * @returns The parent rotation - */ - getParentsRotation() { - let parent = this.object.parent; - this._tmpQuat.copyFromFloats(0, 0, 0, 1); - while (parent) { - if (parent.rotationQuaternion) { - this._tmpQuat2.copyFrom(parent.rotationQuaternion); - } else { - Quaternion.RotationYawPitchRollToRef(parent.rotation.y, parent.rotation.x, parent.rotation.z, this._tmpQuat2); + prepareDefines(defines, scene) { + if (this._isEnabled) { + defines.DETAIL_NORMALBLENDMETHOD = this._normalBlendMethod; + const engine = scene.getEngine(); + if (defines._areTexturesDirty) { + if (engine.getCaps().standardDerivatives && this._texture && MaterialFlags.DetailTextureEnabled && this._isEnabled) { + PrepareDefinesForMergedUV(this._texture, defines, "DETAIL"); + defines.DETAIL_NORMALBLENDMETHOD = this._normalBlendMethod; + } else { + defines.DETAIL = false; + } } - this._tmpQuat.multiplyToRef(this._tmpQuat2, this._tmpQuat); - parent = parent.parent; + } else { + defines.DETAIL = false; } - return this._tmpQuat; } - /** - * Apply a force - * @param force The force to apply - * @param contactPoint The contact point for the force - * @returns The physics imposter - */ - applyForce(force, contactPoint) { - if (this._physicsEngine) { - this._physicsEngine.getPhysicsPlugin().applyForce(this, force, contactPoint); + bindForSubMesh(uniformBuffer, scene) { + if (!this._isEnabled) { + return; } - return this; - } - /** - * Apply an impulse - * @param force The impulse force - * @param contactPoint The contact point for the impulse force - * @returns The physics imposter - */ - applyImpulse(force, contactPoint) { - if (this._physicsEngine) { - this._physicsEngine.getPhysicsPlugin().applyImpulse(this, force, contactPoint); + const isFrozen = this._material.isFrozen; + if (!uniformBuffer.useUbo || !isFrozen || !uniformBuffer.isSync) { + if (this._texture && MaterialFlags.DetailTextureEnabled) { + uniformBuffer.updateFloat4("vDetailInfos", this._texture.coordinatesIndex, this.diffuseBlendLevel, this.bumpLevel, this.roughnessBlendLevel); + BindTextureMatrix(this._texture, uniformBuffer, "detail"); + } } - return this; - } - /** - * A help function to create a joint - * @param otherImpostor A physics imposter used to create a joint - * @param jointType The type of joint - * @param jointData The data for the joint - * @returns The physics imposter - */ - createJoint(otherImpostor, jointType, jointData) { - const joint = new PhysicsJoint(jointType, jointData); - this.addJoint(otherImpostor, joint); - return this; - } - /** - * Add a joint to this impostor with a different impostor - * @param otherImpostor A physics imposter used to add a joint - * @param joint The joint to add - * @returns The physics imposter - */ - addJoint(otherImpostor, joint) { - this._joints.push({ - otherImpostor, - joint - }); - if (this._physicsEngine) { - this._physicsEngine.addJoint(this, otherImpostor, joint); + if (scene.texturesEnabled) { + if (this._texture && MaterialFlags.DetailTextureEnabled) { + uniformBuffer.setTexture("detailSampler", this._texture); + } } - return this; } - /** - * Add an anchor to a cloth impostor - * @param otherImpostor rigid impostor to anchor to - * @param width ratio across width from 0 to 1 - * @param height ratio up height from 0 to 1 - * @param influence the elasticity between cloth impostor and anchor from 0, very stretchy to 1, little stretch - * @param noCollisionBetweenLinkedBodies when true collisions between cloth impostor and anchor are ignored; default false - * @returns impostor the soft imposter - */ - addAnchor(otherImpostor, width, height, influence, noCollisionBetweenLinkedBodies) { - if (!this._physicsEngine) { - return this; - } - const plugin = this._physicsEngine.getPhysicsPlugin(); - if (!plugin.appendAnchor) { - return this; - } - if (this._physicsEngine) { - plugin.appendAnchor(this, otherImpostor, width, height, influence, noCollisionBetweenLinkedBodies); + hasTexture(texture) { + if (this._texture === texture) { + return true; } - return this; + return false; } - /** - * Add a hook to a rope impostor - * @param otherImpostor rigid impostor to anchor to - * @param length ratio across rope from 0 to 1 - * @param influence the elasticity between rope impostor and anchor from 0, very stretchy to 1, little stretch - * @param noCollisionBetweenLinkedBodies when true collisions between soft impostor and anchor are ignored; default false - * @returns impostor the rope imposter - */ - addHook(otherImpostor, length, influence, noCollisionBetweenLinkedBodies) { - if (!this._physicsEngine) { - return this; - } - const plugin = this._physicsEngine.getPhysicsPlugin(); - if (!plugin.appendAnchor) { - return this; + getActiveTextures(activeTextures) { + if (this._texture) { + activeTextures.push(this._texture); } - if (this._physicsEngine) { - plugin.appendHook(this, otherImpostor, length, influence, noCollisionBetweenLinkedBodies); + } + getAnimatables(animatables) { + if (this._texture && this._texture.animations && this._texture.animations.length > 0) { + animatables.push(this._texture); } - return this; } - /** - * Will keep this body still, in a sleep mode. - * @returns the physics imposter - */ - sleep() { - if (this._physicsEngine) { - this._physicsEngine.getPhysicsPlugin().sleepBody(this); + dispose(forceDisposeTextures) { + var _a; + if (forceDisposeTextures) { + (_a = this._texture) == null ? void 0 : _a.dispose(); } - return this; + } + getClassName() { + return "DetailMapConfiguration"; + } + getSamplers(samplers) { + samplers.push("detailSampler"); + } + getUniforms() { + return { + ubo: [ + { name: "vDetailInfos", size: 4, type: "vec4" }, + { name: "detailMatrix", size: 16, type: "mat4" } + ] + }; + } +}; +__decorate([ + serializeAsTexture("detailTexture"), + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], DetailMapConfiguration.prototype, "texture", void 0); +__decorate([ + serialize() +], DetailMapConfiguration.prototype, "diffuseBlendLevel", void 0); +__decorate([ + serialize() +], DetailMapConfiguration.prototype, "roughnessBlendLevel", void 0); +__decorate([ + serialize() +], DetailMapConfiguration.prototype, "bumpLevel", void 0); +__decorate([ + serialize(), + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], DetailMapConfiguration.prototype, "normalBlendMethod", void 0); +__decorate([ + serialize(), + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], DetailMapConfiguration.prototype, "isEnabled", void 0); + +// node_modules/@babylonjs/core/Materials/prePassConfiguration.js +var PrePassConfiguration = class { + constructor() { + this.previousWorldMatrices = {}; + this.previousBones = {}; } /** - * Wake the body up. - * @returns The physics imposter + * Add the required uniforms to the current list. + * @param uniforms defines the current uniform list. */ - wakeUp() { - if (this._physicsEngine) { - this._physicsEngine.getPhysicsPlugin().wakeUpBody(this); - } - return this; + static AddUniforms(uniforms) { + uniforms.push("previousWorld", "previousViewProjection", "mPreviousBones"); } /** - * Clones the physics imposter - * @param newObject The physics imposter clones to this physics-enabled object - * @returns A nullable physics imposter + * Add the required samplers to the current list. + * @param samplers defines the current sampler list. */ - clone(newObject) { - if (!newObject) { - return null; - } - return new _PhysicsImpostor(newObject, this.type, this._options, this._scene); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + static AddSamplers(samplers) { } /** - * Disposes the physics imposter + * Binds the material data. + * @param effect defines the effect to update + * @param scene defines the scene the material belongs to. + * @param mesh The mesh + * @param world World matrix of this mesh + * @param isFrozen Is the material frozen */ - dispose() { - if (!this._physicsEngine) { - return; - } - this._joints.forEach((j) => { - if (this._physicsEngine) { - this._physicsEngine.removeJoint(this, j.otherImpostor, j.joint); - } - }); - this._physicsEngine.removeImpostor(this); - if (this.parent) { - this.parent.forceUpdate(); - } else { - } - this._isDisposed = true; - } - /** - * Sets the delta position - * @param position The delta position amount - */ - setDeltaPosition(position) { - this._deltaPosition.copyFrom(position); - } - /** - * Sets the delta rotation - * @param rotation The delta rotation amount - */ - setDeltaRotation(rotation) { - if (!this._deltaRotation) { - this._deltaRotation = new Quaternion(); - } - this._deltaRotation.copyFrom(rotation); - this._deltaRotationConjugated = this._deltaRotation.conjugate(); - } - /** - * Gets the box size of the physics imposter and stores the result in the input parameter - * @param result Stores the box size - * @returns The physics imposter - */ - getBoxSizeToRef(result) { - if (this._physicsEngine) { - this._physicsEngine.getPhysicsPlugin().getBoxSizeToRef(this, result); - } - return this; - } - /** - * Gets the radius of the physics imposter - * @returns Radius of the physics imposter - */ - getRadius() { - return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getRadius(this) : 0; - } - /** - * Sync a bone with this impostor - * @param bone The bone to sync to the impostor. - * @param boneMesh The mesh that the bone is influencing. - * @param jointPivot The pivot of the joint / bone in local space. - * @param distToJoint Optional distance from the impostor to the joint. - * @param adjustRotation Optional quaternion for adjusting the local rotation of the bone. - */ - syncBoneWithImpostor(bone, boneMesh, jointPivot, distToJoint, adjustRotation) { - const tempVec = _PhysicsImpostor._TmpVecs[0]; - const mesh = this.object; - if (mesh.rotationQuaternion) { - if (adjustRotation) { - const tempQuat = _PhysicsImpostor._TmpQuat; - mesh.rotationQuaternion.multiplyToRef(adjustRotation, tempQuat); - bone.setRotationQuaternion(tempQuat, Space.WORLD, boneMesh); - } else { - bone.setRotationQuaternion(mesh.rotationQuaternion, Space.WORLD, boneMesh); - } - } - tempVec.x = 0; - tempVec.y = 0; - tempVec.z = 0; - if (jointPivot) { - tempVec.x = jointPivot.x; - tempVec.y = jointPivot.y; - tempVec.z = jointPivot.z; - bone.getDirectionToRef(tempVec, boneMesh, tempVec); - if (distToJoint === void 0 || distToJoint === null) { - distToJoint = jointPivot.length(); - } - tempVec.x *= distToJoint; - tempVec.y *= distToJoint; - tempVec.z *= distToJoint; - } - if (bone.getParent()) { - tempVec.addInPlace(mesh.getAbsolutePosition()); - bone.setAbsolutePosition(tempVec, boneMesh); - } else { - boneMesh.setAbsolutePosition(mesh.getAbsolutePosition()); - boneMesh.position.x -= tempVec.x; - boneMesh.position.y -= tempVec.y; - boneMesh.position.z -= tempVec.z; - } - } - /** - * Sync impostor to a bone - * @param bone The bone that the impostor will be synced to. - * @param boneMesh The mesh that the bone is influencing. - * @param jointPivot The pivot of the joint / bone in local space. - * @param distToJoint Optional distance from the impostor to the joint. - * @param adjustRotation Optional quaternion for adjusting the local rotation of the bone. - * @param boneAxis Optional vector3 axis the bone is aligned with - */ - syncImpostorWithBone(bone, boneMesh, jointPivot, distToJoint, adjustRotation, boneAxis) { - const mesh = this.object; - if (mesh.rotationQuaternion) { - if (adjustRotation) { - const tempQuat = _PhysicsImpostor._TmpQuat; - bone.getRotationQuaternionToRef(Space.WORLD, boneMesh, tempQuat); - tempQuat.multiplyToRef(adjustRotation, mesh.rotationQuaternion); - } else { - bone.getRotationQuaternionToRef(Space.WORLD, boneMesh, mesh.rotationQuaternion); - } - } - const pos = _PhysicsImpostor._TmpVecs[0]; - const boneDir = _PhysicsImpostor._TmpVecs[1]; - if (!boneAxis) { - boneAxis = _PhysicsImpostor._TmpVecs[2]; - boneAxis.x = 0; - boneAxis.y = 1; - boneAxis.z = 0; - } - bone.getDirectionToRef(boneAxis, boneMesh, boneDir); - bone.getAbsolutePositionToRef(boneMesh, pos); - if ((distToJoint === void 0 || distToJoint === null) && jointPivot) { - distToJoint = jointPivot.length(); - } - if (distToJoint !== void 0 && distToJoint !== null) { - pos.x += boneDir.x * distToJoint; - pos.y += boneDir.y * distToJoint; - pos.z += boneDir.z * distToJoint; - } - mesh.setAbsolutePosition(pos); - } -}; -PhysicsImpostor.DEFAULT_OBJECT_SIZE = new Vector3(1, 1, 1); -PhysicsImpostor.IDENTITY_QUATERNION = Quaternion.Identity(); -PhysicsImpostor._TmpVecs = ArrayTools.BuildArray(3, Vector3.Zero); -PhysicsImpostor._TmpQuat = Quaternion.Identity(); -PhysicsImpostor.NoImpostor = 0; -PhysicsImpostor.SphereImpostor = 1; -PhysicsImpostor.BoxImpostor = 2; -PhysicsImpostor.PlaneImpostor = 3; -PhysicsImpostor.MeshImpostor = 4; -PhysicsImpostor.CapsuleImpostor = 6; -PhysicsImpostor.CylinderImpostor = 7; -PhysicsImpostor.ParticleImpostor = 8; -PhysicsImpostor.HeightmapImpostor = 9; -PhysicsImpostor.ConvexHullImpostor = 10; -PhysicsImpostor.CustomImpostor = 100; -PhysicsImpostor.RopeImpostor = 101; -PhysicsImpostor.ClothImpostor = 102; -PhysicsImpostor.SoftbodyImpostor = 103; - -// node_modules/@babylonjs/core/Loading/sceneLoader.js -var SceneLoaderAnimationGroupLoadingMode; -(function(SceneLoaderAnimationGroupLoadingMode2) { - SceneLoaderAnimationGroupLoadingMode2[SceneLoaderAnimationGroupLoadingMode2["Clean"] = 0] = "Clean"; - SceneLoaderAnimationGroupLoadingMode2[SceneLoaderAnimationGroupLoadingMode2["Stop"] = 1] = "Stop"; - SceneLoaderAnimationGroupLoadingMode2[SceneLoaderAnimationGroupLoadingMode2["Sync"] = 2] = "Sync"; - SceneLoaderAnimationGroupLoadingMode2[SceneLoaderAnimationGroupLoadingMode2["NoSync"] = 3] = "NoSync"; -})(SceneLoaderAnimationGroupLoadingMode || (SceneLoaderAnimationGroupLoadingMode = {})); -var SceneLoader = class _SceneLoader { - /** - * Gets or sets a boolean indicating if entire scene must be loaded even if scene contains incremental data - */ - static get ForceFullSceneLoadingForIncremental() { - return SceneLoaderFlags.ForceFullSceneLoadingForIncremental; - } - static set ForceFullSceneLoadingForIncremental(value) { - SceneLoaderFlags.ForceFullSceneLoadingForIncremental = value; - } - /** - * Gets or sets a boolean indicating if loading screen must be displayed while loading a scene - */ - static get ShowLoadingScreen() { - return SceneLoaderFlags.ShowLoadingScreen; - } - static set ShowLoadingScreen(value) { - SceneLoaderFlags.ShowLoadingScreen = value; - } - /** - * Defines the current logging level (while loading the scene) - * @ignorenaming - */ - // eslint-disable-next-line @typescript-eslint/naming-convention - static get loggingLevel() { - return SceneLoaderFlags.loggingLevel; - } - // eslint-disable-next-line @typescript-eslint/naming-convention - static set loggingLevel(value) { - SceneLoaderFlags.loggingLevel = value; - } - /** - * Gets or set a boolean indicating if matrix weights must be cleaned upon loading - */ - static get CleanBoneMatrixWeights() { - return SceneLoaderFlags.CleanBoneMatrixWeights; - } - static set CleanBoneMatrixWeights(value) { - SceneLoaderFlags.CleanBoneMatrixWeights = value; - } - /** - * Gets the default plugin (used to load Babylon files) - * @returns the .babylon plugin - */ - static GetDefaultPlugin() { - return _SceneLoader._RegisteredPlugins[".babylon"]; - } - static _GetPluginForExtension(extension) { - const registeredPlugin = _SceneLoader._RegisteredPlugins[extension]; - if (registeredPlugin) { - return registeredPlugin; - } - Logger.Warn("Unable to find a plugin to load " + extension + " files. Trying to use .babylon default plugin. To load from a specific filetype (eg. gltf) see: https://doc.babylonjs.com/features/featuresDeepDive/importers/loadingFileTypes"); - return _SceneLoader.GetDefaultPlugin(); - } - static _GetPluginForDirectLoad(data) { - for (const extension in _SceneLoader._RegisteredPlugins) { - const plugin = _SceneLoader._RegisteredPlugins[extension].plugin; - if (plugin.canDirectLoad && plugin.canDirectLoad(data)) { - return _SceneLoader._RegisteredPlugins[extension]; - } - } - return _SceneLoader.GetDefaultPlugin(); - } - static _GetPluginForFilename(sceneFilename) { - const queryStringPosition = sceneFilename.indexOf("?"); - if (queryStringPosition !== -1) { - sceneFilename = sceneFilename.substring(0, queryStringPosition); - } - const dotPosition = sceneFilename.lastIndexOf("."); - const extension = sceneFilename.substring(dotPosition, sceneFilename.length).toLowerCase(); - return _SceneLoader._GetPluginForExtension(extension); - } - static _GetDirectLoad(sceneFilename) { - if (sceneFilename.substr(0, 5) === "data:") { - return sceneFilename.substr(5); - } - return null; - } - static _FormatErrorMessage(fileInfo, message, exception) { - const fromLoad = fileInfo.rawData ? "binary data" : fileInfo.url; - let errorMessage = "Unable to load from " + fromLoad; - if (message) { - errorMessage += `: ${message}`; - } else if (exception) { - errorMessage += `: ${exception}`; - } - return errorMessage; - } - static _LoadData(fileInfo, scene, onSuccess, onProgress, onError, onDispose, pluginExtension, name69) { - const directLoad = _SceneLoader._GetDirectLoad(fileInfo.url); - if (fileInfo.rawData && !pluginExtension) { - throw "When using ArrayBufferView to load data the file extension must be provided."; - } - const registeredPlugin = pluginExtension ? _SceneLoader._GetPluginForExtension(pluginExtension) : directLoad ? _SceneLoader._GetPluginForDirectLoad(fileInfo.url) : _SceneLoader._GetPluginForFilename(fileInfo.url); - if (fileInfo.rawData && !registeredPlugin.isBinary) { - throw "Loading from ArrayBufferView can not be used with plugins that don't support binary loading."; - } - let plugin; - if (registeredPlugin.plugin.createPlugin !== void 0) { - plugin = registeredPlugin.plugin.createPlugin(); - } else { - plugin = registeredPlugin.plugin; - } - if (!plugin) { - throw "The loader plugin corresponding to the file type you are trying to load has not been found. If using es6, please import the plugin you wish to use before."; - } - _SceneLoader.OnPluginActivatedObservable.notifyObservers(plugin); - if (directLoad && (plugin.canDirectLoad && plugin.canDirectLoad(fileInfo.url) || !IsBase64DataUrl(fileInfo.url))) { - if (plugin.directLoad) { - const result = plugin.directLoad(scene, directLoad); - if (result.then) { - result.then((data) => { - onSuccess(plugin, data); - }).catch((error) => { - onError("Error in directLoad of _loadData: " + error, error); - }); - } else { - onSuccess(plugin, result); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + bindForSubMesh(effect, scene, mesh, world, isFrozen) { + if (scene.prePassRenderer && scene.prePassRenderer.enabled && scene.prePassRenderer.currentRTisSceneRT) { + if (scene.prePassRenderer.getIndex(2) !== -1) { + if (!this.previousWorldMatrices[mesh.uniqueId]) { + this.previousWorldMatrices[mesh.uniqueId] = world.clone(); } - } else { - onSuccess(plugin, directLoad); - } - return plugin; - } - const useArrayBuffer = registeredPlugin.isBinary; - const dataCallback = (data, responseURL) => { - if (scene.isDisposed) { - onError("Scene has been disposed"); - return; - } - onSuccess(plugin, data, responseURL); - }; - let request = null; - let pluginDisposed = false; - const onDisposeObservable = plugin.onDisposeObservable; - if (onDisposeObservable) { - onDisposeObservable.add(() => { - pluginDisposed = true; - if (request) { - request.abort(); - request = null; + if (!this.previousViewProjection) { + this.previousViewProjection = scene.getTransformMatrix().clone(); + this.currentViewProjection = scene.getTransformMatrix().clone(); } - onDispose(); - }); - } - const manifestChecked = () => { - if (pluginDisposed) { - return; - } - const errorCallback = (request2, exception) => { - onError(request2 == null ? void 0 : request2.statusText, exception); - }; - if (!plugin.loadFile && fileInfo.rawData) { - throw "Plugin does not support loading ArrayBufferView."; - } - request = plugin.loadFile ? plugin.loadFile(scene, fileInfo.rawData || fileInfo.file || fileInfo.url, fileInfo.rootUrl, dataCallback, onProgress, useArrayBuffer, errorCallback, name69) : scene._loadFile(fileInfo.file || fileInfo.url, dataCallback, onProgress, true, useArrayBuffer, errorCallback); - }; - const engine = scene.getEngine(); - let canUseOfflineSupport = engine.enableOfflineSupport; - if (canUseOfflineSupport) { - let exceptionFound = false; - for (const regex of scene.disableOfflineSupportExceptionRules) { - if (regex.test(fileInfo.url)) { - exceptionFound = true; - break; + const engine = scene.getEngine(); + if (this.currentViewProjection.updateFlag !== scene.getTransformMatrix().updateFlag) { + this._lastUpdateFrameId = engine.frameId; + this.previousViewProjection.copyFrom(this.currentViewProjection); + this.currentViewProjection.copyFrom(scene.getTransformMatrix()); + } else if (this._lastUpdateFrameId !== engine.frameId) { + this._lastUpdateFrameId = engine.frameId; + this.previousViewProjection.copyFrom(this.currentViewProjection); } + effect.setMatrix("previousWorld", this.previousWorldMatrices[mesh.uniqueId]); + effect.setMatrix("previousViewProjection", this.previousViewProjection); + this.previousWorldMatrices[mesh.uniqueId] = world.clone(); } - canUseOfflineSupport = !exceptionFound; - } - if (canUseOfflineSupport && Engine.OfflineProviderFactory) { - scene.offlineProvider = Engine.OfflineProviderFactory(fileInfo.url, manifestChecked, engine.disableManifestCheck); - } else { - manifestChecked(); - } - return plugin; - } - static _GetFileInfo(rootUrl, sceneFilename) { - let url; - let name69; - let file = null; - let rawData = null; - if (!sceneFilename) { - url = rootUrl; - name69 = Tools.GetFilename(rootUrl); - rootUrl = Tools.GetFolderPath(rootUrl); - } else if (sceneFilename.name) { - const sceneFile = sceneFilename; - url = `file:${sceneFile.name}`; - name69 = sceneFile.name; - file = sceneFile; - } else if (ArrayBuffer.isView(sceneFilename)) { - url = ""; - name69 = RandomGUID(); - rawData = sceneFilename; - } else if (typeof sceneFilename === "string" && sceneFilename.startsWith("data:")) { - url = sceneFilename; - name69 = ""; - } else { - const filename = sceneFilename; - if (filename.substr(0, 1) === "/") { - Tools.Error("Wrong sceneFilename parameter"); - return null; - } - url = rootUrl + filename; - name69 = filename; - } - return { - url, - rootUrl, - name: name69, - file, - rawData - }; - } - // Public functions - /** - * Gets a plugin that can load the given extension - * @param extension defines the extension to load - * @returns a plugin or null if none works - */ - static GetPluginForExtension(extension) { - return _SceneLoader._GetPluginForExtension(extension).plugin; - } - /** - * Gets a boolean indicating that the given extension can be loaded - * @param extension defines the extension to load - * @returns true if the extension is supported - */ - static IsPluginForExtensionAvailable(extension) { - return !!_SceneLoader._RegisteredPlugins[extension]; - } - /** - * Adds a new plugin to the list of registered plugins - * @param plugin defines the plugin to add - */ - static RegisterPlugin(plugin) { - if (typeof plugin.extensions === "string") { - const extension = plugin.extensions; - _SceneLoader._RegisteredPlugins[extension.toLowerCase()] = { - plugin, - isBinary: false - }; - } else { - const extensions = plugin.extensions; - Object.keys(extensions).forEach((extension) => { - _SceneLoader._RegisteredPlugins[extension.toLowerCase()] = { - plugin, - isBinary: extensions[extension].isBinary - }; - }); - } - } - /** - * Import meshes into a scene - * @param meshNames an array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported - * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) - * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) - * @param scene the instance of BABYLON.Scene to append to - * @param onSuccess a callback with a list of imported meshes, particleSystems, skeletons, and animationGroups when import succeeds - * @param onProgress a callback with a progress event for each file being loaded - * @param onError a callback with the scene, a message, and possibly an exception when import fails - * @param pluginExtension the extension used to determine the plugin - * @param name defines the name of the file, if the data is binary - * @returns The loaded plugin - */ - static ImportMesh(meshNames, rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, onSuccess = null, onProgress = null, onError = null, pluginExtension = null, name69 = "") { - if (!scene) { - Logger.Error("No scene available to import mesh to"); - return null; - } - const fileInfo = _SceneLoader._GetFileInfo(rootUrl, sceneFilename); - if (!fileInfo) { - return null; } - const loadingToken = {}; - scene.addPendingData(loadingToken); - const disposeHandler = () => { - scene.removePendingData(loadingToken); - }; - const errorHandler = (message, exception) => { - const errorMessage = _SceneLoader._FormatErrorMessage(fileInfo, message, exception); - if (onError) { - onError(scene, errorMessage, new RuntimeError(errorMessage, ErrorCodes.SceneLoaderError, exception)); - } else { - Logger.Error(errorMessage); - } - disposeHandler(); - }; - const progressHandler = onProgress ? (event) => { - try { - onProgress(event); - } catch (e) { - errorHandler("Error in onProgress callback: " + e, e); - } - } : void 0; - const successHandler = (meshes, particleSystems, skeletons, animationGroups, transformNodes, geometries, lights, spriteManagers) => { - scene.importedMeshesFiles.push(fileInfo.url); - if (onSuccess) { - try { - onSuccess(meshes, particleSystems, skeletons, animationGroups, transformNodes, geometries, lights, spriteManagers); - } catch (e) { - errorHandler("Error in onSuccess callback: " + e, e); - } - } - scene.removePendingData(loadingToken); - }; - return _SceneLoader._LoadData(fileInfo, scene, (plugin, data, responseURL) => { - if (plugin.rewriteRootURL) { - fileInfo.rootUrl = plugin.rewriteRootURL(fileInfo.rootUrl, responseURL); - } - if (plugin.importMesh) { - const syncedPlugin = plugin; - const meshes = []; - const particleSystems = []; - const skeletons = []; - if (!syncedPlugin.importMesh(meshNames, scene, data, fileInfo.rootUrl, meshes, particleSystems, skeletons, errorHandler)) { - return; - } - scene.loadingPluginName = plugin.name; - successHandler(meshes, particleSystems, skeletons, [], [], [], [], []); - } else { - const asyncedPlugin = plugin; - asyncedPlugin.importMeshAsync(meshNames, scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name).then((result) => { - scene.loadingPluginName = plugin.name; - successHandler(result.meshes, result.particleSystems, result.skeletons, result.animationGroups, result.transformNodes, result.geometries, result.lights, result.spriteManagers); - }).catch((error) => { - errorHandler(error.message, error); - }); - } - }, progressHandler, errorHandler, disposeHandler, pluginExtension, name69); - } - /** - * Import meshes into a scene - * @param meshNames an array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported - * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) - * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) - * @param scene the instance of BABYLON.Scene to append to - * @param onProgress a callback with a progress event for each file being loaded - * @param pluginExtension the extension used to determine the plugin - * @param name defines the name of the file - * @returns The loaded list of imported meshes, particle systems, skeletons, and animation groups - */ - static ImportMeshAsync(meshNames, rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, onProgress = null, pluginExtension = null, name69 = "") { - return new Promise((resolve, reject) => { - _SceneLoader.ImportMesh(meshNames, rootUrl, sceneFilename, scene, (meshes, particleSystems, skeletons, animationGroups, transformNodes, geometries, lights, spriteManagers) => { - resolve({ - meshes, - particleSystems, - skeletons, - animationGroups, - transformNodes, - geometries, - lights, - spriteManagers - }); - }, onProgress, (scene2, message, exception) => { - reject(exception || new Error(message)); - }, pluginExtension, name69); - }); - } - /** - * Load a scene - * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) - * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) - * @param engine is the instance of BABYLON.Engine to use to create the scene - * @param onSuccess a callback with the scene when import succeeds - * @param onProgress a callback with a progress event for each file being loaded - * @param onError a callback with the scene, a message, and possibly an exception when import fails - * @param pluginExtension the extension used to determine the plugin - * @param name defines the filename, if the data is binary - * @returns The loaded plugin - */ - static Load(rootUrl, sceneFilename = "", engine = EngineStore.LastCreatedEngine, onSuccess = null, onProgress = null, onError = null, pluginExtension = null, name69 = "") { - if (!engine) { - Tools.Error("No engine available"); - return null; - } - return _SceneLoader.Append(rootUrl, sceneFilename, new Scene(engine), onSuccess, onProgress, onError, pluginExtension, name69); - } - /** - * Load a scene - * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) - * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) - * @param engine is the instance of BABYLON.Engine to use to create the scene - * @param onProgress a callback with a progress event for each file being loaded - * @param pluginExtension the extension used to determine the plugin - * @param name defines the filename, if the data is binary - * @returns The loaded scene - */ - static LoadAsync(rootUrl, sceneFilename = "", engine = EngineStore.LastCreatedEngine, onProgress = null, pluginExtension = null, name69 = "") { - return new Promise((resolve, reject) => { - _SceneLoader.Load(rootUrl, sceneFilename, engine, (scene) => { - resolve(scene); - }, onProgress, (scene, message, exception) => { - reject(exception || new Error(message)); - }, pluginExtension, name69); - }); - } - /** - * Append a scene - * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) - * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) - * @param scene is the instance of BABYLON.Scene to append to - * @param onSuccess a callback with the scene when import succeeds - * @param onProgress a callback with a progress event for each file being loaded - * @param onError a callback with the scene, a message, and possibly an exception when import fails - * @param pluginExtension the extension used to determine the plugin - * @param name defines the name of the file, if the data is binary - * @returns The loaded plugin - */ - static Append(rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, onSuccess = null, onProgress = null, onError = null, pluginExtension = null, name69 = "") { - if (!scene) { - Logger.Error("No scene available to append to"); - return null; - } - const fileInfo = _SceneLoader._GetFileInfo(rootUrl, sceneFilename); - if (!fileInfo) { - return null; - } - const loadingToken = {}; - scene.addPendingData(loadingToken); - const disposeHandler = () => { - scene.removePendingData(loadingToken); - }; - if (_SceneLoader.ShowLoadingScreen && !this._ShowingLoadingScreen) { - this._ShowingLoadingScreen = true; - scene.getEngine().displayLoadingUI(); - scene.executeWhenReady(() => { - scene.getEngine().hideLoadingUI(); - this._ShowingLoadingScreen = false; - }); - } - const errorHandler = (message, exception) => { - const errorMessage = _SceneLoader._FormatErrorMessage(fileInfo, message, exception); - if (onError) { - onError(scene, errorMessage, new RuntimeError(errorMessage, ErrorCodes.SceneLoaderError, exception)); - } else { - Logger.Error(errorMessage); - } - disposeHandler(); - }; - const progressHandler = onProgress ? (event) => { - try { - onProgress(event); - } catch (e) { - errorHandler("Error in onProgress callback", e); - } - } : void 0; - const successHandler = () => { - if (onSuccess) { - try { - onSuccess(scene); - } catch (e) { - errorHandler("Error in onSuccess callback", e); - } - } - scene.removePendingData(loadingToken); - }; - return _SceneLoader._LoadData(fileInfo, scene, (plugin, data) => { - if (plugin.load) { - const syncedPlugin = plugin; - if (!syncedPlugin.load(scene, data, fileInfo.rootUrl, errorHandler)) { - return; - } - scene.loadingPluginName = plugin.name; - successHandler(); - } else { - const asyncedPlugin = plugin; - asyncedPlugin.loadAsync(scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name).then(() => { - scene.loadingPluginName = plugin.name; - successHandler(); - }).catch((error) => { - errorHandler(error.message, error); - }); - } - }, progressHandler, errorHandler, disposeHandler, pluginExtension, name69); - } - /** - * Append a scene - * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) - * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) - * @param scene is the instance of BABYLON.Scene to append to - * @param onProgress a callback with a progress event for each file being loaded - * @param pluginExtension the extension used to determine the plugin - * @param name defines the name of the file, if the data is binary - * @returns The given scene - */ - static AppendAsync(rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, onProgress = null, pluginExtension = null, name69 = "") { - return new Promise((resolve, reject) => { - _SceneLoader.Append(rootUrl, sceneFilename, scene, (scene2) => { - resolve(scene2); - }, onProgress, (scene2, message, exception) => { - reject(exception || new Error(message)); - }, pluginExtension, name69); - }); - } - /** - * Load a scene into an asset container - * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) - * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) - * @param scene is the instance of BABYLON.Scene to append to (default: last created scene) - * @param onSuccess a callback with the scene when import succeeds - * @param onProgress a callback with a progress event for each file being loaded - * @param onError a callback with the scene, a message, and possibly an exception when import fails - * @param pluginExtension the extension used to determine the plugin - * @param name defines the filename, if the data is binary - * @returns The loaded plugin - */ - static LoadAssetContainer(rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, onSuccess = null, onProgress = null, onError = null, pluginExtension = null, name69 = "") { - if (!scene) { - Logger.Error("No scene available to load asset container to"); - return null; - } - const fileInfo = _SceneLoader._GetFileInfo(rootUrl, sceneFilename); - if (!fileInfo) { - return null; - } - const loadingToken = {}; - scene.addPendingData(loadingToken); - const disposeHandler = () => { - scene.removePendingData(loadingToken); - }; - const errorHandler = (message, exception) => { - const errorMessage = _SceneLoader._FormatErrorMessage(fileInfo, message, exception); - if (onError) { - onError(scene, errorMessage, new RuntimeError(errorMessage, ErrorCodes.SceneLoaderError, exception)); - } else { - Logger.Error(errorMessage); - } - disposeHandler(); - }; - const progressHandler = onProgress ? (event) => { - try { - onProgress(event); - } catch (e) { - errorHandler("Error in onProgress callback", e); - } - } : void 0; - const successHandler = (assets) => { - if (onSuccess) { - try { - onSuccess(assets); - } catch (e) { - errorHandler("Error in onSuccess callback", e); - } - } - scene.removePendingData(loadingToken); - }; - return _SceneLoader._LoadData(fileInfo, scene, (plugin, data) => { - if (plugin.loadAssetContainer) { - const syncedPlugin = plugin; - const assetContainer = syncedPlugin.loadAssetContainer(scene, data, fileInfo.rootUrl, errorHandler); - if (!assetContainer) { - return; - } - assetContainer.populateRootNodes(); - scene.loadingPluginName = plugin.name; - successHandler(assetContainer); - } else if (plugin.loadAssetContainerAsync) { - const asyncedPlugin = plugin; - asyncedPlugin.loadAssetContainerAsync(scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name).then((assetContainer) => { - assetContainer.populateRootNodes(); - scene.loadingPluginName = plugin.name; - successHandler(assetContainer); - }).catch((error) => { - errorHandler(error.message, error); - }); - } else { - errorHandler("LoadAssetContainer is not supported by this plugin. Plugin did not provide a loadAssetContainer or loadAssetContainerAsync method."); - } - }, progressHandler, errorHandler, disposeHandler, pluginExtension, name69); - } - /** - * Load a scene into an asset container - * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) - * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene (default: empty string) - * @param scene is the instance of Scene to append to - * @param onProgress a callback with a progress event for each file being loaded - * @param pluginExtension the extension used to determine the plugin - * @returns The loaded asset container - */ - static LoadAssetContainerAsync(rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, onProgress = null, pluginExtension = null) { - return new Promise((resolve, reject) => { - _SceneLoader.LoadAssetContainer(rootUrl, sceneFilename, scene, (assetContainer) => { - resolve(assetContainer); - }, onProgress, (scene2, message, exception) => { - reject(exception || new Error(message)); - }, pluginExtension); - }); - } - /** - * Import animations from a file into a scene - * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) - * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) - * @param scene is the instance of BABYLON.Scene to append to (default: last created scene) - * @param overwriteAnimations when true, animations are cleaned before importing new ones. Animations are appended otherwise - * @param animationGroupLoadingMode defines how to handle old animations groups before importing new ones - * @param targetConverter defines a function used to convert animation targets from loaded scene to current scene (default: search node by name) - * @param onSuccess a callback with the scene when import succeeds - * @param onProgress a callback with a progress event for each file being loaded - * @param onError a callback with the scene, a message, and possibly an exception when import fails - * @param pluginExtension the extension used to determine the plugin - */ - static ImportAnimations(rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, overwriteAnimations = true, animationGroupLoadingMode = SceneLoaderAnimationGroupLoadingMode.Clean, targetConverter = null, onSuccess = null, onProgress = null, onError = null, pluginExtension = null) { - if (!scene) { - Logger.Error("No scene available to load animations to"); - return; - } - if (overwriteAnimations) { - for (const animatable of scene.animatables) { - animatable.reset(); - } - scene.stopAllAnimations(); - scene.animationGroups.slice().forEach((animationGroup) => { - animationGroup.dispose(); - }); - const nodes = scene.getNodes(); - nodes.forEach((node) => { - if (node.animations) { - node.animations = []; - } - }); - } else { - switch (animationGroupLoadingMode) { - case SceneLoaderAnimationGroupLoadingMode.Clean: - scene.animationGroups.slice().forEach((animationGroup) => { - animationGroup.dispose(); - }); - break; - case SceneLoaderAnimationGroupLoadingMode.Stop: - scene.animationGroups.forEach((animationGroup) => { - animationGroup.stop(); - }); - break; - case SceneLoaderAnimationGroupLoadingMode.Sync: - scene.animationGroups.forEach((animationGroup) => { - animationGroup.reset(); - animationGroup.restart(); - }); - break; - case SceneLoaderAnimationGroupLoadingMode.NoSync: - break; - default: - Logger.Error("Unknown animation group loading mode value '" + animationGroupLoadingMode + "'"); - return; - } - } - const startingIndexForNewAnimatables = scene.animatables.length; - const onAssetContainerLoaded = (container) => { - container.mergeAnimationsTo(scene, scene.animatables.slice(startingIndexForNewAnimatables), targetConverter); - container.dispose(); - scene.onAnimationFileImportedObservable.notifyObservers(scene); - if (onSuccess) { - onSuccess(scene); - } - }; - this.LoadAssetContainer(rootUrl, sceneFilename, scene, onAssetContainerLoaded, onProgress, onError, pluginExtension); - } - /** - * Import animations from a file into a scene - * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) - * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) - * @param scene is the instance of BABYLON.Scene to append to (default: last created scene) - * @param overwriteAnimations when true, animations are cleaned before importing new ones. Animations are appended otherwise - * @param animationGroupLoadingMode defines how to handle old animations groups before importing new ones - * @param targetConverter defines a function used to convert animation targets from loaded scene to current scene (default: search node by name) - * @param onSuccess a callback with the scene when import succeeds - * @param onProgress a callback with a progress event for each file being loaded - * @param onError a callback with the scene, a message, and possibly an exception when import fails - * @param pluginExtension the extension used to determine the plugin - * @returns the updated scene with imported animations - */ - static ImportAnimationsAsync(rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, overwriteAnimations = true, animationGroupLoadingMode = SceneLoaderAnimationGroupLoadingMode.Clean, targetConverter = null, onSuccess = null, onProgress = null, onError = null, pluginExtension = null) { - return new Promise((resolve, reject) => { - _SceneLoader.ImportAnimations(rootUrl, sceneFilename, scene, overwriteAnimations, animationGroupLoadingMode, targetConverter, (_scene) => { - resolve(_scene); - }, onProgress, (_scene, message, exception) => { - reject(exception || new Error(message)); - }, pluginExtension); - }); - } -}; -SceneLoader.NO_LOGGING = 0; -SceneLoader.MINIMAL_LOGGING = 1; -SceneLoader.SUMMARY_LOGGING = 2; -SceneLoader.DETAILED_LOGGING = 3; -SceneLoader.OnPluginActivatedObservable = new Observable(); -SceneLoader._RegisteredPlugins = {}; -SceneLoader._ShowingLoadingScreen = false; - -// node_modules/@babylonjs/core/Materials/pushMaterial.js -var PushMaterial = class extends Material { - constructor(name69, scene, storeEffectOnSubMeshes = true) { - super(name69, scene); - this._normalMatrix = new Matrix(); - this._storeEffectOnSubMeshes = storeEffectOnSubMeshes; - } - getEffect() { - return this._storeEffectOnSubMeshes ? this._activeEffect : super.getEffect(); - } - isReady(mesh, useInstances) { - if (!mesh) { - return false; - } - if (!this._storeEffectOnSubMeshes) { - return true; - } - if (!mesh.subMeshes || mesh.subMeshes.length === 0) { - return true; - } - return this.isReadyForSubMesh(mesh, mesh.subMeshes[0], useInstances); - } - _isReadyForSubMesh(subMesh) { - const defines = subMesh.materialDefines; - if (!this.checkReadyOnEveryCall && subMesh.effect && defines) { - if (defines._renderId === this.getScene().getRenderId()) { - return true; - } - } - return false; - } - /** - * Binds the given world matrix to the active effect - * - * @param world the matrix to bind - */ - bindOnlyWorldMatrix(world) { - this._activeEffect.setMatrix("world", world); - } - /** - * Binds the given normal matrix to the active effect - * - * @param normalMatrix the matrix to bind - */ - bindOnlyNormalMatrix(normalMatrix) { - this._activeEffect.setMatrix("normalMatrix", normalMatrix); - } - bind(world, mesh) { - if (!mesh) { - return; - } - this.bindForSubMesh(world, mesh, mesh.subMeshes[0]); - } - _afterBind(mesh, effect = null, subMesh) { - super._afterBind(mesh, effect, subMesh); - this.getScene()._cachedEffect = effect; - if (subMesh) { - subMesh._drawWrapper._forceRebindOnNextCall = false; - } else { - this._drawWrapper._forceRebindOnNextCall = false; - } - } - _mustRebind(scene, effect, subMesh, visibility = 1) { - return subMesh._drawWrapper._forceRebindOnNextCall || scene.isCachedMaterialInvalid(this, effect, visibility); - } - dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh) { - this._activeEffect = void 0; - super.dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh); } }; -// node_modules/@babylonjs/core/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes.js -var NodeMaterialBlockConnectionPointTypes; -(function(NodeMaterialBlockConnectionPointTypes2) { - NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Float"] = 1] = "Float"; - NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Int"] = 2] = "Int"; - NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Vector2"] = 4] = "Vector2"; - NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Vector3"] = 8] = "Vector3"; - NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Vector4"] = 16] = "Vector4"; - NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Color3"] = 32] = "Color3"; - NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Color4"] = 64] = "Color4"; - NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Matrix"] = 128] = "Matrix"; - NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Object"] = 256] = "Object"; - NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["AutoDetect"] = 1024] = "AutoDetect"; - NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["BasedOnInput"] = 2048] = "BasedOnInput"; - NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["All"] = 4095] = "All"; -})(NodeMaterialBlockConnectionPointTypes || (NodeMaterialBlockConnectionPointTypes = {})); - -// node_modules/@babylonjs/core/Materials/Node/Enums/nodeMaterialBlockTargets.js -var NodeMaterialBlockTargets; -(function(NodeMaterialBlockTargets2) { - NodeMaterialBlockTargets2[NodeMaterialBlockTargets2["Vertex"] = 1] = "Vertex"; - NodeMaterialBlockTargets2[NodeMaterialBlockTargets2["Fragment"] = 2] = "Fragment"; - NodeMaterialBlockTargets2[NodeMaterialBlockTargets2["Neutral"] = 4] = "Neutral"; - NodeMaterialBlockTargets2[NodeMaterialBlockTargets2["VertexAndFragment"] = 3] = "VertexAndFragment"; -})(NodeMaterialBlockTargets || (NodeMaterialBlockTargets = {})); +// node_modules/@babylonjs/core/Shaders/ShadersInclude/decalFragmentDeclaration.js +var name4 = "decalFragmentDeclaration"; +var shader4 = `#ifdef DECAL +uniform vec4 vDecalInfos; +#endif +`; +ShaderStore.IncludesShadersStore[name4] = shader4; -// node_modules/@babylonjs/core/Materials/materialDefines.js -var MaterialDefines = class { - /** - * Creates a new instance - * @param externalProperties list of external properties to inject into the object - */ - constructor(externalProperties) { - this._keys = []; - this._isDirty = true; - this._areLightsDirty = true; - this._areLightsDisposed = false; - this._areAttributesDirty = true; - this._areTexturesDirty = true; - this._areFresnelDirty = true; - this._areMiscDirty = true; - this._arePrePassDirty = true; - this._areImageProcessingDirty = true; - this._normals = false; - this._uvs = false; - this._needNormals = false; - this._needUVs = false; - this._externalProperties = externalProperties; - if (externalProperties) { - for (const prop in externalProperties) { - if (Object.prototype.hasOwnProperty.call(externalProperties, prop)) { - this._setDefaultValue(prop); - } - } - } - } - /** - * Specifies if the material needs to be re-calculated - */ - get isDirty() { - return this._isDirty; - } - /** - * Marks the material to indicate that it has been re-calculated - */ - markAsProcessed() { - this._isDirty = false; - this._areAttributesDirty = false; - this._areTexturesDirty = false; - this._areFresnelDirty = false; - this._areLightsDirty = false; - this._areLightsDisposed = false; - this._areMiscDirty = false; - this._arePrePassDirty = false; - this._areImageProcessingDirty = false; - } - /** - * Marks the material to indicate that it needs to be re-calculated - */ - markAsUnprocessed() { - this._isDirty = true; - } - /** - * Marks the material to indicate all of its defines need to be re-calculated - */ - markAllAsDirty() { - this._areTexturesDirty = true; - this._areAttributesDirty = true; - this._areLightsDirty = true; - this._areFresnelDirty = true; - this._areMiscDirty = true; - this._arePrePassDirty = false; - this._areImageProcessingDirty = true; - this._isDirty = true; - } - /** - * Marks the material to indicate that image processing needs to be re-calculated - */ - markAsImageProcessingDirty() { - this._areImageProcessingDirty = true; - this._isDirty = true; - } - /** - * Marks the material to indicate the lights need to be re-calculated - * @param disposed Defines whether the light is dirty due to dispose or not - */ - markAsLightDirty(disposed = false) { - this._areLightsDirty = true; - this._areLightsDisposed = this._areLightsDisposed || disposed; - this._isDirty = true; - } - /** - * Marks the attribute state as changed - */ - markAsAttributesDirty() { - this._areAttributesDirty = true; - this._isDirty = true; - } - /** - * Marks the texture state as changed - */ - markAsTexturesDirty() { - this._areTexturesDirty = true; - this._isDirty = true; - } - /** - * Marks the fresnel state as changed - */ - markAsFresnelDirty() { - this._areFresnelDirty = true; - this._isDirty = true; - } - /** - * Marks the misc state as changed - */ - markAsMiscDirty() { - this._areMiscDirty = true; - this._isDirty = true; - } - /** - * Marks the prepass state as changed - */ - markAsPrePassDirty() { - this._arePrePassDirty = true; - this._isDirty = true; - } - /** - * Rebuilds the material defines - */ - rebuild() { - this._keys.length = 0; - for (const key of Object.keys(this)) { - if (key[0] === "_") { - continue; - } - this._keys.push(key); - } - if (this._externalProperties) { - for (const name69 in this._externalProperties) { - if (this._keys.indexOf(name69) === -1) { - this._keys.push(name69); - } - } - } - } - /** - * Specifies if two material defines are equal - * @param other - A material define instance to compare to - * @returns - Boolean indicating if the material defines are equal (true) or not (false) - */ - isEqual(other) { - if (this._keys.length !== other._keys.length) { - return false; - } - for (let index = 0; index < this._keys.length; index++) { - const prop = this._keys[index]; - if (this[prop] !== other[prop]) { - return false; - } - } - return true; - } - /** - * Clones this instance's defines to another instance - * @param other - material defines to clone values to - */ - cloneTo(other) { - if (this._keys.length !== other._keys.length) { - other._keys = this._keys.slice(0); - } - for (let index = 0; index < this._keys.length; index++) { - const prop = this._keys[index]; - other[prop] = this[prop]; - } - } - /** - * Resets the material define values - */ - reset() { - this._keys.forEach((prop) => this._setDefaultValue(prop)); - } - _setDefaultValue(prop) { - var _a, _b, _c, _d; - const type = ((_b = (_a = this._externalProperties) == null ? void 0 : _a[prop]) == null ? void 0 : _b.type) ?? typeof this[prop]; - const defValue = (_d = (_c = this._externalProperties) == null ? void 0 : _c[prop]) == null ? void 0 : _d.default; - switch (type) { - case "number": - this[prop] = defValue ?? 0; - break; - case "string": - this[prop] = defValue ?? ""; - break; - default: - this[prop] = defValue ?? false; - break; - } - } - /** - * Converts the material define values to a string - * @returns - String of material define information - */ - toString() { - let result = ""; - for (let index = 0; index < this._keys.length; index++) { - const prop = this._keys[index]; - const value = this[prop]; - const type = typeof value; - switch (type) { - case "number": - case "string": - result += "#define " + prop + " " + value + "\n"; - break; - default: - if (value) { - result += "#define " + prop + "\n"; - } - break; - } - } - return result; - } +// node_modules/@babylonjs/core/Shaders/ShadersInclude/defaultFragmentDeclaration.js +var name5 = "defaultFragmentDeclaration"; +var shader5 = `uniform vec4 vEyePosition;uniform vec4 vDiffuseColor; +#ifdef SPECULARTERM +uniform vec4 vSpecularColor; +#endif +uniform vec3 vEmissiveColor;uniform vec3 vAmbientColor;uniform float visibility; +#ifdef DIFFUSE +uniform vec2 vDiffuseInfos; +#endif +#ifdef AMBIENT +uniform vec2 vAmbientInfos; +#endif +#ifdef OPACITY +uniform vec2 vOpacityInfos; +#endif +#ifdef EMISSIVE +uniform vec2 vEmissiveInfos; +#endif +#ifdef LIGHTMAP +uniform vec2 vLightmapInfos; +#endif +#ifdef BUMP +uniform vec3 vBumpInfos;uniform vec2 vTangentSpaceParams; +#endif +#ifdef ALPHATEST +uniform float alphaCutOff; +#endif +#if defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_PROJECTION) || defined(REFRACTION) || defined(PREPASS) +uniform mat4 view; +#endif +#ifdef REFRACTION +uniform vec4 vRefractionInfos; +#ifndef REFRACTIONMAP_3D +uniform mat4 refractionMatrix; +#endif +#ifdef REFRACTIONFRESNEL +uniform vec4 refractionLeftColor;uniform vec4 refractionRightColor; +#endif +#if defined(USE_LOCAL_REFRACTIONMAP_CUBIC) && defined(REFRACTIONMAP_3D) +uniform vec3 vRefractionPosition;uniform vec3 vRefractionSize; +#endif +#endif +#if defined(SPECULAR) && defined(SPECULARTERM) +uniform vec2 vSpecularInfos; +#endif +#ifdef DIFFUSEFRESNEL +uniform vec4 diffuseLeftColor;uniform vec4 diffuseRightColor; +#endif +#ifdef OPACITYFRESNEL +uniform vec4 opacityParts; +#endif +#ifdef EMISSIVEFRESNEL +uniform vec4 emissiveLeftColor;uniform vec4 emissiveRightColor; +#endif +#ifdef REFLECTION +uniform vec2 vReflectionInfos; +#if defined(REFLECTIONMAP_PLANAR) || defined(REFLECTIONMAP_CUBIC) || defined(REFLECTIONMAP_PROJECTION) || defined(REFLECTIONMAP_EQUIRECTANGULAR) || defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_SKYBOX) +uniform mat4 reflectionMatrix; +#endif +#ifndef REFLECTIONMAP_SKYBOX +#if defined(USE_LOCAL_REFLECTIONMAP_CUBIC) && defined(REFLECTIONMAP_CUBIC) +uniform vec3 vReflectionPosition;uniform vec3 vReflectionSize; +#endif +#endif +#ifdef REFLECTIONFRESNEL +uniform vec4 reflectionLeftColor;uniform vec4 reflectionRightColor; +#endif +#endif +#ifdef DETAIL +uniform vec4 vDetailInfos; +#endif +#include +#define ADDITIONAL_FRAGMENT_DECLARATION +`; +ShaderStore.IncludesShadersStore[name5] = shader5; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/sceneUboDeclaration.js +var name6 = "sceneUboDeclaration"; +var shader6 = `layout(std140,column_major) uniform;uniform Scene {mat4 viewProjection; +#ifdef MULTIVIEW +mat4 viewProjectionR; +#endif +mat4 view;mat4 projection;vec4 vEyePosition;}; +`; +ShaderStore.IncludesShadersStore[name6] = shader6; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/meshUboDeclaration.js +var name7 = "meshUboDeclaration"; +var shader7 = `#ifdef WEBGL2 +uniform mat4 world;uniform float visibility; +#else +layout(std140,column_major) uniform;uniform Mesh +{mat4 world;float visibility;}; +#endif +#define WORLD_UBO +`; +ShaderStore.IncludesShadersStore[name7] = shader7; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/defaultUboDeclaration.js +var name8 = "defaultUboDeclaration"; +var shader8 = `layout(std140,column_major) uniform;uniform Material +{vec4 diffuseLeftColor;vec4 diffuseRightColor;vec4 opacityParts;vec4 reflectionLeftColor;vec4 reflectionRightColor;vec4 refractionLeftColor;vec4 refractionRightColor;vec4 emissiveLeftColor;vec4 emissiveRightColor;vec2 vDiffuseInfos;vec2 vAmbientInfos;vec2 vOpacityInfos;vec2 vReflectionInfos;vec3 vReflectionPosition;vec3 vReflectionSize;vec2 vEmissiveInfos;vec2 vLightmapInfos;vec2 vSpecularInfos;vec3 vBumpInfos;mat4 diffuseMatrix;mat4 ambientMatrix;mat4 opacityMatrix;mat4 reflectionMatrix;mat4 emissiveMatrix;mat4 lightmapMatrix;mat4 specularMatrix;mat4 bumpMatrix;vec2 vTangentSpaceParams;float pointSize;float alphaCutOff;mat4 refractionMatrix;vec4 vRefractionInfos;vec3 vRefractionPosition;vec3 vRefractionSize;vec4 vSpecularColor;vec3 vEmissiveColor;vec4 vDiffuseColor;vec3 vAmbientColor; +#define ADDITIONAL_UBO_DECLARATION }; +#include +#include +`; +ShaderStore.IncludesShadersStore[name8] = shader8; -// node_modules/@babylonjs/core/Materials/Node/nodeMaterialBlockConnectionPoint.js -var NodeMaterialConnectionPointCompatibilityStates; -(function(NodeMaterialConnectionPointCompatibilityStates2) { - NodeMaterialConnectionPointCompatibilityStates2[NodeMaterialConnectionPointCompatibilityStates2["Compatible"] = 0] = "Compatible"; - NodeMaterialConnectionPointCompatibilityStates2[NodeMaterialConnectionPointCompatibilityStates2["TypeIncompatible"] = 1] = "TypeIncompatible"; - NodeMaterialConnectionPointCompatibilityStates2[NodeMaterialConnectionPointCompatibilityStates2["TargetIncompatible"] = 2] = "TargetIncompatible"; - NodeMaterialConnectionPointCompatibilityStates2[NodeMaterialConnectionPointCompatibilityStates2["HierarchyIssue"] = 3] = "HierarchyIssue"; -})(NodeMaterialConnectionPointCompatibilityStates || (NodeMaterialConnectionPointCompatibilityStates = {})); -var NodeMaterialConnectionPointDirection; -(function(NodeMaterialConnectionPointDirection2) { - NodeMaterialConnectionPointDirection2[NodeMaterialConnectionPointDirection2["Input"] = 0] = "Input"; - NodeMaterialConnectionPointDirection2[NodeMaterialConnectionPointDirection2["Output"] = 1] = "Output"; -})(NodeMaterialConnectionPointDirection || (NodeMaterialConnectionPointDirection = {})); -var NodeMaterialConnectionPoint = class _NodeMaterialConnectionPoint { - /** - * Checks if two types are equivalent - * @param type1 type 1 to check - * @param type2 type 2 to check - * @returns true if both types are equivalent, else false - */ - static AreEquivalentTypes(type1, type2) { - switch (type1) { - case NodeMaterialBlockConnectionPointTypes.Vector3: { - if (type2 === NodeMaterialBlockConnectionPointTypes.Color3) { - return true; - } - break; - } - case NodeMaterialBlockConnectionPointTypes.Vector4: { - if (type2 === NodeMaterialBlockConnectionPointTypes.Color4) { - return true; - } - break; - } - case NodeMaterialBlockConnectionPointTypes.Color3: { - if (type2 === NodeMaterialBlockConnectionPointTypes.Vector3) { - return true; - } - break; - } - case NodeMaterialBlockConnectionPointTypes.Color4: { - if (type2 === NodeMaterialBlockConnectionPointTypes.Vector4) { - return true; - } - break; - } - } - return false; - } - /** Gets the direction of the point */ - get direction() { - return this._direction; - } - /** - * Gets or sets the associated variable name in the shader - */ - get associatedVariableName() { - if (this._ownerBlock.isInput) { - return this._ownerBlock.associatedVariableName; - } - if ((!this._enforceAssociatedVariableName || !this._associatedVariableName) && this._connectedPoint) { - return this._connectedPoint.associatedVariableName; - } - return this._associatedVariableName; - } - set associatedVariableName(value) { - this._associatedVariableName = value; - } - /** Get the inner type (ie AutoDetect for instance instead of the inferred one) */ - get innerType() { - if (this._linkedConnectionSource && this._linkedConnectionSource.isConnected) { - return this.type; - } - return this._type; - } - /** - * Gets or sets the connection point type (default is float) - */ - get type() { - if (this._type === NodeMaterialBlockConnectionPointTypes.AutoDetect) { - if (this._ownerBlock.isInput) { - return this._ownerBlock.type; - } - if (this._connectedPoint) { - return this._connectedPoint.type; - } - if (this._linkedConnectionSource && this._linkedConnectionSource.isConnected) { - return this._linkedConnectionSource.type; - } - } - if (this._type === NodeMaterialBlockConnectionPointTypes.BasedOnInput) { - if (this._typeConnectionSource) { - if (!this._typeConnectionSource.isConnected && this._defaultConnectionPointType) { - return this._defaultConnectionPointType; - } - return this._typeConnectionSource.type; - } else if (this._defaultConnectionPointType) { - return this._defaultConnectionPointType; - } - } - return this._type; - } - set type(value) { - this._type = value; - } - /** Gets or sets the target of that connection point */ - get target() { - if (!this._prioritizeVertex || !this._ownerBlock) { - return this._target; - } - if (this._target !== NodeMaterialBlockTargets.VertexAndFragment) { - return this._target; - } - if (this._ownerBlock.target === NodeMaterialBlockTargets.Fragment) { - return NodeMaterialBlockTargets.Fragment; - } - return NodeMaterialBlockTargets.Vertex; - } - set target(value) { - this._target = value; - } - /** - * Gets a boolean indicating that the current point is connected to another NodeMaterialBlock - */ - get isConnected() { - return this.connectedPoint !== null || this.hasEndpoints; - } - /** - * Gets a boolean indicating that the current point is connected to an input block - */ - get isConnectedToInputBlock() { - return this.connectedPoint !== null && this.connectedPoint.ownerBlock.isInput; - } - /** - * Gets a the connected input block (if any) - */ - get connectInputBlock() { - if (!this.isConnectedToInputBlock) { - return null; - } - return this.connectedPoint.ownerBlock; - } - /** Get the other side of the connection (if any) */ - get connectedPoint() { - return this._connectedPoint; - } - /** Get the block that owns this connection point */ - get ownerBlock() { - return this._ownerBlock; - } - /** Get the block connected on the other side of this connection (if any) */ - get sourceBlock() { - if (!this._connectedPoint) { - return null; - } - return this._connectedPoint.ownerBlock; - } - /** Get the block connected on the endpoints of this connection (if any) */ - get connectedBlocks() { - if (this._endpoints.length === 0) { - return []; - } - return this._endpoints.map((e) => e.ownerBlock); - } - /** Gets the list of connected endpoints */ - get endpoints() { - return this._endpoints; - } - /** Gets a boolean indicating if that output point is connected to at least one input */ - get hasEndpoints() { - return this._endpoints && this._endpoints.length > 0; - } - /** Gets a boolean indicating that this connection has a path to the vertex output*/ - get isDirectlyConnectedToVertexOutput() { - if (!this.hasEndpoints) { - return false; - } - for (const endpoint of this._endpoints) { - if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Vertex) { - return true; - } - if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Neutral || endpoint.ownerBlock.target === NodeMaterialBlockTargets.VertexAndFragment) { - if (endpoint.ownerBlock.outputs.some((o) => o.isDirectlyConnectedToVertexOutput)) { - return true; - } - } - } - return false; - } - /** Gets a boolean indicating that this connection will be used in the vertex shader */ - get isConnectedInVertexShader() { - if (this.target === NodeMaterialBlockTargets.Vertex) { - return true; - } - if (!this.hasEndpoints) { - return false; - } - for (const endpoint of this._endpoints) { - if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Vertex) { - return true; - } - if (endpoint.target === NodeMaterialBlockTargets.Vertex) { - return true; - } - if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Neutral || endpoint.ownerBlock.target === NodeMaterialBlockTargets.VertexAndFragment) { - if (endpoint.ownerBlock.outputs.some((o) => o.isConnectedInVertexShader)) { - return true; - } - } - } - return false; - } - /** Gets a boolean indicating that this connection will be used in the fragment shader */ - get isConnectedInFragmentShader() { - if (this.target === NodeMaterialBlockTargets.Fragment) { - return true; - } - if (!this.hasEndpoints) { - return false; - } - for (const endpoint of this._endpoints) { - if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Fragment) { - return true; - } - if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Neutral || endpoint.ownerBlock.target === NodeMaterialBlockTargets.VertexAndFragment) { - if (endpoint.ownerBlock.isConnectedInFragmentShader()) { - return true; - } - } - } - return false; - } - /** - * Creates a block suitable to be used as an input for this input point. - * If null is returned, a block based on the point type will be created. - * @returns The returned string parameter is the name of the output point of NodeMaterialBlock (first parameter of the returned array) that can be connected to the input - */ - createCustomInputBlock() { - return null; - } - /** - * Creates a new connection point - * @param name defines the connection point name - * @param ownerBlock defines the block hosting this connection point - * @param direction defines the direction of the connection point - */ - constructor(name69, ownerBlock, direction) { - this._connectedPoint = null; - this._endpoints = new Array(); - this._typeConnectionSource = null; - this._defaultConnectionPointType = null; - this._linkedConnectionSource = null; - this._acceptedConnectionPointType = null; - this._type = NodeMaterialBlockConnectionPointTypes.Float; - this._enforceAssociatedVariableName = false; - this.needDualDirectionValidation = false; - this.acceptedConnectionPointTypes = []; - this.excludedConnectionPointTypes = []; - this.onConnectionObservable = new Observable(); - this.onDisconnectionObservable = new Observable(); - this.isExposedOnFrame = false; - this.exposedPortPosition = -1; - this._prioritizeVertex = false; - this._target = NodeMaterialBlockTargets.VertexAndFragment; - this._ownerBlock = ownerBlock; - this.name = name69; - this._direction = direction; - } - /** - * Gets the current class name e.g. "NodeMaterialConnectionPoint" - * @returns the class name - */ - getClassName() { - return "NodeMaterialConnectionPoint"; - } - /** - * Gets a boolean indicating if the current point can be connected to another point - * @param connectionPoint defines the other connection point - * @returns a boolean - */ - canConnectTo(connectionPoint) { - return this.checkCompatibilityState(connectionPoint) === NodeMaterialConnectionPointCompatibilityStates.Compatible; - } - /** - * Gets a number indicating if the current point can be connected to another point - * @param connectionPoint defines the other connection point - * @returns a number defining the compatibility state - */ - checkCompatibilityState(connectionPoint) { - const ownerBlock = this._ownerBlock; - const otherBlock = connectionPoint.ownerBlock; - if (ownerBlock.target === NodeMaterialBlockTargets.Fragment) { - if (otherBlock.target === NodeMaterialBlockTargets.Vertex) { - return NodeMaterialConnectionPointCompatibilityStates.TargetIncompatible; - } - for (const output of otherBlock.outputs) { - if (output.ownerBlock.target != NodeMaterialBlockTargets.Neutral && output.isConnectedInVertexShader) { - return NodeMaterialConnectionPointCompatibilityStates.TargetIncompatible; - } - } - } - if (this.type !== connectionPoint.type && connectionPoint.innerType !== NodeMaterialBlockConnectionPointTypes.AutoDetect) { - if (_NodeMaterialConnectionPoint.AreEquivalentTypes(this.type, connectionPoint.type)) { - return NodeMaterialConnectionPointCompatibilityStates.Compatible; - } - if (connectionPoint.acceptedConnectionPointTypes && connectionPoint.acceptedConnectionPointTypes.indexOf(this.type) !== -1 || connectionPoint._acceptedConnectionPointType && _NodeMaterialConnectionPoint.AreEquivalentTypes(connectionPoint._acceptedConnectionPointType.type, this.type)) { - return NodeMaterialConnectionPointCompatibilityStates.Compatible; - } else { - return NodeMaterialConnectionPointCompatibilityStates.TypeIncompatible; - } - } - if (connectionPoint.excludedConnectionPointTypes && connectionPoint.excludedConnectionPointTypes.indexOf(this.type) !== -1) { - return NodeMaterialConnectionPointCompatibilityStates.TypeIncompatible; - } - let targetBlock = otherBlock; - let sourceBlock = ownerBlock; - if (this.direction === NodeMaterialConnectionPointDirection.Input) { - targetBlock = ownerBlock; - sourceBlock = otherBlock; - } - if (targetBlock.isAnAncestorOf(sourceBlock)) { - return NodeMaterialConnectionPointCompatibilityStates.HierarchyIssue; - } - return NodeMaterialConnectionPointCompatibilityStates.Compatible; - } - /** - * Connect this point to another connection point - * @param connectionPoint defines the other connection point - * @param ignoreConstraints defines if the system will ignore connection type constraints (default is false) - * @returns the current connection point - */ - connectTo(connectionPoint, ignoreConstraints = false) { - if (!ignoreConstraints && !this.canConnectTo(connectionPoint)) { - throw "Cannot connect these two connectors."; - } - this._endpoints.push(connectionPoint); - connectionPoint._connectedPoint = this; - this._enforceAssociatedVariableName = false; - this.onConnectionObservable.notifyObservers(connectionPoint); - connectionPoint.onConnectionObservable.notifyObservers(this); - return this; - } - /** - * Disconnect this point from one of his endpoint - * @param endpoint defines the other connection point - * @returns the current connection point - */ - disconnectFrom(endpoint) { - const index = this._endpoints.indexOf(endpoint); - if (index === -1) { - return this; - } - this._endpoints.splice(index, 1); - endpoint._connectedPoint = null; - this._enforceAssociatedVariableName = false; - endpoint._enforceAssociatedVariableName = false; - this.onDisconnectionObservable.notifyObservers(endpoint); - endpoint.onDisconnectionObservable.notifyObservers(this); - return this; - } - /** - * Fill the list of excluded connection point types with all types other than those passed in the parameter - * @param mask Types (ORed values of NodeMaterialBlockConnectionPointTypes) that are allowed, and thus will not be pushed to the excluded list - */ - addExcludedConnectionPointFromAllowedTypes(mask) { - let bitmask = 1; - while (bitmask < NodeMaterialBlockConnectionPointTypes.All) { - if (!(mask & bitmask)) { - this.excludedConnectionPointTypes.push(bitmask); - } - bitmask = bitmask << 1; - } - } - /** - * Serializes this point in a JSON representation - * @param isInput defines if the connection point is an input (default is true) - * @returns the serialized point object - */ - serialize(isInput = true) { - const serializationObject = {}; - serializationObject.name = this.name; - serializationObject.displayName = this.displayName; - if (isInput && this.connectedPoint) { - serializationObject.inputName = this.name; - serializationObject.targetBlockId = this.connectedPoint.ownerBlock.uniqueId; - serializationObject.targetConnectionName = this.connectedPoint.name; - serializationObject.isExposedOnFrame = true; - serializationObject.exposedPortPosition = this.exposedPortPosition; - } - if (this.isExposedOnFrame || this.exposedPortPosition >= 0) { - serializationObject.isExposedOnFrame = true; - serializationObject.exposedPortPosition = this.exposedPortPosition; - } - return serializationObject; - } - /** - * Release resources - */ - dispose() { - this.onConnectionObservable.clear(); - this.onDisconnectionObservable.clear(); - } -}; +// node_modules/@babylonjs/core/Shaders/ShadersInclude/prePassDeclaration.js +var name9 = "prePassDeclaration"; +var shader9 = `#ifdef PREPASS +#extension GL_EXT_draw_buffers : require +layout(location=0) out highp vec4 glFragData[{X}];highp vec4 gl_FragColor; +#ifdef PREPASS_DEPTH +varying highp vec3 vViewPos; +#endif +#ifdef PREPASS_VELOCITY +varying highp vec4 vCurrentPosition;varying highp vec4 vPreviousPosition; +#endif +#endif +`; +ShaderStore.IncludesShadersStore[name9] = shader9; -// node_modules/@babylonjs/core/Materials/Node/nodeMaterialBlock.js -var NodeMaterialBlock = class { - /** - * Gets the name of the block - */ - get name() { - return this._name; - } - /** - * Sets the name of the block. Will check if the name is valid. - */ - set name(newName) { - if (!this.validateBlockName(newName)) { - return; - } - this._name = newName; - } - /** - * Gets a boolean indicating that this block can only be used once per NodeMaterial - */ - get isUnique() { - return this._isUnique; - } - /** - * Gets a boolean indicating that this block is an end block (e.g. it is generating a system value) - */ - get isFinalMerger() { - return this._isFinalMerger; - } - /** - * Gets a boolean indicating that this block is an input (e.g. it sends data to the shader) - */ - get isInput() { - return this._isInput; - } - /** - * Gets a boolean indicating if this block is a teleport out - */ - get isTeleportOut() { - return this._isTeleportOut; - } - /** - * Gets a boolean indicating if this block is a teleport in - */ - get isTeleportIn() { - return this._isTeleportIn; - } - /** - * Gets or sets the build Id - */ - get buildId() { - return this._buildId; - } - set buildId(value) { - this._buildId = value; - } - /** - * Gets or sets the target of the block - */ - get target() { - return this._target; - } - set target(value) { - if ((this._target & value) !== 0) { - return; - } - this._target = value; - } - /** - * Gets the list of input points - */ - get inputs() { - return this._inputs; - } - /** Gets the list of output points */ - get outputs() { - return this._outputs; - } - /** - * Find an input by its name - * @param name defines the name of the input to look for - * @returns the input or null if not found - */ - getInputByName(name69) { - const filter = this._inputs.filter((e) => e.name === name69); - if (filter.length) { - return filter[0]; - } - return null; - } - /** - * Find an output by its name - * @param name defines the name of the output to look for - * @returns the output or null if not found - */ - getOutputByName(name69) { - const filter = this._outputs.filter((e) => e.name === name69); - if (filter.length) { - return filter[0]; - } - return null; - } - /** - * Creates a new NodeMaterialBlock - * @param name defines the block name - * @param target defines the target of that block (Vertex by default) - * @param isFinalMerger defines a boolean indicating that this block is an end block (e.g. it is generating a system value). Default is false - */ - constructor(name69, target = NodeMaterialBlockTargets.Vertex, isFinalMerger = false) { - this._isFinalMerger = false; - this._isInput = false; - this._isTeleportOut = false; - this._isTeleportIn = false; - this._name = ""; - this._isUnique = false; - this.inputsAreExclusive = false; - this._codeVariableName = ""; - this._inputs = new Array(); - this._outputs = new Array(); - this.comments = ""; - this.visibleInInspector = false; - this.visibleOnFrame = false; - this._target = target; - this._originalTargetIsNeutral = target === NodeMaterialBlockTargets.Neutral; - this._isFinalMerger = isFinalMerger; - this._isInput = this.getClassName() === "InputBlock"; - this._isTeleportOut = this.getClassName() === "NodeMaterialTeleportOutBlock"; - this._isTeleportIn = this.getClassName() === "NodeMaterialTeleportInBlock"; - this._name = name69; - this.uniqueId = UniqueIdGenerator.UniqueId; - } - /** @internal */ - _setInitialTarget(target) { - this._target = target; - this._originalTargetIsNeutral = target === NodeMaterialBlockTargets.Neutral; - } - /** - * Initialize the block and prepare the context for build - * @param state defines the state that will be used for the build - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - initialize(state) { - } - /** - * Bind data to effect. Will only be called for blocks with isBindable === true - * @param effect defines the effect to bind data to - * @param nodeMaterial defines the hosting NodeMaterial - * @param mesh defines the mesh that will be rendered - * @param subMesh defines the submesh that will be rendered - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - bind(effect, nodeMaterial, mesh, subMesh) { - } - _declareOutput(output, state) { - return `${state._getGLType(output.type)} ${output.associatedVariableName}`; - } - _writeVariable(currentPoint) { - const connectionPoint = currentPoint.connectedPoint; - if (connectionPoint) { - return `${currentPoint.associatedVariableName}`; - } - return `0.`; - } - _writeFloat(value) { - let stringVersion = value.toString(); - if (stringVersion.indexOf(".") === -1) { - stringVersion += ".0"; - } - return `${stringVersion}`; - } - /** - * Gets the current class name e.g. "NodeMaterialBlock" - * @returns the class name - */ - getClassName() { - return "NodeMaterialBlock"; - } - /** Gets a boolean indicating that this connection will be used in the fragment shader - * @returns true if connected in fragment shader - */ - isConnectedInFragmentShader() { - return this.outputs.some((o) => o.isConnectedInFragmentShader); - } - /** - * Register a new input. Must be called inside a block constructor - * @param name defines the connection point name - * @param type defines the connection point type - * @param isOptional defines a boolean indicating that this input can be omitted - * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default) - * @param point an already created connection point. If not provided, create a new one - * @returns the current block - */ - registerInput(name69, type, isOptional = false, target, point) { - point = point ?? new NodeMaterialConnectionPoint(name69, this, NodeMaterialConnectionPointDirection.Input); - point.type = type; - point.isOptional = isOptional; - if (target) { - point.target = target; - } - this._inputs.push(point); - return this; - } - /** - * Register a new output. Must be called inside a block constructor - * @param name defines the connection point name - * @param type defines the connection point type - * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default) - * @param point an already created connection point. If not provided, create a new one - * @returns the current block - */ - registerOutput(name69, type, target, point) { - point = point ?? new NodeMaterialConnectionPoint(name69, this, NodeMaterialConnectionPointDirection.Output); - point.type = type; - if (target) { - point.target = target; - } - this._outputs.push(point); - return this; - } - /** - * Will return the first available input e.g. the first one which is not an uniform or an attribute - * @param forOutput defines an optional connection point to check compatibility with - * @returns the first available input or null - */ - getFirstAvailableInput(forOutput = null) { - for (const input of this._inputs) { - if (!input.connectedPoint) { - if (!forOutput || forOutput.type === input.type || input.type === NodeMaterialBlockConnectionPointTypes.AutoDetect) { - return input; - } - } - } - return null; - } - /** - * Will return the first available output e.g. the first one which is not yet connected and not a varying - * @param forBlock defines an optional block to check compatibility with - * @returns the first available input or null - */ - getFirstAvailableOutput(forBlock = null) { - for (const output of this._outputs) { - if (!forBlock || !forBlock.target || forBlock.target === NodeMaterialBlockTargets.Neutral || (forBlock.target & output.target) !== 0) { - return output; - } - } - return null; - } - /** - * Gets the sibling of the given output - * @param current defines the current output - * @returns the next output in the list or null - */ - getSiblingOutput(current) { - const index = this._outputs.indexOf(current); - if (index === -1 || index >= this._outputs.length) { - return null; - } - return this._outputs[index + 1]; - } - /** - * Checks if the current block is an ancestor of a given block - * @param block defines the potential descendant block to check - * @returns true if block is a descendant - */ - isAnAncestorOf(block) { - for (const output of this._outputs) { - if (!output.hasEndpoints) { - continue; - } - for (const endpoint of output.endpoints) { - if (endpoint.ownerBlock === block) { - return true; - } - if (endpoint.ownerBlock.isAnAncestorOf(block)) { - return true; - } - } - } - return false; - } - /** - * Connect current block with another block - * @param other defines the block to connect with - * @param options define the various options to help pick the right connections - * @param options.input - * @param options.output - * @param options.outputSwizzle - * @returns the current block - */ - connectTo(other, options) { - if (this._outputs.length === 0) { - return; - } - let output = options && options.output ? this.getOutputByName(options.output) : this.getFirstAvailableOutput(other); - let notFound = true; - while (notFound) { - const input = options && options.input ? other.getInputByName(options.input) : other.getFirstAvailableInput(output); - if (output && input && output.canConnectTo(input)) { - output.connectTo(input); - notFound = false; - } else if (!output) { - throw "Unable to find a compatible match"; - } else { - output = this.getSiblingOutput(output); - } - } - return this; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _buildBlock(state) { - } - /** - * Add uniforms, samplers and uniform buffers at compilation time - * @param state defines the state to update - * @param nodeMaterial defines the node material requesting the update - * @param defines defines the material defines to update - * @param uniformBuffers defines the list of uniform buffer names - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - updateUniformsAndSamples(state, nodeMaterial, defines, uniformBuffers) { - } - /** - * Add potential fallbacks if shader compilation fails - * @param mesh defines the mesh to be rendered - * @param fallbacks defines the current prioritized list of fallbacks - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - provideFallbacks(mesh, fallbacks) { - } - /** - * Initialize defines for shader compilation - * @param mesh defines the mesh to be rendered - * @param nodeMaterial defines the node material requesting the update - * @param defines defines the material defines to update - * @param useInstances specifies that instances should be used - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - initializeDefines(mesh, nodeMaterial, defines, useInstances = false) { - } - /** - * Update defines for shader compilation - * @param mesh defines the mesh to be rendered - * @param nodeMaterial defines the node material requesting the update - * @param defines defines the material defines to update - * @param useInstances specifies that instances should be used - * @param subMesh defines which submesh to render - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - prepareDefines(mesh, nodeMaterial, defines, useInstances = false, subMesh) { - } - /** - * Lets the block try to connect some inputs automatically - * @param material defines the hosting NodeMaterial - * @param additionalFilteringInfo optional additional filtering condition when looking for compatible blocks - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - autoConfigure(material, additionalFilteringInfo = () => true) { - } - /** - * Function called when a block is declared as repeatable content generator - * @param vertexShaderState defines the current compilation state for the vertex shader - * @param fragmentShaderState defines the current compilation state for the fragment shader - * @param mesh defines the mesh to be rendered - * @param defines defines the material defines to update - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - replaceRepeatableContent(vertexShaderState, fragmentShaderState, mesh, defines) { - } - /** Gets a boolean indicating that the code of this block will be promoted to vertex shader even if connected to fragment output */ - get willBeGeneratedIntoVertexShaderFromFragmentShader() { - if (this.isInput || this.isFinalMerger) { - return false; - } - if (this._outputs.some((o) => o.isDirectlyConnectedToVertexOutput)) { - return false; - } - if (this.target === NodeMaterialBlockTargets.Vertex) { - return false; - } - if (this.target === NodeMaterialBlockTargets.VertexAndFragment || this.target === NodeMaterialBlockTargets.Neutral) { - if (this._outputs.some((o) => o.isConnectedInVertexShader)) { - return true; - } - } - return false; - } - /** - * Checks if the block is ready - * @param mesh defines the mesh to be rendered - * @param nodeMaterial defines the node material requesting the update - * @param defines defines the material defines to update - * @param useInstances specifies that instances should be used - * @returns true if the block is ready - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - isReady(mesh, nodeMaterial, defines, useInstances = false) { - return true; - } - _linkConnectionTypes(inputIndex0, inputIndex1, looseCoupling = false) { - if (looseCoupling) { - this._inputs[inputIndex1]._acceptedConnectionPointType = this._inputs[inputIndex0]; - } else { - this._inputs[inputIndex0]._linkedConnectionSource = this._inputs[inputIndex1]; - } - this._inputs[inputIndex1]._linkedConnectionSource = this._inputs[inputIndex0]; - } - _processBuild(block, state, input, activeBlocks) { - block.build(state, activeBlocks); - const localBlockIsFragment = state._vertexState != null; - const otherBlockWasGeneratedInVertexShader = block._buildTarget === NodeMaterialBlockTargets.Vertex && block.target !== NodeMaterialBlockTargets.VertexAndFragment; - if (localBlockIsFragment && ((block.target & block._buildTarget) === 0 || (block.target & input.target) === 0 || this.target !== NodeMaterialBlockTargets.VertexAndFragment && otherBlockWasGeneratedInVertexShader)) { - if (!block.isInput && state.target !== block._buildTarget || // block was already emitted by vertex shader - block.isInput && block.isAttribute && !block._noContextSwitch) { - const connectedPoint = input.connectedPoint; - if (state._vertexState._emitVaryingFromString("v_" + connectedPoint.associatedVariableName, state._getGLType(connectedPoint.type))) { - state._vertexState.compilationString += `${"v_" + connectedPoint.associatedVariableName} = ${connectedPoint.associatedVariableName}; -`; - } - input.associatedVariableName = "v_" + connectedPoint.associatedVariableName; - input._enforceAssociatedVariableName = true; - } - } - } - /** - * Validates the new name for the block node. - * @param newName the new name to be given to the node. - * @returns false if the name is a reserve word, else true. - */ - validateBlockName(newName) { - const reservedNames = [ - "position", - "normal", - "tangent", - "particle_positionw", - "uv", - "uv2", - "uv3", - "uv4", - "uv5", - "uv6", - "position2d", - "particle_uv", - "matricesIndices", - "matricesWeights", - "world0", - "world1", - "world2", - "world3", - "particle_color", - "particle_texturemask" - ]; - for (const reservedName of reservedNames) { - if (newName === reservedName) { - return false; - } - } - return true; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _customBuildStep(state, activeBlocks) { - } - /** - * Compile the current node and generate the shader code - * @param state defines the current compilation state (uniforms, samplers, current string) - * @param activeBlocks defines the list of active blocks (i.e. blocks to compile) - * @returns true if already built - */ - build(state, activeBlocks) { - if (this._buildId === state.sharedData.buildId) { - return true; - } - if (!this.isInput) { - for (const output of this._outputs) { - if (!output.associatedVariableName) { - output.associatedVariableName = state._getFreeVariableName(output.name); - } - } - } - for (const input of this._inputs) { - if (!input.connectedPoint) { - if (!input.isOptional) { - state.sharedData.checks.notConnectedNonOptionalInputs.push(input); - } - continue; - } - if (this.target !== NodeMaterialBlockTargets.Neutral) { - if ((input.target & this.target) === 0) { - continue; - } - if ((input.target & state.target) === 0) { - continue; - } - } - const block = input.connectedPoint.ownerBlock; - if (block && block !== this) { - this._processBuild(block, state, input, activeBlocks); - } - } - this._customBuildStep(state, activeBlocks); - if (this._buildId === state.sharedData.buildId) { - return true; - } - if (state.sharedData.verbose) { - Logger.Log(`${state.target === NodeMaterialBlockTargets.Vertex ? "Vertex shader" : "Fragment shader"}: Building ${this.name} [${this.getClassName()}]`); - } - if (this.isFinalMerger) { - switch (state.target) { - case NodeMaterialBlockTargets.Vertex: - state.sharedData.checks.emitVertex = true; - break; - case NodeMaterialBlockTargets.Fragment: - state.sharedData.checks.emitFragment = true; - break; - } - } - if (!this.isInput && state.sharedData.emitComments) { - state.compilationString += ` -//${this.name} -`; - } - this._buildBlock(state); - this._buildId = state.sharedData.buildId; - this._buildTarget = state.target; - for (const output of this._outputs) { - if ((output.target & state.target) === 0) { - continue; - } - for (const endpoint of output.endpoints) { - const block = endpoint.ownerBlock; - if (block && (block.target & state.target) !== 0 && activeBlocks.indexOf(block) !== -1) { - this._processBuild(block, state, endpoint, activeBlocks); - } - } - } - return false; - } - _inputRename(name69) { - return name69; - } - _outputRename(name69) { - return name69; - } - _dumpPropertiesCode() { - const variableName = this._codeVariableName; - return `${variableName}.visibleInInspector = ${this.visibleInInspector}; -${variableName}.visibleOnFrame = ${this.visibleOnFrame}; -${variableName}.target = ${this.target}; -`; - } - /** - * @internal - */ - _dumpCode(uniqueNames, alreadyDumped) { - alreadyDumped.push(this); - const nameAsVariableName = this.name.replace(/[^A-Za-z_]+/g, ""); - this._codeVariableName = nameAsVariableName || `${this.getClassName()}_${this.uniqueId}`; - if (uniqueNames.indexOf(this._codeVariableName) !== -1) { - let index = 0; - do { - index++; - this._codeVariableName = nameAsVariableName + index; - } while (uniqueNames.indexOf(this._codeVariableName) !== -1); - } - uniqueNames.push(this._codeVariableName); - let codeString = ` -// ${this.getClassName()} +// node_modules/@babylonjs/core/Shaders/ShadersInclude/oitDeclaration.js +var name10 = "oitDeclaration"; +var shader10 = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY +#extension GL_EXT_draw_buffers : require +layout(location=0) out vec2 depth; +layout(location=1) out vec4 frontColor;layout(location=2) out vec4 backColor; +#define MAX_DEPTH 99999.0 +highp vec4 gl_FragColor;uniform sampler2D oitDepthSampler;uniform sampler2D oitFrontColorSampler; +#endif `; - if (this.comments) { - codeString += `// ${this.comments} +ShaderStore.IncludesShadersStore[name10] = shader10; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/mainUVVaryingDeclaration.js +var name11 = "mainUVVaryingDeclaration"; +var shader11 = `#ifdef MAINUV{X} +varying vec2 vMainUV{X}; +#endif `; - } - codeString += `var ${this._codeVariableName} = new BABYLON.${this.getClassName()}("${this.name}"); +ShaderStore.IncludesShadersStore[name11] = shader11; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/lightFragmentDeclaration.js +var name12 = "lightFragmentDeclaration"; +var shader12 = `#ifdef LIGHT{X} +uniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X}; +#ifdef SPECULARTERM +uniform vec4 vLightSpecular{X}; +#else +vec4 vLightSpecular{X}=vec4(0.); +#endif +#ifdef SHADOW{X} +#ifdef SHADOWCSM{X} +uniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];uniform float viewFrustumZ{X}[SHADOWCSMNUM_CASCADES{X}];uniform float frustumLengths{X}[SHADOWCSMNUM_CASCADES{X}];uniform float cascadeBlendFactor{X};varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X}; +#if defined(SHADOWPCSS{X}) +uniform highp sampler2DArrayShadow shadowSampler{X};uniform highp sampler2DArray depthSampler{X};uniform vec2 lightSizeUVCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float depthCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float penumbraDarkness{X}; +#elif defined(SHADOWPCF{X}) +uniform highp sampler2DArrayShadow shadowSampler{X}; +#else +uniform highp sampler2DArray shadowSampler{X}; +#endif +#ifdef SHADOWCSMDEBUG{X} +const vec3 vCascadeColorsMultiplier{X}[8]=vec3[8] +( +vec3 ( 1.5,0.0,0.0 ), +vec3 ( 0.0,1.5,0.0 ), +vec3 ( 0.0,0.0,5.5 ), +vec3 ( 1.5,0.0,5.5 ), +vec3 ( 1.5,1.5,0.0 ), +vec3 ( 1.0,1.0,1.0 ), +vec3 ( 0.0,1.0,5.5 ), +vec3 ( 0.5,3.5,0.75 ) +);vec3 shadowDebug{X}; +#endif +#ifdef SHADOWCSMUSESHADOWMAXZ{X} +int index{X}=-1; +#else +int index{X}=SHADOWCSMNUM_CASCADES{X}-1; +#endif +float diff{X}=0.; +#elif defined(SHADOWCUBE{X}) +uniform samplerCube shadowSampler{X}; +#else +varying vec4 vPositionFromLight{X};varying float vDepthMetric{X}; +#if defined(SHADOWPCSS{X}) +uniform highp sampler2DShadow shadowSampler{X};uniform highp sampler2D depthSampler{X}; +#elif defined(SHADOWPCF{X}) +uniform highp sampler2DShadow shadowSampler{X}; +#else +uniform sampler2D shadowSampler{X}; +#endif +uniform mat4 lightMatrix{X}; +#endif +uniform vec4 shadowsInfo{X};uniform vec2 depthValues{X}; +#endif +#ifdef SPOTLIGHT{X} +uniform vec4 vLightDirection{X};uniform vec4 vLightFalloff{X}; +#elif defined(POINTLIGHT{X}) +uniform vec4 vLightFalloff{X}; +#elif defined(HEMILIGHT{X}) +uniform vec3 vLightGround{X}; +#endif +#ifdef PROJECTEDLIGHTTEXTURE{X} +uniform mat4 textureProjectionMatrix{X};uniform sampler2D projectionLightSampler{X}; +#endif +#endif `; - codeString += this._dumpPropertiesCode(); - for (const input of this.inputs) { - if (!input.isConnected) { - continue; - } - const connectedOutput = input.connectedPoint; - const connectedBlock = connectedOutput.ownerBlock; - if (alreadyDumped.indexOf(connectedBlock) === -1) { - codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped); - } - } - for (const output of this.outputs) { - if (!output.hasEndpoints) { - continue; - } - for (const endpoint of output.endpoints) { - const connectedBlock = endpoint.ownerBlock; - if (connectedBlock && alreadyDumped.indexOf(connectedBlock) === -1) { - codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped); - } - } - } - return codeString; - } - /** - * @internal - */ - _dumpCodeForOutputConnections(alreadyDumped) { - let codeString = ""; - if (alreadyDumped.indexOf(this) !== -1) { - return codeString; - } - alreadyDumped.push(this); - for (const input of this.inputs) { - if (!input.isConnected) { - continue; - } - const connectedOutput = input.connectedPoint; - const connectedBlock = connectedOutput.ownerBlock; - codeString += connectedBlock._dumpCodeForOutputConnections(alreadyDumped); - codeString += `${connectedBlock._codeVariableName}.${connectedBlock._outputRename(connectedOutput.name)}.connectTo(${this._codeVariableName}.${this._inputRename(input.name)}); +ShaderStore.IncludesShadersStore[name12] = shader12; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/lightUboDeclaration.js +var name13 = "lightUboDeclaration"; +var shader13 = `#ifdef LIGHT{X} +uniform Light{X} +{vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular; +#ifdef SPOTLIGHT{X} +vec4 vLightDirection;vec4 vLightFalloff; +#elif defined(POINTLIGHT{X}) +vec4 vLightFalloff; +#elif defined(HEMILIGHT{X}) +vec3 vLightGround; +#endif +vec4 shadowsInfo;vec2 depthValues;} light{X}; +#ifdef PROJECTEDLIGHTTEXTURE{X} +uniform mat4 textureProjectionMatrix{X};uniform sampler2D projectionLightSampler{X}; +#endif +#ifdef SHADOW{X} +#ifdef SHADOWCSM{X} +uniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];uniform float viewFrustumZ{X}[SHADOWCSMNUM_CASCADES{X}];uniform float frustumLengths{X}[SHADOWCSMNUM_CASCADES{X}];uniform float cascadeBlendFactor{X};varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X}; +#if defined(SHADOWPCSS{X}) +uniform highp sampler2DArrayShadow shadowSampler{X};uniform highp sampler2DArray depthSampler{X};uniform vec2 lightSizeUVCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float depthCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float penumbraDarkness{X}; +#elif defined(SHADOWPCF{X}) +uniform highp sampler2DArrayShadow shadowSampler{X}; +#else +uniform highp sampler2DArray shadowSampler{X}; +#endif +#ifdef SHADOWCSMDEBUG{X} +const vec3 vCascadeColorsMultiplier{X}[8]=vec3[8] +( +vec3 ( 1.5,0.0,0.0 ), +vec3 ( 0.0,1.5,0.0 ), +vec3 ( 0.0,0.0,5.5 ), +vec3 ( 1.5,0.0,5.5 ), +vec3 ( 1.5,1.5,0.0 ), +vec3 ( 1.0,1.0,1.0 ), +vec3 ( 0.0,1.0,5.5 ), +vec3 ( 0.5,3.5,0.75 ) +);vec3 shadowDebug{X}; +#endif +#ifdef SHADOWCSMUSESHADOWMAXZ{X} +int index{X}=-1; +#else +int index{X}=SHADOWCSMNUM_CASCADES{X}-1; +#endif +float diff{X}=0.; +#elif defined(SHADOWCUBE{X}) +uniform samplerCube shadowSampler{X}; +#else +varying vec4 vPositionFromLight{X};varying float vDepthMetric{X}; +#if defined(SHADOWPCSS{X}) +uniform highp sampler2DShadow shadowSampler{X};uniform highp sampler2D depthSampler{X}; +#elif defined(SHADOWPCF{X}) +uniform highp sampler2DShadow shadowSampler{X}; +#else +uniform sampler2D shadowSampler{X}; +#endif +uniform mat4 lightMatrix{X}; +#endif +#endif +#endif `; - } - return codeString; - } - /** - * Clone the current block to a new identical block - * @param scene defines the hosting scene - * @param rootUrl defines the root URL to use to load textures and relative dependencies - * @returns a copy of the current block - */ - clone(scene, rootUrl = "") { - const serializationObject = this.serialize(); - const blockType = GetClass(serializationObject.customType); - if (blockType) { - const block = new blockType(); - block._deserialize(serializationObject, scene, rootUrl); - return block; - } - return null; - } - /** - * Serializes this block in a JSON representation - * @returns the serialized block object - */ - serialize() { - const serializationObject = {}; - serializationObject.customType = "BABYLON." + this.getClassName(); - serializationObject.id = this.uniqueId; - serializationObject.name = this.name; - serializationObject.comments = this.comments; - serializationObject.visibleInInspector = this.visibleInInspector; - serializationObject.visibleOnFrame = this.visibleOnFrame; - serializationObject.target = this.target; - serializationObject.inputs = []; - serializationObject.outputs = []; - for (const input of this.inputs) { - serializationObject.inputs.push(input.serialize()); - } - for (const output of this.outputs) { - serializationObject.outputs.push(output.serialize(false)); - } - return serializationObject; - } - /** - * @internal - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _deserialize(serializationObject, scene, rootUrl) { - this.name = serializationObject.name; - this.comments = serializationObject.comments; - this.visibleInInspector = !!serializationObject.visibleInInspector; - this.visibleOnFrame = !!serializationObject.visibleOnFrame; - this._target = serializationObject.target ?? this.target; - this._deserializePortDisplayNamesAndExposedOnFrame(serializationObject); - } - _deserializePortDisplayNamesAndExposedOnFrame(serializationObject) { - const serializedInputs = serializationObject.inputs; - const serializedOutputs = serializationObject.outputs; - if (serializedInputs) { - serializedInputs.forEach((port, i) => { - if (port.displayName) { - this.inputs[i].displayName = port.displayName; - } - if (port.isExposedOnFrame) { - this.inputs[i].isExposedOnFrame = port.isExposedOnFrame; - this.inputs[i].exposedPortPosition = port.exposedPortPosition; - } - }); - } - if (serializedOutputs) { - serializedOutputs.forEach((port, i) => { - if (port.displayName) { - this.outputs[i].displayName = port.displayName; - } - if (port.isExposedOnFrame) { - this.outputs[i].isExposedOnFrame = port.isExposedOnFrame; - this.outputs[i].exposedPortPosition = port.exposedPortPosition; - } - }); - } - } - /** - * Release resources - */ - dispose() { - for (const input of this.inputs) { - input.dispose(); - } - for (const output of this.outputs) { - output.dispose(); - } - } -}; +ShaderStore.IncludesShadersStore[name13] = shader13; -// node_modules/@babylonjs/core/Materials/Node/Blocks/transformBlock.js -var TransformBlock = class extends NodeMaterialBlock { - /** - * Creates a new TransformBlock - * @param name defines the block name - */ - constructor(name69) { - super(name69, NodeMaterialBlockTargets.Neutral); - this.complementW = 1; - this.complementZ = 0; - this.target = NodeMaterialBlockTargets.Vertex; - this.registerInput("vector", NodeMaterialBlockConnectionPointTypes.AutoDetect); - this.registerInput("transform", NodeMaterialBlockConnectionPointTypes.Matrix); - this.registerOutput("output", NodeMaterialBlockConnectionPointTypes.Vector4); - this.registerOutput("xyz", NodeMaterialBlockConnectionPointTypes.Vector3); - this._inputs[0].onConnectionObservable.add((other) => { - if (other.ownerBlock.isInput) { - const otherAsInput = other.ownerBlock; - if (otherAsInput.name === "normal" || otherAsInput.name === "tangent") { - this.complementW = 0; - } - } - }); - } - /** - * Gets the current class name - * @returns the class name - */ - getClassName() { - return "TransformBlock"; - } - /** - * Gets the vector input - */ - get vector() { - return this._inputs[0]; - } - /** - * Gets the output component - */ - get output() { - return this._outputs[0]; - } - /** - * Gets the xyz output component - */ - get xyz() { - return this._outputs[1]; - } - /** - * Gets the matrix transform input - */ - get transform() { - return this._inputs[1]; - } - _buildBlock(state) { - super._buildBlock(state); - const vector = this.vector; - const transform = this.transform; - if (vector.connectedPoint) { - if (this.complementW === 0) { - const comments = `//${this.name}`; - state._emitFunctionFromInclude("helperFunctions", comments); - state.sharedData.blocksWithDefines.push(this); - const transformName = state._getFreeVariableName(`${transform.associatedVariableName}_NUS`); - state.compilationString += `mat3 ${transformName} = mat3(${transform.associatedVariableName}); -`; - state.compilationString += `#ifdef NONUNIFORMSCALING -`; - state.compilationString += `${transformName} = transposeMat3(inverseMat3(${transformName})); -`; - state.compilationString += `#endif -`; - switch (vector.connectedPoint.type) { - case NodeMaterialBlockConnectionPointTypes.Vector2: - state.compilationString += this._declareOutput(this.output, state) + ` = vec4(${transformName} * vec3(${vector.associatedVariableName}, ${this._writeFloat(this.complementZ)}), ${this._writeFloat(this.complementW)}); -`; - break; - case NodeMaterialBlockConnectionPointTypes.Vector3: - case NodeMaterialBlockConnectionPointTypes.Color3: - state.compilationString += this._declareOutput(this.output, state) + ` = vec4(${transformName} * ${vector.associatedVariableName}, ${this._writeFloat(this.complementW)}); -`; - break; - default: - state.compilationString += this._declareOutput(this.output, state) + ` = vec4(${transformName} * ${vector.associatedVariableName}.xyz, ${this._writeFloat(this.complementW)}); -`; - break; - } - } else { - const transformName = transform.associatedVariableName; - switch (vector.connectedPoint.type) { - case NodeMaterialBlockConnectionPointTypes.Vector2: - state.compilationString += this._declareOutput(this.output, state) + ` = ${transformName} * vec4(${vector.associatedVariableName}, ${this._writeFloat(this.complementZ)}, ${this._writeFloat(this.complementW)}); -`; - break; - case NodeMaterialBlockConnectionPointTypes.Vector3: - case NodeMaterialBlockConnectionPointTypes.Color3: - state.compilationString += this._declareOutput(this.output, state) + ` = ${transformName} * vec4(${vector.associatedVariableName}, ${this._writeFloat(this.complementW)}); +// node_modules/@babylonjs/core/Shaders/ShadersInclude/lightsFragmentFunctions.js +var name14 = "lightsFragmentFunctions"; +var shader14 = `struct lightingInfo +{vec3 diffuse; +#ifdef SPECULARTERM +vec3 specular; +#endif +#ifdef NDOTL +float ndl; +#endif +};lightingInfo computeLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {lightingInfo result;vec3 lightVectorW;float attenuation=1.0;if (lightData.w==0.) +{vec3 direction=lightData.xyz-vPositionW;attenuation=max(0.,1.0-length(direction)/range);lightVectorW=normalize(direction);} +else +{lightVectorW=normalize(-lightData.xyz);} +float ndl=max(0.,dot(vNormal,lightVectorW)); +#ifdef NDOTL +result.ndl=ndl; +#endif +result.diffuse=ndl*diffuseColor*attenuation; +#ifdef SPECULARTERM +vec3 angleW=normalize(viewDirectionW+lightVectorW);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor*attenuation; +#endif +return result;} +lightingInfo computeSpotLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec4 lightDirection,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {lightingInfo result;vec3 direction=lightData.xyz-vPositionW;vec3 lightVectorW=normalize(direction);float attenuation=max(0.,1.0-length(direction)/range);float cosAngle=max(0.,dot(lightDirection.xyz,-lightVectorW));if (cosAngle>=lightDirection.w) +{cosAngle=max(0.,pow(cosAngle,lightData.w));attenuation*=cosAngle;float ndl=max(0.,dot(vNormal,lightVectorW)); +#ifdef NDOTL +result.ndl=ndl; +#endif +result.diffuse=ndl*diffuseColor*attenuation; +#ifdef SPECULARTERM +vec3 angleW=normalize(viewDirectionW+lightVectorW);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor*attenuation; +#endif +return result;} +result.diffuse=vec3(0.); +#ifdef SPECULARTERM +result.specular=vec3(0.); +#endif +#ifdef NDOTL +result.ndl=0.; +#endif +return result;} +lightingInfo computeHemisphericLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,vec3 groundColor,float glossiness) {lightingInfo result;float ndl=dot(vNormal,lightData.xyz)*0.5+0.5; +#ifdef NDOTL +result.ndl=ndl; +#endif +result.diffuse=mix(groundColor,diffuseColor,ndl); +#ifdef SPECULARTERM +vec3 angleW=normalize(viewDirectionW+lightData.xyz);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor; +#endif +return result;} +#define inline +vec3 computeProjectionTextureDiffuseLighting(sampler2D projectionLightSampler,mat4 textureProjectionMatrix){vec4 strq=textureProjectionMatrix*vec4(vPositionW,1.0);strq/=strq.w;vec3 textureColor=texture2D(projectionLightSampler,strq.xy).rgb;return textureColor;}`; +ShaderStore.IncludesShadersStore[name14] = shader14; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/shadowsFragmentFunctions.js +var name15 = "shadowsFragmentFunctions"; +var shader15 = `#ifdef SHADOWS +#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE) +#define TEXTUREFUNC(s,c,l) texture2DLodEXT(s,c,l) +#else +#define TEXTUREFUNC(s,c,b) texture2D(s,c,b) +#endif +#ifndef SHADOWFLOAT +float unpack(vec4 color) +{const vec4 bit_shift=vec4(1.0/(255.0*255.0*255.0),1.0/(255.0*255.0),1.0/255.0,1.0);return dot(color,bit_shift);} +#endif +float computeFallOff(float value,vec2 clipSpace,float frustumEdgeFalloff) +{float mask=smoothstep(1.0-frustumEdgeFalloff,1.00000012,clamp(dot(clipSpace,clipSpace),0.,1.));return mix(value,1.0,mask);} +#define inline +float computeShadowCube(vec3 worldPos,vec3 lightPosition,samplerCube shadowSampler,float darkness,vec2 depthValues) +{vec3 directionToLight=worldPos-lightPosition;float depth=length(directionToLight);depth=(depth+depthValues.x)/(depthValues.y);depth=clamp(depth,0.,1.0);directionToLight=normalize(directionToLight);directionToLight.y=-directionToLight.y; +#ifndef SHADOWFLOAT +float shadow=unpack(textureCube(shadowSampler,directionToLight)); +#else +float shadow=textureCube(shadowSampler,directionToLight).x; +#endif +return depth>shadow ? darkness : 1.0;} +#define inline +float computeShadowWithPoissonSamplingCube(vec3 worldPos,vec3 lightPosition,samplerCube shadowSampler,float mapSize,float darkness,vec2 depthValues) +{vec3 directionToLight=worldPos-lightPosition;float depth=length(directionToLight);depth=(depth+depthValues.x)/(depthValues.y);depth=clamp(depth,0.,1.0);directionToLight=normalize(directionToLight);directionToLight.y=-directionToLight.y;float visibility=1.;vec3 poissonDisk[4];poissonDisk[0]=vec3(-1.0,1.0,-1.0);poissonDisk[1]=vec3(1.0,-1.0,-1.0);poissonDisk[2]=vec3(-1.0,-1.0,-1.0);poissonDisk[3]=vec3(1.0,-1.0,1.0); +#ifndef SHADOWFLOAT +if (unpack(textureCube(shadowSampler,directionToLight+poissonDisk[0]*mapSize))shadow ? computeFallOff(darkness,clipSpace.xy,frustumEdgeFalloff) : 1.;} +#endif +#define inline +float computeShadow(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float frustumEdgeFalloff) +{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0) +{return 1.0;} +else +{float shadowPixelDepth=clamp(depthMetric,0.,1.0); +#ifndef SHADOWFLOAT +float shadow=unpack(TEXTUREFUNC(shadowSampler,uv,0.)); +#else +float shadow=TEXTUREFUNC(shadowSampler,uv,0.).x; +#endif +return shadowPixelDepth>shadow ? computeFallOff(darkness,clipSpace.xy,frustumEdgeFalloff) : 1.;}} +#define inline +float computeShadowWithPoissonSampling(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float mapSize,float darkness,float frustumEdgeFalloff) +{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0) +{return 1.0;} +else +{float shadowPixelDepth=clamp(depthMetric,0.,1.0);float visibility=1.;vec2 poissonDisk[4];poissonDisk[0]=vec2(-0.94201624,-0.39906216);poissonDisk[1]=vec2(0.94558609,-0.76890725);poissonDisk[2]=vec2(-0.094184101,-0.92938870);poissonDisk[3]=vec2(0.34495938,0.29387760); +#ifndef SHADOWFLOAT +if (unpack(TEXTUREFUNC(shadowSampler,uv+poissonDisk[0]*mapSize,0.))1.0 || uv.y<0. || uv.y>1.0) +{return 1.0;} +else +{float shadowPixelDepth=clamp(depthMetric,0.,1.0); +#ifndef SHADOWFLOAT +float shadowMapSample=unpack(TEXTUREFUNC(shadowSampler,uv,0.)); +#else +float shadowMapSample=TEXTUREFUNC(shadowSampler,uv,0.).x; +#endif +float esm=1.0-clamp(exp(min(87.,depthScale*shadowPixelDepth))*shadowMapSample,0.,1.-darkness);return computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);}} +#define inline +float computeShadowWithCloseESM(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float depthScale,float frustumEdgeFalloff) +{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0) +{return 1.0;} +else +{float shadowPixelDepth=clamp(depthMetric,0.,1.0); +#ifndef SHADOWFLOAT +float shadowMapSample=unpack(TEXTUREFUNC(shadowSampler,uv,0.)); +#else +float shadowMapSample=TEXTUREFUNC(shadowSampler,uv,0.).x; +#endif +float esm=clamp(exp(min(87.,-depthScale*(shadowPixelDepth-shadowMapSample))),darkness,1.);return computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);}} +#ifdef IS_NDC_HALF_ZRANGE +#define ZINCLIP clipSpace.z +#else +#define ZINCLIP uvDepth.z +#endif +#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE) +#define GREATEST_LESS_THAN_ONE 0.99999994 +/* disable_uniformity_analysis */ +#define inline +float computeShadowWithCSMPCF1(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,float darkness,float frustumEdgeFalloff) +{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec4 uvDepthLayer=vec4(uvDepth.x,uvDepth.y,layer,uvDepth.z);float shadow=texture2D(shadowSampler,uvDepthLayer);shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);} +#define inline +float computeShadowWithCSMPCF3(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff) +{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; +uv+=0.5; +vec2 st=fract(uv); +vec2 base_uv=floor(uv)-0.5; +base_uv*=shadowMapSizeAndInverse.y; +vec2 uvw0=3.-2.*st;vec2 uvw1=1.+2.*st;vec2 u=vec2((2.-st.x)/uvw0.x-1.,st.x/uvw1.x+1.)*shadowMapSizeAndInverse.y;vec2 v=vec2((2.-st.y)/uvw0.y-1.,st.y/uvw1.y+1.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[0]),layer,uvDepth.z));shadow+=uvw1.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[0]),layer,uvDepth.z));shadow+=uvw0.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[1]),layer,uvDepth.z));shadow+=uvw1.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[1]),layer,uvDepth.z));shadow=shadow/16.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);} +#define inline +float computeShadowWithCSMPCF5(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff) +{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; +uv+=0.5; +vec2 st=fract(uv); +vec2 base_uv=floor(uv)-0.5; +base_uv*=shadowMapSizeAndInverse.y; +vec2 uvw0=4.-3.*st;vec2 uvw1=vec2(7.);vec2 uvw2=1.+3.*st;vec3 u=vec3((3.-2.*st.x)/uvw0.x-2.,(3.+st.x)/uvw1.x,st.x/uvw2.x+2.)*shadowMapSizeAndInverse.y;vec3 v=vec3((3.-2.*st.y)/uvw0.y-2.,(3.+st.y)/uvw1.y,st.y/uvw2.y+2.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[0]),layer,uvDepth.z));shadow+=uvw1.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[0]),layer,uvDepth.z));shadow+=uvw2.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[0]),layer,uvDepth.z));shadow+=uvw0.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[1]),layer,uvDepth.z));shadow+=uvw1.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[1]),layer,uvDepth.z));shadow+=uvw2.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[1]),layer,uvDepth.z));shadow+=uvw0.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[2]),layer,uvDepth.z));shadow+=uvw1.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[2]),layer,uvDepth.z));shadow+=uvw2.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[2]),layer,uvDepth.z));shadow=shadow/144.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);} +#define inline +float computeShadowWithPCF1(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,float darkness,float frustumEdgeFalloff) +{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;} +else +{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;float shadow=TEXTUREFUNC(shadowSampler,uvDepth,0.);shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}} +#define inline +float computeShadowWithPCF3(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff) +{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;} +else +{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; +uv+=0.5; +vec2 st=fract(uv); +vec2 base_uv=floor(uv)-0.5; +base_uv*=shadowMapSizeAndInverse.y; +vec2 uvw0=3.-2.*st;vec2 uvw1=1.+2.*st;vec2 u=vec2((2.-st.x)/uvw0.x-1.,st.x/uvw1.x+1.)*shadowMapSizeAndInverse.y;vec2 v=vec2((2.-st.y)/uvw0.y-1.,st.y/uvw1.y+1.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[0]),uvDepth.z),0.);shadow+=uvw1.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[0]),uvDepth.z),0.);shadow+=uvw0.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[1]),uvDepth.z),0.);shadow+=uvw1.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[1]),uvDepth.z),0.);shadow=shadow/16.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}} +#define inline +float computeShadowWithPCF5(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff) +{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;} +else +{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; +uv+=0.5; +vec2 st=fract(uv); +vec2 base_uv=floor(uv)-0.5; +base_uv*=shadowMapSizeAndInverse.y; +vec2 uvw0=4.-3.*st;vec2 uvw1=vec2(7.);vec2 uvw2=1.+3.*st;vec3 u=vec3((3.-2.*st.x)/uvw0.x-2.,(3.+st.x)/uvw1.x,st.x/uvw2.x+2.)*shadowMapSizeAndInverse.y;vec3 v=vec3((3.-2.*st.y)/uvw0.y-2.,(3.+st.y)/uvw1.y,st.y/uvw2.y+2.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[0]),uvDepth.z),0.);shadow+=uvw1.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[0]),uvDepth.z),0.);shadow+=uvw2.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[0]),uvDepth.z),0.);shadow+=uvw0.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[1]),uvDepth.z),0.);shadow+=uvw1.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[1]),uvDepth.z),0.);shadow+=uvw2.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[1]),uvDepth.z),0.);shadow+=uvw0.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[2]),uvDepth.z),0.);shadow+=uvw1.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[2]),uvDepth.z),0.);shadow+=uvw2.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[2]),uvDepth.z),0.);shadow=shadow/144.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}} +const vec3 PoissonSamplers32[64]=vec3[64]( +vec3(0.06407013,0.05409927,0.), +vec3(0.7366577,0.5789394,0.), +vec3(-0.6270542,-0.5320278,0.), +vec3(-0.4096107,0.8411095,0.), +vec3(0.6849564,-0.4990818,0.), +vec3(-0.874181,-0.04579735,0.), +vec3(0.9989998,0.0009880066,0.), +vec3(-0.004920578,-0.9151649,0.), +vec3(0.1805763,0.9747483,0.), +vec3(-0.2138451,0.2635818,0.), +vec3(0.109845,0.3884785,0.), +vec3(0.06876755,-0.3581074,0.), +vec3(0.374073,-0.7661266,0.), +vec3(0.3079132,-0.1216763,0.), +vec3(-0.3794335,-0.8271583,0.), +vec3(-0.203878,-0.07715034,0.), +vec3(0.5912697,0.1469799,0.), +vec3(-0.88069,0.3031784,0.), +vec3(0.5040108,0.8283722,0.), +vec3(-0.5844124,0.5494877,0.), +vec3(0.6017799,-0.1726654,0.), +vec3(-0.5554981,0.1559997,0.), +vec3(-0.3016369,-0.3900928,0.), +vec3(-0.5550632,-0.1723762,0.), +vec3(0.925029,0.2995041,0.), +vec3(-0.2473137,0.5538505,0.), +vec3(0.9183037,-0.2862392,0.), +vec3(0.2469421,0.6718712,0.), +vec3(0.3916397,-0.4328209,0.), +vec3(-0.03576927,-0.6220032,0.), +vec3(-0.04661255,0.7995201,0.), +vec3(0.4402924,0.3640312,0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.), +vec3(0.) +);const vec3 PoissonSamplers64[64]=vec3[64]( +vec3(-0.613392,0.617481,0.), +vec3(0.170019,-0.040254,0.), +vec3(-0.299417,0.791925,0.), +vec3(0.645680,0.493210,0.), +vec3(-0.651784,0.717887,0.), +vec3(0.421003,0.027070,0.), +vec3(-0.817194,-0.271096,0.), +vec3(-0.705374,-0.668203,0.), +vec3(0.977050,-0.108615,0.), +vec3(0.063326,0.142369,0.), +vec3(0.203528,0.214331,0.), +vec3(-0.667531,0.326090,0.), +vec3(-0.098422,-0.295755,0.), +vec3(-0.885922,0.215369,0.), +vec3(0.566637,0.605213,0.), +vec3(0.039766,-0.396100,0.), +vec3(0.751946,0.453352,0.), +vec3(0.078707,-0.715323,0.), +vec3(-0.075838,-0.529344,0.), +vec3(0.724479,-0.580798,0.), +vec3(0.222999,-0.215125,0.), +vec3(-0.467574,-0.405438,0.), +vec3(-0.248268,-0.814753,0.), +vec3(0.354411,-0.887570,0.), +vec3(0.175817,0.382366,0.), +vec3(0.487472,-0.063082,0.), +vec3(-0.084078,0.898312,0.), +vec3(0.488876,-0.783441,0.), +vec3(0.470016,0.217933,0.), +vec3(-0.696890,-0.549791,0.), +vec3(-0.149693,0.605762,0.), +vec3(0.034211,0.979980,0.), +vec3(0.503098,-0.308878,0.), +vec3(-0.016205,-0.872921,0.), +vec3(0.385784,-0.393902,0.), +vec3(-0.146886,-0.859249,0.), +vec3(0.643361,0.164098,0.), +vec3(0.634388,-0.049471,0.), +vec3(-0.688894,0.007843,0.), +vec3(0.464034,-0.188818,0.), +vec3(-0.440840,0.137486,0.), +vec3(0.364483,0.511704,0.), +vec3(0.034028,0.325968,0.), +vec3(0.099094,-0.308023,0.), +vec3(0.693960,-0.366253,0.), +vec3(0.678884,-0.204688,0.), +vec3(0.001801,0.780328,0.), +vec3(0.145177,-0.898984,0.), +vec3(0.062655,-0.611866,0.), +vec3(0.315226,-0.604297,0.), +vec3(-0.780145,0.486251,0.), +vec3(-0.371868,0.882138,0.), +vec3(0.200476,0.494430,0.), +vec3(-0.494552,-0.711051,0.), +vec3(0.612476,0.705252,0.), +vec3(-0.578845,-0.768792,0.), +vec3(-0.772454,-0.090976,0.), +vec3(0.504440,0.372295,0.), +vec3(0.155736,0.065157,0.), +vec3(0.391522,0.849605,0.), +vec3(-0.620106,-0.328104,0.), +vec3(0.789239,-0.419965,0.), +vec3(-0.545396,0.538133,0.), +vec3(-0.178564,-0.596057,0.) +); +#define inline +float computeShadowWithCSMPCSS(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArray depthSampler,highp sampler2DArrayShadow shadowSampler,float shadowMapSizeInverse,float lightSizeUV,float darkness,float frustumEdgeFalloff,int searchTapCount,int pcfTapCount,vec3[64] poissonSamplers,vec2 lightSizeUVCorrection,float depthCorrection,float penumbraDarkness) +{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec4 uvDepthLayer=vec4(uvDepth.x,uvDepth.y,layer,uvDepth.z);float blockerDepth=0.0;float sumBlockerDepth=0.0;float numBlocker=0.0;for (int i=0; i1.0 || depthMetric<0.0) {return 1.0;} +else +{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;float blockerDepth=0.0;float sumBlockerDepth=0.0;float numBlocker=0.0;for (int i=0; i { - let propStore = target._propStore; - if (!propStore) { - propStore = []; - target._propStore = propStore; - } - propStore.push({ - propertyName: propertyKey, - displayName, - type: propertyType, - groupName, - options: options ?? {} - }); - }; -} +// node_modules/@babylonjs/core/Shaders/ShadersInclude/imageProcessingFunctions.js +var name20 = "imageProcessingFunctions"; +var shader20 = `#if defined(COLORGRADING) && !defined(COLORGRADING3D) +/** +* Polyfill for SAMPLE_TEXTURE_3D,which is unsupported in WebGL. +* sampler3dSetting.x=textureOffset (0.5/textureSize). +* sampler3dSetting.y=textureSize. +*/ +#define inline +vec3 sampleTexture3D(sampler2D colorTransform,vec3 color,vec2 sampler3dSetting) +{float sliceSize=2.0*sampler3dSetting.x; +#ifdef SAMPLER3DGREENDEPTH +float sliceContinuous=(color.g-sampler3dSetting.x)*sampler3dSetting.y; +#else +float sliceContinuous=(color.b-sampler3dSetting.x)*sampler3dSetting.y; +#endif +float sliceInteger=floor(sliceContinuous);float sliceFraction=sliceContinuous-sliceInteger; +#ifdef SAMPLER3DGREENDEPTH +vec2 sliceUV=color.rb; +#else +vec2 sliceUV=color.rg; +#endif +sliceUV.x*=sliceSize;sliceUV.x+=sliceInteger*sliceSize;sliceUV=saturate(sliceUV);vec4 slice0Color=texture2D(colorTransform,sliceUV);sliceUV.x+=sliceSize;sliceUV=saturate(sliceUV);vec4 slice1Color=texture2D(colorTransform,sliceUV);vec3 result=mix(slice0Color.rgb,slice1Color.rgb,sliceFraction); +#ifdef SAMPLER3DBGRMAP +color.rgb=result.rgb; +#else +color.rgb=result.bgr; +#endif +return color;} +#endif +#ifdef TONEMAPPING_ACES +const mat3 ACESInputMat=mat3( +vec3(0.59719,0.07600,0.02840), +vec3(0.35458,0.90834,0.13383), +vec3(0.04823,0.01566,0.83777) +);const mat3 ACESOutputMat=mat3( +vec3( 1.60475,-0.10208,-0.00327), +vec3(-0.53108, 1.10813,-0.07276), +vec3(-0.07367,-0.00605, 1.07602) +);vec3 RRTAndODTFit(vec3 v) +{vec3 a=v*(v+0.0245786)-0.000090537;vec3 b=v*(0.983729*v+0.4329510)+0.238081;return a/b;} +vec3 ACESFitted(vec3 color) +{color=ACESInputMat*color;color=RRTAndODTFit(color);color=ACESOutputMat*color;color=saturate(color);return color;} +#endif +#define CUSTOM_IMAGEPROCESSINGFUNCTIONS_DEFINITIONS +vec4 applyImageProcessing(vec4 result) { +#define CUSTOM_IMAGEPROCESSINGFUNCTIONS_UPDATERESULT_ATSTART +#ifdef EXPOSURE +result.rgb*=exposureLinear; +#endif +#ifdef VIGNETTE +vec2 viewportXY=gl_FragCoord.xy*vInverseScreenSize;viewportXY=viewportXY*2.0-1.0;vec3 vignetteXY1=vec3(viewportXY*vignetteSettings1.xy+vignetteSettings1.zw,1.0);float vignetteTerm=dot(vignetteXY1,vignetteXY1);float vignette=pow(vignetteTerm,vignetteSettings2.w);vec3 vignetteColor=vignetteSettings2.rgb; +#ifdef VIGNETTEBLENDMODEMULTIPLY +vec3 vignetteColorMultiplier=mix(vignetteColor,vec3(1,1,1),vignette);result.rgb*=vignetteColorMultiplier; +#endif +#ifdef VIGNETTEBLENDMODEOPAQUE +result.rgb=mix(vignetteColor,result.rgb,vignette); +#endif +#endif +#ifdef TONEMAPPING +#ifdef TONEMAPPING_ACES +result.rgb=ACESFitted(result.rgb); +#else +const float tonemappingCalibration=1.590579;result.rgb=1.0-exp2(-tonemappingCalibration*result.rgb); +#endif +#endif +result.rgb=toGammaSpace(result.rgb);result.rgb=saturate(result.rgb); +#ifdef CONTRAST +vec3 resultHighContrast=result.rgb*result.rgb*(3.0-2.0*result.rgb);if (contrast<1.0) {result.rgb=mix(vec3(0.5,0.5,0.5),result.rgb,contrast);} else {result.rgb=mix(result.rgb,resultHighContrast,contrast-1.0);} +#endif +#ifdef COLORGRADING +vec3 colorTransformInput=result.rgb*colorTransformSettings.xxx+colorTransformSettings.yyy; +#ifdef COLORGRADING3D +vec3 colorTransformOutput=texture(txColorTransform,colorTransformInput).rgb; +#else +vec3 colorTransformOutput=sampleTexture3D(txColorTransform,colorTransformInput,colorTransformSettings.yz).rgb; +#endif +result.rgb=mix(result.rgb,colorTransformOutput,colorTransformSettings.www); +#endif +#ifdef COLORCURVES +float luma=getLuminance(result.rgb);vec2 curveMix=clamp(vec2(luma*3.0-1.5,luma*-3.0+1.5),vec2(0.0),vec2(1.0));vec4 colorCurve=vCameraColorCurveNeutral+curveMix.x*vCameraColorCurvePositive-curveMix.y*vCameraColorCurveNegative;result.rgb*=colorCurve.rgb;result.rgb=mix(vec3(luma),result.rgb,colorCurve.a); +#endif +#ifdef DITHER +float rand=getRand(gl_FragCoord.xy*vInverseScreenSize);float dither=mix(-ditherIntensity,ditherIntensity,rand);result.rgb=saturate(result.rgb+vec3(dither)); +#endif +#define CUSTOM_IMAGEPROCESSINGFUNCTIONS_UPDATERESULT_ATEND +return result;}`; +ShaderStore.IncludesShadersStore[name20] = shader20; -// node_modules/@babylonjs/core/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js -var FragmentOutputBlock = class extends NodeMaterialBlock { - /** - * Create a new FragmentOutputBlock - * @param name defines the block name - */ - constructor(name69) { - super(name69, NodeMaterialBlockTargets.Fragment, true); - this.convertToGammaSpace = false; - this.convertToLinearSpace = false; - this.useLogarithmicDepth = false; - this.registerInput("rgba", NodeMaterialBlockConnectionPointTypes.Color4, true); - this.registerInput("rgb", NodeMaterialBlockConnectionPointTypes.AutoDetect, true); - this.registerInput("a", NodeMaterialBlockConnectionPointTypes.Float, true); - this.rgb.addExcludedConnectionPointFromAllowedTypes(NodeMaterialBlockConnectionPointTypes.Color3 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Float); - } - /** - * Gets the current class name - * @returns the class name - */ - getClassName() { - return "FragmentOutputBlock"; - } - /** - * Initialize the block and prepare the context for build - * @param state defines the state that will be used for the build - */ - initialize(state) { - state._excludeVariableName("logarithmicDepthConstant"); - state._excludeVariableName("vFragmentDepth"); - } - /** - * Gets the rgba input component - */ - get rgba() { - return this._inputs[0]; - } - /** - * Gets the rgb input component - */ - get rgb() { - return this._inputs[1]; - } - /** - * Gets the a input component - */ - get a() { - return this._inputs[2]; - } - prepareDefines(mesh, nodeMaterial, defines) { - defines.setValue(this._linearDefineName, this.convertToLinearSpace, true); - defines.setValue(this._gammaDefineName, this.convertToGammaSpace, true); - } - bind(effect, nodeMaterial, mesh) { - if ((this.useLogarithmicDepth || nodeMaterial.useLogarithmicDepth) && mesh) { - BindLogDepth(void 0, effect, mesh.getScene()); - } - } - _buildBlock(state) { - super._buildBlock(state); - const rgba = this.rgba; - const rgb = this.rgb; - const a = this.a; - state.sharedData.hints.needAlphaBlending = rgba.isConnected || a.isConnected; - state.sharedData.blocksWithDefines.push(this); - if (this.useLogarithmicDepth || state.sharedData.nodeMaterial.useLogarithmicDepth) { - state._emitUniformFromString("logarithmicDepthConstant", "float"); - state._emitVaryingFromString("vFragmentDepth", "float"); - state.sharedData.bindableBlocks.push(this); - } - this._linearDefineName = state._getFreeDefineName("CONVERTTOLINEAR"); - this._gammaDefineName = state._getFreeDefineName("CONVERTTOGAMMA"); - const comments = `//${this.name}`; - state._emitFunctionFromInclude("helperFunctions", comments); - if (rgba.connectedPoint) { - if (a.isConnected) { - state.compilationString += `gl_FragColor = vec4(${rgba.associatedVariableName}.rgb, ${a.associatedVariableName}); -`; - } else { - state.compilationString += `gl_FragColor = ${rgba.associatedVariableName}; +// node_modules/@babylonjs/core/Shaders/ShadersInclude/bumpFragmentMainFunctions.js +var name21 = "bumpFragmentMainFunctions"; +var shader21 = `#if defined(BUMP) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) || defined(DETAIL) +#if defined(TANGENT) && defined(NORMAL) +varying mat3 vTBN; +#endif +#ifdef OBJECTSPACE_NORMALMAP +uniform mat4 normalMatrix; +#if defined(WEBGL2) || defined(WEBGPU) +mat4 toNormalMatrix(mat4 wMatrix) +{mat4 ret=inverse(wMatrix);ret=transpose(ret);ret[0][3]=0.;ret[1][3]=0.;ret[2][3]=0.;ret[3]=vec4(0.,0.,0.,1.);return ret;} +#else +mat4 toNormalMatrix(mat4 m) +{float +a00=m[0][0],a01=m[0][1],a02=m[0][2],a03=m[0][3], +a10=m[1][0],a11=m[1][1],a12=m[1][2],a13=m[1][3], +a20=m[2][0],a21=m[2][1],a22=m[2][2],a23=m[2][3], +a30=m[3][0],a31=m[3][1],a32=m[3][2],a33=m[3][3], +b00=a00*a11-a01*a10, +b01=a00*a12-a02*a10, +b02=a00*a13-a03*a10, +b03=a01*a12-a02*a11, +b04=a01*a13-a03*a11, +b05=a02*a13-a03*a12, +b06=a20*a31-a21*a30, +b07=a20*a32-a22*a30, +b08=a20*a33-a23*a30, +b09=a21*a32-a22*a31, +b10=a21*a33-a23*a31, +b11=a22*a33-a23*a32, +det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;mat4 mi=mat4( +a11*b11-a12*b10+a13*b09, +a02*b10-a01*b11-a03*b09, +a31*b05-a32*b04+a33*b03, +a22*b04-a21*b05-a23*b03, +a12*b08-a10*b11-a13*b07, +a00*b11-a02*b08+a03*b07, +a32*b02-a30*b05-a33*b01, +a20*b05-a22*b02+a23*b01, +a10*b10-a11*b08+a13*b06, +a01*b08-a00*b10-a03*b06, +a30*b04-a31*b02+a33*b00, +a21*b02-a20*b04-a23*b00, +a11*b07-a10*b09-a12*b06, +a00*b09-a01*b07+a02*b06, +a31*b01-a30*b03-a32*b00, +a20*b03-a21*b01+a22*b00)/det;return mat4(mi[0][0],mi[1][0],mi[2][0],mi[3][0], +mi[0][1],mi[1][1],mi[2][1],mi[3][1], +mi[0][2],mi[1][2],mi[2][2],mi[3][2], +mi[0][3],mi[1][3],mi[2][3],mi[3][3]);} +#endif +#endif +vec3 perturbNormalBase(mat3 cotangentFrame,vec3 normal,float scale) +{ +#ifdef NORMALXYSCALE +normal=normalize(normal*vec3(scale,scale,1.0)); +#endif +return normalize(cotangentFrame*normal);} +vec3 perturbNormal(mat3 cotangentFrame,vec3 textureSample,float scale) +{return perturbNormalBase(cotangentFrame,textureSample*2.0-1.0,scale);} +mat3 cotangent_frame(vec3 normal,vec3 p,vec2 uv,vec2 tangentSpaceParams) +{vec3 dp1=dFdx(p);vec3 dp2=dFdy(p);vec2 duv1=dFdx(uv);vec2 duv2=dFdy(uv);vec3 dp2perp=cross(dp2,normal);vec3 dp1perp=cross(normal,dp1);vec3 tangent=dp2perp*duv1.x+dp1perp*duv2.x;vec3 bitangent=dp2perp*duv1.y+dp1perp*duv2.y;tangent*=tangentSpaceParams.x;bitangent*=tangentSpaceParams.y;float det=max(dot(tangent,tangent),dot(bitangent,bitangent));float invmax=det==0.0 ? 0.0 : inversesqrt(det);return mat3(tangent*invmax,bitangent*invmax,normal);} +#endif `; - } - } else if (rgb.connectedPoint) { - let aValue = "1.0"; - if (a.connectedPoint) { - aValue = a.associatedVariableName; - } - if (rgb.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Float) { - state.compilationString += `gl_FragColor = vec4(${rgb.associatedVariableName}, ${rgb.associatedVariableName}, ${rgb.associatedVariableName}, ${aValue}); +ShaderStore.IncludesShadersStore[name21] = shader21; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/bumpFragmentFunctions.js +var name22 = "bumpFragmentFunctions"; +var shader22 = `#if defined(BUMP) +#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_SAMPLERNAME_,bump) +#endif +#if defined(DETAIL) +#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_SAMPLERNAME_,detail) +#endif +#if defined(BUMP) && defined(PARALLAX) +const float minSamples=4.;const float maxSamples=15.;const int iMaxSamples=15;vec2 parallaxOcclusion(vec3 vViewDirCoT,vec3 vNormalCoT,vec2 texCoord,float parallaxScale) {float parallaxLimit=length(vViewDirCoT.xy)/vViewDirCoT.z;parallaxLimit*=parallaxScale;vec2 vOffsetDir=normalize(vViewDirCoT.xy);vec2 vMaxOffset=vOffsetDir*parallaxLimit;float numSamples=maxSamples+(dot(vViewDirCoT,vNormalCoT)*(minSamples-maxSamples));float stepSize=1.0/numSamples;float currRayHeight=1.0;vec2 vCurrOffset=vec2(0,0);vec2 vLastOffset=vec2(0,0);float lastSampledHeight=1.0;float currSampledHeight=1.0;bool keepWorking=true;for (int i=0; icurrRayHeight) +{float delta1=currSampledHeight-currRayHeight;float delta2=(currRayHeight+stepSize)-lastSampledHeight;float ratio=delta1/(delta1+delta2);vCurrOffset=(ratio)* vLastOffset+(1.0-ratio)*vCurrOffset;keepWorking=false;} +else +{currRayHeight-=stepSize;vLastOffset=vCurrOffset; +#ifdef PARALLAX_RHS +vCurrOffset-=stepSize*vMaxOffset; +#else +vCurrOffset+=stepSize*vMaxOffset; +#endif +lastSampledHeight=currSampledHeight;}} +return vCurrOffset;} +vec2 parallaxOffset(vec3 viewDir,float heightScale) +{float height=texture2D(bumpSampler,vBumpUV).w;vec2 texCoordOffset=heightScale*viewDir.xy*height; +#ifdef PARALLAX_RHS +return texCoordOffset; +#else +return -texCoordOffset; +#endif +} +#endif `; - } else { - state.compilationString += `gl_FragColor = vec4(${rgb.associatedVariableName}, ${aValue}); +ShaderStore.IncludesShadersStore[name22] = shader22; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/clipPlaneFragmentDeclaration.js +var name23 = "clipPlaneFragmentDeclaration"; +var shader23 = `#ifdef CLIPPLANE +varying float fClipDistance; +#endif +#ifdef CLIPPLANE2 +varying float fClipDistance2; +#endif +#ifdef CLIPPLANE3 +varying float fClipDistance3; +#endif +#ifdef CLIPPLANE4 +varying float fClipDistance4; +#endif +#ifdef CLIPPLANE5 +varying float fClipDistance5; +#endif +#ifdef CLIPPLANE6 +varying float fClipDistance6; +#endif `; - } - } else { - state.sharedData.checks.notConnectedNonOptionalInputs.push(rgba); - } - state.compilationString += `#ifdef ${this._linearDefineName} +ShaderStore.IncludesShadersStore[name23] = shader23; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/logDepthDeclaration.js +var name24 = "logDepthDeclaration"; +var shader24 = `#ifdef LOGARITHMICDEPTH +uniform float logarithmicDepthConstant;varying float vFragmentDepth; +#endif `; - state.compilationString += `gl_FragColor = toLinearSpace(gl_FragColor); +ShaderStore.IncludesShadersStore[name24] = shader24; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/fogFragmentDeclaration.js +var name25 = "fogFragmentDeclaration"; +var shader25 = `#ifdef FOG +#define FOGMODE_NONE 0. +#define FOGMODE_EXP 1. +#define FOGMODE_EXP2 2. +#define FOGMODE_LINEAR 3. +#define E 2.71828 +uniform vec4 vFogInfos;uniform vec3 vFogColor;varying vec3 vFogDistance;float CalcFogFactor() +{float fogCoeff=1.0;float fogStart=vFogInfos.y;float fogEnd=vFogInfos.z;float fogDensity=vFogInfos.w;float fogDistance=length(vFogDistance);if (FOGMODE_LINEAR==vFogInfos.x) +{fogCoeff=(fogEnd-fogDistance)/(fogEnd-fogStart);} +else if (FOGMODE_EXP==vFogInfos.x) +{fogCoeff=1.0/pow(E,fogDistance*fogDensity);} +else if (FOGMODE_EXP2==vFogInfos.x) +{fogCoeff=1.0/pow(E,fogDistance*fogDistance*fogDensity*fogDensity);} +return clamp(fogCoeff,0.0,1.0);} +#endif `; - state.compilationString += `#endif -`; - state.compilationString += `#ifdef ${this._gammaDefineName} -`; - state.compilationString += `gl_FragColor = toGammaSpace(gl_FragColor); -`; - state.compilationString += `#endif -`; - if (this.useLogarithmicDepth || state.sharedData.nodeMaterial.useLogarithmicDepth) { - state.compilationString += `gl_FragDepthEXT = log2(vFragmentDepth) * logarithmicDepthConstant * 0.5; -`; - } - state.compilationString += `#if defined(PREPASS)\r +ShaderStore.IncludesShadersStore[name25] = shader25; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/clipPlaneFragment.js +var name26 = "clipPlaneFragment"; +var shader26 = `#if defined(CLIPPLANE) || defined(CLIPPLANE2) || defined(CLIPPLANE3) || defined(CLIPPLANE4) || defined(CLIPPLANE5) || defined(CLIPPLANE6) +if (false) {} +#endif +#ifdef CLIPPLANE +else if (fClipDistance>0.0) +{discard;} +#endif +#ifdef CLIPPLANE2 +else if (fClipDistance2>0.0) +{discard;} +#endif +#ifdef CLIPPLANE3 +else if (fClipDistance3>0.0) +{discard;} +#endif +#ifdef CLIPPLANE4 +else if (fClipDistance4>0.0) +{discard;} +#endif +#ifdef CLIPPLANE5 +else if (fClipDistance5>0.0) +{discard;} +#endif +#ifdef CLIPPLANE6 +else if (fClipDistance6>0.0) +{discard;} +#endif `; - state.compilationString += `gl_FragData[0] = gl_FragColor;\r +ShaderStore.IncludesShadersStore[name26] = shader26; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/bumpFragment.js +var name27 = "bumpFragment"; +var shader27 = `vec2 uvOffset=vec2(0.0,0.0); +#if defined(BUMP) || defined(PARALLAX) || defined(DETAIL) +#ifdef NORMALXYSCALE +float normalScale=1.0; +#elif defined(BUMP) +float normalScale=vBumpInfos.y; +#else +float normalScale=1.0; +#endif +#if defined(TANGENT) && defined(NORMAL) +mat3 TBN=vTBN; +#elif defined(BUMP) +vec2 TBNUV=gl_FrontFacing ? vBumpUV : -vBumpUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vTangentSpaceParams); +#else +vec2 TBNUV=gl_FrontFacing ? vDetailUV : -vDetailUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vec2(1.,1.)); +#endif +#elif defined(ANISOTROPIC) +#if defined(TANGENT) && defined(NORMAL) +mat3 TBN=vTBN; +#else +vec2 TBNUV=gl_FrontFacing ? vMainUV1 : -vMainUV1;mat3 TBN=cotangent_frame(normalW,vPositionW,TBNUV,vec2(1.,1.)); +#endif +#endif +#ifdef PARALLAX +mat3 invTBN=transposeMat3(TBN); +#ifdef PARALLAXOCCLUSION +uvOffset=parallaxOcclusion(invTBN*-viewDirectionW,invTBN*normalW,vBumpUV,vBumpInfos.z); +#else +uvOffset=parallaxOffset(invTBN*viewDirectionW,vBumpInfos.z); +#endif +#endif +#ifdef DETAIL +vec4 detailColor=texture2D(detailSampler,vDetailUV+uvOffset);vec2 detailNormalRG=detailColor.wy*2.0-1.0;float detailNormalB=sqrt(1.-saturate(dot(detailNormalRG,detailNormalRG)));vec3 detailNormal=vec3(detailNormalRG,detailNormalB); +#endif +#ifdef BUMP +#ifdef OBJECTSPACE_NORMALMAP +#define CUSTOM_FRAGMENT_BUMP_FRAGMENT +normalW=normalize(texture2D(bumpSampler,vBumpUV).xyz *2.0-1.0);normalW=normalize(mat3(normalMatrix)*normalW); +#elif !defined(DETAIL) +normalW=perturbNormal(TBN,texture2D(bumpSampler,vBumpUV+uvOffset).xyz,vBumpInfos.y); +#else +vec3 bumpNormal=texture2D(bumpSampler,vBumpUV+uvOffset).xyz*2.0-1.0; +#if DETAIL_NORMALBLENDMETHOD==0 +detailNormal.xy*=vDetailInfos.z;vec3 blendedNormal=normalize(vec3(bumpNormal.xy+detailNormal.xy,bumpNormal.z*detailNormal.z)); +#elif DETAIL_NORMALBLENDMETHOD==1 +detailNormal.xy*=vDetailInfos.z;bumpNormal+=vec3(0.0,0.0,1.0);detailNormal*=vec3(-1.0,-1.0,1.0);vec3 blendedNormal=bumpNormal*dot(bumpNormal,detailNormal)/bumpNormal.z-detailNormal; +#endif +normalW=perturbNormalBase(TBN,blendedNormal,vBumpInfos.y); +#endif +#elif defined(DETAIL) +detailNormal.xy*=vDetailInfos.z;normalW=perturbNormalBase(TBN,detailNormal,vDetailInfos.z); +#endif `; - state.compilationString += `#endif\r +ShaderStore.IncludesShadersStore[name27] = shader27; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/decalFragment.js +var name28 = "decalFragment"; +var shader28 = `#ifdef DECAL +#ifdef GAMMADECAL +decalColor.rgb=toLinearSpace(decalColor.rgb); +#endif +#ifdef DECAL_SMOOTHALPHA +decalColor.a*=decalColor.a; +#endif +surfaceAlbedo.rgb=mix(surfaceAlbedo.rgb,decalColor.rgb,decalColor.a); +#endif `; - return this; - } - _dumpPropertiesCode() { - let codeString = super._dumpPropertiesCode(); - codeString += `${this._codeVariableName}.convertToGammaSpace = ${this.convertToGammaSpace}; +ShaderStore.IncludesShadersStore[name28] = shader28; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/depthPrePass.js +var name29 = "depthPrePass"; +var shader29 = `#ifdef DEPTHPREPASS +gl_FragColor=vec4(0.,0.,0.,1.0);return; +#endif `; - codeString += `${this._codeVariableName}.convertToLinearSpace = ${this.convertToLinearSpace}; +ShaderStore.IncludesShadersStore[name29] = shader29; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/lightFragment.js +var name30 = "lightFragment"; +var shader30 = `#ifdef LIGHT{X} +#if defined(SHADOWONLY) || defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X}) && defined(LIGHTMAPNOSPECULAR{X}) +#else +#ifdef PBR +#ifdef SPOTLIGHT{X} +preInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW); +#elif defined(POINTLIGHT{X}) +preInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW); +#elif defined(HEMILIGHT{X}) +preInfo=computeHemisphericPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW); +#elif defined(DIRLIGHT{X}) +preInfo=computeDirectionalPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW); +#endif +preInfo.NdotV=NdotV; +#ifdef SPOTLIGHT{X} +#ifdef LIGHT_FALLOFF_GLTF{X} +preInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff_GLTF(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w); +#elif defined(LIGHT_FALLOFF_PHYSICAL{X}) +preInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);preInfo.attenuation*=computeDirectionalLightFalloff_Physical(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w); +#elif defined(LIGHT_FALLOFF_STANDARD{X}) +preInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);preInfo.attenuation*=computeDirectionalLightFalloff_Standard(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w); +#else +preInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w); +#endif +#elif defined(POINTLIGHT{X}) +#ifdef LIGHT_FALLOFF_GLTF{X} +preInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y); +#elif defined(LIGHT_FALLOFF_PHYSICAL{X}) +preInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared); +#elif defined(LIGHT_FALLOFF_STANDARD{X}) +preInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x); +#else +preInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y); +#endif +#else +preInfo.attenuation=1.0; +#endif +#ifdef HEMILIGHT{X} +preInfo.roughness=roughness; +#else +preInfo.roughness=adjustRoughnessFromLightProperties(roughness,light{X}.vLightSpecular.a,preInfo.lightDistance); +#endif +#ifdef IRIDESCENCE +preInfo.iridescenceIntensity=iridescenceIntensity; +#endif +#ifdef HEMILIGHT{X} +info.diffuse=computeHemisphericDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb,light{X}.vLightGround); +#elif defined(SS_TRANSLUCENCY) +info.diffuse=computeDiffuseAndTransmittedLighting(preInfo,light{X}.vLightDiffuse.rgb,subSurfaceOut.transmittance); +#else +info.diffuse=computeDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb); +#endif +#ifdef SPECULARTERM +#ifdef ANISOTROPIC +info.specular=computeAnisotropicSpecularLighting(preInfo,viewDirectionW,normalW,anisotropicOut.anisotropicTangent,anisotropicOut.anisotropicBitangent,anisotropicOut.anisotropy,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb); +#else +info.specular=computeSpecularLighting(preInfo,normalW,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb); +#endif +#endif +#ifdef SHEEN +#ifdef SHEEN_LINKWITHALBEDO +preInfo.roughness=sheenOut.sheenIntensity; +#else +#ifdef HEMILIGHT{X} +preInfo.roughness=sheenOut.sheenRoughness; +#else +preInfo.roughness=adjustRoughnessFromLightProperties(sheenOut.sheenRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance); +#endif +#endif +info.sheen=computeSheenLighting(preInfo,normalW,sheenOut.sheenColor,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb); +#endif +#ifdef CLEARCOAT +#ifdef HEMILIGHT{X} +preInfo.roughness=clearcoatOut.clearCoatRoughness; +#else +preInfo.roughness=adjustRoughnessFromLightProperties(clearcoatOut.clearCoatRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance); +#endif +info.clearCoat=computeClearCoatLighting(preInfo,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatAARoughnessFactors.x,clearcoatOut.clearCoatIntensity,light{X}.vLightDiffuse.rgb); +#ifdef CLEARCOAT_TINT +absorption=computeClearCoatLightingAbsorption(clearcoatOut.clearCoatNdotVRefract,preInfo.L,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatColor,clearcoatOut.clearCoatThickness,clearcoatOut.clearCoatIntensity);info.diffuse*=absorption; +#ifdef SPECULARTERM +info.specular*=absorption; +#endif +#endif +info.diffuse*=info.clearCoat.w; +#ifdef SPECULARTERM +info.specular*=info.clearCoat.w; +#endif +#ifdef SHEEN +info.sheen*=info.clearCoat.w; +#endif +#endif +#else +#ifdef SPOTLIGHT{X} +info=computeSpotLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDirection,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness); +#elif defined(HEMILIGHT{X}) +info=computeHemisphericLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightGround,glossiness); +#elif defined(POINTLIGHT{X}) || defined(DIRLIGHT{X}) +info=computeLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness); +#endif +#endif +#ifdef PROJECTEDLIGHTTEXTURE{X} +info.diffuse*=computeProjectionTextureDiffuseLighting(projectionLightSampler{X},textureProjectionMatrix{X}); +#endif +#endif +#ifdef SHADOW{X} +#ifdef SHADOWCSM{X} +for (int i=0; i=0.) {index{X}=i;break;}} +#ifdef SHADOWCSMUSESHADOWMAXZ{X} +if (index{X}>=0) +#endif +{ +#if defined(SHADOWPCF{X}) +#if defined(SHADOWLOWQUALITY{X}) +shadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#elif defined(SHADOWMEDIUMQUALITY{X}) +shadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#else +shadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#endif +#elif defined(SHADOWPCSS{X}) +#if defined(SHADOWLOWQUALITY{X}) +shadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X}); +#elif defined(SHADOWMEDIUMQUALITY{X}) +shadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X}); +#else +shadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X}); +#endif +#else +shadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#endif +#ifdef SHADOWCSMDEBUG{X} +shadowDebug{X}=vec3(shadow)*vCascadeColorsMultiplier{X}[index{X}]; +#endif +#ifndef SHADOWCSMNOBLEND{X} +float frustumLength=frustumLengths{X}[index{X}];float diffRatio=clamp(diff{X}/frustumLength,0.,1.)*cascadeBlendFactor{X};if (index{X}<(SHADOWCSMNUM_CASCADES{X}-1) && diffRatio<1.) +{index{X}+=1;float nextShadow=0.; +#if defined(SHADOWPCF{X}) +#if defined(SHADOWLOWQUALITY{X}) +nextShadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#elif defined(SHADOWMEDIUMQUALITY{X}) +nextShadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#else +nextShadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#endif +#elif defined(SHADOWPCSS{X}) +#if defined(SHADOWLOWQUALITY{X}) +nextShadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X}); +#elif defined(SHADOWMEDIUMQUALITY{X}) +nextShadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X}); +#else +nextShadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X}); +#endif +#else +nextShadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#endif +shadow=mix(nextShadow,shadow,diffRatio); +#ifdef SHADOWCSMDEBUG{X} +shadowDebug{X}=mix(vec3(nextShadow)*vCascadeColorsMultiplier{X}[index{X}],shadowDebug{X},diffRatio); +#endif +} +#endif +} +#elif defined(SHADOWCLOSEESM{X}) +#if defined(SHADOWCUBE{X}) +shadow=computeShadowWithCloseESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues); +#else +shadow=computeShadowWithCloseESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w); +#endif +#elif defined(SHADOWESM{X}) +#if defined(SHADOWCUBE{X}) +shadow=computeShadowWithESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues); +#else +shadow=computeShadowWithESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w); +#endif +#elif defined(SHADOWPOISSON{X}) +#if defined(SHADOWCUBE{X}) +shadow=computeShadowWithPoissonSamplingCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.depthValues); +#else +shadow=computeShadowWithPoissonSampling(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#endif +#elif defined(SHADOWPCF{X}) +#if defined(SHADOWLOWQUALITY{X}) +shadow=computeShadowWithPCF1(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#elif defined(SHADOWMEDIUMQUALITY{X}) +shadow=computeShadowWithPCF3(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#else +shadow=computeShadowWithPCF5(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#endif +#elif defined(SHADOWPCSS{X}) +#if defined(SHADOWLOWQUALITY{X}) +shadow=computeShadowWithPCSS16(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#elif defined(SHADOWMEDIUMQUALITY{X}) +shadow=computeShadowWithPCSS32(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#else +shadow=computeShadowWithPCSS64(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#endif +#else +#if defined(SHADOWCUBE{X}) +shadow=computeShadowCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.depthValues); +#else +shadow=computeShadow(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); +#endif +#endif +#ifdef SHADOWONLY +#ifndef SHADOWINUSE +#define SHADOWINUSE +#endif +globalShadow+=shadow;shadowLightCount+=1.0; +#endif +#else +shadow=1.; +#endif +aggShadow+=shadow;numLights+=1.0; +#ifndef SHADOWONLY +#ifdef CUSTOMUSERLIGHTING +diffuseBase+=computeCustomDiffuseLighting(info,diffuseBase,shadow); +#ifdef SPECULARTERM +specularBase+=computeCustomSpecularLighting(info,specularBase,shadow); +#endif +#elif defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X}) +diffuseBase+=lightmapColor.rgb*shadow; +#ifdef SPECULARTERM +#ifndef LIGHTMAPNOSPECULAR{X} +specularBase+=info.specular*shadow*lightmapColor.rgb; +#endif +#endif +#ifdef CLEARCOAT +#ifndef LIGHTMAPNOSPECULAR{X} +clearCoatBase+=info.clearCoat.rgb*shadow*lightmapColor.rgb; +#endif +#endif +#ifdef SHEEN +#ifndef LIGHTMAPNOSPECULAR{X} +sheenBase+=info.sheen.rgb*shadow; +#endif +#endif +#else +#ifdef SHADOWCSMDEBUG{X} +diffuseBase+=info.diffuse*shadowDebug{X}; +#else +diffuseBase+=info.diffuse*shadow; +#endif +#ifdef SPECULARTERM +specularBase+=info.specular*shadow; +#endif +#ifdef CLEARCOAT +clearCoatBase+=info.clearCoat.rgb*shadow; +#endif +#ifdef SHEEN +sheenBase+=info.sheen.rgb*shadow; +#endif +#endif +#endif +#endif `; - codeString += `${this._codeVariableName}.useLogarithmicDepth = ${this.useLogarithmicDepth}; +ShaderStore.IncludesShadersStore[name30] = shader30; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/logDepthFragment.js +var name31 = "logDepthFragment"; +var shader31 = `#ifdef LOGARITHMICDEPTH +gl_FragDepthEXT=log2(vFragmentDepth)*logarithmicDepthConstant*0.5; +#endif `; - return codeString; - } - serialize() { - const serializationObject = super.serialize(); - serializationObject.convertToGammaSpace = this.convertToGammaSpace; - serializationObject.convertToLinearSpace = this.convertToLinearSpace; - serializationObject.useLogarithmicDepth = this.useLogarithmicDepth; - return serializationObject; - } - _deserialize(serializationObject, scene, rootUrl) { - super._deserialize(serializationObject, scene, rootUrl); - this.convertToGammaSpace = serializationObject.convertToGammaSpace; - this.convertToLinearSpace = serializationObject.convertToLinearSpace; - this.useLogarithmicDepth = serializationObject.useLogarithmicDepth ?? false; - } -}; -__decorate([ - editableInPropertyPage("Convert to gamma space", PropertyTypeForEdition.Boolean, "PROPERTIES", { notifiers: { update: true } }) -], FragmentOutputBlock.prototype, "convertToGammaSpace", void 0); -__decorate([ - editableInPropertyPage("Convert to linear space", PropertyTypeForEdition.Boolean, "PROPERTIES", { notifiers: { update: true } }) -], FragmentOutputBlock.prototype, "convertToLinearSpace", void 0); -__decorate([ - editableInPropertyPage("Use logarithmic depth", PropertyTypeForEdition.Boolean, "PROPERTIES") -], FragmentOutputBlock.prototype, "useLogarithmicDepth", void 0); -RegisterClass("BABYLON.FragmentOutputBlock", FragmentOutputBlock); +ShaderStore.IncludesShadersStore[name31] = shader31; -// node_modules/@babylonjs/core/Materials/Node/Enums/nodeMaterialBlockConnectionPointMode.js -var NodeMaterialBlockConnectionPointMode; -(function(NodeMaterialBlockConnectionPointMode2) { - NodeMaterialBlockConnectionPointMode2[NodeMaterialBlockConnectionPointMode2["Uniform"] = 0] = "Uniform"; - NodeMaterialBlockConnectionPointMode2[NodeMaterialBlockConnectionPointMode2["Attribute"] = 1] = "Attribute"; - NodeMaterialBlockConnectionPointMode2[NodeMaterialBlockConnectionPointMode2["Varying"] = 2] = "Varying"; - NodeMaterialBlockConnectionPointMode2[NodeMaterialBlockConnectionPointMode2["Undefined"] = 3] = "Undefined"; -})(NodeMaterialBlockConnectionPointMode || (NodeMaterialBlockConnectionPointMode = {})); +// node_modules/@babylonjs/core/Shaders/ShadersInclude/fogFragment.js +var name32 = "fogFragment"; +var shader32 = `#ifdef FOG +float fog=CalcFogFactor(); +#ifdef PBR +fog=toLinearSpace(fog); +#endif +color.rgb=mix(vFogColor,color.rgb,fog); +#endif +`; +ShaderStore.IncludesShadersStore[name32] = shader32; -// node_modules/@babylonjs/core/Materials/Node/Enums/nodeMaterialSystemValues.js -var NodeMaterialSystemValues; -(function(NodeMaterialSystemValues2) { - NodeMaterialSystemValues2[NodeMaterialSystemValues2["World"] = 1] = "World"; - NodeMaterialSystemValues2[NodeMaterialSystemValues2["View"] = 2] = "View"; - NodeMaterialSystemValues2[NodeMaterialSystemValues2["Projection"] = 3] = "Projection"; - NodeMaterialSystemValues2[NodeMaterialSystemValues2["ViewProjection"] = 4] = "ViewProjection"; - NodeMaterialSystemValues2[NodeMaterialSystemValues2["WorldView"] = 5] = "WorldView"; - NodeMaterialSystemValues2[NodeMaterialSystemValues2["WorldViewProjection"] = 6] = "WorldViewProjection"; - NodeMaterialSystemValues2[NodeMaterialSystemValues2["CameraPosition"] = 7] = "CameraPosition"; - NodeMaterialSystemValues2[NodeMaterialSystemValues2["FogColor"] = 8] = "FogColor"; - NodeMaterialSystemValues2[NodeMaterialSystemValues2["DeltaTime"] = 9] = "DeltaTime"; - NodeMaterialSystemValues2[NodeMaterialSystemValues2["CameraParameters"] = 10] = "CameraParameters"; - NodeMaterialSystemValues2[NodeMaterialSystemValues2["MaterialAlpha"] = 11] = "MaterialAlpha"; -})(NodeMaterialSystemValues || (NodeMaterialSystemValues = {})); +// node_modules/@babylonjs/core/Shaders/ShadersInclude/oitFragment.js +var name33 = "oitFragment"; +var shader33 = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY +float fragDepth=gl_FragCoord.z; +#ifdef ORDER_INDEPENDENT_TRANSPARENCY_16BITS +uint halfFloat=packHalf2x16(vec2(fragDepth));vec2 full=unpackHalf2x16(halfFloat);fragDepth=full.x; +#endif +ivec2 fragCoord=ivec2(gl_FragCoord.xy);vec2 lastDepth=texelFetch(oitDepthSampler,fragCoord,0).rg;vec4 lastFrontColor=texelFetch(oitFrontColorSampler,fragCoord,0);depth.rg=vec2(-MAX_DEPTH);frontColor=lastFrontColor;backColor=vec4(0.0); +#ifdef USE_REVERSE_DEPTHBUFFER +float furthestDepth=-lastDepth.x;float nearestDepth=lastDepth.y; +#else +float nearestDepth=-lastDepth.x;float furthestDepth=lastDepth.y; +#endif +float alphaMultiplier=1.0-lastFrontColor.a; +#ifdef USE_REVERSE_DEPTHBUFFER +if (fragDepth>nearestDepth || fragDepthfurthestDepth) { +#endif +return;} +#ifdef USE_REVERSE_DEPTHBUFFER +if (fragDepthfurthestDepth) { +#else +if (fragDepth>nearestDepth && fragDepth +#if defined(BUMP) || !defined(NORMAL) +#extension GL_OES_standard_derivatives : enable +#endif +#include[SCENE_MRT_COUNT] +#include +#define CUSTOM_FRAGMENT_BEGIN +#ifdef LOGARITHMICDEPTH +#extension GL_EXT_frag_depth : enable +#endif +varying vec3 vPositionW; +#ifdef NORMAL +varying vec3 vNormalW; +#endif +#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES) +varying vec4 vColor; +#endif +#include[1..7] +#include +#include<__decl__lightFragment>[0..maxSimultaneousLights] +#include +#include +#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse,_SAMPLERNAME_,diffuse) +#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_SAMPLERNAME_,ambient) +#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_SAMPLERNAME_,opacity) +#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_SAMPLERNAME_,emissive) +#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_SAMPLERNAME_,lightmap) +#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_SAMPLERNAME_,decal) +#ifdef REFRACTION +#ifdef REFRACTIONMAP_3D +uniform samplerCube refractionCubeSampler; +#else +uniform sampler2D refraction2DSampler; +#endif +#endif +#if defined(SPECULARTERM) +#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular,_SAMPLERNAME_,specular) +#endif +#include +#ifdef REFLECTION +#ifdef REFLECTIONMAP_3D +uniform samplerCube reflectionCubeSampler; +#else +uniform sampler2D reflection2DSampler; +#endif +#ifdef REFLECTIONMAP_SKYBOX +varying vec3 vPositionUVW; +#else +#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED) +varying vec3 vDirectionW; +#endif +#endif +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#define CUSTOM_FRAGMENT_DEFINITIONS +void main(void) { +#define CUSTOM_FRAGMENT_MAIN_BEGIN +#include +vec3 viewDirectionW=normalize(vEyePosition.xyz-vPositionW);vec4 baseColor=vec4(1.,1.,1.,1.);vec3 diffuseColor=vDiffuseColor.rgb;float alpha=vDiffuseColor.a; +#ifdef NORMAL +vec3 normalW=normalize(vNormalW); +#else +vec3 normalW=normalize(-cross(dFdx(vPositionW),dFdy(vPositionW))); +#endif +#include +#ifdef TWOSIDEDLIGHTING +normalW=gl_FrontFacing ? normalW : -normalW; +#endif +#ifdef DIFFUSE +baseColor=texture2D(diffuseSampler,vDiffuseUV+uvOffset); +#if defined(ALPHATEST) && !defined(ALPHATEST_AFTERALLALPHACOMPUTATIONS) +if (baseColor.a(surfaceAlbedo,baseColor,GAMMADECAL,_GAMMADECAL_NOTUSED_) +#endif +#include +#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES) +baseColor.rgb*=vColor.rgb; +#endif +#ifdef DETAIL +baseColor.rgb=baseColor.rgb*2.0*mix(0.5,detailColor.r,vDetailInfos.y); +#endif +#if defined(DECAL) && defined(DECAL_AFTER_DETAIL) +vec4 decalColor=texture2D(decalSampler,vDecalUV+uvOffset); +#include(surfaceAlbedo,baseColor,GAMMADECAL,_GAMMADECAL_NOTUSED_) +#endif +#define CUSTOM_FRAGMENT_UPDATE_DIFFUSE +vec3 baseAmbientColor=vec3(1.,1.,1.); +#ifdef AMBIENT +baseAmbientColor=texture2D(ambientSampler,vAmbientUV+uvOffset).rgb*vAmbientInfos.y; +#endif +#define CUSTOM_FRAGMENT_BEFORE_LIGHTS +#ifdef SPECULARTERM +float glossiness=vSpecularColor.a;vec3 specularColor=vSpecularColor.rgb; +#ifdef SPECULAR +vec4 specularMapColor=texture2D(specularSampler,vSpecularUV+uvOffset);specularColor=specularMapColor.rgb; +#ifdef GLOSSINESS +glossiness=glossiness*specularMapColor.a; +#endif +#endif +#else +float glossiness=0.; +#endif +vec3 diffuseBase=vec3(0.,0.,0.);lightingInfo info; +#ifdef SPECULARTERM +vec3 specularBase=vec3(0.,0.,0.); +#endif +float shadow=1.;float aggShadow=0.;float numLights=0.; +#ifdef LIGHTMAP +vec4 lightmapColor=texture2D(lightmapSampler,vLightmapUV+uvOffset); +#ifdef RGBDLIGHTMAP +lightmapColor.rgb=fromRGBD(lightmapColor); +#endif +lightmapColor.rgb*=vLightmapInfos.y; +#endif +#include[0..maxSimultaneousLights] +aggShadow=aggShadow/numLights;vec4 refractionColor=vec4(0.,0.,0.,1.); +#ifdef REFRACTION +vec3 refractionVector=normalize(refract(-viewDirectionW,normalW,vRefractionInfos.y)); +#ifdef REFRACTIONMAP_3D +#ifdef USE_LOCAL_REFRACTIONMAP_CUBIC +refractionVector=parallaxCorrectNormal(vPositionW,refractionVector,vRefractionSize,vRefractionPosition); +#endif +refractionVector.y=refractionVector.y*vRefractionInfos.w;vec4 refractionLookup=textureCube(refractionCubeSampler,refractionVector);if (dot(refractionVector,viewDirectionW)<1.0) {refractionColor=refractionLookup;} +#else +vec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*vRefractionInfos.z,1.0)));vec2 refractionCoords=vRefractionUVW.xy/vRefractionUVW.z;refractionCoords.y=1.0-refractionCoords.y;refractionColor=texture2D(refraction2DSampler,refractionCoords); +#endif +#ifdef RGBDREFRACTION +refractionColor.rgb=fromRGBD(refractionColor); +#endif +#ifdef IS_REFRACTION_LINEAR +refractionColor.rgb=toGammaSpace(refractionColor.rgb); +#endif +refractionColor.rgb*=vRefractionInfos.x; +#endif +vec4 reflectionColor=vec4(0.,0.,0.,1.); +#ifdef REFLECTION +vec3 vReflectionUVW=computeReflectionCoords(vec4(vPositionW,1.0),normalW); +#ifdef REFLECTIONMAP_OPPOSITEZ +vReflectionUVW.z*=-1.0; +#endif +#ifdef REFLECTIONMAP_3D +#ifdef ROUGHNESS +float bias=vReflectionInfos.y; +#ifdef SPECULARTERM +#ifdef SPECULAR +#ifdef GLOSSINESS +bias*=(1.0-specularMapColor.a); +#endif +#endif +#endif +reflectionColor=textureCube(reflectionCubeSampler,vReflectionUVW,bias); +#else +reflectionColor=textureCube(reflectionCubeSampler,vReflectionUVW); +#endif +#else +vec2 coords=vReflectionUVW.xy; +#ifdef REFLECTIONMAP_PROJECTION +coords/=vReflectionUVW.z; +#endif +coords.y=1.0-coords.y;reflectionColor=texture2D(reflection2DSampler,coords); +#endif +#ifdef RGBDREFLECTION +reflectionColor.rgb=fromRGBD(reflectionColor); +#endif +#ifdef IS_REFLECTION_LINEAR +reflectionColor.rgb=toGammaSpace(reflectionColor.rgb); +#endif +reflectionColor.rgb*=vReflectionInfos.x; +#ifdef REFLECTIONFRESNEL +float reflectionFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,reflectionRightColor.a,reflectionLeftColor.a); +#ifdef REFLECTIONFRESNELFROMSPECULAR +#ifdef SPECULARTERM +reflectionColor.rgb*=specularColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb; +#else +reflectionColor.rgb*=reflectionLeftColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb; +#endif +#else +reflectionColor.rgb*=reflectionLeftColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb; +#endif +#endif +#endif +#ifdef REFRACTIONFRESNEL +float refractionFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,refractionRightColor.a,refractionLeftColor.a);refractionColor.rgb*=refractionLeftColor.rgb*(1.0-refractionFresnelTerm)+refractionFresnelTerm*refractionRightColor.rgb; +#endif +#ifdef OPACITY +vec4 opacityMap=texture2D(opacitySampler,vOpacityUV+uvOffset); +#ifdef OPACITYRGB +opacityMap.rgb=opacityMap.rgb*vec3(0.3,0.59,0.11);alpha*=(opacityMap.x+opacityMap.y+opacityMap.z)* vOpacityInfos.y; +#else +alpha*=opacityMap.a*vOpacityInfos.y; +#endif +#endif +#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES) +alpha*=vColor.a; +#endif +#ifdef OPACITYFRESNEL +float opacityFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,opacityParts.z,opacityParts.w);alpha+=opacityParts.x*(1.0-opacityFresnelTerm)+opacityFresnelTerm*opacityParts.y; +#endif +#ifdef ALPHATEST +#ifdef ALPHATEST_AFTERALLALPHACOMPUTATIONS +if (alpha +#include +#ifdef IMAGEPROCESSINGPOSTPROCESS +color.rgb=toLinearSpace(color.rgb); +#else +#ifdef IMAGEPROCESSING +color.rgb=toLinearSpace(color.rgb);color=applyImageProcessing(color); +#endif +#endif +color.a*=visibility; +#ifdef PREMULTIPLYALPHA +color.rgb*=color.a; +#endif +#define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR +#ifdef PREPASS +float writeGeometryInfo=color.a>0.4 ? 1.0 : 0.0;gl_FragData[0]=color; +#ifdef PREPASS_POSITION +gl_FragData[PREPASS_POSITION_INDEX]=vec4(vPositionW,writeGeometryInfo); +#endif +#ifdef PREPASS_VELOCITY +vec2 a=(vCurrentPosition.xy/vCurrentPosition.w)*0.5+0.5;vec2 b=(vPreviousPosition.xy/vPreviousPosition.w)*0.5+0.5;vec2 velocity=abs(a-b);velocity=vec2(pow(velocity.x,1.0/3.0),pow(velocity.y,1.0/3.0))*sign(a-b)*0.5+0.5;gl_FragData[PREPASS_VELOCITY_INDEX]=vec4(velocity,0.0,writeGeometryInfo); +#endif +#ifdef PREPASS_IRRADIANCE +gl_FragData[PREPASS_IRRADIANCE_INDEX]=vec4(0.0,0.0,0.0,writeGeometryInfo); +#endif +#ifdef PREPASS_DEPTH +gl_FragData[PREPASS_DEPTH_INDEX]=vec4(vViewPos.z,0.0,0.0,writeGeometryInfo); +#endif +#ifdef PREPASS_NORMAL +#ifdef PREPASS_NORMAL_WORLDSPACE +gl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalW,writeGeometryInfo); +#else +gl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalize((view*vec4(normalW,0.0)).rgb),writeGeometryInfo); +#endif +#endif +#ifdef PREPASS_ALBEDO_SQRT +gl_FragData[PREPASS_ALBEDO_SQRT_INDEX]=vec4(0.0,0.0,0.0,writeGeometryInfo); +#endif +#ifdef PREPASS_REFLECTIVITY +#if defined(SPECULARTERM) +#if defined(SPECULAR) +gl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(toLinearSpace(specularMapColor))*writeGeometryInfo; +#else +gl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(toLinearSpace(specularColor),1.0)*writeGeometryInfo; +#endif +#else +gl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(0.0,0.0,0.0,1.0)*writeGeometryInfo; +#endif +#endif +#endif +#if !defined(PREPASS) || defined(WEBGL2) +gl_FragColor=color; +#endif +#include +#if ORDER_INDEPENDENT_TRANSPARENCY +if (fragDepth==nearestDepth) {frontColor.rgb+=color.rgb*color.a*alphaMultiplier;frontColor.a=1.0-alphaMultiplier*(1.0-color.a);} else {backColor+=color;} +#endif +#define CUSTOM_FRAGMENT_MAIN_END +} +`; +ShaderStore.ShadersStore[name34] = shader34; -// node_modules/@babylonjs/core/Materials/Node/Blocks/Input/animatedInputBlockTypes.js -var AnimatedInputBlockTypes; -(function(AnimatedInputBlockTypes2) { - AnimatedInputBlockTypes2[AnimatedInputBlockTypes2["None"] = 0] = "None"; - AnimatedInputBlockTypes2[AnimatedInputBlockTypes2["Time"] = 1] = "Time"; - AnimatedInputBlockTypes2[AnimatedInputBlockTypes2["RealTime"] = 2] = "RealTime"; -})(AnimatedInputBlockTypes || (AnimatedInputBlockTypes = {})); +// node_modules/@babylonjs/core/Shaders/ShadersInclude/decalVertexDeclaration.js +var name35 = "decalVertexDeclaration"; +var shader35 = `#ifdef DECAL +uniform vec4 vDecalInfos;uniform mat4 decalMatrix; +#endif +`; +ShaderStore.IncludesShadersStore[name35] = shader35; -// node_modules/@babylonjs/core/Materials/Node/Blocks/Input/inputBlock.js -var remapAttributeName = { - position2d: "position", - particle_uv: "vUV", - particle_color: "vColor", - particle_texturemask: "textureMask", - particle_positionw: "vPositionW" -}; -var attributeInFragmentOnly = { - particle_uv: true, - particle_color: true, - particle_texturemask: true, - particle_positionw: true -}; -var attributeAsUniform = { - particle_texturemask: true -}; -var InputBlock = class extends NodeMaterialBlock { - /** - * Gets or sets the connection point type (default is float) - */ - get type() { - if (this._type === NodeMaterialBlockConnectionPointTypes.AutoDetect) { - if (this.isUniform && this.value != null) { - if (!isNaN(this.value)) { - this._type = NodeMaterialBlockConnectionPointTypes.Float; - return this._type; - } - switch (this.value.getClassName()) { - case "Vector2": - this._type = NodeMaterialBlockConnectionPointTypes.Vector2; - return this._type; - case "Vector3": - this._type = NodeMaterialBlockConnectionPointTypes.Vector3; - return this._type; - case "Vector4": - this._type = NodeMaterialBlockConnectionPointTypes.Vector4; - return this._type; - case "Color3": - this._type = NodeMaterialBlockConnectionPointTypes.Color3; - return this._type; - case "Color4": - this._type = NodeMaterialBlockConnectionPointTypes.Color4; - return this._type; - case "Matrix": - this._type = NodeMaterialBlockConnectionPointTypes.Matrix; - return this._type; - } - } - if (this.isAttribute) { - switch (this.name) { - case "position": - case "normal": - case "particle_positionw": - this._type = NodeMaterialBlockConnectionPointTypes.Vector3; - return this._type; - case "uv": - case "uv2": - case "uv3": - case "uv4": - case "uv5": - case "uv6": - case "position2d": - case "particle_uv": - this._type = NodeMaterialBlockConnectionPointTypes.Vector2; - return this._type; - case "matricesIndices": - case "matricesWeights": - case "matricesIndicesExtra": - case "matricesWeightsExtra": - case "world0": - case "world1": - case "world2": - case "world3": - case "tangent": - this._type = NodeMaterialBlockConnectionPointTypes.Vector4; - return this._type; - case "color": - case "instanceColor": - case "particle_color": - case "particle_texturemask": - this._type = NodeMaterialBlockConnectionPointTypes.Color4; - return this._type; - } - } - if (this.isSystemValue) { - switch (this._systemValue) { - case NodeMaterialSystemValues.World: - case NodeMaterialSystemValues.WorldView: - case NodeMaterialSystemValues.WorldViewProjection: - case NodeMaterialSystemValues.View: - case NodeMaterialSystemValues.ViewProjection: - case NodeMaterialSystemValues.Projection: - this._type = NodeMaterialBlockConnectionPointTypes.Matrix; - return this._type; - case NodeMaterialSystemValues.CameraPosition: - this._type = NodeMaterialBlockConnectionPointTypes.Vector3; - return this._type; - case NodeMaterialSystemValues.FogColor: - this._type = NodeMaterialBlockConnectionPointTypes.Color3; - return this._type; - case NodeMaterialSystemValues.DeltaTime: - case NodeMaterialSystemValues.MaterialAlpha: - this._type = NodeMaterialBlockConnectionPointTypes.Float; - return this._type; - case NodeMaterialSystemValues.CameraParameters: - this._type = NodeMaterialBlockConnectionPointTypes.Vector4; - return this._type; - } - } - } - return this._type; - } - /** - * Creates a new InputBlock - * @param name defines the block name - * @param target defines the target of that block (Vertex by default) - * @param type defines the type of the input (can be set to NodeMaterialBlockConnectionPointTypes.AutoDetect) - */ - constructor(name69, target = NodeMaterialBlockTargets.Vertex, type = NodeMaterialBlockConnectionPointTypes.AutoDetect) { - super(name69, target, false); - this._mode = NodeMaterialBlockConnectionPointMode.Undefined; - this._animationType = AnimatedInputBlockTypes.None; - this.min = 0; - this.max = 0; - this.isBoolean = false; - this.matrixMode = 0; - this._systemValue = null; - this.isConstant = false; - this.groupInInspector = ""; - this.onValueChangedObservable = new Observable(); - this.convertToGammaSpace = false; - this.convertToLinearSpace = false; - this._type = type; - this.setDefaultValue(); - this.registerOutput("output", type); - } - /** - * Validates if a name is a reserve word. - * @param newName the new name to be given to the node. - * @returns false if the name is a reserve word, else true. - */ - validateBlockName(newName) { - if (!this.isAttribute) { - return super.validateBlockName(newName); - } - return true; - } - /** - * Gets the output component - */ - get output() { - return this._outputs[0]; - } - /** - * Set the source of this connection point to a vertex attribute - * @param attributeName defines the attribute name (position, uv, normal, etc...). If not specified it will take the connection point name - * @returns the current connection point - */ - setAsAttribute(attributeName) { - this._mode = NodeMaterialBlockConnectionPointMode.Attribute; - if (attributeName) { - this.name = attributeName; - } - return this; - } - /** - * Set the source of this connection point to a system value - * @param value define the system value to use (world, view, etc...) or null to switch to manual value - * @returns the current connection point - */ - setAsSystemValue(value) { - this.systemValue = value; - return this; - } - /** - * Gets or sets the value of that point. - * Please note that this value will be ignored if valueCallback is defined - */ - get value() { - return this._storedValue; - } - set value(value) { - if (this.type === NodeMaterialBlockConnectionPointTypes.Float) { - if (this.isBoolean) { - value = value ? 1 : 0; - } else if (this.min !== this.max) { - value = Math.max(this.min, value); - value = Math.min(this.max, value); - } - } - this._storedValue = value; - this._mode = NodeMaterialBlockConnectionPointMode.Uniform; - this.onValueChangedObservable.notifyObservers(this); - } - /** - * Gets or sets a callback used to get the value of that point. - * Please note that setting this value will force the connection point to ignore the value property - */ - get valueCallback() { - return this._valueCallback; - } - set valueCallback(value) { - this._valueCallback = value; - this._mode = NodeMaterialBlockConnectionPointMode.Uniform; - } - /** - * Gets or sets the associated variable name in the shader - */ - get associatedVariableName() { - return this._associatedVariableName; - } - set associatedVariableName(value) { - this._associatedVariableName = value; - } - /** Gets or sets the type of animation applied to the input */ - get animationType() { - return this._animationType; - } - set animationType(value) { - this._animationType = value; - } - /** - * Gets a boolean indicating that this connection point not defined yet - */ - get isUndefined() { - return this._mode === NodeMaterialBlockConnectionPointMode.Undefined; - } - /** - * Gets or sets a boolean indicating that this connection point is coming from an uniform. - * In this case the connection point name must be the name of the uniform to use. - * Can only be set on inputs - */ - get isUniform() { - return this._mode === NodeMaterialBlockConnectionPointMode.Uniform; - } - set isUniform(value) { - this._mode = value ? NodeMaterialBlockConnectionPointMode.Uniform : NodeMaterialBlockConnectionPointMode.Undefined; - this.associatedVariableName = ""; - } - /** - * Gets or sets a boolean indicating that this connection point is coming from an attribute. - * In this case the connection point name must be the name of the attribute to use - * Can only be set on inputs - */ - get isAttribute() { - return this._mode === NodeMaterialBlockConnectionPointMode.Attribute; - } - set isAttribute(value) { - this._mode = value ? NodeMaterialBlockConnectionPointMode.Attribute : NodeMaterialBlockConnectionPointMode.Undefined; - this.associatedVariableName = ""; - } - /** - * Gets or sets a boolean indicating that this connection point is generating a varying variable. - * Can only be set on exit points - */ - get isVarying() { - return this._mode === NodeMaterialBlockConnectionPointMode.Varying; - } - set isVarying(value) { - this._mode = value ? NodeMaterialBlockConnectionPointMode.Varying : NodeMaterialBlockConnectionPointMode.Undefined; - this.associatedVariableName = ""; - } - /** - * Gets a boolean indicating that the current connection point is a system value - */ - get isSystemValue() { - return this._systemValue != null; - } - /** - * Gets or sets the current well known value or null if not defined as a system value - */ - get systemValue() { - return this._systemValue; - } - set systemValue(value) { - this._mode = NodeMaterialBlockConnectionPointMode.Uniform; - this.associatedVariableName = ""; - this._systemValue = value; - } - /** - * Gets the current class name - * @returns the class name - */ - getClassName() { - return "InputBlock"; - } - /** - * Animate the input if animationType !== None - * @param scene defines the rendering scene - */ - animate(scene) { - switch (this._animationType) { - case AnimatedInputBlockTypes.Time: { - if (this.type === NodeMaterialBlockConnectionPointTypes.Float) { - this.value += scene.getAnimationRatio() * 0.01; - } - break; - } - case AnimatedInputBlockTypes.RealTime: { - if (this.type === NodeMaterialBlockConnectionPointTypes.Float) { - this.value = (PrecisionDate.Now - scene.getEngine().startTime) / 1e3; - } - break; - } - } - } - _emitDefine(define) { - if (define[0] === "!") { - return `#ifndef ${define.substring(1)} +// node_modules/@babylonjs/core/Shaders/ShadersInclude/defaultVertexDeclaration.js +var name36 = "defaultVertexDeclaration"; +var shader36 = `uniform mat4 viewProjection;uniform mat4 view; +#ifdef DIFFUSE +uniform mat4 diffuseMatrix;uniform vec2 vDiffuseInfos; +#endif +#ifdef AMBIENT +uniform mat4 ambientMatrix;uniform vec2 vAmbientInfos; +#endif +#ifdef OPACITY +uniform mat4 opacityMatrix;uniform vec2 vOpacityInfos; +#endif +#ifdef EMISSIVE +uniform vec2 vEmissiveInfos;uniform mat4 emissiveMatrix; +#endif +#ifdef LIGHTMAP +uniform vec2 vLightmapInfos;uniform mat4 lightmapMatrix; +#endif +#if defined(SPECULAR) && defined(SPECULARTERM) +uniform vec2 vSpecularInfos;uniform mat4 specularMatrix; +#endif +#ifdef BUMP +uniform vec3 vBumpInfos;uniform mat4 bumpMatrix; +#endif +#ifdef REFLECTION +uniform mat4 reflectionMatrix; +#endif +#ifdef POINTSIZE +uniform float pointSize; +#endif +#ifdef DETAIL +uniform vec4 vDetailInfos;uniform mat4 detailMatrix; +#endif +#include +#define ADDITIONAL_VERTEX_DECLARATION `; - } - return `#ifdef ${define} +ShaderStore.IncludesShadersStore[name36] = shader36; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/uvAttributeDeclaration.js +var name37 = "uvAttributeDeclaration"; +var shader37 = `#ifdef UV{X} +attribute vec2 uv{X}; +#endif `; - } - initialize() { - this.associatedVariableName = ""; - } - /** - * Set the input block to its default value (based on its type) - */ - setDefaultValue() { - switch (this.type) { - case NodeMaterialBlockConnectionPointTypes.Float: - this.value = 0; - break; - case NodeMaterialBlockConnectionPointTypes.Vector2: - this.value = Vector2.Zero(); - break; - case NodeMaterialBlockConnectionPointTypes.Vector3: - this.value = Vector3.Zero(); - break; - case NodeMaterialBlockConnectionPointTypes.Vector4: - this.value = Vector4.Zero(); - break; - case NodeMaterialBlockConnectionPointTypes.Color3: - this.value = Color3.White(); - break; - case NodeMaterialBlockConnectionPointTypes.Color4: - this.value = new Color4(1, 1, 1, 1); - break; - case NodeMaterialBlockConnectionPointTypes.Matrix: - this.value = Matrix.Identity(); - break; - } - } - _emitConstant(state) { - switch (this.type) { - case NodeMaterialBlockConnectionPointTypes.Float: - return `${state._emitFloat(this.value)}`; - case NodeMaterialBlockConnectionPointTypes.Vector2: - return `vec2(${this.value.x}, ${this.value.y})`; - case NodeMaterialBlockConnectionPointTypes.Vector3: - return `vec3(${this.value.x}, ${this.value.y}, ${this.value.z})`; - case NodeMaterialBlockConnectionPointTypes.Vector4: - return `vec4(${this.value.x}, ${this.value.y}, ${this.value.z}, ${this.value.w})`; - case NodeMaterialBlockConnectionPointTypes.Color3: - TmpColors.Color3[0].set(this.value.r, this.value.g, this.value.b); - if (this.convertToGammaSpace) { - TmpColors.Color3[0].toGammaSpaceToRef(TmpColors.Color3[0], state.sharedData.scene.getEngine().useExactSrgbConversions); - } - if (this.convertToLinearSpace) { - TmpColors.Color3[0].toLinearSpaceToRef(TmpColors.Color3[0], state.sharedData.scene.getEngine().useExactSrgbConversions); - } - return `vec3(${TmpColors.Color3[0].r}, ${TmpColors.Color3[0].g}, ${TmpColors.Color3[0].b})`; - case NodeMaterialBlockConnectionPointTypes.Color4: - TmpColors.Color4[0].set(this.value.r, this.value.g, this.value.b, this.value.a); - if (this.convertToGammaSpace) { - TmpColors.Color4[0].toGammaSpaceToRef(TmpColors.Color4[0], state.sharedData.scene.getEngine().useExactSrgbConversions); - } - if (this.convertToLinearSpace) { - TmpColors.Color4[0].toLinearSpaceToRef(TmpColors.Color4[0], state.sharedData.scene.getEngine().useExactSrgbConversions); - } - return `vec4(${TmpColors.Color4[0].r}, ${TmpColors.Color4[0].g}, ${TmpColors.Color4[0].b}, ${TmpColors.Color4[0].a})`; - } - return ""; - } - /** @internal */ - get _noContextSwitch() { - return attributeInFragmentOnly[this.name]; - } - _emit(state, define) { - if (this.isUniform) { - if (!this.associatedVariableName) { - this.associatedVariableName = state._getFreeVariableName("u_" + this.name); - } - if (this.isConstant) { - if (state.constants.indexOf(this.associatedVariableName) !== -1) { - return; - } - state.constants.push(this.associatedVariableName); - state._constantDeclaration += this._declareOutput(this.output, state) + ` = ${this._emitConstant(state)}; +ShaderStore.IncludesShadersStore[name37] = shader37; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/bonesDeclaration.js +var name38 = "bonesDeclaration"; +var shader38 = `#if NUM_BONE_INFLUENCERS>0 +attribute vec4 matricesIndices;attribute vec4 matricesWeights; +#if NUM_BONE_INFLUENCERS>4 +attribute vec4 matricesIndicesExtra;attribute vec4 matricesWeightsExtra; +#endif +#ifndef BAKED_VERTEX_ANIMATION_TEXTURE +#ifdef BONETEXTURE +uniform highp sampler2D boneSampler;uniform float boneTextureWidth; +#else +uniform mat4 mBones[BonesPerMesh]; +#endif +#ifdef BONES_VELOCITY_ENABLED +uniform mat4 mPreviousBones[BonesPerMesh]; +#endif +#ifdef BONETEXTURE +#define inline +mat4 readMatrixFromRawSampler(sampler2D smp,float index) +{float offset=index *4.0;float dx=1.0/boneTextureWidth;vec4 m0=texture2D(smp,vec2(dx*(offset+0.5),0.));vec4 m1=texture2D(smp,vec2(dx*(offset+1.5),0.));vec4 m2=texture2D(smp,vec2(dx*(offset+2.5),0.));vec4 m3=texture2D(smp,vec2(dx*(offset+3.5),0.));return mat4(m0,m1,m2,m3);} +#endif +#endif +#endif `; - return; - } - if (state.uniforms.indexOf(this.associatedVariableName) !== -1) { - return; - } - state.uniforms.push(this.associatedVariableName); - if (define) { - state._uniformDeclaration += this._emitDefine(define); - } - state._uniformDeclaration += `uniform ${state._getGLType(this.type)} ${this.associatedVariableName}; +ShaderStore.IncludesShadersStore[name38] = shader38; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/bakedVertexAnimationDeclaration.js +var name39 = "bakedVertexAnimationDeclaration"; +var shader39 = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE +uniform float bakedVertexAnimationTime;uniform vec2 bakedVertexAnimationTextureSizeInverted;uniform vec4 bakedVertexAnimationSettings;uniform sampler2D bakedVertexAnimationTexture; +#ifdef INSTANCES +attribute vec4 bakedVertexAnimationSettingsInstanced; +#endif +#define inline +mat4 readMatrixFromRawSamplerVAT(sampler2D smp,float index,float frame) +{float offset=index*4.0;float frameUV=(frame+0.5)*bakedVertexAnimationTextureSizeInverted.y;float dx=bakedVertexAnimationTextureSizeInverted.x;vec4 m0=texture2D(smp,vec2(dx*(offset+0.5),frameUV));vec4 m1=texture2D(smp,vec2(dx*(offset+1.5),frameUV));vec4 m2=texture2D(smp,vec2(dx*(offset+2.5),frameUV));vec4 m3=texture2D(smp,vec2(dx*(offset+3.5),frameUV));return mat4(m0,m1,m2,m3);} +#endif `; - if (define) { - state._uniformDeclaration += `#endif +ShaderStore.IncludesShadersStore[name39] = shader39; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/instancesDeclaration.js +var name40 = "instancesDeclaration"; +var shader40 = `#ifdef INSTANCES +attribute vec4 world0;attribute vec4 world1;attribute vec4 world2;attribute vec4 world3; +#ifdef INSTANCESCOLOR +attribute vec4 instanceColor; +#endif +#if defined(THIN_INSTANCES) && !defined(WORLD_UBO) +uniform mat4 world; +#endif +#if defined(VELOCITY) || defined(PREPASS_VELOCITY) +attribute vec4 previousWorld0;attribute vec4 previousWorld1;attribute vec4 previousWorld2;attribute vec4 previousWorld3; +#ifdef THIN_INSTANCES +uniform mat4 previousWorld; +#endif +#endif +#else +#if !defined(WORLD_UBO) +uniform mat4 world; +#endif +#if defined(VELOCITY) || defined(PREPASS_VELOCITY) +uniform mat4 previousWorld; +#endif +#endif `; - } - const hints = state.sharedData.hints; - if (this._systemValue !== null && this._systemValue !== void 0) { - switch (this._systemValue) { - case NodeMaterialSystemValues.WorldView: - hints.needWorldViewMatrix = true; - break; - case NodeMaterialSystemValues.WorldViewProjection: - hints.needWorldViewProjectionMatrix = true; - break; - } - } else { - if (this._animationType !== AnimatedInputBlockTypes.None) { - state.sharedData.animatedInputs.push(this); - } - } - return; - } - if (this.isAttribute) { - this.associatedVariableName = remapAttributeName[this.name] ?? this.name; - if (this.target === NodeMaterialBlockTargets.Vertex && state._vertexState) { - if (attributeInFragmentOnly[this.name]) { - if (attributeAsUniform[this.name]) { - state._emitUniformFromString(this.associatedVariableName, state._getGLType(this.type), define); - } else { - state._emitVaryingFromString(this.associatedVariableName, state._getGLType(this.type), define); - } - } else { - this._emit(state._vertexState, define); - } - return; - } - if (state.attributes.indexOf(this.associatedVariableName) !== -1) { - return; - } - state.attributes.push(this.associatedVariableName); - if (attributeInFragmentOnly[this.name]) { - if (attributeAsUniform[this.name]) { - state._emitUniformFromString(this.associatedVariableName, state._getGLType(this.type), define); - } else { - state._emitVaryingFromString(this.associatedVariableName, state._getGLType(this.type), define); - } - } else { - if (define) { - state._attributeDeclaration += this._emitDefine(define); - } - state._attributeDeclaration += `attribute ${state._getGLType(this.type)} ${this.associatedVariableName}; +ShaderStore.IncludesShadersStore[name40] = shader40; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/prePassVertexDeclaration.js +var name41 = "prePassVertexDeclaration"; +var shader41 = `#ifdef PREPASS +#ifdef PREPASS_DEPTH +varying vec3 vViewPos; +#endif +#ifdef PREPASS_VELOCITY +uniform mat4 previousViewProjection;varying vec4 vCurrentPosition;varying vec4 vPreviousPosition; +#endif +#endif `; - if (define) { - state._attributeDeclaration += `#endif +ShaderStore.IncludesShadersStore[name41] = shader41; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/samplerVertexDeclaration.js +var name42 = "samplerVertexDeclaration"; +var shader42 = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0 +varying vec2 v_VARYINGNAME_UV; +#endif `; - } - } - } - } - /** - * @internal - */ - _transmitWorld(effect, world, worldView, worldViewProjection) { - if (!this._systemValue) { - return; - } - const variableName = this.associatedVariableName; - switch (this._systemValue) { - case NodeMaterialSystemValues.World: - effect.setMatrix(variableName, world); - break; - case NodeMaterialSystemValues.WorldView: - effect.setMatrix(variableName, worldView); - break; - case NodeMaterialSystemValues.WorldViewProjection: - effect.setMatrix(variableName, worldViewProjection); - break; - } - } - /** - * @internal - */ - _transmit(effect, scene, material) { - if (this.isAttribute) { - return; - } - const variableName = this.associatedVariableName; - if (this._systemValue) { - switch (this._systemValue) { - case NodeMaterialSystemValues.World: - case NodeMaterialSystemValues.WorldView: - case NodeMaterialSystemValues.WorldViewProjection: - return; - case NodeMaterialSystemValues.View: - effect.setMatrix(variableName, scene.getViewMatrix()); - break; - case NodeMaterialSystemValues.Projection: - effect.setMatrix(variableName, scene.getProjectionMatrix()); - break; - case NodeMaterialSystemValues.ViewProjection: - effect.setMatrix(variableName, scene.getTransformMatrix()); - break; - case NodeMaterialSystemValues.CameraPosition: - scene.bindEyePosition(effect, variableName, true); - break; - case NodeMaterialSystemValues.FogColor: - effect.setColor3(variableName, scene.fogColor); - break; - case NodeMaterialSystemValues.DeltaTime: - effect.setFloat(variableName, scene.deltaTime / 1e3); - break; - case NodeMaterialSystemValues.CameraParameters: - if (scene.activeCamera) { - effect.setFloat4(variableName, scene.getEngine().hasOriginBottomLeft ? -1 : 1, scene.activeCamera.minZ, scene.activeCamera.maxZ, 1 / scene.activeCamera.maxZ); - } - break; - case NodeMaterialSystemValues.MaterialAlpha: - effect.setFloat(variableName, material.alpha); - break; - } - return; - } - const value = this._valueCallback ? this._valueCallback() : this._storedValue; - if (value === null) { - return; - } - switch (this.type) { - case NodeMaterialBlockConnectionPointTypes.Float: - effect.setFloat(variableName, value); - break; - case NodeMaterialBlockConnectionPointTypes.Int: - effect.setInt(variableName, value); - break; - case NodeMaterialBlockConnectionPointTypes.Color3: - TmpColors.Color3[0].set(this.value.r, this.value.g, this.value.b); - if (this.convertToGammaSpace) { - TmpColors.Color3[0].toGammaSpaceToRef(TmpColors.Color3[0], scene.getEngine().useExactSrgbConversions); - } - if (this.convertToLinearSpace) { - TmpColors.Color3[0].toLinearSpaceToRef(TmpColors.Color3[0], scene.getEngine().useExactSrgbConversions); - } - effect.setColor3(variableName, TmpColors.Color3[0]); - break; - case NodeMaterialBlockConnectionPointTypes.Color4: - TmpColors.Color4[0].set(this.value.r, this.value.g, this.value.b, this.value.a); - if (this.convertToGammaSpace) { - TmpColors.Color4[0].toGammaSpaceToRef(TmpColors.Color4[0], scene.getEngine().useExactSrgbConversions); - } - if (this.convertToLinearSpace) { - TmpColors.Color4[0].toLinearSpaceToRef(TmpColors.Color4[0], scene.getEngine().useExactSrgbConversions); - } - effect.setDirectColor4(variableName, TmpColors.Color4[0]); - break; - case NodeMaterialBlockConnectionPointTypes.Vector2: - effect.setVector2(variableName, value); - break; - case NodeMaterialBlockConnectionPointTypes.Vector3: - effect.setVector3(variableName, value); - break; - case NodeMaterialBlockConnectionPointTypes.Vector4: - effect.setVector4(variableName, value); - break; - case NodeMaterialBlockConnectionPointTypes.Matrix: - effect.setMatrix(variableName, value); - break; - } - } - _buildBlock(state) { - super._buildBlock(state); - if (this.isUniform || this.isSystemValue) { - state.sharedData.inputBlocks.push(this); - } - this._emit(state); - } - _dumpPropertiesCode() { - const variableName = this._codeVariableName; - if (this.isAttribute) { - return super._dumpPropertiesCode() + `${variableName}.setAsAttribute("${this.name}"); -`; - } - if (this.isSystemValue) { - return super._dumpPropertiesCode() + `${variableName}.setAsSystemValue(BABYLON.NodeMaterialSystemValues.${NodeMaterialSystemValues[this._systemValue]}); -`; - } - if (this.isUniform) { - const codes = []; - let valueString = ""; - switch (this.type) { - case NodeMaterialBlockConnectionPointTypes.Float: - valueString = `${this.value}`; - break; - case NodeMaterialBlockConnectionPointTypes.Vector2: - valueString = `new BABYLON.Vector2(${this.value.x}, ${this.value.y})`; - break; - case NodeMaterialBlockConnectionPointTypes.Vector3: - valueString = `new BABYLON.Vector3(${this.value.x}, ${this.value.y}, ${this.value.z})`; - break; - case NodeMaterialBlockConnectionPointTypes.Vector4: - valueString = `new BABYLON.Vector4(${this.value.x}, ${this.value.y}, ${this.value.z}, ${this.value.w})`; - break; - case NodeMaterialBlockConnectionPointTypes.Color3: - valueString = `new BABYLON.Color3(${this.value.r}, ${this.value.g}, ${this.value.b})`; - if (this.convertToGammaSpace) { - valueString += ".toGammaSpace()"; - } - if (this.convertToLinearSpace) { - valueString += ".toLinearSpace()"; - } - break; - case NodeMaterialBlockConnectionPointTypes.Color4: - valueString = `new BABYLON.Color4(${this.value.r}, ${this.value.g}, ${this.value.b}, ${this.value.a})`; - if (this.convertToGammaSpace) { - valueString += ".toGammaSpace()"; - } - if (this.convertToLinearSpace) { - valueString += ".toLinearSpace()"; - } - break; - case NodeMaterialBlockConnectionPointTypes.Matrix: - valueString = `BABYLON.Matrix.FromArray([${this.value.m}])`; - break; - } - codes.push(`${variableName}.value = ${valueString}`); - if (this.type === NodeMaterialBlockConnectionPointTypes.Float) { - codes.push(`${variableName}.min = ${this.min}`, `${variableName}.max = ${this.max}`, `${variableName}.isBoolean = ${this.isBoolean}`, `${variableName}.matrixMode = ${this.matrixMode}`, `${variableName}.animationType = BABYLON.AnimatedInputBlockTypes.${AnimatedInputBlockTypes[this.animationType]}`); - } - codes.push(`${variableName}.isConstant = ${this.isConstant}`); - codes.push(""); - return super._dumpPropertiesCode() + codes.join(";\n"); - } - return super._dumpPropertiesCode(); - } - dispose() { - this.onValueChangedObservable.clear(); - super.dispose(); - } - serialize() { - const serializationObject = super.serialize(); - serializationObject.type = this.type; - serializationObject.mode = this._mode; - serializationObject.systemValue = this._systemValue; - serializationObject.animationType = this._animationType; - serializationObject.min = this.min; - serializationObject.max = this.max; - serializationObject.isBoolean = this.isBoolean; - serializationObject.matrixMode = this.matrixMode; - serializationObject.isConstant = this.isConstant; - serializationObject.groupInInspector = this.groupInInspector; - serializationObject.convertToGammaSpace = this.convertToGammaSpace; - serializationObject.convertToLinearSpace = this.convertToLinearSpace; - if (this._storedValue != null && this._mode === NodeMaterialBlockConnectionPointMode.Uniform) { - if (this._storedValue.asArray) { - serializationObject.valueType = "BABYLON." + this._storedValue.getClassName(); - serializationObject.value = this._storedValue.asArray(); - } else { - serializationObject.valueType = "number"; - serializationObject.value = this._storedValue; - } - } - return serializationObject; - } - _deserialize(serializationObject, scene, rootUrl) { - this._mode = serializationObject.mode; - super._deserialize(serializationObject, scene, rootUrl); - this._type = serializationObject.type; - this._systemValue = serializationObject.systemValue || serializationObject.wellKnownValue; - this._animationType = serializationObject.animationType; - this.min = serializationObject.min || 0; - this.max = serializationObject.max || 0; - this.isBoolean = !!serializationObject.isBoolean; - this.matrixMode = serializationObject.matrixMode || 0; - this.isConstant = !!serializationObject.isConstant; - this.groupInInspector = serializationObject.groupInInspector || ""; - this.convertToGammaSpace = !!serializationObject.convertToGammaSpace; - this.convertToLinearSpace = !!serializationObject.convertToLinearSpace; - if (serializationObject.name === "tangent" && serializationObject.mode === NodeMaterialBlockConnectionPointMode.Attribute && serializationObject.type === NodeMaterialBlockConnectionPointTypes.Vector3) { - this._type = NodeMaterialBlockConnectionPointTypes.Vector4; - } - if (!serializationObject.valueType) { - return; - } - if (serializationObject.valueType === "number") { - this._storedValue = serializationObject.value; - } else { - const valueType = GetClass(serializationObject.valueType); - if (valueType) { - this._storedValue = valueType.FromArray(serializationObject.value); - } - } - } -}; -RegisterClass("BABYLON.InputBlock", InputBlock); +ShaderStore.IncludesShadersStore[name42] = shader42; -// node_modules/@babylonjs/core/Materials/Node/Blocks/Dual/currentScreenBlock.js -var CurrentScreenBlock = class extends NodeMaterialBlock { - /** - * Create a new CurrentScreenBlock - * @param name defines the block name - */ - constructor(name69) { - super(name69, NodeMaterialBlockTargets.VertexAndFragment); - this._samplerName = "textureSampler"; - this.convertToGammaSpace = false; - this.convertToLinearSpace = false; - this._isUnique = false; - this.registerInput("uv", NodeMaterialBlockConnectionPointTypes.AutoDetect, false, NodeMaterialBlockTargets.VertexAndFragment); - this.registerOutput("rgba", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Neutral); - this.registerOutput("rgb", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Neutral); - this.registerOutput("r", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); - this.registerOutput("g", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); - this.registerOutput("b", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); - this.registerOutput("a", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); - this._inputs[0].addExcludedConnectionPointFromAllowedTypes(NodeMaterialBlockConnectionPointTypes.Vector2 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4); - this._inputs[0]._prioritizeVertex = false; - } - /** - * Gets the current class name - * @returns the class name - */ - getClassName() { - return "CurrentScreenBlock"; - } - /** - * Gets the uv input component - */ - get uv() { - return this._inputs[0]; - } - /** - * Gets the rgba output component - */ - get rgba() { - return this._outputs[0]; - } - /** - * Gets the rgb output component - */ - get rgb() { - return this._outputs[1]; - } - /** - * Gets the r output component - */ - get r() { - return this._outputs[2]; - } - /** - * Gets the g output component - */ - get g() { - return this._outputs[3]; - } - /** - * Gets the b output component - */ - get b() { - return this._outputs[4]; - } - /** - * Gets the a output component - */ - get a() { - return this._outputs[5]; - } - /** - * Initialize the block and prepare the context for build - * @param state defines the state that will be used for the build - */ - initialize(state) { - state._excludeVariableName("textureSampler"); - } - get target() { - if (!this.uv.isConnected) { - return NodeMaterialBlockTargets.VertexAndFragment; - } - if (this.uv.sourceBlock.isInput) { - return NodeMaterialBlockTargets.VertexAndFragment; - } - return NodeMaterialBlockTargets.Fragment; - } - prepareDefines(mesh, nodeMaterial, defines) { - defines.setValue(this._linearDefineName, this.convertToGammaSpace, true); - defines.setValue(this._gammaDefineName, this.convertToLinearSpace, true); - } - isReady() { - if (this.texture && !this.texture.isReadyOrNotBlocking()) { - return false; - } - return true; - } - _injectVertexCode(state) { - const uvInput = this.uv; - if (uvInput.connectedPoint.ownerBlock.isInput) { - const uvInputOwnerBlock = uvInput.connectedPoint.ownerBlock; - if (!uvInputOwnerBlock.isAttribute) { - state._emitUniformFromString(uvInput.associatedVariableName, "vec2"); - } - } - this._mainUVName = "vMain" + uvInput.associatedVariableName; - state._emitVaryingFromString(this._mainUVName, "vec2"); - state.compilationString += `${this._mainUVName} = ${uvInput.associatedVariableName}.xy; -`; - if (!this._outputs.some((o) => o.isConnectedInVertexShader)) { - return; - } - this._writeTextureRead(state, true); - for (const output of this._outputs) { - if (output.hasEndpoints) { - this._writeOutput(state, output, output.name, true); - } - } - } - _writeTextureRead(state, vertexMode = false) { - const uvInput = this.uv; - if (vertexMode) { - if (state.target === NodeMaterialBlockTargets.Fragment) { - return; - } - state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${uvInput.associatedVariableName}); -`; - return; - } - if (this.uv.ownerBlock.target === NodeMaterialBlockTargets.Fragment) { - state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${uvInput.associatedVariableName}); -`; - return; - } - state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${this._mainUVName}); +// node_modules/@babylonjs/core/Shaders/ShadersInclude/bumpVertexDeclaration.js +var name43 = "bumpVertexDeclaration"; +var shader43 = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) +#if defined(TANGENT) && defined(NORMAL) +varying mat3 vTBN; +#endif +#endif `; - } - _writeOutput(state, output, swizzle, vertexMode = false) { - if (vertexMode) { - if (state.target === NodeMaterialBlockTargets.Fragment) { - return; - } - state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle}; +ShaderStore.IncludesShadersStore[name43] = shader43; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/clipPlaneVertexDeclaration.js +var name44 = "clipPlaneVertexDeclaration"; +var shader44 = `#ifdef CLIPPLANE +uniform vec4 vClipPlane;varying float fClipDistance; +#endif +#ifdef CLIPPLANE2 +uniform vec4 vClipPlane2;varying float fClipDistance2; +#endif +#ifdef CLIPPLANE3 +uniform vec4 vClipPlane3;varying float fClipDistance3; +#endif +#ifdef CLIPPLANE4 +uniform vec4 vClipPlane4;varying float fClipDistance4; +#endif +#ifdef CLIPPLANE5 +uniform vec4 vClipPlane5;varying float fClipDistance5; +#endif +#ifdef CLIPPLANE6 +uniform vec4 vClipPlane6;varying float fClipDistance6; +#endif `; - return; - } - if (this.uv.ownerBlock.target === NodeMaterialBlockTargets.Fragment) { - state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle}; +ShaderStore.IncludesShadersStore[name44] = shader44; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/fogVertexDeclaration.js +var name45 = "fogVertexDeclaration"; +var shader45 = `#ifdef FOG +varying vec3 vFogDistance; +#endif `; - return; - } - state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle}; +ShaderStore.IncludesShadersStore[name45] = shader45; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/lightVxFragmentDeclaration.js +var name46 = "lightVxFragmentDeclaration"; +var shader46 = `#ifdef LIGHT{X} +uniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X}; +#ifdef SPECULARTERM +uniform vec4 vLightSpecular{X}; +#else +vec4 vLightSpecular{X}=vec4(0.); +#endif +#ifdef SHADOW{X} +#ifdef SHADOWCSM{X} +uniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X}; +#elif defined(SHADOWCUBE{X}) +#else +varying vec4 vPositionFromLight{X};varying float vDepthMetric{X};uniform mat4 lightMatrix{X}; +#endif +uniform vec4 shadowsInfo{X};uniform vec2 depthValues{X}; +#endif +#ifdef SPOTLIGHT{X} +uniform vec4 vLightDirection{X};uniform vec4 vLightFalloff{X}; +#elif defined(POINTLIGHT{X}) +uniform vec4 vLightFalloff{X}; +#elif defined(HEMILIGHT{X}) +uniform vec3 vLightGround{X}; +#endif +#endif `; - state.compilationString += `#ifdef ${this._linearDefineName} +ShaderStore.IncludesShadersStore[name46] = shader46; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/lightVxUboDeclaration.js +var name47 = "lightVxUboDeclaration"; +var shader47 = `#ifdef LIGHT{X} +uniform Light{X} +{vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular; +#ifdef SPOTLIGHT{X} +vec4 vLightDirection;vec4 vLightFalloff; +#elif defined(POINTLIGHT{X}) +vec4 vLightFalloff; +#elif defined(HEMILIGHT{X}) +vec3 vLightGround; +#endif +vec4 shadowsInfo;vec2 depthValues;} light{X}; +#ifdef SHADOW{X} +#ifdef SHADOWCSM{X} +uniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X}; +#elif defined(SHADOWCUBE{X}) +#else +varying vec4 vPositionFromLight{X};varying float vDepthMetric{X};uniform mat4 lightMatrix{X}; +#endif +#endif +#endif `; - state.compilationString += `${output.associatedVariableName} = toGammaSpace(${output.associatedVariableName}); +ShaderStore.IncludesShadersStore[name47] = shader47; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/morphTargetsVertexGlobalDeclaration.js +var name48 = "morphTargetsVertexGlobalDeclaration"; +var shader48 = `#ifdef MORPHTARGETS +uniform float morphTargetInfluences[NUM_MORPH_INFLUENCERS]; +#ifdef MORPHTARGETS_TEXTURE +uniform float morphTargetTextureIndices[NUM_MORPH_INFLUENCERS];uniform vec3 morphTargetTextureInfo;uniform highp sampler2DArray morphTargets;vec3 readVector3FromRawSampler(int targetIndex,float vertexIndex) +{ +float y=floor(vertexIndex/morphTargetTextureInfo.y);float x=vertexIndex-y*morphTargetTextureInfo.y;vec3 textureUV=vec3((x+0.5)/morphTargetTextureInfo.y,(y+0.5)/morphTargetTextureInfo.z,morphTargetTextureIndices[targetIndex]);return texture(morphTargets,textureUV).xyz;} +#endif +#endif `; - state.compilationString += `#endif +ShaderStore.IncludesShadersStore[name48] = shader48; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/morphTargetsVertexDeclaration.js +var name49 = "morphTargetsVertexDeclaration"; +var shader49 = `#ifdef MORPHTARGETS +#ifndef MORPHTARGETS_TEXTURE +attribute vec3 position{X}; +#ifdef MORPHTARGETS_NORMAL +attribute vec3 normal{X}; +#endif +#ifdef MORPHTARGETS_TANGENT +attribute vec3 tangent{X}; +#endif +#ifdef MORPHTARGETS_UV +attribute vec2 uv_{X}; +#endif +#elif {X}==0 +uniform int morphTargetCount; +#endif +#endif `; - state.compilationString += `#ifdef ${this._gammaDefineName} +ShaderStore.IncludesShadersStore[name49] = shader49; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/morphTargetsVertexGlobal.js +var name50 = "morphTargetsVertexGlobal"; +var shader50 = `#ifdef MORPHTARGETS +#ifdef MORPHTARGETS_TEXTURE +float vertexID; +#endif +#endif `; - state.compilationString += `${output.associatedVariableName} = toLinearSpace(${output.associatedVariableName}); +ShaderStore.IncludesShadersStore[name50] = shader50; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/morphTargetsVertex.js +var name51 = "morphTargetsVertex"; +var shader51 = `#ifdef MORPHTARGETS +#ifdef MORPHTARGETS_TEXTURE +#if {X}==0 +for (int i=0; i=morphTargetCount) break;vertexID=float(gl_VertexID)*morphTargetTextureInfo.x;positionUpdated+=(readVector3FromRawSampler(i,vertexID)-position)*morphTargetInfluences[i];vertexID+=1.0; +#ifdef MORPHTARGETS_NORMAL +normalUpdated+=(readVector3FromRawSampler(i,vertexID) -normal)*morphTargetInfluences[i];vertexID+=1.0; +#endif +#ifdef MORPHTARGETS_UV +uvUpdated+=(readVector3FromRawSampler(i,vertexID).xy-uv)*morphTargetInfluences[i];vertexID+=1.0; +#endif +#ifdef MORPHTARGETS_TANGENT +tangentUpdated.xyz+=(readVector3FromRawSampler(i,vertexID) -tangent.xyz)*morphTargetInfluences[i]; +#endif +} +#endif +#else +positionUpdated+=(position{X}-position)*morphTargetInfluences[{X}]; +#ifdef MORPHTARGETS_NORMAL +normalUpdated+=(normal{X}-normal)*morphTargetInfluences[{X}]; +#endif +#ifdef MORPHTARGETS_TANGENT +tangentUpdated.xyz+=(tangent{X}-tangent.xyz)*morphTargetInfluences[{X}]; +#endif +#ifdef MORPHTARGETS_UV +uvUpdated+=(uv_{X}-uv)*morphTargetInfluences[{X}]; +#endif +#endif +#endif `; - state.compilationString += `#endif +ShaderStore.IncludesShadersStore[name51] = shader51; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/instancesVertex.js +var name52 = "instancesVertex"; +var shader52 = `#ifdef INSTANCES +mat4 finalWorld=mat4(world0,world1,world2,world3); +#if defined(PREPASS_VELOCITY) || defined(VELOCITY) +mat4 finalPreviousWorld=mat4(previousWorld0,previousWorld1,previousWorld2,previousWorld3); +#endif +#ifdef THIN_INSTANCES +finalWorld=world*finalWorld; +#if defined(PREPASS_VELOCITY) || defined(VELOCITY) +finalPreviousWorld=previousWorld*finalPreviousWorld; +#endif +#endif +#else +mat4 finalWorld=world; +#if defined(PREPASS_VELOCITY) || defined(VELOCITY) +mat4 finalPreviousWorld=previousWorld; +#endif +#endif `; - } - _buildBlock(state) { - super._buildBlock(state); - this._tempTextureRead = state._getFreeVariableName("tempTextureRead"); - if (state.sharedData.blockingBlocks.indexOf(this) < 0) { - state.sharedData.blockingBlocks.push(this); - } - if (state.sharedData.textureBlocks.indexOf(this) < 0) { - state.sharedData.textureBlocks.push(this); - } - if (state.sharedData.blocksWithDefines.indexOf(this) < 0) { - state.sharedData.blocksWithDefines.push(this); - } - if (state.target !== NodeMaterialBlockTargets.Fragment) { - state._emit2DSampler(this._samplerName); - this._injectVertexCode(state); - return; - } - if (!this._outputs.some((o) => o.isConnectedInFragmentShader)) { - return; - } - state._emit2DSampler(this._samplerName); - this._linearDefineName = state._getFreeDefineName("ISLINEAR"); - this._gammaDefineName = state._getFreeDefineName("ISGAMMA"); - const comments = `//${this.name}`; - state._emitFunctionFromInclude("helperFunctions", comments); - this._writeTextureRead(state); - for (const output of this._outputs) { - if (output.hasEndpoints) { - this._writeOutput(state, output, output.name); - } - } - return this; - } - serialize() { - const serializationObject = super.serialize(); - serializationObject.convertToGammaSpace = this.convertToGammaSpace; - serializationObject.convertToLinearSpace = this.convertToLinearSpace; - if (this.texture && !this.texture.isRenderTarget) { - serializationObject.texture = this.texture.serialize(); - } - return serializationObject; - } - _deserialize(serializationObject, scene, rootUrl) { - super._deserialize(serializationObject, scene, rootUrl); - this.convertToGammaSpace = serializationObject.convertToGammaSpace; - this.convertToLinearSpace = !!serializationObject.convertToLinearSpace; - if (serializationObject.texture) { - rootUrl = serializationObject.texture.url.indexOf("data:") === 0 ? "" : rootUrl; - this.texture = Texture.Parse(serializationObject.texture, scene, rootUrl); - } - } -}; -RegisterClass("BABYLON.CurrentScreenBlock", CurrentScreenBlock); +ShaderStore.IncludesShadersStore[name52] = shader52; -// node_modules/@babylonjs/core/Materials/Node/Blocks/Particle/particleTextureBlock.js -var ParticleTextureBlock = class extends NodeMaterialBlock { - /** - * Create a new ParticleTextureBlock - * @param name defines the block name - */ - constructor(name69) { - super(name69, NodeMaterialBlockTargets.Fragment); - this._samplerName = "diffuseSampler"; - this.convertToGammaSpace = false; - this.convertToLinearSpace = false; - this._isUnique = false; - this.registerInput("uv", NodeMaterialBlockConnectionPointTypes.AutoDetect, false, NodeMaterialBlockTargets.VertexAndFragment); - this.registerOutput("rgba", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Neutral); - this.registerOutput("rgb", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Neutral); - this.registerOutput("r", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); - this.registerOutput("g", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); - this.registerOutput("b", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); - this.registerOutput("a", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); - this._inputs[0].addExcludedConnectionPointFromAllowedTypes(NodeMaterialBlockConnectionPointTypes.Vector2 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4); - } - /** - * Gets the current class name - * @returns the class name - */ - getClassName() { - return "ParticleTextureBlock"; - } - /** - * Gets the uv input component - */ - get uv() { - return this._inputs[0]; - } - /** - * Gets the rgba output component - */ - get rgba() { - return this._outputs[0]; - } - /** - * Gets the rgb output component - */ - get rgb() { - return this._outputs[1]; - } - /** - * Gets the r output component - */ - get r() { - return this._outputs[2]; - } - /** - * Gets the g output component - */ - get g() { - return this._outputs[3]; - } - /** - * Gets the b output component - */ - get b() { - return this._outputs[4]; - } - /** - * Gets the a output component - */ - get a() { - return this._outputs[5]; - } - /** - * Initialize the block and prepare the context for build - * @param state defines the state that will be used for the build - */ - initialize(state) { - state._excludeVariableName("diffuseSampler"); - } - autoConfigure(material, additionalFilteringInfo = () => true) { - if (!this.uv.isConnected) { - let uvInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === "particle_uv" && additionalFilteringInfo(b)); - if (!uvInput) { - uvInput = new InputBlock("uv"); - uvInput.setAsAttribute("particle_uv"); - } - uvInput.output.connectTo(this.uv); - } - } - prepareDefines(mesh, nodeMaterial, defines) { - defines.setValue(this._linearDefineName, this.convertToGammaSpace, true); - defines.setValue(this._gammaDefineName, this.convertToLinearSpace, true); - } - isReady() { - if (this.texture && !this.texture.isReadyOrNotBlocking()) { - return false; - } - return true; - } - _writeOutput(state, output, swizzle) { - state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle}; -`; - state.compilationString += `#ifdef ${this._linearDefineName} -`; - state.compilationString += `${output.associatedVariableName} = toGammaSpace(${output.associatedVariableName}); +// node_modules/@babylonjs/core/Shaders/ShadersInclude/bonesVertex.js +var name53 = "bonesVertex"; +var shader53 = `#ifndef BAKED_VERTEX_ANIMATION_TEXTURE +#if NUM_BONE_INFLUENCERS>0 +mat4 influence; +#ifdef BONETEXTURE +influence=readMatrixFromRawSampler(boneSampler,matricesIndices[0])*matricesWeights[0]; +#if NUM_BONE_INFLUENCERS>1 +influence+=readMatrixFromRawSampler(boneSampler,matricesIndices[1])*matricesWeights[1]; +#endif +#if NUM_BONE_INFLUENCERS>2 +influence+=readMatrixFromRawSampler(boneSampler,matricesIndices[2])*matricesWeights[2]; +#endif +#if NUM_BONE_INFLUENCERS>3 +influence+=readMatrixFromRawSampler(boneSampler,matricesIndices[3])*matricesWeights[3]; +#endif +#if NUM_BONE_INFLUENCERS>4 +influence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[0])*matricesWeightsExtra[0]; +#endif +#if NUM_BONE_INFLUENCERS>5 +influence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[1])*matricesWeightsExtra[1]; +#endif +#if NUM_BONE_INFLUENCERS>6 +influence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[2])*matricesWeightsExtra[2]; +#endif +#if NUM_BONE_INFLUENCERS>7 +influence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[3])*matricesWeightsExtra[3]; +#endif +#else +influence=mBones[int(matricesIndices[0])]*matricesWeights[0]; +#if NUM_BONE_INFLUENCERS>1 +influence+=mBones[int(matricesIndices[1])]*matricesWeights[1]; +#endif +#if NUM_BONE_INFLUENCERS>2 +influence+=mBones[int(matricesIndices[2])]*matricesWeights[2]; +#endif +#if NUM_BONE_INFLUENCERS>3 +influence+=mBones[int(matricesIndices[3])]*matricesWeights[3]; +#endif +#if NUM_BONE_INFLUENCERS>4 +influence+=mBones[int(matricesIndicesExtra[0])]*matricesWeightsExtra[0]; +#endif +#if NUM_BONE_INFLUENCERS>5 +influence+=mBones[int(matricesIndicesExtra[1])]*matricesWeightsExtra[1]; +#endif +#if NUM_BONE_INFLUENCERS>6 +influence+=mBones[int(matricesIndicesExtra[2])]*matricesWeightsExtra[2]; +#endif +#if NUM_BONE_INFLUENCERS>7 +influence+=mBones[int(matricesIndicesExtra[3])]*matricesWeightsExtra[3]; +#endif +#endif +finalWorld=finalWorld*influence; +#endif +#endif `; - state.compilationString += `#endif +ShaderStore.IncludesShadersStore[name53] = shader53; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/bakedVertexAnimation.js +var name54 = "bakedVertexAnimation"; +var shader54 = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE +{ +#ifdef INSTANCES +#define BVASNAME bakedVertexAnimationSettingsInstanced +#else +#define BVASNAME bakedVertexAnimationSettings +#endif +float VATStartFrame=BVASNAME.x;float VATEndFrame=BVASNAME.y;float VATOffsetFrame=BVASNAME.z;float VATSpeed=BVASNAME.w;float totalFrames=VATEndFrame-VATStartFrame+1.0;float time=bakedVertexAnimationTime*VATSpeed/totalFrames;float frameCorrection=time<1.0 ? 0.0 : 1.0;float numOfFrames=totalFrames-frameCorrection;float VATFrameNum=fract(time)*numOfFrames;VATFrameNum=mod(VATFrameNum+VATOffsetFrame,numOfFrames);VATFrameNum=floor(VATFrameNum);VATFrameNum+=VATStartFrame+frameCorrection;mat4 VATInfluence;VATInfluence=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[0],VATFrameNum)*matricesWeights[0]; +#if NUM_BONE_INFLUENCERS>1 +VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[1],VATFrameNum)*matricesWeights[1]; +#endif +#if NUM_BONE_INFLUENCERS>2 +VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[2],VATFrameNum)*matricesWeights[2]; +#endif +#if NUM_BONE_INFLUENCERS>3 +VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[3],VATFrameNum)*matricesWeights[3]; +#endif +#if NUM_BONE_INFLUENCERS>4 +VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[0],VATFrameNum)*matricesWeightsExtra[0]; +#endif +#if NUM_BONE_INFLUENCERS>5 +VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[1],VATFrameNum)*matricesWeightsExtra[1]; +#endif +#if NUM_BONE_INFLUENCERS>6 +VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[2],VATFrameNum)*matricesWeightsExtra[2]; +#endif +#if NUM_BONE_INFLUENCERS>7 +VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[3],VATFrameNum)*matricesWeightsExtra[3]; +#endif +finalWorld=finalWorld*VATInfluence;} +#endif `; - state.compilationString += `#ifdef ${this._gammaDefineName} +ShaderStore.IncludesShadersStore[name54] = shader54; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/prePassVertex.js +var name55 = "prePassVertex"; +var shader55 = `#ifdef PREPASS_DEPTH +vViewPos=(view*worldPos).rgb; +#endif +#if defined(PREPASS_VELOCITY) && defined(BONES_VELOCITY_ENABLED) +vCurrentPosition=viewProjection*worldPos; +#if NUM_BONE_INFLUENCERS>0 +mat4 previousInfluence;previousInfluence=mPreviousBones[int(matricesIndices[0])]*matricesWeights[0]; +#if NUM_BONE_INFLUENCERS>1 +previousInfluence+=mPreviousBones[int(matricesIndices[1])]*matricesWeights[1]; +#endif +#if NUM_BONE_INFLUENCERS>2 +previousInfluence+=mPreviousBones[int(matricesIndices[2])]*matricesWeights[2]; +#endif +#if NUM_BONE_INFLUENCERS>3 +previousInfluence+=mPreviousBones[int(matricesIndices[3])]*matricesWeights[3]; +#endif +#if NUM_BONE_INFLUENCERS>4 +previousInfluence+=mPreviousBones[int(matricesIndicesExtra[0])]*matricesWeightsExtra[0]; +#endif +#if NUM_BONE_INFLUENCERS>5 +previousInfluence+=mPreviousBones[int(matricesIndicesExtra[1])]*matricesWeightsExtra[1]; +#endif +#if NUM_BONE_INFLUENCERS>6 +previousInfluence+=mPreviousBones[int(matricesIndicesExtra[2])]*matricesWeightsExtra[2]; +#endif +#if NUM_BONE_INFLUENCERS>7 +previousInfluence+=mPreviousBones[int(matricesIndicesExtra[3])]*matricesWeightsExtra[3]; +#endif +vPreviousPosition=previousViewProjection*finalPreviousWorld*previousInfluence*vec4(positionUpdated,1.0); +#else +vPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0); +#endif +#endif `; - state.compilationString += `${output.associatedVariableName} = toLinearSpace(${output.associatedVariableName}); +ShaderStore.IncludesShadersStore[name55] = shader55; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/uvVariableDeclaration.js +var name56 = "uvVariableDeclaration"; +var shader56 = `#if !defined(UV{X}) && defined(MAINUV{X}) +vec2 uv{X}=vec2(0.,0.); +#endif +#ifdef MAINUV{X} +vMainUV{X}=uv{X}; +#endif `; - state.compilationString += `#endif +ShaderStore.IncludesShadersStore[name56] = shader56; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/samplerVertexImplementation.js +var name57 = "samplerVertexImplementation"; +var shader57 = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0 +if (v_INFONAME_==0.) +{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uvUpdated,1.0,0.0));} +#ifdef UV2 +else if (v_INFONAME_==1.) +{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv2,1.0,0.0));} +#endif +#ifdef UV3 +else if (v_INFONAME_==2.) +{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv3,1.0,0.0));} +#endif +#ifdef UV4 +else if (v_INFONAME_==3.) +{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv4,1.0,0.0));} +#endif +#ifdef UV5 +else if (v_INFONAME_==4.) +{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv5,1.0,0.0));} +#endif +#ifdef UV6 +else if (v_INFONAME_==5.) +{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv6,1.0,0.0));} +#endif +#endif `; - } - _buildBlock(state) { - super._buildBlock(state); - if (state.target === NodeMaterialBlockTargets.Vertex) { - return; - } - this._tempTextureRead = state._getFreeVariableName("tempTextureRead"); - state._emit2DSampler(this._samplerName); - state.sharedData.blockingBlocks.push(this); - state.sharedData.textureBlocks.push(this); - state.sharedData.blocksWithDefines.push(this); - this._linearDefineName = state._getFreeDefineName("ISLINEAR"); - this._gammaDefineName = state._getFreeDefineName("ISGAMMA"); - const comments = `//${this.name}`; - state._emitFunctionFromInclude("helperFunctions", comments); - state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${this.uv.associatedVariableName}); +ShaderStore.IncludesShadersStore[name57] = shader57; + +// node_modules/@babylonjs/core/Shaders/ShadersInclude/bumpVertex.js +var name58 = "bumpVertex"; +var shader58 = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) +#if defined(TANGENT) && defined(NORMAL) +vec3 tbnNormal=normalize(normalUpdated);vec3 tbnTangent=normalize(tangentUpdated.xyz);vec3 tbnBitangent=cross(tbnNormal,tbnTangent)*tangentUpdated.w;vTBN=mat3(finalWorld)*mat3(tbnTangent,tbnBitangent,tbnNormal); +#endif +#endif `; - for (const output of this._outputs) { - if (output.hasEndpoints) { - this._writeOutput(state, output, output.name); - } - } - return this; - } - serialize() { - const serializationObject = super.serialize(); - serializationObject.convertToGammaSpace = this.convertToGammaSpace; - serializationObject.convertToLinearSpace = this.convertToLinearSpace; - if (this.texture && !this.texture.isRenderTarget) { - serializationObject.texture = this.texture.serialize(); - } - return serializationObject; - } - _deserialize(serializationObject, scene, rootUrl) { - super._deserialize(serializationObject, scene, rootUrl); - this.convertToGammaSpace = serializationObject.convertToGammaSpace; - this.convertToLinearSpace = !!serializationObject.convertToLinearSpace; - if (serializationObject.texture) { - rootUrl = serializationObject.texture.url.indexOf("data:") === 0 ? "" : rootUrl; - this.texture = Texture.Parse(serializationObject.texture, scene, rootUrl); - } - } -}; -RegisterClass("BABYLON.ParticleTextureBlock", ParticleTextureBlock); +ShaderStore.IncludesShadersStore[name58] = shader58; -// node_modules/@babylonjs/core/Materials/Node/Blocks/Particle/particleRampGradientBlock.js -var ParticleRampGradientBlock = class extends NodeMaterialBlock { - /** - * Create a new ParticleRampGradientBlock - * @param name defines the block name - */ - constructor(name69) { - super(name69, NodeMaterialBlockTargets.Fragment); - this._isUnique = true; - this.registerInput("color", NodeMaterialBlockConnectionPointTypes.Color4, false, NodeMaterialBlockTargets.Fragment); - this.registerOutput("rampColor", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Fragment); - } - /** - * Gets the current class name - * @returns the class name - */ - getClassName() { - return "ParticleRampGradientBlock"; - } - /** - * Gets the color input component - */ - get color() { - return this._inputs[0]; - } - /** - * Gets the rampColor output component - */ - get rampColor() { - return this._outputs[0]; - } - /** - * Initialize the block and prepare the context for build - * @param state defines the state that will be used for the build - */ - initialize(state) { - state._excludeVariableName("remapRanges"); - state._excludeVariableName("rampSampler"); - state._excludeVariableName("baseColor"); - state._excludeVariableName("alpha"); - state._excludeVariableName("remappedColorIndex"); - state._excludeVariableName("rampColor"); - state._excludeVariableName("finalAlpha"); - } - _buildBlock(state) { - super._buildBlock(state); - if (state.target === NodeMaterialBlockTargets.Vertex) { - return; - } - state._emit2DSampler("rampSampler"); - state._emitVaryingFromString("remapRanges", "vec4", "RAMPGRADIENT"); - state.compilationString += ` - #ifdef RAMPGRADIENT - vec4 baseColor = ${this.color.associatedVariableName}; - float alpha = ${this.color.associatedVariableName}.a; +// node_modules/@babylonjs/core/Shaders/ShadersInclude/clipPlaneVertex.js +var name59 = "clipPlaneVertex"; +var shader59 = `#ifdef CLIPPLANE +fClipDistance=dot(worldPos,vClipPlane); +#endif +#ifdef CLIPPLANE2 +fClipDistance2=dot(worldPos,vClipPlane2); +#endif +#ifdef CLIPPLANE3 +fClipDistance3=dot(worldPos,vClipPlane3); +#endif +#ifdef CLIPPLANE4 +fClipDistance4=dot(worldPos,vClipPlane4); +#endif +#ifdef CLIPPLANE5 +fClipDistance5=dot(worldPos,vClipPlane5); +#endif +#ifdef CLIPPLANE6 +fClipDistance6=dot(worldPos,vClipPlane6); +#endif +`; +ShaderStore.IncludesShadersStore[name59] = shader59; - float remappedColorIndex = clamp((alpha - remapRanges.x) / remapRanges.y, 0.0, 1.0); +// node_modules/@babylonjs/core/Shaders/ShadersInclude/fogVertex.js +var name60 = "fogVertex"; +var shader60 = `#ifdef FOG +vFogDistance=(view*worldPos).xyz; +#endif +`; +ShaderStore.IncludesShadersStore[name60] = shader60; - vec4 rampColor = texture2D(rampSampler, vec2(1.0 - remappedColorIndex, 0.)); - baseColor.rgb *= rampColor.rgb; +// node_modules/@babylonjs/core/Shaders/ShadersInclude/shadowsVertex.js +var name61 = "shadowsVertex"; +var shader61 = `#ifdef SHADOWS +#if defined(SHADOWCSM{X}) +vPositionFromCamera{X}=view*worldPos;for (int i=0; i +#define CUSTOM_VERTEX_BEGIN +attribute vec3 position; +#ifdef NORMAL +attribute vec3 normal; +#endif +#ifdef TANGENT +attribute vec4 tangent; +#endif +#ifdef UV1 +attribute vec2 uv; +#endif +#include[2..7] +#ifdef VERTEXCOLOR +attribute vec4 color; +#endif +#include +#include +#include +#include +#include +#include[1..7] +#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse) +#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail) +#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient) +#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity) +#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive) +#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap) +#if defined(SPECULARTERM) +#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular) +#endif +#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump) +#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal) +varying vec3 vPositionW; +#ifdef NORMAL +varying vec3 vNormalW; +#endif +#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES) +varying vec4 vColor; +#endif +#include +#include +#include +#include<__decl__lightVxFragment>[0..maxSimultaneousLights] +#include +#include[0..maxSimultaneousMorphTargets] +#ifdef REFLECTIONMAP_SKYBOX +varying vec3 vPositionUVW; +#endif +#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED) +varying vec3 vDirectionW; +#endif +#include +#define CUSTOM_VERTEX_DEFINITIONS +void main(void) { +#define CUSTOM_VERTEX_MAIN_BEGIN +vec3 positionUpdated=position; +#ifdef NORMAL +vec3 normalUpdated=normal; +#endif +#ifdef TANGENT +vec4 tangentUpdated=tangent; +#endif +#ifdef UV1 +vec2 uvUpdated=uv; +#endif +#include +#include[0..maxSimultaneousMorphTargets] +#ifdef REFLECTIONMAP_SKYBOX +vPositionUVW=positionUpdated; +#endif +#define CUSTOM_VERTEX_UPDATE_POSITION +#define CUSTOM_VERTEX_UPDATE_NORMAL +#include +#if defined(PREPASS) && defined(PREPASS_VELOCITY) && !defined(BONES_VELOCITY_ENABLED) +vCurrentPosition=viewProjection*finalWorld*vec4(positionUpdated,1.0);vPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0); +#endif +#include +#include +vec4 worldPos=finalWorld*vec4(positionUpdated,1.0); +#ifdef NORMAL +mat3 normalWorld=mat3(finalWorld); +#if defined(INSTANCES) && defined(THIN_INSTANCES) +vNormalW=normalUpdated/vec3(dot(normalWorld[0],normalWorld[0]),dot(normalWorld[1],normalWorld[1]),dot(normalWorld[2],normalWorld[2]));vNormalW=normalize(normalWorld*vNormalW); +#else +#ifdef NONUNIFORMSCALING +normalWorld=transposeMat3(inverseMat3(normalWorld)); +#endif +vNormalW=normalize(normalWorld*normalUpdated); +#endif +#endif +#define CUSTOM_VERTEX_UPDATE_WORLDPOS +#ifdef MULTIVIEW +if (gl_ViewID_OVR==0u) {gl_Position=viewProjection*worldPos;} else {gl_Position=viewProjectionR*worldPos;} +#else +gl_Position=viewProjection*worldPos; +#endif +vPositionW=vec3(worldPos); +#include +#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED) +vDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0))); +#endif +#ifndef UV1 +vec2 uvUpdated=vec2(0.,0.); +#endif +#ifdef MAINUV1 +vMainUV1=uvUpdated; +#endif +#include[2..7] +#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse,_MATRIXNAME_,diffuse,_INFONAME_,DiffuseInfos.x) +#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x) +#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x) +#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x) +#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_MATRIXNAME_,emissive,_INFONAME_,EmissiveInfos.x) +#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_MATRIXNAME_,lightmap,_INFONAME_,LightmapInfos.x) +#if defined(SPECULARTERM) +#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular,_MATRIXNAME_,specular,_INFONAME_,SpecularInfos.x) +#endif +#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_MATRIXNAME_,bump,_INFONAME_,BumpInfos.x) +#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_MATRIXNAME_,decal,_INFONAME_,DecalInfos.x) +#include +#include +#include +#include[0..maxSimultaneousLights] +#include +#include +#include +#define CUSTOM_VERTEX_MAIN_END +} +`; +ShaderStore.ShadersStore[name65] = shader65; + +// node_modules/@babylonjs/core/Materials/standardMaterial.js +var onCreatedEffectParameters = { effect: null, subMesh: null }; +var StandardMaterialDefines = class extends MaterialDefines { /** - * Removes the fallback from the bound mesh. + * Initializes the Standard Material defines. + * @param externalProperties The external properties */ - unBindMesh() { - this._mesh = null; + constructor(externalProperties) { + super(externalProperties); + this.MAINUV1 = false; + this.MAINUV2 = false; + this.MAINUV3 = false; + this.MAINUV4 = false; + this.MAINUV5 = false; + this.MAINUV6 = false; + this.DIFFUSE = false; + this.DIFFUSEDIRECTUV = 0; + this.BAKED_VERTEX_ANIMATION_TEXTURE = false; + this.AMBIENT = false; + this.AMBIENTDIRECTUV = 0; + this.OPACITY = false; + this.OPACITYDIRECTUV = 0; + this.OPACITYRGB = false; + this.REFLECTION = false; + this.EMISSIVE = false; + this.EMISSIVEDIRECTUV = 0; + this.SPECULAR = false; + this.SPECULARDIRECTUV = 0; + this.BUMP = false; + this.BUMPDIRECTUV = 0; + this.PARALLAX = false; + this.PARALLAX_RHS = false; + this.PARALLAXOCCLUSION = false; + this.SPECULAROVERALPHA = false; + this.CLIPPLANE = false; + this.CLIPPLANE2 = false; + this.CLIPPLANE3 = false; + this.CLIPPLANE4 = false; + this.CLIPPLANE5 = false; + this.CLIPPLANE6 = false; + this.ALPHATEST = false; + this.DEPTHPREPASS = false; + this.ALPHAFROMDIFFUSE = false; + this.POINTSIZE = false; + this.FOG = false; + this.SPECULARTERM = false; + this.DIFFUSEFRESNEL = false; + this.OPACITYFRESNEL = false; + this.REFLECTIONFRESNEL = false; + this.REFRACTIONFRESNEL = false; + this.EMISSIVEFRESNEL = false; + this.FRESNEL = false; + this.NORMAL = false; + this.TANGENT = false; + this.UV1 = false; + this.UV2 = false; + this.UV3 = false; + this.UV4 = false; + this.UV5 = false; + this.UV6 = false; + this.VERTEXCOLOR = false; + this.VERTEXALPHA = false; + this.NUM_BONE_INFLUENCERS = 0; + this.BonesPerMesh = 0; + this.BONETEXTURE = false; + this.BONES_VELOCITY_ENABLED = false; + this.INSTANCES = false; + this.THIN_INSTANCES = false; + this.INSTANCESCOLOR = false; + this.GLOSSINESS = false; + this.ROUGHNESS = false; + this.EMISSIVEASILLUMINATION = false; + this.LINKEMISSIVEWITHDIFFUSE = false; + this.REFLECTIONFRESNELFROMSPECULAR = false; + this.LIGHTMAP = false; + this.LIGHTMAPDIRECTUV = 0; + this.OBJECTSPACE_NORMALMAP = false; + this.USELIGHTMAPASSHADOWMAP = false; + this.REFLECTIONMAP_3D = false; + this.REFLECTIONMAP_SPHERICAL = false; + this.REFLECTIONMAP_PLANAR = false; + this.REFLECTIONMAP_CUBIC = false; + this.USE_LOCAL_REFLECTIONMAP_CUBIC = false; + this.USE_LOCAL_REFRACTIONMAP_CUBIC = false; + this.REFLECTIONMAP_PROJECTION = false; + this.REFLECTIONMAP_SKYBOX = false; + this.REFLECTIONMAP_EXPLICIT = false; + this.REFLECTIONMAP_EQUIRECTANGULAR = false; + this.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = false; + this.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = false; + this.REFLECTIONMAP_OPPOSITEZ = false; + this.INVERTCUBICMAP = false; + this.LOGARITHMICDEPTH = false; + this.REFRACTION = false; + this.REFRACTIONMAP_3D = false; + this.REFLECTIONOVERALPHA = false; + this.TWOSIDEDLIGHTING = false; + this.SHADOWFLOAT = false; + this.MORPHTARGETS = false; + this.MORPHTARGETS_NORMAL = false; + this.MORPHTARGETS_TANGENT = false; + this.MORPHTARGETS_UV = false; + this.NUM_MORPH_INFLUENCERS = 0; + this.MORPHTARGETS_TEXTURE = false; + this.NONUNIFORMSCALING = false; + this.PREMULTIPLYALPHA = false; + this.ALPHATEST_AFTERALLALPHACOMPUTATIONS = false; + this.ALPHABLEND = true; + this.PREPASS = false; + this.PREPASS_IRRADIANCE = false; + this.PREPASS_IRRADIANCE_INDEX = -1; + this.PREPASS_ALBEDO_SQRT = false; + this.PREPASS_ALBEDO_SQRT_INDEX = -1; + this.PREPASS_DEPTH = false; + this.PREPASS_DEPTH_INDEX = -1; + this.PREPASS_NORMAL = false; + this.PREPASS_NORMAL_INDEX = -1; + this.PREPASS_NORMAL_WORLDSPACE = false; + this.PREPASS_POSITION = false; + this.PREPASS_POSITION_INDEX = -1; + this.PREPASS_VELOCITY = false; + this.PREPASS_VELOCITY_INDEX = -1; + this.PREPASS_REFLECTIVITY = false; + this.PREPASS_REFLECTIVITY_INDEX = -1; + this.SCENE_MRT_COUNT = 0; + this.RGBDLIGHTMAP = false; + this.RGBDREFLECTION = false; + this.RGBDREFRACTION = false; + this.IMAGEPROCESSING = false; + this.VIGNETTE = false; + this.VIGNETTEBLENDMODEMULTIPLY = false; + this.VIGNETTEBLENDMODEOPAQUE = false; + this.TONEMAPPING = false; + this.TONEMAPPING_ACES = false; + this.CONTRAST = false; + this.COLORCURVES = false; + this.COLORGRADING = false; + this.COLORGRADING3D = false; + this.SAMPLER3DGREENDEPTH = false; + this.SAMPLER3DBGRMAP = false; + this.DITHER = false; + this.IMAGEPROCESSINGPOSTPROCESS = false; + this.SKIPFINALCOLORCLAMP = false; + this.MULTIVIEW = false; + this.ORDER_INDEPENDENT_TRANSPARENCY = false; + this.ORDER_INDEPENDENT_TRANSPARENCY_16BITS = false; + this.CAMERA_ORTHOGRAPHIC = false; + this.CAMERA_PERSPECTIVE = false; + this.IS_REFLECTION_LINEAR = false; + this.IS_REFRACTION_LINEAR = false; + this.EXPOSURE = false; + this.DECAL_AFTER_DETAIL = false; + this.rebuild(); } - /** - * Adds a fallback on the specified property. - * @param rank The rank of the fallback (Lower ranks will be fallbacked to first) - * @param define The name of the define in the shader - */ - addFallback(rank, define) { - if (!this._defines[rank]) { - if (rank < this._currentRank) { - this._currentRank = rank; - } - if (rank > this._maxRank) { - this._maxRank = rank; - } - this._defines[rank] = new Array(); + setReflectionMode(modeToEnable) { + const modes = [ + "REFLECTIONMAP_CUBIC", + "REFLECTIONMAP_EXPLICIT", + "REFLECTIONMAP_PLANAR", + "REFLECTIONMAP_PROJECTION", + "REFLECTIONMAP_PROJECTION", + "REFLECTIONMAP_SKYBOX", + "REFLECTIONMAP_SPHERICAL", + "REFLECTIONMAP_EQUIRECTANGULAR", + "REFLECTIONMAP_EQUIRECTANGULAR_FIXED", + "REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED" + ]; + for (const mode of modes) { + this[mode] = mode === modeToEnable; } - this._defines[rank].push(define); } +}; +var StandardMaterial = class _StandardMaterial extends PushMaterial { /** - * Sets the mesh to use CPU skinning when needing to fallback. - * @param rank The rank of the fallback (Lower ranks will be fallbacked to first) - * @param mesh The mesh to use the fallbacks. + * Gets the image processing configuration used either in this material. */ - addCPUSkinningFallback(rank, mesh) { - this._mesh = mesh; - if (rank < this._currentRank) { - this._currentRank = rank; - } - if (rank > this._maxRank) { - this._maxRank = rank; - } + get imageProcessingConfiguration() { + return this._imageProcessingConfiguration; } /** - * Checks to see if more fallbacks are still available. + * Sets the Default image processing configuration used either in the this material. + * + * If sets to null, the scene one is in use. */ - get hasMoreFallbacks() { - return this._currentRank <= this._maxRank; + set imageProcessingConfiguration(value) { + this._attachImageProcessingConfiguration(value); + this._markAllSubMeshesAsTexturesDirty(); } /** - * Removes the defines that should be removed when falling back. - * @param currentDefines defines the current define statements for the shader. - * @param effect defines the current effect we try to compile - * @returns The resulting defines with defines of the current rank removed. + * Attaches a new image processing configuration to the Standard Material. + * @param configuration */ - reduce(currentDefines, effect) { - if (this._mesh && this._mesh.computeBonesUsingShaders && this._mesh.numBoneInfluencers > 0) { - this._mesh.computeBonesUsingShaders = false; - currentDefines = currentDefines.replace("#define NUM_BONE_INFLUENCERS " + this._mesh.numBoneInfluencers, "#define NUM_BONE_INFLUENCERS 0"); - effect._bonesComputationForcedToCPU = true; - const scene = this._mesh.getScene(); - for (let index = 0; index < scene.meshes.length; index++) { - const otherMesh = scene.meshes[index]; - if (!otherMesh.material) { - if (!this._mesh.material && otherMesh.computeBonesUsingShaders && otherMesh.numBoneInfluencers > 0) { - otherMesh.computeBonesUsingShaders = false; - } - continue; - } - if (!otherMesh.computeBonesUsingShaders || otherMesh.numBoneInfluencers === 0) { - continue; - } - if (otherMesh.material.getEffect() === effect) { - otherMesh.computeBonesUsingShaders = false; - } else if (otherMesh.subMeshes) { - for (const subMesh of otherMesh.subMeshes) { - const subMeshEffect = subMesh.effect; - if (subMeshEffect === effect) { - otherMesh.computeBonesUsingShaders = false; - break; - } - } - } - } + _attachImageProcessingConfiguration(configuration) { + if (configuration === this._imageProcessingConfiguration) { + return; + } + if (this._imageProcessingConfiguration && this._imageProcessingObserver) { + this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver); + } + if (!configuration) { + this._imageProcessingConfiguration = this.getScene().imageProcessingConfiguration; } else { - const currentFallbacks = this._defines[this._currentRank]; - if (currentFallbacks) { - for (let index = 0; index < currentFallbacks.length; index++) { - currentDefines = currentDefines.replace("#define " + currentFallbacks[index], ""); - } - } - this._currentRank++; + this._imageProcessingConfiguration = configuration; + } + if (this._imageProcessingConfiguration) { + this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add(() => { + this._markAllSubMeshesAsImageProcessingDirty(); + }); } - return currentDefines; } -}; - -// node_modules/@babylonjs/core/Engines/renderTargetWrapper.js -var RenderTargetWrapper = class { /** - * Gets the depth/stencil texture (if created by a createDepthStencilTexture() call) + * Can this material render to prepass */ - get depthStencilTexture() { - return this._depthStencilTexture; + get isPrePassCapable() { + return !this.disableDepthWrite; } /** - * Indicates if the depth/stencil texture has a stencil aspect + * Gets whether the color curves effect is enabled. */ - get depthStencilTextureWithStencil() { - return this._depthStencilTextureWithStencil; + get cameraColorCurvesEnabled() { + return this.imageProcessingConfiguration.colorCurvesEnabled; } /** - * Defines if the render target wrapper is for a cube texture or if false a 2d texture + * Sets whether the color curves effect is enabled. */ - get isCube() { - return this._isCube; + set cameraColorCurvesEnabled(value) { + this.imageProcessingConfiguration.colorCurvesEnabled = value; } /** - * Defines if the render target wrapper is for a single or multi target render wrapper + * Gets whether the color grading effect is enabled. */ - get isMulti() { - return this._isMulti; + get cameraColorGradingEnabled() { + return this.imageProcessingConfiguration.colorGradingEnabled; } /** - * Defines if the render target wrapper is for a single or an array of textures + * Gets whether the color grading effect is enabled. */ - get is2DArray() { - return this.layers > 0; + set cameraColorGradingEnabled(value) { + this.imageProcessingConfiguration.colorGradingEnabled = value; } /** - * Defines if the render target wrapper is for a 3D texture + * Gets whether tonemapping is enabled or not. */ - get is3D() { - return this.depth > 0; + get cameraToneMappingEnabled() { + return this._imageProcessingConfiguration.toneMappingEnabled; } /** - * Gets the size of the render target wrapper (used for cubes, as width=height in this case) + * Sets whether tonemapping is enabled or not */ - get size() { - return this.width; + set cameraToneMappingEnabled(value) { + this._imageProcessingConfiguration.toneMappingEnabled = value; } /** - * Gets the width of the render target wrapper + * The camera exposure used on this material. + * This property is here and not in the camera to allow controlling exposure without full screen post process. + * This corresponds to a photographic exposure. */ - get width() { - return this._size.width || this._size; + get cameraExposure() { + return this._imageProcessingConfiguration.exposure; } /** - * Gets the height of the render target wrapper + * The camera exposure used on this material. + * This property is here and not in the camera to allow controlling exposure without full screen post process. + * This corresponds to a photographic exposure. */ - get height() { - return this._size.height || this._size; + set cameraExposure(value) { + this._imageProcessingConfiguration.exposure = value; } /** - * Gets the number of layers of the render target wrapper (only used if is2DArray is true and wrapper is not a multi render target) + * Gets The camera contrast used on this material. */ - get layers() { - return this._size.layers || 0; + get cameraContrast() { + return this._imageProcessingConfiguration.contrast; } /** - * Gets the depth of the render target wrapper (only used if is3D is true and wrapper is not a multi render target) + * Sets The camera contrast used on this material. */ - get depth() { - return this._size.depth || 0; + set cameraContrast(value) { + this._imageProcessingConfiguration.contrast = value; } /** - * Gets the render texture. If this is a multi render target, gets the first texture + * Gets the Color Grading 2D Lookup Texture. */ - get texture() { - var _a; - return ((_a = this._textures) == null ? void 0 : _a[0]) ?? null; + get cameraColorGradingTexture() { + return this._imageProcessingConfiguration.colorGradingTexture; } /** - * Gets the list of render textures. If we are not in a multi render target, the list will be null (use the texture getter instead) + * Sets the Color Grading 2D Lookup Texture. */ - get textures() { - return this._textures; + set cameraColorGradingTexture(value) { + this._imageProcessingConfiguration.colorGradingTexture = value; } /** - * Gets the face indices that correspond to the list of render textures. If we are not in a multi render target, the list will be null + * The color grading curves provide additional color adjustmnent that is applied after any color grading transform (3D LUT). + * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects. + * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image; + * corresponding to low luminance, medium luminance, and high luminance areas respectively. */ - get faceIndices() { - return this._faceIndices; + get cameraColorCurves() { + return this._imageProcessingConfiguration.colorCurves; } /** - * Gets the layer indices that correspond to the list of render textures. If we are not in a multi render target, the list will be null + * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT). + * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects. + * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image; + * corresponding to low luminance, medium luminance, and high luminance areas respectively. */ - get layerIndices() { - return this._layerIndices; + set cameraColorCurves(value) { + this._imageProcessingConfiguration.colorCurves = value; } /** - * Gets the sample count of the render target + * Can this material render to several textures at once */ - get samples() { - return this._samples; + get canRenderToMRT() { + return true; } /** - * Sets the sample count of the render target - * @param value sample count - * @param initializeBuffers If set to true, the engine will make an initializing call to drawBuffers (only used when isMulti=true). - * @param force true to force calling the update sample count engine function even if the current sample count is equal to value - * @returns the sample count that has been set + * Instantiates a new standard material. + * This is the default material used in Babylon. It is the best trade off between quality + * and performances. + * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction + * @param name Define the name of the material in the scene + * @param scene Define the scene the material belong to */ - setSamples(value, initializeBuffers = true, force = false) { - if (this.samples === value && !force) { - return value; + constructor(name69, scene) { + super(name69, scene); + this._diffuseTexture = null; + this._ambientTexture = null; + this._opacityTexture = null; + this._reflectionTexture = null; + this._emissiveTexture = null; + this._specularTexture = null; + this._bumpTexture = null; + this._lightmapTexture = null; + this._refractionTexture = null; + this.ambientColor = new Color3(0, 0, 0); + this.diffuseColor = new Color3(1, 1, 1); + this.specularColor = new Color3(1, 1, 1); + this.emissiveColor = new Color3(0, 0, 0); + this.specularPower = 64; + this._useAlphaFromDiffuseTexture = false; + this._useEmissiveAsIllumination = false; + this._linkEmissiveWithDiffuse = false; + this._useSpecularOverAlpha = false; + this._useReflectionOverAlpha = false; + this._disableLighting = false; + this._useObjectSpaceNormalMap = false; + this._useParallax = false; + this._useParallaxOcclusion = false; + this.parallaxScaleBias = 0.05; + this._roughness = 0; + this.indexOfRefraction = 0.98; + this.invertRefractionY = true; + this.alphaCutOff = 0.4; + this._useLightmapAsShadowmap = false; + this._useReflectionFresnelFromSpecular = false; + this._useGlossinessFromSpecularMapAlpha = false; + this._maxSimultaneousLights = 4; + this._invertNormalMapX = false; + this._invertNormalMapY = false; + this._twoSidedLighting = false; + this._applyDecalMapAfterDetailMap = false; + this._renderTargets = new SmartArray(16); + this._worldViewProjectionMatrix = Matrix.Zero(); + this._globalAmbientColor = new Color3(0, 0, 0); + this._cacheHasRenderTargetTextures = false; + this.detailMap = new DetailMapConfiguration(this); + this._attachImageProcessingConfiguration(null); + this.prePassConfiguration = new PrePassConfiguration(); + this.getRenderTargetTextures = () => { + this._renderTargets.reset(); + if (_StandardMaterial.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget) { + this._renderTargets.push(this._reflectionTexture); + } + if (_StandardMaterial.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget) { + this._renderTargets.push(this._refractionTexture); + } + this._eventInfo.renderTargets = this._renderTargets; + this._callbackPluginEventFillRenderTargetTextures(this._eventInfo); + return this._renderTargets; + }; + } + /** + * Gets a boolean indicating that current material needs to register RTT + */ + get hasRenderTargetTextures() { + if (_StandardMaterial.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget) { + return true; } - const result = this._isMulti ? this._engine.updateMultipleRenderTargetTextureSampleCount(this, value, initializeBuffers) : this._engine.updateRenderTargetTextureSampleCount(this, value); - this._samples = value; - return result; + if (_StandardMaterial.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget) { + return true; + } + return this._cacheHasRenderTargetTextures; } /** - * Initializes the render target wrapper - * @param isMulti true if the wrapper is a multi render target - * @param isCube true if the wrapper should render to a cube texture - * @param size size of the render target (width/height/layers) - * @param engine engine used to create the render target - * @param label defines the label to use for the wrapper (for debugging purpose only) + * Gets the current class name of the material e.g. "StandardMaterial" + * Mainly use in serialization. + * @returns the class name */ - constructor(isMulti, isCube, size, engine, label) { - this._textures = null; - this._faceIndices = null; - this._layerIndices = null; - this._samples = 1; - this._attachments = null; - this._generateStencilBuffer = false; - this._generateDepthBuffer = false; - this._depthStencilTextureWithStencil = false; - this._isMulti = isMulti; - this._isCube = isCube; - this._size = size; - this._engine = engine; - this._depthStencilTexture = null; - this.label = label; + getClassName() { + return "StandardMaterial"; } /** - * Sets the render target texture(s) - * @param textures texture(s) to set + * Specifies if the material will require alpha blending + * @returns a boolean specifying if alpha blending is needed */ - setTextures(textures) { - if (Array.isArray(textures)) { - this._textures = textures; - } else if (textures) { - this._textures = [textures]; - } else { - this._textures = null; + needAlphaBlending() { + if (this._disableAlphaBlending) { + return false; } + return this.alpha < 1 || this._opacityTexture != null || this._shouldUseAlphaFromDiffuseTexture() || this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled; } /** - * Set a texture in the textures array - * @param texture The texture to set - * @param index The index in the textures array to set - * @param disposePrevious If this function should dispose the previous texture + * Specifies if this material should be rendered in alpha test mode + * @returns a boolean specifying if an alpha test is needed. */ - setTexture(texture, index = 0, disposePrevious = true) { - if (!this._textures) { - this._textures = []; - } - if (this._textures[index] === texture) { - return; - } - if (this._textures[index] && disposePrevious) { - this._textures[index].dispose(); + needAlphaTesting() { + if (this._forceAlphaTest) { + return true; } - this._textures[index] = texture; + return this._hasAlphaChannel() && (this._transparencyMode == null || this._transparencyMode === Material.MATERIAL_ALPHATEST); } /** - * Sets the layer and face indices of every render target texture bound to each color attachment - * @param layers The layers of each texture to be set - * @param faces The faces of each texture to be set + * @returns whether or not the alpha value of the diffuse texture should be used for alpha blending. */ - setLayerAndFaceIndices(layers, faces) { - this._layerIndices = layers; - this._faceIndices = faces; + _shouldUseAlphaFromDiffuseTexture() { + return this._diffuseTexture != null && this._diffuseTexture.hasAlpha && this._useAlphaFromDiffuseTexture && this._transparencyMode !== Material.MATERIAL_OPAQUE; } /** - * Sets the layer and face indices of a texture in the textures array that should be bound to each color attachment - * @param index The index of the texture in the textures array to modify - * @param layer The layer of the texture to be set - * @param face The face of the texture to be set + * @returns whether or not there is a usable alpha channel for transparency. */ - setLayerAndFaceIndex(index = 0, layer, face) { - if (!this._layerIndices) { - this._layerIndices = []; - } - if (!this._faceIndices) { - this._faceIndices = []; - } - if (layer !== void 0 && layer >= 0) { - this._layerIndices[index] = layer; - } - if (face !== void 0 && face >= 0) { - this._faceIndices[index] = face; - } + _hasAlphaChannel() { + return this._diffuseTexture != null && this._diffuseTexture.hasAlpha || this._opacityTexture != null; } /** - * Creates the depth/stencil texture - * @param comparisonFunction Comparison function to use for the texture - * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture - * @param generateStencil true if the stencil aspect should also be created - * @param samples sample count to use when creating the texture - * @param format format of the depth texture - * @param label defines the label to use for the texture (for debugging purpose only) - * @returns the depth/stencil created texture + * Get the texture used for alpha test purpose. + * @returns the diffuse texture in case of the standard material. */ - createDepthStencilTexture(comparisonFunction = 0, bilinearFiltering = true, generateStencil = false, samples = 1, format = 14, label) { - var _a; - (_a = this._depthStencilTexture) == null ? void 0 : _a.dispose(); - this._depthStencilTextureWithStencil = generateStencil; - this._depthStencilTextureLabel = label; - this._depthStencilTexture = this._engine.createDepthStencilTexture(this._size, { - bilinearFiltering, - comparisonFunction, - generateStencil, - isCube: this._isCube, - samples, - depthTextureFormat: format, - label - }, this); - return this._depthStencilTexture; + getAlphaTestTexture() { + return this._diffuseTexture; } /** - * Shares the depth buffer of this render target with another render target. - * @internal - * @param renderTarget Destination renderTarget + * Get if the submesh is ready to be used and all its information available. + * Child classes can use it to update shaders + * @param mesh defines the mesh to check + * @param subMesh defines which submesh to check + * @param useInstances specifies that instances should be used + * @returns a boolean indicating that the submesh is ready or not */ - _shareDepth(renderTarget) { - if (this._depthStencilTexture) { - if (renderTarget._depthStencilTexture) { - renderTarget._depthStencilTexture.dispose(); + isReadyForSubMesh(mesh, subMesh, useInstances = false) { + if (!this._uniformBufferLayoutBuilt) { + this.buildUniformLayout(); + } + const drawWrapper = subMesh._drawWrapper; + if (drawWrapper.effect && this.isFrozen) { + if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) { + return true; } - renderTarget._depthStencilTexture = this._depthStencilTexture; - this._depthStencilTexture.incrementReferences(); } - } - /** - * @internal - */ - _swapAndDie(target) { - if (this.texture) { - this.texture._swapAndDie(target); + if (!subMesh.materialDefines) { + this._callbackPluginEventGeneric(MaterialPluginEvent.GetDefineNames, this._eventInfo); + subMesh.materialDefines = new StandardMaterialDefines(this._eventInfo.defineNames); } - this._textures = null; - this.dispose(true); - } - _cloneRenderTargetWrapper() { - var _a, _b, _c, _d, _e; - let rtw = null; - if (this._isMulti) { - const textureArray = this.textures; - if (textureArray && textureArray.length > 0) { - let generateDepthTexture = false; - let textureCount = textureArray.length; - let depthTextureFormat = -1; - const lastTextureSource = textureArray[textureArray.length - 1]._source; - if (lastTextureSource === InternalTextureSource.Depth || lastTextureSource === InternalTextureSource.DepthStencil) { - generateDepthTexture = true; - depthTextureFormat = textureArray[textureArray.length - 1].format; - textureCount--; + const scene = this.getScene(); + const defines = subMesh.materialDefines; + if (this._isReadyForSubMesh(subMesh)) { + return true; + } + const engine = scene.getEngine(); + defines._needNormals = PrepareDefinesForLights(scene, mesh, defines, true, this._maxSimultaneousLights, this._disableLighting); + PrepareDefinesForMultiview(scene, defines); + const oit = this.needAlphaBlendingForMesh(mesh) && this.getScene().useOrderIndependentTransparency; + PrepareDefinesForPrePass(scene, defines, this.canRenderToMRT && !oit); + PrepareDefinesForOIT(scene, defines, oit); + if (defines._areTexturesDirty) { + this._eventInfo.hasRenderTargetTextures = false; + this._callbackPluginEventHasRenderTargetTextures(this._eventInfo); + this._cacheHasRenderTargetTextures = this._eventInfo.hasRenderTargetTextures; + defines._needUVs = false; + for (let i = 1; i <= 6; ++i) { + defines["MAINUV" + i] = false; + } + if (scene.texturesEnabled) { + defines.DIFFUSEDIRECTUV = 0; + defines.BUMPDIRECTUV = 0; + defines.AMBIENTDIRECTUV = 0; + defines.OPACITYDIRECTUV = 0; + defines.EMISSIVEDIRECTUV = 0; + defines.SPECULARDIRECTUV = 0; + defines.LIGHTMAPDIRECTUV = 0; + if (this._diffuseTexture && _StandardMaterial.DiffuseTextureEnabled) { + if (!this._diffuseTexture.isReadyOrNotBlocking()) { + return false; + } else { + PrepareDefinesForMergedUV(this._diffuseTexture, defines, "DIFFUSE"); + } + } else { + defines.DIFFUSE = false; } - const samplingModes = []; - const types = []; - const formats = []; - const targetTypes = []; - const faceIndex = []; - const layerIndex = []; - const layerCounts = []; - const internalTexture2Index = {}; - for (let i = 0; i < textureCount; ++i) { - const texture = textureArray[i]; - samplingModes.push(texture.samplingMode); - types.push(texture.type); - formats.push(texture.format); - const index = internalTexture2Index[texture.uniqueId]; - if (index !== void 0) { - targetTypes.push(-1); - layerCounts.push(0); + if (this._ambientTexture && _StandardMaterial.AmbientTextureEnabled) { + if (!this._ambientTexture.isReadyOrNotBlocking()) { + return false; } else { - internalTexture2Index[texture.uniqueId] = i; - if (texture.is2DArray) { - targetTypes.push(35866); - layerCounts.push(texture.depth); - } else if (texture.isCube) { - targetTypes.push(34067); - layerCounts.push(0); - } else if (texture.is3D) { - targetTypes.push(32879); - layerCounts.push(texture.depth); - } else { - targetTypes.push(3553); - layerCounts.push(0); + PrepareDefinesForMergedUV(this._ambientTexture, defines, "AMBIENT"); + } + } else { + defines.AMBIENT = false; + } + if (this._opacityTexture && _StandardMaterial.OpacityTextureEnabled) { + if (!this._opacityTexture.isReadyOrNotBlocking()) { + return false; + } else { + PrepareDefinesForMergedUV(this._opacityTexture, defines, "OPACITY"); + defines.OPACITYRGB = this._opacityTexture.getAlphaFromRGB; + } + } else { + defines.OPACITY = false; + } + if (this._reflectionTexture && _StandardMaterial.ReflectionTextureEnabled) { + if (!this._reflectionTexture.isReadyOrNotBlocking()) { + return false; + } else { + defines._needNormals = true; + defines.REFLECTION = true; + defines.ROUGHNESS = this._roughness > 0; + defines.REFLECTIONOVERALPHA = this._useReflectionOverAlpha; + defines.INVERTCUBICMAP = this._reflectionTexture.coordinatesMode === Texture.INVCUBIC_MODE; + defines.REFLECTIONMAP_3D = this._reflectionTexture.isCube; + defines.REFLECTIONMAP_OPPOSITEZ = defines.REFLECTIONMAP_3D && this.getScene().useRightHandedSystem ? !this._reflectionTexture.invertZ : this._reflectionTexture.invertZ; + defines.RGBDREFLECTION = this._reflectionTexture.isRGBD; + switch (this._reflectionTexture.coordinatesMode) { + case Texture.EXPLICIT_MODE: + defines.setReflectionMode("REFLECTIONMAP_EXPLICIT"); + break; + case Texture.PLANAR_MODE: + defines.setReflectionMode("REFLECTIONMAP_PLANAR"); + break; + case Texture.PROJECTION_MODE: + defines.setReflectionMode("REFLECTIONMAP_PROJECTION"); + break; + case Texture.SKYBOX_MODE: + defines.setReflectionMode("REFLECTIONMAP_SKYBOX"); + break; + case Texture.SPHERICAL_MODE: + defines.setReflectionMode("REFLECTIONMAP_SPHERICAL"); + break; + case Texture.EQUIRECTANGULAR_MODE: + defines.setReflectionMode("REFLECTIONMAP_EQUIRECTANGULAR"); + break; + case Texture.FIXED_EQUIRECTANGULAR_MODE: + defines.setReflectionMode("REFLECTIONMAP_EQUIRECTANGULAR_FIXED"); + break; + case Texture.FIXED_EQUIRECTANGULAR_MIRRORED_MODE: + defines.setReflectionMode("REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED"); + break; + case Texture.CUBIC_MODE: + case Texture.INVCUBIC_MODE: + default: + defines.setReflectionMode("REFLECTIONMAP_CUBIC"); + break; } + defines.USE_LOCAL_REFLECTIONMAP_CUBIC = this._reflectionTexture.boundingBoxSize ? true : false; } - if (this._faceIndices) { - faceIndex.push(this._faceIndices[i] ?? 0); + } else { + defines.REFLECTION = false; + defines.REFLECTIONMAP_OPPOSITEZ = false; + } + if (this._emissiveTexture && _StandardMaterial.EmissiveTextureEnabled) { + if (!this._emissiveTexture.isReadyOrNotBlocking()) { + return false; + } else { + PrepareDefinesForMergedUV(this._emissiveTexture, defines, "EMISSIVE"); } - if (this._layerIndices) { - layerIndex.push(this._layerIndices[i] ?? 0); + } else { + defines.EMISSIVE = false; + } + if (this._lightmapTexture && _StandardMaterial.LightmapTextureEnabled) { + if (!this._lightmapTexture.isReadyOrNotBlocking()) { + return false; + } else { + PrepareDefinesForMergedUV(this._lightmapTexture, defines, "LIGHTMAP"); + defines.USELIGHTMAPASSHADOWMAP = this._useLightmapAsShadowmap; + defines.RGBDLIGHTMAP = this._lightmapTexture.isRGBD; } + } else { + defines.LIGHTMAP = false; } - const optionsMRT = { - samplingModes, - generateMipMaps: textureArray[0].generateMipMaps, - generateDepthBuffer: this._generateDepthBuffer, - generateStencilBuffer: this._generateStencilBuffer, - generateDepthTexture, - depthTextureFormat, - types, - formats, - textureCount, - targetTypes, - faceIndex, - layerIndex, - layerCounts, - label: this.label - }; - const size = { - width: this.width, - height: this.height, - depth: this.depth - }; - rtw = this._engine.createMultipleRenderTarget(size, optionsMRT); - for (let i = 0; i < textureCount; ++i) { - if (targetTypes[i] !== -1) { - continue; + if (this._specularTexture && _StandardMaterial.SpecularTextureEnabled) { + if (!this._specularTexture.isReadyOrNotBlocking()) { + return false; + } else { + PrepareDefinesForMergedUV(this._specularTexture, defines, "SPECULAR"); + defines.GLOSSINESS = this._useGlossinessFromSpecularMapAlpha; } - const index = internalTexture2Index[textureArray[i].uniqueId]; - rtw.setTexture(rtw.textures[index], i); + } else { + defines.SPECULAR = false; } - } - } else { - const options = {}; - options.generateDepthBuffer = this._generateDepthBuffer; - options.generateMipMaps = ((_a = this.texture) == null ? void 0 : _a.generateMipMaps) ?? false; - options.generateStencilBuffer = this._generateStencilBuffer; - options.samplingMode = (_b = this.texture) == null ? void 0 : _b.samplingMode; - options.type = (_c = this.texture) == null ? void 0 : _c.type; - options.format = (_d = this.texture) == null ? void 0 : _d.format; - options.noColorAttachment = !this._textures; - options.label = this.label; - if (this.isCube) { - rtw = this._engine.createRenderTargetCubeTexture(this.width, options); + if (scene.getEngine().getCaps().standardDerivatives && this._bumpTexture && _StandardMaterial.BumpTextureEnabled) { + if (!this._bumpTexture.isReady()) { + return false; + } else { + PrepareDefinesForMergedUV(this._bumpTexture, defines, "BUMP"); + defines.PARALLAX = this._useParallax; + defines.PARALLAX_RHS = scene.useRightHandedSystem; + defines.PARALLAXOCCLUSION = this._useParallaxOcclusion; + } + defines.OBJECTSPACE_NORMALMAP = this._useObjectSpaceNormalMap; + } else { + defines.BUMP = false; + defines.PARALLAX = false; + defines.PARALLAX_RHS = false; + defines.PARALLAXOCCLUSION = false; + } + if (this._refractionTexture && _StandardMaterial.RefractionTextureEnabled) { + if (!this._refractionTexture.isReadyOrNotBlocking()) { + return false; + } else { + defines._needUVs = true; + defines.REFRACTION = true; + defines.REFRACTIONMAP_3D = this._refractionTexture.isCube; + defines.RGBDREFRACTION = this._refractionTexture.isRGBD; + defines.USE_LOCAL_REFRACTIONMAP_CUBIC = this._refractionTexture.boundingBoxSize ? true : false; + } + } else { + defines.REFRACTION = false; + } + defines.TWOSIDEDLIGHTING = !this._backFaceCulling && this._twoSidedLighting; } else { - const size = { - width: this.width, - height: this.height, - layers: this.is2DArray || this.is3D ? (_e = this.texture) == null ? void 0 : _e.depth : void 0 - }; - rtw = this._engine.createRenderTargetTexture(size, options); - } - if (rtw.texture) { - rtw.texture.isReady = true; + defines.DIFFUSE = false; + defines.AMBIENT = false; + defines.OPACITY = false; + defines.REFLECTION = false; + defines.EMISSIVE = false; + defines.LIGHTMAP = false; + defines.BUMP = false; + defines.REFRACTION = false; } + defines.ALPHAFROMDIFFUSE = this._shouldUseAlphaFromDiffuseTexture(); + defines.EMISSIVEASILLUMINATION = this._useEmissiveAsIllumination; + defines.LINKEMISSIVEWITHDIFFUSE = this._linkEmissiveWithDiffuse; + defines.SPECULAROVERALPHA = this._useSpecularOverAlpha; + defines.PREMULTIPLYALPHA = this.alphaMode === 7 || this.alphaMode === 8; + defines.ALPHATEST_AFTERALLALPHACOMPUTATIONS = this.transparencyMode !== null; + defines.ALPHABLEND = this.transparencyMode === null || this.needAlphaBlendingForMesh(mesh); } - return rtw; - } - _swapRenderTargetWrapper(target) { - if (this._textures && target._textures) { - for (let i = 0; i < this._textures.length; ++i) { - this._textures[i]._swapAndDie(target._textures[i], false); - target._textures[i].isReady = true; - } - } - if (this._depthStencilTexture && target._depthStencilTexture) { - this._depthStencilTexture._swapAndDie(target._depthStencilTexture); - target._depthStencilTexture.isReady = true; - } - this._textures = null; - this._depthStencilTexture = null; - } - /** @internal */ - _rebuild() { - const rtw = this._cloneRenderTargetWrapper(); - if (!rtw) { - return; - } - if (this._depthStencilTexture) { - const samplingMode = this._depthStencilTexture.samplingMode; - const format = this._depthStencilTexture.format; - const bilinear = samplingMode === 2 || samplingMode === 3 || samplingMode === 11; - rtw.createDepthStencilTexture(this._depthStencilTexture._comparisonFunction, bilinear, this._depthStencilTextureWithStencil, this._depthStencilTexture.samples, format, this._depthStencilTextureLabel); - } - if (this.samples > 1) { - rtw.setSamples(this.samples); + this._eventInfo.isReadyForSubMesh = true; + this._eventInfo.defines = defines; + this._eventInfo.subMesh = subMesh; + this._callbackPluginEventIsReadyForSubMesh(this._eventInfo); + if (!this._eventInfo.isReadyForSubMesh) { + return false; } - rtw._swapRenderTargetWrapper(this); - rtw.dispose(); - } - /** - * Releases the internal render textures - */ - releaseTextures() { - var _a; - if (this._textures) { - for (let i = 0; i < ((_a = this._textures) == null ? void 0 : _a.length); ++i) { - this._textures[i].dispose(); + if (defines._areImageProcessingDirty && this._imageProcessingConfiguration) { + if (!this._imageProcessingConfiguration.isReady()) { + return false; } + this._imageProcessingConfiguration.prepareDefines(defines); + defines.IS_REFLECTION_LINEAR = this.reflectionTexture != null && !this.reflectionTexture.gammaSpace; + defines.IS_REFRACTION_LINEAR = this.refractionTexture != null && !this.refractionTexture.gammaSpace; } - this._textures = null; - } - /** - * Disposes the whole render target wrapper - * @param disposeOnlyFramebuffers true if only the frame buffers should be released (used for the WebGL engine). If false, all the textures will also be released - */ - dispose(disposeOnlyFramebuffers = false) { - var _a; - if (!disposeOnlyFramebuffers) { - (_a = this._depthStencilTexture) == null ? void 0 : _a.dispose(); - this._depthStencilTexture = null; - this.releaseTextures(); - } - this._engine._releaseRenderTargetWrapper(this); - } -}; - -// node_modules/@babylonjs/core/Shaders/postprocess.vertex.js -var name = "postprocessVertexShader"; -var shader = `attribute vec2 position;uniform vec2 scale;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5); -#define CUSTOM_VERTEX_DEFINITIONS -void main(void) { -#define CUSTOM_VERTEX_MAIN_BEGIN -vUV=(position*madd+madd)*scale;gl_Position=vec4(position,0.0,1.0); -#define CUSTOM_VERTEX_MAIN_END -}`; -ShaderStore.ShadersStore[name] = shader; - -// node_modules/@babylonjs/core/Engines/WebGL/webGLRenderTargetWrapper.js -var WebGLRenderTargetWrapper = class extends RenderTargetWrapper { - constructor(isMulti, isCube, size, engine, context) { - super(isMulti, isCube, size, engine); - this._framebuffer = null; - this._depthStencilBuffer = null; - this._MSAAFramebuffer = null; - this._colorTextureArray = null; - this._depthStencilTextureArray = null; - this._disposeOnlyFramebuffers = false; - this._currentLOD = 0; - this._context = context; - } - _cloneRenderTargetWrapper() { - let rtw = null; - if (this._colorTextureArray && this._depthStencilTextureArray) { - rtw = this._engine.createMultiviewRenderTargetTexture(this.width, this.height); - rtw.texture.isReady = true; - } else { - rtw = super._cloneRenderTargetWrapper(); - } - return rtw; - } - _swapRenderTargetWrapper(target) { - super._swapRenderTargetWrapper(target); - target._framebuffer = this._framebuffer; - target._depthStencilBuffer = this._depthStencilBuffer; - target._MSAAFramebuffer = this._MSAAFramebuffer; - target._colorTextureArray = this._colorTextureArray; - target._depthStencilTextureArray = this._depthStencilTextureArray; - this._framebuffer = this._depthStencilBuffer = this._MSAAFramebuffer = this._colorTextureArray = this._depthStencilTextureArray = null; - } - /** - * Creates the depth/stencil texture - * @param comparisonFunction Comparison function to use for the texture - * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture - * @param generateStencil true if the stencil aspect should also be created - * @param samples sample count to use when creating the texture - * @param format format of the depth texture - * @param label defines the label to use for the texture (for debugging purpose only) - * @returns the depth/stencil created texture - */ - createDepthStencilTexture(comparisonFunction = 0, bilinearFiltering = true, generateStencil = false, samples = 1, format = 14, label) { - if (this._depthStencilBuffer) { - const currentFrameBuffer = this._engine._currentFramebuffer; - const gl = this._context; - this._engine._bindUnboundFramebuffer(this._framebuffer); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, null); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, null); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, null); - this._engine._bindUnboundFramebuffer(currentFrameBuffer); - gl.deleteRenderbuffer(this._depthStencilBuffer); - this._depthStencilBuffer = null; - } - return super.createDepthStencilTexture(comparisonFunction, bilinearFiltering, generateStencil, samples, format, label); - } - /** - * Shares the depth buffer of this render target with another render target. - * @internal - * @param renderTarget Destination renderTarget - */ - _shareDepth(renderTarget) { - super._shareDepth(renderTarget); - const gl = this._context; - const depthbuffer = this._depthStencilBuffer; - const framebuffer = renderTarget._MSAAFramebuffer || renderTarget._framebuffer; - if (renderTarget._depthStencilBuffer && renderTarget._depthStencilBuffer !== depthbuffer) { - gl.deleteRenderbuffer(renderTarget._depthStencilBuffer); - } - renderTarget._depthStencilBuffer = depthbuffer; - const attachment = renderTarget._generateStencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT; - this._engine._bindUnboundFramebuffer(framebuffer); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, depthbuffer); - this._engine._bindUnboundFramebuffer(null); - } - /** - * Binds a texture to this render target on a specific attachment - * @param texture The texture to bind to the framebuffer - * @param attachmentIndex Index of the attachment - * @param faceIndexOrLayer The face or layer of the texture to render to in case of cube texture or array texture - * @param lodLevel defines the lod level to bind to the frame buffer - */ - _bindTextureRenderTarget(texture, attachmentIndex = 0, faceIndexOrLayer, lodLevel = 0) { - var _a, _b; - if (!texture._hardwareTexture) { - return; - } - const framebuffer = this._framebuffer; - const currentFB = this._engine._currentFramebuffer; - this._engine._bindUnboundFramebuffer(framebuffer); - if (this._engine.webGLVersion > 1) { - const gl = this._context; - const attachment = gl["COLOR_ATTACHMENT" + attachmentIndex]; - if (texture.is2DArray || texture.is3D) { - faceIndexOrLayer = faceIndexOrLayer ?? ((_a = this.layerIndices) == null ? void 0 : _a[attachmentIndex]) ?? 0; - gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachment, texture._hardwareTexture.underlyingResource, lodLevel, faceIndexOrLayer); - } else if (texture.isCube) { - faceIndexOrLayer = faceIndexOrLayer ?? ((_b = this.faceIndices) == null ? void 0 : _b[attachmentIndex]) ?? 0; - gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndexOrLayer, texture._hardwareTexture.underlyingResource, lodLevel); + if (defines._areFresnelDirty) { + if (_StandardMaterial.FresnelEnabled) { + if (this._diffuseFresnelParameters || this._opacityFresnelParameters || this._emissiveFresnelParameters || this._refractionFresnelParameters || this._reflectionFresnelParameters) { + defines.DIFFUSEFRESNEL = this._diffuseFresnelParameters && this._diffuseFresnelParameters.isEnabled; + defines.OPACITYFRESNEL = this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled; + defines.REFLECTIONFRESNEL = this._reflectionFresnelParameters && this._reflectionFresnelParameters.isEnabled; + defines.REFLECTIONFRESNELFROMSPECULAR = this._useReflectionFresnelFromSpecular; + defines.REFRACTIONFRESNEL = this._refractionFresnelParameters && this._refractionFresnelParameters.isEnabled; + defines.EMISSIVEFRESNEL = this._emissiveFresnelParameters && this._emissiveFresnelParameters.isEnabled; + defines._needNormals = true; + defines.FRESNEL = true; + } } else { - gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, texture._hardwareTexture.underlyingResource, lodLevel); + defines.FRESNEL = false; } - } else { - const gl = this._context; - const attachment = gl["COLOR_ATTACHMENT" + attachmentIndex + "_WEBGL"]; - const target = faceIndexOrLayer !== void 0 ? gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndexOrLayer : gl.TEXTURE_2D; - gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, target, texture._hardwareTexture.underlyingResource, lodLevel); } - this._engine._bindUnboundFramebuffer(currentFB); + PrepareDefinesForMisc(mesh, scene, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, this._shouldTurnAlphaTestOn(mesh) || this._forceAlphaTest, defines, this._applyDecalMapAfterDetailMap); + PrepareDefinesForFrameBoundValues(scene, engine, this, defines, useInstances, null, subMesh.getRenderingMesh().hasThinInstances); + this._eventInfo.defines = defines; + this._eventInfo.mesh = mesh; + this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo); + PrepareDefinesForAttributes(mesh, defines, true, true, true); + this._callbackPluginEventPrepareDefines(this._eventInfo); + let forceWasNotReadyPreviously = false; + if (defines.isDirty) { + const lightDisposed = defines._areLightsDisposed; + defines.markAsProcessed(); + const fallbacks = new EffectFallbacks(); + if (defines.REFLECTION) { + fallbacks.addFallback(0, "REFLECTION"); + } + if (defines.SPECULAR) { + fallbacks.addFallback(0, "SPECULAR"); + } + if (defines.BUMP) { + fallbacks.addFallback(0, "BUMP"); + } + if (defines.PARALLAX) { + fallbacks.addFallback(1, "PARALLAX"); + } + if (defines.PARALLAX_RHS) { + fallbacks.addFallback(1, "PARALLAX_RHS"); + } + if (defines.PARALLAXOCCLUSION) { + fallbacks.addFallback(0, "PARALLAXOCCLUSION"); + } + if (defines.SPECULAROVERALPHA) { + fallbacks.addFallback(0, "SPECULAROVERALPHA"); + } + if (defines.FOG) { + fallbacks.addFallback(1, "FOG"); + } + if (defines.POINTSIZE) { + fallbacks.addFallback(0, "POINTSIZE"); + } + if (defines.LOGARITHMICDEPTH) { + fallbacks.addFallback(0, "LOGARITHMICDEPTH"); + } + HandleFallbacksForShadows(defines, fallbacks, this._maxSimultaneousLights); + if (defines.SPECULARTERM) { + fallbacks.addFallback(0, "SPECULARTERM"); + } + if (defines.DIFFUSEFRESNEL) { + fallbacks.addFallback(1, "DIFFUSEFRESNEL"); + } + if (defines.OPACITYFRESNEL) { + fallbacks.addFallback(2, "OPACITYFRESNEL"); + } + if (defines.REFLECTIONFRESNEL) { + fallbacks.addFallback(3, "REFLECTIONFRESNEL"); + } + if (defines.EMISSIVEFRESNEL) { + fallbacks.addFallback(4, "EMISSIVEFRESNEL"); + } + if (defines.FRESNEL) { + fallbacks.addFallback(4, "FRESNEL"); + } + if (defines.MULTIVIEW) { + fallbacks.addFallback(0, "MULTIVIEW"); + } + const attribs = [VertexBuffer.PositionKind]; + if (defines.NORMAL) { + attribs.push(VertexBuffer.NormalKind); + } + if (defines.TANGENT) { + attribs.push(VertexBuffer.TangentKind); + } + for (let i = 1; i <= 6; ++i) { + if (defines["UV" + i]) { + attribs.push(`uv${i === 1 ? "" : i}`); + } + } + if (defines.VERTEXCOLOR) { + attribs.push(VertexBuffer.ColorKind); + } + PrepareAttributesForBones(attribs, mesh, defines, fallbacks); + PrepareAttributesForInstances(attribs, defines); + PrepareAttributesForMorphTargets(attribs, mesh, defines); + PrepareAttributesForBakedVertexAnimation(attribs, mesh, defines); + let shaderName = "default"; + const uniforms = [ + "world", + "view", + "viewProjection", + "vEyePosition", + "vLightsType", + "vAmbientColor", + "vDiffuseColor", + "vSpecularColor", + "vEmissiveColor", + "visibility", + "vFogInfos", + "vFogColor", + "pointSize", + "vDiffuseInfos", + "vAmbientInfos", + "vOpacityInfos", + "vReflectionInfos", + "vEmissiveInfos", + "vSpecularInfos", + "vBumpInfos", + "vLightmapInfos", + "vRefractionInfos", + "mBones", + "diffuseMatrix", + "ambientMatrix", + "opacityMatrix", + "reflectionMatrix", + "emissiveMatrix", + "specularMatrix", + "bumpMatrix", + "normalMatrix", + "lightmapMatrix", + "refractionMatrix", + "diffuseLeftColor", + "diffuseRightColor", + "opacityParts", + "reflectionLeftColor", + "reflectionRightColor", + "emissiveLeftColor", + "emissiveRightColor", + "refractionLeftColor", + "refractionRightColor", + "vReflectionPosition", + "vReflectionSize", + "vRefractionPosition", + "vRefractionSize", + "logarithmicDepthConstant", + "vTangentSpaceParams", + "alphaCutOff", + "boneTextureWidth", + "morphTargetTextureInfo", + "morphTargetTextureIndices" + ]; + const samplers = [ + "diffuseSampler", + "ambientSampler", + "opacitySampler", + "reflectionCubeSampler", + "reflection2DSampler", + "emissiveSampler", + "specularSampler", + "bumpSampler", + "lightmapSampler", + "refractionCubeSampler", + "refraction2DSampler", + "boneSampler", + "morphTargets", + "oitDepthSampler", + "oitFrontColorSampler" + ]; + const uniformBuffers = ["Material", "Scene", "Mesh"]; + const indexParameters = { maxSimultaneousLights: this._maxSimultaneousLights, maxSimultaneousMorphTargets: defines.NUM_MORPH_INFLUENCERS }; + this._eventInfo.fallbacks = fallbacks; + this._eventInfo.fallbackRank = 0; + this._eventInfo.defines = defines; + this._eventInfo.uniforms = uniforms; + this._eventInfo.attributes = attribs; + this._eventInfo.samplers = samplers; + this._eventInfo.uniformBuffersNames = uniformBuffers; + this._eventInfo.customCode = void 0; + this._eventInfo.mesh = mesh; + this._eventInfo.indexParameters = indexParameters; + this._callbackPluginEventGeneric(MaterialPluginEvent.PrepareEffect, this._eventInfo); + PrePassConfiguration.AddUniforms(uniforms); + PrePassConfiguration.AddSamplers(samplers); + if (ImageProcessingConfiguration) { + ImageProcessingConfiguration.PrepareUniforms(uniforms, defines); + ImageProcessingConfiguration.PrepareSamplers(samplers, defines); + } + PrepareUniformsAndSamplersList({ + uniformsNames: uniforms, + uniformBuffersNames: uniformBuffers, + samplers, + defines, + maxSimultaneousLights: this._maxSimultaneousLights + }); + addClipPlaneUniforms(uniforms); + const csnrOptions = {}; + if (this.customShaderNameResolve) { + shaderName = this.customShaderNameResolve(shaderName, uniforms, uniformBuffers, samplers, defines, attribs, csnrOptions); + } + const join = defines.toString(); + const previousEffect = subMesh.effect; + let effect = scene.getEngine().createEffect(shaderName, { + attributes: attribs, + uniformsNames: uniforms, + uniformBuffersNames: uniformBuffers, + samplers, + defines: join, + fallbacks, + onCompiled: this.onCompiled, + onError: this.onError, + indexParameters, + processFinalCode: csnrOptions.processFinalCode, + processCodeAfterIncludes: this._eventInfo.customCode, + multiTarget: defines.PREPASS + }, engine); + this._eventInfo.customCode = void 0; + if (effect) { + if (this._onEffectCreatedObservable) { + onCreatedEffectParameters.effect = effect; + onCreatedEffectParameters.subMesh = subMesh; + this._onEffectCreatedObservable.notifyObservers(onCreatedEffectParameters); + } + if (this.allowShaderHotSwapping && previousEffect && !effect.isReady()) { + effect = previousEffect; + defines.markAsUnprocessed(); + forceWasNotReadyPreviously = this.isFrozen; + if (lightDisposed) { + defines._areLightsDisposed = true; + return false; + } + } else { + scene.resetCachedMaterial(); + subMesh.setEffect(effect, defines, this._materialContext); + } + } + } + if (!subMesh.effect || !subMesh.effect.isReady()) { + return false; + } + defines._renderId = scene.getRenderId(); + drawWrapper._wasPreviouslyReady = forceWasNotReadyPreviously ? false : true; + drawWrapper._wasPreviouslyUsingInstances = useInstances; + this._checkScenePerformancePriority(); + return true; } /** - * Set a texture in the textures array - * @param texture the texture to set - * @param index the index in the textures array to set - * @param disposePrevious If this function should dispose the previous texture + * Builds the material UBO layouts. + * Used internally during the effect preparation. */ - setTexture(texture, index = 0, disposePrevious = true) { - super.setTexture(texture, index, disposePrevious); - this._bindTextureRenderTarget(texture, index); + buildUniformLayout() { + const ubo = this._uniformBuffer; + ubo.addUniform("diffuseLeftColor", 4); + ubo.addUniform("diffuseRightColor", 4); + ubo.addUniform("opacityParts", 4); + ubo.addUniform("reflectionLeftColor", 4); + ubo.addUniform("reflectionRightColor", 4); + ubo.addUniform("refractionLeftColor", 4); + ubo.addUniform("refractionRightColor", 4); + ubo.addUniform("emissiveLeftColor", 4); + ubo.addUniform("emissiveRightColor", 4); + ubo.addUniform("vDiffuseInfos", 2); + ubo.addUniform("vAmbientInfos", 2); + ubo.addUniform("vOpacityInfos", 2); + ubo.addUniform("vReflectionInfos", 2); + ubo.addUniform("vReflectionPosition", 3); + ubo.addUniform("vReflectionSize", 3); + ubo.addUniform("vEmissiveInfos", 2); + ubo.addUniform("vLightmapInfos", 2); + ubo.addUniform("vSpecularInfos", 2); + ubo.addUniform("vBumpInfos", 3); + ubo.addUniform("diffuseMatrix", 16); + ubo.addUniform("ambientMatrix", 16); + ubo.addUniform("opacityMatrix", 16); + ubo.addUniform("reflectionMatrix", 16); + ubo.addUniform("emissiveMatrix", 16); + ubo.addUniform("lightmapMatrix", 16); + ubo.addUniform("specularMatrix", 16); + ubo.addUniform("bumpMatrix", 16); + ubo.addUniform("vTangentSpaceParams", 2); + ubo.addUniform("pointSize", 1); + ubo.addUniform("alphaCutOff", 1); + ubo.addUniform("refractionMatrix", 16); + ubo.addUniform("vRefractionInfos", 4); + ubo.addUniform("vRefractionPosition", 3); + ubo.addUniform("vRefractionSize", 3); + ubo.addUniform("vSpecularColor", 4); + ubo.addUniform("vEmissiveColor", 3); + ubo.addUniform("vDiffuseColor", 4); + ubo.addUniform("vAmbientColor", 3); + super.buildUniformLayout(); } /** - * Sets the layer and face indices of every render target texture - * @param layers The layer of the texture to be set (make negative to not modify) - * @param faces The face of the texture to be set (make negative to not modify) + * Binds the submesh to this material by preparing the effect and shader to draw + * @param world defines the world transformation matrix + * @param mesh defines the mesh containing the submesh + * @param subMesh defines the submesh to bind the material to */ - setLayerAndFaceIndices(layers, faces) { + bindForSubMesh(world, mesh, subMesh) { var _a; - super.setLayerAndFaceIndices(layers, faces); - if (!this.textures || !this.layerIndices || !this.faceIndices) { + const scene = this.getScene(); + const defines = subMesh.materialDefines; + if (!defines) { return; } - const textureCount = ((_a = this._attachments) == null ? void 0 : _a.length) ?? this.textures.length; - for (let index = 0; index < textureCount; index++) { - const texture = this.textures[index]; - if (!texture) { - continue; - } - if (texture.is2DArray || texture.is3D) { - this._bindTextureRenderTarget(texture, index, this.layerIndices[index]); - } else if (texture.isCube) { - this._bindTextureRenderTarget(texture, index, this.faceIndices[index]); - } else { - this._bindTextureRenderTarget(texture, index); - } - } - } - /** - * Set the face and layer indices of a texture in the textures array - * @param index The index of the texture in the textures array to modify - * @param layer The layer of the texture to be set - * @param face The face of the texture to be set - */ - setLayerAndFaceIndex(index = 0, layer, face) { - super.setLayerAndFaceIndex(index, layer, face); - if (!this.textures || !this.layerIndices || !this.faceIndices) { + const effect = subMesh.effect; + if (!effect) { return; } - const texture = this.textures[index]; - if (texture.is2DArray || texture.is3D) { - this._bindTextureRenderTarget(this.textures[index], index, this.layerIndices[index]); - } else if (texture.isCube) { - this._bindTextureRenderTarget(this.textures[index], index, this.faceIndices[index]); + this._activeEffect = effect; + mesh.getMeshUniformBuffer().bindToEffect(effect, "Mesh"); + mesh.transferToEffect(world); + this._uniformBuffer.bindToEffect(effect, "Material"); + this.prePassConfiguration.bindForSubMesh(this._activeEffect, scene, mesh, world, this.isFrozen); + this._eventInfo.subMesh = subMesh; + this._callbackPluginEventHardBindForSubMesh(this._eventInfo); + if (defines.OBJECTSPACE_NORMALMAP) { + world.toNormalMatrix(this._normalMatrix); + this.bindOnlyNormalMatrix(this._normalMatrix); } - } - dispose(disposeOnlyFramebuffers = this._disposeOnlyFramebuffers) { - const gl = this._context; - if (!disposeOnlyFramebuffers) { - if (this._colorTextureArray) { - this._context.deleteTexture(this._colorTextureArray); - this._colorTextureArray = null; + const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility); + BindBonesParameters(mesh, effect); + const ubo = this._uniformBuffer; + if (mustRebind) { + this.bindViewProjection(effect); + if (!ubo.useUbo || !this.isFrozen || !ubo.isSync || subMesh._drawWrapper._forceRebindOnNextCall) { + if (_StandardMaterial.FresnelEnabled && defines.FRESNEL) { + if (this.diffuseFresnelParameters && this.diffuseFresnelParameters.isEnabled) { + ubo.updateColor4("diffuseLeftColor", this.diffuseFresnelParameters.leftColor, this.diffuseFresnelParameters.power); + ubo.updateColor4("diffuseRightColor", this.diffuseFresnelParameters.rightColor, this.diffuseFresnelParameters.bias); + } + if (this.opacityFresnelParameters && this.opacityFresnelParameters.isEnabled) { + ubo.updateColor4("opacityParts", new Color3(this.opacityFresnelParameters.leftColor.toLuminance(), this.opacityFresnelParameters.rightColor.toLuminance(), this.opacityFresnelParameters.bias), this.opacityFresnelParameters.power); + } + if (this.reflectionFresnelParameters && this.reflectionFresnelParameters.isEnabled) { + ubo.updateColor4("reflectionLeftColor", this.reflectionFresnelParameters.leftColor, this.reflectionFresnelParameters.power); + ubo.updateColor4("reflectionRightColor", this.reflectionFresnelParameters.rightColor, this.reflectionFresnelParameters.bias); + } + if (this.refractionFresnelParameters && this.refractionFresnelParameters.isEnabled) { + ubo.updateColor4("refractionLeftColor", this.refractionFresnelParameters.leftColor, this.refractionFresnelParameters.power); + ubo.updateColor4("refractionRightColor", this.refractionFresnelParameters.rightColor, this.refractionFresnelParameters.bias); + } + if (this.emissiveFresnelParameters && this.emissiveFresnelParameters.isEnabled) { + ubo.updateColor4("emissiveLeftColor", this.emissiveFresnelParameters.leftColor, this.emissiveFresnelParameters.power); + ubo.updateColor4("emissiveRightColor", this.emissiveFresnelParameters.rightColor, this.emissiveFresnelParameters.bias); + } + } + if (scene.texturesEnabled) { + if (this._diffuseTexture && _StandardMaterial.DiffuseTextureEnabled) { + ubo.updateFloat2("vDiffuseInfos", this._diffuseTexture.coordinatesIndex, this._diffuseTexture.level); + BindTextureMatrix(this._diffuseTexture, ubo, "diffuse"); + } + if (this._ambientTexture && _StandardMaterial.AmbientTextureEnabled) { + ubo.updateFloat2("vAmbientInfos", this._ambientTexture.coordinatesIndex, this._ambientTexture.level); + BindTextureMatrix(this._ambientTexture, ubo, "ambient"); + } + if (this._opacityTexture && _StandardMaterial.OpacityTextureEnabled) { + ubo.updateFloat2("vOpacityInfos", this._opacityTexture.coordinatesIndex, this._opacityTexture.level); + BindTextureMatrix(this._opacityTexture, ubo, "opacity"); + } + if (this._hasAlphaChannel()) { + ubo.updateFloat("alphaCutOff", this.alphaCutOff); + } + if (this._reflectionTexture && _StandardMaterial.ReflectionTextureEnabled) { + ubo.updateFloat2("vReflectionInfos", this._reflectionTexture.level, this.roughness); + ubo.updateMatrix("reflectionMatrix", this._reflectionTexture.getReflectionTextureMatrix()); + if (this._reflectionTexture.boundingBoxSize) { + const cubeTexture = this._reflectionTexture; + ubo.updateVector3("vReflectionPosition", cubeTexture.boundingBoxPosition); + ubo.updateVector3("vReflectionSize", cubeTexture.boundingBoxSize); + } + } + if (this._emissiveTexture && _StandardMaterial.EmissiveTextureEnabled) { + ubo.updateFloat2("vEmissiveInfos", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level); + BindTextureMatrix(this._emissiveTexture, ubo, "emissive"); + } + if (this._lightmapTexture && _StandardMaterial.LightmapTextureEnabled) { + ubo.updateFloat2("vLightmapInfos", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level); + BindTextureMatrix(this._lightmapTexture, ubo, "lightmap"); + } + if (this._specularTexture && _StandardMaterial.SpecularTextureEnabled) { + ubo.updateFloat2("vSpecularInfos", this._specularTexture.coordinatesIndex, this._specularTexture.level); + BindTextureMatrix(this._specularTexture, ubo, "specular"); + } + if (this._bumpTexture && scene.getEngine().getCaps().standardDerivatives && _StandardMaterial.BumpTextureEnabled) { + ubo.updateFloat3("vBumpInfos", this._bumpTexture.coordinatesIndex, 1 / this._bumpTexture.level, this.parallaxScaleBias); + BindTextureMatrix(this._bumpTexture, ubo, "bump"); + if (scene._mirroredCameraPosition) { + ubo.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? 1 : -1, this._invertNormalMapY ? 1 : -1); + } else { + ubo.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? -1 : 1, this._invertNormalMapY ? -1 : 1); + } + } + if (this._refractionTexture && _StandardMaterial.RefractionTextureEnabled) { + let depth = 1; + if (!this._refractionTexture.isCube) { + ubo.updateMatrix("refractionMatrix", this._refractionTexture.getReflectionTextureMatrix()); + if (this._refractionTexture.depth) { + depth = this._refractionTexture.depth; + } + } + ubo.updateFloat4("vRefractionInfos", this._refractionTexture.level, this.indexOfRefraction, depth, this.invertRefractionY ? -1 : 1); + if (this._refractionTexture.boundingBoxSize) { + const cubeTexture = this._refractionTexture; + ubo.updateVector3("vRefractionPosition", cubeTexture.boundingBoxPosition); + ubo.updateVector3("vRefractionSize", cubeTexture.boundingBoxSize); + } + } + } + if (this.pointsCloud) { + ubo.updateFloat("pointSize", this.pointSize); + } + if (defines.SPECULARTERM) { + ubo.updateColor4("vSpecularColor", this.specularColor, this.specularPower); + } + ubo.updateColor3("vEmissiveColor", _StandardMaterial.EmissiveTextureEnabled ? this.emissiveColor : Color3.BlackReadOnly); + ubo.updateColor4("vDiffuseColor", this.diffuseColor, this.alpha); + scene.ambientColor.multiplyToRef(this.ambientColor, this._globalAmbientColor); + ubo.updateColor3("vAmbientColor", this._globalAmbientColor); } - if (this._depthStencilTextureArray) { - this._context.deleteTexture(this._depthStencilTextureArray); - this._depthStencilTextureArray = null; + if (scene.texturesEnabled) { + if (this._diffuseTexture && _StandardMaterial.DiffuseTextureEnabled) { + effect.setTexture("diffuseSampler", this._diffuseTexture); + } + if (this._ambientTexture && _StandardMaterial.AmbientTextureEnabled) { + effect.setTexture("ambientSampler", this._ambientTexture); + } + if (this._opacityTexture && _StandardMaterial.OpacityTextureEnabled) { + effect.setTexture("opacitySampler", this._opacityTexture); + } + if (this._reflectionTexture && _StandardMaterial.ReflectionTextureEnabled) { + if (this._reflectionTexture.isCube) { + effect.setTexture("reflectionCubeSampler", this._reflectionTexture); + } else { + effect.setTexture("reflection2DSampler", this._reflectionTexture); + } + } + if (this._emissiveTexture && _StandardMaterial.EmissiveTextureEnabled) { + effect.setTexture("emissiveSampler", this._emissiveTexture); + } + if (this._lightmapTexture && _StandardMaterial.LightmapTextureEnabled) { + effect.setTexture("lightmapSampler", this._lightmapTexture); + } + if (this._specularTexture && _StandardMaterial.SpecularTextureEnabled) { + effect.setTexture("specularSampler", this._specularTexture); + } + if (this._bumpTexture && scene.getEngine().getCaps().standardDerivatives && _StandardMaterial.BumpTextureEnabled) { + effect.setTexture("bumpSampler", this._bumpTexture); + } + if (this._refractionTexture && _StandardMaterial.RefractionTextureEnabled) { + if (this._refractionTexture.isCube) { + effect.setTexture("refractionCubeSampler", this._refractionTexture); + } else { + effect.setTexture("refraction2DSampler", this._refractionTexture); + } + } + } + if (this.getScene().useOrderIndependentTransparency && this.needAlphaBlendingForMesh(mesh)) { + this.getScene().depthPeelingRenderer.bind(effect); } + this._eventInfo.subMesh = subMesh; + this._callbackPluginEventBindForSubMesh(this._eventInfo); + bindClipPlane(effect, this, scene); + this.bindEyePosition(effect); + } else if (scene.getEngine()._features.needToAlwaysBindUniformBuffers) { + this._needToBindSceneUbo = true; } - if (this._framebuffer) { - gl.deleteFramebuffer(this._framebuffer); - this._framebuffer = null; + if (mustRebind || !this.isFrozen) { + if (scene.lightsEnabled && !this._disableLighting) { + BindLights(scene, mesh, effect, defines, this._maxSimultaneousLights); + } + if (scene.fogEnabled && mesh.applyFog && scene.fogMode !== Scene.FOGMODE_NONE || this._reflectionTexture || this._refractionTexture || mesh.receiveShadows || defines.PREPASS) { + this.bindView(effect); + } + BindFogParameters(scene, mesh, effect); + if (defines.NUM_MORPH_INFLUENCERS) { + BindMorphTargetParameters(mesh, effect); + } + if (defines.BAKED_VERTEX_ANIMATION_TEXTURE) { + (_a = mesh.bakedVertexAnimationManager) == null ? void 0 : _a.bind(effect, defines.INSTANCES); + } + if (this.useLogarithmicDepth) { + BindLogDepth(defines, effect, scene); + } + if (this._imageProcessingConfiguration && !this._imageProcessingConfiguration.applyByPostProcess) { + this._imageProcessingConfiguration.bind(this._activeEffect); + } } - if (this._depthStencilBuffer) { - gl.deleteRenderbuffer(this._depthStencilBuffer); - this._depthStencilBuffer = null; + this._afterBind(mesh, this._activeEffect, subMesh); + ubo.update(); + } + /** + * Get the list of animatables in the material. + * @returns the list of animatables object used in the material + */ + getAnimatables() { + const results = super.getAnimatables(); + if (this._diffuseTexture && this._diffuseTexture.animations && this._diffuseTexture.animations.length > 0) { + results.push(this._diffuseTexture); } - if (this._MSAAFramebuffer) { - gl.deleteFramebuffer(this._MSAAFramebuffer); - this._MSAAFramebuffer = null; + if (this._ambientTexture && this._ambientTexture.animations && this._ambientTexture.animations.length > 0) { + results.push(this._ambientTexture); } - super.dispose(disposeOnlyFramebuffers); - } -}; - -// node_modules/@babylonjs/core/Engines/Extensions/engine.renderTarget.js -ThinEngine.prototype._createHardwareRenderTargetWrapper = function(isMulti, isCube, size) { - const rtWrapper = new WebGLRenderTargetWrapper(isMulti, isCube, size, this, this._gl); - this._renderTargetWrapperCache.push(rtWrapper); - return rtWrapper; -}; -ThinEngine.prototype.createRenderTargetTexture = function(size, options) { - const rtWrapper = this._createHardwareRenderTargetWrapper(false, false, size); - let generateDepthBuffer = true; - let generateStencilBuffer = false; - let noColorAttachment = false; - let colorAttachment = void 0; - let samples = 1; - let label = void 0; - if (options !== void 0 && typeof options === "object") { - generateDepthBuffer = options.generateDepthBuffer ?? true; - generateStencilBuffer = !!options.generateStencilBuffer; - noColorAttachment = !!options.noColorAttachment; - colorAttachment = options.colorAttachment; - samples = options.samples ?? 1; - label = options.label; - } - const texture = colorAttachment || (noColorAttachment ? null : this._createInternalTexture(size, options, true, InternalTextureSource.RenderTarget)); - const width = size.width || size; - const height = size.height || size; - const currentFrameBuffer = this._currentFramebuffer; - const gl = this._gl; - const framebuffer = gl.createFramebuffer(); - this._bindUnboundFramebuffer(framebuffer); - rtWrapper._depthStencilBuffer = this._setupFramebufferDepthAttachments(generateStencilBuffer, generateDepthBuffer, width, height); - if (texture && !texture.is2DArray && !texture.is3D) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture._hardwareTexture.underlyingResource, 0); - } - this._bindUnboundFramebuffer(currentFrameBuffer); - rtWrapper.label = label ?? "RenderTargetWrapper"; - rtWrapper._framebuffer = framebuffer; - rtWrapper._generateDepthBuffer = generateDepthBuffer; - rtWrapper._generateStencilBuffer = generateStencilBuffer; - rtWrapper.setTextures(texture); - this.updateRenderTargetTextureSampleCount(rtWrapper, samples); - return rtWrapper; -}; -ThinEngine.prototype.createDepthStencilTexture = function(size, options, rtWrapper) { - if (options.isCube) { - const width = size.width || size; - return this._createDepthStencilCubeTexture(width, options); - } else { - return this._createDepthStencilTexture(size, options, rtWrapper); - } -}; -ThinEngine.prototype._createDepthStencilTexture = function(size, options) { - const gl = this._gl; - const layers = size.layers || 0; - const depth = size.depth || 0; - let target = gl.TEXTURE_2D; - if (layers !== 0) { - target = gl.TEXTURE_2D_ARRAY; - } else if (depth !== 0) { - target = gl.TEXTURE_3D; - } - const internalTexture = new InternalTexture(this, InternalTextureSource.DepthStencil); - internalTexture.label = options.label; - if (!this._caps.depthTextureExtension) { - Logger.Error("Depth texture is not supported by your browser or hardware."); - return internalTexture; - } - const internalOptions = { - bilinearFiltering: false, - comparisonFunction: 0, - generateStencil: false, - ...options - }; - this._bindTextureDirectly(target, internalTexture, true); - this._setupDepthStencilTexture(internalTexture, size, internalOptions.generateStencil, internalOptions.comparisonFunction === 0 ? false : internalOptions.bilinearFiltering, internalOptions.comparisonFunction, internalOptions.samples); - if (internalOptions.depthTextureFormat !== void 0) { - if (internalOptions.depthTextureFormat !== 15 && internalOptions.depthTextureFormat !== 16 && internalOptions.depthTextureFormat !== 17 && internalOptions.depthTextureFormat !== 13 && internalOptions.depthTextureFormat !== 14 && internalOptions.depthTextureFormat !== 18) { - Logger.Error("Depth texture format is not supported."); - return internalTexture; + if (this._opacityTexture && this._opacityTexture.animations && this._opacityTexture.animations.length > 0) { + results.push(this._opacityTexture); } - internalTexture.format = internalOptions.depthTextureFormat; - } else { - internalTexture.format = internalOptions.generateStencil ? 13 : 16; - } - const hasStencil = internalTexture.format === 17 || internalTexture.format === 13 || internalTexture.format === 18; - let type = gl.UNSIGNED_INT; - if (internalTexture.format === 15) { - type = gl.UNSIGNED_SHORT; - } else if (internalTexture.format === 17 || internalTexture.format === 13) { - type = gl.UNSIGNED_INT_24_8; - } else if (internalTexture.format === 14) { - type = gl.FLOAT; - } else if (internalTexture.format === 18) { - type = gl.FLOAT_32_UNSIGNED_INT_24_8_REV; - } - const format = hasStencil ? gl.DEPTH_STENCIL : gl.DEPTH_COMPONENT; - let internalFormat = format; - if (this.webGLVersion > 1) { - if (internalTexture.format === 15) { - internalFormat = gl.DEPTH_COMPONENT16; - } else if (internalTexture.format === 16) { - internalFormat = gl.DEPTH_COMPONENT24; - } else if (internalTexture.format === 17 || internalTexture.format === 13) { - internalFormat = gl.DEPTH24_STENCIL8; - } else if (internalTexture.format === 14) { - internalFormat = gl.DEPTH_COMPONENT32F; - } else if (internalTexture.format === 18) { - internalFormat = gl.DEPTH32F_STENCIL8; + if (this._reflectionTexture && this._reflectionTexture.animations && this._reflectionTexture.animations.length > 0) { + results.push(this._reflectionTexture); } - } - if (internalTexture.is2DArray) { - gl.texImage3D(target, 0, internalFormat, internalTexture.width, internalTexture.height, layers, 0, format, type, null); - } else if (internalTexture.is3D) { - gl.texImage3D(target, 0, internalFormat, internalTexture.width, internalTexture.height, depth, 0, format, type, null); - } else { - gl.texImage2D(target, 0, internalFormat, internalTexture.width, internalTexture.height, 0, format, type, null); - } - this._bindTextureDirectly(target, null); - this._internalTexturesCache.push(internalTexture); - return internalTexture; -}; -ThinEngine.prototype.updateRenderTargetTextureSampleCount = function(rtWrapper, samples) { - if (this.webGLVersion < 2 || !rtWrapper || !rtWrapper.texture) { - return 1; - } - if (rtWrapper.samples === samples) { - return samples; - } - const gl = this._gl; - samples = Math.min(samples, this.getCaps().maxMSAASamples); - if (rtWrapper._depthStencilBuffer) { - gl.deleteRenderbuffer(rtWrapper._depthStencilBuffer); - rtWrapper._depthStencilBuffer = null; - } - if (rtWrapper._MSAAFramebuffer) { - gl.deleteFramebuffer(rtWrapper._MSAAFramebuffer); - rtWrapper._MSAAFramebuffer = null; - } - const hardwareTexture = rtWrapper.texture._hardwareTexture; - hardwareTexture.releaseMSAARenderBuffers(); - if (samples > 1 && typeof gl.renderbufferStorageMultisample === "function") { - const framebuffer = gl.createFramebuffer(); - if (!framebuffer) { - throw new Error("Unable to create multi sampled framebuffer"); + if (this._emissiveTexture && this._emissiveTexture.animations && this._emissiveTexture.animations.length > 0) { + results.push(this._emissiveTexture); } - rtWrapper._MSAAFramebuffer = framebuffer; - this._bindUnboundFramebuffer(rtWrapper._MSAAFramebuffer); - const colorRenderbuffer = this._createRenderBuffer(rtWrapper.texture.width, rtWrapper.texture.height, samples, -1, this._getRGBABufferInternalSizedFormat(rtWrapper.texture.type, rtWrapper.texture.format, rtWrapper.texture._useSRGBBuffer), gl.COLOR_ATTACHMENT0, false); - if (!colorRenderbuffer) { - throw new Error("Unable to create multi sampled framebuffer"); + if (this._specularTexture && this._specularTexture.animations && this._specularTexture.animations.length > 0) { + results.push(this._specularTexture); } - hardwareTexture.addMSAARenderBuffer(colorRenderbuffer); - } else { - this._bindUnboundFramebuffer(rtWrapper._framebuffer); - } - rtWrapper.texture.samples = samples; - rtWrapper._samples = samples; - rtWrapper._depthStencilBuffer = this._setupFramebufferDepthAttachments(rtWrapper._generateStencilBuffer, rtWrapper._generateDepthBuffer, rtWrapper.texture.width, rtWrapper.texture.height, samples); - this._bindUnboundFramebuffer(null); - return samples; -}; - -// node_modules/@babylonjs/core/PostProcesses/postProcess.js -var PostProcess = class _PostProcess { - /** - * Registers a shader code processing with a post process name. - * @param postProcessName name of the post process. Use null for the fallback shader code processing. This is the shader code processing that will be used in case no specific shader code processing has been associated to a post process name - * @param customShaderCodeProcessing shader code processing to associate to the post process name - */ - static RegisterShaderCodeProcessing(postProcessName, customShaderCodeProcessing) { - if (!customShaderCodeProcessing) { - delete _PostProcess._CustomShaderCodeProcessing[postProcessName ?? ""]; - return; + if (this._bumpTexture && this._bumpTexture.animations && this._bumpTexture.animations.length > 0) { + results.push(this._bumpTexture); } - _PostProcess._CustomShaderCodeProcessing[postProcessName ?? ""] = customShaderCodeProcessing; - } - static _GetShaderCodeProcessing(postProcessName) { - return _PostProcess._CustomShaderCodeProcessing[postProcessName] ?? _PostProcess._CustomShaderCodeProcessing[""]; - } - /** - * Number of sample textures (default: 1) - */ - get samples() { - return this._samples; - } - set samples(n) { - this._samples = Math.min(n, this._engine.getCaps().maxMSAASamples); - this._textures.forEach((texture) => { - texture.setSamples(this._samples); - }); - } - /** - * Returns the fragment url or shader name used in the post process. - * @returns the fragment url or name in the shader store. - */ - getEffectName() { - return this._fragmentUrl; - } - /** - * A function that is added to the onActivateObservable - */ - set onActivate(callback) { - if (this._onActivateObserver) { - this.onActivateObservable.remove(this._onActivateObserver); + if (this._lightmapTexture && this._lightmapTexture.animations && this._lightmapTexture.animations.length > 0) { + results.push(this._lightmapTexture); } - if (callback) { - this._onActivateObserver = this.onActivateObservable.add(callback); + if (this._refractionTexture && this._refractionTexture.animations && this._refractionTexture.animations.length > 0) { + results.push(this._refractionTexture); } + return results; } /** - * A function that is added to the onSizeChangedObservable + * Gets the active textures from the material + * @returns an array of textures */ - set onSizeChanged(callback) { - if (this._onSizeChangedObserver) { - this.onSizeChangedObservable.remove(this._onSizeChangedObserver); + getActiveTextures() { + const activeTextures = super.getActiveTextures(); + if (this._diffuseTexture) { + activeTextures.push(this._diffuseTexture); } - this._onSizeChangedObserver = this.onSizeChangedObservable.add(callback); - } - /** - * A function that is added to the onApplyObservable - */ - set onApply(callback) { - if (this._onApplyObserver) { - this.onApplyObservable.remove(this._onApplyObserver); + if (this._ambientTexture) { + activeTextures.push(this._ambientTexture); } - this._onApplyObserver = this.onApplyObservable.add(callback); - } - /** - * A function that is added to the onBeforeRenderObservable - */ - set onBeforeRender(callback) { - if (this._onBeforeRenderObserver) { - this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver); + if (this._opacityTexture) { + activeTextures.push(this._opacityTexture); } - this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback); - } - /** - * A function that is added to the onAfterRenderObservable - */ - set onAfterRender(callback) { - if (this._onAfterRenderObserver) { - this.onAfterRenderObservable.remove(this._onAfterRenderObserver); + if (this._reflectionTexture) { + activeTextures.push(this._reflectionTexture); } - this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback); - } - /** - * The input texture for this post process and the output texture of the previous post process. When added to a pipeline the previous post process will - * render it's output into this texture and this texture will be used as textureSampler in the fragment shader of this post process. - */ - get inputTexture() { - return this._textures.data[this._currentRenderTextureInd]; - } - set inputTexture(value) { - this._forcedOutputTexture = value; - } - /** - * Since inputTexture should always be defined, if we previously manually set `inputTexture`, - * the only way to unset it is to use this function to restore its internal state - */ - restoreDefaultInputTexture() { - if (this._forcedOutputTexture) { - this._forcedOutputTexture = null; - this.markTextureDirty(); + if (this._emissiveTexture) { + activeTextures.push(this._emissiveTexture); + } + if (this._specularTexture) { + activeTextures.push(this._specularTexture); + } + if (this._bumpTexture) { + activeTextures.push(this._bumpTexture); + } + if (this._lightmapTexture) { + activeTextures.push(this._lightmapTexture); } + if (this._refractionTexture) { + activeTextures.push(this._refractionTexture); + } + return activeTextures; } /** - * Gets the camera which post process is applied to. - * @returns The camera the post process is applied to. + * Specifies if the material uses a texture + * @param texture defines the texture to check against the material + * @returns a boolean specifying if the material uses the texture */ - getCamera() { - return this._camera; - } - /** - * Gets the texel size of the postprocess. - * See https://en.wikipedia.org/wiki/Texel_(graphics) - */ - get texelSize() { - if (this._shareOutputWithPostProcess) { - return this._shareOutputWithPostProcess.texelSize; + hasTexture(texture) { + if (super.hasTexture(texture)) { + return true; } - if (this._forcedOutputTexture) { - this._texelSize.copyFromFloats(1 / this._forcedOutputTexture.width, 1 / this._forcedOutputTexture.height); + if (this._diffuseTexture === texture) { + return true; } - return this._texelSize; - } - /** @internal */ - constructor(name69, fragmentUrl, parameters, samplers, _size, camera, samplingMode = 1, engine, reusable, defines = null, textureType = 0, vertexUrl = "postprocess", indexParameters, blockCompilation = false, textureFormat = 5, shaderLanguage = ShaderLanguage.GLSL) { - this._parentContainer = null; - this.width = -1; - this.height = -1; - this.nodeMaterialSource = null; - this._outputTexture = null; - this.autoClear = true; - this.forceAutoClearInAlphaMode = false; - this.alphaMode = 0; - this.animations = []; - this.enablePixelPerfectMode = false; - this.forceFullscreenViewport = true; - this.scaleMode = 1; - this.alwaysForcePOT = false; - this._samples = 1; - this.adaptScaleToCurrentViewport = false; - this._reusable = false; - this._renderId = 0; - this.externalTextureSamplerBinding = false; - this._textures = new SmartArray(2); - this._textureCache = []; - this._currentRenderTextureInd = 0; - this._scaleRatio = new Vector2(1, 1); - this._texelSize = Vector2.Zero(); - this.onActivateObservable = new Observable(); - this.onSizeChangedObservable = new Observable(); - this.onApplyObservable = new Observable(); - this.onBeforeRenderObservable = new Observable(); - this.onAfterRenderObservable = new Observable(); - this.name = name69; - let size = 1; - let uniformBuffers = null; - if (parameters && !Array.isArray(parameters)) { - const options = parameters; - parameters = options.uniforms ?? null; - samplers = options.samplers ?? null; - size = options.size ?? 1; - camera = options.camera ?? null; - samplingMode = options.samplingMode ?? 1; - engine = options.engine; - reusable = options.reusable; - defines = options.defines ?? null; - textureType = options.textureType ?? 0; - vertexUrl = options.vertexUrl ?? "postprocess"; - indexParameters = options.indexParameters; - blockCompilation = options.blockCompilation ?? false; - textureFormat = options.textureFormat ?? 5; - shaderLanguage = options.shaderLanguage ?? ShaderLanguage.GLSL; - uniformBuffers = options.uniformBuffers ?? null; - } else if (_size) { - if (typeof _size === "number") { - size = _size; - } else { - size = { width: _size.width, height: _size.height }; - } + if (this._ambientTexture === texture) { + return true; } - if (camera != null) { - this._camera = camera; - this._scene = camera.getScene(); - camera.attachPostProcess(this); - this._engine = this._scene.getEngine(); - this._scene.postProcesses.push(this); - this.uniqueId = this._scene.getUniqueId(); - } else if (engine) { - this._engine = engine; - this._engine.postProcesses.push(this); + if (this._opacityTexture === texture) { + return true; } - this._options = size; - this.renderTargetSamplingMode = samplingMode ? samplingMode : 1; - this._reusable = reusable || false; - this._textureType = textureType; - this._textureFormat = textureFormat; - this._shaderLanguage = shaderLanguage; - this._samplers = samplers || []; - this._samplers.push("textureSampler"); - this._fragmentUrl = fragmentUrl; - this._vertexUrl = vertexUrl; - this._parameters = parameters || []; - this._parameters.push("scale"); - this._uniformBuffers = uniformBuffers || []; - this._indexParameters = indexParameters; - this._drawWrapper = new DrawWrapper(this._engine); - if (!blockCompilation) { - this.updateEffect(defines); + if (this._reflectionTexture === texture) { + return true; + } + if (this._emissiveTexture === texture) { + return true; + } + if (this._specularTexture === texture) { + return true; + } + if (this._bumpTexture === texture) { + return true; + } + if (this._lightmapTexture === texture) { + return true; + } + if (this._refractionTexture === texture) { + return true; } + return false; } /** - * Gets a string identifying the name of the class - * @returns "PostProcess" string + * Disposes the material + * @param forceDisposeEffect specifies if effects should be forcefully disposed + * @param forceDisposeTextures specifies if textures should be forcefully disposed */ - getClassName() { - return "PostProcess"; + dispose(forceDisposeEffect, forceDisposeTextures) { + var _a, _b, _c, _d, _e, _f, _g, _h, _i; + if (forceDisposeTextures) { + (_a = this._diffuseTexture) == null ? void 0 : _a.dispose(); + (_b = this._ambientTexture) == null ? void 0 : _b.dispose(); + (_c = this._opacityTexture) == null ? void 0 : _c.dispose(); + (_d = this._reflectionTexture) == null ? void 0 : _d.dispose(); + (_e = this._emissiveTexture) == null ? void 0 : _e.dispose(); + (_f = this._specularTexture) == null ? void 0 : _f.dispose(); + (_g = this._bumpTexture) == null ? void 0 : _g.dispose(); + (_h = this._lightmapTexture) == null ? void 0 : _h.dispose(); + (_i = this._refractionTexture) == null ? void 0 : _i.dispose(); + } + if (this._imageProcessingConfiguration && this._imageProcessingObserver) { + this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver); + } + super.dispose(forceDisposeEffect, forceDisposeTextures); } /** - * Gets the engine which this post process belongs to. - * @returns The engine the post process was enabled with. + * Makes a duplicate of the material, and gives it a new name + * @param name defines the new name for the duplicated material + * @param cloneTexturesOnlyOnce - if a texture is used in more than one channel (e.g diffuse and opacity), only clone it once and reuse it on the other channels. Default false. + * @param rootUrl defines the root URL to use to load textures + * @returns the cloned material */ - getEngine() { - return this._engine; + clone(name69, cloneTexturesOnlyOnce = true, rootUrl = "") { + const result = SerializationHelper.Clone(() => new _StandardMaterial(name69, this.getScene()), this, { cloneTexturesOnlyOnce }); + result.name = name69; + result.id = name69; + this.stencil.copyTo(result.stencil); + this._clonePlugins(result, rootUrl); + return result; } /** - * The effect that is created when initializing the post process. - * @returns The created effect corresponding the postprocess. + * Creates a standard material from parsed material data + * @param source defines the JSON representation of the material + * @param scene defines the hosting scene + * @param rootUrl defines the root URL to use to load textures and relative dependencies + * @returns a new standard material */ - getEffect() { - return this._drawWrapper.effect; + static Parse(source, scene, rootUrl) { + const material = SerializationHelper.Parse(() => new _StandardMaterial(source.name, scene), source, scene, rootUrl); + if (source.stencil) { + material.stencil.parse(source.stencil, scene, rootUrl); + } + Material._ParsePlugins(source, material, scene, rootUrl); + return material; } + // Flags used to enable or disable a type of texture for all Standard Materials /** - * To avoid multiple redundant textures for multiple post process, the output the output texture for this post process can be shared with another. - * @param postProcess The post process to share the output with. - * @returns This post process. + * Are diffuse textures enabled in the application. */ - shareOutputWith(postProcess) { - this._disposeTextures(); - this._shareOutputWithPostProcess = postProcess; - return this; + static get DiffuseTextureEnabled() { + return MaterialFlags.DiffuseTextureEnabled; + } + static set DiffuseTextureEnabled(value) { + MaterialFlags.DiffuseTextureEnabled = value; } /** - * Reverses the effect of calling shareOutputWith and returns the post process back to its original state. - * This should be called if the post process that shares output with this post process is disabled/disposed. + * Are detail textures enabled in the application. */ - useOwnOutput() { - if (this._textures.length == 0) { - this._textures = new SmartArray(2); - } - this._shareOutputWithPostProcess = null; + static get DetailTextureEnabled() { + return MaterialFlags.DetailTextureEnabled; + } + static set DetailTextureEnabled(value) { + MaterialFlags.DetailTextureEnabled = value; } /** - * Updates the effect with the current post process compile time values and recompiles the shader. - * @param defines Define statements that should be added at the beginning of the shader. (default: null) - * @param uniforms Set of uniform variables that will be passed to the shader. (default: null) - * @param samplers Set of Texture2D variables that will be passed to the shader. (default: null) - * @param indexParameters The index parameters to be used for babylons include syntax "#include[0..varyingCount]". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx - * @param onCompiled Called when the shader has been compiled. - * @param onError Called if there is an error when compiling a shader. - * @param vertexUrl The url of the vertex shader to be used (default: the one given at construction time) - * @param fragmentUrl The url of the fragment shader to be used (default: the one given at construction time) + * Are ambient textures enabled in the application. */ - updateEffect(defines = null, uniforms = null, samplers = null, indexParameters, onCompiled, onError, vertexUrl, fragmentUrl) { - const customShaderCodeProcessing = _PostProcess._GetShaderCodeProcessing(this.name); - if (customShaderCodeProcessing == null ? void 0 : customShaderCodeProcessing.defineCustomBindings) { - const newUniforms = (uniforms == null ? void 0 : uniforms.slice()) ?? []; - newUniforms.push(...this._parameters); - const newSamplers = (samplers == null ? void 0 : samplers.slice()) ?? []; - newSamplers.push(...this._samplers); - defines = customShaderCodeProcessing.defineCustomBindings(this.name, defines, newUniforms, newSamplers); - uniforms = newUniforms; - samplers = newSamplers; - } - this._postProcessDefines = defines; - this._drawWrapper.effect = this._engine.createEffect({ vertex: vertexUrl ?? this._vertexUrl, fragment: fragmentUrl ?? this._fragmentUrl }, { - attributes: ["position"], - uniformsNames: uniforms || this._parameters, - uniformBuffersNames: this._uniformBuffers, - samplers: samplers || this._samplers, - defines: defines !== null ? defines : "", - fallbacks: null, - onCompiled: onCompiled ?? null, - onError: onError ?? null, - indexParameters: indexParameters || this._indexParameters, - processCodeAfterIncludes: (customShaderCodeProcessing == null ? void 0 : customShaderCodeProcessing.processCodeAfterIncludes) ? (shaderType, code) => customShaderCodeProcessing.processCodeAfterIncludes(this.name, shaderType, code) : null, - processFinalCode: (customShaderCodeProcessing == null ? void 0 : customShaderCodeProcessing.processFinalCode) ? (shaderType, code) => customShaderCodeProcessing.processFinalCode(this.name, shaderType, code) : null, - shaderLanguage: this._shaderLanguage - }, this._engine); + static get AmbientTextureEnabled() { + return MaterialFlags.AmbientTextureEnabled; + } + static set AmbientTextureEnabled(value) { + MaterialFlags.AmbientTextureEnabled = value; } /** - * The post process is reusable if it can be used multiple times within one frame. - * @returns If the post process is reusable + * Are opacity textures enabled in the application. */ - isReusable() { - return this._reusable; + static get OpacityTextureEnabled() { + return MaterialFlags.OpacityTextureEnabled; } - /** invalidate frameBuffer to hint the postprocess to create a depth buffer */ - markTextureDirty() { - this.width = -1; + static set OpacityTextureEnabled(value) { + MaterialFlags.OpacityTextureEnabled = value; } - _createRenderTargetTexture(textureSize, textureOptions, channel = 0) { - for (let i = 0; i < this._textureCache.length; i++) { - if (this._textureCache[i].texture.width === textureSize.width && this._textureCache[i].texture.height === textureSize.height && this._textureCache[i].postProcessChannel === channel && this._textureCache[i].texture._generateDepthBuffer === textureOptions.generateDepthBuffer && this._textureCache[i].texture.samples === textureOptions.samples) { - return this._textureCache[i].texture; - } - } - const tex = this._engine.createRenderTargetTexture(textureSize, textureOptions); - this._textureCache.push({ texture: tex, postProcessChannel: channel, lastUsedRenderId: -1 }); - return tex; + /** + * Are reflection textures enabled in the application. + */ + static get ReflectionTextureEnabled() { + return MaterialFlags.ReflectionTextureEnabled; } - _flushTextureCache() { - const currentRenderId = this._renderId; - for (let i = this._textureCache.length - 1; i >= 0; i--) { - if (currentRenderId - this._textureCache[i].lastUsedRenderId > 100) { - let currentlyUsed = false; - for (let j = 0; j < this._textures.length; j++) { - if (this._textures.data[j] === this._textureCache[i].texture) { - currentlyUsed = true; - break; - } - } - if (!currentlyUsed) { - this._textureCache[i].texture.dispose(); - this._textureCache.splice(i, 1); - } - } - } + static set ReflectionTextureEnabled(value) { + MaterialFlags.ReflectionTextureEnabled = value; } /** - * Resizes the post-process texture - * @param width Width of the texture - * @param height Height of the texture - * @param camera The camera this post-process is applied to. Pass null if the post-process is used outside the context of a camera post-process chain (default: null) - * @param needMipMaps True if mip maps need to be generated after render (default: false) - * @param forceDepthStencil True to force post-process texture creation with stencil depth and buffer (default: false) + * Are emissive textures enabled in the application. */ - resize(width, height, camera = null, needMipMaps = false, forceDepthStencil = false) { - if (this._textures.length > 0) { - this._textures.reset(); - } - this.width = width; - this.height = height; - let firstPP = null; - if (camera) { - for (let i = 0; i < camera._postProcesses.length; i++) { - if (camera._postProcesses[i] !== null) { - firstPP = camera._postProcesses[i]; - break; - } - } - } - const textureSize = { width: this.width, height: this.height }; - const textureOptions = { - generateMipMaps: needMipMaps, - generateDepthBuffer: forceDepthStencil || firstPP === this, - generateStencilBuffer: (forceDepthStencil || firstPP === this) && this._engine.isStencilEnable, - samplingMode: this.renderTargetSamplingMode, - type: this._textureType, - format: this._textureFormat, - samples: this._samples, - label: "PostProcessRTT-" + this.name - }; - this._textures.push(this._createRenderTargetTexture(textureSize, textureOptions, 0)); - if (this._reusable) { - this._textures.push(this._createRenderTargetTexture(textureSize, textureOptions, 1)); - } - this._texelSize.copyFromFloats(1 / this.width, 1 / this.height); - this.onSizeChangedObservable.notifyObservers(this); + static get EmissiveTextureEnabled() { + return MaterialFlags.EmissiveTextureEnabled; } - _getTarget() { - let target; - if (this._shareOutputWithPostProcess) { - target = this._shareOutputWithPostProcess.inputTexture; - } else if (this._forcedOutputTexture) { - target = this._forcedOutputTexture; - this.width = this._forcedOutputTexture.width; - this.height = this._forcedOutputTexture.height; - } else { - target = this.inputTexture; - let cache; - for (let i = 0; i < this._textureCache.length; i++) { - if (this._textureCache[i].texture === target) { - cache = this._textureCache[i]; - break; - } - } - if (cache) { - cache.lastUsedRenderId = this._renderId; - } - } - return target; + static set EmissiveTextureEnabled(value) { + MaterialFlags.EmissiveTextureEnabled = value; } /** - * Activates the post process by intializing the textures to be used when executed. Notifies onActivateObservable. - * When this post process is used in a pipeline, this is call will bind the input texture of this post process to the output of the previous. - * @param camera The camera that will be used in the post process. This camera will be used when calling onActivateObservable. - * @param sourceTexture The source texture to be inspected to get the width and height if not specified in the post process constructor. (default: null) - * @param forceDepthStencil If true, a depth and stencil buffer will be generated. (default: false) - * @returns The render target wrapper that was bound to be written to. + * Are specular textures enabled in the application. */ - activate(camera, sourceTexture = null, forceDepthStencil) { - var _a, _b; - camera = camera || this._camera; - const scene = camera.getScene(); - const engine = scene.getEngine(); - const maxSize = engine.getCaps().maxTextureSize; - const requiredWidth = (sourceTexture ? sourceTexture.width : this._engine.getRenderWidth(true)) * this._options | 0; - const requiredHeight = (sourceTexture ? sourceTexture.height : this._engine.getRenderHeight(true)) * this._options | 0; - let desiredWidth = this._options.width || requiredWidth; - let desiredHeight = this._options.height || requiredHeight; - const needMipMaps = this.renderTargetSamplingMode !== 7 && this.renderTargetSamplingMode !== 1 && this.renderTargetSamplingMode !== 2; - let target = null; - if (!this._shareOutputWithPostProcess && !this._forcedOutputTexture) { - if (this.adaptScaleToCurrentViewport) { - const currentViewport = engine.currentViewport; - if (currentViewport) { - desiredWidth *= currentViewport.width; - desiredHeight *= currentViewport.height; - } - } - if (needMipMaps || this.alwaysForcePOT) { - if (!this._options.width) { - desiredWidth = engine.needPOTTextures ? Engine.GetExponentOfTwo(desiredWidth, maxSize, this.scaleMode) : desiredWidth; - } - if (!this._options.height) { - desiredHeight = engine.needPOTTextures ? Engine.GetExponentOfTwo(desiredHeight, maxSize, this.scaleMode) : desiredHeight; - } - } - if (this.width !== desiredWidth || this.height !== desiredHeight || !(target = this._getTarget())) { - this.resize(desiredWidth, desiredHeight, camera, needMipMaps, forceDepthStencil); - } - this._textures.forEach((texture) => { - if (texture.samples !== this.samples) { - this._engine.updateRenderTargetTextureSampleCount(texture, this.samples); - } - }); - this._flushTextureCache(); - this._renderId++; - } - if (!target) { - target = this._getTarget(); - } - if (this.enablePixelPerfectMode) { - this._scaleRatio.copyFromFloats(requiredWidth / desiredWidth, requiredHeight / desiredHeight); - this._engine.bindFramebuffer(target, 0, requiredWidth, requiredHeight, this.forceFullscreenViewport); - } else { - this._scaleRatio.copyFromFloats(1, 1); - this._engine.bindFramebuffer(target, 0, void 0, void 0, this.forceFullscreenViewport); - } - (_b = (_a = this._engine)._debugInsertMarker) == null ? void 0 : _b.call(_a, `post process ${this.name} input`); - this.onActivateObservable.notifyObservers(camera); - if (this.autoClear && (this.alphaMode === 0 || this.forceAutoClearInAlphaMode)) { - this._engine.clear(this.clearColor ? this.clearColor : scene.clearColor, scene._allowPostProcessClearColor, true, true); - } - if (this._reusable) { - this._currentRenderTextureInd = (this._currentRenderTextureInd + 1) % 2; - } - return target; + static get SpecularTextureEnabled() { + return MaterialFlags.SpecularTextureEnabled; + } + static set SpecularTextureEnabled(value) { + MaterialFlags.SpecularTextureEnabled = value; } /** - * If the post process is supported. + * Are bump textures enabled in the application. */ - get isSupported() { - return this._drawWrapper.effect.isSupported; + static get BumpTextureEnabled() { + return MaterialFlags.BumpTextureEnabled; + } + static set BumpTextureEnabled(value) { + MaterialFlags.BumpTextureEnabled = value; } /** - * The aspect ratio of the output texture. + * Are lightmap textures enabled in the application. */ - get aspectRatio() { - if (this._shareOutputWithPostProcess) { - return this._shareOutputWithPostProcess.aspectRatio; - } - if (this._forcedOutputTexture) { - return this._forcedOutputTexture.width / this._forcedOutputTexture.height; - } - return this.width / this.height; + static get LightmapTextureEnabled() { + return MaterialFlags.LightmapTextureEnabled; + } + static set LightmapTextureEnabled(value) { + MaterialFlags.LightmapTextureEnabled = value; } /** - * Get a value indicating if the post-process is ready to be used - * @returns true if the post-process is ready (shader is compiled) + * Are refraction textures enabled in the application. */ - isReady() { - var _a; - return ((_a = this._drawWrapper.effect) == null ? void 0 : _a.isReady()) ?? false; + static get RefractionTextureEnabled() { + return MaterialFlags.RefractionTextureEnabled; + } + static set RefractionTextureEnabled(value) { + MaterialFlags.RefractionTextureEnabled = value; } /** - * Binds all textures and uniforms to the shader, this will be run on every pass. - * @returns the effect corresponding to this post process. Null if not compiled or not ready. + * Are color grading textures enabled in the application. */ - apply() { - var _a, _b, _c; - if (!((_a = this._drawWrapper.effect) == null ? void 0 : _a.isReady())) { - return null; - } - this._engine.enableEffect(this._drawWrapper); - this._engine.setState(false); - this._engine.setDepthBuffer(false); - this._engine.setDepthWrite(false); - this._engine.setAlphaMode(this.alphaMode); - if (this.alphaConstants) { - this.getEngine().setAlphaConstants(this.alphaConstants.r, this.alphaConstants.g, this.alphaConstants.b, this.alphaConstants.a); - } - let source; - if (this._shareOutputWithPostProcess) { - source = this._shareOutputWithPostProcess.inputTexture; - } else if (this._forcedOutputTexture) { - source = this._forcedOutputTexture; - } else { - source = this.inputTexture; - } - if (!this.externalTextureSamplerBinding) { - this._drawWrapper.effect._bindTexture("textureSampler", source == null ? void 0 : source.texture); - } - this._drawWrapper.effect.setVector2("scale", this._scaleRatio); - this.onApplyObservable.notifyObservers(this._drawWrapper.effect); - (_c = (_b = _PostProcess._GetShaderCodeProcessing(this.name)) == null ? void 0 : _b.bindCustomBindings) == null ? void 0 : _c.call(_b, this.name, this._drawWrapper.effect); - return this._drawWrapper.effect; - } - _disposeTextures() { - if (this._shareOutputWithPostProcess || this._forcedOutputTexture) { - this._disposeTextureCache(); - return; - } - this._disposeTextureCache(); - this._textures.dispose(); + static get ColorGradingTextureEnabled() { + return MaterialFlags.ColorGradingTextureEnabled; } - _disposeTextureCache() { - for (let i = this._textureCache.length - 1; i >= 0; i--) { - this._textureCache[i].texture.dispose(); - } - this._textureCache.length = 0; + static set ColorGradingTextureEnabled(value) { + MaterialFlags.ColorGradingTextureEnabled = value; } /** - * Sets the required values to the prepass renderer. - * @param prePassRenderer defines the prepass renderer to setup. - * @returns true if the pre pass is needed. + * Are fresnels enabled in the application. */ - setPrePassRenderer(prePassRenderer) { - if (this._prePassEffectConfiguration) { - this._prePassEffectConfiguration = prePassRenderer.addEffectConfiguration(this._prePassEffectConfiguration); - this._prePassEffectConfiguration.enabled = true; - return true; - } - return false; - } - /** - * Disposes the post process. - * @param camera The camera to dispose the post process on. - */ - dispose(camera) { - camera = camera || this._camera; - this._disposeTextures(); - let index; - if (this._scene) { - index = this._scene.postProcesses.indexOf(this); - if (index !== -1) { - this._scene.postProcesses.splice(index, 1); - } - } - if (this._parentContainer) { - const index2 = this._parentContainer.postProcesses.indexOf(this); - if (index2 > -1) { - this._parentContainer.postProcesses.splice(index2, 1); - } - this._parentContainer = null; - } - index = this._engine.postProcesses.indexOf(this); - if (index !== -1) { - this._engine.postProcesses.splice(index, 1); - } - if (!camera) { - return; - } - camera.detachPostProcess(this); - index = camera._postProcesses.indexOf(this); - if (index === 0 && camera._postProcesses.length > 0) { - const firstPostProcess = this._camera._getFirstPostProcess(); - if (firstPostProcess) { - firstPostProcess.markTextureDirty(); - } - } - this.onActivateObservable.clear(); - this.onAfterRenderObservable.clear(); - this.onApplyObservable.clear(); - this.onBeforeRenderObservable.clear(); - this.onSizeChangedObservable.clear(); - } - /** - * Serializes the post process to a JSON object - * @returns the JSON object - */ - serialize() { - const serializationObject = SerializationHelper.Serialize(this); - const camera = this.getCamera() || this._scene && this._scene.activeCamera; - serializationObject.customType = "BABYLON." + this.getClassName(); - serializationObject.cameraId = camera ? camera.id : null; - serializationObject.reusable = this._reusable; - serializationObject.textureType = this._textureType; - serializationObject.fragmentUrl = this._fragmentUrl; - serializationObject.parameters = this._parameters; - serializationObject.samplers = this._samplers; - serializationObject.options = this._options; - serializationObject.defines = this._postProcessDefines; - serializationObject.textureFormat = this._textureFormat; - serializationObject.vertexUrl = this._vertexUrl; - serializationObject.indexParameters = this._indexParameters; - return serializationObject; - } - /** - * Clones this post process - * @returns a new post process similar to this one - */ - clone() { - const serializationObject = this.serialize(); - serializationObject._engine = this._engine; - serializationObject.cameraId = null; - const result = _PostProcess.Parse(serializationObject, this._scene, ""); - if (!result) { - return null; - } - result.onActivateObservable = this.onActivateObservable.clone(); - result.onSizeChangedObservable = this.onSizeChangedObservable.clone(); - result.onApplyObservable = this.onApplyObservable.clone(); - result.onBeforeRenderObservable = this.onBeforeRenderObservable.clone(); - result.onAfterRenderObservable = this.onAfterRenderObservable.clone(); - result._prePassEffectConfiguration = this._prePassEffectConfiguration; - return result; - } - /** - * Creates a material from parsed material data - * @param parsedPostProcess defines parsed post process data - * @param scene defines the hosting scene - * @param rootUrl defines the root URL to use to load textures - * @returns a new post process - */ - static Parse(parsedPostProcess, scene, rootUrl) { - const postProcessType = GetClass(parsedPostProcess.customType); - if (!postProcessType || !postProcessType._Parse) { - return null; - } - const camera = scene ? scene.getCameraById(parsedPostProcess.cameraId) : null; - return postProcessType._Parse(parsedPostProcess, camera, scene, rootUrl); + static get FresnelEnabled() { + return MaterialFlags.FresnelEnabled; } - /** - * @internal - */ - static _Parse(parsedPostProcess, targetCamera, scene, rootUrl) { - return SerializationHelper.Parse(() => { - return new _PostProcess(parsedPostProcess.name, parsedPostProcess.fragmentUrl, parsedPostProcess.parameters, parsedPostProcess.samplers, parsedPostProcess.options, targetCamera, parsedPostProcess.renderTargetSamplingMode, parsedPostProcess._engine, parsedPostProcess.reusable, parsedPostProcess.defines, parsedPostProcess.textureType, parsedPostProcess.vertexUrl, parsedPostProcess.indexParameters, false, parsedPostProcess.textureFormat); - }, parsedPostProcess, scene, rootUrl); + static set FresnelEnabled(value) { + MaterialFlags.FresnelEnabled = value; } }; -PostProcess._CustomShaderCodeProcessing = {}; __decorate([ - serialize() -], PostProcess.prototype, "uniqueId", void 0); + serializeAsTexture("diffuseTexture") +], StandardMaterial.prototype, "_diffuseTexture", void 0); __decorate([ - serialize() -], PostProcess.prototype, "name", void 0); + expandToProperty("_markAllSubMeshesAsTexturesAndMiscDirty") +], StandardMaterial.prototype, "diffuseTexture", void 0); __decorate([ - serialize() -], PostProcess.prototype, "width", void 0); + serializeAsTexture("ambientTexture") +], StandardMaterial.prototype, "_ambientTexture", void 0); __decorate([ - serialize() -], PostProcess.prototype, "height", void 0); + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "ambientTexture", void 0); __decorate([ - serialize() -], PostProcess.prototype, "renderTargetSamplingMode", void 0); + serializeAsTexture("opacityTexture") +], StandardMaterial.prototype, "_opacityTexture", void 0); __decorate([ - serializeAsColor4() -], PostProcess.prototype, "clearColor", void 0); + expandToProperty("_markAllSubMeshesAsTexturesAndMiscDirty") +], StandardMaterial.prototype, "opacityTexture", void 0); __decorate([ - serialize() -], PostProcess.prototype, "autoClear", void 0); + serializeAsTexture("reflectionTexture") +], StandardMaterial.prototype, "_reflectionTexture", void 0); __decorate([ - serialize() -], PostProcess.prototype, "forceAutoClearInAlphaMode", void 0); + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "reflectionTexture", void 0); __decorate([ - serialize() -], PostProcess.prototype, "alphaMode", void 0); + serializeAsTexture("emissiveTexture") +], StandardMaterial.prototype, "_emissiveTexture", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "emissiveTexture", void 0); +__decorate([ + serializeAsTexture("specularTexture") +], StandardMaterial.prototype, "_specularTexture", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "specularTexture", void 0); +__decorate([ + serializeAsTexture("bumpTexture") +], StandardMaterial.prototype, "_bumpTexture", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "bumpTexture", void 0); +__decorate([ + serializeAsTexture("lightmapTexture") +], StandardMaterial.prototype, "_lightmapTexture", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "lightmapTexture", void 0); +__decorate([ + serializeAsTexture("refractionTexture") +], StandardMaterial.prototype, "_refractionTexture", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "refractionTexture", void 0); +__decorate([ + serializeAsColor3("ambient") +], StandardMaterial.prototype, "ambientColor", void 0); +__decorate([ + serializeAsColor3("diffuse") +], StandardMaterial.prototype, "diffuseColor", void 0); +__decorate([ + serializeAsColor3("specular") +], StandardMaterial.prototype, "specularColor", void 0); +__decorate([ + serializeAsColor3("emissive") +], StandardMaterial.prototype, "emissiveColor", void 0); __decorate([ serialize() -], PostProcess.prototype, "alphaConstants", void 0); +], StandardMaterial.prototype, "specularPower", void 0); +__decorate([ + serialize("useAlphaFromDiffuseTexture") +], StandardMaterial.prototype, "_useAlphaFromDiffuseTexture", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesAndMiscDirty") +], StandardMaterial.prototype, "useAlphaFromDiffuseTexture", void 0); +__decorate([ + serialize("useEmissiveAsIllumination") +], StandardMaterial.prototype, "_useEmissiveAsIllumination", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "useEmissiveAsIllumination", void 0); +__decorate([ + serialize("linkEmissiveWithDiffuse") +], StandardMaterial.prototype, "_linkEmissiveWithDiffuse", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "linkEmissiveWithDiffuse", void 0); +__decorate([ + serialize("useSpecularOverAlpha") +], StandardMaterial.prototype, "_useSpecularOverAlpha", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "useSpecularOverAlpha", void 0); +__decorate([ + serialize("useReflectionOverAlpha") +], StandardMaterial.prototype, "_useReflectionOverAlpha", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "useReflectionOverAlpha", void 0); +__decorate([ + serialize("disableLighting") +], StandardMaterial.prototype, "_disableLighting", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsLightsDirty") +], StandardMaterial.prototype, "disableLighting", void 0); +__decorate([ + serialize("useObjectSpaceNormalMap") +], StandardMaterial.prototype, "_useObjectSpaceNormalMap", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "useObjectSpaceNormalMap", void 0); +__decorate([ + serialize("useParallax") +], StandardMaterial.prototype, "_useParallax", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "useParallax", void 0); +__decorate([ + serialize("useParallaxOcclusion") +], StandardMaterial.prototype, "_useParallaxOcclusion", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "useParallaxOcclusion", void 0); __decorate([ serialize() -], PostProcess.prototype, "enablePixelPerfectMode", void 0); +], StandardMaterial.prototype, "parallaxScaleBias", void 0); +__decorate([ + serialize("roughness") +], StandardMaterial.prototype, "_roughness", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "roughness", void 0); __decorate([ serialize() -], PostProcess.prototype, "forceFullscreenViewport", void 0); +], StandardMaterial.prototype, "indexOfRefraction", void 0); __decorate([ serialize() -], PostProcess.prototype, "scaleMode", void 0); +], StandardMaterial.prototype, "invertRefractionY", void 0); __decorate([ serialize() -], PostProcess.prototype, "alwaysForcePOT", void 0); +], StandardMaterial.prototype, "alphaCutOff", void 0); __decorate([ - serialize("samples") -], PostProcess.prototype, "_samples", void 0); + serialize("useLightmapAsShadowmap") +], StandardMaterial.prototype, "_useLightmapAsShadowmap", void 0); __decorate([ - serialize() -], PostProcess.prototype, "adaptScaleToCurrentViewport", void 0); -RegisterClass("BABYLON.PostProcess", PostProcess); + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "useLightmapAsShadowmap", void 0); +__decorate([ + serializeAsFresnelParameters("diffuseFresnelParameters") +], StandardMaterial.prototype, "_diffuseFresnelParameters", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsFresnelDirty") +], StandardMaterial.prototype, "diffuseFresnelParameters", void 0); +__decorate([ + serializeAsFresnelParameters("opacityFresnelParameters") +], StandardMaterial.prototype, "_opacityFresnelParameters", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsFresnelAndMiscDirty") +], StandardMaterial.prototype, "opacityFresnelParameters", void 0); +__decorate([ + serializeAsFresnelParameters("reflectionFresnelParameters") +], StandardMaterial.prototype, "_reflectionFresnelParameters", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsFresnelDirty") +], StandardMaterial.prototype, "reflectionFresnelParameters", void 0); +__decorate([ + serializeAsFresnelParameters("refractionFresnelParameters") +], StandardMaterial.prototype, "_refractionFresnelParameters", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsFresnelDirty") +], StandardMaterial.prototype, "refractionFresnelParameters", void 0); +__decorate([ + serializeAsFresnelParameters("emissiveFresnelParameters") +], StandardMaterial.prototype, "_emissiveFresnelParameters", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsFresnelDirty") +], StandardMaterial.prototype, "emissiveFresnelParameters", void 0); +__decorate([ + serialize("useReflectionFresnelFromSpecular") +], StandardMaterial.prototype, "_useReflectionFresnelFromSpecular", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsFresnelDirty") +], StandardMaterial.prototype, "useReflectionFresnelFromSpecular", void 0); +__decorate([ + serialize("useGlossinessFromSpecularMapAlpha") +], StandardMaterial.prototype, "_useGlossinessFromSpecularMapAlpha", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "useGlossinessFromSpecularMapAlpha", void 0); +__decorate([ + serialize("maxSimultaneousLights") +], StandardMaterial.prototype, "_maxSimultaneousLights", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsLightsDirty") +], StandardMaterial.prototype, "maxSimultaneousLights", void 0); +__decorate([ + serialize("invertNormalMapX") +], StandardMaterial.prototype, "_invertNormalMapX", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "invertNormalMapX", void 0); +__decorate([ + serialize("invertNormalMapY") +], StandardMaterial.prototype, "_invertNormalMapY", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "invertNormalMapY", void 0); +__decorate([ + serialize("twoSidedLighting") +], StandardMaterial.prototype, "_twoSidedLighting", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsTexturesDirty") +], StandardMaterial.prototype, "twoSidedLighting", void 0); +__decorate([ + serialize("applyDecalMapAfterDetailMap") +], StandardMaterial.prototype, "_applyDecalMapAfterDetailMap", void 0); +__decorate([ + expandToProperty("_markAllSubMeshesAsMiscDirty") +], StandardMaterial.prototype, "applyDecalMapAfterDetailMap", void 0); +RegisterClass("BABYLON.StandardMaterial", StandardMaterial); +Scene.DefaultMaterialFactory = (scene) => { + return new StandardMaterial("default material", scene); +}; -// node_modules/@babylonjs/core/Materials/Node/Blocks/vectorMergerBlock.js -var VectorMergerBlock = class extends NodeMaterialBlock { +// node_modules/@babylonjs/core/XR/webXRFeaturesManager.js +var WebXRFeatureName = class { +}; +WebXRFeatureName.ANCHOR_SYSTEM = "xr-anchor-system"; +WebXRFeatureName.BACKGROUND_REMOVER = "xr-background-remover"; +WebXRFeatureName.HIT_TEST = "xr-hit-test"; +WebXRFeatureName.MESH_DETECTION = "xr-mesh-detection"; +WebXRFeatureName.PHYSICS_CONTROLLERS = "xr-physics-controller"; +WebXRFeatureName.PLANE_DETECTION = "xr-plane-detection"; +WebXRFeatureName.POINTER_SELECTION = "xr-controller-pointer-selection"; +WebXRFeatureName.TELEPORTATION = "xr-controller-teleportation"; +WebXRFeatureName.FEATURE_POINTS = "xr-feature-points"; +WebXRFeatureName.HAND_TRACKING = "xr-hand-tracking"; +WebXRFeatureName.IMAGE_TRACKING = "xr-image-tracking"; +WebXRFeatureName.NEAR_INTERACTION = "xr-near-interaction"; +WebXRFeatureName.DOM_OVERLAY = "xr-dom-overlay"; +WebXRFeatureName.MOVEMENT = "xr-controller-movement"; +WebXRFeatureName.LIGHT_ESTIMATION = "xr-light-estimation"; +WebXRFeatureName.EYE_TRACKING = "xr-eye-tracking"; +WebXRFeatureName.WALKING_LOCOMOTION = "xr-walking-locomotion"; +WebXRFeatureName.LAYERS = "xr-layers"; +WebXRFeatureName.DEPTH_SENSING = "xr-depth-sensing"; +WebXRFeatureName.SPACE_WARP = "xr-space-warp"; +WebXRFeatureName.RAW_CAMERA_ACCESS = "xr-raw-camera-access"; +var WebXRFeaturesManager = class _WebXRFeaturesManager { /** - * Create a new VectorMergerBlock - * @param name defines the block name + * constructs a new features manages. + * + * @param _xrSessionManager an instance of WebXRSessionManager */ - constructor(name69) { - super(name69, NodeMaterialBlockTargets.Neutral); - this.xSwizzle = "x"; - this.ySwizzle = "y"; - this.zSwizzle = "z"; - this.wSwizzle = "w"; - this.registerInput("xyzw ", NodeMaterialBlockConnectionPointTypes.Vector4, true); - this.registerInput("xyz ", NodeMaterialBlockConnectionPointTypes.Vector3, true); - this.registerInput("xy ", NodeMaterialBlockConnectionPointTypes.Vector2, true); - this.registerInput("zw ", NodeMaterialBlockConnectionPointTypes.Vector2, true); - this.registerInput("x", NodeMaterialBlockConnectionPointTypes.Float, true); - this.registerInput("y", NodeMaterialBlockConnectionPointTypes.Float, true); - this.registerInput("z", NodeMaterialBlockConnectionPointTypes.Float, true); - this.registerInput("w", NodeMaterialBlockConnectionPointTypes.Float, true); - this.registerOutput("xyzw", NodeMaterialBlockConnectionPointTypes.Vector4); - this.registerOutput("xyz", NodeMaterialBlockConnectionPointTypes.Vector3); - this.registerOutput("xy", NodeMaterialBlockConnectionPointTypes.Vector2); - this.registerOutput("zw", NodeMaterialBlockConnectionPointTypes.Vector2); + constructor(_xrSessionManager) { + this._xrSessionManager = _xrSessionManager; + this._features = {}; + this._xrSessionManager.onXRSessionInit.add(() => { + this.getEnabledFeatures().forEach((featureName) => { + const feature = this._features[featureName]; + if (feature.enabled && !feature.featureImplementation.attached && !feature.featureImplementation.disableAutoAttach) { + this.attachFeature(featureName); + } + }); + }); + this._xrSessionManager.onXRSessionEnded.add(() => { + this.getEnabledFeatures().forEach((featureName) => { + const feature = this._features[featureName]; + if (feature.enabled && feature.featureImplementation.attached) { + this.detachFeature(featureName); + } + }); + }); } /** - * Gets the current class name - * @returns the class name + * Used to register a module. After calling this function a developer can use this feature in the scene. + * Mainly used internally. + * + * @param featureName the name of the feature to register + * @param constructorFunction the function used to construct the module + * @param version the (babylon) version of the module + * @param stable is that a stable version of this module */ - getClassName() { - return "VectorMergerBlock"; + static AddWebXRFeature(featureName, constructorFunction, version = 1, stable = false) { + this._AvailableFeatures[featureName] = this._AvailableFeatures[featureName] || { latest: version }; + if (version > this._AvailableFeatures[featureName].latest) { + this._AvailableFeatures[featureName].latest = version; + } + if (stable) { + this._AvailableFeatures[featureName].stable = version; + } + this._AvailableFeatures[featureName][version] = constructorFunction; } /** - * Gets the xyzw component (input) + * Returns a constructor of a specific feature. + * + * @param featureName the name of the feature to construct + * @param version the version of the feature to load + * @param xrSessionManager the xrSessionManager. Used to construct the module + * @param options optional options provided to the module. + * @returns a function that, when called, will return a new instance of this feature */ - get xyzwIn() { - return this._inputs[0]; + static ConstructFeature(featureName, version = 1, xrSessionManager, options) { + const constructorFunction = this._AvailableFeatures[featureName][version]; + if (!constructorFunction) { + throw new Error("feature not found"); + } + return constructorFunction(xrSessionManager, options); } /** - * Gets the xyz component (input) + * Can be used to return the list of features currently registered + * + * @returns an Array of available features */ - get xyzIn() { - return this._inputs[1]; + static GetAvailableFeatures() { + return Object.keys(this._AvailableFeatures); } /** - * Gets the xy component (input) + * Gets the versions available for a specific feature + * @param featureName the name of the feature + * @returns an array with the available versions */ - get xyIn() { - return this._inputs[2]; + static GetAvailableVersions(featureName) { + return Object.keys(this._AvailableFeatures[featureName]); } /** - * Gets the zw component (input) + * Return the latest unstable version of this feature + * @param featureName the name of the feature to search + * @returns the version number. if not found will return -1 */ - get zwIn() { - return this._inputs[3]; + static GetLatestVersionOfFeature(featureName) { + return this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].latest || -1; } /** - * Gets the x component (input) + * Return the latest stable version of this feature + * @param featureName the name of the feature to search + * @returns the version number. if not found will return -1 */ - get x() { - return this._inputs[4]; + static GetStableVersionOfFeature(featureName) { + return this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].stable || -1; } /** - * Gets the y component (input) + * Attach a feature to the current session. Mainly used when session started to start the feature effect. + * Can be used during a session to start a feature + * @param featureName the name of feature to attach */ - get y() { - return this._inputs[5]; + attachFeature(featureName) { + const feature = this._features[featureName]; + if (feature && feature.enabled && !feature.featureImplementation.attached) { + const attached = feature.featureImplementation.attach(); + if (!attached) { + Tools.Warn(`Feature ${featureName} failed to attach`); + } + } } /** - * Gets the z component (input) + * Can be used inside a session or when the session ends to detach a specific feature + * @param featureName the name of the feature to detach */ - get z() { - return this._inputs[6]; + detachFeature(featureName) { + const feature = this._features[featureName]; + if (feature && feature.featureImplementation.attached) { + const detached = feature.featureImplementation.detach(); + if (!detached) { + Tools.Warn(`Feature ${featureName} failed to detach`); + } + } } /** - * Gets the w component (input) - */ - get w() { - return this._inputs[7]; - } - /** - * Gets the xyzw component (output) + * Used to disable an already-enabled feature + * The feature will be disposed and will be recreated once enabled. + * @param featureName the feature to disable + * @returns true if disable was successful */ - get xyzw() { - return this._outputs[0]; + // eslint-disable-next-line @typescript-eslint/naming-convention + disableFeature(featureName) { + const name69 = typeof featureName === "string" ? featureName : featureName.Name; + const feature = this._features[name69]; + if (feature && feature.enabled) { + feature.enabled = false; + this.detachFeature(name69); + feature.featureImplementation.dispose(); + delete this._features[name69]; + return true; + } + return false; } /** - * Gets the xyz component (output) + * dispose this features manager */ - get xyzOut() { - return this._outputs[1]; + dispose() { + this.getEnabledFeatures().forEach((feature) => { + this.disableFeature(feature); + }); } /** - * Gets the xy component (output) + * Enable a feature using its name and a version. This will enable it in the scene, and will be responsible to attach it when the session starts. + * If used twice, the old version will be disposed and a new one will be constructed. This way you can re-enable with different configuration. + * + * @param featureName the name of the feature to load or the class of the feature + * @param version optional version to load. if not provided the latest version will be enabled + * @param moduleOptions options provided to the module. Ses the module documentation / constructor + * @param attachIfPossible if set to true (default) the feature will be automatically attached, if it is currently possible + * @param required is this feature required to the app. If set to true the session init will fail if the feature is not available. + * @returns a new constructed feature or throws an error if feature not found or conflicts with another enabled feature. */ - get xyOut() { - return this._outputs[2]; + enableFeature(featureName, version = "latest", moduleOptions = {}, attachIfPossible = true, required = true) { + const name69 = typeof featureName === "string" ? featureName : featureName.Name; + let versionToLoad = 0; + if (typeof version === "string") { + if (!version) { + throw new Error(`Error in provided version - ${name69} (${version})`); + } + if (version === "stable") { + versionToLoad = _WebXRFeaturesManager.GetStableVersionOfFeature(name69); + } else if (version === "latest") { + versionToLoad = _WebXRFeaturesManager.GetLatestVersionOfFeature(name69); + } else { + versionToLoad = +version; + } + if (versionToLoad === -1 || isNaN(versionToLoad)) { + throw new Error(`feature not found - ${name69} (${version})`); + } + } else { + versionToLoad = version; + } + const conflictingFeature = _WebXRFeaturesManager._ConflictingFeatures[name69]; + if (conflictingFeature !== void 0 && this.getEnabledFeatures().indexOf(conflictingFeature) !== -1) { + throw new Error(`Feature ${name69} cannot be enabled while ${conflictingFeature} is enabled.`); + } + const feature = this._features[name69]; + const constructFunction = _WebXRFeaturesManager.ConstructFeature(name69, versionToLoad, this._xrSessionManager, moduleOptions); + if (!constructFunction) { + throw new Error(`feature not found - ${name69}`); + } + if (feature) { + this.disableFeature(name69); + } + const constructed = constructFunction(); + if (constructed.dependsOn) { + const dependentsFound = constructed.dependsOn.every((featureName2) => !!this._features[featureName2]); + if (!dependentsFound) { + throw new Error(`Dependant features missing. Make sure the following features are enabled - ${constructed.dependsOn.join(", ")}`); + } + } + if (constructed.isCompatible()) { + this._features[name69] = { + featureImplementation: constructed, + enabled: true, + version: versionToLoad, + required + }; + if (attachIfPossible) { + if (this._xrSessionManager.session && !this._features[name69].featureImplementation.attached) { + this.attachFeature(name69); + } + } else { + this._features[name69].featureImplementation.disableAutoAttach = true; + } + return this._features[name69].featureImplementation; + } else { + if (required) { + throw new Error("required feature not compatible"); + } else { + Tools.Warn(`Feature ${name69} not compatible with the current environment/browser and was not enabled.`); + return constructed; + } + } } /** - * Gets the zw component (output) + * get the implementation of an enabled feature. + * @param featureName the name of the feature to load + * @returns the feature class, if found */ - get zwOut() { - return this._outputs[3]; + getEnabledFeature(featureName) { + return this._features[featureName] && this._features[featureName].featureImplementation; } /** - * Gets the xy component (output) - * @deprecated Please use xyOut instead. + * Get the list of enabled features + * @returns an array of enabled features */ - get xy() { - return this.xyOut; + getEnabledFeatures() { + return Object.keys(this._features); } /** - * Gets the xyz component (output) - * @deprecated Please use xyzOut instead. + * This function will extend the session creation configuration object with enabled features. + * If, for example, the anchors feature is enabled, it will be automatically added to the optional or required features list, + * according to the defined "required" variable, provided during enableFeature call + * @param xrSessionInit the xr Session init object to extend + * + * @returns an extended XRSessionInit object */ - get xyz() { - return this.xyzOut; - } - _inputRename(name69) { - if (name69 === "xyzw ") { - return "xyzwIn"; - } - if (name69 === "xyz ") { - return "xyzIn"; - } - if (name69 === "xy ") { - return "xyIn"; - } - if (name69 === "zw ") { - return "zwIn"; - } - return name69; - } - _buildSwizzle(len) { - const swizzle = this.xSwizzle + this.ySwizzle + this.zSwizzle + this.wSwizzle; - return "." + swizzle.substr(0, len); - } - _buildBlock(state) { - super._buildBlock(state); - const xInput = this.x; - const yInput = this.y; - const zInput = this.z; - const wInput = this.w; - const xyInput = this.xyIn; - const zwInput = this.zwIn; - const xyzInput = this.xyzIn; - const xyzwInput = this.xyzwIn; - const v4Output = this._outputs[0]; - const v3Output = this._outputs[1]; - const v2Output = this._outputs[2]; - const v2CompOutput = this._outputs[3]; - if (xyzwInput.isConnected) { - if (v4Output.hasEndpoints) { - state.compilationString += this._declareOutput(v4Output, state) + ` = ${xyzwInput.associatedVariableName}${this._buildSwizzle(4)}; -`; - } - if (v3Output.hasEndpoints) { - state.compilationString += this._declareOutput(v3Output, state) + ` = ${xyzwInput.associatedVariableName}${this._buildSwizzle(3)}; -`; - } - if (v2Output.hasEndpoints) { - state.compilationString += this._declareOutput(v2Output, state) + ` = ${xyzwInput.associatedVariableName}${this._buildSwizzle(2)}; -`; - } - } else if (xyzInput.isConnected) { - if (v4Output.hasEndpoints) { - state.compilationString += this._declareOutput(v4Output, state) + ` = vec4(${xyzInput.associatedVariableName}, ${wInput.isConnected ? this._writeVariable(wInput) : "0.0"})${this._buildSwizzle(4)}; -`; - } - if (v3Output.hasEndpoints) { - state.compilationString += this._declareOutput(v3Output, state) + ` = ${xyzInput.associatedVariableName}${this._buildSwizzle(3)}; -`; - } - if (v2Output.hasEndpoints) { - state.compilationString += this._declareOutput(v2Output, state) + ` = ${xyzInput.associatedVariableName}${this._buildSwizzle(2)}; -`; - } - } else if (xyInput.isConnected) { - if (v4Output.hasEndpoints) { - if (zwInput.isConnected) { - state.compilationString += this._declareOutput(v4Output, state) + ` = vec4(${xyInput.associatedVariableName}, ${zwInput.associatedVariableName})${this._buildSwizzle(4)}; -`; - } else { - state.compilationString += this._declareOutput(v4Output, state) + ` = vec4(${xyInput.associatedVariableName}, ${zInput.isConnected ? this._writeVariable(zInput) : "0.0"}, ${wInput.isConnected ? this._writeVariable(wInput) : "0.0"})${this._buildSwizzle(4)}; -`; - } - } - if (v3Output.hasEndpoints) { - state.compilationString += this._declareOutput(v3Output, state) + ` = vec3(${xyInput.associatedVariableName}, ${zInput.isConnected ? this._writeVariable(zInput) : "0.0"})${this._buildSwizzle(3)}; -`; - } - if (v2Output.hasEndpoints) { - state.compilationString += this._declareOutput(v2Output, state) + ` = ${xyInput.associatedVariableName}${this._buildSwizzle(2)}; -`; - } - if (v2CompOutput.hasEndpoints) { - if (zwInput.isConnected) { - state.compilationString += this._declareOutput(v2CompOutput, state) + ` = ${zwInput.associatedVariableName}${this._buildSwizzle(2)}; -`; - } else { - state.compilationString += this._declareOutput(v2CompOutput, state) + ` = vec2(${zInput.isConnected ? this._writeVariable(zInput) : "0.0"}, ${wInput.isConnected ? this._writeVariable(wInput) : "0.0"})${this._buildSwizzle(2)}; -`; - } - } - } else { - if (v4Output.hasEndpoints) { - if (zwInput.isConnected) { - state.compilationString += this._declareOutput(v4Output, state) + ` = vec4(${xInput.isConnected ? this._writeVariable(xInput) : "0.0"}, ${yInput.isConnected ? this._writeVariable(yInput) : "0.0"}, ${zwInput.associatedVariableName})${this._buildSwizzle(4)}; -`; + async _extendXRSessionInitObject(xrSessionInit) { + const enabledFeatures = this.getEnabledFeatures(); + for (const featureName of enabledFeatures) { + const feature = this._features[featureName]; + const nativeName = feature.featureImplementation.xrNativeFeatureName; + if (nativeName) { + if (feature.required) { + xrSessionInit.requiredFeatures = xrSessionInit.requiredFeatures || []; + if (xrSessionInit.requiredFeatures.indexOf(nativeName) === -1) { + xrSessionInit.requiredFeatures.push(nativeName); + } } else { - state.compilationString += this._declareOutput(v4Output, state) + ` = vec4(${xInput.isConnected ? this._writeVariable(xInput) : "0.0"}, ${yInput.isConnected ? this._writeVariable(yInput) : "0.0"}, ${zInput.isConnected ? this._writeVariable(zInput) : "0.0"}, ${wInput.isConnected ? this._writeVariable(wInput) : "0.0"})${this._buildSwizzle(4)}; -`; + xrSessionInit.optionalFeatures = xrSessionInit.optionalFeatures || []; + if (xrSessionInit.optionalFeatures.indexOf(nativeName) === -1) { + xrSessionInit.optionalFeatures.push(nativeName); + } } } - if (v3Output.hasEndpoints) { - state.compilationString += this._declareOutput(v3Output, state) + ` = vec3(${xInput.isConnected ? this._writeVariable(xInput) : "0.0"}, ${yInput.isConnected ? this._writeVariable(yInput) : "0.0"}, ${zInput.isConnected ? this._writeVariable(zInput) : "0.0"})${this._buildSwizzle(3)}; -`; - } - if (v2Output.hasEndpoints) { - state.compilationString += this._declareOutput(v2Output, state) + ` = vec2(${xInput.isConnected ? this._writeVariable(xInput) : "0.0"}, ${yInput.isConnected ? this._writeVariable(yInput) : "0.0"})${this._buildSwizzle(2)}; -`; - } - if (v2CompOutput.hasEndpoints) { - if (zwInput.isConnected) { - state.compilationString += this._declareOutput(v2CompOutput, state) + ` = ${zwInput.associatedVariableName}${this._buildSwizzle(2)}; -`; - } else { - state.compilationString += this._declareOutput(v2CompOutput, state) + ` = vec2(${zInput.isConnected ? this._writeVariable(zInput) : "0.0"}, ${wInput.isConnected ? this._writeVariable(wInput) : "0.0"})${this._buildSwizzle(2)}; -`; - } + if (feature.featureImplementation.getXRSessionInitExtension) { + const extended = await feature.featureImplementation.getXRSessionInitExtension(); + xrSessionInit = { + ...xrSessionInit, + ...extended + }; } } - return this; - } - serialize() { - const serializationObject = super.serialize(); - serializationObject.xSwizzle = this.xSwizzle; - serializationObject.ySwizzle = this.ySwizzle; - serializationObject.zSwizzle = this.zSwizzle; - serializationObject.wSwizzle = this.wSwizzle; - return serializationObject; - } - _deserialize(serializationObject, scene, rootUrl) { - super._deserialize(serializationObject, scene, rootUrl); - this.xSwizzle = serializationObject.xSwizzle ?? "x"; - this.ySwizzle = serializationObject.ySwizzle ?? "y"; - this.zSwizzle = serializationObject.zSwizzle ?? "z"; - this.wSwizzle = serializationObject.wSwizzle ?? "w"; - } - _dumpPropertiesCode() { - let codeString = super._dumpPropertiesCode(); - codeString += `${this._codeVariableName}.xSwizzle = "${this.xSwizzle}"; -`; - codeString += `${this._codeVariableName}.ySwizzle = "${this.ySwizzle}"; -`; - codeString += `${this._codeVariableName}.zSwizzle = "${this.zSwizzle}"; -`; - codeString += `${this._codeVariableName}.wSwizzle = "${this.wSwizzle}"; -`; - return codeString; + return xrSessionInit; } }; -RegisterClass("BABYLON.VectorMergerBlock", VectorMergerBlock); +WebXRFeaturesManager._AvailableFeatures = {}; +WebXRFeaturesManager._ConflictingFeatures = { + [WebXRFeatureName.TELEPORTATION]: WebXRFeatureName.MOVEMENT, + [WebXRFeatureName.MOVEMENT]: WebXRFeatureName.TELEPORTATION +}; -// node_modules/@babylonjs/core/Materials/Node/Blocks/remapBlock.js -var RemapBlock = class extends NodeMaterialBlock { +// node_modules/@babylonjs/core/XR/features/WebXRAbstractFeature.js +var WebXRAbstractFeature = class { /** - * Creates a new RemapBlock - * @param name defines the block name + * The name of the native xr feature name (like anchor, hit-test, or hand-tracking) */ - constructor(name69) { - super(name69, NodeMaterialBlockTargets.Neutral); - this.sourceRange = new Vector2(-1, 1); - this.targetRange = new Vector2(0, 1); - this.registerInput("input", NodeMaterialBlockConnectionPointTypes.AutoDetect); - this.registerInput("sourceMin", NodeMaterialBlockConnectionPointTypes.Float, true); - this.registerInput("sourceMax", NodeMaterialBlockConnectionPointTypes.Float, true); - this.registerInput("targetMin", NodeMaterialBlockConnectionPointTypes.Float, true); - this.registerInput("targetMax", NodeMaterialBlockConnectionPointTypes.Float, true); - this.registerOutput("output", NodeMaterialBlockConnectionPointTypes.BasedOnInput); - this._outputs[0]._typeConnectionSource = this._inputs[0]; + get xrNativeFeatureName() { + return this._xrNativeFeatureName; + } + set xrNativeFeatureName(name69) { + var _a; + if (!this._xrSessionManager.isNative && name69 && this._xrSessionManager.inXRSession && ((_a = this._xrSessionManager.enabledFeatures) == null ? void 0 : _a.indexOf(name69)) === -1) { + Logger.Warn(`The feature ${name69} needs to be enabled before starting the XR session. Note - It is still possible it is not supported.`); + } + this._xrNativeFeatureName = name69; } /** - * Gets the current class name - * @returns the class name + * Construct a new (abstract) WebXR feature + * @param _xrSessionManager the xr session manager for this feature */ - getClassName() { - return "RemapBlock"; + constructor(_xrSessionManager) { + this._xrSessionManager = _xrSessionManager; + this._attached = false; + this._removeOnDetach = []; + this.isDisposed = false; + this.disableAutoAttach = false; + this._xrNativeFeatureName = ""; + this.onFeatureAttachObservable = new Observable(); + this.onFeatureDetachObservable = new Observable(); } /** - * Gets the input component + * Is this feature attached */ - get input() { - return this._inputs[0]; + get attached() { + return this._attached; } /** - * Gets the source min input component + * attach this feature + * + * @param force should attachment be forced (even when already attached) + * @returns true if successful, false is failed or already attached */ - get sourceMin() { - return this._inputs[1]; + attach(force) { + if (this.isDisposed) { + return false; + } + if (!force) { + if (this.attached) { + return false; + } + } else { + if (this.attached) { + this.detach(); + } + } + if (!this._xrSessionManager.enabledFeatures) { + Logger.Warn("session.enabledFeatures is not available on this device. It is possible that this feature is not supported."); + } else if (!this._xrSessionManager.isNative && this.xrNativeFeatureName && this._xrSessionManager.enabledFeatures.indexOf(this.xrNativeFeatureName) === -1) { + return false; + } + this._attached = true; + this._addNewAttachObserver(this._xrSessionManager.onXRFrameObservable, (frame) => this._onXRFrame(frame)); + this.onFeatureAttachObservable.notifyObservers(this); + return true; } /** - * Gets the source max input component + * detach this feature. + * + * @returns true if successful, false if failed or already detached */ - get sourceMax() { - return this._inputs[2]; + detach() { + if (!this._attached) { + this.disableAutoAttach = true; + return false; + } + this._attached = false; + this._removeOnDetach.forEach((toRemove) => { + toRemove.observable.remove(toRemove.observer); + }); + this.onFeatureDetachObservable.notifyObservers(this); + return true; } /** - * Gets the target min input component + * Dispose this feature and all of the resources attached */ - get targetMin() { - return this._inputs[3]; + dispose() { + this.detach(); + this.isDisposed = true; + this.onFeatureAttachObservable.clear(); + this.onFeatureDetachObservable.clear(); } /** - * Gets the target max input component + * This function will be executed during before enabling the feature and can be used to not-allow enabling it. + * Note that at this point the session has NOT started, so this is purely checking if the browser supports it + * + * @returns whether or not the feature is compatible in this environment */ - get targetMax() { - return this._inputs[4]; + isCompatible() { + return true; } /** - * Gets the output component + * This is used to register callbacks that will automatically be removed when detach is called. + * @param observable the observable to which the observer will be attached + * @param callback the callback to register + * @param insertFirst should the callback be executed as soon as it is registered */ - get output() { - return this._outputs[0]; - } - _buildBlock(state) { - super._buildBlock(state); - const output = this._outputs[0]; - const sourceMin = this.sourceMin.isConnected ? this.sourceMin.associatedVariableName : this._writeFloat(this.sourceRange.x); - const sourceMax = this.sourceMax.isConnected ? this.sourceMax.associatedVariableName : this._writeFloat(this.sourceRange.y); - const targetMin = this.targetMin.isConnected ? this.targetMin.associatedVariableName : this._writeFloat(this.targetRange.x); - const targetMax = this.targetMax.isConnected ? this.targetMax.associatedVariableName : this._writeFloat(this.targetRange.y); - state.compilationString += this._declareOutput(output, state) + ` = ${targetMin} + (${this._inputs[0].associatedVariableName} - ${sourceMin}) * (${targetMax} - ${targetMin}) / (${sourceMax} - ${sourceMin}); -`; - return this; - } - _dumpPropertiesCode() { - let codeString = super._dumpPropertiesCode() + `${this._codeVariableName}.sourceRange = new BABYLON.Vector2(${this.sourceRange.x}, ${this.sourceRange.y}); -`; - codeString += `${this._codeVariableName}.targetRange = new BABYLON.Vector2(${this.targetRange.x}, ${this.targetRange.y}); -`; - return codeString; - } - serialize() { - const serializationObject = super.serialize(); - serializationObject.sourceRange = this.sourceRange.asArray(); - serializationObject.targetRange = this.targetRange.asArray(); - return serializationObject; - } - _deserialize(serializationObject, scene, rootUrl) { - super._deserialize(serializationObject, scene, rootUrl); - this.sourceRange = Vector2.FromArray(serializationObject.sourceRange); - this.targetRange = Vector2.FromArray(serializationObject.targetRange); + _addNewAttachObserver(observable, callback, insertFirst) { + this._removeOnDetach.push({ + observable, + observer: observable.add(callback, void 0, insertFirst) + }); } }; -__decorate([ - editableInPropertyPage("From", PropertyTypeForEdition.Vector2) -], RemapBlock.prototype, "sourceRange", void 0); -__decorate([ - editableInPropertyPage("To", PropertyTypeForEdition.Vector2) -], RemapBlock.prototype, "targetRange", void 0); -RegisterClass("BABYLON.RemapBlock", RemapBlock); -// node_modules/@babylonjs/core/Materials/Node/Blocks/baseMathBlock.js -var BaseMathBlock = class extends NodeMaterialBlock { - constructor(name69) { - super(name69, NodeMaterialBlockTargets.Neutral); - this.registerInput("left", NodeMaterialBlockConnectionPointTypes.AutoDetect); - this.registerInput("right", NodeMaterialBlockConnectionPointTypes.AutoDetect); - this.registerOutput("output", NodeMaterialBlockConnectionPointTypes.BasedOnInput); - this.output._typeConnectionSource = this.left; - this._linkConnectionTypes(0, 1, true); - this.left.acceptedConnectionPointTypes.push(NodeMaterialBlockConnectionPointTypes.Float); - this.right.acceptedConnectionPointTypes.push(NodeMaterialBlockConnectionPointTypes.Float); - this._connectionObservers = [ - this.left.onConnectionObservable.add(() => this._updateInputOutputTypes()), - this.left.onDisconnectionObservable.add(() => this._updateInputOutputTypes()), - this.right.onConnectionObservable.add(() => this._updateInputOutputTypes()), - this.right.onDisconnectionObservable.add(() => this._updateInputOutputTypes()) - ]; +// node_modules/@babylonjs/core/Physics/v1/physicsJoint.js +var PhysicsJoint = class { + /** + * Initializes the physics joint + * @param type The type of the physics joint + * @param jointData The data for the physics joint + */ + constructor(type, jointData) { + this.type = type; + this.jointData = jointData; + jointData.nativeParams = jointData.nativeParams || {}; } /** - * Gets the left operand input component + * Gets the physics joint */ - get left() { - return this._inputs[0]; + get physicsJoint() { + return this._physicsJoint; } /** - * Gets the right operand input component + * Sets the physics joint */ - get right() { - return this._inputs[1]; + set physicsJoint(newJoint) { + if (this._physicsJoint) { + } + this._physicsJoint = newJoint; } /** - * Gets the output component + * Sets the physics plugin */ - get output() { - return this._outputs[0]; - } - _updateInputOutputTypes() { - this.output._typeConnectionSource = this.left; - if (this.left.isConnected && this.right.isConnected) { - if (this.left.type === NodeMaterialBlockConnectionPointTypes.Int || this.left.type === NodeMaterialBlockConnectionPointTypes.Float && this.right.type !== NodeMaterialBlockConnectionPointTypes.Int) { - this.output._typeConnectionSource = this.right; - } - } else if (this.left.isConnected !== this.right.isConnected) { - this.output._typeConnectionSource = this.left.isConnected ? this.left : this.right; - } - if (this.left.isConnected || this.right.isConnected) { - for (const [first, second] of [ - [this.left, this.right], - [this.right, this.left] - ]) { - first.acceptedConnectionPointTypes = [NodeMaterialBlockConnectionPointTypes.Int, NodeMaterialBlockConnectionPointTypes.Float]; - if (second.isConnected) { - first.acceptedConnectionPointTypes.push(second.type); - if (second.type === NodeMaterialBlockConnectionPointTypes.Int || second.type === NodeMaterialBlockConnectionPointTypes.Float) { - first.acceptedConnectionPointTypes.push(NodeMaterialBlockConnectionPointTypes.Vector2, NodeMaterialBlockConnectionPointTypes.Vector3, NodeMaterialBlockConnectionPointTypes.Vector4, NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockConnectionPointTypes.Matrix); - } - } - } - } + set physicsPlugin(physicsPlugin) { + this._physicsPlugin = physicsPlugin; } /** - * Release resources + * Execute a function that is physics-plugin specific. + * @param {Function} func the function that will be executed. + * It accepts two parameters: the physics world and the physics joint */ - dispose() { - super.dispose(); - this._connectionObservers.forEach((observer2) => observer2.remove()); - this._connectionObservers.length = 0; + executeNativeFunction(func) { + func(this._physicsPlugin.world, this._physicsJoint); } }; - -// node_modules/@babylonjs/core/Materials/Node/Blocks/multiplyBlock.js -var MultiplyBlock = class extends BaseMathBlock { +PhysicsJoint.DistanceJoint = 0; +PhysicsJoint.HingeJoint = 1; +PhysicsJoint.BallAndSocketJoint = 2; +PhysicsJoint.WheelJoint = 3; +PhysicsJoint.SliderJoint = 4; +PhysicsJoint.PrismaticJoint = 5; +PhysicsJoint.UniversalJoint = 6; +PhysicsJoint.Hinge2Joint = PhysicsJoint.WheelJoint; +PhysicsJoint.PointToPointJoint = 8; +PhysicsJoint.SpringJoint = 9; +PhysicsJoint.LockJoint = 10; +var DistanceJoint = class extends PhysicsJoint { /** - * Creates a new MultiplyBlock - * @param name defines the block name + * + * @param jointData The data for the Distance-Joint */ - constructor(name69) { - super(name69); + constructor(jointData) { + super(PhysicsJoint.DistanceJoint, jointData); } /** - * Gets the current class name - * @returns the class name + * Update the predefined distance. + * @param maxDistance The maximum preferred distance + * @param minDistance The minimum preferred distance */ - getClassName() { - return "MultiplyBlock"; - } - _buildBlock(state) { - super._buildBlock(state); - state.compilationString += this._declareOutput(this.output, state) + ` = ${this.left.associatedVariableName} * ${this.right.associatedVariableName}; -`; - return this; - } -}; -RegisterClass("BABYLON.MultiplyBlock", MultiplyBlock); - -// node_modules/@babylonjs/core/Materials/Node/Enums/nodeMaterialModes.js -var NodeMaterialModes; -(function(NodeMaterialModes2) { - NodeMaterialModes2[NodeMaterialModes2["Material"] = 0] = "Material"; - NodeMaterialModes2[NodeMaterialModes2["PostProcess"] = 1] = "PostProcess"; - NodeMaterialModes2[NodeMaterialModes2["Particle"] = 2] = "Particle"; - NodeMaterialModes2[NodeMaterialModes2["ProceduralTexture"] = 3] = "ProceduralTexture"; -})(NodeMaterialModes || (NodeMaterialModes = {})); - -// node_modules/@babylonjs/core/Materials/imageProcessingConfiguration.defines.js -var ImageProcessingConfigurationDefines = class extends MaterialDefines { - constructor() { - super(); - this.IMAGEPROCESSING = false; - this.VIGNETTE = false; - this.VIGNETTEBLENDMODEMULTIPLY = false; - this.VIGNETTEBLENDMODEOPAQUE = false; - this.TONEMAPPING = false; - this.TONEMAPPING_ACES = false; - this.CONTRAST = false; - this.COLORCURVES = false; - this.COLORGRADING = false; - this.COLORGRADING3D = false; - this.SAMPLER3DGREENDEPTH = false; - this.SAMPLER3DBGRMAP = false; - this.DITHER = false; - this.IMAGEPROCESSINGPOSTPROCESS = false; - this.EXPOSURE = false; - this.SKIPFINALCOLORCLAMP = false; - this.rebuild(); + updateDistance(maxDistance, minDistance) { + this._physicsPlugin.updateDistanceJoint(this, maxDistance, minDistance); } }; - -// node_modules/@babylonjs/core/Particles/baseParticleSystem.js -var BaseParticleSystem = class _BaseParticleSystem { +var MotorEnabledJoint = class extends PhysicsJoint { /** - * Gets or sets a texture used to add random noise to particle positions + * Initializes the Motor-Enabled Joint + * @param type The type of the joint + * @param jointData The physical joint data for the joint */ - get noiseTexture() { - return this._noiseTexture; - } - set noiseTexture(value) { - if (this._noiseTexture === value) { - return; - } - this._noiseTexture = value; - this._reset(); + constructor(type, jointData) { + super(type, jointData); } /** - * Gets or sets whether an animation sprite sheet is enabled or not on the particle system + * Set the motor values. + * Attention, this function is plugin specific. Engines won't react 100% the same. + * @param force the force to apply + * @param maxForce max force for this motor. */ - get isAnimationSheetEnabled() { - return this._isAnimationSheetEnabled; - } - set isAnimationSheetEnabled(value) { - if (this._isAnimationSheetEnabled == value) { - return; - } - this._isAnimationSheetEnabled = value; - this._reset(); + setMotor(force, maxForce) { + this._physicsPlugin.setMotor(this, force || 0, maxForce); } /** - * Gets or sets a boolean enabling the use of logarithmic depth buffers, which is good for wide depth buffers. + * Set the motor's limits. + * Attention, this function is plugin specific. Engines won't react 100% the same. + * @param upperLimit The upper limit of the motor + * @param lowerLimit The lower limit of the motor */ - get useLogarithmicDepth() { - return this._useLogarithmicDepth; - } - set useLogarithmicDepth(value) { - this._useLogarithmicDepth = value && this.getScene().getEngine().getCaps().fragmentDepthSupported; + setLimit(upperLimit, lowerLimit) { + this._physicsPlugin.setLimit(this, upperLimit, lowerLimit); } +}; +var HingeJoint = class extends MotorEnabledJoint { /** - * Get hosting scene - * @returns the scene + * Initializes the Hinge-Joint + * @param jointData The joint data for the Hinge-Joint */ - getScene() { - return this._scene; - } - _hasTargetStopDurationDependantGradient() { - return this._startSizeGradients && this._startSizeGradients.length > 0 || this._emitRateGradients && this._emitRateGradients.length > 0 || this._lifeTimeGradients && this._lifeTimeGradients.length > 0; + constructor(jointData) { + super(PhysicsJoint.HingeJoint, jointData); } /** - * Gets the current list of drag gradients. - * You must use addDragGradient and removeDragGradient to update this list - * @returns the list of drag gradients + * Set the motor values. + * Attention, this function is plugin specific. Engines won't react 100% the same. + * @param {number} force the force to apply + * @param {number} maxForce max force for this motor. */ - getDragGradients() { - return this._dragGradients; + setMotor(force, maxForce) { + this._physicsPlugin.setMotor(this, force || 0, maxForce); } /** - * Gets the current list of limit velocity gradients. - * You must use addLimitVelocityGradient and removeLimitVelocityGradient to update this list - * @returns the list of limit velocity gradients + * Set the motor's limits. + * Attention, this function is plugin specific. Engines won't react 100% the same. + * @param upperLimit The upper limit of the motor + * @param lowerLimit The lower limit of the motor */ - getLimitVelocityGradients() { - return this._limitVelocityGradients; + setLimit(upperLimit, lowerLimit) { + this._physicsPlugin.setLimit(this, upperLimit, lowerLimit); } +}; +var Hinge2Joint = class extends MotorEnabledJoint { /** - * Gets the current list of color gradients. - * You must use addColorGradient and removeColorGradient to update this list - * @returns the list of color gradients + * Initializes the Hinge2-Joint + * @param jointData The joint data for the Hinge2-Joint */ - getColorGradients() { - return this._colorGradients; + constructor(jointData) { + super(PhysicsJoint.Hinge2Joint, jointData); } /** - * Gets the current list of size gradients. - * You must use addSizeGradient and removeSizeGradient to update this list - * @returns the list of size gradients + * Set the motor values. + * Attention, this function is plugin specific. Engines won't react 100% the same. + * @param targetSpeed the speed the motor is to reach + * @param maxForce max force for this motor. + * @param motorIndex motor's index, 0 or 1. */ - getSizeGradients() { - return this._sizeGradients; + setMotor(targetSpeed, maxForce, motorIndex = 0) { + this._physicsPlugin.setMotor(this, targetSpeed || 0, maxForce, motorIndex); } /** - * Gets the current list of color remap gradients. - * You must use addColorRemapGradient and removeColorRemapGradient to update this list - * @returns the list of color remap gradients + * Set the motor limits. + * Attention, this function is plugin specific. Engines won't react 100% the same. + * @param upperLimit the upper limit + * @param lowerLimit lower limit + * @param motorIndex the motor's index, 0 or 1. */ - getColorRemapGradients() { - return this._colorRemapGradients; + setLimit(upperLimit, lowerLimit, motorIndex = 0) { + this._physicsPlugin.setLimit(this, upperLimit, lowerLimit, motorIndex); } +}; + +// node_modules/@babylonjs/core/Physics/v1/physicsImpostor.js +Mesh._PhysicsImpostorParser = function(scene, physicObject, jsonObject) { + return new PhysicsImpostor(physicObject, jsonObject.physicsImpostor, { + mass: jsonObject.physicsMass, + friction: jsonObject.physicsFriction, + restitution: jsonObject.physicsRestitution + }, scene); +}; +var PhysicsImpostor = class _PhysicsImpostor { /** - * Gets the current list of alpha remap gradients. - * You must use addAlphaRemapGradient and removeAlphaRemapGradient to update this list - * @returns the list of alpha remap gradients + * Specifies if the physics imposter is disposed */ - getAlphaRemapGradients() { - return this._alphaRemapGradients; + get isDisposed() { + return this._isDisposed; } /** - * Gets the current list of life time gradients. - * You must use addLifeTimeGradient and removeLifeTimeGradient to update this list - * @returns the list of life time gradients + * Gets the mass of the physics imposter */ - getLifeTimeGradients() { - return this._lifeTimeGradients; + get mass() { + return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyMass(this) : 0; } - /** - * Gets the current list of angular speed gradients. - * You must use addAngularSpeedGradient and removeAngularSpeedGradient to update this list - * @returns the list of angular speed gradients - */ - getAngularSpeedGradients() { - return this._angularSpeedGradients; + set mass(value) { + this.setMass(value); } /** - * Gets the current list of velocity gradients. - * You must use addVelocityGradient and removeVelocityGradient to update this list - * @returns the list of velocity gradients + * Gets the coefficient of friction */ - getVelocityGradients() { - return this._velocityGradients; + get friction() { + return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyFriction(this) : 0; } /** - * Gets the current list of start size gradients. - * You must use addStartSizeGradient and removeStartSizeGradient to update this list - * @returns the list of start size gradients + * Sets the coefficient of friction */ - getStartSizeGradients() { - return this._startSizeGradients; + set friction(value) { + if (!this._physicsEngine) { + return; + } + this._physicsEngine.getPhysicsPlugin().setBodyFriction(this, value); } /** - * Gets the current list of emit rate gradients. - * You must use addEmitRateGradient and removeEmitRateGradient to update this list - * @returns the list of emit rate gradients + * Gets the coefficient of restitution */ - getEmitRateGradients() { - return this._emitRateGradients; + get restitution() { + return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyRestitution(this) : 0; } /** - * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors. - * This only works when particleEmitterTyps is a BoxParticleEmitter + * Sets the coefficient of restitution */ - get direction1() { - if (this.particleEmitterType.direction1) { - return this.particleEmitterType.direction1; - } - return Vector3.Zero(); - } - set direction1(value) { - if (this.particleEmitterType.direction1) { - this.particleEmitterType.direction1 = value; + set restitution(value) { + if (!this._physicsEngine) { + return; } + this._physicsEngine.getPhysicsPlugin().setBodyRestitution(this, value); } /** - * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors. - * This only works when particleEmitterTyps is a BoxParticleEmitter + * Gets the pressure of a soft body; only supported by the AmmoJSPlugin */ - get direction2() { - if (this.particleEmitterType.direction2) { - return this.particleEmitterType.direction2; + get pressure() { + if (!this._physicsEngine) { + return 0; } - return Vector3.Zero(); - } - set direction2(value) { - if (this.particleEmitterType.direction2) { - this.particleEmitterType.direction2 = value; + const plugin = this._physicsEngine.getPhysicsPlugin(); + if (!plugin.setBodyPressure) { + return 0; } + return plugin.getBodyPressure(this); } /** - * Minimum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so. - * This only works when particleEmitterTyps is a BoxParticleEmitter + * Sets the pressure of a soft body; only supported by the AmmoJSPlugin */ - get minEmitBox() { - if (this.particleEmitterType.minEmitBox) { - return this.particleEmitterType.minEmitBox; + set pressure(value) { + if (!this._physicsEngine) { + return; } - return Vector3.Zero(); - } - set minEmitBox(value) { - if (this.particleEmitterType.minEmitBox) { - this.particleEmitterType.minEmitBox = value; + const plugin = this._physicsEngine.getPhysicsPlugin(); + if (!plugin.setBodyPressure) { + return; } + plugin.setBodyPressure(this, value); } /** - * Maximum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so. - * This only works when particleEmitterTyps is a BoxParticleEmitter + * Gets the stiffness of a soft body; only supported by the AmmoJSPlugin */ - get maxEmitBox() { - if (this.particleEmitterType.maxEmitBox) { - return this.particleEmitterType.maxEmitBox; + get stiffness() { + if (!this._physicsEngine) { + return 0; } - return Vector3.Zero(); - } - set maxEmitBox(value) { - if (this.particleEmitterType.maxEmitBox) { - this.particleEmitterType.maxEmitBox = value; + const plugin = this._physicsEngine.getPhysicsPlugin(); + if (!plugin.getBodyStiffness) { + return 0; } + return plugin.getBodyStiffness(this); } /** - * Gets or sets the billboard mode to use when isBillboardBased = true. - * Value can be: ParticleSystem.BILLBOARDMODE_ALL, ParticleSystem.BILLBOARDMODE_Y, ParticleSystem.BILLBOARDMODE_STRETCHED + * Sets the stiffness of a soft body; only supported by the AmmoJSPlugin */ - get billboardMode() { - return this._billboardMode; - } - set billboardMode(value) { - if (this._billboardMode === value) { + set stiffness(value) { + if (!this._physicsEngine) { return; } - this._billboardMode = value; - this._reset(); - } - /** - * Gets or sets a boolean indicating if the particles must be rendered as billboard or aligned with the direction - */ - get isBillboardBased() { - return this._isBillboardBased; - } - set isBillboardBased(value) { - if (this._isBillboardBased === value) { + const plugin = this._physicsEngine.getPhysicsPlugin(); + if (!plugin.setBodyStiffness) { return; } - this._isBillboardBased = value; - this._reset(); + plugin.setBodyStiffness(this, value); } /** - * Gets the image processing configuration used either in this material. + * Gets the velocityIterations of a soft body; only supported by the AmmoJSPlugin */ - get imageProcessingConfiguration() { - return this._imageProcessingConfiguration; + get velocityIterations() { + if (!this._physicsEngine) { + return 0; + } + const plugin = this._physicsEngine.getPhysicsPlugin(); + if (!plugin.getBodyVelocityIterations) { + return 0; + } + return plugin.getBodyVelocityIterations(this); } /** - * Sets the Default image processing configuration used either in the this material. - * - * If sets to null, the scene one is in use. + * Sets the velocityIterations of a soft body; only supported by the AmmoJSPlugin */ - set imageProcessingConfiguration(value) { - this._attachImageProcessingConfiguration(value); + set velocityIterations(value) { + if (!this._physicsEngine) { + return; + } + const plugin = this._physicsEngine.getPhysicsPlugin(); + if (!plugin.setBodyVelocityIterations) { + return; + } + plugin.setBodyVelocityIterations(this, value); } /** - * Attaches a new image processing configuration to the Standard Material. - * @param configuration + * Gets the positionIterations of a soft body; only supported by the AmmoJSPlugin */ - _attachImageProcessingConfiguration(configuration) { - if (configuration === this._imageProcessingConfiguration) { - return; + get positionIterations() { + if (!this._physicsEngine) { + return 0; } - if (!configuration && this._scene) { - this._imageProcessingConfiguration = this._scene.imageProcessingConfiguration; - } else { - this._imageProcessingConfiguration = configuration; + const plugin = this._physicsEngine.getPhysicsPlugin(); + if (!plugin.getBodyPositionIterations) { + return 0; } - } - /** @internal */ - _reset() { + return plugin.getBodyPositionIterations(this); } /** - * @internal + * Sets the positionIterations of a soft body; only supported by the AmmoJSPlugin */ - _removeGradientAndTexture(gradient, gradients, texture) { - if (!gradients) { - return this; - } - let index = 0; - for (const valueGradient of gradients) { - if (valueGradient.gradient === gradient) { - gradients.splice(index, 1); - break; - } - index++; + set positionIterations(value) { + if (!this._physicsEngine) { + return; } - if (texture) { - texture.dispose(); + const plugin = this._physicsEngine.getPhysicsPlugin(); + if (!plugin.setBodyPositionIterations) { + return; } - return this; + plugin.setBodyPositionIterations(this, value); } /** - * Instantiates a particle system. - * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust. - * @param name The name of the particle system + * Initializes the physics imposter + * @param object The physics-enabled object used as the physics imposter + * @param type The type of the physics imposter. Types are available as static members of this class. + * @param _options The options for the physics imposter + * @param _scene The Babylon scene */ - constructor(name69) { - this.animations = []; - this.renderingGroupId = 0; - this.emitter = Vector3.Zero(); - this.emitRate = 10; - this.manualEmitCount = -1; - this.updateSpeed = 0.01; - this.targetStopDuration = 0; - this.disposeOnStop = false; - this.minEmitPower = 1; - this.maxEmitPower = 1; - this.minLifeTime = 1; - this.maxLifeTime = 1; - this.minSize = 1; - this.maxSize = 1; - this.minScaleX = 1; - this.maxScaleX = 1; - this.minScaleY = 1; - this.maxScaleY = 1; - this.minInitialRotation = 0; - this.maxInitialRotation = 0; - this.minAngularSpeed = 0; - this.maxAngularSpeed = 0; - this.layerMask = 268435455; - this.customShader = null; - this.preventAutoStart = false; - this.applyFog = false; - this._wasDispatched = false; - this._rootUrl = ""; - this.noiseStrength = new Vector3(10, 10, 10); - this.onAnimationEnd = null; - this.blendMode = _BaseParticleSystem.BLENDMODE_ONEONE; - this.forceDepthWrite = false; - this.preWarmCycles = 0; - this.preWarmStepOffset = 1; - this.spriteCellChangeSpeed = 1; - this.startSpriteCellID = 0; - this.endSpriteCellID = 0; - this.spriteCellWidth = 0; - this.spriteCellHeight = 0; - this.spriteCellLoop = true; - this.spriteRandomStartCell = false; - this.translationPivot = new Vector2(0, 0); - this.beginAnimationOnStart = false; - this.beginAnimationFrom = 0; - this.beginAnimationTo = 60; - this.beginAnimationLoop = false; - this.worldOffset = new Vector3(0, 0, 0); - this._useLogarithmicDepth = false; - this.gravity = Vector3.Zero(); - this._colorGradients = null; - this._sizeGradients = null; - this._lifeTimeGradients = null; - this._angularSpeedGradients = null; - this._velocityGradients = null; - this._limitVelocityGradients = null; - this._dragGradients = null; - this._emitRateGradients = null; - this._startSizeGradients = null; - this._rampGradients = null; - this._colorRemapGradients = null; - this._alphaRemapGradients = null; - this.startDelay = 0; - this.limitVelocityDamping = 0.4; - this.color1 = new Color4(1, 1, 1, 1); - this.color2 = new Color4(1, 1, 1, 1); - this.colorDead = new Color4(0, 0, 0, 1); - this.textureMask = new Color4(1, 1, 1, 1); - this._isSubEmitter = false; - this._billboardMode = 7; - this._isBillboardBased = true; - this._imageProcessingConfigurationDefines = new ImageProcessingConfigurationDefines(); - this.id = name69; - this.name = name69; + constructor(object, type, _options = { mass: 0 }, _scene) { + this.object = object; + this.type = type; + this._options = _options; + this._scene = _scene; + this._pluginData = {}; + this._bodyUpdateRequired = false; + this._onBeforePhysicsStepCallbacks = new Array(); + this._onAfterPhysicsStepCallbacks = new Array(); + this._onPhysicsCollideCallbacks = []; + this._deltaPosition = Vector3.Zero(); + this._isDisposed = false; + this.soft = false; + this.segments = 0; + this._tmpQuat = new Quaternion(); + this._tmpQuat2 = new Quaternion(); + this.beforeStep = () => { + if (!this._physicsEngine) { + return; + } + this.object.translate(this._deltaPosition, -1); + this._deltaRotationConjugated && this.object.rotationQuaternion && this.object.rotationQuaternion.multiplyToRef(this._deltaRotationConjugated, this.object.rotationQuaternion); + this.object.computeWorldMatrix(false); + if (this.object.parent && this.object.rotationQuaternion) { + this.getParentsRotation(); + this._tmpQuat.multiplyToRef(this.object.rotationQuaternion, this._tmpQuat); + } else { + this._tmpQuat.copyFrom(this.object.rotationQuaternion || new Quaternion()); + } + if (!this._options.disableBidirectionalTransformation) { + this.object.rotationQuaternion && this._physicsEngine.getPhysicsPlugin().setPhysicsBodyTransformation( + this, + /*bInfo.boundingBox.centerWorld*/ + this.object.getAbsolutePosition(), + this._tmpQuat + ); + } + this._onBeforePhysicsStepCallbacks.forEach((func) => { + func(this); + }); + }; + this.afterStep = () => { + if (!this._physicsEngine) { + return; + } + this._onAfterPhysicsStepCallbacks.forEach((func) => { + func(this); + }); + this._physicsEngine.getPhysicsPlugin().setTransformationFromPhysicsBody(this); + if (this.object.parent && this.object.rotationQuaternion) { + this.getParentsRotation(); + this._tmpQuat.conjugateInPlace(); + this._tmpQuat.multiplyToRef(this.object.rotationQuaternion, this.object.rotationQuaternion); + } + this.object.setAbsolutePosition(this.object.position); + if (this._deltaRotation) { + this.object.rotationQuaternion && this.object.rotationQuaternion.multiplyToRef(this._deltaRotation, this.object.rotationQuaternion); + this._deltaPosition.applyRotationQuaternionToRef(this._deltaRotation, _PhysicsImpostor._TmpVecs[0]); + this.object.translate(_PhysicsImpostor._TmpVecs[0], 1); + } else { + this.object.translate(this._deltaPosition, 1); + } + this.object.computeWorldMatrix(true); + }; + this.onCollideEvent = null; + this.onCollide = (e) => { + if (!this._onPhysicsCollideCallbacks.length && !this.onCollideEvent) { + return; + } + if (!this._physicsEngine) { + return; + } + const otherImpostor = this._physicsEngine.getImpostorWithPhysicsBody(e.body); + if (otherImpostor) { + if (this.onCollideEvent) { + this.onCollideEvent(this, otherImpostor); + } + this._onPhysicsCollideCallbacks.filter((obj) => { + return obj.otherImpostors.indexOf(otherImpostor) !== -1; + }).forEach((obj) => { + obj.callback(this, otherImpostor, e.point, e.distance, e.impulse, e.normal); + }); + } + }; + if (!this.object) { + Logger.Error("No object was provided. A physics object is obligatory"); + return; + } + if (this.object.parent && _options.mass !== 0) { + Logger.Warn("A physics impostor has been created for an object which has a parent. Babylon physics currently works in local space so unexpected issues may occur."); + } + if (!this._scene && object.getScene) { + this._scene = object.getScene(); + } + if (!this._scene) { + return; + } + if (this.type > 100) { + this.soft = true; + } + this._physicsEngine = this._scene.getPhysicsEngine(); + if (!this._physicsEngine) { + Logger.Error("Physics not enabled. Please use scene.enablePhysics(...) before creating impostors."); + } else { + if (!this.object.rotationQuaternion) { + if (this.object.rotation) { + this.object.rotationQuaternion = Quaternion.RotationYawPitchRoll(this.object.rotation.y, this.object.rotation.x, this.object.rotation.z); + } else { + this.object.rotationQuaternion = new Quaternion(); + } + } + this._options.mass = _options.mass === void 0 ? 0 : _options.mass; + this._options.friction = _options.friction === void 0 ? 0.2 : _options.friction; + this._options.restitution = _options.restitution === void 0 ? 0.2 : _options.restitution; + if (this.soft) { + this._options.mass = this._options.mass > 0 ? this._options.mass : 1; + this._options.pressure = _options.pressure === void 0 ? 200 : _options.pressure; + this._options.stiffness = _options.stiffness === void 0 ? 1 : _options.stiffness; + this._options.velocityIterations = _options.velocityIterations === void 0 ? 20 : _options.velocityIterations; + this._options.positionIterations = _options.positionIterations === void 0 ? 20 : _options.positionIterations; + this._options.fixedPoints = _options.fixedPoints === void 0 ? 0 : _options.fixedPoints; + this._options.margin = _options.margin === void 0 ? 0 : _options.margin; + this._options.damping = _options.damping === void 0 ? 0 : _options.damping; + this._options.path = _options.path === void 0 ? null : _options.path; + this._options.shape = _options.shape === void 0 ? null : _options.shape; + } + this._joints = []; + if (!this.object.parent || this._options.ignoreParent) { + this._init(); + } else if (this.object.parent.physicsImpostor) { + Logger.Warn("You must affect impostors to children before affecting impostor to parent."); + } + } } /** - * Creates a Point Emitter for the particle system (emits directly from the emitter position) - * @param direction1 Particles are emitted between the direction1 and direction2 from within the box - * @param direction2 Particles are emitted between the direction1 and direction2 from within the box + * This function will completely initialize this impostor. + * It will create a new body - but only if this mesh has no parent. + * If it has, this impostor will not be used other than to define the impostor + * of the child mesh. + * @internal */ - createPointEmitter(direction1, direction2) { - throw new Error("Method not implemented."); + _init() { + if (!this._physicsEngine) { + return; + } + this._physicsEngine.removeImpostor(this); + this.physicsBody = null; + this._parent = this._parent || this._getPhysicsParent(); + if (!this._isDisposed && (!this.parent || this._options.ignoreParent)) { + this._physicsEngine.addImpostor(this); + } } - /** - * Creates a Hemisphere Emitter for the particle system (emits along the hemisphere radius) - * @param radius The radius of the hemisphere to emit from - * @param radiusRange The range of the hemisphere to emit from [0-1] 0 Surface Only, 1 Entire Radius - */ - createHemisphericEmitter(radius = 1, radiusRange = 1) { - throw new Error("Method not implemented."); + _getPhysicsParent() { + if (this.object.parent instanceof AbstractMesh) { + const parentMesh = this.object.parent; + return parentMesh.physicsImpostor; + } + return null; } /** - * Creates a Sphere Emitter for the particle system (emits along the sphere radius) - * @param radius The radius of the sphere to emit from - * @param radiusRange The range of the sphere to emit from [0-1] 0 Surface Only, 1 Entire Radius + * Should a new body be generated. + * @returns boolean specifying if body initialization is required */ - createSphereEmitter(radius = 1, radiusRange = 1) { - throw new Error("Method not implemented."); + isBodyInitRequired() { + return this._bodyUpdateRequired || !this._physicsBody && (!this._parent || !!this._options.ignoreParent); } /** - * Creates a Directed Sphere Emitter for the particle system (emits between direction1 and direction2) - * @param radius The radius of the sphere to emit from - * @param direction1 Particles are emitted between the direction1 and direction2 from within the sphere - * @param direction2 Particles are emitted between the direction1 and direction2 from within the sphere + * Sets the updated scaling */ - createDirectedSphereEmitter(radius = 1, direction1 = new Vector3(0, 1, 0), direction2 = new Vector3(0, 1, 0)) { - throw new Error("Method not implemented."); + setScalingUpdated() { + this.forceUpdate(); } /** - * Creates a Cylinder Emitter for the particle system (emits from the cylinder to the particle position) - * @param radius The radius of the emission cylinder - * @param height The height of the emission cylinder - * @param radiusRange The range of emission [0-1] 0 Surface only, 1 Entire Radius - * @param directionRandomizer How much to randomize the particle direction [0-1] + * Force a regeneration of this or the parent's impostor's body. + * Use with caution - This will remove all previously-instantiated joints. */ - createCylinderEmitter(radius = 1, height = 1, radiusRange = 1, directionRandomizer = 0) { - throw new Error("Method not implemented."); + forceUpdate() { + this._init(); + if (this.parent && !this._options.ignoreParent) { + this.parent.forceUpdate(); + } } + /*public get mesh(): AbstractMesh { + return this._mesh; + }*/ /** - * Creates a Directed Cylinder Emitter for the particle system (emits between direction1 and direction2) - * @param radius The radius of the cylinder to emit from - * @param height The height of the emission cylinder - * @param radiusRange the range of the emission cylinder [0-1] 0 Surface only, 1 Entire Radius (1 by default) - * @param direction1 Particles are emitted between the direction1 and direction2 from within the cylinder - * @param direction2 Particles are emitted between the direction1 and direction2 from within the cylinder + * Gets the body that holds this impostor. Either its own, or its parent. */ - createDirectedCylinderEmitter(radius = 1, height = 1, radiusRange = 1, direction1 = new Vector3(0, 1, 0), direction2 = new Vector3(0, 1, 0)) { - throw new Error("Method not implemented."); + get physicsBody() { + return this._parent && !this._options.ignoreParent ? this._parent.physicsBody : this._physicsBody; } /** - * Creates a Cone Emitter for the particle system (emits from the cone to the particle position) - * @param radius The radius of the cone to emit from - * @param angle The base angle of the cone + * Get the parent of the physics imposter + * @returns Physics imposter or null */ - createConeEmitter(radius = 1, angle = Math.PI / 4) { - throw new Error("Method not implemented."); + get parent() { + return !this._options.ignoreParent && this._parent ? this._parent : null; } /** - * Creates a Box Emitter for the particle system. (emits between direction1 and direction2 from withing the box defined by minEmitBox and maxEmitBox) - * @param direction1 Particles are emitted between the direction1 and direction2 from within the box - * @param direction2 Particles are emitted between the direction1 and direction2 from within the box - * @param minEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox - * @param maxEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox + * Sets the parent of the physics imposter */ - createBoxEmitter(direction1, direction2, minEmitBox, maxEmitBox) { - throw new Error("Method not implemented."); + set parent(value) { + this._parent = value; } -}; -BaseParticleSystem.BLENDMODE_ONEONE = 0; -BaseParticleSystem.BLENDMODE_STANDARD = 1; -BaseParticleSystem.BLENDMODE_ADD = 2; -BaseParticleSystem.BLENDMODE_MULTIPLY = 3; -BaseParticleSystem.BLENDMODE_MULTIPLYADD = 4; - -// node_modules/@babylonjs/core/Materials/Node/Blocks/colorSplitterBlock.js -var ColorSplitterBlock = class extends NodeMaterialBlock { /** - * Create a new ColorSplitterBlock - * @param name defines the block name + * Set the physics body. Used mainly by the physics engine/plugin */ - constructor(name69) { - super(name69, NodeMaterialBlockTargets.Neutral); - this.registerInput("rgba", NodeMaterialBlockConnectionPointTypes.Color4, true); - this.registerInput("rgb ", NodeMaterialBlockConnectionPointTypes.Color3, true); - this.registerOutput("rgb", NodeMaterialBlockConnectionPointTypes.Color3); - this.registerOutput("r", NodeMaterialBlockConnectionPointTypes.Float); - this.registerOutput("g", NodeMaterialBlockConnectionPointTypes.Float); - this.registerOutput("b", NodeMaterialBlockConnectionPointTypes.Float); - this.registerOutput("a", NodeMaterialBlockConnectionPointTypes.Float); - this.inputsAreExclusive = true; + set physicsBody(physicsBody) { + if (this._physicsBody && this._physicsEngine) { + this._physicsEngine.getPhysicsPlugin().removePhysicsBody(this); + } + this._physicsBody = physicsBody; + this.resetUpdateFlags(); } /** - * Gets the current class name - * @returns the class name + * Resets the update flags */ - getClassName() { - return "ColorSplitterBlock"; + resetUpdateFlags() { + this._bodyUpdateRequired = false; } /** - * Gets the rgba component (input) + * Gets the object extents + * @returns the object extents */ - get rgba() { - return this._inputs[0]; + getObjectExtents() { + if (this.object.getBoundingInfo) { + const q = this.object.rotationQuaternion; + const scaling = this.object.scaling.clone(); + this.object.rotationQuaternion = _PhysicsImpostor.IDENTITY_QUATERNION; + const worldMatrix = this.object.computeWorldMatrix && this.object.computeWorldMatrix(true); + if (worldMatrix) { + worldMatrix.decompose(scaling, void 0, void 0); + } + const boundingInfo = this.object.getBoundingInfo(); + const size = boundingInfo.boundingBox.extendSize.scale(2).multiplyInPlace(scaling); + size.x = Math.abs(size.x); + size.y = Math.abs(size.y); + size.z = Math.abs(size.z); + this.object.rotationQuaternion = q; + this.object.computeWorldMatrix && this.object.computeWorldMatrix(true); + return size; + } else { + return _PhysicsImpostor.DEFAULT_OBJECT_SIZE; + } } /** - * Gets the rgb component (input) + * Gets the object center + * @returns The object center */ - get rgbIn() { - return this._inputs[1]; + getObjectCenter() { + if (this.object.getBoundingInfo) { + const boundingInfo = this.object.getBoundingInfo(); + return boundingInfo.boundingBox.centerWorld; + } else { + return this.object.position; + } } /** - * Gets the rgb component (output) + * Get a specific parameter from the options parameters + * @param paramName The object parameter name + * @returns The object parameter */ - get rgbOut() { - return this._outputs[0]; + getParam(paramName) { + return this._options[paramName]; } /** - * Gets the r component (output) + * Sets a specific parameter in the options given to the physics plugin + * @param paramName The parameter name + * @param value The value of the parameter */ - get r() { - return this._outputs[1]; + setParam(paramName, value) { + this._options[paramName] = value; + this._bodyUpdateRequired = true; } /** - * Gets the g component (output) + * Specifically change the body's mass. Won't recreate the physics body object + * @param mass The mass of the physics imposter */ - get g() { - return this._outputs[2]; + setMass(mass) { + if (this.getParam("mass") !== mass) { + this.setParam("mass", mass); + } + if (this._physicsEngine) { + this._physicsEngine.getPhysicsPlugin().setBodyMass(this, mass); + } } /** - * Gets the b component (output) + * Gets the linear velocity + * @returns linear velocity or null */ - get b() { - return this._outputs[3]; + getLinearVelocity() { + return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getLinearVelocity(this) : Vector3.Zero(); } /** - * Gets the a component (output) + * Sets the linear velocity + * @param velocity linear velocity or null */ - get a() { - return this._outputs[4]; - } - _inputRename(name69) { - if (name69 === "rgb ") { - return "rgbIn"; - } - return name69; - } - _outputRename(name69) { - if (name69 === "rgb") { - return "rgbOut"; - } - return name69; - } - _buildBlock(state) { - super._buildBlock(state); - const input = this.rgba.isConnected ? this.rgba : this.rgbIn; - if (!input.isConnected) { - return; - } - const rgbOutput = this._outputs[0]; - const rOutput = this._outputs[1]; - const gOutput = this._outputs[2]; - const bOutput = this._outputs[3]; - const aOutput = this._outputs[4]; - if (rgbOutput.hasEndpoints) { - state.compilationString += this._declareOutput(rgbOutput, state) + ` = ${input.associatedVariableName}.rgb; -`; - } - if (rOutput.hasEndpoints) { - state.compilationString += this._declareOutput(rOutput, state) + ` = ${input.associatedVariableName}.r; -`; - } - if (gOutput.hasEndpoints) { - state.compilationString += this._declareOutput(gOutput, state) + ` = ${input.associatedVariableName}.g; -`; - } - if (bOutput.hasEndpoints) { - state.compilationString += this._declareOutput(bOutput, state) + ` = ${input.associatedVariableName}.b; -`; - } - if (aOutput.hasEndpoints) { - state.compilationString += this._declareOutput(aOutput, state) + ` = ${input.associatedVariableName}.a; -`; + setLinearVelocity(velocity) { + if (this._physicsEngine) { + this._physicsEngine.getPhysicsPlugin().setLinearVelocity(this, velocity); } - return this; } -}; -RegisterClass("BABYLON.ColorSplitterBlock", ColorSplitterBlock); - -// node_modules/@babylonjs/core/Materials/effectRenderer.js -var defaultOptions = { - positions: [1, 1, -1, 1, -1, -1, 1, -1], - indices: [0, 1, 2, 0, 2, 3] -}; -var EffectRenderer = class { /** - * Creates an effect renderer - * @param engine the engine to use for rendering - * @param options defines the options of the effect renderer + * Gets the angular velocity + * @returns angular velocity or null */ - constructor(engine, options = defaultOptions) { - this._fullscreenViewport = new Viewport(0, 0, 1, 1); - const positions = options.positions ?? defaultOptions.positions; - const indices = options.indices ?? defaultOptions.indices; - this.engine = engine; - this._vertexBuffers = { - [VertexBuffer.PositionKind]: new VertexBuffer(engine, positions, VertexBuffer.PositionKind, false, false, 2) - }; - this._indexBuffer = engine.createIndexBuffer(indices); - this._onContextRestoredObserver = engine.onContextRestoredObservable.add(() => { - this._indexBuffer = engine.createIndexBuffer(indices); - for (const key in this._vertexBuffers) { - const vertexBuffer = this._vertexBuffers[key]; - vertexBuffer._rebuild(); - } - }); + getAngularVelocity() { + return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getAngularVelocity(this) : Vector3.Zero(); } /** - * Sets the current viewport in normalized coordinates 0-1 - * @param viewport Defines the viewport to set (defaults to 0 0 1 1) + * Sets the angular velocity + * @param velocity The velocity or null */ - setViewport(viewport = this._fullscreenViewport) { - this.engine.setViewport(viewport); + setAngularVelocity(velocity) { + if (this._physicsEngine) { + this._physicsEngine.getPhysicsPlugin().setAngularVelocity(this, velocity); + } } /** - * Binds the embedded attributes buffer to the effect. - * @param effect Defines the effect to bind the attributes for + * Execute a function with the physics plugin native code + * Provide a function the will have two variables - the world object and the physics body object + * @param func The function to execute with the physics plugin native code */ - bindBuffers(effect) { - this.engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect); + executeNativeFunction(func) { + if (this._physicsEngine) { + func(this._physicsEngine.getPhysicsPlugin().world, this.physicsBody); + } } /** - * Sets the current effect wrapper to use during draw. - * The effect needs to be ready before calling this api. - * This also sets the default full screen position attribute. - * @param effectWrapper Defines the effect to draw with + * Register a function that will be executed before the physics world is stepping forward + * @param func The function to execute before the physics world is stepped forward */ - applyEffectWrapper(effectWrapper) { - this.engine.setState(true); - this.engine.depthCullingState.depthTest = false; - this.engine.stencilState.stencilTest = false; - this.engine.enableEffect(effectWrapper._drawWrapper); - this.bindBuffers(effectWrapper.effect); - effectWrapper.onApplyObservable.notifyObservers({}); + registerBeforePhysicsStep(func) { + this._onBeforePhysicsStepCallbacks.push(func); } /** - * Saves engine states + * Unregister a function that will be executed before the physics world is stepping forward + * @param func The function to execute before the physics world is stepped forward */ - saveStates() { - this._savedStateDepthTest = this.engine.depthCullingState.depthTest; - this._savedStateStencilTest = this.engine.stencilState.stencilTest; + unregisterBeforePhysicsStep(func) { + const index = this._onBeforePhysicsStepCallbacks.indexOf(func); + if (index > -1) { + this._onBeforePhysicsStepCallbacks.splice(index, 1); + } else { + Logger.Warn("Function to remove was not found"); + } } /** - * Restores engine states + * Register a function that will be executed after the physics step + * @param func The function to execute after physics step */ - restoreStates() { - this.engine.depthCullingState.depthTest = this._savedStateDepthTest; - this.engine.stencilState.stencilTest = this._savedStateStencilTest; + registerAfterPhysicsStep(func) { + this._onAfterPhysicsStepCallbacks.push(func); } /** - * Draws a full screen quad. + * Unregisters a function that will be executed after the physics step + * @param func The function to execute after physics step */ - draw() { - this.engine.drawElementsType(0, 0, 6); - } - _isRenderTargetTexture(texture) { - return texture.renderTarget !== void 0; + unregisterAfterPhysicsStep(func) { + const index = this._onAfterPhysicsStepCallbacks.indexOf(func); + if (index > -1) { + this._onAfterPhysicsStepCallbacks.splice(index, 1); + } else { + Logger.Warn("Function to remove was not found"); + } } /** - * renders one or more effects to a specified texture - * @param effectWrapper the effect to renderer - * @param outputTexture texture to draw to, if null it will render to the screen. + * register a function that will be executed when this impostor collides against a different body + * @param collideAgainst Physics imposter, or array of physics imposters to collide against + * @param func Callback that is executed on collision */ - render(effectWrapper, outputTexture = null) { - if (!effectWrapper.effect.isReady()) { - return; - } - this.saveStates(); - this.setViewport(); - const out = outputTexture === null ? null : this._isRenderTargetTexture(outputTexture) ? outputTexture.renderTarget : outputTexture; - if (out) { - this.engine.bindFramebuffer(out); - } - this.applyEffectWrapper(effectWrapper); - this.draw(); - if (out) { - this.engine.unBindFramebuffer(out); - } - this.restoreStates(); + registerOnPhysicsCollide(collideAgainst, func) { + const collidedAgainstList = collideAgainst instanceof Array ? collideAgainst : [collideAgainst]; + this._onPhysicsCollideCallbacks.push({ callback: func, otherImpostors: collidedAgainstList }); } /** - * Disposes of the effect renderer + * Unregisters the physics imposter's collision callback + * @param collideAgainst The physics object to collide against + * @param func Callback to execute on collision */ - dispose() { - const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind]; - if (vertexBuffer) { - vertexBuffer.dispose(); - delete this._vertexBuffers[VertexBuffer.PositionKind]; - } - if (this._indexBuffer) { - this.engine._releaseBuffer(this._indexBuffer); - } - if (this._onContextRestoredObserver) { - this.engine.onContextRestoredObservable.remove(this._onContextRestoredObserver); - this._onContextRestoredObserver = null; + unregisterOnPhysicsCollide(collideAgainst, func) { + const collidedAgainstList = collideAgainst instanceof Array ? collideAgainst : [collideAgainst]; + let index = -1; + const found = this._onPhysicsCollideCallbacks.some((cbDef, idx) => { + if (cbDef.callback === func && cbDef.otherImpostors.length === collidedAgainstList.length) { + const sameList = cbDef.otherImpostors.every((impostor) => { + return collidedAgainstList.indexOf(impostor) > -1; + }); + if (sameList) { + index = idx; + } + return sameList; + } + return false; + }); + if (found) { + this._onPhysicsCollideCallbacks.splice(index, 1); + } else { + Logger.Warn("Function to remove was not found"); } } -}; -var EffectWrapper = class { - /** - * The underlying effect - */ - get effect() { - return this._drawWrapper.effect; - } - set effect(effect) { - this._drawWrapper.effect = effect; - } /** - * Creates an effect to be renderer - * @param creationOptions options to create the effect + * Get the parent rotation + * @returns The parent rotation */ - constructor(creationOptions) { - this.onApplyObservable = new Observable(); - let effectCreationOptions; - const uniformNames = creationOptions.uniformNames || []; - if (creationOptions.vertexShader) { - effectCreationOptions = { - fragmentSource: creationOptions.fragmentShader, - vertexSource: creationOptions.vertexShader, - spectorName: creationOptions.name || "effectWrapper" - }; - } else { - uniformNames.push("scale"); - effectCreationOptions = { - fragmentSource: creationOptions.fragmentShader, - vertex: "postprocess", - spectorName: creationOptions.name || "effectWrapper" - }; - this.onApplyObservable.add(() => { - this.effect.setFloat2("scale", 1, 1); - }); - } - const defines = creationOptions.defines ? creationOptions.defines.join("\n") : ""; - this._drawWrapper = new DrawWrapper(creationOptions.engine); - if (creationOptions.useShaderStore) { - effectCreationOptions.fragment = effectCreationOptions.fragmentSource; - if (!effectCreationOptions.vertex) { - effectCreationOptions.vertex = effectCreationOptions.vertexSource; + getParentsRotation() { + let parent = this.object.parent; + this._tmpQuat.copyFromFloats(0, 0, 0, 1); + while (parent) { + if (parent.rotationQuaternion) { + this._tmpQuat2.copyFrom(parent.rotationQuaternion); + } else { + Quaternion.RotationYawPitchRollToRef(parent.rotation.y, parent.rotation.x, parent.rotation.z, this._tmpQuat2); } - delete effectCreationOptions.fragmentSource; - delete effectCreationOptions.vertexSource; - this.effect = creationOptions.engine.createEffect(effectCreationOptions, creationOptions.attributeNames || ["position"], uniformNames, creationOptions.samplerNames, defines, void 0, creationOptions.onCompiled, void 0, void 0, creationOptions.shaderLanguage); - } else { - this.effect = new Effect(effectCreationOptions, creationOptions.attributeNames || ["position"], uniformNames, creationOptions.samplerNames, creationOptions.engine, defines, void 0, creationOptions.onCompiled, void 0, void 0, void 0, creationOptions.shaderLanguage); - this._onContextRestoredObserver = creationOptions.engine.onContextRestoredObservable.add(() => { - this.effect._pipelineContext = null; - this.effect._prepareEffect(); - }); + this._tmpQuat.multiplyToRef(this._tmpQuat2, this._tmpQuat); + parent = parent.parent; } + return this._tmpQuat; } /** - * Disposes of the effect wrapper + * Apply a force + * @param force The force to apply + * @param contactPoint The contact point for the force + * @returns The physics imposter */ - dispose() { - if (this._onContextRestoredObserver) { - this.effect.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver); - this._onContextRestoredObserver = null; + applyForce(force, contactPoint) { + if (this._physicsEngine) { + this._physicsEngine.getPhysicsPlugin().applyForce(this, force, contactPoint); } - this.effect.dispose(); + return this; } -}; - -// node_modules/@babylonjs/core/Shaders/pass.fragment.js -var name2 = "passPixelShader"; -var shader2 = `varying vec2 vUV;uniform sampler2D textureSampler; -#define CUSTOM_FRAGMENT_DEFINITIONS -void main(void) -{gl_FragColor=texture2D(textureSampler,vUV);}`; -ShaderStore.ShadersStore[name2] = shader2; -var passPixelShader = { name: name2, shader: shader2 }; - -// node_modules/@babylonjs/core/Misc/dumpTools.js -var DumpTools = class _DumpTools { - static _CreateDumpRenderer() { - if (!_DumpTools._DumpToolsEngine) { - let canvas; - let engine = null; - const options = { - preserveDrawingBuffer: true, - depth: false, - stencil: false, - alpha: true, - premultipliedAlpha: false, - antialias: false, - failIfMajorPerformanceCaveat: false - }; - try { - canvas = new OffscreenCanvas(100, 100); - engine = new ThinEngine(canvas, false, options); - } catch (e) { - canvas = document.createElement("canvas"); - engine = new ThinEngine(canvas, false, options); - } - engine.getCaps().parallelShaderCompile = void 0; - const renderer = new EffectRenderer(engine); - const wrapper = new EffectWrapper({ - engine, - name: passPixelShader.name, - fragmentShader: passPixelShader.shader, - samplerNames: ["textureSampler"] - }); - _DumpTools._DumpToolsEngine = { - canvas, - engine, - renderer, - wrapper - }; + /** + * Apply an impulse + * @param force The impulse force + * @param contactPoint The contact point for the impulse force + * @returns The physics imposter + */ + applyImpulse(force, contactPoint) { + if (this._physicsEngine) { + this._physicsEngine.getPhysicsPlugin().applyImpulse(this, force, contactPoint); } - return _DumpTools._DumpToolsEngine; + return this; } /** - * Dumps the current bound framebuffer - * @param width defines the rendering width - * @param height defines the rendering height - * @param engine defines the hosting engine - * @param successCallback defines the callback triggered once the data are available - * @param mimeType defines the mime type of the result - * @param fileName defines the filename to download. If present, the result will automatically be downloaded - * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. - * @returns a void promise + * A help function to create a joint + * @param otherImpostor A physics imposter used to create a joint + * @param jointType The type of joint + * @param jointData The data for the joint + * @returns The physics imposter */ - static async DumpFramebuffer(width, height, engine, successCallback, mimeType = "image/png", fileName, quality) { - const bufferView = await engine.readPixels(0, 0, width, height); - const data = new Uint8Array(bufferView.buffer); - _DumpTools.DumpData(width, height, data, successCallback, mimeType, fileName, true, void 0, quality); + createJoint(otherImpostor, jointType, jointData) { + const joint = new PhysicsJoint(jointType, jointData); + this.addJoint(otherImpostor, joint); + return this; } /** - * Dumps an array buffer - * @param width defines the rendering width - * @param height defines the rendering height - * @param data the data array - * @param mimeType defines the mime type of the result - * @param fileName defines the filename to download. If present, the result will automatically be downloaded - * @param invertY true to invert the picture in the Y dimension - * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string - * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. - * @returns a promise that resolve to the final data + * Add a joint to this impostor with a different impostor + * @param otherImpostor A physics imposter used to add a joint + * @param joint The joint to add + * @returns The physics imposter */ - static DumpDataAsync(width, height, data, mimeType = "image/png", fileName, invertY = false, toArrayBuffer = false, quality) { - return new Promise((resolve) => { - _DumpTools.DumpData(width, height, data, (result) => resolve(result), mimeType, fileName, invertY, toArrayBuffer, quality); + addJoint(otherImpostor, joint) { + this._joints.push({ + otherImpostor, + joint }); + if (this._physicsEngine) { + this._physicsEngine.addJoint(this, otherImpostor, joint); + } + return this; } /** - * Dumps an array buffer - * @param width defines the rendering width - * @param height defines the rendering height - * @param data the data array - * @param successCallback defines the callback triggered once the data are available - * @param mimeType defines the mime type of the result - * @param fileName defines the filename to download. If present, the result will automatically be downloaded - * @param invertY true to invert the picture in the Y dimension - * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string - * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + * Add an anchor to a cloth impostor + * @param otherImpostor rigid impostor to anchor to + * @param width ratio across width from 0 to 1 + * @param height ratio up height from 0 to 1 + * @param influence the elasticity between cloth impostor and anchor from 0, very stretchy to 1, little stretch + * @param noCollisionBetweenLinkedBodies when true collisions between cloth impostor and anchor are ignored; default false + * @returns impostor the soft imposter */ - static DumpData(width, height, data, successCallback, mimeType = "image/png", fileName, invertY = false, toArrayBuffer = false, quality) { - const renderer = _DumpTools._CreateDumpRenderer(); - renderer.engine.setSize(width, height, true); - if (data instanceof Float32Array) { - const data2 = new Uint8Array(data.length); - let n = data.length; - while (n--) { - const v = data[n]; - data2[n] = Math.round(Scalar.Clamp(v) * 255); - } - data = data2; + addAnchor(otherImpostor, width, height, influence, noCollisionBetweenLinkedBodies) { + if (!this._physicsEngine) { + return this; } - const texture = renderer.engine.createRawTexture(data, width, height, 5, false, !invertY, 1); - renderer.renderer.setViewport(); - renderer.renderer.applyEffectWrapper(renderer.wrapper); - renderer.wrapper.effect._bindTexture("textureSampler", texture); - renderer.renderer.draw(); - if (toArrayBuffer) { - Tools.ToBlob(renderer.canvas, (blob) => { - const fileReader = new FileReader(); - fileReader.onload = (event) => { - const arrayBuffer = event.target.result; - if (successCallback) { - successCallback(arrayBuffer); - } - }; - fileReader.readAsArrayBuffer(blob); - }, mimeType, quality); - } else { - Tools.EncodeScreenshotCanvasData(renderer.canvas, successCallback, mimeType, fileName, quality); + const plugin = this._physicsEngine.getPhysicsPlugin(); + if (!plugin.appendAnchor) { + return this; } - texture.dispose(); - } - /** - * Dispose the dump tools associated resources - */ - static Dispose() { - if (_DumpTools._DumpToolsEngine) { - _DumpTools._DumpToolsEngine.wrapper.dispose(); - _DumpTools._DumpToolsEngine.renderer.dispose(); - _DumpTools._DumpToolsEngine.engine.dispose(); + if (this._physicsEngine) { + plugin.appendAnchor(this, otherImpostor, width, height, influence, noCollisionBetweenLinkedBodies); } - _DumpTools._DumpToolsEngine = null; - } -}; -var initSideEffects2 = () => { - Tools.DumpData = DumpTools.DumpData; - Tools.DumpDataAsync = DumpTools.DumpDataAsync; - Tools.DumpFramebuffer = DumpTools.DumpFramebuffer; -}; -initSideEffects2(); - -// node_modules/@babylonjs/core/Engines/Extensions/engine.renderTargetCube.js -ThinEngine.prototype.createRenderTargetCubeTexture = function(size, options) { - const rtWrapper = this._createHardwareRenderTargetWrapper(false, true, size); - const fullOptions = { - generateMipMaps: true, - generateDepthBuffer: true, - generateStencilBuffer: false, - type: 0, - samplingMode: 3, - format: 5, - ...options - }; - fullOptions.generateStencilBuffer = fullOptions.generateDepthBuffer && fullOptions.generateStencilBuffer; - if (fullOptions.type === 1 && !this._caps.textureFloatLinearFiltering) { - fullOptions.samplingMode = 1; - } else if (fullOptions.type === 2 && !this._caps.textureHalfFloatLinearFiltering) { - fullOptions.samplingMode = 1; - } - const gl = this._gl; - const texture = new InternalTexture(this, InternalTextureSource.RenderTarget); - this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, texture, true); - const filters = this._getSamplingParameters(fullOptions.samplingMode, fullOptions.generateMipMaps); - if (fullOptions.type === 1 && !this._caps.textureFloat) { - fullOptions.type = 0; - Logger.Warn("Float textures are not supported. Cube render target forced to TEXTURETYPE_UNESIGNED_BYTE type"); - } - gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, filters.mag); - gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, filters.min); - gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - for (let face = 0; face < 6; face++) { - gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, this._getRGBABufferInternalSizedFormat(fullOptions.type, fullOptions.format), size, size, 0, this._getInternalFormat(fullOptions.format), this._getWebGLTextureType(fullOptions.type), null); - } - const framebuffer = gl.createFramebuffer(); - this._bindUnboundFramebuffer(framebuffer); - rtWrapper._depthStencilBuffer = this._setupFramebufferDepthAttachments(fullOptions.generateStencilBuffer, fullOptions.generateDepthBuffer, size, size); - if (fullOptions.generateMipMaps) { - gl.generateMipmap(gl.TEXTURE_CUBE_MAP); + return this; } - this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, null); - this._bindUnboundFramebuffer(null); - rtWrapper._framebuffer = framebuffer; - rtWrapper._generateDepthBuffer = fullOptions.generateDepthBuffer; - rtWrapper._generateStencilBuffer = fullOptions.generateStencilBuffer; - texture.width = size; - texture.height = size; - texture.isReady = true; - texture.isCube = true; - texture.samples = 1; - texture.generateMipMaps = fullOptions.generateMipMaps; - texture.samplingMode = fullOptions.samplingMode; - texture.type = fullOptions.type; - texture.format = fullOptions.format; - this._internalTexturesCache.push(texture); - rtWrapper.setTextures(texture); - return rtWrapper; -}; - -// node_modules/@babylonjs/core/Materials/Textures/renderTargetTexture.js -var RenderTargetTexture = class _RenderTargetTexture extends Texture { /** - * Use this list to define the list of mesh you want to render. + * Add a hook to a rope impostor + * @param otherImpostor rigid impostor to anchor to + * @param length ratio across rope from 0 to 1 + * @param influence the elasticity between rope impostor and anchor from 0, very stretchy to 1, little stretch + * @param noCollisionBetweenLinkedBodies when true collisions between soft impostor and anchor are ignored; default false + * @returns impostor the rope imposter */ - get renderList() { - return this._renderList; - } - set renderList(value) { - if (this._unObserveRenderList) { - this._unObserveRenderList(); - this._unObserveRenderList = null; + addHook(otherImpostor, length, influence, noCollisionBetweenLinkedBodies) { + if (!this._physicsEngine) { + return this; } - if (value) { - this._unObserveRenderList = _ObserveArray(value, this._renderListHasChanged); + const plugin = this._physicsEngine.getPhysicsPlugin(); + if (!plugin.appendAnchor) { + return this; } - this._renderList = value; - } - /** - * Post-processes for this render target - */ - get postProcesses() { - return this._postProcesses; - } - get _prePassEnabled() { - return !!this._prePassRenderTarget && this._prePassRenderTarget.enabled; + if (this._physicsEngine) { + plugin.appendHook(this, otherImpostor, length, influence, noCollisionBetweenLinkedBodies); + } + return this; } /** - * Set a after unbind callback in the texture. - * This has been kept for backward compatibility and use of onAfterUnbindObservable is recommended. + * Will keep this body still, in a sleep mode. + * @returns the physics imposter */ - set onAfterUnbind(callback) { - if (this._onAfterUnbindObserver) { - this.onAfterUnbindObservable.remove(this._onAfterUnbindObserver); + sleep() { + if (this._physicsEngine) { + this._physicsEngine.getPhysicsPlugin().sleepBody(this); } - this._onAfterUnbindObserver = this.onAfterUnbindObservable.add(callback); + return this; } /** - * Set a before render callback in the texture. - * This has been kept for backward compatibility and use of onBeforeRenderObservable is recommended. + * Wake the body up. + * @returns The physics imposter */ - set onBeforeRender(callback) { - if (this._onBeforeRenderObserver) { - this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver); + wakeUp() { + if (this._physicsEngine) { + this._physicsEngine.getPhysicsPlugin().wakeUpBody(this); } - this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback); + return this; } /** - * Set a after render callback in the texture. - * This has been kept for backward compatibility and use of onAfterRenderObservable is recommended. + * Clones the physics imposter + * @param newObject The physics imposter clones to this physics-enabled object + * @returns A nullable physics imposter */ - set onAfterRender(callback) { - if (this._onAfterRenderObserver) { - this.onAfterRenderObservable.remove(this._onAfterRenderObserver); + clone(newObject) { + if (!newObject) { + return null; } - this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback); + return new _PhysicsImpostor(newObject, this.type, this._options, this._scene); } /** - * Set a clear callback in the texture. - * This has been kept for backward compatibility and use of onClearObservable is recommended. + * Disposes the physics imposter */ - set onClear(callback) { - if (this._onClearObserver) { - this.onClearObservable.remove(this._onClearObserver); + dispose() { + if (!this._physicsEngine) { + return; } - this._onClearObserver = this.onClearObservable.add(callback); + this._joints.forEach((j) => { + if (this._physicsEngine) { + this._physicsEngine.removeJoint(this, j.otherImpostor, j.joint); + } + }); + this._physicsEngine.removeImpostor(this); + if (this.parent) { + this.parent.forceUpdate(); + } else { + } + this._isDisposed = true; } /** - * Gets the render pass ids used by the render target texture. For a single render target the array length will be 1, for a cube texture it will be 6 and for - * a 2D texture array it will return an array of ids the size of the 2D texture array + * Sets the delta position + * @param position The delta position amount */ - get renderPassIds() { - return this._renderPassIds; + setDeltaPosition(position) { + this._deltaPosition.copyFrom(position); } /** - * Gets the current value of the refreshId counter + * Sets the delta rotation + * @param rotation The delta rotation amount */ - get currentRefreshId() { - return this._currentRefreshId; + setDeltaRotation(rotation) { + if (!this._deltaRotation) { + this._deltaRotation = new Quaternion(); + } + this._deltaRotation.copyFrom(rotation); + this._deltaRotationConjugated = this._deltaRotation.conjugate(); } /** - * Sets a specific material to be used to render a mesh/a list of meshes in this render target texture - * @param mesh mesh or array of meshes - * @param material material or array of materials to use for this render pass. If undefined is passed, no specific material will be used but the regular material instead (mesh.material). It's possible to provide an array of materials to use a different material for each rendering in the case of a cube texture (6 rendering) and a 2D texture array (as many rendering as the length of the array) + * Gets the box size of the physics imposter and stores the result in the input parameter + * @param result Stores the box size + * @returns The physics imposter */ - setMaterialForRendering(mesh, material) { - let meshes; - if (!Array.isArray(mesh)) { - meshes = [mesh]; - } else { - meshes = mesh; - } - for (let j = 0; j < meshes.length; ++j) { - for (let i = 0; i < this._renderPassIds.length; ++i) { - meshes[j].setMaterialForRenderPass(this._renderPassIds[i], material !== void 0 ? Array.isArray(material) ? material[i] : material : void 0); - } + getBoxSizeToRef(result) { + if (this._physicsEngine) { + this._physicsEngine.getPhysicsPlugin().getBoxSizeToRef(this, result); } + return this; } /** - * Define if the texture has multiple draw buffers or if false a single draw buffer. + * Gets the radius of the physics imposter + * @returns Radius of the physics imposter */ - get isMulti() { - var _a; - return ((_a = this._renderTarget) == null ? void 0 : _a.isMulti) ?? false; - } - /** - * Gets render target creation options that were used. - */ - get renderTargetOptions() { - return this._renderTargetOptions; - } - /** - * Gets the render target wrapper associated with this render target - */ - get renderTarget() { - return this._renderTarget; - } - _onRatioRescale() { - if (this._sizeRatio) { - this.resize(this._initialSizeParameter); - } - } - /** - * Gets or sets the size of the bounding box associated with the texture (when in cube mode) - * When defined, the cubemap will switch to local mode - * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity - * @example https://www.babylonjs-playground.com/#RNASML - */ - set boundingBoxSize(value) { - if (this._boundingBoxSize && this._boundingBoxSize.equals(value)) { - return; - } - this._boundingBoxSize = value; - const scene = this.getScene(); - if (scene) { - scene.markAllMaterialsAsDirty(1); - } - } - get boundingBoxSize() { - return this._boundingBoxSize; + getRadius() { + return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getRadius(this) : 0; } /** - * In case the RTT has been created with a depth texture, get the associated - * depth texture. - * Otherwise, return null. + * Sync a bone with this impostor + * @param bone The bone to sync to the impostor. + * @param boneMesh The mesh that the bone is influencing. + * @param jointPivot The pivot of the joint / bone in local space. + * @param distToJoint Optional distance from the impostor to the joint. + * @param adjustRotation Optional quaternion for adjusting the local rotation of the bone. */ - get depthStencilTexture() { - var _a; - return ((_a = this._renderTarget) == null ? void 0 : _a._depthStencilTexture) ?? null; - } - /** @internal */ - constructor(name69, size, scene, generateMipMaps = false, doNotChangeAspectRatio = true, type = 0, isCube = false, samplingMode = Texture.TRILINEAR_SAMPLINGMODE, generateDepthBuffer = true, generateStencilBuffer = false, isMulti = false, format = 5, delayAllocation = false, samples, creationFlags, noColorAttachment = false, useSRGBBuffer = false) { - let colorAttachment = void 0; - let gammaSpace = true; - if (typeof generateMipMaps === "object") { - const options = generateMipMaps; - generateMipMaps = !!options.generateMipMaps; - doNotChangeAspectRatio = options.doNotChangeAspectRatio ?? true; - type = options.type ?? 0; - isCube = !!options.isCube; - samplingMode = options.samplingMode ?? Texture.TRILINEAR_SAMPLINGMODE; - generateDepthBuffer = options.generateDepthBuffer ?? true; - generateStencilBuffer = !!options.generateStencilBuffer; - isMulti = !!options.isMulti; - format = options.format ?? 5; - delayAllocation = !!options.delayAllocation; - samples = options.samples; - creationFlags = options.creationFlags; - noColorAttachment = !!options.noColorAttachment; - useSRGBBuffer = !!options.useSRGBBuffer; - colorAttachment = options.colorAttachment; - gammaSpace = options.gammaSpace ?? gammaSpace; - } - super(null, scene, !generateMipMaps, void 0, samplingMode, void 0, void 0, void 0, void 0, format); - this._unObserveRenderList = null; - this._renderListHasChanged = (_functionName, previousLength) => { - var _a; - const newLength = this._renderList ? this._renderList.length : 0; - if (previousLength === 0 && newLength > 0 || newLength === 0) { - (_a = this.getScene()) == null ? void 0 : _a.meshes.forEach((mesh) => { - mesh._markSubMeshesAsLightDirty(); - }); - } - }; - this.renderParticles = true; - this.renderSprites = false; - this.forceLayerMaskCheck = false; - this.ignoreCameraViewport = false; - this.onBeforeBindObservable = new Observable(); - this.onAfterUnbindObservable = new Observable(); - this.onBeforeRenderObservable = new Observable(); - this.onAfterRenderObservable = new Observable(); - this.onClearObservable = new Observable(); - this.onResizeObservable = new Observable(); - this._cleared = false; - this.skipInitialClear = false; - this._currentRefreshId = -1; - this._refreshRate = 1; - this._samples = 1; - this._canRescale = true; - this._renderTarget = null; - this.boundingBoxPosition = Vector3.Zero(); - scene = this.getScene(); - if (!scene) { - return; - } - const engine = this.getScene().getEngine(); - this._gammaSpace = gammaSpace; - this._coordinatesMode = Texture.PROJECTION_MODE; - this.renderList = []; - this.name = name69; - this.isRenderTarget = true; - this._initialSizeParameter = size; - this._renderPassIds = []; - this._isCubeData = isCube; - this._processSizeParameter(size); - this.renderPassId = this._renderPassIds[0]; - this._resizeObserver = engine.onResizeObservable.add(() => { - }); - this._generateMipMaps = generateMipMaps ? true : false; - this._doNotChangeAspectRatio = doNotChangeAspectRatio; - this._renderingManager = new RenderingManager(scene); - this._renderingManager._useSceneAutoClearSetup = true; - if (isMulti) { - return; - } - this._renderTargetOptions = { - generateMipMaps, - type, - format: this._format ?? void 0, - samplingMode: this.samplingMode, - generateDepthBuffer, - generateStencilBuffer, - samples, - creationFlags, - noColorAttachment, - useSRGBBuffer, - colorAttachment, - label: this.name - }; - if (this.samplingMode === Texture.NEAREST_SAMPLINGMODE) { - this.wrapU = Texture.CLAMP_ADDRESSMODE; - this.wrapV = Texture.CLAMP_ADDRESSMODE; - } - if (!delayAllocation) { - if (isCube) { - this._renderTarget = scene.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions); - this.coordinatesMode = Texture.INVCUBIC_MODE; - this._textureMatrix = Matrix.Identity(); + syncBoneWithImpostor(bone, boneMesh, jointPivot, distToJoint, adjustRotation) { + const tempVec = _PhysicsImpostor._TmpVecs[0]; + const mesh = this.object; + if (mesh.rotationQuaternion) { + if (adjustRotation) { + const tempQuat = _PhysicsImpostor._TmpQuat; + mesh.rotationQuaternion.multiplyToRef(adjustRotation, tempQuat); + bone.setRotationQuaternion(tempQuat, Space.WORLD, boneMesh); } else { - this._renderTarget = scene.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions); + bone.setRotationQuaternion(mesh.rotationQuaternion, Space.WORLD, boneMesh); } - this._texture = this._renderTarget.texture; - if (samples !== void 0) { - this.samples = samples; + } + tempVec.x = 0; + tempVec.y = 0; + tempVec.z = 0; + if (jointPivot) { + tempVec.x = jointPivot.x; + tempVec.y = jointPivot.y; + tempVec.z = jointPivot.z; + bone.getDirectionToRef(tempVec, boneMesh, tempVec); + if (distToJoint === void 0 || distToJoint === null) { + distToJoint = jointPivot.length(); } + tempVec.x *= distToJoint; + tempVec.y *= distToJoint; + tempVec.z *= distToJoint; + } + if (bone.getParent()) { + tempVec.addInPlace(mesh.getAbsolutePosition()); + bone.setAbsolutePosition(tempVec, boneMesh); + } else { + boneMesh.setAbsolutePosition(mesh.getAbsolutePosition()); + boneMesh.position.x -= tempVec.x; + boneMesh.position.y -= tempVec.y; + boneMesh.position.z -= tempVec.z; } } /** - * Creates a depth stencil texture. - * This is only available in WebGL 2 or with the depth texture extension available. - * @param comparisonFunction Specifies the comparison function to set on the texture. If 0 or undefined, the texture is not in comparison mode (default: 0) - * @param bilinearFiltering Specifies whether or not bilinear filtering is enable on the texture (default: true) - * @param generateStencil Specifies whether or not a stencil should be allocated in the texture (default: false) - * @param samples sample count of the depth/stencil texture (default: 1) - * @param format format of the depth texture (default: 14) + * Sync impostor to a bone + * @param bone The bone that the impostor will be synced to. + * @param boneMesh The mesh that the bone is influencing. + * @param jointPivot The pivot of the joint / bone in local space. + * @param distToJoint Optional distance from the impostor to the joint. + * @param adjustRotation Optional quaternion for adjusting the local rotation of the bone. + * @param boneAxis Optional vector3 axis the bone is aligned with */ - createDepthStencilTexture(comparisonFunction = 0, bilinearFiltering = true, generateStencil = false, samples = 1, format = 14) { - var _a; - (_a = this._renderTarget) == null ? void 0 : _a.createDepthStencilTexture(comparisonFunction, bilinearFiltering, generateStencil, samples, format); - } - _releaseRenderPassId() { - if (this._scene) { - const engine = this._scene.getEngine(); - for (let i = 0; i < this._renderPassIds.length; ++i) { - engine.releaseRenderPassId(this._renderPassIds[i]); + syncImpostorWithBone(bone, boneMesh, jointPivot, distToJoint, adjustRotation, boneAxis) { + const mesh = this.object; + if (mesh.rotationQuaternion) { + if (adjustRotation) { + const tempQuat = _PhysicsImpostor._TmpQuat; + bone.getRotationQuaternionToRef(Space.WORLD, boneMesh, tempQuat); + tempQuat.multiplyToRef(adjustRotation, mesh.rotationQuaternion); + } else { + bone.getRotationQuaternionToRef(Space.WORLD, boneMesh, mesh.rotationQuaternion); } } - this._renderPassIds = []; - } - _createRenderPassId() { - this._releaseRenderPassId(); - const engine = this._scene.getEngine(); - const numPasses = this._isCubeData ? 6 : this.getRenderLayers() || 1; - for (let i = 0; i < numPasses; ++i) { - this._renderPassIds[i] = engine.createRenderPassId(`RenderTargetTexture - ${this.name}#${i}`); + const pos = _PhysicsImpostor._TmpVecs[0]; + const boneDir = _PhysicsImpostor._TmpVecs[1]; + if (!boneAxis) { + boneAxis = _PhysicsImpostor._TmpVecs[2]; + boneAxis.x = 0; + boneAxis.y = 1; + boneAxis.z = 0; } - } - _processSizeParameter(size, createRenderPassIds = true) { - if (size.ratio) { - this._sizeRatio = size.ratio; - const engine = this._getEngine(); - this._size = { - width: this._bestReflectionRenderTargetDimension(engine.getRenderWidth(), this._sizeRatio), - height: this._bestReflectionRenderTargetDimension(engine.getRenderHeight(), this._sizeRatio) - }; - } else { - this._size = size; + bone.getDirectionToRef(boneAxis, boneMesh, boneDir); + bone.getAbsolutePositionToRef(boneMesh, pos); + if ((distToJoint === void 0 || distToJoint === null) && jointPivot) { + distToJoint = jointPivot.length(); } - if (createRenderPassIds) { - this._createRenderPassId(); + if (distToJoint !== void 0 && distToJoint !== null) { + pos.x += boneDir.x * distToJoint; + pos.y += boneDir.y * distToJoint; + pos.z += boneDir.z * distToJoint; } + mesh.setAbsolutePosition(pos); } +}; +PhysicsImpostor.DEFAULT_OBJECT_SIZE = new Vector3(1, 1, 1); +PhysicsImpostor.IDENTITY_QUATERNION = Quaternion.Identity(); +PhysicsImpostor._TmpVecs = ArrayTools.BuildArray(3, Vector3.Zero); +PhysicsImpostor._TmpQuat = Quaternion.Identity(); +PhysicsImpostor.NoImpostor = 0; +PhysicsImpostor.SphereImpostor = 1; +PhysicsImpostor.BoxImpostor = 2; +PhysicsImpostor.PlaneImpostor = 3; +PhysicsImpostor.MeshImpostor = 4; +PhysicsImpostor.CapsuleImpostor = 6; +PhysicsImpostor.CylinderImpostor = 7; +PhysicsImpostor.ParticleImpostor = 8; +PhysicsImpostor.HeightmapImpostor = 9; +PhysicsImpostor.ConvexHullImpostor = 10; +PhysicsImpostor.CustomImpostor = 100; +PhysicsImpostor.RopeImpostor = 101; +PhysicsImpostor.ClothImpostor = 102; +PhysicsImpostor.SoftbodyImpostor = 103; + +// node_modules/@babylonjs/core/Loading/sceneLoader.js +var SceneLoaderAnimationGroupLoadingMode; +(function(SceneLoaderAnimationGroupLoadingMode2) { + SceneLoaderAnimationGroupLoadingMode2[SceneLoaderAnimationGroupLoadingMode2["Clean"] = 0] = "Clean"; + SceneLoaderAnimationGroupLoadingMode2[SceneLoaderAnimationGroupLoadingMode2["Stop"] = 1] = "Stop"; + SceneLoaderAnimationGroupLoadingMode2[SceneLoaderAnimationGroupLoadingMode2["Sync"] = 2] = "Sync"; + SceneLoaderAnimationGroupLoadingMode2[SceneLoaderAnimationGroupLoadingMode2["NoSync"] = 3] = "NoSync"; +})(SceneLoaderAnimationGroupLoadingMode || (SceneLoaderAnimationGroupLoadingMode = {})); +var SceneLoader = class _SceneLoader { /** - * Define the number of samples to use in case of MSAA. - * It defaults to one meaning no MSAA has been enabled. + * Gets or sets a boolean indicating if entire scene must be loaded even if scene contains incremental data */ - get samples() { - var _a; - return ((_a = this._renderTarget) == null ? void 0 : _a.samples) ?? this._samples; - } - set samples(value) { - if (this._renderTarget) { - this._samples = this._renderTarget.setSamples(value); - } + static get ForceFullSceneLoadingForIncremental() { + return SceneLoaderFlags.ForceFullSceneLoadingForIncremental; } - /** - * Resets the refresh counter of the texture and start bak from scratch. - * Could be useful to regenerate the texture if it is setup to render only once. - */ - resetRefreshCounter() { - this._currentRefreshId = -1; + static set ForceFullSceneLoadingForIncremental(value) { + SceneLoaderFlags.ForceFullSceneLoadingForIncremental = value; } /** - * Define the refresh rate of the texture or the rendering frequency. - * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on... + * Gets or sets a boolean indicating if loading screen must be displayed while loading a scene */ - get refreshRate() { - return this._refreshRate; + static get ShowLoadingScreen() { + return SceneLoaderFlags.ShowLoadingScreen; } - set refreshRate(value) { - this._refreshRate = value; - this.resetRefreshCounter(); + static set ShowLoadingScreen(value) { + SceneLoaderFlags.ShowLoadingScreen = value; } /** - * Adds a post process to the render target rendering passes. - * @param postProcess define the post process to add + * Defines the current logging level (while loading the scene) + * @ignorenaming */ - addPostProcess(postProcess) { - if (!this._postProcessManager) { - const scene = this.getScene(); - if (!scene) { - return; - } - this._postProcessManager = new PostProcessManager(scene); - this._postProcesses = new Array(); - } - this._postProcesses.push(postProcess); - this._postProcesses[0].autoClear = false; + // eslint-disable-next-line @typescript-eslint/naming-convention + static get loggingLevel() { + return SceneLoaderFlags.loggingLevel; } - /** - * Clear all the post processes attached to the render target - * @param dispose define if the cleared post processes should also be disposed (false by default) - */ - clearPostProcesses(dispose = false) { - if (!this._postProcesses) { - return; - } - if (dispose) { - for (const postProcess of this._postProcesses) { - postProcess.dispose(); - } - } - this._postProcesses = []; + // eslint-disable-next-line @typescript-eslint/naming-convention + static set loggingLevel(value) { + SceneLoaderFlags.loggingLevel = value; } /** - * Remove one of the post process from the list of attached post processes to the texture - * @param postProcess define the post process to remove from the list + * Gets or set a boolean indicating if matrix weights must be cleaned upon loading */ - removePostProcess(postProcess) { - if (!this._postProcesses) { - return; - } - const index = this._postProcesses.indexOf(postProcess); - if (index === -1) { - return; - } - this._postProcesses.splice(index, 1); - if (this._postProcesses.length > 0) { - this._postProcesses[0].autoClear = false; - } + static get CleanBoneMatrixWeights() { + return SceneLoaderFlags.CleanBoneMatrixWeights; } - /** @internal */ - _shouldRender() { - if (this._currentRefreshId === -1) { - this._currentRefreshId = 1; - return true; - } - if (this.refreshRate === this._currentRefreshId) { - this._currentRefreshId = 1; - return true; - } - this._currentRefreshId++; - return false; + static set CleanBoneMatrixWeights(value) { + SceneLoaderFlags.CleanBoneMatrixWeights = value; } /** - * Gets the actual render size of the texture. - * @returns the width of the render size + * Gets the default plugin (used to load Babylon files) + * @returns the .babylon plugin */ - getRenderSize() { - return this.getRenderWidth(); + static GetDefaultPlugin() { + return _SceneLoader._RegisteredPlugins[".babylon"]; } - /** - * Gets the actual render width of the texture. - * @returns the width of the render size - */ - getRenderWidth() { - if (this._size.width) { - return this._size.width; + static _GetPluginForExtension(extension) { + const registeredPlugin = _SceneLoader._RegisteredPlugins[extension]; + if (registeredPlugin) { + return registeredPlugin; } - return this._size; + Logger.Warn("Unable to find a plugin to load " + extension + " files. Trying to use .babylon default plugin. To load from a specific filetype (eg. gltf) see: https://doc.babylonjs.com/features/featuresDeepDive/importers/loadingFileTypes"); + return _SceneLoader.GetDefaultPlugin(); } - /** - * Gets the actual render height of the texture. - * @returns the height of the render size - */ - getRenderHeight() { - if (this._size.width) { - return this._size.height; + static _GetPluginForDirectLoad(data) { + for (const extension in _SceneLoader._RegisteredPlugins) { + const plugin = _SceneLoader._RegisteredPlugins[extension].plugin; + if (plugin.canDirectLoad && plugin.canDirectLoad(data)) { + return _SceneLoader._RegisteredPlugins[extension]; + } } - return this._size; + return _SceneLoader.GetDefaultPlugin(); } - /** - * Gets the actual number of layers of the texture or, in the case of a 3D texture, return the depth. - * @returns the number of layers - */ - getRenderLayers() { - const layers = this._size.layers; - if (layers) { - return layers; - } - const depth = this._size.depth; - if (depth) { - return depth; + static _GetPluginForFilename(sceneFilename) { + const queryStringPosition = sceneFilename.indexOf("?"); + if (queryStringPosition !== -1) { + sceneFilename = sceneFilename.substring(0, queryStringPosition); } - return 0; - } - /** - * Don't allow this render target texture to rescale. Mainly used to prevent rescaling by the scene optimizer. - */ - disableRescaling() { - this._canRescale = false; - } - /** - * Get if the texture can be rescaled or not. - */ - get canRescale() { - return this._canRescale; + const dotPosition = sceneFilename.lastIndexOf("."); + const extension = sceneFilename.substring(dotPosition, sceneFilename.length).toLowerCase(); + return _SceneLoader._GetPluginForExtension(extension); } - /** - * Resize the texture using a ratio. - * @param ratio the ratio to apply to the texture size in order to compute the new target size - */ - scale(ratio) { - const newSize = Math.max(1, this.getRenderSize() * ratio); - this.resize(newSize); + static _GetDirectLoad(sceneFilename) { + if (sceneFilename.substr(0, 5) === "data:") { + return sceneFilename.substr(5); + } + return null; } - /** - * Get the texture reflection matrix used to rotate/transform the reflection. - * @returns the reflection matrix - */ - getReflectionTextureMatrix() { - if (this.isCube) { - return this._textureMatrix; + static _FormatErrorMessage(fileInfo, message, exception) { + const fromLoad = fileInfo.rawData ? "binary data" : fileInfo.url; + let errorMessage = "Unable to load from " + fromLoad; + if (message) { + errorMessage += `: ${message}`; + } else if (exception) { + errorMessage += `: ${exception}`; } - return super.getReflectionTextureMatrix(); + return errorMessage; } - /** - * Resize the texture to a new desired size. - * Be careful as it will recreate all the data in the new texture. - * @param size Define the new size. It can be: - * - a number for squared texture, - * - an object containing { width: number, height: number } - * - or an object containing a ratio { ratio: number } - */ - resize(size) { - var _a; - const wasCube = this.isCube; - (_a = this._renderTarget) == null ? void 0 : _a.dispose(); - this._renderTarget = null; - const scene = this.getScene(); - if (!scene) { - return; + static _LoadData(fileInfo, scene, onSuccess, onProgress, onError, onDispose, pluginExtension, name69) { + const directLoad = _SceneLoader._GetDirectLoad(fileInfo.url); + if (fileInfo.rawData && !pluginExtension) { + throw "When using ArrayBufferView to load data the file extension must be provided."; } - this._processSizeParameter(size, false); - if (wasCube) { - this._renderTarget = scene.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions); + const registeredPlugin = pluginExtension ? _SceneLoader._GetPluginForExtension(pluginExtension) : directLoad ? _SceneLoader._GetPluginForDirectLoad(fileInfo.url) : _SceneLoader._GetPluginForFilename(fileInfo.url); + if (fileInfo.rawData && !registeredPlugin.isBinary) { + throw "Loading from ArrayBufferView can not be used with plugins that don't support binary loading."; + } + let plugin; + if (registeredPlugin.plugin.createPlugin !== void 0) { + plugin = registeredPlugin.plugin.createPlugin(); } else { - this._renderTarget = scene.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions); + plugin = registeredPlugin.plugin; } - this._texture = this._renderTarget.texture; - if (this._renderTargetOptions.samples !== void 0) { - this.samples = this._renderTargetOptions.samples; - } - if (this.onResizeObservable.hasObservers()) { - this.onResizeObservable.notifyObservers(this); - } - } - /** - * Renders all the objects from the render list into the texture. - * @param useCameraPostProcess Define if camera post processes should be used during the rendering - * @param dumpForDebug Define if the rendering result should be dumped (copied) for debugging purpose - */ - render(useCameraPostProcess = false, dumpForDebug = false) { - this._render(useCameraPostProcess, dumpForDebug); - } - /** - * This function will check if the render target texture can be rendered (textures are loaded, shaders are compiled) - * @returns true if all required resources are ready - */ - isReadyForRendering() { - return this._render(false, false, true); - } - _render(useCameraPostProcess = false, dumpForDebug = false, checkReadiness = false) { - const scene = this.getScene(); - if (!scene) { - return checkReadiness; - } - const engine = scene.getEngine(); - if (this.useCameraPostProcesses !== void 0) { - useCameraPostProcess = this.useCameraPostProcesses; + if (!plugin) { + throw "The loader plugin corresponding to the file type you are trying to load has not been found. If using es6, please import the plugin you wish to use before."; } - if (this._waitingRenderList) { - if (!this.renderListPredicate) { - this.renderList = []; - for (let index = 0; index < this._waitingRenderList.length; index++) { - const id = this._waitingRenderList[index]; - const mesh = scene.getMeshById(id); - if (mesh) { - this.renderList.push(mesh); - } + _SceneLoader.OnPluginActivatedObservable.notifyObservers(plugin); + if (directLoad && (plugin.canDirectLoad && plugin.canDirectLoad(fileInfo.url) || !IsBase64DataUrl(fileInfo.url))) { + if (plugin.directLoad) { + const result = plugin.directLoad(scene, directLoad); + if (result.then) { + result.then((data) => { + onSuccess(plugin, data); + }).catch((error) => { + onError("Error in directLoad of _loadData: " + error, error); + }); + } else { + onSuccess(plugin, result); } - } - this._waitingRenderList = void 0; - } - if (this.renderListPredicate) { - if (this.renderList) { - this.renderList.length = 0; } else { - this.renderList = []; - } - const scene2 = this.getScene(); - if (!scene2) { - return checkReadiness; - } - const sceneMeshes = scene2.meshes; - for (let index = 0; index < sceneMeshes.length; index++) { - const mesh = sceneMeshes[index]; - if (this.renderListPredicate(mesh)) { - this.renderList.push(mesh); - } + onSuccess(plugin, directLoad); } + return plugin; } - const currentRenderPassId = engine.currentRenderPassId; - this.onBeforeBindObservable.notifyObservers(this); - const camera = this.activeCamera ?? scene.activeCamera; - const sceneCamera = scene.activeCamera; - if (camera) { - if (camera !== scene.activeCamera) { - scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(true)); - scene.activeCamera = camera; + const useArrayBuffer = registeredPlugin.isBinary; + const dataCallback = (data, responseURL) => { + if (scene.isDisposed) { + onError("Scene has been disposed"); + return; } - engine.setViewport(camera.rigParent ? camera.rigParent.viewport : camera.viewport, this.getRenderWidth(), this.getRenderHeight()); - } - this._defaultRenderListPrepared = false; - let returnValue = checkReadiness; - if (!checkReadiness) { - if ((this.is2DArray || this.is3D) && !this.isMulti) { - for (let layer = 0; layer < this.getRenderLayers(); layer++) { - this._renderToTarget(0, useCameraPostProcess, dumpForDebug, layer, camera); - scene.incrementRenderId(); - scene.resetCachedMaterial(); - } - } else if (this.isCube && !this.isMulti) { - for (let face = 0; face < 6; face++) { - this._renderToTarget(face, useCameraPostProcess, dumpForDebug, void 0, camera); - scene.incrementRenderId(); - scene.resetCachedMaterial(); + onSuccess(plugin, data, responseURL); + }; + let request = null; + let pluginDisposed = false; + const onDisposeObservable = plugin.onDisposeObservable; + if (onDisposeObservable) { + onDisposeObservable.add(() => { + pluginDisposed = true; + if (request) { + request.abort(); + request = null; } - } else { - this._renderToTarget(0, useCameraPostProcess, dumpForDebug, void 0, camera); + onDispose(); + }); + } + const manifestChecked = () => { + if (pluginDisposed) { + return; } - } else { - if (!scene.getViewMatrix()) { - scene.updateTransformMatrix(); + const errorCallback = (request2, exception) => { + onError(request2 == null ? void 0 : request2.statusText, exception); + }; + if (!plugin.loadFile && fileInfo.rawData) { + throw "Plugin does not support loading ArrayBufferView."; } - const numLayers = this.is2DArray || this.is3D ? this.getRenderLayers() : this.isCube ? 6 : 1; - for (let layer = 0; layer < numLayers && returnValue; layer++) { - let currentRenderList = null; - const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data; - const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length; - engine.currentRenderPassId = this._renderPassIds[layer]; - this.onBeforeRenderObservable.notifyObservers(layer); - if (this.getCustomRenderList) { - currentRenderList = this.getCustomRenderList(layer, defaultRenderList, defaultRenderListLength); - } - if (!currentRenderList) { - currentRenderList = defaultRenderList; - } - if (!this._doNotChangeAspectRatio) { - scene.updateTransformMatrix(true); - } - for (let i = 0; i < currentRenderList.length && returnValue; ++i) { - const mesh = currentRenderList[i]; - if (!mesh.isEnabled() || mesh.isBlocked || !mesh.isVisible || !mesh.subMeshes) { - continue; - } - if (this.customIsReadyFunction) { - if (!this.customIsReadyFunction(mesh, this.refreshRate, checkReadiness)) { - returnValue = false; - continue; - } - } else if (!mesh.isReady(true)) { - returnValue = false; - continue; - } - } - this.onAfterRenderObservable.notifyObservers(layer); - if (this.is2DArray || this.is3D || this.isCube) { - scene.incrementRenderId(); - scene.resetCachedMaterial(); + request = plugin.loadFile ? plugin.loadFile(scene, fileInfo.rawData || fileInfo.file || fileInfo.url, fileInfo.rootUrl, dataCallback, onProgress, useArrayBuffer, errorCallback, name69) : scene._loadFile(fileInfo.file || fileInfo.url, dataCallback, onProgress, true, useArrayBuffer, errorCallback); + }; + const engine = scene.getEngine(); + let canUseOfflineSupport = engine.enableOfflineSupport; + if (canUseOfflineSupport) { + let exceptionFound = false; + for (const regex of scene.disableOfflineSupportExceptionRules) { + if (regex.test(fileInfo.url)) { + exceptionFound = true; + break; } } + canUseOfflineSupport = !exceptionFound; } - this.onAfterUnbindObservable.notifyObservers(this); - engine.currentRenderPassId = currentRenderPassId; - if (sceneCamera) { - scene.activeCamera = sceneCamera; - if (this.activeCamera && this.activeCamera !== scene.activeCamera) { - scene.setTransformMatrix(scene.activeCamera.getViewMatrix(), scene.activeCamera.getProjectionMatrix(true)); - } - engine.setViewport(scene.activeCamera.viewport); + if (canUseOfflineSupport && Engine.OfflineProviderFactory) { + scene.offlineProvider = Engine.OfflineProviderFactory(fileInfo.url, manifestChecked, engine.disableManifestCheck); + } else { + manifestChecked(); } - scene.resetCachedMaterial(); - return returnValue; - } - _bestReflectionRenderTargetDimension(renderDimension, scale) { - const minimum = 128; - const x = renderDimension * scale; - const curved = Engine.NearestPOT(x + minimum * minimum / (minimum + x)); - return Math.min(Engine.FloorPOT(renderDimension), curved); + return plugin; } - _prepareRenderingManager(currentRenderList, currentRenderListLength, camera, checkLayerMask) { - const scene = this.getScene(); - if (!scene) { - return; - } - this._renderingManager.reset(); - const sceneRenderId = scene.getRenderId(); - for (let meshIndex = 0; meshIndex < currentRenderListLength; meshIndex++) { - const mesh = currentRenderList[meshIndex]; - if (mesh && !mesh.isBlocked) { - if (this.customIsReadyFunction) { - if (!this.customIsReadyFunction(mesh, this.refreshRate, false)) { - this.resetRefreshCounter(); - continue; - } - } else if (!mesh.isReady(this.refreshRate === 0)) { - this.resetRefreshCounter(); - continue; - } - if (!mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate && scene.activeCamera) { - mesh._internalAbstractMeshDataInfo._currentLOD = scene.customLODSelector ? scene.customLODSelector(mesh, this.activeCamera || scene.activeCamera) : mesh.getLOD(this.activeCamera || scene.activeCamera); - mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate = true; - } - if (!mesh._internalAbstractMeshDataInfo._currentLOD) { - continue; - } - let meshToRender = mesh._internalAbstractMeshDataInfo._currentLOD; - meshToRender._preActivateForIntermediateRendering(sceneRenderId); - let isMasked; - if (checkLayerMask && camera) { - isMasked = (mesh.layerMask & camera.layerMask) === 0; - } else { - isMasked = false; - } - if (mesh.isEnabled() && mesh.isVisible && mesh.subMeshes && !isMasked) { - if (meshToRender !== mesh) { - meshToRender._activate(sceneRenderId, true); - } - if (mesh._activate(sceneRenderId, true) && mesh.subMeshes.length) { - if (!mesh.isAnInstance) { - meshToRender._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = false; - } else { - if (mesh._internalAbstractMeshDataInfo._actAsRegularMesh) { - meshToRender = mesh; - } - } - meshToRender._internalAbstractMeshDataInfo._isActiveIntermediate = true; - for (let subIndex = 0; subIndex < meshToRender.subMeshes.length; subIndex++) { - const subMesh = meshToRender.subMeshes[subIndex]; - this._renderingManager.dispatch(subMesh, meshToRender); - } - } - } - } - } - for (let particleIndex = 0; particleIndex < scene.particleSystems.length; particleIndex++) { - const particleSystem = scene.particleSystems[particleIndex]; - const emitter = particleSystem.emitter; - if (!particleSystem.isStarted() || !emitter || emitter.position && !emitter.isEnabled()) { - continue; + static _GetFileInfo(rootUrl, sceneFilename) { + let url; + let name69; + let file = null; + let rawData = null; + if (!sceneFilename) { + url = rootUrl; + name69 = Tools.GetFilename(rootUrl); + rootUrl = Tools.GetFolderPath(rootUrl); + } else if (sceneFilename.name) { + const sceneFile = sceneFilename; + url = `file:${sceneFile.name}`; + name69 = sceneFile.name; + file = sceneFile; + } else if (ArrayBuffer.isView(sceneFilename)) { + url = ""; + name69 = RandomGUID(); + rawData = sceneFilename; + } else if (typeof sceneFilename === "string" && sceneFilename.startsWith("data:")) { + url = sceneFilename; + name69 = ""; + } else { + const filename = sceneFilename; + if (filename.substr(0, 1) === "/") { + Tools.Error("Wrong sceneFilename parameter"); + return null; } - this._renderingManager.dispatchParticles(particleSystem); + url = rootUrl + filename; + name69 = filename; } + return { + url, + rootUrl, + name: name69, + file, + rawData + }; } + // Public functions /** - * @internal - * @param faceIndex face index to bind to if this is a cubetexture - * @param layer defines the index of the texture to bind in the array + * Gets a plugin that can load the given extension + * @param extension defines the extension to load + * @returns a plugin or null if none works */ - _bindFrameBuffer(faceIndex = 0, layer = 0) { - const scene = this.getScene(); - if (!scene) { - return; - } - const engine = scene.getEngine(); - if (this._renderTarget) { - engine.bindFramebuffer(this._renderTarget, this.isCube ? faceIndex : void 0, void 0, void 0, this.ignoreCameraViewport, 0, layer); - } + static GetPluginForExtension(extension) { + return _SceneLoader._GetPluginForExtension(extension).plugin; } - _unbindFrameBuffer(engine, faceIndex) { - if (!this._renderTarget) { - return; - } - engine.unBindFramebuffer(this._renderTarget, this.isCube, () => { - this.onAfterRenderObservable.notifyObservers(faceIndex); - }); + /** + * Gets a boolean indicating that the given extension can be loaded + * @param extension defines the extension to load + * @returns true if the extension is supported + */ + static IsPluginForExtensionAvailable(extension) { + return !!_SceneLoader._RegisteredPlugins[extension]; } /** - * @internal + * Adds a new plugin to the list of registered plugins + * @param plugin defines the plugin to add */ - _prepareFrame(scene, faceIndex, layer, useCameraPostProcess) { - if (this._postProcessManager) { - if (!this._prePassEnabled) { - this._postProcessManager._prepareFrame(this._texture, this._postProcesses); - } - } else if (!useCameraPostProcess || !scene.postProcessManager._prepareFrame(this._texture)) { - this._bindFrameBuffer(faceIndex, layer); + static RegisterPlugin(plugin) { + if (typeof plugin.extensions === "string") { + const extension = plugin.extensions; + _SceneLoader._RegisteredPlugins[extension.toLowerCase()] = { + plugin, + isBinary: false + }; + } else { + const extensions = plugin.extensions; + Object.keys(extensions).forEach((extension) => { + _SceneLoader._RegisteredPlugins[extension.toLowerCase()] = { + plugin, + isBinary: extensions[extension].isBinary + }; + }); } } - _renderToTarget(faceIndex, useCameraPostProcess, dumpForDebug, layer = 0, camera = null) { - var _a, _b, _c; - const scene = this.getScene(); + /** + * Import meshes into a scene + * @param meshNames an array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported + * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) + * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) + * @param scene the instance of BABYLON.Scene to append to + * @param onSuccess a callback with a list of imported meshes, particleSystems, skeletons, and animationGroups when import succeeds + * @param onProgress a callback with a progress event for each file being loaded + * @param onError a callback with the scene, a message, and possibly an exception when import fails + * @param pluginExtension the extension used to determine the plugin + * @param name defines the name of the file, if the data is binary + * @returns The loaded plugin + */ + static ImportMesh(meshNames, rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, onSuccess = null, onProgress = null, onError = null, pluginExtension = null, name69 = "") { if (!scene) { - return; + Logger.Error("No scene available to import mesh to"); + return null; } - const engine = scene.getEngine(); - (_a = engine._debugPushGroup) == null ? void 0 : _a.call(engine, `render to face #${faceIndex} layer #${layer}`, 1); - this._prepareFrame(scene, faceIndex, layer, useCameraPostProcess); - if (this.is2DArray || this.is3D) { - engine.currentRenderPassId = this._renderPassIds[layer]; - this.onBeforeRenderObservable.notifyObservers(layer); - } else { - engine.currentRenderPassId = this._renderPassIds[faceIndex]; - this.onBeforeRenderObservable.notifyObservers(faceIndex); + const fileInfo = _SceneLoader._GetFileInfo(rootUrl, sceneFilename); + if (!fileInfo) { + return null; } - const fastPath = engine.snapshotRendering && engine.snapshotRenderingMode === 1; - if (!fastPath) { - let currentRenderList = null; - const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data; - const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length; - if (this.getCustomRenderList) { - currentRenderList = this.getCustomRenderList(this.is2DArray || this.is3D ? layer : faceIndex, defaultRenderList, defaultRenderListLength); - } - if (!currentRenderList) { - if (!this._defaultRenderListPrepared) { - this._prepareRenderingManager(defaultRenderList, defaultRenderListLength, camera, !this.renderList || this.forceLayerMaskCheck); - this._defaultRenderListPrepared = true; - } - currentRenderList = defaultRenderList; + const loadingToken = {}; + scene.addPendingData(loadingToken); + const disposeHandler = () => { + scene.removePendingData(loadingToken); + }; + const errorHandler = (message, exception) => { + const errorMessage = _SceneLoader._FormatErrorMessage(fileInfo, message, exception); + if (onError) { + onError(scene, errorMessage, new RuntimeError(errorMessage, ErrorCodes.SceneLoaderError, exception)); } else { - this._prepareRenderingManager(currentRenderList, currentRenderList.length, camera, this.forceLayerMaskCheck); - } - for (const step of scene._beforeRenderTargetClearStage) { - step.action(this, faceIndex, layer); - } - if (this.onClearObservable.hasObservers()) { - this.onClearObservable.notifyObservers(engine); - } else if (!this.skipInitialClear) { - engine.clear(this.clearColor || scene.clearColor, true, true, true); - } - if (!this._doNotChangeAspectRatio) { - scene.updateTransformMatrix(true); - } - for (const step of scene._beforeRenderTargetDrawStage) { - step.action(this, faceIndex, layer); - } - this._renderingManager.render(this.customRenderFunction, currentRenderList, this.renderParticles, this.renderSprites); - for (const step of scene._afterRenderTargetDrawStage) { - step.action(this, faceIndex, layer); - } - const saveGenerateMipMaps = ((_b = this._texture) == null ? void 0 : _b.generateMipMaps) ?? false; - if (this._texture) { - this._texture.generateMipMaps = false; - } - if (this._postProcessManager) { - this._postProcessManager._finalizeFrame(false, this._renderTarget ?? void 0, faceIndex, this._postProcesses, this.ignoreCameraViewport); - } else if (useCameraPostProcess) { - scene.postProcessManager._finalizeFrame(false, this._renderTarget ?? void 0, faceIndex); - } - for (const step of scene._afterRenderTargetPostProcessStage) { - step.action(this, faceIndex, layer); + Logger.Error(errorMessage); } - if (this._texture) { - this._texture.generateMipMaps = saveGenerateMipMaps; + disposeHandler(); + }; + const progressHandler = onProgress ? (event) => { + try { + onProgress(event); + } catch (e) { + errorHandler("Error in onProgress callback: " + e, e); } - if (!this._doNotChangeAspectRatio) { - scene.updateTransformMatrix(true); + } : void 0; + const successHandler = (meshes, particleSystems, skeletons, animationGroups, transformNodes, geometries, lights, spriteManagers) => { + scene.importedMeshesFiles.push(fileInfo.url); + if (onSuccess) { + try { + onSuccess(meshes, particleSystems, skeletons, animationGroups, transformNodes, geometries, lights, spriteManagers); + } catch (e) { + errorHandler("Error in onSuccess callback: " + e, e); + } } - if (dumpForDebug) { - DumpTools.DumpFramebuffer(this.getRenderWidth(), this.getRenderHeight(), engine); + scene.removePendingData(loadingToken); + }; + return _SceneLoader._LoadData(fileInfo, scene, (plugin, data, responseURL) => { + if (plugin.rewriteRootURL) { + fileInfo.rootUrl = plugin.rewriteRootURL(fileInfo.rootUrl, responseURL); } - } else { - if (this.onClearObservable.hasObservers()) { - this.onClearObservable.notifyObservers(engine); - } else { - if (!this.skipInitialClear) { - engine.clear(this.clearColor || scene.clearColor, true, true, true); + if (plugin.importMesh) { + const syncedPlugin = plugin; + const meshes = []; + const particleSystems = []; + const skeletons = []; + if (!syncedPlugin.importMesh(meshNames, scene, data, fileInfo.rootUrl, meshes, particleSystems, skeletons, errorHandler)) { + return; } + scene.loadingPluginName = plugin.name; + successHandler(meshes, particleSystems, skeletons, [], [], [], [], []); + } else { + const asyncedPlugin = plugin; + asyncedPlugin.importMeshAsync(meshNames, scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name).then((result) => { + scene.loadingPluginName = plugin.name; + successHandler(result.meshes, result.particleSystems, result.skeletons, result.animationGroups, result.transformNodes, result.geometries, result.lights, result.spriteManagers); + }).catch((error) => { + errorHandler(error.message, error); + }); } - } - this._unbindFrameBuffer(engine, faceIndex); - if (this._texture && this.isCube && faceIndex === 5) { - engine.generateMipMapsForCubemap(this._texture); - } - (_c = engine._debugPopGroup) == null ? void 0 : _c.call(engine, 1); + }, progressHandler, errorHandler, disposeHandler, pluginExtension, name69); } /** - * Overrides the default sort function applied in the rendering group to prepare the meshes. - * This allowed control for front to back rendering or reversely depending of the special needs. - * - * @param renderingGroupId The rendering group id corresponding to its index - * @param opaqueSortCompareFn The opaque queue comparison function use to sort. - * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort. - * @param transparentSortCompareFn The transparent queue comparison function use to sort. + * Import meshes into a scene + * @param meshNames an array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported + * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) + * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) + * @param scene the instance of BABYLON.Scene to append to + * @param onProgress a callback with a progress event for each file being loaded + * @param pluginExtension the extension used to determine the plugin + * @param name defines the name of the file + * @returns The loaded list of imported meshes, particle systems, skeletons, and animation groups */ - setRenderingOrder(renderingGroupId, opaqueSortCompareFn = null, alphaTestSortCompareFn = null, transparentSortCompareFn = null) { - this._renderingManager.setRenderingOrder(renderingGroupId, opaqueSortCompareFn, alphaTestSortCompareFn, transparentSortCompareFn); + static ImportMeshAsync(meshNames, rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, onProgress = null, pluginExtension = null, name69 = "") { + return new Promise((resolve, reject) => { + _SceneLoader.ImportMesh(meshNames, rootUrl, sceneFilename, scene, (meshes, particleSystems, skeletons, animationGroups, transformNodes, geometries, lights, spriteManagers) => { + resolve({ + meshes, + particleSystems, + skeletons, + animationGroups, + transformNodes, + geometries, + lights, + spriteManagers + }); + }, onProgress, (scene2, message, exception) => { + reject(exception || new Error(message)); + }, pluginExtension, name69); + }); } /** - * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups. - * - * @param renderingGroupId The rendering group id corresponding to its index - * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true. + * Load a scene + * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) + * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) + * @param engine is the instance of BABYLON.Engine to use to create the scene + * @param onSuccess a callback with the scene when import succeeds + * @param onProgress a callback with a progress event for each file being loaded + * @param onError a callback with the scene, a message, and possibly an exception when import fails + * @param pluginExtension the extension used to determine the plugin + * @param name defines the filename, if the data is binary + * @returns The loaded plugin */ - setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil) { - this._renderingManager.setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil); - this._renderingManager._useSceneAutoClearSetup = false; + static Load(rootUrl, sceneFilename = "", engine = EngineStore.LastCreatedEngine, onSuccess = null, onProgress = null, onError = null, pluginExtension = null, name69 = "") { + if (!engine) { + Tools.Error("No engine available"); + return null; + } + return _SceneLoader.Append(rootUrl, sceneFilename, new Scene(engine), onSuccess, onProgress, onError, pluginExtension, name69); } /** - * Clones the texture. - * @returns the cloned texture + * Load a scene + * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) + * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) + * @param engine is the instance of BABYLON.Engine to use to create the scene + * @param onProgress a callback with a progress event for each file being loaded + * @param pluginExtension the extension used to determine the plugin + * @param name defines the filename, if the data is binary + * @returns The loaded scene */ - clone() { - const textureSize = this.getSize(); - const newTexture = new _RenderTargetTexture(this.name, textureSize, this.getScene(), this._renderTargetOptions.generateMipMaps, this._doNotChangeAspectRatio, this._renderTargetOptions.type, this.isCube, this._renderTargetOptions.samplingMode, this._renderTargetOptions.generateDepthBuffer, this._renderTargetOptions.generateStencilBuffer, void 0, this._renderTargetOptions.format, void 0, this._renderTargetOptions.samples); - newTexture.hasAlpha = this.hasAlpha; - newTexture.level = this.level; - newTexture.coordinatesMode = this.coordinatesMode; - if (this.renderList) { - newTexture.renderList = this.renderList.slice(0); - } - return newTexture; + static LoadAsync(rootUrl, sceneFilename = "", engine = EngineStore.LastCreatedEngine, onProgress = null, pluginExtension = null, name69 = "") { + return new Promise((resolve, reject) => { + _SceneLoader.Load(rootUrl, sceneFilename, engine, (scene) => { + resolve(scene); + }, onProgress, (scene, message, exception) => { + reject(exception || new Error(message)); + }, pluginExtension, name69); + }); } /** - * Serialize the texture to a JSON representation we can easily use in the respective Parse function. - * @returns The JSON representation of the texture + * Append a scene + * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) + * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) + * @param scene is the instance of BABYLON.Scene to append to + * @param onSuccess a callback with the scene when import succeeds + * @param onProgress a callback with a progress event for each file being loaded + * @param onError a callback with the scene, a message, and possibly an exception when import fails + * @param pluginExtension the extension used to determine the plugin + * @param name defines the name of the file, if the data is binary + * @returns The loaded plugin */ - serialize() { - if (!this.name) { + static Append(rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, onSuccess = null, onProgress = null, onError = null, pluginExtension = null, name69 = "") { + if (!scene) { + Logger.Error("No scene available to append to"); return null; } - const serializationObject = super.serialize(); - serializationObject.renderTargetSize = this.getRenderSize(); - serializationObject.renderList = []; - if (this.renderList) { - for (let index = 0; index < this.renderList.length; index++) { - serializationObject.renderList.push(this.renderList[index].id); - } + const fileInfo = _SceneLoader._GetFileInfo(rootUrl, sceneFilename); + if (!fileInfo) { + return null; } - return serializationObject; - } - /** - * This will remove the attached framebuffer objects. The texture will not be able to be used as render target anymore - */ - disposeFramebufferObjects() { - var _a; - (_a = this._renderTarget) == null ? void 0 : _a.dispose(true); + const loadingToken = {}; + scene.addPendingData(loadingToken); + const disposeHandler = () => { + scene.removePendingData(loadingToken); + }; + if (_SceneLoader.ShowLoadingScreen && !this._ShowingLoadingScreen) { + this._ShowingLoadingScreen = true; + scene.getEngine().displayLoadingUI(); + scene.executeWhenReady(() => { + scene.getEngine().hideLoadingUI(); + this._ShowingLoadingScreen = false; + }); + } + const errorHandler = (message, exception) => { + const errorMessage = _SceneLoader._FormatErrorMessage(fileInfo, message, exception); + if (onError) { + onError(scene, errorMessage, new RuntimeError(errorMessage, ErrorCodes.SceneLoaderError, exception)); + } else { + Logger.Error(errorMessage); + } + disposeHandler(); + }; + const progressHandler = onProgress ? (event) => { + try { + onProgress(event); + } catch (e) { + errorHandler("Error in onProgress callback", e); + } + } : void 0; + const successHandler = () => { + if (onSuccess) { + try { + onSuccess(scene); + } catch (e) { + errorHandler("Error in onSuccess callback", e); + } + } + scene.removePendingData(loadingToken); + }; + return _SceneLoader._LoadData(fileInfo, scene, (plugin, data) => { + if (plugin.load) { + const syncedPlugin = plugin; + if (!syncedPlugin.load(scene, data, fileInfo.rootUrl, errorHandler)) { + return; + } + scene.loadingPluginName = plugin.name; + successHandler(); + } else { + const asyncedPlugin = plugin; + asyncedPlugin.loadAsync(scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name).then(() => { + scene.loadingPluginName = plugin.name; + successHandler(); + }).catch((error) => { + errorHandler(error.message, error); + }); + } + }, progressHandler, errorHandler, disposeHandler, pluginExtension, name69); } /** - * Release and destroy the underlying lower level texture aka internalTexture. + * Append a scene + * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) + * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) + * @param scene is the instance of BABYLON.Scene to append to + * @param onProgress a callback with a progress event for each file being loaded + * @param pluginExtension the extension used to determine the plugin + * @param name defines the name of the file, if the data is binary + * @returns The given scene */ - releaseInternalTexture() { - var _a; - (_a = this._renderTarget) == null ? void 0 : _a.releaseTextures(); - this._texture = null; + static AppendAsync(rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, onProgress = null, pluginExtension = null, name69 = "") { + return new Promise((resolve, reject) => { + _SceneLoader.Append(rootUrl, sceneFilename, scene, (scene2) => { + resolve(scene2); + }, onProgress, (scene2, message, exception) => { + reject(exception || new Error(message)); + }, pluginExtension, name69); + }); } /** - * Dispose the texture and release its associated resources. + * Load a scene into an asset container + * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) + * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) + * @param scene is the instance of BABYLON.Scene to append to (default: last created scene) + * @param onSuccess a callback with the scene when import succeeds + * @param onProgress a callback with a progress event for each file being loaded + * @param onError a callback with the scene, a message, and possibly an exception when import fails + * @param pluginExtension the extension used to determine the plugin + * @param name defines the filename, if the data is binary + * @returns The loaded plugin */ - dispose() { - var _a; - this.onResizeObservable.clear(); - this.onClearObservable.clear(); - this.onAfterRenderObservable.clear(); - this.onAfterUnbindObservable.clear(); - this.onBeforeBindObservable.clear(); - this.onBeforeRenderObservable.clear(); - if (this._postProcessManager) { - this._postProcessManager.dispose(); - this._postProcessManager = null; - } - if (this._prePassRenderTarget) { - this._prePassRenderTarget.dispose(); - } - this._releaseRenderPassId(); - this.clearPostProcesses(true); - if (this._resizeObserver) { - this.getScene().getEngine().onResizeObservable.remove(this._resizeObserver); - this._resizeObserver = null; - } - this.renderList = null; - const scene = this.getScene(); + static LoadAssetContainer(rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, onSuccess = null, onProgress = null, onError = null, pluginExtension = null, name69 = "") { if (!scene) { - return; + Logger.Error("No scene available to load asset container to"); + return null; } - let index = scene.customRenderTargets.indexOf(this); - if (index >= 0) { - scene.customRenderTargets.splice(index, 1); + const fileInfo = _SceneLoader._GetFileInfo(rootUrl, sceneFilename); + if (!fileInfo) { + return null; } - for (const camera of scene.cameras) { - index = camera.customRenderTargets.indexOf(this); - if (index >= 0) { - camera.customRenderTargets.splice(index, 1); + const loadingToken = {}; + scene.addPendingData(loadingToken); + const disposeHandler = () => { + scene.removePendingData(loadingToken); + }; + const errorHandler = (message, exception) => { + const errorMessage = _SceneLoader._FormatErrorMessage(fileInfo, message, exception); + if (onError) { + onError(scene, errorMessage, new RuntimeError(errorMessage, ErrorCodes.SceneLoaderError, exception)); + } else { + Logger.Error(errorMessage); } - } - (_a = this._renderTarget) == null ? void 0 : _a.dispose(); - this._renderTarget = null; - this._texture = null; - super.dispose(); + disposeHandler(); + }; + const progressHandler = onProgress ? (event) => { + try { + onProgress(event); + } catch (e) { + errorHandler("Error in onProgress callback", e); + } + } : void 0; + const successHandler = (assets) => { + if (onSuccess) { + try { + onSuccess(assets); + } catch (e) { + errorHandler("Error in onSuccess callback", e); + } + } + scene.removePendingData(loadingToken); + }; + return _SceneLoader._LoadData(fileInfo, scene, (plugin, data) => { + if (plugin.loadAssetContainer) { + const syncedPlugin = plugin; + const assetContainer = syncedPlugin.loadAssetContainer(scene, data, fileInfo.rootUrl, errorHandler); + if (!assetContainer) { + return; + } + assetContainer.populateRootNodes(); + scene.loadingPluginName = plugin.name; + successHandler(assetContainer); + } else if (plugin.loadAssetContainerAsync) { + const asyncedPlugin = plugin; + asyncedPlugin.loadAssetContainerAsync(scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name).then((assetContainer) => { + assetContainer.populateRootNodes(); + scene.loadingPluginName = plugin.name; + successHandler(assetContainer); + }).catch((error) => { + errorHandler(error.message, error); + }); + } else { + errorHandler("LoadAssetContainer is not supported by this plugin. Plugin did not provide a loadAssetContainer or loadAssetContainerAsync method."); + } + }, progressHandler, errorHandler, disposeHandler, pluginExtension, name69); } - /** @internal */ - _rebuild() { - if (this.refreshRate === _RenderTargetTexture.REFRESHRATE_RENDER_ONCE) { - this.refreshRate = _RenderTargetTexture.REFRESHRATE_RENDER_ONCE; - } - if (this._postProcessManager) { - this._postProcessManager._rebuild(); - } + /** + * Load a scene into an asset container + * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) + * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene (default: empty string) + * @param scene is the instance of Scene to append to + * @param onProgress a callback with a progress event for each file being loaded + * @param pluginExtension the extension used to determine the plugin + * @returns The loaded asset container + */ + static LoadAssetContainerAsync(rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, onProgress = null, pluginExtension = null) { + return new Promise((resolve, reject) => { + _SceneLoader.LoadAssetContainer(rootUrl, sceneFilename, scene, (assetContainer) => { + resolve(assetContainer); + }, onProgress, (scene2, message, exception) => { + reject(exception || new Error(message)); + }, pluginExtension); + }); } /** - * Clear the info related to rendering groups preventing retention point in material dispose. + * Import animations from a file into a scene + * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) + * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) + * @param scene is the instance of BABYLON.Scene to append to (default: last created scene) + * @param overwriteAnimations when true, animations are cleaned before importing new ones. Animations are appended otherwise + * @param animationGroupLoadingMode defines how to handle old animations groups before importing new ones + * @param targetConverter defines a function used to convert animation targets from loaded scene to current scene (default: search node by name) + * @param onSuccess a callback with the scene when import succeeds + * @param onProgress a callback with a progress event for each file being loaded + * @param onError a callback with the scene, a message, and possibly an exception when import fails + * @param pluginExtension the extension used to determine the plugin */ - freeRenderingGroups() { - if (this._renderingManager) { - this._renderingManager.freeRenderingGroups(); + static ImportAnimations(rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, overwriteAnimations = true, animationGroupLoadingMode = SceneLoaderAnimationGroupLoadingMode.Clean, targetConverter = null, onSuccess = null, onProgress = null, onError = null, pluginExtension = null) { + if (!scene) { + Logger.Error("No scene available to load animations to"); + return; + } + if (overwriteAnimations) { + for (const animatable of scene.animatables) { + animatable.reset(); + } + scene.stopAllAnimations(); + scene.animationGroups.slice().forEach((animationGroup) => { + animationGroup.dispose(); + }); + const nodes = scene.getNodes(); + nodes.forEach((node) => { + if (node.animations) { + node.animations = []; + } + }); + } else { + switch (animationGroupLoadingMode) { + case SceneLoaderAnimationGroupLoadingMode.Clean: + scene.animationGroups.slice().forEach((animationGroup) => { + animationGroup.dispose(); + }); + break; + case SceneLoaderAnimationGroupLoadingMode.Stop: + scene.animationGroups.forEach((animationGroup) => { + animationGroup.stop(); + }); + break; + case SceneLoaderAnimationGroupLoadingMode.Sync: + scene.animationGroups.forEach((animationGroup) => { + animationGroup.reset(); + animationGroup.restart(); + }); + break; + case SceneLoaderAnimationGroupLoadingMode.NoSync: + break; + default: + Logger.Error("Unknown animation group loading mode value '" + animationGroupLoadingMode + "'"); + return; + } } + const startingIndexForNewAnimatables = scene.animatables.length; + const onAssetContainerLoaded = (container) => { + container.mergeAnimationsTo(scene, scene.animatables.slice(startingIndexForNewAnimatables), targetConverter); + container.dispose(); + scene.onAnimationFileImportedObservable.notifyObservers(scene); + if (onSuccess) { + onSuccess(scene); + } + }; + this.LoadAssetContainer(rootUrl, sceneFilename, scene, onAssetContainerLoaded, onProgress, onError, pluginExtension); } /** - * Gets the number of views the corresponding to the texture (eg. a MultiviewRenderTarget will have > 1) - * @returns the view count + * Import animations from a file into a scene + * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb) + * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string) + * @param scene is the instance of BABYLON.Scene to append to (default: last created scene) + * @param overwriteAnimations when true, animations are cleaned before importing new ones. Animations are appended otherwise + * @param animationGroupLoadingMode defines how to handle old animations groups before importing new ones + * @param targetConverter defines a function used to convert animation targets from loaded scene to current scene (default: search node by name) + * @param onSuccess a callback with the scene when import succeeds + * @param onProgress a callback with a progress event for each file being loaded + * @param onError a callback with the scene, a message, and possibly an exception when import fails + * @param pluginExtension the extension used to determine the plugin + * @returns the updated scene with imported animations */ - getViewCount() { - return 1; + static ImportAnimationsAsync(rootUrl, sceneFilename = "", scene = EngineStore.LastCreatedScene, overwriteAnimations = true, animationGroupLoadingMode = SceneLoaderAnimationGroupLoadingMode.Clean, targetConverter = null, onSuccess = null, onProgress = null, onError = null, pluginExtension = null) { + return new Promise((resolve, reject) => { + _SceneLoader.ImportAnimations(rootUrl, sceneFilename, scene, overwriteAnimations, animationGroupLoadingMode, targetConverter, (_scene) => { + resolve(_scene); + }, onProgress, (_scene, message, exception) => { + reject(exception || new Error(message)); + }, pluginExtension); + }); } }; -RenderTargetTexture.REFRESHRATE_RENDER_ONCE = 0; -RenderTargetTexture.REFRESHRATE_RENDER_ONEVERYFRAME = 1; -RenderTargetTexture.REFRESHRATE_RENDER_ONEVERYTWOFRAMES = 2; -Texture._CreateRenderTargetTexture = (name69, renderTargetSize, scene, generateMipMaps, creationFlags) => { - return new RenderTargetTexture(name69, renderTargetSize, scene, generateMipMaps); -}; +SceneLoader.NO_LOGGING = 0; +SceneLoader.MINIMAL_LOGGING = 1; +SceneLoader.SUMMARY_LOGGING = 2; +SceneLoader.DETAILED_LOGGING = 3; +SceneLoader.OnPluginActivatedObservable = new Observable(); +SceneLoader._RegisteredPlugins = {}; +SceneLoader._ShowingLoadingScreen = false; -// node_modules/@babylonjs/core/Materials/Textures/Procedurals/proceduralTextureSceneComponent.js -var ProceduralTextureSceneComponent = class { +// node_modules/@babylonjs/core/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes.js +var NodeMaterialBlockConnectionPointTypes; +(function(NodeMaterialBlockConnectionPointTypes2) { + NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Float"] = 1] = "Float"; + NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Int"] = 2] = "Int"; + NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Vector2"] = 4] = "Vector2"; + NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Vector3"] = 8] = "Vector3"; + NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Vector4"] = 16] = "Vector4"; + NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Color3"] = 32] = "Color3"; + NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Color4"] = 64] = "Color4"; + NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Matrix"] = 128] = "Matrix"; + NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["Object"] = 256] = "Object"; + NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["AutoDetect"] = 1024] = "AutoDetect"; + NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["BasedOnInput"] = 2048] = "BasedOnInput"; + NodeMaterialBlockConnectionPointTypes2[NodeMaterialBlockConnectionPointTypes2["All"] = 4095] = "All"; +})(NodeMaterialBlockConnectionPointTypes || (NodeMaterialBlockConnectionPointTypes = {})); + +// node_modules/@babylonjs/core/Materials/Node/Enums/nodeMaterialBlockTargets.js +var NodeMaterialBlockTargets; +(function(NodeMaterialBlockTargets2) { + NodeMaterialBlockTargets2[NodeMaterialBlockTargets2["Vertex"] = 1] = "Vertex"; + NodeMaterialBlockTargets2[NodeMaterialBlockTargets2["Fragment"] = 2] = "Fragment"; + NodeMaterialBlockTargets2[NodeMaterialBlockTargets2["Neutral"] = 4] = "Neutral"; + NodeMaterialBlockTargets2[NodeMaterialBlockTargets2["VertexAndFragment"] = 3] = "VertexAndFragment"; +})(NodeMaterialBlockTargets || (NodeMaterialBlockTargets = {})); + +// node_modules/@babylonjs/core/Materials/Node/nodeMaterialBlockConnectionPoint.js +var NodeMaterialConnectionPointCompatibilityStates; +(function(NodeMaterialConnectionPointCompatibilityStates2) { + NodeMaterialConnectionPointCompatibilityStates2[NodeMaterialConnectionPointCompatibilityStates2["Compatible"] = 0] = "Compatible"; + NodeMaterialConnectionPointCompatibilityStates2[NodeMaterialConnectionPointCompatibilityStates2["TypeIncompatible"] = 1] = "TypeIncompatible"; + NodeMaterialConnectionPointCompatibilityStates2[NodeMaterialConnectionPointCompatibilityStates2["TargetIncompatible"] = 2] = "TargetIncompatible"; + NodeMaterialConnectionPointCompatibilityStates2[NodeMaterialConnectionPointCompatibilityStates2["HierarchyIssue"] = 3] = "HierarchyIssue"; +})(NodeMaterialConnectionPointCompatibilityStates || (NodeMaterialConnectionPointCompatibilityStates = {})); +var NodeMaterialConnectionPointDirection; +(function(NodeMaterialConnectionPointDirection2) { + NodeMaterialConnectionPointDirection2[NodeMaterialConnectionPointDirection2["Input"] = 0] = "Input"; + NodeMaterialConnectionPointDirection2[NodeMaterialConnectionPointDirection2["Output"] = 1] = "Output"; +})(NodeMaterialConnectionPointDirection || (NodeMaterialConnectionPointDirection = {})); +var NodeMaterialConnectionPoint = class _NodeMaterialConnectionPoint { /** - * Creates a new instance of the component for the given scene - * @param scene Defines the scene to register the component in + * Checks if two types are equivalent + * @param type1 type 1 to check + * @param type2 type 2 to check + * @returns true if both types are equivalent, else false */ - constructor(scene) { - this.name = SceneComponentConstants.NAME_PROCEDURALTEXTURE; - this.scene = scene; - this.scene.proceduralTextures = []; + static AreEquivalentTypes(type1, type2) { + switch (type1) { + case NodeMaterialBlockConnectionPointTypes.Vector3: { + if (type2 === NodeMaterialBlockConnectionPointTypes.Color3) { + return true; + } + break; + } + case NodeMaterialBlockConnectionPointTypes.Vector4: { + if (type2 === NodeMaterialBlockConnectionPointTypes.Color4) { + return true; + } + break; + } + case NodeMaterialBlockConnectionPointTypes.Color3: { + if (type2 === NodeMaterialBlockConnectionPointTypes.Vector3) { + return true; + } + break; + } + case NodeMaterialBlockConnectionPointTypes.Color4: { + if (type2 === NodeMaterialBlockConnectionPointTypes.Vector4) { + return true; + } + break; + } + } + return false; } - /** - * Registers the component in a given scene - */ - register() { - this.scene._beforeClearStage.registerStep(SceneComponentConstants.STEP_BEFORECLEAR_PROCEDURALTEXTURE, this, this._beforeClear); + /** Gets the direction of the point */ + get direction() { + return this._direction; } /** - * Rebuilds the elements related to this component in case of - * context lost for instance. + * Gets or sets the associated variable name in the shader */ - rebuild() { - } - /** - * Disposes the component and the associated resources. - */ - dispose() { + get associatedVariableName() { + if (this._ownerBlock.isInput) { + return this._ownerBlock.associatedVariableName; + } + if ((!this._enforceAssociatedVariableName || !this._associatedVariableName) && this._connectedPoint) { + return this._connectedPoint.associatedVariableName; + } + return this._associatedVariableName; } - _beforeClear() { - if (this.scene.proceduralTexturesEnabled) { - Tools.StartPerformanceCounter("Procedural textures", this.scene.proceduralTextures.length > 0); - for (let proceduralIndex = 0; proceduralIndex < this.scene.proceduralTextures.length; proceduralIndex++) { - const proceduralTexture = this.scene.proceduralTextures[proceduralIndex]; - if (proceduralTexture._shouldRender()) { - proceduralTexture.render(); - } - } - Tools.EndPerformanceCounter("Procedural textures", this.scene.proceduralTextures.length > 0); + set associatedVariableName(value) { + this._associatedVariableName = value; + } + /** Get the inner type (ie AutoDetect for instance instead of the inferred one) */ + get innerType() { + if (this._linkedConnectionSource && this._linkedConnectionSource.isConnected) { + return this.type; } + return this._type; } -}; - -// node_modules/@babylonjs/core/Shaders/procedural.vertex.js -var name3 = "proceduralVertexShader"; -var shader3 = `attribute vec2 position;varying vec2 vPosition;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5); -#define CUSTOM_VERTEX_DEFINITIONS -void main(void) { -#define CUSTOM_VERTEX_MAIN_BEGIN -vPosition=position;vUV=position*madd+madd;gl_Position=vec4(position,0.0,1.0); -#define CUSTOM_VERTEX_MAIN_END -}`; -ShaderStore.ShadersStore[name3] = shader3; - -// node_modules/@babylonjs/core/Materials/Textures/Procedurals/proceduralTexture.js -var ProceduralTexture = class _ProceduralTexture extends Texture { /** - * Instantiates a new procedural texture. - * Procedural texturing is a way to programmatically create a texture. There are 2 types of procedural textures: code-only, and code that references some classic 2D images, sometimes called 'refMaps' or 'sampler' images. - * This is the base class of any Procedural texture and contains most of the shareable code. - * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures - * @param name Define the name of the texture - * @param size Define the size of the texture to create - * @param fragment Define the fragment shader to use to generate the texture or null if it is defined later: - * * object: \{ fragmentElement: "fragmentShaderCode" \}, used with shader code in script tags - * * object: \{ fragmentSource: "fragment shader code string" \}, the string contains the shader code - * * string: the string contains a name "XXX" to lookup in Effect.ShadersStore["XXXFragmentShader"] - * @param scene Define the scene the texture belongs to - * @param fallbackTexture Define a fallback texture in case there were issues to create the custom texture - * @param generateMipMaps Define if the texture should creates mip maps or not - * @param isCube Define if the texture is a cube texture or not (this will render each faces of the cube) - * @param textureType The FBO internal texture type + * Gets or sets the connection point type (default is float) */ - constructor(name69, size, fragment, scene, fallbackTexture = null, generateMipMaps = true, isCube = false, textureType = 0) { - super(null, scene, !generateMipMaps); - this.isEnabled = true; - this.autoClear = true; - this.onGeneratedObservable = new Observable(); - this.onBeforeGenerationObservable = new Observable(); - this.nodeMaterialSource = null; - this._textures = {}; - this._currentRefreshId = -1; - this._frameId = -1; - this._refreshRate = 1; - this._vertexBuffers = {}; - this._uniforms = new Array(); - this._samplers = new Array(); - this._floats = {}; - this._ints = {}; - this._floatsArrays = {}; - this._colors3 = {}; - this._colors4 = {}; - this._vectors2 = {}; - this._vectors3 = {}; - this._matrices = {}; - this._fallbackTextureUsed = false; - this._cachedDefines = null; - this._contentUpdateId = -1; - this._rtWrapper = null; - if (fallbackTexture !== null && !(fallbackTexture instanceof Texture)) { - this._options = fallbackTexture; - this._fallbackTexture = fallbackTexture.fallbackTexture ?? null; - } else { - this._options = {}; - this._fallbackTexture = fallbackTexture; + get type() { + if (this._type === NodeMaterialBlockConnectionPointTypes.AutoDetect) { + if (this._ownerBlock.isInput) { + return this._ownerBlock.type; + } + if (this._connectedPoint) { + return this._connectedPoint.type; + } + if (this._linkedConnectionSource && this._linkedConnectionSource.isConnected) { + return this._linkedConnectionSource.type; + } } - scene = this.getScene() || EngineStore.LastCreatedScene; - let component = scene._getComponent(SceneComponentConstants.NAME_PROCEDURALTEXTURE); - if (!component) { - component = new ProceduralTextureSceneComponent(scene); - scene._addComponent(component); + if (this._type === NodeMaterialBlockConnectionPointTypes.BasedOnInput) { + if (this._typeConnectionSource) { + if (!this._typeConnectionSource.isConnected && this._defaultConnectionPointType) { + return this._defaultConnectionPointType; + } + return this._typeConnectionSource.type; + } else if (this._defaultConnectionPointType) { + return this._defaultConnectionPointType; + } } - scene.proceduralTextures.push(this); - this._fullEngine = scene.getEngine(); - this.name = name69; - this.isRenderTarget = true; - this._size = size; - this._textureType = textureType; - this._generateMipMaps = generateMipMaps; - this._drawWrapper = new DrawWrapper(this._fullEngine); - this.setFragment(fragment); - const rtWrapper = this._createRtWrapper(isCube, size, generateMipMaps, textureType); - this._texture = rtWrapper.texture; - const vertices = []; - vertices.push(1, 1); - vertices.push(-1, 1); - vertices.push(-1, -1); - vertices.push(1, -1); - this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(this._fullEngine, vertices, VertexBuffer.PositionKind, false, false, 2); - this._createIndexBuffer(); + return this._type; } - _createRtWrapper(isCube, size, generateMipMaps, textureType) { - if (isCube) { - this._rtWrapper = this._fullEngine.createRenderTargetCubeTexture(size, { - generateMipMaps, - generateDepthBuffer: false, - generateStencilBuffer: false, - type: textureType, - ...this._options - }); - this.setFloat("face", 0); - } else { - this._rtWrapper = this._fullEngine.createRenderTargetTexture(size, { - generateMipMaps, - generateDepthBuffer: false, - generateStencilBuffer: false, - type: textureType, - ...this._options - }); + set type(value) { + this._type = value; + } + /** Gets or sets the target of that connection point */ + get target() { + if (!this._prioritizeVertex || !this._ownerBlock) { + return this._target; } - return this._rtWrapper; + if (this._target !== NodeMaterialBlockTargets.VertexAndFragment) { + return this._target; + } + if (this._ownerBlock.target === NodeMaterialBlockTargets.Fragment) { + return NodeMaterialBlockTargets.Fragment; + } + return NodeMaterialBlockTargets.Vertex; + } + set target(value) { + this._target = value; } /** - * The effect that is created when initializing the post process. - * @returns The created effect corresponding the postprocess. + * Gets a boolean indicating that the current point is connected to another NodeMaterialBlock */ - getEffect() { - return this._drawWrapper.effect; + get isConnected() { + return this.connectedPoint !== null || this.hasEndpoints; } /** - * @internal + * Gets a boolean indicating that the current point is connected to an input block */ - _setEffect(effect) { - this._drawWrapper.effect = effect; + get isConnectedToInputBlock() { + return this.connectedPoint !== null && this.connectedPoint.ownerBlock.isInput; } /** - * Gets texture content (Use this function wisely as reading from a texture can be slow) - * @returns an ArrayBufferView promise (Uint8Array or Float32Array) + * Gets a the connected input block (if any) */ - getContent() { - if (this._contentData && this._frameId === this._contentUpdateId) { - return this._contentData; - } - if (this._contentData) { - this._contentData.then((buffer) => { - this._contentData = this.readPixels(0, 0, buffer); - this._contentUpdateId = this._frameId; - }); - } else { - this._contentData = this.readPixels(0, 0); - this._contentUpdateId = this._frameId; + get connectInputBlock() { + if (!this.isConnectedToInputBlock) { + return null; } - return this._contentData; + return this.connectedPoint.ownerBlock; } - _createIndexBuffer() { - const engine = this._fullEngine; - const indices = []; - indices.push(0); - indices.push(1); - indices.push(2); - indices.push(0); - indices.push(2); - indices.push(3); - this._indexBuffer = engine.createIndexBuffer(indices); + /** Get the other side of the connection (if any) */ + get connectedPoint() { + return this._connectedPoint; } - /** @internal */ - _rebuild() { - const vb = this._vertexBuffers[VertexBuffer.PositionKind]; - if (vb) { - vb._rebuild(); + /** Get the block that owns this connection point */ + get ownerBlock() { + return this._ownerBlock; + } + /** Get the block connected on the other side of this connection (if any) */ + get sourceBlock() { + if (!this._connectedPoint) { + return null; } - this._createIndexBuffer(); - if (this.refreshRate === RenderTargetTexture.REFRESHRATE_RENDER_ONCE) { - this.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE; + return this._connectedPoint.ownerBlock; + } + /** Get the block connected on the endpoints of this connection (if any) */ + get connectedBlocks() { + if (this._endpoints.length === 0) { + return []; } + return this._endpoints.map((e) => e.ownerBlock); } - /** - * Resets the texture in order to recreate its associated resources. - * This can be called in case of context loss or if you change the shader code and need to regenerate the texture with the new code - */ - reset() { - var _a; - (_a = this._drawWrapper.effect) == null ? void 0 : _a.dispose(); - this._drawWrapper.effect = null; - this._cachedDefines = null; + /** Gets the list of connected endpoints */ + get endpoints() { + return this._endpoints; } - _getDefines() { - return ""; + /** Gets a boolean indicating if that output point is connected to at least one input */ + get hasEndpoints() { + return this._endpoints && this._endpoints.length > 0; } - /** - * Executes a function when the texture will be ready to be drawn. - * @param func The callback to be used. - */ - executeWhenReady(func) { - if (this.isReady()) { - func(this); - return; + /** Gets a boolean indicating that this connection has a path to the vertex output*/ + get isDirectlyConnectedToVertexOutput() { + if (!this.hasEndpoints) { + return false; } - const effect = this.getEffect(); - if (effect) { - effect.executeWhenCompiled(() => { - func(this); - }); + for (const endpoint of this._endpoints) { + if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Vertex) { + return true; + } + if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Neutral || endpoint.ownerBlock.target === NodeMaterialBlockTargets.VertexAndFragment) { + if (endpoint.ownerBlock.outputs.some((o) => o.isDirectlyConnectedToVertexOutput)) { + return true; + } + } } + return false; } - /** - * Is the texture ready to be used ? (rendered at least once) - * @returns true if ready, otherwise, false. - */ - isReady() { - const engine = this._fullEngine; - if (this.nodeMaterialSource) { - return this._drawWrapper.effect.isReady(); + /** Gets a boolean indicating that this connection will be used in the vertex shader */ + get isConnectedInVertexShader() { + if (this.target === NodeMaterialBlockTargets.Vertex) { + return true; } - if (!this._fragment) { + if (!this.hasEndpoints) { return false; } - if (this._fallbackTextureUsed) { + for (const endpoint of this._endpoints) { + if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Vertex) { + return true; + } + if (endpoint.target === NodeMaterialBlockTargets.Vertex) { + return true; + } + if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Neutral || endpoint.ownerBlock.target === NodeMaterialBlockTargets.VertexAndFragment) { + if (endpoint.ownerBlock.outputs.some((o) => o.isConnectedInVertexShader)) { + return true; + } + } + } + return false; + } + /** Gets a boolean indicating that this connection will be used in the fragment shader */ + get isConnectedInFragmentShader() { + if (this.target === NodeMaterialBlockTargets.Fragment) { return true; } - if (!this._texture) { + if (!this.hasEndpoints) { return false; } - const defines = this._getDefines(); - if (this._drawWrapper.effect && defines === this._cachedDefines && this._drawWrapper.effect.isReady()) { - return true; - } - const shaders = { - vertex: "procedural", - fragmentElement: this._fragment.fragmentElement, - fragmentSource: this._fragment.fragmentSource, - fragment: typeof this._fragment === "string" ? this._fragment : void 0 - }; - if (this._cachedDefines !== defines) { - this._cachedDefines = defines; - this._drawWrapper.effect = engine.createEffect(shaders, [VertexBuffer.PositionKind], this._uniforms, this._samplers, defines, void 0, void 0, () => { - var _a; - (_a = this._rtWrapper) == null ? void 0 : _a.dispose(); - this._rtWrapper = this._texture = null; - if (this._fallbackTexture) { - this._texture = this._fallbackTexture._texture; - if (this._texture) { - this._texture.incrementReferences(); - } + for (const endpoint of this._endpoints) { + if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Fragment) { + return true; + } + if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Neutral || endpoint.ownerBlock.target === NodeMaterialBlockTargets.VertexAndFragment) { + if (endpoint.ownerBlock.isConnectedInFragmentShader()) { + return true; } - this._fallbackTextureUsed = true; - }); + } } - return this._drawWrapper.effect.isReady(); + return false; } /** - * Resets the refresh counter of the texture and start bak from scratch. - * Could be useful to regenerate the texture if it is setup to render only once. + * Creates a block suitable to be used as an input for this input point. + * If null is returned, a block based on the point type will be created. + * @returns The returned string parameter is the name of the output point of NodeMaterialBlock (first parameter of the returned array) that can be connected to the input */ - resetRefreshCounter() { - this._currentRefreshId = -1; + createCustomInputBlock() { + return null; } /** - * Set the fragment shader to use in order to render the texture. - * @param fragment This can be set to a path (into the shader store) or to a json object containing a fragmentElement property. + * Creates a new connection point + * @param name defines the connection point name + * @param ownerBlock defines the block hosting this connection point + * @param direction defines the direction of the connection point */ - setFragment(fragment) { - this._fragment = fragment; + constructor(name69, ownerBlock, direction) { + this._connectedPoint = null; + this._endpoints = new Array(); + this._typeConnectionSource = null; + this._defaultConnectionPointType = null; + this._linkedConnectionSource = null; + this._acceptedConnectionPointType = null; + this._type = NodeMaterialBlockConnectionPointTypes.Float; + this._enforceAssociatedVariableName = false; + this.needDualDirectionValidation = false; + this.acceptedConnectionPointTypes = []; + this.excludedConnectionPointTypes = []; + this.onConnectionObservable = new Observable(); + this.onDisconnectionObservable = new Observable(); + this.isExposedOnFrame = false; + this.exposedPortPosition = -1; + this._prioritizeVertex = false; + this._target = NodeMaterialBlockTargets.VertexAndFragment; + this._ownerBlock = ownerBlock; + this.name = name69; + this._direction = direction; } /** - * Define the refresh rate of the texture or the rendering frequency. - * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on... + * Gets the current class name e.g. "NodeMaterialConnectionPoint" + * @returns the class name */ - get refreshRate() { - return this._refreshRate; + getClassName() { + return "NodeMaterialConnectionPoint"; } - set refreshRate(value) { - this._refreshRate = value; - this.resetRefreshCounter(); + /** + * Gets a boolean indicating if the current point can be connected to another point + * @param connectionPoint defines the other connection point + * @returns a boolean + */ + canConnectTo(connectionPoint) { + return this.checkCompatibilityState(connectionPoint) === NodeMaterialConnectionPointCompatibilityStates.Compatible; } - /** @internal */ - _shouldRender() { - if (!this.isEnabled || !this.isReady() || !this._texture) { - if (this._texture) { - this._texture.isReady = false; + /** + * Gets a number indicating if the current point can be connected to another point + * @param connectionPoint defines the other connection point + * @returns a number defining the compatibility state + */ + checkCompatibilityState(connectionPoint) { + const ownerBlock = this._ownerBlock; + const otherBlock = connectionPoint.ownerBlock; + if (ownerBlock.target === NodeMaterialBlockTargets.Fragment) { + if (otherBlock.target === NodeMaterialBlockTargets.Vertex) { + return NodeMaterialConnectionPointCompatibilityStates.TargetIncompatible; + } + for (const output of otherBlock.outputs) { + if (output.ownerBlock.target != NodeMaterialBlockTargets.Neutral && output.isConnectedInVertexShader) { + return NodeMaterialConnectionPointCompatibilityStates.TargetIncompatible; + } } - return false; } - if (this._fallbackTextureUsed) { - return false; + if (this.type !== connectionPoint.type && connectionPoint.innerType !== NodeMaterialBlockConnectionPointTypes.AutoDetect) { + if (_NodeMaterialConnectionPoint.AreEquivalentTypes(this.type, connectionPoint.type)) { + return NodeMaterialConnectionPointCompatibilityStates.Compatible; + } + if (connectionPoint.acceptedConnectionPointTypes && connectionPoint.acceptedConnectionPointTypes.indexOf(this.type) !== -1 || connectionPoint._acceptedConnectionPointType && _NodeMaterialConnectionPoint.AreEquivalentTypes(connectionPoint._acceptedConnectionPointType.type, this.type)) { + return NodeMaterialConnectionPointCompatibilityStates.Compatible; + } else { + return NodeMaterialConnectionPointCompatibilityStates.TypeIncompatible; + } } - if (this._currentRefreshId === -1) { - this._currentRefreshId = 1; - this._frameId++; - return true; + if (connectionPoint.excludedConnectionPointTypes && connectionPoint.excludedConnectionPointTypes.indexOf(this.type) !== -1) { + return NodeMaterialConnectionPointCompatibilityStates.TypeIncompatible; } - if (this.refreshRate === this._currentRefreshId) { - this._currentRefreshId = 1; - this._frameId++; - return true; + let targetBlock = otherBlock; + let sourceBlock = ownerBlock; + if (this.direction === NodeMaterialConnectionPointDirection.Input) { + targetBlock = ownerBlock; + sourceBlock = otherBlock; } - this._currentRefreshId++; - return false; + if (targetBlock.isAnAncestorOf(sourceBlock)) { + return NodeMaterialConnectionPointCompatibilityStates.HierarchyIssue; + } + return NodeMaterialConnectionPointCompatibilityStates.Compatible; } /** - * Get the size the texture is rendering at. - * @returns the size (on cube texture it is always squared) + * Connect this point to another connection point + * @param connectionPoint defines the other connection point + * @param ignoreConstraints defines if the system will ignore connection type constraints (default is false) + * @returns the current connection point */ - getRenderSize() { - return this._size; + connectTo(connectionPoint, ignoreConstraints = false) { + if (!ignoreConstraints && !this.canConnectTo(connectionPoint)) { + throw "Cannot connect these two connectors."; + } + this._endpoints.push(connectionPoint); + connectionPoint._connectedPoint = this; + this._enforceAssociatedVariableName = false; + this.onConnectionObservable.notifyObservers(connectionPoint); + connectionPoint.onConnectionObservable.notifyObservers(this); + return this; } /** - * Resize the texture to new value. - * @param size Define the new size the texture should have - * @param generateMipMaps Define whether the new texture should create mip maps + * Disconnect this point from one of his endpoint + * @param endpoint defines the other connection point + * @returns the current connection point */ - resize(size, generateMipMaps) { - if (this._fallbackTextureUsed || !this._rtWrapper || !this._texture) { - return; - } - const isCube = this._texture.isCube; - this._rtWrapper.dispose(); - const rtWrapper = this._createRtWrapper(isCube, size, generateMipMaps, this._textureType); - this._texture = rtWrapper.texture; - this._size = size; - this._generateMipMaps = generateMipMaps; - } - _checkUniform(uniformName) { - if (this._uniforms.indexOf(uniformName) === -1) { - this._uniforms.push(uniformName); + disconnectFrom(endpoint) { + const index = this._endpoints.indexOf(endpoint); + if (index === -1) { + return this; } + this._endpoints.splice(index, 1); + endpoint._connectedPoint = null; + this._enforceAssociatedVariableName = false; + endpoint._enforceAssociatedVariableName = false; + this.onDisconnectionObservable.notifyObservers(endpoint); + endpoint.onDisconnectionObservable.notifyObservers(this); + return this; } /** - * Set a texture in the shader program used to render. - * @param name Define the name of the uniform samplers as defined in the shader - * @param texture Define the texture to bind to this sampler - * @returns the texture itself allowing "fluent" like uniform updates + * Fill the list of excluded connection point types with all types other than those passed in the parameter + * @param mask Types (ORed values of NodeMaterialBlockConnectionPointTypes) that are allowed, and thus will not be pushed to the excluded list */ - setTexture(name69, texture) { - if (this._samplers.indexOf(name69) === -1) { - this._samplers.push(name69); + addExcludedConnectionPointFromAllowedTypes(mask) { + let bitmask = 1; + while (bitmask < NodeMaterialBlockConnectionPointTypes.All) { + if (!(mask & bitmask)) { + this.excludedConnectionPointTypes.push(bitmask); + } + bitmask = bitmask << 1; } - this._textures[name69] = texture; - return this; } /** - * Set a float in the shader. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the texture itself allowing "fluent" like uniform updates + * Serializes this point in a JSON representation + * @param isInput defines if the connection point is an input (default is true) + * @returns the serialized point object */ - setFloat(name69, value) { - this._checkUniform(name69); - this._floats[name69] = value; - return this; + serialize(isInput = true) { + const serializationObject = {}; + serializationObject.name = this.name; + serializationObject.displayName = this.displayName; + if (isInput && this.connectedPoint) { + serializationObject.inputName = this.name; + serializationObject.targetBlockId = this.connectedPoint.ownerBlock.uniqueId; + serializationObject.targetConnectionName = this.connectedPoint.name; + serializationObject.isExposedOnFrame = true; + serializationObject.exposedPortPosition = this.exposedPortPosition; + } + if (this.isExposedOnFrame || this.exposedPortPosition >= 0) { + serializationObject.isExposedOnFrame = true; + serializationObject.exposedPortPosition = this.exposedPortPosition; + } + return serializationObject; } /** - * Set a int in the shader. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the texture itself allowing "fluent" like uniform updates + * Release resources */ - setInt(name69, value) { - this._checkUniform(name69); - this._ints[name69] = value; - return this; + dispose() { + this.onConnectionObservable.clear(); + this.onDisconnectionObservable.clear(); } +}; + +// node_modules/@babylonjs/core/Materials/Node/nodeMaterialBlock.js +var NodeMaterialBlock = class { /** - * Set an array of floats in the shader. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the texture itself allowing "fluent" like uniform updates + * Gets the name of the block */ - setFloats(name69, value) { - this._checkUniform(name69); - this._floatsArrays[name69] = value; - return this; + get name() { + return this._name; } /** - * Set a vec3 in the shader from a Color3. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the texture itself allowing "fluent" like uniform updates + * Sets the name of the block. Will check if the name is valid. */ - setColor3(name69, value) { - this._checkUniform(name69); - this._colors3[name69] = value; - return this; + set name(newName) { + if (!this.validateBlockName(newName)) { + return; + } + this._name = newName; } /** - * Set a vec4 in the shader from a Color4. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the texture itself allowing "fluent" like uniform updates + * Gets a boolean indicating that this block can only be used once per NodeMaterial */ - setColor4(name69, value) { - this._checkUniform(name69); - this._colors4[name69] = value; - return this; + get isUnique() { + return this._isUnique; } /** - * Set a vec2 in the shader from a Vector2. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the texture itself allowing "fluent" like uniform updates + * Gets a boolean indicating that this block is an end block (e.g. it is generating a system value) */ - setVector2(name69, value) { - this._checkUniform(name69); - this._vectors2[name69] = value; - return this; + get isFinalMerger() { + return this._isFinalMerger; } /** - * Set a vec3 in the shader from a Vector3. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the texture itself allowing "fluent" like uniform updates + * Gets a boolean indicating that this block is an input (e.g. it sends data to the shader) */ - setVector3(name69, value) { - this._checkUniform(name69); - this._vectors3[name69] = value; - return this; + get isInput() { + return this._isInput; } /** - * Set a mat4 in the shader from a MAtrix. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the texture itself allowing "fluent" like uniform updates + * Gets a boolean indicating if this block is a teleport out */ - setMatrix(name69, value) { - this._checkUniform(name69); - this._matrices[name69] = value; - return this; + get isTeleportOut() { + return this._isTeleportOut; } /** - * Render the texture to its associated render target. - * @param useCameraPostProcess Define if camera post process should be applied to the texture + * Gets a boolean indicating if this block is a teleport in */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - render(useCameraPostProcess) { - var _a, _b; - const scene = this.getScene(); - if (!scene) { - return; - } - const engine = this._fullEngine; - engine.enableEffect(this._drawWrapper); - this.onBeforeGenerationObservable.notifyObservers(this); - engine.setState(false); - if (!this.nodeMaterialSource) { - for (const name69 in this._textures) { - this._drawWrapper.effect.setTexture(name69, this._textures[name69]); - } - for (const name69 in this._ints) { - this._drawWrapper.effect.setInt(name69, this._ints[name69]); - } - for (const name69 in this._floats) { - this._drawWrapper.effect.setFloat(name69, this._floats[name69]); - } - for (const name69 in this._floatsArrays) { - this._drawWrapper.effect.setArray(name69, this._floatsArrays[name69]); - } - for (const name69 in this._colors3) { - this._drawWrapper.effect.setColor3(name69, this._colors3[name69]); - } - for (const name69 in this._colors4) { - const color = this._colors4[name69]; - this._drawWrapper.effect.setFloat4(name69, color.r, color.g, color.b, color.a); - } - for (const name69 in this._vectors2) { - this._drawWrapper.effect.setVector2(name69, this._vectors2[name69]); - } - for (const name69 in this._vectors3) { - this._drawWrapper.effect.setVector3(name69, this._vectors3[name69]); - } - for (const name69 in this._matrices) { - this._drawWrapper.effect.setMatrix(name69, this._matrices[name69]); - } - } - if (!this._texture || !this._rtWrapper) { - return; - } - (_a = engine._debugPushGroup) == null ? void 0 : _a.call(engine, `procedural texture generation for ${this.name}`, 1); - const viewPort = engine.currentViewport; - if (this.isCube) { - for (let face = 0; face < 6; face++) { - engine.bindFramebuffer(this._rtWrapper, face, void 0, void 0, true); - engine.bindBuffers(this._vertexBuffers, this._indexBuffer, this._drawWrapper.effect); - this._drawWrapper.effect.setFloat("face", face); - if (this.autoClear) { - engine.clear(scene.clearColor, true, false, false); - } - engine.drawElementsType(Material.TriangleFillMode, 0, 6); - } - } else { - engine.bindFramebuffer(this._rtWrapper, 0, void 0, void 0, true); - engine.bindBuffers(this._vertexBuffers, this._indexBuffer, this._drawWrapper.effect); - if (this.autoClear) { - engine.clear(scene.clearColor, true, false, false); - } - engine.drawElementsType(Material.TriangleFillMode, 0, 6); - } - engine.unBindFramebuffer(this._rtWrapper, this.isCube); - if (viewPort) { - engine.setViewport(viewPort); - } - if (this.isCube) { - engine.generateMipMapsForCubemap(this._texture); - } - (_b = engine._debugPopGroup) == null ? void 0 : _b.call(engine, 1); - if (this.onGenerated) { - this.onGenerated(); - } - this.onGeneratedObservable.notifyObservers(this); + get isTeleportIn() { + return this._isTeleportIn; } /** - * Clone the texture. - * @returns the cloned texture + * Gets or sets the build Id */ - clone() { - const textureSize = this.getSize(); - const newTexture = new _ProceduralTexture(this.name, textureSize.width, this._fragment, this.getScene(), this._fallbackTexture, this._generateMipMaps); - newTexture.hasAlpha = this.hasAlpha; - newTexture.level = this.level; - newTexture.coordinatesMode = this.coordinatesMode; - return newTexture; + get buildId() { + return this._buildId; + } + set buildId(value) { + this._buildId = value; } /** - * Dispose the texture and release its associated resources. + * Gets or sets the target of the block */ - dispose() { - const scene = this.getScene(); - if (!scene) { + get target() { + return this._target; + } + set target(value) { + if ((this._target & value) !== 0) { return; } - const index = scene.proceduralTextures.indexOf(this); - if (index >= 0) { - scene.proceduralTextures.splice(index, 1); - } - const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind]; - if (vertexBuffer) { - vertexBuffer.dispose(); - this._vertexBuffers[VertexBuffer.PositionKind] = null; + this._target = value; + } + /** + * Gets the list of input points + */ + get inputs() { + return this._inputs; + } + /** Gets the list of output points */ + get outputs() { + return this._outputs; + } + /** + * Find an input by its name + * @param name defines the name of the input to look for + * @returns the input or null if not found + */ + getInputByName(name69) { + const filter = this._inputs.filter((e) => e.name === name69); + if (filter.length) { + return filter[0]; } - if (this._indexBuffer && this._fullEngine._releaseBuffer(this._indexBuffer)) { - this._indexBuffer = null; + return null; + } + /** + * Find an output by its name + * @param name defines the name of the output to look for + * @returns the output or null if not found + */ + getOutputByName(name69) { + const filter = this._outputs.filter((e) => e.name === name69); + if (filter.length) { + return filter[0]; } - this.onGeneratedObservable.clear(); - this.onBeforeGenerationObservable.clear(); - super.dispose(); + return null; } -}; -__decorate([ - serialize() -], ProceduralTexture.prototype, "isEnabled", void 0); -__decorate([ - serialize() -], ProceduralTexture.prototype, "autoClear", void 0); -__decorate([ - serialize() -], ProceduralTexture.prototype, "_generateMipMaps", void 0); -__decorate([ - serialize() -], ProceduralTexture.prototype, "_size", void 0); -__decorate([ - serialize() -], ProceduralTexture.prototype, "refreshRate", null); -RegisterClass("BABYLON.ProceduralTexture", ProceduralTexture); - -// node_modules/@babylonjs/core/Materials/Node/Blocks/trigonometryBlock.js -var TrigonometryBlockOperations; -(function(TrigonometryBlockOperations2) { - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Cos"] = 0] = "Cos"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Sin"] = 1] = "Sin"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Abs"] = 2] = "Abs"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Exp"] = 3] = "Exp"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Exp2"] = 4] = "Exp2"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Round"] = 5] = "Round"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Floor"] = 6] = "Floor"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Ceiling"] = 7] = "Ceiling"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Sqrt"] = 8] = "Sqrt"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Log"] = 9] = "Log"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Tan"] = 10] = "Tan"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["ArcTan"] = 11] = "ArcTan"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["ArcCos"] = 12] = "ArcCos"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["ArcSin"] = 13] = "ArcSin"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Fract"] = 14] = "Fract"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Sign"] = 15] = "Sign"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Radians"] = 16] = "Radians"; - TrigonometryBlockOperations2[TrigonometryBlockOperations2["Degrees"] = 17] = "Degrees"; -})(TrigonometryBlockOperations || (TrigonometryBlockOperations = {})); -var TrigonometryBlock = class extends NodeMaterialBlock { /** - * Creates a new TrigonometryBlock + * Creates a new NodeMaterialBlock * @param name defines the block name + * @param target defines the target of that block (Vertex by default) + * @param isFinalMerger defines a boolean indicating that this block is an end block (e.g. it is generating a system value). Default is false */ - constructor(name69) { - super(name69, NodeMaterialBlockTargets.Neutral); - this.operation = TrigonometryBlockOperations.Cos; - this.registerInput("input", NodeMaterialBlockConnectionPointTypes.AutoDetect); - this.registerOutput("output", NodeMaterialBlockConnectionPointTypes.BasedOnInput); - this._outputs[0]._typeConnectionSource = this._inputs[0]; + constructor(name69, target = NodeMaterialBlockTargets.Vertex, isFinalMerger = false) { + this._isFinalMerger = false; + this._isInput = false; + this._isTeleportOut = false; + this._isTeleportIn = false; + this._name = ""; + this._isUnique = false; + this.inputsAreExclusive = false; + this._codeVariableName = ""; + this._inputs = new Array(); + this._outputs = new Array(); + this.comments = ""; + this.visibleInInspector = false; + this.visibleOnFrame = false; + this._target = target; + this._originalTargetIsNeutral = target === NodeMaterialBlockTargets.Neutral; + this._isFinalMerger = isFinalMerger; + this._isInput = this.getClassName() === "InputBlock"; + this._isTeleportOut = this.getClassName() === "NodeMaterialTeleportOutBlock"; + this._isTeleportIn = this.getClassName() === "NodeMaterialTeleportInBlock"; + this._name = name69; + this.uniqueId = UniqueIdGenerator.UniqueId; + } + /** @internal */ + _setInitialTarget(target) { + this._target = target; + this._originalTargetIsNeutral = target === NodeMaterialBlockTargets.Neutral; } /** - * Gets the current class name + * Initialize the block and prepare the context for build + * @param state defines the state that will be used for the build + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + initialize(state) { + } + /** + * Bind data to effect. Will only be called for blocks with isBindable === true + * @param effect defines the effect to bind data to + * @param nodeMaterial defines the hosting NodeMaterial + * @param mesh defines the mesh that will be rendered + * @param subMesh defines the submesh that will be rendered + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + bind(effect, nodeMaterial, mesh, subMesh) { + } + _declareOutput(output, state) { + return `${state._getGLType(output.type)} ${output.associatedVariableName}`; + } + _writeVariable(currentPoint) { + const connectionPoint = currentPoint.connectedPoint; + if (connectionPoint) { + return `${currentPoint.associatedVariableName}`; + } + return `0.`; + } + _writeFloat(value) { + let stringVersion = value.toString(); + if (stringVersion.indexOf(".") === -1) { + stringVersion += ".0"; + } + return `${stringVersion}`; + } + /** + * Gets the current class name e.g. "NodeMaterialBlock" * @returns the class name */ getClassName() { - return "TrigonometryBlock"; + return "NodeMaterialBlock"; + } + /** Gets a boolean indicating that this connection will be used in the fragment shader + * @returns true if connected in fragment shader + */ + isConnectedInFragmentShader() { + return this.outputs.some((o) => o.isConnectedInFragmentShader); } /** - * Gets the input component + * Register a new input. Must be called inside a block constructor + * @param name defines the connection point name + * @param type defines the connection point type + * @param isOptional defines a boolean indicating that this input can be omitted + * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default) + * @param point an already created connection point. If not provided, create a new one + * @returns the current block */ - get input() { - return this._inputs[0]; + registerInput(name69, type, isOptional = false, target, point) { + point = point ?? new NodeMaterialConnectionPoint(name69, this, NodeMaterialConnectionPointDirection.Input); + point.type = type; + point.isOptional = isOptional; + if (target) { + point.target = target; + } + this._inputs.push(point); + return this; } /** - * Gets the output component + * Register a new output. Must be called inside a block constructor + * @param name defines the connection point name + * @param type defines the connection point type + * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default) + * @param point an already created connection point. If not provided, create a new one + * @returns the current block */ - get output() { - return this._outputs[0]; + registerOutput(name69, type, target, point) { + point = point ?? new NodeMaterialConnectionPoint(name69, this, NodeMaterialConnectionPointDirection.Output); + point.type = type; + if (target) { + point.target = target; + } + this._outputs.push(point); + return this; } - _buildBlock(state) { - super._buildBlock(state); - const output = this._outputs[0]; - let operation = ""; - switch (this.operation) { - case TrigonometryBlockOperations.Cos: { - operation = "cos"; - break; - } - case TrigonometryBlockOperations.Sin: { - operation = "sin"; - break; + /** + * Will return the first available input e.g. the first one which is not an uniform or an attribute + * @param forOutput defines an optional connection point to check compatibility with + * @returns the first available input or null + */ + getFirstAvailableInput(forOutput = null) { + for (const input of this._inputs) { + if (!input.connectedPoint) { + if (!forOutput || forOutput.type === input.type || input.type === NodeMaterialBlockConnectionPointTypes.AutoDetect) { + return input; + } } - case TrigonometryBlockOperations.Abs: { - operation = "abs"; - break; + } + return null; + } + /** + * Will return the first available output e.g. the first one which is not yet connected and not a varying + * @param forBlock defines an optional block to check compatibility with + * @returns the first available input or null + */ + getFirstAvailableOutput(forBlock = null) { + for (const output of this._outputs) { + if (!forBlock || !forBlock.target || forBlock.target === NodeMaterialBlockTargets.Neutral || (forBlock.target & output.target) !== 0) { + return output; } - case TrigonometryBlockOperations.Exp: { - operation = "exp"; - break; + } + return null; + } + /** + * Gets the sibling of the given output + * @param current defines the current output + * @returns the next output in the list or null + */ + getSiblingOutput(current) { + const index = this._outputs.indexOf(current); + if (index === -1 || index >= this._outputs.length) { + return null; + } + return this._outputs[index + 1]; + } + /** + * Checks if the current block is an ancestor of a given block + * @param block defines the potential descendant block to check + * @returns true if block is a descendant + */ + isAnAncestorOf(block) { + for (const output of this._outputs) { + if (!output.hasEndpoints) { + continue; } - case TrigonometryBlockOperations.Exp2: { - operation = "exp2"; - break; - } - case TrigonometryBlockOperations.Round: { - operation = "round"; - break; - } - case TrigonometryBlockOperations.Floor: { - operation = "floor"; - break; - } - case TrigonometryBlockOperations.Ceiling: { - operation = "ceil"; - break; - } - case TrigonometryBlockOperations.Sqrt: { - operation = "sqrt"; - break; - } - case TrigonometryBlockOperations.Log: { - operation = "log"; - break; - } - case TrigonometryBlockOperations.Tan: { - operation = "tan"; - break; - } - case TrigonometryBlockOperations.ArcTan: { - operation = "atan"; - break; - } - case TrigonometryBlockOperations.ArcCos: { - operation = "acos"; - break; - } - case TrigonometryBlockOperations.ArcSin: { - operation = "asin"; - break; - } - case TrigonometryBlockOperations.Fract: { - operation = "fract"; - break; - } - case TrigonometryBlockOperations.Sign: { - operation = "sign"; - break; - } - case TrigonometryBlockOperations.Radians: { - operation = "radians"; - break; - } - case TrigonometryBlockOperations.Degrees: { - operation = "degrees"; - break; + for (const endpoint of output.endpoints) { + if (endpoint.ownerBlock === block) { + return true; + } + if (endpoint.ownerBlock.isAnAncestorOf(block)) { + return true; + } } } - state.compilationString += this._declareOutput(output, state) + ` = ${operation}(${this.input.associatedVariableName}); -`; - return this; - } - serialize() { - const serializationObject = super.serialize(); - serializationObject.operation = this.operation; - return serializationObject; - } - _deserialize(serializationObject, scene, rootUrl) { - super._deserialize(serializationObject, scene, rootUrl); - this.operation = serializationObject.operation; - } - _dumpPropertiesCode() { - const codeString = super._dumpPropertiesCode() + `${this._codeVariableName}.operation = BABYLON.TrigonometryBlockOperations.${TrigonometryBlockOperations[this.operation]}; -`; - return codeString; - } -}; -RegisterClass("BABYLON.TrigonometryBlock", TrigonometryBlock); - -// node_modules/@babylonjs/core/Materials/Node/nodeMaterialBuildState.js -var NodeMaterialBuildState = class { - constructor() { - this.supportUniformBuffers = false; - this.attributes = []; - this.uniforms = []; - this.constants = []; - this.samplers = []; - this.functions = {}; - this.extensions = {}; - this.prePassOutput = {}; - this.counters = {}; - this._attributeDeclaration = ""; - this._uniformDeclaration = ""; - this._constantDeclaration = ""; - this._samplerDeclaration = ""; - this._varyingTransfer = ""; - this._injectAtEnd = ""; - this._repeatableContentAnchorIndex = 0; - this._builtCompilationString = ""; - this.compilationString = ""; + return false; } /** - * Finalize the compilation strings - * @param state defines the current compilation state + * Connect current block with another block + * @param other defines the block to connect with + * @param options define the various options to help pick the right connections + * @param options.input + * @param options.output + * @param options.outputSwizzle + * @returns the current block */ - finalize(state) { - const emitComments = state.sharedData.emitComments; - const isFragmentMode = this.target === NodeMaterialBlockTargets.Fragment; - this.compilationString = ` -${emitComments ? "//Entry point\n" : ""}void main(void) { -${this.compilationString}`; - if (this._constantDeclaration) { - this.compilationString = ` -${emitComments ? "//Constants\n" : ""}${this._constantDeclaration} -${this.compilationString}`; - } - let functionCode = ""; - for (const functionName in this.functions) { - functionCode += this.functions[functionName] + ` -`; - } - this.compilationString = ` -${functionCode} -${this.compilationString}`; - if (!isFragmentMode && this._varyingTransfer) { - this.compilationString = `${this.compilationString} -${this._varyingTransfer}`; - } - if (this._injectAtEnd) { - this.compilationString = `${this.compilationString} -${this._injectAtEnd}`; - } - this.compilationString = `${this.compilationString} -}`; - if (this.sharedData.varyingDeclaration) { - this.compilationString = ` -${emitComments ? "//Varyings\n" : ""}${this.sharedData.varyingDeclaration} -${this.compilationString}`; - } - if (this._samplerDeclaration) { - this.compilationString = ` -${emitComments ? "//Samplers\n" : ""}${this._samplerDeclaration} -${this.compilationString}`; - } - if (this._uniformDeclaration) { - this.compilationString = ` -${emitComments ? "//Uniforms\n" : ""}${this._uniformDeclaration} -${this.compilationString}`; - } - if (this._attributeDeclaration && !isFragmentMode) { - this.compilationString = ` -${emitComments ? "//Attributes\n" : ""}${this._attributeDeclaration} -${this.compilationString}`; - } - this.compilationString = "precision highp float;\n" + this.compilationString; - this.compilationString = "#if defined(WEBGL2) || defined(WEBGPU)\nprecision highp sampler2DArray;\n#endif\n" + this.compilationString; - if (isFragmentMode) { - this.compilationString = "#if defined(PREPASS)\r\n#extension GL_EXT_draw_buffers : require\r\nlayout(location = 0) out highp vec4 glFragData[SCENE_MRT_COUNT];\r\nhighp vec4 gl_FragColor;\r\n#endif\r\n" + this.compilationString; + connectTo(other, options) { + if (this._outputs.length === 0) { + return; } - for (const extensionName in this.extensions) { - const extension = this.extensions[extensionName]; - this.compilationString = ` -${extension} -${this.compilationString}`; + let output = options && options.output ? this.getOutputByName(options.output) : this.getFirstAvailableOutput(other); + let notFound = true; + while (notFound) { + const input = options && options.input ? other.getInputByName(options.input) : other.getFirstAvailableInput(output); + if (output && input && output.canConnectTo(input)) { + output.connectTo(input); + notFound = false; + } else if (!output) { + throw "Unable to find a compatible match"; + } else { + output = this.getSiblingOutput(output); + } } - this._builtCompilationString = this.compilationString; + return this; } - /** @internal */ - get _repeatableContentAnchor() { - return `###___ANCHOR${this._repeatableContentAnchorIndex++}___###`; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _buildBlock(state) { } /** - * @internal + * Add uniforms, samplers and uniform buffers at compilation time + * @param state defines the state to update + * @param nodeMaterial defines the node material requesting the update + * @param defines defines the material defines to update + * @param uniformBuffers defines the list of uniform buffer names */ - _getFreeVariableName(prefix) { - prefix = prefix.replace(/[^a-zA-Z_]+/g, ""); - if (this.sharedData.variableNames[prefix] === void 0) { - this.sharedData.variableNames[prefix] = 0; - if (prefix === "output" || prefix === "texture") { - return prefix + this.sharedData.variableNames[prefix]; - } - return prefix; - } else { - this.sharedData.variableNames[prefix]++; - } - return prefix + this.sharedData.variableNames[prefix]; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + updateUniformsAndSamples(state, nodeMaterial, defines, uniformBuffers) { } /** - * @internal + * Add potential fallbacks if shader compilation fails + * @param mesh defines the mesh to be rendered + * @param fallbacks defines the current prioritized list of fallbacks */ - _getFreeDefineName(prefix) { - if (this.sharedData.defineNames[prefix] === void 0) { - this.sharedData.defineNames[prefix] = 0; - } else { - this.sharedData.defineNames[prefix]++; - } - return prefix + this.sharedData.defineNames[prefix]; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + provideFallbacks(mesh, fallbacks) { } /** - * @internal + * Initialize defines for shader compilation + * @param mesh defines the mesh to be rendered + * @param nodeMaterial defines the node material requesting the update + * @param defines defines the material defines to update + * @param useInstances specifies that instances should be used */ - _excludeVariableName(name69) { - this.sharedData.variableNames[name69] = 0; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + initializeDefines(mesh, nodeMaterial, defines, useInstances = false) { } /** - * @internal + * Update defines for shader compilation + * @param mesh defines the mesh to be rendered + * @param nodeMaterial defines the node material requesting the update + * @param defines defines the material defines to update + * @param useInstances specifies that instances should be used + * @param subMesh defines which submesh to render */ - _emit2DSampler(name69) { - if (this.samplers.indexOf(name69) < 0) { - this._samplerDeclaration += `uniform sampler2D ${name69}; -`; - this.samplers.push(name69); - } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + prepareDefines(mesh, nodeMaterial, defines, useInstances = false, subMesh) { } /** - * @internal + * Lets the block try to connect some inputs automatically + * @param material defines the hosting NodeMaterial + * @param additionalFilteringInfo optional additional filtering condition when looking for compatible blocks */ - _emit2DArraySampler(name69) { - if (this.samplers.indexOf(name69) < 0) { - this._samplerDeclaration += `uniform sampler2DArray ${name69}; -`; - this.samplers.push(name69); - } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + autoConfigure(material, additionalFilteringInfo = () => true) { } /** - * @internal + * Function called when a block is declared as repeatable content generator + * @param vertexShaderState defines the current compilation state for the vertex shader + * @param fragmentShaderState defines the current compilation state for the fragment shader + * @param mesh defines the mesh to be rendered + * @param defines defines the material defines to update */ - _getGLType(type) { - switch (type) { - case NodeMaterialBlockConnectionPointTypes.Float: - return "float"; - case NodeMaterialBlockConnectionPointTypes.Int: - return "int"; - case NodeMaterialBlockConnectionPointTypes.Vector2: - return "vec2"; - case NodeMaterialBlockConnectionPointTypes.Color3: - case NodeMaterialBlockConnectionPointTypes.Vector3: - return "vec3"; - case NodeMaterialBlockConnectionPointTypes.Color4: - case NodeMaterialBlockConnectionPointTypes.Vector4: - return "vec4"; - case NodeMaterialBlockConnectionPointTypes.Matrix: - return "mat4"; - } - return ""; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + replaceRepeatableContent(vertexShaderState, fragmentShaderState, mesh, defines) { } - /** - * @internal - */ - _emitExtension(name69, extension, define = "") { - if (this.extensions[name69]) { - return; + /** Gets a boolean indicating that the code of this block will be promoted to vertex shader even if connected to fragment output */ + get willBeGeneratedIntoVertexShaderFromFragmentShader() { + if (this.isInput || this.isFinalMerger) { + return false; } - if (define) { - extension = `#if ${define} -${extension} -#endif`; + if (this._outputs.some((o) => o.isDirectlyConnectedToVertexOutput)) { + return false; } - this.extensions[name69] = extension; + if (this.target === NodeMaterialBlockTargets.Vertex) { + return false; + } + if (this.target === NodeMaterialBlockTargets.VertexAndFragment || this.target === NodeMaterialBlockTargets.Neutral) { + if (this._outputs.some((o) => o.isConnectedInVertexShader)) { + return true; + } + } + return false; } /** - * @internal + * Checks if the block is ready + * @param mesh defines the mesh to be rendered + * @param nodeMaterial defines the node material requesting the update + * @param defines defines the material defines to update + * @param useInstances specifies that instances should be used + * @returns true if the block is ready */ - _emitFunction(name69, code, comments) { - if (this.functions[name69]) { - return; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + isReady(mesh, nodeMaterial, defines, useInstances = false) { + return true; + } + _linkConnectionTypes(inputIndex0, inputIndex1, looseCoupling = false) { + if (looseCoupling) { + this._inputs[inputIndex1]._acceptedConnectionPointType = this._inputs[inputIndex0]; + } else { + this._inputs[inputIndex0]._linkedConnectionSource = this._inputs[inputIndex1]; } - if (this.sharedData.emitComments) { - code = comments + ` -` + code; + this._inputs[inputIndex1]._linkedConnectionSource = this._inputs[inputIndex0]; + } + _processBuild(block, state, input, activeBlocks) { + block.build(state, activeBlocks); + const localBlockIsFragment = state._vertexState != null; + const otherBlockWasGeneratedInVertexShader = block._buildTarget === NodeMaterialBlockTargets.Vertex && block.target !== NodeMaterialBlockTargets.VertexAndFragment; + if (localBlockIsFragment && ((block.target & block._buildTarget) === 0 || (block.target & input.target) === 0 || this.target !== NodeMaterialBlockTargets.VertexAndFragment && otherBlockWasGeneratedInVertexShader)) { + if (!block.isInput && state.target !== block._buildTarget || // block was already emitted by vertex shader + block.isInput && block.isAttribute && !block._noContextSwitch) { + const connectedPoint = input.connectedPoint; + if (state._vertexState._emitVaryingFromString("v_" + connectedPoint.associatedVariableName, state._getGLType(connectedPoint.type))) { + state._vertexState.compilationString += `${"v_" + connectedPoint.associatedVariableName} = ${connectedPoint.associatedVariableName}; +`; + } + input.associatedVariableName = "v_" + connectedPoint.associatedVariableName; + input._enforceAssociatedVariableName = true; + } } - this.functions[name69] = code; } /** - * @internal + * Validates the new name for the block node. + * @param newName the new name to be given to the node. + * @returns false if the name is a reserve word, else true. */ - _emitCodeFromInclude(includeName, comments, options) { - if (options && options.repeatKey) { - return `#include<${includeName}>${options.substitutionVars ? "(" + options.substitutionVars + ")" : ""}[0..${options.repeatKey}] -`; - } - let code = Effect.IncludesShadersStore[includeName] + "\n"; - if (this.sharedData.emitComments) { - code = comments + ` -` + code; - } - if (!options) { - return code; - } - if (options.replaceStrings) { - for (let index = 0; index < options.replaceStrings.length; index++) { - const replaceString = options.replaceStrings[index]; - code = code.replace(replaceString.search, replaceString.replace); + validateBlockName(newName) { + const reservedNames = [ + "position", + "normal", + "tangent", + "particle_positionw", + "uv", + "uv2", + "uv3", + "uv4", + "uv5", + "uv6", + "position2d", + "particle_uv", + "matricesIndices", + "matricesWeights", + "world0", + "world1", + "world2", + "world3", + "particle_color", + "particle_texturemask" + ]; + for (const reservedName of reservedNames) { + if (newName === reservedName) { + return false; } } - return code; + return true; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _customBuildStep(state, activeBlocks) { } /** - * @internal + * Compile the current node and generate the shader code + * @param state defines the current compilation state (uniforms, samplers, current string) + * @param activeBlocks defines the list of active blocks (i.e. blocks to compile) + * @returns true if already built */ - _emitFunctionFromInclude(includeName, comments, options, storeKey = "") { - const key = includeName + storeKey; - if (this.functions[key]) { - return; + build(state, activeBlocks) { + if (this._buildId === state.sharedData.buildId) { + return true; } - if (!options || !options.removeAttributes && !options.removeUniforms && !options.removeVaryings && !options.removeIfDef && !options.replaceStrings) { - if (options && options.repeatKey) { - this.functions[key] = `#include<${includeName}>${options.substitutionVars ? "(" + options.substitutionVars + ")" : ""}[0..${options.repeatKey}] -`; - } else { - this.functions[key] = `#include<${includeName}>${(options == null ? void 0 : options.substitutionVars) ? "(" + (options == null ? void 0 : options.substitutionVars) + ")" : ""} -`; - } - if (this.sharedData.emitComments) { - this.functions[key] = comments + ` -` + this.functions[key]; + if (!this.isInput) { + for (const output of this._outputs) { + if (!output.associatedVariableName) { + output.associatedVariableName = state._getFreeVariableName(output.name); + } } - return; } - this.functions[key] = Effect.IncludesShadersStore[includeName]; - if (this.sharedData.emitComments) { - this.functions[key] = comments + ` -` + this.functions[key]; + for (const input of this._inputs) { + if (!input.connectedPoint) { + if (!input.isOptional) { + state.sharedData.checks.notConnectedNonOptionalInputs.push(input); + } + continue; + } + if (this.target !== NodeMaterialBlockTargets.Neutral) { + if ((input.target & this.target) === 0) { + continue; + } + if ((input.target & state.target) === 0) { + continue; + } + } + const block = input.connectedPoint.ownerBlock; + if (block && block !== this) { + this._processBuild(block, state, input, activeBlocks); + } } - if (options.removeIfDef) { - this.functions[key] = this.functions[key].replace(/^\s*?#ifdef.+$/gm, ""); - this.functions[key] = this.functions[key].replace(/^\s*?#endif.*$/gm, ""); - this.functions[key] = this.functions[key].replace(/^\s*?#else.*$/gm, ""); - this.functions[key] = this.functions[key].replace(/^\s*?#elif.*$/gm, ""); + this._customBuildStep(state, activeBlocks); + if (this._buildId === state.sharedData.buildId) { + return true; } - if (options.removeAttributes) { - this.functions[key] = this.functions[key].replace(/\s*?attribute .+?;/g, "\n"); + if (state.sharedData.verbose) { + Logger.Log(`${state.target === NodeMaterialBlockTargets.Vertex ? "Vertex shader" : "Fragment shader"}: Building ${this.name} [${this.getClassName()}]`); } - if (options.removeUniforms) { - this.functions[key] = this.functions[key].replace(/\s*?uniform .*?;/g, "\n"); + if (this.isFinalMerger) { + switch (state.target) { + case NodeMaterialBlockTargets.Vertex: + state.sharedData.checks.emitVertex = true; + break; + case NodeMaterialBlockTargets.Fragment: + state.sharedData.checks.emitFragment = true; + break; + } } - if (options.removeVaryings) { - this.functions[key] = this.functions[key].replace(/\s*?(varying|in) .+?;/g, "\n"); + if (!this.isInput && state.sharedData.emitComments) { + state.compilationString += ` +//${this.name} +`; } - if (options.replaceStrings) { - for (let index = 0; index < options.replaceStrings.length; index++) { - const replaceString = options.replaceStrings[index]; - this.functions[key] = this.functions[key].replace(replaceString.search, replaceString.replace); + this._buildBlock(state); + this._buildId = state.sharedData.buildId; + this._buildTarget = state.target; + for (const output of this._outputs) { + if ((output.target & state.target) === 0) { + continue; + } + for (const endpoint of output.endpoints) { + const block = endpoint.ownerBlock; + if (block && (block.target & state.target) !== 0 && activeBlocks.indexOf(block) !== -1) { + this._processBuild(block, state, endpoint, activeBlocks); + } } } + return false; + } + _inputRename(name69) { + return name69; + } + _outputRename(name69) { + return name69; + } + _dumpPropertiesCode() { + const variableName = this._codeVariableName; + return `${variableName}.visibleInInspector = ${this.visibleInInspector}; +${variableName}.visibleOnFrame = ${this.visibleOnFrame}; +${variableName}.target = ${this.target}; +`; } /** * @internal */ - _registerTempVariable(name69) { - if (this.sharedData.temps.indexOf(name69) !== -1) { - return false; - } - this.sharedData.temps.push(name69); - return true; - } - /** - * @internal - */ - _emitVaryingFromString(name69, type, define = "", notDefine = false) { - if (this.sharedData.varyings.indexOf(name69) !== -1) { - return false; + _dumpCode(uniqueNames, alreadyDumped) { + alreadyDumped.push(this); + const nameAsVariableName = this.name.replace(/[^A-Za-z_]+/g, ""); + this._codeVariableName = nameAsVariableName || `${this.getClassName()}_${this.uniqueId}`; + if (uniqueNames.indexOf(this._codeVariableName) !== -1) { + let index = 0; + do { + index++; + this._codeVariableName = nameAsVariableName + index; + } while (uniqueNames.indexOf(this._codeVariableName) !== -1); } - this.sharedData.varyings.push(name69); - if (define) { - if (define.startsWith("defined(")) { - this.sharedData.varyingDeclaration += `#if ${define} + uniqueNames.push(this._codeVariableName); + let codeString = ` +// ${this.getClassName()} `; - } else { - this.sharedData.varyingDeclaration += `${notDefine ? "#ifndef" : "#ifdef"} ${define} + if (this.comments) { + codeString += `// ${this.comments} `; - } } - this.sharedData.varyingDeclaration += `varying ${type} ${name69}; -`; - if (define) { - this.sharedData.varyingDeclaration += `#endif + codeString += `var ${this._codeVariableName} = new BABYLON.${this.getClassName()}("${this.name}"); `; + codeString += this._dumpPropertiesCode(); + for (const input of this.inputs) { + if (!input.isConnected) { + continue; + } + const connectedOutput = input.connectedPoint; + const connectedBlock = connectedOutput.ownerBlock; + if (alreadyDumped.indexOf(connectedBlock) === -1) { + codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped); + } } - return true; + for (const output of this.outputs) { + if (!output.hasEndpoints) { + continue; + } + for (const endpoint of output.endpoints) { + const connectedBlock = endpoint.ownerBlock; + if (connectedBlock && alreadyDumped.indexOf(connectedBlock) === -1) { + codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped); + } + } + } + return codeString; } /** * @internal */ - _emitUniformFromString(name69, type, define = "", notDefine = false) { - if (this.uniforms.indexOf(name69) !== -1) { - return; + _dumpCodeForOutputConnections(alreadyDumped) { + let codeString = ""; + if (alreadyDumped.indexOf(this) !== -1) { + return codeString; } - this.uniforms.push(name69); - if (define) { - if (define.startsWith("defined(")) { - this._uniformDeclaration += `#if ${define} -`; - } else { - this._uniformDeclaration += `${notDefine ? "#ifndef" : "#ifdef"} ${define} -`; + alreadyDumped.push(this); + for (const input of this.inputs) { + if (!input.isConnected) { + continue; } - } - this._uniformDeclaration += `uniform ${type} ${name69}; -`; - if (define) { - this._uniformDeclaration += `#endif + const connectedOutput = input.connectedPoint; + const connectedBlock = connectedOutput.ownerBlock; + codeString += connectedBlock._dumpCodeForOutputConnections(alreadyDumped); + codeString += `${connectedBlock._codeVariableName}.${connectedBlock._outputRename(connectedOutput.name)}.connectTo(${this._codeVariableName}.${this._inputRename(input.name)}); `; } + return codeString; } /** - * @internal + * Clone the current block to a new identical block + * @param scene defines the hosting scene + * @param rootUrl defines the root URL to use to load textures and relative dependencies + * @returns a copy of the current block */ - _emitFloat(value) { - if (value.toString() === value.toFixed(0)) { - return `${value}.0`; + clone(scene, rootUrl = "") { + const serializationObject = this.serialize(); + const blockType = GetClass(serializationObject.customType); + if (blockType) { + const block = new blockType(); + block._deserialize(serializationObject, scene, rootUrl); + return block; } - return value.toString(); - } -}; - -// node_modules/@babylonjs/core/Materials/Node/nodeMaterialBuildStateSharedData.js -var NodeMaterialBuildStateSharedData = class { - /** Creates a new shared data */ - constructor() { - this.temps = []; - this.varyings = []; - this.varyingDeclaration = ""; - this.inputBlocks = []; - this.textureBlocks = []; - this.bindableBlocks = []; - this.forcedBindableBlocks = []; - this.blocksWithFallbacks = []; - this.blocksWithDefines = []; - this.repeatableContentBlocks = []; - this.dynamicUniformBlocks = []; - this.blockingBlocks = []; - this.animatedInputs = []; - this.variableNames = {}; - this.defineNames = {}; - this.hints = { - needWorldViewMatrix: false, - needWorldViewProjectionMatrix: false, - needAlphaBlending: false, - needAlphaTesting: false - }; - this.checks = { - emitVertex: false, - emitFragment: false, - notConnectedNonOptionalInputs: new Array() - }; - this.allowEmptyVertexProgram = false; - this.variableNames["position"] = 0; - this.variableNames["normal"] = 0; - this.variableNames["tangent"] = 0; - this.variableNames["uv"] = 0; - this.variableNames["uv2"] = 0; - this.variableNames["uv3"] = 0; - this.variableNames["uv4"] = 0; - this.variableNames["uv5"] = 0; - this.variableNames["uv6"] = 0; - this.variableNames["color"] = 0; - this.variableNames["matricesIndices"] = 0; - this.variableNames["matricesWeights"] = 0; - this.variableNames["matricesIndicesExtra"] = 0; - this.variableNames["matricesWeightsExtra"] = 0; - this.variableNames["diffuseBase"] = 0; - this.variableNames["specularBase"] = 0; - this.variableNames["worldPos"] = 0; - this.variableNames["shadow"] = 0; - this.variableNames["view"] = 0; - this.variableNames["vTBN"] = 0; - this.defineNames["MAINUV0"] = 0; - this.defineNames["MAINUV1"] = 0; - this.defineNames["MAINUV2"] = 0; - this.defineNames["MAINUV3"] = 0; - this.defineNames["MAINUV4"] = 0; - this.defineNames["MAINUV5"] = 0; - this.defineNames["MAINUV6"] = 0; - this.defineNames["MAINUV7"] = 0; + return null; } /** - * Emits console errors and exceptions if there is a failing check + * Serializes this block in a JSON representation + * @returns the serialized block object */ - emitErrors() { - let errorMessage = ""; - if (!this.checks.emitVertex && !this.allowEmptyVertexProgram) { - errorMessage += "NodeMaterial does not have a vertex output. You need to at least add a block that generates a glPosition value.\n"; - } - if (!this.checks.emitFragment) { - errorMessage += "NodeMaterial does not have a fragment output. You need to at least add a block that generates a glFragColor value.\n"; - } - for (const notConnectedInput of this.checks.notConnectedNonOptionalInputs) { - errorMessage += `input ${notConnectedInput.name} from block ${notConnectedInput.ownerBlock.name}[${notConnectedInput.ownerBlock.getClassName()}] is not connected and is not optional. -`; + serialize() { + const serializationObject = {}; + serializationObject.customType = "BABYLON." + this.getClassName(); + serializationObject.id = this.uniqueId; + serializationObject.name = this.name; + serializationObject.comments = this.comments; + serializationObject.visibleInInspector = this.visibleInInspector; + serializationObject.visibleOnFrame = this.visibleOnFrame; + serializationObject.target = this.target; + serializationObject.inputs = []; + serializationObject.outputs = []; + for (const input of this.inputs) { + serializationObject.inputs.push(input.serialize()); } - if (errorMessage) { - throw "Build of NodeMaterial failed:\n" + errorMessage; + for (const output of this.outputs) { + serializationObject.outputs.push(output.serialize(false)); } + return serializationObject; } -}; - -// node_modules/@babylonjs/core/Materials/Node/nodeMaterial.js -var onCreatedEffectParameters = { effect: null, subMesh: null }; -var NodeMaterialDefines = class extends MaterialDefines { /** - * Creates a new NodeMaterialDefines + * @internal */ - constructor() { - super(); - this.NORMAL = false; - this.TANGENT = false; - this.VERTEXCOLOR_NME = false; - this.UV1 = false; - this.UV2 = false; - this.UV3 = false; - this.UV4 = false; - this.UV5 = false; - this.UV6 = false; - this.PREPASS = false; - this.PREPASS_NORMAL = false; - this.PREPASS_NORMAL_INDEX = -1; - this.PREPASS_POSITION = false; - this.PREPASS_POSITION_INDEX = -1; - this.PREPASS_DEPTH = false; - this.PREPASS_DEPTH_INDEX = -1; - this.SCENE_MRT_COUNT = 0; - this.NUM_BONE_INFLUENCERS = 0; - this.BonesPerMesh = 0; - this.BONETEXTURE = false; - this.MORPHTARGETS = false; - this.MORPHTARGETS_NORMAL = false; - this.MORPHTARGETS_TANGENT = false; - this.MORPHTARGETS_UV = false; - this.NUM_MORPH_INFLUENCERS = 0; - this.MORPHTARGETS_TEXTURE = false; - this.IMAGEPROCESSING = false; - this.VIGNETTE = false; - this.VIGNETTEBLENDMODEMULTIPLY = false; - this.VIGNETTEBLENDMODEOPAQUE = false; - this.TONEMAPPING = false; - this.TONEMAPPING_ACES = false; - this.CONTRAST = false; - this.EXPOSURE = false; - this.COLORCURVES = false; - this.COLORGRADING = false; - this.COLORGRADING3D = false; - this.SAMPLER3DGREENDEPTH = false; - this.SAMPLER3DBGRMAP = false; - this.DITHER = false; - this.IMAGEPROCESSINGPOSTPROCESS = false; - this.SKIPFINALCOLORCLAMP = false; - this.BUMPDIRECTUV = 0; - this.CAMERA_ORTHOGRAPHIC = false; - this.CAMERA_PERSPECTIVE = false; - this.rebuild(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _deserialize(serializationObject, scene, rootUrl) { + this.name = serializationObject.name; + this.comments = serializationObject.comments; + this.visibleInInspector = !!serializationObject.visibleInInspector; + this.visibleOnFrame = !!serializationObject.visibleOnFrame; + this._target = serializationObject.target ?? this.target; + this._deserializePortDisplayNamesAndExposedOnFrame(serializationObject); + } + _deserializePortDisplayNamesAndExposedOnFrame(serializationObject) { + const serializedInputs = serializationObject.inputs; + const serializedOutputs = serializationObject.outputs; + if (serializedInputs) { + serializedInputs.forEach((port, i) => { + if (port.displayName) { + this.inputs[i].displayName = port.displayName; + } + if (port.isExposedOnFrame) { + this.inputs[i].isExposedOnFrame = port.isExposedOnFrame; + this.inputs[i].exposedPortPosition = port.exposedPortPosition; + } + }); + } + if (serializedOutputs) { + serializedOutputs.forEach((port, i) => { + if (port.displayName) { + this.outputs[i].displayName = port.displayName; + } + if (port.isExposedOnFrame) { + this.outputs[i].isExposedOnFrame = port.isExposedOnFrame; + this.outputs[i].exposedPortPosition = port.exposedPortPosition; + } + }); + } } /** - * Set the value of a specific key - * @param name defines the name of the key to set - * @param value defines the value to set - * @param markAsUnprocessedIfDirty Flag to indicate to the cache that this value needs processing + * Release resources */ - setValue(name69, value, markAsUnprocessedIfDirty = false) { - if (this[name69] === void 0) { - this._keys.push(name69); + dispose() { + for (const input of this.inputs) { + input.dispose(); } - if (markAsUnprocessedIfDirty && this[name69] !== value) { - this.markAsUnprocessed(); + for (const output of this.outputs) { + output.dispose(); } - this[name69] = value; } }; -var NodeMaterial = class _NodeMaterial extends PushMaterial { + +// node_modules/@babylonjs/core/Materials/Node/Blocks/transformBlock.js +var TransformBlock = class extends NodeMaterialBlock { /** - * Checks if a block is a texture block - * @param block The block to check - * @returns True if the block is a texture block + * Creates a new TransformBlock + * @param name defines the block name */ - static _BlockIsTextureBlock(block) { - return block.getClassName() === "TextureBlock" || block.getClassName() === "ReflectionTextureBaseBlock" || block.getClassName() === "ReflectionTextureBlock" || block.getClassName() === "ReflectionBlock" || block.getClassName() === "RefractionBlock" || block.getClassName() === "CurrentScreenBlock" || block.getClassName() === "ParticleTextureBlock" || block.getClassName() === "ImageSourceBlock" || block.getClassName() === "TriPlanarBlock" || block.getClassName() === "BiPlanarBlock" || block.getClassName() === "PrePassTextureBlock"; + constructor(name69) { + super(name69, NodeMaterialBlockTargets.Neutral); + this.complementW = 1; + this.complementZ = 0; + this.target = NodeMaterialBlockTargets.Vertex; + this.registerInput("vector", NodeMaterialBlockConnectionPointTypes.AutoDetect); + this.registerInput("transform", NodeMaterialBlockConnectionPointTypes.Matrix); + this.registerOutput("output", NodeMaterialBlockConnectionPointTypes.Vector4); + this.registerOutput("xyz", NodeMaterialBlockConnectionPointTypes.Vector3); + this._inputs[0].onConnectionObservable.add((other) => { + if (other.ownerBlock.isInput) { + const otherAsInput = other.ownerBlock; + if (otherAsInput.name === "normal" || otherAsInput.name === "tangent") { + this.complementW = 0; + } + } + }); } - /** Get the inspector from bundle or global - * @returns the global NME + /** + * Gets the current class name + * @returns the class name */ - _getGlobalNodeMaterialEditor() { - if (typeof NODEEDITOR !== "undefined") { - return NODEEDITOR; - } - if (typeof BABYLON !== "undefined" && typeof BABYLON.NodeEditor !== "undefined") { - return BABYLON; - } - return void 0; + getClassName() { + return "TransformBlock"; } - /** Gets or sets options to control the node material overall behavior */ - get options() { - return this._options; + /** + * Gets the vector input + */ + get vector() { + return this._inputs[0]; } - set options(options) { - this._options = options; + /** + * Gets the output component + */ + get output() { + return this._outputs[0]; } /** - * Gets the image processing configuration used either in this material. + * Gets the xyz output component */ - get imageProcessingConfiguration() { - return this._imageProcessingConfiguration; + get xyz() { + return this._outputs[1]; } /** - * Sets the Default image processing configuration used either in the this material. - * - * If sets to null, the scene one is in use. + * Gets the matrix transform input */ - set imageProcessingConfiguration(value) { - this._attachImageProcessingConfiguration(value); - this._markAllSubMeshesAsTexturesDirty(); + get transform() { + return this._inputs[1]; + } + _buildBlock(state) { + super._buildBlock(state); + const vector = this.vector; + const transform = this.transform; + if (vector.connectedPoint) { + if (this.complementW === 0) { + const comments = `//${this.name}`; + state._emitFunctionFromInclude("helperFunctions", comments); + state.sharedData.blocksWithDefines.push(this); + const transformName = state._getFreeVariableName(`${transform.associatedVariableName}_NUS`); + state.compilationString += `mat3 ${transformName} = mat3(${transform.associatedVariableName}); +`; + state.compilationString += `#ifdef NONUNIFORMSCALING +`; + state.compilationString += `${transformName} = transposeMat3(inverseMat3(${transformName})); +`; + state.compilationString += `#endif +`; + switch (vector.connectedPoint.type) { + case NodeMaterialBlockConnectionPointTypes.Vector2: + state.compilationString += this._declareOutput(this.output, state) + ` = vec4(${transformName} * vec3(${vector.associatedVariableName}, ${this._writeFloat(this.complementZ)}), ${this._writeFloat(this.complementW)}); +`; + break; + case NodeMaterialBlockConnectionPointTypes.Vector3: + case NodeMaterialBlockConnectionPointTypes.Color3: + state.compilationString += this._declareOutput(this.output, state) + ` = vec4(${transformName} * ${vector.associatedVariableName}, ${this._writeFloat(this.complementW)}); +`; + break; + default: + state.compilationString += this._declareOutput(this.output, state) + ` = vec4(${transformName} * ${vector.associatedVariableName}.xyz, ${this._writeFloat(this.complementW)}); +`; + break; + } + } else { + const transformName = transform.associatedVariableName; + switch (vector.connectedPoint.type) { + case NodeMaterialBlockConnectionPointTypes.Vector2: + state.compilationString += this._declareOutput(this.output, state) + ` = ${transformName} * vec4(${vector.associatedVariableName}, ${this._writeFloat(this.complementZ)}, ${this._writeFloat(this.complementW)}); +`; + break; + case NodeMaterialBlockConnectionPointTypes.Vector3: + case NodeMaterialBlockConnectionPointTypes.Color3: + state.compilationString += this._declareOutput(this.output, state) + ` = ${transformName} * vec4(${vector.associatedVariableName}, ${this._writeFloat(this.complementW)}); +`; + break; + default: + state.compilationString += this._declareOutput(this.output, state) + ` = ${transformName} * ${vector.associatedVariableName}; +`; + break; + } + } + if (this.xyz.hasEndpoints) { + state.compilationString += this._declareOutput(this.xyz, state) + ` = ${this.output.associatedVariableName}.xyz; +`; + } + } + return this; } /** - * Gets or sets the mode property + * Update defines for shader compilation + * @param mesh defines the mesh to be rendered + * @param nodeMaterial defines the node material requesting the update + * @param defines defines the material defines to update */ - get mode() { - return this._mode; + prepareDefines(mesh, nodeMaterial, defines) { + if (mesh.nonUniformScaling) { + defines.setValue("NONUNIFORMSCALING", true); + } } - set mode(value) { - this._mode = value; + serialize() { + const serializationObject = super.serialize(); + serializationObject.complementZ = this.complementZ; + serializationObject.complementW = this.complementW; + return serializationObject; } - /** Gets or sets the unique identifier used to identified the effect associated with the material */ - get buildId() { - return this._buildId; + _deserialize(serializationObject, scene, rootUrl) { + super._deserialize(serializationObject, scene, rootUrl); + this.complementZ = serializationObject.complementZ !== void 0 ? serializationObject.complementZ : 0; + this.complementW = serializationObject.complementW !== void 0 ? serializationObject.complementW : 1; } - set buildId(value) { - this._buildId = value; + _dumpPropertiesCode() { + let codeString = super._dumpPropertiesCode() + `${this._codeVariableName}.complementZ = ${this.complementZ}; +`; + codeString += `${this._codeVariableName}.complementW = ${this.complementW}; +`; + return codeString; } +}; +RegisterClass("BABYLON.TransformBlock", TransformBlock); + +// node_modules/@babylonjs/core/Materials/Node/Blocks/Vertex/vertexOutputBlock.js +var VertexOutputBlock = class extends NodeMaterialBlock { /** - * Create a new node based material - * @param name defines the material name - * @param scene defines the hosting scene - * @param options defines creation option + * Creates a new VertexOutputBlock + * @param name defines the block name */ - constructor(name69, scene, options = {}) { - super(name69, scene || EngineStore.LastCreatedScene); - this._buildId = _NodeMaterial._BuildIdGenerator++; - this._buildWasSuccessful = false; - this._cachedWorldViewMatrix = new Matrix(); - this._cachedWorldViewProjectionMatrix = new Matrix(); - this._optimizers = new Array(); - this._animationFrame = -1; - this.BJSNODEMATERIALEDITOR = this._getGlobalNodeMaterialEditor(); - this.editorData = null; - this.ignoreAlpha = false; - this.maxSimultaneousLights = 4; - this.onBuildObservable = new Observable(); - this._vertexOutputNodes = new Array(); - this._fragmentOutputNodes = new Array(); - this.attachedBlocks = []; - this._mode = NodeMaterialModes.Material; - this.forceAlphaBlending = false; - this._options = { - emitComments: false, - ...options - }; - this._attachImageProcessingConfiguration(null); + constructor(name69) { + super(name69, NodeMaterialBlockTargets.Vertex, true); + this.registerInput("vector", NodeMaterialBlockConnectionPointTypes.Vector4); } /** - * Gets the current class name of the material e.g. "NodeMaterial" + * Gets the current class name * @returns the class name */ getClassName() { - return "NodeMaterial"; + return "VertexOutputBlock"; } /** - * Attaches a new image processing configuration to the Standard Material. - * @param configuration + * Gets the vector input component */ - _attachImageProcessingConfiguration(configuration) { - if (configuration === this._imageProcessingConfiguration) { - return; - } - if (this._imageProcessingConfiguration && this._imageProcessingObserver) { - this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver); - } - if (!configuration) { - this._imageProcessingConfiguration = this.getScene().imageProcessingConfiguration; - } else { - this._imageProcessingConfiguration = configuration; + get vector() { + return this._inputs[0]; + } + _isLogarithmicDepthEnabled(nodeList, useLogarithmicDepth) { + if (useLogarithmicDepth) { + return true; } - if (this._imageProcessingConfiguration) { - this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add(() => { - this._markAllSubMeshesAsImageProcessingDirty(); - }); + for (const node of nodeList) { + if (node.useLogarithmicDepth) { + return true; + } } + return false; } - /** - * Get a block by its name - * @param name defines the name of the block to retrieve - * @returns the required block or null if not found - */ - getBlockByName(name69) { - let result = null; - for (const block of this.attachedBlocks) { - if (block.name === name69) { - if (!result) { - result = block; - } else { - Tools.Warn("More than one block was found with the name `" + name69 + "`"); - return result; - } - } + _buildBlock(state) { + super._buildBlock(state); + const input = this.vector; + state.compilationString += `gl_Position = ${input.associatedVariableName}; +`; + if (this._isLogarithmicDepthEnabled(state.sharedData.fragmentOutputNodes, state.sharedData.nodeMaterial.useLogarithmicDepth)) { + state._emitUniformFromString("logarithmicDepthConstant", "float"); + state._emitVaryingFromString("vFragmentDepth", "float"); + state.compilationString += `vFragmentDepth = 1.0 + gl_Position.w; +`; + state.compilationString += `gl_Position.z = log2(max(0.000001, vFragmentDepth)) * logarithmicDepthConstant; +`; } - return result; + return this; } +}; +RegisterClass("BABYLON.VertexOutputBlock", VertexOutputBlock); + +// node_modules/@babylonjs/core/Decorators/nodeDecorator.js +var PropertyTypeForEdition; +(function(PropertyTypeForEdition2) { + PropertyTypeForEdition2[PropertyTypeForEdition2["Boolean"] = 0] = "Boolean"; + PropertyTypeForEdition2[PropertyTypeForEdition2["Float"] = 1] = "Float"; + PropertyTypeForEdition2[PropertyTypeForEdition2["Int"] = 2] = "Int"; + PropertyTypeForEdition2[PropertyTypeForEdition2["Vector2"] = 3] = "Vector2"; + PropertyTypeForEdition2[PropertyTypeForEdition2["List"] = 4] = "List"; +})(PropertyTypeForEdition || (PropertyTypeForEdition = {})); +function editableInPropertyPage(displayName, propertyType = PropertyTypeForEdition.Boolean, groupName = "PROPERTIES", options) { + return (target, propertyKey) => { + let propStore = target._propStore; + if (!propStore) { + propStore = []; + target._propStore = propStore; + } + propStore.push({ + propertyName: propertyKey, + displayName, + type: propertyType, + groupName, + options: options ?? {} + }); + }; +} + +// node_modules/@babylonjs/core/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +var FragmentOutputBlock = class extends NodeMaterialBlock { /** - * Get a block using a predicate - * @param predicate defines the predicate used to find the good candidate - * @returns the required block or null if not found + * Create a new FragmentOutputBlock + * @param name defines the block name */ - getBlockByPredicate(predicate) { - for (const block of this.attachedBlocks) { - if (predicate(block)) { - return block; - } - } - return null; + constructor(name69) { + super(name69, NodeMaterialBlockTargets.Fragment, true); + this.convertToGammaSpace = false; + this.convertToLinearSpace = false; + this.useLogarithmicDepth = false; + this.registerInput("rgba", NodeMaterialBlockConnectionPointTypes.Color4, true); + this.registerInput("rgb", NodeMaterialBlockConnectionPointTypes.AutoDetect, true); + this.registerInput("a", NodeMaterialBlockConnectionPointTypes.Float, true); + this.rgb.addExcludedConnectionPointFromAllowedTypes(NodeMaterialBlockConnectionPointTypes.Color3 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Float); } /** - * Get an input block using a predicate - * @param predicate defines the predicate used to find the good candidate - * @returns the required input block or null if not found + * Gets the current class name + * @returns the class name */ - getInputBlockByPredicate(predicate) { - for (const block of this.attachedBlocks) { - if (block.isInput && predicate(block)) { - return block; - } - } - return null; + getClassName() { + return "FragmentOutputBlock"; } /** - * Gets the list of input blocks attached to this material - * @returns an array of InputBlocks + * Initialize the block and prepare the context for build + * @param state defines the state that will be used for the build */ - getInputBlocks() { - const blocks = []; - for (const block of this.attachedBlocks) { - if (block.isInput) { - blocks.push(block); - } - } - return blocks; + initialize(state) { + state._excludeVariableName("logarithmicDepthConstant"); + state._excludeVariableName("vFragmentDepth"); } /** - * Adds a new optimizer to the list of optimizers - * @param optimizer defines the optimizers to add - * @returns the current material + * Gets the rgba input component */ - registerOptimizer(optimizer) { - const index = this._optimizers.indexOf(optimizer); - if (index > -1) { - return; - } - this._optimizers.push(optimizer); - return this; + get rgba() { + return this._inputs[0]; } /** - * Remove an optimizer from the list of optimizers - * @param optimizer defines the optimizers to remove - * @returns the current material + * Gets the rgb input component */ - unregisterOptimizer(optimizer) { - const index = this._optimizers.indexOf(optimizer); - if (index === -1) { - return; - } - this._optimizers.splice(index, 1); - return this; + get rgb() { + return this._inputs[1]; } /** - * Add a new block to the list of output nodes - * @param node defines the node to add - * @returns the current material + * Gets the a input component */ - addOutputNode(node) { - if (node.target === null) { - throw "This node is not meant to be an output node. You may want to explicitly set its target value."; - } - if ((node.target & NodeMaterialBlockTargets.Vertex) !== 0) { - this._addVertexOutputNode(node); - } - if ((node.target & NodeMaterialBlockTargets.Fragment) !== 0) { - this._addFragmentOutputNode(node); + get a() { + return this._inputs[2]; + } + prepareDefines(mesh, nodeMaterial, defines) { + defines.setValue(this._linearDefineName, this.convertToLinearSpace, true); + defines.setValue(this._gammaDefineName, this.convertToGammaSpace, true); + } + bind(effect, nodeMaterial, mesh) { + if ((this.useLogarithmicDepth || nodeMaterial.useLogarithmicDepth) && mesh) { + BindLogDepth(void 0, effect, mesh.getScene()); } - return this; } - /** - * Remove a block from the list of root nodes - * @param node defines the node to remove - * @returns the current material - */ - removeOutputNode(node) { - if (node.target === null) { - return this; + _buildBlock(state) { + super._buildBlock(state); + const rgba = this.rgba; + const rgb = this.rgb; + const a = this.a; + state.sharedData.hints.needAlphaBlending = rgba.isConnected || a.isConnected; + state.sharedData.blocksWithDefines.push(this); + if (this.useLogarithmicDepth || state.sharedData.nodeMaterial.useLogarithmicDepth) { + state._emitUniformFromString("logarithmicDepthConstant", "float"); + state._emitVaryingFromString("vFragmentDepth", "float"); + state.sharedData.bindableBlocks.push(this); } - if ((node.target & NodeMaterialBlockTargets.Vertex) !== 0) { - this._removeVertexOutputNode(node); + this._linearDefineName = state._getFreeDefineName("CONVERTTOLINEAR"); + this._gammaDefineName = state._getFreeDefineName("CONVERTTOGAMMA"); + const comments = `//${this.name}`; + state._emitFunctionFromInclude("helperFunctions", comments); + if (rgba.connectedPoint) { + if (a.isConnected) { + state.compilationString += `gl_FragColor = vec4(${rgba.associatedVariableName}.rgb, ${a.associatedVariableName}); +`; + } else { + state.compilationString += `gl_FragColor = ${rgba.associatedVariableName}; +`; + } + } else if (rgb.connectedPoint) { + let aValue = "1.0"; + if (a.connectedPoint) { + aValue = a.associatedVariableName; + } + if (rgb.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Float) { + state.compilationString += `gl_FragColor = vec4(${rgb.associatedVariableName}, ${rgb.associatedVariableName}, ${rgb.associatedVariableName}, ${aValue}); +`; + } else { + state.compilationString += `gl_FragColor = vec4(${rgb.associatedVariableName}, ${aValue}); +`; + } + } else { + state.sharedData.checks.notConnectedNonOptionalInputs.push(rgba); } - if ((node.target & NodeMaterialBlockTargets.Fragment) !== 0) { - this._removeFragmentOutputNode(node); + state.compilationString += `#ifdef ${this._linearDefineName} +`; + state.compilationString += `gl_FragColor = toLinearSpace(gl_FragColor); +`; + state.compilationString += `#endif +`; + state.compilationString += `#ifdef ${this._gammaDefineName} +`; + state.compilationString += `gl_FragColor = toGammaSpace(gl_FragColor); +`; + state.compilationString += `#endif +`; + if (this.useLogarithmicDepth || state.sharedData.nodeMaterial.useLogarithmicDepth) { + state.compilationString += `gl_FragDepthEXT = log2(vFragmentDepth) * logarithmicDepthConstant * 0.5; +`; } + state.compilationString += `#if defined(PREPASS)\r +`; + state.compilationString += `gl_FragData[0] = gl_FragColor;\r +`; + state.compilationString += `#endif\r +`; return this; } - _addVertexOutputNode(node) { - if (this._vertexOutputNodes.indexOf(node) !== -1) { - return; - } - node.target = NodeMaterialBlockTargets.Vertex; - this._vertexOutputNodes.push(node); - return this; + _dumpPropertiesCode() { + let codeString = super._dumpPropertiesCode(); + codeString += `${this._codeVariableName}.convertToGammaSpace = ${this.convertToGammaSpace}; +`; + codeString += `${this._codeVariableName}.convertToLinearSpace = ${this.convertToLinearSpace}; +`; + codeString += `${this._codeVariableName}.useLogarithmicDepth = ${this.useLogarithmicDepth}; +`; + return codeString; } - _removeVertexOutputNode(node) { - const index = this._vertexOutputNodes.indexOf(node); - if (index === -1) { - return; - } - this._vertexOutputNodes.splice(index, 1); - return this; + serialize() { + const serializationObject = super.serialize(); + serializationObject.convertToGammaSpace = this.convertToGammaSpace; + serializationObject.convertToLinearSpace = this.convertToLinearSpace; + serializationObject.useLogarithmicDepth = this.useLogarithmicDepth; + return serializationObject; } - _addFragmentOutputNode(node) { - if (this._fragmentOutputNodes.indexOf(node) !== -1) { - return; - } - node.target = NodeMaterialBlockTargets.Fragment; - this._fragmentOutputNodes.push(node); - return this; + _deserialize(serializationObject, scene, rootUrl) { + super._deserialize(serializationObject, scene, rootUrl); + this.convertToGammaSpace = serializationObject.convertToGammaSpace; + this.convertToLinearSpace = serializationObject.convertToLinearSpace; + this.useLogarithmicDepth = serializationObject.useLogarithmicDepth ?? false; } - _removeFragmentOutputNode(node) { - const index = this._fragmentOutputNodes.indexOf(node); - if (index === -1) { - return; +}; +__decorate([ + editableInPropertyPage("Convert to gamma space", PropertyTypeForEdition.Boolean, "PROPERTIES", { notifiers: { update: true } }) +], FragmentOutputBlock.prototype, "convertToGammaSpace", void 0); +__decorate([ + editableInPropertyPage("Convert to linear space", PropertyTypeForEdition.Boolean, "PROPERTIES", { notifiers: { update: true } }) +], FragmentOutputBlock.prototype, "convertToLinearSpace", void 0); +__decorate([ + editableInPropertyPage("Use logarithmic depth", PropertyTypeForEdition.Boolean, "PROPERTIES") +], FragmentOutputBlock.prototype, "useLogarithmicDepth", void 0); +RegisterClass("BABYLON.FragmentOutputBlock", FragmentOutputBlock); + +// node_modules/@babylonjs/core/Materials/Node/Enums/nodeMaterialBlockConnectionPointMode.js +var NodeMaterialBlockConnectionPointMode; +(function(NodeMaterialBlockConnectionPointMode2) { + NodeMaterialBlockConnectionPointMode2[NodeMaterialBlockConnectionPointMode2["Uniform"] = 0] = "Uniform"; + NodeMaterialBlockConnectionPointMode2[NodeMaterialBlockConnectionPointMode2["Attribute"] = 1] = "Attribute"; + NodeMaterialBlockConnectionPointMode2[NodeMaterialBlockConnectionPointMode2["Varying"] = 2] = "Varying"; + NodeMaterialBlockConnectionPointMode2[NodeMaterialBlockConnectionPointMode2["Undefined"] = 3] = "Undefined"; +})(NodeMaterialBlockConnectionPointMode || (NodeMaterialBlockConnectionPointMode = {})); + +// node_modules/@babylonjs/core/Materials/Node/Enums/nodeMaterialSystemValues.js +var NodeMaterialSystemValues; +(function(NodeMaterialSystemValues2) { + NodeMaterialSystemValues2[NodeMaterialSystemValues2["World"] = 1] = "World"; + NodeMaterialSystemValues2[NodeMaterialSystemValues2["View"] = 2] = "View"; + NodeMaterialSystemValues2[NodeMaterialSystemValues2["Projection"] = 3] = "Projection"; + NodeMaterialSystemValues2[NodeMaterialSystemValues2["ViewProjection"] = 4] = "ViewProjection"; + NodeMaterialSystemValues2[NodeMaterialSystemValues2["WorldView"] = 5] = "WorldView"; + NodeMaterialSystemValues2[NodeMaterialSystemValues2["WorldViewProjection"] = 6] = "WorldViewProjection"; + NodeMaterialSystemValues2[NodeMaterialSystemValues2["CameraPosition"] = 7] = "CameraPosition"; + NodeMaterialSystemValues2[NodeMaterialSystemValues2["FogColor"] = 8] = "FogColor"; + NodeMaterialSystemValues2[NodeMaterialSystemValues2["DeltaTime"] = 9] = "DeltaTime"; + NodeMaterialSystemValues2[NodeMaterialSystemValues2["CameraParameters"] = 10] = "CameraParameters"; + NodeMaterialSystemValues2[NodeMaterialSystemValues2["MaterialAlpha"] = 11] = "MaterialAlpha"; +})(NodeMaterialSystemValues || (NodeMaterialSystemValues = {})); + +// node_modules/@babylonjs/core/Maths/math.path.js +var Orientation; +(function(Orientation2) { + Orientation2[Orientation2["CW"] = 0] = "CW"; + Orientation2[Orientation2["CCW"] = 1] = "CCW"; +})(Orientation || (Orientation = {})); +var BezierCurve = class { + /** + * Returns the cubic Bezier interpolated value (float) at "t" (float) from the given x1, y1, x2, y2 floats + * @param t defines the time + * @param x1 defines the left coordinate on X axis + * @param y1 defines the left coordinate on Y axis + * @param x2 defines the right coordinate on X axis + * @param y2 defines the right coordinate on Y axis + * @returns the interpolated value + */ + static Interpolate(t, x1, y1, x2, y2) { + const f0 = 1 - 3 * x2 + 3 * x1; + const f1 = 3 * x2 - 6 * x1; + const f2 = 3 * x1; + let refinedT = t; + for (let i = 0; i < 5; i++) { + const refinedT2 = refinedT * refinedT; + const refinedT3 = refinedT2 * refinedT; + const x = f0 * refinedT3 + f1 * refinedT2 + f2 * refinedT; + const slope = 1 / (3 * f0 * refinedT2 + 2 * f1 * refinedT + f2); + refinedT -= (x - t) * slope; + refinedT = Math.min(1, Math.max(0, refinedT)); } - this._fragmentOutputNodes.splice(index, 1); - return this; + return 3 * Math.pow(1 - refinedT, 2) * refinedT * y1 + 3 * (1 - refinedT) * Math.pow(refinedT, 2) * y2 + Math.pow(refinedT, 3); } +}; +var Angle = class _Angle { /** - * Specifies if the material will require alpha blending - * @returns a boolean specifying if alpha blending is needed + * Creates an Angle object of "radians" radians (float). + * @param radians the angle in radians */ - needAlphaBlending() { - if (this.ignoreAlpha) { - return false; + constructor(radians) { + this._radians = radians; + if (this._radians < 0) { + this._radians += 2 * Math.PI; } - return this.forceAlphaBlending || this.alpha < 1 || this._sharedData && this._sharedData.hints.needAlphaBlending; } /** - * Specifies if this material should be rendered in alpha test mode - * @returns a boolean specifying if an alpha test is needed. + * Get value in degrees + * @returns the Angle value in degrees (float) */ - needAlphaTesting() { - return this._sharedData && this._sharedData.hints.needAlphaTesting; + degrees() { + return this._radians * 180 / Math.PI; } - _processInitializeOnLink(block, state, nodesToProcessForOtherBuildState, autoConfigure = true) { - if (block.target === NodeMaterialBlockTargets.VertexAndFragment) { - nodesToProcessForOtherBuildState.push(block); - } else if (state.target === NodeMaterialBlockTargets.Fragment && block.target === NodeMaterialBlockTargets.Vertex && block._preparationId !== this._buildId) { - nodesToProcessForOtherBuildState.push(block); - } - this._initializeBlock(block, state, nodesToProcessForOtherBuildState, autoConfigure); + /** + * Get value in radians + * @returns the Angle value in radians (float) + */ + radians() { + return this._radians; } - _initializeBlock(node, state, nodesToProcessForOtherBuildState, autoConfigure = true) { - node.initialize(state); - if (autoConfigure) { - node.autoConfigure(this); - } - node._preparationId = this._buildId; - if (this.attachedBlocks.indexOf(node) === -1) { - if (node.isUnique) { - const className2 = node.getClassName(); - for (const other of this.attachedBlocks) { - if (other.getClassName() === className2) { - throw `Cannot have multiple blocks of type ${className2} in the same NodeMaterial`; - } - } - } - this.attachedBlocks.push(node); - } - for (const input of node.inputs) { - input.associatedVariableName = ""; - const connectedPoint = input.connectedPoint; - if (connectedPoint) { - const block = connectedPoint.ownerBlock; - if (block !== node) { - this._processInitializeOnLink(block, state, nodesToProcessForOtherBuildState, autoConfigure); - } - } - } - if (node.isTeleportOut) { - const teleport = node; - if (teleport.entryPoint) { - this._processInitializeOnLink(teleport.entryPoint, state, nodesToProcessForOtherBuildState, autoConfigure); - } - } - for (const output of node.outputs) { - output.associatedVariableName = ""; - } + /** + * Gets a new Angle object with a value of the angle (in radians) between the line connecting the two points and the x-axis + * @param a defines first point as the origin + * @param b defines point + * @returns a new Angle + */ + static BetweenTwoPoints(a, b) { + const delta = b.subtract(a); + const theta = Math.atan2(delta.y, delta.x); + return new _Angle(theta); } - _resetDualBlocks(node, id) { - if (node.target === NodeMaterialBlockTargets.VertexAndFragment) { - node.buildId = id; - } - for (const inputs of node.inputs) { - const connectedPoint = inputs.connectedPoint; - if (connectedPoint) { - const block = connectedPoint.ownerBlock; - if (block !== node) { - this._resetDualBlocks(block, id); - } - } - } - if (node.isTeleportOut) { - const teleportOut = node; - if (teleportOut.entryPoint) { - this._resetDualBlocks(teleportOut.entryPoint, id); - } - } + /** + * Gets the angle between the two vectors + * @param a defines first vector + * @param b defines vector + * @returns Returns an new Angle between 0 and PI + */ + static BetweenTwoVectors(a, b) { + let product = a.lengthSquared() * b.lengthSquared(); + if (product === 0) + return new _Angle(Math.PI / 2); + product = Math.sqrt(product); + let cosVal = a.dot(b) / product; + cosVal = Scalar.Clamp(cosVal, -1, 1); + const angle = Math.acos(cosVal); + return new _Angle(angle); } /** - * Remove a block from the current node material - * @param block defines the block to remove + * Gets a new Angle object from the given float in radians + * @param radians defines the angle value in radians + * @returns a new Angle */ - removeBlock(block) { - const attachedBlockIndex = this.attachedBlocks.indexOf(block); - if (attachedBlockIndex > -1) { - this.attachedBlocks.splice(attachedBlockIndex, 1); - } - if (block.isFinalMerger) { - this.removeOutputNode(block); - } + static FromRadians(radians) { + return new _Angle(radians); } /** - * Build the material and generates the inner effect - * @param verbose defines if the build should log activity - * @param updateBuildId defines if the internal build Id should be updated (default is true) - * @param autoConfigure defines if the autoConfigure method should be called when initializing blocks (default is false) + * Gets a new Angle object from the given float in degrees + * @param degrees defines the angle value in degrees + * @returns a new Angle */ - build(verbose = false, updateBuildId = true, autoConfigure = false) { - if (!this._vertexCompilationState && !autoConfigure) { - autoConfigure = true; - } - this._buildWasSuccessful = false; - const engine = this.getScene().getEngine(); - const allowEmptyVertexProgram = this._mode === NodeMaterialModes.Particle; - if (this._vertexOutputNodes.length === 0 && !allowEmptyVertexProgram) { - throw "You must define at least one vertexOutputNode"; + static FromDegrees(degrees) { + return new _Angle(degrees * Math.PI / 180); + } +}; +var Arc2 = class { + /** + * Creates an Arc object from the three given points : start, middle and end. + * @param startPoint Defines the start point of the arc + * @param midPoint Defines the middle point of the arc + * @param endPoint Defines the end point of the arc + */ + constructor(startPoint, midPoint, endPoint) { + this.startPoint = startPoint; + this.midPoint = midPoint; + this.endPoint = endPoint; + const temp = Math.pow(midPoint.x, 2) + Math.pow(midPoint.y, 2); + const startToMid = (Math.pow(startPoint.x, 2) + Math.pow(startPoint.y, 2) - temp) / 2; + const midToEnd = (temp - Math.pow(endPoint.x, 2) - Math.pow(endPoint.y, 2)) / 2; + const det = (startPoint.x - midPoint.x) * (midPoint.y - endPoint.y) - (midPoint.x - endPoint.x) * (startPoint.y - midPoint.y); + this.centerPoint = new Vector2((startToMid * (midPoint.y - endPoint.y) - midToEnd * (startPoint.y - midPoint.y)) / det, ((startPoint.x - midPoint.x) * midToEnd - (midPoint.x - endPoint.x) * startToMid) / det); + this.radius = this.centerPoint.subtract(this.startPoint).length(); + this.startAngle = Angle.BetweenTwoPoints(this.centerPoint, this.startPoint); + const a1 = this.startAngle.degrees(); + let a2 = Angle.BetweenTwoPoints(this.centerPoint, this.midPoint).degrees(); + let a3 = Angle.BetweenTwoPoints(this.centerPoint, this.endPoint).degrees(); + if (a2 - a1 > 180) { + a2 -= 360; } - if (this._fragmentOutputNodes.length === 0) { - throw "You must define at least one fragmentOutputNode"; + if (a2 - a1 < -180) { + a2 += 360; } - this._vertexCompilationState = new NodeMaterialBuildState(); - this._vertexCompilationState.supportUniformBuffers = engine.supportsUniformBuffers; - this._vertexCompilationState.target = NodeMaterialBlockTargets.Vertex; - this._fragmentCompilationState = new NodeMaterialBuildState(); - this._fragmentCompilationState.supportUniformBuffers = engine.supportsUniformBuffers; - this._fragmentCompilationState.target = NodeMaterialBlockTargets.Fragment; - this._sharedData = new NodeMaterialBuildStateSharedData(); - this._sharedData.nodeMaterial = this; - this._sharedData.fragmentOutputNodes = this._fragmentOutputNodes; - this._vertexCompilationState.sharedData = this._sharedData; - this._fragmentCompilationState.sharedData = this._sharedData; - this._sharedData.buildId = this._buildId; - this._sharedData.emitComments = this._options.emitComments; - this._sharedData.verbose = verbose; - this._sharedData.scene = this.getScene(); - this._sharedData.allowEmptyVertexProgram = allowEmptyVertexProgram; - const vertexNodes = []; - const fragmentNodes = []; - for (const vertexOutputNode of this._vertexOutputNodes) { - vertexNodes.push(vertexOutputNode); - this._initializeBlock(vertexOutputNode, this._vertexCompilationState, fragmentNodes, autoConfigure); + if (a3 - a2 > 180) { + a3 -= 360; } - for (const fragmentOutputNode of this._fragmentOutputNodes) { - fragmentNodes.push(fragmentOutputNode); - this._initializeBlock(fragmentOutputNode, this._fragmentCompilationState, vertexNodes, autoConfigure); + if (a3 - a2 < -180) { + a3 += 360; } - this.optimize(); - for (const vertexOutputNode of vertexNodes) { - vertexOutputNode.build(this._vertexCompilationState, vertexNodes); + this.orientation = a2 - a1 < 0 ? Orientation.CW : Orientation.CCW; + this.angle = Angle.FromDegrees(this.orientation === Orientation.CW ? a1 - a3 : a3 - a1); + } +}; +var Path2 = class _Path2 { + /** + * Creates a Path2 object from the starting 2D coordinates x and y. + * @param x the starting points x value + * @param y the starting points y value + */ + constructor(x, y) { + this._points = new Array(); + this._length = 0; + this.closed = false; + this._points.push(new Vector2(x, y)); + } + /** + * Adds a new segment until the given coordinates (x, y) to the current Path2. + * @param x the added points x value + * @param y the added points y value + * @returns the updated Path2. + */ + addLineTo(x, y) { + if (this.closed) { + return this; } - this._fragmentCompilationState.uniforms = this._vertexCompilationState.uniforms.slice(0); - this._fragmentCompilationState._uniformDeclaration = this._vertexCompilationState._uniformDeclaration; - this._fragmentCompilationState._constantDeclaration = this._vertexCompilationState._constantDeclaration; - this._fragmentCompilationState._vertexState = this._vertexCompilationState; - for (const fragmentOutputNode of fragmentNodes) { - this._resetDualBlocks(fragmentOutputNode, this._buildId - 1); + const newPoint = new Vector2(x, y); + const previousPoint = this._points[this._points.length - 1]; + this._points.push(newPoint); + this._length += newPoint.subtract(previousPoint).length(); + return this; + } + /** + * Adds _numberOfSegments_ segments according to the arc definition (middle point coordinates, end point coordinates, the arc start point being the current Path2 last point) to the current Path2. + * @param midX middle point x value + * @param midY middle point y value + * @param endX end point x value + * @param endY end point y value + * @param numberOfSegments (default: 36) + * @returns the updated Path2. + */ + addArcTo(midX, midY, endX, endY, numberOfSegments = 36) { + if (this.closed) { + return this; } - for (const fragmentOutputNode of fragmentNodes) { - fragmentOutputNode.build(this._fragmentCompilationState, fragmentNodes); + const startPoint = this._points[this._points.length - 1]; + const midPoint = new Vector2(midX, midY); + const endPoint = new Vector2(endX, endY); + const arc = new Arc2(startPoint, midPoint, endPoint); + let increment = arc.angle.radians() / numberOfSegments; + if (arc.orientation === Orientation.CW) { + increment *= -1; } - this._vertexCompilationState.finalize(this._vertexCompilationState); - this._fragmentCompilationState.finalize(this._fragmentCompilationState); - if (updateBuildId) { - this._buildId = _NodeMaterial._BuildIdGenerator++; + let currentAngle = arc.startAngle.radians() + increment; + for (let i = 0; i < numberOfSegments; i++) { + const x = Math.cos(currentAngle) * arc.radius + arc.centerPoint.x; + const y = Math.sin(currentAngle) * arc.radius + arc.centerPoint.y; + this.addLineTo(x, y); + currentAngle += increment; } - this._sharedData.emitErrors(); - if (verbose) { - Logger.Log("Vertex shader:"); - Logger.Log(this._vertexCompilationState.compilationString); - Logger.Log("Fragment shader:"); - Logger.Log(this._fragmentCompilationState.compilationString); + return this; + } + /** + * Adds _numberOfSegments_ segments according to the quadratic curve definition to the current Path2. + * @param controlX control point x value + * @param controlY control point y value + * @param endX end point x value + * @param endY end point y value + * @param numberOfSegments (default: 36) + * @returns the updated Path2. + */ + addQuadraticCurveTo(controlX, controlY, endX, endY, numberOfSegments = 36) { + if (this.closed) { + return this; } - this._buildWasSuccessful = true; - this.onBuildObservable.notifyObservers(this); - const meshes = this.getScene().meshes; - for (const mesh of meshes) { - if (!mesh.subMeshes) { - continue; - } - for (const subMesh of mesh.subMeshes) { - if (subMesh.getMaterial() !== this) { + const equation = (t, val0, val1, val2) => { + const res = (1 - t) * (1 - t) * val0 + 2 * t * (1 - t) * val1 + t * t * val2; + return res; + }; + const startPoint = this._points[this._points.length - 1]; + for (let i = 0; i <= numberOfSegments; i++) { + const step = i / numberOfSegments; + const x = equation(step, startPoint.x, controlX, endX); + const y = equation(step, startPoint.y, controlY, endY); + this.addLineTo(x, y); + } + return this; + } + /** + * Adds _numberOfSegments_ segments according to the bezier curve definition to the current Path2. + * @param originTangentX tangent vector at the origin point x value + * @param originTangentY tangent vector at the origin point y value + * @param destinationTangentX tangent vector at the destination point x value + * @param destinationTangentY tangent vector at the destination point y value + * @param endX end point x value + * @param endY end point y value + * @param numberOfSegments (default: 36) + * @returns the updated Path2. + */ + addBezierCurveTo(originTangentX, originTangentY, destinationTangentX, destinationTangentY, endX, endY, numberOfSegments = 36) { + if (this.closed) { + return this; + } + const equation = (t, val0, val1, val2, val3) => { + const res = (1 - t) * (1 - t) * (1 - t) * val0 + 3 * t * (1 - t) * (1 - t) * val1 + 3 * t * t * (1 - t) * val2 + t * t * t * val3; + return res; + }; + const startPoint = this._points[this._points.length - 1]; + for (let i = 0; i <= numberOfSegments; i++) { + const step = i / numberOfSegments; + const x = equation(step, startPoint.x, originTangentX, destinationTangentX, endX); + const y = equation(step, startPoint.y, originTangentY, destinationTangentY, endY); + this.addLineTo(x, y); + } + return this; + } + /** + * Defines if a given point is inside the polygon defines by the path + * @param point defines the point to test + * @returns true if the point is inside + */ + isPointInside(point) { + let isInside = false; + const count = this._points.length; + for (let p = count - 1, q = 0; q < count; p = q++) { + let edgeLow = this._points[p]; + let edgeHigh = this._points[q]; + let edgeDx = edgeHigh.x - edgeLow.x; + let edgeDy = edgeHigh.y - edgeLow.y; + if (Math.abs(edgeDy) > Number.EPSILON) { + if (edgeDy < 0) { + edgeLow = this._points[q]; + edgeDx = -edgeDx; + edgeHigh = this._points[p]; + edgeDy = -edgeDy; + } + if (point.y < edgeLow.y || point.y > edgeHigh.y) { continue; } - if (!subMesh.materialDefines) { + if (point.y === edgeLow.y && point.x === edgeLow.x) { + return true; + } else { + const perpEdge = edgeDy * (point.x - edgeLow.x) - edgeDx * (point.y - edgeLow.y); + if (perpEdge === 0) { + return true; + } + if (perpEdge < 0) { + continue; + } + isInside = !isInside; + } + } else { + if (point.y !== edgeLow.y) { continue; } - const defines = subMesh.materialDefines; - defines.markAllAsDirty(); - defines.reset(); + if (edgeHigh.x <= point.x && point.x <= edgeLow.x || edgeLow.x <= point.x && point.x <= edgeHigh.x) { + return true; + } } } - if (this.prePassTextureInputs.length) { - this.getScene().enablePrePassRenderer(); - } - const prePassRenderer = this.getScene().prePassRenderer; - if (prePassRenderer) { - prePassRenderer.markAsDirty(); - } + return isInside; } /** - * Runs an otpimization phase to try to improve the shader code + * Closes the Path2. + * @returns the Path2. */ - optimize() { - for (const optimizer of this._optimizers) { - optimizer.optimize(this._vertexOutputNodes, this._fragmentOutputNodes); - } + close() { + this.closed = true; + return this; } - _prepareDefinesForAttributes(mesh, defines) { - const oldNormal = defines["NORMAL"]; - const oldTangent = defines["TANGENT"]; - const oldColor = defines["VERTEXCOLOR_NME"]; - defines["NORMAL"] = mesh.isVerticesDataPresent(VertexBuffer.NormalKind); - defines["TANGENT"] = mesh.isVerticesDataPresent(VertexBuffer.TangentKind); - const hasVertexColors = mesh.useVertexColors && mesh.isVerticesDataPresent(VertexBuffer.ColorKind); - defines["VERTEXCOLOR_NME"] = hasVertexColors; - let uvChanged = false; - for (let i = 1; i <= 6; ++i) { - const oldUV = defines["UV" + i]; - defines["UV" + i] = mesh.isVerticesDataPresent(`uv${i === 1 ? "" : i}`); - uvChanged = uvChanged || defines["UV" + i] !== oldUV; + /** + * Gets the sum of the distance between each sequential point in the path + * @returns the Path2 total length (float). + */ + length() { + let result = this._length; + if (this.closed) { + const lastPoint = this._points[this._points.length - 1]; + const firstPoint = this._points[0]; + result += firstPoint.subtract(lastPoint).length(); } - const oit = this.needAlphaBlendingForMesh(mesh) && this.getScene().useOrderIndependentTransparency; - PrepareDefinesForPrePass(this.getScene(), defines, !oit); - if (oldNormal !== defines["NORMAL"] || oldTangent !== defines["TANGENT"] || oldColor !== defines["VERTEXCOLOR_NME"] || uvChanged) { - defines.markAsAttributesDirty(); + return result; + } + /** + * Gets the area of the polygon defined by the path + * @returns area value + */ + area() { + const n = this._points.length; + let value = 0; + for (let p = n - 1, q = 0; q < n; p = q++) { + value += this._points[p].x * this._points[q].y - this._points[q].x * this._points[p].y; } + return value * 0.5; } /** - * Can this material render to prepass + * Gets the points which construct the path + * @returns the Path2 internal array of points. */ - get isPrePassCapable() { - return true; + getPoints() { + return this._points; } /** - * Outputs written to the prepass + * Retrieves the point at the distance aways from the starting point + * @param normalizedLengthPosition the length along the path to retrieve the point from + * @returns a new Vector2 located at a percentage of the Path2 total length on this path. */ - get prePassTextureOutputs() { - const prePassOutputBlock = this.getBlockByPredicate((block) => block.getClassName() === "PrePassOutputBlock"); - const result = [4]; - if (!prePassOutputBlock) { - return result; - } - if (this.prePassTextureInputs.length) { - return result; - } - if (prePassOutputBlock.viewDepth.isConnected) { - result.push(5); - } - if (prePassOutputBlock.viewNormal.isConnected) { - result.push(6); + getPointAtLengthPosition(normalizedLengthPosition) { + if (normalizedLengthPosition < 0 || normalizedLengthPosition > 1) { + return Vector2.Zero(); } - if (prePassOutputBlock.worldPosition.isConnected) { - result.push(1); + const lengthPosition = normalizedLengthPosition * this.length(); + let previousOffset = 0; + for (let i = 0; i < this._points.length; i++) { + const j = (i + 1) % this._points.length; + const a = this._points[i]; + const b = this._points[j]; + const bToA = b.subtract(a); + const nextOffset = bToA.length() + previousOffset; + if (lengthPosition >= previousOffset && lengthPosition <= nextOffset) { + const dir = bToA.normalize(); + const localOffset = lengthPosition - previousOffset; + return new Vector2(a.x + dir.x * localOffset, a.y + dir.y * localOffset); + } + previousOffset = nextOffset; } - return result; + return Vector2.Zero(); } /** - * Gets the list of prepass texture required + * Creates a new path starting from an x and y position + * @param x starting x value + * @param y starting y value + * @returns a new Path2 starting at the coordinates (x, y). */ - get prePassTextureInputs() { - const prePassTextureBlocks = this.getAllTextureBlocks().filter((block) => block.getClassName() === "PrePassTextureBlock"); - const result = []; - for (const block of prePassTextureBlocks) { - if (block.position.isConnected && !result.includes(1)) { - result.push(1); - } - if (block.depth.isConnected && !result.includes(5)) { - result.push(5); - } - if (block.normal.isConnected && !result.includes(6)) { - result.push(6); - } - } - return result; + static StartingAt(x, y) { + return new _Path2(x, y); } +}; +var Path3D = class _Path3D { /** - * Sets the required values to the prepass renderer. - * @param prePassRenderer defines the prepass renderer to set - * @returns true if the pre pass is needed + * new Path3D(path, normal, raw) + * Creates a Path3D. A Path3D is a logical math object, so not a mesh. + * please read the description in the tutorial : https://doc.babylonjs.com/features/featuresDeepDive/mesh/path3D + * @param path an array of Vector3, the curve axis of the Path3D + * @param firstNormal (options) Vector3, the first wanted normal to the curve. Ex (0, 1, 0) for a vertical normal. + * @param raw (optional, default false) : boolean, if true the returned Path3D isn't normalized. Useful to depict path acceleration or speed. + * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path. */ - setPrePassRenderer(prePassRenderer) { - const prePassTexturesRequired = this.prePassTextureInputs.concat(this.prePassTextureOutputs); - if (prePassRenderer && prePassTexturesRequired.length > 1) { - let cfg = prePassRenderer.getEffectConfiguration("nodeMaterial"); - if (!cfg) { - cfg = prePassRenderer.addEffectConfiguration({ - enabled: true, - needsImageProcessing: false, - name: "nodeMaterial", - texturesRequired: [] - }); - } - for (const prePassTexture of prePassTexturesRequired) { - if (!cfg.texturesRequired.includes(prePassTexture)) { - cfg.texturesRequired.push(prePassTexture); - } - } - cfg.enabled = true; + constructor(path, firstNormal = null, raw, alignTangentsWithPath = false) { + this.path = path; + this._curve = new Array(); + this._distances = new Array(); + this._tangents = new Array(); + this._normals = new Array(); + this._binormals = new Array(); + this._pointAtData = { + id: 0, + point: Vector3.Zero(), + previousPointArrayIndex: 0, + position: 0, + subPosition: 0, + interpolateReady: false, + interpolationMatrix: Matrix.Identity() + }; + for (let p = 0; p < path.length; p++) { + this._curve[p] = path[p].clone(); } - return prePassTexturesRequired.length > 1; + this._raw = raw || false; + this._alignTangentsWithPath = alignTangentsWithPath; + this._compute(firstNormal, alignTangentsWithPath); } /** - * Create a post process from the material - * @param camera The camera to apply the render pass to. - * @param options The required width/height ratio to downsize to before computing the render pass. (Use 1.0 for full size) - * @param samplingMode The sampling mode to be used when computing the pass. (default: 0) - * @param engine The engine which the post process will be applied. (default: current engine) - * @param reusable If the post process can be reused on the same frame. (default: false) - * @param textureType Type of textures used when performing the post process. (default: 0) - * @param textureFormat Format of textures used when performing the post process. (default: TEXTUREFORMAT_RGBA) - * @returns the post process created + * Returns the Path3D array of successive Vector3 designing its curve. + * @returns the Path3D array of successive Vector3 designing its curve. */ - createPostProcess(camera, options = 1, samplingMode = 1, engine, reusable, textureType = 0, textureFormat = 5) { - if (this.mode !== NodeMaterialModes.PostProcess) { - Logger.Log("Incompatible material mode"); - return null; - } - return this._createEffectForPostProcess(null, camera, options, samplingMode, engine, reusable, textureType, textureFormat); + getCurve() { + return this._curve; } /** - * Create the post process effect from the material - * @param postProcess The post process to create the effect for + * Returns the Path3D array of successive Vector3 designing its curve. + * @returns the Path3D array of successive Vector3 designing its curve. */ - createEffectForPostProcess(postProcess) { - this._createEffectForPostProcess(postProcess); + getPoints() { + return this._curve; } - _createEffectForPostProcess(postProcess, camera, options = 1, samplingMode = 1, engine, reusable, textureType = 0, textureFormat = 5) { - let tempName = this.name + this._buildId; - const defines = new NodeMaterialDefines(); - const dummyMesh = new AbstractMesh(tempName + "PostProcess", this.getScene()); - let buildId = this._buildId; - this._processDefines(dummyMesh, defines); - Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString); - if (!postProcess) { - postProcess = new PostProcess(this.name + "PostProcess", tempName, this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, options, camera, samplingMode, engine, reusable, defines.toString(), textureType, tempName, { maxSimultaneousLights: this.maxSimultaneousLights }, false, textureFormat); - } else { - postProcess.updateEffect(defines.toString(), this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, { maxSimultaneousLights: this.maxSimultaneousLights }, void 0, void 0, tempName, tempName); - } - postProcess.nodeMaterialSource = this; - postProcess.onApplyObservable.add((effect) => { - if (buildId !== this._buildId) { - delete Effect.ShadersStore[tempName + "VertexShader"]; - delete Effect.ShadersStore[tempName + "PixelShader"]; - tempName = this.name + this._buildId; - defines.markAllAsDirty(); - buildId = this._buildId; - } - const result = this._processDefines(dummyMesh, defines); - if (result) { - Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString); - TimingTools.SetImmediate(() => postProcess.updateEffect(defines.toString(), this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, { maxSimultaneousLights: this.maxSimultaneousLights }, void 0, void 0, tempName, tempName)); - } - this._checkInternals(effect); - }); - return postProcess; + /** + * @returns the computed length (float) of the path. + */ + length() { + return this._distances[this._distances.length - 1]; } /** - * Create a new procedural texture based on this node material - * @param size defines the size of the texture - * @param scene defines the hosting scene - * @returns the new procedural texture attached to this node material + * Returns an array populated with tangent vectors on each Path3D curve point. + * @returns an array populated with tangent vectors on each Path3D curve point. */ - createProceduralTexture(size, scene) { - if (this.mode !== NodeMaterialModes.ProceduralTexture) { - Logger.Log("Incompatible material mode"); - return null; - } - let tempName = this.name + this._buildId; - const proceduralTexture = new ProceduralTexture(tempName, size, null, scene); - const dummyMesh = new AbstractMesh(tempName + "Procedural", this.getScene()); - dummyMesh.reservedDataStore = { - hidden: true - }; - const defines = new NodeMaterialDefines(); - const result = this._processDefines(dummyMesh, defines); - Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString); - let effect = this.getScene().getEngine().createEffect({ - vertexElement: tempName, - fragmentElement: tempName - }, [VertexBuffer.PositionKind], this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, defines.toString(), result == null ? void 0 : result.fallbacks, void 0); - proceduralTexture.nodeMaterialSource = this; - proceduralTexture._setEffect(effect); - let buildId = this._buildId; - proceduralTexture.onBeforeGenerationObservable.add(() => { - if (buildId !== this._buildId) { - delete Effect.ShadersStore[tempName + "VertexShader"]; - delete Effect.ShadersStore[tempName + "PixelShader"]; - tempName = this.name + this._buildId; - defines.markAllAsDirty(); - buildId = this._buildId; - } - const result2 = this._processDefines(dummyMesh, defines); - if (result2) { - Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString); - TimingTools.SetImmediate(() => { - effect = this.getScene().getEngine().createEffect({ - vertexElement: tempName, - fragmentElement: tempName - }, [VertexBuffer.PositionKind], this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, defines.toString(), result2 == null ? void 0 : result2.fallbacks, void 0); - proceduralTexture._setEffect(effect); - }); - } - this._checkInternals(effect); - }); - return proceduralTexture; - } - _createEffectForParticles(particleSystem, blendMode, onCompiled, onError, effect, defines, dummyMesh, particleSystemDefinesJoined = "") { - let tempName = this.name + this._buildId + "_" + blendMode; - if (!defines) { - defines = new NodeMaterialDefines(); - } - if (!dummyMesh) { - dummyMesh = this.getScene().getMeshByName(this.name + "Particle"); - if (!dummyMesh) { - dummyMesh = new AbstractMesh(this.name + "Particle", this.getScene()); - dummyMesh.reservedDataStore = { - hidden: true - }; - } - } - let buildId = this._buildId; - const particleSystemDefines = []; - let join = particleSystemDefinesJoined; - if (!effect) { - const result = this._processDefines(dummyMesh, defines); - Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString); - particleSystem.fillDefines(particleSystemDefines, blendMode); - join = particleSystemDefines.join("\n"); - effect = this.getScene().getEngine().createEffectForParticles(tempName, this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, defines.toString() + "\n" + join, result == null ? void 0 : result.fallbacks, onCompiled, onError, particleSystem); - particleSystem.setCustomEffect(effect, blendMode); - } - effect.onBindObservable.add((effect2) => { - if (buildId !== this._buildId) { - delete Effect.ShadersStore[tempName + "PixelShader"]; - tempName = this.name + this._buildId + "_" + blendMode; - defines.markAllAsDirty(); - buildId = this._buildId; - } - particleSystemDefines.length = 0; - particleSystem.fillDefines(particleSystemDefines, blendMode); - const particleSystemDefinesJoinedCurrent = particleSystemDefines.join("\n"); - if (particleSystemDefinesJoinedCurrent !== join) { - defines.markAllAsDirty(); - join = particleSystemDefinesJoinedCurrent; - } - const result = this._processDefines(dummyMesh, defines); - if (result) { - Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString); - effect2 = this.getScene().getEngine().createEffectForParticles(tempName, this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, defines.toString() + "\n" + join, result == null ? void 0 : result.fallbacks, onCompiled, onError, particleSystem); - particleSystem.setCustomEffect(effect2, blendMode); - this._createEffectForParticles(particleSystem, blendMode, onCompiled, onError, effect2, defines, dummyMesh, particleSystemDefinesJoined); - return; - } - this._checkInternals(effect2); - }); - } - _checkInternals(effect) { - if (this._sharedData.animatedInputs) { - const scene = this.getScene(); - const frameId = scene.getFrameId(); - if (this._animationFrame !== frameId) { - for (const input of this._sharedData.animatedInputs) { - input.animate(scene); - } - this._animationFrame = frameId; - } - } - for (const block of this._sharedData.bindableBlocks) { - block.bind(effect, this); - } - for (const inputBlock of this._sharedData.inputBlocks) { - inputBlock._transmit(effect, this.getScene(), this); - } + getTangents() { + return this._tangents; } /** - * Create the effect to be used as the custom effect for a particle system - * @param particleSystem Particle system to create the effect for - * @param onCompiled defines a function to call when the effect creation is successful - * @param onError defines a function to call when the effect creation has failed + * Returns an array populated with normal vectors on each Path3D curve point. + * @returns an array populated with normal vectors on each Path3D curve point. */ - createEffectForParticles(particleSystem, onCompiled, onError) { - if (this.mode !== NodeMaterialModes.Particle) { - Logger.Log("Incompatible material mode"); - return; - } - this._createEffectForParticles(particleSystem, BaseParticleSystem.BLENDMODE_ONEONE, onCompiled, onError); - this._createEffectForParticles(particleSystem, BaseParticleSystem.BLENDMODE_MULTIPLY, onCompiled, onError); + getNormals() { + return this._normals; } /** - * Use this material as the shadow depth wrapper of a target material - * @param targetMaterial defines the target material + * Returns an array populated with binormal vectors on each Path3D curve point. + * @returns an array populated with binormal vectors on each Path3D curve point. */ - createAsShadowDepthWrapper(targetMaterial) { - if (this.mode !== NodeMaterialModes.Material) { - Logger.Log("Incompatible material mode"); - return; - } - targetMaterial.shadowDepthWrapper = new BABYLON.ShadowDepthWrapper(this, this.getScene()); + getBinormals() { + return this._binormals; } - _processDefines(mesh, defines, useInstances = false, subMesh) { - let result = null; - const scene = this.getScene(); - if (PrepareDefinesForCamera(scene, defines)) { - defines.markAsMiscDirty(); - } - this._sharedData.blocksWithDefines.forEach((b) => { - b.initializeDefines(mesh, this, defines, useInstances); - }); - this._sharedData.blocksWithDefines.forEach((b) => { - b.prepareDefines(mesh, this, defines, useInstances, subMesh); - }); - if (defines.isDirty) { - const lightDisposed = defines._areLightsDisposed; - defines.markAsProcessed(); - this._vertexCompilationState.compilationString = this._vertexCompilationState._builtCompilationString; - this._fragmentCompilationState.compilationString = this._fragmentCompilationState._builtCompilationString; - this._sharedData.repeatableContentBlocks.forEach((b) => { - b.replaceRepeatableContent(this._vertexCompilationState, this._fragmentCompilationState, mesh, defines); - }); - const uniformBuffers = []; - this._sharedData.dynamicUniformBlocks.forEach((b) => { - b.updateUniformsAndSamples(this._vertexCompilationState, this, defines, uniformBuffers); - }); - const mergedUniforms = this._vertexCompilationState.uniforms; - this._fragmentCompilationState.uniforms.forEach((u) => { - const index = mergedUniforms.indexOf(u); - if (index === -1) { - mergedUniforms.push(u); - } - }); - const mergedSamplers = this._vertexCompilationState.samplers; - this._fragmentCompilationState.samplers.forEach((s) => { - const index = mergedSamplers.indexOf(s); - if (index === -1) { - mergedSamplers.push(s); - } - }); - const fallbacks = new EffectFallbacks(); - this._sharedData.blocksWithFallbacks.forEach((b) => { - b.provideFallbacks(mesh, fallbacks); - }); - result = { - lightDisposed, - uniformBuffers, - mergedUniforms, - mergedSamplers, - fallbacks - }; - } - return result; + /** + * Returns an array populated with distances (float) of the i-th point from the first curve point. + * @returns an array populated with distances (float) of the i-th point from the first curve point. + */ + getDistances() { + return this._distances; } /** - * Get if the submesh is ready to be used and all its information available. - * Child classes can use it to update shaders - * @param mesh defines the mesh to check - * @param subMesh defines which submesh to check - * @param useInstances specifies that instances should be used - * @returns a boolean indicating that the submesh is ready or not + * Returns an interpolated point along this path + * @param position the position of the point along this path, from 0.0 to 1.0 + * @returns a new Vector3 as the point */ - isReadyForSubMesh(mesh, subMesh, useInstances = false) { - if (!this._buildWasSuccessful) { - return false; - } - const scene = this.getScene(); - if (this._sharedData.animatedInputs) { - const frameId = scene.getFrameId(); - if (this._animationFrame !== frameId) { - for (const input of this._sharedData.animatedInputs) { - input.animate(scene); - } - this._animationFrame = frameId; - } - } - const drawWrapper = subMesh._drawWrapper; - if (drawWrapper.effect && this.isFrozen) { - if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) { - return true; - } - } - if (!subMesh.materialDefines) { - subMesh.materialDefines = new NodeMaterialDefines(); - } - const defines = subMesh.materialDefines; - if (this._isReadyForSubMesh(subMesh)) { - return true; - } - const engine = scene.getEngine(); - this._prepareDefinesForAttributes(mesh, defines); - if (this._sharedData.blockingBlocks.some((b) => !b.isReady(mesh, this, defines, useInstances))) { - return false; - } - const result = this._processDefines(mesh, defines, useInstances, subMesh); - if (result) { - const previousEffect = subMesh.effect; - const join = defines.toString(); - let effect = engine.createEffect({ - vertex: "nodeMaterial" + this._buildId, - fragment: "nodeMaterial" + this._buildId, - vertexSource: this._vertexCompilationState.compilationString, - fragmentSource: this._fragmentCompilationState.compilationString - }, { - attributes: this._vertexCompilationState.attributes, - uniformsNames: result.mergedUniforms, - uniformBuffersNames: result.uniformBuffers, - samplers: result.mergedSamplers, - defines: join, - fallbacks: result.fallbacks, - onCompiled: this.onCompiled, - onError: this.onError, - multiTarget: defines.PREPASS, - indexParameters: { maxSimultaneousLights: this.maxSimultaneousLights, maxSimultaneousMorphTargets: defines.NUM_MORPH_INFLUENCERS } - }, engine); - if (effect) { - if (this._onEffectCreatedObservable) { - onCreatedEffectParameters.effect = effect; - onCreatedEffectParameters.subMesh = subMesh; - this._onEffectCreatedObservable.notifyObservers(onCreatedEffectParameters); - } - if (this.allowShaderHotSwapping && previousEffect && !effect.isReady()) { - effect = previousEffect; - defines.markAsUnprocessed(); - if (result.lightDisposed) { - defines._areLightsDisposed = true; - return false; - } - } else { - scene.resetCachedMaterial(); - subMesh.setEffect(effect, defines, this._materialContext); - } - } - } - if (!subMesh.effect || !subMesh.effect.isReady()) { - return false; - } - defines._renderId = scene.getRenderId(); - drawWrapper._wasPreviouslyReady = true; - drawWrapper._wasPreviouslyUsingInstances = useInstances; - this._checkScenePerformancePriority(); - return true; + getPointAt(position) { + return this._updatePointAtData(position).point; } /** - * Get a string representing the shaders built by the current node graph + * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path. + * @param position the position of the point along this path, from 0.0 to 1.0 + * @param interpolated (optional, default false) : boolean, if true returns an interpolated tangent instead of the tangent of the previous path point. + * @returns a tangent vector corresponding to the interpolated Path3D curve point, if not interpolated, the tangent is taken from the precomputed tangents array. */ - get compiledShaders() { - return `// Vertex shader -${this._vertexCompilationState.compilationString} - -// Fragment shader -${this._fragmentCompilationState.compilationString}`; + getTangentAt(position, interpolated = false) { + this._updatePointAtData(position, interpolated); + return interpolated ? Vector3.TransformCoordinates(Vector3.Forward(), this._pointAtData.interpolationMatrix) : this._tangents[this._pointAtData.previousPointArrayIndex]; } /** - * Binds the world matrix to the material - * @param world defines the world transformation matrix + * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path. + * @param position the position of the point along this path, from 0.0 to 1.0 + * @param interpolated (optional, default false) : boolean, if true returns an interpolated normal instead of the normal of the previous path point. + * @returns a normal vector corresponding to the interpolated Path3D curve point, if not interpolated, the normal is taken from the precomputed normals array. */ - bindOnlyWorldMatrix(world) { - const scene = this.getScene(); - if (!this._activeEffect) { - return; - } - const hints = this._sharedData.hints; - if (hints.needWorldViewMatrix) { - world.multiplyToRef(scene.getViewMatrix(), this._cachedWorldViewMatrix); - } - if (hints.needWorldViewProjectionMatrix) { - world.multiplyToRef(scene.getTransformMatrix(), this._cachedWorldViewProjectionMatrix); - } - for (const inputBlock of this._sharedData.inputBlocks) { - inputBlock._transmitWorld(this._activeEffect, world, this._cachedWorldViewMatrix, this._cachedWorldViewProjectionMatrix); - } + getNormalAt(position, interpolated = false) { + this._updatePointAtData(position, interpolated); + return interpolated ? Vector3.TransformCoordinates(Vector3.Right(), this._pointAtData.interpolationMatrix) : this._normals[this._pointAtData.previousPointArrayIndex]; } /** - * Binds the submesh to this material by preparing the effect and shader to draw - * @param world defines the world transformation matrix - * @param mesh defines the mesh containing the submesh - * @param subMesh defines the submesh to bind the material to + * Returns the binormal vector of an interpolated Path3D curve point at the specified position along this path. + * @param position the position of the point along this path, from 0.0 to 1.0 + * @param interpolated (optional, default false) : boolean, if true returns an interpolated binormal instead of the binormal of the previous path point. + * @returns a binormal vector corresponding to the interpolated Path3D curve point, if not interpolated, the binormal is taken from the precomputed binormals array. */ - bindForSubMesh(world, mesh, subMesh) { - const scene = this.getScene(); - const effect = subMesh.effect; - if (!effect) { - return; - } - this._activeEffect = effect; - this.bindOnlyWorldMatrix(world); - const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility); - const sharedData = this._sharedData; - if (mustRebind) { - for (const block of sharedData.bindableBlocks) { - block.bind(effect, this, mesh, subMesh); - } - for (const block of sharedData.forcedBindableBlocks) { - block.bind(effect, this, mesh, subMesh); - } - for (const inputBlock of sharedData.inputBlocks) { - inputBlock._transmit(effect, scene, this); - } - } else if (!this.isFrozen) { - for (const block of sharedData.forcedBindableBlocks) { - block.bind(effect, this, mesh, subMesh); - } - } - this._afterBind(mesh, this._activeEffect, subMesh); + getBinormalAt(position, interpolated = false) { + this._updatePointAtData(position, interpolated); + return interpolated ? Vector3.TransformCoordinates(Vector3.UpReadOnly, this._pointAtData.interpolationMatrix) : this._binormals[this._pointAtData.previousPointArrayIndex]; } /** - * Gets the active textures from the material - * @returns an array of textures + * Returns the distance (float) of an interpolated Path3D curve point at the specified position along this path. + * @param position the position of the point along this path, from 0.0 to 1.0 + * @returns the distance of the interpolated Path3D curve point at the specified position along this path. */ - getActiveTextures() { - const activeTextures = super.getActiveTextures(); - if (this._sharedData) { - activeTextures.push(...this._sharedData.textureBlocks.filter((tb) => tb.texture).map((tb) => tb.texture)); - } - return activeTextures; + getDistanceAt(position) { + return this.length() * position; } /** - * Gets the list of texture blocks - * Note that this method will only return blocks that are reachable from the final block(s) and only after the material has been built! - * @returns an array of texture blocks + * Returns the array index of the previous point of an interpolated point along this path + * @param position the position of the point to interpolate along this path, from 0.0 to 1.0 + * @returns the array index */ - getTextureBlocks() { - if (!this._sharedData) { - return []; - } - return this._sharedData.textureBlocks; + getPreviousPointIndexAt(position) { + this._updatePointAtData(position); + return this._pointAtData.previousPointArrayIndex; } /** - * Gets the list of all texture blocks - * Note that this method will scan all attachedBlocks and return blocks that are texture blocks - * @returns + * Returns the position of an interpolated point relative to the two path points it lies between, from 0.0 (point A) to 1.0 (point B) + * @param position the position of the point to interpolate along this path, from 0.0 to 1.0 + * @returns the sub position */ - getAllTextureBlocks() { - const textureBlocks = []; - for (const block of this.attachedBlocks) { - if (_NodeMaterial._BlockIsTextureBlock(block)) { - textureBlocks.push(block); - } - } - return textureBlocks; + getSubPositionAt(position) { + this._updatePointAtData(position); + return this._pointAtData.subPosition; } /** - * Specifies if the material uses a texture - * @param texture defines the texture to check against the material - * @returns a boolean specifying if the material uses the texture + * Returns the position of the closest virtual point on this path to an arbitrary Vector3, from 0.0 to 1.0 + * @param target the vector of which to get the closest position to + * @returns the position of the closest virtual point on this path to the target vector */ - hasTexture(texture) { - if (super.hasTexture(texture)) { - return true; - } - if (!this._sharedData) { - return false; - } - for (const t of this._sharedData.textureBlocks) { - if (t.texture === texture) { - return true; + getClosestPositionTo(target) { + let smallestDistance = Number.MAX_VALUE; + let closestPosition = 0; + for (let i = 0; i < this._curve.length - 1; i++) { + const point = this._curve[i + 0]; + const tangent = this._curve[i + 1].subtract(point).normalize(); + const subLength = this._distances[i + 1] - this._distances[i + 0]; + const subPosition = Math.min(Math.max(Vector3.Dot(tangent, target.subtract(point).normalize()), 0) * Vector3.Distance(point, target) / subLength, 1); + const distance = Vector3.Distance(point.add(tangent.scale(subPosition * subLength)), target); + if (distance < smallestDistance) { + smallestDistance = distance; + closestPosition = (this._distances[i + 0] + subLength * subPosition) / this.length(); } } - return false; + return closestPosition; } /** - * Disposes the material - * @param forceDisposeEffect specifies if effects should be forcefully disposed - * @param forceDisposeTextures specifies if textures should be forcefully disposed - * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh + * Returns a sub path (slice) of this path + * @param start the position of the fist path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values + * @param end the position of the last path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values + * @returns a sub path (slice) of this path */ - dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh) { - if (forceDisposeTextures) { - for (const texture of this.getTextureBlocks().filter((tb) => tb.texture).map((tb) => tb.texture)) { - texture.dispose(); - } + slice(start = 0, end = 1) { + if (start < 0) { + start = 1 - start * -1 % 1; } - for (const block of this.attachedBlocks) { - block.dispose(); + if (end < 0) { + end = 1 - end * -1 % 1; } - this.attachedBlocks.length = 0; - this._sharedData = null; - this._vertexCompilationState = null; - this._fragmentCompilationState = null; - this.onBuildObservable.clear(); - if (this._imageProcessingObserver) { - this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver); - this._imageProcessingObserver = null; + if (start > end) { + const _start = start; + start = end; + end = _start; } - super.dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh); - } - /** Creates the node editor window. - * @param additionalConfig Define the configuration of the editor - */ - _createNodeEditor(additionalConfig) { - const nodeEditorConfig = { - nodeMaterial: this, - ...additionalConfig - }; - this.BJSNODEMATERIALEDITOR.NodeEditor.Show(nodeEditorConfig); + const curvePoints = this.getCurve(); + const startPoint = this.getPointAt(start); + let startIndex = this.getPreviousPointIndexAt(start); + const endPoint = this.getPointAt(end); + const endIndex = this.getPreviousPointIndexAt(end) + 1; + const slicePoints = []; + if (start !== 0) { + startIndex++; + slicePoints.push(startPoint); + } + slicePoints.push(...curvePoints.slice(startIndex, endIndex)); + if (end !== 1 || start === 1) { + slicePoints.push(endPoint); + } + return new _Path3D(slicePoints, this.getNormalAt(start), this._raw, this._alignTangentsWithPath); } /** - * Launch the node material editor - * @param config Define the configuration of the editor - * @returns a promise fulfilled when the node editor is visible + * Forces the Path3D tangent, normal, binormal and distance recomputation. + * @param path path which all values are copied into the curves points + * @param firstNormal which should be projected onto the curve + * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path + * @returns the same object updated. */ - edit(config) { - return new Promise((resolve) => { - this.BJSNODEMATERIALEDITOR = this.BJSNODEMATERIALEDITOR || this._getGlobalNodeMaterialEditor(); - if (typeof this.BJSNODEMATERIALEDITOR == "undefined") { - const editorUrl = config && config.editorURL ? config.editorURL : _NodeMaterial.EditorURL; - Tools.LoadBabylonScript(editorUrl, () => { - this.BJSNODEMATERIALEDITOR = this.BJSNODEMATERIALEDITOR || this._getGlobalNodeMaterialEditor(); - this._createNodeEditor(config == null ? void 0 : config.nodeEditorConfig); - resolve(); - }); - } else { - this._createNodeEditor(config == null ? void 0 : config.nodeEditorConfig); - resolve(); - } - }); + update(path, firstNormal = null, alignTangentsWithPath = false) { + for (let p = 0; p < path.length; p++) { + this._curve[p].x = path[p].x; + this._curve[p].y = path[p].y; + this._curve[p].z = path[p].z; + } + this._compute(firstNormal, alignTangentsWithPath); + return this; } - /** - * Clear the current material - */ - clear() { - this._vertexOutputNodes.length = 0; - this._fragmentOutputNodes.length = 0; - this.attachedBlocks.length = 0; - } - /** - * Clear the current material and set it to a default state - */ - setToDefault() { - this.clear(); - this.editorData = null; - const positionInput = new InputBlock("Position"); - positionInput.setAsAttribute("position"); - const worldInput = new InputBlock("World"); - worldInput.setAsSystemValue(NodeMaterialSystemValues.World); - const worldPos = new TransformBlock("WorldPos"); - positionInput.connectTo(worldPos); - worldInput.connectTo(worldPos); - const viewProjectionInput = new InputBlock("ViewProjection"); - viewProjectionInput.setAsSystemValue(NodeMaterialSystemValues.ViewProjection); - const worldPosdMultipliedByViewProjection = new TransformBlock("WorldPos * ViewProjectionTransform"); - worldPos.connectTo(worldPosdMultipliedByViewProjection); - viewProjectionInput.connectTo(worldPosdMultipliedByViewProjection); - const vertexOutput = new VertexOutputBlock("VertexOutput"); - worldPosdMultipliedByViewProjection.connectTo(vertexOutput); - const pixelColor = new InputBlock("color"); - pixelColor.value = new Color4(0.8, 0.8, 0.8, 1); - const fragmentOutput = new FragmentOutputBlock("FragmentOutput"); - pixelColor.connectTo(fragmentOutput); - this.addOutputNode(vertexOutput); - this.addOutputNode(fragmentOutput); - this._mode = NodeMaterialModes.Material; - } - /** - * Clear the current material and set it to a default state for post process - */ - setToDefaultPostProcess() { - this.clear(); - this.editorData = null; - const position = new InputBlock("Position"); - position.setAsAttribute("position2d"); - const const1 = new InputBlock("Constant1"); - const1.isConstant = true; - const1.value = 1; - const vmerger = new VectorMergerBlock("Position3D"); - position.connectTo(vmerger); - const1.connectTo(vmerger, { input: "w" }); - const vertexOutput = new VertexOutputBlock("VertexOutput"); - vmerger.connectTo(vertexOutput); - const scale = new InputBlock("Scale"); - scale.visibleInInspector = true; - scale.value = new Vector2(1, 1); - const uv0 = new RemapBlock("uv0"); - position.connectTo(uv0); - const uv = new MultiplyBlock("UV scale"); - uv0.connectTo(uv); - scale.connectTo(uv); - const currentScreen = new CurrentScreenBlock("CurrentScreen"); - uv.connectTo(currentScreen); - currentScreen.texture = new Texture("https://assets.babylonjs.com/nme/currentScreenPostProcess.png", this.getScene()); - const fragmentOutput = new FragmentOutputBlock("FragmentOutput"); - currentScreen.connectTo(fragmentOutput, { output: "rgba" }); - this.addOutputNode(vertexOutput); - this.addOutputNode(fragmentOutput); - this._mode = NodeMaterialModes.PostProcess; - } - /** - * Clear the current material and set it to a default state for procedural texture - */ - setToDefaultProceduralTexture() { - this.clear(); - this.editorData = null; - const position = new InputBlock("Position"); - position.setAsAttribute("position2d"); - const const1 = new InputBlock("Constant1"); - const1.isConstant = true; - const1.value = 1; - const vmerger = new VectorMergerBlock("Position3D"); - position.connectTo(vmerger); - const1.connectTo(vmerger, { input: "w" }); - const vertexOutput = new VertexOutputBlock("VertexOutput"); - vmerger.connectTo(vertexOutput); - const time = new InputBlock("Time"); - time.value = 0; - time.min = 0; - time.max = 0; - time.isBoolean = false; - time.matrixMode = 0; - time.animationType = AnimatedInputBlockTypes.Time; - time.isConstant = false; - const color = new InputBlock("Color3"); - color.value = new Color3(1, 1, 1); - color.isConstant = false; - const fragmentOutput = new FragmentOutputBlock("FragmentOutput"); - const vectorMerger = new VectorMergerBlock("VectorMerger"); - vectorMerger.visibleInInspector = false; - const cos = new TrigonometryBlock("Cos"); - cos.operation = TrigonometryBlockOperations.Cos; - position.connectTo(vectorMerger); - time.output.connectTo(cos.input); - cos.output.connectTo(vectorMerger.z); - vectorMerger.xyzOut.connectTo(fragmentOutput.rgb); - this.addOutputNode(vertexOutput); - this.addOutputNode(fragmentOutput); - this._mode = NodeMaterialModes.ProceduralTexture; - } - /** - * Clear the current material and set it to a default state for particle - */ - setToDefaultParticle() { - this.clear(); - this.editorData = null; - const uv = new InputBlock("uv"); - uv.setAsAttribute("particle_uv"); - const texture = new ParticleTextureBlock("ParticleTexture"); - uv.connectTo(texture); - const color = new InputBlock("Color"); - color.setAsAttribute("particle_color"); - const multiply = new MultiplyBlock("Texture * Color"); - texture.connectTo(multiply); - color.connectTo(multiply); - const rampGradient = new ParticleRampGradientBlock("ParticleRampGradient"); - multiply.connectTo(rampGradient); - const cSplitter = new ColorSplitterBlock("ColorSplitter"); - color.connectTo(cSplitter); - const blendMultiply = new ParticleBlendMultiplyBlock("ParticleBlendMultiply"); - rampGradient.connectTo(blendMultiply); - texture.connectTo(blendMultiply, { output: "a" }); - cSplitter.connectTo(blendMultiply, { output: "a" }); - const fragmentOutput = new FragmentOutputBlock("FragmentOutput"); - blendMultiply.connectTo(fragmentOutput); - this.addOutputNode(fragmentOutput); - this._mode = NodeMaterialModes.Particle; - } - /** - * Loads the current Node Material from a url pointing to a file save by the Node Material Editor - * @deprecated Please use NodeMaterial.ParseFromFileAsync instead - * @param url defines the url to load from - * @param rootUrl defines the root URL for nested url in the node material - * @returns a promise that will fulfil when the material is fully loaded - */ - async loadAsync(url, rootUrl = "") { - return _NodeMaterial.ParseFromFileAsync("", url, this.getScene(), rootUrl, true, this); - } - _gatherBlocks(rootNode, list) { - if (list.indexOf(rootNode) !== -1) { + // private function compute() : computes tangents, normals and binormals + _compute(firstNormal, alignTangentsWithPath = false) { + const l = this._curve.length; + if (l < 2) { return; } - list.push(rootNode); - for (const input of rootNode.inputs) { - const connectedPoint = input.connectedPoint; - if (connectedPoint) { - const block = connectedPoint.ownerBlock; - if (block !== rootNode) { - this._gatherBlocks(block, list); - } - } + this._tangents[0] = this._getFirstNonNullVector(0); + if (!this._raw) { + this._tangents[0].normalize(); } - if (rootNode.isTeleportOut) { - const block = rootNode; - if (block.entryPoint) { - this._gatherBlocks(block.entryPoint, list); - } + this._tangents[l - 1] = this._curve[l - 1].subtract(this._curve[l - 2]); + if (!this._raw) { + this._tangents[l - 1].normalize(); } - } - /** - * Generate a string containing the code declaration required to create an equivalent of this material - * @returns a string - */ - generateCode() { - let alreadyDumped = []; - const vertexBlocks = []; - const uniqueNames = ["const", "var", "let"]; - for (const outputNode of this._vertexOutputNodes) { - this._gatherBlocks(outputNode, vertexBlocks); + const tg0 = this._tangents[0]; + const pp0 = this._normalVector(tg0, firstNormal); + this._normals[0] = pp0; + if (!this._raw) { + this._normals[0].normalize(); } - const fragmentBlocks = []; - for (const outputNode of this._fragmentOutputNodes) { - this._gatherBlocks(outputNode, fragmentBlocks); + this._binormals[0] = Vector3.Cross(tg0, this._normals[0]); + if (!this._raw) { + this._binormals[0].normalize(); } - let codeString = `var nodeMaterial = new BABYLON.NodeMaterial("${this.name || "node material"}"); -`; - codeString += `nodeMaterial.mode = BABYLON.NodeMaterialModes.${NodeMaterialModes[this.mode]}; -`; - for (const node of vertexBlocks) { - if (node.isInput && alreadyDumped.indexOf(node) === -1) { - codeString += node._dumpCode(uniqueNames, alreadyDumped); + this._distances[0] = 0; + let prev; + let cur; + let curTang; + let prevNor; + let prevBinor; + for (let i = 1; i < l; i++) { + prev = this._getLastNonNullVector(i); + if (i < l - 1) { + cur = this._getFirstNonNullVector(i); + this._tangents[i] = alignTangentsWithPath ? cur : prev.add(cur); + this._tangents[i].normalize(); } - } - for (const node of fragmentBlocks) { - if (node.isInput && alreadyDumped.indexOf(node) === -1) { - codeString += node._dumpCode(uniqueNames, alreadyDumped); + this._distances[i] = this._distances[i - 1] + this._curve[i].subtract(this._curve[i - 1]).length(); + curTang = this._tangents[i]; + prevBinor = this._binormals[i - 1]; + this._normals[i] = Vector3.Cross(prevBinor, curTang); + if (!this._raw) { + if (this._normals[i].length() === 0) { + prevNor = this._normals[i - 1]; + this._normals[i] = prevNor.clone(); + } else { + this._normals[i].normalize(); + } + } + this._binormals[i] = Vector3.Cross(curTang, this._normals[i]); + if (!this._raw) { + this._binormals[i].normalize(); } } - alreadyDumped = []; - codeString += "\n// Connections\n"; - for (const node of this._vertexOutputNodes) { - codeString += node._dumpCodeForOutputConnections(alreadyDumped); + this._pointAtData.id = NaN; + } + // private function getFirstNonNullVector(index) + // returns the first non null vector from index : curve[index + N].subtract(curve[index]) + _getFirstNonNullVector(index) { + let i = 1; + let nNVector = this._curve[index + i].subtract(this._curve[index]); + while (nNVector.length() === 0 && index + i + 1 < this._curve.length) { + i++; + nNVector = this._curve[index + i].subtract(this._curve[index]); } - for (const node of this._fragmentOutputNodes) { - codeString += node._dumpCodeForOutputConnections(alreadyDumped); + return nNVector; + } + // private function getLastNonNullVector(index) + // returns the last non null vector from index : curve[index].subtract(curve[index - N]) + _getLastNonNullVector(index) { + let i = 1; + let nLVector = this._curve[index].subtract(this._curve[index - i]); + while (nLVector.length() === 0 && index > i + 1) { + i++; + nLVector = this._curve[index].subtract(this._curve[index - i]); } - codeString += "\n// Output nodes\n"; - for (const node of this._vertexOutputNodes) { - codeString += `nodeMaterial.addOutputNode(${node._codeVariableName}); -`; + return nLVector; + } + // private function normalVector(v0, vt, va) : + // returns an arbitrary point in the plane defined by the point v0 and the vector vt orthogonal to this plane + // if va is passed, it returns the va projection on the plane orthogonal to vt at the point v0 + _normalVector(vt, va) { + let normal0; + let tgl = vt.length(); + if (tgl === 0) { + tgl = 1; } - for (const node of this._fragmentOutputNodes) { - codeString += `nodeMaterial.addOutputNode(${node._codeVariableName}); -`; + if (va === void 0 || va === null) { + let point; + if (!Scalar.WithinEpsilon(Math.abs(vt.y) / tgl, 1, Epsilon)) { + point = new Vector3(0, -1, 0); + } else if (!Scalar.WithinEpsilon(Math.abs(vt.x) / tgl, 1, Epsilon)) { + point = new Vector3(1, 0, 0); + } else if (!Scalar.WithinEpsilon(Math.abs(vt.z) / tgl, 1, Epsilon)) { + point = new Vector3(0, 0, 1); + } else { + point = Vector3.Zero(); + } + normal0 = Vector3.Cross(vt, point); + } else { + normal0 = Vector3.Cross(vt, va); + Vector3.CrossToRef(normal0, vt, normal0); } - codeString += `nodeMaterial.build(); -`; - return codeString; + normal0.normalize(); + return normal0; } /** - * Serializes this material in a JSON representation - * @param selectedBlocks defines an optional list of blocks to serialize - * @returns the serialized material object + * Updates the point at data for an interpolated point along this curve + * @param position the position of the point along this curve, from 0.0 to 1.0 + * @param interpolateTNB + * @interpolateTNB whether to compute the interpolated tangent, normal and binormal + * @returns the (updated) point at data */ - serialize(selectedBlocks) { - const serializationObject = selectedBlocks ? {} : SerializationHelper.Serialize(this); - serializationObject.editorData = JSON.parse(JSON.stringify(this.editorData)); - let blocks = []; - if (selectedBlocks) { - blocks = selectedBlocks; - } else { - serializationObject.customType = "BABYLON.NodeMaterial"; - serializationObject.outputNodes = []; - for (const outputNode of this._vertexOutputNodes) { - this._gatherBlocks(outputNode, blocks); - serializationObject.outputNodes.push(outputNode.uniqueId); - } - for (const outputNode of this._fragmentOutputNodes) { - this._gatherBlocks(outputNode, blocks); - if (serializationObject.outputNodes.indexOf(outputNode.uniqueId) === -1) { - serializationObject.outputNodes.push(outputNode.uniqueId); - } + _updatePointAtData(position, interpolateTNB = false) { + if (this._pointAtData.id === position) { + if (!this._pointAtData.interpolateReady) { + this._updateInterpolationMatrix(); } + return this._pointAtData; + } else { + this._pointAtData.id = position; } - serializationObject.blocks = []; - for (const block of blocks) { - serializationObject.blocks.push(block.serialize()); + const curvePoints = this.getPoints(); + if (position <= 0) { + return this._setPointAtData(0, 0, curvePoints[0], 0, interpolateTNB); + } else if (position >= 1) { + return this._setPointAtData(1, 1, curvePoints[curvePoints.length - 1], curvePoints.length - 1, interpolateTNB); } - if (!selectedBlocks) { - for (const block of this.attachedBlocks) { - if (blocks.indexOf(block) !== -1) { - continue; - } - serializationObject.blocks.push(block.serialize()); + let previousPoint = curvePoints[0]; + let currentPoint; + let currentLength = 0; + const targetLength = position * this.length(); + for (let i = 1; i < curvePoints.length; i++) { + currentPoint = curvePoints[i]; + const distance = Vector3.Distance(previousPoint, currentPoint); + currentLength += distance; + if (currentLength === targetLength) { + return this._setPointAtData(position, 1, currentPoint, i, interpolateTNB); + } else if (currentLength > targetLength) { + const toLength = currentLength - targetLength; + const diff = toLength / distance; + const dir = previousPoint.subtract(currentPoint); + const point = currentPoint.add(dir.scaleInPlace(diff)); + return this._setPointAtData(position, 1 - diff, point, i - 1, interpolateTNB); } + previousPoint = currentPoint; } - return serializationObject; + return this._pointAtData; } - _restoreConnections(block, source, map) { - for (const outputPoint of block.outputs) { - for (const candidate of source.blocks) { - const target = map[candidate.id]; - if (!target) { - continue; - } - for (const input of candidate.inputs) { - if (map[input.targetBlockId] === block && input.targetConnectionName === outputPoint.name) { - const inputPoint = target.getInputByName(input.inputName); - if (!inputPoint || inputPoint.isConnected) { - continue; - } - outputPoint.connectTo(inputPoint, true); - this._restoreConnections(target, source, map); - continue; - } - } - } + /** + * Updates the point at data from the specified parameters + * @param position where along the path the interpolated point is, from 0.0 to 1.0 + * @param subPosition + * @param point the interpolated point + * @param parentIndex the index of an existing curve point that is on, or else positionally the first behind, the interpolated point + * @param interpolateTNB whether to compute the interpolated tangent, normal and binormal + * @returns the (updated) point at data + */ + _setPointAtData(position, subPosition, point, parentIndex, interpolateTNB) { + this._pointAtData.point = point; + this._pointAtData.position = position; + this._pointAtData.subPosition = subPosition; + this._pointAtData.previousPointArrayIndex = parentIndex; + this._pointAtData.interpolateReady = interpolateTNB; + if (interpolateTNB) { + this._updateInterpolationMatrix(); } + return this._pointAtData; } /** - * Clear the current graph and load a new one from a serialization object - * @param source defines the JSON representation of the material - * @param rootUrl defines the root URL to use to load textures and relative dependencies - * @param merge defines whether or not the source must be merged or replace the current content + * Updates the point at interpolation matrix for the tangents, normals and binormals */ - parseSerializedObject(source, rootUrl = "", merge = false) { - if (!merge) { - this.clear(); - } - const map = {}; - for (const parsedBlock of source.blocks) { - const blockType = GetClass(parsedBlock.customType); - if (blockType) { - const block = new blockType(); - block._deserialize(parsedBlock, this.getScene(), rootUrl); - map[parsedBlock.id] = block; - this.attachedBlocks.push(block); - } - } - for (const block of this.attachedBlocks) { - if (block.isTeleportOut) { - const teleportOut = block; - const id = teleportOut._tempEntryPointUniqueId; - if (id) { - const source2 = map[id]; - source2.attachToEndpoint(teleportOut); - } - } - } - for (let blockIndex = 0; blockIndex < source.blocks.length; blockIndex++) { - const parsedBlock = source.blocks[blockIndex]; - const block = map[parsedBlock.id]; - if (!block) { - continue; - } - if (block.inputs.length && !merge) { - continue; - } - this._restoreConnections(block, source, map); - } - if (source.outputNodes) { - for (const outputNodeId of source.outputNodes) { - this.addOutputNode(map[outputNodeId]); - } - } - if (source.locations || source.editorData && source.editorData.locations) { - const locations = source.locations || source.editorData.locations; - for (const location2 of locations) { - if (map[location2.blockId]) { - location2.blockId = map[location2.blockId].uniqueId; - } - } - if (merge && this.editorData && this.editorData.locations) { - locations.concat(this.editorData.locations); - } - if (source.locations) { - this.editorData = { - locations - }; - } else { - this.editorData = source.editorData; - this.editorData.locations = locations; - } - const blockMap = []; - for (const key in map) { - blockMap[key] = map[key].uniqueId; - } - this.editorData.map = blockMap; - } - this.comment = source.comment; - if (source.forceAlphaBlending !== void 0) { - this.forceAlphaBlending = source.forceAlphaBlending; - } - if (source.alphaMode !== void 0) { - this.alphaMode = source.alphaMode; - } - if (!merge) { - this._mode = source.mode ?? NodeMaterialModes.Material; + _updateInterpolationMatrix() { + this._pointAtData.interpolationMatrix = Matrix.Identity(); + const parentIndex = this._pointAtData.previousPointArrayIndex; + if (parentIndex !== this._tangents.length - 1) { + const index = parentIndex + 1; + const tangentFrom = this._tangents[parentIndex].clone(); + const normalFrom = this._normals[parentIndex].clone(); + const binormalFrom = this._binormals[parentIndex].clone(); + const tangentTo = this._tangents[index].clone(); + const normalTo = this._normals[index].clone(); + const binormalTo = this._binormals[index].clone(); + const quatFrom = Quaternion.RotationQuaternionFromAxis(normalFrom, binormalFrom, tangentFrom); + const quatTo = Quaternion.RotationQuaternionFromAxis(normalTo, binormalTo, tangentTo); + const quatAt = Quaternion.Slerp(quatFrom, quatTo, this._pointAtData.subPosition); + quatAt.toRotationMatrix(this._pointAtData.interpolationMatrix); } } +}; +var Curve3 = class _Curve3 { /** - * Clear the current graph and load a new one from a serialization object - * @param source defines the JSON representation of the material - * @param rootUrl defines the root URL to use to load textures and relative dependencies - * @param merge defines whether or not the source must be merged or replace the current content - * @deprecated Please use the parseSerializedObject method instead + * Returns a Curve3 object along a Quadratic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#quadratic-bezier-curve + * @param v0 (Vector3) the origin point of the Quadratic Bezier + * @param v1 (Vector3) the control point + * @param v2 (Vector3) the end point of the Quadratic Bezier + * @param nbPoints (integer) the wanted number of points in the curve + * @returns the created Curve3 */ - loadFromSerialization(source, rootUrl = "", merge = false) { - this.parseSerializedObject(source, rootUrl, merge); + static CreateQuadraticBezier(v0, v1, v2, nbPoints) { + nbPoints = nbPoints > 2 ? nbPoints : 3; + const bez = []; + const equation = (t, val0, val1, val2) => { + const res = (1 - t) * (1 - t) * val0 + 2 * t * (1 - t) * val1 + t * t * val2; + return res; + }; + for (let i = 0; i <= nbPoints; i++) { + bez.push(new Vector3(equation(i / nbPoints, v0.x, v1.x, v2.x), equation(i / nbPoints, v0.y, v1.y, v2.y), equation(i / nbPoints, v0.z, v1.z, v2.z))); + } + return new _Curve3(bez); } /** - * Makes a duplicate of the current material. - * @param name defines the name to use for the new material - * @param shareEffect defines if the clone material should share the same effect (default is false) - * @returns the cloned material + * Returns a Curve3 object along a Cubic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#cubic-bezier-curve + * @param v0 (Vector3) the origin point of the Cubic Bezier + * @param v1 (Vector3) the first control point + * @param v2 (Vector3) the second control point + * @param v3 (Vector3) the end point of the Cubic Bezier + * @param nbPoints (integer) the wanted number of points in the curve + * @returns the created Curve3 */ - clone(name69, shareEffect = false) { - const serializationObject = this.serialize(); - const clone = SerializationHelper.Clone(() => new _NodeMaterial(name69, this.getScene(), this.options), this); - clone.id = name69; - clone.name = name69; - clone.parseSerializedObject(serializationObject); - clone._buildId = this._buildId; - clone.build(false, !shareEffect); - return clone; + static CreateCubicBezier(v0, v1, v2, v3, nbPoints) { + nbPoints = nbPoints > 3 ? nbPoints : 4; + const bez = []; + const equation = (t, val0, val1, val2, val3) => { + const res = (1 - t) * (1 - t) * (1 - t) * val0 + 3 * t * (1 - t) * (1 - t) * val1 + 3 * t * t * (1 - t) * val2 + t * t * t * val3; + return res; + }; + for (let i = 0; i <= nbPoints; i++) { + bez.push(new Vector3(equation(i / nbPoints, v0.x, v1.x, v2.x, v3.x), equation(i / nbPoints, v0.y, v1.y, v2.y, v3.y), equation(i / nbPoints, v0.z, v1.z, v2.z, v3.z))); + } + return new _Curve3(bez); } /** - * Awaits for all the material textures to be ready before resolving the returned promise. - * @returns A promise that resolves when the textures are ready. + * Returns a Curve3 object along a Hermite Spline curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#hermite-spline + * @param p1 (Vector3) the origin point of the Hermite Spline + * @param t1 (Vector3) the tangent vector at the origin point + * @param p2 (Vector3) the end point of the Hermite Spline + * @param t2 (Vector3) the tangent vector at the end point + * @param nSeg (integer) the number of curve segments or nSeg + 1 points in the array + * @returns the created Curve3 */ - whenTexturesReadyAsync() { - const textureReadyPromises = []; - this.getActiveTextures().forEach((texture) => { - const internalTexture = texture.getInternalTexture(); - if (internalTexture && !internalTexture.isReady) { - textureReadyPromises.push(new Promise((textureResolve, textureReject) => { - internalTexture.onLoadedObservable.addOnce(() => { - textureResolve(); - }); - internalTexture.onErrorObservable.addOnce((e) => { - textureReject(e); - }); - })); - } - }); - return Promise.all(textureReadyPromises); + static CreateHermiteSpline(p1, t1, p2, t2, nSeg) { + const hermite = []; + const step = 1 / nSeg; + for (let i = 0; i <= nSeg; i++) { + hermite.push(Vector3.Hermite(p1, t1, p2, t2, i * step)); + } + return new _Curve3(hermite); } /** - * Creates a node material from parsed material data - * @param source defines the JSON representation of the material - * @param scene defines the hosting scene - * @param rootUrl defines the root URL to use to load textures and relative dependencies - * @returns a new node material + * Returns a Curve3 object along a CatmullRom Spline curve : + * @param points (array of Vector3) the points the spline must pass through. At least, four points required + * @param nbPoints (integer) the wanted number of points between each curve control points + * @param closed (boolean) optional with default false, when true forms a closed loop from the points + * @returns the created Curve3 */ - static Parse(source, scene, rootUrl = "") { - const nodeMaterial = SerializationHelper.Parse(() => new _NodeMaterial(source.name, scene), source, scene, rootUrl); - nodeMaterial.parseSerializedObject(source, rootUrl); - nodeMaterial.build(); - return nodeMaterial; + static CreateCatmullRomSpline(points, nbPoints, closed) { + const catmullRom = []; + const step = 1 / nbPoints; + let amount = 0; + if (closed) { + const pointsCount = points.length; + for (let i = 0; i < pointsCount; i++) { + amount = 0; + for (let c = 0; c < nbPoints; c++) { + catmullRom.push(Vector3.CatmullRom(points[i % pointsCount], points[(i + 1) % pointsCount], points[(i + 2) % pointsCount], points[(i + 3) % pointsCount], amount)); + amount += step; + } + } + catmullRom.push(catmullRom[0]); + } else { + const totalPoints = []; + totalPoints.push(points[0].clone()); + Array.prototype.push.apply(totalPoints, points); + totalPoints.push(points[points.length - 1].clone()); + let i = 0; + for (; i < totalPoints.length - 3; i++) { + amount = 0; + for (let c = 0; c < nbPoints; c++) { + catmullRom.push(Vector3.CatmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount)); + amount += step; + } + } + i--; + catmullRom.push(Vector3.CatmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount)); + } + return new _Curve3(catmullRom); } /** - * Creates a node material from a snippet saved in a remote file - * @param name defines the name of the material to create - * @param url defines the url to load from - * @param scene defines the hosting scene - * @param rootUrl defines the root URL for nested url in the node material - * @param skipBuild defines whether to build the node material - * @param targetMaterial defines a material to use instead of creating a new one - * @returns a promise that will resolve to the new node material + * Returns a Curve3 object along an arc through three vector3 points: + * The three points should not be colinear. When they are the Curve3 is empty. + * @param first (Vector3) the first point the arc must pass through. + * @param second (Vector3) the second point the arc must pass through. + * @param third (Vector3) the third point the arc must pass through. + * @param steps (number) the larger the number of steps the more detailed the arc. + * @param closed (boolean) optional with default false, when true forms the chord from the first and third point + * @param fullCircle Circle (boolean) optional with default false, when true forms the complete circle through the three points + * @returns the created Curve3 */ - static async ParseFromFileAsync(name69, url, scene, rootUrl = "", skipBuild = false, targetMaterial) { - const material = targetMaterial ?? new _NodeMaterial(name69, scene); - const data = await scene._loadFileAsync(url); - const serializationObject = JSON.parse(data); - material.parseSerializedObject(serializationObject, rootUrl); - if (!skipBuild) { - material.build(); + static ArcThru3Points(first, second, third, steps = 32, closed = false, fullCircle = false) { + const arc = []; + const vec1 = second.subtract(first); + const vec2 = third.subtract(second); + const vec3 = first.subtract(third); + const zAxis = Vector3.Cross(vec1, vec2); + const len4 = zAxis.length(); + if (len4 < Math.pow(10, -8)) { + return new _Curve3(arc); } - return material; + const len1_sq = vec1.lengthSquared(); + const len2_sq = vec2.lengthSquared(); + const len3_sq = vec3.lengthSquared(); + const len4_sq = zAxis.lengthSquared(); + const len1 = vec1.length(); + const len2 = vec2.length(); + const len3 = vec3.length(); + const radius = 0.5 * len1 * len2 * len3 / len4; + const dot1 = Vector3.Dot(vec1, vec3); + const dot2 = Vector3.Dot(vec1, vec2); + const dot3 = Vector3.Dot(vec2, vec3); + const a = -0.5 * len2_sq * dot1 / len4_sq; + const b = -0.5 * len3_sq * dot2 / len4_sq; + const c = -0.5 * len1_sq * dot3 / len4_sq; + const center = first.scale(a).add(second.scale(b)).add(third.scale(c)); + const radiusVec = first.subtract(center); + const xAxis = radiusVec.normalize(); + const yAxis = Vector3.Cross(zAxis, xAxis).normalize(); + if (fullCircle) { + const dStep = 2 * Math.PI / steps; + for (let theta = 0; theta <= 2 * Math.PI; theta += dStep) { + arc.push(center.add(xAxis.scale(radius * Math.cos(theta)).add(yAxis.scale(radius * Math.sin(theta))))); + } + arc.push(first); + } else { + const dStep = 1 / steps; + let theta = 0; + let point = Vector3.Zero(); + do { + point = center.add(xAxis.scale(radius * Math.cos(theta)).add(yAxis.scale(radius * Math.sin(theta)))); + arc.push(point); + theta += dStep; + } while (!point.equalsWithEpsilon(third, radius * dStep * 1.1)); + arc.push(third); + if (closed) { + arc.push(first); + } + } + return new _Curve3(arc); } /** - * Creates a node material from a snippet saved by the node material editor - * @param snippetId defines the snippet to load - * @param scene defines the hosting scene - * @param rootUrl defines the root URL to use to load textures and relative dependencies - * @param nodeMaterial defines a node material to update (instead of creating a new one) - * @param skipBuild defines whether to build the node material - * @param waitForTextureReadyness defines whether to wait for texture readiness resolving the promise (default: false) - * @returns a promise that will resolve to the new node material + * A Curve3 object is a logical object, so not a mesh, to handle curves in the 3D geometric space. + * A Curve3 is designed from a series of successive Vector3. + * Tuto : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#curve3-object + * @param points points which make up the curve */ - static ParseFromSnippetAsync(snippetId, scene = EngineStore.LastCreatedScene, rootUrl = "", nodeMaterial, skipBuild = false, waitForTextureReadyness = false) { - if (snippetId === "_BLANK") { - return Promise.resolve(_NodeMaterial.CreateDefault("blank", scene)); + constructor(points) { + this._length = 0; + this._points = points; + this._length = this._computeLength(points); + } + /** + * @returns the Curve3 stored array of successive Vector3 + */ + getPoints() { + return this._points; + } + /** + * @returns the computed length (float) of the curve. + */ + length() { + return this._length; + } + /** + * Returns a new instance of Curve3 object : var curve = curveA.continue(curveB); + * This new Curve3 is built by translating and sticking the curveB at the end of the curveA. + * curveA and curveB keep unchanged. + * @param curve the curve to continue from this curve + * @returns the newly constructed curve + */ + continue(curve) { + const lastPoint = this._points[this._points.length - 1]; + const continuedPoints = this._points.slice(); + const curvePoints = curve.getPoints(); + for (let i = 1; i < curvePoints.length; i++) { + continuedPoints.push(curvePoints[i].subtract(curvePoints[0]).add(lastPoint)); } - return new Promise((resolve, reject) => { - const request = new WebRequest(); - request.addEventListener("readystatechange", () => { - if (request.readyState == 4) { - if (request.status == 200) { - const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload); - const serializationObject = JSON.parse(snippet.nodeMaterial); - if (!nodeMaterial) { - nodeMaterial = SerializationHelper.Parse(() => new _NodeMaterial(snippetId, scene), serializationObject, scene, rootUrl); - nodeMaterial.uniqueId = scene.getUniqueId(); - } - nodeMaterial.parseSerializedObject(serializationObject); - nodeMaterial.snippetId = snippetId; - try { - if (!skipBuild) { - nodeMaterial.build(); - } - } catch (err) { - reject(err); - } - if (waitForTextureReadyness) { - nodeMaterial.whenTexturesReadyAsync().then(() => { - resolve(nodeMaterial); - }).catch((err) => { - reject(err); - }); - } else { - resolve(nodeMaterial); - } - } else { - reject("Unable to load the snippet " + snippetId); - } - } - }); - request.open("GET", this.SnippetUrl + "/" + snippetId.replace(/#/g, "/")); - request.send(); - }); + const continuedCurve = new _Curve3(continuedPoints); + return continuedCurve; + } + _computeLength(path) { + let l = 0; + for (let i = 1; i < path.length; i++) { + l += path[i].subtract(path[i - 1]).length(); + } + return l; } +}; + +// node_modules/@babylonjs/core/Maths/math.vertexFormat.js +var PositionNormalVertex = class _PositionNormalVertex { /** - * Creates a new node material set to default basic configuration - * @param name defines the name of the material - * @param scene defines the hosting scene - * @returns a new NodeMaterial + * Creates a PositionNormalVertex + * @param position the position of the vertex (defaut: 0,0,0) + * @param normal the normal of the vertex (defaut: 0,1,0) */ - static CreateDefault(name69, scene) { - const newMaterial = new _NodeMaterial(name69, scene); - newMaterial.setToDefault(); - newMaterial.build(); - return newMaterial; + constructor(position = Vector3.Zero(), normal = Vector3.Up()) { + this.position = position; + this.normal = normal; + } + /** + * Clones the PositionNormalVertex + * @returns the cloned PositionNormalVertex + */ + clone() { + return new _PositionNormalVertex(this.position.clone(), this.normal.clone()); + } +}; +var PositionNormalTextureVertex = class _PositionNormalTextureVertex { + /** + * Creates a PositionNormalTextureVertex + * @param position the position of the vertex (defaut: 0,0,0) + * @param normal the normal of the vertex (defaut: 0,1,0) + * @param uv the uv of the vertex (default: 0,0) + */ + constructor(position = Vector3.Zero(), normal = Vector3.Up(), uv = Vector2.Zero()) { + this.position = position; + this.normal = normal; + this.uv = uv; + } + /** + * Clones the PositionNormalTextureVertex + * @returns the cloned PositionNormalTextureVertex + */ + clone() { + return new _PositionNormalTextureVertex(this.position.clone(), this.normal.clone(), this.uv.clone()); } }; -NodeMaterial._BuildIdGenerator = 0; -NodeMaterial.EditorURL = `${Tools._DefaultCdnUrl}/v${Engine.Version}/nodeEditor/babylon.nodeEditor.js`; -NodeMaterial.SnippetUrl = `https://snippet.babylonjs.com`; -NodeMaterial.IgnoreTexturesAtLoadTime = false; -__decorate([ - serialize() -], NodeMaterial.prototype, "ignoreAlpha", void 0); -__decorate([ - serialize() -], NodeMaterial.prototype, "maxSimultaneousLights", void 0); -__decorate([ - serialize("mode") -], NodeMaterial.prototype, "_mode", void 0); -__decorate([ - serialize("comment") -], NodeMaterial.prototype, "comment", void 0); -__decorate([ - serialize() -], NodeMaterial.prototype, "forceAlphaBlending", void 0); -RegisterClass("BABYLON.NodeMaterial", NodeMaterial); -// node_modules/@babylonjs/core/Meshes/Builders/icoSphereBuilder.js -function CreateIcoSphereVertexData(options) { - const sideOrientation = options.sideOrientation || VertexData.DEFAULTSIDE; - const radius = options.radius || 1; - const flat = options.flat === void 0 ? true : options.flat; - const subdivisions = (options.subdivisions || 4) | 0; - const radiusX = options.radiusX || radius; - const radiusY = options.radiusY || radius; - const radiusZ = options.radiusZ || radius; - const t = (1 + Math.sqrt(5)) / 2; - const icoVertices = [ - -1, - t, - -0, - 1, - t, - 0, - -1, - -t, - 0, - 1, - -t, - 0, - 0, - -1, - -t, - 0, - 1, - -t, - 0, - -1, - t, - 0, - 1, - t, - t, - 0, - 1, - t, - 0, - -1, - -t, - 0, - 1, - -t, - 0, - -1 - // v8-11 - ]; - const ico_indices = [ - 0, - 11, - 5, - 0, - 5, - 1, - 0, - 1, - 7, - 0, - 7, - 10, - 12, - 22, - 23, - 1, - 5, - 20, - 5, - 11, - 4, - 23, - 22, - 13, - 22, - 18, - 6, - 7, - 1, - 8, - 14, - 21, - 4, - 14, - 4, - 2, - 16, - 13, - 6, - 15, - 6, - 19, - 3, - 8, - 9, - 4, - 21, - 5, - 13, - 17, - 23, - 6, - 13, - 22, - 19, - 6, - 18, - 9, - 8, - 1 - ]; - const vertices_unalias_id = [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - // vertex alias - 0, - 2, - 3, - 3, - 3, - 4, - 7, - 8, - 9, - 9, - 10, - 11 - // 23: B + 12 - ]; - const ico_vertexuv = [ - 5, - 1, - 3, - 1, - 6, - 4, - 0, - 0, - 5, - 3, - 4, - 2, - 2, - 2, - 4, - 0, - 2, - 0, - 1, - 1, - 6, - 0, - 6, - 2, - // vertex alias (for same vertex on different faces) - 0, - 4, - 3, - 3, - 4, - 4, - 3, - 1, - 4, - 2, - 4, - 4, - 0, - 2, - 1, - 1, - 2, - 2, - 3, - 3, - 1, - 3, - 2, - 4 - // 23: B + 12 - ]; - const ustep = 138 / 1024; - const vstep = 239 / 1024; - const uoffset = 60 / 1024; - const voffset = 26 / 1024; - const island_u_offset = -40 / 1024; - const island_v_offset = 20 / 1024; - const island = [ - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 1, - 1, - 0, - 0, - 0, - 1, - 1, - 0, - 0, - 1, - 1, - 1, - 0 - // 15 - 19 - ]; - const indices = []; - const positions = []; - const normals = []; - const uvs = []; - let current_indice = 0; - const face_vertex_pos = new Array(3); - const face_vertex_uv = new Array(3); - let v012; - for (v012 = 0; v012 < 3; v012++) { - face_vertex_pos[v012] = Vector3.Zero(); - face_vertex_uv[v012] = Vector2.Zero(); - } - for (let face = 0; face < 20; face++) { - for (v012 = 0; v012 < 3; v012++) { - const v_id = ico_indices[3 * face + v012]; - face_vertex_pos[v012].copyFromFloats(icoVertices[3 * vertices_unalias_id[v_id]], icoVertices[3 * vertices_unalias_id[v_id] + 1], icoVertices[3 * vertices_unalias_id[v_id] + 2]); - face_vertex_pos[v012].normalize(); - face_vertex_uv[v012].copyFromFloats(ico_vertexuv[2 * v_id] * ustep + uoffset + island[face] * island_u_offset, ico_vertexuv[2 * v_id + 1] * vstep + voffset + island[face] * island_v_offset); - } - const interp_vertex = (i1, i2, c1, c2) => { - const pos_x0 = Vector3.Lerp(face_vertex_pos[0], face_vertex_pos[2], i2 / subdivisions); - const pos_x1 = Vector3.Lerp(face_vertex_pos[1], face_vertex_pos[2], i2 / subdivisions); - const pos_interp = subdivisions === i2 ? face_vertex_pos[2] : Vector3.Lerp(pos_x0, pos_x1, i1 / (subdivisions - i2)); - pos_interp.normalize(); - let vertex_normal; - if (flat) { - const centroid_x0 = Vector3.Lerp(face_vertex_pos[0], face_vertex_pos[2], c2 / subdivisions); - const centroid_x1 = Vector3.Lerp(face_vertex_pos[1], face_vertex_pos[2], c2 / subdivisions); - vertex_normal = Vector3.Lerp(centroid_x0, centroid_x1, c1 / (subdivisions - c2)); - } else { - vertex_normal = new Vector3(pos_interp.x, pos_interp.y, pos_interp.z); +// node_modules/@babylonjs/core/Materials/Node/Blocks/Input/animatedInputBlockTypes.js +var AnimatedInputBlockTypes; +(function(AnimatedInputBlockTypes2) { + AnimatedInputBlockTypes2[AnimatedInputBlockTypes2["None"] = 0] = "None"; + AnimatedInputBlockTypes2[AnimatedInputBlockTypes2["Time"] = 1] = "Time"; + AnimatedInputBlockTypes2[AnimatedInputBlockTypes2["RealTime"] = 2] = "RealTime"; +})(AnimatedInputBlockTypes || (AnimatedInputBlockTypes = {})); + +// node_modules/@babylonjs/core/Materials/Node/Blocks/Input/inputBlock.js +var remapAttributeName = { + position2d: "position", + particle_uv: "vUV", + particle_color: "vColor", + particle_texturemask: "textureMask", + particle_positionw: "vPositionW" +}; +var attributeInFragmentOnly = { + particle_uv: true, + particle_color: true, + particle_texturemask: true, + particle_positionw: true +}; +var attributeAsUniform = { + particle_texturemask: true +}; +var InputBlock = class extends NodeMaterialBlock { + /** + * Gets or sets the connection point type (default is float) + */ + get type() { + if (this._type === NodeMaterialBlockConnectionPointTypes.AutoDetect) { + if (this.isUniform && this.value != null) { + if (!isNaN(this.value)) { + this._type = NodeMaterialBlockConnectionPointTypes.Float; + return this._type; + } + switch (this.value.getClassName()) { + case "Vector2": + this._type = NodeMaterialBlockConnectionPointTypes.Vector2; + return this._type; + case "Vector3": + this._type = NodeMaterialBlockConnectionPointTypes.Vector3; + return this._type; + case "Vector4": + this._type = NodeMaterialBlockConnectionPointTypes.Vector4; + return this._type; + case "Color3": + this._type = NodeMaterialBlockConnectionPointTypes.Color3; + return this._type; + case "Color4": + this._type = NodeMaterialBlockConnectionPointTypes.Color4; + return this._type; + case "Matrix": + this._type = NodeMaterialBlockConnectionPointTypes.Matrix; + return this._type; + } } - vertex_normal.x /= radiusX; - vertex_normal.y /= radiusY; - vertex_normal.z /= radiusZ; - vertex_normal.normalize(); - const uv_x0 = Vector2.Lerp(face_vertex_uv[0], face_vertex_uv[2], i2 / subdivisions); - const uv_x1 = Vector2.Lerp(face_vertex_uv[1], face_vertex_uv[2], i2 / subdivisions); - const uv_interp = subdivisions === i2 ? face_vertex_uv[2] : Vector2.Lerp(uv_x0, uv_x1, i1 / (subdivisions - i2)); - positions.push(pos_interp.x * radiusX, pos_interp.y * radiusY, pos_interp.z * radiusZ); - normals.push(vertex_normal.x, vertex_normal.y, vertex_normal.z); - uvs.push(uv_interp.x, CompatibilityOptions.UseOpenGLOrientationForUV ? 1 - uv_interp.y : uv_interp.y); - indices.push(current_indice); - current_indice++; - }; - for (let i2 = 0; i2 < subdivisions; i2++) { - for (let i1 = 0; i1 + i2 < subdivisions; i1++) { - interp_vertex(i1, i2, i1 + 1 / 3, i2 + 1 / 3); - interp_vertex(i1 + 1, i2, i1 + 1 / 3, i2 + 1 / 3); - interp_vertex(i1, i2 + 1, i1 + 1 / 3, i2 + 1 / 3); - if (i1 + i2 + 1 < subdivisions) { - interp_vertex(i1 + 1, i2, i1 + 2 / 3, i2 + 2 / 3); - interp_vertex(i1 + 1, i2 + 1, i1 + 2 / 3, i2 + 2 / 3); - interp_vertex(i1, i2 + 1, i1 + 2 / 3, i2 + 2 / 3); + if (this.isAttribute) { + switch (this.name) { + case "position": + case "normal": + case "particle_positionw": + this._type = NodeMaterialBlockConnectionPointTypes.Vector3; + return this._type; + case "uv": + case "uv2": + case "uv3": + case "uv4": + case "uv5": + case "uv6": + case "position2d": + case "particle_uv": + this._type = NodeMaterialBlockConnectionPointTypes.Vector2; + return this._type; + case "matricesIndices": + case "matricesWeights": + case "matricesIndicesExtra": + case "matricesWeightsExtra": + case "world0": + case "world1": + case "world2": + case "world3": + case "tangent": + this._type = NodeMaterialBlockConnectionPointTypes.Vector4; + return this._type; + case "color": + case "instanceColor": + case "particle_color": + case "particle_texturemask": + this._type = NodeMaterialBlockConnectionPointTypes.Color4; + return this._type; + } + } + if (this.isSystemValue) { + switch (this._systemValue) { + case NodeMaterialSystemValues.World: + case NodeMaterialSystemValues.WorldView: + case NodeMaterialSystemValues.WorldViewProjection: + case NodeMaterialSystemValues.View: + case NodeMaterialSystemValues.ViewProjection: + case NodeMaterialSystemValues.Projection: + this._type = NodeMaterialBlockConnectionPointTypes.Matrix; + return this._type; + case NodeMaterialSystemValues.CameraPosition: + this._type = NodeMaterialBlockConnectionPointTypes.Vector3; + return this._type; + case NodeMaterialSystemValues.FogColor: + this._type = NodeMaterialBlockConnectionPointTypes.Color3; + return this._type; + case NodeMaterialSystemValues.DeltaTime: + case NodeMaterialSystemValues.MaterialAlpha: + this._type = NodeMaterialBlockConnectionPointTypes.Float; + return this._type; + case NodeMaterialSystemValues.CameraParameters: + this._type = NodeMaterialBlockConnectionPointTypes.Vector4; + return this._type; } } } + return this._type; } - VertexData._ComputeSides(sideOrientation, positions, indices, normals, uvs, options.frontUVs, options.backUVs); - const vertexData = new VertexData(); - vertexData.indices = indices; - vertexData.positions = positions; - vertexData.normals = normals; - vertexData.uvs = uvs; - return vertexData; -} -function CreateIcoSphere(name69, options = {}, scene = null) { - const sphere = new Mesh(name69, scene); - options.sideOrientation = Mesh._GetDefaultSideOrientation(options.sideOrientation); - sphere._originalBuilderSideOrientation = options.sideOrientation; - const vertexData = CreateIcoSphereVertexData(options); - vertexData.applyToMesh(sphere, options.updatable); - return sphere; -} -var IcoSphereBuilder = { - // eslint-disable-next-line @typescript-eslint/naming-convention - CreateIcoSphere -}; -VertexData.CreateIcoSphere = CreateIcoSphereVertexData; -Mesh.CreateIcoSphere = (name69, options, scene) => { - return CreateIcoSphere(name69, options, scene); -}; - -// node_modules/@babylonjs/core/XR/features/WebXRHandTracking.js -var HandPart; -(function(HandPart2) { - HandPart2["WRIST"] = "wrist"; - HandPart2["THUMB"] = "thumb"; - HandPart2["INDEX"] = "index"; - HandPart2["MIDDLE"] = "middle"; - HandPart2["RING"] = "ring"; - HandPart2["LITTLE"] = "little"; -})(HandPart || (HandPart = {})); -var WebXRHandJoint; -(function(WebXRHandJoint2) { - WebXRHandJoint2["WRIST"] = "wrist"; - WebXRHandJoint2["THUMB_METACARPAL"] = "thumb-metacarpal"; - WebXRHandJoint2["THUMB_PHALANX_PROXIMAL"] = "thumb-phalanx-proximal"; - WebXRHandJoint2["THUMB_PHALANX_DISTAL"] = "thumb-phalanx-distal"; - WebXRHandJoint2["THUMB_TIP"] = "thumb-tip"; - WebXRHandJoint2["INDEX_FINGER_METACARPAL"] = "index-finger-metacarpal"; - WebXRHandJoint2["INDEX_FINGER_PHALANX_PROXIMAL"] = "index-finger-phalanx-proximal"; - WebXRHandJoint2["INDEX_FINGER_PHALANX_INTERMEDIATE"] = "index-finger-phalanx-intermediate"; - WebXRHandJoint2["INDEX_FINGER_PHALANX_DISTAL"] = "index-finger-phalanx-distal"; - WebXRHandJoint2["INDEX_FINGER_TIP"] = "index-finger-tip"; - WebXRHandJoint2["MIDDLE_FINGER_METACARPAL"] = "middle-finger-metacarpal"; - WebXRHandJoint2["MIDDLE_FINGER_PHALANX_PROXIMAL"] = "middle-finger-phalanx-proximal"; - WebXRHandJoint2["MIDDLE_FINGER_PHALANX_INTERMEDIATE"] = "middle-finger-phalanx-intermediate"; - WebXRHandJoint2["MIDDLE_FINGER_PHALANX_DISTAL"] = "middle-finger-phalanx-distal"; - WebXRHandJoint2["MIDDLE_FINGER_TIP"] = "middle-finger-tip"; - WebXRHandJoint2["RING_FINGER_METACARPAL"] = "ring-finger-metacarpal"; - WebXRHandJoint2["RING_FINGER_PHALANX_PROXIMAL"] = "ring-finger-phalanx-proximal"; - WebXRHandJoint2["RING_FINGER_PHALANX_INTERMEDIATE"] = "ring-finger-phalanx-intermediate"; - WebXRHandJoint2["RING_FINGER_PHALANX_DISTAL"] = "ring-finger-phalanx-distal"; - WebXRHandJoint2["RING_FINGER_TIP"] = "ring-finger-tip"; - WebXRHandJoint2["PINKY_FINGER_METACARPAL"] = "pinky-finger-metacarpal"; - WebXRHandJoint2["PINKY_FINGER_PHALANX_PROXIMAL"] = "pinky-finger-phalanx-proximal"; - WebXRHandJoint2["PINKY_FINGER_PHALANX_INTERMEDIATE"] = "pinky-finger-phalanx-intermediate"; - WebXRHandJoint2["PINKY_FINGER_PHALANX_DISTAL"] = "pinky-finger-phalanx-distal"; - WebXRHandJoint2["PINKY_FINGER_TIP"] = "pinky-finger-tip"; -})(WebXRHandJoint || (WebXRHandJoint = {})); -var handJointReferenceArray = [ - WebXRHandJoint.WRIST, - WebXRHandJoint.THUMB_METACARPAL, - WebXRHandJoint.THUMB_PHALANX_PROXIMAL, - WebXRHandJoint.THUMB_PHALANX_DISTAL, - WebXRHandJoint.THUMB_TIP, - WebXRHandJoint.INDEX_FINGER_METACARPAL, - WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL, - WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE, - WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL, - WebXRHandJoint.INDEX_FINGER_TIP, - WebXRHandJoint.MIDDLE_FINGER_METACARPAL, - WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL, - WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE, - WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL, - WebXRHandJoint.MIDDLE_FINGER_TIP, - WebXRHandJoint.RING_FINGER_METACARPAL, - WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL, - WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE, - WebXRHandJoint.RING_FINGER_PHALANX_DISTAL, - WebXRHandJoint.RING_FINGER_TIP, - WebXRHandJoint.PINKY_FINGER_METACARPAL, - WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL, - WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE, - WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL, - WebXRHandJoint.PINKY_FINGER_TIP -]; -var handPartsDefinition = { - [HandPart.WRIST]: [WebXRHandJoint.WRIST], - [HandPart.THUMB]: [WebXRHandJoint.THUMB_METACARPAL, WebXRHandJoint.THUMB_PHALANX_PROXIMAL, WebXRHandJoint.THUMB_PHALANX_DISTAL, WebXRHandJoint.THUMB_TIP], - [HandPart.INDEX]: [ - WebXRHandJoint.INDEX_FINGER_METACARPAL, - WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL, - WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE, - WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL, - WebXRHandJoint.INDEX_FINGER_TIP - ], - [HandPart.MIDDLE]: [ - WebXRHandJoint.MIDDLE_FINGER_METACARPAL, - WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL, - WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE, - WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL, - WebXRHandJoint.MIDDLE_FINGER_TIP - ], - [HandPart.RING]: [ - WebXRHandJoint.RING_FINGER_METACARPAL, - WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL, - WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE, - WebXRHandJoint.RING_FINGER_PHALANX_DISTAL, - WebXRHandJoint.RING_FINGER_TIP - ], - [HandPart.LITTLE]: [ - WebXRHandJoint.PINKY_FINGER_METACARPAL, - WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL, - WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE, - WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL, - WebXRHandJoint.PINKY_FINGER_TIP - ] -}; -var WebXRHand = class { /** - * Get the hand mesh. + * Creates a new InputBlock + * @param name defines the block name + * @param target defines the target of that block (Vertex by default) + * @param type defines the type of the input (can be set to NodeMaterialBlockConnectionPointTypes.AutoDetect) */ - get handMesh() { - return this._handMesh; + constructor(name69, target = NodeMaterialBlockTargets.Vertex, type = NodeMaterialBlockConnectionPointTypes.AutoDetect) { + super(name69, target, false); + this._mode = NodeMaterialBlockConnectionPointMode.Undefined; + this._animationType = AnimatedInputBlockTypes.None; + this.min = 0; + this.max = 0; + this.isBoolean = false; + this.matrixMode = 0; + this._systemValue = null; + this.isConstant = false; + this.groupInInspector = ""; + this.onValueChangedObservable = new Observable(); + this.convertToGammaSpace = false; + this.convertToLinearSpace = false; + this._type = type; + this.setDefaultValue(); + this.registerOutput("output", type); } /** - * Get meshes of part of the hand. - * @param part The part of hand to get. - * @returns An array of meshes that correlate to the hand part requested. + * Validates if a name is a reserve word. + * @param newName the new name to be given to the node. + * @returns false if the name is a reserve word, else true. */ - getHandPartMeshes(part) { - return handPartsDefinition[part].map((name69) => this._jointMeshes[handJointReferenceArray.indexOf(name69)]); + validateBlockName(newName) { + if (!this.isAttribute) { + return super.validateBlockName(newName); + } + return true; } /** - * Retrieves a mesh linked to a named joint in the hand. - * @param jointName The name of the joint. - * @returns An AbstractMesh whose position corresponds with the joint position. + * Gets the output component */ - getJointMesh(jointName) { - return this._jointMeshes[handJointReferenceArray.indexOf(jointName)]; + get output() { + return this._outputs[0]; } /** - * Construct a new hand object - * @param xrController The controller to which the hand correlates. - * @param _jointMeshes The meshes to be used to track the hand joints. - * @param _handMesh An optional hand mesh. - * @param rigMapping An optional rig mapping for the hand mesh. - * If not provided (but a hand mesh is provided), - * it will be assumed that the hand mesh's bones are named - * directly after the WebXR bone names. - * @param _leftHandedMeshes Are the hand meshes left-handed-system meshes - * @param _jointsInvisible Are the tracked joint meshes visible - * @param _jointScaleFactor Scale factor for all joint meshes + * Set the source of this connection point to a vertex attribute + * @param attributeName defines the attribute name (position, uv, normal, etc...). If not specified it will take the connection point name + * @returns the current connection point */ - constructor(xrController, _jointMeshes, _handMesh, rigMapping, _leftHandedMeshes = false, _jointsInvisible = false, _jointScaleFactor = 1) { - this.xrController = xrController; - this._jointMeshes = _jointMeshes; - this._handMesh = _handMesh; - this.rigMapping = rigMapping; - this._leftHandedMeshes = _leftHandedMeshes; - this._jointsInvisible = _jointsInvisible; - this._jointScaleFactor = _jointScaleFactor; - this._jointTransforms = new Array(handJointReferenceArray.length); - this._jointTransformMatrices = new Float32Array(handJointReferenceArray.length * 16); - this._tempJointMatrix = new Matrix(); - this._jointRadii = new Float32Array(handJointReferenceArray.length); - this._scene = _jointMeshes[0].getScene(); - for (let jointIdx = 0; jointIdx < this._jointTransforms.length; jointIdx++) { - const jointTransform = this._jointTransforms[jointIdx] = new TransformNode(handJointReferenceArray[jointIdx], this._scene); - jointTransform.rotationQuaternion = new Quaternion(); - _jointMeshes[jointIdx].rotationQuaternion = new Quaternion(); - } - if (_handMesh) { - this.setHandMesh(_handMesh, rigMapping); - } - if (this.xrController.motionController) { - if (this.xrController.motionController.rootMesh) { - this.xrController.motionController.rootMesh.dispose(false, true); - } + setAsAttribute(attributeName) { + this._mode = NodeMaterialBlockConnectionPointMode.Attribute; + if (attributeName) { + this.name = attributeName; } - this.xrController.onMotionControllerInitObservable.add((motionController) => { - motionController._doNotLoadControllerMesh = true; - }); + return this; } /** - * Sets the current hand mesh to render for the WebXRHand. - * @param handMesh The rigged hand mesh that will be tracked to the user's hand. - * @param rigMapping The mapping from XRHandJoint to bone names to use with the mesh. - * @param _xrSessionManager The XRSessionManager used to initialize the hand mesh. + * Set the source of this connection point to a system value + * @param value define the system value to use (world, view, etc...) or null to switch to manual value + * @returns the current connection point */ - setHandMesh(handMesh, rigMapping, _xrSessionManager) { - this._handMesh = handMesh; - handMesh.alwaysSelectAsActiveMesh = true; - handMesh.getChildMeshes().forEach((mesh) => { - mesh.alwaysSelectAsActiveMesh = true; - }); - if (this._handMesh.skeleton) { - const handMeshSkeleton = this._handMesh.skeleton; - handJointReferenceArray.forEach((jointName, jointIdx) => { - const jointBoneIdx = handMeshSkeleton.getBoneIndexByName(rigMapping ? rigMapping[jointName] : jointName); - if (jointBoneIdx !== -1) { - handMeshSkeleton.bones[jointBoneIdx].linkTransformNode(this._jointTransforms[jointIdx]); - } - }); - } + setAsSystemValue(value) { + this.systemValue = value; + return this; } /** - * Update this hand from the latest xr frame. - * @param xrFrame The latest frame received from WebXR. - * @param referenceSpace The current viewer reference space. + * Gets or sets the value of that point. + * Please note that this value will be ignored if valueCallback is defined */ - updateFromXRFrame(xrFrame, referenceSpace) { - const hand = this.xrController.inputSource.hand; - if (!hand) { - return; - } - const anyHand = hand; - const jointSpaces = handJointReferenceArray.map((jointName) => anyHand[jointName] || hand.get(jointName)); - let trackingSuccessful = false; - if (xrFrame.fillPoses && xrFrame.fillJointRadii) { - trackingSuccessful = xrFrame.fillPoses(jointSpaces, referenceSpace, this._jointTransformMatrices) && xrFrame.fillJointRadii(jointSpaces, this._jointRadii); - } else if (xrFrame.getJointPose) { - trackingSuccessful = true; - for (let jointIdx = 0; jointIdx < jointSpaces.length; jointIdx++) { - const jointPose = xrFrame.getJointPose(jointSpaces[jointIdx], referenceSpace); - if (jointPose) { - this._jointTransformMatrices.set(jointPose.transform.matrix, jointIdx * 16); - this._jointRadii[jointIdx] = jointPose.radius || 8e-3; - } else { - trackingSuccessful = false; - break; - } + get value() { + return this._storedValue; + } + set value(value) { + if (this.type === NodeMaterialBlockConnectionPointTypes.Float) { + if (this.isBoolean) { + value = value ? 1 : 0; + } else if (this.min !== this.max) { + value = Math.max(this.min, value); + value = Math.min(this.max, value); } } - if (!trackingSuccessful) { - return; - } - handJointReferenceArray.forEach((_jointName, jointIdx) => { - const jointTransform = this._jointTransforms[jointIdx]; - Matrix.FromArrayToRef(this._jointTransformMatrices, jointIdx * 16, this._tempJointMatrix); - this._tempJointMatrix.decompose(void 0, jointTransform.rotationQuaternion, jointTransform.position); - const scaledJointRadius = this._jointRadii[jointIdx] * this._jointScaleFactor; - const jointMesh = this._jointMeshes[jointIdx]; - jointMesh.isVisible = !this._handMesh && !this._jointsInvisible; - jointMesh.position.copyFrom(jointTransform.position); - jointMesh.rotationQuaternion.copyFrom(jointTransform.rotationQuaternion); - jointMesh.scaling.setAll(scaledJointRadius); - if (!this._scene.useRightHandedSystem) { - jointMesh.position.z *= -1; - jointMesh.rotationQuaternion.z *= -1; - jointMesh.rotationQuaternion.w *= -1; - if (this._leftHandedMeshes && this._handMesh) { - jointTransform.position.z *= -1; - jointTransform.rotationQuaternion.z *= -1; - jointTransform.rotationQuaternion.w *= -1; - } - } - }); - if (this._handMesh) { - this._handMesh.isVisible = true; - } + this._storedValue = value; + this._mode = NodeMaterialBlockConnectionPointMode.Uniform; + this.onValueChangedObservable.notifyObservers(this); } /** - * Dispose this Hand object - * @param disposeMeshes Should the meshes be disposed as well + * Gets or sets a callback used to get the value of that point. + * Please note that setting this value will force the connection point to ignore the value property */ - dispose(disposeMeshes = false) { - var _a; - if (this._handMesh) { - if (disposeMeshes) { - (_a = this._handMesh.skeleton) == null ? void 0 : _a.dispose(); - this._handMesh.dispose(false, true); - } else { - this._handMesh.isVisible = false; - } - } - } -}; -var WebXRHandTracking = class _WebXRHandTracking extends WebXRAbstractFeature { - static _GenerateTrackedJointMeshes(featureOptions) { - const meshes = {}; - ["left", "right"].map((handedness) => { - var _a, _b, _c, _d, _e; - const trackedMeshes = []; - const originalMesh = ((_a = featureOptions.jointMeshes) == null ? void 0 : _a.sourceMesh) || CreateIcoSphere("jointParent", _WebXRHandTracking._ICOSPHERE_PARAMS); - originalMesh.isVisible = !!((_b = featureOptions.jointMeshes) == null ? void 0 : _b.keepOriginalVisible); - for (let i = 0; i < handJointReferenceArray.length; ++i) { - let newInstance = originalMesh.createInstance(`${handedness}-handJoint-${i}`); - if ((_c = featureOptions.jointMeshes) == null ? void 0 : _c.onHandJointMeshGenerated) { - const returnedMesh = featureOptions.jointMeshes.onHandJointMeshGenerated(newInstance, i, handedness); - if (returnedMesh) { - if (returnedMesh !== newInstance) { - newInstance.dispose(); - newInstance = returnedMesh; - } - } - } - newInstance.isPickable = false; - if ((_d = featureOptions.jointMeshes) == null ? void 0 : _d.enablePhysics) { - const props = ((_e = featureOptions.jointMeshes) == null ? void 0 : _e.physicsProps) || {}; - newInstance.scaling.setAll(0.02); - const type = props.impostorType !== void 0 ? props.impostorType : PhysicsImpostor.SphereImpostor; - newInstance.physicsImpostor = new PhysicsImpostor(newInstance, type, { mass: 0, ...props }); - } - newInstance.rotationQuaternion = new Quaternion(); - newInstance.isVisible = false; - trackedMeshes.push(newInstance); - } - meshes[handedness] = trackedMeshes; - }); - return { left: meshes.left, right: meshes.right }; + get valueCallback() { + return this._valueCallback; } - static _GenerateDefaultHandMeshesAsync(scene, xrSessionManager, options) { - return new Promise(async (resolve) => { - var _a, _b, _c, _d, _e, _f; - const riggedMeshes = {}; - if ((_b = (_a = _WebXRHandTracking._RightHandGLB) == null ? void 0 : _a.meshes[1]) == null ? void 0 : _b.isDisposed()) { - _WebXRHandTracking._RightHandGLB = null; - } - if ((_d = (_c = _WebXRHandTracking._LeftHandGLB) == null ? void 0 : _c.meshes[1]) == null ? void 0 : _d.isDisposed()) { - _WebXRHandTracking._LeftHandGLB = null; - } - const handsDefined = !!(_WebXRHandTracking._RightHandGLB && _WebXRHandTracking._LeftHandGLB); - const handGLBs = await Promise.all([ - _WebXRHandTracking._RightHandGLB || SceneLoader.ImportMeshAsync("", _WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL, _WebXRHandTracking.DEFAULT_HAND_MODEL_RIGHT_FILENAME, scene), - _WebXRHandTracking._LeftHandGLB || SceneLoader.ImportMeshAsync("", _WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL, _WebXRHandTracking.DEFAULT_HAND_MODEL_LEFT_FILENAME, scene) - ]); - _WebXRHandTracking._RightHandGLB = handGLBs[0]; - _WebXRHandTracking._LeftHandGLB = handGLBs[1]; - const handShader = await NodeMaterial.ParseFromFileAsync("handShader", _WebXRHandTracking.DEFAULT_HAND_MODEL_SHADER_URL, scene); - handShader.needDepthPrePass = true; - handShader.transparencyMode = Material.MATERIAL_ALPHABLEND; - handShader.alphaMode = 2; - handShader.build(false); - const handColors = { - base: Color3.FromInts(116, 63, 203), - fresnel: Color3.FromInts(149, 102, 229), - fingerColor: Color3.FromInts(177, 130, 255), - tipFresnel: Color3.FromInts(220, 200, 255), - ...(_e = options == null ? void 0 : options.handMeshes) == null ? void 0 : _e.customColors - }; - const handNodes = { - base: handShader.getBlockByName("baseColor"), - fresnel: handShader.getBlockByName("fresnelColor"), - fingerColor: handShader.getBlockByName("fingerColor"), - tipFresnel: handShader.getBlockByName("tipFresnelColor") - }; - handNodes.base.value = handColors.base; - handNodes.fresnel.value = handColors.fresnel; - handNodes.fingerColor.value = handColors.fingerColor; - handNodes.tipFresnel.value = handColors.tipFresnel; - const isMultiview = (_f = xrSessionManager._getBaseLayerWrapper()) == null ? void 0 : _f.isMultiview; - ["left", "right"].forEach((handedness) => { - const handGLB = handedness == "left" ? _WebXRHandTracking._LeftHandGLB : _WebXRHandTracking._RightHandGLB; - if (!handGLB) { - throw new Error("Could not load hand model"); - } - const handMesh = handGLB.meshes[1]; - handMesh._internalAbstractMeshDataInfo._computeBonesUsingShaders = true; - if (!isMultiview) { - handMesh.material = handShader.clone(`${handedness}HandShaderClone`, true); - } - handMesh.isVisible = false; - riggedMeshes[handedness] = handMesh; - if (!handsDefined && !scene.useRightHandedSystem) { - handGLB.meshes[1].rotate(Axis.Y, Math.PI); - } - }); - handShader.dispose(); - resolve({ left: riggedMeshes.left, right: riggedMeshes.right }); - }); + set valueCallback(value) { + this._valueCallback = value; + this._mode = NodeMaterialBlockConnectionPointMode.Uniform; } /** - * Generates a mapping from XRHandJoint to bone name for the default hand mesh. - * @param handedness The handedness being mapped for. - * @returns A mapping from XRHandJoint to bone name. + * Gets or sets the associated variable name in the shader */ - static _GenerateDefaultHandMeshRigMapping(handedness) { - const H = handedness == "right" ? "R" : "L"; - return { - [WebXRHandJoint.WRIST]: `wrist_${H}`, - [WebXRHandJoint.THUMB_METACARPAL]: `thumb_metacarpal_${H}`, - [WebXRHandJoint.THUMB_PHALANX_PROXIMAL]: `thumb_proxPhalanx_${H}`, - [WebXRHandJoint.THUMB_PHALANX_DISTAL]: `thumb_distPhalanx_${H}`, - [WebXRHandJoint.THUMB_TIP]: `thumb_tip_${H}`, - [WebXRHandJoint.INDEX_FINGER_METACARPAL]: `index_metacarpal_${H}`, - [WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL]: `index_proxPhalanx_${H}`, - [WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE]: `index_intPhalanx_${H}`, - [WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL]: `index_distPhalanx_${H}`, - [WebXRHandJoint.INDEX_FINGER_TIP]: `index_tip_${H}`, - [WebXRHandJoint.MIDDLE_FINGER_METACARPAL]: `middle_metacarpal_${H}`, - [WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL]: `middle_proxPhalanx_${H}`, - [WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE]: `middle_intPhalanx_${H}`, - [WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL]: `middle_distPhalanx_${H}`, - [WebXRHandJoint.MIDDLE_FINGER_TIP]: `middle_tip_${H}`, - [WebXRHandJoint.RING_FINGER_METACARPAL]: `ring_metacarpal_${H}`, - [WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL]: `ring_proxPhalanx_${H}`, - [WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE]: `ring_intPhalanx_${H}`, - [WebXRHandJoint.RING_FINGER_PHALANX_DISTAL]: `ring_distPhalanx_${H}`, - [WebXRHandJoint.RING_FINGER_TIP]: `ring_tip_${H}`, - [WebXRHandJoint.PINKY_FINGER_METACARPAL]: `little_metacarpal_${H}`, - [WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL]: `little_proxPhalanx_${H}`, - [WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE]: `little_intPhalanx_${H}`, - [WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL]: `little_distPhalanx_${H}`, - [WebXRHandJoint.PINKY_FINGER_TIP]: `little_tip_${H}` - }; + get associatedVariableName() { + return this._associatedVariableName; } - /** - * Check if the needed objects are defined. - * This does not mean that the feature is enabled, but that the objects needed are well defined. - * @returns true if the needed objects for this feature are defined - */ - isCompatible() { - return typeof XRHand !== "undefined"; + set associatedVariableName(value) { + this._associatedVariableName = value; } - /** - * Get the hand object according to the controller id - * @param controllerId the controller id to which we want to get the hand - * @returns null if not found or the WebXRHand object if found - */ - getHandByControllerId(controllerId) { - return this._attachedHands[controllerId]; + /** Gets or sets the type of animation applied to the input */ + get animationType() { + return this._animationType; + } + set animationType(value) { + this._animationType = value; } /** - * Get a hand object according to the requested handedness - * @param handedness the handedness to request - * @returns null if not found or the WebXRHand object if found + * Gets a boolean indicating that this connection point not defined yet */ - getHandByHandedness(handedness) { - if (handedness == "none") { - return null; - } - return this._trackingHands[handedness]; + get isUndefined() { + return this._mode === NodeMaterialBlockConnectionPointMode.Undefined; } /** - * Creates a new instance of the XR hand tracking feature. - * @param _xrSessionManager An instance of WebXRSessionManager. - * @param options Options to use when constructing this feature. + * Gets or sets a boolean indicating that this connection point is coming from an uniform. + * In this case the connection point name must be the name of the uniform to use. + * Can only be set on inputs */ - constructor(_xrSessionManager, options) { - super(_xrSessionManager); - this.options = options; - this._attachedHands = {}; - this._trackingHands = { left: null, right: null }; - this._handResources = { jointMeshes: null, handMeshes: null, rigMappings: null }; - this._worldScaleObserver = null; - this.onHandAddedObservable = new Observable(); - this.onHandRemovedObservable = new Observable(); - this._attachHand = (xrController) => { - var _a, _b, _c; - if (!xrController.inputSource.hand || xrController.inputSource.handedness == "none" || !this._handResources.jointMeshes) { - return; - } - const handedness = xrController.inputSource.handedness; - const webxrHand = new WebXRHand(xrController, this._handResources.jointMeshes[handedness], this._handResources.handMeshes && this._handResources.handMeshes[handedness], this._handResources.rigMappings && this._handResources.rigMappings[handedness], (_a = this.options.handMeshes) == null ? void 0 : _a.meshesUseLeftHandedCoordinates, (_b = this.options.jointMeshes) == null ? void 0 : _b.invisible, (_c = this.options.jointMeshes) == null ? void 0 : _c.scaleFactor); - this._attachedHands[xrController.uniqueId] = webxrHand; - this._trackingHands[handedness] = webxrHand; - this.onHandAddedObservable.notifyObservers(webxrHand); - }; - this._detachHand = (xrController) => { - this._detachHandById(xrController.uniqueId); - }; - this.xrNativeFeatureName = "hand-tracking"; - const anyOptions = options; - const anyJointMeshOptions = anyOptions.jointMeshes; - if (anyJointMeshOptions) { - if (typeof anyJointMeshOptions.disableDefaultHandMesh !== "undefined") { - options.handMeshes = options.handMeshes || {}; - options.handMeshes.disableDefaultMeshes = anyJointMeshOptions.disableDefaultHandMesh; - } - if (typeof anyJointMeshOptions.handMeshes !== "undefined") { - options.handMeshes = options.handMeshes || {}; - options.handMeshes.customMeshes = anyJointMeshOptions.handMeshes; - } - if (typeof anyJointMeshOptions.leftHandedSystemMeshes !== "undefined") { - options.handMeshes = options.handMeshes || {}; - options.handMeshes.meshesUseLeftHandedCoordinates = anyJointMeshOptions.leftHandedSystemMeshes; - } - if (typeof anyJointMeshOptions.rigMapping !== "undefined") { - options.handMeshes = options.handMeshes || {}; - const leftRigMapping = {}; - const rightRigMapping = {}; - [ - [anyJointMeshOptions.rigMapping.left, leftRigMapping], - [anyJointMeshOptions.rigMapping.right, rightRigMapping] - ].forEach((rigMappingTuple) => { - const legacyRigMapping = rigMappingTuple[0]; - const rigMapping = rigMappingTuple[1]; - legacyRigMapping.forEach((modelJointName, index) => { - rigMapping[handJointReferenceArray[index]] = modelJointName; - }); - }); - options.handMeshes.customRigMappings = { - left: leftRigMapping, - right: rightRigMapping - }; - } - } + get isUniform() { + return this._mode === NodeMaterialBlockConnectionPointMode.Uniform; + } + set isUniform(value) { + this._mode = value ? NodeMaterialBlockConnectionPointMode.Uniform : NodeMaterialBlockConnectionPointMode.Undefined; + this.associatedVariableName = ""; } /** - * Attach this feature. - * Will usually be called by the features manager. - * - * @returns true if successful. + * Gets or sets a boolean indicating that this connection point is coming from an attribute. + * In this case the connection point name must be the name of the attribute to use + * Can only be set on inputs */ - attach() { - var _a, _b, _c, _d; - if (!super.attach()) { - return false; - } - this._handResources = { - jointMeshes: _WebXRHandTracking._GenerateTrackedJointMeshes(this.options), - handMeshes: ((_a = this.options.handMeshes) == null ? void 0 : _a.customMeshes) || null, - rigMappings: ((_b = this.options.handMeshes) == null ? void 0 : _b.customRigMappings) || null - }; - if (!((_c = this.options.handMeshes) == null ? void 0 : _c.customMeshes) && !((_d = this.options.handMeshes) == null ? void 0 : _d.disableDefaultMeshes)) { - _WebXRHandTracking._GenerateDefaultHandMeshesAsync(EngineStore.LastCreatedScene, this._xrSessionManager, this.options).then((defaultHandMeshes) => { - var _a2, _b2; - this._handResources.handMeshes = defaultHandMeshes; - this._handResources.rigMappings = { - left: _WebXRHandTracking._GenerateDefaultHandMeshRigMapping("left"), - right: _WebXRHandTracking._GenerateDefaultHandMeshRigMapping("right") - }; - (_a2 = this._trackingHands.left) == null ? void 0 : _a2.setHandMesh(this._handResources.handMeshes.left, this._handResources.rigMappings.left, this._xrSessionManager); - (_b2 = this._trackingHands.right) == null ? void 0 : _b2.setHandMesh(this._handResources.handMeshes.right, this._handResources.rigMappings.right, this._xrSessionManager); - this._handResources.handMeshes.left.scaling.setAll(this._xrSessionManager.worldScalingFactor); - this._handResources.handMeshes.right.scaling.setAll(this._xrSessionManager.worldScalingFactor); - }); - this._worldScaleObserver = this._xrSessionManager.onWorldScaleFactorChangedObservable.add((scalingFactors) => { - if (this._handResources.handMeshes) { - this._handResources.handMeshes.left.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor); - this._handResources.handMeshes.right.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor); - } - }); - } - this.options.xrInput.controllers.forEach(this._attachHand); - this._addNewAttachObserver(this.options.xrInput.onControllerAddedObservable, this._attachHand); - this._addNewAttachObserver(this.options.xrInput.onControllerRemovedObservable, this._detachHand); - return true; - } - _onXRFrame(_xrFrame) { - var _a, _b; - (_a = this._trackingHands.left) == null ? void 0 : _a.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace); - (_b = this._trackingHands.right) == null ? void 0 : _b.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace); + get isAttribute() { + return this._mode === NodeMaterialBlockConnectionPointMode.Attribute; } - _detachHandById(controllerId, disposeMesh) { - var _a; - const hand = this.getHandByControllerId(controllerId); - if (hand) { - const handedness = hand.xrController.inputSource.handedness == "left" ? "left" : "right"; - if (((_a = this._trackingHands[handedness]) == null ? void 0 : _a.xrController.uniqueId) === controllerId) { - this._trackingHands[handedness] = null; - } - this.onHandRemovedObservable.notifyObservers(hand); - hand.dispose(disposeMesh); - delete this._attachedHands[controllerId]; - } + set isAttribute(value) { + this._mode = value ? NodeMaterialBlockConnectionPointMode.Attribute : NodeMaterialBlockConnectionPointMode.Undefined; + this.associatedVariableName = ""; } /** - * Detach this feature. - * Will usually be called by the features manager. - * - * @returns true if successful. + * Gets or sets a boolean indicating that this connection point is generating a varying variable. + * Can only be set on exit points */ - detach() { - var _a; - if (!super.detach()) { - return false; - } - Object.keys(this._attachedHands).forEach((uniqueId) => { - var _a2; - return this._detachHandById(uniqueId, (_a2 = this.options.handMeshes) == null ? void 0 : _a2.disposeOnSessionEnd); - }); - if ((_a = this.options.handMeshes) == null ? void 0 : _a.disposeOnSessionEnd) { - if (this._handResources.jointMeshes) { - this._handResources.jointMeshes.left.forEach((trackedMesh) => trackedMesh.dispose()); - this._handResources.jointMeshes.right.forEach((trackedMesh) => trackedMesh.dispose()); - } - } - if (this._worldScaleObserver) { - this._xrSessionManager.onWorldScaleFactorChangedObservable.remove(this._worldScaleObserver); - } - return true; + get isVarying() { + return this._mode === NodeMaterialBlockConnectionPointMode.Varying; + } + set isVarying(value) { + this._mode = value ? NodeMaterialBlockConnectionPointMode.Varying : NodeMaterialBlockConnectionPointMode.Undefined; + this.associatedVariableName = ""; } /** - * Dispose this feature and all of the resources attached. + * Gets a boolean indicating that the current connection point is a system value */ - dispose() { - var _a; - super.dispose(); - this.onHandAddedObservable.clear(); - this.onHandRemovedObservable.clear(); - if (this._handResources.handMeshes && !((_a = this.options.handMeshes) == null ? void 0 : _a.customMeshes)) { - this._handResources.handMeshes.left.dispose(); - this._handResources.handMeshes.right.dispose(); - _WebXRHandTracking._RightHandGLB = null; - _WebXRHandTracking._LeftHandGLB = null; - } - if (this._handResources.jointMeshes) { - this._handResources.jointMeshes.left.forEach((trackedMesh) => trackedMesh.dispose()); - this._handResources.jointMeshes.right.forEach((trackedMesh) => trackedMesh.dispose()); - } + get isSystemValue() { + return this._systemValue != null; } -}; -WebXRHandTracking.Name = WebXRFeatureName.HAND_TRACKING; -WebXRHandTracking.Version = 1; -WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL = "https://assets.babylonjs.com/meshes/HandMeshes/"; -WebXRHandTracking.DEFAULT_HAND_MODEL_RIGHT_FILENAME = "r_hand_rhs.glb"; -WebXRHandTracking.DEFAULT_HAND_MODEL_LEFT_FILENAME = "l_hand_rhs.glb"; -WebXRHandTracking.DEFAULT_HAND_MODEL_SHADER_URL = "https://assets.babylonjs.com/meshes/HandMeshes/handsShader.json"; -WebXRHandTracking._ICOSPHERE_PARAMS = { radius: 0.5, flat: false, subdivisions: 2 }; -WebXRHandTracking._RightHandGLB = null; -WebXRHandTracking._LeftHandGLB = null; -WebXRFeaturesManager.AddWebXRFeature(WebXRHandTracking.Name, (xrSessionManager, options) => { - return () => new WebXRHandTracking(xrSessionManager, options); -}, WebXRHandTracking.Version, false); - -// node_modules/@babylonjs/core/Behaviors/Meshes/handConstraintBehavior.js -var HandConstraintZone; -(function(HandConstraintZone2) { - HandConstraintZone2[HandConstraintZone2["ABOVE_FINGER_TIPS"] = 0] = "ABOVE_FINGER_TIPS"; - HandConstraintZone2[HandConstraintZone2["RADIAL_SIDE"] = 1] = "RADIAL_SIDE"; - HandConstraintZone2[HandConstraintZone2["ULNAR_SIDE"] = 2] = "ULNAR_SIDE"; - HandConstraintZone2[HandConstraintZone2["BELOW_WRIST"] = 3] = "BELOW_WRIST"; -})(HandConstraintZone || (HandConstraintZone = {})); -var HandConstraintOrientation; -(function(HandConstraintOrientation2) { - HandConstraintOrientation2[HandConstraintOrientation2["LOOK_AT_CAMERA"] = 0] = "LOOK_AT_CAMERA"; - HandConstraintOrientation2[HandConstraintOrientation2["HAND_ROTATION"] = 1] = "HAND_ROTATION"; -})(HandConstraintOrientation || (HandConstraintOrientation = {})); -var HandConstraintVisibility; -(function(HandConstraintVisibility2) { - HandConstraintVisibility2[HandConstraintVisibility2["ALWAYS_VISIBLE"] = 0] = "ALWAYS_VISIBLE"; - HandConstraintVisibility2[HandConstraintVisibility2["PALM_UP"] = 1] = "PALM_UP"; - HandConstraintVisibility2[HandConstraintVisibility2["GAZE_FOCUS"] = 2] = "GAZE_FOCUS"; - HandConstraintVisibility2[HandConstraintVisibility2["PALM_AND_GAZE"] = 3] = "PALM_AND_GAZE"; -})(HandConstraintVisibility || (HandConstraintVisibility = {})); -var HandConstraintBehavior = class { /** - * Builds a hand constraint behavior + * Gets or sets the current well known value or null if not defined as a system value */ - constructor() { - this._sceneRenderObserver = null; - this._zoneAxis = {}; - this.handConstraintVisibility = HandConstraintVisibility.PALM_AND_GAZE; - this.palmUpStrictness = 0.95; - this.gazeProximityRadius = 0.15; - this.targetOffset = 0.1; - this.targetZone = HandConstraintZone.ULNAR_SIDE; - this.zoneOrientationMode = HandConstraintOrientation.HAND_ROTATION; - this.nodeOrientationMode = HandConstraintOrientation.HAND_ROTATION; - this.handedness = "none"; - this.lerpTime = 100; - this._zoneAxis[HandConstraintZone.ABOVE_FINGER_TIPS] = new Vector3(0, 1, 0); - this._zoneAxis[HandConstraintZone.RADIAL_SIDE] = new Vector3(-1, 0, 0); - this._zoneAxis[HandConstraintZone.ULNAR_SIDE] = new Vector3(1, 0, 0); - this._zoneAxis[HandConstraintZone.BELOW_WRIST] = new Vector3(0, -1, 0); - } - /** gets or sets behavior's name */ - get name() { - return "HandConstraint"; + get systemValue() { + return this._systemValue; } - /** Enable the behavior */ - enable() { - this._node.setEnabled(true); + set systemValue(value) { + this._mode = NodeMaterialBlockConnectionPointMode.Uniform; + this.associatedVariableName = ""; + this._systemValue = value; } - /** Disable the behavior */ - disable() { - this._node.setEnabled(false); + /** + * Gets the current class name + * @returns the class name + */ + getClassName() { + return "InputBlock"; } - _getHandPose() { - if (!this._handTracking) { - return null; - } - let hand; - if (this.handedness === "none") { - hand = this._handTracking.getHandByHandedness("left") || this._handTracking.getHandByHandedness("right"); - } else { - hand = this._handTracking.getHandByHandedness(this.handedness); - } - if (hand) { - const pinkyMetacarpal = hand.getJointMesh(WebXRHandJoint.PINKY_FINGER_METACARPAL); - const middleMetacarpal = hand.getJointMesh(WebXRHandJoint.MIDDLE_FINGER_METACARPAL); - const wrist = hand.getJointMesh(WebXRHandJoint.WRIST); - if (wrist && middleMetacarpal && pinkyMetacarpal) { - const handPose = { position: middleMetacarpal.absolutePosition, quaternion: new Quaternion(), id: hand.xrController.uniqueId }; - const up = TmpVectors.Vector3[0]; - const forward = TmpVectors.Vector3[1]; - const left = TmpVectors.Vector3[2]; - up.copyFrom(middleMetacarpal.absolutePosition).subtractInPlace(wrist.absolutePosition).normalize(); - forward.copyFrom(pinkyMetacarpal.absolutePosition).subtractInPlace(middleMetacarpal.absolutePosition).normalize(); - Vector3.CrossToRef(up, forward, forward); - Vector3.CrossToRef(forward, up, left); - Quaternion.FromLookDirectionLHToRef(forward, up, handPose.quaternion); - return handPose; + /** + * Animate the input if animationType !== None + * @param scene defines the rendering scene + */ + animate(scene) { + switch (this._animationType) { + case AnimatedInputBlockTypes.Time: { + if (this.type === NodeMaterialBlockConnectionPointTypes.Float) { + this.value += scene.getAnimationRatio() * 0.01; + } + break; + } + case AnimatedInputBlockTypes.RealTime: { + if (this.type === NodeMaterialBlockConnectionPointTypes.Float) { + this.value = (PrecisionDate.Now - scene.getEngine().startTime) / 1e3; + } + break; } } - return null; } - /** - * Initializes the hand constraint behavior - */ - init() { + _emitDefine(define) { + if (define[0] === "!") { + return `#ifndef ${define.substring(1)} +`; + } + return `#ifdef ${define} +`; + } + initialize() { + this.associatedVariableName = ""; } /** - * Attaches the hand constraint to a `TransformNode` - * @param node defines the node to attach the behavior to + * Set the input block to its default value (based on its type) */ - attach(node) { - this._node = node; - this._scene = node.getScene(); - if (!this._node.rotationQuaternion) { - this._node.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._node.rotation.y, this._node.rotation.x, this._node.rotation.z); + setDefaultValue() { + switch (this.type) { + case NodeMaterialBlockConnectionPointTypes.Float: + this.value = 0; + break; + case NodeMaterialBlockConnectionPointTypes.Vector2: + this.value = Vector2.Zero(); + break; + case NodeMaterialBlockConnectionPointTypes.Vector3: + this.value = Vector3.Zero(); + break; + case NodeMaterialBlockConnectionPointTypes.Vector4: + this.value = Vector4.Zero(); + break; + case NodeMaterialBlockConnectionPointTypes.Color3: + this.value = Color3.White(); + break; + case NodeMaterialBlockConnectionPointTypes.Color4: + this.value = new Color4(1, 1, 1, 1); + break; + case NodeMaterialBlockConnectionPointTypes.Matrix: + this.value = Matrix.Identity(); + break; } - let lastTick = Date.now(); - this._sceneRenderObserver = this._scene.onBeforeRenderObservable.add(() => { - const pose = this._getHandPose(); - this._node.reservedDataStore = this._node.reservedDataStore || {}; - this._node.reservedDataStore.nearInteraction = this._node.reservedDataStore.nearInteraction || {}; - this._node.reservedDataStore.nearInteraction.excludedControllerId = null; - if (pose) { - const zoneOffset = TmpVectors.Vector3[0]; - const camera = this._scene.activeCamera; - zoneOffset.copyFrom(this._zoneAxis[this.targetZone]); - const cameraLookAtQuaternion = TmpVectors.Quaternion[0]; - if (camera && (this.zoneOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA || this.nodeOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA)) { - const toCamera = TmpVectors.Vector3[1]; - toCamera.copyFrom(camera.position).subtractInPlace(pose.position).normalize(); - if (this._scene.useRightHandedSystem) { - Quaternion.FromLookDirectionRHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion); - } else { - Quaternion.FromLookDirectionLHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion); - } + } + _emitConstant(state) { + switch (this.type) { + case NodeMaterialBlockConnectionPointTypes.Float: + return `${state._emitFloat(this.value)}`; + case NodeMaterialBlockConnectionPointTypes.Vector2: + return `vec2(${this.value.x}, ${this.value.y})`; + case NodeMaterialBlockConnectionPointTypes.Vector3: + return `vec3(${this.value.x}, ${this.value.y}, ${this.value.z})`; + case NodeMaterialBlockConnectionPointTypes.Vector4: + return `vec4(${this.value.x}, ${this.value.y}, ${this.value.z}, ${this.value.w})`; + case NodeMaterialBlockConnectionPointTypes.Color3: + TmpColors.Color3[0].set(this.value.r, this.value.g, this.value.b); + if (this.convertToGammaSpace) { + TmpColors.Color3[0].toGammaSpaceToRef(TmpColors.Color3[0], state.sharedData.scene.getEngine().useExactSrgbConversions); } - if (this.zoneOrientationMode === HandConstraintOrientation.HAND_ROTATION) { - pose.quaternion.toRotationMatrix(TmpVectors.Matrix[0]); - } else { - cameraLookAtQuaternion.toRotationMatrix(TmpVectors.Matrix[0]); + if (this.convertToLinearSpace) { + TmpColors.Color3[0].toLinearSpaceToRef(TmpColors.Color3[0], state.sharedData.scene.getEngine().useExactSrgbConversions); } - Vector3.TransformNormalToRef(zoneOffset, TmpVectors.Matrix[0], zoneOffset); - zoneOffset.scaleInPlace(this.targetOffset); - const targetPosition = TmpVectors.Vector3[2]; - const targetRotation = TmpVectors.Quaternion[1]; - targetPosition.copyFrom(pose.position).addInPlace(zoneOffset); - if (this.nodeOrientationMode === HandConstraintOrientation.HAND_ROTATION) { - targetRotation.copyFrom(pose.quaternion); - } else { - targetRotation.copyFrom(cameraLookAtQuaternion); + return `vec3(${TmpColors.Color3[0].r}, ${TmpColors.Color3[0].g}, ${TmpColors.Color3[0].b})`; + case NodeMaterialBlockConnectionPointTypes.Color4: + TmpColors.Color4[0].set(this.value.r, this.value.g, this.value.b, this.value.a); + if (this.convertToGammaSpace) { + TmpColors.Color4[0].toGammaSpaceToRef(TmpColors.Color4[0], state.sharedData.scene.getEngine().useExactSrgbConversions); } - const elapsed = Date.now() - lastTick; - Vector3.SmoothToRef(this._node.position, targetPosition, elapsed, this.lerpTime, this._node.position); - Quaternion.SmoothToRef(this._node.rotationQuaternion, targetRotation, elapsed, this.lerpTime, this._node.rotationQuaternion); - this._node.reservedDataStore.nearInteraction.excludedControllerId = pose.id; - } - this._setVisibility(pose); - lastTick = Date.now(); - }); + if (this.convertToLinearSpace) { + TmpColors.Color4[0].toLinearSpaceToRef(TmpColors.Color4[0], state.sharedData.scene.getEngine().useExactSrgbConversions); + } + return `vec4(${TmpColors.Color4[0].r}, ${TmpColors.Color4[0].g}, ${TmpColors.Color4[0].b}, ${TmpColors.Color4[0].a})`; + } + return ""; } - _setVisibility(pose) { - let palmVisible = true; - let gazeVisible = true; - const camera = this._scene.activeCamera; - if (camera) { - const cameraForward = camera.getForwardRay(); - if (this.handConstraintVisibility === HandConstraintVisibility.GAZE_FOCUS || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) { - gazeVisible = false; - let gaze; - if (this._eyeTracking) { - gaze = this._eyeTracking.getEyeGaze(); + /** @internal */ + get _noContextSwitch() { + return attributeInFragmentOnly[this.name]; + } + _emit(state, define) { + if (this.isUniform) { + if (!this.associatedVariableName) { + this.associatedVariableName = state._getFreeVariableName("u_" + this.name); + } + if (this.isConstant) { + if (state.constants.indexOf(this.associatedVariableName) !== -1) { + return; } - gaze = gaze || cameraForward; - const gazeToBehavior = TmpVectors.Vector3[0]; - if (pose) { - pose.position.subtractToRef(gaze.origin, gazeToBehavior); - } else { - this._node.getAbsolutePosition().subtractToRef(gaze.origin, gazeToBehavior); + state.constants.push(this.associatedVariableName); + state._constantDeclaration += this._declareOutput(this.output, state) + ` = ${this._emitConstant(state)}; +`; + return; + } + if (state.uniforms.indexOf(this.associatedVariableName) !== -1) { + return; + } + state.uniforms.push(this.associatedVariableName); + if (define) { + state._uniformDeclaration += this._emitDefine(define); + } + state._uniformDeclaration += `uniform ${state._getGLType(this.type)} ${this.associatedVariableName}; +`; + if (define) { + state._uniformDeclaration += `#endif +`; + } + const hints = state.sharedData.hints; + if (this._systemValue !== null && this._systemValue !== void 0) { + switch (this._systemValue) { + case NodeMaterialSystemValues.WorldView: + hints.needWorldViewMatrix = true; + break; + case NodeMaterialSystemValues.WorldViewProjection: + hints.needWorldViewProjectionMatrix = true; + break; } - const projectedDistance = Vector3.Dot(gazeToBehavior, gaze.direction); - const projectedSquared = projectedDistance * projectedDistance; - if (projectedDistance > 0) { - const radiusSquared = gazeToBehavior.lengthSquared() - projectedSquared; - if (radiusSquared < this.gazeProximityRadius * this.gazeProximityRadius) { - gazeVisible = true; - } + } else { + if (this._animationType !== AnimatedInputBlockTypes.None) { + state.sharedData.animatedInputs.push(this); } } - if (this.handConstraintVisibility === HandConstraintVisibility.PALM_UP || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) { - palmVisible = false; - if (pose) { - const palmDirection = TmpVectors.Vector3[0]; - Vector3.LeftHandedForwardReadOnly.rotateByQuaternionToRef(pose.quaternion, palmDirection); - if (Vector3.Dot(palmDirection, cameraForward.direction) > this.palmUpStrictness * 2 - 1) { - palmVisible = true; + return; + } + if (this.isAttribute) { + this.associatedVariableName = remapAttributeName[this.name] ?? this.name; + if (this.target === NodeMaterialBlockTargets.Vertex && state._vertexState) { + if (attributeInFragmentOnly[this.name]) { + if (attributeAsUniform[this.name]) { + state._emitUniformFromString(this.associatedVariableName, state._getGLType(this.type), define); + } else { + state._emitVaryingFromString(this.associatedVariableName, state._getGLType(this.type), define); } + } else { + this._emit(state._vertexState, define); } + return; } - } - this._node.setEnabled(palmVisible && gazeVisible); - } - /** - * Detaches the behavior from the `TransformNode` - */ - detach() { - this._scene.onBeforeRenderObservable.remove(this._sceneRenderObserver); - } - /** - * Links the behavior to the XR experience in which to retrieve hand transform information. - * @param xr xr experience - */ - linkToXRExperience(xr) { - const featuresManager = xr.featuresManager ? xr.featuresManager : xr; - if (!featuresManager) { - Tools.Error("XR features manager must be available or provided directly for the Hand Menu to work"); - } else { - try { - this._eyeTracking = featuresManager.getEnabledFeature(WebXRFeatureName.EYE_TRACKING); - } catch { + if (state.attributes.indexOf(this.associatedVariableName) !== -1) { + return; } - try { - this._handTracking = featuresManager.getEnabledFeature(WebXRFeatureName.HAND_TRACKING); - } catch { - Tools.Error("Hand tracking must be enabled for the Hand Menu to work"); + state.attributes.push(this.associatedVariableName); + if (attributeInFragmentOnly[this.name]) { + if (attributeAsUniform[this.name]) { + state._emitUniformFromString(this.associatedVariableName, state._getGLType(this.type), define); + } else { + state._emitVaryingFromString(this.associatedVariableName, state._getGLType(this.type), define); + } + } else { + if (define) { + state._attributeDeclaration += this._emitDefine(define); + } + state._attributeDeclaration += `attribute ${state._getGLType(this.type)} ${this.associatedVariableName}; +`; + if (define) { + state._attributeDeclaration += `#endif +`; + } } } } -}; - -// node_modules/@babylonjs/core/Materials/materialFlags.js -var MaterialFlags = class { /** - * Are diffuse textures enabled in the application. + * @internal */ - static get DiffuseTextureEnabled() { - return this._DiffuseTextureEnabled; - } - static set DiffuseTextureEnabled(value) { - if (this._DiffuseTextureEnabled === value) { + _transmitWorld(effect, world, worldView, worldViewProjection) { + if (!this._systemValue) { return; } - this._DiffuseTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + const variableName = this.associatedVariableName; + switch (this._systemValue) { + case NodeMaterialSystemValues.World: + effect.setMatrix(variableName, world); + break; + case NodeMaterialSystemValues.WorldView: + effect.setMatrix(variableName, worldView); + break; + case NodeMaterialSystemValues.WorldViewProjection: + effect.setMatrix(variableName, worldViewProjection); + break; + } } /** - * Are detail textures enabled in the application. + * @internal */ - static get DetailTextureEnabled() { - return this._DetailTextureEnabled; - } - static set DetailTextureEnabled(value) { - if (this._DetailTextureEnabled === value) { + _transmit(effect, scene, material) { + if (this.isAttribute) { return; } - this._DetailTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); - } - /** - * Are decal maps enabled in the application. - */ - static get DecalMapEnabled() { - return this._DecalMapEnabled; - } - static set DecalMapEnabled(value) { - if (this._DecalMapEnabled === value) { + const variableName = this.associatedVariableName; + if (this._systemValue) { + switch (this._systemValue) { + case NodeMaterialSystemValues.World: + case NodeMaterialSystemValues.WorldView: + case NodeMaterialSystemValues.WorldViewProjection: + return; + case NodeMaterialSystemValues.View: + effect.setMatrix(variableName, scene.getViewMatrix()); + break; + case NodeMaterialSystemValues.Projection: + effect.setMatrix(variableName, scene.getProjectionMatrix()); + break; + case NodeMaterialSystemValues.ViewProjection: + effect.setMatrix(variableName, scene.getTransformMatrix()); + break; + case NodeMaterialSystemValues.CameraPosition: + scene.bindEyePosition(effect, variableName, true); + break; + case NodeMaterialSystemValues.FogColor: + effect.setColor3(variableName, scene.fogColor); + break; + case NodeMaterialSystemValues.DeltaTime: + effect.setFloat(variableName, scene.deltaTime / 1e3); + break; + case NodeMaterialSystemValues.CameraParameters: + if (scene.activeCamera) { + effect.setFloat4(variableName, scene.getEngine().hasOriginBottomLeft ? -1 : 1, scene.activeCamera.minZ, scene.activeCamera.maxZ, 1 / scene.activeCamera.maxZ); + } + break; + case NodeMaterialSystemValues.MaterialAlpha: + effect.setFloat(variableName, material.alpha); + break; + } return; } - this._DecalMapEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); - } - /** - * Are ambient textures enabled in the application. - */ - static get AmbientTextureEnabled() { - return this._AmbientTextureEnabled; - } - static set AmbientTextureEnabled(value) { - if (this._AmbientTextureEnabled === value) { + const value = this._valueCallback ? this._valueCallback() : this._storedValue; + if (value === null) { return; } - this._AmbientTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + switch (this.type) { + case NodeMaterialBlockConnectionPointTypes.Float: + effect.setFloat(variableName, value); + break; + case NodeMaterialBlockConnectionPointTypes.Int: + effect.setInt(variableName, value); + break; + case NodeMaterialBlockConnectionPointTypes.Color3: + TmpColors.Color3[0].set(this.value.r, this.value.g, this.value.b); + if (this.convertToGammaSpace) { + TmpColors.Color3[0].toGammaSpaceToRef(TmpColors.Color3[0], scene.getEngine().useExactSrgbConversions); + } + if (this.convertToLinearSpace) { + TmpColors.Color3[0].toLinearSpaceToRef(TmpColors.Color3[0], scene.getEngine().useExactSrgbConversions); + } + effect.setColor3(variableName, TmpColors.Color3[0]); + break; + case NodeMaterialBlockConnectionPointTypes.Color4: + TmpColors.Color4[0].set(this.value.r, this.value.g, this.value.b, this.value.a); + if (this.convertToGammaSpace) { + TmpColors.Color4[0].toGammaSpaceToRef(TmpColors.Color4[0], scene.getEngine().useExactSrgbConversions); + } + if (this.convertToLinearSpace) { + TmpColors.Color4[0].toLinearSpaceToRef(TmpColors.Color4[0], scene.getEngine().useExactSrgbConversions); + } + effect.setDirectColor4(variableName, TmpColors.Color4[0]); + break; + case NodeMaterialBlockConnectionPointTypes.Vector2: + effect.setVector2(variableName, value); + break; + case NodeMaterialBlockConnectionPointTypes.Vector3: + effect.setVector3(variableName, value); + break; + case NodeMaterialBlockConnectionPointTypes.Vector4: + effect.setVector4(variableName, value); + break; + case NodeMaterialBlockConnectionPointTypes.Matrix: + effect.setMatrix(variableName, value); + break; + } } - /** - * Are opacity textures enabled in the application. - */ - static get OpacityTextureEnabled() { - return this._OpacityTextureEnabled; + _buildBlock(state) { + super._buildBlock(state); + if (this.isUniform || this.isSystemValue) { + state.sharedData.inputBlocks.push(this); + } + this._emit(state); } - static set OpacityTextureEnabled(value) { - if (this._OpacityTextureEnabled === value) { - return; + _dumpPropertiesCode() { + const variableName = this._codeVariableName; + if (this.isAttribute) { + return super._dumpPropertiesCode() + `${variableName}.setAsAttribute("${this.name}"); +`; } - this._OpacityTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + if (this.isSystemValue) { + return super._dumpPropertiesCode() + `${variableName}.setAsSystemValue(BABYLON.NodeMaterialSystemValues.${NodeMaterialSystemValues[this._systemValue]}); +`; + } + if (this.isUniform) { + const codes = []; + let valueString = ""; + switch (this.type) { + case NodeMaterialBlockConnectionPointTypes.Float: + valueString = `${this.value}`; + break; + case NodeMaterialBlockConnectionPointTypes.Vector2: + valueString = `new BABYLON.Vector2(${this.value.x}, ${this.value.y})`; + break; + case NodeMaterialBlockConnectionPointTypes.Vector3: + valueString = `new BABYLON.Vector3(${this.value.x}, ${this.value.y}, ${this.value.z})`; + break; + case NodeMaterialBlockConnectionPointTypes.Vector4: + valueString = `new BABYLON.Vector4(${this.value.x}, ${this.value.y}, ${this.value.z}, ${this.value.w})`; + break; + case NodeMaterialBlockConnectionPointTypes.Color3: + valueString = `new BABYLON.Color3(${this.value.r}, ${this.value.g}, ${this.value.b})`; + if (this.convertToGammaSpace) { + valueString += ".toGammaSpace()"; + } + if (this.convertToLinearSpace) { + valueString += ".toLinearSpace()"; + } + break; + case NodeMaterialBlockConnectionPointTypes.Color4: + valueString = `new BABYLON.Color4(${this.value.r}, ${this.value.g}, ${this.value.b}, ${this.value.a})`; + if (this.convertToGammaSpace) { + valueString += ".toGammaSpace()"; + } + if (this.convertToLinearSpace) { + valueString += ".toLinearSpace()"; + } + break; + case NodeMaterialBlockConnectionPointTypes.Matrix: + valueString = `BABYLON.Matrix.FromArray([${this.value.m}])`; + break; + } + codes.push(`${variableName}.value = ${valueString}`); + if (this.type === NodeMaterialBlockConnectionPointTypes.Float) { + codes.push(`${variableName}.min = ${this.min}`, `${variableName}.max = ${this.max}`, `${variableName}.isBoolean = ${this.isBoolean}`, `${variableName}.matrixMode = ${this.matrixMode}`, `${variableName}.animationType = BABYLON.AnimatedInputBlockTypes.${AnimatedInputBlockTypes[this.animationType]}`); + } + codes.push(`${variableName}.isConstant = ${this.isConstant}`); + codes.push(""); + return super._dumpPropertiesCode() + codes.join(";\n"); + } + return super._dumpPropertiesCode(); } - /** - * Are reflection textures enabled in the application. - */ - static get ReflectionTextureEnabled() { - return this._ReflectionTextureEnabled; + dispose() { + this.onValueChangedObservable.clear(); + super.dispose(); } - static set ReflectionTextureEnabled(value) { - if (this._ReflectionTextureEnabled === value) { - return; + serialize() { + const serializationObject = super.serialize(); + serializationObject.type = this.type; + serializationObject.mode = this._mode; + serializationObject.systemValue = this._systemValue; + serializationObject.animationType = this._animationType; + serializationObject.min = this.min; + serializationObject.max = this.max; + serializationObject.isBoolean = this.isBoolean; + serializationObject.matrixMode = this.matrixMode; + serializationObject.isConstant = this.isConstant; + serializationObject.groupInInspector = this.groupInInspector; + serializationObject.convertToGammaSpace = this.convertToGammaSpace; + serializationObject.convertToLinearSpace = this.convertToLinearSpace; + if (this._storedValue != null && this._mode === NodeMaterialBlockConnectionPointMode.Uniform) { + if (this._storedValue.asArray) { + serializationObject.valueType = "BABYLON." + this._storedValue.getClassName(); + serializationObject.value = this._storedValue.asArray(); + } else { + serializationObject.valueType = "number"; + serializationObject.value = this._storedValue; + } } - this._ReflectionTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); - } - /** - * Are emissive textures enabled in the application. - */ - static get EmissiveTextureEnabled() { - return this._EmissiveTextureEnabled; + return serializationObject; } - static set EmissiveTextureEnabled(value) { - if (this._EmissiveTextureEnabled === value) { + _deserialize(serializationObject, scene, rootUrl) { + this._mode = serializationObject.mode; + super._deserialize(serializationObject, scene, rootUrl); + this._type = serializationObject.type; + this._systemValue = serializationObject.systemValue || serializationObject.wellKnownValue; + this._animationType = serializationObject.animationType; + this.min = serializationObject.min || 0; + this.max = serializationObject.max || 0; + this.isBoolean = !!serializationObject.isBoolean; + this.matrixMode = serializationObject.matrixMode || 0; + this.isConstant = !!serializationObject.isConstant; + this.groupInInspector = serializationObject.groupInInspector || ""; + this.convertToGammaSpace = !!serializationObject.convertToGammaSpace; + this.convertToLinearSpace = !!serializationObject.convertToLinearSpace; + if (serializationObject.name === "tangent" && serializationObject.mode === NodeMaterialBlockConnectionPointMode.Attribute && serializationObject.type === NodeMaterialBlockConnectionPointTypes.Vector3) { + this._type = NodeMaterialBlockConnectionPointTypes.Vector4; + } + if (!serializationObject.valueType) { return; } - this._EmissiveTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + if (serializationObject.valueType === "number") { + this._storedValue = serializationObject.value; + } else { + const valueType = GetClass(serializationObject.valueType); + if (valueType) { + this._storedValue = valueType.FromArray(serializationObject.value); + } + } } +}; +RegisterClass("BABYLON.InputBlock", InputBlock); + +// node_modules/@babylonjs/core/Materials/Node/Blocks/Dual/currentScreenBlock.js +var CurrentScreenBlock = class extends NodeMaterialBlock { /** - * Are specular textures enabled in the application. + * Create a new CurrentScreenBlock + * @param name defines the block name */ - static get SpecularTextureEnabled() { - return this._SpecularTextureEnabled; - } - static set SpecularTextureEnabled(value) { - if (this._SpecularTextureEnabled === value) { - return; - } - this._SpecularTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + constructor(name69) { + super(name69, NodeMaterialBlockTargets.VertexAndFragment); + this._samplerName = "textureSampler"; + this.convertToGammaSpace = false; + this.convertToLinearSpace = false; + this._isUnique = false; + this.registerInput("uv", NodeMaterialBlockConnectionPointTypes.AutoDetect, false, NodeMaterialBlockTargets.VertexAndFragment); + this.registerOutput("rgba", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Neutral); + this.registerOutput("rgb", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Neutral); + this.registerOutput("r", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); + this.registerOutput("g", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); + this.registerOutput("b", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); + this.registerOutput("a", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); + this._inputs[0].addExcludedConnectionPointFromAllowedTypes(NodeMaterialBlockConnectionPointTypes.Vector2 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4); + this._inputs[0]._prioritizeVertex = false; } /** - * Are bump textures enabled in the application. + * Gets the current class name + * @returns the class name */ - static get BumpTextureEnabled() { - return this._BumpTextureEnabled; - } - static set BumpTextureEnabled(value) { - if (this._BumpTextureEnabled === value) { - return; - } - this._BumpTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + getClassName() { + return "CurrentScreenBlock"; } /** - * Are lightmap textures enabled in the application. + * Gets the uv input component */ - static get LightmapTextureEnabled() { - return this._LightmapTextureEnabled; - } - static set LightmapTextureEnabled(value) { - if (this._LightmapTextureEnabled === value) { - return; - } - this._LightmapTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + get uv() { + return this._inputs[0]; } /** - * Are refraction textures enabled in the application. + * Gets the rgba output component */ - static get RefractionTextureEnabled() { - return this._RefractionTextureEnabled; - } - static set RefractionTextureEnabled(value) { - if (this._RefractionTextureEnabled === value) { - return; - } - this._RefractionTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + get rgba() { + return this._outputs[0]; } /** - * Are color grading textures enabled in the application. + * Gets the rgb output component */ - static get ColorGradingTextureEnabled() { - return this._ColorGradingTextureEnabled; - } - static set ColorGradingTextureEnabled(value) { - if (this._ColorGradingTextureEnabled === value) { - return; - } - this._ColorGradingTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + get rgb() { + return this._outputs[1]; } /** - * Are fresnels enabled in the application. + * Gets the r output component */ - static get FresnelEnabled() { - return this._FresnelEnabled; + get r() { + return this._outputs[2]; } - static set FresnelEnabled(value) { - if (this._FresnelEnabled === value) { - return; - } - this._FresnelEnabled = value; - Engine.MarkAllMaterialsAsDirty(4); + /** + * Gets the g output component + */ + get g() { + return this._outputs[3]; } /** - * Are clear coat textures enabled in the application. + * Gets the b output component */ - static get ClearCoatTextureEnabled() { - return this._ClearCoatTextureEnabled; + get b() { + return this._outputs[4]; } - static set ClearCoatTextureEnabled(value) { - if (this._ClearCoatTextureEnabled === value) { - return; - } - this._ClearCoatTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + /** + * Gets the a output component + */ + get a() { + return this._outputs[5]; } /** - * Are clear coat bump textures enabled in the application. + * Initialize the block and prepare the context for build + * @param state defines the state that will be used for the build */ - static get ClearCoatBumpTextureEnabled() { - return this._ClearCoatBumpTextureEnabled; + initialize(state) { + state._excludeVariableName("textureSampler"); } - static set ClearCoatBumpTextureEnabled(value) { - if (this._ClearCoatBumpTextureEnabled === value) { - return; + get target() { + if (!this.uv.isConnected) { + return NodeMaterialBlockTargets.VertexAndFragment; } - this._ClearCoatBumpTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + if (this.uv.sourceBlock.isInput) { + return NodeMaterialBlockTargets.VertexAndFragment; + } + return NodeMaterialBlockTargets.Fragment; } - /** - * Are clear coat tint textures enabled in the application. - */ - static get ClearCoatTintTextureEnabled() { - return this._ClearCoatTintTextureEnabled; + prepareDefines(mesh, nodeMaterial, defines) { + defines.setValue(this._linearDefineName, this.convertToGammaSpace, true); + defines.setValue(this._gammaDefineName, this.convertToLinearSpace, true); } - static set ClearCoatTintTextureEnabled(value) { - if (this._ClearCoatTintTextureEnabled === value) { - return; + isReady() { + if (this.texture && !this.texture.isReadyOrNotBlocking()) { + return false; } - this._ClearCoatTintTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + return true; } - /** - * Are sheen textures enabled in the application. - */ - static get SheenTextureEnabled() { - return this._SheenTextureEnabled; + _injectVertexCode(state) { + const uvInput = this.uv; + if (uvInput.connectedPoint.ownerBlock.isInput) { + const uvInputOwnerBlock = uvInput.connectedPoint.ownerBlock; + if (!uvInputOwnerBlock.isAttribute) { + state._emitUniformFromString(uvInput.associatedVariableName, "vec2"); + } + } + this._mainUVName = "vMain" + uvInput.associatedVariableName; + state._emitVaryingFromString(this._mainUVName, "vec2"); + state.compilationString += `${this._mainUVName} = ${uvInput.associatedVariableName}.xy; +`; + if (!this._outputs.some((o) => o.isConnectedInVertexShader)) { + return; + } + this._writeTextureRead(state, true); + for (const output of this._outputs) { + if (output.hasEndpoints) { + this._writeOutput(state, output, output.name, true); + } + } } - static set SheenTextureEnabled(value) { - if (this._SheenTextureEnabled === value) { + _writeTextureRead(state, vertexMode = false) { + const uvInput = this.uv; + if (vertexMode) { + if (state.target === NodeMaterialBlockTargets.Fragment) { + return; + } + state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${uvInput.associatedVariableName}); +`; return; } - this._SheenTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + if (this.uv.ownerBlock.target === NodeMaterialBlockTargets.Fragment) { + state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${uvInput.associatedVariableName}); +`; + return; + } + state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${this._mainUVName}); +`; } - /** - * Are anisotropic textures enabled in the application. - */ - static get AnisotropicTextureEnabled() { - return this._AnisotropicTextureEnabled; + _writeOutput(state, output, swizzle, vertexMode = false) { + if (vertexMode) { + if (state.target === NodeMaterialBlockTargets.Fragment) { + return; + } + state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle}; +`; + return; + } + if (this.uv.ownerBlock.target === NodeMaterialBlockTargets.Fragment) { + state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle}; +`; + return; + } + state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle}; +`; + state.compilationString += `#ifdef ${this._linearDefineName} +`; + state.compilationString += `${output.associatedVariableName} = toGammaSpace(${output.associatedVariableName}); +`; + state.compilationString += `#endif +`; + state.compilationString += `#ifdef ${this._gammaDefineName} +`; + state.compilationString += `${output.associatedVariableName} = toLinearSpace(${output.associatedVariableName}); +`; + state.compilationString += `#endif +`; } - static set AnisotropicTextureEnabled(value) { - if (this._AnisotropicTextureEnabled === value) { + _buildBlock(state) { + super._buildBlock(state); + this._tempTextureRead = state._getFreeVariableName("tempTextureRead"); + if (state.sharedData.blockingBlocks.indexOf(this) < 0) { + state.sharedData.blockingBlocks.push(this); + } + if (state.sharedData.textureBlocks.indexOf(this) < 0) { + state.sharedData.textureBlocks.push(this); + } + if (state.sharedData.blocksWithDefines.indexOf(this) < 0) { + state.sharedData.blocksWithDefines.push(this); + } + if (state.target !== NodeMaterialBlockTargets.Fragment) { + state._emit2DSampler(this._samplerName); + this._injectVertexCode(state); return; } - this._AnisotropicTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + if (!this._outputs.some((o) => o.isConnectedInFragmentShader)) { + return; + } + state._emit2DSampler(this._samplerName); + this._linearDefineName = state._getFreeDefineName("ISLINEAR"); + this._gammaDefineName = state._getFreeDefineName("ISGAMMA"); + const comments = `//${this.name}`; + state._emitFunctionFromInclude("helperFunctions", comments); + this._writeTextureRead(state); + for (const output of this._outputs) { + if (output.hasEndpoints) { + this._writeOutput(state, output, output.name); + } + } + return this; } - /** - * Are thickness textures enabled in the application. - */ - static get ThicknessTextureEnabled() { - return this._ThicknessTextureEnabled; + serialize() { + const serializationObject = super.serialize(); + serializationObject.convertToGammaSpace = this.convertToGammaSpace; + serializationObject.convertToLinearSpace = this.convertToLinearSpace; + if (this.texture && !this.texture.isRenderTarget) { + serializationObject.texture = this.texture.serialize(); + } + return serializationObject; } - static set ThicknessTextureEnabled(value) { - if (this._ThicknessTextureEnabled === value) { - return; + _deserialize(serializationObject, scene, rootUrl) { + super._deserialize(serializationObject, scene, rootUrl); + this.convertToGammaSpace = serializationObject.convertToGammaSpace; + this.convertToLinearSpace = !!serializationObject.convertToLinearSpace; + if (serializationObject.texture) { + rootUrl = serializationObject.texture.url.indexOf("data:") === 0 ? "" : rootUrl; + this.texture = Texture.Parse(serializationObject.texture, scene, rootUrl); } - this._ThicknessTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); } +}; +RegisterClass("BABYLON.CurrentScreenBlock", CurrentScreenBlock); + +// node_modules/@babylonjs/core/Materials/Node/Blocks/Particle/particleTextureBlock.js +var ParticleTextureBlock = class extends NodeMaterialBlock { /** - * Are refraction intensity textures enabled in the application. + * Create a new ParticleTextureBlock + * @param name defines the block name */ - static get RefractionIntensityTextureEnabled() { - return this._ThicknessTextureEnabled; + constructor(name69) { + super(name69, NodeMaterialBlockTargets.Fragment); + this._samplerName = "diffuseSampler"; + this.convertToGammaSpace = false; + this.convertToLinearSpace = false; + this._isUnique = false; + this.registerInput("uv", NodeMaterialBlockConnectionPointTypes.AutoDetect, false, NodeMaterialBlockTargets.VertexAndFragment); + this.registerOutput("rgba", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Neutral); + this.registerOutput("rgb", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Neutral); + this.registerOutput("r", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); + this.registerOutput("g", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); + this.registerOutput("b", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); + this.registerOutput("a", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral); + this._inputs[0].addExcludedConnectionPointFromAllowedTypes(NodeMaterialBlockConnectionPointTypes.Vector2 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4); } - static set RefractionIntensityTextureEnabled(value) { - if (this._RefractionIntensityTextureEnabled === value) { - return; - } - this._RefractionIntensityTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + /** + * Gets the current class name + * @returns the class name + */ + getClassName() { + return "ParticleTextureBlock"; } /** - * Are translucency intensity textures enabled in the application. + * Gets the uv input component */ - static get TranslucencyIntensityTextureEnabled() { - return this._ThicknessTextureEnabled; + get uv() { + return this._inputs[0]; } - static set TranslucencyIntensityTextureEnabled(value) { - if (this._TranslucencyIntensityTextureEnabled === value) { - return; - } - this._TranslucencyIntensityTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + /** + * Gets the rgba output component + */ + get rgba() { + return this._outputs[0]; } /** - * Are translucency intensity textures enabled in the application. + * Gets the rgb output component */ - static get IridescenceTextureEnabled() { - return this._IridescenceTextureEnabled; + get rgb() { + return this._outputs[1]; } - static set IridescenceTextureEnabled(value) { - if (this._IridescenceTextureEnabled === value) { - return; - } - this._IridescenceTextureEnabled = value; - Engine.MarkAllMaterialsAsDirty(1); + /** + * Gets the r output component + */ + get r() { + return this._outputs[2]; } -}; -MaterialFlags._DiffuseTextureEnabled = true; -MaterialFlags._DetailTextureEnabled = true; -MaterialFlags._DecalMapEnabled = true; -MaterialFlags._AmbientTextureEnabled = true; -MaterialFlags._OpacityTextureEnabled = true; -MaterialFlags._ReflectionTextureEnabled = true; -MaterialFlags._EmissiveTextureEnabled = true; -MaterialFlags._SpecularTextureEnabled = true; -MaterialFlags._BumpTextureEnabled = true; -MaterialFlags._LightmapTextureEnabled = true; -MaterialFlags._RefractionTextureEnabled = true; -MaterialFlags._ColorGradingTextureEnabled = true; -MaterialFlags._FresnelEnabled = true; -MaterialFlags._ClearCoatTextureEnabled = true; -MaterialFlags._ClearCoatBumpTextureEnabled = true; -MaterialFlags._ClearCoatTintTextureEnabled = true; -MaterialFlags._SheenTextureEnabled = true; -MaterialFlags._AnisotropicTextureEnabled = true; -MaterialFlags._ThicknessTextureEnabled = true; -MaterialFlags._RefractionIntensityTextureEnabled = true; -MaterialFlags._TranslucencyIntensityTextureEnabled = true; -MaterialFlags._IridescenceTextureEnabled = true; - -// node_modules/@babylonjs/core/Materials/materialPluginManager.js -var rxOption = new RegExp("^([gimus]+)!"); -var MaterialPluginManager = class _MaterialPluginManager { /** - * Creates a new instance of the plugin manager - * @param material material that this manager will manage the plugins for + * Gets the g output component */ - constructor(material) { - this._plugins = []; - this._activePlugins = []; - this._activePluginsForExtraEvents = []; - this._material = material; - this._scene = material.getScene(); - this._engine = this._scene.getEngine(); + get g() { + return this._outputs[3]; } /** - * @internal + * Gets the b output component */ - _addPlugin(plugin) { - for (let i = 0; i < this._plugins.length; ++i) { - if (this._plugins[i].name === plugin.name) { - return false; - } - } - if (this._material._uniformBufferLayoutBuilt) { - throw `The plugin "${plugin.name}" can't be added to the material "${this._material.name}" because this material has already been used for rendering! Please add plugins to materials before any rendering with this material occurs.`; - } - const pluginClassName = plugin.getClassName(); - if (!_MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName]) { - _MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName] = "MATERIALPLUGIN_" + ++_MaterialPluginManager._MaterialPluginCounter; - } - this._material._callbackPluginEventGeneric = (id, info) => this._handlePluginEvent(id, info); - this._plugins.push(plugin); - this._plugins.sort((a, b) => a.priority - b.priority); - this._codeInjectionPoints = {}; - const defineNamesFromPlugins = {}; - defineNamesFromPlugins[_MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName]] = { - type: "boolean", - default: true - }; - for (const plugin2 of this._plugins) { - plugin2.collectDefines(defineNamesFromPlugins); - this._collectPointNames("vertex", plugin2.getCustomCode("vertex")); - this._collectPointNames("fragment", plugin2.getCustomCode("fragment")); - } - this._defineNamesFromPlugins = defineNamesFromPlugins; - return true; + get b() { + return this._outputs[4]; } /** - * @internal + * Gets the a output component */ - _activatePlugin(plugin) { - if (this._activePlugins.indexOf(plugin) === -1) { - this._activePlugins.push(plugin); - this._activePlugins.sort((a, b) => a.priority - b.priority); - this._material._callbackPluginEventIsReadyForSubMesh = this._handlePluginEventIsReadyForSubMesh.bind(this); - this._material._callbackPluginEventPrepareDefinesBeforeAttributes = this._handlePluginEventPrepareDefinesBeforeAttributes.bind(this); - this._material._callbackPluginEventPrepareDefines = this._handlePluginEventPrepareDefines.bind(this); - this._material._callbackPluginEventBindForSubMesh = this._handlePluginEventBindForSubMesh.bind(this); - if (plugin.registerForExtraEvents) { - this._activePluginsForExtraEvents.push(plugin); - this._activePluginsForExtraEvents.sort((a, b) => a.priority - b.priority); - this._material._callbackPluginEventHasRenderTargetTextures = this._handlePluginEventHasRenderTargetTextures.bind(this); - this._material._callbackPluginEventFillRenderTargetTextures = this._handlePluginEventFillRenderTargetTextures.bind(this); - this._material._callbackPluginEventHardBindForSubMesh = this._handlePluginEventHardBindForSubMesh.bind(this); - } - } + get a() { + return this._outputs[5]; } /** - * Gets a plugin from the list of plugins managed by this manager - * @param name name of the plugin - * @returns the plugin if found, else null + * Initialize the block and prepare the context for build + * @param state defines the state that will be used for the build */ - getPlugin(name69) { - for (let i = 0; i < this._plugins.length; ++i) { - if (this._plugins[i].name === name69) { - return this._plugins[i]; - } - } - return null; + initialize(state) { + state._excludeVariableName("diffuseSampler"); } - _handlePluginEventIsReadyForSubMesh(eventData) { - let isReady = true; - for (const plugin of this._activePlugins) { - isReady = isReady && plugin.isReadyForSubMesh(eventData.defines, this._scene, this._engine, eventData.subMesh); + autoConfigure(material, additionalFilteringInfo = () => true) { + if (!this.uv.isConnected) { + let uvInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === "particle_uv" && additionalFilteringInfo(b)); + if (!uvInput) { + uvInput = new InputBlock("uv"); + uvInput.setAsAttribute("particle_uv"); + } + uvInput.output.connectTo(this.uv); } - eventData.isReadyForSubMesh = isReady; } - _handlePluginEventPrepareDefinesBeforeAttributes(eventData) { - for (const plugin of this._activePlugins) { - plugin.prepareDefinesBeforeAttributes(eventData.defines, this._scene, eventData.mesh); - } + prepareDefines(mesh, nodeMaterial, defines) { + defines.setValue(this._linearDefineName, this.convertToGammaSpace, true); + defines.setValue(this._gammaDefineName, this.convertToLinearSpace, true); } - _handlePluginEventPrepareDefines(eventData) { - for (const plugin of this._activePlugins) { - plugin.prepareDefines(eventData.defines, this._scene, eventData.mesh); + isReady() { + if (this.texture && !this.texture.isReadyOrNotBlocking()) { + return false; } + return true; } - _handlePluginEventHardBindForSubMesh(eventData) { - for (const plugin of this._activePluginsForExtraEvents) { - plugin.hardBindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, eventData.subMesh); - } + _writeOutput(state, output, swizzle) { + state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle}; +`; + state.compilationString += `#ifdef ${this._linearDefineName} +`; + state.compilationString += `${output.associatedVariableName} = toGammaSpace(${output.associatedVariableName}); +`; + state.compilationString += `#endif +`; + state.compilationString += `#ifdef ${this._gammaDefineName} +`; + state.compilationString += `${output.associatedVariableName} = toLinearSpace(${output.associatedVariableName}); +`; + state.compilationString += `#endif +`; } - _handlePluginEventBindForSubMesh(eventData) { - for (const plugin of this._activePlugins) { - plugin.bindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, eventData.subMesh); + _buildBlock(state) { + super._buildBlock(state); + if (state.target === NodeMaterialBlockTargets.Vertex) { + return; } - } - _handlePluginEventHasRenderTargetTextures(eventData) { - let hasRenderTargetTextures = false; - for (const plugin of this._activePluginsForExtraEvents) { - hasRenderTargetTextures = plugin.hasRenderTargetTextures(); - if (hasRenderTargetTextures) { - break; - } - } - eventData.hasRenderTargetTextures = hasRenderTargetTextures; - } - _handlePluginEventFillRenderTargetTextures(eventData) { - for (const plugin of this._activePluginsForExtraEvents) { - plugin.fillRenderTargetTextures(eventData.renderTargets); - } - } - _handlePluginEvent(id, info) { - switch (id) { - case MaterialPluginEvent.GetActiveTextures: { - const eventData = info; - for (const plugin of this._activePlugins) { - plugin.getActiveTextures(eventData.activeTextures); - } - break; - } - case MaterialPluginEvent.GetAnimatables: { - const eventData = info; - for (const plugin of this._activePlugins) { - plugin.getAnimatables(eventData.animatables); - } - break; - } - case MaterialPluginEvent.HasTexture: { - const eventData = info; - let hasTexture = false; - for (const plugin of this._activePlugins) { - hasTexture = plugin.hasTexture(eventData.texture); - if (hasTexture) { - break; - } - } - eventData.hasTexture = hasTexture; - break; - } - case MaterialPluginEvent.Disposed: { - const eventData = info; - for (const plugin of this._plugins) { - plugin.dispose(eventData.forceDisposeTextures); - } - break; - } - case MaterialPluginEvent.GetDefineNames: { - const eventData = info; - eventData.defineNames = this._defineNamesFromPlugins; - break; - } - case MaterialPluginEvent.PrepareEffect: { - const eventData = info; - for (const plugin of this._activePlugins) { - eventData.fallbackRank = plugin.addFallbacks(eventData.defines, eventData.fallbacks, eventData.fallbackRank); - plugin.getAttributes(eventData.attributes, this._scene, eventData.mesh); - } - if (this._uniformList.length > 0) { - eventData.uniforms.push(...this._uniformList); - } - if (this._samplerList.length > 0) { - eventData.samplers.push(...this._samplerList); - } - if (this._uboList.length > 0) { - eventData.uniformBuffersNames.push(...this._uboList); - } - eventData.customCode = this._injectCustomCode(eventData, eventData.customCode); - break; - } - case MaterialPluginEvent.PrepareUniformBuffer: { - const eventData = info; - this._uboDeclaration = ""; - this._vertexDeclaration = ""; - this._fragmentDeclaration = ""; - this._uniformList = []; - this._samplerList = []; - this._uboList = []; - for (const plugin of this._plugins) { - const uniforms = plugin.getUniforms(); - if (uniforms) { - if (uniforms.ubo) { - for (const uniform of uniforms.ubo) { - if (uniform.size && uniform.type) { - const arraySize = uniform.arraySize ?? 0; - eventData.ubo.addUniform(uniform.name, uniform.size, arraySize); - this._uboDeclaration += `${uniform.type} ${uniform.name}${arraySize > 0 ? `[${arraySize}]` : ""}; + this._tempTextureRead = state._getFreeVariableName("tempTextureRead"); + state._emit2DSampler(this._samplerName); + state.sharedData.blockingBlocks.push(this); + state.sharedData.textureBlocks.push(this); + state.sharedData.blocksWithDefines.push(this); + this._linearDefineName = state._getFreeDefineName("ISLINEAR"); + this._gammaDefineName = state._getFreeDefineName("ISGAMMA"); + const comments = `//${this.name}`; + state._emitFunctionFromInclude("helperFunctions", comments); + state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${this.uv.associatedVariableName}); `; - } - this._uniformList.push(uniform.name); - } - } - if (uniforms.vertex) { - this._vertexDeclaration += uniforms.vertex + "\n"; - } - if (uniforms.fragment) { - this._fragmentDeclaration += uniforms.fragment + "\n"; - } - } - plugin.getSamplers(this._samplerList); - plugin.getUniformBuffersNames(this._uboList); - } - break; + for (const output of this._outputs) { + if (output.hasEndpoints) { + this._writeOutput(state, output, output.name); } } + return this; } - _collectPointNames(shaderType, customCode) { - if (!customCode) { - return; - } - for (const pointName in customCode) { - if (!this._codeInjectionPoints[shaderType]) { - this._codeInjectionPoints[shaderType] = {}; - } - this._codeInjectionPoints[shaderType][pointName] = true; + serialize() { + const serializationObject = super.serialize(); + serializationObject.convertToGammaSpace = this.convertToGammaSpace; + serializationObject.convertToLinearSpace = this.convertToLinearSpace; + if (this.texture && !this.texture.isRenderTarget) { + serializationObject.texture = this.texture.serialize(); } + return serializationObject; } - _injectCustomCode(eventData, existingCallback) { - return (shaderType, code) => { - var _a, _b; - if (existingCallback) { - code = existingCallback(shaderType, code); - } - if (this._uboDeclaration) { - code = code.replace("#define ADDITIONAL_UBO_DECLARATION", this._uboDeclaration); - } - if (this._vertexDeclaration) { - code = code.replace("#define ADDITIONAL_VERTEX_DECLARATION", this._vertexDeclaration); - } - if (this._fragmentDeclaration) { - code = code.replace("#define ADDITIONAL_FRAGMENT_DECLARATION", this._fragmentDeclaration); - } - const points = (_a = this._codeInjectionPoints) == null ? void 0 : _a[shaderType]; - if (!points) { - return code; - } - let processorOptions = null; - for (let pointName in points) { - let injectedCode = ""; - for (const plugin of this._activePlugins) { - let customCode = (_b = plugin.getCustomCode(shaderType)) == null ? void 0 : _b[pointName]; - if (!customCode) { - continue; - } - if (plugin.resolveIncludes) { - if (processorOptions === null) { - const shaderLanguage = ShaderLanguage.GLSL; - processorOptions = { - defines: [], - indexParameters: eventData.indexParameters, - isFragment: false, - shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader, - processor: void 0, - supportsUniformBuffers: this._engine.supportsUniformBuffers, - shadersRepository: ShaderStore.GetShadersRepository(shaderLanguage), - includesShadersStore: ShaderStore.GetIncludesShadersStore(shaderLanguage), - version: void 0, - platformName: this._engine.shaderPlatformName, - processingContext: void 0, - isNDCHalfZRange: this._engine.isNDCHalfZRange, - useReverseDepthBuffer: this._engine.useReverseDepthBuffer, - processCodeAfterIncludes: void 0 - // not used by _ProcessIncludes - }; - } - processorOptions.isFragment = shaderType === "fragment"; - ShaderProcessor._ProcessIncludes(customCode, processorOptions, (code2) => customCode = code2); - } - injectedCode += customCode + "\n"; - } - if (injectedCode.length > 0) { - if (pointName.charAt(0) === "!") { - pointName = pointName.substring(1); - let regexFlags = "g"; - if (pointName.charAt(0) === "!") { - regexFlags = ""; - pointName = pointName.substring(1); - } else { - const matchOption = rxOption.exec(pointName); - if (matchOption && matchOption.length >= 2) { - regexFlags = matchOption[1]; - pointName = pointName.substring(regexFlags.length + 1); - } - } - if (regexFlags.indexOf("g") < 0) { - regexFlags += "g"; - } - const sourceCode = code; - const rx = new RegExp(pointName, regexFlags); - let match = rx.exec(sourceCode); - while (match !== null) { - let newCode = injectedCode; - for (let i = 0; i < match.length; ++i) { - newCode = newCode.replace("$" + i, match[i]); - } - code = code.replace(match[0], newCode); - match = rx.exec(sourceCode); - } - } else { - const fullPointName = "#define " + pointName; - code = code.replace(fullPointName, "\n" + injectedCode + "\n" + fullPointName); - } - } - } - return code; - }; - } -}; -MaterialPluginManager._MaterialPluginClassToMainDefine = {}; -MaterialPluginManager._MaterialPluginCounter = 0; -(() => { - EngineStore.OnEnginesDisposedObservable.add(() => { - UnregisterAllMaterialPlugins(); - }); -})(); -var plugins = []; -var inited = false; -var observer = null; -function RegisterMaterialPlugin(pluginName, factory) { - if (!inited) { - observer = Material.OnEventObservable.add((material) => { - for (const [, factory2] of plugins) { - factory2(material); - } - }, MaterialPluginEvent.Created); - inited = true; - } - const existing = plugins.filter(([name69, _factory]) => name69 === pluginName); - if (existing.length > 0) { - existing[0][1] = factory; - } else { - plugins.push([pluginName, factory]); - } -} -function UnregisterMaterialPlugin(pluginName) { - for (let i = 0; i < plugins.length; ++i) { - if (plugins[i][0] === pluginName) { - plugins.splice(i, 1); - if (plugins.length === 0) { - UnregisterAllMaterialPlugins(); - } - return true; + _deserialize(serializationObject, scene, rootUrl) { + super._deserialize(serializationObject, scene, rootUrl); + this.convertToGammaSpace = serializationObject.convertToGammaSpace; + this.convertToLinearSpace = !!serializationObject.convertToLinearSpace; + if (serializationObject.texture) { + rootUrl = serializationObject.texture.url.indexOf("data:") === 0 ? "" : rootUrl; + this.texture = Texture.Parse(serializationObject.texture, scene, rootUrl); } } - return false; -} -function UnregisterAllMaterialPlugins() { - plugins.length = 0; - inited = false; - Material.OnEventObservable.remove(observer); - observer = null; -} +}; +RegisterClass("BABYLON.ParticleTextureBlock", ParticleTextureBlock); -// node_modules/@babylonjs/core/Materials/materialPluginBase.js -var MaterialPluginBase = class { - _enable(enable) { - if (enable) { - this._pluginManager._activatePlugin(this); - } - } +// node_modules/@babylonjs/core/Materials/Node/Blocks/Particle/particleRampGradientBlock.js +var ParticleRampGradientBlock = class extends NodeMaterialBlock { /** - * Creates a new material plugin - * @param material parent material of the plugin - * @param name name of the plugin - * @param priority priority of the plugin - * @param defines list of defines used by the plugin. The value of the property is the default value for this property - * @param addToPluginList true to add the plugin to the list of plugins managed by the material plugin manager of the material (default: true) - * @param enable true to enable the plugin (it is handy if the plugin does not handle properties to switch its current activation) - * @param resolveIncludes Indicates that any #include directive in the plugin code must be replaced by the corresponding code (default: false) + * Create a new ParticleRampGradientBlock + * @param name defines the block name */ - constructor(material, name69, priority, defines, addToPluginList = true, enable = false, resolveIncludes = false) { - this.priority = 500; - this.resolveIncludes = false; - this.registerForExtraEvents = false; - this._material = material; - this.name = name69; - this.priority = priority; - this.resolveIncludes = resolveIncludes; - if (!material.pluginManager) { - material.pluginManager = new MaterialPluginManager(material); - material.onDisposeObservable.add(() => { - material.pluginManager = void 0; - }); - } - this._pluginDefineNames = defines; - this._pluginManager = material.pluginManager; - if (addToPluginList) { - this._pluginManager._addPlugin(this); - } - if (enable) { - this._enable(true); - } - this.markAllDefinesAsDirty = material._dirtyCallbacks[63]; + constructor(name69) { + super(name69, NodeMaterialBlockTargets.Fragment); + this._isUnique = true; + this.registerInput("color", NodeMaterialBlockConnectionPointTypes.Color4, false, NodeMaterialBlockTargets.Fragment); + this.registerOutput("rampColor", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Fragment); } /** - * Gets the current class name useful for serialization or dynamic coding. - * @returns The class name. + * Gets the current class name + * @returns the class name */ getClassName() { - return "MaterialPluginBase"; + return "ParticleRampGradientBlock"; } /** - * Specifies that the submesh is ready to be used. - * @param defines the list of "defines" to update. - * @param scene defines the scene the material belongs to. - * @param engine the engine this scene belongs to. - * @param subMesh the submesh to check for readiness - * @returns - boolean indicating that the submesh is ready or not. + * Gets the color input component */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - isReadyForSubMesh(defines, scene, engine, subMesh) { - return true; + get color() { + return this._inputs[0]; } /** - * Binds the material data (this function is called even if mustRebind() returns false) - * @param uniformBuffer defines the Uniform buffer to fill in. - * @param scene defines the scene the material belongs to. - * @param engine defines the engine the material belongs to. - * @param subMesh the submesh to bind data for + * Gets the rampColor output component */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - hardBindForSubMesh(uniformBuffer, scene, engine, subMesh) { + get rampColor() { + return this._outputs[0]; } /** - * Binds the material data. - * @param uniformBuffer defines the Uniform buffer to fill in. - * @param scene defines the scene the material belongs to. - * @param engine the engine this scene belongs to. - * @param subMesh the submesh to bind data for + * Initialize the block and prepare the context for build + * @param state defines the state that will be used for the build */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - bindForSubMesh(uniformBuffer, scene, engine, subMesh) { + initialize(state) { + state._excludeVariableName("remapRanges"); + state._excludeVariableName("rampSampler"); + state._excludeVariableName("baseColor"); + state._excludeVariableName("alpha"); + state._excludeVariableName("remappedColorIndex"); + state._excludeVariableName("rampColor"); + state._excludeVariableName("finalAlpha"); + } + _buildBlock(state) { + super._buildBlock(state); + if (state.target === NodeMaterialBlockTargets.Vertex) { + return; + } + state._emit2DSampler("rampSampler"); + state._emitVaryingFromString("remapRanges", "vec4", "RAMPGRADIENT"); + state.compilationString += ` + #ifdef RAMPGRADIENT + vec4 baseColor = ${this.color.associatedVariableName}; + float alpha = ${this.color.associatedVariableName}.a; + + float remappedColorIndex = clamp((alpha - remapRanges.x) / remapRanges.y, 0.0, 1.0); + + vec4 rampColor = texture2D(rampSampler, vec2(1.0 - remappedColorIndex, 0.)); + baseColor.rgb *= rampColor.rgb; + + // Remapped alpha + float finalAlpha = baseColor.a; + baseColor.a = clamp((alpha * rampColor.a - remapRanges.z) / remapRanges.w, 0.0, 1.0); + + ${this._declareOutput(this.rampColor, state)} = baseColor; + #else + ${this._declareOutput(this.rampColor, state)} = ${this.color.associatedVariableName}; + #endif + `; + return this; } +}; +RegisterClass("BABYLON.ParticleRampGradientBlock", ParticleRampGradientBlock); + +// node_modules/@babylonjs/core/Materials/Node/Blocks/Particle/particleBlendMultiplyBlock.js +var ParticleBlendMultiplyBlock = class extends NodeMaterialBlock { /** - * Disposes the resources of the material. - * @param forceDisposeTextures - Forces the disposal of all textures. + * Create a new ParticleBlendMultiplyBlock + * @param name defines the block name */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - dispose(forceDisposeTextures) { + constructor(name69) { + super(name69, NodeMaterialBlockTargets.Fragment); + this._isUnique = true; + this.registerInput("color", NodeMaterialBlockConnectionPointTypes.Color4, false, NodeMaterialBlockTargets.Fragment); + this.registerInput("alphaTexture", NodeMaterialBlockConnectionPointTypes.Float, false, NodeMaterialBlockTargets.Fragment); + this.registerInput("alphaColor", NodeMaterialBlockConnectionPointTypes.Float, false, NodeMaterialBlockTargets.Fragment); + this.registerOutput("blendColor", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Fragment); } /** - * Returns a list of custom shader code fragments to customize the shader. - * @param shaderType "vertex" or "fragment" - * @returns null if no code to be added, or a list of pointName =\> code. - * Note that `pointName` can also be a regular expression if it starts with a `!`. - * In that case, the string found by the regular expression (if any) will be - * replaced by the code provided. + * Gets the current class name + * @returns the class name */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getCustomCode(shaderType) { - return null; + getClassName() { + return "ParticleBlendMultiplyBlock"; } /** - * Collects all defines. - * @param defines The object to append to. + * Gets the color input component */ - collectDefines(defines) { - if (!this._pluginDefineNames) { - return; - } - for (const key of Object.keys(this._pluginDefineNames)) { - if (key[0] === "_") { - continue; - } - const type = typeof this._pluginDefineNames[key]; - defines[key] = { - type: type === "number" ? "number" : type === "string" ? "string" : type === "boolean" ? "boolean" : "object", - default: this._pluginDefineNames[key] - }; - } + get color() { + return this._inputs[0]; } /** - * Sets the defines for the next rendering. Called before PrepareDefinesForAttributes is called. - * @param defines the list of "defines" to update. - * @param scene defines the scene to the material belongs to. - * @param mesh the mesh being rendered + * Gets the alphaTexture input component */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - prepareDefinesBeforeAttributes(defines, scene, mesh) { + get alphaTexture() { + return this._inputs[1]; } /** - * Sets the defines for the next rendering - * @param defines the list of "defines" to update. - * @param scene defines the scene to the material belongs to. - * @param mesh the mesh being rendered + * Gets the alphaColor input component */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - prepareDefines(defines, scene, mesh) { + get alphaColor() { + return this._inputs[2]; } /** - * Checks to see if a texture is used in the material. - * @param texture - Base texture to use. - * @returns - Boolean specifying if a texture is used in the material. + * Gets the blendColor output component */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - hasTexture(texture) { - return false; + get blendColor() { + return this._outputs[0]; } /** - * Gets a boolean indicating that current material needs to register RTT - * @returns true if this uses a render target otherwise false. + * Initialize the block and prepare the context for build + * @param state defines the state that will be used for the build */ - hasRenderTargetTextures() { - return false; + initialize(state) { + state._excludeVariableName("sourceAlpha"); + } + _buildBlock(state) { + super._buildBlock(state); + if (state.target === NodeMaterialBlockTargets.Vertex) { + return; + } + state.compilationString += ` + #ifdef BLENDMULTIPLYMODE + ${this._declareOutput(this.blendColor, state)}; + float sourceAlpha = ${this.alphaColor.associatedVariableName} * ${this.alphaTexture.associatedVariableName}; + ${this.blendColor.associatedVariableName}.rgb = ${this.color.associatedVariableName}.rgb * sourceAlpha + vec3(1.0) * (1.0 - sourceAlpha); + ${this.blendColor.associatedVariableName}.a = ${this.color.associatedVariableName}.a; + #else + ${this._declareOutput(this.blendColor, state)} = ${this.color.associatedVariableName}; + #endif + `; + return this; } +}; +RegisterClass("BABYLON.ParticleBlendMultiplyBlock", ParticleBlendMultiplyBlock); + +// node_modules/@babylonjs/core/Engines/renderTargetWrapper.js +var RenderTargetWrapper = class { /** - * Fills the list of render target textures. - * @param renderTargets the list of render targets to update + * Gets the depth/stencil texture (if created by a createDepthStencilTexture() call) */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - fillRenderTargetTextures(renderTargets) { + get depthStencilTexture() { + return this._depthStencilTexture; } /** - * Returns an array of the actively used textures. - * @param activeTextures Array of BaseTextures + * Indicates if the depth/stencil texture has a stencil aspect */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getActiveTextures(activeTextures) { + get depthStencilTextureWithStencil() { + return this._depthStencilTextureWithStencil; } /** - * Returns the animatable textures. - * @param animatables Array of animatable textures. + * Defines if the render target wrapper is for a cube texture or if false a 2d texture */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getAnimatables(animatables) { + get isCube() { + return this._isCube; } /** - * Add fallbacks to the effect fallbacks list. - * @param defines defines the Base texture to use. - * @param fallbacks defines the current fallback list. - * @param currentRank defines the current fallback rank. - * @returns the new fallback rank. + * Defines if the render target wrapper is for a single or multi target render wrapper */ - addFallbacks(defines, fallbacks, currentRank) { - return currentRank; + get isMulti() { + return this._isMulti; } /** - * Gets the samplers used by the plugin. - * @param samplers list that the sampler names should be added to. + * Defines if the render target wrapper is for a single or an array of textures */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getSamplers(samplers) { + get is2DArray() { + return this.layers > 0; } /** - * Gets the attributes used by the plugin. - * @param attributes list that the attribute names should be added to. - * @param scene the scene that the material belongs to. - * @param mesh the mesh being rendered. + * Defines if the render target wrapper is for a 3D texture */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getAttributes(attributes, scene, mesh) { + get is3D() { + return this.depth > 0; } /** - * Gets the uniform buffers names added by the plugin. - * @param ubos list that the ubo names should be added to. + * Gets the size of the render target wrapper (used for cubes, as width=height in this case) */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getUniformBuffersNames(ubos) { + get size() { + return this.width; } /** - * Gets the description of the uniforms to add to the ubo (if engine supports ubos) or to inject directly in the vertex/fragment shaders (if engine does not support ubos) - * @returns the description of the uniforms + * Gets the width of the render target wrapper */ - getUniforms() { - return {}; + get width() { + return this._size.width || this._size; } /** - * Makes a duplicate of the current configuration into another one. - * @param plugin define the config where to copy the info + * Gets the height of the render target wrapper */ - copyTo(plugin) { - SerializationHelper.Clone(() => plugin, this); + get height() { + return this._size.height || this._size; } /** - * Serializes this plugin configuration. - * @returns - An object with the serialized config. + * Gets the number of layers of the render target wrapper (only used if is2DArray is true and wrapper is not a multi render target) */ - serialize() { - return SerializationHelper.Serialize(this); + get layers() { + return this._size.layers || 0; } /** - * Parses a plugin configuration from a serialized object. - * @param source - Serialized object. - * @param scene Defines the scene we are parsing for - * @param rootUrl Defines the rootUrl to load from + * Gets the depth of the render target wrapper (only used if is3D is true and wrapper is not a multi render target) */ - parse(source, scene, rootUrl) { - SerializationHelper.Parse(() => this, source, scene, rootUrl); + get depth() { + return this._size.depth || 0; } -}; -__decorate([ - serialize() -], MaterialPluginBase.prototype, "name", void 0); -__decorate([ - serialize() -], MaterialPluginBase.prototype, "priority", void 0); -__decorate([ - serialize() -], MaterialPluginBase.prototype, "resolveIncludes", void 0); -__decorate([ - serialize() -], MaterialPluginBase.prototype, "registerForExtraEvents", void 0); - -// node_modules/@babylonjs/core/Materials/material.detailMapConfiguration.js -var MaterialDetailMapDefines = class extends MaterialDefines { - constructor() { - super(...arguments); - this.DETAIL = false; - this.DETAILDIRECTUV = 0; - this.DETAIL_NORMALBLENDMETHOD = 0; + /** + * Gets the render texture. If this is a multi render target, gets the first texture + */ + get texture() { + var _a; + return ((_a = this._textures) == null ? void 0 : _a[0]) ?? null; } -}; -var DetailMapConfiguration = class extends MaterialPluginBase { - /** @internal */ - _markAllSubMeshesAsTexturesDirty() { - this._enable(this._isEnabled); - this._internalMarkAllSubMeshesAsTexturesDirty(); + /** + * Gets the list of render textures. If we are not in a multi render target, the list will be null (use the texture getter instead) + */ + get textures() { + return this._textures; } - constructor(material, addToPluginList = true) { - super(material, "DetailMap", 140, new MaterialDetailMapDefines(), addToPluginList); - this._texture = null; - this.diffuseBlendLevel = 1; - this.roughnessBlendLevel = 1; - this.bumpLevel = 1; - this._normalBlendMethod = Material.MATERIAL_NORMALBLENDMETHOD_WHITEOUT; - this._isEnabled = false; - this.isEnabled = false; - this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[1]; + /** + * Gets the face indices that correspond to the list of render textures. If we are not in a multi render target, the list will be null + */ + get faceIndices() { + return this._faceIndices; } - isReadyForSubMesh(defines, scene, engine) { - if (!this._isEnabled) { - return true; - } - if (defines._areTexturesDirty && scene.texturesEnabled) { - if (engine.getCaps().standardDerivatives && this._texture && MaterialFlags.DetailTextureEnabled) { - if (!this._texture.isReady()) { - return false; - } - } + /** + * Gets the layer indices that correspond to the list of render textures. If we are not in a multi render target, the list will be null + */ + get layerIndices() { + return this._layerIndices; + } + /** + * Gets the sample count of the render target + */ + get samples() { + return this._samples; + } + /** + * Sets the sample count of the render target + * @param value sample count + * @param initializeBuffers If set to true, the engine will make an initializing call to drawBuffers (only used when isMulti=true). + * @param force true to force calling the update sample count engine function even if the current sample count is equal to value + * @returns the sample count that has been set + */ + setSamples(value, initializeBuffers = true, force = false) { + if (this.samples === value && !force) { + return value; } - return true; + const result = this._isMulti ? this._engine.updateMultipleRenderTargetTextureSampleCount(this, value, initializeBuffers) : this._engine.updateRenderTargetTextureSampleCount(this, value); + this._samples = value; + return result; } - prepareDefines(defines, scene) { - if (this._isEnabled) { - defines.DETAIL_NORMALBLENDMETHOD = this._normalBlendMethod; - const engine = scene.getEngine(); - if (defines._areTexturesDirty) { - if (engine.getCaps().standardDerivatives && this._texture && MaterialFlags.DetailTextureEnabled && this._isEnabled) { - PrepareDefinesForMergedUV(this._texture, defines, "DETAIL"); - defines.DETAIL_NORMALBLENDMETHOD = this._normalBlendMethod; - } else { - defines.DETAIL = false; - } - } + /** + * Initializes the render target wrapper + * @param isMulti true if the wrapper is a multi render target + * @param isCube true if the wrapper should render to a cube texture + * @param size size of the render target (width/height/layers) + * @param engine engine used to create the render target + * @param label defines the label to use for the wrapper (for debugging purpose only) + */ + constructor(isMulti, isCube, size, engine, label) { + this._textures = null; + this._faceIndices = null; + this._layerIndices = null; + this._samples = 1; + this._attachments = null; + this._generateStencilBuffer = false; + this._generateDepthBuffer = false; + this._depthStencilTextureWithStencil = false; + this._isMulti = isMulti; + this._isCube = isCube; + this._size = size; + this._engine = engine; + this._depthStencilTexture = null; + this.label = label; + } + /** + * Sets the render target texture(s) + * @param textures texture(s) to set + */ + setTextures(textures) { + if (Array.isArray(textures)) { + this._textures = textures; + } else if (textures) { + this._textures = [textures]; } else { - defines.DETAIL = false; + this._textures = null; } } - bindForSubMesh(uniformBuffer, scene) { - if (!this._isEnabled) { - return; + /** + * Set a texture in the textures array + * @param texture The texture to set + * @param index The index in the textures array to set + * @param disposePrevious If this function should dispose the previous texture + */ + setTexture(texture, index = 0, disposePrevious = true) { + if (!this._textures) { + this._textures = []; } - const isFrozen = this._material.isFrozen; - if (!uniformBuffer.useUbo || !isFrozen || !uniformBuffer.isSync) { - if (this._texture && MaterialFlags.DetailTextureEnabled) { - uniformBuffer.updateFloat4("vDetailInfos", this._texture.coordinatesIndex, this.diffuseBlendLevel, this.bumpLevel, this.roughnessBlendLevel); - BindTextureMatrix(this._texture, uniformBuffer, "detail"); - } + if (this._textures[index] === texture) { + return; } - if (scene.texturesEnabled) { - if (this._texture && MaterialFlags.DetailTextureEnabled) { - uniformBuffer.setTexture("detailSampler", this._texture); - } + if (this._textures[index] && disposePrevious) { + this._textures[index].dispose(); } + this._textures[index] = texture; } - hasTexture(texture) { - if (this._texture === texture) { - return true; - } - return false; + /** + * Sets the layer and face indices of every render target texture bound to each color attachment + * @param layers The layers of each texture to be set + * @param faces The faces of each texture to be set + */ + setLayerAndFaceIndices(layers, faces) { + this._layerIndices = layers; + this._faceIndices = faces; } - getActiveTextures(activeTextures) { - if (this._texture) { - activeTextures.push(this._texture); + /** + * Sets the layer and face indices of a texture in the textures array that should be bound to each color attachment + * @param index The index of the texture in the textures array to modify + * @param layer The layer of the texture to be set + * @param face The face of the texture to be set + */ + setLayerAndFaceIndex(index = 0, layer, face) { + if (!this._layerIndices) { + this._layerIndices = []; } - } - getAnimatables(animatables) { - if (this._texture && this._texture.animations && this._texture.animations.length > 0) { - animatables.push(this._texture); + if (!this._faceIndices) { + this._faceIndices = []; } - } - dispose(forceDisposeTextures) { - var _a; - if (forceDisposeTextures) { - (_a = this._texture) == null ? void 0 : _a.dispose(); + if (layer !== void 0 && layer >= 0) { + this._layerIndices[index] = layer; + } + if (face !== void 0 && face >= 0) { + this._faceIndices[index] = face; } - } - getClassName() { - return "DetailMapConfiguration"; - } - getSamplers(samplers) { - samplers.push("detailSampler"); - } - getUniforms() { - return { - ubo: [ - { name: "vDetailInfos", size: 4, type: "vec4" }, - { name: "detailMatrix", size: 16, type: "mat4" } - ] - }; - } -}; -__decorate([ - serializeAsTexture("detailTexture"), - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], DetailMapConfiguration.prototype, "texture", void 0); -__decorate([ - serialize() -], DetailMapConfiguration.prototype, "diffuseBlendLevel", void 0); -__decorate([ - serialize() -], DetailMapConfiguration.prototype, "roughnessBlendLevel", void 0); -__decorate([ - serialize() -], DetailMapConfiguration.prototype, "bumpLevel", void 0); -__decorate([ - serialize(), - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], DetailMapConfiguration.prototype, "normalBlendMethod", void 0); -__decorate([ - serialize(), - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], DetailMapConfiguration.prototype, "isEnabled", void 0); - -// node_modules/@babylonjs/core/Materials/prePassConfiguration.js -var PrePassConfiguration = class { - constructor() { - this.previousWorldMatrices = {}; - this.previousBones = {}; } /** - * Add the required uniforms to the current list. - * @param uniforms defines the current uniform list. + * Creates the depth/stencil texture + * @param comparisonFunction Comparison function to use for the texture + * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture + * @param generateStencil true if the stencil aspect should also be created + * @param samples sample count to use when creating the texture + * @param format format of the depth texture + * @param label defines the label to use for the texture (for debugging purpose only) + * @returns the depth/stencil created texture */ - static AddUniforms(uniforms) { - uniforms.push("previousWorld", "previousViewProjection", "mPreviousBones"); + createDepthStencilTexture(comparisonFunction = 0, bilinearFiltering = true, generateStencil = false, samples = 1, format = 14, label) { + var _a; + (_a = this._depthStencilTexture) == null ? void 0 : _a.dispose(); + this._depthStencilTextureWithStencil = generateStencil; + this._depthStencilTextureLabel = label; + this._depthStencilTexture = this._engine.createDepthStencilTexture(this._size, { + bilinearFiltering, + comparisonFunction, + generateStencil, + isCube: this._isCube, + samples, + depthTextureFormat: format, + label + }, this); + return this._depthStencilTexture; } /** - * Add the required samplers to the current list. - * @param samplers defines the current sampler list. + * Shares the depth buffer of this render target with another render target. + * @internal + * @param renderTarget Destination renderTarget */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - static AddSamplers(samplers) { + _shareDepth(renderTarget) { + if (this._depthStencilTexture) { + if (renderTarget._depthStencilTexture) { + renderTarget._depthStencilTexture.dispose(); + } + renderTarget._depthStencilTexture = this._depthStencilTexture; + this._depthStencilTexture.incrementReferences(); + } } /** - * Binds the material data. - * @param effect defines the effect to update - * @param scene defines the scene the material belongs to. - * @param mesh The mesh - * @param world World matrix of this mesh - * @param isFrozen Is the material frozen + * @internal */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - bindForSubMesh(effect, scene, mesh, world, isFrozen) { - if (scene.prePassRenderer && scene.prePassRenderer.enabled && scene.prePassRenderer.currentRTisSceneRT) { - if (scene.prePassRenderer.getIndex(2) !== -1) { - if (!this.previousWorldMatrices[mesh.uniqueId]) { - this.previousWorldMatrices[mesh.uniqueId] = world.clone(); + _swapAndDie(target) { + if (this.texture) { + this.texture._swapAndDie(target); + } + this._textures = null; + this.dispose(true); + } + _cloneRenderTargetWrapper() { + var _a, _b, _c, _d, _e; + let rtw = null; + if (this._isMulti) { + const textureArray = this.textures; + if (textureArray && textureArray.length > 0) { + let generateDepthTexture = false; + let textureCount = textureArray.length; + let depthTextureFormat = -1; + const lastTextureSource = textureArray[textureArray.length - 1]._source; + if (lastTextureSource === InternalTextureSource.Depth || lastTextureSource === InternalTextureSource.DepthStencil) { + generateDepthTexture = true; + depthTextureFormat = textureArray[textureArray.length - 1].format; + textureCount--; } - if (!this.previousViewProjection) { - this.previousViewProjection = scene.getTransformMatrix().clone(); - this.currentViewProjection = scene.getTransformMatrix().clone(); + const samplingModes = []; + const types = []; + const formats = []; + const targetTypes = []; + const faceIndex = []; + const layerIndex = []; + const layerCounts = []; + const internalTexture2Index = {}; + for (let i = 0; i < textureCount; ++i) { + const texture = textureArray[i]; + samplingModes.push(texture.samplingMode); + types.push(texture.type); + formats.push(texture.format); + const index = internalTexture2Index[texture.uniqueId]; + if (index !== void 0) { + targetTypes.push(-1); + layerCounts.push(0); + } else { + internalTexture2Index[texture.uniqueId] = i; + if (texture.is2DArray) { + targetTypes.push(35866); + layerCounts.push(texture.depth); + } else if (texture.isCube) { + targetTypes.push(34067); + layerCounts.push(0); + } else if (texture.is3D) { + targetTypes.push(32879); + layerCounts.push(texture.depth); + } else { + targetTypes.push(3553); + layerCounts.push(0); + } + } + if (this._faceIndices) { + faceIndex.push(this._faceIndices[i] ?? 0); + } + if (this._layerIndices) { + layerIndex.push(this._layerIndices[i] ?? 0); + } } - const engine = scene.getEngine(); - if (this.currentViewProjection.updateFlag !== scene.getTransformMatrix().updateFlag) { - this._lastUpdateFrameId = engine.frameId; - this.previousViewProjection.copyFrom(this.currentViewProjection); - this.currentViewProjection.copyFrom(scene.getTransformMatrix()); - } else if (this._lastUpdateFrameId !== engine.frameId) { - this._lastUpdateFrameId = engine.frameId; - this.previousViewProjection.copyFrom(this.currentViewProjection); + const optionsMRT = { + samplingModes, + generateMipMaps: textureArray[0].generateMipMaps, + generateDepthBuffer: this._generateDepthBuffer, + generateStencilBuffer: this._generateStencilBuffer, + generateDepthTexture, + depthTextureFormat, + types, + formats, + textureCount, + targetTypes, + faceIndex, + layerIndex, + layerCounts, + label: this.label + }; + const size = { + width: this.width, + height: this.height, + depth: this.depth + }; + rtw = this._engine.createMultipleRenderTarget(size, optionsMRT); + for (let i = 0; i < textureCount; ++i) { + if (targetTypes[i] !== -1) { + continue; + } + const index = internalTexture2Index[textureArray[i].uniqueId]; + rtw.setTexture(rtw.textures[index], i); } - effect.setMatrix("previousWorld", this.previousWorldMatrices[mesh.uniqueId]); - effect.setMatrix("previousViewProjection", this.previousViewProjection); - this.previousWorldMatrices[mesh.uniqueId] = world.clone(); + } + } else { + const options = {}; + options.generateDepthBuffer = this._generateDepthBuffer; + options.generateMipMaps = ((_a = this.texture) == null ? void 0 : _a.generateMipMaps) ?? false; + options.generateStencilBuffer = this._generateStencilBuffer; + options.samplingMode = (_b = this.texture) == null ? void 0 : _b.samplingMode; + options.type = (_c = this.texture) == null ? void 0 : _c.type; + options.format = (_d = this.texture) == null ? void 0 : _d.format; + options.noColorAttachment = !this._textures; + options.label = this.label; + if (this.isCube) { + rtw = this._engine.createRenderTargetCubeTexture(this.width, options); + } else { + const size = { + width: this.width, + height: this.height, + layers: this.is2DArray || this.is3D ? (_e = this.texture) == null ? void 0 : _e.depth : void 0 + }; + rtw = this._engine.createRenderTargetTexture(size, options); + } + if (rtw.texture) { + rtw.texture.isReady = true; } } + return rtw; + } + _swapRenderTargetWrapper(target) { + if (this._textures && target._textures) { + for (let i = 0; i < this._textures.length; ++i) { + this._textures[i]._swapAndDie(target._textures[i], false); + target._textures[i].isReady = true; + } + } + if (this._depthStencilTexture && target._depthStencilTexture) { + this._depthStencilTexture._swapAndDie(target._depthStencilTexture); + target._depthStencilTexture.isReady = true; + } + this._textures = null; + this._depthStencilTexture = null; + } + /** @internal */ + _rebuild() { + const rtw = this._cloneRenderTargetWrapper(); + if (!rtw) { + return; + } + if (this._depthStencilTexture) { + const samplingMode = this._depthStencilTexture.samplingMode; + const format = this._depthStencilTexture.format; + const bilinear = samplingMode === 2 || samplingMode === 3 || samplingMode === 11; + rtw.createDepthStencilTexture(this._depthStencilTexture._comparisonFunction, bilinear, this._depthStencilTextureWithStencil, this._depthStencilTexture.samples, format, this._depthStencilTextureLabel); + } + if (this.samples > 1) { + rtw.setSamples(this.samples); + } + rtw._swapRenderTargetWrapper(this); + rtw.dispose(); + } + /** + * Releases the internal render textures + */ + releaseTextures() { + var _a; + if (this._textures) { + for (let i = 0; i < ((_a = this._textures) == null ? void 0 : _a.length); ++i) { + this._textures[i].dispose(); + } + } + this._textures = null; + } + /** + * Disposes the whole render target wrapper + * @param disposeOnlyFramebuffers true if only the frame buffers should be released (used for the WebGL engine). If false, all the textures will also be released + */ + dispose(disposeOnlyFramebuffers = false) { + var _a; + if (!disposeOnlyFramebuffers) { + (_a = this._depthStencilTexture) == null ? void 0 : _a.dispose(); + this._depthStencilTexture = null; + this.releaseTextures(); + } + this._engine._releaseRenderTargetWrapper(this); } }; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/decalFragmentDeclaration.js -var name4 = "decalFragmentDeclaration"; -var shader4 = `#ifdef DECAL -uniform vec4 vDecalInfos; -#endif -`; -ShaderStore.IncludesShadersStore[name4] = shader4; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/defaultFragmentDeclaration.js -var name5 = "defaultFragmentDeclaration"; -var shader5 = `uniform vec4 vEyePosition;uniform vec4 vDiffuseColor; -#ifdef SPECULARTERM -uniform vec4 vSpecularColor; -#endif -uniform vec3 vEmissiveColor;uniform vec3 vAmbientColor;uniform float visibility; -#ifdef DIFFUSE -uniform vec2 vDiffuseInfos; -#endif -#ifdef AMBIENT -uniform vec2 vAmbientInfos; -#endif -#ifdef OPACITY -uniform vec2 vOpacityInfos; -#endif -#ifdef EMISSIVE -uniform vec2 vEmissiveInfos; -#endif -#ifdef LIGHTMAP -uniform vec2 vLightmapInfos; -#endif -#ifdef BUMP -uniform vec3 vBumpInfos;uniform vec2 vTangentSpaceParams; -#endif -#ifdef ALPHATEST -uniform float alphaCutOff; -#endif -#if defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_PROJECTION) || defined(REFRACTION) || defined(PREPASS) -uniform mat4 view; -#endif -#ifdef REFRACTION -uniform vec4 vRefractionInfos; -#ifndef REFRACTIONMAP_3D -uniform mat4 refractionMatrix; -#endif -#ifdef REFRACTIONFRESNEL -uniform vec4 refractionLeftColor;uniform vec4 refractionRightColor; -#endif -#if defined(USE_LOCAL_REFRACTIONMAP_CUBIC) && defined(REFRACTIONMAP_3D) -uniform vec3 vRefractionPosition;uniform vec3 vRefractionSize; -#endif -#endif -#if defined(SPECULAR) && defined(SPECULARTERM) -uniform vec2 vSpecularInfos; -#endif -#ifdef DIFFUSEFRESNEL -uniform vec4 diffuseLeftColor;uniform vec4 diffuseRightColor; -#endif -#ifdef OPACITYFRESNEL -uniform vec4 opacityParts; -#endif -#ifdef EMISSIVEFRESNEL -uniform vec4 emissiveLeftColor;uniform vec4 emissiveRightColor; -#endif -#ifdef REFLECTION -uniform vec2 vReflectionInfos; -#if defined(REFLECTIONMAP_PLANAR) || defined(REFLECTIONMAP_CUBIC) || defined(REFLECTIONMAP_PROJECTION) || defined(REFLECTIONMAP_EQUIRECTANGULAR) || defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_SKYBOX) -uniform mat4 reflectionMatrix; -#endif -#ifndef REFLECTIONMAP_SKYBOX -#if defined(USE_LOCAL_REFLECTIONMAP_CUBIC) && defined(REFLECTIONMAP_CUBIC) -uniform vec3 vReflectionPosition;uniform vec3 vReflectionSize; -#endif -#endif -#ifdef REFLECTIONFRESNEL -uniform vec4 reflectionLeftColor;uniform vec4 reflectionRightColor; -#endif -#endif -#ifdef DETAIL -uniform vec4 vDetailInfos; -#endif -#include -#define ADDITIONAL_FRAGMENT_DECLARATION -`; -ShaderStore.IncludesShadersStore[name5] = shader5; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/sceneUboDeclaration.js -var name6 = "sceneUboDeclaration"; -var shader6 = `layout(std140,column_major) uniform;uniform Scene {mat4 viewProjection; -#ifdef MULTIVIEW -mat4 viewProjectionR; -#endif -mat4 view;mat4 projection;vec4 vEyePosition;}; -`; -ShaderStore.IncludesShadersStore[name6] = shader6; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/meshUboDeclaration.js -var name7 = "meshUboDeclaration"; -var shader7 = `#ifdef WEBGL2 -uniform mat4 world;uniform float visibility; -#else -layout(std140,column_major) uniform;uniform Mesh -{mat4 world;float visibility;}; -#endif -#define WORLD_UBO -`; -ShaderStore.IncludesShadersStore[name7] = shader7; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/defaultUboDeclaration.js -var name8 = "defaultUboDeclaration"; -var shader8 = `layout(std140,column_major) uniform;uniform Material -{vec4 diffuseLeftColor;vec4 diffuseRightColor;vec4 opacityParts;vec4 reflectionLeftColor;vec4 reflectionRightColor;vec4 refractionLeftColor;vec4 refractionRightColor;vec4 emissiveLeftColor;vec4 emissiveRightColor;vec2 vDiffuseInfos;vec2 vAmbientInfos;vec2 vOpacityInfos;vec2 vReflectionInfos;vec3 vReflectionPosition;vec3 vReflectionSize;vec2 vEmissiveInfos;vec2 vLightmapInfos;vec2 vSpecularInfos;vec3 vBumpInfos;mat4 diffuseMatrix;mat4 ambientMatrix;mat4 opacityMatrix;mat4 reflectionMatrix;mat4 emissiveMatrix;mat4 lightmapMatrix;mat4 specularMatrix;mat4 bumpMatrix;vec2 vTangentSpaceParams;float pointSize;float alphaCutOff;mat4 refractionMatrix;vec4 vRefractionInfos;vec3 vRefractionPosition;vec3 vRefractionSize;vec4 vSpecularColor;vec3 vEmissiveColor;vec4 vDiffuseColor;vec3 vAmbientColor; -#define ADDITIONAL_UBO_DECLARATION -}; -#include -#include -`; -ShaderStore.IncludesShadersStore[name8] = shader8; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/prePassDeclaration.js -var name9 = "prePassDeclaration"; -var shader9 = `#ifdef PREPASS -#extension GL_EXT_draw_buffers : require -layout(location=0) out highp vec4 glFragData[{X}];highp vec4 gl_FragColor; -#ifdef PREPASS_DEPTH -varying highp vec3 vViewPos; -#endif -#ifdef PREPASS_VELOCITY -varying highp vec4 vCurrentPosition;varying highp vec4 vPreviousPosition; -#endif -#endif -`; -ShaderStore.IncludesShadersStore[name9] = shader9; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/oitDeclaration.js -var name10 = "oitDeclaration"; -var shader10 = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY -#extension GL_EXT_draw_buffers : require -layout(location=0) out vec2 depth; -layout(location=1) out vec4 frontColor;layout(location=2) out vec4 backColor; -#define MAX_DEPTH 99999.0 -highp vec4 gl_FragColor;uniform sampler2D oitDepthSampler;uniform sampler2D oitFrontColorSampler; -#endif -`; -ShaderStore.IncludesShadersStore[name10] = shader10; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/mainUVVaryingDeclaration.js -var name11 = "mainUVVaryingDeclaration"; -var shader11 = `#ifdef MAINUV{X} -varying vec2 vMainUV{X}; -#endif -`; -ShaderStore.IncludesShadersStore[name11] = shader11; +// node_modules/@babylonjs/core/Shaders/postprocess.vertex.js +var name66 = "postprocessVertexShader"; +var shader66 = `attribute vec2 position;uniform vec2 scale;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5); +#define CUSTOM_VERTEX_DEFINITIONS +void main(void) { +#define CUSTOM_VERTEX_MAIN_BEGIN +vUV=(position*madd+madd)*scale;gl_Position=vec4(position,0.0,1.0); +#define CUSTOM_VERTEX_MAIN_END +}`; +ShaderStore.ShadersStore[name66] = shader66; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/helperFunctions.js -var name12 = "helperFunctions"; -var shader12 = `const float PI=3.1415926535897932384626433832795;const float RECIPROCAL_PI=0.3183098861837907;const float RECIPROCAL_PI2=0.15915494309189535;const float HALF_MIN=5.96046448e-08; -const float LinearEncodePowerApprox=2.2;const float GammaEncodePowerApprox=1.0/LinearEncodePowerApprox;const vec3 LuminanceEncodeApprox=vec3(0.2126,0.7152,0.0722);const float Epsilon=0.0000001; -#define saturate(x) clamp(x,0.0,1.0) -#define absEps(x) abs(x)+Epsilon -#define maxEps(x) max(x,Epsilon) -#define saturateEps(x) clamp(x,Epsilon,1.0) -mat3 transposeMat3(mat3 inMatrix) {vec3 i0=inMatrix[0];vec3 i1=inMatrix[1];vec3 i2=inMatrix[2];mat3 outMatrix=mat3( -vec3(i0.x,i1.x,i2.x), -vec3(i0.y,i1.y,i2.y), -vec3(i0.z,i1.z,i2.z) -);return outMatrix;} -mat3 inverseMat3(mat3 inMatrix) {float a00=inMatrix[0][0],a01=inMatrix[0][1],a02=inMatrix[0][2];float a10=inMatrix[1][0],a11=inMatrix[1][1],a12=inMatrix[1][2];float a20=inMatrix[2][0],a21=inMatrix[2][1],a22=inMatrix[2][2];float b01=a22*a11-a12*a21;float b11=-a22*a10+a12*a20;float b21=a21*a10-a11*a20;float det=a00*b01+a01*b11+a02*b21;return mat3(b01,(-a22*a01+a02*a21),(a12*a01-a02*a11), -b11,(a22*a00-a02*a20),(-a12*a00+a02*a10), -b21,(-a21*a00+a01*a20),(a11*a00-a01*a10))/det;} -#if USE_EXACT_SRGB_CONVERSIONS -vec3 toLinearSpaceExact(vec3 color) -{vec3 nearZeroSection=0.0773993808*color;vec3 remainingSection=pow(0.947867299*(color+vec3(0.055)),vec3(2.4)); -#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE) -return mix(remainingSection,nearZeroSection,lessThanEqual(color,vec3(0.04045))); -#else -return -vec3( -color.r<=0.04045 ? nearZeroSection.r : remainingSection.r, -color.g<=0.04045 ? nearZeroSection.g : remainingSection.g, -color.b<=0.04045 ? nearZeroSection.b : remainingSection.b); -#endif -} -vec3 toGammaSpaceExact(vec3 color) -{vec3 nearZeroSection=12.92*color;vec3 remainingSection=1.055*pow(color,vec3(0.41666))-vec3(0.055); -#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE) -return mix(remainingSection,nearZeroSection,lessThanEqual(color,vec3(0.0031308))); -#else -return -vec3( -color.r<=0.0031308 ? nearZeroSection.r : remainingSection.r, -color.g<=0.0031308 ? nearZeroSection.g : remainingSection.g, -color.b<=0.0031308 ? nearZeroSection.b : remainingSection.b); -#endif -} -#endif -float toLinearSpace(float color) -{ -#if USE_EXACT_SRGB_CONVERSIONS -float nearZeroSection=0.0773993808*color;float remainingSection=pow(0.947867299*(color+0.055),2.4);return color<=0.04045 ? nearZeroSection : remainingSection; -#else -return pow(color,LinearEncodePowerApprox); -#endif -} -vec3 toLinearSpace(vec3 color) -{ -#if USE_EXACT_SRGB_CONVERSIONS -return toLinearSpaceExact(color); -#else -return pow(color,vec3(LinearEncodePowerApprox)); -#endif -} -vec4 toLinearSpace(vec4 color) -{ -#if USE_EXACT_SRGB_CONVERSIONS -return vec4(toLinearSpaceExact(color.rgb),color.a); -#else -return vec4(pow(color.rgb,vec3(LinearEncodePowerApprox)),color.a); -#endif -} -float toGammaSpace(float color) -{ -#if USE_EXACT_SRGB_CONVERSIONS -float nearZeroSection=12.92*color;float remainingSection=1.055*pow(color,0.41666)-0.055;return color<=0.0031308 ? nearZeroSection : remainingSection; -#else -return pow(color,GammaEncodePowerApprox); -#endif -} -vec3 toGammaSpace(vec3 color) -{ -#if USE_EXACT_SRGB_CONVERSIONS -return toGammaSpaceExact(color); -#else -return pow(color,vec3(GammaEncodePowerApprox)); -#endif -} -vec4 toGammaSpace(vec4 color) -{ -#if USE_EXACT_SRGB_CONVERSIONS -return vec4(toGammaSpaceExact(color.rgb),color.a); -#else -return vec4(pow(color.rgb,vec3(GammaEncodePowerApprox)),color.a); -#endif -} -float square(float value) -{return value*value;} -vec3 square(vec3 value) -{return value*value;} -float pow5(float value) {float sq=value*value;return sq*sq*value;} -float getLuminance(vec3 color) -{return clamp(dot(color,LuminanceEncodeApprox),0.,1.);} -float getRand(vec2 seed) {return fract(sin(dot(seed.xy ,vec2(12.9898,78.233)))*43758.5453);} -float dither(vec2 seed,float varianceAmount) {float rand=getRand(seed);float normVariance=varianceAmount/255.0;float dither=mix(-normVariance,normVariance,rand);return dither;} -const float rgbdMaxRange=255.0;vec4 toRGBD(vec3 color) {float maxRGB=maxEps(max(color.r,max(color.g,color.b)));float D =max(rgbdMaxRange/maxRGB,1.);D =clamp(floor(D)/255.0,0.,1.);vec3 rgb=color.rgb*D;rgb=toGammaSpace(rgb);return vec4(clamp(rgb,0.,1.),D); } -vec3 fromRGBD(vec4 rgbd) {rgbd.rgb=toLinearSpace(rgbd.rgb);return rgbd.rgb/rgbd.a;} -vec3 parallaxCorrectNormal( vec3 vertexPos,vec3 origVec,vec3 cubeSize,vec3 cubePos ) {vec3 invOrigVec=vec3(1.0,1.0,1.0)/origVec;vec3 halfSize=cubeSize*0.5;vec3 intersecAtMaxPlane=(cubePos+halfSize-vertexPos)*invOrigVec;vec3 intersecAtMinPlane=(cubePos-halfSize-vertexPos)*invOrigVec;vec3 largestIntersec=max(intersecAtMaxPlane,intersecAtMinPlane);float distance=min(min(largestIntersec.x,largestIntersec.y),largestIntersec.z);vec3 intersectPositionWS=vertexPos+origVec*distance;return intersectPositionWS-cubePos;} -`; -ShaderStore.IncludesShadersStore[name12] = shader12; +// node_modules/@babylonjs/core/Engines/WebGL/webGLRenderTargetWrapper.js +var WebGLRenderTargetWrapper = class extends RenderTargetWrapper { + constructor(isMulti, isCube, size, engine, context) { + super(isMulti, isCube, size, engine); + this._framebuffer = null; + this._depthStencilBuffer = null; + this._MSAAFramebuffer = null; + this._colorTextureArray = null; + this._depthStencilTextureArray = null; + this._disposeOnlyFramebuffers = false; + this._currentLOD = 0; + this._context = context; + } + _cloneRenderTargetWrapper() { + let rtw = null; + if (this._colorTextureArray && this._depthStencilTextureArray) { + rtw = this._engine.createMultiviewRenderTargetTexture(this.width, this.height); + rtw.texture.isReady = true; + } else { + rtw = super._cloneRenderTargetWrapper(); + } + return rtw; + } + _swapRenderTargetWrapper(target) { + super._swapRenderTargetWrapper(target); + target._framebuffer = this._framebuffer; + target._depthStencilBuffer = this._depthStencilBuffer; + target._MSAAFramebuffer = this._MSAAFramebuffer; + target._colorTextureArray = this._colorTextureArray; + target._depthStencilTextureArray = this._depthStencilTextureArray; + this._framebuffer = this._depthStencilBuffer = this._MSAAFramebuffer = this._colorTextureArray = this._depthStencilTextureArray = null; + } + /** + * Creates the depth/stencil texture + * @param comparisonFunction Comparison function to use for the texture + * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture + * @param generateStencil true if the stencil aspect should also be created + * @param samples sample count to use when creating the texture + * @param format format of the depth texture + * @param label defines the label to use for the texture (for debugging purpose only) + * @returns the depth/stencil created texture + */ + createDepthStencilTexture(comparisonFunction = 0, bilinearFiltering = true, generateStencil = false, samples = 1, format = 14, label) { + if (this._depthStencilBuffer) { + const currentFrameBuffer = this._engine._currentFramebuffer; + const gl = this._context; + this._engine._bindUnboundFramebuffer(this._framebuffer); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, null); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, null); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, null); + this._engine._bindUnboundFramebuffer(currentFrameBuffer); + gl.deleteRenderbuffer(this._depthStencilBuffer); + this._depthStencilBuffer = null; + } + return super.createDepthStencilTexture(comparisonFunction, bilinearFiltering, generateStencil, samples, format, label); + } + /** + * Shares the depth buffer of this render target with another render target. + * @internal + * @param renderTarget Destination renderTarget + */ + _shareDepth(renderTarget) { + super._shareDepth(renderTarget); + const gl = this._context; + const depthbuffer = this._depthStencilBuffer; + const framebuffer = renderTarget._MSAAFramebuffer || renderTarget._framebuffer; + if (renderTarget._depthStencilBuffer && renderTarget._depthStencilBuffer !== depthbuffer) { + gl.deleteRenderbuffer(renderTarget._depthStencilBuffer); + } + renderTarget._depthStencilBuffer = depthbuffer; + const attachment = renderTarget._generateStencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT; + this._engine._bindUnboundFramebuffer(framebuffer); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, depthbuffer); + this._engine._bindUnboundFramebuffer(null); + } + /** + * Binds a texture to this render target on a specific attachment + * @param texture The texture to bind to the framebuffer + * @param attachmentIndex Index of the attachment + * @param faceIndexOrLayer The face or layer of the texture to render to in case of cube texture or array texture + * @param lodLevel defines the lod level to bind to the frame buffer + */ + _bindTextureRenderTarget(texture, attachmentIndex = 0, faceIndexOrLayer, lodLevel = 0) { + var _a, _b; + if (!texture._hardwareTexture) { + return; + } + const framebuffer = this._framebuffer; + const currentFB = this._engine._currentFramebuffer; + this._engine._bindUnboundFramebuffer(framebuffer); + if (this._engine.webGLVersion > 1) { + const gl = this._context; + const attachment = gl["COLOR_ATTACHMENT" + attachmentIndex]; + if (texture.is2DArray || texture.is3D) { + faceIndexOrLayer = faceIndexOrLayer ?? ((_a = this.layerIndices) == null ? void 0 : _a[attachmentIndex]) ?? 0; + gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachment, texture._hardwareTexture.underlyingResource, lodLevel, faceIndexOrLayer); + } else if (texture.isCube) { + faceIndexOrLayer = faceIndexOrLayer ?? ((_b = this.faceIndices) == null ? void 0 : _b[attachmentIndex]) ?? 0; + gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndexOrLayer, texture._hardwareTexture.underlyingResource, lodLevel); + } else { + gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, texture._hardwareTexture.underlyingResource, lodLevel); + } + } else { + const gl = this._context; + const attachment = gl["COLOR_ATTACHMENT" + attachmentIndex + "_WEBGL"]; + const target = faceIndexOrLayer !== void 0 ? gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndexOrLayer : gl.TEXTURE_2D; + gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, target, texture._hardwareTexture.underlyingResource, lodLevel); + } + this._engine._bindUnboundFramebuffer(currentFB); + } + /** + * Set a texture in the textures array + * @param texture the texture to set + * @param index the index in the textures array to set + * @param disposePrevious If this function should dispose the previous texture + */ + setTexture(texture, index = 0, disposePrevious = true) { + super.setTexture(texture, index, disposePrevious); + this._bindTextureRenderTarget(texture, index); + } + /** + * Sets the layer and face indices of every render target texture + * @param layers The layer of the texture to be set (make negative to not modify) + * @param faces The face of the texture to be set (make negative to not modify) + */ + setLayerAndFaceIndices(layers, faces) { + var _a; + super.setLayerAndFaceIndices(layers, faces); + if (!this.textures || !this.layerIndices || !this.faceIndices) { + return; + } + const textureCount = ((_a = this._attachments) == null ? void 0 : _a.length) ?? this.textures.length; + for (let index = 0; index < textureCount; index++) { + const texture = this.textures[index]; + if (!texture) { + continue; + } + if (texture.is2DArray || texture.is3D) { + this._bindTextureRenderTarget(texture, index, this.layerIndices[index]); + } else if (texture.isCube) { + this._bindTextureRenderTarget(texture, index, this.faceIndices[index]); + } else { + this._bindTextureRenderTarget(texture, index); + } + } + } + /** + * Set the face and layer indices of a texture in the textures array + * @param index The index of the texture in the textures array to modify + * @param layer The layer of the texture to be set + * @param face The face of the texture to be set + */ + setLayerAndFaceIndex(index = 0, layer, face) { + super.setLayerAndFaceIndex(index, layer, face); + if (!this.textures || !this.layerIndices || !this.faceIndices) { + return; + } + const texture = this.textures[index]; + if (texture.is2DArray || texture.is3D) { + this._bindTextureRenderTarget(this.textures[index], index, this.layerIndices[index]); + } else if (texture.isCube) { + this._bindTextureRenderTarget(this.textures[index], index, this.faceIndices[index]); + } + } + dispose(disposeOnlyFramebuffers = this._disposeOnlyFramebuffers) { + const gl = this._context; + if (!disposeOnlyFramebuffers) { + if (this._colorTextureArray) { + this._context.deleteTexture(this._colorTextureArray); + this._colorTextureArray = null; + } + if (this._depthStencilTextureArray) { + this._context.deleteTexture(this._depthStencilTextureArray); + this._depthStencilTextureArray = null; + } + } + if (this._framebuffer) { + gl.deleteFramebuffer(this._framebuffer); + this._framebuffer = null; + } + if (this._depthStencilBuffer) { + gl.deleteRenderbuffer(this._depthStencilBuffer); + this._depthStencilBuffer = null; + } + if (this._MSAAFramebuffer) { + gl.deleteFramebuffer(this._MSAAFramebuffer); + this._MSAAFramebuffer = null; + } + super.dispose(disposeOnlyFramebuffers); + } +}; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/lightFragmentDeclaration.js -var name13 = "lightFragmentDeclaration"; -var shader13 = `#ifdef LIGHT{X} -uniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X}; -#ifdef SPECULARTERM -uniform vec4 vLightSpecular{X}; -#else -vec4 vLightSpecular{X}=vec4(0.); -#endif -#ifdef SHADOW{X} -#ifdef SHADOWCSM{X} -uniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];uniform float viewFrustumZ{X}[SHADOWCSMNUM_CASCADES{X}];uniform float frustumLengths{X}[SHADOWCSMNUM_CASCADES{X}];uniform float cascadeBlendFactor{X};varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X}; -#if defined(SHADOWPCSS{X}) -uniform highp sampler2DArrayShadow shadowSampler{X};uniform highp sampler2DArray depthSampler{X};uniform vec2 lightSizeUVCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float depthCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float penumbraDarkness{X}; -#elif defined(SHADOWPCF{X}) -uniform highp sampler2DArrayShadow shadowSampler{X}; -#else -uniform highp sampler2DArray shadowSampler{X}; -#endif -#ifdef SHADOWCSMDEBUG{X} -const vec3 vCascadeColorsMultiplier{X}[8]=vec3[8] -( -vec3 ( 1.5,0.0,0.0 ), -vec3 ( 0.0,1.5,0.0 ), -vec3 ( 0.0,0.0,5.5 ), -vec3 ( 1.5,0.0,5.5 ), -vec3 ( 1.5,1.5,0.0 ), -vec3 ( 1.0,1.0,1.0 ), -vec3 ( 0.0,1.0,5.5 ), -vec3 ( 0.5,3.5,0.75 ) -);vec3 shadowDebug{X}; -#endif -#ifdef SHADOWCSMUSESHADOWMAXZ{X} -int index{X}=-1; -#else -int index{X}=SHADOWCSMNUM_CASCADES{X}-1; -#endif -float diff{X}=0.; -#elif defined(SHADOWCUBE{X}) -uniform samplerCube shadowSampler{X}; -#else -varying vec4 vPositionFromLight{X};varying float vDepthMetric{X}; -#if defined(SHADOWPCSS{X}) -uniform highp sampler2DShadow shadowSampler{X};uniform highp sampler2D depthSampler{X}; -#elif defined(SHADOWPCF{X}) -uniform highp sampler2DShadow shadowSampler{X}; -#else -uniform sampler2D shadowSampler{X}; -#endif -uniform mat4 lightMatrix{X}; -#endif -uniform vec4 shadowsInfo{X};uniform vec2 depthValues{X}; -#endif -#ifdef SPOTLIGHT{X} -uniform vec4 vLightDirection{X};uniform vec4 vLightFalloff{X}; -#elif defined(POINTLIGHT{X}) -uniform vec4 vLightFalloff{X}; -#elif defined(HEMILIGHT{X}) -uniform vec3 vLightGround{X}; -#endif -#ifdef PROJECTEDLIGHTTEXTURE{X} -uniform mat4 textureProjectionMatrix{X};uniform sampler2D projectionLightSampler{X}; -#endif -#endif -`; -ShaderStore.IncludesShadersStore[name13] = shader13; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/lightUboDeclaration.js -var name14 = "lightUboDeclaration"; -var shader14 = `#ifdef LIGHT{X} -uniform Light{X} -{vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular; -#ifdef SPOTLIGHT{X} -vec4 vLightDirection;vec4 vLightFalloff; -#elif defined(POINTLIGHT{X}) -vec4 vLightFalloff; -#elif defined(HEMILIGHT{X}) -vec3 vLightGround; -#endif -vec4 shadowsInfo;vec2 depthValues;} light{X}; -#ifdef PROJECTEDLIGHTTEXTURE{X} -uniform mat4 textureProjectionMatrix{X};uniform sampler2D projectionLightSampler{X}; -#endif -#ifdef SHADOW{X} -#ifdef SHADOWCSM{X} -uniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];uniform float viewFrustumZ{X}[SHADOWCSMNUM_CASCADES{X}];uniform float frustumLengths{X}[SHADOWCSMNUM_CASCADES{X}];uniform float cascadeBlendFactor{X};varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X}; -#if defined(SHADOWPCSS{X}) -uniform highp sampler2DArrayShadow shadowSampler{X};uniform highp sampler2DArray depthSampler{X};uniform vec2 lightSizeUVCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float depthCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float penumbraDarkness{X}; -#elif defined(SHADOWPCF{X}) -uniform highp sampler2DArrayShadow shadowSampler{X}; -#else -uniform highp sampler2DArray shadowSampler{X}; -#endif -#ifdef SHADOWCSMDEBUG{X} -const vec3 vCascadeColorsMultiplier{X}[8]=vec3[8] -( -vec3 ( 1.5,0.0,0.0 ), -vec3 ( 0.0,1.5,0.0 ), -vec3 ( 0.0,0.0,5.5 ), -vec3 ( 1.5,0.0,5.5 ), -vec3 ( 1.5,1.5,0.0 ), -vec3 ( 1.0,1.0,1.0 ), -vec3 ( 0.0,1.0,5.5 ), -vec3 ( 0.5,3.5,0.75 ) -);vec3 shadowDebug{X}; -#endif -#ifdef SHADOWCSMUSESHADOWMAXZ{X} -int index{X}=-1; -#else -int index{X}=SHADOWCSMNUM_CASCADES{X}-1; -#endif -float diff{X}=0.; -#elif defined(SHADOWCUBE{X}) -uniform samplerCube shadowSampler{X}; -#else -varying vec4 vPositionFromLight{X};varying float vDepthMetric{X}; -#if defined(SHADOWPCSS{X}) -uniform highp sampler2DShadow shadowSampler{X};uniform highp sampler2D depthSampler{X}; -#elif defined(SHADOWPCF{X}) -uniform highp sampler2DShadow shadowSampler{X}; -#else -uniform sampler2D shadowSampler{X}; -#endif -uniform mat4 lightMatrix{X}; -#endif -#endif -#endif -`; -ShaderStore.IncludesShadersStore[name14] = shader14; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/lightsFragmentFunctions.js -var name15 = "lightsFragmentFunctions"; -var shader15 = `struct lightingInfo -{vec3 diffuse; -#ifdef SPECULARTERM -vec3 specular; -#endif -#ifdef NDOTL -float ndl; -#endif -};lightingInfo computeLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {lightingInfo result;vec3 lightVectorW;float attenuation=1.0;if (lightData.w==0.) -{vec3 direction=lightData.xyz-vPositionW;attenuation=max(0.,1.0-length(direction)/range);lightVectorW=normalize(direction);} -else -{lightVectorW=normalize(-lightData.xyz);} -float ndl=max(0.,dot(vNormal,lightVectorW)); -#ifdef NDOTL -result.ndl=ndl; -#endif -result.diffuse=ndl*diffuseColor*attenuation; -#ifdef SPECULARTERM -vec3 angleW=normalize(viewDirectionW+lightVectorW);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor*attenuation; -#endif -return result;} -lightingInfo computeSpotLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec4 lightDirection,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {lightingInfo result;vec3 direction=lightData.xyz-vPositionW;vec3 lightVectorW=normalize(direction);float attenuation=max(0.,1.0-length(direction)/range);float cosAngle=max(0.,dot(lightDirection.xyz,-lightVectorW));if (cosAngle>=lightDirection.w) -{cosAngle=max(0.,pow(cosAngle,lightData.w));attenuation*=cosAngle;float ndl=max(0.,dot(vNormal,lightVectorW)); -#ifdef NDOTL -result.ndl=ndl; -#endif -result.diffuse=ndl*diffuseColor*attenuation; -#ifdef SPECULARTERM -vec3 angleW=normalize(viewDirectionW+lightVectorW);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor*attenuation; -#endif -return result;} -result.diffuse=vec3(0.); -#ifdef SPECULARTERM -result.specular=vec3(0.); -#endif -#ifdef NDOTL -result.ndl=0.; -#endif -return result;} -lightingInfo computeHemisphericLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,vec3 groundColor,float glossiness) {lightingInfo result;float ndl=dot(vNormal,lightData.xyz)*0.5+0.5; -#ifdef NDOTL -result.ndl=ndl; -#endif -result.diffuse=mix(groundColor,diffuseColor,ndl); -#ifdef SPECULARTERM -vec3 angleW=normalize(viewDirectionW+lightData.xyz);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor; -#endif -return result;} -#define inline -vec3 computeProjectionTextureDiffuseLighting(sampler2D projectionLightSampler,mat4 textureProjectionMatrix){vec4 strq=textureProjectionMatrix*vec4(vPositionW,1.0);strq/=strq.w;vec3 textureColor=texture2D(projectionLightSampler,strq.xy).rgb;return textureColor;}`; -ShaderStore.IncludesShadersStore[name15] = shader15; +// node_modules/@babylonjs/core/Engines/Extensions/engine.renderTarget.js +ThinEngine.prototype._createHardwareRenderTargetWrapper = function(isMulti, isCube, size) { + const rtWrapper = new WebGLRenderTargetWrapper(isMulti, isCube, size, this, this._gl); + this._renderTargetWrapperCache.push(rtWrapper); + return rtWrapper; +}; +ThinEngine.prototype.createRenderTargetTexture = function(size, options) { + const rtWrapper = this._createHardwareRenderTargetWrapper(false, false, size); + let generateDepthBuffer = true; + let generateStencilBuffer = false; + let noColorAttachment = false; + let colorAttachment = void 0; + let samples = 1; + let label = void 0; + if (options !== void 0 && typeof options === "object") { + generateDepthBuffer = options.generateDepthBuffer ?? true; + generateStencilBuffer = !!options.generateStencilBuffer; + noColorAttachment = !!options.noColorAttachment; + colorAttachment = options.colorAttachment; + samples = options.samples ?? 1; + label = options.label; + } + const texture = colorAttachment || (noColorAttachment ? null : this._createInternalTexture(size, options, true, InternalTextureSource.RenderTarget)); + const width = size.width || size; + const height = size.height || size; + const currentFrameBuffer = this._currentFramebuffer; + const gl = this._gl; + const framebuffer = gl.createFramebuffer(); + this._bindUnboundFramebuffer(framebuffer); + rtWrapper._depthStencilBuffer = this._setupFramebufferDepthAttachments(generateStencilBuffer, generateDepthBuffer, width, height); + if (texture && !texture.is2DArray && !texture.is3D) { + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture._hardwareTexture.underlyingResource, 0); + } + this._bindUnboundFramebuffer(currentFrameBuffer); + rtWrapper.label = label ?? "RenderTargetWrapper"; + rtWrapper._framebuffer = framebuffer; + rtWrapper._generateDepthBuffer = generateDepthBuffer; + rtWrapper._generateStencilBuffer = generateStencilBuffer; + rtWrapper.setTextures(texture); + this.updateRenderTargetTextureSampleCount(rtWrapper, samples); + return rtWrapper; +}; +ThinEngine.prototype.createDepthStencilTexture = function(size, options, rtWrapper) { + if (options.isCube) { + const width = size.width || size; + return this._createDepthStencilCubeTexture(width, options); + } else { + return this._createDepthStencilTexture(size, options, rtWrapper); + } +}; +ThinEngine.prototype._createDepthStencilTexture = function(size, options) { + const gl = this._gl; + const layers = size.layers || 0; + const depth = size.depth || 0; + let target = gl.TEXTURE_2D; + if (layers !== 0) { + target = gl.TEXTURE_2D_ARRAY; + } else if (depth !== 0) { + target = gl.TEXTURE_3D; + } + const internalTexture = new InternalTexture(this, InternalTextureSource.DepthStencil); + internalTexture.label = options.label; + if (!this._caps.depthTextureExtension) { + Logger.Error("Depth texture is not supported by your browser or hardware."); + return internalTexture; + } + const internalOptions = { + bilinearFiltering: false, + comparisonFunction: 0, + generateStencil: false, + ...options + }; + this._bindTextureDirectly(target, internalTexture, true); + this._setupDepthStencilTexture(internalTexture, size, internalOptions.generateStencil, internalOptions.comparisonFunction === 0 ? false : internalOptions.bilinearFiltering, internalOptions.comparisonFunction, internalOptions.samples); + if (internalOptions.depthTextureFormat !== void 0) { + if (internalOptions.depthTextureFormat !== 15 && internalOptions.depthTextureFormat !== 16 && internalOptions.depthTextureFormat !== 17 && internalOptions.depthTextureFormat !== 13 && internalOptions.depthTextureFormat !== 14 && internalOptions.depthTextureFormat !== 18) { + Logger.Error("Depth texture format is not supported."); + return internalTexture; + } + internalTexture.format = internalOptions.depthTextureFormat; + } else { + internalTexture.format = internalOptions.generateStencil ? 13 : 16; + } + const hasStencil = internalTexture.format === 17 || internalTexture.format === 13 || internalTexture.format === 18; + let type = gl.UNSIGNED_INT; + if (internalTexture.format === 15) { + type = gl.UNSIGNED_SHORT; + } else if (internalTexture.format === 17 || internalTexture.format === 13) { + type = gl.UNSIGNED_INT_24_8; + } else if (internalTexture.format === 14) { + type = gl.FLOAT; + } else if (internalTexture.format === 18) { + type = gl.FLOAT_32_UNSIGNED_INT_24_8_REV; + } + const format = hasStencil ? gl.DEPTH_STENCIL : gl.DEPTH_COMPONENT; + let internalFormat = format; + if (this.webGLVersion > 1) { + if (internalTexture.format === 15) { + internalFormat = gl.DEPTH_COMPONENT16; + } else if (internalTexture.format === 16) { + internalFormat = gl.DEPTH_COMPONENT24; + } else if (internalTexture.format === 17 || internalTexture.format === 13) { + internalFormat = gl.DEPTH24_STENCIL8; + } else if (internalTexture.format === 14) { + internalFormat = gl.DEPTH_COMPONENT32F; + } else if (internalTexture.format === 18) { + internalFormat = gl.DEPTH32F_STENCIL8; + } + } + if (internalTexture.is2DArray) { + gl.texImage3D(target, 0, internalFormat, internalTexture.width, internalTexture.height, layers, 0, format, type, null); + } else if (internalTexture.is3D) { + gl.texImage3D(target, 0, internalFormat, internalTexture.width, internalTexture.height, depth, 0, format, type, null); + } else { + gl.texImage2D(target, 0, internalFormat, internalTexture.width, internalTexture.height, 0, format, type, null); + } + this._bindTextureDirectly(target, null); + this._internalTexturesCache.push(internalTexture); + return internalTexture; +}; +ThinEngine.prototype.updateRenderTargetTextureSampleCount = function(rtWrapper, samples) { + if (this.webGLVersion < 2 || !rtWrapper || !rtWrapper.texture) { + return 1; + } + if (rtWrapper.samples === samples) { + return samples; + } + const gl = this._gl; + samples = Math.min(samples, this.getCaps().maxMSAASamples); + if (rtWrapper._depthStencilBuffer) { + gl.deleteRenderbuffer(rtWrapper._depthStencilBuffer); + rtWrapper._depthStencilBuffer = null; + } + if (rtWrapper._MSAAFramebuffer) { + gl.deleteFramebuffer(rtWrapper._MSAAFramebuffer); + rtWrapper._MSAAFramebuffer = null; + } + const hardwareTexture = rtWrapper.texture._hardwareTexture; + hardwareTexture.releaseMSAARenderBuffers(); + if (samples > 1 && typeof gl.renderbufferStorageMultisample === "function") { + const framebuffer = gl.createFramebuffer(); + if (!framebuffer) { + throw new Error("Unable to create multi sampled framebuffer"); + } + rtWrapper._MSAAFramebuffer = framebuffer; + this._bindUnboundFramebuffer(rtWrapper._MSAAFramebuffer); + const colorRenderbuffer = this._createRenderBuffer(rtWrapper.texture.width, rtWrapper.texture.height, samples, -1, this._getRGBABufferInternalSizedFormat(rtWrapper.texture.type, rtWrapper.texture.format, rtWrapper.texture._useSRGBBuffer), gl.COLOR_ATTACHMENT0, false); + if (!colorRenderbuffer) { + throw new Error("Unable to create multi sampled framebuffer"); + } + hardwareTexture.addMSAARenderBuffer(colorRenderbuffer); + } else { + this._bindUnboundFramebuffer(rtWrapper._framebuffer); + } + rtWrapper.texture.samples = samples; + rtWrapper._samples = samples; + rtWrapper._depthStencilBuffer = this._setupFramebufferDepthAttachments(rtWrapper._generateStencilBuffer, rtWrapper._generateDepthBuffer, rtWrapper.texture.width, rtWrapper.texture.height, samples); + this._bindUnboundFramebuffer(null); + return samples; +}; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/shadowsFragmentFunctions.js -var name16 = "shadowsFragmentFunctions"; -var shader16 = `#ifdef SHADOWS -#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE) -#define TEXTUREFUNC(s,c,l) texture2DLodEXT(s,c,l) -#else -#define TEXTUREFUNC(s,c,b) texture2D(s,c,b) -#endif -#ifndef SHADOWFLOAT -float unpack(vec4 color) -{const vec4 bit_shift=vec4(1.0/(255.0*255.0*255.0),1.0/(255.0*255.0),1.0/255.0,1.0);return dot(color,bit_shift);} -#endif -float computeFallOff(float value,vec2 clipSpace,float frustumEdgeFalloff) -{float mask=smoothstep(1.0-frustumEdgeFalloff,1.00000012,clamp(dot(clipSpace,clipSpace),0.,1.));return mix(value,1.0,mask);} -#define inline -float computeShadowCube(vec3 worldPos,vec3 lightPosition,samplerCube shadowSampler,float darkness,vec2 depthValues) -{vec3 directionToLight=worldPos-lightPosition;float depth=length(directionToLight);depth=(depth+depthValues.x)/(depthValues.y);depth=clamp(depth,0.,1.0);directionToLight=normalize(directionToLight);directionToLight.y=-directionToLight.y; -#ifndef SHADOWFLOAT -float shadow=unpack(textureCube(shadowSampler,directionToLight)); -#else -float shadow=textureCube(shadowSampler,directionToLight).x; -#endif -return depth>shadow ? darkness : 1.0;} -#define inline -float computeShadowWithPoissonSamplingCube(vec3 worldPos,vec3 lightPosition,samplerCube shadowSampler,float mapSize,float darkness,vec2 depthValues) -{vec3 directionToLight=worldPos-lightPosition;float depth=length(directionToLight);depth=(depth+depthValues.x)/(depthValues.y);depth=clamp(depth,0.,1.0);directionToLight=normalize(directionToLight);directionToLight.y=-directionToLight.y;float visibility=1.;vec3 poissonDisk[4];poissonDisk[0]=vec3(-1.0,1.0,-1.0);poissonDisk[1]=vec3(1.0,-1.0,-1.0);poissonDisk[2]=vec3(-1.0,-1.0,-1.0);poissonDisk[3]=vec3(1.0,-1.0,1.0); -#ifndef SHADOWFLOAT -if (unpack(textureCube(shadowSampler,directionToLight+poissonDisk[0]*mapSize))shadow ? computeFallOff(darkness,clipSpace.xy,frustumEdgeFalloff) : 1.;} -#endif -#define inline -float computeShadow(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float frustumEdgeFalloff) -{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0) -{return 1.0;} -else -{float shadowPixelDepth=clamp(depthMetric,0.,1.0); -#ifndef SHADOWFLOAT -float shadow=unpack(TEXTUREFUNC(shadowSampler,uv,0.)); -#else -float shadow=TEXTUREFUNC(shadowSampler,uv,0.).x; -#endif -return shadowPixelDepth>shadow ? computeFallOff(darkness,clipSpace.xy,frustumEdgeFalloff) : 1.;}} -#define inline -float computeShadowWithPoissonSampling(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float mapSize,float darkness,float frustumEdgeFalloff) -{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0) -{return 1.0;} -else -{float shadowPixelDepth=clamp(depthMetric,0.,1.0);float visibility=1.;vec2 poissonDisk[4];poissonDisk[0]=vec2(-0.94201624,-0.39906216);poissonDisk[1]=vec2(0.94558609,-0.76890725);poissonDisk[2]=vec2(-0.094184101,-0.92938870);poissonDisk[3]=vec2(0.34495938,0.29387760); -#ifndef SHADOWFLOAT -if (unpack(TEXTUREFUNC(shadowSampler,uv+poissonDisk[0]*mapSize,0.))1.0 || uv.y<0. || uv.y>1.0) -{return 1.0;} -else -{float shadowPixelDepth=clamp(depthMetric,0.,1.0); -#ifndef SHADOWFLOAT -float shadowMapSample=unpack(TEXTUREFUNC(shadowSampler,uv,0.)); -#else -float shadowMapSample=TEXTUREFUNC(shadowSampler,uv,0.).x; -#endif -float esm=1.0-clamp(exp(min(87.,depthScale*shadowPixelDepth))*shadowMapSample,0.,1.-darkness);return computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);}} -#define inline -float computeShadowWithCloseESM(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float depthScale,float frustumEdgeFalloff) -{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0) -{return 1.0;} -else -{float shadowPixelDepth=clamp(depthMetric,0.,1.0); -#ifndef SHADOWFLOAT -float shadowMapSample=unpack(TEXTUREFUNC(shadowSampler,uv,0.)); -#else -float shadowMapSample=TEXTUREFUNC(shadowSampler,uv,0.).x; -#endif -float esm=clamp(exp(min(87.,-depthScale*(shadowPixelDepth-shadowMapSample))),darkness,1.);return computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);}} -#ifdef IS_NDC_HALF_ZRANGE -#define ZINCLIP clipSpace.z -#else -#define ZINCLIP uvDepth.z -#endif -#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE) -#define GREATEST_LESS_THAN_ONE 0.99999994 -/* disable_uniformity_analysis */ -#define inline -float computeShadowWithCSMPCF1(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,float darkness,float frustumEdgeFalloff) -{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec4 uvDepthLayer=vec4(uvDepth.x,uvDepth.y,layer,uvDepth.z);float shadow=texture2D(shadowSampler,uvDepthLayer);shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);} -#define inline -float computeShadowWithCSMPCF3(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff) -{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; -uv+=0.5; -vec2 st=fract(uv); -vec2 base_uv=floor(uv)-0.5; -base_uv*=shadowMapSizeAndInverse.y; -vec2 uvw0=3.-2.*st;vec2 uvw1=1.+2.*st;vec2 u=vec2((2.-st.x)/uvw0.x-1.,st.x/uvw1.x+1.)*shadowMapSizeAndInverse.y;vec2 v=vec2((2.-st.y)/uvw0.y-1.,st.y/uvw1.y+1.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[0]),layer,uvDepth.z));shadow+=uvw1.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[0]),layer,uvDepth.z));shadow+=uvw0.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[1]),layer,uvDepth.z));shadow+=uvw1.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[1]),layer,uvDepth.z));shadow=shadow/16.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);} -#define inline -float computeShadowWithCSMPCF5(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff) -{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; -uv+=0.5; -vec2 st=fract(uv); -vec2 base_uv=floor(uv)-0.5; -base_uv*=shadowMapSizeAndInverse.y; -vec2 uvw0=4.-3.*st;vec2 uvw1=vec2(7.);vec2 uvw2=1.+3.*st;vec3 u=vec3((3.-2.*st.x)/uvw0.x-2.,(3.+st.x)/uvw1.x,st.x/uvw2.x+2.)*shadowMapSizeAndInverse.y;vec3 v=vec3((3.-2.*st.y)/uvw0.y-2.,(3.+st.y)/uvw1.y,st.y/uvw2.y+2.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[0]),layer,uvDepth.z));shadow+=uvw1.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[0]),layer,uvDepth.z));shadow+=uvw2.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[0]),layer,uvDepth.z));shadow+=uvw0.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[1]),layer,uvDepth.z));shadow+=uvw1.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[1]),layer,uvDepth.z));shadow+=uvw2.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[1]),layer,uvDepth.z));shadow+=uvw0.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[2]),layer,uvDepth.z));shadow+=uvw1.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[2]),layer,uvDepth.z));shadow+=uvw2.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[2]),layer,uvDepth.z));shadow=shadow/144.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);} -#define inline -float computeShadowWithPCF1(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,float darkness,float frustumEdgeFalloff) -{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;} -else -{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;float shadow=TEXTUREFUNC(shadowSampler,uvDepth,0.);shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}} -#define inline -float computeShadowWithPCF3(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff) -{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;} -else -{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; -uv+=0.5; -vec2 st=fract(uv); -vec2 base_uv=floor(uv)-0.5; -base_uv*=shadowMapSizeAndInverse.y; -vec2 uvw0=3.-2.*st;vec2 uvw1=1.+2.*st;vec2 u=vec2((2.-st.x)/uvw0.x-1.,st.x/uvw1.x+1.)*shadowMapSizeAndInverse.y;vec2 v=vec2((2.-st.y)/uvw0.y-1.,st.y/uvw1.y+1.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[0]),uvDepth.z),0.);shadow+=uvw1.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[0]),uvDepth.z),0.);shadow+=uvw0.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[1]),uvDepth.z),0.);shadow+=uvw1.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[1]),uvDepth.z),0.);shadow=shadow/16.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}} -#define inline -float computeShadowWithPCF5(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff) -{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;} -else -{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; -uv+=0.5; -vec2 st=fract(uv); -vec2 base_uv=floor(uv)-0.5; -base_uv*=shadowMapSizeAndInverse.y; -vec2 uvw0=4.-3.*st;vec2 uvw1=vec2(7.);vec2 uvw2=1.+3.*st;vec3 u=vec3((3.-2.*st.x)/uvw0.x-2.,(3.+st.x)/uvw1.x,st.x/uvw2.x+2.)*shadowMapSizeAndInverse.y;vec3 v=vec3((3.-2.*st.y)/uvw0.y-2.,(3.+st.y)/uvw1.y,st.y/uvw2.y+2.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[0]),uvDepth.z),0.);shadow+=uvw1.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[0]),uvDepth.z),0.);shadow+=uvw2.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[0]),uvDepth.z),0.);shadow+=uvw0.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[1]),uvDepth.z),0.);shadow+=uvw1.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[1]),uvDepth.z),0.);shadow+=uvw2.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[1]),uvDepth.z),0.);shadow+=uvw0.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[2]),uvDepth.z),0.);shadow+=uvw1.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[2]),uvDepth.z),0.);shadow+=uvw2.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[2]),uvDepth.z),0.);shadow=shadow/144.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}} -const vec3 PoissonSamplers32[64]=vec3[64]( -vec3(0.06407013,0.05409927,0.), -vec3(0.7366577,0.5789394,0.), -vec3(-0.6270542,-0.5320278,0.), -vec3(-0.4096107,0.8411095,0.), -vec3(0.6849564,-0.4990818,0.), -vec3(-0.874181,-0.04579735,0.), -vec3(0.9989998,0.0009880066,0.), -vec3(-0.004920578,-0.9151649,0.), -vec3(0.1805763,0.9747483,0.), -vec3(-0.2138451,0.2635818,0.), -vec3(0.109845,0.3884785,0.), -vec3(0.06876755,-0.3581074,0.), -vec3(0.374073,-0.7661266,0.), -vec3(0.3079132,-0.1216763,0.), -vec3(-0.3794335,-0.8271583,0.), -vec3(-0.203878,-0.07715034,0.), -vec3(0.5912697,0.1469799,0.), -vec3(-0.88069,0.3031784,0.), -vec3(0.5040108,0.8283722,0.), -vec3(-0.5844124,0.5494877,0.), -vec3(0.6017799,-0.1726654,0.), -vec3(-0.5554981,0.1559997,0.), -vec3(-0.3016369,-0.3900928,0.), -vec3(-0.5550632,-0.1723762,0.), -vec3(0.925029,0.2995041,0.), -vec3(-0.2473137,0.5538505,0.), -vec3(0.9183037,-0.2862392,0.), -vec3(0.2469421,0.6718712,0.), -vec3(0.3916397,-0.4328209,0.), -vec3(-0.03576927,-0.6220032,0.), -vec3(-0.04661255,0.7995201,0.), -vec3(0.4402924,0.3640312,0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.), -vec3(0.) -);const vec3 PoissonSamplers64[64]=vec3[64]( -vec3(-0.613392,0.617481,0.), -vec3(0.170019,-0.040254,0.), -vec3(-0.299417,0.791925,0.), -vec3(0.645680,0.493210,0.), -vec3(-0.651784,0.717887,0.), -vec3(0.421003,0.027070,0.), -vec3(-0.817194,-0.271096,0.), -vec3(-0.705374,-0.668203,0.), -vec3(0.977050,-0.108615,0.), -vec3(0.063326,0.142369,0.), -vec3(0.203528,0.214331,0.), -vec3(-0.667531,0.326090,0.), -vec3(-0.098422,-0.295755,0.), -vec3(-0.885922,0.215369,0.), -vec3(0.566637,0.605213,0.), -vec3(0.039766,-0.396100,0.), -vec3(0.751946,0.453352,0.), -vec3(0.078707,-0.715323,0.), -vec3(-0.075838,-0.529344,0.), -vec3(0.724479,-0.580798,0.), -vec3(0.222999,-0.215125,0.), -vec3(-0.467574,-0.405438,0.), -vec3(-0.248268,-0.814753,0.), -vec3(0.354411,-0.887570,0.), -vec3(0.175817,0.382366,0.), -vec3(0.487472,-0.063082,0.), -vec3(-0.084078,0.898312,0.), -vec3(0.488876,-0.783441,0.), -vec3(0.470016,0.217933,0.), -vec3(-0.696890,-0.549791,0.), -vec3(-0.149693,0.605762,0.), -vec3(0.034211,0.979980,0.), -vec3(0.503098,-0.308878,0.), -vec3(-0.016205,-0.872921,0.), -vec3(0.385784,-0.393902,0.), -vec3(-0.146886,-0.859249,0.), -vec3(0.643361,0.164098,0.), -vec3(0.634388,-0.049471,0.), -vec3(-0.688894,0.007843,0.), -vec3(0.464034,-0.188818,0.), -vec3(-0.440840,0.137486,0.), -vec3(0.364483,0.511704,0.), -vec3(0.034028,0.325968,0.), -vec3(0.099094,-0.308023,0.), -vec3(0.693960,-0.366253,0.), -vec3(0.678884,-0.204688,0.), -vec3(0.001801,0.780328,0.), -vec3(0.145177,-0.898984,0.), -vec3(0.062655,-0.611866,0.), -vec3(0.315226,-0.604297,0.), -vec3(-0.780145,0.486251,0.), -vec3(-0.371868,0.882138,0.), -vec3(0.200476,0.494430,0.), -vec3(-0.494552,-0.711051,0.), -vec3(0.612476,0.705252,0.), -vec3(-0.578845,-0.768792,0.), -vec3(-0.772454,-0.090976,0.), -vec3(0.504440,0.372295,0.), -vec3(0.155736,0.065157,0.), -vec3(0.391522,0.849605,0.), -vec3(-0.620106,-0.328104,0.), -vec3(0.789239,-0.419965,0.), -vec3(-0.545396,0.538133,0.), -vec3(-0.178564,-0.596057,0.) -); -#define inline -float computeShadowWithCSMPCSS(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArray depthSampler,highp sampler2DArrayShadow shadowSampler,float shadowMapSizeInverse,float lightSizeUV,float darkness,float frustumEdgeFalloff,int searchTapCount,int pcfTapCount,vec3[64] poissonSamplers,vec2 lightSizeUVCorrection,float depthCorrection,float penumbraDarkness) -{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec4 uvDepthLayer=vec4(uvDepth.x,uvDepth.y,layer,uvDepth.z);float blockerDepth=0.0;float sumBlockerDepth=0.0;float numBlocker=0.0;for (int i=0; i1.0 || depthMetric<0.0) {return 1.0;} -else -{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;float blockerDepth=0.0;float sumBlockerDepth=0.0;float numBlocker=0.0;for (int i=0; i { + texture.setSamples(this._samples); + }); + } + /** + * Returns the fragment url or shader name used in the post process. + * @returns the fragment url or name in the shader store. + */ + getEffectName() { + return this._fragmentUrl; + } + /** + * A function that is added to the onActivateObservable + */ + set onActivate(callback) { + if (this._onActivateObserver) { + this.onActivateObservable.remove(this._onActivateObserver); + } + if (callback) { + this._onActivateObserver = this.onActivateObservable.add(callback); + } + } + /** + * A function that is added to the onSizeChangedObservable + */ + set onSizeChanged(callback) { + if (this._onSizeChangedObserver) { + this.onSizeChangedObservable.remove(this._onSizeChangedObserver); + } + this._onSizeChangedObserver = this.onSizeChangedObservable.add(callback); + } + /** + * A function that is added to the onApplyObservable + */ + set onApply(callback) { + if (this._onApplyObserver) { + this.onApplyObservable.remove(this._onApplyObserver); + } + this._onApplyObserver = this.onApplyObservable.add(callback); + } + /** + * A function that is added to the onBeforeRenderObservable + */ + set onBeforeRender(callback) { + if (this._onBeforeRenderObserver) { + this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver); + } + this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback); + } + /** + * A function that is added to the onAfterRenderObservable + */ + set onAfterRender(callback) { + if (this._onAfterRenderObserver) { + this.onAfterRenderObservable.remove(this._onAfterRenderObserver); + } + this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback); + } + /** + * The input texture for this post process and the output texture of the previous post process. When added to a pipeline the previous post process will + * render it's output into this texture and this texture will be used as textureSampler in the fragment shader of this post process. + */ + get inputTexture() { + return this._textures.data[this._currentRenderTextureInd]; + } + set inputTexture(value) { + this._forcedOutputTexture = value; + } + /** + * Since inputTexture should always be defined, if we previously manually set `inputTexture`, + * the only way to unset it is to use this function to restore its internal state + */ + restoreDefaultInputTexture() { + if (this._forcedOutputTexture) { + this._forcedOutputTexture = null; + this.markTextureDirty(); + } + } + /** + * Gets the camera which post process is applied to. + * @returns The camera the post process is applied to. + */ + getCamera() { + return this._camera; + } + /** + * Gets the texel size of the postprocess. + * See https://en.wikipedia.org/wiki/Texel_(graphics) + */ + get texelSize() { + if (this._shareOutputWithPostProcess) { + return this._shareOutputWithPostProcess.texelSize; + } + if (this._forcedOutputTexture) { + this._texelSize.copyFromFloats(1 / this._forcedOutputTexture.width, 1 / this._forcedOutputTexture.height); + } + return this._texelSize; + } + /** @internal */ + constructor(name69, fragmentUrl, parameters, samplers, _size, camera, samplingMode = 1, engine, reusable, defines = null, textureType = 0, vertexUrl = "postprocess", indexParameters, blockCompilation = false, textureFormat = 5, shaderLanguage = ShaderLanguage.GLSL) { + this._parentContainer = null; + this.width = -1; + this.height = -1; + this.nodeMaterialSource = null; + this._outputTexture = null; + this.autoClear = true; + this.forceAutoClearInAlphaMode = false; + this.alphaMode = 0; + this.animations = []; + this.enablePixelPerfectMode = false; + this.forceFullscreenViewport = true; + this.scaleMode = 1; + this.alwaysForcePOT = false; + this._samples = 1; + this.adaptScaleToCurrentViewport = false; + this._reusable = false; + this._renderId = 0; + this.externalTextureSamplerBinding = false; + this._textures = new SmartArray(2); + this._textureCache = []; + this._currentRenderTextureInd = 0; + this._scaleRatio = new Vector2(1, 1); + this._texelSize = Vector2.Zero(); + this.onActivateObservable = new Observable(); + this.onSizeChangedObservable = new Observable(); + this.onApplyObservable = new Observable(); + this.onBeforeRenderObservable = new Observable(); + this.onAfterRenderObservable = new Observable(); + this.name = name69; + let size = 1; + let uniformBuffers = null; + if (parameters && !Array.isArray(parameters)) { + const options = parameters; + parameters = options.uniforms ?? null; + samplers = options.samplers ?? null; + size = options.size ?? 1; + camera = options.camera ?? null; + samplingMode = options.samplingMode ?? 1; + engine = options.engine; + reusable = options.reusable; + defines = options.defines ?? null; + textureType = options.textureType ?? 0; + vertexUrl = options.vertexUrl ?? "postprocess"; + indexParameters = options.indexParameters; + blockCompilation = options.blockCompilation ?? false; + textureFormat = options.textureFormat ?? 5; + shaderLanguage = options.shaderLanguage ?? ShaderLanguage.GLSL; + uniformBuffers = options.uniformBuffers ?? null; + } else if (_size) { + if (typeof _size === "number") { + size = _size; + } else { + size = { width: _size.width, height: _size.height }; + } + } + if (camera != null) { + this._camera = camera; + this._scene = camera.getScene(); + camera.attachPostProcess(this); + this._engine = this._scene.getEngine(); + this._scene.postProcesses.push(this); + this.uniqueId = this._scene.getUniqueId(); + } else if (engine) { + this._engine = engine; + this._engine.postProcesses.push(this); + } + this._options = size; + this.renderTargetSamplingMode = samplingMode ? samplingMode : 1; + this._reusable = reusable || false; + this._textureType = textureType; + this._textureFormat = textureFormat; + this._shaderLanguage = shaderLanguage; + this._samplers = samplers || []; + this._samplers.push("textureSampler"); + this._fragmentUrl = fragmentUrl; + this._vertexUrl = vertexUrl; + this._parameters = parameters || []; + this._parameters.push("scale"); + this._uniformBuffers = uniformBuffers || []; + this._indexParameters = indexParameters; + this._drawWrapper = new DrawWrapper(this._engine); + if (!blockCompilation) { + this.updateEffect(defines); + } + } + /** + * Gets a string identifying the name of the class + * @returns "PostProcess" string + */ + getClassName() { + return "PostProcess"; + } + /** + * Gets the engine which this post process belongs to. + * @returns The engine the post process was enabled with. + */ + getEngine() { + return this._engine; + } + /** + * The effect that is created when initializing the post process. + * @returns The created effect corresponding the postprocess. + */ + getEffect() { + return this._drawWrapper.effect; + } + /** + * To avoid multiple redundant textures for multiple post process, the output the output texture for this post process can be shared with another. + * @param postProcess The post process to share the output with. + * @returns This post process. + */ + shareOutputWith(postProcess) { + this._disposeTextures(); + this._shareOutputWithPostProcess = postProcess; + return this; + } + /** + * Reverses the effect of calling shareOutputWith and returns the post process back to its original state. + * This should be called if the post process that shares output with this post process is disabled/disposed. + */ + useOwnOutput() { + if (this._textures.length == 0) { + this._textures = new SmartArray(2); + } + this._shareOutputWithPostProcess = null; + } + /** + * Updates the effect with the current post process compile time values and recompiles the shader. + * @param defines Define statements that should be added at the beginning of the shader. (default: null) + * @param uniforms Set of uniform variables that will be passed to the shader. (default: null) + * @param samplers Set of Texture2D variables that will be passed to the shader. (default: null) + * @param indexParameters The index parameters to be used for babylons include syntax "#include[0..varyingCount]". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx + * @param onCompiled Called when the shader has been compiled. + * @param onError Called if there is an error when compiling a shader. + * @param vertexUrl The url of the vertex shader to be used (default: the one given at construction time) + * @param fragmentUrl The url of the fragment shader to be used (default: the one given at construction time) + */ + updateEffect(defines = null, uniforms = null, samplers = null, indexParameters, onCompiled, onError, vertexUrl, fragmentUrl) { + const customShaderCodeProcessing = _PostProcess._GetShaderCodeProcessing(this.name); + if (customShaderCodeProcessing == null ? void 0 : customShaderCodeProcessing.defineCustomBindings) { + const newUniforms = (uniforms == null ? void 0 : uniforms.slice()) ?? []; + newUniforms.push(...this._parameters); + const newSamplers = (samplers == null ? void 0 : samplers.slice()) ?? []; + newSamplers.push(...this._samplers); + defines = customShaderCodeProcessing.defineCustomBindings(this.name, defines, newUniforms, newSamplers); + uniforms = newUniforms; + samplers = newSamplers; + } + this._postProcessDefines = defines; + this._drawWrapper.effect = this._engine.createEffect({ vertex: vertexUrl ?? this._vertexUrl, fragment: fragmentUrl ?? this._fragmentUrl }, { + attributes: ["position"], + uniformsNames: uniforms || this._parameters, + uniformBuffersNames: this._uniformBuffers, + samplers: samplers || this._samplers, + defines: defines !== null ? defines : "", + fallbacks: null, + onCompiled: onCompiled ?? null, + onError: onError ?? null, + indexParameters: indexParameters || this._indexParameters, + processCodeAfterIncludes: (customShaderCodeProcessing == null ? void 0 : customShaderCodeProcessing.processCodeAfterIncludes) ? (shaderType, code) => customShaderCodeProcessing.processCodeAfterIncludes(this.name, shaderType, code) : null, + processFinalCode: (customShaderCodeProcessing == null ? void 0 : customShaderCodeProcessing.processFinalCode) ? (shaderType, code) => customShaderCodeProcessing.processFinalCode(this.name, shaderType, code) : null, + shaderLanguage: this._shaderLanguage + }, this._engine); + } + /** + * The post process is reusable if it can be used multiple times within one frame. + * @returns If the post process is reusable + */ + isReusable() { + return this._reusable; + } + /** invalidate frameBuffer to hint the postprocess to create a depth buffer */ + markTextureDirty() { + this.width = -1; + } + _createRenderTargetTexture(textureSize, textureOptions, channel = 0) { + for (let i = 0; i < this._textureCache.length; i++) { + if (this._textureCache[i].texture.width === textureSize.width && this._textureCache[i].texture.height === textureSize.height && this._textureCache[i].postProcessChannel === channel && this._textureCache[i].texture._generateDepthBuffer === textureOptions.generateDepthBuffer && this._textureCache[i].texture.samples === textureOptions.samples) { + return this._textureCache[i].texture; + } + } + const tex = this._engine.createRenderTargetTexture(textureSize, textureOptions); + this._textureCache.push({ texture: tex, postProcessChannel: channel, lastUsedRenderId: -1 }); + return tex; + } + _flushTextureCache() { + const currentRenderId = this._renderId; + for (let i = this._textureCache.length - 1; i >= 0; i--) { + if (currentRenderId - this._textureCache[i].lastUsedRenderId > 100) { + let currentlyUsed = false; + for (let j = 0; j < this._textures.length; j++) { + if (this._textures.data[j] === this._textureCache[i].texture) { + currentlyUsed = true; + break; + } + } + if (!currentlyUsed) { + this._textureCache[i].texture.dispose(); + this._textureCache.splice(i, 1); + } + } + } + } + /** + * Resizes the post-process texture + * @param width Width of the texture + * @param height Height of the texture + * @param camera The camera this post-process is applied to. Pass null if the post-process is used outside the context of a camera post-process chain (default: null) + * @param needMipMaps True if mip maps need to be generated after render (default: false) + * @param forceDepthStencil True to force post-process texture creation with stencil depth and buffer (default: false) + */ + resize(width, height, camera = null, needMipMaps = false, forceDepthStencil = false) { + if (this._textures.length > 0) { + this._textures.reset(); + } + this.width = width; + this.height = height; + let firstPP = null; + if (camera) { + for (let i = 0; i < camera._postProcesses.length; i++) { + if (camera._postProcesses[i] !== null) { + firstPP = camera._postProcesses[i]; + break; + } + } + } + const textureSize = { width: this.width, height: this.height }; + const textureOptions = { + generateMipMaps: needMipMaps, + generateDepthBuffer: forceDepthStencil || firstPP === this, + generateStencilBuffer: (forceDepthStencil || firstPP === this) && this._engine.isStencilEnable, + samplingMode: this.renderTargetSamplingMode, + type: this._textureType, + format: this._textureFormat, + samples: this._samples, + label: "PostProcessRTT-" + this.name + }; + this._textures.push(this._createRenderTargetTexture(textureSize, textureOptions, 0)); + if (this._reusable) { + this._textures.push(this._createRenderTargetTexture(textureSize, textureOptions, 1)); + } + this._texelSize.copyFromFloats(1 / this.width, 1 / this.height); + this.onSizeChangedObservable.notifyObservers(this); + } + _getTarget() { + let target; + if (this._shareOutputWithPostProcess) { + target = this._shareOutputWithPostProcess.inputTexture; + } else if (this._forcedOutputTexture) { + target = this._forcedOutputTexture; + this.width = this._forcedOutputTexture.width; + this.height = this._forcedOutputTexture.height; + } else { + target = this.inputTexture; + let cache; + for (let i = 0; i < this._textureCache.length; i++) { + if (this._textureCache[i].texture === target) { + cache = this._textureCache[i]; + break; + } + } + if (cache) { + cache.lastUsedRenderId = this._renderId; + } + } + return target; + } + /** + * Activates the post process by intializing the textures to be used when executed. Notifies onActivateObservable. + * When this post process is used in a pipeline, this is call will bind the input texture of this post process to the output of the previous. + * @param camera The camera that will be used in the post process. This camera will be used when calling onActivateObservable. + * @param sourceTexture The source texture to be inspected to get the width and height if not specified in the post process constructor. (default: null) + * @param forceDepthStencil If true, a depth and stencil buffer will be generated. (default: false) + * @returns The render target wrapper that was bound to be written to. + */ + activate(camera, sourceTexture = null, forceDepthStencil) { + var _a, _b; + camera = camera || this._camera; + const scene = camera.getScene(); + const engine = scene.getEngine(); + const maxSize = engine.getCaps().maxTextureSize; + const requiredWidth = (sourceTexture ? sourceTexture.width : this._engine.getRenderWidth(true)) * this._options | 0; + const requiredHeight = (sourceTexture ? sourceTexture.height : this._engine.getRenderHeight(true)) * this._options | 0; + let desiredWidth = this._options.width || requiredWidth; + let desiredHeight = this._options.height || requiredHeight; + const needMipMaps = this.renderTargetSamplingMode !== 7 && this.renderTargetSamplingMode !== 1 && this.renderTargetSamplingMode !== 2; + let target = null; + if (!this._shareOutputWithPostProcess && !this._forcedOutputTexture) { + if (this.adaptScaleToCurrentViewport) { + const currentViewport = engine.currentViewport; + if (currentViewport) { + desiredWidth *= currentViewport.width; + desiredHeight *= currentViewport.height; + } + } + if (needMipMaps || this.alwaysForcePOT) { + if (!this._options.width) { + desiredWidth = engine.needPOTTextures ? Engine.GetExponentOfTwo(desiredWidth, maxSize, this.scaleMode) : desiredWidth; + } + if (!this._options.height) { + desiredHeight = engine.needPOTTextures ? Engine.GetExponentOfTwo(desiredHeight, maxSize, this.scaleMode) : desiredHeight; + } + } + if (this.width !== desiredWidth || this.height !== desiredHeight || !(target = this._getTarget())) { + this.resize(desiredWidth, desiredHeight, camera, needMipMaps, forceDepthStencil); + } + this._textures.forEach((texture) => { + if (texture.samples !== this.samples) { + this._engine.updateRenderTargetTextureSampleCount(texture, this.samples); + } + }); + this._flushTextureCache(); + this._renderId++; + } + if (!target) { + target = this._getTarget(); + } + if (this.enablePixelPerfectMode) { + this._scaleRatio.copyFromFloats(requiredWidth / desiredWidth, requiredHeight / desiredHeight); + this._engine.bindFramebuffer(target, 0, requiredWidth, requiredHeight, this.forceFullscreenViewport); + } else { + this._scaleRatio.copyFromFloats(1, 1); + this._engine.bindFramebuffer(target, 0, void 0, void 0, this.forceFullscreenViewport); + } + (_b = (_a = this._engine)._debugInsertMarker) == null ? void 0 : _b.call(_a, `post process ${this.name} input`); + this.onActivateObservable.notifyObservers(camera); + if (this.autoClear && (this.alphaMode === 0 || this.forceAutoClearInAlphaMode)) { + this._engine.clear(this.clearColor ? this.clearColor : scene.clearColor, scene._allowPostProcessClearColor, true, true); + } + if (this._reusable) { + this._currentRenderTextureInd = (this._currentRenderTextureInd + 1) % 2; + } + return target; + } + /** + * If the post process is supported. + */ + get isSupported() { + return this._drawWrapper.effect.isSupported; + } + /** + * The aspect ratio of the output texture. + */ + get aspectRatio() { + if (this._shareOutputWithPostProcess) { + return this._shareOutputWithPostProcess.aspectRatio; + } + if (this._forcedOutputTexture) { + return this._forcedOutputTexture.width / this._forcedOutputTexture.height; + } + return this.width / this.height; + } + /** + * Get a value indicating if the post-process is ready to be used + * @returns true if the post-process is ready (shader is compiled) + */ + isReady() { + var _a; + return ((_a = this._drawWrapper.effect) == null ? void 0 : _a.isReady()) ?? false; + } + /** + * Binds all textures and uniforms to the shader, this will be run on every pass. + * @returns the effect corresponding to this post process. Null if not compiled or not ready. + */ + apply() { + var _a, _b, _c; + if (!((_a = this._drawWrapper.effect) == null ? void 0 : _a.isReady())) { + return null; + } + this._engine.enableEffect(this._drawWrapper); + this._engine.setState(false); + this._engine.setDepthBuffer(false); + this._engine.setDepthWrite(false); + this._engine.setAlphaMode(this.alphaMode); + if (this.alphaConstants) { + this.getEngine().setAlphaConstants(this.alphaConstants.r, this.alphaConstants.g, this.alphaConstants.b, this.alphaConstants.a); + } + let source; + if (this._shareOutputWithPostProcess) { + source = this._shareOutputWithPostProcess.inputTexture; + } else if (this._forcedOutputTexture) { + source = this._forcedOutputTexture; + } else { + source = this.inputTexture; + } + if (!this.externalTextureSamplerBinding) { + this._drawWrapper.effect._bindTexture("textureSampler", source == null ? void 0 : source.texture); + } + this._drawWrapper.effect.setVector2("scale", this._scaleRatio); + this.onApplyObservable.notifyObservers(this._drawWrapper.effect); + (_c = (_b = _PostProcess._GetShaderCodeProcessing(this.name)) == null ? void 0 : _b.bindCustomBindings) == null ? void 0 : _c.call(_b, this.name, this._drawWrapper.effect); + return this._drawWrapper.effect; + } + _disposeTextures() { + if (this._shareOutputWithPostProcess || this._forcedOutputTexture) { + this._disposeTextureCache(); + return; + } + this._disposeTextureCache(); + this._textures.dispose(); + } + _disposeTextureCache() { + for (let i = this._textureCache.length - 1; i >= 0; i--) { + this._textureCache[i].texture.dispose(); + } + this._textureCache.length = 0; + } + /** + * Sets the required values to the prepass renderer. + * @param prePassRenderer defines the prepass renderer to setup. + * @returns true if the pre pass is needed. + */ + setPrePassRenderer(prePassRenderer) { + if (this._prePassEffectConfiguration) { + this._prePassEffectConfiguration = prePassRenderer.addEffectConfiguration(this._prePassEffectConfiguration); + this._prePassEffectConfiguration.enabled = true; + return true; + } + return false; + } + /** + * Disposes the post process. + * @param camera The camera to dispose the post process on. + */ + dispose(camera) { + camera = camera || this._camera; + this._disposeTextures(); + let index; + if (this._scene) { + index = this._scene.postProcesses.indexOf(this); + if (index !== -1) { + this._scene.postProcesses.splice(index, 1); + } + } + if (this._parentContainer) { + const index2 = this._parentContainer.postProcesses.indexOf(this); + if (index2 > -1) { + this._parentContainer.postProcesses.splice(index2, 1); + } + this._parentContainer = null; + } + index = this._engine.postProcesses.indexOf(this); + if (index !== -1) { + this._engine.postProcesses.splice(index, 1); + } + if (!camera) { + return; + } + camera.detachPostProcess(this); + index = camera._postProcesses.indexOf(this); + if (index === 0 && camera._postProcesses.length > 0) { + const firstPostProcess = this._camera._getFirstPostProcess(); + if (firstPostProcess) { + firstPostProcess.markTextureDirty(); + } + } + this.onActivateObservable.clear(); + this.onAfterRenderObservable.clear(); + this.onApplyObservable.clear(); + this.onBeforeRenderObservable.clear(); + this.onSizeChangedObservable.clear(); + } + /** + * Serializes the post process to a JSON object + * @returns the JSON object + */ + serialize() { + const serializationObject = SerializationHelper.Serialize(this); + const camera = this.getCamera() || this._scene && this._scene.activeCamera; + serializationObject.customType = "BABYLON." + this.getClassName(); + serializationObject.cameraId = camera ? camera.id : null; + serializationObject.reusable = this._reusable; + serializationObject.textureType = this._textureType; + serializationObject.fragmentUrl = this._fragmentUrl; + serializationObject.parameters = this._parameters; + serializationObject.samplers = this._samplers; + serializationObject.options = this._options; + serializationObject.defines = this._postProcessDefines; + serializationObject.textureFormat = this._textureFormat; + serializationObject.vertexUrl = this._vertexUrl; + serializationObject.indexParameters = this._indexParameters; + return serializationObject; + } + /** + * Clones this post process + * @returns a new post process similar to this one + */ + clone() { + const serializationObject = this.serialize(); + serializationObject._engine = this._engine; + serializationObject.cameraId = null; + const result = _PostProcess.Parse(serializationObject, this._scene, ""); + if (!result) { + return null; + } + result.onActivateObservable = this.onActivateObservable.clone(); + result.onSizeChangedObservable = this.onSizeChangedObservable.clone(); + result.onApplyObservable = this.onApplyObservable.clone(); + result.onBeforeRenderObservable = this.onBeforeRenderObservable.clone(); + result.onAfterRenderObservable = this.onAfterRenderObservable.clone(); + result._prePassEffectConfiguration = this._prePassEffectConfiguration; + return result; + } + /** + * Creates a material from parsed material data + * @param parsedPostProcess defines parsed post process data + * @param scene defines the hosting scene + * @param rootUrl defines the root URL to use to load textures + * @returns a new post process + */ + static Parse(parsedPostProcess, scene, rootUrl) { + const postProcessType = GetClass(parsedPostProcess.customType); + if (!postProcessType || !postProcessType._Parse) { + return null; + } + const camera = scene ? scene.getCameraById(parsedPostProcess.cameraId) : null; + return postProcessType._Parse(parsedPostProcess, camera, scene, rootUrl); + } + /** + * @internal + */ + static _Parse(parsedPostProcess, targetCamera, scene, rootUrl) { + return SerializationHelper.Parse(() => { + return new _PostProcess(parsedPostProcess.name, parsedPostProcess.fragmentUrl, parsedPostProcess.parameters, parsedPostProcess.samplers, parsedPostProcess.options, targetCamera, parsedPostProcess.renderTargetSamplingMode, parsedPostProcess._engine, parsedPostProcess.reusable, parsedPostProcess.defines, parsedPostProcess.textureType, parsedPostProcess.vertexUrl, parsedPostProcess.indexParameters, false, parsedPostProcess.textureFormat); + }, parsedPostProcess, scene, rootUrl); + } +}; +PostProcess._CustomShaderCodeProcessing = {}; +__decorate([ + serialize() +], PostProcess.prototype, "uniqueId", void 0); +__decorate([ + serialize() +], PostProcess.prototype, "name", void 0); +__decorate([ + serialize() +], PostProcess.prototype, "width", void 0); +__decorate([ + serialize() +], PostProcess.prototype, "height", void 0); +__decorate([ + serialize() +], PostProcess.prototype, "renderTargetSamplingMode", void 0); +__decorate([ + serializeAsColor4() +], PostProcess.prototype, "clearColor", void 0); +__decorate([ + serialize() +], PostProcess.prototype, "autoClear", void 0); +__decorate([ + serialize() +], PostProcess.prototype, "forceAutoClearInAlphaMode", void 0); +__decorate([ + serialize() +], PostProcess.prototype, "alphaMode", void 0); +__decorate([ + serialize() +], PostProcess.prototype, "alphaConstants", void 0); +__decorate([ + serialize() +], PostProcess.prototype, "enablePixelPerfectMode", void 0); +__decorate([ + serialize() +], PostProcess.prototype, "forceFullscreenViewport", void 0); +__decorate([ + serialize() +], PostProcess.prototype, "scaleMode", void 0); +__decorate([ + serialize() +], PostProcess.prototype, "alwaysForcePOT", void 0); +__decorate([ + serialize("samples") +], PostProcess.prototype, "_samples", void 0); +__decorate([ + serialize() +], PostProcess.prototype, "adaptScaleToCurrentViewport", void 0); +RegisterClass("BABYLON.PostProcess", PostProcess); + +// node_modules/@babylonjs/core/Materials/Node/Blocks/vectorMergerBlock.js +var VectorMergerBlock = class extends NodeMaterialBlock { + /** + * Create a new VectorMergerBlock + * @param name defines the block name + */ + constructor(name69) { + super(name69, NodeMaterialBlockTargets.Neutral); + this.xSwizzle = "x"; + this.ySwizzle = "y"; + this.zSwizzle = "z"; + this.wSwizzle = "w"; + this.registerInput("xyzw ", NodeMaterialBlockConnectionPointTypes.Vector4, true); + this.registerInput("xyz ", NodeMaterialBlockConnectionPointTypes.Vector3, true); + this.registerInput("xy ", NodeMaterialBlockConnectionPointTypes.Vector2, true); + this.registerInput("zw ", NodeMaterialBlockConnectionPointTypes.Vector2, true); + this.registerInput("x", NodeMaterialBlockConnectionPointTypes.Float, true); + this.registerInput("y", NodeMaterialBlockConnectionPointTypes.Float, true); + this.registerInput("z", NodeMaterialBlockConnectionPointTypes.Float, true); + this.registerInput("w", NodeMaterialBlockConnectionPointTypes.Float, true); + this.registerOutput("xyzw", NodeMaterialBlockConnectionPointTypes.Vector4); + this.registerOutput("xyz", NodeMaterialBlockConnectionPointTypes.Vector3); + this.registerOutput("xy", NodeMaterialBlockConnectionPointTypes.Vector2); + this.registerOutput("zw", NodeMaterialBlockConnectionPointTypes.Vector2); + } + /** + * Gets the current class name + * @returns the class name + */ + getClassName() { + return "VectorMergerBlock"; + } + /** + * Gets the xyzw component (input) + */ + get xyzwIn() { + return this._inputs[0]; + } + /** + * Gets the xyz component (input) + */ + get xyzIn() { + return this._inputs[1]; + } + /** + * Gets the xy component (input) + */ + get xyIn() { + return this._inputs[2]; + } + /** + * Gets the zw component (input) + */ + get zwIn() { + return this._inputs[3]; + } + /** + * Gets the x component (input) + */ + get x() { + return this._inputs[4]; + } + /** + * Gets the y component (input) + */ + get y() { + return this._inputs[5]; + } + /** + * Gets the z component (input) + */ + get z() { + return this._inputs[6]; + } + /** + * Gets the w component (input) + */ + get w() { + return this._inputs[7]; + } + /** + * Gets the xyzw component (output) + */ + get xyzw() { + return this._outputs[0]; + } + /** + * Gets the xyz component (output) + */ + get xyzOut() { + return this._outputs[1]; + } + /** + * Gets the xy component (output) + */ + get xyOut() { + return this._outputs[2]; + } + /** + * Gets the zw component (output) + */ + get zwOut() { + return this._outputs[3]; + } + /** + * Gets the xy component (output) + * @deprecated Please use xyOut instead. + */ + get xy() { + return this.xyOut; + } + /** + * Gets the xyz component (output) + * @deprecated Please use xyzOut instead. + */ + get xyz() { + return this.xyzOut; + } + _inputRename(name69) { + if (name69 === "xyzw ") { + return "xyzwIn"; + } + if (name69 === "xyz ") { + return "xyzIn"; + } + if (name69 === "xy ") { + return "xyIn"; + } + if (name69 === "zw ") { + return "zwIn"; + } + return name69; + } + _buildSwizzle(len) { + const swizzle = this.xSwizzle + this.ySwizzle + this.zSwizzle + this.wSwizzle; + return "." + swizzle.substr(0, len); + } + _buildBlock(state) { + super._buildBlock(state); + const xInput = this.x; + const yInput = this.y; + const zInput = this.z; + const wInput = this.w; + const xyInput = this.xyIn; + const zwInput = this.zwIn; + const xyzInput = this.xyzIn; + const xyzwInput = this.xyzwIn; + const v4Output = this._outputs[0]; + const v3Output = this._outputs[1]; + const v2Output = this._outputs[2]; + const v2CompOutput = this._outputs[3]; + if (xyzwInput.isConnected) { + if (v4Output.hasEndpoints) { + state.compilationString += this._declareOutput(v4Output, state) + ` = ${xyzwInput.associatedVariableName}${this._buildSwizzle(4)}; +`; + } + if (v3Output.hasEndpoints) { + state.compilationString += this._declareOutput(v3Output, state) + ` = ${xyzwInput.associatedVariableName}${this._buildSwizzle(3)}; +`; + } + if (v2Output.hasEndpoints) { + state.compilationString += this._declareOutput(v2Output, state) + ` = ${xyzwInput.associatedVariableName}${this._buildSwizzle(2)}; +`; + } + } else if (xyzInput.isConnected) { + if (v4Output.hasEndpoints) { + state.compilationString += this._declareOutput(v4Output, state) + ` = vec4(${xyzInput.associatedVariableName}, ${wInput.isConnected ? this._writeVariable(wInput) : "0.0"})${this._buildSwizzle(4)}; +`; + } + if (v3Output.hasEndpoints) { + state.compilationString += this._declareOutput(v3Output, state) + ` = ${xyzInput.associatedVariableName}${this._buildSwizzle(3)}; +`; + } + if (v2Output.hasEndpoints) { + state.compilationString += this._declareOutput(v2Output, state) + ` = ${xyzInput.associatedVariableName}${this._buildSwizzle(2)}; +`; + } + } else if (xyInput.isConnected) { + if (v4Output.hasEndpoints) { + if (zwInput.isConnected) { + state.compilationString += this._declareOutput(v4Output, state) + ` = vec4(${xyInput.associatedVariableName}, ${zwInput.associatedVariableName})${this._buildSwizzle(4)}; +`; + } else { + state.compilationString += this._declareOutput(v4Output, state) + ` = vec4(${xyInput.associatedVariableName}, ${zInput.isConnected ? this._writeVariable(zInput) : "0.0"}, ${wInput.isConnected ? this._writeVariable(wInput) : "0.0"})${this._buildSwizzle(4)}; +`; + } + } + if (v3Output.hasEndpoints) { + state.compilationString += this._declareOutput(v3Output, state) + ` = vec3(${xyInput.associatedVariableName}, ${zInput.isConnected ? this._writeVariable(zInput) : "0.0"})${this._buildSwizzle(3)}; +`; + } + if (v2Output.hasEndpoints) { + state.compilationString += this._declareOutput(v2Output, state) + ` = ${xyInput.associatedVariableName}${this._buildSwizzle(2)}; +`; + } + if (v2CompOutput.hasEndpoints) { + if (zwInput.isConnected) { + state.compilationString += this._declareOutput(v2CompOutput, state) + ` = ${zwInput.associatedVariableName}${this._buildSwizzle(2)}; +`; + } else { + state.compilationString += this._declareOutput(v2CompOutput, state) + ` = vec2(${zInput.isConnected ? this._writeVariable(zInput) : "0.0"}, ${wInput.isConnected ? this._writeVariable(wInput) : "0.0"})${this._buildSwizzle(2)}; +`; + } + } + } else { + if (v4Output.hasEndpoints) { + if (zwInput.isConnected) { + state.compilationString += this._declareOutput(v4Output, state) + ` = vec4(${xInput.isConnected ? this._writeVariable(xInput) : "0.0"}, ${yInput.isConnected ? this._writeVariable(yInput) : "0.0"}, ${zwInput.associatedVariableName})${this._buildSwizzle(4)}; +`; + } else { + state.compilationString += this._declareOutput(v4Output, state) + ` = vec4(${xInput.isConnected ? this._writeVariable(xInput) : "0.0"}, ${yInput.isConnected ? this._writeVariable(yInput) : "0.0"}, ${zInput.isConnected ? this._writeVariable(zInput) : "0.0"}, ${wInput.isConnected ? this._writeVariable(wInput) : "0.0"})${this._buildSwizzle(4)}; +`; + } + } + if (v3Output.hasEndpoints) { + state.compilationString += this._declareOutput(v3Output, state) + ` = vec3(${xInput.isConnected ? this._writeVariable(xInput) : "0.0"}, ${yInput.isConnected ? this._writeVariable(yInput) : "0.0"}, ${zInput.isConnected ? this._writeVariable(zInput) : "0.0"})${this._buildSwizzle(3)}; +`; + } + if (v2Output.hasEndpoints) { + state.compilationString += this._declareOutput(v2Output, state) + ` = vec2(${xInput.isConnected ? this._writeVariable(xInput) : "0.0"}, ${yInput.isConnected ? this._writeVariable(yInput) : "0.0"})${this._buildSwizzle(2)}; +`; + } + if (v2CompOutput.hasEndpoints) { + if (zwInput.isConnected) { + state.compilationString += this._declareOutput(v2CompOutput, state) + ` = ${zwInput.associatedVariableName}${this._buildSwizzle(2)}; `; -ShaderStore.IncludesShadersStore[name16] = shader16; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/samplerFragmentDeclaration.js -var name17 = "samplerFragmentDeclaration"; -var shader17 = `#ifdef _DEFINENAME_ -#if _DEFINENAME_DIRECTUV==1 -#define v_VARYINGNAME_UV vMainUV1 -#elif _DEFINENAME_DIRECTUV==2 -#define v_VARYINGNAME_UV vMainUV2 -#elif _DEFINENAME_DIRECTUV==3 -#define v_VARYINGNAME_UV vMainUV3 -#elif _DEFINENAME_DIRECTUV==4 -#define v_VARYINGNAME_UV vMainUV4 -#elif _DEFINENAME_DIRECTUV==5 -#define v_VARYINGNAME_UV vMainUV5 -#elif _DEFINENAME_DIRECTUV==6 -#define v_VARYINGNAME_UV vMainUV6 -#else -varying vec2 v_VARYINGNAME_UV; -#endif -uniform sampler2D _SAMPLERNAME_Sampler; -#endif + } else { + state.compilationString += this._declareOutput(v2CompOutput, state) + ` = vec2(${zInput.isConnected ? this._writeVariable(zInput) : "0.0"}, ${wInput.isConnected ? this._writeVariable(wInput) : "0.0"})${this._buildSwizzle(2)}; `; -ShaderStore.IncludesShadersStore[name17] = shader17; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/fresnelFunction.js -var name18 = "fresnelFunction"; -var shader18 = `#ifdef FRESNEL -float computeFresnelTerm(vec3 viewDirection,vec3 worldNormal,float bias,float power) -{float fresnelTerm=pow(bias+abs(dot(viewDirection,worldNormal)),power);return clamp(fresnelTerm,0.,1.);} -#endif + } + } + } + return this; + } + serialize() { + const serializationObject = super.serialize(); + serializationObject.xSwizzle = this.xSwizzle; + serializationObject.ySwizzle = this.ySwizzle; + serializationObject.zSwizzle = this.zSwizzle; + serializationObject.wSwizzle = this.wSwizzle; + return serializationObject; + } + _deserialize(serializationObject, scene, rootUrl) { + super._deserialize(serializationObject, scene, rootUrl); + this.xSwizzle = serializationObject.xSwizzle ?? "x"; + this.ySwizzle = serializationObject.ySwizzle ?? "y"; + this.zSwizzle = serializationObject.zSwizzle ?? "z"; + this.wSwizzle = serializationObject.wSwizzle ?? "w"; + } + _dumpPropertiesCode() { + let codeString = super._dumpPropertiesCode(); + codeString += `${this._codeVariableName}.xSwizzle = "${this.xSwizzle}"; `; -ShaderStore.IncludesShadersStore[name18] = shader18; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/reflectionFunction.js -var name19 = "reflectionFunction"; -var shader19 = `vec3 computeFixedEquirectangularCoords(vec4 worldPos,vec3 worldNormal,vec3 direction) -{float lon=atan(direction.z,direction.x);float lat=acos(direction.y);vec2 sphereCoords=vec2(lon,lat)*RECIPROCAL_PI2*2.0;float s=sphereCoords.x*0.5+0.5;float t=sphereCoords.y;return vec3(s,t,0); } -vec3 computeMirroredFixedEquirectangularCoords(vec4 worldPos,vec3 worldNormal,vec3 direction) -{float lon=atan(direction.z,direction.x);float lat=acos(direction.y);vec2 sphereCoords=vec2(lon,lat)*RECIPROCAL_PI2*2.0;float s=sphereCoords.x*0.5+0.5;float t=sphereCoords.y;return vec3(1.0-s,t,0); } -vec3 computeEquirectangularCoords(vec4 worldPos,vec3 worldNormal,vec3 eyePosition,mat4 reflectionMatrix) -{vec3 cameraToVertex=normalize(worldPos.xyz-eyePosition);vec3 r=normalize(reflect(cameraToVertex,worldNormal));r=vec3(reflectionMatrix*vec4(r,0));float lon=atan(r.z,r.x);float lat=acos(r.y);vec2 sphereCoords=vec2(lon,lat)*RECIPROCAL_PI2*2.0;float s=sphereCoords.x*0.5+0.5;float t=sphereCoords.y;return vec3(s,t,0);} -vec3 computeSphericalCoords(vec4 worldPos,vec3 worldNormal,mat4 view,mat4 reflectionMatrix) -{vec3 viewDir=normalize(vec3(view*worldPos));vec3 viewNormal=normalize(vec3(view*vec4(worldNormal,0.0)));vec3 r=reflect(viewDir,viewNormal);r=vec3(reflectionMatrix*vec4(r,0));r.z=r.z-1.0;float m=2.0*length(r);return vec3(r.x/m+0.5,1.0-r.y/m-0.5,0);} -vec3 computePlanarCoords(vec4 worldPos,vec3 worldNormal,vec3 eyePosition,mat4 reflectionMatrix) -{vec3 viewDir=worldPos.xyz-eyePosition;vec3 coords=normalize(reflect(viewDir,worldNormal));return vec3(reflectionMatrix*vec4(coords,1));} -vec3 computeCubicCoords(vec4 worldPos,vec3 worldNormal,vec3 eyePosition,mat4 reflectionMatrix) -{vec3 viewDir=normalize(worldPos.xyz-eyePosition);vec3 coords=reflect(viewDir,worldNormal);coords=vec3(reflectionMatrix*vec4(coords,0)); -#ifdef INVERTCUBICMAP -coords.y*=-1.0; -#endif -return coords;} -vec3 computeCubicLocalCoords(vec4 worldPos,vec3 worldNormal,vec3 eyePosition,mat4 reflectionMatrix,vec3 reflectionSize,vec3 reflectionPosition) -{vec3 viewDir=normalize(worldPos.xyz-eyePosition);vec3 coords=reflect(viewDir,worldNormal);coords=parallaxCorrectNormal(worldPos.xyz,coords,reflectionSize,reflectionPosition);coords=vec3(reflectionMatrix*vec4(coords,0)); -#ifdef INVERTCUBICMAP -coords.y*=-1.0; -#endif -return coords;} -vec3 computeProjectionCoords(vec4 worldPos,mat4 view,mat4 reflectionMatrix) -{return vec3(reflectionMatrix*(view*worldPos));} -vec3 computeSkyBoxCoords(vec3 positionW,mat4 reflectionMatrix) -{return vec3(reflectionMatrix*vec4(positionW,1.));} -#ifdef REFLECTION -vec3 computeReflectionCoords(vec4 worldPos,vec3 worldNormal) -{ -#ifdef REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED -vec3 direction=normalize(vDirectionW);return computeMirroredFixedEquirectangularCoords(worldPos,worldNormal,direction); -#endif -#ifdef REFLECTIONMAP_EQUIRECTANGULAR_FIXED -vec3 direction=normalize(vDirectionW);return computeFixedEquirectangularCoords(worldPos,worldNormal,direction); -#endif -#ifdef REFLECTIONMAP_EQUIRECTANGULAR -return computeEquirectangularCoords(worldPos,worldNormal,vEyePosition.xyz,reflectionMatrix); -#endif -#ifdef REFLECTIONMAP_SPHERICAL -return computeSphericalCoords(worldPos,worldNormal,view,reflectionMatrix); -#endif -#ifdef REFLECTIONMAP_PLANAR -return computePlanarCoords(worldPos,worldNormal,vEyePosition.xyz,reflectionMatrix); -#endif -#ifdef REFLECTIONMAP_CUBIC -#ifdef USE_LOCAL_REFLECTIONMAP_CUBIC -return computeCubicLocalCoords(worldPos,worldNormal,vEyePosition.xyz,reflectionMatrix,vReflectionSize,vReflectionPosition); -#else -return computeCubicCoords(worldPos,worldNormal,vEyePosition.xyz,reflectionMatrix); -#endif -#endif -#ifdef REFLECTIONMAP_PROJECTION -return computeProjectionCoords(worldPos,view,reflectionMatrix); -#endif -#ifdef REFLECTIONMAP_SKYBOX -return computeSkyBoxCoords(vPositionUVW,reflectionMatrix); -#endif -#ifdef REFLECTIONMAP_EXPLICIT -return vec3(0,0,0); -#endif -} -#endif + codeString += `${this._codeVariableName}.ySwizzle = "${this.ySwizzle}"; `; -ShaderStore.IncludesShadersStore[name19] = shader19; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/imageProcessingDeclaration.js -var name20 = "imageProcessingDeclaration"; -var shader20 = `#ifdef EXPOSURE -uniform float exposureLinear; -#endif -#ifdef CONTRAST -uniform float contrast; -#endif -#if defined(VIGNETTE) || defined(DITHER) -uniform vec2 vInverseScreenSize; -#endif -#ifdef VIGNETTE -uniform vec4 vignetteSettings1;uniform vec4 vignetteSettings2; -#endif -#ifdef COLORCURVES -uniform vec4 vCameraColorCurveNegative;uniform vec4 vCameraColorCurveNeutral;uniform vec4 vCameraColorCurvePositive; -#endif -#ifdef COLORGRADING -#ifdef COLORGRADING3D -uniform highp sampler3D txColorTransform; -#else -uniform sampler2D txColorTransform; -#endif -uniform vec4 colorTransformSettings; -#endif -#ifdef DITHER -uniform float ditherIntensity; -#endif + codeString += `${this._codeVariableName}.zSwizzle = "${this.zSwizzle}"; `; -ShaderStore.IncludesShadersStore[name20] = shader20; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/imageProcessingFunctions.js -var name21 = "imageProcessingFunctions"; -var shader21 = `#if defined(COLORGRADING) && !defined(COLORGRADING3D) -/** -* Polyfill for SAMPLE_TEXTURE_3D,which is unsupported in WebGL. -* sampler3dSetting.x=textureOffset (0.5/textureSize). -* sampler3dSetting.y=textureSize. -*/ -#define inline -vec3 sampleTexture3D(sampler2D colorTransform,vec3 color,vec2 sampler3dSetting) -{float sliceSize=2.0*sampler3dSetting.x; -#ifdef SAMPLER3DGREENDEPTH -float sliceContinuous=(color.g-sampler3dSetting.x)*sampler3dSetting.y; -#else -float sliceContinuous=(color.b-sampler3dSetting.x)*sampler3dSetting.y; -#endif -float sliceInteger=floor(sliceContinuous);float sliceFraction=sliceContinuous-sliceInteger; -#ifdef SAMPLER3DGREENDEPTH -vec2 sliceUV=color.rb; -#else -vec2 sliceUV=color.rg; -#endif -sliceUV.x*=sliceSize;sliceUV.x+=sliceInteger*sliceSize;sliceUV=saturate(sliceUV);vec4 slice0Color=texture2D(colorTransform,sliceUV);sliceUV.x+=sliceSize;sliceUV=saturate(sliceUV);vec4 slice1Color=texture2D(colorTransform,sliceUV);vec3 result=mix(slice0Color.rgb,slice1Color.rgb,sliceFraction); -#ifdef SAMPLER3DBGRMAP -color.rgb=result.rgb; -#else -color.rgb=result.bgr; -#endif -return color;} -#endif -#ifdef TONEMAPPING_ACES -const mat3 ACESInputMat=mat3( -vec3(0.59719,0.07600,0.02840), -vec3(0.35458,0.90834,0.13383), -vec3(0.04823,0.01566,0.83777) -);const mat3 ACESOutputMat=mat3( -vec3( 1.60475,-0.10208,-0.00327), -vec3(-0.53108, 1.10813,-0.07276), -vec3(-0.07367,-0.00605, 1.07602) -);vec3 RRTAndODTFit(vec3 v) -{vec3 a=v*(v+0.0245786)-0.000090537;vec3 b=v*(0.983729*v+0.4329510)+0.238081;return a/b;} -vec3 ACESFitted(vec3 color) -{color=ACESInputMat*color;color=RRTAndODTFit(color);color=ACESOutputMat*color;color=saturate(color);return color;} -#endif -#define CUSTOM_IMAGEPROCESSINGFUNCTIONS_DEFINITIONS -vec4 applyImageProcessing(vec4 result) { -#define CUSTOM_IMAGEPROCESSINGFUNCTIONS_UPDATERESULT_ATSTART -#ifdef EXPOSURE -result.rgb*=exposureLinear; -#endif -#ifdef VIGNETTE -vec2 viewportXY=gl_FragCoord.xy*vInverseScreenSize;viewportXY=viewportXY*2.0-1.0;vec3 vignetteXY1=vec3(viewportXY*vignetteSettings1.xy+vignetteSettings1.zw,1.0);float vignetteTerm=dot(vignetteXY1,vignetteXY1);float vignette=pow(vignetteTerm,vignetteSettings2.w);vec3 vignetteColor=vignetteSettings2.rgb; -#ifdef VIGNETTEBLENDMODEMULTIPLY -vec3 vignetteColorMultiplier=mix(vignetteColor,vec3(1,1,1),vignette);result.rgb*=vignetteColorMultiplier; -#endif -#ifdef VIGNETTEBLENDMODEOPAQUE -result.rgb=mix(vignetteColor,result.rgb,vignette); -#endif -#endif -#ifdef TONEMAPPING -#ifdef TONEMAPPING_ACES -result.rgb=ACESFitted(result.rgb); -#else -const float tonemappingCalibration=1.590579;result.rgb=1.0-exp2(-tonemappingCalibration*result.rgb); -#endif -#endif -result.rgb=toGammaSpace(result.rgb);result.rgb=saturate(result.rgb); -#ifdef CONTRAST -vec3 resultHighContrast=result.rgb*result.rgb*(3.0-2.0*result.rgb);if (contrast<1.0) {result.rgb=mix(vec3(0.5,0.5,0.5),result.rgb,contrast);} else {result.rgb=mix(result.rgb,resultHighContrast,contrast-1.0);} -#endif -#ifdef COLORGRADING -vec3 colorTransformInput=result.rgb*colorTransformSettings.xxx+colorTransformSettings.yyy; -#ifdef COLORGRADING3D -vec3 colorTransformOutput=texture(txColorTransform,colorTransformInput).rgb; -#else -vec3 colorTransformOutput=sampleTexture3D(txColorTransform,colorTransformInput,colorTransformSettings.yz).rgb; -#endif -result.rgb=mix(result.rgb,colorTransformOutput,colorTransformSettings.www); -#endif -#ifdef COLORCURVES -float luma=getLuminance(result.rgb);vec2 curveMix=clamp(vec2(luma*3.0-1.5,luma*-3.0+1.5),vec2(0.0),vec2(1.0));vec4 colorCurve=vCameraColorCurveNeutral+curveMix.x*vCameraColorCurvePositive-curveMix.y*vCameraColorCurveNegative;result.rgb*=colorCurve.rgb;result.rgb=mix(vec3(luma),result.rgb,colorCurve.a); -#endif -#ifdef DITHER -float rand=getRand(gl_FragCoord.xy*vInverseScreenSize);float dither=mix(-ditherIntensity,ditherIntensity,rand);result.rgb=saturate(result.rgb+vec3(dither)); -#endif -#define CUSTOM_IMAGEPROCESSINGFUNCTIONS_UPDATERESULT_ATEND -return result;}`; -ShaderStore.IncludesShadersStore[name21] = shader21; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/bumpFragmentMainFunctions.js -var name22 = "bumpFragmentMainFunctions"; -var shader22 = `#if defined(BUMP) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) || defined(DETAIL) -#if defined(TANGENT) && defined(NORMAL) -varying mat3 vTBN; -#endif -#ifdef OBJECTSPACE_NORMALMAP -uniform mat4 normalMatrix; -#if defined(WEBGL2) || defined(WEBGPU) -mat4 toNormalMatrix(mat4 wMatrix) -{mat4 ret=inverse(wMatrix);ret=transpose(ret);ret[0][3]=0.;ret[1][3]=0.;ret[2][3]=0.;ret[3]=vec4(0.,0.,0.,1.);return ret;} -#else -mat4 toNormalMatrix(mat4 m) -{float -a00=m[0][0],a01=m[0][1],a02=m[0][2],a03=m[0][3], -a10=m[1][0],a11=m[1][1],a12=m[1][2],a13=m[1][3], -a20=m[2][0],a21=m[2][1],a22=m[2][2],a23=m[2][3], -a30=m[3][0],a31=m[3][1],a32=m[3][2],a33=m[3][3], -b00=a00*a11-a01*a10, -b01=a00*a12-a02*a10, -b02=a00*a13-a03*a10, -b03=a01*a12-a02*a11, -b04=a01*a13-a03*a11, -b05=a02*a13-a03*a12, -b06=a20*a31-a21*a30, -b07=a20*a32-a22*a30, -b08=a20*a33-a23*a30, -b09=a21*a32-a22*a31, -b10=a21*a33-a23*a31, -b11=a22*a33-a23*a32, -det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;mat4 mi=mat4( -a11*b11-a12*b10+a13*b09, -a02*b10-a01*b11-a03*b09, -a31*b05-a32*b04+a33*b03, -a22*b04-a21*b05-a23*b03, -a12*b08-a10*b11-a13*b07, -a00*b11-a02*b08+a03*b07, -a32*b02-a30*b05-a33*b01, -a20*b05-a22*b02+a23*b01, -a10*b10-a11*b08+a13*b06, -a01*b08-a00*b10-a03*b06, -a30*b04-a31*b02+a33*b00, -a21*b02-a20*b04-a23*b00, -a11*b07-a10*b09-a12*b06, -a00*b09-a01*b07+a02*b06, -a31*b01-a30*b03-a32*b00, -a20*b03-a21*b01+a22*b00)/det;return mat4(mi[0][0],mi[1][0],mi[2][0],mi[3][0], -mi[0][1],mi[1][1],mi[2][1],mi[3][1], -mi[0][2],mi[1][2],mi[2][2],mi[3][2], -mi[0][3],mi[1][3],mi[2][3],mi[3][3]);} -#endif -#endif -vec3 perturbNormalBase(mat3 cotangentFrame,vec3 normal,float scale) -{ -#ifdef NORMALXYSCALE -normal=normalize(normal*vec3(scale,scale,1.0)); -#endif -return normalize(cotangentFrame*normal);} -vec3 perturbNormal(mat3 cotangentFrame,vec3 textureSample,float scale) -{return perturbNormalBase(cotangentFrame,textureSample*2.0-1.0,scale);} -mat3 cotangent_frame(vec3 normal,vec3 p,vec2 uv,vec2 tangentSpaceParams) -{vec3 dp1=dFdx(p);vec3 dp2=dFdy(p);vec2 duv1=dFdx(uv);vec2 duv2=dFdy(uv);vec3 dp2perp=cross(dp2,normal);vec3 dp1perp=cross(normal,dp1);vec3 tangent=dp2perp*duv1.x+dp1perp*duv2.x;vec3 bitangent=dp2perp*duv1.y+dp1perp*duv2.y;tangent*=tangentSpaceParams.x;bitangent*=tangentSpaceParams.y;float det=max(dot(tangent,tangent),dot(bitangent,bitangent));float invmax=det==0.0 ? 0.0 : inversesqrt(det);return mat3(tangent*invmax,bitangent*invmax,normal);} -#endif + codeString += `${this._codeVariableName}.wSwizzle = "${this.wSwizzle}"; `; -ShaderStore.IncludesShadersStore[name22] = shader22; + return codeString; + } +}; +RegisterClass("BABYLON.VectorMergerBlock", VectorMergerBlock); -// node_modules/@babylonjs/core/Shaders/ShadersInclude/bumpFragmentFunctions.js -var name23 = "bumpFragmentFunctions"; -var shader23 = `#if defined(BUMP) -#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_SAMPLERNAME_,bump) -#endif -#if defined(DETAIL) -#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_SAMPLERNAME_,detail) -#endif -#if defined(BUMP) && defined(PARALLAX) -const float minSamples=4.;const float maxSamples=15.;const int iMaxSamples=15;vec2 parallaxOcclusion(vec3 vViewDirCoT,vec3 vNormalCoT,vec2 texCoord,float parallaxScale) {float parallaxLimit=length(vViewDirCoT.xy)/vViewDirCoT.z;parallaxLimit*=parallaxScale;vec2 vOffsetDir=normalize(vViewDirCoT.xy);vec2 vMaxOffset=vOffsetDir*parallaxLimit;float numSamples=maxSamples+(dot(vViewDirCoT,vNormalCoT)*(minSamples-maxSamples));float stepSize=1.0/numSamples;float currRayHeight=1.0;vec2 vCurrOffset=vec2(0,0);vec2 vLastOffset=vec2(0,0);float lastSampledHeight=1.0;float currSampledHeight=1.0;bool keepWorking=true;for (int i=0; icurrRayHeight) -{float delta1=currSampledHeight-currRayHeight;float delta2=(currRayHeight+stepSize)-lastSampledHeight;float ratio=delta1/(delta1+delta2);vCurrOffset=(ratio)* vLastOffset+(1.0-ratio)*vCurrOffset;keepWorking=false;} -else -{currRayHeight-=stepSize;vLastOffset=vCurrOffset; -#ifdef PARALLAX_RHS -vCurrOffset-=stepSize*vMaxOffset; -#else -vCurrOffset+=stepSize*vMaxOffset; -#endif -lastSampledHeight=currSampledHeight;}} -return vCurrOffset;} -vec2 parallaxOffset(vec3 viewDir,float heightScale) -{float height=texture2D(bumpSampler,vBumpUV).w;vec2 texCoordOffset=heightScale*viewDir.xy*height; -#ifdef PARALLAX_RHS -return texCoordOffset; -#else -return -texCoordOffset; -#endif -} -#endif +// node_modules/@babylonjs/core/Materials/Node/Blocks/remapBlock.js +var RemapBlock = class extends NodeMaterialBlock { + /** + * Creates a new RemapBlock + * @param name defines the block name + */ + constructor(name69) { + super(name69, NodeMaterialBlockTargets.Neutral); + this.sourceRange = new Vector2(-1, 1); + this.targetRange = new Vector2(0, 1); + this.registerInput("input", NodeMaterialBlockConnectionPointTypes.AutoDetect); + this.registerInput("sourceMin", NodeMaterialBlockConnectionPointTypes.Float, true); + this.registerInput("sourceMax", NodeMaterialBlockConnectionPointTypes.Float, true); + this.registerInput("targetMin", NodeMaterialBlockConnectionPointTypes.Float, true); + this.registerInput("targetMax", NodeMaterialBlockConnectionPointTypes.Float, true); + this.registerOutput("output", NodeMaterialBlockConnectionPointTypes.BasedOnInput); + this._outputs[0]._typeConnectionSource = this._inputs[0]; + } + /** + * Gets the current class name + * @returns the class name + */ + getClassName() { + return "RemapBlock"; + } + /** + * Gets the input component + */ + get input() { + return this._inputs[0]; + } + /** + * Gets the source min input component + */ + get sourceMin() { + return this._inputs[1]; + } + /** + * Gets the source max input component + */ + get sourceMax() { + return this._inputs[2]; + } + /** + * Gets the target min input component + */ + get targetMin() { + return this._inputs[3]; + } + /** + * Gets the target max input component + */ + get targetMax() { + return this._inputs[4]; + } + /** + * Gets the output component + */ + get output() { + return this._outputs[0]; + } + _buildBlock(state) { + super._buildBlock(state); + const output = this._outputs[0]; + const sourceMin = this.sourceMin.isConnected ? this.sourceMin.associatedVariableName : this._writeFloat(this.sourceRange.x); + const sourceMax = this.sourceMax.isConnected ? this.sourceMax.associatedVariableName : this._writeFloat(this.sourceRange.y); + const targetMin = this.targetMin.isConnected ? this.targetMin.associatedVariableName : this._writeFloat(this.targetRange.x); + const targetMax = this.targetMax.isConnected ? this.targetMax.associatedVariableName : this._writeFloat(this.targetRange.y); + state.compilationString += this._declareOutput(output, state) + ` = ${targetMin} + (${this._inputs[0].associatedVariableName} - ${sourceMin}) * (${targetMax} - ${targetMin}) / (${sourceMax} - ${sourceMin}); `; -ShaderStore.IncludesShadersStore[name23] = shader23; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/clipPlaneFragmentDeclaration.js -var name24 = "clipPlaneFragmentDeclaration"; -var shader24 = `#ifdef CLIPPLANE -varying float fClipDistance; -#endif -#ifdef CLIPPLANE2 -varying float fClipDistance2; -#endif -#ifdef CLIPPLANE3 -varying float fClipDistance3; -#endif -#ifdef CLIPPLANE4 -varying float fClipDistance4; -#endif -#ifdef CLIPPLANE5 -varying float fClipDistance5; -#endif -#ifdef CLIPPLANE6 -varying float fClipDistance6; -#endif + return this; + } + _dumpPropertiesCode() { + let codeString = super._dumpPropertiesCode() + `${this._codeVariableName}.sourceRange = new BABYLON.Vector2(${this.sourceRange.x}, ${this.sourceRange.y}); `; -ShaderStore.IncludesShadersStore[name24] = shader24; + codeString += `${this._codeVariableName}.targetRange = new BABYLON.Vector2(${this.targetRange.x}, ${this.targetRange.y}); +`; + return codeString; + } + serialize() { + const serializationObject = super.serialize(); + serializationObject.sourceRange = this.sourceRange.asArray(); + serializationObject.targetRange = this.targetRange.asArray(); + return serializationObject; + } + _deserialize(serializationObject, scene, rootUrl) { + super._deserialize(serializationObject, scene, rootUrl); + this.sourceRange = Vector2.FromArray(serializationObject.sourceRange); + this.targetRange = Vector2.FromArray(serializationObject.targetRange); + } +}; +__decorate([ + editableInPropertyPage("From", PropertyTypeForEdition.Vector2) +], RemapBlock.prototype, "sourceRange", void 0); +__decorate([ + editableInPropertyPage("To", PropertyTypeForEdition.Vector2) +], RemapBlock.prototype, "targetRange", void 0); +RegisterClass("BABYLON.RemapBlock", RemapBlock); + +// node_modules/@babylonjs/core/Materials/Node/Blocks/baseMathBlock.js +var BaseMathBlock = class extends NodeMaterialBlock { + constructor(name69) { + super(name69, NodeMaterialBlockTargets.Neutral); + this.registerInput("left", NodeMaterialBlockConnectionPointTypes.AutoDetect); + this.registerInput("right", NodeMaterialBlockConnectionPointTypes.AutoDetect); + this.registerOutput("output", NodeMaterialBlockConnectionPointTypes.BasedOnInput); + this.output._typeConnectionSource = this.left; + this._linkConnectionTypes(0, 1, true); + this.left.acceptedConnectionPointTypes.push(NodeMaterialBlockConnectionPointTypes.Float); + this.right.acceptedConnectionPointTypes.push(NodeMaterialBlockConnectionPointTypes.Float); + this._connectionObservers = [ + this.left.onConnectionObservable.add(() => this._updateInputOutputTypes()), + this.left.onDisconnectionObservable.add(() => this._updateInputOutputTypes()), + this.right.onConnectionObservable.add(() => this._updateInputOutputTypes()), + this.right.onDisconnectionObservable.add(() => this._updateInputOutputTypes()) + ]; + } + /** + * Gets the left operand input component + */ + get left() { + return this._inputs[0]; + } + /** + * Gets the right operand input component + */ + get right() { + return this._inputs[1]; + } + /** + * Gets the output component + */ + get output() { + return this._outputs[0]; + } + _updateInputOutputTypes() { + this.output._typeConnectionSource = this.left; + if (this.left.isConnected && this.right.isConnected) { + if (this.left.type === NodeMaterialBlockConnectionPointTypes.Int || this.left.type === NodeMaterialBlockConnectionPointTypes.Float && this.right.type !== NodeMaterialBlockConnectionPointTypes.Int) { + this.output._typeConnectionSource = this.right; + } + } else if (this.left.isConnected !== this.right.isConnected) { + this.output._typeConnectionSource = this.left.isConnected ? this.left : this.right; + } + if (this.left.isConnected || this.right.isConnected) { + for (const [first, second] of [ + [this.left, this.right], + [this.right, this.left] + ]) { + first.acceptedConnectionPointTypes = [NodeMaterialBlockConnectionPointTypes.Int, NodeMaterialBlockConnectionPointTypes.Float]; + if (second.isConnected) { + first.acceptedConnectionPointTypes.push(second.type); + if (second.type === NodeMaterialBlockConnectionPointTypes.Int || second.type === NodeMaterialBlockConnectionPointTypes.Float) { + first.acceptedConnectionPointTypes.push(NodeMaterialBlockConnectionPointTypes.Vector2, NodeMaterialBlockConnectionPointTypes.Vector3, NodeMaterialBlockConnectionPointTypes.Vector4, NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockConnectionPointTypes.Matrix); + } + } + } + } + } + /** + * Release resources + */ + dispose() { + super.dispose(); + this._connectionObservers.forEach((observer2) => observer2.remove()); + this._connectionObservers.length = 0; + } +}; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/logDepthDeclaration.js -var name25 = "logDepthDeclaration"; -var shader25 = `#ifdef LOGARITHMICDEPTH -uniform float logarithmicDepthConstant;varying float vFragmentDepth; -#endif +// node_modules/@babylonjs/core/Materials/Node/Blocks/multiplyBlock.js +var MultiplyBlock = class extends BaseMathBlock { + /** + * Creates a new MultiplyBlock + * @param name defines the block name + */ + constructor(name69) { + super(name69); + } + /** + * Gets the current class name + * @returns the class name + */ + getClassName() { + return "MultiplyBlock"; + } + _buildBlock(state) { + super._buildBlock(state); + state.compilationString += this._declareOutput(this.output, state) + ` = ${this.left.associatedVariableName} * ${this.right.associatedVariableName}; `; -ShaderStore.IncludesShadersStore[name25] = shader25; + return this; + } +}; +RegisterClass("BABYLON.MultiplyBlock", MultiplyBlock); -// node_modules/@babylonjs/core/Shaders/ShadersInclude/fogFragmentDeclaration.js -var name26 = "fogFragmentDeclaration"; -var shader26 = `#ifdef FOG -#define FOGMODE_NONE 0. -#define FOGMODE_EXP 1. -#define FOGMODE_EXP2 2. -#define FOGMODE_LINEAR 3. -#define E 2.71828 -uniform vec4 vFogInfos;uniform vec3 vFogColor;varying vec3 vFogDistance;float CalcFogFactor() -{float fogCoeff=1.0;float fogStart=vFogInfos.y;float fogEnd=vFogInfos.z;float fogDensity=vFogInfos.w;float fogDistance=length(vFogDistance);if (FOGMODE_LINEAR==vFogInfos.x) -{fogCoeff=(fogEnd-fogDistance)/(fogEnd-fogStart);} -else if (FOGMODE_EXP==vFogInfos.x) -{fogCoeff=1.0/pow(E,fogDistance*fogDensity);} -else if (FOGMODE_EXP2==vFogInfos.x) -{fogCoeff=1.0/pow(E,fogDistance*fogDistance*fogDensity*fogDensity);} -return clamp(fogCoeff,0.0,1.0);} -#endif -`; -ShaderStore.IncludesShadersStore[name26] = shader26; +// node_modules/@babylonjs/core/Materials/Node/Enums/nodeMaterialModes.js +var NodeMaterialModes; +(function(NodeMaterialModes2) { + NodeMaterialModes2[NodeMaterialModes2["Material"] = 0] = "Material"; + NodeMaterialModes2[NodeMaterialModes2["PostProcess"] = 1] = "PostProcess"; + NodeMaterialModes2[NodeMaterialModes2["Particle"] = 2] = "Particle"; + NodeMaterialModes2[NodeMaterialModes2["ProceduralTexture"] = 3] = "ProceduralTexture"; +})(NodeMaterialModes || (NodeMaterialModes = {})); -// node_modules/@babylonjs/core/Shaders/ShadersInclude/clipPlaneFragment.js -var name27 = "clipPlaneFragment"; -var shader27 = `#if defined(CLIPPLANE) || defined(CLIPPLANE2) || defined(CLIPPLANE3) || defined(CLIPPLANE4) || defined(CLIPPLANE5) || defined(CLIPPLANE6) -if (false) {} -#endif -#ifdef CLIPPLANE -else if (fClipDistance>0.0) -{discard;} -#endif -#ifdef CLIPPLANE2 -else if (fClipDistance2>0.0) -{discard;} -#endif -#ifdef CLIPPLANE3 -else if (fClipDistance3>0.0) -{discard;} -#endif -#ifdef CLIPPLANE4 -else if (fClipDistance4>0.0) -{discard;} -#endif -#ifdef CLIPPLANE5 -else if (fClipDistance5>0.0) -{discard;} -#endif -#ifdef CLIPPLANE6 -else if (fClipDistance6>0.0) -{discard;} -#endif -`; -ShaderStore.IncludesShadersStore[name27] = shader27; +// node_modules/@babylonjs/core/Materials/imageProcessingConfiguration.defines.js +var ImageProcessingConfigurationDefines = class extends MaterialDefines { + constructor() { + super(); + this.IMAGEPROCESSING = false; + this.VIGNETTE = false; + this.VIGNETTEBLENDMODEMULTIPLY = false; + this.VIGNETTEBLENDMODEOPAQUE = false; + this.TONEMAPPING = false; + this.TONEMAPPING_ACES = false; + this.CONTRAST = false; + this.COLORCURVES = false; + this.COLORGRADING = false; + this.COLORGRADING3D = false; + this.SAMPLER3DGREENDEPTH = false; + this.SAMPLER3DBGRMAP = false; + this.DITHER = false; + this.IMAGEPROCESSINGPOSTPROCESS = false; + this.EXPOSURE = false; + this.SKIPFINALCOLORCLAMP = false; + this.rebuild(); + } +}; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/bumpFragment.js -var name28 = "bumpFragment"; -var shader28 = `vec2 uvOffset=vec2(0.0,0.0); -#if defined(BUMP) || defined(PARALLAX) || defined(DETAIL) -#ifdef NORMALXYSCALE -float normalScale=1.0; -#elif defined(BUMP) -float normalScale=vBumpInfos.y; -#else -float normalScale=1.0; -#endif -#if defined(TANGENT) && defined(NORMAL) -mat3 TBN=vTBN; -#elif defined(BUMP) -vec2 TBNUV=gl_FrontFacing ? vBumpUV : -vBumpUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vTangentSpaceParams); -#else -vec2 TBNUV=gl_FrontFacing ? vDetailUV : -vDetailUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vec2(1.,1.)); -#endif -#elif defined(ANISOTROPIC) -#if defined(TANGENT) && defined(NORMAL) -mat3 TBN=vTBN; -#else -vec2 TBNUV=gl_FrontFacing ? vMainUV1 : -vMainUV1;mat3 TBN=cotangent_frame(normalW,vPositionW,TBNUV,vec2(1.,1.)); -#endif -#endif -#ifdef PARALLAX -mat3 invTBN=transposeMat3(TBN); -#ifdef PARALLAXOCCLUSION -uvOffset=parallaxOcclusion(invTBN*-viewDirectionW,invTBN*normalW,vBumpUV,vBumpInfos.z); -#else -uvOffset=parallaxOffset(invTBN*viewDirectionW,vBumpInfos.z); -#endif -#endif -#ifdef DETAIL -vec4 detailColor=texture2D(detailSampler,vDetailUV+uvOffset);vec2 detailNormalRG=detailColor.wy*2.0-1.0;float detailNormalB=sqrt(1.-saturate(dot(detailNormalRG,detailNormalRG)));vec3 detailNormal=vec3(detailNormalRG,detailNormalB); -#endif -#ifdef BUMP -#ifdef OBJECTSPACE_NORMALMAP -#define CUSTOM_FRAGMENT_BUMP_FRAGMENT -normalW=normalize(texture2D(bumpSampler,vBumpUV).xyz *2.0-1.0);normalW=normalize(mat3(normalMatrix)*normalW); -#elif !defined(DETAIL) -normalW=perturbNormal(TBN,texture2D(bumpSampler,vBumpUV+uvOffset).xyz,vBumpInfos.y); -#else -vec3 bumpNormal=texture2D(bumpSampler,vBumpUV+uvOffset).xyz*2.0-1.0; -#if DETAIL_NORMALBLENDMETHOD==0 -detailNormal.xy*=vDetailInfos.z;vec3 blendedNormal=normalize(vec3(bumpNormal.xy+detailNormal.xy,bumpNormal.z*detailNormal.z)); -#elif DETAIL_NORMALBLENDMETHOD==1 -detailNormal.xy*=vDetailInfos.z;bumpNormal+=vec3(0.0,0.0,1.0);detailNormal*=vec3(-1.0,-1.0,1.0);vec3 blendedNormal=bumpNormal*dot(bumpNormal,detailNormal)/bumpNormal.z-detailNormal; -#endif -normalW=perturbNormalBase(TBN,blendedNormal,vBumpInfos.y); -#endif -#elif defined(DETAIL) -detailNormal.xy*=vDetailInfos.z;normalW=perturbNormalBase(TBN,detailNormal,vDetailInfos.z); -#endif -`; -ShaderStore.IncludesShadersStore[name28] = shader28; +// node_modules/@babylonjs/core/Particles/baseParticleSystem.js +var BaseParticleSystem = class _BaseParticleSystem { + /** + * Gets or sets a texture used to add random noise to particle positions + */ + get noiseTexture() { + return this._noiseTexture; + } + set noiseTexture(value) { + if (this._noiseTexture === value) { + return; + } + this._noiseTexture = value; + this._reset(); + } + /** + * Gets or sets whether an animation sprite sheet is enabled or not on the particle system + */ + get isAnimationSheetEnabled() { + return this._isAnimationSheetEnabled; + } + set isAnimationSheetEnabled(value) { + if (this._isAnimationSheetEnabled == value) { + return; + } + this._isAnimationSheetEnabled = value; + this._reset(); + } + /** + * Gets or sets a boolean enabling the use of logarithmic depth buffers, which is good for wide depth buffers. + */ + get useLogarithmicDepth() { + return this._useLogarithmicDepth; + } + set useLogarithmicDepth(value) { + this._useLogarithmicDepth = value && this.getScene().getEngine().getCaps().fragmentDepthSupported; + } + /** + * Get hosting scene + * @returns the scene + */ + getScene() { + return this._scene; + } + _hasTargetStopDurationDependantGradient() { + return this._startSizeGradients && this._startSizeGradients.length > 0 || this._emitRateGradients && this._emitRateGradients.length > 0 || this._lifeTimeGradients && this._lifeTimeGradients.length > 0; + } + /** + * Gets the current list of drag gradients. + * You must use addDragGradient and removeDragGradient to update this list + * @returns the list of drag gradients + */ + getDragGradients() { + return this._dragGradients; + } + /** + * Gets the current list of limit velocity gradients. + * You must use addLimitVelocityGradient and removeLimitVelocityGradient to update this list + * @returns the list of limit velocity gradients + */ + getLimitVelocityGradients() { + return this._limitVelocityGradients; + } + /** + * Gets the current list of color gradients. + * You must use addColorGradient and removeColorGradient to update this list + * @returns the list of color gradients + */ + getColorGradients() { + return this._colorGradients; + } + /** + * Gets the current list of size gradients. + * You must use addSizeGradient and removeSizeGradient to update this list + * @returns the list of size gradients + */ + getSizeGradients() { + return this._sizeGradients; + } + /** + * Gets the current list of color remap gradients. + * You must use addColorRemapGradient and removeColorRemapGradient to update this list + * @returns the list of color remap gradients + */ + getColorRemapGradients() { + return this._colorRemapGradients; + } + /** + * Gets the current list of alpha remap gradients. + * You must use addAlphaRemapGradient and removeAlphaRemapGradient to update this list + * @returns the list of alpha remap gradients + */ + getAlphaRemapGradients() { + return this._alphaRemapGradients; + } + /** + * Gets the current list of life time gradients. + * You must use addLifeTimeGradient and removeLifeTimeGradient to update this list + * @returns the list of life time gradients + */ + getLifeTimeGradients() { + return this._lifeTimeGradients; + } + /** + * Gets the current list of angular speed gradients. + * You must use addAngularSpeedGradient and removeAngularSpeedGradient to update this list + * @returns the list of angular speed gradients + */ + getAngularSpeedGradients() { + return this._angularSpeedGradients; + } + /** + * Gets the current list of velocity gradients. + * You must use addVelocityGradient and removeVelocityGradient to update this list + * @returns the list of velocity gradients + */ + getVelocityGradients() { + return this._velocityGradients; + } + /** + * Gets the current list of start size gradients. + * You must use addStartSizeGradient and removeStartSizeGradient to update this list + * @returns the list of start size gradients + */ + getStartSizeGradients() { + return this._startSizeGradients; + } + /** + * Gets the current list of emit rate gradients. + * You must use addEmitRateGradient and removeEmitRateGradient to update this list + * @returns the list of emit rate gradients + */ + getEmitRateGradients() { + return this._emitRateGradients; + } + /** + * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors. + * This only works when particleEmitterTyps is a BoxParticleEmitter + */ + get direction1() { + if (this.particleEmitterType.direction1) { + return this.particleEmitterType.direction1; + } + return Vector3.Zero(); + } + set direction1(value) { + if (this.particleEmitterType.direction1) { + this.particleEmitterType.direction1 = value; + } + } + /** + * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors. + * This only works when particleEmitterTyps is a BoxParticleEmitter + */ + get direction2() { + if (this.particleEmitterType.direction2) { + return this.particleEmitterType.direction2; + } + return Vector3.Zero(); + } + set direction2(value) { + if (this.particleEmitterType.direction2) { + this.particleEmitterType.direction2 = value; + } + } + /** + * Minimum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so. + * This only works when particleEmitterTyps is a BoxParticleEmitter + */ + get minEmitBox() { + if (this.particleEmitterType.minEmitBox) { + return this.particleEmitterType.minEmitBox; + } + return Vector3.Zero(); + } + set minEmitBox(value) { + if (this.particleEmitterType.minEmitBox) { + this.particleEmitterType.minEmitBox = value; + } + } + /** + * Maximum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so. + * This only works when particleEmitterTyps is a BoxParticleEmitter + */ + get maxEmitBox() { + if (this.particleEmitterType.maxEmitBox) { + return this.particleEmitterType.maxEmitBox; + } + return Vector3.Zero(); + } + set maxEmitBox(value) { + if (this.particleEmitterType.maxEmitBox) { + this.particleEmitterType.maxEmitBox = value; + } + } + /** + * Gets or sets the billboard mode to use when isBillboardBased = true. + * Value can be: ParticleSystem.BILLBOARDMODE_ALL, ParticleSystem.BILLBOARDMODE_Y, ParticleSystem.BILLBOARDMODE_STRETCHED + */ + get billboardMode() { + return this._billboardMode; + } + set billboardMode(value) { + if (this._billboardMode === value) { + return; + } + this._billboardMode = value; + this._reset(); + } + /** + * Gets or sets a boolean indicating if the particles must be rendered as billboard or aligned with the direction + */ + get isBillboardBased() { + return this._isBillboardBased; + } + set isBillboardBased(value) { + if (this._isBillboardBased === value) { + return; + } + this._isBillboardBased = value; + this._reset(); + } + /** + * Gets the image processing configuration used either in this material. + */ + get imageProcessingConfiguration() { + return this._imageProcessingConfiguration; + } + /** + * Sets the Default image processing configuration used either in the this material. + * + * If sets to null, the scene one is in use. + */ + set imageProcessingConfiguration(value) { + this._attachImageProcessingConfiguration(value); + } + /** + * Attaches a new image processing configuration to the Standard Material. + * @param configuration + */ + _attachImageProcessingConfiguration(configuration) { + if (configuration === this._imageProcessingConfiguration) { + return; + } + if (!configuration && this._scene) { + this._imageProcessingConfiguration = this._scene.imageProcessingConfiguration; + } else { + this._imageProcessingConfiguration = configuration; + } + } + /** @internal */ + _reset() { + } + /** + * @internal + */ + _removeGradientAndTexture(gradient, gradients, texture) { + if (!gradients) { + return this; + } + let index = 0; + for (const valueGradient of gradients) { + if (valueGradient.gradient === gradient) { + gradients.splice(index, 1); + break; + } + index++; + } + if (texture) { + texture.dispose(); + } + return this; + } + /** + * Instantiates a particle system. + * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust. + * @param name The name of the particle system + */ + constructor(name69) { + this.animations = []; + this.renderingGroupId = 0; + this.emitter = Vector3.Zero(); + this.emitRate = 10; + this.manualEmitCount = -1; + this.updateSpeed = 0.01; + this.targetStopDuration = 0; + this.disposeOnStop = false; + this.minEmitPower = 1; + this.maxEmitPower = 1; + this.minLifeTime = 1; + this.maxLifeTime = 1; + this.minSize = 1; + this.maxSize = 1; + this.minScaleX = 1; + this.maxScaleX = 1; + this.minScaleY = 1; + this.maxScaleY = 1; + this.minInitialRotation = 0; + this.maxInitialRotation = 0; + this.minAngularSpeed = 0; + this.maxAngularSpeed = 0; + this.layerMask = 268435455; + this.customShader = null; + this.preventAutoStart = false; + this.applyFog = false; + this._wasDispatched = false; + this._rootUrl = ""; + this.noiseStrength = new Vector3(10, 10, 10); + this.onAnimationEnd = null; + this.blendMode = _BaseParticleSystem.BLENDMODE_ONEONE; + this.forceDepthWrite = false; + this.preWarmCycles = 0; + this.preWarmStepOffset = 1; + this.spriteCellChangeSpeed = 1; + this.startSpriteCellID = 0; + this.endSpriteCellID = 0; + this.spriteCellWidth = 0; + this.spriteCellHeight = 0; + this.spriteCellLoop = true; + this.spriteRandomStartCell = false; + this.translationPivot = new Vector2(0, 0); + this.beginAnimationOnStart = false; + this.beginAnimationFrom = 0; + this.beginAnimationTo = 60; + this.beginAnimationLoop = false; + this.worldOffset = new Vector3(0, 0, 0); + this._useLogarithmicDepth = false; + this.gravity = Vector3.Zero(); + this._colorGradients = null; + this._sizeGradients = null; + this._lifeTimeGradients = null; + this._angularSpeedGradients = null; + this._velocityGradients = null; + this._limitVelocityGradients = null; + this._dragGradients = null; + this._emitRateGradients = null; + this._startSizeGradients = null; + this._rampGradients = null; + this._colorRemapGradients = null; + this._alphaRemapGradients = null; + this.startDelay = 0; + this.limitVelocityDamping = 0.4; + this.color1 = new Color4(1, 1, 1, 1); + this.color2 = new Color4(1, 1, 1, 1); + this.colorDead = new Color4(0, 0, 0, 1); + this.textureMask = new Color4(1, 1, 1, 1); + this._isSubEmitter = false; + this._billboardMode = 7; + this._isBillboardBased = true; + this._imageProcessingConfigurationDefines = new ImageProcessingConfigurationDefines(); + this.id = name69; + this.name = name69; + } + /** + * Creates a Point Emitter for the particle system (emits directly from the emitter position) + * @param direction1 Particles are emitted between the direction1 and direction2 from within the box + * @param direction2 Particles are emitted between the direction1 and direction2 from within the box + */ + createPointEmitter(direction1, direction2) { + throw new Error("Method not implemented."); + } + /** + * Creates a Hemisphere Emitter for the particle system (emits along the hemisphere radius) + * @param radius The radius of the hemisphere to emit from + * @param radiusRange The range of the hemisphere to emit from [0-1] 0 Surface Only, 1 Entire Radius + */ + createHemisphericEmitter(radius = 1, radiusRange = 1) { + throw new Error("Method not implemented."); + } + /** + * Creates a Sphere Emitter for the particle system (emits along the sphere radius) + * @param radius The radius of the sphere to emit from + * @param radiusRange The range of the sphere to emit from [0-1] 0 Surface Only, 1 Entire Radius + */ + createSphereEmitter(radius = 1, radiusRange = 1) { + throw new Error("Method not implemented."); + } + /** + * Creates a Directed Sphere Emitter for the particle system (emits between direction1 and direction2) + * @param radius The radius of the sphere to emit from + * @param direction1 Particles are emitted between the direction1 and direction2 from within the sphere + * @param direction2 Particles are emitted between the direction1 and direction2 from within the sphere + */ + createDirectedSphereEmitter(radius = 1, direction1 = new Vector3(0, 1, 0), direction2 = new Vector3(0, 1, 0)) { + throw new Error("Method not implemented."); + } + /** + * Creates a Cylinder Emitter for the particle system (emits from the cylinder to the particle position) + * @param radius The radius of the emission cylinder + * @param height The height of the emission cylinder + * @param radiusRange The range of emission [0-1] 0 Surface only, 1 Entire Radius + * @param directionRandomizer How much to randomize the particle direction [0-1] + */ + createCylinderEmitter(radius = 1, height = 1, radiusRange = 1, directionRandomizer = 0) { + throw new Error("Method not implemented."); + } + /** + * Creates a Directed Cylinder Emitter for the particle system (emits between direction1 and direction2) + * @param radius The radius of the cylinder to emit from + * @param height The height of the emission cylinder + * @param radiusRange the range of the emission cylinder [0-1] 0 Surface only, 1 Entire Radius (1 by default) + * @param direction1 Particles are emitted between the direction1 and direction2 from within the cylinder + * @param direction2 Particles are emitted between the direction1 and direction2 from within the cylinder + */ + createDirectedCylinderEmitter(radius = 1, height = 1, radiusRange = 1, direction1 = new Vector3(0, 1, 0), direction2 = new Vector3(0, 1, 0)) { + throw new Error("Method not implemented."); + } + /** + * Creates a Cone Emitter for the particle system (emits from the cone to the particle position) + * @param radius The radius of the cone to emit from + * @param angle The base angle of the cone + */ + createConeEmitter(radius = 1, angle = Math.PI / 4) { + throw new Error("Method not implemented."); + } + /** + * Creates a Box Emitter for the particle system. (emits between direction1 and direction2 from withing the box defined by minEmitBox and maxEmitBox) + * @param direction1 Particles are emitted between the direction1 and direction2 from within the box + * @param direction2 Particles are emitted between the direction1 and direction2 from within the box + * @param minEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox + * @param maxEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox + */ + createBoxEmitter(direction1, direction2, minEmitBox, maxEmitBox) { + throw new Error("Method not implemented."); + } +}; +BaseParticleSystem.BLENDMODE_ONEONE = 0; +BaseParticleSystem.BLENDMODE_STANDARD = 1; +BaseParticleSystem.BLENDMODE_ADD = 2; +BaseParticleSystem.BLENDMODE_MULTIPLY = 3; +BaseParticleSystem.BLENDMODE_MULTIPLYADD = 4; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/decalFragment.js -var name29 = "decalFragment"; -var shader29 = `#ifdef DECAL -#ifdef GAMMADECAL -decalColor.rgb=toLinearSpace(decalColor.rgb); -#endif -#ifdef DECAL_SMOOTHALPHA -decalColor.a*=decalColor.a; -#endif -surfaceAlbedo.rgb=mix(surfaceAlbedo.rgb,decalColor.rgb,decalColor.a); -#endif +// node_modules/@babylonjs/core/Materials/Node/Blocks/colorSplitterBlock.js +var ColorSplitterBlock = class extends NodeMaterialBlock { + /** + * Create a new ColorSplitterBlock + * @param name defines the block name + */ + constructor(name69) { + super(name69, NodeMaterialBlockTargets.Neutral); + this.registerInput("rgba", NodeMaterialBlockConnectionPointTypes.Color4, true); + this.registerInput("rgb ", NodeMaterialBlockConnectionPointTypes.Color3, true); + this.registerOutput("rgb", NodeMaterialBlockConnectionPointTypes.Color3); + this.registerOutput("r", NodeMaterialBlockConnectionPointTypes.Float); + this.registerOutput("g", NodeMaterialBlockConnectionPointTypes.Float); + this.registerOutput("b", NodeMaterialBlockConnectionPointTypes.Float); + this.registerOutput("a", NodeMaterialBlockConnectionPointTypes.Float); + this.inputsAreExclusive = true; + } + /** + * Gets the current class name + * @returns the class name + */ + getClassName() { + return "ColorSplitterBlock"; + } + /** + * Gets the rgba component (input) + */ + get rgba() { + return this._inputs[0]; + } + /** + * Gets the rgb component (input) + */ + get rgbIn() { + return this._inputs[1]; + } + /** + * Gets the rgb component (output) + */ + get rgbOut() { + return this._outputs[0]; + } + /** + * Gets the r component (output) + */ + get r() { + return this._outputs[1]; + } + /** + * Gets the g component (output) + */ + get g() { + return this._outputs[2]; + } + /** + * Gets the b component (output) + */ + get b() { + return this._outputs[3]; + } + /** + * Gets the a component (output) + */ + get a() { + return this._outputs[4]; + } + _inputRename(name69) { + if (name69 === "rgb ") { + return "rgbIn"; + } + return name69; + } + _outputRename(name69) { + if (name69 === "rgb") { + return "rgbOut"; + } + return name69; + } + _buildBlock(state) { + super._buildBlock(state); + const input = this.rgba.isConnected ? this.rgba : this.rgbIn; + if (!input.isConnected) { + return; + } + const rgbOutput = this._outputs[0]; + const rOutput = this._outputs[1]; + const gOutput = this._outputs[2]; + const bOutput = this._outputs[3]; + const aOutput = this._outputs[4]; + if (rgbOutput.hasEndpoints) { + state.compilationString += this._declareOutput(rgbOutput, state) + ` = ${input.associatedVariableName}.rgb; `; -ShaderStore.IncludesShadersStore[name29] = shader29; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/depthPrePass.js -var name30 = "depthPrePass"; -var shader30 = `#ifdef DEPTHPREPASS -gl_FragColor=vec4(0.,0.,0.,1.0);return; -#endif + } + if (rOutput.hasEndpoints) { + state.compilationString += this._declareOutput(rOutput, state) + ` = ${input.associatedVariableName}.r; `; -ShaderStore.IncludesShadersStore[name30] = shader30; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/lightFragment.js -var name31 = "lightFragment"; -var shader31 = `#ifdef LIGHT{X} -#if defined(SHADOWONLY) || defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X}) && defined(LIGHTMAPNOSPECULAR{X}) -#else -#ifdef PBR -#ifdef SPOTLIGHT{X} -preInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW); -#elif defined(POINTLIGHT{X}) -preInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW); -#elif defined(HEMILIGHT{X}) -preInfo=computeHemisphericPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW); -#elif defined(DIRLIGHT{X}) -preInfo=computeDirectionalPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW); -#endif -preInfo.NdotV=NdotV; -#ifdef SPOTLIGHT{X} -#ifdef LIGHT_FALLOFF_GLTF{X} -preInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff_GLTF(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w); -#elif defined(LIGHT_FALLOFF_PHYSICAL{X}) -preInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);preInfo.attenuation*=computeDirectionalLightFalloff_Physical(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w); -#elif defined(LIGHT_FALLOFF_STANDARD{X}) -preInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);preInfo.attenuation*=computeDirectionalLightFalloff_Standard(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w); -#else -preInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w); -#endif -#elif defined(POINTLIGHT{X}) -#ifdef LIGHT_FALLOFF_GLTF{X} -preInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y); -#elif defined(LIGHT_FALLOFF_PHYSICAL{X}) -preInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared); -#elif defined(LIGHT_FALLOFF_STANDARD{X}) -preInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x); -#else -preInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y); -#endif -#else -preInfo.attenuation=1.0; -#endif -#ifdef HEMILIGHT{X} -preInfo.roughness=roughness; -#else -preInfo.roughness=adjustRoughnessFromLightProperties(roughness,light{X}.vLightSpecular.a,preInfo.lightDistance); -#endif -#ifdef IRIDESCENCE -preInfo.iridescenceIntensity=iridescenceIntensity; -#endif -#ifdef HEMILIGHT{X} -info.diffuse=computeHemisphericDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb,light{X}.vLightGround); -#elif defined(SS_TRANSLUCENCY) -info.diffuse=computeDiffuseAndTransmittedLighting(preInfo,light{X}.vLightDiffuse.rgb,subSurfaceOut.transmittance); -#else -info.diffuse=computeDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb); -#endif -#ifdef SPECULARTERM -#ifdef ANISOTROPIC -info.specular=computeAnisotropicSpecularLighting(preInfo,viewDirectionW,normalW,anisotropicOut.anisotropicTangent,anisotropicOut.anisotropicBitangent,anisotropicOut.anisotropy,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb); -#else -info.specular=computeSpecularLighting(preInfo,normalW,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb); -#endif -#endif -#ifdef SHEEN -#ifdef SHEEN_LINKWITHALBEDO -preInfo.roughness=sheenOut.sheenIntensity; -#else -#ifdef HEMILIGHT{X} -preInfo.roughness=sheenOut.sheenRoughness; -#else -preInfo.roughness=adjustRoughnessFromLightProperties(sheenOut.sheenRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance); -#endif -#endif -info.sheen=computeSheenLighting(preInfo,normalW,sheenOut.sheenColor,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb); -#endif -#ifdef CLEARCOAT -#ifdef HEMILIGHT{X} -preInfo.roughness=clearcoatOut.clearCoatRoughness; -#else -preInfo.roughness=adjustRoughnessFromLightProperties(clearcoatOut.clearCoatRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance); -#endif -info.clearCoat=computeClearCoatLighting(preInfo,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatAARoughnessFactors.x,clearcoatOut.clearCoatIntensity,light{X}.vLightDiffuse.rgb); -#ifdef CLEARCOAT_TINT -absorption=computeClearCoatLightingAbsorption(clearcoatOut.clearCoatNdotVRefract,preInfo.L,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatColor,clearcoatOut.clearCoatThickness,clearcoatOut.clearCoatIntensity);info.diffuse*=absorption; -#ifdef SPECULARTERM -info.specular*=absorption; -#endif -#endif -info.diffuse*=info.clearCoat.w; -#ifdef SPECULARTERM -info.specular*=info.clearCoat.w; -#endif -#ifdef SHEEN -info.sheen*=info.clearCoat.w; -#endif -#endif -#else -#ifdef SPOTLIGHT{X} -info=computeSpotLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDirection,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness); -#elif defined(HEMILIGHT{X}) -info=computeHemisphericLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightGround,glossiness); -#elif defined(POINTLIGHT{X}) || defined(DIRLIGHT{X}) -info=computeLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness); -#endif -#endif -#ifdef PROJECTEDLIGHTTEXTURE{X} -info.diffuse*=computeProjectionTextureDiffuseLighting(projectionLightSampler{X},textureProjectionMatrix{X}); -#endif -#endif -#ifdef SHADOW{X} -#ifdef SHADOWCSM{X} -for (int i=0; i=0.) {index{X}=i;break;}} -#ifdef SHADOWCSMUSESHADOWMAXZ{X} -if (index{X}>=0) -#endif -{ -#if defined(SHADOWPCF{X}) -#if defined(SHADOWLOWQUALITY{X}) -shadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#elif defined(SHADOWMEDIUMQUALITY{X}) -shadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#else -shadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#endif -#elif defined(SHADOWPCSS{X}) -#if defined(SHADOWLOWQUALITY{X}) -shadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X}); -#elif defined(SHADOWMEDIUMQUALITY{X}) -shadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X}); -#else -shadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X}); -#endif -#else -shadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#endif -#ifdef SHADOWCSMDEBUG{X} -shadowDebug{X}=vec3(shadow)*vCascadeColorsMultiplier{X}[index{X}]; -#endif -#ifndef SHADOWCSMNOBLEND{X} -float frustumLength=frustumLengths{X}[index{X}];float diffRatio=clamp(diff{X}/frustumLength,0.,1.)*cascadeBlendFactor{X};if (index{X}<(SHADOWCSMNUM_CASCADES{X}-1) && diffRatio<1.) -{index{X}+=1;float nextShadow=0.; -#if defined(SHADOWPCF{X}) -#if defined(SHADOWLOWQUALITY{X}) -nextShadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#elif defined(SHADOWMEDIUMQUALITY{X}) -nextShadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#else -nextShadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#endif -#elif defined(SHADOWPCSS{X}) -#if defined(SHADOWLOWQUALITY{X}) -nextShadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X}); -#elif defined(SHADOWMEDIUMQUALITY{X}) -nextShadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X}); -#else -nextShadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X}); -#endif -#else -nextShadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#endif -shadow=mix(nextShadow,shadow,diffRatio); -#ifdef SHADOWCSMDEBUG{X} -shadowDebug{X}=mix(vec3(nextShadow)*vCascadeColorsMultiplier{X}[index{X}],shadowDebug{X},diffRatio); -#endif -} -#endif -} -#elif defined(SHADOWCLOSEESM{X}) -#if defined(SHADOWCUBE{X}) -shadow=computeShadowWithCloseESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues); -#else -shadow=computeShadowWithCloseESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w); -#endif -#elif defined(SHADOWESM{X}) -#if defined(SHADOWCUBE{X}) -shadow=computeShadowWithESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues); -#else -shadow=computeShadowWithESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w); -#endif -#elif defined(SHADOWPOISSON{X}) -#if defined(SHADOWCUBE{X}) -shadow=computeShadowWithPoissonSamplingCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.depthValues); -#else -shadow=computeShadowWithPoissonSampling(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#endif -#elif defined(SHADOWPCF{X}) -#if defined(SHADOWLOWQUALITY{X}) -shadow=computeShadowWithPCF1(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#elif defined(SHADOWMEDIUMQUALITY{X}) -shadow=computeShadowWithPCF3(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#else -shadow=computeShadowWithPCF5(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#endif -#elif defined(SHADOWPCSS{X}) -#if defined(SHADOWLOWQUALITY{X}) -shadow=computeShadowWithPCSS16(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#elif defined(SHADOWMEDIUMQUALITY{X}) -shadow=computeShadowWithPCSS32(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#else -shadow=computeShadowWithPCSS64(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#endif -#else -#if defined(SHADOWCUBE{X}) -shadow=computeShadowCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.depthValues); -#else -shadow=computeShadow(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w); -#endif -#endif -#ifdef SHADOWONLY -#ifndef SHADOWINUSE -#define SHADOWINUSE -#endif -globalShadow+=shadow;shadowLightCount+=1.0; -#endif -#else -shadow=1.; -#endif -aggShadow+=shadow;numLights+=1.0; -#ifndef SHADOWONLY -#ifdef CUSTOMUSERLIGHTING -diffuseBase+=computeCustomDiffuseLighting(info,diffuseBase,shadow); -#ifdef SPECULARTERM -specularBase+=computeCustomSpecularLighting(info,specularBase,shadow); -#endif -#elif defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X}) -diffuseBase+=lightmapColor.rgb*shadow; -#ifdef SPECULARTERM -#ifndef LIGHTMAPNOSPECULAR{X} -specularBase+=info.specular*shadow*lightmapColor.rgb; -#endif -#endif -#ifdef CLEARCOAT -#ifndef LIGHTMAPNOSPECULAR{X} -clearCoatBase+=info.clearCoat.rgb*shadow*lightmapColor.rgb; -#endif -#endif -#ifdef SHEEN -#ifndef LIGHTMAPNOSPECULAR{X} -sheenBase+=info.sheen.rgb*shadow; -#endif -#endif -#else -#ifdef SHADOWCSMDEBUG{X} -diffuseBase+=info.diffuse*shadowDebug{X}; -#else -diffuseBase+=info.diffuse*shadow; -#endif -#ifdef SPECULARTERM -specularBase+=info.specular*shadow; -#endif -#ifdef CLEARCOAT -clearCoatBase+=info.clearCoat.rgb*shadow; -#endif -#ifdef SHEEN -sheenBase+=info.sheen.rgb*shadow; -#endif -#endif -#endif -#endif + } + if (gOutput.hasEndpoints) { + state.compilationString += this._declareOutput(gOutput, state) + ` = ${input.associatedVariableName}.g; `; -ShaderStore.IncludesShadersStore[name31] = shader31; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/logDepthFragment.js -var name32 = "logDepthFragment"; -var shader32 = `#ifdef LOGARITHMICDEPTH -gl_FragDepthEXT=log2(vFragmentDepth)*logarithmicDepthConstant*0.5; -#endif + } + if (bOutput.hasEndpoints) { + state.compilationString += this._declareOutput(bOutput, state) + ` = ${input.associatedVariableName}.b; `; -ShaderStore.IncludesShadersStore[name32] = shader32; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/fogFragment.js -var name33 = "fogFragment"; -var shader33 = `#ifdef FOG -float fog=CalcFogFactor(); -#ifdef PBR -fog=toLinearSpace(fog); -#endif -color.rgb=mix(vFogColor,color.rgb,fog); -#endif + } + if (aOutput.hasEndpoints) { + state.compilationString += this._declareOutput(aOutput, state) + ` = ${input.associatedVariableName}.a; `; -ShaderStore.IncludesShadersStore[name33] = shader33; + } + return this; + } +}; +RegisterClass("BABYLON.ColorSplitterBlock", ColorSplitterBlock); -// node_modules/@babylonjs/core/Shaders/ShadersInclude/oitFragment.js -var name34 = "oitFragment"; -var shader34 = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY -float fragDepth=gl_FragCoord.z; -#ifdef ORDER_INDEPENDENT_TRANSPARENCY_16BITS -uint halfFloat=packHalf2x16(vec2(fragDepth));vec2 full=unpackHalf2x16(halfFloat);fragDepth=full.x; -#endif -ivec2 fragCoord=ivec2(gl_FragCoord.xy);vec2 lastDepth=texelFetch(oitDepthSampler,fragCoord,0).rg;vec4 lastFrontColor=texelFetch(oitFrontColorSampler,fragCoord,0);depth.rg=vec2(-MAX_DEPTH);frontColor=lastFrontColor;backColor=vec4(0.0); -#ifdef USE_REVERSE_DEPTHBUFFER -float furthestDepth=-lastDepth.x;float nearestDepth=lastDepth.y; -#else -float nearestDepth=-lastDepth.x;float furthestDepth=lastDepth.y; -#endif -float alphaMultiplier=1.0-lastFrontColor.a; -#ifdef USE_REVERSE_DEPTHBUFFER -if (fragDepth>nearestDepth || fragDepthfurthestDepth) { -#endif -return;} -#ifdef USE_REVERSE_DEPTHBUFFER -if (fragDepthfurthestDepth) { -#else -if (fragDepth>nearestDepth && fragDepth { + this._indexBuffer = engine.createIndexBuffer(indices); + for (const key in this._vertexBuffers) { + const vertexBuffer = this._vertexBuffers[key]; + vertexBuffer._rebuild(); + } + }); + } + /** + * Sets the current viewport in normalized coordinates 0-1 + * @param viewport Defines the viewport to set (defaults to 0 0 1 1) + */ + setViewport(viewport = this._fullscreenViewport) { + this.engine.setViewport(viewport); + } + /** + * Binds the embedded attributes buffer to the effect. + * @param effect Defines the effect to bind the attributes for + */ + bindBuffers(effect) { + this.engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect); + } + /** + * Sets the current effect wrapper to use during draw. + * The effect needs to be ready before calling this api. + * This also sets the default full screen position attribute. + * @param effectWrapper Defines the effect to draw with + */ + applyEffectWrapper(effectWrapper) { + this.engine.setState(true); + this.engine.depthCullingState.depthTest = false; + this.engine.stencilState.stencilTest = false; + this.engine.enableEffect(effectWrapper._drawWrapper); + this.bindBuffers(effectWrapper.effect); + effectWrapper.onApplyObservable.notifyObservers({}); + } + /** + * Saves engine states + */ + saveStates() { + this._savedStateDepthTest = this.engine.depthCullingState.depthTest; + this._savedStateStencilTest = this.engine.stencilState.stencilTest; + } + /** + * Restores engine states + */ + restoreStates() { + this.engine.depthCullingState.depthTest = this._savedStateDepthTest; + this.engine.stencilState.stencilTest = this._savedStateStencilTest; + } + /** + * Draws a full screen quad. + */ + draw() { + this.engine.drawElementsType(0, 0, 6); + } + _isRenderTargetTexture(texture) { + return texture.renderTarget !== void 0; + } + /** + * renders one or more effects to a specified texture + * @param effectWrapper the effect to renderer + * @param outputTexture texture to draw to, if null it will render to the screen. + */ + render(effectWrapper, outputTexture = null) { + if (!effectWrapper.effect.isReady()) { + return; + } + this.saveStates(); + this.setViewport(); + const out = outputTexture === null ? null : this._isRenderTargetTexture(outputTexture) ? outputTexture.renderTarget : outputTexture; + if (out) { + this.engine.bindFramebuffer(out); + } + this.applyEffectWrapper(effectWrapper); + this.draw(); + if (out) { + this.engine.unBindFramebuffer(out); + } + this.restoreStates(); + } + /** + * Disposes of the effect renderer + */ + dispose() { + const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind]; + if (vertexBuffer) { + vertexBuffer.dispose(); + delete this._vertexBuffers[VertexBuffer.PositionKind]; + } + if (this._indexBuffer) { + this.engine._releaseBuffer(this._indexBuffer); + } + if (this._onContextRestoredObserver) { + this.engine.onContextRestoredObservable.remove(this._onContextRestoredObserver); + this._onContextRestoredObserver = null; + } + } +}; +var EffectWrapper = class { + /** + * The underlying effect + */ + get effect() { + return this._drawWrapper.effect; + } + set effect(effect) { + this._drawWrapper.effect = effect; + } + /** + * Creates an effect to be renderer + * @param creationOptions options to create the effect + */ + constructor(creationOptions) { + this.onApplyObservable = new Observable(); + let effectCreationOptions; + const uniformNames = creationOptions.uniformNames || []; + if (creationOptions.vertexShader) { + effectCreationOptions = { + fragmentSource: creationOptions.fragmentShader, + vertexSource: creationOptions.vertexShader, + spectorName: creationOptions.name || "effectWrapper" + }; + } else { + uniformNames.push("scale"); + effectCreationOptions = { + fragmentSource: creationOptions.fragmentShader, + vertex: "postprocess", + spectorName: creationOptions.name || "effectWrapper" + }; + this.onApplyObservable.add(() => { + this.effect.setFloat2("scale", 1, 1); + }); + } + const defines = creationOptions.defines ? creationOptions.defines.join("\n") : ""; + this._drawWrapper = new DrawWrapper(creationOptions.engine); + if (creationOptions.useShaderStore) { + effectCreationOptions.fragment = effectCreationOptions.fragmentSource; + if (!effectCreationOptions.vertex) { + effectCreationOptions.vertex = effectCreationOptions.vertexSource; + } + delete effectCreationOptions.fragmentSource; + delete effectCreationOptions.vertexSource; + this.effect = creationOptions.engine.createEffect(effectCreationOptions, creationOptions.attributeNames || ["position"], uniformNames, creationOptions.samplerNames, defines, void 0, creationOptions.onCompiled, void 0, void 0, creationOptions.shaderLanguage); + } else { + this.effect = new Effect(effectCreationOptions, creationOptions.attributeNames || ["position"], uniformNames, creationOptions.samplerNames, creationOptions.engine, defines, void 0, creationOptions.onCompiled, void 0, void 0, void 0, creationOptions.shaderLanguage); + this._onContextRestoredObserver = creationOptions.engine.onContextRestoredObservable.add(() => { + this.effect._pipelineContext = null; + this.effect._prepareEffect(); + }); + } + } + /** + * Disposes of the effect wrapper + */ + dispose() { + if (this._onContextRestoredObserver) { + this.effect.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver); + this._onContextRestoredObserver = null; + } + this.effect.dispose(); + } +}; -// node_modules/@babylonjs/core/Shaders/default.fragment.js -var name35 = "defaultPixelShader"; -var shader35 = `#include<__decl__defaultFragment> -#if defined(BUMP) || !defined(NORMAL) -#extension GL_OES_standard_derivatives : enable -#endif -#include[SCENE_MRT_COUNT] -#include -#define CUSTOM_FRAGMENT_BEGIN -#ifdef LOGARITHMICDEPTH -#extension GL_EXT_frag_depth : enable -#endif -varying vec3 vPositionW; -#ifdef NORMAL -varying vec3 vNormalW; -#endif -#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES) -varying vec4 vColor; -#endif -#include[1..7] -#include -#include<__decl__lightFragment>[0..maxSimultaneousLights] -#include -#include -#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse,_SAMPLERNAME_,diffuse) -#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_SAMPLERNAME_,ambient) -#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_SAMPLERNAME_,opacity) -#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_SAMPLERNAME_,emissive) -#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_SAMPLERNAME_,lightmap) -#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_SAMPLERNAME_,decal) -#ifdef REFRACTION -#ifdef REFRACTIONMAP_3D -uniform samplerCube refractionCubeSampler; -#else -uniform sampler2D refraction2DSampler; -#endif -#endif -#if defined(SPECULARTERM) -#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular,_SAMPLERNAME_,specular) -#endif -#include -#ifdef REFLECTION -#ifdef REFLECTIONMAP_3D -uniform samplerCube reflectionCubeSampler; -#else -uniform sampler2D reflection2DSampler; -#endif -#ifdef REFLECTIONMAP_SKYBOX -varying vec3 vPositionUVW; -#else -#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED) -varying vec3 vDirectionW; -#endif -#endif -#include -#endif -#include -#include -#include -#include -#include -#include -#include +// node_modules/@babylonjs/core/Shaders/pass.fragment.js +var name67 = "passPixelShader"; +var shader67 = `varying vec2 vUV;uniform sampler2D textureSampler; #define CUSTOM_FRAGMENT_DEFINITIONS -void main(void) { -#define CUSTOM_FRAGMENT_MAIN_BEGIN -#include -vec3 viewDirectionW=normalize(vEyePosition.xyz-vPositionW);vec4 baseColor=vec4(1.,1.,1.,1.);vec3 diffuseColor=vDiffuseColor.rgb;float alpha=vDiffuseColor.a; -#ifdef NORMAL -vec3 normalW=normalize(vNormalW); -#else -vec3 normalW=normalize(-cross(dFdx(vPositionW),dFdy(vPositionW))); -#endif -#include -#ifdef TWOSIDEDLIGHTING -normalW=gl_FrontFacing ? normalW : -normalW; -#endif -#ifdef DIFFUSE -baseColor=texture2D(diffuseSampler,vDiffuseUV+uvOffset); -#if defined(ALPHATEST) && !defined(ALPHATEST_AFTERALLALPHACOMPUTATIONS) -if (baseColor.a(surfaceAlbedo,baseColor,GAMMADECAL,_GAMMADECAL_NOTUSED_) -#endif -#include -#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES) -baseColor.rgb*=vColor.rgb; -#endif -#ifdef DETAIL -baseColor.rgb=baseColor.rgb*2.0*mix(0.5,detailColor.r,vDetailInfos.y); -#endif -#if defined(DECAL) && defined(DECAL_AFTER_DETAIL) -vec4 decalColor=texture2D(decalSampler,vDecalUV+uvOffset); -#include(surfaceAlbedo,baseColor,GAMMADECAL,_GAMMADECAL_NOTUSED_) -#endif -#define CUSTOM_FRAGMENT_UPDATE_DIFFUSE -vec3 baseAmbientColor=vec3(1.,1.,1.); -#ifdef AMBIENT -baseAmbientColor=texture2D(ambientSampler,vAmbientUV+uvOffset).rgb*vAmbientInfos.y; -#endif -#define CUSTOM_FRAGMENT_BEFORE_LIGHTS -#ifdef SPECULARTERM -float glossiness=vSpecularColor.a;vec3 specularColor=vSpecularColor.rgb; -#ifdef SPECULAR -vec4 specularMapColor=texture2D(specularSampler,vSpecularUV+uvOffset);specularColor=specularMapColor.rgb; -#ifdef GLOSSINESS -glossiness=glossiness*specularMapColor.a; -#endif -#endif -#else -float glossiness=0.; -#endif -vec3 diffuseBase=vec3(0.,0.,0.);lightingInfo info; -#ifdef SPECULARTERM -vec3 specularBase=vec3(0.,0.,0.); -#endif -float shadow=1.;float aggShadow=0.;float numLights=0.; -#ifdef LIGHTMAP -vec4 lightmapColor=texture2D(lightmapSampler,vLightmapUV+uvOffset); -#ifdef RGBDLIGHTMAP -lightmapColor.rgb=fromRGBD(lightmapColor); -#endif -lightmapColor.rgb*=vLightmapInfos.y; -#endif -#include[0..maxSimultaneousLights] -aggShadow=aggShadow/numLights;vec4 refractionColor=vec4(0.,0.,0.,1.); -#ifdef REFRACTION -vec3 refractionVector=normalize(refract(-viewDirectionW,normalW,vRefractionInfos.y)); -#ifdef REFRACTIONMAP_3D -#ifdef USE_LOCAL_REFRACTIONMAP_CUBIC -refractionVector=parallaxCorrectNormal(vPositionW,refractionVector,vRefractionSize,vRefractionPosition); -#endif -refractionVector.y=refractionVector.y*vRefractionInfos.w;vec4 refractionLookup=textureCube(refractionCubeSampler,refractionVector);if (dot(refractionVector,viewDirectionW)<1.0) {refractionColor=refractionLookup;} -#else -vec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*vRefractionInfos.z,1.0)));vec2 refractionCoords=vRefractionUVW.xy/vRefractionUVW.z;refractionCoords.y=1.0-refractionCoords.y;refractionColor=texture2D(refraction2DSampler,refractionCoords); -#endif -#ifdef RGBDREFRACTION -refractionColor.rgb=fromRGBD(refractionColor); -#endif -#ifdef IS_REFRACTION_LINEAR -refractionColor.rgb=toGammaSpace(refractionColor.rgb); -#endif -refractionColor.rgb*=vRefractionInfos.x; -#endif -vec4 reflectionColor=vec4(0.,0.,0.,1.); -#ifdef REFLECTION -vec3 vReflectionUVW=computeReflectionCoords(vec4(vPositionW,1.0),normalW); -#ifdef REFLECTIONMAP_OPPOSITEZ -vReflectionUVW.z*=-1.0; -#endif -#ifdef REFLECTIONMAP_3D -#ifdef ROUGHNESS -float bias=vReflectionInfos.y; -#ifdef SPECULARTERM -#ifdef SPECULAR -#ifdef GLOSSINESS -bias*=(1.0-specularMapColor.a); -#endif -#endif -#endif -reflectionColor=textureCube(reflectionCubeSampler,vReflectionUVW,bias); -#else -reflectionColor=textureCube(reflectionCubeSampler,vReflectionUVW); -#endif -#else -vec2 coords=vReflectionUVW.xy; -#ifdef REFLECTIONMAP_PROJECTION -coords/=vReflectionUVW.z; -#endif -coords.y=1.0-coords.y;reflectionColor=texture2D(reflection2DSampler,coords); -#endif -#ifdef RGBDREFLECTION -reflectionColor.rgb=fromRGBD(reflectionColor); -#endif -#ifdef IS_REFLECTION_LINEAR -reflectionColor.rgb=toGammaSpace(reflectionColor.rgb); -#endif -reflectionColor.rgb*=vReflectionInfos.x; -#ifdef REFLECTIONFRESNEL -float reflectionFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,reflectionRightColor.a,reflectionLeftColor.a); -#ifdef REFLECTIONFRESNELFROMSPECULAR -#ifdef SPECULARTERM -reflectionColor.rgb*=specularColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb; -#else -reflectionColor.rgb*=reflectionLeftColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb; -#endif -#else -reflectionColor.rgb*=reflectionLeftColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb; -#endif -#endif -#endif -#ifdef REFRACTIONFRESNEL -float refractionFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,refractionRightColor.a,refractionLeftColor.a);refractionColor.rgb*=refractionLeftColor.rgb*(1.0-refractionFresnelTerm)+refractionFresnelTerm*refractionRightColor.rgb; -#endif -#ifdef OPACITY -vec4 opacityMap=texture2D(opacitySampler,vOpacityUV+uvOffset); -#ifdef OPACITYRGB -opacityMap.rgb=opacityMap.rgb*vec3(0.3,0.59,0.11);alpha*=(opacityMap.x+opacityMap.y+opacityMap.z)* vOpacityInfos.y; -#else -alpha*=opacityMap.a*vOpacityInfos.y; -#endif -#endif -#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES) -alpha*=vColor.a; -#endif -#ifdef OPACITYFRESNEL -float opacityFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,opacityParts.z,opacityParts.w);alpha+=opacityParts.x*(1.0-opacityFresnelTerm)+opacityFresnelTerm*opacityParts.y; -#endif -#ifdef ALPHATEST -#ifdef ALPHATEST_AFTERALLALPHACOMPUTATIONS -if (alpha -#include -#ifdef IMAGEPROCESSINGPOSTPROCESS -color.rgb=toLinearSpace(color.rgb); -#else -#ifdef IMAGEPROCESSING -color.rgb=toLinearSpace(color.rgb);color=applyImageProcessing(color); -#endif -#endif -color.a*=visibility; -#ifdef PREMULTIPLYALPHA -color.rgb*=color.a; -#endif -#define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR -#ifdef PREPASS -float writeGeometryInfo=color.a>0.4 ? 1.0 : 0.0;gl_FragData[0]=color; -#ifdef PREPASS_POSITION -gl_FragData[PREPASS_POSITION_INDEX]=vec4(vPositionW,writeGeometryInfo); -#endif -#ifdef PREPASS_VELOCITY -vec2 a=(vCurrentPosition.xy/vCurrentPosition.w)*0.5+0.5;vec2 b=(vPreviousPosition.xy/vPreviousPosition.w)*0.5+0.5;vec2 velocity=abs(a-b);velocity=vec2(pow(velocity.x,1.0/3.0),pow(velocity.y,1.0/3.0))*sign(a-b)*0.5+0.5;gl_FragData[PREPASS_VELOCITY_INDEX]=vec4(velocity,0.0,writeGeometryInfo); -#endif -#ifdef PREPASS_IRRADIANCE -gl_FragData[PREPASS_IRRADIANCE_INDEX]=vec4(0.0,0.0,0.0,writeGeometryInfo); -#endif -#ifdef PREPASS_DEPTH -gl_FragData[PREPASS_DEPTH_INDEX]=vec4(vViewPos.z,0.0,0.0,writeGeometryInfo); -#endif -#ifdef PREPASS_NORMAL -#ifdef PREPASS_NORMAL_WORLDSPACE -gl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalW,writeGeometryInfo); -#else -gl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalize((view*vec4(normalW,0.0)).rgb),writeGeometryInfo); -#endif -#endif -#ifdef PREPASS_ALBEDO_SQRT -gl_FragData[PREPASS_ALBEDO_SQRT_INDEX]=vec4(0.0,0.0,0.0,writeGeometryInfo); -#endif -#ifdef PREPASS_REFLECTIVITY -#if defined(SPECULARTERM) -#if defined(SPECULAR) -gl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(toLinearSpace(specularMapColor))*writeGeometryInfo; -#else -gl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(toLinearSpace(specularColor),1.0)*writeGeometryInfo; -#endif -#else -gl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(0.0,0.0,0.0,1.0)*writeGeometryInfo; -#endif -#endif -#endif -#if !defined(PREPASS) || defined(WEBGL2) -gl_FragColor=color; -#endif -#include -#if ORDER_INDEPENDENT_TRANSPARENCY -if (fragDepth==nearestDepth) {frontColor.rgb+=color.rgb*color.a*alphaMultiplier;frontColor.a=1.0-alphaMultiplier*(1.0-color.a);} else {backColor+=color;} -#endif -#define CUSTOM_FRAGMENT_MAIN_END -} -`; -ShaderStore.ShadersStore[name35] = shader35; +void main(void) +{gl_FragColor=texture2D(textureSampler,vUV);}`; +ShaderStore.ShadersStore[name67] = shader67; +var passPixelShader = { name: name67, shader: shader67 }; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/decalVertexDeclaration.js -var name36 = "decalVertexDeclaration"; -var shader36 = `#ifdef DECAL -uniform vec4 vDecalInfos;uniform mat4 decalMatrix; -#endif -`; -ShaderStore.IncludesShadersStore[name36] = shader36; +// node_modules/@babylonjs/core/Misc/dumpTools.js +var DumpTools = class _DumpTools { + static _CreateDumpRenderer() { + if (!_DumpTools._DumpToolsEngine) { + let canvas; + let engine = null; + const options = { + preserveDrawingBuffer: true, + depth: false, + stencil: false, + alpha: true, + premultipliedAlpha: false, + antialias: false, + failIfMajorPerformanceCaveat: false + }; + try { + canvas = new OffscreenCanvas(100, 100); + engine = new ThinEngine(canvas, false, options); + } catch (e) { + canvas = document.createElement("canvas"); + engine = new ThinEngine(canvas, false, options); + } + engine.getCaps().parallelShaderCompile = void 0; + const renderer = new EffectRenderer(engine); + const wrapper = new EffectWrapper({ + engine, + name: passPixelShader.name, + fragmentShader: passPixelShader.shader, + samplerNames: ["textureSampler"] + }); + _DumpTools._DumpToolsEngine = { + canvas, + engine, + renderer, + wrapper + }; + } + return _DumpTools._DumpToolsEngine; + } + /** + * Dumps the current bound framebuffer + * @param width defines the rendering width + * @param height defines the rendering height + * @param engine defines the hosting engine + * @param successCallback defines the callback triggered once the data are available + * @param mimeType defines the mime type of the result + * @param fileName defines the filename to download. If present, the result will automatically be downloaded + * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + * @returns a void promise + */ + static async DumpFramebuffer(width, height, engine, successCallback, mimeType = "image/png", fileName, quality) { + const bufferView = await engine.readPixels(0, 0, width, height); + const data = new Uint8Array(bufferView.buffer); + _DumpTools.DumpData(width, height, data, successCallback, mimeType, fileName, true, void 0, quality); + } + /** + * Dumps an array buffer + * @param width defines the rendering width + * @param height defines the rendering height + * @param data the data array + * @param mimeType defines the mime type of the result + * @param fileName defines the filename to download. If present, the result will automatically be downloaded + * @param invertY true to invert the picture in the Y dimension + * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string + * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + * @returns a promise that resolve to the final data + */ + static DumpDataAsync(width, height, data, mimeType = "image/png", fileName, invertY = false, toArrayBuffer = false, quality) { + return new Promise((resolve) => { + _DumpTools.DumpData(width, height, data, (result) => resolve(result), mimeType, fileName, invertY, toArrayBuffer, quality); + }); + } + /** + * Dumps an array buffer + * @param width defines the rendering width + * @param height defines the rendering height + * @param data the data array + * @param successCallback defines the callback triggered once the data are available + * @param mimeType defines the mime type of the result + * @param fileName defines the filename to download. If present, the result will automatically be downloaded + * @param invertY true to invert the picture in the Y dimension + * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string + * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter. + */ + static DumpData(width, height, data, successCallback, mimeType = "image/png", fileName, invertY = false, toArrayBuffer = false, quality) { + const renderer = _DumpTools._CreateDumpRenderer(); + renderer.engine.setSize(width, height, true); + if (data instanceof Float32Array) { + const data2 = new Uint8Array(data.length); + let n = data.length; + while (n--) { + const v = data[n]; + data2[n] = Math.round(Scalar.Clamp(v) * 255); + } + data = data2; + } + const texture = renderer.engine.createRawTexture(data, width, height, 5, false, !invertY, 1); + renderer.renderer.setViewport(); + renderer.renderer.applyEffectWrapper(renderer.wrapper); + renderer.wrapper.effect._bindTexture("textureSampler", texture); + renderer.renderer.draw(); + if (toArrayBuffer) { + Tools.ToBlob(renderer.canvas, (blob) => { + const fileReader = new FileReader(); + fileReader.onload = (event) => { + const arrayBuffer = event.target.result; + if (successCallback) { + successCallback(arrayBuffer); + } + }; + fileReader.readAsArrayBuffer(blob); + }, mimeType, quality); + } else { + Tools.EncodeScreenshotCanvasData(renderer.canvas, successCallback, mimeType, fileName, quality); + } + texture.dispose(); + } + /** + * Dispose the dump tools associated resources + */ + static Dispose() { + if (_DumpTools._DumpToolsEngine) { + _DumpTools._DumpToolsEngine.wrapper.dispose(); + _DumpTools._DumpToolsEngine.renderer.dispose(); + _DumpTools._DumpToolsEngine.engine.dispose(); + } + _DumpTools._DumpToolsEngine = null; + } +}; +var initSideEffects2 = () => { + Tools.DumpData = DumpTools.DumpData; + Tools.DumpDataAsync = DumpTools.DumpDataAsync; + Tools.DumpFramebuffer = DumpTools.DumpFramebuffer; +}; +initSideEffects2(); + +// node_modules/@babylonjs/core/Engines/Extensions/engine.renderTargetCube.js +ThinEngine.prototype.createRenderTargetCubeTexture = function(size, options) { + const rtWrapper = this._createHardwareRenderTargetWrapper(false, true, size); + const fullOptions = { + generateMipMaps: true, + generateDepthBuffer: true, + generateStencilBuffer: false, + type: 0, + samplingMode: 3, + format: 5, + ...options + }; + fullOptions.generateStencilBuffer = fullOptions.generateDepthBuffer && fullOptions.generateStencilBuffer; + if (fullOptions.type === 1 && !this._caps.textureFloatLinearFiltering) { + fullOptions.samplingMode = 1; + } else if (fullOptions.type === 2 && !this._caps.textureHalfFloatLinearFiltering) { + fullOptions.samplingMode = 1; + } + const gl = this._gl; + const texture = new InternalTexture(this, InternalTextureSource.RenderTarget); + this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, texture, true); + const filters = this._getSamplingParameters(fullOptions.samplingMode, fullOptions.generateMipMaps); + if (fullOptions.type === 1 && !this._caps.textureFloat) { + fullOptions.type = 0; + Logger.Warn("Float textures are not supported. Cube render target forced to TEXTURETYPE_UNESIGNED_BYTE type"); + } + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, filters.mag); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, filters.min); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + for (let face = 0; face < 6; face++) { + gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, this._getRGBABufferInternalSizedFormat(fullOptions.type, fullOptions.format), size, size, 0, this._getInternalFormat(fullOptions.format), this._getWebGLTextureType(fullOptions.type), null); + } + const framebuffer = gl.createFramebuffer(); + this._bindUnboundFramebuffer(framebuffer); + rtWrapper._depthStencilBuffer = this._setupFramebufferDepthAttachments(fullOptions.generateStencilBuffer, fullOptions.generateDepthBuffer, size, size); + if (fullOptions.generateMipMaps) { + gl.generateMipmap(gl.TEXTURE_CUBE_MAP); + } + this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, null); + this._bindUnboundFramebuffer(null); + rtWrapper._framebuffer = framebuffer; + rtWrapper._generateDepthBuffer = fullOptions.generateDepthBuffer; + rtWrapper._generateStencilBuffer = fullOptions.generateStencilBuffer; + texture.width = size; + texture.height = size; + texture.isReady = true; + texture.isCube = true; + texture.samples = 1; + texture.generateMipMaps = fullOptions.generateMipMaps; + texture.samplingMode = fullOptions.samplingMode; + texture.type = fullOptions.type; + texture.format = fullOptions.format; + this._internalTexturesCache.push(texture); + rtWrapper.setTextures(texture); + return rtWrapper; +}; + +// node_modules/@babylonjs/core/Materials/Textures/renderTargetTexture.js +var RenderTargetTexture = class _RenderTargetTexture extends Texture { + /** + * Use this list to define the list of mesh you want to render. + */ + get renderList() { + return this._renderList; + } + set renderList(value) { + if (this._unObserveRenderList) { + this._unObserveRenderList(); + this._unObserveRenderList = null; + } + if (value) { + this._unObserveRenderList = _ObserveArray(value, this._renderListHasChanged); + } + this._renderList = value; + } + /** + * Post-processes for this render target + */ + get postProcesses() { + return this._postProcesses; + } + get _prePassEnabled() { + return !!this._prePassRenderTarget && this._prePassRenderTarget.enabled; + } + /** + * Set a after unbind callback in the texture. + * This has been kept for backward compatibility and use of onAfterUnbindObservable is recommended. + */ + set onAfterUnbind(callback) { + if (this._onAfterUnbindObserver) { + this.onAfterUnbindObservable.remove(this._onAfterUnbindObserver); + } + this._onAfterUnbindObserver = this.onAfterUnbindObservable.add(callback); + } + /** + * Set a before render callback in the texture. + * This has been kept for backward compatibility and use of onBeforeRenderObservable is recommended. + */ + set onBeforeRender(callback) { + if (this._onBeforeRenderObserver) { + this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver); + } + this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback); + } + /** + * Set a after render callback in the texture. + * This has been kept for backward compatibility and use of onAfterRenderObservable is recommended. + */ + set onAfterRender(callback) { + if (this._onAfterRenderObserver) { + this.onAfterRenderObservable.remove(this._onAfterRenderObserver); + } + this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback); + } + /** + * Set a clear callback in the texture. + * This has been kept for backward compatibility and use of onClearObservable is recommended. + */ + set onClear(callback) { + if (this._onClearObserver) { + this.onClearObservable.remove(this._onClearObserver); + } + this._onClearObserver = this.onClearObservable.add(callback); + } + /** + * Gets the render pass ids used by the render target texture. For a single render target the array length will be 1, for a cube texture it will be 6 and for + * a 2D texture array it will return an array of ids the size of the 2D texture array + */ + get renderPassIds() { + return this._renderPassIds; + } + /** + * Gets the current value of the refreshId counter + */ + get currentRefreshId() { + return this._currentRefreshId; + } + /** + * Sets a specific material to be used to render a mesh/a list of meshes in this render target texture + * @param mesh mesh or array of meshes + * @param material material or array of materials to use for this render pass. If undefined is passed, no specific material will be used but the regular material instead (mesh.material). It's possible to provide an array of materials to use a different material for each rendering in the case of a cube texture (6 rendering) and a 2D texture array (as many rendering as the length of the array) + */ + setMaterialForRendering(mesh, material) { + let meshes; + if (!Array.isArray(mesh)) { + meshes = [mesh]; + } else { + meshes = mesh; + } + for (let j = 0; j < meshes.length; ++j) { + for (let i = 0; i < this._renderPassIds.length; ++i) { + meshes[j].setMaterialForRenderPass(this._renderPassIds[i], material !== void 0 ? Array.isArray(material) ? material[i] : material : void 0); + } + } + } + /** + * Define if the texture has multiple draw buffers or if false a single draw buffer. + */ + get isMulti() { + var _a; + return ((_a = this._renderTarget) == null ? void 0 : _a.isMulti) ?? false; + } + /** + * Gets render target creation options that were used. + */ + get renderTargetOptions() { + return this._renderTargetOptions; + } + /** + * Gets the render target wrapper associated with this render target + */ + get renderTarget() { + return this._renderTarget; + } + _onRatioRescale() { + if (this._sizeRatio) { + this.resize(this._initialSizeParameter); + } + } + /** + * Gets or sets the size of the bounding box associated with the texture (when in cube mode) + * When defined, the cubemap will switch to local mode + * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity + * @example https://www.babylonjs-playground.com/#RNASML + */ + set boundingBoxSize(value) { + if (this._boundingBoxSize && this._boundingBoxSize.equals(value)) { + return; + } + this._boundingBoxSize = value; + const scene = this.getScene(); + if (scene) { + scene.markAllMaterialsAsDirty(1); + } + } + get boundingBoxSize() { + return this._boundingBoxSize; + } + /** + * In case the RTT has been created with a depth texture, get the associated + * depth texture. + * Otherwise, return null. + */ + get depthStencilTexture() { + var _a; + return ((_a = this._renderTarget) == null ? void 0 : _a._depthStencilTexture) ?? null; + } + /** @internal */ + constructor(name69, size, scene, generateMipMaps = false, doNotChangeAspectRatio = true, type = 0, isCube = false, samplingMode = Texture.TRILINEAR_SAMPLINGMODE, generateDepthBuffer = true, generateStencilBuffer = false, isMulti = false, format = 5, delayAllocation = false, samples, creationFlags, noColorAttachment = false, useSRGBBuffer = false) { + let colorAttachment = void 0; + let gammaSpace = true; + if (typeof generateMipMaps === "object") { + const options = generateMipMaps; + generateMipMaps = !!options.generateMipMaps; + doNotChangeAspectRatio = options.doNotChangeAspectRatio ?? true; + type = options.type ?? 0; + isCube = !!options.isCube; + samplingMode = options.samplingMode ?? Texture.TRILINEAR_SAMPLINGMODE; + generateDepthBuffer = options.generateDepthBuffer ?? true; + generateStencilBuffer = !!options.generateStencilBuffer; + isMulti = !!options.isMulti; + format = options.format ?? 5; + delayAllocation = !!options.delayAllocation; + samples = options.samples; + creationFlags = options.creationFlags; + noColorAttachment = !!options.noColorAttachment; + useSRGBBuffer = !!options.useSRGBBuffer; + colorAttachment = options.colorAttachment; + gammaSpace = options.gammaSpace ?? gammaSpace; + } + super(null, scene, !generateMipMaps, void 0, samplingMode, void 0, void 0, void 0, void 0, format); + this._unObserveRenderList = null; + this._renderListHasChanged = (_functionName, previousLength) => { + var _a; + const newLength = this._renderList ? this._renderList.length : 0; + if (previousLength === 0 && newLength > 0 || newLength === 0) { + (_a = this.getScene()) == null ? void 0 : _a.meshes.forEach((mesh) => { + mesh._markSubMeshesAsLightDirty(); + }); + } + }; + this.renderParticles = true; + this.renderSprites = false; + this.forceLayerMaskCheck = false; + this.ignoreCameraViewport = false; + this.onBeforeBindObservable = new Observable(); + this.onAfterUnbindObservable = new Observable(); + this.onBeforeRenderObservable = new Observable(); + this.onAfterRenderObservable = new Observable(); + this.onClearObservable = new Observable(); + this.onResizeObservable = new Observable(); + this._cleared = false; + this.skipInitialClear = false; + this._currentRefreshId = -1; + this._refreshRate = 1; + this._samples = 1; + this._canRescale = true; + this._renderTarget = null; + this.boundingBoxPosition = Vector3.Zero(); + scene = this.getScene(); + if (!scene) { + return; + } + const engine = this.getScene().getEngine(); + this._gammaSpace = gammaSpace; + this._coordinatesMode = Texture.PROJECTION_MODE; + this.renderList = []; + this.name = name69; + this.isRenderTarget = true; + this._initialSizeParameter = size; + this._renderPassIds = []; + this._isCubeData = isCube; + this._processSizeParameter(size); + this.renderPassId = this._renderPassIds[0]; + this._resizeObserver = engine.onResizeObservable.add(() => { + }); + this._generateMipMaps = generateMipMaps ? true : false; + this._doNotChangeAspectRatio = doNotChangeAspectRatio; + this._renderingManager = new RenderingManager(scene); + this._renderingManager._useSceneAutoClearSetup = true; + if (isMulti) { + return; + } + this._renderTargetOptions = { + generateMipMaps, + type, + format: this._format ?? void 0, + samplingMode: this.samplingMode, + generateDepthBuffer, + generateStencilBuffer, + samples, + creationFlags, + noColorAttachment, + useSRGBBuffer, + colorAttachment, + label: this.name + }; + if (this.samplingMode === Texture.NEAREST_SAMPLINGMODE) { + this.wrapU = Texture.CLAMP_ADDRESSMODE; + this.wrapV = Texture.CLAMP_ADDRESSMODE; + } + if (!delayAllocation) { + if (isCube) { + this._renderTarget = scene.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions); + this.coordinatesMode = Texture.INVCUBIC_MODE; + this._textureMatrix = Matrix.Identity(); + } else { + this._renderTarget = scene.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions); + } + this._texture = this._renderTarget.texture; + if (samples !== void 0) { + this.samples = samples; + } + } + } + /** + * Creates a depth stencil texture. + * This is only available in WebGL 2 or with the depth texture extension available. + * @param comparisonFunction Specifies the comparison function to set on the texture. If 0 or undefined, the texture is not in comparison mode (default: 0) + * @param bilinearFiltering Specifies whether or not bilinear filtering is enable on the texture (default: true) + * @param generateStencil Specifies whether or not a stencil should be allocated in the texture (default: false) + * @param samples sample count of the depth/stencil texture (default: 1) + * @param format format of the depth texture (default: 14) + */ + createDepthStencilTexture(comparisonFunction = 0, bilinearFiltering = true, generateStencil = false, samples = 1, format = 14) { + var _a; + (_a = this._renderTarget) == null ? void 0 : _a.createDepthStencilTexture(comparisonFunction, bilinearFiltering, generateStencil, samples, format); + } + _releaseRenderPassId() { + if (this._scene) { + const engine = this._scene.getEngine(); + for (let i = 0; i < this._renderPassIds.length; ++i) { + engine.releaseRenderPassId(this._renderPassIds[i]); + } + } + this._renderPassIds = []; + } + _createRenderPassId() { + this._releaseRenderPassId(); + const engine = this._scene.getEngine(); + const numPasses = this._isCubeData ? 6 : this.getRenderLayers() || 1; + for (let i = 0; i < numPasses; ++i) { + this._renderPassIds[i] = engine.createRenderPassId(`RenderTargetTexture - ${this.name}#${i}`); + } + } + _processSizeParameter(size, createRenderPassIds = true) { + if (size.ratio) { + this._sizeRatio = size.ratio; + const engine = this._getEngine(); + this._size = { + width: this._bestReflectionRenderTargetDimension(engine.getRenderWidth(), this._sizeRatio), + height: this._bestReflectionRenderTargetDimension(engine.getRenderHeight(), this._sizeRatio) + }; + } else { + this._size = size; + } + if (createRenderPassIds) { + this._createRenderPassId(); + } + } + /** + * Define the number of samples to use in case of MSAA. + * It defaults to one meaning no MSAA has been enabled. + */ + get samples() { + var _a; + return ((_a = this._renderTarget) == null ? void 0 : _a.samples) ?? this._samples; + } + set samples(value) { + if (this._renderTarget) { + this._samples = this._renderTarget.setSamples(value); + } + } + /** + * Resets the refresh counter of the texture and start bak from scratch. + * Could be useful to regenerate the texture if it is setup to render only once. + */ + resetRefreshCounter() { + this._currentRefreshId = -1; + } + /** + * Define the refresh rate of the texture or the rendering frequency. + * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on... + */ + get refreshRate() { + return this._refreshRate; + } + set refreshRate(value) { + this._refreshRate = value; + this.resetRefreshCounter(); + } + /** + * Adds a post process to the render target rendering passes. + * @param postProcess define the post process to add + */ + addPostProcess(postProcess) { + if (!this._postProcessManager) { + const scene = this.getScene(); + if (!scene) { + return; + } + this._postProcessManager = new PostProcessManager(scene); + this._postProcesses = new Array(); + } + this._postProcesses.push(postProcess); + this._postProcesses[0].autoClear = false; + } + /** + * Clear all the post processes attached to the render target + * @param dispose define if the cleared post processes should also be disposed (false by default) + */ + clearPostProcesses(dispose = false) { + if (!this._postProcesses) { + return; + } + if (dispose) { + for (const postProcess of this._postProcesses) { + postProcess.dispose(); + } + } + this._postProcesses = []; + } + /** + * Remove one of the post process from the list of attached post processes to the texture + * @param postProcess define the post process to remove from the list + */ + removePostProcess(postProcess) { + if (!this._postProcesses) { + return; + } + const index = this._postProcesses.indexOf(postProcess); + if (index === -1) { + return; + } + this._postProcesses.splice(index, 1); + if (this._postProcesses.length > 0) { + this._postProcesses[0].autoClear = false; + } + } + /** @internal */ + _shouldRender() { + if (this._currentRefreshId === -1) { + this._currentRefreshId = 1; + return true; + } + if (this.refreshRate === this._currentRefreshId) { + this._currentRefreshId = 1; + return true; + } + this._currentRefreshId++; + return false; + } + /** + * Gets the actual render size of the texture. + * @returns the width of the render size + */ + getRenderSize() { + return this.getRenderWidth(); + } + /** + * Gets the actual render width of the texture. + * @returns the width of the render size + */ + getRenderWidth() { + if (this._size.width) { + return this._size.width; + } + return this._size; + } + /** + * Gets the actual render height of the texture. + * @returns the height of the render size + */ + getRenderHeight() { + if (this._size.width) { + return this._size.height; + } + return this._size; + } + /** + * Gets the actual number of layers of the texture or, in the case of a 3D texture, return the depth. + * @returns the number of layers + */ + getRenderLayers() { + const layers = this._size.layers; + if (layers) { + return layers; + } + const depth = this._size.depth; + if (depth) { + return depth; + } + return 0; + } + /** + * Don't allow this render target texture to rescale. Mainly used to prevent rescaling by the scene optimizer. + */ + disableRescaling() { + this._canRescale = false; + } + /** + * Get if the texture can be rescaled or not. + */ + get canRescale() { + return this._canRescale; + } + /** + * Resize the texture using a ratio. + * @param ratio the ratio to apply to the texture size in order to compute the new target size + */ + scale(ratio) { + const newSize = Math.max(1, this.getRenderSize() * ratio); + this.resize(newSize); + } + /** + * Get the texture reflection matrix used to rotate/transform the reflection. + * @returns the reflection matrix + */ + getReflectionTextureMatrix() { + if (this.isCube) { + return this._textureMatrix; + } + return super.getReflectionTextureMatrix(); + } + /** + * Resize the texture to a new desired size. + * Be careful as it will recreate all the data in the new texture. + * @param size Define the new size. It can be: + * - a number for squared texture, + * - an object containing { width: number, height: number } + * - or an object containing a ratio { ratio: number } + */ + resize(size) { + var _a; + const wasCube = this.isCube; + (_a = this._renderTarget) == null ? void 0 : _a.dispose(); + this._renderTarget = null; + const scene = this.getScene(); + if (!scene) { + return; + } + this._processSizeParameter(size, false); + if (wasCube) { + this._renderTarget = scene.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions); + } else { + this._renderTarget = scene.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions); + } + this._texture = this._renderTarget.texture; + if (this._renderTargetOptions.samples !== void 0) { + this.samples = this._renderTargetOptions.samples; + } + if (this.onResizeObservable.hasObservers()) { + this.onResizeObservable.notifyObservers(this); + } + } + /** + * Renders all the objects from the render list into the texture. + * @param useCameraPostProcess Define if camera post processes should be used during the rendering + * @param dumpForDebug Define if the rendering result should be dumped (copied) for debugging purpose + */ + render(useCameraPostProcess = false, dumpForDebug = false) { + this._render(useCameraPostProcess, dumpForDebug); + } + /** + * This function will check if the render target texture can be rendered (textures are loaded, shaders are compiled) + * @returns true if all required resources are ready + */ + isReadyForRendering() { + return this._render(false, false, true); + } + _render(useCameraPostProcess = false, dumpForDebug = false, checkReadiness = false) { + const scene = this.getScene(); + if (!scene) { + return checkReadiness; + } + const engine = scene.getEngine(); + if (this.useCameraPostProcesses !== void 0) { + useCameraPostProcess = this.useCameraPostProcesses; + } + if (this._waitingRenderList) { + if (!this.renderListPredicate) { + this.renderList = []; + for (let index = 0; index < this._waitingRenderList.length; index++) { + const id = this._waitingRenderList[index]; + const mesh = scene.getMeshById(id); + if (mesh) { + this.renderList.push(mesh); + } + } + } + this._waitingRenderList = void 0; + } + if (this.renderListPredicate) { + if (this.renderList) { + this.renderList.length = 0; + } else { + this.renderList = []; + } + const scene2 = this.getScene(); + if (!scene2) { + return checkReadiness; + } + const sceneMeshes = scene2.meshes; + for (let index = 0; index < sceneMeshes.length; index++) { + const mesh = sceneMeshes[index]; + if (this.renderListPredicate(mesh)) { + this.renderList.push(mesh); + } + } + } + const currentRenderPassId = engine.currentRenderPassId; + this.onBeforeBindObservable.notifyObservers(this); + const camera = this.activeCamera ?? scene.activeCamera; + const sceneCamera = scene.activeCamera; + if (camera) { + if (camera !== scene.activeCamera) { + scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(true)); + scene.activeCamera = camera; + } + engine.setViewport(camera.rigParent ? camera.rigParent.viewport : camera.viewport, this.getRenderWidth(), this.getRenderHeight()); + } + this._defaultRenderListPrepared = false; + let returnValue = checkReadiness; + if (!checkReadiness) { + if ((this.is2DArray || this.is3D) && !this.isMulti) { + for (let layer = 0; layer < this.getRenderLayers(); layer++) { + this._renderToTarget(0, useCameraPostProcess, dumpForDebug, layer, camera); + scene.incrementRenderId(); + scene.resetCachedMaterial(); + } + } else if (this.isCube && !this.isMulti) { + for (let face = 0; face < 6; face++) { + this._renderToTarget(face, useCameraPostProcess, dumpForDebug, void 0, camera); + scene.incrementRenderId(); + scene.resetCachedMaterial(); + } + } else { + this._renderToTarget(0, useCameraPostProcess, dumpForDebug, void 0, camera); + } + } else { + if (!scene.getViewMatrix()) { + scene.updateTransformMatrix(); + } + const numLayers = this.is2DArray || this.is3D ? this.getRenderLayers() : this.isCube ? 6 : 1; + for (let layer = 0; layer < numLayers && returnValue; layer++) { + let currentRenderList = null; + const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data; + const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length; + engine.currentRenderPassId = this._renderPassIds[layer]; + this.onBeforeRenderObservable.notifyObservers(layer); + if (this.getCustomRenderList) { + currentRenderList = this.getCustomRenderList(layer, defaultRenderList, defaultRenderListLength); + } + if (!currentRenderList) { + currentRenderList = defaultRenderList; + } + if (!this._doNotChangeAspectRatio) { + scene.updateTransformMatrix(true); + } + for (let i = 0; i < currentRenderList.length && returnValue; ++i) { + const mesh = currentRenderList[i]; + if (!mesh.isEnabled() || mesh.isBlocked || !mesh.isVisible || !mesh.subMeshes) { + continue; + } + if (this.customIsReadyFunction) { + if (!this.customIsReadyFunction(mesh, this.refreshRate, checkReadiness)) { + returnValue = false; + continue; + } + } else if (!mesh.isReady(true)) { + returnValue = false; + continue; + } + } + this.onAfterRenderObservable.notifyObservers(layer); + if (this.is2DArray || this.is3D || this.isCube) { + scene.incrementRenderId(); + scene.resetCachedMaterial(); + } + } + } + this.onAfterUnbindObservable.notifyObservers(this); + engine.currentRenderPassId = currentRenderPassId; + if (sceneCamera) { + scene.activeCamera = sceneCamera; + if (this.activeCamera && this.activeCamera !== scene.activeCamera) { + scene.setTransformMatrix(scene.activeCamera.getViewMatrix(), scene.activeCamera.getProjectionMatrix(true)); + } + engine.setViewport(scene.activeCamera.viewport); + } + scene.resetCachedMaterial(); + return returnValue; + } + _bestReflectionRenderTargetDimension(renderDimension, scale) { + const minimum = 128; + const x = renderDimension * scale; + const curved = Engine.NearestPOT(x + minimum * minimum / (minimum + x)); + return Math.min(Engine.FloorPOT(renderDimension), curved); + } + _prepareRenderingManager(currentRenderList, currentRenderListLength, camera, checkLayerMask) { + const scene = this.getScene(); + if (!scene) { + return; + } + this._renderingManager.reset(); + const sceneRenderId = scene.getRenderId(); + for (let meshIndex = 0; meshIndex < currentRenderListLength; meshIndex++) { + const mesh = currentRenderList[meshIndex]; + if (mesh && !mesh.isBlocked) { + if (this.customIsReadyFunction) { + if (!this.customIsReadyFunction(mesh, this.refreshRate, false)) { + this.resetRefreshCounter(); + continue; + } + } else if (!mesh.isReady(this.refreshRate === 0)) { + this.resetRefreshCounter(); + continue; + } + if (!mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate && scene.activeCamera) { + mesh._internalAbstractMeshDataInfo._currentLOD = scene.customLODSelector ? scene.customLODSelector(mesh, this.activeCamera || scene.activeCamera) : mesh.getLOD(this.activeCamera || scene.activeCamera); + mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate = true; + } + if (!mesh._internalAbstractMeshDataInfo._currentLOD) { + continue; + } + let meshToRender = mesh._internalAbstractMeshDataInfo._currentLOD; + meshToRender._preActivateForIntermediateRendering(sceneRenderId); + let isMasked; + if (checkLayerMask && camera) { + isMasked = (mesh.layerMask & camera.layerMask) === 0; + } else { + isMasked = false; + } + if (mesh.isEnabled() && mesh.isVisible && mesh.subMeshes && !isMasked) { + if (meshToRender !== mesh) { + meshToRender._activate(sceneRenderId, true); + } + if (mesh._activate(sceneRenderId, true) && mesh.subMeshes.length) { + if (!mesh.isAnInstance) { + meshToRender._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = false; + } else { + if (mesh._internalAbstractMeshDataInfo._actAsRegularMesh) { + meshToRender = mesh; + } + } + meshToRender._internalAbstractMeshDataInfo._isActiveIntermediate = true; + for (let subIndex = 0; subIndex < meshToRender.subMeshes.length; subIndex++) { + const subMesh = meshToRender.subMeshes[subIndex]; + this._renderingManager.dispatch(subMesh, meshToRender); + } + } + } + } + } + for (let particleIndex = 0; particleIndex < scene.particleSystems.length; particleIndex++) { + const particleSystem = scene.particleSystems[particleIndex]; + const emitter = particleSystem.emitter; + if (!particleSystem.isStarted() || !emitter || emitter.position && !emitter.isEnabled()) { + continue; + } + this._renderingManager.dispatchParticles(particleSystem); + } + } + /** + * @internal + * @param faceIndex face index to bind to if this is a cubetexture + * @param layer defines the index of the texture to bind in the array + */ + _bindFrameBuffer(faceIndex = 0, layer = 0) { + const scene = this.getScene(); + if (!scene) { + return; + } + const engine = scene.getEngine(); + if (this._renderTarget) { + engine.bindFramebuffer(this._renderTarget, this.isCube ? faceIndex : void 0, void 0, void 0, this.ignoreCameraViewport, 0, layer); + } + } + _unbindFrameBuffer(engine, faceIndex) { + if (!this._renderTarget) { + return; + } + engine.unBindFramebuffer(this._renderTarget, this.isCube, () => { + this.onAfterRenderObservable.notifyObservers(faceIndex); + }); + } + /** + * @internal + */ + _prepareFrame(scene, faceIndex, layer, useCameraPostProcess) { + if (this._postProcessManager) { + if (!this._prePassEnabled) { + this._postProcessManager._prepareFrame(this._texture, this._postProcesses); + } + } else if (!useCameraPostProcess || !scene.postProcessManager._prepareFrame(this._texture)) { + this._bindFrameBuffer(faceIndex, layer); + } + } + _renderToTarget(faceIndex, useCameraPostProcess, dumpForDebug, layer = 0, camera = null) { + var _a, _b, _c; + const scene = this.getScene(); + if (!scene) { + return; + } + const engine = scene.getEngine(); + (_a = engine._debugPushGroup) == null ? void 0 : _a.call(engine, `render to face #${faceIndex} layer #${layer}`, 1); + this._prepareFrame(scene, faceIndex, layer, useCameraPostProcess); + if (this.is2DArray || this.is3D) { + engine.currentRenderPassId = this._renderPassIds[layer]; + this.onBeforeRenderObservable.notifyObservers(layer); + } else { + engine.currentRenderPassId = this._renderPassIds[faceIndex]; + this.onBeforeRenderObservable.notifyObservers(faceIndex); + } + const fastPath = engine.snapshotRendering && engine.snapshotRenderingMode === 1; + if (!fastPath) { + let currentRenderList = null; + const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data; + const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length; + if (this.getCustomRenderList) { + currentRenderList = this.getCustomRenderList(this.is2DArray || this.is3D ? layer : faceIndex, defaultRenderList, defaultRenderListLength); + } + if (!currentRenderList) { + if (!this._defaultRenderListPrepared) { + this._prepareRenderingManager(defaultRenderList, defaultRenderListLength, camera, !this.renderList || this.forceLayerMaskCheck); + this._defaultRenderListPrepared = true; + } + currentRenderList = defaultRenderList; + } else { + this._prepareRenderingManager(currentRenderList, currentRenderList.length, camera, this.forceLayerMaskCheck); + } + for (const step of scene._beforeRenderTargetClearStage) { + step.action(this, faceIndex, layer); + } + if (this.onClearObservable.hasObservers()) { + this.onClearObservable.notifyObservers(engine); + } else if (!this.skipInitialClear) { + engine.clear(this.clearColor || scene.clearColor, true, true, true); + } + if (!this._doNotChangeAspectRatio) { + scene.updateTransformMatrix(true); + } + for (const step of scene._beforeRenderTargetDrawStage) { + step.action(this, faceIndex, layer); + } + this._renderingManager.render(this.customRenderFunction, currentRenderList, this.renderParticles, this.renderSprites); + for (const step of scene._afterRenderTargetDrawStage) { + step.action(this, faceIndex, layer); + } + const saveGenerateMipMaps = ((_b = this._texture) == null ? void 0 : _b.generateMipMaps) ?? false; + if (this._texture) { + this._texture.generateMipMaps = false; + } + if (this._postProcessManager) { + this._postProcessManager._finalizeFrame(false, this._renderTarget ?? void 0, faceIndex, this._postProcesses, this.ignoreCameraViewport); + } else if (useCameraPostProcess) { + scene.postProcessManager._finalizeFrame(false, this._renderTarget ?? void 0, faceIndex); + } + for (const step of scene._afterRenderTargetPostProcessStage) { + step.action(this, faceIndex, layer); + } + if (this._texture) { + this._texture.generateMipMaps = saveGenerateMipMaps; + } + if (!this._doNotChangeAspectRatio) { + scene.updateTransformMatrix(true); + } + if (dumpForDebug) { + DumpTools.DumpFramebuffer(this.getRenderWidth(), this.getRenderHeight(), engine); + } + } else { + if (this.onClearObservable.hasObservers()) { + this.onClearObservable.notifyObservers(engine); + } else { + if (!this.skipInitialClear) { + engine.clear(this.clearColor || scene.clearColor, true, true, true); + } + } + } + this._unbindFrameBuffer(engine, faceIndex); + if (this._texture && this.isCube && faceIndex === 5) { + engine.generateMipMapsForCubemap(this._texture); + } + (_c = engine._debugPopGroup) == null ? void 0 : _c.call(engine, 1); + } + /** + * Overrides the default sort function applied in the rendering group to prepare the meshes. + * This allowed control for front to back rendering or reversely depending of the special needs. + * + * @param renderingGroupId The rendering group id corresponding to its index + * @param opaqueSortCompareFn The opaque queue comparison function use to sort. + * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort. + * @param transparentSortCompareFn The transparent queue comparison function use to sort. + */ + setRenderingOrder(renderingGroupId, opaqueSortCompareFn = null, alphaTestSortCompareFn = null, transparentSortCompareFn = null) { + this._renderingManager.setRenderingOrder(renderingGroupId, opaqueSortCompareFn, alphaTestSortCompareFn, transparentSortCompareFn); + } + /** + * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups. + * + * @param renderingGroupId The rendering group id corresponding to its index + * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true. + */ + setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil) { + this._renderingManager.setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil); + this._renderingManager._useSceneAutoClearSetup = false; + } + /** + * Clones the texture. + * @returns the cloned texture + */ + clone() { + const textureSize = this.getSize(); + const newTexture = new _RenderTargetTexture(this.name, textureSize, this.getScene(), this._renderTargetOptions.generateMipMaps, this._doNotChangeAspectRatio, this._renderTargetOptions.type, this.isCube, this._renderTargetOptions.samplingMode, this._renderTargetOptions.generateDepthBuffer, this._renderTargetOptions.generateStencilBuffer, void 0, this._renderTargetOptions.format, void 0, this._renderTargetOptions.samples); + newTexture.hasAlpha = this.hasAlpha; + newTexture.level = this.level; + newTexture.coordinatesMode = this.coordinatesMode; + if (this.renderList) { + newTexture.renderList = this.renderList.slice(0); + } + return newTexture; + } + /** + * Serialize the texture to a JSON representation we can easily use in the respective Parse function. + * @returns The JSON representation of the texture + */ + serialize() { + if (!this.name) { + return null; + } + const serializationObject = super.serialize(); + serializationObject.renderTargetSize = this.getRenderSize(); + serializationObject.renderList = []; + if (this.renderList) { + for (let index = 0; index < this.renderList.length; index++) { + serializationObject.renderList.push(this.renderList[index].id); + } + } + return serializationObject; + } + /** + * This will remove the attached framebuffer objects. The texture will not be able to be used as render target anymore + */ + disposeFramebufferObjects() { + var _a; + (_a = this._renderTarget) == null ? void 0 : _a.dispose(true); + } + /** + * Release and destroy the underlying lower level texture aka internalTexture. + */ + releaseInternalTexture() { + var _a; + (_a = this._renderTarget) == null ? void 0 : _a.releaseTextures(); + this._texture = null; + } + /** + * Dispose the texture and release its associated resources. + */ + dispose() { + var _a; + this.onResizeObservable.clear(); + this.onClearObservable.clear(); + this.onAfterRenderObservable.clear(); + this.onAfterUnbindObservable.clear(); + this.onBeforeBindObservable.clear(); + this.onBeforeRenderObservable.clear(); + if (this._postProcessManager) { + this._postProcessManager.dispose(); + this._postProcessManager = null; + } + if (this._prePassRenderTarget) { + this._prePassRenderTarget.dispose(); + } + this._releaseRenderPassId(); + this.clearPostProcesses(true); + if (this._resizeObserver) { + this.getScene().getEngine().onResizeObservable.remove(this._resizeObserver); + this._resizeObserver = null; + } + this.renderList = null; + const scene = this.getScene(); + if (!scene) { + return; + } + let index = scene.customRenderTargets.indexOf(this); + if (index >= 0) { + scene.customRenderTargets.splice(index, 1); + } + for (const camera of scene.cameras) { + index = camera.customRenderTargets.indexOf(this); + if (index >= 0) { + camera.customRenderTargets.splice(index, 1); + } + } + (_a = this._renderTarget) == null ? void 0 : _a.dispose(); + this._renderTarget = null; + this._texture = null; + super.dispose(); + } + /** @internal */ + _rebuild() { + if (this.refreshRate === _RenderTargetTexture.REFRESHRATE_RENDER_ONCE) { + this.refreshRate = _RenderTargetTexture.REFRESHRATE_RENDER_ONCE; + } + if (this._postProcessManager) { + this._postProcessManager._rebuild(); + } + } + /** + * Clear the info related to rendering groups preventing retention point in material dispose. + */ + freeRenderingGroups() { + if (this._renderingManager) { + this._renderingManager.freeRenderingGroups(); + } + } + /** + * Gets the number of views the corresponding to the texture (eg. a MultiviewRenderTarget will have > 1) + * @returns the view count + */ + getViewCount() { + return 1; + } +}; +RenderTargetTexture.REFRESHRATE_RENDER_ONCE = 0; +RenderTargetTexture.REFRESHRATE_RENDER_ONEVERYFRAME = 1; +RenderTargetTexture.REFRESHRATE_RENDER_ONEVERYTWOFRAMES = 2; +Texture._CreateRenderTargetTexture = (name69, renderTargetSize, scene, generateMipMaps, creationFlags) => { + return new RenderTargetTexture(name69, renderTargetSize, scene, generateMipMaps); +}; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/defaultVertexDeclaration.js -var name37 = "defaultVertexDeclaration"; -var shader37 = `uniform mat4 viewProjection;uniform mat4 view; -#ifdef DIFFUSE -uniform mat4 diffuseMatrix;uniform vec2 vDiffuseInfos; -#endif -#ifdef AMBIENT -uniform mat4 ambientMatrix;uniform vec2 vAmbientInfos; -#endif -#ifdef OPACITY -uniform mat4 opacityMatrix;uniform vec2 vOpacityInfos; -#endif -#ifdef EMISSIVE -uniform vec2 vEmissiveInfos;uniform mat4 emissiveMatrix; -#endif -#ifdef LIGHTMAP -uniform vec2 vLightmapInfos;uniform mat4 lightmapMatrix; -#endif -#if defined(SPECULAR) && defined(SPECULARTERM) -uniform vec2 vSpecularInfos;uniform mat4 specularMatrix; -#endif -#ifdef BUMP -uniform vec3 vBumpInfos;uniform mat4 bumpMatrix; -#endif -#ifdef REFLECTION -uniform mat4 reflectionMatrix; -#endif -#ifdef POINTSIZE -uniform float pointSize; -#endif -#ifdef DETAIL -uniform vec4 vDetailInfos;uniform mat4 detailMatrix; -#endif -#include -#define ADDITIONAL_VERTEX_DECLARATION -`; -ShaderStore.IncludesShadersStore[name37] = shader37; +// node_modules/@babylonjs/core/Materials/Textures/Procedurals/proceduralTextureSceneComponent.js +var ProceduralTextureSceneComponent = class { + /** + * Creates a new instance of the component for the given scene + * @param scene Defines the scene to register the component in + */ + constructor(scene) { + this.name = SceneComponentConstants.NAME_PROCEDURALTEXTURE; + this.scene = scene; + this.scene.proceduralTextures = []; + } + /** + * Registers the component in a given scene + */ + register() { + this.scene._beforeClearStage.registerStep(SceneComponentConstants.STEP_BEFORECLEAR_PROCEDURALTEXTURE, this, this._beforeClear); + } + /** + * Rebuilds the elements related to this component in case of + * context lost for instance. + */ + rebuild() { + } + /** + * Disposes the component and the associated resources. + */ + dispose() { + } + _beforeClear() { + if (this.scene.proceduralTexturesEnabled) { + Tools.StartPerformanceCounter("Procedural textures", this.scene.proceduralTextures.length > 0); + for (let proceduralIndex = 0; proceduralIndex < this.scene.proceduralTextures.length; proceduralIndex++) { + const proceduralTexture = this.scene.proceduralTextures[proceduralIndex]; + if (proceduralTexture._shouldRender()) { + proceduralTexture.render(); + } + } + Tools.EndPerformanceCounter("Procedural textures", this.scene.proceduralTextures.length > 0); + } + } +}; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/uvAttributeDeclaration.js -var name38 = "uvAttributeDeclaration"; -var shader38 = `#ifdef UV{X} -attribute vec2 uv{X}; -#endif -`; -ShaderStore.IncludesShadersStore[name38] = shader38; +// node_modules/@babylonjs/core/Shaders/procedural.vertex.js +var name68 = "proceduralVertexShader"; +var shader68 = `attribute vec2 position;varying vec2 vPosition;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5); +#define CUSTOM_VERTEX_DEFINITIONS +void main(void) { +#define CUSTOM_VERTEX_MAIN_BEGIN +vPosition=position;vUV=position*madd+madd;gl_Position=vec4(position,0.0,1.0); +#define CUSTOM_VERTEX_MAIN_END +}`; +ShaderStore.ShadersStore[name68] = shader68; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/bonesDeclaration.js -var name39 = "bonesDeclaration"; -var shader39 = `#if NUM_BONE_INFLUENCERS>0 -attribute vec4 matricesIndices;attribute vec4 matricesWeights; -#if NUM_BONE_INFLUENCERS>4 -attribute vec4 matricesIndicesExtra;attribute vec4 matricesWeightsExtra; -#endif -#ifndef BAKED_VERTEX_ANIMATION_TEXTURE -#ifdef BONETEXTURE -uniform highp sampler2D boneSampler;uniform float boneTextureWidth; -#else -uniform mat4 mBones[BonesPerMesh]; -#endif -#ifdef BONES_VELOCITY_ENABLED -uniform mat4 mPreviousBones[BonesPerMesh]; -#endif -#ifdef BONETEXTURE -#define inline -mat4 readMatrixFromRawSampler(sampler2D smp,float index) -{float offset=index *4.0;float dx=1.0/boneTextureWidth;vec4 m0=texture2D(smp,vec2(dx*(offset+0.5),0.));vec4 m1=texture2D(smp,vec2(dx*(offset+1.5),0.));vec4 m2=texture2D(smp,vec2(dx*(offset+2.5),0.));vec4 m3=texture2D(smp,vec2(dx*(offset+3.5),0.));return mat4(m0,m1,m2,m3);} -#endif -#endif -#endif -`; -ShaderStore.IncludesShadersStore[name39] = shader39; +// node_modules/@babylonjs/core/Materials/Textures/Procedurals/proceduralTexture.js +var ProceduralTexture = class _ProceduralTexture extends Texture { + /** + * Instantiates a new procedural texture. + * Procedural texturing is a way to programmatically create a texture. There are 2 types of procedural textures: code-only, and code that references some classic 2D images, sometimes called 'refMaps' or 'sampler' images. + * This is the base class of any Procedural texture and contains most of the shareable code. + * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures + * @param name Define the name of the texture + * @param size Define the size of the texture to create + * @param fragment Define the fragment shader to use to generate the texture or null if it is defined later: + * * object: \{ fragmentElement: "fragmentShaderCode" \}, used with shader code in script tags + * * object: \{ fragmentSource: "fragment shader code string" \}, the string contains the shader code + * * string: the string contains a name "XXX" to lookup in Effect.ShadersStore["XXXFragmentShader"] + * @param scene Define the scene the texture belongs to + * @param fallbackTexture Define a fallback texture in case there were issues to create the custom texture + * @param generateMipMaps Define if the texture should creates mip maps or not + * @param isCube Define if the texture is a cube texture or not (this will render each faces of the cube) + * @param textureType The FBO internal texture type + */ + constructor(name69, size, fragment, scene, fallbackTexture = null, generateMipMaps = true, isCube = false, textureType = 0) { + super(null, scene, !generateMipMaps); + this.isEnabled = true; + this.autoClear = true; + this.onGeneratedObservable = new Observable(); + this.onBeforeGenerationObservable = new Observable(); + this.nodeMaterialSource = null; + this._textures = {}; + this._currentRefreshId = -1; + this._frameId = -1; + this._refreshRate = 1; + this._vertexBuffers = {}; + this._uniforms = new Array(); + this._samplers = new Array(); + this._floats = {}; + this._ints = {}; + this._floatsArrays = {}; + this._colors3 = {}; + this._colors4 = {}; + this._vectors2 = {}; + this._vectors3 = {}; + this._matrices = {}; + this._fallbackTextureUsed = false; + this._cachedDefines = null; + this._contentUpdateId = -1; + this._rtWrapper = null; + if (fallbackTexture !== null && !(fallbackTexture instanceof Texture)) { + this._options = fallbackTexture; + this._fallbackTexture = fallbackTexture.fallbackTexture ?? null; + } else { + this._options = {}; + this._fallbackTexture = fallbackTexture; + } + scene = this.getScene() || EngineStore.LastCreatedScene; + let component = scene._getComponent(SceneComponentConstants.NAME_PROCEDURALTEXTURE); + if (!component) { + component = new ProceduralTextureSceneComponent(scene); + scene._addComponent(component); + } + scene.proceduralTextures.push(this); + this._fullEngine = scene.getEngine(); + this.name = name69; + this.isRenderTarget = true; + this._size = size; + this._textureType = textureType; + this._generateMipMaps = generateMipMaps; + this._drawWrapper = new DrawWrapper(this._fullEngine); + this.setFragment(fragment); + const rtWrapper = this._createRtWrapper(isCube, size, generateMipMaps, textureType); + this._texture = rtWrapper.texture; + const vertices = []; + vertices.push(1, 1); + vertices.push(-1, 1); + vertices.push(-1, -1); + vertices.push(1, -1); + this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(this._fullEngine, vertices, VertexBuffer.PositionKind, false, false, 2); + this._createIndexBuffer(); + } + _createRtWrapper(isCube, size, generateMipMaps, textureType) { + if (isCube) { + this._rtWrapper = this._fullEngine.createRenderTargetCubeTexture(size, { + generateMipMaps, + generateDepthBuffer: false, + generateStencilBuffer: false, + type: textureType, + ...this._options + }); + this.setFloat("face", 0); + } else { + this._rtWrapper = this._fullEngine.createRenderTargetTexture(size, { + generateMipMaps, + generateDepthBuffer: false, + generateStencilBuffer: false, + type: textureType, + ...this._options + }); + } + return this._rtWrapper; + } + /** + * The effect that is created when initializing the post process. + * @returns The created effect corresponding the postprocess. + */ + getEffect() { + return this._drawWrapper.effect; + } + /** + * @internal + */ + _setEffect(effect) { + this._drawWrapper.effect = effect; + } + /** + * Gets texture content (Use this function wisely as reading from a texture can be slow) + * @returns an ArrayBufferView promise (Uint8Array or Float32Array) + */ + getContent() { + if (this._contentData && this._frameId === this._contentUpdateId) { + return this._contentData; + } + if (this._contentData) { + this._contentData.then((buffer) => { + this._contentData = this.readPixels(0, 0, buffer); + this._contentUpdateId = this._frameId; + }); + } else { + this._contentData = this.readPixels(0, 0); + this._contentUpdateId = this._frameId; + } + return this._contentData; + } + _createIndexBuffer() { + const engine = this._fullEngine; + const indices = []; + indices.push(0); + indices.push(1); + indices.push(2); + indices.push(0); + indices.push(2); + indices.push(3); + this._indexBuffer = engine.createIndexBuffer(indices); + } + /** @internal */ + _rebuild() { + const vb = this._vertexBuffers[VertexBuffer.PositionKind]; + if (vb) { + vb._rebuild(); + } + this._createIndexBuffer(); + if (this.refreshRate === RenderTargetTexture.REFRESHRATE_RENDER_ONCE) { + this.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE; + } + } + /** + * Resets the texture in order to recreate its associated resources. + * This can be called in case of context loss or if you change the shader code and need to regenerate the texture with the new code + */ + reset() { + var _a; + (_a = this._drawWrapper.effect) == null ? void 0 : _a.dispose(); + this._drawWrapper.effect = null; + this._cachedDefines = null; + } + _getDefines() { + return ""; + } + /** + * Executes a function when the texture will be ready to be drawn. + * @param func The callback to be used. + */ + executeWhenReady(func) { + if (this.isReady()) { + func(this); + return; + } + const effect = this.getEffect(); + if (effect) { + effect.executeWhenCompiled(() => { + func(this); + }); + } + } + /** + * Is the texture ready to be used ? (rendered at least once) + * @returns true if ready, otherwise, false. + */ + isReady() { + const engine = this._fullEngine; + if (this.nodeMaterialSource) { + return this._drawWrapper.effect.isReady(); + } + if (!this._fragment) { + return false; + } + if (this._fallbackTextureUsed) { + return true; + } + if (!this._texture) { + return false; + } + const defines = this._getDefines(); + if (this._drawWrapper.effect && defines === this._cachedDefines && this._drawWrapper.effect.isReady()) { + return true; + } + const shaders = { + vertex: "procedural", + fragmentElement: this._fragment.fragmentElement, + fragmentSource: this._fragment.fragmentSource, + fragment: typeof this._fragment === "string" ? this._fragment : void 0 + }; + if (this._cachedDefines !== defines) { + this._cachedDefines = defines; + this._drawWrapper.effect = engine.createEffect(shaders, [VertexBuffer.PositionKind], this._uniforms, this._samplers, defines, void 0, void 0, () => { + var _a; + (_a = this._rtWrapper) == null ? void 0 : _a.dispose(); + this._rtWrapper = this._texture = null; + if (this._fallbackTexture) { + this._texture = this._fallbackTexture._texture; + if (this._texture) { + this._texture.incrementReferences(); + } + } + this._fallbackTextureUsed = true; + }); + } + return this._drawWrapper.effect.isReady(); + } + /** + * Resets the refresh counter of the texture and start bak from scratch. + * Could be useful to regenerate the texture if it is setup to render only once. + */ + resetRefreshCounter() { + this._currentRefreshId = -1; + } + /** + * Set the fragment shader to use in order to render the texture. + * @param fragment This can be set to a path (into the shader store) or to a json object containing a fragmentElement property. + */ + setFragment(fragment) { + this._fragment = fragment; + } + /** + * Define the refresh rate of the texture or the rendering frequency. + * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on... + */ + get refreshRate() { + return this._refreshRate; + } + set refreshRate(value) { + this._refreshRate = value; + this.resetRefreshCounter(); + } + /** @internal */ + _shouldRender() { + if (!this.isEnabled || !this.isReady() || !this._texture) { + if (this._texture) { + this._texture.isReady = false; + } + return false; + } + if (this._fallbackTextureUsed) { + return false; + } + if (this._currentRefreshId === -1) { + this._currentRefreshId = 1; + this._frameId++; + return true; + } + if (this.refreshRate === this._currentRefreshId) { + this._currentRefreshId = 1; + this._frameId++; + return true; + } + this._currentRefreshId++; + return false; + } + /** + * Get the size the texture is rendering at. + * @returns the size (on cube texture it is always squared) + */ + getRenderSize() { + return this._size; + } + /** + * Resize the texture to new value. + * @param size Define the new size the texture should have + * @param generateMipMaps Define whether the new texture should create mip maps + */ + resize(size, generateMipMaps) { + if (this._fallbackTextureUsed || !this._rtWrapper || !this._texture) { + return; + } + const isCube = this._texture.isCube; + this._rtWrapper.dispose(); + const rtWrapper = this._createRtWrapper(isCube, size, generateMipMaps, this._textureType); + this._texture = rtWrapper.texture; + this._size = size; + this._generateMipMaps = generateMipMaps; + } + _checkUniform(uniformName) { + if (this._uniforms.indexOf(uniformName) === -1) { + this._uniforms.push(uniformName); + } + } + /** + * Set a texture in the shader program used to render. + * @param name Define the name of the uniform samplers as defined in the shader + * @param texture Define the texture to bind to this sampler + * @returns the texture itself allowing "fluent" like uniform updates + */ + setTexture(name69, texture) { + if (this._samplers.indexOf(name69) === -1) { + this._samplers.push(name69); + } + this._textures[name69] = texture; + return this; + } + /** + * Set a float in the shader. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the texture itself allowing "fluent" like uniform updates + */ + setFloat(name69, value) { + this._checkUniform(name69); + this._floats[name69] = value; + return this; + } + /** + * Set a int in the shader. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the texture itself allowing "fluent" like uniform updates + */ + setInt(name69, value) { + this._checkUniform(name69); + this._ints[name69] = value; + return this; + } + /** + * Set an array of floats in the shader. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the texture itself allowing "fluent" like uniform updates + */ + setFloats(name69, value) { + this._checkUniform(name69); + this._floatsArrays[name69] = value; + return this; + } + /** + * Set a vec3 in the shader from a Color3. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the texture itself allowing "fluent" like uniform updates + */ + setColor3(name69, value) { + this._checkUniform(name69); + this._colors3[name69] = value; + return this; + } + /** + * Set a vec4 in the shader from a Color4. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the texture itself allowing "fluent" like uniform updates + */ + setColor4(name69, value) { + this._checkUniform(name69); + this._colors4[name69] = value; + return this; + } + /** + * Set a vec2 in the shader from a Vector2. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the texture itself allowing "fluent" like uniform updates + */ + setVector2(name69, value) { + this._checkUniform(name69); + this._vectors2[name69] = value; + return this; + } + /** + * Set a vec3 in the shader from a Vector3. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the texture itself allowing "fluent" like uniform updates + */ + setVector3(name69, value) { + this._checkUniform(name69); + this._vectors3[name69] = value; + return this; + } + /** + * Set a mat4 in the shader from a MAtrix. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the texture itself allowing "fluent" like uniform updates + */ + setMatrix(name69, value) { + this._checkUniform(name69); + this._matrices[name69] = value; + return this; + } + /** + * Render the texture to its associated render target. + * @param useCameraPostProcess Define if camera post process should be applied to the texture + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + render(useCameraPostProcess) { + var _a, _b; + const scene = this.getScene(); + if (!scene) { + return; + } + const engine = this._fullEngine; + engine.enableEffect(this._drawWrapper); + this.onBeforeGenerationObservable.notifyObservers(this); + engine.setState(false); + if (!this.nodeMaterialSource) { + for (const name69 in this._textures) { + this._drawWrapper.effect.setTexture(name69, this._textures[name69]); + } + for (const name69 in this._ints) { + this._drawWrapper.effect.setInt(name69, this._ints[name69]); + } + for (const name69 in this._floats) { + this._drawWrapper.effect.setFloat(name69, this._floats[name69]); + } + for (const name69 in this._floatsArrays) { + this._drawWrapper.effect.setArray(name69, this._floatsArrays[name69]); + } + for (const name69 in this._colors3) { + this._drawWrapper.effect.setColor3(name69, this._colors3[name69]); + } + for (const name69 in this._colors4) { + const color = this._colors4[name69]; + this._drawWrapper.effect.setFloat4(name69, color.r, color.g, color.b, color.a); + } + for (const name69 in this._vectors2) { + this._drawWrapper.effect.setVector2(name69, this._vectors2[name69]); + } + for (const name69 in this._vectors3) { + this._drawWrapper.effect.setVector3(name69, this._vectors3[name69]); + } + for (const name69 in this._matrices) { + this._drawWrapper.effect.setMatrix(name69, this._matrices[name69]); + } + } + if (!this._texture || !this._rtWrapper) { + return; + } + (_a = engine._debugPushGroup) == null ? void 0 : _a.call(engine, `procedural texture generation for ${this.name}`, 1); + const viewPort = engine.currentViewport; + if (this.isCube) { + for (let face = 0; face < 6; face++) { + engine.bindFramebuffer(this._rtWrapper, face, void 0, void 0, true); + engine.bindBuffers(this._vertexBuffers, this._indexBuffer, this._drawWrapper.effect); + this._drawWrapper.effect.setFloat("face", face); + if (this.autoClear) { + engine.clear(scene.clearColor, true, false, false); + } + engine.drawElementsType(Material.TriangleFillMode, 0, 6); + } + } else { + engine.bindFramebuffer(this._rtWrapper, 0, void 0, void 0, true); + engine.bindBuffers(this._vertexBuffers, this._indexBuffer, this._drawWrapper.effect); + if (this.autoClear) { + engine.clear(scene.clearColor, true, false, false); + } + engine.drawElementsType(Material.TriangleFillMode, 0, 6); + } + engine.unBindFramebuffer(this._rtWrapper, this.isCube); + if (viewPort) { + engine.setViewport(viewPort); + } + if (this.isCube) { + engine.generateMipMapsForCubemap(this._texture); + } + (_b = engine._debugPopGroup) == null ? void 0 : _b.call(engine, 1); + if (this.onGenerated) { + this.onGenerated(); + } + this.onGeneratedObservable.notifyObservers(this); + } + /** + * Clone the texture. + * @returns the cloned texture + */ + clone() { + const textureSize = this.getSize(); + const newTexture = new _ProceduralTexture(this.name, textureSize.width, this._fragment, this.getScene(), this._fallbackTexture, this._generateMipMaps); + newTexture.hasAlpha = this.hasAlpha; + newTexture.level = this.level; + newTexture.coordinatesMode = this.coordinatesMode; + return newTexture; + } + /** + * Dispose the texture and release its associated resources. + */ + dispose() { + const scene = this.getScene(); + if (!scene) { + return; + } + const index = scene.proceduralTextures.indexOf(this); + if (index >= 0) { + scene.proceduralTextures.splice(index, 1); + } + const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind]; + if (vertexBuffer) { + vertexBuffer.dispose(); + this._vertexBuffers[VertexBuffer.PositionKind] = null; + } + if (this._indexBuffer && this._fullEngine._releaseBuffer(this._indexBuffer)) { + this._indexBuffer = null; + } + this.onGeneratedObservable.clear(); + this.onBeforeGenerationObservable.clear(); + super.dispose(); + } +}; +__decorate([ + serialize() +], ProceduralTexture.prototype, "isEnabled", void 0); +__decorate([ + serialize() +], ProceduralTexture.prototype, "autoClear", void 0); +__decorate([ + serialize() +], ProceduralTexture.prototype, "_generateMipMaps", void 0); +__decorate([ + serialize() +], ProceduralTexture.prototype, "_size", void 0); +__decorate([ + serialize() +], ProceduralTexture.prototype, "refreshRate", null); +RegisterClass("BABYLON.ProceduralTexture", ProceduralTexture); -// node_modules/@babylonjs/core/Shaders/ShadersInclude/bakedVertexAnimationDeclaration.js -var name40 = "bakedVertexAnimationDeclaration"; -var shader40 = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE -uniform float bakedVertexAnimationTime;uniform vec2 bakedVertexAnimationTextureSizeInverted;uniform vec4 bakedVertexAnimationSettings;uniform sampler2D bakedVertexAnimationTexture; -#ifdef INSTANCES -attribute vec4 bakedVertexAnimationSettingsInstanced; -#endif -#define inline -mat4 readMatrixFromRawSamplerVAT(sampler2D smp,float index,float frame) -{float offset=index*4.0;float frameUV=(frame+0.5)*bakedVertexAnimationTextureSizeInverted.y;float dx=bakedVertexAnimationTextureSizeInverted.x;vec4 m0=texture2D(smp,vec2(dx*(offset+0.5),frameUV));vec4 m1=texture2D(smp,vec2(dx*(offset+1.5),frameUV));vec4 m2=texture2D(smp,vec2(dx*(offset+2.5),frameUV));vec4 m3=texture2D(smp,vec2(dx*(offset+3.5),frameUV));return mat4(m0,m1,m2,m3);} -#endif +// node_modules/@babylonjs/core/Materials/Node/Blocks/trigonometryBlock.js +var TrigonometryBlockOperations; +(function(TrigonometryBlockOperations2) { + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Cos"] = 0] = "Cos"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Sin"] = 1] = "Sin"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Abs"] = 2] = "Abs"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Exp"] = 3] = "Exp"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Exp2"] = 4] = "Exp2"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Round"] = 5] = "Round"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Floor"] = 6] = "Floor"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Ceiling"] = 7] = "Ceiling"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Sqrt"] = 8] = "Sqrt"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Log"] = 9] = "Log"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Tan"] = 10] = "Tan"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["ArcTan"] = 11] = "ArcTan"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["ArcCos"] = 12] = "ArcCos"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["ArcSin"] = 13] = "ArcSin"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Fract"] = 14] = "Fract"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Sign"] = 15] = "Sign"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Radians"] = 16] = "Radians"; + TrigonometryBlockOperations2[TrigonometryBlockOperations2["Degrees"] = 17] = "Degrees"; +})(TrigonometryBlockOperations || (TrigonometryBlockOperations = {})); +var TrigonometryBlock = class extends NodeMaterialBlock { + /** + * Creates a new TrigonometryBlock + * @param name defines the block name + */ + constructor(name69) { + super(name69, NodeMaterialBlockTargets.Neutral); + this.operation = TrigonometryBlockOperations.Cos; + this.registerInput("input", NodeMaterialBlockConnectionPointTypes.AutoDetect); + this.registerOutput("output", NodeMaterialBlockConnectionPointTypes.BasedOnInput); + this._outputs[0]._typeConnectionSource = this._inputs[0]; + } + /** + * Gets the current class name + * @returns the class name + */ + getClassName() { + return "TrigonometryBlock"; + } + /** + * Gets the input component + */ + get input() { + return this._inputs[0]; + } + /** + * Gets the output component + */ + get output() { + return this._outputs[0]; + } + _buildBlock(state) { + super._buildBlock(state); + const output = this._outputs[0]; + let operation = ""; + switch (this.operation) { + case TrigonometryBlockOperations.Cos: { + operation = "cos"; + break; + } + case TrigonometryBlockOperations.Sin: { + operation = "sin"; + break; + } + case TrigonometryBlockOperations.Abs: { + operation = "abs"; + break; + } + case TrigonometryBlockOperations.Exp: { + operation = "exp"; + break; + } + case TrigonometryBlockOperations.Exp2: { + operation = "exp2"; + break; + } + case TrigonometryBlockOperations.Round: { + operation = "round"; + break; + } + case TrigonometryBlockOperations.Floor: { + operation = "floor"; + break; + } + case TrigonometryBlockOperations.Ceiling: { + operation = "ceil"; + break; + } + case TrigonometryBlockOperations.Sqrt: { + operation = "sqrt"; + break; + } + case TrigonometryBlockOperations.Log: { + operation = "log"; + break; + } + case TrigonometryBlockOperations.Tan: { + operation = "tan"; + break; + } + case TrigonometryBlockOperations.ArcTan: { + operation = "atan"; + break; + } + case TrigonometryBlockOperations.ArcCos: { + operation = "acos"; + break; + } + case TrigonometryBlockOperations.ArcSin: { + operation = "asin"; + break; + } + case TrigonometryBlockOperations.Fract: { + operation = "fract"; + break; + } + case TrigonometryBlockOperations.Sign: { + operation = "sign"; + break; + } + case TrigonometryBlockOperations.Radians: { + operation = "radians"; + break; + } + case TrigonometryBlockOperations.Degrees: { + operation = "degrees"; + break; + } + } + state.compilationString += this._declareOutput(output, state) + ` = ${operation}(${this.input.associatedVariableName}); `; -ShaderStore.IncludesShadersStore[name40] = shader40; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/instancesDeclaration.js -var name41 = "instancesDeclaration"; -var shader41 = `#ifdef INSTANCES -attribute vec4 world0;attribute vec4 world1;attribute vec4 world2;attribute vec4 world3; -#ifdef INSTANCESCOLOR -attribute vec4 instanceColor; -#endif -#if defined(THIN_INSTANCES) && !defined(WORLD_UBO) -uniform mat4 world; -#endif -#if defined(VELOCITY) || defined(PREPASS_VELOCITY) -attribute vec4 previousWorld0;attribute vec4 previousWorld1;attribute vec4 previousWorld2;attribute vec4 previousWorld3; -#ifdef THIN_INSTANCES -uniform mat4 previousWorld; -#endif -#endif -#else -#if !defined(WORLD_UBO) -uniform mat4 world; -#endif -#if defined(VELOCITY) || defined(PREPASS_VELOCITY) -uniform mat4 previousWorld; -#endif -#endif + return this; + } + serialize() { + const serializationObject = super.serialize(); + serializationObject.operation = this.operation; + return serializationObject; + } + _deserialize(serializationObject, scene, rootUrl) { + super._deserialize(serializationObject, scene, rootUrl); + this.operation = serializationObject.operation; + } + _dumpPropertiesCode() { + const codeString = super._dumpPropertiesCode() + `${this._codeVariableName}.operation = BABYLON.TrigonometryBlockOperations.${TrigonometryBlockOperations[this.operation]}; `; -ShaderStore.IncludesShadersStore[name41] = shader41; + return codeString; + } +}; +RegisterClass("BABYLON.TrigonometryBlock", TrigonometryBlock); -// node_modules/@babylonjs/core/Shaders/ShadersInclude/prePassVertexDeclaration.js -var name42 = "prePassVertexDeclaration"; -var shader42 = `#ifdef PREPASS -#ifdef PREPASS_DEPTH -varying vec3 vViewPos; -#endif -#ifdef PREPASS_VELOCITY -uniform mat4 previousViewProjection;varying vec4 vCurrentPosition;varying vec4 vPreviousPosition; -#endif -#endif +// node_modules/@babylonjs/core/Materials/Node/nodeMaterialBuildState.js +var NodeMaterialBuildState = class { + constructor() { + this.supportUniformBuffers = false; + this.attributes = []; + this.uniforms = []; + this.constants = []; + this.samplers = []; + this.functions = {}; + this.extensions = {}; + this.prePassOutput = {}; + this.counters = {}; + this._attributeDeclaration = ""; + this._uniformDeclaration = ""; + this._constantDeclaration = ""; + this._samplerDeclaration = ""; + this._varyingTransfer = ""; + this._injectAtEnd = ""; + this._repeatableContentAnchorIndex = 0; + this._builtCompilationString = ""; + this.compilationString = ""; + } + /** + * Finalize the compilation strings + * @param state defines the current compilation state + */ + finalize(state) { + const emitComments = state.sharedData.emitComments; + const isFragmentMode = this.target === NodeMaterialBlockTargets.Fragment; + this.compilationString = ` +${emitComments ? "//Entry point\n" : ""}void main(void) { +${this.compilationString}`; + if (this._constantDeclaration) { + this.compilationString = ` +${emitComments ? "//Constants\n" : ""}${this._constantDeclaration} +${this.compilationString}`; + } + let functionCode = ""; + for (const functionName in this.functions) { + functionCode += this.functions[functionName] + ` `; -ShaderStore.IncludesShadersStore[name42] = shader42; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/samplerVertexDeclaration.js -var name43 = "samplerVertexDeclaration"; -var shader43 = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0 -varying vec2 v_VARYINGNAME_UV; -#endif + } + this.compilationString = ` +${functionCode} +${this.compilationString}`; + if (!isFragmentMode && this._varyingTransfer) { + this.compilationString = `${this.compilationString} +${this._varyingTransfer}`; + } + if (this._injectAtEnd) { + this.compilationString = `${this.compilationString} +${this._injectAtEnd}`; + } + this.compilationString = `${this.compilationString} +}`; + if (this.sharedData.varyingDeclaration) { + this.compilationString = ` +${emitComments ? "//Varyings\n" : ""}${this.sharedData.varyingDeclaration} +${this.compilationString}`; + } + if (this._samplerDeclaration) { + this.compilationString = ` +${emitComments ? "//Samplers\n" : ""}${this._samplerDeclaration} +${this.compilationString}`; + } + if (this._uniformDeclaration) { + this.compilationString = ` +${emitComments ? "//Uniforms\n" : ""}${this._uniformDeclaration} +${this.compilationString}`; + } + if (this._attributeDeclaration && !isFragmentMode) { + this.compilationString = ` +${emitComments ? "//Attributes\n" : ""}${this._attributeDeclaration} +${this.compilationString}`; + } + this.compilationString = "precision highp float;\n" + this.compilationString; + this.compilationString = "#if defined(WEBGL2) || defined(WEBGPU)\nprecision highp sampler2DArray;\n#endif\n" + this.compilationString; + if (isFragmentMode) { + this.compilationString = "#if defined(PREPASS)\r\n#extension GL_EXT_draw_buffers : require\r\nlayout(location = 0) out highp vec4 glFragData[SCENE_MRT_COUNT];\r\nhighp vec4 gl_FragColor;\r\n#endif\r\n" + this.compilationString; + } + for (const extensionName in this.extensions) { + const extension = this.extensions[extensionName]; + this.compilationString = ` +${extension} +${this.compilationString}`; + } + this._builtCompilationString = this.compilationString; + } + /** @internal */ + get _repeatableContentAnchor() { + return `###___ANCHOR${this._repeatableContentAnchorIndex++}___###`; + } + /** + * @internal + */ + _getFreeVariableName(prefix) { + prefix = prefix.replace(/[^a-zA-Z_]+/g, ""); + if (this.sharedData.variableNames[prefix] === void 0) { + this.sharedData.variableNames[prefix] = 0; + if (prefix === "output" || prefix === "texture") { + return prefix + this.sharedData.variableNames[prefix]; + } + return prefix; + } else { + this.sharedData.variableNames[prefix]++; + } + return prefix + this.sharedData.variableNames[prefix]; + } + /** + * @internal + */ + _getFreeDefineName(prefix) { + if (this.sharedData.defineNames[prefix] === void 0) { + this.sharedData.defineNames[prefix] = 0; + } else { + this.sharedData.defineNames[prefix]++; + } + return prefix + this.sharedData.defineNames[prefix]; + } + /** + * @internal + */ + _excludeVariableName(name69) { + this.sharedData.variableNames[name69] = 0; + } + /** + * @internal + */ + _emit2DSampler(name69) { + if (this.samplers.indexOf(name69) < 0) { + this._samplerDeclaration += `uniform sampler2D ${name69}; `; -ShaderStore.IncludesShadersStore[name43] = shader43; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/bumpVertexDeclaration.js -var name44 = "bumpVertexDeclaration"; -var shader44 = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) -#if defined(TANGENT) && defined(NORMAL) -varying mat3 vTBN; -#endif -#endif + this.samplers.push(name69); + } + } + /** + * @internal + */ + _emit2DArraySampler(name69) { + if (this.samplers.indexOf(name69) < 0) { + this._samplerDeclaration += `uniform sampler2DArray ${name69}; `; -ShaderStore.IncludesShadersStore[name44] = shader44; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/clipPlaneVertexDeclaration.js -var name45 = "clipPlaneVertexDeclaration"; -var shader45 = `#ifdef CLIPPLANE -uniform vec4 vClipPlane;varying float fClipDistance; -#endif -#ifdef CLIPPLANE2 -uniform vec4 vClipPlane2;varying float fClipDistance2; -#endif -#ifdef CLIPPLANE3 -uniform vec4 vClipPlane3;varying float fClipDistance3; -#endif -#ifdef CLIPPLANE4 -uniform vec4 vClipPlane4;varying float fClipDistance4; -#endif -#ifdef CLIPPLANE5 -uniform vec4 vClipPlane5;varying float fClipDistance5; -#endif -#ifdef CLIPPLANE6 -uniform vec4 vClipPlane6;varying float fClipDistance6; -#endif + this.samplers.push(name69); + } + } + /** + * @internal + */ + _getGLType(type) { + switch (type) { + case NodeMaterialBlockConnectionPointTypes.Float: + return "float"; + case NodeMaterialBlockConnectionPointTypes.Int: + return "int"; + case NodeMaterialBlockConnectionPointTypes.Vector2: + return "vec2"; + case NodeMaterialBlockConnectionPointTypes.Color3: + case NodeMaterialBlockConnectionPointTypes.Vector3: + return "vec3"; + case NodeMaterialBlockConnectionPointTypes.Color4: + case NodeMaterialBlockConnectionPointTypes.Vector4: + return "vec4"; + case NodeMaterialBlockConnectionPointTypes.Matrix: + return "mat4"; + } + return ""; + } + /** + * @internal + */ + _emitExtension(name69, extension, define = "") { + if (this.extensions[name69]) { + return; + } + if (define) { + extension = `#if ${define} +${extension} +#endif`; + } + this.extensions[name69] = extension; + } + /** + * @internal + */ + _emitFunction(name69, code, comments) { + if (this.functions[name69]) { + return; + } + if (this.sharedData.emitComments) { + code = comments + ` +` + code; + } + this.functions[name69] = code; + } + /** + * @internal + */ + _emitCodeFromInclude(includeName, comments, options) { + if (options && options.repeatKey) { + return `#include<${includeName}>${options.substitutionVars ? "(" + options.substitutionVars + ")" : ""}[0..${options.repeatKey}] `; -ShaderStore.IncludesShadersStore[name45] = shader45; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/fogVertexDeclaration.js -var name46 = "fogVertexDeclaration"; -var shader46 = `#ifdef FOG -varying vec3 vFogDistance; -#endif + } + let code = Effect.IncludesShadersStore[includeName] + "\n"; + if (this.sharedData.emitComments) { + code = comments + ` +` + code; + } + if (!options) { + return code; + } + if (options.replaceStrings) { + for (let index = 0; index < options.replaceStrings.length; index++) { + const replaceString = options.replaceStrings[index]; + code = code.replace(replaceString.search, replaceString.replace); + } + } + return code; + } + /** + * @internal + */ + _emitFunctionFromInclude(includeName, comments, options, storeKey = "") { + const key = includeName + storeKey; + if (this.functions[key]) { + return; + } + if (!options || !options.removeAttributes && !options.removeUniforms && !options.removeVaryings && !options.removeIfDef && !options.replaceStrings) { + if (options && options.repeatKey) { + this.functions[key] = `#include<${includeName}>${options.substitutionVars ? "(" + options.substitutionVars + ")" : ""}[0..${options.repeatKey}] `; -ShaderStore.IncludesShadersStore[name46] = shader46; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/lightVxFragmentDeclaration.js -var name47 = "lightVxFragmentDeclaration"; -var shader47 = `#ifdef LIGHT{X} -uniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X}; -#ifdef SPECULARTERM -uniform vec4 vLightSpecular{X}; -#else -vec4 vLightSpecular{X}=vec4(0.); -#endif -#ifdef SHADOW{X} -#ifdef SHADOWCSM{X} -uniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X}; -#elif defined(SHADOWCUBE{X}) -#else -varying vec4 vPositionFromLight{X};varying float vDepthMetric{X};uniform mat4 lightMatrix{X}; -#endif -uniform vec4 shadowsInfo{X};uniform vec2 depthValues{X}; -#endif -#ifdef SPOTLIGHT{X} -uniform vec4 vLightDirection{X};uniform vec4 vLightFalloff{X}; -#elif defined(POINTLIGHT{X}) -uniform vec4 vLightFalloff{X}; -#elif defined(HEMILIGHT{X}) -uniform vec3 vLightGround{X}; -#endif -#endif + } else { + this.functions[key] = `#include<${includeName}>${(options == null ? void 0 : options.substitutionVars) ? "(" + (options == null ? void 0 : options.substitutionVars) + ")" : ""} `; -ShaderStore.IncludesShadersStore[name47] = shader47; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/lightVxUboDeclaration.js -var name48 = "lightVxUboDeclaration"; -var shader48 = `#ifdef LIGHT{X} -uniform Light{X} -{vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular; -#ifdef SPOTLIGHT{X} -vec4 vLightDirection;vec4 vLightFalloff; -#elif defined(POINTLIGHT{X}) -vec4 vLightFalloff; -#elif defined(HEMILIGHT{X}) -vec3 vLightGround; -#endif -vec4 shadowsInfo;vec2 depthValues;} light{X}; -#ifdef SHADOW{X} -#ifdef SHADOWCSM{X} -uniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X}; -#elif defined(SHADOWCUBE{X}) -#else -varying vec4 vPositionFromLight{X};varying float vDepthMetric{X};uniform mat4 lightMatrix{X}; -#endif -#endif -#endif + } + if (this.sharedData.emitComments) { + this.functions[key] = comments + ` +` + this.functions[key]; + } + return; + } + this.functions[key] = Effect.IncludesShadersStore[includeName]; + if (this.sharedData.emitComments) { + this.functions[key] = comments + ` +` + this.functions[key]; + } + if (options.removeIfDef) { + this.functions[key] = this.functions[key].replace(/^\s*?#ifdef.+$/gm, ""); + this.functions[key] = this.functions[key].replace(/^\s*?#endif.*$/gm, ""); + this.functions[key] = this.functions[key].replace(/^\s*?#else.*$/gm, ""); + this.functions[key] = this.functions[key].replace(/^\s*?#elif.*$/gm, ""); + } + if (options.removeAttributes) { + this.functions[key] = this.functions[key].replace(/\s*?attribute .+?;/g, "\n"); + } + if (options.removeUniforms) { + this.functions[key] = this.functions[key].replace(/\s*?uniform .*?;/g, "\n"); + } + if (options.removeVaryings) { + this.functions[key] = this.functions[key].replace(/\s*?(varying|in) .+?;/g, "\n"); + } + if (options.replaceStrings) { + for (let index = 0; index < options.replaceStrings.length; index++) { + const replaceString = options.replaceStrings[index]; + this.functions[key] = this.functions[key].replace(replaceString.search, replaceString.replace); + } + } + } + /** + * @internal + */ + _registerTempVariable(name69) { + if (this.sharedData.temps.indexOf(name69) !== -1) { + return false; + } + this.sharedData.temps.push(name69); + return true; + } + /** + * @internal + */ + _emitVaryingFromString(name69, type, define = "", notDefine = false) { + if (this.sharedData.varyings.indexOf(name69) !== -1) { + return false; + } + this.sharedData.varyings.push(name69); + if (define) { + if (define.startsWith("defined(")) { + this.sharedData.varyingDeclaration += `#if ${define} `; -ShaderStore.IncludesShadersStore[name48] = shader48; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/morphTargetsVertexGlobalDeclaration.js -var name49 = "morphTargetsVertexGlobalDeclaration"; -var shader49 = `#ifdef MORPHTARGETS -uniform float morphTargetInfluences[NUM_MORPH_INFLUENCERS]; -#ifdef MORPHTARGETS_TEXTURE -uniform float morphTargetTextureIndices[NUM_MORPH_INFLUENCERS];uniform vec3 morphTargetTextureInfo;uniform highp sampler2DArray morphTargets;vec3 readVector3FromRawSampler(int targetIndex,float vertexIndex) -{ -float y=floor(vertexIndex/morphTargetTextureInfo.y);float x=vertexIndex-y*morphTargetTextureInfo.y;vec3 textureUV=vec3((x+0.5)/morphTargetTextureInfo.y,(y+0.5)/morphTargetTextureInfo.z,morphTargetTextureIndices[targetIndex]);return texture(morphTargets,textureUV).xyz;} -#endif -#endif + } else { + this.sharedData.varyingDeclaration += `${notDefine ? "#ifndef" : "#ifdef"} ${define} `; -ShaderStore.IncludesShadersStore[name49] = shader49; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/morphTargetsVertexDeclaration.js -var name50 = "morphTargetsVertexDeclaration"; -var shader50 = `#ifdef MORPHTARGETS -#ifndef MORPHTARGETS_TEXTURE -attribute vec3 position{X}; -#ifdef MORPHTARGETS_NORMAL -attribute vec3 normal{X}; -#endif -#ifdef MORPHTARGETS_TANGENT -attribute vec3 tangent{X}; -#endif -#ifdef MORPHTARGETS_UV -attribute vec2 uv_{X}; -#endif -#elif {X}==0 -uniform int morphTargetCount; -#endif -#endif + } + } + this.sharedData.varyingDeclaration += `varying ${type} ${name69}; `; -ShaderStore.IncludesShadersStore[name50] = shader50; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/morphTargetsVertexGlobal.js -var name51 = "morphTargetsVertexGlobal"; -var shader51 = `#ifdef MORPHTARGETS -#ifdef MORPHTARGETS_TEXTURE -float vertexID; -#endif -#endif + if (define) { + this.sharedData.varyingDeclaration += `#endif `; -ShaderStore.IncludesShadersStore[name51] = shader51; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/morphTargetsVertex.js -var name52 = "morphTargetsVertex"; -var shader52 = `#ifdef MORPHTARGETS -#ifdef MORPHTARGETS_TEXTURE -#if {X}==0 -for (int i=0; i=morphTargetCount) break;vertexID=float(gl_VertexID)*morphTargetTextureInfo.x;positionUpdated+=(readVector3FromRawSampler(i,vertexID)-position)*morphTargetInfluences[i];vertexID+=1.0; -#ifdef MORPHTARGETS_NORMAL -normalUpdated+=(readVector3FromRawSampler(i,vertexID) -normal)*morphTargetInfluences[i];vertexID+=1.0; -#endif -#ifdef MORPHTARGETS_UV -uvUpdated+=(readVector3FromRawSampler(i,vertexID).xy-uv)*morphTargetInfluences[i];vertexID+=1.0; -#endif -#ifdef MORPHTARGETS_TANGENT -tangentUpdated.xyz+=(readVector3FromRawSampler(i,vertexID) -tangent.xyz)*morphTargetInfluences[i]; -#endif -} -#endif -#else -positionUpdated+=(position{X}-position)*morphTargetInfluences[{X}]; -#ifdef MORPHTARGETS_NORMAL -normalUpdated+=(normal{X}-normal)*morphTargetInfluences[{X}]; -#endif -#ifdef MORPHTARGETS_TANGENT -tangentUpdated.xyz+=(tangent{X}-tangent.xyz)*morphTargetInfluences[{X}]; -#endif -#ifdef MORPHTARGETS_UV -uvUpdated+=(uv_{X}-uv)*morphTargetInfluences[{X}]; -#endif -#endif -#endif + } + return true; + } + /** + * @internal + */ + _emitUniformFromString(name69, type, define = "", notDefine = false) { + if (this.uniforms.indexOf(name69) !== -1) { + return; + } + this.uniforms.push(name69); + if (define) { + if (define.startsWith("defined(")) { + this._uniformDeclaration += `#if ${define} `; -ShaderStore.IncludesShadersStore[name52] = shader52; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/instancesVertex.js -var name53 = "instancesVertex"; -var shader53 = `#ifdef INSTANCES -mat4 finalWorld=mat4(world0,world1,world2,world3); -#if defined(PREPASS_VELOCITY) || defined(VELOCITY) -mat4 finalPreviousWorld=mat4(previousWorld0,previousWorld1,previousWorld2,previousWorld3); -#endif -#ifdef THIN_INSTANCES -finalWorld=world*finalWorld; -#if defined(PREPASS_VELOCITY) || defined(VELOCITY) -finalPreviousWorld=previousWorld*finalPreviousWorld; -#endif -#endif -#else -mat4 finalWorld=world; -#if defined(PREPASS_VELOCITY) || defined(VELOCITY) -mat4 finalPreviousWorld=previousWorld; -#endif -#endif + } else { + this._uniformDeclaration += `${notDefine ? "#ifndef" : "#ifdef"} ${define} `; -ShaderStore.IncludesShadersStore[name53] = shader53; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/bonesVertex.js -var name54 = "bonesVertex"; -var shader54 = `#ifndef BAKED_VERTEX_ANIMATION_TEXTURE -#if NUM_BONE_INFLUENCERS>0 -mat4 influence; -#ifdef BONETEXTURE -influence=readMatrixFromRawSampler(boneSampler,matricesIndices[0])*matricesWeights[0]; -#if NUM_BONE_INFLUENCERS>1 -influence+=readMatrixFromRawSampler(boneSampler,matricesIndices[1])*matricesWeights[1]; -#endif -#if NUM_BONE_INFLUENCERS>2 -influence+=readMatrixFromRawSampler(boneSampler,matricesIndices[2])*matricesWeights[2]; -#endif -#if NUM_BONE_INFLUENCERS>3 -influence+=readMatrixFromRawSampler(boneSampler,matricesIndices[3])*matricesWeights[3]; -#endif -#if NUM_BONE_INFLUENCERS>4 -influence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[0])*matricesWeightsExtra[0]; -#endif -#if NUM_BONE_INFLUENCERS>5 -influence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[1])*matricesWeightsExtra[1]; -#endif -#if NUM_BONE_INFLUENCERS>6 -influence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[2])*matricesWeightsExtra[2]; -#endif -#if NUM_BONE_INFLUENCERS>7 -influence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[3])*matricesWeightsExtra[3]; -#endif -#else -influence=mBones[int(matricesIndices[0])]*matricesWeights[0]; -#if NUM_BONE_INFLUENCERS>1 -influence+=mBones[int(matricesIndices[1])]*matricesWeights[1]; -#endif -#if NUM_BONE_INFLUENCERS>2 -influence+=mBones[int(matricesIndices[2])]*matricesWeights[2]; -#endif -#if NUM_BONE_INFLUENCERS>3 -influence+=mBones[int(matricesIndices[3])]*matricesWeights[3]; -#endif -#if NUM_BONE_INFLUENCERS>4 -influence+=mBones[int(matricesIndicesExtra[0])]*matricesWeightsExtra[0]; -#endif -#if NUM_BONE_INFLUENCERS>5 -influence+=mBones[int(matricesIndicesExtra[1])]*matricesWeightsExtra[1]; -#endif -#if NUM_BONE_INFLUENCERS>6 -influence+=mBones[int(matricesIndicesExtra[2])]*matricesWeightsExtra[2]; -#endif -#if NUM_BONE_INFLUENCERS>7 -influence+=mBones[int(matricesIndicesExtra[3])]*matricesWeightsExtra[3]; -#endif -#endif -finalWorld=finalWorld*influence; -#endif -#endif + } + } + this._uniformDeclaration += `uniform ${type} ${name69}; `; -ShaderStore.IncludesShadersStore[name54] = shader54; + if (define) { + this._uniformDeclaration += `#endif +`; + } + } + /** + * @internal + */ + _emitFloat(value) { + if (value.toString() === value.toFixed(0)) { + return `${value}.0`; + } + return value.toString(); + } +}; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/bakedVertexAnimation.js -var name55 = "bakedVertexAnimation"; -var shader55 = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE -{ -#ifdef INSTANCES -#define BVASNAME bakedVertexAnimationSettingsInstanced -#else -#define BVASNAME bakedVertexAnimationSettings -#endif -float VATStartFrame=BVASNAME.x;float VATEndFrame=BVASNAME.y;float VATOffsetFrame=BVASNAME.z;float VATSpeed=BVASNAME.w;float totalFrames=VATEndFrame-VATStartFrame+1.0;float time=bakedVertexAnimationTime*VATSpeed/totalFrames;float frameCorrection=time<1.0 ? 0.0 : 1.0;float numOfFrames=totalFrames-frameCorrection;float VATFrameNum=fract(time)*numOfFrames;VATFrameNum=mod(VATFrameNum+VATOffsetFrame,numOfFrames);VATFrameNum=floor(VATFrameNum);VATFrameNum+=VATStartFrame+frameCorrection;mat4 VATInfluence;VATInfluence=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[0],VATFrameNum)*matricesWeights[0]; -#if NUM_BONE_INFLUENCERS>1 -VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[1],VATFrameNum)*matricesWeights[1]; -#endif -#if NUM_BONE_INFLUENCERS>2 -VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[2],VATFrameNum)*matricesWeights[2]; -#endif -#if NUM_BONE_INFLUENCERS>3 -VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[3],VATFrameNum)*matricesWeights[3]; -#endif -#if NUM_BONE_INFLUENCERS>4 -VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[0],VATFrameNum)*matricesWeightsExtra[0]; -#endif -#if NUM_BONE_INFLUENCERS>5 -VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[1],VATFrameNum)*matricesWeightsExtra[1]; -#endif -#if NUM_BONE_INFLUENCERS>6 -VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[2],VATFrameNum)*matricesWeightsExtra[2]; -#endif -#if NUM_BONE_INFLUENCERS>7 -VATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[3],VATFrameNum)*matricesWeightsExtra[3]; -#endif -finalWorld=finalWorld*VATInfluence;} -#endif +// node_modules/@babylonjs/core/Materials/Node/nodeMaterialBuildStateSharedData.js +var NodeMaterialBuildStateSharedData = class { + /** Creates a new shared data */ + constructor() { + this.temps = []; + this.varyings = []; + this.varyingDeclaration = ""; + this.inputBlocks = []; + this.textureBlocks = []; + this.bindableBlocks = []; + this.forcedBindableBlocks = []; + this.blocksWithFallbacks = []; + this.blocksWithDefines = []; + this.repeatableContentBlocks = []; + this.dynamicUniformBlocks = []; + this.blockingBlocks = []; + this.animatedInputs = []; + this.variableNames = {}; + this.defineNames = {}; + this.hints = { + needWorldViewMatrix: false, + needWorldViewProjectionMatrix: false, + needAlphaBlending: false, + needAlphaTesting: false + }; + this.checks = { + emitVertex: false, + emitFragment: false, + notConnectedNonOptionalInputs: new Array() + }; + this.allowEmptyVertexProgram = false; + this.variableNames["position"] = 0; + this.variableNames["normal"] = 0; + this.variableNames["tangent"] = 0; + this.variableNames["uv"] = 0; + this.variableNames["uv2"] = 0; + this.variableNames["uv3"] = 0; + this.variableNames["uv4"] = 0; + this.variableNames["uv5"] = 0; + this.variableNames["uv6"] = 0; + this.variableNames["color"] = 0; + this.variableNames["matricesIndices"] = 0; + this.variableNames["matricesWeights"] = 0; + this.variableNames["matricesIndicesExtra"] = 0; + this.variableNames["matricesWeightsExtra"] = 0; + this.variableNames["diffuseBase"] = 0; + this.variableNames["specularBase"] = 0; + this.variableNames["worldPos"] = 0; + this.variableNames["shadow"] = 0; + this.variableNames["view"] = 0; + this.variableNames["vTBN"] = 0; + this.defineNames["MAINUV0"] = 0; + this.defineNames["MAINUV1"] = 0; + this.defineNames["MAINUV2"] = 0; + this.defineNames["MAINUV3"] = 0; + this.defineNames["MAINUV4"] = 0; + this.defineNames["MAINUV5"] = 0; + this.defineNames["MAINUV6"] = 0; + this.defineNames["MAINUV7"] = 0; + } + /** + * Emits console errors and exceptions if there is a failing check + */ + emitErrors() { + let errorMessage = ""; + if (!this.checks.emitVertex && !this.allowEmptyVertexProgram) { + errorMessage += "NodeMaterial does not have a vertex output. You need to at least add a block that generates a glPosition value.\n"; + } + if (!this.checks.emitFragment) { + errorMessage += "NodeMaterial does not have a fragment output. You need to at least add a block that generates a glFragColor value.\n"; + } + for (const notConnectedInput of this.checks.notConnectedNonOptionalInputs) { + errorMessage += `input ${notConnectedInput.name} from block ${notConnectedInput.ownerBlock.name}[${notConnectedInput.ownerBlock.getClassName()}] is not connected and is not optional. `; -ShaderStore.IncludesShadersStore[name55] = shader55; + } + if (errorMessage) { + throw "Build of NodeMaterial failed:\n" + errorMessage; + } + } +}; + +// node_modules/@babylonjs/core/Materials/Node/nodeMaterial.js +var onCreatedEffectParameters2 = { effect: null, subMesh: null }; +var NodeMaterialDefines = class extends MaterialDefines { + /** + * Creates a new NodeMaterialDefines + */ + constructor() { + super(); + this.NORMAL = false; + this.TANGENT = false; + this.VERTEXCOLOR_NME = false; + this.UV1 = false; + this.UV2 = false; + this.UV3 = false; + this.UV4 = false; + this.UV5 = false; + this.UV6 = false; + this.PREPASS = false; + this.PREPASS_NORMAL = false; + this.PREPASS_NORMAL_INDEX = -1; + this.PREPASS_POSITION = false; + this.PREPASS_POSITION_INDEX = -1; + this.PREPASS_DEPTH = false; + this.PREPASS_DEPTH_INDEX = -1; + this.SCENE_MRT_COUNT = 0; + this.NUM_BONE_INFLUENCERS = 0; + this.BonesPerMesh = 0; + this.BONETEXTURE = false; + this.MORPHTARGETS = false; + this.MORPHTARGETS_NORMAL = false; + this.MORPHTARGETS_TANGENT = false; + this.MORPHTARGETS_UV = false; + this.NUM_MORPH_INFLUENCERS = 0; + this.MORPHTARGETS_TEXTURE = false; + this.IMAGEPROCESSING = false; + this.VIGNETTE = false; + this.VIGNETTEBLENDMODEMULTIPLY = false; + this.VIGNETTEBLENDMODEOPAQUE = false; + this.TONEMAPPING = false; + this.TONEMAPPING_ACES = false; + this.CONTRAST = false; + this.EXPOSURE = false; + this.COLORCURVES = false; + this.COLORGRADING = false; + this.COLORGRADING3D = false; + this.SAMPLER3DGREENDEPTH = false; + this.SAMPLER3DBGRMAP = false; + this.DITHER = false; + this.IMAGEPROCESSINGPOSTPROCESS = false; + this.SKIPFINALCOLORCLAMP = false; + this.BUMPDIRECTUV = 0; + this.CAMERA_ORTHOGRAPHIC = false; + this.CAMERA_PERSPECTIVE = false; + this.rebuild(); + } + /** + * Set the value of a specific key + * @param name defines the name of the key to set + * @param value defines the value to set + * @param markAsUnprocessedIfDirty Flag to indicate to the cache that this value needs processing + */ + setValue(name69, value, markAsUnprocessedIfDirty = false) { + if (this[name69] === void 0) { + this._keys.push(name69); + } + if (markAsUnprocessedIfDirty && this[name69] !== value) { + this.markAsUnprocessed(); + } + this[name69] = value; + } +}; +var NodeMaterial = class _NodeMaterial extends PushMaterial { + /** + * Checks if a block is a texture block + * @param block The block to check + * @returns True if the block is a texture block + */ + static _BlockIsTextureBlock(block) { + return block.getClassName() === "TextureBlock" || block.getClassName() === "ReflectionTextureBaseBlock" || block.getClassName() === "ReflectionTextureBlock" || block.getClassName() === "ReflectionBlock" || block.getClassName() === "RefractionBlock" || block.getClassName() === "CurrentScreenBlock" || block.getClassName() === "ParticleTextureBlock" || block.getClassName() === "ImageSourceBlock" || block.getClassName() === "TriPlanarBlock" || block.getClassName() === "BiPlanarBlock" || block.getClassName() === "PrePassTextureBlock"; + } + /** Get the inspector from bundle or global + * @returns the global NME + */ + _getGlobalNodeMaterialEditor() { + if (typeof NODEEDITOR !== "undefined") { + return NODEEDITOR; + } + if (typeof BABYLON !== "undefined" && typeof BABYLON.NodeEditor !== "undefined") { + return BABYLON; + } + return void 0; + } + /** Gets or sets options to control the node material overall behavior */ + get options() { + return this._options; + } + set options(options) { + this._options = options; + } + /** + * Gets the image processing configuration used either in this material. + */ + get imageProcessingConfiguration() { + return this._imageProcessingConfiguration; + } + /** + * Sets the Default image processing configuration used either in the this material. + * + * If sets to null, the scene one is in use. + */ + set imageProcessingConfiguration(value) { + this._attachImageProcessingConfiguration(value); + this._markAllSubMeshesAsTexturesDirty(); + } + /** + * Gets or sets the mode property + */ + get mode() { + return this._mode; + } + set mode(value) { + this._mode = value; + } + /** Gets or sets the unique identifier used to identified the effect associated with the material */ + get buildId() { + return this._buildId; + } + set buildId(value) { + this._buildId = value; + } + /** + * Create a new node based material + * @param name defines the material name + * @param scene defines the hosting scene + * @param options defines creation option + */ + constructor(name69, scene, options = {}) { + super(name69, scene || EngineStore.LastCreatedScene); + this._buildId = _NodeMaterial._BuildIdGenerator++; + this._buildWasSuccessful = false; + this._cachedWorldViewMatrix = new Matrix(); + this._cachedWorldViewProjectionMatrix = new Matrix(); + this._optimizers = new Array(); + this._animationFrame = -1; + this.BJSNODEMATERIALEDITOR = this._getGlobalNodeMaterialEditor(); + this.editorData = null; + this.ignoreAlpha = false; + this.maxSimultaneousLights = 4; + this.onBuildObservable = new Observable(); + this._vertexOutputNodes = new Array(); + this._fragmentOutputNodes = new Array(); + this.attachedBlocks = []; + this._mode = NodeMaterialModes.Material; + this.forceAlphaBlending = false; + this._options = { + emitComments: false, + ...options + }; + this._attachImageProcessingConfiguration(null); + } + /** + * Gets the current class name of the material e.g. "NodeMaterial" + * @returns the class name + */ + getClassName() { + return "NodeMaterial"; + } + /** + * Attaches a new image processing configuration to the Standard Material. + * @param configuration + */ + _attachImageProcessingConfiguration(configuration) { + if (configuration === this._imageProcessingConfiguration) { + return; + } + if (this._imageProcessingConfiguration && this._imageProcessingObserver) { + this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver); + } + if (!configuration) { + this._imageProcessingConfiguration = this.getScene().imageProcessingConfiguration; + } else { + this._imageProcessingConfiguration = configuration; + } + if (this._imageProcessingConfiguration) { + this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add(() => { + this._markAllSubMeshesAsImageProcessingDirty(); + }); + } + } + /** + * Get a block by its name + * @param name defines the name of the block to retrieve + * @returns the required block or null if not found + */ + getBlockByName(name69) { + let result = null; + for (const block of this.attachedBlocks) { + if (block.name === name69) { + if (!result) { + result = block; + } else { + Tools.Warn("More than one block was found with the name `" + name69 + "`"); + return result; + } + } + } + return result; + } + /** + * Get a block using a predicate + * @param predicate defines the predicate used to find the good candidate + * @returns the required block or null if not found + */ + getBlockByPredicate(predicate) { + for (const block of this.attachedBlocks) { + if (predicate(block)) { + return block; + } + } + return null; + } + /** + * Get an input block using a predicate + * @param predicate defines the predicate used to find the good candidate + * @returns the required input block or null if not found + */ + getInputBlockByPredicate(predicate) { + for (const block of this.attachedBlocks) { + if (block.isInput && predicate(block)) { + return block; + } + } + return null; + } + /** + * Gets the list of input blocks attached to this material + * @returns an array of InputBlocks + */ + getInputBlocks() { + const blocks = []; + for (const block of this.attachedBlocks) { + if (block.isInput) { + blocks.push(block); + } + } + return blocks; + } + /** + * Adds a new optimizer to the list of optimizers + * @param optimizer defines the optimizers to add + * @returns the current material + */ + registerOptimizer(optimizer) { + const index = this._optimizers.indexOf(optimizer); + if (index > -1) { + return; + } + this._optimizers.push(optimizer); + return this; + } + /** + * Remove an optimizer from the list of optimizers + * @param optimizer defines the optimizers to remove + * @returns the current material + */ + unregisterOptimizer(optimizer) { + const index = this._optimizers.indexOf(optimizer); + if (index === -1) { + return; + } + this._optimizers.splice(index, 1); + return this; + } + /** + * Add a new block to the list of output nodes + * @param node defines the node to add + * @returns the current material + */ + addOutputNode(node) { + if (node.target === null) { + throw "This node is not meant to be an output node. You may want to explicitly set its target value."; + } + if ((node.target & NodeMaterialBlockTargets.Vertex) !== 0) { + this._addVertexOutputNode(node); + } + if ((node.target & NodeMaterialBlockTargets.Fragment) !== 0) { + this._addFragmentOutputNode(node); + } + return this; + } + /** + * Remove a block from the list of root nodes + * @param node defines the node to remove + * @returns the current material + */ + removeOutputNode(node) { + if (node.target === null) { + return this; + } + if ((node.target & NodeMaterialBlockTargets.Vertex) !== 0) { + this._removeVertexOutputNode(node); + } + if ((node.target & NodeMaterialBlockTargets.Fragment) !== 0) { + this._removeFragmentOutputNode(node); + } + return this; + } + _addVertexOutputNode(node) { + if (this._vertexOutputNodes.indexOf(node) !== -1) { + return; + } + node.target = NodeMaterialBlockTargets.Vertex; + this._vertexOutputNodes.push(node); + return this; + } + _removeVertexOutputNode(node) { + const index = this._vertexOutputNodes.indexOf(node); + if (index === -1) { + return; + } + this._vertexOutputNodes.splice(index, 1); + return this; + } + _addFragmentOutputNode(node) { + if (this._fragmentOutputNodes.indexOf(node) !== -1) { + return; + } + node.target = NodeMaterialBlockTargets.Fragment; + this._fragmentOutputNodes.push(node); + return this; + } + _removeFragmentOutputNode(node) { + const index = this._fragmentOutputNodes.indexOf(node); + if (index === -1) { + return; + } + this._fragmentOutputNodes.splice(index, 1); + return this; + } + /** + * Specifies if the material will require alpha blending + * @returns a boolean specifying if alpha blending is needed + */ + needAlphaBlending() { + if (this.ignoreAlpha) { + return false; + } + return this.forceAlphaBlending || this.alpha < 1 || this._sharedData && this._sharedData.hints.needAlphaBlending; + } + /** + * Specifies if this material should be rendered in alpha test mode + * @returns a boolean specifying if an alpha test is needed. + */ + needAlphaTesting() { + return this._sharedData && this._sharedData.hints.needAlphaTesting; + } + _processInitializeOnLink(block, state, nodesToProcessForOtherBuildState, autoConfigure = true) { + if (block.target === NodeMaterialBlockTargets.VertexAndFragment) { + nodesToProcessForOtherBuildState.push(block); + } else if (state.target === NodeMaterialBlockTargets.Fragment && block.target === NodeMaterialBlockTargets.Vertex && block._preparationId !== this._buildId) { + nodesToProcessForOtherBuildState.push(block); + } + this._initializeBlock(block, state, nodesToProcessForOtherBuildState, autoConfigure); + } + _initializeBlock(node, state, nodesToProcessForOtherBuildState, autoConfigure = true) { + node.initialize(state); + if (autoConfigure) { + node.autoConfigure(this); + } + node._preparationId = this._buildId; + if (this.attachedBlocks.indexOf(node) === -1) { + if (node.isUnique) { + const className2 = node.getClassName(); + for (const other of this.attachedBlocks) { + if (other.getClassName() === className2) { + throw `Cannot have multiple blocks of type ${className2} in the same NodeMaterial`; + } + } + } + this.attachedBlocks.push(node); + } + for (const input of node.inputs) { + input.associatedVariableName = ""; + const connectedPoint = input.connectedPoint; + if (connectedPoint) { + const block = connectedPoint.ownerBlock; + if (block !== node) { + this._processInitializeOnLink(block, state, nodesToProcessForOtherBuildState, autoConfigure); + } + } + } + if (node.isTeleportOut) { + const teleport = node; + if (teleport.entryPoint) { + this._processInitializeOnLink(teleport.entryPoint, state, nodesToProcessForOtherBuildState, autoConfigure); + } + } + for (const output of node.outputs) { + output.associatedVariableName = ""; + } + } + _resetDualBlocks(node, id) { + if (node.target === NodeMaterialBlockTargets.VertexAndFragment) { + node.buildId = id; + } + for (const inputs of node.inputs) { + const connectedPoint = inputs.connectedPoint; + if (connectedPoint) { + const block = connectedPoint.ownerBlock; + if (block !== node) { + this._resetDualBlocks(block, id); + } + } + } + if (node.isTeleportOut) { + const teleportOut = node; + if (teleportOut.entryPoint) { + this._resetDualBlocks(teleportOut.entryPoint, id); + } + } + } + /** + * Remove a block from the current node material + * @param block defines the block to remove + */ + removeBlock(block) { + const attachedBlockIndex = this.attachedBlocks.indexOf(block); + if (attachedBlockIndex > -1) { + this.attachedBlocks.splice(attachedBlockIndex, 1); + } + if (block.isFinalMerger) { + this.removeOutputNode(block); + } + } + /** + * Build the material and generates the inner effect + * @param verbose defines if the build should log activity + * @param updateBuildId defines if the internal build Id should be updated (default is true) + * @param autoConfigure defines if the autoConfigure method should be called when initializing blocks (default is false) + */ + build(verbose = false, updateBuildId = true, autoConfigure = false) { + if (!this._vertexCompilationState && !autoConfigure) { + autoConfigure = true; + } + this._buildWasSuccessful = false; + const engine = this.getScene().getEngine(); + const allowEmptyVertexProgram = this._mode === NodeMaterialModes.Particle; + if (this._vertexOutputNodes.length === 0 && !allowEmptyVertexProgram) { + throw "You must define at least one vertexOutputNode"; + } + if (this._fragmentOutputNodes.length === 0) { + throw "You must define at least one fragmentOutputNode"; + } + this._vertexCompilationState = new NodeMaterialBuildState(); + this._vertexCompilationState.supportUniformBuffers = engine.supportsUniformBuffers; + this._vertexCompilationState.target = NodeMaterialBlockTargets.Vertex; + this._fragmentCompilationState = new NodeMaterialBuildState(); + this._fragmentCompilationState.supportUniformBuffers = engine.supportsUniformBuffers; + this._fragmentCompilationState.target = NodeMaterialBlockTargets.Fragment; + this._sharedData = new NodeMaterialBuildStateSharedData(); + this._sharedData.nodeMaterial = this; + this._sharedData.fragmentOutputNodes = this._fragmentOutputNodes; + this._vertexCompilationState.sharedData = this._sharedData; + this._fragmentCompilationState.sharedData = this._sharedData; + this._sharedData.buildId = this._buildId; + this._sharedData.emitComments = this._options.emitComments; + this._sharedData.verbose = verbose; + this._sharedData.scene = this.getScene(); + this._sharedData.allowEmptyVertexProgram = allowEmptyVertexProgram; + const vertexNodes = []; + const fragmentNodes = []; + for (const vertexOutputNode of this._vertexOutputNodes) { + vertexNodes.push(vertexOutputNode); + this._initializeBlock(vertexOutputNode, this._vertexCompilationState, fragmentNodes, autoConfigure); + } + for (const fragmentOutputNode of this._fragmentOutputNodes) { + fragmentNodes.push(fragmentOutputNode); + this._initializeBlock(fragmentOutputNode, this._fragmentCompilationState, vertexNodes, autoConfigure); + } + this.optimize(); + for (const vertexOutputNode of vertexNodes) { + vertexOutputNode.build(this._vertexCompilationState, vertexNodes); + } + this._fragmentCompilationState.uniforms = this._vertexCompilationState.uniforms.slice(0); + this._fragmentCompilationState._uniformDeclaration = this._vertexCompilationState._uniformDeclaration; + this._fragmentCompilationState._constantDeclaration = this._vertexCompilationState._constantDeclaration; + this._fragmentCompilationState._vertexState = this._vertexCompilationState; + for (const fragmentOutputNode of fragmentNodes) { + this._resetDualBlocks(fragmentOutputNode, this._buildId - 1); + } + for (const fragmentOutputNode of fragmentNodes) { + fragmentOutputNode.build(this._fragmentCompilationState, fragmentNodes); + } + this._vertexCompilationState.finalize(this._vertexCompilationState); + this._fragmentCompilationState.finalize(this._fragmentCompilationState); + if (updateBuildId) { + this._buildId = _NodeMaterial._BuildIdGenerator++; + } + this._sharedData.emitErrors(); + if (verbose) { + Logger.Log("Vertex shader:"); + Logger.Log(this._vertexCompilationState.compilationString); + Logger.Log("Fragment shader:"); + Logger.Log(this._fragmentCompilationState.compilationString); + } + this._buildWasSuccessful = true; + this.onBuildObservable.notifyObservers(this); + const meshes = this.getScene().meshes; + for (const mesh of meshes) { + if (!mesh.subMeshes) { + continue; + } + for (const subMesh of mesh.subMeshes) { + if (subMesh.getMaterial() !== this) { + continue; + } + if (!subMesh.materialDefines) { + continue; + } + const defines = subMesh.materialDefines; + defines.markAllAsDirty(); + defines.reset(); + } + } + if (this.prePassTextureInputs.length) { + this.getScene().enablePrePassRenderer(); + } + const prePassRenderer = this.getScene().prePassRenderer; + if (prePassRenderer) { + prePassRenderer.markAsDirty(); + } + } + /** + * Runs an otpimization phase to try to improve the shader code + */ + optimize() { + for (const optimizer of this._optimizers) { + optimizer.optimize(this._vertexOutputNodes, this._fragmentOutputNodes); + } + } + _prepareDefinesForAttributes(mesh, defines) { + const oldNormal = defines["NORMAL"]; + const oldTangent = defines["TANGENT"]; + const oldColor = defines["VERTEXCOLOR_NME"]; + defines["NORMAL"] = mesh.isVerticesDataPresent(VertexBuffer.NormalKind); + defines["TANGENT"] = mesh.isVerticesDataPresent(VertexBuffer.TangentKind); + const hasVertexColors = mesh.useVertexColors && mesh.isVerticesDataPresent(VertexBuffer.ColorKind); + defines["VERTEXCOLOR_NME"] = hasVertexColors; + let uvChanged = false; + for (let i = 1; i <= 6; ++i) { + const oldUV = defines["UV" + i]; + defines["UV" + i] = mesh.isVerticesDataPresent(`uv${i === 1 ? "" : i}`); + uvChanged = uvChanged || defines["UV" + i] !== oldUV; + } + const oit = this.needAlphaBlendingForMesh(mesh) && this.getScene().useOrderIndependentTransparency; + PrepareDefinesForPrePass(this.getScene(), defines, !oit); + if (oldNormal !== defines["NORMAL"] || oldTangent !== defines["TANGENT"] || oldColor !== defines["VERTEXCOLOR_NME"] || uvChanged) { + defines.markAsAttributesDirty(); + } + } + /** + * Can this material render to prepass + */ + get isPrePassCapable() { + return true; + } + /** + * Outputs written to the prepass + */ + get prePassTextureOutputs() { + const prePassOutputBlock = this.getBlockByPredicate((block) => block.getClassName() === "PrePassOutputBlock"); + const result = [4]; + if (!prePassOutputBlock) { + return result; + } + if (this.prePassTextureInputs.length) { + return result; + } + if (prePassOutputBlock.viewDepth.isConnected) { + result.push(5); + } + if (prePassOutputBlock.viewNormal.isConnected) { + result.push(6); + } + if (prePassOutputBlock.worldPosition.isConnected) { + result.push(1); + } + return result; + } + /** + * Gets the list of prepass texture required + */ + get prePassTextureInputs() { + const prePassTextureBlocks = this.getAllTextureBlocks().filter((block) => block.getClassName() === "PrePassTextureBlock"); + const result = []; + for (const block of prePassTextureBlocks) { + if (block.position.isConnected && !result.includes(1)) { + result.push(1); + } + if (block.depth.isConnected && !result.includes(5)) { + result.push(5); + } + if (block.normal.isConnected && !result.includes(6)) { + result.push(6); + } + } + return result; + } + /** + * Sets the required values to the prepass renderer. + * @param prePassRenderer defines the prepass renderer to set + * @returns true if the pre pass is needed + */ + setPrePassRenderer(prePassRenderer) { + const prePassTexturesRequired = this.prePassTextureInputs.concat(this.prePassTextureOutputs); + if (prePassRenderer && prePassTexturesRequired.length > 1) { + let cfg = prePassRenderer.getEffectConfiguration("nodeMaterial"); + if (!cfg) { + cfg = prePassRenderer.addEffectConfiguration({ + enabled: true, + needsImageProcessing: false, + name: "nodeMaterial", + texturesRequired: [] + }); + } + for (const prePassTexture of prePassTexturesRequired) { + if (!cfg.texturesRequired.includes(prePassTexture)) { + cfg.texturesRequired.push(prePassTexture); + } + } + cfg.enabled = true; + } + return prePassTexturesRequired.length > 1; + } + /** + * Create a post process from the material + * @param camera The camera to apply the render pass to. + * @param options The required width/height ratio to downsize to before computing the render pass. (Use 1.0 for full size) + * @param samplingMode The sampling mode to be used when computing the pass. (default: 0) + * @param engine The engine which the post process will be applied. (default: current engine) + * @param reusable If the post process can be reused on the same frame. (default: false) + * @param textureType Type of textures used when performing the post process. (default: 0) + * @param textureFormat Format of textures used when performing the post process. (default: TEXTUREFORMAT_RGBA) + * @returns the post process created + */ + createPostProcess(camera, options = 1, samplingMode = 1, engine, reusable, textureType = 0, textureFormat = 5) { + if (this.mode !== NodeMaterialModes.PostProcess) { + Logger.Log("Incompatible material mode"); + return null; + } + return this._createEffectForPostProcess(null, camera, options, samplingMode, engine, reusable, textureType, textureFormat); + } + /** + * Create the post process effect from the material + * @param postProcess The post process to create the effect for + */ + createEffectForPostProcess(postProcess) { + this._createEffectForPostProcess(postProcess); + } + _createEffectForPostProcess(postProcess, camera, options = 1, samplingMode = 1, engine, reusable, textureType = 0, textureFormat = 5) { + let tempName = this.name + this._buildId; + const defines = new NodeMaterialDefines(); + const dummyMesh = new AbstractMesh(tempName + "PostProcess", this.getScene()); + let buildId = this._buildId; + this._processDefines(dummyMesh, defines); + Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString); + if (!postProcess) { + postProcess = new PostProcess(this.name + "PostProcess", tempName, this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, options, camera, samplingMode, engine, reusable, defines.toString(), textureType, tempName, { maxSimultaneousLights: this.maxSimultaneousLights }, false, textureFormat); + } else { + postProcess.updateEffect(defines.toString(), this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, { maxSimultaneousLights: this.maxSimultaneousLights }, void 0, void 0, tempName, tempName); + } + postProcess.nodeMaterialSource = this; + postProcess.onApplyObservable.add((effect) => { + if (buildId !== this._buildId) { + delete Effect.ShadersStore[tempName + "VertexShader"]; + delete Effect.ShadersStore[tempName + "PixelShader"]; + tempName = this.name + this._buildId; + defines.markAllAsDirty(); + buildId = this._buildId; + } + const result = this._processDefines(dummyMesh, defines); + if (result) { + Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString); + TimingTools.SetImmediate(() => postProcess.updateEffect(defines.toString(), this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, { maxSimultaneousLights: this.maxSimultaneousLights }, void 0, void 0, tempName, tempName)); + } + this._checkInternals(effect); + }); + return postProcess; + } + /** + * Create a new procedural texture based on this node material + * @param size defines the size of the texture + * @param scene defines the hosting scene + * @returns the new procedural texture attached to this node material + */ + createProceduralTexture(size, scene) { + if (this.mode !== NodeMaterialModes.ProceduralTexture) { + Logger.Log("Incompatible material mode"); + return null; + } + let tempName = this.name + this._buildId; + const proceduralTexture = new ProceduralTexture(tempName, size, null, scene); + const dummyMesh = new AbstractMesh(tempName + "Procedural", this.getScene()); + dummyMesh.reservedDataStore = { + hidden: true + }; + const defines = new NodeMaterialDefines(); + const result = this._processDefines(dummyMesh, defines); + Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString); + let effect = this.getScene().getEngine().createEffect({ + vertexElement: tempName, + fragmentElement: tempName + }, [VertexBuffer.PositionKind], this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, defines.toString(), result == null ? void 0 : result.fallbacks, void 0); + proceduralTexture.nodeMaterialSource = this; + proceduralTexture._setEffect(effect); + let buildId = this._buildId; + proceduralTexture.onBeforeGenerationObservable.add(() => { + if (buildId !== this._buildId) { + delete Effect.ShadersStore[tempName + "VertexShader"]; + delete Effect.ShadersStore[tempName + "PixelShader"]; + tempName = this.name + this._buildId; + defines.markAllAsDirty(); + buildId = this._buildId; + } + const result2 = this._processDefines(dummyMesh, defines); + if (result2) { + Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString); + TimingTools.SetImmediate(() => { + effect = this.getScene().getEngine().createEffect({ + vertexElement: tempName, + fragmentElement: tempName + }, [VertexBuffer.PositionKind], this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, defines.toString(), result2 == null ? void 0 : result2.fallbacks, void 0); + proceduralTexture._setEffect(effect); + }); + } + this._checkInternals(effect); + }); + return proceduralTexture; + } + _createEffectForParticles(particleSystem, blendMode, onCompiled, onError, effect, defines, dummyMesh, particleSystemDefinesJoined = "") { + let tempName = this.name + this._buildId + "_" + blendMode; + if (!defines) { + defines = new NodeMaterialDefines(); + } + if (!dummyMesh) { + dummyMesh = this.getScene().getMeshByName(this.name + "Particle"); + if (!dummyMesh) { + dummyMesh = new AbstractMesh(this.name + "Particle", this.getScene()); + dummyMesh.reservedDataStore = { + hidden: true + }; + } + } + let buildId = this._buildId; + const particleSystemDefines = []; + let join = particleSystemDefinesJoined; + if (!effect) { + const result = this._processDefines(dummyMesh, defines); + Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString); + particleSystem.fillDefines(particleSystemDefines, blendMode); + join = particleSystemDefines.join("\n"); + effect = this.getScene().getEngine().createEffectForParticles(tempName, this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, defines.toString() + "\n" + join, result == null ? void 0 : result.fallbacks, onCompiled, onError, particleSystem); + particleSystem.setCustomEffect(effect, blendMode); + } + effect.onBindObservable.add((effect2) => { + if (buildId !== this._buildId) { + delete Effect.ShadersStore[tempName + "PixelShader"]; + tempName = this.name + this._buildId + "_" + blendMode; + defines.markAllAsDirty(); + buildId = this._buildId; + } + particleSystemDefines.length = 0; + particleSystem.fillDefines(particleSystemDefines, blendMode); + const particleSystemDefinesJoinedCurrent = particleSystemDefines.join("\n"); + if (particleSystemDefinesJoinedCurrent !== join) { + defines.markAllAsDirty(); + join = particleSystemDefinesJoinedCurrent; + } + const result = this._processDefines(dummyMesh, defines); + if (result) { + Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString); + effect2 = this.getScene().getEngine().createEffectForParticles(tempName, this._fragmentCompilationState.uniforms, this._fragmentCompilationState.samplers, defines.toString() + "\n" + join, result == null ? void 0 : result.fallbacks, onCompiled, onError, particleSystem); + particleSystem.setCustomEffect(effect2, blendMode); + this._createEffectForParticles(particleSystem, blendMode, onCompiled, onError, effect2, defines, dummyMesh, particleSystemDefinesJoined); + return; + } + this._checkInternals(effect2); + }); + } + _checkInternals(effect) { + if (this._sharedData.animatedInputs) { + const scene = this.getScene(); + const frameId = scene.getFrameId(); + if (this._animationFrame !== frameId) { + for (const input of this._sharedData.animatedInputs) { + input.animate(scene); + } + this._animationFrame = frameId; + } + } + for (const block of this._sharedData.bindableBlocks) { + block.bind(effect, this); + } + for (const inputBlock of this._sharedData.inputBlocks) { + inputBlock._transmit(effect, this.getScene(), this); + } + } + /** + * Create the effect to be used as the custom effect for a particle system + * @param particleSystem Particle system to create the effect for + * @param onCompiled defines a function to call when the effect creation is successful + * @param onError defines a function to call when the effect creation has failed + */ + createEffectForParticles(particleSystem, onCompiled, onError) { + if (this.mode !== NodeMaterialModes.Particle) { + Logger.Log("Incompatible material mode"); + return; + } + this._createEffectForParticles(particleSystem, BaseParticleSystem.BLENDMODE_ONEONE, onCompiled, onError); + this._createEffectForParticles(particleSystem, BaseParticleSystem.BLENDMODE_MULTIPLY, onCompiled, onError); + } + /** + * Use this material as the shadow depth wrapper of a target material + * @param targetMaterial defines the target material + */ + createAsShadowDepthWrapper(targetMaterial) { + if (this.mode !== NodeMaterialModes.Material) { + Logger.Log("Incompatible material mode"); + return; + } + targetMaterial.shadowDepthWrapper = new BABYLON.ShadowDepthWrapper(this, this.getScene()); + } + _processDefines(mesh, defines, useInstances = false, subMesh) { + let result = null; + const scene = this.getScene(); + if (PrepareDefinesForCamera(scene, defines)) { + defines.markAsMiscDirty(); + } + this._sharedData.blocksWithDefines.forEach((b) => { + b.initializeDefines(mesh, this, defines, useInstances); + }); + this._sharedData.blocksWithDefines.forEach((b) => { + b.prepareDefines(mesh, this, defines, useInstances, subMesh); + }); + if (defines.isDirty) { + const lightDisposed = defines._areLightsDisposed; + defines.markAsProcessed(); + this._vertexCompilationState.compilationString = this._vertexCompilationState._builtCompilationString; + this._fragmentCompilationState.compilationString = this._fragmentCompilationState._builtCompilationString; + this._sharedData.repeatableContentBlocks.forEach((b) => { + b.replaceRepeatableContent(this._vertexCompilationState, this._fragmentCompilationState, mesh, defines); + }); + const uniformBuffers = []; + this._sharedData.dynamicUniformBlocks.forEach((b) => { + b.updateUniformsAndSamples(this._vertexCompilationState, this, defines, uniformBuffers); + }); + const mergedUniforms = this._vertexCompilationState.uniforms; + this._fragmentCompilationState.uniforms.forEach((u) => { + const index = mergedUniforms.indexOf(u); + if (index === -1) { + mergedUniforms.push(u); + } + }); + const mergedSamplers = this._vertexCompilationState.samplers; + this._fragmentCompilationState.samplers.forEach((s) => { + const index = mergedSamplers.indexOf(s); + if (index === -1) { + mergedSamplers.push(s); + } + }); + const fallbacks = new EffectFallbacks(); + this._sharedData.blocksWithFallbacks.forEach((b) => { + b.provideFallbacks(mesh, fallbacks); + }); + result = { + lightDisposed, + uniformBuffers, + mergedUniforms, + mergedSamplers, + fallbacks + }; + } + return result; + } + /** + * Get if the submesh is ready to be used and all its information available. + * Child classes can use it to update shaders + * @param mesh defines the mesh to check + * @param subMesh defines which submesh to check + * @param useInstances specifies that instances should be used + * @returns a boolean indicating that the submesh is ready or not + */ + isReadyForSubMesh(mesh, subMesh, useInstances = false) { + if (!this._buildWasSuccessful) { + return false; + } + const scene = this.getScene(); + if (this._sharedData.animatedInputs) { + const frameId = scene.getFrameId(); + if (this._animationFrame !== frameId) { + for (const input of this._sharedData.animatedInputs) { + input.animate(scene); + } + this._animationFrame = frameId; + } + } + const drawWrapper = subMesh._drawWrapper; + if (drawWrapper.effect && this.isFrozen) { + if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) { + return true; + } + } + if (!subMesh.materialDefines) { + subMesh.materialDefines = new NodeMaterialDefines(); + } + const defines = subMesh.materialDefines; + if (this._isReadyForSubMesh(subMesh)) { + return true; + } + const engine = scene.getEngine(); + this._prepareDefinesForAttributes(mesh, defines); + if (this._sharedData.blockingBlocks.some((b) => !b.isReady(mesh, this, defines, useInstances))) { + return false; + } + const result = this._processDefines(mesh, defines, useInstances, subMesh); + if (result) { + const previousEffect = subMesh.effect; + const join = defines.toString(); + let effect = engine.createEffect({ + vertex: "nodeMaterial" + this._buildId, + fragment: "nodeMaterial" + this._buildId, + vertexSource: this._vertexCompilationState.compilationString, + fragmentSource: this._fragmentCompilationState.compilationString + }, { + attributes: this._vertexCompilationState.attributes, + uniformsNames: result.mergedUniforms, + uniformBuffersNames: result.uniformBuffers, + samplers: result.mergedSamplers, + defines: join, + fallbacks: result.fallbacks, + onCompiled: this.onCompiled, + onError: this.onError, + multiTarget: defines.PREPASS, + indexParameters: { maxSimultaneousLights: this.maxSimultaneousLights, maxSimultaneousMorphTargets: defines.NUM_MORPH_INFLUENCERS } + }, engine); + if (effect) { + if (this._onEffectCreatedObservable) { + onCreatedEffectParameters2.effect = effect; + onCreatedEffectParameters2.subMesh = subMesh; + this._onEffectCreatedObservable.notifyObservers(onCreatedEffectParameters2); + } + if (this.allowShaderHotSwapping && previousEffect && !effect.isReady()) { + effect = previousEffect; + defines.markAsUnprocessed(); + if (result.lightDisposed) { + defines._areLightsDisposed = true; + return false; + } + } else { + scene.resetCachedMaterial(); + subMesh.setEffect(effect, defines, this._materialContext); + } + } + } + if (!subMesh.effect || !subMesh.effect.isReady()) { + return false; + } + defines._renderId = scene.getRenderId(); + drawWrapper._wasPreviouslyReady = true; + drawWrapper._wasPreviouslyUsingInstances = useInstances; + this._checkScenePerformancePriority(); + return true; + } + /** + * Get a string representing the shaders built by the current node graph + */ + get compiledShaders() { + return `// Vertex shader +${this._vertexCompilationState.compilationString} -// node_modules/@babylonjs/core/Shaders/ShadersInclude/prePassVertex.js -var name56 = "prePassVertex"; -var shader56 = `#ifdef PREPASS_DEPTH -vViewPos=(view*worldPos).rgb; -#endif -#if defined(PREPASS_VELOCITY) && defined(BONES_VELOCITY_ENABLED) -vCurrentPosition=viewProjection*worldPos; -#if NUM_BONE_INFLUENCERS>0 -mat4 previousInfluence;previousInfluence=mPreviousBones[int(matricesIndices[0])]*matricesWeights[0]; -#if NUM_BONE_INFLUENCERS>1 -previousInfluence+=mPreviousBones[int(matricesIndices[1])]*matricesWeights[1]; -#endif -#if NUM_BONE_INFLUENCERS>2 -previousInfluence+=mPreviousBones[int(matricesIndices[2])]*matricesWeights[2]; -#endif -#if NUM_BONE_INFLUENCERS>3 -previousInfluence+=mPreviousBones[int(matricesIndices[3])]*matricesWeights[3]; -#endif -#if NUM_BONE_INFLUENCERS>4 -previousInfluence+=mPreviousBones[int(matricesIndicesExtra[0])]*matricesWeightsExtra[0]; -#endif -#if NUM_BONE_INFLUENCERS>5 -previousInfluence+=mPreviousBones[int(matricesIndicesExtra[1])]*matricesWeightsExtra[1]; -#endif -#if NUM_BONE_INFLUENCERS>6 -previousInfluence+=mPreviousBones[int(matricesIndicesExtra[2])]*matricesWeightsExtra[2]; -#endif -#if NUM_BONE_INFLUENCERS>7 -previousInfluence+=mPreviousBones[int(matricesIndicesExtra[3])]*matricesWeightsExtra[3]; -#endif -vPreviousPosition=previousViewProjection*finalPreviousWorld*previousInfluence*vec4(positionUpdated,1.0); -#else -vPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0); -#endif -#endif +// Fragment shader +${this._fragmentCompilationState.compilationString}`; + } + /** + * Binds the world matrix to the material + * @param world defines the world transformation matrix + */ + bindOnlyWorldMatrix(world) { + const scene = this.getScene(); + if (!this._activeEffect) { + return; + } + const hints = this._sharedData.hints; + if (hints.needWorldViewMatrix) { + world.multiplyToRef(scene.getViewMatrix(), this._cachedWorldViewMatrix); + } + if (hints.needWorldViewProjectionMatrix) { + world.multiplyToRef(scene.getTransformMatrix(), this._cachedWorldViewProjectionMatrix); + } + for (const inputBlock of this._sharedData.inputBlocks) { + inputBlock._transmitWorld(this._activeEffect, world, this._cachedWorldViewMatrix, this._cachedWorldViewProjectionMatrix); + } + } + /** + * Binds the submesh to this material by preparing the effect and shader to draw + * @param world defines the world transformation matrix + * @param mesh defines the mesh containing the submesh + * @param subMesh defines the submesh to bind the material to + */ + bindForSubMesh(world, mesh, subMesh) { + const scene = this.getScene(); + const effect = subMesh.effect; + if (!effect) { + return; + } + this._activeEffect = effect; + this.bindOnlyWorldMatrix(world); + const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility); + const sharedData = this._sharedData; + if (mustRebind) { + for (const block of sharedData.bindableBlocks) { + block.bind(effect, this, mesh, subMesh); + } + for (const block of sharedData.forcedBindableBlocks) { + block.bind(effect, this, mesh, subMesh); + } + for (const inputBlock of sharedData.inputBlocks) { + inputBlock._transmit(effect, scene, this); + } + } else if (!this.isFrozen) { + for (const block of sharedData.forcedBindableBlocks) { + block.bind(effect, this, mesh, subMesh); + } + } + this._afterBind(mesh, this._activeEffect, subMesh); + } + /** + * Gets the active textures from the material + * @returns an array of textures + */ + getActiveTextures() { + const activeTextures = super.getActiveTextures(); + if (this._sharedData) { + activeTextures.push(...this._sharedData.textureBlocks.filter((tb) => tb.texture).map((tb) => tb.texture)); + } + return activeTextures; + } + /** + * Gets the list of texture blocks + * Note that this method will only return blocks that are reachable from the final block(s) and only after the material has been built! + * @returns an array of texture blocks + */ + getTextureBlocks() { + if (!this._sharedData) { + return []; + } + return this._sharedData.textureBlocks; + } + /** + * Gets the list of all texture blocks + * Note that this method will scan all attachedBlocks and return blocks that are texture blocks + * @returns + */ + getAllTextureBlocks() { + const textureBlocks = []; + for (const block of this.attachedBlocks) { + if (_NodeMaterial._BlockIsTextureBlock(block)) { + textureBlocks.push(block); + } + } + return textureBlocks; + } + /** + * Specifies if the material uses a texture + * @param texture defines the texture to check against the material + * @returns a boolean specifying if the material uses the texture + */ + hasTexture(texture) { + if (super.hasTexture(texture)) { + return true; + } + if (!this._sharedData) { + return false; + } + for (const t of this._sharedData.textureBlocks) { + if (t.texture === texture) { + return true; + } + } + return false; + } + /** + * Disposes the material + * @param forceDisposeEffect specifies if effects should be forcefully disposed + * @param forceDisposeTextures specifies if textures should be forcefully disposed + * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh + */ + dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh) { + if (forceDisposeTextures) { + for (const texture of this.getTextureBlocks().filter((tb) => tb.texture).map((tb) => tb.texture)) { + texture.dispose(); + } + } + for (const block of this.attachedBlocks) { + block.dispose(); + } + this.attachedBlocks.length = 0; + this._sharedData = null; + this._vertexCompilationState = null; + this._fragmentCompilationState = null; + this.onBuildObservable.clear(); + if (this._imageProcessingObserver) { + this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver); + this._imageProcessingObserver = null; + } + super.dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh); + } + /** Creates the node editor window. + * @param additionalConfig Define the configuration of the editor + */ + _createNodeEditor(additionalConfig) { + const nodeEditorConfig = { + nodeMaterial: this, + ...additionalConfig + }; + this.BJSNODEMATERIALEDITOR.NodeEditor.Show(nodeEditorConfig); + } + /** + * Launch the node material editor + * @param config Define the configuration of the editor + * @returns a promise fulfilled when the node editor is visible + */ + edit(config) { + return new Promise((resolve) => { + this.BJSNODEMATERIALEDITOR = this.BJSNODEMATERIALEDITOR || this._getGlobalNodeMaterialEditor(); + if (typeof this.BJSNODEMATERIALEDITOR == "undefined") { + const editorUrl = config && config.editorURL ? config.editorURL : _NodeMaterial.EditorURL; + Tools.LoadBabylonScript(editorUrl, () => { + this.BJSNODEMATERIALEDITOR = this.BJSNODEMATERIALEDITOR || this._getGlobalNodeMaterialEditor(); + this._createNodeEditor(config == null ? void 0 : config.nodeEditorConfig); + resolve(); + }); + } else { + this._createNodeEditor(config == null ? void 0 : config.nodeEditorConfig); + resolve(); + } + }); + } + /** + * Clear the current material + */ + clear() { + this._vertexOutputNodes.length = 0; + this._fragmentOutputNodes.length = 0; + this.attachedBlocks.length = 0; + } + /** + * Clear the current material and set it to a default state + */ + setToDefault() { + this.clear(); + this.editorData = null; + const positionInput = new InputBlock("Position"); + positionInput.setAsAttribute("position"); + const worldInput = new InputBlock("World"); + worldInput.setAsSystemValue(NodeMaterialSystemValues.World); + const worldPos = new TransformBlock("WorldPos"); + positionInput.connectTo(worldPos); + worldInput.connectTo(worldPos); + const viewProjectionInput = new InputBlock("ViewProjection"); + viewProjectionInput.setAsSystemValue(NodeMaterialSystemValues.ViewProjection); + const worldPosdMultipliedByViewProjection = new TransformBlock("WorldPos * ViewProjectionTransform"); + worldPos.connectTo(worldPosdMultipliedByViewProjection); + viewProjectionInput.connectTo(worldPosdMultipliedByViewProjection); + const vertexOutput = new VertexOutputBlock("VertexOutput"); + worldPosdMultipliedByViewProjection.connectTo(vertexOutput); + const pixelColor = new InputBlock("color"); + pixelColor.value = new Color4(0.8, 0.8, 0.8, 1); + const fragmentOutput = new FragmentOutputBlock("FragmentOutput"); + pixelColor.connectTo(fragmentOutput); + this.addOutputNode(vertexOutput); + this.addOutputNode(fragmentOutput); + this._mode = NodeMaterialModes.Material; + } + /** + * Clear the current material and set it to a default state for post process + */ + setToDefaultPostProcess() { + this.clear(); + this.editorData = null; + const position = new InputBlock("Position"); + position.setAsAttribute("position2d"); + const const1 = new InputBlock("Constant1"); + const1.isConstant = true; + const1.value = 1; + const vmerger = new VectorMergerBlock("Position3D"); + position.connectTo(vmerger); + const1.connectTo(vmerger, { input: "w" }); + const vertexOutput = new VertexOutputBlock("VertexOutput"); + vmerger.connectTo(vertexOutput); + const scale = new InputBlock("Scale"); + scale.visibleInInspector = true; + scale.value = new Vector2(1, 1); + const uv0 = new RemapBlock("uv0"); + position.connectTo(uv0); + const uv = new MultiplyBlock("UV scale"); + uv0.connectTo(uv); + scale.connectTo(uv); + const currentScreen = new CurrentScreenBlock("CurrentScreen"); + uv.connectTo(currentScreen); + currentScreen.texture = new Texture("https://assets.babylonjs.com/nme/currentScreenPostProcess.png", this.getScene()); + const fragmentOutput = new FragmentOutputBlock("FragmentOutput"); + currentScreen.connectTo(fragmentOutput, { output: "rgba" }); + this.addOutputNode(vertexOutput); + this.addOutputNode(fragmentOutput); + this._mode = NodeMaterialModes.PostProcess; + } + /** + * Clear the current material and set it to a default state for procedural texture + */ + setToDefaultProceduralTexture() { + this.clear(); + this.editorData = null; + const position = new InputBlock("Position"); + position.setAsAttribute("position2d"); + const const1 = new InputBlock("Constant1"); + const1.isConstant = true; + const1.value = 1; + const vmerger = new VectorMergerBlock("Position3D"); + position.connectTo(vmerger); + const1.connectTo(vmerger, { input: "w" }); + const vertexOutput = new VertexOutputBlock("VertexOutput"); + vmerger.connectTo(vertexOutput); + const time = new InputBlock("Time"); + time.value = 0; + time.min = 0; + time.max = 0; + time.isBoolean = false; + time.matrixMode = 0; + time.animationType = AnimatedInputBlockTypes.Time; + time.isConstant = false; + const color = new InputBlock("Color3"); + color.value = new Color3(1, 1, 1); + color.isConstant = false; + const fragmentOutput = new FragmentOutputBlock("FragmentOutput"); + const vectorMerger = new VectorMergerBlock("VectorMerger"); + vectorMerger.visibleInInspector = false; + const cos = new TrigonometryBlock("Cos"); + cos.operation = TrigonometryBlockOperations.Cos; + position.connectTo(vectorMerger); + time.output.connectTo(cos.input); + cos.output.connectTo(vectorMerger.z); + vectorMerger.xyzOut.connectTo(fragmentOutput.rgb); + this.addOutputNode(vertexOutput); + this.addOutputNode(fragmentOutput); + this._mode = NodeMaterialModes.ProceduralTexture; + } + /** + * Clear the current material and set it to a default state for particle + */ + setToDefaultParticle() { + this.clear(); + this.editorData = null; + const uv = new InputBlock("uv"); + uv.setAsAttribute("particle_uv"); + const texture = new ParticleTextureBlock("ParticleTexture"); + uv.connectTo(texture); + const color = new InputBlock("Color"); + color.setAsAttribute("particle_color"); + const multiply = new MultiplyBlock("Texture * Color"); + texture.connectTo(multiply); + color.connectTo(multiply); + const rampGradient = new ParticleRampGradientBlock("ParticleRampGradient"); + multiply.connectTo(rampGradient); + const cSplitter = new ColorSplitterBlock("ColorSplitter"); + color.connectTo(cSplitter); + const blendMultiply = new ParticleBlendMultiplyBlock("ParticleBlendMultiply"); + rampGradient.connectTo(blendMultiply); + texture.connectTo(blendMultiply, { output: "a" }); + cSplitter.connectTo(blendMultiply, { output: "a" }); + const fragmentOutput = new FragmentOutputBlock("FragmentOutput"); + blendMultiply.connectTo(fragmentOutput); + this.addOutputNode(fragmentOutput); + this._mode = NodeMaterialModes.Particle; + } + /** + * Loads the current Node Material from a url pointing to a file save by the Node Material Editor + * @deprecated Please use NodeMaterial.ParseFromFileAsync instead + * @param url defines the url to load from + * @param rootUrl defines the root URL for nested url in the node material + * @returns a promise that will fulfil when the material is fully loaded + */ + async loadAsync(url, rootUrl = "") { + return _NodeMaterial.ParseFromFileAsync("", url, this.getScene(), rootUrl, true, this); + } + _gatherBlocks(rootNode, list) { + if (list.indexOf(rootNode) !== -1) { + return; + } + list.push(rootNode); + for (const input of rootNode.inputs) { + const connectedPoint = input.connectedPoint; + if (connectedPoint) { + const block = connectedPoint.ownerBlock; + if (block !== rootNode) { + this._gatherBlocks(block, list); + } + } + } + if (rootNode.isTeleportOut) { + const block = rootNode; + if (block.entryPoint) { + this._gatherBlocks(block.entryPoint, list); + } + } + } + /** + * Generate a string containing the code declaration required to create an equivalent of this material + * @returns a string + */ + generateCode() { + let alreadyDumped = []; + const vertexBlocks = []; + const uniqueNames = ["const", "var", "let"]; + for (const outputNode of this._vertexOutputNodes) { + this._gatherBlocks(outputNode, vertexBlocks); + } + const fragmentBlocks = []; + for (const outputNode of this._fragmentOutputNodes) { + this._gatherBlocks(outputNode, fragmentBlocks); + } + let codeString = `var nodeMaterial = new BABYLON.NodeMaterial("${this.name || "node material"}"); `; -ShaderStore.IncludesShadersStore[name56] = shader56; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/uvVariableDeclaration.js -var name57 = "uvVariableDeclaration"; -var shader57 = `#if !defined(UV{X}) && defined(MAINUV{X}) -vec2 uv{X}=vec2(0.,0.); -#endif -#ifdef MAINUV{X} -vMainUV{X}=uv{X}; -#endif + codeString += `nodeMaterial.mode = BABYLON.NodeMaterialModes.${NodeMaterialModes[this.mode]}; `; -ShaderStore.IncludesShadersStore[name57] = shader57; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/samplerVertexImplementation.js -var name58 = "samplerVertexImplementation"; -var shader58 = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0 -if (v_INFONAME_==0.) -{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uvUpdated,1.0,0.0));} -#ifdef UV2 -else if (v_INFONAME_==1.) -{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv2,1.0,0.0));} -#endif -#ifdef UV3 -else if (v_INFONAME_==2.) -{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv3,1.0,0.0));} -#endif -#ifdef UV4 -else if (v_INFONAME_==3.) -{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv4,1.0,0.0));} -#endif -#ifdef UV5 -else if (v_INFONAME_==4.) -{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv5,1.0,0.0));} -#endif -#ifdef UV6 -else if (v_INFONAME_==5.) -{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv6,1.0,0.0));} -#endif -#endif + for (const node of vertexBlocks) { + if (node.isInput && alreadyDumped.indexOf(node) === -1) { + codeString += node._dumpCode(uniqueNames, alreadyDumped); + } + } + for (const node of fragmentBlocks) { + if (node.isInput && alreadyDumped.indexOf(node) === -1) { + codeString += node._dumpCode(uniqueNames, alreadyDumped); + } + } + alreadyDumped = []; + codeString += "\n// Connections\n"; + for (const node of this._vertexOutputNodes) { + codeString += node._dumpCodeForOutputConnections(alreadyDumped); + } + for (const node of this._fragmentOutputNodes) { + codeString += node._dumpCodeForOutputConnections(alreadyDumped); + } + codeString += "\n// Output nodes\n"; + for (const node of this._vertexOutputNodes) { + codeString += `nodeMaterial.addOutputNode(${node._codeVariableName}); `; -ShaderStore.IncludesShadersStore[name58] = shader58; - -// node_modules/@babylonjs/core/Shaders/ShadersInclude/bumpVertex.js -var name59 = "bumpVertex"; -var shader59 = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC) -#if defined(TANGENT) && defined(NORMAL) -vec3 tbnNormal=normalize(normalUpdated);vec3 tbnTangent=normalize(tangentUpdated.xyz);vec3 tbnBitangent=cross(tbnNormal,tbnTangent)*tangentUpdated.w;vTBN=mat3(finalWorld)*mat3(tbnTangent,tbnBitangent,tbnNormal); -#endif -#endif + } + for (const node of this._fragmentOutputNodes) { + codeString += `nodeMaterial.addOutputNode(${node._codeVariableName}); `; -ShaderStore.IncludesShadersStore[name59] = shader59; + } + codeString += `nodeMaterial.build(); +`; + return codeString; + } + /** + * Serializes this material in a JSON representation + * @param selectedBlocks defines an optional list of blocks to serialize + * @returns the serialized material object + */ + serialize(selectedBlocks) { + const serializationObject = selectedBlocks ? {} : SerializationHelper.Serialize(this); + serializationObject.editorData = JSON.parse(JSON.stringify(this.editorData)); + let blocks = []; + if (selectedBlocks) { + blocks = selectedBlocks; + } else { + serializationObject.customType = "BABYLON.NodeMaterial"; + serializationObject.outputNodes = []; + for (const outputNode of this._vertexOutputNodes) { + this._gatherBlocks(outputNode, blocks); + serializationObject.outputNodes.push(outputNode.uniqueId); + } + for (const outputNode of this._fragmentOutputNodes) { + this._gatherBlocks(outputNode, blocks); + if (serializationObject.outputNodes.indexOf(outputNode.uniqueId) === -1) { + serializationObject.outputNodes.push(outputNode.uniqueId); + } + } + } + serializationObject.blocks = []; + for (const block of blocks) { + serializationObject.blocks.push(block.serialize()); + } + if (!selectedBlocks) { + for (const block of this.attachedBlocks) { + if (blocks.indexOf(block) !== -1) { + continue; + } + serializationObject.blocks.push(block.serialize()); + } + } + return serializationObject; + } + _restoreConnections(block, source, map) { + for (const outputPoint of block.outputs) { + for (const candidate of source.blocks) { + const target = map[candidate.id]; + if (!target) { + continue; + } + for (const input of candidate.inputs) { + if (map[input.targetBlockId] === block && input.targetConnectionName === outputPoint.name) { + const inputPoint = target.getInputByName(input.inputName); + if (!inputPoint || inputPoint.isConnected) { + continue; + } + outputPoint.connectTo(inputPoint, true); + this._restoreConnections(target, source, map); + continue; + } + } + } + } + } + /** + * Clear the current graph and load a new one from a serialization object + * @param source defines the JSON representation of the material + * @param rootUrl defines the root URL to use to load textures and relative dependencies + * @param merge defines whether or not the source must be merged or replace the current content + */ + parseSerializedObject(source, rootUrl = "", merge = false) { + if (!merge) { + this.clear(); + } + const map = {}; + for (const parsedBlock of source.blocks) { + const blockType = GetClass(parsedBlock.customType); + if (blockType) { + const block = new blockType(); + block._deserialize(parsedBlock, this.getScene(), rootUrl); + map[parsedBlock.id] = block; + this.attachedBlocks.push(block); + } + } + for (const block of this.attachedBlocks) { + if (block.isTeleportOut) { + const teleportOut = block; + const id = teleportOut._tempEntryPointUniqueId; + if (id) { + const source2 = map[id]; + source2.attachToEndpoint(teleportOut); + } + } + } + for (let blockIndex = 0; blockIndex < source.blocks.length; blockIndex++) { + const parsedBlock = source.blocks[blockIndex]; + const block = map[parsedBlock.id]; + if (!block) { + continue; + } + if (block.inputs.length && !merge) { + continue; + } + this._restoreConnections(block, source, map); + } + if (source.outputNodes) { + for (const outputNodeId of source.outputNodes) { + this.addOutputNode(map[outputNodeId]); + } + } + if (source.locations || source.editorData && source.editorData.locations) { + const locations = source.locations || source.editorData.locations; + for (const location2 of locations) { + if (map[location2.blockId]) { + location2.blockId = map[location2.blockId].uniqueId; + } + } + if (merge && this.editorData && this.editorData.locations) { + locations.concat(this.editorData.locations); + } + if (source.locations) { + this.editorData = { + locations + }; + } else { + this.editorData = source.editorData; + this.editorData.locations = locations; + } + const blockMap = []; + for (const key in map) { + blockMap[key] = map[key].uniqueId; + } + this.editorData.map = blockMap; + } + this.comment = source.comment; + if (source.forceAlphaBlending !== void 0) { + this.forceAlphaBlending = source.forceAlphaBlending; + } + if (source.alphaMode !== void 0) { + this.alphaMode = source.alphaMode; + } + if (!merge) { + this._mode = source.mode ?? NodeMaterialModes.Material; + } + } + /** + * Clear the current graph and load a new one from a serialization object + * @param source defines the JSON representation of the material + * @param rootUrl defines the root URL to use to load textures and relative dependencies + * @param merge defines whether or not the source must be merged or replace the current content + * @deprecated Please use the parseSerializedObject method instead + */ + loadFromSerialization(source, rootUrl = "", merge = false) { + this.parseSerializedObject(source, rootUrl, merge); + } + /** + * Makes a duplicate of the current material. + * @param name defines the name to use for the new material + * @param shareEffect defines if the clone material should share the same effect (default is false) + * @returns the cloned material + */ + clone(name69, shareEffect = false) { + const serializationObject = this.serialize(); + const clone = SerializationHelper.Clone(() => new _NodeMaterial(name69, this.getScene(), this.options), this); + clone.id = name69; + clone.name = name69; + clone.parseSerializedObject(serializationObject); + clone._buildId = this._buildId; + clone.build(false, !shareEffect); + return clone; + } + /** + * Awaits for all the material textures to be ready before resolving the returned promise. + * @returns A promise that resolves when the textures are ready. + */ + whenTexturesReadyAsync() { + const textureReadyPromises = []; + this.getActiveTextures().forEach((texture) => { + const internalTexture = texture.getInternalTexture(); + if (internalTexture && !internalTexture.isReady) { + textureReadyPromises.push(new Promise((textureResolve, textureReject) => { + internalTexture.onLoadedObservable.addOnce(() => { + textureResolve(); + }); + internalTexture.onErrorObservable.addOnce((e) => { + textureReject(e); + }); + })); + } + }); + return Promise.all(textureReadyPromises); + } + /** + * Creates a node material from parsed material data + * @param source defines the JSON representation of the material + * @param scene defines the hosting scene + * @param rootUrl defines the root URL to use to load textures and relative dependencies + * @returns a new node material + */ + static Parse(source, scene, rootUrl = "") { + const nodeMaterial = SerializationHelper.Parse(() => new _NodeMaterial(source.name, scene), source, scene, rootUrl); + nodeMaterial.parseSerializedObject(source, rootUrl); + nodeMaterial.build(); + return nodeMaterial; + } + /** + * Creates a node material from a snippet saved in a remote file + * @param name defines the name of the material to create + * @param url defines the url to load from + * @param scene defines the hosting scene + * @param rootUrl defines the root URL for nested url in the node material + * @param skipBuild defines whether to build the node material + * @param targetMaterial defines a material to use instead of creating a new one + * @returns a promise that will resolve to the new node material + */ + static async ParseFromFileAsync(name69, url, scene, rootUrl = "", skipBuild = false, targetMaterial) { + const material = targetMaterial ?? new _NodeMaterial(name69, scene); + const data = await scene._loadFileAsync(url); + const serializationObject = JSON.parse(data); + material.parseSerializedObject(serializationObject, rootUrl); + if (!skipBuild) { + material.build(); + } + return material; + } + /** + * Creates a node material from a snippet saved by the node material editor + * @param snippetId defines the snippet to load + * @param scene defines the hosting scene + * @param rootUrl defines the root URL to use to load textures and relative dependencies + * @param nodeMaterial defines a node material to update (instead of creating a new one) + * @param skipBuild defines whether to build the node material + * @param waitForTextureReadyness defines whether to wait for texture readiness resolving the promise (default: false) + * @returns a promise that will resolve to the new node material + */ + static ParseFromSnippetAsync(snippetId, scene = EngineStore.LastCreatedScene, rootUrl = "", nodeMaterial, skipBuild = false, waitForTextureReadyness = false) { + if (snippetId === "_BLANK") { + return Promise.resolve(_NodeMaterial.CreateDefault("blank", scene)); + } + return new Promise((resolve, reject) => { + const request = new WebRequest(); + request.addEventListener("readystatechange", () => { + if (request.readyState == 4) { + if (request.status == 200) { + const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload); + const serializationObject = JSON.parse(snippet.nodeMaterial); + if (!nodeMaterial) { + nodeMaterial = SerializationHelper.Parse(() => new _NodeMaterial(snippetId, scene), serializationObject, scene, rootUrl); + nodeMaterial.uniqueId = scene.getUniqueId(); + } + nodeMaterial.parseSerializedObject(serializationObject); + nodeMaterial.snippetId = snippetId; + try { + if (!skipBuild) { + nodeMaterial.build(); + } + } catch (err) { + reject(err); + } + if (waitForTextureReadyness) { + nodeMaterial.whenTexturesReadyAsync().then(() => { + resolve(nodeMaterial); + }).catch((err) => { + reject(err); + }); + } else { + resolve(nodeMaterial); + } + } else { + reject("Unable to load the snippet " + snippetId); + } + } + }); + request.open("GET", this.SnippetUrl + "/" + snippetId.replace(/#/g, "/")); + request.send(); + }); + } + /** + * Creates a new node material set to default basic configuration + * @param name defines the name of the material + * @param scene defines the hosting scene + * @returns a new NodeMaterial + */ + static CreateDefault(name69, scene) { + const newMaterial = new _NodeMaterial(name69, scene); + newMaterial.setToDefault(); + newMaterial.build(); + return newMaterial; + } +}; +NodeMaterial._BuildIdGenerator = 0; +NodeMaterial.EditorURL = `${Tools._DefaultCdnUrl}/v${Engine.Version}/nodeEditor/babylon.nodeEditor.js`; +NodeMaterial.SnippetUrl = `https://snippet.babylonjs.com`; +NodeMaterial.IgnoreTexturesAtLoadTime = false; +__decorate([ + serialize() +], NodeMaterial.prototype, "ignoreAlpha", void 0); +__decorate([ + serialize() +], NodeMaterial.prototype, "maxSimultaneousLights", void 0); +__decorate([ + serialize("mode") +], NodeMaterial.prototype, "_mode", void 0); +__decorate([ + serialize("comment") +], NodeMaterial.prototype, "comment", void 0); +__decorate([ + serialize() +], NodeMaterial.prototype, "forceAlphaBlending", void 0); +RegisterClass("BABYLON.NodeMaterial", NodeMaterial); + +// node_modules/@babylonjs/core/Meshes/Builders/icoSphereBuilder.js +function CreateIcoSphereVertexData(options) { + const sideOrientation = options.sideOrientation || VertexData.DEFAULTSIDE; + const radius = options.radius || 1; + const flat = options.flat === void 0 ? true : options.flat; + const subdivisions = (options.subdivisions || 4) | 0; + const radiusX = options.radiusX || radius; + const radiusY = options.radiusY || radius; + const radiusZ = options.radiusZ || radius; + const t = (1 + Math.sqrt(5)) / 2; + const icoVertices = [ + -1, + t, + -0, + 1, + t, + 0, + -1, + -t, + 0, + 1, + -t, + 0, + 0, + -1, + -t, + 0, + 1, + -t, + 0, + -1, + t, + 0, + 1, + t, + t, + 0, + 1, + t, + 0, + -1, + -t, + 0, + 1, + -t, + 0, + -1 + // v8-11 + ]; + const ico_indices = [ + 0, + 11, + 5, + 0, + 5, + 1, + 0, + 1, + 7, + 0, + 7, + 10, + 12, + 22, + 23, + 1, + 5, + 20, + 5, + 11, + 4, + 23, + 22, + 13, + 22, + 18, + 6, + 7, + 1, + 8, + 14, + 21, + 4, + 14, + 4, + 2, + 16, + 13, + 6, + 15, + 6, + 19, + 3, + 8, + 9, + 4, + 21, + 5, + 13, + 17, + 23, + 6, + 13, + 22, + 19, + 6, + 18, + 9, + 8, + 1 + ]; + const vertices_unalias_id = [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + // vertex alias + 0, + 2, + 3, + 3, + 3, + 4, + 7, + 8, + 9, + 9, + 10, + 11 + // 23: B + 12 + ]; + const ico_vertexuv = [ + 5, + 1, + 3, + 1, + 6, + 4, + 0, + 0, + 5, + 3, + 4, + 2, + 2, + 2, + 4, + 0, + 2, + 0, + 1, + 1, + 6, + 0, + 6, + 2, + // vertex alias (for same vertex on different faces) + 0, + 4, + 3, + 3, + 4, + 4, + 3, + 1, + 4, + 2, + 4, + 4, + 0, + 2, + 1, + 1, + 2, + 2, + 3, + 3, + 1, + 3, + 2, + 4 + // 23: B + 12 + ]; + const ustep = 138 / 1024; + const vstep = 239 / 1024; + const uoffset = 60 / 1024; + const voffset = 26 / 1024; + const island_u_offset = -40 / 1024; + const island_v_offset = 20 / 1024; + const island = [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + // 15 - 19 + ]; + const indices = []; + const positions = []; + const normals = []; + const uvs = []; + let current_indice = 0; + const face_vertex_pos = new Array(3); + const face_vertex_uv = new Array(3); + let v012; + for (v012 = 0; v012 < 3; v012++) { + face_vertex_pos[v012] = Vector3.Zero(); + face_vertex_uv[v012] = Vector2.Zero(); + } + for (let face = 0; face < 20; face++) { + for (v012 = 0; v012 < 3; v012++) { + const v_id = ico_indices[3 * face + v012]; + face_vertex_pos[v012].copyFromFloats(icoVertices[3 * vertices_unalias_id[v_id]], icoVertices[3 * vertices_unalias_id[v_id] + 1], icoVertices[3 * vertices_unalias_id[v_id] + 2]); + face_vertex_pos[v012].normalize(); + face_vertex_uv[v012].copyFromFloats(ico_vertexuv[2 * v_id] * ustep + uoffset + island[face] * island_u_offset, ico_vertexuv[2 * v_id + 1] * vstep + voffset + island[face] * island_v_offset); + } + const interp_vertex = (i1, i2, c1, c2) => { + const pos_x0 = Vector3.Lerp(face_vertex_pos[0], face_vertex_pos[2], i2 / subdivisions); + const pos_x1 = Vector3.Lerp(face_vertex_pos[1], face_vertex_pos[2], i2 / subdivisions); + const pos_interp = subdivisions === i2 ? face_vertex_pos[2] : Vector3.Lerp(pos_x0, pos_x1, i1 / (subdivisions - i2)); + pos_interp.normalize(); + let vertex_normal; + if (flat) { + const centroid_x0 = Vector3.Lerp(face_vertex_pos[0], face_vertex_pos[2], c2 / subdivisions); + const centroid_x1 = Vector3.Lerp(face_vertex_pos[1], face_vertex_pos[2], c2 / subdivisions); + vertex_normal = Vector3.Lerp(centroid_x0, centroid_x1, c1 / (subdivisions - c2)); + } else { + vertex_normal = new Vector3(pos_interp.x, pos_interp.y, pos_interp.z); + } + vertex_normal.x /= radiusX; + vertex_normal.y /= radiusY; + vertex_normal.z /= radiusZ; + vertex_normal.normalize(); + const uv_x0 = Vector2.Lerp(face_vertex_uv[0], face_vertex_uv[2], i2 / subdivisions); + const uv_x1 = Vector2.Lerp(face_vertex_uv[1], face_vertex_uv[2], i2 / subdivisions); + const uv_interp = subdivisions === i2 ? face_vertex_uv[2] : Vector2.Lerp(uv_x0, uv_x1, i1 / (subdivisions - i2)); + positions.push(pos_interp.x * radiusX, pos_interp.y * radiusY, pos_interp.z * radiusZ); + normals.push(vertex_normal.x, vertex_normal.y, vertex_normal.z); + uvs.push(uv_interp.x, CompatibilityOptions.UseOpenGLOrientationForUV ? 1 - uv_interp.y : uv_interp.y); + indices.push(current_indice); + current_indice++; + }; + for (let i2 = 0; i2 < subdivisions; i2++) { + for (let i1 = 0; i1 + i2 < subdivisions; i1++) { + interp_vertex(i1, i2, i1 + 1 / 3, i2 + 1 / 3); + interp_vertex(i1 + 1, i2, i1 + 1 / 3, i2 + 1 / 3); + interp_vertex(i1, i2 + 1, i1 + 1 / 3, i2 + 1 / 3); + if (i1 + i2 + 1 < subdivisions) { + interp_vertex(i1 + 1, i2, i1 + 2 / 3, i2 + 2 / 3); + interp_vertex(i1 + 1, i2 + 1, i1 + 2 / 3, i2 + 2 / 3); + interp_vertex(i1, i2 + 1, i1 + 2 / 3, i2 + 2 / 3); + } + } + } + } + VertexData._ComputeSides(sideOrientation, positions, indices, normals, uvs, options.frontUVs, options.backUVs); + const vertexData = new VertexData(); + vertexData.indices = indices; + vertexData.positions = positions; + vertexData.normals = normals; + vertexData.uvs = uvs; + return vertexData; +} +function CreateIcoSphere(name69, options = {}, scene = null) { + const sphere = new Mesh(name69, scene); + options.sideOrientation = Mesh._GetDefaultSideOrientation(options.sideOrientation); + sphere._originalBuilderSideOrientation = options.sideOrientation; + const vertexData = CreateIcoSphereVertexData(options); + vertexData.applyToMesh(sphere, options.updatable); + return sphere; +} +var IcoSphereBuilder = { + // eslint-disable-next-line @typescript-eslint/naming-convention + CreateIcoSphere +}; +VertexData.CreateIcoSphere = CreateIcoSphereVertexData; +Mesh.CreateIcoSphere = (name69, options, scene) => { + return CreateIcoSphere(name69, options, scene); +}; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/clipPlaneVertex.js -var name60 = "clipPlaneVertex"; -var shader60 = `#ifdef CLIPPLANE -fClipDistance=dot(worldPos,vClipPlane); -#endif -#ifdef CLIPPLANE2 -fClipDistance2=dot(worldPos,vClipPlane2); -#endif -#ifdef CLIPPLANE3 -fClipDistance3=dot(worldPos,vClipPlane3); -#endif -#ifdef CLIPPLANE4 -fClipDistance4=dot(worldPos,vClipPlane4); -#endif -#ifdef CLIPPLANE5 -fClipDistance5=dot(worldPos,vClipPlane5); -#endif -#ifdef CLIPPLANE6 -fClipDistance6=dot(worldPos,vClipPlane6); -#endif -`; -ShaderStore.IncludesShadersStore[name60] = shader60; +// node_modules/@babylonjs/core/XR/features/WebXRHandTracking.js +var HandPart; +(function(HandPart2) { + HandPart2["WRIST"] = "wrist"; + HandPart2["THUMB"] = "thumb"; + HandPart2["INDEX"] = "index"; + HandPart2["MIDDLE"] = "middle"; + HandPart2["RING"] = "ring"; + HandPart2["LITTLE"] = "little"; +})(HandPart || (HandPart = {})); +var WebXRHandJoint; +(function(WebXRHandJoint2) { + WebXRHandJoint2["WRIST"] = "wrist"; + WebXRHandJoint2["THUMB_METACARPAL"] = "thumb-metacarpal"; + WebXRHandJoint2["THUMB_PHALANX_PROXIMAL"] = "thumb-phalanx-proximal"; + WebXRHandJoint2["THUMB_PHALANX_DISTAL"] = "thumb-phalanx-distal"; + WebXRHandJoint2["THUMB_TIP"] = "thumb-tip"; + WebXRHandJoint2["INDEX_FINGER_METACARPAL"] = "index-finger-metacarpal"; + WebXRHandJoint2["INDEX_FINGER_PHALANX_PROXIMAL"] = "index-finger-phalanx-proximal"; + WebXRHandJoint2["INDEX_FINGER_PHALANX_INTERMEDIATE"] = "index-finger-phalanx-intermediate"; + WebXRHandJoint2["INDEX_FINGER_PHALANX_DISTAL"] = "index-finger-phalanx-distal"; + WebXRHandJoint2["INDEX_FINGER_TIP"] = "index-finger-tip"; + WebXRHandJoint2["MIDDLE_FINGER_METACARPAL"] = "middle-finger-metacarpal"; + WebXRHandJoint2["MIDDLE_FINGER_PHALANX_PROXIMAL"] = "middle-finger-phalanx-proximal"; + WebXRHandJoint2["MIDDLE_FINGER_PHALANX_INTERMEDIATE"] = "middle-finger-phalanx-intermediate"; + WebXRHandJoint2["MIDDLE_FINGER_PHALANX_DISTAL"] = "middle-finger-phalanx-distal"; + WebXRHandJoint2["MIDDLE_FINGER_TIP"] = "middle-finger-tip"; + WebXRHandJoint2["RING_FINGER_METACARPAL"] = "ring-finger-metacarpal"; + WebXRHandJoint2["RING_FINGER_PHALANX_PROXIMAL"] = "ring-finger-phalanx-proximal"; + WebXRHandJoint2["RING_FINGER_PHALANX_INTERMEDIATE"] = "ring-finger-phalanx-intermediate"; + WebXRHandJoint2["RING_FINGER_PHALANX_DISTAL"] = "ring-finger-phalanx-distal"; + WebXRHandJoint2["RING_FINGER_TIP"] = "ring-finger-tip"; + WebXRHandJoint2["PINKY_FINGER_METACARPAL"] = "pinky-finger-metacarpal"; + WebXRHandJoint2["PINKY_FINGER_PHALANX_PROXIMAL"] = "pinky-finger-phalanx-proximal"; + WebXRHandJoint2["PINKY_FINGER_PHALANX_INTERMEDIATE"] = "pinky-finger-phalanx-intermediate"; + WebXRHandJoint2["PINKY_FINGER_PHALANX_DISTAL"] = "pinky-finger-phalanx-distal"; + WebXRHandJoint2["PINKY_FINGER_TIP"] = "pinky-finger-tip"; +})(WebXRHandJoint || (WebXRHandJoint = {})); +var handJointReferenceArray = [ + WebXRHandJoint.WRIST, + WebXRHandJoint.THUMB_METACARPAL, + WebXRHandJoint.THUMB_PHALANX_PROXIMAL, + WebXRHandJoint.THUMB_PHALANX_DISTAL, + WebXRHandJoint.THUMB_TIP, + WebXRHandJoint.INDEX_FINGER_METACARPAL, + WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL, + WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE, + WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL, + WebXRHandJoint.INDEX_FINGER_TIP, + WebXRHandJoint.MIDDLE_FINGER_METACARPAL, + WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL, + WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE, + WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL, + WebXRHandJoint.MIDDLE_FINGER_TIP, + WebXRHandJoint.RING_FINGER_METACARPAL, + WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL, + WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE, + WebXRHandJoint.RING_FINGER_PHALANX_DISTAL, + WebXRHandJoint.RING_FINGER_TIP, + WebXRHandJoint.PINKY_FINGER_METACARPAL, + WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL, + WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE, + WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL, + WebXRHandJoint.PINKY_FINGER_TIP +]; +var handPartsDefinition = { + [HandPart.WRIST]: [WebXRHandJoint.WRIST], + [HandPart.THUMB]: [WebXRHandJoint.THUMB_METACARPAL, WebXRHandJoint.THUMB_PHALANX_PROXIMAL, WebXRHandJoint.THUMB_PHALANX_DISTAL, WebXRHandJoint.THUMB_TIP], + [HandPart.INDEX]: [ + WebXRHandJoint.INDEX_FINGER_METACARPAL, + WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL, + WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE, + WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL, + WebXRHandJoint.INDEX_FINGER_TIP + ], + [HandPart.MIDDLE]: [ + WebXRHandJoint.MIDDLE_FINGER_METACARPAL, + WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL, + WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE, + WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL, + WebXRHandJoint.MIDDLE_FINGER_TIP + ], + [HandPart.RING]: [ + WebXRHandJoint.RING_FINGER_METACARPAL, + WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL, + WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE, + WebXRHandJoint.RING_FINGER_PHALANX_DISTAL, + WebXRHandJoint.RING_FINGER_TIP + ], + [HandPart.LITTLE]: [ + WebXRHandJoint.PINKY_FINGER_METACARPAL, + WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL, + WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE, + WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL, + WebXRHandJoint.PINKY_FINGER_TIP + ] +}; +var WebXRHand = class { + /** + * Get the hand mesh. + */ + get handMesh() { + return this._handMesh; + } + /** + * Get meshes of part of the hand. + * @param part The part of hand to get. + * @returns An array of meshes that correlate to the hand part requested. + */ + getHandPartMeshes(part) { + return handPartsDefinition[part].map((name69) => this._jointMeshes[handJointReferenceArray.indexOf(name69)]); + } + /** + * Retrieves a mesh linked to a named joint in the hand. + * @param jointName The name of the joint. + * @returns An AbstractMesh whose position corresponds with the joint position. + */ + getJointMesh(jointName) { + return this._jointMeshes[handJointReferenceArray.indexOf(jointName)]; + } + /** + * Construct a new hand object + * @param xrController The controller to which the hand correlates. + * @param _jointMeshes The meshes to be used to track the hand joints. + * @param _handMesh An optional hand mesh. + * @param rigMapping An optional rig mapping for the hand mesh. + * If not provided (but a hand mesh is provided), + * it will be assumed that the hand mesh's bones are named + * directly after the WebXR bone names. + * @param _leftHandedMeshes Are the hand meshes left-handed-system meshes + * @param _jointsInvisible Are the tracked joint meshes visible + * @param _jointScaleFactor Scale factor for all joint meshes + */ + constructor(xrController, _jointMeshes, _handMesh, rigMapping, _leftHandedMeshes = false, _jointsInvisible = false, _jointScaleFactor = 1) { + this.xrController = xrController; + this._jointMeshes = _jointMeshes; + this._handMesh = _handMesh; + this.rigMapping = rigMapping; + this._leftHandedMeshes = _leftHandedMeshes; + this._jointsInvisible = _jointsInvisible; + this._jointScaleFactor = _jointScaleFactor; + this._jointTransforms = new Array(handJointReferenceArray.length); + this._jointTransformMatrices = new Float32Array(handJointReferenceArray.length * 16); + this._tempJointMatrix = new Matrix(); + this._jointRadii = new Float32Array(handJointReferenceArray.length); + this._scene = _jointMeshes[0].getScene(); + for (let jointIdx = 0; jointIdx < this._jointTransforms.length; jointIdx++) { + const jointTransform = this._jointTransforms[jointIdx] = new TransformNode(handJointReferenceArray[jointIdx], this._scene); + jointTransform.rotationQuaternion = new Quaternion(); + _jointMeshes[jointIdx].rotationQuaternion = new Quaternion(); + } + if (_handMesh) { + this.setHandMesh(_handMesh, rigMapping); + } + if (this.xrController.motionController) { + if (this.xrController.motionController.rootMesh) { + this.xrController.motionController.rootMesh.dispose(false, true); + } + } + this.xrController.onMotionControllerInitObservable.add((motionController) => { + motionController._doNotLoadControllerMesh = true; + }); + } + /** + * Sets the current hand mesh to render for the WebXRHand. + * @param handMesh The rigged hand mesh that will be tracked to the user's hand. + * @param rigMapping The mapping from XRHandJoint to bone names to use with the mesh. + * @param _xrSessionManager The XRSessionManager used to initialize the hand mesh. + */ + setHandMesh(handMesh, rigMapping, _xrSessionManager) { + this._handMesh = handMesh; + handMesh.alwaysSelectAsActiveMesh = true; + handMesh.getChildMeshes().forEach((mesh) => { + mesh.alwaysSelectAsActiveMesh = true; + }); + if (this._handMesh.skeleton) { + const handMeshSkeleton = this._handMesh.skeleton; + handJointReferenceArray.forEach((jointName, jointIdx) => { + const jointBoneIdx = handMeshSkeleton.getBoneIndexByName(rigMapping ? rigMapping[jointName] : jointName); + if (jointBoneIdx !== -1) { + handMeshSkeleton.bones[jointBoneIdx].linkTransformNode(this._jointTransforms[jointIdx]); + } + }); + } + } + /** + * Update this hand from the latest xr frame. + * @param xrFrame The latest frame received from WebXR. + * @param referenceSpace The current viewer reference space. + */ + updateFromXRFrame(xrFrame, referenceSpace) { + const hand = this.xrController.inputSource.hand; + if (!hand) { + return; + } + const anyHand = hand; + const jointSpaces = handJointReferenceArray.map((jointName) => anyHand[jointName] || hand.get(jointName)); + let trackingSuccessful = false; + if (xrFrame.fillPoses && xrFrame.fillJointRadii) { + trackingSuccessful = xrFrame.fillPoses(jointSpaces, referenceSpace, this._jointTransformMatrices) && xrFrame.fillJointRadii(jointSpaces, this._jointRadii); + } else if (xrFrame.getJointPose) { + trackingSuccessful = true; + for (let jointIdx = 0; jointIdx < jointSpaces.length; jointIdx++) { + const jointPose = xrFrame.getJointPose(jointSpaces[jointIdx], referenceSpace); + if (jointPose) { + this._jointTransformMatrices.set(jointPose.transform.matrix, jointIdx * 16); + this._jointRadii[jointIdx] = jointPose.radius || 8e-3; + } else { + trackingSuccessful = false; + break; + } + } + } + if (!trackingSuccessful) { + return; + } + handJointReferenceArray.forEach((_jointName, jointIdx) => { + const jointTransform = this._jointTransforms[jointIdx]; + Matrix.FromArrayToRef(this._jointTransformMatrices, jointIdx * 16, this._tempJointMatrix); + this._tempJointMatrix.decompose(void 0, jointTransform.rotationQuaternion, jointTransform.position); + const scaledJointRadius = this._jointRadii[jointIdx] * this._jointScaleFactor; + const jointMesh = this._jointMeshes[jointIdx]; + jointMesh.isVisible = !this._handMesh && !this._jointsInvisible; + jointMesh.position.copyFrom(jointTransform.position); + jointMesh.rotationQuaternion.copyFrom(jointTransform.rotationQuaternion); + jointMesh.scaling.setAll(scaledJointRadius); + if (!this._scene.useRightHandedSystem) { + jointMesh.position.z *= -1; + jointMesh.rotationQuaternion.z *= -1; + jointMesh.rotationQuaternion.w *= -1; + if (this._leftHandedMeshes && this._handMesh) { + jointTransform.position.z *= -1; + jointTransform.rotationQuaternion.z *= -1; + jointTransform.rotationQuaternion.w *= -1; + } + } + }); + if (this._handMesh) { + this._handMesh.isVisible = true; + } + } + /** + * Dispose this Hand object + * @param disposeMeshes Should the meshes be disposed as well + */ + dispose(disposeMeshes = false) { + var _a; + if (this._handMesh) { + if (disposeMeshes) { + (_a = this._handMesh.skeleton) == null ? void 0 : _a.dispose(); + this._handMesh.dispose(false, true); + } else { + this._handMesh.isVisible = false; + } + } + } +}; +var WebXRHandTracking = class _WebXRHandTracking extends WebXRAbstractFeature { + static _GenerateTrackedJointMeshes(featureOptions) { + const meshes = {}; + ["left", "right"].map((handedness) => { + var _a, _b, _c, _d, _e; + const trackedMeshes = []; + const originalMesh = ((_a = featureOptions.jointMeshes) == null ? void 0 : _a.sourceMesh) || CreateIcoSphere("jointParent", _WebXRHandTracking._ICOSPHERE_PARAMS); + originalMesh.isVisible = !!((_b = featureOptions.jointMeshes) == null ? void 0 : _b.keepOriginalVisible); + for (let i = 0; i < handJointReferenceArray.length; ++i) { + let newInstance = originalMesh.createInstance(`${handedness}-handJoint-${i}`); + if ((_c = featureOptions.jointMeshes) == null ? void 0 : _c.onHandJointMeshGenerated) { + const returnedMesh = featureOptions.jointMeshes.onHandJointMeshGenerated(newInstance, i, handedness); + if (returnedMesh) { + if (returnedMesh !== newInstance) { + newInstance.dispose(); + newInstance = returnedMesh; + } + } + } + newInstance.isPickable = false; + if ((_d = featureOptions.jointMeshes) == null ? void 0 : _d.enablePhysics) { + const props = ((_e = featureOptions.jointMeshes) == null ? void 0 : _e.physicsProps) || {}; + newInstance.scaling.setAll(0.02); + const type = props.impostorType !== void 0 ? props.impostorType : PhysicsImpostor.SphereImpostor; + newInstance.physicsImpostor = new PhysicsImpostor(newInstance, type, { mass: 0, ...props }); + } + newInstance.rotationQuaternion = new Quaternion(); + newInstance.isVisible = false; + trackedMeshes.push(newInstance); + } + meshes[handedness] = trackedMeshes; + }); + return { left: meshes.left, right: meshes.right }; + } + static _GenerateDefaultHandMeshesAsync(scene, xrSessionManager, options) { + return new Promise(async (resolve) => { + var _a, _b, _c, _d, _e, _f; + const riggedMeshes = {}; + if ((_b = (_a = _WebXRHandTracking._RightHandGLB) == null ? void 0 : _a.meshes[1]) == null ? void 0 : _b.isDisposed()) { + _WebXRHandTracking._RightHandGLB = null; + } + if ((_d = (_c = _WebXRHandTracking._LeftHandGLB) == null ? void 0 : _c.meshes[1]) == null ? void 0 : _d.isDisposed()) { + _WebXRHandTracking._LeftHandGLB = null; + } + const handsDefined = !!(_WebXRHandTracking._RightHandGLB && _WebXRHandTracking._LeftHandGLB); + const handGLBs = await Promise.all([ + _WebXRHandTracking._RightHandGLB || SceneLoader.ImportMeshAsync("", _WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL, _WebXRHandTracking.DEFAULT_HAND_MODEL_RIGHT_FILENAME, scene), + _WebXRHandTracking._LeftHandGLB || SceneLoader.ImportMeshAsync("", _WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL, _WebXRHandTracking.DEFAULT_HAND_MODEL_LEFT_FILENAME, scene) + ]); + _WebXRHandTracking._RightHandGLB = handGLBs[0]; + _WebXRHandTracking._LeftHandGLB = handGLBs[1]; + const handShader = await NodeMaterial.ParseFromFileAsync("handShader", _WebXRHandTracking.DEFAULT_HAND_MODEL_SHADER_URL, scene); + handShader.needDepthPrePass = true; + handShader.transparencyMode = Material.MATERIAL_ALPHABLEND; + handShader.alphaMode = 2; + handShader.build(false); + const handColors = { + base: Color3.FromInts(116, 63, 203), + fresnel: Color3.FromInts(149, 102, 229), + fingerColor: Color3.FromInts(177, 130, 255), + tipFresnel: Color3.FromInts(220, 200, 255), + ...(_e = options == null ? void 0 : options.handMeshes) == null ? void 0 : _e.customColors + }; + const handNodes = { + base: handShader.getBlockByName("baseColor"), + fresnel: handShader.getBlockByName("fresnelColor"), + fingerColor: handShader.getBlockByName("fingerColor"), + tipFresnel: handShader.getBlockByName("tipFresnelColor") + }; + handNodes.base.value = handColors.base; + handNodes.fresnel.value = handColors.fresnel; + handNodes.fingerColor.value = handColors.fingerColor; + handNodes.tipFresnel.value = handColors.tipFresnel; + const isMultiview = (_f = xrSessionManager._getBaseLayerWrapper()) == null ? void 0 : _f.isMultiview; + ["left", "right"].forEach((handedness) => { + const handGLB = handedness == "left" ? _WebXRHandTracking._LeftHandGLB : _WebXRHandTracking._RightHandGLB; + if (!handGLB) { + throw new Error("Could not load hand model"); + } + const handMesh = handGLB.meshes[1]; + handMesh._internalAbstractMeshDataInfo._computeBonesUsingShaders = true; + if (!isMultiview) { + handMesh.material = handShader.clone(`${handedness}HandShaderClone`, true); + } + handMesh.isVisible = false; + riggedMeshes[handedness] = handMesh; + if (!handsDefined && !scene.useRightHandedSystem) { + handGLB.meshes[1].rotate(Axis.Y, Math.PI); + } + }); + handShader.dispose(); + resolve({ left: riggedMeshes.left, right: riggedMeshes.right }); + }); + } + /** + * Generates a mapping from XRHandJoint to bone name for the default hand mesh. + * @param handedness The handedness being mapped for. + * @returns A mapping from XRHandJoint to bone name. + */ + static _GenerateDefaultHandMeshRigMapping(handedness) { + const H = handedness == "right" ? "R" : "L"; + return { + [WebXRHandJoint.WRIST]: `wrist_${H}`, + [WebXRHandJoint.THUMB_METACARPAL]: `thumb_metacarpal_${H}`, + [WebXRHandJoint.THUMB_PHALANX_PROXIMAL]: `thumb_proxPhalanx_${H}`, + [WebXRHandJoint.THUMB_PHALANX_DISTAL]: `thumb_distPhalanx_${H}`, + [WebXRHandJoint.THUMB_TIP]: `thumb_tip_${H}`, + [WebXRHandJoint.INDEX_FINGER_METACARPAL]: `index_metacarpal_${H}`, + [WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL]: `index_proxPhalanx_${H}`, + [WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE]: `index_intPhalanx_${H}`, + [WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL]: `index_distPhalanx_${H}`, + [WebXRHandJoint.INDEX_FINGER_TIP]: `index_tip_${H}`, + [WebXRHandJoint.MIDDLE_FINGER_METACARPAL]: `middle_metacarpal_${H}`, + [WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL]: `middle_proxPhalanx_${H}`, + [WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE]: `middle_intPhalanx_${H}`, + [WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL]: `middle_distPhalanx_${H}`, + [WebXRHandJoint.MIDDLE_FINGER_TIP]: `middle_tip_${H}`, + [WebXRHandJoint.RING_FINGER_METACARPAL]: `ring_metacarpal_${H}`, + [WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL]: `ring_proxPhalanx_${H}`, + [WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE]: `ring_intPhalanx_${H}`, + [WebXRHandJoint.RING_FINGER_PHALANX_DISTAL]: `ring_distPhalanx_${H}`, + [WebXRHandJoint.RING_FINGER_TIP]: `ring_tip_${H}`, + [WebXRHandJoint.PINKY_FINGER_METACARPAL]: `little_metacarpal_${H}`, + [WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL]: `little_proxPhalanx_${H}`, + [WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE]: `little_intPhalanx_${H}`, + [WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL]: `little_distPhalanx_${H}`, + [WebXRHandJoint.PINKY_FINGER_TIP]: `little_tip_${H}` + }; + } + /** + * Check if the needed objects are defined. + * This does not mean that the feature is enabled, but that the objects needed are well defined. + * @returns true if the needed objects for this feature are defined + */ + isCompatible() { + return typeof XRHand !== "undefined"; + } + /** + * Get the hand object according to the controller id + * @param controllerId the controller id to which we want to get the hand + * @returns null if not found or the WebXRHand object if found + */ + getHandByControllerId(controllerId) { + return this._attachedHands[controllerId]; + } + /** + * Get a hand object according to the requested handedness + * @param handedness the handedness to request + * @returns null if not found or the WebXRHand object if found + */ + getHandByHandedness(handedness) { + if (handedness == "none") { + return null; + } + return this._trackingHands[handedness]; + } + /** + * Creates a new instance of the XR hand tracking feature. + * @param _xrSessionManager An instance of WebXRSessionManager. + * @param options Options to use when constructing this feature. + */ + constructor(_xrSessionManager, options) { + super(_xrSessionManager); + this.options = options; + this._attachedHands = {}; + this._trackingHands = { left: null, right: null }; + this._handResources = { jointMeshes: null, handMeshes: null, rigMappings: null }; + this._worldScaleObserver = null; + this.onHandAddedObservable = new Observable(); + this.onHandRemovedObservable = new Observable(); + this._attachHand = (xrController) => { + var _a, _b, _c; + if (!xrController.inputSource.hand || xrController.inputSource.handedness == "none" || !this._handResources.jointMeshes) { + return; + } + const handedness = xrController.inputSource.handedness; + const webxrHand = new WebXRHand(xrController, this._handResources.jointMeshes[handedness], this._handResources.handMeshes && this._handResources.handMeshes[handedness], this._handResources.rigMappings && this._handResources.rigMappings[handedness], (_a = this.options.handMeshes) == null ? void 0 : _a.meshesUseLeftHandedCoordinates, (_b = this.options.jointMeshes) == null ? void 0 : _b.invisible, (_c = this.options.jointMeshes) == null ? void 0 : _c.scaleFactor); + this._attachedHands[xrController.uniqueId] = webxrHand; + this._trackingHands[handedness] = webxrHand; + this.onHandAddedObservable.notifyObservers(webxrHand); + }; + this._detachHand = (xrController) => { + this._detachHandById(xrController.uniqueId); + }; + this.xrNativeFeatureName = "hand-tracking"; + const anyOptions = options; + const anyJointMeshOptions = anyOptions.jointMeshes; + if (anyJointMeshOptions) { + if (typeof anyJointMeshOptions.disableDefaultHandMesh !== "undefined") { + options.handMeshes = options.handMeshes || {}; + options.handMeshes.disableDefaultMeshes = anyJointMeshOptions.disableDefaultHandMesh; + } + if (typeof anyJointMeshOptions.handMeshes !== "undefined") { + options.handMeshes = options.handMeshes || {}; + options.handMeshes.customMeshes = anyJointMeshOptions.handMeshes; + } + if (typeof anyJointMeshOptions.leftHandedSystemMeshes !== "undefined") { + options.handMeshes = options.handMeshes || {}; + options.handMeshes.meshesUseLeftHandedCoordinates = anyJointMeshOptions.leftHandedSystemMeshes; + } + if (typeof anyJointMeshOptions.rigMapping !== "undefined") { + options.handMeshes = options.handMeshes || {}; + const leftRigMapping = {}; + const rightRigMapping = {}; + [ + [anyJointMeshOptions.rigMapping.left, leftRigMapping], + [anyJointMeshOptions.rigMapping.right, rightRigMapping] + ].forEach((rigMappingTuple) => { + const legacyRigMapping = rigMappingTuple[0]; + const rigMapping = rigMappingTuple[1]; + legacyRigMapping.forEach((modelJointName, index) => { + rigMapping[handJointReferenceArray[index]] = modelJointName; + }); + }); + options.handMeshes.customRigMappings = { + left: leftRigMapping, + right: rightRigMapping + }; + } + } + } + /** + * Attach this feature. + * Will usually be called by the features manager. + * + * @returns true if successful. + */ + attach() { + var _a, _b, _c, _d; + if (!super.attach()) { + return false; + } + this._handResources = { + jointMeshes: _WebXRHandTracking._GenerateTrackedJointMeshes(this.options), + handMeshes: ((_a = this.options.handMeshes) == null ? void 0 : _a.customMeshes) || null, + rigMappings: ((_b = this.options.handMeshes) == null ? void 0 : _b.customRigMappings) || null + }; + if (!((_c = this.options.handMeshes) == null ? void 0 : _c.customMeshes) && !((_d = this.options.handMeshes) == null ? void 0 : _d.disableDefaultMeshes)) { + _WebXRHandTracking._GenerateDefaultHandMeshesAsync(EngineStore.LastCreatedScene, this._xrSessionManager, this.options).then((defaultHandMeshes) => { + var _a2, _b2; + this._handResources.handMeshes = defaultHandMeshes; + this._handResources.rigMappings = { + left: _WebXRHandTracking._GenerateDefaultHandMeshRigMapping("left"), + right: _WebXRHandTracking._GenerateDefaultHandMeshRigMapping("right") + }; + (_a2 = this._trackingHands.left) == null ? void 0 : _a2.setHandMesh(this._handResources.handMeshes.left, this._handResources.rigMappings.left, this._xrSessionManager); + (_b2 = this._trackingHands.right) == null ? void 0 : _b2.setHandMesh(this._handResources.handMeshes.right, this._handResources.rigMappings.right, this._xrSessionManager); + this._handResources.handMeshes.left.scaling.setAll(this._xrSessionManager.worldScalingFactor); + this._handResources.handMeshes.right.scaling.setAll(this._xrSessionManager.worldScalingFactor); + }); + this._worldScaleObserver = this._xrSessionManager.onWorldScaleFactorChangedObservable.add((scalingFactors) => { + if (this._handResources.handMeshes) { + this._handResources.handMeshes.left.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor); + this._handResources.handMeshes.right.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor); + } + }); + } + this.options.xrInput.controllers.forEach(this._attachHand); + this._addNewAttachObserver(this.options.xrInput.onControllerAddedObservable, this._attachHand); + this._addNewAttachObserver(this.options.xrInput.onControllerRemovedObservable, this._detachHand); + return true; + } + _onXRFrame(_xrFrame) { + var _a, _b; + (_a = this._trackingHands.left) == null ? void 0 : _a.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace); + (_b = this._trackingHands.right) == null ? void 0 : _b.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace); + } + _detachHandById(controllerId, disposeMesh) { + var _a; + const hand = this.getHandByControllerId(controllerId); + if (hand) { + const handedness = hand.xrController.inputSource.handedness == "left" ? "left" : "right"; + if (((_a = this._trackingHands[handedness]) == null ? void 0 : _a.xrController.uniqueId) === controllerId) { + this._trackingHands[handedness] = null; + } + this.onHandRemovedObservable.notifyObservers(hand); + hand.dispose(disposeMesh); + delete this._attachedHands[controllerId]; + } + } + /** + * Detach this feature. + * Will usually be called by the features manager. + * + * @returns true if successful. + */ + detach() { + var _a; + if (!super.detach()) { + return false; + } + Object.keys(this._attachedHands).forEach((uniqueId) => { + var _a2; + return this._detachHandById(uniqueId, (_a2 = this.options.handMeshes) == null ? void 0 : _a2.disposeOnSessionEnd); + }); + if ((_a = this.options.handMeshes) == null ? void 0 : _a.disposeOnSessionEnd) { + if (this._handResources.jointMeshes) { + this._handResources.jointMeshes.left.forEach((trackedMesh) => trackedMesh.dispose()); + this._handResources.jointMeshes.right.forEach((trackedMesh) => trackedMesh.dispose()); + } + } + if (this._worldScaleObserver) { + this._xrSessionManager.onWorldScaleFactorChangedObservable.remove(this._worldScaleObserver); + } + return true; + } + /** + * Dispose this feature and all of the resources attached. + */ + dispose() { + var _a; + super.dispose(); + this.onHandAddedObservable.clear(); + this.onHandRemovedObservable.clear(); + if (this._handResources.handMeshes && !((_a = this.options.handMeshes) == null ? void 0 : _a.customMeshes)) { + this._handResources.handMeshes.left.dispose(); + this._handResources.handMeshes.right.dispose(); + _WebXRHandTracking._RightHandGLB = null; + _WebXRHandTracking._LeftHandGLB = null; + } + if (this._handResources.jointMeshes) { + this._handResources.jointMeshes.left.forEach((trackedMesh) => trackedMesh.dispose()); + this._handResources.jointMeshes.right.forEach((trackedMesh) => trackedMesh.dispose()); + } + } +}; +WebXRHandTracking.Name = WebXRFeatureName.HAND_TRACKING; +WebXRHandTracking.Version = 1; +WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL = "https://assets.babylonjs.com/meshes/HandMeshes/"; +WebXRHandTracking.DEFAULT_HAND_MODEL_RIGHT_FILENAME = "r_hand_rhs.glb"; +WebXRHandTracking.DEFAULT_HAND_MODEL_LEFT_FILENAME = "l_hand_rhs.glb"; +WebXRHandTracking.DEFAULT_HAND_MODEL_SHADER_URL = "https://assets.babylonjs.com/meshes/HandMeshes/handsShader.json"; +WebXRHandTracking._ICOSPHERE_PARAMS = { radius: 0.5, flat: false, subdivisions: 2 }; +WebXRHandTracking._RightHandGLB = null; +WebXRHandTracking._LeftHandGLB = null; +WebXRFeaturesManager.AddWebXRFeature(WebXRHandTracking.Name, (xrSessionManager, options) => { + return () => new WebXRHandTracking(xrSessionManager, options); +}, WebXRHandTracking.Version, false); -// node_modules/@babylonjs/core/Shaders/ShadersInclude/fogVertex.js -var name61 = "fogVertex"; -var shader61 = `#ifdef FOG -vFogDistance=(view*worldPos).xyz; -#endif -`; -ShaderStore.IncludesShadersStore[name61] = shader61; +// node_modules/@babylonjs/core/Behaviors/Meshes/handConstraintBehavior.js +var HandConstraintZone; +(function(HandConstraintZone2) { + HandConstraintZone2[HandConstraintZone2["ABOVE_FINGER_TIPS"] = 0] = "ABOVE_FINGER_TIPS"; + HandConstraintZone2[HandConstraintZone2["RADIAL_SIDE"] = 1] = "RADIAL_SIDE"; + HandConstraintZone2[HandConstraintZone2["ULNAR_SIDE"] = 2] = "ULNAR_SIDE"; + HandConstraintZone2[HandConstraintZone2["BELOW_WRIST"] = 3] = "BELOW_WRIST"; +})(HandConstraintZone || (HandConstraintZone = {})); +var HandConstraintOrientation; +(function(HandConstraintOrientation2) { + HandConstraintOrientation2[HandConstraintOrientation2["LOOK_AT_CAMERA"] = 0] = "LOOK_AT_CAMERA"; + HandConstraintOrientation2[HandConstraintOrientation2["HAND_ROTATION"] = 1] = "HAND_ROTATION"; +})(HandConstraintOrientation || (HandConstraintOrientation = {})); +var HandConstraintVisibility; +(function(HandConstraintVisibility2) { + HandConstraintVisibility2[HandConstraintVisibility2["ALWAYS_VISIBLE"] = 0] = "ALWAYS_VISIBLE"; + HandConstraintVisibility2[HandConstraintVisibility2["PALM_UP"] = 1] = "PALM_UP"; + HandConstraintVisibility2[HandConstraintVisibility2["GAZE_FOCUS"] = 2] = "GAZE_FOCUS"; + HandConstraintVisibility2[HandConstraintVisibility2["PALM_AND_GAZE"] = 3] = "PALM_AND_GAZE"; +})(HandConstraintVisibility || (HandConstraintVisibility = {})); +var HandConstraintBehavior = class { + /** + * Builds a hand constraint behavior + */ + constructor() { + this._sceneRenderObserver = null; + this._zoneAxis = {}; + this.handConstraintVisibility = HandConstraintVisibility.PALM_AND_GAZE; + this.palmUpStrictness = 0.95; + this.gazeProximityRadius = 0.15; + this.targetOffset = 0.1; + this.targetZone = HandConstraintZone.ULNAR_SIDE; + this.zoneOrientationMode = HandConstraintOrientation.HAND_ROTATION; + this.nodeOrientationMode = HandConstraintOrientation.HAND_ROTATION; + this.handedness = "none"; + this.lerpTime = 100; + this._zoneAxis[HandConstraintZone.ABOVE_FINGER_TIPS] = new Vector3(0, 1, 0); + this._zoneAxis[HandConstraintZone.RADIAL_SIDE] = new Vector3(-1, 0, 0); + this._zoneAxis[HandConstraintZone.ULNAR_SIDE] = new Vector3(1, 0, 0); + this._zoneAxis[HandConstraintZone.BELOW_WRIST] = new Vector3(0, -1, 0); + } + /** gets or sets behavior's name */ + get name() { + return "HandConstraint"; + } + /** Enable the behavior */ + enable() { + this._node.setEnabled(true); + } + /** Disable the behavior */ + disable() { + this._node.setEnabled(false); + } + _getHandPose() { + if (!this._handTracking) { + return null; + } + let hand; + if (this.handedness === "none") { + hand = this._handTracking.getHandByHandedness("left") || this._handTracking.getHandByHandedness("right"); + } else { + hand = this._handTracking.getHandByHandedness(this.handedness); + } + if (hand) { + const pinkyMetacarpal = hand.getJointMesh(WebXRHandJoint.PINKY_FINGER_METACARPAL); + const middleMetacarpal = hand.getJointMesh(WebXRHandJoint.MIDDLE_FINGER_METACARPAL); + const wrist = hand.getJointMesh(WebXRHandJoint.WRIST); + if (wrist && middleMetacarpal && pinkyMetacarpal) { + const handPose = { position: middleMetacarpal.absolutePosition, quaternion: new Quaternion(), id: hand.xrController.uniqueId }; + const up = TmpVectors.Vector3[0]; + const forward = TmpVectors.Vector3[1]; + const left = TmpVectors.Vector3[2]; + up.copyFrom(middleMetacarpal.absolutePosition).subtractInPlace(wrist.absolutePosition).normalize(); + forward.copyFrom(pinkyMetacarpal.absolutePosition).subtractInPlace(middleMetacarpal.absolutePosition).normalize(); + Vector3.CrossToRef(up, forward, forward); + Vector3.CrossToRef(forward, up, left); + Quaternion.FromLookDirectionLHToRef(forward, up, handPose.quaternion); + return handPose; + } + } + return null; + } + /** + * Initializes the hand constraint behavior + */ + init() { + } + /** + * Attaches the hand constraint to a `TransformNode` + * @param node defines the node to attach the behavior to + */ + attach(node) { + this._node = node; + this._scene = node.getScene(); + if (!this._node.rotationQuaternion) { + this._node.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._node.rotation.y, this._node.rotation.x, this._node.rotation.z); + } + let lastTick = Date.now(); + this._sceneRenderObserver = this._scene.onBeforeRenderObservable.add(() => { + const pose = this._getHandPose(); + this._node.reservedDataStore = this._node.reservedDataStore || {}; + this._node.reservedDataStore.nearInteraction = this._node.reservedDataStore.nearInteraction || {}; + this._node.reservedDataStore.nearInteraction.excludedControllerId = null; + if (pose) { + const zoneOffset = TmpVectors.Vector3[0]; + const camera = this._scene.activeCamera; + zoneOffset.copyFrom(this._zoneAxis[this.targetZone]); + const cameraLookAtQuaternion = TmpVectors.Quaternion[0]; + if (camera && (this.zoneOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA || this.nodeOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA)) { + const toCamera = TmpVectors.Vector3[1]; + toCamera.copyFrom(camera.position).subtractInPlace(pose.position).normalize(); + if (this._scene.useRightHandedSystem) { + Quaternion.FromLookDirectionRHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion); + } else { + Quaternion.FromLookDirectionLHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion); + } + } + if (this.zoneOrientationMode === HandConstraintOrientation.HAND_ROTATION) { + pose.quaternion.toRotationMatrix(TmpVectors.Matrix[0]); + } else { + cameraLookAtQuaternion.toRotationMatrix(TmpVectors.Matrix[0]); + } + Vector3.TransformNormalToRef(zoneOffset, TmpVectors.Matrix[0], zoneOffset); + zoneOffset.scaleInPlace(this.targetOffset); + const targetPosition = TmpVectors.Vector3[2]; + const targetRotation = TmpVectors.Quaternion[1]; + targetPosition.copyFrom(pose.position).addInPlace(zoneOffset); + if (this.nodeOrientationMode === HandConstraintOrientation.HAND_ROTATION) { + targetRotation.copyFrom(pose.quaternion); + } else { + targetRotation.copyFrom(cameraLookAtQuaternion); + } + const elapsed = Date.now() - lastTick; + Vector3.SmoothToRef(this._node.position, targetPosition, elapsed, this.lerpTime, this._node.position); + Quaternion.SmoothToRef(this._node.rotationQuaternion, targetRotation, elapsed, this.lerpTime, this._node.rotationQuaternion); + this._node.reservedDataStore.nearInteraction.excludedControllerId = pose.id; + } + this._setVisibility(pose); + lastTick = Date.now(); + }); + } + _setVisibility(pose) { + let palmVisible = true; + let gazeVisible = true; + const camera = this._scene.activeCamera; + if (camera) { + const cameraForward = camera.getForwardRay(); + if (this.handConstraintVisibility === HandConstraintVisibility.GAZE_FOCUS || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) { + gazeVisible = false; + let gaze; + if (this._eyeTracking) { + gaze = this._eyeTracking.getEyeGaze(); + } + gaze = gaze || cameraForward; + const gazeToBehavior = TmpVectors.Vector3[0]; + if (pose) { + pose.position.subtractToRef(gaze.origin, gazeToBehavior); + } else { + this._node.getAbsolutePosition().subtractToRef(gaze.origin, gazeToBehavior); + } + const projectedDistance = Vector3.Dot(gazeToBehavior, gaze.direction); + const projectedSquared = projectedDistance * projectedDistance; + if (projectedDistance > 0) { + const radiusSquared = gazeToBehavior.lengthSquared() - projectedSquared; + if (radiusSquared < this.gazeProximityRadius * this.gazeProximityRadius) { + gazeVisible = true; + } + } + } + if (this.handConstraintVisibility === HandConstraintVisibility.PALM_UP || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) { + palmVisible = false; + if (pose) { + const palmDirection = TmpVectors.Vector3[0]; + Vector3.LeftHandedForwardReadOnly.rotateByQuaternionToRef(pose.quaternion, palmDirection); + if (Vector3.Dot(palmDirection, cameraForward.direction) > this.palmUpStrictness * 2 - 1) { + palmVisible = true; + } + } + } + } + this._node.setEnabled(palmVisible && gazeVisible); + } + /** + * Detaches the behavior from the `TransformNode` + */ + detach() { + this._scene.onBeforeRenderObservable.remove(this._sceneRenderObserver); + } + /** + * Links the behavior to the XR experience in which to retrieve hand transform information. + * @param xr xr experience + */ + linkToXRExperience(xr) { + const featuresManager = xr.featuresManager ? xr.featuresManager : xr; + if (!featuresManager) { + Tools.Error("XR features manager must be available or provided directly for the Hand Menu to work"); + } else { + try { + this._eyeTracking = featuresManager.getEnabledFeature(WebXRFeatureName.EYE_TRACKING); + } catch { + } + try { + this._handTracking = featuresManager.getEnabledFeature(WebXRFeatureName.HAND_TRACKING); + } catch { + Tools.Error("Hand tracking must be enabled for the Hand Menu to work"); + } + } + } +}; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/shadowsVertex.js -var name62 = "shadowsVertex"; -var shader62 = `#ifdef SHADOWS -#if defined(SHADOWCSM{X}) -vPositionFromCamera{X}=view*worldPos;for (int i=0; i { + const options = { + size, + width: size, + height: size, + sideOrientation, + updatable + }; + return CreatePlane(name69, options, scene); +}; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/vertexColorMixing.js -var name63 = "vertexColorMixing"; -var shader63 = `#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES) -vColor=vec4(1.0); -#ifdef VERTEXCOLOR -#ifdef VERTEXALPHA -vColor*=color; -#else -vColor.rgb*=color.rgb; -#endif -#endif -#ifdef INSTANCESCOLOR -vColor*=instanceColor; -#endif -#endif -`; -ShaderStore.IncludesShadersStore[name63] = shader63; +// node_modules/@babylonjs/core/Behaviors/Meshes/fadeInOutBehavior.js +var FadeInOutBehavior = class { + /** + * Time in milliseconds to delay before fading in (Default: 0) + * Will set both fade in and out delay to the same value + */ + get delay() { + return this.fadeInDelay; + } + set delay(value) { + this.fadeInDelay = value; + this.fadeOutDelay = value; + } + /** + * Instantiates the FadeInOutBehavior + */ + constructor() { + this.fadeInDelay = 0; + this.fadeOutDelay = 0; + this.fadeInTime = 300; + this.fadeOutTime = 300; + this._millisecondsPerFrame = 1e3 / 60; + this._hovered = false; + this._hoverValue = 0; + this._ownerNode = null; + this._delay = 0; + this._time = 300; + this._update = () => { + if (this._ownerNode) { + this._hoverValue += this._hovered ? this._millisecondsPerFrame : -this._millisecondsPerFrame; + this._setAllVisibility(this._ownerNode, (this._hoverValue - this._delay) / this._time); + if (this._ownerNode.visibility > 1) { + this._setAllVisibility(this._ownerNode, 1); + if (this._hoverValue > this._time) { + this._hoverValue = this._time; + this._detachObserver(); + return; + } + } else if (this._ownerNode.visibility < 0) { + this._setAllVisibility(this._ownerNode, 0); + if (this._hoverValue < 0) { + this._hoverValue = 0; + this._detachObserver(); + return; + } + } + this._attachObserver(); + } + }; + } + /** + * The name of the behavior + */ + get name() { + return "FadeInOut"; + } + /** + * Initializes the behavior + */ + init() { + } + /** + * Attaches the fade behavior on the passed in mesh + * @param ownerNode The mesh that will be faded in/out once attached + */ + attach(ownerNode) { + this._ownerNode = ownerNode; + this._setAllVisibility(this._ownerNode, 0); + } + /** + * Detaches the behavior from the mesh + */ + detach() { + this._ownerNode = null; + } + /** + * Triggers the mesh to begin fading in (or out) + * @param fadeIn if the object should fade in or out (true to fade in) + */ + fadeIn(fadeIn = true) { + this._delay = fadeIn ? this.fadeInDelay : this.fadeOutDelay; + this._time = fadeIn ? this.fadeInTime : this.fadeOutTime; + this._detachObserver(); + if (this._ownerNode && (fadeIn && this._ownerNode.visibility >= 1 || !fadeIn && this._ownerNode.visibility <= 0)) { + return; + } + this._hovered = fadeIn; + if (!this._hovered) { + this._delay *= -1; + } + if (this._ownerNode.visibility >= 1) { + this._hoverValue = this._time; + } else if (this._ownerNode.visibility <= 0) { + this._hoverValue = 0; + } + this._update(); + } + /** + * Triggers the mesh to begin fading out + */ + fadeOut() { + this.fadeIn(false); + } + _setAllVisibility(mesh, value) { + mesh.visibility = value; + mesh.getChildMeshes().forEach((c) => { + this._setAllVisibility(c, value); + }); + } + _attachObserver() { + var _a; + if (!this._onBeforeRenderObserver) { + this._onBeforeRenderObserver = (_a = this._ownerNode) == null ? void 0 : _a.getScene().onBeforeRenderObservable.add(this._update); + } + } + _detachObserver() { + var _a; + if (this._onBeforeRenderObserver) { + (_a = this._ownerNode) == null ? void 0 : _a.getScene().onBeforeRenderObservable.remove(this._onBeforeRenderObserver); + this._onBeforeRenderObserver = null; + } + } +}; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/pointCloudVertex.js -var name64 = "pointCloudVertex"; -var shader64 = `#if defined(POINTSIZE) && !defined(WEBGPU) -gl_PointSize=pointSize; -#endif -`; -ShaderStore.IncludesShadersStore[name64] = shader64; +// node_modules/@babylonjs/core/Behaviors/Meshes/followBehavior.js +var FollowBehavior = class { + constructor() { + this._tmpQuaternion = new Quaternion(); + this._tmpVectors = [new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3()]; + this._tmpMatrix = new Matrix(); + this._tmpInvertView = new Matrix(); + this._tmpForward = new Vector3(); + this._tmpNodeForward = new Vector3(); + this._tmpPosition = new Vector3(); + this._workingPosition = new Vector3(); + this._workingQuaternion = new Quaternion(); + this._lastTick = -1; + this._recenterNextUpdate = true; + this.interpolatePose = true; + this.lerpTime = 500; + this.ignoreCameraPitchAndRoll = false; + this.pitchOffset = 15; + this.maxViewVerticalDegrees = 30; + this.maxViewHorizontalDegrees = 30; + this.orientToCameraDeadzoneDegrees = 60; + this.ignoreDistanceClamp = false; + this.ignoreAngleClamp = false; + this.verticalMaxDistance = 0; + this.defaultDistance = 0.8; + this.maximumDistance = 2; + this.minimumDistance = 0.3; + this.useFixedVerticalOffset = false; + this.fixedVerticalOffset = 0; + this._enabled = true; + } + /** + * The camera that should be followed by this behavior + */ + get followedCamera() { + return this._followedCamera || this._scene.activeCamera; + } + set followedCamera(camera) { + this._followedCamera = camera; + } + /** + * The name of the behavior + */ + get name() { + return "Follow"; + } + /** + * Initializes the behavior + */ + init() { + } + /** + * Attaches the follow behavior + * @param ownerNode The mesh that will be following once attached + * @param followedCamera The camera that should be followed by the node + */ + attach(ownerNode, followedCamera) { + this._scene = ownerNode.getScene(); + this.attachedNode = ownerNode; + if (followedCamera) { + this.followedCamera = followedCamera; + } + this._addObservables(); + } + /** + * Detaches the behavior from the mesh + */ + detach() { + this.attachedNode = null; + this._removeObservables(); + } + /** + * Recenters the attached node in front of the camera on the next update + */ + recenter() { + this._recenterNextUpdate = true; + } + _angleBetweenVectorAndPlane(vector, normal) { + this._tmpVectors[0].copyFrom(vector); + vector = this._tmpVectors[0]; + this._tmpVectors[1].copyFrom(normal); + normal = this._tmpVectors[1]; + vector.normalize(); + normal.normalize(); + return Math.PI / 2 - Math.acos(Vector3.Dot(vector, normal)); + } + _length2D(vector) { + return Math.sqrt(vector.x * vector.x + vector.z * vector.z); + } + _distanceClamp(currentToTarget, moveToDefault = false) { + let minDistance = this.minimumDistance; + let maxDistance = this.maximumDistance; + const defaultDistance = this.defaultDistance; + const direction = this._tmpVectors[0]; + direction.copyFrom(currentToTarget); + let currentDistance = direction.length(); + direction.normalizeFromLength(currentDistance); + if (this.ignoreCameraPitchAndRoll) { + minDistance = this._length2D(direction) * minDistance; + maxDistance = this._length2D(direction) * maxDistance; + const currentDistance2D = this._length2D(currentToTarget); + direction.scaleInPlace(currentDistance / currentDistance2D); + currentDistance = currentDistance2D; + } + let clampedDistance = currentDistance; + if (moveToDefault) { + clampedDistance = defaultDistance; + } else { + clampedDistance = Scalar.Clamp(currentDistance, minDistance, maxDistance); + } + currentToTarget.copyFrom(direction).scaleInPlace(clampedDistance); + return currentDistance !== clampedDistance; + } + _applyVerticalClamp(currentToTarget) { + if (this.verticalMaxDistance !== 0) { + currentToTarget.y = Scalar.Clamp(currentToTarget.y, -this.verticalMaxDistance, this.verticalMaxDistance); + } + } + _toOrientationQuatToRef(vector, quaternion) { + Quaternion.RotationYawPitchRollToRef(Math.atan2(vector.x, vector.z), Math.atan2(vector.y, Math.sqrt(vector.z * vector.z + vector.x * vector.x)), 0, quaternion); + } + _applyPitchOffset(invertView) { + const forward = this._tmpVectors[0]; + const right = this._tmpVectors[1]; + forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1); + right.copyFromFloats(1, 0, 0); + Vector3.TransformNormalToRef(forward, invertView, forward); + forward.y = 0; + forward.normalize(); + Vector3.TransformNormalToRef(right, invertView, right); + Quaternion.RotationAxisToRef(right, this.pitchOffset * Math.PI / 180, this._tmpQuaternion); + forward.rotateByQuaternionToRef(this._tmpQuaternion, forward); + this._toOrientationQuatToRef(forward, this._tmpQuaternion); + this._tmpQuaternion.toRotationMatrix(this._tmpMatrix); + invertView.copyFrom(this._tmpMatrix); + } + _angularClamp(invertView, currentToTarget) { + const forward = this._tmpVectors[5]; + forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1); + const right = this._tmpVectors[6]; + right.copyFromFloats(1, 0, 0); + Vector3.TransformNormalToRef(forward, invertView, forward); + Vector3.TransformNormalToRef(right, invertView, right); + const up = Vector3.UpReadOnly; + const dist = currentToTarget.length(); + if (dist < Epsilon) { + return false; + } + let angularClamped = false; + const rotationQuat = this._tmpQuaternion; + if (this.ignoreCameraPitchAndRoll) { + const angle2 = Vector3.GetAngleBetweenVectorsOnPlane(currentToTarget, forward, right); + Quaternion.RotationAxisToRef(right, angle2, rotationQuat); + currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget); + } else { + const angle2 = -Vector3.GetAngleBetweenVectorsOnPlane(currentToTarget, forward, right); + const minMaxAngle2 = this.maxViewVerticalDegrees * Math.PI / 180 * 0.5; + if (angle2 < -minMaxAngle2) { + Quaternion.RotationAxisToRef(right, -angle2 - minMaxAngle2, rotationQuat); + currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget); + angularClamped = true; + } else if (angle2 > minMaxAngle2) { + Quaternion.RotationAxisToRef(right, -angle2 + minMaxAngle2, rotationQuat); + currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget); + angularClamped = true; + } + } + const angle = this._angleBetweenVectorAndPlane(currentToTarget, right) * (this._scene.useRightHandedSystem ? -1 : 1); + const minMaxAngle = this.maxViewHorizontalDegrees * Math.PI / 180 * 0.5; + if (angle < -minMaxAngle) { + Quaternion.RotationAxisToRef(up, -angle - minMaxAngle, rotationQuat); + currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget); + angularClamped = true; + } else if (angle > minMaxAngle) { + Quaternion.RotationAxisToRef(up, -angle + minMaxAngle, rotationQuat); + currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget); + angularClamped = true; + } + return angularClamped; + } + _orientationClamp(currentToTarget, rotationQuaternion) { + var _a; + const toFollowed = this._tmpVectors[0]; + toFollowed.copyFrom(currentToTarget).scaleInPlace(-1).normalize(); + const up = this._tmpVectors[1]; + const right = this._tmpVectors[2]; + up.copyFromFloats(0, 1, 0); + Vector3.CrossToRef(toFollowed, up, right); + const length = right.length(); + if (length < Epsilon) { + return; + } + right.normalizeFromLength(length); + Vector3.CrossToRef(right, toFollowed, up); + if ((_a = this.attachedNode) == null ? void 0 : _a.getScene().useRightHandedSystem) { + Quaternion.FromLookDirectionRHToRef(toFollowed, up, rotationQuaternion); + } else { + Quaternion.FromLookDirectionLHToRef(toFollowed, up, rotationQuaternion); + } + } + _passedOrientationDeadzone(currentToTarget, forward) { + const leashToFollow = this._tmpVectors[5]; + leashToFollow.copyFrom(currentToTarget); + leashToFollow.normalize(); + const angle = Math.abs(Vector3.GetAngleBetweenVectorsOnPlane(forward, leashToFollow, Vector3.UpReadOnly)); + return angle * 180 / Math.PI > this.orientToCameraDeadzoneDegrees; + } + _updateLeashing(camera) { + if (this.attachedNode && this._enabled) { + const oldParent = this.attachedNode.parent; + this.attachedNode.setParent(null); + const worldMatrix = this.attachedNode.getWorldMatrix(); + const currentToTarget = this._workingPosition; + const rotationQuaternion = this._workingQuaternion; + const pivot = this.attachedNode.getPivotPoint(); + const invertView = this._tmpInvertView; + invertView.copyFrom(camera.getViewMatrix()); + invertView.invert(); + Vector3.TransformCoordinatesToRef(pivot, worldMatrix, currentToTarget); + const position = this._tmpPosition; + position.copyFromFloats(0, 0, 0); + Vector3.TransformCoordinatesToRef(position, worldMatrix, position); + position.scaleInPlace(-1).subtractInPlace(pivot); + currentToTarget.subtractInPlace(camera.globalPosition); + if (this.ignoreCameraPitchAndRoll) { + this._applyPitchOffset(invertView); + } + let angularClamped = false; + const forward = this._tmpForward; + forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1); + Vector3.TransformNormalToRef(forward, invertView, forward); + const nodeForward = this._tmpNodeForward; + nodeForward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1); + Vector3.TransformNormalToRef(nodeForward, worldMatrix, nodeForward); + if (this._recenterNextUpdate) { + currentToTarget.copyFrom(forward).scaleInPlace(this.defaultDistance); + } else { + if (this.ignoreAngleClamp) { + const currentDistance = currentToTarget.length(); + currentToTarget.copyFrom(forward).scaleInPlace(currentDistance); + } else { + angularClamped = this._angularClamp(invertView, currentToTarget); + } + } + let distanceClamped = false; + if (!this.ignoreDistanceClamp) { + distanceClamped = this._distanceClamp(currentToTarget, angularClamped); + this._applyVerticalClamp(currentToTarget); + } + if (this.useFixedVerticalOffset) { + currentToTarget.y = position.y - camera.globalPosition.y + this.fixedVerticalOffset; + } + if (angularClamped || distanceClamped || this._passedOrientationDeadzone(currentToTarget, nodeForward) || this._recenterNextUpdate) { + this._orientationClamp(currentToTarget, rotationQuaternion); + } + this._workingPosition.subtractInPlace(pivot); + this._recenterNextUpdate = false; + this.attachedNode.setParent(oldParent); + } + } + _updateTransformToGoal(elapsed) { + if (!this.attachedNode || !this.followedCamera || !this._enabled) { + return; + } + if (!this.attachedNode.rotationQuaternion) { + this.attachedNode.rotationQuaternion = Quaternion.Identity(); + } + const oldParent = this.attachedNode.parent; + this.attachedNode.setParent(null); + if (!this.interpolatePose) { + this.attachedNode.position.copyFrom(this.followedCamera.globalPosition).addInPlace(this._workingPosition); + this.attachedNode.rotationQuaternion.copyFrom(this._workingQuaternion); + return; + } + const currentDirection = new Vector3(); + currentDirection.copyFrom(this.attachedNode.position).subtractInPlace(this.followedCamera.globalPosition); + Vector3.SmoothToRef(currentDirection, this._workingPosition, elapsed, this.lerpTime, currentDirection); + currentDirection.addInPlace(this.followedCamera.globalPosition); + this.attachedNode.position.copyFrom(currentDirection); + const currentRotation = new Quaternion(); + currentRotation.copyFrom(this.attachedNode.rotationQuaternion); + Quaternion.SmoothToRef(currentRotation, this._workingQuaternion, elapsed, this.lerpTime, this.attachedNode.rotationQuaternion); + this.attachedNode.setParent(oldParent); + } + _addObservables() { + this._lastTick = Date.now(); + this._onBeforeRender = this._scene.onBeforeRenderObservable.add(() => { + if (!this.followedCamera) { + return; + } + const tick = Date.now(); + this._updateLeashing(this.followedCamera); + this._updateTransformToGoal(tick - this._lastTick); + this._lastTick = tick; + }); + } + _removeObservables() { + if (this._onBeforeRender) { + this._scene.onBeforeRenderObservable.remove(this._onBeforeRender); + } + } +}; -// node_modules/@babylonjs/core/Shaders/ShadersInclude/logDepthVertex.js -var name65 = "logDepthVertex"; -var shader65 = `#ifdef LOGARITHMICDEPTH -vFragmentDepth=1.0+gl_Position.w;gl_Position.z=log2(max(0.000001,vFragmentDepth))*logarithmicDepthConstant; -#endif -`; -ShaderStore.IncludesShadersStore[name65] = shader65; +// node_modules/@babylonjs/core/Behaviors/Meshes/baseSixDofDragBehavior.js +var BaseSixDofDragBehavior = class _BaseSixDofDragBehavior { + constructor() { + this._attachedToElement = false; + this._virtualMeshesInfo = {}; + this._tmpVector = new Vector3(); + this._tmpQuaternion = new Quaternion(); + this._dragType = { + NONE: 0, + DRAG: 1, + DRAG_WITH_CONTROLLER: 2, + NEAR_DRAG: 3 + }; + this._moving = false; + this._dragging = this._dragType.NONE; + this.draggableMeshes = null; + this.zDragFactor = 3; + this.currentDraggingPointerIds = []; + this.detachCameraControls = true; + this.onDragStartObservable = new Observable(); + this.onDragObservable = new Observable(); + this.onDragEndObservable = new Observable(); + this.allowMultiPointer = true; + } + /** + * The id of the pointer that is currently interacting with the behavior (-1 when no pointer is active) + */ + get currentDraggingPointerId() { + if (this.currentDraggingPointerIds[0] !== void 0) { + return this.currentDraggingPointerIds[0]; + } + return -1; + } + set currentDraggingPointerId(value) { + this.currentDraggingPointerIds[0] = value; + } + /** + * Get or set the currentDraggingPointerId + * @deprecated Please use currentDraggingPointerId instead + */ + get currentDraggingPointerID() { + return this.currentDraggingPointerId; + } + set currentDraggingPointerID(currentDraggingPointerID) { + this.currentDraggingPointerId = currentDraggingPointerID; + } + /** + * The name of the behavior + */ + get name() { + return "BaseSixDofDrag"; + } + /** + * Returns true if the attached mesh is currently moving with this behavior + */ + get isMoving() { + return this._moving; + } + /** + * Initializes the behavior + */ + init() { + } + /** + * In the case of multiple active cameras, the cameraToUseForPointers should be used if set instead of active camera + */ + get _pointerCamera() { + if (this._scene.cameraToUseForPointers) { + return this._scene.cameraToUseForPointers; + } else { + return this._scene.activeCamera; + } + } + _createVirtualMeshInfo() { + const dragMesh = new AbstractMesh("", _BaseSixDofDragBehavior._virtualScene); + dragMesh.rotationQuaternion = new Quaternion(); + const originMesh = new AbstractMesh("", _BaseSixDofDragBehavior._virtualScene); + originMesh.rotationQuaternion = new Quaternion(); + const pivotMesh = new AbstractMesh("", _BaseSixDofDragBehavior._virtualScene); + pivotMesh.rotationQuaternion = new Quaternion(); + return { + dragging: false, + moving: false, + dragMesh, + originMesh, + pivotMesh, + startingPivotPosition: new Vector3(), + startingPivotOrientation: new Quaternion(), + startingPosition: new Vector3(), + startingOrientation: new Quaternion(), + lastOriginPosition: new Vector3(), + lastDragPosition: new Vector3() + }; + } + _resetVirtualMeshesPosition() { + for (let i = 0; i < this.currentDraggingPointerIds.length; i++) { + this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.position.copyFrom(this._ownerNode.getAbsolutePivotPoint()); + this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.rotationQuaternion.copyFrom(this._ownerNode.rotationQuaternion); + this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingPivotPosition.copyFrom(this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.position); + this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingPivotOrientation.copyFrom(this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.rotationQuaternion); + this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingPosition.copyFrom(this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].dragMesh.position); + this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingOrientation.copyFrom(this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].dragMesh.rotationQuaternion); + } + } + _pointerUpdate2D(ray, pointerId, zDragFactor) { + if (this._pointerCamera && this._pointerCamera.cameraRigMode == Camera.RIG_MODE_NONE && !this._pointerCamera._isLeftCamera && !this._pointerCamera._isRightCamera) { + ray.origin.copyFrom(this._pointerCamera.globalPosition); + zDragFactor = 0; + } + const virtualMeshesInfo = this._virtualMeshesInfo[pointerId]; + const originDragDifference = TmpVectors.Vector3[0]; + ray.origin.subtractToRef(virtualMeshesInfo.lastOriginPosition, originDragDifference); + virtualMeshesInfo.lastOriginPosition.copyFrom(ray.origin); + const localOriginDragDifference = -Vector3.Dot(originDragDifference, ray.direction); + virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.dragMesh); + virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.pivotMesh); + this._applyZOffset(virtualMeshesInfo.dragMesh, localOriginDragDifference, zDragFactor); + this._applyZOffset(virtualMeshesInfo.pivotMesh, localOriginDragDifference, zDragFactor); + virtualMeshesInfo.originMesh.position.copyFrom(ray.origin); + const lookAt = TmpVectors.Vector3[0]; + ray.origin.addToRef(ray.direction, lookAt); + virtualMeshesInfo.originMesh.lookAt(lookAt); + virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.dragMesh); + virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.pivotMesh); + } + _pointerUpdateXR(controllerAimTransform, controllerGripTransform, pointerId, zDragFactor) { + const virtualMeshesInfo = this._virtualMeshesInfo[pointerId]; + virtualMeshesInfo.originMesh.position.copyFrom(controllerAimTransform.position); + if (this._dragging === this._dragType.NEAR_DRAG && controllerGripTransform) { + virtualMeshesInfo.originMesh.rotationQuaternion.copyFrom(controllerGripTransform.rotationQuaternion); + } else { + virtualMeshesInfo.originMesh.rotationQuaternion.copyFrom(controllerAimTransform.rotationQuaternion); + } + virtualMeshesInfo.pivotMesh.computeWorldMatrix(true); + virtualMeshesInfo.dragMesh.computeWorldMatrix(true); + if (zDragFactor !== 0) { + const cameraForwardVec = TmpVectors.Vector3[0]; + const originDragDirection = TmpVectors.Vector3[1]; + cameraForwardVec.copyFrom(this._pointerCamera.getForwardRay().direction); + virtualMeshesInfo.originMesh.position.subtractToRef(virtualMeshesInfo.lastOriginPosition, originDragDirection); + virtualMeshesInfo.lastOriginPosition.copyFrom(virtualMeshesInfo.originMesh.position); + const controllerDragDistance = originDragDirection.length(); + originDragDirection.normalize(); + const cameraToDrag = TmpVectors.Vector3[2]; + const controllerToDrag = TmpVectors.Vector3[3]; + virtualMeshesInfo.dragMesh.absolutePosition.subtractToRef(this._pointerCamera.globalPosition, cameraToDrag); + virtualMeshesInfo.dragMesh.absolutePosition.subtractToRef(virtualMeshesInfo.originMesh.position, controllerToDrag); + const controllerToDragDistance = controllerToDrag.length(); + cameraToDrag.normalize(); + controllerToDrag.normalize(); + const controllerDragScaling = Math.abs(Vector3.Dot(originDragDirection, controllerToDrag)) * Vector3.Dot(originDragDirection, cameraForwardVec); + let zOffsetScaling = controllerDragScaling * zDragFactor * controllerDragDistance * controllerToDragDistance; + const minDistanceFromControllerToDragMesh = 0.01; + if (zOffsetScaling < 0 && minDistanceFromControllerToDragMesh - controllerToDragDistance > zOffsetScaling) { + zOffsetScaling = Math.min(minDistanceFromControllerToDragMesh - controllerToDragDistance, 0); + } + controllerToDrag.scaleInPlace(zOffsetScaling); + controllerToDrag.addToRef(virtualMeshesInfo.pivotMesh.absolutePosition, this._tmpVector); + virtualMeshesInfo.pivotMesh.setAbsolutePosition(this._tmpVector); + controllerToDrag.addToRef(virtualMeshesInfo.dragMesh.absolutePosition, this._tmpVector); + virtualMeshesInfo.dragMesh.setAbsolutePosition(this._tmpVector); + } + } + /** + * Attaches the scale behavior the passed in mesh + * @param ownerNode The mesh that will be scaled around once attached + */ + attach(ownerNode) { + this._ownerNode = ownerNode; + this._scene = this._ownerNode.getScene(); + if (!_BaseSixDofDragBehavior._virtualScene) { + _BaseSixDofDragBehavior._virtualScene = new Scene(this._scene.getEngine(), { virtual: true }); + _BaseSixDofDragBehavior._virtualScene.detachControl(); + } + const pickPredicate = (m) => { + return this._ownerNode === m || m.isDescendantOf(this._ownerNode) && (!this.draggableMeshes || this.draggableMeshes.indexOf(m) !== -1); + }; + this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => { + const pointerId = pointerInfo.event.pointerId; + if (!this._virtualMeshesInfo[pointerId]) { + this._virtualMeshesInfo[pointerId] = this._createVirtualMeshInfo(); + } + const virtualMeshesInfo = this._virtualMeshesInfo[pointerId]; + const isXRPointer = pointerInfo.event.pointerType === "xr-near" || pointerInfo.event.pointerType === "xr"; + if (pointerInfo.type == PointerEventTypes.POINTERDOWN) { + if (!virtualMeshesInfo.dragging && pointerInfo.pickInfo && pointerInfo.pickInfo.hit && pointerInfo.pickInfo.pickedMesh && pointerInfo.pickInfo.pickedPoint && pointerInfo.pickInfo.ray && (!isXRPointer || pointerInfo.pickInfo.aimTransform) && pickPredicate(pointerInfo.pickInfo.pickedMesh)) { + if ((!this.allowMultiPointer || isXRPointer) && this.currentDraggingPointerIds.length > 0) { + return; + } + if (this._pointerCamera && this._pointerCamera.cameraRigMode === Camera.RIG_MODE_NONE && !this._pointerCamera._isLeftCamera && !this._pointerCamera._isRightCamera) { + pointerInfo.pickInfo.ray.origin.copyFrom(this._pointerCamera.globalPosition); + } + this._ownerNode.computeWorldMatrix(true); + const virtualMeshesInfo2 = this._virtualMeshesInfo[pointerId]; + if (isXRPointer) { + this._dragging = pointerInfo.pickInfo.originMesh ? this._dragType.NEAR_DRAG : this._dragType.DRAG_WITH_CONTROLLER; + virtualMeshesInfo2.originMesh.position.copyFrom(pointerInfo.pickInfo.aimTransform.position); + if (this._dragging === this._dragType.NEAR_DRAG && pointerInfo.pickInfo.gripTransform) { + virtualMeshesInfo2.originMesh.rotationQuaternion.copyFrom(pointerInfo.pickInfo.gripTransform.rotationQuaternion); + } else { + virtualMeshesInfo2.originMesh.rotationQuaternion.copyFrom(pointerInfo.pickInfo.aimTransform.rotationQuaternion); + } + } else { + this._dragging = this._dragType.DRAG; + virtualMeshesInfo2.originMesh.position.copyFrom(pointerInfo.pickInfo.ray.origin); + } + virtualMeshesInfo2.lastOriginPosition.copyFrom(virtualMeshesInfo2.originMesh.position); + virtualMeshesInfo2.dragMesh.position.copyFrom(pointerInfo.pickInfo.pickedPoint); + virtualMeshesInfo2.lastDragPosition.copyFrom(pointerInfo.pickInfo.pickedPoint); + virtualMeshesInfo2.pivotMesh.position.copyFrom(this._ownerNode.getAbsolutePivotPoint()); + virtualMeshesInfo2.pivotMesh.rotationQuaternion.copyFrom(this._ownerNode.absoluteRotationQuaternion); + virtualMeshesInfo2.startingPosition.copyFrom(virtualMeshesInfo2.dragMesh.position); + virtualMeshesInfo2.startingPivotPosition.copyFrom(virtualMeshesInfo2.pivotMesh.position); + virtualMeshesInfo2.startingOrientation.copyFrom(virtualMeshesInfo2.dragMesh.rotationQuaternion); + virtualMeshesInfo2.startingPivotOrientation.copyFrom(virtualMeshesInfo2.pivotMesh.rotationQuaternion); + if (isXRPointer) { + virtualMeshesInfo2.originMesh.addChild(virtualMeshesInfo2.dragMesh); + virtualMeshesInfo2.originMesh.addChild(virtualMeshesInfo2.pivotMesh); + } else { + virtualMeshesInfo2.originMesh.lookAt(virtualMeshesInfo2.dragMesh.position); + } + virtualMeshesInfo2.dragging = true; + if (this.currentDraggingPointerIds.indexOf(pointerId) === -1) { + this.currentDraggingPointerIds.push(pointerId); + } + if (this.detachCameraControls && this._pointerCamera && !this._pointerCamera.leftCamera) { + if (this._pointerCamera.inputs && this._pointerCamera.inputs.attachedToElement) { + this._pointerCamera.detachControl(); + this._attachedToElement = true; + } else if (!this.allowMultiPointer || this.currentDraggingPointerIds.length === 0) { + this._attachedToElement = false; + } + } + this._targetDragStart(virtualMeshesInfo2.pivotMesh.position, virtualMeshesInfo2.pivotMesh.rotationQuaternion, pointerId); + this.onDragStartObservable.notifyObservers({ position: virtualMeshesInfo2.pivotMesh.position }); + } + } else if (pointerInfo.type == PointerEventTypes.POINTERUP || pointerInfo.type == PointerEventTypes.POINTERDOUBLETAP) { + const registeredPointerIndex = this.currentDraggingPointerIds.indexOf(pointerId); + virtualMeshesInfo.dragging = false; + if (registeredPointerIndex !== -1) { + this.currentDraggingPointerIds.splice(registeredPointerIndex, 1); + if (this.currentDraggingPointerIds.length === 0) { + this._moving = false; + this._dragging = this._dragType.NONE; + if (this.detachCameraControls && this._attachedToElement && this._pointerCamera && !this._pointerCamera.leftCamera) { + this._reattachCameraControls(); + this._attachedToElement = false; + } + } + virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.dragMesh); + virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.pivotMesh); + this._targetDragEnd(pointerId); + this.onDragEndObservable.notifyObservers({}); + } + } else if (pointerInfo.type == PointerEventTypes.POINTERMOVE) { + const registeredPointerIndex = this.currentDraggingPointerIds.indexOf(pointerId); + if (registeredPointerIndex !== -1 && virtualMeshesInfo.dragging && pointerInfo.pickInfo && (pointerInfo.pickInfo.ray || pointerInfo.pickInfo.aimTransform)) { + let zDragFactor = this.zDragFactor; + if (this.currentDraggingPointerIds.length > 1 || pointerInfo.pickInfo.originMesh) { + zDragFactor = 0; + } + this._ownerNode.computeWorldMatrix(true); + if (!isXRPointer) { + this._pointerUpdate2D(pointerInfo.pickInfo.ray, pointerId, zDragFactor); + } else { + this._pointerUpdateXR(pointerInfo.pickInfo.aimTransform, pointerInfo.pickInfo.gripTransform, pointerId, zDragFactor); + } + this._tmpQuaternion.copyFrom(virtualMeshesInfo.startingPivotOrientation); + this._tmpQuaternion.x = -this._tmpQuaternion.x; + this._tmpQuaternion.y = -this._tmpQuaternion.y; + this._tmpQuaternion.z = -this._tmpQuaternion.z; + virtualMeshesInfo.pivotMesh.absoluteRotationQuaternion.multiplyToRef(this._tmpQuaternion, this._tmpQuaternion); + virtualMeshesInfo.pivotMesh.absolutePosition.subtractToRef(virtualMeshesInfo.startingPivotPosition, this._tmpVector); + this.onDragObservable.notifyObservers({ delta: this._tmpVector, position: virtualMeshesInfo.pivotMesh.position, pickInfo: pointerInfo.pickInfo }); + this._targetDrag(this._tmpVector, this._tmpQuaternion, pointerId); + virtualMeshesInfo.lastDragPosition.copyFrom(virtualMeshesInfo.dragMesh.absolutePosition); + this._moving = true; + } + } + }); + } + _applyZOffset(node, localOriginDragDifference, zDragFactor) { + node.position.z -= node.position.z < 1 ? localOriginDragDifference * zDragFactor : localOriginDragDifference * zDragFactor * node.position.z; + if (node.position.z < 0) { + node.position.z = 0; + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _targetDragStart(worldPosition, worldRotation, pointerId) { + } + _targetDrag(worldDeltaPosition, worldDeltaRotation, pointerId) { + } + _targetDragEnd(pointerId) { + } + _reattachCameraControls() { + if (this._pointerCamera) { + if (this._pointerCamera.getClassName() === "ArcRotateCamera") { + const arcRotateCamera = this._pointerCamera; + arcRotateCamera.attachControl(arcRotateCamera.inputs ? arcRotateCamera.inputs.noPreventDefault : true, arcRotateCamera._useCtrlForPanning, arcRotateCamera._panningMouseButton); + } else { + this._pointerCamera.attachControl(this._pointerCamera.inputs ? this._pointerCamera.inputs.noPreventDefault : true); + } + } + } + /** + * Detaches the behavior from the mesh + */ + detach() { + if (this._scene) { + if (this.detachCameraControls && this._attachedToElement && this._pointerCamera && !this._pointerCamera.leftCamera) { + this._reattachCameraControls(); + this._attachedToElement = false; + } + this._scene.onPointerObservable.remove(this._pointerObserver); + } + for (const pointerId in this._virtualMeshesInfo) { + this._virtualMeshesInfo[pointerId].originMesh.dispose(); + this._virtualMeshesInfo[pointerId].dragMesh.dispose(); + } + this.onDragEndObservable.clear(); + this.onDragObservable.clear(); + this.onDragStartObservable.clear(); + } +}; -// node_modules/@babylonjs/core/Shaders/default.vertex.js -var name66 = "defaultVertexShader"; -var shader66 = `#include<__decl__defaultVertex> -#define CUSTOM_VERTEX_BEGIN -attribute vec3 position; -#ifdef NORMAL -attribute vec3 normal; -#endif -#ifdef TANGENT -attribute vec4 tangent; -#endif -#ifdef UV1 -attribute vec2 uv; -#endif -#include[2..7] -#ifdef VERTEXCOLOR -attribute vec4 color; -#endif -#include -#include -#include -#include -#include -#include[1..7] -#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse) -#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail) -#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient) -#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity) -#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive) -#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap) -#if defined(SPECULARTERM) -#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular) -#endif -#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump) -#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal) -varying vec3 vPositionW; -#ifdef NORMAL -varying vec3 vNormalW; -#endif -#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES) -varying vec4 vColor; -#endif -#include -#include -#include -#include<__decl__lightVxFragment>[0..maxSimultaneousLights] -#include -#include[0..maxSimultaneousMorphTargets] -#ifdef REFLECTIONMAP_SKYBOX -varying vec3 vPositionUVW; -#endif -#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED) -varying vec3 vDirectionW; -#endif -#include -#define CUSTOM_VERTEX_DEFINITIONS -void main(void) { -#define CUSTOM_VERTEX_MAIN_BEGIN -vec3 positionUpdated=position; -#ifdef NORMAL -vec3 normalUpdated=normal; -#endif -#ifdef TANGENT -vec4 tangentUpdated=tangent; -#endif -#ifdef UV1 -vec2 uvUpdated=uv; -#endif -#include -#include[0..maxSimultaneousMorphTargets] -#ifdef REFLECTIONMAP_SKYBOX -vPositionUVW=positionUpdated; -#endif -#define CUSTOM_VERTEX_UPDATE_POSITION -#define CUSTOM_VERTEX_UPDATE_NORMAL -#include -#if defined(PREPASS) && defined(PREPASS_VELOCITY) && !defined(BONES_VELOCITY_ENABLED) -vCurrentPosition=viewProjection*finalWorld*vec4(positionUpdated,1.0);vPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0); -#endif -#include -#include -vec4 worldPos=finalWorld*vec4(positionUpdated,1.0); -#ifdef NORMAL -mat3 normalWorld=mat3(finalWorld); -#if defined(INSTANCES) && defined(THIN_INSTANCES) -vNormalW=normalUpdated/vec3(dot(normalWorld[0],normalWorld[0]),dot(normalWorld[1],normalWorld[1]),dot(normalWorld[2],normalWorld[2]));vNormalW=normalize(normalWorld*vNormalW); -#else -#ifdef NONUNIFORMSCALING -normalWorld=transposeMat3(inverseMat3(normalWorld)); -#endif -vNormalW=normalize(normalWorld*normalUpdated); -#endif -#endif -#define CUSTOM_VERTEX_UPDATE_WORLDPOS -#ifdef MULTIVIEW -if (gl_ViewID_OVR==0u) {gl_Position=viewProjection*worldPos;} else {gl_Position=viewProjectionR*worldPos;} -#else -gl_Position=viewProjection*worldPos; -#endif -vPositionW=vec3(worldPos); -#include -#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED) -vDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0))); -#endif -#ifndef UV1 -vec2 uvUpdated=vec2(0.,0.); -#endif -#ifdef MAINUV1 -vMainUV1=uvUpdated; -#endif -#include[2..7] -#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse,_MATRIXNAME_,diffuse,_INFONAME_,DiffuseInfos.x) -#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x) -#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x) -#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x) -#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_MATRIXNAME_,emissive,_INFONAME_,EmissiveInfos.x) -#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_MATRIXNAME_,lightmap,_INFONAME_,LightmapInfos.x) -#if defined(SPECULARTERM) -#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular,_MATRIXNAME_,specular,_INFONAME_,SpecularInfos.x) -#endif -#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_MATRIXNAME_,bump,_INFONAME_,BumpInfos.x) -#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_MATRIXNAME_,decal,_INFONAME_,DecalInfos.x) -#include -#include -#include -#include[0..maxSimultaneousLights] -#include -#include -#include -#define CUSTOM_VERTEX_MAIN_END -} -`; -ShaderStore.ShadersStore[name66] = shader66; +// node_modules/@babylonjs/core/Behaviors/Meshes/sixDofDragBehavior.js +var SixDofDragBehavior = class extends BaseSixDofDragBehavior { + constructor() { + super(...arguments); + this._sceneRenderObserver = null; + this._targetPosition = new Vector3(0, 0, 0); + this._targetOrientation = new Quaternion(); + this._targetScaling = new Vector3(1, 1, 1); + this._startingPosition = new Vector3(0, 0, 0); + this._startingOrientation = new Quaternion(); + this._startingScaling = new Vector3(1, 1, 1); + this.onPositionChangedObservable = new Observable(); + this.dragDeltaRatio = 0.2; + this.rotateDraggedObject = true; + this.rotateAroundYOnly = false; + this.rotateWithMotionController = true; + this.disableMovement = false; + this.faceCameraOnDragStart = false; + } + /** + * The name of the behavior + */ + get name() { + return "SixDofDrag"; + } + /** + * Attaches the six DoF drag behavior + * In XR mode the mesh and its children will have their isNearGrabbable property set to true + * @param ownerNode The mesh that will be dragged around once attached + */ + attach(ownerNode) { + super.attach(ownerNode); + ownerNode.isNearGrabbable = true; + ownerNode.getChildMeshes().forEach((m) => { + m.isNearGrabbable = true; + }); + this._virtualTransformNode = new TransformNode("virtual_sixDof", BaseSixDofDragBehavior._virtualScene); + this._virtualTransformNode.rotationQuaternion = Quaternion.Identity(); + this._sceneRenderObserver = ownerNode.getScene().onBeforeRenderObservable.add(() => { + if (this.currentDraggingPointerIds.length === 1 && this._moving && !this.disableMovement) { + const deltaToAdd = TmpVectors.Vector3[0]; + deltaToAdd.copyFrom(this._targetPosition).subtractInPlace(ownerNode.absolutePosition).scaleInPlace(this.dragDeltaRatio); + const deltaToAddTransformed = TmpVectors.Vector3[1]; + deltaToAddTransformed.copyFrom(deltaToAdd); + if (ownerNode.parent) { + const parentRotationMatrixInverse = TmpVectors.Matrix[0]; + ownerNode.parent.absoluteRotationQuaternion.toRotationMatrix(parentRotationMatrixInverse); + parentRotationMatrixInverse.invert(); + Vector3.TransformNormalToRef(deltaToAdd, parentRotationMatrixInverse, deltaToAddTransformed); + } + ownerNode.position.addInPlace(deltaToAddTransformed); + this.onPositionChangedObservable.notifyObservers({ position: ownerNode.absolutePosition }); + if (!ownerNode.parent || ownerNode.parent.scaling && !ownerNode.parent.scaling.isNonUniformWithinEpsilon(1e-3)) { + const rotationToApply = TmpVectors.Quaternion[0]; + rotationToApply.copyFrom(this._targetOrientation); + if (ownerNode.parent) { + const parentRotationInverse = TmpVectors.Quaternion[0]; + parentRotationInverse.copyFrom(ownerNode.parent.absoluteRotationQuaternion); + parentRotationInverse.invertInPlace(); + parentRotationInverse.multiplyToRef(this._targetOrientation, rotationToApply); + } + Quaternion.SlerpToRef(ownerNode.rotationQuaternion, rotationToApply, this.dragDeltaRatio, ownerNode.rotationQuaternion); + } + } + }); + } + _getPositionOffsetAround(transformationLocalOrigin, scaling, rotation) { + const translationMatrix = TmpVectors.Matrix[0]; + const translationMatrixInv = TmpVectors.Matrix[1]; + const rotationMatrix = TmpVectors.Matrix[2]; + const scaleMatrix = TmpVectors.Matrix[3]; + const finalMatrix = TmpVectors.Matrix[4]; + Matrix.TranslationToRef(transformationLocalOrigin.x, transformationLocalOrigin.y, transformationLocalOrigin.z, translationMatrix); + Matrix.TranslationToRef(-transformationLocalOrigin.x, -transformationLocalOrigin.y, -transformationLocalOrigin.z, translationMatrixInv); + Matrix.FromQuaternionToRef(rotation, rotationMatrix); + Matrix.ScalingToRef(scaling, scaling, scaling, scaleMatrix); + translationMatrixInv.multiplyToRef(rotationMatrix, finalMatrix); + finalMatrix.multiplyToRef(scaleMatrix, finalMatrix); + finalMatrix.multiplyToRef(translationMatrix, finalMatrix); + return finalMatrix.getTranslation(); + } + _onePointerPositionUpdated(worldDeltaPosition, worldDeltaRotation) { + const pointerDelta = TmpVectors.Vector3[0]; + pointerDelta.setAll(0); + if (this._dragging === this._dragType.DRAG) { + if (this.rotateDraggedObject) { + if (this.rotateAroundYOnly) { + Quaternion.RotationYawPitchRollToRef(worldDeltaRotation.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]); + } else { + TmpVectors.Quaternion[0].copyFrom(worldDeltaRotation); + } + TmpVectors.Quaternion[0].multiplyToRef(this._startingOrientation, this._targetOrientation); + } + } else if (this._dragging === this._dragType.NEAR_DRAG || this._dragging === this._dragType.DRAG_WITH_CONTROLLER && this.rotateWithMotionController) { + worldDeltaRotation.multiplyToRef(this._startingOrientation, this._targetOrientation); + } + this._targetPosition.copyFrom(this._startingPosition).addInPlace(worldDeltaPosition); + } + _twoPointersPositionUpdated() { + const startingPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].startingPosition; + const startingPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].startingPosition; + const startingCenter = TmpVectors.Vector3[0]; + startingPosition0.addToRef(startingPosition1, startingCenter); + startingCenter.scaleInPlace(0.5); + const startingVector = TmpVectors.Vector3[1]; + startingPosition1.subtractToRef(startingPosition0, startingVector); + const currentPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].dragMesh.absolutePosition; + const currentPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].dragMesh.absolutePosition; + const currentCenter = TmpVectors.Vector3[2]; + currentPosition0.addToRef(currentPosition1, currentCenter); + currentCenter.scaleInPlace(0.5); + const currentVector = TmpVectors.Vector3[3]; + currentPosition1.subtractToRef(currentPosition0, currentVector); + const scaling = currentVector.length() / startingVector.length(); + const translation = currentCenter.subtract(startingCenter); + const rotationQuaternion = Quaternion.FromEulerAngles(0, Vector3.GetAngleBetweenVectorsOnPlane(startingVector.normalize(), currentVector.normalize(), Vector3.UpReadOnly), 0); + const oldParent = this._ownerNode.parent; + this._ownerNode.setParent(null); + const positionOffset = this._getPositionOffsetAround(startingCenter.subtract(this._virtualTransformNode.getAbsolutePivotPoint()), scaling, rotationQuaternion); + this._virtualTransformNode.rotationQuaternion.multiplyToRef(rotationQuaternion, this._ownerNode.rotationQuaternion); + this._virtualTransformNode.scaling.scaleToRef(scaling, this._ownerNode.scaling); + this._virtualTransformNode.position.addToRef(translation.addInPlace(positionOffset), this._ownerNode.position); + this.onPositionChangedObservable.notifyObservers({ position: this._ownerNode.position }); + this._ownerNode.setParent(oldParent); + } + _targetDragStart() { + const pointerCount = this.currentDraggingPointerIds.length; + if (!this._ownerNode.rotationQuaternion) { + this._ownerNode.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._ownerNode.rotation.y, this._ownerNode.rotation.x, this._ownerNode.rotation.z); + } + const worldPivot = this._ownerNode.getAbsolutePivotPoint(); + if (pointerCount === 1) { + this._targetPosition.copyFrom(this._ownerNode.absolutePosition); + this._targetOrientation.copyFrom(this._ownerNode.absoluteRotationQuaternion); + this._targetScaling.copyFrom(this._ownerNode.absoluteScaling); + if (this.faceCameraOnDragStart && this._scene.activeCamera) { + const toCamera = TmpVectors.Vector3[0]; + this._scene.activeCamera.position.subtractToRef(worldPivot, toCamera); + toCamera.normalize(); + const quat = TmpVectors.Quaternion[0]; + if (this._scene.useRightHandedSystem) { + Quaternion.FromLookDirectionRHToRef(toCamera, new Vector3(0, 1, 0), quat); + } else { + Quaternion.FromLookDirectionLHToRef(toCamera, new Vector3(0, 1, 0), quat); + } + quat.normalize(); + Quaternion.RotationYawPitchRollToRef(quat.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]); + this._targetOrientation.copyFrom(TmpVectors.Quaternion[0]); + } + this._startingPosition.copyFrom(this._targetPosition); + this._startingOrientation.copyFrom(this._targetOrientation); + this._startingScaling.copyFrom(this._targetScaling); + } else if (pointerCount === 2) { + this._virtualTransformNode.setPivotPoint(new Vector3(0, 0, 0), Space.LOCAL); + this._virtualTransformNode.position.copyFrom(this._ownerNode.absolutePosition); + this._virtualTransformNode.scaling.copyFrom(this._ownerNode.absoluteScaling); + this._virtualTransformNode.rotationQuaternion.copyFrom(this._ownerNode.absoluteRotationQuaternion); + this._virtualTransformNode.setPivotPoint(worldPivot, Space.WORLD); + this._resetVirtualMeshesPosition(); + } + } + _targetDrag(worldDeltaPosition, worldDeltaRotation) { + if (this.currentDraggingPointerIds.length === 1) { + this._onePointerPositionUpdated(worldDeltaPosition, worldDeltaRotation); + } else if (this.currentDraggingPointerIds.length === 2) { + this._twoPointersPositionUpdated(); + } + } + _targetDragEnd() { + if (this.currentDraggingPointerIds.length === 1) { + this._resetVirtualMeshesPosition(); + const previousFaceCameraFlag = this.faceCameraOnDragStart; + this.faceCameraOnDragStart = false; + this._targetDragStart(); + this.faceCameraOnDragStart = previousFaceCameraFlag; + } + } + /** + * Detaches the behavior from the mesh + */ + detach() { + super.detach(); + if (this._ownerNode) { + this._ownerNode.getScene().onBeforeRenderObservable.remove(this._sceneRenderObserver); + } + if (this._virtualTransformNode) { + this._virtualTransformNode.dispose(); + } + } +}; -// node_modules/@babylonjs/core/Materials/standardMaterial.js -var onCreatedEffectParameters2 = { effect: null, subMesh: null }; -var StandardMaterialDefines = class extends MaterialDefines { +// node_modules/@babylonjs/core/Behaviors/Meshes/surfaceMagnetismBehavior.js +var SurfaceMagnetismBehavior = class { + constructor() { + this._attachPointLocalOffset = new Vector3(); + this._workingPosition = new Vector3(); + this._workingQuaternion = new Quaternion(); + this._lastTick = -1; + this._hit = false; + this.hitNormalOffset = 0.05; + this.meshes = []; + this.interpolatePose = true; + this.lerpTime = 250; + this.keepOrientationVertical = true; + this.enabled = true; + this.maxStickingDistance = 0.8; + } /** - * Initializes the Standard Material defines. - * @param externalProperties The external properties + * Name of the behavior */ - constructor(externalProperties) { - super(externalProperties); - this.MAINUV1 = false; - this.MAINUV2 = false; - this.MAINUV3 = false; - this.MAINUV4 = false; - this.MAINUV5 = false; - this.MAINUV6 = false; - this.DIFFUSE = false; - this.DIFFUSEDIRECTUV = 0; - this.BAKED_VERTEX_ANIMATION_TEXTURE = false; - this.AMBIENT = false; - this.AMBIENTDIRECTUV = 0; - this.OPACITY = false; - this.OPACITYDIRECTUV = 0; - this.OPACITYRGB = false; - this.REFLECTION = false; - this.EMISSIVE = false; - this.EMISSIVEDIRECTUV = 0; - this.SPECULAR = false; - this.SPECULARDIRECTUV = 0; - this.BUMP = false; - this.BUMPDIRECTUV = 0; - this.PARALLAX = false; - this.PARALLAX_RHS = false; - this.PARALLAXOCCLUSION = false; - this.SPECULAROVERALPHA = false; - this.CLIPPLANE = false; - this.CLIPPLANE2 = false; - this.CLIPPLANE3 = false; - this.CLIPPLANE4 = false; - this.CLIPPLANE5 = false; - this.CLIPPLANE6 = false; - this.ALPHATEST = false; - this.DEPTHPREPASS = false; - this.ALPHAFROMDIFFUSE = false; - this.POINTSIZE = false; - this.FOG = false; - this.SPECULARTERM = false; - this.DIFFUSEFRESNEL = false; - this.OPACITYFRESNEL = false; - this.REFLECTIONFRESNEL = false; - this.REFRACTIONFRESNEL = false; - this.EMISSIVEFRESNEL = false; - this.FRESNEL = false; - this.NORMAL = false; - this.TANGENT = false; - this.UV1 = false; - this.UV2 = false; - this.UV3 = false; - this.UV4 = false; - this.UV5 = false; - this.UV6 = false; - this.VERTEXCOLOR = false; - this.VERTEXALPHA = false; - this.NUM_BONE_INFLUENCERS = 0; - this.BonesPerMesh = 0; - this.BONETEXTURE = false; - this.BONES_VELOCITY_ENABLED = false; - this.INSTANCES = false; - this.THIN_INSTANCES = false; - this.INSTANCESCOLOR = false; - this.GLOSSINESS = false; - this.ROUGHNESS = false; - this.EMISSIVEASILLUMINATION = false; - this.LINKEMISSIVEWITHDIFFUSE = false; - this.REFLECTIONFRESNELFROMSPECULAR = false; - this.LIGHTMAP = false; - this.LIGHTMAPDIRECTUV = 0; - this.OBJECTSPACE_NORMALMAP = false; - this.USELIGHTMAPASSHADOWMAP = false; - this.REFLECTIONMAP_3D = false; - this.REFLECTIONMAP_SPHERICAL = false; - this.REFLECTIONMAP_PLANAR = false; - this.REFLECTIONMAP_CUBIC = false; - this.USE_LOCAL_REFLECTIONMAP_CUBIC = false; - this.USE_LOCAL_REFRACTIONMAP_CUBIC = false; - this.REFLECTIONMAP_PROJECTION = false; - this.REFLECTIONMAP_SKYBOX = false; - this.REFLECTIONMAP_EXPLICIT = false; - this.REFLECTIONMAP_EQUIRECTANGULAR = false; - this.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = false; - this.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = false; - this.REFLECTIONMAP_OPPOSITEZ = false; - this.INVERTCUBICMAP = false; - this.LOGARITHMICDEPTH = false; - this.REFRACTION = false; - this.REFRACTIONMAP_3D = false; - this.REFLECTIONOVERALPHA = false; - this.TWOSIDEDLIGHTING = false; - this.SHADOWFLOAT = false; - this.MORPHTARGETS = false; - this.MORPHTARGETS_NORMAL = false; - this.MORPHTARGETS_TANGENT = false; - this.MORPHTARGETS_UV = false; - this.NUM_MORPH_INFLUENCERS = 0; - this.MORPHTARGETS_TEXTURE = false; - this.NONUNIFORMSCALING = false; - this.PREMULTIPLYALPHA = false; - this.ALPHATEST_AFTERALLALPHACOMPUTATIONS = false; - this.ALPHABLEND = true; - this.PREPASS = false; - this.PREPASS_IRRADIANCE = false; - this.PREPASS_IRRADIANCE_INDEX = -1; - this.PREPASS_ALBEDO_SQRT = false; - this.PREPASS_ALBEDO_SQRT_INDEX = -1; - this.PREPASS_DEPTH = false; - this.PREPASS_DEPTH_INDEX = -1; - this.PREPASS_NORMAL = false; - this.PREPASS_NORMAL_INDEX = -1; - this.PREPASS_NORMAL_WORLDSPACE = false; - this.PREPASS_POSITION = false; - this.PREPASS_POSITION_INDEX = -1; - this.PREPASS_VELOCITY = false; - this.PREPASS_VELOCITY_INDEX = -1; - this.PREPASS_REFLECTIVITY = false; - this.PREPASS_REFLECTIVITY_INDEX = -1; - this.SCENE_MRT_COUNT = 0; - this.RGBDLIGHTMAP = false; - this.RGBDREFLECTION = false; - this.RGBDREFRACTION = false; - this.IMAGEPROCESSING = false; - this.VIGNETTE = false; - this.VIGNETTEBLENDMODEMULTIPLY = false; - this.VIGNETTEBLENDMODEOPAQUE = false; - this.TONEMAPPING = false; - this.TONEMAPPING_ACES = false; - this.CONTRAST = false; - this.COLORCURVES = false; - this.COLORGRADING = false; - this.COLORGRADING3D = false; - this.SAMPLER3DGREENDEPTH = false; - this.SAMPLER3DBGRMAP = false; - this.DITHER = false; - this.IMAGEPROCESSINGPOSTPROCESS = false; - this.SKIPFINALCOLORCLAMP = false; - this.MULTIVIEW = false; - this.ORDER_INDEPENDENT_TRANSPARENCY = false; - this.ORDER_INDEPENDENT_TRANSPARENCY_16BITS = false; - this.CAMERA_ORTHOGRAPHIC = false; - this.CAMERA_PERSPECTIVE = false; - this.IS_REFLECTION_LINEAR = false; - this.IS_REFRACTION_LINEAR = false; - this.EXPOSURE = false; - this.DECAL_AFTER_DETAIL = false; - this.rebuild(); + get name() { + return "SurfaceMagnetism"; } - setReflectionMode(modeToEnable) { - const modes = [ - "REFLECTIONMAP_CUBIC", - "REFLECTIONMAP_EXPLICIT", - "REFLECTIONMAP_PLANAR", - "REFLECTIONMAP_PROJECTION", - "REFLECTIONMAP_PROJECTION", - "REFLECTIONMAP_SKYBOX", - "REFLECTIONMAP_SPHERICAL", - "REFLECTIONMAP_EQUIRECTANGULAR", - "REFLECTIONMAP_EQUIRECTANGULAR_FIXED", - "REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED" - ]; - for (const mode of modes) { - this[mode] = mode === modeToEnable; + /** + * Function called when the behavior needs to be initialized (after attaching it to a target) + */ + init() { + } + /** + * Attaches the behavior to a transform node + * @param target defines the target where the behavior is attached to + * @param scene the scene + */ + attach(target, scene) { + this._attachedMesh = target; + this._scene = scene || target.getScene(); + if (!this._attachedMesh.rotationQuaternion) { + this._attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._attachedMesh.rotation.y, this._attachedMesh.rotation.x, this._attachedMesh.rotation.z); } + this.updateAttachPoint(); + this._workingPosition.copyFrom(this._attachedMesh.position); + this._workingQuaternion.copyFrom(this._attachedMesh.rotationQuaternion); + this._addObservables(); } -}; -var StandardMaterial = class _StandardMaterial extends PushMaterial { /** - * Gets the image processing configuration used either in this material. + * Detaches the behavior */ - get imageProcessingConfiguration() { - return this._imageProcessingConfiguration; + detach() { + this._attachedMesh = null; + this._removeObservables(); + } + _getTargetPose(pickingInfo) { + if (!this._attachedMesh) { + return null; + } + if (pickingInfo && pickingInfo.hit) { + const pickedNormal = pickingInfo.getNormal(true, true); + const pickedPoint = pickingInfo.pickedPoint; + if (!pickedNormal || !pickedPoint) { + return null; + } + pickedNormal.normalize(); + const worldTarget = TmpVectors.Vector3[0]; + worldTarget.copyFrom(pickedNormal); + worldTarget.scaleInPlace(this.hitNormalOffset); + worldTarget.addInPlace(pickedPoint); + if (this._attachedMesh.parent) { + TmpVectors.Matrix[0].copyFrom(this._attachedMesh.parent.getWorldMatrix()).invert(); + Vector3.TransformNormalToRef(worldTarget, TmpVectors.Matrix[0], worldTarget); + } + return { + position: worldTarget, + quaternion: Quaternion.RotationYawPitchRoll(-Math.atan2(pickedNormal.x, -pickedNormal.z), this.keepOrientationVertical ? 0 : Math.atan2(pickedNormal.y, Math.sqrt(pickedNormal.z * pickedNormal.z + pickedNormal.x * pickedNormal.x)), 0) + }; + } + return null; } /** - * Sets the Default image processing configuration used either in the this material. - * - * If sets to null, the scene one is in use. + * Updates the attach point with the current geometry extents of the attached mesh */ - set imageProcessingConfiguration(value) { - this._attachImageProcessingConfiguration(value); - this._markAllSubMeshesAsTexturesDirty(); + updateAttachPoint() { + this._getAttachPointOffsetToRef(this._attachPointLocalOffset); } /** - * Attaches a new image processing configuration to the Standard Material. - * @param configuration + * Finds the intersection point of the given ray onto the meshes and updates the target. + * Transformation will be interpolated according to `interpolatePose` and `lerpTime` properties. + * If no mesh of `meshes` are hit, this does nothing. + * @param pickInfo The input pickingInfo that will be used to intersect the meshes + * @returns a boolean indicating if we found a hit to stick to */ - _attachImageProcessingConfiguration(configuration) { - if (configuration === this._imageProcessingConfiguration) { - return; + findAndUpdateTarget(pickInfo) { + this._hit = false; + if (!pickInfo.ray) { + return false; } - if (this._imageProcessingConfiguration && this._imageProcessingObserver) { - this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver); + const subPicking = pickInfo.ray.intersectsMeshes(this.meshes)[0]; + if (this._attachedMesh && subPicking && subPicking.hit && subPicking.pickedMesh) { + const pose = this._getTargetPose(subPicking); + if (pose && Vector3.Distance(this._attachedMesh.position, pose.position) < this.maxStickingDistance) { + this._workingPosition.copyFrom(pose.position); + this._workingQuaternion.copyFrom(pose.quaternion); + this._hit = true; + } } - if (!configuration) { - this._imageProcessingConfiguration = this.getScene().imageProcessingConfiguration; - } else { - this._imageProcessingConfiguration = configuration; + return this._hit; + } + _getAttachPointOffsetToRef(ref) { + if (!this._attachedMesh) { + ref.setAll(0); + return; } - if (this._imageProcessingConfiguration) { - this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add(() => { - this._markAllSubMeshesAsImageProcessingDirty(); - }); + const storedQuat = TmpVectors.Quaternion[0]; + storedQuat.copyFrom(this._attachedMesh.rotationQuaternion); + this._attachedMesh.rotationQuaternion.copyFromFloats(0, 0, 0, 1); + this._attachedMesh.computeWorldMatrix(); + const boundingMinMax = this._attachedMesh.getHierarchyBoundingVectors(); + const center = TmpVectors.Vector3[0]; + boundingMinMax.max.addToRef(boundingMinMax.min, center); + center.scaleInPlace(0.5); + center.z = boundingMinMax.max.z; + const invWorld = TmpVectors.Matrix[0]; + this._attachedMesh.getWorldMatrix().invertToRef(invWorld); + Vector3.TransformCoordinatesToRef(center, invWorld, ref); + this._attachedMesh.rotationQuaternion.copyFrom(storedQuat); + } + _updateTransformToGoal(elapsed) { + if (!this._attachedMesh || !this._hit) { + return; + } + const oldParent = this._attachedMesh.parent; + this._attachedMesh.setParent(null); + const worldOffset = TmpVectors.Vector3[0]; + Vector3.TransformNormalToRef(this._attachPointLocalOffset, this._attachedMesh.getWorldMatrix(), worldOffset); + if (!this.interpolatePose) { + this._attachedMesh.position.copyFrom(this._workingPosition).subtractInPlace(worldOffset); + this._attachedMesh.rotationQuaternion.copyFrom(this._workingQuaternion); + return; } + const interpolatedPosition = new Vector3(); + Vector3.SmoothToRef(this._attachedMesh.position, this._workingPosition, elapsed, this.lerpTime, interpolatedPosition); + this._attachedMesh.position.copyFrom(interpolatedPosition); + const currentRotation = new Quaternion(); + currentRotation.copyFrom(this._attachedMesh.rotationQuaternion); + Quaternion.SmoothToRef(currentRotation, this._workingQuaternion, elapsed, this.lerpTime, this._attachedMesh.rotationQuaternion); + this._attachedMesh.setParent(oldParent); + } + _addObservables() { + this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => { + if (this.enabled && pointerInfo.type == PointerEventTypes.POINTERMOVE && pointerInfo.pickInfo) { + this.findAndUpdateTarget(pointerInfo.pickInfo); + } + }); + this._lastTick = Date.now(); + this._onBeforeRender = this._scene.onBeforeRenderObservable.add(() => { + const tick = Date.now(); + this._updateTransformToGoal(tick - this._lastTick); + this._lastTick = tick; + }); + } + _removeObservables() { + this._scene.onPointerObservable.remove(this._pointerObserver); + this._scene.onBeforeRenderObservable.remove(this._onBeforeRender); + this._pointerObserver = null; + this._onBeforeRender = null; } +}; + +// node_modules/@babylonjs/core/Lights/light.js +var Light = class _Light extends Node { /** - * Can this material render to prepass + * Defines how far from the source the light is impacting in scene units. + * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff. */ - get isPrePassCapable() { - return !this.disableDepthWrite; + get range() { + return this._range; } /** - * Gets whether the color curves effect is enabled. + * Defines how far from the source the light is impacting in scene units. + * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff. */ - get cameraColorCurvesEnabled() { - return this.imageProcessingConfiguration.colorCurvesEnabled; + set range(value) { + this._range = value; + this._inverseSquaredRange = 1 / (this.range * this.range); } /** - * Sets whether the color curves effect is enabled. + * Gets the photometric scale used to interpret the intensity. + * This is only relevant with PBR Materials where the light intensity can be defined in a physical way. */ - set cameraColorCurvesEnabled(value) { - this.imageProcessingConfiguration.colorCurvesEnabled = value; + get intensityMode() { + return this._intensityMode; } /** - * Gets whether the color grading effect is enabled. + * Sets the photometric scale used to interpret the intensity. + * This is only relevant with PBR Materials where the light intensity can be defined in a physical way. */ - get cameraColorGradingEnabled() { - return this.imageProcessingConfiguration.colorGradingEnabled; + set intensityMode(value) { + this._intensityMode = value; + this._computePhotometricScale(); } /** - * Gets whether the color grading effect is enabled. + * Gets the light radius used by PBR Materials to simulate soft area lights. */ - set cameraColorGradingEnabled(value) { - this.imageProcessingConfiguration.colorGradingEnabled = value; + get radius() { + return this._radius; } /** - * Gets whether tonemapping is enabled or not. + * sets the light radius used by PBR Materials to simulate soft area lights. */ - get cameraToneMappingEnabled() { - return this._imageProcessingConfiguration.toneMappingEnabled; + set radius(value) { + this._radius = value; + this._computePhotometricScale(); } /** - * Sets whether tonemapping is enabled or not + * Gets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching + * the current shadow generator. */ - set cameraToneMappingEnabled(value) { - this._imageProcessingConfiguration.toneMappingEnabled = value; + get shadowEnabled() { + return this._shadowEnabled; } /** - * The camera exposure used on this material. - * This property is here and not in the camera to allow controlling exposure without full screen post process. - * This corresponds to a photographic exposure. + * Sets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching + * the current shadow generator. */ - get cameraExposure() { - return this._imageProcessingConfiguration.exposure; + set shadowEnabled(value) { + if (this._shadowEnabled === value) { + return; + } + this._shadowEnabled = value; + this._markMeshesAsLightDirty(); } /** - * The camera exposure used on this material. - * This property is here and not in the camera to allow controlling exposure without full screen post process. - * This corresponds to a photographic exposure. + * Gets the only meshes impacted by this light. */ - set cameraExposure(value) { - this._imageProcessingConfiguration.exposure = value; + get includedOnlyMeshes() { + return this._includedOnlyMeshes; + } + /** + * Sets the only meshes impacted by this light. + */ + set includedOnlyMeshes(value) { + this._includedOnlyMeshes = value; + this._hookArrayForIncludedOnly(value); + } + /** + * Gets the meshes not impacted by this light. + */ + get excludedMeshes() { + return this._excludedMeshes; + } + /** + * Sets the meshes not impacted by this light. + */ + set excludedMeshes(value) { + this._excludedMeshes = value; + this._hookArrayForExcluded(value); + } + /** + * Gets the layer id use to find what meshes are not impacted by the light. + * Inactive if 0 + */ + get excludeWithLayerMask() { + return this._excludeWithLayerMask; } /** - * Gets The camera contrast used on this material. + * Sets the layer id use to find what meshes are not impacted by the light. + * Inactive if 0 */ - get cameraContrast() { - return this._imageProcessingConfiguration.contrast; + set excludeWithLayerMask(value) { + this._excludeWithLayerMask = value; + this._resyncMeshes(); } /** - * Sets The camera contrast used on this material. + * Gets the layer id use to find what meshes are impacted by the light. + * Inactive if 0 */ - set cameraContrast(value) { - this._imageProcessingConfiguration.contrast = value; + get includeOnlyWithLayerMask() { + return this._includeOnlyWithLayerMask; } /** - * Gets the Color Grading 2D Lookup Texture. + * Sets the layer id use to find what meshes are impacted by the light. + * Inactive if 0 */ - get cameraColorGradingTexture() { - return this._imageProcessingConfiguration.colorGradingTexture; + set includeOnlyWithLayerMask(value) { + this._includeOnlyWithLayerMask = value; + this._resyncMeshes(); } /** - * Sets the Color Grading 2D Lookup Texture. + * Gets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x) */ - set cameraColorGradingTexture(value) { - this._imageProcessingConfiguration.colorGradingTexture = value; + get lightmapMode() { + return this._lightmapMode; } /** - * The color grading curves provide additional color adjustmnent that is applied after any color grading transform (3D LUT). - * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects. - * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image; - * corresponding to low luminance, medium luminance, and high luminance areas respectively. + * Sets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x) */ - get cameraColorCurves() { - return this._imageProcessingConfiguration.colorCurves; + set lightmapMode(value) { + if (this._lightmapMode === value) { + return; + } + this._lightmapMode = value; + this._markMeshesAsLightDirty(); } /** - * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT). - * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects. - * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image; - * corresponding to low luminance, medium luminance, and high luminance areas respectively. + * Returns the view matrix. + * @param _faceIndex The index of the face for which we want to extract the view matrix. Only used for point light types. + * @returns The view matrix. Can be null, if a view matrix cannot be defined for the type of light considered (as for a hemispherical light, for example). */ - set cameraColorCurves(value) { - this._imageProcessingConfiguration.colorCurves = value; + getViewMatrix(_faceIndex) { + return null; } /** - * Can this material render to several textures at once + * Returns the projection matrix. + * Note that viewMatrix and renderList are optional and are only used by lights that calculate the projection matrix from a list of meshes (e.g. directional lights with automatic extents calculation). + * @param _viewMatrix The view transform matrix of the light (optional). + * @param _renderList The list of meshes to take into account when calculating the projection matrix (optional). + * @returns The projection matrix. Can be null, if a projection matrix cannot be defined for the type of light considered (as for a hemispherical light, for example). */ - get canRenderToMRT() { - return true; + getProjectionMatrix(_viewMatrix, _renderList) { + return null; } /** - * Instantiates a new standard material. - * This is the default material used in Babylon. It is the best trade off between quality - * and performances. - * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction - * @param name Define the name of the material in the scene - * @param scene Define the scene the material belong to + * Creates a Light object in the scene. + * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction + * @param name The friendly name of the light + * @param scene The scene the light belongs too */ constructor(name69, scene) { super(name69, scene); - this._diffuseTexture = null; - this._ambientTexture = null; - this._opacityTexture = null; - this._reflectionTexture = null; - this._emissiveTexture = null; - this._specularTexture = null; - this._bumpTexture = null; - this._lightmapTexture = null; - this._refractionTexture = null; - this.ambientColor = new Color3(0, 0, 0); - this.diffuseColor = new Color3(1, 1, 1); - this.specularColor = new Color3(1, 1, 1); - this.emissiveColor = new Color3(0, 0, 0); - this.specularPower = 64; - this._useAlphaFromDiffuseTexture = false; - this._useEmissiveAsIllumination = false; - this._linkEmissiveWithDiffuse = false; - this._useSpecularOverAlpha = false; - this._useReflectionOverAlpha = false; - this._disableLighting = false; - this._useObjectSpaceNormalMap = false; - this._useParallax = false; - this._useParallaxOcclusion = false; - this.parallaxScaleBias = 0.05; - this._roughness = 0; - this.indexOfRefraction = 0.98; - this.invertRefractionY = true; - this.alphaCutOff = 0.4; - this._useLightmapAsShadowmap = false; - this._useReflectionFresnelFromSpecular = false; - this._useGlossinessFromSpecularMapAlpha = false; - this._maxSimultaneousLights = 4; - this._invertNormalMapX = false; - this._invertNormalMapY = false; - this._twoSidedLighting = false; - this._applyDecalMapAfterDetailMap = false; - this._renderTargets = new SmartArray(16); - this._worldViewProjectionMatrix = Matrix.Zero(); - this._globalAmbientColor = new Color3(0, 0, 0); - this._cacheHasRenderTargetTextures = false; - this.detailMap = new DetailMapConfiguration(this); - this._attachImageProcessingConfiguration(null); - this.prePassConfiguration = new PrePassConfiguration(); - this.getRenderTargetTextures = () => { - this._renderTargets.reset(); - if (_StandardMaterial.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget) { - this._renderTargets.push(this._reflectionTexture); - } - if (_StandardMaterial.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget) { - this._renderTargets.push(this._refractionTexture); - } - this._eventInfo.renderTargets = this._renderTargets; - this._callbackPluginEventFillRenderTargetTextures(this._eventInfo); - return this._renderTargets; - }; + this.diffuse = new Color3(1, 1, 1); + this.specular = new Color3(1, 1, 1); + this.falloffType = _Light.FALLOFF_DEFAULT; + this.intensity = 1; + this._range = Number.MAX_VALUE; + this._inverseSquaredRange = 0; + this._photometricScale = 1; + this._intensityMode = _Light.INTENSITYMODE_AUTOMATIC; + this._radius = 1e-5; + this.renderPriority = 0; + this._shadowEnabled = true; + this._excludeWithLayerMask = 0; + this._includeOnlyWithLayerMask = 0; + this._lightmapMode = 0; + this._shadowGenerators = null; + this._excludedMeshesIds = new Array(); + this._includedOnlyMeshesIds = new Array(); + this._isLight = true; + this.getScene().addLight(this); + this._uniformBuffer = new UniformBuffer(this.getScene().getEngine(), void 0, void 0, name69); + this._buildUniformLayout(); + this.includedOnlyMeshes = []; + this.excludedMeshes = []; + this._resyncMeshes(); } /** - * Gets a boolean indicating that current material needs to register RTT + * Sets the passed Effect "effect" with the Light textures. + * @param effect The effect to update + * @param lightIndex The index of the light in the effect to update + * @returns The light */ - get hasRenderTargetTextures() { - if (_StandardMaterial.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget) { - return true; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + transferTexturesToEffect(effect, lightIndex) { + return this; + } + /** + * Binds the lights information from the scene to the effect for the given mesh. + * @param lightIndex Light index + * @param scene The scene where the light belongs to + * @param effect The effect we are binding the data to + * @param useSpecular Defines if specular is supported + * @param receiveShadows Defines if the effect (mesh) we bind the light for receives shadows + */ + _bindLight(lightIndex, scene, effect, useSpecular, receiveShadows = true) { + const iAsString = lightIndex.toString(); + let needUpdate = false; + this._uniformBuffer.bindToEffect(effect, "Light" + iAsString); + if (this._renderId !== scene.getRenderId() || this._lastUseSpecular !== useSpecular || !this._uniformBuffer.useUbo) { + this._renderId = scene.getRenderId(); + this._lastUseSpecular = useSpecular; + const scaledIntensity = this.getScaledIntensity(); + this.transferToEffect(effect, iAsString); + this.diffuse.scaleToRef(scaledIntensity, TmpColors.Color3[0]); + this._uniformBuffer.updateColor4("vLightDiffuse", TmpColors.Color3[0], this.range, iAsString); + if (useSpecular) { + this.specular.scaleToRef(scaledIntensity, TmpColors.Color3[1]); + this._uniformBuffer.updateColor4("vLightSpecular", TmpColors.Color3[1], this.radius, iAsString); + } + needUpdate = true; } - if (_StandardMaterial.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget) { - return true; + this.transferTexturesToEffect(effect, iAsString); + if (scene.shadowsEnabled && this.shadowEnabled && receiveShadows) { + const shadowGenerator = this.getShadowGenerator(scene.activeCamera) ?? this.getShadowGenerator(); + if (shadowGenerator) { + shadowGenerator.bindShadowLight(iAsString, effect); + needUpdate = true; + } + } + if (needUpdate) { + this._uniformBuffer.update(); + } else { + this._uniformBuffer.bindUniformBuffer(); } - return this._cacheHasRenderTargetTextures; } /** - * Gets the current class name of the material e.g. "StandardMaterial" - * Mainly use in serialization. + * Returns the string "Light". * @returns the class name */ getClassName() { - return "StandardMaterial"; + return "Light"; } /** - * Specifies if the material will require alpha blending - * @returns a boolean specifying if alpha blending is needed + * Converts the light information to a readable string for debug purpose. + * @param fullDetails Supports for multiple levels of logging within scene loading + * @returns the human readable light info */ - needAlphaBlending() { - if (this._disableAlphaBlending) { - return false; + toString(fullDetails) { + let ret = "Name: " + this.name; + ret += ", type: " + ["Point", "Directional", "Spot", "Hemispheric"][this.getTypeID()]; + if (this.animations) { + for (let i = 0; i < this.animations.length; i++) { + ret += ", animation[0]: " + this.animations[i].toString(fullDetails); + } + } + return ret; + } + /** @internal */ + _syncParentEnabledState() { + super._syncParentEnabledState(); + if (!this.isDisposed()) { + this._resyncMeshes(); } - return this.alpha < 1 || this._opacityTexture != null || this._shouldUseAlphaFromDiffuseTexture() || this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled; } /** - * Specifies if this material should be rendered in alpha test mode - * @returns a boolean specifying if an alpha test is needed. + * Set the enabled state of this node. + * @param value - the new enabled state */ - needAlphaTesting() { - if (this._forceAlphaTest) { - return true; - } - return this._hasAlphaChannel() && (this._transparencyMode == null || this._transparencyMode === Material.MATERIAL_ALPHATEST); + setEnabled(value) { + super.setEnabled(value); + this._resyncMeshes(); } /** - * @returns whether or not the alpha value of the diffuse texture should be used for alpha blending. + * Returns the Light associated shadow generator if any. + * @param camera Camera for which the shadow generator should be retrieved (default: null). If null, retrieves the default shadow generator + * @returns the associated shadow generator. */ - _shouldUseAlphaFromDiffuseTexture() { - return this._diffuseTexture != null && this._diffuseTexture.hasAlpha && this._useAlphaFromDiffuseTexture && this._transparencyMode !== Material.MATERIAL_OPAQUE; + getShadowGenerator(camera = null) { + if (this._shadowGenerators === null) { + return null; + } + return this._shadowGenerators.get(camera) ?? null; } /** - * @returns whether or not there is a usable alpha channel for transparency. + * Returns all the shadow generators associated to this light + * @returns */ - _hasAlphaChannel() { - return this._diffuseTexture != null && this._diffuseTexture.hasAlpha || this._opacityTexture != null; + getShadowGenerators() { + return this._shadowGenerators; } /** - * Get the texture used for alpha test purpose. - * @returns the diffuse texture in case of the standard material. + * Returns a Vector3, the absolute light position in the World. + * @returns the world space position of the light */ - getAlphaTestTexture() { - return this._diffuseTexture; + getAbsolutePosition() { + return Vector3.Zero(); } /** - * Get if the submesh is ready to be used and all its information available. - * Child classes can use it to update shaders - * @param mesh defines the mesh to check - * @param subMesh defines which submesh to check - * @param useInstances specifies that instances should be used - * @returns a boolean indicating that the submesh is ready or not + * Specifies if the light will affect the passed mesh. + * @param mesh The mesh to test against the light + * @returns true the mesh is affected otherwise, false. */ - isReadyForSubMesh(mesh, subMesh, useInstances = false) { - if (!this._uniformBufferLayoutBuilt) { - this.buildUniformLayout(); + canAffectMesh(mesh) { + if (!mesh) { + return true; } - const drawWrapper = subMesh._drawWrapper; - if (drawWrapper.effect && this.isFrozen) { - if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) { - return true; - } + if (this.includedOnlyMeshes && this.includedOnlyMeshes.length > 0 && this.includedOnlyMeshes.indexOf(mesh) === -1) { + return false; } - if (!subMesh.materialDefines) { - this._callbackPluginEventGeneric(MaterialPluginEvent.GetDefineNames, this._eventInfo); - subMesh.materialDefines = new StandardMaterialDefines(this._eventInfo.defineNames); + if (this.excludedMeshes && this.excludedMeshes.length > 0 && this.excludedMeshes.indexOf(mesh) !== -1) { + return false; } - const scene = this.getScene(); - const defines = subMesh.materialDefines; - if (this._isReadyForSubMesh(subMesh)) { - return true; + if (this.includeOnlyWithLayerMask !== 0 && (this.includeOnlyWithLayerMask & mesh.layerMask) === 0) { + return false; } - const engine = scene.getEngine(); - defines._needNormals = PrepareDefinesForLights(scene, mesh, defines, true, this._maxSimultaneousLights, this._disableLighting); - PrepareDefinesForMultiview(scene, defines); - const oit = this.needAlphaBlendingForMesh(mesh) && this.getScene().useOrderIndependentTransparency; - PrepareDefinesForPrePass(scene, defines, this.canRenderToMRT && !oit); - PrepareDefinesForOIT(scene, defines, oit); - if (defines._areTexturesDirty) { - this._eventInfo.hasRenderTargetTextures = false; - this._callbackPluginEventHasRenderTargetTextures(this._eventInfo); - this._cacheHasRenderTargetTextures = this._eventInfo.hasRenderTargetTextures; - defines._needUVs = false; - for (let i = 1; i <= 6; ++i) { - defines["MAINUV" + i] = false; + if (this.excludeWithLayerMask !== 0 && this.excludeWithLayerMask & mesh.layerMask) { + return false; + } + return true; + } + /** + * Releases resources associated with this node. + * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default) + * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default) + */ + dispose(doNotRecurse, disposeMaterialAndTextures = false) { + if (this._shadowGenerators) { + const iterator = this._shadowGenerators.values(); + for (let key = iterator.next(); key.done !== true; key = iterator.next()) { + const shadowGenerator = key.value; + shadowGenerator.dispose(); } - if (scene.texturesEnabled) { - defines.DIFFUSEDIRECTUV = 0; - defines.BUMPDIRECTUV = 0; - defines.AMBIENTDIRECTUV = 0; - defines.OPACITYDIRECTUV = 0; - defines.EMISSIVEDIRECTUV = 0; - defines.SPECULARDIRECTUV = 0; - defines.LIGHTMAPDIRECTUV = 0; - if (this._diffuseTexture && _StandardMaterial.DiffuseTextureEnabled) { - if (!this._diffuseTexture.isReadyOrNotBlocking()) { - return false; - } else { - PrepareDefinesForMergedUV(this._diffuseTexture, defines, "DIFFUSE"); - } - } else { - defines.DIFFUSE = false; - } - if (this._ambientTexture && _StandardMaterial.AmbientTextureEnabled) { - if (!this._ambientTexture.isReadyOrNotBlocking()) { - return false; - } else { - PrepareDefinesForMergedUV(this._ambientTexture, defines, "AMBIENT"); - } - } else { - defines.AMBIENT = false; - } - if (this._opacityTexture && _StandardMaterial.OpacityTextureEnabled) { - if (!this._opacityTexture.isReadyOrNotBlocking()) { - return false; - } else { - PrepareDefinesForMergedUV(this._opacityTexture, defines, "OPACITY"); - defines.OPACITYRGB = this._opacityTexture.getAlphaFromRGB; - } - } else { - defines.OPACITY = false; - } - if (this._reflectionTexture && _StandardMaterial.ReflectionTextureEnabled) { - if (!this._reflectionTexture.isReadyOrNotBlocking()) { - return false; - } else { - defines._needNormals = true; - defines.REFLECTION = true; - defines.ROUGHNESS = this._roughness > 0; - defines.REFLECTIONOVERALPHA = this._useReflectionOverAlpha; - defines.INVERTCUBICMAP = this._reflectionTexture.coordinatesMode === Texture.INVCUBIC_MODE; - defines.REFLECTIONMAP_3D = this._reflectionTexture.isCube; - defines.REFLECTIONMAP_OPPOSITEZ = defines.REFLECTIONMAP_3D && this.getScene().useRightHandedSystem ? !this._reflectionTexture.invertZ : this._reflectionTexture.invertZ; - defines.RGBDREFLECTION = this._reflectionTexture.isRGBD; - switch (this._reflectionTexture.coordinatesMode) { - case Texture.EXPLICIT_MODE: - defines.setReflectionMode("REFLECTIONMAP_EXPLICIT"); - break; - case Texture.PLANAR_MODE: - defines.setReflectionMode("REFLECTIONMAP_PLANAR"); - break; - case Texture.PROJECTION_MODE: - defines.setReflectionMode("REFLECTIONMAP_PROJECTION"); - break; - case Texture.SKYBOX_MODE: - defines.setReflectionMode("REFLECTIONMAP_SKYBOX"); - break; - case Texture.SPHERICAL_MODE: - defines.setReflectionMode("REFLECTIONMAP_SPHERICAL"); - break; - case Texture.EQUIRECTANGULAR_MODE: - defines.setReflectionMode("REFLECTIONMAP_EQUIRECTANGULAR"); - break; - case Texture.FIXED_EQUIRECTANGULAR_MODE: - defines.setReflectionMode("REFLECTIONMAP_EQUIRECTANGULAR_FIXED"); - break; - case Texture.FIXED_EQUIRECTANGULAR_MIRRORED_MODE: - defines.setReflectionMode("REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED"); - break; - case Texture.CUBIC_MODE: - case Texture.INVCUBIC_MODE: - default: - defines.setReflectionMode("REFLECTIONMAP_CUBIC"); - break; - } - defines.USE_LOCAL_REFLECTIONMAP_CUBIC = this._reflectionTexture.boundingBoxSize ? true : false; - } - } else { - defines.REFLECTION = false; - defines.REFLECTIONMAP_OPPOSITEZ = false; - } - if (this._emissiveTexture && _StandardMaterial.EmissiveTextureEnabled) { - if (!this._emissiveTexture.isReadyOrNotBlocking()) { - return false; - } else { - PrepareDefinesForMergedUV(this._emissiveTexture, defines, "EMISSIVE"); - } - } else { - defines.EMISSIVE = false; - } - if (this._lightmapTexture && _StandardMaterial.LightmapTextureEnabled) { - if (!this._lightmapTexture.isReadyOrNotBlocking()) { - return false; - } else { - PrepareDefinesForMergedUV(this._lightmapTexture, defines, "LIGHTMAP"); - defines.USELIGHTMAPASSHADOWMAP = this._useLightmapAsShadowmap; - defines.RGBDLIGHTMAP = this._lightmapTexture.isRGBD; - } - } else { - defines.LIGHTMAP = false; - } - if (this._specularTexture && _StandardMaterial.SpecularTextureEnabled) { - if (!this._specularTexture.isReadyOrNotBlocking()) { - return false; - } else { - PrepareDefinesForMergedUV(this._specularTexture, defines, "SPECULAR"); - defines.GLOSSINESS = this._useGlossinessFromSpecularMapAlpha; - } - } else { - defines.SPECULAR = false; - } - if (scene.getEngine().getCaps().standardDerivatives && this._bumpTexture && _StandardMaterial.BumpTextureEnabled) { - if (!this._bumpTexture.isReady()) { - return false; - } else { - PrepareDefinesForMergedUV(this._bumpTexture, defines, "BUMP"); - defines.PARALLAX = this._useParallax; - defines.PARALLAX_RHS = scene.useRightHandedSystem; - defines.PARALLAXOCCLUSION = this._useParallaxOcclusion; - } - defines.OBJECTSPACE_NORMALMAP = this._useObjectSpaceNormalMap; - } else { - defines.BUMP = false; - defines.PARALLAX = false; - defines.PARALLAX_RHS = false; - defines.PARALLAXOCCLUSION = false; - } - if (this._refractionTexture && _StandardMaterial.RefractionTextureEnabled) { - if (!this._refractionTexture.isReadyOrNotBlocking()) { - return false; - } else { - defines._needUVs = true; - defines.REFRACTION = true; - defines.REFRACTIONMAP_3D = this._refractionTexture.isCube; - defines.RGBDREFRACTION = this._refractionTexture.isRGBD; - defines.USE_LOCAL_REFRACTIONMAP_CUBIC = this._refractionTexture.boundingBoxSize ? true : false; - } - } else { - defines.REFRACTION = false; - } - defines.TWOSIDEDLIGHTING = !this._backFaceCulling && this._twoSidedLighting; - } else { - defines.DIFFUSE = false; - defines.AMBIENT = false; - defines.OPACITY = false; - defines.REFLECTION = false; - defines.EMISSIVE = false; - defines.LIGHTMAP = false; - defines.BUMP = false; - defines.REFRACTION = false; + this._shadowGenerators = null; + } + this.getScene().stopAnimation(this); + if (this._parentContainer) { + const index = this._parentContainer.lights.indexOf(this); + if (index > -1) { + this._parentContainer.lights.splice(index, 1); } - defines.ALPHAFROMDIFFUSE = this._shouldUseAlphaFromDiffuseTexture(); - defines.EMISSIVEASILLUMINATION = this._useEmissiveAsIllumination; - defines.LINKEMISSIVEWITHDIFFUSE = this._linkEmissiveWithDiffuse; - defines.SPECULAROVERALPHA = this._useSpecularOverAlpha; - defines.PREMULTIPLYALPHA = this.alphaMode === 7 || this.alphaMode === 8; - defines.ALPHATEST_AFTERALLALPHACOMPUTATIONS = this.transparencyMode !== null; - defines.ALPHABLEND = this.transparencyMode === null || this.needAlphaBlendingForMesh(mesh); + this._parentContainer = null; + } + for (const mesh of this.getScene().meshes) { + mesh._removeLightSource(this, true); + } + this._uniformBuffer.dispose(); + this.getScene().removeLight(this); + super.dispose(doNotRecurse, disposeMaterialAndTextures); + } + /** + * Returns the light type ID (integer). + * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x + */ + getTypeID() { + return 0; + } + /** + * Returns the intensity scaled by the Photometric Scale according to the light type and intensity mode. + * @returns the scaled intensity in intensity mode unit + */ + getScaledIntensity() { + return this._photometricScale * this.intensity; + } + /** + * Returns a new Light object, named "name", from the current one. + * @param name The name of the cloned light + * @param newParent The parent of this light, if it has one + * @returns the new created light + */ + clone(name69, newParent = null) { + const constructor = _Light.GetConstructorFromName(this.getTypeID(), name69, this.getScene()); + if (!constructor) { + return null; } - this._eventInfo.isReadyForSubMesh = true; - this._eventInfo.defines = defines; - this._eventInfo.subMesh = subMesh; - this._callbackPluginEventIsReadyForSubMesh(this._eventInfo); - if (!this._eventInfo.isReadyForSubMesh) { - return false; + const clonedLight = SerializationHelper.Clone(constructor, this); + if (name69) { + clonedLight.name = name69; } - if (defines._areImageProcessingDirty && this._imageProcessingConfiguration) { - if (!this._imageProcessingConfiguration.isReady()) { - return false; - } - this._imageProcessingConfiguration.prepareDefines(defines); - defines.IS_REFLECTION_LINEAR = this.reflectionTexture != null && !this.reflectionTexture.gammaSpace; - defines.IS_REFRACTION_LINEAR = this.refractionTexture != null && !this.refractionTexture.gammaSpace; + if (newParent) { + clonedLight.parent = newParent; } - if (defines._areFresnelDirty) { - if (_StandardMaterial.FresnelEnabled) { - if (this._diffuseFresnelParameters || this._opacityFresnelParameters || this._emissiveFresnelParameters || this._refractionFresnelParameters || this._reflectionFresnelParameters) { - defines.DIFFUSEFRESNEL = this._diffuseFresnelParameters && this._diffuseFresnelParameters.isEnabled; - defines.OPACITYFRESNEL = this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled; - defines.REFLECTIONFRESNEL = this._reflectionFresnelParameters && this._reflectionFresnelParameters.isEnabled; - defines.REFLECTIONFRESNELFROMSPECULAR = this._useReflectionFresnelFromSpecular; - defines.REFRACTIONFRESNEL = this._refractionFresnelParameters && this._refractionFresnelParameters.isEnabled; - defines.EMISSIVEFRESNEL = this._emissiveFresnelParameters && this._emissiveFresnelParameters.isEnabled; - defines._needNormals = true; - defines.FRESNEL = true; + clonedLight.setEnabled(this.isEnabled()); + this.onClonedObservable.notifyObservers(clonedLight); + return clonedLight; + } + /** + * Serializes the current light into a Serialization object. + * @returns the serialized object. + */ + serialize() { + const serializationObject = SerializationHelper.Serialize(this); + serializationObject.uniqueId = this.uniqueId; + serializationObject.type = this.getTypeID(); + if (this.parent) { + this.parent._serializeAsParent(serializationObject); + } + if (this.excludedMeshes.length > 0) { + serializationObject.excludedMeshesIds = []; + this.excludedMeshes.forEach((mesh) => { + serializationObject.excludedMeshesIds.push(mesh.id); + }); + } + if (this.includedOnlyMeshes.length > 0) { + serializationObject.includedOnlyMeshesIds = []; + this.includedOnlyMeshes.forEach((mesh) => { + serializationObject.includedOnlyMeshesIds.push(mesh.id); + }); + } + SerializationHelper.AppendSerializedAnimations(this, serializationObject); + serializationObject.ranges = this.serializeAnimationRanges(); + serializationObject.isEnabled = this.isEnabled(); + return serializationObject; + } + /** + * Creates a new typed light from the passed type (integer) : point light = 0, directional light = 1, spot light = 2, hemispheric light = 3. + * This new light is named "name" and added to the passed scene. + * @param type Type according to the types available in Light.LIGHTTYPEID_x + * @param name The friendly name of the light + * @param scene The scene the new light will belong to + * @returns the constructor function + */ + static GetConstructorFromName(type, name69, scene) { + const constructorFunc = Node.Construct("Light_Type_" + type, name69, scene); + if (constructorFunc) { + return constructorFunc; + } + return null; + } + /** + * Parses the passed "parsedLight" and returns a new instanced Light from this parsing. + * @param parsedLight The JSON representation of the light + * @param scene The scene to create the parsed light in + * @returns the created light after parsing + */ + static Parse(parsedLight, scene) { + const constructor = _Light.GetConstructorFromName(parsedLight.type, parsedLight.name, scene); + if (!constructor) { + return null; + } + const light = SerializationHelper.Parse(constructor, parsedLight, scene); + if (parsedLight.excludedMeshesIds) { + light._excludedMeshesIds = parsedLight.excludedMeshesIds; + } + if (parsedLight.includedOnlyMeshesIds) { + light._includedOnlyMeshesIds = parsedLight.includedOnlyMeshesIds; + } + if (parsedLight.parentId !== void 0) { + light._waitingParentId = parsedLight.parentId; + } + if (parsedLight.parentInstanceIndex !== void 0) { + light._waitingParentInstanceIndex = parsedLight.parentInstanceIndex; + } + if (parsedLight.falloffType !== void 0) { + light.falloffType = parsedLight.falloffType; + } + if (parsedLight.lightmapMode !== void 0) { + light.lightmapMode = parsedLight.lightmapMode; + } + if (parsedLight.animations) { + for (let animationIndex = 0; animationIndex < parsedLight.animations.length; animationIndex++) { + const parsedAnimation = parsedLight.animations[animationIndex]; + const internalClass = GetClass("BABYLON.Animation"); + if (internalClass) { + light.animations.push(internalClass.Parse(parsedAnimation)); } - } else { - defines.FRESNEL = false; } + Node.ParseAnimationRanges(light, parsedLight, scene); } - PrepareDefinesForMisc(mesh, scene, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, this._shouldTurnAlphaTestOn(mesh) || this._forceAlphaTest, defines, this._applyDecalMapAfterDetailMap); - PrepareDefinesForFrameBoundValues(scene, engine, this, defines, useInstances, null, subMesh.getRenderingMesh().hasThinInstances); - this._eventInfo.defines = defines; - this._eventInfo.mesh = mesh; - this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo); - PrepareDefinesForAttributes(mesh, defines, true, true, true); - this._callbackPluginEventPrepareDefines(this._eventInfo); - let forceWasNotReadyPreviously = false; - if (defines.isDirty) { - const lightDisposed = defines._areLightsDisposed; - defines.markAsProcessed(); - const fallbacks = new EffectFallbacks(); - if (defines.REFLECTION) { - fallbacks.addFallback(0, "REFLECTION"); - } - if (defines.SPECULAR) { - fallbacks.addFallback(0, "SPECULAR"); - } - if (defines.BUMP) { - fallbacks.addFallback(0, "BUMP"); - } - if (defines.PARALLAX) { - fallbacks.addFallback(1, "PARALLAX"); - } - if (defines.PARALLAX_RHS) { - fallbacks.addFallback(1, "PARALLAX_RHS"); - } - if (defines.PARALLAXOCCLUSION) { - fallbacks.addFallback(0, "PARALLAXOCCLUSION"); - } - if (defines.SPECULAROVERALPHA) { - fallbacks.addFallback(0, "SPECULAROVERALPHA"); - } - if (defines.FOG) { - fallbacks.addFallback(1, "FOG"); - } - if (defines.POINTSIZE) { - fallbacks.addFallback(0, "POINTSIZE"); - } - if (defines.LOGARITHMICDEPTH) { - fallbacks.addFallback(0, "LOGARITHMICDEPTH"); - } - HandleFallbacksForShadows(defines, fallbacks, this._maxSimultaneousLights); - if (defines.SPECULARTERM) { - fallbacks.addFallback(0, "SPECULARTERM"); - } - if (defines.DIFFUSEFRESNEL) { - fallbacks.addFallback(1, "DIFFUSEFRESNEL"); - } - if (defines.OPACITYFRESNEL) { - fallbacks.addFallback(2, "OPACITYFRESNEL"); - } - if (defines.REFLECTIONFRESNEL) { - fallbacks.addFallback(3, "REFLECTIONFRESNEL"); - } - if (defines.EMISSIVEFRESNEL) { - fallbacks.addFallback(4, "EMISSIVEFRESNEL"); - } - if (defines.FRESNEL) { - fallbacks.addFallback(4, "FRESNEL"); + if (parsedLight.autoAnimate) { + scene.beginAnimation(light, parsedLight.autoAnimateFrom, parsedLight.autoAnimateTo, parsedLight.autoAnimateLoop, parsedLight.autoAnimateSpeed || 1); + } + if (parsedLight.isEnabled !== void 0) { + light.setEnabled(parsedLight.isEnabled); + } + return light; + } + _hookArrayForExcluded(array) { + const oldPush = array.push; + array.push = (...items) => { + const result = oldPush.apply(array, items); + for (const item of items) { + item._resyncLightSource(this); } - if (defines.MULTIVIEW) { - fallbacks.addFallback(0, "MULTIVIEW"); + return result; + }; + const oldSplice = array.splice; + array.splice = (index, deleteCount) => { + const deleted = oldSplice.apply(array, [index, deleteCount]); + for (const item of deleted) { + item._resyncLightSource(this); } - const attribs = [VertexBuffer.PositionKind]; - if (defines.NORMAL) { - attribs.push(VertexBuffer.NormalKind); + return deleted; + }; + for (const item of array) { + item._resyncLightSource(this); + } + } + _hookArrayForIncludedOnly(array) { + const oldPush = array.push; + array.push = (...items) => { + const result = oldPush.apply(array, items); + this._resyncMeshes(); + return result; + }; + const oldSplice = array.splice; + array.splice = (index, deleteCount) => { + const deleted = oldSplice.apply(array, [index, deleteCount]); + this._resyncMeshes(); + return deleted; + }; + this._resyncMeshes(); + } + _resyncMeshes() { + for (const mesh of this.getScene().meshes) { + mesh._resyncLightSource(this); + } + } + /** + * Forces the meshes to update their light related information in their rendering used effects + * @internal Internal Use Only + */ + _markMeshesAsLightDirty() { + for (const mesh of this.getScene().meshes) { + if (mesh.lightSources.indexOf(this) !== -1) { + mesh._markSubMeshesAsLightDirty(); } - if (defines.TANGENT) { - attribs.push(VertexBuffer.TangentKind); + } + } + /** + * Recomputes the cached photometric scale if needed. + */ + _computePhotometricScale() { + this._photometricScale = this._getPhotometricScale(); + this.getScene().resetCachedMaterial(); + } + /** + * @returns the Photometric Scale according to the light type and intensity mode. + */ + _getPhotometricScale() { + let photometricScale = 0; + const lightTypeID = this.getTypeID(); + let photometricMode = this.intensityMode; + if (photometricMode === _Light.INTENSITYMODE_AUTOMATIC) { + if (lightTypeID === _Light.LIGHTTYPEID_DIRECTIONALLIGHT) { + photometricMode = _Light.INTENSITYMODE_ILLUMINANCE; + } else { + photometricMode = _Light.INTENSITYMODE_LUMINOUSINTENSITY; } - for (let i = 1; i <= 6; ++i) { - if (defines["UV" + i]) { - attribs.push(`uv${i === 1 ? "" : i}`); + } + switch (lightTypeID) { + case _Light.LIGHTTYPEID_POINTLIGHT: + case _Light.LIGHTTYPEID_SPOTLIGHT: + switch (photometricMode) { + case _Light.INTENSITYMODE_LUMINOUSPOWER: + photometricScale = 1 / (4 * Math.PI); + break; + case _Light.INTENSITYMODE_LUMINOUSINTENSITY: + photometricScale = 1; + break; + case _Light.INTENSITYMODE_LUMINANCE: + photometricScale = this.radius * this.radius; + break; } + break; + case _Light.LIGHTTYPEID_DIRECTIONALLIGHT: + switch (photometricMode) { + case _Light.INTENSITYMODE_ILLUMINANCE: + photometricScale = 1; + break; + case _Light.INTENSITYMODE_LUMINANCE: { + let apexAngleRadians = this.radius; + apexAngleRadians = Math.max(apexAngleRadians, 1e-3); + const solidAngle = 2 * Math.PI * (1 - Math.cos(apexAngleRadians)); + photometricScale = solidAngle; + break; + } + } + break; + case _Light.LIGHTTYPEID_HEMISPHERICLIGHT: + photometricScale = 1; + break; + } + return photometricScale; + } + /** + * Reorder the light in the scene according to their defined priority. + * @internal Internal Use Only + */ + _reorderLightsInScene() { + const scene = this.getScene(); + if (this._renderPriority != 0) { + scene.requireLightSorting = true; + } + this.getScene().sortLightsByPriority(); + } +}; +Light.FALLOFF_DEFAULT = LightConstants.FALLOFF_DEFAULT; +Light.FALLOFF_PHYSICAL = LightConstants.FALLOFF_PHYSICAL; +Light.FALLOFF_GLTF = LightConstants.FALLOFF_GLTF; +Light.FALLOFF_STANDARD = LightConstants.FALLOFF_STANDARD; +Light.LIGHTMAP_DEFAULT = LightConstants.LIGHTMAP_DEFAULT; +Light.LIGHTMAP_SPECULAR = LightConstants.LIGHTMAP_SPECULAR; +Light.LIGHTMAP_SHADOWSONLY = LightConstants.LIGHTMAP_SHADOWSONLY; +Light.INTENSITYMODE_AUTOMATIC = LightConstants.INTENSITYMODE_AUTOMATIC; +Light.INTENSITYMODE_LUMINOUSPOWER = LightConstants.INTENSITYMODE_LUMINOUSPOWER; +Light.INTENSITYMODE_LUMINOUSINTENSITY = LightConstants.INTENSITYMODE_LUMINOUSINTENSITY; +Light.INTENSITYMODE_ILLUMINANCE = LightConstants.INTENSITYMODE_ILLUMINANCE; +Light.INTENSITYMODE_LUMINANCE = LightConstants.INTENSITYMODE_LUMINANCE; +Light.LIGHTTYPEID_POINTLIGHT = LightConstants.LIGHTTYPEID_POINTLIGHT; +Light.LIGHTTYPEID_DIRECTIONALLIGHT = LightConstants.LIGHTTYPEID_DIRECTIONALLIGHT; +Light.LIGHTTYPEID_SPOTLIGHT = LightConstants.LIGHTTYPEID_SPOTLIGHT; +Light.LIGHTTYPEID_HEMISPHERICLIGHT = LightConstants.LIGHTTYPEID_HEMISPHERICLIGHT; +__decorate([ + serializeAsColor3() +], Light.prototype, "diffuse", void 0); +__decorate([ + serializeAsColor3() +], Light.prototype, "specular", void 0); +__decorate([ + serialize() +], Light.prototype, "falloffType", void 0); +__decorate([ + serialize() +], Light.prototype, "intensity", void 0); +__decorate([ + serialize() +], Light.prototype, "range", null); +__decorate([ + serialize() +], Light.prototype, "intensityMode", null); +__decorate([ + serialize() +], Light.prototype, "radius", null); +__decorate([ + serialize() +], Light.prototype, "_renderPriority", void 0); +__decorate([ + expandToProperty("_reorderLightsInScene") +], Light.prototype, "renderPriority", void 0); +__decorate([ + serialize("shadowEnabled") +], Light.prototype, "_shadowEnabled", void 0); +__decorate([ + serialize("excludeWithLayerMask") +], Light.prototype, "_excludeWithLayerMask", void 0); +__decorate([ + serialize("includeOnlyWithLayerMask") +], Light.prototype, "_includeOnlyWithLayerMask", void 0); +__decorate([ + serialize("lightmapMode") +], Light.prototype, "_lightmapMode", void 0); + +// node_modules/@babylonjs/core/Lights/hemisphericLight.js +Node.AddNodeConstructor("Light_Type_3", (name69, scene) => { + return () => new HemisphericLight(name69, Vector3.Zero(), scene); +}); +var HemisphericLight = class extends Light { + /** + * Creates a HemisphericLight object in the scene according to the passed direction (Vector3). + * The HemisphericLight simulates the ambient environment light, so the passed direction is the light reflection direction, not the incoming direction. + * The HemisphericLight can't cast shadows. + * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction + * @param name The friendly name of the light + * @param direction The direction of the light reflection + * @param scene The scene the light belongs to + */ + constructor(name69, direction, scene) { + super(name69, scene); + this.groundColor = new Color3(0, 0, 0); + this.direction = direction || Vector3.Up(); + } + _buildUniformLayout() { + this._uniformBuffer.addUniform("vLightData", 4); + this._uniformBuffer.addUniform("vLightDiffuse", 4); + this._uniformBuffer.addUniform("vLightSpecular", 4); + this._uniformBuffer.addUniform("vLightGround", 3); + this._uniformBuffer.addUniform("shadowsInfo", 3); + this._uniformBuffer.addUniform("depthValues", 2); + this._uniformBuffer.create(); + } + /** + * Returns the string "HemisphericLight". + * @returns The class name + */ + getClassName() { + return "HemisphericLight"; + } + /** + * Sets the HemisphericLight direction towards the passed target (Vector3). + * Returns the updated direction. + * @param target The target the direction should point to + * @returns The computed direction + */ + setDirectionToTarget(target) { + this.direction = Vector3.Normalize(target.subtract(Vector3.Zero())); + return this.direction; + } + /** + * Returns the shadow generator associated to the light. + * @returns Always null for hemispheric lights because it does not support shadows. + */ + getShadowGenerator() { + return null; + } + /** + * Sets the passed Effect object with the HemisphericLight normalized direction and color and the passed name (string). + * @param _effect The effect to update + * @param lightIndex The index of the light in the effect to update + * @returns The hemispheric light + */ + transferToEffect(_effect, lightIndex) { + const normalizeDirection = Vector3.Normalize(this.direction); + this._uniformBuffer.updateFloat4("vLightData", normalizeDirection.x, normalizeDirection.y, normalizeDirection.z, 0, lightIndex); + this._uniformBuffer.updateColor3("vLightGround", this.groundColor.scale(this.intensity), lightIndex); + return this; + } + transferToNodeMaterialEffect(effect, lightDataUniformName) { + const normalizeDirection = Vector3.Normalize(this.direction); + effect.setFloat3(lightDataUniformName, normalizeDirection.x, normalizeDirection.y, normalizeDirection.z); + return this; + } + /** + * Computes the world matrix of the node + * @returns the world matrix + */ + computeWorldMatrix() { + if (!this._worldMatrix) { + this._worldMatrix = Matrix.Identity(); + } + return this._worldMatrix; + } + /** + * Returns the integer 3. + * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x + */ + getTypeID() { + return Light.LIGHTTYPEID_HEMISPHERICLIGHT; + } + /** + * Prepares the list of defines specific to the light type. + * @param defines the list of defines + * @param lightIndex defines the index of the light for the effect + */ + prepareLightSpecificDefines(defines, lightIndex) { + defines["HEMILIGHT" + lightIndex] = true; + } +}; +__decorate([ + serializeAsColor3() +], HemisphericLight.prototype, "groundColor", void 0); +__decorate([ + serializeAsVector3() +], HemisphericLight.prototype, "direction", void 0); + +// node_modules/@babylonjs/core/Rendering/utilityLayerRenderer.js +var UtilityLayerRenderer = class _UtilityLayerRenderer { + /** + * Gets the camera that is used to render the utility layer (when not set, this will be the last active camera) + * @param getRigParentIfPossible if the current active camera is a rig camera, should its parent camera be returned + * @returns the camera that is used when rendering the utility layer + */ + getRenderCamera(getRigParentIfPossible) { + if (this._renderCamera) { + return this._renderCamera; + } else { + let activeCam; + if (this.originalScene.activeCameras && this.originalScene.activeCameras.length > 1) { + activeCam = this.originalScene.activeCameras[this.originalScene.activeCameras.length - 1]; + } else { + activeCam = this.originalScene.activeCamera; } - if (defines.VERTEXCOLOR) { - attribs.push(VertexBuffer.ColorKind); - } - PrepareAttributesForBones(attribs, mesh, defines, fallbacks); - PrepareAttributesForInstances(attribs, defines); - PrepareAttributesForMorphTargets(attribs, mesh, defines); - PrepareAttributesForBakedVertexAnimation(attribs, mesh, defines); - let shaderName = "default"; - const uniforms = [ - "world", - "view", - "viewProjection", - "vEyePosition", - "vLightsType", - "vAmbientColor", - "vDiffuseColor", - "vSpecularColor", - "vEmissiveColor", - "visibility", - "vFogInfos", - "vFogColor", - "pointSize", - "vDiffuseInfos", - "vAmbientInfos", - "vOpacityInfos", - "vReflectionInfos", - "vEmissiveInfos", - "vSpecularInfos", - "vBumpInfos", - "vLightmapInfos", - "vRefractionInfos", - "mBones", - "diffuseMatrix", - "ambientMatrix", - "opacityMatrix", - "reflectionMatrix", - "emissiveMatrix", - "specularMatrix", - "bumpMatrix", - "normalMatrix", - "lightmapMatrix", - "refractionMatrix", - "diffuseLeftColor", - "diffuseRightColor", - "opacityParts", - "reflectionLeftColor", - "reflectionRightColor", - "emissiveLeftColor", - "emissiveRightColor", - "refractionLeftColor", - "refractionRightColor", - "vReflectionPosition", - "vReflectionSize", - "vRefractionPosition", - "vRefractionSize", - "logarithmicDepthConstant", - "vTangentSpaceParams", - "alphaCutOff", - "boneTextureWidth", - "morphTargetTextureInfo", - "morphTargetTextureIndices" - ]; - const samplers = [ - "diffuseSampler", - "ambientSampler", - "opacitySampler", - "reflectionCubeSampler", - "reflection2DSampler", - "emissiveSampler", - "specularSampler", - "bumpSampler", - "lightmapSampler", - "refractionCubeSampler", - "refraction2DSampler", - "boneSampler", - "morphTargets", - "oitDepthSampler", - "oitFrontColorSampler" - ]; - const uniformBuffers = ["Material", "Scene", "Mesh"]; - const indexParameters = { maxSimultaneousLights: this._maxSimultaneousLights, maxSimultaneousMorphTargets: defines.NUM_MORPH_INFLUENCERS }; - this._eventInfo.fallbacks = fallbacks; - this._eventInfo.fallbackRank = 0; - this._eventInfo.defines = defines; - this._eventInfo.uniforms = uniforms; - this._eventInfo.attributes = attribs; - this._eventInfo.samplers = samplers; - this._eventInfo.uniformBuffersNames = uniformBuffers; - this._eventInfo.customCode = void 0; - this._eventInfo.mesh = mesh; - this._eventInfo.indexParameters = indexParameters; - this._callbackPluginEventGeneric(MaterialPluginEvent.PrepareEffect, this._eventInfo); - PrePassConfiguration.AddUniforms(uniforms); - PrePassConfiguration.AddSamplers(samplers); - if (ImageProcessingConfiguration) { - ImageProcessingConfiguration.PrepareUniforms(uniforms, defines); - ImageProcessingConfiguration.PrepareSamplers(samplers, defines); - } - PrepareUniformsAndSamplersList({ - uniformsNames: uniforms, - uniformBuffersNames: uniformBuffers, - samplers, - defines, - maxSimultaneousLights: this._maxSimultaneousLights - }); - addClipPlaneUniforms(uniforms); - const csnrOptions = {}; - if (this.customShaderNameResolve) { - shaderName = this.customShaderNameResolve(shaderName, uniforms, uniformBuffers, samplers, defines, attribs, csnrOptions); - } - const join = defines.toString(); - const previousEffect = subMesh.effect; - let effect = scene.getEngine().createEffect(shaderName, { - attributes: attribs, - uniformsNames: uniforms, - uniformBuffersNames: uniformBuffers, - samplers, - defines: join, - fallbacks, - onCompiled: this.onCompiled, - onError: this.onError, - indexParameters, - processFinalCode: csnrOptions.processFinalCode, - processCodeAfterIncludes: this._eventInfo.customCode, - multiTarget: defines.PREPASS - }, engine); - this._eventInfo.customCode = void 0; - if (effect) { - if (this._onEffectCreatedObservable) { - onCreatedEffectParameters2.effect = effect; - onCreatedEffectParameters2.subMesh = subMesh; - this._onEffectCreatedObservable.notifyObservers(onCreatedEffectParameters2); - } - if (this.allowShaderHotSwapping && previousEffect && !effect.isReady()) { - effect = previousEffect; - defines.markAsUnprocessed(); - forceWasNotReadyPreviously = this.isFrozen; - if (lightDisposed) { - defines._areLightsDisposed = true; - return false; - } - } else { - scene.resetCachedMaterial(); - subMesh.setEffect(effect, defines, this._materialContext); - } + if (getRigParentIfPossible && activeCam && activeCam.isRigCamera) { + return activeCam.rigParent; } + return activeCam; } - if (!subMesh.effect || !subMesh.effect.isReady()) { - return false; - } - defines._renderId = scene.getRenderId(); - drawWrapper._wasPreviouslyReady = forceWasNotReadyPreviously ? false : true; - drawWrapper._wasPreviouslyUsingInstances = useInstances; - this._checkScenePerformancePriority(); - return true; } /** - * Builds the material UBO layouts. - * Used internally during the effect preparation. + * Sets the camera that should be used when rendering the utility layer (If set to null the last active camera will be used) + * @param cam the camera that should be used when rendering the utility layer */ - buildUniformLayout() { - const ubo = this._uniformBuffer; - ubo.addUniform("diffuseLeftColor", 4); - ubo.addUniform("diffuseRightColor", 4); - ubo.addUniform("opacityParts", 4); - ubo.addUniform("reflectionLeftColor", 4); - ubo.addUniform("reflectionRightColor", 4); - ubo.addUniform("refractionLeftColor", 4); - ubo.addUniform("refractionRightColor", 4); - ubo.addUniform("emissiveLeftColor", 4); - ubo.addUniform("emissiveRightColor", 4); - ubo.addUniform("vDiffuseInfos", 2); - ubo.addUniform("vAmbientInfos", 2); - ubo.addUniform("vOpacityInfos", 2); - ubo.addUniform("vReflectionInfos", 2); - ubo.addUniform("vReflectionPosition", 3); - ubo.addUniform("vReflectionSize", 3); - ubo.addUniform("vEmissiveInfos", 2); - ubo.addUniform("vLightmapInfos", 2); - ubo.addUniform("vSpecularInfos", 2); - ubo.addUniform("vBumpInfos", 3); - ubo.addUniform("diffuseMatrix", 16); - ubo.addUniform("ambientMatrix", 16); - ubo.addUniform("opacityMatrix", 16); - ubo.addUniform("reflectionMatrix", 16); - ubo.addUniform("emissiveMatrix", 16); - ubo.addUniform("lightmapMatrix", 16); - ubo.addUniform("specularMatrix", 16); - ubo.addUniform("bumpMatrix", 16); - ubo.addUniform("vTangentSpaceParams", 2); - ubo.addUniform("pointSize", 1); - ubo.addUniform("alphaCutOff", 1); - ubo.addUniform("refractionMatrix", 16); - ubo.addUniform("vRefractionInfos", 4); - ubo.addUniform("vRefractionPosition", 3); - ubo.addUniform("vRefractionSize", 3); - ubo.addUniform("vSpecularColor", 4); - ubo.addUniform("vEmissiveColor", 3); - ubo.addUniform("vDiffuseColor", 4); - ubo.addUniform("vAmbientColor", 3); - super.buildUniformLayout(); + setRenderCamera(cam) { + this._renderCamera = cam; } /** - * Binds the submesh to this material by preparing the effect and shader to draw - * @param world defines the world transformation matrix - * @param mesh defines the mesh containing the submesh - * @param subMesh defines the submesh to bind the material to + * @internal + * Light which used by gizmos to get light shading */ - bindForSubMesh(world, mesh, subMesh) { - var _a; - const scene = this.getScene(); - const defines = subMesh.materialDefines; - if (!defines) { - return; + _getSharedGizmoLight() { + if (!this._sharedGizmoLight) { + this._sharedGizmoLight = new HemisphericLight("shared gizmo light", new Vector3(0, 1, 0), this.utilityLayerScene); + this._sharedGizmoLight.intensity = 2; + this._sharedGizmoLight.groundColor = Color3.Gray(); } - const effect = subMesh.effect; - if (!effect) { - return; + return this._sharedGizmoLight; + } + /** + * A shared utility layer that can be used to overlay objects into a scene (Depth map of the previous scene is cleared before drawing on top of it) + */ + static get DefaultUtilityLayer() { + if (_UtilityLayerRenderer._DefaultUtilityLayer == null) { + return _UtilityLayerRenderer._CreateDefaultUtilityLayerFromScene(EngineStore.LastCreatedScene); } - this._activeEffect = effect; - mesh.getMeshUniformBuffer().bindToEffect(effect, "Mesh"); - mesh.transferToEffect(world); - this._uniformBuffer.bindToEffect(effect, "Material"); - this.prePassConfiguration.bindForSubMesh(this._activeEffect, scene, mesh, world, this.isFrozen); - this._eventInfo.subMesh = subMesh; - this._callbackPluginEventHardBindForSubMesh(this._eventInfo); - if (defines.OBJECTSPACE_NORMALMAP) { - world.toNormalMatrix(this._normalMatrix); - this.bindOnlyNormalMatrix(this._normalMatrix); + return _UtilityLayerRenderer._DefaultUtilityLayer; + } + /** + * Creates an utility layer, and set it as a default utility layer + * @param scene associated scene + * @internal + */ + static _CreateDefaultUtilityLayerFromScene(scene) { + _UtilityLayerRenderer._DefaultUtilityLayer = new _UtilityLayerRenderer(scene); + _UtilityLayerRenderer._DefaultUtilityLayer.originalScene.onDisposeObservable.addOnce(() => { + _UtilityLayerRenderer._DefaultUtilityLayer = null; + }); + return _UtilityLayerRenderer._DefaultUtilityLayer; + } + /** + * A shared utility layer that can be used to embed objects into a scene (Depth map of the previous scene is not cleared before drawing on top of it) + */ + static get DefaultKeepDepthUtilityLayer() { + if (_UtilityLayerRenderer._DefaultKeepDepthUtilityLayer == null) { + _UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = new _UtilityLayerRenderer(EngineStore.LastCreatedScene); + _UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.utilityLayerScene.autoClearDepthAndStencil = false; + _UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.originalScene.onDisposeObservable.addOnce(() => { + _UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = null; + }); } - const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility); - BindBonesParameters(mesh, effect); - const ubo = this._uniformBuffer; - if (mustRebind) { - this.bindViewProjection(effect); - if (!ubo.useUbo || !this.isFrozen || !ubo.isSync || subMesh._drawWrapper._forceRebindOnNextCall) { - if (_StandardMaterial.FresnelEnabled && defines.FRESNEL) { - if (this.diffuseFresnelParameters && this.diffuseFresnelParameters.isEnabled) { - ubo.updateColor4("diffuseLeftColor", this.diffuseFresnelParameters.leftColor, this.diffuseFresnelParameters.power); - ubo.updateColor4("diffuseRightColor", this.diffuseFresnelParameters.rightColor, this.diffuseFresnelParameters.bias); - } - if (this.opacityFresnelParameters && this.opacityFresnelParameters.isEnabled) { - ubo.updateColor4("opacityParts", new Color3(this.opacityFresnelParameters.leftColor.toLuminance(), this.opacityFresnelParameters.rightColor.toLuminance(), this.opacityFresnelParameters.bias), this.opacityFresnelParameters.power); - } - if (this.reflectionFresnelParameters && this.reflectionFresnelParameters.isEnabled) { - ubo.updateColor4("reflectionLeftColor", this.reflectionFresnelParameters.leftColor, this.reflectionFresnelParameters.power); - ubo.updateColor4("reflectionRightColor", this.reflectionFresnelParameters.rightColor, this.reflectionFresnelParameters.bias); - } - if (this.refractionFresnelParameters && this.refractionFresnelParameters.isEnabled) { - ubo.updateColor4("refractionLeftColor", this.refractionFresnelParameters.leftColor, this.refractionFresnelParameters.power); - ubo.updateColor4("refractionRightColor", this.refractionFresnelParameters.rightColor, this.refractionFresnelParameters.bias); - } - if (this.emissiveFresnelParameters && this.emissiveFresnelParameters.isEnabled) { - ubo.updateColor4("emissiveLeftColor", this.emissiveFresnelParameters.leftColor, this.emissiveFresnelParameters.power); - ubo.updateColor4("emissiveRightColor", this.emissiveFresnelParameters.rightColor, this.emissiveFresnelParameters.bias); - } + return _UtilityLayerRenderer._DefaultKeepDepthUtilityLayer; + } + /** + * Instantiates a UtilityLayerRenderer + * @param originalScene the original scene that will be rendered on top of + * @param handleEvents boolean indicating if the utility layer should handle events + */ + constructor(originalScene, handleEvents = true) { + this.originalScene = originalScene; + this._pointerCaptures = {}; + this._lastPointerEvents = {}; + this._sharedGizmoLight = null; + this._renderCamera = null; + this.pickUtilitySceneFirst = true; + this.shouldRender = true; + this.onlyCheckPointerDownEvents = true; + this.processAllEvents = false; + this.pickingEnabled = true; + this.onPointerOutObservable = new Observable(); + this.utilityLayerScene = new Scene(originalScene.getEngine(), { virtual: true }); + this.utilityLayerScene.useRightHandedSystem = originalScene.useRightHandedSystem; + this.utilityLayerScene._allowPostProcessClearColor = false; + this.utilityLayerScene.postProcessesEnabled = false; + this.utilityLayerScene.detachControl(); + if (handleEvents) { + this._originalPointerObserver = originalScene.onPrePointerObservable.add((prePointerInfo) => { + if (!this.utilityLayerScene.activeCamera) { + return; } - if (scene.texturesEnabled) { - if (this._diffuseTexture && _StandardMaterial.DiffuseTextureEnabled) { - ubo.updateFloat2("vDiffuseInfos", this._diffuseTexture.coordinatesIndex, this._diffuseTexture.level); - BindTextureMatrix(this._diffuseTexture, ubo, "diffuse"); - } - if (this._ambientTexture && _StandardMaterial.AmbientTextureEnabled) { - ubo.updateFloat2("vAmbientInfos", this._ambientTexture.coordinatesIndex, this._ambientTexture.level); - BindTextureMatrix(this._ambientTexture, ubo, "ambient"); - } - if (this._opacityTexture && _StandardMaterial.OpacityTextureEnabled) { - ubo.updateFloat2("vOpacityInfos", this._opacityTexture.coordinatesIndex, this._opacityTexture.level); - BindTextureMatrix(this._opacityTexture, ubo, "opacity"); - } - if (this._hasAlphaChannel()) { - ubo.updateFloat("alphaCutOff", this.alphaCutOff); - } - if (this._reflectionTexture && _StandardMaterial.ReflectionTextureEnabled) { - ubo.updateFloat2("vReflectionInfos", this._reflectionTexture.level, this.roughness); - ubo.updateMatrix("reflectionMatrix", this._reflectionTexture.getReflectionTextureMatrix()); - if (this._reflectionTexture.boundingBoxSize) { - const cubeTexture = this._reflectionTexture; - ubo.updateVector3("vReflectionPosition", cubeTexture.boundingBoxPosition); - ubo.updateVector3("vReflectionSize", cubeTexture.boundingBoxSize); - } - } - if (this._emissiveTexture && _StandardMaterial.EmissiveTextureEnabled) { - ubo.updateFloat2("vEmissiveInfos", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level); - BindTextureMatrix(this._emissiveTexture, ubo, "emissive"); - } - if (this._lightmapTexture && _StandardMaterial.LightmapTextureEnabled) { - ubo.updateFloat2("vLightmapInfos", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level); - BindTextureMatrix(this._lightmapTexture, ubo, "lightmap"); - } - if (this._specularTexture && _StandardMaterial.SpecularTextureEnabled) { - ubo.updateFloat2("vSpecularInfos", this._specularTexture.coordinatesIndex, this._specularTexture.level); - BindTextureMatrix(this._specularTexture, ubo, "specular"); + if (!this.pickingEnabled) { + return; + } + if (!this.processAllEvents) { + if (prePointerInfo.type !== PointerEventTypes.POINTERMOVE && prePointerInfo.type !== PointerEventTypes.POINTERUP && prePointerInfo.type !== PointerEventTypes.POINTERDOWN && prePointerInfo.type !== PointerEventTypes.POINTERDOUBLETAP) { + return; } - if (this._bumpTexture && scene.getEngine().getCaps().standardDerivatives && _StandardMaterial.BumpTextureEnabled) { - ubo.updateFloat3("vBumpInfos", this._bumpTexture.coordinatesIndex, 1 / this._bumpTexture.level, this.parallaxScaleBias); - BindTextureMatrix(this._bumpTexture, ubo, "bump"); - if (scene._mirroredCameraPosition) { - ubo.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? 1 : -1, this._invertNormalMapY ? 1 : -1); + } + this.utilityLayerScene.pointerX = originalScene.pointerX; + this.utilityLayerScene.pointerY = originalScene.pointerY; + const pointerEvent = prePointerInfo.event; + if (originalScene.isPointerCaptured(pointerEvent.pointerId)) { + this._pointerCaptures[pointerEvent.pointerId] = false; + return; + } + const getNearPickDataForScene = (scene) => { + let scenePick = null; + if (prePointerInfo.nearInteractionPickingInfo) { + if (prePointerInfo.nearInteractionPickingInfo.pickedMesh.getScene() == scene) { + scenePick = prePointerInfo.nearInteractionPickingInfo; } else { - ubo.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? -1 : 1, this._invertNormalMapY ? -1 : 1); + scenePick = new PickingInfo(); } - } - if (this._refractionTexture && _StandardMaterial.RefractionTextureEnabled) { - let depth = 1; - if (!this._refractionTexture.isCube) { - ubo.updateMatrix("refractionMatrix", this._refractionTexture.getReflectionTextureMatrix()); - if (this._refractionTexture.depth) { - depth = this._refractionTexture.depth; - } + } else if (scene !== this.utilityLayerScene && prePointerInfo.originalPickingInfo) { + scenePick = prePointerInfo.originalPickingInfo; + } else { + let previousActiveCamera = null; + if (this._renderCamera) { + previousActiveCamera = scene._activeCamera; + scene._activeCamera = this._renderCamera; + prePointerInfo.ray = null; } - ubo.updateFloat4("vRefractionInfos", this._refractionTexture.level, this.indexOfRefraction, depth, this.invertRefractionY ? -1 : 1); - if (this._refractionTexture.boundingBoxSize) { - const cubeTexture = this._refractionTexture; - ubo.updateVector3("vRefractionPosition", cubeTexture.boundingBoxPosition); - ubo.updateVector3("vRefractionSize", cubeTexture.boundingBoxSize); + scenePick = prePointerInfo.ray ? scene.pickWithRay(prePointerInfo.ray) : scene.pick(originalScene.pointerX, originalScene.pointerY); + if (previousActiveCamera) { + scene._activeCamera = previousActiveCamera; } } + return scenePick; + }; + const utilityScenePick = getNearPickDataForScene(this.utilityLayerScene); + if (!prePointerInfo.ray && utilityScenePick) { + prePointerInfo.ray = utilityScenePick.ray; } - if (this.pointsCloud) { - ubo.updateFloat("pointSize", this.pointSize); - } - if (defines.SPECULARTERM) { - ubo.updateColor4("vSpecularColor", this.specularColor, this.specularPower); - } - ubo.updateColor3("vEmissiveColor", _StandardMaterial.EmissiveTextureEnabled ? this.emissiveColor : Color3.BlackReadOnly); - ubo.updateColor4("vDiffuseColor", this.diffuseColor, this.alpha); - scene.ambientColor.multiplyToRef(this.ambientColor, this._globalAmbientColor); - ubo.updateColor3("vAmbientColor", this._globalAmbientColor); - } - if (scene.texturesEnabled) { - if (this._diffuseTexture && _StandardMaterial.DiffuseTextureEnabled) { - effect.setTexture("diffuseSampler", this._diffuseTexture); - } - if (this._ambientTexture && _StandardMaterial.AmbientTextureEnabled) { - effect.setTexture("ambientSampler", this._ambientTexture); - } - if (this._opacityTexture && _StandardMaterial.OpacityTextureEnabled) { - effect.setTexture("opacitySampler", this._opacityTexture); - } - if (this._reflectionTexture && _StandardMaterial.ReflectionTextureEnabled) { - if (this._reflectionTexture.isCube) { - effect.setTexture("reflectionCubeSampler", this._reflectionTexture); - } else { - effect.setTexture("reflection2DSampler", this._reflectionTexture); + this.utilityLayerScene.onPrePointerObservable.notifyObservers(prePointerInfo); + if (this.onlyCheckPointerDownEvents && prePointerInfo.type != PointerEventTypes.POINTERDOWN) { + if (!prePointerInfo.skipOnPointerObservable) { + this.utilityLayerScene.onPointerObservable.notifyObservers(new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick), prePointerInfo.type); } - } - if (this._emissiveTexture && _StandardMaterial.EmissiveTextureEnabled) { - effect.setTexture("emissiveSampler", this._emissiveTexture); - } - if (this._lightmapTexture && _StandardMaterial.LightmapTextureEnabled) { - effect.setTexture("lightmapSampler", this._lightmapTexture); - } - if (this._specularTexture && _StandardMaterial.SpecularTextureEnabled) { - effect.setTexture("specularSampler", this._specularTexture); - } - if (this._bumpTexture && scene.getEngine().getCaps().standardDerivatives && _StandardMaterial.BumpTextureEnabled) { - effect.setTexture("bumpSampler", this._bumpTexture); - } - if (this._refractionTexture && _StandardMaterial.RefractionTextureEnabled) { - if (this._refractionTexture.isCube) { - effect.setTexture("refractionCubeSampler", this._refractionTexture); - } else { - effect.setTexture("refraction2DSampler", this._refractionTexture); + if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) { + this._pointerCaptures[pointerEvent.pointerId] = false; } + return; } + if (this.utilityLayerScene.autoClearDepthAndStencil || this.pickUtilitySceneFirst) { + if (utilityScenePick && utilityScenePick.hit) { + if (!prePointerInfo.skipOnPointerObservable) { + this.utilityLayerScene.onPointerObservable.notifyObservers(new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick), prePointerInfo.type); + } + prePointerInfo.skipOnPointerObservable = true; + } + } else { + const originalScenePick = getNearPickDataForScene(originalScene); + const pointerEvent2 = prePointerInfo.event; + if (originalScenePick && utilityScenePick) { + if (utilityScenePick.distance === 0 && originalScenePick.pickedMesh) { + if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) { + this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent2); + prePointerInfo.skipOnPointerObservable = true; + } else if (prePointerInfo.type === PointerEventTypes.POINTERDOWN) { + this._pointerCaptures[pointerEvent2.pointerId] = true; + } else if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) { + if (this._lastPointerEvents[pointerEvent2.pointerId]) { + this.onPointerOutObservable.notifyObservers(pointerEvent2.pointerId); + delete this._lastPointerEvents[pointerEvent2.pointerId]; + } + this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent2); + } + } else if (!this._pointerCaptures[pointerEvent2.pointerId] && (utilityScenePick.distance < originalScenePick.distance || originalScenePick.distance === 0)) { + this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent2); + if (!prePointerInfo.skipOnPointerObservable) { + prePointerInfo.skipOnPointerObservable = utilityScenePick.distance > 0; + } + } else if (!this._pointerCaptures[pointerEvent2.pointerId] && utilityScenePick.distance >= originalScenePick.distance) { + if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) { + this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent2); + prePointerInfo.skipOnPointerObservable = true; + } else { + if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) { + if (this._lastPointerEvents[pointerEvent2.pointerId]) { + this.onPointerOutObservable.notifyObservers(pointerEvent2.pointerId); + delete this._lastPointerEvents[pointerEvent2.pointerId]; + } + } + this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent2); + } + } + if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent2.pointerId]) { + this._pointerCaptures[pointerEvent2.pointerId] = false; + } + } + } + }); + if (this._originalPointerObserver) { + originalScene.onPrePointerObservable.makeObserverTopPriority(this._originalPointerObserver); } - if (this.getScene().useOrderIndependentTransparency && this.needAlphaBlendingForMesh(mesh)) { - this.getScene().depthPeelingRenderer.bind(effect); - } - this._eventInfo.subMesh = subMesh; - this._callbackPluginEventBindForSubMesh(this._eventInfo); - bindClipPlane(effect, this, scene); - this.bindEyePosition(effect); - } else if (scene.getEngine()._features.needToAlwaysBindUniformBuffers) { - this._needToBindSceneUbo = true; - } - if (mustRebind || !this.isFrozen) { - if (scene.lightsEnabled && !this._disableLighting) { - BindLights(scene, mesh, effect, defines, this._maxSimultaneousLights); - } - if (scene.fogEnabled && mesh.applyFog && scene.fogMode !== Scene.FOGMODE_NONE || this._reflectionTexture || this._refractionTexture || mesh.receiveShadows || defines.PREPASS) { - this.bindView(effect); + } + this.utilityLayerScene.autoClear = false; + this._afterRenderObserver = this.originalScene.onAfterRenderCameraObservable.add((camera) => { + if (this.shouldRender && camera == this.getRenderCamera()) { + this.render(); } - BindFogParameters(scene, mesh, effect); - if (defines.NUM_MORPH_INFLUENCERS) { - BindMorphTargetParameters(mesh, effect); + }); + this._sceneDisposeObserver = this.originalScene.onDisposeObservable.add(() => { + this.dispose(); + }); + this._updateCamera(); + } + _notifyObservers(prePointerInfo, pickInfo, pointerEvent) { + if (!prePointerInfo.skipOnPointerObservable) { + this.utilityLayerScene.onPointerObservable.notifyObservers(new PointerInfo(prePointerInfo.type, prePointerInfo.event, pickInfo), prePointerInfo.type); + this._lastPointerEvents[pointerEvent.pointerId] = true; + } + } + /** + * Renders the utility layers scene on top of the original scene + */ + render() { + this._updateCamera(); + if (this.utilityLayerScene.activeCamera) { + const oldScene = this.utilityLayerScene.activeCamera.getScene(); + const camera = this.utilityLayerScene.activeCamera; + camera._scene = this.utilityLayerScene; + if (camera.leftCamera) { + camera.leftCamera._scene = this.utilityLayerScene; } - if (defines.BAKED_VERTEX_ANIMATION_TEXTURE) { - (_a = mesh.bakedVertexAnimationManager) == null ? void 0 : _a.bind(effect, defines.INSTANCES); + if (camera.rightCamera) { + camera.rightCamera._scene = this.utilityLayerScene; } - if (this.useLogarithmicDepth) { - BindLogDepth(defines, effect, scene); + this.utilityLayerScene.render(false); + camera._scene = oldScene; + if (camera.leftCamera) { + camera.leftCamera._scene = oldScene; } - if (this._imageProcessingConfiguration && !this._imageProcessingConfiguration.applyByPostProcess) { - this._imageProcessingConfiguration.bind(this._activeEffect); + if (camera.rightCamera) { + camera.rightCamera._scene = oldScene; } } - this._afterBind(mesh, this._activeEffect, subMesh); - ubo.update(); } /** - * Get the list of animatables in the material. - * @returns the list of animatables object used in the material + * Disposes of the renderer */ - getAnimatables() { - const results = super.getAnimatables(); - if (this._diffuseTexture && this._diffuseTexture.animations && this._diffuseTexture.animations.length > 0) { - results.push(this._diffuseTexture); - } - if (this._ambientTexture && this._ambientTexture.animations && this._ambientTexture.animations.length > 0) { - results.push(this._ambientTexture); - } - if (this._opacityTexture && this._opacityTexture.animations && this._opacityTexture.animations.length > 0) { - results.push(this._opacityTexture); - } - if (this._reflectionTexture && this._reflectionTexture.animations && this._reflectionTexture.animations.length > 0) { - results.push(this._reflectionTexture); - } - if (this._emissiveTexture && this._emissiveTexture.animations && this._emissiveTexture.animations.length > 0) { - results.push(this._emissiveTexture); - } - if (this._specularTexture && this._specularTexture.animations && this._specularTexture.animations.length > 0) { - results.push(this._specularTexture); - } - if (this._bumpTexture && this._bumpTexture.animations && this._bumpTexture.animations.length > 0) { - results.push(this._bumpTexture); + dispose() { + this.onPointerOutObservable.clear(); + if (this._afterRenderObserver) { + this.originalScene.onAfterCameraRenderObservable.remove(this._afterRenderObserver); } - if (this._lightmapTexture && this._lightmapTexture.animations && this._lightmapTexture.animations.length > 0) { - results.push(this._lightmapTexture); + if (this._sceneDisposeObserver) { + this.originalScene.onDisposeObservable.remove(this._sceneDisposeObserver); } - if (this._refractionTexture && this._refractionTexture.animations && this._refractionTexture.animations.length > 0) { - results.push(this._refractionTexture); + if (this._originalPointerObserver) { + this.originalScene.onPrePointerObservable.remove(this._originalPointerObserver); } - return results; + this.utilityLayerScene.dispose(); + } + _updateCamera() { + this.utilityLayerScene.cameraToUseForPointers = this.getRenderCamera(); + this.utilityLayerScene.activeCamera = this.getRenderCamera(); } +}; +UtilityLayerRenderer._DefaultUtilityLayer = null; +UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = null; + +// node_modules/@babylonjs/core/Gizmos/gizmo.js +var GizmoAnchorPoint; +(function(GizmoAnchorPoint2) { + GizmoAnchorPoint2[GizmoAnchorPoint2["Origin"] = 0] = "Origin"; + GizmoAnchorPoint2[GizmoAnchorPoint2["Pivot"] = 1] = "Pivot"; +})(GizmoAnchorPoint || (GizmoAnchorPoint = {})); +var GizmoCoordinatesMode; +(function(GizmoCoordinatesMode2) { + GizmoCoordinatesMode2[GizmoCoordinatesMode2["World"] = 0] = "World"; + GizmoCoordinatesMode2[GizmoCoordinatesMode2["Local"] = 1] = "Local"; +})(GizmoCoordinatesMode || (GizmoCoordinatesMode = {})); +var Gizmo = class _Gizmo { /** - * Gets the active textures from the material - * @returns an array of textures + * Ratio for the scale of the gizmo (Default: 1) */ - getActiveTextures() { - const activeTextures = super.getActiveTextures(); - if (this._diffuseTexture) { - activeTextures.push(this._diffuseTexture); - } - if (this._ambientTexture) { - activeTextures.push(this._ambientTexture); - } - if (this._opacityTexture) { - activeTextures.push(this._opacityTexture); - } - if (this._reflectionTexture) { - activeTextures.push(this._reflectionTexture); - } - if (this._emissiveTexture) { - activeTextures.push(this._emissiveTexture); - } - if (this._specularTexture) { - activeTextures.push(this._specularTexture); - } - if (this._bumpTexture) { - activeTextures.push(this._bumpTexture); - } - if (this._lightmapTexture) { - activeTextures.push(this._lightmapTexture); - } - if (this._refractionTexture) { - activeTextures.push(this._refractionTexture); - } - return activeTextures; + set scaleRatio(value) { + this._scaleRatio = value; + } + get scaleRatio() { + return this._scaleRatio; } /** - * Specifies if the material uses a texture - * @param texture defines the texture to check against the material - * @returns a boolean specifying if the material uses the texture + * True when the mouse pointer is hovered a gizmo mesh */ - hasTexture(texture) { - if (super.hasTexture(texture)) { - return true; - } - if (this._diffuseTexture === texture) { - return true; - } - if (this._ambientTexture === texture) { - return true; - } - if (this._opacityTexture === texture) { - return true; - } - if (this._reflectionTexture === texture) { - return true; - } - if (this._emissiveTexture === texture) { - return true; + get isHovered() { + return this._isHovered; + } + /** + * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged) + * * When set, interactions will be enabled + */ + get attachedMesh() { + return this._attachedMesh; + } + set attachedMesh(value) { + this._attachedMesh = value; + if (value) { + this._attachedNode = value; } - if (this._specularTexture === texture) { - return true; + this._rootMesh.setEnabled(value ? true : false); + this._attachedNodeChanged(value); + } + /** + * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged) + * * When set, interactions will be enabled + */ + get attachedNode() { + return this._attachedNode; + } + set attachedNode(value) { + this._attachedNode = value; + this._attachedMesh = null; + this._rootMesh.setEnabled(value ? true : false); + this._attachedNodeChanged(value); + } + /** + * Disposes and replaces the current meshes in the gizmo with the specified mesh + * @param mesh The mesh to replace the default mesh of the gizmo + */ + setCustomMesh(mesh) { + if (mesh.getScene() != this.gizmoLayer.utilityLayerScene) { + throw "When setting a custom mesh on a gizmo, the custom meshes scene must be the same as the gizmos (eg. gizmo.gizmoLayer.utilityLayerScene)"; } - if (this._bumpTexture === texture) { - return true; + this._rootMesh.getChildMeshes().forEach((c) => { + c.dispose(); + }); + mesh.parent = this._rootMesh; + this._customMeshSet = true; + } + /** + * Additional transform applied to the gizmo. + * It's useful when the gizmo is attached to a bone: if the bone is part of a skeleton attached to a mesh, you should define the mesh as additionalTransformNode if you want the gizmo to be displayed at the bone's correct location. + * Otherwise, as the gizmo is relative to the skeleton root, the mesh transformation will not be taken into account. + */ + get additionalTransformNode() { + return this._additionalTransformNode; + } + set additionalTransformNode(value) { + this._additionalTransformNode = value; + } + /** + * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true) + * NOTE: This is only possible for meshes with uniform scaling, as otherwise it's not possible to decompose the rotation + */ + set updateGizmoRotationToMatchAttachedMesh(value) { + this._updateGizmoRotationToMatchAttachedMesh = value; + } + get updateGizmoRotationToMatchAttachedMesh() { + return this._updateGizmoRotationToMatchAttachedMesh; + } + /** + * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true) + */ + set updateGizmoPositionToMatchAttachedMesh(value) { + this._updateGizmoPositionToMatchAttachedMesh = value; + } + get updateGizmoPositionToMatchAttachedMesh() { + return this._updateGizmoPositionToMatchAttachedMesh; + } + /** + * Defines where the gizmo will be positioned if `updateGizmoPositionToMatchAttachedMesh` is enabled. + * (Default: GizmoAnchorPoint.Origin) + */ + set anchorPoint(value) { + this._anchorPoint = value; + } + get anchorPoint() { + return this._anchorPoint; + } + /** + * Set the coordinate system to use. By default it's local. + * But it's possible for a user to tweak so its local for translation and world for rotation. + * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh` + */ + set coordinatesMode(coordinatesMode) { + this._coordinatesMode = coordinatesMode; + const local = coordinatesMode == GizmoCoordinatesMode.Local; + this.updateGizmoRotationToMatchAttachedMesh = local; + this.updateGizmoPositionToMatchAttachedMesh = true; + } + get coordinatesMode() { + return this._coordinatesMode; + } + /** + * When set, the gizmo will always appear the same size no matter where the camera is (default: true) + */ + set updateScale(value) { + this._updateScale = value; + } + get updateScale() { + return this._updateScale; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _attachedNodeChanged(value) { + } + /** + * Creates a gizmo + * @param gizmoLayer The utility layer the gizmo will be added to + */ + constructor(gizmoLayer = UtilityLayerRenderer.DefaultUtilityLayer) { + this.gizmoLayer = gizmoLayer; + this._attachedMesh = null; + this._attachedNode = null; + this._customRotationQuaternion = null; + this._scaleRatio = 1; + this._isHovered = false; + this._customMeshSet = false; + this._updateGizmoRotationToMatchAttachedMesh = true; + this._updateGizmoPositionToMatchAttachedMesh = true; + this._anchorPoint = GizmoAnchorPoint.Origin; + this._updateScale = true; + this._coordinatesMode = GizmoCoordinatesMode.Local; + this._interactionsEnabled = true; + this._rightHandtoLeftHandMatrix = Matrix.RotationY(Math.PI); + this._rootMesh = new Mesh("gizmoRootNode", gizmoLayer.utilityLayerScene); + this._rootMesh.rotationQuaternion = Quaternion.Identity(); + this._beforeRenderObserver = this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.add(() => { + this._update(); + }); + } + /** + * posture that the gizmo will be display + * When set null, default value will be used (Quaternion(0, 0, 0, 1)) + */ + get customRotationQuaternion() { + return this._customRotationQuaternion; + } + set customRotationQuaternion(customRotationQuaternion) { + this._customRotationQuaternion = customRotationQuaternion; + } + /** + * Updates the gizmo to match the attached mesh's position/rotation + */ + _update() { + if (this.attachedNode) { + let effectiveNode = this.attachedNode; + if (this.attachedMesh) { + effectiveNode = this.attachedMesh || this.attachedNode; + } + if (this.updateGizmoPositionToMatchAttachedMesh) { + if (this.anchorPoint == GizmoAnchorPoint.Pivot && effectiveNode.getAbsolutePivotPoint) { + const position = effectiveNode.getAbsolutePivotPoint(); + this._rootMesh.position.copyFrom(position); + } else { + const row = effectiveNode.getWorldMatrix().getRow(3); + const position = row ? row.toVector3() : new Vector3(0, 0, 0); + this._rootMesh.position.copyFrom(position); + } + } + if (this.updateGizmoRotationToMatchAttachedMesh) { + const supportedNode = effectiveNode._isMesh || effectiveNode.getClassName() === "AbstractMesh" || effectiveNode.getClassName() === "TransformNode" || effectiveNode.getClassName() === "InstancedMesh"; + const transformNode = supportedNode ? effectiveNode : void 0; + effectiveNode.getWorldMatrix().decompose(void 0, this._rootMesh.rotationQuaternion, void 0, _Gizmo.PreserveScaling ? transformNode : void 0); + this._rootMesh.rotationQuaternion.normalize(); + } else { + if (this._customRotationQuaternion) { + this._rootMesh.rotationQuaternion.copyFrom(this._customRotationQuaternion); + } else { + this._rootMesh.rotationQuaternion.set(0, 0, 0, 1); + } + } + if (this.updateScale) { + const activeCamera = this.gizmoLayer.utilityLayerScene.activeCamera; + const cameraPosition = activeCamera.globalPosition; + this._rootMesh.position.subtractToRef(cameraPosition, TmpVectors.Vector3[0]); + let scale = this.scaleRatio; + if (activeCamera.mode == Camera.ORTHOGRAPHIC_CAMERA) { + if (activeCamera.orthoTop && activeCamera.orthoBottom) { + const orthoHeight = activeCamera.orthoTop - activeCamera.orthoBottom; + scale *= orthoHeight; + } + } else { + const camForward = activeCamera.getScene().useRightHandedSystem ? Vector3.RightHandedForwardReadOnly : Vector3.LeftHandedForwardReadOnly; + const direction = activeCamera.getDirection(camForward); + scale *= Vector3.Dot(TmpVectors.Vector3[0], direction); + } + this._rootMesh.scaling.setAll(scale); + if (effectiveNode._getWorldMatrixDeterminant() < 0 && !_Gizmo.PreserveScaling) { + this._rootMesh.scaling.y *= -1; + } + } else { + this._rootMesh.scaling.setAll(this.scaleRatio); + } } - if (this._lightmapTexture === texture) { - return true; + if (this.additionalTransformNode) { + this._rootMesh.computeWorldMatrix(true); + this._rootMesh.getWorldMatrix().multiplyToRef(this.additionalTransformNode.getWorldMatrix(), TmpVectors.Matrix[0]); + TmpVectors.Matrix[0].decompose(this._rootMesh.scaling, this._rootMesh.rotationQuaternion, this._rootMesh.position); } - if (this._refractionTexture === texture) { - return true; + } + /** + * if transform has a pivot and is not using PostMultiplyPivotMatrix, then the worldMatrix contains the pivot matrix (it's not cancelled at the end) + * so, when extracting the world matrix component, the translation (and other components) is containing the pivot translation. + * And the pivot is applied each frame. Removing it anyway here makes it applied only in computeWorldMatrix. + * @param transform local transform that needs to be transform by the pivot inverse matrix + * @param localMatrix local matrix that needs to be transform by the pivot inverse matrix + * @param result resulting matrix transformed by pivot inverse if the transform node is using pivot without using post Multiply Pivot Matrix + */ + _handlePivotMatrixInverse(transform, localMatrix, result) { + if (transform.isUsingPivotMatrix() && !transform.isUsingPostMultiplyPivotMatrix()) { + transform.getPivotMatrix().invertToRef(TmpVectors.Matrix[5]); + TmpVectors.Matrix[5].multiplyToRef(localMatrix, result); + return; } - return false; + result.copyFrom(localMatrix); } /** - * Disposes the material - * @param forceDisposeEffect specifies if effects should be forcefully disposed - * @param forceDisposeTextures specifies if textures should be forcefully disposed + * computes the rotation/scaling/position of the transform once the Node world matrix has changed. */ - dispose(forceDisposeEffect, forceDisposeTextures) { - var _a, _b, _c, _d, _e, _f, _g, _h, _i; - if (forceDisposeTextures) { - (_a = this._diffuseTexture) == null ? void 0 : _a.dispose(); - (_b = this._ambientTexture) == null ? void 0 : _b.dispose(); - (_c = this._opacityTexture) == null ? void 0 : _c.dispose(); - (_d = this._reflectionTexture) == null ? void 0 : _d.dispose(); - (_e = this._emissiveTexture) == null ? void 0 : _e.dispose(); - (_f = this._specularTexture) == null ? void 0 : _f.dispose(); - (_g = this._bumpTexture) == null ? void 0 : _g.dispose(); - (_h = this._lightmapTexture) == null ? void 0 : _h.dispose(); - (_i = this._refractionTexture) == null ? void 0 : _i.dispose(); + _matrixChanged() { + if (!this._attachedNode) { + return; } - if (this._imageProcessingConfiguration && this._imageProcessingObserver) { - this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver); + if (this._attachedNode._isCamera) { + const camera = this._attachedNode; + let worldMatrix; + let worldMatrixUC; + if (camera.parent) { + const parentInv = TmpVectors.Matrix[1]; + camera.parent._worldMatrix.invertToRef(parentInv); + this._attachedNode._worldMatrix.multiplyToRef(parentInv, TmpVectors.Matrix[0]); + worldMatrix = TmpVectors.Matrix[0]; + } else { + worldMatrix = this._attachedNode._worldMatrix; + } + if (camera.getScene().useRightHandedSystem) { + this._rightHandtoLeftHandMatrix.multiplyToRef(worldMatrix, TmpVectors.Matrix[1]); + worldMatrixUC = TmpVectors.Matrix[1]; + } else { + worldMatrixUC = worldMatrix; + } + worldMatrixUC.decompose(TmpVectors.Vector3[1], TmpVectors.Quaternion[0], TmpVectors.Vector3[0]); + const inheritsTargetCamera = this._attachedNode.getClassName() === "FreeCamera" || this._attachedNode.getClassName() === "FlyCamera" || this._attachedNode.getClassName() === "ArcFollowCamera" || this._attachedNode.getClassName() === "TargetCamera" || this._attachedNode.getClassName() === "TouchCamera" || this._attachedNode.getClassName() === "UniversalCamera"; + if (inheritsTargetCamera) { + const targetCamera = this._attachedNode; + targetCamera.rotation = TmpVectors.Quaternion[0].toEulerAngles(); + if (targetCamera.rotationQuaternion) { + targetCamera.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]); + targetCamera.rotationQuaternion.normalize(); + } + } + camera.position.copyFrom(TmpVectors.Vector3[0]); + } else if (this._attachedNode._isMesh || this._attachedNode.getClassName() === "AbstractMesh" || this._attachedNode.getClassName() === "TransformNode" || this._attachedNode.getClassName() === "InstancedMesh") { + const transform = this._attachedNode; + if (transform.parent) { + const parentInv = TmpVectors.Matrix[0]; + const localMat = TmpVectors.Matrix[1]; + transform.parent.getWorldMatrix().invertToRef(parentInv); + this._attachedNode.getWorldMatrix().multiplyToRef(parentInv, localMat); + const matrixToDecompose = TmpVectors.Matrix[4]; + this._handlePivotMatrixInverse(transform, localMat, matrixToDecompose); + matrixToDecompose.decompose(TmpVectors.Vector3[0], TmpVectors.Quaternion[0], transform.position, _Gizmo.PreserveScaling ? transform : void 0, _Gizmo.UseAbsoluteScaling); + TmpVectors.Quaternion[0].normalize(); + if (transform.isUsingPivotMatrix()) { + const r = TmpVectors.Quaternion[1]; + Quaternion.RotationYawPitchRollToRef(transform.rotation.y, transform.rotation.x, transform.rotation.z, r); + const scaleMatrix = TmpVectors.Matrix[2]; + Matrix.ScalingToRef(transform.scaling.x, transform.scaling.y, transform.scaling.z, scaleMatrix); + const rotationMatrix = TmpVectors.Matrix[2]; + r.toRotationMatrix(rotationMatrix); + const pivotMatrix = transform.getPivotMatrix(); + const invPivotMatrix = TmpVectors.Matrix[3]; + pivotMatrix.invertToRef(invPivotMatrix); + pivotMatrix.multiplyToRef(scaleMatrix, TmpVectors.Matrix[4]); + TmpVectors.Matrix[4].multiplyToRef(rotationMatrix, TmpVectors.Matrix[5]); + TmpVectors.Matrix[5].multiplyToRef(invPivotMatrix, TmpVectors.Matrix[6]); + TmpVectors.Matrix[6].getTranslationToRef(TmpVectors.Vector3[1]); + transform.position.subtractInPlace(TmpVectors.Vector3[1]); + } + } else { + const matrixToDecompose = TmpVectors.Matrix[4]; + this._handlePivotMatrixInverse(transform, this._attachedNode._worldMatrix, matrixToDecompose); + matrixToDecompose.decompose(TmpVectors.Vector3[0], TmpVectors.Quaternion[0], transform.position, _Gizmo.PreserveScaling ? transform : void 0, _Gizmo.UseAbsoluteScaling); + } + TmpVectors.Vector3[0].scaleInPlace(1 / transform.scalingDeterminant); + transform.scaling.copyFrom(TmpVectors.Vector3[0]); + if (!transform.billboardMode) { + if (transform.rotationQuaternion) { + transform.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]); + transform.rotationQuaternion.normalize(); + } else { + transform.rotation = TmpVectors.Quaternion[0].toEulerAngles(); + } + } + } else if (this._attachedNode.getClassName() === "Bone") { + const bone = this._attachedNode; + const parent = bone.getParent(); + if (parent) { + const invParent = TmpVectors.Matrix[0]; + const boneLocalMatrix = TmpVectors.Matrix[1]; + parent.getFinalMatrix().invertToRef(invParent); + bone.getFinalMatrix().multiplyToRef(invParent, boneLocalMatrix); + const lmat = bone.getLocalMatrix(); + lmat.copyFrom(boneLocalMatrix); + } else { + const lmat = bone.getLocalMatrix(); + lmat.copyFrom(bone.getFinalMatrix()); + } + bone.markAsDirty(); + } else { + const light = this._attachedNode; + if (light.getTypeID) { + const type = light.getTypeID(); + if (type === Light.LIGHTTYPEID_DIRECTIONALLIGHT || type === Light.LIGHTTYPEID_SPOTLIGHT || type === Light.LIGHTTYPEID_POINTLIGHT) { + const parent = light.parent; + if (parent) { + const invParent = TmpVectors.Matrix[0]; + const nodeLocalMatrix = TmpVectors.Matrix[1]; + parent.getWorldMatrix().invertToRef(invParent); + light.getWorldMatrix().multiplyToRef(invParent, nodeLocalMatrix); + nodeLocalMatrix.decompose(void 0, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]); + } else { + this._attachedNode._worldMatrix.decompose(void 0, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]); + } + light.position = new Vector3(TmpVectors.Vector3[0].x, TmpVectors.Vector3[0].y, TmpVectors.Vector3[0].z); + if (light.direction) { + light.direction = new Vector3(light.direction.x, light.direction.y, light.direction.z); + } + } + } } - super.dispose(forceDisposeEffect, forceDisposeTextures); } /** - * Makes a duplicate of the material, and gives it a new name - * @param name defines the new name for the duplicated material - * @param cloneTexturesOnlyOnce - if a texture is used in more than one channel (e.g diffuse and opacity), only clone it once and reuse it on the other channels. Default false. - * @param rootUrl defines the root URL to use to load textures - * @returns the cloned material - */ - clone(name69, cloneTexturesOnlyOnce = true, rootUrl = "") { - const result = SerializationHelper.Clone(() => new _StandardMaterial(name69, this.getScene()), this, { cloneTexturesOnlyOnce }); - result.name = name69; - result.id = name69; - this.stencil.copyTo(result.stencil); - this._clonePlugins(result, rootUrl); - return result; - } - /** - * Creates a standard material from parsed material data - * @param source defines the JSON representation of the material - * @param scene defines the hosting scene - * @param rootUrl defines the root URL to use to load textures and relative dependencies - * @returns a new standard material + * refresh gizmo mesh material + * @param gizmoMeshes + * @param material material to apply */ - static Parse(source, scene, rootUrl) { - const material = SerializationHelper.Parse(() => new _StandardMaterial(source.name, scene), source, scene, rootUrl); - if (source.stencil) { - material.stencil.parse(source.stencil, scene, rootUrl); + _setGizmoMeshMaterial(gizmoMeshes, material) { + if (gizmoMeshes) { + gizmoMeshes.forEach((m) => { + m.material = material; + if (m.color) { + m.color = material.diffuseColor; + } + }); } - Material._ParsePlugins(source, material, scene, rootUrl); - return material; - } - // Flags used to enable or disable a type of texture for all Standard Materials - /** - * Are diffuse textures enabled in the application. - */ - static get DiffuseTextureEnabled() { - return MaterialFlags.DiffuseTextureEnabled; - } - static set DiffuseTextureEnabled(value) { - MaterialFlags.DiffuseTextureEnabled = value; - } - /** - * Are detail textures enabled in the application. - */ - static get DetailTextureEnabled() { - return MaterialFlags.DetailTextureEnabled; - } - static set DetailTextureEnabled(value) { - MaterialFlags.DetailTextureEnabled = value; - } - /** - * Are ambient textures enabled in the application. - */ - static get AmbientTextureEnabled() { - return MaterialFlags.AmbientTextureEnabled; - } - static set AmbientTextureEnabled(value) { - MaterialFlags.AmbientTextureEnabled = value; - } - /** - * Are opacity textures enabled in the application. - */ - static get OpacityTextureEnabled() { - return MaterialFlags.OpacityTextureEnabled; - } - static set OpacityTextureEnabled(value) { - MaterialFlags.OpacityTextureEnabled = value; - } - /** - * Are reflection textures enabled in the application. - */ - static get ReflectionTextureEnabled() { - return MaterialFlags.ReflectionTextureEnabled; - } - static set ReflectionTextureEnabled(value) { - MaterialFlags.ReflectionTextureEnabled = value; - } - /** - * Are emissive textures enabled in the application. - */ - static get EmissiveTextureEnabled() { - return MaterialFlags.EmissiveTextureEnabled; - } - static set EmissiveTextureEnabled(value) { - MaterialFlags.EmissiveTextureEnabled = value; - } - /** - * Are specular textures enabled in the application. - */ - static get SpecularTextureEnabled() { - return MaterialFlags.SpecularTextureEnabled; - } - static set SpecularTextureEnabled(value) { - MaterialFlags.SpecularTextureEnabled = value; - } - /** - * Are bump textures enabled in the application. - */ - static get BumpTextureEnabled() { - return MaterialFlags.BumpTextureEnabled; - } - static set BumpTextureEnabled(value) { - MaterialFlags.BumpTextureEnabled = value; } /** - * Are lightmap textures enabled in the application. + * Subscribes to pointer up, down, and hover events. Used for responsive gizmos. + * @param gizmoLayer The utility layer the gizmo will be added to + * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI + * @returns {Observer} pointerObserver */ - static get LightmapTextureEnabled() { - return MaterialFlags.LightmapTextureEnabled; - } - static set LightmapTextureEnabled(value) { - MaterialFlags.LightmapTextureEnabled = value; + static GizmoAxisPointerObserver(gizmoLayer, gizmoAxisCache) { + let dragging = false; + const pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => { + var _a, _b; + if (pointerInfo.pickInfo) { + if (pointerInfo.type === PointerEventTypes.POINTERMOVE) { + if (dragging) { + return; + } + gizmoAxisCache.forEach((cache) => { + var _a2, _b2; + if (cache.colliderMeshes && cache.gizmoMeshes) { + const isHovered = ((_b2 = cache.colliderMeshes) == null ? void 0 : _b2.indexOf((_a2 = pointerInfo == null ? void 0 : pointerInfo.pickInfo) == null ? void 0 : _a2.pickedMesh)) != -1; + const material = cache.dragBehavior.enabled ? isHovered || cache.active ? cache.hoverMaterial : cache.material : cache.disableMaterial; + cache.gizmoMeshes.forEach((m) => { + m.material = material; + if (m.color) { + m.color = material.diffuseColor; + } + }); + } + }); + } + if (pointerInfo.type === PointerEventTypes.POINTERDOWN) { + if (gizmoAxisCache.has((_a = pointerInfo.pickInfo.pickedMesh) == null ? void 0 : _a.parent)) { + dragging = true; + const statusMap = gizmoAxisCache.get((_b = pointerInfo.pickInfo.pickedMesh) == null ? void 0 : _b.parent); + statusMap.active = true; + gizmoAxisCache.forEach((cache) => { + var _a2, _b2; + const isHovered = ((_b2 = cache.colliderMeshes) == null ? void 0 : _b2.indexOf((_a2 = pointerInfo == null ? void 0 : pointerInfo.pickInfo) == null ? void 0 : _a2.pickedMesh)) != -1; + const material = (isHovered || cache.active) && cache.dragBehavior.enabled ? cache.hoverMaterial : cache.disableMaterial; + cache.gizmoMeshes.forEach((m) => { + m.material = material; + if (m.color) { + m.color = material.diffuseColor; + } + }); + }); + } + } + if (pointerInfo.type === PointerEventTypes.POINTERUP) { + gizmoAxisCache.forEach((cache) => { + cache.active = false; + dragging = false; + cache.gizmoMeshes.forEach((m) => { + m.material = cache.dragBehavior.enabled ? cache.material : cache.disableMaterial; + if (m.color) { + m.color = cache.material.diffuseColor; + } + }); + }); + } + } + }); + return pointerObserver; } /** - * Are refraction textures enabled in the application. + * Disposes of the gizmo */ - static get RefractionTextureEnabled() { - return MaterialFlags.RefractionTextureEnabled; - } - static set RefractionTextureEnabled(value) { - MaterialFlags.RefractionTextureEnabled = value; + dispose() { + this._rootMesh.dispose(); + if (this._beforeRenderObserver) { + this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.remove(this._beforeRenderObserver); + } } +}; +Gizmo.PreserveScaling = false; +Gizmo.UseAbsoluteScaling = true; + +// node_modules/@babylonjs/core/Misc/pivotTools.js +var PivotTools = class _PivotTools { /** - * Are color grading textures enabled in the application. + * @internal */ - static get ColorGradingTextureEnabled() { - return MaterialFlags.ColorGradingTextureEnabled; - } - static set ColorGradingTextureEnabled(value) { - MaterialFlags.ColorGradingTextureEnabled = value; + static _RemoveAndStorePivotPoint(mesh) { + if (mesh && _PivotTools._PivotCached === 0) { + mesh.getPivotPointToRef(_PivotTools._OldPivotPoint); + _PivotTools._PivotPostMultiplyPivotMatrix = mesh._postMultiplyPivotMatrix; + if (!_PivotTools._OldPivotPoint.equalsToFloats(0, 0, 0)) { + mesh.setPivotMatrix(Matrix.IdentityReadOnly); + _PivotTools._OldPivotPoint.subtractToRef(mesh.getPivotPoint(), _PivotTools._PivotTranslation); + _PivotTools._PivotTmpVector.copyFromFloats(1, 1, 1); + _PivotTools._PivotTmpVector.subtractInPlace(mesh.scaling); + _PivotTools._PivotTmpVector.multiplyInPlace(_PivotTools._PivotTranslation); + mesh.position.addInPlace(_PivotTools._PivotTmpVector); + } + } + _PivotTools._PivotCached++; } /** - * Are fresnels enabled in the application. + * @internal */ - static get FresnelEnabled() { - return MaterialFlags.FresnelEnabled; - } - static set FresnelEnabled(value) { - MaterialFlags.FresnelEnabled = value; + static _RestorePivotPoint(mesh) { + if (mesh && !_PivotTools._OldPivotPoint.equalsToFloats(0, 0, 0) && _PivotTools._PivotCached === 1) { + mesh.setPivotPoint(_PivotTools._OldPivotPoint); + mesh._postMultiplyPivotMatrix = _PivotTools._PivotPostMultiplyPivotMatrix; + _PivotTools._PivotTmpVector.copyFromFloats(1, 1, 1); + _PivotTools._PivotTmpVector.subtractInPlace(mesh.scaling); + _PivotTools._PivotTmpVector.multiplyInPlace(_PivotTools._PivotTranslation); + mesh.position.subtractInPlace(_PivotTools._PivotTmpVector); + } + this._PivotCached--; } }; -__decorate([ - serializeAsTexture("diffuseTexture") -], StandardMaterial.prototype, "_diffuseTexture", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesAndMiscDirty") -], StandardMaterial.prototype, "diffuseTexture", void 0); -__decorate([ - serializeAsTexture("ambientTexture") -], StandardMaterial.prototype, "_ambientTexture", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "ambientTexture", void 0); -__decorate([ - serializeAsTexture("opacityTexture") -], StandardMaterial.prototype, "_opacityTexture", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesAndMiscDirty") -], StandardMaterial.prototype, "opacityTexture", void 0); -__decorate([ - serializeAsTexture("reflectionTexture") -], StandardMaterial.prototype, "_reflectionTexture", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "reflectionTexture", void 0); -__decorate([ - serializeAsTexture("emissiveTexture") -], StandardMaterial.prototype, "_emissiveTexture", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "emissiveTexture", void 0); -__decorate([ - serializeAsTexture("specularTexture") -], StandardMaterial.prototype, "_specularTexture", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "specularTexture", void 0); -__decorate([ - serializeAsTexture("bumpTexture") -], StandardMaterial.prototype, "_bumpTexture", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "bumpTexture", void 0); -__decorate([ - serializeAsTexture("lightmapTexture") -], StandardMaterial.prototype, "_lightmapTexture", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "lightmapTexture", void 0); -__decorate([ - serializeAsTexture("refractionTexture") -], StandardMaterial.prototype, "_refractionTexture", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "refractionTexture", void 0); -__decorate([ - serializeAsColor3("ambient") -], StandardMaterial.prototype, "ambientColor", void 0); -__decorate([ - serializeAsColor3("diffuse") -], StandardMaterial.prototype, "diffuseColor", void 0); -__decorate([ - serializeAsColor3("specular") -], StandardMaterial.prototype, "specularColor", void 0); -__decorate([ - serializeAsColor3("emissive") -], StandardMaterial.prototype, "emissiveColor", void 0); -__decorate([ - serialize() -], StandardMaterial.prototype, "specularPower", void 0); -__decorate([ - serialize("useAlphaFromDiffuseTexture") -], StandardMaterial.prototype, "_useAlphaFromDiffuseTexture", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesAndMiscDirty") -], StandardMaterial.prototype, "useAlphaFromDiffuseTexture", void 0); -__decorate([ - serialize("useEmissiveAsIllumination") -], StandardMaterial.prototype, "_useEmissiveAsIllumination", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "useEmissiveAsIllumination", void 0); -__decorate([ - serialize("linkEmissiveWithDiffuse") -], StandardMaterial.prototype, "_linkEmissiveWithDiffuse", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "linkEmissiveWithDiffuse", void 0); -__decorate([ - serialize("useSpecularOverAlpha") -], StandardMaterial.prototype, "_useSpecularOverAlpha", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "useSpecularOverAlpha", void 0); -__decorate([ - serialize("useReflectionOverAlpha") -], StandardMaterial.prototype, "_useReflectionOverAlpha", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "useReflectionOverAlpha", void 0); -__decorate([ - serialize("disableLighting") -], StandardMaterial.prototype, "_disableLighting", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsLightsDirty") -], StandardMaterial.prototype, "disableLighting", void 0); -__decorate([ - serialize("useObjectSpaceNormalMap") -], StandardMaterial.prototype, "_useObjectSpaceNormalMap", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "useObjectSpaceNormalMap", void 0); -__decorate([ - serialize("useParallax") -], StandardMaterial.prototype, "_useParallax", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "useParallax", void 0); -__decorate([ - serialize("useParallaxOcclusion") -], StandardMaterial.prototype, "_useParallaxOcclusion", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "useParallaxOcclusion", void 0); -__decorate([ - serialize() -], StandardMaterial.prototype, "parallaxScaleBias", void 0); -__decorate([ - serialize("roughness") -], StandardMaterial.prototype, "_roughness", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "roughness", void 0); -__decorate([ - serialize() -], StandardMaterial.prototype, "indexOfRefraction", void 0); -__decorate([ - serialize() -], StandardMaterial.prototype, "invertRefractionY", void 0); -__decorate([ - serialize() -], StandardMaterial.prototype, "alphaCutOff", void 0); -__decorate([ - serialize("useLightmapAsShadowmap") -], StandardMaterial.prototype, "_useLightmapAsShadowmap", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "useLightmapAsShadowmap", void 0); -__decorate([ - serializeAsFresnelParameters("diffuseFresnelParameters") -], StandardMaterial.prototype, "_diffuseFresnelParameters", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsFresnelDirty") -], StandardMaterial.prototype, "diffuseFresnelParameters", void 0); -__decorate([ - serializeAsFresnelParameters("opacityFresnelParameters") -], StandardMaterial.prototype, "_opacityFresnelParameters", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsFresnelAndMiscDirty") -], StandardMaterial.prototype, "opacityFresnelParameters", void 0); -__decorate([ - serializeAsFresnelParameters("reflectionFresnelParameters") -], StandardMaterial.prototype, "_reflectionFresnelParameters", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsFresnelDirty") -], StandardMaterial.prototype, "reflectionFresnelParameters", void 0); -__decorate([ - serializeAsFresnelParameters("refractionFresnelParameters") -], StandardMaterial.prototype, "_refractionFresnelParameters", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsFresnelDirty") -], StandardMaterial.prototype, "refractionFresnelParameters", void 0); -__decorate([ - serializeAsFresnelParameters("emissiveFresnelParameters") -], StandardMaterial.prototype, "_emissiveFresnelParameters", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsFresnelDirty") -], StandardMaterial.prototype, "emissiveFresnelParameters", void 0); -__decorate([ - serialize("useReflectionFresnelFromSpecular") -], StandardMaterial.prototype, "_useReflectionFresnelFromSpecular", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsFresnelDirty") -], StandardMaterial.prototype, "useReflectionFresnelFromSpecular", void 0); -__decorate([ - serialize("useGlossinessFromSpecularMapAlpha") -], StandardMaterial.prototype, "_useGlossinessFromSpecularMapAlpha", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "useGlossinessFromSpecularMapAlpha", void 0); -__decorate([ - serialize("maxSimultaneousLights") -], StandardMaterial.prototype, "_maxSimultaneousLights", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsLightsDirty") -], StandardMaterial.prototype, "maxSimultaneousLights", void 0); -__decorate([ - serialize("invertNormalMapX") -], StandardMaterial.prototype, "_invertNormalMapX", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "invertNormalMapX", void 0); -__decorate([ - serialize("invertNormalMapY") -], StandardMaterial.prototype, "_invertNormalMapY", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "invertNormalMapY", void 0); -__decorate([ - serialize("twoSidedLighting") -], StandardMaterial.prototype, "_twoSidedLighting", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsTexturesDirty") -], StandardMaterial.prototype, "twoSidedLighting", void 0); -__decorate([ - serialize("applyDecalMapAfterDetailMap") -], StandardMaterial.prototype, "_applyDecalMapAfterDetailMap", void 0); -__decorate([ - expandToProperty("_markAllSubMeshesAsMiscDirty") -], StandardMaterial.prototype, "applyDecalMapAfterDetailMap", void 0); -RegisterClass("BABYLON.StandardMaterial", StandardMaterial); -Scene.DefaultMaterialFactory = (scene) => { - return new StandardMaterial("default material", scene); -}; +PivotTools._PivotCached = 0; +PivotTools._OldPivotPoint = new Vector3(); +PivotTools._PivotTranslation = new Vector3(); +PivotTools._PivotTmpVector = new Vector3(); +PivotTools._PivotPostMultiplyPivotMatrix = false; -// node_modules/@babylonjs/core/Engines/Extensions/engine.dynamicTexture.js -ThinEngine.prototype.createDynamicTexture = function(width, height, generateMipMaps, samplingMode) { - const texture = new InternalTexture(this, InternalTextureSource.Dynamic); - texture.baseWidth = width; - texture.baseHeight = height; - if (generateMipMaps) { - width = this.needPOTTextures ? ThinEngine.GetExponentOfTwo(width, this._caps.maxTextureSize) : width; - height = this.needPOTTextures ? ThinEngine.GetExponentOfTwo(height, this._caps.maxTextureSize) : height; +// node_modules/@babylonjs/core/Materials/shaderMaterial.js +var onCreatedEffectParameters3 = { effect: null, subMesh: null }; +var ShaderMaterial = class _ShaderMaterial extends PushMaterial { + /** + * Instantiate a new shader material. + * The ShaderMaterial object has the necessary methods to pass data from your scene to the Vertex and Fragment Shaders and returns a material that can be applied to any mesh. + * This returned material effects how the mesh will look based on the code in the shaders. + * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/shaders/shaderMaterial + * @param name Define the name of the material in the scene + * @param scene Define the scene the material belongs to + * @param shaderPath Defines the route to the shader code. + * @param options Define the options used to create the shader + * @param storeEffectOnSubMeshes true to store effect on submeshes, false to store the effect directly in the material class. + */ + constructor(name69, scene, shaderPath, options = {}, storeEffectOnSubMeshes = true) { + super(name69, scene, storeEffectOnSubMeshes); + this._textures = {}; + this._textureArrays = {}; + this._externalTextures = {}; + this._floats = {}; + this._ints = {}; + this._uints = {}; + this._floatsArrays = {}; + this._colors3 = {}; + this._colors3Arrays = {}; + this._colors4 = {}; + this._colors4Arrays = {}; + this._vectors2 = {}; + this._vectors3 = {}; + this._vectors4 = {}; + this._quaternions = {}; + this._quaternionsArrays = {}; + this._matrices = {}; + this._matrixArrays = {}; + this._matrices3x3 = {}; + this._matrices2x2 = {}; + this._vectors2Arrays = {}; + this._vectors3Arrays = {}; + this._vectors4Arrays = {}; + this._uniformBuffers = {}; + this._textureSamplers = {}; + this._storageBuffers = {}; + this._cachedWorldViewMatrix = new Matrix(); + this._cachedWorldViewProjectionMatrix = new Matrix(); + this._multiview = false; + this._materialHelperNeedsPreviousMatrices = false; + this._shaderPath = shaderPath; + this._options = { + needAlphaBlending: false, + needAlphaTesting: false, + attributes: ["position", "normal", "uv"], + uniforms: ["worldViewProjection"], + uniformBuffers: [], + samplers: [], + externalTextures: [], + samplerObjects: [], + storageBuffers: [], + defines: [], + useClipPlane: false, + ...options + }; } - texture.width = width; - texture.height = height; - texture.isReady = false; - texture.generateMipMaps = generateMipMaps; - texture.samplingMode = samplingMode; - this.updateTextureSamplingMode(samplingMode, texture); - this._internalTexturesCache.push(texture); - return texture; -}; -ThinEngine.prototype.updateDynamicTexture = function(texture, source, invertY, premulAlpha = false, format, forceBindTexture = false, allowGPUOptimization = false) { - if (!texture) { - return; + /** + * Gets the shader path used to define the shader code + * It can be modified to trigger a new compilation + */ + get shaderPath() { + return this._shaderPath; } - const gl = this._gl; - const target = gl.TEXTURE_2D; - const wasPreviouslyBound = this._bindTextureDirectly(target, texture, true, forceBindTexture); - this._unpackFlipY(invertY === void 0 ? texture.invertY : invertY); - if (premulAlpha) { - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 1); + /** + * Sets the shader path used to define the shader code + * It can be modified to trigger a new compilation + */ + set shaderPath(shaderPath) { + this._shaderPath = shaderPath; } - const textureType = this._getWebGLTextureType(texture.type); - const glformat = this._getInternalFormat(format ? format : texture.format); - const internalFormat = this._getRGBABufferInternalSizedFormat(texture.type, glformat); - gl.texImage2D(target, 0, internalFormat, glformat, textureType, source); - if (texture.generateMipMaps) { - gl.generateMipmap(target); + /** + * Gets the options used to compile the shader. + * They can be modified to trigger a new compilation + */ + get options() { + return this._options; } - if (!wasPreviouslyBound) { - this._bindTextureDirectly(target, null); + /** + * is multiview set to true? + */ + get isMultiview() { + return this._multiview; } - if (premulAlpha) { - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0); + /** + * Gets the current class name of the material e.g. "ShaderMaterial" + * Mainly use in serialization. + * @returns the class name + */ + getClassName() { + return "ShaderMaterial"; } - if (format) { - texture.format = format; + /** + * Specifies if the material will require alpha blending + * @returns a boolean specifying if alpha blending is needed + */ + needAlphaBlending() { + return this.alpha < 1 || this._options.needAlphaBlending; } - texture._dynamicTextureSource = source; - texture._premulAlpha = premulAlpha; - texture.invertY = invertY || false; - texture.isReady = true; -}; - -// node_modules/@babylonjs/core/Materials/Textures/dynamicTexture.js -var DynamicTexture = class _DynamicTexture extends Texture { /** - * Creates a DynamicTexture - * @param name defines the name of the texture - * @param options provides 3 alternatives for width and height of texture, a canvas, object with width and height properties, number for both width and height - * @param scene defines the scene where you want the texture - * @param generateMipMaps defines the use of MinMaps or not (default is false) - * @param samplingMode defines the sampling mode to use (default is Texture.TRILINEAR_SAMPLINGMODE) - * @param format defines the texture format to use (default is Engine.TEXTUREFORMAT_RGBA) - * @param invertY defines if the texture needs to be inverted on the y axis during loading + * Specifies if this material should be rendered in alpha test mode + * @returns a boolean specifying if an alpha test is needed. */ - constructor(name69, options, scene = null, generateMipMaps = false, samplingMode = 3, format = 5, invertY) { - super(null, scene, !generateMipMaps, invertY, samplingMode, void 0, void 0, void 0, void 0, format); - this.name = name69; - this.wrapU = Texture.CLAMP_ADDRESSMODE; - this.wrapV = Texture.CLAMP_ADDRESSMODE; - this._generateMipMaps = generateMipMaps; - const engine = this._getEngine(); - if (!engine) { - return; + needAlphaTesting() { + return this._options.needAlphaTesting; + } + _checkUniform(uniformName) { + if (this._options.uniforms.indexOf(uniformName) === -1) { + this._options.uniforms.push(uniformName); } - if (options.getContext) { - this._canvas = options; - this._ownCanvas = false; - this._texture = engine.createDynamicTexture(options.width, options.height, generateMipMaps, samplingMode); - } else { - this._canvas = engine.createCanvas(1, 1); - this._ownCanvas = true; - if (options.width || options.width === 0) { - this._texture = engine.createDynamicTexture(options.width, options.height, generateMipMaps, samplingMode); - } else { - this._texture = engine.createDynamicTexture(options, options, generateMipMaps, samplingMode); - } + } + /** + * Set a texture in the shader. + * @param name Define the name of the uniform samplers as defined in the shader + * @param texture Define the texture to bind to this sampler + * @returns the material itself allowing "fluent" like uniform updates + */ + setTexture(name69, texture) { + if (this._options.samplers.indexOf(name69) === -1) { + this._options.samplers.push(name69); } - const textureSize = this.getSize(); - if (this._canvas.width !== textureSize.width) { - this._canvas.width = textureSize.width; + this._textures[name69] = texture; + return this; + } + /** + * Set a texture array in the shader. + * @param name Define the name of the uniform sampler array as defined in the shader + * @param textures Define the list of textures to bind to this sampler + * @returns the material itself allowing "fluent" like uniform updates + */ + setTextureArray(name69, textures) { + if (this._options.samplers.indexOf(name69) === -1) { + this._options.samplers.push(name69); } - if (this._canvas.height !== textureSize.height) { - this._canvas.height = textureSize.height; + this._checkUniform(name69); + this._textureArrays[name69] = textures; + return this; + } + /** + * Set an internal texture in the shader. + * @param name Define the name of the uniform samplers as defined in the shader + * @param texture Define the texture to bind to this sampler + * @returns the material itself allowing "fluent" like uniform updates + */ + setExternalTexture(name69, texture) { + if (this._options.externalTextures.indexOf(name69) === -1) { + this._options.externalTextures.push(name69); } - this._context = this._canvas.getContext("2d"); + this._externalTextures[name69] = texture; + return this; } /** - * Get the current class name of the texture useful for serialization or dynamic coding. - * @returns "DynamicTexture" + * Set a float in the shader. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - getClassName() { - return "DynamicTexture"; + setFloat(name69, value) { + this._checkUniform(name69); + this._floats[name69] = value; + return this; } /** - * Gets the current state of canRescale + * Set a int in the shader. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - get canRescale() { - return true; + setInt(name69, value) { + this._checkUniform(name69); + this._ints[name69] = value; + return this; } - _recreate(textureSize) { - this._canvas.width = textureSize.width; - this._canvas.height = textureSize.height; - this.releaseInternalTexture(); - this._texture = this._getEngine().createDynamicTexture(textureSize.width, textureSize.height, this._generateMipMaps, this.samplingMode); + /** + * Set a unsigned int in the shader. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates + */ + setUInt(name69, value) { + this._checkUniform(name69); + this._uints[name69] = value; + return this; } /** - * Scales the texture - * @param ratio the scale factor to apply to both width and height + * Set an array of floats in the shader. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - scale(ratio) { - const textureSize = this.getSize(); - textureSize.width *= ratio; - textureSize.height *= ratio; - this._recreate(textureSize); + setFloats(name69, value) { + this._checkUniform(name69); + this._floatsArrays[name69] = value; + return this; } /** - * Resizes the texture - * @param width the new width - * @param height the new height + * Set a vec3 in the shader from a Color3. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - scaleTo(width, height) { - const textureSize = this.getSize(); - textureSize.width = width; - textureSize.height = height; - this._recreate(textureSize); + setColor3(name69, value) { + this._checkUniform(name69); + this._colors3[name69] = value; + return this; } /** - * Gets the context of the canvas used by the texture - * @returns the canvas context of the dynamic texture + * Set a vec3 array in the shader from a Color3 array. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - getContext() { - return this._context; + setColor3Array(name69, value) { + this._checkUniform(name69); + this._colors3Arrays[name69] = value.reduce((arr, color) => { + color.toArray(arr, arr.length); + return arr; + }, []); + return this; } /** - * Clears the texture - * @param clearColor Defines the clear color to use + * Set a vec4 in the shader from a Color4. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - clear(clearColor) { - const size = this.getSize(); - if (clearColor) { - this._context.fillStyle = clearColor; - } - this._context.clearRect(0, 0, size.width, size.height); + setColor4(name69, value) { + this._checkUniform(name69); + this._colors4[name69] = value; + return this; } /** - * Updates the texture - * @param invertY defines the direction for the Y axis (default is true - y increases downwards) - * @param premulAlpha defines if alpha is stored as premultiplied (default is false) - * @param allowGPUOptimization true to allow some specific GPU optimizations (subject to engine feature "allowGPUOptimizationsForGUI" being true) + * Set a vec4 array in the shader from a Color4 array. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - update(invertY, premulAlpha = false, allowGPUOptimization = false) { - this._getEngine().updateDynamicTexture(this._texture, this._canvas, invertY === void 0 ? true : invertY, premulAlpha, this._format || void 0, void 0, allowGPUOptimization); + setColor4Array(name69, value) { + this._checkUniform(name69); + this._colors4Arrays[name69] = value.reduce((arr, color) => { + color.toArray(arr, arr.length); + return arr; + }, []); + return this; } /** - * Draws text onto the texture - * @param text defines the text to be drawn - * @param x defines the placement of the text from the left - * @param y defines the placement of the text from the top when invertY is true and from the bottom when false - * @param font defines the font to be used with font-style, font-size, font-name - * @param color defines the color used for the text - * @param fillColor defines the color for the canvas, use null to not overwrite canvas (this bleands with the background to replace, use the clear function) - * @param invertY defines the direction for the Y axis (default is true - y increases downwards) - * @param update defines whether texture is immediately update (default is true) + * Set a vec2 in the shader from a Vector2. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - drawText(text, x, y, font, color, fillColor, invertY, update = true) { - const size = this.getSize(); - if (fillColor) { - this._context.fillStyle = fillColor; - this._context.fillRect(0, 0, size.width, size.height); - } - this._context.font = font; - if (x === null || x === void 0) { - const textSize = this._context.measureText(text); - x = (size.width - textSize.width) / 2; - } - if (y === null || y === void 0) { - const fontSize = parseInt(font.replace(/\D/g, "")); - y = size.height / 2 + fontSize / 3.65; - } - this._context.fillStyle = color || ""; - this._context.fillText(text, x, y); - if (update) { - this.update(invertY); - } + setVector2(name69, value) { + this._checkUniform(name69); + this._vectors2[name69] = value; + return this; } /** - * Disposes the dynamic texture. + * Set a vec3 in the shader from a Vector3. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - dispose() { - var _a, _b; - super.dispose(); - if (this._ownCanvas) { - (_b = (_a = this._canvas) == null ? void 0 : _a.remove) == null ? void 0 : _b.call(_a); - } - this._canvas = null; - this._context = null; + setVector3(name69, value) { + this._checkUniform(name69); + this._vectors3[name69] = value; + return this; } /** - * Clones the texture - * @returns the clone of the texture. + * Set a vec4 in the shader from a Vector4. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - clone() { - const scene = this.getScene(); - if (!scene) { - return this; - } - const textureSize = this.getSize(); - const newTexture = new _DynamicTexture(this.name, textureSize, scene, this._generateMipMaps); - newTexture.hasAlpha = this.hasAlpha; - newTexture.level = this.level; - newTexture.wrapU = this.wrapU; - newTexture.wrapV = this.wrapV; - return newTexture; + setVector4(name69, value) { + this._checkUniform(name69); + this._vectors4[name69] = value; + return this; } /** - * Serializes the dynamic texture. The scene should be ready before the dynamic texture is serialized - * @returns a serialized dynamic texture object + * Set a vec4 in the shader from a Quaternion. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - serialize() { - const scene = this.getScene(); - if (scene && !scene.isReady()) { - Logger.Warn("The scene must be ready before serializing the dynamic texture"); - } - const serializationObject = super.serialize(); - if (_DynamicTexture._IsCanvasElement(this._canvas)) { - serializationObject.base64String = this._canvas.toDataURL(); + setQuaternion(name69, value) { + this._checkUniform(name69); + this._quaternions[name69] = value; + return this; + } + /** + * Set a vec4 array in the shader from a Quaternion array. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates + */ + setQuaternionArray(name69, value) { + this._checkUniform(name69); + this._quaternionsArrays[name69] = value.reduce((arr, quaternion) => { + quaternion.toArray(arr, arr.length); + return arr; + }, []); + return this; + } + /** + * Set a mat4 in the shader from a Matrix. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates + */ + setMatrix(name69, value) { + this._checkUniform(name69); + this._matrices[name69] = value; + return this; + } + /** + * Set a float32Array in the shader from a matrix array. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates + */ + setMatrices(name69, value) { + this._checkUniform(name69); + const float32Array = new Float32Array(value.length * 16); + for (let index = 0; index < value.length; index++) { + const matrix = value[index]; + matrix.copyToArray(float32Array, index * 16); } - serializationObject.invertY = this._invertY; - serializationObject.samplingMode = this.samplingMode; - return serializationObject; + this._matrixArrays[name69] = float32Array; + return this; } - static _IsCanvasElement(canvas) { - return canvas.toDataURL !== void 0; + /** + * Set a mat3 in the shader from a Float32Array. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates + */ + setMatrix3x3(name69, value) { + this._checkUniform(name69); + this._matrices3x3[name69] = value; + return this; } - /** @internal */ - _rebuild() { - this.update(); + /** + * Set a mat2 in the shader from a Float32Array. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates + */ + setMatrix2x2(name69, value) { + this._checkUniform(name69); + this._matrices2x2[name69] = value; + return this; } -}; - -// node_modules/@babylonjs/core/Meshes/groundMesh.js -Mesh._GroundMeshParser = (parsedMesh, scene) => { - return GroundMesh.Parse(parsedMesh, scene); -}; -var GroundMesh = class _GroundMesh extends Mesh { - constructor(name69, scene) { - super(name69, scene); - this.generateOctree = false; + /** + * Set a vec2 array in the shader from a number array. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates + */ + setArray2(name69, value) { + this._checkUniform(name69); + this._vectors2Arrays[name69] = value; + return this; } /** - * "GroundMesh" - * @returns "GroundMesh" + * Set a vec3 array in the shader from a number array. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - getClassName() { - return "GroundMesh"; + setArray3(name69, value) { + this._checkUniform(name69); + this._vectors3Arrays[name69] = value; + return this; } /** - * The minimum of x and y subdivisions + * Set a vec4 array in the shader from a number array. + * @param name Define the name of the uniform as defined in the shader + * @param value Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - get subdivisions() { - return Math.min(this._subdivisionsX, this._subdivisionsY); + setArray4(name69, value) { + this._checkUniform(name69); + this._vectors4Arrays[name69] = value; + return this; } /** - * X subdivisions + * Set a uniform buffer in the shader + * @param name Define the name of the uniform as defined in the shader + * @param buffer Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - get subdivisionsX() { - return this._subdivisionsX; + setUniformBuffer(name69, buffer) { + if (this._options.uniformBuffers.indexOf(name69) === -1) { + this._options.uniformBuffers.push(name69); + } + this._uniformBuffers[name69] = buffer; + return this; } /** - * Y subdivisions + * Set a texture sampler in the shader + * @param name Define the name of the uniform as defined in the shader + * @param sampler Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - get subdivisionsY() { - return this._subdivisionsY; + setTextureSampler(name69, sampler) { + if (this._options.samplerObjects.indexOf(name69) === -1) { + this._options.samplerObjects.push(name69); + } + this._textureSamplers[name69] = sampler; + return this; } /** - * This function will divide the mesh into submeshes and update an octree to help to select the right submeshes - * for rendering, picking and collision computations. Please note that you must have a decent number of submeshes - * to get performance improvements when using an octree. - * @param chunksCount the number of submeshes the mesh will be divided into - * @param octreeBlocksSize the maximum size of the octree blocks (Default: 32) + * Set a storage buffer in the shader + * @param name Define the name of the storage buffer as defined in the shader + * @param buffer Define the value to give to the uniform + * @returns the material itself allowing "fluent" like uniform updates */ - optimize(chunksCount, octreeBlocksSize = 32) { - this._subdivisionsX = chunksCount; - this._subdivisionsY = chunksCount; - this.subdivide(chunksCount); - const thisAsAny = this; - if (thisAsAny.createOrUpdateSubmeshesOctree) { - thisAsAny.createOrUpdateSubmeshesOctree(octreeBlocksSize); + setStorageBuffer(name69, buffer) { + if (this._options.storageBuffers.indexOf(name69) === -1) { + this._options.storageBuffers.push(name69); } + this._storageBuffers[name69] = buffer; + return this; } /** - * Returns a height (y) value in the World system : - * the ground altitude at the coordinates (x, z) expressed in the World system. - * @param x x coordinate - * @param z z coordinate - * @returns the ground y position if (x, z) are outside the ground surface. + * Adds, removes, or replaces the specified shader define and value. + * * setDefine("MY_DEFINE", true); // enables a boolean define + * * setDefine("MY_DEFINE", "0.5"); // adds "#define MY_DEFINE 0.5" to the shader (or sets and replaces the value of any existing define with that name) + * * setDefine("MY_DEFINE", false); // disables and removes the define + * Note if the active defines do change, the shader will be recompiled and this can be expensive. + * @param define the define name e.g., "OUTPUT_TO_SRGB" or "#define OUTPUT_TO_SRGB". If the define was passed into the constructor already, the version used should match that, and in either case, it should not include any appended value. + * @param value either the value of the define (e.g. a numerical value) or for booleans, true if the define should be enabled or false if it should be disabled + * @returns the material itself allowing "fluent" like uniform updates */ - getHeightAtCoordinates(x, z) { - const world = this.getWorldMatrix(); - const invMat = TmpVectors.Matrix[5]; - world.invertToRef(invMat); - const tmpVect = TmpVectors.Vector3[8]; - Vector3.TransformCoordinatesFromFloatsToRef(x, 0, z, invMat, tmpVect); - x = tmpVect.x; - z = tmpVect.z; - if (x < this._minX || x >= this._maxX || z <= this._minZ || z > this._maxZ) { - return this.position.y; + setDefine(define, value) { + const defineName = define.trimEnd() + " "; + const existingDefineIdx = this.options.defines.findIndex((x) => x === define || x.startsWith(defineName)); + if (existingDefineIdx >= 0) { + this.options.defines.splice(existingDefineIdx, 1); } - if (!this._heightQuads || this._heightQuads.length == 0) { - this._initHeightQuads(); - this._computeHeightQuads(); + if (typeof value !== "boolean" || value) { + this.options.defines.push(defineName + value); } - const facet = this._getFacetAt(x, z); - const y = -(facet.x * x + facet.z * z + facet.w) / facet.y; - Vector3.TransformCoordinatesFromFloatsToRef(0, y, 0, world, tmpVect); - return tmpVect.y; + return this; } /** - * Returns a normalized vector (Vector3) orthogonal to the ground - * at the ground coordinates (x, z) expressed in the World system. - * @param x x coordinate - * @param z z coordinate - * @returns Vector3(0.0, 1.0, 0.0) if (x, z) are outside the ground surface. + * Specifies that the submesh is ready to be used + * @param mesh defines the mesh to check + * @param subMesh defines which submesh to check + * @param useInstances specifies that instances should be used + * @returns a boolean indicating that the submesh is ready or not */ - getNormalAtCoordinates(x, z) { - const normal = new Vector3(0, 1, 0); - this.getNormalAtCoordinatesToRef(x, z, normal); - return normal; + isReadyForSubMesh(mesh, subMesh, useInstances) { + return this.isReady(mesh, useInstances, subMesh); } /** - * Updates the Vector3 passed a reference with a normalized vector orthogonal to the ground - * at the ground coordinates (x, z) expressed in the World system. - * Doesn't update the reference Vector3 if (x, z) are outside the ground surface. - * @param x x coordinate - * @param z z coordinate - * @param ref vector to store the result - * @returns the GroundMesh. + * Checks if the material is ready to render the requested mesh + * @param mesh Define the mesh to render + * @param useInstances Define whether or not the material is used with instances + * @param subMesh defines which submesh to render + * @returns true if ready, otherwise false */ - getNormalAtCoordinatesToRef(x, z, ref) { - const world = this.getWorldMatrix(); - const tmpMat = TmpVectors.Matrix[5]; - world.invertToRef(tmpMat); - const tmpVect = TmpVectors.Vector3[8]; - Vector3.TransformCoordinatesFromFloatsToRef(x, 0, z, tmpMat, tmpVect); - x = tmpVect.x; - z = tmpVect.z; - if (x < this._minX || x > this._maxX || z < this._minZ || z > this._maxZ) { - return this; + isReady(mesh, useInstances, subMesh) { + const storeEffectOnSubMeshes = subMesh && this._storeEffectOnSubMeshes; + if (this.isFrozen) { + const drawWrapper2 = storeEffectOnSubMeshes ? subMesh._drawWrapper : this._drawWrapper; + if (drawWrapper2.effect && drawWrapper2._wasPreviouslyReady && drawWrapper2._wasPreviouslyUsingInstances === useInstances) { + return true; + } } - if (!this._heightQuads || this._heightQuads.length == 0) { - this._initHeightQuads(); - this._computeHeightQuads(); + const scene = this.getScene(); + const engine = scene.getEngine(); + const defines = []; + const attribs = []; + const fallbacks = new EffectFallbacks(); + let shaderName = this._shaderPath, uniforms = this._options.uniforms, uniformBuffers = this._options.uniformBuffers, samplers = this._options.samplers; + if (engine.getCaps().multiview && scene.activeCamera && scene.activeCamera.outputRenderTarget && scene.activeCamera.outputRenderTarget.getViewCount() > 1) { + this._multiview = true; + defines.push("#define MULTIVIEW"); + if (uniforms.indexOf("viewProjection") !== -1 && uniforms.indexOf("viewProjectionR") === -1) { + uniforms.push("viewProjectionR"); + } } - const facet = this._getFacetAt(x, z); - Vector3.TransformNormalFromFloatsToRef(facet.x, facet.y, facet.z, world, ref); - return this; - } - /** - * Force the heights to be recomputed for getHeightAtCoordinates() or getNormalAtCoordinates() - * if the ground has been updated. - * This can be used in the render loop. - * @returns the GroundMesh. - */ - updateCoordinateHeights() { - if (!this._heightQuads || this._heightQuads.length == 0) { - this._initHeightQuads(); + for (let index = 0; index < this._options.defines.length; index++) { + const defineToAdd = this._options.defines[index].indexOf("#define") === 0 ? this._options.defines[index] : `#define ${this._options.defines[index]}`; + defines.push(defineToAdd); } - this._computeHeightQuads(); - return this; - } - // Returns the element "facet" from the heightQuads array relative to (x, z) local coordinates - _getFacetAt(x, z) { - const col = Math.floor((x + this._maxX) * this._subdivisionsX / this._width); - const row = Math.floor(-(z + this._maxZ) * this._subdivisionsY / this._height + this._subdivisionsY); - const quad = this._heightQuads[row * this._subdivisionsX + col]; - let facet; - if (z < quad.slope.x * x + quad.slope.y) { - facet = quad.facet1; + for (let index = 0; index < this._options.attributes.length; index++) { + attribs.push(this._options.attributes[index]); + } + if (mesh && mesh.isVerticesDataPresent(VertexBuffer.ColorKind)) { + if (attribs.indexOf(VertexBuffer.ColorKind) === -1) { + attribs.push(VertexBuffer.ColorKind); + } + defines.push("#define VERTEXCOLOR"); + } + if (useInstances) { + defines.push("#define INSTANCES"); + PushAttributesForInstances(attribs, this._materialHelperNeedsPreviousMatrices); + if (mesh == null ? void 0 : mesh.hasThinInstances) { + defines.push("#define THIN_INSTANCES"); + if (mesh && mesh.isVerticesDataPresent(VertexBuffer.ColorInstanceKind)) { + attribs.push(VertexBuffer.ColorInstanceKind); + defines.push("#define INSTANCESCOLOR"); + } + } + } + if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) { + attribs.push(VertexBuffer.MatricesIndicesKind); + attribs.push(VertexBuffer.MatricesWeightsKind); + if (mesh.numBoneInfluencers > 4) { + attribs.push(VertexBuffer.MatricesIndicesExtraKind); + attribs.push(VertexBuffer.MatricesWeightsExtraKind); + } + const skeleton = mesh.skeleton; + defines.push("#define NUM_BONE_INFLUENCERS " + mesh.numBoneInfluencers); + fallbacks.addCPUSkinningFallback(0, mesh); + if (skeleton.isUsingTextureForMatrices) { + defines.push("#define BONETEXTURE"); + if (uniforms.indexOf("boneTextureWidth") === -1) { + uniforms.push("boneTextureWidth"); + } + if (this._options.samplers.indexOf("boneSampler") === -1) { + this._options.samplers.push("boneSampler"); + } + } else { + defines.push("#define BonesPerMesh " + (skeleton.bones.length + 1)); + if (uniforms.indexOf("mBones") === -1) { + uniforms.push("mBones"); + } + } } else { - facet = quad.facet2; + defines.push("#define NUM_BONE_INFLUENCERS 0"); } - return facet; - } - // Creates and populates the heightMap array with "facet" elements : - // a quad is two triangular facets separated by a slope, so a "facet" element is 1 slope + 2 facets - // slope : Vector2(c, h) = 2D diagonal line equation setting apart two triangular facets in a quad : z = cx + h - // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0 - // facet2 : Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0 - // Returns the GroundMesh. - _initHeightQuads() { - const subdivisionsX = this._subdivisionsX; - const subdivisionsY = this._subdivisionsY; - this._heightQuads = new Array(); - for (let row = 0; row < subdivisionsY; row++) { - for (let col = 0; col < subdivisionsX; col++) { - const quad = { slope: Vector2.Zero(), facet1: new Vector4(0, 0, 0, 0), facet2: new Vector4(0, 0, 0, 0) }; - this._heightQuads[row * subdivisionsX + col] = quad; + let numInfluencers = 0; + const manager = mesh ? mesh.morphTargetManager : null; + if (manager) { + const uv = manager.supportsUVs && defines.indexOf("#define UV1") !== -1; + const tangent = manager.supportsTangents && defines.indexOf("#define TANGENT") !== -1; + const normal = manager.supportsNormals && defines.indexOf("#define NORMAL") !== -1; + numInfluencers = manager.numMaxInfluencers || manager.numInfluencers; + if (uv) { + defines.push("#define MORPHTARGETS_UV"); + } + if (tangent) { + defines.push("#define MORPHTARGETS_TANGENT"); + } + if (normal) { + defines.push("#define MORPHTARGETS_NORMAL"); + } + if (numInfluencers > 0) { + defines.push("#define MORPHTARGETS"); + } + if (manager.isUsingTextureForTargets) { + defines.push("#define MORPHTARGETS_TEXTURE"); + if (uniforms.indexOf("morphTargetTextureIndices") === -1) { + uniforms.push("morphTargetTextureIndices"); + } + if (this._options.samplers.indexOf("morphTargets") === -1) { + this._options.samplers.push("morphTargets"); + } + } + defines.push("#define NUM_MORPH_INFLUENCERS " + numInfluencers); + for (let index = 0; index < numInfluencers; index++) { + attribs.push(VertexBuffer.PositionKind + index); + if (normal) { + attribs.push(VertexBuffer.NormalKind + index); + } + if (tangent) { + attribs.push(VertexBuffer.TangentKind + index); + } + if (uv) { + attribs.push(VertexBuffer.UVKind + "_" + index); + } + } + if (numInfluencers > 0) { + uniforms = uniforms.slice(); + uniforms.push("morphTargetInfluences"); + uniforms.push("morphTargetCount"); + uniforms.push("morphTargetTextureInfo"); + uniforms.push("morphTargetTextureIndices"); } + } else { + defines.push("#define NUM_MORPH_INFLUENCERS 0"); } - return this; - } - // Compute each quad element values and update the heightMap array : - // slope : Vector2(c, h) = 2D diagonal line equation setting apart two triangular facets in a quad : z = cx + h - // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0 - // facet2 : Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0 - // Returns the GroundMesh. - _computeHeightQuads() { - const positions = this.getVerticesData(VertexBuffer.PositionKind); - if (!positions) { - return this; + if (mesh) { + const bvaManager = mesh.bakedVertexAnimationManager; + if (bvaManager && bvaManager.isEnabled) { + defines.push("#define BAKED_VERTEX_ANIMATION_TEXTURE"); + if (uniforms.indexOf("bakedVertexAnimationSettings") === -1) { + uniforms.push("bakedVertexAnimationSettings"); + } + if (uniforms.indexOf("bakedVertexAnimationTextureSizeInverted") === -1) { + uniforms.push("bakedVertexAnimationTextureSizeInverted"); + } + if (uniforms.indexOf("bakedVertexAnimationTime") === -1) { + uniforms.push("bakedVertexAnimationTime"); + } + if (this._options.samplers.indexOf("bakedVertexAnimationTexture") === -1) { + this._options.samplers.push("bakedVertexAnimationTexture"); + } + } + PrepareAttributesForBakedVertexAnimation(attribs, mesh, defines); } - const v1 = TmpVectors.Vector3[3]; - const v2 = TmpVectors.Vector3[2]; - const v3 = TmpVectors.Vector3[1]; - const v4 = TmpVectors.Vector3[0]; - const v1v2 = TmpVectors.Vector3[4]; - const v1v3 = TmpVectors.Vector3[5]; - const v1v4 = TmpVectors.Vector3[6]; - const norm1 = TmpVectors.Vector3[7]; - const norm2 = TmpVectors.Vector3[8]; - let i = 0; - let j = 0; - let k = 0; - let cd = 0; - let h = 0; - let d1 = 0; - let d2 = 0; - const subdivisionsX = this._subdivisionsX; - const subdivisionsY = this._subdivisionsY; - for (let row = 0; row < subdivisionsY; row++) { - for (let col = 0; col < subdivisionsX; col++) { - i = col * 3; - j = row * (subdivisionsX + 1) * 3; - k = (row + 1) * (subdivisionsX + 1) * 3; - v1.x = positions[j + i]; - v1.y = positions[j + i + 1]; - v1.z = positions[j + i + 2]; - v2.x = positions[j + i + 3]; - v2.y = positions[j + i + 4]; - v2.z = positions[j + i + 5]; - v3.x = positions[k + i]; - v3.y = positions[k + i + 1]; - v3.z = positions[k + i + 2]; - v4.x = positions[k + i + 3]; - v4.y = positions[k + i + 4]; - v4.z = positions[k + i + 5]; - cd = (v4.z - v1.z) / (v4.x - v1.x); - h = v1.z - cd * v1.x; - v2.subtractToRef(v1, v1v2); - v3.subtractToRef(v1, v1v3); - v4.subtractToRef(v1, v1v4); - Vector3.CrossToRef(v1v4, v1v3, norm1); - Vector3.CrossToRef(v1v2, v1v4, norm2); - norm1.normalize(); - norm2.normalize(); - d1 = -(norm1.x * v1.x + norm1.y * v1.y + norm1.z * v1.z); - d2 = -(norm2.x * v2.x + norm2.y * v2.y + norm2.z * v2.z); - const quad = this._heightQuads[row * subdivisionsX + col]; - quad.slope.copyFromFloats(cd, h); - quad.facet1.copyFromFloats(norm1.x, norm1.y, norm1.z, d1); - quad.facet2.copyFromFloats(norm2.x, norm2.y, norm2.z, d2); + for (const name69 in this._textures) { + if (!this._textures[name69].isReady()) { + return false; } } - return this; - } - /** - * Serializes this ground mesh - * @param serializationObject object to write serialization to - */ - serialize(serializationObject) { - super.serialize(serializationObject); - serializationObject.subdivisionsX = this._subdivisionsX; - serializationObject.subdivisionsY = this._subdivisionsY; - serializationObject.minX = this._minX; - serializationObject.maxX = this._maxX; - serializationObject.minZ = this._minZ; - serializationObject.maxZ = this._maxZ; - serializationObject.width = this._width; - serializationObject.height = this._height; - } - /** - * Parses a serialized ground mesh - * @param parsedMesh the serialized mesh - * @param scene the scene to create the ground mesh in - * @returns the created ground mesh - */ - static Parse(parsedMesh, scene) { - const result = new _GroundMesh(parsedMesh.name, scene); - result._subdivisionsX = parsedMesh.subdivisionsX || 1; - result._subdivisionsY = parsedMesh.subdivisionsY || 1; - result._minX = parsedMesh.minX; - result._maxX = parsedMesh.maxX; - result._minZ = parsedMesh.minZ; - result._maxZ = parsedMesh.maxZ; - result._width = parsedMesh.width; - result._height = parsedMesh.height; - return result; - } -}; - -// node_modules/@babylonjs/core/Meshes/Builders/groundBuilder.js -function CreateGroundVertexData(options) { - const indices = []; - const positions = []; - const normals = []; - const uvs = []; - let row, col; - const width = options.width || 1; - const height = options.height || 1; - const subdivisionsX = (options.subdivisionsX || options.subdivisions || 1) | 0; - const subdivisionsY = (options.subdivisionsY || options.subdivisions || 1) | 0; - for (row = 0; row <= subdivisionsY; row++) { - for (col = 0; col <= subdivisionsX; col++) { - const position = new Vector3(col * width / subdivisionsX - width / 2, 0, (subdivisionsY - row) * height / subdivisionsY - height / 2); - const normal = new Vector3(0, 1, 0); - positions.push(position.x, position.y, position.z); - normals.push(normal.x, normal.y, normal.z); - uvs.push(col / subdivisionsX, CompatibilityOptions.UseOpenGLOrientationForUV ? row / subdivisionsY : 1 - row / subdivisionsY); + if (mesh && this._shouldTurnAlphaTestOn(mesh)) { + defines.push("#define ALPHATEST"); } - } - for (row = 0; row < subdivisionsY; row++) { - for (col = 0; col < subdivisionsX; col++) { - indices.push(col + 1 + (row + 1) * (subdivisionsX + 1)); - indices.push(col + 1 + row * (subdivisionsX + 1)); - indices.push(col + row * (subdivisionsX + 1)); - indices.push(col + (row + 1) * (subdivisionsX + 1)); - indices.push(col + 1 + (row + 1) * (subdivisionsX + 1)); - indices.push(col + row * (subdivisionsX + 1)); + if (this._options.useClipPlane !== false) { + addClipPlaneUniforms(uniforms); + prepareStringDefinesForClipPlanes(this, scene, defines); } - } - const vertexData = new VertexData(); - vertexData.indices = indices; - vertexData.positions = positions; - vertexData.normals = normals; - vertexData.uvs = uvs; - return vertexData; -} -function CreateTiledGroundVertexData(options) { - const xmin = options.xmin !== void 0 && options.xmin !== null ? options.xmin : -1; - const zmin = options.zmin !== void 0 && options.zmin !== null ? options.zmin : -1; - const xmax = options.xmax !== void 0 && options.xmax !== null ? options.xmax : 1; - const zmax = options.zmax !== void 0 && options.zmax !== null ? options.zmax : 1; - const subdivisions = options.subdivisions || { w: 1, h: 1 }; - const precision = options.precision || { w: 1, h: 1 }; - const indices = []; - const positions = []; - const normals = []; - const uvs = []; - let row, col, tileRow, tileCol; - subdivisions.h = subdivisions.h < 1 ? 1 : subdivisions.h; - subdivisions.w = subdivisions.w < 1 ? 1 : subdivisions.w; - precision.w = precision.w < 1 ? 1 : precision.w; - precision.h = precision.h < 1 ? 1 : precision.h; - const tileSize = { - w: (xmax - xmin) / subdivisions.w, - h: (zmax - zmin) / subdivisions.h - }; - function applyTile(xTileMin, zTileMin, xTileMax, zTileMax) { - const base = positions.length / 3; - const rowLength = precision.w + 1; - for (row = 0; row < precision.h; row++) { - for (col = 0; col < precision.w; col++) { - const square = [base + col + row * rowLength, base + (col + 1) + row * rowLength, base + (col + 1) + (row + 1) * rowLength, base + col + (row + 1) * rowLength]; - indices.push(square[1]); - indices.push(square[2]); - indices.push(square[3]); - indices.push(square[0]); - indices.push(square[1]); - indices.push(square[3]); + if (scene.fogEnabled && (mesh == null ? void 0 : mesh.applyFog) && scene.fogMode !== Scene.FOGMODE_NONE) { + defines.push("#define FOG"); + if (uniforms.indexOf("view") === -1) { + uniforms.push("view"); + } + if (uniforms.indexOf("vFogInfos") === -1) { + uniforms.push("vFogInfos"); + } + if (uniforms.indexOf("vFogColor") === -1) { + uniforms.push("vFogColor"); + } + } + if (this._useLogarithmicDepth) { + defines.push("#define LOGARITHMICDEPTH"); + if (uniforms.indexOf("logarithmicDepthConstant") === -1) { + uniforms.push("logarithmicDepthConstant"); + } + } + if (this.customShaderNameResolve) { + uniforms = uniforms.slice(); + uniformBuffers = uniformBuffers.slice(); + samplers = samplers.slice(); + shaderName = this.customShaderNameResolve(this.name, uniforms, uniformBuffers, samplers, defines, attribs); + } + const drawWrapper = storeEffectOnSubMeshes ? subMesh._getDrawWrapper(void 0, true) : this._drawWrapper; + const previousEffect = (drawWrapper == null ? void 0 : drawWrapper.effect) ?? null; + const previousDefines = (drawWrapper == null ? void 0 : drawWrapper.defines) ?? null; + const join = defines.join("\n"); + let effect = previousEffect; + if (previousDefines !== join) { + effect = engine.createEffect(shaderName, { + attributes: attribs, + uniformsNames: uniforms, + uniformBuffersNames: uniformBuffers, + samplers, + defines: join, + fallbacks, + onCompiled: this.onCompiled, + onError: this.onError, + indexParameters: { maxSimultaneousMorphTargets: numInfluencers }, + shaderLanguage: this._options.shaderLanguage + }, engine); + if (storeEffectOnSubMeshes) { + subMesh.setEffect(effect, join, this._materialContext); + } else if (drawWrapper) { + drawWrapper.setEffect(effect, join); } - } - const position = Vector3.Zero(); - const normal = new Vector3(0, 1, 0); - for (row = 0; row <= precision.h; row++) { - position.z = row * (zTileMax - zTileMin) / precision.h + zTileMin; - for (col = 0; col <= precision.w; col++) { - position.x = col * (xTileMax - xTileMin) / precision.w + xTileMin; - position.y = 0; - positions.push(position.x, position.y, position.z); - normals.push(normal.x, normal.y, normal.z); - uvs.push(col / precision.w, row / precision.h); + if (this._onEffectCreatedObservable) { + onCreatedEffectParameters3.effect = effect; + onCreatedEffectParameters3.subMesh = subMesh ?? (mesh == null ? void 0 : mesh.subMeshes[0]) ?? null; + this._onEffectCreatedObservable.notifyObservers(onCreatedEffectParameters3); } } + drawWrapper._wasPreviouslyUsingInstances = !!useInstances; + if (!(effect == null ? void 0 : effect.isReady())) { + return false; + } + if (previousEffect !== effect) { + scene.resetCachedMaterial(); + } + drawWrapper._wasPreviouslyReady = true; + return true; } - for (tileRow = 0; tileRow < subdivisions.h; tileRow++) { - for (tileCol = 0; tileCol < subdivisions.w; tileCol++) { - applyTile(xmin + tileCol * tileSize.w, zmin + tileRow * tileSize.h, xmin + (tileCol + 1) * tileSize.w, zmin + (tileRow + 1) * tileSize.h); + /** + * Binds the world matrix to the material + * @param world defines the world transformation matrix + * @param effectOverride - If provided, use this effect instead of internal effect + */ + bindOnlyWorldMatrix(world, effectOverride) { + const scene = this.getScene(); + const effect = effectOverride ?? this.getEffect(); + if (!effect) { + return; + } + if (this._options.uniforms.indexOf("world") !== -1) { + effect.setMatrix("world", world); + } + if (this._options.uniforms.indexOf("worldView") !== -1) { + world.multiplyToRef(scene.getViewMatrix(), this._cachedWorldViewMatrix); + effect.setMatrix("worldView", this._cachedWorldViewMatrix); + } + if (this._options.uniforms.indexOf("worldViewProjection") !== -1) { + world.multiplyToRef(scene.getTransformMatrix(), this._cachedWorldViewProjectionMatrix); + effect.setMatrix("worldViewProjection", this._cachedWorldViewProjectionMatrix); + } + if (this._options.uniforms.indexOf("view") !== -1) { + effect.setMatrix("view", scene.getViewMatrix()); } } - const vertexData = new VertexData(); - vertexData.indices = indices; - vertexData.positions = positions; - vertexData.normals = normals; - vertexData.uvs = uvs; - return vertexData; -} -function CreateGroundFromHeightMapVertexData(options) { - const indices = []; - const positions = []; - const normals = []; - const uvs = []; - let row, col; - const filter = options.colorFilter || new Color3(0.3, 0.59, 0.11); - const alphaFilter = options.alphaFilter || 0; - let invert = false; - if (options.minHeight > options.maxHeight) { - invert = true; - const temp = options.maxHeight; - options.maxHeight = options.minHeight; - options.minHeight = temp; + /** + * Binds the submesh to this material by preparing the effect and shader to draw + * @param world defines the world transformation matrix + * @param mesh defines the mesh containing the submesh + * @param subMesh defines the submesh to bind the material to + */ + bindForSubMesh(world, mesh, subMesh) { + var _a; + this.bind(world, mesh, (_a = subMesh._drawWrapperOverride) == null ? void 0 : _a.effect, subMesh); } - for (row = 0; row <= options.subdivisions; row++) { - for (col = 0; col <= options.subdivisions; col++) { - const position = new Vector3(col * options.width / options.subdivisions - options.width / 2, 0, (options.subdivisions - row) * options.height / options.subdivisions - options.height / 2); - const heightMapX = (position.x + options.width / 2) / options.width * (options.bufferWidth - 1) | 0; - const heightMapY = (1 - (position.z + options.height / 2) / options.height) * (options.bufferHeight - 1) | 0; - const pos = (heightMapX + heightMapY * options.bufferWidth) * 4; - let r = options.buffer[pos] / 255; - let g = options.buffer[pos + 1] / 255; - let b = options.buffer[pos + 2] / 255; - const a = options.buffer[pos + 3] / 255; - if (invert) { - r = 1 - r; - g = 1 - g; - b = 1 - b; + /** + * Binds the material to the mesh + * @param world defines the world transformation matrix + * @param mesh defines the mesh to bind the material to + * @param effectOverride - If provided, use this effect instead of internal effect + * @param subMesh defines the submesh to bind the material to + */ + bind(world, mesh, effectOverride, subMesh) { + var _a; + const storeEffectOnSubMeshes = subMesh && this._storeEffectOnSubMeshes; + const effect = effectOverride ?? (storeEffectOnSubMeshes ? subMesh.effect : this.getEffect()); + if (!effect) { + return; + } + const scene = this.getScene(); + this._activeEffect = effect; + this.bindOnlyWorldMatrix(world, effectOverride); + const uniformBuffers = this._options.uniformBuffers; + let useSceneUBO = false; + if (effect && uniformBuffers && uniformBuffers.length > 0 && scene.getEngine().supportsUniformBuffers) { + for (let i = 0; i < uniformBuffers.length; ++i) { + const bufferName = uniformBuffers[i]; + switch (bufferName) { + case "Mesh": + if (mesh) { + mesh.getMeshUniformBuffer().bindToEffect(effect, "Mesh"); + mesh.transferToEffect(world); + } + break; + case "Scene": + BindSceneUniformBuffer(effect, scene.getSceneUniformBuffer()); + scene.finalizeSceneUbo(); + useSceneUBO = true; + break; + } } - const gradient = r * filter.r + g * filter.g + b * filter.b; - if (a >= alphaFilter) { - position.y = options.minHeight + (options.maxHeight - options.minHeight) * gradient; - } else { - position.y = options.minHeight - Epsilon; + } + const mustRebind = mesh && storeEffectOnSubMeshes ? this._mustRebind(scene, effect, subMesh, mesh.visibility) : scene.getCachedMaterial() !== this; + if (effect && mustRebind) { + if (!useSceneUBO && this._options.uniforms.indexOf("view") !== -1) { + effect.setMatrix("view", scene.getViewMatrix()); } - if (options.heightBuffer) { - options.heightBuffer[row * (options.subdivisions + 1) + col] = position.y; + if (!useSceneUBO && this._options.uniforms.indexOf("projection") !== -1) { + effect.setMatrix("projection", scene.getProjectionMatrix()); + } + if (!useSceneUBO && this._options.uniforms.indexOf("viewProjection") !== -1) { + effect.setMatrix("viewProjection", scene.getTransformMatrix()); + if (this._multiview) { + effect.setMatrix("viewProjectionR", scene._transformMatrixR); + } + } + if (scene.activeCamera && this._options.uniforms.indexOf("cameraPosition") !== -1) { + effect.setVector3("cameraPosition", scene.activeCamera.globalPosition); + } + BindBonesParameters(mesh, effect); + bindClipPlane(effect, this, scene); + if (this._useLogarithmicDepth) { + BindLogDepth(storeEffectOnSubMeshes ? subMesh.materialDefines : effect.defines, effect, scene); + } + if (mesh) { + BindFogParameters(scene, mesh, effect); + } + let name69; + for (name69 in this._textures) { + effect.setTexture(name69, this._textures[name69]); + } + for (name69 in this._textureArrays) { + effect.setTextureArray(name69, this._textureArrays[name69]); + } + for (name69 in this._externalTextures) { + effect.setExternalTexture(name69, this._externalTextures[name69]); + } + for (name69 in this._ints) { + effect.setInt(name69, this._ints[name69]); + } + for (name69 in this._uints) { + effect.setUInt(name69, this._uints[name69]); + } + for (name69 in this._floats) { + effect.setFloat(name69, this._floats[name69]); + } + for (name69 in this._floatsArrays) { + effect.setArray(name69, this._floatsArrays[name69]); + } + for (name69 in this._colors3) { + effect.setColor3(name69, this._colors3[name69]); + } + for (name69 in this._colors3Arrays) { + effect.setArray3(name69, this._colors3Arrays[name69]); + } + for (name69 in this._colors4) { + const color = this._colors4[name69]; + effect.setFloat4(name69, color.r, color.g, color.b, color.a); + } + for (name69 in this._colors4Arrays) { + effect.setArray4(name69, this._colors4Arrays[name69]); + } + for (name69 in this._vectors2) { + effect.setVector2(name69, this._vectors2[name69]); + } + for (name69 in this._vectors3) { + effect.setVector3(name69, this._vectors3[name69]); + } + for (name69 in this._vectors4) { + effect.setVector4(name69, this._vectors4[name69]); + } + for (name69 in this._quaternions) { + effect.setQuaternion(name69, this._quaternions[name69]); + } + for (name69 in this._matrices) { + effect.setMatrix(name69, this._matrices[name69]); + } + for (name69 in this._matrixArrays) { + effect.setMatrices(name69, this._matrixArrays[name69]); + } + for (name69 in this._matrices3x3) { + effect.setMatrix3x3(name69, this._matrices3x3[name69]); + } + for (name69 in this._matrices2x2) { + effect.setMatrix2x2(name69, this._matrices2x2[name69]); + } + for (name69 in this._vectors2Arrays) { + effect.setArray2(name69, this._vectors2Arrays[name69]); + } + for (name69 in this._vectors3Arrays) { + effect.setArray3(name69, this._vectors3Arrays[name69]); + } + for (name69 in this._vectors4Arrays) { + effect.setArray4(name69, this._vectors4Arrays[name69]); + } + for (name69 in this._quaternionsArrays) { + effect.setArray4(name69, this._quaternionsArrays[name69]); + } + for (name69 in this._uniformBuffers) { + const buffer = this._uniformBuffers[name69].getBuffer(); + if (buffer) { + effect.bindUniformBuffer(buffer, name69); + } + } + for (name69 in this._textureSamplers) { + effect.setTextureSampler(name69, this._textureSamplers[name69]); + } + for (name69 in this._storageBuffers) { + effect.setStorageBuffer(name69, this._storageBuffers[name69]); } - positions.push(position.x, position.y, position.z); - normals.push(0, 0, 0); - uvs.push(col / options.subdivisions, 1 - row / options.subdivisions); } - } - for (row = 0; row < options.subdivisions; row++) { - for (col = 0; col < options.subdivisions; col++) { - const idx1 = col + 1 + (row + 1) * (options.subdivisions + 1); - const idx2 = col + 1 + row * (options.subdivisions + 1); - const idx3 = col + row * (options.subdivisions + 1); - const idx4 = col + (row + 1) * (options.subdivisions + 1); - const isVisibleIdx1 = positions[idx1 * 3 + 1] >= options.minHeight; - const isVisibleIdx2 = positions[idx2 * 3 + 1] >= options.minHeight; - const isVisibleIdx3 = positions[idx3 * 3 + 1] >= options.minHeight; - if (isVisibleIdx1 && isVisibleIdx2 && isVisibleIdx3) { - indices.push(idx1); - indices.push(idx2); - indices.push(idx3); + if (effect && mesh && (mustRebind || !this.isFrozen)) { + const manager = mesh.morphTargetManager; + if (manager && manager.numInfluencers > 0) { + BindMorphTargetParameters(mesh, effect); } - const isVisibleIdx4 = positions[idx4 * 3 + 1] >= options.minHeight; - if (isVisibleIdx4 && isVisibleIdx1 && isVisibleIdx3) { - indices.push(idx4); - indices.push(idx1); - indices.push(idx3); + const bvaManager = mesh.bakedVertexAnimationManager; + if (bvaManager && bvaManager.isEnabled) { + const drawWrapper = storeEffectOnSubMeshes ? subMesh._drawWrapper : this._drawWrapper; + (_a = mesh.bakedVertexAnimationManager) == null ? void 0 : _a.bind(effect, !!drawWrapper._wasPreviouslyUsingInstances); } } + this._afterBind(mesh, effect, subMesh); } - VertexData.ComputeNormals(positions, indices, normals); - const vertexData = new VertexData(); - vertexData.indices = indices; - vertexData.positions = positions; - vertexData.normals = normals; - vertexData.uvs = uvs; - return vertexData; -} -function CreateGround(name69, options = {}, scene) { - const ground = new GroundMesh(name69, scene); - ground._setReady(false); - ground._subdivisionsX = options.subdivisionsX || options.subdivisions || 1; - ground._subdivisionsY = options.subdivisionsY || options.subdivisions || 1; - ground._width = options.width || 1; - ground._height = options.height || 1; - ground._maxX = ground._width / 2; - ground._maxZ = ground._height / 2; - ground._minX = -ground._maxX; - ground._minZ = -ground._maxZ; - const vertexData = CreateGroundVertexData(options); - vertexData.applyToMesh(ground, options.updatable); - ground._setReady(true); - return ground; -} -function CreateTiledGround(name69, options, scene = null) { - const tiledGround = new Mesh(name69, scene); - const vertexData = CreateTiledGroundVertexData(options); - vertexData.applyToMesh(tiledGround, options.updatable); - return tiledGround; -} -function CreateGroundFromHeightMap(name69, url, options = {}, scene = null) { - const width = options.width || 10; - const height = options.height || 10; - const subdivisions = options.subdivisions || 1 | 0; - const minHeight = options.minHeight || 0; - const maxHeight = options.maxHeight || 1; - const filter = options.colorFilter || new Color3(0.3, 0.59, 0.11); - const alphaFilter = options.alphaFilter || 0; - const updatable = options.updatable; - const onReady = options.onReady; - scene = scene || EngineStore.LastCreatedScene; - const ground = new GroundMesh(name69, scene); - ground._subdivisionsX = subdivisions; - ground._subdivisionsY = subdivisions; - ground._width = width; - ground._height = height; - ground._maxX = ground._width / 2; - ground._maxZ = ground._height / 2; - ground._minX = -ground._maxX; - ground._minZ = -ground._maxZ; - ground._setReady(false); - let heightBuffer; - if (options.passHeightBufferInCallback) { - heightBuffer = new Float32Array((subdivisions + 1) * (subdivisions + 1)); - } - const onBufferLoaded = (buffer, bufferWidth, bufferHeight) => { - const vertexData = CreateGroundFromHeightMapVertexData({ - width, - height, - subdivisions, - minHeight, - maxHeight, - colorFilter: filter, - buffer, - bufferWidth, - bufferHeight, - alphaFilter, - heightBuffer - }); - vertexData.applyToMesh(ground, updatable); - if (onReady) { - onReady(ground, heightBuffer); + /** + * Gets the active textures from the material + * @returns an array of textures + */ + getActiveTextures() { + const activeTextures = super.getActiveTextures(); + for (const name69 in this._textures) { + activeTextures.push(this._textures[name69]); } - ground._setReady(true); - }; - if (typeof url === "string") { - const onload = (img) => { - const bufferWidth = img.width; - const bufferHeight = img.height; - if (scene.isDisposed) { - return; + for (const name69 in this._textureArrays) { + const array = this._textureArrays[name69]; + for (let index = 0; index < array.length; index++) { + activeTextures.push(array[index]); } - const buffer = scene == null ? void 0 : scene.getEngine().resizeImageBitmap(img, bufferWidth, bufferHeight); - onBufferLoaded(buffer, bufferWidth, bufferHeight); - }; - Tools.LoadImage(url, onload, options.onError ? options.onError : () => { - }, scene.offlineProvider); - } else { - onBufferLoaded(url.data, url.width, url.height); + } + return activeTextures; } - return ground; -} -var GroundBuilder = { - // eslint-disable-next-line @typescript-eslint/naming-convention - CreateGround, - // eslint-disable-next-line @typescript-eslint/naming-convention - CreateGroundFromHeightMap, - // eslint-disable-next-line @typescript-eslint/naming-convention - CreateTiledGround -}; -VertexData.CreateGround = CreateGroundVertexData; -VertexData.CreateTiledGround = CreateTiledGroundVertexData; -VertexData.CreateGroundFromHeightMap = CreateGroundFromHeightMapVertexData; -Mesh.CreateGround = (name69, width, height, subdivisions, scene, updatable) => { - const options = { - width, - height, - subdivisions, - updatable - }; - return CreateGround(name69, options, scene); -}; -Mesh.CreateTiledGround = (name69, xmin, zmin, xmax, zmax, subdivisions, precision, scene, updatable) => { - const options = { - xmin, - zmin, - xmax, - zmax, - subdivisions, - precision, - updatable - }; - return CreateTiledGround(name69, options, scene); -}; -Mesh.CreateGroundFromHeightMap = (name69, url, width, height, subdivisions, minHeight, maxHeight, scene, updatable, onReady, alphaFilter) => { - const options = { - width, - height, - subdivisions, - minHeight, - maxHeight, - updatable, - onReady, - alphaFilter - }; - return CreateGroundFromHeightMap(name69, url, options, scene); -}; - -// node_modules/@babylonjs/core/Lights/hemisphericLight.js -Node.AddNodeConstructor("Light_Type_3", (name69, scene) => { - return () => new HemisphericLight(name69, Vector3.Zero(), scene); -}); -var HemisphericLight = class extends Light { /** - * Creates a HemisphericLight object in the scene according to the passed direction (Vector3). - * The HemisphericLight simulates the ambient environment light, so the passed direction is the light reflection direction, not the incoming direction. - * The HemisphericLight can't cast shadows. - * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction - * @param name The friendly name of the light - * @param direction The direction of the light reflection - * @param scene The scene the light belongs to + * Specifies if the material uses a texture + * @param texture defines the texture to check against the material + * @returns a boolean specifying if the material uses the texture */ - constructor(name69, direction, scene) { - super(name69, scene); - this.groundColor = new Color3(0, 0, 0); - this.direction = direction || Vector3.Up(); + hasTexture(texture) { + if (super.hasTexture(texture)) { + return true; + } + for (const name69 in this._textures) { + if (this._textures[name69] === texture) { + return true; + } + } + for (const name69 in this._textureArrays) { + const array = this._textureArrays[name69]; + for (let index = 0; index < array.length; index++) { + if (array[index] === texture) { + return true; + } + } + } + return false; } - _buildUniformLayout() { - this._uniformBuffer.addUniform("vLightData", 4); - this._uniformBuffer.addUniform("vLightDiffuse", 4); - this._uniformBuffer.addUniform("vLightSpecular", 4); - this._uniformBuffer.addUniform("vLightGround", 3); - this._uniformBuffer.addUniform("shadowsInfo", 3); - this._uniformBuffer.addUniform("depthValues", 2); - this._uniformBuffer.create(); + /** + * Makes a duplicate of the material, and gives it a new name + * @param name defines the new name for the duplicated material + * @returns the cloned material + */ + clone(name69) { + const result = SerializationHelper.Clone(() => new _ShaderMaterial(name69, this.getScene(), this._shaderPath, this._options, this._storeEffectOnSubMeshes), this); + result.name = name69; + result.id = name69; + if (typeof result._shaderPath === "object") { + result._shaderPath = { ...result._shaderPath }; + } + this._options = { ...this._options }; + Object.keys(this._options).forEach((propName) => { + const propValue = this._options[propName]; + if (Array.isArray(propValue)) { + this._options[propName] = propValue.slice(0); + } + }); + this.stencil.copyTo(result.stencil); + for (const key in this._textures) { + result.setTexture(key, this._textures[key]); + } + for (const key in this._textureArrays) { + result.setTextureArray(key, this._textureArrays[key]); + } + for (const key in this._externalTextures) { + result.setExternalTexture(key, this._externalTextures[key]); + } + for (const key in this._ints) { + result.setInt(key, this._ints[key]); + } + for (const key in this._uints) { + result.setUInt(key, this._uints[key]); + } + for (const key in this._floats) { + result.setFloat(key, this._floats[key]); + } + for (const key in this._floatsArrays) { + result.setFloats(key, this._floatsArrays[key]); + } + for (const key in this._colors3) { + result.setColor3(key, this._colors3[key]); + } + for (const key in this._colors3Arrays) { + result._colors3Arrays[key] = this._colors3Arrays[key]; + } + for (const key in this._colors4) { + result.setColor4(key, this._colors4[key]); + } + for (const key in this._colors4Arrays) { + result._colors4Arrays[key] = this._colors4Arrays[key]; + } + for (const key in this._vectors2) { + result.setVector2(key, this._vectors2[key]); + } + for (const key in this._vectors3) { + result.setVector3(key, this._vectors3[key]); + } + for (const key in this._vectors4) { + result.setVector4(key, this._vectors4[key]); + } + for (const key in this._quaternions) { + result.setQuaternion(key, this._quaternions[key]); + } + for (const key in this._quaternionsArrays) { + result._quaternionsArrays[key] = this._quaternionsArrays[key]; + } + for (const key in this._matrices) { + result.setMatrix(key, this._matrices[key]); + } + for (const key in this._matrixArrays) { + result._matrixArrays[key] = this._matrixArrays[key].slice(); + } + for (const key in this._matrices3x3) { + result.setMatrix3x3(key, this._matrices3x3[key]); + } + for (const key in this._matrices2x2) { + result.setMatrix2x2(key, this._matrices2x2[key]); + } + for (const key in this._vectors2Arrays) { + result.setArray2(key, this._vectors2Arrays[key]); + } + for (const key in this._vectors3Arrays) { + result.setArray3(key, this._vectors3Arrays[key]); + } + for (const key in this._vectors4Arrays) { + result.setArray4(key, this._vectors4Arrays[key]); + } + for (const key in this._uniformBuffers) { + result.setUniformBuffer(key, this._uniformBuffers[key]); + } + for (const key in this._textureSamplers) { + result.setTextureSampler(key, this._textureSamplers[key]); + } + for (const key in this._storageBuffers) { + result.setStorageBuffer(key, this._storageBuffers[key]); + } + return result; } /** - * Returns the string "HemisphericLight". - * @returns The class name + * Disposes the material + * @param forceDisposeEffect specifies if effects should be forcefully disposed + * @param forceDisposeTextures specifies if textures should be forcefully disposed + * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh */ - getClassName() { - return "HemisphericLight"; + dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh) { + if (forceDisposeTextures) { + let name69; + for (name69 in this._textures) { + this._textures[name69].dispose(); + } + for (name69 in this._textureArrays) { + const array = this._textureArrays[name69]; + for (let index = 0; index < array.length; index++) { + array[index].dispose(); + } + } + } + this._textures = {}; + super.dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh); } /** - * Sets the HemisphericLight direction towards the passed target (Vector3). - * Returns the updated direction. - * @param target The target the direction should point to - * @returns The computed direction + * Serializes this material in a JSON representation + * @returns the serialized material object */ - setDirectionToTarget(target) { - this.direction = Vector3.Normalize(target.subtract(Vector3.Zero())); - return this.direction; + serialize() { + const serializationObject = SerializationHelper.Serialize(this); + serializationObject.customType = "BABYLON.ShaderMaterial"; + serializationObject.uniqueId = this.uniqueId; + serializationObject.options = this._options; + serializationObject.shaderPath = this._shaderPath; + serializationObject.storeEffectOnSubMeshes = this._storeEffectOnSubMeshes; + let name69; + serializationObject.stencil = this.stencil.serialize(); + serializationObject.textures = {}; + for (name69 in this._textures) { + serializationObject.textures[name69] = this._textures[name69].serialize(); + } + serializationObject.textureArrays = {}; + for (name69 in this._textureArrays) { + serializationObject.textureArrays[name69] = []; + const array = this._textureArrays[name69]; + for (let index = 0; index < array.length; index++) { + serializationObject.textureArrays[name69].push(array[index].serialize()); + } + } + serializationObject.ints = {}; + for (name69 in this._ints) { + serializationObject.ints[name69] = this._ints[name69]; + } + serializationObject.uints = {}; + for (name69 in this._uints) { + serializationObject.uints[name69] = this._uints[name69]; + } + serializationObject.floats = {}; + for (name69 in this._floats) { + serializationObject.floats[name69] = this._floats[name69]; + } + serializationObject.floatsArrays = {}; + for (name69 in this._floatsArrays) { + serializationObject.floatsArrays[name69] = this._floatsArrays[name69]; + } + serializationObject.colors3 = {}; + for (name69 in this._colors3) { + serializationObject.colors3[name69] = this._colors3[name69].asArray(); + } + serializationObject.colors3Arrays = {}; + for (name69 in this._colors3Arrays) { + serializationObject.colors3Arrays[name69] = this._colors3Arrays[name69]; + } + serializationObject.colors4 = {}; + for (name69 in this._colors4) { + serializationObject.colors4[name69] = this._colors4[name69].asArray(); + } + serializationObject.colors4Arrays = {}; + for (name69 in this._colors4Arrays) { + serializationObject.colors4Arrays[name69] = this._colors4Arrays[name69]; + } + serializationObject.vectors2 = {}; + for (name69 in this._vectors2) { + serializationObject.vectors2[name69] = this._vectors2[name69].asArray(); + } + serializationObject.vectors3 = {}; + for (name69 in this._vectors3) { + serializationObject.vectors3[name69] = this._vectors3[name69].asArray(); + } + serializationObject.vectors4 = {}; + for (name69 in this._vectors4) { + serializationObject.vectors4[name69] = this._vectors4[name69].asArray(); + } + serializationObject.quaternions = {}; + for (name69 in this._quaternions) { + serializationObject.quaternions[name69] = this._quaternions[name69].asArray(); + } + serializationObject.matrices = {}; + for (name69 in this._matrices) { + serializationObject.matrices[name69] = this._matrices[name69].asArray(); + } + serializationObject.matrixArray = {}; + for (name69 in this._matrixArrays) { + serializationObject.matrixArray[name69] = this._matrixArrays[name69]; + } + serializationObject.matrices3x3 = {}; + for (name69 in this._matrices3x3) { + serializationObject.matrices3x3[name69] = this._matrices3x3[name69]; + } + serializationObject.matrices2x2 = {}; + for (name69 in this._matrices2x2) { + serializationObject.matrices2x2[name69] = this._matrices2x2[name69]; + } + serializationObject.vectors2Arrays = {}; + for (name69 in this._vectors2Arrays) { + serializationObject.vectors2Arrays[name69] = this._vectors2Arrays[name69]; + } + serializationObject.vectors3Arrays = {}; + for (name69 in this._vectors3Arrays) { + serializationObject.vectors3Arrays[name69] = this._vectors3Arrays[name69]; + } + serializationObject.vectors4Arrays = {}; + for (name69 in this._vectors4Arrays) { + serializationObject.vectors4Arrays[name69] = this._vectors4Arrays[name69]; + } + serializationObject.quaternionsArrays = {}; + for (name69 in this._quaternionsArrays) { + serializationObject.quaternionsArrays[name69] = this._quaternionsArrays[name69]; + } + return serializationObject; } /** - * Returns the shadow generator associated to the light. - * @returns Always null for hemispheric lights because it does not support shadows. + * Creates a shader material from parsed shader material data + * @param source defines the JSON representation of the material + * @param scene defines the hosting scene + * @param rootUrl defines the root URL to use to load textures and relative dependencies + * @returns a new material */ - getShadowGenerator() { - return null; + static Parse(source, scene, rootUrl) { + const material = SerializationHelper.Parse(() => new _ShaderMaterial(source.name, scene, source.shaderPath, source.options, source.storeEffectOnSubMeshes), source, scene, rootUrl); + let name69; + if (source.stencil) { + material.stencil.parse(source.stencil, scene, rootUrl); + } + for (name69 in source.textures) { + material.setTexture(name69, Texture.Parse(source.textures[name69], scene, rootUrl)); + } + for (name69 in source.textureArrays) { + const array = source.textureArrays[name69]; + const textureArray = []; + for (let index = 0; index < array.length; index++) { + textureArray.push(Texture.Parse(array[index], scene, rootUrl)); + } + material.setTextureArray(name69, textureArray); + } + for (name69 in source.ints) { + material.setInt(name69, source.ints[name69]); + } + for (name69 in source.uints) { + material.setUInt(name69, source.uints[name69]); + } + for (name69 in source.floats) { + material.setFloat(name69, source.floats[name69]); + } + for (name69 in source.floatsArrays) { + material.setFloats(name69, source.floatsArrays[name69]); + } + for (name69 in source.colors3) { + material.setColor3(name69, Color3.FromArray(source.colors3[name69])); + } + for (name69 in source.colors3Arrays) { + const colors = source.colors3Arrays[name69].reduce((arr, num, i) => { + if (i % 3 === 0) { + arr.push([num]); + } else { + arr[arr.length - 1].push(num); + } + return arr; + }, []).map((color) => Color3.FromArray(color)); + material.setColor3Array(name69, colors); + } + for (name69 in source.colors4) { + material.setColor4(name69, Color4.FromArray(source.colors4[name69])); + } + for (name69 in source.colors4Arrays) { + const colors = source.colors4Arrays[name69].reduce((arr, num, i) => { + if (i % 4 === 0) { + arr.push([num]); + } else { + arr[arr.length - 1].push(num); + } + return arr; + }, []).map((color) => Color4.FromArray(color)); + material.setColor4Array(name69, colors); + } + for (name69 in source.vectors2) { + material.setVector2(name69, Vector2.FromArray(source.vectors2[name69])); + } + for (name69 in source.vectors3) { + material.setVector3(name69, Vector3.FromArray(source.vectors3[name69])); + } + for (name69 in source.vectors4) { + material.setVector4(name69, Vector4.FromArray(source.vectors4[name69])); + } + for (name69 in source.quaternions) { + material.setQuaternion(name69, Quaternion.FromArray(source.quaternions[name69])); + } + for (name69 in source.matrices) { + material.setMatrix(name69, Matrix.FromArray(source.matrices[name69])); + } + for (name69 in source.matrixArray) { + material._matrixArrays[name69] = new Float32Array(source.matrixArray[name69]); + } + for (name69 in source.matrices3x3) { + material.setMatrix3x3(name69, source.matrices3x3[name69]); + } + for (name69 in source.matrices2x2) { + material.setMatrix2x2(name69, source.matrices2x2[name69]); + } + for (name69 in source.vectors2Arrays) { + material.setArray2(name69, source.vectors2Arrays[name69]); + } + for (name69 in source.vectors3Arrays) { + material.setArray3(name69, source.vectors3Arrays[name69]); + } + for (name69 in source.vectors4Arrays) { + material.setArray4(name69, source.vectors4Arrays[name69]); + } + for (name69 in source.quaternionsArrays) { + material.setArray4(name69, source.quaternionsArrays[name69]); + } + return material; } /** - * Sets the passed Effect object with the HemisphericLight normalized direction and color and the passed name (string). - * @param _effect The effect to update - * @param lightIndex The index of the light in the effect to update - * @returns The hemispheric light + * Creates a new ShaderMaterial from a snippet saved in a remote file + * @param name defines the name of the ShaderMaterial to create (can be null or empty to use the one from the json data) + * @param url defines the url to load from + * @param scene defines the hosting scene + * @param rootUrl defines the root URL to use to load textures and relative dependencies + * @returns a promise that will resolve to the new ShaderMaterial */ - transferToEffect(_effect, lightIndex) { - const normalizeDirection = Vector3.Normalize(this.direction); - this._uniformBuffer.updateFloat4("vLightData", normalizeDirection.x, normalizeDirection.y, normalizeDirection.z, 0, lightIndex); - this._uniformBuffer.updateColor3("vLightGround", this.groundColor.scale(this.intensity), lightIndex); - return this; - } - transferToNodeMaterialEffect(effect, lightDataUniformName) { - const normalizeDirection = Vector3.Normalize(this.direction); - effect.setFloat3(lightDataUniformName, normalizeDirection.x, normalizeDirection.y, normalizeDirection.z); - return this; + static ParseFromFileAsync(name69, url, scene, rootUrl = "") { + return new Promise((resolve, reject) => { + const request = new WebRequest(); + request.addEventListener("readystatechange", () => { + if (request.readyState == 4) { + if (request.status == 200) { + const serializationObject = JSON.parse(request.responseText); + const output = this.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl); + if (name69) { + output.name = name69; + } + resolve(output); + } else { + reject("Unable to load the ShaderMaterial"); + } + } + }); + request.open("GET", url); + request.send(); + }); } /** - * Computes the world matrix of the node - * @returns the world matrix + * Creates a ShaderMaterial from a snippet saved by the Inspector + * @param snippetId defines the snippet to load + * @param scene defines the hosting scene + * @param rootUrl defines the root URL to use to load textures and relative dependencies + * @returns a promise that will resolve to the new ShaderMaterial */ - computeWorldMatrix() { - if (!this._worldMatrix) { - this._worldMatrix = Matrix.Identity(); - } - return this._worldMatrix; + static ParseFromSnippetAsync(snippetId, scene, rootUrl = "") { + return new Promise((resolve, reject) => { + const request = new WebRequest(); + request.addEventListener("readystatechange", () => { + if (request.readyState == 4) { + if (request.status == 200) { + const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload); + const serializationObject = JSON.parse(snippet.shaderMaterial); + const output = this.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl); + output.snippetId = snippetId; + resolve(output); + } else { + reject("Unable to load the snippet " + snippetId); + } + } + }); + request.open("GET", this.SnippetUrl + "/" + snippetId.replace(/#/g, "/")); + request.send(); + }); } +}; +ShaderMaterial.SnippetUrl = `https://snippet.babylonjs.com`; +ShaderMaterial.CreateFromSnippetAsync = ShaderMaterial.ParseFromSnippetAsync; +RegisterClass("BABYLON.ShaderMaterial", ShaderMaterial); + +// node_modules/@babylonjs/core/Culling/ray.js +var Ray = class _Ray { /** - * Returns the integer 3. - * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x + * Creates a new ray + * @param origin origin point + * @param direction direction + * @param length length of the ray + * @param epsilon The epsilon value to use when calculating the ray/triangle intersection (default: 0) */ - getTypeID() { - return Light.LIGHTTYPEID_HEMISPHERICLIGHT; + constructor(origin, direction, length = Number.MAX_VALUE, epsilon = Epsilon) { + this.origin = origin; + this.direction = direction; + this.length = length; + this.epsilon = epsilon; } + // Methods /** - * Prepares the list of defines specific to the light type. - * @param defines the list of defines - * @param lightIndex defines the index of the light for the effect + * Clone the current ray + * @returns a new ray */ - prepareLightSpecificDefines(defines, lightIndex) { - defines["HEMILIGHT" + lightIndex] = true; + clone() { + return new _Ray(this.origin.clone(), this.direction.clone(), this.length); } -}; -__decorate([ - serializeAsColor3() -], HemisphericLight.prototype, "groundColor", void 0); -__decorate([ - serializeAsVector3() -], HemisphericLight.prototype, "direction", void 0); - -// node_modules/@babylonjs/core/Rendering/utilityLayerRenderer.js -var UtilityLayerRenderer = class _UtilityLayerRenderer { /** - * Gets the camera that is used to render the utility layer (when not set, this will be the last active camera) - * @param getRigParentIfPossible if the current active camera is a rig camera, should its parent camera be returned - * @returns the camera that is used when rendering the utility layer + * Checks if the ray intersects a box + * This does not account for the ray length by design to improve perfs. + * @param minimum bound of the box + * @param maximum bound of the box + * @param intersectionTreshold extra extend to be added to the box in all direction + * @returns if the box was hit */ - getRenderCamera(getRigParentIfPossible) { - if (this._renderCamera) { - return this._renderCamera; + intersectsBoxMinMax(minimum, maximum, intersectionTreshold = 0) { + const newMinimum = _Ray._TmpVector3[0].copyFromFloats(minimum.x - intersectionTreshold, minimum.y - intersectionTreshold, minimum.z - intersectionTreshold); + const newMaximum = _Ray._TmpVector3[1].copyFromFloats(maximum.x + intersectionTreshold, maximum.y + intersectionTreshold, maximum.z + intersectionTreshold); + let d = 0; + let maxValue = Number.MAX_VALUE; + let inv; + let min; + let max; + let temp; + if (Math.abs(this.direction.x) < 1e-7) { + if (this.origin.x < newMinimum.x || this.origin.x > newMaximum.x) { + return false; + } } else { - let activeCam; - if (this.originalScene.activeCameras && this.originalScene.activeCameras.length > 1) { - activeCam = this.originalScene.activeCameras[this.originalScene.activeCameras.length - 1]; - } else { - activeCam = this.originalScene.activeCamera; + inv = 1 / this.direction.x; + min = (newMinimum.x - this.origin.x) * inv; + max = (newMaximum.x - this.origin.x) * inv; + if (max === -Infinity) { + max = Infinity; } - if (getRigParentIfPossible && activeCam && activeCam.isRigCamera) { - return activeCam.rigParent; + if (min > max) { + temp = min; + min = max; + max = temp; + } + d = Math.max(min, d); + maxValue = Math.min(max, maxValue); + if (d > maxValue) { + return false; + } + } + if (Math.abs(this.direction.y) < 1e-7) { + if (this.origin.y < newMinimum.y || this.origin.y > newMaximum.y) { + return false; + } + } else { + inv = 1 / this.direction.y; + min = (newMinimum.y - this.origin.y) * inv; + max = (newMaximum.y - this.origin.y) * inv; + if (max === -Infinity) { + max = Infinity; + } + if (min > max) { + temp = min; + min = max; + max = temp; + } + d = Math.max(min, d); + maxValue = Math.min(max, maxValue); + if (d > maxValue) { + return false; + } + } + if (Math.abs(this.direction.z) < 1e-7) { + if (this.origin.z < newMinimum.z || this.origin.z > newMaximum.z) { + return false; + } + } else { + inv = 1 / this.direction.z; + min = (newMinimum.z - this.origin.z) * inv; + max = (newMaximum.z - this.origin.z) * inv; + if (max === -Infinity) { + max = Infinity; + } + if (min > max) { + temp = min; + min = max; + max = temp; + } + d = Math.max(min, d); + maxValue = Math.min(max, maxValue); + if (d > maxValue) { + return false; } - return activeCam; } + return true; + } + /** + * Checks if the ray intersects a box + * This does not account for the ray lenght by design to improve perfs. + * @param box the bounding box to check + * @param intersectionTreshold extra extend to be added to the BoundingBox in all direction + * @returns if the box was hit + */ + intersectsBox(box, intersectionTreshold = 0) { + return this.intersectsBoxMinMax(box.minimum, box.maximum, intersectionTreshold); } /** - * Sets the camera that should be used when rendering the utility layer (If set to null the last active camera will be used) - * @param cam the camera that should be used when rendering the utility layer + * If the ray hits a sphere + * @param sphere the bounding sphere to check + * @param intersectionTreshold extra extend to be added to the BoundingSphere in all direction + * @returns true if it hits the sphere */ - setRenderCamera(cam) { - this._renderCamera = cam; + intersectsSphere(sphere, intersectionTreshold = 0) { + const x = sphere.center.x - this.origin.x; + const y = sphere.center.y - this.origin.y; + const z = sphere.center.z - this.origin.z; + const pyth = x * x + y * y + z * z; + const radius = sphere.radius + intersectionTreshold; + const rr = radius * radius; + if (pyth <= rr) { + return true; + } + const dot = x * this.direction.x + y * this.direction.y + z * this.direction.z; + if (dot < 0) { + return false; + } + const temp = pyth - dot * dot; + return temp <= rr; } /** - * @internal - * Light which used by gizmos to get light shading + * If the ray hits a triange + * @param vertex0 triangle vertex + * @param vertex1 triangle vertex + * @param vertex2 triangle vertex + * @returns intersection information if hit */ - _getSharedGizmoLight() { - if (!this._sharedGizmoLight) { - this._sharedGizmoLight = new HemisphericLight("shared gizmo light", new Vector3(0, 1, 0), this.utilityLayerScene); - this._sharedGizmoLight.intensity = 2; - this._sharedGizmoLight.groundColor = Color3.Gray(); + intersectsTriangle(vertex0, vertex1, vertex2) { + const edge1 = _Ray._TmpVector3[0]; + const edge2 = _Ray._TmpVector3[1]; + const pvec = _Ray._TmpVector3[2]; + const tvec = _Ray._TmpVector3[3]; + const qvec = _Ray._TmpVector3[4]; + vertex1.subtractToRef(vertex0, edge1); + vertex2.subtractToRef(vertex0, edge2); + Vector3.CrossToRef(this.direction, edge2, pvec); + const det = Vector3.Dot(edge1, pvec); + if (det === 0) { + return null; } - return this._sharedGizmoLight; + const invdet = 1 / det; + this.origin.subtractToRef(vertex0, tvec); + const bv = Vector3.Dot(tvec, pvec) * invdet; + if (bv < -this.epsilon || bv > 1 + this.epsilon) { + return null; + } + Vector3.CrossToRef(tvec, edge1, qvec); + const bw = Vector3.Dot(this.direction, qvec) * invdet; + if (bw < -this.epsilon || bv + bw > 1 + this.epsilon) { + return null; + } + const distance = Vector3.Dot(edge2, qvec) * invdet; + if (distance > this.length) { + return null; + } + return new IntersectionInfo(1 - bv - bw, bv, distance); } /** - * A shared utility layer that can be used to overlay objects into a scene (Depth map of the previous scene is cleared before drawing on top of it) + * Checks if ray intersects a plane + * @param plane the plane to check + * @returns the distance away it was hit */ - static get DefaultUtilityLayer() { - if (_UtilityLayerRenderer._DefaultUtilityLayer == null) { - return _UtilityLayerRenderer._CreateDefaultUtilityLayerFromScene(EngineStore.LastCreatedScene); + intersectsPlane(plane) { + let distance; + const result1 = Vector3.Dot(plane.normal, this.direction); + if (Math.abs(result1) < 999999997475243e-21) { + return null; + } else { + const result2 = Vector3.Dot(plane.normal, this.origin); + distance = (-plane.d - result2) / result1; + if (distance < 0) { + if (distance < -999999997475243e-21) { + return null; + } else { + return 0; + } + } + return distance; } - return _UtilityLayerRenderer._DefaultUtilityLayer; } /** - * Creates an utility layer, and set it as a default utility layer - * @param scene associated scene - * @internal + * Calculate the intercept of a ray on a given axis + * @param axis to check 'x' | 'y' | 'z' + * @param offset from axis interception (i.e. an offset of 1y is intercepted above ground) + * @returns a vector containing the coordinates where 'axis' is equal to zero (else offset), or null if there is no intercept. */ - static _CreateDefaultUtilityLayerFromScene(scene) { - _UtilityLayerRenderer._DefaultUtilityLayer = new _UtilityLayerRenderer(scene); - _UtilityLayerRenderer._DefaultUtilityLayer.originalScene.onDisposeObservable.addOnce(() => { - _UtilityLayerRenderer._DefaultUtilityLayer = null; - }); - return _UtilityLayerRenderer._DefaultUtilityLayer; + intersectsAxis(axis, offset = 0) { + switch (axis) { + case "y": { + const t = (this.origin.y - offset) / this.direction.y; + if (t > 0) { + return null; + } + return new Vector3(this.origin.x + this.direction.x * -t, offset, this.origin.z + this.direction.z * -t); + } + case "x": { + const t = (this.origin.x - offset) / this.direction.x; + if (t > 0) { + return null; + } + return new Vector3(offset, this.origin.y + this.direction.y * -t, this.origin.z + this.direction.z * -t); + } + case "z": { + const t = (this.origin.z - offset) / this.direction.z; + if (t > 0) { + return null; + } + return new Vector3(this.origin.x + this.direction.x * -t, this.origin.y + this.direction.y * -t, offset); + } + default: + return null; + } } /** - * A shared utility layer that can be used to embed objects into a scene (Depth map of the previous scene is not cleared before drawing on top of it) + * Checks if ray intersects a mesh. The ray is defined in WORLD space. A mesh triangle can be picked both from its front and back sides, + * irrespective of orientation. + * @param mesh the mesh to check + * @param fastCheck defines if the first intersection will be used (and not the closest) + * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected + * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default) + * @param worldToUse defines the world matrix to use to get the world coordinate of the intersection point + * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check + * @returns picking info of the intersection */ - static get DefaultKeepDepthUtilityLayer() { - if (_UtilityLayerRenderer._DefaultKeepDepthUtilityLayer == null) { - _UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = new _UtilityLayerRenderer(EngineStore.LastCreatedScene); - _UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.utilityLayerScene.autoClearDepthAndStencil = false; - _UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.originalScene.onDisposeObservable.addOnce(() => { - _UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = null; - }); + intersectsMesh(mesh, fastCheck, trianglePredicate, onlyBoundingInfo = false, worldToUse, skipBoundingInfo = false) { + const tm = TmpVectors.Matrix[0]; + mesh.getWorldMatrix().invertToRef(tm); + if (this._tmpRay) { + _Ray.TransformToRef(this, tm, this._tmpRay); + } else { + this._tmpRay = _Ray.Transform(this, tm); } - return _UtilityLayerRenderer._DefaultKeepDepthUtilityLayer; + return mesh.intersects(this._tmpRay, fastCheck, trianglePredicate, onlyBoundingInfo, worldToUse, skipBoundingInfo); } /** - * Instantiates a UtilityLayerRenderer - * @param originalScene the original scene that will be rendered on top of - * @param handleEvents boolean indicating if the utility layer should handle events + * Checks if ray intersects a mesh + * @param meshes the meshes to check + * @param fastCheck defines if the first intersection will be used (and not the closest) + * @param results array to store result in + * @returns Array of picking infos */ - constructor(originalScene, handleEvents = true) { - this.originalScene = originalScene; - this._pointerCaptures = {}; - this._lastPointerEvents = {}; - this._sharedGizmoLight = null; - this._renderCamera = null; - this.pickUtilitySceneFirst = true; - this.shouldRender = true; - this.onlyCheckPointerDownEvents = true; - this.processAllEvents = false; - this.pickingEnabled = true; - this.onPointerOutObservable = new Observable(); - this.utilityLayerScene = new Scene(originalScene.getEngine(), { virtual: true }); - this.utilityLayerScene.useRightHandedSystem = originalScene.useRightHandedSystem; - this.utilityLayerScene._allowPostProcessClearColor = false; - this.utilityLayerScene.postProcessesEnabled = false; - this.utilityLayerScene.detachControl(); - if (handleEvents) { - this._originalPointerObserver = originalScene.onPrePointerObservable.add((prePointerInfo) => { - if (!this.utilityLayerScene.activeCamera) { - return; - } - if (!this.pickingEnabled) { - return; - } - if (!this.processAllEvents) { - if (prePointerInfo.type !== PointerEventTypes.POINTERMOVE && prePointerInfo.type !== PointerEventTypes.POINTERUP && prePointerInfo.type !== PointerEventTypes.POINTERDOWN && prePointerInfo.type !== PointerEventTypes.POINTERDOUBLETAP) { - return; - } - } - this.utilityLayerScene.pointerX = originalScene.pointerX; - this.utilityLayerScene.pointerY = originalScene.pointerY; - const pointerEvent = prePointerInfo.event; - if (originalScene.isPointerCaptured(pointerEvent.pointerId)) { - this._pointerCaptures[pointerEvent.pointerId] = false; - return; - } - const getNearPickDataForScene = (scene) => { - let scenePick = null; - if (prePointerInfo.nearInteractionPickingInfo) { - if (prePointerInfo.nearInteractionPickingInfo.pickedMesh.getScene() == scene) { - scenePick = prePointerInfo.nearInteractionPickingInfo; - } else { - scenePick = new PickingInfo(); - } - } else if (scene !== this.utilityLayerScene && prePointerInfo.originalPickingInfo) { - scenePick = prePointerInfo.originalPickingInfo; - } else { - let previousActiveCamera = null; - if (this._renderCamera) { - previousActiveCamera = scene._activeCamera; - scene._activeCamera = this._renderCamera; - prePointerInfo.ray = null; - } - scenePick = prePointerInfo.ray ? scene.pickWithRay(prePointerInfo.ray) : scene.pick(originalScene.pointerX, originalScene.pointerY); - if (previousActiveCamera) { - scene._activeCamera = previousActiveCamera; - } - } - return scenePick; - }; - const utilityScenePick = getNearPickDataForScene(this.utilityLayerScene); - if (!prePointerInfo.ray && utilityScenePick) { - prePointerInfo.ray = utilityScenePick.ray; - } - this.utilityLayerScene.onPrePointerObservable.notifyObservers(prePointerInfo); - if (this.onlyCheckPointerDownEvents && prePointerInfo.type != PointerEventTypes.POINTERDOWN) { - if (!prePointerInfo.skipOnPointerObservable) { - this.utilityLayerScene.onPointerObservable.notifyObservers(new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick), prePointerInfo.type); - } - if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) { - this._pointerCaptures[pointerEvent.pointerId] = false; - } - return; - } - if (this.utilityLayerScene.autoClearDepthAndStencil || this.pickUtilitySceneFirst) { - if (utilityScenePick && utilityScenePick.hit) { - if (!prePointerInfo.skipOnPointerObservable) { - this.utilityLayerScene.onPointerObservable.notifyObservers(new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick), prePointerInfo.type); - } - prePointerInfo.skipOnPointerObservable = true; - } - } else { - const originalScenePick = getNearPickDataForScene(originalScene); - const pointerEvent2 = prePointerInfo.event; - if (originalScenePick && utilityScenePick) { - if (utilityScenePick.distance === 0 && originalScenePick.pickedMesh) { - if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) { - this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent2); - prePointerInfo.skipOnPointerObservable = true; - } else if (prePointerInfo.type === PointerEventTypes.POINTERDOWN) { - this._pointerCaptures[pointerEvent2.pointerId] = true; - } else if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) { - if (this._lastPointerEvents[pointerEvent2.pointerId]) { - this.onPointerOutObservable.notifyObservers(pointerEvent2.pointerId); - delete this._lastPointerEvents[pointerEvent2.pointerId]; - } - this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent2); - } - } else if (!this._pointerCaptures[pointerEvent2.pointerId] && (utilityScenePick.distance < originalScenePick.distance || originalScenePick.distance === 0)) { - this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent2); - if (!prePointerInfo.skipOnPointerObservable) { - prePointerInfo.skipOnPointerObservable = utilityScenePick.distance > 0; - } - } else if (!this._pointerCaptures[pointerEvent2.pointerId] && utilityScenePick.distance >= originalScenePick.distance) { - if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) { - this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent2); - prePointerInfo.skipOnPointerObservable = true; - } else { - if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) { - if (this._lastPointerEvents[pointerEvent2.pointerId]) { - this.onPointerOutObservable.notifyObservers(pointerEvent2.pointerId); - delete this._lastPointerEvents[pointerEvent2.pointerId]; - } - } - this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent2); - } - } - if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent2.pointerId]) { - this._pointerCaptures[pointerEvent2.pointerId] = false; - } - } - } - }); - if (this._originalPointerObserver) { - originalScene.onPrePointerObservable.makeObserverTopPriority(this._originalPointerObserver); - } + intersectsMeshes(meshes, fastCheck, results) { + if (results) { + results.length = 0; + } else { + results = []; } - this.utilityLayerScene.autoClear = false; - this._afterRenderObserver = this.originalScene.onAfterRenderCameraObservable.add((camera) => { - if (this.shouldRender && camera == this.getRenderCamera()) { - this.render(); + for (let i = 0; i < meshes.length; i++) { + const pickInfo = this.intersectsMesh(meshes[i], fastCheck); + if (pickInfo.hit) { + results.push(pickInfo); } - }); - this._sceneDisposeObserver = this.originalScene.onDisposeObservable.add(() => { - this.dispose(); - }); - this._updateCamera(); + } + results.sort(this._comparePickingInfo); + return results; } - _notifyObservers(prePointerInfo, pickInfo, pointerEvent) { - if (!prePointerInfo.skipOnPointerObservable) { - this.utilityLayerScene.onPointerObservable.notifyObservers(new PointerInfo(prePointerInfo.type, prePointerInfo.event, pickInfo), prePointerInfo.type); - this._lastPointerEvents[pointerEvent.pointerId] = true; + _comparePickingInfo(pickingInfoA, pickingInfoB) { + if (pickingInfoA.distance < pickingInfoB.distance) { + return -1; + } else if (pickingInfoA.distance > pickingInfoB.distance) { + return 1; + } else { + return 0; } } /** - * Renders the utility layers scene on top of the original scene + * Intersection test between the ray and a given segment within a given tolerance (threshold) + * @param sega the first point of the segment to test the intersection against + * @param segb the second point of the segment to test the intersection against + * @param threshold the tolerance margin, if the ray doesn't intersect the segment but is close to the given threshold, the intersection is successful + * @returns the distance from the ray origin to the intersection point if there's intersection, or -1 if there's no intersection */ - render() { - this._updateCamera(); - if (this.utilityLayerScene.activeCamera) { - const oldScene = this.utilityLayerScene.activeCamera.getScene(); - const camera = this.utilityLayerScene.activeCamera; - camera._scene = this.utilityLayerScene; - if (camera.leftCamera) { - camera.leftCamera._scene = this.utilityLayerScene; - } - if (camera.rightCamera) { - camera.rightCamera._scene = this.utilityLayerScene; + intersectionSegment(sega, segb, threshold) { + const o = this.origin; + const u = TmpVectors.Vector3[0]; + const rsegb = TmpVectors.Vector3[1]; + const v = TmpVectors.Vector3[2]; + const w = TmpVectors.Vector3[3]; + segb.subtractToRef(sega, u); + this.direction.scaleToRef(_Ray._Rayl, v); + o.addToRef(v, rsegb); + sega.subtractToRef(o, w); + const a = Vector3.Dot(u, u); + const b = Vector3.Dot(u, v); + const c = Vector3.Dot(v, v); + const d = Vector3.Dot(u, w); + const e = Vector3.Dot(v, w); + const D = a * c - b * b; + let sN, sD = D; + let tN, tD = D; + if (D < _Ray._Smallnum) { + sN = 0; + sD = 1; + tN = e; + tD = c; + } else { + sN = b * e - c * d; + tN = a * e - b * d; + if (sN < 0) { + sN = 0; + tN = e; + tD = c; + } else if (sN > sD) { + sN = sD; + tN = e + b; + tD = c; } - this.utilityLayerScene.render(false); - camera._scene = oldScene; - if (camera.leftCamera) { - camera.leftCamera._scene = oldScene; + } + if (tN < 0) { + tN = 0; + if (-d < 0) { + sN = 0; + } else if (-d > a) { + sN = sD; + } else { + sN = -d; + sD = a; } - if (camera.rightCamera) { - camera.rightCamera._scene = oldScene; + } else if (tN > tD) { + tN = tD; + if (-d + b < 0) { + sN = 0; + } else if (-d + b > a) { + sN = sD; + } else { + sN = -d + b; + sD = a; } } + const sc = Math.abs(sN) < _Ray._Smallnum ? 0 : sN / sD; + const tc = Math.abs(tN) < _Ray._Smallnum ? 0 : tN / tD; + const qtc = TmpVectors.Vector3[4]; + v.scaleToRef(tc, qtc); + const qsc = TmpVectors.Vector3[5]; + u.scaleToRef(sc, qsc); + qsc.addInPlace(w); + const dP = TmpVectors.Vector3[6]; + qsc.subtractToRef(qtc, dP); + const isIntersected = tc > 0 && tc <= this.length && dP.lengthSquared() < threshold * threshold; + if (isIntersected) { + return qsc.length(); + } + return -1; } /** - * Disposes of the renderer + * Update the ray from viewport position + * @param x position + * @param y y position + * @param viewportWidth viewport width + * @param viewportHeight viewport height + * @param world world matrix + * @param view view matrix + * @param projection projection matrix + * @param enableDistantPicking defines if picking should handle large values for mesh position/scaling (false by default) + * @returns this ray updated */ - dispose() { - this.onPointerOutObservable.clear(); - if (this._afterRenderObserver) { - this.originalScene.onAfterCameraRenderObservable.remove(this._afterRenderObserver); - } - if (this._sceneDisposeObserver) { - this.originalScene.onDisposeObservable.remove(this._sceneDisposeObserver); - } - if (this._originalPointerObserver) { - this.originalScene.onPrePointerObservable.remove(this._originalPointerObserver); + update(x, y, viewportWidth, viewportHeight, world, view, projection, enableDistantPicking = false) { + if (enableDistantPicking) { + if (!_Ray._RayDistant) { + _Ray._RayDistant = _Ray.Zero(); + } + _Ray._RayDistant.unprojectRayToRef(x, y, viewportWidth, viewportHeight, Matrix.IdentityReadOnly, view, projection); + const tm = TmpVectors.Matrix[0]; + world.invertToRef(tm); + _Ray.TransformToRef(_Ray._RayDistant, tm, this); + } else { + this.unprojectRayToRef(x, y, viewportWidth, viewportHeight, world, view, projection); } - this.utilityLayerScene.dispose(); + return this; } - _updateCamera() { - this.utilityLayerScene.cameraToUseForPointers = this.getRenderCamera(); - this.utilityLayerScene.activeCamera = this.getRenderCamera(); + // Statics + /** + * Creates a ray with origin and direction of 0,0,0 + * @returns the new ray + */ + static Zero() { + return new _Ray(Vector3.Zero(), Vector3.Zero()); } -}; -UtilityLayerRenderer._DefaultUtilityLayer = null; -UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = null; - -// node_modules/@babylonjs/core/Gizmos/gizmo.js -var GizmoAnchorPoint; -(function(GizmoAnchorPoint2) { - GizmoAnchorPoint2[GizmoAnchorPoint2["Origin"] = 0] = "Origin"; - GizmoAnchorPoint2[GizmoAnchorPoint2["Pivot"] = 1] = "Pivot"; -})(GizmoAnchorPoint || (GizmoAnchorPoint = {})); -var GizmoCoordinatesMode; -(function(GizmoCoordinatesMode2) { - GizmoCoordinatesMode2[GizmoCoordinatesMode2["World"] = 0] = "World"; - GizmoCoordinatesMode2[GizmoCoordinatesMode2["Local"] = 1] = "Local"; -})(GizmoCoordinatesMode || (GizmoCoordinatesMode = {})); -var Gizmo = class _Gizmo { /** - * Ratio for the scale of the gizmo (Default: 1) + * Creates a new ray from screen space and viewport + * @param x position + * @param y y position + * @param viewportWidth viewport width + * @param viewportHeight viewport height + * @param world world matrix + * @param view view matrix + * @param projection projection matrix + * @returns new ray */ - set scaleRatio(value) { - this._scaleRatio = value; + static CreateNew(x, y, viewportWidth, viewportHeight, world, view, projection) { + const result = _Ray.Zero(); + return result.update(x, y, viewportWidth, viewportHeight, world, view, projection); } - get scaleRatio() { - return this._scaleRatio; + /** + * Function will create a new transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be + * transformed to the given world matrix. + * @param origin The origin point + * @param end The end point + * @param world a matrix to transform the ray to. Default is the identity matrix. + * @returns the new ray + */ + static CreateNewFromTo(origin, end, world = Matrix.IdentityReadOnly) { + const result = new _Ray(new Vector3(0, 0, 0), new Vector3(0, 0, 0)); + return _Ray.CreateFromToToRef(origin, end, result, world); + } + /** + * Function will update a transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be + * transformed to the given world matrix. + * @param origin The origin point + * @param end The end point + * @param result the object to store the result + * @param world a matrix to transform the ray to. Default is the identity matrix. + * @returns the ref ray + */ + static CreateFromToToRef(origin, end, result, world = Matrix.IdentityReadOnly) { + result.origin.copyFrom(origin); + const direction = end.subtractToRef(origin, result.direction); + const length = Math.sqrt(direction.x * direction.x + direction.y * direction.y + direction.z * direction.z); + result.length = length; + result.direction.normalize(); + return _Ray.TransformToRef(result, world, result); } /** - * True when the mouse pointer is hovered a gizmo mesh + * Transforms a ray by a matrix + * @param ray ray to transform + * @param matrix matrix to apply + * @returns the resulting new ray */ - get isHovered() { - return this._isHovered; + static Transform(ray, matrix) { + const result = new _Ray(new Vector3(0, 0, 0), new Vector3(0, 0, 0)); + _Ray.TransformToRef(ray, matrix, result); + return result; } /** - * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged) - * * When set, interactions will be enabled + * Transforms a ray by a matrix + * @param ray ray to transform + * @param matrix matrix to apply + * @param result ray to store result in + * @returns the updated result ray */ - get attachedMesh() { - return this._attachedMesh; - } - set attachedMesh(value) { - this._attachedMesh = value; - if (value) { - this._attachedNode = value; + static TransformToRef(ray, matrix, result) { + Vector3.TransformCoordinatesToRef(ray.origin, matrix, result.origin); + Vector3.TransformNormalToRef(ray.direction, matrix, result.direction); + result.length = ray.length; + result.epsilon = ray.epsilon; + const dir = result.direction; + const len = dir.length(); + if (!(len === 0 || len === 1)) { + const num = 1 / len; + dir.x *= num; + dir.y *= num; + dir.z *= num; + result.length *= len; } - this._rootMesh.setEnabled(value ? true : false); - this._attachedNodeChanged(value); + return result; } /** - * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged) - * * When set, interactions will be enabled + * Unproject a ray from screen space to object space + * @param sourceX defines the screen space x coordinate to use + * @param sourceY defines the screen space y coordinate to use + * @param viewportWidth defines the current width of the viewport + * @param viewportHeight defines the current height of the viewport + * @param world defines the world matrix to use (can be set to Identity to go to world space) + * @param view defines the view matrix to use + * @param projection defines the projection matrix to use */ - get attachedNode() { - return this._attachedNode; + unprojectRayToRef(sourceX, sourceY, viewportWidth, viewportHeight, world, view, projection) { + const matrix = TmpVectors.Matrix[0]; + world.multiplyToRef(view, matrix); + matrix.multiplyToRef(projection, matrix); + matrix.invert(); + const engine = EngineStore.LastCreatedEngine; + const nearScreenSource = TmpVectors.Vector3[0]; + nearScreenSource.x = sourceX / viewportWidth * 2 - 1; + nearScreenSource.y = -(sourceY / viewportHeight * 2 - 1); + nearScreenSource.z = (engine == null ? void 0 : engine.useReverseDepthBuffer) ? 1 : (engine == null ? void 0 : engine.isNDCHalfZRange) ? 0 : -1; + const farScreenSource = TmpVectors.Vector3[1].copyFromFloats(nearScreenSource.x, nearScreenSource.y, 1 - 1e-8); + const nearVec3 = TmpVectors.Vector3[2]; + const farVec3 = TmpVectors.Vector3[3]; + Vector3._UnprojectFromInvertedMatrixToRef(nearScreenSource, matrix, nearVec3); + Vector3._UnprojectFromInvertedMatrixToRef(farScreenSource, matrix, farVec3); + this.origin.copyFrom(nearVec3); + farVec3.subtractToRef(nearVec3, this.direction); + this.direction.normalize(); } - set attachedNode(value) { - this._attachedNode = value; - this._attachedMesh = null; - this._rootMesh.setEnabled(value ? true : false); - this._attachedNodeChanged(value); +}; +Ray._TmpVector3 = ArrayTools.BuildArray(6, Vector3.Zero); +Ray._RayDistant = Ray.Zero(); +Ray._Smallnum = 1e-8; +Ray._Rayl = 1e9; +Scene.prototype.createPickingRay = function(x, y, world, camera, cameraViewSpace = false) { + const result = Ray.Zero(); + this.createPickingRayToRef(x, y, world, result, camera, cameraViewSpace); + return result; +}; +Scene.prototype.createPickingRayToRef = function(x, y, world, result, camera, cameraViewSpace = false, enableDistantPicking = false) { + const engine = this.getEngine(); + if (!camera && !(camera = this.activeCamera)) { + return this; } - /** - * Disposes and replaces the current meshes in the gizmo with the specified mesh - * @param mesh The mesh to replace the default mesh of the gizmo - */ - setCustomMesh(mesh) { - if (mesh.getScene() != this.gizmoLayer.utilityLayerScene) { - throw "When setting a custom mesh on a gizmo, the custom meshes scene must be the same as the gizmos (eg. gizmo.gizmoLayer.utilityLayerScene)"; + const cameraViewport = camera.viewport; + const renderHeight = engine.getRenderHeight(); + const { x: vx, y: vy, width, height } = cameraViewport.toGlobal(engine.getRenderWidth(), renderHeight); + const levelInv = 1 / engine.getHardwareScalingLevel(); + x = x * levelInv - vx; + y = y * levelInv - (renderHeight - vy - height); + result.update(x, y, width, height, world ? world : Matrix.IdentityReadOnly, cameraViewSpace ? Matrix.IdentityReadOnly : camera.getViewMatrix(), camera.getProjectionMatrix(), enableDistantPicking); + return this; +}; +Scene.prototype.createPickingRayInCameraSpace = function(x, y, camera) { + const result = Ray.Zero(); + this.createPickingRayInCameraSpaceToRef(x, y, result, camera); + return result; +}; +Scene.prototype.createPickingRayInCameraSpaceToRef = function(x, y, result, camera) { + if (!PickingInfo) { + return this; + } + const engine = this.getEngine(); + if (!camera && !(camera = this.activeCamera)) { + throw new Error("Active camera not set"); + } + const cameraViewport = camera.viewport; + const renderHeight = engine.getRenderHeight(); + const { x: vx, y: vy, width, height } = cameraViewport.toGlobal(engine.getRenderWidth(), renderHeight); + const identity = Matrix.Identity(); + const levelInv = 1 / engine.getHardwareScalingLevel(); + x = x * levelInv - vx; + y = y * levelInv - (renderHeight - vy - height); + result.update(x, y, width, height, identity, identity, camera.getProjectionMatrix()); + return this; +}; +Scene.prototype._internalPickForMesh = function(pickingInfo, rayFunction, mesh, world, fastCheck, onlyBoundingInfo, trianglePredicate, skipBoundingInfo) { + const ray = rayFunction(world, mesh.enableDistantPicking); + const result = mesh.intersects(ray, fastCheck, trianglePredicate, onlyBoundingInfo, world, skipBoundingInfo); + if (!result || !result.hit) { + return null; + } + if (!fastCheck && pickingInfo != null && result.distance >= pickingInfo.distance) { + return null; + } + return result; +}; +Scene.prototype._internalPick = function(rayFunction, predicate, fastCheck, onlyBoundingInfo, trianglePredicate) { + let pickingInfo = null; + const computeWorldMatrixForCamera = !!(this.activeCameras && this.activeCameras.length > 1 && this.cameraToUseForPointers !== this.activeCamera); + const currentCamera = this.cameraToUseForPointers || this.activeCamera; + for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) { + const mesh = this.meshes[meshIndex]; + if (predicate) { + if (!predicate(mesh)) { + continue; + } + } else if (!mesh.isEnabled() || !mesh.isVisible || !mesh.isPickable) { + continue; + } + const forceCompute = computeWorldMatrixForCamera && mesh.isWorldMatrixCameraDependent(); + const world = mesh.computeWorldMatrix(forceCompute, currentCamera); + if (mesh.hasThinInstances && mesh.thinInstanceEnablePicking) { + const result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, world, true, true, trianglePredicate); + if (result) { + if (onlyBoundingInfo) { + return result; + } + const tmpMatrix = TmpVectors.Matrix[1]; + const thinMatrices = mesh.thinInstanceGetWorldMatrices(); + for (let index = 0; index < thinMatrices.length; index++) { + const thinMatrix = thinMatrices[index]; + thinMatrix.multiplyToRef(world, tmpMatrix); + const result2 = this._internalPickForMesh(pickingInfo, rayFunction, mesh, tmpMatrix, fastCheck, onlyBoundingInfo, trianglePredicate, true); + if (result2) { + pickingInfo = result2; + pickingInfo.thinInstanceIndex = index; + if (fastCheck) { + return pickingInfo; + } + } + } + } + } else { + const result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, world, fastCheck, onlyBoundingInfo, trianglePredicate); + if (result) { + pickingInfo = result; + if (fastCheck) { + return pickingInfo; + } + } } - this._rootMesh.getChildMeshes().forEach((c) => { - c.dispose(); - }); - mesh.parent = this._rootMesh; - this._customMeshSet = true; } - /** - * Additional transform applied to the gizmo. - * It's useful when the gizmo is attached to a bone: if the bone is part of a skeleton attached to a mesh, you should define the mesh as additionalTransformNode if you want the gizmo to be displayed at the bone's correct location. - * Otherwise, as the gizmo is relative to the skeleton root, the mesh transformation will not be taken into account. - */ - get additionalTransformNode() { - return this._additionalTransformNode; + return pickingInfo || new PickingInfo(); +}; +Scene.prototype._internalMultiPick = function(rayFunction, predicate, trianglePredicate) { + if (!PickingInfo) { + return null; } - set additionalTransformNode(value) { - this._additionalTransformNode = value; + const pickingInfos = []; + const computeWorldMatrixForCamera = !!(this.activeCameras && this.activeCameras.length > 1 && this.cameraToUseForPointers !== this.activeCamera); + const currentCamera = this.cameraToUseForPointers || this.activeCamera; + for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) { + const mesh = this.meshes[meshIndex]; + if (predicate) { + if (!predicate(mesh)) { + continue; + } + } else if (!mesh.isEnabled() || !mesh.isVisible || !mesh.isPickable) { + continue; + } + const forceCompute = computeWorldMatrixForCamera && mesh.isWorldMatrixCameraDependent(); + const world = mesh.computeWorldMatrix(forceCompute, currentCamera); + if (mesh.hasThinInstances && mesh.thinInstanceEnablePicking) { + const result = this._internalPickForMesh(null, rayFunction, mesh, world, true, true, trianglePredicate); + if (result) { + const tmpMatrix = TmpVectors.Matrix[1]; + const thinMatrices = mesh.thinInstanceGetWorldMatrices(); + for (let index = 0; index < thinMatrices.length; index++) { + const thinMatrix = thinMatrices[index]; + thinMatrix.multiplyToRef(world, tmpMatrix); + const result2 = this._internalPickForMesh(null, rayFunction, mesh, tmpMatrix, false, false, trianglePredicate, true); + if (result2) { + result2.thinInstanceIndex = index; + pickingInfos.push(result2); + } + } + } + } else { + const result = this._internalPickForMesh(null, rayFunction, mesh, world, false, false, trianglePredicate); + if (result) { + pickingInfos.push(result); + } + } } - /** - * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true) - * NOTE: This is only possible for meshes with uniform scaling, as otherwise it's not possible to decompose the rotation - */ - set updateGizmoRotationToMatchAttachedMesh(value) { - this._updateGizmoRotationToMatchAttachedMesh = value; + return pickingInfos; +}; +Scene.prototype.pickWithBoundingInfo = function(x, y, predicate, fastCheck, camera) { + if (!PickingInfo) { + return null; } - get updateGizmoRotationToMatchAttachedMesh() { - return this._updateGizmoRotationToMatchAttachedMesh; + const result = this._internalPick((world) => { + if (!this._tempPickingRay) { + this._tempPickingRay = Ray.Zero(); + } + this.createPickingRayToRef(x, y, world, this._tempPickingRay, camera || null); + return this._tempPickingRay; + }, predicate, fastCheck, true); + if (result) { + result.ray = this.createPickingRay(x, y, Matrix.Identity(), camera || null); } - /** - * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true) - */ - set updateGizmoPositionToMatchAttachedMesh(value) { - this._updateGizmoPositionToMatchAttachedMesh = value; + return result; +}; +Object.defineProperty(Scene.prototype, "_pickingAvailable", { + get: () => true, + enumerable: false, + configurable: false +}); +Scene.prototype.pick = function(x, y, predicate, fastCheck, camera, trianglePredicate, _enableDistantPicking = false) { + const result = this._internalPick((world, enableDistantPicking) => { + if (!this._tempPickingRay) { + this._tempPickingRay = Ray.Zero(); + } + this.createPickingRayToRef(x, y, world, this._tempPickingRay, camera || null, false, enableDistantPicking); + return this._tempPickingRay; + }, predicate, fastCheck, false, trianglePredicate); + if (result) { + result.ray = this.createPickingRay(x, y, Matrix.Identity(), camera || null); } - get updateGizmoPositionToMatchAttachedMesh() { - return this._updateGizmoPositionToMatchAttachedMesh; + return result; +}; +Scene.prototype.pickWithRay = function(ray, predicate, fastCheck, trianglePredicate) { + const result = this._internalPick((world) => { + if (!this._pickWithRayInverseMatrix) { + this._pickWithRayInverseMatrix = Matrix.Identity(); + } + world.invertToRef(this._pickWithRayInverseMatrix); + if (!this._cachedRayForTransform) { + this._cachedRayForTransform = Ray.Zero(); + } + Ray.TransformToRef(ray, this._pickWithRayInverseMatrix, this._cachedRayForTransform); + return this._cachedRayForTransform; + }, predicate, fastCheck, false, trianglePredicate); + if (result) { + result.ray = ray; } - /** - * Defines where the gizmo will be positioned if `updateGizmoPositionToMatchAttachedMesh` is enabled. - * (Default: GizmoAnchorPoint.Origin) - */ - set anchorPoint(value) { - this._anchorPoint = value; + return result; +}; +Scene.prototype.multiPick = function(x, y, predicate, camera, trianglePredicate) { + return this._internalMultiPick((world) => this.createPickingRay(x, y, world, camera || null), predicate, trianglePredicate); +}; +Scene.prototype.multiPickWithRay = function(ray, predicate, trianglePredicate) { + return this._internalMultiPick((world) => { + if (!this._pickWithRayInverseMatrix) { + this._pickWithRayInverseMatrix = Matrix.Identity(); + } + world.invertToRef(this._pickWithRayInverseMatrix); + if (!this._cachedRayForTransform) { + this._cachedRayForTransform = Ray.Zero(); + } + Ray.TransformToRef(ray, this._pickWithRayInverseMatrix, this._cachedRayForTransform); + return this._cachedRayForTransform; + }, predicate, trianglePredicate); +}; +Camera.prototype.getForwardRay = function(length = 100, transform, origin) { + return this.getForwardRayToRef(new Ray(Vector3.Zero(), Vector3.Zero(), length), length, transform, origin); +}; +Camera.prototype.getForwardRayToRef = function(refRay, length = 100, transform, origin) { + if (!transform) { + transform = this.getWorldMatrix(); } - get anchorPoint() { - return this._anchorPoint; + refRay.length = length; + if (origin) { + refRay.origin.copyFrom(origin); + } else { + refRay.origin.copyFrom(this.position); } + const forward = TmpVectors.Vector3[2]; + forward.set(0, 0, this._scene.useRightHandedSystem ? -1 : 1); + const worldForward = TmpVectors.Vector3[3]; + Vector3.TransformNormalToRef(forward, transform, worldForward); + Vector3.NormalizeToRef(worldForward, refRay.direction); + return refRay; +}; + +// node_modules/@babylonjs/core/Behaviors/Meshes/pointerDragBehavior.js +var PointerDragBehavior = class _PointerDragBehavior { /** - * Set the coordinate system to use. By default it's local. - * But it's possible for a user to tweak so its local for translation and world for rotation. - * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh` + * Get or set the currentDraggingPointerId + * @deprecated Please use currentDraggingPointerId instead */ - set coordinatesMode(coordinatesMode) { - this._coordinatesMode = coordinatesMode; - const local = coordinatesMode == GizmoCoordinatesMode.Local; - this.updateGizmoRotationToMatchAttachedMesh = local; - this.updateGizmoPositionToMatchAttachedMesh = true; + get currentDraggingPointerID() { + return this.currentDraggingPointerId; } - get coordinatesMode() { - return this._coordinatesMode; + set currentDraggingPointerID(currentDraggingPointerID) { + this.currentDraggingPointerId = currentDraggingPointerID; } /** - * When set, the gizmo will always appear the same size no matter where the camera is (default: true) + * If the drag behavior will react to drag events (Default: true) */ - set updateScale(value) { - this._updateScale = value; - } - get updateScale() { - return this._updateScale; + set enabled(value) { + if (value != this._enabled) { + this.onEnabledObservable.notifyObservers(value); + } + this._enabled = value; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _attachedNodeChanged(value) { + get enabled() { + return this._enabled; } /** - * Creates a gizmo - * @param gizmoLayer The utility layer the gizmo will be added to + * Gets the options used by the behavior */ - constructor(gizmoLayer = UtilityLayerRenderer.DefaultUtilityLayer) { - this.gizmoLayer = gizmoLayer; - this._attachedMesh = null; - this._attachedNode = null; - this._customRotationQuaternion = null; - this._scaleRatio = 1; - this._isHovered = false; - this._customMeshSet = false; - this._updateGizmoRotationToMatchAttachedMesh = true; - this._updateGizmoPositionToMatchAttachedMesh = true; - this._anchorPoint = GizmoAnchorPoint.Origin; - this._updateScale = true; - this._coordinatesMode = GizmoCoordinatesMode.Local; - this._interactionsEnabled = true; - this._rightHandtoLeftHandMatrix = Matrix.RotationY(Math.PI); - this._rootMesh = new Mesh("gizmoRootNode", gizmoLayer.utilityLayerScene); - this._rootMesh.rotationQuaternion = Quaternion.Identity(); - this._beforeRenderObserver = this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.add(() => { - this._update(); - }); + get options() { + return this._options; } /** - * posture that the gizmo will be display - * When set null, default value will be used (Quaternion(0, 0, 0, 1)) + * Sets the options used by the behavior */ - get customRotationQuaternion() { - return this._customRotationQuaternion; - } - set customRotationQuaternion(customRotationQuaternion) { - this._customRotationQuaternion = customRotationQuaternion; + set options(options) { + this._options = options; } /** - * Updates the gizmo to match the attached mesh's position/rotation + * Creates a pointer drag behavior that can be attached to a mesh + * @param options The drag axis or normal of the plane that will be dragged across. If no options are specified the drag plane will always face the ray's origin (eg. camera) + * @param options.dragAxis + * @param options.dragPlaneNormal */ - _update() { - if (this.attachedNode) { - let effectiveNode = this.attachedNode; - if (this.attachedMesh) { - effectiveNode = this.attachedMesh || this.attachedNode; - } - if (this.updateGizmoPositionToMatchAttachedMesh) { - if (this.anchorPoint == GizmoAnchorPoint.Pivot && effectiveNode.getAbsolutePivotPoint) { - const position = effectiveNode.getAbsolutePivotPoint(); - this._rootMesh.position.copyFrom(position); - } else { - const row = effectiveNode.getWorldMatrix().getRow(3); - const position = row ? row.toVector3() : new Vector3(0, 0, 0); - this._rootMesh.position.copyFrom(position); - } - } - if (this.updateGizmoRotationToMatchAttachedMesh) { - const supportedNode = effectiveNode._isMesh || effectiveNode.getClassName() === "AbstractMesh" || effectiveNode.getClassName() === "TransformNode" || effectiveNode.getClassName() === "InstancedMesh"; - const transformNode = supportedNode ? effectiveNode : void 0; - effectiveNode.getWorldMatrix().decompose(void 0, this._rootMesh.rotationQuaternion, void 0, _Gizmo.PreserveScaling ? transformNode : void 0); - this._rootMesh.rotationQuaternion.normalize(); - } else { - if (this._customRotationQuaternion) { - this._rootMesh.rotationQuaternion.copyFrom(this._customRotationQuaternion); - } else { - this._rootMesh.rotationQuaternion.set(0, 0, 0, 1); - } - } - if (this.updateScale) { - const activeCamera = this.gizmoLayer.utilityLayerScene.activeCamera; - const cameraPosition = activeCamera.globalPosition; - this._rootMesh.position.subtractToRef(cameraPosition, TmpVectors.Vector3[0]); - let scale = this.scaleRatio; - if (activeCamera.mode == Camera.ORTHOGRAPHIC_CAMERA) { - if (activeCamera.orthoTop && activeCamera.orthoBottom) { - const orthoHeight = activeCamera.orthoTop - activeCamera.orthoBottom; - scale *= orthoHeight; - } - } else { - const camForward = activeCamera.getScene().useRightHandedSystem ? Vector3.RightHandedForwardReadOnly : Vector3.LeftHandedForwardReadOnly; - const direction = activeCamera.getDirection(camForward); - scale *= Vector3.Dot(TmpVectors.Vector3[0], direction); - } - this._rootMesh.scaling.setAll(scale); - if (effectiveNode._getWorldMatrixDeterminant() < 0 && !_Gizmo.PreserveScaling) { - this._rootMesh.scaling.y *= -1; - } - } else { - this._rootMesh.scaling.setAll(this.scaleRatio); - } + constructor(options) { + this._useAlternatePickedPointAboveMaxDragAngleDragSpeed = -1.1; + this._activeDragButton = -1; + this.maxDragAngle = 0; + this.dragButtons = [0, 1, 2]; + this._useAlternatePickedPointAboveMaxDragAngle = false; + this.currentDraggingPointerId = -1; + this.dragging = false; + this.dragDeltaRatio = 0.2; + this.updateDragPlane = true; + this._debugMode = false; + this._moving = false; + this.onDragObservable = new Observable(); + this.onDragStartObservable = new Observable(); + this.onDragEndObservable = new Observable(); + this.onEnabledObservable = new Observable(); + this.moveAttached = true; + this._enabled = true; + this.startAndReleaseDragOnPointerEvents = true; + this.detachCameraControls = true; + this.useObjectOrientationForDragging = true; + this.validateDrag = (target) => { + return true; + }; + this._tmpVector = new Vector3(0, 0, 0); + this._alternatePickedPoint = new Vector3(0, 0, 0); + this._worldDragAxis = new Vector3(0, 0, 0); + this._targetPosition = new Vector3(0, 0, 0); + this._attachedToElement = false; + this._startDragRay = new Ray(new Vector3(), new Vector3()); + this._lastPointerRay = {}; + this._dragDelta = new Vector3(); + this._pointA = new Vector3(0, 0, 0); + this._pointC = new Vector3(0, 0, 0); + this._localAxis = new Vector3(0, 0, 0); + this._lookAt = new Vector3(0, 0, 0); + this._options = options ? options : {}; + let optionCount = 0; + if (this._options.dragAxis) { + optionCount++; } - if (this.additionalTransformNode) { - this._rootMesh.computeWorldMatrix(true); - this._rootMesh.getWorldMatrix().multiplyToRef(this.additionalTransformNode.getWorldMatrix(), TmpVectors.Matrix[0]); - TmpVectors.Matrix[0].decompose(this._rootMesh.scaling, this._rootMesh.rotationQuaternion, this._rootMesh.position); + if (this._options.dragPlaneNormal) { + optionCount++; + } + if (optionCount > 1) { + throw "Multiple drag modes specified in dragBehavior options. Only one expected"; } } /** - * if transform has a pivot and is not using PostMultiplyPivotMatrix, then the worldMatrix contains the pivot matrix (it's not cancelled at the end) - * so, when extracting the world matrix component, the translation (and other components) is containing the pivot translation. - * And the pivot is applied each frame. Removing it anyway here makes it applied only in computeWorldMatrix. - * @param transform local transform that needs to be transform by the pivot inverse matrix - * @param localMatrix local matrix that needs to be transform by the pivot inverse matrix - * @param result resulting matrix transformed by pivot inverse if the transform node is using pivot without using post Multiply Pivot Matrix + * The name of the behavior */ - _handlePivotMatrixInverse(transform, localMatrix, result) { - if (transform.isUsingPivotMatrix() && !transform.isUsingPostMultiplyPivotMatrix()) { - transform.getPivotMatrix().invertToRef(TmpVectors.Matrix[5]); - TmpVectors.Matrix[5].multiplyToRef(localMatrix, result); - return; - } - result.copyFrom(localMatrix); + get name() { + return "PointerDrag"; } /** - * computes the rotation/scaling/position of the transform once the Node world matrix has changed. + * Initializes the behavior */ - _matrixChanged() { - if (!this._attachedNode) { - return; - } - if (this._attachedNode._isCamera) { - const camera = this._attachedNode; - let worldMatrix; - let worldMatrixUC; - if (camera.parent) { - const parentInv = TmpVectors.Matrix[1]; - camera.parent._worldMatrix.invertToRef(parentInv); - this._attachedNode._worldMatrix.multiplyToRef(parentInv, TmpVectors.Matrix[0]); - worldMatrix = TmpVectors.Matrix[0]; - } else { - worldMatrix = this._attachedNode._worldMatrix; - } - if (camera.getScene().useRightHandedSystem) { - this._rightHandtoLeftHandMatrix.multiplyToRef(worldMatrix, TmpVectors.Matrix[1]); - worldMatrixUC = TmpVectors.Matrix[1]; - } else { - worldMatrixUC = worldMatrix; - } - worldMatrixUC.decompose(TmpVectors.Vector3[1], TmpVectors.Quaternion[0], TmpVectors.Vector3[0]); - const inheritsTargetCamera = this._attachedNode.getClassName() === "FreeCamera" || this._attachedNode.getClassName() === "FlyCamera" || this._attachedNode.getClassName() === "ArcFollowCamera" || this._attachedNode.getClassName() === "TargetCamera" || this._attachedNode.getClassName() === "TouchCamera" || this._attachedNode.getClassName() === "UniversalCamera"; - if (inheritsTargetCamera) { - const targetCamera = this._attachedNode; - targetCamera.rotation = TmpVectors.Quaternion[0].toEulerAngles(); - if (targetCamera.rotationQuaternion) { - targetCamera.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]); - targetCamera.rotationQuaternion.normalize(); - } - } - camera.position.copyFrom(TmpVectors.Vector3[0]); - } else if (this._attachedNode._isMesh || this._attachedNode.getClassName() === "AbstractMesh" || this._attachedNode.getClassName() === "TransformNode" || this._attachedNode.getClassName() === "InstancedMesh") { - const transform = this._attachedNode; - if (transform.parent) { - const parentInv = TmpVectors.Matrix[0]; - const localMat = TmpVectors.Matrix[1]; - transform.parent.getWorldMatrix().invertToRef(parentInv); - this._attachedNode.getWorldMatrix().multiplyToRef(parentInv, localMat); - const matrixToDecompose = TmpVectors.Matrix[4]; - this._handlePivotMatrixInverse(transform, localMat, matrixToDecompose); - matrixToDecompose.decompose(TmpVectors.Vector3[0], TmpVectors.Quaternion[0], transform.position, _Gizmo.PreserveScaling ? transform : void 0, _Gizmo.UseAbsoluteScaling); - TmpVectors.Quaternion[0].normalize(); - if (transform.isUsingPivotMatrix()) { - const r = TmpVectors.Quaternion[1]; - Quaternion.RotationYawPitchRollToRef(transform.rotation.y, transform.rotation.x, transform.rotation.z, r); - const scaleMatrix = TmpVectors.Matrix[2]; - Matrix.ScalingToRef(transform.scaling.x, transform.scaling.y, transform.scaling.z, scaleMatrix); - const rotationMatrix = TmpVectors.Matrix[2]; - r.toRotationMatrix(rotationMatrix); - const pivotMatrix = transform.getPivotMatrix(); - const invPivotMatrix = TmpVectors.Matrix[3]; - pivotMatrix.invertToRef(invPivotMatrix); - pivotMatrix.multiplyToRef(scaleMatrix, TmpVectors.Matrix[4]); - TmpVectors.Matrix[4].multiplyToRef(rotationMatrix, TmpVectors.Matrix[5]); - TmpVectors.Matrix[5].multiplyToRef(invPivotMatrix, TmpVectors.Matrix[6]); - TmpVectors.Matrix[6].getTranslationToRef(TmpVectors.Vector3[1]); - transform.position.subtractInPlace(TmpVectors.Vector3[1]); - } + init() { + } + /** + * Attaches the drag behavior the passed in mesh + * @param ownerNode The mesh that will be dragged around once attached + * @param predicate Predicate to use for pick filtering + */ + attach(ownerNode, predicate) { + this._scene = ownerNode.getScene(); + ownerNode.isNearGrabbable = true; + this.attachedNode = ownerNode; + if (!_PointerDragBehavior._PlaneScene) { + if (this._debugMode) { + _PointerDragBehavior._PlaneScene = this._scene; } else { - const matrixToDecompose = TmpVectors.Matrix[4]; - this._handlePivotMatrixInverse(transform, this._attachedNode._worldMatrix, matrixToDecompose); - matrixToDecompose.decompose(TmpVectors.Vector3[0], TmpVectors.Quaternion[0], transform.position, _Gizmo.PreserveScaling ? transform : void 0, _Gizmo.UseAbsoluteScaling); + _PointerDragBehavior._PlaneScene = new Scene(this._scene.getEngine(), { virtual: true }); + _PointerDragBehavior._PlaneScene.detachControl(); + this._scene.onDisposeObservable.addOnce(() => { + _PointerDragBehavior._PlaneScene.dispose(); + _PointerDragBehavior._PlaneScene = null; + }); } - TmpVectors.Vector3[0].scaleInPlace(1 / transform.scalingDeterminant); - transform.scaling.copyFrom(TmpVectors.Vector3[0]); - if (!transform.billboardMode) { - if (transform.rotationQuaternion) { - transform.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]); - transform.rotationQuaternion.normalize(); - } else { - transform.rotation = TmpVectors.Quaternion[0].toEulerAngles(); + } + this._dragPlane = CreatePlane("pointerDragPlane", { size: this._debugMode ? 1 : 1e4, updatable: false, sideOrientation: Mesh.DOUBLESIDE }, _PointerDragBehavior._PlaneScene); + this.lastDragPosition = new Vector3(0, 0, 0); + const pickPredicate = predicate ? predicate : (m) => { + return this.attachedNode == m || m.isDescendantOf(this.attachedNode); + }; + this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => { + if (!this.enabled) { + if (this._attachedToElement) { + this.releaseDrag(); } + return; } - } else if (this._attachedNode.getClassName() === "Bone") { - const bone = this._attachedNode; - const parent = bone.getParent(); - if (parent) { - const invParent = TmpVectors.Matrix[0]; - const boneLocalMatrix = TmpVectors.Matrix[1]; - parent.getFinalMatrix().invertToRef(invParent); - bone.getFinalMatrix().multiplyToRef(invParent, boneLocalMatrix); - const lmat = bone.getLocalMatrix(); - lmat.copyFrom(boneLocalMatrix); - } else { - const lmat = bone.getLocalMatrix(); - lmat.copyFrom(bone.getFinalMatrix()); - } - bone.markAsDirty(); - } else { - const light = this._attachedNode; - if (light.getTypeID) { - const type = light.getTypeID(); - if (type === Light.LIGHTTYPEID_DIRECTIONALLIGHT || type === Light.LIGHTTYPEID_SPOTLIGHT || type === Light.LIGHTTYPEID_POINTLIGHT) { - const parent = light.parent; - if (parent) { - const invParent = TmpVectors.Matrix[0]; - const nodeLocalMatrix = TmpVectors.Matrix[1]; - parent.getWorldMatrix().invertToRef(invParent); - light.getWorldMatrix().multiplyToRef(invParent, nodeLocalMatrix); - nodeLocalMatrix.decompose(void 0, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]); - } else { - this._attachedNode._worldMatrix.decompose(void 0, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]); - } - light.position = new Vector3(TmpVectors.Vector3[0].x, TmpVectors.Vector3[0].y, TmpVectors.Vector3[0].z); - if (light.direction) { - light.direction = new Vector3(light.direction.x, light.direction.y, light.direction.z); + if (pointerInfo.type == PointerEventTypes.POINTERDOWN) { + if (this.startAndReleaseDragOnPointerEvents && !this.dragging && pointerInfo.pickInfo && pointerInfo.pickInfo.hit && pointerInfo.pickInfo.pickedMesh && pointerInfo.pickInfo.pickedPoint && pointerInfo.pickInfo.ray && pickPredicate(pointerInfo.pickInfo.pickedMesh)) { + if (this._activeDragButton === -1 && this.dragButtons.indexOf(pointerInfo.event.button) !== -1) { + this._activeDragButton = pointerInfo.event.button; + this._activePointerInfo = pointerInfo; + this._startDrag(pointerInfo.event.pointerId, pointerInfo.pickInfo.ray, pointerInfo.pickInfo.pickedPoint); } } - } - } - } - /** - * refresh gizmo mesh material - * @param gizmoMeshes - * @param material material to apply - */ - _setGizmoMeshMaterial(gizmoMeshes, material) { - if (gizmoMeshes) { - gizmoMeshes.forEach((m) => { - m.material = material; - if (m.color) { - m.color = material.diffuseColor; + } else if (pointerInfo.type == PointerEventTypes.POINTERUP) { + if (this.startAndReleaseDragOnPointerEvents && this.currentDraggingPointerId == pointerInfo.event.pointerId && (this._activeDragButton === pointerInfo.event.button || this._activeDragButton === -1)) { + this.releaseDrag(); } - }); - } - } - /** - * Subscribes to pointer up, down, and hover events. Used for responsive gizmos. - * @param gizmoLayer The utility layer the gizmo will be added to - * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI - * @returns {Observer} pointerObserver - */ - static GizmoAxisPointerObserver(gizmoLayer, gizmoAxisCache) { - let dragging = false; - const pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => { - var _a, _b; - if (pointerInfo.pickInfo) { - if (pointerInfo.type === PointerEventTypes.POINTERMOVE) { - if (dragging) { - return; - } - gizmoAxisCache.forEach((cache) => { - var _a2, _b2; - if (cache.colliderMeshes && cache.gizmoMeshes) { - const isHovered = ((_b2 = cache.colliderMeshes) == null ? void 0 : _b2.indexOf((_a2 = pointerInfo == null ? void 0 : pointerInfo.pickInfo) == null ? void 0 : _a2.pickedMesh)) != -1; - const material = cache.dragBehavior.enabled ? isHovered || cache.active ? cache.hoverMaterial : cache.material : cache.disableMaterial; - cache.gizmoMeshes.forEach((m) => { - m.material = material; - if (m.color) { - m.color = material.diffuseColor; - } - }); + } else if (pointerInfo.type == PointerEventTypes.POINTERMOVE) { + const pointerId = pointerInfo.event.pointerId; + if (this.currentDraggingPointerId === _PointerDragBehavior._AnyMouseId && pointerId !== _PointerDragBehavior._AnyMouseId) { + const evt = pointerInfo.event; + const isMouseEvent = evt.pointerType === "mouse" || !this._scene.getEngine().hostInformation.isMobile && evt instanceof MouseEvent; + if (isMouseEvent) { + if (this._lastPointerRay[this.currentDraggingPointerId]) { + this._lastPointerRay[pointerId] = this._lastPointerRay[this.currentDraggingPointerId]; + delete this._lastPointerRay[this.currentDraggingPointerId]; } - }); - } - if (pointerInfo.type === PointerEventTypes.POINTERDOWN) { - if (gizmoAxisCache.has((_a = pointerInfo.pickInfo.pickedMesh) == null ? void 0 : _a.parent)) { - dragging = true; - const statusMap = gizmoAxisCache.get((_b = pointerInfo.pickInfo.pickedMesh) == null ? void 0 : _b.parent); - statusMap.active = true; - gizmoAxisCache.forEach((cache) => { - var _a2, _b2; - const isHovered = ((_b2 = cache.colliderMeshes) == null ? void 0 : _b2.indexOf((_a2 = pointerInfo == null ? void 0 : pointerInfo.pickInfo) == null ? void 0 : _a2.pickedMesh)) != -1; - const material = (isHovered || cache.active) && cache.dragBehavior.enabled ? cache.hoverMaterial : cache.disableMaterial; - cache.gizmoMeshes.forEach((m) => { - m.material = material; - if (m.color) { - m.color = material.diffuseColor; - } - }); - }); + this.currentDraggingPointerId = pointerId; } } - if (pointerInfo.type === PointerEventTypes.POINTERUP) { - gizmoAxisCache.forEach((cache) => { - cache.active = false; - dragging = false; - cache.gizmoMeshes.forEach((m) => { - m.material = cache.dragBehavior.enabled ? cache.material : cache.disableMaterial; - if (m.color) { - m.color = cache.material.diffuseColor; - } - }); - }); + if (!this._lastPointerRay[pointerId]) { + this._lastPointerRay[pointerId] = new Ray(new Vector3(), new Vector3()); } - } - }); - return pointerObserver; - } - /** - * Disposes of the gizmo - */ - dispose() { - this._rootMesh.dispose(); - if (this._beforeRenderObserver) { - this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.remove(this._beforeRenderObserver); - } - } -}; -Gizmo.PreserveScaling = false; -Gizmo.UseAbsoluteScaling = true; - -// node_modules/@babylonjs/core/Meshes/Builders/boxBuilder.js -function CreateBoxVertexData(options) { - const nbFaces = 6; - let indices = [0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23]; - const normals = [ - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - -1, - 0, - 0, - -1, - 0, - 0, - -1, - 0, - 0, - -1, - 1, - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - -1, - 0, - 0, - -1, - 0, - 0, - -1, - 0, - 0, - -1, - 0, - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - -1, - 0, - 0, - -1, - 0, - 0, - -1, - 0, - 0, - -1, - 0 - ]; - const uvs = []; - let positions = []; - const width = options.width || options.size || 1; - const height = options.height || options.size || 1; - const depth = options.depth || options.size || 1; - const wrap = options.wrap || false; - let topBaseAt = options.topBaseAt === void 0 ? 1 : options.topBaseAt; - let bottomBaseAt = options.bottomBaseAt === void 0 ? 0 : options.bottomBaseAt; - topBaseAt = (topBaseAt + 4) % 4; - bottomBaseAt = (bottomBaseAt + 4) % 4; - const topOrder = [2, 0, 3, 1]; - const bottomOrder = [2, 0, 1, 3]; - let topIndex = topOrder[topBaseAt]; - let bottomIndex = bottomOrder[bottomBaseAt]; - let basePositions = [ - 1, - -1, - 1, - -1, - -1, - 1, - -1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - -1, - -1, - 1, - -1, - -1, - -1, - -1, - 1, - -1, - -1, - 1, - 1, - -1, - 1, - -1, - -1, - 1, - -1, - 1, - 1, - 1, - 1, - -1, - 1, - 1, - -1, - -1, - 1, - -1, - -1, - -1, - -1, - 1, - -1, - -1, - 1, - 1, - -1, - 1, - -1, - 1, - 1, - -1, - 1, - 1, - 1, - 1, - -1, - 1, - 1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - 1 - ]; - if (wrap) { - indices = [2, 3, 0, 2, 0, 1, 4, 5, 6, 4, 6, 7, 9, 10, 11, 9, 11, 8, 12, 14, 15, 12, 13, 14]; - basePositions = [ - -1, - 1, - 1, - 1, - 1, - 1, - 1, - -1, - 1, - -1, - -1, - 1, - 1, - 1, - -1, - -1, - 1, - -1, - -1, - -1, - -1, - 1, - -1, - -1, - 1, - 1, - 1, - 1, - 1, - -1, - 1, - -1, - -1, - 1, - -1, - 1, - -1, - 1, - -1, - -1, - 1, - 1, - -1, - -1, - 1, - -1, - -1, - -1 - ]; - let topFaceBase = [ - [1, 1, 1], - [-1, 1, 1], - [-1, 1, -1], - [1, 1, -1] - ]; - let bottomFaceBase = [ - [-1, -1, 1], - [1, -1, 1], - [1, -1, -1], - [-1, -1, -1] - ]; - const topFaceOrder = [17, 18, 19, 16]; - const bottomFaceOrder = [22, 23, 20, 21]; - while (topIndex > 0) { - topFaceBase.unshift(topFaceBase.pop()); - topFaceOrder.unshift(topFaceOrder.pop()); - topIndex--; + if (pointerInfo.pickInfo && pointerInfo.pickInfo.ray) { + this._lastPointerRay[pointerId].origin.copyFrom(pointerInfo.pickInfo.ray.origin); + this._lastPointerRay[pointerId].direction.copyFrom(pointerInfo.pickInfo.ray.direction); + if (this.currentDraggingPointerId == pointerId && this.dragging) { + this._moveDrag(pointerInfo.pickInfo.ray); + } + } + } + }); + this._beforeRenderObserver = this._scene.onBeforeRenderObservable.add(() => { + if (this._moving && this.moveAttached) { + let needMatrixUpdate = false; + PivotTools._RemoveAndStorePivotPoint(this.attachedNode); + this._targetPosition.subtractToRef(this.attachedNode.absolutePosition, this._tmpVector); + this._tmpVector.scaleInPlace(this.dragDeltaRatio); + this.attachedNode.getAbsolutePosition().addToRef(this._tmpVector, this._tmpVector); + if (this.validateDrag(this._tmpVector)) { + this.attachedNode.setAbsolutePosition(this._tmpVector); + needMatrixUpdate = true; + } + PivotTools._RestorePivotPoint(this.attachedNode); + if (needMatrixUpdate) { + this.attachedNode.computeWorldMatrix(); + } + } + }); + } + /** + * Force release the drag action by code. + */ + releaseDrag() { + if (this.dragging) { + this.dragging = false; + this.onDragEndObservable.notifyObservers({ dragPlanePoint: this.lastDragPosition, pointerId: this.currentDraggingPointerId, pointerInfo: this._activePointerInfo }); } - while (bottomIndex > 0) { - bottomFaceBase.unshift(bottomFaceBase.pop()); - bottomFaceOrder.unshift(bottomFaceOrder.pop()); - bottomIndex--; + this.currentDraggingPointerId = -1; + this._activeDragButton = -1; + this._activePointerInfo = null; + this._moving = false; + if (this.detachCameraControls && this._attachedToElement && this._scene.activeCamera && !this._scene.activeCamera.leftCamera) { + if (this._scene.activeCamera.getClassName() === "ArcRotateCamera") { + const arcRotateCamera = this._scene.activeCamera; + arcRotateCamera.attachControl(arcRotateCamera.inputs ? arcRotateCamera.inputs.noPreventDefault : true, arcRotateCamera._useCtrlForPanning, arcRotateCamera._panningMouseButton); + } else { + this._scene.activeCamera.attachControl(this._scene.activeCamera.inputs ? this._scene.activeCamera.inputs.noPreventDefault : true); + } + this._attachedToElement = false; } - topFaceBase = topFaceBase.flat(); - bottomFaceBase = bottomFaceBase.flat(); - basePositions = basePositions.concat(topFaceBase).concat(bottomFaceBase); - indices.push(topFaceOrder[0], topFaceOrder[2], topFaceOrder[3], topFaceOrder[0], topFaceOrder[1], topFaceOrder[2]); - indices.push(bottomFaceOrder[0], bottomFaceOrder[2], bottomFaceOrder[3], bottomFaceOrder[0], bottomFaceOrder[1], bottomFaceOrder[2]); } - const scaleArray = [width / 2, height / 2, depth / 2]; - positions = basePositions.reduce((accumulator, currentValue, currentIndex) => accumulator.concat(currentValue * scaleArray[currentIndex % 3]), []); - const sideOrientation = options.sideOrientation === 0 ? 0 : options.sideOrientation || VertexData.DEFAULTSIDE; - const faceUV = options.faceUV || new Array(6); - const faceColors = options.faceColors; - const colors = []; - for (let f = 0; f < 6; f++) { - if (faceUV[f] === void 0) { - faceUV[f] = new Vector4(0, 0, 1, 1); + /** + * Simulates the start of a pointer drag event on the behavior + * @param pointerId pointerID of the pointer that should be simulated (Default: Any mouse pointer ID) + * @param fromRay initial ray of the pointer to be simulated (Default: Ray from camera to attached mesh) + * @param startPickedPoint picked point of the pointer to be simulated (Default: attached mesh position) + */ + startDrag(pointerId = _PointerDragBehavior._AnyMouseId, fromRay, startPickedPoint) { + this._startDrag(pointerId, fromRay, startPickedPoint); + let lastRay = this._lastPointerRay[pointerId]; + if (pointerId === _PointerDragBehavior._AnyMouseId) { + lastRay = this._lastPointerRay[Object.keys(this._lastPointerRay)[0]]; } - if (faceColors && faceColors[f] === void 0) { - faceColors[f] = new Color4(1, 1, 1, 1); + if (lastRay) { + this._moveDrag(lastRay); } } - for (let index = 0; index < nbFaces; index++) { - uvs.push(faceUV[index].z, CompatibilityOptions.UseOpenGLOrientationForUV ? 1 - faceUV[index].w : faceUV[index].w); - uvs.push(faceUV[index].x, CompatibilityOptions.UseOpenGLOrientationForUV ? 1 - faceUV[index].w : faceUV[index].w); - uvs.push(faceUV[index].x, CompatibilityOptions.UseOpenGLOrientationForUV ? 1 - faceUV[index].y : faceUV[index].y); - uvs.push(faceUV[index].z, CompatibilityOptions.UseOpenGLOrientationForUV ? 1 - faceUV[index].y : faceUV[index].y); - if (faceColors) { - for (let c = 0; c < 4; c++) { - colors.push(faceColors[index].r, faceColors[index].g, faceColors[index].b, faceColors[index].a); + _startDrag(pointerId, fromRay, startPickedPoint) { + if (!this._scene.activeCamera || this.dragging || !this.attachedNode) { + return; + } + PivotTools._RemoveAndStorePivotPoint(this.attachedNode); + if (fromRay) { + this._startDragRay.direction.copyFrom(fromRay.direction); + this._startDragRay.origin.copyFrom(fromRay.origin); + } else { + this._startDragRay.origin.copyFrom(this._scene.activeCamera.position); + this.attachedNode.getWorldMatrix().getTranslationToRef(this._tmpVector); + this._tmpVector.subtractToRef(this._scene.activeCamera.position, this._startDragRay.direction); + } + this._updateDragPlanePosition(this._startDragRay, startPickedPoint ? startPickedPoint : this._tmpVector); + const pickedPoint = this._pickWithRayOnDragPlane(this._startDragRay); + if (pickedPoint) { + this.dragging = true; + this.currentDraggingPointerId = pointerId; + this.lastDragPosition.copyFrom(pickedPoint); + this.onDragStartObservable.notifyObservers({ dragPlanePoint: pickedPoint, pointerId: this.currentDraggingPointerId, pointerInfo: this._activePointerInfo }); + this._targetPosition.copyFrom(this.attachedNode.getAbsolutePosition()); + if (this.detachCameraControls && this._scene.activeCamera && this._scene.activeCamera.inputs && !this._scene.activeCamera.leftCamera) { + if (this._scene.activeCamera.inputs.attachedToElement) { + this._scene.activeCamera.detachControl(); + this._attachedToElement = true; + } else { + this._attachedToElement = false; + } } + } else { + this.releaseDrag(); } + PivotTools._RestorePivotPoint(this.attachedNode); } - VertexData._ComputeSides(sideOrientation, positions, indices, normals, uvs, options.frontUVs, options.backUVs); - const vertexData = new VertexData(); - vertexData.indices = indices; - vertexData.positions = positions; - vertexData.normals = normals; - vertexData.uvs = uvs; - if (faceColors) { - const totalColors = sideOrientation === VertexData.DOUBLESIDE ? colors.concat(colors) : colors; - vertexData.colors = totalColors; + _moveDrag(ray) { + this._moving = true; + const pickedPoint = this._pickWithRayOnDragPlane(ray); + if (pickedPoint) { + PivotTools._RemoveAndStorePivotPoint(this.attachedNode); + if (this.updateDragPlane) { + this._updateDragPlanePosition(ray, pickedPoint); + } + let dragLength = 0; + if (this._options.dragAxis) { + this.useObjectOrientationForDragging ? Vector3.TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._worldDragAxis) : this._worldDragAxis.copyFrom(this._options.dragAxis); + pickedPoint.subtractToRef(this.lastDragPosition, this._tmpVector); + dragLength = Vector3.Dot(this._tmpVector, this._worldDragAxis); + this._worldDragAxis.scaleToRef(dragLength, this._dragDelta); + } else { + dragLength = this._dragDelta.length(); + pickedPoint.subtractToRef(this.lastDragPosition, this._dragDelta); + } + this._targetPosition.addInPlace(this._dragDelta); + this.onDragObservable.notifyObservers({ + dragDistance: dragLength, + delta: this._dragDelta, + dragPlanePoint: pickedPoint, + dragPlaneNormal: this._dragPlane.forward, + pointerId: this.currentDraggingPointerId, + pointerInfo: this._activePointerInfo + }); + this.lastDragPosition.copyFrom(pickedPoint); + PivotTools._RestorePivotPoint(this.attachedNode); + } + } + _pickWithRayOnDragPlane(ray) { + if (!ray) { + return null; + } + let angle = Math.acos(Vector3.Dot(this._dragPlane.forward, ray.direction)); + if (angle > Math.PI / 2) { + angle = Math.PI - angle; + } + if (this.maxDragAngle > 0 && angle > this.maxDragAngle) { + if (this._useAlternatePickedPointAboveMaxDragAngle) { + this._tmpVector.copyFrom(ray.direction); + this.attachedNode.absolutePosition.subtractToRef(ray.origin, this._alternatePickedPoint); + this._alternatePickedPoint.normalize(); + this._alternatePickedPoint.scaleInPlace(this._useAlternatePickedPointAboveMaxDragAngleDragSpeed * Vector3.Dot(this._alternatePickedPoint, this._tmpVector)); + this._tmpVector.addInPlace(this._alternatePickedPoint); + const dot = Vector3.Dot(this._dragPlane.forward, this._tmpVector); + this._dragPlane.forward.scaleToRef(-dot, this._alternatePickedPoint); + this._alternatePickedPoint.addInPlace(this._tmpVector); + this._alternatePickedPoint.addInPlace(this.attachedNode.absolutePosition); + return this._alternatePickedPoint; + } else { + return null; + } + } + const planeNormal = this._dragPlane.forward; + const planePosition = this._dragPlane.position; + const dotProduct = ray.direction.dot(planeNormal); + if (Math.abs(dotProduct) < Epsilon) { + return null; + } + planePosition.subtractToRef(ray.origin, TmpVectors.Vector3[0]); + const t = TmpVectors.Vector3[0].dot(planeNormal) / dotProduct; + if (t < 0) { + return null; + } + ray.direction.scaleToRef(t, TmpVectors.Vector3[0]); + const intersectionPoint = ray.origin.add(TmpVectors.Vector3[0]); + return intersectionPoint; + } + // Position the drag plane based on the attached mesh position, for single axis rotate the plane along the axis to face the camera + _updateDragPlanePosition(ray, dragPlanePosition) { + this._pointA.copyFrom(dragPlanePosition); + if (this._options.dragAxis) { + this.useObjectOrientationForDragging ? Vector3.TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis) : this._localAxis.copyFrom(this._options.dragAxis); + ray.origin.subtractToRef(this._pointA, this._pointC); + this._pointC.normalize(); + if (Math.abs(Vector3.Dot(this._localAxis, this._pointC)) > 0.999) { + if (Math.abs(Vector3.Dot(Vector3.UpReadOnly, this._pointC)) > 0.999) { + this._lookAt.copyFrom(Vector3.Right()); + } else { + this._lookAt.copyFrom(Vector3.UpReadOnly); + } + } else { + Vector3.CrossToRef(this._localAxis, this._pointC, this._lookAt); + Vector3.CrossToRef(this._localAxis, this._lookAt, this._lookAt); + this._lookAt.normalize(); + } + this._dragPlane.position.copyFrom(this._pointA); + this._pointA.addToRef(this._lookAt, this._lookAt); + this._dragPlane.lookAt(this._lookAt); + } else if (this._options.dragPlaneNormal) { + this.useObjectOrientationForDragging ? Vector3.TransformCoordinatesToRef(this._options.dragPlaneNormal, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis) : this._localAxis.copyFrom(this._options.dragPlaneNormal); + this._dragPlane.position.copyFrom(this._pointA); + this._pointA.addToRef(this._localAxis, this._lookAt); + this._dragPlane.lookAt(this._lookAt); + } else { + this._dragPlane.position.copyFrom(this._pointA); + this._dragPlane.lookAt(ray.origin); + } + this._dragPlane.position.copyFrom(this.attachedNode.getAbsolutePosition()); + this._dragPlane.computeWorldMatrix(true); + } + /** + * Detaches the behavior from the mesh + */ + detach() { + this._lastPointerRay = {}; + if (this.attachedNode) { + this.attachedNode.isNearGrabbable = false; + } + if (this._pointerObserver) { + this._scene.onPointerObservable.remove(this._pointerObserver); + } + if (this._beforeRenderObserver) { + this._scene.onBeforeRenderObservable.remove(this._beforeRenderObserver); + } + if (this._dragPlane) { + this._dragPlane.dispose(); + } + this.releaseDrag(); } - return vertexData; -} -function CreateSegmentedBoxVertexData(options) { - const width = options.width || options.size || 1; - const height = options.height || options.size || 1; - const depth = options.depth || options.size || 1; - const widthSegments = (options.widthSegments || options.segments || 1) | 0; - const heightSegments = (options.heightSegments || options.segments || 1) | 0; - const depthSegments = (options.depthSegments || options.segments || 1) | 0; - const rotationMatrix = new Matrix(); - const translationMatrix = new Matrix(); - const transformMatrix = new Matrix(); - const bottomPlane = CreateGroundVertexData({ width, height: depth, subdivisionsX: widthSegments, subdivisionsY: depthSegments }); - Matrix.TranslationToRef(0, -height / 2, 0, translationMatrix); - Matrix.RotationZToRef(Math.PI, rotationMatrix); - rotationMatrix.multiplyToRef(translationMatrix, transformMatrix); - bottomPlane.transform(transformMatrix); - const topPlane = CreateGroundVertexData({ width, height: depth, subdivisionsX: widthSegments, subdivisionsY: depthSegments }); - Matrix.TranslationToRef(0, height / 2, 0, transformMatrix); - topPlane.transform(transformMatrix); - const negXPlane = CreateGroundVertexData({ width: height, height: depth, subdivisionsX: heightSegments, subdivisionsY: depthSegments }); - Matrix.TranslationToRef(-width / 2, 0, 0, translationMatrix); - Matrix.RotationZToRef(Math.PI / 2, rotationMatrix); - rotationMatrix.multiplyToRef(translationMatrix, transformMatrix); - negXPlane.transform(transformMatrix); - const posXPlane = CreateGroundVertexData({ width: height, height: depth, subdivisionsX: heightSegments, subdivisionsY: depthSegments }); - Matrix.TranslationToRef(width / 2, 0, 0, translationMatrix); - Matrix.RotationZToRef(-Math.PI / 2, rotationMatrix); - rotationMatrix.multiplyToRef(translationMatrix, transformMatrix); - posXPlane.transform(transformMatrix); - const negZPlane = CreateGroundVertexData({ width, height, subdivisionsX: widthSegments, subdivisionsY: heightSegments }); - Matrix.TranslationToRef(0, 0, -depth / 2, translationMatrix); - Matrix.RotationXToRef(-Math.PI / 2, rotationMatrix); - rotationMatrix.multiplyToRef(translationMatrix, transformMatrix); - negZPlane.transform(transformMatrix); - const posZPlane = CreateGroundVertexData({ width, height, subdivisionsX: widthSegments, subdivisionsY: heightSegments }); - Matrix.TranslationToRef(0, 0, depth / 2, translationMatrix); - Matrix.RotationXToRef(Math.PI / 2, rotationMatrix); - rotationMatrix.multiplyToRef(translationMatrix, transformMatrix); - posZPlane.transform(transformMatrix); - bottomPlane.merge([topPlane, posXPlane, negXPlane, negZPlane, posZPlane], true); - return bottomPlane; -} -function CreateBox(name69, options = {}, scene = null) { - const box = new Mesh(name69, scene); - options.sideOrientation = Mesh._GetDefaultSideOrientation(options.sideOrientation); - box._originalBuilderSideOrientation = options.sideOrientation; - const vertexData = CreateBoxVertexData(options); - vertexData.applyToMesh(box, options.updatable); - return box; -} -var BoxBuilder = { - // eslint-disable-next-line @typescript-eslint/naming-convention - CreateBox }; -VertexData.CreateBox = CreateBoxVertexData; -Mesh.CreateBox = (name69, size, scene = null, updatable, sideOrientation) => { - const options = { - size, - sideOrientation, - updatable - }; - return CreateBox(name69, options, scene); +PointerDragBehavior._AnyMouseId = -2; + +// node_modules/@babylonjs/core/Animations/animationKey.js +var AnimationKeyInterpolation; +(function(AnimationKeyInterpolation2) { + AnimationKeyInterpolation2[AnimationKeyInterpolation2["NONE"] = 0] = "NONE"; + AnimationKeyInterpolation2[AnimationKeyInterpolation2["STEP"] = 1] = "STEP"; +})(AnimationKeyInterpolation || (AnimationKeyInterpolation = {})); + +// node_modules/@babylonjs/core/Animations/animationRange.js +var AnimationRange = class _AnimationRange { + /** + * Initializes the range of an animation + * @param name The name of the animation range + * @param from The starting frame of the animation + * @param to The ending frame of the animation + */ + constructor(name69, from, to) { + this.name = name69; + this.from = from; + this.to = to; + } + /** + * Makes a copy of the animation range + * @returns A copy of the animation range + */ + clone() { + return new _AnimationRange(this.name, this.from, this.to); + } }; -// node_modules/@babylonjs/core/Materials/shaderMaterial.js -var onCreatedEffectParameters3 = { effect: null, subMesh: null }; -var ShaderMaterial = class _ShaderMaterial extends PushMaterial { +// node_modules/@babylonjs/core/Animations/animation.js +var _staticOffsetValueQuaternion = Object.freeze(new Quaternion(0, 0, 0, 0)); +var _staticOffsetValueVector3 = Object.freeze(Vector3.Zero()); +var _staticOffsetValueVector2 = Object.freeze(Vector2.Zero()); +var _staticOffsetValueSize = Object.freeze(Size.Zero()); +var _staticOffsetValueColor3 = Object.freeze(Color3.Black()); +var _staticOffsetValueColor4 = Object.freeze(new Color4(0, 0, 0, 0)); +var evaluateAnimationState = { + key: 0, + repeatCount: 0, + loopMode: 2 +}; +var Animation = class _Animation { /** - * Instantiate a new shader material. - * The ShaderMaterial object has the necessary methods to pass data from your scene to the Vertex and Fragment Shaders and returns a material that can be applied to any mesh. - * This returned material effects how the mesh will look based on the code in the shaders. - * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/shaders/shaderMaterial - * @param name Define the name of the material in the scene - * @param scene Define the scene the material belongs to - * @param shaderPath Defines the route to the shader code. - * @param options Define the options used to create the shader - * @param storeEffectOnSubMeshes true to store effect on submeshes, false to store the effect directly in the material class. + * @internal Internal use */ - constructor(name69, scene, shaderPath, options = {}, storeEffectOnSubMeshes = true) { - super(name69, scene, storeEffectOnSubMeshes); - this._textures = {}; - this._textureArrays = {}; - this._externalTextures = {}; - this._floats = {}; - this._ints = {}; - this._uints = {}; - this._floatsArrays = {}; - this._colors3 = {}; - this._colors3Arrays = {}; - this._colors4 = {}; - this._colors4Arrays = {}; - this._vectors2 = {}; - this._vectors3 = {}; - this._vectors4 = {}; - this._quaternions = {}; - this._quaternionsArrays = {}; - this._matrices = {}; - this._matrixArrays = {}; - this._matrices3x3 = {}; - this._matrices2x2 = {}; - this._vectors2Arrays = {}; - this._vectors3Arrays = {}; - this._vectors4Arrays = {}; - this._uniformBuffers = {}; - this._textureSamplers = {}; - this._storageBuffers = {}; - this._cachedWorldViewMatrix = new Matrix(); - this._cachedWorldViewProjectionMatrix = new Matrix(); - this._multiview = false; - this._materialHelperNeedsPreviousMatrices = false; - this._shaderPath = shaderPath; - this._options = { - needAlphaBlending: false, - needAlphaTesting: false, - attributes: ["position", "normal", "uv"], - uniforms: ["worldViewProjection"], - uniformBuffers: [], - samplers: [], - externalTextures: [], - samplerObjects: [], - storageBuffers: [], - defines: [], - useClipPlane: false, - ...options - }; + static _PrepareAnimation(name69, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction) { + let dataType = void 0; + if (!isNaN(parseFloat(from)) && isFinite(from)) { + dataType = _Animation.ANIMATIONTYPE_FLOAT; + } else if (from instanceof Quaternion) { + dataType = _Animation.ANIMATIONTYPE_QUATERNION; + } else if (from instanceof Vector3) { + dataType = _Animation.ANIMATIONTYPE_VECTOR3; + } else if (from instanceof Vector2) { + dataType = _Animation.ANIMATIONTYPE_VECTOR2; + } else if (from instanceof Color3) { + dataType = _Animation.ANIMATIONTYPE_COLOR3; + } else if (from instanceof Color4) { + dataType = _Animation.ANIMATIONTYPE_COLOR4; + } else if (from instanceof Size) { + dataType = _Animation.ANIMATIONTYPE_SIZE; + } + if (dataType == void 0) { + return null; + } + const animation = new _Animation(name69, targetProperty, framePerSecond, dataType, loopMode); + const keys = [ + { frame: 0, value: from }, + { frame: totalFrame, value: to } + ]; + animation.setKeys(keys); + if (easingFunction !== void 0) { + animation.setEasingFunction(easingFunction); + } + return animation; } /** - * Gets the shader path used to define the shader code - * It can be modified to trigger a new compilation + * Sets up an animation + * @param property The property to animate + * @param animationType The animation type to apply + * @param framePerSecond The frames per second of the animation + * @param easingFunction The easing function used in the animation + * @returns The created animation */ - get shaderPath() { - return this._shaderPath; + static CreateAnimation(property, animationType, framePerSecond, easingFunction) { + const animation = new _Animation(property + "Animation", property, framePerSecond, animationType, _Animation.ANIMATIONLOOPMODE_CONSTANT); + animation.setEasingFunction(easingFunction); + return animation; } /** - * Sets the shader path used to define the shader code - * It can be modified to trigger a new compilation + * Create and start an animation on a node + * @param name defines the name of the global animation that will be run on all nodes + * @param target defines the target where the animation will take place + * @param targetProperty defines property to animate + * @param framePerSecond defines the number of frame per second yo use + * @param totalFrame defines the number of frames in total + * @param from defines the initial value + * @param to defines the final value + * @param loopMode defines which loop mode you want to use (off by default) + * @param easingFunction defines the easing function to use (linear by default) + * @param onAnimationEnd defines the callback to call when animation end + * @param scene defines the hosting scene + * @returns the animatable created for this animation */ - set shaderPath(shaderPath) { - this._shaderPath = shaderPath; + static CreateAndStartAnimation(name69, target, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction, onAnimationEnd, scene) { + const animation = _Animation._PrepareAnimation(name69, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction); + if (!animation) { + return null; + } + if (target.getScene) { + scene = target.getScene(); + } + if (!scene) { + return null; + } + return scene.beginDirectAnimation(target, [animation], 0, totalFrame, animation.loopMode === 1, 1, onAnimationEnd); } /** - * Gets the options used to compile the shader. - * They can be modified to trigger a new compilation + * Create and start an animation on a node and its descendants + * @param name defines the name of the global animation that will be run on all nodes + * @param node defines the root node where the animation will take place + * @param directDescendantsOnly if true only direct descendants will be used, if false direct and also indirect (children of children, an so on in a recursive manner) descendants will be used + * @param targetProperty defines property to animate + * @param framePerSecond defines the number of frame per second to use + * @param totalFrame defines the number of frames in total + * @param from defines the initial value + * @param to defines the final value + * @param loopMode defines which loop mode you want to use (off by default) + * @param easingFunction defines the easing function to use (linear by default) + * @param onAnimationEnd defines the callback to call when an animation ends (will be called once per node) + * @returns the list of animatables created for all nodes + * @example https://www.babylonjs-playground.com/#MH0VLI */ - get options() { - return this._options; + static CreateAndStartHierarchyAnimation(name69, node, directDescendantsOnly, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction, onAnimationEnd) { + const animation = _Animation._PrepareAnimation(name69, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction); + if (!animation) { + return null; + } + const scene = node.getScene(); + return scene.beginDirectHierarchyAnimation(node, directDescendantsOnly, [animation], 0, totalFrame, animation.loopMode === 1, 1, onAnimationEnd); } /** - * is multiview set to true? + * Creates a new animation, merges it with the existing animations and starts it + * @param name Name of the animation + * @param node Node which contains the scene that begins the animations + * @param targetProperty Specifies which property to animate + * @param framePerSecond The frames per second of the animation + * @param totalFrame The total number of frames + * @param from The frame at the beginning of the animation + * @param to The frame at the end of the animation + * @param loopMode Specifies the loop mode of the animation + * @param easingFunction (Optional) The easing function of the animation, which allow custom mathematical formulas for animations + * @param onAnimationEnd Callback to run once the animation is complete + * @returns Nullable animation */ - get isMultiview() { - return this._multiview; + static CreateMergeAndStartAnimation(name69, node, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction, onAnimationEnd) { + const animation = _Animation._PrepareAnimation(name69, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction); + if (!animation) { + return null; + } + node.animations.push(animation); + return node.getScene().beginAnimation(node, 0, totalFrame, animation.loopMode === 1, 1, onAnimationEnd); } - /** - * Gets the current class name of the material e.g. "ShaderMaterial" - * Mainly use in serialization. - * @returns the class name - */ - getClassName() { - return "ShaderMaterial"; + /** @internal */ + static MakeAnimationAdditive(sourceAnimation, referenceFrameOrOptions, range, cloneOriginal = false, clonedName) { + let options; + if (typeof referenceFrameOrOptions === "object") { + options = referenceFrameOrOptions; + } else { + options = { + referenceFrame: referenceFrameOrOptions ?? 0, + range, + cloneOriginalAnimation: cloneOriginal, + clonedAnimationName: clonedName + }; + } + let animation = sourceAnimation; + if (options.cloneOriginalAnimation) { + animation = sourceAnimation.clone(); + animation.name = options.clonedAnimationName || animation.name; + } + if (!animation._keys.length) { + return animation; + } + const referenceFrame = options.referenceFrame && options.referenceFrame >= 0 ? options.referenceFrame : 0; + let startIndex = 0; + const firstKey = animation._keys[0]; + let endIndex = animation._keys.length - 1; + const lastKey = animation._keys[endIndex]; + const valueStore = { + referenceValue: firstKey.value, + referencePosition: TmpVectors.Vector3[0], + referenceQuaternion: TmpVectors.Quaternion[0], + referenceScaling: TmpVectors.Vector3[1], + keyPosition: TmpVectors.Vector3[2], + keyQuaternion: TmpVectors.Quaternion[1], + keyScaling: TmpVectors.Vector3[3] + }; + let from = firstKey.frame; + let to = lastKey.frame; + if (options.range) { + const rangeValue = animation.getRange(options.range); + if (rangeValue) { + from = rangeValue.from; + to = rangeValue.to; + } + } else { + from = options.fromFrame ?? from; + to = options.toFrame ?? to; + } + if (from !== firstKey.frame) { + startIndex = animation.createKeyForFrame(from); + } + if (to !== lastKey.frame) { + endIndex = animation.createKeyForFrame(to); + } + if (animation._keys.length === 1) { + const value = animation._getKeyValue(animation._keys[0]); + valueStore.referenceValue = value.clone ? value.clone() : value; + } else if (referenceFrame <= firstKey.frame) { + const value = animation._getKeyValue(firstKey.value); + valueStore.referenceValue = value.clone ? value.clone() : value; + } else if (referenceFrame >= lastKey.frame) { + const value = animation._getKeyValue(lastKey.value); + valueStore.referenceValue = value.clone ? value.clone() : value; + } else { + evaluateAnimationState.key = 0; + const value = animation._interpolate(referenceFrame, evaluateAnimationState); + valueStore.referenceValue = value.clone ? value.clone() : value; + } + if (animation.dataType === _Animation.ANIMATIONTYPE_QUATERNION) { + valueStore.referenceValue.normalize().conjugateInPlace(); + } else if (animation.dataType === _Animation.ANIMATIONTYPE_MATRIX) { + valueStore.referenceValue.decompose(valueStore.referenceScaling, valueStore.referenceQuaternion, valueStore.referencePosition); + valueStore.referenceQuaternion.normalize().conjugateInPlace(); + } + let startFrame = Number.MAX_VALUE; + const clippedKeys = options.clipKeys ? [] : null; + for (let index = startIndex; index <= endIndex; index++) { + let key = animation._keys[index]; + if (clippedKeys) { + key = { + frame: key.frame, + value: key.value.clone ? key.value.clone() : key.value, + inTangent: key.inTangent, + outTangent: key.outTangent, + interpolation: key.interpolation, + lockedTangent: key.lockedTangent + }; + if (startFrame === Number.MAX_VALUE) { + startFrame = key.frame; + } + key.frame -= startFrame; + clippedKeys.push(key); + } + if (index && animation.dataType !== _Animation.ANIMATIONTYPE_FLOAT && key.value === firstKey.value) { + continue; + } + switch (animation.dataType) { + case _Animation.ANIMATIONTYPE_MATRIX: + key.value.decompose(valueStore.keyScaling, valueStore.keyQuaternion, valueStore.keyPosition); + valueStore.keyPosition.subtractInPlace(valueStore.referencePosition); + valueStore.keyScaling.divideInPlace(valueStore.referenceScaling); + valueStore.referenceQuaternion.multiplyToRef(valueStore.keyQuaternion, valueStore.keyQuaternion); + Matrix.ComposeToRef(valueStore.keyScaling, valueStore.keyQuaternion, valueStore.keyPosition, key.value); + break; + case _Animation.ANIMATIONTYPE_QUATERNION: + valueStore.referenceValue.multiplyToRef(key.value, key.value); + break; + case _Animation.ANIMATIONTYPE_VECTOR2: + case _Animation.ANIMATIONTYPE_VECTOR3: + case _Animation.ANIMATIONTYPE_COLOR3: + case _Animation.ANIMATIONTYPE_COLOR4: + key.value.subtractToRef(valueStore.referenceValue, key.value); + break; + case _Animation.ANIMATIONTYPE_SIZE: + key.value.width -= valueStore.referenceValue.width; + key.value.height -= valueStore.referenceValue.height; + break; + default: + key.value -= valueStore.referenceValue; + } + } + if (clippedKeys) { + animation.setKeys(clippedKeys, true); + } + return animation; } /** - * Specifies if the material will require alpha blending - * @returns a boolean specifying if alpha blending is needed + * Transition property of an host to the target Value + * @param property The property to transition + * @param targetValue The target Value of the property + * @param host The object where the property to animate belongs + * @param scene Scene used to run the animation + * @param frameRate Framerate (in frame/s) to use + * @param transition The transition type we want to use + * @param duration The duration of the animation, in milliseconds + * @param onAnimationEnd Callback trigger at the end of the animation + * @returns Nullable animation */ - needAlphaBlending() { - return this.alpha < 1 || this._options.needAlphaBlending; + static TransitionTo(property, targetValue, host, scene, frameRate, transition, duration, onAnimationEnd = null) { + if (duration <= 0) { + host[property] = targetValue; + if (onAnimationEnd) { + onAnimationEnd(); + } + return null; + } + const endFrame = frameRate * (duration / 1e3); + transition.setKeys([ + { + frame: 0, + value: host[property].clone ? host[property].clone() : host[property] + }, + { + frame: endFrame, + value: targetValue + } + ]); + if (!host.animations) { + host.animations = []; + } + host.animations.push(transition); + const animation = scene.beginAnimation(host, 0, endFrame, false); + animation.onAnimationEnd = onAnimationEnd; + return animation; } /** - * Specifies if this material should be rendered in alpha test mode - * @returns a boolean specifying if an alpha test is needed. + * Return the array of runtime animations currently using this animation */ - needAlphaTesting() { - return this._options.needAlphaTesting; - } - _checkUniform(uniformName) { - if (this._options.uniforms.indexOf(uniformName) === -1) { - this._options.uniforms.push(uniformName); - } + get runtimeAnimations() { + return this._runtimeAnimations; } /** - * Set a texture in the shader. - * @param name Define the name of the uniform samplers as defined in the shader - * @param texture Define the texture to bind to this sampler - * @returns the material itself allowing "fluent" like uniform updates + * Specifies if any of the runtime animations are currently running */ - setTexture(name69, texture) { - if (this._options.samplers.indexOf(name69) === -1) { - this._options.samplers.push(name69); + get hasRunningRuntimeAnimations() { + for (const runtimeAnimation of this._runtimeAnimations) { + if (!runtimeAnimation.isStopped()) { + return true; + } } - this._textures[name69] = texture; - return this; + return false; } /** - * Set a texture array in the shader. - * @param name Define the name of the uniform sampler array as defined in the shader - * @param textures Define the list of textures to bind to this sampler - * @returns the material itself allowing "fluent" like uniform updates + * Initializes the animation + * @param name Name of the animation + * @param targetProperty Property to animate + * @param framePerSecond The frames per second of the animation + * @param dataType The data type of the animation + * @param loopMode The loop mode of the animation + * @param enableBlending Specifies if blending should be enabled */ - setTextureArray(name69, textures) { - if (this._options.samplers.indexOf(name69) === -1) { - this._options.samplers.push(name69); - } - this._checkUniform(name69); - this._textureArrays[name69] = textures; - return this; + constructor(name69, targetProperty, framePerSecond, dataType, loopMode, enableBlending) { + this.name = name69; + this.targetProperty = targetProperty; + this.framePerSecond = framePerSecond; + this.dataType = dataType; + this.loopMode = loopMode; + this.enableBlending = enableBlending; + this._easingFunction = null; + this._runtimeAnimations = new Array(); + this._events = new Array(); + this.blendingSpeed = 0.01; + this._ranges = {}; + this.targetPropertyPath = targetProperty.split("."); + this.dataType = dataType; + this.loopMode = loopMode === void 0 ? _Animation.ANIMATIONLOOPMODE_CYCLE : loopMode; + this.uniqueId = _Animation._UniqueIdGenerator++; } + // Methods /** - * Set an internal texture in the shader. - * @param name Define the name of the uniform samplers as defined in the shader - * @param texture Define the texture to bind to this sampler - * @returns the material itself allowing "fluent" like uniform updates + * Converts the animation to a string + * @param fullDetails support for multiple levels of logging within scene loading + * @returns String form of the animation */ - setExternalTexture(name69, texture) { - if (this._options.externalTextures.indexOf(name69) === -1) { - this._options.externalTextures.push(name69); + toString(fullDetails) { + let ret = "Name: " + this.name + ", property: " + this.targetProperty; + ret += ", datatype: " + ["Float", "Vector3", "Quaternion", "Matrix", "Color3", "Vector2"][this.dataType]; + ret += ", nKeys: " + (this._keys ? this._keys.length : "none"); + ret += ", nRanges: " + (this._ranges ? Object.keys(this._ranges).length : "none"); + if (fullDetails) { + ret += ", Ranges: {"; + let first = true; + for (const name69 in this._ranges) { + if (first) { + ret += ", "; + first = false; + } + ret += name69; + } + ret += "}"; } - this._externalTextures[name69] = texture; - return this; + return ret; } /** - * Set a float in the shader. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Add an event to this animation + * @param event Event to add */ - setFloat(name69, value) { - this._checkUniform(name69); - this._floats[name69] = value; - return this; + addEvent(event) { + this._events.push(event); + this._events.sort((a, b) => a.frame - b.frame); } /** - * Set a int in the shader. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Remove all events found at the given frame + * @param frame The frame to remove events from */ - setInt(name69, value) { - this._checkUniform(name69); - this._ints[name69] = value; - return this; + removeEvents(frame) { + for (let index = 0; index < this._events.length; index++) { + if (this._events[index].frame === frame) { + this._events.splice(index, 1); + index--; + } + } } /** - * Set a unsigned int in the shader. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Retrieves all the events from the animation + * @returns Events from the animation */ - setUInt(name69, value) { - this._checkUniform(name69); - this._uints[name69] = value; - return this; + getEvents() { + return this._events; } /** - * Set an array of floats in the shader. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Creates an animation range + * @param name Name of the animation range + * @param from Starting frame of the animation range + * @param to Ending frame of the animation */ - setFloats(name69, value) { - this._checkUniform(name69); - this._floatsArrays[name69] = value; - return this; + createRange(name69, from, to) { + if (!this._ranges[name69]) { + this._ranges[name69] = new AnimationRange(name69, from, to); + } } /** - * Set a vec3 in the shader from a Color3. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Deletes an animation range by name + * @param name Name of the animation range to delete + * @param deleteFrames Specifies if the key frames for the range should also be deleted (true) or not (false) */ - setColor3(name69, value) { - this._checkUniform(name69); - this._colors3[name69] = value; - return this; + deleteRange(name69, deleteFrames = true) { + const range = this._ranges[name69]; + if (!range) { + return; + } + if (deleteFrames) { + const from = range.from; + const to = range.to; + for (let key = this._keys.length - 1; key >= 0; key--) { + if (this._keys[key].frame >= from && this._keys[key].frame <= to) { + this._keys.splice(key, 1); + } + } + } + this._ranges[name69] = null; } /** - * Set a vec3 array in the shader from a Color3 array. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Gets the animation range by name, or null if not defined + * @param name Name of the animation range + * @returns Nullable animation range */ - setColor3Array(name69, value) { - this._checkUniform(name69); - this._colors3Arrays[name69] = value.reduce((arr, color) => { - color.toArray(arr, arr.length); - return arr; - }, []); - return this; + getRange(name69) { + return this._ranges[name69]; } /** - * Set a vec4 in the shader from a Color4. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Gets the key frames from the animation + * @returns The key frames of the animation */ - setColor4(name69, value) { - this._checkUniform(name69); - this._colors4[name69] = value; - return this; + getKeys() { + return this._keys; } /** - * Set a vec4 array in the shader from a Color4 array. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Gets the highest frame rate of the animation + * @returns Highest frame rate of the animation */ - setColor4Array(name69, value) { - this._checkUniform(name69); - this._colors4Arrays[name69] = value.reduce((arr, color) => { - color.toArray(arr, arr.length); - return arr; - }, []); - return this; + getHighestFrame() { + let ret = 0; + for (let key = 0, nKeys = this._keys.length; key < nKeys; key++) { + if (ret < this._keys[key].frame) { + ret = this._keys[key].frame; + } + } + return ret; } /** - * Set a vec2 in the shader from a Vector2. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Gets the easing function of the animation + * @returns Easing function of the animation */ - setVector2(name69, value) { - this._checkUniform(name69); - this._vectors2[name69] = value; - return this; + getEasingFunction() { + return this._easingFunction; } /** - * Set a vec3 in the shader from a Vector3. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Sets the easing function of the animation + * @param easingFunction A custom mathematical formula for animation */ - setVector3(name69, value) { - this._checkUniform(name69); - this._vectors3[name69] = value; - return this; + setEasingFunction(easingFunction) { + this._easingFunction = easingFunction; } /** - * Set a vec4 in the shader from a Vector4. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Interpolates a scalar linearly + * @param startValue Start value of the animation curve + * @param endValue End value of the animation curve + * @param gradient Scalar amount to interpolate + * @returns Interpolated scalar value */ - setVector4(name69, value) { - this._checkUniform(name69); - this._vectors4[name69] = value; - return this; + floatInterpolateFunction(startValue, endValue, gradient) { + return Scalar.Lerp(startValue, endValue, gradient); } /** - * Set a vec4 in the shader from a Quaternion. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Interpolates a scalar cubically + * @param startValue Start value of the animation curve + * @param outTangent End tangent of the animation + * @param endValue End value of the animation curve + * @param inTangent Start tangent of the animation curve + * @param gradient Scalar amount to interpolate + * @returns Interpolated scalar value */ - setQuaternion(name69, value) { - this._checkUniform(name69); - this._quaternions[name69] = value; - return this; + floatInterpolateFunctionWithTangents(startValue, outTangent, endValue, inTangent, gradient) { + return Scalar.Hermite(startValue, outTangent, endValue, inTangent, gradient); } /** - * Set a vec4 array in the shader from a Quaternion array. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Interpolates a quaternion using a spherical linear interpolation + * @param startValue Start value of the animation curve + * @param endValue End value of the animation curve + * @param gradient Scalar amount to interpolate + * @returns Interpolated quaternion value */ - setQuaternionArray(name69, value) { - this._checkUniform(name69); - this._quaternionsArrays[name69] = value.reduce((arr, quaternion) => { - quaternion.toArray(arr, arr.length); - return arr; - }, []); - return this; + quaternionInterpolateFunction(startValue, endValue, gradient) { + return Quaternion.Slerp(startValue, endValue, gradient); } /** - * Set a mat4 in the shader from a Matrix. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Interpolates a quaternion cubically + * @param startValue Start value of the animation curve + * @param outTangent End tangent of the animation curve + * @param endValue End value of the animation curve + * @param inTangent Start tangent of the animation curve + * @param gradient Scalar amount to interpolate + * @returns Interpolated quaternion value */ - setMatrix(name69, value) { - this._checkUniform(name69); - this._matrices[name69] = value; - return this; + quaternionInterpolateFunctionWithTangents(startValue, outTangent, endValue, inTangent, gradient) { + return Quaternion.Hermite(startValue, outTangent, endValue, inTangent, gradient).normalize(); } /** - * Set a float32Array in the shader from a matrix array. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Interpolates a Vector3 linearly + * @param startValue Start value of the animation curve + * @param endValue End value of the animation curve + * @param gradient Scalar amount to interpolate (value between 0 and 1) + * @returns Interpolated scalar value */ - setMatrices(name69, value) { - this._checkUniform(name69); - const float32Array = new Float32Array(value.length * 16); - for (let index = 0; index < value.length; index++) { - const matrix = value[index]; - matrix.copyToArray(float32Array, index * 16); - } - this._matrixArrays[name69] = float32Array; - return this; + vector3InterpolateFunction(startValue, endValue, gradient) { + return Vector3.Lerp(startValue, endValue, gradient); } /** - * Set a mat3 in the shader from a Float32Array. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Interpolates a Vector3 cubically + * @param startValue Start value of the animation curve + * @param outTangent End tangent of the animation + * @param endValue End value of the animation curve + * @param inTangent Start tangent of the animation curve + * @param gradient Scalar amount to interpolate (value between 0 and 1) + * @returns InterpolatedVector3 value */ - setMatrix3x3(name69, value) { - this._checkUniform(name69); - this._matrices3x3[name69] = value; - return this; + vector3InterpolateFunctionWithTangents(startValue, outTangent, endValue, inTangent, gradient) { + return Vector3.Hermite(startValue, outTangent, endValue, inTangent, gradient); } /** - * Set a mat2 in the shader from a Float32Array. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Interpolates a Vector2 linearly + * @param startValue Start value of the animation curve + * @param endValue End value of the animation curve + * @param gradient Scalar amount to interpolate (value between 0 and 1) + * @returns Interpolated Vector2 value */ - setMatrix2x2(name69, value) { - this._checkUniform(name69); - this._matrices2x2[name69] = value; - return this; + vector2InterpolateFunction(startValue, endValue, gradient) { + return Vector2.Lerp(startValue, endValue, gradient); } /** - * Set a vec2 array in the shader from a number array. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Interpolates a Vector2 cubically + * @param startValue Start value of the animation curve + * @param outTangent End tangent of the animation + * @param endValue End value of the animation curve + * @param inTangent Start tangent of the animation curve + * @param gradient Scalar amount to interpolate (value between 0 and 1) + * @returns Interpolated Vector2 value */ - setArray2(name69, value) { - this._checkUniform(name69); - this._vectors2Arrays[name69] = value; - return this; + vector2InterpolateFunctionWithTangents(startValue, outTangent, endValue, inTangent, gradient) { + return Vector2.Hermite(startValue, outTangent, endValue, inTangent, gradient); } /** - * Set a vec3 array in the shader from a number array. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Interpolates a size linearly + * @param startValue Start value of the animation curve + * @param endValue End value of the animation curve + * @param gradient Scalar amount to interpolate + * @returns Interpolated Size value */ - setArray3(name69, value) { - this._checkUniform(name69); - this._vectors3Arrays[name69] = value; - return this; + sizeInterpolateFunction(startValue, endValue, gradient) { + return Size.Lerp(startValue, endValue, gradient); } /** - * Set a vec4 array in the shader from a number array. - * @param name Define the name of the uniform as defined in the shader - * @param value Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Interpolates a Color3 linearly + * @param startValue Start value of the animation curve + * @param endValue End value of the animation curve + * @param gradient Scalar amount to interpolate + * @returns Interpolated Color3 value */ - setArray4(name69, value) { - this._checkUniform(name69); - this._vectors4Arrays[name69] = value; - return this; + color3InterpolateFunction(startValue, endValue, gradient) { + return Color3.Lerp(startValue, endValue, gradient); } /** - * Set a uniform buffer in the shader - * @param name Define the name of the uniform as defined in the shader - * @param buffer Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Interpolates a Color3 cubically + * @param startValue Start value of the animation curve + * @param outTangent End tangent of the animation + * @param endValue End value of the animation curve + * @param inTangent Start tangent of the animation curve + * @param gradient Scalar amount to interpolate + * @returns interpolated value */ - setUniformBuffer(name69, buffer) { - if (this._options.uniformBuffers.indexOf(name69) === -1) { - this._options.uniformBuffers.push(name69); - } - this._uniformBuffers[name69] = buffer; - return this; + color3InterpolateFunctionWithTangents(startValue, outTangent, endValue, inTangent, gradient) { + return Color3.Hermite(startValue, outTangent, endValue, inTangent, gradient); } /** - * Set a texture sampler in the shader - * @param name Define the name of the uniform as defined in the shader - * @param sampler Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Interpolates a Color4 linearly + * @param startValue Start value of the animation curve + * @param endValue End value of the animation curve + * @param gradient Scalar amount to interpolate + * @returns Interpolated Color3 value */ - setTextureSampler(name69, sampler) { - if (this._options.samplerObjects.indexOf(name69) === -1) { - this._options.samplerObjects.push(name69); - } - this._textureSamplers[name69] = sampler; - return this; + color4InterpolateFunction(startValue, endValue, gradient) { + return Color4.Lerp(startValue, endValue, gradient); } /** - * Set a storage buffer in the shader - * @param name Define the name of the storage buffer as defined in the shader - * @param buffer Define the value to give to the uniform - * @returns the material itself allowing "fluent" like uniform updates + * Interpolates a Color4 cubically + * @param startValue Start value of the animation curve + * @param outTangent End tangent of the animation + * @param endValue End value of the animation curve + * @param inTangent Start tangent of the animation curve + * @param gradient Scalar amount to interpolate + * @returns interpolated value */ - setStorageBuffer(name69, buffer) { - if (this._options.storageBuffers.indexOf(name69) === -1) { - this._options.storageBuffers.push(name69); - } - this._storageBuffers[name69] = buffer; - return this; + color4InterpolateFunctionWithTangents(startValue, outTangent, endValue, inTangent, gradient) { + return Color4.Hermite(startValue, outTangent, endValue, inTangent, gradient); } /** - * Adds, removes, or replaces the specified shader define and value. - * * setDefine("MY_DEFINE", true); // enables a boolean define - * * setDefine("MY_DEFINE", "0.5"); // adds "#define MY_DEFINE 0.5" to the shader (or sets and replaces the value of any existing define with that name) - * * setDefine("MY_DEFINE", false); // disables and removes the define - * Note if the active defines do change, the shader will be recompiled and this can be expensive. - * @param define the define name e.g., "OUTPUT_TO_SRGB" or "#define OUTPUT_TO_SRGB". If the define was passed into the constructor already, the version used should match that, and in either case, it should not include any appended value. - * @param value either the value of the define (e.g. a numerical value) or for booleans, true if the define should be enabled or false if it should be disabled - * @returns the material itself allowing "fluent" like uniform updates + * @internal Internal use only */ - setDefine(define, value) { - const defineName = define.trimEnd() + " "; - const existingDefineIdx = this.options.defines.findIndex((x) => x === define || x.startsWith(defineName)); - if (existingDefineIdx >= 0) { - this.options.defines.splice(existingDefineIdx, 1); - } - if (typeof value !== "boolean" || value) { - this.options.defines.push(defineName + value); + _getKeyValue(value) { + if (typeof value === "function") { + return value(); } - return this; + return value; } /** - * Specifies that the submesh is ready to be used - * @param mesh defines the mesh to check - * @param subMesh defines which submesh to check - * @param useInstances specifies that instances should be used - * @returns a boolean indicating that the submesh is ready or not + * Evaluate the animation value at a given frame + * @param currentFrame defines the frame where we want to evaluate the animation + * @returns the animation value */ - isReadyForSubMesh(mesh, subMesh, useInstances) { - return this.isReady(mesh, useInstances, subMesh); + evaluate(currentFrame) { + evaluateAnimationState.key = 0; + return this._interpolate(currentFrame, evaluateAnimationState); } /** - * Checks if the material is ready to render the requested mesh - * @param mesh Define the mesh to render - * @param useInstances Define whether or not the material is used with instances - * @param subMesh defines which submesh to render - * @returns true if ready, otherwise false + * @internal Internal use only */ - isReady(mesh, useInstances, subMesh) { - const storeEffectOnSubMeshes = subMesh && this._storeEffectOnSubMeshes; - if (this.isFrozen) { - const drawWrapper2 = storeEffectOnSubMeshes ? subMesh._drawWrapper : this._drawWrapper; - if (drawWrapper2.effect && drawWrapper2._wasPreviouslyReady && drawWrapper2._wasPreviouslyUsingInstances === useInstances) { - return true; - } - } - const scene = this.getScene(); - const engine = scene.getEngine(); - const defines = []; - const attribs = []; - const fallbacks = new EffectFallbacks(); - let shaderName = this._shaderPath, uniforms = this._options.uniforms, uniformBuffers = this._options.uniformBuffers, samplers = this._options.samplers; - if (engine.getCaps().multiview && scene.activeCamera && scene.activeCamera.outputRenderTarget && scene.activeCamera.outputRenderTarget.getViewCount() > 1) { - this._multiview = true; - defines.push("#define MULTIVIEW"); - if (uniforms.indexOf("viewProjection") !== -1 && uniforms.indexOf("viewProjectionR") === -1) { - uniforms.push("viewProjectionR"); - } + _interpolate(currentFrame, state, searchClosestKeyOnly = false) { + if (state.loopMode === _Animation.ANIMATIONLOOPMODE_CONSTANT && state.repeatCount > 0) { + return state.highLimitValue.clone ? state.highLimitValue.clone() : state.highLimitValue; } - for (let index = 0; index < this._options.defines.length; index++) { - const defineToAdd = this._options.defines[index].indexOf("#define") === 0 ? this._options.defines[index] : `#define ${this._options.defines[index]}`; - defines.push(defineToAdd); + const keys = this._keys; + const keysLength = keys.length; + let key = state.key; + while (key >= 0 && currentFrame < keys[key].frame) { + --key; } - for (let index = 0; index < this._options.attributes.length; index++) { - attribs.push(this._options.attributes[index]); + while (key + 1 <= keysLength - 1 && currentFrame >= keys[key + 1].frame) { + ++key; } - if (mesh && mesh.isVerticesDataPresent(VertexBuffer.ColorKind)) { - if (attribs.indexOf(VertexBuffer.ColorKind) === -1) { - attribs.push(VertexBuffer.ColorKind); - } - defines.push("#define VERTEXCOLOR"); + state.key = key; + if (key < 0) { + return searchClosestKeyOnly ? void 0 : this._getKeyValue(keys[0].value); + } else if (key + 1 > keysLength - 1) { + return searchClosestKeyOnly ? void 0 : this._getKeyValue(keys[keysLength - 1].value); } - if (useInstances) { - defines.push("#define INSTANCES"); - PushAttributesForInstances(attribs, this._materialHelperNeedsPreviousMatrices); - if (mesh == null ? void 0 : mesh.hasThinInstances) { - defines.push("#define THIN_INSTANCES"); - if (mesh && mesh.isVerticesDataPresent(VertexBuffer.ColorInstanceKind)) { - attribs.push(VertexBuffer.ColorInstanceKind); - defines.push("#define INSTANCESCOLOR"); - } - } + const startKey = keys[key]; + const endKey = keys[key + 1]; + if (searchClosestKeyOnly && (currentFrame === startKey.frame || currentFrame === endKey.frame)) { + return void 0; } - if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) { - attribs.push(VertexBuffer.MatricesIndicesKind); - attribs.push(VertexBuffer.MatricesWeightsKind); - if (mesh.numBoneInfluencers > 4) { - attribs.push(VertexBuffer.MatricesIndicesExtraKind); - attribs.push(VertexBuffer.MatricesWeightsExtraKind); - } - const skeleton = mesh.skeleton; - defines.push("#define NUM_BONE_INFLUENCERS " + mesh.numBoneInfluencers); - fallbacks.addCPUSkinningFallback(0, mesh); - if (skeleton.isUsingTextureForMatrices) { - defines.push("#define BONETEXTURE"); - if (uniforms.indexOf("boneTextureWidth") === -1) { - uniforms.push("boneTextureWidth"); - } - if (this._options.samplers.indexOf("boneSampler") === -1) { - this._options.samplers.push("boneSampler"); - } + const startValue = this._getKeyValue(startKey.value); + const endValue = this._getKeyValue(endKey.value); + if (startKey.interpolation === AnimationKeyInterpolation.STEP) { + if (endKey.frame > currentFrame) { + return startValue; } else { - defines.push("#define BonesPerMesh " + (skeleton.bones.length + 1)); - if (uniforms.indexOf("mBones") === -1) { - uniforms.push("mBones"); - } + return endValue; } - } else { - defines.push("#define NUM_BONE_INFLUENCERS 0"); } - let numInfluencers = 0; - const manager = mesh ? mesh.morphTargetManager : null; - if (manager) { - const uv = manager.supportsUVs && defines.indexOf("#define UV1") !== -1; - const tangent = manager.supportsTangents && defines.indexOf("#define TANGENT") !== -1; - const normal = manager.supportsNormals && defines.indexOf("#define NORMAL") !== -1; - numInfluencers = manager.numMaxInfluencers || manager.numInfluencers; - if (uv) { - defines.push("#define MORPHTARGETS_UV"); - } - if (tangent) { - defines.push("#define MORPHTARGETS_TANGENT"); - } - if (normal) { - defines.push("#define MORPHTARGETS_NORMAL"); - } - if (numInfluencers > 0) { - defines.push("#define MORPHTARGETS"); - } - if (manager.isUsingTextureForTargets) { - defines.push("#define MORPHTARGETS_TEXTURE"); - if (uniforms.indexOf("morphTargetTextureIndices") === -1) { - uniforms.push("morphTargetTextureIndices"); - } - if (this._options.samplers.indexOf("morphTargets") === -1) { - this._options.samplers.push("morphTargets"); + const useTangent = startKey.outTangent !== void 0 && endKey.inTangent !== void 0; + const frameDelta = endKey.frame - startKey.frame; + let gradient = (currentFrame - startKey.frame) / frameDelta; + const easingFunction = startKey.easingFunction || this.getEasingFunction(); + if (easingFunction !== null) { + gradient = easingFunction.ease(gradient); + } + switch (this.dataType) { + case _Animation.ANIMATIONTYPE_FLOAT: { + const floatValue = useTangent ? this.floatInterpolateFunctionWithTangents(startValue, startKey.outTangent * frameDelta, endValue, endKey.inTangent * frameDelta, gradient) : this.floatInterpolateFunction(startValue, endValue, gradient); + switch (state.loopMode) { + case _Animation.ANIMATIONLOOPMODE_CYCLE: + case _Animation.ANIMATIONLOOPMODE_CONSTANT: + case _Animation.ANIMATIONLOOPMODE_YOYO: + return floatValue; + case _Animation.ANIMATIONLOOPMODE_RELATIVE: + case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: + return (state.offsetValue ?? 0) * state.repeatCount + floatValue; } + break; } - defines.push("#define NUM_MORPH_INFLUENCERS " + numInfluencers); - for (let index = 0; index < numInfluencers; index++) { - attribs.push(VertexBuffer.PositionKind + index); - if (normal) { - attribs.push(VertexBuffer.NormalKind + index); - } - if (tangent) { - attribs.push(VertexBuffer.TangentKind + index); - } - if (uv) { - attribs.push(VertexBuffer.UVKind + "_" + index); + case _Animation.ANIMATIONTYPE_QUATERNION: { + const quatValue = useTangent ? this.quaternionInterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient) : this.quaternionInterpolateFunction(startValue, endValue, gradient); + switch (state.loopMode) { + case _Animation.ANIMATIONLOOPMODE_CYCLE: + case _Animation.ANIMATIONLOOPMODE_CONSTANT: + case _Animation.ANIMATIONLOOPMODE_YOYO: + return quatValue; + case _Animation.ANIMATIONLOOPMODE_RELATIVE: + case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: + return quatValue.addInPlace((state.offsetValue || _staticOffsetValueQuaternion).scale(state.repeatCount)); } + return quatValue; } - if (numInfluencers > 0) { - uniforms = uniforms.slice(); - uniforms.push("morphTargetInfluences"); - uniforms.push("morphTargetCount"); - uniforms.push("morphTargetTextureInfo"); - uniforms.push("morphTargetTextureIndices"); - } - } else { - defines.push("#define NUM_MORPH_INFLUENCERS 0"); - } - if (mesh) { - const bvaManager = mesh.bakedVertexAnimationManager; - if (bvaManager && bvaManager.isEnabled) { - defines.push("#define BAKED_VERTEX_ANIMATION_TEXTURE"); - if (uniforms.indexOf("bakedVertexAnimationSettings") === -1) { - uniforms.push("bakedVertexAnimationSettings"); - } - if (uniforms.indexOf("bakedVertexAnimationTextureSizeInverted") === -1) { - uniforms.push("bakedVertexAnimationTextureSizeInverted"); - } - if (uniforms.indexOf("bakedVertexAnimationTime") === -1) { - uniforms.push("bakedVertexAnimationTime"); - } - if (this._options.samplers.indexOf("bakedVertexAnimationTexture") === -1) { - this._options.samplers.push("bakedVertexAnimationTexture"); + case _Animation.ANIMATIONTYPE_VECTOR3: { + const vec3Value = useTangent ? this.vector3InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient) : this.vector3InterpolateFunction(startValue, endValue, gradient); + switch (state.loopMode) { + case _Animation.ANIMATIONLOOPMODE_CYCLE: + case _Animation.ANIMATIONLOOPMODE_CONSTANT: + case _Animation.ANIMATIONLOOPMODE_YOYO: + return vec3Value; + case _Animation.ANIMATIONLOOPMODE_RELATIVE: + case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: + return vec3Value.add((state.offsetValue || _staticOffsetValueVector3).scale(state.repeatCount)); } + break; } - PrepareAttributesForBakedVertexAnimation(attribs, mesh, defines); - } - for (const name69 in this._textures) { - if (!this._textures[name69].isReady()) { - return false; + case _Animation.ANIMATIONTYPE_VECTOR2: { + const vec2Value = useTangent ? this.vector2InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient) : this.vector2InterpolateFunction(startValue, endValue, gradient); + switch (state.loopMode) { + case _Animation.ANIMATIONLOOPMODE_CYCLE: + case _Animation.ANIMATIONLOOPMODE_CONSTANT: + case _Animation.ANIMATIONLOOPMODE_YOYO: + return vec2Value; + case _Animation.ANIMATIONLOOPMODE_RELATIVE: + case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: + return vec2Value.add((state.offsetValue || _staticOffsetValueVector2).scale(state.repeatCount)); + } + break; } - } - if (mesh && this._shouldTurnAlphaTestOn(mesh)) { - defines.push("#define ALPHATEST"); - } - if (this._options.useClipPlane !== false) { - addClipPlaneUniforms(uniforms); - prepareStringDefinesForClipPlanes(this, scene, defines); - } - if (scene.fogEnabled && (mesh == null ? void 0 : mesh.applyFog) && scene.fogMode !== Scene.FOGMODE_NONE) { - defines.push("#define FOG"); - if (uniforms.indexOf("view") === -1) { - uniforms.push("view"); + case _Animation.ANIMATIONTYPE_SIZE: { + switch (state.loopMode) { + case _Animation.ANIMATIONLOOPMODE_CYCLE: + case _Animation.ANIMATIONLOOPMODE_CONSTANT: + case _Animation.ANIMATIONLOOPMODE_YOYO: + return this.sizeInterpolateFunction(startValue, endValue, gradient); + case _Animation.ANIMATIONLOOPMODE_RELATIVE: + case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: + return this.sizeInterpolateFunction(startValue, endValue, gradient).add((state.offsetValue || _staticOffsetValueSize).scale(state.repeatCount)); + } + break; } - if (uniforms.indexOf("vFogInfos") === -1) { - uniforms.push("vFogInfos"); + case _Animation.ANIMATIONTYPE_COLOR3: { + const color3Value = useTangent ? this.color3InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient) : this.color3InterpolateFunction(startValue, endValue, gradient); + switch (state.loopMode) { + case _Animation.ANIMATIONLOOPMODE_CYCLE: + case _Animation.ANIMATIONLOOPMODE_CONSTANT: + case _Animation.ANIMATIONLOOPMODE_YOYO: + return color3Value; + case _Animation.ANIMATIONLOOPMODE_RELATIVE: + case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: + return color3Value.add((state.offsetValue || _staticOffsetValueColor3).scale(state.repeatCount)); + } + break; } - if (uniforms.indexOf("vFogColor") === -1) { - uniforms.push("vFogColor"); + case _Animation.ANIMATIONTYPE_COLOR4: { + const color4Value = useTangent ? this.color4InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient) : this.color4InterpolateFunction(startValue, endValue, gradient); + switch (state.loopMode) { + case _Animation.ANIMATIONLOOPMODE_CYCLE: + case _Animation.ANIMATIONLOOPMODE_CONSTANT: + case _Animation.ANIMATIONLOOPMODE_YOYO: + return color4Value; + case _Animation.ANIMATIONLOOPMODE_RELATIVE: + case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: + return color4Value.add((state.offsetValue || _staticOffsetValueColor4).scale(state.repeatCount)); + } + break; } - } - if (this._useLogarithmicDepth) { - defines.push("#define LOGARITHMICDEPTH"); - if (uniforms.indexOf("logarithmicDepthConstant") === -1) { - uniforms.push("logarithmicDepthConstant"); + case _Animation.ANIMATIONTYPE_MATRIX: { + switch (state.loopMode) { + case _Animation.ANIMATIONLOOPMODE_CYCLE: + case _Animation.ANIMATIONLOOPMODE_CONSTANT: + case _Animation.ANIMATIONLOOPMODE_YOYO: { + if (_Animation.AllowMatricesInterpolation) { + return this.matrixInterpolateFunction(startValue, endValue, gradient, state.workValue); + } + return startValue; + } + case _Animation.ANIMATIONLOOPMODE_RELATIVE: + case _Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: { + return startValue; + } + } + break; } } - if (this.customShaderNameResolve) { - uniforms = uniforms.slice(); - uniformBuffers = uniformBuffers.slice(); - samplers = samplers.slice(); - shaderName = this.customShaderNameResolve(this.name, uniforms, uniformBuffers, samplers, defines, attribs); - } - const drawWrapper = storeEffectOnSubMeshes ? subMesh._getDrawWrapper(void 0, true) : this._drawWrapper; - const previousEffect = (drawWrapper == null ? void 0 : drawWrapper.effect) ?? null; - const previousDefines = (drawWrapper == null ? void 0 : drawWrapper.defines) ?? null; - const join = defines.join("\n"); - let effect = previousEffect; - if (previousDefines !== join) { - effect = engine.createEffect(shaderName, { - attributes: attribs, - uniformsNames: uniforms, - uniformBuffersNames: uniformBuffers, - samplers, - defines: join, - fallbacks, - onCompiled: this.onCompiled, - onError: this.onError, - indexParameters: { maxSimultaneousMorphTargets: numInfluencers }, - shaderLanguage: this._options.shaderLanguage - }, engine); - if (storeEffectOnSubMeshes) { - subMesh.setEffect(effect, join, this._materialContext); - } else if (drawWrapper) { - drawWrapper.setEffect(effect, join); - } - if (this._onEffectCreatedObservable) { - onCreatedEffectParameters3.effect = effect; - onCreatedEffectParameters3.subMesh = subMesh ?? (mesh == null ? void 0 : mesh.subMeshes[0]) ?? null; - this._onEffectCreatedObservable.notifyObservers(onCreatedEffectParameters3); + return 0; + } + /** + * Defines the function to use to interpolate matrices + * @param startValue defines the start matrix + * @param endValue defines the end matrix + * @param gradient defines the gradient between both matrices + * @param result defines an optional target matrix where to store the interpolation + * @returns the interpolated matrix + */ + matrixInterpolateFunction(startValue, endValue, gradient, result) { + if (_Animation.AllowMatrixDecomposeForInterpolation) { + if (result) { + Matrix.DecomposeLerpToRef(startValue, endValue, gradient, result); + return result; } + return Matrix.DecomposeLerp(startValue, endValue, gradient); } - drawWrapper._wasPreviouslyUsingInstances = !!useInstances; - if (!(effect == null ? void 0 : effect.isReady())) { - return false; - } - if (previousEffect !== effect) { - scene.resetCachedMaterial(); + if (result) { + Matrix.LerpToRef(startValue, endValue, gradient, result); + return result; } - drawWrapper._wasPreviouslyReady = true; - return true; + return Matrix.Lerp(startValue, endValue, gradient); } /** - * Binds the world matrix to the material - * @param world defines the world transformation matrix - * @param effectOverride - If provided, use this effect instead of internal effect + * Makes a copy of the animation + * @returns Cloned animation */ - bindOnlyWorldMatrix(world, effectOverride) { - const scene = this.getScene(); - const effect = effectOverride ?? this.getEffect(); - if (!effect) { - return; - } - if (this._options.uniforms.indexOf("world") !== -1) { - effect.setMatrix("world", world); - } - if (this._options.uniforms.indexOf("worldView") !== -1) { - world.multiplyToRef(scene.getViewMatrix(), this._cachedWorldViewMatrix); - effect.setMatrix("worldView", this._cachedWorldViewMatrix); - } - if (this._options.uniforms.indexOf("worldViewProjection") !== -1) { - world.multiplyToRef(scene.getTransformMatrix(), this._cachedWorldViewProjectionMatrix); - effect.setMatrix("worldViewProjection", this._cachedWorldViewProjectionMatrix); + clone() { + const clone = new _Animation(this.name, this.targetPropertyPath.join("."), this.framePerSecond, this.dataType, this.loopMode); + clone.enableBlending = this.enableBlending; + clone.blendingSpeed = this.blendingSpeed; + if (this._keys) { + clone.setKeys(this._keys); } - if (this._options.uniforms.indexOf("view") !== -1) { - effect.setMatrix("view", scene.getViewMatrix()); + if (this._ranges) { + clone._ranges = {}; + for (const name69 in this._ranges) { + const range = this._ranges[name69]; + if (!range) { + continue; + } + clone._ranges[name69] = range.clone(); + } } + return clone; } /** - * Binds the submesh to this material by preparing the effect and shader to draw - * @param world defines the world transformation matrix - * @param mesh defines the mesh containing the submesh - * @param subMesh defines the submesh to bind the material to + * Sets the key frames of the animation + * @param values The animation key frames to set + * @param dontClone Whether to clone the keys or not (default is false, so the array of keys is cloned) */ - bindForSubMesh(world, mesh, subMesh) { - var _a; - this.bind(world, mesh, (_a = subMesh._drawWrapperOverride) == null ? void 0 : _a.effect, subMesh); + setKeys(values, dontClone = false) { + this._keys = !dontClone ? values.slice(0) : values; } /** - * Binds the material to the mesh - * @param world defines the world transformation matrix - * @param mesh defines the mesh to bind the material to - * @param effectOverride - If provided, use this effect instead of internal effect - * @param subMesh defines the submesh to bind the material to + * Creates a key for the frame passed as a parameter and adds it to the animation IF a key doesn't already exist for that frame + * @param frame Frame number + * @returns The key index if the key was added or the index of the pre existing key if the frame passed as parameter already has a corresponding key */ - bind(world, mesh, effectOverride, subMesh) { - var _a; - const storeEffectOnSubMeshes = subMesh && this._storeEffectOnSubMeshes; - const effect = effectOverride ?? (storeEffectOnSubMeshes ? subMesh.effect : this.getEffect()); - if (!effect) { - return; + createKeyForFrame(frame) { + evaluateAnimationState.key = 0; + const value = this._interpolate(frame, evaluateAnimationState, true); + if (!value) { + return this._keys[evaluateAnimationState.key].frame === frame ? evaluateAnimationState.key : evaluateAnimationState.key + 1; } - const scene = this.getScene(); - this._activeEffect = effect; - this.bindOnlyWorldMatrix(world, effectOverride); - const uniformBuffers = this._options.uniformBuffers; - let useSceneUBO = false; - if (effect && uniformBuffers && uniformBuffers.length > 0 && scene.getEngine().supportsUniformBuffers) { - for (let i = 0; i < uniformBuffers.length; ++i) { - const bufferName = uniformBuffers[i]; - switch (bufferName) { - case "Mesh": - if (mesh) { - mesh.getMeshUniformBuffer().bindToEffect(effect, "Mesh"); - mesh.transferToEffect(world); + const newKey = { + frame, + value: value.clone ? value.clone() : value + }; + this._keys.splice(evaluateAnimationState.key + 1, 0, newKey); + return evaluateAnimationState.key + 1; + } + /** + * Serializes the animation to an object + * @returns Serialized object + */ + serialize() { + const serializationObject = {}; + serializationObject.name = this.name; + serializationObject.property = this.targetProperty; + serializationObject.framePerSecond = this.framePerSecond; + serializationObject.dataType = this.dataType; + serializationObject.loopBehavior = this.loopMode; + serializationObject.enableBlending = this.enableBlending; + serializationObject.blendingSpeed = this.blendingSpeed; + const dataType = this.dataType; + serializationObject.keys = []; + const keys = this.getKeys(); + for (let index = 0; index < keys.length; index++) { + const animationKey = keys[index]; + const key = {}; + key.frame = animationKey.frame; + switch (dataType) { + case _Animation.ANIMATIONTYPE_FLOAT: + key.values = [animationKey.value]; + if (animationKey.inTangent !== void 0) { + key.values.push(animationKey.inTangent); + } + if (animationKey.outTangent !== void 0) { + if (animationKey.inTangent === void 0) { + key.values.push(void 0); } - break; - case "Scene": - BindSceneUniformBuffer(effect, scene.getSceneUniformBuffer()); - scene.finalizeSceneUbo(); - useSceneUBO = true; - break; - } + key.values.push(animationKey.outTangent); + } + if (animationKey.interpolation !== void 0) { + if (animationKey.inTangent === void 0) { + key.values.push(void 0); + } + if (animationKey.outTangent === void 0) { + key.values.push(void 0); + } + key.values.push(animationKey.interpolation); + } + break; + case _Animation.ANIMATIONTYPE_QUATERNION: + case _Animation.ANIMATIONTYPE_MATRIX: + case _Animation.ANIMATIONTYPE_VECTOR3: + case _Animation.ANIMATIONTYPE_COLOR3: + case _Animation.ANIMATIONTYPE_COLOR4: + key.values = animationKey.value.asArray(); + if (animationKey.inTangent != void 0) { + key.values.push(animationKey.inTangent.asArray()); + } + if (animationKey.outTangent != void 0) { + if (animationKey.inTangent === void 0) { + key.values.push(void 0); + } + key.values.push(animationKey.outTangent.asArray()); + } + if (animationKey.interpolation !== void 0) { + if (animationKey.inTangent === void 0) { + key.values.push(void 0); + } + if (animationKey.outTangent === void 0) { + key.values.push(void 0); + } + key.values.push(animationKey.interpolation); + } + break; } + serializationObject.keys.push(key); } - const mustRebind = mesh && storeEffectOnSubMeshes ? this._mustRebind(scene, effect, subMesh, mesh.visibility) : scene.getCachedMaterial() !== this; - if (effect && mustRebind) { - if (!useSceneUBO && this._options.uniforms.indexOf("view") !== -1) { - effect.setMatrix("view", scene.getViewMatrix()); - } - if (!useSceneUBO && this._options.uniforms.indexOf("projection") !== -1) { - effect.setMatrix("projection", scene.getProjectionMatrix()); - } - if (!useSceneUBO && this._options.uniforms.indexOf("viewProjection") !== -1) { - effect.setMatrix("viewProjection", scene.getTransformMatrix()); - if (this._multiview) { - effect.setMatrix("viewProjectionR", scene._transformMatrixR); - } - } - if (scene.activeCamera && this._options.uniforms.indexOf("cameraPosition") !== -1) { - effect.setVector3("cameraPosition", scene.activeCamera.globalPosition); - } - BindBonesParameters(mesh, effect); - bindClipPlane(effect, this, scene); - if (this._useLogarithmicDepth) { - BindLogDepth(storeEffectOnSubMeshes ? subMesh.materialDefines : effect.defines, effect, scene); - } - if (mesh) { - BindFogParameters(scene, mesh, effect); - } - let name69; - for (name69 in this._textures) { - effect.setTexture(name69, this._textures[name69]); - } - for (name69 in this._textureArrays) { - effect.setTextureArray(name69, this._textureArrays[name69]); - } - for (name69 in this._externalTextures) { - effect.setExternalTexture(name69, this._externalTextures[name69]); - } - for (name69 in this._ints) { - effect.setInt(name69, this._ints[name69]); - } - for (name69 in this._uints) { - effect.setUInt(name69, this._uints[name69]); - } - for (name69 in this._floats) { - effect.setFloat(name69, this._floats[name69]); - } - for (name69 in this._floatsArrays) { - effect.setArray(name69, this._floatsArrays[name69]); - } - for (name69 in this._colors3) { - effect.setColor3(name69, this._colors3[name69]); - } - for (name69 in this._colors3Arrays) { - effect.setArray3(name69, this._colors3Arrays[name69]); - } - for (name69 in this._colors4) { - const color = this._colors4[name69]; - effect.setFloat4(name69, color.r, color.g, color.b, color.a); - } - for (name69 in this._colors4Arrays) { - effect.setArray4(name69, this._colors4Arrays[name69]); - } - for (name69 in this._vectors2) { - effect.setVector2(name69, this._vectors2[name69]); - } - for (name69 in this._vectors3) { - effect.setVector3(name69, this._vectors3[name69]); - } - for (name69 in this._vectors4) { - effect.setVector4(name69, this._vectors4[name69]); - } - for (name69 in this._quaternions) { - effect.setQuaternion(name69, this._quaternions[name69]); - } - for (name69 in this._matrices) { - effect.setMatrix(name69, this._matrices[name69]); - } - for (name69 in this._matrixArrays) { - effect.setMatrices(name69, this._matrixArrays[name69]); - } - for (name69 in this._matrices3x3) { - effect.setMatrix3x3(name69, this._matrices3x3[name69]); - } - for (name69 in this._matrices2x2) { - effect.setMatrix2x2(name69, this._matrices2x2[name69]); - } - for (name69 in this._vectors2Arrays) { - effect.setArray2(name69, this._vectors2Arrays[name69]); - } - for (name69 in this._vectors3Arrays) { - effect.setArray3(name69, this._vectors3Arrays[name69]); - } - for (name69 in this._vectors4Arrays) { - effect.setArray4(name69, this._vectors4Arrays[name69]); + serializationObject.ranges = []; + for (const name69 in this._ranges) { + const source = this._ranges[name69]; + if (!source) { + continue; } - for (name69 in this._quaternionsArrays) { - effect.setArray4(name69, this._quaternionsArrays[name69]); + const range = {}; + range.name = name69; + range.from = source.from; + range.to = source.to; + serializationObject.ranges.push(range); + } + return serializationObject; + } + /** + * @internal + */ + static _UniversalLerp(left, right, amount) { + const constructor = left.constructor; + if (constructor.Lerp) { + return constructor.Lerp(left, right, amount); + } else if (constructor.Slerp) { + return constructor.Slerp(left, right, amount); + } else if (left.toFixed) { + return left * (1 - amount) + amount * right; + } else { + return right; + } + } + /** + * Parses an animation object and creates an animation + * @param parsedAnimation Parsed animation object + * @returns Animation object + */ + static Parse(parsedAnimation) { + const animation = new _Animation(parsedAnimation.name, parsedAnimation.property, parsedAnimation.framePerSecond, parsedAnimation.dataType, parsedAnimation.loopBehavior); + const dataType = parsedAnimation.dataType; + const keys = []; + let data; + let index; + if (parsedAnimation.enableBlending) { + animation.enableBlending = parsedAnimation.enableBlending; + } + if (parsedAnimation.blendingSpeed) { + animation.blendingSpeed = parsedAnimation.blendingSpeed; + } + for (index = 0; index < parsedAnimation.keys.length; index++) { + const key = parsedAnimation.keys[index]; + let inTangent = void 0; + let outTangent = void 0; + let interpolation = void 0; + switch (dataType) { + case _Animation.ANIMATIONTYPE_FLOAT: + data = key.values[0]; + if (key.values.length >= 2) { + inTangent = key.values[1]; + } + if (key.values.length >= 3) { + outTangent = key.values[2]; + } + if (key.values.length >= 4) { + interpolation = key.values[3]; + } + break; + case _Animation.ANIMATIONTYPE_QUATERNION: + data = Quaternion.FromArray(key.values); + if (key.values.length >= 8) { + const _inTangent = Quaternion.FromArray(key.values.slice(4, 8)); + if (!_inTangent.equals(Quaternion.Zero())) { + inTangent = _inTangent; + } + } + if (key.values.length >= 12) { + const _outTangent = Quaternion.FromArray(key.values.slice(8, 12)); + if (!_outTangent.equals(Quaternion.Zero())) { + outTangent = _outTangent; + } + } + if (key.values.length >= 13) { + interpolation = key.values[12]; + } + break; + case _Animation.ANIMATIONTYPE_MATRIX: + data = Matrix.FromArray(key.values); + if (key.values.length >= 17) { + interpolation = key.values[16]; + } + break; + case _Animation.ANIMATIONTYPE_COLOR3: + data = Color3.FromArray(key.values); + if (key.values[3]) { + inTangent = Color3.FromArray(key.values[3]); + } + if (key.values[4]) { + outTangent = Color3.FromArray(key.values[4]); + } + if (key.values[5]) { + interpolation = key.values[5]; + } + break; + case _Animation.ANIMATIONTYPE_COLOR4: + data = Color4.FromArray(key.values); + if (key.values[4]) { + inTangent = Color4.FromArray(key.values[4]); + } + if (key.values[5]) { + outTangent = Color4.FromArray(key.values[5]); + } + if (key.values[6]) { + interpolation = Color4.FromArray(key.values[6]); + } + break; + case _Animation.ANIMATIONTYPE_VECTOR3: + default: + data = Vector3.FromArray(key.values); + if (key.values[3]) { + inTangent = Vector3.FromArray(key.values[3]); + } + if (key.values[4]) { + outTangent = Vector3.FromArray(key.values[4]); + } + if (key.values[5]) { + interpolation = key.values[5]; + } + break; } - for (name69 in this._uniformBuffers) { - const buffer = this._uniformBuffers[name69].getBuffer(); - if (buffer) { - effect.bindUniformBuffer(buffer, name69); - } + const keyData = {}; + keyData.frame = key.frame; + keyData.value = data; + if (inTangent != void 0) { + keyData.inTangent = inTangent; } - for (name69 in this._textureSamplers) { - effect.setTextureSampler(name69, this._textureSamplers[name69]); + if (outTangent != void 0) { + keyData.outTangent = outTangent; } - for (name69 in this._storageBuffers) { - effect.setStorageBuffer(name69, this._storageBuffers[name69]); + if (interpolation != void 0) { + keyData.interpolation = interpolation; } + keys.push(keyData); } - if (effect && mesh && (mustRebind || !this.isFrozen)) { - const manager = mesh.morphTargetManager; - if (manager && manager.numInfluencers > 0) { - BindMorphTargetParameters(mesh, effect); - } - const bvaManager = mesh.bakedVertexAnimationManager; - if (bvaManager && bvaManager.isEnabled) { - const drawWrapper = storeEffectOnSubMeshes ? subMesh._drawWrapper : this._drawWrapper; - (_a = mesh.bakedVertexAnimationManager) == null ? void 0 : _a.bind(effect, !!drawWrapper._wasPreviouslyUsingInstances); + animation.setKeys(keys); + if (parsedAnimation.ranges) { + for (index = 0; index < parsedAnimation.ranges.length; index++) { + data = parsedAnimation.ranges[index]; + animation.createRange(data.name, data.from, data.to); } } - this._afterBind(mesh, effect, subMesh); + return animation; + } + /** + * Appends the serialized animations from the source animations + * @param source Source containing the animations + * @param destination Target to store the animations + */ + static AppendSerializedAnimations(source, destination) { + SerializationHelper.AppendSerializedAnimations(source, destination); + } + /** + * Creates a new animation or an array of animations from a snippet saved in a remote file + * @param name defines the name of the animation to create (can be null or empty to use the one from the json data) + * @param url defines the url to load from + * @returns a promise that will resolve to the new animation or an array of animations + */ + static ParseFromFileAsync(name69, url) { + return new Promise((resolve, reject) => { + const request = new WebRequest(); + request.addEventListener("readystatechange", () => { + if (request.readyState == 4) { + if (request.status == 200) { + let serializationObject = JSON.parse(request.responseText); + if (serializationObject.animations) { + serializationObject = serializationObject.animations; + } + if (serializationObject.length) { + const output = []; + for (const serializedAnimation of serializationObject) { + output.push(this.Parse(serializedAnimation)); + } + resolve(output); + } else { + const output = this.Parse(serializationObject); + if (name69) { + output.name = name69; + } + resolve(output); + } + } else { + reject("Unable to load the animation"); + } + } + }); + request.open("GET", url); + request.send(); + }); + } + /** + * Creates an animation or an array of animations from a snippet saved by the Inspector + * @param snippetId defines the snippet to load + * @returns a promise that will resolve to the new animation or a new array of animations + */ + static ParseFromSnippetAsync(snippetId) { + return new Promise((resolve, reject) => { + const request = new WebRequest(); + request.addEventListener("readystatechange", () => { + if (request.readyState == 4) { + if (request.status == 200) { + const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload); + if (snippet.animations) { + const serializationObject = JSON.parse(snippet.animations); + const outputs = []; + for (const serializedAnimation of serializationObject.animations) { + const output = this.Parse(serializedAnimation); + output.snippetId = snippetId; + outputs.push(output); + } + resolve(outputs); + } else { + const serializationObject = JSON.parse(snippet.animation); + const output = this.Parse(serializationObject); + output.snippetId = snippetId; + resolve(output); + } + } else { + reject("Unable to load the snippet " + snippetId); + } + } + }); + request.open("GET", this.SnippetUrl + "/" + snippetId.replace(/#/g, "/")); + request.send(); + }); } +}; +Animation._UniqueIdGenerator = 0; +Animation.AllowMatricesInterpolation = false; +Animation.AllowMatrixDecomposeForInterpolation = true; +Animation.SnippetUrl = `https://snippet.babylonjs.com`; +Animation.ANIMATIONTYPE_FLOAT = 0; +Animation.ANIMATIONTYPE_VECTOR3 = 1; +Animation.ANIMATIONTYPE_QUATERNION = 2; +Animation.ANIMATIONTYPE_MATRIX = 3; +Animation.ANIMATIONTYPE_COLOR3 = 4; +Animation.ANIMATIONTYPE_COLOR4 = 7; +Animation.ANIMATIONTYPE_VECTOR2 = 5; +Animation.ANIMATIONTYPE_SIZE = 6; +Animation.ANIMATIONLOOPMODE_RELATIVE = 0; +Animation.ANIMATIONLOOPMODE_CYCLE = 1; +Animation.ANIMATIONLOOPMODE_CONSTANT = 2; +Animation.ANIMATIONLOOPMODE_YOYO = 4; +Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT = 5; +Animation.CreateFromSnippetAsync = Animation.ParseFromSnippetAsync; +RegisterClass("BABYLON.Animation", Animation); +Node._AnimationRangeFactory = (name69, from, to) => new AnimationRange(name69, from, to); + +// node_modules/@babylonjs/core/Animations/animationGroup.js +var TargetedAnimation = class { /** - * Gets the active textures from the material - * @returns an array of textures + * Returns the string "TargetedAnimation" + * @returns "TargetedAnimation" */ - getActiveTextures() { - const activeTextures = super.getActiveTextures(); - for (const name69 in this._textures) { - activeTextures.push(this._textures[name69]); - } - for (const name69 in this._textureArrays) { - const array = this._textureArrays[name69]; - for (let index = 0; index < array.length; index++) { - activeTextures.push(array[index]); - } - } - return activeTextures; + getClassName() { + return "TargetedAnimation"; } /** - * Specifies if the material uses a texture - * @param texture defines the texture to check against the material - * @returns a boolean specifying if the material uses the texture + * Serialize the object + * @returns the JSON object representing the current entity */ - hasTexture(texture) { - if (super.hasTexture(texture)) { - return true; + serialize() { + const serializationObject = {}; + serializationObject.animation = this.animation.serialize(); + serializationObject.targetId = this.target.id; + return serializationObject; + } +}; +var AnimationGroup = class _AnimationGroup { + /** + * Gets or sets the mask associated with this animation group. This mask is used to filter which objects should be animated. + */ + get mask() { + return this._mask; + } + set mask(value) { + if (this._mask === value) { + return; } - for (const name69 in this._textures) { - if (this._textures[name69] === texture) { - return true; - } + this._mask = value; + this.syncWithMask(true); + } + /** + * Makes sure that the animations are either played or stopped according to the animation group mask. + * Note however that the call won't have any effect if the animation group has not been started yet. + * @param forceUpdate If true, forces to loop over the animatables even if no mask is defined (used internally, you shouldn't need to use it). Default: false. + */ + syncWithMask(forceUpdate = false) { + if (!this.mask && !forceUpdate) { + this._numActiveAnimatables = this._targetedAnimations.length; + return; } - for (const name69 in this._textureArrays) { - const array = this._textureArrays[name69]; - for (let index = 0; index < array.length; index++) { - if (array[index] === texture) { - return true; + this._numActiveAnimatables = 0; + for (let i = 0; i < this._animatables.length; ++i) { + const animatable = this._animatables[i]; + if (!this.mask || this.mask.disabled || this.mask.retainsTarget(animatable.target.name)) { + this._numActiveAnimatables++; + if (animatable.paused) { + animatable.restart(); + } + } else { + if (!animatable.paused) { + animatable.pause(); } } } - return false; } /** - * Makes a duplicate of the material, and gives it a new name - * @param name defines the new name for the duplicated material - * @returns the cloned material + * Removes all animations for the targets not retained by the animation group mask. + * Use this function if you know you won't need those animations anymore and if you want to free memory. */ - clone(name69) { - const result = SerializationHelper.Clone(() => new _ShaderMaterial(name69, this.getScene(), this._shaderPath, this._options, this._storeEffectOnSubMeshes), this); - result.name = name69; - result.id = name69; - if (typeof result._shaderPath === "object") { - result._shaderPath = { ...result._shaderPath }; + removeUnmaskedAnimations() { + if (!this.mask || this.mask.disabled) { + return; } - this._options = { ...this._options }; - Object.keys(this._options).forEach((propName) => { - const propValue = this._options[propName]; - if (Array.isArray(propValue)) { - this._options[propName] = propValue.slice(0); + for (let i = 0; i < this._animatables.length; ++i) { + const animatable = this._animatables[i]; + if (!this.mask.retainsTarget(animatable.target.name)) { + animatable.stop(); + this._animatables.splice(i, 1); + --i; } - }); - this.stencil.copyTo(result.stencil); - for (const key in this._textures) { - result.setTexture(key, this._textures[key]); - } - for (const key in this._textureArrays) { - result.setTextureArray(key, this._textureArrays[key]); - } - for (const key in this._externalTextures) { - result.setExternalTexture(key, this._externalTextures[key]); - } - for (const key in this._ints) { - result.setInt(key, this._ints[key]); - } - for (const key in this._uints) { - result.setUInt(key, this._uints[key]); - } - for (const key in this._floats) { - result.setFloat(key, this._floats[key]); - } - for (const key in this._floatsArrays) { - result.setFloats(key, this._floatsArrays[key]); - } - for (const key in this._colors3) { - result.setColor3(key, this._colors3[key]); - } - for (const key in this._colors3Arrays) { - result._colors3Arrays[key] = this._colors3Arrays[key]; - } - for (const key in this._colors4) { - result.setColor4(key, this._colors4[key]); - } - for (const key in this._colors4Arrays) { - result._colors4Arrays[key] = this._colors4Arrays[key]; - } - for (const key in this._vectors2) { - result.setVector2(key, this._vectors2[key]); - } - for (const key in this._vectors3) { - result.setVector3(key, this._vectors3[key]); - } - for (const key in this._vectors4) { - result.setVector4(key, this._vectors4[key]); - } - for (const key in this._quaternions) { - result.setQuaternion(key, this._quaternions[key]); - } - for (const key in this._quaternionsArrays) { - result._quaternionsArrays[key] = this._quaternionsArrays[key]; - } - for (const key in this._matrices) { - result.setMatrix(key, this._matrices[key]); - } - for (const key in this._matrixArrays) { - result._matrixArrays[key] = this._matrixArrays[key].slice(); - } - for (const key in this._matrices3x3) { - result.setMatrix3x3(key, this._matrices3x3[key]); - } - for (const key in this._matrices2x2) { - result.setMatrix2x2(key, this._matrices2x2[key]); - } - for (const key in this._vectors2Arrays) { - result.setArray2(key, this._vectors2Arrays[key]); } - for (const key in this._vectors3Arrays) { - result.setArray3(key, this._vectors3Arrays[key]); + for (let index = 0; index < this._targetedAnimations.length; index++) { + const targetedAnimation = this._targetedAnimations[index]; + if (!this.mask.retainsTarget(targetedAnimation.target.name)) { + this._targetedAnimations.splice(index, 1); + --index; + } } - for (const key in this._vectors4Arrays) { - result.setArray4(key, this._vectors4Arrays[key]); + } + /** + * Gets or sets the first frame + */ + get from() { + return this._from; + } + set from(value) { + if (this._from === value) { + return; } - for (const key in this._uniformBuffers) { - result.setUniformBuffer(key, this._uniformBuffers[key]); + this._from = value; + for (let index = 0; index < this._animatables.length; index++) { + const animatable = this._animatables[index]; + animatable.fromFrame = this._from; } - for (const key in this._textureSamplers) { - result.setTextureSampler(key, this._textureSamplers[key]); + } + /** + * Gets or sets the last frame + */ + get to() { + return this._to; + } + set to(value) { + if (this._to === value) { + return; } - for (const key in this._storageBuffers) { - result.setStorageBuffer(key, this._storageBuffers[key]); + this._to = value; + for (let index = 0; index < this._animatables.length; index++) { + const animatable = this._animatables[index]; + animatable.toFrame = this._to; } - return result; } /** - * Disposes the material - * @param forceDisposeEffect specifies if effects should be forcefully disposed - * @param forceDisposeTextures specifies if textures should be forcefully disposed - * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh + * Define if the animations are started */ - dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh) { - if (forceDisposeTextures) { - let name69; - for (name69 in this._textures) { - this._textures[name69].dispose(); - } - for (name69 in this._textureArrays) { - const array = this._textureArrays[name69]; - for (let index = 0; index < array.length; index++) { - array[index].dispose(); - } - } - } - this._textures = {}; - super.dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh); + get isStarted() { + return this._isStarted; } /** - * Serializes this material in a JSON representation - * @returns the serialized material object + * Gets a value indicating that the current group is playing */ - serialize() { - const serializationObject = SerializationHelper.Serialize(this); - serializationObject.customType = "BABYLON.ShaderMaterial"; - serializationObject.uniqueId = this.uniqueId; - serializationObject.options = this._options; - serializationObject.shaderPath = this._shaderPath; - serializationObject.storeEffectOnSubMeshes = this._storeEffectOnSubMeshes; - let name69; - serializationObject.stencil = this.stencil.serialize(); - serializationObject.textures = {}; - for (name69 in this._textures) { - serializationObject.textures[name69] = this._textures[name69].serialize(); - } - serializationObject.textureArrays = {}; - for (name69 in this._textureArrays) { - serializationObject.textureArrays[name69] = []; - const array = this._textureArrays[name69]; - for (let index = 0; index < array.length; index++) { - serializationObject.textureArrays[name69].push(array[index].serialize()); - } - } - serializationObject.ints = {}; - for (name69 in this._ints) { - serializationObject.ints[name69] = this._ints[name69]; - } - serializationObject.uints = {}; - for (name69 in this._uints) { - serializationObject.uints[name69] = this._uints[name69]; - } - serializationObject.floats = {}; - for (name69 in this._floats) { - serializationObject.floats[name69] = this._floats[name69]; - } - serializationObject.floatsArrays = {}; - for (name69 in this._floatsArrays) { - serializationObject.floatsArrays[name69] = this._floatsArrays[name69]; - } - serializationObject.colors3 = {}; - for (name69 in this._colors3) { - serializationObject.colors3[name69] = this._colors3[name69].asArray(); - } - serializationObject.colors3Arrays = {}; - for (name69 in this._colors3Arrays) { - serializationObject.colors3Arrays[name69] = this._colors3Arrays[name69]; - } - serializationObject.colors4 = {}; - for (name69 in this._colors4) { - serializationObject.colors4[name69] = this._colors4[name69].asArray(); - } - serializationObject.colors4Arrays = {}; - for (name69 in this._colors4Arrays) { - serializationObject.colors4Arrays[name69] = this._colors4Arrays[name69]; - } - serializationObject.vectors2 = {}; - for (name69 in this._vectors2) { - serializationObject.vectors2[name69] = this._vectors2[name69].asArray(); - } - serializationObject.vectors3 = {}; - for (name69 in this._vectors3) { - serializationObject.vectors3[name69] = this._vectors3[name69].asArray(); - } - serializationObject.vectors4 = {}; - for (name69 in this._vectors4) { - serializationObject.vectors4[name69] = this._vectors4[name69].asArray(); - } - serializationObject.quaternions = {}; - for (name69 in this._quaternions) { - serializationObject.quaternions[name69] = this._quaternions[name69].asArray(); - } - serializationObject.matrices = {}; - for (name69 in this._matrices) { - serializationObject.matrices[name69] = this._matrices[name69].asArray(); - } - serializationObject.matrixArray = {}; - for (name69 in this._matrixArrays) { - serializationObject.matrixArray[name69] = this._matrixArrays[name69]; - } - serializationObject.matrices3x3 = {}; - for (name69 in this._matrices3x3) { - serializationObject.matrices3x3[name69] = this._matrices3x3[name69]; - } - serializationObject.matrices2x2 = {}; - for (name69 in this._matrices2x2) { - serializationObject.matrices2x2[name69] = this._matrices2x2[name69]; - } - serializationObject.vectors2Arrays = {}; - for (name69 in this._vectors2Arrays) { - serializationObject.vectors2Arrays[name69] = this._vectors2Arrays[name69]; - } - serializationObject.vectors3Arrays = {}; - for (name69 in this._vectors3Arrays) { - serializationObject.vectors3Arrays[name69] = this._vectors3Arrays[name69]; - } - serializationObject.vectors4Arrays = {}; - for (name69 in this._vectors4Arrays) { - serializationObject.vectors4Arrays[name69] = this._vectors4Arrays[name69]; - } - serializationObject.quaternionsArrays = {}; - for (name69 in this._quaternionsArrays) { - serializationObject.quaternionsArrays[name69] = this._quaternionsArrays[name69]; - } - return serializationObject; + get isPlaying() { + return this._isStarted && !this._isPaused; } /** - * Creates a shader material from parsed shader material data - * @param source defines the JSON representation of the material - * @param scene defines the hosting scene - * @param rootUrl defines the root URL to use to load textures and relative dependencies - * @returns a new material + * Gets or sets the speed ratio to use for all animations */ - static Parse(source, scene, rootUrl) { - const material = SerializationHelper.Parse(() => new _ShaderMaterial(source.name, scene, source.shaderPath, source.options, source.storeEffectOnSubMeshes), source, scene, rootUrl); - let name69; - if (source.stencil) { - material.stencil.parse(source.stencil, scene, rootUrl); - } - for (name69 in source.textures) { - material.setTexture(name69, Texture.Parse(source.textures[name69], scene, rootUrl)); - } - for (name69 in source.textureArrays) { - const array = source.textureArrays[name69]; - const textureArray = []; - for (let index = 0; index < array.length; index++) { - textureArray.push(Texture.Parse(array[index], scene, rootUrl)); - } - material.setTextureArray(name69, textureArray); - } - for (name69 in source.ints) { - material.setInt(name69, source.ints[name69]); - } - for (name69 in source.uints) { - material.setUInt(name69, source.uints[name69]); - } - for (name69 in source.floats) { - material.setFloat(name69, source.floats[name69]); - } - for (name69 in source.floatsArrays) { - material.setFloats(name69, source.floatsArrays[name69]); - } - for (name69 in source.colors3) { - material.setColor3(name69, Color3.FromArray(source.colors3[name69])); + get speedRatio() { + return this._speedRatio; + } + /** + * Gets or sets the speed ratio to use for all animations + */ + set speedRatio(value) { + if (this._speedRatio === value) { + return; } - for (name69 in source.colors3Arrays) { - const colors = source.colors3Arrays[name69].reduce((arr, num, i) => { - if (i % 3 === 0) { - arr.push([num]); - } else { - arr[arr.length - 1].push(num); - } - return arr; - }, []).map((color) => Color3.FromArray(color)); - material.setColor3Array(name69, colors); + this._speedRatio = value; + for (let index = 0; index < this._animatables.length; index++) { + const animatable = this._animatables[index]; + animatable.speedRatio = this._speedRatio; } - for (name69 in source.colors4) { - material.setColor4(name69, Color4.FromArray(source.colors4[name69])); + } + /** + * Gets or sets if all animations should loop or not + */ + get loopAnimation() { + return this._loopAnimation; + } + set loopAnimation(value) { + if (this._loopAnimation === value) { + return; } - for (name69 in source.colors4Arrays) { - const colors = source.colors4Arrays[name69].reduce((arr, num, i) => { - if (i % 4 === 0) { - arr.push([num]); - } else { - arr[arr.length - 1].push(num); - } - return arr; - }, []).map((color) => Color4.FromArray(color)); - material.setColor4Array(name69, colors); + this._loopAnimation = value; + for (let index = 0; index < this._animatables.length; index++) { + const animatable = this._animatables[index]; + animatable.loopAnimation = this._loopAnimation; } - for (name69 in source.vectors2) { - material.setVector2(name69, Vector2.FromArray(source.vectors2[name69])); + } + /** + * Gets or sets if all animations should be evaluated additively + */ + get isAdditive() { + return this._isAdditive; + } + set isAdditive(value) { + if (this._isAdditive === value) { + return; } - for (name69 in source.vectors3) { - material.setVector3(name69, Vector3.FromArray(source.vectors3[name69])); + this._isAdditive = value; + for (let index = 0; index < this._animatables.length; index++) { + const animatable = this._animatables[index]; + animatable.isAdditive = this._isAdditive; } - for (name69 in source.vectors4) { - material.setVector4(name69, Vector4.FromArray(source.vectors4[name69])); + } + /** + * Gets or sets the weight to apply to all animations of the group + */ + get weight() { + return this._weight; + } + set weight(value) { + if (this._weight === value) { + return; } - for (name69 in source.quaternions) { - material.setQuaternion(name69, Quaternion.FromArray(source.quaternions[name69])); + this._weight = value; + this.setWeightForAllAnimatables(this._weight); + } + /** + * Gets the targeted animations for this animation group + */ + get targetedAnimations() { + return this._targetedAnimations; + } + /** + * returning the list of animatables controlled by this animation group. + */ + get animatables() { + return this._animatables; + } + /** + * Gets the list of target animations + */ + get children() { + return this._targetedAnimations; + } + /** + * Gets or sets the order of play of the animation group (default: 0) + */ + get playOrder() { + return this._playOrder; + } + set playOrder(value) { + if (this._playOrder === value) { + return; } - for (name69 in source.matrices) { - material.setMatrix(name69, Matrix.FromArray(source.matrices[name69])); + this._playOrder = value; + if (this._animatables.length > 0) { + for (let i = 0; i < this._animatables.length; i++) { + this._animatables[i].playOrder = this._playOrder; + } + this._scene.sortActiveAnimatables(); } - for (name69 in source.matrixArray) { - material._matrixArrays[name69] = new Float32Array(source.matrixArray[name69]); + } + /** + * Allows the animations of the animation group to blend with current running animations + * Note that a null value means that each animation will use their own existing blending configuration (Animation.enableBlending) + */ + get enableBlending() { + return this._enableBlending; + } + set enableBlending(value) { + if (this._enableBlending === value) { + return; } - for (name69 in source.matrices3x3) { - material.setMatrix3x3(name69, source.matrices3x3[name69]); + this._enableBlending = value; + if (value !== null) { + for (let i = 0; i < this._targetedAnimations.length; ++i) { + this._targetedAnimations[i].animation.enableBlending = value; + } } - for (name69 in source.matrices2x2) { - material.setMatrix2x2(name69, source.matrices2x2[name69]); + } + /** + * Gets or sets the animation blending speed + * Note that a null value means that each animation will use their own existing blending configuration (Animation.blendingSpeed) + */ + get blendingSpeed() { + return this._blendingSpeed; + } + set blendingSpeed(value) { + if (this._blendingSpeed === value) { + return; } - for (name69 in source.vectors2Arrays) { - material.setArray2(name69, source.vectors2Arrays[name69]); + this._blendingSpeed = value; + if (value !== null) { + for (let i = 0; i < this._targetedAnimations.length; ++i) { + this._targetedAnimations[i].animation.blendingSpeed = value; + } } - for (name69 in source.vectors3Arrays) { - material.setArray3(name69, source.vectors3Arrays[name69]); + } + /** + * Gets the length (in seconds) of the animation group + * This function assumes that all animations are played at the same framePerSecond speed! + * Note: you can only call this method after you've added at least one targeted animation! + * @param from Starting frame range (default is AnimationGroup.from) + * @param to Ending frame range (default is AnimationGroup.to) + * @returns The length in seconds + */ + getLength(from, to) { + from = from ?? this._from; + to = to ?? this._to; + const fps = this.targetedAnimations[0].animation.framePerSecond * this._speedRatio; + return (to - from) / fps; + } + /** + * Merge the array of animation groups into a new animation group + * @param animationGroups List of animation groups to merge + * @param disposeSource If true, animation groups will be disposed after being merged (default: true) + * @param normalize If true, animation groups will be normalized before being merged, so that all animations have the same "from" and "to" frame (default: false) + * @param weight Weight for the new animation group. If not provided, it will inherit the weight from the first animation group of the array + * @returns The new animation group or null if no animation groups were passed + */ + static MergeAnimationGroups(animationGroups, disposeSource = true, normalize = false, weight) { + if (animationGroups.length === 0) { + return null; } - for (name69 in source.vectors4Arrays) { - material.setArray4(name69, source.vectors4Arrays[name69]); + weight = weight ?? animationGroups[0].weight; + let beginFrame = Number.MAX_VALUE; + let endFrame = -Number.MAX_VALUE; + if (normalize) { + for (const animationGroup of animationGroups) { + if (animationGroup.from < beginFrame) { + beginFrame = animationGroup.from; + } + if (animationGroup.to > endFrame) { + endFrame = animationGroup.to; + } + } } - for (name69 in source.quaternionsArrays) { - material.setArray4(name69, source.quaternionsArrays[name69]); + const mergedAnimationGroup = new _AnimationGroup(animationGroups[0].name + "_merged", animationGroups[0]._scene, weight); + for (const animationGroup of animationGroups) { + if (normalize) { + animationGroup.normalize(beginFrame, endFrame); + } + for (const targetedAnimation of animationGroup.targetedAnimations) { + mergedAnimationGroup.addTargetedAnimation(targetedAnimation.animation, targetedAnimation.target); + } + if (disposeSource) { + animationGroup.dispose(); + } } - return material; + return mergedAnimationGroup; } /** - * Creates a new ShaderMaterial from a snippet saved in a remote file - * @param name defines the name of the ShaderMaterial to create (can be null or empty to use the one from the json data) - * @param url defines the url to load from - * @param scene defines the hosting scene - * @param rootUrl defines the root URL to use to load textures and relative dependencies - * @returns a promise that will resolve to the new ShaderMaterial + * Instantiates a new Animation Group. + * This helps managing several animations at once. + * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/groupAnimations + * @param name Defines the name of the group + * @param scene Defines the scene the group belongs to + * @param weight Defines the weight to use for animations in the group (-1.0 by default, meaning "no weight") + * @param playOrder Defines the order of play of the animation group (default is 0) */ - static ParseFromFileAsync(name69, url, scene, rootUrl = "") { - return new Promise((resolve, reject) => { - const request = new WebRequest(); - request.addEventListener("readystatechange", () => { - if (request.readyState == 4) { - if (request.status == 200) { - const serializationObject = JSON.parse(request.responseText); - const output = this.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl); - if (name69) { - output.name = name69; - } - resolve(output); - } else { - reject("Unable to load the ShaderMaterial"); - } - } - }); - request.open("GET", url); - request.send(); - }); + constructor(name69, scene = null, weight = -1, playOrder = 0) { + this.name = name69; + this._targetedAnimations = new Array(); + this._animatables = new Array(); + this._from = Number.MAX_VALUE; + this._to = -Number.MAX_VALUE; + this._speedRatio = 1; + this._loopAnimation = false; + this._isAdditive = false; + this._weight = -1; + this._playOrder = 0; + this._enableBlending = null; + this._blendingSpeed = null; + this._numActiveAnimatables = 0; + this._parentContainer = null; + this.onAnimationEndObservable = new Observable(); + this.onAnimationLoopObservable = new Observable(); + this.onAnimationGroupLoopObservable = new Observable(); + this.onAnimationGroupEndObservable = new Observable(); + this.onAnimationGroupPauseObservable = new Observable(); + this.onAnimationGroupPlayObservable = new Observable(); + this.metadata = null; + this._mask = null; + this._animationLoopFlags = []; + this._scene = scene || EngineStore.LastCreatedScene; + this._weight = weight; + this._playOrder = playOrder; + this.uniqueId = this._scene.getUniqueId(); + this._scene.addAnimationGroup(this); } /** - * Creates a ShaderMaterial from a snippet saved by the Inspector - * @param snippetId defines the snippet to load - * @param scene defines the hosting scene - * @param rootUrl defines the root URL to use to load textures and relative dependencies - * @returns a promise that will resolve to the new ShaderMaterial + * Add an animation (with its target) in the group + * @param animation defines the animation we want to add + * @param target defines the target of the animation + * @returns the TargetedAnimation object */ - static ParseFromSnippetAsync(snippetId, scene, rootUrl = "") { - return new Promise((resolve, reject) => { - const request = new WebRequest(); - request.addEventListener("readystatechange", () => { - if (request.readyState == 4) { - if (request.status == 200) { - const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload); - const serializationObject = JSON.parse(snippet.shaderMaterial); - const output = this.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl); - output.snippetId = snippetId; - resolve(output); - } else { - reject("Unable to load the snippet " + snippetId); - } - } - }); - request.open("GET", this.SnippetUrl + "/" + snippetId.replace(/#/g, "/")); - request.send(); - }); + addTargetedAnimation(animation, target) { + const targetedAnimation = new TargetedAnimation(); + targetedAnimation.animation = animation; + targetedAnimation.target = target; + const keys = animation.getKeys(); + if (this._from > keys[0].frame) { + this._from = keys[0].frame; + } + if (this._to < keys[keys.length - 1].frame) { + this._to = keys[keys.length - 1].frame; + } + if (this._enableBlending !== null) { + animation.enableBlending = this._enableBlending; + } + if (this._blendingSpeed !== null) { + animation.blendingSpeed = this._blendingSpeed; + } + this._targetedAnimations.push(targetedAnimation); + return targetedAnimation; + } + /** + * Remove an animation from the group + * @param animation defines the animation we want to remove + */ + removeTargetedAnimation(animation) { + for (let index = this._targetedAnimations.length - 1; index > -1; index--) { + const targetedAnimation = this._targetedAnimations[index]; + if (targetedAnimation.animation === animation) { + this._targetedAnimations.splice(index, 1); + } + } } -}; -ShaderMaterial.SnippetUrl = `https://snippet.babylonjs.com`; -ShaderMaterial.CreateFromSnippetAsync = ShaderMaterial.ParseFromSnippetAsync; -RegisterClass("BABYLON.ShaderMaterial", ShaderMaterial); - -// node_modules/@babylonjs/core/Engines/constants.js -var Constants = class { -}; -Constants.ALPHA_DISABLE = 0; -Constants.ALPHA_ADD = 1; -Constants.ALPHA_COMBINE = 2; -Constants.ALPHA_SUBTRACT = 3; -Constants.ALPHA_MULTIPLY = 4; -Constants.ALPHA_MAXIMIZED = 5; -Constants.ALPHA_ONEONE = 6; -Constants.ALPHA_PREMULTIPLIED = 7; -Constants.ALPHA_PREMULTIPLIED_PORTERDUFF = 8; -Constants.ALPHA_INTERPOLATE = 9; -Constants.ALPHA_SCREENMODE = 10; -Constants.ALPHA_ONEONE_ONEONE = 11; -Constants.ALPHA_ALPHATOCOLOR = 12; -Constants.ALPHA_REVERSEONEMINUS = 13; -Constants.ALPHA_SRC_DSTONEMINUSSRCALPHA = 14; -Constants.ALPHA_ONEONE_ONEZERO = 15; -Constants.ALPHA_EXCLUSION = 16; -Constants.ALPHA_LAYER_ACCUMULATE = 17; -Constants.ALPHA_EQUATION_ADD = 0; -Constants.ALPHA_EQUATION_SUBSTRACT = 1; -Constants.ALPHA_EQUATION_REVERSE_SUBTRACT = 2; -Constants.ALPHA_EQUATION_MAX = 3; -Constants.ALPHA_EQUATION_MIN = 4; -Constants.ALPHA_EQUATION_DARKEN = 5; -Constants.DELAYLOADSTATE_NONE = 0; -Constants.DELAYLOADSTATE_LOADED = 1; -Constants.DELAYLOADSTATE_LOADING = 2; -Constants.DELAYLOADSTATE_NOTLOADED = 4; -Constants.NEVER = 512; -Constants.ALWAYS = 519; -Constants.LESS = 513; -Constants.EQUAL = 514; -Constants.LEQUAL = 515; -Constants.GREATER = 516; -Constants.GEQUAL = 518; -Constants.NOTEQUAL = 517; -Constants.KEEP = 7680; -Constants.ZERO = 0; -Constants.REPLACE = 7681; -Constants.INCR = 7682; -Constants.DECR = 7683; -Constants.INVERT = 5386; -Constants.INCR_WRAP = 34055; -Constants.DECR_WRAP = 34056; -Constants.TEXTURE_CLAMP_ADDRESSMODE = 0; -Constants.TEXTURE_WRAP_ADDRESSMODE = 1; -Constants.TEXTURE_MIRROR_ADDRESSMODE = 2; -Constants.TEXTURE_CREATIONFLAG_STORAGE = 1; -Constants.TEXTUREFORMAT_ALPHA = 0; -Constants.TEXTUREFORMAT_LUMINANCE = 1; -Constants.TEXTUREFORMAT_LUMINANCE_ALPHA = 2; -Constants.TEXTUREFORMAT_RGB = 4; -Constants.TEXTUREFORMAT_RGBA = 5; -Constants.TEXTUREFORMAT_RED = 6; -Constants.TEXTUREFORMAT_R = 6; -Constants.TEXTUREFORMAT_RG = 7; -Constants.TEXTUREFORMAT_RED_INTEGER = 8; -Constants.TEXTUREFORMAT_R_INTEGER = 8; -Constants.TEXTUREFORMAT_RG_INTEGER = 9; -Constants.TEXTUREFORMAT_RGB_INTEGER = 10; -Constants.TEXTUREFORMAT_RGBA_INTEGER = 11; -Constants.TEXTUREFORMAT_BGRA = 12; -Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 = 13; -Constants.TEXTUREFORMAT_DEPTH32_FLOAT = 14; -Constants.TEXTUREFORMAT_DEPTH16 = 15; -Constants.TEXTUREFORMAT_DEPTH24 = 16; -Constants.TEXTUREFORMAT_DEPTH24UNORM_STENCIL8 = 17; -Constants.TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8 = 18; -Constants.TEXTUREFORMAT_STENCIL8 = 19; -Constants.TEXTUREFORMAT_UNDEFINED = 4294967295; -Constants.TEXTUREFORMAT_COMPRESSED_RGBA_BPTC_UNORM = 36492; -Constants.TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 36493; -Constants.TEXTUREFORMAT_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 36495; -Constants.TEXTUREFORMAT_COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 36494; -Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT5 = 33779; -Constants.TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 35919; -Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT3 = 33778; -Constants.TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 35918; -Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT1 = 33777; -Constants.TEXTUREFORMAT_COMPRESSED_RGB_S3TC_DXT1 = 33776; -Constants.TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 35917; -Constants.TEXTUREFORMAT_COMPRESSED_SRGB_S3TC_DXT1_EXT = 35916; -Constants.TEXTUREFORMAT_COMPRESSED_RGBA_ASTC_4x4 = 37808; -Constants.TEXTUREFORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 37840; -Constants.TEXTUREFORMAT_COMPRESSED_RGB_ETC1_WEBGL = 36196; -Constants.TEXTUREFORMAT_COMPRESSED_RGB8_ETC2 = 37492; -Constants.TEXTUREFORMAT_COMPRESSED_SRGB8_ETC2 = 37493; -Constants.TEXTUREFORMAT_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 37494; -Constants.TEXTUREFORMAT_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 37495; -Constants.TEXTUREFORMAT_COMPRESSED_RGBA8_ETC2_EAC = 37496; -Constants.TEXTUREFORMAT_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 37497; -Constants.TEXTURETYPE_UNSIGNED_BYTE = 0; -Constants.TEXTURETYPE_UNSIGNED_INT = 0; -Constants.TEXTURETYPE_FLOAT = 1; -Constants.TEXTURETYPE_HALF_FLOAT = 2; -Constants.TEXTURETYPE_BYTE = 3; -Constants.TEXTURETYPE_SHORT = 4; -Constants.TEXTURETYPE_UNSIGNED_SHORT = 5; -Constants.TEXTURETYPE_INT = 6; -Constants.TEXTURETYPE_UNSIGNED_INTEGER = 7; -Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4 = 8; -Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1 = 9; -Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5 = 10; -Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV = 11; -Constants.TEXTURETYPE_UNSIGNED_INT_24_8 = 12; -Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV = 13; -Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV = 14; -Constants.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV = 15; -Constants.TEXTURETYPE_UNDEFINED = 16; -Constants.TEXTURE_2D = 3553; -Constants.TEXTURE_2D_ARRAY = 35866; -Constants.TEXTURE_CUBE_MAP = 34067; -Constants.TEXTURE_CUBE_MAP_ARRAY = 3735928559; -Constants.TEXTURE_3D = 32879; -Constants.TEXTURE_NEAREST_SAMPLINGMODE = 1; -Constants.TEXTURE_NEAREST_NEAREST = 1; -Constants.TEXTURE_BILINEAR_SAMPLINGMODE = 2; -Constants.TEXTURE_LINEAR_LINEAR = 2; -Constants.TEXTURE_TRILINEAR_SAMPLINGMODE = 3; -Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR = 3; -Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST = 4; -Constants.TEXTURE_NEAREST_LINEAR_MIPNEAREST = 5; -Constants.TEXTURE_NEAREST_LINEAR_MIPLINEAR = 6; -Constants.TEXTURE_NEAREST_LINEAR = 7; -Constants.TEXTURE_NEAREST_NEAREST_MIPLINEAR = 8; -Constants.TEXTURE_LINEAR_NEAREST_MIPNEAREST = 9; -Constants.TEXTURE_LINEAR_NEAREST_MIPLINEAR = 10; -Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST = 11; -Constants.TEXTURE_LINEAR_NEAREST = 12; -Constants.TEXTURE_EXPLICIT_MODE = 0; -Constants.TEXTURE_SPHERICAL_MODE = 1; -Constants.TEXTURE_PLANAR_MODE = 2; -Constants.TEXTURE_CUBIC_MODE = 3; -Constants.TEXTURE_PROJECTION_MODE = 4; -Constants.TEXTURE_SKYBOX_MODE = 5; -Constants.TEXTURE_INVCUBIC_MODE = 6; -Constants.TEXTURE_EQUIRECTANGULAR_MODE = 7; -Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MODE = 8; -Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9; -Constants.TEXTURE_FILTERING_QUALITY_OFFLINE = 4096; -Constants.TEXTURE_FILTERING_QUALITY_HIGH = 64; -Constants.TEXTURE_FILTERING_QUALITY_MEDIUM = 16; -Constants.TEXTURE_FILTERING_QUALITY_LOW = 8; -Constants.SCALEMODE_FLOOR = 1; -Constants.SCALEMODE_NEAREST = 2; -Constants.SCALEMODE_CEILING = 3; -Constants.MATERIAL_TextureDirtyFlag = 1; -Constants.MATERIAL_LightDirtyFlag = 2; -Constants.MATERIAL_FresnelDirtyFlag = 4; -Constants.MATERIAL_AttributesDirtyFlag = 8; -Constants.MATERIAL_MiscDirtyFlag = 16; -Constants.MATERIAL_PrePassDirtyFlag = 32; -Constants.MATERIAL_AllDirtyFlag = 63; -Constants.MATERIAL_TriangleFillMode = 0; -Constants.MATERIAL_WireFrameFillMode = 1; -Constants.MATERIAL_PointFillMode = 2; -Constants.MATERIAL_PointListDrawMode = 3; -Constants.MATERIAL_LineListDrawMode = 4; -Constants.MATERIAL_LineLoopDrawMode = 5; -Constants.MATERIAL_LineStripDrawMode = 6; -Constants.MATERIAL_TriangleStripDrawMode = 7; -Constants.MATERIAL_TriangleFanDrawMode = 8; -Constants.MATERIAL_ClockWiseSideOrientation = 0; -Constants.MATERIAL_CounterClockWiseSideOrientation = 1; -Constants.ACTION_NothingTrigger = 0; -Constants.ACTION_OnPickTrigger = 1; -Constants.ACTION_OnLeftPickTrigger = 2; -Constants.ACTION_OnRightPickTrigger = 3; -Constants.ACTION_OnCenterPickTrigger = 4; -Constants.ACTION_OnPickDownTrigger = 5; -Constants.ACTION_OnDoublePickTrigger = 6; -Constants.ACTION_OnPickUpTrigger = 7; -Constants.ACTION_OnPickOutTrigger = 16; -Constants.ACTION_OnLongPressTrigger = 8; -Constants.ACTION_OnPointerOverTrigger = 9; -Constants.ACTION_OnPointerOutTrigger = 10; -Constants.ACTION_OnEveryFrameTrigger = 11; -Constants.ACTION_OnIntersectionEnterTrigger = 12; -Constants.ACTION_OnIntersectionExitTrigger = 13; -Constants.ACTION_OnKeyDownTrigger = 14; -Constants.ACTION_OnKeyUpTrigger = 15; -Constants.PARTICLES_BILLBOARDMODE_Y = 2; -Constants.PARTICLES_BILLBOARDMODE_ALL = 7; -Constants.PARTICLES_BILLBOARDMODE_STRETCHED = 8; -Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL = 9; -Constants.MESHES_CULLINGSTRATEGY_STANDARD = 0; -Constants.MESHES_CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY = 1; -Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION = 2; -Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY = 3; -Constants.SCENELOADER_NO_LOGGING = 0; -Constants.SCENELOADER_MINIMAL_LOGGING = 1; -Constants.SCENELOADER_SUMMARY_LOGGING = 2; -Constants.SCENELOADER_DETAILED_LOGGING = 3; -Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE = 0; -Constants.PREPASS_POSITION_TEXTURE_TYPE = 1; -Constants.PREPASS_VELOCITY_TEXTURE_TYPE = 2; -Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE = 3; -Constants.PREPASS_COLOR_TEXTURE_TYPE = 4; -Constants.PREPASS_DEPTH_TEXTURE_TYPE = 5; -Constants.PREPASS_NORMAL_TEXTURE_TYPE = 6; -Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE = 7; -Constants.BUFFER_CREATIONFLAG_READ = 1; -Constants.BUFFER_CREATIONFLAG_WRITE = 2; -Constants.BUFFER_CREATIONFLAG_READWRITE = 3; -Constants.BUFFER_CREATIONFLAG_UNIFORM = 4; -Constants.BUFFER_CREATIONFLAG_VERTEX = 8; -Constants.BUFFER_CREATIONFLAG_INDEX = 16; -Constants.BUFFER_CREATIONFLAG_STORAGE = 32; -Constants.RENDERPASS_MAIN = 0; -Constants.INPUT_ALT_KEY = 18; -Constants.INPUT_CTRL_KEY = 17; -Constants.INPUT_META_KEY1 = 91; -Constants.INPUT_META_KEY2 = 92; -Constants.INPUT_META_KEY3 = 93; -Constants.INPUT_SHIFT_KEY = 16; -Constants.SNAPSHOTRENDERING_STANDARD = 0; -Constants.SNAPSHOTRENDERING_FAST = 1; -Constants.PERSPECTIVE_CAMERA = 0; -Constants.ORTHOGRAPHIC_CAMERA = 1; -Constants.FOVMODE_VERTICAL_FIXED = 0; -Constants.FOVMODE_HORIZONTAL_FIXED = 1; -Constants.RIG_MODE_NONE = 0; -Constants.RIG_MODE_STEREOSCOPIC_ANAGLYPH = 10; -Constants.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL = 11; -Constants.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED = 12; -Constants.RIG_MODE_STEREOSCOPIC_OVERUNDER = 13; -Constants.RIG_MODE_STEREOSCOPIC_INTERLACED = 14; -Constants.RIG_MODE_VR = 20; -Constants.RIG_MODE_CUSTOM = 22; -Constants.MAX_SUPPORTED_UV_SETS = 6; -Constants.GL_ALPHA_EQUATION_ADD = 32774; -Constants.GL_ALPHA_EQUATION_MIN = 32775; -Constants.GL_ALPHA_EQUATION_MAX = 32776; -Constants.GL_ALPHA_EQUATION_SUBTRACT = 32778; -Constants.GL_ALPHA_EQUATION_REVERSE_SUBTRACT = 32779; -Constants.GL_ALPHA_FUNCTION_SRC = 768; -Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR = 769; -Constants.GL_ALPHA_FUNCTION_SRC_ALPHA = 770; -Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA = 771; -Constants.GL_ALPHA_FUNCTION_DST_ALPHA = 772; -Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_ALPHA = 773; -Constants.GL_ALPHA_FUNCTION_DST_COLOR = 774; -Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_COLOR = 775; -Constants.GL_ALPHA_FUNCTION_SRC_ALPHA_SATURATED = 776; -Constants.GL_ALPHA_FUNCTION_CONSTANT_COLOR = 32769; -Constants.GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_COLOR = 32770; -Constants.GL_ALPHA_FUNCTION_CONSTANT_ALPHA = 32771; -Constants.GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_ALPHA = 32772; -Constants.SnippetUrl = "https://snippet.babylonjs.com"; -Constants.FOGMODE_NONE = 0; -Constants.FOGMODE_EXP = 1; -Constants.FOGMODE_EXP2 = 2; -Constants.FOGMODE_LINEAR = 3; -Constants.BYTE = 5120; -Constants.UNSIGNED_BYTE = 5121; -Constants.SHORT = 5122; -Constants.UNSIGNED_SHORT = 5123; -Constants.INT = 5124; -Constants.UNSIGNED_INT = 5125; -Constants.FLOAT = 5126; -Constants.PositionKind = "position"; -Constants.NormalKind = "normal"; -Constants.TangentKind = "tangent"; -Constants.UVKind = "uv"; -Constants.UV2Kind = "uv2"; -Constants.UV3Kind = "uv3"; -Constants.UV4Kind = "uv4"; -Constants.UV5Kind = "uv5"; -Constants.UV6Kind = "uv6"; -Constants.ColorKind = "color"; -Constants.ColorInstanceKind = "instanceColor"; -Constants.MatricesIndicesKind = "matricesIndices"; -Constants.MatricesWeightsKind = "matricesWeights"; -Constants.MatricesIndicesExtraKind = "matricesIndicesExtra"; -Constants.MatricesWeightsExtraKind = "matricesWeightsExtra"; - -// node_modules/@babylonjs/core/Events/clipboardEvents.js -var ClipboardEventTypes = class { -}; -ClipboardEventTypes.COPY = 1; -ClipboardEventTypes.CUT = 2; -ClipboardEventTypes.PASTE = 3; -var ClipboardInfo = class { /** - *Creates an instance of ClipboardInfo. - * @param type Defines the type of event (BABYLON.ClipboardEventTypes) - * @param event Defines the related dom event + * This function will normalize every animation in the group to make sure they all go from beginFrame to endFrame + * It can add constant keys at begin or end + * @param beginFrame defines the new begin frame for all animations or the smallest begin frame of all animations if null (defaults to null) + * @param endFrame defines the new end frame for all animations or the largest end frame of all animations if null (defaults to null) + * @returns the animation group */ - constructor(type, event) { - this.type = type; - this.event = event; + normalize(beginFrame = null, endFrame = null) { + if (beginFrame == null) { + beginFrame = this._from; + } + if (endFrame == null) { + endFrame = this._to; + } + for (let index = 0; index < this._targetedAnimations.length; index++) { + const targetedAnimation = this._targetedAnimations[index]; + const keys = targetedAnimation.animation.getKeys(); + const startKey = keys[0]; + const endKey = keys[keys.length - 1]; + if (startKey.frame > beginFrame) { + const newKey = { + frame: beginFrame, + value: startKey.value, + inTangent: startKey.inTangent, + outTangent: startKey.outTangent, + interpolation: startKey.interpolation + }; + keys.splice(0, 0, newKey); + } + if (endKey.frame < endFrame) { + const newKey = { + frame: endFrame, + value: endKey.value, + inTangent: endKey.inTangent, + outTangent: endKey.outTangent, + interpolation: endKey.interpolation + }; + keys.push(newKey); + } + } + this._from = beginFrame; + this._to = endFrame; + return this; + } + _processLoop(animatable, targetedAnimation, index) { + animatable.onAnimationLoop = () => { + this.onAnimationLoopObservable.notifyObservers(targetedAnimation); + if (this._animationLoopFlags[index]) { + return; + } + this._animationLoopFlags[index] = true; + this._animationLoopCount++; + if (this._animationLoopCount === this._numActiveAnimatables) { + this.onAnimationGroupLoopObservable.notifyObservers(this); + this._animationLoopCount = 0; + this._animationLoopFlags.length = 0; + } + }; } /** - * Get the clipboard event's type from the keycode. - * @param keyCode Defines the keyCode for the current keyboard event. - * @returns {number} + * Start all animations on given targets + * @param loop defines if animations must loop + * @param speedRatio defines the ratio to apply to animation speed (1 by default) + * @param from defines the from key (optional) + * @param to defines the to key (optional) + * @param isAdditive defines the additive state for the resulting animatables (optional) + * @returns the current animation group */ - static GetTypeFromCharacter(keyCode) { - const charCode = keyCode; - switch (charCode) { - case 67: - return ClipboardEventTypes.COPY; - case 86: - return ClipboardEventTypes.PASTE; - case 88: - return ClipboardEventTypes.CUT; - default: - return -1; + start(loop = false, speedRatio = 1, from, to, isAdditive) { + if (this._isStarted || this._targetedAnimations.length === 0) { + return this; + } + this._loopAnimation = loop; + this._animationLoopCount = 0; + this._animationLoopFlags.length = 0; + for (let index = 0; index < this._targetedAnimations.length; index++) { + const targetedAnimation = this._targetedAnimations[index]; + const animatable = this._scene.beginDirectAnimation(targetedAnimation.target, [targetedAnimation.animation], from !== void 0 ? from : this._from, to !== void 0 ? to : this._to, loop, speedRatio, void 0, void 0, isAdditive !== void 0 ? isAdditive : this._isAdditive); + animatable.weight = this._weight; + animatable.playOrder = this._playOrder; + animatable.onAnimationEnd = () => { + this.onAnimationEndObservable.notifyObservers(targetedAnimation); + this._checkAnimationGroupEnded(animatable); + }; + this._processLoop(animatable, targetedAnimation, index); + this._animatables.push(animatable); } + this.syncWithMask(); + this._scene.sortActiveAnimatables(); + this._speedRatio = speedRatio; + this._isStarted = true; + this._isPaused = false; + this.onAnimationGroupPlayObservable.notifyObservers(this); + return this; } -}; - -// node_modules/@babylonjs/core/Layers/layerSceneComponent.js -var LayerSceneComponent = class { /** - * Creates a new instance of the component for the given scene - * @param scene Defines the scene to register the component in + * Pause all animations + * @returns the animation group */ - constructor(scene) { - this.name = SceneComponentConstants.NAME_LAYER; - this.scene = scene || EngineStore.LastCreatedScene; - if (!this.scene) { - return; + pause() { + if (!this._isStarted) { + return this; } - this._engine = this.scene.getEngine(); - this.scene.layers = []; + this._isPaused = true; + for (let index = 0; index < this._animatables.length; index++) { + const animatable = this._animatables[index]; + animatable.pause(); + } + this.onAnimationGroupPauseObservable.notifyObservers(this); + return this; } /** - * Registers the component in a given scene + * Play all animations to initial state + * This function will start() the animations if they were not started or will restart() them if they were paused + * @param loop defines if animations must loop + * @returns the animation group */ - register() { - this.scene._beforeCameraDrawStage.registerStep(SceneComponentConstants.STEP_BEFORECAMERADRAW_LAYER, this, this._drawCameraBackground); - this.scene._afterCameraDrawStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERADRAW_LAYER, this, this._drawCameraForegroundWithPostProcessing); - this.scene._afterCameraPostProcessStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERAPOSTPROCESS_LAYER, this, this._drawCameraForegroundWithoutPostProcessing); - this.scene._beforeRenderTargetDrawStage.registerStep(SceneComponentConstants.STEP_BEFORERENDERTARGETDRAW_LAYER, this, this._drawRenderTargetBackground); - this.scene._afterRenderTargetDrawStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERTARGETDRAW_LAYER, this, this._drawRenderTargetForegroundWithPostProcessing); - this.scene._afterRenderTargetPostProcessStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERTARGETPOSTPROCESS_LAYER, this, this._drawRenderTargetForegroundWithoutPostProcessing); + play(loop) { + if (this.isStarted && this._animatables.length === this._targetedAnimations.length) { + if (loop !== void 0) { + this.loopAnimation = loop; + } + this.restart(); + } else { + this.stop(); + this.start(loop, this._speedRatio); + } + this._isPaused = false; + return this; } /** - * Rebuilds the elements related to this component in case of - * context lost for instance. + * Reset all animations to initial state + * @returns the animation group */ - rebuild() { - const layers = this.scene.layers; - for (const layer of layers) { - layer._rebuild(); + reset() { + if (!this._isStarted) { + this.play(); + this.goToFrame(0); + this.stop(); + return this; + } + for (let index = 0; index < this._animatables.length; index++) { + const animatable = this._animatables[index]; + animatable.reset(); } + return this; } /** - * Disposes the component and the associated resources. + * Restart animations from key 0 + * @returns the animation group */ - dispose() { - const layers = this.scene.layers; - while (layers.length) { - layers[0].dispose(); + restart() { + if (!this._isStarted) { + return this; + } + for (let index = 0; index < this._animatables.length; index++) { + const animatable = this._animatables[index]; + animatable.restart(); } + this.syncWithMask(); + this.onAnimationGroupPlayObservable.notifyObservers(this); + return this; } - _draw(predicate) { - const layers = this.scene.layers; - if (layers.length) { - this._engine.setDepthBuffer(false); - for (const layer of layers) { - if (predicate(layer)) { - layer.render(); - } + /** + * Stop all animations + * @returns the animation group + */ + stop() { + if (!this._isStarted) { + return this; + } + const list = this._animatables.slice(); + for (let index = 0; index < list.length; index++) { + list[index].stop(void 0, void 0, true); + } + let curIndex = 0; + for (let index = 0; index < this._scene._activeAnimatables.length; index++) { + const animatable = this._scene._activeAnimatables[index]; + if (animatable._runtimeAnimations.length > 0) { + this._scene._activeAnimatables[curIndex++] = animatable; } - this._engine.setDepthBuffer(true); } + this._scene._activeAnimatables.length = curIndex; + this._isStarted = false; + return this; } - _drawCameraPredicate(layer, isBackground, applyPostProcess, cameraLayerMask) { - return !layer.renderOnlyInRenderTargetTextures && layer.isBackground === isBackground && layer.applyPostProcess === applyPostProcess && (layer.layerMask & cameraLayerMask) !== 0; - } - _drawCameraBackground(camera) { - this._draw((layer) => { - return this._drawCameraPredicate(layer, true, true, camera.layerMask); - }); - } - _drawCameraForegroundWithPostProcessing(camera) { - this._draw((layer) => { - return this._drawCameraPredicate(layer, false, true, camera.layerMask); - }); - } - _drawCameraForegroundWithoutPostProcessing(camera) { - this._draw((layer) => { - return this._drawCameraPredicate(layer, false, false, camera.layerMask); - }); + /** + * Set animation weight for all animatables + * + * @since 6.12.4 + * You can pass the weight to the AnimationGroup constructor, or use the weight property to set it after the group has been created, + * making it easier to define the overall animation weight than calling setWeightForAllAnimatables() after the animation group has been started + * @param weight defines the weight to use + * @returns the animationGroup + * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#animation-weights + */ + setWeightForAllAnimatables(weight) { + for (let index = 0; index < this._animatables.length; index++) { + const animatable = this._animatables[index]; + animatable.weight = weight; + } + return this; } - _drawRenderTargetPredicate(layer, isBackground, applyPostProcess, cameraLayerMask, renderTargetTexture) { - return layer.renderTargetTextures.length > 0 && layer.isBackground === isBackground && layer.applyPostProcess === applyPostProcess && layer.renderTargetTextures.indexOf(renderTargetTexture) > -1 && (layer.layerMask & cameraLayerMask) !== 0; + /** + * Synchronize and normalize all animatables with a source animatable + * @param root defines the root animatable to synchronize with (null to stop synchronizing) + * @returns the animationGroup + * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#animation-weights + */ + syncAllAnimationsWith(root) { + for (let index = 0; index < this._animatables.length; index++) { + const animatable = this._animatables[index]; + animatable.syncWith(root); + } + return this; } - _drawRenderTargetBackground(renderTarget) { - this._draw((layer) => { - return this._drawRenderTargetPredicate(layer, true, true, this.scene.activeCamera.layerMask, renderTarget); - }); + /** + * Goes to a specific frame in this animation group + * @param frame the frame number to go to + * @returns the animationGroup + */ + goToFrame(frame) { + if (!this._isStarted) { + return this; + } + for (let index = 0; index < this._animatables.length; index++) { + const animatable = this._animatables[index]; + animatable.goToFrame(frame); + } + return this; } - _drawRenderTargetForegroundWithPostProcessing(renderTarget) { - this._draw((layer) => { - return this._drawRenderTargetPredicate(layer, false, true, this.scene.activeCamera.layerMask, renderTarget); - }); + /** + * Dispose all associated resources + */ + dispose() { + this._targetedAnimations.length = 0; + this._animatables.length = 0; + const index = this._scene.animationGroups.indexOf(this); + if (index > -1) { + this._scene.animationGroups.splice(index, 1); + } + if (this._parentContainer) { + const index2 = this._parentContainer.animationGroups.indexOf(this); + if (index2 > -1) { + this._parentContainer.animationGroups.splice(index2, 1); + } + this._parentContainer = null; + } + this.onAnimationEndObservable.clear(); + this.onAnimationGroupEndObservable.clear(); + this.onAnimationGroupPauseObservable.clear(); + this.onAnimationGroupPlayObservable.clear(); + this.onAnimationLoopObservable.clear(); + this.onAnimationGroupLoopObservable.clear(); } - _drawRenderTargetForegroundWithoutPostProcessing(renderTarget) { - this._draw((layer) => { - return this._drawRenderTargetPredicate(layer, false, false, this.scene.activeCamera.layerMask, renderTarget); - }); + _checkAnimationGroupEnded(animatable) { + const idx = this._animatables.indexOf(animatable); + if (idx > -1) { + this._animatables.splice(idx, 1); + } + if (this._animatables.length === 0) { + this._isStarted = false; + this.onAnimationGroupEndObservable.notifyObservers(this); + } } /** - * Adds all the elements from the container to the scene - * @param container the container holding the elements + * Clone the current animation group and returns a copy + * @param newName defines the name of the new group + * @param targetConverter defines an optional function used to convert current animation targets to new ones + * @param cloneAnimations defines if the animations should be cloned or referenced + * @returns the new animation group */ - addFromContainer(container) { - if (!container.layers) { - return; + clone(newName, targetConverter, cloneAnimations = false) { + const newGroup = new _AnimationGroup(newName || this.name, this._scene, this._weight, this._playOrder); + newGroup._from = this.from; + newGroup._to = this.to; + newGroup._speedRatio = this.speedRatio; + newGroup._loopAnimation = this.loopAnimation; + newGroup._isAdditive = this.isAdditive; + newGroup._enableBlending = this.enableBlending; + newGroup._blendingSpeed = this.blendingSpeed; + newGroup.metadata = this.metadata; + newGroup.mask = this.mask; + for (const targetAnimation of this._targetedAnimations) { + newGroup.addTargetedAnimation(cloneAnimations ? targetAnimation.animation.clone() : targetAnimation.animation, targetConverter ? targetConverter(targetAnimation.target) : targetAnimation.target); } - container.layers.forEach((layer) => { - this.scene.layers.push(layer); - }); + return newGroup; } /** - * Removes all the elements in the container from the scene - * @param container contains the elements to remove - * @param dispose if the removed element should be disposed (default: false) + * Serializes the animationGroup to an object + * @returns Serialized object */ - removeFromContainer(container, dispose = false) { - if (!container.layers) { - return; + serialize() { + const serializationObject = {}; + serializationObject.name = this.name; + serializationObject.from = this.from; + serializationObject.to = this.to; + serializationObject.speedRatio = this.speedRatio; + serializationObject.loopAnimation = this.loopAnimation; + serializationObject.isAdditive = this.isAdditive; + serializationObject.weight = this.weight; + serializationObject.playOrder = this.playOrder; + serializationObject.enableBlending = this.enableBlending; + serializationObject.blendingSpeed = this.blendingSpeed; + serializationObject.targetedAnimations = []; + for (let targetedAnimationIndex = 0; targetedAnimationIndex < this.targetedAnimations.length; targetedAnimationIndex++) { + const targetedAnimation = this.targetedAnimations[targetedAnimationIndex]; + serializationObject.targetedAnimations[targetedAnimationIndex] = targetedAnimation.serialize(); } - container.layers.forEach((layer) => { - const index = this.scene.layers.indexOf(layer); - if (index !== -1) { - this.scene.layers.splice(index, 1); - } - if (dispose) { - layer.dispose(); - } - }); + if (Tags && Tags.HasTags(this)) { + serializationObject.tags = Tags.GetTags(this); + } + if (this.metadata) { + serializationObject.metadata = this.metadata; + } + return serializationObject; } -}; - -// node_modules/@babylonjs/core/Shaders/layer.fragment.js -var name67 = "layerPixelShader"; -var shader67 = `varying vec2 vUV;uniform sampler2D textureSampler;uniform vec4 color; -#include -#define CUSTOM_FRAGMENT_DEFINITIONS -void main(void) { -#define CUSTOM_FRAGMENT_MAIN_BEGIN -vec4 baseColor=texture2D(textureSampler,vUV); -#ifdef LINEAR -baseColor.rgb=toGammaSpace(baseColor.rgb); -#endif -#ifdef ALPHATEST -if (baseColor.a<0.4) -discard; -#endif -gl_FragColor=baseColor*color; -#define CUSTOM_FRAGMENT_MAIN_END -}`; -ShaderStore.ShadersStore[name67] = shader67; - -// node_modules/@babylonjs/core/Shaders/layer.vertex.js -var name68 = "layerVertexShader"; -var shader68 = `attribute vec2 position;uniform vec2 scale;uniform vec2 offset;uniform mat4 textureMatrix;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5); -#define CUSTOM_VERTEX_DEFINITIONS -void main(void) { -#define CUSTOM_VERTEX_MAIN_BEGIN -vec2 shiftedPosition=position*scale+offset;vUV=vec2(textureMatrix*vec4(shiftedPosition*madd+madd,1.0,0.0));gl_Position=vec4(shiftedPosition,0.0,1.0); -#define CUSTOM_VERTEX_MAIN_END -}`; -ShaderStore.ShadersStore[name68] = shader68; - -// node_modules/@babylonjs/core/Layers/layer.js -var Layer = class { + // Statics /** - * Determines if the layer is drawn before (true) or after (false) post-processing. - * If the layer is background, it is always before. + * Returns a new AnimationGroup object parsed from the source provided. + * @param parsedAnimationGroup defines the source + * @param scene defines the scene that will receive the animationGroup + * @returns a new AnimationGroup */ - set applyPostProcess(value) { - this._applyPostProcess = value; + static Parse(parsedAnimationGroup, scene) { + const animationGroup = new _AnimationGroup(parsedAnimationGroup.name, scene, parsedAnimationGroup.weight, parsedAnimationGroup.playOrder); + for (let i = 0; i < parsedAnimationGroup.targetedAnimations.length; i++) { + const targetedAnimation = parsedAnimationGroup.targetedAnimations[i]; + const animation = Animation.Parse(targetedAnimation.animation); + const id = targetedAnimation.targetId; + if (targetedAnimation.animation.property === "influence") { + const morphTarget = scene.getMorphTargetById(id); + if (morphTarget) { + animationGroup.addTargetedAnimation(animation, morphTarget); + } + } else { + const targetNode = scene.getNodeById(id); + if (targetNode != null) { + animationGroup.addTargetedAnimation(animation, targetNode); + } + } + } + if (Tags) { + Tags.AddTagsTo(animationGroup, parsedAnimationGroup.tags); + } + if (parsedAnimationGroup.from !== null && parsedAnimationGroup.to !== null) { + animationGroup.normalize(parsedAnimationGroup.from, parsedAnimationGroup.to); + } + if (parsedAnimationGroup.speedRatio !== void 0) { + animationGroup._speedRatio = parsedAnimationGroup.speedRatio; + } + if (parsedAnimationGroup.loopAnimation !== void 0) { + animationGroup._loopAnimation = parsedAnimationGroup.loopAnimation; + } + if (parsedAnimationGroup.isAdditive !== void 0) { + animationGroup._isAdditive = parsedAnimationGroup.isAdditive; + } + if (parsedAnimationGroup.weight !== void 0) { + animationGroup._weight = parsedAnimationGroup.weight; + } + if (parsedAnimationGroup.playOrder !== void 0) { + animationGroup._playOrder = parsedAnimationGroup.playOrder; + } + if (parsedAnimationGroup.enableBlending !== void 0) { + animationGroup._enableBlending = parsedAnimationGroup.enableBlending; + } + if (parsedAnimationGroup.blendingSpeed !== void 0) { + animationGroup._blendingSpeed = parsedAnimationGroup.blendingSpeed; + } + if (parsedAnimationGroup.metadata !== void 0) { + animationGroup.metadata = parsedAnimationGroup.metadata; + } + return animationGroup; } - get applyPostProcess() { - return this.isBackground || this._applyPostProcess; + /** @internal */ + static MakeAnimationAdditive(sourceAnimationGroup, referenceFrameOrOptions, range, cloneOriginal = false, clonedName) { + let options; + if (typeof referenceFrameOrOptions === "object") { + options = referenceFrameOrOptions; + } else { + options = { + referenceFrame: referenceFrameOrOptions, + range, + cloneOriginalAnimationGroup: cloneOriginal, + clonedAnimationName: clonedName + }; + } + let animationGroup = sourceAnimationGroup; + if (options.cloneOriginalAnimationGroup) { + animationGroup = sourceAnimationGroup.clone(options.clonedAnimationGroupName || animationGroup.name); + } + const targetedAnimations = animationGroup.targetedAnimations; + for (let index = 0; index < targetedAnimations.length; index++) { + const targetedAnimation = targetedAnimations[index]; + targetedAnimation.animation = Animation.MakeAnimationAdditive(targetedAnimation.animation, options); + } + animationGroup.isAdditive = true; + if (options.clipKeys) { + let from = Number.MAX_VALUE; + let to = -Number.MAX_VALUE; + const targetedAnimations2 = animationGroup.targetedAnimations; + for (let index = 0; index < targetedAnimations2.length; index++) { + const targetedAnimation = targetedAnimations2[index]; + const animation = targetedAnimation.animation; + const keys = animation.getKeys(); + if (from > keys[0].frame) { + from = keys[0].frame; + } + if (to < keys[keys.length - 1].frame) { + to = keys[keys.length - 1].frame; + } + } + animationGroup._from = from; + animationGroup._to = to; + } + return animationGroup; } /** - * Back compatibility with callback before the onDisposeObservable existed. - * The set callback will be triggered when the layer has been disposed. + * Creates a new animation, keeping only the keys that are inside a given key range + * @param sourceAnimationGroup defines the animation group on which to operate + * @param fromKey defines the lower bound of the range + * @param toKey defines the upper bound of the range + * @param name defines the name of the new animation group. If not provided, use the same name as animationGroup + * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the keys. Default is false, so animations will be cloned + * @returns a new animation group stripped from all the keys outside the given range */ - set onDispose(callback) { - if (this._onDisposeObserver) { - this.onDisposeObservable.remove(this._onDisposeObserver); - } - this._onDisposeObserver = this.onDisposeObservable.add(callback); + static ClipKeys(sourceAnimationGroup, fromKey, toKey, name69, dontCloneAnimations) { + const animationGroup = sourceAnimationGroup.clone(name69 || sourceAnimationGroup.name); + return _AnimationGroup.ClipKeysInPlace(animationGroup, fromKey, toKey, dontCloneAnimations); } /** - * Back compatibility with callback before the onBeforeRenderObservable existed. - * The set callback will be triggered just before rendering the layer. + * Updates an existing animation, keeping only the keys that are inside a given key range + * @param animationGroup defines the animation group on which to operate + * @param fromKey defines the lower bound of the range + * @param toKey defines the upper bound of the range + * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the keys. Default is false, so animations will be cloned + * @returns the animationGroup stripped from all the keys outside the given range */ - set onBeforeRender(callback) { - if (this._onBeforeRenderObserver) { - this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver); - } - this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback); + static ClipKeysInPlace(animationGroup, fromKey, toKey, dontCloneAnimations) { + return _AnimationGroup.ClipInPlace(animationGroup, fromKey, toKey, dontCloneAnimations, false); } /** - * Back compatibility with callback before the onAfterRenderObservable existed. - * The set callback will be triggered just after rendering the layer. + * Creates a new animation, keeping only the frames that are inside a given frame range + * @param sourceAnimationGroup defines the animation group on which to operate + * @param fromFrame defines the lower bound of the range + * @param toFrame defines the upper bound of the range + * @param name defines the name of the new animation group. If not provided, use the same name as animationGroup + * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the frames. Default is false, so animations will be cloned + * @returns a new animation group stripped from all the frames outside the given range */ - set onAfterRender(callback) { - if (this._onAfterRenderObserver) { - this.onAfterRenderObservable.remove(this._onAfterRenderObserver); - } - this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback); + static ClipFrames(sourceAnimationGroup, fromFrame, toFrame, name69, dontCloneAnimations) { + const animationGroup = sourceAnimationGroup.clone(name69 || sourceAnimationGroup.name); + return _AnimationGroup.ClipFramesInPlace(animationGroup, fromFrame, toFrame, dontCloneAnimations); } /** - * Instantiates a new layer. - * This represents a full screen 2d layer. - * This can be useful to display a picture in the background of your scene for instance. - * @see https://www.babylonjs-playground.com/#08A2BS#1 - * @param name Define the name of the layer in the scene - * @param imgUrl Define the url of the texture to display in the layer - * @param scene Define the scene the layer belongs to - * @param isBackground Defines whether the layer is displayed in front or behind the scene - * @param color Defines a color for the layer + * Updates an existing animation, keeping only the frames that are inside a given frame range + * @param animationGroup defines the animation group on which to operate + * @param fromFrame defines the lower bound of the range + * @param toFrame defines the upper bound of the range + * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the frames. Default is false, so animations will be cloned + * @returns the animationGroup stripped from all the frames outside the given range */ - constructor(name69, imgUrl, scene, isBackground, color) { - this.name = name69; - this._applyPostProcess = true; - this.scale = new Vector2(1, 1); - this.offset = new Vector2(0, 0); - this.alphaBlendingMode = 2; - this.layerMask = 268435455; - this.renderTargetTextures = []; - this.renderOnlyInRenderTargetTextures = false; - this.isEnabled = true; - this._vertexBuffers = {}; - this.onDisposeObservable = new Observable(); - this.onBeforeRenderObservable = new Observable(); - this.onAfterRenderObservable = new Observable(); - this.texture = imgUrl ? new Texture(imgUrl, scene, true) : null; - this.isBackground = isBackground === void 0 ? true : isBackground; - this.color = color === void 0 ? new Color4(1, 1, 1, 1) : color; - this._scene = scene || EngineStore.LastCreatedScene; - let layerComponent = this._scene._getComponent(SceneComponentConstants.NAME_LAYER); - if (!layerComponent) { - layerComponent = new LayerSceneComponent(this._scene); - this._scene._addComponent(layerComponent); - } - this._scene.layers.push(this); - const engine = this._scene.getEngine(); - this._drawWrapper = new DrawWrapper(engine); - const vertices = []; - vertices.push(1, 1); - vertices.push(-1, 1); - vertices.push(-1, -1); - vertices.push(1, -1); - const vertexBuffer = new VertexBuffer(engine, vertices, VertexBuffer.PositionKind, false, false, 2); - this._vertexBuffers[VertexBuffer.PositionKind] = vertexBuffer; - this._createIndexBuffer(); - } - _createIndexBuffer() { - const engine = this._scene.getEngine(); - const indices = []; - indices.push(0); - indices.push(1); - indices.push(2); - indices.push(0); - indices.push(2); - indices.push(3); - this._indexBuffer = engine.createIndexBuffer(indices); - } - /** @internal */ - _rebuild() { - const vb = this._vertexBuffers[VertexBuffer.PositionKind]; - if (vb) { - vb._rebuild(); - } - this._createIndexBuffer(); + static ClipFramesInPlace(animationGroup, fromFrame, toFrame, dontCloneAnimations) { + return _AnimationGroup.ClipInPlace(animationGroup, fromFrame, toFrame, dontCloneAnimations, true); } /** - * Checks if the layer is ready to be rendered - * @returns true if the layer is ready. False otherwise. + * Updates an existing animation, keeping only the keys that are inside a given key or frame range + * @param animationGroup defines the animation group on which to operate + * @param start defines the lower bound of the range + * @param end defines the upper bound of the range + * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the keys. Default is false, so animations will be cloned + * @param useFrame defines if the range is defined by frame numbers or key indices (default is false which means use key indices) + * @returns the animationGroup stripped from all the keys outside the given range */ - isReady() { - var _a; - const engine = this._scene.getEngine(); - let defines = ""; - if (this.alphaTest) { - defines = "#define ALPHATEST"; - } - if (this.texture && !this.texture.gammaSpace) { - defines += "\n#define LINEAR"; - } - if (this._previousDefines !== defines) { - this._previousDefines = defines; - this._drawWrapper.effect = engine.createEffect("layer", [VertexBuffer.PositionKind], ["textureMatrix", "color", "scale", "offset"], ["textureSampler"], defines); + static ClipInPlace(animationGroup, start, end, dontCloneAnimations, useFrame = false) { + let from = Number.MAX_VALUE; + let to = -Number.MAX_VALUE; + const targetedAnimations = animationGroup.targetedAnimations; + for (let index = 0; index < targetedAnimations.length; index++) { + const targetedAnimation = targetedAnimations[index]; + const animation = dontCloneAnimations ? targetedAnimation.animation : targetedAnimation.animation.clone(); + if (useFrame) { + animation.createKeyForFrame(start); + animation.createKeyForFrame(end); + } + const keys = animation.getKeys(); + const newKeys = []; + let startFrame = Number.MAX_VALUE; + for (let k = 0; k < keys.length; k++) { + const key = keys[k]; + if (!useFrame && k >= start && k <= end || useFrame && key.frame >= start && key.frame <= end) { + const newKey = { + frame: key.frame, + value: key.value.clone ? key.value.clone() : key.value, + inTangent: key.inTangent, + outTangent: key.outTangent, + interpolation: key.interpolation, + lockedTangent: key.lockedTangent + }; + if (startFrame === Number.MAX_VALUE) { + startFrame = newKey.frame; + } + newKey.frame -= startFrame; + newKeys.push(newKey); + } + } + if (newKeys.length === 0) { + targetedAnimations.splice(index, 1); + index--; + continue; + } + if (from > newKeys[0].frame) { + from = newKeys[0].frame; + } + if (to < newKeys[newKeys.length - 1].frame) { + to = newKeys[newKeys.length - 1].frame; + } + animation.setKeys(newKeys, true); + targetedAnimation.animation = animation; } - const currentEffect = this._drawWrapper.effect; - return (currentEffect == null ? void 0 : currentEffect.isReady()) && ((_a = this.texture) == null ? void 0 : _a.isReady()); + animationGroup._from = from; + animationGroup._to = to; + return animationGroup; } /** - * Renders the layer in the scene. + * Returns the string "AnimationGroup" + * @returns "AnimationGroup" */ - render() { - if (!this.isEnabled) { - return; - } - const engine = this._scene.getEngine(); - if (!this.isReady()) { - return; - } - const currentEffect = this._drawWrapper.effect; - this.onBeforeRenderObservable.notifyObservers(this); - engine.enableEffect(this._drawWrapper); - engine.setState(false); - currentEffect.setTexture("textureSampler", this.texture); - currentEffect.setMatrix("textureMatrix", this.texture.getTextureMatrix()); - currentEffect.setFloat4("color", this.color.r, this.color.g, this.color.b, this.color.a); - currentEffect.setVector2("offset", this.offset); - currentEffect.setVector2("scale", this.scale); - engine.bindBuffers(this._vertexBuffers, this._indexBuffer, currentEffect); - if (!this.alphaTest) { - engine.setAlphaMode(this.alphaBlendingMode); - engine.drawElementsType(Material.TriangleFillMode, 0, 6); - engine.setAlphaMode(0); - } else { - engine.drawElementsType(Material.TriangleFillMode, 0, 6); - } - this.onAfterRenderObservable.notifyObservers(this); + getClassName() { + return "AnimationGroup"; } /** - * Disposes and releases the associated resources. + * Creates a detailed string about the object + * @param fullDetails defines if the output string will support multiple levels of logging within scene loading + * @returns a string representing the object */ - dispose() { - const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind]; - if (vertexBuffer) { - vertexBuffer.dispose(); - this._vertexBuffers[VertexBuffer.PositionKind] = null; - } - if (this._indexBuffer) { - this._scene.getEngine()._releaseBuffer(this._indexBuffer); - this._indexBuffer = null; - } - if (this.texture) { - this.texture.dispose(); - this.texture = null; + toString(fullDetails) { + let ret = "Name: " + this.name; + ret += ", type: " + this.getClassName(); + if (fullDetails) { + ret += ", from: " + this._from; + ret += ", to: " + this._to; + ret += ", isStarted: " + this._isStarted; + ret += ", speedRatio: " + this._speedRatio; + ret += ", targetedAnimations length: " + this._targetedAnimations.length; + ret += ", animatables length: " + this._animatables; } - this.renderTargetTextures = []; - const index = this._scene.layers.indexOf(this); - this._scene.layers.splice(index, 1); - this.onDisposeObservable.notifyObservers(this); - this.onDisposeObservable.clear(); - this.onAfterRenderObservable.clear(); - this.onBeforeRenderObservable.clear(); + return ret; } }; export { - AbstractScene, - AbstractActionManager, + __decorate, + Logger, EventState, Observer, Observable, @@ -79905,51 +79905,19 @@ export { Quaternion, Matrix, TmpVectors, - Scalar, - Color3, - Color4, - TmpColors, - ActionEvent, - Logger, - DeepCopier, - AnimationKeyInterpolation, - AnimationRange, - __decorate, - expandToProperty, - serialize, - serializeAsTexture, - serializeAsColor3, - serializeAsFresnelParameters, - serializeAsVector2, - serializeAsVector3, - serializeAsMeshReference, - serializeAsColorCurves, - serializeAsColor4, - serializeAsImageProcessingConfiguration, - serializeAsQuaternion, - serializeAsMatrix, - serializeAsCameraReference, - nativeOverride, - _WarnImport, - AndOrNotEvaluator, - Tags, - SerializationHelper, - Node, - Size, - WebRequest, - _staticOffsetValueQuaternion, - _staticOffsetValueVector3, - _staticOffsetValueVector2, - _staticOffsetValueSize, - _staticOffsetValueColor3, - _staticOffsetValueColor4, - Animation, + PointerEventTypes, + PointerInfoBase, + PointerInfoPre, + PointerInfo, IsWindowObjectExist, IsNavigatorAvailable, IsDocumentAvailable, GetDOMTextContent, DomManagement, + DeepCopier, PrecisionDate, + _WarnImport, + WebRequest, FilesInputStore, RetryStrategy, BaseError, @@ -80003,9 +79971,46 @@ export { Tools, className, AsyncLoop, + expandToProperty, + serialize, + serializeAsTexture, + serializeAsColor3, + serializeAsFresnelParameters, + serializeAsVector2, + serializeAsVector3, + serializeAsMeshReference, + serializeAsColorCurves, + serializeAsColor4, + serializeAsImageProcessingConfiguration, + serializeAsQuaternion, + serializeAsMatrix, + serializeAsCameraReference, + nativeOverride, + AndOrNotEvaluator, + Tags, + Scalar, + Color3, + Color4, + TmpColors, + SerializationHelper, + Size, + ThinTexture, + BaseTexture, + Plane, + GenerateBase64StringFromPixelData, + GenerateBase64StringFromTexture, + GenerateBase64StringFromTextureAsync, + CopyTools, + CompatibilityOptions, + Texture, + DynamicTexture, + Constants, + ClipboardEventTypes, + ClipboardInfo, SmartArray, SmartArrayNoDuplicate, StringDictionary, + AbstractScene, ColorCurves, PrepareUniformsForImageProcessing, PrepareSamplersForImageProcessing, @@ -80014,16 +80019,14 @@ export { Buffer, VertexBuffer, PickingInfo, + ActionEvent, PostProcessManager, RenderingGroup, RenderingGroupInfo, RenderingManager, SceneComponentConstants, Stage, - PointerEventTypes, - PointerInfoBase, - PointerInfoPre, - PointerInfo, + AbstractActionManager, KeyboardEventTypes, KeyboardInfo, KeyboardInfoPre, @@ -80039,24 +80042,15 @@ export { DeviceSource, DeviceSourceManager, PerfCounter, - Plane, Frustum, UniqueIdGenerator, LightConstants, ScenePerformancePriority, Scene, - Space, - Axis, - Coordinate, - Orientation, - BezierCurve, - Angle, - Arc2, - Path2, - Path3D, - Curve3, - TargetedAnimation, - AnimationGroup, + PerformanceMonitor, + RollingAverage, + allocateAndCopyTypedBuffer, + Engine, inlineScheduler, createYieldingScheduler, runCoroutine, @@ -80064,8 +80058,6 @@ export { runCoroutineAsync, makeSyncFunction, makeAsyncFunction, - Viewport, - Camera, IntersectionInfo, BoundingBox, BoundingSphere, @@ -80075,13 +80067,10 @@ export { SubMesh, VertexDataMaterialInfo, VertexData, - SceneLoaderFlags, - CompatibilityOptions, - Geometry, - PerformanceMonitor, - RollingAverage, - allocateAndCopyTypedBuffer, - Engine, + Node, + Space, + Axis, + Coordinate, TransformNode, _MeshCollisionData, AbstractMesh, @@ -80123,30 +80112,43 @@ export { PrepareUniformsAndSamplersForLight, PrepareUniformsAndSamplersList, Material, + LayerSceneComponent, + Layer, + Viewport, + Camera, + SceneLoaderFlags, + Geometry, MultiMaterial, MeshLODLevel, _CreationDataStorage, _InstancesBatch, Mesh, - Light, - ThinTexture, - BaseTexture, - GenerateBase64StringFromPixelData, - GenerateBase64StringFromTexture, - GenerateBase64StringFromTextureAsync, - CopyTools, - Texture, - FadeInOutBehavior, - Ray, - PivotTools, - CreatePlaneVertexData, - CreatePlane, - PlaneBuilder, - PointerDragBehavior, - BaseSixDofDragBehavior, - SixDofDragBehavior, - SurfaceMagnetismBehavior, - FollowBehavior, + GroundMesh, + CreateGroundVertexData, + CreateTiledGroundVertexData, + CreateGroundFromHeightMapVertexData, + CreateGround, + CreateTiledGround, + CreateGroundFromHeightMap, + GroundBuilder, + CreateBoxVertexData, + CreateSegmentedBoxVertexData, + CreateBox, + BoxBuilder, + PrePassConfiguration, + MaterialDefines, + PushMaterial, + MaterialFlags, + EffectFallbacks, + MaterialPluginManager, + RegisterMaterialPlugin, + UnregisterMaterialPlugin, + UnregisterAllMaterialPlugins, + MaterialPluginBase, + MaterialDetailMapDefines, + DetailMapConfiguration, + StandardMaterialDefines, + StandardMaterial, WebXRFeatureName, WebXRFeaturesManager, WebXRAbstractFeature, @@ -80158,10 +80160,8 @@ export { PhysicsImpostor, SceneLoaderAnimationGroupLoadingMode, SceneLoader, - PushMaterial, NodeMaterialBlockConnectionPointTypes, NodeMaterialBlockTargets, - MaterialDefines, NodeMaterialConnectionPointCompatibilityStates, NodeMaterialConnectionPointDirection, NodeMaterialConnectionPoint, @@ -80173,6 +80173,13 @@ export { FragmentOutputBlock, NodeMaterialBlockConnectionPointMode, NodeMaterialSystemValues, + Orientation, + BezierCurve, + Angle, + Arc2, + Path2, + Path3D, + Curve3, PositionNormalVertex, PositionNormalTextureVertex, AnimatedInputBlockTypes, @@ -80181,7 +80188,6 @@ export { ParticleTextureBlock, ParticleRampGradientBlock, ParticleBlendMultiplyBlock, - EffectFallbacks, RenderTargetWrapper, PostProcess, VectorMergerBlock, @@ -80212,40 +80218,34 @@ export { HandConstraintOrientation, HandConstraintVisibility, HandConstraintBehavior, - PrePassConfiguration, - MaterialFlags, - MaterialPluginManager, - RegisterMaterialPlugin, - UnregisterMaterialPlugin, - UnregisterAllMaterialPlugins, - MaterialPluginBase, - MaterialDetailMapDefines, - DetailMapConfiguration, - StandardMaterialDefines, - StandardMaterial, - DynamicTexture, - GroundMesh, - CreateGroundVertexData, - CreateTiledGroundVertexData, - CreateGroundFromHeightMapVertexData, - CreateGround, - CreateTiledGround, - CreateGroundFromHeightMap, - GroundBuilder, + CreatePlaneVertexData, + CreatePlane, + PlaneBuilder, + FadeInOutBehavior, + FollowBehavior, + BaseSixDofDragBehavior, + SixDofDragBehavior, + SurfaceMagnetismBehavior, + Light, HemisphericLight, UtilityLayerRenderer, GizmoAnchorPoint, GizmoCoordinatesMode, Gizmo, - CreateBoxVertexData, - CreateSegmentedBoxVertexData, - CreateBox, - BoxBuilder, + PivotTools, ShaderMaterial, - Constants, - ClipboardEventTypes, - ClipboardInfo, - LayerSceneComponent, - Layer + Ray, + PointerDragBehavior, + AnimationKeyInterpolation, + AnimationRange, + _staticOffsetValueQuaternion, + _staticOffsetValueVector3, + _staticOffsetValueVector2, + _staticOffsetValueSize, + _staticOffsetValueColor3, + _staticOffsetValueColor4, + Animation, + TargetedAnimation, + AnimationGroup }; -//# sourceMappingURL=chunk-A56RIS75.js.map +//# sourceMappingURL=chunk-F43E4K3S.js.map diff --git a/docs/.vitepress/cache/deps/chunk-F43E4K3S.js.map b/docs/.vitepress/cache/deps/chunk-F43E4K3S.js.map new file mode 100644 index 00000000..faafa1a6 --- /dev/null +++ b/docs/.vitepress/cache/deps/chunk-F43E4K3S.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../dev/core/src/Misc/logger.ts", "../../../dev/core/src/Misc/observable.ts", "../../../dev/core/src/Maths/math.constants.ts", "../../../dev/core/src/Misc/typeStore.ts", "../../../dev/core/src/Engines/performanceConfigurator.ts", "../../../dev/core/src/Engines/engineStore.ts", "../../../dev/core/src/Misc/arrayTools.ts", "../../../dev/core/src/Maths/math.scalar.functions.ts", "../../../dev/core/src/Maths/math.vector.ts", "../../../dev/core/src/Events/pointerEvents.ts", "../../../dev/core/src/Misc/domManagement.ts", "../../../dev/core/src/Misc/deepCopier.ts", "../../../dev/core/src/Misc/precisionDate.ts", "../../../dev/core/src/Misc/webRequest.ts", "../../../dev/core/src/Misc/filesInputStore.ts", "../../../dev/core/src/Misc/retryStrategy.ts", "../../../dev/core/src/Misc/error.ts", "../../../dev/core/src/Misc/stringTools.ts", "../../../dev/core/src/Materials/shaderLanguage.ts", "../../../dev/core/src/Engines/shaderStore.ts", "../../../dev/core/src/Engines/Processors/shaderCodeNode.ts", "../../../dev/core/src/Engines/Processors/shaderCodeCursor.ts", "../../../dev/core/src/Engines/Processors/shaderCodeConditionNode.ts", "../../../dev/core/src/Engines/Processors/shaderCodeTestNode.ts", "../../../dev/core/src/Engines/Processors/Expressions/shaderDefineExpression.ts", "../../../dev/core/src/Engines/Processors/Expressions/Operators/shaderDefineIsDefinedOperator.ts", "../../../dev/core/src/Engines/Processors/Expressions/Operators/shaderDefineOrOperator.ts", "../../../dev/core/src/Engines/Processors/Expressions/Operators/shaderDefineAndOperator.ts", "../../../dev/core/src/Engines/Processors/Expressions/Operators/shaderDefineArithmeticOperator.ts", "../../../dev/core/src/Misc/devTools.ts", "../../../dev/core/src/Engines/Processors/shaderProcessor.ts", "../../../dev/core/src/Materials/effect.ts", "../../../dev/core/src/States/depthCullingState.ts", "../../../dev/core/src/States/stencilState.ts", "../../../dev/core/src/States/alphaCullingState.ts", "../../../dev/core/src/Materials/Textures/textureSampler.ts", "../../../dev/core/src/Materials/Textures/internalTexture.ts", "../../../dev/core/src/Engines/WebGL/webGL2ShaderProcessors.ts", "../../../dev/core/src/Buffers/dataBuffer.ts", "../../../dev/core/src/Meshes/WebGL/webGLDataBuffer.ts", "../../../dev/core/src/Engines/WebGL/webGLPipelineContext.ts", "../../../dev/core/src/Engines/WebGL/webGLHardwareTexture.ts", "../../../dev/core/src/Materials/drawWrapper.ts", "../../../dev/core/src/States/stencilStateComposer.ts", "../../../dev/core/src/Engines/WebGL/webGLShaderProcessors.ts", "../../../dev/core/src/Engines/thinEngine.ts", "../../../dev/core/src/Misc/timingTools.ts", "../../../dev/core/src/Misc/fileTools.ts", "../../../dev/core/src/Misc/guid.ts", "../../../dev/core/src/Misc/instantiationTools.ts", "../../../dev/core/src/Misc/tools.functions.ts", "../../../dev/core/src/Misc/tools.ts", "../../../dev/core/src/Misc/decorators.functions.ts", "../../../dev/core/src/Misc/decorators.ts", "../../../dev/core/src/Misc/andOrNotEvaluator.ts", "../../../dev/core/src/Misc/tags.ts", "../../../dev/core/src/Maths/math.scalar.ts", "../../../dev/core/src/Maths/math.color.ts", "../../../dev/core/src/Misc/decorators.serialization.ts", "../../../dev/core/src/Maths/math.size.ts", "../../../dev/core/src/Materials/Textures/thinTexture.ts", "../../../node_modules/@babylonjs/core/tslib.es6.js", "../../../dev/core/src/Materials/Textures/baseTexture.ts", "../../../dev/core/src/Maths/math.plane.ts", "../../../dev/core/src/Misc/copyTools.ts", "../../../dev/core/src/Compat/compatibilityOptions.ts", "../../../dev/core/src/Materials/Textures/texture.ts", "../../../dev/core/src/Engines/Extensions/engine.dynamicTexture.ts", "../../../dev/core/src/Materials/Textures/dynamicTexture.ts", "../../../dev/core/src/Engines/constants.ts", "../../../dev/core/src/Events/clipboardEvents.ts", "../../../dev/core/src/Misc/smartArray.ts", "../../../dev/core/src/Misc/stringDictionary.ts", "../../../dev/core/src/abstractScene.ts", "../../../dev/core/src/Materials/colorCurves.functions.ts", "../../../dev/core/src/Materials/colorCurves.ts", "../../../dev/core/src/Materials/imageProcessingConfiguration.functions.ts", "../../../dev/core/src/Materials/imageProcessingConfiguration.ts", "../../../dev/core/src/Engines/Extensions/engine.uniformBuffer.ts", "../../../dev/core/src/Materials/uniformBuffer.ts", "../../../dev/core/src/Buffers/buffer.ts", "../../../dev/core/src/Collisions/pickingInfo.ts", "../../../dev/core/src/Actions/actionEvent.ts", "../../../dev/core/src/PostProcesses/postProcessManager.ts", "../../../dev/core/src/Rendering/renderingGroup.ts", "../../../dev/core/src/Rendering/renderingManager.ts", "../../../dev/core/src/sceneComponent.ts", "../../../dev/core/src/Actions/abstractActionManager.ts", "../../../dev/core/src/Events/keyboardEvents.ts", "../../../dev/core/src/DeviceInput/InputDevices/deviceEnums.ts", "../../../dev/core/src/Events/deviceInputEvents.ts", "../../../dev/core/src/DeviceInput/InputDevices/deviceSource.ts", "../../../dev/core/src/DeviceInput/eventFactory.ts", "../../../dev/core/src/DeviceInput/nativeDeviceInputSystem.ts", "../../../dev/core/src/DeviceInput/webDeviceInputSystem.ts", "../../../dev/core/src/DeviceInput/internalDeviceSourceManager.ts", "../../../dev/core/src/DeviceInput/InputDevices/deviceSourceManager.ts", "../../../dev/core/src/Misc/perfCounter.ts", "../../../dev/core/src/Maths/math.frustum.ts", "../../../dev/core/src/Inputs/scene.inputManager.ts", "../../../dev/core/src/Misc/uniqueIdGenerator.ts", "../../../dev/core/src/Lights/lightConstants.ts", "../../../dev/core/src/Inputs/pointerPickingConfiguration.ts", "../../../dev/core/src/scene.ts", "../../../dev/core/src/Misc/performanceMonitor.ts", "../../../dev/core/src/Engines/Extensions/engine.readTexture.ts", "../../../dev/core/src/Engines/Extensions/engine.alpha.ts", "../../../dev/core/src/Engines/Extensions/engine.dynamicBuffer.ts", "../../../dev/core/src/Engines/engine.ts", "../../../dev/core/src/Misc/coroutine.ts", "../../../dev/core/src/Collisions/intersectionInfo.ts", "../../../dev/core/src/Culling/boundingBox.ts", "../../../dev/core/src/Culling/boundingSphere.ts", "../../../dev/core/src/Culling/boundingInfo.ts", "../../../dev/core/src/Maths/math.functions.ts", "../../../dev/core/src/Meshes/subMesh.ts", "../../../dev/core/src/Meshes/mesh.vertexData.ts", "../../../dev/core/src/node.ts", "../../../dev/core/src/Maths/math.axis.ts", "../../../dev/core/src/Meshes/transformNode.ts", "../../../dev/core/src/Collisions/meshCollisionData.ts", "../../../dev/core/src/Meshes/abstractMesh.ts", "../../../dev/core/src/Materials/materialPluginEvent.ts", "../../../dev/core/src/Materials/clipPlaneMaterialHelper.ts", "../../../dev/core/src/Materials/materialHelper.functions.ts", "../../../dev/core/src/Materials/materialStencilState.ts", "../../../dev/core/src/Materials/material.ts", "../../../dev/core/src/Layers/layerSceneComponent.ts", "../../../dev/core/src/Shaders/ShadersInclude/helperFunctions.ts", "../../../dev/core/src/Shaders/layer.fragment.ts", "../../../dev/core/src/Shaders/layer.vertex.ts", "../../../dev/core/src/Layers/layer.ts", "../../../dev/core/src/Maths/math.viewport.ts", "../../../dev/core/src/Cameras/camera.ts", "../../../dev/core/src/Loading/sceneLoaderFlags.ts", "../../../dev/core/src/Meshes/geometry.ts", "../../../dev/core/src/Materials/multiMaterial.ts", "../../../dev/core/src/Meshes/meshLODLevel.ts", "../../../dev/core/src/Meshes/mesh.ts", "../../../dev/core/src/Meshes/groundMesh.ts", "../../../dev/core/src/Meshes/Builders/groundBuilder.ts", "../../../dev/core/src/Meshes/Builders/boxBuilder.ts", "../../../dev/core/src/Materials/materialDefines.ts", "../../../dev/core/src/Materials/pushMaterial.ts", "../../../dev/core/src/Materials/materialFlags.ts", "../../../dev/core/src/Materials/effectFallbacks.ts", "../../../dev/core/src/Materials/materialPluginManager.ts", "../../../dev/core/src/Materials/materialPluginBase.ts", "../../../dev/core/src/Materials/material.detailMapConfiguration.ts", "../../../dev/core/src/Materials/prePassConfiguration.ts", "../../../dev/core/src/Shaders/ShadersInclude/decalFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/defaultFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/sceneUboDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/meshUboDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/defaultUboDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/prePassDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/oitDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/mainUVVaryingDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/lightFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/lightUboDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/lightsFragmentFunctions.ts", "../../../dev/core/src/Shaders/ShadersInclude/shadowsFragmentFunctions.ts", "../../../dev/core/src/Shaders/ShadersInclude/samplerFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/fresnelFunction.ts", "../../../dev/core/src/Shaders/ShadersInclude/reflectionFunction.ts", "../../../dev/core/src/Shaders/ShadersInclude/imageProcessingDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/imageProcessingFunctions.ts", "../../../dev/core/src/Shaders/ShadersInclude/bumpFragmentMainFunctions.ts", "../../../dev/core/src/Shaders/ShadersInclude/bumpFragmentFunctions.ts", "../../../dev/core/src/Shaders/ShadersInclude/clipPlaneFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/logDepthDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/fogFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/clipPlaneFragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/bumpFragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/decalFragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/depthPrePass.ts", "../../../dev/core/src/Shaders/ShadersInclude/lightFragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/logDepthFragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/fogFragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/oitFragment.ts", "../../../dev/core/src/Shaders/default.fragment.ts", "../../../dev/core/src/Shaders/ShadersInclude/decalVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/defaultVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/uvAttributeDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/bonesDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/bakedVertexAnimationDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/instancesDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/prePassVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/samplerVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/bumpVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/clipPlaneVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/fogVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/lightVxFragmentDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/lightVxUboDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/morphTargetsVertexGlobalDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/morphTargetsVertexDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/morphTargetsVertexGlobal.ts", "../../../dev/core/src/Shaders/ShadersInclude/morphTargetsVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/instancesVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/bonesVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/bakedVertexAnimation.ts", "../../../dev/core/src/Shaders/ShadersInclude/prePassVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/uvVariableDeclaration.ts", "../../../dev/core/src/Shaders/ShadersInclude/samplerVertexImplementation.ts", "../../../dev/core/src/Shaders/ShadersInclude/bumpVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/clipPlaneVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/fogVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/shadowsVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/vertexColorMixing.ts", "../../../dev/core/src/Shaders/ShadersInclude/pointCloudVertex.ts", "../../../dev/core/src/Shaders/ShadersInclude/logDepthVertex.ts", "../../../dev/core/src/Shaders/default.vertex.ts", "../../../dev/core/src/Materials/standardMaterial.ts", "../../../dev/core/src/XR/webXRFeaturesManager.ts", "../../../dev/core/src/XR/features/WebXRAbstractFeature.ts", "../../../dev/core/src/Physics/v1/physicsJoint.ts", "../../../dev/core/src/Physics/v1/physicsImpostor.ts", "../../../dev/core/src/Loading/sceneLoader.ts", "../../../dev/core/src/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes.ts", "../../../dev/core/src/Materials/Node/Enums/nodeMaterialBlockTargets.ts", "../../../dev/core/src/Materials/Node/nodeMaterialBlockConnectionPoint.ts", "../../../dev/core/src/Materials/Node/nodeMaterialBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/transformBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/Vertex/vertexOutputBlock.ts", "../../../dev/core/src/Decorators/nodeDecorator.ts", "../../../dev/core/src/Materials/Node/Blocks/Fragment/fragmentOutputBlock.ts", "../../../dev/core/src/Materials/Node/Enums/nodeMaterialBlockConnectionPointMode.ts", "../../../dev/core/src/Materials/Node/Enums/nodeMaterialSystemValues.ts", "../../../dev/core/src/Maths/math.path.ts", "../../../dev/core/src/Maths/math.vertexFormat.ts", "../../../dev/core/src/Materials/Node/Blocks/Input/animatedInputBlockTypes.ts", "../../../dev/core/src/Materials/Node/Blocks/Input/inputBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/Dual/currentScreenBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/Particle/particleTextureBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/Particle/particleRampGradientBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/Particle/particleBlendMultiplyBlock.ts", "../../../dev/core/src/Engines/renderTargetWrapper.ts", "../../../dev/core/src/Shaders/postprocess.vertex.ts", "../../../dev/core/src/Engines/WebGL/webGLRenderTargetWrapper.ts", "../../../dev/core/src/Engines/Extensions/engine.renderTarget.ts", "../../../dev/core/src/PostProcesses/postProcess.ts", "../../../dev/core/src/Materials/Node/Blocks/vectorMergerBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/remapBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/baseMathBlock.ts", "../../../dev/core/src/Materials/Node/Blocks/multiplyBlock.ts", "../../../dev/core/src/Materials/Node/Enums/nodeMaterialModes.ts", "../../../dev/core/src/Materials/imageProcessingConfiguration.defines.ts", "../../../dev/core/src/Particles/baseParticleSystem.ts", "../../../dev/core/src/Materials/Node/Blocks/colorSplitterBlock.ts", "../../../dev/core/src/Materials/effectRenderer.ts", "../../../dev/core/src/Shaders/pass.fragment.ts", "../../../dev/core/src/Misc/dumpTools.ts", "../../../dev/core/src/Engines/Extensions/engine.renderTargetCube.ts", "../../../dev/core/src/Materials/Textures/renderTargetTexture.ts", "../../../dev/core/src/Materials/Textures/Procedurals/proceduralTextureSceneComponent.ts", "../../../dev/core/src/Shaders/procedural.vertex.ts", "../../../dev/core/src/Materials/Textures/Procedurals/proceduralTexture.ts", "../../../dev/core/src/Materials/Node/Blocks/trigonometryBlock.ts", "../../../dev/core/src/Materials/Node/nodeMaterialBuildState.ts", "../../../dev/core/src/Materials/Node/nodeMaterialBuildStateSharedData.ts", "../../../dev/core/src/Materials/Node/nodeMaterial.ts", "../../../dev/core/src/Meshes/Builders/icoSphereBuilder.ts", "../../../dev/core/src/XR/features/WebXRHandTracking.ts", "../../../dev/core/src/Behaviors/Meshes/handConstraintBehavior.ts", "../../../dev/core/src/Meshes/Builders/planeBuilder.ts", "../../../dev/core/src/Behaviors/Meshes/fadeInOutBehavior.ts", "../../../dev/core/src/Behaviors/Meshes/followBehavior.ts", "../../../dev/core/src/Behaviors/Meshes/baseSixDofDragBehavior.ts", "../../../dev/core/src/Behaviors/Meshes/sixDofDragBehavior.ts", "../../../dev/core/src/Behaviors/Meshes/surfaceMagnetismBehavior.ts", "../../../dev/core/src/Lights/light.ts", "../../../dev/core/src/Lights/hemisphericLight.ts", "../../../dev/core/src/Rendering/utilityLayerRenderer.ts", "../../../dev/core/src/Gizmos/gizmo.ts", "../../../dev/core/src/Misc/pivotTools.ts", "../../../dev/core/src/Materials/shaderMaterial.ts", "../../../dev/core/src/Culling/ray.ts", "../../../dev/core/src/Behaviors/Meshes/pointerDragBehavior.ts", "../../../dev/core/src/Animations/animationKey.ts", "../../../dev/core/src/Animations/animationRange.ts", "../../../dev/core/src/Animations/animation.ts", "../../../dev/core/src/Animations/animationGroup.ts"], + "sourcesContent": ["/* eslint-disable no-console */\r\n/**\r\n * Logger used throughout the application to allow configuration of\r\n * the log level required for the messages.\r\n */\r\nexport class Logger {\r\n /**\r\n * No log\r\n */\r\n public static readonly NoneLogLevel = 0;\r\n /**\r\n * Only message logs\r\n */\r\n public static readonly MessageLogLevel = 1;\r\n /**\r\n * Only warning logs\r\n */\r\n public static readonly WarningLogLevel = 2;\r\n /**\r\n * Only error logs\r\n */\r\n public static readonly ErrorLogLevel = 4;\r\n /**\r\n * All logs\r\n */\r\n public static readonly AllLogLevel = 7;\r\n\r\n /**\r\n * Message to display when a message has been logged too many times\r\n */\r\n public static MessageLimitReached = \"Too many %TYPE%s (%LIMIT%), no more %TYPE%s will be reported for this message.\";\r\n\r\n private static _LogCache = \"\";\r\n private static _LogLimitOutputs: { [message: string]: { limit: number; current: number } } = {};\r\n // levels according to the (binary) numbering.\r\n private static _Levels = [\r\n {},\r\n { color: \"white\", logFunc: console.log, name: \"Log\" },\r\n { color: \"orange\", logFunc: console.warn, name: \"Warn\" },\r\n {},\r\n { color: \"red\", logFunc: console.error, name: \"Error\" },\r\n ];\r\n\r\n /**\r\n * Gets a value indicating the number of loading errors\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static errorsCount = 0;\r\n\r\n /**\r\n * Callback called when a new log is added\r\n */\r\n public static OnNewCacheEntry: (entry: string) => void;\r\n\r\n private static _CheckLimit(message: string, limit: number): boolean {\r\n let entry = Logger._LogLimitOutputs[message];\r\n if (!entry) {\r\n entry = { limit, current: 1 };\r\n Logger._LogLimitOutputs[message] = entry;\r\n } else {\r\n entry.current++;\r\n }\r\n return entry.current <= entry.limit;\r\n }\r\n\r\n private static _GenerateLimitMessage(message: string, level: number = 1): void {\r\n const entry = Logger._LogLimitOutputs[message];\r\n if (!entry || !Logger.MessageLimitReached) {\r\n return;\r\n }\r\n const type = this._Levels[level];\r\n if (entry.current === entry.limit) {\r\n Logger[type.name as \"Log\" | \"Warn\" | \"Error\"](Logger.MessageLimitReached.replace(/%LIMIT%/g, \"\" + entry.limit).replace(/%TYPE%/g, type.name ?? \"\"));\r\n }\r\n }\r\n\r\n private static _AddLogEntry(entry: string) {\r\n Logger._LogCache = entry + Logger._LogCache;\r\n\r\n if (Logger.OnNewCacheEntry) {\r\n Logger.OnNewCacheEntry(entry);\r\n }\r\n }\r\n\r\n private static _FormatMessage(message: string): string {\r\n const padStr = (i: number) => (i < 10 ? \"0\" + i : \"\" + i);\r\n\r\n const date = new Date();\r\n return \"[\" + padStr(date.getHours()) + \":\" + padStr(date.getMinutes()) + \":\" + padStr(date.getSeconds()) + \"]: \" + message;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private static _LogDisabled(message: string | any[], limit?: number): void {\r\n // nothing to do\r\n }\r\n private static _LogEnabled(level: number = 1, message: string | any[], limit?: number): void {\r\n // take first message if array\r\n const msg = Array.isArray(message) ? message[0] : message;\r\n if (limit !== undefined && !Logger._CheckLimit(msg, limit)) {\r\n return;\r\n }\r\n\r\n const formattedMessage = Logger._FormatMessage(msg);\r\n const type = this._Levels[level];\r\n const optionals = Array.isArray(message) ? message.slice(1) : [];\r\n type.logFunc && type.logFunc(\"BJS - \" + formattedMessage, ...optionals);\r\n\r\n const entry = `
${formattedMessage}

`;\r\n Logger._AddLogEntry(entry);\r\n Logger._GenerateLimitMessage(msg, level);\r\n }\r\n\r\n /**\r\n * Log a message to the console\r\n */\r\n public static Log: (message: string | any[], limit?: number) => void = Logger._LogEnabled.bind(Logger, Logger.MessageLogLevel);\r\n\r\n /**\r\n * Write a warning message to the console\r\n */\r\n public static Warn: (message: string | any[], limit?: number) => void = Logger._LogEnabled.bind(Logger, Logger.WarningLogLevel);\r\n\r\n /**\r\n * Write an error message to the console\r\n */\r\n public static Error: (message: string | any[], limit?: number) => void = Logger._LogEnabled.bind(Logger, Logger.ErrorLogLevel);\r\n\r\n /**\r\n * Gets current log cache (list of logs)\r\n */\r\n public static get LogCache(): string {\r\n return Logger._LogCache;\r\n }\r\n\r\n /**\r\n * Clears the log cache\r\n */\r\n public static ClearLogCache(): void {\r\n Logger._LogCache = \"\";\r\n Logger._LogLimitOutputs = {};\r\n Logger.errorsCount = 0;\r\n }\r\n\r\n /**\r\n * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel)\r\n */\r\n public static set LogLevels(level: number) {\r\n Logger.Log = Logger._LogDisabled;\r\n Logger.Warn = Logger._LogDisabled;\r\n Logger.Error = Logger._LogDisabled;\r\n [Logger.MessageLogLevel, Logger.WarningLogLevel, Logger.ErrorLogLevel].forEach((l) => {\r\n if ((level & l) === l) {\r\n const type = this._Levels[l];\r\n Logger[type.name as \"Log\" | \"Warn\" | \"Error\"] = Logger._LogEnabled.bind(Logger, l);\r\n }\r\n });\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * A class serves as a medium between the observable and its observers\r\n */\r\nexport class EventState {\r\n /**\r\n * Create a new EventState\r\n * @param mask defines the mask associated with this state\r\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n */\r\n constructor(mask: number, skipNextObservers = false, target?: any, currentTarget?: any) {\r\n this.initialize(mask, skipNextObservers, target, currentTarget);\r\n }\r\n\r\n /**\r\n * Initialize the current event state\r\n * @param mask defines the mask associated with this state\r\n * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n * @returns the current event state\r\n */\r\n public initialize(mask: number, skipNextObservers = false, target?: any, currentTarget?: any): EventState {\r\n this.mask = mask;\r\n this.skipNextObservers = skipNextObservers;\r\n this.target = target;\r\n this.currentTarget = currentTarget;\r\n return this;\r\n }\r\n\r\n /**\r\n * An Observer can set this property to true to prevent subsequent observers of being notified\r\n */\r\n public skipNextObservers: boolean;\r\n\r\n /**\r\n * Get the mask value that were used to trigger the event corresponding to this EventState object\r\n */\r\n public mask: number;\r\n\r\n /**\r\n * The object that originally notified the event\r\n */\r\n public target?: any;\r\n\r\n /**\r\n * The current object in the bubbling phase\r\n */\r\n public currentTarget?: any;\r\n\r\n /**\r\n * This will be populated with the return value of the last function that was executed.\r\n * If it is the first function in the callback chain it will be the event data.\r\n */\r\n public lastReturnValue?: any;\r\n\r\n /**\r\n * User defined information that will be sent to observers\r\n */\r\n public userInfo?: any;\r\n}\r\n\r\n/**\r\n * Represent an Observer registered to a given Observable object.\r\n */\r\nexport class Observer {\r\n /** @internal */\r\n public _willBeUnregistered = false;\r\n /**\r\n * Gets or sets a property defining that the observer as to be unregistered after the next notification\r\n */\r\n public unregisterOnNextCall = false;\r\n\r\n /**\r\n * this function can be used to remove the observer from the observable.\r\n * It will be set by the observable that the observer belongs to.\r\n * @internal\r\n */\r\n public _remove: Nullable<() => void> = null;\r\n\r\n /**\r\n * Creates a new observer\r\n * @param callback defines the callback to call when the observer is notified\r\n * @param mask defines the mask of the observer (used to filter notifications)\r\n * @param scope defines the current scope used to restore the JS context\r\n */\r\n constructor(\r\n /**\r\n * Defines the callback to call when the observer is notified\r\n */\r\n public callback: (eventData: T, eventState: EventState) => void,\r\n /**\r\n * Defines the mask of the observer (used to filter notifications)\r\n */\r\n public mask: number,\r\n /**\r\n * Defines the current scope used to restore the JS context\r\n */\r\n public scope: any = null\r\n ) {}\r\n\r\n /**\r\n * Remove the observer from its observable\r\n * This can be used instead of using the observable's remove function.\r\n */\r\n public remove() {\r\n if (this._remove) {\r\n this._remove();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The Observable class is a simple implementation of the Observable pattern.\r\n *\r\n * There's one slight particularity though: a given Observable can notify its observer using a particular mask value, only the Observers registered with this mask value will be notified.\r\n * This enable a more fine grained execution without having to rely on multiple different Observable objects.\r\n * For instance you may have a given Observable that have four different types of notifications: Move (mask = 0x01), Stop (mask = 0x02), Turn Right (mask = 0X04), Turn Left (mask = 0X08).\r\n * A given observer can register itself with only Move and Stop (mask = 0x03), then it will only be notified when one of these two occurs and will never be for Turn Left/Right.\r\n */\r\nexport class Observable {\r\n private _observers = new Array>();\r\n private _numObserversMarkedAsDeleted = 0;\r\n private _hasNotified = false;\r\n private _lastNotifiedValue?: T;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _eventState: EventState;\r\n\r\n private _onObserverAdded: Nullable<(observer: Observer) => void>;\r\n\r\n /**\r\n * Create an observable from a Promise.\r\n * @param promise a promise to observe for fulfillment.\r\n * @param onErrorObservable an observable to notify if a promise was rejected.\r\n * @returns the new Observable\r\n */\r\n public static FromPromise(promise: Promise, onErrorObservable?: Observable): Observable {\r\n const observable = new Observable();\r\n\r\n promise\r\n .then((ret: T) => {\r\n observable.notifyObservers(ret);\r\n })\r\n .catch((err) => {\r\n if (onErrorObservable) {\r\n onErrorObservable.notifyObservers(err as E);\r\n } else {\r\n throw err;\r\n }\r\n });\r\n\r\n return observable;\r\n }\r\n\r\n /**\r\n * Gets the list of observers\r\n * Note that observers that were recently deleted may still be present in the list because they are only really deleted on the next javascript tick!\r\n */\r\n public get observers(): Array> {\r\n return this._observers;\r\n }\r\n\r\n /**\r\n * Creates a new observable\r\n * @param onObserverAdded defines a callback to call when a new observer is added\r\n * @param notifyIfTriggered If set to true the observable will notify when an observer was added if the observable was already triggered.\r\n */\r\n constructor(\r\n onObserverAdded?: (observer: Observer) => void,\r\n /**\r\n * If set to true the observable will notify when an observer was added if the observable was already triggered.\r\n * This is helpful to single-state observables like the scene onReady or the dispose observable.\r\n */\r\n public notifyIfTriggered = false\r\n ) {\r\n this._eventState = new EventState(0);\r\n\r\n if (onObserverAdded) {\r\n this._onObserverAdded = onObserverAdded;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new Observer with the specified callback\r\n * @param callback the callback that will be executed for that Observer\r\n * @param mask the mask used to filter observers\r\n * @param insertFirst if true the callback will be inserted at the first position, hence executed before the others ones. If false (default behavior) the callback will be inserted at the last position, executed after all the others already present.\r\n * @param scope optional scope for the callback to be called from\r\n * @param unregisterOnFirstCall defines if the observer as to be unregistered after the next notification\r\n * @returns the new observer created for the callback\r\n */\r\n public add(callback?: null | undefined, mask?: number, insertFirst?: boolean, scope?: any, unregisterOnFirstCall?: boolean): null;\r\n public add(callback: (eventData: T, eventState: EventState) => void, mask?: number, insertFirst?: boolean, scope?: any, unregisterOnFirstCall?: boolean): Observer;\r\n public add(\r\n callback?: ((eventData: T, eventState: EventState) => void) | null | undefined,\r\n mask?: number,\r\n insertFirst?: boolean,\r\n scope?: any,\r\n unregisterOnFirstCall?: boolean\r\n ): Nullable>;\r\n public add(\r\n callback?: ((eventData: T, eventState: EventState) => void) | null | undefined,\r\n mask: number = -1,\r\n insertFirst = false,\r\n scope: any = null,\r\n unregisterOnFirstCall = false\r\n ): Nullable> {\r\n if (!callback) {\r\n return null;\r\n }\r\n\r\n const observer = new Observer(callback, mask, scope);\r\n observer.unregisterOnNextCall = unregisterOnFirstCall;\r\n\r\n if (insertFirst) {\r\n this._observers.unshift(observer);\r\n } else {\r\n this._observers.push(observer);\r\n }\r\n\r\n if (this._onObserverAdded) {\r\n this._onObserverAdded(observer);\r\n }\r\n\r\n // If the observable was already triggered and the observable is set to notify if triggered, notify the new observer\r\n if (this._hasNotified && this.notifyIfTriggered) {\r\n if (this._lastNotifiedValue !== undefined) {\r\n this.notifyObserver(observer, this._lastNotifiedValue);\r\n }\r\n }\r\n // attach the remove function to the observer\r\n observer._remove = () => {\r\n this.remove(observer);\r\n };\r\n\r\n return observer;\r\n }\r\n\r\n /**\r\n * Create a new Observer with the specified callback and unregisters after the next notification\r\n * @param callback the callback that will be executed for that Observer\r\n * @returns the new observer created for the callback\r\n */\r\n public addOnce(callback?: null | undefined): null;\r\n public addOnce(callback: (eventData: T, eventState: EventState) => void): Observer;\r\n public addOnce(callback?: ((eventData: T, eventState: EventState) => void) | null | undefined): Nullable>;\r\n public addOnce(callback?: ((eventData: T, eventState: EventState) => void) | null | undefined): Nullable> {\r\n return this.add(callback, undefined, undefined, undefined, true);\r\n }\r\n\r\n /**\r\n * Remove an Observer from the Observable object\r\n * @param observer the instance of the Observer to remove\r\n * @returns false if it doesn't belong to this Observable\r\n */\r\n public remove(observer: Nullable>): boolean {\r\n if (!observer) {\r\n return false;\r\n }\r\n\r\n observer._remove = null;\r\n const index = this._observers.indexOf(observer);\r\n\r\n if (index !== -1) {\r\n this._deferUnregister(observer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Remove a callback from the Observable object\r\n * @param callback the callback to remove\r\n * @param scope optional scope. If used only the callbacks with this scope will be removed\r\n * @returns false if it doesn't belong to this Observable\r\n */\r\n public removeCallback(callback: (eventData: T, eventState: EventState) => void, scope?: any): boolean {\r\n for (let index = 0; index < this._observers.length; index++) {\r\n const observer = this._observers[index];\r\n if (observer._willBeUnregistered) {\r\n continue;\r\n }\r\n if (observer.callback === callback && (!scope || scope === observer.scope)) {\r\n this._deferUnregister(observer);\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _deferUnregister(observer: Observer): void {\r\n if (observer._willBeUnregistered) {\r\n return;\r\n }\r\n this._numObserversMarkedAsDeleted++;\r\n observer.unregisterOnNextCall = false;\r\n observer._willBeUnregistered = true;\r\n setTimeout(() => {\r\n this._remove(observer);\r\n }, 0);\r\n }\r\n\r\n // This should only be called when not iterating over _observers to avoid callback skipping.\r\n // Removes an observer from the _observer Array.\r\n private _remove(observer: Nullable>, updateCounter = true): boolean {\r\n if (!observer) {\r\n return false;\r\n }\r\n\r\n const index = this._observers.indexOf(observer);\r\n\r\n if (index !== -1) {\r\n if (updateCounter) {\r\n this._numObserversMarkedAsDeleted--;\r\n }\r\n this._observers.splice(index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Moves the observable to the top of the observer list making it get called first when notified\r\n * @param observer the observer to move\r\n */\r\n public makeObserverTopPriority(observer: Observer) {\r\n this._remove(observer, false);\r\n this._observers.unshift(observer);\r\n }\r\n\r\n /**\r\n * Moves the observable to the bottom of the observer list making it get called last when notified\r\n * @param observer the observer to move\r\n */\r\n public makeObserverBottomPriority(observer: Observer) {\r\n this._remove(observer, false);\r\n this._observers.push(observer);\r\n }\r\n\r\n /**\r\n * Notify all Observers by calling their respective callback with the given data\r\n * Will return true if all observers were executed, false if an observer set skipNextObservers to true, then prevent the subsequent ones to execute\r\n * @param eventData defines the data to send to all observers\r\n * @param mask defines the mask of the current notification (observers with incompatible mask (ie mask & observer.mask === 0) will not be notified)\r\n * @param target defines the original target of the state\r\n * @param currentTarget defines the current target of the state\r\n * @param userInfo defines any user info to send to observers\r\n * @returns false if the complete observer chain was not processed (because one observer set the skipNextObservers to true)\r\n */\r\n public notifyObservers(eventData: T, mask: number = -1, target?: any, currentTarget?: any, userInfo?: any): boolean {\r\n // this prevents potential memory leaks - if an object is disposed but the observable doesn't get cleared.\r\n if (this.notifyIfTriggered) {\r\n this._hasNotified = true;\r\n this._lastNotifiedValue = eventData;\r\n }\r\n if (!this._observers.length) {\r\n return true;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.target = target;\r\n state.currentTarget = currentTarget;\r\n state.skipNextObservers = false;\r\n state.lastReturnValue = eventData;\r\n state.userInfo = userInfo;\r\n\r\n for (const obs of this._observers) {\r\n if (obs._willBeUnregistered) {\r\n continue;\r\n }\r\n\r\n if (obs.mask & mask) {\r\n if (obs.unregisterOnNextCall) {\r\n this._deferUnregister(obs);\r\n }\r\n\r\n if (obs.scope) {\r\n state.lastReturnValue = obs.callback.apply(obs.scope, [eventData, state]);\r\n } else {\r\n state.lastReturnValue = obs.callback(eventData, state);\r\n }\r\n }\r\n if (state.skipNextObservers) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Notify a specific observer\r\n * @param observer defines the observer to notify\r\n * @param eventData defines the data to be sent to each callback\r\n * @param mask is used to filter observers defaults to -1\r\n */\r\n public notifyObserver(observer: Observer, eventData: T, mask: number = -1): void {\r\n // this prevents potential memory leaks - if an object is disposed but the observable doesn't get cleared.\r\n if (this.notifyIfTriggered) {\r\n this._hasNotified = true;\r\n this._lastNotifiedValue = eventData;\r\n }\r\n if (observer._willBeUnregistered) {\r\n return;\r\n }\r\n\r\n const state = this._eventState;\r\n state.mask = mask;\r\n state.skipNextObservers = false;\r\n\r\n if (observer.unregisterOnNextCall) {\r\n this._deferUnregister(observer);\r\n }\r\n\r\n observer.callback(eventData, state);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the observable has at least one observer\r\n * @returns true is the Observable has at least one Observer registered\r\n */\r\n public hasObservers(): boolean {\r\n return this._observers.length - this._numObserversMarkedAsDeleted > 0;\r\n }\r\n\r\n /**\r\n * Clear the list of observers\r\n */\r\n public clear(): void {\r\n while (this._observers.length) {\r\n const o = this._observers.pop();\r\n if (o) {\r\n o._remove = null;\r\n }\r\n }\r\n this._onObserverAdded = null;\r\n this._numObserversMarkedAsDeleted = 0;\r\n this.cleanLastNotifiedState();\r\n }\r\n\r\n /**\r\n * Clean the last notified state - both the internal last value and the has-notified flag\r\n */\r\n public cleanLastNotifiedState(): void {\r\n this._hasNotified = false;\r\n this._lastNotifiedValue = undefined;\r\n }\r\n\r\n /**\r\n * Clone the current observable\r\n * @returns a new observable\r\n */\r\n public clone(): Observable {\r\n const result = new Observable();\r\n\r\n result._observers = this._observers.slice(0);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Does this observable handles observer registered with a given mask\r\n * @param mask defines the mask to be tested\r\n * @returns whether or not one observer registered with the given mask is handled\r\n **/\r\n public hasSpecificMask(mask: number = -1): boolean {\r\n for (const obs of this._observers) {\r\n if (obs.mask & mask || obs.mask === mask) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n", "/**\r\n * Constant used to convert a value to gamma space\r\n * @ignorenaming\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const ToGammaSpace = 1 / 2.2;\r\n\r\n/**\r\n * Constant used to convert a value to linear space\r\n * @ignorenaming\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const ToLinearSpace = 2.2;\r\n\r\n/**\r\n * Constant Golden Ratio value in Babylon.js\r\n * @ignorenaming\r\n */\r\nexport const PHI = (1 + Math.sqrt(5)) / 2;\r\n\r\n/**\r\n * Constant used to define the minimal number value in Babylon.js\r\n * @ignorenaming\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst Epsilon = 0.001;\r\nexport { Epsilon };\r\n", "/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst _RegisteredTypes: { [key: string]: Object } = {};\r\n\r\n/**\r\n * @internal\r\n */\r\nexport function RegisterClass(className: string, type: Object) {\r\n _RegisteredTypes[className] = type;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport function GetClass(fqdn: string): any {\r\n return _RegisteredTypes[fqdn];\r\n}\r\n", "/** @internal */\r\nexport class PerformanceConfigurator {\r\n /** @internal */\r\n public static MatrixUse64Bits = false;\r\n /** @internal */\r\n public static MatrixTrackPrecisionChange = true;\r\n /** @internal */\r\n public static MatrixCurrentType: any = Float32Array;\r\n /** @internal */\r\n public static MatrixTrackedMatrices: Array | null = [];\r\n\r\n /**\r\n * @internal\r\n */\r\n public static SetMatrixPrecision(use64bits: boolean) {\r\n PerformanceConfigurator.MatrixTrackPrecisionChange = false;\r\n\r\n if (use64bits && !PerformanceConfigurator.MatrixUse64Bits) {\r\n if (PerformanceConfigurator.MatrixTrackedMatrices) {\r\n for (let m = 0; m < PerformanceConfigurator.MatrixTrackedMatrices.length; ++m) {\r\n const matrix = PerformanceConfigurator.MatrixTrackedMatrices[m];\r\n const values = matrix._m;\r\n\r\n matrix._m = new Array(16);\r\n\r\n for (let i = 0; i < 16; ++i) {\r\n matrix._m[i] = values[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n PerformanceConfigurator.MatrixUse64Bits = use64bits;\r\n PerformanceConfigurator.MatrixCurrentType = PerformanceConfigurator.MatrixUse64Bits ? Array : Float32Array;\r\n PerformanceConfigurator.MatrixTrackedMatrices = null; // reclaim some memory, as we don't need _TrackedMatrices anymore\r\n }\r\n}\r\n", "import { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\n\r\nimport type { Engine } from \"./engine\";\r\nimport type { Scene } from \"../scene\";\r\n\r\n/**\r\n * The engine store class is responsible to hold all the instances of Engine and Scene created\r\n * during the life time of the application.\r\n */\r\nexport class EngineStore {\r\n /** Gets the list of created engines */\r\n public static Instances: Engine[] = [];\r\n\r\n /**\r\n * Notifies when an engine was disposed.\r\n * Mainly used for static/cache cleanup\r\n */\r\n public static OnEnginesDisposedObservable = new Observable();\r\n\r\n /** @internal */\r\n public static _LastCreatedScene: Nullable = null;\r\n\r\n /**\r\n * Gets the latest created engine\r\n */\r\n public static get LastCreatedEngine(): Nullable {\r\n if (this.Instances.length === 0) {\r\n return null;\r\n }\r\n\r\n return this.Instances[this.Instances.length - 1];\r\n }\r\n\r\n /**\r\n * Gets the latest created scene\r\n */\r\n public static get LastCreatedScene(): Nullable {\r\n return this._LastCreatedScene;\r\n }\r\n\r\n /**\r\n * Gets or sets a global variable indicating if fallback texture must be used when a texture cannot be loaded\r\n * @ignorenaming\r\n */\r\n public static UseFallbackTexture = true;\r\n\r\n /**\r\n * Texture content used if a texture cannot loaded\r\n * @ignorenaming\r\n */\r\n public static FallbackTexture = \"\";\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n\r\nimport type { Nullable, Tuple } from \"../types\";\r\n\r\n/**\r\n * Class containing a set of static utilities functions for arrays.\r\n */\r\nexport class ArrayTools {\r\n /**\r\n * Returns an array of the given size filled with elements built from the given constructor and the parameters.\r\n * @param size the number of element to construct and put in the array.\r\n * @param itemBuilder a callback responsible for creating new instance of item. Called once per array entry.\r\n * @returns a new array filled with new objects.\r\n */\r\n public static BuildArray(size: number, itemBuilder: () => T): Array {\r\n const a: T[] = [];\r\n for (let i = 0; i < size; ++i) {\r\n a.push(itemBuilder());\r\n }\r\n return a;\r\n }\r\n\r\n /**\r\n * Returns a tuple of the given size filled with elements built from the given constructor and the parameters.\r\n * @param size he number of element to construct and put in the tuple.\r\n * @param itemBuilder a callback responsible for creating new instance of item. Called once per tuple entry.\r\n * @returns a new tuple filled with new objects.\r\n */\r\n public static BuildTuple(size: N, itemBuilder: () => T): Tuple {\r\n return ArrayTools.BuildArray(size, itemBuilder) as any;\r\n }\r\n}\r\n\r\n/**\r\n * Defines the callback type used when an observed array function is triggered.\r\n * @internal\r\n */\r\nexport type _ObserveCallback = (functionName: string, previousLength: number) => void;\r\n\r\n/**\r\n * Observes a function and calls the given callback when it is called.\r\n * @param object Defines the object the function to observe belongs to.\r\n * @param functionName Defines the name of the function to observe.\r\n * @param callback Defines the callback to call when the function is called.\r\n * @returns A function to call to stop observing\r\n */\r\nfunction _observeArrayfunction(object: { [key: string]: any }, functionName: string, callback: _ObserveCallback): Nullable<() => void> {\r\n // Finds the function to observe\r\n const oldFunction = object[functionName];\r\n if (typeof oldFunction !== \"function\") {\r\n return null;\r\n }\r\n\r\n // Creates a new function that calls the callback and the old function\r\n const newFunction = function () {\r\n const previousLength = object.length;\r\n const returnValue = newFunction.previous.apply(object, arguments);\r\n callback(functionName, previousLength);\r\n return returnValue;\r\n } as any;\r\n\r\n // Doublishly links the new function and the old function\r\n oldFunction.next = newFunction;\r\n newFunction.previous = oldFunction;\r\n\r\n // Replaces the old function with the new function\r\n object[functionName] = newFunction;\r\n\r\n // Returns a function to disable the hook\r\n return () => {\r\n // Only unhook if the function is still hooked\r\n const previous = newFunction.previous;\r\n if (!previous) {\r\n return;\r\n }\r\n\r\n // Finds the ref to the next function in the chain\r\n const next = newFunction.next;\r\n\r\n // If in the middle of the chain, link the previous and next functions\r\n if (next) {\r\n previous.next = next;\r\n next.previous = previous;\r\n }\r\n // If at the end of the chain, remove the reference to the previous function\r\n // and restore the previous function\r\n else {\r\n previous.next = undefined;\r\n object[functionName] = previous;\r\n }\r\n\r\n // Lose reference to the previous and next functions\r\n newFunction.next = undefined;\r\n newFunction.previous = undefined;\r\n };\r\n}\r\n\r\n/**\r\n * Defines the list of functions to proxy when observing an array.\r\n * The scope is currently reduced to the common functions used in the render target render list and the scene cameras.\r\n */\r\nconst observedArrayFunctions = [\"push\", \"splice\", \"pop\", \"shift\", \"unshift\"];\r\n\r\n/**\r\n * Observes an array and notifies the given observer when the array is modified.\r\n * @param array Defines the array to observe\r\n * @param callback Defines the function to call when the array is modified (in the limit of the observed array functions)\r\n * @returns A function to call to stop observing the array\r\n * @internal\r\n */\r\nexport function _ObserveArray(array: T[], callback: _ObserveCallback) {\r\n // Observes all the required array functions and stores the unhook functions\r\n const unObserveFunctions = observedArrayFunctions.map((name) => {\r\n return _observeArrayfunction(array, name, callback);\r\n });\r\n\r\n // Returns a function that unhook all the observed functions\r\n return () => {\r\n unObserveFunctions.forEach((unObserveFunction) => {\r\n unObserveFunction?.();\r\n });\r\n };\r\n}\r\n", "/**\r\n * Extract int value\r\n * @param value number value\r\n * @returns int value\r\n */\r\nexport function ExtractAsInt(value: number) {\r\n return parseInt(value.toString().replace(/\\W/g, \"\"));\r\n}\r\n\r\n/**\r\n * Boolean : true if the absolute difference between a and b is lower than epsilon (default = 1.401298E-45)\r\n * @param a number\r\n * @param b number\r\n * @param epsilon (default = 1.401298E-45)\r\n * @returns true if the absolute difference between a and b is lower than epsilon (default = 1.401298E-45)\r\n */\r\nexport function WithinEpsilon(a: number, b: number, epsilon: number = 1.401298e-45): boolean {\r\n return Math.abs(a - b) <= epsilon;\r\n}\r\n\r\n/**\r\n * Returns a random float number between and min and max values\r\n * @param min min value of random\r\n * @param max max value of random\r\n * @returns random value\r\n */\r\nexport function RandomRange(min: number, max: number): number {\r\n if (min === max) {\r\n return min;\r\n }\r\n return Math.random() * (max - min) + min;\r\n}\r\n\r\n/**\r\n * Creates a new scalar with values linearly interpolated of \"amount\" between the start scalar and the end scalar.\r\n * @param start start value\r\n * @param end target value\r\n * @param amount amount to lerp between\r\n * @returns the lerped value\r\n */\r\nexport function Lerp(start: number, end: number, amount: number): number {\r\n return start + (end - start) * amount;\r\n}\r\n\r\n/**\r\n * Returns the value itself if it's between min and max.\r\n * Returns min if the value is lower than min.\r\n * Returns max if the value is greater than max.\r\n * @param value the value to clmap\r\n * @param min the min value to clamp to (default: 0)\r\n * @param max the max value to clamp to (default: 1)\r\n * @returns the clamped value\r\n */\r\nexport function Clamp(value: number, min = 0, max = 1): number {\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n\r\n/**\r\n * Returns the angle converted to equivalent value between -Math.PI and Math.PI radians.\r\n * @param angle The angle to normalize in radian.\r\n * @returns The converted angle.\r\n */\r\nexport function NormalizeRadians(angle: number): number {\r\n // More precise but slower version kept for reference.\r\n // angle = angle % Tools.TwoPi;\r\n // angle = (angle + Tools.TwoPi) % Tools.TwoPi;\r\n\r\n //if (angle > Math.PI) {\r\n //\tangle -= Tools.TwoPi;\r\n //}\r\n\r\n angle -= Math.PI * 2 * Math.floor((angle + Math.PI) / (Math.PI * 2));\r\n\r\n return angle;\r\n}\r\n\r\n/**\r\n * Returns a string : the upper case translation of the number i to hexadecimal.\r\n * @param i number\r\n * @returns the upper case translation of the number i to hexadecimal.\r\n */\r\nexport function ToHex(i: number): string {\r\n const str = i.toString(16);\r\n\r\n if (i <= 15) {\r\n return (\"0\" + str).toUpperCase();\r\n }\r\n\r\n return str.toUpperCase();\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Epsilon } from \"./math.constants\";\r\nimport type { Viewport } from \"./math.viewport\";\r\nimport type { DeepImmutable, Nullable, FloatArray, float, Constructor, Tuple } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport type { Plane } from \"./math.plane\";\r\nimport { PerformanceConfigurator } from \"../Engines/performanceConfigurator\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { Dimension, Tensor, TensorStatic } from \"./tensor\";\r\nimport type { IVector2Like, IVector3Like, IVector4Like, IQuaternionLike, IMatrixLike, IPlaneLike } from \"./math.like\";\r\nimport { Clamp, Lerp, NormalizeRadians, RandomRange, WithinEpsilon } from \"./math.scalar.functions\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst _ExtractAsInt = (value: number) => {\r\n return parseInt(value.toString().replace(/\\W/g, \"\"));\r\n};\r\n\r\n/**\r\n * Represents a vector of any dimension\r\n */\r\nexport interface Vector extends Tensor {\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n readonly dimension: Readonly>;\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n readonly rank: 1;\r\n\r\n /**\r\n * Gets the length of the vector\r\n * @returns the vector length (float)\r\n */\r\n length(): number;\r\n\r\n /**\r\n * Gets the vector squared length\r\n * @returns the vector squared length (float)\r\n */\r\n lengthSquared(): number;\r\n\r\n /**\r\n * Normalize the vector\r\n * @returns the current updated Vector\r\n */\r\n normalize(): this;\r\n\r\n /**\r\n * Normalize the current Vector with the given input length.\r\n * Please note that this is an in place operation.\r\n * @param len the length of the vector\r\n * @returns the current updated Vector\r\n */\r\n normalizeFromLength(len: number): this;\r\n\r\n /**\r\n * Normalize the current Vector to a new vector\r\n * @returns the new Vector\r\n */\r\n normalizeToNew(): this;\r\n\r\n /**\r\n * Normalize the current Vector to the reference\r\n * @param reference define the Vector to update\r\n * @returns the updated Vector\r\n */\r\n normalizeToRef(reference: this): this;\r\n}\r\n\r\n/**\r\n * Static side of Vector\r\n */\r\nexport interface VectorStatic extends TensorStatic {\r\n /**\r\n * Checks if a given vector is inside a specific range\r\n * @param v defines the vector to test\r\n * @param min defines the minimum range\r\n * @param max defines the maximum range\r\n */\r\n CheckExtends(v: T, min: T, max: T): void;\r\n\r\n /**\r\n * Returns a new Vector equal to the normalized given vector\r\n * @param vector defines the vector to normalize\r\n * @returns a new Vector\r\n */\r\n Normalize(vector: DeepImmutable): T;\r\n\r\n /**\r\n * Normalize a given vector into a second one\r\n * @param vector defines the vector to normalize\r\n * @param result defines the vector where to store the result\r\n * @returns result input\r\n */\r\n NormalizeToRef(vector: DeepImmutable, result: T): T;\r\n}\r\n\r\n/**\r\n * Class representing a vector containing 2 coordinates\r\n * Example Playground - Overview - https://playground.babylonjs.com/#QYBWV4#9\r\n */\r\nexport class Vector2 implements Vector>, IVector2Like {\r\n private static _ZeroReadOnly = Vector2.Zero() as DeepImmutable;\r\n\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: Readonly<[2]>;\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 1;\r\n\r\n /**\r\n * Creates a new Vector2 from the given x and y coordinates\r\n * @param x defines the first coordinate\r\n * @param y defines the second coordinate\r\n */\r\n constructor(\r\n /** defines the first coordinate */\r\n public x: number = 0,\r\n /** defines the second coordinate */\r\n public y: number = 0\r\n ) {}\r\n\r\n /**\r\n * Gets a string with the Vector2 coordinates\r\n * @returns a string with the Vector2 coordinates\r\n */\r\n public toString(): string {\r\n return `{X: ${this.x} Y: ${this.y}}`;\r\n }\r\n\r\n /**\r\n * Gets class name\r\n * @returns the string \"Vector2\"\r\n */\r\n public getClassName(): string {\r\n return \"Vector2\";\r\n }\r\n\r\n /**\r\n * Gets current vector hash code\r\n * @returns the Vector2 hash code as a number\r\n */\r\n public getHashCode(): number {\r\n const x = _ExtractAsInt(this.x);\r\n const y = _ExtractAsInt(this.y);\r\n let hash = x;\r\n hash = (hash * 397) ^ y;\r\n return hash;\r\n }\r\n\r\n // Operators\r\n\r\n /**\r\n * Sets the Vector2 coordinates in the given array or Float32Array from the given index.\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#15\r\n * @param array defines the source array\r\n * @param index defines the offset in source array\r\n * @returns the current Vector2\r\n */\r\n public toArray(array: FloatArray, index: number = 0): this {\r\n array[index] = this.x;\r\n array[index + 1] = this.y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Update the current vector from an array\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#39\r\n * @param array defines the destination array\r\n * @param offset defines the offset in the destination array\r\n * @returns the current Vector2\r\n */\r\n public fromArray(array: FloatArray, offset: number = 0): this {\r\n Vector2.FromArrayToRef(array, offset, this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Copy the current vector to an array\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#40\r\n * @returns a new array with 2 elements: the Vector2 coordinates.\r\n */\r\n public asArray(): [number, number] {\r\n return [this.x, this.y];\r\n }\r\n\r\n /**\r\n * Sets the Vector2 coordinates with the given Vector2 coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#24\r\n * @param source defines the source Vector2\r\n * @returns the current updated Vector2\r\n */\r\n public copyFrom(source: DeepImmutable): this {\r\n this.x = source.x;\r\n this.y = source.y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the Vector2 coordinates with the given floats\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#25\r\n * @param x defines the first coordinate\r\n * @param y defines the second coordinate\r\n * @returns the current updated Vector2\r\n */\r\n public copyFromFloats(x: number, y: number): this {\r\n this.x = x;\r\n this.y = y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the Vector2 coordinates with the given floats\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#62\r\n * @param x defines the first coordinate\r\n * @param y defines the second coordinate\r\n * @returns the current updated Vector2\r\n */\r\n public set(x: number, y: number): this {\r\n return this.copyFromFloats(x, y);\r\n }\r\n\r\n /**\r\n * Copies the given float to the current Vector2 coordinates\r\n * @param v defines the x and y coordinates of the operand\r\n * @returns the current updated Vector2\r\n */\r\n public setAll(v: number): this {\r\n return this.copyFromFloats(v, v);\r\n }\r\n\r\n /**\r\n * Add another vector with the current one\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#11\r\n * @param otherVector defines the other vector\r\n * @returns a new Vector2 set with the addition of the current Vector2 and the given one coordinates\r\n */\r\n public add(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x + otherVector.x, this.y + otherVector.y);\r\n }\r\n\r\n /**\r\n * Sets the \"result\" coordinates with the addition of the current Vector2 and the given one coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#12\r\n * @param otherVector defines the other vector\r\n * @param result defines the target vector\r\n * @returns result input\r\n */\r\n public addToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x + otherVector.x;\r\n result.y = this.y + otherVector.y;\r\n return result;\r\n }\r\n\r\n /**\r\n * Set the Vector2 coordinates by adding the given Vector2 coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#13\r\n * @param otherVector defines the other vector\r\n * @returns the current updated Vector2\r\n */\r\n public addInPlace(otherVector: DeepImmutable): this {\r\n this.x += otherVector.x;\r\n this.y += otherVector.y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the given coordinates to the current Vector2\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @returns the current updated Vector2\r\n */\r\n public addInPlaceFromFloats(x: number, y: number): this {\r\n this.x += x;\r\n this.y += y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 by adding the current Vector2 coordinates to the given Vector3 x, y coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#14\r\n * @param otherVector defines the other vector\r\n * @returns a new Vector2\r\n */\r\n public addVector3(otherVector: Vector3): this {\r\n return new (this.constructor as Constructor)(this.x + otherVector.x, this.y + otherVector.y);\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 set with the subtracted coordinates of the given one from the current Vector2\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#61\r\n * @param otherVector defines the other vector\r\n * @returns a new Vector2\r\n */\r\n public subtract(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x - otherVector.x, this.y - otherVector.y);\r\n }\r\n\r\n /**\r\n * Sets the \"result\" coordinates with the subtraction of the given one from the current Vector2 coordinates.\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#63\r\n * @param otherVector defines the other vector\r\n * @param result defines the target vector\r\n * @returns result input\r\n */\r\n public subtractToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x - otherVector.x;\r\n result.y = this.y - otherVector.y;\r\n return result;\r\n }\r\n /**\r\n * Sets the current Vector2 coordinates by subtracting from it the given one coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#88\r\n * @param otherVector defines the other vector\r\n * @returns the current updated Vector2\r\n */\r\n public subtractInPlace(otherVector: DeepImmutable): this {\r\n this.x -= otherVector.x;\r\n this.y -= otherVector.y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiplies in place the current Vector2 coordinates by the given ones\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#43\r\n * @param otherVector defines the other vector\r\n * @returns the current updated Vector2\r\n */\r\n public multiplyInPlace(otherVector: DeepImmutable): this {\r\n this.x *= otherVector.x;\r\n this.y *= otherVector.y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 set with the multiplication of the current Vector2 and the given one coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#42\r\n * @param otherVector defines the other vector\r\n * @returns a new Vector2\r\n */\r\n public multiply(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x * otherVector.x, this.y * otherVector.y);\r\n }\r\n\r\n /**\r\n * Sets \"result\" coordinates with the multiplication of the current Vector2 and the given one coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#44\r\n * @param otherVector defines the other vector\r\n * @param result defines the target vector\r\n * @returns result input\r\n */\r\n public multiplyToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x * otherVector.x;\r\n result.y = this.y * otherVector.y;\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 set with the Vector2 coordinates multiplied by the given floats\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#89\r\n * @param x defines the first coordinate\r\n * @param y defines the second coordinate\r\n * @returns a new Vector2\r\n */\r\n public multiplyByFloats(x: number, y: number): this {\r\n return new (this.constructor as Constructor)(this.x * x, this.y * y);\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 set with the Vector2 coordinates divided by the given one coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#27\r\n * @param otherVector defines the other vector\r\n * @returns a new Vector2\r\n */\r\n public divide(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x / otherVector.x, this.y / otherVector.y);\r\n }\r\n\r\n /**\r\n * Sets the \"result\" coordinates with the Vector2 divided by the given one coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#30\r\n * @param otherVector defines the other vector\r\n * @param result defines the target vector\r\n * @returns result input\r\n */\r\n public divideToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x / otherVector.x;\r\n result.y = this.y / otherVector.y;\r\n return result;\r\n }\r\n\r\n /**\r\n * Divides the current Vector2 coordinates by the given ones\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#28\r\n * @param otherVector defines the other vector\r\n * @returns the current updated Vector2\r\n */\r\n public divideInPlace(otherVector: DeepImmutable): this {\r\n this.x = this.x / otherVector.x;\r\n this.y = this.y / otherVector.y;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Vector2 with the minimal coordinate values between its and the given vector ones\r\n * @param other defines the second operand\r\n * @returns the current updated Vector2\r\n */\r\n public minimizeInPlace(other: DeepImmutable): this {\r\n return this.minimizeInPlaceFromFloats(other.x, other.y);\r\n }\r\n\r\n /**\r\n * Updates the current Vector2 with the maximal coordinate values between its and the given vector ones.\r\n * @param other defines the second operand\r\n * @returns the current updated Vector2\r\n */\r\n public maximizeInPlace(other: DeepImmutable): this {\r\n return this.maximizeInPlaceFromFloats(other.x, other.y);\r\n }\r\n\r\n /**\r\n * Updates the current Vector2 with the minimal coordinate values between its and the given coordinates\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @returns the current updated Vector2\r\n */\r\n public minimizeInPlaceFromFloats(x: number, y: number): this {\r\n this.x = Math.min(x, this.x);\r\n this.y = Math.min(y, this.y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Vector2 with the maximal coordinate values between its and the given coordinates.\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @returns the current updated Vector2\r\n */\r\n public maximizeInPlaceFromFloats(x: number, y: number): this {\r\n this.x = Math.max(x, this.x);\r\n this.y = Math.max(y, this.y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 set with the subtraction of the given floats from the current Vector2 coordinates\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @returns the resulting Vector2\r\n */\r\n public subtractFromFloats(x: number, y: number): this {\r\n return new (this.constructor as Constructor)(this.x - x, this.y - y);\r\n }\r\n\r\n /**\r\n * Subtracts the given floats from the current Vector2 coordinates and set the given vector \"result\" with this result\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param result defines the Vector2 object where to store the result\r\n * @returns the result\r\n */\r\n public subtractFromFloatsToRef(x: number, y: number, result: T): T {\r\n return result.copyFromFloats(this.x - x, this.y - y);\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 with current Vector2 negated coordinates\r\n * @returns a new Vector2\r\n */\r\n public negate(): this {\r\n return new (this.constructor as Constructor)(-this.x, -this.y);\r\n }\r\n\r\n /**\r\n * Negate this vector in place\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#23\r\n * @returns this\r\n */\r\n public negateInPlace(): this {\r\n this.x *= -1;\r\n this.y *= -1;\r\n return this;\r\n }\r\n\r\n /**\r\n * Negate the current Vector2 and stores the result in the given vector \"result\" coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#41\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public negateToRef(result: T): T {\r\n return result.copyFromFloats(this.x * -1, this.y * -1);\r\n }\r\n\r\n /**\r\n * Multiply the Vector2 coordinates by\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#59\r\n * @param scale defines the scaling factor\r\n * @returns the current updated Vector2\r\n */\r\n public scaleInPlace(scale: number): this {\r\n this.x *= scale;\r\n this.y *= scale;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 scaled by \"scale\" from the current Vector2\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#52\r\n * @param scale defines the scaling factor\r\n * @returns a new Vector2\r\n */\r\n public scale(scale: number): this {\r\n return new (this.constructor as Constructor)(this.x * scale, this.y * scale);\r\n }\r\n\r\n /**\r\n * Scale the current Vector2 values by a factor to a given Vector2\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#57\r\n * @param scale defines the scale factor\r\n * @param result defines the Vector2 object where to store the result\r\n * @returns result input\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n result.x = this.x * scale;\r\n result.y = this.y * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Scale the current Vector2 values by a factor and add the result to a given Vector2\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#58\r\n * @param scale defines the scale factor\r\n * @param result defines the Vector2 object where to store the result\r\n * @returns result input\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n result.x += this.x * scale;\r\n result.y += this.y * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a boolean if two vectors are equals\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#31\r\n * @param otherVector defines the other vector\r\n * @returns true if the given vector coordinates strictly equal the current Vector2 ones\r\n */\r\n public equals(otherVector: DeepImmutable): boolean {\r\n return otherVector && this.x === otherVector.x && this.y === otherVector.y;\r\n }\r\n\r\n /**\r\n * Gets a boolean if two vectors are equals (using an epsilon value)\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#32\r\n * @param otherVector defines the other vector\r\n * @param epsilon defines the minimal distance to consider equality\r\n * @returns true if the given vector coordinates are close to the current ones by a distance of epsilon.\r\n */\r\n public equalsWithEpsilon(otherVector: DeepImmutable, epsilon: number = Epsilon): boolean {\r\n return otherVector && WithinEpsilon(this.x, otherVector.x, epsilon) && WithinEpsilon(this.y, otherVector.y, epsilon);\r\n }\r\n\r\n /**\r\n * Returns true if the current Vector2 coordinates equals the given floats\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @returns true if both vectors are equal\r\n */\r\n public equalsToFloats(x: number, y: number): boolean {\r\n return this.x === x && this.y === y;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 from current Vector2 floored values\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#35\r\n * eg (1.2, 2.31) returns (1, 2)\r\n * @returns a new Vector2\r\n */\r\n public floor(): this {\r\n return new (this.constructor as Constructor)(Math.floor(this.x), Math.floor(this.y));\r\n }\r\n\r\n /**\r\n * Gets the current Vector2's floored values and stores them in result\r\n * @param result the Vector2 to store the result in\r\n * @returns the result Vector2\r\n */\r\n public floorToRef(result: T): T {\r\n result.x = Math.floor(this.x);\r\n result.y = Math.floor(this.y);\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 from current Vector2 fractional values\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#34\r\n * eg (1.2, 2.31) returns (0.2, 0.31)\r\n * @returns a new Vector2\r\n */\r\n public fract(): this {\r\n return new (this.constructor as Constructor)(this.x - Math.floor(this.x), this.y - Math.floor(this.y));\r\n }\r\n\r\n /**\r\n * Gets the current Vector2's fractional values and stores them in result\r\n * @param result the Vector2 to store the result in\r\n * @returns the result Vector2\r\n */\r\n public fractToRef(result: T): T {\r\n result.x = this.x - Math.floor(this.x);\r\n result.y = this.y - Math.floor(this.y);\r\n return result;\r\n }\r\n\r\n /**\r\n * Rotate the current vector into a given result vector\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#49\r\n * @param angle defines the rotation angle\r\n * @param result defines the result vector where to store the rotated vector\r\n * @returns result input\r\n */\r\n public rotateToRef(angle: number, result: T): T {\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n const x = cos * this.x - sin * this.y;\r\n const y = sin * this.x + cos * this.y;\r\n result.x = x;\r\n result.y = y;\r\n return result;\r\n }\r\n\r\n // Properties\r\n\r\n /**\r\n * Gets the length of the vector\r\n * @returns the vector length (float)\r\n */\r\n public length(): number {\r\n return Math.sqrt(this.x * this.x + this.y * this.y);\r\n }\r\n\r\n /**\r\n * Gets the vector squared length\r\n * @returns the vector squared length (float)\r\n */\r\n public lengthSquared(): number {\r\n return this.x * this.x + this.y * this.y;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Normalize the vector\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#48\r\n * @returns the current updated Vector2\r\n */\r\n public normalize(): this {\r\n return this.normalizeFromLength(this.length());\r\n }\r\n\r\n /**\r\n * Normalize the current Vector2 with the given input length.\r\n * Please note that this is an in place operation.\r\n * @param len the length of the vector\r\n * @returns the current updated Vector2\r\n */\r\n public normalizeFromLength(len: number): this {\r\n if (len === 0 || len === 1.0) {\r\n return this;\r\n }\r\n\r\n return this.scaleInPlace(1.0 / len);\r\n }\r\n\r\n /**\r\n * Normalize the current Vector2 to a new vector\r\n * @returns the new Vector2\r\n */\r\n public normalizeToNew(): this {\r\n const normalized = new (this.constructor as Constructor)();\r\n this.normalizeToRef(normalized);\r\n return normalized;\r\n }\r\n\r\n /**\r\n * Normalize the current Vector2 to the reference\r\n * @param reference define the Vector to update\r\n * @returns the updated Vector2\r\n */\r\n public normalizeToRef(reference: T): T {\r\n const len = this.length();\r\n if (len === 0) {\r\n return reference.copyFrom(this as DeepImmutable);\r\n }\r\n return this.scaleToRef(1.0 / len, reference);\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 copied from the Vector2\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#20\r\n * @returns a new Vector2\r\n */\r\n public clone(): this {\r\n return new (this.constructor as Constructor)(this.x, this.y);\r\n }\r\n\r\n /**\r\n * Gets the dot product of the current vector and the vector \"otherVector\"\r\n * @param otherVector defines second vector\r\n * @returns the dot product (float)\r\n */\r\n public dot(otherVector: DeepImmutable): number {\r\n return this.x * otherVector.x + this.y * otherVector.y;\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Gets a new Vector2(0, 0)\r\n * @returns a new Vector2\r\n */\r\n public static Zero(): Vector2 {\r\n return new Vector2(0, 0);\r\n }\r\n\r\n /**\r\n * Gets a new Vector2(1, 1)\r\n * @returns a new Vector2\r\n */\r\n public static One(): Vector2 {\r\n return new Vector2(1, 1);\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @returns a Vector2 with random values between min and max\r\n */\r\n public static Random(min: number = 0, max: number = 1): Vector2 {\r\n return new Vector2(RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Sets a Vector2 with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @param ref the ref to store the values in\r\n * @returns the ref with random values between min and max\r\n */\r\n public static RandomToRef(min: number = 0, max: number = 1, ref: T): T {\r\n return ref.copyFromFloats(RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Gets a zero Vector2 that must not be updated\r\n */\r\n public static get ZeroReadOnly(): DeepImmutable {\r\n return Vector2._ZeroReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 set from the given index element of the given array\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#79\r\n * @param array defines the data source\r\n * @param offset defines the offset in the data source\r\n * @returns a new Vector2\r\n */\r\n public static FromArray(array: DeepImmutable>, offset: number = 0): Vector2 {\r\n return new Vector2(array[offset], array[offset + 1]);\r\n }\r\n\r\n /**\r\n * Sets \"result\" from the given index element of the given array\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#80\r\n * @param array defines the data source\r\n * @param offset defines the offset in the data source\r\n * @param result defines the target vector\r\n * @returns result input\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number, result: T): T {\r\n result.x = array[offset];\r\n result.y = array[offset + 1];\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the given floats.\r\n * @param x defines the x coordinate of the source\r\n * @param y defines the y coordinate of the source\r\n * @param result defines the Vector2 where to store the result\r\n * @returns the result vector\r\n */\r\n public static FromFloatsToRef(x: number, y: number, result: T): T {\r\n result.copyFromFloats(x, y);\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 located for \"amount\" (float) on the CatmullRom spline defined by the given four Vector2\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#65\r\n * @param value1 defines 1st point of control\r\n * @param value2 defines 2nd point of control\r\n * @param value3 defines 3rd point of control\r\n * @param value4 defines 4th point of control\r\n * @param amount defines the interpolation factor\r\n * @returns a new Vector2\r\n */\r\n public static CatmullRom(\r\n value1: DeepImmutable,\r\n value2: DeepImmutable,\r\n value3: DeepImmutable,\r\n value4: DeepImmutable,\r\n amount: number\r\n ): T {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n\r\n const x =\r\n 0.5 *\r\n (2.0 * value2.x +\r\n (-value1.x + value3.x) * amount +\r\n (2.0 * value1.x - 5.0 * value2.x + 4.0 * value3.x - value4.x) * squared +\r\n (-value1.x + 3.0 * value2.x - 3.0 * value3.x + value4.x) * cubed);\r\n\r\n const y =\r\n 0.5 *\r\n (2.0 * value2.y +\r\n (-value1.y + value3.y) * amount +\r\n (2.0 * value1.y - 5.0 * value2.y + 4.0 * value3.y - value4.y) * squared +\r\n (-value1.y + 3.0 * value2.y - 3.0 * value3.y + value4.y) * cubed);\r\n\r\n return new (value1.constructor as Constructor)(x, y);\r\n }\r\n\r\n /**\r\n * Sets reference with same the coordinates than \"value\" ones if the vector \"value\" is in the square defined by \"min\" and \"max\".\r\n * If a coordinate of \"value\" is lower than \"min\" coordinates, the returned Vector2 is given this \"min\" coordinate.\r\n * If a coordinate of \"value\" is greater than \"max\" coordinates, the returned Vector2 is given this \"max\" coordinate\r\n * @param value defines the value to clamp\r\n * @param min defines the lower limit\r\n * @param max defines the upper limit\r\n * @param ref the reference\r\n * @returns the reference\r\n */\r\n public static ClampToRef(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable, ref: T): T {\r\n ref.x = Clamp(value.x, min.x, max.x);\r\n ref.y = Clamp(value.y, min.y, max.y);\r\n return ref;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 set with same the coordinates than \"value\" ones if the vector \"value\" is in the square defined by \"min\" and \"max\".\r\n * If a coordinate of \"value\" is lower than \"min\" coordinates, the returned Vector2 is given this \"min\" coordinate.\r\n * If a coordinate of \"value\" is greater than \"max\" coordinates, the returned Vector2 is given this \"max\" coordinate\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#76\r\n * @param value defines the value to clamp\r\n * @param min defines the lower limit\r\n * @param max defines the upper limit\r\n * @returns a new Vector2\r\n */\r\n public static Clamp(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable): T {\r\n const x = Clamp(value.x, min.x, max.x);\r\n const y = Clamp(value.y, min.y, max.y);\r\n return new (value.constructor as Constructor)(x, y);\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 located for \"amount\" (float) on the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\"\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#81\r\n * @param value1 defines the 1st control point\r\n * @param tangent1 defines the outgoing tangent\r\n * @param value2 defines the 2nd control point\r\n * @param tangent2 defines the incoming tangent\r\n * @param amount defines the interpolation factor\r\n * @returns a new Vector2\r\n */\r\n public static Hermite(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n amount: number\r\n ): T {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n const part1 = 2.0 * cubed - 3.0 * squared + 1.0;\r\n const part2 = -2.0 * cubed + 3.0 * squared;\r\n const part3 = cubed - 2.0 * squared + amount;\r\n const part4 = cubed - squared;\r\n\r\n const x = value1.x * part1 + value2.x * part2 + tangent1.x * part3 + tangent2.x * part4;\r\n const y = value1.y * part1 + value2.y * part2 + tangent1.y * part3 + tangent2.y * part4;\r\n\r\n return new (value1.constructor as Constructor)(x, y);\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 which is the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#82\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @returns 1st derivative\r\n */\r\n public static Hermite1stDerivative(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number\r\n ): T {\r\n const result = new (value1.constructor as Constructor)();\r\n\r\n this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 which is the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#83\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @param result define where the derivative will be stored\r\n * @returns result input\r\n */\r\n public static Hermite1stDerivativeToRef(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number,\r\n result: T\r\n ): T {\r\n const t2 = time * time;\r\n\r\n result.x = (t2 - time) * 6 * value1.x + (3 * t2 - 4 * time + 1) * tangent1.x + (-t2 + time) * 6 * value2.x + (3 * t2 - 2 * time) * tangent2.x;\r\n result.y = (t2 - time) * 6 * value1.y + (3 * t2 - 4 * time + 1) * tangent1.y + (-t2 + time) * 6 * value2.y + (3 * t2 - 2 * time) * tangent2.y;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 located for \"amount\" (float) on the linear interpolation between the vector \"start\" adn the vector \"end\".\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#84\r\n * @param start defines the start vector\r\n * @param end defines the end vector\r\n * @param amount defines the interpolation factor\r\n * @returns a new Vector2\r\n */\r\n public static Lerp(start: DeepImmutable, end: DeepImmutable, amount: number): Vector2 {\r\n const x = start.x + (end.x - start.x) * amount;\r\n const y = start.y + (end.y - start.y) * amount;\r\n return new (start.constructor as Constructor)(x, y);\r\n }\r\n\r\n /**\r\n * Gets the dot product of the vector \"left\" and the vector \"right\"\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#90\r\n * @param left defines first vector\r\n * @param right defines second vector\r\n * @returns the dot product (float)\r\n */\r\n public static Dot(left: DeepImmutable, right: DeepImmutable): number {\r\n return left.x * right.x + left.y * right.y;\r\n }\r\n\r\n /**\r\n * Returns a new Vector2 equal to the normalized given vector\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#46\r\n * @param vector defines the vector to normalize\r\n * @returns a new Vector2\r\n */\r\n public static Normalize(vector: DeepImmutable): T {\r\n const result = new (vector.constructor as Constructor)();\r\n Vector2.NormalizeToRef(vector, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Normalize a given vector into a second one\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#50\r\n * @param vector defines the vector to normalize\r\n * @param result defines the vector where to store the result\r\n * @returns result input\r\n */\r\n public static NormalizeToRef(vector: DeepImmutable, result: T): T {\r\n vector.normalizeToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 set with the minimal coordinate values from the \"left\" and \"right\" vectors\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#86\r\n * @param left defines 1st vector\r\n * @param right defines 2nd vector\r\n * @returns a new Vector2\r\n */\r\n public static Minimize(left: DeepImmutable, right: DeepImmutable): T {\r\n const x = left.x < right.x ? left.x : right.x;\r\n const y = left.y < right.y ? left.y : right.y;\r\n return new (left.constructor as Constructor)(x, y);\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 set with the maximal coordinate values from the \"left\" and \"right\" vectors\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#86\r\n * @param left defines 1st vector\r\n * @param right defines 2nd vector\r\n * @returns a new Vector2\r\n */\r\n public static Maximize(left: DeepImmutable, right: DeepImmutable): T {\r\n const x = left.x > right.x ? left.x : right.x;\r\n const y = left.y > right.y ? left.y : right.y;\r\n return new (left.constructor as Constructor)(x, y);\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 set with the transformed coordinates of the given vector by the given transformation matrix\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#17\r\n * @param vector defines the vector to transform\r\n * @param transformation defines the matrix to apply\r\n * @returns a new Vector2\r\n */\r\n public static Transform(vector: DeepImmutable, transformation: DeepImmutable): T {\r\n const result = new (vector.constructor as Constructor)();\r\n Vector2.TransformToRef(vector, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Transforms the given vector coordinates by the given transformation matrix and stores the result in the vector \"result\" coordinates\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#19\r\n * @param vector defines the vector to transform\r\n * @param transformation defines the matrix to apply\r\n * @param result defines the target vector\r\n * @returns result input\r\n */\r\n public static TransformToRef(vector: DeepImmutable, transformation: DeepImmutable, result: T): T {\r\n const m = transformation.m;\r\n const x = vector.x * m[0] + vector.y * m[4] + m[12];\r\n const y = vector.x * m[1] + vector.y * m[5] + m[13];\r\n result.x = x;\r\n result.y = y;\r\n return result;\r\n }\r\n\r\n /**\r\n * Determines if a given vector is included in a triangle\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#87\r\n * @param p defines the vector to test\r\n * @param p0 defines 1st triangle point\r\n * @param p1 defines 2nd triangle point\r\n * @param p2 defines 3rd triangle point\r\n * @returns true if the point \"p\" is in the triangle defined by the vectors \"p0\", \"p1\", \"p2\"\r\n */\r\n public static PointInTriangle(p: DeepImmutable, p0: DeepImmutable, p1: DeepImmutable, p2: DeepImmutable): boolean {\r\n const a = (1 / 2) * (-p1.y * p2.x + p0.y * (-p1.x + p2.x) + p0.x * (p1.y - p2.y) + p1.x * p2.y);\r\n const sign = a < 0 ? -1 : 1;\r\n const s = (p0.y * p2.x - p0.x * p2.y + (p2.y - p0.y) * p.x + (p0.x - p2.x) * p.y) * sign;\r\n const t = (p0.x * p1.y - p0.y * p1.x + (p0.y - p1.y) * p.x + (p1.x - p0.x) * p.y) * sign;\r\n\r\n return s > 0 && t > 0 && s + t < 2 * a * sign;\r\n }\r\n\r\n /**\r\n * Gets the distance between the vectors \"value1\" and \"value2\"\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#71\r\n * @param value1 defines first vector\r\n * @param value2 defines second vector\r\n * @returns the distance between vectors\r\n */\r\n public static Distance(value1: DeepImmutable, value2: DeepImmutable): number {\r\n return Math.sqrt(Vector2.DistanceSquared(value1, value2));\r\n }\r\n\r\n /**\r\n * Returns the squared distance between the vectors \"value1\" and \"value2\"\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#72\r\n * @param value1 defines first vector\r\n * @param value2 defines second vector\r\n * @returns the squared distance between vectors\r\n */\r\n public static DistanceSquared(value1: DeepImmutable, value2: DeepImmutable): number {\r\n const x = value1.x - value2.x;\r\n const y = value1.y - value2.y;\r\n return x * x + y * y;\r\n }\r\n\r\n /**\r\n * Gets a new Vector2 located at the center of the vectors \"value1\" and \"value2\"\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#86\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#66\r\n * @param value1 defines first vector\r\n * @param value2 defines second vector\r\n * @returns a new Vector2\r\n */\r\n public static Center(value1: DeepImmutable, value2: DeepImmutable): T {\r\n const result = new (value1.constructor as Constructor)();\r\n return Vector2.CenterToRef(value1, value2, result);\r\n }\r\n\r\n /**\r\n * Gets the center of the vectors \"value1\" and \"value2\" and stores the result in the vector \"ref\"\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#66\r\n * @param value1 defines first vector\r\n * @param value2 defines second vector\r\n * @param ref defines third vector\r\n * @returns ref\r\n */\r\n public static CenterToRef(value1: DeepImmutable, value2: DeepImmutable, ref: T): T {\r\n return ref.copyFromFloats((value1.x + value2.x) / 2, (value1.y + value2.y) / 2);\r\n }\r\n\r\n /**\r\n * Gets the shortest distance (float) between the point \"p\" and the segment defined by the two points \"segA\" and \"segB\".\r\n * Example Playground https://playground.babylonjs.com/#QYBWV4#77\r\n * @param p defines the middle point\r\n * @param segA defines one point of the segment\r\n * @param segB defines the other point of the segment\r\n * @returns the shortest distance\r\n */\r\n public static DistanceOfPointFromSegment(p: DeepImmutable, segA: DeepImmutable, segB: DeepImmutable): number {\r\n const l2 = Vector2.DistanceSquared(segA, segB);\r\n if (l2 === 0.0) {\r\n return Vector2.Distance(p, segA);\r\n }\r\n const v = segB.subtract(segA);\r\n const t = Math.max(0, Math.min(1, Vector2.Dot(p.subtract(segA), v) / l2));\r\n const proj = segA.add(v.multiplyByFloats(t, t));\r\n return Vector2.Distance(p, proj);\r\n }\r\n}\r\nVector2 satisfies TensorStatic;\r\nObject.defineProperties(Vector2.prototype, {\r\n dimension: { value: [2] },\r\n rank: { value: 1 },\r\n});\r\n\r\n/**\r\n * Class used to store (x,y,z) vector representation\r\n * A Vector3 is the main object used in 3D geometry\r\n * It can represent either the coordinates of a point the space, either a direction\r\n * Reminder: js uses a left handed forward facing system\r\n * Example Playground - Overview - https://playground.babylonjs.com/#R1F8YU\r\n */\r\nexport class Vector3 implements Vector>, IVector3Like {\r\n private static _UpReadOnly = Vector3.Up() as DeepImmutable;\r\n private static _DownReadOnly = Vector3.Down() as DeepImmutable;\r\n private static _LeftHandedForwardReadOnly = Vector3.Forward(false) as DeepImmutable;\r\n private static _RightHandedForwardReadOnly = Vector3.Forward(true) as DeepImmutable;\r\n private static _LeftHandedBackwardReadOnly = Vector3.Backward(false) as DeepImmutable;\r\n private static _RightHandedBackwardReadOnly = Vector3.Backward(true) as DeepImmutable;\r\n private static _RightReadOnly = Vector3.Right() as DeepImmutable;\r\n private static _LeftReadOnly = Vector3.Left() as DeepImmutable;\r\n private static _ZeroReadOnly = Vector3.Zero() as DeepImmutable;\r\n private static _OneReadOnly = Vector3.One() as DeepImmutable;\r\n\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: Readonly<[3]>;\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 1;\r\n\r\n /** @internal */\r\n public _x: number;\r\n\r\n /** @internal */\r\n public _y: number;\r\n\r\n /** @internal */\r\n public _z: number;\r\n\r\n /** @internal */\r\n public _isDirty = true;\r\n\r\n /** Gets or sets the x coordinate */\r\n public get x() {\r\n return this._x;\r\n }\r\n\r\n public set x(value: number) {\r\n this._x = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /** Gets or sets the y coordinate */\r\n public get y() {\r\n return this._y;\r\n }\r\n\r\n public set y(value: number) {\r\n this._y = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /** Gets or sets the z coordinate */\r\n public get z() {\r\n return this._z;\r\n }\r\n\r\n public set z(value: number) {\r\n this._z = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Creates a new Vector3 object from the given x, y, z (floats) coordinates.\r\n * @param x defines the first coordinates (on X axis)\r\n * @param y defines the second coordinates (on Y axis)\r\n * @param z defines the third coordinates (on Z axis)\r\n */\r\n constructor(x: number = 0, y: number = 0, z: number = 0) {\r\n this._x = x;\r\n this._y = y;\r\n this._z = z;\r\n }\r\n\r\n /**\r\n * Creates a string representation of the Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#67\r\n * @returns a string with the Vector3 coordinates.\r\n */\r\n public toString(): string {\r\n return `{X: ${this._x} Y: ${this._y} Z: ${this._z}}`;\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns the string \"Vector3\"\r\n */\r\n public getClassName(): string {\r\n return \"Vector3\";\r\n }\r\n\r\n /**\r\n * Creates the Vector3 hash code\r\n * @returns a number which tends to be unique between Vector3 instances\r\n */\r\n public getHashCode(): number {\r\n const x = _ExtractAsInt(this._x);\r\n const y = _ExtractAsInt(this._y);\r\n const z = _ExtractAsInt(this._z);\r\n\r\n let hash = x;\r\n hash = (hash * 397) ^ y;\r\n hash = (hash * 397) ^ z;\r\n return hash;\r\n }\r\n\r\n // Operators\r\n\r\n /**\r\n * Creates an array containing three elements : the coordinates of the Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#10\r\n * @returns a new array of numbers\r\n */\r\n public asArray(): Tuple {\r\n return [this._x, this._y, this._z];\r\n }\r\n\r\n /**\r\n * Populates the given array or Float32Array from the given index with the successive coordinates of the Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#65\r\n * @param array defines the destination array\r\n * @param index defines the offset in the destination array\r\n * @returns the current Vector3\r\n */\r\n public toArray(array: FloatArray, index: number = 0): this {\r\n array[index] = this._x;\r\n array[index + 1] = this._y;\r\n array[index + 2] = this._z;\r\n return this;\r\n }\r\n\r\n /**\r\n * Update the current vector from an array\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#24\r\n * @param array defines the destination array\r\n * @param offset defines the offset in the destination array\r\n * @returns the current Vector3\r\n */\r\n public fromArray(array: DeepImmutable, offset: number = 0): this {\r\n Vector3.FromArrayToRef(array, offset, this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Converts the current Vector3 into a quaternion (considering that the Vector3 contains Euler angles representation of a rotation)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#66\r\n * @returns a new Quaternion object, computed from the Vector3 coordinates\r\n */\r\n public toQuaternion(): Quaternion {\r\n return Quaternion.RotationYawPitchRoll(this._y, this._x, this._z);\r\n }\r\n\r\n /**\r\n * Adds the given vector to the current Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#4\r\n * @param otherVector defines the second operand\r\n * @returns the current updated Vector3\r\n */\r\n public addInPlace(otherVector: DeepImmutable): this {\r\n this._x += otherVector._x;\r\n this._y += otherVector._y;\r\n this._z += otherVector._z;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the given coordinates to the current Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#5\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the current updated Vector3\r\n */\r\n public addInPlaceFromFloats(x: number, y: number, z: number): this {\r\n this._x += x;\r\n this._y += y;\r\n this._z += z;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets a new Vector3, result of the addition the current Vector3 and the given vector\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#3\r\n * @param otherVector defines the second operand\r\n * @returns the resulting Vector3\r\n */\r\n public add(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this._x + otherVector._x, this._y + otherVector._y, this._z + otherVector._z);\r\n }\r\n\r\n /**\r\n * Adds the current Vector3 to the given one and stores the result in the vector \"result\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#6\r\n * @param otherVector defines the second operand\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public addToRef(otherVector: DeepImmutable, result: T): T {\r\n return result.copyFromFloats(this._x + otherVector._x, this._y + otherVector._y, this._z + otherVector._z);\r\n }\r\n\r\n /**\r\n * Subtract the given vector from the current Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#61\r\n * @param otherVector defines the second operand\r\n * @returns the current updated Vector3\r\n */\r\n public subtractInPlace(otherVector: DeepImmutable): this {\r\n this._x -= otherVector._x;\r\n this._y -= otherVector._y;\r\n this._z -= otherVector._z;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3, result of the subtraction of the given vector from the current Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#60\r\n * @param otherVector defines the second operand\r\n * @returns the resulting Vector3\r\n */\r\n public subtract(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this._x - otherVector._x, this._y - otherVector._y, this._z - otherVector._z);\r\n }\r\n\r\n /**\r\n * Subtracts the given vector from the current Vector3 and stores the result in the vector \"result\".\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#63\r\n * @param otherVector defines the second operand\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public subtractToRef(otherVector: DeepImmutable, result: T): T {\r\n return this.subtractFromFloatsToRef(otherVector._x, otherVector._y, otherVector._z, result);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the subtraction of the given floats from the current Vector3 coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#62\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the resulting Vector3\r\n */\r\n public subtractFromFloats(x: number, y: number, z: number): this {\r\n return new (this.constructor as Constructor)(this._x - x, this._y - y, this._z - z);\r\n }\r\n\r\n /**\r\n * Subtracts the given floats from the current Vector3 coordinates and set the given vector \"result\" with this result\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#64\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public subtractFromFloatsToRef(x: number, y: number, z: number, result: T): T {\r\n return result.copyFromFloats(this._x - x, this._y - y, this._z - z);\r\n }\r\n\r\n /**\r\n * Gets a new Vector3 set with the current Vector3 negated coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#35\r\n * @returns a new Vector3\r\n */\r\n public negate(): this {\r\n return new (this.constructor as Constructor)(-this._x, -this._y, -this._z);\r\n }\r\n\r\n /**\r\n * Negate this vector in place\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#36\r\n * @returns this\r\n */\r\n public negateInPlace(): this {\r\n this._x *= -1;\r\n this._y *= -1;\r\n this._z *= -1;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Negate the current Vector3 and stores the result in the given vector \"result\" coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#37\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public negateToRef(result: T): T {\r\n return result.copyFromFloats(this._x * -1, this._y * -1, this._z * -1);\r\n }\r\n\r\n /**\r\n * Multiplies the Vector3 coordinates by the float \"scale\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#56\r\n * @param scale defines the multiplier factor\r\n * @returns the current updated Vector3\r\n */\r\n public scaleInPlace(scale: number): this {\r\n this._x *= scale;\r\n this._y *= scale;\r\n this._z *= scale;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the current Vector3 coordinates multiplied by the float \"scale\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#53\r\n * @param scale defines the multiplier factor\r\n * @returns a new Vector3\r\n */\r\n public scale(scale: number): this {\r\n return new (this.constructor as Constructor)(this._x * scale, this._y * scale, this._z * scale);\r\n }\r\n\r\n /**\r\n * Multiplies the current Vector3 coordinates by the float \"scale\" and stores the result in the given vector \"result\" coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#57\r\n * @param scale defines the multiplier factor\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n return result.copyFromFloats(this._x * scale, this._y * scale, this._z * scale);\r\n }\r\n\r\n /**\r\n * Creates a vector normal (perpendicular) to the current Vector3 and stores the result in the given vector\r\n * Out of the infinite possibilities the normal chosen is the one formed by rotating the current vector\r\n * 90 degrees about an axis which lies perpendicular to the current vector\r\n * and its projection on the xz plane. In the case of a current vector in the xz plane\r\n * the normal is calculated to be along the y axis.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#230\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#231\r\n * @param result defines the Vector3 object where to store the resultant normal\r\n * @returns the result\r\n */\r\n public getNormalToRef(result: Vector3): Vector3 {\r\n /**\r\n * Calculates the spherical coordinates of the current vector\r\n * so saves on memory rather than importing whole Spherical Class\r\n */\r\n const radius: number = this.length();\r\n let theta: number = Math.acos(this.y / radius);\r\n const phi = Math.atan2(this.z, this.x);\r\n //makes angle 90 degs to current vector\r\n if (theta > Math.PI / 2) {\r\n theta -= Math.PI / 2;\r\n } else {\r\n theta += Math.PI / 2;\r\n }\r\n //Calculates resutant normal vector from spherical coordinate of perpendicular vector\r\n const x = radius * Math.sin(theta) * Math.cos(phi);\r\n const y = radius * Math.cos(theta);\r\n const z = radius * Math.sin(theta) * Math.sin(phi);\r\n result.set(x, y, z);\r\n return result;\r\n }\r\n\r\n /**\r\n * Rotates the vector using the given unit quaternion and stores the new vector in result\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#9\r\n * @param q the unit quaternion representing the rotation\r\n * @param result the output vector\r\n * @returns the result\r\n */\r\n public applyRotationQuaternionToRef(q: Quaternion, result: T): T {\r\n // Derived from https://raw.org/proof/vector-rotation-using-quaternions/\r\n\r\n const vx = this._x,\r\n vy = this._y,\r\n vz = this._z;\r\n const qx = q._x,\r\n qy = q._y,\r\n qz = q._z,\r\n qw = q._w;\r\n\r\n // t = 2q x v\r\n const tx = 2 * (qy * vz - qz * vy);\r\n const ty = 2 * (qz * vx - qx * vz);\r\n const tz = 2 * (qx * vy - qy * vx);\r\n\r\n // v + w t + q x t\r\n result._x = vx + qw * tx + qy * tz - qz * ty;\r\n result._y = vy + qw * ty + qz * tx - qx * tz;\r\n result._z = vz + qw * tz + qx * ty - qy * tx;\r\n\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Rotates the vector in place using the given unit quaternion\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#8\r\n * @param q the unit quaternion representing the rotation\r\n * @returns the current updated Vector3\r\n */\r\n public applyRotationQuaternionInPlace(q: Quaternion): this {\r\n return this.applyRotationQuaternionToRef(q, this);\r\n }\r\n\r\n /**\r\n * Rotates the vector using the given unit quaternion and returns the new vector\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#7\r\n * @param q the unit quaternion representing the rotation\r\n * @returns a new Vector3\r\n */\r\n public applyRotationQuaternion(q: Quaternion): this {\r\n return this.applyRotationQuaternionToRef(q, new (this.constructor as Constructor)());\r\n }\r\n\r\n /**\r\n * Scale the current Vector3 values by a factor and add the result to a given Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#55\r\n * @param scale defines the scale factor\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns result input\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n return result.addInPlaceFromFloats(this._x * scale, this._y * scale, this._z * scale);\r\n }\r\n\r\n /**\r\n * Projects the current point Vector3 to a plane along a ray starting from a specified origin and passing through the current point Vector3.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#48\r\n * @param plane defines the plane to project to\r\n * @param origin defines the origin of the projection ray\r\n * @returns the projected vector3\r\n */\r\n public projectOnPlane(plane: Plane, origin: Vector3): T {\r\n const result = new (this.constructor as Constructor)();\r\n this.projectOnPlaneToRef(plane, origin, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Projects the current point Vector3 to a plane along a ray starting from a specified origin and passing through the current point Vector3.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#49\r\n * @param plane defines the plane to project to\r\n * @param origin defines the origin of the projection ray\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public projectOnPlaneToRef(plane: Plane, origin: Vector3, result: T): T {\r\n const n = plane.normal;\r\n const d = plane.d;\r\n\r\n const V = MathTmp.Vector3[0];\r\n\r\n // ray direction\r\n this.subtractToRef(origin, V);\r\n\r\n V.normalize();\r\n\r\n const denom = Vector3.Dot(V, n);\r\n\r\n //When the ray is close to parallel to the plane return infinity vector\r\n if (Math.abs(denom) < 0.0000000001) {\r\n result.setAll(Infinity);\r\n } else {\r\n const t = -(Vector3.Dot(origin, n) + d) / denom;\r\n\r\n // P = P0 + t*V\r\n const scaledV = V.scaleInPlace(t);\r\n origin.addToRef(scaledV, result);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns true if the current Vector3 and the given vector coordinates are strictly equal\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#19\r\n * @param otherVector defines the second operand\r\n * @returns true if both vectors are equals\r\n */\r\n public equals(otherVector: DeepImmutable): boolean {\r\n return otherVector && this._x === otherVector._x && this._y === otherVector._y && this._z === otherVector._z;\r\n }\r\n\r\n /**\r\n * Returns true if the current Vector3 and the given vector coordinates are distant less than epsilon\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#21\r\n * @param otherVector defines the second operand\r\n * @param epsilon defines the minimal distance to define values as equals\r\n * @returns true if both vectors are distant less than epsilon\r\n */\r\n public equalsWithEpsilon(otherVector: DeepImmutable, epsilon: number = Epsilon): boolean {\r\n return otherVector && WithinEpsilon(this._x, otherVector._x, epsilon) && WithinEpsilon(this._y, otherVector._y, epsilon) && WithinEpsilon(this._z, otherVector._z, epsilon);\r\n }\r\n\r\n /**\r\n * Returns true if the current Vector3 coordinates equals the given floats\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#20\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns true if both vectors are equal\r\n */\r\n public equalsToFloats(x: number, y: number, z: number): boolean {\r\n return this._x === x && this._y === y && this._z === z;\r\n }\r\n\r\n /**\r\n * Multiplies the current Vector3 coordinates by the given ones\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#32\r\n * @param otherVector defines the second operand\r\n * @returns the current updated Vector3\r\n */\r\n public multiplyInPlace(otherVector: DeepImmutable): this {\r\n this._x *= otherVector._x;\r\n this._y *= otherVector._y;\r\n this._z *= otherVector._z;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3, result of the multiplication of the current Vector3 by the given vector\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#31\r\n * @param otherVector defines the second operand\r\n * @returns the new Vector3\r\n */\r\n public multiply(otherVector: DeepImmutable): this {\r\n return this.multiplyByFloats(otherVector._x, otherVector._y, otherVector._z);\r\n }\r\n\r\n /**\r\n * Multiplies the current Vector3 by the given one and stores the result in the given vector \"result\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#33\r\n * @param otherVector defines the second operand\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public multiplyToRef(otherVector: DeepImmutable, result: T): T {\r\n return result.copyFromFloats(this._x * otherVector._x, this._y * otherVector._y, this._z * otherVector._z);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the result of the multiplication of the current Vector3 coordinates by the given floats\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#34\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the new Vector3\r\n */\r\n public multiplyByFloats(x: number, y: number, z: number): this {\r\n return new (this.constructor as Constructor)(this._x * x, this._y * y, this._z * z);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the result of the division of the current Vector3 coordinates by the given ones\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#16\r\n * @param otherVector defines the second operand\r\n * @returns the new Vector3\r\n */\r\n public divide(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this._x / otherVector._x, this._y / otherVector._y, this._z / otherVector._z);\r\n }\r\n\r\n /**\r\n * Divides the current Vector3 coordinates by the given ones and stores the result in the given vector \"result\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#18\r\n * @param otherVector defines the second operand\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public divideToRef(otherVector: DeepImmutable, result: T): T {\r\n return result.copyFromFloats(this._x / otherVector._x, this._y / otherVector._y, this._z / otherVector._z);\r\n }\r\n\r\n /**\r\n * Divides the current Vector3 coordinates by the given ones.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#17\r\n * @param otherVector defines the second operand\r\n * @returns the current updated Vector3\r\n */\r\n public divideInPlace(otherVector: DeepImmutable): this {\r\n this._x = this._x / otherVector._x;\r\n this._y = this._y / otherVector._y;\r\n this._z = this._z / otherVector._z;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Vector3 with the minimal coordinate values between its and the given vector ones\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#29\r\n * @param other defines the second operand\r\n * @returns the current updated Vector3\r\n */\r\n public minimizeInPlace(other: DeepImmutable): this {\r\n return this.minimizeInPlaceFromFloats(other._x, other._y, other._z);\r\n }\r\n\r\n /**\r\n * Updates the current Vector3 with the maximal coordinate values between its and the given vector ones.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#27\r\n * @param other defines the second operand\r\n * @returns the current updated Vector3\r\n */\r\n public maximizeInPlace(other: DeepImmutable): this {\r\n return this.maximizeInPlaceFromFloats(other._x, other._y, other._z);\r\n }\r\n\r\n /**\r\n * Updates the current Vector3 with the minimal coordinate values between its and the given coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#30\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the current updated Vector3\r\n */\r\n public minimizeInPlaceFromFloats(x: number, y: number, z: number): this {\r\n if (x < this._x) {\r\n this.x = x;\r\n }\r\n if (y < this._y) {\r\n this.y = y;\r\n }\r\n if (z < this._z) {\r\n this.z = z;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Vector3 with the maximal coordinate values between its and the given coordinates.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#28\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the current updated Vector3\r\n */\r\n public maximizeInPlaceFromFloats(x: number, y: number, z: number): this {\r\n if (x > this._x) {\r\n this.x = x;\r\n }\r\n if (y > this._y) {\r\n this.y = y;\r\n }\r\n if (z > this._z) {\r\n this.z = z;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Due to float precision, scale of a mesh could be uniform but float values are off by a small fraction\r\n * Check if is non uniform within a certain amount of decimal places to account for this\r\n * @param epsilon the amount the values can differ\r\n * @returns if the vector is non uniform to a certain number of decimal places\r\n */\r\n public isNonUniformWithinEpsilon(epsilon: number) {\r\n const absX = Math.abs(this._x);\r\n const absY = Math.abs(this._y);\r\n if (!WithinEpsilon(absX, absY, epsilon)) {\r\n return true;\r\n }\r\n\r\n const absZ = Math.abs(this._z);\r\n if (!WithinEpsilon(absX, absZ, epsilon)) {\r\n return true;\r\n }\r\n\r\n if (!WithinEpsilon(absY, absZ, epsilon)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the vector is non uniform meaning x, y or z are not all the same\r\n */\r\n public get isNonUniform(): boolean {\r\n const absX = Math.abs(this._x);\r\n const absY = Math.abs(this._y);\r\n if (absX !== absY) {\r\n return true;\r\n }\r\n\r\n const absZ = Math.abs(this._z);\r\n if (absX !== absZ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets the current Vector3's floored values and stores them in result\r\n * @param result the vector to store the result in\r\n * @returns the result vector\r\n */\r\n public floorToRef(result: T): T {\r\n result._x = Math.floor(this._x);\r\n result._y = Math.floor(this._y);\r\n result._z = Math.floor(this._z);\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector3 from current Vector3 floored values\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#22\r\n * @returns a new Vector3\r\n */\r\n public floor(): this {\r\n return new (this.constructor as Constructor)(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z));\r\n }\r\n\r\n /**\r\n * Gets the current Vector3's fractional values and stores them in result\r\n * @param result the vector to store the result in\r\n * @returns the result vector\r\n */\r\n public fractToRef(result: T): T {\r\n result._x = this.x - Math.floor(this._x);\r\n result._y = this.y - Math.floor(this._y);\r\n result._z = this.z - Math.floor(this._z);\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector3 from current Vector3 fractional values\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#23\r\n * @returns a new Vector3\r\n */\r\n public fract(): this {\r\n return new (this.constructor as Constructor)(this.x - Math.floor(this._x), this.y - Math.floor(this._y), this.z - Math.floor(this._z));\r\n }\r\n\r\n // Properties\r\n /**\r\n * Gets the length of the Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#25\r\n * @returns the length of the Vector3\r\n */\r\n public length(): number {\r\n return Math.sqrt(this.lengthSquared());\r\n }\r\n\r\n /**\r\n * Gets the squared length of the Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#26\r\n * @returns squared length of the Vector3\r\n */\r\n public lengthSquared(): number {\r\n return this._x * this._x + this._y * this._y + this._z * this._z;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the vector contains a zero in one of its components\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#1\r\n */\r\n public get hasAZeroComponent(): boolean {\r\n return this._x * this._y * this._z === 0;\r\n }\r\n\r\n /**\r\n * Normalize the current Vector3.\r\n * Please note that this is an in place operation.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#122\r\n * @returns the current updated Vector3\r\n */\r\n public normalize(): this {\r\n return this.normalizeFromLength(this.length());\r\n }\r\n\r\n /**\r\n * Reorders the x y z properties of the vector in place\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#44\r\n * @param order new ordering of the properties (eg. for vector 1,2,3 with \"ZYX\" will produce 3,2,1)\r\n * @returns the current updated vector\r\n */\r\n public reorderInPlace(order: string) {\r\n order = order.toLowerCase();\r\n if (order === \"xyz\") {\r\n return this;\r\n }\r\n const tem = MathTmp.Vector3[0].copyFrom(this);\r\n this.x = (tem)[order[0]];\r\n this.y = (tem)[order[1]];\r\n this.z = (tem)[order[2]];\r\n return this;\r\n }\r\n\r\n /**\r\n * Rotates the vector around 0,0,0 by a quaternion\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#47\r\n * @param quaternion the rotation quaternion\r\n * @param result vector to store the result\r\n * @returns the resulting vector\r\n */\r\n public rotateByQuaternionToRef(quaternion: Quaternion, result: T): T {\r\n quaternion.toRotationMatrix(MathTmp.Matrix[0]);\r\n Vector3.TransformCoordinatesToRef(this, MathTmp.Matrix[0], result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Rotates a vector around a given point\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#46\r\n * @param quaternion the rotation quaternion\r\n * @param point the point to rotate around\r\n * @param result vector to store the result\r\n * @returns the resulting vector\r\n */\r\n public rotateByQuaternionAroundPointToRef(quaternion: Quaternion, point: Vector3, result: T): T {\r\n this.subtractToRef(point, MathTmp.Vector3[0]);\r\n MathTmp.Vector3[0].rotateByQuaternionToRef(quaternion, MathTmp.Vector3[0]);\r\n point.addToRef(MathTmp.Vector3[0], result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 as the cross product of the current vector and the \"other\" one\r\n * The cross product is then orthogonal to both current and \"other\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#14\r\n * @param other defines the right operand\r\n * @returns the cross product\r\n */\r\n public cross(other: Vector3): this {\r\n const result = new (this.constructor as Constructor)();\r\n return Vector3.CrossToRef(this, other, result);\r\n }\r\n\r\n /**\r\n * Normalize the current Vector3 with the given input length.\r\n * Please note that this is an in place operation.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#123\r\n * @param len the length of the vector\r\n * @returns the current updated Vector3\r\n */\r\n public normalizeFromLength(len: number): this {\r\n if (len === 0 || len === 1.0) {\r\n return this;\r\n }\r\n\r\n return this.scaleInPlace(1.0 / len);\r\n }\r\n\r\n /**\r\n * Normalize the current Vector3 to a new vector\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#124\r\n * @returns the new Vector3\r\n */\r\n public normalizeToNew(): this {\r\n const normalized = new (this.constructor as Constructor)(0, 0, 0);\r\n this.normalizeToRef(normalized);\r\n return normalized;\r\n }\r\n\r\n /**\r\n * Normalize the current Vector3 to the reference\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#125\r\n * @param reference define the Vector3 to update\r\n * @returns the updated Vector3\r\n */\r\n public normalizeToRef(reference: T): T {\r\n const len = this.length();\r\n if (len === 0 || len === 1.0) {\r\n return reference.copyFrom(this);\r\n }\r\n\r\n return this.scaleToRef(1.0 / len, reference);\r\n }\r\n\r\n /**\r\n * Creates a new Vector3 copied from the current Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#11\r\n * @returns the new Vector3\r\n */\r\n public clone(): this {\r\n return new (this.constructor as Constructor)(this._x, this._y, this._z);\r\n }\r\n\r\n /**\r\n * Copies the given vector coordinates to the current Vector3 ones\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#12\r\n * @param source defines the source Vector3\r\n * @returns the current updated Vector3\r\n */\r\n public copyFrom(source: DeepImmutable): this {\r\n return this.copyFromFloats(source._x, source._y, source._z);\r\n }\r\n\r\n /**\r\n * Copies the given floats to the current Vector3 coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#13\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the current updated Vector3\r\n */\r\n public copyFromFloats(x: number, y: number, z: number): this {\r\n this._x = x;\r\n this._y = y;\r\n this._z = z;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Copies the given floats to the current Vector3 coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#58\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @returns the current updated Vector3\r\n */\r\n public set(x: number, y: number, z: number): this {\r\n return this.copyFromFloats(x, y, z);\r\n }\r\n\r\n /**\r\n * Copies the given float to the current Vector3 coordinates\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#59\r\n * @param v defines the x, y and z coordinates of the operand\r\n * @returns the current updated Vector3\r\n */\r\n public setAll(v: number): this {\r\n this._x = this._y = this._z = v;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Get the clip factor between two vectors\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#126\r\n * @param vector0 defines the first operand\r\n * @param vector1 defines the second operand\r\n * @param axis defines the axis to use\r\n * @param size defines the size along the axis\r\n * @returns the clip factor\r\n */\r\n public static GetClipFactor(vector0: DeepImmutable, vector1: DeepImmutable, axis: DeepImmutable, size: number): number {\r\n const d0 = Vector3.Dot(vector0, axis);\r\n const d1 = Vector3.Dot(vector1, axis);\r\n\r\n return (d0 - size) / (d0 - d1);\r\n }\r\n\r\n /**\r\n * Get angle between two vectors\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#86\r\n * @param vector0 the starting point\r\n * @param vector1 the ending point\r\n * @param normal direction of the normal\r\n * @returns the angle between vector0 and vector1\r\n */\r\n public static GetAngleBetweenVectors(vector0: DeepImmutable, vector1: DeepImmutable, normal: DeepImmutable): number {\r\n const v0: Vector3 = vector0.normalizeToRef(MathTmp.Vector3[1]);\r\n const v1: Vector3 = vector1.normalizeToRef(MathTmp.Vector3[2]);\r\n let dot: number = Vector3.Dot(v0, v1);\r\n // Vectors are normalized so dot will be in [-1, 1] (aside precision issues enough to break the result which explains the below clamp)\r\n dot = Clamp(dot, -1, 1);\r\n\r\n const angle = Math.acos(dot);\r\n const n = MathTmp.Vector3[3];\r\n Vector3.CrossToRef(v0, v1, n);\r\n if (Vector3.Dot(n, normal) > 0) {\r\n return isNaN(angle) ? 0 : angle;\r\n }\r\n return isNaN(angle) ? -Math.PI : -Math.acos(dot);\r\n }\r\n\r\n /**\r\n * Get angle between two vectors projected on a plane\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#87\r\n * Expectation compute time: 0.01 ms (median) and 0.02 ms (percentile 95%)\r\n * @param vector0 angle between vector0 and vector1\r\n * @param vector1 angle between vector0 and vector1\r\n * @param normal Normal of the projection plane\r\n * @returns the angle in radians (float) between vector0 and vector1 projected on the plane with the specified normal\r\n */\r\n public static GetAngleBetweenVectorsOnPlane(vector0: DeepImmutable, vector1: DeepImmutable, normal: DeepImmutable): number {\r\n MathTmp.Vector3[0].copyFrom(vector0);\r\n const v0 = MathTmp.Vector3[0];\r\n MathTmp.Vector3[1].copyFrom(vector1);\r\n const v1 = MathTmp.Vector3[1];\r\n MathTmp.Vector3[2].copyFrom(normal);\r\n const vNormal = MathTmp.Vector3[2];\r\n const right = MathTmp.Vector3[3];\r\n const forward = MathTmp.Vector3[4];\r\n\r\n v0.normalize();\r\n v1.normalize();\r\n vNormal.normalize();\r\n\r\n Vector3.CrossToRef(vNormal, v0, right);\r\n Vector3.CrossToRef(right, vNormal, forward);\r\n\r\n const angle = Math.atan2(Vector3.Dot(v1, right), Vector3.Dot(v1, forward));\r\n\r\n return NormalizeRadians(angle);\r\n }\r\n\r\n /**\r\n * Gets the rotation that aligns the roll axis (Y) to the line joining the start point to the target point and stores it in the ref Vector3\r\n * Example PG https://playground.babylonjs.com/#R1F8YU#189\r\n * @param start the starting point\r\n * @param target the target point\r\n * @param ref the vector3 to store the result\r\n * @returns ref in the form (pitch, yaw, 0)\r\n */\r\n public static PitchYawRollToMoveBetweenPointsToRef(start: Vector3, target: Vector3, ref: T): T {\r\n const diff = TmpVectors.Vector3[0];\r\n target.subtractToRef(start, diff);\r\n ref._y = Math.atan2(diff.x, diff.z) || 0;\r\n ref._x = Math.atan2(Math.sqrt(diff.x ** 2 + diff.z ** 2), diff.y) || 0;\r\n ref._z = 0;\r\n ref._isDirty = true;\r\n return ref;\r\n }\r\n\r\n /**\r\n * Gets the rotation that aligns the roll axis (Y) to the line joining the start point to the target point\r\n * Example PG https://playground.babylonjs.com/#R1F8YU#188\r\n * @param start the starting point\r\n * @param target the target point\r\n * @returns the rotation in the form (pitch, yaw, 0)\r\n */\r\n public static PitchYawRollToMoveBetweenPoints(start: Vector3, target: Vector3): Vector3 {\r\n const ref = Vector3.Zero();\r\n return Vector3.PitchYawRollToMoveBetweenPointsToRef(start, target, ref);\r\n }\r\n\r\n /**\r\n * Slerp between two vectors. See also `SmoothToRef`\r\n * Slerp is a spherical linear interpolation\r\n * giving a slow in and out effect\r\n * Example Playground 1 https://playground.babylonjs.com/#R1F8YU#108\r\n * Example Playground 2 https://playground.babylonjs.com/#R1F8YU#109\r\n * @param vector0 Start vector\r\n * @param vector1 End vector\r\n * @param slerp amount (will be clamped between 0 and 1)\r\n * @param result The slerped vector\r\n * @returns The slerped vector\r\n */\r\n public static SlerpToRef(vector0: Vector3, vector1: Vector3, slerp: number, result: T): T {\r\n slerp = Clamp(slerp, 0, 1);\r\n const vector0Dir = MathTmp.Vector3[0];\r\n const vector1Dir = MathTmp.Vector3[1];\r\n\r\n vector0Dir.copyFrom(vector0);\r\n const vector0Length = vector0Dir.length();\r\n vector0Dir.normalizeFromLength(vector0Length);\r\n\r\n vector1Dir.copyFrom(vector1);\r\n const vector1Length = vector1Dir.length();\r\n vector1Dir.normalizeFromLength(vector1Length);\r\n\r\n const dot = Vector3.Dot(vector0Dir, vector1Dir);\r\n\r\n let scale0;\r\n let scale1;\r\n\r\n if (dot < 1 - Epsilon) {\r\n const omega = Math.acos(dot);\r\n const invSin = 1 / Math.sin(omega);\r\n scale0 = Math.sin((1 - slerp) * omega) * invSin;\r\n scale1 = Math.sin(slerp * omega) * invSin;\r\n } else {\r\n // Use linear interpolation\r\n scale0 = 1 - slerp;\r\n scale1 = slerp;\r\n }\r\n\r\n vector0Dir.scaleInPlace(scale0);\r\n vector1Dir.scaleInPlace(scale1);\r\n result.copyFrom(vector0Dir).addInPlace(vector1Dir);\r\n result.scaleInPlace(Lerp(vector0Length, vector1Length, slerp));\r\n return result;\r\n }\r\n\r\n /**\r\n * Smooth interpolation between two vectors using Slerp\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#110\r\n * @param source source vector\r\n * @param goal goal vector\r\n * @param deltaTime current interpolation frame\r\n * @param lerpTime total interpolation time\r\n * @param result the smoothed vector\r\n * @returns the smoothed vector\r\n */\r\n public static SmoothToRef(source: Vector3, goal: Vector3, deltaTime: number, lerpTime: number, result: T): T {\r\n Vector3.SlerpToRef(source, goal, lerpTime === 0 ? 1 : deltaTime / lerpTime, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set from the index \"offset\" of the given array\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#83\r\n * @param array defines the source array\r\n * @param offset defines the offset in the source array\r\n * @returns the new Vector3\r\n */\r\n public static FromArray(array: DeepImmutable>, offset: number = 0): Vector3 {\r\n return new Vector3(array[offset], array[offset + 1], array[offset + 2]);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set from the index \"offset\" of the given Float32Array\r\n * @param array defines the source array\r\n * @param offset defines the offset in the source array\r\n * @returns the new Vector3\r\n * @deprecated Please use FromArray instead.\r\n */\r\n public static FromFloatArray(array: DeepImmutable, offset?: number): Vector3 {\r\n return Vector3.FromArray(array, offset);\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the element values from the index \"offset\" of the given array\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#84\r\n * @param array defines the source array\r\n * @param offset defines the offset in the source array\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number, result: T): T {\r\n result._x = array[offset];\r\n result._y = array[offset + 1];\r\n result._z = array[offset + 2];\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the element values from the index \"offset\" of the given Float32Array\r\n * @param array defines the source array\r\n * @param offset defines the offset in the source array\r\n * @param result defines the Vector3 where to store the result\r\n * @deprecated Please use FromArrayToRef instead.\r\n * @returns result input\r\n */\r\n public static FromFloatArrayToRef(array: DeepImmutable, offset: number, result: T): T {\r\n return Vector3.FromArrayToRef(array, offset, result);\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the given floats.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#85\r\n * @param x defines the x coordinate of the source\r\n * @param y defines the y coordinate of the source\r\n * @param z defines the z coordinate of the source\r\n * @param result defines the Vector3 where to store the result\r\n * @returns the result vector\r\n */\r\n public static FromFloatsToRef(x: number, y: number, z: number, result: T): T {\r\n result.copyFromFloats(x, y, z);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set to (0.0, 0.0, 0.0)\r\n * @returns a new empty Vector3\r\n */\r\n public static Zero(): Vector3 {\r\n return new Vector3(0.0, 0.0, 0.0);\r\n }\r\n /**\r\n * Returns a new Vector3 set to (1.0, 1.0, 1.0)\r\n * @returns a new Vector3\r\n */\r\n public static One(): Vector3 {\r\n return new Vector3(1.0, 1.0, 1.0);\r\n }\r\n /**\r\n * Returns a new Vector3 set to (0.0, 1.0, 0.0)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\r\n * @returns a new up Vector3\r\n */\r\n public static Up(): Vector3 {\r\n return new Vector3(0.0, 1.0, 0.0);\r\n }\r\n\r\n /**\r\n * Gets an up Vector3 that must not be updated\r\n */\r\n public static get UpReadOnly(): DeepImmutable {\r\n return Vector3._UpReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a down Vector3 that must not be updated\r\n */\r\n public static get DownReadOnly(): DeepImmutable {\r\n return Vector3._DownReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a right Vector3 that must not be updated\r\n */\r\n public static get RightReadOnly(): DeepImmutable {\r\n return Vector3._RightReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a left Vector3 that must not be updated\r\n */\r\n public static get LeftReadOnly(): DeepImmutable {\r\n return Vector3._LeftReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a forward Vector3 that must not be updated\r\n */\r\n public static get LeftHandedForwardReadOnly(): DeepImmutable {\r\n return Vector3._LeftHandedForwardReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a forward Vector3 that must not be updated\r\n */\r\n public static get RightHandedForwardReadOnly(): DeepImmutable {\r\n return Vector3._RightHandedForwardReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a backward Vector3 that must not be updated\r\n */\r\n public static get LeftHandedBackwardReadOnly(): DeepImmutable {\r\n return Vector3._LeftHandedBackwardReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a backward Vector3 that must not be updated\r\n */\r\n public static get RightHandedBackwardReadOnly(): DeepImmutable {\r\n return Vector3._RightHandedBackwardReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a zero Vector3 that must not be updated\r\n */\r\n public static get ZeroReadOnly(): DeepImmutable {\r\n return Vector3._ZeroReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a one Vector3 that must not be updated\r\n */\r\n public static get OneReadOnly(): DeepImmutable {\r\n return Vector3._OneReadOnly;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set to (0.0, -1.0, 0.0)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\r\n * @returns a new down Vector3\r\n */\r\n public static Down(): Vector3 {\r\n return new Vector3(0.0, -1.0, 0.0);\r\n }\r\n /**\r\n * Returns a new Vector3 set to (0.0, 0.0, 1.0)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\r\n * @param rightHandedSystem is the scene right-handed (negative z)\r\n * @returns a new forward Vector3\r\n */\r\n public static Forward(rightHandedSystem: boolean = false): Vector3 {\r\n return new Vector3(0.0, 0.0, rightHandedSystem ? -1.0 : 1.0);\r\n }\r\n /**\r\n * Returns a new Vector3 set to (0.0, 0.0, -1.0)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\r\n * @param rightHandedSystem is the scene right-handed (negative-z)\r\n * @returns a new Backward Vector3\r\n */\r\n public static Backward(rightHandedSystem: boolean = false): Vector3 {\r\n return new Vector3(0.0, 0.0, rightHandedSystem ? 1.0 : -1.0);\r\n }\r\n /**\r\n * Returns a new Vector3 set to (1.0, 0.0, 0.0)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\r\n * @returns a new right Vector3\r\n */\r\n public static Right(): Vector3 {\r\n return new Vector3(1.0, 0.0, 0.0);\r\n }\r\n /**\r\n * Returns a new Vector3 set to (-1.0, 0.0, 0.0)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#71\r\n * @returns a new left Vector3\r\n */\r\n public static Left(): Vector3 {\r\n return new Vector3(-1.0, 0.0, 0.0);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @returns a Vector3 with random values between min and max\r\n */\r\n public static Random(min: number = 0, max: number = 1): Vector3 {\r\n return new Vector3(RandomRange(min, max), RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Sets a Vector3 with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @param ref the ref to store the values in\r\n * @returns the ref with random values between min and max\r\n */\r\n public static RandomToRef(min: number = 0, max: number = 1, ref: T): T {\r\n return ref.copyFromFloats(RandomRange(min, max), RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the result of the transformation by the given matrix of the given vector.\r\n * This method computes transformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#111\r\n * @param vector defines the Vector3 to transform\r\n * @param transformation defines the transformation matrix\r\n * @returns the transformed Vector3\r\n */\r\n public static TransformCoordinates(vector: DeepImmutable, transformation: DeepImmutable): Vector3 {\r\n const result = Vector3.Zero();\r\n Vector3.TransformCoordinatesToRef(vector, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given vector\r\n * This method computes transformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#113\r\n * @param vector defines the Vector3 to transform\r\n * @param transformation defines the transformation matrix\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static TransformCoordinatesToRef(vector: DeepImmutable, transformation: DeepImmutable, result: T): T {\r\n Vector3.TransformCoordinatesFromFloatsToRef(vector._x, vector._y, vector._z, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given floats (x, y, z)\r\n * This method computes transformed coordinates only, not transformed direction vectors\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#115\r\n * @param x define the x coordinate of the source vector\r\n * @param y define the y coordinate of the source vector\r\n * @param z define the z coordinate of the source vector\r\n * @param transformation defines the transformation matrix\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static TransformCoordinatesFromFloatsToRef(x: number, y: number, z: number, transformation: DeepImmutable, result: T): T {\r\n const m = transformation.m;\r\n const rx = x * m[0] + y * m[4] + z * m[8] + m[12];\r\n const ry = x * m[1] + y * m[5] + z * m[9] + m[13];\r\n const rz = x * m[2] + y * m[6] + z * m[10] + m[14];\r\n const rw = 1 / (x * m[3] + y * m[7] + z * m[11] + m[15]);\r\n\r\n result._x = rx * rw;\r\n result._y = ry * rw;\r\n result._z = rz * rw;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the result of the normal transformation by the given matrix of the given vector\r\n * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#112\r\n * @param vector defines the Vector3 to transform\r\n * @param transformation defines the transformation matrix\r\n * @returns the new Vector3\r\n */\r\n public static TransformNormal(vector: DeepImmutable, transformation: DeepImmutable): Vector3 {\r\n const result = Vector3.Zero();\r\n Vector3.TransformNormalToRef(vector, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given vector\r\n * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#114\r\n * @param vector defines the Vector3 to transform\r\n * @param transformation defines the transformation matrix\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static TransformNormalToRef(vector: DeepImmutable, transformation: DeepImmutable, result: T): T {\r\n this.TransformNormalFromFloatsToRef(vector._x, vector._y, vector._z, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given floats (x, y, z)\r\n * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#116\r\n * @param x define the x coordinate of the source vector\r\n * @param y define the y coordinate of the source vector\r\n * @param z define the z coordinate of the source vector\r\n * @param transformation defines the transformation matrix\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static TransformNormalFromFloatsToRef(x: number, y: number, z: number, transformation: DeepImmutable, result: T): T {\r\n const m = transformation.m;\r\n result._x = x * m[0] + y * m[4] + z * m[8];\r\n result._y = x * m[1] + y * m[5] + z * m[9];\r\n result._z = x * m[2] + y * m[6] + z * m[10];\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 located for \"amount\" on the CatmullRom interpolation spline defined by the vectors \"value1\", \"value2\", \"value3\", \"value4\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#69\r\n * @param value1 defines the first control point\r\n * @param value2 defines the second control point\r\n * @param value3 defines the third control point\r\n * @param value4 defines the fourth control point\r\n * @param amount defines the amount on the spline to use\r\n * @returns the new Vector3\r\n */\r\n public static CatmullRom(\r\n value1: DeepImmutable,\r\n value2: DeepImmutable,\r\n value3: DeepImmutable,\r\n value4: DeepImmutable,\r\n amount: number\r\n ): T {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n\r\n const x =\r\n 0.5 *\r\n (2.0 * value2._x +\r\n (-value1._x + value3._x) * amount +\r\n (2.0 * value1._x - 5.0 * value2._x + 4.0 * value3._x - value4._x) * squared +\r\n (-value1._x + 3.0 * value2._x - 3.0 * value3._x + value4._x) * cubed);\r\n\r\n const y =\r\n 0.5 *\r\n (2.0 * value2._y +\r\n (-value1._y + value3._y) * amount +\r\n (2.0 * value1._y - 5.0 * value2._y + 4.0 * value3._y - value4._y) * squared +\r\n (-value1._y + 3.0 * value2._y - 3.0 * value3._y + value4._y) * cubed);\r\n\r\n const z =\r\n 0.5 *\r\n (2.0 * value2._z +\r\n (-value1._z + value3._z) * amount +\r\n (2.0 * value1._z - 5.0 * value2._z + 4.0 * value3._z - value4._z) * squared +\r\n (-value1._z + 3.0 * value2._z - 3.0 * value3._z + value4._z) * cubed);\r\n\r\n return new (value1.constructor as Constructor)(x, y, z);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\r\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\r\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#76\r\n * @param value defines the current value\r\n * @param min defines the lower range value\r\n * @param max defines the upper range value\r\n * @returns the new Vector3\r\n */\r\n public static Clamp(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable): T {\r\n const result = new (value.constructor as Constructor)();\r\n Vector3.ClampToRef(value, min, max, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\r\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\r\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#77\r\n * @param value defines the current value\r\n * @param min defines the lower range value\r\n * @param max defines the upper range value\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static ClampToRef(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable, result: T): T {\r\n let x = value._x;\r\n x = x > max._x ? max._x : x;\r\n x = x < min._x ? min._x : x;\r\n\r\n let y = value._y;\r\n y = y > max._y ? max._y : y;\r\n y = y < min._y ? min._y : y;\r\n\r\n let z = value._z;\r\n z = z > max._z ? max._z : z;\r\n z = z < min._z ? min._z : z;\r\n\r\n result.copyFromFloats(x, y, z);\r\n return result;\r\n }\r\n\r\n /**\r\n * Checks if a given vector is inside a specific range\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#75\r\n * @param v defines the vector to test\r\n * @param min defines the minimum range\r\n * @param max defines the maximum range\r\n */\r\n public static CheckExtends(v: Vector3, min: Vector3, max: Vector3): void {\r\n min.minimizeInPlace(v);\r\n max.maximizeInPlace(v);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 located for \"amount\" (float) on the Hermite interpolation spline defined by the vectors \"value1\", \"tangent1\", \"value2\", \"tangent2\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#89\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent vector\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent vector\r\n * @param amount defines the amount on the interpolation spline (between 0 and 1)\r\n * @returns the new Vector3\r\n */\r\n public static Hermite(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n amount: number\r\n ): T {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n const part1 = 2.0 * cubed - 3.0 * squared + 1.0;\r\n const part2 = -2.0 * cubed + 3.0 * squared;\r\n const part3 = cubed - 2.0 * squared + amount;\r\n const part4 = cubed - squared;\r\n\r\n const x = value1._x * part1 + value2._x * part2 + tangent1._x * part3 + tangent2._x * part4;\r\n const y = value1._y * part1 + value2._y * part2 + tangent1._y * part3 + tangent2._y * part4;\r\n const z = value1._z * part1 + value2._z * part2 + tangent1._z * part3 + tangent2._z * part4;\r\n return new (value1.constructor as Constructor)(x, y, z);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 which is the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#90\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @returns 1st derivative\r\n */\r\n public static Hermite1stDerivative(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number\r\n ): T {\r\n const result = new (value1.constructor as Constructor)();\r\n\r\n this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Update a Vector3 with the 1st derivative of the Hermite spline defined by the vectors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#91\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @param result define where to store the derivative\r\n * @returns result input\r\n */\r\n public static Hermite1stDerivativeToRef(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number,\r\n result: T\r\n ): T {\r\n const t2 = time * time;\r\n\r\n result._x = (t2 - time) * 6 * value1._x + (3 * t2 - 4 * time + 1) * tangent1._x + (-t2 + time) * 6 * value2._x + (3 * t2 - 2 * time) * tangent2._x;\r\n result._y = (t2 - time) * 6 * value1._y + (3 * t2 - 4 * time + 1) * tangent1._y + (-t2 + time) * 6 * value2._y + (3 * t2 - 2 * time) * tangent2._y;\r\n result._z = (t2 - time) * 6 * value1._z + (3 * t2 - 4 * time + 1) * tangent1._z + (-t2 + time) * 6 * value2._z + (3 * t2 - 2 * time) * tangent2._z;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 located for \"amount\" (float) on the linear interpolation between the vectors \"start\" and \"end\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#95\r\n * @param start defines the start value\r\n * @param end defines the end value\r\n * @param amount max defines amount between both (between 0 and 1)\r\n * @returns the new Vector3\r\n */\r\n public static Lerp(start: DeepImmutable, end: DeepImmutable, amount: number): T {\r\n const result = new (start.constructor as Constructor)(0, 0, 0);\r\n Vector3.LerpToRef(start, end, amount, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the result of the linear interpolation from the vector \"start\" for \"amount\" to the vector \"end\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#93\r\n * @param start defines the start value\r\n * @param end defines the end value\r\n * @param amount max defines amount between both (between 0 and 1)\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static LerpToRef(start: DeepImmutable, end: DeepImmutable, amount: number, result: T): T {\r\n result._x = start._x + (end._x - start._x) * amount;\r\n result._y = start._y + (end._y - start._y) * amount;\r\n result._z = start._z + (end._z - start._z) * amount;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns the dot product (float) between the vectors \"left\" and \"right\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#82\r\n * @param left defines the left operand\r\n * @param right defines the right operand\r\n * @returns the dot product\r\n */\r\n public static Dot(left: DeepImmutable, right: DeepImmutable): number {\r\n return left._x * right._x + left._y * right._y + left._z * right._z;\r\n }\r\n\r\n /**\r\n * Returns the dot product (float) between the current vectors and \"otherVector\"\r\n * @param otherVector defines the right operand\r\n * @returns the dot product\r\n */\r\n public dot(otherVector: DeepImmutable): number {\r\n return this._x * otherVector._x + this._y * otherVector._y + this._z * otherVector._z;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 as the cross product of the vectors \"left\" and \"right\"\r\n * The cross product is then orthogonal to both \"left\" and \"right\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#15\r\n * @param left defines the left operand\r\n * @param right defines the right operand\r\n * @returns the cross product\r\n */\r\n public static Cross(left: DeepImmutable, right: DeepImmutable): T {\r\n const result = new (left.constructor as Constructor)();\r\n Vector3.CrossToRef(left, right, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the cross product of \"left\" and \"right\"\r\n * The cross product is then orthogonal to both \"left\" and \"right\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#78\r\n * @param left defines the left operand\r\n * @param right defines the right operand\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static CrossToRef(left: DeepImmutable, right: DeepImmutable, result: T): T {\r\n const x = left._y * right._z - left._z * right._y;\r\n const y = left._z * right._x - left._x * right._z;\r\n const z = left._x * right._y - left._y * right._x;\r\n result.copyFromFloats(x, y, z);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 as the normalization of the given vector\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#98\r\n * @param vector defines the Vector3 to normalize\r\n * @returns the new Vector3\r\n */\r\n public static Normalize(vector: DeepImmutable): Vector3 {\r\n const result = Vector3.Zero();\r\n Vector3.NormalizeToRef(vector, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the normalization of the given first vector\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#98\r\n * @param vector defines the Vector3 to normalize\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static NormalizeToRef(vector: DeepImmutable, result: T): T {\r\n vector.normalizeToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Project a Vector3 onto screen space\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#101\r\n * @param vector defines the Vector3 to project\r\n * @param world defines the world matrix to use\r\n * @param transform defines the transform (view x projection) matrix to use\r\n * @param viewport defines the screen viewport to use\r\n * @returns the new Vector3\r\n */\r\n public static Project(vector: DeepImmutable, world: DeepImmutable, transform: DeepImmutable, viewport: DeepImmutable): T {\r\n const result = new (vector.constructor as Constructor)();\r\n Vector3.ProjectToRef(vector, world, transform, viewport, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Project a Vector3 onto screen space to reference\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#102\r\n * @param vector defines the Vector3 to project\r\n * @param world defines the world matrix to use\r\n * @param transform defines the transform (view x projection) matrix to use\r\n * @param viewport defines the screen viewport to use\r\n * @param result the vector in which the screen space will be stored\r\n * @returns result input\r\n */\r\n public static ProjectToRef(\r\n vector: DeepImmutable,\r\n world: DeepImmutable,\r\n transform: DeepImmutable,\r\n viewport: DeepImmutable,\r\n result: T\r\n ): T {\r\n const cw = viewport.width;\r\n const ch = viewport.height;\r\n const cx = viewport.x;\r\n const cy = viewport.y;\r\n\r\n const viewportMatrix = MathTmp.Matrix[1];\r\n\r\n Matrix.FromValuesToRef(cw / 2.0, 0, 0, 0, 0, -ch / 2.0, 0, 0, 0, 0, 0.5, 0, cx + cw / 2.0, ch / 2.0 + cy, 0.5, 1, viewportMatrix);\r\n\r\n const matrix = MathTmp.Matrix[0];\r\n world.multiplyToRef(transform, matrix);\r\n matrix.multiplyToRef(viewportMatrix, matrix);\r\n\r\n Vector3.TransformCoordinatesToRef(vector, matrix, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Reflects a vector off the plane defined by a normalized normal\r\n * @param inDirection defines the vector direction\r\n * @param normal defines the normal - Must be normalized\r\n * @returns the resulting vector\r\n */\r\n public static Reflect(inDirection: DeepImmutable, normal: DeepImmutable): Vector3 {\r\n return this.ReflectToRef(inDirection, normal, new Vector3());\r\n }\r\n\r\n /**\r\n * Reflects a vector off the plane defined by a normalized normal to reference\r\n * @param inDirection defines the vector direction\r\n * @param normal defines the normal - Must be normalized\r\n * @param ref defines the Vector3 where to store the result\r\n * @returns the resulting vector\r\n */\r\n public static ReflectToRef(inDirection: DeepImmutable, normal: DeepImmutable, ref: T): T {\r\n const tmp = TmpVectors.Vector3[0];\r\n tmp.copyFrom(normal).scaleInPlace(2 * Vector3.Dot(inDirection, normal));\r\n\r\n return ref.copyFrom(inDirection).subtractInPlace(tmp);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _UnprojectFromInvertedMatrixToRef(source: DeepImmutable, matrix: DeepImmutable, result: T): T {\r\n Vector3.TransformCoordinatesToRef(source, matrix, result);\r\n const m = matrix.m;\r\n const num = source._x * m[3] + source._y * m[7] + source._z * m[11] + m[15];\r\n if (WithinEpsilon(num, 1.0)) {\r\n result.scaleInPlace(1.0 / num);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Unproject from screen space to object space\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#121\r\n * @param source defines the screen space Vector3 to use\r\n * @param viewportWidth defines the current width of the viewport\r\n * @param viewportHeight defines the current height of the viewport\r\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\r\n * @param transform defines the transform (view x projection) matrix to use\r\n * @returns the new Vector3\r\n */\r\n public static UnprojectFromTransform(\r\n source: DeepImmutable,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n transform: DeepImmutable\r\n ): T {\r\n return this.Unproject(source, viewportWidth, viewportHeight, world, transform, Matrix.IdentityReadOnly);\r\n }\r\n\r\n /**\r\n * Unproject from screen space to object space\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#117\r\n * @param source defines the screen space Vector3 to use\r\n * @param viewportWidth defines the current width of the viewport\r\n * @param viewportHeight defines the current height of the viewport\r\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\r\n * @param view defines the view matrix to use\r\n * @param projection defines the projection matrix to use\r\n * @returns the new Vector3\r\n */\r\n public static Unproject(\r\n source: DeepImmutable,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable\r\n ): T {\r\n const result = new (source.constructor as Constructor)();\r\n\r\n Vector3.UnprojectToRef(source, viewportWidth, viewportHeight, world, view, projection, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Unproject from screen space to object space\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#119\r\n * @param source defines the screen space Vector3 to use\r\n * @param viewportWidth defines the current width of the viewport\r\n * @param viewportHeight defines the current height of the viewport\r\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\r\n * @param view defines the view matrix to use\r\n * @param projection defines the projection matrix to use\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static UnprojectToRef(\r\n source: DeepImmutable,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable,\r\n result: T\r\n ): T {\r\n Vector3.UnprojectFloatsToRef(source._x, source._y, source._z, viewportWidth, viewportHeight, world, view, projection, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Unproject from screen space to object space\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#120\r\n * @param sourceX defines the screen space x coordinate to use\r\n * @param sourceY defines the screen space y coordinate to use\r\n * @param sourceZ defines the screen space z coordinate to use\r\n * @param viewportWidth defines the current width of the viewport\r\n * @param viewportHeight defines the current height of the viewport\r\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\r\n * @param view defines the view matrix to use\r\n * @param projection defines the projection matrix to use\r\n * @param result defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static UnprojectFloatsToRef(\r\n sourceX: float,\r\n sourceY: float,\r\n sourceZ: float,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable,\r\n result: T\r\n ): T {\r\n const matrix = MathTmp.Matrix[0];\r\n world.multiplyToRef(view, matrix);\r\n matrix.multiplyToRef(projection, matrix);\r\n matrix.invert();\r\n\r\n const screenSource = MathTmp.Vector3[0];\r\n screenSource.x = (sourceX / viewportWidth) * 2 - 1;\r\n screenSource.y = -((sourceY / viewportHeight) * 2 - 1);\r\n if (EngineStore.LastCreatedEngine?.isNDCHalfZRange) {\r\n screenSource.z = sourceZ;\r\n } else {\r\n screenSource.z = 2 * sourceZ - 1.0;\r\n }\r\n\r\n Vector3._UnprojectFromInvertedMatrixToRef(screenSource, matrix, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the minimal coordinate values between two Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#97\r\n * @param left defines the first operand\r\n * @param right defines the second operand\r\n * @returns the new Vector3\r\n */\r\n public static Minimize(left: DeepImmutable, right: DeepImmutable): T {\r\n const min = new (left.constructor as Constructor)();\r\n min.copyFrom(left);\r\n min.minimizeInPlace(right);\r\n return min;\r\n }\r\n\r\n /**\r\n * Gets the maximal coordinate values between two Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#96\r\n * @param left defines the first operand\r\n * @param right defines the second operand\r\n * @returns the new Vector3\r\n */\r\n public static Maximize(left: DeepImmutable, right: DeepImmutable): T {\r\n const max = new (left.constructor as Constructor)();\r\n max.copyFrom(left);\r\n max.maximizeInPlace(right);\r\n return max;\r\n }\r\n\r\n /**\r\n * Returns the distance between the vectors \"value1\" and \"value2\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#81\r\n * @param value1 defines the first operand\r\n * @param value2 defines the second operand\r\n * @returns the distance\r\n */\r\n public static Distance(value1: DeepImmutable, value2: DeepImmutable): number {\r\n return Math.sqrt(Vector3.DistanceSquared(value1, value2));\r\n }\r\n\r\n /**\r\n * Returns the squared distance between the vectors \"value1\" and \"value2\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#80\r\n * @param value1 defines the first operand\r\n * @param value2 defines the second operand\r\n * @returns the squared distance\r\n */\r\n public static DistanceSquared(value1: DeepImmutable, value2: DeepImmutable): number {\r\n const x = value1._x - value2._x;\r\n const y = value1._y - value2._y;\r\n const z = value1._z - value2._z;\r\n\r\n return x * x + y * y + z * z;\r\n }\r\n\r\n /**\r\n * Projects \"vector\" on the triangle determined by its extremities \"p0\", \"p1\" and \"p2\", stores the result in \"ref\"\r\n * and returns the distance to the projected point.\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#104\r\n * From http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.4264&rep=rep1&type=pdf\r\n *\r\n * @param vector the vector to get distance from\r\n * @param p0 extremity of the triangle\r\n * @param p1 extremity of the triangle\r\n * @param p2 extremity of the triangle\r\n * @param ref variable to store the result to\r\n * @returns The distance between \"ref\" and \"vector\"\r\n */\r\n public static ProjectOnTriangleToRef(vector: DeepImmutable, p0: DeepImmutable, p1: DeepImmutable, p2: DeepImmutable, ref: Vector3): number {\r\n const p1p0 = MathTmp.Vector3[0];\r\n const p2p0 = MathTmp.Vector3[1];\r\n const p2p1 = MathTmp.Vector3[2];\r\n const normal = MathTmp.Vector3[3];\r\n const vectorp0 = MathTmp.Vector3[4];\r\n\r\n // Triangle vectors\r\n p1.subtractToRef(p0, p1p0);\r\n p2.subtractToRef(p0, p2p0);\r\n p2.subtractToRef(p1, p2p1);\r\n\r\n const p1p0L = p1p0.length();\r\n const p2p0L = p2p0.length();\r\n const p2p1L = p2p1.length();\r\n\r\n if (p1p0L < Epsilon || p2p0L < Epsilon || p2p1L < Epsilon) {\r\n // This is a degenerate triangle. As we assume this is part of a non-degenerate mesh,\r\n // we will find a better intersection later.\r\n // Let's just return one of the extremities\r\n ref.copyFrom(p0);\r\n return Vector3.Distance(vector, p0);\r\n }\r\n\r\n // Compute normal and vector to p0\r\n vector.subtractToRef(p0, vectorp0);\r\n Vector3.CrossToRef(p1p0, p2p0, normal);\r\n const nl = normal.length();\r\n if (nl < Epsilon) {\r\n // Extremities are aligned, we are back on the case of a degenerate triangle\r\n ref.copyFrom(p0);\r\n return Vector3.Distance(vector, p0);\r\n }\r\n normal.normalizeFromLength(nl);\r\n let l = vectorp0.length();\r\n if (l < Epsilon) {\r\n // Vector is p0\r\n ref.copyFrom(p0);\r\n return 0;\r\n }\r\n vectorp0.normalizeFromLength(l);\r\n\r\n // Project to \"proj\" that lies on the triangle plane\r\n const cosA = Vector3.Dot(normal, vectorp0);\r\n const projVector = MathTmp.Vector3[5];\r\n const proj = MathTmp.Vector3[6];\r\n projVector.copyFrom(normal).scaleInPlace(-l * cosA);\r\n proj.copyFrom(vector).addInPlace(projVector);\r\n\r\n // Compute barycentric coordinates (v0, v1 and v2 are axis from barycenter to extremities)\r\n const v0 = MathTmp.Vector3[4];\r\n const v1 = MathTmp.Vector3[5];\r\n const v2 = MathTmp.Vector3[7];\r\n const tmp = MathTmp.Vector3[8];\r\n\r\n v0.copyFrom(p1p0).scaleInPlace(1 / p1p0L);\r\n tmp.copyFrom(p2p0).scaleInPlace(1 / p2p0L);\r\n v0.addInPlace(tmp).scaleInPlace(-1);\r\n\r\n v1.copyFrom(p1p0).scaleInPlace(-1 / p1p0L);\r\n tmp.copyFrom(p2p1).scaleInPlace(1 / p2p1L);\r\n v1.addInPlace(tmp).scaleInPlace(-1);\r\n\r\n v2.copyFrom(p2p1).scaleInPlace(-1 / p2p1L);\r\n tmp.copyFrom(p2p0).scaleInPlace(-1 / p2p0L);\r\n v2.addInPlace(tmp).scaleInPlace(-1);\r\n\r\n // Determines which edge of the triangle is closest to \"proj\"\r\n const projP = MathTmp.Vector3[9];\r\n let dot;\r\n projP.copyFrom(proj).subtractInPlace(p0);\r\n Vector3.CrossToRef(v0, projP, tmp);\r\n dot = Vector3.Dot(tmp, normal);\r\n const s0 = dot;\r\n\r\n projP.copyFrom(proj).subtractInPlace(p1);\r\n Vector3.CrossToRef(v1, projP, tmp);\r\n dot = Vector3.Dot(tmp, normal);\r\n const s1 = dot;\r\n\r\n projP.copyFrom(proj).subtractInPlace(p2);\r\n Vector3.CrossToRef(v2, projP, tmp);\r\n dot = Vector3.Dot(tmp, normal);\r\n const s2 = dot;\r\n\r\n const edge = MathTmp.Vector3[10];\r\n let e0, e1;\r\n if (s0 > 0 && s1 < 0) {\r\n edge.copyFrom(p1p0);\r\n e0 = p0;\r\n e1 = p1;\r\n } else if (s1 > 0 && s2 < 0) {\r\n edge.copyFrom(p2p1);\r\n e0 = p1;\r\n e1 = p2;\r\n } else {\r\n edge.copyFrom(p2p0).scaleInPlace(-1);\r\n e0 = p2;\r\n e1 = p0;\r\n }\r\n\r\n // Determines if \"proj\" lies inside the triangle\r\n const tmp2 = MathTmp.Vector3[9];\r\n const tmp3 = MathTmp.Vector3[4];\r\n e0.subtractToRef(proj, tmp);\r\n e1.subtractToRef(proj, tmp2);\r\n Vector3.CrossToRef(tmp, tmp2, tmp3);\r\n const isOutside = Vector3.Dot(tmp3, normal) < 0;\r\n\r\n // If inside, we already found the projected point, \"proj\"\r\n if (!isOutside) {\r\n ref.copyFrom(proj);\r\n return Math.abs(l * cosA);\r\n }\r\n\r\n // If outside, we find \"triProj\", the closest point from \"proj\" on the closest edge\r\n const r = MathTmp.Vector3[5];\r\n Vector3.CrossToRef(edge, tmp3, r);\r\n r.normalize();\r\n const e0proj = MathTmp.Vector3[9];\r\n e0proj.copyFrom(e0).subtractInPlace(proj);\r\n const e0projL = e0proj.length();\r\n if (e0projL < Epsilon) {\r\n // Proj is e0\r\n ref.copyFrom(e0);\r\n return Vector3.Distance(vector, e0);\r\n }\r\n e0proj.normalizeFromLength(e0projL);\r\n const cosG = Vector3.Dot(r, e0proj);\r\n const triProj = MathTmp.Vector3[7];\r\n triProj.copyFrom(proj).addInPlace(r.scaleInPlace(e0projL * cosG));\r\n\r\n // Now we clamp \"triProj\" so it lies between e0 and e1\r\n tmp.copyFrom(triProj).subtractInPlace(e0);\r\n l = edge.length();\r\n edge.normalizeFromLength(l);\r\n let t = Vector3.Dot(tmp, edge) / Math.max(l, Epsilon);\r\n t = Clamp(t, 0, 1);\r\n triProj.copyFrom(e0).addInPlace(edge.scaleInPlace(t * l));\r\n ref.copyFrom(triProj);\r\n\r\n return Vector3.Distance(vector, triProj);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 located at the center between \"value1\" and \"value2\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#72\r\n * @param value1 defines the first operand\r\n * @param value2 defines the second operand\r\n * @returns the new Vector3\r\n */\r\n public static Center(value1: DeepImmutable, value2: DeepImmutable): Vector3 {\r\n return Vector3.CenterToRef(value1, value2, Vector3.Zero());\r\n }\r\n\r\n /**\r\n * Gets the center of the vectors \"value1\" and \"value2\" and stores the result in the vector \"ref\"\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#73\r\n * @param value1 defines first vector\r\n * @param value2 defines second vector\r\n * @param ref defines third vector\r\n * @returns ref\r\n */\r\n public static CenterToRef(value1: DeepImmutable, value2: DeepImmutable, ref: T): T {\r\n return ref.copyFromFloats((value1._x + value2._x) / 2, (value1._y + value2._y) / 2, (value1._z + value2._z) / 2);\r\n }\r\n\r\n /**\r\n * Given three orthogonal normalized left-handed oriented Vector3 axis in space (target system),\r\n * RotationFromAxis() returns the rotation Euler angles (ex : rotation.x, rotation.y, rotation.z) to apply\r\n * to something in order to rotate it from its local system to the given target system\r\n * Note: axis1, axis2 and axis3 are normalized during this operation\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#106\r\n * @param axis1 defines the first axis\r\n * @param axis2 defines the second axis\r\n * @param axis3 defines the third axis\r\n * @returns a new Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/target_align\r\n */\r\n public static RotationFromAxis(axis1: DeepImmutable, axis2: DeepImmutable, axis3: DeepImmutable): T {\r\n const rotation = new (axis1.constructor as Constructor)();\r\n Vector3.RotationFromAxisToRef(axis1, axis2, axis3, rotation);\r\n return rotation;\r\n }\r\n\r\n /**\r\n * The same than RotationFromAxis but updates the given ref Vector3 parameter instead of returning a new Vector3\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#107\r\n * @param axis1 defines the first axis\r\n * @param axis2 defines the second axis\r\n * @param axis3 defines the third axis\r\n * @param ref defines the Vector3 where to store the result\r\n * @returns result input\r\n */\r\n public static RotationFromAxisToRef(axis1: DeepImmutable, axis2: DeepImmutable, axis3: DeepImmutable, ref: T): T {\r\n const quat = MathTmp.Quaternion[0];\r\n Quaternion.RotationQuaternionFromAxisToRef(axis1, axis2, axis3, quat);\r\n quat.toEulerAnglesToRef(ref);\r\n return ref;\r\n }\r\n}\r\nVector3 satisfies VectorStatic;\r\nObject.defineProperties(Vector3.prototype, {\r\n dimension: { value: [3] },\r\n rank: { value: 1 },\r\n});\r\n\r\n/**\r\n * Vector4 class created for EulerAngle class conversion to Quaternion\r\n */\r\nexport class Vector4 implements Vector>, IVector4Like {\r\n private static _ZeroReadOnly = Vector4.Zero() as DeepImmutable;\r\n\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: Readonly<[4]>;\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 1;\r\n\r\n /**\r\n * Creates a Vector4 object from the given floats.\r\n * @param x x value of the vector\r\n * @param y y value of the vector\r\n * @param z z value of the vector\r\n * @param w w value of the vector\r\n */\r\n constructor(\r\n /** x value of the vector */\r\n public x: number = 0,\r\n /** y value of the vector */\r\n public y: number = 0,\r\n /** z value of the vector */\r\n public z: number = 0,\r\n /** w value of the vector */\r\n public w: number = 0\r\n ) {}\r\n\r\n /**\r\n * Returns the string with the Vector4 coordinates.\r\n * @returns a string containing all the vector values\r\n */\r\n public toString(): string {\r\n return `{X: ${this.x} Y: ${this.y} Z: ${this.z} W: ${this.w}}`;\r\n }\r\n\r\n /**\r\n * Returns the string \"Vector4\".\r\n * @returns \"Vector4\"\r\n */\r\n public getClassName(): string {\r\n return \"Vector4\";\r\n }\r\n\r\n /**\r\n * Returns the Vector4 hash code.\r\n * @returns a unique hash code\r\n */\r\n public getHashCode(): number {\r\n const x = _ExtractAsInt(this.x);\r\n const y = _ExtractAsInt(this.y);\r\n const z = _ExtractAsInt(this.z);\r\n const w = _ExtractAsInt(this.w);\r\n\r\n let hash = x;\r\n hash = (hash * 397) ^ y;\r\n hash = (hash * 397) ^ z;\r\n hash = (hash * 397) ^ w;\r\n return hash;\r\n }\r\n\r\n // Operators\r\n /**\r\n * Returns a new array populated with 4 elements : the Vector4 coordinates.\r\n * @returns the resulting array\r\n */\r\n public asArray(): Tuple {\r\n return [this.x, this.y, this.z, this.w];\r\n }\r\n\r\n /**\r\n * Populates the given array from the given index with the Vector4 coordinates.\r\n * @param array array to populate\r\n * @param index index of the array to start at (default: 0)\r\n * @returns the Vector4.\r\n */\r\n public toArray(array: FloatArray, index?: number): this {\r\n if (index === undefined) {\r\n index = 0;\r\n }\r\n array[index] = this.x;\r\n array[index + 1] = this.y;\r\n array[index + 2] = this.z;\r\n array[index + 3] = this.w;\r\n return this;\r\n }\r\n\r\n /**\r\n * Update the current vector from an array\r\n * @param array defines the destination array\r\n * @param offset defines the offset in the destination array\r\n * @returns the current Vector3\r\n */\r\n public fromArray(array: FloatArray, offset: number = 0): this {\r\n Vector4.FromArrayToRef(array, offset, this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the given vector to the current Vector4.\r\n * @param otherVector the vector to add\r\n * @returns the updated Vector4.\r\n */\r\n public addInPlace(otherVector: DeepImmutable): this {\r\n this.x += otherVector.x;\r\n this.y += otherVector.y;\r\n this.z += otherVector.z;\r\n this.w += otherVector.w;\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the given coordinates to the current Vector4\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @param w defines the w coordinate of the operand\r\n * @returns the current updated Vector4\r\n */\r\n public addInPlaceFromFloats(x: number, y: number, z: number, w: number): this {\r\n this.x += x;\r\n this.y += y;\r\n this.z += z;\r\n this.w += w;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 as the result of the addition of the current Vector4 and the given one.\r\n * @param otherVector the vector to add\r\n * @returns the resulting vector\r\n */\r\n public add(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x + otherVector.x, this.y + otherVector.y, this.z + otherVector.z, this.w + otherVector.w);\r\n }\r\n\r\n /**\r\n * Updates the given vector \"result\" with the result of the addition of the current Vector4 and the given one.\r\n * @param otherVector the vector to add\r\n * @param result the vector to store the result\r\n * @returns result input\r\n */\r\n public addToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x + otherVector.x;\r\n result.y = this.y + otherVector.y;\r\n result.z = this.z + otherVector.z;\r\n result.w = this.w + otherVector.w;\r\n return result;\r\n }\r\n\r\n /**\r\n * Subtract in place the given vector from the current Vector4.\r\n * @param otherVector the vector to subtract\r\n * @returns the updated Vector4.\r\n */\r\n public subtractInPlace(otherVector: DeepImmutable): this {\r\n this.x -= otherVector.x;\r\n this.y -= otherVector.y;\r\n this.z -= otherVector.z;\r\n this.w -= otherVector.w;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 with the result of the subtraction of the given vector from the current Vector4.\r\n * @param otherVector the vector to add\r\n * @returns the new vector with the result\r\n */\r\n public subtract(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x - otherVector.x, this.y - otherVector.y, this.z - otherVector.z, this.w - otherVector.w);\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the result of the subtraction of the given vector from the current Vector4.\r\n * @param otherVector the vector to subtract\r\n * @param result the vector to store the result\r\n * @returns result input\r\n */\r\n public subtractToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x - otherVector.x;\r\n result.y = this.y - otherVector.y;\r\n result.z = this.z - otherVector.z;\r\n result.w = this.w - otherVector.w;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the result of the subtraction of the given floats from the current Vector4 coordinates.\r\n * @param x value to subtract\r\n * @param y value to subtract\r\n * @param z value to subtract\r\n * @param w value to subtract\r\n * @returns new vector containing the result\r\n */\r\n public subtractFromFloats(x: number, y: number, z: number, w: number): this {\r\n return new (this.constructor as Constructor)(this.x - x, this.y - y, this.z - z, this.w - w);\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" set with the result of the subtraction of the given floats from the current Vector4 coordinates.\r\n * @param x value to subtract\r\n * @param y value to subtract\r\n * @param z value to subtract\r\n * @param w value to subtract\r\n * @param result the vector to store the result in\r\n * @returns result input\r\n */\r\n public subtractFromFloatsToRef(x: number, y: number, z: number, w: number, result: T): T {\r\n result.x = this.x - x;\r\n result.y = this.y - y;\r\n result.z = this.z - z;\r\n result.w = this.w - w;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the current Vector4 negated coordinates.\r\n * @returns a new vector with the negated values\r\n */\r\n public negate(): this {\r\n return new (this.constructor as Constructor)(-this.x, -this.y, -this.z, -this.w);\r\n }\r\n\r\n /**\r\n * Negate this vector in place\r\n * @returns this\r\n */\r\n public negateInPlace(): this {\r\n this.x *= -1;\r\n this.y *= -1;\r\n this.z *= -1;\r\n this.w *= -1;\r\n return this;\r\n }\r\n\r\n /**\r\n * Negate the current Vector4 and stores the result in the given vector \"result\" coordinates\r\n * @param result defines the Vector3 object where to store the result\r\n * @returns the result\r\n */\r\n public negateToRef(result: T): T {\r\n return result.copyFromFloats(this.x * -1, this.y * -1, this.z * -1, this.w * -1);\r\n }\r\n\r\n /**\r\n * Multiplies the current Vector4 coordinates by scale (float).\r\n * @param scale the number to scale with\r\n * @returns the updated Vector4.\r\n */\r\n public scaleInPlace(scale: number): this {\r\n this.x *= scale;\r\n this.y *= scale;\r\n this.z *= scale;\r\n this.w *= scale;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the current Vector4 coordinates multiplied by scale (float).\r\n * @param scale the number to scale with\r\n * @returns a new vector with the result\r\n */\r\n public scale(scale: number): this {\r\n return new (this.constructor as Constructor)(this.x * scale, this.y * scale, this.z * scale, this.w * scale);\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the current Vector4 coordinates multiplied by scale (float).\r\n * @param scale the number to scale with\r\n * @param result a vector to store the result in\r\n * @returns result input\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n result.x = this.x * scale;\r\n result.y = this.y * scale;\r\n result.z = this.z * scale;\r\n result.w = this.w * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Scale the current Vector4 values by a factor and add the result to a given Vector4\r\n * @param scale defines the scale factor\r\n * @param result defines the Vector4 object where to store the result\r\n * @returns result input\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n result.x += this.x * scale;\r\n result.y += this.y * scale;\r\n result.z += this.z * scale;\r\n result.w += this.w * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Boolean : True if the current Vector4 coordinates are stricly equal to the given ones.\r\n * @param otherVector the vector to compare against\r\n * @returns true if they are equal\r\n */\r\n public equals(otherVector: DeepImmutable): boolean {\r\n return otherVector && this.x === otherVector.x && this.y === otherVector.y && this.z === otherVector.z && this.w === otherVector.w;\r\n }\r\n\r\n /**\r\n * Boolean : True if the current Vector4 coordinates are each beneath the distance \"epsilon\" from the given vector ones.\r\n * @param otherVector vector to compare against\r\n * @param epsilon (Default: very small number)\r\n * @returns true if they are equal\r\n */\r\n public equalsWithEpsilon(otherVector: DeepImmutable, epsilon: number = Epsilon): boolean {\r\n return (\r\n otherVector &&\r\n WithinEpsilon(this.x, otherVector.x, epsilon) &&\r\n WithinEpsilon(this.y, otherVector.y, epsilon) &&\r\n WithinEpsilon(this.z, otherVector.z, epsilon) &&\r\n WithinEpsilon(this.w, otherVector.w, epsilon)\r\n );\r\n }\r\n\r\n /**\r\n * Boolean : True if the given floats are strictly equal to the current Vector4 coordinates.\r\n * @param x x value to compare against\r\n * @param y y value to compare against\r\n * @param z z value to compare against\r\n * @param w w value to compare against\r\n * @returns true if equal\r\n */\r\n public equalsToFloats(x: number, y: number, z: number, w: number): boolean {\r\n return this.x === x && this.y === y && this.z === z && this.w === w;\r\n }\r\n\r\n /**\r\n * Multiplies in place the current Vector4 by the given one.\r\n * @param otherVector vector to multiple with\r\n * @returns the updated Vector4.\r\n */\r\n public multiplyInPlace(otherVector: DeepImmutable): this {\r\n this.x *= otherVector.x;\r\n this.y *= otherVector.y;\r\n this.z *= otherVector.z;\r\n this.w *= otherVector.w;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the multiplication result of the current Vector4 and the given one.\r\n * @param otherVector vector to multiple with\r\n * @returns resulting new vector\r\n */\r\n public multiply(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x * otherVector.x, this.y * otherVector.y, this.z * otherVector.z, this.w * otherVector.w);\r\n }\r\n /**\r\n * Updates the given vector \"result\" with the multiplication result of the current Vector4 and the given one.\r\n * @param otherVector vector to multiple with\r\n * @param result vector to store the result\r\n * @returns result input\r\n */\r\n public multiplyToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x * otherVector.x;\r\n result.y = this.y * otherVector.y;\r\n result.z = this.z * otherVector.z;\r\n result.w = this.w * otherVector.w;\r\n return result;\r\n }\r\n /**\r\n * Returns a new Vector4 set with the multiplication result of the given floats and the current Vector4 coordinates.\r\n * @param x x value multiply with\r\n * @param y y value multiply with\r\n * @param z z value multiply with\r\n * @param w w value multiply with\r\n * @returns resulting new vector\r\n */\r\n public multiplyByFloats(x: number, y: number, z: number, w: number): this {\r\n return new (this.constructor as Constructor)(this.x * x, this.y * y, this.z * z, this.w * w);\r\n }\r\n /**\r\n * Returns a new Vector4 set with the division result of the current Vector4 by the given one.\r\n * @param otherVector vector to devide with\r\n * @returns resulting new vector\r\n */\r\n public divide(otherVector: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.x / otherVector.x, this.y / otherVector.y, this.z / otherVector.z, this.w / otherVector.w);\r\n }\r\n /**\r\n * Updates the given vector \"result\" with the division result of the current Vector4 by the given one.\r\n * @param otherVector vector to devide with\r\n * @param result vector to store the result\r\n * @returns result input\r\n */\r\n public divideToRef(otherVector: DeepImmutable, result: T): T {\r\n result.x = this.x / otherVector.x;\r\n result.y = this.y / otherVector.y;\r\n result.z = this.z / otherVector.z;\r\n result.w = this.w / otherVector.w;\r\n return result;\r\n }\r\n\r\n /**\r\n * Divides the current Vector3 coordinates by the given ones.\r\n * @param otherVector vector to devide with\r\n * @returns the updated Vector3.\r\n */\r\n public divideInPlace(otherVector: DeepImmutable): this {\r\n return this.divideToRef(otherVector, this);\r\n }\r\n\r\n /**\r\n * Updates the Vector4 coordinates with the minimum values between its own and the given vector ones\r\n * @param other defines the second operand\r\n * @returns the current updated Vector4\r\n */\r\n public minimizeInPlace(other: DeepImmutable): this {\r\n if (other.x < this.x) {\r\n this.x = other.x;\r\n }\r\n if (other.y < this.y) {\r\n this.y = other.y;\r\n }\r\n if (other.z < this.z) {\r\n this.z = other.z;\r\n }\r\n if (other.w < this.w) {\r\n this.w = other.w;\r\n }\r\n return this;\r\n }\r\n /**\r\n * Updates the Vector4 coordinates with the maximum values between its own and the given vector ones\r\n * @param other defines the second operand\r\n * @returns the current updated Vector4\r\n */\r\n public maximizeInPlace(other: DeepImmutable): this {\r\n if (other.x > this.x) {\r\n this.x = other.x;\r\n }\r\n if (other.y > this.y) {\r\n this.y = other.y;\r\n }\r\n if (other.z > this.z) {\r\n this.z = other.z;\r\n }\r\n if (other.w > this.w) {\r\n this.w = other.w;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Vector4 with the minimal coordinate values between its and the given coordinates\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @param w defines the w coordinate of the operand\r\n * @returns the current updated Vector4\r\n */\r\n public minimizeInPlaceFromFloats(x: number, y: number, z: number, w: number): this {\r\n this.x = Math.min(x, this.x);\r\n this.y = Math.min(y, this.y);\r\n this.z = Math.min(z, this.z);\r\n this.w = Math.min(w, this.w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Vector4 with the maximal coordinate values between its and the given coordinates.\r\n * @param x defines the x coordinate of the operand\r\n * @param y defines the y coordinate of the operand\r\n * @param z defines the z coordinate of the operand\r\n * @param w defines the w coordinate of the operand\r\n * @returns the current updated Vector4\r\n */\r\n public maximizeInPlaceFromFloats(x: number, y: number, z: number, w: number): this {\r\n this.x = Math.max(x, this.x);\r\n this.y = Math.max(y, this.y);\r\n this.z = Math.max(z, this.z);\r\n this.w = Math.max(w, this.w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the current Vector4's floored values and stores them in result\r\n * @param result the vector to store the result in\r\n * @returns the result vector\r\n */\r\n public floorToRef(result: T): T {\r\n result.x = Math.floor(this.x);\r\n result.y = Math.floor(this.y);\r\n result.z = Math.floor(this.z);\r\n result.w = Math.floor(this.w);\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector4 from current Vector4 floored values\r\n * @returns a new Vector4\r\n */\r\n public floor(): this {\r\n return new (this.constructor as Constructor)(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z), Math.floor(this.w));\r\n }\r\n\r\n /**\r\n * Gets the current Vector4's fractional values and stores them in result\r\n * @param result the vector to store the result in\r\n * @returns the result vector\r\n */\r\n public fractToRef(result: T): T {\r\n result.x = this.x - Math.floor(this.x);\r\n result.y = this.y - Math.floor(this.y);\r\n result.z = this.z - Math.floor(this.z);\r\n result.w = this.w - Math.floor(this.w);\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets a new Vector4 from current Vector4 fractional values\r\n * @returns a new Vector4\r\n */\r\n public fract(): this {\r\n return new (this.constructor as Constructor)(\r\n this.x - Math.floor(this.x),\r\n this.y - Math.floor(this.y),\r\n this.z - Math.floor(this.z),\r\n this.w - Math.floor(this.w)\r\n );\r\n }\r\n\r\n // Properties\r\n /**\r\n * Returns the Vector4 length (float).\r\n * @returns the length\r\n */\r\n public length(): number {\r\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\r\n }\r\n /**\r\n * Returns the Vector4 squared length (float).\r\n * @returns the length squared\r\n */\r\n public lengthSquared(): number {\r\n return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\r\n }\r\n\r\n // Methods\r\n /**\r\n * Normalizes in place the Vector4.\r\n * @returns the updated Vector4.\r\n */\r\n public normalize(): this {\r\n return this.normalizeFromLength(this.length());\r\n }\r\n\r\n /**\r\n * Normalize the current Vector4 with the given input length.\r\n * Please note that this is an in place operation.\r\n * @param len the length of the vector\r\n * @returns the current updated Vector4\r\n */\r\n public normalizeFromLength(len: number): this {\r\n if (len === 0 || len === 1.0) {\r\n return this;\r\n }\r\n\r\n return this.scaleInPlace(1.0 / len);\r\n }\r\n\r\n /**\r\n * Normalize the current Vector4 to a new vector\r\n * @returns the new Vector4\r\n */\r\n public normalizeToNew(): this {\r\n const normalized = new (this.constructor as Constructor)();\r\n this.normalizeToRef(normalized);\r\n return normalized;\r\n }\r\n\r\n /**\r\n * Normalize the current Vector4 to the reference\r\n * @param reference define the Vector4 to update\r\n * @returns the updated Vector4\r\n */\r\n public normalizeToRef(reference: T): T {\r\n const len = this.length();\r\n if (len === 0 || len === 1.0) {\r\n return reference.copyFrom(this);\r\n }\r\n\r\n return this.scaleToRef(1.0 / len, reference);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 from the Vector4 (x, y, z) coordinates.\r\n * @returns this converted to a new vector3\r\n */\r\n public toVector3(): Vector3 {\r\n return new Vector3(this.x, this.y, this.z);\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 copied from the current one.\r\n * @returns the new cloned vector\r\n */\r\n public clone(): this {\r\n return new (this.constructor as Constructor)(this.x, this.y, this.z, this.w);\r\n }\r\n /**\r\n * Updates the current Vector4 with the given one coordinates.\r\n * @param source the source vector to copy from\r\n * @returns the updated Vector4.\r\n */\r\n public copyFrom(source: DeepImmutable): this {\r\n this.x = source.x;\r\n this.y = source.y;\r\n this.z = source.z;\r\n this.w = source.w;\r\n return this;\r\n }\r\n /**\r\n * Updates the current Vector4 coordinates with the given floats.\r\n * @param x float to copy from\r\n * @param y float to copy from\r\n * @param z float to copy from\r\n * @param w float to copy from\r\n * @returns the updated Vector4.\r\n */\r\n public copyFromFloats(x: number, y: number, z: number, w: number): this {\r\n this.x = x;\r\n this.y = y;\r\n this.z = z;\r\n this.w = w;\r\n return this;\r\n }\r\n /**\r\n * Updates the current Vector4 coordinates with the given floats.\r\n * @param x float to set from\r\n * @param y float to set from\r\n * @param z float to set from\r\n * @param w float to set from\r\n * @returns the updated Vector4.\r\n */\r\n public set(x: number, y: number, z: number, w: number): this {\r\n return this.copyFromFloats(x, y, z, w);\r\n }\r\n\r\n /**\r\n * Copies the given float to the current Vector4 coordinates\r\n * @param v defines the x, y, z and w coordinates of the operand\r\n * @returns the current updated Vector4\r\n */\r\n public setAll(v: number): this {\r\n this.x = this.y = this.z = this.w = v;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the dot product (float) between the current vectors and \"otherVector\"\r\n * @param otherVector defines the right operand\r\n * @returns the dot product\r\n */\r\n public dot(otherVector: DeepImmutable): number {\r\n return this.x * otherVector.x + this.y * otherVector.y + this.z * otherVector.z + this.w * otherVector.w;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Returns a new Vector4 set from the starting index of the given array.\r\n * @param array the array to pull values from\r\n * @param offset the offset into the array to start at\r\n * @returns the new vector\r\n */\r\n public static FromArray(array: DeepImmutable>, offset?: number): Vector4 {\r\n if (!offset) {\r\n offset = 0;\r\n }\r\n return new Vector4(array[offset], array[offset + 1], array[offset + 2], array[offset + 3]);\r\n }\r\n /**\r\n * Updates the given vector \"result\" from the starting index of the given array.\r\n * @param array the array to pull values from\r\n * @param offset the offset into the array to start at\r\n * @param result the vector to store the result in\r\n * @returns result input\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number, result: T): T {\r\n result.x = array[offset];\r\n result.y = array[offset + 1];\r\n result.z = array[offset + 2];\r\n result.w = array[offset + 3];\r\n return result;\r\n }\r\n /**\r\n * Updates the given vector \"result\" from the starting index of the given Float32Array.\r\n * @param array the array to pull values from\r\n * @param offset the offset into the array to start at\r\n * @param result the vector to store the result in\r\n * @returns result input\r\n */\r\n public static FromFloatArrayToRef(array: DeepImmutable, offset: number, result: T): T {\r\n Vector4.FromArrayToRef(array, offset, result);\r\n return result;\r\n }\r\n /**\r\n * Updates the given vector \"result\" coordinates from the given floats.\r\n * @param x float to set from\r\n * @param y float to set from\r\n * @param z float to set from\r\n * @param w float to set from\r\n * @param result the vector to the floats in\r\n * @returns result input\r\n */\r\n public static FromFloatsToRef(x: number, y: number, z: number, w: number, result: T): T {\r\n result.x = x;\r\n result.y = y;\r\n result.z = z;\r\n result.w = w;\r\n return result;\r\n }\r\n /**\r\n * Returns a new Vector4 set to (0.0, 0.0, 0.0, 0.0)\r\n * @returns the new vector\r\n */\r\n public static Zero(): Vector4 {\r\n return new Vector4(0.0, 0.0, 0.0, 0.0);\r\n }\r\n /**\r\n * Returns a new Vector4 set to (1.0, 1.0, 1.0, 1.0)\r\n * @returns the new vector\r\n */\r\n public static One(): Vector4 {\r\n return new Vector4(1.0, 1.0, 1.0, 1.0);\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @returns a Vector4 with random values between min and max\r\n */\r\n public static Random(min: number = 0, max: number = 1): Vector4 {\r\n return new Vector4(RandomRange(min, max), RandomRange(min, max), RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Sets a Vector4 with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @param ref the ref to store the values in\r\n * @returns the ref with random values between min and max\r\n */\r\n public static RandomToRef(min: number = 0, max: number = 1, ref: T): T {\r\n return ref.copyFromFloats(RandomRange(min, max), RandomRange(min, max), RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\r\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\r\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\r\n * @param value defines the current value\r\n * @param min defines the lower range value\r\n * @param max defines the upper range value\r\n * @returns the new Vector4\r\n */\r\n public static Clamp(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable): T {\r\n const result = new (value.constructor as Constructor)();\r\n Vector4.ClampToRef(value, min, max, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the coordinates of \"value\", if the vector \"value\" is in the cube defined by the vectors \"min\" and \"max\"\r\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\r\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\r\n * @param value defines the current value\r\n * @param min defines the lower range value\r\n * @param max defines the upper range value\r\n * @param result defines the Vector4 where to store the result\r\n * @returns result input\r\n */\r\n public static ClampToRef(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable, result: T): T {\r\n return result.copyFromFloats(Clamp(value.x, min.x, max.x), Clamp(value.y, min.y, max.y), Clamp(value.z, min.z, max.z), Clamp(value.w, min.w, max.w));\r\n }\r\n\r\n /**\r\n * Checks if a given vector is inside a specific range\r\n * Example Playground https://playground.babylonjs.com/#R1F8YU#75\r\n * @param v defines the vector to test\r\n * @param min defines the minimum range\r\n * @param max defines the maximum range\r\n */\r\n public static CheckExtends(v: Vector4, min: Vector4, max: Vector4): void {\r\n min.minimizeInPlace(v);\r\n max.maximizeInPlace(v);\r\n }\r\n\r\n /**\r\n * Gets a zero Vector4 that must not be updated\r\n */\r\n public static get ZeroReadOnly(): DeepImmutable {\r\n return Vector4._ZeroReadOnly;\r\n }\r\n /**\r\n * Returns a new normalized Vector4 from the given one.\r\n * @param vector the vector to normalize\r\n * @returns the vector\r\n */\r\n public static Normalize(vector: DeepImmutable): Vector4 {\r\n const result = Vector4.Zero();\r\n Vector4.NormalizeToRef(vector, result);\r\n return result;\r\n }\r\n /**\r\n * Updates the given vector \"result\" from the normalization of the given one.\r\n * @param vector the vector to normalize\r\n * @param result the vector to store the result in\r\n * @returns result input\r\n */\r\n public static NormalizeToRef(vector: DeepImmutable, result: T): T {\r\n vector.normalizeToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a vector with the minimum values from the left and right vectors\r\n * @param left left vector to minimize\r\n * @param right right vector to minimize\r\n * @returns a new vector with the minimum of the left and right vector values\r\n */\r\n public static Minimize(left: DeepImmutable, right: DeepImmutable): T {\r\n const min = new (left.constructor as Constructor)();\r\n min.copyFrom(left);\r\n min.minimizeInPlace(right);\r\n return min;\r\n }\r\n\r\n /**\r\n * Returns a vector with the maximum values from the left and right vectors\r\n * @param left left vector to maximize\r\n * @param right right vector to maximize\r\n * @returns a new vector with the maximum of the left and right vector values\r\n */\r\n public static Maximize(left: DeepImmutable, right: DeepImmutable): T {\r\n const max = new (left.constructor as Constructor)();\r\n max.copyFrom(left);\r\n max.maximizeInPlace(right);\r\n return max;\r\n }\r\n /**\r\n * Returns the distance (float) between the vectors \"value1\" and \"value2\".\r\n * @param value1 value to calulate the distance between\r\n * @param value2 value to calulate the distance between\r\n * @returns the distance between the two vectors\r\n */\r\n public static Distance(value1: DeepImmutable, value2: DeepImmutable): number {\r\n return Math.sqrt(Vector4.DistanceSquared(value1, value2));\r\n }\r\n /**\r\n * Returns the squared distance (float) between the vectors \"value1\" and \"value2\".\r\n * @param value1 value to calulate the distance between\r\n * @param value2 value to calulate the distance between\r\n * @returns the distance between the two vectors squared\r\n */\r\n public static DistanceSquared(value1: DeepImmutable, value2: DeepImmutable): number {\r\n const x = value1.x - value2.x;\r\n const y = value1.y - value2.y;\r\n const z = value1.z - value2.z;\r\n const w = value1.w - value2.w;\r\n\r\n return x * x + y * y + z * z + w * w;\r\n }\r\n /**\r\n * Returns a new Vector4 located at the center between the vectors \"value1\" and \"value2\".\r\n * @param value1 value to calulate the center between\r\n * @param value2 value to calulate the center between\r\n * @returns the center between the two vectors\r\n */\r\n public static Center(value1: DeepImmutable, value2: DeepImmutable): Vector4 {\r\n return Vector4.CenterToRef(value1, value2, Vector4.Zero());\r\n }\r\n\r\n /**\r\n * Gets the center of the vectors \"value1\" and \"value2\" and stores the result in the vector \"ref\"\r\n * @param value1 defines first vector\r\n * @param value2 defines second vector\r\n * @param ref defines third vector\r\n * @returns ref\r\n */\r\n public static CenterToRef(value1: DeepImmutable, value2: DeepImmutable, ref: T): T {\r\n return ref.copyFromFloats((value1.x + value2.x) / 2, (value1.y + value2.y) / 2, (value1.z + value2.z) / 2, (value1.w + value2.w) / 2);\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the result of the transformation by the given matrix of the given vector.\r\n * This method computes tranformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\r\n * The difference with Vector3.TransformCoordinates is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead\r\n * @param vector defines the Vector3 to transform\r\n * @param transformation defines the transformation matrix\r\n * @returns the transformed Vector4\r\n */\r\n public static TransformCoordinates(vector: DeepImmutable, transformation: DeepImmutable): Vector4 {\r\n const result = Vector4.Zero();\r\n Vector4.TransformCoordinatesToRef(vector, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given vector\r\n * This method computes tranformed coordinates only, not transformed direction vectors (ie. it takes translation in account)\r\n * The difference with Vector3.TransformCoordinatesToRef is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead\r\n * @param vector defines the Vector3 to transform\r\n * @param transformation defines the transformation matrix\r\n * @param result defines the Vector4 where to store the result\r\n * @returns result input\r\n */\r\n public static TransformCoordinatesToRef(vector: DeepImmutable, transformation: DeepImmutable, result: T): T {\r\n Vector4.TransformCoordinatesFromFloatsToRef(vector._x, vector._y, vector._z, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" coordinates with the result of the transformation by the given matrix of the given floats (x, y, z)\r\n * This method computes tranformed coordinates only, not transformed direction vectors\r\n * The difference with Vector3.TransformCoordinatesFromFloatsToRef is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead\r\n * @param x define the x coordinate of the source vector\r\n * @param y define the y coordinate of the source vector\r\n * @param z define the z coordinate of the source vector\r\n * @param transformation defines the transformation matrix\r\n * @param result defines the Vector4 where to store the result\r\n * @returns result input\r\n */\r\n public static TransformCoordinatesFromFloatsToRef(x: number, y: number, z: number, transformation: DeepImmutable, result: T): T {\r\n const m = transformation.m;\r\n const rx = x * m[0] + y * m[4] + z * m[8] + m[12];\r\n const ry = x * m[1] + y * m[5] + z * m[9] + m[13];\r\n const rz = x * m[2] + y * m[6] + z * m[10] + m[14];\r\n const rw = x * m[3] + y * m[7] + z * m[11] + m[15];\r\n\r\n result.x = rx;\r\n result.y = ry;\r\n result.z = rz;\r\n result.w = rw;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Vector4 set with the result of the normal transformation by the given matrix of the given vector.\r\n * This methods computes transformed normalized direction vectors only.\r\n * @param vector the vector to transform\r\n * @param transformation the transformation matrix to apply\r\n * @returns the new vector\r\n */\r\n public static TransformNormal(vector: DeepImmutable, transformation: DeepImmutable): T {\r\n const result = new (vector.constructor as Constructor)();\r\n Vector4.TransformNormalToRef(vector, transformation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given vector.\r\n * This methods computes transformed normalized direction vectors only.\r\n * @param vector the vector to transform\r\n * @param transformation the transformation matrix to apply\r\n * @param result the vector to store the result in\r\n * @returns result input\r\n */\r\n public static TransformNormalToRef(vector: DeepImmutable, transformation: DeepImmutable, result: T): T {\r\n const m = transformation.m;\r\n const x = vector.x * m[0] + vector.y * m[4] + vector.z * m[8];\r\n const y = vector.x * m[1] + vector.y * m[5] + vector.z * m[9];\r\n const z = vector.x * m[2] + vector.y * m[6] + vector.z * m[10];\r\n result.x = x;\r\n result.y = y;\r\n result.z = z;\r\n result.w = vector.w;\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector \"result\" with the result of the normal transformation by the given matrix of the given floats (x, y, z, w).\r\n * This methods computes transformed normalized direction vectors only.\r\n * @param x value to transform\r\n * @param y value to transform\r\n * @param z value to transform\r\n * @param w value to transform\r\n * @param transformation the transformation matrix to apply\r\n * @param result the vector to store the results in\r\n * @returns result input\r\n */\r\n public static TransformNormalFromFloatsToRef(x: number, y: number, z: number, w: number, transformation: DeepImmutable, result: T): T {\r\n const m = transformation.m;\r\n result.x = x * m[0] + y * m[4] + z * m[8];\r\n result.y = x * m[1] + y * m[5] + z * m[9];\r\n result.z = x * m[2] + y * m[6] + z * m[10];\r\n result.w = w;\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new Vector4 from a Vector3\r\n * @param source defines the source data\r\n * @param w defines the 4th component (default is 0)\r\n * @returns a new Vector4\r\n */\r\n public static FromVector3(source: Vector3, w: number = 0) {\r\n return new Vector4(source._x, source._y, source._z, w);\r\n }\r\n\r\n /**\r\n * Returns the dot product (float) between the vectors \"left\" and \"right\"\r\n * @param left defines the left operand\r\n * @param right defines the right operand\r\n * @returns the dot product\r\n */\r\n public static Dot(left: DeepImmutable, right: DeepImmutable): number {\r\n return left.dot(right);\r\n }\r\n}\r\nVector4 satisfies VectorStatic;\r\nObject.defineProperties(Vector4.prototype, {\r\n dimension: { value: [4] },\r\n rank: { value: 1 },\r\n});\r\n\r\n/**\r\n * Class used to store quaternion data\r\n * Example Playground - Overview - https://playground.babylonjs.com/#L49EJ7#100\r\n * @see https://en.wikipedia.org/wiki/Quaternion\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms\r\n */\r\nexport class Quaternion implements Tensor>, IQuaternionLike {\r\n /** @internal */\r\n public _x: number;\r\n\r\n /** @internal */\r\n public _y: number;\r\n\r\n /** @internal */\r\n public _z: number;\r\n\r\n /** @internal */\r\n public _w: number;\r\n\r\n /** @internal */\r\n public _isDirty = true;\r\n\r\n /** Gets or sets the x coordinate */\r\n public get x() {\r\n return this._x;\r\n }\r\n\r\n public set x(value: number) {\r\n this._x = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /** Gets or sets the y coordinate */\r\n public get y() {\r\n return this._y;\r\n }\r\n\r\n public set y(value: number) {\r\n this._y = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /** Gets or sets the z coordinate */\r\n public get z() {\r\n return this._z;\r\n }\r\n\r\n public set z(value: number) {\r\n this._z = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /** Gets or sets the w coordinate */\r\n public get w() {\r\n return this._w;\r\n }\r\n\r\n public set w(value: number) {\r\n this._w = value;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: Readonly<[4]>;\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 1;\r\n\r\n /**\r\n * Creates a new Quaternion from the given floats\r\n * @param x defines the first component (0 by default)\r\n * @param y defines the second component (0 by default)\r\n * @param z defines the third component (0 by default)\r\n * @param w defines the fourth component (1.0 by default)\r\n */\r\n constructor(x: number = 0.0, y: number = 0.0, z: number = 0.0, w: number = 1.0) {\r\n this._x = x;\r\n this._y = y;\r\n this._z = z;\r\n this._w = w;\r\n }\r\n\r\n /**\r\n * Gets a string representation for the current quaternion\r\n * @returns a string with the Quaternion coordinates\r\n */\r\n public toString(): string {\r\n return `{X: ${this._x} Y: ${this._y} Z: ${this._z} W: ${this._w}}`;\r\n }\r\n\r\n /**\r\n * Gets the class name of the quaternion\r\n * @returns the string \"Quaternion\"\r\n */\r\n public getClassName(): string {\r\n return \"Quaternion\";\r\n }\r\n\r\n /**\r\n * Gets a hash code for this quaternion\r\n * @returns the quaternion hash code\r\n */\r\n public getHashCode(): number {\r\n const x = _ExtractAsInt(this._x);\r\n const y = _ExtractAsInt(this._y);\r\n const z = _ExtractAsInt(this._z);\r\n const w = _ExtractAsInt(this._w);\r\n\r\n let hash = x;\r\n hash = (hash * 397) ^ y;\r\n hash = (hash * 397) ^ z;\r\n hash = (hash * 397) ^ w;\r\n return hash;\r\n }\r\n\r\n /**\r\n * Copy the quaternion to an array\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#13\r\n * @returns a new array populated with 4 elements from the quaternion coordinates\r\n */\r\n public asArray(): Tuple {\r\n return [this._x, this._y, this._z, this._w];\r\n }\r\n\r\n /**\r\n * Stores from the starting index in the given array the Quaternion successive values\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#59\r\n * @param array defines the array where to store the x,y,z,w components\r\n * @param index defines an optional index in the target array to define where to start storing values\r\n * @returns the current Quaternion object\r\n */\r\n public toArray(array: FloatArray, index: number = 0): this {\r\n array[index] = this._x;\r\n array[index + 1] = this._y;\r\n array[index + 2] = this._z;\r\n array[index + 3] = this._w;\r\n return this;\r\n }\r\n\r\n public fromArray(array: FloatArray, index: number = 0): this {\r\n return Quaternion.FromArrayToRef(array, index, this);\r\n }\r\n\r\n /**\r\n * Check if two quaternions are equals\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#38\r\n * @param otherQuaternion defines the second operand\r\n * @returns true if the current quaternion and the given one coordinates are strictly equals\r\n */\r\n public equals(otherQuaternion: DeepImmutable): boolean {\r\n return otherQuaternion && this._x === otherQuaternion._x && this._y === otherQuaternion._y && this._z === otherQuaternion._z && this._w === otherQuaternion._w;\r\n }\r\n\r\n /**\r\n * Gets a boolean if two quaternions are equals (using an epsilon value)\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#37\r\n * @param otherQuaternion defines the other quaternion\r\n * @param epsilon defines the minimal distance to consider equality\r\n * @returns true if the given quaternion coordinates are close to the current ones by a distance of epsilon.\r\n */\r\n public equalsWithEpsilon(otherQuaternion: DeepImmutable, epsilon: number = Epsilon): boolean {\r\n return (\r\n otherQuaternion &&\r\n WithinEpsilon(this._x, otherQuaternion._x, epsilon) &&\r\n WithinEpsilon(this._y, otherQuaternion._y, epsilon) &&\r\n WithinEpsilon(this._z, otherQuaternion._z, epsilon) &&\r\n WithinEpsilon(this._w, otherQuaternion._w, epsilon)\r\n );\r\n }\r\n\r\n /**\r\n * Clone the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#12\r\n * @returns a new quaternion copied from the current one\r\n */\r\n public clone(): this {\r\n return new (this.constructor as Constructor)(this._x, this._y, this._z, this._w);\r\n }\r\n\r\n /**\r\n * Copy a quaternion to the current one\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#86\r\n * @param other defines the other quaternion\r\n * @returns the updated current quaternion\r\n */\r\n public copyFrom(other: DeepImmutable): this {\r\n this._x = other._x;\r\n this._y = other._y;\r\n this._z = other._z;\r\n this._w = other._w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current quaternion with the given float coordinates\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#87\r\n * @param x defines the x coordinate\r\n * @param y defines the y coordinate\r\n * @param z defines the z coordinate\r\n * @param w defines the w coordinate\r\n * @returns the updated current quaternion\r\n */\r\n public copyFromFloats(x: number, y: number, z: number, w: number): this {\r\n this._x = x;\r\n this._y = y;\r\n this._z = z;\r\n this._w = w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current quaternion from the given float coordinates\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#56\r\n * @param x defines the x coordinate\r\n * @param y defines the y coordinate\r\n * @param z defines the z coordinate\r\n * @param w defines the w coordinate\r\n * @returns the updated current quaternion\r\n */\r\n public set(x: number, y: number, z: number, w: number): this {\r\n return this.copyFromFloats(x, y, z, w);\r\n }\r\n\r\n public setAll(value: number): this {\r\n return this.copyFromFloats(value, value, value, value);\r\n }\r\n\r\n /**\r\n * Adds two quaternions\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#10\r\n * @param other defines the second operand\r\n * @returns a new quaternion as the addition result of the given one and the current quaternion\r\n */\r\n public add(other: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this._x + other._x, this._y + other._y, this._z + other._z, this._w + other._w);\r\n }\r\n\r\n /**\r\n * Add a quaternion to the current one\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#11\r\n * @param other defines the quaternion to add\r\n * @returns the current quaternion\r\n */\r\n public addInPlace(other: DeepImmutable): this {\r\n this._x += other._x;\r\n this._y += other._y;\r\n this._z += other._z;\r\n this._w += other._w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n public addToRef(other: DeepImmutable, result: T): T {\r\n result._x = this._x + other._x;\r\n result._y = this._y + other._y;\r\n result._z = this._z + other._z;\r\n result._w = this._w + other._w;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n public addInPlaceFromFloats(x: number, y: number, z: number, w: number): this {\r\n this._x += x;\r\n this._y += y;\r\n this._z += z;\r\n this._w += w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n public subtractToRef(other: DeepImmutable, result: T): T {\r\n result._x = this._x - other._x;\r\n result._y = this._y - other._y;\r\n result._z = this._z - other._z;\r\n result._w = this._w - other._w;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n public subtractFromFloats(x: number, y: number, z: number, w: number): this {\r\n return this.subtractFromFloatsToRef(x, y, z, w, new (this.constructor as Constructor)());\r\n }\r\n\r\n public subtractFromFloatsToRef(x: number, y: number, z: number, w: number, result: T): T {\r\n result._x = this._x - x;\r\n result._y = this._y - y;\r\n result._z = this._z - z;\r\n result._w = this._w - w;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Subtract two quaternions\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#57\r\n * @param other defines the second operand\r\n * @returns a new quaternion as the subtraction result of the given one from the current one\r\n */\r\n public subtract(other: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this._x - other._x, this._y - other._y, this._z - other._z, this._w - other._w);\r\n }\r\n\r\n /**\r\n * Subtract a quaternion to the current one\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#58\r\n * @param other defines the quaternion to subtract\r\n * @returns the current quaternion\r\n */\r\n public subtractInPlace(other: DeepImmutable): this {\r\n this._x -= other._x;\r\n this._y -= other._y;\r\n this._z -= other._z;\r\n this._w -= other._w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiplies the current quaternion by a scale factor\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#88\r\n * @param value defines the scale factor\r\n * @returns a new quaternion set by multiplying the current quaternion coordinates by the float \"scale\"\r\n */\r\n public scale(value: number): this {\r\n return new (this.constructor as Constructor)(this._x * value, this._y * value, this._z * value, this._w * value);\r\n }\r\n\r\n /**\r\n * Scale the current quaternion values by a factor and stores the result to a given quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#89\r\n * @param scale defines the scale factor\r\n * @param result defines the Quaternion object where to store the result\r\n * @returns result input\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n result._x = this._x * scale;\r\n result._y = this._y * scale;\r\n result._z = this._z * scale;\r\n result._w = this._w * scale;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Multiplies in place the current quaternion by a scale factor\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#90\r\n * @param value defines the scale factor\r\n * @returns the current modified quaternion\r\n */\r\n public scaleInPlace(value: number): this {\r\n this._x *= value;\r\n this._y *= value;\r\n this._z *= value;\r\n this._w *= value;\r\n this._isDirty = true;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Scale the current quaternion values by a factor and add the result to a given quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#91\r\n * @param scale defines the scale factor\r\n * @param result defines the Quaternion object where to store the result\r\n * @returns result input\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n result._x += this._x * scale;\r\n result._y += this._y * scale;\r\n result._z += this._z * scale;\r\n result._w += this._w * scale;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Multiplies two quaternions\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#43\r\n * @param q1 defines the second operand\r\n * @returns a new quaternion set as the multiplication result of the current one with the given one \"q1\"\r\n */\r\n public multiply(q1: DeepImmutable): this {\r\n const result = new (this.constructor as Constructor)(0, 0, 0, 1.0);\r\n this.multiplyToRef(q1, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given \"result\" as the multiplication result of the current one with the given one \"q1\"\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#45\r\n * @param q1 defines the second operand\r\n * @param result defines the target quaternion\r\n * @returns the current quaternion\r\n */\r\n public multiplyToRef(q1: DeepImmutable, result: T): T {\r\n const x = this._x * q1._w + this._y * q1._z - this._z * q1._y + this._w * q1._x;\r\n const y = -this._x * q1._z + this._y * q1._w + this._z * q1._x + this._w * q1._y;\r\n const z = this._x * q1._y - this._y * q1._x + this._z * q1._w + this._w * q1._z;\r\n const w = -this._x * q1._x - this._y * q1._y - this._z * q1._z + this._w * q1._w;\r\n result.copyFromFloats(x, y, z, w);\r\n return result;\r\n }\r\n\r\n /**\r\n * Updates the current quaternion with the multiplication of itself with the given one \"q1\"\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#46\r\n * @param other defines the second operand\r\n * @returns the currentupdated quaternion\r\n */\r\n public multiplyInPlace(other: DeepImmutable): this {\r\n return this.multiplyToRef(other, this);\r\n }\r\n\r\n public multiplyByFloats(x: number, y: number, z: number, w: number): this {\r\n this._x *= x;\r\n this._y *= y;\r\n this._z *= z;\r\n this._w *= w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divide(_other: DeepImmutable): this {\r\n throw new ReferenceError(\"Can not divide a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divideToRef(_other: DeepImmutable, _result: T): T {\r\n throw new ReferenceError(\"Can not divide a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divideInPlace(_other: DeepImmutable): this {\r\n throw new ReferenceError(\"Can not divide a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public minimizeInPlace(): this {\r\n throw new ReferenceError(\"Can not minimize a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public minimizeInPlaceFromFloats(): this {\r\n throw new ReferenceError(\"Can not minimize a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public maximizeInPlace(): this {\r\n throw new ReferenceError(\"Can not maximize a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public maximizeInPlaceFromFloats(): this {\r\n throw new ReferenceError(\"Can not maximize a quaternion\");\r\n }\r\n\r\n public negate(): this {\r\n return this.negateToRef(new (this.constructor as Constructor)());\r\n }\r\n\r\n public negateInPlace(): this {\r\n this._x = -this._x;\r\n this._y = -this._y;\r\n this._z = -this._z;\r\n this._w = -this._w;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n public negateToRef(result: T): T {\r\n result._x = -this._x;\r\n result._y = -this._y;\r\n result._z = -this._z;\r\n result._w = -this._w;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n public equalsToFloats(x: number, y: number, z: number, w: number): boolean {\r\n return this._x === x && this._y === y && this._z === z && this._w === w;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public floorToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not floor a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public floor(): this {\r\n throw new ReferenceError(\"Can not floor a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public fractToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not fract a quaternion\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public fract(): this {\r\n throw new ReferenceError(\"Can not fract a quaternion\");\r\n }\r\n\r\n /**\r\n * Conjugates the current quaternion and stores the result in the given quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#81\r\n * @param ref defines the target quaternion\r\n * @returns result input\r\n */\r\n public conjugateToRef(ref: T): T {\r\n ref.copyFromFloats(-this._x, -this._y, -this._z, this._w);\r\n return ref;\r\n }\r\n\r\n /**\r\n * Conjugates in place the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#82\r\n * @returns the current updated quaternion\r\n */\r\n public conjugateInPlace(): this {\r\n this._x *= -1;\r\n this._y *= -1;\r\n this._z *= -1;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Conjugates (1-q) the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#83\r\n * @returns a new quaternion\r\n */\r\n public conjugate(): this {\r\n return new (this.constructor as Constructor)(-this._x, -this._y, -this._z, this._w);\r\n }\r\n\r\n /**\r\n * Returns the inverse of the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#84\r\n * @returns a new quaternion\r\n */\r\n public invert(): this {\r\n const conjugate = this.conjugate();\r\n const lengthSquared = this.lengthSquared();\r\n if (lengthSquared == 0 || lengthSquared == 1) {\r\n return conjugate;\r\n }\r\n conjugate.scaleInPlace(1 / lengthSquared);\r\n return conjugate;\r\n }\r\n\r\n /**\r\n * Invert in place the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#85\r\n * @returns this quaternion\r\n */\r\n public invertInPlace(): this {\r\n this.conjugateInPlace();\r\n const lengthSquared = this.lengthSquared();\r\n if (lengthSquared == 0 || lengthSquared == 1) {\r\n return this;\r\n }\r\n this.scaleInPlace(1 / lengthSquared);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets squared length of current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#29\r\n * @returns the quaternion length (float)\r\n */\r\n public lengthSquared(): number {\r\n return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\r\n }\r\n\r\n /**\r\n * Gets length of current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#28\r\n * @returns the quaternion length (float)\r\n */\r\n public length(): number {\r\n return Math.sqrt(this.lengthSquared());\r\n }\r\n\r\n /**\r\n * Normalize in place the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#54\r\n * @returns the current updated quaternion\r\n */\r\n public normalize(): this {\r\n return this.normalizeFromLength(this.length());\r\n }\r\n\r\n /**\r\n * Normalize the current quaternion with the given input length.\r\n * Please note that this is an in place operation.\r\n * @param len the length of the quaternion\r\n * @returns the current updated Quaternion\r\n */\r\n public normalizeFromLength(len: number): this {\r\n if (len === 0 || len === 1.0) {\r\n return this;\r\n }\r\n\r\n return this.scaleInPlace(1.0 / len);\r\n }\r\n\r\n /**\r\n * Normalize a copy of the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#55\r\n * @returns the normalized quaternion\r\n */\r\n public normalizeToNew(): this {\r\n const normalized = new (this.constructor as Constructor)(0, 0, 0, 1);\r\n this.normalizeToRef(normalized);\r\n return normalized;\r\n }\r\n\r\n /**\r\n * Normalize the current Quaternion to the reference\r\n * @param reference define the Quaternion to update\r\n * @returns the updated Quaternion\r\n */\r\n public normalizeToRef(reference: T): T {\r\n const len = this.length();\r\n if (len === 0 || len === 1.0) {\r\n return reference.copyFromFloats(this._x, this._y, this._z, this._w);\r\n }\r\n\r\n return this.scaleToRef(1.0 / len, reference);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the Euler angles translated from the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#32\r\n * @returns a new Vector3 containing the Euler angles\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/rotation_conventions\r\n */\r\n public toEulerAngles(): Vector3 {\r\n const result = Vector3.Zero();\r\n this.toEulerAnglesToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given vector3 \"result\" with the Euler angles translated from the current quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#31\r\n * @param result defines the vector which will be filled with the Euler angles\r\n * @returns result input\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/rotation_conventions\r\n */\r\n public toEulerAnglesToRef(result: T): T {\r\n const qz = this._z;\r\n const qx = this._x;\r\n const qy = this._y;\r\n const qw = this._w;\r\n\r\n const zAxisY = qy * qz - qx * qw;\r\n const limit = 0.4999999;\r\n\r\n if (zAxisY < -limit) {\r\n result._y = 2 * Math.atan2(qy, qw);\r\n result._x = Math.PI / 2;\r\n result._z = 0;\r\n result._isDirty = true;\r\n } else if (zAxisY > limit) {\r\n result._y = 2 * Math.atan2(qy, qw);\r\n result._x = -Math.PI / 2;\r\n result._z = 0;\r\n result._isDirty = true;\r\n } else {\r\n const sqw = qw * qw;\r\n const sqz = qz * qz;\r\n const sqx = qx * qx;\r\n const sqy = qy * qy;\r\n result._z = Math.atan2(2.0 * (qx * qy + qz * qw), -sqz - sqx + sqy + sqw);\r\n result._x = Math.asin(-2.0 * zAxisY);\r\n result._y = Math.atan2(2.0 * (qz * qx + qy * qw), sqz - sqx - sqy + sqw);\r\n result._isDirty = true;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Updates the given rotation matrix with the current quaternion values\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#67\r\n * @param result defines the target matrix\r\n * @returns the updated matrix with the rotation\r\n */\r\n public toRotationMatrix(result: T): T {\r\n Matrix.FromQuaternionToRef(this, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Updates the current quaternion from the given rotation matrix values\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#41\r\n * @param matrix defines the source matrix\r\n * @returns the current updated quaternion\r\n */\r\n public fromRotationMatrix(matrix: DeepImmutable): this {\r\n Quaternion.FromRotationMatrixToRef(matrix, this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the dot product (float) between the current quaternions and \"other\"\r\n * @param other defines the right operand\r\n * @returns the dot product\r\n */\r\n public dot(other: DeepImmutable): number {\r\n return this._x * other._x + this._y * other._y + this._z * other._z + this._w * other._w;\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Creates a new quaternion from a rotation matrix\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#101\r\n * @param matrix defines the source matrix\r\n * @returns a new quaternion created from the given rotation matrix values\r\n */\r\n public static FromRotationMatrix(matrix: DeepImmutable): Quaternion {\r\n const result = new Quaternion();\r\n Quaternion.FromRotationMatrixToRef(matrix, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Updates the given quaternion with the given rotation matrix values\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#102\r\n * @param matrix defines the source matrix\r\n * @param result defines the target quaternion\r\n * @returns result input\r\n */\r\n public static FromRotationMatrixToRef(matrix: DeepImmutable, result: T): T {\r\n const data = matrix.m;\r\n const m11 = data[0],\r\n m12 = data[4],\r\n m13 = data[8];\r\n const m21 = data[1],\r\n m22 = data[5],\r\n m23 = data[9];\r\n const m31 = data[2],\r\n m32 = data[6],\r\n m33 = data[10];\r\n const trace = m11 + m22 + m33;\r\n let s;\r\n\r\n if (trace > 0) {\r\n s = 0.5 / Math.sqrt(trace + 1.0);\r\n\r\n result._w = 0.25 / s;\r\n result._x = (m32 - m23) * s;\r\n result._y = (m13 - m31) * s;\r\n result._z = (m21 - m12) * s;\r\n result._isDirty = true;\r\n } else if (m11 > m22 && m11 > m33) {\r\n s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\r\n\r\n result._w = (m32 - m23) / s;\r\n result._x = 0.25 * s;\r\n result._y = (m12 + m21) / s;\r\n result._z = (m13 + m31) / s;\r\n result._isDirty = true;\r\n } else if (m22 > m33) {\r\n s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\r\n\r\n result._w = (m13 - m31) / s;\r\n result._x = (m12 + m21) / s;\r\n result._y = 0.25 * s;\r\n result._z = (m23 + m32) / s;\r\n result._isDirty = true;\r\n } else {\r\n s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\r\n\r\n result._w = (m21 - m12) / s;\r\n result._x = (m13 + m31) / s;\r\n result._y = (m23 + m32) / s;\r\n result._z = 0.25 * s;\r\n result._isDirty = true;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns the dot product (float) between the quaternions \"left\" and \"right\"\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#61\r\n * @param left defines the left operand\r\n * @param right defines the right operand\r\n * @returns the dot product\r\n */\r\n public static Dot(left: DeepImmutable, right: DeepImmutable): number {\r\n return left._x * right._x + left._y * right._y + left._z * right._z + left._w * right._w;\r\n }\r\n\r\n /**\r\n * Checks if the orientations of two rotation quaternions are close to each other\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#60\r\n * @param quat0 defines the first quaternion to check\r\n * @param quat1 defines the second quaternion to check\r\n * @param epsilon defines closeness, 0 same orientation, 1 PI apart, default 0.1\r\n * @returns true if the two quaternions are close to each other within epsilon\r\n */\r\n public static AreClose(quat0: DeepImmutable, quat1: DeepImmutable, epsilon: number = 0.1): boolean {\r\n const dot = Quaternion.Dot(quat0, quat1);\r\n\r\n return 1 - dot * dot <= epsilon;\r\n }\r\n\r\n /**\r\n * Smooth interpolation between two quaternions using Slerp\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#93\r\n * @param source source quaternion\r\n * @param goal goal quaternion\r\n * @param deltaTime current interpolation frame\r\n * @param lerpTime total interpolation time\r\n * @param result the smoothed quaternion\r\n * @returns the smoothed quaternion\r\n */\r\n public static SmoothToRef(source: Quaternion, goal: Quaternion, deltaTime: number, lerpTime: number, result: T): T {\r\n let slerp = lerpTime === 0 ? 1 : deltaTime / lerpTime;\r\n slerp = Clamp(slerp, 0, 1);\r\n\r\n Quaternion.SlerpToRef(source, goal, slerp, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an empty quaternion\r\n * @returns a new quaternion set to (0.0, 0.0, 0.0)\r\n */\r\n public static Zero(): Quaternion {\r\n return new Quaternion(0.0, 0.0, 0.0, 0.0);\r\n }\r\n\r\n /**\r\n * Inverse a given quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#103\r\n * @param q defines the source quaternion\r\n * @returns a new quaternion as the inverted current quaternion\r\n */\r\n public static Inverse(q: DeepImmutable): T {\r\n return new (q.constructor as Constructor)(-q._x, -q._y, -q._z, q._w);\r\n }\r\n\r\n /**\r\n * Inverse a given quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#104\r\n * @param q defines the source quaternion\r\n * @param result the quaternion the result will be stored in\r\n * @returns the result quaternion\r\n */\r\n public static InverseToRef(q: Quaternion, result: T): T {\r\n result.set(-q._x, -q._y, -q._z, q._w);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an identity quaternion\r\n * @returns the identity quaternion\r\n */\r\n public static Identity(): Quaternion {\r\n return new Quaternion(0.0, 0.0, 0.0, 1.0);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the given quaternion is identity\r\n * @param quaternion defines the quaternion to check\r\n * @returns true if the quaternion is identity\r\n */\r\n public static IsIdentity(quaternion: DeepImmutable): boolean {\r\n return quaternion && quaternion._x === 0 && quaternion._y === 0 && quaternion._z === 0 && quaternion._w === 1;\r\n }\r\n\r\n /**\r\n * Creates a quaternion from a rotation around an axis\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#72\r\n * @param axis defines the axis to use\r\n * @param angle defines the angle to use\r\n * @returns a new quaternion created from the given axis (Vector3) and angle in radians (float)\r\n */\r\n public static RotationAxis(axis: DeepImmutable, angle: number): Quaternion {\r\n return Quaternion.RotationAxisToRef(axis, angle, new Quaternion());\r\n }\r\n\r\n /**\r\n * Creates a rotation around an axis and stores it into the given quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#73\r\n * @param axis defines the axis to use\r\n * @param angle defines the angle to use\r\n * @param result defines the target quaternion\r\n * @returns the target quaternion\r\n */\r\n public static RotationAxisToRef(axis: DeepImmutable, angle: number, result: T): T {\r\n const sin = Math.sin(angle / 2);\r\n axis.normalize();\r\n result._w = Math.cos(angle / 2);\r\n result._x = axis._x * sin;\r\n result._y = axis._y * sin;\r\n result._z = axis._z * sin;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new quaternion from data stored into an array\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#63\r\n * @param array defines the data source\r\n * @param offset defines the offset in the source array where the data starts\r\n * @returns a new quaternion\r\n */\r\n public static FromArray(array: DeepImmutable>, offset?: number): Quaternion {\r\n if (!offset) {\r\n offset = 0;\r\n }\r\n return new Quaternion(array[offset], array[offset + 1], array[offset + 2], array[offset + 3]);\r\n }\r\n\r\n /**\r\n * Updates the given quaternion \"result\" from the starting index of the given array.\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#64\r\n * @param array the array to pull values from\r\n * @param offset the offset into the array to start at\r\n * @param result the quaternion to store the result in\r\n * @returns result input\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number, result: T): T {\r\n result._x = array[offset];\r\n result._y = array[offset + 1];\r\n result._z = array[offset + 2];\r\n result._w = array[offset + 3];\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given quaternion \"result\" with the given floats.\r\n * @param x defines the x coordinate of the source\r\n * @param y defines the y coordinate of the source\r\n * @param z defines the z coordinate of the source\r\n * @param w defines the w coordinate of the source\r\n * @param result defines the quaternion where to store the result\r\n * @returns the result quaternion\r\n */\r\n public static FromFloatsToRef(x: number, y: number, z: number, w: number, result: T): T {\r\n result.copyFromFloats(x, y, z, w);\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a quaternion from Euler rotation angles\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#33\r\n * @param x Pitch\r\n * @param y Yaw\r\n * @param z Roll\r\n * @returns the new Quaternion\r\n */\r\n public static FromEulerAngles(x: number, y: number, z: number): Quaternion {\r\n const q = new Quaternion();\r\n Quaternion.RotationYawPitchRollToRef(y, x, z, q);\r\n return q;\r\n }\r\n\r\n /**\r\n * Updates a quaternion from Euler rotation angles\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#34\r\n * @param x Pitch\r\n * @param y Yaw\r\n * @param z Roll\r\n * @param result the quaternion to store the result\r\n * @returns the updated quaternion\r\n */\r\n public static FromEulerAnglesToRef(x: number, y: number, z: number, result: T): T {\r\n Quaternion.RotationYawPitchRollToRef(y, x, z, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a quaternion from Euler rotation vector\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#35\r\n * @param vec the Euler vector (x Pitch, y Yaw, z Roll)\r\n * @returns the new Quaternion\r\n */\r\n public static FromEulerVector(vec: DeepImmutable): Quaternion {\r\n const q = new Quaternion();\r\n Quaternion.RotationYawPitchRollToRef(vec._y, vec._x, vec._z, q);\r\n return q;\r\n }\r\n\r\n /**\r\n * Updates a quaternion from Euler rotation vector\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#36\r\n * @param vec the Euler vector (x Pitch, y Yaw, z Roll)\r\n * @param result the quaternion to store the result\r\n * @returns the updated quaternion\r\n */\r\n public static FromEulerVectorToRef(vec: DeepImmutable, result: T): T {\r\n Quaternion.RotationYawPitchRollToRef(vec._y, vec._x, vec._z, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Updates a quaternion so that it rotates vector vecFrom to vector vecTo\r\n * Example Playground - https://playground.babylonjs.com/#L49EJ7#70\r\n * @param vecFrom defines the direction vector from which to rotate\r\n * @param vecTo defines the direction vector to which to rotate\r\n * @param result the quaternion to store the result\r\n * @param epsilon defines the minimal dot value to define vecs as opposite. Default: `BABYLON.Epsilon`\r\n * @returns the updated quaternion\r\n */\r\n public static FromUnitVectorsToRef(vecFrom: DeepImmutable, vecTo: DeepImmutable, result: T, epsilon = Epsilon): T {\r\n const r = Vector3.Dot(vecFrom, vecTo) + 1;\r\n\r\n if (r < epsilon) {\r\n if (Math.abs(vecFrom.x) > Math.abs(vecFrom.z)) {\r\n result.set(-vecFrom.y, vecFrom.x, 0, 0);\r\n } else {\r\n result.set(0, -vecFrom.z, vecFrom.y, 0);\r\n }\r\n } else {\r\n Vector3.CrossToRef(vecFrom, vecTo, TmpVectors.Vector3[0]);\r\n result.set(TmpVectors.Vector3[0].x, TmpVectors.Vector3[0].y, TmpVectors.Vector3[0].z, r);\r\n }\r\n\r\n return result.normalize();\r\n }\r\n\r\n /**\r\n * Creates a new quaternion from the given Euler float angles (y, x, z)\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#77\r\n * @param yaw defines the rotation around Y axis\r\n * @param pitch defines the rotation around X axis\r\n * @param roll defines the rotation around Z axis\r\n * @returns the new quaternion\r\n */\r\n public static RotationYawPitchRoll(yaw: number, pitch: number, roll: number): Quaternion {\r\n const q = new Quaternion();\r\n Quaternion.RotationYawPitchRollToRef(yaw, pitch, roll, q);\r\n return q;\r\n }\r\n\r\n /**\r\n * Creates a new rotation from the given Euler float angles (y, x, z) and stores it in the target quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#78\r\n * @param yaw defines the rotation around Y axis\r\n * @param pitch defines the rotation around X axis\r\n * @param roll defines the rotation around Z axis\r\n * @param result defines the target quaternion\r\n * @returns result input\r\n */\r\n public static RotationYawPitchRollToRef(yaw: number, pitch: number, roll: number, result: T): T {\r\n // Produces a quaternion from Euler angles in the z-y-x orientation (Tait-Bryan angles)\r\n const halfRoll = roll * 0.5;\r\n const halfPitch = pitch * 0.5;\r\n const halfYaw = yaw * 0.5;\r\n\r\n const sinRoll = Math.sin(halfRoll);\r\n const cosRoll = Math.cos(halfRoll);\r\n const sinPitch = Math.sin(halfPitch);\r\n const cosPitch = Math.cos(halfPitch);\r\n const sinYaw = Math.sin(halfYaw);\r\n const cosYaw = Math.cos(halfYaw);\r\n\r\n result._x = cosYaw * sinPitch * cosRoll + sinYaw * cosPitch * sinRoll;\r\n result._y = sinYaw * cosPitch * cosRoll - cosYaw * sinPitch * sinRoll;\r\n result._z = cosYaw * cosPitch * sinRoll - sinYaw * sinPitch * cosRoll;\r\n result._w = cosYaw * cosPitch * cosRoll + sinYaw * sinPitch * sinRoll;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new quaternion from the given Euler float angles expressed in z-x-z orientation\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#68\r\n * @param alpha defines the rotation around first axis\r\n * @param beta defines the rotation around second axis\r\n * @param gamma defines the rotation around third axis\r\n * @returns the new quaternion\r\n */\r\n public static RotationAlphaBetaGamma(alpha: number, beta: number, gamma: number): Quaternion {\r\n const result = new Quaternion();\r\n Quaternion.RotationAlphaBetaGammaToRef(alpha, beta, gamma, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new quaternion from the given Euler float angles expressed in z-x-z orientation and stores it in the target quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#69\r\n * @param alpha defines the rotation around first axis\r\n * @param beta defines the rotation around second axis\r\n * @param gamma defines the rotation around third axis\r\n * @param result defines the target quaternion\r\n * @returns result input\r\n */\r\n public static RotationAlphaBetaGammaToRef(alpha: number, beta: number, gamma: number, result: T): T {\r\n // Produces a quaternion from Euler angles in the z-x-z orientation\r\n const halfGammaPlusAlpha = (gamma + alpha) * 0.5;\r\n const halfGammaMinusAlpha = (gamma - alpha) * 0.5;\r\n const halfBeta = beta * 0.5;\r\n\r\n result._x = Math.cos(halfGammaMinusAlpha) * Math.sin(halfBeta);\r\n result._y = Math.sin(halfGammaMinusAlpha) * Math.sin(halfBeta);\r\n result._z = Math.sin(halfGammaPlusAlpha) * Math.cos(halfBeta);\r\n result._w = Math.cos(halfGammaPlusAlpha) * Math.cos(halfBeta);\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new quaternion containing the rotation value to reach the target (axis1, axis2, axis3) orientation as a rotated XYZ system (axis1, axis2 and axis3 are normalized during this operation)\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#75\r\n * @param axis1 defines the first axis\r\n * @param axis2 defines the second axis\r\n * @param axis3 defines the third axis\r\n * @returns the new quaternion\r\n */\r\n public static RotationQuaternionFromAxis(axis1: DeepImmutable, axis2: DeepImmutable, axis3: DeepImmutable): Quaternion {\r\n const quat = new Quaternion(0.0, 0.0, 0.0, 0.0);\r\n Quaternion.RotationQuaternionFromAxisToRef(axis1, axis2, axis3, quat);\r\n return quat;\r\n }\r\n\r\n /**\r\n * Creates a rotation value to reach the target (axis1, axis2, axis3) orientation as a rotated XYZ system (axis1, axis2 and axis3 are normalized during this operation) and stores it in the target quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#76\r\n * @param axis1 defines the first axis\r\n * @param axis2 defines the second axis\r\n * @param axis3 defines the third axis\r\n * @param ref defines the target quaternion\r\n * @returns result input\r\n */\r\n public static RotationQuaternionFromAxisToRef(axis1: DeepImmutable, axis2: DeepImmutable, axis3: DeepImmutable, ref: T): T {\r\n const rotMat = MathTmp.Matrix[0];\r\n Matrix.FromXYZAxesToRef(axis1.normalize(), axis2.normalize(), axis3.normalize(), rotMat);\r\n Quaternion.FromRotationMatrixToRef(rotMat, ref);\r\n return ref;\r\n }\r\n\r\n /**\r\n * Creates a new rotation value to orient an object to look towards the given forward direction, the up direction being oriented like \"up\".\r\n * This function works in left handed mode\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#96\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @returns A new quaternion oriented toward the specified forward and up.\r\n */\r\n public static FromLookDirectionLH(forward: DeepImmutable, up: DeepImmutable): Quaternion {\r\n const quat = new Quaternion();\r\n Quaternion.FromLookDirectionLHToRef(forward, up, quat);\r\n return quat;\r\n }\r\n\r\n /**\r\n * Creates a new rotation value to orient an object to look towards the given forward direction with the up direction being oriented like \"up\", and stores it in the target quaternion.\r\n * This function works in left handed mode\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#97\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @param ref defines the target quaternion.\r\n * @returns result input\r\n */\r\n public static FromLookDirectionLHToRef(forward: DeepImmutable, up: DeepImmutable, ref: T): T {\r\n const rotMat = MathTmp.Matrix[0];\r\n Matrix.LookDirectionLHToRef(forward, up, rotMat);\r\n Quaternion.FromRotationMatrixToRef(rotMat, ref);\r\n return ref;\r\n }\r\n\r\n /**\r\n * Creates a new rotation value to orient an object to look towards the given forward direction, the up direction being oriented like \"up\".\r\n * This function works in right handed mode\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#98\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @returns A new quaternion oriented toward the specified forward and up.\r\n */\r\n public static FromLookDirectionRH(forward: DeepImmutable, up: DeepImmutable): Quaternion {\r\n const quat = new Quaternion();\r\n Quaternion.FromLookDirectionRHToRef(forward, up, quat);\r\n return quat;\r\n }\r\n\r\n /**\r\n * Creates a new rotation value to orient an object to look towards the given forward direction with the up direction being oriented like \"up\", and stores it in the target quaternion.\r\n * This function works in right handed mode\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#105\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @param ref defines the target quaternion.\r\n * @returns result input\r\n */\r\n public static FromLookDirectionRHToRef(forward: DeepImmutable, up: DeepImmutable, ref: T): T {\r\n const rotMat = MathTmp.Matrix[0];\r\n Matrix.LookDirectionRHToRef(forward, up, rotMat);\r\n return Quaternion.FromRotationMatrixToRef(rotMat, ref);\r\n }\r\n\r\n /**\r\n * Interpolates between two quaternions\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#79\r\n * @param left defines first quaternion\r\n * @param right defines second quaternion\r\n * @param amount defines the gradient to use\r\n * @returns the new interpolated quaternion\r\n */\r\n public static Slerp(left: DeepImmutable, right: DeepImmutable, amount: number): Quaternion {\r\n const result = Quaternion.Identity();\r\n\r\n Quaternion.SlerpToRef(left, right, amount, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Interpolates between two quaternions and stores it into a target quaternion\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#92\r\n * @param left defines first quaternion\r\n * @param right defines second quaternion\r\n * @param amount defines the gradient to use\r\n * @param result defines the target quaternion\r\n * @returns result input\r\n */\r\n public static SlerpToRef(left: DeepImmutable, right: DeepImmutable, amount: number, result: T): T {\r\n let num2;\r\n let num3;\r\n let num4 = left._x * right._x + left._y * right._y + left._z * right._z + left._w * right._w;\r\n let flag = false;\r\n\r\n if (num4 < 0) {\r\n flag = true;\r\n num4 = -num4;\r\n }\r\n\r\n if (num4 > 0.999999) {\r\n num3 = 1 - amount;\r\n num2 = flag ? -amount : amount;\r\n } else {\r\n const num5 = Math.acos(num4);\r\n const num6 = 1.0 / Math.sin(num5);\r\n num3 = Math.sin((1.0 - amount) * num5) * num6;\r\n num2 = flag ? -Math.sin(amount * num5) * num6 : Math.sin(amount * num5) * num6;\r\n }\r\n\r\n result._x = num3 * left._x + num2 * right._x;\r\n result._y = num3 * left._y + num2 * right._y;\r\n result._z = num3 * left._z + num2 * right._z;\r\n result._w = num3 * left._w + num2 * right._w;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Interpolate between two quaternions using Hermite interpolation\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#47\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#hermite-quaternion-spline\r\n * @param value1 defines first quaternion\r\n * @param tangent1 defines the incoming tangent\r\n * @param value2 defines second quaternion\r\n * @param tangent2 defines the outgoing tangent\r\n * @param amount defines the target quaternion\r\n * @returns the new interpolated quaternion\r\n */\r\n public static Hermite(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n amount: number\r\n ): T {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n const part1 = 2.0 * cubed - 3.0 * squared + 1.0;\r\n const part2 = -2.0 * cubed + 3.0 * squared;\r\n const part3 = cubed - 2.0 * squared + amount;\r\n const part4 = cubed - squared;\r\n\r\n const x = value1._x * part1 + value2._x * part2 + tangent1._x * part3 + tangent2._x * part4;\r\n const y = value1._y * part1 + value2._y * part2 + tangent1._y * part3 + tangent2._y * part4;\r\n const z = value1._z * part1 + value2._z * part2 + tangent1._z * part3 + tangent2._z * part4;\r\n const w = value1._w * part1 + value2._w * part2 + tangent1._w * part3 + tangent2._w * part4;\r\n return new (value1.constructor as Constructor)(x, y, z, w);\r\n }\r\n\r\n /**\r\n * Returns a new Quaternion which is the 1st derivative of the Hermite spline defined by the quaternions \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#48\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @returns 1st derivative\r\n */\r\n public static Hermite1stDerivative(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number\r\n ): T {\r\n const result = new (value1.constructor as Constructor)();\r\n\r\n this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Update a Quaternion with the 1st derivative of the Hermite spline defined by the quaternions \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * Example Playground https://playground.babylonjs.com/#L49EJ7#49\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @param result define where to store the derivative\r\n * @returns result input\r\n */\r\n public static Hermite1stDerivativeToRef(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number,\r\n result: T\r\n ): T {\r\n const t2 = time * time;\r\n\r\n result._x = (t2 - time) * 6 * value1._x + (3 * t2 - 4 * time + 1) * tangent1._x + (-t2 + time) * 6 * value2._x + (3 * t2 - 2 * time) * tangent2._x;\r\n result._y = (t2 - time) * 6 * value1._y + (3 * t2 - 4 * time + 1) * tangent1._y + (-t2 + time) * 6 * value2._y + (3 * t2 - 2 * time) * tangent2._y;\r\n result._z = (t2 - time) * 6 * value1._z + (3 * t2 - 4 * time + 1) * tangent1._z + (-t2 + time) * 6 * value2._z + (3 * t2 - 2 * time) * tangent2._z;\r\n result._w = (t2 - time) * 6 * value1._w + (3 * t2 - 4 * time + 1) * tangent1._w + (-t2 + time) * 6 * value2._w + (3 * t2 - 2 * time) * tangent2._w;\r\n result._isDirty = true;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Quaternion as the normalization of the given Quaternion\r\n * @param quat defines the Quaternion to normalize\r\n * @returns the new Quaternion\r\n */\r\n public static Normalize(quat: DeepImmutable): Quaternion {\r\n const result = Quaternion.Zero();\r\n Quaternion.NormalizeToRef(quat, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given Quaternion \"result\" with the normalization of the given first Quaternion\r\n * @param quat defines the Quaternion to normalize\r\n * @param result defines the Quaternion where to store the result\r\n * @returns result input\r\n */\r\n public static NormalizeToRef(quat: DeepImmutable, result: T): T {\r\n quat.normalizeToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Quaternion set with the coordinates of \"value\", if the quaternion \"value\" is in the cube defined by the quaternions \"min\" and \"max\"\r\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\r\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\r\n * @param value defines the current value\r\n * @param min defines the lower range value\r\n * @param max defines the upper range value\r\n * @returns the new Quaternion\r\n */\r\n public static Clamp(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable): T {\r\n const result = new (value.constructor as Constructor)();\r\n Quaternion.ClampToRef(value, min, max, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given quaternion \"result\" with the coordinates of \"value\", if the quaternion \"value\" is in the cube defined by the quaternions \"min\" and \"max\"\r\n * If a coordinate value of \"value\" is lower than one of the \"min\" coordinate, then this \"value\" coordinate is set with the \"min\" one\r\n * If a coordinate value of \"value\" is greater than one of the \"max\" coordinate, then this \"value\" coordinate is set with the \"max\" one\r\n * @param value defines the current value\r\n * @param min defines the lower range value\r\n * @param max defines the upper range value\r\n * @param result defines the Quaternion where to store the result\r\n * @returns result input\r\n */\r\n public static ClampToRef(value: DeepImmutable, min: DeepImmutable, max: DeepImmutable, result: T): T {\r\n return result.copyFromFloats(Clamp(value.x, min.x, max.x), Clamp(value.y, min.y, max.y), Clamp(value.z, min.z, max.z), Clamp(value.w, min.w, max.w));\r\n }\r\n\r\n /**\r\n * Returns a new Quaternion with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @returns a Quaternion with random values between min and max\r\n */\r\n public static Random(min: number = 0, max: number = 1): Quaternion {\r\n return new Quaternion(RandomRange(min, max), RandomRange(min, max), RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Sets a Quaternion with random values between min and max\r\n * @param min the minimum random value\r\n * @param max the maximum random value\r\n * @param ref the ref to store the values in\r\n * @returns the ref with random values between min and max\r\n */\r\n public static RandomToRef(min: number = 0, max: number = 1, ref: T): T {\r\n return ref.copyFromFloats(RandomRange(min, max), RandomRange(min, max), RandomRange(min, max), RandomRange(min, max));\r\n }\r\n\r\n /**\r\n * Do not use\r\n * @internal\r\n */\r\n public static Minimize(): Quaternion {\r\n throw new ReferenceError(\"Quaternion.Minimize does not make sense\");\r\n }\r\n\r\n /**\r\n * Do not use\r\n * @internal\r\n */\r\n public static Maximize(): Quaternion {\r\n throw new ReferenceError(\"Quaternion.Maximize does not make sense\");\r\n }\r\n\r\n /**\r\n * Returns the distance (float) between the quaternions \"value1\" and \"value2\".\r\n * @param value1 value to calulate the distance between\r\n * @param value2 value to calulate the distance between\r\n * @returns the distance between the two quaternions\r\n */\r\n public static Distance(value1: DeepImmutable, value2: DeepImmutable): number {\r\n return Math.sqrt(Quaternion.DistanceSquared(value1, value2));\r\n }\r\n /**\r\n * Returns the squared distance (float) between the quaternions \"value1\" and \"value2\".\r\n * @param value1 value to calulate the distance between\r\n * @param value2 value to calulate the distance between\r\n * @returns the distance between the two quaternions squared\r\n */\r\n public static DistanceSquared(value1: DeepImmutable, value2: DeepImmutable): number {\r\n const x = value1.x - value2.x;\r\n const y = value1.y - value2.y;\r\n const z = value1.z - value2.z;\r\n const w = value1.w - value2.w;\r\n\r\n return x * x + y * y + z * z + w * w;\r\n }\r\n\r\n /**\r\n * Returns a new Quaternion located at the center between the quaternions \"value1\" and \"value2\".\r\n * @param value1 value to calulate the center between\r\n * @param value2 value to calulate the center between\r\n * @returns the center between the two quaternions\r\n */\r\n public static Center(value1: DeepImmutable, value2: DeepImmutable): Quaternion {\r\n return Quaternion.CenterToRef(value1, value2, Quaternion.Zero());\r\n }\r\n\r\n /**\r\n * Gets the center of the quaternions \"value1\" and \"value2\" and stores the result in the quaternion \"ref\"\r\n * @param value1 defines first quaternion\r\n * @param value2 defines second quaternion\r\n * @param ref defines third quaternion\r\n * @returns ref\r\n */\r\n public static CenterToRef(value1: DeepImmutable, value2: DeepImmutable, ref: T): T {\r\n return ref.copyFromFloats((value1.x + value2.x) / 2, (value1.y + value2.y) / 2, (value1.z + value2.z) / 2, (value1.w + value2.w) / 2);\r\n }\r\n}\r\nQuaternion satisfies TensorStatic;\r\nObject.defineProperties(Quaternion.prototype, {\r\n dimension: { value: [4] },\r\n rank: { value: 1 },\r\n});\r\n\r\n/**\r\n * Class used to store matrix data (4x4)\r\n * Note on matrix definitions in Babylon.js for setting values directly\r\n * rather than using one of the methods available.\r\n * Matrix size is given by rows x columns.\r\n * A Vector3 is a 1 X 3 matrix [x, y, z].\r\n *\r\n * In Babylon.js multiplying a 1 x 3 matrix by a 4 x 4 matrix\r\n * is done using BABYLON.Vector4.TransformCoordinates(Vector3, Matrix).\r\n * and extending the passed Vector3 to a Vector4, V = [x, y, z, 1].\r\n * Let M be a matrix with elements m(row, column), so that\r\n * m(2, 3) is the element in row 2 column 3 of M.\r\n *\r\n * Multiplication is of the form VM and has the resulting Vector4\r\n * VM = [xm(0, 0) + ym(1, 0) + zm(2, 0) + m(3, 0), xm(0, 1) + ym(1, 1) + zm(2, 1) + m(3, 1), xm(0, 2) + ym(1, 2) + zm(2, 2) + m(3, 2), xm(0, 3) + ym(1, 3) + zm(2, 3) + m(3, 3)].\r\n * On the web you will find many examples that use the opposite convention of MV,\r\n * in which case to make use of the examples you will need to transpose the matrix.\r\n *\r\n * Example Playground - Overview Linear Algebra - https://playground.babylonjs.com/#AV9X17\r\n * Example Playground - Overview Transformation - https://playground.babylonjs.com/#AV9X17#1\r\n * Example Playground - Overview Projection - https://playground.babylonjs.com/#AV9X17#2\r\n */\r\nexport class Matrix implements Tensor, 4>>, IMatrixLike {\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: Readonly<[4, 4]>;\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 2;\r\n\r\n /**\r\n * Gets the precision of matrix computations\r\n */\r\n public static get Use64Bits(): boolean {\r\n return PerformanceConfigurator.MatrixUse64Bits;\r\n }\r\n\r\n private static _UpdateFlagSeed = 0;\r\n private static _IdentityReadOnly = Matrix.Identity() as DeepImmutable;\r\n\r\n private _isIdentity = false;\r\n private _isIdentityDirty = true;\r\n private _isIdentity3x2 = true;\r\n private _isIdentity3x2Dirty = true;\r\n /**\r\n * Gets the update flag of the matrix which is an unique number for the matrix.\r\n * It will be incremented every time the matrix data change.\r\n * You can use it to speed the comparison between two versions of the same matrix.\r\n */\r\n public updateFlag: number = -1;\r\n\r\n private readonly _m: Tuple;\r\n\r\n /**\r\n * Gets the internal data of the matrix\r\n */\r\n public get m(): DeepImmutable> {\r\n return this._m;\r\n }\r\n\r\n /**\r\n * Update the updateFlag to indicate that the matrix has been updated\r\n */\r\n public markAsUpdated() {\r\n this.updateFlag = Matrix._UpdateFlagSeed++;\r\n this._isIdentity = false;\r\n this._isIdentity3x2 = false;\r\n this._isIdentityDirty = true;\r\n this._isIdentity3x2Dirty = true;\r\n }\r\n\r\n private _updateIdentityStatus(isIdentity: boolean, isIdentityDirty: boolean = false, isIdentity3x2: boolean = false, isIdentity3x2Dirty: boolean = true) {\r\n this._isIdentity = isIdentity;\r\n this._isIdentity3x2 = isIdentity || isIdentity3x2;\r\n this._isIdentityDirty = this._isIdentity ? false : isIdentityDirty;\r\n this._isIdentity3x2Dirty = this._isIdentity3x2 ? false : isIdentity3x2Dirty;\r\n }\r\n\r\n /**\r\n * Creates an empty matrix (filled with zeros)\r\n */\r\n public constructor() {\r\n if (PerformanceConfigurator.MatrixTrackPrecisionChange) {\r\n PerformanceConfigurator.MatrixTrackedMatrices!.push(this);\r\n }\r\n\r\n this._m = new PerformanceConfigurator.MatrixCurrentType(16);\r\n\r\n this.markAsUpdated();\r\n }\r\n\r\n // Properties\r\n\r\n /**\r\n * Check if the current matrix is identity\r\n * @returns true is the matrix is the identity matrix\r\n */\r\n public isIdentity(): boolean {\r\n if (this._isIdentityDirty) {\r\n this._isIdentityDirty = false;\r\n const m = this._m;\r\n this._isIdentity =\r\n m[0] === 1.0 &&\r\n m[1] === 0.0 &&\r\n m[2] === 0.0 &&\r\n m[3] === 0.0 &&\r\n m[4] === 0.0 &&\r\n m[5] === 1.0 &&\r\n m[6] === 0.0 &&\r\n m[7] === 0.0 &&\r\n m[8] === 0.0 &&\r\n m[9] === 0.0 &&\r\n m[10] === 1.0 &&\r\n m[11] === 0.0 &&\r\n m[12] === 0.0 &&\r\n m[13] === 0.0 &&\r\n m[14] === 0.0 &&\r\n m[15] === 1.0;\r\n }\r\n\r\n return this._isIdentity;\r\n }\r\n\r\n /**\r\n * Check if the current matrix is identity as a texture matrix (3x2 store in 4x4)\r\n * @returns true is the matrix is the identity matrix\r\n */\r\n public isIdentityAs3x2(): boolean {\r\n if (this._isIdentity3x2Dirty) {\r\n this._isIdentity3x2Dirty = false;\r\n if (this._m[0] !== 1.0 || this._m[5] !== 1.0 || this._m[15] !== 1.0) {\r\n this._isIdentity3x2 = false;\r\n } else if (\r\n this._m[1] !== 0.0 ||\r\n this._m[2] !== 0.0 ||\r\n this._m[3] !== 0.0 ||\r\n this._m[4] !== 0.0 ||\r\n this._m[6] !== 0.0 ||\r\n this._m[7] !== 0.0 ||\r\n this._m[8] !== 0.0 ||\r\n this._m[9] !== 0.0 ||\r\n this._m[10] !== 0.0 ||\r\n this._m[11] !== 0.0 ||\r\n this._m[12] !== 0.0 ||\r\n this._m[13] !== 0.0 ||\r\n this._m[14] !== 0.0\r\n ) {\r\n this._isIdentity3x2 = false;\r\n } else {\r\n this._isIdentity3x2 = true;\r\n }\r\n }\r\n\r\n return this._isIdentity3x2;\r\n }\r\n\r\n /**\r\n * Gets the determinant of the matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#34\r\n * @returns the matrix determinant\r\n */\r\n public determinant(): number {\r\n if (this._isIdentity === true) {\r\n return 1;\r\n }\r\n\r\n const m = this._m;\r\n const m00 = m[0],\r\n m01 = m[1],\r\n m02 = m[2],\r\n m03 = m[3];\r\n const m10 = m[4],\r\n m11 = m[5],\r\n m12 = m[6],\r\n m13 = m[7];\r\n const m20 = m[8],\r\n m21 = m[9],\r\n m22 = m[10],\r\n m23 = m[11];\r\n const m30 = m[12],\r\n m31 = m[13],\r\n m32 = m[14],\r\n m33 = m[15];\r\n // https://en.wikipedia.org/wiki/Laplace_expansion\r\n // to compute the deterrminant of a 4x4 Matrix we compute the cofactors of any row or column,\r\n // then we multiply each Cofactor by its corresponding matrix value and sum them all to get the determinant\r\n // Cofactor(i, j) = sign(i,j) * det(Minor(i, j))\r\n // where\r\n // - sign(i,j) = (i+j) % 2 === 0 ? 1 : -1\r\n // - Minor(i, j) is the 3x3 matrix we get by removing row i and column j from current Matrix\r\n //\r\n // Here we do that for the 1st row.\r\n\r\n const det_22_33 = m22 * m33 - m32 * m23;\r\n const det_21_33 = m21 * m33 - m31 * m23;\r\n const det_21_32 = m21 * m32 - m31 * m22;\r\n const det_20_33 = m20 * m33 - m30 * m23;\r\n const det_20_32 = m20 * m32 - m22 * m30;\r\n const det_20_31 = m20 * m31 - m30 * m21;\r\n const cofact_00 = +(m11 * det_22_33 - m12 * det_21_33 + m13 * det_21_32);\r\n const cofact_01 = -(m10 * det_22_33 - m12 * det_20_33 + m13 * det_20_32);\r\n const cofact_02 = +(m10 * det_21_33 - m11 * det_20_33 + m13 * det_20_31);\r\n const cofact_03 = -(m10 * det_21_32 - m11 * det_20_32 + m12 * det_20_31);\r\n return m00 * cofact_00 + m01 * cofact_01 + m02 * cofact_02 + m03 * cofact_03;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Gets a string with the Matrix values\r\n * @returns a string with the Matrix values\r\n */\r\n public toString(): string {\r\n return `{${this.m[0]}, ${this.m[1]}, ${this.m[2]}, ${this.m[3]}\\n${this.m[4]}, ${this.m[5]}, ${this.m[6]}, ${this.m[7]}\\n${this.m[8]}, ${this.m[9]}, ${this.m[10]}, ${this.m[11]}\\n${this.m[12]}, ${this.m[13]}, ${this.m[14]}, ${this.m[15]}}`;\r\n }\r\n\r\n /**\r\n * Returns the matrix as a Float32Array or Array\r\n * @deprecated Use asArray\r\n */\r\n public toArray(): FloatArray;\r\n\r\n /**\r\n * Stores the matrix in a Float32Array or Array\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#49\r\n * @param array The destination array\r\n * @param index The destination index to start ay\r\n * @returns the matrix\r\n */\r\n public toArray(array: FloatArray, index: number): this;\r\n public toArray(array: Nullable = null, index: number = 0): this | FloatArray {\r\n if (!array) {\r\n return this._m;\r\n }\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n array[index + i] = m[i];\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the matrix as a Float32Array or Array\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#114\r\n * @returns the matrix underlying array.\r\n */\r\n public asArray(): Tuple {\r\n return this._m;\r\n }\r\n\r\n public fromArray(array: FloatArray, index: number = 0): this {\r\n return Matrix.FromArrayToRef(array, index, this);\r\n }\r\n\r\n public copyFromFloats(...floats: Tuple): this {\r\n return Matrix.FromArrayToRef(floats, 0, this);\r\n }\r\n\r\n public set(...values: Tuple): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = values[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public setAll(value: number): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = value;\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Inverts the current matrix in place\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#118\r\n * @returns the current inverted matrix\r\n */\r\n public invert(): this {\r\n this.invertToRef(this);\r\n return this;\r\n }\r\n /**\r\n * Sets all the matrix elements to zero\r\n * @returns the current matrix\r\n */\r\n public reset(): this {\r\n Matrix.FromValuesToRef(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, this);\r\n this._updateIdentityStatus(false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the current matrix with a second one\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#44\r\n * @param other defines the matrix to add\r\n * @returns a new matrix as the addition of the current matrix and the given one\r\n */\r\n public add(other: DeepImmutable): this {\r\n const result = new (this.constructor as Constructor)();\r\n this.addToRef(other, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given matrix \"result\" to the addition of the current matrix and the given one\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#45\r\n * @param other defines the matrix to add\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public addToRef(other: DeepImmutable, result: T): T {\r\n const m = this._m;\r\n const resultM = result._m;\r\n const otherM = other.m;\r\n for (let index = 0; index < 16; index++) {\r\n resultM[index] = m[index] + otherM[index];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds in place the given matrix to the current matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#46\r\n * @param other defines the second operand\r\n * @returns the current updated matrix\r\n */\r\n public addToSelf(other: DeepImmutable): this {\r\n const m = this._m;\r\n const otherM = other.m;\r\n for (let index = 0; index < 16; index++) {\r\n m[index] += otherM[index];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public addInPlace(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] += otherM[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public addInPlaceFromFloats(...floats: Tuple): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] += floats[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public subtract(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] -= otherM[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n public subtractToRef(other: DeepImmutable, result: T): T {\r\n const m = this._m,\r\n otherM = other.m,\r\n resultM = result._m;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = m[i] - otherM[i];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n public subtractInPlace(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] -= otherM[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public subtractFromFloats(...floats: Tuple): this {\r\n return this.subtractFromFloatsToRef(...floats, new (this.constructor as Constructor)());\r\n }\r\n\r\n public subtractFromFloatsToRef(...args: [...Tuple, T]): T {\r\n const result = args.pop() as T,\r\n m = this._m,\r\n resultM = result._m,\r\n values = args as unknown as Tuple;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = m[i] - values[i];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given matrix to the current inverted Matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#119\r\n * @param other defines the target matrix\r\n * @returns result input\r\n */\r\n public invertToRef(other: T): T {\r\n if (this._isIdentity === true) {\r\n Matrix.IdentityToRef(other);\r\n return other;\r\n }\r\n\r\n // the inverse of a Matrix is the transpose of cofactor matrix divided by the determinant\r\n const m = this._m;\r\n const m00 = m[0],\r\n m01 = m[1],\r\n m02 = m[2],\r\n m03 = m[3];\r\n const m10 = m[4],\r\n m11 = m[5],\r\n m12 = m[6],\r\n m13 = m[7];\r\n const m20 = m[8],\r\n m21 = m[9],\r\n m22 = m[10],\r\n m23 = m[11];\r\n const m30 = m[12],\r\n m31 = m[13],\r\n m32 = m[14],\r\n m33 = m[15];\r\n\r\n const det_22_33 = m22 * m33 - m32 * m23;\r\n const det_21_33 = m21 * m33 - m31 * m23;\r\n const det_21_32 = m21 * m32 - m31 * m22;\r\n const det_20_33 = m20 * m33 - m30 * m23;\r\n const det_20_32 = m20 * m32 - m22 * m30;\r\n const det_20_31 = m20 * m31 - m30 * m21;\r\n\r\n const cofact_00 = +(m11 * det_22_33 - m12 * det_21_33 + m13 * det_21_32);\r\n const cofact_01 = -(m10 * det_22_33 - m12 * det_20_33 + m13 * det_20_32);\r\n const cofact_02 = +(m10 * det_21_33 - m11 * det_20_33 + m13 * det_20_31);\r\n const cofact_03 = -(m10 * det_21_32 - m11 * det_20_32 + m12 * det_20_31);\r\n\r\n const det = m00 * cofact_00 + m01 * cofact_01 + m02 * cofact_02 + m03 * cofact_03;\r\n\r\n if (det === 0) {\r\n // not invertible\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n\r\n const detInv = 1 / det;\r\n const det_12_33 = m12 * m33 - m32 * m13;\r\n const det_11_33 = m11 * m33 - m31 * m13;\r\n const det_11_32 = m11 * m32 - m31 * m12;\r\n const det_10_33 = m10 * m33 - m30 * m13;\r\n const det_10_32 = m10 * m32 - m30 * m12;\r\n const det_10_31 = m10 * m31 - m30 * m11;\r\n const det_12_23 = m12 * m23 - m22 * m13;\r\n const det_11_23 = m11 * m23 - m21 * m13;\r\n const det_11_22 = m11 * m22 - m21 * m12;\r\n const det_10_23 = m10 * m23 - m20 * m13;\r\n const det_10_22 = m10 * m22 - m20 * m12;\r\n const det_10_21 = m10 * m21 - m20 * m11;\r\n\r\n const cofact_10 = -(m01 * det_22_33 - m02 * det_21_33 + m03 * det_21_32);\r\n const cofact_11 = +(m00 * det_22_33 - m02 * det_20_33 + m03 * det_20_32);\r\n const cofact_12 = -(m00 * det_21_33 - m01 * det_20_33 + m03 * det_20_31);\r\n const cofact_13 = +(m00 * det_21_32 - m01 * det_20_32 + m02 * det_20_31);\r\n\r\n const cofact_20 = +(m01 * det_12_33 - m02 * det_11_33 + m03 * det_11_32);\r\n const cofact_21 = -(m00 * det_12_33 - m02 * det_10_33 + m03 * det_10_32);\r\n const cofact_22 = +(m00 * det_11_33 - m01 * det_10_33 + m03 * det_10_31);\r\n const cofact_23 = -(m00 * det_11_32 - m01 * det_10_32 + m02 * det_10_31);\r\n\r\n const cofact_30 = -(m01 * det_12_23 - m02 * det_11_23 + m03 * det_11_22);\r\n const cofact_31 = +(m00 * det_12_23 - m02 * det_10_23 + m03 * det_10_22);\r\n const cofact_32 = -(m00 * det_11_23 - m01 * det_10_23 + m03 * det_10_21);\r\n const cofact_33 = +(m00 * det_11_22 - m01 * det_10_22 + m02 * det_10_21);\r\n\r\n Matrix.FromValuesToRef(\r\n cofact_00 * detInv,\r\n cofact_10 * detInv,\r\n cofact_20 * detInv,\r\n cofact_30 * detInv,\r\n cofact_01 * detInv,\r\n cofact_11 * detInv,\r\n cofact_21 * detInv,\r\n cofact_31 * detInv,\r\n cofact_02 * detInv,\r\n cofact_12 * detInv,\r\n cofact_22 * detInv,\r\n cofact_32 * detInv,\r\n cofact_03 * detInv,\r\n cofact_13 * detInv,\r\n cofact_23 * detInv,\r\n cofact_33 * detInv,\r\n other\r\n );\r\n\r\n return other;\r\n }\r\n\r\n /**\r\n * add a value at the specified position in the current Matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#47\r\n * @param index the index of the value within the matrix. between 0 and 15.\r\n * @param value the value to be added\r\n * @returns the current updated matrix\r\n */\r\n public addAtIndex(index: number, value: number): this {\r\n this._m[index] += value;\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * mutiply the specified position in the current Matrix by a value\r\n * @param index the index of the value within the matrix. between 0 and 15.\r\n * @param value the value to be added\r\n * @returns the current updated matrix\r\n */\r\n public multiplyAtIndex(index: number, value: number): this {\r\n this._m[index] *= value;\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Inserts the translation vector (using 3 floats) in the current matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#120\r\n * @param x defines the 1st component of the translation\r\n * @param y defines the 2nd component of the translation\r\n * @param z defines the 3rd component of the translation\r\n * @returns the current updated matrix\r\n */\r\n public setTranslationFromFloats(x: number, y: number, z: number): this {\r\n this._m[12] = x;\r\n this._m[13] = y;\r\n this._m[14] = z;\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the translation vector (using 3 floats) in the current matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#20\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#48\r\n * @param x defines the 1st component of the translation\r\n * @param y defines the 2nd component of the translation\r\n * @param z defines the 3rd component of the translation\r\n * @returns the current updated matrix\r\n */\r\n public addTranslationFromFloats(x: number, y: number, z: number): this {\r\n this._m[12] += x;\r\n this._m[13] += y;\r\n this._m[14] += z;\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Inserts the translation vector in the current matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#121\r\n * @param vector3 defines the translation to insert\r\n * @returns the current updated matrix\r\n */\r\n public setTranslation(vector3: DeepImmutable): this {\r\n return this.setTranslationFromFloats(vector3._x, vector3._y, vector3._z);\r\n }\r\n\r\n /**\r\n * Gets the translation value of the current matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#122\r\n * @returns a new Vector3 as the extracted translation from the matrix\r\n */\r\n public getTranslation(): Vector3 {\r\n return new Vector3(this._m[12], this._m[13], this._m[14]);\r\n }\r\n\r\n /**\r\n * Fill a Vector3 with the extracted translation from the matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#123\r\n * @param result defines the Vector3 where to store the translation\r\n * @returns the current matrix\r\n */\r\n public getTranslationToRef(result: T): T {\r\n result.x = this._m[12];\r\n result.y = this._m[13];\r\n result.z = this._m[14];\r\n return result;\r\n }\r\n\r\n /**\r\n * Remove rotation and scaling part from the matrix\r\n * @returns the updated matrix\r\n */\r\n public removeRotationAndScaling(): this {\r\n const m = this.m;\r\n Matrix.FromValuesToRef(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, m[12], m[13], m[14], m[15], this);\r\n this._updateIdentityStatus(m[12] === 0 && m[13] === 0 && m[14] === 0 && m[15] === 1);\r\n return this;\r\n }\r\n\r\n /**\r\n * Copy the current matrix from the given one\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#21\r\n * @param other defines the source matrix\r\n * @returns the current updated matrix\r\n */\r\n public copyFrom(other: DeepImmutable): this {\r\n other.copyToArray(this._m);\r\n const o = other as Matrix;\r\n this.updateFlag = o.updateFlag;\r\n this._updateIdentityStatus(o._isIdentity, o._isIdentityDirty, o._isIdentity3x2, o._isIdentity3x2Dirty);\r\n return this;\r\n }\r\n\r\n /**\r\n * Populates the given array from the starting index with the current matrix values\r\n * @param array defines the target array\r\n * @param offset defines the offset in the target array where to start storing values\r\n * @returns the current matrix\r\n */\r\n public copyToArray(array: Float32Array | Array, offset: number = 0): this {\r\n const source = this._m;\r\n array[offset] = source[0];\r\n array[offset + 1] = source[1];\r\n array[offset + 2] = source[2];\r\n array[offset + 3] = source[3];\r\n array[offset + 4] = source[4];\r\n array[offset + 5] = source[5];\r\n array[offset + 6] = source[6];\r\n array[offset + 7] = source[7];\r\n array[offset + 8] = source[8];\r\n array[offset + 9] = source[9];\r\n array[offset + 10] = source[10];\r\n array[offset + 11] = source[11];\r\n array[offset + 12] = source[12];\r\n array[offset + 13] = source[13];\r\n array[offset + 14] = source[14];\r\n array[offset + 15] = source[15];\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiply two matrices\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#15\r\n * A.multiply(B) means apply B to A so result is B x A\r\n * @param other defines the second operand\r\n * @returns a new matrix set with the multiplication result of the current Matrix and the given one\r\n */\r\n public multiply(other: DeepImmutable): this {\r\n const result = new (this.constructor as Constructor)();\r\n this.multiplyToRef(other, result);\r\n return result;\r\n }\r\n\r\n public multiplyInPlace(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] *= otherM[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public multiplyByFloats(...floats: Tuple): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = floats[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiples the current matrix by the given floats and stores them in the given ref\r\n * @param args The floats and ref\r\n * @returns The updated ref\r\n */\r\n public multiplyByFloatsToRef(...args: [...Tuple, T]): T {\r\n const result = args.pop() as T,\r\n m = this._m,\r\n resultM = result._m,\r\n values = args as unknown as Tuple;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = m[i] * values[i];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given matrix \"result\" with the multiplication result of the current Matrix and the given one\r\n * A.multiplyToRef(B, R) means apply B to A and store in R and R = B x A\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#16\r\n * @param other defines the second operand\r\n * @param result defines the matrix where to store the multiplication\r\n * @returns result input\r\n */\r\n public multiplyToRef(other: DeepImmutable, result: T): T {\r\n if (this._isIdentity) {\r\n result.copyFrom(other);\r\n return result;\r\n }\r\n if ((other as Matrix)._isIdentity) {\r\n result.copyFrom(this);\r\n return result;\r\n }\r\n\r\n this.multiplyToArray(other, result._m, 0);\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the Float32Array \"result\" from the given index \"offset\" with the multiplication of the current matrix and the given one\r\n * @param other defines the second operand\r\n * @param result defines the array where to store the multiplication\r\n * @param offset defines the offset in the target array where to start storing values\r\n * @returns the current matrix\r\n */\r\n public multiplyToArray(other: DeepImmutable, result: Float32Array | Array, offset: number): this {\r\n const m = this._m;\r\n const otherM = other.m;\r\n const tm0 = m[0],\r\n tm1 = m[1],\r\n tm2 = m[2],\r\n tm3 = m[3];\r\n const tm4 = m[4],\r\n tm5 = m[5],\r\n tm6 = m[6],\r\n tm7 = m[7];\r\n const tm8 = m[8],\r\n tm9 = m[9],\r\n tm10 = m[10],\r\n tm11 = m[11];\r\n const tm12 = m[12],\r\n tm13 = m[13],\r\n tm14 = m[14],\r\n tm15 = m[15];\r\n\r\n const om0 = otherM[0],\r\n om1 = otherM[1],\r\n om2 = otherM[2],\r\n om3 = otherM[3];\r\n const om4 = otherM[4],\r\n om5 = otherM[5],\r\n om6 = otherM[6],\r\n om7 = otherM[7];\r\n const om8 = otherM[8],\r\n om9 = otherM[9],\r\n om10 = otherM[10],\r\n om11 = otherM[11];\r\n const om12 = otherM[12],\r\n om13 = otherM[13],\r\n om14 = otherM[14],\r\n om15 = otherM[15];\r\n\r\n result[offset] = tm0 * om0 + tm1 * om4 + tm2 * om8 + tm3 * om12;\r\n result[offset + 1] = tm0 * om1 + tm1 * om5 + tm2 * om9 + tm3 * om13;\r\n result[offset + 2] = tm0 * om2 + tm1 * om6 + tm2 * om10 + tm3 * om14;\r\n result[offset + 3] = tm0 * om3 + tm1 * om7 + tm2 * om11 + tm3 * om15;\r\n\r\n result[offset + 4] = tm4 * om0 + tm5 * om4 + tm6 * om8 + tm7 * om12;\r\n result[offset + 5] = tm4 * om1 + tm5 * om5 + tm6 * om9 + tm7 * om13;\r\n result[offset + 6] = tm4 * om2 + tm5 * om6 + tm6 * om10 + tm7 * om14;\r\n result[offset + 7] = tm4 * om3 + tm5 * om7 + tm6 * om11 + tm7 * om15;\r\n\r\n result[offset + 8] = tm8 * om0 + tm9 * om4 + tm10 * om8 + tm11 * om12;\r\n result[offset + 9] = tm8 * om1 + tm9 * om5 + tm10 * om9 + tm11 * om13;\r\n result[offset + 10] = tm8 * om2 + tm9 * om6 + tm10 * om10 + tm11 * om14;\r\n result[offset + 11] = tm8 * om3 + tm9 * om7 + tm10 * om11 + tm11 * om15;\r\n\r\n result[offset + 12] = tm12 * om0 + tm13 * om4 + tm14 * om8 + tm15 * om12;\r\n result[offset + 13] = tm12 * om1 + tm13 * om5 + tm14 * om9 + tm15 * om13;\r\n result[offset + 14] = tm12 * om2 + tm13 * om6 + tm14 * om10 + tm15 * om14;\r\n result[offset + 15] = tm12 * om3 + tm13 * om7 + tm14 * om11 + tm15 * om15;\r\n return this;\r\n }\r\n\r\n public divide(other: DeepImmutable): this {\r\n return this.divideToRef(other, new (this.constructor as Constructor)());\r\n }\r\n\r\n public divideToRef(other: DeepImmutable, result: T): T {\r\n const m = this._m,\r\n otherM = other.m,\r\n resultM = result._m;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = m[i] / otherM[i];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n public divideInPlace(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] /= otherM[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public minimizeInPlace(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = Math.min(m[i], otherM[i]);\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public minimizeInPlaceFromFloats(...floats: Tuple): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = Math.min(m[i], floats[i]);\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public maximizeInPlace(other: DeepImmutable): this {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = Math.min(m[i], otherM[i]);\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public maximizeInPlaceFromFloats(...floats: Tuple): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = Math.min(m[i], floats[i]);\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public negate(): this {\r\n return this.negateToRef(new (this.constructor as Constructor)());\r\n }\r\n\r\n public negateInPlace(): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] = -m[i];\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n public negateToRef(result: T): T {\r\n const m = this._m,\r\n resultM = result._m;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = -m[i];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Check equality between this matrix and a second one\r\n * @param value defines the second matrix to compare\r\n * @returns true is the current matrix and the given one values are strictly equal\r\n */\r\n public equals(value: DeepImmutable): boolean {\r\n const other = value as Matrix;\r\n if (!other) {\r\n return false;\r\n }\r\n\r\n if (this._isIdentity || other._isIdentity) {\r\n if (!this._isIdentityDirty && !other._isIdentityDirty) {\r\n return this._isIdentity && other._isIdentity;\r\n }\r\n }\r\n\r\n const m = this.m;\r\n const om = other.m;\r\n return (\r\n m[0] === om[0] &&\r\n m[1] === om[1] &&\r\n m[2] === om[2] &&\r\n m[3] === om[3] &&\r\n m[4] === om[4] &&\r\n m[5] === om[5] &&\r\n m[6] === om[6] &&\r\n m[7] === om[7] &&\r\n m[8] === om[8] &&\r\n m[9] === om[9] &&\r\n m[10] === om[10] &&\r\n m[11] === om[11] &&\r\n m[12] === om[12] &&\r\n m[13] === om[13] &&\r\n m[14] === om[14] &&\r\n m[15] === om[15]\r\n );\r\n }\r\n\r\n public equalsWithEpsilon(other: DeepImmutable, epsilon: number = 0): boolean {\r\n const m = this._m,\r\n otherM = other.m;\r\n for (let i = 0; i < 16; i++) {\r\n if (!WithinEpsilon(m[i], otherM[i], epsilon)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n public equalsToFloats(...floats: Tuple): boolean {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n if (m[i] != floats[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n public floor(): this {\r\n return this.floorToRef(new (this.constructor as Constructor)());\r\n }\r\n\r\n public floorToRef(result: T): T {\r\n const m = this._m,\r\n resultM = result._m;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = Math.floor(m[i]);\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n public fract(): this {\r\n return this.fractToRef(new (this.constructor as Constructor)());\r\n }\r\n\r\n public fractToRef(result: T): T {\r\n const m = this._m,\r\n resultM = result._m;\r\n for (let i = 0; i < 16; i++) {\r\n resultM[i] = m[i] - Math.floor(m[i]);\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Clone the current matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#18\r\n * @returns a new matrix from the current matrix\r\n */\r\n public clone(): this {\r\n const matrix = new (this.constructor as Constructor)();\r\n matrix.copyFrom(this);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Returns the name of the current matrix class\r\n * @returns the string \"Matrix\"\r\n */\r\n public getClassName(): string {\r\n return \"Matrix\";\r\n }\r\n\r\n /**\r\n * Gets the hash code of the current matrix\r\n * @returns the hash code\r\n */\r\n public getHashCode(): number {\r\n let hash = _ExtractAsInt(this._m[0]);\r\n for (let i = 1; i < 16; i++) {\r\n hash = (hash * 397) ^ _ExtractAsInt(this._m[i]);\r\n }\r\n return hash;\r\n }\r\n\r\n /**\r\n * Decomposes the current Matrix into a translation, rotation and scaling components of the provided node\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#13\r\n * @param node the node to decompose the matrix to\r\n * @returns true if operation was successful\r\n */\r\n public decomposeToTransformNode(node: TransformNode): boolean {\r\n node.rotationQuaternion = node.rotationQuaternion || new Quaternion();\r\n return this.decompose(node.scaling, node.rotationQuaternion, node.position);\r\n }\r\n /**\r\n * Decomposes the current Matrix into a translation, rotation and scaling components\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#12\r\n * @param scale defines the scale vector3 given as a reference to update\r\n * @param rotation defines the rotation quaternion given as a reference to update\r\n * @param translation defines the translation vector3 given as a reference to update\r\n * @param preserveScalingNode Use scaling sign coming from this node. Otherwise scaling sign might change.\r\n * @param useAbsoluteScaling Use scaling sign coming from this absoluteScaling when true or scaling otherwise.\r\n * @returns true if operation was successful\r\n */\r\n public decompose(scale?: Vector3, rotation?: Quaternion, translation?: Vector3, preserveScalingNode?: TransformNode, useAbsoluteScaling: boolean = true): boolean {\r\n if (this._isIdentity) {\r\n if (translation) {\r\n translation.setAll(0);\r\n }\r\n if (scale) {\r\n scale.setAll(1);\r\n }\r\n if (rotation) {\r\n rotation.copyFromFloats(0, 0, 0, 1);\r\n }\r\n return true;\r\n }\r\n\r\n const m = this._m;\r\n if (translation) {\r\n translation.copyFromFloats(m[12], m[13], m[14]);\r\n }\r\n\r\n scale = scale || MathTmp.Vector3[0];\r\n\r\n scale.x = Math.sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]);\r\n scale.y = Math.sqrt(m[4] * m[4] + m[5] * m[5] + m[6] * m[6]);\r\n scale.z = Math.sqrt(m[8] * m[8] + m[9] * m[9] + m[10] * m[10]);\r\n\r\n if (preserveScalingNode) {\r\n const signX = (useAbsoluteScaling ? preserveScalingNode.absoluteScaling.x : preserveScalingNode.scaling.x) < 0 ? -1 : 1;\r\n const signY = (useAbsoluteScaling ? preserveScalingNode.absoluteScaling.y : preserveScalingNode.scaling.y) < 0 ? -1 : 1;\r\n const signZ = (useAbsoluteScaling ? preserveScalingNode.absoluteScaling.z : preserveScalingNode.scaling.z) < 0 ? -1 : 1;\r\n\r\n scale.x *= signX;\r\n scale.y *= signY;\r\n scale.z *= signZ;\r\n } else {\r\n if (this.determinant() <= 0) {\r\n scale.y *= -1;\r\n }\r\n }\r\n\r\n if (scale._x === 0 || scale._y === 0 || scale._z === 0) {\r\n if (rotation) {\r\n rotation.copyFromFloats(0.0, 0.0, 0.0, 1.0);\r\n }\r\n return false;\r\n }\r\n\r\n if (rotation) {\r\n const sx = 1 / scale._x,\r\n sy = 1 / scale._y,\r\n sz = 1 / scale._z;\r\n Matrix.FromValuesToRef(\r\n m[0] * sx,\r\n m[1] * sx,\r\n m[2] * sx,\r\n 0.0,\r\n m[4] * sy,\r\n m[5] * sy,\r\n m[6] * sy,\r\n 0.0,\r\n m[8] * sz,\r\n m[9] * sz,\r\n m[10] * sz,\r\n 0.0,\r\n 0.0,\r\n 0.0,\r\n 0.0,\r\n 1.0,\r\n MathTmp.Matrix[0]\r\n );\r\n\r\n Quaternion.FromRotationMatrixToRef(MathTmp.Matrix[0], rotation);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets specific row of the matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\r\n * @param index defines the number of the row to get\r\n * @returns the index-th row of the current matrix as a new Vector4\r\n */\r\n public getRow(index: number): Nullable {\r\n if (index < 0 || index > 3) {\r\n return null;\r\n }\r\n const i = index * 4;\r\n return new Vector4(this._m[i + 0], this._m[i + 1], this._m[i + 2], this._m[i + 3]);\r\n }\r\n\r\n /**\r\n * Gets specific row of the matrix to ref\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\r\n * @param index defines the number of the row to get\r\n * @param rowVector vector to store the index-th row of the current matrix\r\n * @returns result input\r\n */\r\n public getRowToRef(index: number, rowVector: T): T {\r\n if (index >= 0 && index <= 3) {\r\n const i = index * 4;\r\n rowVector.x = this._m[i + 0];\r\n rowVector.y = this._m[i + 1];\r\n rowVector.z = this._m[i + 2];\r\n rowVector.w = this._m[i + 3];\r\n }\r\n return rowVector;\r\n }\r\n\r\n /**\r\n * Sets the index-th row of the current matrix to the vector4 values\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\r\n * @param index defines the number of the row to set\r\n * @param row defines the target vector4\r\n * @returns the updated current matrix\r\n */\r\n public setRow(index: number, row: Vector4): this {\r\n return this.setRowFromFloats(index, row.x, row.y, row.z, row.w);\r\n }\r\n\r\n /**\r\n * Compute the transpose of the matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#40\r\n * @returns the new transposed matrix\r\n */\r\n public transpose(): this {\r\n const result = new (this.constructor as Constructor)();\r\n Matrix.TransposeToRef(this, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Compute the transpose of the matrix and store it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#41\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public transposeToRef(result: T): T {\r\n Matrix.TransposeToRef(this, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the index-th row of the current matrix with the given 4 x float values\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#36\r\n * @param index defines the row index\r\n * @param x defines the x component to set\r\n * @param y defines the y component to set\r\n * @param z defines the z component to set\r\n * @param w defines the w component to set\r\n * @returns the updated current matrix\r\n */\r\n public setRowFromFloats(index: number, x: number, y: number, z: number, w: number): this {\r\n if (index < 0 || index > 3) {\r\n return this;\r\n }\r\n const i = index * 4;\r\n this._m[i + 0] = x;\r\n this._m[i + 1] = y;\r\n this._m[i + 2] = z;\r\n this._m[i + 3] = w;\r\n\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Compute a new matrix set with the current matrix values multiplied by scale (float)\r\n * @param scale defines the scale factor\r\n * @returns a new matrix\r\n */\r\n public scale(scale: number): this {\r\n const result = new (this.constructor as Constructor)();\r\n this.scaleToRef(scale, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Scale the current matrix values by a factor to a given result matrix\r\n * @param scale defines the scale factor\r\n * @param result defines the matrix to store the result\r\n * @returns result input\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n for (let index = 0; index < 16; index++) {\r\n result._m[index] = this._m[index] * scale;\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Scale the current matrix values by a factor and add the result to a given matrix\r\n * @param scale defines the scale factor\r\n * @param result defines the Matrix to store the result\r\n * @returns result input\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n for (let index = 0; index < 16; index++) {\r\n result._m[index] += this._m[index] * scale;\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n public scaleInPlace(scale: number): this {\r\n const m = this._m;\r\n for (let i = 0; i < 16; i++) {\r\n m[i] *= scale;\r\n }\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Writes to the given matrix a normal matrix, computed from this one (using values from identity matrix for fourth row and column).\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#17\r\n * @param ref matrix to store the result\r\n * @returns the reference matrix\r\n */\r\n public toNormalMatrix(ref: T): T {\r\n const tmp = MathTmp.Matrix[0];\r\n this.invertToRef(tmp);\r\n tmp.transposeToRef(ref);\r\n const m = ref._m;\r\n Matrix.FromValuesToRef(m[0], m[1], m[2], 0.0, m[4], m[5], m[6], 0.0, m[8], m[9], m[10], 0.0, 0.0, 0.0, 0.0, 1.0, ref);\r\n return ref;\r\n }\r\n\r\n /**\r\n * Gets only rotation part of the current matrix\r\n * @returns a new matrix sets to the extracted rotation matrix from the current one\r\n */\r\n public getRotationMatrix(): this {\r\n const result = new (this.constructor as Constructor)();\r\n this.getRotationMatrixToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Extracts the rotation matrix from the current one and sets it as the given \"result\"\r\n * @param result defines the target matrix to store data to\r\n * @returns result input\r\n */\r\n public getRotationMatrixToRef(result: T): T {\r\n const scale = MathTmp.Vector3[0];\r\n if (!this.decompose(scale)) {\r\n Matrix.IdentityToRef(result);\r\n return result;\r\n }\r\n\r\n const m = this._m;\r\n const sx = 1 / scale._x,\r\n sy = 1 / scale._y,\r\n sz = 1 / scale._z;\r\n Matrix.FromValuesToRef(m[0] * sx, m[1] * sx, m[2] * sx, 0.0, m[4] * sy, m[5] * sy, m[6] * sy, 0.0, m[8] * sz, m[9] * sz, m[10] * sz, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Toggles model matrix from being right handed to left handed in place and vice versa\r\n * @returns the current updated matrix\r\n */\r\n public toggleModelMatrixHandInPlace(): this {\r\n const m = this._m;\r\n m[2] *= -1;\r\n m[6] *= -1;\r\n m[8] *= -1;\r\n m[9] *= -1;\r\n m[14] *= -1;\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n /**\r\n * Toggles projection matrix from being right handed to left handed in place and vice versa\r\n * @returns the current updated matrix\r\n */\r\n public toggleProjectionMatrixHandInPlace(): this {\r\n const m = this._m;\r\n m[8] *= -1;\r\n m[9] *= -1;\r\n m[10] *= -1;\r\n m[11] *= -1;\r\n this.markAsUpdated();\r\n return this;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a matrix from an array\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#42\r\n * @param array defines the source array\r\n * @param offset defines an offset in the source array\r\n * @returns a new Matrix set from the starting index of the given array\r\n */\r\n public static FromArray(array: DeepImmutable>, offset: number = 0): Matrix {\r\n const result = new Matrix();\r\n Matrix.FromArrayToRef(array, offset, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Copy the content of an array into a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#43\r\n * @param array defines the source array\r\n * @param offset defines an offset in the source array\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number, result: T): T {\r\n for (let index = 0; index < 16; index++) {\r\n result._m[index] = array[index + offset];\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Stores an array into a matrix after having multiplied each component by a given factor\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#50\r\n * @param array defines the source array\r\n * @param offset defines the offset in the source array\r\n * @param scale defines the scaling factor\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static FromFloat32ArrayToRefScaled(array: DeepImmutable>, offset: number, scale: number, result: T): T {\r\n for (let index = 0; index < 16; index++) {\r\n result._m[index] = array[index + offset] * scale;\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets an identity matrix that must not be updated\r\n */\r\n public static get IdentityReadOnly(): DeepImmutable {\r\n return Matrix._IdentityReadOnly;\r\n }\r\n\r\n /**\r\n * Stores a list of values (16) inside a given matrix\r\n * @param initialM11 defines 1st value of 1st row\r\n * @param initialM12 defines 2nd value of 1st row\r\n * @param initialM13 defines 3rd value of 1st row\r\n * @param initialM14 defines 4th value of 1st row\r\n * @param initialM21 defines 1st value of 2nd row\r\n * @param initialM22 defines 2nd value of 2nd row\r\n * @param initialM23 defines 3rd value of 2nd row\r\n * @param initialM24 defines 4th value of 2nd row\r\n * @param initialM31 defines 1st value of 3rd row\r\n * @param initialM32 defines 2nd value of 3rd row\r\n * @param initialM33 defines 3rd value of 3rd row\r\n * @param initialM34 defines 4th value of 3rd row\r\n * @param initialM41 defines 1st value of 4th row\r\n * @param initialM42 defines 2nd value of 4th row\r\n * @param initialM43 defines 3rd value of 4th row\r\n * @param initialM44 defines 4th value of 4th row\r\n * @param result defines the target matrix\r\n */\r\n public static FromValuesToRef(\r\n initialM11: number,\r\n initialM12: number,\r\n initialM13: number,\r\n initialM14: number,\r\n initialM21: number,\r\n initialM22: number,\r\n initialM23: number,\r\n initialM24: number,\r\n initialM31: number,\r\n initialM32: number,\r\n initialM33: number,\r\n initialM34: number,\r\n initialM41: number,\r\n initialM42: number,\r\n initialM43: number,\r\n initialM44: number,\r\n result: Matrix\r\n ): void {\r\n const m = result._m;\r\n m[0] = initialM11;\r\n m[1] = initialM12;\r\n m[2] = initialM13;\r\n m[3] = initialM14;\r\n m[4] = initialM21;\r\n m[5] = initialM22;\r\n m[6] = initialM23;\r\n m[7] = initialM24;\r\n m[8] = initialM31;\r\n m[9] = initialM32;\r\n m[10] = initialM33;\r\n m[11] = initialM34;\r\n m[12] = initialM41;\r\n m[13] = initialM42;\r\n m[14] = initialM43;\r\n m[15] = initialM44;\r\n\r\n result.markAsUpdated();\r\n }\r\n\r\n /**\r\n * Creates new matrix from a list of values (16)\r\n * @param initialM11 defines 1st value of 1st row\r\n * @param initialM12 defines 2nd value of 1st row\r\n * @param initialM13 defines 3rd value of 1st row\r\n * @param initialM14 defines 4th value of 1st row\r\n * @param initialM21 defines 1st value of 2nd row\r\n * @param initialM22 defines 2nd value of 2nd row\r\n * @param initialM23 defines 3rd value of 2nd row\r\n * @param initialM24 defines 4th value of 2nd row\r\n * @param initialM31 defines 1st value of 3rd row\r\n * @param initialM32 defines 2nd value of 3rd row\r\n * @param initialM33 defines 3rd value of 3rd row\r\n * @param initialM34 defines 4th value of 3rd row\r\n * @param initialM41 defines 1st value of 4th row\r\n * @param initialM42 defines 2nd value of 4th row\r\n * @param initialM43 defines 3rd value of 4th row\r\n * @param initialM44 defines 4th value of 4th row\r\n * @returns the new matrix\r\n */\r\n public static FromValues(\r\n initialM11: number,\r\n initialM12: number,\r\n initialM13: number,\r\n initialM14: number,\r\n initialM21: number,\r\n initialM22: number,\r\n initialM23: number,\r\n initialM24: number,\r\n initialM31: number,\r\n initialM32: number,\r\n initialM33: number,\r\n initialM34: number,\r\n initialM41: number,\r\n initialM42: number,\r\n initialM43: number,\r\n initialM44: number\r\n ): Matrix {\r\n const result = new Matrix();\r\n const m = result._m;\r\n m[0] = initialM11;\r\n m[1] = initialM12;\r\n m[2] = initialM13;\r\n m[3] = initialM14;\r\n m[4] = initialM21;\r\n m[5] = initialM22;\r\n m[6] = initialM23;\r\n m[7] = initialM24;\r\n m[8] = initialM31;\r\n m[9] = initialM32;\r\n m[10] = initialM33;\r\n m[11] = initialM34;\r\n m[12] = initialM41;\r\n m[13] = initialM42;\r\n m[14] = initialM43;\r\n m[15] = initialM44;\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new matrix composed by merging scale (vector3), rotation (quaternion) and translation (vector3)\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#24\r\n * @param scale defines the scale vector3\r\n * @param rotation defines the rotation quaternion\r\n * @param translation defines the translation vector3\r\n * @returns a new matrix\r\n */\r\n public static Compose(scale: DeepImmutable, rotation: DeepImmutable, translation: DeepImmutable): Matrix {\r\n const result = new Matrix();\r\n Matrix.ComposeToRef(scale, rotation, translation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets a matrix to a value composed by merging scale (vector3), rotation (quaternion) and translation (vector3)\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#25\r\n * @param scale defines the scale vector3\r\n * @param rotation defines the rotation quaternion\r\n * @param translation defines the translation vector3\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static ComposeToRef(scale: DeepImmutable, rotation: DeepImmutable, translation: DeepImmutable, result: T): T {\r\n const m = result._m;\r\n const x = rotation._x,\r\n y = rotation._y,\r\n z = rotation._z,\r\n w = rotation._w;\r\n const x2 = x + x,\r\n y2 = y + y,\r\n z2 = z + z;\r\n const xx = x * x2,\r\n xy = x * y2,\r\n xz = x * z2;\r\n const yy = y * y2,\r\n yz = y * z2,\r\n zz = z * z2;\r\n const wx = w * x2,\r\n wy = w * y2,\r\n wz = w * z2;\r\n\r\n const sx = scale._x,\r\n sy = scale._y,\r\n sz = scale._z;\r\n\r\n m[0] = (1 - (yy + zz)) * sx;\r\n m[1] = (xy + wz) * sx;\r\n m[2] = (xz - wy) * sx;\r\n m[3] = 0;\r\n\r\n m[4] = (xy - wz) * sy;\r\n m[5] = (1 - (xx + zz)) * sy;\r\n m[6] = (yz + wx) * sy;\r\n m[7] = 0;\r\n\r\n m[8] = (xz + wy) * sz;\r\n m[9] = (yz - wx) * sz;\r\n m[10] = (1 - (xx + yy)) * sz;\r\n m[11] = 0;\r\n\r\n m[12] = translation._x;\r\n m[13] = translation._y;\r\n m[14] = translation._z;\r\n m[15] = 1;\r\n\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new identity matrix\r\n * @returns a new identity matrix\r\n */\r\n public static Identity(): Matrix {\r\n const identity = Matrix.FromValues(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0);\r\n identity._updateIdentityStatus(true);\r\n return identity;\r\n }\r\n\r\n /**\r\n * Creates a new identity matrix and stores the result in a given matrix\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static IdentityToRef(result: T): T {\r\n Matrix.FromValuesToRef(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n result._updateIdentityStatus(true);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new zero matrix\r\n * @returns a new zero matrix\r\n */\r\n public static Zero(): Matrix {\r\n const zero = Matrix.FromValues(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\n zero._updateIdentityStatus(false);\r\n return zero;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the X axis\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#97\r\n * @param angle defines the angle (in radians) to use\r\n * @returns the new matrix\r\n */\r\n public static RotationX(angle: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.RotationXToRef(angle, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new matrix as the invert of a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#124\r\n * @param source defines the source matrix\r\n * @returns the new matrix\r\n */\r\n public static Invert(source: DeepImmutable): T {\r\n const result = new (source.constructor as Constructor)();\r\n source.invertToRef(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the X axis and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#98\r\n * @param angle defines the angle (in radians) to use\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static RotationXToRef(angle: number, result: T): T {\r\n const s = Math.sin(angle);\r\n const c = Math.cos(angle);\r\n Matrix.FromValuesToRef(1.0, 0.0, 0.0, 0.0, 0.0, c, s, 0.0, 0.0, -s, c, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n\r\n result._updateIdentityStatus(c === 1 && s === 0);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the Y axis\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#99\r\n * @param angle defines the angle (in radians) to use\r\n * @returns the new matrix\r\n */\r\n public static RotationY(angle: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.RotationYToRef(angle, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the Y axis and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#100\r\n * @param angle defines the angle (in radians) to use\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static RotationYToRef(angle: number, result: T): T {\r\n const s = Math.sin(angle);\r\n const c = Math.cos(angle);\r\n Matrix.FromValuesToRef(c, 0.0, -s, 0.0, 0.0, 1.0, 0.0, 0.0, s, 0.0, c, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n\r\n result._updateIdentityStatus(c === 1 && s === 0);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the Z axis\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#101\r\n * @param angle defines the angle (in radians) to use\r\n * @returns the new matrix\r\n */\r\n public static RotationZ(angle: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.RotationZToRef(angle, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the Z axis and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#102\r\n * @param angle defines the angle (in radians) to use\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static RotationZToRef(angle: number, result: T): T {\r\n const s = Math.sin(angle);\r\n const c = Math.cos(angle);\r\n Matrix.FromValuesToRef(c, s, 0.0, 0.0, -s, c, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n\r\n result._updateIdentityStatus(c === 1 && s === 0);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the given axis\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#96\r\n * @param axis defines the axis to use\r\n * @param angle defines the angle (in radians) to use\r\n * @returns the new matrix\r\n */\r\n public static RotationAxis(axis: DeepImmutable, angle: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.RotationAxisToRef(axis, angle, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new rotation matrix for \"angle\" radians around the given axis and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#94\r\n * @param axis defines the axis to use\r\n * @param angle defines the angle (in radians) to use\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static RotationAxisToRef(axis: DeepImmutable, angle: number, result: T): T {\r\n const s = Math.sin(-angle);\r\n const c = Math.cos(-angle);\r\n const c1 = 1 - c;\r\n\r\n axis.normalize();\r\n const m = result._m;\r\n m[0] = axis._x * axis._x * c1 + c;\r\n m[1] = axis._x * axis._y * c1 - axis._z * s;\r\n m[2] = axis._x * axis._z * c1 + axis._y * s;\r\n m[3] = 0.0;\r\n\r\n m[4] = axis._y * axis._x * c1 + axis._z * s;\r\n m[5] = axis._y * axis._y * c1 + c;\r\n m[6] = axis._y * axis._z * c1 - axis._x * s;\r\n m[7] = 0.0;\r\n\r\n m[8] = axis._z * axis._x * c1 - axis._y * s;\r\n m[9] = axis._z * axis._y * c1 + axis._x * s;\r\n m[10] = axis._z * axis._z * c1 + c;\r\n m[11] = 0.0;\r\n\r\n m[12] = 0.0;\r\n m[13] = 0.0;\r\n m[14] = 0.0;\r\n m[15] = 1.0;\r\n\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Takes normalised vectors and returns a rotation matrix to align \"from\" with \"to\".\r\n * Taken from http://www.iquilezles.org/www/articles/noacos/noacos.htm\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#93\r\n * @param from defines the vector to align\r\n * @param to defines the vector to align to\r\n * @param result defines the target matrix\r\n * @param useYAxisForCoplanar defines a boolean indicating that we should favor Y axis for coplanar vectors (default is false)\r\n * @returns result input\r\n */\r\n public static RotationAlignToRef(from: DeepImmutable, to: DeepImmutable, result: T, useYAxisForCoplanar = false): T {\r\n const c = Vector3.Dot(to, from);\r\n const m = result._m;\r\n if (c < -1 + Epsilon) {\r\n // from and to are colinear and opposite direction.\r\n // compute a PI rotation on Y axis\r\n m[0] = -1;\r\n m[1] = 0;\r\n m[2] = 0;\r\n m[3] = 0;\r\n m[4] = 0;\r\n m[5] = useYAxisForCoplanar ? 1 : -1;\r\n m[6] = 0;\r\n m[7] = 0;\r\n m[8] = 0;\r\n m[9] = 0;\r\n m[10] = useYAxisForCoplanar ? -1 : 1;\r\n m[11] = 0;\r\n } else {\r\n const v = Vector3.Cross(to, from);\r\n const k = 1 / (1 + c);\r\n\r\n m[0] = v._x * v._x * k + c;\r\n m[1] = v._y * v._x * k - v._z;\r\n m[2] = v._z * v._x * k + v._y;\r\n m[3] = 0;\r\n m[4] = v._x * v._y * k + v._z;\r\n m[5] = v._y * v._y * k + c;\r\n m[6] = v._z * v._y * k - v._x;\r\n m[7] = 0;\r\n m[8] = v._x * v._z * k - v._y;\r\n m[9] = v._y * v._z * k + v._x;\r\n m[10] = v._z * v._z * k + c;\r\n m[11] = 0;\r\n }\r\n m[12] = 0;\r\n m[13] = 0;\r\n m[14] = 0;\r\n m[15] = 1;\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a rotation matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#103\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#105\r\n * @param yaw defines the yaw angle in radians (Y axis)\r\n * @param pitch defines the pitch angle in radians (X axis)\r\n * @param roll defines the roll angle in radians (Z axis)\r\n * @returns the new rotation matrix\r\n */\r\n public static RotationYawPitchRoll(yaw: number, pitch: number, roll: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.RotationYawPitchRollToRef(yaw, pitch, roll, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a rotation matrix and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#104\r\n * @param yaw defines the yaw angle in radians (Y axis)\r\n * @param pitch defines the pitch angle in radians (X axis)\r\n * @param roll defines the roll angle in radians (Z axis)\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static RotationYawPitchRollToRef(yaw: number, pitch: number, roll: number, result: T): T {\r\n Quaternion.RotationYawPitchRollToRef(yaw, pitch, roll, MathTmp.Quaternion[0]);\r\n MathTmp.Quaternion[0].toRotationMatrix(result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a scaling matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#107\r\n * @param x defines the scale factor on X axis\r\n * @param y defines the scale factor on Y axis\r\n * @param z defines the scale factor on Z axis\r\n * @returns the new matrix\r\n */\r\n public static Scaling(x: number, y: number, z: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.ScalingToRef(x, y, z, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a scaling matrix and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#108\r\n * @param x defines the scale factor on X axis\r\n * @param y defines the scale factor on Y axis\r\n * @param z defines the scale factor on Z axis\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static ScalingToRef(x: number, y: number, z: number, result: T): T {\r\n Matrix.FromValuesToRef(x, 0.0, 0.0, 0.0, 0.0, y, 0.0, 0.0, 0.0, 0.0, z, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n\r\n result._updateIdentityStatus(x === 1 && y === 1 && z === 1);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a translation matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#109\r\n * @param x defines the translation on X axis\r\n * @param y defines the translation on Y axis\r\n * @param z defines the translationon Z axis\r\n * @returns the new matrix\r\n */\r\n public static Translation(x: number, y: number, z: number): Matrix {\r\n const result = new Matrix();\r\n Matrix.TranslationToRef(x, y, z, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a translation matrix and stores it in a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#110\r\n * @param x defines the translation on X axis\r\n * @param y defines the translation on Y axis\r\n * @param z defines the translationon Z axis\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static TranslationToRef(x: number, y: number, z: number, result: T): T {\r\n Matrix.FromValuesToRef(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, x, y, z, 1.0, result);\r\n result._updateIdentityStatus(x === 0 && y === 0 && z === 0);\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Matrix whose values are the interpolated values for \"gradient\" (float) between the ones of the matrices \"startValue\" and \"endValue\".\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#55\r\n * @param startValue defines the start value\r\n * @param endValue defines the end value\r\n * @param gradient defines the gradient factor\r\n * @returns the new matrix\r\n */\r\n public static Lerp(startValue: DeepImmutable, endValue: DeepImmutable, gradient: number): T {\r\n const result = new (startValue.constructor as Constructor)();\r\n Matrix.LerpToRef(startValue, endValue, gradient, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Set the given matrix \"result\" as the interpolated values for \"gradient\" (float) between the ones of the matrices \"startValue\" and \"endValue\".\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#54\r\n * @param startValue defines the start value\r\n * @param endValue defines the end value\r\n * @param gradient defines the gradient factor\r\n * @param result defines the Matrix object where to store data\r\n * @returns result input\r\n */\r\n public static LerpToRef(startValue: DeepImmutable, endValue: DeepImmutable, gradient: number, result: T): T {\r\n const resultM = result._m;\r\n const startM = startValue.m;\r\n const endM = endValue.m;\r\n for (let index = 0; index < 16; index++) {\r\n resultM[index] = startM[index] * (1.0 - gradient) + endM[index] * gradient;\r\n }\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Builds a new matrix whose values are computed by:\r\n * * decomposing the \"startValue\" and \"endValue\" matrices into their respective scale, rotation and translation matrices\r\n * * interpolating for \"gradient\" (float) the values between each of these decomposed matrices between the start and the end\r\n * * recomposing a new matrix from these 3 interpolated scale, rotation and translation matrices\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#22\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#51\r\n * @param startValue defines the first matrix\r\n * @param endValue defines the second matrix\r\n * @param gradient defines the gradient between the two matrices\r\n * @returns the new matrix\r\n */\r\n public static DecomposeLerp(startValue: DeepImmutable, endValue: DeepImmutable, gradient: number): T {\r\n const result = new (startValue.constructor as Constructor)();\r\n Matrix.DecomposeLerpToRef(startValue, endValue, gradient, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Update a matrix to values which are computed by:\r\n * * decomposing the \"startValue\" and \"endValue\" matrices into their respective scale, rotation and translation matrices\r\n * * interpolating for \"gradient\" (float) the values between each of these decomposed matrices between the start and the end\r\n * * recomposing a new matrix from these 3 interpolated scale, rotation and translation matrices\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#23\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#53\r\n * @param startValue defines the first matrix\r\n * @param endValue defines the second matrix\r\n * @param gradient defines the gradient between the two matrices\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static DecomposeLerpToRef(startValue: DeepImmutable, endValue: DeepImmutable, gradient: number, result: T): T {\r\n const startScale = MathTmp.Vector3[0];\r\n const startRotation = MathTmp.Quaternion[0];\r\n const startTranslation = MathTmp.Vector3[1];\r\n startValue.decompose(startScale, startRotation, startTranslation);\r\n\r\n const endScale = MathTmp.Vector3[2];\r\n const endRotation = MathTmp.Quaternion[1];\r\n const endTranslation = MathTmp.Vector3[3];\r\n endValue.decompose(endScale, endRotation, endTranslation);\r\n\r\n const resultScale = MathTmp.Vector3[4];\r\n Vector3.LerpToRef(startScale, endScale, gradient, resultScale);\r\n const resultRotation = MathTmp.Quaternion[2];\r\n Quaternion.SlerpToRef(startRotation, endRotation, gradient, resultRotation);\r\n\r\n const resultTranslation = MathTmp.Vector3[5];\r\n Vector3.LerpToRef(startTranslation, endTranslation, gradient, resultTranslation);\r\n\r\n Matrix.ComposeToRef(resultScale, resultRotation, resultTranslation, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\r\n * This function generates a matrix suitable for a left handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#58\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#59\r\n * @param eye defines the final position of the entity\r\n * @param target defines where the entity should look at\r\n * @param up defines the up vector for the entity\r\n * @returns the new matrix\r\n */\r\n public static LookAtLH(eye: DeepImmutable, target: DeepImmutable, up: DeepImmutable): Matrix {\r\n const result = new Matrix();\r\n Matrix.LookAtLHToRef(eye, target, up, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\r\n * This function generates a matrix suitable for a left handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#60\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#61\r\n * @param eye defines the final position of the entity\r\n * @param target defines where the entity should look at\r\n * @param up defines the up vector for the entity\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static LookAtLHToRef(eye: DeepImmutable, target: DeepImmutable, up: DeepImmutable, result: Matrix): Matrix {\r\n const xAxis = MathTmp.Vector3[0];\r\n const yAxis = MathTmp.Vector3[1];\r\n const zAxis = MathTmp.Vector3[2];\r\n\r\n // Z axis\r\n target.subtractToRef(eye, zAxis);\r\n zAxis.normalize();\r\n\r\n // X axis\r\n Vector3.CrossToRef(up, zAxis, xAxis);\r\n\r\n const xSquareLength = xAxis.lengthSquared();\r\n if (xSquareLength === 0) {\r\n xAxis.x = 1.0;\r\n } else {\r\n xAxis.normalizeFromLength(Math.sqrt(xSquareLength));\r\n }\r\n\r\n // Y axis\r\n Vector3.CrossToRef(zAxis, xAxis, yAxis);\r\n yAxis.normalize();\r\n\r\n // Eye angles\r\n const ex = -Vector3.Dot(xAxis, eye);\r\n const ey = -Vector3.Dot(yAxis, eye);\r\n const ez = -Vector3.Dot(zAxis, eye);\r\n\r\n Matrix.FromValuesToRef(xAxis._x, yAxis._x, zAxis._x, 0.0, xAxis._y, yAxis._y, zAxis._y, 0.0, xAxis._z, yAxis._z, zAxis._z, 0.0, ex, ey, ez, 1.0, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\r\n * This function generates a matrix suitable for a right handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#62\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#63\r\n * @param eye defines the final position of the entity\r\n * @param target defines where the entity should look at\r\n * @param up defines the up vector for the entity\r\n * @returns the new matrix\r\n */\r\n public static LookAtRH(eye: DeepImmutable, target: DeepImmutable, up: DeepImmutable): Matrix {\r\n const result = new Matrix();\r\n Matrix.LookAtRHToRef(eye, target, up, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.\r\n * This function generates a matrix suitable for a right handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#64\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#65\r\n * @param eye defines the final position of the entity\r\n * @param target defines where the entity should look at\r\n * @param up defines the up vector for the entity\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static LookAtRHToRef(eye: DeepImmutable, target: DeepImmutable, up: DeepImmutable, result: T): T {\r\n const xAxis = MathTmp.Vector3[0];\r\n const yAxis = MathTmp.Vector3[1];\r\n const zAxis = MathTmp.Vector3[2];\r\n\r\n // Z axis\r\n eye.subtractToRef(target, zAxis);\r\n zAxis.normalize();\r\n\r\n // X axis\r\n Vector3.CrossToRef(up, zAxis, xAxis);\r\n\r\n const xSquareLength = xAxis.lengthSquared();\r\n if (xSquareLength === 0) {\r\n xAxis.x = 1.0;\r\n } else {\r\n xAxis.normalizeFromLength(Math.sqrt(xSquareLength));\r\n }\r\n\r\n // Y axis\r\n Vector3.CrossToRef(zAxis, xAxis, yAxis);\r\n yAxis.normalize();\r\n\r\n // Eye angles\r\n const ex = -Vector3.Dot(xAxis, eye);\r\n const ey = -Vector3.Dot(yAxis, eye);\r\n const ez = -Vector3.Dot(zAxis, eye);\r\n\r\n Matrix.FromValuesToRef(xAxis._x, yAxis._x, zAxis._x, 0.0, xAxis._y, yAxis._y, zAxis._y, 0.0, xAxis._z, yAxis._z, zAxis._z, 0.0, ex, ey, ez, 1.0, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\r\n * This function generates a matrix suitable for a left handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#66\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @returns the new matrix\r\n */\r\n public static LookDirectionLH(forward: DeepImmutable, up: DeepImmutable): Matrix {\r\n const result = new Matrix();\r\n Matrix.LookDirectionLHToRef(forward, up, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\r\n * This function generates a matrix suitable for a left handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#67\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static LookDirectionLHToRef(forward: DeepImmutable, up: DeepImmutable, result: T): T {\r\n const back = MathTmp.Vector3[0];\r\n back.copyFrom(forward);\r\n back.scaleInPlace(-1);\r\n const left = MathTmp.Vector3[1];\r\n Vector3.CrossToRef(up, back, left);\r\n\r\n // Generate the rotation matrix.\r\n Matrix.FromValuesToRef(left._x, left._y, left._z, 0.0, up._x, up._y, up._z, 0.0, back._x, back._y, back._z, 0.0, 0, 0, 0, 1.0, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\r\n * This function generates a matrix suitable for a right handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#68\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @returns the new matrix\r\n */\r\n public static LookDirectionRH(forward: DeepImmutable, up: DeepImmutable): Matrix {\r\n const result = new Matrix();\r\n Matrix.LookDirectionRHToRef(forward, up, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given \"result\" Matrix to a matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)\r\n * This function generates a matrix suitable for a right handed coordinate system\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#69\r\n * @param forward defines the forward direction - Must be normalized and orthogonal to up.\r\n * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static LookDirectionRHToRef(forward: DeepImmutable, up: DeepImmutable, result: T): T {\r\n const right = MathTmp.Vector3[2];\r\n Vector3.CrossToRef(up, forward, right);\r\n\r\n // Generate the rotation matrix.\r\n Matrix.FromValuesToRef(right._x, right._y, right._z, 0.0, up._x, up._y, up._z, 0.0, forward._x, forward._y, forward._z, 0.0, 0, 0, 0, 1.0, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a left-handed orthographic projection matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#70\r\n * @param width defines the viewport width\r\n * @param height defines the viewport height\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns a new matrix as a left-handed orthographic projection matrix\r\n */\r\n public static OrthoLH(width: number, height: number, znear: number, zfar: number, halfZRange?: boolean): Matrix {\r\n const matrix = new Matrix();\r\n Matrix.OrthoLHToRef(width, height, znear, zfar, matrix, halfZRange);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Store a left-handed orthographic projection to a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#71\r\n * @param width defines the viewport width\r\n * @param height defines the viewport height\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param result defines the target matrix\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns result input\r\n */\r\n public static OrthoLHToRef(width: number, height: number, znear: number, zfar: number, result: T, halfZRange?: boolean): T {\r\n const n = znear;\r\n const f = zfar;\r\n\r\n const a = 2.0 / width;\r\n const b = 2.0 / height;\r\n const c = 2.0 / (f - n);\r\n const d = -(f + n) / (f - n);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, 0.0, 0.0, 0.0, c, 0.0, 0.0, 0.0, d, 1.0, result);\r\n\r\n if (halfZRange) {\r\n result.multiplyToRef(mtxConvertNDCToHalfZRange, result);\r\n }\r\n\r\n result._updateIdentityStatus(a === 1 && b === 1 && c === 1 && d === 0);\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a left-handed orthographic projection matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#72\r\n * @param left defines the viewport left coordinate\r\n * @param right defines the viewport right coordinate\r\n * @param bottom defines the viewport bottom coordinate\r\n * @param top defines the viewport top coordinate\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns a new matrix as a left-handed orthographic projection matrix\r\n */\r\n public static OrthoOffCenterLH(left: number, right: number, bottom: number, top: number, znear: number, zfar: number, halfZRange?: boolean): Matrix {\r\n const matrix = new Matrix();\r\n Matrix.OrthoOffCenterLHToRef(left, right, bottom, top, znear, zfar, matrix, halfZRange);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Stores a left-handed orthographic projection into a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#73\r\n * @param left defines the viewport left coordinate\r\n * @param right defines the viewport right coordinate\r\n * @param bottom defines the viewport bottom coordinate\r\n * @param top defines the viewport top coordinate\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param result defines the target matrix\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns result input\r\n */\r\n public static OrthoOffCenterLHToRef(\r\n left: number,\r\n right: number,\r\n bottom: number,\r\n top: number,\r\n znear: number,\r\n zfar: number,\r\n result: T,\r\n halfZRange?: boolean\r\n ): T {\r\n const n = znear;\r\n const f = zfar;\r\n\r\n const a = 2.0 / (right - left);\r\n const b = 2.0 / (top - bottom);\r\n const c = 2.0 / (f - n);\r\n const d = -(f + n) / (f - n);\r\n const i0 = (left + right) / (left - right);\r\n const i1 = (top + bottom) / (bottom - top);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, 0.0, 0.0, 0.0, c, 0.0, i0, i1, d, 1.0, result);\r\n\r\n if (halfZRange) {\r\n result.multiplyToRef(mtxConvertNDCToHalfZRange, result);\r\n }\r\n\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n\r\n /**\r\n * Stores a left-handed oblique projection into a given matrix\r\n * @param left defines the viewport left coordinate\r\n * @param right defines the viewport right coordinate\r\n * @param bottom defines the viewport bottom coordinate\r\n * @param top defines the viewport top coordinate\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param length Length of the shear\r\n * @param angle Angle (along X/Y Plane) to apply shear\r\n * @param distance Distance from shear point\r\n * @param result defines the target matrix\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns result input\r\n */\r\n public static ObliqueOffCenterLHToRef(\r\n left: number,\r\n right: number,\r\n bottom: number,\r\n top: number,\r\n znear: number,\r\n zfar: number,\r\n length: number,\r\n angle: number,\r\n distance: number,\r\n result: T,\r\n halfZRange?: boolean\r\n ): T {\r\n const a = -length * Math.cos(angle);\r\n const b = -length * Math.sin(angle);\r\n\r\n Matrix.TranslationToRef(0, 0, -distance, MathTmp.Matrix[1]);\r\n Matrix.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, a, b, 1, 0, 0, 0, 0, 1, MathTmp.Matrix[0]);\r\n MathTmp.Matrix[1].multiplyToRef(MathTmp.Matrix[0], MathTmp.Matrix[0]);\r\n Matrix.TranslationToRef(0, 0, distance, MathTmp.Matrix[1]);\r\n MathTmp.Matrix[0].multiplyToRef(MathTmp.Matrix[1], MathTmp.Matrix[0]);\r\n\r\n Matrix.OrthoOffCenterLHToRef(left, right, bottom, top, znear, zfar, result, halfZRange);\r\n MathTmp.Matrix[0].multiplyToRef(result, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a right-handed orthographic projection matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#76\r\n * @param left defines the viewport left coordinate\r\n * @param right defines the viewport right coordinate\r\n * @param bottom defines the viewport bottom coordinate\r\n * @param top defines the viewport top coordinate\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns a new matrix as a right-handed orthographic projection matrix\r\n */\r\n public static OrthoOffCenterRH(left: number, right: number, bottom: number, top: number, znear: number, zfar: number, halfZRange?: boolean): Matrix {\r\n const matrix = new Matrix();\r\n Matrix.OrthoOffCenterRHToRef(left, right, bottom, top, znear, zfar, matrix, halfZRange);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Stores a right-handed orthographic projection into a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#77\r\n * @param left defines the viewport left coordinate\r\n * @param right defines the viewport right coordinate\r\n * @param bottom defines the viewport bottom coordinate\r\n * @param top defines the viewport top coordinate\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param result defines the target matrix\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns result input\r\n */\r\n public static OrthoOffCenterRHToRef(\r\n left: number,\r\n right: number,\r\n bottom: number,\r\n top: number,\r\n znear: number,\r\n zfar: number,\r\n result: T,\r\n halfZRange?: boolean\r\n ): T {\r\n Matrix.OrthoOffCenterLHToRef(left, right, bottom, top, znear, zfar, result, halfZRange);\r\n result._m[10] *= -1; // No need to call markAsUpdated as previous function already called it and let _isIdentityDirty to true\r\n return result;\r\n }\r\n\r\n /**\r\n * Stores a right-handed oblique projection into a given matrix\r\n * @param left defines the viewport left coordinate\r\n * @param right defines the viewport right coordinate\r\n * @param bottom defines the viewport bottom coordinate\r\n * @param top defines the viewport top coordinate\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param length Length of the shear\r\n * @param angle Angle (along X/Y Plane) to apply shear\r\n * @param distance Distance from shear point\r\n * @param result defines the target matrix\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @returns result input\r\n */\r\n public static ObliqueOffCenterRHToRef(\r\n left: number,\r\n right: number,\r\n bottom: number,\r\n top: number,\r\n znear: number,\r\n zfar: number,\r\n length: number,\r\n angle: number,\r\n distance: number,\r\n result: T,\r\n halfZRange?: boolean\r\n ): T {\r\n const a = length * Math.cos(angle);\r\n const b = length * Math.sin(angle);\r\n\r\n Matrix.TranslationToRef(0, 0, distance, MathTmp.Matrix[1]);\r\n Matrix.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, a, b, 1, 0, 0, 0, 0, 1, MathTmp.Matrix[0]);\r\n MathTmp.Matrix[1].multiplyToRef(MathTmp.Matrix[0], MathTmp.Matrix[0]);\r\n Matrix.TranslationToRef(0, 0, -distance, MathTmp.Matrix[1]);\r\n MathTmp.Matrix[0].multiplyToRef(MathTmp.Matrix[1], MathTmp.Matrix[0]);\r\n\r\n Matrix.OrthoOffCenterRHToRef(left, right, bottom, top, znear, zfar, result, halfZRange);\r\n MathTmp.Matrix[0].multiplyToRef(result, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a left-handed perspective projection matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#85\r\n * @param width defines the viewport width\r\n * @param height defines the viewport height\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @returns a new matrix as a left-handed perspective projection matrix\r\n */\r\n public static PerspectiveLH(width: number, height: number, znear: number, zfar: number, halfZRange?: boolean, projectionPlaneTilt: number = 0): Matrix {\r\n const matrix = new Matrix();\r\n\r\n const n = znear;\r\n const f = zfar;\r\n\r\n const a = (2.0 * n) / width;\r\n const b = (2.0 * n) / height;\r\n const c = (f + n) / (f - n);\r\n const d = (-2.0 * f * n) / (f - n);\r\n const rot = Math.tan(projectionPlaneTilt);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, rot, 0.0, 0.0, c, 1.0, 0.0, 0.0, d, 0.0, matrix);\r\n\r\n if (halfZRange) {\r\n matrix.multiplyToRef(mtxConvertNDCToHalfZRange, matrix);\r\n }\r\n\r\n matrix._updateIdentityStatus(false);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Creates a left-handed perspective projection matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#78\r\n * @param fov defines the horizontal field of view\r\n * @param aspect defines the aspect ratio\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\r\n * @returns a new matrix as a left-handed perspective projection matrix\r\n */\r\n public static PerspectiveFovLH(\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n halfZRange?: boolean,\r\n projectionPlaneTilt: number = 0,\r\n reverseDepthBufferMode: boolean = false\r\n ): Matrix {\r\n const matrix = new Matrix();\r\n Matrix.PerspectiveFovLHToRef(fov, aspect, znear, zfar, matrix, true, halfZRange, projectionPlaneTilt, reverseDepthBufferMode);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Stores a left-handed perspective projection into a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#81\r\n * @param fov defines the horizontal field of view\r\n * @param aspect defines the aspect ratio\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\r\n * @param result defines the target matrix\r\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\r\n * @returns result input\r\n */\r\n public static PerspectiveFovLHToRef(\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n result: T,\r\n isVerticalFovFixed = true,\r\n halfZRange?: boolean,\r\n projectionPlaneTilt: number = 0,\r\n reverseDepthBufferMode: boolean = false\r\n ): T {\r\n const n = znear;\r\n const f = zfar;\r\n\r\n const t = 1.0 / Math.tan(fov * 0.5);\r\n const a = isVerticalFovFixed ? t / aspect : t;\r\n const b = isVerticalFovFixed ? t : t * aspect;\r\n const c = reverseDepthBufferMode && n === 0 ? -1 : f !== 0 ? (f + n) / (f - n) : 1;\r\n const d = reverseDepthBufferMode && n === 0 ? 2 * f : f !== 0 ? (-2.0 * f * n) / (f - n) : -2 * n;\r\n const rot = Math.tan(projectionPlaneTilt);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, rot, 0.0, 0.0, c, 1.0, 0.0, 0.0, d, 0.0, result);\r\n\r\n if (halfZRange) {\r\n result.multiplyToRef(mtxConvertNDCToHalfZRange, result);\r\n }\r\n\r\n result._updateIdentityStatus(false);\r\n return result;\r\n }\r\n\r\n /**\r\n * Stores a left-handed perspective projection into a given matrix with depth reversed\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#89\r\n * @param fov defines the horizontal field of view\r\n * @param aspect defines the aspect ratio\r\n * @param znear defines the near clip plane\r\n * @param zfar not used as infinity is used as far clip\r\n * @param result defines the target matrix\r\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @returns result input\r\n */\r\n public static PerspectiveFovReverseLHToRef(\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n result: T,\r\n isVerticalFovFixed = true,\r\n halfZRange?: boolean,\r\n projectionPlaneTilt: number = 0\r\n ): T {\r\n const t = 1.0 / Math.tan(fov * 0.5);\r\n const a = isVerticalFovFixed ? t / aspect : t;\r\n const b = isVerticalFovFixed ? t : t * aspect;\r\n const rot = Math.tan(projectionPlaneTilt);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, rot, 0.0, 0.0, -znear, 1.0, 0.0, 0.0, 1.0, 0.0, result);\r\n if (halfZRange) {\r\n result.multiplyToRef(mtxConvertNDCToHalfZRange, result);\r\n }\r\n result._updateIdentityStatus(false);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a right-handed perspective projection matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#83\r\n * @param fov defines the horizontal field of view\r\n * @param aspect defines the aspect ratio\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\r\n * @returns a new matrix as a right-handed perspective projection matrix\r\n */\r\n public static PerspectiveFovRH(\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n halfZRange?: boolean,\r\n projectionPlaneTilt: number = 0,\r\n reverseDepthBufferMode: boolean = false\r\n ): Matrix {\r\n const matrix = new Matrix();\r\n Matrix.PerspectiveFovRHToRef(fov, aspect, znear, zfar, matrix, true, halfZRange, projectionPlaneTilt, reverseDepthBufferMode);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Stores a right-handed perspective projection into a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#84\r\n * @param fov defines the horizontal field of view\r\n * @param aspect defines the aspect ratio\r\n * @param znear defines the near clip plane\r\n * @param zfar defines the far clip plane. If 0, assume we are in \"infinite zfar\" mode\r\n * @param result defines the target matrix\r\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)\r\n * @returns result input\r\n */\r\n public static PerspectiveFovRHToRef(\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n result: T,\r\n isVerticalFovFixed = true,\r\n halfZRange?: boolean,\r\n projectionPlaneTilt: number = 0,\r\n reverseDepthBufferMode: boolean = false\r\n ): T {\r\n //alternatively this could be expressed as:\r\n // m = PerspectiveFovLHToRef\r\n // m[10] *= -1.0;\r\n // m[11] *= -1.0;\r\n\r\n const n = znear;\r\n const f = zfar;\r\n\r\n const t = 1.0 / Math.tan(fov * 0.5);\r\n const a = isVerticalFovFixed ? t / aspect : t;\r\n const b = isVerticalFovFixed ? t : t * aspect;\r\n const c = reverseDepthBufferMode && n === 0 ? 1 : f !== 0 ? -(f + n) / (f - n) : -1;\r\n const d = reverseDepthBufferMode && n === 0 ? 2 * f : f !== 0 ? (-2 * f * n) / (f - n) : -2 * n;\r\n const rot = Math.tan(projectionPlaneTilt);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, rot, 0.0, 0.0, c, -1.0, 0.0, 0.0, d, 0.0, result);\r\n\r\n if (halfZRange) {\r\n result.multiplyToRef(mtxConvertNDCToHalfZRange, result);\r\n }\r\n\r\n result._updateIdentityStatus(false);\r\n return result;\r\n }\r\n\r\n /**\r\n * Stores a right-handed perspective projection into a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#90\r\n * @param fov defines the horizontal field of view\r\n * @param aspect defines the aspect ratio\r\n * @param znear defines the near clip plane\r\n * @param zfar not used as infinity is used as far clip\r\n * @param result defines the target matrix\r\n * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally\r\n * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)\r\n * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)\r\n * @returns result input\r\n */\r\n public static PerspectiveFovReverseRHToRef(\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n result: T,\r\n isVerticalFovFixed = true,\r\n halfZRange?: boolean,\r\n projectionPlaneTilt: number = 0\r\n ): T {\r\n const t = 1.0 / Math.tan(fov * 0.5);\r\n const a = isVerticalFovFixed ? t / aspect : t;\r\n const b = isVerticalFovFixed ? t : t * aspect;\r\n const rot = Math.tan(projectionPlaneTilt);\r\n\r\n Matrix.FromValuesToRef(a, 0.0, 0.0, 0.0, 0.0, b, 0.0, rot, 0.0, 0.0, -znear, -1.0, 0.0, 0.0, -1.0, 0.0, result);\r\n\r\n if (halfZRange) {\r\n result.multiplyToRef(mtxConvertNDCToHalfZRange, result);\r\n }\r\n\r\n result._updateIdentityStatus(false);\r\n return result;\r\n }\r\n\r\n /**\r\n * Computes a complete transformation matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#113\r\n * @param viewport defines the viewport to use\r\n * @param world defines the world matrix\r\n * @param view defines the view matrix\r\n * @param projection defines the projection matrix\r\n * @param zmin defines the near clip plane\r\n * @param zmax defines the far clip plane\r\n * @returns the transformation matrix\r\n */\r\n public static GetFinalMatrix(\r\n viewport: DeepImmutable,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable,\r\n zmin: number,\r\n zmax: number\r\n ): T {\r\n const cw = viewport.width;\r\n const ch = viewport.height;\r\n const cx = viewport.x;\r\n const cy = viewport.y;\r\n\r\n const viewportMatrix = Matrix.FromValues(cw / 2.0, 0.0, 0.0, 0.0, 0.0, -ch / 2.0, 0.0, 0.0, 0.0, 0.0, zmax - zmin, 0.0, cx + cw / 2.0, ch / 2.0 + cy, zmin, 1.0);\r\n\r\n const matrix = new (world.constructor as Constructor)();\r\n world.multiplyToRef(view, matrix);\r\n matrix.multiplyToRef(projection, matrix);\r\n return matrix.multiplyToRef(viewportMatrix, matrix);\r\n }\r\n\r\n /**\r\n * Extracts a 2x2 matrix from a given matrix and store the result in a Float32Array\r\n * @param matrix defines the matrix to use\r\n * @returns a new Float32Array array with 4 elements : the 2x2 matrix extracted from the given matrix\r\n */\r\n public static GetAsMatrix2x2(matrix: DeepImmutable): Float32Array | Array {\r\n const m = matrix.m;\r\n const arr = [m[0], m[1], m[4], m[5]];\r\n return PerformanceConfigurator.MatrixUse64Bits ? arr : new Float32Array(arr);\r\n }\r\n /**\r\n * Extracts a 3x3 matrix from a given matrix and store the result in a Float32Array\r\n * @param matrix defines the matrix to use\r\n * @returns a new Float32Array array with 9 elements : the 3x3 matrix extracted from the given matrix\r\n */\r\n public static GetAsMatrix3x3(matrix: DeepImmutable): Float32Array | Array {\r\n const m = matrix.m;\r\n const arr = [m[0], m[1], m[2], m[4], m[5], m[6], m[8], m[9], m[10]];\r\n return PerformanceConfigurator.MatrixUse64Bits ? arr : new Float32Array(arr);\r\n }\r\n\r\n /**\r\n * Compute the transpose of a given matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#111\r\n * @param matrix defines the matrix to transpose\r\n * @returns the new matrix\r\n */\r\n public static Transpose(matrix: DeepImmutable): T {\r\n const result = new (matrix.constructor as Constructor)();\r\n Matrix.TransposeToRef(matrix, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Compute the transpose of a matrix and store it in a target matrix\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#112\r\n * @param matrix defines the matrix to transpose\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static TransposeToRef(matrix: DeepImmutable, result: T): T {\r\n const mm = matrix.m;\r\n const rm0 = mm[0];\r\n const rm1 = mm[4];\r\n const rm2 = mm[8];\r\n const rm3 = mm[12];\r\n\r\n const rm4 = mm[1];\r\n const rm5 = mm[5];\r\n const rm6 = mm[9];\r\n const rm7 = mm[13];\r\n\r\n const rm8 = mm[2];\r\n const rm9 = mm[6];\r\n const rm10 = mm[10];\r\n const rm11 = mm[14];\r\n\r\n const rm12 = mm[3];\r\n const rm13 = mm[7];\r\n const rm14 = mm[11];\r\n const rm15 = mm[15];\r\n\r\n const rm = result._m;\r\n rm[0] = rm0;\r\n rm[1] = rm1;\r\n rm[2] = rm2;\r\n rm[3] = rm3;\r\n rm[4] = rm4;\r\n rm[5] = rm5;\r\n rm[6] = rm6;\r\n rm[7] = rm7;\r\n rm[8] = rm8;\r\n rm[9] = rm9;\r\n rm[10] = rm10;\r\n rm[11] = rm11;\r\n rm[12] = rm12;\r\n rm[13] = rm13;\r\n rm[14] = rm14;\r\n rm[15] = rm15;\r\n result.markAsUpdated();\r\n\r\n // identity-ness does not change when transposing\r\n result._updateIdentityStatus((matrix as Matrix)._isIdentity, (matrix as Matrix)._isIdentityDirty);\r\n return result;\r\n }\r\n\r\n /**\r\n * Computes a reflection matrix from a plane\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#87\r\n * @param plane defines the reflection plane\r\n * @returns a new matrix\r\n */\r\n public static Reflection(plane: DeepImmutable): Matrix {\r\n const matrix = new Matrix();\r\n Matrix.ReflectionToRef(plane, matrix);\r\n return matrix;\r\n }\r\n\r\n /**\r\n * Computes a reflection matrix from a plane\r\n * Example Playground - https://playground.babylonjs.com/#AV9X17#88\r\n * @param plane defines the reflection plane\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static ReflectionToRef(plane: DeepImmutable, result: T): T {\r\n plane.normalize();\r\n const x = plane.normal.x;\r\n const y = plane.normal.y;\r\n const z = plane.normal.z;\r\n const temp = -2 * x;\r\n const temp2 = -2 * y;\r\n const temp3 = -2 * z;\r\n Matrix.FromValuesToRef(\r\n temp * x + 1,\r\n temp2 * x,\r\n temp3 * x,\r\n 0.0,\r\n temp * y,\r\n temp2 * y + 1,\r\n temp3 * y,\r\n 0.0,\r\n temp * z,\r\n temp2 * z,\r\n temp3 * z + 1,\r\n 0.0,\r\n temp * plane.d,\r\n temp2 * plane.d,\r\n temp3 * plane.d,\r\n 1.0,\r\n result\r\n );\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the given matrix as a rotation matrix composed from the 3 left handed axes\r\n * @param xaxis defines the value of the 1st axis\r\n * @param yaxis defines the value of the 2nd axis\r\n * @param zaxis defines the value of the 3rd axis\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static FromXYZAxesToRef(xaxis: DeepImmutable, yaxis: DeepImmutable, zaxis: DeepImmutable, result: T): T {\r\n Matrix.FromValuesToRef(xaxis._x, xaxis._y, xaxis._z, 0.0, yaxis._x, yaxis._y, yaxis._z, 0.0, zaxis._x, zaxis._y, zaxis._z, 0.0, 0.0, 0.0, 0.0, 1.0, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a rotation matrix from a quaternion and stores it in a target matrix\r\n * @param quat defines the quaternion to use\r\n * @param result defines the target matrix\r\n * @returns result input\r\n */\r\n public static FromQuaternionToRef(quat: DeepImmutable, result: T): T {\r\n const xx = quat._x * quat._x;\r\n const yy = quat._y * quat._y;\r\n const zz = quat._z * quat._z;\r\n const xy = quat._x * quat._y;\r\n const zw = quat._z * quat._w;\r\n const zx = quat._z * quat._x;\r\n const yw = quat._y * quat._w;\r\n const yz = quat._y * quat._z;\r\n const xw = quat._x * quat._w;\r\n\r\n result._m[0] = 1.0 - 2.0 * (yy + zz);\r\n result._m[1] = 2.0 * (xy + zw);\r\n result._m[2] = 2.0 * (zx - yw);\r\n result._m[3] = 0.0;\r\n\r\n result._m[4] = 2.0 * (xy - zw);\r\n result._m[5] = 1.0 - 2.0 * (zz + xx);\r\n result._m[6] = 2.0 * (yz + xw);\r\n result._m[7] = 0.0;\r\n\r\n result._m[8] = 2.0 * (zx + yw);\r\n result._m[9] = 2.0 * (yz - xw);\r\n result._m[10] = 1.0 - 2.0 * (yy + xx);\r\n result._m[11] = 0.0;\r\n\r\n result._m[12] = 0.0;\r\n result._m[13] = 0.0;\r\n result._m[14] = 0.0;\r\n result._m[15] = 1.0;\r\n\r\n result.markAsUpdated();\r\n return result;\r\n }\r\n}\r\nObject.defineProperties(Matrix.prototype, {\r\n dimension: { value: [4, 4] },\r\n rank: { value: 2 },\r\n});\r\n\r\n/**\r\n * @internal\r\n * Same as Tmp but not exported to keep it only for math functions to avoid conflicts\r\n */\r\nclass MathTmp {\r\n // Temporary Vector3s\r\n public static Vector3 = ArrayTools.BuildTuple(11, Vector3.Zero);\r\n\r\n // Temporary Matricies\r\n public static Matrix = ArrayTools.BuildTuple(2, Matrix.Identity);\r\n\r\n // Temporary Quaternions\r\n public static Quaternion = ArrayTools.BuildTuple(3, Quaternion.Zero);\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class TmpVectors {\r\n /** 3 temp Vector2 at once should be enough */\r\n public static Vector2 = ArrayTools.BuildTuple(3, Vector2.Zero);\r\n\r\n /** 13 temp Vector3 at once should be enough */\r\n public static Vector3 = ArrayTools.BuildTuple(13, Vector3.Zero);\r\n\r\n /** 3 temp Vector4 at once should be enough */\r\n public static Vector4 = ArrayTools.BuildTuple(3, Vector4.Zero);\r\n\r\n /** 2 temp Quaternion at once should be enough */\r\n public static Quaternion = ArrayTools.BuildTuple(2, Quaternion.Zero);\r\n\r\n /** 8 temp Matrices at once should be enough */\r\n public static Matrix = ArrayTools.BuildTuple(8, Matrix.Identity);\r\n}\r\n\r\nRegisterClass(\"BABYLON.Vector2\", Vector2);\r\nRegisterClass(\"BABYLON.Vector3\", Vector3);\r\nRegisterClass(\"BABYLON.Vector4\", Vector4);\r\nRegisterClass(\"BABYLON.Matrix\", Matrix);\r\n\r\nconst mtxConvertNDCToHalfZRange = Matrix.FromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 1);\r\n", "import type { Nullable } from \"../types\";\r\nimport { Vector2 } from \"../Maths/math.vector\";\r\nimport type { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { IMouseEvent, IPointerEvent } from \"./deviceInputEvents\";\r\nimport type { InputManager } from \"../Inputs/scene.inputManager\";\r\n\r\nimport type { Ray } from \"../Culling/ray\";\r\n\r\n/**\r\n * Gather the list of pointer event types as constants.\r\n */\r\nexport class PointerEventTypes {\r\n /**\r\n * The pointerdown event is fired when a pointer becomes active. For mouse, it is fired when the device transitions from no buttons depressed to at least one button depressed. For touch, it is fired when physical contact is made with the digitizer. For pen, it is fired when the stylus makes physical contact with the digitizer.\r\n */\r\n public static readonly POINTERDOWN = 0x01;\r\n /**\r\n * The pointerup event is fired when a pointer is no longer active.\r\n */\r\n public static readonly POINTERUP = 0x02;\r\n /**\r\n * The pointermove event is fired when a pointer changes coordinates.\r\n */\r\n public static readonly POINTERMOVE = 0x04;\r\n /**\r\n * The pointerwheel event is fired when a mouse wheel has been rotated.\r\n */\r\n public static readonly POINTERWHEEL = 0x08;\r\n /**\r\n * The pointerpick event is fired when a mesh or sprite has been picked by the pointer.\r\n */\r\n public static readonly POINTERPICK = 0x10;\r\n /**\r\n * The pointertap event is fired when a the object has been touched and released without drag.\r\n */\r\n public static readonly POINTERTAP = 0x20;\r\n /**\r\n * The pointerdoubletap event is fired when a the object has been touched and released twice without drag.\r\n */\r\n public static readonly POINTERDOUBLETAP = 0x40;\r\n}\r\n\r\n/**\r\n * Base class of pointer info types.\r\n */\r\nexport class PointerInfoBase {\r\n /**\r\n * Instantiates the base class of pointers info.\r\n * @param type Defines the type of event (PointerEventTypes)\r\n * @param event Defines the related dom event\r\n */\r\n constructor(\r\n /**\r\n * Defines the type of event (PointerEventTypes)\r\n */\r\n public type: number,\r\n /**\r\n * Defines the related dom event\r\n */\r\n public event: IMouseEvent\r\n ) {}\r\n}\r\n\r\n/**\r\n * This class is used to store pointer related info for the onPrePointerObservable event.\r\n * Set the skipOnPointerObservable property to true if you want the engine to stop any process after this event is triggered, even not calling onPointerObservable\r\n */\r\nexport class PointerInfoPre extends PointerInfoBase {\r\n /**\r\n * Ray from a pointer if available (eg. 6dof controller)\r\n */\r\n public ray: Nullable = null;\r\n\r\n /**\r\n * Defines picking info coming from a near interaction (proximity instead of ray-based picking)\r\n */\r\n public nearInteractionPickingInfo: Nullable;\r\n\r\n /**\r\n * The original picking info that was used to trigger the pointer event\r\n */\r\n public originalPickingInfo: Nullable = null;\r\n\r\n /**\r\n * Defines the local position of the pointer on the canvas.\r\n */\r\n public localPosition: Vector2;\r\n\r\n /**\r\n * Defines whether the engine should skip the next OnPointerObservable associated to this pre.\r\n */\r\n public skipOnPointerObservable: boolean;\r\n\r\n /**\r\n * Instantiates a PointerInfoPre to store pointer related info to the onPrePointerObservable event.\r\n * @param type Defines the type of event (PointerEventTypes)\r\n * @param event Defines the related dom event\r\n * @param localX Defines the local x coordinates of the pointer when the event occured\r\n * @param localY Defines the local y coordinates of the pointer when the event occured\r\n */\r\n constructor(type: number, event: IMouseEvent, localX: number, localY: number) {\r\n super(type, event);\r\n this.skipOnPointerObservable = false;\r\n this.localPosition = new Vector2(localX, localY);\r\n }\r\n}\r\n\r\n/**\r\n * This type contains all the data related to a pointer event in Babylon.js.\r\n * The event member is an instance of PointerEvent for all types except PointerWheel and is of type MouseWheelEvent when type equals PointerWheel. The different event types can be found in the PointerEventTypes class.\r\n */\r\nexport class PointerInfo extends PointerInfoBase {\r\n private _pickInfo: Nullable;\r\n private _inputManager: Nullable;\r\n\r\n /**\r\n * Defines the picking info associated with this PointerInfo object (if applicable)\r\n */\r\n public get pickInfo(): Nullable {\r\n if (!this._pickInfo) {\r\n this._generatePickInfo();\r\n }\r\n\r\n return this._pickInfo;\r\n }\r\n /**\r\n * Instantiates a PointerInfo to store pointer related info to the onPointerObservable event.\r\n * @param type Defines the type of event (PointerEventTypes)\r\n * @param event Defines the related dom event\r\n * @param pickInfo Defines the picking info associated to the info (if any)\r\n * @param inputManager Defines the InputManager to use if there is no pickInfo\r\n */\r\n constructor(type: number, event: IMouseEvent, pickInfo: Nullable, inputManager: Nullable = null) {\r\n super(type, event);\r\n this._pickInfo = pickInfo;\r\n this._inputManager = inputManager;\r\n }\r\n\r\n /**\r\n * Generates the picking info if needed\r\n */\r\n /** @internal */\r\n public _generatePickInfo(): void {\r\n if (this._inputManager) {\r\n this._pickInfo = this._inputManager._pickMove(this.event as IPointerEvent);\r\n this._inputManager._setRayOnPointerInfo(this._pickInfo, this.event);\r\n this._inputManager = null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Data relating to a touch event on the screen.\r\n */\r\nexport interface PointerTouch {\r\n /**\r\n * X coordinate of touch.\r\n */\r\n x: number;\r\n /**\r\n * Y coordinate of touch.\r\n */\r\n y: number;\r\n /**\r\n * Id of touch. Unique for each finger.\r\n */\r\n pointerId: number;\r\n /**\r\n * Event type passed from DOM.\r\n */\r\n type: any;\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n/**\r\n * Checks if the window object exists\r\n * @returns true if the window object exists\r\n */\r\nexport function IsWindowObjectExist(): boolean {\r\n return typeof window !== \"undefined\";\r\n}\r\n\r\n/**\r\n * Checks if the navigator object exists\r\n * @returns true if the navigator object exists\r\n */\r\nexport function IsNavigatorAvailable(): boolean {\r\n return typeof navigator !== \"undefined\";\r\n}\r\n\r\n/**\r\n * Check if the document object exists\r\n * @returns true if the document object exists\r\n */\r\nexport function IsDocumentAvailable(): boolean {\r\n return typeof document !== \"undefined\";\r\n}\r\n\r\n/**\r\n * Extracts text content from a DOM element hierarchy\r\n * @param element defines the root element\r\n * @returns a string\r\n */\r\nexport function GetDOMTextContent(element: HTMLElement): string {\r\n let result = \"\";\r\n let child = element.firstChild;\r\n\r\n while (child) {\r\n if (child.nodeType === 3) {\r\n result += child.textContent;\r\n }\r\n child = child.nextSibling;\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Sets of helpers dealing with the DOM and some of the recurrent functions needed in\r\n * Babylon.js\r\n */\r\nexport const DomManagement = {\r\n /**\r\n * Checks if the window object exists\r\n * @returns true if the window object exists\r\n */\r\n IsWindowObjectExist,\r\n\r\n /**\r\n * Checks if the navigator object exists\r\n * @returns true if the navigator object exists\r\n */\r\n IsNavigatorAvailable,\r\n\r\n /**\r\n * Check if the document object exists\r\n * @returns true if the document object exists\r\n */\r\n IsDocumentAvailable,\r\n /**\r\n * Extracts text content from a DOM element hierarchy\r\n * @param element defines the root element\r\n * @returns a string\r\n */\r\n GetDOMTextContent,\r\n};\r\n", "import { Logger } from \"./logger\";\r\n\r\nconst CloneValue = (source: any, destinationObject: any, shallowCopyValues: boolean) => {\r\n if (!source) {\r\n return null;\r\n }\r\n\r\n if (source.getClassName && source.getClassName() === \"Mesh\") {\r\n return null;\r\n }\r\n\r\n if (source.getClassName && (source.getClassName() === \"SubMesh\" || source.getClassName() === \"PhysicsBody\")) {\r\n return source.clone(destinationObject);\r\n } else if (source.clone) {\r\n return source.clone();\r\n } else if (Array.isArray(source)) {\r\n return source.slice();\r\n } else if (shallowCopyValues && typeof source === \"object\") {\r\n return { ...source };\r\n }\r\n return null;\r\n};\r\n\r\nfunction GetAllPropertyNames(obj: any): string[] {\r\n const props: string[] = [];\r\n\r\n do {\r\n Object.getOwnPropertyNames(obj).forEach(function (prop) {\r\n if (props.indexOf(prop) === -1) {\r\n props.push(prop);\r\n }\r\n });\r\n } while ((obj = Object.getPrototypeOf(obj)));\r\n\r\n return props;\r\n}\r\n\r\n/**\r\n * Class containing a set of static utilities functions for deep copy.\r\n */\r\nexport class DeepCopier {\r\n /**\r\n * Tries to copy an object by duplicating every property\r\n * @param source defines the source object\r\n * @param destination defines the target object\r\n * @param doNotCopyList defines a list of properties to avoid\r\n * @param mustCopyList defines a list of properties to copy (even if they start with _)\r\n * @param shallowCopyValues defines wether properties referencing objects (none cloneable) must be shallow copied (false by default)\r\n * @remarks shallowCopyValues will not instantite the copied values which makes it only usable for \"JSON objects\"\r\n */\r\n public static DeepCopy(source: any, destination: any, doNotCopyList?: string[], mustCopyList?: string[], shallowCopyValues = false): void {\r\n const properties = GetAllPropertyNames(source);\r\n for (const prop of properties) {\r\n if (prop[0] === \"_\" && (!mustCopyList || mustCopyList.indexOf(prop) === -1)) {\r\n continue;\r\n }\r\n\r\n if (prop.endsWith(\"Observable\")) {\r\n continue;\r\n }\r\n\r\n if (doNotCopyList && doNotCopyList.indexOf(prop) !== -1) {\r\n continue;\r\n }\r\n\r\n const sourceValue = source[prop];\r\n const typeOfSourceValue = typeof sourceValue;\r\n\r\n if (typeOfSourceValue === \"function\") {\r\n continue;\r\n }\r\n\r\n try {\r\n if (typeOfSourceValue === \"object\") {\r\n if (sourceValue instanceof Uint8Array) {\r\n destination[prop] = Uint8Array.from(sourceValue);\r\n } else if (sourceValue instanceof Array) {\r\n destination[prop] = [];\r\n\r\n if (sourceValue.length > 0) {\r\n if (typeof sourceValue[0] == \"object\") {\r\n for (let index = 0; index < sourceValue.length; index++) {\r\n const clonedValue = CloneValue(sourceValue[index], destination, shallowCopyValues);\r\n\r\n if (destination[prop].indexOf(clonedValue) === -1) {\r\n // Test if auto inject was not done\r\n destination[prop].push(clonedValue);\r\n }\r\n }\r\n } else {\r\n destination[prop] = sourceValue.slice(0);\r\n }\r\n }\r\n } else {\r\n destination[prop] = CloneValue(sourceValue, destination, shallowCopyValues);\r\n }\r\n } else {\r\n destination[prop] = sourceValue;\r\n }\r\n } catch (e) {\r\n // Log a warning (it could be because of a read-only property)\r\n Logger.Warn(e.message);\r\n }\r\n }\r\n }\r\n}\r\n", "import { IsWindowObjectExist } from \"./domManagement\";\r\n\r\n/**\r\n * Class containing a set of static utilities functions for precision date\r\n */\r\nexport class PrecisionDate {\r\n /**\r\n * Gets either window.performance.now() if supported or Date.now() else\r\n */\r\n public static get Now(): number {\r\n if (IsWindowObjectExist() && window.performance && window.performance.now) {\r\n return window.performance.now();\r\n }\r\n\r\n return Date.now();\r\n }\r\n}\r\n", "import type { IWebRequest } from \"./interfaces/iWebRequest\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { INative } from \"../Engines/Native/nativeInterfaces\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare const _native: INative;\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nfunction createXMLHttpRequest(): XMLHttpRequest {\r\n // If running in Babylon Native, then defer to the native XMLHttpRequest, which has the same public contract\r\n if (typeof _native !== \"undefined\" && _native.XMLHttpRequest) {\r\n return new _native.XMLHttpRequest();\r\n } else {\r\n return new XMLHttpRequest();\r\n }\r\n}\r\n\r\n/**\r\n * Extended version of XMLHttpRequest with support for customizations (headers, ...)\r\n */\r\nexport class WebRequest implements IWebRequest {\r\n private readonly _xhr = createXMLHttpRequest();\r\n\r\n /**\r\n * Custom HTTP Request Headers to be sent with XMLHttpRequests\r\n * i.e. when loading files, where the server/service expects an Authorization header\r\n */\r\n public static CustomRequestHeaders: { [key: string]: string } = {};\r\n\r\n /**\r\n * Add callback functions in this array to update all the requests before they get sent to the network\r\n */\r\n public static CustomRequestModifiers = new Array<(request: XMLHttpRequest, url: string) => void>();\r\n\r\n /**\r\n * If set to true, requests to Babylon.js CDN requests will not be modified\r\n */\r\n public static SkipRequestModificationForBabylonCDN = true;\r\n\r\n /**\r\n * This function can be called to check if there are request modifiers for network requests\r\n * @returns true if there are any custom requests available\r\n */\r\n public static get IsCustomRequestAvailable(): boolean {\r\n return Object.keys(WebRequest.CustomRequestHeaders).length > 0 || WebRequest.CustomRequestModifiers.length > 0;\r\n }\r\n\r\n private _requestURL: string = \"\";\r\n\r\n private _injectCustomRequestHeaders(): void {\r\n if (this._shouldSkipRequestModifications(this._requestURL)) {\r\n return;\r\n }\r\n for (const key in WebRequest.CustomRequestHeaders) {\r\n const val = WebRequest.CustomRequestHeaders[key];\r\n if (val) {\r\n this._xhr.setRequestHeader(key, val);\r\n }\r\n }\r\n }\r\n\r\n private _shouldSkipRequestModifications(url: string): boolean {\r\n return WebRequest.SkipRequestModificationForBabylonCDN && (url.includes(\"preview.babylonjs.com\") || url.includes(\"cdn.babylonjs.com\"));\r\n }\r\n\r\n /**\r\n * Gets or sets a function to be called when loading progress changes\r\n */\r\n public get onprogress(): ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null {\r\n return this._xhr.onprogress;\r\n }\r\n\r\n public set onprogress(value: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null) {\r\n this._xhr.onprogress = value;\r\n }\r\n\r\n /**\r\n * Returns client's state\r\n */\r\n public get readyState(): number {\r\n return this._xhr.readyState;\r\n }\r\n\r\n /**\r\n * Returns client's status\r\n */\r\n public get status(): number {\r\n return this._xhr.status;\r\n }\r\n\r\n /**\r\n * Returns client's status as a text\r\n */\r\n public get statusText(): string {\r\n return this._xhr.statusText;\r\n }\r\n\r\n /**\r\n * Returns client's response\r\n */\r\n public get response(): any {\r\n return this._xhr.response;\r\n }\r\n\r\n /**\r\n * Returns client's response url\r\n */\r\n public get responseURL(): string {\r\n return this._xhr.responseURL;\r\n }\r\n\r\n /**\r\n * Returns client's response as text\r\n */\r\n public get responseText(): string {\r\n return this._xhr.responseText;\r\n }\r\n\r\n /**\r\n * Gets or sets the expected response type\r\n */\r\n public get responseType(): XMLHttpRequestResponseType {\r\n return this._xhr.responseType;\r\n }\r\n\r\n public set responseType(value: XMLHttpRequestResponseType) {\r\n this._xhr.responseType = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the timeout value in milliseconds\r\n */\r\n public get timeout(): number {\r\n return this._xhr.timeout;\r\n }\r\n\r\n public set timeout(value: number) {\r\n this._xhr.timeout = value;\r\n }\r\n\r\n /** @internal */\r\n public addEventListener(\r\n type: K,\r\n listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any,\r\n options?: boolean | AddEventListenerOptions\r\n ): void;\r\n public addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void {\r\n this._xhr.addEventListener(type, listener, options);\r\n }\r\n\r\n /** @internal */\r\n public removeEventListener(\r\n type: K,\r\n listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any,\r\n options?: boolean | EventListenerOptions\r\n ): void;\r\n public removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void {\r\n this._xhr.removeEventListener(type, listener, options);\r\n }\r\n\r\n /**\r\n * Cancels any network activity\r\n */\r\n public abort() {\r\n this._xhr.abort();\r\n }\r\n\r\n /**\r\n * Initiates the request. The optional argument provides the request body. The argument is ignored if request method is GET or HEAD\r\n * @param body defines an optional request body\r\n */\r\n public send(body?: Document | XMLHttpRequestBodyInit | null): void {\r\n if (WebRequest.CustomRequestHeaders) {\r\n this._injectCustomRequestHeaders();\r\n }\r\n\r\n this._xhr.send(body);\r\n }\r\n\r\n /**\r\n * Sets the request method, request URL\r\n * @param method defines the method to use (GET, POST, etc..)\r\n * @param url defines the url to connect with\r\n */\r\n public open(method: string, url: string): void {\r\n for (const update of WebRequest.CustomRequestModifiers) {\r\n if (this._shouldSkipRequestModifications(url)) {\r\n return;\r\n }\r\n update(this._xhr, url);\r\n }\r\n\r\n // Clean url\r\n url = url.replace(\"file:http:\", \"http:\");\r\n url = url.replace(\"file:https:\", \"https:\");\r\n\r\n this._requestURL = url;\r\n\r\n this._xhr.open(method, url, true);\r\n }\r\n\r\n /**\r\n * Sets the value of a request header.\r\n * @param name The name of the header whose value is to be set\r\n * @param value The value to set as the body of the header\r\n */\r\n setRequestHeader(name: string, value: string): void {\r\n this._xhr.setRequestHeader(name, value);\r\n }\r\n\r\n /**\r\n * Get the string containing the text of a particular header's value.\r\n * @param name The name of the header\r\n * @returns The string containing the text of the given header name\r\n */\r\n getResponseHeader(name: string): Nullable {\r\n return this._xhr.getResponseHeader(name);\r\n }\r\n}\r\n", "/**\r\n * Class used to help managing file picking and drag'n'drop\r\n * File Storage\r\n */\r\nexport class FilesInputStore {\r\n /**\r\n * List of files ready to be loaded\r\n */\r\n public static FilesToLoad: { [key: string]: File } = {};\r\n}\r\n", "import type { WebRequest } from \"./webRequest\";\r\n\r\n/**\r\n * Class used to define a retry strategy when error happens while loading assets\r\n */\r\nexport class RetryStrategy {\r\n /**\r\n * Function used to defines an exponential back off strategy\r\n * @param maxRetries defines the maximum number of retries (3 by default)\r\n * @param baseInterval defines the interval between retries\r\n * @returns the strategy function to use\r\n */\r\n public static ExponentialBackoff(maxRetries = 3, baseInterval = 500) {\r\n return (url: string, request: WebRequest, retryIndex: number): number => {\r\n if (request.status !== 0 || retryIndex >= maxRetries || url.indexOf(\"file:\") !== -1) {\r\n return -1;\r\n }\r\n\r\n return Math.pow(2, retryIndex) * baseInterval;\r\n };\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n/**\r\n * Base error. Due to limitations of typedoc-check and missing documentation\r\n * in lib.es5.d.ts, cannot extend Error directly for RuntimeError.\r\n * @ignore\r\n */\r\nexport abstract class BaseError extends Error {\r\n // See https://stackoverflow.com/questions/12915412/how-do-i-extend-a-host-object-e-g-error-in-typescript\r\n // and https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n\r\n // Polyfill for Object.setPrototypeOf if necessary.\r\n protected static _setPrototypeOf: (o: any, proto: object | null) => any =\r\n (Object as any).setPrototypeOf ||\r\n ((o, proto) => {\r\n o.__proto__ = proto;\r\n return o;\r\n });\r\n}\r\n\r\n/* IMP! DO NOT CHANGE THE NUMBERING OF EXISTING ERROR CODES */\r\n/**\r\n * Error codes for BaseError\r\n */\r\nexport const ErrorCodes = {\r\n // Mesh errors 0-999\r\n /** Invalid or empty mesh vertex positions. */\r\n MeshInvalidPositionsError: 0,\r\n\r\n // Texture errors 1000-1999\r\n /** Unsupported texture found. */\r\n UnsupportedTextureError: 1000,\r\n\r\n // GLTFLoader errors 2000-2999\r\n /** Unexpected magic number found in GLTF file header. */\r\n GLTFLoaderUnexpectedMagicError: 2000,\r\n\r\n // SceneLoader errors 3000-3999\r\n /** SceneLoader generic error code. Ideally wraps the inner exception. */\r\n SceneLoaderError: 3000,\r\n\r\n // File related errors 4000-4999\r\n /** Load file error */\r\n LoadFileError: 4000,\r\n /** Request file error */\r\n RequestFileError: 4001,\r\n /** Read file error */\r\n ReadFileError: 4002,\r\n} as const;\r\n\r\n/**\r\n * Error code type\r\n */\r\nexport type ErrorCodesType = (typeof ErrorCodes)[keyof typeof ErrorCodes];\r\n\r\n/**\r\n * Application runtime error\r\n */\r\nexport class RuntimeError extends BaseError {\r\n /**\r\n * The error code\r\n */\r\n public errorCode: ErrorCodesType;\r\n\r\n /**\r\n * The error that caused this outer error\r\n */\r\n public innerError?: Error;\r\n\r\n /**\r\n * Creates a new RuntimeError\r\n * @param message defines the message of the error\r\n * @param errorCode the error code\r\n * @param innerError the error that caused the outer error\r\n */\r\n public constructor(message: string, errorCode: ErrorCodesType, innerError?: Error) {\r\n super(message);\r\n\r\n this.errorCode = errorCode;\r\n this.innerError = innerError;\r\n\r\n this.name = \"RuntimeError\";\r\n BaseError._setPrototypeOf(this, RuntimeError.prototype);\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n\r\n/**\r\n * Checks for a matching suffix at the end of a string (for ES5 and lower)\r\n * @param str Source string\r\n * @param suffix Suffix to search for in the source string\r\n * @returns Boolean indicating whether the suffix was found (true) or not (false)\r\n * @deprecated Please use native string function instead\r\n */\r\nexport const EndsWith = (str: string, suffix: string): boolean => {\r\n return str.endsWith(suffix);\r\n};\r\n\r\n/**\r\n * Checks for a matching suffix at the beginning of a string (for ES5 and lower)\r\n * @param str Source string\r\n * @param suffix Suffix to search for in the source string\r\n * @returns Boolean indicating whether the suffix was found (true) or not (false)\r\n * @deprecated Please use native string function instead\r\n */\r\nexport const StartsWith = (str: string, suffix: string): boolean => {\r\n if (!str) {\r\n return false;\r\n }\r\n return str.startsWith(suffix);\r\n};\r\n\r\n/**\r\n * Decodes a buffer into a string\r\n * @param buffer The buffer to decode\r\n * @returns The decoded string\r\n */\r\nexport const Decode = (buffer: Uint8Array | Uint16Array): string => {\r\n if (typeof TextDecoder !== \"undefined\") {\r\n return new TextDecoder().decode(buffer);\r\n }\r\n\r\n let result = \"\";\r\n for (let i = 0; i < buffer.byteLength; i++) {\r\n result += String.fromCharCode(buffer[i]);\r\n }\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Encode a buffer to a base64 string\r\n * @param buffer defines the buffer to encode\r\n * @returns the encoded string\r\n */\r\nexport const EncodeArrayBufferToBase64 = (buffer: ArrayBuffer | ArrayBufferView): string => {\r\n const keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\r\n let output = \"\";\r\n let chr1, chr2, chr3, enc1, enc2, enc3, enc4;\r\n let i = 0;\r\n const bytes = ArrayBuffer.isView(buffer) ? new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength) : new Uint8Array(buffer);\r\n\r\n while (i < bytes.length) {\r\n chr1 = bytes[i++];\r\n chr2 = i < bytes.length ? bytes[i++] : Number.NaN;\r\n chr3 = i < bytes.length ? bytes[i++] : Number.NaN;\r\n\r\n enc1 = chr1 >> 2;\r\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\r\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\r\n enc4 = chr3 & 63;\r\n\r\n if (isNaN(chr2)) {\r\n enc3 = enc4 = 64;\r\n } else if (isNaN(chr3)) {\r\n enc4 = 64;\r\n }\r\n output += keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);\r\n }\r\n\r\n return output;\r\n};\r\n\r\n/**\r\n * Converts a given base64 string as an ASCII encoded stream of data\r\n * @param base64Data The base64 encoded string to decode\r\n * @returns Decoded ASCII string\r\n */\r\nexport const DecodeBase64ToString = (base64Data: string): string => {\r\n return atob(base64Data);\r\n};\r\n\r\n/**\r\n * Converts a given base64 string into an ArrayBuffer of raw byte data\r\n * @param base64Data The base64 encoded string to decode\r\n * @returns ArrayBuffer of byte data\r\n */\r\nexport const DecodeBase64ToBinary = (base64Data: string): ArrayBuffer => {\r\n const decodedString = DecodeBase64ToString(base64Data);\r\n const bufferLength = decodedString.length;\r\n const bufferView = new Uint8Array(new ArrayBuffer(bufferLength));\r\n\r\n for (let i = 0; i < bufferLength; i++) {\r\n bufferView[i] = decodedString.charCodeAt(i);\r\n }\r\n\r\n return bufferView.buffer;\r\n};\r\n\r\n/**\r\n * Converts a number to string and pads with preceding zeroes until it is of specified length.\r\n * @param num the number to convert and pad\r\n * @param length the expected length of the string\r\n * @returns the padded string\r\n */\r\nexport const PadNumber = (num: number, length: number): string => {\r\n let str = String(num);\r\n while (str.length < length) {\r\n str = \"0\" + str;\r\n }\r\n return str;\r\n};\r\n/**\r\n * Helper to manipulate strings\r\n */\r\nexport const StringTools = {\r\n EndsWith,\r\n StartsWith,\r\n Decode,\r\n EncodeArrayBufferToBase64,\r\n DecodeBase64ToString,\r\n DecodeBase64ToBinary,\r\n PadNumber,\r\n};\r\n", "/**\r\n * Language of the shader code\r\n */\r\nexport enum ShaderLanguage {\r\n /** language is GLSL (used by WebGL) */\r\n GLSL,\r\n /** language is WGSL (used by WebGPU) */\r\n WGSL,\r\n}\r\n", "import { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines the shader related stores and directory\r\n */\r\nexport class ShaderStore {\r\n /**\r\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\r\n */\r\n public static ShadersRepository = \"src/Shaders/\";\r\n /**\r\n * Store of each shader (The can be looked up using effect.key)\r\n */\r\n public static ShadersStore: { [key: string]: string } = {};\r\n /**\r\n * Store of each included file for a shader (The can be looked up using effect.key)\r\n */\r\n public static IncludesShadersStore: { [key: string]: string } = {};\r\n\r\n /**\r\n * Gets or sets the relative url used to load shaders (WGSL) if using the engine in non-minified mode\r\n */\r\n public static ShadersRepositoryWGSL = \"src/ShadersWGSL/\";\r\n /**\r\n * Store of each shader (WGSL)\r\n */\r\n public static ShadersStoreWGSL: { [key: string]: string } = {};\r\n /**\r\n * Store of each included file for a shader (WGSL)\r\n */\r\n public static IncludesShadersStoreWGSL: { [key: string]: string } = {};\r\n\r\n /**\r\n * Gets the shaders repository path for a given shader language\r\n * @param shaderLanguage the shader language\r\n * @returns the path to the shaders repository\r\n */\r\n public static GetShadersRepository(shaderLanguage = ShaderLanguage.GLSL): string {\r\n return shaderLanguage === ShaderLanguage.GLSL ? ShaderStore.ShadersRepository : ShaderStore.ShadersRepositoryWGSL;\r\n }\r\n\r\n /**\r\n * Gets the shaders store of a given shader language\r\n * @param shaderLanguage the shader language\r\n * @returns the shaders store\r\n */\r\n public static GetShadersStore(shaderLanguage = ShaderLanguage.GLSL): { [key: string]: string } {\r\n return shaderLanguage === ShaderLanguage.GLSL ? ShaderStore.ShadersStore : ShaderStore.ShadersStoreWGSL;\r\n }\r\n\r\n /**\r\n * Gets the include shaders store of a given shader language\r\n * @param shaderLanguage the shader language\r\n * @returns the include shaders store\r\n */\r\n public static GetIncludesShadersStore(shaderLanguage = ShaderLanguage.GLSL): { [key: string]: string } {\r\n return shaderLanguage === ShaderLanguage.GLSL ? ShaderStore.IncludesShadersStore : ShaderStore.IncludesShadersStoreWGSL;\r\n }\r\n}\r\n", "import type { ProcessingOptions } from \"./shaderProcessingOptions\";\r\n\r\nconst defaultAttributeKeywordName = \"attribute\";\r\nconst defaultVaryingKeywordName = \"varying\";\r\n\r\n/** @internal */\r\nexport class ShaderCodeNode {\r\n line: string;\r\n children: ShaderCodeNode[] = [];\r\n additionalDefineKey?: string;\r\n additionalDefineValue?: string;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n isValid(preprocessors: { [key: string]: string }): boolean {\r\n return true;\r\n }\r\n\r\n process(preprocessors: { [key: string]: string }, options: ProcessingOptions): string {\r\n let result = \"\";\r\n if (this.line) {\r\n let value: string = this.line;\r\n const processor = options.processor;\r\n if (processor) {\r\n // This must be done before other replacements to avoid mistakenly changing something that was already changed.\r\n if (processor.lineProcessor) {\r\n value = processor.lineProcessor(value, options.isFragment, options.processingContext);\r\n }\r\n\r\n const attributeKeyword = options.processor?.attributeKeywordName ?? defaultAttributeKeywordName;\r\n const varyingKeyword =\r\n options.isFragment && options.processor?.varyingFragmentKeywordName\r\n ? options.processor?.varyingFragmentKeywordName\r\n : !options.isFragment && options.processor?.varyingVertexKeywordName\r\n ? options.processor?.varyingVertexKeywordName\r\n : defaultVaryingKeywordName;\r\n\r\n if (!options.isFragment && processor.attributeProcessor && this.line.startsWith(attributeKeyword)) {\r\n value = processor.attributeProcessor(this.line, preprocessors, options.processingContext);\r\n } else if (\r\n processor.varyingProcessor &&\r\n (processor.varyingCheck?.(this.line, options.isFragment) || (!processor.varyingCheck && this.line.startsWith(varyingKeyword)))\r\n ) {\r\n value = processor.varyingProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n } else if (processor.uniformProcessor && processor.uniformRegexp && processor.uniformRegexp.test(this.line)) {\r\n if (!options.lookForClosingBracketForUniformBuffer) {\r\n value = processor.uniformProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n }\r\n } else if (processor.uniformBufferProcessor && processor.uniformBufferRegexp && processor.uniformBufferRegexp.test(this.line)) {\r\n if (!options.lookForClosingBracketForUniformBuffer) {\r\n value = processor.uniformBufferProcessor(this.line, options.isFragment, options.processingContext);\r\n options.lookForClosingBracketForUniformBuffer = true;\r\n }\r\n } else if (processor.textureProcessor && processor.textureRegexp && processor.textureRegexp.test(this.line)) {\r\n value = processor.textureProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n } else if ((processor.uniformProcessor || processor.uniformBufferProcessor) && this.line.startsWith(\"uniform\") && !options.lookForClosingBracketForUniformBuffer) {\r\n const regex = /uniform\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/;\r\n\r\n if (regex.test(this.line)) {\r\n // uniform\r\n if (processor.uniformProcessor) {\r\n value = processor.uniformProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n }\r\n } else {\r\n // Uniform buffer\r\n if (processor.uniformBufferProcessor) {\r\n value = processor.uniformBufferProcessor(this.line, options.isFragment, options.processingContext);\r\n options.lookForClosingBracketForUniformBuffer = true;\r\n }\r\n }\r\n }\r\n\r\n if (options.lookForClosingBracketForUniformBuffer && this.line.indexOf(\"}\") !== -1) {\r\n options.lookForClosingBracketForUniformBuffer = false;\r\n if (processor.endOfUniformBufferProcessor) {\r\n value = processor.endOfUniformBufferProcessor(this.line, options.isFragment, options.processingContext);\r\n }\r\n }\r\n }\r\n\r\n result += value + \"\\n\";\r\n }\r\n\r\n this.children.forEach((child) => {\r\n result += child.process(preprocessors, options);\r\n });\r\n\r\n if (this.additionalDefineKey) {\r\n preprocessors[this.additionalDefineKey] = this.additionalDefineValue || \"true\";\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n", "/** @internal */\r\nexport class ShaderCodeCursor {\r\n private _lines: string[] = [];\r\n lineIndex: number;\r\n\r\n get currentLine(): string {\r\n return this._lines[this.lineIndex];\r\n }\r\n\r\n get canRead(): boolean {\r\n return this.lineIndex < this._lines.length - 1;\r\n }\r\n\r\n set lines(value: string[]) {\r\n this._lines.length = 0;\r\n\r\n for (const line of value) {\r\n // Skip empty lines\r\n if (!line || line === \"\\r\") {\r\n continue;\r\n }\r\n\r\n // Prevent removing line break in macros.\r\n if (line[0] === \"#\") {\r\n this._lines.push(line);\r\n continue;\r\n }\r\n\r\n // Do not split single line comments\r\n const trimmedLine = line.trim();\r\n\r\n if (!trimmedLine) {\r\n continue;\r\n }\r\n\r\n if (trimmedLine.startsWith(\"//\")) {\r\n this._lines.push(line);\r\n continue;\r\n }\r\n\r\n // Work with semicolon in the line\r\n const semicolonIndex = trimmedLine.indexOf(\";\");\r\n\r\n if (semicolonIndex === -1) {\r\n // No semicolon in the line\r\n this._lines.push(trimmedLine);\r\n } else if (semicolonIndex === trimmedLine.length - 1) {\r\n // Single semicolon at the end of the line\r\n // If trimmedLine == \";\", we must not push, to be backward compatible with the old code!\r\n if (trimmedLine.length > 1) {\r\n this._lines.push(trimmedLine);\r\n }\r\n } else {\r\n // Semicolon in the middle of the line\r\n const split = line.split(\";\");\r\n\r\n for (let index = 0; index < split.length; index++) {\r\n let subLine = split[index];\r\n\r\n if (!subLine) {\r\n continue;\r\n }\r\n\r\n subLine = subLine.trim();\r\n\r\n if (!subLine) {\r\n continue;\r\n }\r\n\r\n this._lines.push(subLine + (index !== split.length - 1 ? \";\" : \"\"));\r\n }\r\n }\r\n }\r\n }\r\n}\r\n", "import { ShaderCodeNode } from \"./shaderCodeNode\";\r\nimport type { ProcessingOptions } from \"./shaderProcessingOptions\";\r\n\r\n/** @internal */\r\nexport class ShaderCodeConditionNode extends ShaderCodeNode {\r\n process(preprocessors: { [key: string]: string }, options: ProcessingOptions) {\r\n for (let index = 0; index < this.children.length; index++) {\r\n const node = this.children[index];\r\n\r\n if (node.isValid(preprocessors)) {\r\n return node.process(preprocessors, options);\r\n }\r\n }\r\n\r\n return \"\";\r\n }\r\n}\r\n", "import { ShaderCodeNode } from \"./shaderCodeNode\";\r\nimport type { ShaderDefineExpression } from \"./Expressions/shaderDefineExpression\";\r\n\r\n/** @internal */\r\nexport class ShaderCodeTestNode extends ShaderCodeNode {\r\n public testExpression: ShaderDefineExpression;\r\n\r\n public isValid(preprocessors: { [key: string]: string }) {\r\n return this.testExpression.isTrue(preprocessors);\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n/** @internal */\r\nexport class ShaderDefineExpression {\r\n /**\r\n * Cache items count limit for the InfixToPostfix cache.\r\n * It uses to improve the performance of the shader compilation.\r\n * For details see PR: https://github.com/BabylonJS/Babylon.js/pull/13936\r\n */\r\n static InfixToPostfixCacheLimitSize = 50000;\r\n\r\n /**\r\n * When the cache size is exceeded, a cache cleanup will be triggered\r\n * and the cache will be reduced by the size specified\r\n * in the InfixToPostfixCacheCleanupSize variable, removing entries\r\n * that have not been accessed the longest.\r\n */\r\n static InfixToPostfixCacheCleanupSize = 25000;\r\n\r\n protected static _InfixToPostfixCache: Map<\r\n string,\r\n {\r\n accessTime: number;\r\n result: string[];\r\n }\r\n > = new Map();\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isTrue(preprocessors: { [key: string]: string }): boolean {\r\n return true;\r\n }\r\n\r\n private static _OperatorPriority: { [name: string]: number } = {\r\n \")\": 0,\r\n \"(\": 1,\r\n \"||\": 2,\r\n \"&&\": 3,\r\n };\r\n\r\n private static _Stack = [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\r\n\r\n public static postfixToInfix(postfix: string[]): string {\r\n const stack: string[] = [];\r\n\r\n for (const c of postfix) {\r\n if (ShaderDefineExpression._OperatorPriority[c] === undefined) {\r\n stack.push(c);\r\n } else {\r\n const v1 = stack[stack.length - 1],\r\n v2 = stack[stack.length - 2];\r\n\r\n stack.length -= 2;\r\n stack.push(`(${v2}${c}${v1})`);\r\n }\r\n }\r\n\r\n return stack[stack.length - 1];\r\n }\r\n\r\n /**\r\n * Converts an infix expression to a postfix expression.\r\n *\r\n * This method is used to transform infix expressions, which are more human-readable,\r\n * into postfix expressions, also known as Reverse Polish Notation (RPN), that can be\r\n * evaluated more efficiently by a computer. The conversion is based on the operator\r\n * priority defined in _OperatorPriority.\r\n *\r\n * The function employs a stack-based algorithm for the conversion and caches the result\r\n * to improve performance. The cache keeps track of each converted expression's access time\r\n * to manage the cache size and optimize memory usage. When the cache size exceeds a specified\r\n * limit, the least recently accessed items in the cache are deleted.\r\n *\r\n * The cache mechanism is particularly helpful for shader compilation, where the same infix\r\n * expressions might be encountered repeatedly, hence the caching can speed up the process.\r\n *\r\n * @param infix - The infix expression to be converted.\r\n * @returns The postfix expression as an array of strings.\r\n */\r\n public static infixToPostfix(infix: string): string[] {\r\n // Is infix already in cache\r\n const cacheItem = ShaderDefineExpression._InfixToPostfixCache.get(infix);\r\n if (cacheItem) {\r\n cacheItem.accessTime = Date.now();\r\n return cacheItem.result;\r\n }\r\n\r\n // Is infix contain any operator\r\n if (!infix.includes(\"&&\") && !infix.includes(\"||\") && !infix.includes(\")\") && !infix.includes(\"(\")) {\r\n return [infix];\r\n }\r\n\r\n const result: string[] = [];\r\n\r\n let stackIdx = -1;\r\n\r\n const pushOperand = () => {\r\n operand = operand.trim();\r\n if (operand !== \"\") {\r\n result.push(operand);\r\n operand = \"\";\r\n }\r\n };\r\n\r\n const push = (s: string) => {\r\n if (stackIdx < ShaderDefineExpression._Stack.length - 1) {\r\n ShaderDefineExpression._Stack[++stackIdx] = s;\r\n }\r\n };\r\n\r\n const peek = () => ShaderDefineExpression._Stack[stackIdx];\r\n\r\n const pop = () => (stackIdx === -1 ? \"!!INVALID EXPRESSION!!\" : ShaderDefineExpression._Stack[stackIdx--]);\r\n\r\n let idx = 0,\r\n operand = \"\";\r\n\r\n while (idx < infix.length) {\r\n const c = infix.charAt(idx),\r\n token = idx < infix.length - 1 ? infix.substr(idx, 2) : \"\";\r\n\r\n if (c === \"(\") {\r\n operand = \"\";\r\n push(c);\r\n } else if (c === \")\") {\r\n pushOperand();\r\n while (stackIdx !== -1 && peek() !== \"(\") {\r\n result.push(pop());\r\n }\r\n pop();\r\n } else if (ShaderDefineExpression._OperatorPriority[token] > 1) {\r\n pushOperand();\r\n while (stackIdx !== -1 && ShaderDefineExpression._OperatorPriority[peek()] >= ShaderDefineExpression._OperatorPriority[token]) {\r\n result.push(pop());\r\n }\r\n push(token);\r\n idx++;\r\n } else {\r\n operand += c;\r\n }\r\n idx++;\r\n }\r\n\r\n pushOperand();\r\n\r\n while (stackIdx !== -1) {\r\n if (peek() === \"(\") {\r\n pop();\r\n } else {\r\n result.push(pop());\r\n }\r\n }\r\n\r\n // If the cache is at capacity, clear it before adding a new item\r\n if (ShaderDefineExpression._InfixToPostfixCache.size >= ShaderDefineExpression.InfixToPostfixCacheLimitSize) {\r\n ShaderDefineExpression.ClearCache();\r\n }\r\n\r\n // Add the new item to the cache, including the current time as the last access time\r\n ShaderDefineExpression._InfixToPostfixCache.set(infix, { result, accessTime: Date.now() });\r\n\r\n return result;\r\n }\r\n\r\n private static ClearCache(): void {\r\n // Convert the cache to an array and sort by last access time\r\n const sortedCache = Array.from(ShaderDefineExpression._InfixToPostfixCache.entries()).sort((a, b) => a[1].accessTime - b[1].accessTime);\r\n\r\n // Remove the least recently accessed half of the cache\r\n for (let i = 0; i < ShaderDefineExpression.InfixToPostfixCacheCleanupSize; i++) {\r\n ShaderDefineExpression._InfixToPostfixCache.delete(sortedCache[i][0]);\r\n }\r\n }\r\n}\r\n", "import { ShaderDefineExpression } from \"../shaderDefineExpression\";\r\n\r\n/** @internal */\r\nexport class ShaderDefineIsDefinedOperator extends ShaderDefineExpression {\r\n public constructor(\r\n public define: string,\r\n public not: boolean = false\r\n ) {\r\n super();\r\n }\r\n\r\n public isTrue(preprocessors: { [key: string]: string }) {\r\n let condition = preprocessors[this.define] !== undefined;\r\n\r\n if (this.not) {\r\n condition = !condition;\r\n }\r\n\r\n return condition;\r\n }\r\n}\r\n", "import { ShaderDefineExpression } from \"../shaderDefineExpression\";\r\n\r\n/** @internal */\r\nexport class ShaderDefineOrOperator extends ShaderDefineExpression {\r\n public leftOperand: ShaderDefineExpression;\r\n public rightOperand: ShaderDefineExpression;\r\n\r\n public isTrue(preprocessors: { [key: string]: string }): boolean {\r\n return this.leftOperand.isTrue(preprocessors) || this.rightOperand.isTrue(preprocessors);\r\n }\r\n}\r\n", "import { ShaderDefineExpression } from \"../shaderDefineExpression\";\r\n\r\n/** @internal */\r\nexport class ShaderDefineAndOperator extends ShaderDefineExpression {\r\n public leftOperand: ShaderDefineExpression;\r\n public rightOperand: ShaderDefineExpression;\r\n\r\n public isTrue(preprocessors: { [key: string]: string }): boolean {\r\n return this.leftOperand.isTrue(preprocessors) && this.rightOperand.isTrue(preprocessors);\r\n }\r\n}\r\n", "import { ShaderDefineExpression } from \"../shaderDefineExpression\";\r\n\r\n/** @internal */\r\nexport class ShaderDefineArithmeticOperator extends ShaderDefineExpression {\r\n public constructor(\r\n public define: string,\r\n public operand: string,\r\n public testValue: string\r\n ) {\r\n super();\r\n }\r\n\r\n public isTrue(preprocessors: { [key: string]: string }) {\r\n let value = preprocessors[this.define];\r\n\r\n if (value === undefined) {\r\n value = this.define;\r\n }\r\n\r\n let condition = false;\r\n const left = parseInt(value);\r\n const right = parseInt(this.testValue);\r\n\r\n switch (this.operand) {\r\n case \">\":\r\n condition = left > right;\r\n break;\r\n case \"<\":\r\n condition = left < right;\r\n break;\r\n case \"<=\":\r\n condition = left <= right;\r\n break;\r\n case \">=\":\r\n condition = left >= right;\r\n break;\r\n case \"==\":\r\n condition = left === right;\r\n break;\r\n case \"!=\":\r\n condition = left !== right;\r\n break;\r\n }\r\n\r\n return condition;\r\n }\r\n}\r\n", "const warnedMap: { [key: string]: boolean } = {};\r\n/**\r\n * @internal\r\n */\r\nexport function _WarnImport(name: string, warnOnce = false) {\r\n if (warnOnce && warnedMap[name]) {\r\n return;\r\n }\r\n warnedMap[name] = true;\r\n return `${name} needs to be imported before as it contains a side-effect required by your code.`;\r\n}\r\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { ShaderCodeNode } from \"./shaderCodeNode\";\r\nimport { ShaderCodeCursor } from \"./shaderCodeCursor\";\r\nimport { ShaderCodeConditionNode } from \"./shaderCodeConditionNode\";\r\nimport { ShaderCodeTestNode } from \"./shaderCodeTestNode\";\r\nimport { ShaderDefineIsDefinedOperator } from \"./Expressions/Operators/shaderDefineIsDefinedOperator\";\r\nimport { ShaderDefineOrOperator } from \"./Expressions/Operators/shaderDefineOrOperator\";\r\nimport { ShaderDefineAndOperator } from \"./Expressions/Operators/shaderDefineAndOperator\";\r\nimport { ShaderDefineExpression } from \"./Expressions/shaderDefineExpression\";\r\nimport { ShaderDefineArithmeticOperator } from \"./Expressions/Operators/shaderDefineArithmeticOperator\";\r\nimport type { ProcessingOptions } from \"./shaderProcessingOptions\";\r\nimport { _WarnImport } from \"../../Misc/devTools\";\r\nimport { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\n\r\nimport type { WebRequest } from \"../../Misc/webRequest\";\r\nimport type { LoadFileError } from \"../../Misc/fileTools\";\r\nimport type { IOfflineProvider } from \"../../Offline/IOfflineProvider\";\r\nimport type { IFileRequest } from \"../../Misc/fileRequest\";\r\nimport type { ThinEngine } from \"../thinEngine\";\r\n\r\nconst regexSE = /defined\\s*?\\((.+?)\\)/g;\r\nconst regexSERevert = /defined\\s*?\\[(.+?)\\]/g;\r\nconst regexShaderInclude = /#include\\s?<(.+)>(\\((.*)\\))*(\\[(.*)\\])*/g;\r\nconst regexShaderDecl = /__decl__/;\r\nconst regexLightX = /light\\{X\\}.(\\w*)/g;\r\nconst regexX = /\\{X\\}/g;\r\nconst reusableMatches: RegExpMatchArray[] = [];\r\n\r\n/** @internal */\r\nexport class ShaderProcessor {\r\n private static _MoveCursorRegex = /(#ifdef)|(#else)|(#elif)|(#endif)|(#ifndef)|(#if)/;\r\n\r\n public static Initialize(options: ProcessingOptions): void {\r\n if (options.processor && options.processor.initializeShaders) {\r\n options.processor.initializeShaders(options.processingContext);\r\n }\r\n }\r\n\r\n public static Process(sourceCode: string, options: ProcessingOptions, callback: (migratedCode: string, codeBeforeMigration: string) => void, engine: ThinEngine) {\r\n if (options.processor?.preProcessShaderCode) {\r\n sourceCode = options.processor.preProcessShaderCode(sourceCode, options.isFragment);\r\n }\r\n this._ProcessIncludes(sourceCode, options, (codeWithIncludes) => {\r\n if (options.processCodeAfterIncludes) {\r\n codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? \"fragment\" : \"vertex\", codeWithIncludes);\r\n }\r\n const migratedCode = this._ProcessShaderConversion(codeWithIncludes, options, engine);\r\n callback(migratedCode, codeWithIncludes);\r\n });\r\n }\r\n\r\n public static PreProcess(sourceCode: string, options: ProcessingOptions, callback: (migratedCode: string, codeBeforeMigration: string) => void, engine: ThinEngine) {\r\n if (options.processor?.preProcessShaderCode) {\r\n sourceCode = options.processor.preProcessShaderCode(sourceCode, options.isFragment);\r\n }\r\n this._ProcessIncludes(sourceCode, options, (codeWithIncludes) => {\r\n if (options.processCodeAfterIncludes) {\r\n codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? \"fragment\" : \"vertex\", codeWithIncludes);\r\n }\r\n const migratedCode = this._ApplyPreProcessing(codeWithIncludes, options, engine);\r\n callback(migratedCode, codeWithIncludes);\r\n });\r\n }\r\n\r\n public static Finalize(vertexCode: string, fragmentCode: string, options: ProcessingOptions): { vertexCode: string; fragmentCode: string } {\r\n if (!options.processor || !options.processor.finalizeShaders) {\r\n return { vertexCode, fragmentCode };\r\n }\r\n\r\n return options.processor.finalizeShaders(vertexCode, fragmentCode, options.processingContext);\r\n }\r\n\r\n private static _ProcessPrecision(source: string, options: ProcessingOptions): string {\r\n if (options.processor?.noPrecision) {\r\n return source;\r\n }\r\n\r\n const shouldUseHighPrecisionShader = options.shouldUseHighPrecisionShader;\r\n\r\n if (source.indexOf(\"precision highp float\") === -1) {\r\n if (!shouldUseHighPrecisionShader) {\r\n source = \"precision mediump float;\\n\" + source;\r\n } else {\r\n source = \"precision highp float;\\n\" + source;\r\n }\r\n } else {\r\n if (!shouldUseHighPrecisionShader) {\r\n // Moving highp to mediump\r\n source = source.replace(\"precision highp float\", \"precision mediump float\");\r\n }\r\n }\r\n\r\n return source;\r\n }\r\n\r\n private static _ExtractOperation(expression: string) {\r\n const regex = /defined\\((.+)\\)/;\r\n\r\n const match = regex.exec(expression);\r\n\r\n if (match && match.length) {\r\n return new ShaderDefineIsDefinedOperator(match[1].trim(), expression[0] === \"!\");\r\n }\r\n\r\n const operators = [\"==\", \"!=\", \">=\", \"<=\", \"<\", \">\"];\r\n let operator = \"\";\r\n let indexOperator = 0;\r\n\r\n for (operator of operators) {\r\n indexOperator = expression.indexOf(operator);\r\n\r\n if (indexOperator > -1) {\r\n break;\r\n }\r\n }\r\n\r\n if (indexOperator === -1) {\r\n return new ShaderDefineIsDefinedOperator(expression);\r\n }\r\n\r\n const define = expression.substring(0, indexOperator).trim();\r\n const value = expression.substring(indexOperator + operator.length).trim();\r\n\r\n return new ShaderDefineArithmeticOperator(define, operator, value);\r\n }\r\n\r\n private static _BuildSubExpression(expression: string): ShaderDefineExpression {\r\n expression = expression.replace(regexSE, \"defined[$1]\");\r\n\r\n const postfix = ShaderDefineExpression.infixToPostfix(expression);\r\n\r\n const stack: (string | ShaderDefineExpression)[] = [];\r\n\r\n for (const c of postfix) {\r\n if (c !== \"||\" && c !== \"&&\") {\r\n stack.push(c);\r\n } else if (stack.length >= 2) {\r\n let v1 = stack[stack.length - 1],\r\n v2 = stack[stack.length - 2];\r\n\r\n stack.length -= 2;\r\n\r\n const operator = c == \"&&\" ? new ShaderDefineAndOperator() : new ShaderDefineOrOperator();\r\n\r\n if (typeof v1 === \"string\") {\r\n v1 = v1.replace(regexSERevert, \"defined($1)\");\r\n }\r\n\r\n if (typeof v2 === \"string\") {\r\n v2 = v2.replace(regexSERevert, \"defined($1)\");\r\n }\r\n\r\n operator.leftOperand = typeof v2 === \"string\" ? this._ExtractOperation(v2) : v2;\r\n operator.rightOperand = typeof v1 === \"string\" ? this._ExtractOperation(v1) : v1;\r\n\r\n stack.push(operator);\r\n }\r\n }\r\n\r\n let result = stack[stack.length - 1];\r\n\r\n if (typeof result === \"string\") {\r\n result = result.replace(regexSERevert, \"defined($1)\");\r\n }\r\n\r\n // note: stack.length !== 1 if there was an error in the parsing\r\n\r\n return typeof result === \"string\" ? this._ExtractOperation(result) : result;\r\n }\r\n\r\n private static _BuildExpression(line: string, start: number): ShaderCodeTestNode {\r\n const node = new ShaderCodeTestNode();\r\n const command = line.substring(0, start);\r\n let expression = line.substring(start);\r\n\r\n expression = expression.substring(0, (expression.indexOf(\"//\") + 1 || expression.length + 1) - 1).trim();\r\n\r\n if (command === \"#ifdef\") {\r\n node.testExpression = new ShaderDefineIsDefinedOperator(expression);\r\n } else if (command === \"#ifndef\") {\r\n node.testExpression = new ShaderDefineIsDefinedOperator(expression, true);\r\n } else {\r\n node.testExpression = this._BuildSubExpression(expression);\r\n }\r\n\r\n return node;\r\n }\r\n\r\n private static _MoveCursorWithinIf(cursor: ShaderCodeCursor, rootNode: ShaderCodeConditionNode, ifNode: ShaderCodeNode) {\r\n let line = cursor.currentLine;\r\n while (this._MoveCursor(cursor, ifNode)) {\r\n line = cursor.currentLine;\r\n const first5 = line.substring(0, 5).toLowerCase();\r\n\r\n if (first5 === \"#else\") {\r\n const elseNode = new ShaderCodeNode();\r\n rootNode.children.push(elseNode);\r\n this._MoveCursor(cursor, elseNode);\r\n return;\r\n } else if (first5 === \"#elif\") {\r\n const elifNode = this._BuildExpression(line, 5);\r\n\r\n rootNode.children.push(elifNode);\r\n ifNode = elifNode;\r\n }\r\n }\r\n }\r\n\r\n private static _MoveCursor(cursor: ShaderCodeCursor, rootNode: ShaderCodeNode): boolean {\r\n while (cursor.canRead) {\r\n cursor.lineIndex++;\r\n const line = cursor.currentLine;\r\n\r\n if (line.indexOf(\"#\") >= 0) {\r\n const matches = ShaderProcessor._MoveCursorRegex.exec(line);\r\n\r\n if (matches && matches.length) {\r\n const keyword = matches[0];\r\n\r\n switch (keyword) {\r\n case \"#ifdef\": {\r\n const newRootNode = new ShaderCodeConditionNode();\r\n rootNode.children.push(newRootNode);\r\n\r\n const ifNode = this._BuildExpression(line, 6);\r\n newRootNode.children.push(ifNode);\r\n this._MoveCursorWithinIf(cursor, newRootNode, ifNode);\r\n break;\r\n }\r\n case \"#else\":\r\n case \"#elif\":\r\n return true;\r\n case \"#endif\":\r\n return false;\r\n case \"#ifndef\": {\r\n const newRootNode = new ShaderCodeConditionNode();\r\n rootNode.children.push(newRootNode);\r\n\r\n const ifNode = this._BuildExpression(line, 7);\r\n newRootNode.children.push(ifNode);\r\n this._MoveCursorWithinIf(cursor, newRootNode, ifNode);\r\n break;\r\n }\r\n case \"#if\": {\r\n const newRootNode = new ShaderCodeConditionNode();\r\n const ifNode = this._BuildExpression(line, 3);\r\n rootNode.children.push(newRootNode);\r\n\r\n newRootNode.children.push(ifNode);\r\n this._MoveCursorWithinIf(cursor, newRootNode, ifNode);\r\n break;\r\n }\r\n }\r\n continue;\r\n }\r\n }\r\n\r\n const newNode = new ShaderCodeNode();\r\n newNode.line = line;\r\n rootNode.children.push(newNode);\r\n\r\n // Detect additional defines\r\n if (line[0] === \"#\" && line[1] === \"d\") {\r\n const split = line.replace(\";\", \"\").split(\" \");\r\n newNode.additionalDefineKey = split[1];\r\n\r\n if (split.length === 3) {\r\n newNode.additionalDefineValue = split[2];\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private static _EvaluatePreProcessors(sourceCode: string, preprocessors: { [key: string]: string }, options: ProcessingOptions): string {\r\n const rootNode = new ShaderCodeNode();\r\n const cursor = new ShaderCodeCursor();\r\n\r\n cursor.lineIndex = -1;\r\n cursor.lines = sourceCode.split(\"\\n\");\r\n\r\n // Decompose (We keep it in 2 steps so it is easier to maintain and perf hit is insignificant)\r\n this._MoveCursor(cursor, rootNode);\r\n\r\n // Recompose\r\n return rootNode.process(preprocessors, options);\r\n }\r\n\r\n private static _PreparePreProcessors(options: ProcessingOptions, engine: ThinEngine): { [key: string]: string } {\r\n const defines = options.defines;\r\n const preprocessors: { [key: string]: string } = {};\r\n\r\n for (const define of defines) {\r\n const keyValue = define.replace(\"#define\", \"\").replace(\";\", \"\").trim();\r\n const split = keyValue.split(\" \");\r\n preprocessors[split[0]] = split.length > 1 ? split[1] : \"\";\r\n }\r\n\r\n if (options.processor?.shaderLanguage === ShaderLanguage.GLSL) {\r\n preprocessors[\"GL_ES\"] = \"true\";\r\n }\r\n preprocessors[\"__VERSION__\"] = options.version;\r\n preprocessors[options.platformName] = \"true\";\r\n\r\n engine._getGlobalDefines(preprocessors);\r\n\r\n return preprocessors;\r\n }\r\n\r\n private static _ProcessShaderConversion(sourceCode: string, options: ProcessingOptions, engine: ThinEngine): string {\r\n let preparedSourceCode = this._ProcessPrecision(sourceCode, options);\r\n\r\n if (!options.processor) {\r\n return preparedSourceCode;\r\n }\r\n\r\n // Already converted\r\n if (options.processor.shaderLanguage === ShaderLanguage.GLSL && preparedSourceCode.indexOf(\"#version 3\") !== -1) {\r\n preparedSourceCode = preparedSourceCode.replace(\"#version 300 es\", \"\");\r\n if (!options.processor.parseGLES3) {\r\n return preparedSourceCode;\r\n }\r\n }\r\n\r\n const defines = options.defines;\r\n\r\n const preprocessors = this._PreparePreProcessors(options, engine);\r\n\r\n // General pre processing\r\n if (options.processor.preProcessor) {\r\n preparedSourceCode = options.processor.preProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext);\r\n }\r\n\r\n preparedSourceCode = this._EvaluatePreProcessors(preparedSourceCode, preprocessors, options);\r\n\r\n // Post processing\r\n if (options.processor.postProcessor) {\r\n preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext, engine);\r\n }\r\n\r\n // Inline functions tagged with #define inline\r\n if (engine._features.needShaderCodeInlining) {\r\n preparedSourceCode = engine.inlineShaderCode(preparedSourceCode);\r\n }\r\n\r\n return preparedSourceCode;\r\n }\r\n\r\n private static _ApplyPreProcessing(sourceCode: string, options: ProcessingOptions, engine: ThinEngine): string {\r\n let preparedSourceCode = sourceCode;\r\n\r\n const defines = options.defines;\r\n\r\n const preprocessors = this._PreparePreProcessors(options, engine);\r\n\r\n // General pre processing\r\n if (options.processor?.preProcessor) {\r\n preparedSourceCode = options.processor.preProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext);\r\n }\r\n\r\n preparedSourceCode = this._EvaluatePreProcessors(preparedSourceCode, preprocessors, options);\r\n\r\n // Post processing\r\n if (options.processor?.postProcessor) {\r\n preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext, engine);\r\n }\r\n\r\n // Inline functions tagged with #define inline\r\n if (engine._features.needShaderCodeInlining) {\r\n preparedSourceCode = engine.inlineShaderCode(preparedSourceCode);\r\n }\r\n\r\n return preparedSourceCode;\r\n }\r\n\r\n /** @internal */\r\n public static _ProcessIncludes(sourceCode: string, options: ProcessingOptions, callback: (data: any) => void): void {\r\n reusableMatches.length = 0;\r\n let match: RegExpMatchArray | null;\r\n // stay back-compat to the old matchAll syntax\r\n while ((match = regexShaderInclude.exec(sourceCode)) !== null) {\r\n reusableMatches.push(match);\r\n }\r\n\r\n let returnValue = String(sourceCode);\r\n let parts = [sourceCode];\r\n\r\n let keepProcessing = false;\r\n\r\n for (const match of reusableMatches) {\r\n let includeFile = match[1];\r\n\r\n // Uniform declaration\r\n if (includeFile.indexOf(\"__decl__\") !== -1) {\r\n includeFile = includeFile.replace(regexShaderDecl, \"\");\r\n if (options.supportsUniformBuffers) {\r\n includeFile = includeFile.replace(\"Vertex\", \"Ubo\").replace(\"Fragment\", \"Ubo\");\r\n }\r\n includeFile = includeFile + \"Declaration\";\r\n }\r\n\r\n if (options.includesShadersStore[includeFile]) {\r\n // Substitution\r\n let includeContent = options.includesShadersStore[includeFile];\r\n if (match[2]) {\r\n const splits = match[3].split(\",\");\r\n\r\n for (let index = 0; index < splits.length; index += 2) {\r\n const source = new RegExp(splits[index], \"g\");\r\n const dest = splits[index + 1];\r\n\r\n includeContent = includeContent.replace(source, dest);\r\n }\r\n }\r\n\r\n if (match[4]) {\r\n const indexString = match[5];\r\n\r\n if (indexString.indexOf(\"..\") !== -1) {\r\n const indexSplits = indexString.split(\"..\");\r\n const minIndex = parseInt(indexSplits[0]);\r\n let maxIndex = parseInt(indexSplits[1]);\r\n let sourceIncludeContent = includeContent.slice(0);\r\n includeContent = \"\";\r\n\r\n if (isNaN(maxIndex)) {\r\n maxIndex = options.indexParameters[indexSplits[1]];\r\n }\r\n\r\n for (let i = minIndex; i < maxIndex; i++) {\r\n if (!options.supportsUniformBuffers) {\r\n // Ubo replacement\r\n sourceIncludeContent = sourceIncludeContent.replace(regexLightX, (str: string, p1: string) => {\r\n return p1 + \"{X}\";\r\n });\r\n }\r\n includeContent += sourceIncludeContent.replace(regexX, i.toString()) + \"\\n\";\r\n }\r\n } else {\r\n if (!options.supportsUniformBuffers) {\r\n // Ubo replacement\r\n includeContent = includeContent.replace(regexLightX, (str: string, p1: string) => {\r\n return p1 + \"{X}\";\r\n });\r\n }\r\n includeContent = includeContent.replace(regexX, indexString);\r\n }\r\n }\r\n\r\n // Replace\r\n // Split all parts on match[0] and intersperse the parts with the include content\r\n const newParts = [];\r\n for (const part of parts) {\r\n const splitPart = part.split(match[0]);\r\n for (let i = 0; i < splitPart.length - 1; i++) {\r\n newParts.push(splitPart[i]);\r\n newParts.push(includeContent);\r\n }\r\n newParts.push(splitPart[splitPart.length - 1]);\r\n }\r\n parts = newParts;\r\n\r\n keepProcessing = keepProcessing || includeContent.indexOf(\"#include<\") >= 0 || includeContent.indexOf(\"#include <\") >= 0;\r\n } else {\r\n const includeShaderUrl = options.shadersRepository + \"ShadersInclude/\" + includeFile + \".fx\";\r\n\r\n ShaderProcessor._FileToolsLoadFile(includeShaderUrl, (fileContent) => {\r\n options.includesShadersStore[includeFile] = fileContent as string;\r\n this._ProcessIncludes(parts.join(\"\"), options, callback);\r\n });\r\n return;\r\n }\r\n }\r\n reusableMatches.length = 0;\r\n\r\n returnValue = parts.join(\"\");\r\n\r\n if (keepProcessing) {\r\n this._ProcessIncludes(returnValue.toString(), options, callback);\r\n } else {\r\n callback(returnValue);\r\n }\r\n }\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @returns a file request object\r\n * @internal\r\n */\r\n public static _FileToolsLoadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void\r\n ): IFileRequest {\r\n throw _WarnImport(\"FileTools\");\r\n }\r\n}\r\n", "import { Observable } from \"../Misc/observable\";\r\nimport type { FloatArray, Nullable } from \"../types\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { GetDOMTextContent, IsWindowObjectExist } from \"../Misc/domManagement\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { IDisposable } from \"../scene\";\r\nimport type { IPipelineContext } from \"../Engines/IPipelineContext\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { ShaderProcessor } from \"../Engines/Processors/shaderProcessor\";\r\nimport type { IShaderProcessor } from \"../Engines/Processors/iShaderProcessor\";\r\nimport type { ProcessingOptions, ShaderCustomProcessingFunction, ShaderProcessingContext } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { IMatrixLike, IVector2Like, IVector3Like, IVector4Like, IColor3Like, IColor4Like, IQuaternionLike } from \"../Maths/math.like\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport type { IEffectFallbacks } from \"./iEffectFallbacks\";\r\nimport { ShaderStore as EngineShaderStore } from \"../Engines/shaderStore\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\n\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport type { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { PostProcess } from \"../PostProcesses/postProcess\";\r\n\r\n/**\r\n * Defines the route to the shader code. The priority is as follows:\r\n * * object: `{ vertexSource: \"vertex shader code string\", fragmentSource: \"fragment shader code string\" }` for directly passing the shader code\r\n * * object: `{ vertexElement: \"vertexShaderCode\", fragmentElement: \"fragmentShaderCode\" }`, used with shader code in script tags\r\n * * object: `{ vertex: \"custom\", fragment: \"custom\" }`, used with `Effect.ShadersStore[\"customVertexShader\"]` and `Effect.ShadersStore[\"customFragmentShader\"]`\r\n * * string: `\"./COMMON_NAME\"`, used with external files COMMON_NAME.vertex.fx and COMMON_NAME.fragment.fx in index.html folder.\r\n */\r\nexport type IShaderPath = {\r\n /**\r\n * Directly pass the shader code\r\n */\r\n vertexSource?: string;\r\n /**\r\n * Directly pass the shader code\r\n */\r\n fragmentSource?: string;\r\n /**\r\n * Used with Effect.ShadersStore. If the `vertex` is set to `\"custom`, then\r\n * Babylon.js will read from Effect.ShadersStore[\"customVertexShader\"]\r\n */\r\n vertex?: string;\r\n /**\r\n * Used with Effect.ShadersStore. If the `fragment` is set to `\"custom`, then\r\n * Babylon.js will read from Effect.ShadersStore[\"customFragmentShader\"]\r\n */\r\n fragment?: string;\r\n /**\r\n * Used with shader code in script tags\r\n */\r\n vertexElement?: string;\r\n /**\r\n * Used with shader code in script tags\r\n */\r\n fragmentElement?: string;\r\n};\r\n\r\n/**\r\n * Options to be used when creating an effect.\r\n */\r\nexport interface IEffectCreationOptions {\r\n /**\r\n * Attributes that will be used in the shader.\r\n */\r\n attributes: string[];\r\n /**\r\n * Uniform variable names that will be set in the shader.\r\n */\r\n uniformsNames: string[];\r\n /**\r\n * Uniform buffer variable names that will be set in the shader.\r\n */\r\n uniformBuffersNames: string[];\r\n /**\r\n * Sampler texture variable names that will be set in the shader.\r\n */\r\n samplers: string[];\r\n /**\r\n * Define statements that will be set in the shader.\r\n */\r\n defines: any;\r\n /**\r\n * Possible fallbacks for this effect to improve performance when needed.\r\n */\r\n fallbacks: Nullable;\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n onCompiled: Nullable<(effect: Effect) => void>;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n onError: Nullable<(effect: Effect, errors: string) => void>;\r\n /**\r\n * Parameters to be used with Babylons include syntax to iterate over an array (eg. \\{lights: 10\\})\r\n */\r\n indexParameters?: any;\r\n /**\r\n * Max number of lights that can be used in the shader.\r\n */\r\n maxSimultaneousLights?: number;\r\n /**\r\n * See https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext/transformFeedbackVaryings\r\n */\r\n transformFeedbackVaryings?: Nullable;\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: Nullable;\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated after the #include have been processed\r\n */\r\n processCodeAfterIncludes?: Nullable;\r\n /**\r\n * Is this effect rendering to several color attachments ?\r\n */\r\n multiTarget?: boolean;\r\n /**\r\n * The language the shader is written in (default: GLSL)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n}\r\n\r\n/**\r\n * Effect containing vertex and fragment shader that can be executed on an object.\r\n */\r\nexport class Effect implements IDisposable {\r\n /**\r\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\r\n */\r\n public static get ShadersRepository(): string {\r\n return EngineShaderStore.ShadersRepository;\r\n }\r\n public static set ShadersRepository(repo: string) {\r\n EngineShaderStore.ShadersRepository = repo;\r\n }\r\n /**\r\n * Enable logging of the shader code when a compilation error occurs\r\n */\r\n public static LogShaderCodeOnCompilationError = true;\r\n /**\r\n * Name of the effect.\r\n */\r\n public name: IShaderPath | string;\r\n /**\r\n * String container all the define statements that should be set on the shader.\r\n */\r\n public defines: string = \"\";\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n public onCompiled: Nullable<(effect: Effect) => void> = null;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n public onError: Nullable<(effect: Effect, errors: string) => void> = null;\r\n /**\r\n * Callback that will be called when effect is bound.\r\n */\r\n public onBind: Nullable<(effect: Effect) => void> = null;\r\n /**\r\n * Unique ID of the effect.\r\n */\r\n public uniqueId = 0;\r\n /**\r\n * Observable that will be called when the shader is compiled.\r\n * It is recommended to use executeWhenCompile() or to make sure that scene.isReady() is called to get this observable raised.\r\n */\r\n public onCompileObservable = new Observable();\r\n /**\r\n * Observable that will be called if an error occurs during shader compilation.\r\n */\r\n public onErrorObservable = new Observable();\r\n\r\n /** @internal */\r\n public _onBindObservable: Nullable> = null;\r\n\r\n private _isDisposed = false;\r\n\r\n /**\r\n * Observable that will be called when effect is bound.\r\n */\r\n public get onBindObservable(): Observable {\r\n if (!this._onBindObservable) {\r\n this._onBindObservable = new Observable();\r\n }\r\n\r\n return this._onBindObservable;\r\n }\r\n\r\n /** @internal */\r\n public _bonesComputationForcedToCPU = false;\r\n /** @internal */\r\n public _uniformBuffersNames: { [key: string]: number } = {};\r\n /** @internal */\r\n public _samplerList: string[];\r\n /** @internal */\r\n public _multiTarget: boolean = false;\r\n\r\n private static _UniqueIdSeed = 0;\r\n /** @internal */\r\n public _engine: Engine;\r\n private _uniformBuffersNamesList: string[];\r\n private _uniformsNames: string[];\r\n private _samplers: { [key: string]: number } = {};\r\n private _isReady = false;\r\n private _compilationError = \"\";\r\n private _allFallbacksProcessed = false;\r\n private _attributesNames: string[];\r\n private _attributes: number[];\r\n private _attributeLocationByName: { [name: string]: number };\r\n private _uniforms: { [key: string]: Nullable } = {};\r\n /**\r\n * Key for the effect.\r\n * @internal\r\n */\r\n public _key: string = \"\";\r\n private _indexParameters: any;\r\n private _fallbacks: Nullable = null;\r\n private _vertexSourceCodeOverride: string = \"\";\r\n private _fragmentSourceCodeOverride: string = \"\";\r\n private _transformFeedbackVaryings: Nullable = null;\r\n private _shaderLanguage: ShaderLanguage;\r\n /**\r\n * Compiled shader to webGL program.\r\n * @internal\r\n */\r\n public _pipelineContext: Nullable = null;\r\n /** @internal */\r\n public _vertexSourceCode: string = \"\";\r\n /** @internal */\r\n public _fragmentSourceCode: string = \"\";\r\n\r\n /** @internal */\r\n private _vertexSourceCodeBeforeMigration: string = \"\";\r\n /** @internal */\r\n private _fragmentSourceCodeBeforeMigration: string = \"\";\r\n\r\n /** @internal */\r\n private _rawVertexSourceCode: string = \"\";\r\n /** @internal */\r\n private _rawFragmentSourceCode: string = \"\";\r\n\r\n private static _BaseCache: { [key: number]: DataBuffer } = {};\r\n private _processingContext: Nullable;\r\n\r\n private _processCodeAfterIncludes: ShaderCustomProcessingFunction | undefined = undefined;\r\n private _processFinalCode: Nullable = null;\r\n\r\n /**\r\n * Gets the shader language type used to write vertex and fragment source code.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates an effect.\r\n * An effect can be used to create/manage/execute vertex and fragment shaders.\r\n * @param baseName Name of the effect.\r\n * @param attributesNamesOrOptions List of attribute names that will be passed to the shader or set of all options to create the effect.\r\n * @param uniformsNamesOrEngine List of uniform variable names that will be passed to the shader or the engine that will be used to render effect.\r\n * @param samplers List of sampler variables that will be passed to the shader.\r\n * @param engine Engine to be used to render the effect\r\n * @param defines Define statements to be added to the shader.\r\n * @param fallbacks Possible fallbacks for this effect to improve performance when needed.\r\n * @param onCompiled Callback that will be called when the shader is compiled.\r\n * @param onError Callback that will be called if an error occurs during shader compilation.\r\n * @param indexParameters Parameters to be used with Babylons include syntax to iterate over an array (eg. \\{lights: 10\\})\r\n * @param key Effect Key identifying uniquely compiled shader variants\r\n * @param shaderLanguage the language the shader is written in (default: GLSL)\r\n */\r\n constructor(\r\n baseName: IShaderPath | string,\r\n attributesNamesOrOptions: string[] | IEffectCreationOptions,\r\n uniformsNamesOrEngine: string[] | ThinEngine,\r\n samplers: Nullable = null,\r\n engine?: ThinEngine,\r\n defines: Nullable = null,\r\n fallbacks: Nullable = null,\r\n onCompiled: Nullable<(effect: Effect) => void> = null,\r\n onError: Nullable<(effect: Effect, errors: string) => void> = null,\r\n indexParameters?: any,\r\n key: string = \"\",\r\n shaderLanguage = ShaderLanguage.GLSL\r\n ) {\r\n this.name = baseName;\r\n this._key = key;\r\n\r\n if ((attributesNamesOrOptions).attributes) {\r\n const options = attributesNamesOrOptions;\r\n this._engine = uniformsNamesOrEngine;\r\n\r\n this._attributesNames = options.attributes;\r\n this._uniformsNames = options.uniformsNames.concat(options.samplers);\r\n this._samplerList = options.samplers.slice();\r\n this.defines = options.defines;\r\n this.onError = options.onError;\r\n this.onCompiled = options.onCompiled;\r\n this._fallbacks = options.fallbacks;\r\n this._indexParameters = options.indexParameters;\r\n this._transformFeedbackVaryings = options.transformFeedbackVaryings || null;\r\n this._multiTarget = !!options.multiTarget;\r\n this._shaderLanguage = options.shaderLanguage ?? ShaderLanguage.GLSL;\r\n\r\n if (options.uniformBuffersNames) {\r\n this._uniformBuffersNamesList = options.uniformBuffersNames.slice();\r\n for (let i = 0; i < options.uniformBuffersNames.length; i++) {\r\n this._uniformBuffersNames[options.uniformBuffersNames[i]] = i;\r\n }\r\n }\r\n\r\n this._processFinalCode = options.processFinalCode ?? null;\r\n this._processCodeAfterIncludes = options.processCodeAfterIncludes ?? undefined;\r\n } else {\r\n this._engine = engine;\r\n this.defines = defines == null ? \"\" : defines;\r\n this._uniformsNames = (uniformsNamesOrEngine).concat(samplers);\r\n this._samplerList = samplers ? samplers.slice() : [];\r\n this._attributesNames = attributesNamesOrOptions;\r\n this._uniformBuffersNamesList = [];\r\n this._shaderLanguage = shaderLanguage;\r\n\r\n this.onError = onError;\r\n this.onCompiled = onCompiled;\r\n\r\n this._indexParameters = indexParameters;\r\n this._fallbacks = fallbacks;\r\n }\r\n\r\n this._attributeLocationByName = {};\r\n\r\n this.uniqueId = Effect._UniqueIdSeed++;\r\n\r\n this._processShaderCode();\r\n }\r\n\r\n /** @internal */\r\n public _processShaderCode(shaderProcessor: Nullable = null, keepExistingPipelineContext = false) {\r\n let vertexSource: string | HTMLElement | IShaderPath;\r\n let fragmentSource: string | HTMLElement | IShaderPath;\r\n\r\n const baseName = this.name;\r\n const hostDocument = IsWindowObjectExist() ? this._engine.getHostDocument() : null;\r\n\r\n if (typeof baseName === \"string\") {\r\n vertexSource = baseName;\r\n } else if (baseName.vertexSource) {\r\n vertexSource = \"source:\" + baseName.vertexSource;\r\n } else if (baseName.vertexElement) {\r\n vertexSource = hostDocument?.getElementById(baseName.vertexElement) || baseName.vertexElement;\r\n } else {\r\n vertexSource = baseName.vertex || baseName;\r\n }\r\n if (typeof baseName === \"string\") {\r\n fragmentSource = baseName;\r\n } else if (baseName.fragmentSource) {\r\n fragmentSource = \"source:\" + baseName.fragmentSource;\r\n } else if (baseName.fragmentElement) {\r\n fragmentSource = hostDocument?.getElementById(baseName.fragmentElement) || baseName.fragmentElement;\r\n } else {\r\n fragmentSource = baseName.fragment || baseName;\r\n }\r\n\r\n this._processingContext = this._engine._getShaderProcessingContext(this._shaderLanguage);\r\n\r\n let processorOptions: ProcessingOptions = {\r\n defines: this.defines.split(\"\\n\"),\r\n indexParameters: this._indexParameters,\r\n isFragment: false,\r\n shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader,\r\n processor: shaderProcessor ?? this._engine._getShaderProcessor(this._shaderLanguage),\r\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\r\n shadersRepository: EngineShaderStore.GetShadersRepository(this._shaderLanguage),\r\n includesShadersStore: EngineShaderStore.GetIncludesShadersStore(this._shaderLanguage),\r\n version: (this._engine.version * 100).toString(),\r\n platformName: this._engine.shaderPlatformName,\r\n processingContext: this._processingContext,\r\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\r\n processCodeAfterIncludes: this._processCodeAfterIncludes,\r\n };\r\n\r\n const shaderCodes: [string | undefined, string | undefined] = [undefined, undefined];\r\n const shadersLoaded = () => {\r\n if (shaderCodes[0] && shaderCodes[1]) {\r\n processorOptions.isFragment = true;\r\n const [migratedVertexCode, fragmentCode] = shaderCodes;\r\n ShaderProcessor.Process(\r\n fragmentCode,\r\n processorOptions,\r\n (migratedFragmentCode, codeBeforeMigration) => {\r\n this._fragmentSourceCodeBeforeMigration = codeBeforeMigration;\r\n if (this._processFinalCode) {\r\n migratedFragmentCode = this._processFinalCode(\"fragment\", migratedFragmentCode);\r\n }\r\n const finalShaders = ShaderProcessor.Finalize(migratedVertexCode, migratedFragmentCode, processorOptions);\r\n processorOptions = null as any;\r\n this._useFinalCode(finalShaders.vertexCode, finalShaders.fragmentCode, baseName, keepExistingPipelineContext);\r\n },\r\n this._engine\r\n );\r\n }\r\n };\r\n this._loadShader(vertexSource, \"Vertex\", \"\", (vertexCode) => {\r\n ShaderProcessor.Initialize(processorOptions);\r\n ShaderProcessor.Process(\r\n vertexCode,\r\n processorOptions,\r\n (migratedVertexCode, codeBeforeMigration) => {\r\n this._rawVertexSourceCode = vertexCode;\r\n this._vertexSourceCodeBeforeMigration = codeBeforeMigration;\r\n if (this._processFinalCode) {\r\n migratedVertexCode = this._processFinalCode(\"vertex\", migratedVertexCode);\r\n }\r\n shaderCodes[0] = migratedVertexCode;\r\n shadersLoaded();\r\n },\r\n this._engine\r\n );\r\n });\r\n this._loadShader(fragmentSource, \"Fragment\", \"Pixel\", (fragmentCode) => {\r\n this._rawFragmentSourceCode = fragmentCode;\r\n shaderCodes[1] = fragmentCode;\r\n shadersLoaded();\r\n });\r\n }\r\n\r\n private _useFinalCode(migratedVertexCode: string, migratedFragmentCode: string, baseName: any, keepExistingPipelineContext = false) {\r\n if (baseName) {\r\n const vertex = baseName.vertexElement || baseName.vertex || baseName.spectorName || baseName;\r\n const fragment = baseName.fragmentElement || baseName.fragment || baseName.spectorName || baseName;\r\n\r\n this._vertexSourceCode = (this._shaderLanguage === ShaderLanguage.WGSL ? \"//\" : \"\") + \"#define SHADER_NAME vertex:\" + vertex + \"\\n\" + migratedVertexCode;\r\n this._fragmentSourceCode = (this._shaderLanguage === ShaderLanguage.WGSL ? \"//\" : \"\") + \"#define SHADER_NAME fragment:\" + fragment + \"\\n\" + migratedFragmentCode;\r\n } else {\r\n this._vertexSourceCode = migratedVertexCode;\r\n this._fragmentSourceCode = migratedFragmentCode;\r\n }\r\n this._prepareEffect(keepExistingPipelineContext);\r\n }\r\n\r\n /**\r\n * Unique key for this effect\r\n */\r\n public get key(): string {\r\n return this._key;\r\n }\r\n\r\n /**\r\n * If the effect has been compiled and prepared.\r\n * @returns if the effect is compiled and prepared.\r\n */\r\n public isReady(): boolean {\r\n try {\r\n return this._isReadyInternal();\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private _isReadyInternal(): boolean {\r\n if (this._isReady) {\r\n return true;\r\n }\r\n if (this._pipelineContext) {\r\n return this._pipelineContext.isReady;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * The engine the effect was initialized with.\r\n * @returns the engine.\r\n */\r\n public getEngine(): Engine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * The pipeline context for this effect\r\n * @returns the associated pipeline context\r\n */\r\n public getPipelineContext(): Nullable {\r\n return this._pipelineContext;\r\n }\r\n\r\n /**\r\n * The set of names of attribute variables for the shader.\r\n * @returns An array of attribute names.\r\n */\r\n public getAttributesNames(): string[] {\r\n return this._attributesNames;\r\n }\r\n\r\n /**\r\n * Returns the attribute at the given index.\r\n * @param index The index of the attribute.\r\n * @returns The location of the attribute.\r\n */\r\n public getAttributeLocation(index: number): number {\r\n return this._attributes[index];\r\n }\r\n\r\n /**\r\n * Returns the attribute based on the name of the variable.\r\n * @param name of the attribute to look up.\r\n * @returns the attribute location.\r\n */\r\n public getAttributeLocationByName(name: string): number {\r\n return this._attributeLocationByName[name];\r\n }\r\n\r\n /**\r\n * The number of attributes.\r\n * @returns the number of attributes.\r\n */\r\n public getAttributesCount(): number {\r\n return this._attributes.length;\r\n }\r\n\r\n /**\r\n * Gets the index of a uniform variable.\r\n * @param uniformName of the uniform to look up.\r\n * @returns the index.\r\n */\r\n public getUniformIndex(uniformName: string): number {\r\n return this._uniformsNames.indexOf(uniformName);\r\n }\r\n\r\n /**\r\n * Returns the attribute based on the name of the variable.\r\n * @param uniformName of the uniform to look up.\r\n * @returns the location of the uniform.\r\n */\r\n public getUniform(uniformName: string): Nullable {\r\n return this._uniforms[uniformName];\r\n }\r\n\r\n /**\r\n * Returns an array of sampler variable names\r\n * @returns The array of sampler variable names.\r\n */\r\n public getSamplers(): string[] {\r\n return this._samplerList;\r\n }\r\n\r\n /**\r\n * Returns an array of uniform variable names\r\n * @returns The array of uniform variable names.\r\n */\r\n public getUniformNames(): string[] {\r\n return this._uniformsNames;\r\n }\r\n\r\n /**\r\n * Returns an array of uniform buffer variable names\r\n * @returns The array of uniform buffer variable names.\r\n */\r\n public getUniformBuffersNames(): string[] {\r\n return this._uniformBuffersNamesList;\r\n }\r\n\r\n /**\r\n * Returns the index parameters used to create the effect\r\n * @returns The index parameters object\r\n */\r\n public getIndexParameters(): any {\r\n return this._indexParameters;\r\n }\r\n\r\n /**\r\n * The error from the last compilation.\r\n * @returns the error string.\r\n */\r\n public getCompilationError(): string {\r\n return this._compilationError;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that all fallbacks were used during compilation\r\n * @returns true if all fallbacks were used\r\n */\r\n public allFallbacksProcessed(): boolean {\r\n return this._allFallbacksProcessed;\r\n }\r\n\r\n /**\r\n * Adds a callback to the onCompiled observable and call the callback immediately if already ready.\r\n * @param func The callback to be used.\r\n */\r\n public executeWhenCompiled(func: (effect: Effect) => void): void {\r\n if (this.isReady()) {\r\n func(this);\r\n return;\r\n }\r\n\r\n this.onCompileObservable.add((effect) => {\r\n func(effect);\r\n });\r\n\r\n if (!this._pipelineContext || this._pipelineContext.isAsync) {\r\n setTimeout(() => {\r\n this._checkIsReady(null);\r\n }, 16);\r\n }\r\n }\r\n\r\n private _checkIsReady(previousPipelineContext: Nullable) {\r\n try {\r\n if (this._isReadyInternal()) {\r\n return;\r\n }\r\n } catch (e) {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n return;\r\n }\r\n\r\n if (this._isDisposed) {\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n this._checkIsReady(previousPipelineContext);\r\n }, 16);\r\n }\r\n\r\n private _loadShader(shader: any, key: string, optionalKey: string, callback: (data: any) => void): void {\r\n if (typeof HTMLElement !== \"undefined\") {\r\n // DOM element ?\r\n if (shader instanceof HTMLElement) {\r\n const shaderCode = GetDOMTextContent(shader);\r\n callback(shaderCode);\r\n return;\r\n }\r\n }\r\n\r\n // Direct source ?\r\n if (shader.substr(0, 7) === \"source:\") {\r\n callback(shader.substr(7));\r\n return;\r\n }\r\n\r\n // Base64 encoded ?\r\n if (shader.substr(0, 7) === \"base64:\") {\r\n const shaderBinary = window.atob(shader.substr(7));\r\n callback(shaderBinary);\r\n return;\r\n }\r\n\r\n const shaderStore = EngineShaderStore.GetShadersStore(this._shaderLanguage);\r\n\r\n // Is in local store ?\r\n if (shaderStore[shader + key + \"Shader\"]) {\r\n callback(shaderStore[shader + key + \"Shader\"]);\r\n return;\r\n }\r\n\r\n if (optionalKey && shaderStore[shader + optionalKey + \"Shader\"]) {\r\n callback(shaderStore[shader + optionalKey + \"Shader\"]);\r\n return;\r\n }\r\n\r\n let shaderUrl;\r\n\r\n if (shader[0] === \".\" || shader[0] === \"/\" || shader.indexOf(\"http\") > -1) {\r\n shaderUrl = shader;\r\n } else {\r\n shaderUrl = EngineShaderStore.GetShadersRepository(this._shaderLanguage) + shader;\r\n }\r\n\r\n // Vertex shader\r\n this._engine._loadFile(shaderUrl + \".\" + key.toLowerCase() + \".fx\", callback);\r\n }\r\n\r\n /**\r\n * Gets the vertex shader source code of this effect\r\n * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)\r\n */\r\n public get vertexSourceCode(): string {\r\n return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride\r\n ? this._vertexSourceCodeOverride\r\n : this._pipelineContext?._getVertexShaderCode() ?? this._vertexSourceCode;\r\n }\r\n\r\n /**\r\n * Gets the fragment shader source code of this effect\r\n * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)\r\n */\r\n public get fragmentSourceCode(): string {\r\n return this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride\r\n ? this._fragmentSourceCodeOverride\r\n : this._pipelineContext?._getFragmentShaderCode() ?? this._fragmentSourceCode;\r\n }\r\n\r\n /**\r\n * Gets the vertex shader source code before migration.\r\n * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.\r\n * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).\r\n */\r\n public get vertexSourceCodeBeforeMigration(): string {\r\n return this._vertexSourceCodeBeforeMigration;\r\n }\r\n\r\n /**\r\n * Gets the fragment shader source code before migration.\r\n * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.\r\n * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).\r\n */\r\n public get fragmentSourceCodeBeforeMigration(): string {\r\n return this._fragmentSourceCodeBeforeMigration;\r\n }\r\n\r\n /**\r\n * Gets the vertex shader source code before it has been modified by any processing\r\n */\r\n public get rawVertexSourceCode(): string {\r\n return this._rawVertexSourceCode;\r\n }\r\n\r\n /**\r\n * Gets the fragment shader source code before it has been modified by any processing\r\n */\r\n public get rawFragmentSourceCode(): string {\r\n return this._rawFragmentSourceCode;\r\n }\r\n\r\n /**\r\n * Recompiles the webGL program\r\n * @param vertexSourceCode The source code for the vertex shader.\r\n * @param fragmentSourceCode The source code for the fragment shader.\r\n * @param onCompiled Callback called when completed.\r\n * @param onError Callback called on error.\r\n * @internal\r\n */\r\n public _rebuildProgram(vertexSourceCode: string, fragmentSourceCode: string, onCompiled: (pipelineContext: IPipelineContext) => void, onError: (message: string) => void) {\r\n this._isReady = false;\r\n\r\n this._vertexSourceCodeOverride = vertexSourceCode;\r\n this._fragmentSourceCodeOverride = fragmentSourceCode;\r\n this.onError = (effect, error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n };\r\n this.onCompiled = () => {\r\n const scenes = this.getEngine().scenes;\r\n if (scenes) {\r\n for (let i = 0; i < scenes.length; i++) {\r\n scenes[i].markAllMaterialsAsDirty(Constants.MATERIAL_AllDirtyFlag);\r\n }\r\n }\r\n\r\n this._pipelineContext!._handlesSpectorRebuildCallback?.(onCompiled);\r\n };\r\n this._fallbacks = null;\r\n this._prepareEffect();\r\n }\r\n\r\n /**\r\n * Prepares the effect\r\n * @internal\r\n */\r\n public _prepareEffect(keepExistingPipelineContext = false) {\r\n const attributesNames = this._attributesNames;\r\n const defines = this.defines;\r\n\r\n const previousPipelineContext = this._pipelineContext;\r\n\r\n this._isReady = false;\r\n\r\n try {\r\n const engine = this._engine;\r\n\r\n this._pipelineContext = (keepExistingPipelineContext ? previousPipelineContext : undefined) ?? engine.createPipelineContext(this._processingContext);\r\n this._pipelineContext._name = this._key.replace(/\\r/g, \"\").replace(/\\n/g, \"|\");\r\n\r\n const rebuildRebind = (\r\n vertexSourceCode: string,\r\n fragmentSourceCode: string,\r\n onCompiled: (pipelineContext: IPipelineContext) => void,\r\n onError: (message: string) => void\r\n ) => this._rebuildProgram(vertexSourceCode, fragmentSourceCode, onCompiled, onError);\r\n if (this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride) {\r\n engine._preparePipelineContext(\r\n this._pipelineContext,\r\n this._vertexSourceCodeOverride,\r\n this._fragmentSourceCodeOverride,\r\n true,\r\n this._rawVertexSourceCode,\r\n this._rawFragmentSourceCode,\r\n rebuildRebind,\r\n null,\r\n this._transformFeedbackVaryings,\r\n this._key\r\n );\r\n } else {\r\n engine._preparePipelineContext(\r\n this._pipelineContext,\r\n this._vertexSourceCode,\r\n this._fragmentSourceCode,\r\n false,\r\n this._rawVertexSourceCode,\r\n this._rawFragmentSourceCode,\r\n rebuildRebind,\r\n defines,\r\n this._transformFeedbackVaryings,\r\n this._key\r\n );\r\n }\r\n\r\n engine._executeWhenRenderingStateIsCompiled(this._pipelineContext, () => {\r\n this._attributes = [];\r\n this._pipelineContext!._fillEffectInformation(\r\n this,\r\n this._uniformBuffersNames,\r\n this._uniformsNames,\r\n this._uniforms,\r\n this._samplerList,\r\n this._samplers,\r\n attributesNames,\r\n this._attributes\r\n );\r\n\r\n // Caches attribute locations.\r\n if (attributesNames) {\r\n for (let i = 0; i < attributesNames.length; i++) {\r\n const name = attributesNames[i];\r\n this._attributeLocationByName[name] = this._attributes[i];\r\n }\r\n }\r\n\r\n engine.bindSamplers(this);\r\n\r\n this._compilationError = \"\";\r\n this._isReady = true;\r\n if (this.onCompiled) {\r\n this.onCompiled(this);\r\n }\r\n this.onCompileObservable.notifyObservers(this);\r\n this.onCompileObservable.clear();\r\n\r\n // Unbind mesh reference in fallbacks\r\n if (this._fallbacks) {\r\n this._fallbacks.unBindMesh();\r\n }\r\n\r\n if (previousPipelineContext && !keepExistingPipelineContext) {\r\n this.getEngine()._deletePipelineContext(previousPipelineContext);\r\n }\r\n });\r\n\r\n if (this._pipelineContext.isAsync) {\r\n this._checkIsReady(previousPipelineContext);\r\n }\r\n } catch (e) {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n }\r\n }\r\n\r\n private _getShaderCodeAndErrorLine(code: Nullable, error: Nullable, isFragment: boolean): [Nullable, Nullable] {\r\n const regexp = isFragment ? /FRAGMENT SHADER ERROR: 0:(\\d+?):/ : /VERTEX SHADER ERROR: 0:(\\d+?):/;\r\n\r\n let errorLine = null;\r\n\r\n if (error && code) {\r\n const res = error.match(regexp);\r\n if (res && res.length === 2) {\r\n const lineNumber = parseInt(res[1]);\r\n const lines = code.split(\"\\n\", -1);\r\n if (lines.length >= lineNumber) {\r\n errorLine = `Offending line [${lineNumber}] in ${isFragment ? \"fragment\" : \"vertex\"} code: ${lines[lineNumber - 1]}`;\r\n }\r\n }\r\n }\r\n\r\n return [code, errorLine];\r\n }\r\n\r\n private _processCompilationErrors(e: any, previousPipelineContext: Nullable = null) {\r\n this._compilationError = e.message;\r\n const attributesNames = this._attributesNames;\r\n const fallbacks = this._fallbacks;\r\n\r\n // Let's go through fallbacks then\r\n Logger.Error(\"Unable to compile effect:\");\r\n Logger.Error(\r\n \"Uniforms: \" +\r\n this._uniformsNames.map(function (uniform) {\r\n return \" \" + uniform;\r\n })\r\n );\r\n Logger.Error(\r\n \"Attributes: \" +\r\n attributesNames.map(function (attribute) {\r\n return \" \" + attribute;\r\n })\r\n );\r\n Logger.Error(\"Defines:\\n\" + this.defines);\r\n if (Effect.LogShaderCodeOnCompilationError) {\r\n let lineErrorVertex = null,\r\n lineErrorFragment = null,\r\n code = null;\r\n if (this._pipelineContext?._getVertexShaderCode()) {\r\n [code, lineErrorVertex] = this._getShaderCodeAndErrorLine(this._pipelineContext._getVertexShaderCode(), this._compilationError, false);\r\n if (code) {\r\n Logger.Error(\"Vertex code:\");\r\n Logger.Error(code);\r\n }\r\n }\r\n if (this._pipelineContext?._getFragmentShaderCode()) {\r\n [code, lineErrorFragment] = this._getShaderCodeAndErrorLine(this._pipelineContext?._getFragmentShaderCode(), this._compilationError, true);\r\n if (code) {\r\n Logger.Error(\"Fragment code:\");\r\n Logger.Error(code);\r\n }\r\n }\r\n if (lineErrorVertex) {\r\n Logger.Error(lineErrorVertex);\r\n }\r\n if (lineErrorFragment) {\r\n Logger.Error(lineErrorFragment);\r\n }\r\n }\r\n Logger.Error(\"Error: \" + this._compilationError);\r\n\r\n const notifyErrors = () => {\r\n if (this.onError) {\r\n this.onError(this, this._compilationError);\r\n }\r\n this.onErrorObservable.notifyObservers(this);\r\n };\r\n\r\n // In case a previous compilation was successful, we need to restore the previous pipeline context\r\n if (previousPipelineContext) {\r\n this._pipelineContext = previousPipelineContext;\r\n this._isReady = true;\r\n notifyErrors();\r\n }\r\n\r\n // Lets try to compile fallbacks as long as we have some.\r\n if (fallbacks) {\r\n this._pipelineContext = null;\r\n if (fallbacks.hasMoreFallbacks) {\r\n this._allFallbacksProcessed = false;\r\n Logger.Error(\"Trying next fallback.\");\r\n this.defines = fallbacks.reduce(this.defines, this);\r\n this._prepareEffect();\r\n } else {\r\n // Sorry we did everything we can\r\n this._allFallbacksProcessed = true;\r\n notifyErrors();\r\n this.onErrorObservable.clear();\r\n\r\n // Unbind mesh reference in fallbacks\r\n if (this._fallbacks) {\r\n this._fallbacks.unBindMesh();\r\n }\r\n }\r\n } else {\r\n this._allFallbacksProcessed = true;\r\n\r\n // In case of error, without any prior successful compilation, let s notify observers\r\n if (!previousPipelineContext) {\r\n notifyErrors();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the effect is supported. (Must be called after compilation)\r\n */\r\n public get isSupported(): boolean {\r\n return this._compilationError === \"\";\r\n }\r\n\r\n /**\r\n * Binds a texture to the engine to be used as output of the shader.\r\n * @param channel Name of the output variable.\r\n * @param texture Texture to bind.\r\n * @internal\r\n */\r\n public _bindTexture(channel: string, texture: Nullable): void {\r\n this._engine._bindTexture(this._samplers[channel], texture, channel);\r\n }\r\n\r\n /**\r\n * Sets a texture on the engine to be used in the shader.\r\n * @param channel Name of the sampler variable.\r\n * @param texture Texture to set.\r\n */\r\n public setTexture(channel: string, texture: Nullable): void {\r\n this._engine.setTexture(this._samplers[channel], this._uniforms[channel], texture, channel);\r\n }\r\n\r\n /**\r\n * Sets a depth stencil texture from a render target on the engine to be used in the shader.\r\n * @param channel Name of the sampler variable.\r\n * @param texture Texture to set.\r\n */\r\n public setDepthStencilTexture(channel: string, texture: Nullable): void {\r\n this._engine.setDepthStencilTexture(this._samplers[channel], this._uniforms[channel], texture, channel);\r\n }\r\n\r\n /**\r\n * Sets an array of textures on the engine to be used in the shader.\r\n * @param channel Name of the variable.\r\n * @param textures Textures to set.\r\n */\r\n public setTextureArray(channel: string, textures: ThinTexture[]): void {\r\n const exName = channel + \"Ex\";\r\n if (this._samplerList.indexOf(exName + \"0\") === -1) {\r\n const initialPos = this._samplerList.indexOf(channel);\r\n for (let index = 1; index < textures.length; index++) {\r\n const currentExName = exName + (index - 1).toString();\r\n this._samplerList.splice(initialPos + index, 0, currentExName);\r\n }\r\n\r\n // Reset every channels\r\n let channelIndex = 0;\r\n for (const key of this._samplerList) {\r\n this._samplers[key] = channelIndex;\r\n channelIndex += 1;\r\n }\r\n }\r\n\r\n this._engine.setTextureArray(this._samplers[channel], this._uniforms[channel], textures, channel);\r\n }\r\n\r\n /**\r\n * Sets a texture to be the input of the specified post process. (To use the output, pass in the next post process in the pipeline)\r\n * @param channel Name of the sampler variable.\r\n * @param postProcess Post process to get the input texture from.\r\n */\r\n public setTextureFromPostProcess(channel: string, postProcess: Nullable): void {\r\n this._engine.setTextureFromPostProcess(this._samplers[channel], postProcess, channel);\r\n }\r\n\r\n /**\r\n * (Warning! setTextureFromPostProcessOutput may be desired instead)\r\n * Sets the input texture of the passed in post process to be input of this effect. (To use the output of the passed in post process use setTextureFromPostProcessOutput)\r\n * @param channel Name of the sampler variable.\r\n * @param postProcess Post process to get the output texture from.\r\n */\r\n public setTextureFromPostProcessOutput(channel: string, postProcess: Nullable): void {\r\n this._engine.setTextureFromPostProcessOutput(this._samplers[channel], postProcess, channel);\r\n }\r\n\r\n /**\r\n * Binds a buffer to a uniform.\r\n * @param buffer Buffer to bind.\r\n * @param name Name of the uniform variable to bind to.\r\n */\r\n public bindUniformBuffer(buffer: DataBuffer, name: string): void {\r\n const bufferName = this._uniformBuffersNames[name];\r\n if (bufferName === undefined || (Effect._BaseCache[bufferName] === buffer && this._engine._features.useUBOBindingCache)) {\r\n return;\r\n }\r\n Effect._BaseCache[bufferName] = buffer;\r\n this._engine.bindUniformBufferBase(buffer, bufferName, name);\r\n }\r\n\r\n /**\r\n * Binds block to a uniform.\r\n * @param blockName Name of the block to bind.\r\n * @param index Index to bind.\r\n */\r\n public bindUniformBlock(blockName: string, index: number): void {\r\n this._engine.bindUniformBlock(this._pipelineContext!, blockName, index);\r\n }\r\n\r\n /**\r\n * Sets an integer value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value Value to be set.\r\n * @returns this effect.\r\n */\r\n public setInt(uniformName: string, value: number): Effect {\r\n this._pipelineContext!.setInt(uniformName, value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int2 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int2.\r\n * @param y Second int in int2.\r\n * @returns this effect.\r\n */\r\n public setInt2(uniformName: string, x: number, y: number): Effect {\r\n this._pipelineContext!.setInt2(uniformName, x, y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int3 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int3.\r\n * @param y Second int in int3.\r\n * @param z Third int in int3.\r\n * @returns this effect.\r\n */\r\n public setInt3(uniformName: string, x: number, y: number, z: number): Effect {\r\n this._pipelineContext!.setInt3(uniformName, x, y, z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int4 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int4.\r\n * @param y Second int in int4.\r\n * @param z Third int in int4.\r\n * @param w Fourth int in int4.\r\n * @returns this effect.\r\n */\r\n public setInt4(uniformName: string, x: number, y: number, z: number, w: number): Effect {\r\n this._pipelineContext!.setInt4(uniformName, x, y, z, w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray2(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray3(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setIntArray4(uniformName: string, array: Int32Array): Effect {\r\n this._pipelineContext!.setIntArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned integer value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value Value to be set.\r\n * @returns this effect.\r\n */\r\n public setUInt(uniformName: string, value: number): Effect {\r\n this._pipelineContext!.setUInt(uniformName, value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int2 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint2.\r\n * @param y Second unsigned int in uint2.\r\n * @returns this effect.\r\n */\r\n public setUInt2(uniformName: string, x: number, y: number): Effect {\r\n this._pipelineContext!.setUInt2(uniformName, x, y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int3 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint3.\r\n * @param y Second unsigned int in uint3.\r\n * @param z Third unsigned int in uint3.\r\n * @returns this effect.\r\n */\r\n public setUInt3(uniformName: string, x: number, y: number, z: number): Effect {\r\n this._pipelineContext!.setUInt3(uniformName, x, y, z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int4 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint4.\r\n * @param y Second unsigned int in uint4.\r\n * @param z Third unsigned int in uint4.\r\n * @param w Fourth unsigned int in uint4.\r\n * @returns this effect.\r\n */\r\n public setUInt4(uniformName: string, x: number, y: number, z: number, w: number): Effect {\r\n this._pipelineContext!.setUInt4(uniformName, x, y, z, w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray2(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray3(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setUIntArray4(uniformName: string, array: Uint32Array): Effect {\r\n this._pipelineContext!.setUIntArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray2(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray3(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an float array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setFloatArray4(uniformName: string, array: FloatArray): Effect {\r\n this._pipelineContext!.setArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray2(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray2(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray3(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray3(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n * @returns this effect.\r\n */\r\n public setArray4(uniformName: string, array: number[]): Effect {\r\n this._pipelineContext!.setArray4(uniformName, array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets matrices on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param matrices matrices to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrices(uniformName: string, matrices: Float32Array | Array): Effect {\r\n this._pipelineContext!.setMatrices(uniformName, matrices as Float32Array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets matrix on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrix(uniformName: string, matrix: IMatrixLike): Effect {\r\n this._pipelineContext!.setMatrix(uniformName, matrix);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix)\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrix3x3(uniformName: string, matrix: Float32Array | Array): Effect {\r\n // the cast is ok because it is gl.uniformMatrix3fv() which is called at the end, and this function accepts Float32Array and Array\r\n this._pipelineContext!.setMatrix3x3(uniformName, matrix as Float32Array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix)\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n * @returns this effect.\r\n */\r\n public setMatrix2x2(uniformName: string, matrix: Float32Array | Array): Effect {\r\n // the cast is ok because it is gl.uniformMatrix3fv() which is called at the end, and this function accepts Float32Array and Array\r\n this._pipelineContext!.setMatrix2x2(uniformName, matrix as Float32Array);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value value to be set.\r\n * @returns this effect.\r\n */\r\n public setFloat(uniformName: string, value: number): Effect {\r\n this._pipelineContext!.setFloat(uniformName, value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a boolean on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param bool value to be set.\r\n * @returns this effect.\r\n */\r\n public setBool(uniformName: string, bool: boolean): Effect {\r\n this._pipelineContext!.setInt(uniformName, bool ? 1 : 0);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Vector2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector2 vector2 to be set.\r\n * @returns this effect.\r\n */\r\n public setVector2(uniformName: string, vector2: IVector2Like): Effect {\r\n this._pipelineContext!.setVector2(uniformName, vector2);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float2.\r\n * @param y Second float in float2.\r\n * @returns this effect.\r\n */\r\n public setFloat2(uniformName: string, x: number, y: number): Effect {\r\n this._pipelineContext!.setFloat2(uniformName, x, y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Vector3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector3 Value to be set.\r\n * @returns this effect.\r\n */\r\n public setVector3(uniformName: string, vector3: IVector3Like): Effect {\r\n this._pipelineContext!.setVector3(uniformName, vector3);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float3.\r\n * @param y Second float in float3.\r\n * @param z Third float in float3.\r\n * @returns this effect.\r\n */\r\n public setFloat3(uniformName: string, x: number, y: number, z: number): Effect {\r\n this._pipelineContext!.setFloat3(uniformName, x, y, z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Vector4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector4 Value to be set.\r\n * @returns this effect.\r\n */\r\n public setVector4(uniformName: string, vector4: IVector4Like): Effect {\r\n this._pipelineContext!.setVector4(uniformName, vector4);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Quaternion on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param quaternion Value to be set.\r\n * @returns this effect.\r\n */\r\n public setQuaternion(uniformName: string, quaternion: IQuaternionLike): Effect {\r\n this._pipelineContext!.setQuaternion(uniformName, quaternion);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a float4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float4.\r\n * @param y Second float in float4.\r\n * @param z Third float in float4.\r\n * @param w Fourth float in float4.\r\n * @returns this effect.\r\n */\r\n public setFloat4(uniformName: string, x: number, y: number, z: number, w: number): Effect {\r\n this._pipelineContext!.setFloat4(uniformName, x, y, z, w);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Color3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param color3 Value to be set.\r\n * @returns this effect.\r\n */\r\n public setColor3(uniformName: string, color3: IColor3Like): Effect {\r\n this._pipelineContext!.setColor3(uniformName, color3);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Color4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param color3 Value to be set.\r\n * @param alpha Alpha value to be set.\r\n * @returns this effect.\r\n */\r\n public setColor4(uniformName: string, color3: IColor3Like, alpha: number): Effect {\r\n this._pipelineContext!.setColor4(uniformName, color3, alpha);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a Color4 on a uniform variable\r\n * @param uniformName defines the name of the variable\r\n * @param color4 defines the value to be set\r\n * @returns this effect.\r\n */\r\n public setDirectColor4(uniformName: string, color4: IColor4Like): Effect {\r\n this._pipelineContext!.setDirectColor4(uniformName, color4);\r\n return this;\r\n }\r\n\r\n /**\r\n * Release all associated resources.\r\n **/\r\n public dispose() {\r\n if (this._pipelineContext) {\r\n this._pipelineContext.dispose();\r\n }\r\n this._engine._releaseEffect(this);\r\n\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * This function will add a new shader to the shader store\r\n * @param name the name of the shader\r\n * @param pixelShader optional pixel shader content\r\n * @param vertexShader optional vertex shader content\r\n * @param shaderLanguage the language the shader is written in (default: GLSL)\r\n */\r\n public static RegisterShader(name: string, pixelShader?: string, vertexShader?: string, shaderLanguage = ShaderLanguage.GLSL) {\r\n if (pixelShader) {\r\n EngineShaderStore.GetShadersStore(shaderLanguage)[`${name}PixelShader`] = pixelShader;\r\n }\r\n\r\n if (vertexShader) {\r\n EngineShaderStore.GetShadersStore(shaderLanguage)[`${name}VertexShader`] = vertexShader;\r\n }\r\n }\r\n\r\n /**\r\n * Store of each shader (The can be looked up using effect.key)\r\n */\r\n public static ShadersStore: { [key: string]: string } = EngineShaderStore.ShadersStore;\r\n /**\r\n * Store of each included file for a shader (The can be looked up using effect.key)\r\n */\r\n public static IncludesShadersStore: { [key: string]: string } = EngineShaderStore.IncludesShadersStore;\r\n\r\n /**\r\n * Resets the cache of effects.\r\n */\r\n public static ResetCache() {\r\n Effect._BaseCache = {};\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class DepthCullingState {\r\n protected _isDepthTestDirty = false;\r\n protected _isDepthMaskDirty = false;\r\n protected _isDepthFuncDirty = false;\r\n protected _isCullFaceDirty = false;\r\n protected _isCullDirty = false;\r\n protected _isZOffsetDirty = false;\r\n protected _isFrontFaceDirty = false;\r\n\r\n protected _depthTest: boolean;\r\n protected _depthMask: boolean;\r\n protected _depthFunc: Nullable;\r\n protected _cull: Nullable;\r\n protected _cullFace: Nullable;\r\n protected _zOffset: number;\r\n protected _zOffsetUnits: number;\r\n protected _frontFace: Nullable;\r\n\r\n /**\r\n * Initializes the state.\r\n * @param reset\r\n */\r\n public constructor(reset = true) {\r\n if (reset) {\r\n this.reset();\r\n }\r\n }\r\n\r\n public get isDirty(): boolean {\r\n return (\r\n this._isDepthFuncDirty ||\r\n this._isDepthTestDirty ||\r\n this._isDepthMaskDirty ||\r\n this._isCullFaceDirty ||\r\n this._isCullDirty ||\r\n this._isZOffsetDirty ||\r\n this._isFrontFaceDirty\r\n );\r\n }\r\n\r\n public get zOffset(): number {\r\n return this._zOffset;\r\n }\r\n\r\n public set zOffset(value: number) {\r\n if (this._zOffset === value) {\r\n return;\r\n }\r\n\r\n this._zOffset = value;\r\n this._isZOffsetDirty = true;\r\n }\r\n\r\n public get zOffsetUnits(): number {\r\n return this._zOffsetUnits;\r\n }\r\n\r\n public set zOffsetUnits(value: number) {\r\n if (this._zOffsetUnits === value) {\r\n return;\r\n }\r\n\r\n this._zOffsetUnits = value;\r\n this._isZOffsetDirty = true;\r\n }\r\n\r\n public get cullFace(): Nullable {\r\n return this._cullFace;\r\n }\r\n\r\n public set cullFace(value: Nullable) {\r\n if (this._cullFace === value) {\r\n return;\r\n }\r\n\r\n this._cullFace = value;\r\n this._isCullFaceDirty = true;\r\n }\r\n\r\n public get cull(): Nullable {\r\n return this._cull;\r\n }\r\n\r\n public set cull(value: Nullable) {\r\n if (this._cull === value) {\r\n return;\r\n }\r\n\r\n this._cull = value;\r\n this._isCullDirty = true;\r\n }\r\n\r\n public get depthFunc(): Nullable {\r\n return this._depthFunc;\r\n }\r\n\r\n public set depthFunc(value: Nullable) {\r\n if (this._depthFunc === value) {\r\n return;\r\n }\r\n\r\n this._depthFunc = value;\r\n this._isDepthFuncDirty = true;\r\n }\r\n\r\n public get depthMask(): boolean {\r\n return this._depthMask;\r\n }\r\n\r\n public set depthMask(value: boolean) {\r\n if (this._depthMask === value) {\r\n return;\r\n }\r\n\r\n this._depthMask = value;\r\n this._isDepthMaskDirty = true;\r\n }\r\n\r\n public get depthTest(): boolean {\r\n return this._depthTest;\r\n }\r\n\r\n public set depthTest(value: boolean) {\r\n if (this._depthTest === value) {\r\n return;\r\n }\r\n\r\n this._depthTest = value;\r\n this._isDepthTestDirty = true;\r\n }\r\n\r\n public get frontFace(): Nullable {\r\n return this._frontFace;\r\n }\r\n\r\n public set frontFace(value: Nullable) {\r\n if (this._frontFace === value) {\r\n return;\r\n }\r\n\r\n this._frontFace = value;\r\n this._isFrontFaceDirty = true;\r\n }\r\n\r\n public reset() {\r\n this._depthMask = true;\r\n this._depthTest = true;\r\n this._depthFunc = null;\r\n this._cullFace = null;\r\n this._cull = null;\r\n this._zOffset = 0;\r\n this._zOffsetUnits = 0;\r\n this._frontFace = null;\r\n\r\n this._isDepthTestDirty = true;\r\n this._isDepthMaskDirty = true;\r\n this._isDepthFuncDirty = false;\r\n this._isCullFaceDirty = false;\r\n this._isCullDirty = false;\r\n this._isZOffsetDirty = true;\r\n this._isFrontFaceDirty = false;\r\n }\r\n\r\n public apply(gl: WebGLRenderingContext) {\r\n if (!this.isDirty) {\r\n return;\r\n }\r\n\r\n // Cull\r\n if (this._isCullDirty) {\r\n if (this.cull) {\r\n gl.enable(gl.CULL_FACE);\r\n } else {\r\n gl.disable(gl.CULL_FACE);\r\n }\r\n\r\n this._isCullDirty = false;\r\n }\r\n\r\n // Cull face\r\n if (this._isCullFaceDirty) {\r\n gl.cullFace(this.cullFace);\r\n this._isCullFaceDirty = false;\r\n }\r\n\r\n // Depth mask\r\n if (this._isDepthMaskDirty) {\r\n gl.depthMask(this.depthMask);\r\n this._isDepthMaskDirty = false;\r\n }\r\n\r\n // Depth test\r\n if (this._isDepthTestDirty) {\r\n if (this.depthTest) {\r\n gl.enable(gl.DEPTH_TEST);\r\n } else {\r\n gl.disable(gl.DEPTH_TEST);\r\n }\r\n this._isDepthTestDirty = false;\r\n }\r\n\r\n // Depth func\r\n if (this._isDepthFuncDirty) {\r\n gl.depthFunc(this.depthFunc);\r\n this._isDepthFuncDirty = false;\r\n }\r\n\r\n // zOffset\r\n if (this._isZOffsetDirty) {\r\n if (this.zOffset || this.zOffsetUnits) {\r\n gl.enable(gl.POLYGON_OFFSET_FILL);\r\n gl.polygonOffset(this.zOffset, this.zOffsetUnits);\r\n } else {\r\n gl.disable(gl.POLYGON_OFFSET_FILL);\r\n }\r\n\r\n this._isZOffsetDirty = false;\r\n }\r\n\r\n // Front face\r\n if (this._isFrontFaceDirty) {\r\n gl.frontFace(this.frontFace);\r\n this._isFrontFaceDirty = false;\r\n }\r\n }\r\n}\r\n", "import { Constants } from \"../Engines/constants\";\r\nimport type { IStencilState } from \"./IStencilState\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class StencilState implements IStencilState {\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will always pass. i.e. Pixels will be drawn in the order they are drawn */\r\n public static readonly ALWAYS = Constants.ALWAYS;\r\n /** Passed to stencilOperation to specify that stencil value must be kept */\r\n public static readonly KEEP = Constants.KEEP;\r\n /** Passed to stencilOperation to specify that stencil value must be replaced */\r\n public static readonly REPLACE = Constants.REPLACE;\r\n\r\n public constructor() {\r\n this.reset();\r\n }\r\n\r\n public reset() {\r\n this.enabled = false;\r\n this.mask = 0xff;\r\n\r\n this.func = StencilState.ALWAYS;\r\n this.funcRef = 1;\r\n this.funcMask = 0xff;\r\n\r\n this.opStencilFail = StencilState.KEEP;\r\n this.opDepthFail = StencilState.KEEP;\r\n this.opStencilDepthPass = StencilState.REPLACE;\r\n }\r\n\r\n public func: number;\r\n public get stencilFunc(): number {\r\n return this.func;\r\n }\r\n\r\n public set stencilFunc(value: number) {\r\n this.func = value;\r\n }\r\n\r\n public funcRef: number;\r\n public get stencilFuncRef(): number {\r\n return this.funcRef;\r\n }\r\n\r\n public set stencilFuncRef(value: number) {\r\n this.funcRef = value;\r\n }\r\n\r\n public funcMask: number;\r\n public get stencilFuncMask(): number {\r\n return this.funcMask;\r\n }\r\n\r\n public set stencilFuncMask(value: number) {\r\n this.funcMask = value;\r\n }\r\n\r\n public opStencilFail: number;\r\n public get stencilOpStencilFail(): number {\r\n return this.opStencilFail;\r\n }\r\n\r\n public set stencilOpStencilFail(value: number) {\r\n this.opStencilFail = value;\r\n }\r\n\r\n public opDepthFail: number;\r\n public get stencilOpDepthFail(): number {\r\n return this.opDepthFail;\r\n }\r\n\r\n public set stencilOpDepthFail(value: number) {\r\n this.opDepthFail = value;\r\n }\r\n\r\n public opStencilDepthPass: number;\r\n public get stencilOpStencilDepthPass(): number {\r\n return this.opStencilDepthPass;\r\n }\r\n\r\n public set stencilOpStencilDepthPass(value: number) {\r\n this.opStencilDepthPass = value;\r\n }\r\n\r\n public mask: number;\r\n public get stencilMask(): number {\r\n return this.mask;\r\n }\r\n\r\n public set stencilMask(value: number) {\r\n this.mask = value;\r\n }\r\n\r\n public enabled: boolean;\r\n public get stencilTest(): boolean {\r\n return this.enabled;\r\n }\r\n\r\n public set stencilTest(value: boolean) {\r\n this.enabled = value;\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class AlphaState {\r\n public _blendFunctionParameters = new Array>(4);\r\n public _blendEquationParameters = new Array>(2);\r\n public _blendConstants = new Array>(4);\r\n public _isBlendConstantsDirty = false;\r\n\r\n private _alphaBlend = false;\r\n private _isAlphaBlendDirty = false;\r\n private _isBlendFunctionParametersDirty = false;\r\n private _isBlendEquationParametersDirty = false;\r\n\r\n /**\r\n * Initializes the state.\r\n */\r\n public constructor() {\r\n this.reset();\r\n }\r\n\r\n public get isDirty(): boolean {\r\n return this._isAlphaBlendDirty || this._isBlendFunctionParametersDirty || this._isBlendEquationParametersDirty;\r\n }\r\n\r\n public get alphaBlend(): boolean {\r\n return this._alphaBlend;\r\n }\r\n\r\n public set alphaBlend(value: boolean) {\r\n if (this._alphaBlend === value) {\r\n return;\r\n }\r\n\r\n this._alphaBlend = value;\r\n this._isAlphaBlendDirty = true;\r\n }\r\n\r\n public setAlphaBlendConstants(r: number, g: number, b: number, a: number): void {\r\n if (this._blendConstants[0] === r && this._blendConstants[1] === g && this._blendConstants[2] === b && this._blendConstants[3] === a) {\r\n return;\r\n }\r\n\r\n this._blendConstants[0] = r;\r\n this._blendConstants[1] = g;\r\n this._blendConstants[2] = b;\r\n this._blendConstants[3] = a;\r\n\r\n this._isBlendConstantsDirty = true;\r\n }\r\n\r\n public setAlphaBlendFunctionParameters(value0: number, value1: number, value2: number, value3: number): void {\r\n if (\r\n this._blendFunctionParameters[0] === value0 &&\r\n this._blendFunctionParameters[1] === value1 &&\r\n this._blendFunctionParameters[2] === value2 &&\r\n this._blendFunctionParameters[3] === value3\r\n ) {\r\n return;\r\n }\r\n\r\n this._blendFunctionParameters[0] = value0;\r\n this._blendFunctionParameters[1] = value1;\r\n this._blendFunctionParameters[2] = value2;\r\n this._blendFunctionParameters[3] = value3;\r\n\r\n this._isBlendFunctionParametersDirty = true;\r\n }\r\n\r\n public setAlphaEquationParameters(rgb: number, alpha: number): void {\r\n if (this._blendEquationParameters[0] === rgb && this._blendEquationParameters[1] === alpha) {\r\n return;\r\n }\r\n\r\n this._blendEquationParameters[0] = rgb;\r\n this._blendEquationParameters[1] = alpha;\r\n\r\n this._isBlendEquationParametersDirty = true;\r\n }\r\n\r\n public reset() {\r\n this._alphaBlend = false;\r\n this._blendFunctionParameters[0] = null;\r\n this._blendFunctionParameters[1] = null;\r\n this._blendFunctionParameters[2] = null;\r\n this._blendFunctionParameters[3] = null;\r\n\r\n this._blendEquationParameters[0] = null;\r\n this._blendEquationParameters[1] = null;\r\n\r\n this._blendConstants[0] = null;\r\n this._blendConstants[1] = null;\r\n this._blendConstants[2] = null;\r\n this._blendConstants[3] = null;\r\n\r\n this._isAlphaBlendDirty = true;\r\n this._isBlendFunctionParametersDirty = false;\r\n this._isBlendEquationParametersDirty = false;\r\n this._isBlendConstantsDirty = false;\r\n }\r\n\r\n public apply(gl: WebGLRenderingContext) {\r\n if (!this.isDirty) {\r\n return;\r\n }\r\n\r\n // Alpha blend\r\n if (this._isAlphaBlendDirty) {\r\n if (this._alphaBlend) {\r\n gl.enable(gl.BLEND);\r\n } else {\r\n gl.disable(gl.BLEND);\r\n }\r\n\r\n this._isAlphaBlendDirty = false;\r\n }\r\n\r\n // Alpha function\r\n if (this._isBlendFunctionParametersDirty) {\r\n gl.blendFuncSeparate(\r\n this._blendFunctionParameters[0],\r\n this._blendFunctionParameters[1],\r\n this._blendFunctionParameters[2],\r\n this._blendFunctionParameters[3]\r\n );\r\n this._isBlendFunctionParametersDirty = false;\r\n }\r\n\r\n // Alpha equation\r\n if (this._isBlendEquationParametersDirty) {\r\n gl.blendEquationSeparate(this._blendEquationParameters[0]!, this._blendEquationParameters[1]!);\r\n this._isBlendEquationParametersDirty = false;\r\n }\r\n\r\n // Constants\r\n if (this._isBlendConstantsDirty) {\r\n gl.blendColor(this._blendConstants[0], this._blendConstants[1], this._blendConstants[2], this._blendConstants[3]);\r\n this._isBlendConstantsDirty = false;\r\n }\r\n }\r\n}\r\n", "import { Constants } from \"../../Engines/constants\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n/**\r\n * Class used to store a texture sampler data\r\n */\r\nexport class TextureSampler {\r\n /**\r\n * Gets the sampling mode of the texture\r\n */\r\n public samplingMode: number = -1;\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n public get wrapU() {\r\n return this._cachedWrapU;\r\n }\r\n\r\n public set wrapU(value: Nullable) {\r\n this._cachedWrapU = value;\r\n }\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n public get wrapV() {\r\n return this._cachedWrapV;\r\n }\r\n\r\n public set wrapV(value: Nullable) {\r\n this._cachedWrapV = value;\r\n }\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n public get wrapR() {\r\n return this._cachedWrapR;\r\n }\r\n\r\n public set wrapR(value: Nullable) {\r\n this._cachedWrapR = value;\r\n }\r\n\r\n /**\r\n * With compliant hardware and browser (supporting anisotropic filtering)\r\n * this defines the level of anisotropic filtering in the texture.\r\n * The higher the better but the slower.\r\n */\r\n public get anisotropicFilteringLevel() {\r\n return this._cachedAnisotropicFilteringLevel;\r\n }\r\n\r\n public set anisotropicFilteringLevel(value: Nullable) {\r\n this._cachedAnisotropicFilteringLevel = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the comparison function (Constants.LESS, Constants.EQUAL, etc). Set 0 to not use a comparison function\r\n */\r\n public get comparisonFunction() {\r\n return this._comparisonFunction;\r\n }\r\n\r\n public set comparisonFunction(value: number) {\r\n this._comparisonFunction = value;\r\n }\r\n\r\n private _useMipMaps = true;\r\n /**\r\n * Indicates to use the mip maps (if available on the texture).\r\n * Thanks to this flag, you can instruct the sampler to not sample the mipmaps even if they exist (and if the sampling mode is set to a value that normally samples the mipmaps!)\r\n */\r\n public get useMipMaps() {\r\n return this._useMipMaps;\r\n }\r\n\r\n public set useMipMaps(value: boolean) {\r\n this._useMipMaps = value;\r\n }\r\n\r\n /** @internal */\r\n public _cachedWrapU: Nullable = null;\r\n\r\n /** @internal */\r\n public _cachedWrapV: Nullable = null;\r\n\r\n /** @internal */\r\n public _cachedWrapR: Nullable = null;\r\n\r\n /** @internal */\r\n public _cachedAnisotropicFilteringLevel: Nullable = null;\r\n\r\n /** @internal */\r\n public _comparisonFunction: number = 0;\r\n\r\n /**\r\n * Used for debugging purpose only\r\n */\r\n public label?: string;\r\n\r\n /**\r\n * Creates a Sampler instance\r\n */\r\n constructor() {}\r\n\r\n /**\r\n * Sets all the parameters of the sampler\r\n * @param wrapU u address mode (default: TEXTURE_WRAP_ADDRESSMODE)\r\n * @param wrapV v address mode (default: TEXTURE_WRAP_ADDRESSMODE)\r\n * @param wrapR r address mode (default: TEXTURE_WRAP_ADDRESSMODE)\r\n * @param anisotropicFilteringLevel anisotropic level (default: 1)\r\n * @param samplingMode sampling mode (default: Constants.TEXTURE_BILINEAR_SAMPLINGMODE)\r\n * @param comparisonFunction comparison function (default: 0 - no comparison function)\r\n * @returns the current sampler instance\r\n */\r\n public setParameters(\r\n wrapU = Constants.TEXTURE_WRAP_ADDRESSMODE,\r\n wrapV = Constants.TEXTURE_WRAP_ADDRESSMODE,\r\n wrapR = Constants.TEXTURE_WRAP_ADDRESSMODE,\r\n anisotropicFilteringLevel = 1,\r\n samplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n comparisonFunction = 0\r\n ): TextureSampler {\r\n this._cachedWrapU = wrapU;\r\n this._cachedWrapV = wrapV;\r\n this._cachedWrapR = wrapR;\r\n this._cachedAnisotropicFilteringLevel = anisotropicFilteringLevel;\r\n this.samplingMode = samplingMode;\r\n this._comparisonFunction = comparisonFunction;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Compares this sampler with another one\r\n * @param other sampler to compare with\r\n * @returns true if the samplers have the same parametres, else false\r\n */\r\n public compareSampler(other: TextureSampler): boolean {\r\n return (\r\n this._cachedWrapU === other._cachedWrapU &&\r\n this._cachedWrapV === other._cachedWrapV &&\r\n this._cachedWrapR === other._cachedWrapR &&\r\n this._cachedAnisotropicFilteringLevel === other._cachedAnisotropicFilteringLevel &&\r\n this.samplingMode === other.samplingMode &&\r\n this._comparisonFunction === other._comparisonFunction &&\r\n this._useMipMaps === other._useMipMaps\r\n );\r\n }\r\n}\r\n", "import { Observable } from \"../../Misc/observable\";\r\nimport type { ImageSource, Nullable, int } from \"../../types\";\r\nimport type { ICanvas, ICanvasRenderingContext } from \"../../Engines/ICanvas\";\r\nimport type { HardwareTextureWrapper } from \"./hardwareTextureWrapper\";\r\nimport { TextureSampler } from \"./textureSampler\";\r\n\r\nimport type { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport type { SphericalPolynomial } from \"../../Maths/sphericalPolynomial\";\r\n\r\n/**\r\n * Defines the source of the internal texture\r\n */\r\nexport enum InternalTextureSource {\r\n /**\r\n * The source of the texture data is unknown\r\n */\r\n Unknown,\r\n /**\r\n * Texture data comes from an URL\r\n */\r\n Url,\r\n /**\r\n * Texture data is only used for temporary storage\r\n */\r\n Temp,\r\n /**\r\n * Texture data comes from raw data (ArrayBuffer)\r\n */\r\n Raw,\r\n /**\r\n * Texture content is dynamic (video or dynamic texture)\r\n */\r\n Dynamic,\r\n /**\r\n * Texture content is generated by rendering to it\r\n */\r\n RenderTarget,\r\n /**\r\n * Texture content is part of a multi render target process\r\n */\r\n MultiRenderTarget,\r\n /**\r\n * Texture data comes from a cube data file\r\n */\r\n Cube,\r\n /**\r\n * Texture data comes from a raw cube data\r\n */\r\n CubeRaw,\r\n /**\r\n * Texture data come from a prefiltered cube data file\r\n */\r\n CubePrefiltered,\r\n /**\r\n * Texture content is raw 3D data\r\n */\r\n Raw3D,\r\n /**\r\n * Texture content is raw 2D array data\r\n */\r\n Raw2DArray,\r\n /**\r\n * Texture content is a depth/stencil texture\r\n */\r\n DepthStencil,\r\n /**\r\n * Texture data comes from a raw cube data encoded with RGBD\r\n */\r\n CubeRawRGBD,\r\n /**\r\n * Texture content is a depth texture\r\n */\r\n Depth,\r\n}\r\n\r\n/**\r\n * Class used to store data associated with WebGL texture data for the engine\r\n * This class should not be used directly\r\n */\r\nexport class InternalTexture extends TextureSampler {\r\n /**\r\n * Defines if the texture is ready\r\n */\r\n public isReady: boolean = false;\r\n /**\r\n * Defines if the texture is a cube texture\r\n */\r\n public isCube: boolean = false;\r\n /**\r\n * Defines if the texture contains 3D data\r\n */\r\n public is3D: boolean = false;\r\n /**\r\n * Defines if the texture contains 2D array data\r\n */\r\n public is2DArray: boolean = false;\r\n /**\r\n * Defines if the texture contains multiview data\r\n */\r\n public isMultiview: boolean = false;\r\n /**\r\n * Gets the URL used to load this texture\r\n */\r\n public url: string = \"\";\r\n /** @internal */\r\n public _originalUrl: string; // not empty only if different from url\r\n /**\r\n * Gets a boolean indicating if the texture needs mipmaps generation\r\n */\r\n public generateMipMaps: boolean = false;\r\n /**\r\n * Gets a boolean indicating if the texture uses mipmaps\r\n * TODO implements useMipMaps as a separate setting from generateMipMaps\r\n */\r\n public get useMipMaps() {\r\n return this.generateMipMaps;\r\n }\r\n public set useMipMaps(value: boolean) {\r\n this.generateMipMaps = value;\r\n }\r\n /**\r\n * Gets the number of samples used by the texture (WebGL2+ only)\r\n */\r\n public samples: number = 0;\r\n /**\r\n * Gets the type of the texture (int, float...)\r\n */\r\n public type: number = -1;\r\n /**\r\n * Gets the format of the texture (RGB, RGBA...)\r\n */\r\n public format: number = -1;\r\n /**\r\n * Observable called when the texture is loaded\r\n */\r\n public onLoadedObservable = new Observable();\r\n /**\r\n * Observable called when the texture load is raising an error\r\n */\r\n public onErrorObservable = new Observable>();\r\n /**\r\n * If this callback is defined it will be called instead of the default _rebuild function\r\n */\r\n public onRebuildCallback: Nullable<\r\n (internalTexture: InternalTexture) => {\r\n proxy: Nullable>;\r\n isReady: boolean;\r\n isAsync: boolean;\r\n }\r\n > = null;\r\n /**\r\n * Gets the width of the texture\r\n */\r\n public width: number = 0;\r\n /**\r\n * Gets the height of the texture\r\n */\r\n public height: number = 0;\r\n /**\r\n * Gets the depth of the texture\r\n */\r\n public depth: number = 0;\r\n /**\r\n * Gets the initial width of the texture (It could be rescaled if the current system does not support non power of two textures)\r\n */\r\n public baseWidth: number = 0;\r\n /**\r\n * Gets the initial height of the texture (It could be rescaled if the current system does not support non power of two textures)\r\n */\r\n public baseHeight: number = 0;\r\n /**\r\n * Gets the initial depth of the texture (It could be rescaled if the current system does not support non power of two textures)\r\n */\r\n public baseDepth: number = 0;\r\n /**\r\n * Gets a boolean indicating if the texture is inverted on Y axis\r\n */\r\n public invertY: boolean = false;\r\n\r\n // Private\r\n /** @internal */\r\n public _invertVScale = false;\r\n /** @internal */\r\n public _associatedChannel = -1;\r\n /** @internal */\r\n public _source = InternalTextureSource.Unknown;\r\n /** @internal */\r\n public _buffer: Nullable = null;\r\n /** @internal */\r\n public _bufferView: Nullable = null;\r\n /** @internal */\r\n public _bufferViewArray: Nullable = null;\r\n /** @internal */\r\n public _bufferViewArrayArray: Nullable = null;\r\n /** @internal */\r\n public _size: number = 0;\r\n /** @internal */\r\n public _extension: string = \"\";\r\n /** @internal */\r\n public _files: Nullable = null;\r\n /** @internal */\r\n public _workingCanvas: Nullable = null;\r\n /** @internal */\r\n public _workingContext: Nullable = null;\r\n /** @internal */\r\n public _cachedCoordinatesMode: Nullable = null;\r\n /** @internal */\r\n public _isDisabled: boolean = false;\r\n /** @internal */\r\n public _compression: Nullable = null;\r\n /** @internal */\r\n public _sphericalPolynomial: Nullable = null;\r\n /** @internal */\r\n public _sphericalPolynomialPromise: Nullable> = null;\r\n /** @internal */\r\n public _sphericalPolynomialComputed = false;\r\n /** @internal */\r\n public _lodGenerationScale: number = 0;\r\n /** @internal */\r\n public _lodGenerationOffset: number = 0;\r\n /** @internal */\r\n public _useSRGBBuffer: boolean = false;\r\n /** @internal */\r\n public _creationFlags: number = 0;\r\n /** @internal */\r\n public _originalFormat?: number;\r\n\r\n // The following three fields helps sharing generated fixed LODs for texture filtering\r\n // In environment not supporting the textureLOD extension like EDGE. They are for internal use only.\r\n // They are at the level of the gl texture to benefit from the cache.\r\n /** @internal */\r\n public _lodTextureHigh: Nullable = null;\r\n /** @internal */\r\n public _lodTextureMid: Nullable = null;\r\n /** @internal */\r\n public _lodTextureLow: Nullable = null;\r\n /** @internal */\r\n public _isRGBD: boolean = false;\r\n\r\n /** @internal */\r\n public _linearSpecularLOD: boolean = false;\r\n /** @internal */\r\n public _irradianceTexture: Nullable = null;\r\n\r\n /** @internal */\r\n public _hardwareTexture: Nullable = null;\r\n\r\n /** @internal */\r\n public _maxLodLevel: Nullable = null;\r\n\r\n /** @internal */\r\n public _references: number = 1;\r\n\r\n /** @internal */\r\n public _gammaSpace: Nullable = null;\r\n\r\n /** @internal */\r\n public _premulAlpha = false;\r\n\r\n /** @internal */\r\n public _dynamicTextureSource: Nullable = null;\r\n\r\n private _engine: ThinEngine;\r\n private _uniqueId: number;\r\n\r\n /** @internal */\r\n public static _Counter = 0;\r\n\r\n /** Gets the unique id of the internal texture */\r\n public get uniqueId() {\r\n return this._uniqueId;\r\n }\r\n\r\n /** @internal */\r\n public _setUniqueId(id: number) {\r\n this._uniqueId = id;\r\n }\r\n\r\n /**\r\n * Gets the Engine the texture belongs to.\r\n * @returns The babylon engine\r\n */\r\n public getEngine(): ThinEngine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * Gets the data source type of the texture\r\n */\r\n public get source(): InternalTextureSource {\r\n return this._source;\r\n }\r\n\r\n /**\r\n * Creates a new InternalTexture\r\n * @param engine defines the engine to use\r\n * @param source defines the type of data that will be used\r\n * @param delayAllocation if the texture allocation should be delayed (default: false)\r\n */\r\n constructor(engine: ThinEngine, source: InternalTextureSource, delayAllocation = false) {\r\n super();\r\n\r\n this._engine = engine;\r\n this._source = source;\r\n this._uniqueId = InternalTexture._Counter++;\r\n\r\n if (!delayAllocation) {\r\n this._hardwareTexture = engine._createHardwareTexture();\r\n }\r\n }\r\n\r\n /**\r\n * Increments the number of references (ie. the number of Texture that point to it)\r\n */\r\n public incrementReferences(): void {\r\n this._references++;\r\n }\r\n\r\n /**\r\n * Change the size of the texture (not the size of the content)\r\n * @param width defines the new width\r\n * @param height defines the new height\r\n * @param depth defines the new depth (1 by default)\r\n */\r\n public updateSize(width: int, height: int, depth: int = 1): void {\r\n this._engine.updateTextureDimensions(this, width, height, depth);\r\n\r\n this.width = width;\r\n this.height = height;\r\n this.depth = depth;\r\n\r\n this.baseWidth = width;\r\n this.baseHeight = height;\r\n this.baseDepth = depth;\r\n\r\n this._size = width * height * depth;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n this.isReady = false;\r\n this._cachedCoordinatesMode = null;\r\n this._cachedWrapU = null;\r\n this._cachedWrapV = null;\r\n this._cachedWrapR = null;\r\n this._cachedAnisotropicFilteringLevel = null;\r\n if (this.onRebuildCallback) {\r\n const data = this.onRebuildCallback(this);\r\n const swapAndSetIsReady = (proxyInternalTexture: InternalTexture) => {\r\n proxyInternalTexture._swapAndDie(this, false);\r\n this.isReady = data.isReady;\r\n };\r\n if (data.isAsync) {\r\n (data.proxy as Promise).then(swapAndSetIsReady);\r\n } else {\r\n swapAndSetIsReady(data.proxy as InternalTexture);\r\n }\r\n return;\r\n }\r\n\r\n let proxy: InternalTexture;\r\n switch (this.source) {\r\n case InternalTextureSource.Temp:\r\n break;\r\n\r\n case InternalTextureSource.Url:\r\n proxy = this._engine.createTexture(\r\n this._originalUrl ?? this.url,\r\n !this.generateMipMaps,\r\n this.invertY,\r\n null,\r\n this.samplingMode,\r\n // Do not use Proxy here as it could be fully synchronous\r\n // and proxy would be undefined.\r\n (temp) => {\r\n temp._swapAndDie(this, false);\r\n this.isReady = true;\r\n },\r\n null,\r\n this._buffer,\r\n undefined,\r\n this.format,\r\n this._extension,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._useSRGBBuffer\r\n );\r\n return;\r\n\r\n case InternalTextureSource.Raw:\r\n proxy = this._engine.createRawTexture(\r\n this._bufferView,\r\n this.baseWidth,\r\n this.baseHeight,\r\n this.format,\r\n this.generateMipMaps,\r\n this.invertY,\r\n this.samplingMode,\r\n this._compression,\r\n this.type,\r\n this._creationFlags,\r\n this._useSRGBBuffer\r\n );\r\n proxy._swapAndDie(this, false);\r\n\r\n this.isReady = true;\r\n break;\r\n\r\n case InternalTextureSource.Raw3D:\r\n proxy = this._engine.createRawTexture3D(\r\n this._bufferView,\r\n this.baseWidth,\r\n this.baseHeight,\r\n this.baseDepth,\r\n this.format,\r\n this.generateMipMaps,\r\n this.invertY,\r\n this.samplingMode,\r\n this._compression,\r\n this.type\r\n );\r\n proxy._swapAndDie(this, false);\r\n\r\n this.isReady = true;\r\n break;\r\n\r\n case InternalTextureSource.Raw2DArray:\r\n proxy = this._engine.createRawTexture2DArray(\r\n this._bufferView,\r\n this.baseWidth,\r\n this.baseHeight,\r\n this.baseDepth,\r\n this.format,\r\n this.generateMipMaps,\r\n this.invertY,\r\n this.samplingMode,\r\n this._compression,\r\n this.type\r\n );\r\n proxy._swapAndDie(this, false);\r\n\r\n this.isReady = true;\r\n break;\r\n\r\n case InternalTextureSource.Dynamic:\r\n proxy = this._engine.createDynamicTexture(this.baseWidth, this.baseHeight, this.generateMipMaps, this.samplingMode);\r\n proxy._swapAndDie(this, false);\r\n if (this._dynamicTextureSource) {\r\n this._engine.updateDynamicTexture(this, this._dynamicTextureSource, this.invertY, this._premulAlpha, this.format, true);\r\n }\r\n\r\n // The engine will make sure to update content so no need to flag it as isReady = true\r\n break;\r\n\r\n case InternalTextureSource.Cube:\r\n proxy = this._engine.createCubeTexture(\r\n this.url,\r\n null,\r\n this._files,\r\n !this.generateMipMaps,\r\n () => {\r\n proxy._swapAndDie(this, false);\r\n this.isReady = true;\r\n },\r\n null,\r\n this.format,\r\n this._extension,\r\n false,\r\n 0,\r\n 0,\r\n null,\r\n undefined,\r\n this._useSRGBBuffer\r\n );\r\n return;\r\n\r\n case InternalTextureSource.CubeRaw:\r\n proxy = this._engine.createRawCubeTexture(\r\n this._bufferViewArray!,\r\n this.width,\r\n this._originalFormat ?? this.format,\r\n this.type,\r\n this.generateMipMaps,\r\n this.invertY,\r\n this.samplingMode,\r\n this._compression\r\n );\r\n proxy._swapAndDie(this, false);\r\n this.isReady = true;\r\n break;\r\n\r\n case InternalTextureSource.CubeRawRGBD:\r\n // This case is being handeled by the environment texture tools and is not a part of the rebuild process.\r\n // To use CubeRawRGBD use updateRGBDAsync on the cube texture.\r\n return;\r\n\r\n case InternalTextureSource.CubePrefiltered:\r\n proxy = this._engine.createPrefilteredCubeTexture(\r\n this.url,\r\n null,\r\n this._lodGenerationScale,\r\n this._lodGenerationOffset,\r\n (proxy) => {\r\n if (proxy) {\r\n proxy._swapAndDie(this, false);\r\n }\r\n this.isReady = true;\r\n },\r\n null,\r\n this.format,\r\n this._extension\r\n );\r\n proxy._sphericalPolynomial = this._sphericalPolynomial;\r\n return;\r\n\r\n case InternalTextureSource.DepthStencil:\r\n case InternalTextureSource.Depth: {\r\n // Will be handled at the RenderTargetWrapper level\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _swapAndDie(target: InternalTexture, swapAll = true): void {\r\n // TODO what about refcount on target?\r\n\r\n this._hardwareTexture?.setUsage(target._source, this.generateMipMaps, this.is2DArray, this.isCube, this.is3D, this.width, this.height, this.depth);\r\n\r\n target._hardwareTexture = this._hardwareTexture;\r\n if (swapAll) {\r\n target._isRGBD = this._isRGBD;\r\n }\r\n\r\n if (this._lodTextureHigh) {\r\n if (target._lodTextureHigh) {\r\n target._lodTextureHigh.dispose();\r\n }\r\n target._lodTextureHigh = this._lodTextureHigh;\r\n }\r\n\r\n if (this._lodTextureMid) {\r\n if (target._lodTextureMid) {\r\n target._lodTextureMid.dispose();\r\n }\r\n target._lodTextureMid = this._lodTextureMid;\r\n }\r\n\r\n if (this._lodTextureLow) {\r\n if (target._lodTextureLow) {\r\n target._lodTextureLow.dispose();\r\n }\r\n target._lodTextureLow = this._lodTextureLow;\r\n }\r\n\r\n if (this._irradianceTexture) {\r\n if (target._irradianceTexture) {\r\n target._irradianceTexture.dispose();\r\n }\r\n target._irradianceTexture = this._irradianceTexture;\r\n }\r\n\r\n const cache = this._engine.getLoadedTexturesCache();\r\n let index = cache.indexOf(this);\r\n if (index !== -1) {\r\n cache.splice(index, 1);\r\n }\r\n\r\n index = cache.indexOf(target);\r\n if (index === -1) {\r\n cache.push(target);\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the current allocated resources\r\n */\r\n public dispose(): void {\r\n this._references--;\r\n this.onLoadedObservable.clear();\r\n this.onErrorObservable.clear();\r\n if (this._references === 0) {\r\n this._engine._releaseTexture(this);\r\n this._hardwareTexture = null;\r\n this._dynamicTextureSource = null;\r\n }\r\n }\r\n}\r\n", "import { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\nimport type { IShaderProcessor } from \"../Processors/iShaderProcessor\";\r\n\r\nconst varyingRegex = /(flat\\s)?\\s*varying\\s*.*/;\r\n\r\n/** @internal */\r\nexport class WebGL2ShaderProcessor implements IShaderProcessor {\r\n public shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n public attributeProcessor(attribute: string) {\r\n return attribute.replace(\"attribute\", \"in\");\r\n }\r\n\r\n public varyingCheck(varying: string, _isFragment: boolean) {\r\n return varyingRegex.test(varying);\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean) {\r\n return varying.replace(\"varying\", isFragment ? \"in\" : \"out\");\r\n }\r\n\r\n public postProcessor(code: string, defines: string[], isFragment: boolean) {\r\n const hasDrawBuffersExtension = code.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1;\r\n\r\n // Remove extensions\r\n const regex = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\r\n code = code.replace(regex, \"\");\r\n\r\n // Replace instructions\r\n code = code.replace(/texture2D\\s*\\(/g, \"texture(\");\r\n if (isFragment) {\r\n const hasOutput = code.search(/layout *\\(location *= *0\\) *out/g) !== -1;\r\n\r\n code = code.replace(/texture2DLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCubeLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCube\\s*\\(/g, \"texture(\");\r\n code = code.replace(/gl_FragDepthEXT/g, \"gl_FragDepth\");\r\n code = code.replace(/gl_FragColor/g, \"glFragColor\");\r\n code = code.replace(/gl_FragData/g, \"glFragData\");\r\n code = code.replace(/void\\s+?main\\s*\\(/g, (hasDrawBuffersExtension || hasOutput ? \"\" : \"layout(location = 0) out vec4 glFragColor;\\n\") + \"void main(\");\r\n } else {\r\n const hasMultiviewExtension = defines.indexOf(\"#define MULTIVIEW\") !== -1;\r\n if (hasMultiviewExtension) {\r\n return \"#extension GL_OVR_multiview2 : require\\nlayout (num_views = 2) in;\\n\" + code;\r\n }\r\n }\r\n\r\n return code;\r\n }\r\n}\r\n", "/**\r\n * Class used to store gfx data (like WebGLBuffer)\r\n */\r\nexport class DataBuffer {\r\n private static _Counter = 0;\r\n\r\n /**\r\n * Gets or sets the number of objects referencing this buffer\r\n */\r\n public references: number = 0;\r\n /** Gets or sets the size of the underlying buffer */\r\n public capacity: number = 0;\r\n /**\r\n * Gets or sets a boolean indicating if the buffer contains 32bits indices\r\n */\r\n public is32Bits: boolean = false;\r\n\r\n /**\r\n * Gets the underlying buffer\r\n */\r\n public get underlyingResource(): any {\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the unique id of this buffer\r\n */\r\n public readonly uniqueId: number;\r\n\r\n /**\r\n * Constructs the buffer\r\n */\r\n constructor() {\r\n this.uniqueId = DataBuffer._Counter++;\r\n }\r\n}\r\n", "import { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n/** @internal */\r\nexport class WebGLDataBuffer extends DataBuffer {\r\n private _buffer: Nullable;\r\n\r\n public constructor(resource: WebGLBuffer) {\r\n super();\r\n this._buffer = resource;\r\n }\r\n\r\n public get underlyingResource(): any {\r\n return this._buffer;\r\n }\r\n}\r\n", "import type { IPipelineContext } from \"../IPipelineContext\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Effect } from \"../../Materials/effect\";\r\nimport type { IMatrixLike, IVector2Like, IVector3Like, IVector4Like, IColor3Like, IColor4Like, IQuaternionLike } from \"../../Maths/math.like\";\r\nimport type { ThinEngine } from \"../thinEngine\";\r\n\r\n/** @internal */\r\nexport class WebGLPipelineContext implements IPipelineContext {\r\n private _valueCache: { [key: string]: any } = {};\r\n private _uniforms: { [key: string]: Nullable };\r\n\r\n public engine: ThinEngine;\r\n public program: Nullable;\r\n public context?: WebGLRenderingContext;\r\n public vertexShader?: WebGLShader;\r\n public fragmentShader?: WebGLShader;\r\n public isParallelCompiled: boolean;\r\n public onCompiled?: () => void;\r\n public transformFeedback?: WebGLTransformFeedback | null;\r\n\r\n public vertexCompilationError: Nullable = null;\r\n public fragmentCompilationError: Nullable = null;\r\n public programLinkError: Nullable = null;\r\n public programValidationError: Nullable = null;\r\n\r\n /** @internal */\r\n public _isDisposed = false;\r\n\r\n public get isAsync() {\r\n return this.isParallelCompiled;\r\n }\r\n\r\n public get isReady(): boolean {\r\n if (this.program) {\r\n if (this.isParallelCompiled) {\r\n return this.engine._isRenderingStateCompiled(this);\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public _handlesSpectorRebuildCallback(onCompiled: (program: WebGLProgram) => void): void {\r\n if (onCompiled && this.program) {\r\n onCompiled(this.program);\r\n }\r\n }\r\n\r\n public _fillEffectInformation(\r\n effect: Effect,\r\n uniformBuffersNames: { [key: string]: number },\r\n uniformsNames: string[],\r\n uniforms: { [key: string]: Nullable },\r\n samplerList: string[],\r\n samplers: { [key: string]: number },\r\n attributesNames: string[],\r\n attributes: number[]\r\n ) {\r\n const engine = this.engine;\r\n if (engine.supportsUniformBuffers) {\r\n for (const name in uniformBuffersNames) {\r\n effect.bindUniformBlock(name, uniformBuffersNames[name]);\r\n }\r\n }\r\n\r\n const effectAvailableUniforms = this.engine.getUniforms(this, uniformsNames);\r\n effectAvailableUniforms.forEach((uniform, index) => {\r\n uniforms[uniformsNames[index]] = uniform;\r\n });\r\n this._uniforms = uniforms;\r\n\r\n let index: number;\r\n for (index = 0; index < samplerList.length; index++) {\r\n const sampler = effect.getUniform(samplerList[index]);\r\n if (sampler == null) {\r\n samplerList.splice(index, 1);\r\n index--;\r\n }\r\n }\r\n\r\n samplerList.forEach((name, index) => {\r\n samplers[name] = index;\r\n });\r\n\r\n for (const attr of engine.getAttributes(this, attributesNames)) {\r\n attributes.push(attr);\r\n }\r\n }\r\n\r\n /**\r\n * Release all associated resources.\r\n **/\r\n public dispose() {\r\n this._uniforms = {};\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _cacheMatrix(uniformName: string, matrix: IMatrixLike): boolean {\r\n const cache = this._valueCache[uniformName];\r\n const flag = matrix.updateFlag;\r\n if (cache !== undefined && cache === flag) {\r\n return false;\r\n }\r\n\r\n this._valueCache[uniformName] = flag;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _cacheFloat2(uniformName: string, x: number, y: number): boolean {\r\n let cache = this._valueCache[uniformName];\r\n if (!cache || cache.length !== 2) {\r\n cache = [x, y];\r\n this._valueCache[uniformName] = cache;\r\n return true;\r\n }\r\n\r\n let changed = false;\r\n if (cache[0] !== x) {\r\n cache[0] = x;\r\n changed = true;\r\n }\r\n if (cache[1] !== y) {\r\n cache[1] = y;\r\n changed = true;\r\n }\r\n\r\n return changed;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _cacheFloat3(uniformName: string, x: number, y: number, z: number): boolean {\r\n let cache = this._valueCache[uniformName];\r\n if (!cache || cache.length !== 3) {\r\n cache = [x, y, z];\r\n this._valueCache[uniformName] = cache;\r\n return true;\r\n }\r\n\r\n let changed = false;\r\n if (cache[0] !== x) {\r\n cache[0] = x;\r\n changed = true;\r\n }\r\n if (cache[1] !== y) {\r\n cache[1] = y;\r\n changed = true;\r\n }\r\n if (cache[2] !== z) {\r\n cache[2] = z;\r\n changed = true;\r\n }\r\n\r\n return changed;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _cacheFloat4(uniformName: string, x: number, y: number, z: number, w: number): boolean {\r\n let cache = this._valueCache[uniformName];\r\n if (!cache || cache.length !== 4) {\r\n cache = [x, y, z, w];\r\n this._valueCache[uniformName] = cache;\r\n return true;\r\n }\r\n\r\n let changed = false;\r\n if (cache[0] !== x) {\r\n cache[0] = x;\r\n changed = true;\r\n }\r\n if (cache[1] !== y) {\r\n cache[1] = y;\r\n changed = true;\r\n }\r\n if (cache[2] !== z) {\r\n cache[2] = z;\r\n changed = true;\r\n }\r\n if (cache[3] !== w) {\r\n cache[3] = w;\r\n changed = true;\r\n }\r\n\r\n return changed;\r\n }\r\n\r\n /**\r\n * Sets an integer value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value Value to be set.\r\n */\r\n public setInt(uniformName: string, value: number): void {\r\n const cache = this._valueCache[uniformName];\r\n if (cache !== undefined && cache === value) {\r\n return;\r\n }\r\n\r\n if (this.engine.setInt(this._uniforms[uniformName], value)) {\r\n this._valueCache[uniformName] = value;\r\n }\r\n }\r\n\r\n /**\r\n * Sets a int2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int2.\r\n * @param y Second int in int2.\r\n */\r\n public setInt2(uniformName: string, x: number, y: number): void {\r\n if (this._cacheFloat2(uniformName, x, y)) {\r\n if (!this.engine.setInt2(this._uniforms[uniformName], x, y)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a int3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int3.\r\n * @param y Second int in int3.\r\n * @param z Third int in int3.\r\n */\r\n public setInt3(uniformName: string, x: number, y: number, z: number): void {\r\n if (this._cacheFloat3(uniformName, x, y, z)) {\r\n if (!this.engine.setInt3(this._uniforms[uniformName], x, y, z)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a int4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First int in int4.\r\n * @param y Second int in int4.\r\n * @param z Third int in int4.\r\n * @param w Fourth int in int4.\r\n */\r\n public setInt4(uniformName: string, x: number, y: number, z: number, w: number): void {\r\n if (this._cacheFloat4(uniformName, x, y, z, w)) {\r\n if (!this.engine.setInt4(this._uniforms[uniformName], x, y, z, w)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets an int array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setIntArray(uniformName: string, array: Int32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setIntArray(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setIntArray2(uniformName: string, array: Int32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setIntArray2(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setIntArray3(uniformName: string, array: Int32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setIntArray3(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setIntArray4(uniformName: string, array: Int32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setIntArray4(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an unsigned integer value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value Value to be set.\r\n */\r\n public setUInt(uniformName: string, value: number): void {\r\n const cache = this._valueCache[uniformName];\r\n if (cache !== undefined && cache === value) {\r\n return;\r\n }\r\n\r\n if (this.engine.setUInt(this._uniforms[uniformName], value)) {\r\n this._valueCache[uniformName] = value;\r\n }\r\n }\r\n\r\n /**\r\n * Sets an unsigned int2 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint2.\r\n * @param y Second unsigned int in uint2.\r\n */\r\n public setUInt2(uniformName: string, x: number, y: number): void {\r\n if (this._cacheFloat2(uniformName, x, y)) {\r\n if (!this.engine.setUInt2(this._uniforms[uniformName], x, y)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets an unsigned int3 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint3.\r\n * @param y Second unsigned int in uint3.\r\n * @param z Third unsigned int in uint3.\r\n */\r\n public setUInt3(uniformName: string, x: number, y: number, z: number): void {\r\n if (this._cacheFloat3(uniformName, x, y, z)) {\r\n if (!this.engine.setUInt3(this._uniforms[uniformName], x, y, z)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets an unsigned int4 value on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First unsigned int in uint4.\r\n * @param y Second unsigned int in uint4.\r\n * @param z Third unsigned int in uint4.\r\n * @param w Fourth unsigned int in uint4.\r\n */\r\n public setUInt4(uniformName: string, x: number, y: number, z: number, w: number): void {\r\n if (this._cacheFloat4(uniformName, x, y, z, w)) {\r\n if (!this.engine.setUInt4(this._uniforms[uniformName], x, y, z, w)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setUIntArray(uniformName: string, array: Uint32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setUIntArray(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setUIntArray2(uniformName: string, array: Uint32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setUIntArray2(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setUIntArray3(uniformName: string, array: Uint32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setUIntArray3(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setUIntArray4(uniformName: string, array: Uint32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setUIntArray4(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an array on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setArray(uniformName: string, array: number[]): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setArray(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setArray2(uniformName: string, array: number[]): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setArray2(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setArray3(uniformName: string, array: number[]): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setArray3(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)\r\n * @param uniformName Name of the variable.\r\n * @param array array to be set.\r\n */\r\n public setArray4(uniformName: string, array: number[]): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setArray4(this._uniforms[uniformName], array);\r\n }\r\n\r\n /**\r\n * Sets matrices on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param matrices matrices to be set.\r\n */\r\n public setMatrices(uniformName: string, matrices: Float32Array): void {\r\n if (!matrices) {\r\n return;\r\n }\r\n\r\n this._valueCache[uniformName] = null;\r\n this.engine.setMatrices(this._uniforms[uniformName], matrices);\r\n }\r\n\r\n /**\r\n * Sets matrix on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n */\r\n public setMatrix(uniformName: string, matrix: IMatrixLike): void {\r\n if (this._cacheMatrix(uniformName, matrix)) {\r\n if (!this.engine.setMatrices(this._uniforms[uniformName], matrix.asArray())) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix)\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n */\r\n public setMatrix3x3(uniformName: string, matrix: Float32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setMatrix3x3(this._uniforms[uniformName], matrix);\r\n }\r\n\r\n /**\r\n * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix)\r\n * @param uniformName Name of the variable.\r\n * @param matrix matrix to be set.\r\n */\r\n public setMatrix2x2(uniformName: string, matrix: Float32Array): void {\r\n this._valueCache[uniformName] = null;\r\n this.engine.setMatrix2x2(this._uniforms[uniformName], matrix);\r\n }\r\n\r\n /**\r\n * Sets a float on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param value value to be set.\r\n */\r\n public setFloat(uniformName: string, value: number): void {\r\n const cache = this._valueCache[uniformName];\r\n if (cache !== undefined && cache === value) {\r\n return;\r\n }\r\n\r\n if (this.engine.setFloat(this._uniforms[uniformName], value)) {\r\n this._valueCache[uniformName] = value;\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Vector2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector2 vector2 to be set.\r\n */\r\n public setVector2(uniformName: string, vector2: IVector2Like): void {\r\n if (this._cacheFloat2(uniformName, vector2.x, vector2.y)) {\r\n if (!this.engine.setFloat2(this._uniforms[uniformName], vector2.x, vector2.y)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a float2 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float2.\r\n * @param y Second float in float2.\r\n */\r\n public setFloat2(uniformName: string, x: number, y: number): void {\r\n if (this._cacheFloat2(uniformName, x, y)) {\r\n if (!this.engine.setFloat2(this._uniforms[uniformName], x, y)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Vector3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector3 Value to be set.\r\n */\r\n public setVector3(uniformName: string, vector3: IVector3Like): void {\r\n if (this._cacheFloat3(uniformName, vector3.x, vector3.y, vector3.z)) {\r\n if (!this.engine.setFloat3(this._uniforms[uniformName], vector3.x, vector3.y, vector3.z)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a float3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float3.\r\n * @param y Second float in float3.\r\n * @param z Third float in float3.\r\n */\r\n public setFloat3(uniformName: string, x: number, y: number, z: number): void {\r\n if (this._cacheFloat3(uniformName, x, y, z)) {\r\n if (!this.engine.setFloat3(this._uniforms[uniformName], x, y, z)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Vector4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param vector4 Value to be set.\r\n */\r\n public setVector4(uniformName: string, vector4: IVector4Like): void {\r\n if (this._cacheFloat4(uniformName, vector4.x, vector4.y, vector4.z, vector4.w)) {\r\n if (!this.engine.setFloat4(this._uniforms[uniformName], vector4.x, vector4.y, vector4.z, vector4.w)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Quaternion on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param quaternion Value to be set.\r\n */\r\n public setQuaternion(uniformName: string, quaternion: IQuaternionLike): void {\r\n if (this._cacheFloat4(uniformName, quaternion.x, quaternion.y, quaternion.z, quaternion.w)) {\r\n if (!this.engine.setFloat4(this._uniforms[uniformName], quaternion.x, quaternion.y, quaternion.z, quaternion.w)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a float4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param x First float in float4.\r\n * @param y Second float in float4.\r\n * @param z Third float in float4.\r\n * @param w Fourth float in float4.\r\n */\r\n public setFloat4(uniformName: string, x: number, y: number, z: number, w: number): void {\r\n if (this._cacheFloat4(uniformName, x, y, z, w)) {\r\n if (!this.engine.setFloat4(this._uniforms[uniformName], x, y, z, w)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Color3 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param color3 Value to be set.\r\n */\r\n public setColor3(uniformName: string, color3: IColor3Like): void {\r\n if (this._cacheFloat3(uniformName, color3.r, color3.g, color3.b)) {\r\n if (!this.engine.setFloat3(this._uniforms[uniformName], color3.r, color3.g, color3.b)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Color4 on a uniform variable.\r\n * @param uniformName Name of the variable.\r\n * @param color3 Value to be set.\r\n * @param alpha Alpha value to be set.\r\n */\r\n public setColor4(uniformName: string, color3: IColor3Like, alpha: number): void {\r\n if (this._cacheFloat4(uniformName, color3.r, color3.g, color3.b, alpha)) {\r\n if (!this.engine.setFloat4(this._uniforms[uniformName], color3.r, color3.g, color3.b, alpha)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a Color4 on a uniform variable\r\n * @param uniformName defines the name of the variable\r\n * @param color4 defines the value to be set\r\n */\r\n public setDirectColor4(uniformName: string, color4: IColor4Like): void {\r\n if (this._cacheFloat4(uniformName, color4.r, color4.g, color4.b, color4.a)) {\r\n if (!this.engine.setFloat4(this._uniforms[uniformName], color4.r, color4.g, color4.b, color4.a)) {\r\n this._valueCache[uniformName] = null;\r\n }\r\n }\r\n }\r\n\r\n public _getVertexShaderCode(): string | null {\r\n return this.vertexShader ? this.engine._getShaderSource(this.vertexShader) : null;\r\n }\r\n\r\n public _getFragmentShaderCode(): string | null {\r\n return this.fragmentShader ? this.engine._getShaderSource(this.fragmentShader) : null;\r\n }\r\n}\r\n", "import type { HardwareTextureWrapper } from \"../../Materials/Textures/hardwareTextureWrapper\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n/** @internal */\r\nexport class WebGLHardwareTexture implements HardwareTextureWrapper {\r\n private _webGLTexture: WebGLTexture;\r\n private _context: WebGLRenderingContext;\r\n\r\n // There can be multiple buffers for a single WebGL texture because different layers of a 2DArrayTexture / 3DTexture\r\n // or different faces of a cube texture can be bound to different render targets at the same time.\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private _MSAARenderBuffers: Nullable = null;\r\n\r\n public get underlyingResource(): Nullable {\r\n return this._webGLTexture;\r\n }\r\n\r\n constructor(existingTexture: Nullable = null, context: WebGLRenderingContext) {\r\n this._context = context as WebGLRenderingContext;\r\n if (!existingTexture) {\r\n existingTexture = context.createTexture();\r\n if (!existingTexture) {\r\n throw new Error(\"Unable to create webGL texture\");\r\n }\r\n }\r\n this.set(existingTexture);\r\n }\r\n\r\n public setUsage(): void {}\r\n\r\n public set(hardwareTexture: WebGLTexture) {\r\n this._webGLTexture = hardwareTexture;\r\n }\r\n\r\n public reset() {\r\n this._webGLTexture = null as any;\r\n this._MSAARenderBuffers = null;\r\n }\r\n\r\n public addMSAARenderBuffer(buffer: WebGLRenderbuffer) {\r\n if (!this._MSAARenderBuffers) {\r\n this._MSAARenderBuffers = [];\r\n }\r\n this._MSAARenderBuffers.push(buffer);\r\n }\r\n\r\n public releaseMSAARenderBuffers() {\r\n if (this._MSAARenderBuffers) {\r\n for (const buffer of this._MSAARenderBuffers) {\r\n this._context.deleteRenderbuffer(buffer);\r\n }\r\n this._MSAARenderBuffers = null;\r\n }\r\n }\r\n\r\n public getMSAARenderBuffer(index = 0) {\r\n return this._MSAARenderBuffers?.[index] ?? null;\r\n }\r\n\r\n public release() {\r\n this.releaseMSAARenderBuffers();\r\n\r\n if (this._webGLTexture) {\r\n this._context.deleteTexture(this._webGLTexture);\r\n }\r\n this.reset();\r\n }\r\n}\r\n", "import type { IDrawContext } from \"../Engines/IDrawContext\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\nimport type { Nullable } from \"../types\";\r\n\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport type { Effect } from \"./effect\";\r\nimport type { MaterialDefines } from \"./materialDefines\";\r\n\r\n/** @internal */\r\nexport class DrawWrapper {\r\n public effect: Nullable;\r\n public defines: Nullable;\r\n public materialContext?: IMaterialContext;\r\n public drawContext?: IDrawContext;\r\n\r\n /**\r\n * @internal\r\n * Specifies if the effect was previously ready\r\n */\r\n public _wasPreviouslyReady = false;\r\n\r\n /**\r\n * @internal\r\n * Forces the code from bindForSubMesh to be fully run the next time it is called\r\n */\r\n public _forceRebindOnNextCall = true;\r\n\r\n /**\r\n * @internal\r\n * Specifies if the effect was previously using instances\r\n */\r\n public _wasPreviouslyUsingInstances: Nullable = null;\r\n\r\n public static IsWrapper(effect: Effect | DrawWrapper): effect is DrawWrapper {\r\n return (effect as Effect).getPipelineContext === undefined;\r\n }\r\n\r\n public static GetEffect(effect: Effect | DrawWrapper): Nullable {\r\n return (effect as Effect).getPipelineContext === undefined ? (effect as DrawWrapper).effect : (effect as Effect);\r\n }\r\n\r\n constructor(engine: ThinEngine, createMaterialContext = true) {\r\n this.effect = null;\r\n this.defines = null;\r\n this.drawContext = engine.createDrawContext();\r\n if (createMaterialContext) {\r\n this.materialContext = engine.createMaterialContext();\r\n }\r\n }\r\n\r\n public setEffect(effect: Nullable, defines?: Nullable, resetContext = true): void {\r\n this.effect = effect;\r\n if (defines !== undefined) {\r\n this.defines = defines;\r\n }\r\n if (resetContext) {\r\n this.drawContext?.reset();\r\n }\r\n }\r\n\r\n public dispose(): void {\r\n this.drawContext?.dispose();\r\n }\r\n}\r\n", "import type { IStencilState } from \"./IStencilState\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class StencilStateComposer {\r\n protected _isStencilTestDirty = false;\r\n protected _isStencilMaskDirty = false;\r\n protected _isStencilFuncDirty = false;\r\n protected _isStencilOpDirty = false;\r\n\r\n protected _enabled: boolean;\r\n\r\n protected _mask: number;\r\n\r\n protected _func: number;\r\n protected _funcRef: number;\r\n protected _funcMask: number;\r\n\r\n protected _opStencilFail: number;\r\n protected _opDepthFail: number;\r\n protected _opStencilDepthPass: number;\r\n\r\n public stencilGlobal: IStencilState;\r\n public stencilMaterial: IStencilState | undefined;\r\n\r\n public useStencilGlobalOnly = false;\r\n\r\n public get isDirty(): boolean {\r\n return this._isStencilTestDirty || this._isStencilMaskDirty || this._isStencilFuncDirty || this._isStencilOpDirty;\r\n }\r\n\r\n public get func(): number {\r\n return this._func;\r\n }\r\n\r\n public set func(value: number) {\r\n if (this._func === value) {\r\n return;\r\n }\r\n\r\n this._func = value;\r\n this._isStencilFuncDirty = true;\r\n }\r\n\r\n public get funcRef(): number {\r\n return this._funcRef;\r\n }\r\n\r\n public set funcRef(value: number) {\r\n if (this._funcRef === value) {\r\n return;\r\n }\r\n\r\n this._funcRef = value;\r\n this._isStencilFuncDirty = true;\r\n }\r\n\r\n public get funcMask(): number {\r\n return this._funcMask;\r\n }\r\n\r\n public set funcMask(value: number) {\r\n if (this._funcMask === value) {\r\n return;\r\n }\r\n\r\n this._funcMask = value;\r\n this._isStencilFuncDirty = true;\r\n }\r\n\r\n public get opStencilFail(): number {\r\n return this._opStencilFail;\r\n }\r\n\r\n public set opStencilFail(value: number) {\r\n if (this._opStencilFail === value) {\r\n return;\r\n }\r\n\r\n this._opStencilFail = value;\r\n this._isStencilOpDirty = true;\r\n }\r\n\r\n public get opDepthFail(): number {\r\n return this._opDepthFail;\r\n }\r\n\r\n public set opDepthFail(value: number) {\r\n if (this._opDepthFail === value) {\r\n return;\r\n }\r\n\r\n this._opDepthFail = value;\r\n this._isStencilOpDirty = true;\r\n }\r\n\r\n public get opStencilDepthPass(): number {\r\n return this._opStencilDepthPass;\r\n }\r\n\r\n public set opStencilDepthPass(value: number) {\r\n if (this._opStencilDepthPass === value) {\r\n return;\r\n }\r\n\r\n this._opStencilDepthPass = value;\r\n this._isStencilOpDirty = true;\r\n }\r\n\r\n public get mask(): number {\r\n return this._mask;\r\n }\r\n\r\n public set mask(value: number) {\r\n if (this._mask === value) {\r\n return;\r\n }\r\n\r\n this._mask = value;\r\n this._isStencilMaskDirty = true;\r\n }\r\n\r\n public get enabled(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n public set enabled(value: boolean) {\r\n if (this._enabled === value) {\r\n return;\r\n }\r\n\r\n this._enabled = value;\r\n this._isStencilTestDirty = true;\r\n }\r\n\r\n public constructor(reset = true) {\r\n if (reset) {\r\n this.reset();\r\n }\r\n }\r\n\r\n public reset() {\r\n this.stencilMaterial = undefined;\r\n\r\n this.stencilGlobal?.reset();\r\n\r\n this._isStencilTestDirty = true;\r\n this._isStencilMaskDirty = true;\r\n this._isStencilFuncDirty = true;\r\n this._isStencilOpDirty = true;\r\n }\r\n\r\n public apply(gl?: WebGLRenderingContext) {\r\n if (!gl) {\r\n return;\r\n }\r\n\r\n const stencilMaterialEnabled = !this.useStencilGlobalOnly && !!this.stencilMaterial?.enabled;\r\n\r\n this.enabled = stencilMaterialEnabled ? this.stencilMaterial!.enabled : this.stencilGlobal.enabled;\r\n this.func = stencilMaterialEnabled ? this.stencilMaterial!.func : this.stencilGlobal.func;\r\n this.funcRef = stencilMaterialEnabled ? this.stencilMaterial!.funcRef : this.stencilGlobal.funcRef;\r\n this.funcMask = stencilMaterialEnabled ? this.stencilMaterial!.funcMask : this.stencilGlobal.funcMask;\r\n this.opStencilFail = stencilMaterialEnabled ? this.stencilMaterial!.opStencilFail : this.stencilGlobal.opStencilFail;\r\n this.opDepthFail = stencilMaterialEnabled ? this.stencilMaterial!.opDepthFail : this.stencilGlobal.opDepthFail;\r\n this.opStencilDepthPass = stencilMaterialEnabled ? this.stencilMaterial!.opStencilDepthPass : this.stencilGlobal.opStencilDepthPass;\r\n this.mask = stencilMaterialEnabled ? this.stencilMaterial!.mask : this.stencilGlobal.mask;\r\n\r\n if (!this.isDirty) {\r\n return;\r\n }\r\n\r\n // Stencil test\r\n if (this._isStencilTestDirty) {\r\n if (this.enabled) {\r\n gl.enable(gl.STENCIL_TEST);\r\n } else {\r\n gl.disable(gl.STENCIL_TEST);\r\n }\r\n this._isStencilTestDirty = false;\r\n }\r\n\r\n // Stencil mask\r\n if (this._isStencilMaskDirty) {\r\n gl.stencilMask(this.mask);\r\n this._isStencilMaskDirty = false;\r\n }\r\n\r\n // Stencil func\r\n if (this._isStencilFuncDirty) {\r\n gl.stencilFunc(this.func, this.funcRef, this.funcMask);\r\n this._isStencilFuncDirty = false;\r\n }\r\n\r\n // Stencil op\r\n if (this._isStencilOpDirty) {\r\n gl.stencilOp(this.opStencilFail, this.opDepthFail, this.opStencilDepthPass);\r\n this._isStencilOpDirty = false;\r\n }\r\n }\r\n}\r\n", "import { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { IShaderProcessor } from \"../Processors/iShaderProcessor\";\r\nimport type { ShaderProcessingContext } from \"../Processors/shaderProcessingOptions\";\r\n\r\nimport type { ThinEngine } from \"../thinEngine\";\r\n\r\n/** @internal */\r\nexport class WebGLShaderProcessor implements IShaderProcessor {\r\n public shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n public postProcessor(code: string, defines: string[], isFragment: boolean, processingContext: Nullable, engine: ThinEngine) {\r\n // Remove extensions\r\n if (!engine.getCaps().drawBuffersExtension) {\r\n // even if enclosed in #if/#endif, IE11 does parse the #extension declaration, so we need to remove it altogether\r\n const regex = /#extension.+GL_EXT_draw_buffers.+(enable|require)/g;\r\n code = code.replace(regex, \"\");\r\n }\r\n\r\n return code;\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { EngineStore } from \"./engineStore\";\r\nimport type { IInternalTextureLoader } from \"../Materials/Textures/internalTextureLoader\";\r\nimport type { IEffectCreationOptions, IShaderPath } from \"../Materials/effect\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport type { IShaderProcessor } from \"./Processors/iShaderProcessor\";\r\nimport type { ShaderProcessingContext } from \"./Processors/shaderProcessingOptions\";\r\nimport type { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport type { Nullable, DataArray, IndicesArray, FloatArray, DeepImmutable } from \"../types\";\r\nimport type { EngineCapabilities } from \"./engineCapabilities\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { DepthCullingState } from \"../States/depthCullingState\";\r\nimport { StencilState } from \"../States/stencilState\";\r\nimport { AlphaState } from \"../States/alphaCullingState\";\r\nimport { Constants } from \"./constants\";\r\nimport { InternalTexture, InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport type { IViewportLike, IColor4Like } from \"../Maths/math.like\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport type { IFileRequest } from \"../Misc/fileRequest\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { IsDocumentAvailable, IsWindowObjectExist } from \"../Misc/domManagement\";\r\nimport { WebGLShaderProcessor } from \"./WebGL/webGLShaderProcessors\";\r\nimport { WebGL2ShaderProcessor } from \"./WebGL/webGL2ShaderProcessors\";\r\nimport { WebGLDataBuffer } from \"../Meshes/WebGL/webGLDataBuffer\";\r\nimport type { IPipelineContext } from \"./IPipelineContext\";\r\nimport { WebGLPipelineContext } from \"./WebGL/webGLPipelineContext\";\r\nimport type { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { InstancingAttributeInfo } from \"./instancingAttributeInfo\";\r\nimport type { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport type { IOfflineProvider } from \"../Offline/IOfflineProvider\";\r\nimport type { IEffectFallbacks } from \"../Materials/iEffectFallbacks\";\r\nimport type { IWebRequest } from \"../Misc/interfaces/iWebRequest\";\r\nimport { PerformanceConfigurator } from \"./performanceConfigurator\";\r\nimport type { EngineFeatures } from \"./engineFeatures\";\r\nimport type { HardwareTextureWrapper } from \"../Materials/Textures/hardwareTextureWrapper\";\r\nimport { WebGLHardwareTexture } from \"./WebGL/webGLHardwareTexture\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { IMaterialContext } from \"./IMaterialContext\";\r\nimport type { IDrawContext } from \"./IDrawContext\";\r\nimport type { ICanvas, ICanvasRenderingContext, IImage } from \"./ICanvas\";\r\nimport { StencilStateComposer } from \"../States/stencilStateComposer\";\r\nimport type { StorageBuffer } from \"../Buffers/storageBuffer\";\r\nimport type { IAudioEngineOptions } from \"../Audio/Interfaces/IAudioEngineOptions\";\r\nimport type { IStencilState } from \"../States/IStencilState\";\r\nimport type { InternalTextureCreationOptions, TextureSize } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\nimport type { RenderTargetWrapper } from \"./renderTargetWrapper\";\r\nimport type { WebGLRenderTargetWrapper } from \"./WebGL/webGLRenderTargetWrapper\";\r\nimport type { VideoTexture } from \"../Materials/Textures/videoTexture\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { WebRequest } from \"../Misc/webRequest\";\r\nimport type { LoadFileError } from \"../Misc/fileTools\";\r\nimport type { Texture } from \"../Materials/Textures/texture\";\r\nimport { PrecisionDate } from \"../Misc/precisionDate\";\r\n\r\n/**\r\n * Defines the interface used by objects working like Scene\r\n * @internal\r\n */\r\nexport interface ISceneLike {\r\n addPendingData(data: any): void;\r\n removePendingData(data: any): void;\r\n offlineProvider: IOfflineProvider;\r\n}\r\n\r\n/**\r\n * Keeps track of all the buffer info used in engine.\r\n */\r\nclass BufferPointer {\r\n public active: boolean;\r\n public index: number;\r\n public size: number;\r\n public type: number;\r\n public normalized: boolean;\r\n public stride: number;\r\n public offset: number;\r\n public buffer: WebGLBuffer;\r\n}\r\n\r\n/**\r\n * Information about the current host\r\n */\r\nexport interface HostInformation {\r\n /**\r\n * Defines if the current host is a mobile\r\n */\r\n isMobile: boolean;\r\n}\r\n\r\n/** Interface defining initialization parameters for ThinEngine class */\r\nexport interface ThinEngineOptions {\r\n /**\r\n * Defines if the engine should no exceed a specified device ratio\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio\r\n */\r\n limitDeviceRatio?: number;\r\n /**\r\n * Defines if webaudio should be initialized as well\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/audio/playingSoundsMusic\r\n */\r\n audioEngine?: boolean;\r\n /**\r\n * Specifies options for the audio engine\r\n */\r\n audioEngineOptions?: IAudioEngineOptions;\r\n\r\n /**\r\n * Defines if animations should run using a deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n */\r\n deterministicLockstep?: boolean;\r\n /** Defines the maximum steps to use with deterministic lock step mode */\r\n lockstepMaxSteps?: number;\r\n /** Defines the seconds between each deterministic lock step */\r\n timeStep?: number;\r\n /**\r\n * Defines that engine should ignore context lost events\r\n * If this event happens when this parameter is true, you will have to reload the page to restore rendering\r\n */\r\n doNotHandleContextLost?: boolean;\r\n /**\r\n * Defines that engine should ignore modifying touch action attribute and style\r\n * If not handle, you might need to set it up on your side for expected touch devices behavior.\r\n */\r\n doNotHandleTouchAction?: boolean;\r\n\r\n /**\r\n * Make the matrix computations to be performed in 64 bits instead of 32 bits. False by default\r\n */\r\n useHighPrecisionMatrix?: boolean;\r\n\r\n /**\r\n * Defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n adaptToDeviceRatio?: boolean;\r\n\r\n /**\r\n * True if the more expensive but exact conversions should be used for transforming colors to and from linear space within shaders.\r\n * Otherwise, the default is to use a cheaper approximation.\r\n */\r\n useExactSrgbConversions?: boolean;\r\n\r\n /**\r\n * Defines whether MSAA is enabled on the canvas.\r\n */\r\n antialias?: boolean;\r\n\r\n /**\r\n * Defines whether the stencil buffer should be enabled.\r\n */\r\n stencil?: boolean;\r\n\r\n /**\r\n * Defines whether the canvas should be created in \"premultiplied\" mode (if false, the canvas is created in the \"opaque\" mode) (true by default)\r\n */\r\n premultipliedAlpha?: boolean;\r\n}\r\n\r\n/** Interface defining initialization parameters for Engine class */\r\nexport interface EngineOptions extends ThinEngineOptions, WebGLContextAttributes {\r\n /**\r\n * Defines if webgl2 should be turned off even if supported\r\n * @see https://doc.babylonjs.com/setup/support/webGL2\r\n */\r\n disableWebGL2Support?: boolean;\r\n\r\n /**\r\n * Defines that engine should compile shaders with high precision floats (if supported). True by default\r\n */\r\n useHighPrecisionFloats?: boolean;\r\n /**\r\n * Make the canvas XR Compatible for XR sessions\r\n */\r\n xrCompatible?: boolean;\r\n\r\n /**\r\n * Will prevent the system from falling back to software implementation if a hardware device cannot be created\r\n */\r\n failIfMajorPerformanceCaveat?: boolean;\r\n\r\n /**\r\n * If sRGB Buffer support is not set during construction, use this value to force a specific state\r\n * This is added due to an issue when processing textures in chrome/edge/firefox\r\n * This will not influence NativeEngine and WebGPUEngine which set the behavior to true during construction.\r\n */\r\n forceSRGBBufferSupportState?: boolean;\r\n\r\n /**\r\n * Defines if the gl context should be released.\r\n * It's false by default for backward compatibility, but you should probably pass true (see https://registry.khronos.org/webgl/extensions/WEBGL_lose_context/)\r\n */\r\n loseContextOnDispose?: boolean;\r\n}\r\n\r\n/**\r\n * The base engine class (root of all engines)\r\n */\r\nexport class ThinEngine {\r\n private static _TempClearColorUint32 = new Uint32Array(4);\r\n private static _TempClearColorInt32 = new Int32Array(4);\r\n\r\n /** Use this array to turn off some WebGL2 features on known buggy browsers version */\r\n public static ExceptionList = [\r\n { key: \"Chrome/63.0\", capture: \"63\\\\.0\\\\.3239\\\\.(\\\\d+)\", captureConstraint: 108, targets: [\"uniformBuffer\"] },\r\n { key: \"Firefox/58\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\r\n { key: \"Firefox/59\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\r\n { key: \"Chrome/72.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Chrome/73.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Chrome/74.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Mac OS.+Chrome/71\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Mac OS.+Chrome/72\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Mac OS.+Chrome\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\r\n { key: \"Chrome/12\\\\d\\\\..+?Mobile\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\r\n // desktop osx safari 15.4\r\n { key: \".*AppleWebKit.*(15.4).*Safari\", capture: null, captureConstraint: null, targets: [\"antialias\", \"maxMSAASamples\"] },\r\n // mobile browsers using safari 15.4 on ios\r\n { key: \".*(15.4).*AppleWebKit.*Safari\", capture: null, captureConstraint: null, targets: [\"antialias\", \"maxMSAASamples\"] },\r\n ];\r\n\r\n /** @internal */\r\n public static _TextureLoaders: IInternalTextureLoader[] = [];\r\n\r\n /**\r\n * Returns the current npm package of the sdk\r\n */\r\n // Not mixed with Version for tooling purpose.\r\n public static get NpmPackage(): string {\r\n return \"babylonjs@7.1.0\";\r\n }\r\n\r\n /**\r\n * Returns the current version of the framework\r\n */\r\n public static get Version(): string {\r\n return \"7.1.0\";\r\n }\r\n\r\n /**\r\n * Returns a string describing the current engine\r\n */\r\n public get description(): string {\r\n let description = this.name + this.webGLVersion;\r\n\r\n if (this._caps.parallelShaderCompile) {\r\n description += \" - Parallel shader compilation\";\r\n }\r\n\r\n return description;\r\n }\r\n\r\n /** @internal */\r\n protected _name = \"WebGL\";\r\n\r\n /**\r\n * Gets or sets the name of the engine\r\n */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n public set name(value: string) {\r\n this._name = value;\r\n }\r\n\r\n /**\r\n * Returns the version of the engine\r\n */\r\n public get version(): number {\r\n return this._webGLVersion;\r\n }\r\n\r\n protected _isDisposed = false;\r\n\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n // Updatable statics so stick with vars here\r\n\r\n /**\r\n * Gets or sets the epsilon value used by collision engine\r\n */\r\n public static CollisionsEpsilon = 0.001;\r\n\r\n /**\r\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\r\n */\r\n public static get ShadersRepository(): string {\r\n return Effect.ShadersRepository;\r\n }\r\n public static set ShadersRepository(value: string) {\r\n Effect.ShadersRepository = value;\r\n }\r\n\r\n protected _shaderProcessor: Nullable;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getShaderProcessor(shaderLanguage: ShaderLanguage): Nullable {\r\n return this._shaderProcessor;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean that indicates if textures must be forced to power of 2 size even if not required\r\n */\r\n public forcePOTTextures = false;\r\n\r\n /**\r\n * Gets a boolean indicating if the engine is currently rendering in fullscreen mode\r\n */\r\n public isFullscreen = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if back faces must be culled. If false, front faces are culled instead (true by default)\r\n * If non null, this takes precedence over the value from the material\r\n */\r\n public cullBackFaces: Nullable = null;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the engine must keep rendering even if the window is not in foreground\r\n */\r\n public renderEvenInBackground = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that cache can be kept between frames\r\n */\r\n public preventCacheWipeBetweenFrames = false;\r\n\r\n /** Gets or sets a boolean indicating if the engine should validate programs after compilation */\r\n public validateShaderPrograms = false;\r\n\r\n private _useReverseDepthBuffer = false;\r\n /**\r\n * Gets or sets a boolean indicating if depth buffer should be reverse, going from far to near.\r\n * This can provide greater z depth for distant objects.\r\n */\r\n public get useReverseDepthBuffer(): boolean {\r\n return this._useReverseDepthBuffer;\r\n }\r\n\r\n public set useReverseDepthBuffer(useReverse) {\r\n if (useReverse === this._useReverseDepthBuffer) {\r\n return;\r\n }\r\n\r\n this._useReverseDepthBuffer = useReverse;\r\n\r\n if (useReverse) {\r\n this._depthCullingState.depthFunc = Constants.GEQUAL;\r\n } else {\r\n this._depthCullingState.depthFunc = Constants.LEQUAL;\r\n }\r\n }\r\n\r\n /**\r\n * Indicates if the z range in NDC space is 0..1 (value: true) or -1..1 (value: false)\r\n */\r\n public readonly isNDCHalfZRange: boolean = false;\r\n\r\n /**\r\n * Indicates that the origin of the texture/framebuffer space is the bottom left corner. If false, the origin is top left\r\n */\r\n public readonly hasOriginBottomLeft: boolean = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that uniform buffers must be disabled even if they are supported\r\n */\r\n public disableUniformBuffers = false;\r\n\r\n /**\r\n * An event triggered when the engine is disposed.\r\n */\r\n public readonly onDisposeObservable = new Observable();\r\n\r\n private _frameId = 0;\r\n /**\r\n * Gets the current frame id\r\n */\r\n public get frameId(): number {\r\n return this._frameId;\r\n }\r\n\r\n /**\r\n * The time (in milliseconds elapsed since the current page has been loaded) when the engine was initialized\r\n */\r\n public readonly startTime: number;\r\n\r\n /** @internal */\r\n public _uniformBuffers = new Array();\r\n /** @internal */\r\n public _storageBuffers = new Array();\r\n\r\n /**\r\n * Gets a boolean indicating that the engine supports uniform buffers\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n */\r\n public get supportsUniformBuffers(): boolean {\r\n return this.webGLVersion > 1 && !this.disableUniformBuffers;\r\n }\r\n\r\n // Private Members\r\n\r\n /** @internal */\r\n public _gl: WebGL2RenderingContext;\r\n /** @internal */\r\n public _webGLVersion = 1.0;\r\n protected _renderingCanvas: Nullable;\r\n protected _windowIsBackground = false;\r\n protected _creationOptions: EngineOptions;\r\n protected _audioContext: Nullable;\r\n protected _audioDestination: Nullable;\r\n /** @internal */\r\n public _glSRGBExtensionValues: {\r\n SRGB: typeof WebGL2RenderingContext.SRGB;\r\n SRGB8: typeof WebGL2RenderingContext.SRGB8 | EXT_sRGB[\"SRGB_ALPHA_EXT\"];\r\n SRGB8_ALPHA8: typeof WebGL2RenderingContext.SRGB8_ALPHA8 | EXT_sRGB[\"SRGB_ALPHA_EXT\"];\r\n };\r\n /**\r\n * Gets the options used for engine creation\r\n * @returns EngineOptions object\r\n */\r\n public getCreationOptions() {\r\n return this._creationOptions;\r\n }\r\n\r\n protected _highPrecisionShadersAllowed = true;\r\n /** @internal */\r\n public get _shouldUseHighPrecisionShader(): boolean {\r\n return !!(this._caps.highPrecisionShaderSupported && this._highPrecisionShadersAllowed);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that only power of 2 textures are supported\r\n * Please note that you can still use non power of 2 textures but in this case the engine will forcefully convert them\r\n */\r\n public get needPOTTextures(): boolean {\r\n return this._webGLVersion < 2 || this.forcePOTTextures;\r\n }\r\n\r\n /** @internal */\r\n public _badOS = false;\r\n\r\n /** @internal */\r\n public _badDesktopOS = false;\r\n\r\n /** @internal */\r\n public _hardwareScalingLevel: number;\r\n /** @internal */\r\n public _caps: EngineCapabilities;\r\n /** @internal */\r\n public _features: EngineFeatures;\r\n protected _isStencilEnable: boolean;\r\n\r\n private _glVersion: string;\r\n private _glRenderer: string;\r\n private _glVendor: string;\r\n\r\n /** @internal */\r\n public _videoTextureSupported: boolean;\r\n\r\n protected _activeRenderLoops = new Array<() => void>();\r\n\r\n /**\r\n * Gets the list of current active render loop functions\r\n * @returns a read only array with the current render loop functions\r\n */\r\n public get activeRenderLoops(): ReadonlyArray<() => void> {\r\n return this._activeRenderLoops;\r\n }\r\n\r\n // Lost context\r\n /**\r\n * Observable signaled when a context lost event is raised\r\n */\r\n public onContextLostObservable = new Observable();\r\n /**\r\n * Observable signaled when a context restored event is raised\r\n */\r\n public onContextRestoredObservable = new Observable();\r\n private _onContextLost: (evt: Event) => void;\r\n private _onContextRestored: (evt: Event) => void;\r\n protected _contextWasLost = false;\r\n\r\n /** @internal */\r\n public _doNotHandleContextLost = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if resources should be retained to be able to handle context lost events\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#handling-webgl-context-lost\r\n */\r\n public get doNotHandleContextLost(): boolean {\r\n return this._doNotHandleContextLost;\r\n }\r\n\r\n public set doNotHandleContextLost(value: boolean) {\r\n this._doNotHandleContextLost = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that vertex array object must be disabled even if they are supported\r\n */\r\n public disableVertexArrayObjects = false;\r\n\r\n // States\r\n /** @internal */\r\n protected _colorWrite = true;\r\n /** @internal */\r\n protected _colorWriteChanged = true;\r\n /** @internal */\r\n protected _depthCullingState = new DepthCullingState();\r\n /** @internal */\r\n protected _stencilStateComposer = new StencilStateComposer();\r\n /** @internal */\r\n protected _stencilState = new StencilState();\r\n /** @internal */\r\n public _alphaState = new AlphaState();\r\n /** @internal */\r\n public _alphaMode = Constants.ALPHA_ADD;\r\n /** @internal */\r\n public _alphaEquation = Constants.ALPHA_DISABLE;\r\n\r\n // Cache\r\n /** @internal */\r\n public _internalTexturesCache = new Array();\r\n /** @internal */\r\n public _renderTargetWrapperCache = new Array();\r\n /** @internal */\r\n protected _activeChannel = 0;\r\n private _currentTextureChannel = -1;\r\n /** @internal */\r\n protected _boundTexturesCache: { [key: string]: Nullable } = {};\r\n protected _currentEffect: Nullable;\r\n /** @internal */\r\n public _currentDrawContext: IDrawContext;\r\n /** @internal */\r\n public _currentMaterialContext: IMaterialContext;\r\n /** @internal */\r\n protected _currentProgram: Nullable;\r\n protected _compiledEffects: { [key: string]: Effect } = {};\r\n private _vertexAttribArraysEnabled: boolean[] = [];\r\n /** @internal */\r\n protected _cachedViewport: Nullable;\r\n private _cachedVertexArrayObject: Nullable;\r\n /** @internal */\r\n protected _cachedVertexBuffers: any;\r\n /** @internal */\r\n protected _cachedIndexBuffer: Nullable;\r\n /** @internal */\r\n protected _cachedEffectForVertexBuffers: Nullable;\r\n\r\n /** @internal */\r\n public _currentRenderTarget: Nullable = null;\r\n private _uintIndicesCurrentlySet = false;\r\n protected _currentBoundBuffer = new Array>();\r\n /** @internal */\r\n public _currentFramebuffer: Nullable = null;\r\n /** @internal */\r\n public _dummyFramebuffer: Nullable = null;\r\n private _currentBufferPointers = new Array();\r\n private _currentInstanceLocations = new Array();\r\n private _currentInstanceBuffers = new Array();\r\n private _textureUnits: Int32Array;\r\n\r\n /** @internal */\r\n public _workingCanvas: Nullable;\r\n /** @internal */\r\n public _workingContext: Nullable;\r\n\r\n /** @internal */\r\n public _boundRenderFunction: any = () => this._renderLoop();\r\n\r\n private _vaoRecordInProgress = false;\r\n private _mustWipeVertexAttributes = false;\r\n\r\n private _emptyTexture: Nullable;\r\n private _emptyCubeTexture: Nullable;\r\n private _emptyTexture3D: Nullable;\r\n private _emptyTexture2DArray: Nullable;\r\n\r\n /** @internal */\r\n public _frameHandler: number = 0;\r\n\r\n private _nextFreeTextureSlots = new Array();\r\n private _maxSimultaneousTextures = 0;\r\n private _maxMSAASamplesOverride: Nullable = null;\r\n\r\n private _activeRequests = new Array();\r\n\r\n /**\r\n * If set to true zooming in and out in the browser will rescale the hardware-scaling correctly.\r\n */\r\n public adaptToDeviceRatio: boolean = false;\r\n /** @internal */\r\n protected _lastDevicePixelRatio: number = 1.0;\r\n\r\n /** @internal */\r\n public _transformTextureUrl: Nullable<(url: string) => string> = null;\r\n\r\n /**\r\n * Gets information about the current host\r\n */\r\n public hostInformation: HostInformation = {\r\n isMobile: false,\r\n };\r\n\r\n protected get _supportsHardwareTextureRescaling() {\r\n return false;\r\n }\r\n\r\n protected _framebufferDimensionsObject: Nullable<{ framebufferWidth: number; framebufferHeight: number }>;\r\n\r\n /**\r\n * sets the object from which width and height will be taken from when getting render width and height\r\n * Will fallback to the gl object\r\n * @param dimensions the framebuffer width and height that will be used.\r\n */\r\n public set framebufferDimensionsObject(dimensions: Nullable<{ framebufferWidth: number; framebufferHeight: number }>) {\r\n this._framebufferDimensionsObject = dimensions;\r\n }\r\n\r\n /**\r\n * Gets the current viewport\r\n */\r\n public get currentViewport(): Nullable {\r\n return this._cachedViewport;\r\n }\r\n\r\n /**\r\n * Gets the default empty texture\r\n */\r\n public get emptyTexture(): InternalTexture {\r\n if (!this._emptyTexture) {\r\n this._emptyTexture = this.createRawTexture(new Uint8Array(4), 1, 1, Constants.TEXTUREFORMAT_RGBA, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n return this._emptyTexture;\r\n }\r\n\r\n /**\r\n * Gets the default empty 3D texture\r\n */\r\n public get emptyTexture3D(): InternalTexture {\r\n if (!this._emptyTexture3D) {\r\n this._emptyTexture3D = this.createRawTexture3D(new Uint8Array(4), 1, 1, 1, Constants.TEXTUREFORMAT_RGBA, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n return this._emptyTexture3D;\r\n }\r\n\r\n /**\r\n * Gets the default empty 2D array texture\r\n */\r\n public get emptyTexture2DArray(): InternalTexture {\r\n if (!this._emptyTexture2DArray) {\r\n this._emptyTexture2DArray = this.createRawTexture2DArray(\r\n new Uint8Array(4),\r\n 1,\r\n 1,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE\r\n );\r\n }\r\n\r\n return this._emptyTexture2DArray;\r\n }\r\n\r\n /**\r\n * Gets the default empty cube texture\r\n */\r\n public get emptyCubeTexture(): InternalTexture {\r\n if (!this._emptyCubeTexture) {\r\n const faceData = new Uint8Array(4);\r\n const cubeData = [faceData, faceData, faceData, faceData, faceData, faceData];\r\n this._emptyCubeTexture = this.createRawCubeTexture(\r\n cubeData,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n Constants.TEXTURETYPE_UNSIGNED_INT,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE\r\n );\r\n }\r\n\r\n return this._emptyCubeTexture;\r\n }\r\n\r\n /**\r\n * Defines whether the engine has been created with the premultipliedAlpha option on or not.\r\n */\r\n public premultipliedAlpha: boolean = true;\r\n\r\n /**\r\n * Observable event triggered before each texture is initialized\r\n */\r\n public onBeforeTextureInitObservable = new Observable();\r\n\r\n /** @internal */\r\n protected _isWebGPU: boolean = false;\r\n /**\r\n * Gets a boolean indicating if the engine runs in WebGPU or not.\r\n */\r\n public get isWebGPU(): boolean {\r\n return this._isWebGPU;\r\n }\r\n\r\n /** @internal */\r\n protected _shaderPlatformName: string;\r\n /**\r\n * Gets the shader platform name used by the effects.\r\n */\r\n public get shaderPlatformName(): string {\r\n return this._shaderPlatformName;\r\n }\r\n\r\n /**\r\n * Enables or disables the snapshot rendering mode\r\n * Note that the WebGL engine does not support snapshot rendering so setting the value won't have any effect for this engine\r\n */\r\n public get snapshotRendering(): boolean {\r\n return false;\r\n }\r\n\r\n public set snapshotRendering(activate) {\r\n // WebGL engine does not support snapshot rendering\r\n }\r\n\r\n protected _snapshotRenderingMode = Constants.SNAPSHOTRENDERING_STANDARD;\r\n /**\r\n * Gets or sets the snapshot rendering mode\r\n */\r\n public get snapshotRenderingMode(): number {\r\n return this._snapshotRenderingMode;\r\n }\r\n\r\n public set snapshotRenderingMode(mode: number) {\r\n this._snapshotRenderingMode = mode;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the exact sRGB conversions or faster approximations are used for converting to and from linear space.\r\n */\r\n public readonly useExactSrgbConversions: boolean;\r\n\r\n /**\r\n * Creates a new snapshot at the next frame using the current snapshotRenderingMode\r\n */\r\n public snapshotRenderingReset(): void {\r\n this.snapshotRendering = false;\r\n }\r\n\r\n private _checkForMobile: () => void;\r\n\r\n private static _CreateCanvas(width: number, height: number): ICanvas {\r\n if (typeof document === \"undefined\") {\r\n return (new OffscreenCanvas(width, height));\r\n }\r\n const canvas = (document.createElement(\"canvas\"));\r\n canvas.width = width;\r\n canvas.height = height;\r\n return canvas;\r\n }\r\n\r\n /**\r\n * Create a canvas. This method is overridden by other engines\r\n * @param width width\r\n * @param height height\r\n * @returns ICanvas interface\r\n */\r\n public createCanvas(width: number, height: number): ICanvas {\r\n return ThinEngine._CreateCanvas(width, height);\r\n }\r\n\r\n /**\r\n * Create an image to use with canvas\r\n * @returns IImage interface\r\n */\r\n public createCanvasImage(): IImage {\r\n return document.createElement(\"img\");\r\n }\r\n\r\n /**\r\n * Creates a new engine\r\n * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which already used the WebGL context\r\n * @param antialias defines enable antialiasing (default: false)\r\n * @param options defines further options to be sent to the getContext() function\r\n * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n constructor(\r\n canvasOrContext: Nullable,\r\n antialias?: boolean,\r\n options?: EngineOptions,\r\n adaptToDeviceRatio?: boolean\r\n ) {\r\n this.startTime = PrecisionDate.Now;\r\n\r\n let canvas: Nullable = null;\r\n\r\n options = options || {};\r\n\r\n this._creationOptions = options;\r\n\r\n // Save this off for use in resize().\r\n this.adaptToDeviceRatio = adaptToDeviceRatio ?? false;\r\n\r\n this._stencilStateComposer.stencilGlobal = this._stencilState;\r\n\r\n PerformanceConfigurator.SetMatrixPrecision(!!options.useHighPrecisionMatrix);\r\n\r\n options.antialias = antialias ?? options.antialias;\r\n options.deterministicLockstep = options.deterministicLockstep ?? false;\r\n options.lockstepMaxSteps = options.lockstepMaxSteps ?? 4;\r\n options.timeStep = options.timeStep ?? 1 / 60;\r\n options.audioEngine = options.audioEngine ?? true;\r\n options.stencil = options.stencil ?? true;\r\n\r\n this._audioContext = options.audioEngineOptions?.audioContext ?? null;\r\n this._audioDestination = options.audioEngineOptions?.audioDestination ?? null;\r\n this.premultipliedAlpha = options.premultipliedAlpha ?? true;\r\n this.useExactSrgbConversions = options.useExactSrgbConversions ?? false;\r\n this._doNotHandleContextLost = !!options.doNotHandleContextLost;\r\n this._isStencilEnable = options.stencil ? true : false;\r\n\r\n // Viewport\r\n adaptToDeviceRatio = adaptToDeviceRatio || options.adaptToDeviceRatio || false;\r\n\r\n const devicePixelRatio = IsWindowObjectExist() ? window.devicePixelRatio || 1.0 : 1.0;\r\n\r\n const limitDeviceRatio = options.limitDeviceRatio || devicePixelRatio;\r\n this._hardwareScalingLevel = adaptToDeviceRatio ? 1.0 / Math.min(limitDeviceRatio, devicePixelRatio) : 1.0;\r\n this._lastDevicePixelRatio = devicePixelRatio;\r\n\r\n if (!canvasOrContext) {\r\n return;\r\n }\r\n\r\n if ((canvasOrContext as any).getContext) {\r\n canvas = canvasOrContext;\r\n this._renderingCanvas = canvas;\r\n\r\n if (options.preserveDrawingBuffer === undefined) {\r\n options.preserveDrawingBuffer = false;\r\n }\r\n\r\n if (options.xrCompatible === undefined) {\r\n options.xrCompatible = true;\r\n }\r\n\r\n // Exceptions\r\n if (navigator && navigator.userAgent) {\r\n this._setupMobileChecks();\r\n\r\n const ua = navigator.userAgent;\r\n for (const exception of ThinEngine.ExceptionList) {\r\n const key = exception.key;\r\n const targets = exception.targets;\r\n const check = new RegExp(key);\r\n\r\n if (check.test(ua)) {\r\n if (exception.capture && exception.captureConstraint) {\r\n const capture = exception.capture;\r\n const constraint = exception.captureConstraint;\r\n\r\n const regex = new RegExp(capture);\r\n const matches = regex.exec(ua);\r\n\r\n if (matches && matches.length > 0) {\r\n const capturedValue = parseInt(matches[matches.length - 1]);\r\n if (capturedValue >= constraint) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n for (const target of targets) {\r\n switch (target) {\r\n case \"uniformBuffer\":\r\n this.disableUniformBuffers = true;\r\n break;\r\n case \"vao\":\r\n this.disableVertexArrayObjects = true;\r\n break;\r\n case \"antialias\":\r\n options.antialias = false;\r\n break;\r\n case \"maxMSAASamples\":\r\n this._maxMSAASamplesOverride = 1;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Context lost\r\n if (!this._doNotHandleContextLost) {\r\n this._onContextLost = (evt: Event) => {\r\n evt.preventDefault();\r\n this._contextWasLost = true;\r\n Logger.Warn(\"WebGL context lost.\");\r\n\r\n this.onContextLostObservable.notifyObservers(this);\r\n };\r\n\r\n this._onContextRestored = () => {\r\n this._restoreEngineAfterContextLost(() => this._initGLContext());\r\n };\r\n\r\n canvas.addEventListener(\"webglcontextlost\", this._onContextLost, false);\r\n canvas.addEventListener(\"webglcontextrestored\", this._onContextRestored, false);\r\n\r\n options.powerPreference = options.powerPreference || \"high-performance\";\r\n }\r\n\r\n // Detect if we are running on a faulty buggy desktop OS.\r\n this._badDesktopOS = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n if (this._badDesktopOS) {\r\n options.xrCompatible = false;\r\n }\r\n\r\n // GL\r\n if (!options.disableWebGL2Support) {\r\n try {\r\n this._gl = (canvas.getContext(\"webgl2\", options) || canvas.getContext(\"experimental-webgl2\", options));\r\n if (this._gl) {\r\n this._webGLVersion = 2.0;\r\n this._shaderPlatformName = \"WEBGL2\";\r\n\r\n // Prevent weird browsers to lie (yeah that happens!)\r\n if (!this._gl.deleteQuery) {\r\n this._webGLVersion = 1.0;\r\n this._shaderPlatformName = \"WEBGL1\";\r\n }\r\n }\r\n } catch (e) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n if (!this._gl) {\r\n if (!canvas) {\r\n throw new Error(\"The provided canvas is null or undefined.\");\r\n }\r\n try {\r\n this._gl = (canvas.getContext(\"webgl\", options) || canvas.getContext(\"experimental-webgl\", options));\r\n } catch (e) {\r\n throw new Error(\"WebGL not supported\");\r\n }\r\n }\r\n\r\n if (!this._gl) {\r\n throw new Error(\"WebGL not supported\");\r\n }\r\n } else {\r\n this._gl = canvasOrContext;\r\n this._renderingCanvas = this._gl.canvas as HTMLCanvasElement;\r\n\r\n if ((this._gl as any).renderbufferStorageMultisample) {\r\n this._webGLVersion = 2.0;\r\n this._shaderPlatformName = \"WEBGL2\";\r\n } else {\r\n this._shaderPlatformName = \"WEBGL1\";\r\n }\r\n\r\n const attributes = this._gl.getContextAttributes();\r\n if (attributes) {\r\n options.stencil = attributes.stencil;\r\n }\r\n }\r\n\r\n // Ensures a consistent color space unpacking of textures cross browser.\r\n this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE);\r\n\r\n if (options.useHighPrecisionFloats !== undefined) {\r\n this._highPrecisionShadersAllowed = options.useHighPrecisionFloats;\r\n }\r\n\r\n this.resize();\r\n\r\n this._initGLContext();\r\n this._initFeatures();\r\n\r\n // Prepare buffer pointers\r\n for (let i = 0; i < this._caps.maxVertexAttribs; i++) {\r\n this._currentBufferPointers[i] = new BufferPointer();\r\n }\r\n\r\n // Shader processor\r\n this._shaderProcessor = this.webGLVersion > 1 ? new WebGL2ShaderProcessor() : new WebGLShaderProcessor();\r\n\r\n // Detect if we are running on a faulty buggy OS.\r\n this._badOS = /iPad/i.test(navigator.userAgent) || /iPhone/i.test(navigator.userAgent);\r\n\r\n // Starting with iOS 14, we can trust the browser\r\n // let matches = navigator.userAgent.match(/Version\\/(\\d+)/);\r\n\r\n // if (matches && matches.length === 2) {\r\n // if (parseInt(matches[1]) >= 14) {\r\n // this._badOS = false;\r\n // }\r\n // }\r\n\r\n const versionToLog = `Babylon.js v${ThinEngine.Version}`;\r\n Logger.Log(versionToLog + ` - ${this.description}`);\r\n\r\n // Check setAttribute in case of workers\r\n if (this._renderingCanvas && this._renderingCanvas.setAttribute) {\r\n this._renderingCanvas.setAttribute(\"data-engine\", versionToLog);\r\n }\r\n }\r\n\r\n protected _setupMobileChecks(): void {\r\n if (!(navigator && navigator.userAgent)) {\r\n return;\r\n }\r\n\r\n // Function to check if running on mobile device\r\n this._checkForMobile = () => {\r\n const currentUA = navigator.userAgent;\r\n this.hostInformation.isMobile =\r\n currentUA.indexOf(\"Mobile\") !== -1 ||\r\n // Needed for iOS 13+ detection on iPad (inspired by solution from https://stackoverflow.com/questions/9038625/detect-if-device-is-ios)\r\n (currentUA.indexOf(\"Mac\") !== -1 && IsDocumentAvailable() && \"ontouchend\" in document);\r\n };\r\n\r\n // Set initial isMobile value\r\n this._checkForMobile();\r\n\r\n // Set up event listener to check when window is resized (used to get emulator activation to work properly)\r\n if (IsWindowObjectExist()) {\r\n window.addEventListener(\"resize\", this._checkForMobile);\r\n }\r\n }\r\n\r\n protected _clearEmptyResources(): void {\r\n this._dummyFramebuffer = null;\r\n this._emptyTexture = null;\r\n this._emptyCubeTexture = null;\r\n this._emptyTexture3D = null;\r\n this._emptyTexture2DArray = null;\r\n }\r\n\r\n protected _rebuildGraphicsResources(): void {\r\n // Ensure webgl and engine states are matching\r\n this.wipeCaches(true);\r\n\r\n // Rebuild effects\r\n this._rebuildEffects();\r\n this._rebuildComputeEffects?.();\r\n\r\n // Note:\r\n // The call to _rebuildBuffers must be made before the call to _rebuildInternalTextures because in the process of _rebuildBuffers the buffers used by the post process managers will be rebuilt\r\n // and we may need to use the post process manager of the scene during _rebuildInternalTextures (in WebGL1, non-POT textures are rescaled using a post process + post process manager of the scene)\r\n\r\n // Rebuild buffers\r\n this._rebuildBuffers();\r\n // Rebuild textures\r\n this._rebuildInternalTextures();\r\n // Rebuild textures\r\n this._rebuildTextures();\r\n // Rebuild textures\r\n this._rebuildRenderTargetWrappers();\r\n\r\n // Reset engine states after all the buffer/textures/... have been rebuilt\r\n this.wipeCaches(true);\r\n }\r\n\r\n protected _flagContextRestored(): void {\r\n Logger.Warn(this.name + \" context successfully restored.\");\r\n this.onContextRestoredObservable.notifyObservers(this);\r\n this._contextWasLost = false;\r\n }\r\n\r\n protected _restoreEngineAfterContextLost(initEngine: () => void): void {\r\n // Adding a timeout to avoid race condition at browser level\r\n setTimeout(async () => {\r\n this._clearEmptyResources();\r\n\r\n const depthTest = this._depthCullingState.depthTest; // backup those values because the call to initEngine / wipeCaches will reset them\r\n const depthFunc = this._depthCullingState.depthFunc;\r\n const depthMask = this._depthCullingState.depthMask;\r\n const stencilTest = this._stencilState.stencilTest;\r\n\r\n // Rebuild context\r\n await initEngine();\r\n this._rebuildGraphicsResources();\r\n\r\n this._depthCullingState.depthTest = depthTest;\r\n this._depthCullingState.depthFunc = depthFunc;\r\n this._depthCullingState.depthMask = depthMask;\r\n this._stencilState.stencilTest = stencilTest;\r\n\r\n this._flagContextRestored();\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Shared initialization across engines types.\r\n * @param canvas The canvas associated with this instance of the engine.\r\n */\r\n protected _sharedInit(canvas: HTMLCanvasElement) {\r\n this._renderingCanvas = canvas;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getShaderProcessingContext(shaderLanguage: ShaderLanguage): Nullable {\r\n return null;\r\n }\r\n\r\n private _rebuildInternalTextures(): void {\r\n const currentState = this._internalTexturesCache.slice(); // Do a copy because the rebuild will add proxies\r\n\r\n for (const internalTexture of currentState) {\r\n internalTexture._rebuild();\r\n }\r\n }\r\n\r\n private _rebuildRenderTargetWrappers(): void {\r\n const currentState = this._renderTargetWrapperCache.slice(); // Do a copy because the rebuild will add proxies\r\n\r\n for (const renderTargetWrapper of currentState) {\r\n renderTargetWrapper._rebuild();\r\n }\r\n }\r\n\r\n private _rebuildEffects(): void {\r\n for (const key in this._compiledEffects) {\r\n const effect = this._compiledEffects[key];\r\n\r\n effect._pipelineContext = null; // because _prepareEffect will try to dispose this pipeline before recreating it and that would lead to webgl errors\r\n effect._prepareEffect();\r\n }\r\n\r\n Effect.ResetCache();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if all created effects are ready\r\n * @returns true if all effects are ready\r\n */\r\n public areAllEffectsReady(): boolean {\r\n for (const key in this._compiledEffects) {\r\n const effect = this._compiledEffects[key];\r\n\r\n if (!effect.isReady()) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n protected _rebuildBuffers(): void {\r\n // Uniforms\r\n for (const uniformBuffer of this._uniformBuffers) {\r\n uniformBuffer._rebuildAfterContextLost();\r\n }\r\n }\r\n\r\n protected _rebuildTextures(): void {}\r\n\r\n protected _initGLContext(): void {\r\n // Caps\r\n this._caps = {\r\n maxTexturesImageUnits: this._gl.getParameter(this._gl.MAX_TEXTURE_IMAGE_UNITS),\r\n maxCombinedTexturesImageUnits: this._gl.getParameter(this._gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\r\n maxVertexTextureImageUnits: this._gl.getParameter(this._gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS),\r\n maxTextureSize: this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),\r\n maxSamples: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_SAMPLES) : 1,\r\n maxCubemapTextureSize: this._gl.getParameter(this._gl.MAX_CUBE_MAP_TEXTURE_SIZE),\r\n maxRenderTextureSize: this._gl.getParameter(this._gl.MAX_RENDERBUFFER_SIZE),\r\n maxVertexAttribs: this._gl.getParameter(this._gl.MAX_VERTEX_ATTRIBS),\r\n maxVaryingVectors: this._gl.getParameter(this._gl.MAX_VARYING_VECTORS),\r\n maxFragmentUniformVectors: this._gl.getParameter(this._gl.MAX_FRAGMENT_UNIFORM_VECTORS),\r\n maxVertexUniformVectors: this._gl.getParameter(this._gl.MAX_VERTEX_UNIFORM_VECTORS),\r\n parallelShaderCompile: this._gl.getExtension(\"KHR_parallel_shader_compile\") || undefined,\r\n standardDerivatives: this._webGLVersion > 1 || this._gl.getExtension(\"OES_standard_derivatives\") !== null,\r\n maxAnisotropy: 1,\r\n astc: this._gl.getExtension(\"WEBGL_compressed_texture_astc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_astc\"),\r\n bptc: this._gl.getExtension(\"EXT_texture_compression_bptc\") || this._gl.getExtension(\"WEBKIT_EXT_texture_compression_bptc\"),\r\n s3tc: this._gl.getExtension(\"WEBGL_compressed_texture_s3tc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc\"),\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n s3tc_srgb: this._gl.getExtension(\"WEBGL_compressed_texture_s3tc_srgb\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc_srgb\"),\r\n pvrtc: this._gl.getExtension(\"WEBGL_compressed_texture_pvrtc\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_pvrtc\"),\r\n etc1: this._gl.getExtension(\"WEBGL_compressed_texture_etc1\") || this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_etc1\"),\r\n etc2:\r\n this._gl.getExtension(\"WEBGL_compressed_texture_etc\") ||\r\n this._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_etc\") ||\r\n this._gl.getExtension(\"WEBGL_compressed_texture_es3_0\"), // also a requirement of OpenGL ES 3\r\n textureAnisotropicFilterExtension:\r\n this._gl.getExtension(\"EXT_texture_filter_anisotropic\") ||\r\n this._gl.getExtension(\"WEBKIT_EXT_texture_filter_anisotropic\") ||\r\n this._gl.getExtension(\"MOZ_EXT_texture_filter_anisotropic\"),\r\n uintIndices: this._webGLVersion > 1 || this._gl.getExtension(\"OES_element_index_uint\") !== null,\r\n fragmentDepthSupported: this._webGLVersion > 1 || this._gl.getExtension(\"EXT_frag_depth\") !== null,\r\n highPrecisionShaderSupported: false,\r\n timerQuery: this._gl.getExtension(\"EXT_disjoint_timer_query_webgl2\") || this._gl.getExtension(\"EXT_disjoint_timer_query\"),\r\n supportOcclusionQuery: this._webGLVersion > 1,\r\n canUseTimestampForTimerQuery: false,\r\n drawBuffersExtension: false,\r\n maxMSAASamples: 1,\r\n colorBufferFloat: !!(this._webGLVersion > 1 && this._gl.getExtension(\"EXT_color_buffer_float\")),\r\n supportFloatTexturesResolve: false,\r\n rg11b10ufColorRenderable: false,\r\n colorBufferHalfFloat: !!(this._webGLVersion > 1 && this._gl.getExtension(\"EXT_color_buffer_half_float\")),\r\n textureFloat: this._webGLVersion > 1 || this._gl.getExtension(\"OES_texture_float\") ? true : false,\r\n textureHalfFloat: this._webGLVersion > 1 || this._gl.getExtension(\"OES_texture_half_float\") ? true : false,\r\n textureHalfFloatRender: false,\r\n textureFloatLinearFiltering: false,\r\n textureFloatRender: false,\r\n textureHalfFloatLinearFiltering: false,\r\n vertexArrayObject: false,\r\n instancedArrays: false,\r\n textureLOD: this._webGLVersion > 1 || this._gl.getExtension(\"EXT_shader_texture_lod\") ? true : false,\r\n texelFetch: this._webGLVersion !== 1,\r\n blendMinMax: false,\r\n multiview: this._gl.getExtension(\"OVR_multiview2\"),\r\n oculusMultiview: this._gl.getExtension(\"OCULUS_multiview\"),\r\n depthTextureExtension: false,\r\n canUseGLInstanceID: this._webGLVersion > 1,\r\n canUseGLVertexID: this._webGLVersion > 1,\r\n supportComputeShaders: false,\r\n supportSRGBBuffers: false,\r\n supportTransformFeedbacks: this._webGLVersion > 1,\r\n textureMaxLevel: this._webGLVersion > 1,\r\n texture2DArrayMaxLayerCount: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_ARRAY_TEXTURE_LAYERS) : 128,\r\n disableMorphTargetTexture: false,\r\n };\r\n\r\n this._caps.supportFloatTexturesResolve = this._caps.colorBufferFloat;\r\n this._caps.rg11b10ufColorRenderable = this._caps.colorBufferFloat;\r\n\r\n // Infos\r\n this._glVersion = this._gl.getParameter(this._gl.VERSION);\r\n\r\n const rendererInfo: any = this._gl.getExtension(\"WEBGL_debug_renderer_info\");\r\n if (rendererInfo != null) {\r\n this._glRenderer = this._gl.getParameter(rendererInfo.UNMASKED_RENDERER_WEBGL);\r\n this._glVendor = this._gl.getParameter(rendererInfo.UNMASKED_VENDOR_WEBGL);\r\n }\r\n\r\n if (!this._glVendor) {\r\n this._glVendor = this._gl.getParameter(this._gl.VENDOR) || \"Unknown vendor\";\r\n }\r\n\r\n if (!this._glRenderer) {\r\n this._glRenderer = this._gl.getParameter(this._gl.RENDERER) || \"Unknown renderer\";\r\n }\r\n\r\n // Constants\r\n if (this._gl.HALF_FLOAT_OES !== 0x8d61) {\r\n this._gl.HALF_FLOAT_OES = 0x8d61; // Half floating-point type (16-bit).\r\n }\r\n if (this._gl.RGBA16F !== 0x881a) {\r\n this._gl.RGBA16F = 0x881a; // RGBA 16-bit floating-point color-renderable internal sized format.\r\n }\r\n if (this._gl.RGBA32F !== 0x8814) {\r\n this._gl.RGBA32F = 0x8814; // RGBA 32-bit floating-point color-renderable internal sized format.\r\n }\r\n if (this._gl.DEPTH24_STENCIL8 !== 35056) {\r\n this._gl.DEPTH24_STENCIL8 = 35056;\r\n }\r\n\r\n // Extensions\r\n if (this._caps.timerQuery) {\r\n if (this._webGLVersion === 1) {\r\n this._gl.getQuery = (this._caps.timerQuery).getQueryEXT.bind(this._caps.timerQuery);\r\n }\r\n // WebGLQuery casted to number to avoid TS error\r\n this._caps.canUseTimestampForTimerQuery = ((this._gl.getQuery(this._caps.timerQuery.TIMESTAMP_EXT, this._caps.timerQuery.QUERY_COUNTER_BITS_EXT) as number) ?? 0) > 0;\r\n }\r\n\r\n this._caps.maxAnisotropy = this._caps.textureAnisotropicFilterExtension\r\n ? this._gl.getParameter(this._caps.textureAnisotropicFilterExtension.MAX_TEXTURE_MAX_ANISOTROPY_EXT)\r\n : 0;\r\n this._caps.textureFloatLinearFiltering = this._caps.textureFloat && this._gl.getExtension(\"OES_texture_float_linear\") ? true : false;\r\n this._caps.textureFloatRender = this._caps.textureFloat && this._canRenderToFloatFramebuffer() ? true : false;\r\n this._caps.textureHalfFloatLinearFiltering =\r\n this._webGLVersion > 1 || (this._caps.textureHalfFloat && this._gl.getExtension(\"OES_texture_half_float_linear\")) ? true : false;\r\n\r\n // Compressed formats\r\n if (this._caps.astc) {\r\n this._gl.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = this._caps.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;\r\n }\r\n if (this._caps.bptc) {\r\n this._gl.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT = this._caps.bptc.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT;\r\n }\r\n if (this._caps.s3tc_srgb) {\r\n this._gl.COMPRESSED_SRGB_S3TC_DXT1_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_S3TC_DXT1_EXT;\r\n this._gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\r\n this._gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = this._caps.s3tc_srgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\r\n }\r\n if (this._caps.etc2) {\r\n this._gl.COMPRESSED_SRGB8_ETC2 = this._caps.etc2.COMPRESSED_SRGB8_ETC2;\r\n this._gl.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = this._caps.etc2.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;\r\n }\r\n\r\n // Checks if some of the format renders first to allow the use of webgl inspector.\r\n if (this._webGLVersion > 1) {\r\n if (this._gl.HALF_FLOAT_OES !== 0x140b) {\r\n this._gl.HALF_FLOAT_OES = 0x140b;\r\n }\r\n }\r\n this._caps.textureHalfFloatRender = this._caps.textureHalfFloat && this._canRenderToHalfFloatFramebuffer();\r\n // Draw buffers\r\n if (this._webGLVersion > 1) {\r\n this._caps.drawBuffersExtension = true;\r\n this._caps.maxMSAASamples = this._maxMSAASamplesOverride !== null ? this._maxMSAASamplesOverride : this._gl.getParameter(this._gl.MAX_SAMPLES);\r\n } else {\r\n const drawBuffersExtension = this._gl.getExtension(\"WEBGL_draw_buffers\");\r\n\r\n if (drawBuffersExtension !== null) {\r\n this._caps.drawBuffersExtension = true;\r\n this._gl.drawBuffers = drawBuffersExtension.drawBuffersWEBGL.bind(drawBuffersExtension);\r\n (this._gl.DRAW_FRAMEBUFFER as any) = this._gl.FRAMEBUFFER;\r\n\r\n for (let i = 0; i < 16; i++) {\r\n (this._gl)[\"COLOR_ATTACHMENT\" + i + \"_WEBGL\"] = (drawBuffersExtension)[\"COLOR_ATTACHMENT\" + i + \"_WEBGL\"];\r\n }\r\n }\r\n }\r\n\r\n // Depth Texture\r\n if (this._webGLVersion > 1) {\r\n this._caps.depthTextureExtension = true;\r\n } else {\r\n const depthTextureExtension = this._gl.getExtension(\"WEBGL_depth_texture\");\r\n\r\n if (depthTextureExtension != null) {\r\n this._caps.depthTextureExtension = true;\r\n this._gl.UNSIGNED_INT_24_8 = depthTextureExtension.UNSIGNED_INT_24_8_WEBGL;\r\n }\r\n }\r\n\r\n // Vertex array object\r\n if (this.disableVertexArrayObjects) {\r\n this._caps.vertexArrayObject = false;\r\n } else if (this._webGLVersion > 1) {\r\n this._caps.vertexArrayObject = true;\r\n } else {\r\n const vertexArrayObjectExtension = this._gl.getExtension(\"OES_vertex_array_object\");\r\n\r\n if (vertexArrayObjectExtension != null) {\r\n this._caps.vertexArrayObject = true;\r\n this._gl.createVertexArray = vertexArrayObjectExtension.createVertexArrayOES.bind(vertexArrayObjectExtension);\r\n this._gl.bindVertexArray = vertexArrayObjectExtension.bindVertexArrayOES.bind(vertexArrayObjectExtension);\r\n this._gl.deleteVertexArray = vertexArrayObjectExtension.deleteVertexArrayOES.bind(vertexArrayObjectExtension);\r\n }\r\n }\r\n\r\n // Instances count\r\n if (this._webGLVersion > 1) {\r\n this._caps.instancedArrays = true;\r\n } else {\r\n const instanceExtension = this._gl.getExtension(\"ANGLE_instanced_arrays\");\r\n\r\n if (instanceExtension != null) {\r\n this._caps.instancedArrays = true;\r\n this._gl.drawArraysInstanced = instanceExtension.drawArraysInstancedANGLE.bind(instanceExtension);\r\n this._gl.drawElementsInstanced = instanceExtension.drawElementsInstancedANGLE.bind(instanceExtension);\r\n this._gl.vertexAttribDivisor = instanceExtension.vertexAttribDivisorANGLE.bind(instanceExtension);\r\n } else {\r\n this._caps.instancedArrays = false;\r\n }\r\n }\r\n\r\n if (this._gl.getShaderPrecisionFormat) {\r\n const vertexhighp = this._gl.getShaderPrecisionFormat(this._gl.VERTEX_SHADER, this._gl.HIGH_FLOAT);\r\n const fragmenthighp = this._gl.getShaderPrecisionFormat(this._gl.FRAGMENT_SHADER, this._gl.HIGH_FLOAT);\r\n\r\n if (vertexhighp && fragmenthighp) {\r\n this._caps.highPrecisionShaderSupported = vertexhighp.precision !== 0 && fragmenthighp.precision !== 0;\r\n }\r\n }\r\n\r\n if (this._webGLVersion > 1) {\r\n this._caps.blendMinMax = true;\r\n } else {\r\n const blendMinMaxExtension = this._gl.getExtension(\"EXT_blend_minmax\");\r\n if (blendMinMaxExtension != null) {\r\n this._caps.blendMinMax = true;\r\n this._gl.MAX = blendMinMaxExtension.MAX_EXT as typeof WebGL2RenderingContext.MAX;\r\n this._gl.MIN = blendMinMaxExtension.MIN_EXT as typeof WebGL2RenderingContext.MIN;\r\n }\r\n }\r\n\r\n // sRGB buffers\r\n // only run this if not already set to true (in the constructor, for example)\r\n if (!this._caps.supportSRGBBuffers) {\r\n if (this._webGLVersion > 1) {\r\n this._caps.supportSRGBBuffers = true;\r\n this._glSRGBExtensionValues = {\r\n SRGB: WebGL2RenderingContext.SRGB,\r\n SRGB8: WebGL2RenderingContext.SRGB8,\r\n SRGB8_ALPHA8: WebGL2RenderingContext.SRGB8_ALPHA8,\r\n };\r\n } else {\r\n const sRGBExtension = this._gl.getExtension(\"EXT_sRGB\");\r\n\r\n if (sRGBExtension != null) {\r\n this._caps.supportSRGBBuffers = true;\r\n this._glSRGBExtensionValues = {\r\n SRGB: sRGBExtension.SRGB_EXT as typeof WebGL2RenderingContext.SRGB | EXT_sRGB[\"SRGB_EXT\"],\r\n SRGB8: sRGBExtension.SRGB_ALPHA_EXT as typeof WebGL2RenderingContext.SRGB8 | EXT_sRGB[\"SRGB_ALPHA_EXT\"],\r\n SRGB8_ALPHA8: sRGBExtension.SRGB_ALPHA_EXT as typeof WebGL2RenderingContext.SRGB8_ALPHA8 | EXT_sRGB[\"SRGB8_ALPHA8_EXT\"],\r\n };\r\n }\r\n }\r\n // take into account the forced state that was provided in options\r\n // When the issue in angle/chrome is fixed the flag should be taken into account only when it is explicitly defined\r\n this._caps.supportSRGBBuffers = this._caps.supportSRGBBuffers && !!(this._creationOptions && this._creationOptions.forceSRGBBufferSupportState);\r\n }\r\n\r\n // Depth buffer\r\n this._depthCullingState.depthTest = true;\r\n this._depthCullingState.depthFunc = this._gl.LEQUAL;\r\n this._depthCullingState.depthMask = true;\r\n\r\n // Texture maps\r\n this._maxSimultaneousTextures = this._caps.maxCombinedTexturesImageUnits;\r\n for (let slot = 0; slot < this._maxSimultaneousTextures; slot++) {\r\n this._nextFreeTextureSlots.push(slot);\r\n }\r\n\r\n if (this._glRenderer === \"Mali-G72\") {\r\n // Overcome a bug when using a texture to store morph targets on Mali-G72\r\n this._caps.disableMorphTargetTexture = true;\r\n }\r\n }\r\n\r\n protected _initFeatures(): void {\r\n this._features = {\r\n forceBitmapOverHTMLImageElement: typeof HTMLImageElement === \"undefined\",\r\n supportRenderAndCopyToLodForFloatTextures: this._webGLVersion !== 1,\r\n supportDepthStencilTexture: this._webGLVersion !== 1,\r\n supportShadowSamplers: this._webGLVersion !== 1,\r\n uniformBufferHardCheckMatrix: false,\r\n allowTexturePrefiltering: this._webGLVersion !== 1,\r\n trackUbosInFrame: false,\r\n checkUbosContentBeforeUpload: false,\r\n supportCSM: this._webGLVersion !== 1,\r\n basisNeedsPOT: this._webGLVersion === 1,\r\n support3DTextures: this._webGLVersion !== 1,\r\n needTypeSuffixInShaderConstants: this._webGLVersion !== 1,\r\n supportMSAA: this._webGLVersion !== 1,\r\n supportSSAO2: this._webGLVersion !== 1,\r\n supportExtendedTextureFormats: this._webGLVersion !== 1,\r\n supportSwitchCaseInShader: this._webGLVersion !== 1,\r\n supportSyncTextureRead: true,\r\n needsInvertingBitmap: true,\r\n useUBOBindingCache: true,\r\n needShaderCodeInlining: false,\r\n needToAlwaysBindUniformBuffers: false,\r\n supportRenderPasses: false,\r\n supportSpriteInstancing: true,\r\n forceVertexBufferStrideAndOffsetMultiple4Bytes: false,\r\n _collectUbosUpdatedInFrame: false,\r\n };\r\n }\r\n\r\n /**\r\n * Gets version of the current webGL context\r\n * Keep it for back compat - use version instead\r\n */\r\n public get webGLVersion(): number {\r\n return this._webGLVersion;\r\n }\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"Engine\" string\r\n */\r\n public getClassName(): string {\r\n return \"ThinEngine\";\r\n }\r\n\r\n /**\r\n * Returns true if the stencil buffer has been enabled through the creation option of the context.\r\n */\r\n public get isStencilEnable(): boolean {\r\n return this._isStencilEnable;\r\n }\r\n\r\n /** @internal */\r\n public _prepareWorkingCanvas(): void {\r\n if (this._workingCanvas) {\r\n return;\r\n }\r\n\r\n this._workingCanvas = this.createCanvas(1, 1);\r\n const context = this._workingCanvas.getContext(\"2d\");\r\n\r\n if (context) {\r\n this._workingContext = context;\r\n }\r\n }\r\n\r\n /**\r\n * Reset the texture cache to empty state\r\n */\r\n public resetTextureCache() {\r\n for (const key in this._boundTexturesCache) {\r\n if (!Object.prototype.hasOwnProperty.call(this._boundTexturesCache, key)) {\r\n continue;\r\n }\r\n this._boundTexturesCache[key] = null;\r\n }\r\n\r\n this._currentTextureChannel = -1;\r\n }\r\n\r\n /**\r\n * Gets an object containing information about the current engine context\r\n * @returns an object containing the vendor, the renderer and the version of the current engine context\r\n */\r\n public getInfo() {\r\n return this.getGlInfo();\r\n }\r\n\r\n /**\r\n * Gets an object containing information about the current webGL context\r\n * @returns an object containing the vendor, the renderer and the version of the current webGL context\r\n */\r\n public getGlInfo() {\r\n return {\r\n vendor: this._glVendor,\r\n renderer: this._glRenderer,\r\n version: this._glVersion,\r\n };\r\n }\r\n\r\n /**\r\n * Defines the hardware scaling level.\r\n * By default the hardware scaling level is computed from the window device ratio.\r\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\r\n * @param level defines the level to use\r\n */\r\n public setHardwareScalingLevel(level: number): void {\r\n this._hardwareScalingLevel = level;\r\n this.resize();\r\n }\r\n\r\n /**\r\n * Gets the current hardware scaling level.\r\n * By default the hardware scaling level is computed from the window device ratio.\r\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\r\n * @returns a number indicating the current hardware scaling level\r\n */\r\n public getHardwareScalingLevel(): number {\r\n return this._hardwareScalingLevel;\r\n }\r\n\r\n /**\r\n * Gets the list of loaded textures\r\n * @returns an array containing all loaded textures\r\n */\r\n public getLoadedTexturesCache(): InternalTexture[] {\r\n return this._internalTexturesCache;\r\n }\r\n\r\n /**\r\n * Gets the object containing all engine capabilities\r\n * @returns the EngineCapabilities object\r\n */\r\n public getCaps(): EngineCapabilities {\r\n return this._caps;\r\n }\r\n\r\n /**\r\n * stop executing a render loop function and remove it from the execution array\r\n * @param renderFunction defines the function to be removed. If not provided all functions will be removed.\r\n */\r\n public stopRenderLoop(renderFunction?: () => void): void {\r\n if (!renderFunction) {\r\n this._activeRenderLoops.length = 0;\r\n this._cancelFrame();\r\n return;\r\n }\r\n\r\n const index = this._activeRenderLoops.indexOf(renderFunction);\r\n\r\n if (index >= 0) {\r\n this._activeRenderLoops.splice(index, 1);\r\n if (this._activeRenderLoops.length == 0) {\r\n this._cancelFrame();\r\n }\r\n }\r\n }\r\n\r\n protected _cancelFrame() {\r\n if (this._frameHandler !== 0) {\r\n const handlerToCancel = this._frameHandler;\r\n this._frameHandler = 0;\r\n\r\n if (!IsWindowObjectExist()) {\r\n if (typeof cancelAnimationFrame === \"function\") {\r\n return cancelAnimationFrame(handlerToCancel);\r\n }\r\n } else {\r\n const { cancelAnimationFrame } = this.getHostWindow() || window;\r\n if (typeof cancelAnimationFrame === \"function\") {\r\n return cancelAnimationFrame(handlerToCancel);\r\n }\r\n }\r\n return clearTimeout(handlerToCancel);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _renderLoop(): void {\r\n this._frameHandler = 0;\r\n\r\n if (!this._contextWasLost) {\r\n let shouldRender = true;\r\n if (this._isDisposed || (!this.renderEvenInBackground && this._windowIsBackground)) {\r\n shouldRender = false;\r\n }\r\n\r\n if (shouldRender) {\r\n // Start new frame\r\n this.beginFrame();\r\n\r\n for (let index = 0; index < this._activeRenderLoops.length; index++) {\r\n const renderFunction = this._activeRenderLoops[index];\r\n\r\n renderFunction();\r\n }\r\n\r\n // Present\r\n this.endFrame();\r\n }\r\n }\r\n\r\n if (this._frameHandler === 0) {\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n }\r\n }\r\n\r\n /**\r\n * Gets the HTML canvas attached with the current webGL context\r\n * @returns a HTML canvas\r\n */\r\n public getRenderingCanvas(): Nullable {\r\n return this._renderingCanvas;\r\n }\r\n\r\n /**\r\n * Gets the audio context specified in engine initialization options\r\n * @returns an Audio Context\r\n */\r\n public getAudioContext(): Nullable {\r\n return this._audioContext;\r\n }\r\n\r\n /**\r\n * Gets the audio destination specified in engine initialization options\r\n * @returns an audio destination node\r\n */\r\n public getAudioDestination(): Nullable {\r\n return this._audioDestination;\r\n }\r\n\r\n /**\r\n * Gets host window\r\n * @returns the host window object\r\n */\r\n public getHostWindow(): Nullable {\r\n if (!IsWindowObjectExist()) {\r\n return null;\r\n }\r\n\r\n if (this._renderingCanvas && this._renderingCanvas.ownerDocument && this._renderingCanvas.ownerDocument.defaultView) {\r\n return this._renderingCanvas.ownerDocument.defaultView;\r\n }\r\n\r\n return window;\r\n }\r\n\r\n /**\r\n * Gets the current render width\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the current render width\r\n */\r\n public getRenderWidth(useScreen = false): number {\r\n if (!useScreen && this._currentRenderTarget) {\r\n return this._currentRenderTarget.width;\r\n }\r\n\r\n return this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferWidth : this._gl.drawingBufferWidth;\r\n }\r\n\r\n /**\r\n * Gets the current render height\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the current render height\r\n */\r\n public getRenderHeight(useScreen = false): number {\r\n if (!useScreen && this._currentRenderTarget) {\r\n return this._currentRenderTarget.height;\r\n }\r\n\r\n return this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferHeight : this._gl.drawingBufferHeight;\r\n }\r\n\r\n /**\r\n * Can be used to override the current requestAnimationFrame requester.\r\n * @internal\r\n */\r\n protected _queueNewFrame(bindedRenderFunction: any, requester?: any): number {\r\n return ThinEngine.QueueNewFrame(bindedRenderFunction, requester);\r\n }\r\n\r\n /**\r\n * Register and execute a render loop. The engine can have more than one render function\r\n * @param renderFunction defines the function to continuously execute\r\n */\r\n public runRenderLoop(renderFunction: () => void): void {\r\n if (this._activeRenderLoops.indexOf(renderFunction) !== -1) {\r\n return;\r\n }\r\n\r\n this._activeRenderLoops.push(renderFunction);\r\n\r\n // On the first added function, start the render loop.\r\n if (this._activeRenderLoops.length === 1 && this._frameHandler === 0) {\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current render buffer or the current render target (if any is set up)\r\n * @param color defines the color to use\r\n * @param backBuffer defines if the back buffer must be cleared\r\n * @param depth defines if the depth buffer must be cleared\r\n * @param stencil defines if the stencil buffer must be cleared\r\n */\r\n public clear(color: Nullable, backBuffer: boolean, depth: boolean, stencil: boolean = false): void {\r\n const useStencilGlobalOnly = this.stencilStateComposer.useStencilGlobalOnly;\r\n this.stencilStateComposer.useStencilGlobalOnly = true; // make sure the stencil mask is coming from the global stencil and not from a material (effect) which would currently be in effect\r\n\r\n this.applyStates();\r\n\r\n this.stencilStateComposer.useStencilGlobalOnly = useStencilGlobalOnly;\r\n\r\n let mode = 0;\r\n if (backBuffer && color) {\r\n let setBackBufferColor = true;\r\n if (this._currentRenderTarget) {\r\n const textureFormat = this._currentRenderTarget.texture?.format;\r\n if (\r\n textureFormat === Constants.TEXTUREFORMAT_RED_INTEGER ||\r\n textureFormat === Constants.TEXTUREFORMAT_RG_INTEGER ||\r\n textureFormat === Constants.TEXTUREFORMAT_RGB_INTEGER ||\r\n textureFormat === Constants.TEXTUREFORMAT_RGBA_INTEGER\r\n ) {\r\n const textureType = this._currentRenderTarget.texture?.type;\r\n if (textureType === Constants.TEXTURETYPE_UNSIGNED_INTEGER || textureType === Constants.TEXTURETYPE_UNSIGNED_SHORT) {\r\n ThinEngine._TempClearColorUint32[0] = color.r * 255;\r\n ThinEngine._TempClearColorUint32[1] = color.g * 255;\r\n ThinEngine._TempClearColorUint32[2] = color.b * 255;\r\n ThinEngine._TempClearColorUint32[3] = color.a * 255;\r\n this._gl.clearBufferuiv(this._gl.COLOR, 0, ThinEngine._TempClearColorUint32);\r\n setBackBufferColor = false;\r\n } else {\r\n ThinEngine._TempClearColorInt32[0] = color.r * 255;\r\n ThinEngine._TempClearColorInt32[1] = color.g * 255;\r\n ThinEngine._TempClearColorInt32[2] = color.b * 255;\r\n ThinEngine._TempClearColorInt32[3] = color.a * 255;\r\n this._gl.clearBufferiv(this._gl.COLOR, 0, ThinEngine._TempClearColorInt32);\r\n setBackBufferColor = false;\r\n }\r\n }\r\n }\r\n\r\n if (setBackBufferColor) {\r\n this._gl.clearColor(color.r, color.g, color.b, color.a !== undefined ? color.a : 1.0);\r\n mode |= this._gl.COLOR_BUFFER_BIT;\r\n }\r\n }\r\n\r\n if (depth) {\r\n if (this.useReverseDepthBuffer) {\r\n this._depthCullingState.depthFunc = this._gl.GEQUAL;\r\n this._gl.clearDepth(0.0);\r\n } else {\r\n this._gl.clearDepth(1.0);\r\n }\r\n mode |= this._gl.DEPTH_BUFFER_BIT;\r\n }\r\n if (stencil) {\r\n this._gl.clearStencil(0);\r\n mode |= this._gl.STENCIL_BUFFER_BIT;\r\n }\r\n this._gl.clear(mode);\r\n }\r\n\r\n protected _viewportCached = { x: 0, y: 0, z: 0, w: 0 };\r\n\r\n /**\r\n * @internal\r\n */\r\n public _viewport(x: number, y: number, width: number, height: number): void {\r\n if (x !== this._viewportCached.x || y !== this._viewportCached.y || width !== this._viewportCached.z || height !== this._viewportCached.w) {\r\n this._viewportCached.x = x;\r\n this._viewportCached.y = y;\r\n this._viewportCached.z = width;\r\n this._viewportCached.w = height;\r\n\r\n this._gl.viewport(x, y, width, height);\r\n }\r\n }\r\n\r\n /**\r\n * Set the WebGL's viewport\r\n * @param viewport defines the viewport element to be used\r\n * @param requiredWidth defines the width required for rendering. If not provided the rendering canvas' width is used\r\n * @param requiredHeight defines the height required for rendering. If not provided the rendering canvas' height is used\r\n */\r\n public setViewport(viewport: IViewportLike, requiredWidth?: number, requiredHeight?: number): void {\r\n const width = requiredWidth || this.getRenderWidth();\r\n const height = requiredHeight || this.getRenderHeight();\r\n const x = viewport.x || 0;\r\n const y = viewport.y || 0;\r\n\r\n this._cachedViewport = viewport;\r\n\r\n this._viewport(x * width, y * height, width * viewport.width, height * viewport.height);\r\n }\r\n\r\n /**\r\n * Begin a new frame\r\n */\r\n public beginFrame(): void {}\r\n\r\n /**\r\n * Enf the current frame\r\n */\r\n public endFrame(): void {\r\n // Force a flush in case we are using a bad OS.\r\n if (this._badOS) {\r\n this.flushFramebuffer();\r\n }\r\n this._frameId++;\r\n }\r\n\r\n /**\r\n * Resize the view according to the canvas' size\r\n * @param forceSetSize true to force setting the sizes of the underlying canvas\r\n */\r\n public resize(forceSetSize = false): void {\r\n let width: number;\r\n let height: number;\r\n\r\n // Re-query hardware scaling level to handle zoomed-in resizing.\r\n if (this.adaptToDeviceRatio) {\r\n const devicePixelRatio = IsWindowObjectExist() ? window.devicePixelRatio || 1.0 : 1.0;\r\n const changeRatio = this._lastDevicePixelRatio / devicePixelRatio;\r\n this._lastDevicePixelRatio = devicePixelRatio;\r\n this._hardwareScalingLevel *= changeRatio;\r\n }\r\n\r\n if (IsWindowObjectExist() && IsDocumentAvailable()) {\r\n // make sure it is a Node object, and is a part of the document.\r\n if (this._renderingCanvas) {\r\n const boundingRect = this._renderingCanvas.getBoundingClientRect\r\n ? this._renderingCanvas.getBoundingClientRect()\r\n : {\r\n // fallback to last solution in case the function doesn't exist\r\n width: this._renderingCanvas.width * this._hardwareScalingLevel,\r\n height: this._renderingCanvas.height * this._hardwareScalingLevel,\r\n };\r\n width = this._renderingCanvas.clientWidth || boundingRect.width || this._renderingCanvas.width || 100;\r\n height = this._renderingCanvas.clientHeight || boundingRect.height || this._renderingCanvas.height || 100;\r\n } else {\r\n width = window.innerWidth;\r\n height = window.innerHeight;\r\n }\r\n } else {\r\n width = this._renderingCanvas ? this._renderingCanvas.width : 100;\r\n height = this._renderingCanvas ? this._renderingCanvas.height : 100;\r\n }\r\n\r\n this.setSize(width / this._hardwareScalingLevel, height / this._hardwareScalingLevel, forceSetSize);\r\n }\r\n\r\n /**\r\n * Force a specific size of the canvas\r\n * @param width defines the new canvas' width\r\n * @param height defines the new canvas' height\r\n * @param forceSetSize true to force setting the sizes of the underlying canvas\r\n * @returns true if the size was changed\r\n */\r\n public setSize(width: number, height: number, forceSetSize = false): boolean {\r\n if (!this._renderingCanvas) {\r\n return false;\r\n }\r\n\r\n width = width | 0;\r\n height = height | 0;\r\n\r\n if (!forceSetSize && this._renderingCanvas.width === width && this._renderingCanvas.height === height) {\r\n return false;\r\n }\r\n\r\n this._renderingCanvas.width = width;\r\n this._renderingCanvas.height = height;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Binds the frame buffer to the specified texture.\r\n * @param rtWrapper The render target wrapper to render to\r\n * @param faceIndex The face of the texture to render to in case of cube texture and if the render target wrapper is not a multi render target\r\n * @param requiredWidth The width of the target to render to\r\n * @param requiredHeight The height of the target to render to\r\n * @param forceFullscreenViewport Forces the viewport to be the entire texture/screen if true\r\n * @param lodLevel Defines the lod level to bind to the frame buffer\r\n * @param layer Defines the 2d array index to bind to the frame buffer if the render target wrapper is not a multi render target\r\n */\r\n public bindFramebuffer(\r\n rtWrapper: RenderTargetWrapper,\r\n faceIndex: number = 0,\r\n requiredWidth?: number,\r\n requiredHeight?: number,\r\n forceFullscreenViewport?: boolean,\r\n lodLevel = 0,\r\n layer = 0\r\n ): void {\r\n const webglRTWrapper = rtWrapper as WebGLRenderTargetWrapper;\r\n\r\n if (this._currentRenderTarget) {\r\n this.unBindFramebuffer(this._currentRenderTarget);\r\n }\r\n this._currentRenderTarget = rtWrapper;\r\n this._bindUnboundFramebuffer(webglRTWrapper._MSAAFramebuffer ? webglRTWrapper._MSAAFramebuffer : webglRTWrapper._framebuffer);\r\n\r\n const gl = this._gl;\r\n if (!rtWrapper.isMulti) {\r\n if (rtWrapper.is2DArray || rtWrapper.is3D) {\r\n gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, rtWrapper.texture!._hardwareTexture?.underlyingResource, lodLevel, layer);\r\n } else if (rtWrapper.isCube) {\r\n gl.framebufferTexture2D(\r\n gl.FRAMEBUFFER,\r\n gl.COLOR_ATTACHMENT0,\r\n gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex,\r\n rtWrapper.texture!._hardwareTexture?.underlyingResource,\r\n lodLevel\r\n );\r\n } else if (webglRTWrapper._currentLOD !== lodLevel) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, rtWrapper.texture!._hardwareTexture?.underlyingResource, lodLevel);\r\n webglRTWrapper._currentLOD = lodLevel;\r\n }\r\n }\r\n\r\n const depthStencilTexture = rtWrapper._depthStencilTexture;\r\n if (depthStencilTexture) {\r\n if (rtWrapper.is3D) {\r\n if (\r\n rtWrapper.texture!.width !== depthStencilTexture.width ||\r\n rtWrapper.texture!.height !== depthStencilTexture.height ||\r\n rtWrapper.texture!.depth !== depthStencilTexture.depth\r\n ) {\r\n Logger.Warn(\"Depth/Stencil attachment for 3D target must have same dimensions as color attachment\");\r\n }\r\n }\r\n const attachment = rtWrapper._depthStencilTextureWithStencil ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\r\n if (rtWrapper.is2DArray || rtWrapper.is3D) {\r\n gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachment, depthStencilTexture._hardwareTexture?.underlyingResource, lodLevel, layer);\r\n } else if (rtWrapper.isCube) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, depthStencilTexture._hardwareTexture?.underlyingResource, lodLevel);\r\n } else {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, depthStencilTexture._hardwareTexture?.underlyingResource, lodLevel);\r\n }\r\n }\r\n\r\n if (this._cachedViewport && !forceFullscreenViewport) {\r\n this.setViewport(this._cachedViewport, requiredWidth, requiredHeight);\r\n } else {\r\n if (!requiredWidth) {\r\n requiredWidth = rtWrapper.width;\r\n if (lodLevel) {\r\n requiredWidth = requiredWidth / Math.pow(2, lodLevel);\r\n }\r\n }\r\n if (!requiredHeight) {\r\n requiredHeight = rtWrapper.height;\r\n if (lodLevel) {\r\n requiredHeight = requiredHeight / Math.pow(2, lodLevel);\r\n }\r\n }\r\n\r\n this._viewport(0, 0, requiredWidth, requiredHeight);\r\n }\r\n\r\n this.wipeCaches();\r\n }\r\n\r\n /**\r\n * Set various states to the webGL context\r\n * @param culling defines culling state: true to enable culling, false to disable it\r\n * @param zOffset defines the value to apply to zOffset (0 by default)\r\n * @param force defines if states must be applied even if cache is up to date\r\n * @param reverseSide defines if culling must be reversed (CCW if false, CW if true)\r\n * @param cullBackFaces true to cull back faces, false to cull front faces (if culling is enabled)\r\n * @param stencil stencil states to set\r\n * @param zOffsetUnits defines the value to apply to zOffsetUnits (0 by default)\r\n */\r\n public setState(culling: boolean, zOffset: number = 0, force?: boolean, reverseSide = false, cullBackFaces?: boolean, stencil?: IStencilState, zOffsetUnits: number = 0): void {\r\n // Culling\r\n if (this._depthCullingState.cull !== culling || force) {\r\n this._depthCullingState.cull = culling;\r\n }\r\n\r\n // Cull face\r\n const cullFace = this.cullBackFaces ?? cullBackFaces ?? true ? this._gl.BACK : this._gl.FRONT;\r\n if (this._depthCullingState.cullFace !== cullFace || force) {\r\n this._depthCullingState.cullFace = cullFace;\r\n }\r\n\r\n // Z offset\r\n this.setZOffset(zOffset);\r\n this.setZOffsetUnits(zOffsetUnits);\r\n\r\n // Front face\r\n const frontFace = reverseSide ? this._gl.CW : this._gl.CCW;\r\n if (this._depthCullingState.frontFace !== frontFace || force) {\r\n this._depthCullingState.frontFace = frontFace;\r\n }\r\n\r\n this._stencilStateComposer.stencilMaterial = stencil;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if depth testing is enabled\r\n * @returns the current state\r\n */\r\n public getDepthBuffer(): boolean {\r\n return this._depthCullingState.depthTest;\r\n }\r\n\r\n /**\r\n * Enable or disable depth buffering\r\n * @param enable defines the state to set\r\n */\r\n public setDepthBuffer(enable: boolean): void {\r\n this._depthCullingState.depthTest = enable;\r\n }\r\n\r\n /**\r\n * Set the z offset Factor to apply to current rendering\r\n * @param value defines the offset to apply\r\n */\r\n public setZOffset(value: number): void {\r\n this._depthCullingState.zOffset = this.useReverseDepthBuffer ? -value : value;\r\n }\r\n\r\n /**\r\n * Gets the current value of the zOffset Factor\r\n * @returns the current zOffset Factor state\r\n */\r\n public getZOffset(): number {\r\n const zOffset = this._depthCullingState.zOffset;\r\n return this.useReverseDepthBuffer ? -zOffset : zOffset;\r\n }\r\n\r\n /**\r\n * Set the z offset Units to apply to current rendering\r\n * @param value defines the offset to apply\r\n */\r\n public setZOffsetUnits(value: number): void {\r\n this._depthCullingState.zOffsetUnits = this.useReverseDepthBuffer ? -value : value;\r\n }\r\n\r\n /**\r\n * Gets the current value of the zOffset Units\r\n * @returns the current zOffset Units state\r\n */\r\n public getZOffsetUnits(): number {\r\n const zOffsetUnits = this._depthCullingState.zOffsetUnits;\r\n return this.useReverseDepthBuffer ? -zOffsetUnits : zOffsetUnits;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bindUnboundFramebuffer(framebuffer: Nullable) {\r\n if (this._currentFramebuffer !== framebuffer) {\r\n this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\r\n this._currentFramebuffer = framebuffer;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _currentFrameBufferIsDefaultFrameBuffer() {\r\n return this._currentFramebuffer === null;\r\n }\r\n\r\n /**\r\n * Generates the mipmaps for a texture\r\n * @param texture texture to generate the mipmaps for\r\n */\r\n public generateMipmaps(texture: InternalTexture): void {\r\n const target = this._getTextureTarget(texture);\r\n this._bindTextureDirectly(target, texture, true);\r\n this._gl.generateMipmap(target);\r\n this._bindTextureDirectly(target, null);\r\n }\r\n\r\n /**\r\n * Unbind the current render target texture from the webGL context\r\n * @param texture defines the render target wrapper to unbind\r\n * @param disableGenerateMipMaps defines a boolean indicating that mipmaps must not be generated\r\n * @param onBeforeUnbind defines a function which will be called before the effective unbind\r\n */\r\n public unBindFramebuffer(texture: RenderTargetWrapper, disableGenerateMipMaps = false, onBeforeUnbind?: () => void): void {\r\n const webglRTWrapper = texture as WebGLRenderTargetWrapper;\r\n\r\n this._currentRenderTarget = null;\r\n\r\n // If MSAA, we need to bitblt back to main texture\r\n const gl = this._gl;\r\n if (webglRTWrapper._MSAAFramebuffer) {\r\n if (texture.isMulti) {\r\n // This texture is part of a MRT texture, we need to treat all attachments\r\n this.unBindMultiColorAttachmentFramebuffer(texture, disableGenerateMipMaps, onBeforeUnbind);\r\n return;\r\n }\r\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, webglRTWrapper._MSAAFramebuffer);\r\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, webglRTWrapper._framebuffer);\r\n gl.blitFramebuffer(0, 0, texture.width, texture.height, 0, 0, texture.width, texture.height, gl.COLOR_BUFFER_BIT, gl.NEAREST);\r\n }\r\n\r\n if (texture.texture?.generateMipMaps && !disableGenerateMipMaps && !texture.isCube) {\r\n this.generateMipmaps(texture.texture);\r\n }\r\n\r\n if (onBeforeUnbind) {\r\n if (webglRTWrapper._MSAAFramebuffer) {\r\n // Bind the correct framebuffer\r\n this._bindUnboundFramebuffer(webglRTWrapper._framebuffer);\r\n }\r\n onBeforeUnbind();\r\n }\r\n\r\n this._bindUnboundFramebuffer(null);\r\n }\r\n\r\n /**\r\n * Force a webGL flush (ie. a flush of all waiting webGL commands)\r\n */\r\n public flushFramebuffer(): void {\r\n this._gl.flush();\r\n }\r\n\r\n /**\r\n * Unbind the current render target and bind the default framebuffer\r\n */\r\n public restoreDefaultFramebuffer(): void {\r\n if (this._currentRenderTarget) {\r\n this.unBindFramebuffer(this._currentRenderTarget);\r\n } else {\r\n this._bindUnboundFramebuffer(null);\r\n }\r\n if (this._cachedViewport) {\r\n this.setViewport(this._cachedViewport);\r\n }\r\n\r\n this.wipeCaches();\r\n }\r\n\r\n // VBOs\r\n\r\n /** @internal */\r\n protected _resetVertexBufferBinding(): void {\r\n this.bindArrayBuffer(null);\r\n this._cachedVertexBuffers = null;\r\n }\r\n\r\n /**\r\n * Creates a vertex buffer\r\n * @param data the data or size for the vertex buffer\r\n * @param _updatable whether the buffer should be created as updatable\r\n * @param _label defines the label of the buffer (for debug purpose)\r\n * @returns the new WebGL static buffer\r\n */\r\n public createVertexBuffer(data: DataArray | number, _updatable?: boolean, _label?: string): DataBuffer {\r\n return this._createVertexBuffer(data, this._gl.STATIC_DRAW);\r\n }\r\n\r\n private _createVertexBuffer(data: DataArray | number, usage: number): DataBuffer {\r\n const vbo = this._gl.createBuffer();\r\n\r\n if (!vbo) {\r\n throw new Error(\"Unable to create vertex buffer\");\r\n }\r\n\r\n const dataBuffer = new WebGLDataBuffer(vbo);\r\n this.bindArrayBuffer(dataBuffer);\r\n\r\n if (typeof data !== \"number\") {\r\n if (data instanceof Array) {\r\n this._gl.bufferData(this._gl.ARRAY_BUFFER, new Float32Array(data), usage);\r\n dataBuffer.capacity = data.length * 4;\r\n } else {\r\n this._gl.bufferData(this._gl.ARRAY_BUFFER, data, usage);\r\n dataBuffer.capacity = data.byteLength;\r\n }\r\n } else {\r\n this._gl.bufferData(this._gl.ARRAY_BUFFER, new Uint8Array(data), usage);\r\n dataBuffer.capacity = data;\r\n }\r\n\r\n this._resetVertexBufferBinding();\r\n\r\n dataBuffer.references = 1;\r\n return dataBuffer;\r\n }\r\n\r\n /**\r\n * Creates a dynamic vertex buffer\r\n * @param data the data for the dynamic vertex buffer\r\n * @param _label defines the label of the buffer (for debug purpose)\r\n * @returns the new WebGL dynamic buffer\r\n */\r\n public createDynamicVertexBuffer(data: DataArray | number, _label?: string): DataBuffer {\r\n return this._createVertexBuffer(data, this._gl.DYNAMIC_DRAW);\r\n }\r\n\r\n protected _resetIndexBufferBinding(): void {\r\n this.bindIndexBuffer(null);\r\n this._cachedIndexBuffer = null;\r\n }\r\n\r\n /**\r\n * Creates a new index buffer\r\n * @param indices defines the content of the index buffer\r\n * @param updatable defines if the index buffer must be updatable\r\n * @param _label defines the label of the buffer (for debug purpose)\r\n * @returns a new webGL buffer\r\n */\r\n public createIndexBuffer(indices: IndicesArray, updatable?: boolean, _label?: string): DataBuffer {\r\n const vbo = this._gl.createBuffer();\r\n const dataBuffer = new WebGLDataBuffer(vbo!);\r\n\r\n if (!vbo) {\r\n throw new Error(\"Unable to create index buffer\");\r\n }\r\n\r\n this.bindIndexBuffer(dataBuffer);\r\n\r\n const data = this._normalizeIndexData(indices);\r\n this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, data, updatable ? this._gl.DYNAMIC_DRAW : this._gl.STATIC_DRAW);\r\n this._resetIndexBufferBinding();\r\n dataBuffer.references = 1;\r\n dataBuffer.is32Bits = data.BYTES_PER_ELEMENT === 4;\r\n return dataBuffer;\r\n }\r\n\r\n protected _normalizeIndexData(indices: IndicesArray): Uint16Array | Uint32Array {\r\n const bytesPerElement = (indices as Exclude).BYTES_PER_ELEMENT;\r\n if (bytesPerElement === 2) {\r\n return indices as Uint16Array;\r\n }\r\n\r\n // Check 32 bit support\r\n if (this._caps.uintIndices) {\r\n if (indices instanceof Uint32Array) {\r\n return indices;\r\n } else {\r\n // number[] or Int32Array, check if 32 bit is necessary\r\n for (let index = 0; index < indices.length; index++) {\r\n if (indices[index] >= 65535) {\r\n return new Uint32Array(indices);\r\n }\r\n }\r\n\r\n return new Uint16Array(indices);\r\n }\r\n }\r\n\r\n // No 32 bit support, force conversion to 16 bit (values greater 16 bit are lost)\r\n return new Uint16Array(indices);\r\n }\r\n\r\n /**\r\n * Bind a webGL buffer to the webGL context\r\n * @param buffer defines the buffer to bind\r\n */\r\n public bindArrayBuffer(buffer: Nullable): void {\r\n if (!this._vaoRecordInProgress) {\r\n this._unbindVertexArrayObject();\r\n }\r\n this._bindBuffer(buffer, this._gl.ARRAY_BUFFER);\r\n }\r\n\r\n /**\r\n * Bind a specific block at a given index in a specific shader program\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param blockName defines the block name\r\n * @param index defines the index where to bind the block\r\n */\r\n public bindUniformBlock(pipelineContext: IPipelineContext, blockName: string, index: number): void {\r\n const program = (pipelineContext as WebGLPipelineContext).program!;\r\n\r\n const uniformLocation = this._gl.getUniformBlockIndex(program, blockName);\r\n\r\n this._gl.uniformBlockBinding(program, uniformLocation, index);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected bindIndexBuffer(buffer: Nullable): void {\r\n if (!this._vaoRecordInProgress) {\r\n this._unbindVertexArrayObject();\r\n }\r\n this._bindBuffer(buffer, this._gl.ELEMENT_ARRAY_BUFFER);\r\n }\r\n\r\n private _bindBuffer(buffer: Nullable, target: number): void {\r\n if (this._vaoRecordInProgress || this._currentBoundBuffer[target] !== buffer) {\r\n this._gl.bindBuffer(target, buffer ? buffer.underlyingResource : null);\r\n this._currentBoundBuffer[target] = buffer;\r\n }\r\n }\r\n\r\n /**\r\n * update the bound buffer with the given data\r\n * @param data defines the data to update\r\n */\r\n public updateArrayBuffer(data: Float32Array): void {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data);\r\n }\r\n\r\n private _vertexAttribPointer(buffer: DataBuffer, indx: number, size: number, type: number, normalized: boolean, stride: number, offset: number): void {\r\n const pointer = this._currentBufferPointers[indx];\r\n if (!pointer) {\r\n return;\r\n }\r\n\r\n let changed = false;\r\n if (!pointer.active) {\r\n changed = true;\r\n pointer.active = true;\r\n pointer.index = indx;\r\n pointer.size = size;\r\n pointer.type = type;\r\n pointer.normalized = normalized;\r\n pointer.stride = stride;\r\n pointer.offset = offset;\r\n pointer.buffer = buffer;\r\n } else {\r\n if (pointer.buffer !== buffer) {\r\n pointer.buffer = buffer;\r\n changed = true;\r\n }\r\n if (pointer.size !== size) {\r\n pointer.size = size;\r\n changed = true;\r\n }\r\n if (pointer.type !== type) {\r\n pointer.type = type;\r\n changed = true;\r\n }\r\n if (pointer.normalized !== normalized) {\r\n pointer.normalized = normalized;\r\n changed = true;\r\n }\r\n if (pointer.stride !== stride) {\r\n pointer.stride = stride;\r\n changed = true;\r\n }\r\n if (pointer.offset !== offset) {\r\n pointer.offset = offset;\r\n changed = true;\r\n }\r\n }\r\n\r\n if (changed || this._vaoRecordInProgress) {\r\n this.bindArrayBuffer(buffer);\r\n if (type === this._gl.UNSIGNED_INT || type === this._gl.INT) {\r\n this._gl.vertexAttribIPointer(indx, size, type, stride, offset);\r\n } else {\r\n this._gl.vertexAttribPointer(indx, size, type, normalized, stride, offset);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bindIndexBufferWithCache(indexBuffer: Nullable): void {\r\n if (indexBuffer == null) {\r\n return;\r\n }\r\n if (this._cachedIndexBuffer !== indexBuffer) {\r\n this._cachedIndexBuffer = indexBuffer;\r\n this.bindIndexBuffer(indexBuffer);\r\n this._uintIndicesCurrentlySet = indexBuffer.is32Bits;\r\n }\r\n }\r\n\r\n private _bindVertexBuffersAttributes(\r\n vertexBuffers: { [key: string]: Nullable },\r\n effect: Effect,\r\n overrideVertexBuffers?: { [kind: string]: Nullable }\r\n ): void {\r\n const attributes = effect.getAttributesNames();\r\n\r\n if (!this._vaoRecordInProgress) {\r\n this._unbindVertexArrayObject();\r\n }\r\n\r\n this.unbindAllAttributes();\r\n\r\n for (let index = 0; index < attributes.length; index++) {\r\n const order = effect.getAttributeLocation(index);\r\n\r\n if (order >= 0) {\r\n const ai = attributes[index];\r\n let vertexBuffer: Nullable = null;\r\n\r\n if (overrideVertexBuffers) {\r\n vertexBuffer = overrideVertexBuffers[ai];\r\n }\r\n\r\n if (!vertexBuffer) {\r\n vertexBuffer = vertexBuffers[ai];\r\n }\r\n\r\n if (!vertexBuffer) {\r\n continue;\r\n }\r\n\r\n this._gl.enableVertexAttribArray(order);\r\n if (!this._vaoRecordInProgress) {\r\n this._vertexAttribArraysEnabled[order] = true;\r\n }\r\n\r\n const buffer = vertexBuffer.getBuffer();\r\n if (buffer) {\r\n this._vertexAttribPointer(buffer, order, vertexBuffer.getSize(), vertexBuffer.type, vertexBuffer.normalized, vertexBuffer.byteStride, vertexBuffer.byteOffset);\r\n\r\n if (vertexBuffer.getIsInstanced()) {\r\n this._gl.vertexAttribDivisor(order, vertexBuffer.getInstanceDivisor());\r\n if (!this._vaoRecordInProgress) {\r\n this._currentInstanceLocations.push(order);\r\n this._currentInstanceBuffers.push(buffer);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Records a vertex array object\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#vertex-array-objects\r\n * @param vertexBuffers defines the list of vertex buffers to store\r\n * @param indexBuffer defines the index buffer to store\r\n * @param effect defines the effect to store\r\n * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers\r\n * @returns the new vertex array object\r\n */\r\n public recordVertexArrayObject(\r\n vertexBuffers: { [key: string]: VertexBuffer },\r\n indexBuffer: Nullable,\r\n effect: Effect,\r\n overrideVertexBuffers?: { [kind: string]: Nullable }\r\n ): WebGLVertexArrayObject {\r\n const vao = this._gl.createVertexArray();\r\n\r\n if (!vao) {\r\n throw new Error(\"Unable to create VAO\");\r\n }\r\n\r\n this._vaoRecordInProgress = true;\r\n\r\n this._gl.bindVertexArray(vao);\r\n\r\n this._mustWipeVertexAttributes = true;\r\n this._bindVertexBuffersAttributes(vertexBuffers, effect, overrideVertexBuffers);\r\n\r\n this.bindIndexBuffer(indexBuffer);\r\n\r\n this._vaoRecordInProgress = false;\r\n this._gl.bindVertexArray(null);\r\n\r\n return vao;\r\n }\r\n\r\n /**\r\n * Bind a specific vertex array object\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#vertex-array-objects\r\n * @param vertexArrayObject defines the vertex array object to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n */\r\n public bindVertexArrayObject(vertexArrayObject: WebGLVertexArrayObject, indexBuffer: Nullable): void {\r\n if (this._cachedVertexArrayObject !== vertexArrayObject) {\r\n this._cachedVertexArrayObject = vertexArrayObject;\r\n\r\n this._gl.bindVertexArray(vertexArrayObject);\r\n this._cachedVertexBuffers = null;\r\n this._cachedIndexBuffer = null;\r\n\r\n this._uintIndicesCurrentlySet = indexBuffer != null && indexBuffer.is32Bits;\r\n this._mustWipeVertexAttributes = true;\r\n }\r\n }\r\n\r\n /**\r\n * Bind webGl buffers directly to the webGL context\r\n * @param vertexBuffer defines the vertex buffer to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n * @param vertexDeclaration defines the vertex declaration to use with the vertex buffer\r\n * @param vertexStrideSize defines the vertex stride of the vertex buffer\r\n * @param effect defines the effect associated with the vertex buffer\r\n */\r\n public bindBuffersDirectly(vertexBuffer: DataBuffer, indexBuffer: DataBuffer, vertexDeclaration: number[], vertexStrideSize: number, effect: Effect): void {\r\n if (this._cachedVertexBuffers !== vertexBuffer || this._cachedEffectForVertexBuffers !== effect) {\r\n this._cachedVertexBuffers = vertexBuffer;\r\n this._cachedEffectForVertexBuffers = effect;\r\n\r\n const attributesCount = effect.getAttributesCount();\r\n\r\n this._unbindVertexArrayObject();\r\n this.unbindAllAttributes();\r\n\r\n let offset = 0;\r\n for (let index = 0; index < attributesCount; index++) {\r\n if (index < vertexDeclaration.length) {\r\n const order = effect.getAttributeLocation(index);\r\n\r\n if (order >= 0) {\r\n this._gl.enableVertexAttribArray(order);\r\n this._vertexAttribArraysEnabled[order] = true;\r\n this._vertexAttribPointer(vertexBuffer, order, vertexDeclaration[index], this._gl.FLOAT, false, vertexStrideSize, offset);\r\n }\r\n\r\n offset += vertexDeclaration[index] * 4;\r\n }\r\n }\r\n }\r\n\r\n this._bindIndexBufferWithCache(indexBuffer);\r\n }\r\n\r\n private _unbindVertexArrayObject(): void {\r\n if (!this._cachedVertexArrayObject) {\r\n return;\r\n }\r\n\r\n this._cachedVertexArrayObject = null;\r\n this._gl.bindVertexArray(null);\r\n }\r\n\r\n /**\r\n * Bind a list of vertex buffers to the webGL context\r\n * @param vertexBuffers defines the list of vertex buffers to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n * @param effect defines the effect associated with the vertex buffers\r\n * @param overrideVertexBuffers defines optional list of avertex buffers that overrides the entries in vertexBuffers\r\n */\r\n public bindBuffers(\r\n vertexBuffers: { [key: string]: Nullable },\r\n indexBuffer: Nullable,\r\n effect: Effect,\r\n overrideVertexBuffers?: { [kind: string]: Nullable }\r\n ): void {\r\n if (this._cachedVertexBuffers !== vertexBuffers || this._cachedEffectForVertexBuffers !== effect) {\r\n this._cachedVertexBuffers = vertexBuffers;\r\n this._cachedEffectForVertexBuffers = effect;\r\n\r\n this._bindVertexBuffersAttributes(vertexBuffers, effect, overrideVertexBuffers);\r\n }\r\n\r\n this._bindIndexBufferWithCache(indexBuffer);\r\n }\r\n\r\n /**\r\n * Unbind all instance attributes\r\n */\r\n public unbindInstanceAttributes() {\r\n let boundBuffer;\r\n for (let i = 0, ul = this._currentInstanceLocations.length; i < ul; i++) {\r\n const instancesBuffer = this._currentInstanceBuffers[i];\r\n if (boundBuffer != instancesBuffer && instancesBuffer.references) {\r\n boundBuffer = instancesBuffer;\r\n this.bindArrayBuffer(instancesBuffer);\r\n }\r\n const offsetLocation = this._currentInstanceLocations[i];\r\n this._gl.vertexAttribDivisor(offsetLocation, 0);\r\n }\r\n this._currentInstanceBuffers.length = 0;\r\n this._currentInstanceLocations.length = 0;\r\n }\r\n\r\n /**\r\n * Release and free the memory of a vertex array object\r\n * @param vao defines the vertex array object to delete\r\n */\r\n public releaseVertexArrayObject(vao: WebGLVertexArrayObject) {\r\n this._gl.deleteVertexArray(vao);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseBuffer(buffer: DataBuffer): boolean {\r\n buffer.references--;\r\n\r\n if (buffer.references === 0) {\r\n this._deleteBuffer(buffer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n protected _deleteBuffer(buffer: DataBuffer): void {\r\n this._gl.deleteBuffer(buffer.underlyingResource);\r\n }\r\n\r\n /**\r\n * Update the content of a webGL buffer used with instantiation and bind it to the webGL context\r\n * @param instancesBuffer defines the webGL buffer to update and bind\r\n * @param data defines the data to store in the buffer\r\n * @param offsetLocations defines the offsets or attributes information used to determine where data must be stored in the buffer\r\n */\r\n public updateAndBindInstancesBuffer(instancesBuffer: DataBuffer, data: Float32Array, offsetLocations: number[] | InstancingAttributeInfo[]): void {\r\n this.bindArrayBuffer(instancesBuffer);\r\n if (data) {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data);\r\n }\r\n\r\n if ((offsetLocations[0]).index !== undefined) {\r\n this.bindInstancesBuffer(instancesBuffer, offsetLocations as any, true);\r\n } else {\r\n for (let index = 0; index < 4; index++) {\r\n const offsetLocation = offsetLocations[index];\r\n\r\n if (!this._vertexAttribArraysEnabled[offsetLocation]) {\r\n this._gl.enableVertexAttribArray(offsetLocation);\r\n this._vertexAttribArraysEnabled[offsetLocation] = true;\r\n }\r\n\r\n this._vertexAttribPointer(instancesBuffer, offsetLocation, 4, this._gl.FLOAT, false, 64, index * 16);\r\n this._gl.vertexAttribDivisor(offsetLocation, 1);\r\n this._currentInstanceLocations.push(offsetLocation);\r\n this._currentInstanceBuffers.push(instancesBuffer);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Bind the content of a webGL buffer used with instantiation\r\n * @param instancesBuffer defines the webGL buffer to bind\r\n * @param attributesInfo defines the offsets or attributes information used to determine where data must be stored in the buffer\r\n * @param computeStride defines Whether to compute the strides from the info or use the default 0\r\n */\r\n public bindInstancesBuffer(instancesBuffer: DataBuffer, attributesInfo: InstancingAttributeInfo[], computeStride = true): void {\r\n this.bindArrayBuffer(instancesBuffer);\r\n\r\n let stride = 0;\r\n if (computeStride) {\r\n for (let i = 0; i < attributesInfo.length; i++) {\r\n const ai = attributesInfo[i];\r\n stride += ai.attributeSize * 4;\r\n }\r\n }\r\n\r\n for (let i = 0; i < attributesInfo.length; i++) {\r\n const ai = attributesInfo[i];\r\n if (ai.index === undefined) {\r\n ai.index = this._currentEffect!.getAttributeLocationByName(ai.attributeName);\r\n }\r\n\r\n if (ai.index < 0) {\r\n continue;\r\n }\r\n\r\n if (!this._vertexAttribArraysEnabled[ai.index]) {\r\n this._gl.enableVertexAttribArray(ai.index);\r\n this._vertexAttribArraysEnabled[ai.index] = true;\r\n }\r\n\r\n this._vertexAttribPointer(instancesBuffer, ai.index, ai.attributeSize, ai.attributeType || this._gl.FLOAT, ai.normalized || false, stride, ai.offset);\r\n this._gl.vertexAttribDivisor(ai.index, ai.divisor === undefined ? 1 : ai.divisor);\r\n this._currentInstanceLocations.push(ai.index);\r\n this._currentInstanceBuffers.push(instancesBuffer);\r\n }\r\n }\r\n\r\n /**\r\n * Disable the instance attribute corresponding to the name in parameter\r\n * @param name defines the name of the attribute to disable\r\n */\r\n public disableInstanceAttributeByName(name: string) {\r\n if (!this._currentEffect) {\r\n return;\r\n }\r\n\r\n const attributeLocation = this._currentEffect.getAttributeLocationByName(name);\r\n this.disableInstanceAttribute(attributeLocation);\r\n }\r\n\r\n /**\r\n * Disable the instance attribute corresponding to the location in parameter\r\n * @param attributeLocation defines the attribute location of the attribute to disable\r\n */\r\n public disableInstanceAttribute(attributeLocation: number) {\r\n let shouldClean = false;\r\n let index: number;\r\n while ((index = this._currentInstanceLocations.indexOf(attributeLocation)) !== -1) {\r\n this._currentInstanceLocations.splice(index, 1);\r\n this._currentInstanceBuffers.splice(index, 1);\r\n\r\n shouldClean = true;\r\n index = this._currentInstanceLocations.indexOf(attributeLocation);\r\n }\r\n\r\n if (shouldClean) {\r\n this._gl.vertexAttribDivisor(attributeLocation, 0);\r\n this.disableAttributeByIndex(attributeLocation);\r\n }\r\n }\r\n\r\n /**\r\n * Disable the attribute corresponding to the location in parameter\r\n * @param attributeLocation defines the attribute location of the attribute to disable\r\n */\r\n public disableAttributeByIndex(attributeLocation: number) {\r\n this._gl.disableVertexAttribArray(attributeLocation);\r\n this._vertexAttribArraysEnabled[attributeLocation] = false;\r\n this._currentBufferPointers[attributeLocation].active = false;\r\n }\r\n\r\n /**\r\n * Send a draw order\r\n * @param useTriangles defines if triangles must be used to draw (else wireframe will be used)\r\n * @param indexStart defines the starting index\r\n * @param indexCount defines the number of index to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public draw(useTriangles: boolean, indexStart: number, indexCount: number, instancesCount?: number): void {\r\n this.drawElementsType(useTriangles ? Constants.MATERIAL_TriangleFillMode : Constants.MATERIAL_WireFrameFillMode, indexStart, indexCount, instancesCount);\r\n }\r\n\r\n /**\r\n * Draw a list of points\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public drawPointClouds(verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n this.drawArraysType(Constants.MATERIAL_PointFillMode, verticesStart, verticesCount, instancesCount);\r\n }\r\n\r\n /**\r\n * Draw a list of unindexed primitives\r\n * @param useTriangles defines if triangles must be used to draw (else wireframe will be used)\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public drawUnIndexed(useTriangles: boolean, verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n this.drawArraysType(useTriangles ? Constants.MATERIAL_TriangleFillMode : Constants.MATERIAL_WireFrameFillMode, verticesStart, verticesCount, instancesCount);\r\n }\r\n\r\n /**\r\n * Draw a list of indexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param indexStart defines the starting index\r\n * @param indexCount defines the number of index to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public drawElementsType(fillMode: number, indexStart: number, indexCount: number, instancesCount?: number): void {\r\n // Apply states\r\n this.applyStates();\r\n\r\n this._reportDrawCall();\r\n\r\n // Render\r\n\r\n const drawMode = this._drawMode(fillMode);\r\n const indexFormat = this._uintIndicesCurrentlySet ? this._gl.UNSIGNED_INT : this._gl.UNSIGNED_SHORT;\r\n const mult = this._uintIndicesCurrentlySet ? 4 : 2;\r\n if (instancesCount) {\r\n this._gl.drawElementsInstanced(drawMode, indexCount, indexFormat, indexStart * mult, instancesCount);\r\n } else {\r\n this._gl.drawElements(drawMode, indexCount, indexFormat, indexStart * mult);\r\n }\r\n }\r\n\r\n /**\r\n * Draw a list of unindexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instantiation is enabled)\r\n */\r\n public drawArraysType(fillMode: number, verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n // Apply states\r\n this.applyStates();\r\n\r\n this._reportDrawCall();\r\n\r\n const drawMode = this._drawMode(fillMode);\r\n if (instancesCount) {\r\n this._gl.drawArraysInstanced(drawMode, verticesStart, verticesCount, instancesCount);\r\n } else {\r\n this._gl.drawArrays(drawMode, verticesStart, verticesCount);\r\n }\r\n }\r\n\r\n private _drawMode(fillMode: number): number {\r\n switch (fillMode) {\r\n // Triangle views\r\n case Constants.MATERIAL_TriangleFillMode:\r\n return this._gl.TRIANGLES;\r\n case Constants.MATERIAL_PointFillMode:\r\n return this._gl.POINTS;\r\n case Constants.MATERIAL_WireFrameFillMode:\r\n return this._gl.LINES;\r\n // Draw modes\r\n case Constants.MATERIAL_PointListDrawMode:\r\n return this._gl.POINTS;\r\n case Constants.MATERIAL_LineListDrawMode:\r\n return this._gl.LINES;\r\n case Constants.MATERIAL_LineLoopDrawMode:\r\n return this._gl.LINE_LOOP;\r\n case Constants.MATERIAL_LineStripDrawMode:\r\n return this._gl.LINE_STRIP;\r\n case Constants.MATERIAL_TriangleStripDrawMode:\r\n return this._gl.TRIANGLE_STRIP;\r\n case Constants.MATERIAL_TriangleFanDrawMode:\r\n return this._gl.TRIANGLE_FAN;\r\n default:\r\n return this._gl.TRIANGLES;\r\n }\r\n }\r\n\r\n /** @internal */\r\n protected _reportDrawCall() {\r\n // Will be implemented by children\r\n }\r\n\r\n // Shaders\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseEffect(effect: Effect): void {\r\n if (this._compiledEffects[effect._key]) {\r\n delete this._compiledEffects[effect._key];\r\n }\r\n const pipelineContext = effect.getPipelineContext();\r\n if (pipelineContext) {\r\n this._deletePipelineContext(pipelineContext);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _deletePipelineContext(pipelineContext: IPipelineContext): void {\r\n const webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n if (webGLPipelineContext && webGLPipelineContext.program) {\r\n webGLPipelineContext.program.__SPECTOR_rebuildProgram = null;\r\n\r\n this._gl.deleteProgram(webGLPipelineContext.program);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _getGlobalDefines(defines?: { [key: string]: string }): string | undefined {\r\n if (defines) {\r\n if (this.isNDCHalfZRange) {\r\n defines[\"IS_NDC_HALF_ZRANGE\"] = \"\";\r\n } else {\r\n delete defines[\"IS_NDC_HALF_ZRANGE\"];\r\n }\r\n if (this.useReverseDepthBuffer) {\r\n defines[\"USE_REVERSE_DEPTHBUFFER\"] = \"\";\r\n } else {\r\n delete defines[\"USE_REVERSE_DEPTHBUFFER\"];\r\n }\r\n if (this.useExactSrgbConversions) {\r\n defines[\"USE_EXACT_SRGB_CONVERSIONS\"] = \"\";\r\n } else {\r\n delete defines[\"USE_EXACT_SRGB_CONVERSIONS\"];\r\n }\r\n return;\r\n } else {\r\n let s = \"\";\r\n if (this.isNDCHalfZRange) {\r\n s += \"#define IS_NDC_HALF_ZRANGE\";\r\n }\r\n if (this.useReverseDepthBuffer) {\r\n if (s) {\r\n s += \"\\n\";\r\n }\r\n s += \"#define USE_REVERSE_DEPTHBUFFER\";\r\n }\r\n if (this.useExactSrgbConversions) {\r\n if (s) {\r\n s += \"\\n\";\r\n }\r\n s += \"#define USE_EXACT_SRGB_CONVERSIONS\";\r\n }\r\n return s;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new effect (used to store vertex/fragment shaders)\r\n * @param baseName defines the base name of the effect (The name of file without .fragment.fx or .vertex.fx)\r\n * @param attributesNamesOrOptions defines either a list of attribute names or an IEffectCreationOptions object\r\n * @param uniformsNamesOrEngine defines either a list of uniform names or the engine to use\r\n * @param samplers defines an array of string used to represent textures\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param fallbacks defines the list of potential fallbacks to use if shader compilation fails\r\n * @param onCompiled defines a function to call when the effect creation is successful\r\n * @param onError defines a function to call when the effect creation has failed\r\n * @param indexParameters defines an object containing the index values to use to compile shaders (like the maximum number of simultaneous lights)\r\n * @param shaderLanguage the language the shader is written in (default: GLSL)\r\n * @returns the new Effect\r\n */\r\n public createEffect(\r\n baseName: string | (IShaderPath & { vertexToken?: string; fragmentToken?: string }),\r\n attributesNamesOrOptions: string[] | IEffectCreationOptions,\r\n uniformsNamesOrEngine: string[] | ThinEngine,\r\n samplers?: string[],\r\n defines?: string,\r\n fallbacks?: IEffectFallbacks,\r\n onCompiled?: Nullable<(effect: Effect) => void>,\r\n onError?: Nullable<(effect: Effect, errors: string) => void>,\r\n indexParameters?: any,\r\n shaderLanguage = ShaderLanguage.GLSL\r\n ): Effect {\r\n const vertex = typeof baseName === \"string\" ? baseName : baseName.vertexToken || baseName.vertexSource || baseName.vertexElement || baseName.vertex;\r\n const fragment = typeof baseName === \"string\" ? baseName : baseName.fragmentToken || baseName.fragmentSource || baseName.fragmentElement || baseName.fragment;\r\n const globalDefines = this._getGlobalDefines()!;\r\n\r\n let fullDefines = defines ?? (attributesNamesOrOptions).defines ?? \"\";\r\n\r\n if (globalDefines) {\r\n fullDefines += globalDefines;\r\n }\r\n\r\n const name = vertex + \"+\" + fragment + \"@\" + fullDefines;\r\n if (this._compiledEffects[name]) {\r\n const compiledEffect = this._compiledEffects[name];\r\n if (onCompiled && compiledEffect.isReady()) {\r\n onCompiled(compiledEffect);\r\n }\r\n\r\n return compiledEffect;\r\n }\r\n const effect = new Effect(\r\n baseName,\r\n attributesNamesOrOptions,\r\n uniformsNamesOrEngine,\r\n samplers,\r\n this,\r\n defines,\r\n fallbacks,\r\n onCompiled,\r\n onError,\r\n indexParameters,\r\n name,\r\n shaderLanguage\r\n );\r\n this._compiledEffects[name] = effect;\r\n\r\n return effect;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected static _ConcatenateShader(source: string, defines: Nullable, shaderVersion: string = \"\"): string {\r\n return shaderVersion + (defines ? defines + \"\\n\" : \"\") + source;\r\n }\r\n\r\n private _compileShader(source: string, type: string, defines: Nullable, shaderVersion: string): WebGLShader {\r\n return this._compileRawShader(ThinEngine._ConcatenateShader(source, defines, shaderVersion), type);\r\n }\r\n\r\n private _compileRawShader(source: string, type: string): WebGLShader {\r\n const gl = this._gl;\r\n\r\n const shader = gl.createShader(type === \"vertex\" ? gl.VERTEX_SHADER : gl.FRAGMENT_SHADER);\r\n\r\n if (!shader) {\r\n let error: GLenum = gl.NO_ERROR;\r\n let tempError: GLenum = gl.NO_ERROR;\r\n while ((tempError = gl.getError()) !== gl.NO_ERROR) {\r\n error = tempError;\r\n }\r\n\r\n throw new Error(\r\n `Something went wrong while creating a gl ${type} shader object. gl error=${error}, gl isContextLost=${gl.isContextLost()}, _contextWasLost=${this._contextWasLost}`\r\n );\r\n }\r\n\r\n gl.shaderSource(shader, source);\r\n gl.compileShader(shader);\r\n\r\n return shader;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getShaderSource(shader: WebGLShader): Nullable {\r\n return this._gl.getShaderSource(shader);\r\n }\r\n\r\n /**\r\n * Directly creates a webGL program\r\n * @param pipelineContext defines the pipeline context to attach to\r\n * @param vertexCode defines the vertex shader code to use\r\n * @param fragmentCode defines the fragment shader code to use\r\n * @param context defines the webGL context to use (if not set, the current one will be used)\r\n * @param transformFeedbackVaryings defines the list of transform feedback varyings to use\r\n * @returns the new webGL program\r\n */\r\n public createRawShaderProgram(\r\n pipelineContext: IPipelineContext,\r\n vertexCode: string,\r\n fragmentCode: string,\r\n context?: WebGLRenderingContext,\r\n transformFeedbackVaryings: Nullable = null\r\n ): WebGLProgram {\r\n context = context || this._gl;\r\n\r\n const vertexShader = this._compileRawShader(vertexCode, \"vertex\");\r\n const fragmentShader = this._compileRawShader(fragmentCode, \"fragment\");\r\n\r\n return this._createShaderProgram(pipelineContext as WebGLPipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings);\r\n }\r\n\r\n /**\r\n * Creates a webGL program\r\n * @param pipelineContext defines the pipeline context to attach to\r\n * @param vertexCode defines the vertex shader code to use\r\n * @param fragmentCode defines the fragment shader code to use\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param context defines the webGL context to use (if not set, the current one will be used)\r\n * @param transformFeedbackVaryings defines the list of transform feedback varyings to use\r\n * @returns the new webGL program\r\n */\r\n public createShaderProgram(\r\n pipelineContext: IPipelineContext,\r\n vertexCode: string,\r\n fragmentCode: string,\r\n defines: Nullable,\r\n context?: WebGLRenderingContext,\r\n transformFeedbackVaryings: Nullable = null\r\n ): WebGLProgram {\r\n context = context || this._gl;\r\n\r\n const shaderVersion = this._webGLVersion > 1 ? \"#version 300 es\\n#define WEBGL2 \\n\" : \"\";\r\n const vertexShader = this._compileShader(vertexCode, \"vertex\", defines, shaderVersion);\r\n const fragmentShader = this._compileShader(fragmentCode, \"fragment\", defines, shaderVersion);\r\n\r\n return this._createShaderProgram(pipelineContext as WebGLPipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings);\r\n }\r\n\r\n /**\r\n * Inline functions in shader code that are marked to be inlined\r\n * @param code code to inline\r\n * @returns inlined code\r\n */\r\n public inlineShaderCode(code: string): string {\r\n // no inlining needed in the WebGL engine\r\n return code;\r\n }\r\n\r\n /**\r\n * Creates a new pipeline context\r\n * @param shaderProcessingContext defines the shader processing context used during the processing if available\r\n * @returns the new pipeline\r\n */\r\n public createPipelineContext(shaderProcessingContext: Nullable): IPipelineContext {\r\n const pipelineContext = new WebGLPipelineContext();\r\n pipelineContext.engine = this;\r\n\r\n if (this._caps.parallelShaderCompile) {\r\n pipelineContext.isParallelCompiled = true;\r\n }\r\n\r\n return pipelineContext;\r\n }\r\n\r\n /**\r\n * Creates a new material context\r\n * @returns the new context\r\n */\r\n public createMaterialContext(): IMaterialContext | undefined {\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Creates a new draw context\r\n * @returns the new context\r\n */\r\n public createDrawContext(): IDrawContext | undefined {\r\n return undefined;\r\n }\r\n\r\n protected _createShaderProgram(\r\n pipelineContext: WebGLPipelineContext,\r\n vertexShader: WebGLShader,\r\n fragmentShader: WebGLShader,\r\n context: WebGLRenderingContext,\r\n transformFeedbackVaryings: Nullable = null\r\n ): WebGLProgram {\r\n const shaderProgram = context.createProgram();\r\n pipelineContext.program = shaderProgram;\r\n\r\n if (!shaderProgram) {\r\n throw new Error(\"Unable to create program\");\r\n }\r\n\r\n context.attachShader(shaderProgram, vertexShader);\r\n context.attachShader(shaderProgram, fragmentShader);\r\n\r\n context.linkProgram(shaderProgram);\r\n\r\n pipelineContext.context = context;\r\n pipelineContext.vertexShader = vertexShader;\r\n pipelineContext.fragmentShader = fragmentShader;\r\n\r\n if (!pipelineContext.isParallelCompiled) {\r\n this._finalizePipelineContext(pipelineContext);\r\n }\r\n\r\n return shaderProgram;\r\n }\r\n\r\n protected _finalizePipelineContext(pipelineContext: WebGLPipelineContext) {\r\n const context = pipelineContext.context!;\r\n const vertexShader = pipelineContext.vertexShader!;\r\n const fragmentShader = pipelineContext.fragmentShader!;\r\n const program = pipelineContext.program!;\r\n\r\n const linked = context.getProgramParameter(program, context.LINK_STATUS);\r\n if (!linked) {\r\n // Get more info\r\n // Vertex\r\n if (!this._gl.getShaderParameter(vertexShader, this._gl.COMPILE_STATUS)) {\r\n const log = this._gl.getShaderInfoLog(vertexShader);\r\n if (log) {\r\n pipelineContext.vertexCompilationError = log;\r\n throw new Error(\"VERTEX SHADER \" + log);\r\n }\r\n }\r\n\r\n // Fragment\r\n if (!this._gl.getShaderParameter(fragmentShader, this._gl.COMPILE_STATUS)) {\r\n const log = this._gl.getShaderInfoLog(fragmentShader);\r\n if (log) {\r\n pipelineContext.fragmentCompilationError = log;\r\n throw new Error(\"FRAGMENT SHADER \" + log);\r\n }\r\n }\r\n\r\n const error = context.getProgramInfoLog(program);\r\n if (error) {\r\n pipelineContext.programLinkError = error;\r\n throw new Error(error);\r\n }\r\n }\r\n\r\n if (this.validateShaderPrograms) {\r\n context.validateProgram(program);\r\n const validated = context.getProgramParameter(program, context.VALIDATE_STATUS);\r\n\r\n if (!validated) {\r\n const error = context.getProgramInfoLog(program);\r\n if (error) {\r\n pipelineContext.programValidationError = error;\r\n throw new Error(error);\r\n }\r\n }\r\n }\r\n\r\n context.deleteShader(vertexShader);\r\n context.deleteShader(fragmentShader);\r\n\r\n pipelineContext.vertexShader = undefined;\r\n pipelineContext.fragmentShader = undefined;\r\n\r\n if (pipelineContext.onCompiled) {\r\n pipelineContext.onCompiled();\r\n pipelineContext.onCompiled = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _preparePipelineContext(\r\n pipelineContext: IPipelineContext,\r\n vertexSourceCode: string,\r\n fragmentSourceCode: string,\r\n createAsRaw: boolean,\r\n rawVertexSourceCode: string,\r\n rawFragmentSourceCode: string,\r\n rebuildRebind: any,\r\n defines: Nullable,\r\n transformFeedbackVaryings: Nullable,\r\n key: string\r\n ) {\r\n const webGLRenderingState = pipelineContext as WebGLPipelineContext;\r\n\r\n if (createAsRaw) {\r\n webGLRenderingState.program = this.createRawShaderProgram(webGLRenderingState, vertexSourceCode, fragmentSourceCode, undefined, transformFeedbackVaryings);\r\n } else {\r\n webGLRenderingState.program = this.createShaderProgram(webGLRenderingState, vertexSourceCode, fragmentSourceCode, defines, undefined, transformFeedbackVaryings);\r\n }\r\n webGLRenderingState.program.__SPECTOR_rebuildProgram = rebuildRebind;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _isRenderingStateCompiled(pipelineContext: IPipelineContext): boolean {\r\n const webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n if (this._isDisposed || webGLPipelineContext._isDisposed) {\r\n return false;\r\n }\r\n if (this._gl.getProgramParameter(webGLPipelineContext.program!, this._caps.parallelShaderCompile!.COMPLETION_STATUS_KHR)) {\r\n this._finalizePipelineContext(webGLPipelineContext);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _executeWhenRenderingStateIsCompiled(pipelineContext: IPipelineContext, action: () => void) {\r\n const webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n\r\n if (!webGLPipelineContext.isParallelCompiled) {\r\n action();\r\n return;\r\n }\r\n\r\n const oldHandler = webGLPipelineContext.onCompiled;\r\n\r\n if (oldHandler) {\r\n webGLPipelineContext.onCompiled = () => {\r\n oldHandler!();\r\n action();\r\n };\r\n } else {\r\n webGLPipelineContext.onCompiled = action;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the list of webGL uniform locations associated with a specific program based on a list of uniform names\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param uniformsNames defines the list of uniform names\r\n * @returns an array of webGL uniform locations\r\n */\r\n public getUniforms(pipelineContext: IPipelineContext, uniformsNames: string[]): Nullable[] {\r\n const results = new Array>();\r\n const webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n\r\n for (let index = 0; index < uniformsNames.length; index++) {\r\n results.push(this._gl.getUniformLocation(webGLPipelineContext.program!, uniformsNames[index]));\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Gets the list of active attributes for a given webGL program\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param attributesNames defines the list of attribute names to get\r\n * @returns an array of indices indicating the offset of each attribute\r\n */\r\n public getAttributes(pipelineContext: IPipelineContext, attributesNames: string[]): number[] {\r\n const results = [];\r\n const webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n\r\n for (let index = 0; index < attributesNames.length; index++) {\r\n try {\r\n results.push(this._gl.getAttribLocation(webGLPipelineContext.program!, attributesNames[index]));\r\n } catch (e) {\r\n results.push(-1);\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Activates an effect, making it the current one (ie. the one used for rendering)\r\n * @param effect defines the effect to activate\r\n */\r\n public enableEffect(effect: Nullable): void {\r\n effect = effect !== null && DrawWrapper.IsWrapper(effect) ? effect.effect : effect; // get only the effect, we don't need a Wrapper in the WebGL engine\r\n\r\n if (!effect || effect === this._currentEffect) {\r\n return;\r\n }\r\n\r\n this._stencilStateComposer.stencilMaterial = undefined;\r\n\r\n effect = effect as Effect;\r\n\r\n // Use program\r\n this.bindSamplers(effect);\r\n\r\n this._currentEffect = effect;\r\n\r\n if (effect.onBind) {\r\n effect.onBind(effect);\r\n }\r\n if (effect._onBindObservable) {\r\n effect._onBindObservable.notifyObservers(effect);\r\n }\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a number (int)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param value defines the int number to store\r\n * @returns true if the value was set\r\n */\r\n public setInt(uniform: Nullable, value: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1i(uniform, value);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a int2\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setInt2(uniform: Nullable, x: number, y: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2i(uniform, x, y);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a int3\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setInt3(uniform: Nullable, x: number, y: number, z: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3i(uniform, x, y, z);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a int4\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @param w defines the 4th component of the value\r\n * @returns true if the value was set\r\n */\r\n public setInt4(uniform: Nullable, x: number, y: number, z: number, w: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4i(uniform, x, y, z, w);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray(uniform: Nullable, array: Int32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1iv(uniform, array);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32 (stored as vec2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray2(uniform: Nullable, array: Int32Array): boolean {\r\n if (!uniform || array.length % 2 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2iv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32 (stored as vec3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray3(uniform: Nullable, array: Int32Array): boolean {\r\n if (!uniform || array.length % 3 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3iv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32 (stored as vec4)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray4(uniform: Nullable, array: Int32Array): boolean {\r\n if (!uniform || array.length % 4 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4iv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a number (unsigned int)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param value defines the unsigned int number to store\r\n * @returns true if the value was set\r\n */\r\n public setUInt(uniform: Nullable, value: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1ui(uniform, value);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a unsigned int2\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setUInt2(uniform: Nullable, x: number, y: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2ui(uniform, x, y);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a unsigned int3\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setUInt3(uniform: Nullable, x: number, y: number, z: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3ui(uniform, x, y, z);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a unsigned int4\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @param w defines the 4th component of the value\r\n * @returns true if the value was set\r\n */\r\n public setUInt4(uniform: Nullable, x: number, y: number, z: number, w: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4ui(uniform, x, y, z, w);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of unsigned int32\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of unsigned int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setUIntArray(uniform: Nullable, array: Uint32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1uiv(uniform, array);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of unsigned int32 (stored as vec2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of unsigned int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setUIntArray2(uniform: Nullable, array: Uint32Array): boolean {\r\n if (!uniform || array.length % 2 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2uiv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of unsigned int32 (stored as vec3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of unsigned int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setUIntArray3(uniform: Nullable, array: Uint32Array): boolean {\r\n if (!uniform || array.length % 3 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3uiv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of unsigned int32 (stored as vec4)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of unsigned int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setUIntArray4(uniform: Nullable, array: Uint32Array): boolean {\r\n if (!uniform || array.length % 4 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4uiv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray(uniform: Nullable, array: number[] | Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n if (array.length < 1) {\r\n return false;\r\n }\r\n this._gl.uniform1fv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number (stored as vec2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray2(uniform: Nullable, array: number[] | Float32Array): boolean {\r\n if (!uniform || array.length % 2 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2fv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number (stored as vec3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray3(uniform: Nullable, array: number[] | Float32Array): boolean {\r\n if (!uniform || array.length % 3 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3fv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number (stored as vec4)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray4(uniform: Nullable, array: number[] | Float32Array): boolean {\r\n if (!uniform || array.length % 4 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4fv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of float32 (stored as matrices)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param matrices defines the array of float32 to store\r\n * @returns true if the value was set\r\n */\r\n public setMatrices(uniform: Nullable, matrices: DeepImmutable): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniformMatrix4fv(uniform, false, matrices);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a matrix (3x3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param matrix defines the Float32Array representing the 3x3 matrix to store\r\n * @returns true if the value was set\r\n */\r\n public setMatrix3x3(uniform: Nullable, matrix: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniformMatrix3fv(uniform, false, matrix);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a matrix (2x2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param matrix defines the Float32Array representing the 2x2 matrix to store\r\n * @returns true if the value was set\r\n */\r\n public setMatrix2x2(uniform: Nullable, matrix: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniformMatrix2fv(uniform, false, matrix);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a number (float)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param value defines the float number to store\r\n * @returns true if the value was transferred\r\n */\r\n public setFloat(uniform: Nullable, value: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1f(uniform, value);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a vec2\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setFloat2(uniform: Nullable, x: number, y: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2f(uniform, x, y);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a vec3\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setFloat3(uniform: Nullable, x: number, y: number, z: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3f(uniform, x, y, z);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a vec4\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @param w defines the 4th component of the value\r\n * @returns true if the value was set\r\n */\r\n public setFloat4(uniform: Nullable, x: number, y: number, z: number, w: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4f(uniform, x, y, z, w);\r\n\r\n return true;\r\n }\r\n\r\n // States\r\n\r\n /**\r\n * Apply all cached states (depth, culling, stencil and alpha)\r\n */\r\n public applyStates() {\r\n this._depthCullingState.apply(this._gl);\r\n this._stencilStateComposer.apply(this._gl);\r\n this._alphaState.apply(this._gl);\r\n\r\n if (this._colorWriteChanged) {\r\n this._colorWriteChanged = false;\r\n const enable = this._colorWrite;\r\n this._gl.colorMask(enable, enable, enable, enable);\r\n }\r\n }\r\n\r\n /**\r\n * Enable or disable color writing\r\n * @param enable defines the state to set\r\n */\r\n public setColorWrite(enable: boolean): void {\r\n if (enable !== this._colorWrite) {\r\n this._colorWriteChanged = true;\r\n this._colorWrite = enable;\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if color writing is enabled\r\n * @returns the current color writing state\r\n */\r\n public getColorWrite(): boolean {\r\n return this._colorWrite;\r\n }\r\n\r\n /**\r\n * Gets the depth culling state manager\r\n */\r\n public get depthCullingState(): DepthCullingState {\r\n return this._depthCullingState;\r\n }\r\n\r\n /**\r\n * Gets the alpha state manager\r\n */\r\n public get alphaState(): AlphaState {\r\n return this._alphaState;\r\n }\r\n\r\n /**\r\n * Gets the stencil state manager\r\n */\r\n public get stencilState(): StencilState {\r\n return this._stencilState;\r\n }\r\n\r\n /**\r\n * Gets the stencil state composer\r\n */\r\n public get stencilStateComposer(): StencilStateComposer {\r\n return this._stencilStateComposer;\r\n }\r\n\r\n // Textures\r\n\r\n /**\r\n * Clears the list of texture accessible through engine.\r\n * This can help preventing texture load conflict due to name collision.\r\n */\r\n public clearInternalTexturesCache() {\r\n this._internalTexturesCache.length = 0;\r\n }\r\n\r\n /**\r\n * Force the entire cache to be cleared\r\n * You should not have to use this function unless your engine needs to share the webGL context with another engine\r\n * @param bruteForce defines a boolean to force clearing ALL caches (including stencil, detoh and alpha states)\r\n */\r\n public wipeCaches(bruteForce?: boolean): void {\r\n if (this.preventCacheWipeBetweenFrames && !bruteForce) {\r\n return;\r\n }\r\n this._currentEffect = null;\r\n this._viewportCached.x = 0;\r\n this._viewportCached.y = 0;\r\n this._viewportCached.z = 0;\r\n this._viewportCached.w = 0;\r\n\r\n // Done before in case we clean the attributes\r\n this._unbindVertexArrayObject();\r\n\r\n if (bruteForce) {\r\n this._currentProgram = null;\r\n this.resetTextureCache();\r\n\r\n this._stencilStateComposer.reset();\r\n\r\n this._depthCullingState.reset();\r\n this._depthCullingState.depthFunc = this._gl.LEQUAL;\r\n\r\n this._alphaState.reset();\r\n this._alphaMode = Constants.ALPHA_ADD;\r\n this._alphaEquation = Constants.ALPHA_DISABLE;\r\n\r\n this._colorWrite = true;\r\n this._colorWriteChanged = true;\r\n\r\n this._unpackFlipYCached = null;\r\n\r\n this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE);\r\n this._gl.pixelStorei(this._gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0);\r\n\r\n this._mustWipeVertexAttributes = true;\r\n this.unbindAllAttributes();\r\n }\r\n\r\n this._resetVertexBufferBinding();\r\n this._cachedIndexBuffer = null;\r\n this._cachedEffectForVertexBuffers = null;\r\n this.bindIndexBuffer(null);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getSamplingParameters(samplingMode: number, generateMipMaps: boolean): { min: number; mag: number } {\r\n const gl = this._gl;\r\n let magFilter: GLenum = gl.NEAREST;\r\n let minFilter: GLenum = gl.NEAREST;\r\n\r\n switch (samplingMode) {\r\n case Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case Constants.TEXTURE_NEAREST_NEAREST_MIPLINEAR:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case Constants.TEXTURE_NEAREST_LINEAR_MIPNEAREST:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case Constants.TEXTURE_NEAREST_LINEAR_MIPLINEAR:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case Constants.TEXTURE_NEAREST_LINEAR:\r\n magFilter = gl.NEAREST;\r\n minFilter = gl.LINEAR;\r\n break;\r\n case Constants.TEXTURE_NEAREST_NEAREST:\r\n magFilter = gl.NEAREST;\r\n minFilter = gl.NEAREST;\r\n break;\r\n case Constants.TEXTURE_LINEAR_NEAREST_MIPNEAREST:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case Constants.TEXTURE_LINEAR_NEAREST_MIPLINEAR:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case Constants.TEXTURE_LINEAR_LINEAR:\r\n magFilter = gl.LINEAR;\r\n minFilter = gl.LINEAR;\r\n break;\r\n case Constants.TEXTURE_LINEAR_NEAREST:\r\n magFilter = gl.LINEAR;\r\n minFilter = gl.NEAREST;\r\n break;\r\n }\r\n\r\n return {\r\n min: minFilter,\r\n mag: magFilter,\r\n };\r\n }\r\n\r\n /** @internal */\r\n protected _createTexture(): WebGLTexture {\r\n const texture = this._gl.createTexture();\r\n\r\n if (!texture) {\r\n throw new Error(\"Unable to create texture\");\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n /** @internal */\r\n public _createHardwareTexture(): HardwareTextureWrapper {\r\n return new WebGLHardwareTexture(this._createTexture(), this._gl);\r\n }\r\n\r\n /**\r\n * Creates an internal texture without binding it to a framebuffer\r\n * @internal\r\n * @param size defines the size of the texture\r\n * @param options defines the options used to create the texture\r\n * @param delayGPUTextureCreation true to delay the texture creation the first time it is really needed. false to create it right away\r\n * @param source source type of the texture\r\n * @returns a new internal texture\r\n */\r\n public _createInternalTexture(\r\n size: TextureSize,\r\n options: boolean | InternalTextureCreationOptions,\r\n delayGPUTextureCreation = true,\r\n source = InternalTextureSource.Unknown\r\n ): InternalTexture {\r\n let generateMipMaps = false;\r\n let type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n let samplingMode = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n let format = Constants.TEXTUREFORMAT_RGBA;\r\n let useSRGBBuffer = false;\r\n let samples = 1;\r\n let label: string | undefined;\r\n if (options !== undefined && typeof options === \"object\") {\r\n generateMipMaps = !!options.generateMipMaps;\r\n type = options.type === undefined ? Constants.TEXTURETYPE_UNSIGNED_INT : options.type;\r\n samplingMode = options.samplingMode === undefined ? Constants.TEXTURE_TRILINEAR_SAMPLINGMODE : options.samplingMode;\r\n format = options.format === undefined ? Constants.TEXTUREFORMAT_RGBA : options.format;\r\n useSRGBBuffer = options.useSRGBBuffer === undefined ? false : options.useSRGBBuffer;\r\n samples = options.samples ?? 1;\r\n label = options.label;\r\n } else {\r\n generateMipMaps = !!options;\r\n }\r\n\r\n useSRGBBuffer &&= this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU);\r\n\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloatLinearFiltering) {\r\n // if floating point linear (gl.FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n } else if (type === Constants.TEXTURETYPE_HALF_FLOAT && !this._caps.textureHalfFloatLinearFiltering) {\r\n // if floating point linear (HALF_FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n }\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloat) {\r\n type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n Logger.Warn(\"Float textures are not supported. Type forced to TEXTURETYPE_UNSIGNED_BYTE\");\r\n }\r\n\r\n const gl = this._gl;\r\n const texture = new InternalTexture(this, source);\r\n const width = (<{ width: number; height: number; depth?: number; layers?: number }>size).width || size;\r\n const height = (<{ width: number; height: number; depth?: number; layers?: number }>size).height || size;\r\n const depth = (<{ width: number; height: number; depth?: number; layers?: number }>size).depth || 0;\r\n const layers = (<{ width: number; height: number; depth?: number; layers?: number }>size).layers || 0;\r\n const filters = this._getSamplingParameters(samplingMode, generateMipMaps);\r\n const target = layers !== 0 ? gl.TEXTURE_2D_ARRAY : depth !== 0 ? gl.TEXTURE_3D : gl.TEXTURE_2D;\r\n const sizedFormat = this._getRGBABufferInternalSizedFormat(type, format, useSRGBBuffer);\r\n const internalFormat = this._getInternalFormat(format);\r\n const textureType = this._getWebGLTextureType(type);\r\n\r\n // Bind\r\n this._bindTextureDirectly(target, texture);\r\n\r\n if (layers !== 0) {\r\n texture.is2DArray = true;\r\n gl.texImage3D(target, 0, sizedFormat, width, height, layers, 0, internalFormat, textureType, null);\r\n } else if (depth !== 0) {\r\n texture.is3D = true;\r\n gl.texImage3D(target, 0, sizedFormat, width, height, depth, 0, internalFormat, textureType, null);\r\n } else {\r\n gl.texImage2D(target, 0, sizedFormat, width, height, 0, internalFormat, textureType, null);\r\n }\r\n\r\n gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, filters.mag);\r\n gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, filters.min);\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n\r\n // MipMaps\r\n if (generateMipMaps) {\r\n this._gl.generateMipmap(target);\r\n }\r\n\r\n this._bindTextureDirectly(target, null);\r\n\r\n texture._useSRGBBuffer = useSRGBBuffer;\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.depth = layers;\r\n texture.isReady = true;\r\n texture.samples = samples;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.type = type;\r\n texture.format = format;\r\n texture.label = label;\r\n\r\n this._internalTexturesCache.push(texture);\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getUseSRGBBuffer(useSRGBBuffer: boolean, noMipmap: boolean): boolean {\r\n // Generating mipmaps for sRGB textures is not supported in WebGL1 so we must disable the support if mipmaps is enabled\r\n return useSRGBBuffer && this._caps.supportSRGBBuffers && (this.webGLVersion > 1 || this.isWebGPU || noMipmap);\r\n }\r\n\r\n protected _createTextureBase(\r\n url: Nullable,\r\n noMipmap: boolean,\r\n invertY: boolean,\r\n scene: Nullable,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<(texture: InternalTexture) => void> = null,\r\n onError: Nullable<(message: string, exception: any) => void> = null,\r\n prepareTexture: (\r\n texture: InternalTexture,\r\n extension: string,\r\n scene: Nullable,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n invertY: boolean,\r\n noMipmap: boolean,\r\n isCompressed: boolean,\r\n processFunction: (\r\n width: number,\r\n height: number,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n extension: string,\r\n texture: InternalTexture,\r\n continuationCallback: () => void\r\n ) => boolean,\r\n samplingMode: number\r\n ) => void,\r\n prepareTextureProcessFunction: (\r\n width: number,\r\n height: number,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n extension: string,\r\n texture: InternalTexture,\r\n continuationCallback: () => void\r\n ) => boolean,\r\n buffer: Nullable = null,\r\n fallback: Nullable = null,\r\n format: Nullable = null,\r\n forcedExtension: Nullable = null,\r\n mimeType?: string,\r\n loaderOptions?: any,\r\n useSRGBBuffer?: boolean\r\n ): InternalTexture {\r\n url = url || \"\";\r\n const fromData = url.substr(0, 5) === \"data:\";\r\n const fromBlob = url.substr(0, 5) === \"blob:\";\r\n const isBase64 = fromData && url.indexOf(\";base64,\") !== -1;\r\n\r\n const texture = fallback ? fallback : new InternalTexture(this, InternalTextureSource.Url);\r\n\r\n if (texture !== fallback) {\r\n texture.label = url.substring(0, 60); // default label, can be overriden by the caller\r\n }\r\n\r\n const originalUrl = url;\r\n if (this._transformTextureUrl && !isBase64 && !fallback && !buffer) {\r\n url = this._transformTextureUrl(url);\r\n }\r\n\r\n if (originalUrl !== url) {\r\n texture._originalUrl = originalUrl;\r\n }\r\n\r\n // establish the file extension, if possible\r\n const lastDot = url.lastIndexOf(\".\");\r\n let extension = forcedExtension ? forcedExtension : lastDot > -1 ? url.substring(lastDot).toLowerCase() : \"\";\r\n let loader: Nullable = null;\r\n\r\n // Remove query string\r\n const queryStringIndex = extension.indexOf(\"?\");\r\n\r\n if (queryStringIndex > -1) {\r\n extension = extension.split(\"?\")[0];\r\n }\r\n\r\n for (const availableLoader of ThinEngine._TextureLoaders) {\r\n if (availableLoader.canLoad(extension, mimeType)) {\r\n loader = availableLoader;\r\n break;\r\n }\r\n }\r\n\r\n if (scene) {\r\n scene.addPendingData(texture);\r\n }\r\n texture.url = url;\r\n texture.generateMipMaps = !noMipmap;\r\n texture.samplingMode = samplingMode;\r\n texture.invertY = invertY;\r\n texture._useSRGBBuffer = this._getUseSRGBBuffer(!!useSRGBBuffer, noMipmap);\r\n\r\n if (!this._doNotHandleContextLost) {\r\n // Keep a link to the buffer only if we plan to handle context lost\r\n texture._buffer = buffer;\r\n }\r\n\r\n let onLoadObserver: Nullable> = null;\r\n if (onLoad && !fallback) {\r\n onLoadObserver = texture.onLoadedObservable.add(onLoad);\r\n }\r\n\r\n if (!fallback) {\r\n this._internalTexturesCache.push(texture);\r\n }\r\n\r\n const onInternalError = (message?: string, exception?: any) => {\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n if (url === originalUrl) {\r\n if (onLoadObserver) {\r\n texture.onLoadedObservable.remove(onLoadObserver);\r\n }\r\n\r\n if (EngineStore.UseFallbackTexture && url !== EngineStore.FallbackTexture) {\r\n this._createTextureBase(\r\n EngineStore.FallbackTexture,\r\n noMipmap,\r\n texture.invertY,\r\n scene,\r\n samplingMode,\r\n null,\r\n onError,\r\n prepareTexture,\r\n prepareTextureProcessFunction,\r\n buffer,\r\n texture\r\n );\r\n }\r\n\r\n message = (message || \"Unknown error\") + (EngineStore.UseFallbackTexture ? \" - Fallback texture was used\" : \"\");\r\n texture.onErrorObservable.notifyObservers({ message, exception });\r\n if (onError) {\r\n onError(message, exception);\r\n }\r\n } else {\r\n // fall back to the original url if the transformed url fails to load\r\n Logger.Warn(`Failed to load ${url}, falling back to ${originalUrl}`);\r\n this._createTextureBase(\r\n originalUrl,\r\n noMipmap,\r\n texture.invertY,\r\n scene,\r\n samplingMode,\r\n onLoad,\r\n onError,\r\n prepareTexture,\r\n prepareTextureProcessFunction,\r\n buffer,\r\n texture,\r\n format,\r\n forcedExtension,\r\n mimeType,\r\n loaderOptions,\r\n useSRGBBuffer\r\n );\r\n }\r\n };\r\n\r\n // processing for non-image formats\r\n if (loader) {\r\n const callback = (data: ArrayBufferView) => {\r\n loader!.loadData(\r\n data,\r\n texture,\r\n (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void, loadFailed) => {\r\n if (loadFailed) {\r\n onInternalError(\"TextureLoader failed to load data\");\r\n } else {\r\n prepareTexture(\r\n texture,\r\n extension,\r\n scene,\r\n { width, height },\r\n texture.invertY,\r\n !loadMipmap,\r\n isCompressed,\r\n () => {\r\n done();\r\n return false;\r\n },\r\n samplingMode\r\n );\r\n }\r\n },\r\n loaderOptions\r\n );\r\n };\r\n\r\n if (!buffer) {\r\n this._loadFile(\r\n url,\r\n (data) => callback(new Uint8Array(data as ArrayBuffer)),\r\n undefined,\r\n scene ? scene.offlineProvider : undefined,\r\n true,\r\n (request?: IWebRequest, exception?: any) => {\r\n onInternalError(\"Unable to load \" + (request ? request.responseURL : url, exception));\r\n }\r\n );\r\n } else {\r\n if (buffer instanceof ArrayBuffer) {\r\n callback(new Uint8Array(buffer));\r\n } else if (ArrayBuffer.isView(buffer)) {\r\n callback(buffer);\r\n } else {\r\n if (onError) {\r\n onError(\"Unable to load: only ArrayBuffer or ArrayBufferView is supported\", null);\r\n }\r\n }\r\n }\r\n } else {\r\n const onload = (img: HTMLImageElement | ImageBitmap) => {\r\n if (fromBlob && !this._doNotHandleContextLost) {\r\n // We need to store the image if we need to rebuild the texture\r\n // in case of a webgl context lost\r\n texture._buffer = img;\r\n }\r\n\r\n prepareTexture(texture, extension, scene, img, texture.invertY, noMipmap, false, prepareTextureProcessFunction, samplingMode);\r\n };\r\n // According to the WebGL spec section 6.10, ImageBitmaps must be inverted on creation.\r\n // So, we pass imageOrientation to _FileToolsLoadImage() as it may create an ImageBitmap.\r\n\r\n if (!fromData || isBase64) {\r\n if (buffer && (typeof (buffer).decoding === \"string\" || (buffer).close)) {\r\n onload(buffer);\r\n } else {\r\n ThinEngine._FileToolsLoadImage(\r\n url,\r\n onload,\r\n onInternalError,\r\n scene ? scene.offlineProvider : null,\r\n mimeType,\r\n texture.invertY && this._features.needsInvertingBitmap ? { imageOrientation: \"flipY\" } : undefined\r\n );\r\n }\r\n } else if (typeof buffer === \"string\" || buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer) || buffer instanceof Blob) {\r\n ThinEngine._FileToolsLoadImage(\r\n buffer,\r\n onload,\r\n onInternalError,\r\n scene ? scene.offlineProvider : null,\r\n mimeType,\r\n texture.invertY && this._features.needsInvertingBitmap ? { imageOrientation: \"flipY\" } : undefined\r\n );\r\n } else if (buffer) {\r\n onload(buffer);\r\n }\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * Usually called from Texture.ts.\r\n * Passed information to create a WebGLTexture\r\n * @param url defines a value which contains one of the following:\r\n * * A conventional http URL, e.g. 'http://...' or 'file://...'\r\n * * A base64 string of in-line texture data, e.g. 'data:image/jpg;base64,/...'\r\n * * An indicator that data being passed using the buffer parameter, e.g. 'data:mytexture.jpg'\r\n * @param noMipmap defines a boolean indicating that no mipmaps shall be generated. Ignored for compressed textures. They must be in the file\r\n * @param invertY when true, image is flipped when loaded. You probably want true. Certain compressed textures may invert this if their default is inverted (eg. ktx)\r\n * @param scene needed for loading to the correct scene\r\n * @param samplingMode mode with should be used sample / access the texture (Default: Texture.TRILINEAR_SAMPLINGMODE)\r\n * @param onLoad optional callback to be called upon successful completion\r\n * @param onError optional callback to be called upon failure\r\n * @param buffer a source of a file previously fetched as either a base64 string, an ArrayBuffer (compressed or image format), HTMLImageElement (image format), or a Blob\r\n * @param fallback an internal argument in case the function must be called again, due to etc1 not having alpha capabilities\r\n * @param format internal format. Default: RGB when extension is '.jpg' else RGBA. Ignored for compressed textures\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @param mimeType defines an optional mime type\r\n * @param loaderOptions options to be passed to the loader\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\r\n * @returns a InternalTexture for assignment back into BABYLON.Texture\r\n */\r\n public createTexture(\r\n url: Nullable,\r\n noMipmap: boolean,\r\n invertY: boolean,\r\n scene: Nullable,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<(texture: InternalTexture) => void> = null,\r\n onError: Nullable<(message: string, exception: any) => void> = null,\r\n buffer: Nullable = null,\r\n fallback: Nullable = null,\r\n format: Nullable = null,\r\n forcedExtension: Nullable = null,\r\n mimeType?: string,\r\n loaderOptions?: any,\r\n creationFlags?: number,\r\n useSRGBBuffer?: boolean\r\n ): InternalTexture {\r\n return this._createTextureBase(\r\n url,\r\n noMipmap,\r\n invertY,\r\n scene,\r\n samplingMode,\r\n onLoad,\r\n onError,\r\n this._prepareWebGLTexture.bind(this),\r\n (potWidth, potHeight, img, extension, texture, continuationCallback) => {\r\n const gl = this._gl;\r\n const isPot = img.width === potWidth && img.height === potHeight;\r\n\r\n texture._creationFlags = creationFlags ?? 0;\r\n\r\n const tip = this._getTexImageParametersForCreateTexture(format, extension, texture._useSRGBBuffer);\r\n if (isPot) {\r\n gl.texImage2D(gl.TEXTURE_2D, 0, tip.internalFormat, tip.format, tip.type, img as any);\r\n return false;\r\n }\r\n\r\n const maxTextureSize = this._caps.maxTextureSize;\r\n\r\n if (img.width > maxTextureSize || img.height > maxTextureSize || !this._supportsHardwareTextureRescaling) {\r\n this._prepareWorkingCanvas();\r\n if (!this._workingCanvas || !this._workingContext) {\r\n return false;\r\n }\r\n\r\n this._workingCanvas.width = potWidth;\r\n this._workingCanvas.height = potHeight;\r\n\r\n this._workingContext.drawImage(img as any, 0, 0, img.width, img.height, 0, 0, potWidth, potHeight);\r\n gl.texImage2D(gl.TEXTURE_2D, 0, tip.internalFormat, tip.format, tip.type, this._workingCanvas as TexImageSource);\r\n\r\n texture.width = potWidth;\r\n texture.height = potHeight;\r\n\r\n return false;\r\n } else {\r\n // Using shaders when possible to rescale because canvas.drawImage is lossy\r\n const source = new InternalTexture(this, InternalTextureSource.Temp);\r\n this._bindTextureDirectly(gl.TEXTURE_2D, source, true);\r\n gl.texImage2D(gl.TEXTURE_2D, 0, tip.internalFormat, tip.format, tip.type, img as any);\r\n\r\n this._rescaleTexture(source, texture, scene, tip.format, () => {\r\n this._releaseTexture(source);\r\n this._bindTextureDirectly(gl.TEXTURE_2D, texture, true);\r\n\r\n continuationCallback();\r\n });\r\n }\r\n\r\n return true;\r\n },\r\n buffer,\r\n fallback,\r\n format,\r\n forcedExtension,\r\n mimeType,\r\n loaderOptions,\r\n useSRGBBuffer\r\n );\r\n }\r\n\r\n /**\r\n * Calls to the GL texImage2D and texImage3D functions require three arguments describing the pixel format of the texture.\r\n * createTexture derives these from the babylonFormat and useSRGBBuffer arguments and also the file extension of the URL it's working with.\r\n * This function encapsulates that derivation for easy unit testing.\r\n * @param babylonFormat Babylon's format enum, as specified in ITextureCreationOptions.\r\n * @param fileExtension The file extension including the dot, e.g. .jpg.\r\n * @param useSRGBBuffer Use SRGB not linear.\r\n * @returns The options to pass to texImage2D or texImage3D calls.\r\n * @internal\r\n */\r\n public _getTexImageParametersForCreateTexture(babylonFormat: Nullable, fileExtension: string, useSRGBBuffer: boolean): TexImageParameters {\r\n if (babylonFormat === undefined || babylonFormat === null) {\r\n babylonFormat = fileExtension === \".jpg\" && !useSRGBBuffer ? Constants.TEXTUREFORMAT_RGB : Constants.TEXTUREFORMAT_RGBA;\r\n }\r\n\r\n let format: number, internalFormat: number;\r\n if (this.webGLVersion === 1) {\r\n // In WebGL 1, format and internalFormat must be the same and taken from a limited set of values, see https://docs.gl/es2/glTexImage2D.\r\n // The SRGB extension (https://developer.mozilla.org/en-US/docs/Web/API/EXT_sRGB) adds some extra values, hence passing useSRGBBuffer\r\n // to getInternalFormat.\r\n format = this._getInternalFormat(babylonFormat, useSRGBBuffer);\r\n internalFormat = format;\r\n } else {\r\n // In WebGL 2, format has a wider range of values and internal format can be one of the sized formats, see\r\n // https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml.\r\n // SRGB is included in the sized format and should not be passed in \"format\", hence always passing useSRGBBuffer as false.\r\n format = this._getInternalFormat(babylonFormat, false);\r\n internalFormat = this._getRGBABufferInternalSizedFormat(Constants.TEXTURETYPE_UNSIGNED_BYTE, babylonFormat, useSRGBBuffer);\r\n }\r\n\r\n return {\r\n internalFormat,\r\n format,\r\n type: this._gl.UNSIGNED_BYTE,\r\n };\r\n }\r\n\r\n /**\r\n * Loads an image as an HTMLImageElement.\r\n * @param input url string, ArrayBuffer, or Blob to load\r\n * @param onLoad callback called when the image successfully loads\r\n * @param onError callback called when the image fails to load\r\n * @param offlineProvider offline provider for caching\r\n * @param mimeType optional mime type\r\n * @param imageBitmapOptions optional the options to use when creating an ImageBitmap\r\n * @returns the HTMLImageElement of the loaded image\r\n * @internal\r\n */\r\n public static _FileToolsLoadImage(\r\n input: string | ArrayBuffer | ArrayBufferView | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string, exception?: any) => void,\r\n offlineProvider: Nullable,\r\n mimeType?: string,\r\n imageBitmapOptions?: ImageBitmapOptions\r\n ): Nullable {\r\n throw _WarnImport(\"FileTools\");\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _rescaleTexture(source: InternalTexture, destination: InternalTexture, scene: Nullable, internalFormat: number, onComplete: () => void): void {}\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a raw texture\r\n * @param data defines the data to store in the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param format defines the format of the data\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default)\r\n * @param compression defines the compression used (null by default)\r\n * @param type defines the type fo the data (Engine.TEXTURETYPE_UNSIGNED_INT by default)\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).\r\n * @returns the raw texture inside an InternalTexture\r\n */\r\n public createRawTexture(\r\n data: Nullable,\r\n width: number,\r\n height: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable = null,\r\n type: number = Constants.TEXTURETYPE_UNSIGNED_INT,\r\n creationFlags = 0,\r\n useSRGBBuffer: boolean = false\r\n ): InternalTexture {\r\n throw _WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a new raw cube texture\r\n * @param data defines the array of data to use to create each face\r\n * @param size defines the size of the textures\r\n * @param format defines the format of the data\r\n * @param type defines the type of the data (like Engine.TEXTURETYPE_UNSIGNED_INT)\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compression used (null by default)\r\n * @returns the cube texture as an InternalTexture\r\n */\r\n public createRawCubeTexture(\r\n data: Nullable,\r\n size: number,\r\n format: number,\r\n type: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable = null\r\n ): InternalTexture {\r\n throw _WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a new raw 3D texture\r\n * @param data defines the data used to create the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param depth defines the depth of the texture\r\n * @param format defines the format of the texture\r\n * @param generateMipMaps defines if the engine must generate mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compressed used (can be null)\r\n * @param textureType defines the compressed used (can be null)\r\n * @returns a new raw 3D texture (stored in an InternalTexture)\r\n */\r\n public createRawTexture3D(\r\n data: Nullable,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable = null,\r\n textureType = Constants.TEXTURETYPE_UNSIGNED_INT\r\n ): InternalTexture {\r\n throw _WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a new raw 2D array texture\r\n * @param data defines the data used to create the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param depth defines the number of layers of the texture\r\n * @param format defines the format of the texture\r\n * @param generateMipMaps defines if the engine must generate mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compressed used (can be null)\r\n * @param textureType defines the compressed used (can be null)\r\n * @returns a new raw 2D array texture (stored in an InternalTexture)\r\n */\r\n public createRawTexture2DArray(\r\n data: Nullable,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n format: number,\r\n generateMipMaps: boolean,\r\n invertY: boolean,\r\n samplingMode: number,\r\n compression: Nullable = null,\r\n textureType = Constants.TEXTURETYPE_UNSIGNED_INT\r\n ): InternalTexture {\r\n throw _WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n private _unpackFlipYCached: Nullable = null;\r\n\r\n /**\r\n * In case you are sharing the context with other applications, it might\r\n * be interested to not cache the unpack flip y state to ensure a consistent\r\n * value would be set.\r\n */\r\n public enableUnpackFlipYCached = true;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _unpackFlipY(value: boolean): void {\r\n if (this._unpackFlipYCached !== value) {\r\n this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, value ? 1 : 0);\r\n\r\n if (this.enableUnpackFlipYCached) {\r\n this._unpackFlipYCached = value;\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _getUnpackAlignement(): number {\r\n return this._gl.getParameter(this._gl.UNPACK_ALIGNMENT);\r\n }\r\n\r\n private _getTextureTarget(texture: InternalTexture): number {\r\n if (texture.isCube) {\r\n return this._gl.TEXTURE_CUBE_MAP;\r\n } else if (texture.is3D) {\r\n return this._gl.TEXTURE_3D;\r\n } else if (texture.is2DArray || texture.isMultiview) {\r\n return this._gl.TEXTURE_2D_ARRAY;\r\n }\r\n return this._gl.TEXTURE_2D;\r\n }\r\n\r\n /**\r\n * Update the sampling mode of a given texture\r\n * @param samplingMode defines the required sampling mode\r\n * @param texture defines the texture to update\r\n * @param generateMipMaps defines whether to generate mipmaps for the texture\r\n */\r\n public updateTextureSamplingMode(samplingMode: number, texture: InternalTexture, generateMipMaps: boolean = false): void {\r\n const target = this._getTextureTarget(texture);\r\n const filters = this._getSamplingParameters(samplingMode, texture.useMipMaps || generateMipMaps);\r\n\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_MAG_FILTER, filters.mag, texture);\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_MIN_FILTER, filters.min);\r\n\r\n if (generateMipMaps) {\r\n texture.generateMipMaps = true;\r\n this._gl.generateMipmap(target);\r\n }\r\n\r\n this._bindTextureDirectly(target, null);\r\n\r\n texture.samplingMode = samplingMode;\r\n }\r\n\r\n /**\r\n * Update the dimensions of a texture\r\n * @param texture texture to update\r\n * @param width new width of the texture\r\n * @param height new height of the texture\r\n * @param depth new depth of the texture\r\n */\r\n public updateTextureDimensions(texture: InternalTexture, width: number, height: number, depth: number = 1): void {}\r\n\r\n /**\r\n * Update the sampling mode of a given texture\r\n * @param texture defines the texture to update\r\n * @param wrapU defines the texture wrap mode of the u coordinates\r\n * @param wrapV defines the texture wrap mode of the v coordinates\r\n * @param wrapR defines the texture wrap mode of the r coordinates\r\n */\r\n public updateTextureWrappingMode(texture: InternalTexture, wrapU: Nullable, wrapV: Nullable = null, wrapR: Nullable = null): void {\r\n const target = this._getTextureTarget(texture);\r\n\r\n if (wrapU !== null) {\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(wrapU), texture);\r\n texture._cachedWrapU = wrapU;\r\n }\r\n if (wrapV !== null) {\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(wrapV), texture);\r\n texture._cachedWrapV = wrapV;\r\n }\r\n if ((texture.is2DArray || texture.is3D) && wrapR !== null) {\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(wrapR), texture);\r\n texture._cachedWrapR = wrapR;\r\n }\r\n\r\n this._bindTextureDirectly(target, null);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setupDepthStencilTexture(\r\n internalTexture: InternalTexture,\r\n size: TextureSize,\r\n generateStencil: boolean,\r\n bilinearFiltering: boolean,\r\n comparisonFunction: number,\r\n samples = 1\r\n ): void {\r\n const width = (<{ width: number; height: number; layers?: number }>size).width || size;\r\n const height = (<{ width: number; height: number; layers?: number }>size).height || size;\r\n const layers = (<{ width: number; height: number; depth?: number; layers?: number }>size).layers || 0;\r\n const depth = (<{ width: number; height: number; depth?: number; layers?: number }>size).depth || 0;\r\n\r\n internalTexture.baseWidth = width;\r\n internalTexture.baseHeight = height;\r\n internalTexture.width = width;\r\n internalTexture.height = height;\r\n internalTexture.is2DArray = layers > 0;\r\n internalTexture.depth = layers || depth;\r\n internalTexture.isReady = true;\r\n internalTexture.samples = samples;\r\n internalTexture.generateMipMaps = false;\r\n internalTexture.samplingMode = bilinearFiltering ? Constants.TEXTURE_BILINEAR_SAMPLINGMODE : Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n internalTexture.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n internalTexture._comparisonFunction = comparisonFunction;\r\n\r\n const gl = this._gl;\r\n const target = this._getTextureTarget(internalTexture);\r\n const samplingParameters = this._getSamplingParameters(internalTexture.samplingMode, false);\r\n gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, samplingParameters.mag);\r\n gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, samplingParameters.min);\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n\r\n // TEXTURE_COMPARE_FUNC/MODE are only availble in WebGL2.\r\n if (this.webGLVersion > 1) {\r\n if (comparisonFunction === 0) {\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_FUNC, Constants.LEQUAL);\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_MODE, gl.NONE);\r\n } else {\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_FUNC, comparisonFunction);\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _uploadCompressedDataToTextureDirectly(\r\n texture: InternalTexture,\r\n internalFormat: number,\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n faceIndex: number = 0,\r\n lod: number = 0\r\n ) {\r\n const gl = this._gl;\r\n\r\n let target: GLenum = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n }\r\n\r\n if (texture._useSRGBBuffer) {\r\n switch (internalFormat) {\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB8_ETC2:\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB_ETC1_WEBGL:\r\n // Note, if using ETC1 and sRGB is requested, this will use ETC2 if available.\r\n if (this._caps.etc2) {\r\n internalFormat = gl.COMPRESSED_SRGB8_ETC2;\r\n } else {\r\n texture._useSRGBBuffer = false;\r\n }\r\n break;\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA8_ETC2_EAC:\r\n if (this._caps.etc2) {\r\n internalFormat = gl.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;\r\n } else {\r\n texture._useSRGBBuffer = false;\r\n }\r\n break;\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_BPTC_UNORM:\r\n internalFormat = gl.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT;\r\n break;\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_ASTC_4x4:\r\n internalFormat = gl.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;\r\n break;\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB_S3TC_DXT1:\r\n if (this._caps.s3tc_srgb) {\r\n internalFormat = gl.COMPRESSED_SRGB_S3TC_DXT1_EXT;\r\n } else {\r\n // S3TC sRGB extension not supported\r\n texture._useSRGBBuffer = false;\r\n }\r\n break;\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT1:\r\n if (this._caps.s3tc_srgb) {\r\n internalFormat = gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\r\n } else {\r\n // S3TC sRGB extension not supported\r\n texture._useSRGBBuffer = false;\r\n }\r\n break;\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT5:\r\n if (this._caps.s3tc_srgb) {\r\n internalFormat = gl.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\r\n } else {\r\n // S3TC sRGB extension not supported\r\n texture._useSRGBBuffer = false;\r\n }\r\n break;\r\n default:\r\n // We don't support a sRGB format corresponding to internalFormat, so revert to non sRGB format\r\n texture._useSRGBBuffer = false;\r\n break;\r\n }\r\n }\r\n\r\n this._gl.compressedTexImage2D(target, lod, internalFormat, width, height, 0, data);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _uploadDataToTextureDirectly(\r\n texture: InternalTexture,\r\n imageData: ArrayBufferView,\r\n faceIndex: number = 0,\r\n lod: number = 0,\r\n babylonInternalFormat?: number,\r\n useTextureWidthAndHeight = false\r\n ): void {\r\n const gl = this._gl;\r\n\r\n const textureType = this._getWebGLTextureType(texture.type);\r\n const format = this._getInternalFormat(texture.format);\r\n const internalFormat =\r\n babylonInternalFormat === undefined\r\n ? this._getRGBABufferInternalSizedFormat(texture.type, texture.format, texture._useSRGBBuffer)\r\n : this._getInternalFormat(babylonInternalFormat, texture._useSRGBBuffer);\r\n\r\n this._unpackFlipY(texture.invertY);\r\n\r\n let target: GLenum = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n }\r\n\r\n const lodMaxWidth = Math.round(Math.log(texture.width) * Math.LOG2E);\r\n const lodMaxHeight = Math.round(Math.log(texture.height) * Math.LOG2E);\r\n const width = useTextureWidthAndHeight ? texture.width : Math.pow(2, Math.max(lodMaxWidth - lod, 0));\r\n const height = useTextureWidthAndHeight ? texture.height : Math.pow(2, Math.max(lodMaxHeight - lod, 0));\r\n\r\n gl.texImage2D(target, lod, internalFormat, width, height, 0, format, textureType, imageData);\r\n }\r\n\r\n /**\r\n * Update a portion of an internal texture\r\n * @param texture defines the texture to update\r\n * @param imageData defines the data to store into the texture\r\n * @param xOffset defines the x coordinates of the update rectangle\r\n * @param yOffset defines the y coordinates of the update rectangle\r\n * @param width defines the width of the update rectangle\r\n * @param height defines the height of the update rectangle\r\n * @param faceIndex defines the face index if texture is a cube (0 by default)\r\n * @param lod defines the lod level to update (0 by default)\r\n * @param generateMipMaps defines whether to generate mipmaps or not\r\n */\r\n public updateTextureData(\r\n texture: InternalTexture,\r\n imageData: ArrayBufferView,\r\n xOffset: number,\r\n yOffset: number,\r\n width: number,\r\n height: number,\r\n faceIndex: number = 0,\r\n lod: number = 0,\r\n generateMipMaps = false\r\n ): void {\r\n const gl = this._gl;\r\n\r\n const textureType = this._getWebGLTextureType(texture.type);\r\n const format = this._getInternalFormat(texture.format);\r\n\r\n this._unpackFlipY(texture.invertY);\r\n\r\n let targetForBinding: GLenum = gl.TEXTURE_2D;\r\n let target: GLenum = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n targetForBinding = gl.TEXTURE_CUBE_MAP;\r\n }\r\n\r\n this._bindTextureDirectly(targetForBinding, texture, true);\r\n\r\n gl.texSubImage2D(target, lod, xOffset, yOffset, width, height, format, textureType, imageData);\r\n\r\n if (generateMipMaps) {\r\n this._gl.generateMipmap(target);\r\n }\r\n\r\n this._bindTextureDirectly(targetForBinding, null);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _uploadArrayBufferViewToTexture(texture: InternalTexture, imageData: ArrayBufferView, faceIndex: number = 0, lod: number = 0): void {\r\n const gl = this._gl;\r\n const bindTarget = texture.isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D;\r\n\r\n this._bindTextureDirectly(bindTarget, texture, true);\r\n\r\n this._uploadDataToTextureDirectly(texture, imageData, faceIndex, lod);\r\n\r\n this._bindTextureDirectly(bindTarget, null, true);\r\n }\r\n\r\n protected _prepareWebGLTextureContinuation(texture: InternalTexture, scene: Nullable, noMipmap: boolean, isCompressed: boolean, samplingMode: number): void {\r\n const gl = this._gl;\r\n if (!gl) {\r\n return;\r\n }\r\n\r\n const filters = this._getSamplingParameters(samplingMode, !noMipmap);\r\n\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filters.mag);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filters.min);\r\n\r\n if (!noMipmap && !isCompressed) {\r\n gl.generateMipmap(gl.TEXTURE_2D);\r\n }\r\n\r\n this._bindTextureDirectly(gl.TEXTURE_2D, null);\r\n\r\n // this.resetTextureCache();\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n texture.onLoadedObservable.notifyObservers(texture);\r\n texture.onLoadedObservable.clear();\r\n }\r\n\r\n private _prepareWebGLTexture(\r\n texture: InternalTexture,\r\n extension: string,\r\n scene: Nullable,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n invertY: boolean,\r\n noMipmap: boolean,\r\n isCompressed: boolean,\r\n processFunction: (\r\n width: number,\r\n height: number,\r\n img: HTMLImageElement | ImageBitmap | { width: number; height: number },\r\n extension: string,\r\n texture: InternalTexture,\r\n continuationCallback: () => void\r\n ) => boolean,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE\r\n ): void {\r\n const maxTextureSize = this.getCaps().maxTextureSize;\r\n const potWidth = Math.min(maxTextureSize, this.needPOTTextures ? ThinEngine.GetExponentOfTwo(img.width, maxTextureSize) : img.width);\r\n const potHeight = Math.min(maxTextureSize, this.needPOTTextures ? ThinEngine.GetExponentOfTwo(img.height, maxTextureSize) : img.height);\r\n\r\n const gl = this._gl;\r\n if (!gl) {\r\n return;\r\n }\r\n\r\n if (!texture._hardwareTexture) {\r\n // this.resetTextureCache();\r\n if (scene) {\r\n scene.removePendingData(texture);\r\n }\r\n\r\n return;\r\n }\r\n\r\n this._bindTextureDirectly(gl.TEXTURE_2D, texture, true);\r\n this._unpackFlipY(invertY === undefined ? true : invertY ? true : false);\r\n\r\n texture.baseWidth = img.width;\r\n texture.baseHeight = img.height;\r\n texture.width = potWidth;\r\n texture.height = potHeight;\r\n texture.isReady = true;\r\n texture.type = texture.type !== -1 ? texture.type : Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n texture.format = texture.format !== -1 ? texture.format : extension === \".jpg\" && !texture._useSRGBBuffer ? Constants.TEXTUREFORMAT_RGB : Constants.TEXTUREFORMAT_RGBA;\r\n\r\n if (\r\n processFunction(potWidth, potHeight, img, extension, texture, () => {\r\n this._prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode);\r\n })\r\n ) {\r\n // Returning as texture needs extra async steps\r\n return;\r\n }\r\n\r\n this._prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setupFramebufferDepthAttachments(\r\n generateStencilBuffer: boolean,\r\n generateDepthBuffer: boolean,\r\n width: number,\r\n height: number,\r\n samples = 1\r\n ): Nullable {\r\n const gl = this._gl;\r\n\r\n // Create the depth/stencil buffer\r\n if (generateStencilBuffer && generateDepthBuffer) {\r\n return this._createRenderBuffer(width, height, samples, gl.DEPTH_STENCIL, gl.DEPTH24_STENCIL8, gl.DEPTH_STENCIL_ATTACHMENT);\r\n }\r\n if (generateDepthBuffer) {\r\n let depthFormat: GLenum = gl.DEPTH_COMPONENT16;\r\n if (this._webGLVersion > 1) {\r\n depthFormat = gl.DEPTH_COMPONENT32F;\r\n }\r\n\r\n return this._createRenderBuffer(width, height, samples, depthFormat, depthFormat, gl.DEPTH_ATTACHMENT);\r\n }\r\n if (generateStencilBuffer) {\r\n return this._createRenderBuffer(width, height, samples, gl.STENCIL_INDEX8, gl.STENCIL_INDEX8, gl.STENCIL_ATTACHMENT);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _createRenderBuffer(\r\n width: number,\r\n height: number,\r\n samples: number,\r\n internalFormat: number,\r\n msInternalFormat: number,\r\n attachment: number,\r\n unbindBuffer = true\r\n ): Nullable {\r\n const gl = this._gl;\r\n const renderBuffer = gl.createRenderbuffer();\r\n return this._updateRenderBuffer(renderBuffer, width, height, samples, internalFormat, msInternalFormat, attachment, unbindBuffer);\r\n }\r\n\r\n public _updateRenderBuffer(\r\n renderBuffer: Nullable,\r\n width: number,\r\n height: number,\r\n samples: number,\r\n internalFormat: number,\r\n msInternalFormat: number,\r\n attachment: number,\r\n unbindBuffer = true\r\n ): Nullable {\r\n const gl = this._gl;\r\n\r\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderBuffer);\r\n\r\n if (samples > 1 && gl.renderbufferStorageMultisample) {\r\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, samples, msInternalFormat, width, height);\r\n } else {\r\n gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, width, height);\r\n }\r\n\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, renderBuffer);\r\n\r\n if (unbindBuffer) {\r\n gl.bindRenderbuffer(gl.RENDERBUFFER, null);\r\n }\r\n\r\n return renderBuffer;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseTexture(texture: InternalTexture): void {\r\n this._deleteTexture(texture._hardwareTexture?.underlyingResource);\r\n\r\n // Unbind channels\r\n this.unbindAllTextures();\r\n\r\n const index = this._internalTexturesCache.indexOf(texture);\r\n if (index !== -1) {\r\n this._internalTexturesCache.splice(index, 1);\r\n }\r\n\r\n // Integrated fixed lod samplers.\r\n if (texture._lodTextureHigh) {\r\n texture._lodTextureHigh.dispose();\r\n }\r\n if (texture._lodTextureMid) {\r\n texture._lodTextureMid.dispose();\r\n }\r\n if (texture._lodTextureLow) {\r\n texture._lodTextureLow.dispose();\r\n }\r\n\r\n // Integrated irradiance map.\r\n if (texture._irradianceTexture) {\r\n texture._irradianceTexture.dispose();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseRenderTargetWrapper(rtWrapper: RenderTargetWrapper): void {\r\n const index = this._renderTargetWrapperCache.indexOf(rtWrapper);\r\n if (index !== -1) {\r\n this._renderTargetWrapperCache.splice(index, 1);\r\n }\r\n }\r\n\r\n protected _deleteTexture(texture: Nullable): void {\r\n if (texture) {\r\n this._gl.deleteTexture(texture);\r\n }\r\n }\r\n\r\n protected _setProgram(program: WebGLProgram): void {\r\n if (this._currentProgram !== program) {\r\n this._gl.useProgram(program);\r\n this._currentProgram = program;\r\n }\r\n }\r\n\r\n protected _boundUniforms: { [key: number]: WebGLUniformLocation } = {};\r\n\r\n /**\r\n * Binds an effect to the webGL context\r\n * @param effect defines the effect to bind\r\n */\r\n public bindSamplers(effect: Effect): void {\r\n const webGLPipelineContext = effect.getPipelineContext() as WebGLPipelineContext;\r\n this._setProgram(webGLPipelineContext.program!);\r\n const samplers = effect.getSamplers();\r\n for (let index = 0; index < samplers.length; index++) {\r\n const uniform = effect.getUniform(samplers[index]);\r\n\r\n if (uniform) {\r\n this._boundUniforms[index] = uniform;\r\n }\r\n }\r\n this._currentEffect = null;\r\n }\r\n\r\n private _activateCurrentTexture() {\r\n if (this._currentTextureChannel !== this._activeChannel) {\r\n this._gl.activeTexture(this._gl.TEXTURE0 + this._activeChannel);\r\n this._currentTextureChannel = this._activeChannel;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bindTextureDirectly(target: number, texture: Nullable, forTextureDataUpdate = false, force = false): boolean {\r\n let wasPreviouslyBound = false;\r\n const isTextureForRendering = texture && texture._associatedChannel > -1;\r\n if (forTextureDataUpdate && isTextureForRendering) {\r\n this._activeChannel = texture!._associatedChannel;\r\n }\r\n\r\n const currentTextureBound = this._boundTexturesCache[this._activeChannel];\r\n\r\n if (currentTextureBound !== texture || force) {\r\n this._activateCurrentTexture();\r\n\r\n if (texture && texture.isMultiview) {\r\n //this._gl.bindTexture(target, texture ? texture._colorTextureArray : null);\r\n Logger.Error([\"_bindTextureDirectly called with a multiview texture!\", target, texture]);\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"_bindTextureDirectly called with a multiview texture!\";\r\n } else {\r\n this._gl.bindTexture(target, texture?._hardwareTexture?.underlyingResource ?? null);\r\n }\r\n\r\n this._boundTexturesCache[this._activeChannel] = texture;\r\n\r\n if (texture) {\r\n texture._associatedChannel = this._activeChannel;\r\n }\r\n } else if (forTextureDataUpdate) {\r\n wasPreviouslyBound = true;\r\n this._activateCurrentTexture();\r\n }\r\n\r\n if (isTextureForRendering && !forTextureDataUpdate) {\r\n this._bindSamplerUniformToChannel(texture!._associatedChannel, this._activeChannel);\r\n }\r\n\r\n return wasPreviouslyBound;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bindTexture(channel: number, texture: Nullable, name: string): void {\r\n if (channel === undefined) {\r\n return;\r\n }\r\n\r\n if (texture) {\r\n texture._associatedChannel = channel;\r\n }\r\n\r\n this._activeChannel = channel;\r\n const target = texture ? this._getTextureTarget(texture) : this._gl.TEXTURE_2D;\r\n this._bindTextureDirectly(target, texture);\r\n }\r\n\r\n /**\r\n * Unbind all textures from the webGL context\r\n */\r\n public unbindAllTextures(): void {\r\n for (let channel = 0; channel < this._maxSimultaneousTextures; channel++) {\r\n this._activeChannel = channel;\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null);\r\n if (this.webGLVersion > 1) {\r\n this._bindTextureDirectly(this._gl.TEXTURE_3D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a texture to the according uniform.\r\n * @param channel The texture channel\r\n * @param uniform The uniform to set\r\n * @param texture The texture to apply\r\n * @param name The name of the uniform in the effect\r\n */\r\n public setTexture(channel: number, uniform: Nullable, texture: Nullable, name: string): void {\r\n if (channel === undefined) {\r\n return;\r\n }\r\n\r\n if (uniform) {\r\n this._boundUniforms[channel] = uniform;\r\n }\r\n\r\n this._setTexture(channel, texture);\r\n }\r\n\r\n private _bindSamplerUniformToChannel(sourceSlot: number, destination: number) {\r\n const uniform = this._boundUniforms[sourceSlot];\r\n if (!uniform || uniform._currentState === destination) {\r\n return;\r\n }\r\n this._gl.uniform1i(uniform, destination);\r\n uniform._currentState = destination;\r\n }\r\n\r\n private _getTextureWrapMode(mode: number): number {\r\n switch (mode) {\r\n case Constants.TEXTURE_WRAP_ADDRESSMODE:\r\n return this._gl.REPEAT;\r\n case Constants.TEXTURE_CLAMP_ADDRESSMODE:\r\n return this._gl.CLAMP_TO_EDGE;\r\n case Constants.TEXTURE_MIRROR_ADDRESSMODE:\r\n return this._gl.MIRRORED_REPEAT;\r\n }\r\n return this._gl.REPEAT;\r\n }\r\n\r\n protected _setTexture(channel: number, texture: Nullable, isPartOfTextureArray = false, depthStencilTexture = false, name = \"\"): boolean {\r\n // Not ready?\r\n if (!texture) {\r\n if (this._boundTexturesCache[channel] != null) {\r\n this._activeChannel = channel;\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null);\r\n if (this.webGLVersion > 1) {\r\n this._bindTextureDirectly(this._gl.TEXTURE_3D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null);\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n // Video\r\n if ((texture).video) {\r\n this._activeChannel = channel;\r\n const videoInternalTexture = (texture).getInternalTexture();\r\n if (videoInternalTexture) {\r\n videoInternalTexture._associatedChannel = channel;\r\n }\r\n (texture).update();\r\n } else if (texture.delayLoadState === Constants.DELAYLOADSTATE_NOTLOADED) {\r\n // Delay loading\r\n texture.delayLoad();\r\n return false;\r\n }\r\n\r\n let internalTexture: InternalTexture;\r\n if (depthStencilTexture) {\r\n internalTexture = (texture).depthStencilTexture!;\r\n } else if (texture.isReady()) {\r\n internalTexture = texture.getInternalTexture();\r\n } else if (texture.isCube) {\r\n internalTexture = this.emptyCubeTexture;\r\n } else if (texture.is3D) {\r\n internalTexture = this.emptyTexture3D;\r\n } else if (texture.is2DArray) {\r\n internalTexture = this.emptyTexture2DArray;\r\n } else {\r\n internalTexture = this.emptyTexture;\r\n }\r\n\r\n if (!isPartOfTextureArray && internalTexture) {\r\n internalTexture._associatedChannel = channel;\r\n }\r\n\r\n let needToBind = true;\r\n if (this._boundTexturesCache[channel] === internalTexture) {\r\n if (!isPartOfTextureArray) {\r\n this._bindSamplerUniformToChannel(internalTexture._associatedChannel, channel);\r\n }\r\n\r\n needToBind = false;\r\n }\r\n\r\n this._activeChannel = channel;\r\n const target = this._getTextureTarget(internalTexture);\r\n if (needToBind) {\r\n this._bindTextureDirectly(target, internalTexture, isPartOfTextureArray);\r\n }\r\n\r\n if (internalTexture && !internalTexture.isMultiview) {\r\n // CUBIC_MODE and SKYBOX_MODE both require CLAMP_TO_EDGE. All other modes use REPEAT.\r\n if (internalTexture.isCube && internalTexture._cachedCoordinatesMode !== texture.coordinatesMode) {\r\n internalTexture._cachedCoordinatesMode = texture.coordinatesMode;\r\n\r\n const textureWrapMode =\r\n texture.coordinatesMode !== Constants.TEXTURE_CUBIC_MODE && texture.coordinatesMode !== Constants.TEXTURE_SKYBOX_MODE\r\n ? Constants.TEXTURE_WRAP_ADDRESSMODE\r\n : Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n texture.wrapU = textureWrapMode;\r\n texture.wrapV = textureWrapMode;\r\n }\r\n\r\n if (internalTexture._cachedWrapU !== texture.wrapU) {\r\n internalTexture._cachedWrapU = texture.wrapU;\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(texture.wrapU), internalTexture);\r\n }\r\n\r\n if (internalTexture._cachedWrapV !== texture.wrapV) {\r\n internalTexture._cachedWrapV = texture.wrapV;\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(texture.wrapV), internalTexture);\r\n }\r\n\r\n if (internalTexture.is3D && internalTexture._cachedWrapR !== texture.wrapR) {\r\n internalTexture._cachedWrapR = texture.wrapR;\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(texture.wrapR), internalTexture);\r\n }\r\n\r\n this._setAnisotropicLevel(target, internalTexture, texture.anisotropicFilteringLevel);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Sets an array of texture to the webGL context\r\n * @param channel defines the channel where the texture array must be set\r\n * @param uniform defines the associated uniform location\r\n * @param textures defines the array of textures to bind\r\n * @param name name of the channel\r\n */\r\n public setTextureArray(channel: number, uniform: Nullable, textures: ThinTexture[], name: string): void {\r\n if (channel === undefined || !uniform) {\r\n return;\r\n }\r\n\r\n if (!this._textureUnits || this._textureUnits.length !== textures.length) {\r\n this._textureUnits = new Int32Array(textures.length);\r\n }\r\n for (let i = 0; i < textures.length; i++) {\r\n const texture = textures[i].getInternalTexture();\r\n\r\n if (texture) {\r\n this._textureUnits[i] = channel + i;\r\n texture._associatedChannel = channel + i;\r\n } else {\r\n this._textureUnits[i] = -1;\r\n }\r\n }\r\n this._gl.uniform1iv(uniform, this._textureUnits);\r\n\r\n for (let index = 0; index < textures.length; index++) {\r\n this._setTexture(this._textureUnits[index], textures[index], true);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setAnisotropicLevel(target: number, internalTexture: InternalTexture, anisotropicFilteringLevel: number) {\r\n const anisotropicFilterExtension = this._caps.textureAnisotropicFilterExtension;\r\n if (\r\n internalTexture.samplingMode !== Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST &&\r\n internalTexture.samplingMode !== Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR &&\r\n internalTexture.samplingMode !== Constants.TEXTURE_LINEAR_LINEAR\r\n ) {\r\n anisotropicFilteringLevel = 1; // Forcing the anisotropic to 1 because else webgl will force filters to linear\r\n }\r\n\r\n if (anisotropicFilterExtension && internalTexture._cachedAnisotropicFilteringLevel !== anisotropicFilteringLevel) {\r\n this._setTextureParameterFloat(\r\n target,\r\n anisotropicFilterExtension.TEXTURE_MAX_ANISOTROPY_EXT,\r\n Math.min(anisotropicFilteringLevel, this._caps.maxAnisotropy),\r\n internalTexture\r\n );\r\n internalTexture._cachedAnisotropicFilteringLevel = anisotropicFilteringLevel;\r\n }\r\n }\r\n\r\n private _setTextureParameterFloat(target: number, parameter: number, value: number, texture: InternalTexture): void {\r\n this._bindTextureDirectly(target, texture, true, true);\r\n this._gl.texParameterf(target, parameter, value);\r\n }\r\n\r\n private _setTextureParameterInteger(target: number, parameter: number, value: number, texture?: InternalTexture) {\r\n if (texture) {\r\n this._bindTextureDirectly(target, texture, true, true);\r\n }\r\n this._gl.texParameteri(target, parameter, value);\r\n }\r\n\r\n /**\r\n * Unbind all vertex attributes from the webGL context\r\n */\r\n public unbindAllAttributes() {\r\n if (this._mustWipeVertexAttributes) {\r\n this._mustWipeVertexAttributes = false;\r\n\r\n for (let i = 0; i < this._caps.maxVertexAttribs; i++) {\r\n this.disableAttributeByIndex(i);\r\n }\r\n return;\r\n }\r\n\r\n for (let i = 0, ul = this._vertexAttribArraysEnabled.length; i < ul; i++) {\r\n if (i >= this._caps.maxVertexAttribs || !this._vertexAttribArraysEnabled[i]) {\r\n continue;\r\n }\r\n\r\n this.disableAttributeByIndex(i);\r\n }\r\n }\r\n\r\n /**\r\n * Force the engine to release all cached effects. This means that next effect compilation will have to be done completely even if a similar effect was already compiled\r\n */\r\n public releaseEffects() {\r\n for (const name in this._compiledEffects) {\r\n const webGLPipelineContext = this._compiledEffects[name].getPipelineContext() as WebGLPipelineContext;\r\n this._deletePipelineContext(webGLPipelineContext);\r\n }\r\n\r\n this._compiledEffects = {};\r\n }\r\n\r\n /**\r\n * Dispose and release all associated resources\r\n */\r\n public dispose(): void {\r\n this._isDisposed = true;\r\n this.stopRenderLoop();\r\n\r\n // Clear observables\r\n if (this.onBeforeTextureInitObservable) {\r\n this.onBeforeTextureInitObservable.clear();\r\n }\r\n\r\n // Empty texture\r\n if (this._emptyTexture) {\r\n this._releaseTexture(this._emptyTexture);\r\n this._emptyTexture = null;\r\n }\r\n if (this._emptyCubeTexture) {\r\n this._releaseTexture(this._emptyCubeTexture);\r\n this._emptyCubeTexture = null;\r\n }\r\n\r\n if (this._dummyFramebuffer) {\r\n this._gl.deleteFramebuffer(this._dummyFramebuffer);\r\n }\r\n\r\n // Release effects\r\n this.releaseEffects();\r\n this.releaseComputeEffects?.();\r\n\r\n // Unbind\r\n this.unbindAllAttributes();\r\n this._boundUniforms = {};\r\n\r\n // Events\r\n if (IsWindowObjectExist()) {\r\n if (this._renderingCanvas) {\r\n if (!this._doNotHandleContextLost) {\r\n this._renderingCanvas.removeEventListener(\"webglcontextlost\", this._onContextLost);\r\n this._renderingCanvas.removeEventListener(\"webglcontextrestored\", this._onContextRestored);\r\n }\r\n\r\n window.removeEventListener(\"resize\", this._checkForMobile);\r\n }\r\n }\r\n\r\n this._workingCanvas = null;\r\n this._workingContext = null;\r\n this._currentBufferPointers.length = 0;\r\n this._renderingCanvas = null;\r\n this._currentProgram = null;\r\n this._boundRenderFunction = null;\r\n\r\n Effect.ResetCache();\r\n\r\n // Abort active requests\r\n for (const request of this._activeRequests) {\r\n request.abort();\r\n }\r\n\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n\r\n if (this._creationOptions.loseContextOnDispose) {\r\n this._gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\r\n }\r\n }\r\n\r\n /**\r\n * Attach a new callback raised when context lost event is fired\r\n * @param callback defines the callback to call\r\n */\r\n public attachContextLostEvent(callback: (event: WebGLContextEvent) => void): void {\r\n if (this._renderingCanvas) {\r\n this._renderingCanvas.addEventListener(\"webglcontextlost\", callback, false);\r\n }\r\n }\r\n\r\n /**\r\n * Attach a new callback raised when context restored event is fired\r\n * @param callback defines the callback to call\r\n */\r\n public attachContextRestoredEvent(callback: (event: WebGLContextEvent) => void): void {\r\n if (this._renderingCanvas) {\r\n this._renderingCanvas.addEventListener(\"webglcontextrestored\", callback, false);\r\n }\r\n }\r\n\r\n /**\r\n * Get the current error code of the webGL context\r\n * @returns the error code\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError\r\n */\r\n public getError(): number {\r\n return this._gl.getError();\r\n }\r\n\r\n private _canRenderToFloatFramebuffer(): boolean {\r\n if (this._webGLVersion > 1) {\r\n return this._caps.colorBufferFloat;\r\n }\r\n return this._canRenderToFramebuffer(Constants.TEXTURETYPE_FLOAT);\r\n }\r\n\r\n private _canRenderToHalfFloatFramebuffer(): boolean {\r\n if (this._webGLVersion > 1) {\r\n return this._caps.colorBufferFloat;\r\n }\r\n return this._canRenderToFramebuffer(Constants.TEXTURETYPE_HALF_FLOAT);\r\n }\r\n\r\n // Thank you : http://stackoverflow.com/questions/28827511/webgl-ios-render-to-floating-point-texture\r\n private _canRenderToFramebuffer(type: number): boolean {\r\n const gl = this._gl;\r\n\r\n //clear existing errors\r\n // eslint-disable-next-line no-empty\r\n while (gl.getError() !== gl.NO_ERROR) {}\r\n\r\n let successful = true;\r\n\r\n const texture = gl.createTexture();\r\n gl.bindTexture(gl.TEXTURE_2D, texture);\r\n gl.texImage2D(gl.TEXTURE_2D, 0, this._getRGBABufferInternalSizedFormat(type), 1, 1, 0, gl.RGBA, this._getWebGLTextureType(type), null);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\r\n\r\n const fb = gl.createFramebuffer();\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb);\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\r\n const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\r\n\r\n successful = successful && status === gl.FRAMEBUFFER_COMPLETE;\r\n successful = successful && gl.getError() === gl.NO_ERROR;\r\n\r\n //try render by clearing frame buffer's color buffer\r\n if (successful) {\r\n gl.clear(gl.COLOR_BUFFER_BIT);\r\n successful = successful && gl.getError() === gl.NO_ERROR;\r\n }\r\n\r\n //try reading from frame to ensure render occurs (just creating the FBO is not sufficient to determine if rendering is supported)\r\n if (successful) {\r\n //in practice it's sufficient to just read from the backbuffer rather than handle potentially issues reading from the texture\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\r\n const readFormat = gl.RGBA;\r\n const readType = gl.UNSIGNED_BYTE;\r\n const buffer = new Uint8Array(4);\r\n gl.readPixels(0, 0, 1, 1, readFormat, readType, buffer);\r\n successful = successful && gl.getError() === gl.NO_ERROR;\r\n }\r\n\r\n //clean up\r\n gl.deleteTexture(texture);\r\n gl.deleteFramebuffer(fb);\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\r\n\r\n //clear accumulated errors\r\n // eslint-disable-next-line no-empty\r\n while (!successful && gl.getError() !== gl.NO_ERROR) {}\r\n\r\n return successful;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getWebGLTextureType(type: number): number {\r\n if (this._webGLVersion === 1) {\r\n switch (type) {\r\n case Constants.TEXTURETYPE_FLOAT:\r\n return this._gl.FLOAT;\r\n case Constants.TEXTURETYPE_HALF_FLOAT:\r\n return this._gl.HALF_FLOAT_OES;\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE:\r\n return this._gl.UNSIGNED_BYTE;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4:\r\n return this._gl.UNSIGNED_SHORT_4_4_4_4;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1:\r\n return this._gl.UNSIGNED_SHORT_5_5_5_1;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5:\r\n return this._gl.UNSIGNED_SHORT_5_6_5;\r\n }\r\n return this._gl.UNSIGNED_BYTE;\r\n }\r\n\r\n switch (type) {\r\n case Constants.TEXTURETYPE_BYTE:\r\n return this._gl.BYTE;\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE:\r\n return this._gl.UNSIGNED_BYTE;\r\n case Constants.TEXTURETYPE_SHORT:\r\n return this._gl.SHORT;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT:\r\n return this._gl.UNSIGNED_SHORT;\r\n case Constants.TEXTURETYPE_INT:\r\n return this._gl.INT;\r\n case Constants.TEXTURETYPE_UNSIGNED_INTEGER: // Refers to UNSIGNED_INT\r\n return this._gl.UNSIGNED_INT;\r\n case Constants.TEXTURETYPE_FLOAT:\r\n return this._gl.FLOAT;\r\n case Constants.TEXTURETYPE_HALF_FLOAT:\r\n return this._gl.HALF_FLOAT;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4:\r\n return this._gl.UNSIGNED_SHORT_4_4_4_4;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1:\r\n return this._gl.UNSIGNED_SHORT_5_5_5_1;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5:\r\n return this._gl.UNSIGNED_SHORT_5_6_5;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV:\r\n return this._gl.UNSIGNED_INT_2_10_10_10_REV;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_24_8:\r\n return this._gl.UNSIGNED_INT_24_8;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV:\r\n return this._gl.UNSIGNED_INT_10F_11F_11F_REV;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV:\r\n return this._gl.UNSIGNED_INT_5_9_9_9_REV;\r\n case Constants.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV:\r\n return this._gl.FLOAT_32_UNSIGNED_INT_24_8_REV;\r\n }\r\n\r\n return this._gl.UNSIGNED_BYTE;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getInternalFormat(format: number, useSRGBBuffer = false): number {\r\n let internalFormat: GLenum = useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA;\r\n\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_ALPHA:\r\n internalFormat = this._gl.ALPHA;\r\n break;\r\n case Constants.TEXTUREFORMAT_LUMINANCE:\r\n internalFormat = this._gl.LUMINANCE;\r\n break;\r\n case Constants.TEXTUREFORMAT_LUMINANCE_ALPHA:\r\n internalFormat = this._gl.LUMINANCE_ALPHA;\r\n break;\r\n case Constants.TEXTUREFORMAT_RED:\r\n internalFormat = this._gl.RED;\r\n break;\r\n case Constants.TEXTUREFORMAT_RG:\r\n internalFormat = this._gl.RG;\r\n break;\r\n case Constants.TEXTUREFORMAT_RGB:\r\n internalFormat = useSRGBBuffer ? this._glSRGBExtensionValues.SRGB : this._gl.RGB;\r\n break;\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n internalFormat = useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA;\r\n break;\r\n }\r\n\r\n if (this._webGLVersion > 1) {\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n internalFormat = this._gl.RED_INTEGER;\r\n break;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n internalFormat = this._gl.RG_INTEGER;\r\n break;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n internalFormat = this._gl.RGB_INTEGER;\r\n break;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n internalFormat = this._gl.RGBA_INTEGER;\r\n break;\r\n }\r\n }\r\n\r\n return internalFormat;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getRGBABufferInternalSizedFormat(type: number, format?: number, useSRGBBuffer = false): number {\r\n if (this._webGLVersion === 1) {\r\n if (format !== undefined) {\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_ALPHA:\r\n return this._gl.ALPHA;\r\n case Constants.TEXTUREFORMAT_LUMINANCE:\r\n return this._gl.LUMINANCE;\r\n case Constants.TEXTUREFORMAT_LUMINANCE_ALPHA:\r\n return this._gl.LUMINANCE_ALPHA;\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB : this._gl.RGB;\r\n }\r\n }\r\n return this._gl.RGBA;\r\n }\r\n\r\n switch (type) {\r\n case Constants.TEXTURETYPE_BYTE:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED:\r\n return this._gl.R8_SNORM;\r\n case Constants.TEXTUREFORMAT_RG:\r\n return this._gl.RG8_SNORM;\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return this._gl.RGB8_SNORM;\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return this._gl.R8I;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return this._gl.RG8I;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return this._gl.RGB8I;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGBA8I;\r\n default:\r\n return this._gl.RGBA8_SNORM;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED:\r\n return this._gl.R8;\r\n case Constants.TEXTUREFORMAT_RG:\r\n return this._gl.RG8;\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8 : this._gl.RGB8; // By default. Other possibilities are RGB565, SRGB8.\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA8; // By default. Other possibilities are RGB5_A1, RGBA4, SRGB8_ALPHA8.\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return this._gl.R8UI;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return this._gl.RG8UI;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return this._gl.RGB8UI;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGBA8UI;\r\n case Constants.TEXTUREFORMAT_ALPHA:\r\n return this._gl.ALPHA;\r\n case Constants.TEXTUREFORMAT_LUMINANCE:\r\n return this._gl.LUMINANCE;\r\n case Constants.TEXTUREFORMAT_LUMINANCE_ALPHA:\r\n return this._gl.LUMINANCE_ALPHA;\r\n default:\r\n return this._gl.RGBA8;\r\n }\r\n case Constants.TEXTURETYPE_SHORT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return this._gl.R16I;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return this._gl.RG16I;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return this._gl.RGB16I;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGBA16I;\r\n default:\r\n return this._gl.RGBA16I;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return this._gl.R16UI;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return this._gl.RG16UI;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return this._gl.RGB16UI;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGBA16UI;\r\n default:\r\n return this._gl.RGBA16UI;\r\n }\r\n case Constants.TEXTURETYPE_INT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return this._gl.R32I;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return this._gl.RG32I;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return this._gl.RGB32I;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGBA32I;\r\n default:\r\n return this._gl.RGBA32I;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_INTEGER: // Refers to UNSIGNED_INT\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return this._gl.R32UI;\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return this._gl.RG32UI;\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return this._gl.RGB32UI;\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGBA32UI;\r\n default:\r\n return this._gl.RGBA32UI;\r\n }\r\n case Constants.TEXTURETYPE_FLOAT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED:\r\n return this._gl.R32F; // By default. Other possibility is R16F.\r\n case Constants.TEXTUREFORMAT_RG:\r\n return this._gl.RG32F; // By default. Other possibility is RG16F.\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return this._gl.RGB32F; // By default. Other possibilities are RGB16F, R11F_G11F_B10F, RGB9_E5.\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return this._gl.RGBA32F; // By default. Other possibility is RGBA16F.\r\n default:\r\n return this._gl.RGBA32F;\r\n }\r\n case Constants.TEXTURETYPE_HALF_FLOAT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED:\r\n return this._gl.R16F;\r\n case Constants.TEXTUREFORMAT_RG:\r\n return this._gl.RG16F;\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return this._gl.RGB16F; // By default. Other possibilities are R11F_G11F_B10F, RGB9_E5.\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return this._gl.RGBA16F;\r\n default:\r\n return this._gl.RGBA16F;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5:\r\n return this._gl.RGB565;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV:\r\n return this._gl.R11F_G11F_B10F;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV:\r\n return this._gl.RGB9_E5;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4:\r\n return this._gl.RGBA4;\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1:\r\n return this._gl.RGB5_A1;\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return this._gl.RGB10_A2; // By default. Other possibility is RGB5_A1.\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return this._gl.RGB10_A2UI;\r\n default:\r\n return this._gl.RGB10_A2;\r\n }\r\n }\r\n\r\n return useSRGBBuffer ? this._glSRGBExtensionValues.SRGB8_ALPHA8 : this._gl.RGBA8;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (data: any) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: IWebRequest, exception?: any) => void\r\n ): IFileRequest {\r\n const request = ThinEngine._FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);\r\n this._activeRequests.push(request);\r\n request.onCompleteObservable.add((request) => {\r\n this._activeRequests.splice(this._activeRequests.indexOf(request), 1);\r\n });\r\n return request;\r\n }\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @returns a file request object\r\n * @internal\r\n */\r\n public static _FileToolsLoadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void\r\n ): IFileRequest {\r\n throw _WarnImport(\"FileTools\");\r\n }\r\n\r\n /**\r\n * Reads pixels from the current frame buffer. Please note that this function can be slow\r\n * @param x defines the x coordinate of the rectangle where pixels must be read\r\n * @param y defines the y coordinate of the rectangle where pixels must be read\r\n * @param width defines the width of the rectangle where pixels must be read\r\n * @param height defines the height of the rectangle where pixels must be read\r\n * @param hasAlpha defines whether the output should have alpha or not (defaults to true)\r\n * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels\r\n * @returns a ArrayBufferView promise (Uint8Array) containing RGBA colors\r\n */\r\n public readPixels(x: number, y: number, width: number, height: number, hasAlpha = true, flushRenderer = true): Promise {\r\n const numChannels = hasAlpha ? 4 : 3;\r\n const format = hasAlpha ? this._gl.RGBA : this._gl.RGB;\r\n const data = new Uint8Array(height * width * numChannels);\r\n if (flushRenderer) {\r\n this.flushFramebuffer();\r\n }\r\n this._gl.readPixels(x, y, width, height, format, this._gl.UNSIGNED_BYTE, data);\r\n return Promise.resolve(data);\r\n }\r\n\r\n // Statics\r\n\r\n private static _IsSupported: Nullable = null;\r\n private static _HasMajorPerformanceCaveat: Nullable = null;\r\n\r\n /**\r\n * Gets a Promise indicating if the engine can be instantiated (ie. if a webGL context can be found)\r\n */\r\n public static get IsSupportedAsync(): Promise {\r\n return Promise.resolve(this.isSupported());\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the engine can be instantiated (ie. if a webGL context can be found)\r\n */\r\n public static get IsSupported(): boolean {\r\n return this.isSupported(); // Backward compat\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the engine can be instantiated (ie. if a webGL context can be found)\r\n * @returns true if the engine can be created\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static isSupported(): boolean {\r\n if (this._HasMajorPerformanceCaveat !== null) {\r\n return !this._HasMajorPerformanceCaveat; // We know it is performant so WebGL is supported\r\n }\r\n\r\n if (this._IsSupported === null) {\r\n try {\r\n const tempcanvas = this._CreateCanvas(1, 1);\r\n const gl = tempcanvas.getContext(\"webgl\") || (tempcanvas as any).getContext(\"experimental-webgl\");\r\n\r\n this._IsSupported = gl != null && !!window.WebGLRenderingContext;\r\n } catch (e) {\r\n this._IsSupported = false;\r\n }\r\n }\r\n\r\n return this._IsSupported;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the engine can be instantiated on a performant device (ie. if a webGL context can be found and it does not use a slow implementation)\r\n */\r\n public static get HasMajorPerformanceCaveat(): boolean {\r\n if (this._HasMajorPerformanceCaveat === null) {\r\n try {\r\n const tempcanvas = this._CreateCanvas(1, 1);\r\n const gl =\r\n tempcanvas.getContext(\"webgl\", { failIfMajorPerformanceCaveat: true }) ||\r\n (tempcanvas as any).getContext(\"experimental-webgl\", { failIfMajorPerformanceCaveat: true });\r\n\r\n this._HasMajorPerformanceCaveat = !gl;\r\n } catch (e) {\r\n this._HasMajorPerformanceCaveat = false;\r\n }\r\n }\r\n\r\n return this._HasMajorPerformanceCaveat;\r\n }\r\n\r\n /**\r\n * Find the next highest power of two.\r\n * @param x Number to start search from.\r\n * @returns Next highest power of two.\r\n */\r\n public static CeilingPOT(x: number): number {\r\n x--;\r\n x |= x >> 1;\r\n x |= x >> 2;\r\n x |= x >> 4;\r\n x |= x >> 8;\r\n x |= x >> 16;\r\n x++;\r\n return x;\r\n }\r\n\r\n /**\r\n * Find the next lowest power of two.\r\n * @param x Number to start search from.\r\n * @returns Next lowest power of two.\r\n */\r\n public static FloorPOT(x: number): number {\r\n x = x | (x >> 1);\r\n x = x | (x >> 2);\r\n x = x | (x >> 4);\r\n x = x | (x >> 8);\r\n x = x | (x >> 16);\r\n return x - (x >> 1);\r\n }\r\n\r\n /**\r\n * Find the nearest power of two.\r\n * @param x Number to start search from.\r\n * @returns Next nearest power of two.\r\n */\r\n public static NearestPOT(x: number): number {\r\n const c = ThinEngine.CeilingPOT(x);\r\n const f = ThinEngine.FloorPOT(x);\r\n return c - x > x - f ? f : c;\r\n }\r\n\r\n /**\r\n * Get the closest exponent of two\r\n * @param value defines the value to approximate\r\n * @param max defines the maximum value to return\r\n * @param mode defines how to define the closest value\r\n * @returns closest exponent of two of the given value\r\n */\r\n public static GetExponentOfTwo(value: number, max: number, mode = Constants.SCALEMODE_NEAREST): number {\r\n let pot;\r\n\r\n switch (mode) {\r\n case Constants.SCALEMODE_FLOOR:\r\n pot = ThinEngine.FloorPOT(value);\r\n break;\r\n case Constants.SCALEMODE_NEAREST:\r\n pot = ThinEngine.NearestPOT(value);\r\n break;\r\n case Constants.SCALEMODE_CEILING:\r\n default:\r\n pot = ThinEngine.CeilingPOT(value);\r\n break;\r\n }\r\n\r\n return Math.min(pot, max);\r\n }\r\n\r\n /**\r\n * Queue a new function into the requested animation frame pool (ie. this function will be executed by the browser (or the javascript engine) for the next frame)\r\n * @param func - the function to be called\r\n * @param requester - the object that will request the next frame. Falls back to window.\r\n * @returns frame number\r\n */\r\n public static QueueNewFrame(func: () => void, requester?: any): number {\r\n // Note that there is kind of a typing issue here, as `setTimeout` might return something else than a number (NodeJs returns a NodeJS.Timeout object).\r\n // Also if the global `requestAnimationFrame`'s returnType is number, `requester.requestPostAnimationFrame` and `requester.requestAnimationFrame` types\r\n // are `any`.\r\n\r\n if (!IsWindowObjectExist()) {\r\n if (typeof requestAnimationFrame === \"function\") {\r\n return requestAnimationFrame(func);\r\n }\r\n } else {\r\n const { requestAnimationFrame } = requester || window;\r\n if (typeof requestAnimationFrame === \"function\") {\r\n return requestAnimationFrame(func);\r\n }\r\n }\r\n\r\n // fallback to the global `setTimeout`.\r\n // In most cases (aka in the browser), `window` is the global object, so instead of calling `window.setTimeout` we could call the global `setTimeout`.\r\n return setTimeout(func, 16) as unknown as number;\r\n }\r\n\r\n /**\r\n * Gets host document\r\n * @returns the host document object\r\n */\r\n public getHostDocument(): Nullable {\r\n if (this._renderingCanvas && this._renderingCanvas.ownerDocument) {\r\n return this._renderingCanvas.ownerDocument;\r\n }\r\n\r\n return IsDocumentAvailable() ? document : null;\r\n }\r\n}\r\n\r\ninterface TexImageParameters {\r\n internalFormat: number;\r\n format: number;\r\n type: number;\r\n}\r\n", "import { IsWindowObjectExist } from \"./domManagement\";\r\n\r\n/**\r\n * Class used to provide helper for timing\r\n */\r\nexport class TimingTools {\r\n /**\r\n * Polyfill for setImmediate\r\n * @param action defines the action to execute after the current execution block\r\n */\r\n public static SetImmediate(action: () => void) {\r\n if (IsWindowObjectExist() && window.setImmediate) {\r\n window.setImmediate(action);\r\n } else {\r\n setTimeout(action, 1);\r\n }\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { WebRequest } from \"./webRequest\";\r\nimport { IsWindowObjectExist } from \"./domManagement\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { IOfflineProvider } from \"../Offline/IOfflineProvider\";\r\nimport type { IFileRequest } from \"./fileRequest\";\r\nimport { Observable } from \"./observable\";\r\nimport { FilesInputStore } from \"./filesInputStore\";\r\nimport { RetryStrategy } from \"./retryStrategy\";\r\nimport { BaseError, ErrorCodes, RuntimeError } from \"./error\";\r\nimport { DecodeBase64ToBinary, DecodeBase64ToString, EncodeArrayBufferToBase64 } from \"./stringTools\";\r\nimport { ShaderProcessor } from \"../Engines/Processors/shaderProcessor\";\r\nimport { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Logger } from \"./logger\";\r\nimport { TimingTools } from \"./timingTools\";\r\nimport type { INative } from \"../Engines/Native/nativeInterfaces\";\r\n\r\nconst Base64DataUrlRegEx = new RegExp(/^data:([^,]+\\/[^,]+)?;base64,/i);\r\ndeclare const _native: INative;\r\n\r\n/** @ignore */\r\nexport class LoadFileError extends RuntimeError {\r\n public request?: WebRequest;\r\n public file?: File;\r\n\r\n /**\r\n * Creates a new LoadFileError\r\n * @param message defines the message of the error\r\n * @param object defines the optional web request\r\n */\r\n constructor(message: string, object?: WebRequest | File) {\r\n super(message, ErrorCodes.LoadFileError);\r\n\r\n this.name = \"LoadFileError\";\r\n BaseError._setPrototypeOf(this, LoadFileError.prototype);\r\n\r\n if (object instanceof WebRequest) {\r\n this.request = object;\r\n } else {\r\n this.file = object;\r\n }\r\n }\r\n}\r\n\r\n/** @ignore */\r\nexport class RequestFileError extends RuntimeError {\r\n /**\r\n * Creates a new LoadFileError\r\n * @param message defines the message of the error\r\n * @param request defines the optional web request\r\n */\r\n constructor(\r\n message: string,\r\n public request: WebRequest\r\n ) {\r\n super(message, ErrorCodes.RequestFileError);\r\n this.name = \"RequestFileError\";\r\n BaseError._setPrototypeOf(this, RequestFileError.prototype);\r\n }\r\n}\r\n\r\n/** @ignore */\r\nexport class ReadFileError extends RuntimeError {\r\n /**\r\n * Creates a new ReadFileError\r\n * @param message defines the message of the error\r\n * @param file defines the optional file\r\n */\r\n constructor(\r\n message: string,\r\n public file: File\r\n ) {\r\n super(message, ErrorCodes.ReadFileError);\r\n this.name = \"ReadFileError\";\r\n BaseError._setPrototypeOf(this, ReadFileError.prototype);\r\n }\r\n}\r\n/**\r\n * @internal\r\n */\r\nexport const FileToolsOptions: {\r\n DefaultRetryStrategy: (url: string, request: WebRequest, retryIndex: number) => number;\r\n BaseUrl: string;\r\n CorsBehavior: string | ((url: string | string[]) => string);\r\n PreprocessUrl: (url: string) => string;\r\n ScriptBaseUrl: string;\r\n ScriptPreprocessUrl: (url: string) => string;\r\n} = {\r\n /**\r\n * Gets or sets the retry strategy to apply when an error happens while loading an asset.\r\n * When defining this function, return the wait time before trying again or return -1 to\r\n * stop retrying and error out.\r\n */\r\n DefaultRetryStrategy: RetryStrategy.ExponentialBackoff(),\r\n\r\n /**\r\n * Gets or sets the base URL to use to load assets\r\n */\r\n BaseUrl: \"\",\r\n\r\n /**\r\n * Default behaviour for cors in the application.\r\n * It can be a string if the expected behavior is identical in the entire app.\r\n * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance)\r\n */\r\n CorsBehavior: \"anonymous\",\r\n\r\n /**\r\n * Gets or sets a function used to pre-process url before using them to load assets\r\n * @param url\r\n * @returns the processed url\r\n */\r\n PreprocessUrl: (url: string) => url,\r\n\r\n /**\r\n * Gets or sets the base URL to use to load scripts\r\n * Used for both JS and WASM\r\n */\r\n ScriptBaseUrl: \"\",\r\n /**\r\n * Gets or sets a function used to pre-process script url before using them to load.\r\n * Used for both JS and WASM\r\n * @param url defines the url to process\r\n * @returns the processed url\r\n */\r\n ScriptPreprocessUrl: (url: string) => url,\r\n};\r\n\r\n/**\r\n * Removes unwanted characters from an url\r\n * @param url defines the url to clean\r\n * @returns the cleaned url\r\n */\r\nconst _CleanUrl = (url: string): string => {\r\n url = url.replace(/#/gm, \"%23\");\r\n return url;\r\n};\r\n\r\n/**\r\n * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element.\r\n * @param url define the url we are trying\r\n * @param element define the dom element where to configure the cors policy\r\n * @internal\r\n */\r\nexport const SetCorsBehavior = (url: string | string[], element: { crossOrigin: string | null }): void => {\r\n if (url && url.indexOf(\"data:\") === 0) {\r\n return;\r\n }\r\n\r\n if (FileToolsOptions.CorsBehavior) {\r\n if (typeof FileToolsOptions.CorsBehavior === \"string\" || FileToolsOptions.CorsBehavior instanceof String) {\r\n element.crossOrigin = FileToolsOptions.CorsBehavior;\r\n } else {\r\n const result = FileToolsOptions.CorsBehavior(url);\r\n if (result) {\r\n element.crossOrigin = result;\r\n }\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Loads an image as an HTMLImageElement.\r\n * @param input url string, ArrayBuffer, or Blob to load\r\n * @param onLoad callback called when the image successfully loads\r\n * @param onError callback called when the image fails to load\r\n * @param offlineProvider offline provider for caching\r\n * @param mimeType optional mime type\r\n * @param imageBitmapOptions\r\n * @returns the HTMLImageElement of the loaded image\r\n * @internal\r\n */\r\nexport const LoadImage = (\r\n input: string | ArrayBuffer | ArrayBufferView | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string, exception?: any) => void,\r\n offlineProvider: Nullable,\r\n mimeType: string = \"\",\r\n imageBitmapOptions?: ImageBitmapOptions\r\n): Nullable => {\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (typeof HTMLImageElement === \"undefined\" && !engine?._features.forceBitmapOverHTMLImageElement) {\r\n onError(\"LoadImage is only supported in web or BabylonNative environments.\");\r\n return null;\r\n }\r\n\r\n let url: string;\r\n let usingObjectURL = false;\r\n\r\n if (input instanceof ArrayBuffer || ArrayBuffer.isView(input)) {\r\n if (typeof Blob !== \"undefined\" && typeof URL !== \"undefined\") {\r\n url = URL.createObjectURL(new Blob([input], { type: mimeType }));\r\n usingObjectURL = true;\r\n } else {\r\n url = `data:${mimeType};base64,` + EncodeArrayBufferToBase64(input);\r\n }\r\n } else if (input instanceof Blob) {\r\n url = URL.createObjectURL(input);\r\n usingObjectURL = true;\r\n } else {\r\n url = _CleanUrl(input);\r\n url = FileToolsOptions.PreprocessUrl(input);\r\n }\r\n\r\n const onErrorHandler = (exception: any) => {\r\n if (onError) {\r\n const inputText = url || input.toString();\r\n onError(`Error while trying to load image: ${inputText.indexOf(\"http\") === 0 || inputText.length <= 128 ? inputText : inputText.slice(0, 128) + \"...\"}`, exception);\r\n }\r\n };\r\n\r\n if (engine?._features.forceBitmapOverHTMLImageElement) {\r\n LoadFile(\r\n url,\r\n (data) => {\r\n engine!\r\n .createImageBitmap(new Blob([data], { type: mimeType }), { premultiplyAlpha: \"none\", ...imageBitmapOptions })\r\n .then((imgBmp) => {\r\n onLoad(imgBmp);\r\n if (usingObjectURL) {\r\n URL.revokeObjectURL(url);\r\n }\r\n })\r\n .catch((reason) => {\r\n if (onError) {\r\n onError(\"Error while trying to load image: \" + input, reason);\r\n }\r\n });\r\n },\r\n undefined,\r\n offlineProvider || undefined,\r\n true,\r\n (request, exception) => {\r\n onErrorHandler(exception);\r\n }\r\n );\r\n\r\n return null;\r\n }\r\n\r\n const img = new Image();\r\n SetCorsBehavior(url, img);\r\n\r\n const handlersList: { target: any; name: string; handler: any }[] = [];\r\n\r\n const loadHandlersList = () => {\r\n handlersList.forEach((handler) => {\r\n handler.target.addEventListener(handler.name, handler.handler);\r\n });\r\n };\r\n\r\n const unloadHandlersList = () => {\r\n handlersList.forEach((handler) => {\r\n handler.target.removeEventListener(handler.name, handler.handler);\r\n });\r\n handlersList.length = 0;\r\n };\r\n\r\n const loadHandler = () => {\r\n unloadHandlersList();\r\n\r\n onLoad(img);\r\n\r\n // Must revoke the URL after calling onLoad to avoid security exceptions in\r\n // certain scenarios (e.g. when hosted in vscode).\r\n if (usingObjectURL && img.src) {\r\n URL.revokeObjectURL(img.src);\r\n }\r\n };\r\n\r\n const errorHandler = (err: any) => {\r\n unloadHandlersList();\r\n\r\n onErrorHandler(err);\r\n\r\n if (usingObjectURL && img.src) {\r\n URL.revokeObjectURL(img.src);\r\n }\r\n };\r\n\r\n const cspHandler = (err: any) => {\r\n if (err.blockedURI !== img.src) {\r\n return;\r\n }\r\n\r\n unloadHandlersList();\r\n const cspException = new Error(`CSP violation of policy ${err.effectiveDirective} ${err.blockedURI}. Current policy is ${err.originalPolicy}`);\r\n\r\n EngineStore.UseFallbackTexture = false;\r\n onErrorHandler(cspException);\r\n if (usingObjectURL && img.src) {\r\n URL.revokeObjectURL(img.src);\r\n }\r\n img.src = \"\";\r\n };\r\n\r\n handlersList.push({ target: img, name: \"load\", handler: loadHandler });\r\n handlersList.push({ target: img, name: \"error\", handler: errorHandler });\r\n handlersList.push({ target: document, name: \"securitypolicyviolation\", handler: cspHandler });\r\n\r\n loadHandlersList();\r\n\r\n const fromBlob = url.substring(0, 5) === \"blob:\";\r\n const fromData = url.substring(0, 5) === \"data:\";\r\n const noOfflineSupport = () => {\r\n if (fromBlob || fromData || !WebRequest.IsCustomRequestAvailable) {\r\n img.src = url;\r\n } else {\r\n LoadFile(\r\n url,\r\n (data, _, contentType) => {\r\n const type = !mimeType && contentType ? contentType : mimeType;\r\n const blob = new Blob([data], { type });\r\n const url = URL.createObjectURL(blob);\r\n usingObjectURL = true;\r\n img.src = url;\r\n },\r\n undefined,\r\n offlineProvider || undefined,\r\n true,\r\n (_request, exception) => {\r\n onErrorHandler(exception);\r\n }\r\n );\r\n }\r\n };\r\n\r\n const loadFromOfflineSupport = () => {\r\n if (offlineProvider) {\r\n offlineProvider.loadImage(url, img);\r\n }\r\n };\r\n\r\n if (!fromBlob && !fromData && offlineProvider && offlineProvider.enableTexturesOffline) {\r\n offlineProvider.open(loadFromOfflineSupport, noOfflineSupport);\r\n } else {\r\n if (url.indexOf(\"file:\") !== -1) {\r\n const textureName = decodeURIComponent(url.substring(5).toLowerCase());\r\n if (FilesInputStore.FilesToLoad[textureName] && typeof URL !== \"undefined\") {\r\n try {\r\n let blobURL;\r\n try {\r\n blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]);\r\n } catch (ex) {\r\n // Chrome doesn't support oneTimeOnly parameter\r\n blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]);\r\n }\r\n img.src = blobURL;\r\n usingObjectURL = true;\r\n } catch (e) {\r\n img.src = \"\";\r\n }\r\n return img;\r\n }\r\n }\r\n\r\n noOfflineSupport();\r\n }\r\n\r\n return img;\r\n};\r\n\r\n/**\r\n * Reads a file from a File object\r\n * @param file defines the file to load\r\n * @param onSuccess defines the callback to call when data is loaded\r\n * @param onProgress defines the callback to call during loading process\r\n * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer\r\n * @param onError defines the callback to call when an error occurs\r\n * @returns a file request object\r\n * @internal\r\n */\r\nexport const ReadFile = (\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: (ev: ProgressEvent) => any,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: ReadFileError) => void\r\n): IFileRequest => {\r\n const reader = new FileReader();\r\n const fileRequest: IFileRequest = {\r\n onCompleteObservable: new Observable(),\r\n abort: () => reader.abort(),\r\n };\r\n\r\n reader.onloadend = () => fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n if (onError) {\r\n reader.onerror = () => {\r\n onError(new ReadFileError(`Unable to read ${file.name}`, file));\r\n };\r\n }\r\n reader.onload = (e) => {\r\n //target doesn't have result from ts 1.3\r\n onSuccess((e.target)[\"result\"]);\r\n };\r\n if (onProgress) {\r\n reader.onprogress = onProgress;\r\n }\r\n if (!useArrayBuffer) {\r\n // Asynchronous read\r\n reader.readAsText(file);\r\n } else {\r\n reader.readAsArrayBuffer(file);\r\n }\r\n\r\n return fileRequest;\r\n};\r\n\r\n/**\r\n * Loads a file from a url, a data url, or a file url\r\n * @param fileOrUrl file, url, data url, or file url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @param onOpened\r\n * @returns a file request object\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const LoadFile = (\r\n fileOrUrl: File | string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string, contentType?: Nullable) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n onOpened?: (request: WebRequest) => void\r\n): IFileRequest => {\r\n if ((fileOrUrl as File).name) {\r\n return ReadFile(\r\n fileOrUrl as File,\r\n onSuccess,\r\n onProgress,\r\n useArrayBuffer,\r\n onError\r\n ? (error: ReadFileError) => {\r\n onError(undefined, error);\r\n }\r\n : undefined\r\n );\r\n }\r\n\r\n const url = fileOrUrl as string;\r\n\r\n // If file and file input are set\r\n if (url.indexOf(\"file:\") !== -1) {\r\n let fileName = decodeURIComponent(url.substring(5).toLowerCase());\r\n if (fileName.indexOf(\"./\") === 0) {\r\n fileName = fileName.substring(2);\r\n }\r\n const file = FilesInputStore.FilesToLoad[fileName];\r\n if (file) {\r\n return ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError ? (error) => onError(undefined, new LoadFileError(error.message, error.file)) : undefined);\r\n }\r\n }\r\n\r\n // For a Base64 Data URL\r\n const { match, type } = TestBase64DataUrl(url);\r\n if (match) {\r\n const fileRequest: IFileRequest = {\r\n onCompleteObservable: new Observable(),\r\n abort: () => () => {},\r\n };\r\n\r\n try {\r\n const data = useArrayBuffer ? DecodeBase64UrlToBinary(url) : DecodeBase64UrlToString(url);\r\n onSuccess(data, undefined, type);\r\n } catch (error) {\r\n if (onError) {\r\n onError(undefined, error);\r\n } else {\r\n Logger.Error(error.message || \"Failed to parse the Data URL\");\r\n }\r\n }\r\n\r\n TimingTools.SetImmediate(() => {\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n });\r\n\r\n return fileRequest;\r\n }\r\n\r\n return RequestFile(\r\n url,\r\n (data, request) => {\r\n onSuccess(data, request?.responseURL, request?.getResponseHeader(\"content-type\"));\r\n },\r\n onProgress,\r\n offlineProvider,\r\n useArrayBuffer,\r\n onError\r\n ? (error) => {\r\n onError(error.request, new LoadFileError(error.message, error.request));\r\n }\r\n : undefined,\r\n onOpened\r\n );\r\n};\r\n\r\n/**\r\n * Loads a file from a url\r\n * @param url url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @param onOpened callback called when the web request is opened\r\n * @returns a file request object\r\n * @internal\r\n */\r\nexport const RequestFile = (\r\n url: string,\r\n onSuccess?: (data: string | ArrayBuffer, request?: WebRequest) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: RequestFileError) => void,\r\n onOpened?: (request: WebRequest) => void\r\n): IFileRequest => {\r\n url = _CleanUrl(url);\r\n url = FileToolsOptions.PreprocessUrl(url);\r\n\r\n const loadUrl = FileToolsOptions.BaseUrl + url;\r\n\r\n let aborted = false;\r\n const fileRequest: IFileRequest = {\r\n onCompleteObservable: new Observable(),\r\n abort: () => (aborted = true),\r\n };\r\n\r\n const requestFile = () => {\r\n let request: Nullable = new WebRequest();\r\n let retryHandle: Nullable> = null;\r\n let onReadyStateChange: Nullable<() => void>;\r\n\r\n const unbindEvents = () => {\r\n if (!request) {\r\n return;\r\n }\r\n\r\n if (onProgress) {\r\n request.removeEventListener(\"progress\", onProgress);\r\n }\r\n if (onReadyStateChange) {\r\n request.removeEventListener(\"readystatechange\", onReadyStateChange);\r\n }\r\n request.removeEventListener(\"loadend\", onLoadEnd!);\r\n };\r\n\r\n let onLoadEnd: Nullable<() => void> = () => {\r\n unbindEvents();\r\n\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n fileRequest.onCompleteObservable.clear();\r\n\r\n onProgress = undefined;\r\n onReadyStateChange = null;\r\n onLoadEnd = null;\r\n onError = undefined;\r\n onOpened = undefined;\r\n onSuccess = undefined;\r\n };\r\n\r\n fileRequest.abort = () => {\r\n aborted = true;\r\n\r\n if (onLoadEnd) {\r\n onLoadEnd();\r\n }\r\n\r\n if (request && request.readyState !== (XMLHttpRequest.DONE || 4)) {\r\n request.abort();\r\n }\r\n\r\n if (retryHandle !== null) {\r\n clearTimeout(retryHandle);\r\n retryHandle = null;\r\n }\r\n\r\n request = null;\r\n };\r\n\r\n const handleError = (error: any) => {\r\n const message = error.message || \"Unknown error\";\r\n if (onError && request) {\r\n onError(new RequestFileError(message, request));\r\n } else {\r\n Logger.Error(message);\r\n }\r\n };\r\n\r\n const retryLoop = (retryIndex: number) => {\r\n if (!request) {\r\n return;\r\n }\r\n request.open(\"GET\", loadUrl);\r\n\r\n if (onOpened) {\r\n try {\r\n onOpened(request);\r\n } catch (e) {\r\n handleError(e);\r\n return;\r\n }\r\n }\r\n\r\n if (useArrayBuffer) {\r\n request.responseType = \"arraybuffer\";\r\n }\r\n\r\n if (onProgress) {\r\n request.addEventListener(\"progress\", onProgress);\r\n }\r\n\r\n if (onLoadEnd) {\r\n request.addEventListener(\"loadend\", onLoadEnd);\r\n }\r\n\r\n onReadyStateChange = () => {\r\n if (aborted || !request) {\r\n return;\r\n }\r\n\r\n // In case of undefined state in some browsers.\r\n if (request.readyState === (XMLHttpRequest.DONE || 4)) {\r\n // Some browsers have issues where onreadystatechange can be called multiple times with the same value.\r\n if (onReadyStateChange) {\r\n request.removeEventListener(\"readystatechange\", onReadyStateChange);\r\n }\r\n\r\n if ((request.status >= 200 && request.status < 300) || (request.status === 0 && (!IsWindowObjectExist() || IsFileURL()))) {\r\n try {\r\n if (onSuccess) {\r\n onSuccess(useArrayBuffer ? request.response : request.responseText, request);\r\n }\r\n } catch (e) {\r\n handleError(e);\r\n }\r\n return;\r\n }\r\n\r\n const retryStrategy = FileToolsOptions.DefaultRetryStrategy;\r\n if (retryStrategy) {\r\n const waitTime = retryStrategy(loadUrl, request, retryIndex);\r\n if (waitTime !== -1) {\r\n // Prevent the request from completing for retry.\r\n unbindEvents();\r\n\r\n request = new WebRequest();\r\n retryHandle = setTimeout(() => retryLoop(retryIndex + 1), waitTime);\r\n return;\r\n }\r\n }\r\n\r\n const error = new RequestFileError(\"Error status: \" + request.status + \" \" + request.statusText + \" - Unable to load \" + loadUrl, request);\r\n if (onError) {\r\n onError(error);\r\n }\r\n }\r\n };\r\n\r\n request.addEventListener(\"readystatechange\", onReadyStateChange);\r\n\r\n request.send();\r\n };\r\n\r\n retryLoop(0);\r\n };\r\n\r\n // Caching all files\r\n if (offlineProvider && offlineProvider.enableSceneOffline) {\r\n const noOfflineSupport = (request?: any) => {\r\n if (request && request.status > 400) {\r\n if (onError) {\r\n onError(request);\r\n }\r\n } else {\r\n requestFile();\r\n }\r\n };\r\n\r\n const loadFromOfflineSupport = () => {\r\n // TODO: database needs to support aborting and should return a IFileRequest\r\n\r\n if (offlineProvider) {\r\n offlineProvider.loadFile(\r\n FileToolsOptions.BaseUrl + url,\r\n (data) => {\r\n if (!aborted && onSuccess) {\r\n onSuccess(data);\r\n }\r\n\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n },\r\n onProgress\r\n ? (event) => {\r\n if (!aborted && onProgress) {\r\n onProgress(event);\r\n }\r\n }\r\n : undefined,\r\n noOfflineSupport,\r\n useArrayBuffer\r\n );\r\n }\r\n };\r\n\r\n offlineProvider.open(loadFromOfflineSupport, noOfflineSupport);\r\n } else {\r\n requestFile();\r\n }\r\n\r\n return fileRequest;\r\n};\r\n\r\n/**\r\n * Checks if the loaded document was accessed via `file:`-Protocol.\r\n * @returns boolean\r\n * @internal\r\n */\r\nexport const IsFileURL = (): boolean => {\r\n return typeof location !== \"undefined\" && location.protocol === \"file:\";\r\n};\r\n\r\n/**\r\n * Test if the given uri is a valid base64 data url\r\n * @param uri The uri to test\r\n * @returns True if the uri is a base64 data url or false otherwise\r\n * @internal\r\n */\r\nexport const IsBase64DataUrl = (uri: string): boolean => {\r\n return Base64DataUrlRegEx.test(uri);\r\n};\r\n\r\nexport const TestBase64DataUrl = (uri: string): { match: boolean; type: string } => {\r\n const results = Base64DataUrlRegEx.exec(uri);\r\n if (results === null || results.length === 0) {\r\n return { match: false, type: \"\" };\r\n } else {\r\n const type = results[0].replace(\"data:\", \"\").replace(\"base64,\", \"\");\r\n return { match: true, type };\r\n }\r\n};\r\n\r\n/**\r\n * Decode the given base64 uri.\r\n * @param uri The uri to decode\r\n * @returns The decoded base64 data.\r\n * @internal\r\n */\r\nexport function DecodeBase64UrlToBinary(uri: string): ArrayBuffer {\r\n return DecodeBase64ToBinary(uri.split(\",\")[1]);\r\n}\r\n\r\n/**\r\n * Decode the given base64 uri into a UTF-8 encoded string.\r\n * @param uri The uri to decode\r\n * @returns The decoded base64 data.\r\n * @internal\r\n */\r\nexport const DecodeBase64UrlToString = (uri: string): string => {\r\n return DecodeBase64ToString(uri.split(\",\")[1]);\r\n};\r\n\r\n/**\r\n * This will be executed automatically for UMD and es5.\r\n * If esm dev wants the side effects to execute they will have to run it manually\r\n * Once we build native modules those need to be exported.\r\n * @internal\r\n */\r\nconst initSideEffects = () => {\r\n ThinEngine._FileToolsLoadImage = LoadImage;\r\n ThinEngine._FileToolsLoadFile = LoadFile;\r\n ShaderProcessor._FileToolsLoadFile = LoadFile;\r\n};\r\n\r\ninitSideEffects();\r\n\r\n// deprecated\r\n\r\n/**\r\n * FileTools defined as any.\r\n * This should not be imported or used in future releases or in any module in the framework\r\n * @internal\r\n * @deprecated import the needed function from fileTools.ts\r\n */\r\nexport let FileTools: {\r\n DecodeBase64UrlToBinary: (uri: string) => ArrayBuffer;\r\n DecodeBase64UrlToString: (uri: string) => string;\r\n DefaultRetryStrategy: any;\r\n BaseUrl: any;\r\n CorsBehavior: any;\r\n PreprocessUrl: any;\r\n IsBase64DataUrl: (uri: string) => boolean;\r\n IsFileURL: () => boolean;\r\n LoadFile: (\r\n fileOrUrl: string | File,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string | undefined) => void,\r\n onProgress?: ((ev: ProgressEvent) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((request?: WebRequest | undefined, exception?: LoadFileError | undefined) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest;\r\n LoadImage: (\r\n input: string | ArrayBuffer | Blob | ArrayBufferView,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string | undefined, exception?: any) => void,\r\n offlineProvider: Nullable,\r\n mimeType?: string | undefined,\r\n imageBitmapOptions?: ImageBitmapOptions | undefined\r\n ) => Nullable;\r\n ReadFile: (\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: ((ev: ProgressEvent) => any) | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: ReadFileError) => void) | undefined\r\n ) => IFileRequest;\r\n RequestFile: (\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, request?: WebRequest | undefined) => void,\r\n onProgress?: ((event: ProgressEvent) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: RequestFileError) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest;\r\n SetCorsBehavior: (url: string | string[], element: { crossOrigin: string | null }) => void;\r\n};\r\n/**\r\n * @param DecodeBase64UrlToBinary\r\n * @param DecodeBase64UrlToString\r\n * @param FileToolsOptions\r\n * @internal\r\n */\r\nexport const _injectLTSFileTools = (\r\n DecodeBase64UrlToBinary: (uri: string) => ArrayBuffer,\r\n DecodeBase64UrlToString: (uri: string) => string,\r\n FileToolsOptions: { DefaultRetryStrategy: any; BaseUrl: any; CorsBehavior: any; PreprocessUrl: any },\r\n IsBase64DataUrl: (uri: string) => boolean,\r\n IsFileURL: () => boolean,\r\n LoadFile: (\r\n fileOrUrl: string | File,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string | undefined) => void,\r\n onProgress?: ((ev: ProgressEvent) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((request?: WebRequest | undefined, exception?: LoadFileError | undefined) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest,\r\n LoadImage: (\r\n input: string | ArrayBuffer | ArrayBufferView | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string | undefined, exception?: any) => void,\r\n offlineProvider: Nullable,\r\n mimeType?: string,\r\n imageBitmapOptions?: ImageBitmapOptions | undefined\r\n ) => Nullable,\r\n ReadFile: (\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: ((ev: ProgressEvent) => any) | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: ReadFileError) => void) | undefined\r\n ) => IFileRequest,\r\n RequestFile: (\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, request?: WebRequest | undefined) => void,\r\n onProgress?: ((event: ProgressEvent) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: RequestFileError) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest,\r\n SetCorsBehavior: (url: string | string[], element: { crossOrigin: string | null }) => void\r\n) => {\r\n /**\r\n * Backwards compatibility.\r\n * @internal\r\n * @deprecated\r\n */\r\n FileTools = {\r\n DecodeBase64UrlToBinary,\r\n DecodeBase64UrlToString,\r\n DefaultRetryStrategy: FileToolsOptions.DefaultRetryStrategy,\r\n BaseUrl: FileToolsOptions.BaseUrl,\r\n CorsBehavior: FileToolsOptions.CorsBehavior,\r\n PreprocessUrl: FileToolsOptions.PreprocessUrl,\r\n IsBase64DataUrl,\r\n IsFileURL,\r\n LoadFile,\r\n LoadImage,\r\n ReadFile,\r\n RequestFile,\r\n SetCorsBehavior,\r\n };\r\n\r\n Object.defineProperty(FileTools, \"DefaultRetryStrategy\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.DefaultRetryStrategy;\r\n },\r\n set: function (this: null, value: (url: string, request: WebRequest, retryIndex: number) => number) {\r\n FileToolsOptions.DefaultRetryStrategy = value;\r\n },\r\n });\r\n\r\n Object.defineProperty(FileTools, \"BaseUrl\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.BaseUrl;\r\n },\r\n set: function (this: null, value: string) {\r\n FileToolsOptions.BaseUrl = value;\r\n },\r\n });\r\n\r\n Object.defineProperty(FileTools, \"PreprocessUrl\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.PreprocessUrl;\r\n },\r\n set: function (this: null, value: (url: string) => string) {\r\n FileToolsOptions.PreprocessUrl = value;\r\n },\r\n });\r\n\r\n Object.defineProperty(FileTools, \"CorsBehavior\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.CorsBehavior;\r\n },\r\n set: function (this: null, value: string | ((url: string | string[]) => string)) {\r\n FileToolsOptions.CorsBehavior = value;\r\n },\r\n });\r\n};\r\n\r\n_injectLTSFileTools(DecodeBase64UrlToBinary, DecodeBase64UrlToString, FileToolsOptions, IsBase64DataUrl, IsFileURL, LoadFile, LoadImage, ReadFile, RequestFile, SetCorsBehavior);\r\n", "/**\r\n * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523\r\n * Be aware Math.random() could cause collisions, but:\r\n * \"All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide\"\r\n * @returns a pseudo random id\r\n */\r\nexport function RandomGUID(): string {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0,\r\n v = c === \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\n/**\r\n * Class used to manipulate GUIDs\r\n */\r\nexport const GUID = {\r\n /**\r\n * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523\r\n * Be aware Math.random() could cause collisions, but:\r\n * \"All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide\"\r\n * @returns a pseudo random id\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n RandomId: RandomGUID,\r\n};\r\n", "import { Logger } from \"./logger\";\r\nimport { GetClass } from \"./typeStore\";\r\n\r\n/**\r\n * Class used to enable instantiation of objects by class name\r\n */\r\nexport class InstantiationTools {\r\n /**\r\n * Use this object to register external classes like custom textures or material\r\n * to allow the loaders to instantiate them\r\n */\r\n public static RegisteredExternalClasses: { [key: string]: Object } = {};\r\n\r\n /**\r\n * Tries to instantiate a new object from a given class name\r\n * @param className defines the class name to instantiate\r\n * @returns the new object or null if the system was not able to do the instantiation\r\n */\r\n public static Instantiate(className: string): any {\r\n if (this.RegisteredExternalClasses && this.RegisteredExternalClasses[className]) {\r\n return this.RegisteredExternalClasses[className];\r\n }\r\n\r\n const internalClass = GetClass(className);\r\n if (internalClass) {\r\n return internalClass;\r\n }\r\n\r\n Logger.Warn(className + \" not found, you may have missed an import.\");\r\n\r\n const arr = className.split(\".\");\r\n\r\n let fn: any = window || this;\r\n for (let i = 0, len = arr.length; i < len; i++) {\r\n fn = fn[arr[i]];\r\n }\r\n\r\n if (typeof fn !== \"function\") {\r\n return null;\r\n }\r\n\r\n return fn;\r\n }\r\n}\r\n", "/**\r\n * Function indicating if a number is an exponent of 2\r\n * @param value defines the value to test\r\n * @returns true if the value is an exponent of 2\r\n */\r\nexport function IsExponentOfTwo(value: number): boolean {\r\n let count = 1;\r\n\r\n do {\r\n count *= 2;\r\n } while (count < value);\r\n\r\n return count === value;\r\n}\r\n\r\n/**\r\n * Interpolates between a and b via alpha\r\n * @param a The lower value (returned when alpha = 0)\r\n * @param b The upper value (returned when alpha = 1)\r\n * @param alpha The interpolation-factor\r\n * @returns The mixed value\r\n */\r\nexport function Mix(a: number, b: number, alpha: number): number {\r\n return a * (1 - alpha) + b * alpha;\r\n}\r\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Nullable } from \"../types\";\r\nimport { Observable } from \"./observable\";\r\nimport { GetDOMTextContent, IsNavigatorAvailable, IsWindowObjectExist } from \"./domManagement\";\r\nimport { Logger } from \"./logger\";\r\nimport { DeepCopier } from \"./deepCopier\";\r\nimport { PrecisionDate } from \"./precisionDate\";\r\nimport { _WarnImport } from \"./devTools\";\r\nimport { WebRequest } from \"./webRequest\";\r\nimport type { IFileRequest } from \"./fileRequest\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { ReadFileError } from \"./fileTools\";\r\nimport {\r\n FileToolsOptions,\r\n DecodeBase64UrlToBinary,\r\n IsBase64DataUrl,\r\n LoadFile as FileToolsLoadFile,\r\n LoadImage as FileToolLoadImage,\r\n ReadFile as FileToolsReadFile,\r\n SetCorsBehavior,\r\n} from \"./fileTools\";\r\nimport type { IOfflineProvider } from \"../Offline/IOfflineProvider\";\r\nimport { TimingTools } from \"./timingTools\";\r\nimport { InstantiationTools } from \"./instantiationTools\";\r\nimport { RandomGUID } from \"./guid\";\r\nimport type { IScreenshotSize } from \"./interfaces/screenshotSize\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { IColor4Like } from \"../Maths/math.like\";\r\nimport { IsExponentOfTwo, Mix } from \"./tools.functions\";\r\n\r\ndeclare function importScripts(...urls: string[]): void;\r\n\r\n/**\r\n * Class containing a set of static utilities functions\r\n */\r\nexport class Tools {\r\n /**\r\n * Gets or sets the base URL to use to load assets\r\n */\r\n public static get BaseUrl() {\r\n return FileToolsOptions.BaseUrl;\r\n }\r\n\r\n public static set BaseUrl(value: string) {\r\n FileToolsOptions.BaseUrl = value;\r\n }\r\n\r\n /**\r\n * This function checks whether a URL is absolute or not.\r\n * It will also detect data and blob URLs\r\n * @param url the url to check\r\n * @returns is the url absolute or relative\r\n */\r\n public static IsAbsoluteUrl(url: string): boolean {\r\n // See https://stackoverflow.com/a/38979205.\r\n\r\n // URL is protocol-relative (= absolute)\r\n if (url.indexOf(\"//\") === 0) {\r\n return true;\r\n }\r\n\r\n // URL has no protocol (= relative)\r\n if (url.indexOf(\"://\") === -1) {\r\n return false;\r\n }\r\n\r\n // URL does not contain a dot, i.e. no TLD (= relative, possibly REST)\r\n if (url.indexOf(\".\") === -1) {\r\n return false;\r\n }\r\n\r\n // URL does not contain a single slash (= relative)\r\n if (url.indexOf(\"/\") === -1) {\r\n return false;\r\n }\r\n\r\n // The first colon comes after the first slash (= relative)\r\n if (url.indexOf(\":\") > url.indexOf(\"/\")) {\r\n return false;\r\n }\r\n\r\n // Protocol is defined before first dot (= absolute)\r\n if (url.indexOf(\"://\") < url.indexOf(\".\")) {\r\n return true;\r\n }\r\n if (url.indexOf(\"data:\") === 0 || url.indexOf(\"blob:\") === 0) {\r\n return true;\r\n }\r\n\r\n // Anything else must be relative\r\n return false;\r\n }\r\n\r\n /**\r\n * Sets the base URL to use to load scripts\r\n */\r\n public static set ScriptBaseUrl(value: string) {\r\n FileToolsOptions.ScriptBaseUrl = value;\r\n }\r\n\r\n public static get ScriptBaseUrl(): string {\r\n return FileToolsOptions.ScriptBaseUrl;\r\n }\r\n\r\n /**\r\n * Sets a preprocessing function to run on a source URL before importing it\r\n * Note that this function will execute AFTER the base URL is appended to the URL\r\n */\r\n public static set ScriptPreprocessUrl(func: (source: string) => string) {\r\n FileToolsOptions.ScriptPreprocessUrl = func;\r\n }\r\n\r\n public static get ScriptPreprocessUrl(): (source: string) => string {\r\n return FileToolsOptions.ScriptPreprocessUrl;\r\n }\r\n\r\n /**\r\n * Enable/Disable Custom HTTP Request Headers globally.\r\n * default = false\r\n * @see CustomRequestHeaders\r\n */\r\n public static UseCustomRequestHeaders = false;\r\n\r\n /**\r\n * Custom HTTP Request Headers to be sent with XMLHttpRequests\r\n * i.e. when loading files, where the server/service expects an Authorization header\r\n */\r\n public static CustomRequestHeaders = WebRequest.CustomRequestHeaders;\r\n\r\n /**\r\n * Gets or sets the retry strategy to apply when an error happens while loading an asset\r\n */\r\n public static get DefaultRetryStrategy() {\r\n return FileToolsOptions.DefaultRetryStrategy;\r\n }\r\n\r\n public static set DefaultRetryStrategy(strategy: (url: string, request: WebRequest, retryIndex: number) => number) {\r\n FileToolsOptions.DefaultRetryStrategy = strategy;\r\n }\r\n\r\n /**\r\n * Default behavior for cors in the application.\r\n * It can be a string if the expected behavior is identical in the entire app.\r\n * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance)\r\n */\r\n public static get CorsBehavior(): string | ((url: string | string[]) => string) {\r\n return FileToolsOptions.CorsBehavior;\r\n }\r\n\r\n public static set CorsBehavior(value: string | ((url: string | string[]) => string)) {\r\n FileToolsOptions.CorsBehavior = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a global variable indicating if fallback texture must be used when a texture cannot be loaded\r\n * @ignorenaming\r\n */\r\n public static get UseFallbackTexture() {\r\n return EngineStore.UseFallbackTexture;\r\n }\r\n\r\n public static set UseFallbackTexture(value: boolean) {\r\n EngineStore.UseFallbackTexture = value;\r\n }\r\n\r\n /**\r\n * Use this object to register external classes like custom textures or material\r\n * to allow the loaders to instantiate them\r\n */\r\n public static get RegisteredExternalClasses() {\r\n return InstantiationTools.RegisteredExternalClasses;\r\n }\r\n\r\n public static set RegisteredExternalClasses(classes: { [key: string]: Object }) {\r\n InstantiationTools.RegisteredExternalClasses = classes;\r\n }\r\n\r\n /**\r\n * Texture content used if a texture cannot loaded\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static get fallbackTexture() {\r\n return EngineStore.FallbackTexture;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static set fallbackTexture(value: string) {\r\n EngineStore.FallbackTexture = value;\r\n }\r\n\r\n /**\r\n * Read the content of a byte array at a specified coordinates (taking in account wrapping)\r\n * @param u defines the coordinate on X axis\r\n * @param v defines the coordinate on Y axis\r\n * @param width defines the width of the source data\r\n * @param height defines the height of the source data\r\n * @param pixels defines the source byte array\r\n * @param color defines the output color\r\n */\r\n public static FetchToRef(u: number, v: number, width: number, height: number, pixels: Uint8Array, color: IColor4Like): void {\r\n const wrappedU = (Math.abs(u) * width) % width | 0;\r\n const wrappedV = (Math.abs(v) * height) % height | 0;\r\n\r\n const position = (wrappedU + wrappedV * width) * 4;\r\n color.r = pixels[position] / 255;\r\n color.g = pixels[position + 1] / 255;\r\n color.b = pixels[position + 2] / 255;\r\n color.a = pixels[position + 3] / 255;\r\n }\r\n\r\n /**\r\n * Interpolates between a and b via alpha\r\n * @param a The lower value (returned when alpha = 0)\r\n * @param b The upper value (returned when alpha = 1)\r\n * @param alpha The interpolation-factor\r\n * @returns The mixed value\r\n */\r\n public static Mix(a: number, b: number, alpha: number): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Tries to instantiate a new object from a given class name\r\n * @param className defines the class name to instantiate\r\n * @returns the new object or null if the system was not able to do the instantiation\r\n */\r\n public static Instantiate(className: string): any {\r\n return InstantiationTools.Instantiate(className);\r\n }\r\n\r\n /**\r\n * Polyfill for setImmediate\r\n * @param action defines the action to execute after the current execution block\r\n */\r\n public static SetImmediate(action: () => void) {\r\n TimingTools.SetImmediate(action);\r\n }\r\n\r\n /**\r\n * Function indicating if a number is an exponent of 2\r\n * @param value defines the value to test\r\n * @returns true if the value is an exponent of 2\r\n */\r\n public static IsExponentOfTwo(value: number): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Returns the nearest 32-bit single precision float representation of a Number\r\n * @param value A Number. If the parameter is of a different type, it will get converted\r\n * to a number or to NaN if it cannot be converted\r\n * @returns number\r\n */\r\n public static FloatRound(value: number): number {\r\n return Math.fround(value);\r\n }\r\n\r\n /**\r\n * Extracts the filename from a path\r\n * @param path defines the path to use\r\n * @returns the filename\r\n */\r\n public static GetFilename(path: string): string {\r\n const index = path.lastIndexOf(\"/\");\r\n if (index < 0) {\r\n return path;\r\n }\r\n\r\n return path.substring(index + 1);\r\n }\r\n\r\n /**\r\n * Extracts the \"folder\" part of a path (everything before the filename).\r\n * @param uri The URI to extract the info from\r\n * @param returnUnchangedIfNoSlash Do not touch the URI if no slashes are present\r\n * @returns The \"folder\" part of the path\r\n */\r\n public static GetFolderPath(uri: string, returnUnchangedIfNoSlash = false): string {\r\n const index = uri.lastIndexOf(\"/\");\r\n if (index < 0) {\r\n if (returnUnchangedIfNoSlash) {\r\n return uri;\r\n }\r\n return \"\";\r\n }\r\n\r\n return uri.substring(0, index + 1);\r\n }\r\n\r\n /**\r\n * Extracts text content from a DOM element hierarchy\r\n * Back Compat only, please use GetDOMTextContent instead.\r\n */\r\n public static GetDOMTextContent = GetDOMTextContent;\r\n\r\n /**\r\n * Convert an angle in radians to degrees\r\n * @param angle defines the angle to convert\r\n * @returns the angle in degrees\r\n */\r\n public static ToDegrees(angle: number): number {\r\n return (angle * 180) / Math.PI;\r\n }\r\n\r\n /**\r\n * Convert an angle in degrees to radians\r\n * @param angle defines the angle to convert\r\n * @returns the angle in radians\r\n */\r\n public static ToRadians(angle: number): number {\r\n return (angle * Math.PI) / 180;\r\n }\r\n\r\n /**\r\n * Smooth angle changes (kind of low-pass filter), in particular for device orientation \"shaking\"\r\n * Use trigonometric functions to avoid discontinuity (0/360, -180/180)\r\n * @param previousAngle defines last angle value, in degrees\r\n * @param newAngle defines new angle value, in degrees\r\n * @param smoothFactor defines smoothing sensitivity; min 0: no smoothing, max 1: new data ignored\r\n * @returns the angle in degrees\r\n */\r\n public static SmoothAngleChange(previousAngle: number, newAngle: number, smoothFactor = 0.9): number {\r\n const previousAngleRad = this.ToRadians(previousAngle);\r\n const newAngleRad = this.ToRadians(newAngle);\r\n return this.ToDegrees(\r\n Math.atan2(\r\n (1 - smoothFactor) * Math.sin(newAngleRad) + smoothFactor * Math.sin(previousAngleRad),\r\n (1 - smoothFactor) * Math.cos(newAngleRad) + smoothFactor * Math.cos(previousAngleRad)\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Returns an array if obj is not an array\r\n * @param obj defines the object to evaluate as an array\r\n * @param allowsNullUndefined defines a boolean indicating if obj is allowed to be null or undefined\r\n * @returns either obj directly if obj is an array or a new array containing obj\r\n */\r\n public static MakeArray(obj: any, allowsNullUndefined?: boolean): Nullable> {\r\n if (allowsNullUndefined !== true && (obj === undefined || obj == null)) {\r\n return null;\r\n }\r\n\r\n return Array.isArray(obj) ? obj : [obj];\r\n }\r\n\r\n /**\r\n * Gets the pointer prefix to use\r\n * @param engine defines the engine we are finding the prefix for\r\n * @returns \"pointer\" if touch is enabled. Else returns \"mouse\"\r\n */\r\n public static GetPointerPrefix(engine: Engine): string {\r\n let eventPrefix = \"pointer\";\r\n\r\n // Check if pointer events are supported\r\n if (IsWindowObjectExist() && !window.PointerEvent) {\r\n eventPrefix = \"mouse\";\r\n }\r\n\r\n // Special Fallback MacOS Safari...\r\n if (\r\n engine._badDesktopOS &&\r\n !engine._badOS &&\r\n // And not ipad pros who claim to be macs...\r\n !(document && \"ontouchend\" in document)\r\n ) {\r\n eventPrefix = \"mouse\";\r\n }\r\n\r\n return eventPrefix;\r\n }\r\n\r\n /**\r\n * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element.\r\n * @param url define the url we are trying\r\n * @param element define the dom element where to configure the cors policy\r\n * @param element.crossOrigin\r\n */\r\n public static SetCorsBehavior(url: string | string[], element: { crossOrigin: string | null }): void {\r\n SetCorsBehavior(url, element);\r\n }\r\n\r\n /**\r\n * Sets the referrerPolicy behavior on a dom element.\r\n * @param referrerPolicy define the referrer policy to use\r\n * @param element define the dom element where to configure the referrer policy\r\n * @param element.referrerPolicy\r\n */\r\n public static SetReferrerPolicyBehavior(referrerPolicy: Nullable, element: { referrerPolicy: string | null }): void {\r\n element.referrerPolicy = referrerPolicy;\r\n }\r\n\r\n // External files\r\n\r\n /**\r\n * Removes unwanted characters from an url\r\n * @param url defines the url to clean\r\n * @returns the cleaned url\r\n */\r\n public static CleanUrl(url: string): string {\r\n url = url.replace(/#/gm, \"%23\");\r\n return url;\r\n }\r\n\r\n /**\r\n * Gets or sets a function used to pre-process url before using them to load assets\r\n */\r\n public static get PreprocessUrl() {\r\n return FileToolsOptions.PreprocessUrl;\r\n }\r\n\r\n public static set PreprocessUrl(processor: (url: string) => string) {\r\n FileToolsOptions.PreprocessUrl = processor;\r\n }\r\n\r\n /**\r\n * Loads an image as an HTMLImageElement.\r\n * @param input url string, ArrayBuffer, or Blob to load\r\n * @param onLoad callback called when the image successfully loads\r\n * @param onError callback called when the image fails to load\r\n * @param offlineProvider offline provider for caching\r\n * @param mimeType optional mime type\r\n * @param imageBitmapOptions optional the options to use when creating an ImageBitmap\r\n * @returns the HTMLImageElement of the loaded image\r\n */\r\n public static LoadImage(\r\n input: string | ArrayBuffer | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string, exception?: any) => void,\r\n offlineProvider: Nullable,\r\n mimeType?: string,\r\n imageBitmapOptions?: ImageBitmapOptions\r\n ): Nullable {\r\n return FileToolLoadImage(input, onLoad, onError, offlineProvider, mimeType, imageBitmapOptions);\r\n }\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url url string, ArrayBuffer, or Blob to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @returns a file request object\r\n */\r\n public static LoadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (data: any) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: any) => void\r\n ): IFileRequest {\r\n return FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);\r\n }\r\n\r\n // Note that this must come first since useArrayBuffer defaults to true below.\r\n public static LoadFileAsync(url: string, useArrayBuffer?: true): Promise;\r\n public static LoadFileAsync(url: string, useArrayBuffer?: false): Promise;\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url the file url to load\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @returns a promise containing an ArrayBuffer corresponding to the loaded file\r\n */\r\n public static LoadFileAsync(url: string, useArrayBuffer = true): Promise {\r\n return new Promise((resolve, reject) => {\r\n FileToolsLoadFile(\r\n url,\r\n (data) => {\r\n resolve(data);\r\n },\r\n undefined,\r\n undefined,\r\n useArrayBuffer,\r\n (request, exception) => {\r\n reject(exception);\r\n }\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _DefaultCdnUrl = \"https://cdn.babylonjs.com\";\r\n\r\n /**\r\n * Get a script URL including preprocessing\r\n * @param scriptUrl the script Url to process\r\n * @param forceAbsoluteUrl force the script to be an absolute url (adding the current base url if necessary)\r\n * @returns a modified URL to use\r\n */\r\n public static GetBabylonScriptURL(scriptUrl: Nullable, forceAbsoluteUrl?: boolean): string {\r\n if (!scriptUrl) {\r\n return \"\";\r\n }\r\n // if the base URL was set, and the script Url is an absolute path change the default path\r\n if (Tools.ScriptBaseUrl && scriptUrl.startsWith(Tools._DefaultCdnUrl)) {\r\n // change the default host, which is https://cdn.babylonjs.com with the one defined\r\n // make sure no trailing slash is present\r\n\r\n const baseUrl = Tools.ScriptBaseUrl[Tools.ScriptBaseUrl.length - 1] === \"/\" ? Tools.ScriptBaseUrl.substring(0, Tools.ScriptBaseUrl.length - 1) : Tools.ScriptBaseUrl;\r\n scriptUrl = scriptUrl.replace(Tools._DefaultCdnUrl, baseUrl);\r\n }\r\n\r\n // run the preprocessor\r\n scriptUrl = Tools.ScriptPreprocessUrl(scriptUrl);\r\n\r\n if (forceAbsoluteUrl) {\r\n scriptUrl = Tools.GetAbsoluteUrl(scriptUrl);\r\n }\r\n\r\n return scriptUrl;\r\n }\r\n\r\n /**\r\n * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the\r\n * content of this file is added into a new script element, attached to the DOM (body element)\r\n * @param scriptUrl defines the url of the script to load\r\n * @param onSuccess defines the callback called when the script is loaded\r\n * @param onError defines the callback to call if an error occurs\r\n * @param scriptId defines the id of the script element\r\n */\r\n public static LoadBabylonScript(scriptUrl: string, onSuccess: () => void, onError?: (message?: string, exception?: any) => void, scriptId?: string) {\r\n scriptUrl = Tools.GetBabylonScriptURL(scriptUrl);\r\n Tools.LoadScript(scriptUrl, onSuccess, onError);\r\n }\r\n\r\n /**\r\n * Load an asynchronous script (identified by an url). When the url returns, the\r\n * content of this file is added into a new script element, attached to the DOM (body element)\r\n * @param scriptUrl defines the url of the script to laod\r\n * @returns a promise request object\r\n */\r\n public static LoadBabylonScriptAsync(scriptUrl: string): Promise {\r\n scriptUrl = Tools.GetBabylonScriptURL(scriptUrl);\r\n return Tools.LoadScriptAsync(scriptUrl);\r\n }\r\n\r\n /**\r\n * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the\r\n * content of this file is added into a new script element, attached to the DOM (body element)\r\n * @param scriptUrl defines the url of the script to load\r\n * @param onSuccess defines the callback called when the script is loaded\r\n * @param onError defines the callback to call if an error occurs\r\n * @param scriptId defines the id of the script element\r\n */\r\n public static LoadScript(scriptUrl: string, onSuccess: () => void, onError?: (message?: string, exception?: any) => void, scriptId?: string) {\r\n if (typeof importScripts === \"function\") {\r\n try {\r\n importScripts(scriptUrl);\r\n onSuccess();\r\n } catch (e) {\r\n onError?.(`Unable to load script '${scriptUrl}' in worker`, e);\r\n }\r\n return;\r\n } else if (!IsWindowObjectExist()) {\r\n onError?.(`Cannot load script '${scriptUrl}' outside of a window or a worker`);\r\n return;\r\n }\r\n const head = document.getElementsByTagName(\"head\")[0];\r\n const script = document.createElement(\"script\");\r\n script.setAttribute(\"type\", \"text/javascript\");\r\n script.setAttribute(\"src\", scriptUrl);\r\n if (scriptId) {\r\n script.id = scriptId;\r\n }\r\n\r\n script.onload = () => {\r\n if (onSuccess) {\r\n onSuccess();\r\n }\r\n };\r\n\r\n script.onerror = (e) => {\r\n if (onError) {\r\n onError(`Unable to load script '${scriptUrl}'`, e);\r\n }\r\n };\r\n\r\n head.appendChild(script);\r\n }\r\n\r\n /**\r\n * Load an asynchronous script (identified by an url). When the url returns, the\r\n * content of this file is added into a new script element, attached to the DOM (body element)\r\n * @param scriptUrl defines the url of the script to load\r\n * @param scriptId defines the id of the script element\r\n * @returns a promise request object\r\n */\r\n public static LoadScriptAsync(scriptUrl: string, scriptId?: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n this.LoadScript(\r\n scriptUrl,\r\n () => {\r\n resolve();\r\n },\r\n (message, exception) => {\r\n reject(exception || new Error(message));\r\n },\r\n scriptId\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Loads a file from a blob\r\n * @param fileToLoad defines the blob to use\r\n * @param callback defines the callback to call when data is loaded\r\n * @param progressCallback defines the callback to call during loading process\r\n * @returns a file request object\r\n */\r\n public static ReadFileAsDataURL(fileToLoad: Blob, callback: (data: any) => void, progressCallback: (ev: ProgressEvent) => any): IFileRequest {\r\n const reader = new FileReader();\r\n\r\n const request: IFileRequest = {\r\n onCompleteObservable: new Observable(),\r\n abort: () => reader.abort(),\r\n };\r\n\r\n reader.onloadend = () => {\r\n request.onCompleteObservable.notifyObservers(request);\r\n };\r\n\r\n reader.onload = (e) => {\r\n //target doesn't have result from ts 1.3\r\n callback((e.target)[\"result\"]);\r\n };\r\n\r\n reader.onprogress = progressCallback;\r\n\r\n reader.readAsDataURL(fileToLoad);\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Reads a file from a File object\r\n * @param file defines the file to load\r\n * @param onSuccess defines the callback to call when data is loaded\r\n * @param onProgress defines the callback to call during loading process\r\n * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer\r\n * @param onError defines the callback to call when an error occurs\r\n * @returns a file request object\r\n */\r\n public static ReadFile(\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: (ev: ProgressEvent) => any,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: ReadFileError) => void\r\n ): IFileRequest {\r\n return FileToolsReadFile(file, onSuccess, onProgress, useArrayBuffer, onError);\r\n }\r\n\r\n /**\r\n * Creates a data url from a given string content\r\n * @param content defines the content to convert\r\n * @returns the new data url link\r\n */\r\n public static FileAsURL(content: string): string {\r\n const fileBlob = new Blob([content]);\r\n const url = window.URL;\r\n const link: string = url.createObjectURL(fileBlob);\r\n return link;\r\n }\r\n\r\n /**\r\n * Format the given number to a specific decimal format\r\n * @param value defines the number to format\r\n * @param decimals defines the number of decimals to use\r\n * @returns the formatted string\r\n */\r\n public static Format(value: number, decimals = 2): string {\r\n return value.toFixed(decimals);\r\n }\r\n\r\n /**\r\n * Tries to copy an object by duplicating every property\r\n * @param source defines the source object\r\n * @param destination defines the target object\r\n * @param doNotCopyList defines a list of properties to avoid\r\n * @param mustCopyList defines a list of properties to copy (even if they start with _)\r\n */\r\n public static DeepCopy(source: any, destination: any, doNotCopyList?: string[], mustCopyList?: string[]): void {\r\n DeepCopier.DeepCopy(source, destination, doNotCopyList, mustCopyList);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the given object has no own property\r\n * @param obj defines the object to test\r\n * @returns true if object has no own property\r\n */\r\n public static IsEmpty(obj: any): boolean {\r\n for (const i in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, i)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Function used to register events at window level\r\n * @param windowElement defines the Window object to use\r\n * @param events defines the events to register\r\n */\r\n public static RegisterTopRootEvents(windowElement: Window, events: { name: string; handler: Nullable<(e: FocusEvent) => any> }[]): void {\r\n for (let index = 0; index < events.length; index++) {\r\n const event = events[index];\r\n windowElement.addEventListener(event.name, event.handler, false);\r\n\r\n try {\r\n if (window.parent) {\r\n window.parent.addEventListener(event.name, event.handler, false);\r\n }\r\n } catch (e) {\r\n // Silently fails...\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Function used to unregister events from window level\r\n * @param windowElement defines the Window object to use\r\n * @param events defines the events to unregister\r\n */\r\n public static UnregisterTopRootEvents(windowElement: Window, events: { name: string; handler: Nullable<(e: FocusEvent) => any> }[]): void {\r\n for (let index = 0; index < events.length; index++) {\r\n const event = events[index];\r\n windowElement.removeEventListener(event.name, event.handler);\r\n\r\n try {\r\n if (windowElement.parent) {\r\n windowElement.parent.removeEventListener(event.name, event.handler);\r\n }\r\n } catch (e) {\r\n // Silently fails...\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Dumps the current bound framebuffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param engine defines the hosting engine\r\n * @param successCallback defines the callback triggered once the data are available\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns a void promise\r\n */\r\n public static async DumpFramebuffer(\r\n width: number,\r\n height: number,\r\n engine: Engine,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n quality?: number\r\n ) {\r\n throw _WarnImport(\"DumpTools\");\r\n }\r\n\r\n /**\r\n * Dumps an array buffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param data the data array\r\n * @param successCallback defines the callback triggered once the data are available\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param invertY true to invert the picture in the Y dimension\r\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n public static DumpData(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n successCallback?: (data: string | ArrayBuffer) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n invertY = false,\r\n toArrayBuffer = false,\r\n quality?: number\r\n ) {\r\n throw _WarnImport(\"DumpTools\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Dumps an array buffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param data the data array\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param invertY true to invert the picture in the Y dimension\r\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns a promise that resolve to the final data\r\n */\r\n public static DumpDataAsync(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n invertY = false,\r\n toArrayBuffer = false,\r\n quality?: number\r\n ): Promise {\r\n throw _WarnImport(\"DumpTools\");\r\n }\r\n\r\n private static _IsOffScreenCanvas(canvas: HTMLCanvasElement | OffscreenCanvas): canvas is OffscreenCanvas {\r\n return (canvas as OffscreenCanvas).convertToBlob !== undefined;\r\n }\r\n\r\n /**\r\n * Converts the canvas data to blob.\r\n * This acts as a polyfill for browsers not supporting the to blob function.\r\n * @param canvas Defines the canvas to extract the data from (can be an offscreen canvas)\r\n * @param successCallback Defines the callback triggered once the data are available\r\n * @param mimeType Defines the mime type of the result\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n static ToBlob(canvas: HTMLCanvasElement | OffscreenCanvas, successCallback: (blob: Nullable) => void, mimeType = \"image/png\", quality?: number): void {\r\n // We need HTMLCanvasElement.toBlob for HD screenshots\r\n if (!Tools._IsOffScreenCanvas(canvas) && !canvas.toBlob) {\r\n // low performance polyfill based on toDataURL (https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob)\r\n canvas.toBlob = function (callback, type, quality) {\r\n setTimeout(() => {\r\n const binStr = atob(this.toDataURL(type, quality).split(\",\")[1]),\r\n len = binStr.length,\r\n arr = new Uint8Array(len);\r\n\r\n for (let i = 0; i < len; i++) {\r\n arr[i] = binStr.charCodeAt(i);\r\n }\r\n callback(new Blob([arr]));\r\n });\r\n };\r\n }\r\n if (Tools._IsOffScreenCanvas(canvas)) {\r\n canvas\r\n .convertToBlob({\r\n type: mimeType,\r\n quality,\r\n })\r\n .then((blob) => successCallback(blob));\r\n } else {\r\n canvas.toBlob(\r\n function (blob) {\r\n successCallback(blob);\r\n },\r\n mimeType,\r\n quality\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Download a Blob object\r\n * @param blob the Blob object\r\n * @param fileName the file name to download\r\n */\r\n static DownloadBlob(blob: Blob, fileName?: string) {\r\n //Creating a link if the browser have the download attribute on the a tag, to automatically start download generated image.\r\n if (\"download\" in document.createElement(\"a\")) {\r\n if (!fileName) {\r\n const date = new Date();\r\n const stringDate =\r\n (date.getFullYear() + \"-\" + (date.getMonth() + 1)).slice(2) + \"-\" + date.getDate() + \"_\" + date.getHours() + \"-\" + (\"0\" + date.getMinutes()).slice(-2);\r\n fileName = \"screenshot_\" + stringDate + \".png\";\r\n }\r\n Tools.Download(blob, fileName);\r\n } else {\r\n if (blob && typeof URL !== \"undefined\") {\r\n const url = URL.createObjectURL(blob);\r\n\r\n const newWindow = window.open(\"\");\r\n if (!newWindow) {\r\n return;\r\n }\r\n const img = newWindow.document.createElement(\"img\");\r\n img.onload = function () {\r\n // no longer need to read the blob so it's revoked\r\n URL.revokeObjectURL(url);\r\n };\r\n img.src = url;\r\n newWindow.document.body.appendChild(img);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Encodes the canvas data to base 64, or automatically downloads the result if `fileName` is defined.\r\n * @param canvas The canvas to get the data from, which can be an offscreen canvas.\r\n * @param successCallback The callback which is triggered once the data is available. If `fileName` is defined, the callback will be invoked after the download occurs, and the `data` argument will be an empty string.\r\n * @param mimeType The mime type of the result.\r\n * @param fileName The name of the file to download. If defined, the result will automatically be downloaded. If not defined, and `successCallback` is also not defined, the result will automatically be downloaded with an auto-generated file name.\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n static EncodeScreenshotCanvasData(\r\n canvas: HTMLCanvasElement | OffscreenCanvas,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n quality?: number\r\n ): void {\r\n if (typeof fileName === \"string\" || !successCallback) {\r\n this.ToBlob(\r\n canvas,\r\n function (blob) {\r\n if (blob) {\r\n Tools.DownloadBlob(blob, fileName);\r\n }\r\n if (successCallback) {\r\n successCallback(\"\");\r\n }\r\n },\r\n mimeType,\r\n quality\r\n );\r\n } else if (successCallback) {\r\n if (Tools._IsOffScreenCanvas(canvas)) {\r\n canvas\r\n .convertToBlob({\r\n type: mimeType,\r\n quality,\r\n })\r\n .then((blob) => {\r\n const reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onloadend = () => {\r\n const base64data = reader.result;\r\n successCallback(base64data as string);\r\n };\r\n });\r\n return;\r\n }\r\n const base64Image = canvas.toDataURL(mimeType, quality);\r\n successCallback(base64Image);\r\n }\r\n }\r\n\r\n /**\r\n * Downloads a blob in the browser\r\n * @param blob defines the blob to download\r\n * @param fileName defines the name of the downloaded file\r\n */\r\n public static Download(blob: Blob, fileName: string): void {\r\n if (typeof URL === \"undefined\") {\r\n return;\r\n }\r\n\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement(\"a\");\r\n document.body.appendChild(a);\r\n a.style.display = \"none\";\r\n a.href = url;\r\n a.download = fileName;\r\n a.addEventListener(\"click\", () => {\r\n if (a.parentElement) {\r\n a.parentElement.removeChild(a);\r\n }\r\n });\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * Will return the right value of the noPreventDefault variable\r\n * Needed to keep backwards compatibility to the old API.\r\n *\r\n * @param args arguments passed to the attachControl function\r\n * @returns the correct value for noPreventDefault\r\n */\r\n public static BackCompatCameraNoPreventDefault(args: IArguments): boolean {\r\n // is it used correctly?\r\n if (typeof args[0] === \"boolean\") {\r\n return args[0];\r\n } else if (typeof args[1] === \"boolean\") {\r\n return args[1];\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Captures a screenshot of the current rendering\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param successCallback defines the callback receives a single parameter which contains the\r\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\r\n * src parameter of an to display it\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param forceDownload force the system to download the image even if a successCallback is provided\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static CreateScreenshot(\r\n engine: Engine,\r\n camera: Camera,\r\n size: IScreenshotSize | number,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n forceDownload = false,\r\n quality?: number\r\n ): void {\r\n throw _WarnImport(\"ScreenshotTools\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Captures a screenshot of the current rendering\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an to display it\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static CreateScreenshotAsync(engine: Engine, camera: Camera, size: IScreenshotSize | number, mimeType = \"image/png\", quality?: number): Promise {\r\n throw _WarnImport(\"ScreenshotTools\");\r\n }\r\n\r\n /**\r\n * Generates an image screenshot from the specified camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine The engine to use for rendering\r\n * @param camera The camera to use for rendering\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param successCallback The callback receives a single parameter which contains the\r\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\r\n * src parameter of an to display it\r\n * @param mimeType The MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param samples Texture samples (default: 1)\r\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\r\n * @param fileName A name for for the downloaded file.\r\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\r\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\r\n * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static CreateScreenshotUsingRenderTarget(\r\n engine: Engine,\r\n camera: Camera,\r\n size: IScreenshotSize | number,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n samples = 1,\r\n antialiasing = false,\r\n fileName?: string,\r\n renderSprites = false,\r\n enableStencilBuffer = false,\r\n useLayerMask = true,\r\n quality?: number\r\n ): void {\r\n throw _WarnImport(\"ScreenshotTools\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Generates an image screenshot from the specified camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine The engine to use for rendering\r\n * @param camera The camera to use for rendering\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param mimeType The MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param samples Texture samples (default: 1)\r\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\r\n * @param fileName A name for for the downloaded file.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\r\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\r\n * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * to the src parameter of an to display it\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static CreateScreenshotUsingRenderTargetAsync(\r\n engine: Engine,\r\n camera: Camera,\r\n size: IScreenshotSize | number,\r\n mimeType = \"image/png\",\r\n samples = 1,\r\n antialiasing = false,\r\n fileName?: string,\r\n renderSprites = false,\r\n enableStencilBuffer = false,\r\n useLayerMask = true,\r\n quality?: number\r\n ): Promise {\r\n throw _WarnImport(\"ScreenshotTools\");\r\n }\r\n\r\n /**\r\n * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523\r\n * Be aware Math.random() could cause collisions, but:\r\n * \"All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide\"\r\n * @returns a pseudo random id\r\n */\r\n public static RandomId(): string {\r\n return RandomGUID();\r\n }\r\n\r\n /**\r\n * Test if the given uri is a base64 string\r\n * @deprecated Please use FileTools.IsBase64DataUrl instead.\r\n * @param uri The uri to test\r\n * @returns True if the uri is a base64 string or false otherwise\r\n */\r\n public static IsBase64(uri: string): boolean {\r\n return IsBase64DataUrl(uri);\r\n }\r\n\r\n /**\r\n * Decode the given base64 uri.\r\n * @deprecated Please use FileTools.DecodeBase64UrlToBinary instead.\r\n * @param uri The uri to decode\r\n * @returns The decoded base64 data.\r\n */\r\n public static DecodeBase64(uri: string): ArrayBuffer {\r\n return DecodeBase64UrlToBinary(uri);\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check, jsdoc/require-param\r\n /**\r\n * @returns the absolute URL of a given (relative) url\r\n */\r\n public static GetAbsoluteUrl: (url: string) => string =\r\n typeof document === \"object\"\r\n ? (url) => {\r\n const a = document.createElement(\"a\");\r\n a.href = url;\r\n return a.href;\r\n }\r\n : typeof URL === \"function\" && typeof location === \"object\"\r\n ? (url) => new URL(url, location.origin).href\r\n : () => {\r\n throw new Error(\"Unable to get absolute URL. Override BABYLON.Tools.GetAbsoluteUrl to a custom implementation for the current context.\");\r\n };\r\n\r\n // Logs\r\n /**\r\n * No log\r\n */\r\n public static readonly NoneLogLevel = Logger.NoneLogLevel;\r\n /**\r\n * Only message logs\r\n */\r\n public static readonly MessageLogLevel = Logger.MessageLogLevel;\r\n /**\r\n * Only warning logs\r\n */\r\n public static readonly WarningLogLevel = Logger.WarningLogLevel;\r\n /**\r\n * Only error logs\r\n */\r\n public static readonly ErrorLogLevel = Logger.ErrorLogLevel;\r\n /**\r\n * All logs\r\n */\r\n public static readonly AllLogLevel = Logger.AllLogLevel;\r\n\r\n /**\r\n * Gets a value indicating the number of loading errors\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static get errorsCount(): number {\r\n return Logger.errorsCount;\r\n }\r\n\r\n /**\r\n * Callback called when a new log is added\r\n */\r\n public static OnNewCacheEntry: (entry: string) => void;\r\n\r\n /**\r\n * Log a message to the console\r\n * @param message defines the message to log\r\n */\r\n public static Log(message: string): void {\r\n Logger.Log(message);\r\n }\r\n\r\n /**\r\n * Write a warning message to the console\r\n * @param message defines the message to log\r\n */\r\n public static Warn(message: string): void {\r\n Logger.Warn(message);\r\n }\r\n\r\n /**\r\n * Write an error message to the console\r\n * @param message defines the message to log\r\n */\r\n public static Error(message: string): void {\r\n Logger.Error(message);\r\n }\r\n\r\n /**\r\n * Gets current log cache (list of logs)\r\n */\r\n public static get LogCache(): string {\r\n return Logger.LogCache;\r\n }\r\n\r\n /**\r\n * Clears the log cache\r\n */\r\n public static ClearLogCache(): void {\r\n Logger.ClearLogCache();\r\n }\r\n\r\n /**\r\n * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel)\r\n */\r\n public static set LogLevels(level: number) {\r\n Logger.LogLevels = level;\r\n }\r\n\r\n /**\r\n * Checks if the window object exists\r\n * Back Compat only, please use IsWindowObjectExist instead.\r\n */\r\n public static IsWindowObjectExist = IsWindowObjectExist;\r\n\r\n // Performances\r\n\r\n /**\r\n * No performance log\r\n */\r\n public static readonly PerformanceNoneLogLevel = 0;\r\n /**\r\n * Use user marks to log performance\r\n */\r\n public static readonly PerformanceUserMarkLogLevel = 1;\r\n /**\r\n * Log performance to the console\r\n */\r\n public static readonly PerformanceConsoleLogLevel = 2;\r\n\r\n private static _Performance: Performance;\r\n\r\n /**\r\n * Sets the current performance log level\r\n */\r\n public static set PerformanceLogLevel(level: number) {\r\n if ((level & Tools.PerformanceUserMarkLogLevel) === Tools.PerformanceUserMarkLogLevel) {\r\n Tools.StartPerformanceCounter = Tools._StartUserMark;\r\n Tools.EndPerformanceCounter = Tools._EndUserMark;\r\n return;\r\n }\r\n\r\n if ((level & Tools.PerformanceConsoleLogLevel) === Tools.PerformanceConsoleLogLevel) {\r\n Tools.StartPerformanceCounter = Tools._StartPerformanceConsole;\r\n Tools.EndPerformanceCounter = Tools._EndPerformanceConsole;\r\n return;\r\n }\r\n\r\n Tools.StartPerformanceCounter = Tools._StartPerformanceCounterDisabled;\r\n Tools.EndPerformanceCounter = Tools._EndPerformanceCounterDisabled;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private static _StartPerformanceCounterDisabled(counterName: string, condition?: boolean): void {}\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private static _EndPerformanceCounterDisabled(counterName: string, condition?: boolean): void {}\r\n\r\n private static _StartUserMark(counterName: string, condition = true): void {\r\n if (!Tools._Performance) {\r\n if (!IsWindowObjectExist()) {\r\n return;\r\n }\r\n Tools._Performance = window.performance;\r\n }\r\n\r\n if (!condition || !Tools._Performance.mark) {\r\n return;\r\n }\r\n Tools._Performance.mark(counterName + \"-Begin\");\r\n }\r\n\r\n private static _EndUserMark(counterName: string, condition = true): void {\r\n if (!condition || !Tools._Performance.mark) {\r\n return;\r\n }\r\n Tools._Performance.mark(counterName + \"-End\");\r\n Tools._Performance.measure(counterName, counterName + \"-Begin\", counterName + \"-End\");\r\n }\r\n\r\n private static _StartPerformanceConsole(counterName: string, condition = true): void {\r\n if (!condition) {\r\n return;\r\n }\r\n\r\n Tools._StartUserMark(counterName, condition);\r\n\r\n if (console.time) {\r\n console.time(counterName);\r\n }\r\n }\r\n\r\n private static _EndPerformanceConsole(counterName: string, condition = true): void {\r\n if (!condition) {\r\n return;\r\n }\r\n\r\n Tools._EndUserMark(counterName, condition);\r\n\r\n console.timeEnd(counterName);\r\n }\r\n\r\n /**\r\n * Starts a performance counter\r\n */\r\n public static StartPerformanceCounter: (counterName: string, condition?: boolean) => void = Tools._StartPerformanceCounterDisabled;\r\n\r\n /**\r\n * Ends a specific performance counter\r\n */\r\n public static EndPerformanceCounter: (counterName: string, condition?: boolean) => void = Tools._EndPerformanceCounterDisabled;\r\n\r\n /**\r\n * Gets either window.performance.now() if supported or Date.now() else\r\n */\r\n public static get Now(): number {\r\n return PrecisionDate.Now;\r\n }\r\n\r\n /**\r\n * This method will return the name of the class used to create the instance of the given object.\r\n * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator.\r\n * @param object the object to get the class name from\r\n * @param isType defines if the object is actually a type\r\n * @returns the name of the class, will be \"object\" for a custom data type not using the @className decorator\r\n */\r\n public static GetClassName(object: any, isType = false): string {\r\n let name = null;\r\n\r\n if (!isType && object.getClassName) {\r\n name = object.getClassName();\r\n } else {\r\n if (object instanceof Object) {\r\n const classObj = isType ? object : Object.getPrototypeOf(object);\r\n name = classObj.constructor[\"__bjsclassName__\"];\r\n }\r\n if (!name) {\r\n name = typeof object;\r\n }\r\n }\r\n return name;\r\n }\r\n\r\n /**\r\n * Gets the first element of an array satisfying a given predicate\r\n * @param array defines the array to browse\r\n * @param predicate defines the predicate to use\r\n * @returns null if not found or the element\r\n */\r\n public static First(array: Array, predicate: (item: T) => boolean): Nullable {\r\n for (const el of array) {\r\n if (predicate(el)) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * This method will return the name of the full name of the class, including its owning module (if any).\r\n * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator or implementing a method getClassName():string (in which case the module won't be specified).\r\n * @param object the object to get the class name from\r\n * @param isType defines if the object is actually a type\r\n * @returns a string that can have two forms: \"moduleName.className\" if module was specified when the class' Name was registered or \"className\" if there was not module specified.\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static getFullClassName(object: any, isType = false): Nullable {\r\n let className = null;\r\n let moduleName = null;\r\n\r\n if (!isType && object.getClassName) {\r\n className = object.getClassName();\r\n } else {\r\n if (object instanceof Object) {\r\n const classObj = isType ? object : Object.getPrototypeOf(object);\r\n className = classObj.constructor[\"__bjsclassName__\"];\r\n moduleName = classObj.constructor[\"__bjsmoduleName__\"];\r\n }\r\n if (!className) {\r\n className = typeof object;\r\n }\r\n }\r\n\r\n if (!className) {\r\n return null;\r\n }\r\n\r\n return (moduleName != null ? moduleName + \".\" : \"\") + className;\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves after the given amount of time.\r\n * @param delay Number of milliseconds to delay\r\n * @returns Promise that resolves after the given amount of time\r\n */\r\n public static DelayAsync(delay: number): Promise {\r\n return new Promise((resolve) => {\r\n setTimeout(() => {\r\n resolve();\r\n }, delay);\r\n });\r\n }\r\n\r\n /**\r\n * Utility function to detect if the current user agent is Safari\r\n * @returns whether or not the current user agent is safari\r\n */\r\n public static IsSafari(): boolean {\r\n if (!IsNavigatorAvailable()) {\r\n return false;\r\n }\r\n\r\n return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n }\r\n}\r\n\r\n/**\r\n * Use this className as a decorator on a given class definition to add it a name and optionally its module.\r\n * You can then use the Tools.getClassName(obj) on an instance to retrieve its class name.\r\n * This method is the only way to get it done in all cases, even if the .js file declaring the class is minified\r\n * @param name The name of the class, case should be preserved\r\n * @param module The name of the Module hosting the class, optional, but strongly recommended to specify if possible. Case should be preserved.\r\n * @returns a decorator function to apply on the class definition.\r\n */\r\nexport function className(name: string, module?: string): (target: Object) => void {\r\n return (target: Object) => {\r\n (target)[\"__bjsclassName__\"] = name;\r\n (target)[\"__bjsmoduleName__\"] = module != null ? module : null;\r\n };\r\n}\r\n\r\n/**\r\n * An implementation of a loop for asynchronous functions.\r\n */\r\nexport class AsyncLoop {\r\n /**\r\n * Defines the current index of the loop.\r\n */\r\n public index: number;\r\n private _done: boolean;\r\n private _fn: (asyncLoop: AsyncLoop) => void;\r\n private _successCallback: () => void;\r\n\r\n /**\r\n * Constructor.\r\n * @param iterations the number of iterations.\r\n * @param func the function to run each iteration\r\n * @param successCallback the callback that will be called upon successful execution\r\n * @param offset starting offset.\r\n */\r\n constructor(\r\n /**\r\n * Defines the number of iterations for the loop\r\n */\r\n public iterations: number,\r\n func: (asyncLoop: AsyncLoop) => void,\r\n successCallback: () => void,\r\n offset = 0\r\n ) {\r\n this.index = offset - 1;\r\n this._done = false;\r\n this._fn = func;\r\n this._successCallback = successCallback;\r\n }\r\n\r\n /**\r\n * Execute the next iteration. Must be called after the last iteration was finished.\r\n */\r\n public executeNext(): void {\r\n if (!this._done) {\r\n if (this.index + 1 < this.iterations) {\r\n ++this.index;\r\n this._fn(this);\r\n } else {\r\n this.breakLoop();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Break the loop and run the success callback.\r\n */\r\n public breakLoop(): void {\r\n this._done = true;\r\n this._successCallback();\r\n }\r\n\r\n /**\r\n * Create and run an async loop.\r\n * @param iterations the number of iterations.\r\n * @param fn the function to run each iteration\r\n * @param successCallback the callback that will be called upon successful execution\r\n * @param offset starting offset.\r\n * @returns the created async loop object\r\n */\r\n public static Run(iterations: number, fn: (asyncLoop: AsyncLoop) => void, successCallback: () => void, offset = 0): AsyncLoop {\r\n const loop = new AsyncLoop(iterations, fn, successCallback, offset);\r\n\r\n loop.executeNext();\r\n\r\n return loop;\r\n }\r\n\r\n /**\r\n * A for-loop that will run a given number of iterations synchronous and the rest async.\r\n * @param iterations total number of iterations\r\n * @param syncedIterations number of synchronous iterations in each async iteration.\r\n * @param fn the function to call each iteration.\r\n * @param callback a success call back that will be called when iterating stops.\r\n * @param breakFunction a break condition (optional)\r\n * @param timeout timeout settings for the setTimeout function. default - 0.\r\n * @returns the created async loop object\r\n */\r\n public static SyncAsyncForLoop(\r\n iterations: number,\r\n syncedIterations: number,\r\n fn: (iteration: number) => void,\r\n callback: () => void,\r\n breakFunction?: () => boolean,\r\n timeout = 0\r\n ): AsyncLoop {\r\n return AsyncLoop.Run(\r\n Math.ceil(iterations / syncedIterations),\r\n (loop: AsyncLoop) => {\r\n if (breakFunction && breakFunction()) {\r\n loop.breakLoop();\r\n } else {\r\n setTimeout(() => {\r\n for (let i = 0; i < syncedIterations; ++i) {\r\n const iteration = loop.index * syncedIterations + i;\r\n if (iteration >= iterations) {\r\n break;\r\n }\r\n fn(iteration);\r\n if (breakFunction && breakFunction()) {\r\n loop.breakLoop();\r\n break;\r\n }\r\n }\r\n loop.executeNext();\r\n }, timeout);\r\n }\r\n },\r\n callback\r\n );\r\n }\r\n}\r\n\r\nTools.Mix = Mix;\r\nTools.IsExponentOfTwo = IsExponentOfTwo;\r\n\r\n// Will only be define if Tools is imported freeing up some space when only engine is required\r\nEngineStore.FallbackTexture =\r\n \"data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QBmRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAAExAAIAAAAQAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQubmV0IDQuMC41AP/bAEMABAIDAwMCBAMDAwQEBAQFCQYFBQUFCwgIBgkNCw0NDQsMDA4QFBEODxMPDAwSGBITFRYXFxcOERkbGRYaFBYXFv/bAEMBBAQEBQUFCgYGChYPDA8WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFv/AABEIAQABAAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APH6KKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76CiiigD5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BQooooA+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/voKKKKAPl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76CiiigD5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BQooooA+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/voKKKKAPl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FCiiigD6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++gooooA+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gUKKKKAPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76Pl+iiivuj+BT6gooor4U/vo+X6KKK+6P4FPqCiiivhT++j5fooor7o/gU+oKKKK+FP76P//Z\";\r\n", "// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst __mergedStore = {};\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst __decoratorInitialStore = {};\r\n\r\n/** @internal */\r\nexport function GetDirectStore(target: any): any {\r\n const classKey = target.getClassName();\r\n\r\n if (!(__decoratorInitialStore)[classKey]) {\r\n (__decoratorInitialStore)[classKey] = {};\r\n }\r\n\r\n return (__decoratorInitialStore)[classKey];\r\n}\r\n\r\n/**\r\n * @returns the list of properties flagged as serializable\r\n * @param target host object\r\n */\r\nexport function GetMergedStore(target: any): any {\r\n const classKey = target.getClassName();\r\n\r\n if ((__mergedStore)[classKey]) {\r\n return (__mergedStore)[classKey];\r\n }\r\n\r\n (__mergedStore)[classKey] = {};\r\n\r\n const store = (__mergedStore)[classKey];\r\n let currentTarget = target;\r\n let currentKey = classKey;\r\n while (currentKey) {\r\n const initialStore = (__decoratorInitialStore)[currentKey];\r\n for (const property in initialStore) {\r\n store[property] = initialStore[property];\r\n }\r\n\r\n let parent: any;\r\n let done = false;\r\n\r\n do {\r\n parent = Object.getPrototypeOf(currentTarget);\r\n if (!parent.getClassName) {\r\n done = true;\r\n break;\r\n }\r\n\r\n if (parent.getClassName() !== currentKey) {\r\n break;\r\n }\r\n\r\n currentTarget = parent;\r\n } while (parent);\r\n\r\n if (done) {\r\n break;\r\n }\r\n\r\n currentKey = parent.getClassName();\r\n currentTarget = parent;\r\n }\r\n\r\n return store;\r\n}\r\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"../types\";\r\nimport { GetDirectStore } from \"./decorators.functions\";\r\nimport { _WarnImport } from \"./devTools\";\r\n\r\nfunction generateSerializableMember(type: number, sourceName?: string) {\r\n return (target: any, propertyKey: string | symbol) => {\r\n const classStore = GetDirectStore(target);\r\n\r\n if (!classStore[propertyKey]) {\r\n classStore[propertyKey] = { type: type, sourceName: sourceName };\r\n }\r\n };\r\n}\r\n\r\nfunction generateExpandMember(setCallback: string, targetKey: Nullable = null) {\r\n return (target: any, propertyKey: string) => {\r\n const key = targetKey || \"_\" + propertyKey;\r\n Object.defineProperty(target, propertyKey, {\r\n get: function (this: any) {\r\n return this[key];\r\n },\r\n set: function (this: any, value) {\r\n // does this object (i.e. vector3) has an equals function? use it!\r\n // Note - not using \"with epsilon\" here, it is expected te behave like the internal cache does.\r\n if (typeof this.equals === \"function\") {\r\n if (this.equals(value)) {\r\n return;\r\n }\r\n }\r\n if (this[key] === value) {\r\n return;\r\n }\r\n this[key] = value;\r\n\r\n target[setCallback].apply(this);\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n };\r\n}\r\n\r\nexport function expandToProperty(callback: string, targetKey: Nullable = null) {\r\n return generateExpandMember(callback, targetKey);\r\n}\r\n\r\nexport function serialize(sourceName?: string) {\r\n return generateSerializableMember(0, sourceName); // value member\r\n}\r\n\r\nexport function serializeAsTexture(sourceName?: string) {\r\n return generateSerializableMember(1, sourceName); // texture member\r\n}\r\n\r\nexport function serializeAsColor3(sourceName?: string) {\r\n return generateSerializableMember(2, sourceName); // color3 member\r\n}\r\n\r\nexport function serializeAsFresnelParameters(sourceName?: string) {\r\n return generateSerializableMember(3, sourceName); // fresnel parameters member\r\n}\r\n\r\nexport function serializeAsVector2(sourceName?: string) {\r\n return generateSerializableMember(4, sourceName); // vector2 member\r\n}\r\n\r\nexport function serializeAsVector3(sourceName?: string) {\r\n return generateSerializableMember(5, sourceName); // vector3 member\r\n}\r\n\r\nexport function serializeAsMeshReference(sourceName?: string) {\r\n return generateSerializableMember(6, sourceName); // mesh reference member\r\n}\r\n\r\nexport function serializeAsColorCurves(sourceName?: string) {\r\n return generateSerializableMember(7, sourceName); // color curves\r\n}\r\n\r\nexport function serializeAsColor4(sourceName?: string) {\r\n return generateSerializableMember(8, sourceName); // color 4\r\n}\r\n\r\nexport function serializeAsImageProcessingConfiguration(sourceName?: string) {\r\n return generateSerializableMember(9, sourceName); // image processing\r\n}\r\n\r\nexport function serializeAsQuaternion(sourceName?: string) {\r\n return generateSerializableMember(10, sourceName); // quaternion member\r\n}\r\n\r\nexport function serializeAsMatrix(sourceName?: string) {\r\n return generateSerializableMember(12, sourceName); // matrix member\r\n}\r\n\r\n/**\r\n * Decorator used to define property that can be serialized as reference to a camera\r\n * @param sourceName defines the name of the property to decorate\r\n * @returns Property Decorator\r\n */\r\nexport function serializeAsCameraReference(sourceName?: string) {\r\n return generateSerializableMember(11, sourceName); // camera reference member\r\n}\r\n\r\n/** @internal */\r\ndeclare const _native: any;\r\n\r\n/**\r\n * Decorator used to redirect a function to a native implementation if available.\r\n * @internal\r\n */\r\nexport function nativeOverride boolean>(\r\n target: any,\r\n propertyKey: string,\r\n descriptor: TypedPropertyDescriptor<(...params: Parameters) => unknown>,\r\n predicate?: T\r\n) {\r\n // Cache the original JS function for later.\r\n const jsFunc = descriptor.value!;\r\n\r\n // Override the JS function to check for a native override on first invocation. Setting descriptor.value overrides the function at the early stage of code being loaded/imported.\r\n descriptor.value = (...params: Parameters): unknown => {\r\n // Assume the resolved function will be the original JS function, then we will check for the Babylon Native context.\r\n let func = jsFunc;\r\n\r\n // Check if we are executing in a Babylon Native context (e.g. check the presence of the _native global property) and if so also check if a function override is available.\r\n if (typeof _native !== \"undefined\" && _native[propertyKey]) {\r\n const nativeFunc = _native[propertyKey] as (...params: Parameters) => unknown;\r\n // If a predicate was provided, then we'll need to invoke the predicate on each invocation of the underlying function to determine whether to call the native function or the JS function.\r\n if (predicate) {\r\n // The resolved function will execute the predicate and then either execute the native function or the JS function.\r\n func = (...params: Parameters) => (predicate(...params) ? nativeFunc(...params) : jsFunc(...params));\r\n } else {\r\n // The resolved function will directly execute the native function.\r\n func = nativeFunc;\r\n }\r\n }\r\n\r\n // Override the JS function again with the final resolved target function.\r\n target[propertyKey] = func;\r\n\r\n // The JS function has now been overridden based on whether we're executing in the context of Babylon Native, but we still need to invoke that function.\r\n // Future invocations of the function will just directly invoke the final overridden function, not any of the decorator setup logic above.\r\n return func(...params);\r\n };\r\n}\r\n\r\n/**\r\n * Decorator factory that applies the nativeOverride decorator, but determines whether to redirect to the native implementation based on a filter function that evaluates the function arguments.\r\n * @param predicate\r\n * @example @nativeOverride.filter((...[arg1]: Parameters) => arg1.length > 20)\r\n * public someMethod(arg1: string, arg2: number): string {\r\n * @internal\r\n */\r\nnativeOverride.filter = function boolean>(predicate: T) {\r\n return (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...params: Parameters) => unknown>) =>\r\n nativeOverride(target, propertyKey, descriptor, predicate);\r\n};\r\n", "/**\r\n * Class used to evaluate queries containing `and` and `or` operators\r\n */\r\nexport class AndOrNotEvaluator {\r\n /**\r\n * Evaluate a query\r\n * @param query defines the query to evaluate\r\n * @param evaluateCallback defines the callback used to filter result\r\n * @returns true if the query matches\r\n */\r\n public static Eval(query: string, evaluateCallback: (val: any) => boolean): boolean {\r\n if (!query.match(/\\([^()]*\\)/g)) {\r\n query = AndOrNotEvaluator._HandleParenthesisContent(query, evaluateCallback);\r\n } else {\r\n query = query.replace(/\\([^()]*\\)/g, (r) => {\r\n // remove parenthesis\r\n r = r.slice(1, r.length - 1);\r\n return AndOrNotEvaluator._HandleParenthesisContent(r, evaluateCallback);\r\n });\r\n }\r\n\r\n if (query === \"true\") {\r\n return true;\r\n }\r\n\r\n if (query === \"false\") {\r\n return false;\r\n }\r\n\r\n return AndOrNotEvaluator.Eval(query, evaluateCallback);\r\n }\r\n\r\n private static _HandleParenthesisContent(parenthesisContent: string, evaluateCallback: (val: string) => boolean): string {\r\n evaluateCallback =\r\n evaluateCallback ||\r\n ((r) => {\r\n return r === \"true\" ? true : false;\r\n });\r\n\r\n let result;\r\n const or = parenthesisContent.split(\"||\");\r\n\r\n for (const i in or) {\r\n if (Object.prototype.hasOwnProperty.call(or, i)) {\r\n let ori = AndOrNotEvaluator._SimplifyNegation(or[i].trim());\r\n const and = ori.split(\"&&\");\r\n\r\n if (and.length > 1) {\r\n for (let j = 0; j < and.length; ++j) {\r\n const andj = AndOrNotEvaluator._SimplifyNegation(and[j].trim());\r\n if (andj !== \"true\" && andj !== \"false\") {\r\n if (andj[0] === \"!\") {\r\n result = !evaluateCallback(andj.substring(1));\r\n } else {\r\n result = evaluateCallback(andj);\r\n }\r\n } else {\r\n result = andj === \"true\" ? true : false;\r\n }\r\n if (!result) {\r\n // no need to continue since 'false && ... && ...' will always return false\r\n ori = \"false\";\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (result || ori === \"true\") {\r\n // no need to continue since 'true || ... || ...' will always return true\r\n result = true;\r\n break;\r\n }\r\n\r\n // result equals false (or undefined)\r\n\r\n if (ori !== \"true\" && ori !== \"false\") {\r\n if (ori[0] === \"!\") {\r\n result = !evaluateCallback(ori.substring(1));\r\n } else {\r\n result = evaluateCallback(ori);\r\n }\r\n } else {\r\n result = ori === \"true\" ? true : false;\r\n }\r\n }\r\n }\r\n\r\n // the whole parenthesis scope is replaced by 'true' or 'false'\r\n return result ? \"true\" : \"false\";\r\n }\r\n\r\n private static _SimplifyNegation(booleanString: string): string {\r\n booleanString = booleanString.replace(/^[\\s!]+/, (r) => {\r\n // remove whitespaces\r\n r = r.replace(/[\\s]/g, () => \"\");\r\n return r.length % 2 ? \"!\" : \"\";\r\n });\r\n\r\n booleanString = booleanString.trim();\r\n\r\n if (booleanString === \"!true\") {\r\n booleanString = \"false\";\r\n } else if (booleanString === \"!false\") {\r\n booleanString = \"true\";\r\n }\r\n\r\n return booleanString;\r\n }\r\n}\r\n", "import { AndOrNotEvaluator } from \"./andOrNotEvaluator\";\r\n\r\n/**\r\n * Class used to store custom tags\r\n */\r\nexport class Tags {\r\n /**\r\n * Adds support for tags on the given object\r\n * @param obj defines the object to use\r\n */\r\n public static EnableFor(obj: any): void {\r\n obj._tags = obj._tags || {};\r\n\r\n obj.hasTags = () => {\r\n return Tags.HasTags(obj);\r\n };\r\n\r\n obj.addTags = (tagsString: string) => {\r\n return Tags.AddTagsTo(obj, tagsString);\r\n };\r\n\r\n obj.removeTags = (tagsString: string) => {\r\n return Tags.RemoveTagsFrom(obj, tagsString);\r\n };\r\n\r\n obj.matchesTagsQuery = (tagsQuery: string) => {\r\n return Tags.MatchesQuery(obj, tagsQuery);\r\n };\r\n }\r\n\r\n /**\r\n * Removes tags support\r\n * @param obj defines the object to use\r\n */\r\n public static DisableFor(obj: any): void {\r\n delete obj._tags;\r\n delete obj.hasTags;\r\n delete obj.addTags;\r\n delete obj.removeTags;\r\n delete obj.matchesTagsQuery;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the given object has tags\r\n * @param obj defines the object to use\r\n * @returns a boolean\r\n */\r\n public static HasTags(obj: any): boolean {\r\n if (!obj._tags) {\r\n return false;\r\n }\r\n\r\n const tags = obj._tags;\r\n for (const i in tags) {\r\n if (Object.prototype.hasOwnProperty.call(tags, i)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets the tags available on a given object\r\n * @param obj defines the object to use\r\n * @param asString defines if the tags must be returned as a string instead of an array of strings\r\n * @returns the tags\r\n */\r\n public static GetTags(obj: any, asString: boolean = true): any {\r\n if (!obj._tags) {\r\n return null;\r\n }\r\n if (asString) {\r\n const tagsArray = [];\r\n for (const tag in obj._tags) {\r\n if (Object.prototype.hasOwnProperty.call(obj._tags, tag) && obj._tags[tag] === true) {\r\n tagsArray.push(tag);\r\n }\r\n }\r\n return tagsArray.join(\" \");\r\n } else {\r\n return obj._tags;\r\n }\r\n }\r\n\r\n /**\r\n * Adds tags to an object\r\n * @param obj defines the object to use\r\n * @param tagsString defines the tag string. The tags 'true' and 'false' are reserved and cannot be used as tags.\r\n * A tag cannot start with '||', '&&', and '!'. It cannot contain whitespaces\r\n */\r\n public static AddTagsTo(obj: any, tagsString: string): void {\r\n if (!tagsString) {\r\n return;\r\n }\r\n\r\n if (typeof tagsString !== \"string\") {\r\n return;\r\n }\r\n\r\n const tags = tagsString.split(\" \");\r\n tags.forEach(function (tag) {\r\n Tags._AddTagTo(obj, tag);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _AddTagTo(obj: any, tag: string): void {\r\n tag = tag.trim();\r\n\r\n if (tag === \"\" || tag === \"true\" || tag === \"false\") {\r\n return;\r\n }\r\n\r\n if (tag.match(/[\\s]/) || tag.match(/^([!]|([|]|[&]){2})/)) {\r\n return;\r\n }\r\n\r\n Tags.EnableFor(obj);\r\n obj._tags[tag] = true;\r\n }\r\n\r\n /**\r\n * Removes specific tags from a specific object\r\n * @param obj defines the object to use\r\n * @param tagsString defines the tags to remove\r\n */\r\n public static RemoveTagsFrom(obj: any, tagsString: string) {\r\n if (!Tags.HasTags(obj)) {\r\n return;\r\n }\r\n const tags = tagsString.split(\" \");\r\n for (const t in tags) {\r\n Tags._RemoveTagFrom(obj, tags[t]);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _RemoveTagFrom(obj: any, tag: string): void {\r\n delete obj._tags[tag];\r\n }\r\n\r\n /**\r\n * Defines if tags hosted on an object match a given query\r\n * @param obj defines the object to use\r\n * @param tagsQuery defines the tag query\r\n * @returns a boolean\r\n */\r\n public static MatchesQuery(obj: any, tagsQuery: string): boolean {\r\n if (tagsQuery === undefined) {\r\n return true;\r\n }\r\n\r\n if (tagsQuery === \"\") {\r\n return Tags.HasTags(obj);\r\n }\r\n\r\n return AndOrNotEvaluator.Eval(tagsQuery, (r) => Tags.HasTags(obj) && obj._tags[r]);\r\n }\r\n}\r\n", "import { Clamp, Lerp, NormalizeRadians, RandomRange, ToHex, WithinEpsilon } from \"./math.scalar.functions\";\r\n\r\n/**\r\n * Scalar computation library\r\n */\r\nexport class Scalar {\r\n /**\r\n * Two pi constants convenient for computation.\r\n */\r\n public static TwoPi: number = Math.PI * 2;\r\n\r\n /**\r\n * Boolean : true if the absolute difference between a and b is lower than epsilon (default = 1.401298E-45)\r\n * @param a number\r\n * @param b number\r\n * @param epsilon (default = 1.401298E-45)\r\n * @returns true if the absolute difference between a and b is lower than epsilon (default = 1.401298E-45)\r\n */\r\n public static WithinEpsilon: (a: number, b: number, epsilon?: number) => boolean = WithinEpsilon;\r\n\r\n /**\r\n * Returns a string : the upper case translation of the number i to hexadecimal.\r\n * @param i number\r\n * @returns the upper case translation of the number i to hexadecimal.\r\n */\r\n public static ToHex: (i: number) => string = ToHex;\r\n\r\n /**\r\n * Returns -1 if value is negative and +1 is value is positive.\r\n * @param value the value\r\n * @returns the value itself if it's equal to zero.\r\n */\r\n public static Sign(value: number): number {\r\n value = +value; // convert to a number\r\n\r\n if (value === 0 || isNaN(value)) {\r\n return value;\r\n }\r\n\r\n return value > 0 ? 1 : -1;\r\n }\r\n\r\n /**\r\n * Returns the value itself if it's between min and max.\r\n * Returns min if the value is lower than min.\r\n * Returns max if the value is greater than max.\r\n * @param value the value to clmap\r\n * @param min the min value to clamp to (default: 0)\r\n * @param max the max value to clamp to (default: 1)\r\n * @returns the clamped value\r\n */\r\n public static Clamp: (value: number, min?: number, max?: number) => number = Clamp;\r\n\r\n /**\r\n * the log2 of value.\r\n * @param value the value to compute log2 of\r\n * @returns the log2 of value.\r\n */\r\n public static Log2(value: number): number {\r\n return Math.log(value) * Math.LOG2E;\r\n }\r\n\r\n /**\r\n * the floor part of a log2 value.\r\n * @param value the value to compute log2 of\r\n * @returns the log2 of value.\r\n */\r\n public static ILog2(value: number): number {\r\n if (Math.log2) {\r\n return Math.floor(Math.log2(value));\r\n }\r\n\r\n if (value < 0) {\r\n return NaN;\r\n } else if (value === 0) {\r\n return -Infinity;\r\n }\r\n\r\n let n = 0;\r\n if (value < 1) {\r\n while (value < 1) {\r\n n++;\r\n value = value * 2;\r\n }\r\n n = -n;\r\n } else if (value > 1) {\r\n while (value > 1) {\r\n n++;\r\n value = Math.floor(value / 2);\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n /**\r\n * Loops the value, so that it is never larger than length and never smaller than 0.\r\n *\r\n * This is similar to the modulo operator but it works with floating point numbers.\r\n * For example, using 3.0 for t and 2.5 for length, the result would be 0.5.\r\n * With t = 5 and length = 2.5, the result would be 0.0.\r\n * Note, however, that the behaviour is not defined for negative numbers as it is for the modulo operator\r\n * @param value the value\r\n * @param length the length\r\n * @returns the looped value\r\n */\r\n public static Repeat(value: number, length: number): number {\r\n return value - Math.floor(value / length) * length;\r\n }\r\n\r\n /**\r\n * Normalize the value between 0.0 and 1.0 using min and max values\r\n * @param value value to normalize\r\n * @param min max to normalize between\r\n * @param max min to normalize between\r\n * @returns the normalized value\r\n */\r\n public static Normalize(value: number, min: number, max: number): number {\r\n return (value - min) / (max - min);\r\n }\r\n\r\n /**\r\n * Denormalize the value from 0.0 and 1.0 using min and max values\r\n * @param normalized value to denormalize\r\n * @param min max to denormalize between\r\n * @param max min to denormalize between\r\n * @returns the denormalized value\r\n */\r\n public static Denormalize(normalized: number, min: number, max: number): number {\r\n return normalized * (max - min) + min;\r\n }\r\n\r\n /**\r\n * Calculates the shortest difference between two given angles given in degrees.\r\n * @param current current angle in degrees\r\n * @param target target angle in degrees\r\n * @returns the delta\r\n */\r\n public static DeltaAngle(current: number, target: number): number {\r\n let num: number = Scalar.Repeat(target - current, 360.0);\r\n if (num > 180.0) {\r\n num -= 360.0;\r\n }\r\n return num;\r\n }\r\n\r\n /**\r\n * PingPongs the value t, so that it is never larger than length and never smaller than 0.\r\n * @param tx value\r\n * @param length length\r\n * @returns The returned value will move back and forth between 0 and length\r\n */\r\n public static PingPong(tx: number, length: number): number {\r\n const t: number = Scalar.Repeat(tx, length * 2.0);\r\n return length - Math.abs(t - length);\r\n }\r\n\r\n /**\r\n * Interpolates between min and max with smoothing at the limits.\r\n *\r\n * This function interpolates between min and max in a similar way to Lerp. However, the interpolation will gradually speed up\r\n * from the start and slow down toward the end. This is useful for creating natural-looking animation, fading and other transitions.\r\n * @param from from\r\n * @param to to\r\n * @param tx value\r\n * @returns the smooth stepped value\r\n */\r\n public static SmoothStep(from: number, to: number, tx: number): number {\r\n let t: number = Scalar.Clamp(tx);\r\n t = -2.0 * t * t * t + 3.0 * t * t;\r\n return to * t + from * (1.0 - t);\r\n }\r\n\r\n /**\r\n * Moves a value current towards target.\r\n *\r\n * This is essentially the same as Mathf.Lerp but instead the function will ensure that the speed never exceeds maxDelta.\r\n * Negative values of maxDelta pushes the value away from target.\r\n * @param current current value\r\n * @param target target value\r\n * @param maxDelta max distance to move\r\n * @returns resulting value\r\n */\r\n public static MoveTowards(current: number, target: number, maxDelta: number): number {\r\n let result: number = 0;\r\n if (Math.abs(target - current) <= maxDelta) {\r\n result = target;\r\n } else {\r\n result = current + Scalar.Sign(target - current) * maxDelta;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Same as MoveTowards but makes sure the values interpolate correctly when they wrap around 360 degrees.\r\n *\r\n * Variables current and target are assumed to be in degrees. For optimization reasons, negative values of maxDelta\r\n * are not supported and may cause oscillation. To push current away from a target angle, add 180 to that angle instead.\r\n * @param current current value\r\n * @param target target value\r\n * @param maxDelta max distance to move\r\n * @returns resulting angle\r\n */\r\n public static MoveTowardsAngle(current: number, target: number, maxDelta: number): number {\r\n const num: number = Scalar.DeltaAngle(current, target);\r\n let result: number = 0;\r\n if (-maxDelta < num && num < maxDelta) {\r\n result = target;\r\n } else {\r\n target = current + num;\r\n result = Scalar.MoveTowards(current, target, maxDelta);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new scalar with values linearly interpolated of \"amount\" between the start scalar and the end scalar.\r\n * @param start start value\r\n * @param end target value\r\n * @param amount amount to lerp between\r\n * @returns the lerped value\r\n */\r\n public static Lerp: (start: number, end: number, amount: number) => number = Lerp;\r\n\r\n /**\r\n * Same as Lerp but makes sure the values interpolate correctly when they wrap around 360 degrees.\r\n * The parameter t is clamped to the range [0, 1]. Variables a and b are assumed to be in degrees.\r\n * @param start start value\r\n * @param end target value\r\n * @param amount amount to lerp between\r\n * @returns the lerped value\r\n */\r\n public static LerpAngle(start: number, end: number, amount: number): number {\r\n let num: number = Scalar.Repeat(end - start, 360.0);\r\n if (num > 180.0) {\r\n num -= 360.0;\r\n }\r\n return start + num * Clamp(amount);\r\n }\r\n\r\n /**\r\n * Calculates the linear parameter t that produces the interpolant value within the range [a, b].\r\n * @param a start value\r\n * @param b target value\r\n * @param value value between a and b\r\n * @returns the inverseLerp value\r\n */\r\n public static InverseLerp(a: number, b: number, value: number): number {\r\n let result: number = 0;\r\n if (a != b) {\r\n result = Clamp((value - a) / (b - a));\r\n } else {\r\n result = 0.0;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new scalar located for \"amount\" (float) on the Hermite spline defined by the scalars \"value1\", \"value3\", \"tangent1\", \"tangent2\".\r\n * @see http://mathworld.wolfram.com/HermitePolynomial.html\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param amount defines the amount on the interpolation spline (between 0 and 1)\r\n * @returns hermite result\r\n */\r\n public static Hermite(value1: number, tangent1: number, value2: number, tangent2: number, amount: number): number {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n const part1 = 2.0 * cubed - 3.0 * squared + 1.0;\r\n const part2 = -2.0 * cubed + 3.0 * squared;\r\n const part3 = cubed - 2.0 * squared + amount;\r\n const part4 = cubed - squared;\r\n\r\n return value1 * part1 + value2 * part2 + tangent1 * part3 + tangent2 * part4;\r\n }\r\n\r\n /**\r\n * Returns a new scalar which is the 1st derivative of the Hermite spline defined by the scalars \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @returns 1st derivative\r\n */\r\n public static Hermite1stDerivative(value1: number, tangent1: number, value2: number, tangent2: number, time: number): number {\r\n const t2 = time * time;\r\n return (t2 - time) * 6 * value1 + (3 * t2 - 4 * time + 1) * tangent1 + (-t2 + time) * 6 * value2 + (3 * t2 - 2 * time) * tangent2;\r\n }\r\n\r\n /**\r\n * Returns a random float number between and min and max values\r\n * @param min min value of random\r\n * @param max max value of random\r\n * @returns random value\r\n */\r\n public static RandomRange: (min: number, max: number) => number = RandomRange;\r\n\r\n /**\r\n * This function returns percentage of a number in a given range.\r\n *\r\n * RangeToPercent(40,20,60) will return 0.5 (50%)\r\n * RangeToPercent(34,0,100) will return 0.34 (34%)\r\n * @param number to convert to percentage\r\n * @param min min range\r\n * @param max max range\r\n * @returns the percentage\r\n */\r\n public static RangeToPercent(number: number, min: number, max: number): number {\r\n return (number - min) / (max - min);\r\n }\r\n\r\n /**\r\n * This function returns number that corresponds to the percentage in a given range.\r\n *\r\n * PercentToRange(0.34,0,100) will return 34.\r\n * @param percent to convert to number\r\n * @param min min range\r\n * @param max max range\r\n * @returns the number\r\n */\r\n public static PercentToRange(percent: number, min: number, max: number): number {\r\n return (max - min) * percent + min;\r\n }\r\n\r\n /**\r\n * Returns the angle converted to equivalent value between -Math.PI and Math.PI radians.\r\n * @param angle The angle to normalize in radian.\r\n * @returns The converted angle.\r\n */\r\n public static NormalizeRadians: (angle: number) => number = NormalizeRadians;\r\n\r\n /**\r\n * Returns the highest common factor of two integers.\r\n * @param a first parameter\r\n * @param b second parameter\r\n * @returns HCF of a and b\r\n */\r\n public static HCF(a: number, b: number): number {\r\n const r: number = a % b;\r\n if (r === 0) {\r\n return b;\r\n }\r\n return Scalar.HCF(b, r);\r\n }\r\n}\r\n", "import type { Constructor, DeepImmutable, FloatArray, Tuple } from \"../types\";\r\nimport { Scalar } from \"./math.scalar\";\r\nimport { Clamp, ToHex } from \"./math.scalar.functions\";\r\nimport { ToLinearSpace, ToGammaSpace, Epsilon } from \"./math.constants\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport type { Tensor } from \"./tensor\";\r\nimport type { IColor3Like, IColor4Like } from \"./math.like\";\r\n\r\nfunction colorChannelToLinearSpace(color: number): number {\r\n return Math.pow(color, ToLinearSpace);\r\n}\r\n\r\nfunction colorChannelToLinearSpaceExact(color: number): number {\r\n if (color <= 0.04045) {\r\n return 0.0773993808 * color;\r\n }\r\n return Math.pow(0.947867299 * (color + 0.055), 2.4);\r\n}\r\n\r\nfunction colorChannelToGammaSpace(color: number): number {\r\n return Math.pow(color, ToGammaSpace);\r\n}\r\n\r\nfunction colorChannelToGammaSpaceExact(color: number): number {\r\n if (color <= 0.0031308) {\r\n return 12.92 * color;\r\n }\r\n return 1.055 * Math.pow(color, 0.41666) - 0.055;\r\n}\r\n\r\n/**\r\n * Class used to hold a RGB color\r\n */\r\nexport class Color3 implements Tensor>, IColor3Like {\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: [3];\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 1;\r\n\r\n /**\r\n * Creates a new Color3 object from red, green, blue values, all between 0 and 1\r\n * @param r defines the red component (between 0 and 1, default is 0)\r\n * @param g defines the green component (between 0 and 1, default is 0)\r\n * @param b defines the blue component (between 0 and 1, default is 0)\r\n */\r\n constructor(\r\n /**\r\n * Defines the red component (between 0 and 1, default is 0)\r\n */\r\n public r: number = 0,\r\n /**\r\n * Defines the green component (between 0 and 1, default is 0)\r\n */\r\n public g: number = 0,\r\n /**\r\n * Defines the blue component (between 0 and 1, default is 0)\r\n */\r\n public b: number = 0\r\n ) {}\r\n\r\n /**\r\n * Creates a string with the Color3 current values\r\n * @returns the string representation of the Color3 object\r\n */\r\n public toString(): string {\r\n return \"{R: \" + this.r + \" G:\" + this.g + \" B:\" + this.b + \"}\";\r\n }\r\n\r\n /**\r\n * Returns the string \"Color3\"\r\n * @returns \"Color3\"\r\n */\r\n public getClassName(): string {\r\n return \"Color3\";\r\n }\r\n\r\n /**\r\n * Compute the Color3 hash code\r\n * @returns an unique number that can be used to hash Color3 objects\r\n */\r\n public getHashCode(): number {\r\n let hash = (this.r * 255) | 0;\r\n hash = (hash * 397) ^ ((this.g * 255) | 0);\r\n hash = (hash * 397) ^ ((this.b * 255) | 0);\r\n return hash;\r\n }\r\n\r\n // Operators\r\n\r\n /**\r\n * Stores in the given array from the given starting index the red, green, blue values as successive elements\r\n * @param array defines the array where to store the r,g,b components\r\n * @param index defines an optional index in the target array to define where to start storing values\r\n * @returns the current Color3 object\r\n */\r\n public toArray(array: FloatArray, index: number = 0): this {\r\n array[index] = this.r;\r\n array[index + 1] = this.g;\r\n array[index + 2] = this.b;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Update the current color with values stored in an array from the starting index of the given array\r\n * @param array defines the source array\r\n * @param offset defines an offset in the source array\r\n * @returns the current Color3 object\r\n */\r\n public fromArray(array: DeepImmutable>, offset: number = 0): this {\r\n Color3.FromArrayToRef(array, offset, this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Color4 object from the current Color3 and the given alpha\r\n * @param alpha defines the alpha component on the new Color4 object (default is 1)\r\n * @returns a new Color4 object\r\n */\r\n public toColor4(alpha: number = 1): Color4 {\r\n return new Color4(this.r, this.g, this.b, alpha);\r\n }\r\n\r\n /**\r\n * Returns a new array populated with 3 numeric elements : red, green and blue values\r\n * @returns the new array\r\n */\r\n public asArray(): Tuple {\r\n return [this.r, this.g, this.b];\r\n }\r\n\r\n /**\r\n * Returns the luminance value\r\n * @returns a float value\r\n */\r\n public toLuminance(): number {\r\n return this.r * 0.3 + this.g * 0.59 + this.b * 0.11;\r\n }\r\n\r\n /**\r\n * Multiply each Color3 rgb values by the given Color3 rgb values in a new Color3 object\r\n * @param otherColor defines the second operand\r\n * @returns the new Color3 object\r\n */\r\n public multiply(otherColor: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.r * otherColor.r, this.g * otherColor.g, this.b * otherColor.b);\r\n }\r\n\r\n /**\r\n * Multiply the rgb values of the Color3 and the given Color3 and stores the result in the object \"result\"\r\n * @param otherColor defines the second operand\r\n * @param result defines the Color3 object where to store the result\r\n * @returns the result Color3\r\n */\r\n public multiplyToRef(otherColor: DeepImmutable, result: T): T {\r\n result.r = this.r * otherColor.r;\r\n result.g = this.g * otherColor.g;\r\n result.b = this.b * otherColor.b;\r\n return result;\r\n }\r\n\r\n /**\r\n * Multiplies the current Color3 coordinates by the given ones\r\n * @param otherColor defines the second operand\r\n * @returns the current updated Color3\r\n */\r\n public multiplyInPlace(otherColor: DeepImmutable): this {\r\n this.r *= otherColor.r;\r\n this.g *= otherColor.g;\r\n this.b *= otherColor.b;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Color3 set with the result of the multiplication of the current Color3 coordinates by the given floats\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @returns the new Color3\r\n */\r\n public multiplyByFloats(r: number, g: number, b: number): this {\r\n return new (this.constructor as Constructor)(this.r * r, this.g * g, this.b * b);\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divide(_other: DeepImmutable): this {\r\n throw new ReferenceError(\"Can not divide a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divideToRef(_other: DeepImmutable, _result: T): T {\r\n throw new ReferenceError(\"Can not divide a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divideInPlace(_other: DeepImmutable): this {\r\n throw new ReferenceError(\"Can not divide a color\");\r\n }\r\n\r\n /**\r\n * Updates the current Color3 with the minimal coordinate values between its and the given color ones\r\n * @param other defines the second operand\r\n * @returns the current updated Color3\r\n */\r\n public minimizeInPlace(other: DeepImmutable): this {\r\n return this.minimizeInPlaceFromFloats(other.r, other.g, other.b);\r\n }\r\n\r\n /**\r\n * Updates the current Color3 with the maximal coordinate values between its and the given color ones.\r\n * @param other defines the second operand\r\n * @returns the current updated Color3\r\n */\r\n public maximizeInPlace(other: DeepImmutable): this {\r\n return this.maximizeInPlaceFromFloats(other.r, other.g, other.b);\r\n }\r\n\r\n /**\r\n * Updates the current Color3 with the minimal coordinate values between its and the given coordinates\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @returns the current updated Color3\r\n */\r\n public minimizeInPlaceFromFloats(r: number, g: number, b: number): this {\r\n this.r = Math.min(r, this.r);\r\n this.g = Math.min(g, this.g);\r\n this.b = Math.min(b, this.b);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Color3 with the maximal coordinate values between its and the given coordinates.\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @returns the current updated Color3\r\n */\r\n public maximizeInPlaceFromFloats(r: number, g: number, b: number): this {\r\n this.r = Math.max(r, this.r);\r\n this.g = Math.max(g, this.g);\r\n this.b = Math.max(b, this.b);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public floorToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not floor a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public floor(): this {\r\n throw new ReferenceError(\"Can not floor a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public fractToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not fract a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public fract(): this {\r\n throw new ReferenceError(\"Can not fract a color\");\r\n }\r\n\r\n /**\r\n * Determines equality between Color3 objects\r\n * @param otherColor defines the second operand\r\n * @returns true if the rgb values are equal to the given ones\r\n */\r\n public equals(otherColor: DeepImmutable): boolean {\r\n return otherColor && this.r === otherColor.r && this.g === otherColor.g && this.b === otherColor.b;\r\n }\r\n\r\n /**\r\n * Alias for equalsToFloats\r\n * @param r red color component\r\n * @param g green color component\r\n * @param b blue color component\r\n * @returns boolean\r\n */\r\n public equalsFloats(r: number, g: number, b: number): boolean {\r\n return this.equalsToFloats(r, g, b);\r\n }\r\n\r\n /**\r\n * Determines equality between the current Color3 object and a set of r,b,g values\r\n * @param r defines the red component to check\r\n * @param g defines the green component to check\r\n * @param b defines the blue component to check\r\n * @returns true if the rgb values are equal to the given ones\r\n */\r\n public equalsToFloats(r: number, g: number, b: number): boolean {\r\n return this.r === r && this.g === g && this.b === b;\r\n }\r\n\r\n /**\r\n * Returns true if the current Color3 and the given color coordinates are distant less than epsilon\r\n * @param otherColor defines the second operand\r\n * @param epsilon defines the minimal distance to define values as equals\r\n * @returns true if both colors are distant less than epsilon\r\n */\r\n public equalsWithEpsilon(otherColor: DeepImmutable, epsilon: number = Epsilon): boolean {\r\n return Scalar.WithinEpsilon(this.r, otherColor.r, epsilon) && Scalar.WithinEpsilon(this.g, otherColor.g, epsilon) && Scalar.WithinEpsilon(this.b, otherColor.b, epsilon);\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public negate(): this {\r\n throw new ReferenceError(\"Can not negate a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public negateInPlace(): this {\r\n throw new ReferenceError(\"Can not negate a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public negateToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not negate a color\");\r\n }\r\n\r\n /**\r\n * Creates a new Color3 with the current Color3 values multiplied by scale\r\n * @param scale defines the scaling factor to apply\r\n * @returns a new Color3 object\r\n */\r\n public scale(scale: number): this {\r\n return new (this.constructor as Constructor)(this.r * scale, this.g * scale, this.b * scale);\r\n }\r\n\r\n /**\r\n * Multiplies the Color3 values by the float \"scale\"\r\n * @param scale defines the scaling factor to apply\r\n * @returns the current updated Color3\r\n */\r\n public scaleInPlace(scale: number): this {\r\n this.r *= scale;\r\n this.g *= scale;\r\n this.b *= scale;\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiplies the rgb values by scale and stores the result into \"result\"\r\n * @param scale defines the scaling factor\r\n * @param result defines the Color3 object where to store the result\r\n * @returns the result Color3\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n result.r = this.r * scale;\r\n result.g = this.g * scale;\r\n result.b = this.b * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Scale the current Color3 values by a factor and add the result to a given Color3\r\n * @param scale defines the scale factor\r\n * @param result defines color to store the result into\r\n * @returns the result Color3\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n result.r += this.r * scale;\r\n result.g += this.g * scale;\r\n result.b += this.b * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Clamps the rgb values by the min and max values and stores the result into \"result\"\r\n * @param min defines minimum clamping value (default is 0)\r\n * @param max defines maximum clamping value (default is 1)\r\n * @param result defines color to store the result into\r\n * @returns the result Color3\r\n */\r\n public clampToRef(min: number = 0, max: number = 1, result: T): T {\r\n result.r = Clamp(this.r, min, max);\r\n result.g = Clamp(this.g, min, max);\r\n result.b = Clamp(this.b, min, max);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new Color3 set with the added values of the current Color3 and of the given one\r\n * @param otherColor defines the second operand\r\n * @returns the new Color3\r\n */\r\n public add(otherColor: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.r + otherColor.r, this.g + otherColor.g, this.b + otherColor.b);\r\n }\r\n\r\n /**\r\n * Adds the given color to the current Color3\r\n * @param otherColor defines the second operand\r\n * @returns the current updated Color3\r\n */\r\n public addInPlace(otherColor: DeepImmutable): this {\r\n this.r += otherColor.r;\r\n this.g += otherColor.g;\r\n this.b += otherColor.b;\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the given coordinates to the current Color3\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @returns the current updated Color3\r\n */\r\n public addInPlaceFromFloats(r: number, g: number, b: number): this {\r\n this.r += r;\r\n this.g += g;\r\n this.b += b;\r\n return this;\r\n }\r\n\r\n /**\r\n * Stores the result of the addition of the current Color3 and given one rgb values into \"result\"\r\n * @param otherColor defines the second operand\r\n * @param result defines Color3 object to store the result into\r\n * @returns the unmodified current Color3\r\n */\r\n public addToRef(otherColor: DeepImmutable, result: T): T {\r\n result.r = this.r + otherColor.r;\r\n result.g = this.g + otherColor.g;\r\n result.b = this.b + otherColor.b;\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Color3 set with the subtracted values of the given one from the current Color3\r\n * @param otherColor defines the second operand\r\n * @returns the new Color3\r\n */\r\n public subtract(otherColor: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.r - otherColor.r, this.g - otherColor.g, this.b - otherColor.b);\r\n }\r\n\r\n /**\r\n * Stores the result of the subtraction of given one from the current Color3 rgb values into \"result\"\r\n * @param otherColor defines the second operand\r\n * @param result defines Color3 object to store the result into\r\n * @returns the unmodified current Color3\r\n */\r\n public subtractToRef(otherColor: DeepImmutable, result: T): T {\r\n result.r = this.r - otherColor.r;\r\n result.g = this.g - otherColor.g;\r\n result.b = this.b - otherColor.b;\r\n return result;\r\n }\r\n\r\n /**\r\n * Subtract the given color from the current Color3\r\n * @param otherColor defines the second operand\r\n * @returns the current updated Color3\r\n */\r\n public subtractInPlace(otherColor: DeepImmutable): this {\r\n this.r -= otherColor.r;\r\n this.g -= otherColor.g;\r\n this.b -= otherColor.b;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Color3 set with the subtraction of the given floats from the current Color3 coordinates\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @returns the resulting Color3\r\n */\r\n public subtractFromFloats(r: number, g: number, b: number): this {\r\n return new (this.constructor as Constructor)(this.r - r, this.g - g, this.b - b);\r\n }\r\n\r\n /**\r\n * Subtracts the given floats from the current Color3 coordinates and set the given color \"result\" with this result\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @param result defines the Color3 object where to store the result\r\n * @returns the result\r\n */\r\n public subtractFromFloatsToRef(r: number, g: number, b: number, result: T): T {\r\n return result.copyFromFloats(this.r - r, this.g - g, this.b - b);\r\n }\r\n\r\n /**\r\n * Copy the current object\r\n * @returns a new Color3 copied the current one\r\n */\r\n public clone(): this {\r\n return new (this.constructor as Constructor)(this.r, this.g, this.b);\r\n }\r\n\r\n /**\r\n * Copies the rgb values from the source in the current Color3\r\n * @param source defines the source Color3 object\r\n * @returns the updated Color3 object\r\n */\r\n public copyFrom(source: DeepImmutable): this {\r\n this.r = source.r;\r\n this.g = source.g;\r\n this.b = source.b;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the Color3 rgb values from the given floats\r\n * @param r defines the red component to read from\r\n * @param g defines the green component to read from\r\n * @param b defines the blue component to read from\r\n * @returns the current Color3 object\r\n */\r\n public copyFromFloats(r: number, g: number, b: number): this {\r\n this.r = r;\r\n this.g = g;\r\n this.b = b;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the Color3 rgb values from the given floats\r\n * @param r defines the red component to read from\r\n * @param g defines the green component to read from\r\n * @param b defines the blue component to read from\r\n * @returns the current Color3 object\r\n */\r\n public set(r: number, g: number, b: number): this {\r\n return this.copyFromFloats(r, g, b);\r\n }\r\n\r\n /**\r\n * Copies the given float to the current Color3 coordinates\r\n * @param v defines the r, g and b coordinates of the operand\r\n * @returns the current updated Color3\r\n */\r\n public setAll(v: number): this {\r\n this.r = this.g = this.b = v;\r\n return this;\r\n }\r\n\r\n /**\r\n * Compute the Color3 hexadecimal code as a string\r\n * @returns a string containing the hexadecimal representation of the Color3 object\r\n */\r\n public toHexString(): string {\r\n const intR = Math.round(this.r * 255);\r\n const intG = Math.round(this.g * 255);\r\n const intB = Math.round(this.b * 255);\r\n return \"#\" + ToHex(intR) + ToHex(intG) + ToHex(intB);\r\n }\r\n\r\n /**\r\n * Converts current color in rgb space to HSV values\r\n * @returns a new color3 representing the HSV values\r\n */\r\n public toHSV(): this {\r\n const result = new (this.constructor as Constructor)();\r\n\r\n this.toHSVToRef(result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts current color in rgb space to HSV values\r\n * @param result defines the Color3 where to store the HSV values\r\n */\r\n public toHSVToRef(result: this) {\r\n const r = this.r;\r\n const g = this.g;\r\n const b = this.b;\r\n\r\n const max = Math.max(r, g, b);\r\n const min = Math.min(r, g, b);\r\n let h = 0;\r\n let s = 0;\r\n const v = max;\r\n\r\n const dm = max - min;\r\n\r\n if (max !== 0) {\r\n s = dm / max;\r\n }\r\n\r\n if (max != min) {\r\n if (max == r) {\r\n h = (g - b) / dm;\r\n if (g < b) {\r\n h += 6;\r\n }\r\n } else if (max == g) {\r\n h = (b - r) / dm + 2;\r\n } else if (max == b) {\r\n h = (r - g) / dm + 4;\r\n }\r\n h *= 60;\r\n }\r\n\r\n result.r = h;\r\n result.g = s;\r\n result.b = v;\r\n }\r\n\r\n /**\r\n * Computes a new Color3 converted from the current one to linear space\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns a new Color3 object\r\n */\r\n public toLinearSpace(exact = false): this {\r\n const convertedColor = new (this.constructor as Constructor)();\r\n this.toLinearSpaceToRef(convertedColor, exact);\r\n return convertedColor;\r\n }\r\n\r\n /**\r\n * Converts the Color3 values to linear space and stores the result in \"convertedColor\"\r\n * @param convertedColor defines the Color3 object where to store the linear space version\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns the unmodified Color3\r\n */\r\n public toLinearSpaceToRef(convertedColor: this, exact = false): this {\r\n if (exact) {\r\n convertedColor.r = colorChannelToLinearSpaceExact(this.r);\r\n convertedColor.g = colorChannelToLinearSpaceExact(this.g);\r\n convertedColor.b = colorChannelToLinearSpaceExact(this.b);\r\n } else {\r\n convertedColor.r = colorChannelToLinearSpace(this.r);\r\n convertedColor.g = colorChannelToLinearSpace(this.g);\r\n convertedColor.b = colorChannelToLinearSpace(this.b);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Computes a new Color3 converted from the current one to gamma space\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns a new Color3 object\r\n */\r\n public toGammaSpace(exact = false): this {\r\n const convertedColor = new (this.constructor as Constructor)();\r\n this.toGammaSpaceToRef(convertedColor, exact);\r\n return convertedColor;\r\n }\r\n\r\n /**\r\n * Converts the Color3 values to gamma space and stores the result in \"convertedColor\"\r\n * @param convertedColor defines the Color3 object where to store the gamma space version\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns the unmodified Color3\r\n */\r\n public toGammaSpaceToRef(convertedColor: this, exact = false): this {\r\n if (exact) {\r\n convertedColor.r = colorChannelToGammaSpaceExact(this.r);\r\n convertedColor.g = colorChannelToGammaSpaceExact(this.g);\r\n convertedColor.b = colorChannelToGammaSpaceExact(this.b);\r\n } else {\r\n convertedColor.r = colorChannelToGammaSpace(this.r);\r\n convertedColor.g = colorChannelToGammaSpace(this.g);\r\n convertedColor.b = colorChannelToGammaSpace(this.b);\r\n }\r\n return this;\r\n }\r\n\r\n // Statics\r\n\r\n private static _BlackReadOnly = Color3.Black() as DeepImmutable;\r\n\r\n /**\r\n * Converts Hue, saturation and value to a Color3 (RGB)\r\n * @param hue defines the hue (value between 0 and 360)\r\n * @param saturation defines the saturation (value between 0 and 1)\r\n * @param value defines the value (value between 0 and 1)\r\n * @param result defines the Color3 where to store the RGB values\r\n */\r\n public static HSVtoRGBToRef(hue: number, saturation: number, value: number, result: Color3) {\r\n const chroma = value * saturation;\r\n const h = hue / 60;\r\n const x = chroma * (1 - Math.abs((h % 2) - 1));\r\n let r = 0;\r\n let g = 0;\r\n let b = 0;\r\n\r\n if (h >= 0 && h <= 1) {\r\n r = chroma;\r\n g = x;\r\n } else if (h >= 1 && h <= 2) {\r\n r = x;\r\n g = chroma;\r\n } else if (h >= 2 && h <= 3) {\r\n g = chroma;\r\n b = x;\r\n } else if (h >= 3 && h <= 4) {\r\n g = x;\r\n b = chroma;\r\n } else if (h >= 4 && h <= 5) {\r\n r = x;\r\n b = chroma;\r\n } else if (h >= 5 && h <= 6) {\r\n r = chroma;\r\n b = x;\r\n }\r\n\r\n const m = value - chroma;\r\n result.set(r + m, g + m, b + m);\r\n }\r\n\r\n /**\r\n * Converts Hue, saturation and value to a new Color3 (RGB)\r\n * @param hue defines the hue (value between 0 and 360)\r\n * @param saturation defines the saturation (value between 0 and 1)\r\n * @param value defines the value (value between 0 and 1)\r\n * @returns a new Color3 object\r\n */\r\n public static FromHSV(hue: number, saturation: number, value: number): Color3 {\r\n const result = new Color3(0, 0, 0);\r\n Color3.HSVtoRGBToRef(hue, saturation, value, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new Color3 from the string containing valid hexadecimal values\r\n * @param hex defines a string containing valid hexadecimal values\r\n * @returns a new Color3 object\r\n */\r\n public static FromHexString(hex: string): Color3 {\r\n if (hex.substring(0, 1) !== \"#\" || hex.length !== 7) {\r\n return new Color3(0, 0, 0);\r\n }\r\n\r\n const r = parseInt(hex.substring(1, 3), 16);\r\n const g = parseInt(hex.substring(3, 5), 16);\r\n const b = parseInt(hex.substring(5, 7), 16);\r\n\r\n return Color3.FromInts(r, g, b);\r\n }\r\n\r\n /**\r\n * Creates a new Color3 from the starting index of the given array\r\n * @param array defines the source array\r\n * @param offset defines an offset in the source array\r\n * @returns a new Color3 object\r\n */\r\n public static FromArray(array: DeepImmutable>, offset: number = 0): Color3 {\r\n return new Color3(array[offset], array[offset + 1], array[offset + 2]);\r\n }\r\n\r\n /**\r\n * Creates a new Color3 from the starting index element of the given array\r\n * @param array defines the source array to read from\r\n * @param offset defines the offset in the source array\r\n * @param result defines the target Color3 object\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number = 0, result: Color3) {\r\n result.r = array[offset];\r\n result.g = array[offset + 1];\r\n result.b = array[offset + 2];\r\n }\r\n\r\n /**\r\n * Creates a new Color3 from integer values (\\< 256)\r\n * @param r defines the red component to read from (value between 0 and 255)\r\n * @param g defines the green component to read from (value between 0 and 255)\r\n * @param b defines the blue component to read from (value between 0 and 255)\r\n * @returns a new Color3 object\r\n */\r\n public static FromInts(r: number, g: number, b: number): Color3 {\r\n return new Color3(r / 255.0, g / 255.0, b / 255.0);\r\n }\r\n\r\n /**\r\n * Creates a new Color3 with values linearly interpolated of \"amount\" between the start Color3 and the end Color3\r\n * @param start defines the start Color3 value\r\n * @param end defines the end Color3 value\r\n * @param amount defines the gradient value between start and end\r\n * @returns a new Color3 object\r\n */\r\n public static Lerp(start: DeepImmutable, end: DeepImmutable, amount: number): Color3 {\r\n const result = new Color3(0.0, 0.0, 0.0);\r\n Color3.LerpToRef(start, end, amount, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new Color3 with values linearly interpolated of \"amount\" between the start Color3 and the end Color3\r\n * @param left defines the start value\r\n * @param right defines the end value\r\n * @param amount defines the gradient factor\r\n * @param result defines the Color3 object where to store the result\r\n */\r\n public static LerpToRef(left: DeepImmutable, right: DeepImmutable, amount: number, result: Color3): void {\r\n result.r = left.r + (right.r - left.r) * amount;\r\n result.g = left.g + (right.g - left.g) * amount;\r\n result.b = left.b + (right.b - left.b) * amount;\r\n }\r\n\r\n /**\r\n * Returns a new Color3 located for \"amount\" (float) on the Hermite interpolation spline defined by the vectors \"value1\", \"tangent1\", \"value2\", \"tangent2\"\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent Color3\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent Color3\r\n * @param amount defines the amount on the interpolation spline (between 0 and 1)\r\n * @returns the new Color3\r\n */\r\n public static Hermite(value1: DeepImmutable, tangent1: DeepImmutable, value2: DeepImmutable, tangent2: DeepImmutable, amount: number): Color3 {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n const part1 = 2.0 * cubed - 3.0 * squared + 1.0;\r\n const part2 = -2.0 * cubed + 3.0 * squared;\r\n const part3 = cubed - 2.0 * squared + amount;\r\n const part4 = cubed - squared;\r\n\r\n const r = value1.r * part1 + value2.r * part2 + tangent1.r * part3 + tangent2.r * part4;\r\n const g = value1.g * part1 + value2.g * part2 + tangent1.g * part3 + tangent2.g * part4;\r\n const b = value1.b * part1 + value2.b * part2 + tangent1.b * part3 + tangent2.b * part4;\r\n return new Color3(r, g, b);\r\n }\r\n\r\n /**\r\n * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @returns 1st derivative\r\n */\r\n public static Hermite1stDerivative(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number\r\n ): Color3 {\r\n const result = Color3.Black();\r\n\r\n this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @param result define where to store the derivative\r\n */\r\n public static Hermite1stDerivativeToRef(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number,\r\n result: Color3\r\n ) {\r\n const t2 = time * time;\r\n\r\n result.r = (t2 - time) * 6 * value1.r + (3 * t2 - 4 * time + 1) * tangent1.r + (-t2 + time) * 6 * value2.r + (3 * t2 - 2 * time) * tangent2.r;\r\n result.g = (t2 - time) * 6 * value1.g + (3 * t2 - 4 * time + 1) * tangent1.g + (-t2 + time) * 6 * value2.g + (3 * t2 - 2 * time) * tangent2.g;\r\n result.b = (t2 - time) * 6 * value1.b + (3 * t2 - 4 * time + 1) * tangent1.b + (-t2 + time) * 6 * value2.b + (3 * t2 - 2 * time) * tangent2.b;\r\n }\r\n\r\n /**\r\n * Returns a Color3 value containing a red color\r\n * @returns a new Color3 object\r\n */\r\n public static Red(): Color3 {\r\n return new Color3(1, 0, 0);\r\n }\r\n /**\r\n * Returns a Color3 value containing a green color\r\n * @returns a new Color3 object\r\n */\r\n public static Green(): Color3 {\r\n return new Color3(0, 1, 0);\r\n }\r\n /**\r\n * Returns a Color3 value containing a blue color\r\n * @returns a new Color3 object\r\n */\r\n public static Blue(): Color3 {\r\n return new Color3(0, 0, 1);\r\n }\r\n /**\r\n * Returns a Color3 value containing a black color\r\n * @returns a new Color3 object\r\n */\r\n public static Black(): Color3 {\r\n return new Color3(0, 0, 0);\r\n }\r\n\r\n /**\r\n * Gets a Color3 value containing a black color that must not be updated\r\n */\r\n public static get BlackReadOnly(): DeepImmutable {\r\n return Color3._BlackReadOnly;\r\n }\r\n\r\n /**\r\n * Returns a Color3 value containing a white color\r\n * @returns a new Color3 object\r\n */\r\n public static White(): Color3 {\r\n return new Color3(1, 1, 1);\r\n }\r\n /**\r\n * Returns a Color3 value containing a purple color\r\n * @returns a new Color3 object\r\n */\r\n public static Purple(): Color3 {\r\n return new Color3(0.5, 0, 0.5);\r\n }\r\n /**\r\n * Returns a Color3 value containing a magenta color\r\n * @returns a new Color3 object\r\n */\r\n public static Magenta(): Color3 {\r\n return new Color3(1, 0, 1);\r\n }\r\n /**\r\n * Returns a Color3 value containing a yellow color\r\n * @returns a new Color3 object\r\n */\r\n public static Yellow(): Color3 {\r\n return new Color3(1, 1, 0);\r\n }\r\n /**\r\n * Returns a Color3 value containing a gray color\r\n * @returns a new Color3 object\r\n */\r\n public static Gray(): Color3 {\r\n return new Color3(0.5, 0.5, 0.5);\r\n }\r\n /**\r\n * Returns a Color3 value containing a teal color\r\n * @returns a new Color3 object\r\n */\r\n public static Teal(): Color3 {\r\n return new Color3(0, 1.0, 1.0);\r\n }\r\n /**\r\n * Returns a Color3 value containing a random color\r\n * @returns a new Color3 object\r\n */\r\n public static Random(): Color3 {\r\n return new Color3(Math.random(), Math.random(), Math.random());\r\n }\r\n}\r\nObject.defineProperties(Color3.prototype, {\r\n dimension: { value: [3] },\r\n rank: { value: 1 },\r\n});\r\n\r\n/**\r\n * Class used to hold a RBGA color\r\n */\r\nexport class Color4 implements Tensor>, IColor4Like {\r\n /**\r\n * @see Tensor.dimension\r\n */\r\n public declare readonly dimension: [4];\r\n\r\n /**\r\n * @see Tensor.rank\r\n */\r\n public declare readonly rank: 1;\r\n\r\n /**\r\n * Creates a new Color4 object from red, green, blue values, all between 0 and 1\r\n * @param r defines the red component (between 0 and 1, default is 0)\r\n * @param g defines the green component (between 0 and 1, default is 0)\r\n * @param b defines the blue component (between 0 and 1, default is 0)\r\n * @param a defines the alpha component (between 0 and 1, default is 1)\r\n */\r\n constructor(\r\n /**\r\n * Defines the red component (between 0 and 1, default is 0)\r\n */\r\n public r: number = 0,\r\n /**\r\n * Defines the green component (between 0 and 1, default is 0)\r\n */\r\n public g: number = 0,\r\n /**\r\n * Defines the blue component (between 0 and 1, default is 0)\r\n */\r\n public b: number = 0,\r\n /**\r\n * Defines the alpha component (between 0 and 1, default is 1)\r\n */\r\n public a: number = 1\r\n ) {}\r\n\r\n // Operators\r\n\r\n /**\r\n * Creates a new array populated with 4 numeric elements : red, green, blue, alpha values\r\n * @returns the new array\r\n */\r\n public asArray(): Tuple {\r\n return [this.r, this.g, this.b, this.a];\r\n }\r\n\r\n /**\r\n * Stores from the starting index in the given array the Color4 successive values\r\n * @param array defines the array where to store the r,g,b components\r\n * @param index defines an optional index in the target array to define where to start storing values\r\n * @returns the current Color4 object\r\n */\r\n public toArray(array: FloatArray, index: number = 0): this {\r\n array[index] = this.r;\r\n array[index + 1] = this.g;\r\n array[index + 2] = this.b;\r\n array[index + 3] = this.a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Update the current color with values stored in an array from the starting index of the given array\r\n * @param array defines the source array\r\n * @param offset defines an offset in the source array\r\n * @returns the current Color4 object\r\n */\r\n public fromArray(array: DeepImmutable>, offset: number = 0): this {\r\n this.r = array[offset];\r\n this.g = array[offset + 1];\r\n this.b = array[offset + 2];\r\n this.a = array[offset + 3];\r\n return this;\r\n }\r\n\r\n /**\r\n * Determines equality between Color4 objects\r\n * @param otherColor defines the second operand\r\n * @returns true if the rgba values are equal to the given ones\r\n */\r\n public equals(otherColor: DeepImmutable): boolean {\r\n return otherColor && this.r === otherColor.r && this.g === otherColor.g && this.b === otherColor.b && this.a === otherColor.a;\r\n }\r\n\r\n /**\r\n * Creates a new Color4 set with the added values of the current Color4 and of the given one\r\n * @param otherColor defines the second operand\r\n * @returns a new Color4 object\r\n */\r\n public add(otherColor: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.r + otherColor.r, this.g + otherColor.g, this.b + otherColor.b, this.a + otherColor.a);\r\n }\r\n\r\n /**\r\n * Updates the given color \"result\" with the result of the addition of the current Color4 and the given one.\r\n * @param otherColor the color to add\r\n * @param result the color to store the result\r\n * @returns result input\r\n */\r\n public addToRef(otherColor: DeepImmutable, result: T): T {\r\n result.r = this.r + otherColor.r;\r\n result.g = this.g + otherColor.g;\r\n result.b = this.b + otherColor.b;\r\n result.a = this.a + otherColor.a;\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds in place the given Color4 values to the current Color4 object\r\n * @param otherColor defines the second operand\r\n * @returns the current updated Color4 object\r\n */\r\n public addInPlace(otherColor: DeepImmutable): this {\r\n this.r += otherColor.r;\r\n this.g += otherColor.g;\r\n this.b += otherColor.b;\r\n this.a += otherColor.a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds the given coordinates to the current Color4\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @param a defines the a coordinate of the operand\r\n * @returns the current updated Color4\r\n */\r\n public addInPlaceFromFloats(r: number, g: number, b: number, a: number): this {\r\n this.r += r;\r\n this.g += g;\r\n this.b += b;\r\n this.a += a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates a new Color4 set with the subtracted values of the given one from the current Color4\r\n * @param otherColor defines the second operand\r\n * @returns a new Color4 object\r\n */\r\n public subtract(otherColor: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.r - otherColor.r, this.g - otherColor.g, this.b - otherColor.b, this.a - otherColor.a);\r\n }\r\n\r\n /**\r\n * Subtracts the given ones from the current Color4 values and stores the results in \"result\"\r\n * @param otherColor defines the second operand\r\n * @param result defines the Color4 object where to store the result\r\n * @returns the result Color4 object\r\n */\r\n public subtractToRef(otherColor: DeepImmutable, result: T): T {\r\n result.r = this.r - otherColor.r;\r\n result.g = this.g - otherColor.g;\r\n result.b = this.b - otherColor.b;\r\n result.a = this.a - otherColor.a;\r\n return result;\r\n }\r\n\r\n /**\r\n * Subtract in place the given color from the current Color4.\r\n * @param otherColor the color to subtract\r\n * @returns the updated Color4.\r\n */\r\n public subtractInPlace(otherColor: DeepImmutable): this {\r\n this.r -= otherColor.r;\r\n this.g -= otherColor.g;\r\n this.b -= otherColor.b;\r\n this.a -= otherColor.a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Color4 set with the result of the subtraction of the given floats from the current Color4 coordinates.\r\n * @param r value to subtract\r\n * @param g value to subtract\r\n * @param b value to subtract\r\n * @param a value to subtract\r\n * @returns new color containing the result\r\n */\r\n public subtractFromFloats(r: number, g: number, b: number, a: number): this {\r\n return new (this.constructor as Constructor)(this.r - r, this.g - g, this.b - b, this.a - a);\r\n }\r\n\r\n /**\r\n * Sets the given color \"result\" set with the result of the subtraction of the given floats from the current Color4 coordinates.\r\n * @param r value to subtract\r\n * @param g value to subtract\r\n * @param b value to subtract\r\n * @param a value to subtract\r\n * @param result the color to store the result in\r\n * @returns result input\r\n */\r\n public subtractFromFloatsToRef(r: number, g: number, b: number, a: number, result: T): T {\r\n result.r = this.r - r;\r\n result.g = this.g - g;\r\n result.b = this.b - b;\r\n result.a = this.a - a;\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new Color4 with the current Color4 values multiplied by scale\r\n * @param scale defines the scaling factor to apply\r\n * @returns a new Color4 object\r\n */\r\n public scale(scale: number): this {\r\n return new (this.constructor as Constructor)(this.r * scale, this.g * scale, this.b * scale, this.a * scale);\r\n }\r\n\r\n /**\r\n * Multiplies the Color4 values by the float \"scale\"\r\n * @param scale defines the scaling factor to apply\r\n * @returns the current updated Color4\r\n */\r\n public scaleInPlace(scale: number): this {\r\n this.r *= scale;\r\n this.g *= scale;\r\n this.b *= scale;\r\n this.a *= scale;\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiplies the current Color4 values by scale and stores the result in \"result\"\r\n * @param scale defines the scaling factor to apply\r\n * @param result defines the Color4 object where to store the result\r\n * @returns the result Color4\r\n */\r\n public scaleToRef(scale: number, result: T): T {\r\n result.r = this.r * scale;\r\n result.g = this.g * scale;\r\n result.b = this.b * scale;\r\n result.a = this.a * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Scale the current Color4 values by a factor and add the result to a given Color4\r\n * @param scale defines the scale factor\r\n * @param result defines the Color4 object where to store the result\r\n * @returns the result Color4\r\n */\r\n public scaleAndAddToRef(scale: number, result: T): T {\r\n result.r += this.r * scale;\r\n result.g += this.g * scale;\r\n result.b += this.b * scale;\r\n result.a += this.a * scale;\r\n return result;\r\n }\r\n\r\n /**\r\n * Clamps the rgb values by the min and max values and stores the result into \"result\"\r\n * @param min defines minimum clamping value (default is 0)\r\n * @param max defines maximum clamping value (default is 1)\r\n * @param result defines color to store the result into.\r\n * @returns the result Color4\r\n */\r\n public clampToRef(min: number = 0, max: number = 1, result: T): T {\r\n result.r = Clamp(this.r, min, max);\r\n result.g = Clamp(this.g, min, max);\r\n result.b = Clamp(this.b, min, max);\r\n result.a = Clamp(this.a, min, max);\r\n return result;\r\n }\r\n\r\n /**\r\n * Multiply an Color4 value by another and return a new Color4 object\r\n * @param color defines the Color4 value to multiply by\r\n * @returns a new Color4 object\r\n */\r\n public multiply(color: DeepImmutable): this {\r\n return new (this.constructor as Constructor)(this.r * color.r, this.g * color.g, this.b * color.b, this.a * color.a);\r\n }\r\n\r\n /**\r\n * Multiply a Color4 value by another and push the result in a reference value\r\n * @param color defines the Color4 value to multiply by\r\n * @param result defines the Color4 to fill the result in\r\n * @returns the result Color4\r\n */\r\n public multiplyToRef(color: DeepImmutable, result: T): T {\r\n result.r = this.r * color.r;\r\n result.g = this.g * color.g;\r\n result.b = this.b * color.b;\r\n result.a = this.a * color.a;\r\n return result;\r\n }\r\n\r\n /**\r\n * Multiplies in place the current Color4 by the given one.\r\n * @param otherColor color to multiple with\r\n * @returns the updated Color4.\r\n */\r\n public multiplyInPlace(otherColor: DeepImmutable): this {\r\n this.r *= otherColor.r;\r\n this.g *= otherColor.g;\r\n this.b *= otherColor.b;\r\n this.a *= otherColor.a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Color4 set with the multiplication result of the given floats and the current Color4 coordinates.\r\n * @param r value multiply with\r\n * @param g value multiply with\r\n * @param b value multiply with\r\n * @param a value multiply with\r\n * @returns resulting new color\r\n */\r\n public multiplyByFloats(r: number, g: number, b: number, a: number): this {\r\n return new (this.constructor as Constructor)(this.r * r, this.g * g, this.b * b, this.a * a);\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divide(_other: DeepImmutable): this {\r\n throw new ReferenceError(\"Can not divide a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divideToRef(_other: DeepImmutable, _result: T): T {\r\n throw new ReferenceError(\"Can not divide a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public divideInPlace(_other: DeepImmutable): this {\r\n throw new ReferenceError(\"Can not divide a color\");\r\n }\r\n\r\n /**\r\n * Updates the Color4 coordinates with the minimum values between its own and the given color ones\r\n * @param other defines the second operand\r\n * @returns the current updated Color4\r\n */\r\n public minimizeInPlace(other: DeepImmutable): this {\r\n this.r = Math.min(this.r, other.r);\r\n this.g = Math.min(this.g, other.g);\r\n this.b = Math.min(this.b, other.b);\r\n this.a = Math.min(this.a, other.a);\r\n return this;\r\n }\r\n /**\r\n * Updates the Color4 coordinates with the maximum values between its own and the given color ones\r\n * @param other defines the second operand\r\n * @returns the current updated Color4\r\n */\r\n public maximizeInPlace(other: DeepImmutable): this {\r\n this.r = Math.max(this.r, other.r);\r\n this.g = Math.max(this.g, other.g);\r\n this.b = Math.max(this.b, other.b);\r\n this.a = Math.max(this.a, other.a);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Color4 with the minimal coordinate values between its and the given coordinates\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @param a defines the a coordinate of the operand\r\n * @returns the current updated Color4\r\n */\r\n public minimizeInPlaceFromFloats(r: number, g: number, b: number, a: number): this {\r\n this.r = Math.min(r, this.r);\r\n this.g = Math.min(g, this.g);\r\n this.b = Math.min(b, this.b);\r\n this.a = Math.min(a, this.a);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the current Color4 with the maximal coordinate values between its and the given coordinates.\r\n * @param r defines the r coordinate of the operand\r\n * @param g defines the g coordinate of the operand\r\n * @param b defines the b coordinate of the operand\r\n * @param a defines the a coordinate of the operand\r\n * @returns the current updated Color4\r\n */\r\n public maximizeInPlaceFromFloats(r: number, g: number, b: number, a: number): this {\r\n this.r = Math.max(r, this.r);\r\n this.g = Math.max(g, this.g);\r\n this.b = Math.max(b, this.b);\r\n this.a = Math.max(a, this.a);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public floorToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not floor a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public floor(): this {\r\n throw new ReferenceError(\"Can not floor a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public fractToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not fract a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public fract(): this {\r\n throw new ReferenceError(\"Can not fract a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public negate(): this {\r\n throw new ReferenceError(\"Can not negate a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public negateInPlace(): this {\r\n throw new ReferenceError(\"Can not negate a color\");\r\n }\r\n\r\n /**\r\n * @internal\r\n * Do not use\r\n */\r\n public negateToRef(_result: T): T {\r\n throw new ReferenceError(\"Can not negate a color\");\r\n }\r\n\r\n /**\r\n * Boolean : True if the current Color4 coordinates are each beneath the distance \"epsilon\" from the given color ones.\r\n * @param otherColor color to compare against\r\n * @param epsilon (Default: very small number)\r\n * @returns true if they are equal\r\n */\r\n public equalsWithEpsilon(otherColor: DeepImmutable, epsilon: number = Epsilon): boolean {\r\n return (\r\n Scalar.WithinEpsilon(this.r, otherColor.r, epsilon) &&\r\n Scalar.WithinEpsilon(this.g, otherColor.g, epsilon) &&\r\n Scalar.WithinEpsilon(this.b, otherColor.b, epsilon) &&\r\n Scalar.WithinEpsilon(this.a, otherColor.a, epsilon)\r\n );\r\n }\r\n\r\n /**\r\n * Boolean : True if the given floats are strictly equal to the current Color4 coordinates.\r\n * @param x x value to compare against\r\n * @param y y value to compare against\r\n * @param z z value to compare against\r\n * @param w w value to compare against\r\n * @returns true if equal\r\n */\r\n public equalsToFloats(x: number, y: number, z: number, w: number): boolean {\r\n return this.r === x && this.g === y && this.b === z && this.a === w;\r\n }\r\n\r\n /**\r\n * Creates a string with the Color4 current values\r\n * @returns the string representation of the Color4 object\r\n */\r\n public toString(): string {\r\n return \"{R: \" + this.r + \" G:\" + this.g + \" B:\" + this.b + \" A:\" + this.a + \"}\";\r\n }\r\n\r\n /**\r\n * Returns the string \"Color4\"\r\n * @returns \"Color4\"\r\n */\r\n public getClassName(): string {\r\n return \"Color4\";\r\n }\r\n\r\n /**\r\n * Compute the Color4 hash code\r\n * @returns an unique number that can be used to hash Color4 objects\r\n */\r\n public getHashCode(): number {\r\n let hash = (this.r * 255) | 0;\r\n hash = (hash * 397) ^ ((this.g * 255) | 0);\r\n hash = (hash * 397) ^ ((this.b * 255) | 0);\r\n hash = (hash * 397) ^ ((this.a * 255) | 0);\r\n return hash;\r\n }\r\n\r\n /**\r\n * Creates a new Color4 copied from the current one\r\n * @returns a new Color4 object\r\n */\r\n public clone(): this {\r\n const result = new (this.constructor as Constructor)();\r\n return result.copyFrom(this);\r\n }\r\n\r\n /**\r\n * Copies the given Color4 values into the current one\r\n * @param source defines the source Color4 object\r\n * @returns the current updated Color4 object\r\n */\r\n public copyFrom(source: DeepImmutable): this {\r\n this.r = source.r;\r\n this.g = source.g;\r\n this.b = source.b;\r\n this.a = source.a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Copies the given float values into the current one\r\n * @param r defines the red component to read from\r\n * @param g defines the green component to read from\r\n * @param b defines the blue component to read from\r\n * @param a defines the alpha component to read from\r\n * @returns the current updated Color4 object\r\n */\r\n public copyFromFloats(r: number, g: number, b: number, a: number): this {\r\n this.r = r;\r\n this.g = g;\r\n this.b = b;\r\n this.a = a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Copies the given float values into the current one\r\n * @param r defines the red component to read from\r\n * @param g defines the green component to read from\r\n * @param b defines the blue component to read from\r\n * @param a defines the alpha component to read from\r\n * @returns the current updated Color4 object\r\n */\r\n public set(r: number, g: number, b: number, a: number): this {\r\n return this.copyFromFloats(r, g, b, a);\r\n }\r\n\r\n /**\r\n * Copies the given float to the current Vector4 coordinates\r\n * @param v defines the r, g, b, and a coordinates of the operand\r\n * @returns the current updated Vector4\r\n */\r\n public setAll(v: number): this {\r\n this.r = this.g = this.b = this.a = v;\r\n return this;\r\n }\r\n\r\n /**\r\n * Compute the Color4 hexadecimal code as a string\r\n * @param returnAsColor3 defines if the string should only contains RGB values (off by default)\r\n * @returns a string containing the hexadecimal representation of the Color4 object\r\n */\r\n public toHexString(returnAsColor3 = false): string {\r\n const intR = Math.round(this.r * 255);\r\n const intG = Math.round(this.g * 255);\r\n const intB = Math.round(this.b * 255);\r\n\r\n if (returnAsColor3) {\r\n return \"#\" + ToHex(intR) + ToHex(intG) + ToHex(intB);\r\n }\r\n\r\n const intA = Math.round(this.a * 255);\r\n return \"#\" + ToHex(intR) + ToHex(intG) + ToHex(intB) + ToHex(intA);\r\n }\r\n\r\n /**\r\n * Computes a new Color4 converted from the current one to linear space\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns a new Color4 object\r\n */\r\n public toLinearSpace(exact = false): Color4 {\r\n const convertedColor = new Color4();\r\n this.toLinearSpaceToRef(convertedColor, exact);\r\n return convertedColor;\r\n }\r\n\r\n /**\r\n * Converts the Color4 values to linear space and stores the result in \"convertedColor\"\r\n * @param convertedColor defines the Color4 object where to store the linear space version\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns the unmodified Color4\r\n */\r\n public toLinearSpaceToRef(convertedColor: Color4, exact = false): Color4 {\r\n if (exact) {\r\n convertedColor.r = colorChannelToLinearSpaceExact(this.r);\r\n convertedColor.g = colorChannelToLinearSpaceExact(this.g);\r\n convertedColor.b = colorChannelToLinearSpaceExact(this.b);\r\n } else {\r\n convertedColor.r = colorChannelToLinearSpace(this.r);\r\n convertedColor.g = colorChannelToLinearSpace(this.g);\r\n convertedColor.b = colorChannelToLinearSpace(this.b);\r\n }\r\n convertedColor.a = this.a;\r\n return this;\r\n }\r\n\r\n /**\r\n * Computes a new Color4 converted from the current one to gamma space\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns a new Color4 object\r\n */\r\n public toGammaSpace(exact = false): Color4 {\r\n const convertedColor = new Color4();\r\n this.toGammaSpaceToRef(convertedColor, exact);\r\n return convertedColor;\r\n }\r\n\r\n /**\r\n * Converts the Color4 values to gamma space and stores the result in \"convertedColor\"\r\n * @param convertedColor defines the Color4 object where to store the gamma space version\r\n * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)\r\n * @returns the unmodified Color4\r\n */\r\n public toGammaSpaceToRef(convertedColor: Color4, exact = false): Color4 {\r\n if (exact) {\r\n convertedColor.r = colorChannelToGammaSpaceExact(this.r);\r\n convertedColor.g = colorChannelToGammaSpaceExact(this.g);\r\n convertedColor.b = colorChannelToGammaSpaceExact(this.b);\r\n } else {\r\n convertedColor.r = colorChannelToGammaSpace(this.r);\r\n convertedColor.g = colorChannelToGammaSpace(this.g);\r\n convertedColor.b = colorChannelToGammaSpace(this.b);\r\n }\r\n convertedColor.a = this.a;\r\n return this;\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Creates a new Color4 from the string containing valid hexadecimal values.\r\n *\r\n * A valid hex string is either in the format #RRGGBB or #RRGGBBAA.\r\n *\r\n * When a hex string without alpha is passed, the resulting Color4 has\r\n * its alpha value set to 1.0.\r\n *\r\n * An invalid string results in a Color with all its channels set to 0.0,\r\n * i.e. \"transparent black\".\r\n *\r\n * @param hex defines a string containing valid hexadecimal values\r\n * @returns a new Color4 object\r\n */\r\n public static FromHexString(hex: string): Color4 {\r\n if (hex.substring(0, 1) !== \"#\" || (hex.length !== 9 && hex.length !== 7)) {\r\n return new Color4(0.0, 0.0, 0.0, 0.0);\r\n }\r\n\r\n const r = parseInt(hex.substring(1, 3), 16);\r\n const g = parseInt(hex.substring(3, 5), 16);\r\n const b = parseInt(hex.substring(5, 7), 16);\r\n const a = hex.length === 9 ? parseInt(hex.substring(7, 9), 16) : 255;\r\n\r\n return Color4.FromInts(r, g, b, a);\r\n }\r\n\r\n /**\r\n * Creates a new Color4 object set with the linearly interpolated values of \"amount\" between the left Color4 object and the right Color4 object\r\n * @param left defines the start value\r\n * @param right defines the end value\r\n * @param amount defines the gradient factor\r\n * @returns a new Color4 object\r\n */\r\n public static Lerp(left: DeepImmutable, right: DeepImmutable, amount: number): Color4 {\r\n const result = new Color4(0.0, 0.0, 0.0, 0.0);\r\n Color4.LerpToRef(left, right, amount, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * Set the given \"result\" with the linearly interpolated values of \"amount\" between the left Color4 object and the right Color4 object\r\n * @param left defines the start value\r\n * @param right defines the end value\r\n * @param amount defines the gradient factor\r\n * @param result defines the Color4 object where to store data\r\n */\r\n public static LerpToRef(left: DeepImmutable, right: DeepImmutable, amount: number, result: Color4): void {\r\n result.r = left.r + (right.r - left.r) * amount;\r\n result.g = left.g + (right.g - left.g) * amount;\r\n result.b = left.b + (right.b - left.b) * amount;\r\n result.a = left.a + (right.a - left.a) * amount;\r\n }\r\n\r\n /**\r\n * Interpolate between two Color4 using Hermite interpolation\r\n * @param value1 defines first Color4\r\n * @param tangent1 defines the incoming tangent\r\n * @param value2 defines second Color4\r\n * @param tangent2 defines the outgoing tangent\r\n * @param amount defines the target Color4\r\n * @returns the new interpolated Color4\r\n */\r\n public static Hermite(value1: DeepImmutable, tangent1: DeepImmutable, value2: DeepImmutable, tangent2: DeepImmutable, amount: number): Color4 {\r\n const squared = amount * amount;\r\n const cubed = amount * squared;\r\n const part1 = 2.0 * cubed - 3.0 * squared + 1.0;\r\n const part2 = -2.0 * cubed + 3.0 * squared;\r\n const part3 = cubed - 2.0 * squared + amount;\r\n const part4 = cubed - squared;\r\n\r\n const r = value1.r * part1 + value2.r * part2 + tangent1.r * part3 + tangent2.r * part4;\r\n const g = value1.g * part1 + value2.g * part2 + tangent1.g * part3 + tangent2.g * part4;\r\n const b = value1.b * part1 + value2.b * part2 + tangent1.b * part3 + tangent2.b * part4;\r\n const a = value1.a * part1 + value2.a * part2 + tangent1.a * part3 + tangent2.a * part4;\r\n return new Color4(r, g, b, a);\r\n }\r\n\r\n /**\r\n * Returns a new Color4 which is the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @returns 1st derivative\r\n */\r\n public static Hermite1stDerivative(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number\r\n ): Color4 {\r\n const result = new Color4();\r\n\r\n this.Hermite1stDerivativeToRef(value1, tangent1, value2, tangent2, time, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Update a Color4 with the 1st derivative of the Hermite spline defined by the colors \"value1\", \"value2\", \"tangent1\", \"tangent2\".\r\n * @param value1 defines the first control point\r\n * @param tangent1 defines the first tangent\r\n * @param value2 defines the second control point\r\n * @param tangent2 defines the second tangent\r\n * @param time define where the derivative must be done\r\n * @param result define where to store the derivative\r\n */\r\n public static Hermite1stDerivativeToRef(\r\n value1: DeepImmutable,\r\n tangent1: DeepImmutable,\r\n value2: DeepImmutable,\r\n tangent2: DeepImmutable,\r\n time: number,\r\n result: Color4\r\n ) {\r\n const t2 = time * time;\r\n\r\n result.r = (t2 - time) * 6 * value1.r + (3 * t2 - 4 * time + 1) * tangent1.r + (-t2 + time) * 6 * value2.r + (3 * t2 - 2 * time) * tangent2.r;\r\n result.g = (t2 - time) * 6 * value1.g + (3 * t2 - 4 * time + 1) * tangent1.g + (-t2 + time) * 6 * value2.g + (3 * t2 - 2 * time) * tangent2.g;\r\n result.b = (t2 - time) * 6 * value1.b + (3 * t2 - 4 * time + 1) * tangent1.b + (-t2 + time) * 6 * value2.b + (3 * t2 - 2 * time) * tangent2.b;\r\n result.a = (t2 - time) * 6 * value1.a + (3 * t2 - 4 * time + 1) * tangent1.a + (-t2 + time) * 6 * value2.a + (3 * t2 - 2 * time) * tangent2.a;\r\n }\r\n\r\n /**\r\n * Creates a new Color4 from a Color3 and an alpha value\r\n * @param color3 defines the source Color3 to read from\r\n * @param alpha defines the alpha component (1.0 by default)\r\n * @returns a new Color4 object\r\n */\r\n public static FromColor3(color3: DeepImmutable, alpha: number = 1.0): Color4 {\r\n return new Color4(color3.r, color3.g, color3.b, alpha);\r\n }\r\n\r\n /**\r\n * Creates a new Color4 from the starting index element of the given array\r\n * @param array defines the source array to read from\r\n * @param offset defines the offset in the source array\r\n * @returns a new Color4 object\r\n */\r\n public static FromArray(array: DeepImmutable>, offset: number = 0): Color4 {\r\n return new Color4(array[offset], array[offset + 1], array[offset + 2], array[offset + 3]);\r\n }\r\n\r\n /**\r\n * Creates a new Color4 from the starting index element of the given array\r\n * @param array defines the source array to read from\r\n * @param offset defines the offset in the source array\r\n * @param result defines the target Color4 object\r\n */\r\n public static FromArrayToRef(array: DeepImmutable>, offset: number = 0, result: Color4) {\r\n result.r = array[offset];\r\n result.g = array[offset + 1];\r\n result.b = array[offset + 2];\r\n result.a = array[offset + 3];\r\n }\r\n\r\n /**\r\n * Creates a new Color3 from integer values (less than 256)\r\n * @param r defines the red component to read from (value between 0 and 255)\r\n * @param g defines the green component to read from (value between 0 and 255)\r\n * @param b defines the blue component to read from (value between 0 and 255)\r\n * @param a defines the alpha component to read from (value between 0 and 255)\r\n * @returns a new Color3 object\r\n */\r\n public static FromInts(r: number, g: number, b: number, a: number): Color4 {\r\n return new Color4(r / 255.0, g / 255.0, b / 255.0, a / 255.0);\r\n }\r\n\r\n /**\r\n * Check the content of a given array and convert it to an array containing RGBA data\r\n * If the original array was already containing count * 4 values then it is returned directly\r\n * @param colors defines the array to check\r\n * @param count defines the number of RGBA data to expect\r\n * @returns an array containing count * 4 values (RGBA)\r\n */\r\n public static CheckColors4(colors: number[], count: number): number[] {\r\n // Check if color3 was used\r\n if (colors.length === count * 3) {\r\n const colors4 = [];\r\n for (let index = 0; index < colors.length; index += 3) {\r\n const newIndex = (index / 3) * 4;\r\n colors4[newIndex] = colors[index];\r\n colors4[newIndex + 1] = colors[index + 1];\r\n colors4[newIndex + 2] = colors[index + 2];\r\n colors4[newIndex + 3] = 1.0;\r\n }\r\n\r\n return colors4;\r\n }\r\n\r\n return colors;\r\n }\r\n}\r\nObject.defineProperties(Color4.prototype, {\r\n dimension: { value: [4] },\r\n rank: { value: 1 },\r\n});\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class TmpColors {\r\n public static Color3: Color3[] = ArrayTools.BuildArray(3, Color3.Black);\r\n public static Color4: Color4[] = ArrayTools.BuildArray(3, () => new Color4(0, 0, 0, 0));\r\n}\r\n\r\nRegisterClass(\"BABYLON.Color3\", Color3);\r\nRegisterClass(\"BABYLON.Color4\", Color4);\r\n", "import type { FresnelParameters } from \"../Materials/fresnelParameters\";\r\nimport type { ImageProcessingConfiguration } from \"../Materials/imageProcessingConfiguration\";\r\nimport { _WarnImport } from \"./devTools\";\r\nimport type { ColorCurves } from \"../Materials/colorCurves\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport { Tags } from \"./tags\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport { Matrix, Quaternion, Vector2, Vector3 } from \"../Maths/math.vector\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { GetMergedStore } from \"./decorators.functions\";\r\n\r\n/** @internal */\r\nexport interface CopySourceOptions {\r\n /*\r\n * if a texture is used in more than one channel (e.g diffuse and opacity),\r\n * only clone it once and reuse it on the other channels. Default false\r\n */\r\n cloneTexturesOnlyOnce?: boolean;\r\n}\r\n\r\nconst _copySource = function (creationFunction: () => T, source: T, instanciate: boolean, options: CopySourceOptions = {}): T {\r\n const destination = creationFunction();\r\n\r\n // Tags\r\n if (Tags && Tags.HasTags(source)) {\r\n Tags.AddTagsTo(destination, Tags.GetTags(source, true));\r\n }\r\n\r\n const classStore = GetMergedStore(destination);\r\n\r\n // Map from source texture uniqueId to destination texture\r\n const textureMap: Record = {};\r\n\r\n // Properties\r\n for (const property in classStore) {\r\n const propertyDescriptor = classStore[property];\r\n const sourceProperty = (source)[property];\r\n const propertyType = propertyDescriptor.type;\r\n\r\n if (sourceProperty !== undefined && sourceProperty !== null && (property !== \"uniqueId\" || SerializationHelper.AllowLoadingUniqueId)) {\r\n switch (propertyType) {\r\n case 0: // Value\r\n case 6: // Mesh reference\r\n case 11: // Camera reference\r\n (destination)[property] = sourceProperty;\r\n break;\r\n case 1: // Texture\r\n if (options.cloneTexturesOnlyOnce && textureMap[sourceProperty.uniqueId]) {\r\n (destination)[property] = textureMap[sourceProperty.uniqueId];\r\n } else {\r\n (destination)[property] = instanciate || sourceProperty.isRenderTarget ? sourceProperty : sourceProperty.clone();\r\n textureMap[sourceProperty.uniqueId] = (destination)[property];\r\n }\r\n break;\r\n case 2: // Color3\r\n case 3: // FresnelParameters\r\n case 4: // Vector2\r\n case 5: // Vector3\r\n case 7: // Color Curves\r\n case 10: // Quaternion\r\n case 12: // Matrix\r\n (destination)[property] = instanciate ? sourceProperty : sourceProperty.clone();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return destination;\r\n};\r\n\r\n/**\r\n * Class used to help serialization objects\r\n */\r\nexport class SerializationHelper {\r\n /**\r\n * Gets or sets a boolean to indicate if the UniqueId property should be serialized\r\n */\r\n public static AllowLoadingUniqueId = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _ImageProcessingConfigurationParser = (sourceProperty: any): ImageProcessingConfiguration => {\r\n throw _WarnImport(\"ImageProcessingConfiguration\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _FresnelParametersParser = (sourceProperty: any): FresnelParameters => {\r\n throw _WarnImport(\"FresnelParameters\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _ColorCurvesParser = (sourceProperty: any): ColorCurves => {\r\n throw _WarnImport(\"ColorCurves\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _TextureParser = (sourceProperty: any, scene: Scene, rootUrl: string): Nullable => {\r\n throw _WarnImport(\"Texture\");\r\n };\r\n\r\n /**\r\n * Appends the serialized animations from the source animations\r\n * @param source Source containing the animations\r\n * @param destination Target to store the animations\r\n */\r\n public static AppendSerializedAnimations(source: IAnimatable, destination: any): void {\r\n if (source.animations) {\r\n destination.animations = [];\r\n for (let animationIndex = 0; animationIndex < source.animations.length; animationIndex++) {\r\n const animation = source.animations[animationIndex];\r\n\r\n destination.animations.push(animation.serialize());\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Static function used to serialized a specific entity\r\n * @param entity defines the entity to serialize\r\n * @param serializationObject defines the optional target object where serialization data will be stored\r\n * @returns a JSON compatible object representing the serialization of the entity\r\n */\r\n public static Serialize(entity: T, serializationObject?: any): any {\r\n if (!serializationObject) {\r\n serializationObject = {};\r\n }\r\n\r\n // Tags\r\n if (Tags) {\r\n serializationObject.tags = Tags.GetTags(entity);\r\n }\r\n\r\n const serializedProperties = GetMergedStore(entity);\r\n\r\n // Properties\r\n for (const property in serializedProperties) {\r\n const propertyDescriptor = serializedProperties[property];\r\n const targetPropertyName = propertyDescriptor.sourceName || property;\r\n const propertyType = propertyDescriptor.type;\r\n const sourceProperty = (entity)[property];\r\n\r\n if (sourceProperty !== undefined && sourceProperty !== null && (property !== \"uniqueId\" || SerializationHelper.AllowLoadingUniqueId)) {\r\n switch (propertyType) {\r\n case 0: // Value\r\n serializationObject[targetPropertyName] = sourceProperty;\r\n break;\r\n case 1: // Texture\r\n serializationObject[targetPropertyName] = sourceProperty.serialize();\r\n break;\r\n case 2: // Color3\r\n serializationObject[targetPropertyName] = sourceProperty.asArray();\r\n break;\r\n case 3: // FresnelParameters\r\n serializationObject[targetPropertyName] = sourceProperty.serialize();\r\n break;\r\n case 4: // Vector2\r\n serializationObject[targetPropertyName] = sourceProperty.asArray();\r\n break;\r\n case 5: // Vector3\r\n serializationObject[targetPropertyName] = sourceProperty.asArray();\r\n break;\r\n case 6: // Mesh reference\r\n serializationObject[targetPropertyName] = sourceProperty.id;\r\n break;\r\n case 7: // Color Curves\r\n serializationObject[targetPropertyName] = sourceProperty.serialize();\r\n break;\r\n case 8: // Color 4\r\n serializationObject[targetPropertyName] = (sourceProperty).asArray();\r\n break;\r\n case 9: // Image Processing\r\n serializationObject[targetPropertyName] = (sourceProperty).serialize();\r\n break;\r\n case 10: // Quaternion\r\n serializationObject[targetPropertyName] = (sourceProperty).asArray();\r\n break;\r\n case 11: // Camera reference\r\n serializationObject[targetPropertyName] = (sourceProperty).id;\r\n break;\r\n case 12: // Matrix\r\n serializationObject[targetPropertyName] = (sourceProperty).asArray();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Given a source json and a destination object in a scene, this function will parse the source and will try to apply its content to the destination object\r\n * @param source the source json data\r\n * @param destination the destination object\r\n * @param scene the scene where the object is\r\n * @param rootUrl root url to use to load assets\r\n */\r\n public static ParseProperties(source: any, destination: any, scene: Nullable, rootUrl: Nullable) {\r\n if (!rootUrl) {\r\n rootUrl = \"\";\r\n }\r\n\r\n const classStore = GetMergedStore(destination);\r\n\r\n // Properties\r\n for (const property in classStore) {\r\n const propertyDescriptor = classStore[property];\r\n const sourceProperty = source[propertyDescriptor.sourceName || property];\r\n const propertyType = propertyDescriptor.type;\r\n\r\n if (sourceProperty !== undefined && sourceProperty !== null && (property !== \"uniqueId\" || SerializationHelper.AllowLoadingUniqueId)) {\r\n const dest = destination;\r\n switch (propertyType) {\r\n case 0: // Value\r\n dest[property] = sourceProperty;\r\n break;\r\n case 1: // Texture\r\n if (scene) {\r\n dest[property] = SerializationHelper._TextureParser(sourceProperty, scene, rootUrl);\r\n }\r\n break;\r\n case 2: // Color3\r\n dest[property] = Color3.FromArray(sourceProperty);\r\n break;\r\n case 3: // FresnelParameters\r\n dest[property] = SerializationHelper._FresnelParametersParser(sourceProperty);\r\n break;\r\n case 4: // Vector2\r\n dest[property] = Vector2.FromArray(sourceProperty);\r\n break;\r\n case 5: // Vector3\r\n dest[property] = Vector3.FromArray(sourceProperty);\r\n break;\r\n case 6: // Mesh reference\r\n if (scene) {\r\n dest[property] = scene.getLastMeshById(sourceProperty);\r\n }\r\n break;\r\n case 7: // Color Curves\r\n dest[property] = SerializationHelper._ColorCurvesParser(sourceProperty);\r\n break;\r\n case 8: // Color 4\r\n dest[property] = Color4.FromArray(sourceProperty);\r\n break;\r\n case 9: // Image Processing\r\n dest[property] = SerializationHelper._ImageProcessingConfigurationParser(sourceProperty);\r\n break;\r\n case 10: // Quaternion\r\n dest[property] = Quaternion.FromArray(sourceProperty);\r\n break;\r\n case 11: // Camera reference\r\n if (scene) {\r\n dest[property] = scene.getCameraById(sourceProperty);\r\n }\r\n break;\r\n case 12: // Matrix\r\n dest[property] = Matrix.FromArray(sourceProperty);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new entity from a serialization data object\r\n * @param creationFunction defines a function used to instanciated the new entity\r\n * @param source defines the source serialization data\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root url for resources\r\n * @returns a new entity\r\n */\r\n public static Parse(creationFunction: () => T, source: any, scene: Nullable, rootUrl: Nullable = null): T {\r\n const destination = creationFunction();\r\n\r\n // Tags\r\n if (Tags) {\r\n Tags.AddTagsTo(destination, source.tags);\r\n }\r\n\r\n SerializationHelper.ParseProperties(source, destination, scene, rootUrl);\r\n\r\n return destination;\r\n }\r\n\r\n /**\r\n * Clones an object\r\n * @param creationFunction defines the function used to instanciate the new object\r\n * @param source defines the source object\r\n * @param options defines the options to use\r\n * @returns the cloned object\r\n */\r\n public static Clone(creationFunction: () => T, source: T, options: CopySourceOptions = {}): T {\r\n return _copySource(creationFunction, source, false, options);\r\n }\r\n\r\n /**\r\n * Instanciates a new object based on a source one (some data will be shared between both object)\r\n * @param creationFunction defines the function used to instanciate the new object\r\n * @param source defines the source object\r\n * @returns the new object\r\n */\r\n public static Instanciate(creationFunction: () => T, source: T): T {\r\n return _copySource(creationFunction, source, true);\r\n }\r\n}\r\n", "/**\r\n * Interface for the size containing width and height\r\n */\r\nexport interface ISize {\r\n /**\r\n * Width\r\n */\r\n width: number;\r\n /**\r\n * Height\r\n */\r\n height: number;\r\n}\r\n\r\n/**\r\n * Size containing width and height\r\n */\r\nexport class Size implements ISize {\r\n /**\r\n * Width\r\n */\r\n public width: number;\r\n /**\r\n * Height\r\n */\r\n public height: number;\r\n\r\n /**\r\n * Creates a Size object from the given width and height (floats).\r\n * @param width width of the new size\r\n * @param height height of the new size\r\n */\r\n public constructor(width: number, height: number) {\r\n this.width = width;\r\n this.height = height;\r\n }\r\n\r\n /**\r\n * Returns a string with the Size width and height\r\n * @returns a string with the Size width and height\r\n */\r\n public toString(): string {\r\n return `{W: ${this.width}, H: ${this.height}}`;\r\n }\r\n /**\r\n * \"Size\"\r\n * @returns the string \"Size\"\r\n */\r\n public getClassName(): string {\r\n return \"Size\";\r\n }\r\n /**\r\n * Returns the Size hash code.\r\n * @returns a hash code for a unique width and height\r\n */\r\n public getHashCode(): number {\r\n let hash = this.width | 0;\r\n hash = (hash * 397) ^ (this.height | 0);\r\n return hash;\r\n }\r\n /**\r\n * Updates the current size from the given one.\r\n * @param src the given size\r\n */\r\n public copyFrom(src: Size) {\r\n this.width = src.width;\r\n this.height = src.height;\r\n }\r\n /**\r\n * Updates in place the current Size from the given floats.\r\n * @param width width of the new size\r\n * @param height height of the new size\r\n * @returns the updated Size.\r\n */\r\n public copyFromFloats(width: number, height: number): Size {\r\n this.width = width;\r\n this.height = height;\r\n return this;\r\n }\r\n /**\r\n * Updates in place the current Size from the given floats.\r\n * @param width width to set\r\n * @param height height to set\r\n * @returns the updated Size.\r\n */\r\n public set(width: number, height: number): Size {\r\n return this.copyFromFloats(width, height);\r\n }\r\n /**\r\n * Multiplies the width and height by numbers\r\n * @param w factor to multiple the width by\r\n * @param h factor to multiple the height by\r\n * @returns a new Size set with the multiplication result of the current Size and the given floats.\r\n */\r\n public multiplyByFloats(w: number, h: number): Size {\r\n return new Size(this.width * w, this.height * h);\r\n }\r\n /**\r\n * Clones the size\r\n * @returns a new Size copied from the given one.\r\n */\r\n public clone(): Size {\r\n return new Size(this.width, this.height);\r\n }\r\n /**\r\n * True if the current Size and the given one width and height are strictly equal.\r\n * @param other the other size to compare against\r\n * @returns True if the current Size and the given one width and height are strictly equal.\r\n */\r\n public equals(other: Size): boolean {\r\n if (!other) {\r\n return false;\r\n }\r\n return this.width === other.width && this.height === other.height;\r\n }\r\n /**\r\n * The surface of the Size : width * height (float).\r\n */\r\n public get surface(): number {\r\n return this.width * this.height;\r\n }\r\n /**\r\n * Create a new size of zero\r\n * @returns a new Size set to (0.0, 0.0)\r\n */\r\n public static Zero(): Size {\r\n return new Size(0.0, 0.0);\r\n }\r\n /**\r\n * Sums the width and height of two sizes\r\n * @param otherSize size to add to this size\r\n * @returns a new Size set as the addition result of the current Size and the given one.\r\n */\r\n public add(otherSize: Size): Size {\r\n const r = new Size(this.width + otherSize.width, this.height + otherSize.height);\r\n return r;\r\n }\r\n /**\r\n * Subtracts the width and height of two\r\n * @param otherSize size to subtract to this size\r\n * @returns a new Size set as the subtraction result of the given one from the current Size.\r\n */\r\n public subtract(otherSize: Size): Size {\r\n const r = new Size(this.width - otherSize.width, this.height - otherSize.height);\r\n return r;\r\n }\r\n /**\r\n * Scales the width and height\r\n * @param scale the scale to multiply the width and height by\r\n * @returns a new Size set with the multiplication result of the current Size and the given floats.\r\n */\r\n public scale(scale: number): Size {\r\n return new Size(this.width * scale, this.height * scale);\r\n }\r\n /**\r\n * Creates a new Size set at the linear interpolation \"amount\" between \"start\" and \"end\"\r\n * @param start starting size to lerp between\r\n * @param end end size to lerp between\r\n * @param amount amount to lerp between the start and end values\r\n * @returns a new Size set at the linear interpolation \"amount\" between \"start\" and \"end\"\r\n */\r\n public static Lerp(start: Size, end: Size, amount: number): Size {\r\n const w = start.width + (end.width - start.width) * amount;\r\n const h = start.height + (end.height - start.height) * amount;\r\n\r\n return new Size(w, h);\r\n }\r\n}\r\n", "import type { Nullable } from \"../../types\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport { Constants } from \"../../Engines/constants\";\r\n\r\nimport type { ISize } from \"../../Maths/math.size\";\r\nimport { Size } from \"../../Maths/math.size\";\r\n\r\nimport type { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\n\r\n/**\r\n * Base class of all the textures in babylon.\r\n * It groups all the common properties required to work with Thin Engine.\r\n */\r\nexport class ThinTexture {\r\n protected _wrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n public get wrapU() {\r\n return this._wrapU;\r\n }\r\n\r\n public set wrapU(value: number) {\r\n this._wrapU = value;\r\n }\r\n\r\n protected _wrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n public get wrapV() {\r\n return this._wrapV;\r\n }\r\n\r\n public set wrapV(value: number) {\r\n this._wrapV = value;\r\n }\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n public wrapR = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n\r\n /**\r\n * With compliant hardware and browser (supporting anisotropic filtering)\r\n * this defines the level of anisotropic filtering in the texture.\r\n * The higher the better but the slower. This defaults to 4 as it seems to be the best tradeoff.\r\n */\r\n public anisotropicFilteringLevel = 4;\r\n\r\n /**\r\n * Define the current state of the loading sequence when in delayed load mode.\r\n */\r\n public delayLoadState = Constants.DELAYLOADSTATE_NONE;\r\n\r\n /**\r\n * How a texture is mapped.\r\n * Unused in thin texture mode.\r\n */\r\n public get coordinatesMode(): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Define if the texture is a cube texture or if false a 2d texture.\r\n */\r\n public get isCube(): boolean {\r\n if (!this._texture) {\r\n return false;\r\n }\r\n\r\n return this._texture.isCube;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected set isCube(value: boolean) {\r\n if (!this._texture) {\r\n return;\r\n }\r\n\r\n this._texture.isCube = value;\r\n }\r\n\r\n /**\r\n * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture.\r\n */\r\n public get is3D(): boolean {\r\n if (!this._texture) {\r\n return false;\r\n }\r\n\r\n return this._texture.is3D;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected set is3D(value: boolean) {\r\n if (!this._texture) {\r\n return;\r\n }\r\n\r\n this._texture.is3D = value;\r\n }\r\n\r\n /**\r\n * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture.\r\n */\r\n public get is2DArray(): boolean {\r\n if (!this._texture) {\r\n return false;\r\n }\r\n\r\n return this._texture.is2DArray;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected set is2DArray(value: boolean) {\r\n if (!this._texture) {\r\n return;\r\n }\r\n\r\n this._texture.is2DArray = value;\r\n }\r\n\r\n /**\r\n * Get the class name of the texture.\r\n * @returns \"ThinTexture\"\r\n */\r\n public getClassName(): string {\r\n return \"ThinTexture\";\r\n }\r\n\r\n /** @internal */\r\n public _texture: Nullable = null;\r\n\r\n protected _engine: Nullable = null;\r\n\r\n private _cachedSize: ISize = Size.Zero();\r\n private _cachedBaseSize: ISize = Size.Zero();\r\n\r\n private static _IsRenderTargetWrapper(texture: Nullable | Nullable): texture is RenderTargetWrapper {\r\n return (texture as RenderTargetWrapper)?._shareDepth !== undefined;\r\n }\r\n\r\n /**\r\n * Instantiates a new ThinTexture.\r\n * Base class of all the textures in babylon.\r\n * This can be used as an internal texture wrapper in ThinEngine to benefit from the cache\r\n * @param internalTexture Define the internalTexture to wrap. You can also pass a RenderTargetWrapper, in which case the texture will be the render target's texture\r\n */\r\n constructor(internalTexture: Nullable) {\r\n this._texture = ThinTexture._IsRenderTargetWrapper(internalTexture) ? internalTexture.texture : internalTexture;\r\n if (this._texture) {\r\n this._engine = this._texture.getEngine();\r\n }\r\n }\r\n\r\n /**\r\n * Get if the texture is ready to be used (downloaded, converted, mip mapped...).\r\n * @returns true if fully ready\r\n */\r\n public isReady(): boolean {\r\n if (this.delayLoadState === Constants.DELAYLOADSTATE_NOTLOADED) {\r\n this.delayLoad();\r\n return false;\r\n }\r\n\r\n if (this._texture) {\r\n return this._texture.isReady;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Triggers the load sequence in delayed load mode.\r\n */\r\n public delayLoad(): void {}\r\n\r\n /**\r\n * Get the underlying lower level texture from Babylon.\r\n * @returns the internal texture\r\n */\r\n public getInternalTexture(): Nullable {\r\n return this._texture;\r\n }\r\n\r\n /**\r\n * Get the size of the texture.\r\n * @returns the texture size.\r\n */\r\n public getSize(): ISize {\r\n if (this._texture) {\r\n if (this._texture.width) {\r\n this._cachedSize.width = this._texture.width;\r\n this._cachedSize.height = this._texture.height;\r\n return this._cachedSize;\r\n }\r\n\r\n if (this._texture._size) {\r\n this._cachedSize.width = this._texture._size;\r\n this._cachedSize.height = this._texture._size;\r\n return this._cachedSize;\r\n }\r\n }\r\n\r\n return this._cachedSize;\r\n }\r\n\r\n /**\r\n * Get the base size of the texture.\r\n * It can be different from the size if the texture has been resized for POT for instance\r\n * @returns the base size\r\n */\r\n public getBaseSize(): ISize {\r\n if (!this.isReady() || !this._texture) {\r\n this._cachedBaseSize.width = 0;\r\n this._cachedBaseSize.height = 0;\r\n return this._cachedBaseSize;\r\n }\r\n\r\n if (this._texture._size) {\r\n this._cachedBaseSize.width = this._texture._size;\r\n this._cachedBaseSize.height = this._texture._size;\r\n return this._cachedBaseSize;\r\n }\r\n\r\n this._cachedBaseSize.width = this._texture.baseWidth;\r\n this._cachedBaseSize.height = this._texture.baseHeight;\r\n return this._cachedBaseSize;\r\n }\r\n\r\n /** @internal */\r\n protected _initialSamplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n\r\n /**\r\n * Get the current sampling mode associated with the texture.\r\n */\r\n public get samplingMode(): number {\r\n if (!this._texture) {\r\n return this._initialSamplingMode;\r\n }\r\n\r\n return this._texture.samplingMode;\r\n }\r\n\r\n /**\r\n * Update the sampling mode of the texture.\r\n * Default is Trilinear mode.\r\n *\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 1 | NEAREST_SAMPLINGMODE or NEAREST_NEAREST_MIPLINEAR | Nearest is: mag = nearest, min = nearest, mip = linear |\r\n * | 2 | BILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPNEAREST | Bilinear is: mag = linear, min = linear, mip = nearest |\r\n * | 3 | TRILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPLINEAR | Trilinear is: mag = linear, min = linear, mip = linear |\r\n * | 4 | NEAREST_NEAREST_MIPNEAREST | |\r\n * | 5 | NEAREST_LINEAR_MIPNEAREST | |\r\n * | 6 | NEAREST_LINEAR_MIPLINEAR | |\r\n * | 7 | NEAREST_LINEAR | |\r\n * | 8 | NEAREST_NEAREST | |\r\n * | 9 | LINEAR_NEAREST_MIPNEAREST | |\r\n * | 10 | LINEAR_NEAREST_MIPLINEAR | |\r\n * | 11 | LINEAR_LINEAR | |\r\n * | 12 | LINEAR_NEAREST | |\r\n *\r\n * > _mag_: magnification filter (close to the viewer)\r\n * > _min_: minification filter (far from the viewer)\r\n * > _mip_: filter used between mip map levels\r\n *@param samplingMode Define the new sampling mode of the texture\r\n */\r\n public updateSamplingMode(samplingMode: number): void {\r\n if (this._texture && this._engine) {\r\n this._engine.updateTextureSamplingMode(samplingMode, this._texture);\r\n }\r\n }\r\n\r\n /**\r\n * Release and destroy the underlying lower level texture aka internalTexture.\r\n */\r\n public releaseInternalTexture(): void {\r\n if (this._texture) {\r\n this._texture.dispose();\r\n this._texture = null;\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public dispose(): void {\r\n if (this._texture) {\r\n this.releaseInternalTexture();\r\n this._engine = null;\r\n }\r\n }\r\n}\r\n", "\n/******************************************************************************\nCopyright (c) Microsoft Corporation.\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n", "import { serialize, serializeAsTexture } from \"../../Misc/decorators\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix } from \"../../Maths/math.vector\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { IAnimatable } from \"../../Animations/animatable.interface\";\r\nimport { RandomGUID } from \"../../Misc/guid\";\r\n\r\nimport \"../../Misc/fileTools\";\r\nimport type { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { ThinTexture } from \"./thinTexture\";\r\nimport type { AbstractScene } from \"../../abstractScene\";\r\n\r\nimport type { Animation } from \"../../Animations/animation\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\n\r\n/**\r\n * Base class of all the textures in babylon.\r\n * It groups all the common properties the materials, post process, lights... might need\r\n * in order to make a correct use of the texture.\r\n */\r\nexport class BaseTexture extends ThinTexture implements IAnimatable {\r\n /**\r\n * Default anisotropic filtering level for the application.\r\n * It is set to 4 as a good tradeoff between perf and quality.\r\n */\r\n public static DEFAULT_ANISOTROPIC_FILTERING_LEVEL = 4;\r\n\r\n /**\r\n * Gets or sets the unique id of the texture\r\n */\r\n @serialize()\r\n public uniqueId: number;\r\n\r\n /**\r\n * Define the name of the texture.\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information.\r\n */\r\n @serialize()\r\n public metadata: any = null;\r\n\r\n /** @internal */\r\n public _internalMetadata: any;\r\n\r\n /**\r\n * For internal use only. Please do not use.\r\n */\r\n public reservedDataStore: any = null;\r\n\r\n @serialize(\"hasAlpha\")\r\n private _hasAlpha = false;\r\n /**\r\n * Define if the texture is having a usable alpha value (can be use for transparency or glossiness for instance).\r\n */\r\n public set hasAlpha(value: boolean) {\r\n if (this._hasAlpha === value) {\r\n return;\r\n }\r\n this._hasAlpha = value;\r\n if (this._scene) {\r\n this._scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n }\r\n public get hasAlpha(): boolean {\r\n return this._hasAlpha;\r\n }\r\n\r\n @serialize(\"getAlphaFromRGB\")\r\n private _getAlphaFromRGB = false;\r\n /**\r\n * Defines if the alpha value should be determined via the rgb values.\r\n * If true the luminance of the pixel might be used to find the corresponding alpha value.\r\n */\r\n public set getAlphaFromRGB(value: boolean) {\r\n if (this._getAlphaFromRGB === value) {\r\n return;\r\n }\r\n this._getAlphaFromRGB = value;\r\n if (this._scene) {\r\n this._scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n }\r\n public get getAlphaFromRGB(): boolean {\r\n return this._getAlphaFromRGB;\r\n }\r\n\r\n /**\r\n * Intensity or strength of the texture.\r\n * It is commonly used by materials to fine tune the intensity of the texture\r\n */\r\n @serialize()\r\n public level = 1;\r\n\r\n @serialize(\"coordinatesIndex\")\r\n protected _coordinatesIndex = 0;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the texture should try to reduce shader code if there is no UV manipulation.\r\n * (ie. when texture.getTextureMatrix().isIdentityAs3x2() returns true)\r\n */\r\n @serialize()\r\n public optimizeUVAllocation = true;\r\n\r\n /**\r\n * Define the UV channel to use starting from 0 and defaulting to 0.\r\n * This is part of the texture as textures usually maps to one uv set.\r\n */\r\n public set coordinatesIndex(value: number) {\r\n if (this._coordinatesIndex === value) {\r\n return;\r\n }\r\n this._coordinatesIndex = value;\r\n if (this._scene) {\r\n this._scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n }\r\n public get coordinatesIndex(): number {\r\n return this._coordinatesIndex;\r\n }\r\n\r\n @serialize(\"coordinatesMode\")\r\n protected _coordinatesMode = Constants.TEXTURE_EXPLICIT_MODE;\r\n\r\n /**\r\n * How a texture is mapped.\r\n *\r\n * | Value | Type | Description |\r\n * | ----- | ----------------------------------- | ----------- |\r\n * | 0 | EXPLICIT_MODE | |\r\n * | 1 | SPHERICAL_MODE | |\r\n * | 2 | PLANAR_MODE | |\r\n * | 3 | CUBIC_MODE | |\r\n * | 4 | PROJECTION_MODE | |\r\n * | 5 | SKYBOX_MODE | |\r\n * | 6 | INVCUBIC_MODE | |\r\n * | 7 | EQUIRECTANGULAR_MODE | |\r\n * | 8 | FIXED_EQUIRECTANGULAR_MODE | |\r\n * | 9 | FIXED_EQUIRECTANGULAR_MIRRORED_MODE | |\r\n */\r\n public set coordinatesMode(value: number) {\r\n if (this._coordinatesMode === value) {\r\n return;\r\n }\r\n this._coordinatesMode = value;\r\n if (this._scene) {\r\n this._scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n }\r\n public get coordinatesMode(): number {\r\n return this._coordinatesMode;\r\n }\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n @serialize()\r\n public get wrapU() {\r\n return this._wrapU;\r\n }\r\n public set wrapU(value: number) {\r\n this._wrapU = value;\r\n }\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n @serialize()\r\n public get wrapV() {\r\n return this._wrapV;\r\n }\r\n public set wrapV(value: number) {\r\n this._wrapV = value;\r\n }\r\n\r\n /**\r\n * | Value | Type | Description |\r\n * | ----- | ------------------ | ----------- |\r\n * | 0 | CLAMP_ADDRESSMODE | |\r\n * | 1 | WRAP_ADDRESSMODE | |\r\n * | 2 | MIRROR_ADDRESSMODE | |\r\n */\r\n @serialize()\r\n public wrapR = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n\r\n /**\r\n * With compliant hardware and browser (supporting anisotropic filtering)\r\n * this defines the level of anisotropic filtering in the texture.\r\n * The higher the better but the slower. This defaults to 4 as it seems to be the best tradeoff.\r\n */\r\n @serialize()\r\n public anisotropicFilteringLevel = BaseTexture.DEFAULT_ANISOTROPIC_FILTERING_LEVEL;\r\n\r\n /** @internal */\r\n public _isCube = false;\r\n /**\r\n * Define if the texture is a cube texture or if false a 2d texture.\r\n */\r\n @serialize()\r\n public get isCube(): boolean {\r\n if (!this._texture) {\r\n return this._isCube;\r\n }\r\n\r\n return this._texture.isCube;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected set isCube(value: boolean) {\r\n if (!this._texture) {\r\n this._isCube = value;\r\n } else {\r\n this._texture.isCube = value;\r\n }\r\n }\r\n\r\n /**\r\n * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture.\r\n */\r\n @serialize()\r\n public get is3D(): boolean {\r\n if (!this._texture) {\r\n return false;\r\n }\r\n\r\n return this._texture.is3D;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected set is3D(value: boolean) {\r\n if (!this._texture) {\r\n return;\r\n }\r\n\r\n this._texture.is3D = value;\r\n }\r\n\r\n /**\r\n * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture.\r\n */\r\n @serialize()\r\n public get is2DArray(): boolean {\r\n if (!this._texture) {\r\n return false;\r\n }\r\n\r\n return this._texture.is2DArray;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected set is2DArray(value: boolean) {\r\n if (!this._texture) {\r\n return;\r\n }\r\n\r\n this._texture.is2DArray = value;\r\n }\r\n\r\n /** @internal */\r\n protected _gammaSpace = true;\r\n /**\r\n * Define if the texture contains data in gamma space (most of the png/jpg aside bump).\r\n * HDR texture are usually stored in linear space.\r\n * This only impacts the PBR and Background materials\r\n */\r\n @serialize()\r\n public get gammaSpace(): boolean {\r\n if (!this._texture) {\r\n return this._gammaSpace;\r\n } else {\r\n if (this._texture._gammaSpace === null) {\r\n this._texture._gammaSpace = this._gammaSpace;\r\n }\r\n }\r\n\r\n return this._texture._gammaSpace && !this._texture._useSRGBBuffer;\r\n }\r\n\r\n public set gammaSpace(gamma: boolean) {\r\n if (!this._texture) {\r\n if (this._gammaSpace === gamma) {\r\n return;\r\n }\r\n\r\n this._gammaSpace = gamma;\r\n } else {\r\n if (this._texture._gammaSpace === gamma) {\r\n return;\r\n }\r\n this._texture._gammaSpace = gamma;\r\n }\r\n\r\n this.getScene()?.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n\r\n /**\r\n * Gets or sets whether or not the texture contains RGBD data.\r\n */\r\n public get isRGBD(): boolean {\r\n return this._texture != null && this._texture._isRGBD;\r\n }\r\n public set isRGBD(value: boolean) {\r\n if (value === this.isRGBD) {\r\n return;\r\n }\r\n\r\n if (this._texture) {\r\n this._texture._isRGBD = value;\r\n }\r\n\r\n this.getScene()?.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n\r\n /**\r\n * Is Z inverted in the texture (useful in a cube texture).\r\n */\r\n @serialize()\r\n public invertZ = false;\r\n\r\n /**\r\n * Are mip maps generated for this texture or not.\r\n */\r\n public get noMipmap(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n @serialize()\r\n public lodLevelInAlpha = false;\r\n\r\n /**\r\n * With prefiltered texture, defined the offset used during the prefiltering steps.\r\n */\r\n @serialize()\r\n public get lodGenerationOffset(): number {\r\n if (this._texture) {\r\n return this._texture._lodGenerationOffset;\r\n }\r\n\r\n return 0.0;\r\n }\r\n public set lodGenerationOffset(value: number) {\r\n if (this._texture) {\r\n this._texture._lodGenerationOffset = value;\r\n }\r\n }\r\n\r\n /**\r\n * With prefiltered texture, defined the scale used during the prefiltering steps.\r\n */\r\n @serialize()\r\n public get lodGenerationScale(): number {\r\n if (this._texture) {\r\n return this._texture._lodGenerationScale;\r\n }\r\n\r\n return 0.0;\r\n }\r\n public set lodGenerationScale(value: number) {\r\n if (this._texture) {\r\n this._texture._lodGenerationScale = value;\r\n }\r\n }\r\n\r\n /**\r\n * With prefiltered texture, defined if the specular generation is based on a linear ramp.\r\n * By default we are using a log2 of the linear roughness helping to keep a better resolution for\r\n * average roughness values.\r\n */\r\n @serialize()\r\n public get linearSpecularLOD(): boolean {\r\n if (this._texture) {\r\n return this._texture._linearSpecularLOD;\r\n }\r\n\r\n return false;\r\n }\r\n public set linearSpecularLOD(value: boolean) {\r\n if (this._texture) {\r\n this._texture._linearSpecularLOD = value;\r\n }\r\n }\r\n\r\n /**\r\n * In case a better definition than spherical harmonics is required for the diffuse part of the environment.\r\n * You can set the irradiance texture to rely on a texture instead of the spherical approach.\r\n * This texture need to have the same characteristics than its parent (Cube vs 2d, coordinates mode, Gamma/Linear, RGBD).\r\n */\r\n @serializeAsTexture()\r\n public get irradianceTexture(): Nullable {\r\n if (this._texture) {\r\n return this._texture._irradianceTexture;\r\n }\r\n\r\n return null;\r\n }\r\n public set irradianceTexture(value: Nullable) {\r\n if (this._texture) {\r\n this._texture._irradianceTexture = value;\r\n }\r\n }\r\n\r\n /**\r\n * Define if the texture is a render target.\r\n */\r\n @serialize()\r\n public isRenderTarget = false;\r\n\r\n /**\r\n * Define the unique id of the texture in the scene.\r\n */\r\n public get uid(): string {\r\n if (!this._uid) {\r\n this._uid = RandomGUID();\r\n }\r\n return this._uid;\r\n }\r\n\r\n /** @internal */\r\n public _prefiltered: boolean = false;\r\n /** @internal */\r\n public _forceSerialize: boolean = false;\r\n\r\n /**\r\n * Return a string representation of the texture.\r\n * @returns the texture as a string\r\n */\r\n public toString(): string {\r\n return this.name;\r\n }\r\n\r\n /**\r\n * Get the class name of the texture.\r\n * @returns \"BaseTexture\"\r\n */\r\n public getClassName(): string {\r\n return \"BaseTexture\";\r\n }\r\n\r\n /**\r\n * Define the list of animation attached to the texture.\r\n */\r\n public animations: Animation[] = [];\r\n\r\n /**\r\n * An event triggered when the texture is disposed.\r\n */\r\n public onDisposeObservable = new Observable();\r\n\r\n private _onDisposeObserver: Nullable> = null;\r\n /**\r\n * Callback triggered when the texture has been disposed.\r\n * Kept for back compatibility, you can use the onDisposeObservable instead.\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n protected _scene: Nullable = null;\r\n\r\n /** @internal */\r\n private _uid: Nullable = null;\r\n\r\n /**\r\n * Define if the texture is preventing a material to render or not.\r\n * If not and the texture is not ready, the engine will use a default black texture instead.\r\n */\r\n public get isBlocking(): boolean {\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable = null;\r\n\r\n protected _loadingError: boolean = false;\r\n protected _errorObject?: {\r\n message?: string;\r\n exception?: any;\r\n };\r\n\r\n /**\r\n * Was there any loading error?\r\n */\r\n public get loadingError(): boolean {\r\n return this._loadingError;\r\n }\r\n\r\n /**\r\n * If a loading error occurred this object will be populated with information about the error.\r\n */\r\n public get errorObject():\r\n | {\r\n message?: string;\r\n exception?: any;\r\n }\r\n | undefined {\r\n return this._errorObject;\r\n }\r\n\r\n /**\r\n * Instantiates a new BaseTexture.\r\n * Base class of all the textures in babylon.\r\n * It groups all the common properties the materials, post process, lights... might need\r\n * in order to make a correct use of the texture.\r\n * @param sceneOrEngine Define the scene or engine the texture belongs to\r\n * @param internalTexture Define the internal texture associated with the texture\r\n */\r\n constructor(sceneOrEngine?: Nullable, internalTexture: Nullable = null) {\r\n super(null);\r\n\r\n if (sceneOrEngine) {\r\n if (BaseTexture._IsScene(sceneOrEngine)) {\r\n this._scene = sceneOrEngine;\r\n } else {\r\n this._engine = sceneOrEngine;\r\n }\r\n } else {\r\n this._scene = EngineStore.LastCreatedScene;\r\n }\r\n\r\n if (this._scene) {\r\n this.uniqueId = this._scene.getUniqueId();\r\n this._scene.addTexture(this);\r\n this._engine = this._scene.getEngine();\r\n }\r\n\r\n this._texture = internalTexture;\r\n\r\n this._uid = null;\r\n }\r\n\r\n /**\r\n * Get the scene the texture belongs to.\r\n * @returns the scene or null if undefined\r\n */\r\n public getScene(): Nullable {\r\n return this._scene;\r\n }\r\n\r\n /** @internal */\r\n protected _getEngine(): Nullable {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * Checks if the texture has the same transform matrix than another texture\r\n * @param texture texture to check against\r\n * @returns true if the transforms are the same, else false\r\n */\r\n public checkTransformsAreIdentical(texture: Nullable): boolean {\r\n return texture !== null;\r\n }\r\n\r\n /**\r\n * Get the texture transform matrix used to offset tile the texture for instance.\r\n * @returns the transformation matrix\r\n */\r\n public getTextureMatrix(): Matrix {\r\n return Matrix.IdentityReadOnly;\r\n }\r\n\r\n /**\r\n * Get the texture reflection matrix used to rotate/transform the reflection.\r\n * @returns the reflection matrix\r\n */\r\n public getReflectionTextureMatrix(): Matrix {\r\n return Matrix.IdentityReadOnly;\r\n }\r\n\r\n /**\r\n * Gets a suitable rotate/transform matrix when the texture is used for refraction.\r\n * There's a separate function from getReflectionTextureMatrix because refraction requires a special configuration of the matrix in right-handed mode.\r\n * @returns The refraction matrix\r\n */\r\n public getRefractionTextureMatrix(): Matrix {\r\n return this.getReflectionTextureMatrix();\r\n }\r\n\r\n /**\r\n * Get if the texture is ready to be consumed (either it is ready or it is not blocking)\r\n * @returns true if ready, not blocking or if there was an error loading the texture\r\n */\r\n public isReadyOrNotBlocking(): boolean {\r\n return !this.isBlocking || this.isReady() || this.loadingError;\r\n }\r\n\r\n /**\r\n * Scales the texture if is `canRescale()`\r\n * @param ratio the resize factor we want to use to rescale\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public scale(ratio: number): void {}\r\n\r\n /**\r\n * Get if the texture can rescale.\r\n */\r\n public get canRescale(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getFromCache(url: Nullable, noMipmap: boolean, sampling?: number, invertY?: boolean, useSRGBBuffer?: boolean, isCube?: boolean): Nullable {\r\n const engine = this._getEngine();\r\n if (!engine) {\r\n return null;\r\n }\r\n\r\n const correctedUseSRGBBuffer = engine._getUseSRGBBuffer(!!useSRGBBuffer, noMipmap);\r\n\r\n const texturesCache = engine.getLoadedTexturesCache();\r\n for (let index = 0; index < texturesCache.length; index++) {\r\n const texturesCacheEntry = texturesCache[index];\r\n\r\n if (useSRGBBuffer === undefined || correctedUseSRGBBuffer === texturesCacheEntry._useSRGBBuffer) {\r\n if (invertY === undefined || invertY === texturesCacheEntry.invertY) {\r\n if (texturesCacheEntry.url === url && texturesCacheEntry.generateMipMaps === !noMipmap) {\r\n if (!sampling || sampling === texturesCacheEntry.samplingMode) {\r\n if (isCube === undefined || isCube === texturesCacheEntry.isCube) {\r\n texturesCacheEntry.incrementReferences();\r\n return texturesCacheEntry;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(_fromContextLost = false): void {}\r\n\r\n /**\r\n * Clones the texture.\r\n * @returns the cloned texture\r\n */\r\n public clone(): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Get the texture underlying type (INT, FLOAT...)\r\n */\r\n public get textureType(): number {\r\n if (!this._texture) {\r\n return Constants.TEXTURETYPE_UNSIGNED_INT;\r\n }\r\n\r\n return this._texture.type !== undefined ? this._texture.type : Constants.TEXTURETYPE_UNSIGNED_INT;\r\n }\r\n\r\n /**\r\n * Get the texture underlying format (RGB, RGBA...)\r\n */\r\n public get textureFormat(): number {\r\n if (!this._texture) {\r\n return Constants.TEXTUREFORMAT_RGBA;\r\n }\r\n\r\n return this._texture.format !== undefined ? this._texture.format : Constants.TEXTUREFORMAT_RGBA;\r\n }\r\n\r\n /**\r\n * Indicates that textures need to be re-calculated for all materials\r\n */\r\n protected _markAllSubMeshesAsTexturesDirty() {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Reads the pixels stored in the webgl texture and returns them as an ArrayBuffer.\r\n * This will returns an RGBA array buffer containing either in values (0-255) or\r\n * float values (0-1) depending of the underlying buffer type.\r\n * @param faceIndex defines the face of the texture to read (in case of cube texture)\r\n * @param level defines the LOD level of the texture to read (in case of Mip Maps)\r\n * @param buffer defines a user defined buffer to fill with data (can be null)\r\n * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels\r\n * @param noDataConversion false to convert the data to Uint8Array (if texture type is UNSIGNED_BYTE) or to Float32Array (if texture type is anything but UNSIGNED_BYTE). If true, the type of the generated buffer (if buffer==null) will depend on the type of the texture\r\n * @param x defines the region x coordinates to start reading from (default to 0)\r\n * @param y defines the region y coordinates to start reading from (default to 0)\r\n * @param width defines the region width to read from (default to the texture size at level)\r\n * @param height defines the region width to read from (default to the texture size at level)\r\n * @returns The Array buffer promise containing the pixels data.\r\n */\r\n public readPixels(\r\n faceIndex = 0,\r\n level = 0,\r\n buffer: Nullable = null,\r\n flushRenderer = true,\r\n noDataConversion = false,\r\n x = 0,\r\n y = 0,\r\n width = Number.MAX_VALUE,\r\n height = Number.MAX_VALUE\r\n ): Nullable> {\r\n if (!this._texture) {\r\n return null;\r\n }\r\n\r\n const engine = this._getEngine();\r\n if (!engine) {\r\n return null;\r\n }\r\n\r\n const size = this.getSize();\r\n let maxWidth = size.width;\r\n let maxHeight = size.height;\r\n if (level !== 0) {\r\n maxWidth = maxWidth / Math.pow(2, level);\r\n maxHeight = maxHeight / Math.pow(2, level);\r\n maxWidth = Math.round(maxWidth);\r\n maxHeight = Math.round(maxHeight);\r\n }\r\n\r\n width = Math.min(maxWidth, width);\r\n height = Math.min(maxHeight, height);\r\n\r\n try {\r\n if (this._texture.isCube) {\r\n return engine._readTexturePixels(this._texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion, x, y);\r\n }\r\n\r\n return engine._readTexturePixels(this._texture, width, height, -1, level, buffer, flushRenderer, noDataConversion, x, y);\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _readPixelsSync(faceIndex = 0, level = 0, buffer: Nullable = null, flushRenderer = true, noDataConversion = false): Nullable {\r\n if (!this._texture) {\r\n return null;\r\n }\r\n\r\n const size = this.getSize();\r\n let width = size.width;\r\n let height = size.height;\r\n\r\n const engine = this._getEngine();\r\n if (!engine) {\r\n return null;\r\n }\r\n\r\n if (level != 0) {\r\n width = width / Math.pow(2, level);\r\n height = height / Math.pow(2, level);\r\n\r\n width = Math.round(width);\r\n height = Math.round(height);\r\n }\r\n\r\n try {\r\n if (this._texture.isCube) {\r\n return engine._readTexturePixelsSync(this._texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion);\r\n }\r\n\r\n return engine._readTexturePixelsSync(this._texture, width, height, -1, level, buffer, flushRenderer, noDataConversion);\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public get _lodTextureHigh(): Nullable {\r\n if (this._texture) {\r\n return this._texture._lodTextureHigh;\r\n }\r\n return null;\r\n }\r\n\r\n /** @internal */\r\n public get _lodTextureMid(): Nullable {\r\n if (this._texture) {\r\n return this._texture._lodTextureMid;\r\n }\r\n return null;\r\n }\r\n\r\n /** @internal */\r\n public get _lodTextureLow(): Nullable {\r\n if (this._texture) {\r\n return this._texture._lodTextureLow;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public dispose(): void {\r\n if (this._scene) {\r\n // Animations\r\n if (this._scene.stopAnimation) {\r\n this._scene.stopAnimation(this);\r\n }\r\n\r\n // Remove from scene\r\n this._scene.removePendingData(this);\r\n const index = this._scene.textures.indexOf(this);\r\n\r\n if (index >= 0) {\r\n this._scene.textures.splice(index, 1);\r\n }\r\n this._scene.onTextureRemovedObservable.notifyObservers(this);\r\n this._scene = null;\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.textures.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.textures.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n\r\n this.metadata = null;\r\n\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Serialize the texture into a JSON representation that can be parsed later on.\r\n * @param allowEmptyName True to force serialization even if name is empty. Default: false\r\n * @returns the JSON representation of the texture\r\n */\r\n public serialize(allowEmptyName = false): any {\r\n if (!this.name && !allowEmptyName) {\r\n return null;\r\n }\r\n\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Helper function to be called back once a list of texture contains only ready textures.\r\n * @param textures Define the list of textures to wait for\r\n * @param callback Define the callback triggered once the entire list will be ready\r\n */\r\n public static WhenAllReady(textures: BaseTexture[], callback: () => void): void {\r\n let numRemaining = textures.length;\r\n if (numRemaining === 0) {\r\n callback();\r\n return;\r\n }\r\n\r\n for (let i = 0; i < textures.length; i++) {\r\n const texture = textures[i];\r\n\r\n if (texture.isReady()) {\r\n if (--numRemaining === 0) {\r\n callback();\r\n }\r\n } else {\r\n const onLoadObservable = (texture as any).onLoadObservable as Observable;\r\n\r\n if (onLoadObservable) {\r\n onLoadObservable.addOnce(() => {\r\n if (--numRemaining === 0) {\r\n callback();\r\n }\r\n });\r\n } else {\r\n if (--numRemaining === 0) {\r\n callback();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private static _IsScene(sceneOrEngine: Scene | ThinEngine): sceneOrEngine is Scene {\r\n return sceneOrEngine.getClassName() === \"Scene\";\r\n }\r\n}\r\n", "import type { DeepImmutable } from \"../types\";\r\nimport { Vector3, Matrix } from \"./math.vector\";\r\nimport type { IPlaneLike } from \"./math.like\";\r\n\r\n/**\r\n * Represents a plane by the equation ax + by + cz + d = 0\r\n */\r\nexport class Plane implements IPlaneLike {\r\n private static _TmpMatrix = Matrix.Identity();\r\n\r\n /**\r\n * Normal of the plane (a,b,c)\r\n */\r\n public normal: Vector3;\r\n /**\r\n * d component of the plane\r\n */\r\n public d: number;\r\n /**\r\n * Creates a Plane object according to the given floats a, b, c, d and the plane equation : ax + by + cz + d = 0\r\n * @param a a component of the plane\r\n * @param b b component of the plane\r\n * @param c c component of the plane\r\n * @param d d component of the plane\r\n */\r\n constructor(a: number, b: number, c: number, d: number) {\r\n this.normal = new Vector3(a, b, c);\r\n this.d = d;\r\n }\r\n\r\n /**\r\n * @returns the plane coordinates as a new array of 4 elements [a, b, c, d].\r\n */\r\n public asArray(): number[] {\r\n return [this.normal.x, this.normal.y, this.normal.z, this.d];\r\n }\r\n\r\n // Methods\r\n /**\r\n * @returns a new plane copied from the current Plane.\r\n */\r\n public clone(): Plane {\r\n return new Plane(this.normal.x, this.normal.y, this.normal.z, this.d);\r\n }\r\n /**\r\n * @returns the string \"Plane\".\r\n */\r\n public getClassName(): string {\r\n return \"Plane\";\r\n }\r\n /**\r\n * @returns the Plane hash code.\r\n */\r\n public getHashCode(): number {\r\n let hash = this.normal.getHashCode();\r\n hash = (hash * 397) ^ (this.d | 0);\r\n return hash;\r\n }\r\n /**\r\n * Normalize the current Plane in place.\r\n * @returns the updated Plane.\r\n */\r\n public normalize(): Plane {\r\n const norm = Math.sqrt(this.normal.x * this.normal.x + this.normal.y * this.normal.y + this.normal.z * this.normal.z);\r\n let magnitude = 0.0;\r\n\r\n if (norm !== 0) {\r\n magnitude = 1.0 / norm;\r\n }\r\n this.normal.x *= magnitude;\r\n this.normal.y *= magnitude;\r\n this.normal.z *= magnitude;\r\n this.d *= magnitude;\r\n return this;\r\n }\r\n /**\r\n * Applies a transformation the plane and returns the result\r\n * @param transformation the transformation matrix to be applied to the plane\r\n * @returns a new Plane as the result of the transformation of the current Plane by the given matrix.\r\n */\r\n public transform(transformation: DeepImmutable): Plane {\r\n const invertedMatrix = Plane._TmpMatrix;\r\n transformation.invertToRef(invertedMatrix);\r\n const m = invertedMatrix.m;\r\n const x = this.normal.x;\r\n const y = this.normal.y;\r\n const z = this.normal.z;\r\n const d = this.d;\r\n\r\n const normalX = x * m[0] + y * m[1] + z * m[2] + d * m[3];\r\n const normalY = x * m[4] + y * m[5] + z * m[6] + d * m[7];\r\n const normalZ = x * m[8] + y * m[9] + z * m[10] + d * m[11];\r\n const finalD = x * m[12] + y * m[13] + z * m[14] + d * m[15];\r\n\r\n return new Plane(normalX, normalY, normalZ, finalD);\r\n }\r\n\r\n /**\r\n * Compute the dot product between the point and the plane normal\r\n * @param point point to calculate the dot product with\r\n * @returns the dot product (float) of the point coordinates and the plane normal.\r\n */\r\n public dotCoordinate(point: DeepImmutable): number {\r\n return this.normal.x * point.x + this.normal.y * point.y + this.normal.z * point.z + this.d;\r\n }\r\n\r\n /**\r\n * Updates the current Plane from the plane defined by the three given points.\r\n * @param point1 one of the points used to construct the plane\r\n * @param point2 one of the points used to construct the plane\r\n * @param point3 one of the points used to construct the plane\r\n * @returns the updated Plane.\r\n */\r\n public copyFromPoints(point1: DeepImmutable, point2: DeepImmutable, point3: DeepImmutable): Plane {\r\n const x1 = point2.x - point1.x;\r\n const y1 = point2.y - point1.y;\r\n const z1 = point2.z - point1.z;\r\n const x2 = point3.x - point1.x;\r\n const y2 = point3.y - point1.y;\r\n const z2 = point3.z - point1.z;\r\n const yz = y1 * z2 - z1 * y2;\r\n const xz = z1 * x2 - x1 * z2;\r\n const xy = x1 * y2 - y1 * x2;\r\n const pyth = Math.sqrt(yz * yz + xz * xz + xy * xy);\r\n let invPyth;\r\n\r\n if (pyth !== 0) {\r\n invPyth = 1.0 / pyth;\r\n } else {\r\n invPyth = 0.0;\r\n }\r\n\r\n this.normal.x = yz * invPyth;\r\n this.normal.y = xz * invPyth;\r\n this.normal.z = xy * invPyth;\r\n this.d = -(this.normal.x * point1.x + this.normal.y * point1.y + this.normal.z * point1.z);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Checks if the plane is facing a given direction (meaning if the plane's normal is pointing in the opposite direction of the given vector).\r\n * Note that for this function to work as expected you should make sure that:\r\n * - direction and the plane normal are normalized\r\n * - epsilon is a number just bigger than -1, something like -0.99 for eg\r\n * @param direction the direction to check if the plane is facing\r\n * @param epsilon value the dot product is compared against (returns true if dot <= epsilon)\r\n * @returns True if the plane is facing the given direction\r\n */\r\n public isFrontFacingTo(direction: DeepImmutable, epsilon: number): boolean {\r\n const dot = Vector3.Dot(this.normal, direction);\r\n return dot <= epsilon;\r\n }\r\n\r\n /**\r\n * Calculates the distance to a point\r\n * @param point point to calculate distance to\r\n * @returns the signed distance (float) from the given point to the Plane.\r\n */\r\n public signedDistanceTo(point: DeepImmutable): number {\r\n return Vector3.Dot(point, this.normal) + this.d;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a plane from an array\r\n * @param array the array to create a plane from\r\n * @returns a new Plane from the given array.\r\n */\r\n static FromArray(array: DeepImmutable>): Plane {\r\n return new Plane(array[0], array[1], array[2], array[3]);\r\n }\r\n /**\r\n * Creates a plane from three points\r\n * @param point1 point used to create the plane\r\n * @param point2 point used to create the plane\r\n * @param point3 point used to create the plane\r\n * @returns a new Plane defined by the three given points.\r\n */\r\n static FromPoints(point1: DeepImmutable, point2: DeepImmutable, point3: DeepImmutable): Plane {\r\n const result = new Plane(0.0, 0.0, 0.0, 0.0);\r\n result.copyFromPoints(point1, point2, point3);\r\n return result;\r\n }\r\n /**\r\n * Creates a plane from an origin point and a normal\r\n * @param origin origin of the plane to be constructed\r\n * @param normal normal of the plane to be constructed\r\n * @returns a new Plane the normal vector to this plane at the given origin point.\r\n */\r\n static FromPositionAndNormal(origin: DeepImmutable, normal: Vector3): Plane {\r\n const plane = new Plane(0.0, 0.0, 0.0, 0.0);\r\n return this.FromPositionAndNormalToRef(origin, normal, plane);\r\n }\r\n\r\n /**\r\n * Updates the given Plane \"result\" from an origin point and a normal.\r\n * @param origin origin of the plane to be constructed\r\n * @param normal the normalized normals of the plane to be constructed\r\n * @param result defines the Plane where to store the result\r\n * @returns result input\r\n */\r\n static FromPositionAndNormalToRef(origin: DeepImmutable, normal: DeepImmutable, result: T): T {\r\n result.normal.copyFrom(normal);\r\n result.normal.normalize();\r\n result.d = -origin.dot(result.normal);\r\n return result;\r\n }\r\n\r\n /**\r\n * Calculates the distance from a plane and a point\r\n * @param origin origin of the plane to be constructed\r\n * @param normal normal of the plane to be constructed\r\n * @param point point to calculate distance to\r\n * @returns the signed distance between the plane defined by the normal vector at the \"origin\"\" point and the given other point.\r\n */\r\n static SignedDistanceToPlaneFromPositionAndNormal(origin: DeepImmutable, normal: DeepImmutable, point: DeepImmutable): number {\r\n const d = -(normal.x * origin.x + normal.y * origin.y + normal.z * origin.z);\r\n return Vector3.Dot(point, normal) + d;\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { ISize } from \"../Maths/math.size\";\r\nimport type { Nullable } from \"../types\";\r\n\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\n\r\n/**\r\n * Transform some pixel data to a base64 string\r\n * @param pixels defines the pixel data to transform to base64\r\n * @param size defines the width and height of the (texture) data\r\n * @param invertY true if the data must be inverted for the Y coordinate during the conversion\r\n * @returns The base64 encoded string or null\r\n */\r\nexport function GenerateBase64StringFromPixelData(pixels: ArrayBufferView, size: ISize, invertY = false): Nullable {\r\n const width = size.width;\r\n const height = size.height;\r\n\r\n if (pixels instanceof Float32Array) {\r\n let len = pixels.byteLength / pixels.BYTES_PER_ELEMENT;\r\n const npixels = new Uint8Array(len);\r\n\r\n while (--len >= 0) {\r\n let val = pixels[len];\r\n if (val < 0) {\r\n val = 0;\r\n } else if (val > 1) {\r\n val = 1;\r\n }\r\n npixels[len] = val * 255;\r\n }\r\n\r\n pixels = npixels;\r\n }\r\n\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = width;\r\n canvas.height = height;\r\n\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) {\r\n return null;\r\n }\r\n\r\n const imageData = ctx.createImageData(width, height);\r\n const castData = imageData.data;\r\n castData.set(pixels);\r\n ctx.putImageData(imageData, 0, 0);\r\n\r\n if (invertY) {\r\n const canvas2 = document.createElement(\"canvas\");\r\n canvas2.width = width;\r\n canvas2.height = height;\r\n\r\n const ctx2 = canvas2.getContext(\"2d\");\r\n if (!ctx2) {\r\n return null;\r\n }\r\n\r\n ctx2.translate(0, height);\r\n ctx2.scale(1, -1);\r\n ctx2.drawImage(canvas, 0, 0);\r\n\r\n return canvas2.toDataURL(\"image/png\");\r\n }\r\n\r\n return canvas.toDataURL(\"image/png\");\r\n}\r\n\r\n/**\r\n * Reads the pixels stored in the webgl texture and returns them as a base64 string\r\n * @param texture defines the texture to read pixels from\r\n * @param faceIndex defines the face of the texture to read (in case of cube texture)\r\n * @param level defines the LOD level of the texture to read (in case of Mip Maps)\r\n * @returns The base64 encoded string or null\r\n */\r\nexport function GenerateBase64StringFromTexture(texture: BaseTexture, faceIndex = 0, level = 0): Nullable {\r\n const internalTexture = texture.getInternalTexture();\r\n if (!internalTexture) {\r\n return null;\r\n }\r\n\r\n const pixels = texture._readPixelsSync(faceIndex, level);\r\n if (!pixels) {\r\n return null;\r\n }\r\n\r\n return GenerateBase64StringFromPixelData(pixels, texture.getSize(), internalTexture.invertY);\r\n}\r\n\r\n/**\r\n * Reads the pixels stored in the webgl texture and returns them as a base64 string\r\n * @param texture defines the texture to read pixels from\r\n * @param faceIndex defines the face of the texture to read (in case of cube texture)\r\n * @param level defines the LOD level of the texture to read (in case of Mip Maps)\r\n * @returns The base64 encoded string or null wrapped in a promise\r\n */\r\nexport async function GenerateBase64StringFromTextureAsync(texture: BaseTexture, faceIndex = 0, level = 0): Promise> {\r\n const internalTexture = texture.getInternalTexture();\r\n if (!internalTexture) {\r\n return null;\r\n }\r\n\r\n const pixels = await texture.readPixels(faceIndex, level);\r\n if (!pixels) {\r\n return null;\r\n }\r\n\r\n return GenerateBase64StringFromPixelData(pixels, texture.getSize(), internalTexture.invertY);\r\n}\r\n\r\n/**\r\n * Class used to host copy specific utilities\r\n * (Back-compat)\r\n */\r\nexport const CopyTools = {\r\n /**\r\n * Transform some pixel data to a base64 string\r\n * @param pixels defines the pixel data to transform to base64\r\n * @param size defines the width and height of the (texture) data\r\n * @param invertY true if the data must be inverted for the Y coordinate during the conversion\r\n * @returns The base64 encoded string or null\r\n */\r\n GenerateBase64StringFromPixelData,\r\n\r\n /**\r\n * Reads the pixels stored in the webgl texture and returns them as a base64 string\r\n * @param texture defines the texture to read pixels from\r\n * @param faceIndex defines the face of the texture to read (in case of cube texture)\r\n * @param level defines the LOD level of the texture to read (in case of Mip Maps)\r\n * @returns The base64 encoded string or null\r\n */\r\n GenerateBase64StringFromTexture,\r\n\r\n /**\r\n * Reads the pixels stored in the webgl texture and returns them as a base64 string\r\n * @param texture defines the texture to read pixels from\r\n * @param faceIndex defines the face of the texture to read (in case of cube texture)\r\n * @param level defines the LOD level of the texture to read (in case of Mip Maps)\r\n * @returns The base64 encoded string or null wrapped in a promise\r\n */\r\n GenerateBase64StringFromTextureAsync,\r\n};\r\n", "/**\r\n * Options used to control default behaviors regarding compatibility support\r\n */\r\nexport class CompatibilityOptions {\r\n /**\r\n * Defines if the system should use OpenGL convention for UVs when creating geometry or loading .babylon files (false by default)\r\n */\r\n public static UseOpenGLOrientationForUV = false;\r\n}\r\n", "import { serialize } from \"../../Misc/decorators\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Matrix, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { GetClass, RegisterClass } from \"../../Misc/typeStore\";\r\nimport { _WarnImport } from \"../../Misc/devTools\";\r\nimport type { IInspectable } from \"../../Misc/iInspectable\";\r\nimport type { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { TimingTools } from \"../../Misc/timingTools\";\r\nimport { InstantiationTools } from \"../../Misc/instantiationTools\";\r\nimport { Plane } from \"../../Maths/math.plane\";\r\nimport { EncodeArrayBufferToBase64 } from \"../../Misc/stringTools\";\r\nimport { GenerateBase64StringFromTexture, GenerateBase64StringFromTextureAsync } from \"../../Misc/copyTools\";\r\nimport { CompatibilityOptions } from \"../../Compat/compatibilityOptions\";\r\nimport type { InternalTexture } from \"./internalTexture\";\r\n\r\nimport type { CubeTexture } from \"../../Materials/Textures/cubeTexture\";\r\nimport type { MirrorTexture } from \"../../Materials/Textures/mirrorTexture\";\r\nimport type { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { VideoTexture, VideoTextureSettings } from \"./videoTexture\";\r\n\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\n\r\n/**\r\n * Defines the available options when creating a texture\r\n */\r\nexport interface ITextureCreationOptions {\r\n /** Defines if the texture will require mip maps or not (default: false) */\r\n noMipmap?: boolean;\r\n\r\n /** Defines if the texture needs to be inverted on the y axis during loading (default: true) */\r\n invertY?: boolean;\r\n\r\n /** Defines the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...) (default: Texture.TRILINEAR_SAMPLINGMODE) */\r\n samplingMode?: number;\r\n\r\n /** Defines a callback triggered when the texture has been loaded (default: null) */\r\n onLoad?: Nullable<() => void>;\r\n\r\n /** Defines a callback triggered when an error occurred during the loading session (default: null) */\r\n onError?: Nullable<(message?: string, exception?: any) => void>;\r\n\r\n /** Defines the buffer to load the texture from in case the texture is loaded from a buffer representation (default: null) */\r\n buffer?: Nullable;\r\n\r\n /** Defines if the buffer we are loading the texture from should be deleted after load (default: false) */\r\n deleteBuffer?: boolean;\r\n\r\n /** Defines the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...) (default: ) */\r\n format?: number;\r\n\r\n /** Defines an optional mime type information (default: undefined) */\r\n mimeType?: string;\r\n\r\n /** Options to be passed to the loader (default: undefined) */\r\n loaderOptions?: any;\r\n\r\n /** Specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg) (default: undefined) */\r\n creationFlags?: number;\r\n\r\n /** Defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU) (default: false) */\r\n useSRGBBuffer?: boolean;\r\n\r\n /** Defines the underlying texture from an already existing one */\r\n internalTexture?: InternalTexture;\r\n\r\n /** Defines the underlying texture texture space */\r\n gammaSpace?: boolean;\r\n}\r\n\r\n/**\r\n * This represents a texture in babylon. It can be easily loaded from a network, base64 or html input.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#texture\r\n */\r\nexport class Texture extends BaseTexture {\r\n /**\r\n * Gets or sets a general boolean used to indicate that textures containing direct data (buffers) must be saved as part of the serialization process\r\n */\r\n public static SerializeBuffers = true;\r\n\r\n /**\r\n * Gets or sets a general boolean used to indicate that texture buffers must be saved as part of the serialization process.\r\n * If no buffer exists, one will be created as base64 string from the internal webgl data.\r\n */\r\n public static ForceSerializeBuffers = false;\r\n\r\n /**\r\n * This observable will notify when any texture had a loading error\r\n */\r\n public static OnTextureLoadErrorObservable = new Observable();\r\n\r\n /** @internal */\r\n public static _SerializeInternalTextureUniqueId = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _CubeTextureParser = (jsonTexture: any, scene: Scene, rootUrl: string): CubeTexture => {\r\n throw _WarnImport(\"CubeTexture\");\r\n };\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _CreateMirror = (name: string, renderTargetSize: number, scene: Scene, generateMipMaps: boolean): MirrorTexture => {\r\n throw _WarnImport(\"MirrorTexture\");\r\n };\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _CreateRenderTargetTexture = (name: string, renderTargetSize: number, scene: Scene, generateMipMaps: boolean, creationFlags?: number): RenderTargetTexture => {\r\n throw _WarnImport(\"RenderTargetTexture\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _CreateVideoTexture(\r\n name: Nullable,\r\n src: string | string[] | HTMLVideoElement,\r\n scene: Nullable,\r\n generateMipMaps = false,\r\n invertY = false,\r\n samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE,\r\n settings: Partial = {},\r\n onError?: Nullable<(message?: string, exception?: any) => void>,\r\n format: number = Constants.TEXTUREFORMAT_RGBA\r\n ): VideoTexture {\r\n throw _WarnImport(\"VideoTexture\");\r\n }\r\n\r\n /** nearest is mag = nearest and min = nearest and no mip */\r\n public static readonly NEAREST_SAMPLINGMODE = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n /** nearest is mag = nearest and min = nearest and mip = linear */\r\n public static readonly NEAREST_NEAREST_MIPLINEAR = Constants.TEXTURE_NEAREST_NEAREST_MIPLINEAR; // nearest is mag = nearest and min = nearest and mip = linear\r\n\r\n /** Bilinear is mag = linear and min = linear and no mip */\r\n public static readonly BILINEAR_SAMPLINGMODE = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n /** Bilinear is mag = linear and min = linear and mip = nearest */\r\n public static readonly LINEAR_LINEAR_MIPNEAREST = Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST; // Bilinear is mag = linear and min = linear and mip = nearest\r\n\r\n /** Trilinear is mag = linear and min = linear and mip = linear */\r\n public static readonly TRILINEAR_SAMPLINGMODE = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n /** Trilinear is mag = linear and min = linear and mip = linear */\r\n public static readonly LINEAR_LINEAR_MIPLINEAR = Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR; // Trilinear is mag = linear and min = linear and mip = linear\r\n\r\n /** mag = nearest and min = nearest and mip = nearest */\r\n public static readonly NEAREST_NEAREST_MIPNEAREST = Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST;\r\n /** mag = nearest and min = linear and mip = nearest */\r\n public static readonly NEAREST_LINEAR_MIPNEAREST = Constants.TEXTURE_NEAREST_LINEAR_MIPNEAREST;\r\n /** mag = nearest and min = linear and mip = linear */\r\n public static readonly NEAREST_LINEAR_MIPLINEAR = Constants.TEXTURE_NEAREST_LINEAR_MIPLINEAR;\r\n /** mag = nearest and min = linear and mip = none */\r\n public static readonly NEAREST_LINEAR = Constants.TEXTURE_NEAREST_LINEAR;\r\n /** mag = nearest and min = nearest and mip = none */\r\n public static readonly NEAREST_NEAREST = Constants.TEXTURE_NEAREST_NEAREST;\r\n /** mag = linear and min = nearest and mip = nearest */\r\n public static readonly LINEAR_NEAREST_MIPNEAREST = Constants.TEXTURE_LINEAR_NEAREST_MIPNEAREST;\r\n /** mag = linear and min = nearest and mip = linear */\r\n public static readonly LINEAR_NEAREST_MIPLINEAR = Constants.TEXTURE_LINEAR_NEAREST_MIPLINEAR;\r\n /** mag = linear and min = linear and mip = none */\r\n public static readonly LINEAR_LINEAR = Constants.TEXTURE_LINEAR_LINEAR;\r\n /** mag = linear and min = nearest and mip = none */\r\n public static readonly LINEAR_NEAREST = Constants.TEXTURE_LINEAR_NEAREST;\r\n\r\n /** Explicit coordinates mode */\r\n public static readonly EXPLICIT_MODE = Constants.TEXTURE_EXPLICIT_MODE;\r\n /** Spherical coordinates mode */\r\n public static readonly SPHERICAL_MODE = Constants.TEXTURE_SPHERICAL_MODE;\r\n /** Planar coordinates mode */\r\n public static readonly PLANAR_MODE = Constants.TEXTURE_PLANAR_MODE;\r\n /** Cubic coordinates mode */\r\n public static readonly CUBIC_MODE = Constants.TEXTURE_CUBIC_MODE;\r\n /** Projection coordinates mode */\r\n public static readonly PROJECTION_MODE = Constants.TEXTURE_PROJECTION_MODE;\r\n /** Inverse Cubic coordinates mode */\r\n public static readonly SKYBOX_MODE = Constants.TEXTURE_SKYBOX_MODE;\r\n /** Inverse Cubic coordinates mode */\r\n public static readonly INVCUBIC_MODE = Constants.TEXTURE_INVCUBIC_MODE;\r\n /** Equirectangular coordinates mode */\r\n public static readonly EQUIRECTANGULAR_MODE = Constants.TEXTURE_EQUIRECTANGULAR_MODE;\r\n /** Equirectangular Fixed coordinates mode */\r\n public static readonly FIXED_EQUIRECTANGULAR_MODE = Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MODE;\r\n /** Equirectangular Fixed Mirrored coordinates mode */\r\n public static readonly FIXED_EQUIRECTANGULAR_MIRRORED_MODE = Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE;\r\n\r\n /** Texture is not repeating outside of 0..1 UVs */\r\n public static readonly CLAMP_ADDRESSMODE = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n /** Texture is repeating outside of 0..1 UVs */\r\n public static readonly WRAP_ADDRESSMODE = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n /** Texture is repeating and mirrored */\r\n public static readonly MIRROR_ADDRESSMODE = Constants.TEXTURE_MIRROR_ADDRESSMODE;\r\n\r\n /**\r\n * Gets or sets a boolean which defines if the texture url must be build from the serialized URL instead of just using the name and loading them side by side with the scene file\r\n */\r\n public static UseSerializedUrlIfAny = false;\r\n\r\n /**\r\n * Define the url of the texture.\r\n */\r\n @serialize()\r\n public url: Nullable = null;\r\n\r\n /**\r\n * Define an offset on the texture to offset the u coordinates of the UVs\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#offsetting\r\n */\r\n @serialize()\r\n public uOffset = 0;\r\n\r\n /**\r\n * Define an offset on the texture to offset the v coordinates of the UVs\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#offsetting\r\n */\r\n @serialize()\r\n public vOffset = 0;\r\n\r\n /**\r\n * Define an offset on the texture to scale the u coordinates of the UVs\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#tiling\r\n */\r\n @serialize()\r\n public uScale = 1.0;\r\n\r\n /**\r\n * Define an offset on the texture to scale the v coordinates of the UVs\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#tiling\r\n */\r\n @serialize()\r\n public vScale = 1.0;\r\n\r\n /**\r\n * Define an offset on the texture to rotate around the u coordinates of the UVs\r\n * The angle is defined in radians.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials\r\n */\r\n @serialize()\r\n public uAng = 0;\r\n\r\n /**\r\n * Define an offset on the texture to rotate around the v coordinates of the UVs\r\n * The angle is defined in radians.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials\r\n */\r\n @serialize()\r\n public vAng = 0;\r\n\r\n /**\r\n * Define an offset on the texture to rotate around the w coordinates of the UVs (in case of 3d texture)\r\n * The angle is defined in radians.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials\r\n */\r\n @serialize()\r\n public wAng = 0;\r\n\r\n /**\r\n * Defines the center of rotation (U)\r\n */\r\n @serialize()\r\n public uRotationCenter = 0.5;\r\n\r\n /**\r\n * Defines the center of rotation (V)\r\n */\r\n @serialize()\r\n public vRotationCenter = 0.5;\r\n\r\n /**\r\n * Defines the center of rotation (W)\r\n */\r\n @serialize()\r\n public wRotationCenter = 0.5;\r\n\r\n /**\r\n * Sets this property to true to avoid deformations when rotating the texture with non-uniform scaling\r\n */\r\n @serialize()\r\n public homogeneousRotationInUVTransform = false;\r\n\r\n /**\r\n * Are mip maps generated for this texture or not.\r\n */\r\n get noMipmap(): boolean {\r\n return this._noMipmap;\r\n }\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility\r\n */\r\n public inspectableCustomProperties: Nullable = null;\r\n\r\n /** @internal */\r\n public _noMipmap: boolean = false;\r\n /** @internal */\r\n public _invertY: boolean = false;\r\n private _rowGenerationMatrix: Nullable = null;\r\n private _cachedTextureMatrix: Nullable = null;\r\n private _projectionModeMatrix: Nullable = null;\r\n private _t0: Nullable = null;\r\n private _t1: Nullable = null;\r\n private _t2: Nullable = null;\r\n\r\n private _cachedUOffset: number = -1;\r\n private _cachedVOffset: number = -1;\r\n private _cachedUScale: number = 0;\r\n private _cachedVScale: number = 0;\r\n private _cachedUAng: number = -1;\r\n private _cachedVAng: number = -1;\r\n private _cachedWAng: number = -1;\r\n private _cachedReflectionProjectionMatrixId: number = -1;\r\n private _cachedURotationCenter: number = -1;\r\n private _cachedVRotationCenter: number = -1;\r\n private _cachedWRotationCenter: number = -1;\r\n private _cachedHomogeneousRotationInUVTransform: boolean = false;\r\n private _cachedIdentity3x2: boolean = true;\r\n\r\n private _cachedReflectionTextureMatrix: Nullable = null;\r\n private _cachedReflectionUOffset = -1;\r\n private _cachedReflectionVOffset = -1;\r\n private _cachedReflectionUScale = 0;\r\n private _cachedReflectionVScale = 0;\r\n private _cachedReflectionCoordinatesMode = -1;\r\n\r\n /** @internal */\r\n public _buffer: Nullable = null;\r\n private _deleteBuffer: boolean = false;\r\n protected _format: Nullable = null;\r\n private _delayedOnLoad: Nullable<() => void> = null;\r\n private _delayedOnError: Nullable<() => void> = null;\r\n private _mimeType?: string;\r\n private _loaderOptions?: any;\r\n private _creationFlags?: number;\r\n /** @internal */\r\n public _useSRGBBuffer?: boolean;\r\n private _forcedExtension?: string;\r\n\r\n /** Returns the texture mime type if it was defined by a loader (undefined else) */\r\n public get mimeType() {\r\n return this._mimeType;\r\n }\r\n\r\n /**\r\n * Observable triggered once the texture has been loaded.\r\n */\r\n public onLoadObservable: Observable = new Observable();\r\n\r\n protected _isBlocking: boolean = true;\r\n /**\r\n * Is the texture preventing material to render while loading.\r\n * If false, a default texture will be used instead of the loading one during the preparation step.\r\n */\r\n public set isBlocking(value: boolean) {\r\n this._isBlocking = value;\r\n }\r\n @serialize()\r\n public get isBlocking(): boolean {\r\n return this._isBlocking;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the texture needs to be inverted on the y axis during loading\r\n */\r\n public get invertY(): boolean {\r\n return this._invertY;\r\n }\r\n\r\n /**\r\n * Instantiates a new texture.\r\n * This represents a texture in babylon. It can be easily loaded from a network, base64 or html input.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#texture\r\n * @param url defines the url of the picture to load as a texture\r\n * @param sceneOrEngine defines the scene or engine the texture will belong to\r\n * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture\r\n * @param invertY defines if the texture needs to be inverted on the y axis during loading\r\n * @param samplingMode defines the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)\r\n * @param onLoad defines a callback triggered when the texture has been loaded\r\n * @param onError defines a callback triggered when an error occurred during the loading session\r\n * @param buffer defines the buffer to load the texture from in case the texture is loaded from a buffer representation\r\n * @param deleteBuffer defines if the buffer we are loading the texture from should be deleted after load\r\n * @param format defines the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)\r\n * @param mimeType defines an optional mime type information\r\n * @param loaderOptions options to be passed to the loader\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n */\r\n constructor(\r\n url: Nullable,\r\n sceneOrEngine?: Nullable,\r\n noMipmapOrOptions?: boolean | ITextureCreationOptions,\r\n invertY?: boolean,\r\n samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<() => void> = null,\r\n onError: Nullable<(message?: string, exception?: any) => void> = null,\r\n buffer: Nullable = null,\r\n deleteBuffer: boolean = false,\r\n format?: number,\r\n mimeType?: string,\r\n loaderOptions?: any,\r\n creationFlags?: number,\r\n forcedExtension?: string\r\n ) {\r\n super(sceneOrEngine);\r\n\r\n this.name = url || \"\";\r\n this.url = url;\r\n\r\n let noMipmap: boolean;\r\n let useSRGBBuffer: boolean = false;\r\n let internalTexture: Nullable = null;\r\n let gammaSpace = true;\r\n\r\n if (typeof noMipmapOrOptions === \"object\" && noMipmapOrOptions !== null) {\r\n noMipmap = noMipmapOrOptions.noMipmap ?? false;\r\n invertY = noMipmapOrOptions.invertY ?? (CompatibilityOptions.UseOpenGLOrientationForUV ? false : true);\r\n samplingMode = noMipmapOrOptions.samplingMode ?? Texture.TRILINEAR_SAMPLINGMODE;\r\n onLoad = noMipmapOrOptions.onLoad ?? null;\r\n onError = noMipmapOrOptions.onError ?? null;\r\n buffer = noMipmapOrOptions.buffer ?? null;\r\n deleteBuffer = noMipmapOrOptions.deleteBuffer ?? false;\r\n format = noMipmapOrOptions.format;\r\n mimeType = noMipmapOrOptions.mimeType;\r\n loaderOptions = noMipmapOrOptions.loaderOptions;\r\n creationFlags = noMipmapOrOptions.creationFlags;\r\n useSRGBBuffer = noMipmapOrOptions.useSRGBBuffer ?? false;\r\n internalTexture = noMipmapOrOptions.internalTexture ?? null;\r\n gammaSpace = noMipmapOrOptions.gammaSpace ?? gammaSpace;\r\n } else {\r\n noMipmap = !!noMipmapOrOptions;\r\n }\r\n\r\n this._gammaSpace = gammaSpace;\r\n this._noMipmap = noMipmap;\r\n this._invertY = invertY === undefined ? (CompatibilityOptions.UseOpenGLOrientationForUV ? false : true) : invertY;\r\n this._initialSamplingMode = samplingMode;\r\n this._buffer = buffer;\r\n this._deleteBuffer = deleteBuffer;\r\n this._mimeType = mimeType;\r\n this._loaderOptions = loaderOptions;\r\n this._creationFlags = creationFlags;\r\n this._useSRGBBuffer = useSRGBBuffer;\r\n this._forcedExtension = forcedExtension;\r\n if (format) {\r\n this._format = format;\r\n }\r\n\r\n const scene = this.getScene();\r\n const engine = this._getEngine();\r\n if (!engine) {\r\n return;\r\n }\r\n\r\n engine.onBeforeTextureInitObservable.notifyObservers(this);\r\n\r\n const load = () => {\r\n if (this._texture) {\r\n if (this._texture._invertVScale) {\r\n this.vScale *= -1;\r\n this.vOffset += 1;\r\n }\r\n\r\n // Update texture to match internal texture's wrapping\r\n if (this._texture._cachedWrapU !== null) {\r\n this.wrapU = this._texture._cachedWrapU;\r\n this._texture._cachedWrapU = null;\r\n }\r\n if (this._texture._cachedWrapV !== null) {\r\n this.wrapV = this._texture._cachedWrapV;\r\n this._texture._cachedWrapV = null;\r\n }\r\n if (this._texture._cachedWrapR !== null) {\r\n this.wrapR = this._texture._cachedWrapR;\r\n this._texture._cachedWrapR = null;\r\n }\r\n }\r\n\r\n if (this.onLoadObservable.hasObservers()) {\r\n this.onLoadObservable.notifyObservers(this);\r\n }\r\n if (onLoad) {\r\n onLoad();\r\n }\r\n\r\n if (!this.isBlocking && scene) {\r\n scene.resetCachedMaterial();\r\n }\r\n };\r\n\r\n const errorHandler = (message?: string, exception?: any) => {\r\n this._loadingError = true;\r\n this._errorObject = { message, exception };\r\n if (onError) {\r\n onError(message, exception);\r\n }\r\n Texture.OnTextureLoadErrorObservable.notifyObservers(this);\r\n };\r\n\r\n if (!this.url && !internalTexture) {\r\n this._delayedOnLoad = load;\r\n this._delayedOnError = errorHandler;\r\n return;\r\n }\r\n\r\n this._texture = internalTexture ?? this._getFromCache(this.url, noMipmap, samplingMode, this._invertY, useSRGBBuffer, this.isCube);\r\n\r\n if (!this._texture) {\r\n if (!scene || !scene.useDelayedTextureLoading) {\r\n try {\r\n this._texture = engine.createTexture(\r\n this.url,\r\n noMipmap,\r\n this._invertY,\r\n scene,\r\n samplingMode,\r\n load,\r\n errorHandler,\r\n this._buffer,\r\n undefined,\r\n this._format,\r\n this._forcedExtension,\r\n mimeType,\r\n loaderOptions,\r\n creationFlags,\r\n useSRGBBuffer\r\n );\r\n } catch (e) {\r\n errorHandler(\"error loading\", e);\r\n throw e;\r\n }\r\n if (deleteBuffer) {\r\n this._buffer = null;\r\n }\r\n } else {\r\n this.delayLoadState = Constants.DELAYLOADSTATE_NOTLOADED;\r\n\r\n this._delayedOnLoad = load;\r\n this._delayedOnError = errorHandler;\r\n }\r\n } else {\r\n if (this._texture.isReady) {\r\n TimingTools.SetImmediate(() => load());\r\n } else {\r\n const loadObserver = this._texture.onLoadedObservable.add(load);\r\n this._texture.onErrorObservable.add((e) => {\r\n errorHandler(e.message, e.exception);\r\n this._texture?.onLoadedObservable.remove(loadObserver);\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update the url (and optional buffer) of this texture if url was null during construction.\r\n * @param url the url of the texture\r\n * @param buffer the buffer of the texture (defaults to null)\r\n * @param onLoad callback called when the texture is loaded (defaults to null)\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n */\r\n public updateURL(\r\n url: string,\r\n buffer: Nullable = null,\r\n onLoad?: () => void,\r\n forcedExtension?: string\r\n ): void {\r\n if (this.url) {\r\n this.releaseInternalTexture();\r\n this.getScene()!.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n\r\n if (!this.name || this.name.startsWith(\"data:\")) {\r\n this.name = url;\r\n }\r\n this.url = url;\r\n this._buffer = buffer;\r\n this._forcedExtension = forcedExtension;\r\n this.delayLoadState = Constants.DELAYLOADSTATE_NOTLOADED;\r\n\r\n if (onLoad) {\r\n this._delayedOnLoad = onLoad;\r\n }\r\n this.delayLoad();\r\n }\r\n\r\n /**\r\n * Finish the loading sequence of a texture flagged as delayed load.\r\n * @internal\r\n */\r\n public delayLoad(): void {\r\n if (this.delayLoadState !== Constants.DELAYLOADSTATE_NOTLOADED) {\r\n return;\r\n }\r\n\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n this.delayLoadState = Constants.DELAYLOADSTATE_LOADED;\r\n this._texture = this._getFromCache(this.url, this._noMipmap, this.samplingMode, this._invertY, this._useSRGBBuffer, this.isCube);\r\n\r\n if (!this._texture) {\r\n this._texture = scene\r\n .getEngine()\r\n .createTexture(\r\n this.url,\r\n this._noMipmap,\r\n this._invertY,\r\n scene,\r\n this.samplingMode,\r\n this._delayedOnLoad,\r\n this._delayedOnError,\r\n this._buffer,\r\n null,\r\n this._format,\r\n this._forcedExtension,\r\n this._mimeType,\r\n this._loaderOptions,\r\n this._creationFlags,\r\n this._useSRGBBuffer\r\n );\r\n if (this._deleteBuffer) {\r\n this._buffer = null;\r\n }\r\n } else {\r\n if (this._delayedOnLoad) {\r\n if (this._texture.isReady) {\r\n TimingTools.SetImmediate(this._delayedOnLoad);\r\n } else {\r\n this._texture.onLoadedObservable.add(this._delayedOnLoad);\r\n }\r\n }\r\n }\r\n\r\n this._delayedOnLoad = null;\r\n this._delayedOnError = null;\r\n }\r\n\r\n private _prepareRowForTextureGeneration(x: number, y: number, z: number, t: Vector3): void {\r\n x *= this._cachedUScale;\r\n y *= this._cachedVScale;\r\n\r\n x -= this.uRotationCenter * this._cachedUScale;\r\n y -= this.vRotationCenter * this._cachedVScale;\r\n z -= this.wRotationCenter;\r\n\r\n Vector3.TransformCoordinatesFromFloatsToRef(x, y, z, this._rowGenerationMatrix!, t);\r\n\r\n t.x += this.uRotationCenter * this._cachedUScale + this._cachedUOffset;\r\n t.y += this.vRotationCenter * this._cachedVScale + this._cachedVOffset;\r\n t.z += this.wRotationCenter;\r\n }\r\n\r\n /**\r\n * Checks if the texture has the same transform matrix than another texture\r\n * @param texture texture to check against\r\n * @returns true if the transforms are the same, else false\r\n */\r\n public checkTransformsAreIdentical(texture: Nullable): boolean {\r\n return (\r\n texture !== null &&\r\n this.uOffset === texture.uOffset &&\r\n this.vOffset === texture.vOffset &&\r\n this.uScale === texture.uScale &&\r\n this.vScale === texture.vScale &&\r\n this.uAng === texture.uAng &&\r\n this.vAng === texture.vAng &&\r\n this.wAng === texture.wAng\r\n );\r\n }\r\n\r\n /**\r\n * Get the current texture matrix which includes the requested offsetting, tiling and rotation components.\r\n * @param uBase The horizontal base offset multiplier (1 by default)\r\n * @returns the transform matrix of the texture.\r\n */\r\n public getTextureMatrix(uBase = 1): Matrix {\r\n if (\r\n this.uOffset === this._cachedUOffset &&\r\n this.vOffset === this._cachedVOffset &&\r\n this.uScale * uBase === this._cachedUScale &&\r\n this.vScale === this._cachedVScale &&\r\n this.uAng === this._cachedUAng &&\r\n this.vAng === this._cachedVAng &&\r\n this.wAng === this._cachedWAng &&\r\n this.uRotationCenter === this._cachedURotationCenter &&\r\n this.vRotationCenter === this._cachedVRotationCenter &&\r\n this.wRotationCenter === this._cachedWRotationCenter &&\r\n this.homogeneousRotationInUVTransform === this._cachedHomogeneousRotationInUVTransform\r\n ) {\r\n return this._cachedTextureMatrix!;\r\n }\r\n\r\n this._cachedUOffset = this.uOffset;\r\n this._cachedVOffset = this.vOffset;\r\n this._cachedUScale = this.uScale * uBase;\r\n this._cachedVScale = this.vScale;\r\n this._cachedUAng = this.uAng;\r\n this._cachedVAng = this.vAng;\r\n this._cachedWAng = this.wAng;\r\n this._cachedURotationCenter = this.uRotationCenter;\r\n this._cachedVRotationCenter = this.vRotationCenter;\r\n this._cachedWRotationCenter = this.wRotationCenter;\r\n this._cachedHomogeneousRotationInUVTransform = this.homogeneousRotationInUVTransform;\r\n\r\n if (!this._cachedTextureMatrix || !this._rowGenerationMatrix) {\r\n this._cachedTextureMatrix = Matrix.Zero();\r\n this._rowGenerationMatrix = new Matrix();\r\n this._t0 = Vector3.Zero();\r\n this._t1 = Vector3.Zero();\r\n this._t2 = Vector3.Zero();\r\n }\r\n\r\n Matrix.RotationYawPitchRollToRef(this.vAng, this.uAng, this.wAng, this._rowGenerationMatrix!);\r\n\r\n if (this.homogeneousRotationInUVTransform) {\r\n Matrix.TranslationToRef(-this._cachedURotationCenter, -this._cachedVRotationCenter, -this._cachedWRotationCenter, TmpVectors.Matrix[0]);\r\n Matrix.TranslationToRef(this._cachedURotationCenter, this._cachedVRotationCenter, this._cachedWRotationCenter, TmpVectors.Matrix[1]);\r\n Matrix.ScalingToRef(this._cachedUScale, this._cachedVScale, 0, TmpVectors.Matrix[2]);\r\n Matrix.TranslationToRef(this._cachedUOffset, this._cachedVOffset, 0, TmpVectors.Matrix[3]);\r\n\r\n TmpVectors.Matrix[0].multiplyToRef(this._rowGenerationMatrix!, this._cachedTextureMatrix);\r\n this._cachedTextureMatrix.multiplyToRef(TmpVectors.Matrix[1], this._cachedTextureMatrix);\r\n this._cachedTextureMatrix.multiplyToRef(TmpVectors.Matrix[2], this._cachedTextureMatrix);\r\n this._cachedTextureMatrix.multiplyToRef(TmpVectors.Matrix[3], this._cachedTextureMatrix);\r\n\r\n // copy the translation row to the 3rd row of the matrix so that we don't need to update the shaders (which expects the translation to be on the 3rd row)\r\n this._cachedTextureMatrix.setRowFromFloats(2, this._cachedTextureMatrix.m[12], this._cachedTextureMatrix.m[13], this._cachedTextureMatrix.m[14], 1);\r\n } else {\r\n this._prepareRowForTextureGeneration(0, 0, 0, this._t0!);\r\n this._prepareRowForTextureGeneration(1.0, 0, 0, this._t1!);\r\n this._prepareRowForTextureGeneration(0, 1.0, 0, this._t2!);\r\n\r\n this._t1!.subtractInPlace(this._t0!);\r\n this._t2!.subtractInPlace(this._t0!);\r\n\r\n Matrix.FromValuesToRef(\r\n this._t1!.x,\r\n this._t1!.y,\r\n this._t1!.z,\r\n 0.0,\r\n this._t2!.x,\r\n this._t2!.y,\r\n this._t2!.z,\r\n 0.0,\r\n this._t0!.x,\r\n this._t0!.y,\r\n this._t0!.z,\r\n 0.0,\r\n 0.0,\r\n 0.0,\r\n 0.0,\r\n 1.0,\r\n this._cachedTextureMatrix\r\n );\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return this._cachedTextureMatrix;\r\n }\r\n\r\n const previousIdentity3x2 = this._cachedIdentity3x2;\r\n this._cachedIdentity3x2 = this._cachedTextureMatrix.isIdentityAs3x2();\r\n\r\n if (this.optimizeUVAllocation && previousIdentity3x2 !== this._cachedIdentity3x2) {\r\n // We flag the materials that are using this texture as \"texture dirty\" because depending on the fact that the matrix is the identity or not, some defines\r\n // will get different values (see PrepareDefinesForMergedUV), meaning we should regenerate the effect accordingly\r\n scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n\r\n return this._cachedTextureMatrix;\r\n }\r\n\r\n /**\r\n * Get the current matrix used to apply reflection. This is useful to rotate an environment texture for instance.\r\n * @returns The reflection texture transform\r\n */\r\n public getReflectionTextureMatrix(): Matrix {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return this._cachedReflectionTextureMatrix!;\r\n }\r\n\r\n if (\r\n this.uOffset === this._cachedReflectionUOffset &&\r\n this.vOffset === this._cachedReflectionVOffset &&\r\n this.uScale === this._cachedReflectionUScale &&\r\n this.vScale === this._cachedReflectionVScale &&\r\n this.coordinatesMode === this._cachedReflectionCoordinatesMode\r\n ) {\r\n if (this.coordinatesMode === Texture.PROJECTION_MODE) {\r\n if (this._cachedReflectionProjectionMatrixId === scene.getProjectionMatrix().updateFlag) {\r\n return this._cachedReflectionTextureMatrix!;\r\n }\r\n } else {\r\n return this._cachedReflectionTextureMatrix!;\r\n }\r\n }\r\n\r\n if (!this._cachedReflectionTextureMatrix) {\r\n this._cachedReflectionTextureMatrix = Matrix.Zero();\r\n }\r\n\r\n if (!this._projectionModeMatrix) {\r\n this._projectionModeMatrix = Matrix.Zero();\r\n }\r\n\r\n const flagMaterialsAsTextureDirty = this._cachedReflectionCoordinatesMode !== this.coordinatesMode;\r\n\r\n this._cachedReflectionUOffset = this.uOffset;\r\n this._cachedReflectionVOffset = this.vOffset;\r\n this._cachedReflectionUScale = this.uScale;\r\n this._cachedReflectionVScale = this.vScale;\r\n this._cachedReflectionCoordinatesMode = this.coordinatesMode;\r\n\r\n switch (this.coordinatesMode) {\r\n case Texture.PLANAR_MODE: {\r\n Matrix.IdentityToRef(this._cachedReflectionTextureMatrix);\r\n (this._cachedReflectionTextureMatrix)[0] = this.uScale;\r\n (this._cachedReflectionTextureMatrix)[5] = this.vScale;\r\n (this._cachedReflectionTextureMatrix)[12] = this.uOffset;\r\n (this._cachedReflectionTextureMatrix)[13] = this.vOffset;\r\n break;\r\n }\r\n case Texture.PROJECTION_MODE: {\r\n Matrix.FromValuesToRef(0.5, 0.0, 0.0, 0.0, 0.0, -0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 1.0, 1.0, this._projectionModeMatrix);\r\n\r\n const projectionMatrix = scene.getProjectionMatrix();\r\n this._cachedReflectionProjectionMatrixId = projectionMatrix.updateFlag;\r\n projectionMatrix.multiplyToRef(this._projectionModeMatrix, this._cachedReflectionTextureMatrix);\r\n break;\r\n }\r\n default:\r\n Matrix.IdentityToRef(this._cachedReflectionTextureMatrix);\r\n break;\r\n }\r\n\r\n if (flagMaterialsAsTextureDirty) {\r\n // We flag the materials that are using this texture as \"texture dirty\" if the coordinatesMode has changed.\r\n // Indeed, this property is used to set the value of some defines used to generate the effect (in material.isReadyForSubMesh), so we must make sure this code will be re-executed and the effect recreated if necessary\r\n scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this);\r\n });\r\n }\r\n\r\n return this._cachedReflectionTextureMatrix;\r\n }\r\n\r\n /**\r\n * Clones the texture.\r\n * @returns the cloned texture\r\n */\r\n public clone(): Texture {\r\n const options: ITextureCreationOptions = {\r\n noMipmap: this._noMipmap,\r\n invertY: this._invertY,\r\n samplingMode: this.samplingMode,\r\n onLoad: undefined,\r\n onError: undefined,\r\n buffer: this._texture ? this._texture._buffer : undefined,\r\n deleteBuffer: this._deleteBuffer,\r\n format: this.textureFormat,\r\n mimeType: this.mimeType,\r\n loaderOptions: this._loaderOptions,\r\n creationFlags: this._creationFlags,\r\n useSRGBBuffer: this._useSRGBBuffer,\r\n };\r\n\r\n return SerializationHelper.Clone(() => {\r\n return new Texture(this._texture ? this._texture.url : null, this.getScene(), options);\r\n }, this);\r\n }\r\n\r\n /**\r\n * Serialize the texture to a JSON representation we can easily use in the respective Parse function.\r\n * @returns The JSON representation of the texture\r\n */\r\n public serialize(): any {\r\n const savedName = this.name;\r\n\r\n if (!Texture.SerializeBuffers) {\r\n if (this.name.startsWith(\"data:\")) {\r\n this.name = \"\";\r\n }\r\n }\r\n\r\n if (this.name.startsWith(\"data:\") && this.url === this.name) {\r\n this.url = \"\";\r\n }\r\n\r\n const serializationObject = super.serialize(Texture._SerializeInternalTextureUniqueId);\r\n\r\n if (!serializationObject) {\r\n return null;\r\n }\r\n\r\n if (Texture.SerializeBuffers || Texture.ForceSerializeBuffers) {\r\n if (typeof this._buffer === \"string\" && (this._buffer as string).substr(0, 5) === \"data:\") {\r\n serializationObject.base64String = this._buffer;\r\n serializationObject.name = serializationObject.name.replace(\"data:\", \"\");\r\n } else if (this.url && this.url.startsWith(\"data:\") && this._buffer instanceof Uint8Array) {\r\n serializationObject.base64String = \"data:image/png;base64,\" + EncodeArrayBufferToBase64(this._buffer);\r\n } else if (Texture.ForceSerializeBuffers || (this.url && this.url.startsWith(\"blob:\")) || this._forceSerialize) {\r\n serializationObject.base64String =\r\n !this._engine || this._engine._features.supportSyncTextureRead ? GenerateBase64StringFromTexture(this) : GenerateBase64StringFromTextureAsync(this);\r\n }\r\n }\r\n\r\n serializationObject.invertY = this._invertY;\r\n serializationObject.samplingMode = this.samplingMode;\r\n serializationObject._creationFlags = this._creationFlags;\r\n serializationObject._useSRGBBuffer = this._useSRGBBuffer;\r\n if (Texture._SerializeInternalTextureUniqueId) {\r\n serializationObject.internalTextureUniqueId = this._texture?.uniqueId ?? undefined;\r\n }\r\n serializationObject.noMipmap = this._noMipmap;\r\n\r\n this.name = savedName;\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Get the current class name of the texture useful for serialization or dynamic coding.\r\n * @returns \"Texture\"\r\n */\r\n public getClassName(): string {\r\n return \"Texture\";\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n\r\n this.onLoadObservable.clear();\r\n\r\n this._delayedOnLoad = null;\r\n this._delayedOnError = null;\r\n this._buffer = null;\r\n }\r\n\r\n /**\r\n * Parse the JSON representation of a texture in order to recreate the texture in the given scene.\r\n * @param parsedTexture Define the JSON representation of the texture\r\n * @param scene Define the scene the parsed texture should be instantiated in\r\n * @param rootUrl Define the root url of the parsing sequence in the case of relative dependencies\r\n * @returns The parsed texture if successful\r\n */\r\n public static Parse(parsedTexture: any, scene: Scene, rootUrl: string): Nullable {\r\n if (parsedTexture.customType) {\r\n const customTexture = InstantiationTools.Instantiate(parsedTexture.customType);\r\n // Update Sampling Mode\r\n const parsedCustomTexture: any = customTexture.Parse(parsedTexture, scene, rootUrl);\r\n if (parsedTexture.samplingMode && parsedCustomTexture.updateSamplingMode && parsedCustomTexture._samplingMode) {\r\n if (parsedCustomTexture._samplingMode !== parsedTexture.samplingMode) {\r\n parsedCustomTexture.updateSamplingMode(parsedTexture.samplingMode);\r\n }\r\n }\r\n return parsedCustomTexture;\r\n }\r\n\r\n if (parsedTexture.isCube && !parsedTexture.isRenderTarget) {\r\n return Texture._CubeTextureParser(parsedTexture, scene, rootUrl);\r\n }\r\n\r\n const hasInternalTextureUniqueId = parsedTexture.internalTextureUniqueId !== undefined;\r\n\r\n if (!parsedTexture.name && !parsedTexture.isRenderTarget && !hasInternalTextureUniqueId) {\r\n return null;\r\n }\r\n\r\n let internalTexture: InternalTexture | undefined;\r\n\r\n if (hasInternalTextureUniqueId) {\r\n const cache = scene.getEngine().getLoadedTexturesCache();\r\n for (const texture of cache) {\r\n if (texture.uniqueId === parsedTexture.internalTextureUniqueId) {\r\n internalTexture = texture;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const onLoaded = (texture: Texture | null) => {\r\n // Clear cache\r\n if (texture && texture._texture) {\r\n texture._texture._cachedWrapU = null;\r\n texture._texture._cachedWrapV = null;\r\n texture._texture._cachedWrapR = null;\r\n }\r\n\r\n // Update Sampling Mode\r\n if (parsedTexture.samplingMode) {\r\n const sampling: number = parsedTexture.samplingMode;\r\n if (texture && texture.samplingMode !== sampling) {\r\n texture.updateSamplingMode(sampling);\r\n }\r\n }\r\n // Animations\r\n if (texture && parsedTexture.animations) {\r\n for (let animationIndex = 0; animationIndex < parsedTexture.animations.length; animationIndex++) {\r\n const parsedAnimation = parsedTexture.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n texture.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n }\r\n\r\n if (hasInternalTextureUniqueId && !internalTexture) {\r\n texture?._texture?._setUniqueId(parsedTexture.internalTextureUniqueId);\r\n }\r\n };\r\n\r\n const texture = SerializationHelper.Parse(\r\n () => {\r\n let generateMipMaps: boolean = true;\r\n if (parsedTexture.noMipmap) {\r\n generateMipMaps = false;\r\n }\r\n if (parsedTexture.mirrorPlane) {\r\n const mirrorTexture = Texture._CreateMirror(parsedTexture.name, parsedTexture.renderTargetSize, scene, generateMipMaps);\r\n mirrorTexture._waitingRenderList = parsedTexture.renderList;\r\n mirrorTexture.mirrorPlane = Plane.FromArray(parsedTexture.mirrorPlane);\r\n onLoaded(mirrorTexture);\r\n return mirrorTexture;\r\n } else if (parsedTexture.isRenderTarget) {\r\n let renderTargetTexture: Nullable = null;\r\n if (parsedTexture.isCube) {\r\n // Search for an existing reflection probe (which contains a cube render target texture)\r\n if (scene.reflectionProbes) {\r\n for (let index = 0; index < scene.reflectionProbes.length; index++) {\r\n const probe = scene.reflectionProbes[index];\r\n if (probe.name === parsedTexture.name) {\r\n return probe.cubeTexture;\r\n }\r\n }\r\n }\r\n } else {\r\n renderTargetTexture = Texture._CreateRenderTargetTexture(\r\n parsedTexture.name,\r\n parsedTexture.renderTargetSize,\r\n scene,\r\n generateMipMaps,\r\n parsedTexture._creationFlags ?? 0\r\n );\r\n renderTargetTexture._waitingRenderList = parsedTexture.renderList;\r\n }\r\n onLoaded(renderTargetTexture);\r\n return renderTargetTexture;\r\n } else if (parsedTexture.isVideo) {\r\n const texture = Texture._CreateVideoTexture(\r\n rootUrl + (parsedTexture.url || parsedTexture.name),\r\n rootUrl + (parsedTexture.src || parsedTexture.url),\r\n scene,\r\n generateMipMaps,\r\n parsedTexture.invertY,\r\n parsedTexture.samplingMode,\r\n parsedTexture.settings || {}\r\n );\r\n onLoaded(texture);\r\n return texture;\r\n } else {\r\n let texture: Texture;\r\n\r\n if (parsedTexture.base64String && !internalTexture) {\r\n // name and url are the same to ensure caching happens from the actual base64 string\r\n texture = Texture.CreateFromBase64String(\r\n parsedTexture.base64String,\r\n parsedTexture.base64String,\r\n scene,\r\n !generateMipMaps,\r\n parsedTexture.invertY,\r\n parsedTexture.samplingMode,\r\n () => {\r\n onLoaded(texture);\r\n },\r\n parsedTexture._creationFlags ?? 0,\r\n parsedTexture._useSRGBBuffer ?? false\r\n );\r\n\r\n // prettier name to fit with the loaded data\r\n texture.name = parsedTexture.name;\r\n } else {\r\n let url: string;\r\n if (parsedTexture.name && (parsedTexture.name.indexOf(\"://\") > 0 || parsedTexture.name.startsWith(\"data:\"))) {\r\n url = parsedTexture.name;\r\n } else {\r\n url = rootUrl + parsedTexture.name;\r\n }\r\n\r\n if (parsedTexture.url && (parsedTexture.url.startsWith(\"data:\") || Texture.UseSerializedUrlIfAny)) {\r\n url = parsedTexture.url;\r\n }\r\n\r\n const options: ITextureCreationOptions = {\r\n noMipmap: !generateMipMaps,\r\n invertY: parsedTexture.invertY,\r\n samplingMode: parsedTexture.samplingMode,\r\n onLoad: () => {\r\n onLoaded(texture);\r\n },\r\n internalTexture,\r\n };\r\n\r\n texture = new Texture(url, scene, options);\r\n }\r\n\r\n return texture;\r\n }\r\n },\r\n parsedTexture,\r\n scene\r\n );\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * Creates a texture from its base 64 representation.\r\n * @param data Define the base64 payload without the data: prefix\r\n * @param name Define the name of the texture in the scene useful fo caching purpose for instance\r\n * @param scene Define the scene the texture should belong to\r\n * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture\r\n * @param invertY define if the texture needs to be inverted on the y axis during loading\r\n * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)\r\n * @param onLoad define a callback triggered when the texture has been loaded\r\n * @param onError define a callback triggered when an error occurred during the loading session\r\n * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @returns the created texture\r\n */\r\n public static CreateFromBase64String(\r\n data: string,\r\n name: string,\r\n scene: Scene,\r\n noMipmapOrOptions?: boolean | ITextureCreationOptions,\r\n invertY?: boolean,\r\n samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<() => void> = null,\r\n onError: Nullable<() => void> = null,\r\n format: number = Constants.TEXTUREFORMAT_RGBA,\r\n creationFlags?: number,\r\n forcedExtension?: string\r\n ): Texture {\r\n return new Texture(\r\n \"data:\" + name,\r\n scene,\r\n noMipmapOrOptions,\r\n invertY,\r\n samplingMode,\r\n onLoad,\r\n onError,\r\n data,\r\n false,\r\n format,\r\n undefined,\r\n undefined,\r\n creationFlags,\r\n forcedExtension\r\n );\r\n }\r\n\r\n /**\r\n * Creates a texture from its data: representation. (data: will be added in case only the payload has been passed in)\r\n * @param name Define the name of the texture in the scene useful fo caching purpose for instance\r\n * @param buffer define the buffer to load the texture from in case the texture is loaded from a buffer representation\r\n * @param scene Define the scene the texture should belong to\r\n * @param deleteBuffer define if the buffer we are loading the texture from should be deleted after load\r\n * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture\r\n * @param invertY define if the texture needs to be inverted on the y axis during loading\r\n * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)\r\n * @param onLoad define a callback triggered when the texture has been loaded\r\n * @param onError define a callback triggered when an error occurred during the loading session\r\n * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)\r\n * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @returns the created texture\r\n */\r\n public static LoadFromDataString(\r\n name: string,\r\n buffer: any,\r\n scene: Scene,\r\n deleteBuffer: boolean = false,\r\n noMipmapOrOptions?: boolean | ITextureCreationOptions,\r\n invertY: boolean = true,\r\n samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE,\r\n onLoad: Nullable<() => void> = null,\r\n onError: Nullable<(message?: string, exception?: any) => void> = null,\r\n format: number = Constants.TEXTUREFORMAT_RGBA,\r\n creationFlags?: number,\r\n forcedExtension?: string\r\n ): Texture {\r\n if (name.substr(0, 5) !== \"data:\") {\r\n name = \"data:\" + name;\r\n }\r\n\r\n return new Texture(\r\n name,\r\n scene,\r\n noMipmapOrOptions,\r\n invertY,\r\n samplingMode,\r\n onLoad,\r\n onError,\r\n buffer,\r\n deleteBuffer,\r\n format,\r\n undefined,\r\n undefined,\r\n creationFlags,\r\n forcedExtension\r\n );\r\n }\r\n}\r\n\r\n// References the dependencies.\r\nRegisterClass(\"BABYLON.Texture\", Texture);\r\nSerializationHelper._TextureParser = Texture.Parse;\r\n", "import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { InternalTexture, InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport type { ImageSource, Nullable } from \"../../types\";\r\nimport type { ICanvas } from \"../ICanvas\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Creates a dynamic texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default)\r\n * @returns the dynamic texture inside an InternalTexture\r\n */\r\n createDynamicTexture(width: number, height: number, generateMipMaps: boolean, samplingMode: number): InternalTexture;\r\n\r\n /**\r\n * Update the content of a dynamic texture\r\n * @param texture defines the texture to update\r\n * @param source defines the source containing the data\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param premulAlpha defines if alpha is stored as premultiplied\r\n * @param format defines the format of the data\r\n * @param forceBindTexture if the texture should be forced to be bound eg. after a graphics context loss (Default: false)\r\n * @param allowGPUOptimization true to allow some specific GPU optimizations (subject to engine feature \"allowGPUOptimizationsForGUI\" being true)\r\n */\r\n updateDynamicTexture(\r\n texture: Nullable,\r\n source: ImageSource | ICanvas,\r\n invertY?: boolean,\r\n premulAlpha?: boolean,\r\n format?: number,\r\n forceBindTexture?: boolean,\r\n allowGPUOptimization?: boolean\r\n ): void;\r\n }\r\n}\r\n\r\nThinEngine.prototype.createDynamicTexture = function (width: number, height: number, generateMipMaps: boolean, samplingMode: number): InternalTexture {\r\n const texture = new InternalTexture(this, InternalTextureSource.Dynamic);\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n\r\n if (generateMipMaps) {\r\n width = this.needPOTTextures ? ThinEngine.GetExponentOfTwo(width, this._caps.maxTextureSize) : width;\r\n height = this.needPOTTextures ? ThinEngine.GetExponentOfTwo(height, this._caps.maxTextureSize) : height;\r\n }\r\n\r\n // this.resetTextureCache();\r\n texture.width = width;\r\n texture.height = height;\r\n texture.isReady = false;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n\r\n this.updateTextureSamplingMode(samplingMode, texture);\r\n\r\n this._internalTexturesCache.push(texture);\r\n\r\n return texture;\r\n};\r\n\r\nThinEngine.prototype.updateDynamicTexture = function (\r\n texture: Nullable,\r\n source: ImageSource,\r\n invertY?: boolean,\r\n premulAlpha: boolean = false,\r\n format?: number,\r\n forceBindTexture: boolean = false,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n allowGPUOptimization: boolean = false\r\n): void {\r\n if (!texture) {\r\n return;\r\n }\r\n\r\n const gl = this._gl;\r\n const target = gl.TEXTURE_2D;\r\n\r\n const wasPreviouslyBound = this._bindTextureDirectly(target, texture, true, forceBindTexture);\r\n\r\n this._unpackFlipY(invertY === undefined ? texture.invertY : invertY);\r\n\r\n if (premulAlpha) {\r\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 1);\r\n }\r\n\r\n const textureType = this._getWebGLTextureType(texture.type);\r\n const glformat = this._getInternalFormat(format ? format : texture.format);\r\n const internalFormat = this._getRGBABufferInternalSizedFormat(texture.type, glformat);\r\n\r\n gl.texImage2D(target, 0, internalFormat, glformat, textureType, source as TexImageSource);\r\n\r\n if (texture.generateMipMaps) {\r\n gl.generateMipmap(target);\r\n }\r\n\r\n if (!wasPreviouslyBound) {\r\n this._bindTextureDirectly(target, null);\r\n }\r\n\r\n if (premulAlpha) {\r\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0);\r\n }\r\n\r\n if (format) {\r\n texture.format = format;\r\n }\r\n\r\n texture._dynamicTextureSource = source;\r\n texture._premulAlpha = premulAlpha;\r\n texture.invertY = invertY || false;\r\n texture.isReady = true;\r\n};\r\n", "import { Logger } from \"../../Misc/logger\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { ISize } from \"../../Maths/math.size\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport \"../../Engines/Extensions/engine.dynamicTexture\";\r\nimport type { ICanvas, ICanvasRenderingContext } from \"../../Engines/ICanvas\";\r\n\r\n/**\r\n * A class extending Texture allowing drawing on a texture\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/dynamicTexture\r\n */\r\nexport class DynamicTexture extends Texture {\r\n private _generateMipMaps: boolean;\r\n private _canvas: ICanvas;\r\n private _ownCanvas: boolean;\r\n private _context: ICanvasRenderingContext;\r\n\r\n /**\r\n * Creates a DynamicTexture\r\n * @param name defines the name of the texture\r\n * @param options provides 3 alternatives for width and height of texture, a canvas, object with width and height properties, number for both width and height\r\n * @param scene defines the scene where you want the texture\r\n * @param generateMipMaps defines the use of MinMaps or not (default is false)\r\n * @param samplingMode defines the sampling mode to use (default is Texture.TRILINEAR_SAMPLINGMODE)\r\n * @param format defines the texture format to use (default is Engine.TEXTUREFORMAT_RGBA)\r\n * @param invertY defines if the texture needs to be inverted on the y axis during loading\r\n */\r\n\r\n constructor(\r\n name: string,\r\n options: any,\r\n scene: Nullable = null,\r\n generateMipMaps: boolean = false,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n format: number = Constants.TEXTUREFORMAT_RGBA,\r\n invertY?: boolean\r\n ) {\r\n super(null, scene, !generateMipMaps, invertY, samplingMode, undefined, undefined, undefined, undefined, format);\r\n\r\n this.name = name;\r\n this.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n this.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n\r\n this._generateMipMaps = generateMipMaps;\r\n\r\n const engine = this._getEngine();\r\n if (!engine) {\r\n return;\r\n }\r\n\r\n if (options.getContext) {\r\n this._canvas = options;\r\n this._ownCanvas = false;\r\n this._texture = engine.createDynamicTexture(options.width, options.height, generateMipMaps, samplingMode);\r\n } else {\r\n this._canvas = engine.createCanvas(1, 1);\r\n this._ownCanvas = true;\r\n\r\n if (options.width || options.width === 0) {\r\n this._texture = engine.createDynamicTexture(options.width, options.height, generateMipMaps, samplingMode);\r\n } else {\r\n this._texture = engine.createDynamicTexture(options, options, generateMipMaps, samplingMode);\r\n }\r\n }\r\n\r\n const textureSize = this.getSize();\r\n\r\n if (this._canvas.width !== textureSize.width) {\r\n this._canvas.width = textureSize.width;\r\n }\r\n if (this._canvas.height !== textureSize.height) {\r\n this._canvas.height = textureSize.height;\r\n }\r\n this._context = this._canvas.getContext(\"2d\");\r\n }\r\n\r\n /**\r\n * Get the current class name of the texture useful for serialization or dynamic coding.\r\n * @returns \"DynamicTexture\"\r\n */\r\n public getClassName(): string {\r\n return \"DynamicTexture\";\r\n }\r\n\r\n /**\r\n * Gets the current state of canRescale\r\n */\r\n public get canRescale(): boolean {\r\n return true;\r\n }\r\n\r\n private _recreate(textureSize: ISize): void {\r\n this._canvas.width = textureSize.width;\r\n this._canvas.height = textureSize.height;\r\n\r\n this.releaseInternalTexture();\r\n\r\n this._texture = this._getEngine()!.createDynamicTexture(textureSize.width, textureSize.height, this._generateMipMaps, this.samplingMode);\r\n }\r\n\r\n /**\r\n * Scales the texture\r\n * @param ratio the scale factor to apply to both width and height\r\n */\r\n public scale(ratio: number): void {\r\n const textureSize = this.getSize();\r\n\r\n textureSize.width *= ratio;\r\n textureSize.height *= ratio;\r\n\r\n this._recreate(textureSize);\r\n }\r\n\r\n /**\r\n * Resizes the texture\r\n * @param width the new width\r\n * @param height the new height\r\n */\r\n public scaleTo(width: number, height: number): void {\r\n const textureSize = this.getSize();\r\n\r\n textureSize.width = width;\r\n textureSize.height = height;\r\n\r\n this._recreate(textureSize);\r\n }\r\n\r\n /**\r\n * Gets the context of the canvas used by the texture\r\n * @returns the canvas context of the dynamic texture\r\n */\r\n public getContext(): ICanvasRenderingContext {\r\n return this._context;\r\n }\r\n\r\n /**\r\n * Clears the texture\r\n * @param clearColor Defines the clear color to use\r\n */\r\n public clear(clearColor?: string): void {\r\n const size = this.getSize();\r\n if (clearColor) {\r\n this._context.fillStyle = clearColor;\r\n }\r\n this._context.clearRect(0, 0, size.width, size.height);\r\n }\r\n\r\n /**\r\n * Updates the texture\r\n * @param invertY defines the direction for the Y axis (default is true - y increases downwards)\r\n * @param premulAlpha defines if alpha is stored as premultiplied (default is false)\r\n * @param allowGPUOptimization true to allow some specific GPU optimizations (subject to engine feature \"allowGPUOptimizationsForGUI\" being true)\r\n */\r\n public update(invertY?: boolean, premulAlpha = false, allowGPUOptimization = false): void {\r\n this._getEngine()!.updateDynamicTexture(\r\n this._texture,\r\n this._canvas,\r\n invertY === undefined ? true : invertY,\r\n premulAlpha,\r\n this._format || undefined,\r\n undefined,\r\n allowGPUOptimization\r\n );\r\n }\r\n\r\n /**\r\n * Draws text onto the texture\r\n * @param text defines the text to be drawn\r\n * @param x defines the placement of the text from the left\r\n * @param y defines the placement of the text from the top when invertY is true and from the bottom when false\r\n * @param font defines the font to be used with font-style, font-size, font-name\r\n * @param color defines the color used for the text\r\n * @param fillColor defines the color for the canvas, use null to not overwrite canvas (this bleands with the background to replace, use the clear function)\r\n * @param invertY defines the direction for the Y axis (default is true - y increases downwards)\r\n * @param update defines whether texture is immediately update (default is true)\r\n */\r\n public drawText(\r\n text: string,\r\n x: number | null | undefined,\r\n y: number | null | undefined,\r\n font: string,\r\n color: string | null,\r\n fillColor: string | null,\r\n invertY?: boolean,\r\n update = true\r\n ) {\r\n const size = this.getSize();\r\n if (fillColor) {\r\n this._context.fillStyle = fillColor;\r\n this._context.fillRect(0, 0, size.width, size.height);\r\n }\r\n\r\n this._context.font = font;\r\n if (x === null || x === undefined) {\r\n const textSize = this._context.measureText(text);\r\n x = (size.width - textSize.width) / 2;\r\n }\r\n if (y === null || y === undefined) {\r\n const fontSize = parseInt(font.replace(/\\D/g, \"\"));\r\n y = size.height / 2 + fontSize / 3.65;\r\n }\r\n\r\n this._context.fillStyle = color || \"\";\r\n this._context.fillText(text, x, y);\r\n\r\n if (update) {\r\n this.update(invertY);\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the dynamic texture.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n\r\n if (this._ownCanvas) {\r\n this._canvas?.remove?.();\r\n }\r\n (this._canvas as any) = null;\r\n (this._context as any) = null;\r\n }\r\n\r\n /**\r\n * Clones the texture\r\n * @returns the clone of the texture.\r\n */\r\n public clone(): DynamicTexture {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return this;\r\n }\r\n\r\n const textureSize = this.getSize();\r\n const newTexture = new DynamicTexture(this.name, textureSize, scene, this._generateMipMaps);\r\n\r\n // Base texture\r\n newTexture.hasAlpha = this.hasAlpha;\r\n newTexture.level = this.level;\r\n\r\n // Dynamic Texture\r\n newTexture.wrapU = this.wrapU;\r\n newTexture.wrapV = this.wrapV;\r\n\r\n return newTexture;\r\n }\r\n\r\n /**\r\n * Serializes the dynamic texture. The scene should be ready before the dynamic texture is serialized\r\n * @returns a serialized dynamic texture object\r\n */\r\n public serialize(): any {\r\n const scene = this.getScene();\r\n if (scene && !scene.isReady()) {\r\n Logger.Warn(\"The scene must be ready before serializing the dynamic texture\");\r\n }\r\n\r\n const serializationObject = super.serialize();\r\n if (DynamicTexture._IsCanvasElement(this._canvas)) {\r\n serializationObject.base64String = this._canvas.toDataURL();\r\n }\r\n\r\n serializationObject.invertY = this._invertY;\r\n serializationObject.samplingMode = this.samplingMode;\r\n\r\n return serializationObject;\r\n }\r\n\r\n private static _IsCanvasElement(canvas: HTMLCanvasElement | OffscreenCanvas | ICanvas): canvas is HTMLCanvasElement {\r\n return (canvas as HTMLCanvasElement).toDataURL !== undefined;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n this.update();\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n/** Defines the cross module used constants to avoid circular dependencies */\r\nexport class Constants {\r\n /** Defines that alpha blending is disabled */\r\n public static readonly ALPHA_DISABLE = 0;\r\n /** Defines that alpha blending is SRC ALPHA * SRC + DEST */\r\n public static readonly ALPHA_ADD = 1;\r\n /** Defines that alpha blending is SRC ALPHA * SRC + (1 - SRC ALPHA) * DEST */\r\n public static readonly ALPHA_COMBINE = 2;\r\n /** Defines that alpha blending is DEST - SRC * DEST */\r\n public static readonly ALPHA_SUBTRACT = 3;\r\n /** Defines that alpha blending is SRC * DEST */\r\n public static readonly ALPHA_MULTIPLY = 4;\r\n /** Defines that alpha blending is SRC ALPHA * SRC + (1 - SRC) * DEST */\r\n public static readonly ALPHA_MAXIMIZED = 5;\r\n /** Defines that alpha blending is SRC + DEST */\r\n public static readonly ALPHA_ONEONE = 6;\r\n /** Defines that alpha blending is SRC + (1 - SRC ALPHA) * DEST */\r\n public static readonly ALPHA_PREMULTIPLIED = 7;\r\n /**\r\n * Defines that alpha blending is SRC + (1 - SRC ALPHA) * DEST\r\n * Alpha will be set to (1 - SRC ALPHA) * DEST ALPHA\r\n */\r\n public static readonly ALPHA_PREMULTIPLIED_PORTERDUFF = 8;\r\n /** Defines that alpha blending is CST * SRC + (1 - CST) * DEST */\r\n public static readonly ALPHA_INTERPOLATE = 9;\r\n /**\r\n * Defines that alpha blending is SRC + (1 - SRC) * DEST\r\n * Alpha will be set to SRC ALPHA + (1 - SRC ALPHA) * DEST ALPHA\r\n */\r\n public static readonly ALPHA_SCREENMODE = 10;\r\n /**\r\n * Defines that alpha blending is SRC + DST\r\n * Alpha will be set to SRC ALPHA + DST ALPHA\r\n */\r\n public static readonly ALPHA_ONEONE_ONEONE = 11;\r\n /**\r\n * Defines that alpha blending is SRC * DST ALPHA + DST\r\n * Alpha will be set to 0\r\n */\r\n public static readonly ALPHA_ALPHATOCOLOR = 12;\r\n /**\r\n * Defines that alpha blending is SRC * (1 - DST) + DST * (1 - SRC)\r\n */\r\n public static readonly ALPHA_REVERSEONEMINUS = 13;\r\n /**\r\n * Defines that alpha blending is SRC + DST * (1 - SRC ALPHA)\r\n * Alpha will be set to SRC ALPHA + DST ALPHA * (1 - SRC ALPHA)\r\n */\r\n public static readonly ALPHA_SRC_DSTONEMINUSSRCALPHA = 14;\r\n /**\r\n * Defines that alpha blending is SRC + DST\r\n * Alpha will be set to SRC ALPHA\r\n */\r\n public static readonly ALPHA_ONEONE_ONEZERO = 15;\r\n /**\r\n * Defines that alpha blending is SRC * (1 - DST) + DST * (1 - SRC)\r\n * Alpha will be set to DST ALPHA\r\n */\r\n public static readonly ALPHA_EXCLUSION = 16;\r\n /**\r\n * Defines that alpha blending is SRC * SRC ALPHA + DST * (1 - SRC ALPHA)\r\n * Alpha will be set to SRC ALPHA + (1 - SRC ALPHA) * DST ALPHA\r\n */\r\n public static readonly ALPHA_LAYER_ACCUMULATE = 17;\r\n\r\n /** Defines that alpha blending equation a SUM */\r\n public static readonly ALPHA_EQUATION_ADD = 0;\r\n /** Defines that alpha blending equation a SUBSTRACTION */\r\n public static readonly ALPHA_EQUATION_SUBSTRACT = 1;\r\n /** Defines that alpha blending equation a REVERSE SUBSTRACTION */\r\n public static readonly ALPHA_EQUATION_REVERSE_SUBTRACT = 2;\r\n /** Defines that alpha blending equation a MAX operation */\r\n public static readonly ALPHA_EQUATION_MAX = 3;\r\n /** Defines that alpha blending equation a MIN operation */\r\n public static readonly ALPHA_EQUATION_MIN = 4;\r\n /**\r\n * Defines that alpha blending equation a DARKEN operation:\r\n * It takes the min of the src and sums the alpha channels.\r\n */\r\n public static readonly ALPHA_EQUATION_DARKEN = 5;\r\n\r\n /** Defines that the resource is not delayed*/\r\n public static readonly DELAYLOADSTATE_NONE = 0;\r\n /** Defines that the resource was successfully delay loaded */\r\n public static readonly DELAYLOADSTATE_LOADED = 1;\r\n /** Defines that the resource is currently delay loading */\r\n public static readonly DELAYLOADSTATE_LOADING = 2;\r\n /** Defines that the resource is delayed and has not started loading */\r\n public static readonly DELAYLOADSTATE_NOTLOADED = 4;\r\n\r\n // Depth or Stencil test Constants.\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will never pass. i.e. Nothing will be drawn */\r\n public static readonly NEVER = 0x0200;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will always pass. i.e. Pixels will be drawn in the order they are drawn */\r\n public static readonly ALWAYS = 0x0207;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than the stored value */\r\n public static readonly LESS = 0x0201;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is equals to the stored value */\r\n public static readonly EQUAL = 0x0202;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than or equal to the stored value */\r\n public static readonly LEQUAL = 0x0203;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than the stored value */\r\n public static readonly GREATER = 0x0204;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than or equal to the stored value */\r\n public static readonly GEQUAL = 0x0206;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is not equal to the stored value */\r\n public static readonly NOTEQUAL = 0x0205;\r\n\r\n // Stencil Actions Constants.\r\n /** Passed to stencilOperation to specify that stencil value must be kept */\r\n public static readonly KEEP = 0x1e00;\r\n /** Passed to stencilOperation to specify that stencil value must be zero */\r\n public static readonly ZERO = 0x0000;\r\n /** Passed to stencilOperation to specify that stencil value must be replaced */\r\n public static readonly REPLACE = 0x1e01;\r\n /** Passed to stencilOperation to specify that stencil value must be incremented */\r\n public static readonly INCR = 0x1e02;\r\n /** Passed to stencilOperation to specify that stencil value must be decremented */\r\n public static readonly DECR = 0x1e03;\r\n /** Passed to stencilOperation to specify that stencil value must be inverted */\r\n public static readonly INVERT = 0x150a;\r\n /** Passed to stencilOperation to specify that stencil value must be incremented with wrapping */\r\n public static readonly INCR_WRAP = 0x8507;\r\n /** Passed to stencilOperation to specify that stencil value must be decremented with wrapping */\r\n public static readonly DECR_WRAP = 0x8508;\r\n\r\n /** Texture is not repeating outside of 0..1 UVs */\r\n public static readonly TEXTURE_CLAMP_ADDRESSMODE = 0;\r\n /** Texture is repeating outside of 0..1 UVs */\r\n public static readonly TEXTURE_WRAP_ADDRESSMODE = 1;\r\n /** Texture is repeating and mirrored */\r\n public static readonly TEXTURE_MIRROR_ADDRESSMODE = 2;\r\n\r\n /** Flag to create a storage texture */\r\n public static readonly TEXTURE_CREATIONFLAG_STORAGE = 1;\r\n\r\n /** ALPHA */\r\n public static readonly TEXTUREFORMAT_ALPHA = 0;\r\n /** LUMINANCE */\r\n public static readonly TEXTUREFORMAT_LUMINANCE = 1;\r\n /** LUMINANCE_ALPHA */\r\n public static readonly TEXTUREFORMAT_LUMINANCE_ALPHA = 2;\r\n /** RGB */\r\n public static readonly TEXTUREFORMAT_RGB = 4;\r\n /** RGBA */\r\n public static readonly TEXTUREFORMAT_RGBA = 5;\r\n /** RED */\r\n public static readonly TEXTUREFORMAT_RED = 6;\r\n /** RED (2nd reference) */\r\n public static readonly TEXTUREFORMAT_R = 6;\r\n /** RG */\r\n public static readonly TEXTUREFORMAT_RG = 7;\r\n /** RED_INTEGER */\r\n public static readonly TEXTUREFORMAT_RED_INTEGER = 8;\r\n /** RED_INTEGER (2nd reference) */\r\n public static readonly TEXTUREFORMAT_R_INTEGER = 8;\r\n /** RG_INTEGER */\r\n public static readonly TEXTUREFORMAT_RG_INTEGER = 9;\r\n /** RGB_INTEGER */\r\n public static readonly TEXTUREFORMAT_RGB_INTEGER = 10;\r\n /** RGBA_INTEGER */\r\n public static readonly TEXTUREFORMAT_RGBA_INTEGER = 11;\r\n /** BGRA */\r\n public static readonly TEXTUREFORMAT_BGRA = 12;\r\n\r\n /** Depth 24 bits + Stencil 8 bits */\r\n public static readonly TEXTUREFORMAT_DEPTH24_STENCIL8 = 13;\r\n /** Depth 32 bits float */\r\n public static readonly TEXTUREFORMAT_DEPTH32_FLOAT = 14;\r\n /** Depth 16 bits */\r\n public static readonly TEXTUREFORMAT_DEPTH16 = 15;\r\n /** Depth 24 bits */\r\n public static readonly TEXTUREFORMAT_DEPTH24 = 16;\r\n /** Depth 24 bits unorm + Stencil 8 bits */\r\n public static readonly TEXTUREFORMAT_DEPTH24UNORM_STENCIL8 = 17;\r\n /** Depth 32 bits float + Stencil 8 bits */\r\n public static readonly TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8 = 18;\r\n /** Stencil 8 bits */\r\n public static readonly TEXTUREFORMAT_STENCIL8 = 19;\r\n /** UNDEFINED */\r\n public static readonly TEXTUREFORMAT_UNDEFINED = 0xffffffff;\r\n\r\n /** Compressed BC7 */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGBA_BPTC_UNORM = 36492;\r\n /** Compressed BC7 (SRGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 36493;\r\n /** Compressed BC6 unsigned float */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 36495;\r\n /** Compressed BC6 signed float */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 36494;\r\n /** Compressed BC3 */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT5 = 33779;\r\n /** Compressed BC3 (SRGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 35919;\r\n /** Compressed BC2 */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT3 = 33778;\r\n /** Compressed BC2 (SRGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 35918;\r\n /** Compressed BC1 (RGBA) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT1 = 33777;\r\n /** Compressed BC1 (RGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGB_S3TC_DXT1 = 33776;\r\n /** Compressed BC1 (SRGB+A) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 35917;\r\n /** Compressed BC1 (SRGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB_S3TC_DXT1_EXT = 35916;\r\n /** Compressed ASTC 4x4 */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGBA_ASTC_4x4 = 37808;\r\n /** Compressed ASTC 4x4 (SRGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 37840;\r\n /** Compressed ETC1 (RGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGB_ETC1_WEBGL = 36196;\r\n /** Compressed ETC2 (RGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGB8_ETC2 = 37492;\r\n /** Compressed ETC2 (SRGB) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB8_ETC2 = 37493;\r\n /** Compressed ETC2 (RGB+A1) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 37494;\r\n /** Compressed ETC2 (SRGB+A1)*/\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 37495;\r\n /** Compressed ETC2 (RGB+A) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_RGBA8_ETC2_EAC = 37496;\r\n /** Compressed ETC2 (SRGB+1) */\r\n public static readonly TEXTUREFORMAT_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 37497;\r\n\r\n /** UNSIGNED_BYTE */\r\n public static readonly TEXTURETYPE_UNSIGNED_BYTE = 0;\r\n /** UNSIGNED_BYTE (2nd reference) */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT = 0;\r\n /** FLOAT */\r\n public static readonly TEXTURETYPE_FLOAT = 1;\r\n /** HALF_FLOAT */\r\n public static readonly TEXTURETYPE_HALF_FLOAT = 2;\r\n /** BYTE */\r\n public static readonly TEXTURETYPE_BYTE = 3;\r\n /** SHORT */\r\n public static readonly TEXTURETYPE_SHORT = 4;\r\n /** UNSIGNED_SHORT */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT = 5;\r\n /** INT */\r\n public static readonly TEXTURETYPE_INT = 6;\r\n /** UNSIGNED_INT */\r\n public static readonly TEXTURETYPE_UNSIGNED_INTEGER = 7;\r\n /** UNSIGNED_SHORT_4_4_4_4 */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4 = 8;\r\n /** UNSIGNED_SHORT_5_5_5_1 */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1 = 9;\r\n /** UNSIGNED_SHORT_5_6_5 */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT_5_6_5 = 10;\r\n /** UNSIGNED_INT_2_10_10_10_REV */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV = 11;\r\n /** UNSIGNED_INT_24_8 */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_24_8 = 12;\r\n /** UNSIGNED_INT_10F_11F_11F_REV */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV = 13;\r\n /** UNSIGNED_INT_5_9_9_9_REV */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV = 14;\r\n /** FLOAT_32_UNSIGNED_INT_24_8_REV */\r\n public static readonly TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV = 15;\r\n /** UNDEFINED */\r\n public static readonly TEXTURETYPE_UNDEFINED = 16;\r\n\r\n /** 2D Texture target*/\r\n public static readonly TEXTURE_2D = 3553;\r\n /** 2D Array Texture target */\r\n public static readonly TEXTURE_2D_ARRAY = 35866;\r\n /** Cube Map Texture target */\r\n public static readonly TEXTURE_CUBE_MAP = 34067;\r\n /** Cube Map Array Texture target */\r\n public static readonly TEXTURE_CUBE_MAP_ARRAY = 0xdeadbeef;\r\n /** 3D Texture target */\r\n public static readonly TEXTURE_3D = 32879;\r\n\r\n /** nearest is mag = nearest and min = nearest and no mip */\r\n public static readonly TEXTURE_NEAREST_SAMPLINGMODE = 1;\r\n /** mag = nearest and min = nearest and mip = none */\r\n public static readonly TEXTURE_NEAREST_NEAREST = 1;\r\n\r\n /** Bilinear is mag = linear and min = linear and no mip */\r\n public static readonly TEXTURE_BILINEAR_SAMPLINGMODE = 2;\r\n /** mag = linear and min = linear and mip = none */\r\n public static readonly TEXTURE_LINEAR_LINEAR = 2;\r\n\r\n /** Trilinear is mag = linear and min = linear and mip = linear */\r\n public static readonly TEXTURE_TRILINEAR_SAMPLINGMODE = 3;\r\n /** Trilinear is mag = linear and min = linear and mip = linear */\r\n public static readonly TEXTURE_LINEAR_LINEAR_MIPLINEAR = 3;\r\n\r\n /** mag = nearest and min = nearest and mip = nearest */\r\n public static readonly TEXTURE_NEAREST_NEAREST_MIPNEAREST = 4;\r\n /** mag = nearest and min = linear and mip = nearest */\r\n public static readonly TEXTURE_NEAREST_LINEAR_MIPNEAREST = 5;\r\n /** mag = nearest and min = linear and mip = linear */\r\n public static readonly TEXTURE_NEAREST_LINEAR_MIPLINEAR = 6;\r\n /** mag = nearest and min = linear and mip = none */\r\n public static readonly TEXTURE_NEAREST_LINEAR = 7;\r\n /** nearest is mag = nearest and min = nearest and mip = linear */\r\n public static readonly TEXTURE_NEAREST_NEAREST_MIPLINEAR = 8;\r\n /** mag = linear and min = nearest and mip = nearest */\r\n public static readonly TEXTURE_LINEAR_NEAREST_MIPNEAREST = 9;\r\n /** mag = linear and min = nearest and mip = linear */\r\n public static readonly TEXTURE_LINEAR_NEAREST_MIPLINEAR = 10;\r\n /** Bilinear is mag = linear and min = linear and mip = nearest */\r\n public static readonly TEXTURE_LINEAR_LINEAR_MIPNEAREST = 11;\r\n /** mag = linear and min = nearest and mip = none */\r\n public static readonly TEXTURE_LINEAR_NEAREST = 12;\r\n\r\n /** Explicit coordinates mode */\r\n public static readonly TEXTURE_EXPLICIT_MODE = 0;\r\n /** Spherical coordinates mode */\r\n public static readonly TEXTURE_SPHERICAL_MODE = 1;\r\n /** Planar coordinates mode */\r\n public static readonly TEXTURE_PLANAR_MODE = 2;\r\n /** Cubic coordinates mode */\r\n public static readonly TEXTURE_CUBIC_MODE = 3;\r\n /** Projection coordinates mode */\r\n public static readonly TEXTURE_PROJECTION_MODE = 4;\r\n /** Skybox coordinates mode */\r\n public static readonly TEXTURE_SKYBOX_MODE = 5;\r\n /** Inverse Cubic coordinates mode */\r\n public static readonly TEXTURE_INVCUBIC_MODE = 6;\r\n /** Equirectangular coordinates mode */\r\n public static readonly TEXTURE_EQUIRECTANGULAR_MODE = 7;\r\n /** Equirectangular Fixed coordinates mode */\r\n public static readonly TEXTURE_FIXED_EQUIRECTANGULAR_MODE = 8;\r\n /** Equirectangular Fixed Mirrored coordinates mode */\r\n public static readonly TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9;\r\n\r\n /** Offline (baking) quality for texture filtering */\r\n public static readonly TEXTURE_FILTERING_QUALITY_OFFLINE = 4096;\r\n\r\n /** High quality for texture filtering */\r\n public static readonly TEXTURE_FILTERING_QUALITY_HIGH = 64;\r\n\r\n /** Medium quality for texture filtering */\r\n public static readonly TEXTURE_FILTERING_QUALITY_MEDIUM = 16;\r\n\r\n /** Low quality for texture filtering */\r\n public static readonly TEXTURE_FILTERING_QUALITY_LOW = 8;\r\n\r\n // Texture rescaling mode\r\n /** Defines that texture rescaling will use a floor to find the closer power of 2 size */\r\n public static readonly SCALEMODE_FLOOR = 1;\r\n /** Defines that texture rescaling will look for the nearest power of 2 size */\r\n public static readonly SCALEMODE_NEAREST = 2;\r\n /** Defines that texture rescaling will use a ceil to find the closer power of 2 size */\r\n public static readonly SCALEMODE_CEILING = 3;\r\n\r\n /**\r\n * The dirty texture flag value\r\n */\r\n public static readonly MATERIAL_TextureDirtyFlag = 1;\r\n /**\r\n * The dirty light flag value\r\n */\r\n public static readonly MATERIAL_LightDirtyFlag = 2;\r\n /**\r\n * The dirty fresnel flag value\r\n */\r\n public static readonly MATERIAL_FresnelDirtyFlag = 4;\r\n /**\r\n * The dirty attribute flag value\r\n */\r\n public static readonly MATERIAL_AttributesDirtyFlag = 8;\r\n /**\r\n * The dirty misc flag value\r\n */\r\n public static readonly MATERIAL_MiscDirtyFlag = 16;\r\n /**\r\n * The dirty prepass flag value\r\n */\r\n public static readonly MATERIAL_PrePassDirtyFlag = 32;\r\n /**\r\n * The all dirty flag value\r\n */\r\n public static readonly MATERIAL_AllDirtyFlag = 63;\r\n\r\n /**\r\n * Returns the triangle fill mode\r\n */\r\n public static readonly MATERIAL_TriangleFillMode = 0;\r\n /**\r\n * Returns the wireframe mode\r\n */\r\n public static readonly MATERIAL_WireFrameFillMode = 1;\r\n /**\r\n * Returns the point fill mode\r\n */\r\n public static readonly MATERIAL_PointFillMode = 2;\r\n /**\r\n * Returns the point list draw mode\r\n */\r\n public static readonly MATERIAL_PointListDrawMode = 3;\r\n /**\r\n * Returns the line list draw mode\r\n */\r\n public static readonly MATERIAL_LineListDrawMode = 4;\r\n /**\r\n * Returns the line loop draw mode\r\n */\r\n public static readonly MATERIAL_LineLoopDrawMode = 5;\r\n /**\r\n * Returns the line strip draw mode\r\n */\r\n public static readonly MATERIAL_LineStripDrawMode = 6;\r\n\r\n /**\r\n * Returns the triangle strip draw mode\r\n */\r\n public static readonly MATERIAL_TriangleStripDrawMode = 7;\r\n /**\r\n * Returns the triangle fan draw mode\r\n */\r\n public static readonly MATERIAL_TriangleFanDrawMode = 8;\r\n\r\n /**\r\n * Stores the clock-wise side orientation\r\n */\r\n public static readonly MATERIAL_ClockWiseSideOrientation = 0;\r\n /**\r\n * Stores the counter clock-wise side orientation\r\n */\r\n public static readonly MATERIAL_CounterClockWiseSideOrientation = 1;\r\n\r\n /**\r\n * Nothing\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_NothingTrigger = 0;\r\n /**\r\n * On pick\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnPickTrigger = 1;\r\n /**\r\n * On left pick\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnLeftPickTrigger = 2;\r\n /**\r\n * On right pick\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnRightPickTrigger = 3;\r\n /**\r\n * On center pick\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnCenterPickTrigger = 4;\r\n /**\r\n * On pick down\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnPickDownTrigger = 5;\r\n /**\r\n * On double pick\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnDoublePickTrigger = 6;\r\n /**\r\n * On pick up\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnPickUpTrigger = 7;\r\n /**\r\n * On pick out.\r\n * This trigger will only be raised if you also declared a OnPickDown\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnPickOutTrigger = 16;\r\n /**\r\n * On long press\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnLongPressTrigger = 8;\r\n /**\r\n * On pointer over\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnPointerOverTrigger = 9;\r\n /**\r\n * On pointer out\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnPointerOutTrigger = 10;\r\n /**\r\n * On every frame\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnEveryFrameTrigger = 11;\r\n /**\r\n * On intersection enter\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnIntersectionEnterTrigger = 12;\r\n /**\r\n * On intersection exit\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnIntersectionExitTrigger = 13;\r\n /**\r\n * On key down\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnKeyDownTrigger = 14;\r\n /**\r\n * On key up\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers\r\n */\r\n public static readonly ACTION_OnKeyUpTrigger = 15;\r\n\r\n /**\r\n * Billboard mode will only apply to Y axis\r\n */\r\n public static readonly PARTICLES_BILLBOARDMODE_Y = 2;\r\n /**\r\n * Billboard mode will apply to all axes\r\n */\r\n public static readonly PARTICLES_BILLBOARDMODE_ALL = 7;\r\n /**\r\n * Special billboard mode where the particle will be biilboard to the camera but rotated to align with direction\r\n */\r\n public static readonly PARTICLES_BILLBOARDMODE_STRETCHED = 8;\r\n /**\r\n * Special billboard mode where the particle will be billboard to the camera but only around the axis of the direction of particle emission\r\n */\r\n public static readonly PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL = 9;\r\n\r\n /** Default culling strategy : this is an exclusion test and it's the more accurate.\r\n * Test order :\r\n * Is the bounding sphere outside the frustum ?\r\n * If not, are the bounding box vertices outside the frustum ?\r\n * It not, then the cullable object is in the frustum.\r\n */\r\n public static readonly MESHES_CULLINGSTRATEGY_STANDARD = 0;\r\n /** Culling strategy : Bounding Sphere Only.\r\n * This is an exclusion test. It's faster than the standard strategy because the bounding box is not tested.\r\n * It's also less accurate than the standard because some not visible objects can still be selected.\r\n * Test : is the bounding sphere outside the frustum ?\r\n * If not, then the cullable object is in the frustum.\r\n */\r\n public static readonly MESHES_CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY = 1;\r\n /** Culling strategy : Optimistic Inclusion.\r\n * This in an inclusion test first, then the standard exclusion test.\r\n * This can be faster when a cullable object is expected to be almost always in the camera frustum.\r\n * This could also be a little slower than the standard test when the tested object center is not the frustum but one of its bounding box vertex is still inside.\r\n * Anyway, it's as accurate as the standard strategy.\r\n * Test :\r\n * Is the cullable object bounding sphere center in the frustum ?\r\n * If not, apply the default culling strategy.\r\n */\r\n public static readonly MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION = 2;\r\n /** Culling strategy : Optimistic Inclusion then Bounding Sphere Only.\r\n * This in an inclusion test first, then the bounding sphere only exclusion test.\r\n * This can be the fastest test when a cullable object is expected to be almost always in the camera frustum.\r\n * This could also be a little slower than the BoundingSphereOnly strategy when the tested object center is not in the frustum but its bounding sphere still intersects it.\r\n * It's less accurate than the standard strategy and as accurate as the BoundingSphereOnly strategy.\r\n * Test :\r\n * Is the cullable object bounding sphere center in the frustum ?\r\n * If not, apply the Bounding Sphere Only strategy. No Bounding Box is tested here.\r\n */\r\n public static readonly MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY = 3;\r\n\r\n /**\r\n * No logging while loading\r\n */\r\n public static readonly SCENELOADER_NO_LOGGING = 0;\r\n /**\r\n * Minimal logging while loading\r\n */\r\n public static readonly SCENELOADER_MINIMAL_LOGGING = 1;\r\n /**\r\n * Summary logging while loading\r\n */\r\n public static readonly SCENELOADER_SUMMARY_LOGGING = 2;\r\n /**\r\n * Detailed logging while loading\r\n */\r\n public static readonly SCENELOADER_DETAILED_LOGGING = 3;\r\n\r\n /**\r\n * Constant used to retrieve the irradiance texture index in the textures array in the prepass\r\n * using getIndex(Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE)\r\n */\r\n public static readonly PREPASS_IRRADIANCE_TEXTURE_TYPE = 0;\r\n /**\r\n * Constant used to retrieve the position texture index in the textures array in the prepass\r\n * using getIndex(Constants.PREPASS_POSITION_TEXTURE_INDEX)\r\n */\r\n public static readonly PREPASS_POSITION_TEXTURE_TYPE = 1;\r\n /**\r\n * Constant used to retrieve the velocity texture index in the textures array in the prepass\r\n * using getIndex(Constants.PREPASS_VELOCITY_TEXTURE_INDEX)\r\n */\r\n public static readonly PREPASS_VELOCITY_TEXTURE_TYPE = 2;\r\n /**\r\n * Constant used to retrieve the reflectivity texture index in the textures array in the prepass\r\n * using the getIndex(Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE)\r\n */\r\n public static readonly PREPASS_REFLECTIVITY_TEXTURE_TYPE = 3;\r\n /**\r\n * Constant used to retrieve the lit color texture index in the textures array in the prepass\r\n * using the getIndex(Constants.PREPASS_COLOR_TEXTURE_TYPE)\r\n */\r\n public static readonly PREPASS_COLOR_TEXTURE_TYPE = 4;\r\n /**\r\n * Constant used to retrieve depth index in the textures array in the prepass\r\n * using the getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)\r\n */\r\n public static readonly PREPASS_DEPTH_TEXTURE_TYPE = 5;\r\n /**\r\n * Constant used to retrieve normal index in the textures array in the prepass\r\n * using the getIndex(Constants.PREPASS_NORMAL_TEXTURE_TYPE)\r\n */\r\n public static readonly PREPASS_NORMAL_TEXTURE_TYPE = 6;\r\n /**\r\n * Constant used to retrieve albedo index in the textures array in the prepass\r\n * using the getIndex(Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE)\r\n */\r\n public static readonly PREPASS_ALBEDO_SQRT_TEXTURE_TYPE = 7;\r\n\r\n /** Flag to create a readable buffer (the buffer can be the source of a copy) */\r\n public static readonly BUFFER_CREATIONFLAG_READ = 1;\r\n /** Flag to create a writable buffer (the buffer can be the destination of a copy) */\r\n public static readonly BUFFER_CREATIONFLAG_WRITE = 2;\r\n /** Flag to create a readable and writable buffer */\r\n public static readonly BUFFER_CREATIONFLAG_READWRITE = 3;\r\n /** Flag to create a buffer suitable to be used as a uniform buffer */\r\n public static readonly BUFFER_CREATIONFLAG_UNIFORM = 4;\r\n /** Flag to create a buffer suitable to be used as a vertex buffer */\r\n public static readonly BUFFER_CREATIONFLAG_VERTEX = 8;\r\n /** Flag to create a buffer suitable to be used as an index buffer */\r\n public static readonly BUFFER_CREATIONFLAG_INDEX = 16;\r\n /** Flag to create a buffer suitable to be used as a storage buffer */\r\n public static readonly BUFFER_CREATIONFLAG_STORAGE = 32;\r\n\r\n /**\r\n * Prefixes used by the engine for sub mesh draw wrappers\r\n */\r\n\r\n /** @internal */\r\n public static readonly RENDERPASS_MAIN = 0;\r\n\r\n /**\r\n * Constant used as key code for Alt key\r\n */\r\n public static readonly INPUT_ALT_KEY = 18;\r\n\r\n /**\r\n * Constant used as key code for Ctrl key\r\n */\r\n public static readonly INPUT_CTRL_KEY = 17;\r\n\r\n /**\r\n * Constant used as key code for Meta key (Left Win, Left Cmd)\r\n */\r\n public static readonly INPUT_META_KEY1 = 91;\r\n\r\n /**\r\n * Constant used as key code for Meta key (Right Win)\r\n */\r\n public static readonly INPUT_META_KEY2 = 92;\r\n\r\n /**\r\n * Constant used as key code for Meta key (Right Win, Right Cmd)\r\n */\r\n public static readonly INPUT_META_KEY3 = 93;\r\n\r\n /**\r\n * Constant used as key code for Shift key\r\n */\r\n public static readonly INPUT_SHIFT_KEY = 16;\r\n\r\n /** Standard snapshot rendering. In this mode, some form of dynamic behavior is possible (for eg, uniform buffers are still updated) */\r\n public static readonly SNAPSHOTRENDERING_STANDARD = 0;\r\n\r\n /** Fast snapshot rendering. In this mode, everything is static and only some limited form of dynamic behaviour is possible */\r\n public static readonly SNAPSHOTRENDERING_FAST = 1;\r\n\r\n /**\r\n * This is the default projection mode used by the cameras.\r\n * It helps recreating a feeling of perspective and better appreciate depth.\r\n * This is the best way to simulate real life cameras.\r\n */\r\n public static readonly PERSPECTIVE_CAMERA = 0;\r\n /**\r\n * This helps creating camera with an orthographic mode.\r\n * Orthographic is commonly used in engineering as a means to produce object specifications that communicate dimensions unambiguously, each line of 1 unit length (cm, meter..whatever) will appear to have the same length everywhere on the drawing. This allows the drafter to dimension only a subset of lines and let the reader know that other lines of that length on the drawing are also that length in reality. Every parallel line in the drawing is also parallel in the object.\r\n */\r\n public static readonly ORTHOGRAPHIC_CAMERA = 1;\r\n\r\n /**\r\n * This is the default FOV mode for perspective cameras.\r\n * This setting aligns the upper and lower bounds of the viewport to the upper and lower bounds of the camera frustum.\r\n */\r\n public static readonly FOVMODE_VERTICAL_FIXED = 0;\r\n /**\r\n * This setting aligns the left and right bounds of the viewport to the left and right bounds of the camera frustum.\r\n */\r\n public static readonly FOVMODE_HORIZONTAL_FIXED = 1;\r\n\r\n /**\r\n * This specifies there is no need for a camera rig.\r\n * Basically only one eye is rendered corresponding to the camera.\r\n */\r\n public static readonly RIG_MODE_NONE = 0;\r\n /**\r\n * Simulates a camera Rig with one blue eye and one red eye.\r\n * This can be use with 3d blue and red glasses.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_ANAGLYPH = 10;\r\n /**\r\n * Defines that both eyes of the camera will be rendered side by side with a parallel target.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL = 11;\r\n /**\r\n * Defines that both eyes of the camera will be rendered side by side with a none parallel target.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED = 12;\r\n /**\r\n * Defines that both eyes of the camera will be rendered over under each other.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_OVERUNDER = 13;\r\n /**\r\n * Defines that both eyes of the camera will be rendered on successive lines interlaced for passive 3d monitors.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_INTERLACED = 14;\r\n /**\r\n * Defines that both eyes of the camera should be renderered in a VR mode (carbox).\r\n */\r\n public static readonly RIG_MODE_VR = 20;\r\n /**\r\n * Custom rig mode allowing rig cameras to be populated manually with any number of cameras\r\n */\r\n public static readonly RIG_MODE_CUSTOM = 22;\r\n\r\n /**\r\n * Maximum number of uv sets supported\r\n */\r\n public static readonly MAX_SUPPORTED_UV_SETS = 6;\r\n\r\n /**\r\n * GL constants\r\n */\r\n /** Alpha blend equation: ADD */\r\n public static readonly GL_ALPHA_EQUATION_ADD = 0x8006;\r\n /** Alpha equation: MIN */\r\n public static readonly GL_ALPHA_EQUATION_MIN = 0x8007;\r\n /** Alpha equation: MAX */\r\n public static readonly GL_ALPHA_EQUATION_MAX = 0x8008;\r\n /** Alpha equation: SUBTRACT */\r\n public static readonly GL_ALPHA_EQUATION_SUBTRACT = 0x800a;\r\n /** Alpha equation: REVERSE_SUBTRACT */\r\n public static readonly GL_ALPHA_EQUATION_REVERSE_SUBTRACT = 0x800b;\r\n\r\n /** Alpha blend function: SRC */\r\n public static readonly GL_ALPHA_FUNCTION_SRC = 0x0300;\r\n /** Alpha blend function: ONE_MINUS_SRC */\r\n public static readonly GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR = 0x0301;\r\n /** Alpha blend function: SRC_ALPHA */\r\n public static readonly GL_ALPHA_FUNCTION_SRC_ALPHA = 0x0302;\r\n /** Alpha blend function: ONE_MINUS_SRC_ALPHA */\r\n public static readonly GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA = 0x0303;\r\n /** Alpha blend function: DST_ALPHA */\r\n public static readonly GL_ALPHA_FUNCTION_DST_ALPHA = 0x0304;\r\n /** Alpha blend function: ONE_MINUS_DST_ALPHA */\r\n public static readonly GL_ALPHA_FUNCTION_ONE_MINUS_DST_ALPHA = 0x0305;\r\n /** Alpha blend function: ONE_MINUS_DST */\r\n public static readonly GL_ALPHA_FUNCTION_DST_COLOR = 0x0306;\r\n /** Alpha blend function: ONE_MINUS_DST */\r\n public static readonly GL_ALPHA_FUNCTION_ONE_MINUS_DST_COLOR = 0x0307;\r\n /** Alpha blend function: SRC_ALPHA_SATURATED */\r\n public static readonly GL_ALPHA_FUNCTION_SRC_ALPHA_SATURATED = 0x0308;\r\n /** Alpha blend function: CONSTANT */\r\n public static readonly GL_ALPHA_FUNCTION_CONSTANT_COLOR = 0x8001;\r\n /** Alpha blend function: ONE_MINUS_CONSTANT */\r\n public static readonly GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_COLOR = 0x8002;\r\n /** Alpha blend function: CONSTANT_ALPHA */\r\n public static readonly GL_ALPHA_FUNCTION_CONSTANT_ALPHA = 0x8003;\r\n /** Alpha blend function: ONE_MINUS_CONSTANT_ALPHA */\r\n public static readonly GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_ALPHA = 0x8004;\r\n\r\n /** URL to the snippet server. Points to the public snippet server by default */\r\n public static SnippetUrl = \"https://snippet.babylonjs.com\";\r\n\r\n /** The fog is deactivated */\r\n public static FOGMODE_NONE = 0;\r\n /** The fog density is following an exponential function */\r\n public static FOGMODE_EXP = 1;\r\n /** The fog density is following an exponential function faster than FOGMODE_EXP */\r\n public static FOGMODE_EXP2 = 2;\r\n /** The fog density is following a linear function. */\r\n public static FOGMODE_LINEAR = 3;\r\n\r\n /**\r\n * The byte type.\r\n */\r\n public static BYTE = 5120;\r\n\r\n /**\r\n * The unsigned byte type.\r\n */\r\n public static UNSIGNED_BYTE = 5121;\r\n\r\n /**\r\n * The short type.\r\n */\r\n public static SHORT = 5122;\r\n\r\n /**\r\n * The unsigned short type.\r\n */\r\n public static UNSIGNED_SHORT = 5123;\r\n\r\n /**\r\n * The integer type.\r\n */\r\n public static INT = 5124;\r\n\r\n /**\r\n * The unsigned integer type.\r\n */\r\n public static UNSIGNED_INT = 5125;\r\n\r\n /**\r\n * The float type.\r\n */\r\n public static FLOAT = 5126;\r\n\r\n /**\r\n * Positions\r\n */\r\n public static PositionKind = \"position\";\r\n /**\r\n * Normals\r\n */\r\n public static NormalKind = \"normal\";\r\n /**\r\n * Tangents\r\n */\r\n public static TangentKind = \"tangent\";\r\n /**\r\n * Texture coordinates\r\n */\r\n public static UVKind = \"uv\";\r\n /**\r\n * Texture coordinates 2\r\n */\r\n public static UV2Kind = \"uv2\";\r\n /**\r\n * Texture coordinates 3\r\n */\r\n public static UV3Kind = \"uv3\";\r\n /**\r\n * Texture coordinates 4\r\n */\r\n public static UV4Kind = \"uv4\";\r\n /**\r\n * Texture coordinates 5\r\n */\r\n public static UV5Kind = \"uv5\";\r\n /**\r\n * Texture coordinates 6\r\n */\r\n public static UV6Kind = \"uv6\";\r\n /**\r\n * Colors\r\n */\r\n public static ColorKind = \"color\";\r\n /**\r\n * Instance Colors\r\n */\r\n public static ColorInstanceKind = \"instanceColor\";\r\n /**\r\n * Matrix indices (for bones)\r\n */\r\n public static MatricesIndicesKind = \"matricesIndices\";\r\n /**\r\n * Matrix weights (for bones)\r\n */\r\n public static MatricesWeightsKind = \"matricesWeights\";\r\n /**\r\n * Additional matrix indices (for bones)\r\n */\r\n public static MatricesIndicesExtraKind = \"matricesIndicesExtra\";\r\n /**\r\n * Additional matrix weights (for bones)\r\n */\r\n public static MatricesWeightsExtraKind = \"matricesWeightsExtra\";\r\n}\r\n", "/**\r\n * Gather the list of clipboard event types as constants.\r\n */\r\nexport class ClipboardEventTypes {\r\n /**\r\n * The clipboard event is fired when a copy command is active (pressed).\r\n */\r\n public static readonly COPY = 0x01; //\r\n /**\r\n * The clipboard event is fired when a cut command is active (pressed).\r\n */\r\n public static readonly CUT = 0x02;\r\n\r\n /**\r\n * The clipboard event is fired when a paste command is active (pressed).\r\n */\r\n public static readonly PASTE = 0x03;\r\n}\r\n/**\r\n * This class is used to store clipboard related info for the onClipboardObservable event.\r\n */\r\nexport class ClipboardInfo {\r\n /**\r\n *Creates an instance of ClipboardInfo.\r\n * @param type Defines the type of event (BABYLON.ClipboardEventTypes)\r\n * @param event Defines the related dom event\r\n */\r\n constructor(\r\n /**\r\n * Defines the type of event (BABYLON.ClipboardEventTypes)\r\n */\r\n public type: number,\r\n /**\r\n * Defines the related dom event\r\n */\r\n public event: ClipboardEvent\r\n ) {}\r\n\r\n /**\r\n * Get the clipboard event's type from the keycode.\r\n * @param keyCode Defines the keyCode for the current keyboard event.\r\n * @returns {number}\r\n */\r\n public static GetTypeFromCharacter(keyCode: number): number {\r\n const charCode = keyCode;\r\n //TODO: add codes for extended ASCII\r\n switch (charCode) {\r\n case 67:\r\n return ClipboardEventTypes.COPY;\r\n case 86:\r\n return ClipboardEventTypes.PASTE;\r\n case 88:\r\n return ClipboardEventTypes.CUT;\r\n default:\r\n return -1;\r\n }\r\n }\r\n}\r\n", "/**\r\n * Defines an array and its length.\r\n * It can be helpful to group result from both Arrays and smart arrays in one structure.\r\n */\r\nexport interface ISmartArrayLike {\r\n /**\r\n * The data of the array.\r\n */\r\n data: Array;\r\n /**\r\n * The active length of the array.\r\n */\r\n length: number;\r\n}\r\n\r\n/**\r\n * Defines an GC Friendly array where the backfield array do not shrink to prevent over allocations.\r\n */\r\nexport class SmartArray implements ISmartArrayLike {\r\n /**\r\n * The full set of data from the array.\r\n */\r\n public data: Array;\r\n\r\n /**\r\n * The active length of the array.\r\n */\r\n public length: number = 0;\r\n\r\n protected _id: number;\r\n\r\n /**\r\n * Instantiates a Smart Array.\r\n * @param capacity defines the default capacity of the array.\r\n */\r\n constructor(capacity: number) {\r\n this.data = new Array(capacity);\r\n this._id = SmartArray._GlobalId++;\r\n }\r\n\r\n /**\r\n * Pushes a value at the end of the active data.\r\n * @param value defines the object to push in the array.\r\n */\r\n public push(value: T): void {\r\n this.data[this.length++] = value;\r\n\r\n if (this.length > this.data.length) {\r\n this.data.length *= 2;\r\n }\r\n }\r\n\r\n /**\r\n * Iterates over the active data and apply the lambda to them.\r\n * @param func defines the action to apply on each value.\r\n */\r\n public forEach(func: (content: T) => void): void {\r\n for (let index = 0; index < this.length; index++) {\r\n func(this.data[index]);\r\n }\r\n }\r\n\r\n /**\r\n * Sorts the full sets of data.\r\n * @param compareFn defines the comparison function to apply.\r\n */\r\n public sort(compareFn: (a: T, b: T) => number): void {\r\n this.data.sort(compareFn);\r\n }\r\n\r\n /**\r\n * Resets the active data to an empty array.\r\n */\r\n public reset(): void {\r\n this.length = 0;\r\n }\r\n\r\n /**\r\n * Releases all the data from the array as well as the array.\r\n */\r\n public dispose(): void {\r\n this.reset();\r\n\r\n if (this.data) {\r\n this.data.length = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Concats the active data with a given array.\r\n * @param array defines the data to concatenate with.\r\n */\r\n public concat(array: any): void {\r\n if (array.length === 0) {\r\n return;\r\n }\r\n if (this.length + array.length > this.data.length) {\r\n this.data.length = (this.length + array.length) * 2;\r\n }\r\n\r\n for (let index = 0; index < array.length; index++) {\r\n this.data[this.length++] = (array.data || array)[index];\r\n }\r\n }\r\n\r\n /**\r\n * Returns the position of a value in the active data.\r\n * @param value defines the value to find the index for\r\n * @returns the index if found in the active data otherwise -1\r\n */\r\n public indexOf(value: T): number {\r\n const position = this.data.indexOf(value);\r\n\r\n if (position >= this.length) {\r\n return -1;\r\n }\r\n\r\n return position;\r\n }\r\n\r\n /**\r\n * Returns whether an element is part of the active data.\r\n * @param value defines the value to look for\r\n * @returns true if found in the active data otherwise false\r\n */\r\n public contains(value: T): boolean {\r\n return this.indexOf(value) !== -1;\r\n }\r\n\r\n // Statics\r\n private static _GlobalId = 0;\r\n}\r\n\r\n/**\r\n * Defines an GC Friendly array where the backfield array do not shrink to prevent over allocations.\r\n * The data in this array can only be present once\r\n */\r\nexport class SmartArrayNoDuplicate extends SmartArray {\r\n private _duplicateId = 0;\r\n\r\n /**\r\n * Pushes a value at the end of the active data.\r\n * THIS DOES NOT PREVENT DUPPLICATE DATA\r\n * @param value defines the object to push in the array.\r\n */\r\n public push(value: T): void {\r\n super.push(value);\r\n\r\n if (!(value).__smartArrayFlags) {\r\n (value).__smartArrayFlags = {};\r\n }\r\n\r\n (value).__smartArrayFlags[this._id] = this._duplicateId;\r\n }\r\n\r\n /**\r\n * Pushes a value at the end of the active data.\r\n * If the data is already present, it won t be added again\r\n * @param value defines the object to push in the array.\r\n * @returns true if added false if it was already present\r\n */\r\n public pushNoDuplicate(value: T): boolean {\r\n if ((value).__smartArrayFlags && (value).__smartArrayFlags[this._id] === this._duplicateId) {\r\n return false;\r\n }\r\n this.push(value);\r\n return true;\r\n }\r\n\r\n /**\r\n * Resets the active data to an empty array.\r\n */\r\n public reset(): void {\r\n super.reset();\r\n this._duplicateId++;\r\n }\r\n\r\n /**\r\n * Concats the active data with a given array.\r\n * This ensures no duplicate will be present in the result.\r\n * @param array defines the data to concatenate with.\r\n */\r\n public concatWithNoDuplicate(array: any): void {\r\n if (array.length === 0) {\r\n return;\r\n }\r\n if (this.length + array.length > this.data.length) {\r\n this.data.length = (this.length + array.length) * 2;\r\n }\r\n\r\n for (let index = 0; index < array.length; index++) {\r\n const item = (array.data || array)[index];\r\n this.pushNoDuplicate(item);\r\n }\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * This class implement a typical dictionary using a string as key and the generic type T as value.\r\n * The underlying implementation relies on an associative array to ensure the best performances.\r\n * The value can be anything including 'null' but except 'undefined'\r\n */\r\nexport class StringDictionary {\r\n /**\r\n * This will clear this dictionary and copy the content from the 'source' one.\r\n * If the T value is a custom object, it won't be copied/cloned, the same object will be used\r\n * @param source the dictionary to take the content from and copy to this dictionary\r\n */\r\n public copyFrom(source: StringDictionary) {\r\n this.clear();\r\n source.forEach((t, v) => this.add(t, v));\r\n }\r\n\r\n /**\r\n * Get a value based from its key\r\n * @param key the given key to get the matching value from\r\n * @returns the value if found, otherwise undefined is returned\r\n */\r\n public get(key: string): T | undefined {\r\n const val = this._data[key];\r\n if (val !== undefined) {\r\n return val;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Get a value from its key or add it if it doesn't exist.\r\n * This method will ensure you that a given key/data will be present in the dictionary.\r\n * @param key the given key to get the matching value from\r\n * @param factory the factory that will create the value if the key is not present in the dictionary.\r\n * The factory will only be invoked if there's no data for the given key.\r\n * @returns the value corresponding to the key.\r\n */\r\n public getOrAddWithFactory(key: string, factory: (key: string) => T): T {\r\n let val = this.get(key);\r\n if (val !== undefined) {\r\n return val;\r\n }\r\n\r\n val = factory(key);\r\n if (val) {\r\n this.add(key, val);\r\n }\r\n\r\n return val;\r\n }\r\n\r\n /**\r\n * Get a value from its key if present in the dictionary otherwise add it\r\n * @param key the key to get the value from\r\n * @param val if there's no such key/value pair in the dictionary add it with this value\r\n * @returns the value corresponding to the key\r\n */\r\n public getOrAdd(key: string, val: T): T {\r\n const curVal = this.get(key);\r\n if (curVal !== undefined) {\r\n return curVal;\r\n }\r\n\r\n this.add(key, val);\r\n return val;\r\n }\r\n\r\n /**\r\n * Check if there's a given key in the dictionary\r\n * @param key the key to check for\r\n * @returns true if the key is present, false otherwise\r\n */\r\n public contains(key: string): boolean {\r\n return this._data[key] !== undefined;\r\n }\r\n\r\n /**\r\n * Add a new key and its corresponding value\r\n * @param key the key to add\r\n * @param value the value corresponding to the key\r\n * @returns true if the operation completed successfully, false if we couldn't insert the key/value because there was already this key in the dictionary\r\n */\r\n public add(key: string, value: T): boolean {\r\n if (this._data[key] !== undefined) {\r\n return false;\r\n }\r\n this._data[key] = value;\r\n ++this._count;\r\n return true;\r\n }\r\n\r\n /**\r\n * Update a specific value associated to a key\r\n * @param key defines the key to use\r\n * @param value defines the value to store\r\n * @returns true if the value was updated (or false if the key was not found)\r\n */\r\n public set(key: string, value: T): boolean {\r\n if (this._data[key] === undefined) {\r\n return false;\r\n }\r\n this._data[key] = value;\r\n return true;\r\n }\r\n\r\n /**\r\n * Get the element of the given key and remove it from the dictionary\r\n * @param key defines the key to search\r\n * @returns the value associated with the key or null if not found\r\n */\r\n public getAndRemove(key: string): Nullable {\r\n const val = this.get(key);\r\n if (val !== undefined) {\r\n delete this._data[key];\r\n --this._count;\r\n return val;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Remove a key/value from the dictionary.\r\n * @param key the key to remove\r\n * @returns true if the item was successfully deleted, false if no item with such key exist in the dictionary\r\n */\r\n public remove(key: string): boolean {\r\n if (this.contains(key)) {\r\n delete this._data[key];\r\n --this._count;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Clear the whole content of the dictionary\r\n */\r\n public clear() {\r\n this._data = {};\r\n this._count = 0;\r\n }\r\n\r\n /**\r\n * Gets the current count\r\n */\r\n public get count() {\r\n return this._count;\r\n }\r\n\r\n /**\r\n * Execute a callback on each key/val of the dictionary.\r\n * Note that you can remove any element in this dictionary in the callback implementation\r\n * @param callback the callback to execute on a given key/value pair\r\n */\r\n public forEach(callback: (key: string, val: T) => void) {\r\n for (const cur in this._data) {\r\n const val = this._data[cur];\r\n callback(cur, val);\r\n }\r\n }\r\n\r\n /**\r\n * Execute a callback on every occurrence of the dictionary until it returns a valid TRes object.\r\n * If the callback returns null or undefined the method will iterate to the next key/value pair\r\n * Note that you can remove any element in this dictionary in the callback implementation\r\n * @param callback the callback to execute, if it return a valid T instanced object the enumeration will stop and the object will be returned\r\n * @returns the first item\r\n */\r\n public first(callback: (key: string, val: T) => TRes) {\r\n for (const cur in this._data) {\r\n const val = this._data[cur];\r\n const res = callback(cur, val);\r\n if (res) {\r\n return res;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _count = 0;\r\n private _data: { [key: string]: T } = {};\r\n}\r\n", "import type { Scene } from \"./scene\";\r\nimport type { Nullable } from \"./types\";\r\nimport type { AbstractMesh } from \"./Meshes/abstractMesh\";\r\nimport type { TransformNode } from \"./Meshes/transformNode\";\r\nimport type { Geometry } from \"./Meshes/geometry\";\r\nimport type { Skeleton } from \"./Bones/skeleton\";\r\nimport type { MorphTargetManager } from \"./Morph/morphTargetManager\";\r\nimport type { AssetContainer } from \"./assetContainer\";\r\nimport type { IParticleSystem } from \"./Particles/IParticleSystem\";\r\nimport type { AnimationGroup } from \"./Animations/animationGroup\";\r\nimport type { BaseTexture } from \"./Materials/Textures/baseTexture\";\r\nimport type { Material } from \"./Materials/material\";\r\nimport type { MultiMaterial } from \"./Materials/multiMaterial\";\r\nimport type { AbstractActionManager } from \"./Actions/abstractActionManager\";\r\nimport type { Camera } from \"./Cameras/camera\";\r\nimport type { Light } from \"./Lights/light\";\r\nimport type { Node } from \"./node\";\r\nimport type { PostProcess } from \"./PostProcesses/postProcess\";\r\nimport type { Animation } from \"./Animations/animation\";\r\n\r\n/**\r\n * Defines how the parser contract is defined.\r\n * These parsers are used to parse a list of specific assets (like particle systems, etc..)\r\n */\r\nexport type BabylonFileParser = (parsedData: any, scene: Scene, container: AssetContainer, rootUrl: string) => void;\r\n\r\n/**\r\n * Defines how the individual parser contract is defined.\r\n * These parser can parse an individual asset\r\n */\r\nexport type IndividualBabylonFileParser = (parsedData: any, scene: Scene, rootUrl: string) => any;\r\n\r\n/**\r\n * Base class of the scene acting as a container for the different elements composing a scene.\r\n * This class is dynamically extended by the different components of the scene increasing\r\n * flexibility and reducing coupling\r\n */\r\nexport abstract class AbstractScene {\r\n /**\r\n * Stores the list of available parsers in the application.\r\n */\r\n private static _BabylonFileParsers: { [key: string]: BabylonFileParser } = {};\r\n\r\n /**\r\n * Stores the list of available individual parsers in the application.\r\n */\r\n private static _IndividualBabylonFileParsers: { [key: string]: IndividualBabylonFileParser } = {};\r\n\r\n /**\r\n * Adds a parser in the list of available ones\r\n * @param name Defines the name of the parser\r\n * @param parser Defines the parser to add\r\n */\r\n public static AddParser(name: string, parser: BabylonFileParser): void {\r\n this._BabylonFileParsers[name] = parser;\r\n }\r\n\r\n /**\r\n * Gets a general parser from the list of available ones\r\n * @param name Defines the name of the parser\r\n * @returns the requested parser or null\r\n */\r\n public static GetParser(name: string): Nullable {\r\n if (this._BabylonFileParsers[name]) {\r\n return this._BabylonFileParsers[name];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Adds n individual parser in the list of available ones\r\n * @param name Defines the name of the parser\r\n * @param parser Defines the parser to add\r\n */\r\n public static AddIndividualParser(name: string, parser: IndividualBabylonFileParser): void {\r\n this._IndividualBabylonFileParsers[name] = parser;\r\n }\r\n\r\n /**\r\n * Gets an individual parser from the list of available ones\r\n * @param name Defines the name of the parser\r\n * @returns the requested parser or null\r\n */\r\n public static GetIndividualParser(name: string): Nullable {\r\n if (this._IndividualBabylonFileParsers[name]) {\r\n return this._IndividualBabylonFileParsers[name];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Parser json data and populate both a scene and its associated container object\r\n * @param jsonData Defines the data to parse\r\n * @param scene Defines the scene to parse the data for\r\n * @param container Defines the container attached to the parsing sequence\r\n * @param rootUrl Defines the root url of the data\r\n */\r\n public static Parse(jsonData: any, scene: Scene, container: AssetContainer, rootUrl: string): void {\r\n for (const parserName in this._BabylonFileParsers) {\r\n if (Object.prototype.hasOwnProperty.call(this._BabylonFileParsers, parserName)) {\r\n this._BabylonFileParsers[parserName](jsonData, scene, container, rootUrl);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the list of root nodes (ie. nodes with no parent)\r\n */\r\n public rootNodes: Node[] = [];\r\n\r\n /** All of the cameras added to this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras\r\n */\r\n public cameras: Camera[] = [];\r\n\r\n /**\r\n * All of the lights added to this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction\r\n */\r\n public lights: Light[] = [];\r\n\r\n /**\r\n * All of the (abstract) meshes added to this scene\r\n */\r\n public meshes: AbstractMesh[] = [];\r\n\r\n /**\r\n * The list of skeletons added to the scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons\r\n */\r\n public skeletons: Skeleton[] = [];\r\n\r\n /**\r\n * All of the particle systems added to this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro\r\n */\r\n public particleSystems: IParticleSystem[] = [];\r\n\r\n /**\r\n * Gets a list of Animations associated with the scene\r\n */\r\n public animations: Animation[] = [];\r\n\r\n /**\r\n * All of the animation groups added to this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/groupAnimations\r\n */\r\n public animationGroups: AnimationGroup[] = [];\r\n\r\n /**\r\n * All of the multi-materials added to this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials\r\n */\r\n public multiMaterials: MultiMaterial[] = [];\r\n\r\n /**\r\n * All of the materials added to this scene\r\n * In the context of a Scene, it is not supposed to be modified manually.\r\n * Any addition or removal should be done using the addMaterial and removeMaterial Scene methods.\r\n * Note also that the order of the Material within the array is not significant and might change.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction\r\n */\r\n public materials: Material[] = [];\r\n\r\n /**\r\n * The list of morph target managers added to the scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph\r\n */\r\n public morphTargetManagers: MorphTargetManager[] = [];\r\n\r\n /**\r\n * The list of geometries used in the scene.\r\n */\r\n public geometries: Geometry[] = [];\r\n\r\n /**\r\n * All of the transform nodes added to this scene\r\n * In the context of a Scene, it is not supposed to be modified manually.\r\n * Any addition or removal should be done using the addTransformNode and removeTransformNode Scene methods.\r\n * Note also that the order of the TransformNode within the array is not significant and might change.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/transform_node\r\n */\r\n public transformNodes: TransformNode[] = [];\r\n\r\n /**\r\n * ActionManagers available on the scene.\r\n * @deprecated\r\n */\r\n public actionManagers: AbstractActionManager[] = [];\r\n\r\n /**\r\n * Textures to keep.\r\n */\r\n public textures: BaseTexture[] = [];\r\n\r\n /** @internal */\r\n protected _environmentTexture: Nullable = null;\r\n /**\r\n * Texture used in all pbr material as the reflection texture.\r\n * As in the majority of the scene they are the same (exception for multi room and so on),\r\n * this is easier to reference from here than from all the materials.\r\n */\r\n public get environmentTexture(): Nullable {\r\n return this._environmentTexture;\r\n }\r\n\r\n public set environmentTexture(value: Nullable) {\r\n this._environmentTexture = value;\r\n }\r\n\r\n /**\r\n * The list of postprocesses added to the scene\r\n */\r\n public postProcesses: PostProcess[] = [];\r\n\r\n /**\r\n * @returns all meshes, lights, cameras, transformNodes and bones\r\n */\r\n public getNodes(): Array {\r\n let nodes: Node[] = [];\r\n nodes = nodes.concat(this.meshes);\r\n nodes = nodes.concat(this.lights);\r\n nodes = nodes.concat(this.cameras);\r\n nodes = nodes.concat(this.transformNodes); // dummies\r\n this.skeletons.forEach((skeleton) => (nodes = nodes.concat(skeleton.bones)));\r\n return nodes;\r\n }\r\n}\r\n", "/**\r\n * Prepare the list of uniforms associated with the ColorCurves effects.\r\n * @param uniformsList The list of uniforms used in the effect\r\n */\r\nexport function PrepareUniformsForColorCurves(uniformsList: string[]): void {\r\n uniformsList.push(\"vCameraColorCurveNeutral\", \"vCameraColorCurvePositive\", \"vCameraColorCurveNegative\");\r\n}\r\n", "import { serialize } from \"../Misc/decorators\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport { PrepareUniformsForColorCurves } from \"./colorCurves.functions\";\r\n\r\n/**\r\n * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT).\r\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\r\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\r\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\r\n */\r\nexport class ColorCurves {\r\n private _dirty = true;\r\n\r\n private _tempColor = new Color4(0, 0, 0, 0);\r\n\r\n private _globalCurve = new Color4(0, 0, 0, 0);\r\n private _highlightsCurve = new Color4(0, 0, 0, 0);\r\n private _midtonesCurve = new Color4(0, 0, 0, 0);\r\n private _shadowsCurve = new Color4(0, 0, 0, 0);\r\n\r\n private _positiveCurve = new Color4(0, 0, 0, 0);\r\n private _negativeCurve = new Color4(0, 0, 0, 0);\r\n\r\n @serialize()\r\n private _globalHue = 30;\r\n\r\n @serialize()\r\n private _globalDensity = 0;\r\n\r\n @serialize()\r\n private _globalSaturation = 0;\r\n\r\n @serialize()\r\n private _globalExposure = 0;\r\n\r\n /**\r\n * Gets the global Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public get globalHue(): number {\r\n return this._globalHue;\r\n }\r\n /**\r\n * Sets the global Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public set globalHue(value: number) {\r\n this._globalHue = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the global Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public get globalDensity(): number {\r\n return this._globalDensity;\r\n }\r\n /**\r\n * Sets the global Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public set globalDensity(value: number) {\r\n this._globalDensity = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the global Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public get globalSaturation(): number {\r\n return this._globalSaturation;\r\n }\r\n /**\r\n * Sets the global Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public set globalSaturation(value: number) {\r\n this._globalSaturation = value;\r\n this._dirty = true;\r\n }\r\n\r\n /**\r\n * Gets the global Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public get globalExposure(): number {\r\n return this._globalExposure;\r\n }\r\n /**\r\n * Sets the global Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public set globalExposure(value: number) {\r\n this._globalExposure = value;\r\n this._dirty = true;\r\n }\r\n\r\n @serialize()\r\n private _highlightsHue = 30;\r\n\r\n @serialize()\r\n private _highlightsDensity = 0;\r\n\r\n @serialize()\r\n private _highlightsSaturation = 0;\r\n\r\n @serialize()\r\n private _highlightsExposure = 0;\r\n\r\n /**\r\n * Gets the highlights Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public get highlightsHue(): number {\r\n return this._highlightsHue;\r\n }\r\n /**\r\n * Sets the highlights Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public set highlightsHue(value: number) {\r\n this._highlightsHue = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the highlights Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public get highlightsDensity(): number {\r\n return this._highlightsDensity;\r\n }\r\n /**\r\n * Sets the highlights Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public set highlightsDensity(value: number) {\r\n this._highlightsDensity = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the highlights Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public get highlightsSaturation(): number {\r\n return this._highlightsSaturation;\r\n }\r\n /**\r\n * Sets the highlights Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public set highlightsSaturation(value: number) {\r\n this._highlightsSaturation = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the highlights Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public get highlightsExposure(): number {\r\n return this._highlightsExposure;\r\n }\r\n /**\r\n * Sets the highlights Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public set highlightsExposure(value: number) {\r\n this._highlightsExposure = value;\r\n this._dirty = true;\r\n }\r\n\r\n @serialize()\r\n private _midtonesHue = 30;\r\n\r\n @serialize()\r\n private _midtonesDensity = 0;\r\n\r\n @serialize()\r\n private _midtonesSaturation = 0;\r\n\r\n @serialize()\r\n private _midtonesExposure = 0;\r\n\r\n /**\r\n * Gets the midtones Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public get midtonesHue(): number {\r\n return this._midtonesHue;\r\n }\r\n /**\r\n * Sets the midtones Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public set midtonesHue(value: number) {\r\n this._midtonesHue = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the midtones Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public get midtonesDensity(): number {\r\n return this._midtonesDensity;\r\n }\r\n /**\r\n * Sets the midtones Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public set midtonesDensity(value: number) {\r\n this._midtonesDensity = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the midtones Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public get midtonesSaturation(): number {\r\n return this._midtonesSaturation;\r\n }\r\n /**\r\n * Sets the midtones Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public set midtonesSaturation(value: number) {\r\n this._midtonesSaturation = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the midtones Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public get midtonesExposure(): number {\r\n return this._midtonesExposure;\r\n }\r\n /**\r\n * Sets the midtones Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public set midtonesExposure(value: number) {\r\n this._midtonesExposure = value;\r\n this._dirty = true;\r\n }\r\n\r\n private _shadowsHue = 30;\r\n private _shadowsDensity = 0;\r\n private _shadowsSaturation = 0;\r\n private _shadowsExposure = 0;\r\n\r\n /**\r\n * Gets the shadows Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public get shadowsHue(): number {\r\n return this._shadowsHue;\r\n }\r\n /**\r\n * Sets the shadows Hue value.\r\n * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).\r\n */\r\n public set shadowsHue(value: number) {\r\n this._shadowsHue = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the shadows Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public get shadowsDensity(): number {\r\n return this._shadowsDensity;\r\n }\r\n /**\r\n * Sets the shadows Density value.\r\n * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.\r\n * Values less than zero provide a filter of opposite hue.\r\n */\r\n public set shadowsDensity(value: number) {\r\n this._shadowsDensity = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the shadows Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public get shadowsSaturation(): number {\r\n return this._shadowsSaturation;\r\n }\r\n /**\r\n * Sets the shadows Saturation value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.\r\n */\r\n public set shadowsSaturation(value: number) {\r\n this._shadowsSaturation = value;\r\n this._dirty = true;\r\n }\r\n /**\r\n * Gets the shadows Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public get shadowsExposure(): number {\r\n return this._shadowsExposure;\r\n }\r\n /**\r\n * Sets the shadows Exposure value.\r\n * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.\r\n */\r\n public set shadowsExposure(value: number) {\r\n this._shadowsExposure = value;\r\n this._dirty = true;\r\n }\r\n\r\n /**\r\n * Returns the class name\r\n * @returns The class name\r\n */\r\n public getClassName(): string {\r\n return \"ColorCurves\";\r\n }\r\n\r\n /**\r\n * Binds the color curves to the shader.\r\n * @param colorCurves The color curve to bind\r\n * @param effect The effect to bind to\r\n * @param positiveUniform The positive uniform shader parameter\r\n * @param neutralUniform The neutral uniform shader parameter\r\n * @param negativeUniform The negative uniform shader parameter\r\n */\r\n public static Bind(\r\n colorCurves: ColorCurves,\r\n effect: Effect,\r\n positiveUniform = \"vCameraColorCurvePositive\",\r\n neutralUniform = \"vCameraColorCurveNeutral\",\r\n negativeUniform = \"vCameraColorCurveNegative\"\r\n ): void {\r\n if (colorCurves._dirty) {\r\n colorCurves._dirty = false;\r\n\r\n // Fill in global info.\r\n colorCurves._getColorGradingDataToRef(\r\n colorCurves._globalHue,\r\n colorCurves._globalDensity,\r\n colorCurves._globalSaturation,\r\n colorCurves._globalExposure,\r\n colorCurves._globalCurve\r\n );\r\n\r\n // Compute highlights info.\r\n colorCurves._getColorGradingDataToRef(\r\n colorCurves._highlightsHue,\r\n colorCurves._highlightsDensity,\r\n colorCurves._highlightsSaturation,\r\n colorCurves._highlightsExposure,\r\n colorCurves._tempColor\r\n );\r\n colorCurves._tempColor.multiplyToRef(colorCurves._globalCurve, colorCurves._highlightsCurve);\r\n\r\n // Compute midtones info.\r\n colorCurves._getColorGradingDataToRef(\r\n colorCurves._midtonesHue,\r\n colorCurves._midtonesDensity,\r\n colorCurves._midtonesSaturation,\r\n colorCurves._midtonesExposure,\r\n colorCurves._tempColor\r\n );\r\n colorCurves._tempColor.multiplyToRef(colorCurves._globalCurve, colorCurves._midtonesCurve);\r\n\r\n // Compute shadows info.\r\n colorCurves._getColorGradingDataToRef(\r\n colorCurves._shadowsHue,\r\n colorCurves._shadowsDensity,\r\n colorCurves._shadowsSaturation,\r\n colorCurves._shadowsExposure,\r\n colorCurves._tempColor\r\n );\r\n colorCurves._tempColor.multiplyToRef(colorCurves._globalCurve, colorCurves._shadowsCurve);\r\n\r\n // Compute deltas (neutral is midtones).\r\n colorCurves._highlightsCurve.subtractToRef(colorCurves._midtonesCurve, colorCurves._positiveCurve);\r\n colorCurves._midtonesCurve.subtractToRef(colorCurves._shadowsCurve, colorCurves._negativeCurve);\r\n }\r\n\r\n if (effect) {\r\n effect.setFloat4(positiveUniform, colorCurves._positiveCurve.r, colorCurves._positiveCurve.g, colorCurves._positiveCurve.b, colorCurves._positiveCurve.a);\r\n effect.setFloat4(neutralUniform, colorCurves._midtonesCurve.r, colorCurves._midtonesCurve.g, colorCurves._midtonesCurve.b, colorCurves._midtonesCurve.a);\r\n effect.setFloat4(negativeUniform, colorCurves._negativeCurve.r, colorCurves._negativeCurve.g, colorCurves._negativeCurve.b, colorCurves._negativeCurve.a);\r\n }\r\n }\r\n\r\n /**\r\n * Prepare the list of uniforms associated with the ColorCurves effects.\r\n * @param uniformsList The list of uniforms used in the effect\r\n */\r\n public static PrepareUniforms: (uniformsList: string[]) => void = PrepareUniformsForColorCurves;\r\n\r\n /**\r\n * Returns color grading data based on a hue, density, saturation and exposure value.\r\n * @param hue\r\n * @param density\r\n * @param saturation The saturation.\r\n * @param exposure The exposure.\r\n * @param result The result data container.\r\n */\r\n private _getColorGradingDataToRef(hue: number, density: number, saturation: number, exposure: number, result: Color4): void {\r\n if (hue == null) {\r\n return;\r\n }\r\n\r\n hue = ColorCurves._Clamp(hue, 0, 360);\r\n density = ColorCurves._Clamp(density, -100, 100);\r\n saturation = ColorCurves._Clamp(saturation, -100, 100);\r\n exposure = ColorCurves._Clamp(exposure, -100, 100);\r\n\r\n // Remap the slider/config filter density with non-linear mapping and also scale by half\r\n // so that the maximum filter density is only 50% control. This provides fine control\r\n // for small values and reasonable range.\r\n density = ColorCurves._ApplyColorGradingSliderNonlinear(density);\r\n density *= 0.5;\r\n\r\n exposure = ColorCurves._ApplyColorGradingSliderNonlinear(exposure);\r\n\r\n if (density < 0) {\r\n density *= -1;\r\n hue = (hue + 180) % 360;\r\n }\r\n\r\n ColorCurves._FromHSBToRef(hue, density, 50 + 0.25 * exposure, result);\r\n result.scaleToRef(2, result);\r\n result.a = 1 + 0.01 * saturation;\r\n }\r\n\r\n /**\r\n * Takes an input slider value and returns an adjusted value that provides extra control near the centre.\r\n * @param value The input slider value in range [-100,100].\r\n * @returns Adjusted value.\r\n */\r\n private static _ApplyColorGradingSliderNonlinear(value: number): number {\r\n value /= 100;\r\n\r\n let x: number = Math.abs(value);\r\n x = Math.pow(x, 2);\r\n\r\n if (value < 0) {\r\n x *= -1;\r\n }\r\n\r\n x *= 100;\r\n\r\n return x;\r\n }\r\n\r\n /**\r\n * Returns an RGBA Color4 based on Hue, Saturation and Brightness (also referred to as value, HSV).\r\n * @param hue The hue (H) input.\r\n * @param saturation The saturation (S) input.\r\n * @param brightness The brightness (B) input.\r\n * @param result\r\n * @result An RGBA color represented as Vector4.\r\n */\r\n private static _FromHSBToRef(hue: number, saturation: number, brightness: number, result: Color4): void {\r\n let h: number = ColorCurves._Clamp(hue, 0, 360);\r\n const s: number = ColorCurves._Clamp(saturation / 100, 0, 1);\r\n const v: number = ColorCurves._Clamp(brightness / 100, 0, 1);\r\n\r\n if (s === 0) {\r\n result.r = v;\r\n result.g = v;\r\n result.b = v;\r\n } else {\r\n // sector 0 to 5\r\n h /= 60;\r\n const i = Math.floor(h);\r\n\r\n // fractional part of h\r\n const f = h - i;\r\n const p = v * (1 - s);\r\n const q = v * (1 - s * f);\r\n const t = v * (1 - s * (1 - f));\r\n\r\n switch (i) {\r\n case 0:\r\n result.r = v;\r\n result.g = t;\r\n result.b = p;\r\n break;\r\n case 1:\r\n result.r = q;\r\n result.g = v;\r\n result.b = p;\r\n break;\r\n case 2:\r\n result.r = p;\r\n result.g = v;\r\n result.b = t;\r\n break;\r\n case 3:\r\n result.r = p;\r\n result.g = q;\r\n result.b = v;\r\n break;\r\n case 4:\r\n result.r = t;\r\n result.g = p;\r\n result.b = v;\r\n break;\r\n default:\r\n // case 5:\r\n result.r = v;\r\n result.g = p;\r\n result.b = q;\r\n break;\r\n }\r\n }\r\n\r\n result.a = 1;\r\n }\r\n\r\n /**\r\n * Returns a value clamped between min and max\r\n * @param value The value to clamp\r\n * @param min The minimum of value\r\n * @param max The maximum of value\r\n * @returns The clamped value.\r\n */\r\n private static _Clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max);\r\n }\r\n\r\n /**\r\n * Clones the current color curve instance.\r\n * @returns The cloned curves\r\n */\r\n public clone(): ColorCurves {\r\n return SerializationHelper.Clone(() => new ColorCurves(), this);\r\n }\r\n\r\n /**\r\n * Serializes the current color curve instance to a json representation.\r\n * @returns a JSON representation\r\n */\r\n public serialize(): any {\r\n return SerializationHelper.Serialize(this);\r\n }\r\n\r\n /**\r\n * Parses the color curve from a json representation.\r\n * @param source the JSON source to parse\r\n * @returns The parsed curves\r\n */\r\n public static Parse(source: any): ColorCurves {\r\n return SerializationHelper.Parse(() => new ColorCurves(), source, null, null);\r\n }\r\n}\r\n\r\n// References the dependencies.\r\nSerializationHelper._ColorCurvesParser = ColorCurves.Parse;\r\n", "import { PrepareUniformsForColorCurves } from \"./colorCurves.functions\";\r\nimport type { IImageProcessingConfigurationDefines } from \"./imageProcessingConfiguration.defines\";\r\n\r\n/**\r\n * Prepare the list of uniforms associated with the Image Processing effects.\r\n * @param uniforms The list of uniforms used in the effect\r\n * @param defines the list of defines currently in use\r\n */\r\nexport function PrepareUniformsForImageProcessing(uniforms: string[], defines: IImageProcessingConfigurationDefines): void {\r\n if (defines.EXPOSURE) {\r\n uniforms.push(\"exposureLinear\");\r\n }\r\n if (defines.CONTRAST) {\r\n uniforms.push(\"contrast\");\r\n }\r\n if (defines.COLORGRADING) {\r\n uniforms.push(\"colorTransformSettings\");\r\n }\r\n if (defines.VIGNETTE || defines.DITHER) {\r\n uniforms.push(\"vInverseScreenSize\");\r\n }\r\n if (defines.VIGNETTE) {\r\n uniforms.push(\"vignetteSettings1\");\r\n uniforms.push(\"vignetteSettings2\");\r\n }\r\n if (defines.COLORCURVES) {\r\n PrepareUniformsForColorCurves(uniforms);\r\n }\r\n if (defines.DITHER) {\r\n uniforms.push(\"ditherIntensity\");\r\n }\r\n}\r\n\r\n/**\r\n * Prepare the list of samplers associated with the Image Processing effects.\r\n * @param samplersList The list of uniforms used in the effect\r\n * @param defines the list of defines currently in use\r\n */\r\nexport function PrepareSamplersForImageProcessing(samplersList: string[], defines: IImageProcessingConfigurationDefines): void {\r\n if (defines.COLORGRADING) {\r\n samplersList.push(\"txColorTransform\");\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { serialize, serializeAsTexture, serializeAsColorCurves, serializeAsColor4 } from \"../Misc/decorators\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { ColorCurves } from \"../Materials/colorCurves\";\r\n\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Mix } from \"../Misc/tools.functions\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport type { IImageProcessingConfigurationDefines } from \"./imageProcessingConfiguration.defines\";\r\nimport { PrepareSamplersForImageProcessing, PrepareUniformsForImageProcessing } from \"./imageProcessingConfiguration.functions\";\r\n\r\n/**\r\n * This groups together the common properties used for image processing either in direct forward pass\r\n * or through post processing effect depending on the use of the image processing pipeline in your scene\r\n * or not.\r\n */\r\nexport class ImageProcessingConfiguration {\r\n /**\r\n * Default tone mapping applied in BabylonJS.\r\n */\r\n public static readonly TONEMAPPING_STANDARD = 0;\r\n\r\n /**\r\n * ACES Tone mapping (used by default in unreal and unity). This can help getting closer\r\n * to other engines rendering to increase portability.\r\n */\r\n public static readonly TONEMAPPING_ACES = 1;\r\n\r\n /**\r\n * Color curves setup used in the effect if colorCurvesEnabled is set to true\r\n */\r\n @serializeAsColorCurves()\r\n public colorCurves: Nullable = new ColorCurves();\r\n\r\n @serialize()\r\n private _colorCurvesEnabled = false;\r\n /**\r\n * Gets whether the color curves effect is enabled.\r\n */\r\n public get colorCurvesEnabled(): boolean {\r\n return this._colorCurvesEnabled;\r\n }\r\n /**\r\n * Sets whether the color curves effect is enabled.\r\n */\r\n public set colorCurvesEnabled(value: boolean) {\r\n if (this._colorCurvesEnabled === value) {\r\n return;\r\n }\r\n\r\n this._colorCurvesEnabled = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serializeAsTexture(\"colorGradingTexture\")\r\n private _colorGradingTexture: Nullable;\r\n /**\r\n * Color grading LUT texture used in the effect if colorGradingEnabled is set to true\r\n */\r\n public get colorGradingTexture(): Nullable {\r\n return this._colorGradingTexture;\r\n }\r\n /**\r\n * Color grading LUT texture used in the effect if colorGradingEnabled is set to true\r\n */\r\n public set colorGradingTexture(value: Nullable) {\r\n if (this._colorGradingTexture === value) {\r\n return;\r\n }\r\n\r\n this._colorGradingTexture = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _colorGradingEnabled = false;\r\n /**\r\n * Gets whether the color grading effect is enabled.\r\n */\r\n public get colorGradingEnabled(): boolean {\r\n return this._colorGradingEnabled;\r\n }\r\n /**\r\n * Sets whether the color grading effect is enabled.\r\n */\r\n public set colorGradingEnabled(value: boolean) {\r\n if (this._colorGradingEnabled === value) {\r\n return;\r\n }\r\n\r\n this._colorGradingEnabled = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _colorGradingWithGreenDepth = true;\r\n /**\r\n * Gets whether the color grading effect is using a green depth for the 3d Texture.\r\n */\r\n public get colorGradingWithGreenDepth(): boolean {\r\n return this._colorGradingWithGreenDepth;\r\n }\r\n /**\r\n * Sets whether the color grading effect is using a green depth for the 3d Texture.\r\n */\r\n public set colorGradingWithGreenDepth(value: boolean) {\r\n if (this._colorGradingWithGreenDepth === value) {\r\n return;\r\n }\r\n\r\n this._colorGradingWithGreenDepth = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _colorGradingBGR = true;\r\n /**\r\n * Gets whether the color grading texture contains BGR values.\r\n */\r\n public get colorGradingBGR(): boolean {\r\n return this._colorGradingBGR;\r\n }\r\n /**\r\n * Sets whether the color grading texture contains BGR values.\r\n */\r\n public set colorGradingBGR(value: boolean) {\r\n if (this._colorGradingBGR === value) {\r\n return;\r\n }\r\n\r\n this._colorGradingBGR = value;\r\n this._updateParameters();\r\n }\r\n\r\n /** @internal */\r\n @serialize()\r\n public _exposure = 1.0;\r\n /**\r\n * Gets the Exposure used in the effect.\r\n */\r\n public get exposure(): number {\r\n return this._exposure;\r\n }\r\n /**\r\n * Sets the Exposure used in the effect.\r\n */\r\n public set exposure(value: number) {\r\n if (this._exposure === value) {\r\n return;\r\n }\r\n\r\n this._exposure = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _toneMappingEnabled = false;\r\n /**\r\n * Gets whether the tone mapping effect is enabled.\r\n */\r\n public get toneMappingEnabled(): boolean {\r\n return this._toneMappingEnabled;\r\n }\r\n /**\r\n * Sets whether the tone mapping effect is enabled.\r\n */\r\n public set toneMappingEnabled(value: boolean) {\r\n if (this._toneMappingEnabled === value) {\r\n return;\r\n }\r\n\r\n this._toneMappingEnabled = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _toneMappingType = ImageProcessingConfiguration.TONEMAPPING_STANDARD;\r\n /**\r\n * Gets the type of tone mapping effect.\r\n */\r\n public get toneMappingType(): number {\r\n return this._toneMappingType;\r\n }\r\n /**\r\n * Sets the type of tone mapping effect used in BabylonJS.\r\n */\r\n public set toneMappingType(value: number) {\r\n if (this._toneMappingType === value) {\r\n return;\r\n }\r\n\r\n this._toneMappingType = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n protected _contrast = 1.0;\r\n /**\r\n * Gets the contrast used in the effect.\r\n */\r\n public get contrast(): number {\r\n return this._contrast;\r\n }\r\n /**\r\n * Sets the contrast used in the effect.\r\n */\r\n public set contrast(value: number) {\r\n if (this._contrast === value) {\r\n return;\r\n }\r\n\r\n this._contrast = value;\r\n this._updateParameters();\r\n }\r\n\r\n /**\r\n * Vignette stretch size.\r\n */\r\n @serialize()\r\n public vignetteStretch = 0;\r\n\r\n /**\r\n * Vignette center X Offset.\r\n */\r\n @serialize()\r\n public vignetteCenterX = 0;\r\n\r\n /**\r\n * Vignette center Y Offset.\r\n */\r\n @serialize()\r\n public vignetteCenterY = 0;\r\n\r\n /**\r\n * Back Compat: Vignette center Y Offset.\r\n * @deprecated use vignetteCenterY instead\r\n */\r\n public get vignetteCentreY(): number {\r\n return this.vignetteCenterY;\r\n }\r\n public set vignetteCentreY(value: number) {\r\n this.vignetteCenterY = value;\r\n }\r\n\r\n /**\r\n * Back Compat: Vignette center X Offset.\r\n * @deprecated use vignetteCenterX instead\r\n */\r\n public get vignetteCentreX(): number {\r\n return this.vignetteCenterX;\r\n }\r\n public set vignetteCentreX(value: number) {\r\n this.vignetteCenterX = value;\r\n }\r\n\r\n /**\r\n * Vignette weight or intensity of the vignette effect.\r\n */\r\n @serialize()\r\n public vignetteWeight = 1.5;\r\n\r\n /**\r\n * Color of the vignette applied on the screen through the chosen blend mode (vignetteBlendMode)\r\n * if vignetteEnabled is set to true.\r\n */\r\n @serializeAsColor4()\r\n public vignetteColor: Color4 = new Color4(0, 0, 0, 0);\r\n\r\n /**\r\n * Camera field of view used by the Vignette effect.\r\n */\r\n @serialize()\r\n public vignetteCameraFov = 0.5;\r\n\r\n @serialize()\r\n private _vignetteBlendMode = ImageProcessingConfiguration.VIGNETTEMODE_MULTIPLY;\r\n /**\r\n * Gets the vignette blend mode allowing different kind of effect.\r\n */\r\n public get vignetteBlendMode(): number {\r\n return this._vignetteBlendMode;\r\n }\r\n /**\r\n * Sets the vignette blend mode allowing different kind of effect.\r\n */\r\n public set vignetteBlendMode(value: number) {\r\n if (this._vignetteBlendMode === value) {\r\n return;\r\n }\r\n\r\n this._vignetteBlendMode = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _vignetteEnabled = false;\r\n /**\r\n * Gets whether the vignette effect is enabled.\r\n */\r\n public get vignetteEnabled(): boolean {\r\n return this._vignetteEnabled;\r\n }\r\n /**\r\n * Sets whether the vignette effect is enabled.\r\n */\r\n public set vignetteEnabled(value: boolean) {\r\n if (this._vignetteEnabled === value) {\r\n return;\r\n }\r\n\r\n this._vignetteEnabled = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _ditheringEnabled = false;\r\n /**\r\n * Gets whether the dithering effect is enabled.\r\n * The dithering effect can be used to reduce banding.\r\n */\r\n public get ditheringEnabled(): boolean {\r\n return this._ditheringEnabled;\r\n }\r\n /**\r\n * Sets whether the dithering effect is enabled.\r\n * The dithering effect can be used to reduce banding.\r\n */\r\n public set ditheringEnabled(value: boolean) {\r\n if (this._ditheringEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ditheringEnabled = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _ditheringIntensity = 1.0 / 255.0;\r\n /**\r\n * Gets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0.\r\n */\r\n public get ditheringIntensity(): number {\r\n return this._ditheringIntensity;\r\n }\r\n /**\r\n * Sets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0.\r\n */\r\n public set ditheringIntensity(value: number) {\r\n if (this._ditheringIntensity === value) {\r\n return;\r\n }\r\n\r\n this._ditheringIntensity = value;\r\n this._updateParameters();\r\n }\r\n\r\n /** @internal */\r\n @serialize()\r\n public _skipFinalColorClamp = false;\r\n /**\r\n * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader\r\n * Applies to PBR materials.\r\n */\r\n public get skipFinalColorClamp(): boolean {\r\n return this._skipFinalColorClamp;\r\n }\r\n /**\r\n * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader\r\n * Applies to PBR materials.\r\n */\r\n public set skipFinalColorClamp(value: boolean) {\r\n if (this._skipFinalColorClamp === value) {\r\n return;\r\n }\r\n\r\n this._skipFinalColorClamp = value;\r\n this._updateParameters();\r\n }\r\n\r\n /** @internal */\r\n @serialize()\r\n public _applyByPostProcess = false;\r\n /**\r\n * Gets whether the image processing is applied through a post process or not.\r\n */\r\n public get applyByPostProcess(): boolean {\r\n return this._applyByPostProcess;\r\n }\r\n /**\r\n * Sets whether the image processing is applied through a post process or not.\r\n */\r\n public set applyByPostProcess(value: boolean) {\r\n if (this._applyByPostProcess === value) {\r\n return;\r\n }\r\n\r\n this._applyByPostProcess = value;\r\n this._updateParameters();\r\n }\r\n\r\n @serialize()\r\n private _isEnabled = true;\r\n /**\r\n * Gets whether the image processing is enabled or not.\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n /**\r\n * Sets whether the image processing is enabled or not.\r\n */\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n this._updateParameters();\r\n }\r\n\r\n /**\r\n * An event triggered when the configuration changes and requires Shader to Update some parameters.\r\n */\r\n public onUpdateParameters = new Observable();\r\n\r\n /**\r\n * Method called each time the image processing information changes requires to recompile the effect.\r\n */\r\n protected _updateParameters(): void {\r\n this.onUpdateParameters.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Gets the current class name.\r\n * @returns \"ImageProcessingConfiguration\"\r\n */\r\n public getClassName(): string {\r\n return \"ImageProcessingConfiguration\";\r\n }\r\n\r\n /**\r\n * Prepare the list of uniforms associated with the Image Processing effects.\r\n * @param uniforms The list of uniforms used in the effect\r\n * @param defines the list of defines currently in use\r\n */\r\n public static PrepareUniforms: (uniforms: string[], defines: IImageProcessingConfigurationDefines) => void = PrepareUniformsForImageProcessing;\r\n\r\n /**\r\n * Prepare the list of samplers associated with the Image Processing effects.\r\n * @param samplersList The list of uniforms used in the effect\r\n * @param defines the list of defines currently in use\r\n */\r\n public static PrepareSamplers: (samplersList: string[], defines: IImageProcessingConfigurationDefines) => void = PrepareSamplersForImageProcessing;\r\n\r\n /**\r\n * Prepare the list of defines associated to the shader.\r\n * @param defines the list of defines to complete\r\n * @param forPostProcess Define if we are currently in post process mode or not\r\n */\r\n public prepareDefines(defines: IImageProcessingConfigurationDefines, forPostProcess = false): void {\r\n if (forPostProcess !== this.applyByPostProcess || !this._isEnabled) {\r\n defines.VIGNETTE = false;\r\n defines.TONEMAPPING = false;\r\n defines.TONEMAPPING_ACES = false;\r\n defines.CONTRAST = false;\r\n defines.EXPOSURE = false;\r\n defines.COLORCURVES = false;\r\n defines.COLORGRADING = false;\r\n defines.COLORGRADING3D = false;\r\n defines.DITHER = false;\r\n defines.IMAGEPROCESSING = false;\r\n defines.SKIPFINALCOLORCLAMP = this.skipFinalColorClamp;\r\n defines.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess && this._isEnabled;\r\n return;\r\n }\r\n\r\n defines.VIGNETTE = this.vignetteEnabled;\r\n defines.VIGNETTEBLENDMODEMULTIPLY = this.vignetteBlendMode === ImageProcessingConfiguration._VIGNETTEMODE_MULTIPLY;\r\n defines.VIGNETTEBLENDMODEOPAQUE = !defines.VIGNETTEBLENDMODEMULTIPLY;\r\n\r\n defines.TONEMAPPING = this.toneMappingEnabled;\r\n switch (this._toneMappingType) {\r\n case ImageProcessingConfiguration.TONEMAPPING_ACES:\r\n defines.TONEMAPPING_ACES = true;\r\n break;\r\n default:\r\n defines.TONEMAPPING_ACES = false;\r\n break;\r\n }\r\n\r\n defines.CONTRAST = this.contrast !== 1.0;\r\n defines.EXPOSURE = this.exposure !== 1.0;\r\n defines.COLORCURVES = this.colorCurvesEnabled && !!this.colorCurves;\r\n defines.COLORGRADING = this.colorGradingEnabled && !!this.colorGradingTexture;\r\n if (defines.COLORGRADING) {\r\n defines.COLORGRADING3D = this.colorGradingTexture!.is3D;\r\n } else {\r\n defines.COLORGRADING3D = false;\r\n }\r\n defines.SAMPLER3DGREENDEPTH = this.colorGradingWithGreenDepth;\r\n defines.SAMPLER3DBGRMAP = this.colorGradingBGR;\r\n defines.DITHER = this._ditheringEnabled;\r\n defines.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess;\r\n defines.SKIPFINALCOLORCLAMP = this.skipFinalColorClamp;\r\n defines.IMAGEPROCESSING = defines.VIGNETTE || defines.TONEMAPPING || defines.CONTRAST || defines.EXPOSURE || defines.COLORCURVES || defines.COLORGRADING || defines.DITHER;\r\n }\r\n\r\n /**\r\n * Returns true if all the image processing information are ready.\r\n * @returns True if ready, otherwise, false\r\n */\r\n public isReady() {\r\n // Color Grading texture can not be none blocking.\r\n return !this.colorGradingEnabled || !this.colorGradingTexture || this.colorGradingTexture.isReady();\r\n }\r\n\r\n /**\r\n * Binds the image processing to the shader.\r\n * @param effect The effect to bind to\r\n * @param overrideAspectRatio Override the aspect ratio of the effect\r\n */\r\n public bind(effect: Effect, overrideAspectRatio?: number): void {\r\n // Color Curves\r\n if (this._colorCurvesEnabled && this.colorCurves) {\r\n ColorCurves.Bind(this.colorCurves, effect);\r\n }\r\n\r\n // Vignette and dither handled together due to common uniform.\r\n if (this._vignetteEnabled || this._ditheringEnabled) {\r\n const inverseWidth = 1 / effect.getEngine().getRenderWidth();\r\n const inverseHeight = 1 / effect.getEngine().getRenderHeight();\r\n effect.setFloat2(\"vInverseScreenSize\", inverseWidth, inverseHeight);\r\n\r\n if (this._ditheringEnabled) {\r\n effect.setFloat(\"ditherIntensity\", 0.5 * this._ditheringIntensity);\r\n }\r\n\r\n if (this._vignetteEnabled) {\r\n const aspectRatio = overrideAspectRatio != null ? overrideAspectRatio : inverseHeight / inverseWidth;\r\n\r\n let vignetteScaleY = Math.tan(this.vignetteCameraFov * 0.5);\r\n let vignetteScaleX = vignetteScaleY * aspectRatio;\r\n\r\n const vignetteScaleGeometricMean = Math.sqrt(vignetteScaleX * vignetteScaleY);\r\n vignetteScaleX = Mix(vignetteScaleX, vignetteScaleGeometricMean, this.vignetteStretch);\r\n vignetteScaleY = Mix(vignetteScaleY, vignetteScaleGeometricMean, this.vignetteStretch);\r\n\r\n effect.setFloat4(\"vignetteSettings1\", vignetteScaleX, vignetteScaleY, -vignetteScaleX * this.vignetteCenterX, -vignetteScaleY * this.vignetteCenterY);\r\n\r\n const vignettePower = -2.0 * this.vignetteWeight;\r\n effect.setFloat4(\"vignetteSettings2\", this.vignetteColor.r, this.vignetteColor.g, this.vignetteColor.b, vignettePower);\r\n }\r\n }\r\n\r\n // Exposure\r\n effect.setFloat(\"exposureLinear\", this.exposure);\r\n\r\n // Contrast\r\n effect.setFloat(\"contrast\", this.contrast);\r\n\r\n // Color transform settings\r\n if (this.colorGradingTexture) {\r\n effect.setTexture(\"txColorTransform\", this.colorGradingTexture);\r\n const textureSize = this.colorGradingTexture.getSize().height;\r\n\r\n effect.setFloat4(\r\n \"colorTransformSettings\",\r\n (textureSize - 1) / textureSize, // textureScale\r\n 0.5 / textureSize, // textureOffset\r\n textureSize, // textureSize\r\n this.colorGradingTexture.level // weight\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Clones the current image processing instance.\r\n * @returns The cloned image processing\r\n */\r\n public clone(): ImageProcessingConfiguration {\r\n return SerializationHelper.Clone(() => new ImageProcessingConfiguration(), this);\r\n }\r\n\r\n /**\r\n * Serializes the current image processing instance to a json representation.\r\n * @returns a JSON representation\r\n */\r\n public serialize(): any {\r\n return SerializationHelper.Serialize(this);\r\n }\r\n\r\n /**\r\n * Parses the image processing from a json representation.\r\n * @param source the JSON source to parse\r\n * @returns The parsed image processing\r\n */\r\n public static Parse(source: any): ImageProcessingConfiguration {\r\n const parsed = SerializationHelper.Parse(() => new ImageProcessingConfiguration(), source, null, null);\r\n // Backward compatibility\r\n if (source.vignetteCentreX !== undefined) {\r\n parsed.vignetteCenterX = source.vignetteCentreX;\r\n }\r\n if (source.vignetteCentreY !== undefined) {\r\n parsed.vignetteCenterY = source.vignetteCentreY;\r\n }\r\n\r\n return parsed;\r\n }\r\n\r\n // Static constants associated to the image processing.\r\n private static _VIGNETTEMODE_MULTIPLY = 0;\r\n private static _VIGNETTEMODE_OPAQUE = 1;\r\n\r\n /**\r\n * Used to apply the vignette as a mix with the pixel color.\r\n */\r\n public static get VIGNETTEMODE_MULTIPLY(): number {\r\n return this._VIGNETTEMODE_MULTIPLY;\r\n }\r\n\r\n /**\r\n * Used to apply the vignette as a replacement of the pixel color.\r\n */\r\n public static get VIGNETTEMODE_OPAQUE(): number {\r\n return this._VIGNETTEMODE_OPAQUE;\r\n }\r\n}\r\n\r\n// References the dependencies.\r\nSerializationHelper._ImageProcessingConfigurationParser = ImageProcessingConfiguration.Parse;\r\n", "import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { FloatArray, Nullable } from \"../../types\";\r\nimport type { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport { WebGLDataBuffer } from \"../../Meshes/WebGL/webGLDataBuffer\";\r\nimport type { IPipelineContext } from \"../IPipelineContext\";\r\nimport type { WebGLPipelineContext } from \"../WebGL/webGLPipelineContext\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Create an uniform buffer\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n * @param elements defines the content of the uniform buffer\r\n * @param label defines a name for the buffer (for debugging purpose)\r\n * @returns the webGL uniform buffer\r\n */\r\n createUniformBuffer(elements: FloatArray, label?: string): DataBuffer;\r\n\r\n /**\r\n * Create a dynamic uniform buffer\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n * @param elements defines the content of the uniform buffer\r\n * @param label defines a name for the buffer (for debugging purpose)\r\n * @returns the webGL uniform buffer\r\n */\r\n createDynamicUniformBuffer(elements: FloatArray, label?: string): DataBuffer;\r\n\r\n /**\r\n * Update an existing uniform buffer\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#uniform-buffer-objets\r\n * @param uniformBuffer defines the target uniform buffer\r\n * @param elements defines the content to update\r\n * @param offset defines the offset in the uniform buffer where update should start\r\n * @param count defines the size of the data to update\r\n */\r\n updateUniformBuffer(uniformBuffer: DataBuffer, elements: FloatArray, offset?: number, count?: number): void;\r\n\r\n /**\r\n * Bind an uniform buffer to the current webGL context\r\n * @param buffer defines the buffer to bind\r\n */\r\n bindUniformBuffer(buffer: Nullable): void;\r\n\r\n /**\r\n * Bind a buffer to the current webGL context at a given location\r\n * @param buffer defines the buffer to bind\r\n * @param location defines the index where to bind the buffer\r\n * @param name Name of the uniform variable to bind\r\n */\r\n bindUniformBufferBase(buffer: DataBuffer, location: number, name: string): void;\r\n\r\n /**\r\n * Bind a specific block at a given index in a specific shader program\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param blockName defines the block name\r\n * @param index defines the index where to bind the block\r\n */\r\n bindUniformBlock(pipelineContext: IPipelineContext, blockName: string, index: number): void;\r\n }\r\n}\r\n\r\nThinEngine.prototype.createUniformBuffer = function (elements: FloatArray, _label?: string): DataBuffer {\r\n const ubo = this._gl.createBuffer();\r\n\r\n if (!ubo) {\r\n throw new Error(\"Unable to create uniform buffer\");\r\n }\r\n const result = new WebGLDataBuffer(ubo);\r\n\r\n this.bindUniformBuffer(result);\r\n\r\n if (elements instanceof Float32Array) {\r\n this._gl.bufferData(this._gl.UNIFORM_BUFFER, elements, this._gl.STATIC_DRAW);\r\n } else {\r\n this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(elements), this._gl.STATIC_DRAW);\r\n }\r\n\r\n this.bindUniformBuffer(null);\r\n\r\n result.references = 1;\r\n return result;\r\n};\r\n\r\nThinEngine.prototype.createDynamicUniformBuffer = function (elements: FloatArray, _label?: string): DataBuffer {\r\n const ubo = this._gl.createBuffer();\r\n\r\n if (!ubo) {\r\n throw new Error(\"Unable to create dynamic uniform buffer\");\r\n }\r\n\r\n const result = new WebGLDataBuffer(ubo);\r\n this.bindUniformBuffer(result);\r\n\r\n if (elements instanceof Float32Array) {\r\n this._gl.bufferData(this._gl.UNIFORM_BUFFER, elements, this._gl.DYNAMIC_DRAW);\r\n } else {\r\n this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(elements), this._gl.DYNAMIC_DRAW);\r\n }\r\n\r\n this.bindUniformBuffer(null);\r\n\r\n result.references = 1;\r\n return result;\r\n};\r\n\r\nThinEngine.prototype.updateUniformBuffer = function (uniformBuffer: DataBuffer, elements: FloatArray, offset?: number, count?: number): void {\r\n this.bindUniformBuffer(uniformBuffer);\r\n\r\n if (offset === undefined) {\r\n offset = 0;\r\n }\r\n\r\n if (count === undefined) {\r\n if (elements instanceof Float32Array) {\r\n this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, offset, elements);\r\n } else {\r\n this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, offset, new Float32Array(elements));\r\n }\r\n } else {\r\n if (elements instanceof Float32Array) {\r\n this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, elements.subarray(offset, offset + count));\r\n } else {\r\n this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, new Float32Array(elements).subarray(offset, offset + count));\r\n }\r\n }\r\n\r\n this.bindUniformBuffer(null);\r\n};\r\n\r\nThinEngine.prototype.bindUniformBuffer = function (buffer: Nullable): void {\r\n this._gl.bindBuffer(this._gl.UNIFORM_BUFFER, buffer ? buffer.underlyingResource : null);\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nThinEngine.prototype.bindUniformBufferBase = function (buffer: DataBuffer, location: number, name: string): void {\r\n this._gl.bindBufferBase(this._gl.UNIFORM_BUFFER, location, buffer ? buffer.underlyingResource : null);\r\n};\r\n\r\nThinEngine.prototype.bindUniformBlock = function (pipelineContext: IPipelineContext, blockName: string, index: number): void {\r\n const program = (pipelineContext as WebGLPipelineContext).program!;\r\n\r\n const uniformLocation = this._gl.getUniformBlockIndex(program, blockName);\r\n\r\n if (uniformLocation !== 0xffffffff) {\r\n this._gl.uniformBlockBinding(program, uniformLocation, index);\r\n }\r\n};\r\n", "import { Logger } from \"../Misc/logger\";\r\nimport type { Nullable, FloatArray } from \"../types\";\r\nimport type { IMatrixLike, IVector3Like, IVector4Like, IColor3Like, IColor4Like } from \"../Maths/math.like\";\r\nimport type { Effect } from \"./effect\";\r\nimport type { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport type { InternalTexture } from \"./Textures/internalTexture\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport \"../Engines/Extensions/engine.uniformBuffer\";\r\n\r\n/**\r\n * Uniform buffer objects.\r\n *\r\n * Handles blocks of uniform on the GPU.\r\n *\r\n * If WebGL 2 is not available, this class falls back on traditional setUniformXXX calls.\r\n *\r\n * For more information, please refer to :\r\n * https://www.khronos.org/opengl/wiki/Uniform_Buffer_Object\r\n */\r\nexport class UniformBuffer {\r\n /** @internal */\r\n public static _UpdatedUbosInFrame: { [name: string]: number } = {};\r\n\r\n private _engine: ThinEngine;\r\n private _buffer: Nullable;\r\n private _buffers: Array<[DataBuffer, Float32Array | undefined]>;\r\n private _bufferIndex: number;\r\n private _createBufferOnWrite: boolean;\r\n private _data: number[];\r\n private _bufferData: Float32Array;\r\n private _dynamic?: boolean;\r\n private _uniformLocations: { [key: string]: number };\r\n private _uniformSizes: { [key: string]: number };\r\n private _uniformArraySizes: { [key: string]: { strideSize: number; arraySize: number } };\r\n private _uniformLocationPointer: number;\r\n private _needSync: boolean;\r\n private _noUBO: boolean;\r\n private _currentEffect: Effect;\r\n private _currentEffectName: string;\r\n private _name: string;\r\n private _currentFrameId: number;\r\n\r\n // Pool for avoiding memory leaks\r\n private static _MAX_UNIFORM_SIZE = 256;\r\n private static _TempBuffer = new Float32Array(UniformBuffer._MAX_UNIFORM_SIZE);\r\n private static _TempBufferInt32View = new Int32Array(UniformBuffer._TempBuffer.buffer);\r\n private static _TempBufferUInt32View = new Uint32Array(UniformBuffer._TempBuffer.buffer);\r\n\r\n /**\r\n * Lambda to Update a 3x3 Matrix in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateMatrix3x3: (name: string, matrix: Float32Array) => void;\r\n\r\n /**\r\n * Lambda to Update a 2x2 Matrix in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateMatrix2x2: (name: string, matrix: Float32Array) => void;\r\n\r\n /**\r\n * Lambda to Update a single float in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateFloat: (name: string, x: number) => void;\r\n\r\n /**\r\n * Lambda to Update a vec2 of float in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateFloat2: (name: string, x: number, y: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec3 of float in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateFloat3: (name: string, x: number, y: number, z: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec4 of float in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateFloat4: (name: string, x: number, y: number, z: number, w: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update an array of float in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateFloatArray: (name: string, array: Float32Array) => void;\r\n\r\n /**\r\n * Lambda to Update an array of number in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateArray: (name: string, array: number[]) => void;\r\n\r\n /**\r\n * Lambda to Update an array of number in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateIntArray: (name: string, array: Int32Array) => void;\r\n\r\n /**\r\n * Lambda to Update an array of number in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateUIntArray: (name: string, array: Uint32Array) => void;\r\n\r\n /**\r\n * Lambda to Update a 4x4 Matrix in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateMatrix: (name: string, mat: IMatrixLike) => void;\r\n\r\n /**\r\n * Lambda to Update an array of 4x4 Matrix in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateMatrices: (name: string, mat: Float32Array) => void;\r\n\r\n /**\r\n * Lambda to Update vec3 of float from a Vector in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateVector3: (name: string, vector: IVector3Like) => void;\r\n\r\n /**\r\n * Lambda to Update vec4 of float from a Vector in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateVector4: (name: string, vector: IVector4Like) => void;\r\n\r\n /**\r\n * Lambda to Update vec3 of float from a Color in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateColor3: (name: string, color: IColor3Like, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update vec4 of float from a Color in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateColor4: (name: string, color: IColor3Like, alpha: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update vec4 of float from a Color in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateDirectColor4: (name: string, color: IColor4Like, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a int a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateInt: (name: string, x: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec2 of int in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateInt2: (name: string, x: number, y: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec3 of int in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateInt3: (name: string, x: number, y: number, z: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec4 of int in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateInt4: (name: string, x: number, y: number, z: number, w: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a unsigned int a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateUInt: (name: string, x: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec2 of unsigned int in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateUInt2: (name: string, x: number, y: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec3 of unsigned int in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateUInt3: (name: string, x: number, y: number, z: number, suffix?: string) => void;\r\n\r\n /**\r\n * Lambda to Update a vec4 of unsigned int in a uniform buffer.\r\n * This is dynamic to allow compat with webgl 1 and 2.\r\n * You will need to pass the name of the uniform as well as the value.\r\n */\r\n public updateUInt4: (name: string, x: number, y: number, z: number, w: number, suffix?: string) => void;\r\n\r\n /**\r\n * Instantiates a new Uniform buffer objects.\r\n *\r\n * Handles blocks of uniform on the GPU.\r\n *\r\n * If WebGL 2 is not available, this class falls back on traditional setUniformXXX calls.\r\n *\r\n * For more information, please refer to :\r\n * @see https://www.khronos.org/opengl/wiki/Uniform_Buffer_Object\r\n * @param engine Define the engine the buffer is associated with\r\n * @param data Define the data contained in the buffer\r\n * @param dynamic Define if the buffer is updatable\r\n * @param name to assign to the buffer (debugging purpose)\r\n * @param forceNoUniformBuffer define that this object must not rely on UBO objects\r\n */\r\n constructor(engine: ThinEngine, data?: number[], dynamic?: boolean, name?: string, forceNoUniformBuffer = false) {\r\n this._engine = engine;\r\n this._noUBO = !engine.supportsUniformBuffers || forceNoUniformBuffer;\r\n this._dynamic = dynamic;\r\n this._name = name ?? \"no-name\";\r\n\r\n this._data = data || [];\r\n\r\n this._uniformLocations = {};\r\n this._uniformSizes = {};\r\n this._uniformArraySizes = {};\r\n this._uniformLocationPointer = 0;\r\n this._needSync = false;\r\n\r\n if (this._engine._features.trackUbosInFrame) {\r\n this._buffers = [];\r\n this._bufferIndex = -1;\r\n this._createBufferOnWrite = false;\r\n this._currentFrameId = 0;\r\n }\r\n\r\n if (this._noUBO) {\r\n this.updateMatrix3x3 = this._updateMatrix3x3ForEffect;\r\n this.updateMatrix2x2 = this._updateMatrix2x2ForEffect;\r\n this.updateFloat = this._updateFloatForEffect;\r\n this.updateFloat2 = this._updateFloat2ForEffect;\r\n this.updateFloat3 = this._updateFloat3ForEffect;\r\n this.updateFloat4 = this._updateFloat4ForEffect;\r\n this.updateFloatArray = this._updateFloatArrayForEffect;\r\n this.updateArray = this._updateArrayForEffect;\r\n this.updateIntArray = this._updateIntArrayForEffect;\r\n this.updateUIntArray = this._updateUIntArrayForEffect;\r\n this.updateMatrix = this._updateMatrixForEffect;\r\n this.updateMatrices = this._updateMatricesForEffect;\r\n this.updateVector3 = this._updateVector3ForEffect;\r\n this.updateVector4 = this._updateVector4ForEffect;\r\n this.updateColor3 = this._updateColor3ForEffect;\r\n this.updateColor4 = this._updateColor4ForEffect;\r\n this.updateDirectColor4 = this._updateDirectColor4ForEffect;\r\n this.updateInt = this._updateIntForEffect;\r\n this.updateInt2 = this._updateInt2ForEffect;\r\n this.updateInt3 = this._updateInt3ForEffect;\r\n this.updateInt4 = this._updateInt4ForEffect;\r\n this.updateUInt = this._updateUIntForEffect;\r\n this.updateUInt2 = this._updateUInt2ForEffect;\r\n this.updateUInt3 = this._updateUInt3ForEffect;\r\n this.updateUInt4 = this._updateUInt4ForEffect;\r\n } else {\r\n this._engine._uniformBuffers.push(this);\r\n\r\n this.updateMatrix3x3 = this._updateMatrix3x3ForUniform;\r\n this.updateMatrix2x2 = this._updateMatrix2x2ForUniform;\r\n this.updateFloat = this._updateFloatForUniform;\r\n this.updateFloat2 = this._updateFloat2ForUniform;\r\n this.updateFloat3 = this._updateFloat3ForUniform;\r\n this.updateFloat4 = this._updateFloat4ForUniform;\r\n this.updateFloatArray = this._updateFloatArrayForUniform;\r\n this.updateArray = this._updateArrayForUniform;\r\n this.updateIntArray = this._updateIntArrayForUniform;\r\n this.updateUIntArray = this._updateUIntArrayForUniform;\r\n this.updateMatrix = this._updateMatrixForUniform;\r\n this.updateMatrices = this._updateMatricesForUniform;\r\n this.updateVector3 = this._updateVector3ForUniform;\r\n this.updateVector4 = this._updateVector4ForUniform;\r\n this.updateColor3 = this._updateColor3ForUniform;\r\n this.updateColor4 = this._updateColor4ForUniform;\r\n this.updateDirectColor4 = this._updateDirectColor4ForUniform;\r\n this.updateInt = this._updateIntForUniform;\r\n this.updateInt2 = this._updateInt2ForUniform;\r\n this.updateInt3 = this._updateInt3ForUniform;\r\n this.updateInt4 = this._updateInt4ForUniform;\r\n this.updateUInt = this._updateUIntForUniform;\r\n this.updateUInt2 = this._updateUInt2ForUniform;\r\n this.updateUInt3 = this._updateUInt3ForUniform;\r\n this.updateUInt4 = this._updateUInt4ForUniform;\r\n }\r\n }\r\n\r\n /**\r\n * Indicates if the buffer is using the WebGL2 UBO implementation,\r\n * or just falling back on setUniformXXX calls.\r\n */\r\n public get useUbo(): boolean {\r\n return !this._noUBO;\r\n }\r\n\r\n /**\r\n * Indicates if the WebGL underlying uniform buffer is in sync\r\n * with the javascript cache data.\r\n */\r\n public get isSync(): boolean {\r\n return !this._needSync;\r\n }\r\n\r\n /**\r\n * Indicates if the WebGL underlying uniform buffer is dynamic.\r\n * Also, a dynamic UniformBuffer will disable cache verification and always\r\n * update the underlying WebGL uniform buffer to the GPU.\r\n * @returns if Dynamic, otherwise false\r\n */\r\n public isDynamic(): boolean {\r\n return this._dynamic !== undefined;\r\n }\r\n\r\n /**\r\n * The data cache on JS side.\r\n * @returns the underlying data as a float array\r\n */\r\n public getData(): Float32Array {\r\n return this._bufferData;\r\n }\r\n\r\n /**\r\n * The underlying WebGL Uniform buffer.\r\n * @returns the webgl buffer\r\n */\r\n public getBuffer(): Nullable {\r\n return this._buffer;\r\n }\r\n\r\n /**\r\n * std140 layout specifies how to align data within an UBO structure.\r\n * See https://khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf#page=159\r\n * for specs.\r\n * @param size\r\n */\r\n private _fillAlignment(size: number) {\r\n // This code has been simplified because we only use floats, vectors of 1, 2, 3, 4 components\r\n // and 4x4 matrices\r\n // TODO : change if other types are used\r\n\r\n let alignment;\r\n if (size <= 2) {\r\n alignment = size;\r\n } else {\r\n alignment = 4;\r\n }\r\n\r\n if (this._uniformLocationPointer % alignment !== 0) {\r\n const oldPointer = this._uniformLocationPointer;\r\n this._uniformLocationPointer += alignment - (this._uniformLocationPointer % alignment);\r\n const diff = this._uniformLocationPointer - oldPointer;\r\n\r\n for (let i = 0; i < diff; i++) {\r\n this._data.push(0);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Adds an uniform in the buffer.\r\n * Warning : the subsequents calls of this function must be in the same order as declared in the shader\r\n * for the layout to be correct ! The addUniform function only handles types like float, vec2, vec3, vec4, mat4,\r\n * meaning size=1,2,3,4 or 16. It does not handle struct types.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param size Data size, or data directly.\r\n * @param arraySize The number of elements in the array, 0 if not an array.\r\n */\r\n public addUniform(name: string, size: number | number[], arraySize = 0) {\r\n if (this._noUBO) {\r\n return;\r\n }\r\n\r\n if (this._uniformLocations[name] !== undefined) {\r\n // Already existing uniform\r\n return;\r\n }\r\n // This function must be called in the order of the shader layout !\r\n // size can be the size of the uniform, or data directly\r\n let data;\r\n\r\n // std140 FTW...\r\n if (arraySize > 0) {\r\n if (size instanceof Array) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"addUniform should not be use with Array in UBO: \" + name;\r\n }\r\n\r\n this._fillAlignment(4);\r\n\r\n this._uniformArraySizes[name] = { strideSize: size, arraySize };\r\n if (size == 16) {\r\n size = size * arraySize;\r\n } else {\r\n const perElementPadding = 4 - size;\r\n const totalPadding = perElementPadding * arraySize;\r\n size = size * arraySize + totalPadding;\r\n }\r\n\r\n data = [];\r\n // Fill with zeros\r\n for (let i = 0; i < size; i++) {\r\n data.push(0);\r\n }\r\n } else {\r\n if (size instanceof Array) {\r\n data = size;\r\n size = data.length;\r\n } else {\r\n size = size;\r\n data = [];\r\n\r\n // Fill with zeros\r\n for (let i = 0; i < size; i++) {\r\n data.push(0);\r\n }\r\n }\r\n this._fillAlignment(size);\r\n }\r\n\r\n this._uniformSizes[name] = size;\r\n this._uniformLocations[name] = this._uniformLocationPointer;\r\n this._uniformLocationPointer += size;\r\n\r\n for (let i = 0; i < size; i++) {\r\n this._data.push(data[i]);\r\n }\r\n\r\n this._needSync = true;\r\n }\r\n\r\n /**\r\n * Adds a Matrix 4x4 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param mat A 4x4 matrix.\r\n */\r\n public addMatrix(name: string, mat: IMatrixLike) {\r\n this.addUniform(name, Array.prototype.slice.call(mat.asArray()));\r\n }\r\n\r\n /**\r\n * Adds a vec2 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param x Define the x component value of the vec2\r\n * @param y Define the y component value of the vec2\r\n */\r\n public addFloat2(name: string, x: number, y: number) {\r\n const temp = [x, y];\r\n this.addUniform(name, temp);\r\n }\r\n\r\n /**\r\n * Adds a vec3 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param x Define the x component value of the vec3\r\n * @param y Define the y component value of the vec3\r\n * @param z Define the z component value of the vec3\r\n */\r\n public addFloat3(name: string, x: number, y: number, z: number) {\r\n const temp = [x, y, z];\r\n this.addUniform(name, temp);\r\n }\r\n\r\n /**\r\n * Adds a vec3 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param color Define the vec3 from a Color\r\n */\r\n public addColor3(name: string, color: IColor3Like) {\r\n const temp = [color.r, color.g, color.b];\r\n this.addUniform(name, temp);\r\n }\r\n\r\n /**\r\n * Adds a vec4 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param color Define the rgb components from a Color\r\n * @param alpha Define the a component of the vec4\r\n */\r\n public addColor4(name: string, color: IColor3Like, alpha: number) {\r\n const temp = [color.r, color.g, color.b, alpha];\r\n this.addUniform(name, temp);\r\n }\r\n\r\n /**\r\n * Adds a vec3 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n * @param vector Define the vec3 components from a Vector\r\n */\r\n public addVector3(name: string, vector: IVector3Like) {\r\n const temp = [vector.x, vector.y, vector.z];\r\n this.addUniform(name, temp);\r\n }\r\n\r\n /**\r\n * Adds a Matrix 3x3 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n */\r\n public addMatrix3x3(name: string) {\r\n this.addUniform(name, 12);\r\n }\r\n\r\n /**\r\n * Adds a Matrix 2x2 to the uniform buffer.\r\n * @param name Name of the uniform, as used in the uniform block in the shader.\r\n */\r\n public addMatrix2x2(name: string) {\r\n this.addUniform(name, 8);\r\n }\r\n\r\n /**\r\n * Effectively creates the WebGL Uniform Buffer, once layout is completed with `addUniform`.\r\n */\r\n public create(): void {\r\n if (this._noUBO) {\r\n return;\r\n }\r\n if (this._buffer) {\r\n return; // nothing to do\r\n }\r\n\r\n // See spec, alignment must be filled as a vec4\r\n this._fillAlignment(4);\r\n this._bufferData = new Float32Array(this._data);\r\n\r\n this._rebuild();\r\n\r\n this._needSync = true;\r\n }\r\n\r\n // The result of this method is used for debugging purpose, as part of the buffer name\r\n // It is meant to more easily know what this buffer is about when debugging\r\n // Some buffers can have a lot of uniforms (several dozens), so the method only returns the first 10 of them\r\n // (should be enough to understand what the buffer is for)\r\n private _getNames() {\r\n const names = [];\r\n let i = 0;\r\n for (const name in this._uniformLocations) {\r\n names.push(name);\r\n if (++i === 10) {\r\n break;\r\n }\r\n }\r\n return names.join(\",\");\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this._noUBO || !this._bufferData) {\r\n return;\r\n }\r\n\r\n if (this._dynamic) {\r\n this._buffer = this._engine.createDynamicUniformBuffer(this._bufferData, this._name + \"_UniformList:\" + this._getNames());\r\n } else {\r\n this._buffer = this._engine.createUniformBuffer(this._bufferData, this._name + \"_UniformList:\" + this._getNames());\r\n }\r\n\r\n if (this._engine._features.trackUbosInFrame) {\r\n this._buffers.push([this._buffer, this._engine._features.checkUbosContentBeforeUpload ? this._bufferData.slice() : undefined]);\r\n this._bufferIndex = this._buffers.length - 1;\r\n this._createBufferOnWrite = false;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _rebuildAfterContextLost(): void {\r\n if (this._engine._features.trackUbosInFrame) {\r\n this._buffers = [];\r\n this._currentFrameId = 0;\r\n }\r\n this._rebuild();\r\n }\r\n\r\n /** @internal */\r\n public get _numBuffers(): number {\r\n return this._buffers.length;\r\n }\r\n\r\n /** @internal */\r\n public get _indexBuffer(): number {\r\n return this._bufferIndex;\r\n }\r\n\r\n /** Gets the name of this buffer */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n /** Gets the current effect */\r\n public get currentEffect(): Nullable {\r\n return this._currentEffect;\r\n }\r\n\r\n private _buffersEqual(buf1: Float32Array, buf2: Float32Array): boolean {\r\n for (let i = 0; i < buf1.length; ++i) {\r\n if (buf1[i] !== buf2[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n private _copyBuffer(src: Float32Array, dst: Float32Array): void {\r\n for (let i = 0; i < src.length; ++i) {\r\n dst[i] = src[i];\r\n }\r\n }\r\n\r\n /**\r\n * Updates the WebGL Uniform Buffer on the GPU.\r\n * If the `dynamic` flag is set to true, no cache comparison is done.\r\n * Otherwise, the buffer will be updated only if the cache differs.\r\n */\r\n public update(): void {\r\n if (this._noUBO) {\r\n return;\r\n }\r\n\r\n this.bindUniformBuffer();\r\n\r\n if (!this._buffer) {\r\n this.create();\r\n return;\r\n }\r\n\r\n if (!this._dynamic && !this._needSync) {\r\n this._createBufferOnWrite = this._engine._features.trackUbosInFrame;\r\n return;\r\n }\r\n\r\n if (this._buffers && this._buffers.length > 1 && this._buffers[this._bufferIndex][1]) {\r\n if (this._buffersEqual(this._bufferData, this._buffers[this._bufferIndex][1]!)) {\r\n this._needSync = false;\r\n this._createBufferOnWrite = this._engine._features.trackUbosInFrame;\r\n return;\r\n } else {\r\n this._copyBuffer(this._bufferData, this._buffers[this._bufferIndex][1]!);\r\n }\r\n }\r\n\r\n this._engine.updateUniformBuffer(this._buffer, this._bufferData);\r\n\r\n if (this._engine._features._collectUbosUpdatedInFrame) {\r\n if (!UniformBuffer._UpdatedUbosInFrame[this._name]) {\r\n UniformBuffer._UpdatedUbosInFrame[this._name] = 0;\r\n }\r\n UniformBuffer._UpdatedUbosInFrame[this._name]++;\r\n }\r\n\r\n this._needSync = false;\r\n this._createBufferOnWrite = this._engine._features.trackUbosInFrame;\r\n }\r\n\r\n private _createNewBuffer() {\r\n if (this._bufferIndex + 1 < this._buffers.length) {\r\n this._bufferIndex++;\r\n this._buffer = this._buffers[this._bufferIndex][0];\r\n this._createBufferOnWrite = false;\r\n this._needSync = true;\r\n } else {\r\n this._rebuild();\r\n }\r\n }\r\n\r\n private _checkNewFrame(): void {\r\n if (this._engine._features.trackUbosInFrame && this._currentFrameId !== this._engine.frameId) {\r\n this._currentFrameId = this._engine.frameId;\r\n this._createBufferOnWrite = false;\r\n if (this._buffers && this._buffers.length > 0) {\r\n this._needSync = this._bufferIndex !== 0;\r\n this._bufferIndex = 0;\r\n this._buffer = this._buffers[this._bufferIndex][0];\r\n } else {\r\n this._bufferIndex = -1;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU.\r\n * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.\r\n * @param data Define the flattened data\r\n * @param size Define the size of the data.\r\n */\r\n public updateUniform(uniformName: string, data: FloatArray, size: number) {\r\n this._checkNewFrame();\r\n\r\n let location = this._uniformLocations[uniformName];\r\n if (location === undefined) {\r\n if (this._buffer) {\r\n // Cannot add an uniform if the buffer is already created\r\n Logger.Error(\"Cannot add an uniform after UBO has been created. uniformName=\" + uniformName);\r\n return;\r\n }\r\n this.addUniform(uniformName, size);\r\n location = this._uniformLocations[uniformName];\r\n }\r\n\r\n if (!this._buffer) {\r\n this.create();\r\n }\r\n\r\n if (!this._dynamic) {\r\n // Cache for static uniform buffers\r\n let changed = false;\r\n\r\n for (let i = 0; i < size; i++) {\r\n // We are checking the matrix cache before calling updateUniform so we do not need to check it here\r\n // Hence the test for size === 16 to simply commit the matrix values\r\n if ((size === 16 && !this._engine._features.uniformBufferHardCheckMatrix) || this._bufferData[location + i] !== Math.fround(data[i])) {\r\n changed = true;\r\n if (this._createBufferOnWrite) {\r\n this._createNewBuffer();\r\n }\r\n this._bufferData[location + i] = data[i];\r\n }\r\n }\r\n\r\n this._needSync = this._needSync || changed;\r\n } else {\r\n // No cache for dynamic\r\n for (let i = 0; i < size; i++) {\r\n this._bufferData[location + i] = data[i];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU.\r\n * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.\r\n * @param data Define the flattened data\r\n * @param size Define the size of the data.\r\n */\r\n public updateUniformArray(uniformName: string, data: FloatArray, size: number) {\r\n this._checkNewFrame();\r\n\r\n const location = this._uniformLocations[uniformName];\r\n if (location === undefined) {\r\n Logger.Error(\"Cannot add an uniform Array dynamically. Please, add it using addUniform and make sure that uniform buffers are supported by the current engine.\");\r\n return;\r\n }\r\n\r\n if (!this._buffer) {\r\n this.create();\r\n }\r\n\r\n const arraySizes = this._uniformArraySizes[uniformName];\r\n\r\n if (!this._dynamic) {\r\n // Cache for static uniform buffers\r\n let changed = false;\r\n let countToFour = 0;\r\n let baseStride = 0;\r\n for (let i = 0; i < size; i++) {\r\n if (this._bufferData[location + baseStride * 4 + countToFour] !== Tools.FloatRound(data[i])) {\r\n changed = true;\r\n if (this._createBufferOnWrite) {\r\n this._createNewBuffer();\r\n }\r\n this._bufferData[location + baseStride * 4 + countToFour] = data[i];\r\n }\r\n countToFour++;\r\n if (countToFour === arraySizes.strideSize) {\r\n for (; countToFour < 4; countToFour++) {\r\n this._bufferData[location + baseStride * 4 + countToFour] = 0;\r\n }\r\n countToFour = 0;\r\n baseStride++;\r\n }\r\n }\r\n\r\n this._needSync = this._needSync || changed;\r\n } else {\r\n // No cache for dynamic\r\n for (let i = 0; i < size; i++) {\r\n this._bufferData[location + i] = data[i];\r\n }\r\n }\r\n }\r\n\r\n // Matrix cache\r\n private _valueCache: { [key: string]: number } = {};\r\n private _cacheMatrix(name: string, matrix: IMatrixLike): boolean {\r\n this._checkNewFrame();\r\n\r\n const cache = this._valueCache[name];\r\n const flag = matrix.updateFlag;\r\n if (cache !== undefined && cache === flag) {\r\n return false;\r\n }\r\n\r\n this._valueCache[name] = flag;\r\n return true;\r\n }\r\n\r\n // Update methods\r\n\r\n private _updateMatrix3x3ForUniform(name: string, matrix: Float32Array): void {\r\n // To match std140, matrix must be realigned\r\n for (let i = 0; i < 3; i++) {\r\n UniformBuffer._TempBuffer[i * 4] = matrix[i * 3];\r\n UniformBuffer._TempBuffer[i * 4 + 1] = matrix[i * 3 + 1];\r\n UniformBuffer._TempBuffer[i * 4 + 2] = matrix[i * 3 + 2];\r\n UniformBuffer._TempBuffer[i * 4 + 3] = 0.0;\r\n }\r\n\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 12);\r\n }\r\n\r\n private _updateMatrix3x3ForEffect(name: string, matrix: Float32Array): void {\r\n this._currentEffect.setMatrix3x3(name, matrix);\r\n }\r\n\r\n private _updateMatrix2x2ForEffect(name: string, matrix: Float32Array): void {\r\n this._currentEffect.setMatrix2x2(name, matrix);\r\n }\r\n\r\n private _updateMatrix2x2ForUniform(name: string, matrix: Float32Array): void {\r\n // To match std140, matrix must be realigned\r\n for (let i = 0; i < 2; i++) {\r\n UniformBuffer._TempBuffer[i * 4] = matrix[i * 2];\r\n UniformBuffer._TempBuffer[i * 4 + 1] = matrix[i * 2 + 1];\r\n UniformBuffer._TempBuffer[i * 4 + 2] = 0.0;\r\n UniformBuffer._TempBuffer[i * 4 + 3] = 0.0;\r\n }\r\n\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 8);\r\n }\r\n\r\n private _updateFloatForEffect(name: string, x: number) {\r\n this._currentEffect.setFloat(name, x);\r\n }\r\n\r\n private _updateFloatForUniform(name: string, x: number) {\r\n UniformBuffer._TempBuffer[0] = x;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 1);\r\n }\r\n\r\n private _updateFloat2ForEffect(name: string, x: number, y: number, suffix = \"\") {\r\n this._currentEffect.setFloat2(name + suffix, x, y);\r\n }\r\n\r\n private _updateFloat2ForUniform(name: string, x: number, y: number) {\r\n UniformBuffer._TempBuffer[0] = x;\r\n UniformBuffer._TempBuffer[1] = y;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 2);\r\n }\r\n\r\n private _updateFloat3ForEffect(name: string, x: number, y: number, z: number, suffix = \"\") {\r\n this._currentEffect.setFloat3(name + suffix, x, y, z);\r\n }\r\n\r\n private _updateFloat3ForUniform(name: string, x: number, y: number, z: number) {\r\n UniformBuffer._TempBuffer[0] = x;\r\n UniformBuffer._TempBuffer[1] = y;\r\n UniformBuffer._TempBuffer[2] = z;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 3);\r\n }\r\n\r\n private _updateFloat4ForEffect(name: string, x: number, y: number, z: number, w: number, suffix = \"\") {\r\n this._currentEffect.setFloat4(name + suffix, x, y, z, w);\r\n }\r\n\r\n private _updateFloat4ForUniform(name: string, x: number, y: number, z: number, w: number) {\r\n UniformBuffer._TempBuffer[0] = x;\r\n UniformBuffer._TempBuffer[1] = y;\r\n UniformBuffer._TempBuffer[2] = z;\r\n UniformBuffer._TempBuffer[3] = w;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 4);\r\n }\r\n\r\n private _updateFloatArrayForEffect(name: string, array: Float32Array) {\r\n this._currentEffect.setFloatArray(name, array);\r\n }\r\n\r\n private _updateFloatArrayForUniform(name: string, array: Float32Array) {\r\n this.updateUniformArray(name, array, array.length);\r\n }\r\n\r\n private _updateArrayForEffect(name: string, array: number[]) {\r\n this._currentEffect.setArray(name, array);\r\n }\r\n\r\n private _updateArrayForUniform(name: string, array: number[]) {\r\n this.updateUniformArray(name, array, array.length);\r\n }\r\n\r\n private _updateIntArrayForEffect(name: string, array: Int32Array) {\r\n this._currentEffect.setIntArray(name, array);\r\n }\r\n\r\n private _updateIntArrayForUniform(name: string, array: Int32Array) {\r\n UniformBuffer._TempBufferInt32View.set(array);\r\n this.updateUniformArray(name, UniformBuffer._TempBuffer, array.length);\r\n }\r\n\r\n private _updateUIntArrayForEffect(name: string, array: Uint32Array) {\r\n this._currentEffect.setUIntArray(name, array);\r\n }\r\n\r\n private _updateUIntArrayForUniform(name: string, array: Uint32Array) {\r\n UniformBuffer._TempBufferUInt32View.set(array);\r\n this.updateUniformArray(name, UniformBuffer._TempBuffer, array.length);\r\n }\r\n\r\n private _updateMatrixForEffect(name: string, mat: IMatrixLike) {\r\n this._currentEffect.setMatrix(name, mat);\r\n }\r\n\r\n private _updateMatrixForUniform(name: string, mat: IMatrixLike) {\r\n if (this._cacheMatrix(name, mat)) {\r\n this.updateUniform(name, mat.asArray(), 16);\r\n }\r\n }\r\n\r\n private _updateMatricesForEffect(name: string, mat: Float32Array) {\r\n this._currentEffect.setMatrices(name, mat);\r\n }\r\n\r\n private _updateMatricesForUniform(name: string, mat: Float32Array) {\r\n this.updateUniform(name, mat, mat.length);\r\n }\r\n\r\n private _updateVector3ForEffect(name: string, vector: IVector3Like) {\r\n this._currentEffect.setVector3(name, vector);\r\n }\r\n\r\n private _updateVector3ForUniform(name: string, vector: IVector3Like) {\r\n UniformBuffer._TempBuffer[0] = vector.x;\r\n UniformBuffer._TempBuffer[1] = vector.y;\r\n UniformBuffer._TempBuffer[2] = vector.z;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 3);\r\n }\r\n\r\n private _updateVector4ForEffect(name: string, vector: IVector4Like) {\r\n this._currentEffect.setVector4(name, vector);\r\n }\r\n\r\n private _updateVector4ForUniform(name: string, vector: IVector4Like) {\r\n UniformBuffer._TempBuffer[0] = vector.x;\r\n UniformBuffer._TempBuffer[1] = vector.y;\r\n UniformBuffer._TempBuffer[2] = vector.z;\r\n UniformBuffer._TempBuffer[3] = vector.w;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 4);\r\n }\r\n\r\n private _updateColor3ForEffect(name: string, color: IColor3Like, suffix = \"\") {\r\n this._currentEffect.setColor3(name + suffix, color);\r\n }\r\n\r\n private _updateColor3ForUniform(name: string, color: IColor3Like) {\r\n UniformBuffer._TempBuffer[0] = color.r;\r\n UniformBuffer._TempBuffer[1] = color.g;\r\n UniformBuffer._TempBuffer[2] = color.b;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 3);\r\n }\r\n\r\n private _updateColor4ForEffect(name: string, color: IColor3Like, alpha: number, suffix = \"\") {\r\n this._currentEffect.setColor4(name + suffix, color, alpha);\r\n }\r\n\r\n private _updateDirectColor4ForEffect(name: string, color: IColor4Like, suffix = \"\") {\r\n this._currentEffect.setDirectColor4(name + suffix, color);\r\n }\r\n\r\n private _updateColor4ForUniform(name: string, color: IColor3Like, alpha: number) {\r\n UniformBuffer._TempBuffer[0] = color.r;\r\n UniformBuffer._TempBuffer[1] = color.g;\r\n UniformBuffer._TempBuffer[2] = color.b;\r\n UniformBuffer._TempBuffer[3] = alpha;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 4);\r\n }\r\n\r\n private _updateDirectColor4ForUniform(name: string, color: IColor4Like) {\r\n UniformBuffer._TempBuffer[0] = color.r;\r\n UniformBuffer._TempBuffer[1] = color.g;\r\n UniformBuffer._TempBuffer[2] = color.b;\r\n UniformBuffer._TempBuffer[3] = color.a;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 4);\r\n }\r\n\r\n private _updateIntForEffect(name: string, x: number, suffix = \"\") {\r\n this._currentEffect.setInt(name + suffix, x);\r\n }\r\n\r\n private _updateIntForUniform(name: string, x: number) {\r\n UniformBuffer._TempBufferInt32View[0] = x;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 1);\r\n }\r\n\r\n private _updateInt2ForEffect(name: string, x: number, y: number, suffix = \"\") {\r\n this._currentEffect.setInt2(name + suffix, x, y);\r\n }\r\n\r\n private _updateInt2ForUniform(name: string, x: number, y: number) {\r\n UniformBuffer._TempBufferInt32View[0] = x;\r\n UniformBuffer._TempBufferInt32View[1] = y;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 2);\r\n }\r\n\r\n private _updateInt3ForEffect(name: string, x: number, y: number, z: number, suffix = \"\") {\r\n this._currentEffect.setInt3(name + suffix, x, y, z);\r\n }\r\n\r\n private _updateInt3ForUniform(name: string, x: number, y: number, z: number) {\r\n UniformBuffer._TempBufferInt32View[0] = x;\r\n UniformBuffer._TempBufferInt32View[1] = y;\r\n UniformBuffer._TempBufferInt32View[2] = z;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 3);\r\n }\r\n\r\n private _updateInt4ForEffect(name: string, x: number, y: number, z: number, w: number, suffix = \"\") {\r\n this._currentEffect.setInt4(name + suffix, x, y, z, w);\r\n }\r\n\r\n private _updateInt4ForUniform(name: string, x: number, y: number, z: number, w: number) {\r\n UniformBuffer._TempBufferInt32View[0] = x;\r\n UniformBuffer._TempBufferInt32View[1] = y;\r\n UniformBuffer._TempBufferInt32View[2] = z;\r\n UniformBuffer._TempBufferInt32View[3] = w;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 4);\r\n }\r\n\r\n private _updateUIntForEffect(name: string, x: number, suffix = \"\") {\r\n this._currentEffect.setUInt(name + suffix, x);\r\n }\r\n\r\n private _updateUIntForUniform(name: string, x: number) {\r\n UniformBuffer._TempBufferUInt32View[0] = x;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 1);\r\n }\r\n\r\n private _updateUInt2ForEffect(name: string, x: number, y: number, suffix = \"\") {\r\n this._currentEffect.setUInt2(name + suffix, x, y);\r\n }\r\n\r\n private _updateUInt2ForUniform(name: string, x: number, y: number) {\r\n UniformBuffer._TempBufferUInt32View[0] = x;\r\n UniformBuffer._TempBufferUInt32View[1] = y;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 2);\r\n }\r\n\r\n private _updateUInt3ForEffect(name: string, x: number, y: number, z: number, suffix = \"\") {\r\n this._currentEffect.setUInt3(name + suffix, x, y, z);\r\n }\r\n\r\n private _updateUInt3ForUniform(name: string, x: number, y: number, z: number) {\r\n UniformBuffer._TempBufferUInt32View[0] = x;\r\n UniformBuffer._TempBufferUInt32View[1] = y;\r\n UniformBuffer._TempBufferUInt32View[2] = z;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 3);\r\n }\r\n\r\n private _updateUInt4ForEffect(name: string, x: number, y: number, z: number, w: number, suffix = \"\") {\r\n this._currentEffect.setUInt4(name + suffix, x, y, z, w);\r\n }\r\n\r\n private _updateUInt4ForUniform(name: string, x: number, y: number, z: number, w: number) {\r\n UniformBuffer._TempBufferUInt32View[0] = x;\r\n UniformBuffer._TempBufferUInt32View[1] = y;\r\n UniformBuffer._TempBufferUInt32View[2] = z;\r\n UniformBuffer._TempBufferUInt32View[3] = w;\r\n this.updateUniform(name, UniformBuffer._TempBuffer, 4);\r\n }\r\n\r\n /**\r\n * Sets a sampler uniform on the effect.\r\n * @param name Define the name of the sampler.\r\n * @param texture Define the texture to set in the sampler\r\n */\r\n public setTexture(name: string, texture: Nullable) {\r\n this._currentEffect.setTexture(name, texture);\r\n }\r\n\r\n /**\r\n * Sets a sampler uniform on the effect.\r\n * @param name Define the name of the sampler.\r\n * @param texture Define the (internal) texture to set in the sampler\r\n */\r\n public bindTexture(name: string, texture: Nullable) {\r\n this._currentEffect._bindTexture(name, texture);\r\n }\r\n\r\n /**\r\n * Directly updates the value of the uniform in the cache AND on the GPU.\r\n * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.\r\n * @param data Define the flattened data\r\n */\r\n public updateUniformDirectly(uniformName: string, data: FloatArray) {\r\n this.updateUniform(uniformName, data, data.length);\r\n\r\n this.update();\r\n }\r\n\r\n /**\r\n * Associates an effect to this uniform buffer\r\n * @param effect Define the effect to associate the buffer to\r\n * @param name Name of the uniform block in the shader.\r\n */\r\n public bindToEffect(effect: Effect, name: string): void {\r\n this._currentEffect = effect;\r\n this._currentEffectName = name;\r\n }\r\n\r\n /**\r\n * Binds the current (GPU) buffer to the effect\r\n */\r\n public bindUniformBuffer(): void {\r\n if (!this._noUBO && this._buffer && this._currentEffect) {\r\n this._currentEffect.bindUniformBuffer(this._buffer, this._currentEffectName);\r\n }\r\n }\r\n\r\n /**\r\n * Dissociates the current effect from this uniform buffer\r\n */\r\n public unbindEffect(): void {\r\n this._currentEffect = undefined as any;\r\n this._currentEffectName = undefined as any;\r\n }\r\n\r\n /**\r\n * Sets the current state of the class (_bufferIndex, _buffer) to point to the data buffer passed in parameter if this buffer is one of the buffers handled by the class (meaning if it can be found in the _buffers array)\r\n * This method is meant to be able to update a buffer at any time: just call setDataBuffer to set the class in the right state, call some updateXXX methods and then call udpate() => that will update the GPU buffer on the graphic card\r\n * @param dataBuffer buffer to look for\r\n * @returns true if the buffer has been found and the class internal state points to it, else false\r\n */\r\n public setDataBuffer(dataBuffer: DataBuffer): boolean {\r\n if (!this._buffers) {\r\n return this._buffer === dataBuffer;\r\n }\r\n\r\n for (let b = 0; b < this._buffers.length; ++b) {\r\n const buffer = this._buffers[b];\r\n if (buffer[0] === dataBuffer) {\r\n this._bufferIndex = b;\r\n this._buffer = dataBuffer;\r\n this._createBufferOnWrite = false;\r\n this._currentEffect = undefined as any;\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the uniform buffer.\r\n */\r\n public dispose(): void {\r\n if (this._noUBO) {\r\n return;\r\n }\r\n\r\n const uniformBuffers = this._engine._uniformBuffers;\r\n const index = uniformBuffers.indexOf(this);\r\n\r\n if (index !== -1) {\r\n uniformBuffers[index] = uniformBuffers[uniformBuffers.length - 1];\r\n uniformBuffers.pop();\r\n }\r\n\r\n if (this._engine._features.trackUbosInFrame && this._buffers) {\r\n for (let i = 0; i < this._buffers.length; ++i) {\r\n const buffer = this._buffers[i][0];\r\n this._engine._releaseBuffer(buffer!);\r\n }\r\n } else if (this._buffer && this._engine._releaseBuffer(this._buffer)) {\r\n this._buffer = null;\r\n }\r\n }\r\n}\r\n", "import type { Nullable, DataArray, FloatArray } from \"../types\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { DataBuffer } from \"./dataBuffer\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\n/**\r\n * Class used to store data that will be store in GPU memory\r\n */\r\nexport class Buffer {\r\n private _engine: ThinEngine;\r\n private _buffer: Nullable;\r\n /** @internal */\r\n public _data: Nullable;\r\n private _updatable: boolean;\r\n private _instanced: boolean;\r\n private _divisor: number;\r\n private _isAlreadyOwned = false;\r\n private _isDisposed = false;\r\n private _label?: string;\r\n\r\n /**\r\n * Gets a boolean indicating if the Buffer is disposed\r\n */\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * Gets the byte stride.\r\n */\r\n public readonly byteStride: number;\r\n\r\n /**\r\n * Constructor\r\n * @param engine the engine\r\n * @param data the data to use for this buffer\r\n * @param updatable whether the data is updatable\r\n * @param stride the stride (optional)\r\n * @param postponeInternalCreation whether to postpone creating the internal WebGL buffer (optional)\r\n * @param instanced whether the buffer is instanced (optional)\r\n * @param useBytes set to true if the stride in in bytes (optional)\r\n * @param divisor sets an optional divisor for instances (1 by default)\r\n * @param label defines the label of the buffer (for debug purpose)\r\n */\r\n constructor(\r\n engine: ThinEngine,\r\n data: DataArray | DataBuffer,\r\n updatable: boolean,\r\n stride = 0,\r\n postponeInternalCreation = false,\r\n instanced = false,\r\n useBytes = false,\r\n divisor?: number,\r\n label?: string\r\n ) {\r\n if (engine && (engine as unknown as Mesh).getScene) {\r\n // old versions of VertexBuffer accepted 'mesh' instead of 'engine'\r\n this._engine = (engine as unknown as Mesh).getScene().getEngine();\r\n } else {\r\n this._engine = engine;\r\n }\r\n\r\n this._updatable = updatable;\r\n this._instanced = instanced;\r\n this._divisor = divisor || 1;\r\n this._label = label;\r\n\r\n if (data instanceof DataBuffer) {\r\n this._data = null;\r\n this._buffer = data;\r\n } else {\r\n this._data = data;\r\n this._buffer = null;\r\n }\r\n\r\n this.byteStride = useBytes ? stride : stride * Float32Array.BYTES_PER_ELEMENT;\r\n\r\n if (!postponeInternalCreation) {\r\n // by default\r\n this.create();\r\n }\r\n }\r\n\r\n /**\r\n * Create a new VertexBuffer based on the current buffer\r\n * @param kind defines the vertex buffer kind (position, normal, etc.)\r\n * @param offset defines offset in the buffer (0 by default)\r\n * @param size defines the size in floats of attributes (position is 3 for instance)\r\n * @param stride defines the stride size in floats in the buffer (the offset to apply to reach next value when data is interleaved)\r\n * @param instanced defines if the vertex buffer contains indexed data\r\n * @param useBytes defines if the offset and stride are in bytes *\r\n * @param divisor sets an optional divisor for instances (1 by default)\r\n * @returns the new vertex buffer\r\n */\r\n public createVertexBuffer(kind: string, offset: number, size: number, stride?: number, instanced?: boolean, useBytes = false, divisor?: number): VertexBuffer {\r\n const byteOffset = useBytes ? offset : offset * Float32Array.BYTES_PER_ELEMENT;\r\n const byteStride = stride ? (useBytes ? stride : stride * Float32Array.BYTES_PER_ELEMENT) : this.byteStride;\r\n\r\n // a lot of these parameters are ignored as they are overridden by the buffer\r\n return new VertexBuffer(\r\n this._engine,\r\n this,\r\n kind,\r\n this._updatable,\r\n true,\r\n byteStride,\r\n instanced === undefined ? this._instanced : instanced,\r\n byteOffset,\r\n size,\r\n undefined,\r\n undefined,\r\n true,\r\n this._divisor || divisor\r\n );\r\n }\r\n\r\n // Properties\r\n\r\n /**\r\n * Gets a boolean indicating if the Buffer is updatable?\r\n * @returns true if the buffer is updatable\r\n */\r\n public isUpdatable(): boolean {\r\n return this._updatable;\r\n }\r\n\r\n /**\r\n * Gets current buffer's data\r\n * @returns a DataArray or null\r\n */\r\n public getData(): Nullable {\r\n return this._data;\r\n }\r\n\r\n /**\r\n * Gets underlying native buffer\r\n * @returns underlying native buffer\r\n */\r\n public getBuffer(): Nullable {\r\n return this._buffer;\r\n }\r\n\r\n /**\r\n * Gets the stride in float32 units (i.e. byte stride / 4).\r\n * May not be an integer if the byte stride is not divisible by 4.\r\n * @returns the stride in float32 units\r\n * @deprecated Please use byteStride instead.\r\n */\r\n public getStrideSize(): number {\r\n return this.byteStride / Float32Array.BYTES_PER_ELEMENT;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Store data into the buffer. Creates the buffer if not used already.\r\n * If the buffer was already used, it will be updated only if it is updatable, otherwise it will do nothing.\r\n * @param data defines the data to store\r\n */\r\n public create(data: Nullable = null): void {\r\n if (!data && this._buffer) {\r\n return; // nothing to do\r\n }\r\n\r\n data = data || this._data;\r\n\r\n if (!data) {\r\n return;\r\n }\r\n\r\n if (!this._buffer) {\r\n // create buffer\r\n if (this._updatable) {\r\n this._buffer = this._engine.createDynamicVertexBuffer(data, this._label);\r\n this._data = data;\r\n } else {\r\n this._buffer = this._engine.createVertexBuffer(data, undefined, this._label);\r\n }\r\n } else if (this._updatable) {\r\n // update buffer\r\n this._engine.updateDynamicVertexBuffer(this._buffer, data);\r\n this._data = data;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (!this._data) {\r\n if (!this._buffer) {\r\n // Buffer was not yet created, nothing to do\r\n return;\r\n }\r\n if (this._buffer.capacity > 0) {\r\n // We can at least recreate the buffer with the right size, even if we don't have the data\r\n if (this._updatable) {\r\n this._buffer = this._engine.createDynamicVertexBuffer(this._buffer.capacity, this._label);\r\n } else {\r\n this._buffer = this._engine.createVertexBuffer(this._buffer.capacity, undefined, this._label);\r\n }\r\n return;\r\n }\r\n Logger.Warn(`Missing data for buffer \"${this._label}\" ${this._buffer ? \"(uniqueId: \" + this._buffer.uniqueId + \")\" : \"\"}. Buffer reconstruction failed.`);\r\n this._buffer = null;\r\n } else {\r\n this._buffer = null;\r\n this.create(this._data);\r\n }\r\n }\r\n\r\n /**\r\n * Update current buffer data\r\n * @param data defines the data to store\r\n */\r\n public update(data: DataArray): void {\r\n this.create(data);\r\n }\r\n\r\n /**\r\n * Updates the data directly.\r\n * @param data the new data\r\n * @param offset the new offset\r\n * @param vertexCount the vertex count (optional)\r\n * @param useBytes set to true if the offset is in bytes\r\n */\r\n public updateDirectly(data: DataArray, offset: number, vertexCount?: number, useBytes: boolean = false): void {\r\n if (!this._buffer) {\r\n return;\r\n }\r\n\r\n if (this._updatable) {\r\n // update buffer\r\n this._engine.updateDynamicVertexBuffer(\r\n this._buffer,\r\n data,\r\n useBytes ? offset : offset * Float32Array.BYTES_PER_ELEMENT,\r\n vertexCount ? vertexCount * this.byteStride : undefined\r\n );\r\n if (offset === 0 && vertexCount === undefined) {\r\n // Keep the data if we easily can\r\n this._data = data;\r\n } else {\r\n this._data = null;\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _increaseReferences() {\r\n if (!this._buffer) {\r\n return;\r\n }\r\n\r\n if (!this._isAlreadyOwned) {\r\n this._isAlreadyOwned = true;\r\n return;\r\n }\r\n\r\n this._buffer.references++;\r\n }\r\n\r\n /**\r\n * Release all resources\r\n */\r\n public dispose(): void {\r\n if (!this._buffer) {\r\n return;\r\n }\r\n\r\n // The data buffer has an internal counter as this buffer can be used by several VertexBuffer objects\r\n // This means that we only flag it as disposed when all references are released (when _releaseBuffer will return true)\r\n if (this._engine._releaseBuffer(this._buffer)) {\r\n this._isDisposed = true;\r\n this._data = null;\r\n this._buffer = null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Options to be used when creating a vertex buffer\r\n */\r\nexport interface IVertexBufferOptions {\r\n /**\r\n * whether the data is updatable (default: false)\r\n */\r\n updatable?: boolean;\r\n /**\r\n * whether to postpone creating the internal WebGL buffer (default: false)\r\n */\r\n postponeInternalCreation?: boolean;\r\n /**\r\n * the stride (will be automatically computed from the kind parameter if not specified)\r\n */\r\n stride?: number;\r\n /**\r\n * whether the buffer is instanced (default: false)\r\n */\r\n instanced?: boolean;\r\n /**\r\n * the offset of the data (default: 0)\r\n */\r\n offset?: number;\r\n /**\r\n * the number of components (will be automatically computed from the kind parameter if not specified)\r\n */\r\n size?: number;\r\n /**\r\n * the type of the component (will be deduce from the data parameter if not specified)\r\n */\r\n type?: number;\r\n /**\r\n * whether the data contains normalized data (default: false)\r\n */\r\n normalized?: boolean;\r\n /**\r\n * set to true if stride and offset are in bytes (default: false)\r\n */\r\n useBytes?: boolean;\r\n /**\r\n * defines the instance divisor to use (default: 1, only used if instanced is true)\r\n */\r\n divisor?: number;\r\n /**\r\n * defines if the buffer should be released when the vertex buffer is disposed (default: false)\r\n */\r\n takeBufferOwnership?: boolean;\r\n /**\r\n * label to use for this vertex buffer (debugging purpose)\r\n */\r\n label?: string;\r\n}\r\n\r\n/**\r\n * Specialized buffer used to store vertex data\r\n */\r\nexport class VertexBuffer {\r\n private static _Counter = 0;\r\n\r\n /** @internal */\r\n public _buffer: Buffer;\r\n /** @internal */\r\n public _validOffsetRange: boolean; // used internally by the engine\r\n private _kind: string;\r\n private _size: number;\r\n /** @internal */\r\n public _ownsBuffer: boolean;\r\n private _instanced: boolean;\r\n private _instanceDivisor: number;\r\n /** @internal */\r\n public _isDisposed = false;\r\n /** @internal */\r\n public _label?: string;\r\n\r\n /**\r\n * The byte type.\r\n */\r\n public static readonly BYTE = Constants.BYTE;\r\n\r\n /**\r\n * The unsigned byte type.\r\n */\r\n public static readonly UNSIGNED_BYTE = Constants.UNSIGNED_BYTE;\r\n\r\n /**\r\n * The short type.\r\n */\r\n public static readonly SHORT = Constants.SHORT;\r\n\r\n /**\r\n * The unsigned short type.\r\n */\r\n public static readonly UNSIGNED_SHORT = Constants.UNSIGNED_SHORT;\r\n\r\n /**\r\n * The integer type.\r\n */\r\n public static readonly INT = Constants.INT;\r\n\r\n /**\r\n * The unsigned integer type.\r\n */\r\n public static readonly UNSIGNED_INT = Constants.UNSIGNED_INT;\r\n\r\n /**\r\n * The float type.\r\n */\r\n public static readonly FLOAT = Constants.FLOAT;\r\n\r\n /**\r\n * Gets a boolean indicating if the Buffer is disposed\r\n */\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * Gets or sets the instance divisor when in instanced mode\r\n */\r\n public get instanceDivisor(): number {\r\n return this._instanceDivisor;\r\n }\r\n\r\n public set instanceDivisor(value: number) {\r\n const isInstanced = value != 0;\r\n this._instanceDivisor = value;\r\n\r\n if (isInstanced !== this._instanced) {\r\n this._instanced = isInstanced;\r\n this._computeHashCode();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the byte stride.\r\n */\r\n public readonly byteStride: number;\r\n\r\n /**\r\n * Gets the byte offset.\r\n */\r\n public readonly byteOffset: number;\r\n\r\n /**\r\n * Gets whether integer data values should be normalized into a certain range when being casted to a float.\r\n */\r\n public readonly normalized: boolean;\r\n\r\n /**\r\n * Gets the data type of each component in the array.\r\n */\r\n public readonly type: number;\r\n\r\n /**\r\n * Gets the unique id of this vertex buffer\r\n */\r\n public readonly uniqueId: number;\r\n\r\n /**\r\n * Gets a hash code representing the format (type, normalized, size, instanced, stride) of this buffer\r\n * All buffers with the same format will have the same hash code\r\n */\r\n public readonly hashCode: number;\r\n\r\n /**\r\n * Gets the engine associated with the buffer\r\n */\r\n public readonly engine: ThinEngine;\r\n\r\n /**\r\n * Gets the max possible amount of vertices stored within the current vertex buffer.\r\n * We do not have the end offset or count so this will be too big for concatenated vertex buffers.\r\n * @internal\r\n */\r\n public get _maxVerticesCount() {\r\n const data = this.getData();\r\n if (!data) {\r\n return 0;\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n // data is a regular number[] with float values\r\n return data.length / (this.byteStride / 4) - this.byteOffset / 4;\r\n }\r\n\r\n return (data.byteLength - this.byteOffset) / this.byteStride;\r\n }\r\n\r\n /**\r\n * Constructor\r\n * @param engine the engine\r\n * @param data the data to use for this vertex buffer\r\n * @param kind the vertex buffer kind\r\n * @param updatable whether the data is updatable\r\n * @param postponeInternalCreation whether to postpone creating the internal WebGL buffer (optional)\r\n * @param stride the stride (optional)\r\n * @param instanced whether the buffer is instanced (optional)\r\n * @param offset the offset of the data (optional)\r\n * @param size the number of components (optional)\r\n * @param type the type of the component (optional)\r\n * @param normalized whether the data contains normalized data (optional)\r\n * @param useBytes set to true if stride and offset are in bytes (optional)\r\n * @param divisor defines the instance divisor to use (1 by default)\r\n * @param takeBufferOwnership defines if the buffer should be released when the vertex buffer is disposed\r\n */\r\n constructor(\r\n engine: ThinEngine,\r\n data: DataArray | Buffer | DataBuffer,\r\n kind: string,\r\n updatable: boolean,\r\n postponeInternalCreation?: boolean,\r\n stride?: number,\r\n instanced?: boolean,\r\n offset?: number,\r\n size?: number,\r\n type?: number,\r\n normalized?: boolean,\r\n useBytes?: boolean,\r\n divisor?: number,\r\n takeBufferOwnership?: boolean\r\n );\r\n\r\n /**\r\n * Constructor\r\n * @param engine the engine\r\n * @param data the data to use for this vertex buffer\r\n * @param kind the vertex buffer kind\r\n * @param options defines the rest of the options used to create the buffer\r\n */\r\n constructor(engine: ThinEngine, data: DataArray | Buffer | DataBuffer, kind: string, options?: IVertexBufferOptions);\r\n\r\n /** @internal */\r\n constructor(\r\n engine: ThinEngine,\r\n data: DataArray | Buffer | DataBuffer,\r\n kind: string,\r\n updatableOrOptions?: boolean | IVertexBufferOptions,\r\n postponeInternalCreation?: boolean,\r\n stride?: number,\r\n instanced?: boolean,\r\n offset?: number,\r\n size?: number,\r\n type?: number,\r\n normalized = false,\r\n useBytes = false,\r\n divisor = 1,\r\n takeBufferOwnership = false\r\n ) {\r\n let updatable = false;\r\n\r\n this.engine = engine;\r\n\r\n if (typeof updatableOrOptions === \"object\" && updatableOrOptions !== null) {\r\n updatable = updatableOrOptions.updatable ?? false;\r\n postponeInternalCreation = updatableOrOptions.postponeInternalCreation;\r\n stride = updatableOrOptions.stride;\r\n instanced = updatableOrOptions.instanced;\r\n offset = updatableOrOptions.offset;\r\n size = updatableOrOptions.size;\r\n type = updatableOrOptions.type;\r\n normalized = updatableOrOptions.normalized ?? false;\r\n useBytes = updatableOrOptions.useBytes ?? false;\r\n divisor = updatableOrOptions.divisor ?? 1;\r\n takeBufferOwnership = updatableOrOptions.takeBufferOwnership ?? false;\r\n this._label = updatableOrOptions.label;\r\n } else {\r\n updatable = !!updatableOrOptions;\r\n }\r\n\r\n if (data instanceof Buffer) {\r\n this._buffer = data;\r\n this._ownsBuffer = takeBufferOwnership;\r\n } else {\r\n this._buffer = new Buffer(engine, data, updatable, stride, postponeInternalCreation, instanced, useBytes, divisor, this._label);\r\n this._ownsBuffer = true;\r\n }\r\n\r\n this.uniqueId = VertexBuffer._Counter++;\r\n this._kind = kind;\r\n\r\n if (type === undefined) {\r\n const vertexData = this.getData();\r\n this.type = vertexData ? VertexBuffer.GetDataType(vertexData) : VertexBuffer.FLOAT;\r\n } else {\r\n this.type = type;\r\n }\r\n\r\n const typeByteLength = VertexBuffer.GetTypeByteLength(this.type);\r\n\r\n if (useBytes) {\r\n this._size = size || (stride ? stride / typeByteLength : VertexBuffer.DeduceStride(kind));\r\n this.byteStride = stride || this._buffer.byteStride || this._size * typeByteLength;\r\n this.byteOffset = offset || 0;\r\n } else {\r\n this._size = size || stride || VertexBuffer.DeduceStride(kind);\r\n this.byteStride = stride ? stride * typeByteLength : this._buffer.byteStride || this._size * typeByteLength;\r\n this.byteOffset = (offset || 0) * typeByteLength;\r\n }\r\n\r\n this.normalized = normalized;\r\n\r\n this._instanced = instanced !== undefined ? instanced : false;\r\n this._instanceDivisor = instanced ? divisor : 0;\r\n\r\n this._alignBuffer();\r\n this._computeHashCode();\r\n }\r\n\r\n private _computeHashCode(): void {\r\n // note: cast to any because the property is declared readonly\r\n (this.hashCode as any) =\r\n ((this.type - 5120) << 0) +\r\n ((this.normalized ? 1 : 0) << 3) +\r\n (this._size << 4) +\r\n ((this._instanced ? 1 : 0) << 6) +\r\n /* keep 5 bits free */\r\n (this.byteStride << 12);\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n this._buffer?._rebuild();\r\n }\r\n\r\n /**\r\n * Returns the kind of the VertexBuffer (string)\r\n * @returns a string\r\n */\r\n public getKind(): string {\r\n return this._kind;\r\n }\r\n\r\n // Properties\r\n\r\n /**\r\n * Gets a boolean indicating if the VertexBuffer is updatable?\r\n * @returns true if the buffer is updatable\r\n */\r\n public isUpdatable(): boolean {\r\n return this._buffer.isUpdatable();\r\n }\r\n\r\n /**\r\n * Gets current buffer's data\r\n * @returns a DataArray or null\r\n */\r\n public getData(): Nullable {\r\n return this._buffer.getData();\r\n }\r\n\r\n /**\r\n * Gets current buffer's data as a float array. Float data is constructed if the vertex buffer data cannot be returned directly.\r\n * @param totalVertices number of vertices in the buffer to take into account\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns a float array containing vertex data\r\n */\r\n public getFloatData(totalVertices: number, forceCopy?: boolean): Nullable {\r\n const data = this.getData();\r\n if (!data) {\r\n return null;\r\n }\r\n\r\n return VertexBuffer.GetFloatData(data, this._size, this.type, this.byteOffset, this.byteStride, this.normalized, totalVertices, forceCopy);\r\n }\r\n\r\n /**\r\n * Gets underlying native buffer\r\n * @returns underlying native buffer\r\n */\r\n public getBuffer(): Nullable {\r\n return this._buffer.getBuffer();\r\n }\r\n\r\n /**\r\n * Gets the Buffer instance that wraps the native GPU buffer\r\n * @returns the wrapper buffer\r\n */\r\n public getWrapperBuffer(): Buffer {\r\n return this._buffer;\r\n }\r\n\r\n /**\r\n * Gets the stride in float32 units (i.e. byte stride / 4).\r\n * May not be an integer if the byte stride is not divisible by 4.\r\n * @returns the stride in float32 units\r\n * @deprecated Please use byteStride instead.\r\n */\r\n public getStrideSize(): number {\r\n return this.byteStride / VertexBuffer.GetTypeByteLength(this.type);\r\n }\r\n\r\n /**\r\n * Returns the offset as a multiple of the type byte length.\r\n * @returns the offset in bytes\r\n * @deprecated Please use byteOffset instead.\r\n */\r\n public getOffset(): number {\r\n return this.byteOffset / VertexBuffer.GetTypeByteLength(this.type);\r\n }\r\n\r\n /**\r\n * Returns the number of components or the byte size per vertex attribute\r\n * @param sizeInBytes If true, returns the size in bytes or else the size in number of components of the vertex attribute (default: false)\r\n * @returns the number of components\r\n */\r\n public getSize(sizeInBytes = false): number {\r\n return sizeInBytes ? this._size * VertexBuffer.GetTypeByteLength(this.type) : this._size;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating is the internal buffer of the VertexBuffer is instanced\r\n * @returns true if this buffer is instanced\r\n */\r\n public getIsInstanced(): boolean {\r\n return this._instanced;\r\n }\r\n\r\n /**\r\n * Returns the instancing divisor, zero for non-instanced (integer).\r\n * @returns a number\r\n */\r\n public getInstanceDivisor(): number {\r\n return this._instanceDivisor;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Store data into the buffer. If the buffer was already used it will be either recreated or updated depending on isUpdatable property\r\n * @param data defines the data to store\r\n */\r\n public create(data?: DataArray): void {\r\n this._buffer.create(data);\r\n this._alignBuffer();\r\n }\r\n\r\n /**\r\n * Updates the underlying buffer according to the passed numeric array or Float32Array.\r\n * This function will create a new buffer if the current one is not updatable\r\n * @param data defines the data to store\r\n */\r\n public update(data: DataArray): void {\r\n this._buffer.update(data);\r\n this._alignBuffer();\r\n }\r\n\r\n /**\r\n * Updates directly the underlying WebGLBuffer according to the passed numeric array or Float32Array.\r\n * Returns the directly updated WebGLBuffer.\r\n * @param data the new data\r\n * @param offset the new offset\r\n * @param useBytes set to true if the offset is in bytes\r\n */\r\n public updateDirectly(data: DataArray, offset: number, useBytes: boolean = false): void {\r\n this._buffer.updateDirectly(data, offset, undefined, useBytes);\r\n this._alignBuffer();\r\n }\r\n\r\n /**\r\n * Disposes the VertexBuffer and the underlying WebGLBuffer.\r\n */\r\n public dispose(): void {\r\n if (this._ownsBuffer) {\r\n this._buffer.dispose();\r\n }\r\n\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * Enumerates each value of this vertex buffer as numbers.\r\n * @param count the number of values to enumerate\r\n * @param callback the callback function called for each value\r\n */\r\n public forEach(count: number, callback: (value: number, index: number) => void): void {\r\n VertexBuffer.ForEach(this._buffer.getData()!, this.byteOffset, this.byteStride, this._size, this.type, count, this.normalized, callback);\r\n }\r\n\r\n /** @internal */\r\n public _alignBuffer() {}\r\n\r\n // Enums\r\n /**\r\n * Positions\r\n */\r\n public static readonly PositionKind = Constants.PositionKind;\r\n /**\r\n * Normals\r\n */\r\n public static readonly NormalKind = Constants.NormalKind;\r\n /**\r\n * Tangents\r\n */\r\n public static readonly TangentKind = Constants.TangentKind;\r\n /**\r\n * Texture coordinates\r\n */\r\n public static readonly UVKind = Constants.UVKind;\r\n /**\r\n * Texture coordinates 2\r\n */\r\n public static readonly UV2Kind = Constants.UV2Kind;\r\n /**\r\n * Texture coordinates 3\r\n */\r\n public static readonly UV3Kind = Constants.UV3Kind;\r\n /**\r\n * Texture coordinates 4\r\n */\r\n public static readonly UV4Kind = Constants.UV4Kind;\r\n /**\r\n * Texture coordinates 5\r\n */\r\n public static readonly UV5Kind = Constants.UV5Kind;\r\n /**\r\n * Texture coordinates 6\r\n */\r\n public static readonly UV6Kind = Constants.UV6Kind;\r\n /**\r\n * Colors\r\n */\r\n public static readonly ColorKind = Constants.ColorKind;\r\n /**\r\n * Instance Colors\r\n */\r\n public static readonly ColorInstanceKind = Constants.ColorInstanceKind;\r\n /**\r\n * Matrix indices (for bones)\r\n */\r\n public static readonly MatricesIndicesKind = Constants.MatricesIndicesKind;\r\n /**\r\n * Matrix weights (for bones)\r\n */\r\n public static readonly MatricesWeightsKind = Constants.MatricesWeightsKind;\r\n /**\r\n * Additional matrix indices (for bones)\r\n */\r\n public static readonly MatricesIndicesExtraKind = Constants.MatricesIndicesExtraKind;\r\n /**\r\n * Additional matrix weights (for bones)\r\n */\r\n public static readonly MatricesWeightsExtraKind = Constants.MatricesWeightsExtraKind;\r\n\r\n /**\r\n * Deduces the stride given a kind.\r\n * @param kind The kind string to deduce\r\n * @returns The deduced stride\r\n */\r\n public static DeduceStride(kind: string): number {\r\n switch (kind) {\r\n case VertexBuffer.UVKind:\r\n case VertexBuffer.UV2Kind:\r\n case VertexBuffer.UV3Kind:\r\n case VertexBuffer.UV4Kind:\r\n case VertexBuffer.UV5Kind:\r\n case VertexBuffer.UV6Kind:\r\n return 2;\r\n case VertexBuffer.NormalKind:\r\n case VertexBuffer.PositionKind:\r\n return 3;\r\n case VertexBuffer.ColorKind:\r\n case VertexBuffer.ColorInstanceKind:\r\n case VertexBuffer.MatricesIndicesKind:\r\n case VertexBuffer.MatricesIndicesExtraKind:\r\n case VertexBuffer.MatricesWeightsKind:\r\n case VertexBuffer.MatricesWeightsExtraKind:\r\n case VertexBuffer.TangentKind:\r\n return 4;\r\n default:\r\n throw new Error(\"Invalid kind '\" + kind + \"'\");\r\n }\r\n }\r\n\r\n /**\r\n * Gets the vertex buffer type of the given data array.\r\n * @param data the data array\r\n * @returns the vertex buffer type\r\n */\r\n public static GetDataType(data: DataArray): number {\r\n if (data instanceof Int8Array) {\r\n return VertexBuffer.BYTE;\r\n } else if (data instanceof Uint8Array) {\r\n return VertexBuffer.UNSIGNED_BYTE;\r\n } else if (data instanceof Int16Array) {\r\n return VertexBuffer.SHORT;\r\n } else if (data instanceof Uint16Array) {\r\n return VertexBuffer.UNSIGNED_SHORT;\r\n } else if (data instanceof Int32Array) {\r\n return VertexBuffer.INT;\r\n } else if (data instanceof Uint32Array) {\r\n return VertexBuffer.UNSIGNED_INT;\r\n } else {\r\n return VertexBuffer.FLOAT;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the byte length of the given type.\r\n * @param type the type\r\n * @returns the number of bytes\r\n */\r\n public static GetTypeByteLength(type: number): number {\r\n switch (type) {\r\n case VertexBuffer.BYTE:\r\n case VertexBuffer.UNSIGNED_BYTE:\r\n return 1;\r\n case VertexBuffer.SHORT:\r\n case VertexBuffer.UNSIGNED_SHORT:\r\n return 2;\r\n case VertexBuffer.INT:\r\n case VertexBuffer.UNSIGNED_INT:\r\n case VertexBuffer.FLOAT:\r\n return 4;\r\n default:\r\n throw new Error(`Invalid type '${type}'`);\r\n }\r\n }\r\n\r\n /**\r\n * Enumerates each value of the given parameters as numbers.\r\n * @param data the data to enumerate\r\n * @param byteOffset the byte offset of the data\r\n * @param byteStride the byte stride of the data\r\n * @param componentCount the number of components per element\r\n * @param componentType the type of the component\r\n * @param count the number of values to enumerate\r\n * @param normalized whether the data is normalized\r\n * @param callback the callback function called for each value\r\n */\r\n public static ForEach(\r\n data: DataArray,\r\n byteOffset: number,\r\n byteStride: number,\r\n componentCount: number,\r\n componentType: number,\r\n count: number,\r\n normalized: boolean,\r\n callback: (value: number, index: number) => void\r\n ): void {\r\n if (data instanceof Array) {\r\n let offset = byteOffset / 4;\r\n const stride = byteStride / 4;\r\n for (let index = 0; index < count; index += componentCount) {\r\n for (let componentIndex = 0; componentIndex < componentCount; componentIndex++) {\r\n callback(data[offset + componentIndex], index + componentIndex);\r\n }\r\n offset += stride;\r\n }\r\n } else {\r\n const dataView = data instanceof ArrayBuffer ? new DataView(data) : new DataView(data.buffer, data.byteOffset, data.byteLength);\r\n const componentByteLength = VertexBuffer.GetTypeByteLength(componentType);\r\n for (let index = 0; index < count; index += componentCount) {\r\n let componentByteOffset = byteOffset;\r\n for (let componentIndex = 0; componentIndex < componentCount; componentIndex++) {\r\n const value = VertexBuffer._GetFloatValue(dataView, componentType, componentByteOffset, normalized);\r\n callback(value, index + componentIndex);\r\n componentByteOffset += componentByteLength;\r\n }\r\n byteOffset += byteStride;\r\n }\r\n }\r\n }\r\n\r\n private static _GetFloatValue(dataView: DataView, type: number, byteOffset: number, normalized: boolean): number {\r\n switch (type) {\r\n case VertexBuffer.BYTE: {\r\n let value = dataView.getInt8(byteOffset);\r\n if (normalized) {\r\n value = Math.max(value / 127, -1);\r\n }\r\n return value;\r\n }\r\n case VertexBuffer.UNSIGNED_BYTE: {\r\n let value = dataView.getUint8(byteOffset);\r\n if (normalized) {\r\n value = value / 255;\r\n }\r\n return value;\r\n }\r\n case VertexBuffer.SHORT: {\r\n let value = dataView.getInt16(byteOffset, true);\r\n if (normalized) {\r\n value = Math.max(value / 32767, -1);\r\n }\r\n return value;\r\n }\r\n case VertexBuffer.UNSIGNED_SHORT: {\r\n let value = dataView.getUint16(byteOffset, true);\r\n if (normalized) {\r\n value = value / 65535;\r\n }\r\n return value;\r\n }\r\n case VertexBuffer.INT: {\r\n return dataView.getInt32(byteOffset, true);\r\n }\r\n case VertexBuffer.UNSIGNED_INT: {\r\n return dataView.getUint32(byteOffset, true);\r\n }\r\n case VertexBuffer.FLOAT: {\r\n return dataView.getFloat32(byteOffset, true);\r\n }\r\n default: {\r\n throw new Error(`Invalid component type ${type}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the given data array as a float array. Float data is constructed if the data array cannot be returned directly.\r\n * @param data the input data array\r\n * @param size the number of components\r\n * @param type the component type\r\n * @param byteOffset the byte offset of the data\r\n * @param byteStride the byte stride of the data\r\n * @param normalized whether the data is normalized\r\n * @param totalVertices number of vertices in the buffer to take into account\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns a float array containing vertex data\r\n */\r\n public static GetFloatData(\r\n data: DataArray,\r\n size: number,\r\n type: number,\r\n byteOffset: number,\r\n byteStride: number,\r\n normalized: boolean,\r\n totalVertices: number,\r\n forceCopy?: boolean\r\n ): FloatArray {\r\n const tightlyPackedByteStride = size * VertexBuffer.GetTypeByteLength(type);\r\n const count = totalVertices * size;\r\n\r\n if (type !== VertexBuffer.FLOAT || byteStride !== tightlyPackedByteStride) {\r\n const copy = new Float32Array(count);\r\n VertexBuffer.ForEach(data, byteOffset, byteStride, size, type, count, normalized, (value, index) => (copy[index] = value));\r\n return copy;\r\n }\r\n\r\n if (!(data instanceof Array || data instanceof Float32Array) || byteOffset !== 0 || data.length !== count) {\r\n if (data instanceof Array) {\r\n const offset = byteOffset / 4;\r\n return data.slice(offset, offset + count);\r\n } else if (data instanceof ArrayBuffer) {\r\n return new Float32Array(data, byteOffset, count);\r\n } else {\r\n let offset = data.byteOffset + byteOffset;\r\n if (forceCopy) {\r\n const result = new Float32Array(count);\r\n const source = new Float32Array(data.buffer, offset, count);\r\n\r\n result.set(source);\r\n\r\n return result;\r\n }\r\n\r\n // Protect against bad data\r\n const remainder = offset % 4;\r\n\r\n if (remainder) {\r\n offset = Math.max(0, offset - remainder);\r\n }\r\n\r\n return new Float32Array(data.buffer, offset, count);\r\n }\r\n }\r\n\r\n if (forceCopy) {\r\n return data.slice();\r\n }\r\n\r\n return data;\r\n }\r\n}\r\n", "import type { Nullable, FloatArray } from \"../types\";\r\nimport { Vector3, Vector2, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { Sprite } from \"../Sprites/sprite\";\r\n\r\nimport type { Ray } from \"../Culling/ray\";\r\n\r\n/**\r\n * Information about the result of picking within a scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/picking_collisions\r\n */\r\nexport class PickingInfo {\r\n /**\r\n * If the pick collided with an object\r\n */\r\n public hit = false;\r\n /**\r\n * Distance away where the pick collided\r\n */\r\n public distance = 0;\r\n /**\r\n * The location of pick collision\r\n */\r\n public pickedPoint: Nullable = null;\r\n /**\r\n * The mesh corresponding the pick collision\r\n */\r\n public pickedMesh: Nullable = null;\r\n /** (See getTextureCoordinates) The barycentric U coordinate that is used when calculating the texture coordinates of the collision.*/\r\n public bu = 0;\r\n /** (See getTextureCoordinates) The barycentric V coordinate that is used when calculating the texture coordinates of the collision.*/\r\n public bv = 0;\r\n /** The index of the face on the mesh that was picked, or the index of the Line if the picked Mesh is a LinesMesh */\r\n public faceId = -1;\r\n /** The index of the face on the subMesh that was picked, or the index of the Line if the picked Mesh is a LinesMesh */\r\n public subMeshFaceId = -1;\r\n /** Id of the submesh that was picked */\r\n public subMeshId = 0;\r\n /** If a sprite was picked, this will be the sprite the pick collided with */\r\n public pickedSprite: Nullable = null;\r\n /** If we are picking a mesh with thin instance, this will give you the picked thin instance */\r\n public thinInstanceIndex = -1;\r\n /**\r\n * The ray that was used to perform the picking.\r\n */\r\n public ray: Nullable = null;\r\n /**\r\n * If a mesh was used to do the picking (eg. 6dof controller) as a \"near interaction\", this will be populated.\r\n */\r\n public originMesh: Nullable = null;\r\n /**\r\n * The aim-space transform of the input used for picking, if it is an XR input source.\r\n */\r\n public aimTransform: Nullable = null;\r\n /**\r\n * The grip-space transform of the input used for picking, if it is an XR input source.\r\n * Some XR sources, such as input coming from head mounted displays, do not have this.\r\n */\r\n public gripTransform: Nullable = null;\r\n\r\n /**\r\n * Gets the normal corresponding to the face the pick collided with\r\n * @param useWorldCoordinates If the resulting normal should be relative to the world (default: false)\r\n * @param useVerticesNormals If the vertices normals should be used to calculate the normal instead of the normal map (default: true)\r\n * @returns The normal corresponding to the face the pick collided with\r\n * @remarks Note that the returned normal will always point towards the picking ray.\r\n */\r\n public getNormal(useWorldCoordinates = false, useVerticesNormals = true): Nullable {\r\n if (!this.pickedMesh || (useVerticesNormals && !this.pickedMesh.isVerticesDataPresent(VertexBuffer.NormalKind))) {\r\n return null;\r\n }\r\n\r\n let indices = this.pickedMesh.getIndices();\r\n\r\n if (indices?.length === 0) {\r\n indices = null;\r\n }\r\n\r\n let result: Vector3;\r\n\r\n const tmp0 = TmpVectors.Vector3[0];\r\n const tmp1 = TmpVectors.Vector3[1];\r\n const tmp2 = TmpVectors.Vector3[2];\r\n\r\n if (useVerticesNormals) {\r\n const normals = this.pickedMesh.getVerticesData(VertexBuffer.NormalKind);\r\n\r\n let normal0 = indices\r\n ? Vector3.FromArrayToRef(normals, indices[this.faceId * 3] * 3, tmp0)\r\n : tmp0.copyFromFloats(normals[this.faceId * 3 * 3], normals[this.faceId * 3 * 3 + 1], normals[this.faceId * 3 * 3 + 2]);\r\n let normal1 = indices\r\n ? Vector3.FromArrayToRef(normals, indices[this.faceId * 3 + 1] * 3, tmp1)\r\n : tmp1.copyFromFloats(normals[(this.faceId * 3 + 1) * 3], normals[(this.faceId * 3 + 1) * 3 + 1], normals[(this.faceId * 3 + 1) * 3 + 2]);\r\n let normal2 = indices\r\n ? Vector3.FromArrayToRef(normals, indices[this.faceId * 3 + 2] * 3, tmp2)\r\n : tmp2.copyFromFloats(normals[(this.faceId * 3 + 2) * 3], normals[(this.faceId * 3 + 2) * 3 + 1], normals[(this.faceId * 3 + 2) * 3 + 2]);\r\n\r\n normal0 = normal0.scale(this.bu);\r\n normal1 = normal1.scale(this.bv);\r\n normal2 = normal2.scale(1.0 - this.bu - this.bv);\r\n\r\n result = new Vector3(normal0.x + normal1.x + normal2.x, normal0.y + normal1.y + normal2.y, normal0.z + normal1.z + normal2.z);\r\n } else {\r\n const positions = this.pickedMesh.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n const vertex1 = indices\r\n ? Vector3.FromArrayToRef(positions, indices[this.faceId * 3] * 3, tmp0)\r\n : tmp0.copyFromFloats(positions[this.faceId * 3 * 3], positions[this.faceId * 3 * 3 + 1], positions[this.faceId * 3 * 3 + 2]);\r\n const vertex2 = indices\r\n ? Vector3.FromArrayToRef(positions, indices[this.faceId * 3 + 1] * 3, tmp1)\r\n : tmp1.copyFromFloats(positions[(this.faceId * 3 + 1) * 3], positions[(this.faceId * 3 + 1) * 3 + 1], positions[(this.faceId * 3 + 1) * 3 + 2]);\r\n const vertex3 = indices\r\n ? Vector3.FromArrayToRef(positions, indices[this.faceId * 3 + 2] * 3, tmp2)\r\n : tmp2.copyFromFloats(positions[(this.faceId * 3 + 2) * 3], positions[(this.faceId * 3 + 2) * 3 + 1], positions[(this.faceId * 3 + 2) * 3 + 2]);\r\n\r\n const p1p2 = vertex1.subtract(vertex2);\r\n const p3p2 = vertex3.subtract(vertex2);\r\n\r\n result = Vector3.Cross(p1p2, p3p2);\r\n }\r\n\r\n const transformNormalToWorld = (pickedMesh: AbstractMesh, n: Vector3) => {\r\n let wm = pickedMesh.getWorldMatrix();\r\n\r\n if (pickedMesh.nonUniformScaling) {\r\n TmpVectors.Matrix[0].copyFrom(wm);\r\n wm = TmpVectors.Matrix[0];\r\n wm.setTranslationFromFloats(0, 0, 0);\r\n wm.invert();\r\n wm.transposeToRef(TmpVectors.Matrix[1]);\r\n\r\n wm = TmpVectors.Matrix[1];\r\n }\r\n\r\n Vector3.TransformNormalToRef(n, wm, n);\r\n };\r\n\r\n if (useWorldCoordinates) {\r\n transformNormalToWorld(this.pickedMesh, result);\r\n }\r\n\r\n if (this.ray) {\r\n const normalForDirectionChecking = TmpVectors.Vector3[0].copyFrom(result);\r\n\r\n if (!useWorldCoordinates) {\r\n // the normal has not been transformed to world space as part as the normal processing, so we must do it now\r\n transformNormalToWorld(this.pickedMesh, normalForDirectionChecking);\r\n }\r\n\r\n // Flip the normal if the picking ray is in the same direction.\r\n if (Vector3.Dot(normalForDirectionChecking, this.ray.direction) > 0) {\r\n result.negateInPlace();\r\n }\r\n }\r\n\r\n result.normalize();\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the texture coordinates of where the pick occurred\r\n * @param uvSet The UV set to use to calculate the texture coordinates (default: VertexBuffer.UVKind)\r\n * @returns The vector containing the coordinates of the texture\r\n */\r\n public getTextureCoordinates(uvSet = VertexBuffer.UVKind): Nullable {\r\n if (!this.pickedMesh || !this.pickedMesh.isVerticesDataPresent(uvSet)) {\r\n return null;\r\n }\r\n\r\n const indices = this.pickedMesh.getIndices();\r\n if (!indices) {\r\n return null;\r\n }\r\n\r\n const uvs = this.pickedMesh.getVerticesData(uvSet);\r\n if (!uvs) {\r\n return null;\r\n }\r\n\r\n let uv0 = Vector2.FromArray(uvs, indices[this.faceId * 3] * 2);\r\n let uv1 = Vector2.FromArray(uvs, indices[this.faceId * 3 + 1] * 2);\r\n let uv2 = Vector2.FromArray(uvs, indices[this.faceId * 3 + 2] * 2);\r\n\r\n uv0 = uv0.scale(this.bu);\r\n uv1 = uv1.scale(this.bv);\r\n uv2 = uv2.scale(1.0 - this.bu - this.bv);\r\n\r\n return new Vector2(uv0.x + uv1.x + uv2.x, uv0.y + uv1.y + uv2.y);\r\n }\r\n}\r\n", "import type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Sprite } from \"../Sprites/sprite\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Vector2 } from \"../Maths/math.vector\";\r\n\r\n/**\r\n * Interface used to define ActionEvent\r\n */\r\nexport interface IActionEvent {\r\n /** The mesh or sprite that triggered the action */\r\n source: any;\r\n /** The X mouse cursor position at the time of the event */\r\n pointerX: number;\r\n /** The Y mouse cursor position at the time of the event */\r\n pointerY: number;\r\n /** The mesh that is currently pointed at (can be null) */\r\n meshUnderPointer: Nullable;\r\n /** the original (browser) event that triggered the ActionEvent */\r\n sourceEvent?: any;\r\n /** additional data for the event */\r\n additionalData?: any;\r\n}\r\n\r\n/**\r\n * ActionEvent is the event being sent when an action is triggered.\r\n */\r\nexport class ActionEvent implements IActionEvent {\r\n /**\r\n * Creates a new ActionEvent\r\n * @param source The mesh or sprite that triggered the action\r\n * @param pointerX The X mouse cursor position at the time of the event\r\n * @param pointerY The Y mouse cursor position at the time of the event\r\n * @param meshUnderPointer The mesh that is currently pointed at (can be null)\r\n * @param sourceEvent the original (browser) event that triggered the ActionEvent\r\n * @param additionalData additional data for the event\r\n */\r\n constructor(\r\n /** The mesh or sprite that triggered the action */\r\n public source: any,\r\n /** The X mouse cursor position at the time of the event */\r\n public pointerX: number,\r\n /** The Y mouse cursor position at the time of the event */\r\n public pointerY: number,\r\n /** The mesh that is currently pointed at (can be null) */\r\n public meshUnderPointer: Nullable,\r\n /** the original (browser) event that triggered the ActionEvent */\r\n public sourceEvent?: any,\r\n /** additional data for the event */\r\n public additionalData?: any\r\n ) {}\r\n\r\n /**\r\n * Helper function to auto-create an ActionEvent from a source mesh.\r\n * @param source The source mesh that triggered the event\r\n * @param evt The original (browser) event\r\n * @param additionalData additional data for the event\r\n * @returns the new ActionEvent\r\n */\r\n public static CreateNew(source: AbstractMesh, evt?: any, additionalData?: any): ActionEvent {\r\n const scene = source.getScene();\r\n return new ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer || source, evt, additionalData);\r\n }\r\n\r\n /**\r\n * Helper function to auto-create an ActionEvent from a source sprite\r\n * @param source The source sprite that triggered the event\r\n * @param scene Scene associated with the sprite\r\n * @param evt The original (browser) event\r\n * @param additionalData additional data for the event\r\n * @returns the new ActionEvent\r\n */\r\n public static CreateNewFromSprite(source: Sprite, scene: Scene, evt?: any, additionalData?: any): ActionEvent {\r\n return new ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer, evt, additionalData);\r\n }\r\n\r\n /**\r\n * Helper function to auto-create an ActionEvent from a scene. If triggered by a mesh use ActionEvent.CreateNew\r\n * @param scene the scene where the event occurred\r\n * @param evt The original (browser) event\r\n * @returns the new ActionEvent\r\n */\r\n public static CreateNewFromScene(scene: Scene, evt: any): ActionEvent {\r\n return new ActionEvent(null, scene.pointerX, scene.pointerY, scene.meshUnderPointer, evt);\r\n }\r\n\r\n /**\r\n * Helper function to auto-create an ActionEvent from a primitive\r\n * @param prim defines the target primitive\r\n * @param pointerPos defines the pointer position\r\n * @param evt The original (browser) event\r\n * @param additionalData additional data for the event\r\n * @returns the new ActionEvent\r\n */\r\n public static CreateNewFromPrimitive(prim: any, pointerPos: Vector2, evt?: Event, additionalData?: any): ActionEvent {\r\n return new ActionEvent(prim, pointerPos.x, pointerPos.y, null, evt, additionalData);\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport type { PostProcess } from \"./postProcess\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport type { RenderTargetWrapper } from \"../Engines/renderTargetWrapper\";\r\n\r\nimport type { Scene } from \"../scene\";\r\n\r\n/**\r\n * PostProcessManager is used to manage one or more post processes or post process pipelines\r\n * See https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses\r\n */\r\nexport class PostProcessManager {\r\n private _scene: Scene;\r\n private _indexBuffer: Nullable;\r\n private _vertexBuffers: { [key: string]: Nullable } = {};\r\n\r\n /**\r\n * Creates a new instance PostProcess\r\n * @param scene The scene that the post process is associated with.\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n }\r\n\r\n private _prepareBuffers(): void {\r\n if (this._vertexBuffers[VertexBuffer.PositionKind]) {\r\n return;\r\n }\r\n\r\n // VBO\r\n const vertices = [];\r\n vertices.push(1, 1);\r\n vertices.push(-1, 1);\r\n vertices.push(-1, -1);\r\n vertices.push(1, -1);\r\n\r\n this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(this._scene.getEngine(), vertices, VertexBuffer.PositionKind, false, false, 2);\r\n\r\n this._buildIndexBuffer();\r\n }\r\n\r\n private _buildIndexBuffer(): void {\r\n // Indices\r\n const indices = [];\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n this._indexBuffer = this._scene.getEngine().createIndexBuffer(indices);\r\n }\r\n\r\n /**\r\n * Rebuilds the vertex buffers of the manager.\r\n * @internal\r\n */\r\n public _rebuild(): void {\r\n const vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n\r\n if (!vb) {\r\n return;\r\n }\r\n vb._rebuild();\r\n this._buildIndexBuffer();\r\n }\r\n\r\n // Methods\r\n /**\r\n * Prepares a frame to be run through a post process.\r\n * @param sourceTexture The input texture to the post processes. (default: null)\r\n * @param postProcesses An array of post processes to be run. (default: null)\r\n * @returns True if the post processes were able to be run.\r\n * @internal\r\n */\r\n public _prepareFrame(sourceTexture: Nullable = null, postProcesses: Nullable = null): boolean {\r\n const camera = this._scene.activeCamera;\r\n if (!camera) {\r\n return false;\r\n }\r\n\r\n postProcesses = postProcesses || >camera._postProcesses.filter((pp) => {\r\n return pp != null;\r\n });\r\n\r\n if (!postProcesses || postProcesses.length === 0 || !this._scene.postProcessesEnabled) {\r\n return false;\r\n }\r\n\r\n postProcesses[0].activate(camera, sourceTexture, postProcesses !== null && postProcesses !== undefined);\r\n return true;\r\n }\r\n\r\n /**\r\n * Manually render a set of post processes to a texture.\r\n * Please note, the frame buffer won't be unbound after the call in case you have more render to do.\r\n * @param postProcesses An array of post processes to be run.\r\n * @param targetTexture The render target wrapper to render to.\r\n * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight\r\n * @param faceIndex defines the face to render to if a cubemap is defined as the target\r\n * @param lodLevel defines which lod of the texture to render to\r\n * @param doNotBindFrambuffer If set to true, assumes that the framebuffer has been bound previously\r\n */\r\n public directRender(\r\n postProcesses: PostProcess[],\r\n targetTexture: Nullable = null,\r\n forceFullscreenViewport = false,\r\n faceIndex = 0,\r\n lodLevel = 0,\r\n doNotBindFrambuffer = false\r\n ): void {\r\n const engine = this._scene.getEngine();\r\n\r\n for (let index = 0; index < postProcesses.length; index++) {\r\n if (index < postProcesses.length - 1) {\r\n postProcesses[index + 1].activate(this._scene.activeCamera, targetTexture?.texture);\r\n } else {\r\n if (targetTexture) {\r\n engine.bindFramebuffer(targetTexture, faceIndex, undefined, undefined, forceFullscreenViewport, lodLevel);\r\n } else if (!doNotBindFrambuffer) {\r\n engine.restoreDefaultFramebuffer();\r\n }\r\n engine._debugInsertMarker?.(`post process ${postProcesses[index].name} output`);\r\n }\r\n\r\n const pp = postProcesses[index];\r\n const effect = pp.apply();\r\n\r\n if (effect) {\r\n pp.onBeforeRenderObservable.notifyObservers(effect);\r\n\r\n // VBOs\r\n this._prepareBuffers();\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n\r\n // Draw order\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, 6);\r\n\r\n pp.onAfterRenderObservable.notifyObservers(effect);\r\n }\r\n }\r\n\r\n // Restore depth buffer\r\n engine.setDepthBuffer(true);\r\n engine.setDepthWrite(true);\r\n }\r\n\r\n /**\r\n * Finalize the result of the output of the postprocesses.\r\n * @param doNotPresent If true the result will not be displayed to the screen.\r\n * @param targetTexture The render target wrapper to render to.\r\n * @param faceIndex The index of the face to bind the target texture to.\r\n * @param postProcesses The array of post processes to render.\r\n * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight (default: false)\r\n * @internal\r\n */\r\n public _finalizeFrame(\r\n doNotPresent?: boolean,\r\n targetTexture?: RenderTargetWrapper,\r\n faceIndex?: number,\r\n postProcesses?: Array,\r\n forceFullscreenViewport = false\r\n ): void {\r\n const camera = this._scene.activeCamera;\r\n\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n postProcesses = postProcesses || >camera._postProcesses.filter((pp) => {\r\n return pp != null;\r\n });\r\n if (postProcesses.length === 0 || !this._scene.postProcessesEnabled) {\r\n return;\r\n }\r\n const engine = this._scene.getEngine();\r\n\r\n for (let index = 0, len = postProcesses.length; index < len; index++) {\r\n const pp = postProcesses[index];\r\n\r\n if (index < len - 1) {\r\n pp._outputTexture = postProcesses[index + 1].activate(camera, targetTexture?.texture);\r\n } else {\r\n if (targetTexture) {\r\n engine.bindFramebuffer(targetTexture, faceIndex, undefined, undefined, forceFullscreenViewport);\r\n pp._outputTexture = targetTexture;\r\n } else {\r\n engine.restoreDefaultFramebuffer();\r\n pp._outputTexture = null;\r\n }\r\n engine._debugInsertMarker?.(`post process ${postProcesses[index].name} output`);\r\n }\r\n\r\n if (doNotPresent) {\r\n break;\r\n }\r\n\r\n const effect = pp.apply();\r\n\r\n if (effect) {\r\n pp.onBeforeRenderObservable.notifyObservers(effect);\r\n\r\n // VBOs\r\n this._prepareBuffers();\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n\r\n // Draw order\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, 6);\r\n\r\n pp.onAfterRenderObservable.notifyObservers(effect);\r\n }\r\n }\r\n\r\n // Restore states\r\n engine.setDepthBuffer(true);\r\n engine.setDepthWrite(true);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n /**\r\n * Disposes of the post process manager.\r\n */\r\n public dispose(): void {\r\n const buffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (buffer) {\r\n buffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._scene.getEngine()._releaseBuffer(this._indexBuffer);\r\n this._indexBuffer = null;\r\n }\r\n }\r\n}\r\n", "import { SmartArray, SmartArrayNoDuplicate } from \"../Misc/smartArray\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Nullable, DeepImmutable } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport type { IEdgesRenderer } from \"./edgesRenderer\";\r\nimport type { ISpriteManager } from \"../Sprites/spriteManager\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\n\r\n/**\r\n * This represents the object necessary to create a rendering group.\r\n * This is exclusively used and created by the rendering manager.\r\n * To modify the behavior, you use the available helpers in your scene or meshes.\r\n * @internal\r\n */\r\nexport class RenderingGroup {\r\n private static _ZeroVector: DeepImmutable = Vector3.Zero();\r\n private _scene: Scene;\r\n private _opaqueSubMeshes = new SmartArray(256);\r\n private _transparentSubMeshes = new SmartArray(256);\r\n private _alphaTestSubMeshes = new SmartArray(256);\r\n private _depthOnlySubMeshes = new SmartArray(256);\r\n private _particleSystems = new SmartArray(256);\r\n private _spriteManagers = new SmartArray(256);\r\n\r\n private _opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>;\r\n private _alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>;\r\n private _transparentSortCompareFn: (a: SubMesh, b: SubMesh) => number;\r\n\r\n private _renderOpaque: (subMeshes: SmartArray) => void;\r\n private _renderAlphaTest: (subMeshes: SmartArray) => void;\r\n private _renderTransparent: (subMeshes: SmartArray) => void;\r\n\r\n /** @internal */\r\n public _empty = true;\r\n\r\n /** @internal */\r\n public _edgesRenderers = new SmartArrayNoDuplicate(16);\r\n\r\n public onBeforeTransparentRendering: () => void;\r\n\r\n /**\r\n * Set the opaque sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set opaqueSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._opaqueSortCompareFn = value;\r\n } else {\r\n this._opaqueSortCompareFn = RenderingGroup.PainterSortCompare;\r\n }\r\n this._renderOpaque = this._renderOpaqueSorted;\r\n }\r\n\r\n /**\r\n * Set the alpha test sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set alphaTestSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._alphaTestSortCompareFn = value;\r\n } else {\r\n this._alphaTestSortCompareFn = RenderingGroup.PainterSortCompare;\r\n }\r\n this._renderAlphaTest = this._renderAlphaTestSorted;\r\n }\r\n\r\n /**\r\n * Set the transparent sort comparison function.\r\n * If null the sub meshes will be render in the order they were created\r\n */\r\n public set transparentSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>) {\r\n if (value) {\r\n this._transparentSortCompareFn = value;\r\n } else {\r\n this._transparentSortCompareFn = RenderingGroup.defaultTransparentSortCompare;\r\n }\r\n this._renderTransparent = this._renderTransparentSorted;\r\n }\r\n\r\n /**\r\n * Creates a new rendering group.\r\n * @param index The rendering group index\r\n * @param scene\r\n * @param opaqueSortCompareFn The opaque sort comparison function. If null no order is applied\r\n * @param alphaTestSortCompareFn The alpha test sort comparison function. If null no order is applied\r\n * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied\r\n */\r\n constructor(\r\n public index: number,\r\n scene: Scene,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ) {\r\n this._scene = scene;\r\n\r\n this.opaqueSortCompareFn = opaqueSortCompareFn;\r\n this.alphaTestSortCompareFn = alphaTestSortCompareFn;\r\n this.transparentSortCompareFn = transparentSortCompareFn;\r\n }\r\n\r\n /**\r\n * Render all the sub meshes contained in the group.\r\n * @param customRenderFunction Used to override the default render behaviour of the group.\r\n * @param renderSprites\r\n * @param renderParticles\r\n * @param activeMeshes\r\n */\r\n public render(\r\n customRenderFunction: Nullable<\r\n (\r\n opaqueSubMeshes: SmartArray,\r\n transparentSubMeshes: SmartArray,\r\n alphaTestSubMeshes: SmartArray,\r\n depthOnlySubMeshes: SmartArray\r\n ) => void\r\n >,\r\n renderSprites: boolean,\r\n renderParticles: boolean,\r\n activeMeshes: Nullable\r\n ): void {\r\n if (customRenderFunction) {\r\n customRenderFunction(this._opaqueSubMeshes, this._alphaTestSubMeshes, this._transparentSubMeshes, this._depthOnlySubMeshes);\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n // Depth only\r\n if (this._depthOnlySubMeshes.length !== 0) {\r\n engine.setColorWrite(false);\r\n this._renderAlphaTest(this._depthOnlySubMeshes);\r\n engine.setColorWrite(true);\r\n }\r\n\r\n // Opaque\r\n if (this._opaqueSubMeshes.length !== 0) {\r\n this._renderOpaque(this._opaqueSubMeshes);\r\n }\r\n\r\n // Alpha test\r\n if (this._alphaTestSubMeshes.length !== 0) {\r\n this._renderAlphaTest(this._alphaTestSubMeshes);\r\n }\r\n\r\n const stencilState = engine.getStencilBuffer();\r\n engine.setStencilBuffer(false);\r\n\r\n // Sprites\r\n if (renderSprites) {\r\n this._renderSprites();\r\n }\r\n\r\n // Particles\r\n if (renderParticles) {\r\n this._renderParticles(activeMeshes);\r\n }\r\n\r\n if (this.onBeforeTransparentRendering) {\r\n this.onBeforeTransparentRendering();\r\n }\r\n\r\n // Transparent\r\n if (this._transparentSubMeshes.length !== 0 || this._scene.useOrderIndependentTransparency) {\r\n engine.setStencilBuffer(stencilState);\r\n if (this._scene.useOrderIndependentTransparency) {\r\n const excludedMeshes = this._scene.depthPeelingRenderer!.render(this._transparentSubMeshes);\r\n if (excludedMeshes.length) {\r\n // Render leftover meshes that could not be processed by depth peeling\r\n this._renderTransparent(excludedMeshes);\r\n }\r\n } else {\r\n this._renderTransparent(this._transparentSubMeshes);\r\n }\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Set back stencil to false in case it changes before the edge renderer.\r\n engine.setStencilBuffer(false);\r\n\r\n // Edges\r\n if (this._edgesRenderers.length) {\r\n for (let edgesRendererIndex = 0; edgesRendererIndex < this._edgesRenderers.length; edgesRendererIndex++) {\r\n this._edgesRenderers.data[edgesRendererIndex].render();\r\n }\r\n\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Restore Stencil state.\r\n engine.setStencilBuffer(stencilState);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the opaqueSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderOpaqueSorted(subMeshes: SmartArray): void {\r\n RenderingGroup._RenderSorted(subMeshes, this._opaqueSortCompareFn, this._scene.activeCamera, false);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the alphatestSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderAlphaTestSorted(subMeshes: SmartArray): void {\r\n RenderingGroup._RenderSorted(subMeshes, this._alphaTestSortCompareFn, this._scene.activeCamera, false);\r\n }\r\n\r\n /**\r\n * Renders the opaque submeshes in the order from the transparentSortCompareFn.\r\n * @param subMeshes The submeshes to render\r\n */\r\n private _renderTransparentSorted(subMeshes: SmartArray): void {\r\n RenderingGroup._RenderSorted(subMeshes, this._transparentSortCompareFn, this._scene.activeCamera, true);\r\n }\r\n\r\n /**\r\n * Renders the submeshes in a specified order.\r\n * @param subMeshes The submeshes to sort before render\r\n * @param sortCompareFn The comparison function use to sort\r\n * @param camera The camera position use to preprocess the submeshes to help sorting\r\n * @param transparent Specifies to activate blending if true\r\n */\r\n private static _RenderSorted(\r\n subMeshes: SmartArray,\r\n sortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number>,\r\n camera: Nullable,\r\n transparent: boolean\r\n ): void {\r\n let subIndex = 0;\r\n let subMesh: SubMesh;\r\n const cameraPosition = camera ? camera.globalPosition : RenderingGroup._ZeroVector;\r\n\r\n if (transparent) {\r\n for (; subIndex < subMeshes.length; subIndex++) {\r\n subMesh = subMeshes.data[subIndex];\r\n subMesh._alphaIndex = subMesh.getMesh().alphaIndex;\r\n subMesh._distanceToCamera = Vector3.Distance(subMesh.getBoundingInfo().boundingSphere.centerWorld, cameraPosition);\r\n }\r\n }\r\n\r\n const sortedArray = subMeshes.length === subMeshes.data.length ? subMeshes.data : subMeshes.data.slice(0, subMeshes.length);\r\n\r\n if (sortCompareFn) {\r\n sortedArray.sort(sortCompareFn);\r\n }\r\n\r\n const scene = sortedArray[0].getMesh().getScene();\r\n for (subIndex = 0; subIndex < sortedArray.length; subIndex++) {\r\n subMesh = sortedArray[subIndex];\r\n\r\n if (scene._activeMeshesFrozenButKeepClipping && !subMesh.isInFrustum(scene._frustumPlanes)) {\r\n continue;\r\n }\r\n\r\n if (transparent) {\r\n const material = subMesh.getMaterial();\r\n\r\n if (material && material.needDepthPrePass) {\r\n const engine = material.getScene().getEngine();\r\n engine.setColorWrite(false);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n subMesh.render(false);\r\n engine.setColorWrite(true);\r\n }\r\n }\r\n\r\n subMesh.render(transparent);\r\n }\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered back to front if in the same alpha index.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static defaultTransparentSortCompare(a: SubMesh, b: SubMesh): number {\r\n // Alpha index first\r\n if (a._alphaIndex > b._alphaIndex) {\r\n return 1;\r\n }\r\n if (a._alphaIndex < b._alphaIndex) {\r\n return -1;\r\n }\r\n\r\n // Then distance to camera\r\n return RenderingGroup.backToFrontSortCompare(a, b);\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered back to front.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static backToFrontSortCompare(a: SubMesh, b: SubMesh): number {\r\n // Then distance to camera\r\n if (a._distanceToCamera < b._distanceToCamera) {\r\n return 1;\r\n }\r\n if (a._distanceToCamera > b._distanceToCamera) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are rendered front to back (prevent overdraw).\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static frontToBackSortCompare(a: SubMesh, b: SubMesh): number {\r\n // Then distance to camera\r\n if (a._distanceToCamera < b._distanceToCamera) {\r\n return -1;\r\n }\r\n if (a._distanceToCamera > b._distanceToCamera) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)\r\n * are grouped by material then geometry.\r\n *\r\n * @param a The first submesh\r\n * @param b The second submesh\r\n * @returns The result of the comparison\r\n */\r\n public static PainterSortCompare(a: SubMesh, b: SubMesh): number {\r\n const meshA = a.getMesh();\r\n const meshB = b.getMesh();\r\n\r\n if (meshA.material && meshB.material) {\r\n return meshA.material.uniqueId - meshB.material.uniqueId;\r\n }\r\n\r\n return meshA.uniqueId - meshB.uniqueId;\r\n }\r\n\r\n /**\r\n * Resets the different lists of submeshes to prepare a new frame.\r\n */\r\n public prepare(): void {\r\n this._opaqueSubMeshes.reset();\r\n this._transparentSubMeshes.reset();\r\n this._alphaTestSubMeshes.reset();\r\n this._depthOnlySubMeshes.reset();\r\n this._particleSystems.reset();\r\n this.prepareSprites();\r\n this._edgesRenderers.reset();\r\n this._empty = true;\r\n }\r\n\r\n /**\r\n * Resets the different lists of sprites to prepare a new frame.\r\n */\r\n public prepareSprites(): void {\r\n this._spriteManagers.reset();\r\n }\r\n\r\n public dispose(): void {\r\n this._opaqueSubMeshes.dispose();\r\n this._transparentSubMeshes.dispose();\r\n this._alphaTestSubMeshes.dispose();\r\n this._depthOnlySubMeshes.dispose();\r\n this._particleSystems.dispose();\r\n this._spriteManagers.dispose();\r\n this._edgesRenderers.dispose();\r\n }\r\n\r\n /**\r\n * Inserts the submesh in its correct queue depending on its material.\r\n * @param subMesh The submesh to dispatch\r\n * @param [mesh] Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.\r\n * @param [material] Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.\r\n */\r\n public dispatch(subMesh: SubMesh, mesh?: AbstractMesh, material?: Nullable): void {\r\n // Get mesh and materials if not provided\r\n if (mesh === undefined) {\r\n mesh = subMesh.getMesh();\r\n }\r\n if (material === undefined) {\r\n material = subMesh.getMaterial();\r\n }\r\n\r\n if (material === null || material === undefined) {\r\n return;\r\n }\r\n\r\n if (material.needAlphaBlendingForMesh(mesh)) {\r\n // Transparent\r\n this._transparentSubMeshes.push(subMesh);\r\n } else if (material.needAlphaTesting()) {\r\n // Alpha test\r\n if (material.needDepthPrePass) {\r\n this._depthOnlySubMeshes.push(subMesh);\r\n }\r\n\r\n this._alphaTestSubMeshes.push(subMesh);\r\n } else {\r\n if (material.needDepthPrePass) {\r\n this._depthOnlySubMeshes.push(subMesh);\r\n }\r\n\r\n this._opaqueSubMeshes.push(subMesh); // Opaque\r\n }\r\n\r\n mesh._renderingGroup = this;\r\n\r\n if (mesh._edgesRenderer && mesh._edgesRenderer.isEnabled) {\r\n this._edgesRenderers.pushNoDuplicate(mesh._edgesRenderer);\r\n }\r\n\r\n this._empty = false;\r\n }\r\n\r\n public dispatchSprites(spriteManager: ISpriteManager) {\r\n this._spriteManagers.push(spriteManager);\r\n this._empty = false;\r\n }\r\n\r\n public dispatchParticles(particleSystem: IParticleSystem) {\r\n this._particleSystems.push(particleSystem);\r\n this._empty = false;\r\n }\r\n\r\n private _renderParticles(activeMeshes: Nullable): void {\r\n if (this._particleSystems.length === 0) {\r\n return;\r\n }\r\n\r\n // Particles\r\n const activeCamera = this._scene.activeCamera;\r\n this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene);\r\n for (let particleIndex = 0; particleIndex < this._particleSystems.length; particleIndex++) {\r\n const particleSystem = this._particleSystems.data[particleIndex];\r\n\r\n if ((activeCamera && activeCamera.layerMask & particleSystem.layerMask) === 0) {\r\n continue;\r\n }\r\n\r\n const emitter: any = particleSystem.emitter;\r\n if (!emitter.position || !activeMeshes || activeMeshes.indexOf(emitter) !== -1) {\r\n this._scene._activeParticles.addCount(particleSystem.render(), false);\r\n }\r\n }\r\n this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n\r\n private _renderSprites(): void {\r\n if (!this._scene.spritesEnabled || this._spriteManagers.length === 0) {\r\n return;\r\n }\r\n\r\n // Sprites\r\n const activeCamera = this._scene.activeCamera;\r\n this._scene.onBeforeSpritesRenderingObservable.notifyObservers(this._scene);\r\n for (let id = 0; id < this._spriteManagers.length; id++) {\r\n const spriteManager = this._spriteManagers.data[id];\r\n\r\n if ((activeCamera && activeCamera.layerMask & spriteManager.layerMask) !== 0) {\r\n spriteManager.render();\r\n }\r\n }\r\n this._scene.onAfterSpritesRenderingObservable.notifyObservers(this._scene);\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\nimport type { SmartArray } from \"../Misc/smartArray\";\r\nimport type { ISpriteManager } from \"../Sprites/spriteManager\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport { RenderingGroup } from \"./renderingGroup\";\r\n\r\nimport type { Scene } from \"../scene\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\n\r\n/**\r\n * Interface describing the different options available in the rendering manager\r\n * regarding Auto Clear between groups.\r\n */\r\nexport interface IRenderingManagerAutoClearSetup {\r\n /**\r\n * Defines whether or not autoclear is enable.\r\n */\r\n autoClear: boolean;\r\n /**\r\n * Defines whether or not to autoclear the depth buffer.\r\n */\r\n depth: boolean;\r\n /**\r\n * Defines whether or not to autoclear the stencil buffer.\r\n */\r\n stencil: boolean;\r\n}\r\n\r\n/**\r\n * This class is used by the onRenderingGroupObservable\r\n */\r\nexport class RenderingGroupInfo {\r\n /**\r\n * The Scene that being rendered\r\n */\r\n scene: Scene;\r\n\r\n /**\r\n * The camera currently used for the rendering pass\r\n */\r\n camera: Nullable;\r\n\r\n /**\r\n * The ID of the renderingGroup being processed\r\n */\r\n renderingGroupId: number;\r\n}\r\n\r\n/**\r\n * This is the manager responsible of all the rendering for meshes sprites and particles.\r\n * It is enable to manage the different groups as well as the different necessary sort functions.\r\n * This should not be used directly aside of the few static configurations\r\n */\r\nexport class RenderingManager {\r\n /**\r\n * The max id used for rendering groups (not included)\r\n */\r\n public static MAX_RENDERINGGROUPS = 4;\r\n\r\n /**\r\n * The min id used for rendering groups (included)\r\n */\r\n public static MIN_RENDERINGGROUPS = 0;\r\n\r\n /**\r\n * Used to globally prevent autoclearing scenes.\r\n */\r\n public static AUTOCLEAR = true;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _useSceneAutoClearSetup = false;\r\n\r\n private _scene: Scene;\r\n private _renderingGroups = new Array();\r\n private _depthStencilBufferAlreadyCleaned: boolean;\r\n\r\n private _autoClearDepthStencil: { [id: number]: IRenderingManagerAutoClearSetup } = {};\r\n private _customOpaqueSortCompareFn: { [id: number]: Nullable<(a: SubMesh, b: SubMesh) => number> } = {};\r\n private _customAlphaTestSortCompareFn: { [id: number]: Nullable<(a: SubMesh, b: SubMesh) => number> } = {};\r\n private _customTransparentSortCompareFn: { [id: number]: Nullable<(a: SubMesh, b: SubMesh) => number> } = {};\r\n private _renderingGroupInfo: Nullable = new RenderingGroupInfo();\r\n\r\n private _maintainStateBetweenFrames = false;\r\n /**\r\n * Gets or sets a boolean indicating that the manager will not reset between frames.\r\n * This means that if a mesh becomes invisible or transparent it will not be visible until this boolean is set to false again.\r\n * By default, the rendering manager will dispatch all active meshes per frame (moving them to the transparent, opaque or alpha testing lists).\r\n * By turning this property on, you will accelerate the rendering by keeping all these lists unchanged between frames.\r\n */\r\n public get maintainStateBetweenFrames() {\r\n return this._maintainStateBetweenFrames;\r\n }\r\n\r\n public set maintainStateBetweenFrames(value: boolean) {\r\n if (value === this._maintainStateBetweenFrames) {\r\n return;\r\n }\r\n\r\n this._maintainStateBetweenFrames = value;\r\n if (!this._maintainStateBetweenFrames) {\r\n this.restoreDispachedFlags();\r\n }\r\n }\r\n\r\n /**\r\n * Restore wasDispatched flags on the lists of elements to render.\r\n */\r\n public restoreDispachedFlags() {\r\n for (const mesh of this._scene.meshes) {\r\n if (mesh.subMeshes) {\r\n for (const subMesh of mesh.subMeshes) {\r\n subMesh._wasDispatched = false;\r\n }\r\n }\r\n }\r\n\r\n if (this._scene.spriteManagers) {\r\n for (const spriteManager of this._scene.spriteManagers) {\r\n spriteManager._wasDispatched = false;\r\n }\r\n }\r\n\r\n for (const particleSystem of this._scene.particleSystems) {\r\n particleSystem._wasDispatched = false;\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates a new rendering group for a particular scene\r\n * @param scene Defines the scene the groups belongs to\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n\r\n for (let i = RenderingManager.MIN_RENDERINGGROUPS; i < RenderingManager.MAX_RENDERINGGROUPS; i++) {\r\n this._autoClearDepthStencil[i] = { autoClear: true, depth: true, stencil: true };\r\n }\r\n }\r\n\r\n /**\r\n * @returns the rendering group with the specified id.\r\n * @param id the id of the rendering group (0 by default)\r\n */\r\n public getRenderingGroup(id: number): RenderingGroup {\r\n const renderingGroupId = id || 0;\r\n\r\n this._prepareRenderingGroup(renderingGroupId);\r\n\r\n return this._renderingGroups[renderingGroupId];\r\n }\r\n\r\n private _clearDepthStencilBuffer(depth = true, stencil = true): void {\r\n if (this._depthStencilBufferAlreadyCleaned) {\r\n return;\r\n }\r\n\r\n this._scene.getEngine().clear(null, false, depth, stencil);\r\n this._depthStencilBufferAlreadyCleaned = true;\r\n }\r\n\r\n /**\r\n * Renders the entire managed groups. This is used by the scene or the different render targets.\r\n * @internal\r\n */\r\n public render(\r\n customRenderFunction: Nullable<\r\n (\r\n opaqueSubMeshes: SmartArray,\r\n transparentSubMeshes: SmartArray,\r\n alphaTestSubMeshes: SmartArray,\r\n depthOnlySubMeshes: SmartArray\r\n ) => void\r\n >,\r\n activeMeshes: Nullable,\r\n renderParticles: boolean,\r\n renderSprites: boolean\r\n ): void {\r\n // Update the observable context (not null as it only goes away on dispose)\r\n const info = this._renderingGroupInfo!;\r\n info.scene = this._scene;\r\n info.camera = this._scene.activeCamera;\r\n\r\n // Dispatch sprites\r\n if (this._scene.spriteManagers && renderSprites) {\r\n for (let index = 0; index < this._scene.spriteManagers.length; index++) {\r\n const manager = this._scene.spriteManagers[index];\r\n this.dispatchSprites(manager);\r\n }\r\n }\r\n\r\n // Render\r\n for (let index = RenderingManager.MIN_RENDERINGGROUPS; index < RenderingManager.MAX_RENDERINGGROUPS; index++) {\r\n this._depthStencilBufferAlreadyCleaned = index === RenderingManager.MIN_RENDERINGGROUPS;\r\n const renderingGroup = this._renderingGroups[index];\r\n if (!renderingGroup || renderingGroup._empty) {\r\n continue;\r\n }\r\n\r\n const renderingGroupMask = 1 << index;\r\n info.renderingGroupId = index;\r\n\r\n // Before Observable\r\n this._scene.onBeforeRenderingGroupObservable.notifyObservers(info, renderingGroupMask);\r\n\r\n // Clear depth/stencil if needed\r\n if (RenderingManager.AUTOCLEAR) {\r\n const autoClear = this._useSceneAutoClearSetup ? this._scene.getAutoClearDepthStencilSetup(index) : this._autoClearDepthStencil[index];\r\n\r\n if (autoClear && autoClear.autoClear) {\r\n this._clearDepthStencilBuffer(autoClear.depth, autoClear.stencil);\r\n }\r\n }\r\n\r\n // Render\r\n for (const step of this._scene._beforeRenderingGroupDrawStage) {\r\n step.action(index);\r\n }\r\n renderingGroup.render(customRenderFunction, renderSprites, renderParticles, activeMeshes);\r\n for (const step of this._scene._afterRenderingGroupDrawStage) {\r\n step.action(index);\r\n }\r\n\r\n // After Observable\r\n this._scene.onAfterRenderingGroupObservable.notifyObservers(info, renderingGroupMask);\r\n }\r\n }\r\n\r\n /**\r\n * Resets the different information of the group to prepare a new frame\r\n * @internal\r\n */\r\n public reset(): void {\r\n if (this.maintainStateBetweenFrames) {\r\n return;\r\n }\r\n\r\n for (let index = RenderingManager.MIN_RENDERINGGROUPS; index < RenderingManager.MAX_RENDERINGGROUPS; index++) {\r\n const renderingGroup = this._renderingGroups[index];\r\n if (renderingGroup) {\r\n renderingGroup.prepare();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resets the sprites information of the group to prepare a new frame\r\n * @internal\r\n */\r\n public resetSprites(): void {\r\n if (this.maintainStateBetweenFrames) {\r\n return;\r\n }\r\n\r\n for (let index = RenderingManager.MIN_RENDERINGGROUPS; index < RenderingManager.MAX_RENDERINGGROUPS; index++) {\r\n const renderingGroup = this._renderingGroups[index];\r\n if (renderingGroup) {\r\n renderingGroup.prepareSprites();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Dispose and release the group and its associated resources.\r\n * @internal\r\n */\r\n public dispose(): void {\r\n this.freeRenderingGroups();\r\n this._renderingGroups.length = 0;\r\n this._renderingGroupInfo = null;\r\n }\r\n\r\n /**\r\n * Clear the info related to rendering groups preventing retention points during dispose.\r\n */\r\n public freeRenderingGroups(): void {\r\n for (let index = RenderingManager.MIN_RENDERINGGROUPS; index < RenderingManager.MAX_RENDERINGGROUPS; index++) {\r\n const renderingGroup = this._renderingGroups[index];\r\n if (renderingGroup) {\r\n renderingGroup.dispose();\r\n }\r\n }\r\n }\r\n\r\n private _prepareRenderingGroup(renderingGroupId: number): void {\r\n if (this._renderingGroups[renderingGroupId] === undefined) {\r\n this._renderingGroups[renderingGroupId] = new RenderingGroup(\r\n renderingGroupId,\r\n this._scene,\r\n this._customOpaqueSortCompareFn[renderingGroupId],\r\n this._customAlphaTestSortCompareFn[renderingGroupId],\r\n this._customTransparentSortCompareFn[renderingGroupId]\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Add a sprite manager to the rendering manager in order to render it this frame.\r\n * @param spriteManager Define the sprite manager to render\r\n */\r\n public dispatchSprites(spriteManager: ISpriteManager) {\r\n if (this.maintainStateBetweenFrames && spriteManager._wasDispatched) {\r\n return;\r\n }\r\n spriteManager._wasDispatched = true;\r\n this.getRenderingGroup(spriteManager.renderingGroupId).dispatchSprites(spriteManager);\r\n }\r\n\r\n /**\r\n * Add a particle system to the rendering manager in order to render it this frame.\r\n * @param particleSystem Define the particle system to render\r\n */\r\n public dispatchParticles(particleSystem: IParticleSystem) {\r\n if (this.maintainStateBetweenFrames && particleSystem._wasDispatched) {\r\n return;\r\n }\r\n particleSystem._wasDispatched = true;\r\n this.getRenderingGroup(particleSystem.renderingGroupId).dispatchParticles(particleSystem);\r\n }\r\n\r\n /**\r\n * Add a submesh to the manager in order to render it this frame\r\n * @param subMesh The submesh to dispatch\r\n * @param mesh Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.\r\n * @param material Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.\r\n */\r\n public dispatch(subMesh: SubMesh, mesh?: AbstractMesh, material?: Nullable): void {\r\n if (mesh === undefined) {\r\n mesh = subMesh.getMesh();\r\n }\r\n if (this.maintainStateBetweenFrames && subMesh._wasDispatched) {\r\n return;\r\n }\r\n subMesh._wasDispatched = true;\r\n this.getRenderingGroup(mesh.renderingGroupId).dispatch(subMesh, mesh, material);\r\n }\r\n\r\n /**\r\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\r\n * This allowed control for front to back rendering or reversely depending of the special needs.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\r\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\r\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\r\n */\r\n public setRenderingOrder(\r\n renderingGroupId: number,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ) {\r\n this._customOpaqueSortCompareFn[renderingGroupId] = opaqueSortCompareFn;\r\n this._customAlphaTestSortCompareFn[renderingGroupId] = alphaTestSortCompareFn;\r\n this._customTransparentSortCompareFn[renderingGroupId] = transparentSortCompareFn;\r\n\r\n if (this._renderingGroups[renderingGroupId]) {\r\n const group = this._renderingGroups[renderingGroupId];\r\n group.opaqueSortCompareFn = this._customOpaqueSortCompareFn[renderingGroupId];\r\n group.alphaTestSortCompareFn = this._customAlphaTestSortCompareFn[renderingGroupId];\r\n group.transparentSortCompareFn = this._customTransparentSortCompareFn[renderingGroupId];\r\n }\r\n }\r\n\r\n /**\r\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\r\n * @param depth Automatically clears depth between groups if true and autoClear is true.\r\n * @param stencil Automatically clears stencil between groups if true and autoClear is true.\r\n */\r\n public setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean, depth = true, stencil = true): void {\r\n this._autoClearDepthStencil[renderingGroupId] = {\r\n autoClear: autoClearDepthStencil,\r\n depth: depth,\r\n stencil: stencil,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the current auto clear configuration for one rendering group of the rendering\r\n * manager.\r\n * @param index the rendering group index to get the information for\r\n * @returns The auto clear setup for the requested rendering group\r\n */\r\n public getAutoClearDepthStencilSetup(index: number): IRenderingManagerAutoClearSetup {\r\n return this._autoClearDepthStencil[index];\r\n }\r\n}\r\n", "import type { Scene } from \"./scene\";\r\nimport type { SmartArrayNoDuplicate } from \"./Misc/smartArray\";\r\nimport type { Nullable } from \"./types\";\r\nimport type { PickingInfo } from \"./Collisions/pickingInfo\";\r\nimport type { AbstractScene } from \"./abstractScene\";\r\nimport type { IPointerEvent } from \"./Events/deviceInputEvents\";\r\n\r\nimport type { Mesh } from \"./Meshes/mesh\";\r\nimport type { Effect } from \"./Materials/effect\";\r\nimport type { Camera } from \"./Cameras/camera\";\r\nimport type { AbstractMesh } from \"./Meshes/abstractMesh\";\r\nimport type { SubMesh } from \"./Meshes/subMesh\";\r\nimport type { RenderTargetTexture } from \"./Materials/Textures/renderTargetTexture\";\r\n\r\n/**\r\n * Groups all the scene component constants in one place to ease maintenance.\r\n * @internal\r\n */\r\nexport class SceneComponentConstants {\r\n public static readonly NAME_EFFECTLAYER = \"EffectLayer\";\r\n public static readonly NAME_LAYER = \"Layer\";\r\n public static readonly NAME_LENSFLARESYSTEM = \"LensFlareSystem\";\r\n public static readonly NAME_BOUNDINGBOXRENDERER = \"BoundingBoxRenderer\";\r\n public static readonly NAME_PARTICLESYSTEM = \"ParticleSystem\";\r\n public static readonly NAME_GAMEPAD = \"Gamepad\";\r\n public static readonly NAME_SIMPLIFICATIONQUEUE = \"SimplificationQueue\";\r\n public static readonly NAME_GEOMETRYBUFFERRENDERER = \"GeometryBufferRenderer\";\r\n public static readonly NAME_PREPASSRENDERER = \"PrePassRenderer\";\r\n public static readonly NAME_DEPTHRENDERER = \"DepthRenderer\";\r\n public static readonly NAME_DEPTHPEELINGRENDERER = \"DepthPeelingRenderer\";\r\n public static readonly NAME_POSTPROCESSRENDERPIPELINEMANAGER = \"PostProcessRenderPipelineManager\";\r\n public static readonly NAME_SPRITE = \"Sprite\";\r\n public static readonly NAME_SUBSURFACE = \"SubSurface\";\r\n public static readonly NAME_OUTLINERENDERER = \"Outline\";\r\n public static readonly NAME_PROCEDURALTEXTURE = \"ProceduralTexture\";\r\n public static readonly NAME_SHADOWGENERATOR = \"ShadowGenerator\";\r\n public static readonly NAME_OCTREE = \"Octree\";\r\n public static readonly NAME_PHYSICSENGINE = \"PhysicsEngine\";\r\n public static readonly NAME_AUDIO = \"Audio\";\r\n public static readonly NAME_FLUIDRENDERER = \"FluidRenderer\";\r\n\r\n public static readonly STEP_ISREADYFORMESH_EFFECTLAYER = 0;\r\n\r\n public static readonly STEP_BEFOREEVALUATEACTIVEMESH_BOUNDINGBOXRENDERER = 0;\r\n\r\n public static readonly STEP_EVALUATESUBMESH_BOUNDINGBOXRENDERER = 0;\r\n\r\n public static readonly STEP_PREACTIVEMESH_BOUNDINGBOXRENDERER = 0;\r\n\r\n public static readonly STEP_CAMERADRAWRENDERTARGET_EFFECTLAYER = 1;\r\n\r\n public static readonly STEP_BEFORECAMERADRAW_PREPASS = 0;\r\n public static readonly STEP_BEFORECAMERADRAW_EFFECTLAYER = 1;\r\n public static readonly STEP_BEFORECAMERADRAW_LAYER = 2;\r\n\r\n public static readonly STEP_BEFORERENDERTARGETDRAW_PREPASS = 0;\r\n public static readonly STEP_BEFORERENDERTARGETDRAW_LAYER = 1;\r\n\r\n public static readonly STEP_BEFORERENDERINGMESH_PREPASS = 0;\r\n public static readonly STEP_BEFORERENDERINGMESH_OUTLINE = 1;\r\n\r\n public static readonly STEP_AFTERRENDERINGMESH_PREPASS = 0;\r\n public static readonly STEP_AFTERRENDERINGMESH_OUTLINE = 1;\r\n\r\n public static readonly STEP_AFTERRENDERINGGROUPDRAW_EFFECTLAYER_DRAW = 0;\r\n public static readonly STEP_AFTERRENDERINGGROUPDRAW_BOUNDINGBOXRENDERER = 1;\r\n\r\n public static readonly STEP_BEFORECAMERAUPDATE_SIMPLIFICATIONQUEUE = 0;\r\n public static readonly STEP_BEFORECAMERAUPDATE_GAMEPAD = 1;\r\n\r\n public static readonly STEP_BEFORECLEAR_PROCEDURALTEXTURE = 0;\r\n public static readonly STEP_BEFORECLEAR_PREPASS = 1;\r\n\r\n public static readonly STEP_BEFORERENDERTARGETCLEAR_PREPASS = 0;\r\n\r\n public static readonly STEP_AFTERRENDERTARGETDRAW_PREPASS = 0;\r\n public static readonly STEP_AFTERRENDERTARGETDRAW_LAYER = 1;\r\n\r\n public static readonly STEP_AFTERCAMERADRAW_PREPASS = 0;\r\n public static readonly STEP_AFTERCAMERADRAW_EFFECTLAYER = 1;\r\n public static readonly STEP_AFTERCAMERADRAW_LENSFLARESYSTEM = 2;\r\n public static readonly STEP_AFTERCAMERADRAW_EFFECTLAYER_DRAW = 3;\r\n public static readonly STEP_AFTERCAMERADRAW_LAYER = 4;\r\n public static readonly STEP_AFTERCAMERADRAW_FLUIDRENDERER = 5;\r\n\r\n public static readonly STEP_AFTERCAMERAPOSTPROCESS_LAYER = 0;\r\n\r\n public static readonly STEP_AFTERRENDERTARGETPOSTPROCESS_LAYER = 0;\r\n\r\n public static readonly STEP_AFTERRENDER_AUDIO = 0;\r\n\r\n public static readonly STEP_GATHERRENDERTARGETS_DEPTHRENDERER = 0;\r\n public static readonly STEP_GATHERRENDERTARGETS_GEOMETRYBUFFERRENDERER = 1;\r\n public static readonly STEP_GATHERRENDERTARGETS_SHADOWGENERATOR = 2;\r\n public static readonly STEP_GATHERRENDERTARGETS_POSTPROCESSRENDERPIPELINEMANAGER = 3;\r\n\r\n public static readonly STEP_GATHERACTIVECAMERARENDERTARGETS_DEPTHRENDERER = 0;\r\n public static readonly STEP_GATHERACTIVECAMERARENDERTARGETS_FLUIDRENDERER = 1;\r\n\r\n public static readonly STEP_POINTERMOVE_SPRITE = 0;\r\n public static readonly STEP_POINTERDOWN_SPRITE = 0;\r\n public static readonly STEP_POINTERUP_SPRITE = 0;\r\n}\r\n\r\n/**\r\n * This represents a scene component.\r\n *\r\n * This is used to decouple the dependency the scene is having on the different workloads like\r\n * layers, post processes...\r\n */\r\nexport interface ISceneComponent {\r\n /**\r\n * The name of the component. Each component must have a unique name.\r\n */\r\n name: string;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n scene: Scene;\r\n\r\n /**\r\n * Register the component to one instance of a scene.\r\n */\r\n register(): void;\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n rebuild(): void;\r\n\r\n /**\r\n * Disposes the component and the associated ressources.\r\n */\r\n dispose(): void;\r\n}\r\n\r\n/**\r\n * This represents a SERIALIZABLE scene component.\r\n *\r\n * This extends Scene Component to add Serialization methods on top.\r\n */\r\nexport interface ISceneSerializableComponent extends ISceneComponent {\r\n /**\r\n * Adds all the elements from the container to the scene\r\n * @param container the container holding the elements\r\n */\r\n addFromContainer(container: AbstractScene): void;\r\n\r\n /**\r\n * Removes all the elements in the container from the scene\r\n * @param container contains the elements to remove\r\n * @param dispose if the removed element should be disposed (default: false)\r\n */\r\n removeFromContainer(container: AbstractScene, dispose?: boolean): void;\r\n\r\n /**\r\n * Serializes the component data to the specified json object\r\n * @param serializationObject The object to serialize to\r\n */\r\n serialize(serializationObject: any): void;\r\n}\r\n\r\n/**\r\n * Strong typing of a Mesh related stage step action\r\n */\r\nexport type MeshStageAction = (mesh: AbstractMesh, hardwareInstancedRendering: boolean) => boolean;\r\n\r\n/**\r\n * Strong typing of a Evaluate Sub Mesh related stage step action\r\n */\r\nexport type EvaluateSubMeshStageAction = (mesh: AbstractMesh, subMesh: SubMesh) => void;\r\n\r\n/**\r\n * Strong typing of a pre active Mesh related stage step action\r\n */\r\nexport type PreActiveMeshStageAction = (mesh: AbstractMesh) => void;\r\n\r\n/**\r\n * Strong typing of a Camera related stage step action\r\n */\r\nexport type CameraStageAction = (camera: Camera) => void;\r\n\r\n/**\r\n * Strong typing of a Camera Frame buffer related stage step action\r\n */\r\nexport type CameraStageFrameBufferAction = (camera: Camera) => boolean;\r\n\r\n/**\r\n * Strong typing of a Render Target related stage step action\r\n */\r\nexport type RenderTargetStageAction = (renderTarget: RenderTargetTexture, faceIndex?: number, layer?: number) => void;\r\n\r\n/**\r\n * Strong typing of a RenderingGroup related stage step action\r\n */\r\nexport type RenderingGroupStageAction = (renderingGroupId: number) => void;\r\n\r\n/**\r\n * Strong typing of a Mesh Render related stage step action\r\n */\r\nexport type RenderingMeshStageAction = (mesh: Mesh, subMesh: SubMesh, batch: any, effect: Nullable) => void;\r\n\r\n/**\r\n * Strong typing of a simple stage step action\r\n */\r\nexport type SimpleStageAction = () => void;\r\n\r\n/**\r\n * Strong typing of a render target action.\r\n */\r\nexport type RenderTargetsStageAction = (renderTargets: SmartArrayNoDuplicate) => void;\r\n\r\n/**\r\n * Strong typing of a pointer move action.\r\n */\r\nexport type PointerMoveStageAction = (\r\n unTranslatedPointerX: number,\r\n unTranslatedPointerY: number,\r\n pickResult: Nullable,\r\n isMeshPicked: boolean,\r\n element: Nullable\r\n) => Nullable;\r\n\r\n/**\r\n * Strong typing of a pointer up/down action.\r\n */\r\nexport type PointerUpDownStageAction = (\r\n unTranslatedPointerX: number,\r\n unTranslatedPointerY: number,\r\n pickResult: Nullable,\r\n evt: IPointerEvent,\r\n doubleClick: boolean\r\n) => Nullable;\r\n\r\n/**\r\n * Representation of a stage in the scene (Basically a list of ordered steps)\r\n * @internal\r\n */\r\nexport class Stage extends Array<{ index: number; component: ISceneComponent; action: T }> {\r\n /**\r\n * Hide ctor from the rest of the world.\r\n * @param items The items to add.\r\n */\r\n private constructor(items?: { index: number; component: ISceneComponent; action: T }[]) {\r\n super(...(items));\r\n }\r\n\r\n /**\r\n * Creates a new Stage.\r\n * @returns A new instance of a Stage\r\n */\r\n static Create(): Stage {\r\n return Object.create(Stage.prototype);\r\n }\r\n\r\n /**\r\n * Registers a step in an ordered way in the targeted stage.\r\n * @param index Defines the position to register the step in\r\n * @param component Defines the component attached to the step\r\n * @param action Defines the action to launch during the step\r\n */\r\n public registerStep(index: number, component: ISceneComponent, action: T): void {\r\n let i = 0;\r\n let maxIndex = Number.MAX_VALUE;\r\n for (; i < this.length; i++) {\r\n const step = this[i];\r\n maxIndex = step.index;\r\n if (index < maxIndex) {\r\n break;\r\n }\r\n }\r\n this.splice(i, 0, { index, component, action: action.bind(component) });\r\n }\r\n\r\n /**\r\n * Clears all the steps from the stage.\r\n */\r\n public clear(): void {\r\n this.length = 0;\r\n }\r\n}\r\n", "import type { IDisposable } from \"../scene\";\r\nimport type { IActionEvent } from \"./actionEvent\";\r\nimport type { IAction } from \"./action\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Nullable } from \"../types\";\r\n\r\n/**\r\n * Abstract class used to decouple action Manager from scene and meshes.\r\n * Do not instantiate.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions\r\n */\r\nexport abstract class AbstractActionManager implements IDisposable {\r\n /** Gets the list of active triggers */\r\n public static Triggers: { [key: string]: number } = {};\r\n\r\n /** Gets the cursor to use when hovering items */\r\n public hoverCursor: string = \"\";\r\n\r\n /** Gets the list of actions */\r\n public actions: IAction[] = [];\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the manager is recursive meaning that it can trigger action from children\r\n */\r\n public isRecursive = false;\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public abstract dispose(): void;\r\n\r\n /**\r\n * Does this action manager has pointer triggers\r\n */\r\n public abstract get hasPointerTriggers(): boolean;\r\n\r\n /**\r\n * Does this action manager has pick triggers\r\n */\r\n public abstract get hasPickTriggers(): boolean;\r\n\r\n /**\r\n * Process a specific trigger\r\n * @param trigger defines the trigger to process\r\n * @param evt defines the event details to be processed\r\n */\r\n public abstract processTrigger(trigger: number, evt?: IActionEvent): void;\r\n\r\n /**\r\n * Does this action manager handles actions of any of the given triggers\r\n * @param triggers defines the triggers to be tested\r\n * @returns a boolean indicating whether one (or more) of the triggers is handled\r\n */\r\n public abstract hasSpecificTriggers(triggers: number[]): boolean;\r\n\r\n /**\r\n * Does this action manager handles actions of any of the given triggers. This function takes two arguments for\r\n * speed.\r\n * @param triggerA defines the trigger to be tested\r\n * @param triggerB defines the trigger to be tested\r\n * @returns a boolean indicating whether one (or more) of the triggers is handled\r\n */\r\n public abstract hasSpecificTriggers2(triggerA: number, triggerB: number): boolean;\r\n\r\n /**\r\n * Does this action manager handles actions of a given trigger\r\n * @param trigger defines the trigger to be tested\r\n * @param parameterPredicate defines an optional predicate to filter triggers by parameter\r\n * @returns whether the trigger is handled\r\n */\r\n public abstract hasSpecificTrigger(trigger: number, parameterPredicate?: (parameter: any) => boolean): boolean;\r\n\r\n /**\r\n * Serialize this manager to a JSON object\r\n * @param name defines the property name to store this manager\r\n * @returns a JSON representation of this manager\r\n */\r\n public abstract serialize(name: string): any;\r\n\r\n /**\r\n * Registers an action to this action manager\r\n * @param action defines the action to be registered\r\n * @returns the action amended (prepared) after registration\r\n */\r\n public abstract registerAction(action: IAction): Nullable;\r\n\r\n /**\r\n * Unregisters an action to this action manager\r\n * @param action defines the action to be unregistered\r\n * @returns a boolean indicating whether the action has been unregistered\r\n */\r\n public abstract unregisterAction(action: IAction): Boolean;\r\n\r\n /**\r\n * Does exist one action manager with at least one trigger\r\n **/\r\n public static get HasTriggers(): boolean {\r\n for (const t in AbstractActionManager.Triggers) {\r\n if (Object.prototype.hasOwnProperty.call(AbstractActionManager.Triggers, t)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Does exist one action manager with at least one pick trigger\r\n **/\r\n public static get HasPickTriggers(): boolean {\r\n for (const t in AbstractActionManager.Triggers) {\r\n if (Object.prototype.hasOwnProperty.call(AbstractActionManager.Triggers, t)) {\r\n const tAsInt = parseInt(t);\r\n if (tAsInt >= Constants.ACTION_OnPickTrigger && tAsInt <= Constants.ACTION_OnPickUpTrigger) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Does exist one action manager that handles actions of a given trigger\r\n * @param trigger defines the trigger to be tested\r\n * @returns a boolean indicating whether the trigger is handled by at least one action manager\r\n **/\r\n public static HasSpecificTrigger(trigger: number): boolean {\r\n for (const t in AbstractActionManager.Triggers) {\r\n if (Object.prototype.hasOwnProperty.call(AbstractActionManager.Triggers, t)) {\r\n const tAsInt = parseInt(t);\r\n if (tAsInt === trigger) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n", "import type { IKeyboardEvent } from \"./deviceInputEvents\";\r\n\r\n/**\r\n * Gather the list of keyboard event types as constants.\r\n */\r\nexport class KeyboardEventTypes {\r\n /**\r\n * The keydown event is fired when a key becomes active (pressed).\r\n */\r\n public static readonly KEYDOWN = 0x01;\r\n /**\r\n * The keyup event is fired when a key has been released.\r\n */\r\n public static readonly KEYUP = 0x02;\r\n}\r\n\r\n/**\r\n * This class is used to store keyboard related info for the onKeyboardObservable event.\r\n */\r\nexport class KeyboardInfo {\r\n /**\r\n * Instantiates a new keyboard info.\r\n * This class is used to store keyboard related info for the onKeyboardObservable event.\r\n * @param type Defines the type of event (KeyboardEventTypes)\r\n * @param event Defines the related dom event\r\n */\r\n constructor(\r\n /**\r\n * Defines the type of event (KeyboardEventTypes)\r\n */\r\n public type: number,\r\n /**\r\n * Defines the related dom event\r\n */\r\n public event: IKeyboardEvent\r\n ) {}\r\n}\r\n\r\n/**\r\n * This class is used to store keyboard related info for the onPreKeyboardObservable event.\r\n * Set the skipOnKeyboardObservable property to true if you want the engine to stop any process after this event is triggered, even not calling onKeyboardObservable\r\n */\r\nexport class KeyboardInfoPre extends KeyboardInfo {\r\n /**\r\n * Defines whether the engine should skip the next onKeyboardObservable associated to this pre.\r\n */\r\n public skipOnKeyboardObservable: boolean;\r\n\r\n /**\r\n * Defines whether the engine should skip the next onKeyboardObservable associated to this pre.\r\n * @deprecated use skipOnKeyboardObservable property instead\r\n */\r\n public get skipOnPointerObservable() {\r\n return this.skipOnKeyboardObservable;\r\n }\r\n public set skipOnPointerObservable(value) {\r\n this.skipOnKeyboardObservable = value;\r\n }\r\n\r\n /**\r\n * Instantiates a new keyboard pre info.\r\n * This class is used to store keyboard related info for the onPreKeyboardObservable event.\r\n * @param type Defines the type of event (KeyboardEventTypes)\r\n * @param event Defines the related dom event\r\n */\r\n constructor(\r\n /**\r\n * Defines the type of event (KeyboardEventTypes)\r\n */\r\n public type: number,\r\n /**\r\n * Defines the related dom event\r\n */\r\n public event: IKeyboardEvent\r\n ) {\r\n super(type, event);\r\n this.skipOnKeyboardObservable = false;\r\n }\r\n}\r\n", "/**\r\n * Enum for Device Types\r\n */\r\nexport enum DeviceType {\r\n /** Generic */\r\n Generic = 0,\r\n /** Keyboard */\r\n Keyboard = 1,\r\n /** Mouse */\r\n Mouse = 2,\r\n /** Touch Pointers */\r\n Touch = 3,\r\n /** PS4 Dual Shock */\r\n DualShock = 4,\r\n /** Xbox */\r\n Xbox = 5,\r\n /** Switch Controller */\r\n Switch = 6,\r\n /** PS5 DualSense */\r\n DualSense = 7,\r\n}\r\n\r\n// Device Enums\r\n/**\r\n * Enum for All Pointers (Touch/Mouse)\r\n */\r\nexport enum PointerInput {\r\n /** Horizontal Axis (Not used in events/observables; only in polling) */\r\n Horizontal = 0,\r\n /** Vertical Axis (Not used in events/observables; only in polling) */\r\n Vertical = 1,\r\n /** Left Click or Touch */\r\n LeftClick = 2,\r\n /** Middle Click */\r\n MiddleClick = 3,\r\n /** Right Click */\r\n RightClick = 4,\r\n /** Browser Back */\r\n BrowserBack = 5,\r\n /** Browser Forward */\r\n BrowserForward = 6,\r\n /** Mouse Wheel X */\r\n MouseWheelX = 7,\r\n /** Mouse Wheel Y */\r\n MouseWheelY = 8,\r\n /** Mouse Wheel Z */\r\n MouseWheelZ = 9,\r\n /** Used in events/observables to identify if x/y changes occurred */\r\n Move = 12,\r\n}\r\n\r\n/** @internal */\r\nexport enum NativePointerInput {\r\n /** Horizontal Axis */\r\n Horizontal = PointerInput.Horizontal,\r\n /** Vertical Axis */\r\n Vertical = 1,\r\n /** Left Click or Touch */\r\n LeftClick = 2,\r\n /** Middle Click */\r\n MiddleClick = 3,\r\n /** Right Click */\r\n RightClick = 4,\r\n /** Browser Back */\r\n BrowserBack = 5,\r\n /** Browser Forward */\r\n BrowserForward = 6,\r\n /** Mouse Wheel X */\r\n MouseWheelX = 7,\r\n /** Mouse Wheel Y */\r\n MouseWheelY = 8,\r\n /** Mouse Wheel Z */\r\n MouseWheelZ = 9,\r\n /** Delta X */\r\n DeltaHorizontal = 10,\r\n /** Delta Y */\r\n DeltaVertical = 11,\r\n}\r\n\r\n/**\r\n * Enum for Dual Shock Gamepad\r\n */\r\nexport enum DualShockInput {\r\n /** Cross */\r\n Cross = 0,\r\n /** Circle */\r\n Circle = 1,\r\n /** Square */\r\n Square = 2,\r\n /** Triangle */\r\n Triangle = 3,\r\n /** L1 */\r\n L1 = 4,\r\n /** R1 */\r\n R1 = 5,\r\n /** L2 */\r\n L2 = 6,\r\n /** R2 */\r\n R2 = 7,\r\n /** Share */\r\n Share = 8,\r\n /** Options */\r\n Options = 9,\r\n /** L3 */\r\n L3 = 10,\r\n /** R3 */\r\n R3 = 11,\r\n /** DPadUp */\r\n DPadUp = 12,\r\n /** DPadDown */\r\n DPadDown = 13,\r\n /** DPadLeft */\r\n DPadLeft = 14,\r\n /** DRight */\r\n DPadRight = 15,\r\n /** Home */\r\n Home = 16,\r\n /** TouchPad */\r\n TouchPad = 17,\r\n /** LStickXAxis */\r\n LStickXAxis = 18,\r\n /** LStickYAxis */\r\n LStickYAxis = 19,\r\n /** RStickXAxis */\r\n RStickXAxis = 20,\r\n /** RStickYAxis */\r\n RStickYAxis = 21,\r\n}\r\n\r\n/**\r\n * Enum for Dual Sense Gamepad\r\n */\r\nexport enum DualSenseInput {\r\n /** Cross */\r\n Cross = 0,\r\n /** Circle */\r\n Circle = 1,\r\n /** Square */\r\n Square = 2,\r\n /** Triangle */\r\n Triangle = 3,\r\n /** L1 */\r\n L1 = 4,\r\n /** R1 */\r\n R1 = 5,\r\n /** L2 */\r\n L2 = 6,\r\n /** R2 */\r\n R2 = 7,\r\n /** Create */\r\n Create = 8,\r\n /** Options */\r\n Options = 9,\r\n /** L3 */\r\n L3 = 10,\r\n /** R3 */\r\n R3 = 11,\r\n /** DPadUp */\r\n DPadUp = 12,\r\n /** DPadDown */\r\n DPadDown = 13,\r\n /** DPadLeft */\r\n DPadLeft = 14,\r\n /** DRight */\r\n DPadRight = 15,\r\n /** Home */\r\n Home = 16,\r\n /** TouchPad */\r\n TouchPad = 17,\r\n /** LStickXAxis */\r\n LStickXAxis = 18,\r\n /** LStickYAxis */\r\n LStickYAxis = 19,\r\n /** RStickXAxis */\r\n RStickXAxis = 20,\r\n /** RStickYAxis */\r\n RStickYAxis = 21,\r\n}\r\n\r\n/**\r\n * Enum for Xbox Gamepad\r\n */\r\nexport enum XboxInput {\r\n /** A */\r\n A = 0,\r\n /** B */\r\n B = 1,\r\n /** X */\r\n X = 2,\r\n /** Y */\r\n Y = 3,\r\n /** LB */\r\n LB = 4,\r\n /** RB */\r\n RB = 5,\r\n /** LT */\r\n LT = 6,\r\n /** RT */\r\n RT = 7,\r\n /** Back */\r\n Back = 8,\r\n /** Start */\r\n Start = 9,\r\n /** LS */\r\n LS = 10,\r\n /** RS */\r\n RS = 11,\r\n /** DPadUp */\r\n DPadUp = 12,\r\n /** DPadDown */\r\n DPadDown = 13,\r\n /** DPadLeft */\r\n DPadLeft = 14,\r\n /** DRight */\r\n DPadRight = 15,\r\n /** Home */\r\n Home = 16,\r\n /** LStickXAxis */\r\n LStickXAxis = 17,\r\n /** LStickYAxis */\r\n LStickYAxis = 18,\r\n /** RStickXAxis */\r\n RStickXAxis = 19,\r\n /** RStickYAxis */\r\n RStickYAxis = 20,\r\n}\r\n\r\n/**\r\n * Enum for Switch (Pro/JoyCon L+R) Gamepad\r\n */\r\nexport enum SwitchInput {\r\n /** B */\r\n B = 0,\r\n /** A */\r\n A = 1,\r\n /** Y */\r\n Y = 2,\r\n /** X */\r\n X = 3,\r\n /** L */\r\n L = 4,\r\n /** R */\r\n R = 5,\r\n /** ZL */\r\n ZL = 6,\r\n /** ZR */\r\n ZR = 7,\r\n /** Minus */\r\n Minus = 8,\r\n /** Plus */\r\n Plus = 9,\r\n /** LS */\r\n LS = 10,\r\n /** RS */\r\n RS = 11,\r\n /** DPadUp */\r\n DPadUp = 12,\r\n /** DPadDown */\r\n DPadDown = 13,\r\n /** DPadLeft */\r\n DPadLeft = 14,\r\n /** DRight */\r\n DPadRight = 15,\r\n /** Home */\r\n Home = 16,\r\n /** Capture */\r\n Capture = 17,\r\n /** LStickXAxis */\r\n LStickXAxis = 18,\r\n /** LStickYAxis */\r\n LStickYAxis = 19,\r\n /** RStickXAxis */\r\n RStickXAxis = 20,\r\n /** RStickYAxis */\r\n RStickYAxis = 21,\r\n}\r\n", "import type { PointerInput } from \"../DeviceInput/InputDevices/deviceEnums\";\r\n\r\n/**\r\n * Event Types\r\n */\r\nexport enum DeviceInputEventType {\r\n // Pointers\r\n /** PointerMove */\r\n PointerMove,\r\n /** PointerDown */\r\n PointerDown,\r\n /** PointerUp */\r\n PointerUp,\r\n}\r\n\r\n/**\r\n * Native friendly interface for Event Object\r\n */\r\nexport interface IUIEvent {\r\n /**\r\n * Input array index\r\n */\r\n inputIndex: number;\r\n\r\n /**\r\n * Current target for an event\r\n */\r\n currentTarget?: any;\r\n\r\n /**\r\n * Alias for target\r\n * @deprecated Use target instead\r\n */\r\n srcElement?: any;\r\n\r\n /**\r\n * Type of event\r\n */\r\n type: string;\r\n\r\n /**\r\n * Reference to object where object was dispatched\r\n */\r\n target: any;\r\n\r\n /**\r\n * Tells user agent what to do when not explicitly handled\r\n */\r\n preventDefault: () => void;\r\n}\r\n\r\n/**\r\n * Native friendly interface for KeyboardEvent Object\r\n */\r\nexport interface IKeyboardEvent extends IUIEvent {\r\n /**\r\n * Status of Alt key being pressed\r\n */\r\n altKey: boolean;\r\n\r\n /**\r\n * Unicode value of character pressed\r\n * @deprecated Required for event, use keyCode instead.\r\n */\r\n charCode?: number;\r\n\r\n /**\r\n * Code for key based on layout\r\n */\r\n code: string;\r\n\r\n /**\r\n * Status of Ctrl key being pressed\r\n */\r\n ctrlKey: boolean;\r\n\r\n /**\r\n * String representation of key\r\n */\r\n key: string;\r\n /**\r\n * ASCII value of key\r\n * @deprecated Used with DeviceSourceManager\r\n */\r\n keyCode: number;\r\n\r\n /**\r\n * Status of Meta key (eg. Windows key) being pressed\r\n */\r\n metaKey: boolean;\r\n\r\n /**\r\n * Status of Shift key being pressed\r\n */\r\n shiftKey: boolean;\r\n}\r\n\r\n/**\r\n * Native friendly interface for MouseEvent Object\r\n */\r\nexport interface IMouseEvent extends IUIEvent {\r\n /**\r\n * Subset of possible PointerInput values for events, excluding ones that CANNOT be in events organically\r\n */\r\n inputIndex: Exclude;\r\n\r\n /**\r\n * Status of Alt key being pressed\r\n */\r\n altKey: boolean;\r\n\r\n /**\r\n * Value of single mouse button pressed\r\n */\r\n button: number;\r\n\r\n /**\r\n * Value of all mouse buttons pressed\r\n */\r\n buttons: number;\r\n\r\n /**\r\n * Current X coordinate\r\n */\r\n clientX: number;\r\n\r\n /**\r\n * Current Y coordinate\r\n */\r\n clientY: number;\r\n\r\n /**\r\n * Status of Ctrl key being pressed\r\n */\r\n ctrlKey: boolean;\r\n\r\n /**\r\n * Provides current click count\r\n */\r\n detail?: number;\r\n\r\n /**\r\n * Status of Meta key (eg. Windows key) being pressed\r\n */\r\n metaKey: boolean;\r\n\r\n /**\r\n * Delta of movement on X axis\r\n */\r\n movementX: number;\r\n\r\n /**\r\n * Delta of movement on Y axis\r\n */\r\n movementY: number;\r\n\r\n /**\r\n * Delta of movement on X axis\r\n * @deprecated Use 'movementX' instead\r\n */\r\n mozMovementX?: number;\r\n\r\n /**\r\n * Delta of movement on Y axis\r\n * @deprecated Use 'movementY' instead\r\n */\r\n mozMovementY?: number;\r\n\r\n /**\r\n * Delta of movement on X axis\r\n * @deprecated Use 'movementX' instead\r\n */\r\n msMovementX?: number;\r\n\r\n /**\r\n * Delta of movement on Y axis\r\n * @deprecated Use 'movementY' instead\r\n */\r\n msMovementY?: number;\r\n\r\n /**\r\n * Current coordinate of X within container\r\n */\r\n offsetX: number;\r\n\r\n /**\r\n * Current coordinate of Y within container\r\n */\r\n offsetY: number;\r\n\r\n /**\r\n * Horizontal coordinate of event\r\n */\r\n pageX: number;\r\n\r\n /**\r\n * Vertical coordinate of event\r\n */\r\n pageY: number;\r\n\r\n /**\r\n * Status of Shift key being pressed\r\n */\r\n shiftKey: boolean;\r\n\r\n /**\r\n * Delta of movement on X axis\r\n * @deprecated Use 'movementX' instead\r\n */\r\n webkitMovementX?: number;\r\n\r\n /**\r\n * Delta of movement on Y axis\r\n * @deprecated Use 'movementY' instead\r\n */\r\n webkitMovementY?: number;\r\n\r\n /**\r\n * Alias of clientX\r\n */\r\n x: number;\r\n\r\n /**\r\n * Alias of clientY\r\n */\r\n y: number;\r\n}\r\n\r\n/**\r\n * Native friendly interface for PointerEvent Object\r\n */\r\nexport interface IPointerEvent extends IMouseEvent {\r\n /**\r\n * Subset of possible PointerInput values for events, excluding ones that CANNOT be in events organically and mouse wheel values\r\n */\r\n inputIndex: Exclude;\r\n\r\n /**\r\n * Pointer Event ID\r\n */\r\n pointerId: number;\r\n\r\n /**\r\n * Type of pointer\r\n */\r\n pointerType: string;\r\n}\r\n\r\n/**\r\n * Native friendly interface for WheelEvent Object\r\n */\r\nexport interface IWheelEvent extends IMouseEvent {\r\n /**\r\n * Subset of possible PointerInput values for events that can only be used with mouse wheel\r\n */\r\n inputIndex: PointerInput.MouseWheelX | PointerInput.MouseWheelY | PointerInput.MouseWheelZ;\r\n\r\n /**\r\n * Units for delta value\r\n */\r\n deltaMode: number;\r\n\r\n /**\r\n * Horizontal scroll delta\r\n */\r\n deltaX: number;\r\n\r\n /**\r\n * Vertical scroll delta\r\n */\r\n deltaY: number;\r\n\r\n /**\r\n * Z-Axis scroll delta\r\n */\r\n deltaZ: number;\r\n\r\n /**\r\n * WheelDelta (From MouseWheel Event)\r\n * @deprecated\r\n */\r\n wheelDelta?: number;\r\n}\r\n\r\n/**\r\n * Constants used for Events\r\n */\r\nexport class EventConstants {\r\n /**\r\n * Pixel delta for Wheel Events (Default)\r\n */\r\n public static DOM_DELTA_PIXEL = 0x00;\r\n\r\n /**\r\n * Line delta for Wheel Events\r\n */\r\n public static DOM_DELTA_LINE = 0x01;\r\n\r\n /**\r\n * Page delta for Wheel Events\r\n */\r\n public static DOM_DELTA_PAGE = 0x02;\r\n}\r\n", "import type { DeviceType } from \"./deviceEnums\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { DeviceInput } from \"./deviceTypes\";\r\nimport type { IDeviceInputSystem } from \"../inputInterfaces\";\r\nimport type { IKeyboardEvent, IPointerEvent, IWheelEvent } from \"../../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Subset of DeviceInput that only handles pointers and keyboard\r\n */\r\nexport type DeviceSourceEvent = T extends DeviceType.Keyboard\r\n ? IKeyboardEvent\r\n : T extends DeviceType.Mouse\r\n ? IWheelEvent | IPointerEvent\r\n : T extends DeviceType.Touch\r\n ? IPointerEvent\r\n : never;\r\n\r\n/**\r\n * Class that handles all input for a specific device\r\n */\r\nexport class DeviceSource {\r\n // Public Members\r\n /**\r\n * Observable to handle device input changes per device\r\n */\r\n public readonly onInputChangedObservable = new Observable>();\r\n\r\n // Private Members\r\n private readonly _deviceInputSystem: IDeviceInputSystem;\r\n\r\n /**\r\n * Default Constructor\r\n * @param deviceInputSystem - Reference to DeviceInputSystem\r\n * @param deviceType - Type of device\r\n * @param deviceSlot - \"Slot\" or index that device is referenced in\r\n */\r\n constructor(\r\n deviceInputSystem: IDeviceInputSystem,\r\n /** Type of device */\r\n public readonly deviceType: T,\r\n /** \"Slot\" or index that device is referenced in */\r\n public readonly deviceSlot: number = 0\r\n ) {\r\n this._deviceInputSystem = deviceInputSystem;\r\n }\r\n\r\n /**\r\n * Get input for specific input\r\n * @param inputIndex - index of specific input on device\r\n * @returns Input value from DeviceInputSystem\r\n */\r\n public getInput(inputIndex: DeviceInput): number {\r\n return this._deviceInputSystem.pollInput(this.deviceType, this.deviceSlot, inputIndex);\r\n }\r\n}\r\n", "import { Constants } from \"../Engines/constants\";\r\nimport type { IUIEvent } from \"../Events/deviceInputEvents\";\r\nimport { EventConstants } from \"../Events/deviceInputEvents\";\r\nimport type { Nullable } from \"../types\";\r\nimport { DeviceType, NativePointerInput, PointerInput } from \"./InputDevices/deviceEnums\";\r\nimport type { IDeviceInputSystem } from \"./inputInterfaces\";\r\n\r\n/**\r\n * Class to wrap DeviceInputSystem data into an event object\r\n */\r\nexport class DeviceEventFactory {\r\n /**\r\n * Create device input events based on provided type and slot\r\n *\r\n * @param deviceType Type of device\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @param currentState Current value for given input\r\n * @param deviceInputSystem Reference to DeviceInputSystem\r\n * @param elementToAttachTo HTMLElement to reference as target for inputs\r\n * @param pointerId PointerId to use for pointer events\r\n * @returns IUIEvent object\r\n */\r\n public static CreateDeviceEvent(\r\n deviceType: DeviceType,\r\n deviceSlot: number,\r\n inputIndex: number,\r\n currentState: Nullable,\r\n deviceInputSystem: IDeviceInputSystem,\r\n elementToAttachTo?: any,\r\n pointerId?: number\r\n ): IUIEvent {\r\n switch (deviceType) {\r\n case DeviceType.Keyboard:\r\n return this._CreateKeyboardEvent(inputIndex, currentState, deviceInputSystem, elementToAttachTo);\r\n case DeviceType.Mouse:\r\n if (inputIndex === PointerInput.MouseWheelX || inputIndex === PointerInput.MouseWheelY || inputIndex === PointerInput.MouseWheelZ) {\r\n return this._CreateWheelEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo);\r\n }\r\n // eslint-disable-next-line no-fallthrough\r\n case DeviceType.Touch:\r\n return this._CreatePointerEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo, pointerId);\r\n default:\r\n // eslint-disable-next-line no-throw-literal\r\n throw `Unable to generate event for device ${DeviceType[deviceType]}`;\r\n }\r\n }\r\n\r\n /**\r\n * Creates pointer event\r\n *\r\n * @param deviceType Type of device\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @param currentState Current value for given input\r\n * @param deviceInputSystem Reference to DeviceInputSystem\r\n * @param elementToAttachTo HTMLElement to reference as target for inputs\r\n * @param pointerId PointerId to use for pointer events\r\n * @returns IUIEvent object (Pointer)\r\n */\r\n private static _CreatePointerEvent(\r\n deviceType: DeviceType,\r\n deviceSlot: number,\r\n inputIndex: number,\r\n currentState: Nullable,\r\n deviceInputSystem: IDeviceInputSystem,\r\n elementToAttachTo?: any,\r\n pointerId?: number\r\n ): any {\r\n const evt = this._CreateMouseEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo);\r\n\r\n if (deviceType === DeviceType.Mouse) {\r\n evt.deviceType = DeviceType.Mouse;\r\n evt.pointerId = 1;\r\n evt.pointerType = \"mouse\";\r\n } else {\r\n evt.deviceType = DeviceType.Touch;\r\n evt.pointerId = pointerId ?? deviceSlot;\r\n evt.pointerType = \"touch\";\r\n }\r\n\r\n let buttons = 0;\r\n\r\n // Populate buttons property with current state of all mouse buttons\r\n // Uses values found on: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\r\n buttons += deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.LeftClick);\r\n buttons += deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.RightClick) * 2;\r\n buttons += deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.MiddleClick) * 4;\r\n evt.buttons = buttons;\r\n\r\n if (inputIndex === PointerInput.Move) {\r\n evt.type = \"pointermove\";\r\n } else if (inputIndex >= PointerInput.LeftClick && inputIndex <= PointerInput.RightClick) {\r\n evt.type = currentState === 1 ? \"pointerdown\" : \"pointerup\";\r\n evt.button = inputIndex - 2;\r\n }\r\n\r\n return evt;\r\n }\r\n\r\n /**\r\n * Create Mouse Wheel Event\r\n * @param deviceType Type of device\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @param currentState Current value for given input\r\n * @param deviceInputSystem Reference to DeviceInputSystem\r\n * @param elementToAttachTo HTMLElement to reference as target for inputs\r\n * @returns IUIEvent object (Wheel)\r\n */\r\n private static _CreateWheelEvent(\r\n deviceType: DeviceType,\r\n deviceSlot: number,\r\n inputIndex: number,\r\n currentState: Nullable,\r\n deviceInputSystem: IDeviceInputSystem,\r\n elementToAttachTo: any\r\n ): any {\r\n const evt = this._CreateMouseEvent(deviceType, deviceSlot, inputIndex, currentState, deviceInputSystem, elementToAttachTo);\r\n\r\n // While WheelEvents don't generally have a pointerId, we used to add one in the InputManager\r\n // This line has been added to make the InputManager more platform-agnostic\r\n // Similar code exists in the WebDeviceInputSystem to handle browser created events\r\n evt.pointerId = 1;\r\n evt.type = \"wheel\";\r\n evt.deltaMode = EventConstants.DOM_DELTA_PIXEL;\r\n evt.deltaX = 0;\r\n evt.deltaY = 0;\r\n evt.deltaZ = 0;\r\n\r\n switch (inputIndex) {\r\n case PointerInput.MouseWheelX:\r\n evt.deltaX = currentState;\r\n break;\r\n case PointerInput.MouseWheelY:\r\n evt.deltaY = currentState;\r\n break;\r\n case PointerInput.MouseWheelZ:\r\n evt.deltaZ = currentState;\r\n break;\r\n }\r\n\r\n return evt;\r\n }\r\n\r\n /**\r\n * Create Mouse Event\r\n * @param deviceType Type of device\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @param currentState Current value for given input\r\n * @param deviceInputSystem Reference to DeviceInputSystem\r\n * @param elementToAttachTo HTMLElement to reference as target for inputs\r\n * @returns IUIEvent object (Mouse)\r\n */\r\n private static _CreateMouseEvent(\r\n deviceType: DeviceType,\r\n deviceSlot: number,\r\n inputIndex: number,\r\n currentState: Nullable,\r\n deviceInputSystem: IDeviceInputSystem,\r\n elementToAttachTo?: any\r\n ): any {\r\n const evt = this._CreateEvent(elementToAttachTo);\r\n const pointerX = deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.Horizontal);\r\n const pointerY = deviceInputSystem.pollInput(deviceType, deviceSlot, PointerInput.Vertical);\r\n\r\n // Handle offsets/deltas based on existence of HTMLElement\r\n if (elementToAttachTo) {\r\n evt.movementX = 0;\r\n evt.movementY = 0;\r\n evt.offsetX = evt.movementX - elementToAttachTo.getBoundingClientRect().x;\r\n evt.offsetY = evt.movementY - elementToAttachTo.getBoundingClientRect().y;\r\n } else {\r\n evt.movementX = deviceInputSystem.pollInput(deviceType, deviceSlot, NativePointerInput.DeltaHorizontal); // DeltaHorizontal\r\n evt.movementY = deviceInputSystem.pollInput(deviceType, deviceSlot, NativePointerInput.DeltaVertical); // DeltaVertical\r\n evt.offsetX = 0;\r\n evt.offsetY = 0;\r\n }\r\n this._CheckNonCharacterKeys(evt, deviceInputSystem);\r\n\r\n evt.clientX = pointerX;\r\n evt.clientY = pointerY;\r\n evt.x = pointerX;\r\n evt.y = pointerY;\r\n\r\n evt.deviceType = deviceType;\r\n evt.deviceSlot = deviceSlot;\r\n evt.inputIndex = inputIndex;\r\n\r\n return evt;\r\n }\r\n\r\n /**\r\n * Create Keyboard Event\r\n * @param inputIndex Id of input to be checked\r\n * @param currentState Current value for given input\r\n * @param deviceInputSystem Reference to DeviceInputSystem\r\n * @param elementToAttachTo HTMLElement to reference as target for inputs\r\n * @returns IEvent object (Keyboard)\r\n */\r\n private static _CreateKeyboardEvent(inputIndex: number, currentState: Nullable, deviceInputSystem: IDeviceInputSystem, elementToAttachTo?: any): any {\r\n const evt = this._CreateEvent(elementToAttachTo);\r\n this._CheckNonCharacterKeys(evt, deviceInputSystem);\r\n evt.deviceType = DeviceType.Keyboard;\r\n evt.deviceSlot = 0;\r\n evt.inputIndex = inputIndex;\r\n\r\n evt.type = currentState === 1 ? \"keydown\" : \"keyup\";\r\n evt.key = String.fromCharCode(inputIndex);\r\n evt.keyCode = inputIndex;\r\n\r\n return evt;\r\n }\r\n\r\n /**\r\n * Add parameters for non-character keys (Ctrl, Alt, Meta, Shift)\r\n * @param evt Event object to add parameters to\r\n * @param deviceInputSystem DeviceInputSystem to pull values from\r\n */\r\n private static _CheckNonCharacterKeys(evt: any, deviceInputSystem: IDeviceInputSystem): void {\r\n const isKeyboardActive = deviceInputSystem.isDeviceAvailable(DeviceType.Keyboard);\r\n const altKey = isKeyboardActive && deviceInputSystem.pollInput(DeviceType.Keyboard, 0, Constants.INPUT_ALT_KEY) === 1;\r\n const ctrlKey = isKeyboardActive && deviceInputSystem.pollInput(DeviceType.Keyboard, 0, Constants.INPUT_CTRL_KEY) === 1;\r\n const metaKey =\r\n isKeyboardActive &&\r\n (deviceInputSystem.pollInput(DeviceType.Keyboard, 0, Constants.INPUT_META_KEY1) === 1 ||\r\n deviceInputSystem.pollInput(DeviceType.Keyboard, 0, Constants.INPUT_META_KEY2) === 1 ||\r\n deviceInputSystem.pollInput(DeviceType.Keyboard, 0, Constants.INPUT_META_KEY3) === 1);\r\n const shiftKey = isKeyboardActive && deviceInputSystem.pollInput(DeviceType.Keyboard, 0, Constants.INPUT_SHIFT_KEY) === 1;\r\n\r\n evt.altKey = altKey;\r\n evt.ctrlKey = ctrlKey;\r\n evt.metaKey = metaKey;\r\n evt.shiftKey = shiftKey;\r\n }\r\n\r\n /**\r\n * Create base event object\r\n * @param elementToAttachTo Value to use as event target\r\n * @returns\r\n */\r\n private static _CreateEvent(elementToAttachTo: any): any {\r\n const evt: { [k: string]: any } = {};\r\n evt.preventDefault = () => {};\r\n evt.target = elementToAttachTo;\r\n\r\n return evt;\r\n }\r\n}\r\n", "import type { INative } from \"../Engines/Native/nativeInterfaces\";\r\nimport type { IUIEvent } from \"../Events/deviceInputEvents\";\r\nimport { DeviceEventFactory } from \"./eventFactory\";\r\nimport { DeviceType } from \"./InputDevices/deviceEnums\";\r\nimport type { IDeviceInputSystem } from \"./inputInterfaces\";\r\n\r\ndeclare const _native: INative;\r\n\r\n/** @internal */\r\nexport class NativeDeviceInputSystem implements IDeviceInputSystem {\r\n private readonly _nativeInput: IDeviceInputSystem;\r\n\r\n public constructor(\r\n onDeviceConnected: (deviceType: DeviceType, deviceSlot: number) => void,\r\n onDeviceDisconnected: (deviceType: DeviceType, deviceSlot: number) => void,\r\n onInputChanged: (deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent) => void\r\n ) {\r\n this._nativeInput = _native.DeviceInputSystem\r\n ? new _native.DeviceInputSystem(onDeviceConnected, onDeviceDisconnected, (deviceType, deviceSlot, inputIndex, currentState) => {\r\n const evt = DeviceEventFactory.CreateDeviceEvent(deviceType, deviceSlot, inputIndex, currentState, this);\r\n\r\n onInputChanged(deviceType, deviceSlot, evt);\r\n })\r\n : this._createDummyNativeInput();\r\n }\r\n\r\n // Public functions\r\n /**\r\n * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized.\r\n * @param deviceType Enum specifying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @returns Current value of input\r\n */\r\n public pollInput(deviceType: DeviceType, deviceSlot: number, inputIndex: number): number {\r\n return this._nativeInput.pollInput(deviceType, deviceSlot, inputIndex);\r\n }\r\n\r\n /**\r\n * Check for a specific device in the DeviceInputSystem\r\n * @param deviceType Type of device to check for\r\n * @returns bool with status of device's existence\r\n */\r\n public isDeviceAvailable(deviceType: DeviceType): boolean {\r\n //TODO: FIx native side first\r\n return deviceType === DeviceType.Mouse || deviceType === DeviceType.Touch;\r\n }\r\n\r\n /**\r\n * Dispose of all the observables\r\n */\r\n public dispose(): void {\r\n this._nativeInput.dispose();\r\n }\r\n\r\n /**\r\n * For versions of BabylonNative that don't have the NativeInput plugin initialized, create a dummy version\r\n * @returns Object with dummy functions\r\n */\r\n private _createDummyNativeInput() {\r\n const nativeInput = {\r\n pollInput: () => {\r\n return 0;\r\n },\r\n isDeviceAvailable: () => {\r\n return false;\r\n },\r\n dispose: () => {},\r\n };\r\n\r\n return nativeInput;\r\n }\r\n}\r\n", "import type { Engine } from \"../Engines/engine\";\r\nimport type { IPointerEvent, IUIEvent } from \"../Events/deviceInputEvents\";\r\nimport { IsNavigatorAvailable } from \"../Misc/domManagement\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport type { Nullable } from \"../types\";\r\nimport { DeviceEventFactory } from \"./eventFactory\";\r\nimport { DeviceType, PointerInput } from \"./InputDevices/deviceEnums\";\r\nimport type { IDeviceInputSystem } from \"./inputInterfaces\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst MAX_KEYCODES = 255;\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst MAX_POINTER_INPUTS = Object.keys(PointerInput).length / 2;\r\n\r\n/** @internal */\r\nexport class WebDeviceInputSystem implements IDeviceInputSystem {\r\n // Private Members\r\n private _inputs: Array<{ [deviceSlot: number]: Array }> = [];\r\n private _gamepads: Array;\r\n private _keyboardActive: boolean = false;\r\n private _pointerActive: boolean = false;\r\n private _elementToAttachTo: HTMLElement;\r\n private _metaKeys: Array;\r\n private readonly _engine: Engine;\r\n private readonly _usingSafari: boolean = Tools.IsSafari();\r\n // Found solution for determining if MacOS is being used here:\r\n // https://stackoverflow.com/questions/10527983/best-way-to-detect-mac-os-x-or-windows-computers-with-javascript-or-jquery\r\n private readonly _usingMacOS: boolean = IsNavigatorAvailable() && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);\r\n\r\n private _onDeviceConnected: (deviceType: DeviceType, deviceSlot: number) => void;\r\n private _onDeviceDisconnected: (deviceType: DeviceType, deviceSlot: number) => void;\r\n private _onInputChanged: (deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent) => void;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _keyboardDownEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _keyboardUpEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _keyboardBlurEvent = (evt: any) => {};\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerMoveEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerDownEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerUpEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerCancelEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerWheelEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerBlurEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _pointerMacOSChromeOutEvent = (evt: any) => {};\r\n private _wheelEventName: string;\r\n private _eventsAttached: boolean = false;\r\n\r\n private _mouseId = -1;\r\n private readonly _isUsingFirefox = IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf(\"Firefox\") !== -1;\r\n private readonly _isUsingChromium = IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf(\"Chrome\") !== -1;\r\n\r\n // Array to store active Pointer ID values; prevents issues with negative pointerIds\r\n private _activeTouchIds: Array;\r\n private _maxTouchPoints: number = 0;\r\n\r\n private _pointerInputClearObserver: Nullable> = null;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _gamepadConnectedEvent = (evt: any) => {};\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _gamepadDisconnectedEvent = (evt: any) => {};\r\n\r\n private _eventPrefix: string;\r\n\r\n /**\r\n * Constructor for the WebDeviceInputSystem\r\n * @param engine Engine to reference\r\n * @param onDeviceConnected Callback to execute when device is connected\r\n * @param onDeviceDisconnected Callback to execute when device is disconnected\r\n * @param onInputChanged Callback to execute when input changes on device\r\n */\r\n constructor(\r\n engine: Engine,\r\n onDeviceConnected: (deviceType: DeviceType, deviceSlot: number) => void,\r\n onDeviceDisconnected: (deviceType: DeviceType, deviceSlot: number) => void,\r\n onInputChanged: (deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent) => void\r\n ) {\r\n this._eventPrefix = Tools.GetPointerPrefix(engine);\r\n this._engine = engine;\r\n\r\n this._onDeviceConnected = onDeviceConnected;\r\n this._onDeviceDisconnected = onDeviceDisconnected;\r\n this._onInputChanged = onInputChanged;\r\n\r\n // If we need a pointerId, set one for future use\r\n this._mouseId = this._isUsingFirefox ? 0 : 1;\r\n\r\n this._enableEvents();\r\n\r\n if (this._usingMacOS) {\r\n this._metaKeys = [];\r\n }\r\n\r\n // Set callback to enable event handler switching when inputElement changes\r\n if (!this._engine._onEngineViewChanged) {\r\n this._engine._onEngineViewChanged = () => {\r\n this._enableEvents();\r\n };\r\n }\r\n }\r\n\r\n // Public functions\r\n /**\r\n * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized.\r\n * @param deviceType Enum specifying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @returns Current value of input\r\n */\r\n public pollInput(deviceType: DeviceType, deviceSlot: number, inputIndex: number): number {\r\n const device = this._inputs[deviceType][deviceSlot];\r\n\r\n if (!device) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw `Unable to find device ${DeviceType[deviceType]}`;\r\n }\r\n\r\n if (deviceType >= DeviceType.DualShock && deviceType <= DeviceType.DualSense) {\r\n this._updateDevice(deviceType, deviceSlot, inputIndex);\r\n }\r\n\r\n const currentValue = device[inputIndex];\r\n if (currentValue === undefined) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw `Unable to find input ${inputIndex} for device ${DeviceType[deviceType]} in slot ${deviceSlot}`;\r\n }\r\n\r\n if (inputIndex === PointerInput.Move) {\r\n Tools.Warn(`Unable to provide information for PointerInput.Move. Try using PointerInput.Horizontal or PointerInput.Vertical for move data.`);\r\n }\r\n\r\n return currentValue;\r\n }\r\n\r\n /**\r\n * Check for a specific device in the DeviceInputSystem\r\n * @param deviceType Type of device to check for\r\n * @returns bool with status of device's existence\r\n */\r\n public isDeviceAvailable(deviceType: DeviceType): boolean {\r\n return this._inputs[deviceType] !== undefined;\r\n }\r\n\r\n /**\r\n * Dispose of all the eventlisteners\r\n */\r\n public dispose(): void {\r\n // Callbacks\r\n this._onDeviceConnected = () => {};\r\n this._onDeviceDisconnected = () => {};\r\n this._onInputChanged = () => {};\r\n delete this._engine._onEngineViewChanged;\r\n\r\n if (this._elementToAttachTo) {\r\n this._disableEvents();\r\n }\r\n }\r\n\r\n /**\r\n * Enable listening for user input events\r\n */\r\n private _enableEvents(): void {\r\n const inputElement = this?._engine.getInputElement();\r\n if (inputElement && (!this._eventsAttached || this._elementToAttachTo !== inputElement)) {\r\n // Remove events before adding to avoid double events or simultaneous events on multiple canvases\r\n this._disableEvents();\r\n\r\n // If the inputs array has already been created, zero it out to before setting up events\r\n if (this._inputs) {\r\n for (const inputs of this._inputs) {\r\n if (inputs) {\r\n for (const deviceSlotKey in inputs) {\r\n const deviceSlot = +deviceSlotKey;\r\n const device = inputs[deviceSlot];\r\n if (device) {\r\n for (let inputIndex = 0; inputIndex < device.length; inputIndex++) {\r\n device[inputIndex] = 0;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._elementToAttachTo = inputElement;\r\n // Set tab index for the inputElement to the engine's canvasTabIndex, if and only if the element's tab index is -1\r\n this._elementToAttachTo.tabIndex = this._elementToAttachTo.tabIndex !== -1 ? this._elementToAttachTo.tabIndex : this._engine.canvasTabIndex;\r\n this._handleKeyActions();\r\n this._handlePointerActions();\r\n this._handleGamepadActions();\r\n this._eventsAttached = true;\r\n\r\n // Check for devices that are already connected but aren't registered. Currently, only checks for gamepads and mouse\r\n this._checkForConnectedDevices();\r\n }\r\n }\r\n\r\n /**\r\n * Disable listening for user input events\r\n */\r\n private _disableEvents(): void {\r\n if (this._elementToAttachTo) {\r\n // Blur Events\r\n this._elementToAttachTo.removeEventListener(\"blur\", this._keyboardBlurEvent);\r\n this._elementToAttachTo.removeEventListener(\"blur\", this._pointerBlurEvent);\r\n\r\n // Keyboard Events\r\n this._elementToAttachTo.removeEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.removeEventListener(\"keyup\", this._keyboardUpEvent);\r\n\r\n // Pointer Events\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"down\", this._pointerDownEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"up\", this._pointerUpEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"cancel\", this._pointerCancelEvent);\r\n this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent);\r\n if (this._usingMacOS && this._isUsingChromium) {\r\n this._elementToAttachTo.removeEventListener(\"lostpointercapture\", this._pointerMacOSChromeOutEvent);\r\n }\r\n\r\n // Gamepad Events\r\n window.removeEventListener(\"gamepadconnected\", this._gamepadConnectedEvent);\r\n window.removeEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\r\n }\r\n\r\n if (this._pointerInputClearObserver) {\r\n this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver);\r\n }\r\n\r\n this._eventsAttached = false;\r\n }\r\n\r\n /**\r\n * Checks for existing connections to devices and register them, if necessary\r\n * Currently handles gamepads and mouse\r\n */\r\n private _checkForConnectedDevices(): void {\r\n if (navigator.getGamepads) {\r\n const gamepads = navigator.getGamepads();\r\n\r\n for (const gamepad of gamepads) {\r\n if (gamepad) {\r\n this._addGamePad(gamepad);\r\n }\r\n }\r\n }\r\n\r\n // If the device in use has mouse capabilities, pre-register mouse\r\n if (typeof matchMedia === \"function\" && matchMedia(\"(pointer:fine)\").matches) {\r\n // This will provide a dummy value for the cursor position and is expected to be overridden when the first mouse event happens.\r\n // There isn't any good way to get the current position outside of a pointer event so that's why this was done.\r\n this._addPointerDevice(DeviceType.Mouse, 0, 0, 0);\r\n }\r\n }\r\n\r\n // Private functions\r\n /**\r\n * Add a gamepad to the DeviceInputSystem\r\n * @param gamepad A single DOM Gamepad object\r\n */\r\n private _addGamePad(gamepad: any): void {\r\n const deviceType = this._getGamepadDeviceType(gamepad.id);\r\n const deviceSlot = gamepad.index;\r\n\r\n this._gamepads = this._gamepads || new Array(gamepad.index + 1);\r\n this._registerDevice(deviceType, deviceSlot, gamepad.buttons.length + gamepad.axes.length);\r\n\r\n this._gamepads[deviceSlot] = deviceType;\r\n }\r\n\r\n /**\r\n * Add pointer device to DeviceInputSystem\r\n * @param deviceType Type of Pointer to add\r\n * @param deviceSlot Pointer ID (0 for mouse, pointerId for Touch)\r\n * @param currentX Current X at point of adding\r\n * @param currentY Current Y at point of adding\r\n */\r\n private _addPointerDevice(deviceType: DeviceType, deviceSlot: number, currentX: number, currentY: number): void {\r\n if (!this._pointerActive) {\r\n this._pointerActive = true;\r\n }\r\n this._registerDevice(deviceType, deviceSlot, MAX_POINTER_INPUTS);\r\n const pointer = this._inputs[deviceType][deviceSlot]; /* initialize our pointer position immediately after registration */\r\n pointer[0] = currentX;\r\n pointer[1] = currentY;\r\n }\r\n\r\n /**\r\n * Add device and inputs to device array\r\n * @param deviceType Enum specifying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param numberOfInputs Number of input entries to create for given device\r\n */\r\n private _registerDevice(deviceType: DeviceType, deviceSlot: number, numberOfInputs: number): void {\r\n if (deviceSlot === undefined) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw `Unable to register device ${DeviceType[deviceType]} to undefined slot.`;\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n const device = new Array(numberOfInputs);\r\n\r\n device.fill(0);\r\n\r\n this._inputs[deviceType][deviceSlot] = device;\r\n this._onDeviceConnected(deviceType, deviceSlot);\r\n }\r\n }\r\n\r\n /**\r\n * Given a specific device name, remove that device from the device map\r\n * @param deviceType Enum specifying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n */\r\n private _unregisterDevice(deviceType: DeviceType, deviceSlot: number): void {\r\n if (this._inputs[deviceType][deviceSlot]) {\r\n delete this._inputs[deviceType][deviceSlot];\r\n this._onDeviceDisconnected(deviceType, deviceSlot);\r\n }\r\n }\r\n\r\n /**\r\n * Handle all actions that come from keyboard interaction\r\n */\r\n private _handleKeyActions(): void {\r\n this._keyboardDownEvent = (evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, MAX_KEYCODES);\r\n }\r\n\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n if (kbKey) {\r\n kbKey[evt.keyCode] = 1;\r\n\r\n const deviceEvent = evt as IUIEvent;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n\r\n if (this._usingMacOS && evt.metaKey && evt.key !== \"Meta\") {\r\n if (!this._metaKeys.includes(evt.keyCode)) {\r\n this._metaKeys.push(evt.keyCode);\r\n }\r\n }\r\n\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n };\r\n\r\n this._keyboardUpEvent = (evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, MAX_KEYCODES);\r\n }\r\n\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n if (kbKey) {\r\n kbKey[evt.keyCode] = 0;\r\n\r\n const deviceEvent = evt as IUIEvent;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n\r\n if (this._usingMacOS && evt.key === \"Meta\" && this._metaKeys.length > 0) {\r\n for (const keyCode of this._metaKeys) {\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, keyCode, 0, this, this._elementToAttachTo);\r\n kbKey[keyCode] = 0;\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n this._metaKeys.splice(0, this._metaKeys.length);\r\n }\r\n\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n };\r\n\r\n this._keyboardBlurEvent = () => {\r\n if (this._keyboardActive) {\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n\r\n for (let i = 0; i < kbKey.length; i++) {\r\n if (kbKey[i] !== 0) {\r\n kbKey[i] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, i, 0, this, this._elementToAttachTo);\r\n\r\n this._onInputChanged(DeviceType.Keyboard, 0, deviceEvent);\r\n }\r\n }\r\n if (this._usingMacOS) {\r\n this._metaKeys.splice(0, this._metaKeys.length);\r\n }\r\n }\r\n };\r\n\r\n this._elementToAttachTo.addEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.addEventListener(\"keyup\", this._keyboardUpEvent);\r\n this._elementToAttachTo.addEventListener(\"blur\", this._keyboardBlurEvent);\r\n }\r\n\r\n /**\r\n * Handle all actions that come from pointer interaction\r\n */\r\n private _handlePointerActions(): void {\r\n // If maxTouchPoints is defined, use that value. Otherwise, allow for a minimum for supported gestures like pinch\r\n this._maxTouchPoints = (IsNavigatorAvailable() && navigator.maxTouchPoints) || 2;\r\n if (!this._activeTouchIds) {\r\n this._activeTouchIds = new Array(this._maxTouchPoints);\r\n }\r\n\r\n for (let i = 0; i < this._maxTouchPoints; i++) {\r\n this._activeTouchIds[i] = -1;\r\n }\r\n\r\n this._pointerMoveEvent = (evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n let deviceSlot = deviceType === DeviceType.Mouse ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n // In the event that we're gettting pointermove events from touch inputs that we aren't tracking,\r\n // look for an available slot and retroactively connect it.\r\n if (deviceType === DeviceType.Touch && deviceSlot === -1) {\r\n const idx = this._activeTouchIds.indexOf(-1);\r\n\r\n if (idx >= 0) {\r\n deviceSlot = idx;\r\n this._activeTouchIds[idx] = evt.pointerId;\r\n // Because this is a \"new\" input, inform the connected callback\r\n this._onDeviceConnected(deviceType, deviceSlot);\r\n } else {\r\n // We can't find an open slot to store new pointer so just return (can only support max number of touches)\r\n Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\r\n return;\r\n }\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n const deviceEvent = evt as IPointerEvent;\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n\r\n // For touches that aren't started with a down, we need to set the button state to 1\r\n if (deviceType === DeviceType.Touch && pointer[PointerInput.LeftClick] === 0) {\r\n pointer[PointerInput.LeftClick] = 1;\r\n }\r\n\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n\r\n // Lets Propagate the event for move with same position.\r\n if (!this._usingSafari && evt.button !== -1) {\r\n deviceEvent.inputIndex = evt.button + 2;\r\n pointer[evt.button + 2] = pointer[evt.button + 2] ? 0 : 1; // Reverse state of button if evt.button has value\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n }\r\n };\r\n\r\n this._pointerDownEvent = (evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n let deviceSlot = deviceType === DeviceType.Mouse ? 0 : evt.pointerId;\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n const idx = this._activeTouchIds.indexOf(-1);\r\n\r\n if (idx >= 0) {\r\n deviceSlot = idx;\r\n this._activeTouchIds[idx] = evt.pointerId;\r\n } else {\r\n // We can't find an open slot to store new pointer so just return (can only support max number of touches)\r\n Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\r\n return;\r\n }\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY);\r\n } else if (deviceType === DeviceType.Touch) {\r\n this._onDeviceConnected(deviceType, deviceSlot);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n\r\n if (deviceType === DeviceType.Mouse) {\r\n // Mouse; Set pointerId if undefined\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n if (!document.pointerLockElement) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(this._mouseId);\r\n } catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n } else {\r\n // Touch; Since touches are dynamically assigned, only set capture if we have an id\r\n if (evt.pointerId && !document.pointerLockElement) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(evt.pointerId);\r\n } catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n }\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[evt.button + 2] = 1;\r\n\r\n const deviceEvent = evt as IUIEvent;\r\n\r\n // NOTE: The +2 used here to is because PointerInput has the same value progression for its mouse buttons as PointerEvent.button\r\n // However, we have our X and Y values front-loaded to group together the touch inputs but not break this progression\r\n // EG. ([X, Y, Left-click], Middle-click, etc...)\r\n deviceEvent.inputIndex = evt.button + 2;\r\n\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n\r\n if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n }\r\n };\r\n\r\n this._pointerUpEvent = (evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n const deviceSlot = deviceType === DeviceType.Mouse ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n // If we're getting a pointerup event for a touch that isn't active, just return.\r\n if (deviceSlot === -1) {\r\n return;\r\n } else {\r\n this._activeTouchIds[deviceSlot] = -1;\r\n }\r\n }\r\n\r\n const pointer = this._inputs[deviceType]?.[deviceSlot];\r\n if (pointer && pointer[evt.button + 2] !== 0) {\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[evt.button + 2] = 0;\r\n\r\n const deviceEvent = evt as IUIEvent;\r\n\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n\r\n // NOTE: The +2 used here to is because PointerInput has the same value progression for its mouse buttons as PointerEvent.button\r\n // However, we have our X and Y values front-loaded to group together the touch inputs but not break this progression\r\n // EG. ([X, Y, Left-click], Middle-click, etc...)\r\n deviceEvent.inputIndex = evt.button + 2;\r\n\r\n if (deviceType === DeviceType.Mouse && this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture?.(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n } else if (evt.pointerId && this._elementToAttachTo.hasPointerCapture?.(evt.pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(evt.pointerId);\r\n }\r\n\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n this._onDeviceDisconnected(deviceType, deviceSlot);\r\n }\r\n }\r\n };\r\n\r\n this._pointerCancelEvent = (evt) => {\r\n if (evt.pointerType === \"mouse\") {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n\r\n if (this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture?.(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n }\r\n\r\n for (let inputIndex = PointerInput.LeftClick; inputIndex <= PointerInput.BrowserForward; inputIndex++) {\r\n if (pointer[inputIndex] === 1) {\r\n pointer[inputIndex] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, inputIndex, 0, this, this._elementToAttachTo);\r\n\r\n this._onInputChanged(DeviceType.Mouse, 0, deviceEvent);\r\n }\r\n }\r\n } else {\r\n const deviceSlot = this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n // If we're getting a pointercancel event for a touch that isn't active, just return\r\n if (deviceSlot === -1) {\r\n return;\r\n }\r\n\r\n if (this._elementToAttachTo.hasPointerCapture?.(evt.pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(evt.pointerId);\r\n }\r\n\r\n this._inputs[DeviceType.Touch][deviceSlot][PointerInput.LeftClick] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(\r\n DeviceType.Touch,\r\n deviceSlot,\r\n PointerInput.LeftClick,\r\n 0,\r\n this,\r\n this._elementToAttachTo,\r\n evt.pointerId\r\n );\r\n\r\n this._onInputChanged(DeviceType.Touch, deviceSlot, deviceEvent);\r\n\r\n this._activeTouchIds[deviceSlot] = -1;\r\n this._onDeviceDisconnected(DeviceType.Touch, deviceSlot);\r\n }\r\n };\r\n\r\n // Set Wheel Event Name, code originally from scene.inputManager\r\n this._wheelEventName =\r\n \"onwheel\" in document.createElement(\"div\")\r\n ? \"wheel\" // Modern browsers support \"wheel\"\r\n : (document).onmousewheel !== undefined\r\n ? \"mousewheel\" // Webkit and IE support at least \"mousewheel\"\r\n : \"DOMMouseScroll\"; // let's assume that remaining browsers are older Firefox\r\n\r\n // Code originally in scene.inputManager.ts\r\n // Chrome reports warning in console if wheel listener doesn't set an explicit passive option.\r\n // IE11 only supports captureEvent:boolean, not options:object, and it defaults to false.\r\n // Feature detection technique copied from: https://github.com/github/eventlistener-polyfill (MIT license)\r\n let passiveSupported = false;\r\n const noop = function () {};\r\n\r\n try {\r\n const options = Object.defineProperty({}, \"passive\", {\r\n get: function () {\r\n passiveSupported = true;\r\n },\r\n });\r\n\r\n this._elementToAttachTo.addEventListener(\"test\", noop, options);\r\n this._elementToAttachTo.removeEventListener(\"test\", noop, options);\r\n } catch (e) {\r\n /* */\r\n }\r\n\r\n this._pointerBlurEvent = () => {\r\n // Handle mouse buttons\r\n if (this.isDeviceAvailable(DeviceType.Mouse)) {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n\r\n if (this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture?.(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n }\r\n\r\n for (let inputIndex = PointerInput.LeftClick; inputIndex <= PointerInput.BrowserForward; inputIndex++) {\r\n if (pointer[inputIndex] === 1) {\r\n pointer[inputIndex] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, inputIndex, 0, this, this._elementToAttachTo);\r\n\r\n this._onInputChanged(DeviceType.Mouse, 0, deviceEvent);\r\n }\r\n }\r\n }\r\n\r\n // Handle Active Touches\r\n if (this.isDeviceAvailable(DeviceType.Touch)) {\r\n const pointer = this._inputs[DeviceType.Touch];\r\n\r\n for (let deviceSlot = 0; deviceSlot < this._activeTouchIds.length; deviceSlot++) {\r\n const pointerId = this._activeTouchIds[deviceSlot];\r\n\r\n if (this._elementToAttachTo.hasPointerCapture?.(pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(pointerId);\r\n }\r\n\r\n if (pointerId !== -1 && pointer[deviceSlot]?.[PointerInput.LeftClick] === 1) {\r\n pointer[deviceSlot][PointerInput.LeftClick] = 0;\r\n\r\n const deviceEvent: IUIEvent = DeviceEventFactory.CreateDeviceEvent(\r\n DeviceType.Touch,\r\n deviceSlot,\r\n PointerInput.LeftClick,\r\n 0,\r\n this,\r\n this._elementToAttachTo,\r\n pointerId\r\n );\r\n\r\n this._onInputChanged(DeviceType.Touch, deviceSlot, deviceEvent);\r\n\r\n this._activeTouchIds[deviceSlot] = -1;\r\n this._onDeviceDisconnected(DeviceType.Touch, deviceSlot);\r\n }\r\n }\r\n }\r\n };\r\n\r\n this._pointerWheelEvent = (evt) => {\r\n const deviceType = DeviceType.Mouse;\r\n const deviceSlot = 0;\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = [];\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._pointerActive = true;\r\n this._registerDevice(deviceType, deviceSlot, MAX_POINTER_INPUTS);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n pointer[PointerInput.MouseWheelX] = evt.deltaX || 0;\r\n pointer[PointerInput.MouseWheelY] = evt.deltaY || evt.wheelDelta || 0;\r\n pointer[PointerInput.MouseWheelZ] = evt.deltaZ || 0;\r\n\r\n const deviceEvent = evt as IUIEvent;\r\n // By default, there is no pointerId for mouse wheel events so we'll add one here\r\n // This logic was originally in the InputManager but was added here to make the\r\n // InputManager more platform-agnostic\r\n if (evt.pointerId === undefined) {\r\n evt.pointerId = this._mouseId;\r\n }\r\n\r\n if (pointer[PointerInput.MouseWheelX] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelX;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelY] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelY;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelZ] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelZ;\r\n this._onInputChanged(deviceType, deviceSlot, deviceEvent);\r\n }\r\n }\r\n };\r\n\r\n // Workaround for MacOS Chromium Browsers for lost pointer capture bug\r\n if (this._usingMacOS && this._isUsingChromium) {\r\n this._pointerMacOSChromeOutEvent = (evt) => {\r\n if (evt.buttons > 1) {\r\n this._pointerCancelEvent(evt);\r\n }\r\n };\r\n this._elementToAttachTo.addEventListener(\"lostpointercapture\", this._pointerMacOSChromeOutEvent);\r\n }\r\n\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"down\", this._pointerDownEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"up\", this._pointerUpEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"cancel\", this._pointerCancelEvent);\r\n this._elementToAttachTo.addEventListener(\"blur\", this._pointerBlurEvent);\r\n this._elementToAttachTo.addEventListener(this._wheelEventName, this._pointerWheelEvent, passiveSupported ? { passive: false } : false);\r\n\r\n // Since there's no up or down event for mouse wheel or delta x/y, clear mouse values at end of frame\r\n this._pointerInputClearObserver = this._engine.onEndFrameObservable.add(() => {\r\n if (this.isDeviceAvailable(DeviceType.Mouse)) {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n pointer[PointerInput.MouseWheelX] = 0;\r\n pointer[PointerInput.MouseWheelY] = 0;\r\n pointer[PointerInput.MouseWheelZ] = 0;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handle all actions that come from gamepad interaction\r\n */\r\n private _handleGamepadActions(): void {\r\n this._gamepadConnectedEvent = (evt: any) => {\r\n this._addGamePad(evt.gamepad);\r\n };\r\n\r\n this._gamepadDisconnectedEvent = (evt: any) => {\r\n if (this._gamepads) {\r\n const deviceType = this._getGamepadDeviceType(evt.gamepad.id);\r\n const deviceSlot = evt.gamepad.index;\r\n\r\n this._unregisterDevice(deviceType, deviceSlot);\r\n delete this._gamepads[deviceSlot];\r\n }\r\n };\r\n\r\n window.addEventListener(\"gamepadconnected\", this._gamepadConnectedEvent);\r\n window.addEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\r\n }\r\n\r\n /**\r\n * Update all non-event based devices with each frame\r\n * @param deviceType Enum specifying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n */\r\n private _updateDevice(deviceType: DeviceType, deviceSlot: number, inputIndex: number): void {\r\n // Gamepads\r\n const gp = navigator.getGamepads()[deviceSlot];\r\n\r\n if (gp && deviceType === this._gamepads[deviceSlot]) {\r\n const device = this._inputs[deviceType][deviceSlot];\r\n\r\n if (inputIndex >= gp.buttons.length) {\r\n device[inputIndex] = gp.axes[inputIndex - gp.buttons.length].valueOf();\r\n } else {\r\n device[inputIndex] = gp.buttons[inputIndex].value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets DeviceType from the device name\r\n * @param deviceName Name of Device from DeviceInputSystem\r\n * @returns DeviceType enum value\r\n */\r\n private _getGamepadDeviceType(deviceName: string): DeviceType {\r\n if (deviceName.indexOf(\"054c\") !== -1) {\r\n // DualShock 4 Gamepad\r\n return deviceName.indexOf(\"0ce6\") !== -1 ? DeviceType.DualSense : DeviceType.DualShock;\r\n } else if (deviceName.indexOf(\"Xbox One\") !== -1 || deviceName.search(\"Xbox 360\") !== -1 || deviceName.search(\"xinput\") !== -1) {\r\n // Xbox Gamepad\r\n return DeviceType.Xbox;\r\n } else if (deviceName.indexOf(\"057e\") !== -1) {\r\n // Switch Gamepad\r\n return DeviceType.Switch;\r\n }\r\n\r\n return DeviceType.Generic;\r\n }\r\n\r\n /**\r\n * Get DeviceType from a given pointer/mouse/touch event.\r\n * @param evt PointerEvent to evaluate\r\n * @returns DeviceType interpreted from event\r\n */\r\n private _getPointerType(evt: any): DeviceType {\r\n let deviceType = DeviceType.Mouse;\r\n\r\n if (evt.pointerType === \"touch\" || evt.pointerType === \"pen\" || evt.touches) {\r\n deviceType = DeviceType.Touch;\r\n }\r\n\r\n return deviceType;\r\n }\r\n}\r\n", "import type { IDisposable } from \"../scene\";\r\nimport { DeviceType } from \"./InputDevices/deviceEnums\";\r\nimport type { Observable } from \"../Misc/observable\";\r\nimport type { IDeviceInputSystem } from \"./inputInterfaces\";\r\nimport { NativeDeviceInputSystem } from \"./nativeDeviceInputSystem\";\r\nimport { WebDeviceInputSystem } from \"./webDeviceInputSystem\";\r\nimport { DeviceSource } from \"./InputDevices/deviceSource\";\r\nimport type { INative } from \"../Engines/Native/nativeInterfaces\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { IUIEvent } from \"../Events/deviceInputEvents\";\r\n\r\ntype Distribute = T extends DeviceType ? DeviceSource : never;\r\n\r\nexport type DeviceSourceType = Distribute;\r\n\r\ndeclare const _native: INative;\r\n\r\ndeclare module \"../Engines/engine\" {\r\n interface Engine {\r\n /** @internal */\r\n _deviceSourceManager?: InternalDeviceSourceManager;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport interface IObservableManager {\r\n onDeviceConnectedObservable: Observable;\r\n onDeviceDisconnectedObservable: Observable;\r\n\r\n // Functions\r\n _onInputChanged(deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent): void;\r\n _addDevice(deviceSource: DeviceSource): void;\r\n _removeDevice(deviceType: DeviceType, deviceSlot: number): void;\r\n}\r\n\r\n/** @internal */\r\nexport class InternalDeviceSourceManager implements IDisposable {\r\n // Public Members\r\n public readonly _deviceInputSystem: IDeviceInputSystem;\r\n\r\n // Private Members\r\n // This is a master list of all device type/slot combos\r\n private readonly _devices: Array>;\r\n\r\n private readonly _registeredManagers = new Array();\r\n\r\n public _refCount = 0;\r\n\r\n public constructor(engine: Engine) {\r\n const numberOfDeviceTypes = Object.keys(DeviceType).length / 2;\r\n this._devices = new Array>(numberOfDeviceTypes);\r\n\r\n const onDeviceConnected = (deviceType: DeviceType, deviceSlot: number) => {\r\n if (!this._devices[deviceType]) {\r\n this._devices[deviceType] = new Array();\r\n }\r\n\r\n if (!this._devices[deviceType][deviceSlot]) {\r\n this._devices[deviceType][deviceSlot] = deviceSlot;\r\n }\r\n for (const manager of this._registeredManagers) {\r\n const deviceSource = new DeviceSource(this._deviceInputSystem, deviceType, deviceSlot);\r\n manager._addDevice(deviceSource);\r\n }\r\n };\r\n\r\n const onDeviceDisconnected = (deviceType: DeviceType, deviceSlot: number) => {\r\n if (this._devices[deviceType]?.[deviceSlot]) {\r\n delete this._devices[deviceType][deviceSlot];\r\n }\r\n for (const manager of this._registeredManagers) {\r\n manager._removeDevice(deviceType, deviceSlot);\r\n }\r\n };\r\n\r\n const onInputChanged = (deviceType: DeviceType, deviceSlot: number, eventData: IUIEvent) => {\r\n if (eventData) {\r\n for (const manager of this._registeredManagers) {\r\n manager._onInputChanged(deviceType, deviceSlot, eventData);\r\n }\r\n }\r\n };\r\n\r\n if (typeof _native !== \"undefined\") {\r\n this._deviceInputSystem = new NativeDeviceInputSystem(onDeviceConnected, onDeviceDisconnected, onInputChanged);\r\n } else {\r\n this._deviceInputSystem = new WebDeviceInputSystem(engine, onDeviceConnected, onDeviceDisconnected, onInputChanged);\r\n }\r\n }\r\n\r\n // Public Functions\r\n public readonly registerManager = (manager: IObservableManager): void => {\r\n for (let deviceType = 0; deviceType < this._devices.length; deviceType++) {\r\n const device = this._devices[deviceType];\r\n for (const deviceSlotKey in device) {\r\n const deviceSlot = +deviceSlotKey;\r\n manager._addDevice(new DeviceSource(this._deviceInputSystem, deviceType, deviceSlot));\r\n }\r\n }\r\n this._registeredManagers.push(manager);\r\n };\r\n\r\n public readonly unregisterManager = (manager: IObservableManager): void => {\r\n const idx = this._registeredManagers.indexOf(manager);\r\n\r\n if (idx > -1) {\r\n this._registeredManagers.splice(idx, 1);\r\n }\r\n };\r\n\r\n public dispose(): void {\r\n this._deviceInputSystem.dispose();\r\n }\r\n}\r\n", "import type { Engine } from \"../../Engines/engine\";\r\nimport { DeviceType } from \"./deviceEnums\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { DeviceSource } from \"./deviceSource\";\r\nimport type { IObservableManager, DeviceSourceType } from \"../internalDeviceSourceManager\";\r\nimport { InternalDeviceSourceManager } from \"../internalDeviceSourceManager\";\r\nimport type { IDisposable } from \"../../scene\";\r\nimport type { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { IKeyboardEvent, IPointerEvent, IUIEvent, IWheelEvent } from \"../../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Class to keep track of devices\r\n */\r\nexport class DeviceSourceManager implements IDisposable, IObservableManager {\r\n // Public Members\r\n /**\r\n * Observable to be triggered when after a device is connected, any new observers added will be triggered against already connected devices\r\n */\r\n public readonly onDeviceConnectedObservable: Observable;\r\n\r\n /**\r\n * Observable to be triggered when after a device is disconnected\r\n */\r\n public readonly onDeviceDisconnectedObservable: Observable;\r\n\r\n // Private Members\r\n private _engine: Engine;\r\n private _onDisposeObserver: Nullable>;\r\n private readonly _devices: Array>>;\r\n private readonly _firstDevice: Array;\r\n\r\n // Public Functions\r\n /**\r\n * Gets a DeviceSource, given a type and slot\r\n * @param deviceType - Type of Device\r\n * @param deviceSlot - Slot or ID of device\r\n * @returns DeviceSource\r\n */\r\n public getDeviceSource(deviceType: T, deviceSlot?: number): Nullable> {\r\n if (deviceSlot === undefined) {\r\n if (this._firstDevice[deviceType] === undefined) {\r\n return null;\r\n }\r\n\r\n deviceSlot = this._firstDevice[deviceType];\r\n }\r\n\r\n if (!this._devices[deviceType] || this._devices[deviceType][deviceSlot] === undefined) {\r\n return null;\r\n }\r\n\r\n return this._devices[deviceType][deviceSlot] as DeviceSource;\r\n }\r\n /**\r\n * Gets an array of DeviceSource objects for a given device type\r\n * @param deviceType - Type of Device\r\n * @returns All available DeviceSources of a given type\r\n */\r\n public getDeviceSources(deviceType: T): ReadonlyArray> {\r\n // If device type hasn't had any devices connected yet, return empty array.\r\n if (!this._devices[deviceType]) {\r\n return [];\r\n }\r\n return this._devices[deviceType].filter((source) => {\r\n return !!source;\r\n }) as Array>;\r\n }\r\n\r\n /**\r\n * Default constructor\r\n * @param engine - Used to get canvas (if applicable)\r\n */\r\n constructor(engine: Engine) {\r\n const numberOfDeviceTypes = Object.keys(DeviceType).length / 2;\r\n this._devices = new Array(numberOfDeviceTypes);\r\n this._firstDevice = new Array(numberOfDeviceTypes);\r\n this._engine = engine;\r\n\r\n if (!this._engine._deviceSourceManager) {\r\n this._engine._deviceSourceManager = new InternalDeviceSourceManager(engine);\r\n }\r\n this._engine._deviceSourceManager._refCount++;\r\n\r\n // Observables\r\n this.onDeviceConnectedObservable = new Observable((observer) => {\r\n for (const devices of this._devices) {\r\n if (devices) {\r\n for (const device of devices) {\r\n if (device) {\r\n this.onDeviceConnectedObservable.notifyObserver(observer, device as DeviceSourceType);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n this.onDeviceDisconnectedObservable = new Observable();\r\n\r\n this._engine._deviceSourceManager.registerManager(this);\r\n\r\n this._onDisposeObserver = engine.onDisposeObservable.add(() => {\r\n this.dispose();\r\n });\r\n }\r\n\r\n /**\r\n * Dispose of DeviceSourceManager\r\n */\r\n public dispose(): void {\r\n // Null out observable refs\r\n this.onDeviceConnectedObservable.clear();\r\n this.onDeviceDisconnectedObservable.clear();\r\n\r\n if (this._engine._deviceSourceManager) {\r\n this._engine._deviceSourceManager.unregisterManager(this);\r\n if (--this._engine._deviceSourceManager._refCount < 1) {\r\n this._engine._deviceSourceManager.dispose();\r\n delete this._engine._deviceSourceManager;\r\n }\r\n }\r\n this._engine.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n\r\n // Hidden Functions\r\n /**\r\n * @param deviceSource - Source to add\r\n * @internal\r\n */\r\n public _addDevice(deviceSource: DeviceSourceType): void {\r\n if (!this._devices[deviceSource.deviceType]) {\r\n this._devices[deviceSource.deviceType] = new Array();\r\n }\r\n\r\n if (!this._devices[deviceSource.deviceType][deviceSource.deviceSlot]) {\r\n this._devices[deviceSource.deviceType][deviceSource.deviceSlot] = deviceSource;\r\n this._updateFirstDevices(deviceSource.deviceType);\r\n }\r\n\r\n this.onDeviceConnectedObservable.notifyObservers(deviceSource);\r\n }\r\n\r\n /**\r\n * @param deviceType - DeviceType\r\n * @param deviceSlot - DeviceSlot\r\n * @internal\r\n */\r\n public _removeDevice(deviceType: DeviceType, deviceSlot: number): void {\r\n const deviceSource = this._devices[deviceType]?.[deviceSlot]; // Grab local reference to use before removing from devices\r\n this.onDeviceDisconnectedObservable.notifyObservers(deviceSource as DeviceSourceType);\r\n if (this._devices[deviceType]?.[deviceSlot]) {\r\n delete this._devices[deviceType][deviceSlot];\r\n }\r\n // Even if we don't delete a device, we should still check for the first device as things may have gotten out of sync.\r\n this._updateFirstDevices(deviceType);\r\n }\r\n\r\n /**\r\n * @param deviceType - DeviceType\r\n * @param deviceSlot - DeviceSlot\r\n * @param eventData - Event\r\n * @internal\r\n */\r\n public _onInputChanged(deviceType: T, deviceSlot: number, eventData: IUIEvent): void {\r\n this._devices[deviceType]?.[deviceSlot]?.onInputChangedObservable.notifyObservers(eventData as IKeyboardEvent | IWheelEvent | IPointerEvent);\r\n }\r\n\r\n // Private Functions\r\n private _updateFirstDevices(type: DeviceType): void {\r\n switch (type) {\r\n case DeviceType.Keyboard:\r\n case DeviceType.Mouse:\r\n this._firstDevice[type] = 0;\r\n break;\r\n case DeviceType.Touch:\r\n case DeviceType.DualSense:\r\n case DeviceType.DualShock:\r\n case DeviceType.Xbox:\r\n case DeviceType.Switch:\r\n case DeviceType.Generic: {\r\n delete this._firstDevice[type];\r\n // eslint-disable-next-line no-case-declarations\r\n const devices = this._devices[type];\r\n if (devices) {\r\n for (let i = 0; i < devices.length; i++) {\r\n if (devices[i]) {\r\n this._firstDevice[type] = i;\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n", "import { PrecisionDate } from \"./precisionDate\";\r\n\r\n/**\r\n * This class is used to track a performance counter which is number based.\r\n * The user has access to many properties which give statistics of different nature.\r\n *\r\n * The implementer can track two kinds of Performance Counter: time and count.\r\n * For time you can optionally call fetchNewFrame() to notify the start of a new frame to monitor, then call beginMonitoring() to start and endMonitoring() to record the lapsed time. endMonitoring takes a newFrame parameter for you to specify if the monitored time should be set for a new frame or accumulated to the current frame being monitored.\r\n * For count you first have to call fetchNewFrame() to notify the start of a new frame to monitor, then call addCount() how many time required to increment the count value you monitor.\r\n */\r\nexport class PerfCounter {\r\n /**\r\n * Gets or sets a global boolean to turn on and off all the counters\r\n */\r\n public static Enabled = true;\r\n\r\n /**\r\n * Returns the smallest value ever\r\n */\r\n public get min(): number {\r\n return this._min;\r\n }\r\n\r\n /**\r\n * Returns the biggest value ever\r\n */\r\n public get max(): number {\r\n return this._max;\r\n }\r\n\r\n /**\r\n * Returns the average value since the performance counter is running\r\n */\r\n public get average(): number {\r\n return this._average;\r\n }\r\n\r\n /**\r\n * Returns the average value of the last second the counter was monitored\r\n */\r\n public get lastSecAverage(): number {\r\n return this._lastSecAverage;\r\n }\r\n\r\n /**\r\n * Returns the current value\r\n */\r\n public get current(): number {\r\n return this._current;\r\n }\r\n\r\n /**\r\n * Gets the accumulated total\r\n */\r\n public get total(): number {\r\n return this._totalAccumulated;\r\n }\r\n\r\n /**\r\n * Gets the total value count\r\n */\r\n public get count(): number {\r\n return this._totalValueCount;\r\n }\r\n\r\n /**\r\n * Creates a new counter\r\n */\r\n constructor() {\r\n this._startMonitoringTime = 0;\r\n this._min = 0;\r\n this._max = 0;\r\n this._average = 0;\r\n this._lastSecAverage = 0;\r\n this._current = 0;\r\n this._totalValueCount = 0;\r\n this._totalAccumulated = 0;\r\n this._lastSecAccumulated = 0;\r\n this._lastSecTime = 0;\r\n this._lastSecValueCount = 0;\r\n }\r\n\r\n /**\r\n * Call this method to start monitoring a new frame.\r\n * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the start of the frame, then beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count.\r\n */\r\n public fetchNewFrame() {\r\n this._totalValueCount++;\r\n this._current = 0;\r\n this._lastSecValueCount++;\r\n }\r\n\r\n /**\r\n * Call this method to monitor a count of something (e.g. mesh drawn in viewport count)\r\n * @param newCount the count value to add to the monitored count\r\n * @param fetchResult true when it's the last time in the frame you add to the counter and you wish to update the statistics properties (min/max/average), false if you only want to update statistics.\r\n */\r\n public addCount(newCount: number, fetchResult: boolean) {\r\n if (!PerfCounter.Enabled) {\r\n return;\r\n }\r\n this._current += newCount;\r\n if (fetchResult) {\r\n this._fetchResult();\r\n }\r\n }\r\n\r\n /**\r\n * Start monitoring this performance counter\r\n */\r\n public beginMonitoring() {\r\n if (!PerfCounter.Enabled) {\r\n return;\r\n }\r\n this._startMonitoringTime = PrecisionDate.Now;\r\n }\r\n\r\n /**\r\n * Compute the time lapsed since the previous beginMonitoring() call.\r\n * @param newFrame true by default to fetch the result and monitor a new frame, if false the time monitored will be added to the current frame counter\r\n */\r\n public endMonitoring(newFrame: boolean = true) {\r\n if (!PerfCounter.Enabled) {\r\n return;\r\n }\r\n\r\n if (newFrame) {\r\n this.fetchNewFrame();\r\n }\r\n\r\n const currentTime = PrecisionDate.Now;\r\n this._current = currentTime - this._startMonitoringTime;\r\n\r\n if (newFrame) {\r\n this._fetchResult();\r\n }\r\n }\r\n\r\n /**\r\n * Call this method to end the monitoring of a frame.\r\n * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the end of the frame, after beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count.\r\n */\r\n public endFrame() {\r\n this._fetchResult();\r\n }\r\n\r\n /** @internal */\r\n public _fetchResult() {\r\n this._totalAccumulated += this._current;\r\n this._lastSecAccumulated += this._current;\r\n\r\n // Min/Max update\r\n this._min = Math.min(this._min, this._current);\r\n this._max = Math.max(this._max, this._current);\r\n this._average = this._totalAccumulated / this._totalValueCount;\r\n\r\n // Reset last sec?\r\n const now = PrecisionDate.Now;\r\n if (now - this._lastSecTime > 1000) {\r\n this._lastSecAverage = this._lastSecAccumulated / this._lastSecValueCount;\r\n this._lastSecTime = now;\r\n this._lastSecAccumulated = 0;\r\n this._lastSecValueCount = 0;\r\n }\r\n }\r\n\r\n private _startMonitoringTime: number;\r\n private _min: number;\r\n private _max: number;\r\n private _average: number;\r\n private _current: number;\r\n private _totalValueCount: number;\r\n private _totalAccumulated: number;\r\n private _lastSecAverage: number;\r\n private _lastSecAccumulated: number;\r\n private _lastSecTime: number;\r\n private _lastSecValueCount: number;\r\n}\r\n", "import type { Matrix, Vector3 } from \"./math.vector\";\r\nimport type { DeepImmutable } from \"../types\";\r\nimport { Plane } from \"./math.plane\";\r\n\r\n/**\r\n * Represents a camera frustum\r\n */\r\nexport class Frustum {\r\n /**\r\n * Gets the planes representing the frustum\r\n * @param transform matrix to be applied to the returned planes\r\n * @returns a new array of 6 Frustum planes computed by the given transformation matrix.\r\n */\r\n public static GetPlanes(transform: DeepImmutable): Plane[] {\r\n const frustumPlanes = [];\r\n for (let index = 0; index < 6; index++) {\r\n frustumPlanes.push(new Plane(0.0, 0.0, 0.0, 0.0));\r\n }\r\n Frustum.GetPlanesToRef(transform, frustumPlanes);\r\n return frustumPlanes;\r\n }\r\n\r\n /**\r\n * Gets the near frustum plane transformed by the transform matrix\r\n * @param transform transformation matrix to be applied to the resulting frustum plane\r\n * @param frustumPlane the resulting frustum plane\r\n */\r\n public static GetNearPlaneToRef(transform: DeepImmutable, frustumPlane: Plane): void {\r\n const m = transform.m;\r\n frustumPlane.normal.x = m[3] + m[2];\r\n frustumPlane.normal.y = m[7] + m[6];\r\n frustumPlane.normal.z = m[11] + m[10];\r\n frustumPlane.d = m[15] + m[14];\r\n frustumPlane.normalize();\r\n }\r\n\r\n /**\r\n * Gets the far frustum plane transformed by the transform matrix\r\n * @param transform transformation matrix to be applied to the resulting frustum plane\r\n * @param frustumPlane the resulting frustum plane\r\n */\r\n public static GetFarPlaneToRef(transform: DeepImmutable, frustumPlane: Plane): void {\r\n const m = transform.m;\r\n frustumPlane.normal.x = m[3] - m[2];\r\n frustumPlane.normal.y = m[7] - m[6];\r\n frustumPlane.normal.z = m[11] - m[10];\r\n frustumPlane.d = m[15] - m[14];\r\n frustumPlane.normalize();\r\n }\r\n\r\n /**\r\n * Gets the left frustum plane transformed by the transform matrix\r\n * @param transform transformation matrix to be applied to the resulting frustum plane\r\n * @param frustumPlane the resulting frustum plane\r\n */\r\n public static GetLeftPlaneToRef(transform: DeepImmutable, frustumPlane: Plane): void {\r\n const m = transform.m;\r\n frustumPlane.normal.x = m[3] + m[0];\r\n frustumPlane.normal.y = m[7] + m[4];\r\n frustumPlane.normal.z = m[11] + m[8];\r\n frustumPlane.d = m[15] + m[12];\r\n frustumPlane.normalize();\r\n }\r\n\r\n /**\r\n * Gets the right frustum plane transformed by the transform matrix\r\n * @param transform transformation matrix to be applied to the resulting frustum plane\r\n * @param frustumPlane the resulting frustum plane\r\n */\r\n public static GetRightPlaneToRef(transform: DeepImmutable, frustumPlane: Plane): void {\r\n const m = transform.m;\r\n frustumPlane.normal.x = m[3] - m[0];\r\n frustumPlane.normal.y = m[7] - m[4];\r\n frustumPlane.normal.z = m[11] - m[8];\r\n frustumPlane.d = m[15] - m[12];\r\n frustumPlane.normalize();\r\n }\r\n\r\n /**\r\n * Gets the top frustum plane transformed by the transform matrix\r\n * @param transform transformation matrix to be applied to the resulting frustum plane\r\n * @param frustumPlane the resulting frustum plane\r\n */\r\n public static GetTopPlaneToRef(transform: DeepImmutable, frustumPlane: Plane): void {\r\n const m = transform.m;\r\n frustumPlane.normal.x = m[3] - m[1];\r\n frustumPlane.normal.y = m[7] - m[5];\r\n frustumPlane.normal.z = m[11] - m[9];\r\n frustumPlane.d = m[15] - m[13];\r\n frustumPlane.normalize();\r\n }\r\n\r\n /**\r\n * Gets the bottom frustum plane transformed by the transform matrix\r\n * @param transform transformation matrix to be applied to the resulting frustum plane\r\n * @param frustumPlane the resulting frustum plane\r\n */\r\n public static GetBottomPlaneToRef(transform: DeepImmutable, frustumPlane: Plane): void {\r\n const m = transform.m;\r\n frustumPlane.normal.x = m[3] + m[1];\r\n frustumPlane.normal.y = m[7] + m[5];\r\n frustumPlane.normal.z = m[11] + m[9];\r\n frustumPlane.d = m[15] + m[13];\r\n frustumPlane.normalize();\r\n }\r\n\r\n /**\r\n * Sets the given array \"frustumPlanes\" with the 6 Frustum planes computed by the given transformation matrix.\r\n * @param transform transformation matrix to be applied to the resulting frustum planes\r\n * @param frustumPlanes the resulting frustum planes\r\n */\r\n public static GetPlanesToRef(transform: DeepImmutable, frustumPlanes: Plane[]): void {\r\n // Near\r\n Frustum.GetNearPlaneToRef(transform, frustumPlanes[0]);\r\n\r\n // Far\r\n Frustum.GetFarPlaneToRef(transform, frustumPlanes[1]);\r\n\r\n // Left\r\n Frustum.GetLeftPlaneToRef(transform, frustumPlanes[2]);\r\n\r\n // Right\r\n Frustum.GetRightPlaneToRef(transform, frustumPlanes[3]);\r\n\r\n // Top\r\n Frustum.GetTopPlaneToRef(transform, frustumPlanes[4]);\r\n\r\n // Bottom\r\n Frustum.GetBottomPlaneToRef(transform, frustumPlanes[5]);\r\n }\r\n\r\n /**\r\n * Tests if a point is located between the frustum planes.\r\n * @param point defines the point to test\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if the point is located between the frustum planes\r\n */\r\n public static IsPointInFrustum(point: Vector3, frustumPlanes: Array>): boolean {\r\n for (let i = 0; i < 6; i++) {\r\n if (frustumPlanes[i].dotCoordinate(point) < 0) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n", "import type { EventState, Observable, Observer } from \"../Misc/observable\";\r\nimport { PointerInfoPre, PointerInfo, PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { Nullable } from \"../types\";\r\nimport { AbstractActionManager } from \"../Actions/abstractActionManager\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport { Vector2, Matrix } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { ActionEvent } from \"../Actions/actionEvent\";\r\nimport { KeyboardEventTypes, KeyboardInfoPre, KeyboardInfo } from \"../Events/keyboardEvents\";\r\nimport { DeviceType, PointerInput } from \"../DeviceInput/InputDevices/deviceEnums\";\r\nimport type { IKeyboardEvent, IMouseEvent, IPointerEvent } from \"../Events/deviceInputEvents\";\r\nimport { DeviceSourceManager } from \"../DeviceInput/InputDevices/deviceSourceManager\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\nimport type { Scene } from \"../scene\";\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nclass _ClickInfo {\r\n private _singleClick = false;\r\n private _doubleClick = false;\r\n private _hasSwiped = false;\r\n private _ignore = false;\r\n\r\n public get singleClick(): boolean {\r\n return this._singleClick;\r\n }\r\n public get doubleClick(): boolean {\r\n return this._doubleClick;\r\n }\r\n public get hasSwiped(): boolean {\r\n return this._hasSwiped;\r\n }\r\n public get ignore(): boolean {\r\n return this._ignore;\r\n }\r\n\r\n public set singleClick(b: boolean) {\r\n this._singleClick = b;\r\n }\r\n public set doubleClick(b: boolean) {\r\n this._doubleClick = b;\r\n }\r\n public set hasSwiped(b: boolean) {\r\n this._hasSwiped = b;\r\n }\r\n public set ignore(b: boolean) {\r\n this._ignore = b;\r\n }\r\n}\r\n\r\n/** @internal */\r\ninterface _IClickEvent {\r\n clickInfo: _ClickInfo;\r\n evt: IPointerEvent;\r\n timeoutId: number;\r\n}\r\n\r\n/**\r\n * Class used to manage all inputs for the scene.\r\n */\r\nexport class InputManager {\r\n /** The distance in pixel that you have to move to prevent some events */\r\n public static DragMovementThreshold = 10; // in pixels\r\n /** Time in milliseconds to wait to raise long press events if button is still pressed */\r\n public static LongPressDelay = 500; // in milliseconds\r\n /** Time in milliseconds with two consecutive clicks will be considered as a double click */\r\n public static DoubleClickDelay = 300; // in milliseconds\r\n /**\r\n * This flag will modify the behavior so that, when true, a click will happen if and only if\r\n * another click DOES NOT happen within the DoubleClickDelay time frame. If another click does\r\n * happen within that time frame, the first click will not fire an event and and a double click will occur.\r\n */\r\n public static ExclusiveDoubleClickMode = false;\r\n\r\n /** This is a defensive check to not allow control attachment prior to an already active one. If already attached, previous control is unattached before attaching the new one. */\r\n private _alreadyAttached = false;\r\n private _alreadyAttachedTo: Nullable;\r\n\r\n // Pointers\r\n private _onPointerMove: (evt: IMouseEvent) => void;\r\n private _onPointerDown: (evt: IPointerEvent) => void;\r\n private _onPointerUp: (evt: IPointerEvent) => void;\r\n\r\n private _initClickEvent: (\r\n obs1: Observable,\r\n obs2: Observable,\r\n evt: IPointerEvent,\r\n cb: (clickInfo: _ClickInfo, pickResult: Nullable) => void\r\n ) => void;\r\n private _initActionManager: (act: Nullable, clickInfo: _ClickInfo) => Nullable;\r\n private _delayedSimpleClick: (btn: number, clickInfo: _ClickInfo, cb: (clickInfo: _ClickInfo, pickResult: Nullable) => void) => void;\r\n private _meshPickProceed = false;\r\n\r\n private _previousButtonPressed: number;\r\n private _currentPickResult: Nullable = null;\r\n private _previousPickResult: Nullable = null;\r\n private _totalPointersPressed = 0;\r\n private _doubleClickOccured = false;\r\n private _isSwiping: boolean = false;\r\n private _swipeButtonPressed: number = -1;\r\n private _skipPointerTap: boolean = false;\r\n private _isMultiTouchGesture: boolean = false;\r\n\r\n private _pointerOverMesh: Nullable;\r\n\r\n private _pickedDownMesh: Nullable;\r\n private _pickedUpMesh: Nullable;\r\n\r\n private _pointerX: number = 0;\r\n private _pointerY: number = 0;\r\n private _unTranslatedPointerX: number;\r\n private _unTranslatedPointerY: number;\r\n private _startingPointerPosition = new Vector2(0, 0);\r\n private _previousStartingPointerPosition = new Vector2(0, 0);\r\n private _startingPointerTime = 0;\r\n private _previousStartingPointerTime = 0;\r\n private _pointerCaptures: { [pointerId: number]: boolean } = {};\r\n private _meshUnderPointerId: { [pointerId: number]: Nullable } = {};\r\n private _movePointerInfo: Nullable = null;\r\n private _cameraObserverCount = 0;\r\n private _delayedClicks: Array> = [null, null, null, null, null];\r\n\r\n // Keyboard\r\n private _onKeyDown: (evt: IKeyboardEvent) => void;\r\n private _onKeyUp: (evt: IKeyboardEvent) => void;\r\n\r\n private _scene: Scene;\r\n private _deviceSourceManager: Nullable = null;\r\n\r\n /**\r\n * Creates a new InputManager\r\n * @param scene - defines the hosting scene\r\n */\r\n constructor(scene?: Scene) {\r\n this._scene = scene || EngineStore.LastCreatedScene;\r\n if (!this._scene) {\r\n return;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the mesh that is currently under the pointer\r\n * @returns Mesh that the pointer is pointer is hovering over\r\n */\r\n public get meshUnderPointer(): Nullable {\r\n if (this._movePointerInfo) {\r\n // Because _pointerOverMesh is populated as part of _pickMove, we need to force a pick to update it.\r\n // Calling _pickMove calls _setCursorAndPointerOverMesh which calls setPointerOverMesh\r\n this._movePointerInfo._generatePickInfo();\r\n // Once we have what we need, we can clear _movePointerInfo because we don't need it anymore\r\n this._movePointerInfo = null;\r\n }\r\n return this._pointerOverMesh;\r\n }\r\n\r\n /**\r\n * When using more than one pointer (for example in XR) you can get the mesh under the specific pointer\r\n * @param pointerId - the pointer id to use\r\n * @returns The mesh under this pointer id or null if not found\r\n */\r\n public getMeshUnderPointerByPointerId(pointerId: number): Nullable {\r\n return this._meshUnderPointerId[pointerId] || null;\r\n }\r\n\r\n /**\r\n * Gets the pointer coordinates in 2D without any translation (ie. straight out of the pointer event)\r\n * @returns Vector with X/Y values directly from pointer event\r\n */\r\n public get unTranslatedPointer(): Vector2 {\r\n return new Vector2(this._unTranslatedPointerX, this._unTranslatedPointerY);\r\n }\r\n\r\n /**\r\n * Gets or sets the current on-screen X position of the pointer\r\n * @returns Translated X with respect to screen\r\n */\r\n public get pointerX(): number {\r\n return this._pointerX;\r\n }\r\n\r\n public set pointerX(value: number) {\r\n this._pointerX = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the current on-screen Y position of the pointer\r\n * @returns Translated Y with respect to screen\r\n */\r\n public get pointerY(): number {\r\n return this._pointerY;\r\n }\r\n\r\n public set pointerY(value: number) {\r\n this._pointerY = value;\r\n }\r\n\r\n private _updatePointerPosition(evt: IPointerEvent): void {\r\n const canvasRect = this._scene.getEngine().getInputElementClientRect();\r\n\r\n if (!canvasRect) {\r\n return;\r\n }\r\n\r\n this._pointerX = evt.clientX - canvasRect.left;\r\n this._pointerY = evt.clientY - canvasRect.top;\r\n\r\n this._unTranslatedPointerX = this._pointerX;\r\n this._unTranslatedPointerY = this._pointerY;\r\n }\r\n\r\n private _processPointerMove(pickResult: Nullable, evt: IPointerEvent) {\r\n const scene = this._scene;\r\n const engine = scene.getEngine();\r\n const canvas = engine.getInputElement();\r\n\r\n if (canvas) {\r\n canvas.tabIndex = engine.canvasTabIndex;\r\n\r\n // Restore pointer\r\n if (!scene.doNotHandleCursors) {\r\n canvas.style.cursor = scene.defaultCursor;\r\n }\r\n }\r\n\r\n this._setCursorAndPointerOverMesh(pickResult, evt, scene);\r\n\r\n for (const step of scene._pointerMoveStage) {\r\n // If _pointerMoveState is defined, we have an active spriteManager and can't use Lazy Picking\r\n // Therefore, we need to force a pick to update the pickResult\r\n pickResult = pickResult || this._pickMove(evt);\r\n const isMeshPicked = pickResult?.pickedMesh ? true : false;\r\n pickResult = step.action(this._unTranslatedPointerX, this._unTranslatedPointerY, pickResult, isMeshPicked, canvas);\r\n }\r\n\r\n const type = evt.inputIndex >= PointerInput.MouseWheelX && evt.inputIndex <= PointerInput.MouseWheelZ ? PointerEventTypes.POINTERWHEEL : PointerEventTypes.POINTERMOVE;\r\n\r\n if (scene.onPointerMove) {\r\n // Because of lazy picking, we need to force a pick to update the pickResult\r\n pickResult = pickResult || this._pickMove(evt);\r\n scene.onPointerMove(evt, pickResult, type);\r\n }\r\n\r\n let pointerInfo: PointerInfo;\r\n if (pickResult) {\r\n pointerInfo = new PointerInfo(type, evt, pickResult);\r\n this._setRayOnPointerInfo(pickResult, evt);\r\n } else {\r\n pointerInfo = new PointerInfo(type, evt, null, this);\r\n this._movePointerInfo = pointerInfo;\r\n }\r\n\r\n if (scene.onPointerObservable.hasObservers()) {\r\n scene.onPointerObservable.notifyObservers(pointerInfo, type);\r\n }\r\n }\r\n\r\n // Pointers handling\r\n /** @internal */\r\n public _setRayOnPointerInfo(pickInfo: Nullable, event: IMouseEvent) {\r\n const scene = this._scene;\r\n if (pickInfo && scene._pickingAvailable) {\r\n if (!pickInfo.ray) {\r\n pickInfo.ray = scene.createPickingRay(event.offsetX, event.offsetY, Matrix.Identity(), scene.activeCamera);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _addCameraPointerObserver(observer: (p: PointerInfo, s: EventState) => void, mask?: number): Nullable> {\r\n this._cameraObserverCount++;\r\n return this._scene.onPointerObservable.add(observer, mask);\r\n }\r\n\r\n /** @internal */\r\n public _removeCameraPointerObserver(observer: Observer): boolean {\r\n this._cameraObserverCount--;\r\n return this._scene.onPointerObservable.remove(observer);\r\n }\r\n\r\n private _checkForPicking(): boolean {\r\n return !!(this._scene.onPointerObservable.observers.length > this._cameraObserverCount || this._scene.onPointerPick);\r\n }\r\n\r\n private _checkPrePointerObservable(pickResult: Nullable, evt: IPointerEvent, type: number) {\r\n const scene = this._scene;\r\n const pi = new PointerInfoPre(type, evt, this._unTranslatedPointerX, this._unTranslatedPointerY);\r\n if (pickResult) {\r\n pi.originalPickingInfo = pickResult;\r\n pi.ray = pickResult.ray;\r\n if (evt.pointerType === \"xr-near\" && pickResult.originMesh) {\r\n pi.nearInteractionPickingInfo = pickResult;\r\n }\r\n }\r\n\r\n scene.onPrePointerObservable.notifyObservers(pi, type);\r\n if (pi.skipOnPointerObservable) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _pickMove(evt: IPointerEvent): PickingInfo {\r\n const scene = this._scene;\r\n const pickResult = scene.pick(\r\n this._unTranslatedPointerX,\r\n this._unTranslatedPointerY,\r\n scene.pointerMovePredicate,\r\n scene.pointerMoveFastCheck,\r\n scene.cameraToUseForPointers,\r\n scene.pointerMoveTrianglePredicate\r\n );\r\n\r\n this._setCursorAndPointerOverMesh(pickResult, evt, scene);\r\n\r\n return pickResult;\r\n }\r\n\r\n private _setCursorAndPointerOverMesh(pickResult: Nullable, evt: IPointerEvent, scene: Scene) {\r\n const engine = scene.getEngine();\r\n const canvas = engine.getInputElement();\r\n\r\n if (pickResult?.pickedMesh) {\r\n this.setPointerOverMesh(pickResult.pickedMesh, evt.pointerId, pickResult, evt);\r\n\r\n if (!scene.doNotHandleCursors && canvas && this._pointerOverMesh) {\r\n const actionManager = this._pointerOverMesh._getActionManagerForTrigger();\r\n if (actionManager && actionManager.hasPointerTriggers) {\r\n canvas.style.cursor = actionManager.hoverCursor || scene.hoverCursor;\r\n }\r\n }\r\n } else {\r\n this.setPointerOverMesh(null, evt.pointerId, pickResult, evt);\r\n }\r\n }\r\n\r\n /**\r\n * Use this method to simulate a pointer move on a mesh\r\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\r\n * @param pickResult - pickingInfo of the object wished to simulate pointer event on\r\n * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\r\n */\r\n public simulatePointerMove(pickResult: PickingInfo, pointerEventInit?: PointerEventInit): void {\r\n const evt = new PointerEvent(\"pointermove\", pointerEventInit);\r\n evt.inputIndex = PointerInput.Move;\r\n\r\n if (this._checkPrePointerObservable(pickResult, evt, PointerEventTypes.POINTERMOVE)) {\r\n return;\r\n }\r\n this._processPointerMove(pickResult, evt);\r\n }\r\n\r\n /**\r\n * Use this method to simulate a pointer down on a mesh\r\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\r\n * @param pickResult - pickingInfo of the object wished to simulate pointer event on\r\n * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\r\n */\r\n public simulatePointerDown(pickResult: PickingInfo, pointerEventInit?: PointerEventInit): void {\r\n const evt = new PointerEvent(\"pointerdown\", pointerEventInit);\r\n evt.inputIndex = evt.button + 2;\r\n\r\n if (this._checkPrePointerObservable(pickResult, evt, PointerEventTypes.POINTERDOWN)) {\r\n return;\r\n }\r\n\r\n this._processPointerDown(pickResult, evt);\r\n }\r\n\r\n private _processPointerDown(pickResult: Nullable, evt: IPointerEvent): void {\r\n const scene = this._scene;\r\n if (pickResult?.pickedMesh) {\r\n this._pickedDownMesh = pickResult.pickedMesh;\r\n const actionManager = pickResult.pickedMesh._getActionManagerForTrigger();\r\n if (actionManager) {\r\n if (actionManager.hasPickTriggers) {\r\n actionManager.processTrigger(Constants.ACTION_OnPickDownTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n switch (evt.button) {\r\n case 0:\r\n actionManager.processTrigger(Constants.ACTION_OnLeftPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n break;\r\n case 1:\r\n actionManager.processTrigger(Constants.ACTION_OnCenterPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n break;\r\n case 2:\r\n actionManager.processTrigger(Constants.ACTION_OnRightPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n break;\r\n }\r\n }\r\n\r\n if (actionManager.hasSpecificTrigger(Constants.ACTION_OnLongPressTrigger)) {\r\n window.setTimeout(() => {\r\n const pickResult = scene.pick(\r\n this._unTranslatedPointerX,\r\n this._unTranslatedPointerY,\r\n (mesh: AbstractMesh): boolean =>\r\n (\r\n (mesh.isPickable &&\r\n mesh.isVisible &&\r\n mesh.isReady() &&\r\n mesh.actionManager &&\r\n mesh.actionManager.hasSpecificTrigger(Constants.ACTION_OnLongPressTrigger) &&\r\n mesh === this._pickedDownMesh)\r\n ),\r\n false,\r\n scene.cameraToUseForPointers\r\n );\r\n\r\n if (pickResult?.pickedMesh && actionManager) {\r\n if (this._totalPointersPressed !== 0 && Date.now() - this._startingPointerTime > InputManager.LongPressDelay && !this._isPointerSwiping()) {\r\n this._startingPointerTime = 0;\r\n actionManager.processTrigger(Constants.ACTION_OnLongPressTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt));\r\n }\r\n }\r\n }, InputManager.LongPressDelay);\r\n }\r\n }\r\n } else {\r\n for (const step of scene._pointerDownStage) {\r\n pickResult = step.action(this._unTranslatedPointerX, this._unTranslatedPointerY, pickResult, evt, false);\r\n }\r\n }\r\n\r\n let pointerInfo: PointerInfo;\r\n const type = PointerEventTypes.POINTERDOWN;\r\n\r\n if (pickResult) {\r\n if (scene.onPointerDown) {\r\n scene.onPointerDown(evt, pickResult, type);\r\n }\r\n\r\n pointerInfo = new PointerInfo(type, evt, pickResult);\r\n this._setRayOnPointerInfo(pickResult, evt);\r\n } else {\r\n pointerInfo = new PointerInfo(type, evt, null, this);\r\n }\r\n\r\n if (scene.onPointerObservable.hasObservers()) {\r\n scene.onPointerObservable.notifyObservers(pointerInfo, type);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * @internals Boolean if delta for pointer exceeds drag movement threshold\r\n */\r\n public _isPointerSwiping(): boolean {\r\n return this._isSwiping;\r\n }\r\n\r\n /**\r\n * Use this method to simulate a pointer up on a mesh\r\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\r\n * @param pickResult - pickingInfo of the object wished to simulate pointer event on\r\n * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\r\n * @param doubleTap - indicates that the pointer up event should be considered as part of a double click (false by default)\r\n */\r\n public simulatePointerUp(pickResult: PickingInfo, pointerEventInit?: PointerEventInit, doubleTap?: boolean): void {\r\n const evt = new PointerEvent(\"pointerup\", pointerEventInit);\r\n evt.inputIndex = PointerInput.Move;\r\n const clickInfo = new _ClickInfo();\r\n\r\n if (doubleTap) {\r\n clickInfo.doubleClick = true;\r\n } else {\r\n clickInfo.singleClick = true;\r\n }\r\n\r\n if (this._checkPrePointerObservable(pickResult, evt, PointerEventTypes.POINTERUP)) {\r\n return;\r\n }\r\n\r\n this._processPointerUp(pickResult, evt, clickInfo);\r\n }\r\n\r\n private _processPointerUp(pickResult: Nullable, evt: IPointerEvent, clickInfo: _ClickInfo): void {\r\n const scene = this._scene;\r\n if (pickResult?.pickedMesh) {\r\n this._pickedUpMesh = pickResult.pickedMesh;\r\n if (this._pickedDownMesh === this._pickedUpMesh) {\r\n if (scene.onPointerPick) {\r\n scene.onPointerPick(evt, pickResult);\r\n }\r\n if (clickInfo.singleClick && !clickInfo.ignore && scene.onPointerObservable.observers.length > this._cameraObserverCount) {\r\n const type = PointerEventTypes.POINTERPICK;\r\n const pi = new PointerInfo(type, evt, pickResult);\r\n this._setRayOnPointerInfo(pickResult, evt);\r\n scene.onPointerObservable.notifyObservers(pi, type);\r\n }\r\n }\r\n const actionManager = pickResult.pickedMesh._getActionManagerForTrigger();\r\n if (actionManager && !clickInfo.ignore) {\r\n actionManager.processTrigger(Constants.ACTION_OnPickUpTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n\r\n if (!clickInfo.hasSwiped && clickInfo.singleClick) {\r\n actionManager.processTrigger(Constants.ACTION_OnPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n }\r\n\r\n const doubleClickActionManager = pickResult.pickedMesh._getActionManagerForTrigger(Constants.ACTION_OnDoublePickTrigger);\r\n if (clickInfo.doubleClick && doubleClickActionManager) {\r\n doubleClickActionManager.processTrigger(Constants.ACTION_OnDoublePickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt, pickResult));\r\n }\r\n }\r\n } else {\r\n if (!clickInfo.ignore) {\r\n for (const step of scene._pointerUpStage) {\r\n pickResult = step.action(this._unTranslatedPointerX, this._unTranslatedPointerY, pickResult, evt, clickInfo.doubleClick);\r\n }\r\n }\r\n }\r\n\r\n if (this._pickedDownMesh && this._pickedDownMesh !== this._pickedUpMesh) {\r\n const pickedDownActionManager = this._pickedDownMesh._getActionManagerForTrigger(Constants.ACTION_OnPickOutTrigger);\r\n if (pickedDownActionManager) {\r\n pickedDownActionManager.processTrigger(Constants.ACTION_OnPickOutTrigger, ActionEvent.CreateNew(this._pickedDownMesh, evt));\r\n }\r\n }\r\n\r\n if (!clickInfo.ignore) {\r\n const pi = new PointerInfo(PointerEventTypes.POINTERUP, evt, pickResult);\r\n // Set ray on picking info. Note that this info will also be reused for the tap notification.\r\n this._setRayOnPointerInfo(pickResult, evt);\r\n scene.onPointerObservable.notifyObservers(pi, PointerEventTypes.POINTERUP);\r\n\r\n if (scene.onPointerUp) {\r\n scene.onPointerUp(evt, pickResult, PointerEventTypes.POINTERUP);\r\n }\r\n\r\n if (!clickInfo.hasSwiped && !this._skipPointerTap && !this._isMultiTouchGesture) {\r\n let type = 0;\r\n if (clickInfo.singleClick) {\r\n type = PointerEventTypes.POINTERTAP;\r\n } else if (clickInfo.doubleClick) {\r\n type = PointerEventTypes.POINTERDOUBLETAP;\r\n }\r\n\r\n if (type) {\r\n const pi = new PointerInfo(type, evt, pickResult);\r\n if (scene.onPointerObservable.hasObservers() && scene.onPointerObservable.hasSpecificMask(type)) {\r\n scene.onPointerObservable.notifyObservers(pi, type);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down)\r\n * @param pointerId - defines the pointer id to use in a multi-touch scenario (0 by default)\r\n * @returns true if the pointer was captured\r\n */\r\n public isPointerCaptured(pointerId = 0): boolean {\r\n return this._pointerCaptures[pointerId];\r\n }\r\n\r\n /**\r\n * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp\r\n * @param attachUp - defines if you want to attach events to pointerup\r\n * @param attachDown - defines if you want to attach events to pointerdown\r\n * @param attachMove - defines if you want to attach events to pointermove\r\n * @param elementToAttachTo - defines the target DOM element to attach to (will use the canvas by default)\r\n */\r\n public attachControl(attachUp = true, attachDown = true, attachMove = true, elementToAttachTo: Nullable = null): void {\r\n const scene = this._scene;\r\n const engine = scene.getEngine();\r\n\r\n if (!elementToAttachTo) {\r\n elementToAttachTo = engine.getInputElement();\r\n }\r\n\r\n if (this._alreadyAttached) {\r\n this.detachControl();\r\n }\r\n\r\n if (elementToAttachTo) {\r\n this._alreadyAttachedTo = elementToAttachTo;\r\n }\r\n this._deviceSourceManager = new DeviceSourceManager(engine);\r\n\r\n // Because this is only called from _initClickEvent, which is called in _onPointerUp, we'll use the pointerUpPredicate for the pick call\r\n this._initActionManager = (act: Nullable): Nullable => {\r\n if (!this._meshPickProceed) {\r\n const pickResult =\r\n scene.skipPointerUpPicking || (scene._registeredActions === 0 && !this._checkForPicking() && !scene.onPointerUp)\r\n ? null\r\n : scene.pick(\r\n this._unTranslatedPointerX,\r\n this._unTranslatedPointerY,\r\n scene.pointerUpPredicate,\r\n scene.pointerUpFastCheck,\r\n scene.cameraToUseForPointers,\r\n scene.pointerUpTrianglePredicate\r\n );\r\n this._currentPickResult = pickResult;\r\n if (pickResult) {\r\n act = pickResult.hit && pickResult.pickedMesh ? pickResult.pickedMesh._getActionManagerForTrigger() : null;\r\n }\r\n this._meshPickProceed = true;\r\n }\r\n return act;\r\n };\r\n\r\n this._delayedSimpleClick = (btn: number, clickInfo: _ClickInfo, cb: (clickInfo: _ClickInfo, pickResult: Nullable) => void) => {\r\n // double click delay is over and that no double click has been raised since, or the 2 consecutive keys pressed are different\r\n if ((Date.now() - this._previousStartingPointerTime > InputManager.DoubleClickDelay && !this._doubleClickOccured) || btn !== this._previousButtonPressed) {\r\n this._doubleClickOccured = false;\r\n clickInfo.singleClick = true;\r\n clickInfo.ignore = false;\r\n\r\n // If we have a delayed click, we need to resolve the TAP event\r\n if (this._delayedClicks[btn]) {\r\n const evt = this._delayedClicks[btn]!.evt;\r\n const type = PointerEventTypes.POINTERTAP;\r\n const pi = new PointerInfo(type, evt, this._currentPickResult);\r\n if (scene.onPointerObservable.hasObservers() && scene.onPointerObservable.hasSpecificMask(type)) {\r\n scene.onPointerObservable.notifyObservers(pi, type);\r\n }\r\n\r\n // Clear the delayed click\r\n this._delayedClicks[btn] = null;\r\n }\r\n }\r\n };\r\n\r\n this._initClickEvent = (\r\n obs1: Observable,\r\n obs2: Observable,\r\n evt: IPointerEvent,\r\n cb: (clickInfo: _ClickInfo, pickResult: Nullable) => void\r\n ): void => {\r\n const clickInfo = new _ClickInfo();\r\n this._currentPickResult = null;\r\n let act: Nullable = null;\r\n\r\n let checkPicking =\r\n obs1.hasSpecificMask(PointerEventTypes.POINTERPICK) ||\r\n obs2.hasSpecificMask(PointerEventTypes.POINTERPICK) ||\r\n obs1.hasSpecificMask(PointerEventTypes.POINTERTAP) ||\r\n obs2.hasSpecificMask(PointerEventTypes.POINTERTAP) ||\r\n obs1.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP) ||\r\n obs2.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP);\r\n if (!checkPicking && AbstractActionManager) {\r\n act = this._initActionManager(act, clickInfo);\r\n if (act) {\r\n checkPicking = act.hasPickTriggers;\r\n }\r\n }\r\n\r\n let needToIgnoreNext = false;\r\n\r\n if (checkPicking) {\r\n const btn = evt.button;\r\n clickInfo.hasSwiped = this._isPointerSwiping();\r\n\r\n if (!clickInfo.hasSwiped) {\r\n let checkSingleClickImmediately = !InputManager.ExclusiveDoubleClickMode;\r\n\r\n if (!checkSingleClickImmediately) {\r\n checkSingleClickImmediately = !obs1.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP) && !obs2.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP);\r\n\r\n if (checkSingleClickImmediately && !AbstractActionManager.HasSpecificTrigger(Constants.ACTION_OnDoublePickTrigger)) {\r\n act = this._initActionManager(act, clickInfo);\r\n if (act) {\r\n checkSingleClickImmediately = !act.hasSpecificTrigger(Constants.ACTION_OnDoublePickTrigger);\r\n }\r\n }\r\n }\r\n\r\n if (checkSingleClickImmediately) {\r\n // single click detected if double click delay is over or two different successive keys pressed without exclusive double click or no double click required\r\n if (Date.now() - this._previousStartingPointerTime > InputManager.DoubleClickDelay || btn !== this._previousButtonPressed) {\r\n clickInfo.singleClick = true;\r\n cb(clickInfo, this._currentPickResult);\r\n needToIgnoreNext = true;\r\n }\r\n }\r\n // at least one double click is required to be check and exclusive double click is enabled\r\n else {\r\n // Queue up a delayed click, just in case this isn't a double click\r\n // It should be noted that while this delayed event happens\r\n // because of user input, it shouldn't be considered as a direct,\r\n // timing-dependent result of that input. It's meant to just fire the TAP event\r\n const delayedClick = {\r\n evt: evt,\r\n clickInfo: clickInfo,\r\n timeoutId: window.setTimeout(this._delayedSimpleClick.bind(this, btn, clickInfo, cb), InputManager.DoubleClickDelay),\r\n };\r\n\r\n this._delayedClicks[btn] = delayedClick;\r\n }\r\n\r\n let checkDoubleClick = obs1.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP) || obs2.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP);\r\n if (!checkDoubleClick && AbstractActionManager.HasSpecificTrigger(Constants.ACTION_OnDoublePickTrigger)) {\r\n act = this._initActionManager(act, clickInfo);\r\n if (act) {\r\n checkDoubleClick = act.hasSpecificTrigger(Constants.ACTION_OnDoublePickTrigger);\r\n }\r\n }\r\n if (checkDoubleClick) {\r\n // two successive keys pressed are equal, double click delay is not over and double click has not just occurred\r\n if (btn === this._previousButtonPressed && Date.now() - this._previousStartingPointerTime < InputManager.DoubleClickDelay && !this._doubleClickOccured) {\r\n // pointer has not moved for 2 clicks, it's a double click\r\n if (!clickInfo.hasSwiped && !this._isPointerSwiping()) {\r\n this._previousStartingPointerTime = 0;\r\n this._doubleClickOccured = true;\r\n clickInfo.doubleClick = true;\r\n clickInfo.ignore = false;\r\n // If we have a pending click, we need to cancel it\r\n if (InputManager.ExclusiveDoubleClickMode && this._delayedClicks[btn]) {\r\n clearTimeout(this._delayedClicks[btn]?.timeoutId);\r\n this._delayedClicks[btn] = null;\r\n }\r\n\r\n cb(clickInfo, this._currentPickResult);\r\n }\r\n // if the two successive clicks are too far, it's just two simple clicks\r\n else {\r\n this._doubleClickOccured = false;\r\n this._previousStartingPointerTime = this._startingPointerTime;\r\n this._previousStartingPointerPosition.x = this._startingPointerPosition.x;\r\n this._previousStartingPointerPosition.y = this._startingPointerPosition.y;\r\n this._previousButtonPressed = btn;\r\n if (InputManager.ExclusiveDoubleClickMode) {\r\n // If we have a delayed click, we need to cancel it\r\n if (this._delayedClicks[btn]) {\r\n clearTimeout(this._delayedClicks[btn]?.timeoutId);\r\n this._delayedClicks[btn] = null;\r\n }\r\n cb(clickInfo, this._previousPickResult);\r\n } else {\r\n cb(clickInfo, this._currentPickResult);\r\n }\r\n }\r\n needToIgnoreNext = true;\r\n }\r\n // just the first click of the double has been raised\r\n else {\r\n this._doubleClickOccured = false;\r\n this._previousStartingPointerTime = this._startingPointerTime;\r\n this._previousStartingPointerPosition.x = this._startingPointerPosition.x;\r\n this._previousStartingPointerPosition.y = this._startingPointerPosition.y;\r\n this._previousButtonPressed = btn!;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Even if ExclusiveDoubleClickMode is true, we need to always handle\r\n // up events at time of execution, unless we're explicitly ignoring them.\r\n if (!needToIgnoreNext) {\r\n cb(clickInfo, this._currentPickResult);\r\n }\r\n };\r\n\r\n this._onPointerMove = (evt: IMouseEvent) => {\r\n this._updatePointerPosition(evt as IPointerEvent);\r\n\r\n // Check if pointer leaves DragMovementThreshold range to determine if swipe is occurring\r\n if (!this._isSwiping && this._swipeButtonPressed !== -1) {\r\n this._isSwiping =\r\n Math.abs(this._startingPointerPosition.x - this._pointerX) > InputManager.DragMovementThreshold ||\r\n Math.abs(this._startingPointerPosition.y - this._pointerY) > InputManager.DragMovementThreshold;\r\n }\r\n\r\n // Because there's a race condition between pointermove and pointerlockchange events, we need to\r\n // verify that the pointer is still locked after each pointermove event.\r\n if (engine.isPointerLock) {\r\n engine._verifyPointerLock();\r\n }\r\n\r\n // PreObservable support\r\n if (\r\n this._checkPrePointerObservable(\r\n null,\r\n evt as IPointerEvent,\r\n evt.inputIndex >= PointerInput.MouseWheelX && evt.inputIndex <= PointerInput.MouseWheelZ ? PointerEventTypes.POINTERWHEEL : PointerEventTypes.POINTERMOVE\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n if (!scene.cameraToUseForPointers && !scene.activeCamera) {\r\n return;\r\n }\r\n\r\n if (scene.skipPointerMovePicking) {\r\n this._processPointerMove(new PickingInfo(), evt as IPointerEvent);\r\n return;\r\n }\r\n\r\n if (!scene.pointerMovePredicate) {\r\n scene.pointerMovePredicate = (mesh: AbstractMesh): boolean =>\r\n mesh.isPickable &&\r\n mesh.isVisible &&\r\n mesh.isReady() &&\r\n mesh.isEnabled() &&\r\n (mesh.enablePointerMoveEvents || scene.constantlyUpdateMeshUnderPointer || mesh._getActionManagerForTrigger() !== null) &&\r\n (!scene.cameraToUseForPointers || (scene.cameraToUseForPointers.layerMask & mesh.layerMask) !== 0);\r\n }\r\n\r\n const pickResult = scene._registeredActions > 0 || scene.constantlyUpdateMeshUnderPointer ? this._pickMove(evt as IPointerEvent) : null;\r\n this._processPointerMove(pickResult, evt as IPointerEvent);\r\n };\r\n\r\n this._onPointerDown = (evt: IPointerEvent) => {\r\n this._totalPointersPressed++;\r\n this._pickedDownMesh = null;\r\n this._meshPickProceed = false;\r\n\r\n // If ExclusiveDoubleClickMode is true, we need to resolve any pending delayed clicks\r\n if (InputManager.ExclusiveDoubleClickMode) {\r\n for (let i = 0; i < this._delayedClicks.length; i++) {\r\n if (this._delayedClicks[i]) {\r\n // If the button that was pressed is the same as the one that was released,\r\n // just clear the timer. This will be resolved in the up event.\r\n if (evt.button === i) {\r\n clearTimeout(this._delayedClicks[i]?.timeoutId);\r\n } else {\r\n // Otherwise, we need to resolve the click\r\n const clickInfo = this._delayedClicks[i]!.clickInfo;\r\n this._doubleClickOccured = false;\r\n clickInfo.singleClick = true;\r\n clickInfo.ignore = false;\r\n\r\n const prevEvt = this._delayedClicks[i]!.evt;\r\n const type = PointerEventTypes.POINTERTAP;\r\n const pi = new PointerInfo(type, prevEvt, this._currentPickResult);\r\n if (scene.onPointerObservable.hasObservers() && scene.onPointerObservable.hasSpecificMask(type)) {\r\n scene.onPointerObservable.notifyObservers(pi, type);\r\n }\r\n\r\n // Clear the delayed click\r\n this._delayedClicks[i] = null;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._updatePointerPosition(evt);\r\n\r\n if (this._swipeButtonPressed === -1) {\r\n this._swipeButtonPressed = evt.button;\r\n }\r\n\r\n if (scene.preventDefaultOnPointerDown && elementToAttachTo) {\r\n evt.preventDefault();\r\n elementToAttachTo.focus();\r\n }\r\n\r\n this._startingPointerPosition.x = this._pointerX;\r\n this._startingPointerPosition.y = this._pointerY;\r\n this._startingPointerTime = Date.now();\r\n\r\n // PreObservable support\r\n if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERDOWN)) {\r\n return;\r\n }\r\n\r\n if (!scene.cameraToUseForPointers && !scene.activeCamera) {\r\n return;\r\n }\r\n\r\n this._pointerCaptures[evt.pointerId] = true;\r\n\r\n if (!scene.pointerDownPredicate) {\r\n scene.pointerDownPredicate = (mesh: AbstractMesh): boolean => {\r\n return (\r\n mesh.isPickable &&\r\n mesh.isVisible &&\r\n mesh.isReady() &&\r\n mesh.isEnabled() &&\r\n (!scene.cameraToUseForPointers || (scene.cameraToUseForPointers.layerMask & mesh.layerMask) !== 0)\r\n );\r\n };\r\n }\r\n\r\n // Meshes\r\n this._pickedDownMesh = null;\r\n let pickResult;\r\n if (scene.skipPointerDownPicking || (scene._registeredActions === 0 && !this._checkForPicking() && !scene.onPointerDown)) {\r\n pickResult = new PickingInfo();\r\n } else {\r\n pickResult = scene.pick(\r\n this._unTranslatedPointerX,\r\n this._unTranslatedPointerY,\r\n scene.pointerDownPredicate,\r\n scene.pointerDownFastCheck,\r\n scene.cameraToUseForPointers,\r\n scene.pointerDownTrianglePredicate\r\n );\r\n }\r\n\r\n this._processPointerDown(pickResult, evt);\r\n };\r\n\r\n this._onPointerUp = (evt: IPointerEvent) => {\r\n if (this._totalPointersPressed === 0) {\r\n // We are attaching the pointer up to windows because of a bug in FF\r\n return; // So we need to test it the pointer down was pressed before.\r\n }\r\n\r\n this._totalPointersPressed--;\r\n this._pickedUpMesh = null;\r\n this._meshPickProceed = false;\r\n\r\n this._updatePointerPosition(evt);\r\n\r\n if (scene.preventDefaultOnPointerUp && elementToAttachTo) {\r\n evt.preventDefault();\r\n elementToAttachTo.focus();\r\n }\r\n\r\n this._initClickEvent(scene.onPrePointerObservable, scene.onPointerObservable, evt, (clickInfo: _ClickInfo, pickResult: Nullable) => {\r\n // PreObservable support\r\n if (scene.onPrePointerObservable.hasObservers()) {\r\n this._skipPointerTap = false;\r\n if (!clickInfo.ignore) {\r\n if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERUP)) {\r\n // If we're skipping the next observable, we need to reset the swipe state before returning\r\n if (this._swipeButtonPressed === evt.button) {\r\n this._isSwiping = false;\r\n this._swipeButtonPressed = -1;\r\n }\r\n\r\n // If we're going to skip the POINTERUP, we need to reset the pointer capture\r\n if (evt.buttons === 0) {\r\n this._pointerCaptures[evt.pointerId] = false;\r\n }\r\n\r\n return;\r\n }\r\n if (!clickInfo.hasSwiped) {\r\n if (clickInfo.singleClick && scene.onPrePointerObservable.hasSpecificMask(PointerEventTypes.POINTERTAP)) {\r\n if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERTAP)) {\r\n this._skipPointerTap = true;\r\n }\r\n }\r\n if (clickInfo.doubleClick && scene.onPrePointerObservable.hasSpecificMask(PointerEventTypes.POINTERDOUBLETAP)) {\r\n if (this._checkPrePointerObservable(null, evt, PointerEventTypes.POINTERDOUBLETAP)) {\r\n this._skipPointerTap = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // There should be a pointer captured at this point so if there isn't we should reset and return\r\n if (!this._pointerCaptures[evt.pointerId]) {\r\n if (this._swipeButtonPressed === evt.button) {\r\n this._isSwiping = false;\r\n this._swipeButtonPressed = -1;\r\n }\r\n return;\r\n }\r\n\r\n // Only release capture if all buttons are released\r\n if (evt.buttons === 0) {\r\n this._pointerCaptures[evt.pointerId] = false;\r\n }\r\n if (!scene.cameraToUseForPointers && !scene.activeCamera) {\r\n return;\r\n }\r\n\r\n if (!scene.pointerUpPredicate) {\r\n scene.pointerUpPredicate = (mesh: AbstractMesh): boolean => {\r\n return (\r\n mesh.isPickable &&\r\n mesh.isVisible &&\r\n mesh.isReady() &&\r\n mesh.isEnabled() &&\r\n (!scene.cameraToUseForPointers || (scene.cameraToUseForPointers.layerMask & mesh.layerMask) !== 0)\r\n );\r\n };\r\n }\r\n\r\n // Meshes\r\n if (!this._meshPickProceed && ((AbstractActionManager && AbstractActionManager.HasTriggers) || this._checkForPicking() || scene.onPointerUp)) {\r\n this._initActionManager(null, clickInfo);\r\n }\r\n if (!pickResult) {\r\n pickResult = this._currentPickResult;\r\n }\r\n\r\n this._processPointerUp(pickResult, evt, clickInfo);\r\n\r\n this._previousPickResult = this._currentPickResult;\r\n\r\n if (this._swipeButtonPressed === evt.button) {\r\n this._isSwiping = false;\r\n this._swipeButtonPressed = -1;\r\n }\r\n });\r\n };\r\n\r\n this._onKeyDown = (evt: IKeyboardEvent) => {\r\n const type = KeyboardEventTypes.KEYDOWN;\r\n if (scene.onPreKeyboardObservable.hasObservers()) {\r\n const pi = new KeyboardInfoPre(type, evt);\r\n scene.onPreKeyboardObservable.notifyObservers(pi, type);\r\n if (pi.skipOnKeyboardObservable) {\r\n return;\r\n }\r\n }\r\n\r\n if (scene.onKeyboardObservable.hasObservers()) {\r\n const pi = new KeyboardInfo(type, evt);\r\n scene.onKeyboardObservable.notifyObservers(pi, type);\r\n }\r\n\r\n if (scene.actionManager) {\r\n scene.actionManager.processTrigger(Constants.ACTION_OnKeyDownTrigger, ActionEvent.CreateNewFromScene(scene, evt));\r\n }\r\n };\r\n\r\n this._onKeyUp = (evt: IKeyboardEvent) => {\r\n const type = KeyboardEventTypes.KEYUP;\r\n if (scene.onPreKeyboardObservable.hasObservers()) {\r\n const pi = new KeyboardInfoPre(type, evt);\r\n scene.onPreKeyboardObservable.notifyObservers(pi, type);\r\n if (pi.skipOnKeyboardObservable) {\r\n return;\r\n }\r\n }\r\n\r\n if (scene.onKeyboardObservable.hasObservers()) {\r\n const pi = new KeyboardInfo(type, evt);\r\n scene.onKeyboardObservable.notifyObservers(pi, type);\r\n }\r\n\r\n if (scene.actionManager) {\r\n scene.actionManager.processTrigger(Constants.ACTION_OnKeyUpTrigger, ActionEvent.CreateNewFromScene(scene, evt));\r\n }\r\n };\r\n\r\n // If a device connects that we can handle, wire up the observable\r\n this._deviceSourceManager.onDeviceConnectedObservable.add((deviceSource) => {\r\n if (deviceSource.deviceType === DeviceType.Mouse) {\r\n deviceSource.onInputChangedObservable.add((eventData) => {\r\n if (\r\n eventData.inputIndex === PointerInput.LeftClick ||\r\n eventData.inputIndex === PointerInput.MiddleClick ||\r\n eventData.inputIndex === PointerInput.RightClick ||\r\n eventData.inputIndex === PointerInput.BrowserBack ||\r\n eventData.inputIndex === PointerInput.BrowserForward\r\n ) {\r\n if (attachDown && deviceSource.getInput(eventData.inputIndex) === 1) {\r\n this._onPointerDown(eventData);\r\n } else if (attachUp && deviceSource.getInput(eventData.inputIndex) === 0) {\r\n this._onPointerUp(eventData);\r\n }\r\n } else if (attachMove) {\r\n if (eventData.inputIndex === PointerInput.Move) {\r\n this._onPointerMove(eventData);\r\n } else if (\r\n eventData.inputIndex === PointerInput.MouseWheelX ||\r\n eventData.inputIndex === PointerInput.MouseWheelY ||\r\n eventData.inputIndex === PointerInput.MouseWheelZ\r\n ) {\r\n this._onPointerMove(eventData);\r\n }\r\n }\r\n });\r\n } else if (deviceSource.deviceType === DeviceType.Touch) {\r\n deviceSource.onInputChangedObservable.add((eventData) => {\r\n if (eventData.inputIndex === PointerInput.LeftClick) {\r\n if (attachDown && deviceSource.getInput(eventData.inputIndex) === 1) {\r\n this._onPointerDown(eventData);\r\n if (this._totalPointersPressed > 1) {\r\n this._isMultiTouchGesture = true;\r\n }\r\n } else if (attachUp && deviceSource.getInput(eventData.inputIndex) === 0) {\r\n this._onPointerUp(eventData);\r\n if (this._totalPointersPressed === 0) {\r\n this._isMultiTouchGesture = false;\r\n }\r\n }\r\n }\r\n\r\n if (attachMove && eventData.inputIndex === PointerInput.Move) {\r\n this._onPointerMove(eventData);\r\n }\r\n });\r\n } else if (deviceSource.deviceType === DeviceType.Keyboard) {\r\n deviceSource.onInputChangedObservable.add((eventData) => {\r\n if (eventData.type === \"keydown\") {\r\n this._onKeyDown(eventData);\r\n } else if (eventData.type === \"keyup\") {\r\n this._onKeyUp(eventData);\r\n }\r\n });\r\n }\r\n });\r\n\r\n this._alreadyAttached = true;\r\n }\r\n\r\n /**\r\n * Detaches all event handlers\r\n */\r\n public detachControl() {\r\n if (this._alreadyAttached) {\r\n this._deviceSourceManager!.dispose();\r\n this._deviceSourceManager = null;\r\n\r\n // Cursor\r\n if (this._alreadyAttachedTo && !this._scene.doNotHandleCursors) {\r\n this._alreadyAttachedTo.style.cursor = this._scene.defaultCursor;\r\n }\r\n\r\n this._alreadyAttached = false;\r\n this._alreadyAttachedTo = null;\r\n }\r\n }\r\n\r\n /**\r\n * Force the value of meshUnderPointer\r\n * @param mesh - defines the mesh to use\r\n * @param pointerId - optional pointer id when using more than one pointer. Defaults to 0\r\n * @param pickResult - optional pickingInfo data used to find mesh\r\n * @param evt - optional pointer event\r\n */\r\n public setPointerOverMesh(mesh: Nullable, pointerId: number = 0, pickResult?: Nullable, evt?: IPointerEvent): void {\r\n if (this._meshUnderPointerId[pointerId] === mesh && (!mesh || !mesh._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting)) {\r\n return;\r\n }\r\n\r\n const underPointerMesh = this._meshUnderPointerId[pointerId];\r\n\r\n let actionManager: Nullable;\r\n if (underPointerMesh) {\r\n actionManager = underPointerMesh._getActionManagerForTrigger(Constants.ACTION_OnPointerOutTrigger);\r\n if (actionManager) {\r\n actionManager.processTrigger(Constants.ACTION_OnPointerOutTrigger, ActionEvent.CreateNew(underPointerMesh, evt, { pointerId }));\r\n }\r\n }\r\n\r\n if (mesh) {\r\n this._meshUnderPointerId[pointerId] = mesh;\r\n this._pointerOverMesh = mesh;\r\n\r\n actionManager = mesh._getActionManagerForTrigger(Constants.ACTION_OnPointerOverTrigger);\r\n if (actionManager) {\r\n actionManager.processTrigger(Constants.ACTION_OnPointerOverTrigger, ActionEvent.CreateNew(mesh, evt, { pointerId, pickResult }));\r\n }\r\n } else {\r\n delete this._meshUnderPointerId[pointerId];\r\n this._pointerOverMesh = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the mesh under the pointer\r\n * @returns a Mesh or null if no mesh is under the pointer\r\n */\r\n public getPointerOverMesh(): Nullable {\r\n return this.meshUnderPointer;\r\n }\r\n\r\n /**\r\n * @param mesh - Mesh to invalidate\r\n * @internal\r\n */\r\n public _invalidateMesh(mesh: AbstractMesh) {\r\n if (this._pointerOverMesh === mesh) {\r\n this._pointerOverMesh = null;\r\n }\r\n if (this._pickedDownMesh === mesh) {\r\n this._pickedDownMesh = null;\r\n }\r\n if (this._pickedUpMesh === mesh) {\r\n this._pickedUpMesh = null;\r\n }\r\n for (const pointerId in this._meshUnderPointerId) {\r\n if (this._meshUnderPointerId[pointerId] === mesh) {\r\n delete this._meshUnderPointerId[pointerId];\r\n }\r\n }\r\n }\r\n}\r\n", "/**\r\n * Helper class used to generate session unique ID\r\n */\r\nexport class UniqueIdGenerator {\r\n // Statics\r\n private static _UniqueIdCounter = 1;\r\n\r\n /**\r\n * Gets an unique (relatively to the current scene) Id\r\n */\r\n public static get UniqueId() {\r\n const result = this._UniqueIdCounter;\r\n this._UniqueIdCounter++;\r\n return result;\r\n }\r\n}\r\n", "/** Defines the cross module constantsused by lights to avoid circular dependencies */\r\nexport class LightConstants {\r\n /**\r\n * Falloff Default: light is falling off following the material specification:\r\n * standard material is using standard falloff whereas pbr material can request special falloff per materials.\r\n */\r\n public static readonly FALLOFF_DEFAULT = 0;\r\n\r\n /**\r\n * Falloff Physical: light is falling off following the inverse squared distance law.\r\n */\r\n public static readonly FALLOFF_PHYSICAL = 1;\r\n\r\n /**\r\n * Falloff gltf: light is falling off as described in the gltf moving to PBR document\r\n * to enhance interoperability with other engines.\r\n */\r\n public static readonly FALLOFF_GLTF = 2;\r\n\r\n /**\r\n * Falloff Standard: light is falling off like in the standard material\r\n * to enhance interoperability with other materials.\r\n */\r\n public static readonly FALLOFF_STANDARD = 3;\r\n\r\n //lightmapMode Consts\r\n /**\r\n * If every light affecting the material is in this lightmapMode,\r\n * material.lightmapTexture adds or multiplies\r\n * (depends on material.useLightmapAsShadowmap)\r\n * after every other light calculations.\r\n */\r\n public static readonly LIGHTMAP_DEFAULT = 0;\r\n /**\r\n * material.lightmapTexture as only diffuse lighting from this light\r\n * adds only specular lighting from this light\r\n * adds dynamic shadows\r\n */\r\n public static readonly LIGHTMAP_SPECULAR = 1;\r\n /**\r\n * material.lightmapTexture as only lighting\r\n * no light calculation from this light\r\n * only adds dynamic shadows from this light\r\n */\r\n public static readonly LIGHTMAP_SHADOWSONLY = 2;\r\n\r\n // Intensity Mode Consts\r\n /**\r\n * Each light type uses the default quantity according to its type:\r\n * point/spot lights use luminous intensity\r\n * directional lights use illuminance\r\n */\r\n public static readonly INTENSITYMODE_AUTOMATIC = 0;\r\n /**\r\n * lumen (lm)\r\n */\r\n public static readonly INTENSITYMODE_LUMINOUSPOWER = 1;\r\n /**\r\n * candela (lm/sr)\r\n */\r\n public static readonly INTENSITYMODE_LUMINOUSINTENSITY = 2;\r\n /**\r\n * lux (lm/m^2)\r\n */\r\n public static readonly INTENSITYMODE_ILLUMINANCE = 3;\r\n /**\r\n * nit (cd/m^2)\r\n */\r\n public static readonly INTENSITYMODE_LUMINANCE = 4;\r\n\r\n // Light types ids const.\r\n /**\r\n * Light type const id of the point light.\r\n */\r\n public static readonly LIGHTTYPEID_POINTLIGHT = 0;\r\n /**\r\n * Light type const id of the directional light.\r\n */\r\n public static readonly LIGHTTYPEID_DIRECTIONALLIGHT = 1;\r\n /**\r\n * Light type const id of the spot light.\r\n */\r\n public static readonly LIGHTTYPEID_SPOTLIGHT = 2;\r\n /**\r\n * Light type const id of the hemispheric light.\r\n */\r\n public static readonly LIGHTTYPEID_HEMISPHERICLIGHT = 3;\r\n\r\n /**\r\n * Sort function to order lights for rendering.\r\n * @param a First Light object to compare to second.\r\n * @param b Second Light object to compare first.\r\n * @returns -1 to reduce's a's index relative to be, 0 for no change, 1 to increase a's index relative to b.\r\n */\r\n public static CompareLightsPriority(a: ISortableLight, b: ISortableLight): number {\r\n //shadow-casting lights have priority over non-shadow-casting lights\r\n //the renderPriority is a secondary sort criterion\r\n if (a.shadowEnabled !== b.shadowEnabled) {\r\n return (b.shadowEnabled ? 1 : 0) - (a.shadowEnabled ? 1 : 0);\r\n }\r\n return b.renderPriority - a.renderPriority;\r\n }\r\n}\r\n\r\n/**\r\n * Defines the common interface of sortable lights\r\n */\r\nexport interface ISortableLight {\r\n /**\r\n * Gets or sets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching\r\n * the current shadow generator.\r\n */\r\n shadowEnabled: boolean;\r\n /**\r\n * Defines the rendering priority of the lights. It can help in case of fallback or number of lights\r\n * exceeding the number allowed of the materials.\r\n */\r\n renderPriority: number;\r\n}\r\n", "import type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\n\r\n/**\r\n * Class used to store configuration data associated with pointer picking\r\n */\r\nexport class PointerPickingConfiguration {\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer down event\r\n */\r\n public pointerDownPredicate: (Mesh: AbstractMesh) => boolean;\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer up event\r\n */\r\n public pointerUpPredicate: (Mesh: AbstractMesh) => boolean;\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer move event\r\n */\r\n public pointerMovePredicate: (Mesh: AbstractMesh) => boolean;\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer down event\r\n */\r\n public pointerDownFastCheck = false;\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer up event\r\n */\r\n public pointerUpFastCheck = false;\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer move event\r\n */\r\n public pointerMoveFastCheck = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer move event occurs.\r\n */\r\n public skipPointerMovePicking = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer down event occurs.\r\n */\r\n public skipPointerDownPicking = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer up event occurs. Off by default.\r\n */\r\n public skipPointerUpPicking = false;\r\n}\r\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Nullable } from \"./types\";\r\nimport { Tools } from \"./Misc/tools\";\r\nimport type { IAnimatable } from \"./Animations/animatable.interface\";\r\nimport { PrecisionDate } from \"./Misc/precisionDate\";\r\nimport type { Observer } from \"./Misc/observable\";\r\nimport { Observable } from \"./Misc/observable\";\r\nimport type { ISmartArrayLike } from \"./Misc/smartArray\";\r\nimport { SmartArrayNoDuplicate, SmartArray } from \"./Misc/smartArray\";\r\nimport { StringDictionary } from \"./Misc/stringDictionary\";\r\nimport { Tags } from \"./Misc/tags\";\r\nimport type { Vector2, Vector4 } from \"./Maths/math.vector\";\r\nimport { Vector3, Matrix, TmpVectors } from \"./Maths/math.vector\";\r\nimport type { IParticleSystem } from \"./Particles/IParticleSystem\";\r\nimport { AbstractScene } from \"./abstractScene\";\r\nimport { ImageProcessingConfiguration } from \"./Materials/imageProcessingConfiguration\";\r\nimport { UniformBuffer } from \"./Materials/uniformBuffer\";\r\nimport { PickingInfo } from \"./Collisions/pickingInfo\";\r\nimport type { ICollisionCoordinator } from \"./Collisions/collisionCoordinator\";\r\nimport type { PointerEventTypes, PointerInfoPre, PointerInfo } from \"./Events/pointerEvents\";\r\nimport type { KeyboardInfoPre, KeyboardInfo } from \"./Events/keyboardEvents\";\r\nimport { ActionEvent } from \"./Actions/actionEvent\";\r\nimport { PostProcessManager } from \"./PostProcesses/postProcessManager\";\r\nimport type { IOfflineProvider } from \"./Offline/IOfflineProvider\";\r\nimport type { RenderingGroupInfo, IRenderingManagerAutoClearSetup } from \"./Rendering/renderingManager\";\r\nimport { RenderingManager } from \"./Rendering/renderingManager\";\r\nimport type {\r\n ISceneComponent,\r\n ISceneSerializableComponent,\r\n SimpleStageAction,\r\n RenderTargetsStageAction,\r\n RenderTargetStageAction,\r\n MeshStageAction,\r\n EvaluateSubMeshStageAction,\r\n PreActiveMeshStageAction,\r\n CameraStageAction,\r\n RenderingGroupStageAction,\r\n RenderingMeshStageAction,\r\n PointerMoveStageAction,\r\n PointerUpDownStageAction,\r\n CameraStageFrameBufferAction,\r\n} from \"./sceneComponent\";\r\nimport { Stage } from \"./sceneComponent\";\r\nimport type { Engine } from \"./Engines/engine\";\r\nimport { Constants } from \"./Engines/constants\";\r\nimport { IsWindowObjectExist } from \"./Misc/domManagement\";\r\nimport { EngineStore } from \"./Engines/engineStore\";\r\nimport type { AbstractActionManager } from \"./Actions/abstractActionManager\";\r\nimport { _WarnImport } from \"./Misc/devTools\";\r\nimport type { WebRequest } from \"./Misc/webRequest\";\r\nimport { InputManager } from \"./Inputs/scene.inputManager\";\r\nimport { PerfCounter } from \"./Misc/perfCounter\";\r\nimport type { IFileRequest } from \"./Misc/fileRequest\";\r\nimport { Color4, Color3 } from \"./Maths/math.color\";\r\nimport type { Plane } from \"./Maths/math.plane\";\r\nimport { Frustum } from \"./Maths/math.frustum\";\r\nimport { UniqueIdGenerator } from \"./Misc/uniqueIdGenerator\";\r\nimport type { LoadFileError, RequestFileError, ReadFileError } from \"./Misc/fileTools\";\r\nimport { ReadFile, RequestFile, LoadFile } from \"./Misc/fileTools\";\r\nimport type { IClipPlanesHolder } from \"./Misc/interfaces/iClipPlanesHolder\";\r\nimport type { IPointerEvent } from \"./Events/deviceInputEvents\";\r\nimport { LightConstants } from \"./Lights/lightConstants\";\r\nimport { _ObserveArray } from \"./Misc/arrayTools\";\r\nimport type { IAction } from \"./Actions/action\";\r\nimport type { AnimationPropertiesOverride } from \"./Animations/animationPropertiesOverride\";\r\nimport type { AnimationGroup } from \"./Animations/animationGroup\";\r\nimport type { Skeleton } from \"./Bones/skeleton\";\r\nimport type { Bone } from \"./Bones/bone\";\r\nimport type { Camera } from \"./Cameras/camera\";\r\nimport type { Collider } from \"./Collisions/collider\";\r\nimport type { Ray, TrianglePickingPredicate } from \"./Culling/ray\";\r\nimport type { Light } from \"./Lights/light\";\r\nimport type { PerformanceViewerCollector } from \"./Misc/PerformanceViewer/performanceViewerCollector\";\r\nimport type { MorphTarget } from \"./Morph/morphTarget\";\r\nimport type { MorphTargetManager } from \"./Morph/morphTargetManager\";\r\nimport type { PostProcess } from \"./PostProcesses/postProcess\";\r\nimport type { Material } from \"./Materials/material\";\r\nimport type { BaseTexture } from \"./Materials/Textures/baseTexture\";\r\nimport type { Geometry } from \"./Meshes/geometry\";\r\nimport type { TransformNode } from \"./Meshes/transformNode\";\r\nimport type { AbstractMesh } from \"./Meshes/abstractMesh\";\r\nimport type { MultiMaterial } from \"./Materials/multiMaterial\";\r\nimport type { Effect } from \"./Materials/effect\";\r\nimport type { RenderTargetTexture } from \"./Materials/Textures/renderTargetTexture\";\r\nimport type { Mesh } from \"./Meshes/mesh\";\r\nimport type { SubMesh } from \"./Meshes/subMesh\";\r\nimport type { Node } from \"./node\";\r\nimport type { Animation } from \"./Animations/animation\";\r\nimport type { Animatable } from \"./Animations/animatable\";\r\nimport type { Texture } from \"./Materials/Textures/texture\";\r\nimport { PointerPickingConfiguration } from \"./Inputs/pointerPickingConfiguration\";\r\nimport { Logger } from \"./Misc/logger\";\r\n\r\n/**\r\n * Define an interface for all classes that will hold resources\r\n */\r\nexport interface IDisposable {\r\n /**\r\n * Releases all held resources\r\n */\r\n dispose(): void;\r\n}\r\n\r\n/** Interface defining initialization parameters for Scene class */\r\nexport interface SceneOptions {\r\n /**\r\n * Defines that scene should keep up-to-date a map of geometry to enable fast look-up by uniqueId\r\n * It will improve performance when the number of geometries becomes important.\r\n */\r\n useGeometryUniqueIdsMap?: boolean;\r\n\r\n /**\r\n * Defines that each material of the scene should keep up-to-date a map of referencing meshes for fast disposing\r\n * It will improve performance when the number of mesh becomes important, but might consume a bit more memory\r\n */\r\n useMaterialMeshMap?: boolean;\r\n\r\n /**\r\n * Defines that each mesh of the scene should keep up-to-date a map of referencing cloned meshes for fast disposing\r\n * It will improve performance when the number of mesh becomes important, but might consume a bit more memory\r\n */\r\n useClonedMeshMap?: boolean;\r\n\r\n /** Defines if the creation of the scene should impact the engine (Eg. UtilityLayer's scene) */\r\n virtual?: boolean;\r\n}\r\n\r\n/**\r\n * Define how the scene should favor performance over ease of use\r\n */\r\nexport enum ScenePerformancePriority {\r\n /** Default mode. No change. Performance will be treated as less important than backward compatibility */\r\n BackwardCompatible,\r\n /** Some performance options will be turned on trying to strike a balance between perf and ease of use */\r\n Intermediate,\r\n /** Performance will be top priority */\r\n Aggressive,\r\n}\r\n\r\n/**\r\n * Represents a scene to be rendered by the engine.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene\r\n */\r\nexport class Scene extends AbstractScene implements IAnimatable, IClipPlanesHolder {\r\n /** The fog is deactivated */\r\n public static readonly FOGMODE_NONE = Constants.FOGMODE_NONE;\r\n /** The fog density is following an exponential function */\r\n public static readonly FOGMODE_EXP = Constants.FOGMODE_EXP;\r\n /** The fog density is following an exponential function faster than FOGMODE_EXP */\r\n public static readonly FOGMODE_EXP2 = Constants.FOGMODE_EXP2;\r\n /** The fog density is following a linear function. */\r\n public static readonly FOGMODE_LINEAR = Constants.FOGMODE_LINEAR;\r\n\r\n /**\r\n * Gets or sets the minimum deltatime when deterministic lock step is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n */\r\n public static MinDeltaTime = 1.0;\r\n /**\r\n * Gets or sets the maximum deltatime when deterministic lock step is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n */\r\n public static MaxDeltaTime = 1000.0;\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Factory used to create the default material.\r\n * @param scene The scene to create the material for\r\n * @returns The default material\r\n */\r\n public static DefaultMaterialFactory(scene: Scene): Material {\r\n throw _WarnImport(\"StandardMaterial\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Factory used to create the a collision coordinator.\r\n * @returns The collision coordinator\r\n */\r\n public static CollisionCoordinatorFactory(): ICollisionCoordinator {\r\n throw _WarnImport(\"DefaultCollisionCoordinator\");\r\n }\r\n\r\n // Members\r\n\r\n /** @internal */\r\n public _inputManager = new InputManager(this);\r\n\r\n /** Define this parameter if you are using multiple cameras and you want to specify which one should be used for pointer position */\r\n public cameraToUseForPointers: Nullable = null;\r\n\r\n /** @internal */\r\n public readonly _isScene = true;\r\n\r\n /** @internal */\r\n public _blockEntityCollection = false;\r\n\r\n /**\r\n * Gets or sets a boolean that indicates if the scene must clear the render buffer before rendering a frame\r\n */\r\n public autoClear = true;\r\n /**\r\n * Gets or sets a boolean that indicates if the scene must clear the depth and stencil buffers before rendering a frame\r\n */\r\n public autoClearDepthAndStencil = true;\r\n /**\r\n * Defines the color used to clear the render buffer (Default is (0.2, 0.2, 0.3, 1.0))\r\n */\r\n public clearColor: Color4 = new Color4(0.2, 0.2, 0.3, 1.0);\r\n /**\r\n * Defines the color used to simulate the ambient color (Default is (0, 0, 0))\r\n */\r\n public ambientColor = new Color3(0, 0, 0);\r\n\r\n /**\r\n * This is use to store the default BRDF lookup for PBR materials in your scene.\r\n * It should only be one of the following (if not the default embedded one):\r\n * * For uncorrelated BRDF (pbr.brdf.useEnergyConservation = false and pbr.brdf.useSmithVisibilityHeightCorrelated = false) : https://assets.babylonjs.com/environments/uncorrelatedBRDF.dds\r\n * * For correlated BRDF (pbr.brdf.useEnergyConservation = false and pbr.brdf.useSmithVisibilityHeightCorrelated = true) : https://assets.babylonjs.com/environments/correlatedBRDF.dds\r\n * * For correlated multi scattering BRDF (pbr.brdf.useEnergyConservation = true and pbr.brdf.useSmithVisibilityHeightCorrelated = true) : https://assets.babylonjs.com/environments/correlatedMSBRDF.dds\r\n * The material properties need to be setup according to the type of texture in use.\r\n */\r\n public environmentBRDFTexture: BaseTexture;\r\n\r\n /**\r\n * Texture used in all pbr material as the reflection texture.\r\n * As in the majority of the scene they are the same (exception for multi room and so on),\r\n * this is easier to reference from here than from all the materials.\r\n */\r\n public get environmentTexture(): Nullable {\r\n return this._environmentTexture;\r\n }\r\n /**\r\n * Texture used in all pbr material as the reflection texture.\r\n * As in the majority of the scene they are the same (exception for multi room and so on),\r\n * this is easier to set here than in all the materials.\r\n */\r\n public set environmentTexture(value: Nullable) {\r\n if (this._environmentTexture === value) {\r\n return;\r\n }\r\n\r\n this._environmentTexture = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Intensity of the environment in all pbr material.\r\n * This dims or reinforces the IBL lighting overall (reflection and diffuse).\r\n * As in the majority of the scene they are the same (exception for multi room and so on),\r\n * this is easier to reference from here than from all the materials.\r\n */\r\n public environmentIntensity: number = 1;\r\n\r\n /** @internal */\r\n protected _imageProcessingConfiguration: ImageProcessingConfiguration;\r\n /**\r\n * Default image processing configuration used either in the rendering\r\n * Forward main pass or through the imageProcessingPostProcess if present.\r\n * As in the majority of the scene they are the same (exception for multi camera),\r\n * this is easier to reference from here than from all the materials and post process.\r\n *\r\n * No setter as we it is a shared configuration, you can set the values instead.\r\n */\r\n public get imageProcessingConfiguration(): ImageProcessingConfiguration {\r\n return this._imageProcessingConfiguration;\r\n }\r\n\r\n private _performancePriority = ScenePerformancePriority.BackwardCompatible;\r\n\r\n /**\r\n * Observable triggered when the performance priority is changed\r\n */\r\n public onScenePerformancePriorityChangedObservable = new Observable();\r\n /**\r\n * Gets or sets a value indicating how to treat performance relatively to ease of use and backward compatibility\r\n */\r\n public get performancePriority() {\r\n return this._performancePriority;\r\n }\r\n\r\n public set performancePriority(value) {\r\n if (value === this._performancePriority) {\r\n return;\r\n }\r\n\r\n this._performancePriority = value;\r\n\r\n switch (value) {\r\n case ScenePerformancePriority.BackwardCompatible:\r\n this.skipFrustumClipping = false;\r\n this._renderingManager.maintainStateBetweenFrames = false;\r\n this.skipPointerMovePicking = false;\r\n this.autoClear = true;\r\n break;\r\n case ScenePerformancePriority.Intermediate:\r\n this.skipFrustumClipping = false;\r\n this._renderingManager.maintainStateBetweenFrames = false;\r\n this.skipPointerMovePicking = true;\r\n this.autoClear = false;\r\n break;\r\n case ScenePerformancePriority.Aggressive:\r\n this.skipFrustumClipping = true;\r\n this._renderingManager.maintainStateBetweenFrames = true;\r\n this.skipPointerMovePicking = true;\r\n this.autoClear = false;\r\n break;\r\n }\r\n\r\n this.onScenePerformancePriorityChangedObservable.notifyObservers(value);\r\n }\r\n\r\n private _forceWireframe = false;\r\n /**\r\n * Gets or sets a boolean indicating if all rendering must be done in wireframe\r\n */\r\n public set forceWireframe(value: boolean) {\r\n if (this._forceWireframe === value) {\r\n return;\r\n }\r\n this._forceWireframe = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_MiscDirtyFlag);\r\n }\r\n public get forceWireframe(): boolean {\r\n return this._forceWireframe;\r\n }\r\n\r\n private _skipFrustumClipping = false;\r\n /**\r\n * Gets or sets a boolean indicating if we should skip the frustum clipping part of the active meshes selection\r\n */\r\n public set skipFrustumClipping(value: boolean) {\r\n if (this._skipFrustumClipping === value) {\r\n return;\r\n }\r\n this._skipFrustumClipping = value;\r\n }\r\n public get skipFrustumClipping(): boolean {\r\n return this._skipFrustumClipping;\r\n }\r\n\r\n private _forcePointsCloud = false;\r\n /**\r\n * Gets or sets a boolean indicating if all rendering must be done in point cloud\r\n */\r\n public set forcePointsCloud(value: boolean) {\r\n if (this._forcePointsCloud === value) {\r\n return;\r\n }\r\n this._forcePointsCloud = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_MiscDirtyFlag);\r\n }\r\n public get forcePointsCloud(): boolean {\r\n return this._forcePointsCloud;\r\n }\r\n\r\n /**\r\n * Gets or sets the active clipplane 1\r\n */\r\n public clipPlane: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 2\r\n */\r\n public clipPlane2: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 3\r\n */\r\n public clipPlane3: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 4\r\n */\r\n public clipPlane4: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 5\r\n */\r\n public clipPlane5: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 6\r\n */\r\n public clipPlane6: Nullable;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if animations are enabled\r\n */\r\n public animationsEnabled = true;\r\n\r\n private _animationPropertiesOverride: Nullable = null;\r\n\r\n /**\r\n * Gets or sets the animation properties override\r\n */\r\n public get animationPropertiesOverride(): Nullable {\r\n return this._animationPropertiesOverride;\r\n }\r\n\r\n public set animationPropertiesOverride(value: Nullable) {\r\n this._animationPropertiesOverride = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if a constant deltatime has to be used\r\n * This is mostly useful for testing purposes when you do not want the animations to scale with the framerate\r\n */\r\n public useConstantAnimationDeltaTime = false;\r\n /**\r\n * Gets or sets a boolean indicating if the scene must keep the meshUnderPointer property updated\r\n * Please note that it requires to run a ray cast through the scene on every frame\r\n */\r\n public constantlyUpdateMeshUnderPointer = false;\r\n\r\n /**\r\n * Defines the HTML cursor to use when hovering over interactive elements\r\n */\r\n public hoverCursor = \"pointer\";\r\n /**\r\n * Defines the HTML default cursor to use (empty by default)\r\n */\r\n public defaultCursor: string = \"\";\r\n /**\r\n * Defines whether cursors are handled by the scene.\r\n */\r\n public doNotHandleCursors = false;\r\n /**\r\n * This is used to call preventDefault() on pointer down\r\n * in order to block unwanted artifacts like system double clicks\r\n */\r\n public preventDefaultOnPointerDown = true;\r\n\r\n /**\r\n * This is used to call preventDefault() on pointer up\r\n * in order to block unwanted artifacts like system double clicks\r\n */\r\n public preventDefaultOnPointerUp = true;\r\n\r\n // Metadata\r\n /**\r\n * Gets or sets user defined metadata\r\n */\r\n public metadata: any = null;\r\n\r\n /**\r\n * For internal use only. Please do not use.\r\n */\r\n public reservedDataStore: any = null;\r\n\r\n /**\r\n * Gets the name of the plugin used to load this scene (null by default)\r\n */\r\n public loadingPluginName: string;\r\n\r\n /**\r\n * Use this array to add regular expressions used to disable offline support for specific urls\r\n */\r\n public disableOfflineSupportExceptionRules: RegExp[] = [];\r\n\r\n /**\r\n * An event triggered when the scene is disposed.\r\n */\r\n public onDisposeObservable = new Observable();\r\n\r\n private _onDisposeObserver: Nullable> = null;\r\n /** Sets a function to be executed when this scene is disposed. */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered before rendering the scene (right after animations and physics)\r\n */\r\n public onBeforeRenderObservable = new Observable();\r\n\r\n private _onBeforeRenderObserver: Nullable> = null;\r\n /** Sets a function to be executed before rendering this scene */\r\n public set beforeRender(callback: Nullable<() => void>) {\r\n if (this._onBeforeRenderObserver) {\r\n this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n }\r\n if (callback) {\r\n this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * An event triggered after rendering the scene\r\n */\r\n public onAfterRenderObservable = new Observable();\r\n\r\n /**\r\n * An event triggered after rendering the scene for an active camera (When scene.render is called this will be called after each camera)\r\n * This is triggered for each \"sub\" camera in a Camera Rig unlike onAfterCameraRenderObservable\r\n */\r\n public onAfterRenderCameraObservable = new Observable();\r\n\r\n private _onAfterRenderObserver: Nullable> = null;\r\n /** Sets a function to be executed after rendering this scene */\r\n public set afterRender(callback: Nullable<() => void>) {\r\n if (this._onAfterRenderObserver) {\r\n this.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n }\r\n\r\n if (callback) {\r\n this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * An event triggered before animating the scene\r\n */\r\n public onBeforeAnimationsObservable = new Observable();\r\n\r\n /**\r\n * An event triggered after animations processing\r\n */\r\n public onAfterAnimationsObservable = new Observable();\r\n\r\n /**\r\n * An event triggered before draw calls are ready to be sent\r\n */\r\n public onBeforeDrawPhaseObservable = new Observable();\r\n\r\n /**\r\n * An event triggered after draw calls have been sent\r\n */\r\n public onAfterDrawPhaseObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when the scene is ready\r\n */\r\n public onReadyObservable = new Observable();\r\n\r\n /**\r\n * An event triggered before rendering a camera\r\n */\r\n public onBeforeCameraRenderObservable = new Observable();\r\n\r\n private _onBeforeCameraRenderObserver: Nullable> = null;\r\n /** Sets a function to be executed before rendering a camera*/\r\n public set beforeCameraRender(callback: () => void) {\r\n if (this._onBeforeCameraRenderObserver) {\r\n this.onBeforeCameraRenderObservable.remove(this._onBeforeCameraRenderObserver);\r\n }\r\n\r\n this._onBeforeCameraRenderObserver = this.onBeforeCameraRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered after rendering a camera\r\n * This is triggered for the full rig Camera only unlike onAfterRenderCameraObservable\r\n */\r\n public onAfterCameraRenderObservable = new Observable();\r\n\r\n private _onAfterCameraRenderObserver: Nullable> = null;\r\n /** Sets a function to be executed after rendering a camera*/\r\n public set afterCameraRender(callback: () => void) {\r\n if (this._onAfterCameraRenderObserver) {\r\n this.onAfterCameraRenderObservable.remove(this._onAfterCameraRenderObserver);\r\n }\r\n this._onAfterCameraRenderObserver = this.onAfterCameraRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when active meshes evaluation is about to start\r\n */\r\n public onBeforeActiveMeshesEvaluationObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when active meshes evaluation is done\r\n */\r\n public onAfterActiveMeshesEvaluationObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when particles rendering is about to start\r\n * Note: This event can be trigger more than once per frame (because particles can be rendered by render target textures as well)\r\n */\r\n public onBeforeParticlesRenderingObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when particles rendering is done\r\n * Note: This event can be trigger more than once per frame (because particles can be rendered by render target textures as well)\r\n */\r\n public onAfterParticlesRenderingObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when SceneLoader.Append or SceneLoader.Load or SceneLoader.ImportMesh were successfully executed\r\n */\r\n public onDataLoadedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a camera is created\r\n */\r\n public onNewCameraAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a camera is removed\r\n */\r\n public onCameraRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a light is created\r\n */\r\n public onNewLightAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a light is removed\r\n */\r\n public onLightRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a geometry is created\r\n */\r\n public onNewGeometryAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a geometry is removed\r\n */\r\n public onGeometryRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a transform node is created\r\n */\r\n public onNewTransformNodeAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a transform node is removed\r\n */\r\n public onTransformNodeRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a mesh is created\r\n */\r\n public onNewMeshAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a mesh is removed\r\n */\r\n public onMeshRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a skeleton is created\r\n */\r\n public onNewSkeletonAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a skeleton is removed\r\n */\r\n public onSkeletonRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a material is created\r\n */\r\n public onNewMaterialAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a multi material is created\r\n */\r\n public onNewMultiMaterialAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a material is removed\r\n */\r\n public onMaterialRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a multi material is removed\r\n */\r\n public onMultiMaterialRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a texture is created\r\n */\r\n public onNewTextureAddedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when a texture is removed\r\n */\r\n public onTextureRemovedObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when render targets are about to be rendered\r\n * Can happen multiple times per frame.\r\n */\r\n public onBeforeRenderTargetsRenderObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when render targets were rendered.\r\n * Can happen multiple times per frame.\r\n */\r\n public onAfterRenderTargetsRenderObservable = new Observable();\r\n\r\n /**\r\n * An event triggered before calculating deterministic simulation step\r\n */\r\n public onBeforeStepObservable = new Observable();\r\n\r\n /**\r\n * An event triggered after calculating deterministic simulation step\r\n */\r\n public onAfterStepObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when the activeCamera property is updated\r\n */\r\n public onActiveCameraChanged = new Observable();\r\n\r\n /**\r\n * An event triggered when the activeCameras property is updated\r\n */\r\n public onActiveCamerasChanged = new Observable();\r\n\r\n /**\r\n * This Observable will be triggered before rendering each renderingGroup of each rendered camera.\r\n * The RenderingGroupInfo class contains all the information about the context in which the observable is called\r\n * If you wish to register an Observer only for a given set of renderingGroup, use the mask with a combination of the renderingGroup index elevated to the power of two (1 for renderingGroup 0, 2 for renderingrOup1, 4 for 2 and 8 for 3)\r\n */\r\n public onBeforeRenderingGroupObservable = new Observable();\r\n\r\n /**\r\n * This Observable will be triggered after rendering each renderingGroup of each rendered camera.\r\n * The RenderingGroupInfo class contains all the information about the context in which the observable is called\r\n * If you wish to register an Observer only for a given set of renderingGroup, use the mask with a combination of the renderingGroup index elevated to the power of two (1 for renderingGroup 0, 2 for renderingrOup1, 4 for 2 and 8 for 3)\r\n */\r\n public onAfterRenderingGroupObservable = new Observable();\r\n\r\n /**\r\n * This Observable will when a mesh has been imported into the scene.\r\n */\r\n public onMeshImportedObservable = new Observable();\r\n\r\n /**\r\n * This Observable will when an animation file has been imported into the scene.\r\n */\r\n public onAnimationFileImportedObservable = new Observable();\r\n\r\n /**\r\n * Gets or sets a user defined funtion to select LOD from a mesh and a camera.\r\n * By default this function is undefined and Babylon.js will select LOD based on distance to camera\r\n */\r\n public customLODSelector: (mesh: AbstractMesh, camera: Camera) => Nullable;\r\n\r\n // Animations\r\n\r\n /** @internal */\r\n public _registeredForLateAnimationBindings = new SmartArrayNoDuplicate(256);\r\n\r\n // Pointers\r\n private _pointerPickingConfiguration = new PointerPickingConfiguration();\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer down event\r\n */\r\n public get pointerDownPredicate() {\r\n return this._pointerPickingConfiguration.pointerDownPredicate;\r\n }\r\n\r\n public set pointerDownPredicate(value) {\r\n this._pointerPickingConfiguration.pointerDownPredicate = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer up event\r\n */\r\n public get pointerUpPredicate() {\r\n return this._pointerPickingConfiguration.pointerUpPredicate;\r\n }\r\n\r\n public set pointerUpPredicate(value) {\r\n this._pointerPickingConfiguration.pointerUpPredicate = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer move event\r\n */\r\n public get pointerMovePredicate() {\r\n return this._pointerPickingConfiguration.pointerMovePredicate;\r\n }\r\n\r\n public set pointerMovePredicate(value) {\r\n this._pointerPickingConfiguration.pointerMovePredicate = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer down event\r\n */\r\n public get pointerDownFastCheck() {\r\n return this._pointerPickingConfiguration.pointerDownFastCheck;\r\n }\r\n\r\n public set pointerDownFastCheck(value) {\r\n this._pointerPickingConfiguration.pointerDownFastCheck = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer up event\r\n */\r\n public get pointerUpFastCheck() {\r\n return this._pointerPickingConfiguration.pointerUpFastCheck;\r\n }\r\n\r\n public set pointerUpFastCheck(value) {\r\n this._pointerPickingConfiguration.pointerUpFastCheck = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate meshes for a pointer move event\r\n */\r\n public get pointerMoveFastCheck() {\r\n return this._pointerPickingConfiguration.pointerMoveFastCheck;\r\n }\r\n\r\n public set pointerMoveFastCheck(value) {\r\n this._pointerPickingConfiguration.pointerMoveFastCheck = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer move event occurs.\r\n */\r\n public get skipPointerMovePicking() {\r\n return this._pointerPickingConfiguration.skipPointerMovePicking;\r\n }\r\n\r\n public set skipPointerMovePicking(value) {\r\n this._pointerPickingConfiguration.skipPointerMovePicking = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer down event occurs.\r\n */\r\n public get skipPointerDownPicking() {\r\n return this._pointerPickingConfiguration.skipPointerDownPicking;\r\n }\r\n\r\n public set skipPointerDownPicking(value) {\r\n this._pointerPickingConfiguration.skipPointerDownPicking = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer up event occurs. Off by default.\r\n */\r\n public get skipPointerUpPicking() {\r\n return this._pointerPickingConfiguration.skipPointerUpPicking;\r\n }\r\n\r\n public set skipPointerUpPicking(value) {\r\n this._pointerPickingConfiguration.skipPointerUpPicking = value;\r\n }\r\n\r\n /** Callback called when a pointer move is detected */\r\n public onPointerMove?: (evt: IPointerEvent, pickInfo: PickingInfo, type: PointerEventTypes) => void;\r\n /** Callback called when a pointer down is detected */\r\n public onPointerDown?: (evt: IPointerEvent, pickInfo: PickingInfo, type: PointerEventTypes) => void;\r\n /** Callback called when a pointer up is detected */\r\n public onPointerUp?: (evt: IPointerEvent, pickInfo: Nullable, type: PointerEventTypes) => void;\r\n /** Callback called when a pointer pick is detected */\r\n public onPointerPick?: (evt: IPointerEvent, pickInfo: PickingInfo) => void;\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate faces for a pointer move event\r\n */\r\n public pointerMoveTrianglePredicate: ((p0: Vector3, p1: Vector3, p2: Vector3, ray: Ray) => boolean) | undefined;\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate faces for a pointer down event\r\n */\r\n public pointerDownTrianglePredicate: ((p0: Vector3, p1: Vector3, p2: Vector3, ray: Ray) => boolean) | undefined;\r\n\r\n /**\r\n * Gets or sets a predicate used to select candidate faces for a pointer up event\r\n */\r\n public pointerUpTrianglePredicate: ((p0: Vector3, p1: Vector3, p2: Vector3, ray: Ray) => boolean) | undefined;\r\n\r\n /**\r\n * This observable event is triggered when any ponter event is triggered. It is registered during Scene.attachControl() and it is called BEFORE the 3D engine process anything (mesh/sprite picking for instance).\r\n * You have the possibility to skip the process and the call to onPointerObservable by setting PointerInfoPre.skipOnPointerObservable to true\r\n */\r\n public onPrePointerObservable = new Observable();\r\n\r\n /**\r\n * Observable event triggered each time an input event is received from the rendering canvas\r\n */\r\n public onPointerObservable = new Observable();\r\n\r\n /**\r\n * Gets the pointer coordinates without any translation (ie. straight out of the pointer event)\r\n */\r\n public get unTranslatedPointer(): Vector2 {\r\n return this._inputManager.unTranslatedPointer;\r\n }\r\n\r\n /**\r\n * Gets or sets the distance in pixel that you have to move to prevent some events. Default is 10 pixels\r\n */\r\n public static get DragMovementThreshold() {\r\n return InputManager.DragMovementThreshold;\r\n }\r\n\r\n public static set DragMovementThreshold(value: number) {\r\n InputManager.DragMovementThreshold = value;\r\n }\r\n\r\n /**\r\n * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 500 ms\r\n */\r\n public static get LongPressDelay() {\r\n return InputManager.LongPressDelay;\r\n }\r\n\r\n public static set LongPressDelay(value: number) {\r\n InputManager.LongPressDelay = value;\r\n }\r\n\r\n /**\r\n * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 300 ms\r\n */\r\n public static get DoubleClickDelay() {\r\n return InputManager.DoubleClickDelay;\r\n }\r\n\r\n public static set DoubleClickDelay(value: number) {\r\n InputManager.DoubleClickDelay = value;\r\n }\r\n\r\n /** If you need to check double click without raising a single click at first click, enable this flag */\r\n public static get ExclusiveDoubleClickMode() {\r\n return InputManager.ExclusiveDoubleClickMode;\r\n }\r\n\r\n public static set ExclusiveDoubleClickMode(value: boolean) {\r\n InputManager.ExclusiveDoubleClickMode = value;\r\n }\r\n\r\n /**\r\n * Bind the current view position to an effect.\r\n * @param effect The effect to be bound\r\n * @param variableName name of the shader variable that will hold the eye position\r\n * @param isVector3 true to indicates that variableName is a Vector3 and not a Vector4\r\n * @returns the computed eye position\r\n */\r\n public bindEyePosition(effect: Nullable, variableName = \"vEyePosition\", isVector3 = false): Vector4 {\r\n const eyePosition = this._forcedViewPosition ? this._forcedViewPosition : this._mirroredCameraPosition ? this._mirroredCameraPosition : this.activeCamera!.globalPosition;\r\n\r\n const invertNormal = this.useRightHandedSystem === (this._mirroredCameraPosition != null);\r\n\r\n TmpVectors.Vector4[0].set(eyePosition.x, eyePosition.y, eyePosition.z, invertNormal ? -1 : 1);\r\n\r\n if (effect) {\r\n if (isVector3) {\r\n effect.setFloat3(variableName, TmpVectors.Vector4[0].x, TmpVectors.Vector4[0].y, TmpVectors.Vector4[0].z);\r\n } else {\r\n effect.setVector4(variableName, TmpVectors.Vector4[0]);\r\n }\r\n }\r\n\r\n return TmpVectors.Vector4[0];\r\n }\r\n\r\n /**\r\n * Update the scene ubo before it can be used in rendering processing\r\n * @returns the scene UniformBuffer\r\n */\r\n public finalizeSceneUbo(): UniformBuffer {\r\n const ubo = this.getSceneUniformBuffer();\r\n const eyePosition = this.bindEyePosition(null);\r\n ubo.updateFloat4(\"vEyePosition\", eyePosition.x, eyePosition.y, eyePosition.z, eyePosition.w);\r\n\r\n ubo.update();\r\n\r\n return ubo;\r\n }\r\n\r\n // Mirror\r\n /** @internal */\r\n public _mirroredCameraPosition: Nullable;\r\n\r\n // Keyboard\r\n\r\n /**\r\n * This observable event is triggered when any keyboard event si raised and registered during Scene.attachControl()\r\n * You have the possibility to skip the process and the call to onKeyboardObservable by setting KeyboardInfoPre.skipOnPointerObservable to true\r\n */\r\n public onPreKeyboardObservable = new Observable();\r\n\r\n /**\r\n * Observable event triggered each time an keyboard event is received from the hosting window\r\n */\r\n public onKeyboardObservable = new Observable();\r\n\r\n // Coordinates system\r\n\r\n private _useRightHandedSystem = false;\r\n /**\r\n * Gets or sets a boolean indicating if the scene must use right-handed coordinates system\r\n */\r\n public set useRightHandedSystem(value: boolean) {\r\n if (this._useRightHandedSystem === value) {\r\n return;\r\n }\r\n this._useRightHandedSystem = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_MiscDirtyFlag);\r\n }\r\n public get useRightHandedSystem(): boolean {\r\n return this._useRightHandedSystem;\r\n }\r\n\r\n // Deterministic lockstep\r\n private _timeAccumulator: number = 0;\r\n private _currentStepId: number = 0;\r\n private _currentInternalStep: number = 0;\r\n\r\n /**\r\n * Sets the step Id used by deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @param newStepId defines the step Id\r\n */\r\n public setStepId(newStepId: number): void {\r\n this._currentStepId = newStepId;\r\n }\r\n\r\n /**\r\n * Gets the step Id used by deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @returns the step Id\r\n */\r\n public getStepId(): number {\r\n return this._currentStepId;\r\n }\r\n\r\n /**\r\n * Gets the internal step used by deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @returns the internal step\r\n */\r\n public getInternalStep(): number {\r\n return this._currentInternalStep;\r\n }\r\n\r\n // Fog\r\n\r\n private _fogEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if fog is enabled on this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\r\n * (Default is true)\r\n */\r\n public set fogEnabled(value: boolean) {\r\n if (this._fogEnabled === value) {\r\n return;\r\n }\r\n this._fogEnabled = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_MiscDirtyFlag);\r\n }\r\n public get fogEnabled(): boolean {\r\n return this._fogEnabled;\r\n }\r\n\r\n private _fogMode = Scene.FOGMODE_NONE;\r\n /**\r\n * Gets or sets the fog mode to use\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\r\n * | mode | value |\r\n * | --- | --- |\r\n * | FOGMODE_NONE | 0 |\r\n * | FOGMODE_EXP | 1 |\r\n * | FOGMODE_EXP2 | 2 |\r\n * | FOGMODE_LINEAR | 3 |\r\n */\r\n public set fogMode(value: number) {\r\n if (this._fogMode === value) {\r\n return;\r\n }\r\n this._fogMode = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_MiscDirtyFlag);\r\n }\r\n public get fogMode(): number {\r\n return this._fogMode;\r\n }\r\n\r\n /**\r\n * Gets or sets the fog color to use\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\r\n * (Default is Color3(0.2, 0.2, 0.3))\r\n */\r\n public fogColor = new Color3(0.2, 0.2, 0.3);\r\n /**\r\n * Gets or sets the fog density to use\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\r\n * (Default is 0.1)\r\n */\r\n public fogDensity = 0.1;\r\n /**\r\n * Gets or sets the fog start distance to use\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\r\n * (Default is 0)\r\n */\r\n public fogStart = 0;\r\n /**\r\n * Gets or sets the fog end distance to use\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog\r\n * (Default is 1000)\r\n */\r\n public fogEnd = 1000.0;\r\n\r\n /**\r\n * Flag indicating that the frame buffer binding is handled by another component\r\n */\r\n public get prePass(): boolean {\r\n return !!this.prePassRenderer && this.prePassRenderer.defaultRT.enabled;\r\n }\r\n\r\n /**\r\n * Flag indicating if we need to store previous matrices when rendering\r\n */\r\n public needsPreviousWorldMatrices = false;\r\n\r\n // Lights\r\n private _shadowsEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if shadows are enabled on this scene\r\n */\r\n public set shadowsEnabled(value: boolean) {\r\n if (this._shadowsEnabled === value) {\r\n return;\r\n }\r\n this._shadowsEnabled = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_LightDirtyFlag);\r\n }\r\n public get shadowsEnabled(): boolean {\r\n return this._shadowsEnabled;\r\n }\r\n\r\n private _lightsEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if lights are enabled on this scene\r\n */\r\n public set lightsEnabled(value: boolean) {\r\n if (this._lightsEnabled === value) {\r\n return;\r\n }\r\n this._lightsEnabled = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_LightDirtyFlag);\r\n }\r\n\r\n public get lightsEnabled(): boolean {\r\n return this._lightsEnabled;\r\n }\r\n\r\n private _activeCameras: Nullable;\r\n private _unObserveActiveCameras: Nullable<() => void> = null;\r\n\r\n /** All of the active cameras added to this scene. */\r\n public get activeCameras(): Nullable {\r\n return this._activeCameras;\r\n }\r\n\r\n public set activeCameras(cameras: Nullable) {\r\n if (this._unObserveActiveCameras) {\r\n this._unObserveActiveCameras();\r\n this._unObserveActiveCameras = null;\r\n }\r\n\r\n if (cameras) {\r\n this._unObserveActiveCameras = _ObserveArray(cameras, () => {\r\n this.onActiveCamerasChanged.notifyObservers(this);\r\n });\r\n }\r\n\r\n this._activeCameras = cameras;\r\n }\r\n\r\n /** @internal */\r\n public _activeCamera: Nullable;\r\n /** Gets or sets the current active camera */\r\n public get activeCamera(): Nullable {\r\n return this._activeCamera;\r\n }\r\n\r\n public set activeCamera(value: Nullable) {\r\n if (value === this._activeCamera) {\r\n return;\r\n }\r\n\r\n this._activeCamera = value;\r\n this.onActiveCameraChanged.notifyObservers(this);\r\n }\r\n\r\n private _defaultMaterial: Material;\r\n\r\n /** The default material used on meshes when no material is affected */\r\n public get defaultMaterial(): Material {\r\n if (!this._defaultMaterial) {\r\n this._defaultMaterial = Scene.DefaultMaterialFactory(this);\r\n }\r\n\r\n return this._defaultMaterial;\r\n }\r\n\r\n /** The default material used on meshes when no material is affected */\r\n public set defaultMaterial(value: Material) {\r\n this._defaultMaterial = value;\r\n }\r\n\r\n // Textures\r\n private _texturesEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if textures are enabled on this scene\r\n */\r\n public set texturesEnabled(value: boolean) {\r\n if (this._texturesEnabled === value) {\r\n return;\r\n }\r\n this._texturesEnabled = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n public get texturesEnabled(): boolean {\r\n return this._texturesEnabled;\r\n }\r\n\r\n // Physics\r\n /**\r\n * Gets or sets a boolean indicating if physic engines are enabled on this scene\r\n */\r\n public physicsEnabled = true;\r\n\r\n // Particles\r\n /**\r\n * Gets or sets a boolean indicating if particles are enabled on this scene\r\n */\r\n public particlesEnabled = true;\r\n\r\n // Sprites\r\n /**\r\n * Gets or sets a boolean indicating if sprites are enabled on this scene\r\n */\r\n public spritesEnabled = true;\r\n\r\n // Skeletons\r\n private _skeletonsEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if skeletons are enabled on this scene\r\n */\r\n public set skeletonsEnabled(value: boolean) {\r\n if (this._skeletonsEnabled === value) {\r\n return;\r\n }\r\n this._skeletonsEnabled = value;\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_AttributesDirtyFlag);\r\n }\r\n\r\n public get skeletonsEnabled(): boolean {\r\n return this._skeletonsEnabled;\r\n }\r\n\r\n // Lens flares\r\n /**\r\n * Gets or sets a boolean indicating if lens flares are enabled on this scene\r\n */\r\n public lensFlaresEnabled = true;\r\n\r\n // Collisions\r\n /**\r\n * Gets or sets a boolean indicating if collisions are enabled on this scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public collisionsEnabled = true;\r\n\r\n private _collisionCoordinator: ICollisionCoordinator;\r\n\r\n /** @internal */\r\n public get collisionCoordinator(): ICollisionCoordinator {\r\n if (!this._collisionCoordinator) {\r\n this._collisionCoordinator = Scene.CollisionCoordinatorFactory();\r\n this._collisionCoordinator.init(this);\r\n }\r\n\r\n return this._collisionCoordinator;\r\n }\r\n\r\n /**\r\n * Defines the gravity applied to this scene (used only for collisions)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public gravity = new Vector3(0, -9.807, 0);\r\n\r\n // Postprocesses\r\n /**\r\n * Gets or sets a boolean indicating if postprocesses are enabled on this scene\r\n */\r\n public postProcessesEnabled = true;\r\n /**\r\n * Gets the current postprocess manager\r\n */\r\n public postProcessManager: PostProcessManager;\r\n\r\n // Customs render targets\r\n /**\r\n * Gets or sets a boolean indicating if render targets are enabled on this scene\r\n */\r\n public renderTargetsEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if next render targets must be dumped as image for debugging purposes\r\n * We recommend not using it and instead rely on Spector.js: http://spector.babylonjs.com\r\n */\r\n public dumpNextRenderTargets = false;\r\n /**\r\n * The list of user defined render targets added to the scene\r\n */\r\n public customRenderTargets: RenderTargetTexture[] = [];\r\n\r\n /**\r\n * Defines if texture loading must be delayed\r\n * If true, textures will only be loaded when they need to be rendered\r\n */\r\n public useDelayedTextureLoading: boolean;\r\n\r\n /**\r\n * Gets the list of meshes imported to the scene through SceneLoader\r\n */\r\n public importedMeshesFiles: string[] = [];\r\n\r\n // Probes\r\n /**\r\n * Gets or sets a boolean indicating if probes are enabled on this scene\r\n */\r\n public probesEnabled = true;\r\n\r\n // Offline support\r\n /**\r\n * Gets or sets the current offline provider to use to store scene data\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimizeCached\r\n */\r\n public offlineProvider: IOfflineProvider;\r\n\r\n /**\r\n * Gets or sets the action manager associated with the scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions\r\n */\r\n public actionManager: AbstractActionManager;\r\n\r\n private _meshesForIntersections = new SmartArrayNoDuplicate(256);\r\n\r\n // Procedural textures\r\n /**\r\n * Gets or sets a boolean indicating if procedural textures are enabled on this scene\r\n */\r\n public proceduralTexturesEnabled = true;\r\n\r\n // Private\r\n private _engine: Engine;\r\n\r\n // Performance counters\r\n private _totalVertices = new PerfCounter();\r\n /** @internal */\r\n public _activeIndices = new PerfCounter();\r\n /** @internal */\r\n public _activeParticles = new PerfCounter();\r\n /** @internal */\r\n public _activeBones = new PerfCounter();\r\n\r\n private _animationRatio: number;\r\n\r\n /** @internal */\r\n public _animationTimeLast: number;\r\n\r\n /** @internal */\r\n public _animationTime: number = 0;\r\n\r\n /**\r\n * Gets or sets a general scale for animation speed\r\n * @see https://www.babylonjs-playground.com/#IBU2W7#3\r\n */\r\n public animationTimeScale: number = 1;\r\n\r\n /** @internal */\r\n public _cachedMaterial: Nullable;\r\n /** @internal */\r\n public _cachedEffect: Nullable;\r\n /** @internal */\r\n public _cachedVisibility: Nullable;\r\n\r\n private _renderId = 0;\r\n private _frameId = 0;\r\n private _executeWhenReadyTimeoutId: Nullable> = null;\r\n private _intermediateRendering = false;\r\n private _defaultFrameBufferCleared = false;\r\n\r\n private _viewUpdateFlag = -1;\r\n private _projectionUpdateFlag = -1;\r\n\r\n /** @internal */\r\n public _toBeDisposed = new Array>(256);\r\n private _activeRequests = new Array();\r\n\r\n /** @internal */\r\n public _pendingData = new Array();\r\n private _isDisposed = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that all submeshes of active meshes must be rendered\r\n * Use this boolean to avoid computing frustum clipping on submeshes (This could help when you are CPU bound)\r\n */\r\n public dispatchAllSubMeshesOfActiveMeshes: boolean = false;\r\n private _activeMeshes = new SmartArray(256);\r\n private _processedMaterials = new SmartArray(256);\r\n private _renderTargets = new SmartArrayNoDuplicate(256);\r\n private _materialsRenderTargets = new SmartArrayNoDuplicate(256);\r\n /** @internal */\r\n public _activeParticleSystems = new SmartArray(256);\r\n private _activeSkeletons = new SmartArrayNoDuplicate(32);\r\n private _softwareSkinnedMeshes = new SmartArrayNoDuplicate(32);\r\n\r\n private _renderingManager: RenderingManager;\r\n\r\n /**\r\n * Gets the scene's rendering manager\r\n */\r\n public get renderingManager(): RenderingManager {\r\n return this._renderingManager;\r\n }\r\n\r\n /** @internal */\r\n public _activeAnimatables = new Array();\r\n\r\n private _transformMatrix = Matrix.Zero();\r\n private _sceneUbo: UniformBuffer;\r\n\r\n /** @internal */\r\n public _viewMatrix: Matrix;\r\n /** @internal */\r\n public _projectionMatrix: Matrix;\r\n /** @internal */\r\n public _forcedViewPosition: Nullable;\r\n\r\n /** @internal */\r\n public _frustumPlanes: Plane[];\r\n /**\r\n * Gets the list of frustum planes (built from the active camera)\r\n */\r\n public get frustumPlanes(): Plane[] {\r\n return this._frustumPlanes;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if lights must be sorted by priority (off by default)\r\n * This is useful if there are more lights that the maximum simulteanous authorized\r\n */\r\n public requireLightSorting = false;\r\n\r\n /** @internal */\r\n public readonly useMaterialMeshMap: boolean;\r\n /** @internal */\r\n public readonly useClonedMeshMap: boolean;\r\n\r\n private _externalData: StringDictionary;\r\n private _uid: Nullable;\r\n\r\n /**\r\n * @internal\r\n * Backing store of defined scene components.\r\n */\r\n public _components: ISceneComponent[] = [];\r\n\r\n /**\r\n * @internal\r\n * Backing store of defined scene components.\r\n */\r\n public _serializableComponents: ISceneSerializableComponent[] = [];\r\n\r\n /**\r\n * List of components to register on the next registration step.\r\n */\r\n private _transientComponents: ISceneComponent[] = [];\r\n\r\n /**\r\n * Registers the transient components if needed.\r\n */\r\n private _registerTransientComponents(): void {\r\n // Register components that have been associated lately to the scene.\r\n if (this._transientComponents.length > 0) {\r\n for (const component of this._transientComponents) {\r\n component.register();\r\n }\r\n this._transientComponents.length = 0;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Add a component to the scene.\r\n * Note that the ccomponent could be registered on th next frame if this is called after\r\n * the register component stage.\r\n * @param component Defines the component to add to the scene\r\n */\r\n public _addComponent(component: ISceneComponent) {\r\n this._components.push(component);\r\n this._transientComponents.push(component);\r\n\r\n const serializableComponent = component as any;\r\n if (serializableComponent.addFromContainer && serializableComponent.serialize) {\r\n this._serializableComponents.push(serializableComponent);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Gets a component from the scene.\r\n * @param name defines the name of the component to retrieve\r\n * @returns the component or null if not present\r\n */\r\n public _getComponent(name: string): Nullable {\r\n for (const component of this._components) {\r\n if (component.name === name) {\r\n return component;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Defines the actions happening before camera updates.\r\n */\r\n public _beforeCameraUpdateStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening before clear the canvas.\r\n */\r\n public _beforeClearStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening before clear the canvas.\r\n */\r\n public _beforeRenderTargetClearStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions when collecting render targets for the frame.\r\n */\r\n public _gatherRenderTargetsStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening for one camera in the frame.\r\n */\r\n public _gatherActiveCameraRenderTargetsStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening during the per mesh ready checks.\r\n */\r\n public _isReadyForMeshStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening before evaluate active mesh checks.\r\n */\r\n public _beforeEvaluateActiveMeshStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening during the evaluate sub mesh checks.\r\n */\r\n public _evaluateSubMeshStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening during the active mesh stage.\r\n */\r\n public _preActiveMeshStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening during the per camera render target step.\r\n */\r\n public _cameraDrawRenderTargetStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just before the active camera is drawing.\r\n */\r\n public _beforeCameraDrawStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just before a render target is drawing.\r\n */\r\n public _beforeRenderTargetDrawStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just before a rendering group is drawing.\r\n */\r\n public _beforeRenderingGroupDrawStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just before a mesh is drawing.\r\n */\r\n public _beforeRenderingMeshStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just after a mesh has been drawn.\r\n */\r\n public _afterRenderingMeshStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just after a rendering group has been drawn.\r\n */\r\n public _afterRenderingGroupDrawStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just after the active camera has been drawn.\r\n */\r\n public _afterCameraDrawStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just after the post processing\r\n */\r\n public _afterCameraPostProcessStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just after a render target has been drawn.\r\n */\r\n public _afterRenderTargetDrawStage = Stage.Create();\r\n /**\r\n * Defines the actions happening just after the post processing on a render target\r\n */\r\n public _afterRenderTargetPostProcessStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening just after rendering all cameras and computing intersections.\r\n */\r\n public _afterRenderStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening when a pointer move event happens.\r\n */\r\n public _pointerMoveStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening when a pointer down event happens.\r\n */\r\n public _pointerDownStage = Stage.Create();\r\n /**\r\n * @internal\r\n * Defines the actions happening when a pointer up event happens.\r\n */\r\n public _pointerUpStage = Stage.Create();\r\n\r\n /**\r\n * an optional map from Geometry Id to Geometry index in the 'geometries' array\r\n */\r\n private _geometriesByUniqueId: Nullable<{ [uniqueId: string]: number | undefined }> = null;\r\n\r\n /**\r\n * Creates a new Scene\r\n * @param engine defines the engine to use to render this scene\r\n * @param options defines the scene options\r\n */\r\n constructor(engine: Engine, options?: SceneOptions) {\r\n super();\r\n\r\n this.activeCameras = [] as Camera[];\r\n\r\n const fullOptions = {\r\n useGeometryUniqueIdsMap: true,\r\n useMaterialMeshMap: true,\r\n useClonedMeshMap: true,\r\n virtual: false,\r\n ...options,\r\n };\r\n\r\n engine = this._engine = engine || EngineStore.LastCreatedEngine;\r\n if (fullOptions.virtual) {\r\n engine._virtualScenes.push(this);\r\n } else {\r\n EngineStore._LastCreatedScene = this;\r\n engine.scenes.push(this);\r\n }\r\n\r\n this._uid = null;\r\n\r\n this._renderingManager = new RenderingManager(this);\r\n\r\n if (PostProcessManager) {\r\n this.postProcessManager = new PostProcessManager(this);\r\n }\r\n\r\n if (IsWindowObjectExist()) {\r\n this.attachControl();\r\n }\r\n\r\n // Uniform Buffer\r\n this._createUbo();\r\n\r\n // Default Image processing definition\r\n if (ImageProcessingConfiguration) {\r\n this._imageProcessingConfiguration = new ImageProcessingConfiguration();\r\n }\r\n\r\n this.setDefaultCandidateProviders();\r\n\r\n if (fullOptions.useGeometryUniqueIdsMap) {\r\n this._geometriesByUniqueId = {};\r\n }\r\n\r\n this.useMaterialMeshMap = fullOptions.useMaterialMeshMap;\r\n this.useClonedMeshMap = fullOptions.useClonedMeshMap;\r\n\r\n if (!options || !options.virtual) {\r\n engine.onNewSceneAddedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"Scene\" string\r\n */\r\n public getClassName(): string {\r\n return \"Scene\";\r\n }\r\n\r\n private _defaultMeshCandidates: ISmartArrayLike = {\r\n data: [],\r\n length: 0,\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getDefaultMeshCandidates(): ISmartArrayLike {\r\n this._defaultMeshCandidates.data = this.meshes;\r\n this._defaultMeshCandidates.length = this.meshes.length;\r\n return this._defaultMeshCandidates;\r\n }\r\n\r\n private _defaultSubMeshCandidates: ISmartArrayLike = {\r\n data: [],\r\n length: 0,\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getDefaultSubMeshCandidates(mesh: AbstractMesh): ISmartArrayLike {\r\n this._defaultSubMeshCandidates.data = mesh.subMeshes;\r\n this._defaultSubMeshCandidates.length = mesh.subMeshes.length;\r\n return this._defaultSubMeshCandidates;\r\n }\r\n\r\n /**\r\n * Sets the default candidate providers for the scene.\r\n * This sets the getActiveMeshCandidates, getActiveSubMeshCandidates, getIntersectingSubMeshCandidates\r\n * and getCollidingSubMeshCandidates to their default function\r\n */\r\n public setDefaultCandidateProviders(): void {\r\n this.getActiveMeshCandidates = () => this._getDefaultMeshCandidates();\r\n this.getActiveSubMeshCandidates = (mesh: AbstractMesh) => this._getDefaultSubMeshCandidates(mesh);\r\n this.getIntersectingSubMeshCandidates = (mesh: AbstractMesh, localRay: Ray) => this._getDefaultSubMeshCandidates(mesh);\r\n this.getCollidingSubMeshCandidates = (mesh: AbstractMesh, collider: Collider) => this._getDefaultSubMeshCandidates(mesh);\r\n }\r\n\r\n /**\r\n * Gets the mesh that is currently under the pointer\r\n */\r\n public get meshUnderPointer(): Nullable {\r\n return this._inputManager.meshUnderPointer;\r\n }\r\n\r\n /**\r\n * Gets or sets the current on-screen X position of the pointer\r\n */\r\n public get pointerX(): number {\r\n return this._inputManager.pointerX;\r\n }\r\n\r\n public set pointerX(value: number) {\r\n this._inputManager.pointerX = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the current on-screen Y position of the pointer\r\n */\r\n public get pointerY(): number {\r\n return this._inputManager.pointerY;\r\n }\r\n\r\n public set pointerY(value: number) {\r\n this._inputManager.pointerY = value;\r\n }\r\n\r\n /**\r\n * Gets the cached material (ie. the latest rendered one)\r\n * @returns the cached material\r\n */\r\n public getCachedMaterial(): Nullable {\r\n return this._cachedMaterial;\r\n }\r\n\r\n /**\r\n * Gets the cached effect (ie. the latest rendered one)\r\n * @returns the cached effect\r\n */\r\n public getCachedEffect(): Nullable {\r\n return this._cachedEffect;\r\n }\r\n\r\n /**\r\n * Gets the cached visibility state (ie. the latest rendered one)\r\n * @returns the cached visibility state\r\n */\r\n public getCachedVisibility(): Nullable {\r\n return this._cachedVisibility;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the current material / effect / visibility must be bind again\r\n * @param material defines the current material\r\n * @param effect defines the current effect\r\n * @param visibility defines the current visibility state\r\n * @returns true if one parameter is not cached\r\n */\r\n public isCachedMaterialInvalid(material: Material, effect: Effect, visibility: number = 1) {\r\n return this._cachedEffect !== effect || this._cachedMaterial !== material || this._cachedVisibility !== visibility;\r\n }\r\n\r\n /**\r\n * Gets the engine associated with the scene\r\n * @returns an Engine\r\n */\r\n public getEngine(): Engine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * Gets the total number of vertices rendered per frame\r\n * @returns the total number of vertices rendered per frame\r\n */\r\n public getTotalVertices(): number {\r\n return this._totalVertices.current;\r\n }\r\n\r\n /**\r\n * Gets the performance counter for total vertices\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\r\n */\r\n public get totalVerticesPerfCounter(): PerfCounter {\r\n return this._totalVertices;\r\n }\r\n\r\n /**\r\n * Gets the total number of active indices rendered per frame (You can deduce the number of rendered triangles by dividing this number by 3)\r\n * @returns the total number of active indices rendered per frame\r\n */\r\n public getActiveIndices(): number {\r\n return this._activeIndices.current;\r\n }\r\n\r\n /**\r\n * Gets the performance counter for active indices\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\r\n */\r\n public get totalActiveIndicesPerfCounter(): PerfCounter {\r\n return this._activeIndices;\r\n }\r\n\r\n /**\r\n * Gets the total number of active particles rendered per frame\r\n * @returns the total number of active particles rendered per frame\r\n */\r\n public getActiveParticles(): number {\r\n return this._activeParticles.current;\r\n }\r\n\r\n /**\r\n * Gets the performance counter for active particles\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\r\n */\r\n public get activeParticlesPerfCounter(): PerfCounter {\r\n return this._activeParticles;\r\n }\r\n\r\n /**\r\n * Gets the total number of active bones rendered per frame\r\n * @returns the total number of active bones rendered per frame\r\n */\r\n public getActiveBones(): number {\r\n return this._activeBones.current;\r\n }\r\n\r\n /**\r\n * Gets the performance counter for active bones\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation\r\n */\r\n public get activeBonesPerfCounter(): PerfCounter {\r\n return this._activeBones;\r\n }\r\n\r\n /**\r\n * Gets the array of active meshes\r\n * @returns an array of AbstractMesh\r\n */\r\n public getActiveMeshes(): SmartArray {\r\n return this._activeMeshes;\r\n }\r\n\r\n /**\r\n * Gets the animation ratio (which is 1.0 is the scene renders at 60fps and 2 if the scene renders at 30fps, etc.)\r\n * @returns a number\r\n */\r\n public getAnimationRatio(): number {\r\n return this._animationRatio !== undefined ? this._animationRatio : 1;\r\n }\r\n\r\n /**\r\n * Gets an unique Id for the current render phase\r\n * @returns a number\r\n */\r\n public getRenderId(): number {\r\n return this._renderId;\r\n }\r\n\r\n /**\r\n * Gets an unique Id for the current frame\r\n * @returns a number\r\n */\r\n public getFrameId(): number {\r\n return this._frameId;\r\n }\r\n\r\n /** Call this function if you want to manually increment the render Id*/\r\n public incrementRenderId(): void {\r\n this._renderId++;\r\n }\r\n\r\n private _createUbo(): void {\r\n this.setSceneUniformBuffer(this.createSceneUniformBuffer());\r\n }\r\n\r\n /**\r\n * Use this method to simulate a pointer move on a mesh\r\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\r\n * @param pickResult pickingInfo of the object wished to simulate pointer event on\r\n * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\r\n * @returns the current scene\r\n */\r\n public simulatePointerMove(pickResult: PickingInfo, pointerEventInit?: PointerEventInit): Scene {\r\n this._inputManager.simulatePointerMove(pickResult, pointerEventInit);\r\n return this;\r\n }\r\n\r\n /**\r\n * Use this method to simulate a pointer down on a mesh\r\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\r\n * @param pickResult pickingInfo of the object wished to simulate pointer event on\r\n * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\r\n * @returns the current scene\r\n */\r\n public simulatePointerDown(pickResult: PickingInfo, pointerEventInit?: PointerEventInit): Scene {\r\n this._inputManager.simulatePointerDown(pickResult, pointerEventInit);\r\n return this;\r\n }\r\n\r\n /**\r\n * Use this method to simulate a pointer up on a mesh\r\n * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay\r\n * @param pickResult pickingInfo of the object wished to simulate pointer event on\r\n * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)\r\n * @param doubleTap indicates that the pointer up event should be considered as part of a double click (false by default)\r\n * @returns the current scene\r\n */\r\n public simulatePointerUp(pickResult: PickingInfo, pointerEventInit?: PointerEventInit, doubleTap?: boolean): Scene {\r\n this._inputManager.simulatePointerUp(pickResult, pointerEventInit, doubleTap);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down)\r\n * @param pointerId defines the pointer id to use in a multi-touch scenario (0 by default)\r\n * @returns true if the pointer was captured\r\n */\r\n public isPointerCaptured(pointerId = 0): boolean {\r\n return this._inputManager.isPointerCaptured(pointerId);\r\n }\r\n\r\n /**\r\n * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp\r\n * @param attachUp defines if you want to attach events to pointerup\r\n * @param attachDown defines if you want to attach events to pointerdown\r\n * @param attachMove defines if you want to attach events to pointermove\r\n */\r\n public attachControl(attachUp = true, attachDown = true, attachMove = true): void {\r\n this._inputManager.attachControl(attachUp, attachDown, attachMove);\r\n }\r\n\r\n /** Detaches all event handlers*/\r\n public detachControl() {\r\n this._inputManager.detachControl();\r\n }\r\n\r\n /**\r\n * This function will check if the scene can be rendered (textures are loaded, shaders are compiled)\r\n * Delay loaded resources are not taking in account\r\n * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: true)\r\n * @returns true if all required resources are ready\r\n */\r\n public isReady(checkRenderTargets = true): boolean {\r\n if (this._isDisposed) {\r\n return false;\r\n }\r\n\r\n let index: number;\r\n const engine = this.getEngine();\r\n\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n\r\n engine.currentRenderPassId = this.activeCamera?.renderPassId ?? currentRenderPassId;\r\n\r\n let isReady = true;\r\n\r\n // Pending data\r\n if (this._pendingData.length > 0) {\r\n isReady = false;\r\n }\r\n\r\n // Ensures that the pre-pass renderer is enabled if it is to be enabled.\r\n this.prePassRenderer?.update();\r\n\r\n // OIT\r\n if (this.useOrderIndependentTransparency && this.depthPeelingRenderer) {\r\n isReady &&= this.depthPeelingRenderer.isReady();\r\n }\r\n\r\n // Meshes\r\n if (checkRenderTargets) {\r\n this._processedMaterials.reset();\r\n this._materialsRenderTargets.reset();\r\n }\r\n\r\n for (index = 0; index < this.meshes.length; index++) {\r\n const mesh = this.meshes[index];\r\n\r\n if (!mesh.subMeshes || mesh.subMeshes.length === 0) {\r\n continue;\r\n }\r\n\r\n // Do not stop at the first encountered \"unready\" object as we want to ensure\r\n // all materials are starting off their compilation in parallel.\r\n if (!mesh.isReady(true)) {\r\n isReady = false;\r\n continue;\r\n }\r\n\r\n const hardwareInstancedRendering =\r\n mesh.hasThinInstances ||\r\n mesh.getClassName() === \"InstancedMesh\" ||\r\n mesh.getClassName() === \"InstancedLinesMesh\" ||\r\n (engine.getCaps().instancedArrays && (mesh).instances.length > 0);\r\n // Is Ready For Mesh\r\n for (const step of this._isReadyForMeshStage) {\r\n if (!step.action(mesh, hardwareInstancedRendering)) {\r\n isReady = false;\r\n }\r\n }\r\n\r\n if (!checkRenderTargets) {\r\n continue;\r\n }\r\n\r\n const mat = mesh.material || this.defaultMaterial;\r\n if (mat) {\r\n if (mat._storeEffectOnSubMeshes) {\r\n for (const subMesh of mesh.subMeshes) {\r\n const material = subMesh.getMaterial();\r\n if (material && material.hasRenderTargetTextures && material.getRenderTargetTextures != null) {\r\n if (this._processedMaterials.indexOf(material) === -1) {\r\n this._processedMaterials.push(material);\r\n\r\n this._materialsRenderTargets.concatWithNoDuplicate(material.getRenderTargetTextures!());\r\n }\r\n }\r\n }\r\n } else {\r\n if (mat.hasRenderTargetTextures && mat.getRenderTargetTextures != null) {\r\n if (this._processedMaterials.indexOf(mat) === -1) {\r\n this._processedMaterials.push(mat);\r\n\r\n this._materialsRenderTargets.concatWithNoDuplicate(mat.getRenderTargetTextures!());\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Render targets\r\n if (checkRenderTargets) {\r\n for (index = 0; index < this._materialsRenderTargets.length; ++index) {\r\n const rtt = this._materialsRenderTargets.data[index];\r\n if (!rtt.isReadyForRendering()) {\r\n isReady = false;\r\n }\r\n }\r\n }\r\n\r\n // Geometries\r\n for (index = 0; index < this.geometries.length; index++) {\r\n const geometry = this.geometries[index];\r\n\r\n if (geometry.delayLoadState === Constants.DELAYLOADSTATE_LOADING) {\r\n isReady = false;\r\n }\r\n }\r\n\r\n // Post-processes\r\n if (this.activeCameras && this.activeCameras.length > 0) {\r\n for (const camera of this.activeCameras) {\r\n if (!camera.isReady(true)) {\r\n isReady = false;\r\n }\r\n }\r\n } else if (this.activeCamera) {\r\n if (!this.activeCamera.isReady(true)) {\r\n isReady = false;\r\n }\r\n }\r\n\r\n // Particles\r\n for (const particleSystem of this.particleSystems) {\r\n if (!particleSystem.isReady()) {\r\n isReady = false;\r\n }\r\n }\r\n\r\n // Layers\r\n if (this.layers) {\r\n for (const layer of this.layers) {\r\n if (!layer.isReady()) {\r\n isReady = false;\r\n }\r\n }\r\n }\r\n\r\n // Effects\r\n if (!engine.areAllEffectsReady()) {\r\n isReady = false;\r\n }\r\n\r\n engine.currentRenderPassId = currentRenderPassId;\r\n\r\n return isReady;\r\n }\r\n\r\n /** Resets all cached information relative to material (including effect and visibility) */\r\n public resetCachedMaterial(): void {\r\n this._cachedMaterial = null;\r\n this._cachedEffect = null;\r\n this._cachedVisibility = null;\r\n }\r\n\r\n /**\r\n * Registers a function to be called before every frame render\r\n * @param func defines the function to register\r\n */\r\n public registerBeforeRender(func: () => void): void {\r\n this.onBeforeRenderObservable.add(func);\r\n }\r\n\r\n /**\r\n * Unregisters a function called before every frame render\r\n * @param func defines the function to unregister\r\n */\r\n public unregisterBeforeRender(func: () => void): void {\r\n this.onBeforeRenderObservable.removeCallback(func);\r\n }\r\n\r\n /**\r\n * Registers a function to be called after every frame render\r\n * @param func defines the function to register\r\n */\r\n public registerAfterRender(func: () => void): void {\r\n this.onAfterRenderObservable.add(func);\r\n }\r\n\r\n /**\r\n * Unregisters a function called after every frame render\r\n * @param func defines the function to unregister\r\n */\r\n public unregisterAfterRender(func: () => void): void {\r\n this.onAfterRenderObservable.removeCallback(func);\r\n }\r\n\r\n private _executeOnceBeforeRender(func: () => void): void {\r\n const execFunc = () => {\r\n func();\r\n setTimeout(() => {\r\n this.unregisterBeforeRender(execFunc);\r\n });\r\n };\r\n this.registerBeforeRender(execFunc);\r\n }\r\n\r\n /**\r\n * The provided function will run before render once and will be disposed afterwards.\r\n * A timeout delay can be provided so that the function will be executed in N ms.\r\n * The timeout is using the browser's native setTimeout so time percision cannot be guaranteed.\r\n * @param func The function to be executed.\r\n * @param timeout optional delay in ms\r\n */\r\n public executeOnceBeforeRender(func: () => void, timeout?: number): void {\r\n if (timeout !== undefined) {\r\n setTimeout(() => {\r\n this._executeOnceBeforeRender(func);\r\n }, timeout);\r\n } else {\r\n this._executeOnceBeforeRender(func);\r\n }\r\n }\r\n\r\n /**\r\n * This function can help adding any object to the list of data awaited to be ready in order to check for a complete scene loading.\r\n * @param data defines the object to wait for\r\n */\r\n public addPendingData(data: any): void {\r\n this._pendingData.push(data);\r\n }\r\n\r\n /**\r\n * Remove a pending data from the loading list which has previously been added with addPendingData.\r\n * @param data defines the object to remove from the pending list\r\n */\r\n public removePendingData(data: any): void {\r\n const wasLoading = this.isLoading;\r\n const index = this._pendingData.indexOf(data);\r\n\r\n if (index !== -1) {\r\n this._pendingData.splice(index, 1);\r\n }\r\n\r\n if (wasLoading && !this.isLoading) {\r\n this.onDataLoadedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the number of items waiting to be loaded\r\n * @returns the number of items waiting to be loaded\r\n */\r\n public getWaitingItemsCount(): number {\r\n return this._pendingData.length;\r\n }\r\n\r\n /**\r\n * Returns a boolean indicating if the scene is still loading data\r\n */\r\n public get isLoading(): boolean {\r\n return this._pendingData.length > 0;\r\n }\r\n\r\n /**\r\n * Registers a function to be executed when the scene is ready\r\n * @param func - the function to be executed\r\n * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false)\r\n */\r\n public executeWhenReady(func: () => void, checkRenderTargets = false): void {\r\n this.onReadyObservable.addOnce(func);\r\n\r\n if (this._executeWhenReadyTimeoutId !== null) {\r\n return;\r\n }\r\n\r\n this._checkIsReady(checkRenderTargets);\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves when the scene is ready\r\n * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false)\r\n * @returns A promise that resolves when the scene is ready\r\n */\r\n public whenReadyAsync(checkRenderTargets = false): Promise {\r\n return new Promise((resolve) => {\r\n this.executeWhenReady(() => {\r\n resolve();\r\n }, checkRenderTargets);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _checkIsReady(checkRenderTargets = false) {\r\n this._registerTransientComponents();\r\n\r\n if (this.isReady(checkRenderTargets)) {\r\n this.onReadyObservable.notifyObservers(this);\r\n\r\n this.onReadyObservable.clear();\r\n this._executeWhenReadyTimeoutId = null;\r\n return;\r\n }\r\n\r\n if (this._isDisposed) {\r\n this.onReadyObservable.clear();\r\n this._executeWhenReadyTimeoutId = null;\r\n return;\r\n }\r\n\r\n this._executeWhenReadyTimeoutId = setTimeout(() => {\r\n // Ensure materials effects are checked outside render loops\r\n this.incrementRenderId();\r\n this._checkIsReady(checkRenderTargets);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Gets all animatable attached to the scene\r\n */\r\n public get animatables(): Animatable[] {\r\n return this._activeAnimatables;\r\n }\r\n\r\n /**\r\n * Resets the last animation time frame.\r\n * Useful to override when animations start running when loading a scene for the first time.\r\n */\r\n public resetLastAnimationTimeFrame(): void {\r\n this._animationTimeLast = PrecisionDate.Now;\r\n }\r\n\r\n // Matrix\r\n\r\n /**\r\n * Gets the current view matrix\r\n * @returns a Matrix\r\n */\r\n public getViewMatrix(): Matrix {\r\n return this._viewMatrix;\r\n }\r\n\r\n /**\r\n * Gets the current projection matrix\r\n * @returns a Matrix\r\n */\r\n public getProjectionMatrix(): Matrix {\r\n return this._projectionMatrix;\r\n }\r\n\r\n /**\r\n * Gets the current transform matrix\r\n * @returns a Matrix made of View * Projection\r\n */\r\n public getTransformMatrix(): Matrix {\r\n return this._transformMatrix;\r\n }\r\n\r\n /**\r\n * Sets the current transform matrix\r\n * @param viewL defines the View matrix to use\r\n * @param projectionL defines the Projection matrix to use\r\n * @param viewR defines the right View matrix to use (if provided)\r\n * @param projectionR defines the right Projection matrix to use (if provided)\r\n */\r\n public setTransformMatrix(viewL: Matrix, projectionL: Matrix, viewR?: Matrix, projectionR?: Matrix): void {\r\n // clear the multiviewSceneUbo if no viewR and projectionR are defined\r\n if (!viewR && !projectionR && this._multiviewSceneUbo) {\r\n this._multiviewSceneUbo.dispose();\r\n this._multiviewSceneUbo = null;\r\n }\r\n if (this._viewUpdateFlag === viewL.updateFlag && this._projectionUpdateFlag === projectionL.updateFlag) {\r\n return;\r\n }\r\n\r\n this._viewUpdateFlag = viewL.updateFlag;\r\n this._projectionUpdateFlag = projectionL.updateFlag;\r\n this._viewMatrix = viewL;\r\n this._projectionMatrix = projectionL;\r\n\r\n this._viewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix);\r\n\r\n // Update frustum\r\n if (!this._frustumPlanes) {\r\n this._frustumPlanes = Frustum.GetPlanes(this._transformMatrix);\r\n } else {\r\n Frustum.GetPlanesToRef(this._transformMatrix, this._frustumPlanes);\r\n }\r\n\r\n if (this._multiviewSceneUbo && this._multiviewSceneUbo.useUbo) {\r\n this._updateMultiviewUbo(viewR, projectionR);\r\n } else if (this._sceneUbo.useUbo) {\r\n this._sceneUbo.updateMatrix(\"viewProjection\", this._transformMatrix);\r\n this._sceneUbo.updateMatrix(\"view\", this._viewMatrix);\r\n this._sceneUbo.updateMatrix(\"projection\", this._projectionMatrix);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the uniform buffer used to store scene data\r\n * @returns a UniformBuffer\r\n */\r\n public getSceneUniformBuffer(): UniformBuffer {\r\n return this._multiviewSceneUbo ? this._multiviewSceneUbo : this._sceneUbo;\r\n }\r\n\r\n /**\r\n * Creates a scene UBO\r\n * @param name name of the uniform buffer (optional, for debugging purpose only)\r\n * @returns a new ubo\r\n */\r\n public createSceneUniformBuffer(name?: string): UniformBuffer {\r\n const sceneUbo = new UniformBuffer(this._engine, undefined, false, name ?? \"scene\");\r\n sceneUbo.addUniform(\"viewProjection\", 16);\r\n sceneUbo.addUniform(\"view\", 16);\r\n sceneUbo.addUniform(\"projection\", 16);\r\n sceneUbo.addUniform(\"vEyePosition\", 4);\r\n\r\n return sceneUbo;\r\n }\r\n\r\n /**\r\n * Sets the scene ubo\r\n * @param ubo the ubo to set for the scene\r\n */\r\n public setSceneUniformBuffer(ubo: UniformBuffer): void {\r\n this._sceneUbo = ubo;\r\n this._viewUpdateFlag = -1;\r\n this._projectionUpdateFlag = -1;\r\n }\r\n\r\n /**\r\n * Gets an unique (relatively to the current scene) Id\r\n * @returns an unique number for the scene\r\n */\r\n public getUniqueId() {\r\n return UniqueIdGenerator.UniqueId;\r\n }\r\n\r\n /**\r\n * Add a mesh to the list of scene's meshes\r\n * @param newMesh defines the mesh to add\r\n * @param recursive if all child meshes should also be added to the scene\r\n */\r\n public addMesh(newMesh: AbstractMesh, recursive = false) {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n\r\n this.meshes.push(newMesh);\r\n\r\n newMesh._resyncLightSources();\r\n\r\n if (!newMesh.parent) {\r\n newMesh._addToSceneRootNodes();\r\n }\r\n\r\n this.onNewMeshAddedObservable.notifyObservers(newMesh);\r\n\r\n if (recursive) {\r\n newMesh.getChildMeshes().forEach((m) => {\r\n this.addMesh(m);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Remove a mesh for the list of scene's meshes\r\n * @param toRemove defines the mesh to remove\r\n * @param recursive if all child meshes should also be removed from the scene\r\n * @returns the index where the mesh was in the mesh list\r\n */\r\n public removeMesh(toRemove: AbstractMesh, recursive = false): number {\r\n const index = this.meshes.indexOf(toRemove);\r\n if (index !== -1) {\r\n // Remove from the scene if mesh found\r\n this.meshes[index] = this.meshes[this.meshes.length - 1];\r\n this.meshes.pop();\r\n\r\n if (!toRemove.parent) {\r\n toRemove._removeFromSceneRootNodes();\r\n }\r\n }\r\n\r\n this._inputManager._invalidateMesh(toRemove);\r\n\r\n this.onMeshRemovedObservable.notifyObservers(toRemove);\r\n if (recursive) {\r\n toRemove.getChildMeshes().forEach((m) => {\r\n this.removeMesh(m);\r\n });\r\n }\r\n return index;\r\n }\r\n\r\n /**\r\n * Add a transform node to the list of scene's transform nodes\r\n * @param newTransformNode defines the transform node to add\r\n */\r\n public addTransformNode(newTransformNode: TransformNode) {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n\r\n if (newTransformNode.getScene() === this && newTransformNode._indexInSceneTransformNodesArray !== -1) {\r\n // Already there?\r\n return;\r\n }\r\n\r\n newTransformNode._indexInSceneTransformNodesArray = this.transformNodes.length;\r\n this.transformNodes.push(newTransformNode);\r\n\r\n if (!newTransformNode.parent) {\r\n newTransformNode._addToSceneRootNodes();\r\n }\r\n\r\n this.onNewTransformNodeAddedObservable.notifyObservers(newTransformNode);\r\n }\r\n\r\n /**\r\n * Remove a transform node for the list of scene's transform nodes\r\n * @param toRemove defines the transform node to remove\r\n * @returns the index where the transform node was in the transform node list\r\n */\r\n public removeTransformNode(toRemove: TransformNode): number {\r\n const index = toRemove._indexInSceneTransformNodesArray;\r\n if (index !== -1) {\r\n if (index !== this.transformNodes.length - 1) {\r\n const lastNode = this.transformNodes[this.transformNodes.length - 1];\r\n this.transformNodes[index] = lastNode;\r\n lastNode._indexInSceneTransformNodesArray = index;\r\n }\r\n\r\n toRemove._indexInSceneTransformNodesArray = -1;\r\n this.transformNodes.pop();\r\n if (!toRemove.parent) {\r\n toRemove._removeFromSceneRootNodes();\r\n }\r\n }\r\n\r\n this.onTransformNodeRemovedObservable.notifyObservers(toRemove);\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Remove a skeleton for the list of scene's skeletons\r\n * @param toRemove defines the skeleton to remove\r\n * @returns the index where the skeleton was in the skeleton list\r\n */\r\n public removeSkeleton(toRemove: Skeleton): number {\r\n const index = this.skeletons.indexOf(toRemove);\r\n if (index !== -1) {\r\n // Remove from the scene if found\r\n this.skeletons.splice(index, 1);\r\n this.onSkeletonRemovedObservable.notifyObservers(toRemove);\r\n\r\n // Clean active container\r\n this._executeActiveContainerCleanup(this._activeSkeletons);\r\n }\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Remove a morph target for the list of scene's morph targets\r\n * @param toRemove defines the morph target to remove\r\n * @returns the index where the morph target was in the morph target list\r\n */\r\n public removeMorphTargetManager(toRemove: MorphTargetManager): number {\r\n const index = this.morphTargetManagers.indexOf(toRemove);\r\n if (index !== -1) {\r\n // Remove from the scene if found\r\n this.morphTargetManagers.splice(index, 1);\r\n }\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Remove a light for the list of scene's lights\r\n * @param toRemove defines the light to remove\r\n * @returns the index where the light was in the light list\r\n */\r\n public removeLight(toRemove: Light): number {\r\n const index = this.lights.indexOf(toRemove);\r\n if (index !== -1) {\r\n // Remove from meshes\r\n for (const mesh of this.meshes) {\r\n mesh._removeLightSource(toRemove, false);\r\n }\r\n\r\n // Remove from the scene if mesh found\r\n this.lights.splice(index, 1);\r\n this.sortLightsByPriority();\r\n\r\n if (!toRemove.parent) {\r\n toRemove._removeFromSceneRootNodes();\r\n }\r\n }\r\n this.onLightRemovedObservable.notifyObservers(toRemove);\r\n return index;\r\n }\r\n\r\n /**\r\n * Remove a camera for the list of scene's cameras\r\n * @param toRemove defines the camera to remove\r\n * @returns the index where the camera was in the camera list\r\n */\r\n public removeCamera(toRemove: Camera): number {\r\n const index = this.cameras.indexOf(toRemove);\r\n if (index !== -1) {\r\n // Remove from the scene if mesh found\r\n this.cameras.splice(index, 1);\r\n if (!toRemove.parent) {\r\n toRemove._removeFromSceneRootNodes();\r\n }\r\n }\r\n // Remove from activeCameras\r\n if (this.activeCameras) {\r\n const index2 = this.activeCameras.indexOf(toRemove);\r\n if (index2 !== -1) {\r\n // Remove from the scene if mesh found\r\n this.activeCameras.splice(index2, 1);\r\n }\r\n }\r\n // Reset the activeCamera\r\n if (this.activeCamera === toRemove) {\r\n if (this.cameras.length > 0) {\r\n this.activeCamera = this.cameras[0];\r\n } else {\r\n this.activeCamera = null;\r\n }\r\n }\r\n this.onCameraRemovedObservable.notifyObservers(toRemove);\r\n return index;\r\n }\r\n\r\n /**\r\n * Remove a particle system for the list of scene's particle systems\r\n * @param toRemove defines the particle system to remove\r\n * @returns the index where the particle system was in the particle system list\r\n */\r\n public removeParticleSystem(toRemove: IParticleSystem): number {\r\n const index = this.particleSystems.indexOf(toRemove);\r\n if (index !== -1) {\r\n this.particleSystems.splice(index, 1);\r\n\r\n // Clean active container\r\n this._executeActiveContainerCleanup(this._activeParticleSystems);\r\n }\r\n return index;\r\n }\r\n\r\n /**\r\n * Remove a animation for the list of scene's animations\r\n * @param toRemove defines the animation to remove\r\n * @returns the index where the animation was in the animation list\r\n */\r\n public removeAnimation(toRemove: Animation): number {\r\n const index = this.animations.indexOf(toRemove);\r\n if (index !== -1) {\r\n this.animations.splice(index, 1);\r\n }\r\n return index;\r\n }\r\n\r\n /**\r\n * Will stop the animation of the given target\r\n * @param target - the target\r\n * @param animationName - the name of the animation to stop (all animations will be stopped if both this and targetMask are empty)\r\n * @param targetMask - a function that determines if the animation should be stopped based on its target (all animations will be stopped if both this and animationName are empty)\r\n */\r\n public stopAnimation(target: any, animationName?: string, targetMask?: (target: any) => boolean): void {\r\n // Do nothing as code will be provided by animation component\r\n }\r\n\r\n /**\r\n * Removes the given animation group from this scene.\r\n * @param toRemove The animation group to remove\r\n * @returns The index of the removed animation group\r\n */\r\n public removeAnimationGroup(toRemove: AnimationGroup): number {\r\n const index = this.animationGroups.indexOf(toRemove);\r\n if (index !== -1) {\r\n this.animationGroups.splice(index, 1);\r\n }\r\n return index;\r\n }\r\n\r\n /**\r\n * Removes the given multi-material from this scene.\r\n * @param toRemove The multi-material to remove\r\n * @returns The index of the removed multi-material\r\n */\r\n public removeMultiMaterial(toRemove: MultiMaterial): number {\r\n const index = this.multiMaterials.indexOf(toRemove);\r\n if (index !== -1) {\r\n this.multiMaterials.splice(index, 1);\r\n }\r\n\r\n this.onMultiMaterialRemovedObservable.notifyObservers(toRemove);\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Removes the given material from this scene.\r\n * @param toRemove The material to remove\r\n * @returns The index of the removed material\r\n */\r\n public removeMaterial(toRemove: Material): number {\r\n const index = toRemove._indexInSceneMaterialArray;\r\n if (index !== -1 && index < this.materials.length) {\r\n if (index !== this.materials.length - 1) {\r\n const lastMaterial = this.materials[this.materials.length - 1];\r\n this.materials[index] = lastMaterial;\r\n lastMaterial._indexInSceneMaterialArray = index;\r\n }\r\n\r\n toRemove._indexInSceneMaterialArray = -1;\r\n this.materials.pop();\r\n }\r\n\r\n this.onMaterialRemovedObservable.notifyObservers(toRemove);\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Removes the given action manager from this scene.\r\n * @deprecated\r\n * @param toRemove The action manager to remove\r\n * @returns The index of the removed action manager\r\n */\r\n public removeActionManager(toRemove: AbstractActionManager): number {\r\n const index = this.actionManagers.indexOf(toRemove);\r\n if (index !== -1) {\r\n this.actionManagers.splice(index, 1);\r\n }\r\n return index;\r\n }\r\n\r\n /**\r\n * Removes the given texture from this scene.\r\n * @param toRemove The texture to remove\r\n * @returns The index of the removed texture\r\n */\r\n public removeTexture(toRemove: BaseTexture): number {\r\n const index = this.textures.indexOf(toRemove);\r\n if (index !== -1) {\r\n this.textures.splice(index, 1);\r\n }\r\n this.onTextureRemovedObservable.notifyObservers(toRemove);\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Adds the given light to this scene\r\n * @param newLight The light to add\r\n */\r\n public addLight(newLight: Light): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.lights.push(newLight);\r\n this.sortLightsByPriority();\r\n\r\n if (!newLight.parent) {\r\n newLight._addToSceneRootNodes();\r\n }\r\n\r\n // Add light to all meshes (To support if the light is removed and then re-added)\r\n for (const mesh of this.meshes) {\r\n if (mesh.lightSources.indexOf(newLight) === -1) {\r\n mesh.lightSources.push(newLight);\r\n mesh._resyncLightSources();\r\n }\r\n }\r\n\r\n this.onNewLightAddedObservable.notifyObservers(newLight);\r\n }\r\n\r\n /**\r\n * Sorts the list list based on light priorities\r\n */\r\n public sortLightsByPriority(): void {\r\n if (this.requireLightSorting) {\r\n this.lights.sort(LightConstants.CompareLightsPriority);\r\n }\r\n }\r\n\r\n /**\r\n * Adds the given camera to this scene\r\n * @param newCamera The camera to add\r\n */\r\n public addCamera(newCamera: Camera): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n\r\n this.cameras.push(newCamera);\r\n this.onNewCameraAddedObservable.notifyObservers(newCamera);\r\n\r\n if (!newCamera.parent) {\r\n newCamera._addToSceneRootNodes();\r\n }\r\n }\r\n\r\n /**\r\n * Adds the given skeleton to this scene\r\n * @param newSkeleton The skeleton to add\r\n */\r\n public addSkeleton(newSkeleton: Skeleton): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.skeletons.push(newSkeleton);\r\n this.onNewSkeletonAddedObservable.notifyObservers(newSkeleton);\r\n }\r\n\r\n /**\r\n * Adds the given particle system to this scene\r\n * @param newParticleSystem The particle system to add\r\n */\r\n public addParticleSystem(newParticleSystem: IParticleSystem): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.particleSystems.push(newParticleSystem);\r\n }\r\n\r\n /**\r\n * Adds the given animation to this scene\r\n * @param newAnimation The animation to add\r\n */\r\n public addAnimation(newAnimation: Animation): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.animations.push(newAnimation);\r\n }\r\n\r\n /**\r\n * Adds the given animation group to this scene.\r\n * @param newAnimationGroup The animation group to add\r\n */\r\n public addAnimationGroup(newAnimationGroup: AnimationGroup): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.animationGroups.push(newAnimationGroup);\r\n }\r\n\r\n /**\r\n * Adds the given multi-material to this scene\r\n * @param newMultiMaterial The multi-material to add\r\n */\r\n public addMultiMaterial(newMultiMaterial: MultiMaterial): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.multiMaterials.push(newMultiMaterial);\r\n this.onNewMultiMaterialAddedObservable.notifyObservers(newMultiMaterial);\r\n }\r\n\r\n /**\r\n * Adds the given material to this scene\r\n * @param newMaterial The material to add\r\n */\r\n public addMaterial(newMaterial: Material): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n\r\n if (newMaterial.getScene() === this && newMaterial._indexInSceneMaterialArray !== -1) {\r\n // Already there??\r\n return;\r\n }\r\n\r\n newMaterial._indexInSceneMaterialArray = this.materials.length;\r\n this.materials.push(newMaterial);\r\n this.onNewMaterialAddedObservable.notifyObservers(newMaterial);\r\n }\r\n\r\n /**\r\n * Adds the given morph target to this scene\r\n * @param newMorphTargetManager The morph target to add\r\n */\r\n public addMorphTargetManager(newMorphTargetManager: MorphTargetManager): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.morphTargetManagers.push(newMorphTargetManager);\r\n }\r\n\r\n /**\r\n * Adds the given geometry to this scene\r\n * @param newGeometry The geometry to add\r\n */\r\n public addGeometry(newGeometry: Geometry): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n\r\n if (this._geometriesByUniqueId) {\r\n this._geometriesByUniqueId[newGeometry.uniqueId] = this.geometries.length;\r\n }\r\n\r\n this.geometries.push(newGeometry);\r\n }\r\n\r\n /**\r\n * Adds the given action manager to this scene\r\n * @deprecated\r\n * @param newActionManager The action manager to add\r\n */\r\n public addActionManager(newActionManager: AbstractActionManager): void {\r\n this.actionManagers.push(newActionManager);\r\n }\r\n\r\n /**\r\n * Adds the given texture to this scene.\r\n * @param newTexture The texture to add\r\n */\r\n public addTexture(newTexture: BaseTexture): void {\r\n if (this._blockEntityCollection) {\r\n return;\r\n }\r\n this.textures.push(newTexture);\r\n this.onNewTextureAddedObservable.notifyObservers(newTexture);\r\n }\r\n\r\n /**\r\n * Switch active camera\r\n * @param newCamera defines the new active camera\r\n * @param attachControl defines if attachControl must be called for the new active camera (default: true)\r\n */\r\n public switchActiveCamera(newCamera: Camera, attachControl = true): void {\r\n const canvas = this._engine.getInputElement();\r\n\r\n if (!canvas) {\r\n return;\r\n }\r\n\r\n if (this.activeCamera) {\r\n this.activeCamera.detachControl();\r\n }\r\n this.activeCamera = newCamera;\r\n if (attachControl) {\r\n newCamera.attachControl();\r\n }\r\n }\r\n\r\n /**\r\n * sets the active camera of the scene using its Id\r\n * @param id defines the camera's Id\r\n * @returns the new active camera or null if none found.\r\n */\r\n public setActiveCameraById(id: string): Nullable {\r\n const camera = this.getCameraById(id);\r\n\r\n if (camera) {\r\n this.activeCamera = camera;\r\n return camera;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * sets the active camera of the scene using its name\r\n * @param name defines the camera's name\r\n * @returns the new active camera or null if none found.\r\n */\r\n public setActiveCameraByName(name: string): Nullable {\r\n const camera = this.getCameraByName(name);\r\n\r\n if (camera) {\r\n this.activeCamera = camera;\r\n return camera;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * get an animation group using its name\r\n * @param name defines the material's name\r\n * @returns the animation group or null if none found.\r\n */\r\n public getAnimationGroupByName(name: string): Nullable {\r\n for (let index = 0; index < this.animationGroups.length; index++) {\r\n if (this.animationGroups[index].name === name) {\r\n return this.animationGroups[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _getMaterial(allowMultiMaterials: boolean, predicate: (m: Material) => boolean): Nullable {\r\n for (let index = 0; index < this.materials.length; index++) {\r\n const material = this.materials[index];\r\n if (predicate(material)) {\r\n return material;\r\n }\r\n }\r\n if (allowMultiMaterials) {\r\n for (let index = 0; index < this.multiMaterials.length; index++) {\r\n const material = this.multiMaterials[index];\r\n if (predicate(material)) {\r\n return material;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Get a material using its unique id\r\n * @param uniqueId defines the material's unique id\r\n * @param allowMultiMaterials determines whether multimaterials should be considered\r\n * @returns the material or null if none found.\r\n */\r\n public getMaterialByUniqueID(uniqueId: number, allowMultiMaterials: boolean = false): Nullable {\r\n return this._getMaterial(allowMultiMaterials, (m) => m.uniqueId === uniqueId);\r\n }\r\n\r\n /**\r\n * get a material using its id\r\n * @param id defines the material's Id\r\n * @param allowMultiMaterials determines whether multimaterials should be considered\r\n * @returns the material or null if none found.\r\n */\r\n public getMaterialById(id: string, allowMultiMaterials: boolean = false): Nullable {\r\n return this._getMaterial(allowMultiMaterials, (m) => m.id === id);\r\n }\r\n\r\n /**\r\n * Gets a material using its name\r\n * @param name defines the material's name\r\n * @param allowMultiMaterials determines whether multimaterials should be considered\r\n * @returns the material or null if none found.\r\n */\r\n public getMaterialByName(name: string, allowMultiMaterials: boolean = false): Nullable {\r\n return this._getMaterial(allowMultiMaterials, (m) => m.name === name);\r\n }\r\n\r\n /**\r\n * Gets a last added material using a given id\r\n * @param id defines the material's id\r\n * @param allowMultiMaterials determines whether multimaterials should be considered\r\n * @returns the last material with the given id or null if none found.\r\n */\r\n public getLastMaterialById(id: string, allowMultiMaterials: boolean = false): Nullable {\r\n for (let index = this.materials.length - 1; index >= 0; index--) {\r\n if (this.materials[index].id === id) {\r\n return this.materials[index];\r\n }\r\n }\r\n if (allowMultiMaterials) {\r\n for (let index = this.multiMaterials.length - 1; index >= 0; index--) {\r\n if (this.multiMaterials[index].id === id) {\r\n return this.multiMaterials[index];\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Get a texture using its unique id\r\n * @param uniqueId defines the texture's unique id\r\n * @returns the texture or null if none found.\r\n */\r\n public getTextureByUniqueId(uniqueId: number): Nullable {\r\n for (let index = 0; index < this.textures.length; index++) {\r\n if (this.textures[index].uniqueId === uniqueId) {\r\n return this.textures[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a texture using its name\r\n * @param name defines the texture's name\r\n * @returns the texture or null if none found.\r\n */\r\n public getTextureByName(name: string): Nullable {\r\n for (let index = 0; index < this.textures.length; index++) {\r\n if (this.textures[index].name === name) {\r\n return this.textures[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a camera using its Id\r\n * @param id defines the Id to look for\r\n * @returns the camera or null if not found\r\n */\r\n public getCameraById(id: string): Nullable {\r\n for (let index = 0; index < this.cameras.length; index++) {\r\n if (this.cameras[index].id === id) {\r\n return this.cameras[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a camera using its unique Id\r\n * @param uniqueId defines the unique Id to look for\r\n * @returns the camera or null if not found\r\n */\r\n public getCameraByUniqueId(uniqueId: number): Nullable {\r\n for (let index = 0; index < this.cameras.length; index++) {\r\n if (this.cameras[index].uniqueId === uniqueId) {\r\n return this.cameras[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a camera using its name\r\n * @param name defines the camera's name\r\n * @returns the camera or null if none found.\r\n */\r\n public getCameraByName(name: string): Nullable {\r\n for (let index = 0; index < this.cameras.length; index++) {\r\n if (this.cameras[index].name === name) {\r\n return this.cameras[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a bone using its Id\r\n * @param id defines the bone's Id\r\n * @returns the bone or null if not found\r\n */\r\n public getBoneById(id: string): Nullable {\r\n for (let skeletonIndex = 0; skeletonIndex < this.skeletons.length; skeletonIndex++) {\r\n const skeleton = this.skeletons[skeletonIndex];\r\n for (let boneIndex = 0; boneIndex < skeleton.bones.length; boneIndex++) {\r\n if (skeleton.bones[boneIndex].id === id) {\r\n return skeleton.bones[boneIndex];\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a bone using its id\r\n * @param name defines the bone's name\r\n * @returns the bone or null if not found\r\n */\r\n public getBoneByName(name: string): Nullable {\r\n for (let skeletonIndex = 0; skeletonIndex < this.skeletons.length; skeletonIndex++) {\r\n const skeleton = this.skeletons[skeletonIndex];\r\n for (let boneIndex = 0; boneIndex < skeleton.bones.length; boneIndex++) {\r\n if (skeleton.bones[boneIndex].name === name) {\r\n return skeleton.bones[boneIndex];\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a light node using its name\r\n * @param name defines the light's name\r\n * @returns the light or null if none found.\r\n */\r\n public getLightByName(name: string): Nullable {\r\n for (let index = 0; index < this.lights.length; index++) {\r\n if (this.lights[index].name === name) {\r\n return this.lights[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a light node using its Id\r\n * @param id defines the light's Id\r\n * @returns the light or null if none found.\r\n */\r\n public getLightById(id: string): Nullable {\r\n for (let index = 0; index < this.lights.length; index++) {\r\n if (this.lights[index].id === id) {\r\n return this.lights[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a light node using its scene-generated unique Id\r\n * @param uniqueId defines the light's unique Id\r\n * @returns the light or null if none found.\r\n */\r\n public getLightByUniqueId(uniqueId: number): Nullable {\r\n for (let index = 0; index < this.lights.length; index++) {\r\n if (this.lights[index].uniqueId === uniqueId) {\r\n return this.lights[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a particle system by Id\r\n * @param id defines the particle system Id\r\n * @returns the corresponding system or null if none found\r\n */\r\n public getParticleSystemById(id: string): Nullable {\r\n for (let index = 0; index < this.particleSystems.length; index++) {\r\n if (this.particleSystems[index].id === id) {\r\n return this.particleSystems[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a geometry using its Id\r\n * @param id defines the geometry's Id\r\n * @returns the geometry or null if none found.\r\n */\r\n public getGeometryById(id: string): Nullable {\r\n for (let index = 0; index < this.geometries.length; index++) {\r\n if (this.geometries[index].id === id) {\r\n return this.geometries[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _getGeometryByUniqueId(uniqueId: number): Nullable {\r\n if (this._geometriesByUniqueId) {\r\n const index = this._geometriesByUniqueId[uniqueId];\r\n if (index !== undefined) {\r\n return this.geometries[index];\r\n }\r\n } else {\r\n for (let index = 0; index < this.geometries.length; index++) {\r\n if (this.geometries[index].uniqueId === uniqueId) {\r\n return this.geometries[index];\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Add a new geometry to this scene\r\n * @param geometry defines the geometry to be added to the scene.\r\n * @param force defines if the geometry must be pushed even if a geometry with this id already exists\r\n * @returns a boolean defining if the geometry was added or not\r\n */\r\n public pushGeometry(geometry: Geometry, force?: boolean): boolean {\r\n if (!force && this._getGeometryByUniqueId(geometry.uniqueId)) {\r\n return false;\r\n }\r\n\r\n this.addGeometry(geometry);\r\n\r\n this.onNewGeometryAddedObservable.notifyObservers(geometry);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Removes an existing geometry\r\n * @param geometry defines the geometry to be removed from the scene\r\n * @returns a boolean defining if the geometry was removed or not\r\n */\r\n public removeGeometry(geometry: Geometry): boolean {\r\n let index;\r\n if (this._geometriesByUniqueId) {\r\n index = this._geometriesByUniqueId[geometry.uniqueId];\r\n if (index === undefined) {\r\n return false;\r\n }\r\n } else {\r\n index = this.geometries.indexOf(geometry);\r\n if (index < 0) {\r\n return false;\r\n }\r\n }\r\n\r\n if (index !== this.geometries.length - 1) {\r\n const lastGeometry = this.geometries[this.geometries.length - 1];\r\n if (lastGeometry) {\r\n this.geometries[index] = lastGeometry;\r\n if (this._geometriesByUniqueId) {\r\n this._geometriesByUniqueId[lastGeometry.uniqueId] = index;\r\n }\r\n }\r\n }\r\n\r\n if (this._geometriesByUniqueId) {\r\n this._geometriesByUniqueId[geometry.uniqueId] = undefined;\r\n }\r\n\r\n this.geometries.pop();\r\n\r\n this.onGeometryRemovedObservable.notifyObservers(geometry);\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets the list of geometries attached to the scene\r\n * @returns an array of Geometry\r\n */\r\n public getGeometries(): Geometry[] {\r\n return this.geometries;\r\n }\r\n\r\n /**\r\n * Gets the first added mesh found of a given Id\r\n * @param id defines the Id to search for\r\n * @returns the mesh found or null if not found at all\r\n */\r\n public getMeshById(id: string): Nullable {\r\n for (let index = 0; index < this.meshes.length; index++) {\r\n if (this.meshes[index].id === id) {\r\n return this.meshes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a list of meshes using their Id\r\n * @param id defines the Id to search for\r\n * @returns a list of meshes\r\n */\r\n public getMeshesById(id: string): Array {\r\n return this.meshes.filter(function (m) {\r\n return m.id === id;\r\n });\r\n }\r\n\r\n /**\r\n * Gets the first added transform node found of a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found transform node or null if not found at all.\r\n */\r\n public getTransformNodeById(id: string): Nullable {\r\n for (let index = 0; index < this.transformNodes.length; index++) {\r\n if (this.transformNodes[index].id === id) {\r\n return this.transformNodes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a transform node with its auto-generated unique Id\r\n * @param uniqueId defines the unique Id to search for\r\n * @returns the found transform node or null if not found at all.\r\n */\r\n public getTransformNodeByUniqueId(uniqueId: number): Nullable {\r\n for (let index = 0; index < this.transformNodes.length; index++) {\r\n if (this.transformNodes[index].uniqueId === uniqueId) {\r\n return this.transformNodes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a list of transform nodes using their Id\r\n * @param id defines the Id to search for\r\n * @returns a list of transform nodes\r\n */\r\n public getTransformNodesById(id: string): Array {\r\n return this.transformNodes.filter(function (m) {\r\n return m.id === id;\r\n });\r\n }\r\n\r\n /**\r\n * Gets a mesh with its auto-generated unique Id\r\n * @param uniqueId defines the unique Id to search for\r\n * @returns the found mesh or null if not found at all.\r\n */\r\n public getMeshByUniqueId(uniqueId: number): Nullable {\r\n for (let index = 0; index < this.meshes.length; index++) {\r\n if (this.meshes[index].uniqueId === uniqueId) {\r\n return this.meshes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a the last added mesh using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found mesh or null if not found at all.\r\n */\r\n public getLastMeshById(id: string): Nullable {\r\n for (let index = this.meshes.length - 1; index >= 0; index--) {\r\n if (this.meshes[index].id === id) {\r\n return this.meshes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a the last transform node using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found mesh or null if not found at all.\r\n */\r\n public getLastTransformNodeById(id: string): Nullable {\r\n for (let index = this.transformNodes.length - 1; index >= 0; index--) {\r\n if (this.transformNodes[index].id === id) {\r\n return this.transformNodes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a the last added node (Mesh, Camera, Light) using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found node or null if not found at all\r\n */\r\n public getLastEntryById(id: string): Nullable {\r\n let index: number;\r\n for (index = this.meshes.length - 1; index >= 0; index--) {\r\n if (this.meshes[index].id === id) {\r\n return this.meshes[index];\r\n }\r\n }\r\n\r\n for (index = this.transformNodes.length - 1; index >= 0; index--) {\r\n if (this.transformNodes[index].id === id) {\r\n return this.transformNodes[index];\r\n }\r\n }\r\n\r\n for (index = this.cameras.length - 1; index >= 0; index--) {\r\n if (this.cameras[index].id === id) {\r\n return this.cameras[index];\r\n }\r\n }\r\n\r\n for (index = this.lights.length - 1; index >= 0; index--) {\r\n if (this.lights[index].id === id) {\r\n return this.lights[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a node (Mesh, Camera, Light) using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found node or null if not found at all\r\n */\r\n public getNodeById(id: string): Nullable {\r\n const mesh = this.getMeshById(id);\r\n if (mesh) {\r\n return mesh;\r\n }\r\n\r\n const transformNode = this.getTransformNodeById(id);\r\n if (transformNode) {\r\n return transformNode;\r\n }\r\n\r\n const light = this.getLightById(id);\r\n if (light) {\r\n return light;\r\n }\r\n\r\n const camera = this.getCameraById(id);\r\n if (camera) {\r\n return camera;\r\n }\r\n\r\n const bone = this.getBoneById(id);\r\n if (bone) {\r\n return bone;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a node (Mesh, Camera, Light) using a given name\r\n * @param name defines the name to search for\r\n * @returns the found node or null if not found at all.\r\n */\r\n public getNodeByName(name: string): Nullable {\r\n const mesh = this.getMeshByName(name);\r\n if (mesh) {\r\n return mesh;\r\n }\r\n\r\n const transformNode = this.getTransformNodeByName(name);\r\n if (transformNode) {\r\n return transformNode;\r\n }\r\n\r\n const light = this.getLightByName(name);\r\n if (light) {\r\n return light;\r\n }\r\n\r\n const camera = this.getCameraByName(name);\r\n if (camera) {\r\n return camera;\r\n }\r\n\r\n const bone = this.getBoneByName(name);\r\n if (bone) {\r\n return bone;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a mesh using a given name\r\n * @param name defines the name to search for\r\n * @returns the found mesh or null if not found at all.\r\n */\r\n public getMeshByName(name: string): Nullable {\r\n for (let index = 0; index < this.meshes.length; index++) {\r\n if (this.meshes[index].name === name) {\r\n return this.meshes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a transform node using a given name\r\n * @param name defines the name to search for\r\n * @returns the found transform node or null if not found at all.\r\n */\r\n public getTransformNodeByName(name: string): Nullable {\r\n for (let index = 0; index < this.transformNodes.length; index++) {\r\n if (this.transformNodes[index].name === name) {\r\n return this.transformNodes[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a skeleton using a given Id (if many are found, this function will pick the last one)\r\n * @param id defines the Id to search for\r\n * @returns the found skeleton or null if not found at all.\r\n */\r\n public getLastSkeletonById(id: string): Nullable {\r\n for (let index = this.skeletons.length - 1; index >= 0; index--) {\r\n if (this.skeletons[index].id === id) {\r\n return this.skeletons[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a skeleton using a given auto generated unique id\r\n * @param uniqueId defines the unique id to search for\r\n * @returns the found skeleton or null if not found at all.\r\n */\r\n public getSkeletonByUniqueId(uniqueId: number): Nullable {\r\n for (let index = 0; index < this.skeletons.length; index++) {\r\n if (this.skeletons[index].uniqueId === uniqueId) {\r\n return this.skeletons[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a skeleton using a given id (if many are found, this function will pick the first one)\r\n * @param id defines the id to search for\r\n * @returns the found skeleton or null if not found at all.\r\n */\r\n public getSkeletonById(id: string): Nullable {\r\n for (let index = 0; index < this.skeletons.length; index++) {\r\n if (this.skeletons[index].id === id) {\r\n return this.skeletons[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a skeleton using a given name\r\n * @param name defines the name to search for\r\n * @returns the found skeleton or null if not found at all.\r\n */\r\n public getSkeletonByName(name: string): Nullable {\r\n for (let index = 0; index < this.skeletons.length; index++) {\r\n if (this.skeletons[index].name === name) {\r\n return this.skeletons[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a morph target manager using a given id (if many are found, this function will pick the last one)\r\n * @param id defines the id to search for\r\n * @returns the found morph target manager or null if not found at all.\r\n */\r\n public getMorphTargetManagerById(id: number): Nullable {\r\n for (let index = 0; index < this.morphTargetManagers.length; index++) {\r\n if (this.morphTargetManagers[index].uniqueId === id) {\r\n return this.morphTargetManagers[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a morph target using a given id (if many are found, this function will pick the first one)\r\n * @param id defines the id to search for\r\n * @returns the found morph target or null if not found at all.\r\n */\r\n public getMorphTargetById(id: string): Nullable {\r\n for (let managerIndex = 0; managerIndex < this.morphTargetManagers.length; ++managerIndex) {\r\n const morphTargetManager = this.morphTargetManagers[managerIndex];\r\n for (let index = 0; index < morphTargetManager.numTargets; ++index) {\r\n const target = morphTargetManager.getTarget(index);\r\n if (target.id === id) {\r\n return target;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a morph target using a given name (if many are found, this function will pick the first one)\r\n * @param name defines the name to search for\r\n * @returns the found morph target or null if not found at all.\r\n */\r\n public getMorphTargetByName(name: string): Nullable {\r\n for (let managerIndex = 0; managerIndex < this.morphTargetManagers.length; ++managerIndex) {\r\n const morphTargetManager = this.morphTargetManagers[managerIndex];\r\n for (let index = 0; index < morphTargetManager.numTargets; ++index) {\r\n const target = morphTargetManager.getTarget(index);\r\n if (target.name === name) {\r\n return target;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a post process using a given name (if many are found, this function will pick the first one)\r\n * @param name defines the name to search for\r\n * @returns the found post process or null if not found at all.\r\n */\r\n public getPostProcessByName(name: string): Nullable {\r\n for (let postProcessIndex = 0; postProcessIndex < this.postProcesses.length; ++postProcessIndex) {\r\n const postProcess = this.postProcesses[postProcessIndex];\r\n if (postProcess.name === name) {\r\n return postProcess;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the given mesh is active\r\n * @param mesh defines the mesh to look for\r\n * @returns true if the mesh is in the active list\r\n */\r\n public isActiveMesh(mesh: AbstractMesh): boolean {\r\n return this._activeMeshes.indexOf(mesh) !== -1;\r\n }\r\n\r\n /**\r\n * Return a unique id as a string which can serve as an identifier for the scene\r\n */\r\n public get uid(): string {\r\n if (!this._uid) {\r\n this._uid = Tools.RandomId();\r\n }\r\n return this._uid;\r\n }\r\n\r\n /**\r\n * Add an externally attached data from its key.\r\n * This method call will fail and return false, if such key already exists.\r\n * If you don't care and just want to get the data no matter what, use the more convenient getOrAddExternalDataWithFactory() method.\r\n * @param key the unique key that identifies the data\r\n * @param data the data object to associate to the key for this Engine instance\r\n * @returns true if no such key were already present and the data was added successfully, false otherwise\r\n */\r\n public addExternalData(key: string, data: T): boolean {\r\n if (!this._externalData) {\r\n this._externalData = new StringDictionary();\r\n }\r\n return this._externalData.add(key, data);\r\n }\r\n\r\n /**\r\n * Get an externally attached data from its key\r\n * @param key the unique key that identifies the data\r\n * @returns the associated data, if present (can be null), or undefined if not present\r\n */\r\n public getExternalData(key: string): Nullable {\r\n if (!this._externalData) {\r\n return null;\r\n }\r\n return this._externalData.get(key);\r\n }\r\n\r\n /**\r\n * Get an externally attached data from its key, create it using a factory if it's not already present\r\n * @param key the unique key that identifies the data\r\n * @param factory the factory that will be called to create the instance if and only if it doesn't exists\r\n * @returns the associated data, can be null if the factory returned null.\r\n */\r\n public getOrAddExternalDataWithFactory(key: string, factory: (k: string) => T): T {\r\n if (!this._externalData) {\r\n this._externalData = new StringDictionary();\r\n }\r\n return this._externalData.getOrAddWithFactory(key, factory);\r\n }\r\n\r\n /**\r\n * Remove an externally attached data from the Engine instance\r\n * @param key the unique key that identifies the data\r\n * @returns true if the data was successfully removed, false if it doesn't exist\r\n */\r\n public removeExternalData(key: string): boolean {\r\n return this._externalData.remove(key);\r\n }\r\n\r\n private _evaluateSubMesh(subMesh: SubMesh, mesh: AbstractMesh, initialMesh: AbstractMesh, forcePush: boolean): void {\r\n if (forcePush || subMesh.isInFrustum(this._frustumPlanes)) {\r\n for (const step of this._evaluateSubMeshStage) {\r\n step.action(mesh, subMesh);\r\n }\r\n\r\n const material = subMesh.getMaterial();\r\n if (material !== null && material !== undefined) {\r\n // Render targets\r\n if (material.hasRenderTargetTextures && material.getRenderTargetTextures != null) {\r\n if (this._processedMaterials.indexOf(material) === -1) {\r\n this._processedMaterials.push(material);\r\n\r\n this._materialsRenderTargets.concatWithNoDuplicate(material.getRenderTargetTextures!());\r\n }\r\n }\r\n\r\n // Dispatch\r\n this._renderingManager.dispatch(subMesh, mesh, material);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the processed materials smart array preventing retention point in material dispose.\r\n */\r\n public freeProcessedMaterials(): void {\r\n this._processedMaterials.dispose();\r\n }\r\n\r\n private _preventFreeActiveMeshesAndRenderingGroups = false;\r\n\r\n /** Gets or sets a boolean blocking all the calls to freeActiveMeshes and freeRenderingGroups\r\n * It can be used in order to prevent going through methods freeRenderingGroups and freeActiveMeshes several times to improve performance\r\n * when disposing several meshes in a row or a hierarchy of meshes.\r\n * When used, it is the responsibility of the user to blockfreeActiveMeshesAndRenderingGroups back to false.\r\n */\r\n public get blockfreeActiveMeshesAndRenderingGroups(): boolean {\r\n return this._preventFreeActiveMeshesAndRenderingGroups;\r\n }\r\n\r\n public set blockfreeActiveMeshesAndRenderingGroups(value: boolean) {\r\n if (this._preventFreeActiveMeshesAndRenderingGroups === value) {\r\n return;\r\n }\r\n\r\n if (value) {\r\n this.freeActiveMeshes();\r\n this.freeRenderingGroups();\r\n }\r\n\r\n this._preventFreeActiveMeshesAndRenderingGroups = value;\r\n }\r\n\r\n /**\r\n * Clear the active meshes smart array preventing retention point in mesh dispose.\r\n */\r\n public freeActiveMeshes(): void {\r\n if (this.blockfreeActiveMeshesAndRenderingGroups) {\r\n return;\r\n }\r\n\r\n this._activeMeshes.dispose();\r\n if (this.activeCamera && this.activeCamera._activeMeshes) {\r\n this.activeCamera._activeMeshes.dispose();\r\n }\r\n if (this.activeCameras) {\r\n for (let i = 0; i < this.activeCameras.length; i++) {\r\n const activeCamera = this.activeCameras[i];\r\n if (activeCamera && activeCamera._activeMeshes) {\r\n activeCamera._activeMeshes.dispose();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the info related to rendering groups preventing retention points during dispose.\r\n */\r\n public freeRenderingGroups(): void {\r\n if (this.blockfreeActiveMeshesAndRenderingGroups) {\r\n return;\r\n }\r\n\r\n if (this._renderingManager) {\r\n this._renderingManager.freeRenderingGroups();\r\n }\r\n if (this.textures) {\r\n for (let i = 0; i < this.textures.length; i++) {\r\n const texture = this.textures[i];\r\n if (texture && (texture).renderList) {\r\n (texture).freeRenderingGroups();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _isInIntermediateRendering(): boolean {\r\n return this._intermediateRendering;\r\n }\r\n\r\n /**\r\n * Lambda returning the list of potentially active meshes.\r\n */\r\n public getActiveMeshCandidates: () => ISmartArrayLike;\r\n\r\n /**\r\n * Lambda returning the list of potentially active sub meshes.\r\n */\r\n public getActiveSubMeshCandidates: (mesh: AbstractMesh) => ISmartArrayLike;\r\n\r\n /**\r\n * Lambda returning the list of potentially intersecting sub meshes.\r\n */\r\n public getIntersectingSubMeshCandidates: (mesh: AbstractMesh, localRay: Ray) => ISmartArrayLike;\r\n\r\n /**\r\n * Lambda returning the list of potentially colliding sub meshes.\r\n */\r\n public getCollidingSubMeshCandidates: (mesh: AbstractMesh, collider: Collider) => ISmartArrayLike;\r\n\r\n /** @internal */\r\n public _activeMeshesFrozen = false;\r\n /** @internal */\r\n public _activeMeshesFrozenButKeepClipping = false;\r\n private _skipEvaluateActiveMeshesCompletely = false;\r\n\r\n /**\r\n * Use this function to stop evaluating active meshes. The current list will be keep alive between frames\r\n * @param skipEvaluateActiveMeshes defines an optional boolean indicating that the evaluate active meshes step must be completely skipped\r\n * @param onSuccess optional success callback\r\n * @param onError optional error callback\r\n * @param freezeMeshes defines if meshes should be frozen (true by default)\r\n * @param keepFrustumCulling defines if you want to keep running the frustum clipping (false by default)\r\n * @returns the current scene\r\n */\r\n public freezeActiveMeshes(\r\n skipEvaluateActiveMeshes = false,\r\n onSuccess?: () => void,\r\n onError?: (message: string) => void,\r\n freezeMeshes = true,\r\n keepFrustumCulling = false\r\n ): Scene {\r\n this.executeWhenReady(() => {\r\n if (!this.activeCamera) {\r\n onError && onError(\"No active camera found\");\r\n return;\r\n }\r\n\r\n if (!this._frustumPlanes) {\r\n this.updateTransformMatrix();\r\n }\r\n\r\n this._evaluateActiveMeshes();\r\n this._activeMeshesFrozen = true;\r\n this._activeMeshesFrozenButKeepClipping = keepFrustumCulling;\r\n this._skipEvaluateActiveMeshesCompletely = skipEvaluateActiveMeshes;\r\n\r\n if (freezeMeshes) {\r\n for (let index = 0; index < this._activeMeshes.length; index++) {\r\n this._activeMeshes.data[index]._freeze();\r\n }\r\n }\r\n onSuccess && onSuccess();\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Use this function to restart evaluating active meshes on every frame\r\n * @returns the current scene\r\n */\r\n public unfreezeActiveMeshes(): Scene {\r\n for (let index = 0; index < this.meshes.length; index++) {\r\n const mesh = this.meshes[index];\r\n if (mesh._internalAbstractMeshDataInfo) {\r\n mesh._internalAbstractMeshDataInfo._isActive = false;\r\n }\r\n }\r\n\r\n for (let index = 0; index < this._activeMeshes.length; index++) {\r\n this._activeMeshes.data[index]._unFreeze();\r\n }\r\n\r\n this._activeMeshesFrozen = false;\r\n return this;\r\n }\r\n\r\n private _executeActiveContainerCleanup(container: SmartArray) {\r\n const isInFastMode = this._engine.snapshotRendering && this._engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST;\r\n\r\n if (!isInFastMode && this._activeMeshesFrozen && this._activeMeshes.length) {\r\n return; // Do not execute in frozen mode\r\n }\r\n\r\n // We need to ensure we are not in the rendering loop\r\n this.onBeforeRenderObservable.addOnce(() => container.dispose());\r\n }\r\n\r\n private _evaluateActiveMeshes(): void {\r\n if (this._engine.snapshotRendering && this._engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST) {\r\n if (this._activeMeshes.length > 0) {\r\n this.activeCamera?._activeMeshes.reset();\r\n this._activeMeshes.reset();\r\n this._renderingManager.reset();\r\n this._processedMaterials.reset();\r\n this._activeParticleSystems.reset();\r\n this._activeSkeletons.reset();\r\n this._softwareSkinnedMeshes.reset();\r\n }\r\n return;\r\n }\r\n\r\n if (this._activeMeshesFrozen && this._activeMeshes.length) {\r\n if (!this._skipEvaluateActiveMeshesCompletely) {\r\n const len = this._activeMeshes.length;\r\n for (let i = 0; i < len; i++) {\r\n const mesh = this._activeMeshes.data[i];\r\n mesh.computeWorldMatrix();\r\n }\r\n }\r\n\r\n if (this._activeParticleSystems) {\r\n const psLength = this._activeParticleSystems.length;\r\n for (let i = 0; i < psLength; i++) {\r\n this._activeParticleSystems.data[i].animate();\r\n }\r\n }\r\n\r\n this._renderingManager.resetSprites();\r\n\r\n return;\r\n }\r\n\r\n if (!this.activeCamera) {\r\n return;\r\n }\r\n\r\n this.onBeforeActiveMeshesEvaluationObservable.notifyObservers(this);\r\n\r\n this.activeCamera._activeMeshes.reset();\r\n this._activeMeshes.reset();\r\n this._renderingManager.reset();\r\n this._processedMaterials.reset();\r\n this._activeParticleSystems.reset();\r\n this._activeSkeletons.reset();\r\n this._softwareSkinnedMeshes.reset();\r\n this._materialsRenderTargets.reset();\r\n\r\n for (const step of this._beforeEvaluateActiveMeshStage) {\r\n step.action();\r\n }\r\n\r\n // Determine mesh candidates\r\n const meshes = this.getActiveMeshCandidates();\r\n\r\n // Check each mesh\r\n const len = meshes.length;\r\n for (let i = 0; i < len; i++) {\r\n const mesh = meshes.data[i];\r\n mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate = false;\r\n if (mesh.isBlocked) {\r\n continue;\r\n }\r\n\r\n this._totalVertices.addCount(mesh.getTotalVertices(), false);\r\n\r\n if (!mesh.isReady() || !mesh.isEnabled() || mesh.scaling.hasAZeroComponent) {\r\n continue;\r\n }\r\n\r\n mesh.computeWorldMatrix();\r\n\r\n // Intersections\r\n if (mesh.actionManager && mesh.actionManager.hasSpecificTriggers2(Constants.ACTION_OnIntersectionEnterTrigger, Constants.ACTION_OnIntersectionExitTrigger)) {\r\n this._meshesForIntersections.pushNoDuplicate(mesh);\r\n }\r\n\r\n // Switch to current LOD\r\n let meshToRender = this.customLODSelector ? this.customLODSelector(mesh, this.activeCamera) : mesh.getLOD(this.activeCamera);\r\n mesh._internalAbstractMeshDataInfo._currentLOD = meshToRender;\r\n mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate = true;\r\n if (meshToRender === undefined || meshToRender === null) {\r\n continue;\r\n }\r\n\r\n // Compute world matrix if LOD is billboard\r\n if (meshToRender !== mesh && meshToRender.billboardMode !== 0) {\r\n meshToRender.computeWorldMatrix();\r\n }\r\n\r\n mesh._preActivate();\r\n\r\n if (\r\n mesh.isVisible &&\r\n mesh.visibility > 0 &&\r\n (mesh.layerMask & this.activeCamera.layerMask) !== 0 &&\r\n (this._skipFrustumClipping || mesh.alwaysSelectAsActiveMesh || mesh.isInFrustum(this._frustumPlanes))\r\n ) {\r\n this._activeMeshes.push(mesh);\r\n this.activeCamera._activeMeshes.push(mesh);\r\n\r\n if (meshToRender !== mesh) {\r\n meshToRender._activate(this._renderId, false);\r\n }\r\n\r\n for (const step of this._preActiveMeshStage) {\r\n step.action(mesh);\r\n }\r\n\r\n if (mesh._activate(this._renderId, false)) {\r\n if (!mesh.isAnInstance) {\r\n meshToRender._internalAbstractMeshDataInfo._onlyForInstances = false;\r\n } else {\r\n if (mesh._internalAbstractMeshDataInfo._actAsRegularMesh) {\r\n meshToRender = mesh;\r\n }\r\n }\r\n meshToRender._internalAbstractMeshDataInfo._isActive = true;\r\n this._activeMesh(mesh, meshToRender);\r\n }\r\n\r\n mesh._postActivate();\r\n }\r\n }\r\n\r\n this.onAfterActiveMeshesEvaluationObservable.notifyObservers(this);\r\n\r\n // Particle systems\r\n if (this.particlesEnabled) {\r\n this.onBeforeParticlesRenderingObservable.notifyObservers(this);\r\n for (let particleIndex = 0; particleIndex < this.particleSystems.length; particleIndex++) {\r\n const particleSystem = this.particleSystems[particleIndex];\r\n\r\n if (!particleSystem.isStarted() || !particleSystem.emitter) {\r\n continue;\r\n }\r\n\r\n const emitter = particleSystem.emitter;\r\n if (!emitter.position || emitter.isEnabled()) {\r\n this._activeParticleSystems.push(particleSystem);\r\n particleSystem.animate();\r\n this._renderingManager.dispatchParticles(particleSystem);\r\n }\r\n }\r\n this.onAfterParticlesRenderingObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n private _activeMesh(sourceMesh: AbstractMesh, mesh: AbstractMesh): void {\r\n if (this._skeletonsEnabled && mesh.skeleton !== null && mesh.skeleton !== undefined) {\r\n if (this._activeSkeletons.pushNoDuplicate(mesh.skeleton)) {\r\n mesh.skeleton.prepare();\r\n this._activeBones.addCount(mesh.skeleton.bones.length, false);\r\n }\r\n\r\n if (!mesh.computeBonesUsingShaders) {\r\n this._softwareSkinnedMeshes.pushNoDuplicate(mesh);\r\n }\r\n }\r\n\r\n let forcePush = sourceMesh.hasInstances || sourceMesh.isAnInstance || this.dispatchAllSubMeshesOfActiveMeshes || this._skipFrustumClipping || mesh.alwaysSelectAsActiveMesh;\r\n\r\n if (mesh && mesh.subMeshes && mesh.subMeshes.length > 0) {\r\n const subMeshes = this.getActiveSubMeshCandidates(mesh);\r\n const len = subMeshes.length;\r\n forcePush = forcePush || len === 1;\r\n for (let i = 0; i < len; i++) {\r\n const subMesh = subMeshes.data[i];\r\n this._evaluateSubMesh(subMesh, mesh, sourceMesh, forcePush);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update the transform matrix to update from the current active camera\r\n * @param force defines a boolean used to force the update even if cache is up to date\r\n */\r\n public updateTransformMatrix(force?: boolean): void {\r\n const activeCamera = this.activeCamera;\r\n if (!activeCamera) {\r\n return;\r\n }\r\n\r\n if (activeCamera._renderingMultiview) {\r\n const leftCamera = activeCamera._rigCameras[0];\r\n const rightCamera = activeCamera._rigCameras[1];\r\n this.setTransformMatrix(leftCamera.getViewMatrix(), leftCamera.getProjectionMatrix(force), rightCamera.getViewMatrix(), rightCamera.getProjectionMatrix(force));\r\n } else {\r\n this.setTransformMatrix(activeCamera.getViewMatrix(), activeCamera.getProjectionMatrix(force));\r\n }\r\n }\r\n\r\n private _bindFrameBuffer(camera: Nullable, clear = true) {\r\n if (camera && camera._multiviewTexture) {\r\n camera._multiviewTexture._bindFrameBuffer();\r\n } else if (camera && camera.outputRenderTarget) {\r\n camera.outputRenderTarget._bindFrameBuffer();\r\n } else {\r\n if (!this._engine._currentFrameBufferIsDefaultFrameBuffer()) {\r\n this._engine.restoreDefaultFramebuffer();\r\n }\r\n }\r\n if (clear) {\r\n this._clearFrameBuffer(camera);\r\n }\r\n }\r\n\r\n private _clearFrameBuffer(camera: Nullable) {\r\n // we assume the framebuffer currently bound is the right one\r\n if (camera && camera._multiviewTexture) {\r\n // no clearing\r\n } else if (camera && camera.outputRenderTarget && !camera._renderingMultiview) {\r\n const rtt = camera.outputRenderTarget;\r\n if (rtt.onClearObservable.hasObservers()) {\r\n rtt.onClearObservable.notifyObservers(this._engine);\r\n } else if (!rtt.skipInitialClear && !camera.isRightCamera) {\r\n if (this.autoClear) {\r\n this._engine.clear(rtt.clearColor || this.clearColor, !rtt._cleared, true, true);\r\n }\r\n rtt._cleared = true;\r\n }\r\n } else {\r\n if (!this._defaultFrameBufferCleared) {\r\n this._defaultFrameBufferCleared = true;\r\n this._clear();\r\n } else {\r\n this._engine.clear(null, false, true, true);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _allowPostProcessClearColor = true;\r\n /**\r\n * @internal\r\n */\r\n public _renderForCamera(camera: Camera, rigParent?: Camera, bindFrameBuffer = true): void {\r\n if (camera && camera._skipRendering) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n\r\n // Use _activeCamera instead of activeCamera to avoid onActiveCameraChanged\r\n this._activeCamera = camera;\r\n\r\n if (!this.activeCamera) {\r\n throw new Error(\"Active camera not set\");\r\n }\r\n\r\n // Viewport\r\n engine.setViewport(this.activeCamera.viewport);\r\n\r\n // Camera\r\n this.resetCachedMaterial();\r\n this._renderId++;\r\n\r\n if (!this.prePass && bindFrameBuffer) {\r\n let skipInitialClear = true;\r\n if (camera._renderingMultiview && camera.outputRenderTarget) {\r\n skipInitialClear = camera.outputRenderTarget.skipInitialClear;\r\n if (this.autoClear) {\r\n this._defaultFrameBufferCleared = false;\r\n camera.outputRenderTarget.skipInitialClear = false;\r\n }\r\n }\r\n this._bindFrameBuffer(this._activeCamera);\r\n if (camera._renderingMultiview && camera.outputRenderTarget) {\r\n camera.outputRenderTarget.skipInitialClear = skipInitialClear;\r\n }\r\n }\r\n\r\n this.updateTransformMatrix();\r\n\r\n this.onBeforeCameraRenderObservable.notifyObservers(this.activeCamera);\r\n\r\n // Meshes\r\n this._evaluateActiveMeshes();\r\n\r\n // Software skinning\r\n for (let softwareSkinnedMeshIndex = 0; softwareSkinnedMeshIndex < this._softwareSkinnedMeshes.length; softwareSkinnedMeshIndex++) {\r\n const mesh = this._softwareSkinnedMeshes.data[softwareSkinnedMeshIndex];\r\n\r\n mesh.applySkeleton(mesh.skeleton);\r\n }\r\n\r\n // Render targets\r\n this.onBeforeRenderTargetsRenderObservable.notifyObservers(this);\r\n\r\n this._renderTargets.concatWithNoDuplicate(this._materialsRenderTargets);\r\n\r\n if (camera.customRenderTargets && camera.customRenderTargets.length > 0) {\r\n this._renderTargets.concatWithNoDuplicate(camera.customRenderTargets);\r\n }\r\n\r\n if (rigParent && rigParent.customRenderTargets && rigParent.customRenderTargets.length > 0) {\r\n this._renderTargets.concatWithNoDuplicate(rigParent.customRenderTargets);\r\n }\r\n\r\n if (this.environmentTexture && this.environmentTexture.isRenderTarget) {\r\n this._renderTargets.pushNoDuplicate(this.environmentTexture as RenderTargetTexture);\r\n }\r\n\r\n // Collects render targets from external components.\r\n for (const step of this._gatherActiveCameraRenderTargetsStage) {\r\n step.action(this._renderTargets);\r\n }\r\n\r\n let needRebind = false;\r\n if (this.renderTargetsEnabled) {\r\n this._intermediateRendering = true;\r\n\r\n if (this._renderTargets.length > 0) {\r\n Tools.StartPerformanceCounter(\"Render targets\", this._renderTargets.length > 0);\r\n for (let renderIndex = 0; renderIndex < this._renderTargets.length; renderIndex++) {\r\n const renderTarget = this._renderTargets.data[renderIndex];\r\n if (renderTarget._shouldRender()) {\r\n this._renderId++;\r\n const hasSpecialRenderTargetCamera = renderTarget.activeCamera && renderTarget.activeCamera !== this.activeCamera;\r\n renderTarget.render(hasSpecialRenderTargetCamera, this.dumpNextRenderTargets);\r\n needRebind = true;\r\n }\r\n }\r\n Tools.EndPerformanceCounter(\"Render targets\", this._renderTargets.length > 0);\r\n\r\n this._renderId++;\r\n }\r\n\r\n for (const step of this._cameraDrawRenderTargetStage) {\r\n needRebind = step.action(this.activeCamera) || needRebind;\r\n }\r\n\r\n this._intermediateRendering = false;\r\n }\r\n\r\n this._engine.currentRenderPassId = camera.outputRenderTarget?.renderPassId ?? camera.renderPassId ?? Constants.RENDERPASS_MAIN;\r\n\r\n // Restore framebuffer after rendering to targets\r\n if (needRebind && !this.prePass) {\r\n this._bindFrameBuffer(this._activeCamera, false);\r\n this.updateTransformMatrix();\r\n }\r\n\r\n this.onAfterRenderTargetsRenderObservable.notifyObservers(this);\r\n\r\n // Prepare Frame\r\n if (this.postProcessManager && !camera._multiviewTexture && !this.prePass) {\r\n this.postProcessManager._prepareFrame();\r\n }\r\n\r\n // Before Camera Draw\r\n for (const step of this._beforeCameraDrawStage) {\r\n step.action(this.activeCamera);\r\n }\r\n\r\n // Render\r\n this.onBeforeDrawPhaseObservable.notifyObservers(this);\r\n\r\n if (engine.snapshotRendering && engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST) {\r\n this.finalizeSceneUbo();\r\n }\r\n this._renderingManager.render(null, null, true, true);\r\n this.onAfterDrawPhaseObservable.notifyObservers(this);\r\n\r\n // After Camera Draw\r\n for (const step of this._afterCameraDrawStage) {\r\n step.action(this.activeCamera);\r\n }\r\n\r\n // Finalize frame\r\n if (this.postProcessManager && !camera._multiviewTexture) {\r\n // if the camera has an output render target, render the post process to the render target\r\n const texture = camera.outputRenderTarget ? camera.outputRenderTarget.renderTarget! : undefined;\r\n this.postProcessManager._finalizeFrame(camera.isIntermediate, texture);\r\n }\r\n\r\n // After post process\r\n for (const step of this._afterCameraPostProcessStage) {\r\n step.action(this.activeCamera);\r\n }\r\n\r\n // Reset some special arrays\r\n this._renderTargets.reset();\r\n\r\n this.onAfterCameraRenderObservable.notifyObservers(this.activeCamera);\r\n }\r\n\r\n private _processSubCameras(camera: Camera, bindFrameBuffer = true): void {\r\n if (camera.cameraRigMode === Constants.RIG_MODE_NONE || camera._renderingMultiview) {\r\n if (camera._renderingMultiview && !this._multiviewSceneUbo) {\r\n this._createMultiviewUbo();\r\n }\r\n this._renderForCamera(camera, undefined, bindFrameBuffer);\r\n this.onAfterRenderCameraObservable.notifyObservers(camera);\r\n return;\r\n }\r\n\r\n if (camera._useMultiviewToSingleView) {\r\n this._renderMultiviewToSingleView(camera);\r\n } else {\r\n // rig cameras\r\n this.onBeforeCameraRenderObservable.notifyObservers(camera);\r\n for (let index = 0; index < camera._rigCameras.length; index++) {\r\n this._renderForCamera(camera._rigCameras[index], camera);\r\n }\r\n }\r\n\r\n // Use _activeCamera instead of activeCamera to avoid onActiveCameraChanged\r\n this._activeCamera = camera;\r\n this.updateTransformMatrix();\r\n this.onAfterRenderCameraObservable.notifyObservers(camera);\r\n }\r\n\r\n private _checkIntersections(): void {\r\n for (let index = 0; index < this._meshesForIntersections.length; index++) {\r\n const sourceMesh = this._meshesForIntersections.data[index];\r\n\r\n if (!sourceMesh.actionManager) {\r\n continue;\r\n }\r\n\r\n for (let actionIndex = 0; sourceMesh.actionManager && actionIndex < sourceMesh.actionManager.actions.length; actionIndex++) {\r\n const action: IAction = sourceMesh.actionManager.actions[actionIndex];\r\n\r\n if (action.trigger === Constants.ACTION_OnIntersectionEnterTrigger || action.trigger === Constants.ACTION_OnIntersectionExitTrigger) {\r\n const parameters = action.getTriggerParameter();\r\n const otherMesh = parameters.mesh ? parameters.mesh : parameters;\r\n\r\n const areIntersecting = otherMesh.intersectsMesh(sourceMesh, parameters.usePreciseIntersection);\r\n const currentIntersectionInProgress = sourceMesh._intersectionsInProgress.indexOf(otherMesh);\r\n\r\n if (areIntersecting && currentIntersectionInProgress === -1) {\r\n if (action.trigger === Constants.ACTION_OnIntersectionEnterTrigger) {\r\n action._executeCurrent(ActionEvent.CreateNew(sourceMesh, undefined, otherMesh));\r\n sourceMesh._intersectionsInProgress.push(otherMesh);\r\n } else if (action.trigger === Constants.ACTION_OnIntersectionExitTrigger) {\r\n sourceMesh._intersectionsInProgress.push(otherMesh);\r\n }\r\n } else if (!areIntersecting && currentIntersectionInProgress > -1) {\r\n //They intersected, and now they don't.\r\n\r\n //is this trigger an exit trigger? execute an event.\r\n if (action.trigger === Constants.ACTION_OnIntersectionExitTrigger) {\r\n action._executeCurrent(ActionEvent.CreateNew(sourceMesh, undefined, otherMesh));\r\n }\r\n\r\n //if this is an exit trigger, or no exit trigger exists, remove the id from the intersection in progress array.\r\n if (\r\n !sourceMesh.actionManager.hasSpecificTrigger(Constants.ACTION_OnIntersectionExitTrigger, (parameter) => {\r\n const parameterMesh = parameter.mesh ? parameter.mesh : parameter;\r\n return otherMesh === parameterMesh;\r\n }) ||\r\n action.trigger === Constants.ACTION_OnIntersectionExitTrigger\r\n ) {\r\n sourceMesh._intersectionsInProgress.splice(currentIntersectionInProgress, 1);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _advancePhysicsEngineStep(step: number) {\r\n // Do nothing. Code will be replaced if physics engine component is referenced\r\n }\r\n\r\n /**\r\n * User updatable function that will return a deterministic frame time when engine is in deterministic lock step mode\r\n * @returns the frame time\r\n */\r\n public getDeterministicFrameTime: () => number = () => {\r\n return this._engine.getTimeStep();\r\n };\r\n\r\n /** @internal */\r\n public _animate(customDeltaTime?: number): void {\r\n // Nothing to do as long as Animatable have not been imported.\r\n }\r\n\r\n /** Execute all animations (for a frame) */\r\n public animate() {\r\n if (this._engine.isDeterministicLockStep()) {\r\n let deltaTime = Math.max(Scene.MinDeltaTime, Math.min(this._engine.getDeltaTime(), Scene.MaxDeltaTime)) + this._timeAccumulator;\r\n\r\n const defaultFrameTime = this._engine.getTimeStep();\r\n const defaultFPS = 1000.0 / defaultFrameTime / 1000.0;\r\n\r\n let stepsTaken = 0;\r\n\r\n const maxSubSteps = this._engine.getLockstepMaxSteps();\r\n\r\n let internalSteps = Math.floor(deltaTime / defaultFrameTime);\r\n internalSteps = Math.min(internalSteps, maxSubSteps);\r\n\r\n while (deltaTime > 0 && stepsTaken < internalSteps) {\r\n this.onBeforeStepObservable.notifyObservers(this);\r\n\r\n // Animations\r\n this._animationRatio = defaultFrameTime * defaultFPS;\r\n this._animate(defaultFrameTime);\r\n this.onAfterAnimationsObservable.notifyObservers(this);\r\n\r\n // Physics\r\n if (this.physicsEnabled) {\r\n this._advancePhysicsEngineStep(defaultFrameTime);\r\n }\r\n\r\n this.onAfterStepObservable.notifyObservers(this);\r\n this._currentStepId++;\r\n\r\n stepsTaken++;\r\n deltaTime -= defaultFrameTime;\r\n }\r\n\r\n this._timeAccumulator = deltaTime < 0 ? 0 : deltaTime;\r\n } else {\r\n // Animations\r\n const deltaTime = this.useConstantAnimationDeltaTime ? 16 : Math.max(Scene.MinDeltaTime, Math.min(this._engine.getDeltaTime(), Scene.MaxDeltaTime));\r\n this._animationRatio = deltaTime * (60.0 / 1000.0);\r\n this._animate();\r\n this.onAfterAnimationsObservable.notifyObservers(this);\r\n\r\n // Physics\r\n if (this.physicsEnabled) {\r\n this._advancePhysicsEngineStep(deltaTime);\r\n }\r\n }\r\n }\r\n\r\n private _clear(): void {\r\n if (this.autoClearDepthAndStencil || this.autoClear) {\r\n this._engine.clear(this.clearColor, this.autoClear || this.forceWireframe || this.forcePointsCloud, this.autoClearDepthAndStencil, this.autoClearDepthAndStencil);\r\n }\r\n }\r\n\r\n private _checkCameraRenderTarget(camera: Nullable) {\r\n if (camera?.outputRenderTarget && !camera?.isRigCamera) {\r\n camera.outputRenderTarget._cleared = false;\r\n }\r\n if (camera?.rigCameras?.length) {\r\n for (let i = 0; i < camera.rigCameras.length; ++i) {\r\n const rtt = camera.rigCameras[i].outputRenderTarget;\r\n if (rtt) {\r\n rtt._cleared = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache of all meshes\r\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\r\n */\r\n public resetDrawCache(passId?: number): void {\r\n if (!this.meshes) {\r\n return;\r\n }\r\n\r\n for (const mesh of this.meshes) {\r\n mesh.resetDrawCache(passId);\r\n }\r\n }\r\n\r\n /**\r\n * Render the scene\r\n * @param updateCameras defines a boolean indicating if cameras must update according to their inputs (true by default)\r\n * @param ignoreAnimations defines a boolean indicating if animations should not be executed (false by default)\r\n */\r\n public render(updateCameras = true, ignoreAnimations = false): void {\r\n if (this.isDisposed) {\r\n return;\r\n }\r\n\r\n if (this.onReadyObservable.hasObservers() && this._executeWhenReadyTimeoutId === null) {\r\n this._checkIsReady();\r\n }\r\n\r\n this._frameId++;\r\n this._defaultFrameBufferCleared = false;\r\n this._checkCameraRenderTarget(this.activeCamera);\r\n if (this.activeCameras?.length) {\r\n this.activeCameras.forEach(this._checkCameraRenderTarget);\r\n }\r\n\r\n // Register components that have been associated lately to the scene.\r\n this._registerTransientComponents();\r\n\r\n this._activeParticles.fetchNewFrame();\r\n this._totalVertices.fetchNewFrame();\r\n this._activeIndices.fetchNewFrame();\r\n this._activeBones.fetchNewFrame();\r\n this._meshesForIntersections.reset();\r\n this.resetCachedMaterial();\r\n\r\n this.onBeforeAnimationsObservable.notifyObservers(this);\r\n\r\n // Actions\r\n if (this.actionManager) {\r\n this.actionManager.processTrigger(Constants.ACTION_OnEveryFrameTrigger);\r\n }\r\n\r\n // Animations\r\n if (!ignoreAnimations) {\r\n this.animate();\r\n }\r\n\r\n // Before camera update steps\r\n for (const step of this._beforeCameraUpdateStage) {\r\n step.action();\r\n }\r\n\r\n // Update Cameras\r\n if (updateCameras) {\r\n if (this.activeCameras && this.activeCameras.length > 0) {\r\n for (let cameraIndex = 0; cameraIndex < this.activeCameras.length; cameraIndex++) {\r\n const camera = this.activeCameras[cameraIndex];\r\n camera.update();\r\n if (camera.cameraRigMode !== Constants.RIG_MODE_NONE) {\r\n // rig cameras\r\n for (let index = 0; index < camera._rigCameras.length; index++) {\r\n camera._rigCameras[index].update();\r\n }\r\n }\r\n }\r\n } else if (this.activeCamera) {\r\n this.activeCamera.update();\r\n if (this.activeCamera.cameraRigMode !== Constants.RIG_MODE_NONE) {\r\n // rig cameras\r\n for (let index = 0; index < this.activeCamera._rigCameras.length; index++) {\r\n this.activeCamera._rigCameras[index].update();\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Before render\r\n this.onBeforeRenderObservable.notifyObservers(this);\r\n\r\n const engine = this.getEngine();\r\n\r\n // Customs render targets\r\n this.onBeforeRenderTargetsRenderObservable.notifyObservers(this);\r\n\r\n const currentActiveCamera = this.activeCameras?.length ? this.activeCameras[0] : this.activeCamera;\r\n if (this.renderTargetsEnabled) {\r\n Tools.StartPerformanceCounter(\"Custom render targets\", this.customRenderTargets.length > 0);\r\n this._intermediateRendering = true;\r\n for (let customIndex = 0; customIndex < this.customRenderTargets.length; customIndex++) {\r\n const renderTarget = this.customRenderTargets[customIndex];\r\n if (renderTarget._shouldRender()) {\r\n this._renderId++;\r\n\r\n this.activeCamera = renderTarget.activeCamera || this.activeCamera;\r\n\r\n if (!this.activeCamera) {\r\n throw new Error(\"Active camera not set\");\r\n }\r\n\r\n // Viewport\r\n engine.setViewport(this.activeCamera.viewport);\r\n\r\n // Camera\r\n this.updateTransformMatrix();\r\n\r\n renderTarget.render(currentActiveCamera !== this.activeCamera, this.dumpNextRenderTargets);\r\n }\r\n }\r\n Tools.EndPerformanceCounter(\"Custom render targets\", this.customRenderTargets.length > 0);\r\n this._intermediateRendering = false;\r\n this._renderId++;\r\n }\r\n\r\n this._engine.currentRenderPassId = currentActiveCamera?.renderPassId ?? Constants.RENDERPASS_MAIN;\r\n\r\n // Restore back buffer\r\n this.activeCamera = currentActiveCamera;\r\n if (this._activeCamera && this._activeCamera.cameraRigMode !== Constants.RIG_MODE_CUSTOM && !this.prePass) {\r\n this._bindFrameBuffer(this._activeCamera, false);\r\n }\r\n this.onAfterRenderTargetsRenderObservable.notifyObservers(this);\r\n\r\n for (const step of this._beforeClearStage) {\r\n step.action();\r\n }\r\n\r\n // Clear\r\n this._clearFrameBuffer(this.activeCamera);\r\n\r\n // Collects render targets from external components.\r\n for (const step of this._gatherRenderTargetsStage) {\r\n step.action(this._renderTargets);\r\n }\r\n\r\n // Multi-cameras?\r\n if (this.activeCameras && this.activeCameras.length > 0) {\r\n for (let cameraIndex = 0; cameraIndex < this.activeCameras.length; cameraIndex++) {\r\n this._processSubCameras(this.activeCameras[cameraIndex], cameraIndex > 0);\r\n }\r\n } else {\r\n if (!this.activeCamera) {\r\n throw new Error(\"No camera defined\");\r\n }\r\n\r\n this._processSubCameras(this.activeCamera, !!this.activeCamera.outputRenderTarget);\r\n }\r\n\r\n // Intersection checks\r\n this._checkIntersections();\r\n\r\n // Executes the after render stage actions.\r\n for (const step of this._afterRenderStage) {\r\n step.action();\r\n }\r\n\r\n // After render\r\n if (this.afterRender) {\r\n this.afterRender();\r\n }\r\n\r\n this.onAfterRenderObservable.notifyObservers(this);\r\n\r\n // Cleaning\r\n if (this._toBeDisposed.length) {\r\n for (let index = 0; index < this._toBeDisposed.length; index++) {\r\n const data = this._toBeDisposed[index];\r\n if (data) {\r\n data.dispose();\r\n }\r\n }\r\n\r\n this._toBeDisposed.length = 0;\r\n }\r\n\r\n if (this.dumpNextRenderTargets) {\r\n this.dumpNextRenderTargets = false;\r\n }\r\n\r\n this._activeBones.addCount(0, true);\r\n this._activeIndices.addCount(0, true);\r\n this._activeParticles.addCount(0, true);\r\n\r\n this._engine.restoreDefaultFramebuffer();\r\n }\r\n\r\n /**\r\n * Freeze all materials\r\n * A frozen material will not be updatable but should be faster to render\r\n * Note: multimaterials will not be frozen, but their submaterials will\r\n */\r\n public freezeMaterials(): void {\r\n for (let i = 0; i < this.materials.length; i++) {\r\n this.materials[i].freeze();\r\n }\r\n }\r\n\r\n /**\r\n * Unfreeze all materials\r\n * A frozen material will not be updatable but should be faster to render\r\n */\r\n public unfreezeMaterials(): void {\r\n for (let i = 0; i < this.materials.length; i++) {\r\n this.materials[i].unfreeze();\r\n }\r\n }\r\n\r\n /**\r\n * Releases all held resources\r\n */\r\n public dispose(): void {\r\n if (this.isDisposed) {\r\n return;\r\n }\r\n\r\n this.beforeRender = null;\r\n this.afterRender = null;\r\n this.metadata = null;\r\n\r\n this.skeletons.length = 0;\r\n this.morphTargetManagers.length = 0;\r\n this._transientComponents.length = 0;\r\n this._isReadyForMeshStage.clear();\r\n this._beforeEvaluateActiveMeshStage.clear();\r\n this._evaluateSubMeshStage.clear();\r\n this._preActiveMeshStage.clear();\r\n this._cameraDrawRenderTargetStage.clear();\r\n this._beforeCameraDrawStage.clear();\r\n this._beforeRenderTargetDrawStage.clear();\r\n this._beforeRenderingGroupDrawStage.clear();\r\n this._beforeRenderingMeshStage.clear();\r\n this._afterRenderingMeshStage.clear();\r\n this._afterRenderingGroupDrawStage.clear();\r\n this._afterCameraDrawStage.clear();\r\n this._afterRenderTargetDrawStage.clear();\r\n this._afterRenderStage.clear();\r\n this._beforeCameraUpdateStage.clear();\r\n this._beforeClearStage.clear();\r\n this._gatherRenderTargetsStage.clear();\r\n this._gatherActiveCameraRenderTargetsStage.clear();\r\n this._pointerMoveStage.clear();\r\n this._pointerDownStage.clear();\r\n this._pointerUpStage.clear();\r\n\r\n this.importedMeshesFiles = [] as string[];\r\n\r\n if (this.stopAllAnimations) {\r\n // Ensures that no animatable notifies a callback that could start a new animation group, constantly adding new animatables to the active list...\r\n this._activeAnimatables.forEach((animatable) => {\r\n animatable.onAnimationEndObservable.clear();\r\n animatable.onAnimationEnd = null;\r\n });\r\n this.stopAllAnimations();\r\n }\r\n\r\n this.resetCachedMaterial();\r\n\r\n // Smart arrays\r\n if (this.activeCamera) {\r\n this.activeCamera._activeMeshes.dispose();\r\n this.activeCamera = null;\r\n }\r\n this.activeCameras = null;\r\n\r\n this._activeMeshes.dispose();\r\n this._renderingManager.dispose();\r\n this._processedMaterials.dispose();\r\n this._activeParticleSystems.dispose();\r\n this._activeSkeletons.dispose();\r\n this._softwareSkinnedMeshes.dispose();\r\n this._renderTargets.dispose();\r\n this._materialsRenderTargets.dispose();\r\n this._registeredForLateAnimationBindings.dispose();\r\n this._meshesForIntersections.dispose();\r\n this._toBeDisposed.length = 0;\r\n\r\n // Abort active requests\r\n const activeRequests = this._activeRequests.slice();\r\n for (const request of activeRequests) {\r\n request.abort();\r\n }\r\n this._activeRequests.length = 0;\r\n\r\n // Events\r\n try {\r\n this.onDisposeObservable.notifyObservers(this);\r\n } catch (e) {\r\n Logger.Error(\"An error occurred while calling onDisposeObservable!\", e);\r\n }\r\n\r\n this.detachControl();\r\n\r\n // Detach cameras\r\n const canvas = this._engine.getInputElement();\r\n\r\n if (canvas) {\r\n for (let index = 0; index < this.cameras.length; index++) {\r\n this.cameras[index].detachControl();\r\n }\r\n }\r\n\r\n // Release animation groups\r\n this._disposeList(this.animationGroups);\r\n\r\n // Release lights\r\n this._disposeList(this.lights);\r\n\r\n // Release meshes\r\n this._disposeList(this.meshes, (item) => item.dispose(true));\r\n this._disposeList(this.transformNodes, (item) => item.dispose(true));\r\n\r\n // Release cameras\r\n const cameras = this.cameras;\r\n this._disposeList(cameras);\r\n\r\n // Release materials\r\n if (this._defaultMaterial) {\r\n this._defaultMaterial.dispose();\r\n }\r\n this._disposeList(this.multiMaterials);\r\n this._disposeList(this.materials);\r\n\r\n // Release particles\r\n this._disposeList(this.particleSystems);\r\n\r\n // Release postProcesses\r\n this._disposeList(this.postProcesses);\r\n\r\n // Release textures\r\n this._disposeList(this.textures);\r\n\r\n // Release morph targets\r\n this._disposeList(this.morphTargetManagers);\r\n\r\n // Release UBO\r\n this._sceneUbo.dispose();\r\n\r\n if (this._multiviewSceneUbo) {\r\n this._multiviewSceneUbo.dispose();\r\n }\r\n\r\n // Post-processes\r\n this.postProcessManager.dispose();\r\n\r\n // Components\r\n this._disposeList(this._components);\r\n\r\n // Remove from engine\r\n let index = this._engine.scenes.indexOf(this);\r\n\r\n if (index > -1) {\r\n this._engine.scenes.splice(index, 1);\r\n }\r\n\r\n if (EngineStore._LastCreatedScene === this) {\r\n if (this._engine.scenes.length > 0) {\r\n EngineStore._LastCreatedScene = this._engine.scenes[this._engine.scenes.length - 1];\r\n } else {\r\n EngineStore._LastCreatedScene = null;\r\n }\r\n }\r\n\r\n index = this._engine._virtualScenes.indexOf(this);\r\n\r\n if (index > -1) {\r\n this._engine._virtualScenes.splice(index, 1);\r\n }\r\n\r\n this._engine.wipeCaches(true);\r\n this.onDisposeObservable.clear();\r\n this.onBeforeRenderObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onBeforeRenderTargetsRenderObservable.clear();\r\n this.onAfterRenderTargetsRenderObservable.clear();\r\n this.onAfterStepObservable.clear();\r\n this.onBeforeStepObservable.clear();\r\n this.onBeforeActiveMeshesEvaluationObservable.clear();\r\n this.onAfterActiveMeshesEvaluationObservable.clear();\r\n this.onBeforeParticlesRenderingObservable.clear();\r\n this.onAfterParticlesRenderingObservable.clear();\r\n this.onBeforeDrawPhaseObservable.clear();\r\n this.onAfterDrawPhaseObservable.clear();\r\n this.onBeforeAnimationsObservable.clear();\r\n this.onAfterAnimationsObservable.clear();\r\n this.onDataLoadedObservable.clear();\r\n this.onBeforeRenderingGroupObservable.clear();\r\n this.onAfterRenderingGroupObservable.clear();\r\n this.onMeshImportedObservable.clear();\r\n this.onBeforeCameraRenderObservable.clear();\r\n this.onAfterCameraRenderObservable.clear();\r\n this.onAfterRenderCameraObservable.clear();\r\n this.onReadyObservable.clear();\r\n this.onNewCameraAddedObservable.clear();\r\n this.onCameraRemovedObservable.clear();\r\n this.onNewLightAddedObservable.clear();\r\n this.onLightRemovedObservable.clear();\r\n this.onNewGeometryAddedObservable.clear();\r\n this.onGeometryRemovedObservable.clear();\r\n this.onNewTransformNodeAddedObservable.clear();\r\n this.onTransformNodeRemovedObservable.clear();\r\n this.onNewMeshAddedObservable.clear();\r\n this.onMeshRemovedObservable.clear();\r\n this.onNewSkeletonAddedObservable.clear();\r\n this.onSkeletonRemovedObservable.clear();\r\n this.onNewMaterialAddedObservable.clear();\r\n this.onNewMultiMaterialAddedObservable.clear();\r\n this.onMaterialRemovedObservable.clear();\r\n this.onMultiMaterialRemovedObservable.clear();\r\n this.onNewTextureAddedObservable.clear();\r\n this.onTextureRemovedObservable.clear();\r\n this.onPrePointerObservable.clear();\r\n this.onPointerObservable.clear();\r\n this.onPreKeyboardObservable.clear();\r\n this.onKeyboardObservable.clear();\r\n this.onActiveCameraChanged.clear();\r\n this.onScenePerformancePriorityChangedObservable.clear();\r\n this._isDisposed = true;\r\n }\r\n\r\n private _disposeList(items: T[], callback?: (item: T) => void): void {\r\n const itemsCopy = items.slice(0);\r\n callback = callback ?? ((item) => item.dispose());\r\n for (const item of itemsCopy) {\r\n callback(item);\r\n }\r\n items.length = 0;\r\n }\r\n\r\n /**\r\n * Gets if the scene is already disposed\r\n */\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * Call this function to reduce memory footprint of the scene.\r\n * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly)\r\n */\r\n public clearCachedVertexData(): void {\r\n for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) {\r\n const mesh = this.meshes[meshIndex];\r\n const geometry = (mesh).geometry;\r\n\r\n if (geometry) {\r\n geometry.clearCachedData();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This function will remove the local cached buffer data from texture.\r\n * It will save memory but will prevent the texture from being rebuilt\r\n */\r\n public cleanCachedTextureBuffer(): void {\r\n for (const baseTexture of this.textures) {\r\n const buffer = (baseTexture)._buffer;\r\n\r\n if (buffer) {\r\n (baseTexture)._buffer = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the world extend vectors with an optional filter\r\n *\r\n * @param filterPredicate the predicate - which meshes should be included when calculating the world size\r\n * @returns {{ min: Vector3; max: Vector3 }} min and max vectors\r\n */\r\n public getWorldExtends(filterPredicate?: (mesh: AbstractMesh) => boolean): { min: Vector3; max: Vector3 } {\r\n const min = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n const max = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n filterPredicate = filterPredicate || (() => true);\r\n this.meshes.filter(filterPredicate).forEach((mesh) => {\r\n mesh.computeWorldMatrix(true);\r\n\r\n if (!mesh.subMeshes || mesh.subMeshes.length === 0 || mesh.infiniteDistance) {\r\n return;\r\n }\r\n\r\n const boundingInfo = mesh.getBoundingInfo();\r\n\r\n const minBox = boundingInfo.boundingBox.minimumWorld;\r\n const maxBox = boundingInfo.boundingBox.maximumWorld;\r\n\r\n Vector3.CheckExtends(minBox, min, max);\r\n Vector3.CheckExtends(maxBox, min, max);\r\n });\r\n\r\n return {\r\n min: min,\r\n max: max,\r\n };\r\n }\r\n\r\n // Picking\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a ray that can be used to pick in the scene\r\n * @param x defines the x coordinate of the origin (on-screen)\r\n * @param y defines the y coordinate of the origin (on-screen)\r\n * @param world defines the world matrix to use if you want to pick in object space (instead of world space)\r\n * @param camera defines the camera to use for the picking\r\n * @param cameraViewSpace defines if picking will be done in view space (false by default)\r\n * @returns a Ray\r\n */\r\n public createPickingRay(x: number, y: number, world: Nullable, camera: Nullable, cameraViewSpace = false): Ray {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a ray that can be used to pick in the scene\r\n * @param x defines the x coordinate of the origin (on-screen)\r\n * @param y defines the y coordinate of the origin (on-screen)\r\n * @param world defines the world matrix to use if you want to pick in object space (instead of world space)\r\n * @param result defines the ray where to store the picking ray\r\n * @param camera defines the camera to use for the picking\r\n * @param cameraViewSpace defines if picking will be done in view space (false by default)\r\n * @param enableDistantPicking defines if picking should handle large values for mesh position/scaling (false by default)\r\n * @returns the current scene\r\n */\r\n public createPickingRayToRef(\r\n x: number,\r\n y: number,\r\n world: Nullable,\r\n result: Ray,\r\n camera: Nullable,\r\n cameraViewSpace = false,\r\n enableDistantPicking = false\r\n ): Scene {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a ray that can be used to pick in the scene\r\n * @param x defines the x coordinate of the origin (on-screen)\r\n * @param y defines the y coordinate of the origin (on-screen)\r\n * @param camera defines the camera to use for the picking\r\n * @returns a Ray\r\n */\r\n public createPickingRayInCameraSpace(x: number, y: number, camera?: Camera): Ray {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Creates a ray that can be used to pick in the scene\r\n * @param x defines the x coordinate of the origin (on-screen)\r\n * @param y defines the y coordinate of the origin (on-screen)\r\n * @param result defines the ray where to store the picking ray\r\n * @param camera defines the camera to use for the picking\r\n * @returns the current scene\r\n */\r\n public createPickingRayInCameraSpaceToRef(x: number, y: number, result: Ray, camera?: Camera): Scene {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n /** @internal */\r\n public get _pickingAvailable(): boolean {\r\n return false;\r\n }\r\n\r\n /** @internal */\r\n public _registeredActions: number = 0;\r\n\r\n /** Launch a ray to try to pick a mesh in the scene\r\n * @param x position on screen\r\n * @param y position on screen\r\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns a PickingInfo\r\n */\r\n public pick(\r\n x: number,\r\n y: number,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n fastCheck?: boolean,\r\n camera?: Nullable,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): PickingInfo {\r\n const warn = _WarnImport(\"Ray\", true);\r\n if (warn) {\r\n Logger.Warn(warn);\r\n }\r\n // Dummy info if picking as not been imported\r\n return new PickingInfo();\r\n }\r\n\r\n /** Launch a ray to try to pick a mesh in the scene using only bounding information of the main mesh (not using submeshes)\r\n * @param x position on screen\r\n * @param y position on screen\r\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used\r\n * @returns a PickingInfo (Please note that some info will not be set like distance, bv, bu and everything that cannot be capture by only using bounding infos)\r\n */\r\n public pickWithBoundingInfo(x: number, y: number, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, camera?: Nullable): Nullable {\r\n const warn = _WarnImport(\"Ray\", true);\r\n if (warn) {\r\n Logger.Warn(warn);\r\n }\r\n // Dummy info if picking as not been imported\r\n return new PickingInfo();\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Use the given ray to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides,\r\n * irrespective of orientation.\r\n * @param ray The ray to use to pick meshes\r\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must have isPickable set to true\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns a PickingInfo\r\n */\r\n public pickWithRay(ray: Ray, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Launch a ray to try to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides,\r\n * irrespective of orientation.\r\n * @param x X position on screen\r\n * @param y Y position on screen\r\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\r\n * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns an array of PickingInfo\r\n */\r\n public multiPick(x: number, y: number, predicate?: (mesh: AbstractMesh) => boolean, camera?: Camera, trianglePredicate?: TrianglePickingPredicate): Nullable {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Launch a ray to try to pick a mesh in the scene\r\n * @param ray Ray to use\r\n * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns an array of PickingInfo\r\n */\r\n public multiPickWithRay(ray: Ray, predicate?: (mesh: AbstractMesh) => boolean, trianglePredicate?: TrianglePickingPredicate): Nullable {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n /**\r\n * Force the value of meshUnderPointer\r\n * @param mesh defines the mesh to use\r\n * @param pointerId optional pointer id when using more than one pointer\r\n * @param pickResult optional pickingInfo data used to find mesh\r\n */\r\n public setPointerOverMesh(mesh: Nullable, pointerId?: number, pickResult?: Nullable): void {\r\n this._inputManager.setPointerOverMesh(mesh, pointerId, pickResult);\r\n }\r\n\r\n /**\r\n * Gets the mesh under the pointer\r\n * @returns a Mesh or null if no mesh is under the pointer\r\n */\r\n public getPointerOverMesh(): Nullable {\r\n return this._inputManager.getPointerOverMesh();\r\n }\r\n\r\n // Misc.\r\n /** @internal */\r\n public _rebuildGeometries(): void {\r\n for (const geometry of this.geometries) {\r\n geometry._rebuild();\r\n }\r\n\r\n for (const mesh of this.meshes) {\r\n mesh._rebuild();\r\n }\r\n\r\n if (this.postProcessManager) {\r\n this.postProcessManager._rebuild();\r\n }\r\n\r\n for (const component of this._components) {\r\n component.rebuild();\r\n }\r\n\r\n for (const system of this.particleSystems) {\r\n system.rebuild();\r\n }\r\n\r\n if (this.spriteManagers) {\r\n for (const spriteMgr of this.spriteManagers) {\r\n spriteMgr.rebuild();\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _rebuildTextures(): void {\r\n for (const texture of this.textures) {\r\n texture._rebuild(true);\r\n }\r\n\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Get from a list of objects by tags\r\n * @param list the list of objects to use\r\n * @param tagsQuery the query to use\r\n * @param filter a predicate to filter for tags\r\n * @returns\r\n */\r\n private _getByTags(list: any[], tagsQuery: string, filter?: (item: any) => boolean): any[] {\r\n if (tagsQuery === undefined) {\r\n // returns the complete list (could be done with Tags.MatchesQuery but no need to have a for-loop here)\r\n return list;\r\n }\r\n\r\n const listByTags = [];\r\n\r\n for (const i in list) {\r\n const item = list[i];\r\n if (Tags && Tags.MatchesQuery(item, tagsQuery) && (!filter || filter(item))) {\r\n listByTags.push(item);\r\n }\r\n }\r\n\r\n return listByTags;\r\n }\r\n\r\n /**\r\n * Get a list of meshes by tags\r\n * @param tagsQuery defines the tags query to use\r\n * @param filter defines a predicate used to filter results\r\n * @returns an array of Mesh\r\n */\r\n public getMeshesByTags(tagsQuery: string, filter?: (mesh: AbstractMesh) => boolean): AbstractMesh[] {\r\n return this._getByTags(this.meshes, tagsQuery, filter);\r\n }\r\n\r\n /**\r\n * Get a list of cameras by tags\r\n * @param tagsQuery defines the tags query to use\r\n * @param filter defines a predicate used to filter results\r\n * @returns an array of Camera\r\n */\r\n public getCamerasByTags(tagsQuery: string, filter?: (camera: Camera) => boolean): Camera[] {\r\n return this._getByTags(this.cameras, tagsQuery, filter);\r\n }\r\n\r\n /**\r\n * Get a list of lights by tags\r\n * @param tagsQuery defines the tags query to use\r\n * @param filter defines a predicate used to filter results\r\n * @returns an array of Light\r\n */\r\n public getLightsByTags(tagsQuery: string, filter?: (light: Light) => boolean): Light[] {\r\n return this._getByTags(this.lights, tagsQuery, filter);\r\n }\r\n\r\n /**\r\n * Get a list of materials by tags\r\n * @param tagsQuery defines the tags query to use\r\n * @param filter defines a predicate used to filter results\r\n * @returns an array of Material\r\n */\r\n public getMaterialByTags(tagsQuery: string, filter?: (material: Material) => boolean): Material[] {\r\n return this._getByTags(this.materials, tagsQuery, filter).concat(this._getByTags(this.multiMaterials, tagsQuery, filter));\r\n }\r\n\r\n /**\r\n * Get a list of transform nodes by tags\r\n * @param tagsQuery defines the tags query to use\r\n * @param filter defines a predicate used to filter results\r\n * @returns an array of TransformNode\r\n */\r\n public getTransformNodesByTags(tagsQuery: string, filter?: (transform: TransformNode) => boolean): TransformNode[] {\r\n return this._getByTags(this.transformNodes, tagsQuery, filter);\r\n }\r\n\r\n /**\r\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\r\n * This allowed control for front to back rendering or reversly depending of the special needs.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\r\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\r\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\r\n */\r\n public setRenderingOrder(\r\n renderingGroupId: number,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ): void {\r\n this._renderingManager.setRenderingOrder(renderingGroupId, opaqueSortCompareFn, alphaTestSortCompareFn, transparentSortCompareFn);\r\n }\r\n\r\n /**\r\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\r\n * @param depth Automatically clears depth between groups if true and autoClear is true.\r\n * @param stencil Automatically clears stencil between groups if true and autoClear is true.\r\n */\r\n public setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean, depth = true, stencil = true): void {\r\n this._renderingManager.setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil, depth, stencil);\r\n }\r\n\r\n /**\r\n * Gets the current auto clear configuration for one rendering group of the rendering\r\n * manager.\r\n * @param index the rendering group index to get the information for\r\n * @returns The auto clear setup for the requested rendering group\r\n */\r\n public getAutoClearDepthStencilSetup(index: number): IRenderingManagerAutoClearSetup {\r\n return this._renderingManager.getAutoClearDepthStencilSetup(index);\r\n }\r\n\r\n private _blockMaterialDirtyMechanism = false;\r\n\r\n /** @internal */\r\n public _forceBlockMaterialDirtyMechanism(value: boolean) {\r\n this._blockMaterialDirtyMechanism = value;\r\n }\r\n\r\n /** Gets or sets a boolean blocking all the calls to markAllMaterialsAsDirty (ie. the materials won't be updated if they are out of sync) */\r\n public get blockMaterialDirtyMechanism(): boolean {\r\n return this._blockMaterialDirtyMechanism;\r\n }\r\n\r\n public set blockMaterialDirtyMechanism(value: boolean) {\r\n if (this._blockMaterialDirtyMechanism === value) {\r\n return;\r\n }\r\n\r\n this._blockMaterialDirtyMechanism = value;\r\n\r\n if (!value) {\r\n // Do a complete update\r\n this.markAllMaterialsAsDirty(Constants.MATERIAL_AllDirtyFlag);\r\n }\r\n }\r\n\r\n /**\r\n * Will flag all materials as dirty to trigger new shader compilation\r\n * @param flag defines the flag used to specify which material part must be marked as dirty\r\n * @param predicate If not null, it will be used to specify if a material has to be marked as dirty\r\n */\r\n public markAllMaterialsAsDirty(flag: number, predicate?: (mat: Material) => boolean): void {\r\n if (this._blockMaterialDirtyMechanism) {\r\n return;\r\n }\r\n\r\n for (const material of this.materials) {\r\n if (predicate && !predicate(material)) {\r\n continue;\r\n }\r\n material.markAsDirty(flag);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFile(\r\n fileOrUrl: File | string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n useOfflineSupport?: boolean,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n onOpened?: (request: WebRequest) => void\r\n ): IFileRequest {\r\n const request = LoadFile(fileOrUrl, onSuccess, onProgress, useOfflineSupport ? this.offlineProvider : undefined, useArrayBuffer, onError, onOpened);\r\n this._activeRequests.push(request);\r\n request.onCompleteObservable.add((request) => {\r\n this._activeRequests.splice(this._activeRequests.indexOf(request), 1);\r\n });\r\n return request;\r\n }\r\n\r\n public _loadFileAsync(\r\n fileOrUrl: File | string,\r\n onProgress?: (data: any) => void,\r\n useOfflineSupport?: boolean,\r\n useArrayBuffer?: false,\r\n onOpened?: (request: WebRequest) => void\r\n ): Promise;\r\n\r\n public _loadFileAsync(\r\n fileOrUrl: File | string,\r\n onProgress?: (data: any) => void,\r\n useOfflineSupport?: boolean,\r\n useArrayBuffer?: true,\r\n onOpened?: (request: WebRequest) => void\r\n ): Promise;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFileAsync(\r\n fileOrUrl: File | string,\r\n onProgress?: (data: any) => void,\r\n useOfflineSupport?: boolean,\r\n useArrayBuffer?: boolean,\r\n onOpened?: (request: WebRequest) => void\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n this._loadFile(\r\n fileOrUrl,\r\n (data) => {\r\n resolve(data);\r\n },\r\n onProgress,\r\n useOfflineSupport,\r\n useArrayBuffer,\r\n (request, exception) => {\r\n reject(exception);\r\n },\r\n onOpened\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _requestFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, request?: WebRequest) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n useOfflineSupport?: boolean,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: RequestFileError) => void,\r\n onOpened?: (request: WebRequest) => void\r\n ): IFileRequest {\r\n const request = RequestFile(url, onSuccess, onProgress, useOfflineSupport ? this.offlineProvider : undefined, useArrayBuffer, onError, onOpened);\r\n this._activeRequests.push(request);\r\n request.onCompleteObservable.add((request) => {\r\n this._activeRequests.splice(this._activeRequests.indexOf(request), 1);\r\n });\r\n return request;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _requestFileAsync(\r\n url: string,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n useOfflineSupport?: boolean,\r\n useArrayBuffer?: boolean,\r\n onOpened?: (request: WebRequest) => void\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n this._requestFile(\r\n url,\r\n (data) => {\r\n resolve(data);\r\n },\r\n onProgress,\r\n useOfflineSupport,\r\n useArrayBuffer,\r\n (error) => {\r\n reject(error);\r\n },\r\n onOpened\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _readFile(\r\n file: File,\r\n onSuccess: (data: string | ArrayBuffer) => void,\r\n onProgress?: (ev: ProgressEvent) => any,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: ReadFileError) => void\r\n ): IFileRequest {\r\n const request = ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError);\r\n this._activeRequests.push(request);\r\n request.onCompleteObservable.add((request) => {\r\n this._activeRequests.splice(this._activeRequests.indexOf(request), 1);\r\n });\r\n return request;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _readFileAsync(file: File, onProgress?: (ev: ProgressEvent) => any, useArrayBuffer?: boolean): Promise {\r\n return new Promise((resolve, reject) => {\r\n this._readFile(\r\n file,\r\n (data) => {\r\n resolve(data);\r\n },\r\n onProgress,\r\n useArrayBuffer,\r\n (error) => {\r\n reject(error);\r\n }\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Internal perfCollector instance used for sharing between inspector and playground.\r\n * Marked as protected to allow sharing between prototype extensions, but disallow access at toplevel.\r\n */\r\n protected _perfCollector: Nullable = null;\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * This method gets the performance collector belonging to the scene, which is generally shared with the inspector.\r\n * @returns the perf collector belonging to the scene.\r\n */\r\n public getPerfCollector(): PerformanceViewerCollector {\r\n throw _WarnImport(\"performanceViewerSceneExtension\");\r\n }\r\n\r\n // deprecated\r\n\r\n /**\r\n * Sets the active camera of the scene using its Id\r\n * @param id defines the camera's Id\r\n * @returns the new active camera or null if none found.\r\n * @deprecated Please use setActiveCameraById instead\r\n */\r\n setActiveCameraByID(id: string): Nullable {\r\n return this.setActiveCameraById(id);\r\n }\r\n /**\r\n * Get a material using its id\r\n * @param id defines the material's Id\r\n * @returns the material or null if none found.\r\n * @deprecated Please use getMaterialById instead\r\n */\r\n getMaterialByID(id: string): Nullable {\r\n return this.getMaterialById(id);\r\n }\r\n /**\r\n * Gets a the last added material using a given id\r\n * @param id defines the material's Id\r\n * @returns the last material with the given id or null if none found.\r\n * @deprecated Please use getLastMaterialById instead\r\n */\r\n getLastMaterialByID(id: string): Nullable {\r\n return this.getLastMaterialById(id);\r\n }\r\n\r\n /**\r\n * Get a texture using its unique id\r\n * @param uniqueId defines the texture's unique id\r\n * @returns the texture or null if none found.\r\n * @deprecated Please use getTextureByUniqueId instead\r\n */\r\n getTextureByUniqueID(uniqueId: number): Nullable {\r\n return this.getTextureByUniqueId(uniqueId);\r\n }\r\n /**\r\n * Gets a camera using its Id\r\n * @param id defines the Id to look for\r\n * @returns the camera or null if not found\r\n * @deprecated Please use getCameraById instead\r\n */\r\n getCameraByID(id: string): Nullable {\r\n return this.getCameraById(id);\r\n }\r\n /**\r\n * Gets a camera using its unique Id\r\n * @param uniqueId defines the unique Id to look for\r\n * @returns the camera or null if not found\r\n * @deprecated Please use getCameraByUniqueId instead\r\n */\r\n getCameraByUniqueID(uniqueId: number): Nullable {\r\n return this.getCameraByUniqueId(uniqueId);\r\n }\r\n /**\r\n * Gets a bone using its Id\r\n * @param id defines the bone's Id\r\n * @returns the bone or null if not found\r\n * @deprecated Please use getBoneById instead\r\n */\r\n getBoneByID(id: string): Nullable {\r\n return this.getBoneById(id);\r\n }\r\n /**\r\n * Gets a light node using its Id\r\n * @param id defines the light's Id\r\n * @returns the light or null if none found.\r\n * @deprecated Please use getLightById instead\r\n */\r\n getLightByID(id: string): Nullable {\r\n return this.getLightById(id);\r\n }\r\n /**\r\n * Gets a light node using its scene-generated unique Id\r\n * @param uniqueId defines the light's unique Id\r\n * @returns the light or null if none found.\r\n * @deprecated Please use getLightByUniqueId instead\r\n */\r\n getLightByUniqueID(uniqueId: number): Nullable {\r\n return this.getLightByUniqueId(uniqueId);\r\n }\r\n /**\r\n * Gets a particle system by Id\r\n * @param id defines the particle system Id\r\n * @returns the corresponding system or null if none found\r\n * @deprecated Please use getParticleSystemById instead\r\n */\r\n getParticleSystemByID(id: string): Nullable {\r\n return this.getParticleSystemById(id);\r\n }\r\n /**\r\n * Gets a geometry using its Id\r\n * @param id defines the geometry's Id\r\n * @returns the geometry or null if none found.\r\n * @deprecated Please use getGeometryById instead\r\n */\r\n getGeometryByID(id: string): Nullable {\r\n return this.getGeometryById(id);\r\n }\r\n /**\r\n * Gets the first added mesh found of a given Id\r\n * @param id defines the Id to search for\r\n * @returns the mesh found or null if not found at all\r\n * @deprecated Please use getMeshById instead\r\n */\r\n getMeshByID(id: string): Nullable {\r\n return this.getMeshById(id);\r\n }\r\n /**\r\n * Gets a mesh with its auto-generated unique Id\r\n * @param uniqueId defines the unique Id to search for\r\n * @returns the found mesh or null if not found at all.\r\n * @deprecated Please use getMeshByUniqueId instead\r\n */\r\n getMeshByUniqueID(uniqueId: number): Nullable {\r\n return this.getMeshByUniqueId(uniqueId);\r\n }\r\n /**\r\n * Gets a the last added mesh using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found mesh or null if not found at all.\r\n * @deprecated Please use getLastMeshById instead\r\n */\r\n getLastMeshByID(id: string): Nullable {\r\n return this.getLastMeshById(id);\r\n }\r\n /**\r\n * Gets a list of meshes using their Id\r\n * @param id defines the Id to search for\r\n * @returns a list of meshes\r\n * @deprecated Please use getMeshesById instead\r\n */\r\n getMeshesByID(id: string): Array {\r\n return this.getMeshesById(id);\r\n }\r\n /**\r\n * Gets the first added transform node found of a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found transform node or null if not found at all.\r\n * @deprecated Please use getTransformNodeById instead\r\n */\r\n getTransformNodeByID(id: string): Nullable {\r\n return this.getTransformNodeById(id);\r\n }\r\n /**\r\n * Gets a transform node with its auto-generated unique Id\r\n * @param uniqueId defines the unique Id to search for\r\n * @returns the found transform node or null if not found at all.\r\n * @deprecated Please use getTransformNodeByUniqueId instead\r\n */\r\n getTransformNodeByUniqueID(uniqueId: number): Nullable {\r\n return this.getTransformNodeByUniqueId(uniqueId);\r\n }\r\n /**\r\n * Gets a list of transform nodes using their Id\r\n * @param id defines the Id to search for\r\n * @returns a list of transform nodes\r\n * @deprecated Please use getTransformNodesById instead\r\n */\r\n getTransformNodesByID(id: string): Array {\r\n return this.getTransformNodesById(id);\r\n }\r\n /**\r\n * Gets a node (Mesh, Camera, Light) using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found node or null if not found at all\r\n * @deprecated Please use getNodeById instead\r\n */\r\n getNodeByID(id: string): Nullable {\r\n return this.getNodeById(id);\r\n }\r\n /**\r\n * Gets a the last added node (Mesh, Camera, Light) using a given Id\r\n * @param id defines the Id to search for\r\n * @returns the found node or null if not found at all\r\n * @deprecated Please use getLastEntryById instead\r\n */\r\n getLastEntryByID(id: string): Nullable {\r\n return this.getLastEntryById(id);\r\n }\r\n /**\r\n * Gets a skeleton using a given Id (if many are found, this function will pick the last one)\r\n * @param id defines the Id to search for\r\n * @returns the found skeleton or null if not found at all.\r\n * @deprecated Please use getLastSkeletonById instead\r\n */\r\n getLastSkeletonByID(id: string): Nullable {\r\n return this.getLastSkeletonById(id);\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\nimport { PrecisionDate } from \"./precisionDate\";\r\n\r\n/**\r\n * Performance monitor tracks rolling average frame-time and frame-time variance over a user defined sliding-window\r\n */\r\nexport class PerformanceMonitor {\r\n private _enabled: boolean = true;\r\n private _rollingFrameTime: RollingAverage;\r\n private _lastFrameTimeMs: Nullable;\r\n\r\n /**\r\n * constructor\r\n * @param frameSampleSize The number of samples required to saturate the sliding window\r\n */\r\n constructor(frameSampleSize: number = 30) {\r\n this._rollingFrameTime = new RollingAverage(frameSampleSize);\r\n }\r\n\r\n /**\r\n * Samples current frame\r\n * @param timeMs A timestamp in milliseconds of the current frame to compare with other frames\r\n */\r\n public sampleFrame(timeMs: number = PrecisionDate.Now) {\r\n if (!this._enabled) {\r\n return;\r\n }\r\n\r\n if (this._lastFrameTimeMs != null) {\r\n const dt = timeMs - this._lastFrameTimeMs;\r\n this._rollingFrameTime.add(dt);\r\n }\r\n\r\n this._lastFrameTimeMs = timeMs;\r\n }\r\n\r\n /**\r\n * Returns the average frame time in milliseconds over the sliding window (or the subset of frames sampled so far)\r\n */\r\n public get averageFrameTime(): number {\r\n return this._rollingFrameTime.average;\r\n }\r\n\r\n /**\r\n * Returns the variance frame time in milliseconds over the sliding window (or the subset of frames sampled so far)\r\n */\r\n public get averageFrameTimeVariance(): number {\r\n return this._rollingFrameTime.variance;\r\n }\r\n\r\n /**\r\n * Returns the frame time of the most recent frame\r\n */\r\n public get instantaneousFrameTime(): number {\r\n return this._rollingFrameTime.history(0);\r\n }\r\n\r\n /**\r\n * Returns the average framerate in frames per second over the sliding window (or the subset of frames sampled so far)\r\n */\r\n public get averageFPS(): number {\r\n return 1000.0 / this._rollingFrameTime.average;\r\n }\r\n\r\n /**\r\n * Returns the average framerate in frames per second using the most recent frame time\r\n */\r\n public get instantaneousFPS(): number {\r\n const history = this._rollingFrameTime.history(0);\r\n\r\n if (history === 0) {\r\n return 0;\r\n }\r\n\r\n return 1000.0 / history;\r\n }\r\n\r\n /**\r\n * Returns true if enough samples have been taken to completely fill the sliding window\r\n */\r\n public get isSaturated(): boolean {\r\n return this._rollingFrameTime.isSaturated();\r\n }\r\n\r\n /**\r\n * Enables contributions to the sliding window sample set\r\n */\r\n public enable() {\r\n this._enabled = true;\r\n }\r\n\r\n /**\r\n * Disables contributions to the sliding window sample set\r\n * Samples will not be interpolated over the disabled period\r\n */\r\n public disable() {\r\n this._enabled = false;\r\n //clear last sample to avoid interpolating over the disabled period when next enabled\r\n this._lastFrameTimeMs = null;\r\n }\r\n\r\n /**\r\n * Returns true if sampling is enabled\r\n */\r\n public get isEnabled(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n /**\r\n * Resets performance monitor\r\n */\r\n public reset() {\r\n //clear last sample to avoid interpolating over the disabled period when next enabled\r\n this._lastFrameTimeMs = null;\r\n //wipe record\r\n this._rollingFrameTime.reset();\r\n }\r\n}\r\n\r\n/**\r\n * RollingAverage\r\n *\r\n * Utility to efficiently compute the rolling average and variance over a sliding window of samples\r\n */\r\nexport class RollingAverage {\r\n /**\r\n * Current average\r\n */\r\n public average: number;\r\n /**\r\n * Current variance\r\n */\r\n public variance: number;\r\n\r\n protected _samples: Array;\r\n protected _sampleCount: number;\r\n protected _pos: number;\r\n protected _m2: number; //sum of squares of differences from the (current) mean\r\n\r\n /**\r\n * constructor\r\n * @param length The number of samples required to saturate the sliding window\r\n */\r\n constructor(length: number) {\r\n this._samples = new Array(length);\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Adds a sample to the sample set\r\n * @param v The sample value\r\n */\r\n public add(v: number) {\r\n //http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance\r\n let delta: number;\r\n\r\n //we need to check if we've already wrapped round\r\n if (this.isSaturated()) {\r\n //remove bottom of stack from mean\r\n const bottomValue = this._samples[this._pos];\r\n delta = bottomValue - this.average;\r\n this.average -= delta / (this._sampleCount - 1);\r\n this._m2 -= delta * (bottomValue - this.average);\r\n } else {\r\n this._sampleCount++;\r\n }\r\n\r\n //add new value to mean\r\n delta = v - this.average;\r\n this.average += delta / this._sampleCount;\r\n this._m2 += delta * (v - this.average);\r\n\r\n //set the new variance\r\n this.variance = this._m2 / (this._sampleCount - 1);\r\n\r\n this._samples[this._pos] = v;\r\n this._pos++;\r\n\r\n this._pos %= this._samples.length; //positive wrap around\r\n }\r\n\r\n /**\r\n * Returns previously added values or null if outside of history or outside the sliding window domain\r\n * @param i Index in history. For example, pass 0 for the most recent value and 1 for the value before that\r\n * @returns Value previously recorded with add() or null if outside of range\r\n */\r\n public history(i: number): number {\r\n if (i >= this._sampleCount || i >= this._samples.length) {\r\n return 0;\r\n }\r\n\r\n const i0 = this._wrapPosition(this._pos - 1.0);\r\n return this._samples[this._wrapPosition(i0 - i)];\r\n }\r\n\r\n /**\r\n * Returns true if enough samples have been taken to completely fill the sliding window\r\n * @returns true if sample-set saturated\r\n */\r\n public isSaturated(): boolean {\r\n return this._sampleCount >= this._samples.length;\r\n }\r\n\r\n /**\r\n * Resets the rolling average (equivalent to 0 samples taken so far)\r\n */\r\n public reset() {\r\n this.average = 0;\r\n this.variance = 0;\r\n this._sampleCount = 0;\r\n this._pos = 0;\r\n this._m2 = 0;\r\n }\r\n\r\n /**\r\n * Wraps a value around the sample range boundaries\r\n * @param i Position in sample range, for example if the sample length is 5, and i is -3, then 2 will be returned.\r\n * @returns Wrapped position in sample range\r\n */\r\n protected _wrapPosition(i: number): number {\r\n const max = this._samples.length;\r\n return ((i % max) + max) % max;\r\n }\r\n}\r\n", "import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../constants\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /** @internal */\r\n _readTexturePixels(\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex?: number,\r\n level?: number,\r\n buffer?: Nullable,\r\n flushRenderer?: boolean,\r\n noDataConversion?: boolean,\r\n x?: number,\r\n y?: number\r\n ): Promise;\r\n\r\n /** @internal */\r\n _readTexturePixelsSync(\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex?: number,\r\n level?: number,\r\n buffer?: Nullable,\r\n flushRenderer?: boolean,\r\n noDataConversion?: boolean,\r\n x?: number,\r\n y?: number\r\n ): ArrayBufferView;\r\n }\r\n}\r\n\r\n/**\r\n * Allocate a typed array depending on a texture type. Optionally can copy existing data in the buffer.\r\n * @param type type of the texture\r\n * @param sizeOrDstBuffer size of the array OR an existing buffer that will be used as the destination of the copy (if copyBuffer is provided)\r\n * @param sizeInBytes true if the size of the array is given in bytes, false if it is the number of elements of the array\r\n * @param copyBuffer if provided, buffer to copy into the destination buffer (either a newly allocated buffer if sizeOrDstBuffer is a number or use sizeOrDstBuffer as the destination buffer otherwise)\r\n * @returns the allocated buffer or sizeOrDstBuffer if the latter is an ArrayBuffer\r\n */\r\nexport function allocateAndCopyTypedBuffer(type: number, sizeOrDstBuffer: number | ArrayBuffer, sizeInBytes = false, copyBuffer?: ArrayBuffer): ArrayBufferView {\r\n switch (type) {\r\n case Constants.TEXTURETYPE_BYTE: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Int8Array(sizeOrDstBuffer) : new Int8Array(sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Int8Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint8Array(sizeOrDstBuffer) : new Uint8Array(sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint8Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_SHORT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Int16Array(sizeOrDstBuffer) : new Int16Array(sizeInBytes ? sizeOrDstBuffer / 2 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Int16Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5:\r\n case Constants.TEXTURETYPE_HALF_FLOAT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint16Array(sizeOrDstBuffer) : new Uint16Array(sizeInBytes ? sizeOrDstBuffer / 2 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint16Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_INT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Int32Array(sizeOrDstBuffer) : new Int32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Int32Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_INTEGER:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_24_8:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV:\r\n case Constants.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint32Array(sizeOrDstBuffer) : new Uint32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint32Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_FLOAT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Float32Array(sizeOrDstBuffer) : new Float32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Float32Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n }\r\n\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint8Array(sizeOrDstBuffer) : new Uint8Array(sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint8Array(copyBuffer));\r\n }\r\n return buffer;\r\n}\r\n\r\nThinEngine.prototype._readTexturePixelsSync = function (\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex = -1,\r\n level = 0,\r\n buffer: Nullable = null,\r\n flushRenderer = true,\r\n noDataConversion = false,\r\n x = 0,\r\n y = 0\r\n): ArrayBufferView {\r\n const gl = this._gl;\r\n if (!gl) {\r\n throw new Error(\"Engine does not have gl rendering context.\");\r\n }\r\n if (!this._dummyFramebuffer) {\r\n const dummy = gl.createFramebuffer();\r\n\r\n if (!dummy) {\r\n throw new Error(\"Unable to create dummy framebuffer\");\r\n }\r\n\r\n this._dummyFramebuffer = dummy;\r\n }\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFramebuffer);\r\n\r\n if (faceIndex > -1) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, texture._hardwareTexture?.underlyingResource, level);\r\n } else {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture._hardwareTexture?.underlyingResource, level);\r\n }\r\n\r\n let readType = texture.type !== undefined ? this._getWebGLTextureType(texture.type) : gl.UNSIGNED_BYTE;\r\n\r\n if (!noDataConversion) {\r\n switch (readType) {\r\n case gl.UNSIGNED_BYTE:\r\n if (!buffer) {\r\n buffer = new Uint8Array(4 * width * height);\r\n }\r\n readType = gl.UNSIGNED_BYTE;\r\n break;\r\n default:\r\n if (!buffer) {\r\n buffer = new Float32Array(4 * width * height);\r\n }\r\n readType = gl.FLOAT;\r\n break;\r\n }\r\n } else if (!buffer) {\r\n buffer = allocateAndCopyTypedBuffer(texture.type, 4 * width * height);\r\n }\r\n\r\n if (flushRenderer) {\r\n this.flushFramebuffer();\r\n }\r\n\r\n gl.readPixels(x, y, width, height, gl.RGBA, readType, buffer);\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._currentFramebuffer);\r\n\r\n return buffer;\r\n};\r\n\r\nThinEngine.prototype._readTexturePixels = function (\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex = -1,\r\n level = 0,\r\n buffer: Nullable = null,\r\n flushRenderer = true,\r\n noDataConversion = false,\r\n x = 0,\r\n y = 0\r\n): Promise {\r\n return Promise.resolve(this._readTexturePixelsSync(texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion, x, y));\r\n};\r\n", "import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { Constants } from \"../constants\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Sets alpha constants used by some alpha blending modes\r\n * @param r defines the red component\r\n * @param g defines the green component\r\n * @param b defines the blue component\r\n * @param a defines the alpha component\r\n */\r\n setAlphaConstants(r: number, g: number, b: number, a: number): void;\r\n\r\n /**\r\n * Sets the current alpha mode\r\n * @param mode defines the mode to use (one of the Engine.ALPHA_XXX)\r\n * @param noDepthWriteChange defines if depth writing state should remains unchanged (false by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering\r\n */\r\n setAlphaMode(mode: number, noDepthWriteChange?: boolean): void;\r\n\r\n /**\r\n * Gets the current alpha mode\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering\r\n * @returns the current alpha mode\r\n */\r\n getAlphaMode(): number;\r\n\r\n /**\r\n * Sets the current alpha equation\r\n * @param equation defines the equation to use (one of the Engine.ALPHA_EQUATION_XXX)\r\n */\r\n setAlphaEquation(equation: number): void;\r\n\r\n /**\r\n * Gets the current alpha equation.\r\n * @returns the current alpha equation\r\n */\r\n getAlphaEquation(): number;\r\n }\r\n}\r\n\r\nThinEngine.prototype.setAlphaConstants = function (r: number, g: number, b: number, a: number) {\r\n this._alphaState.setAlphaBlendConstants(r, g, b, a);\r\n};\r\n\r\nThinEngine.prototype.setAlphaMode = function (mode: number, noDepthWriteChange: boolean = false): void {\r\n if (this._alphaMode === mode) {\r\n if (!noDepthWriteChange) {\r\n // Make sure we still have the correct depth mask according to the alpha mode (a transparent material could have forced writting to the depth buffer, for instance)\r\n const depthMask = mode === Constants.ALPHA_DISABLE;\r\n if (this.depthCullingState.depthMask !== depthMask) {\r\n this.depthCullingState.depthMask = depthMask;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n switch (mode) {\r\n case Constants.ALPHA_DISABLE:\r\n this._alphaState.alphaBlend = false;\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED_PORTERDUFF:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_COMBINE:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ONEONE:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ZERO, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ADD:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_SUBTRACT:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ZERO, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_MULTIPLY:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_COLOR, this._gl.ZERO, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_MAXIMIZED:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_INTERPOLATE:\r\n this._alphaState.setAlphaBlendFunctionParameters(\r\n this._gl.CONSTANT_COLOR,\r\n this._gl.ONE_MINUS_CONSTANT_COLOR,\r\n this._gl.CONSTANT_ALPHA,\r\n this._gl.ONE_MINUS_CONSTANT_ALPHA\r\n );\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_SCREENMODE:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEONE:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ALPHATOCOLOR:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ZERO);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_REVERSEONEMINUS:\r\n this._alphaState.setAlphaBlendFunctionParameters(\r\n this._gl.ONE_MINUS_DST_COLOR,\r\n this._gl.ONE_MINUS_SRC_COLOR,\r\n this._gl.ONE_MINUS_DST_ALPHA,\r\n this._gl.ONE_MINUS_SRC_ALPHA\r\n );\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_SRC_DSTONEMINUSSRCALPHA:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEZERO:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ONE, this._gl.ZERO);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_EXCLUSION:\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE_MINUS_DST_COLOR, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ZERO, this._gl.ONE);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n case Constants.ALPHA_LAYER_ACCUMULATE:\r\n // Same as ALPHA_COMBINE but accumulates (1 - alpha) values in the alpha channel for a later readout in order independant transparency\r\n this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA);\r\n this._alphaState.alphaBlend = true;\r\n break;\r\n }\r\n if (!noDepthWriteChange) {\r\n this.depthCullingState.depthMask = mode === Constants.ALPHA_DISABLE;\r\n }\r\n this._alphaMode = mode;\r\n};\r\n\r\nThinEngine.prototype.getAlphaMode = function (): number {\r\n return this._alphaMode;\r\n};\r\n\r\nThinEngine.prototype.setAlphaEquation = function (equation: number): void {\r\n if (this._alphaEquation === equation) {\r\n return;\r\n }\r\n\r\n switch (equation) {\r\n case Constants.ALPHA_EQUATION_ADD:\r\n this._alphaState.setAlphaEquationParameters(Constants.GL_ALPHA_EQUATION_ADD, Constants.GL_ALPHA_EQUATION_ADD);\r\n break;\r\n case Constants.ALPHA_EQUATION_SUBSTRACT:\r\n this._alphaState.setAlphaEquationParameters(Constants.GL_ALPHA_EQUATION_SUBTRACT, Constants.GL_ALPHA_EQUATION_SUBTRACT);\r\n break;\r\n case Constants.ALPHA_EQUATION_REVERSE_SUBTRACT:\r\n this._alphaState.setAlphaEquationParameters(Constants.GL_ALPHA_EQUATION_REVERSE_SUBTRACT, Constants.GL_ALPHA_EQUATION_REVERSE_SUBTRACT);\r\n break;\r\n case Constants.ALPHA_EQUATION_MAX:\r\n this._alphaState.setAlphaEquationParameters(Constants.GL_ALPHA_EQUATION_MAX, Constants.GL_ALPHA_EQUATION_MAX);\r\n break;\r\n case Constants.ALPHA_EQUATION_MIN:\r\n this._alphaState.setAlphaEquationParameters(Constants.GL_ALPHA_EQUATION_MIN, Constants.GL_ALPHA_EQUATION_MIN);\r\n break;\r\n case Constants.ALPHA_EQUATION_DARKEN:\r\n this._alphaState.setAlphaEquationParameters(Constants.GL_ALPHA_EQUATION_MIN, Constants.GL_ALPHA_EQUATION_ADD);\r\n break;\r\n }\r\n this._alphaEquation = equation;\r\n};\r\n\r\nThinEngine.prototype.getAlphaEquation = function () {\r\n return this._alphaEquation;\r\n};\r\n", "import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport type { IndicesArray, DataArray } from \"../../types\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Update a dynamic index buffer\r\n * @param indexBuffer defines the target index buffer\r\n * @param indices defines the data to update\r\n * @param offset defines the offset in the target index buffer where update should start\r\n */\r\n updateDynamicIndexBuffer(indexBuffer: DataBuffer, indices: IndicesArray, offset?: number): void;\r\n\r\n /**\r\n * Updates a dynamic vertex buffer.\r\n * @param vertexBuffer the vertex buffer to update\r\n * @param data the data used to update the vertex buffer\r\n * @param byteOffset the byte offset of the data\r\n * @param byteLength the byte length of the data\r\n */\r\n updateDynamicVertexBuffer(vertexBuffer: DataBuffer, data: DataArray, byteOffset?: number, byteLength?: number): void;\r\n }\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nThinEngine.prototype.updateDynamicIndexBuffer = function (this: ThinEngine, indexBuffer: DataBuffer, indices: IndicesArray, offset: number = 0): void {\r\n // Force cache update\r\n this._currentBoundBuffer[this._gl.ELEMENT_ARRAY_BUFFER] = null;\r\n this.bindIndexBuffer(indexBuffer);\r\n\r\n let view: ArrayBufferView;\r\n if (indexBuffer.is32Bits) {\r\n // anything else than Uint32Array needs to be converted to Uint32Array\r\n view = indices instanceof Uint32Array ? indices : new Uint32Array(indices);\r\n } else {\r\n // anything else than Uint16Array needs to be converted to Uint16Array\r\n view = indices instanceof Uint16Array ? indices : new Uint16Array(indices);\r\n }\r\n\r\n this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, view, this._gl.DYNAMIC_DRAW);\r\n\r\n this._resetIndexBufferBinding();\r\n};\r\n\r\nThinEngine.prototype.updateDynamicVertexBuffer = function (this: ThinEngine, vertexBuffer: DataBuffer, data: DataArray, byteOffset?: number, byteLength?: number): void {\r\n this.bindArrayBuffer(vertexBuffer);\r\n\r\n if (byteOffset === undefined) {\r\n byteOffset = 0;\r\n }\r\n\r\n const dataLength = (data as ArrayBuffer).byteLength || (data as number[]).length;\r\n\r\n if (byteLength === undefined || (byteLength >= dataLength && byteOffset === 0)) {\r\n if (data instanceof Array) {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, byteOffset, new Float32Array(data));\r\n } else {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, byteOffset, data);\r\n }\r\n } else {\r\n if (data instanceof Array) {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, new Float32Array(data).subarray(byteOffset, byteOffset + byteLength));\r\n } else {\r\n if (data instanceof ArrayBuffer) {\r\n data = new Uint8Array(data, byteOffset, byteLength);\r\n } else {\r\n data = new Uint8Array(data.buffer, data.byteOffset + byteOffset, byteLength);\r\n }\r\n\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data);\r\n }\r\n }\r\n\r\n this._resetVertexBufferBinding();\r\n};\r\n", "import { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { InternalTexture, InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport type { IOfflineProvider } from \"../Offline/IOfflineProvider\";\r\nimport type { ILoadingScreen } from \"../Loading/loadingScreen\";\r\nimport { IsDocumentAvailable, IsWindowObjectExist } from \"../Misc/domManagement\";\r\nimport { EngineStore } from \"./engineStore\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport type { WebGLPipelineContext } from \"./WebGL/webGLPipelineContext\";\r\nimport type { IPipelineContext } from \"./IPipelineContext\";\r\nimport type { ICustomAnimationFrameRequester } from \"../Misc/customAnimationFrameRequester\";\r\nimport type { EngineOptions } from \"./thinEngine\";\r\nimport { ThinEngine } from \"./thinEngine\";\r\nimport { Constants } from \"./constants\";\r\nimport type { IViewportLike, IColor4Like } from \"../Maths/math.like\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { PerformanceMonitor } from \"../Misc/performanceMonitor\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { PerfCounter } from \"../Misc/perfCounter\";\r\nimport { WebGLDataBuffer } from \"../Meshes/WebGL/webGLDataBuffer\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { RenderTargetWrapper } from \"./renderTargetWrapper\";\r\nimport { WebGLHardwareTexture } from \"./WebGL/webGLHardwareTexture\";\r\n\r\nimport \"./Extensions/engine.alpha\";\r\nimport \"./Extensions/engine.readTexture\";\r\nimport \"./Extensions/engine.dynamicBuffer\";\r\nimport type { IAudioEngine } from \"../Audio/Interfaces/IAudioEngine\";\r\n\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { PostProcess } from \"../PostProcesses/postProcess\";\r\n\r\n/**\r\n * Defines the interface used by objects containing a viewport (like a camera)\r\n */\r\ninterface IViewportOwnerLike {\r\n /**\r\n * Gets or sets the viewport\r\n */\r\n viewport: IViewportLike;\r\n}\r\n\r\n/**\r\n * The engine class is responsible for interfacing with all lower-level APIs such as WebGL and Audio\r\n */\r\nexport class Engine extends ThinEngine {\r\n // Const statics\r\n\r\n /** Defines that alpha blending is disabled */\r\n public static readonly ALPHA_DISABLE = Constants.ALPHA_DISABLE;\r\n /** Defines that alpha blending to SRC ALPHA * SRC + DEST */\r\n public static readonly ALPHA_ADD = Constants.ALPHA_ADD;\r\n /** Defines that alpha blending to SRC ALPHA * SRC + (1 - SRC ALPHA) * DEST */\r\n public static readonly ALPHA_COMBINE = Constants.ALPHA_COMBINE;\r\n /** Defines that alpha blending to DEST - SRC * DEST */\r\n public static readonly ALPHA_SUBTRACT = Constants.ALPHA_SUBTRACT;\r\n /** Defines that alpha blending to SRC * DEST */\r\n public static readonly ALPHA_MULTIPLY = Constants.ALPHA_MULTIPLY;\r\n /** Defines that alpha blending to SRC ALPHA * SRC + (1 - SRC) * DEST */\r\n public static readonly ALPHA_MAXIMIZED = Constants.ALPHA_MAXIMIZED;\r\n /** Defines that alpha blending to SRC + DEST */\r\n public static readonly ALPHA_ONEONE = Constants.ALPHA_ONEONE;\r\n /** Defines that alpha blending to SRC + (1 - SRC ALPHA) * DEST */\r\n public static readonly ALPHA_PREMULTIPLIED = Constants.ALPHA_PREMULTIPLIED;\r\n /**\r\n * Defines that alpha blending to SRC + (1 - SRC ALPHA) * DEST\r\n * Alpha will be set to (1 - SRC ALPHA) * DEST ALPHA\r\n */\r\n public static readonly ALPHA_PREMULTIPLIED_PORTERDUFF = Constants.ALPHA_PREMULTIPLIED_PORTERDUFF;\r\n /** Defines that alpha blending to CST * SRC + (1 - CST) * DEST */\r\n public static readonly ALPHA_INTERPOLATE = Constants.ALPHA_INTERPOLATE;\r\n /**\r\n * Defines that alpha blending to SRC + (1 - SRC) * DEST\r\n * Alpha will be set to SRC ALPHA + (1 - SRC ALPHA) * DEST ALPHA\r\n */\r\n public static readonly ALPHA_SCREENMODE = Constants.ALPHA_SCREENMODE;\r\n\r\n /** Defines that the resource is not delayed*/\r\n public static readonly DELAYLOADSTATE_NONE = Constants.DELAYLOADSTATE_NONE;\r\n /** Defines that the resource was successfully delay loaded */\r\n public static readonly DELAYLOADSTATE_LOADED = Constants.DELAYLOADSTATE_LOADED;\r\n /** Defines that the resource is currently delay loading */\r\n public static readonly DELAYLOADSTATE_LOADING = Constants.DELAYLOADSTATE_LOADING;\r\n /** Defines that the resource is delayed and has not started loading */\r\n public static readonly DELAYLOADSTATE_NOTLOADED = Constants.DELAYLOADSTATE_NOTLOADED;\r\n\r\n // Depht or Stencil test Constants.\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will never pass. i.e. Nothing will be drawn */\r\n public static readonly NEVER = Constants.NEVER;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will always pass. i.e. Pixels will be drawn in the order they are drawn */\r\n public static readonly ALWAYS = Constants.ALWAYS;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than the stored value */\r\n public static readonly LESS = Constants.LESS;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is equals to the stored value */\r\n public static readonly EQUAL = Constants.EQUAL;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than or equal to the stored value */\r\n public static readonly LEQUAL = Constants.LEQUAL;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than the stored value */\r\n public static readonly GREATER = Constants.GREATER;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than or equal to the stored value */\r\n public static readonly GEQUAL = Constants.GEQUAL;\r\n /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is not equal to the stored value */\r\n public static readonly NOTEQUAL = Constants.NOTEQUAL;\r\n\r\n // Stencil Actions Constants.\r\n /** Passed to stencilOperation to specify that stencil value must be kept */\r\n public static readonly KEEP = Constants.KEEP;\r\n /** Passed to stencilOperation to specify that stencil value must be replaced */\r\n public static readonly REPLACE = Constants.REPLACE;\r\n /** Passed to stencilOperation to specify that stencil value must be incremented */\r\n public static readonly INCR = Constants.INCR;\r\n /** Passed to stencilOperation to specify that stencil value must be decremented */\r\n public static readonly DECR = Constants.DECR;\r\n /** Passed to stencilOperation to specify that stencil value must be inverted */\r\n public static readonly INVERT = Constants.INVERT;\r\n /** Passed to stencilOperation to specify that stencil value must be incremented with wrapping */\r\n public static readonly INCR_WRAP = Constants.INCR_WRAP;\r\n /** Passed to stencilOperation to specify that stencil value must be decremented with wrapping */\r\n public static readonly DECR_WRAP = Constants.DECR_WRAP;\r\n\r\n /** Texture is not repeating outside of 0..1 UVs */\r\n public static readonly TEXTURE_CLAMP_ADDRESSMODE = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n /** Texture is repeating outside of 0..1 UVs */\r\n public static readonly TEXTURE_WRAP_ADDRESSMODE = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n /** Texture is repeating and mirrored */\r\n public static readonly TEXTURE_MIRROR_ADDRESSMODE = Constants.TEXTURE_MIRROR_ADDRESSMODE;\r\n\r\n /** ALPHA */\r\n public static readonly TEXTUREFORMAT_ALPHA = Constants.TEXTUREFORMAT_ALPHA;\r\n /** LUMINANCE */\r\n public static readonly TEXTUREFORMAT_LUMINANCE = Constants.TEXTUREFORMAT_LUMINANCE;\r\n /** LUMINANCE_ALPHA */\r\n public static readonly TEXTUREFORMAT_LUMINANCE_ALPHA = Constants.TEXTUREFORMAT_LUMINANCE_ALPHA;\r\n /** RGB */\r\n public static readonly TEXTUREFORMAT_RGB = Constants.TEXTUREFORMAT_RGB;\r\n /** RGBA */\r\n public static readonly TEXTUREFORMAT_RGBA = Constants.TEXTUREFORMAT_RGBA;\r\n /** RED */\r\n public static readonly TEXTUREFORMAT_RED = Constants.TEXTUREFORMAT_RED;\r\n /** RED (2nd reference) */\r\n public static readonly TEXTUREFORMAT_R = Constants.TEXTUREFORMAT_R;\r\n /** RG */\r\n public static readonly TEXTUREFORMAT_RG = Constants.TEXTUREFORMAT_RG;\r\n /** RED_INTEGER */\r\n public static readonly TEXTUREFORMAT_RED_INTEGER = Constants.TEXTUREFORMAT_RED_INTEGER;\r\n /** RED_INTEGER (2nd reference) */\r\n public static readonly TEXTUREFORMAT_R_INTEGER = Constants.TEXTUREFORMAT_R_INTEGER;\r\n /** RG_INTEGER */\r\n public static readonly TEXTUREFORMAT_RG_INTEGER = Constants.TEXTUREFORMAT_RG_INTEGER;\r\n /** RGB_INTEGER */\r\n public static readonly TEXTUREFORMAT_RGB_INTEGER = Constants.TEXTUREFORMAT_RGB_INTEGER;\r\n /** RGBA_INTEGER */\r\n public static readonly TEXTUREFORMAT_RGBA_INTEGER = Constants.TEXTUREFORMAT_RGBA_INTEGER;\r\n\r\n /** UNSIGNED_BYTE */\r\n public static readonly TEXTURETYPE_UNSIGNED_BYTE = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n /** UNSIGNED_BYTE (2nd reference) */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n /** FLOAT */\r\n public static readonly TEXTURETYPE_FLOAT = Constants.TEXTURETYPE_FLOAT;\r\n /** HALF_FLOAT */\r\n public static readonly TEXTURETYPE_HALF_FLOAT = Constants.TEXTURETYPE_HALF_FLOAT;\r\n /** BYTE */\r\n public static readonly TEXTURETYPE_BYTE = Constants.TEXTURETYPE_BYTE;\r\n /** SHORT */\r\n public static readonly TEXTURETYPE_SHORT = Constants.TEXTURETYPE_SHORT;\r\n /** UNSIGNED_SHORT */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT = Constants.TEXTURETYPE_UNSIGNED_SHORT;\r\n /** INT */\r\n public static readonly TEXTURETYPE_INT = Constants.TEXTURETYPE_INT;\r\n /** UNSIGNED_INT */\r\n public static readonly TEXTURETYPE_UNSIGNED_INTEGER = Constants.TEXTURETYPE_UNSIGNED_INTEGER;\r\n /** UNSIGNED_SHORT_4_4_4_4 */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4 = Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4;\r\n /** UNSIGNED_SHORT_5_5_5_1 */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1 = Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1;\r\n /** UNSIGNED_SHORT_5_6_5 */\r\n public static readonly TEXTURETYPE_UNSIGNED_SHORT_5_6_5 = Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5;\r\n /** UNSIGNED_INT_2_10_10_10_REV */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV = Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV;\r\n /** UNSIGNED_INT_24_8 */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_24_8 = Constants.TEXTURETYPE_UNSIGNED_INT_24_8;\r\n /** UNSIGNED_INT_10F_11F_11F_REV */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV = Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV;\r\n /** UNSIGNED_INT_5_9_9_9_REV */\r\n public static readonly TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV = Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV;\r\n /** FLOAT_32_UNSIGNED_INT_24_8_REV */\r\n public static readonly TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV = Constants.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV;\r\n\r\n /** nearest is mag = nearest and min = nearest and mip = none */\r\n public static readonly TEXTURE_NEAREST_SAMPLINGMODE = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n /** Bilinear is mag = linear and min = linear and mip = nearest */\r\n public static readonly TEXTURE_BILINEAR_SAMPLINGMODE = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n /** Trilinear is mag = linear and min = linear and mip = linear */\r\n public static readonly TEXTURE_TRILINEAR_SAMPLINGMODE = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n /** nearest is mag = nearest and min = nearest and mip = linear */\r\n public static readonly TEXTURE_NEAREST_NEAREST_MIPLINEAR = Constants.TEXTURE_NEAREST_NEAREST_MIPLINEAR;\r\n /** Bilinear is mag = linear and min = linear and mip = nearest */\r\n public static readonly TEXTURE_LINEAR_LINEAR_MIPNEAREST = Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST;\r\n /** Trilinear is mag = linear and min = linear and mip = linear */\r\n public static readonly TEXTURE_LINEAR_LINEAR_MIPLINEAR = Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR;\r\n /** mag = nearest and min = nearest and mip = nearest */\r\n public static readonly TEXTURE_NEAREST_NEAREST_MIPNEAREST = Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST;\r\n /** mag = nearest and min = linear and mip = nearest */\r\n public static readonly TEXTURE_NEAREST_LINEAR_MIPNEAREST = Constants.TEXTURE_NEAREST_LINEAR_MIPNEAREST;\r\n /** mag = nearest and min = linear and mip = linear */\r\n public static readonly TEXTURE_NEAREST_LINEAR_MIPLINEAR = Constants.TEXTURE_NEAREST_LINEAR_MIPLINEAR;\r\n /** mag = nearest and min = linear and mip = none */\r\n public static readonly TEXTURE_NEAREST_LINEAR = Constants.TEXTURE_NEAREST_LINEAR;\r\n /** mag = nearest and min = nearest and mip = none */\r\n public static readonly TEXTURE_NEAREST_NEAREST = Constants.TEXTURE_NEAREST_NEAREST;\r\n /** mag = linear and min = nearest and mip = nearest */\r\n public static readonly TEXTURE_LINEAR_NEAREST_MIPNEAREST = Constants.TEXTURE_LINEAR_NEAREST_MIPNEAREST;\r\n /** mag = linear and min = nearest and mip = linear */\r\n public static readonly TEXTURE_LINEAR_NEAREST_MIPLINEAR = Constants.TEXTURE_LINEAR_NEAREST_MIPLINEAR;\r\n /** mag = linear and min = linear and mip = none */\r\n public static readonly TEXTURE_LINEAR_LINEAR = Constants.TEXTURE_LINEAR_LINEAR;\r\n /** mag = linear and min = nearest and mip = none */\r\n public static readonly TEXTURE_LINEAR_NEAREST = Constants.TEXTURE_LINEAR_NEAREST;\r\n\r\n /** Explicit coordinates mode */\r\n public static readonly TEXTURE_EXPLICIT_MODE = Constants.TEXTURE_EXPLICIT_MODE;\r\n /** Spherical coordinates mode */\r\n public static readonly TEXTURE_SPHERICAL_MODE = Constants.TEXTURE_SPHERICAL_MODE;\r\n /** Planar coordinates mode */\r\n public static readonly TEXTURE_PLANAR_MODE = Constants.TEXTURE_PLANAR_MODE;\r\n /** Cubic coordinates mode */\r\n public static readonly TEXTURE_CUBIC_MODE = Constants.TEXTURE_CUBIC_MODE;\r\n /** Projection coordinates mode */\r\n public static readonly TEXTURE_PROJECTION_MODE = Constants.TEXTURE_PROJECTION_MODE;\r\n /** Skybox coordinates mode */\r\n public static readonly TEXTURE_SKYBOX_MODE = Constants.TEXTURE_SKYBOX_MODE;\r\n /** Inverse Cubic coordinates mode */\r\n public static readonly TEXTURE_INVCUBIC_MODE = Constants.TEXTURE_INVCUBIC_MODE;\r\n /** Equirectangular coordinates mode */\r\n public static readonly TEXTURE_EQUIRECTANGULAR_MODE = Constants.TEXTURE_EQUIRECTANGULAR_MODE;\r\n /** Equirectangular Fixed coordinates mode */\r\n public static readonly TEXTURE_FIXED_EQUIRECTANGULAR_MODE = Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MODE;\r\n /** Equirectangular Fixed Mirrored coordinates mode */\r\n public static readonly TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE = Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE;\r\n\r\n // Texture rescaling mode\r\n /** Defines that texture rescaling will use a floor to find the closer power of 2 size */\r\n public static readonly SCALEMODE_FLOOR = Constants.SCALEMODE_FLOOR;\r\n /** Defines that texture rescaling will look for the nearest power of 2 size */\r\n public static readonly SCALEMODE_NEAREST = Constants.SCALEMODE_NEAREST;\r\n /** Defines that texture rescaling will use a ceil to find the closer power of 2 size */\r\n public static readonly SCALEMODE_CEILING = Constants.SCALEMODE_CEILING;\r\n\r\n /**\r\n * Returns the current npm package of the sdk\r\n */\r\n // Not mixed with Version for tooling purpose.\r\n public static get NpmPackage(): string {\r\n return ThinEngine.NpmPackage;\r\n }\r\n\r\n /**\r\n * Returns the current version of the framework\r\n */\r\n public static get Version(): string {\r\n return ThinEngine.Version;\r\n }\r\n\r\n /** Gets the list of created engines */\r\n public static get Instances(): Engine[] {\r\n return EngineStore.Instances;\r\n }\r\n\r\n /**\r\n * Gets the latest created engine\r\n */\r\n public static get LastCreatedEngine(): Nullable {\r\n return EngineStore.LastCreatedEngine;\r\n }\r\n\r\n /**\r\n * Gets the latest created scene\r\n */\r\n public static get LastCreatedScene(): Nullable {\r\n return EngineStore.LastCreatedScene;\r\n }\r\n\r\n /** @internal */\r\n /**\r\n * Engine abstraction for loading and creating an image bitmap from a given source string.\r\n * @param imageSource source to load the image from.\r\n * @param options An object that sets options for the image's extraction.\r\n * @returns ImageBitmap.\r\n */\r\n public _createImageBitmapFromSource(imageSource: string, options?: ImageBitmapOptions): Promise {\r\n const promise = new Promise((resolve, reject) => {\r\n const image = new Image();\r\n image.onload = () => {\r\n image.decode().then(() => {\r\n this.createImageBitmap(image, options).then((imageBitmap) => {\r\n resolve(imageBitmap);\r\n });\r\n });\r\n };\r\n image.onerror = () => {\r\n reject(`Error loading image ${image.src}`);\r\n };\r\n\r\n image.src = imageSource;\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * Engine abstraction for createImageBitmap\r\n * @param image source for image\r\n * @param options An object that sets options for the image's extraction.\r\n * @returns ImageBitmap\r\n */\r\n public createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise {\r\n return createImageBitmap(image, options);\r\n }\r\n\r\n /**\r\n * Resize an image and returns the image data as an uint8array\r\n * @param image image to resize\r\n * @param bufferWidth destination buffer width\r\n * @param bufferHeight destination buffer height\r\n * @returns an uint8array containing RGBA values of bufferWidth * bufferHeight size\r\n */\r\n public resizeImageBitmap(image: HTMLImageElement | ImageBitmap, bufferWidth: number, bufferHeight: number): Uint8Array {\r\n const canvas = this.createCanvas(bufferWidth, bufferHeight);\r\n const context = canvas.getContext(\"2d\");\r\n\r\n if (!context) {\r\n throw new Error(\"Unable to get 2d context for resizeImageBitmap\");\r\n }\r\n\r\n context.drawImage(image, 0, 0);\r\n\r\n // Create VertexData from map data\r\n // Cast is due to wrong definition in lib.d.ts from ts 1.3 - https://github.com/Microsoft/TypeScript/issues/949\r\n const buffer = (context.getImageData(0, 0, bufferWidth, bufferHeight).data);\r\n return buffer;\r\n }\r\n\r\n /**\r\n * Will flag all materials in all scenes in all engines as dirty to trigger new shader compilation\r\n * @param flag defines which part of the materials must be marked as dirty\r\n * @param predicate defines a predicate used to filter which materials should be affected\r\n */\r\n public static MarkAllMaterialsAsDirty(flag: number, predicate?: (mat: Material) => boolean): void {\r\n for (let engineIndex = 0; engineIndex < Engine.Instances.length; engineIndex++) {\r\n const engine = Engine.Instances[engineIndex];\r\n\r\n for (let sceneIndex = 0; sceneIndex < engine.scenes.length; sceneIndex++) {\r\n engine.scenes[sceneIndex].markAllMaterialsAsDirty(flag, predicate);\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Method called to create the default loading screen.\r\n * This can be overridden in your own app.\r\n * @param canvas The rendering canvas element\r\n * @returns The loading screen\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static DefaultLoadingScreenFactory(canvas: HTMLCanvasElement): ILoadingScreen {\r\n throw _WarnImport(\"LoadingScreen\");\r\n }\r\n\r\n /**\r\n * Method called to create the default rescale post process on each engine.\r\n */\r\n public static _RescalePostProcessFactory: Nullable<(engine: Engine) => PostProcess> = null;\r\n\r\n // Members\r\n\r\n /**\r\n * Gets or sets a boolean to enable/disable IndexedDB support and avoid XHR on .manifest\r\n **/\r\n public enableOfflineSupport = false;\r\n\r\n /**\r\n * Gets or sets a boolean to enable/disable checking manifest if IndexedDB support is enabled (js will always consider the database is up to date)\r\n **/\r\n public disableManifestCheck = false;\r\n\r\n /**\r\n * Gets or sets a boolean to enable/disable the context menu (right-click) from appearing on the main canvas\r\n */\r\n public disableContextMenu: boolean = true;\r\n\r\n /**\r\n * Gets the list of created scenes\r\n */\r\n public scenes: Scene[] = [];\r\n\r\n /** @internal */\r\n public _virtualScenes = new Array();\r\n\r\n /**\r\n * Event raised when a new scene is created\r\n */\r\n public onNewSceneAddedObservable = new Observable();\r\n\r\n /**\r\n * Gets the list of created postprocesses\r\n */\r\n public postProcesses: PostProcess[] = [];\r\n\r\n /**\r\n * Gets a boolean indicating if the pointer is currently locked\r\n */\r\n public isPointerLock = false;\r\n\r\n // Observables\r\n\r\n /**\r\n * Observable event triggered each time the rendering canvas is resized\r\n */\r\n public onResizeObservable = new Observable();\r\n\r\n /**\r\n * Observable event triggered each time the canvas loses focus\r\n */\r\n public onCanvasBlurObservable = new Observable();\r\n\r\n /**\r\n * Observable event triggered each time the canvas gains focus\r\n */\r\n public onCanvasFocusObservable = new Observable();\r\n\r\n /**\r\n * Observable event triggered each time the canvas receives pointerout event\r\n */\r\n public onCanvasPointerOutObservable = new Observable();\r\n\r\n /**\r\n * Observable raised when the engine begins a new frame\r\n */\r\n public onBeginFrameObservable = new Observable();\r\n\r\n /**\r\n * If set, will be used to request the next animation frame for the render loop\r\n */\r\n public customAnimationFrameRequester: Nullable = null;\r\n\r\n /**\r\n * Observable raised when the engine ends the current frame\r\n */\r\n public onEndFrameObservable = new Observable();\r\n\r\n /**\r\n * Observable raised when the engine is about to compile a shader\r\n */\r\n public onBeforeShaderCompilationObservable = new Observable();\r\n\r\n /**\r\n * Observable raised when the engine has just compiled a shader\r\n */\r\n public onAfterShaderCompilationObservable = new Observable();\r\n\r\n /**\r\n * Gets the audio engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/audio/playingSoundsMusic\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static audioEngine: Nullable;\r\n\r\n /**\r\n * Default AudioEngine factory responsible of creating the Audio Engine.\r\n * By default, this will create a BabylonJS Audio Engine if the workload has been embedded.\r\n */\r\n public static AudioEngineFactory: (\r\n hostElement: Nullable,\r\n audioContext: Nullable,\r\n audioDestination: Nullable\r\n ) => IAudioEngine;\r\n\r\n /**\r\n * Default offline support factory responsible of creating a tool used to store data locally.\r\n * By default, this will create a Database object if the workload has been embedded.\r\n */\r\n public static OfflineProviderFactory: (urlToScene: string, callbackManifestChecked: (checked: boolean) => any, disableManifestCheck: boolean) => IOfflineProvider;\r\n\r\n private _loadingScreen: ILoadingScreen;\r\n private _pointerLockRequested: boolean;\r\n private _rescalePostProcess: Nullable;\r\n\r\n // Deterministic lockstepMaxSteps\r\n protected _deterministicLockstep: boolean = false;\r\n protected _lockstepMaxSteps: number = 4;\r\n protected _timeStep: number = 1 / 60;\r\n\r\n protected get _supportsHardwareTextureRescaling() {\r\n return !!Engine._RescalePostProcessFactory;\r\n }\r\n\r\n // FPS\r\n private _fps = 60;\r\n private _deltaTime = 0;\r\n\r\n /** @internal */\r\n public _drawCalls = new PerfCounter();\r\n\r\n /** Gets or sets the tab index to set to the rendering canvas. 1 is the minimum value to set to be able to capture keyboard events */\r\n public canvasTabIndex = 1;\r\n\r\n /**\r\n * Turn this value on if you want to pause FPS computation when in background\r\n */\r\n public disablePerformanceMonitorInBackground = false;\r\n\r\n private _performanceMonitor = new PerformanceMonitor();\r\n /**\r\n * Gets the performance monitor attached to this engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation\r\n */\r\n public get performanceMonitor(): PerformanceMonitor {\r\n return this._performanceMonitor;\r\n }\r\n\r\n // Focus\r\n private _onFocus: () => void;\r\n private _onBlur: () => void;\r\n private _onCanvasPointerOut: (event: PointerEvent) => void;\r\n private _onCanvasBlur: () => void;\r\n private _onCanvasFocus: () => void;\r\n private _onCanvasContextMenu: (evt: Event) => void;\r\n\r\n private _onFullscreenChange: () => void;\r\n private _onPointerLockChange: () => void;\r\n\r\n protected _compatibilityMode = true;\r\n\r\n /**\r\n * (WebGPU only) True (default) to be in compatibility mode, meaning rendering all existing scenes without artifacts (same rendering than WebGL).\r\n * Setting the property to false will improve performances but may not work in some scenes if some precautions are not taken.\r\n * See https://doc.babylonjs.com/setup/support/webGPU/webGPUOptimization/webGPUNonCompatibilityMode for more details\r\n */\r\n public get compatibilityMode() {\r\n return this._compatibilityMode;\r\n }\r\n\r\n public set compatibilityMode(mode: boolean) {\r\n // not supported in WebGL\r\n this._compatibilityMode = true;\r\n }\r\n\r\n // Events\r\n\r\n /**\r\n * Gets the HTML element used to attach event listeners\r\n * @returns a HTML element\r\n */\r\n public getInputElement(): Nullable {\r\n return this._renderingCanvas;\r\n }\r\n\r\n /**\r\n * Creates a new engine\r\n * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which already used the WebGL context\r\n * @param antialias defines enable antialiasing (default: false)\r\n * @param options defines further options to be sent to the getContext() function\r\n * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n constructor(\r\n canvasOrContext: Nullable,\r\n antialias?: boolean,\r\n options?: EngineOptions,\r\n adaptToDeviceRatio: boolean = false\r\n ) {\r\n super(canvasOrContext, antialias, options, adaptToDeviceRatio);\r\n\r\n Engine.Instances.push(this);\r\n\r\n if (!canvasOrContext) {\r\n return;\r\n }\r\n\r\n this._features.supportRenderPasses = true;\r\n\r\n options = this._creationOptions;\r\n\r\n if ((canvasOrContext).getContext) {\r\n const canvas = canvasOrContext;\r\n\r\n this._sharedInit(canvas);\r\n }\r\n }\r\n\r\n protected _initGLContext(): void {\r\n super._initGLContext();\r\n\r\n this._rescalePostProcess = null;\r\n }\r\n\r\n /**\r\n * Shared initialization across engines types.\r\n * @param canvas The canvas associated with this instance of the engine.\r\n */\r\n protected _sharedInit(canvas: HTMLCanvasElement) {\r\n super._sharedInit(canvas);\r\n\r\n this._onCanvasFocus = () => {\r\n this.onCanvasFocusObservable.notifyObservers(this);\r\n };\r\n\r\n this._onCanvasBlur = () => {\r\n this.onCanvasBlurObservable.notifyObservers(this);\r\n };\r\n\r\n this._onCanvasContextMenu = (evt: Event) => {\r\n if (this.disableContextMenu) {\r\n evt.preventDefault();\r\n }\r\n };\r\n\r\n canvas.addEventListener(\"focus\", this._onCanvasFocus);\r\n canvas.addEventListener(\"blur\", this._onCanvasBlur);\r\n canvas.addEventListener(\"contextmenu\", this._onCanvasContextMenu);\r\n\r\n this._onBlur = () => {\r\n if (this.disablePerformanceMonitorInBackground) {\r\n this._performanceMonitor.disable();\r\n }\r\n this._windowIsBackground = true;\r\n };\r\n\r\n this._onFocus = () => {\r\n if (this.disablePerformanceMonitorInBackground) {\r\n this._performanceMonitor.enable();\r\n }\r\n this._windowIsBackground = false;\r\n };\r\n\r\n this._onCanvasPointerOut = (ev) => {\r\n // Check that the element at the point of the pointer out isn't the canvas and if it isn't, notify observers\r\n // Note: This is a workaround for a bug with Safari\r\n if (document.elementFromPoint(ev.clientX, ev.clientY) !== canvas) {\r\n this.onCanvasPointerOutObservable.notifyObservers(ev);\r\n }\r\n };\r\n\r\n const hostWindow = this.getHostWindow(); // it calls IsWindowObjectExist()\r\n if (hostWindow && typeof hostWindow.addEventListener === \"function\") {\r\n hostWindow.addEventListener(\"blur\", this._onBlur);\r\n hostWindow.addEventListener(\"focus\", this._onFocus);\r\n }\r\n\r\n canvas.addEventListener(\"pointerout\", this._onCanvasPointerOut);\r\n\r\n if (!this._creationOptions.doNotHandleTouchAction) {\r\n this._disableTouchAction();\r\n }\r\n\r\n // Create Audio Engine if needed.\r\n if (!Engine.audioEngine && this._creationOptions.audioEngine && Engine.AudioEngineFactory) {\r\n Engine.audioEngine = Engine.AudioEngineFactory(this.getRenderingCanvas(), this.getAudioContext(), this.getAudioDestination());\r\n }\r\n if (IsDocumentAvailable()) {\r\n // Fullscreen\r\n this._onFullscreenChange = () => {\r\n this.isFullscreen = !!document.fullscreenElement;\r\n\r\n // Pointer lock\r\n if (this.isFullscreen && this._pointerLockRequested && canvas) {\r\n Engine._RequestPointerlock(canvas);\r\n }\r\n };\r\n\r\n document.addEventListener(\"fullscreenchange\", this._onFullscreenChange, false);\r\n document.addEventListener(\"webkitfullscreenchange\", this._onFullscreenChange, false);\r\n\r\n // Pointer lock\r\n this._onPointerLockChange = () => {\r\n this.isPointerLock = document.pointerLockElement === canvas;\r\n };\r\n\r\n document.addEventListener(\"pointerlockchange\", this._onPointerLockChange, false);\r\n document.addEventListener(\"webkitpointerlockchange\", this._onPointerLockChange, false);\r\n }\r\n\r\n this.enableOfflineSupport = Engine.OfflineProviderFactory !== undefined;\r\n\r\n this._deterministicLockstep = !!this._creationOptions.deterministicLockstep;\r\n this._lockstepMaxSteps = this._creationOptions.lockstepMaxSteps || 0;\r\n this._timeStep = this._creationOptions.timeStep || 1 / 60;\r\n }\r\n\r\n /** @internal */\r\n public _verifyPointerLock(): void {\r\n this._onPointerLockChange?.();\r\n }\r\n\r\n /**\r\n * Gets current aspect ratio\r\n * @param viewportOwner defines the camera to use to get the aspect ratio\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the aspect ratio\r\n */\r\n public getAspectRatio(viewportOwner: IViewportOwnerLike, useScreen = false): number {\r\n const viewport = viewportOwner.viewport;\r\n return (this.getRenderWidth(useScreen) * viewport.width) / (this.getRenderHeight(useScreen) * viewport.height);\r\n }\r\n\r\n /**\r\n * Gets current screen aspect ratio\r\n * @returns a number defining the aspect ratio\r\n */\r\n public getScreenAspectRatio(): number {\r\n return this.getRenderWidth(true) / this.getRenderHeight(true);\r\n }\r\n\r\n /**\r\n * Gets the client rect of the HTML canvas attached with the current webGL context\r\n * @returns a client rectangle\r\n */\r\n public getRenderingCanvasClientRect(): Nullable {\r\n if (!this._renderingCanvas) {\r\n return null;\r\n }\r\n return this._renderingCanvas.getBoundingClientRect();\r\n }\r\n\r\n /**\r\n * Gets the client rect of the HTML element used for events\r\n * @returns a client rectangle\r\n */\r\n public getInputElementClientRect(): Nullable {\r\n if (!this._renderingCanvas) {\r\n return null;\r\n }\r\n return this.getInputElement()!.getBoundingClientRect();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the engine is running in deterministic lock step mode\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @returns true if engine is in deterministic lock step mode\r\n */\r\n public isDeterministicLockStep(): boolean {\r\n return this._deterministicLockstep;\r\n }\r\n\r\n /**\r\n * Gets the max steps when engine is running in deterministic lock step\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep\r\n * @returns the max steps\r\n */\r\n public getLockstepMaxSteps(): number {\r\n return this._lockstepMaxSteps;\r\n }\r\n\r\n /**\r\n * Returns the time in ms between steps when using deterministic lock step.\r\n * @returns time step in (ms)\r\n */\r\n public getTimeStep(): number {\r\n return this._timeStep * 1000;\r\n }\r\n\r\n /**\r\n * Force the mipmap generation for the given render target texture\r\n * @param texture defines the render target texture to use\r\n * @param unbind defines whether or not to unbind the texture after generation. Defaults to true.\r\n */\r\n public generateMipMapsForCubemap(texture: InternalTexture, unbind = true) {\r\n if (texture.generateMipMaps) {\r\n const gl = this._gl;\r\n this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, texture, true);\r\n gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\r\n if (unbind) {\r\n this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, null);\r\n }\r\n }\r\n }\r\n\r\n /** States */\r\n\r\n /**\r\n * Gets a boolean indicating if depth writing is enabled\r\n * @returns the current depth writing state\r\n */\r\n public getDepthWrite(): boolean {\r\n return this._depthCullingState.depthMask;\r\n }\r\n\r\n /**\r\n * Enable or disable depth writing\r\n * @param enable defines the state to set\r\n */\r\n public setDepthWrite(enable: boolean): void {\r\n this._depthCullingState.depthMask = enable;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if stencil buffer is enabled\r\n * @returns the current stencil buffer state\r\n */\r\n public getStencilBuffer(): boolean {\r\n return this._stencilState.stencilTest;\r\n }\r\n\r\n /**\r\n * Enable or disable the stencil buffer\r\n * @param enable defines if the stencil buffer must be enabled or disabled\r\n */\r\n public setStencilBuffer(enable: boolean): void {\r\n this._stencilState.stencilTest = enable;\r\n }\r\n\r\n /**\r\n * Gets the current stencil mask\r\n * @returns a number defining the new stencil mask to use\r\n */\r\n public getStencilMask(): number {\r\n return this._stencilState.stencilMask;\r\n }\r\n\r\n /**\r\n * Sets the current stencil mask\r\n * @param mask defines the new stencil mask to use\r\n */\r\n public setStencilMask(mask: number): void {\r\n this._stencilState.stencilMask = mask;\r\n }\r\n\r\n /**\r\n * Gets the current stencil function\r\n * @returns a number defining the stencil function to use\r\n */\r\n public getStencilFunction(): number {\r\n return this._stencilState.stencilFunc;\r\n }\r\n\r\n /**\r\n * Gets the current stencil reference value\r\n * @returns a number defining the stencil reference value to use\r\n */\r\n public getStencilFunctionReference(): number {\r\n return this._stencilState.stencilFuncRef;\r\n }\r\n\r\n /**\r\n * Gets the current stencil mask\r\n * @returns a number defining the stencil mask to use\r\n */\r\n public getStencilFunctionMask(): number {\r\n return this._stencilState.stencilFuncMask;\r\n }\r\n\r\n /**\r\n * Sets the current stencil function\r\n * @param stencilFunc defines the new stencil function to use\r\n */\r\n public setStencilFunction(stencilFunc: number) {\r\n this._stencilState.stencilFunc = stencilFunc;\r\n }\r\n\r\n /**\r\n * Sets the current stencil reference\r\n * @param reference defines the new stencil reference to use\r\n */\r\n public setStencilFunctionReference(reference: number) {\r\n this._stencilState.stencilFuncRef = reference;\r\n }\r\n\r\n /**\r\n * Sets the current stencil mask\r\n * @param mask defines the new stencil mask to use\r\n */\r\n public setStencilFunctionMask(mask: number) {\r\n this._stencilState.stencilFuncMask = mask;\r\n }\r\n\r\n /**\r\n * Gets the current stencil operation when stencil fails\r\n * @returns a number defining stencil operation to use when stencil fails\r\n */\r\n public getStencilOperationFail(): number {\r\n return this._stencilState.stencilOpStencilFail;\r\n }\r\n\r\n /**\r\n * Gets the current stencil operation when depth fails\r\n * @returns a number defining stencil operation to use when depth fails\r\n */\r\n public getStencilOperationDepthFail(): number {\r\n return this._stencilState.stencilOpDepthFail;\r\n }\r\n\r\n /**\r\n * Gets the current stencil operation when stencil passes\r\n * @returns a number defining stencil operation to use when stencil passes\r\n */\r\n public getStencilOperationPass(): number {\r\n return this._stencilState.stencilOpStencilDepthPass;\r\n }\r\n\r\n /**\r\n * Sets the stencil operation to use when stencil fails\r\n * @param operation defines the stencil operation to use when stencil fails\r\n */\r\n public setStencilOperationFail(operation: number): void {\r\n this._stencilState.stencilOpStencilFail = operation;\r\n }\r\n\r\n /**\r\n * Sets the stencil operation to use when depth fails\r\n * @param operation defines the stencil operation to use when depth fails\r\n */\r\n public setStencilOperationDepthFail(operation: number): void {\r\n this._stencilState.stencilOpDepthFail = operation;\r\n }\r\n\r\n /**\r\n * Sets the stencil operation to use when stencil passes\r\n * @param operation defines the stencil operation to use when stencil passes\r\n */\r\n public setStencilOperationPass(operation: number): void {\r\n this._stencilState.stencilOpStencilDepthPass = operation;\r\n }\r\n\r\n /**\r\n * Sets a boolean indicating if the dithering state is enabled or disabled\r\n * @param value defines the dithering state\r\n */\r\n public setDitheringState(value: boolean): void {\r\n if (value) {\r\n this._gl.enable(this._gl.DITHER);\r\n } else {\r\n this._gl.disable(this._gl.DITHER);\r\n }\r\n }\r\n\r\n /**\r\n * Sets a boolean indicating if the rasterizer state is enabled or disabled\r\n * @param value defines the rasterizer state\r\n */\r\n public setRasterizerState(value: boolean): void {\r\n if (value) {\r\n this._gl.disable(this._gl.RASTERIZER_DISCARD);\r\n } else {\r\n this._gl.enable(this._gl.RASTERIZER_DISCARD);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current depth function\r\n * @returns a number defining the depth function\r\n */\r\n public getDepthFunction(): Nullable {\r\n return this._depthCullingState.depthFunc;\r\n }\r\n\r\n /**\r\n * Sets the current depth function\r\n * @param depthFunc defines the function to use\r\n */\r\n public setDepthFunction(depthFunc: number) {\r\n this._depthCullingState.depthFunc = depthFunc;\r\n }\r\n\r\n /**\r\n * Sets the current depth function to GREATER\r\n */\r\n public setDepthFunctionToGreater(): void {\r\n this.setDepthFunction(Constants.GREATER);\r\n }\r\n\r\n /**\r\n * Sets the current depth function to GEQUAL\r\n */\r\n public setDepthFunctionToGreaterOrEqual(): void {\r\n this.setDepthFunction(Constants.GEQUAL);\r\n }\r\n\r\n /**\r\n * Sets the current depth function to LESS\r\n */\r\n public setDepthFunctionToLess(): void {\r\n this.setDepthFunction(Constants.LESS);\r\n }\r\n\r\n /**\r\n * Sets the current depth function to LEQUAL\r\n */\r\n public setDepthFunctionToLessOrEqual(): void {\r\n this.setDepthFunction(Constants.LEQUAL);\r\n }\r\n\r\n private _cachedStencilBuffer: boolean;\r\n private _cachedStencilFunction: number;\r\n private _cachedStencilMask: number;\r\n private _cachedStencilOperationPass: number;\r\n private _cachedStencilOperationFail: number;\r\n private _cachedStencilOperationDepthFail: number;\r\n private _cachedStencilReference: number;\r\n\r\n /**\r\n * Caches the state of the stencil buffer\r\n */\r\n public cacheStencilState() {\r\n this._cachedStencilBuffer = this.getStencilBuffer();\r\n this._cachedStencilFunction = this.getStencilFunction();\r\n this._cachedStencilMask = this.getStencilMask();\r\n this._cachedStencilOperationPass = this.getStencilOperationPass();\r\n this._cachedStencilOperationFail = this.getStencilOperationFail();\r\n this._cachedStencilOperationDepthFail = this.getStencilOperationDepthFail();\r\n this._cachedStencilReference = this.getStencilFunctionReference();\r\n }\r\n\r\n /**\r\n * Restores the state of the stencil buffer\r\n */\r\n public restoreStencilState() {\r\n this.setStencilFunction(this._cachedStencilFunction);\r\n this.setStencilMask(this._cachedStencilMask);\r\n this.setStencilBuffer(this._cachedStencilBuffer);\r\n this.setStencilOperationPass(this._cachedStencilOperationPass);\r\n this.setStencilOperationFail(this._cachedStencilOperationFail);\r\n this.setStencilOperationDepthFail(this._cachedStencilOperationDepthFail);\r\n this.setStencilFunctionReference(this._cachedStencilReference);\r\n }\r\n\r\n /**\r\n * Directly set the WebGL Viewport\r\n * @param x defines the x coordinate of the viewport (in screen space)\r\n * @param y defines the y coordinate of the viewport (in screen space)\r\n * @param width defines the width of the viewport (in screen space)\r\n * @param height defines the height of the viewport (in screen space)\r\n * @returns the current viewport Object (if any) that is being replaced by this call. You can restore this viewport later on to go back to the original state\r\n */\r\n public setDirectViewport(x: number, y: number, width: number, height: number): Nullable {\r\n const currentViewport = this._cachedViewport;\r\n this._cachedViewport = null;\r\n\r\n this._viewport(x, y, width, height);\r\n\r\n return currentViewport;\r\n }\r\n\r\n /**\r\n * Executes a scissor clear (ie. a clear on a specific portion of the screen)\r\n * @param x defines the x-coordinate of the bottom left corner of the clear rectangle\r\n * @param y defines the y-coordinate of the corner of the clear rectangle\r\n * @param width defines the width of the clear rectangle\r\n * @param height defines the height of the clear rectangle\r\n * @param clearColor defines the clear color\r\n */\r\n public scissorClear(x: number, y: number, width: number, height: number, clearColor: IColor4Like): void {\r\n this.enableScissor(x, y, width, height);\r\n this.clear(clearColor, true, true, true);\r\n this.disableScissor();\r\n }\r\n\r\n /**\r\n * Enable scissor test on a specific rectangle (ie. render will only be executed on a specific portion of the screen)\r\n * @param x defines the x-coordinate of the bottom left corner of the clear rectangle\r\n * @param y defines the y-coordinate of the corner of the clear rectangle\r\n * @param width defines the width of the clear rectangle\r\n * @param height defines the height of the clear rectangle\r\n */\r\n public enableScissor(x: number, y: number, width: number, height: number): void {\r\n const gl = this._gl;\r\n\r\n // Change state\r\n gl.enable(gl.SCISSOR_TEST);\r\n gl.scissor(x, y, width, height);\r\n }\r\n\r\n /**\r\n * Disable previously set scissor test rectangle\r\n */\r\n public disableScissor() {\r\n const gl = this._gl;\r\n\r\n gl.disable(gl.SCISSOR_TEST);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _reportDrawCall(numDrawCalls = 1) {\r\n this._drawCalls.addCount(numDrawCalls, false);\r\n }\r\n\r\n public _loadFileAsync(url: string, offlineProvider?: IOfflineProvider, useArrayBuffer?: false): Promise;\r\n public _loadFileAsync(url: string, offlineProvider?: IOfflineProvider, useArrayBuffer?: true): Promise;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFileAsync(url: string, offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean): Promise {\r\n return new Promise((resolve, reject) => {\r\n this._loadFile(\r\n url,\r\n (data) => {\r\n resolve(data);\r\n },\r\n undefined,\r\n offlineProvider,\r\n useArrayBuffer,\r\n (request, exception) => {\r\n reject(exception);\r\n }\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Gets the source code of the vertex shader associated with a specific webGL program\r\n * @param program defines the program to use\r\n * @returns a string containing the source code of the vertex shader associated with the program\r\n */\r\n public getVertexShaderSource(program: WebGLProgram): Nullable {\r\n const shaders = this._gl.getAttachedShaders(program);\r\n\r\n if (!shaders) {\r\n return null;\r\n }\r\n\r\n return this._gl.getShaderSource(shaders[0]);\r\n }\r\n\r\n /**\r\n * Gets the source code of the fragment shader associated with a specific webGL program\r\n * @param program defines the program to use\r\n * @returns a string containing the source code of the fragment shader associated with the program\r\n */\r\n public getFragmentShaderSource(program: WebGLProgram): Nullable {\r\n const shaders = this._gl.getAttachedShaders(program);\r\n\r\n if (!shaders) {\r\n return null;\r\n }\r\n\r\n return this._gl.getShaderSource(shaders[1]);\r\n }\r\n\r\n /**\r\n * Sets a depth stencil texture from a render target to the according uniform.\r\n * @param channel The texture channel\r\n * @param uniform The uniform to set\r\n * @param texture The render target texture containing the depth stencil texture to apply\r\n * @param name The texture name\r\n */\r\n public setDepthStencilTexture(channel: number, uniform: Nullable, texture: Nullable, name?: string): void {\r\n if (channel === undefined) {\r\n return;\r\n }\r\n\r\n if (uniform) {\r\n this._boundUniforms[channel] = uniform;\r\n }\r\n\r\n if (!texture || !texture.depthStencilTexture) {\r\n this._setTexture(channel, null, undefined, undefined, name);\r\n } else {\r\n this._setTexture(channel, texture, false, true, name);\r\n }\r\n }\r\n\r\n /**\r\n * Sets a texture to the webGL context from a postprocess\r\n * @param channel defines the channel to use\r\n * @param postProcess defines the source postprocess\r\n * @param name name of the channel\r\n */\r\n public setTextureFromPostProcess(channel: number, postProcess: Nullable, name: string): void {\r\n let postProcessInput = null;\r\n if (postProcess) {\r\n if (postProcess._forcedOutputTexture) {\r\n postProcessInput = postProcess._forcedOutputTexture;\r\n } else if (postProcess._textures.data[postProcess._currentRenderTextureInd]) {\r\n postProcessInput = postProcess._textures.data[postProcess._currentRenderTextureInd];\r\n }\r\n }\r\n\r\n this._bindTexture(channel, postProcessInput?.texture ?? null, name);\r\n }\r\n\r\n /**\r\n * Binds the output of the passed in post process to the texture channel specified\r\n * @param channel The channel the texture should be bound to\r\n * @param postProcess The post process which's output should be bound\r\n * @param name name of the channel\r\n */\r\n public setTextureFromPostProcessOutput(channel: number, postProcess: Nullable, name: string): void {\r\n this._bindTexture(channel, postProcess?._outputTexture?.texture ?? null, name);\r\n }\r\n\r\n /**\r\n * sets the object from which width and height will be taken from when getting render width and height\r\n * Will fallback to the gl object\r\n * @param dimensions the framebuffer width and height that will be used.\r\n */\r\n public set framebufferDimensionsObject(dimensions: Nullable<{ framebufferWidth: number; framebufferHeight: number }>) {\r\n this._framebufferDimensionsObject = dimensions;\r\n if (this._framebufferDimensionsObject) {\r\n this.onResizeObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n protected _rebuildBuffers(): void {\r\n // Index / Vertex\r\n for (const scene of this.scenes) {\r\n scene.resetCachedMaterial();\r\n scene._rebuildGeometries();\r\n }\r\n\r\n for (const scene of this._virtualScenes) {\r\n scene.resetCachedMaterial();\r\n scene._rebuildGeometries();\r\n }\r\n\r\n super._rebuildBuffers();\r\n }\r\n\r\n protected _rebuildTextures(): void {\r\n for (const scene of this.scenes) {\r\n scene._rebuildTextures();\r\n }\r\n\r\n for (const scene of this._virtualScenes) {\r\n scene._rebuildTextures();\r\n }\r\n\r\n super._rebuildTextures();\r\n }\r\n\r\n /** @internal */\r\n public _renderFrame() {\r\n for (let index = 0; index < this._activeRenderLoops.length; index++) {\r\n const renderFunction = this._activeRenderLoops[index];\r\n\r\n renderFunction();\r\n }\r\n }\r\n\r\n protected _cancelFrame() {\r\n if (this.customAnimationFrameRequester) {\r\n if (this._frameHandler !== 0) {\r\n this._frameHandler = 0;\r\n const { cancelAnimationFrame } = this.customAnimationFrameRequester;\r\n if (cancelAnimationFrame) {\r\n cancelAnimationFrame(this.customAnimationFrameRequester.requestID);\r\n }\r\n }\r\n } else {\r\n super._cancelFrame();\r\n }\r\n }\r\n\r\n public _renderLoop(): void {\r\n this._frameHandler = 0;\r\n\r\n if (!this._contextWasLost) {\r\n let shouldRender = true;\r\n if (this.isDisposed || (!this.renderEvenInBackground && this._windowIsBackground)) {\r\n shouldRender = false;\r\n }\r\n\r\n if (shouldRender) {\r\n // Start new frame\r\n this.beginFrame();\r\n\r\n // Child canvases\r\n if (!this._renderViews()) {\r\n // Main frame\r\n this._renderFrame();\r\n }\r\n\r\n // Present\r\n this.endFrame();\r\n }\r\n }\r\n\r\n if (this._frameHandler === 0) {\r\n // Register new frame\r\n if (this.customAnimationFrameRequester) {\r\n this.customAnimationFrameRequester.requestID = this._queueNewFrame(\r\n this.customAnimationFrameRequester.renderFunction || this._boundRenderFunction,\r\n this.customAnimationFrameRequester\r\n );\r\n this._frameHandler = this.customAnimationFrameRequester.requestID;\r\n } else {\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _renderViews() {\r\n return false;\r\n }\r\n\r\n /**\r\n * Toggle full screen mode\r\n * @param requestPointerLock defines if a pointer lock should be requested from the user\r\n */\r\n public switchFullscreen(requestPointerLock: boolean): void {\r\n if (this.isFullscreen) {\r\n this.exitFullscreen();\r\n } else {\r\n this.enterFullscreen(requestPointerLock);\r\n }\r\n }\r\n\r\n /**\r\n * Enters full screen mode\r\n * @param requestPointerLock defines if a pointer lock should be requested from the user\r\n */\r\n public enterFullscreen(requestPointerLock: boolean): void {\r\n if (!this.isFullscreen) {\r\n this._pointerLockRequested = requestPointerLock;\r\n if (this._renderingCanvas) {\r\n Engine._RequestFullscreen(this._renderingCanvas);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Exits full screen mode\r\n */\r\n public exitFullscreen(): void {\r\n if (this.isFullscreen) {\r\n Engine._ExitFullscreen();\r\n }\r\n }\r\n\r\n /**\r\n * Enters Pointerlock mode\r\n */\r\n public enterPointerlock(): void {\r\n if (this._renderingCanvas) {\r\n Engine._RequestPointerlock(this._renderingCanvas);\r\n }\r\n }\r\n\r\n /**\r\n * Exits Pointerlock mode\r\n */\r\n public exitPointerlock(): void {\r\n Engine._ExitPointerlock();\r\n }\r\n\r\n /**\r\n * Begin a new frame\r\n */\r\n public beginFrame(): void {\r\n this._measureFps();\r\n\r\n this.onBeginFrameObservable.notifyObservers(this);\r\n super.beginFrame();\r\n }\r\n\r\n /**\r\n * End the current frame\r\n */\r\n public endFrame(): void {\r\n super.endFrame();\r\n\r\n this.onEndFrameObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Force a specific size of the canvas\r\n * @param width defines the new canvas' width\r\n * @param height defines the new canvas' height\r\n * @param forceSetSize true to force setting the sizes of the underlying canvas\r\n * @returns true if the size was changed\r\n */\r\n public setSize(width: number, height: number, forceSetSize = false): boolean {\r\n if (!this._renderingCanvas) {\r\n return false;\r\n }\r\n\r\n if (!super.setSize(width, height, forceSetSize)) {\r\n return false;\r\n }\r\n\r\n if (this.scenes) {\r\n for (let index = 0; index < this.scenes.length; index++) {\r\n const scene = this.scenes[index];\r\n\r\n for (let camIndex = 0; camIndex < scene.cameras.length; camIndex++) {\r\n const cam = scene.cameras[camIndex];\r\n\r\n cam._currentRenderId = 0;\r\n }\r\n }\r\n\r\n if (this.onResizeObservable.hasObservers()) {\r\n this.onResizeObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public _deletePipelineContext(pipelineContext: IPipelineContext): void {\r\n const webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n if (webGLPipelineContext && webGLPipelineContext.program) {\r\n if (webGLPipelineContext.transformFeedback) {\r\n this.deleteTransformFeedback(webGLPipelineContext.transformFeedback);\r\n webGLPipelineContext.transformFeedback = null;\r\n }\r\n }\r\n super._deletePipelineContext(pipelineContext);\r\n }\r\n\r\n public createShaderProgram(\r\n pipelineContext: IPipelineContext,\r\n vertexCode: string,\r\n fragmentCode: string,\r\n defines: Nullable,\r\n context?: WebGLRenderingContext,\r\n transformFeedbackVaryings: Nullable = null\r\n ): WebGLProgram {\r\n context = context || this._gl;\r\n\r\n this.onBeforeShaderCompilationObservable.notifyObservers(this);\r\n\r\n const program = super.createShaderProgram(pipelineContext, vertexCode, fragmentCode, defines, context, transformFeedbackVaryings);\r\n this.onAfterShaderCompilationObservable.notifyObservers(this);\r\n\r\n return program;\r\n }\r\n\r\n protected _createShaderProgram(\r\n pipelineContext: WebGLPipelineContext,\r\n vertexShader: WebGLShader,\r\n fragmentShader: WebGLShader,\r\n context: WebGLRenderingContext,\r\n transformFeedbackVaryings: Nullable = null\r\n ): WebGLProgram {\r\n const shaderProgram = context.createProgram();\r\n pipelineContext.program = shaderProgram;\r\n\r\n if (!shaderProgram) {\r\n throw new Error(\"Unable to create program\");\r\n }\r\n\r\n context.attachShader(shaderProgram, vertexShader);\r\n context.attachShader(shaderProgram, fragmentShader);\r\n\r\n if (this.webGLVersion > 1 && transformFeedbackVaryings) {\r\n const transformFeedback = this.createTransformFeedback();\r\n\r\n this.bindTransformFeedback(transformFeedback);\r\n this.setTranformFeedbackVaryings(shaderProgram, transformFeedbackVaryings);\r\n pipelineContext.transformFeedback = transformFeedback;\r\n }\r\n\r\n context.linkProgram(shaderProgram);\r\n\r\n if (this.webGLVersion > 1 && transformFeedbackVaryings) {\r\n this.bindTransformFeedback(null);\r\n }\r\n\r\n pipelineContext.context = context;\r\n pipelineContext.vertexShader = vertexShader;\r\n pipelineContext.fragmentShader = fragmentShader;\r\n\r\n if (!pipelineContext.isParallelCompiled) {\r\n this._finalizePipelineContext(pipelineContext);\r\n }\r\n\r\n return shaderProgram;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseTexture(texture: InternalTexture): void {\r\n super._releaseTexture(texture);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseRenderTargetWrapper(rtWrapper: RenderTargetWrapper): void {\r\n super._releaseRenderTargetWrapper(rtWrapper);\r\n\r\n // Set output texture of post process to null if the framebuffer has been released/disposed\r\n this.scenes.forEach((scene) => {\r\n scene.postProcesses.forEach((postProcess) => {\r\n if (postProcess._outputTexture === rtWrapper) {\r\n postProcess._outputTexture = null;\r\n }\r\n });\r\n scene.cameras.forEach((camera) => {\r\n camera._postProcesses.forEach((postProcess) => {\r\n if (postProcess) {\r\n if (postProcess._outputTexture === rtWrapper) {\r\n postProcess._outputTexture = null;\r\n }\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected static _RenderPassIdCounter = 0;\r\n /**\r\n * Gets or sets the current render pass id\r\n */\r\n public currentRenderPassId = Constants.RENDERPASS_MAIN;\r\n\r\n private _renderPassNames: string[] = [\"main\"];\r\n /**\r\n * Gets the names of the render passes that are currently created\r\n * @returns list of the render pass names\r\n */\r\n public getRenderPassNames(): string[] {\r\n return this._renderPassNames;\r\n }\r\n\r\n /**\r\n * Gets the name of the current render pass\r\n * @returns name of the current render pass\r\n */\r\n public getCurrentRenderPassName(): string {\r\n return this._renderPassNames[this.currentRenderPassId];\r\n }\r\n\r\n /**\r\n * Creates a render pass id\r\n * @param name Name of the render pass (for debug purpose only)\r\n * @returns the id of the new render pass\r\n */\r\n public createRenderPassId(name?: string) {\r\n // Note: render pass id == 0 is always for the main render pass\r\n const id = ++Engine._RenderPassIdCounter;\r\n this._renderPassNames[id] = name ?? \"NONAME\";\r\n return id;\r\n }\r\n\r\n /**\r\n * Releases a render pass id\r\n * @param id id of the render pass to release\r\n */\r\n public releaseRenderPassId(id: number): void {\r\n this._renderPassNames[id] = undefined as any;\r\n\r\n for (let s = 0; s < this.scenes.length; ++s) {\r\n const scene = this.scenes[s];\r\n for (let m = 0; m < scene.meshes.length; ++m) {\r\n const mesh = scene.meshes[m];\r\n if (mesh.subMeshes) {\r\n for (let b = 0; b < mesh.subMeshes.length; ++b) {\r\n const subMesh = mesh.subMeshes[b];\r\n subMesh._removeDrawWrapper(id);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Rescales a texture\r\n * @param source input texture\r\n * @param destination destination texture\r\n * @param scene scene to use to render the resize\r\n * @param internalFormat format to use when resizing\r\n * @param onComplete callback to be called when resize has completed\r\n */\r\n public _rescaleTexture(source: InternalTexture, destination: InternalTexture, scene: Nullable, internalFormat: number, onComplete: () => void): void {\r\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.LINEAR);\r\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.LINEAR);\r\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE);\r\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);\r\n\r\n const rtt = this.createRenderTargetTexture(\r\n {\r\n width: destination.width,\r\n height: destination.height,\r\n },\r\n {\r\n generateMipMaps: false,\r\n type: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n }\r\n );\r\n\r\n if (!this._rescalePostProcess && Engine._RescalePostProcessFactory) {\r\n this._rescalePostProcess = Engine._RescalePostProcessFactory(this);\r\n }\r\n\r\n if (this._rescalePostProcess) {\r\n this._rescalePostProcess.externalTextureSamplerBinding = true;\r\n this._rescalePostProcess.getEffect().executeWhenCompiled(() => {\r\n this._rescalePostProcess!.onApply = function (effect) {\r\n effect._bindTexture(\"textureSampler\", source);\r\n };\r\n\r\n let hostingScene: Scene = scene;\r\n\r\n if (!hostingScene) {\r\n hostingScene = this.scenes[this.scenes.length - 1];\r\n }\r\n hostingScene.postProcessManager.directRender([this._rescalePostProcess!], rtt, true);\r\n\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, destination, true);\r\n this._gl.copyTexImage2D(this._gl.TEXTURE_2D, 0, internalFormat, 0, 0, destination.width, destination.height, 0);\r\n\r\n this.unBindFramebuffer(rtt);\r\n rtt.dispose();\r\n\r\n if (onComplete) {\r\n onComplete();\r\n }\r\n });\r\n }\r\n }\r\n\r\n // FPS\r\n\r\n /**\r\n * Gets the current framerate\r\n * @returns a number representing the framerate\r\n */\r\n public getFps(): number {\r\n return this._fps;\r\n }\r\n\r\n /**\r\n * Gets the time spent between current and previous frame\r\n * @returns a number representing the delta time in ms\r\n */\r\n public getDeltaTime(): number {\r\n return this._deltaTime;\r\n }\r\n\r\n private _measureFps(): void {\r\n this._performanceMonitor.sampleFrame();\r\n this._fps = this._performanceMonitor.averageFPS;\r\n this._deltaTime = this._performanceMonitor.instantaneousFrameTime || 0;\r\n }\r\n\r\n /**\r\n * Wraps an external web gl texture in a Babylon texture.\r\n * @param texture defines the external texture\r\n * @param hasMipMaps defines whether the external texture has mip maps (default: false)\r\n * @param samplingMode defines the sampling mode for the external texture (default: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE)\r\n * @param width defines the width for the external texture (default: 0)\r\n * @param height defines the height for the external texture (default: 0)\r\n * @returns the babylon internal texture\r\n */\r\n public wrapWebGLTexture(\r\n texture: WebGLTexture,\r\n hasMipMaps: boolean = false,\r\n samplingMode: number = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n width: number = 0,\r\n height: number = 0\r\n ): InternalTexture {\r\n const hardwareTexture = new WebGLHardwareTexture(texture, this._gl);\r\n const internalTexture = new InternalTexture(this, InternalTextureSource.Unknown, true);\r\n internalTexture._hardwareTexture = hardwareTexture;\r\n internalTexture.baseWidth = width;\r\n internalTexture.baseHeight = height;\r\n internalTexture.width = width;\r\n internalTexture.height = height;\r\n internalTexture.isReady = true;\r\n internalTexture.useMipMaps = hasMipMaps;\r\n this.updateTextureSamplingMode(samplingMode, internalTexture);\r\n return internalTexture;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _uploadImageToTexture(texture: InternalTexture, image: HTMLImageElement | ImageBitmap, faceIndex: number = 0, lod: number = 0) {\r\n const gl = this._gl;\r\n\r\n const textureType = this._getWebGLTextureType(texture.type);\r\n const format = this._getInternalFormat(texture.format);\r\n const internalFormat = this._getRGBABufferInternalSizedFormat(texture.type, format);\r\n\r\n const bindTarget = texture.isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D;\r\n\r\n this._bindTextureDirectly(bindTarget, texture, true);\r\n this._unpackFlipY(texture.invertY);\r\n\r\n let target: GLenum = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n }\r\n\r\n gl.texImage2D(target, lod, internalFormat, format, textureType, image);\r\n this._bindTextureDirectly(bindTarget, null, true);\r\n }\r\n\r\n /**\r\n * Updates a depth texture Comparison Mode and Function.\r\n * If the comparison Function is equal to 0, the mode will be set to none.\r\n * Otherwise, this only works in webgl 2 and requires a shadow sampler in the shader.\r\n * @param texture The texture to set the comparison function for\r\n * @param comparisonFunction The comparison function to set, 0 if no comparison required\r\n */\r\n public updateTextureComparisonFunction(texture: InternalTexture, comparisonFunction: number): void {\r\n if (this.webGLVersion === 1) {\r\n Logger.Error(\"WebGL 1 does not support texture comparison.\");\r\n return;\r\n }\r\n\r\n const gl = this._gl;\r\n\r\n if (texture.isCube) {\r\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, texture, true);\r\n\r\n if (comparisonFunction === 0) {\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_FUNC, Constants.LEQUAL);\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_MODE, gl.NONE);\r\n } else {\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_FUNC, comparisonFunction);\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE);\r\n }\r\n\r\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null);\r\n } else {\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, texture, true);\r\n\r\n if (comparisonFunction === 0) {\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_FUNC, Constants.LEQUAL);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_MODE, gl.NONE);\r\n } else {\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_FUNC, comparisonFunction);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE);\r\n }\r\n\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, null);\r\n }\r\n\r\n texture._comparisonFunction = comparisonFunction;\r\n }\r\n\r\n /**\r\n * Creates a webGL buffer to use with instantiation\r\n * @param capacity defines the size of the buffer\r\n * @returns the webGL buffer\r\n */\r\n public createInstancesBuffer(capacity: number): DataBuffer {\r\n const buffer = this._gl.createBuffer();\r\n\r\n if (!buffer) {\r\n throw new Error(\"Unable to create instance buffer\");\r\n }\r\n\r\n const result = new WebGLDataBuffer(buffer);\r\n result.capacity = capacity;\r\n\r\n this.bindArrayBuffer(result);\r\n this._gl.bufferData(this._gl.ARRAY_BUFFER, capacity, this._gl.DYNAMIC_DRAW);\r\n\r\n result.references = 1;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Delete a webGL buffer used with instantiation\r\n * @param buffer defines the webGL buffer to delete\r\n */\r\n public deleteInstancesBuffer(buffer: WebGLBuffer): void {\r\n this._gl.deleteBuffer(buffer);\r\n }\r\n\r\n private _clientWaitAsync(sync: WebGLSync, flags = 0, intervalms = 10): Promise {\r\n const gl = (this._gl as any);\r\n return new Promise((resolve, reject) => {\r\n const check = () => {\r\n const res = gl.clientWaitSync(sync, flags, 0);\r\n if (res == gl.WAIT_FAILED) {\r\n reject();\r\n return;\r\n }\r\n if (res == gl.TIMEOUT_EXPIRED) {\r\n setTimeout(check, intervalms);\r\n return;\r\n }\r\n resolve();\r\n };\r\n\r\n check();\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _readPixelsAsync(x: number, y: number, w: number, h: number, format: number, type: number, outputBuffer: ArrayBufferView) {\r\n if (this._webGLVersion < 2) {\r\n throw new Error(\"_readPixelsAsync only work on WebGL2+\");\r\n }\r\n\r\n const gl = (this._gl as any);\r\n const buf = gl.createBuffer();\r\n gl.bindBuffer(gl.PIXEL_PACK_BUFFER, buf);\r\n gl.bufferData(gl.PIXEL_PACK_BUFFER, outputBuffer.byteLength, gl.STREAM_READ);\r\n gl.readPixels(x, y, w, h, format, type, 0);\r\n gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);\r\n\r\n const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);\r\n if (!sync) {\r\n return null;\r\n }\r\n\r\n gl.flush();\r\n\r\n return this._clientWaitAsync(sync, 0, 10).then(() => {\r\n gl.deleteSync(sync);\r\n\r\n gl.bindBuffer(gl.PIXEL_PACK_BUFFER, buf);\r\n gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, outputBuffer);\r\n gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);\r\n gl.deleteBuffer(buf);\r\n\r\n return outputBuffer;\r\n });\r\n }\r\n\r\n public dispose(): void {\r\n this.hideLoadingUI();\r\n\r\n this.onNewSceneAddedObservable.clear();\r\n\r\n // Release postProcesses\r\n while (this.postProcesses.length) {\r\n this.postProcesses[0].dispose();\r\n }\r\n\r\n // Rescale PP\r\n if (this._rescalePostProcess) {\r\n this._rescalePostProcess.dispose();\r\n }\r\n\r\n // Release scenes\r\n while (this.scenes.length) {\r\n this.scenes[0].dispose();\r\n }\r\n\r\n while (this._virtualScenes.length) {\r\n this._virtualScenes[0].dispose();\r\n }\r\n\r\n // Release audio engine\r\n if (EngineStore.Instances.length === 1 && Engine.audioEngine) {\r\n Engine.audioEngine.dispose();\r\n Engine.audioEngine = null;\r\n }\r\n\r\n // Events\r\n const hostWindow = this.getHostWindow(); // it calls IsWindowObjectExist()\r\n if (hostWindow && typeof hostWindow.removeEventListener === \"function\") {\r\n hostWindow.removeEventListener(\"blur\", this._onBlur);\r\n hostWindow.removeEventListener(\"focus\", this._onFocus);\r\n }\r\n\r\n if (this._renderingCanvas) {\r\n this._renderingCanvas.removeEventListener(\"focus\", this._onCanvasFocus);\r\n this._renderingCanvas.removeEventListener(\"blur\", this._onCanvasBlur);\r\n this._renderingCanvas.removeEventListener(\"pointerout\", this._onCanvasPointerOut);\r\n this._renderingCanvas.removeEventListener(\"contextmenu\", this._onCanvasContextMenu);\r\n }\r\n\r\n if (IsDocumentAvailable()) {\r\n document.removeEventListener(\"fullscreenchange\", this._onFullscreenChange);\r\n document.removeEventListener(\"mozfullscreenchange\", this._onFullscreenChange);\r\n document.removeEventListener(\"webkitfullscreenchange\", this._onFullscreenChange);\r\n document.removeEventListener(\"msfullscreenchange\", this._onFullscreenChange);\r\n document.removeEventListener(\"pointerlockchange\", this._onPointerLockChange);\r\n document.removeEventListener(\"mspointerlockchange\", this._onPointerLockChange);\r\n document.removeEventListener(\"mozpointerlockchange\", this._onPointerLockChange);\r\n document.removeEventListener(\"webkitpointerlockchange\", this._onPointerLockChange);\r\n }\r\n\r\n super.dispose();\r\n\r\n // Remove from Instances\r\n const index = EngineStore.Instances.indexOf(this);\r\n\r\n if (index >= 0) {\r\n EngineStore.Instances.splice(index, 1);\r\n }\r\n\r\n // no more engines left in the engine store? Notify!\r\n if (!Engine.Instances.length) {\r\n EngineStore.OnEnginesDisposedObservable.notifyObservers(this);\r\n }\r\n\r\n // Observables\r\n this.onResizeObservable.clear();\r\n this.onCanvasBlurObservable.clear();\r\n this.onCanvasFocusObservable.clear();\r\n this.onCanvasPointerOutObservable.clear();\r\n this.onBeginFrameObservable.clear();\r\n this.onEndFrameObservable.clear();\r\n }\r\n\r\n private _disableTouchAction(): void {\r\n if (!this._renderingCanvas || !this._renderingCanvas.setAttribute) {\r\n return;\r\n }\r\n\r\n this._renderingCanvas.setAttribute(\"touch-action\", \"none\");\r\n this._renderingCanvas.style.touchAction = \"none\";\r\n (this._renderingCanvas.style as any).webkitTapHighlightColor = \"transparent\";\r\n }\r\n\r\n // Loading screen\r\n\r\n /**\r\n * Display the loading screen\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\r\n */\r\n public displayLoadingUI(): void {\r\n if (!IsWindowObjectExist()) {\r\n return;\r\n }\r\n const loadingScreen = this.loadingScreen;\r\n if (loadingScreen) {\r\n loadingScreen.displayLoadingUI();\r\n }\r\n }\r\n\r\n /**\r\n * Hide the loading screen\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\r\n */\r\n public hideLoadingUI(): void {\r\n if (!IsWindowObjectExist()) {\r\n return;\r\n }\r\n const loadingScreen = this._loadingScreen;\r\n if (loadingScreen) {\r\n loadingScreen.hideLoadingUI();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current loading screen object\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\r\n */\r\n public get loadingScreen(): ILoadingScreen {\r\n if (!this._loadingScreen && this._renderingCanvas) {\r\n this._loadingScreen = Engine.DefaultLoadingScreenFactory(this._renderingCanvas);\r\n }\r\n return this._loadingScreen;\r\n }\r\n\r\n /**\r\n * Sets the current loading screen object\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\r\n */\r\n public set loadingScreen(loadingScreen: ILoadingScreen) {\r\n this._loadingScreen = loadingScreen;\r\n }\r\n\r\n /**\r\n * Sets the current loading screen text\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\r\n */\r\n public set loadingUIText(text: string) {\r\n this.loadingScreen.loadingUIText = text;\r\n }\r\n\r\n /**\r\n * Sets the current loading screen background color\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen\r\n */\r\n public set loadingUIBackgroundColor(color: string) {\r\n this.loadingScreen.loadingUIBackgroundColor = color;\r\n }\r\n\r\n /**\r\n * creates and returns a new video element\r\n * @param constraints video constraints\r\n * @returns video element\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public createVideoElement(constraints: MediaTrackConstraints): any {\r\n return document.createElement(\"video\");\r\n }\r\n\r\n /** Pointerlock and fullscreen */\r\n\r\n /**\r\n * Ask the browser to promote the current element to pointerlock mode\r\n * @param element defines the DOM element to promote\r\n */\r\n static _RequestPointerlock(element: HTMLElement): void {\r\n if (element.requestPointerLock) {\r\n // In some browsers, requestPointerLock returns a promise.\r\n // Handle possible rejections to avoid an unhandled top-level exception.\r\n const promise: unknown = element.requestPointerLock();\r\n if (promise instanceof Promise)\r\n promise\r\n .then(() => {\r\n element.focus();\r\n })\r\n .catch(() => {});\r\n else element.focus();\r\n }\r\n }\r\n\r\n /**\r\n * Asks the browser to exit pointerlock mode\r\n */\r\n static _ExitPointerlock(): void {\r\n if (document.exitPointerLock) {\r\n document.exitPointerLock();\r\n }\r\n }\r\n\r\n /**\r\n * Ask the browser to promote the current element to fullscreen rendering mode\r\n * @param element defines the DOM element to promote\r\n */\r\n static _RequestFullscreen(element: HTMLElement): void {\r\n const requestFunction = element.requestFullscreen || (element).webkitRequestFullscreen;\r\n if (!requestFunction) {\r\n return;\r\n }\r\n requestFunction.call(element);\r\n }\r\n\r\n /**\r\n * Asks the browser to exit fullscreen mode\r\n */\r\n static _ExitFullscreen(): void {\r\n const anyDoc = document as any;\r\n\r\n if (document.exitFullscreen) {\r\n document.exitFullscreen();\r\n } else if (anyDoc.webkitCancelFullScreen) {\r\n anyDoc.webkitCancelFullScreen();\r\n }\r\n }\r\n\r\n /**\r\n * Get Font size information\r\n * @param font font name\r\n * @returns an object containing ascent, height and descent\r\n */\r\n public getFontOffset(font: string): { ascent: number; height: number; descent: number } {\r\n const text = document.createElement(\"span\");\r\n text.innerHTML = \"Hg\";\r\n text.setAttribute(\"style\", `font: ${font} !important`);\r\n\r\n const block = document.createElement(\"div\");\r\n block.style.display = \"inline-block\";\r\n block.style.width = \"1px\";\r\n block.style.height = \"0px\";\r\n block.style.verticalAlign = \"bottom\";\r\n\r\n const div = document.createElement(\"div\");\r\n div.style.whiteSpace = \"nowrap\";\r\n div.appendChild(text);\r\n div.appendChild(block);\r\n\r\n document.body.appendChild(div);\r\n\r\n let fontAscent = 0;\r\n let fontHeight = 0;\r\n try {\r\n fontHeight = block.getBoundingClientRect().top - text.getBoundingClientRect().top;\r\n block.style.verticalAlign = \"baseline\";\r\n fontAscent = block.getBoundingClientRect().top - text.getBoundingClientRect().top;\r\n } finally {\r\n document.body.removeChild(div);\r\n }\r\n return { ascent: fontAscent, height: fontHeight, descent: fontHeight - fontAscent };\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n// \"Coroutines are computer program components that generalize subroutines for non-preemptive multitasking, by allowing execution to be suspended and resumed.\"\r\n// https://en.wikipedia.org/wiki/Coroutine\r\n\r\n// In this implementation, coroutines are typically created via generator functions (function* with yield statements).\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*\r\n\r\n// In this implementation, the generator function (possibly parameterized) is referred to as a coroutine factory, and the returned iterator is referred to as the coroutine.\r\n// Technically yielding generator functions are not required - anything that implements the contract of Coroutine can be run as a coroutine.\r\n\r\n// The coroutine is started with the first call to next on the iterator, it is suspended with yield statements, and it is resumed with additional calls to next on the iterator.\r\n// To create an object satisfying the Coroutine contract with a generator function, it must not yield values, but rather only void via a plain \"yield;\" statement.\r\n// Coroutines can call other coroutines via:\r\n// 1. yield* someOtherCoroutine(); // If the called coroutine does not return a value\r\n// 2. const result = yield* someOtherCoroutine(); // If the called coroutine returns a value\r\n\r\n// Coroutines are run with the runCoroutine function, which takes a Coroutine, a CoroutineScheduler, and a success and error callback.\r\n// A scheduler is responsible for scheduling the next step of a coroutine, either synchronously or asynchronously.\r\n\r\n/**\r\n * A Coroutine is the intersection of:\r\n * 1. An Iterator that yields void, returns a T, and is not passed values with calls to next.\r\n * 2. An IterableIterator of void (since it only yields void).\r\n */\r\ntype CoroutineBase = Iterator & IterableIterator;\r\n/** @internal */\r\nexport type Coroutine = CoroutineBase;\r\n/** @internal */\r\nexport type AsyncCoroutine = CoroutineBase, T>;\r\n\r\n// A CoroutineStep represents a single step of a coroutine, and is an IteratorResult as returned from Coroutine.next().\r\n/** @internal */\r\nexport type CoroutineStep = IteratorResult;\r\n\r\n// A CoroutineScheduler is responsible for scheduling the call to Coroutine.next and invokes the success or error callback after next is called.\r\n/** @internal */\r\nexport type CoroutineScheduler = (coroutine: AsyncCoroutine, onStep: (stepResult: CoroutineStep) => void, onError: (stepError: any) => void) => void;\r\n\r\n// The inline scheduler simply steps the coroutine synchronously. This is useful for running a coroutine synchronously, and also as a helper function for other schedulers.\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function inlineScheduler(coroutine: AsyncCoroutine, onStep: (stepResult: CoroutineStep) => void, onError: (stepError: any) => void) {\r\n try {\r\n const step = coroutine.next();\r\n\r\n if (step.done) {\r\n onStep(step);\r\n } else if (!step.value) {\r\n // NOTE: The properties of step have been narrowed, but the type of step itself is not narrowed, so the cast below is the most type safe way to deal with this without instantiating a new object to hold the values.\r\n onStep(step as { done: typeof step.done; value: typeof step.value });\r\n } else {\r\n step.value.then(() => {\r\n step.value = undefined;\r\n onStep(step as { done: typeof step.done; value: typeof step.value });\r\n }, onError);\r\n }\r\n } catch (error) {\r\n onError(error);\r\n }\r\n}\r\n\r\n// The yielding scheduler steps the coroutine synchronously until the specified time interval has elapsed, then yields control so other operations can be performed.\r\n// A single instance of a yielding scheduler could be shared across multiple coroutines to yield when their collective work exceeds the threshold.\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function createYieldingScheduler(yieldAfterMS = 25) {\r\n let startTime: number | undefined;\r\n return (coroutine: AsyncCoroutine, onStep: (stepResult: CoroutineStep) => void, onError: (stepError: any) => void) => {\r\n const currentTime = performance.now();\r\n\r\n if (startTime === undefined || currentTime - startTime > yieldAfterMS) {\r\n // If this is the first coroutine step, or if the time interval has elapsed, record a new start time, and schedule the coroutine step to happen later, effectively yielding control of the execution context.\r\n startTime = currentTime;\r\n setTimeout(() => {\r\n inlineScheduler(coroutine, onStep, onError);\r\n }, 0);\r\n } else {\r\n // Otherwise it is not time to yield yet, so step the coroutine synchronously.\r\n inlineScheduler(coroutine, onStep, onError);\r\n }\r\n };\r\n}\r\n\r\n// Runs the specified coroutine with the specified scheduler. The success or error callback will be invoked when the coroutine finishes.\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function runCoroutine(\r\n coroutine: AsyncCoroutine,\r\n scheduler: CoroutineScheduler,\r\n onSuccess: (result: T) => void,\r\n onError: (error: any) => void,\r\n abortSignal?: AbortSignal\r\n) {\r\n const resume = () => {\r\n let reschedule: boolean | undefined;\r\n\r\n const onStep = (stepResult: CoroutineStep) => {\r\n if (stepResult.done) {\r\n // If the coroutine is done, report success.\r\n onSuccess(stepResult.value);\r\n } else {\r\n // If the coroutine is not done, resume the coroutine (via the scheduler).\r\n if (reschedule === undefined) {\r\n // If reschedule is undefined at this point, then the coroutine must have stepped synchronously, so just flag another loop iteration.\r\n reschedule = true;\r\n } else {\r\n // If reschedule is defined at this point, then the coroutine must have stepped asynchronously, so call resume to restart the step loop.\r\n resume();\r\n }\r\n }\r\n };\r\n\r\n do {\r\n reschedule = undefined;\r\n\r\n if (!abortSignal || !abortSignal.aborted) {\r\n scheduler(coroutine, onStep, onError);\r\n } else {\r\n onError(new Error(\"Aborted\"));\r\n }\r\n\r\n if (reschedule === undefined) {\r\n // If reschedule is undefined at this point, then the coroutine must have stepped asynchronously, so stop looping and let the coroutine be resumed later.\r\n reschedule = false;\r\n }\r\n } while (reschedule);\r\n };\r\n\r\n resume();\r\n}\r\n\r\n// Runs the specified coroutine synchronously.\r\n/**\r\n * @internal\r\n */\r\nexport function runCoroutineSync(coroutine: Coroutine, abortSignal?: AbortSignal): T {\r\n // Run the coroutine with the inline scheduler, storing the returned value, or re-throwing the error (since the error callback will be called synchronously by the inline scheduler).\r\n let result: T | undefined;\r\n runCoroutine(\r\n coroutine,\r\n inlineScheduler,\r\n (r: T) => (result = r),\r\n (e: any) => {\r\n throw e;\r\n },\r\n abortSignal\r\n );\r\n\r\n // Synchronously return the result of the coroutine.\r\n return result!;\r\n}\r\n\r\n// Runs the specified coroutine asynchronously with the specified scheduler.\r\n/**\r\n * @internal\r\n */\r\nexport function runCoroutineAsync(coroutine: AsyncCoroutine, scheduler: CoroutineScheduler, abortSignal?: AbortSignal): Promise {\r\n // Run the coroutine with a yielding scheduler, resolving or rejecting the result promise when the coroutine finishes.\r\n return new Promise((resolve, reject) => {\r\n runCoroutine(coroutine, scheduler, resolve, reject, abortSignal);\r\n });\r\n}\r\n\r\n/**\r\n * Given a function that returns a Coroutine, produce a function with the same parameters that returns a T.\r\n * The returned function runs the coroutine synchronously.\r\n * @param coroutineFactory A function that returns a Coroutine.\r\n * @param abortSignal\r\n * @returns A function that runs the coroutine synchronously.\r\n * @internal\r\n */\r\nexport function makeSyncFunction(\r\n coroutineFactory: (...params: TParams) => Coroutine,\r\n abortSignal?: AbortSignal\r\n): (...params: TParams) => TReturn {\r\n return (...params: TParams) => {\r\n // Run the coroutine synchronously.\r\n return runCoroutineSync(coroutineFactory(...params), abortSignal);\r\n };\r\n}\r\n\r\n/**\r\n * Given a function that returns a Coroutine, product a function with the same parameters that returns a Promise.\r\n * The returned function runs the coroutine asynchronously, yield control of the execution context occasionally to enable a more responsive experience.\r\n * @param coroutineFactory A function that returns a Coroutine.\r\n * @param scheduler\r\n * @param abortSignal\r\n * @returns A function that runs the coroutine asynchronously.\r\n * @internal\r\n */\r\nexport function makeAsyncFunction(\r\n coroutineFactory: (...params: TParams) => AsyncCoroutine,\r\n scheduler: CoroutineScheduler,\r\n abortSignal?: AbortSignal\r\n): (...params: TParams) => Promise {\r\n return (...params: TParams) => {\r\n // Run the coroutine asynchronously.\r\n return runCoroutineAsync(coroutineFactory(...params), scheduler, abortSignal);\r\n };\r\n}\r\n", "import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class IntersectionInfo {\r\n public faceId = 0;\r\n public subMeshId = 0;\r\n\r\n constructor(\r\n public bu: Nullable,\r\n public bv: Nullable,\r\n public distance: number\r\n ) {}\r\n}\r\n", "import type { DeepImmutable, Nullable } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { BoundingSphere } from \"../Culling/boundingSphere\";\r\n\r\nimport type { ICullable } from \"./boundingInfo\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\n\r\nimport type { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\n/**\r\n * Class used to store bounding box information\r\n */\r\nexport class BoundingBox implements ICullable {\r\n /**\r\n * Gets the 8 vectors representing the bounding box in local space\r\n */\r\n public readonly vectors: Vector3[] = ArrayTools.BuildArray(8, Vector3.Zero);\r\n /**\r\n * Gets the center of the bounding box in local space\r\n */\r\n public readonly center: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the center of the bounding box in world space\r\n */\r\n public readonly centerWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the extend size in local space\r\n */\r\n public readonly extendSize: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the extend size in world space\r\n */\r\n public readonly extendSizeWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the OBB (object bounding box) directions\r\n */\r\n public readonly directions: Vector3[] = ArrayTools.BuildArray(3, Vector3.Zero);\r\n /**\r\n * Gets the 8 vectors representing the bounding box in world space\r\n */\r\n public readonly vectorsWorld: Vector3[] = ArrayTools.BuildArray(8, Vector3.Zero);\r\n /**\r\n * Gets the minimum vector in world space\r\n */\r\n public readonly minimumWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in world space\r\n */\r\n public readonly maximumWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the minimum vector in local space\r\n */\r\n public readonly minimum: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in local space\r\n */\r\n public readonly maximum: Vector3 = Vector3.Zero();\r\n\r\n private _worldMatrix: DeepImmutable;\r\n private static readonly _TmpVector3 = ArrayTools.BuildArray(3, Vector3.Zero);\r\n\r\n /**\r\n * @internal\r\n */\r\n public _tag: number;\r\n\r\n /** @internal */\r\n public _drawWrapperFront: Nullable = null;\r\n /** @internal */\r\n public _drawWrapperBack: Nullable = null;\r\n\r\n /**\r\n * Creates a new bounding box\r\n * @param min defines the minimum vector (in local space)\r\n * @param max defines the maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n constructor(min: DeepImmutable, max: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n this.reConstruct(min, max, worldMatrix);\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Recreates the entire bounding box from scratch as if we call the constructor in place\r\n * @param min defines the new minimum vector (in local space)\r\n * @param max defines the new maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n public reConstruct(min: DeepImmutable, max: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n const minX = min.x,\r\n minY = min.y,\r\n minZ = min.z,\r\n maxX = max.x,\r\n maxY = max.y,\r\n maxZ = max.z;\r\n const vectors = this.vectors;\r\n\r\n this.minimum.copyFromFloats(minX, minY, minZ);\r\n this.maximum.copyFromFloats(maxX, maxY, maxZ);\r\n vectors[0].copyFromFloats(minX, minY, minZ);\r\n vectors[1].copyFromFloats(maxX, maxY, maxZ);\r\n vectors[2].copyFromFloats(maxX, minY, minZ);\r\n vectors[3].copyFromFloats(minX, maxY, minZ);\r\n vectors[4].copyFromFloats(minX, minY, maxZ);\r\n vectors[5].copyFromFloats(maxX, maxY, minZ);\r\n vectors[6].copyFromFloats(minX, maxY, maxZ);\r\n vectors[7].copyFromFloats(maxX, minY, maxZ);\r\n\r\n // OBB\r\n max.addToRef(min, this.center).scaleInPlace(0.5);\r\n max.subtractToRef(min, this.extendSize).scaleInPlace(0.5);\r\n\r\n this._worldMatrix = worldMatrix || Matrix.IdentityReadOnly;\r\n\r\n this._update(this._worldMatrix);\r\n }\r\n\r\n /**\r\n * Scale the current bounding box by applying a scale factor\r\n * @param factor defines the scale factor to apply\r\n * @returns the current bounding box\r\n */\r\n public scale(factor: number): BoundingBox {\r\n const tmpVectors = BoundingBox._TmpVector3;\r\n const diff = this.maximum.subtractToRef(this.minimum, tmpVectors[0]);\r\n const len = diff.length();\r\n diff.normalizeFromLength(len);\r\n const distance = len * factor;\r\n const newRadius = diff.scaleInPlace(distance * 0.5);\r\n\r\n const min = this.center.subtractToRef(newRadius, tmpVectors[1]);\r\n const max = this.center.addToRef(newRadius, tmpVectors[2]);\r\n\r\n this.reConstruct(min, max, this._worldMatrix);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the world matrix of the bounding box\r\n * @returns a matrix\r\n */\r\n public getWorldMatrix(): DeepImmutable {\r\n return this._worldMatrix;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _update(world: DeepImmutable): void {\r\n const minWorld = this.minimumWorld;\r\n const maxWorld = this.maximumWorld;\r\n const directions = this.directions;\r\n const vectorsWorld = this.vectorsWorld;\r\n const vectors = this.vectors;\r\n\r\n if (!world.isIdentity()) {\r\n minWorld.setAll(Number.MAX_VALUE);\r\n maxWorld.setAll(-Number.MAX_VALUE);\r\n\r\n for (let index = 0; index < 8; ++index) {\r\n const v = vectorsWorld[index];\r\n Vector3.TransformCoordinatesToRef(vectors[index], world, v);\r\n minWorld.minimizeInPlace(v);\r\n maxWorld.maximizeInPlace(v);\r\n }\r\n\r\n // Extend\r\n maxWorld.subtractToRef(minWorld, this.extendSizeWorld).scaleInPlace(0.5);\r\n maxWorld.addToRef(minWorld, this.centerWorld).scaleInPlace(0.5);\r\n } else {\r\n minWorld.copyFrom(this.minimum);\r\n maxWorld.copyFrom(this.maximum);\r\n for (let index = 0; index < 8; ++index) {\r\n vectorsWorld[index].copyFrom(vectors[index]);\r\n }\r\n\r\n // Extend\r\n this.extendSizeWorld.copyFrom(this.extendSize);\r\n this.centerWorld.copyFrom(this.center);\r\n }\r\n\r\n Vector3.FromArrayToRef(world.m, 0, directions[0]);\r\n Vector3.FromArrayToRef(world.m, 4, directions[1]);\r\n Vector3.FromArrayToRef(world.m, 8, directions[2]);\r\n\r\n this._worldMatrix = world;\r\n }\r\n\r\n /**\r\n * Tests if the bounding box is intersecting the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an intersection\r\n */\r\n public isInFrustum(frustumPlanes: Array>): boolean {\r\n return BoundingBox.IsInFrustum(this.vectorsWorld, frustumPlanes);\r\n }\r\n\r\n /**\r\n * Tests if the bounding box is entirely inside the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an inclusion\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Array>): boolean {\r\n return BoundingBox.IsCompletelyInFrustum(this.vectorsWorld, frustumPlanes);\r\n }\r\n\r\n /**\r\n * Tests if a point is inside the bounding box\r\n * @param point defines the point to test\r\n * @returns true if the point is inside the bounding box\r\n */\r\n public intersectsPoint(point: DeepImmutable): boolean {\r\n const min = this.minimumWorld;\r\n const max = this.maximumWorld;\r\n const minX = min.x,\r\n minY = min.y,\r\n minZ = min.z,\r\n maxX = max.x,\r\n maxY = max.y,\r\n maxZ = max.z;\r\n const pointX = point.x,\r\n pointY = point.y,\r\n pointZ = point.z;\r\n const delta = -Epsilon;\r\n\r\n if (maxX - pointX < delta || delta > pointX - minX) {\r\n return false;\r\n }\r\n\r\n if (maxY - pointY < delta || delta > pointY - minY) {\r\n return false;\r\n }\r\n\r\n if (maxZ - pointZ < delta || delta > pointZ - minZ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if the bounding box intersects with a bounding sphere\r\n * @param sphere defines the sphere to test\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsSphere(sphere: DeepImmutable): boolean {\r\n return BoundingBox.IntersectsSphere(this.minimumWorld, this.maximumWorld, sphere.centerWorld, sphere.radiusWorld);\r\n }\r\n\r\n /**\r\n * Tests if the bounding box intersects with a box defined by a min and max vectors\r\n * @param min defines the min vector to use\r\n * @param max defines the max vector to use\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsMinMax(min: DeepImmutable, max: DeepImmutable): boolean {\r\n const myMin = this.minimumWorld;\r\n const myMax = this.maximumWorld;\r\n const myMinX = myMin.x,\r\n myMinY = myMin.y,\r\n myMinZ = myMin.z,\r\n myMaxX = myMax.x,\r\n myMaxY = myMax.y,\r\n myMaxZ = myMax.z;\r\n const minX = min.x,\r\n minY = min.y,\r\n minZ = min.z,\r\n maxX = max.x,\r\n maxY = max.y,\r\n maxZ = max.z;\r\n if (myMaxX < minX || myMinX > maxX) {\r\n return false;\r\n }\r\n\r\n if (myMaxY < minY || myMinY > maxY) {\r\n return false;\r\n }\r\n\r\n if (myMaxZ < minZ || myMinZ > maxZ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Disposes the resources of the class\r\n */\r\n public dispose(): void {\r\n this._drawWrapperFront?.dispose();\r\n this._drawWrapperBack?.dispose();\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Tests if two bounding boxes are intersections\r\n * @param box0 defines the first box to test\r\n * @param box1 defines the second box to test\r\n * @returns true if there is an intersection\r\n */\r\n public static Intersects(box0: DeepImmutable, box1: DeepImmutable): boolean {\r\n return box0.intersectsMinMax(box1.minimumWorld, box1.maximumWorld);\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defines by a min/max vectors intersects a sphere\r\n * @param minPoint defines the minimum vector of the bounding box\r\n * @param maxPoint defines the maximum vector of the bounding box\r\n * @param sphereCenter defines the sphere center\r\n * @param sphereRadius defines the sphere radius\r\n * @returns true if there is an intersection\r\n */\r\n public static IntersectsSphere(minPoint: DeepImmutable, maxPoint: DeepImmutable, sphereCenter: DeepImmutable, sphereRadius: number): boolean {\r\n const vector = BoundingBox._TmpVector3[0];\r\n Vector3.ClampToRef(sphereCenter, minPoint, maxPoint, vector);\r\n const num = Vector3.DistanceSquared(sphereCenter, vector);\r\n return num <= sphereRadius * sphereRadius;\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defined with 8 vectors is entirely inside frustum planes\r\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an inclusion\r\n */\r\n public static IsCompletelyInFrustum(boundingVectors: Array>, frustumPlanes: Array>): boolean {\r\n for (let p = 0; p < 6; ++p) {\r\n const frustumPlane = frustumPlanes[p];\r\n for (let i = 0; i < 8; ++i) {\r\n if (frustumPlane.dotCoordinate(boundingVectors[i]) < 0) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defined with 8 vectors intersects frustum planes\r\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an intersection\r\n */\r\n public static IsInFrustum(boundingVectors: Array>, frustumPlanes: Array>): boolean {\r\n for (let p = 0; p < 6; ++p) {\r\n let canReturnFalse = true;\r\n const frustumPlane = frustumPlanes[p];\r\n for (let i = 0; i < 8; ++i) {\r\n if (frustumPlane.dotCoordinate(boundingVectors[i]) >= 0) {\r\n canReturnFalse = false;\r\n break;\r\n }\r\n }\r\n if (canReturnFalse) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n", "import type { DeepImmutable } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\n\r\n/**\r\n * Class used to store bounding sphere information\r\n */\r\nexport class BoundingSphere {\r\n /**\r\n * Gets the center of the bounding sphere in local space\r\n */\r\n public readonly center = Vector3.Zero();\r\n /**\r\n * Radius of the bounding sphere in local space\r\n */\r\n public radius: number;\r\n /**\r\n * Gets the center of the bounding sphere in world space\r\n */\r\n public readonly centerWorld = Vector3.Zero();\r\n /**\r\n * Radius of the bounding sphere in world space\r\n */\r\n public radiusWorld: number;\r\n /**\r\n * Gets the minimum vector in local space\r\n */\r\n public readonly minimum = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in local space\r\n */\r\n public readonly maximum = Vector3.Zero();\r\n\r\n private _worldMatrix: DeepImmutable;\r\n private static readonly _TmpVector3 = ArrayTools.BuildArray(3, Vector3.Zero);\r\n\r\n /**\r\n * Creates a new bounding sphere\r\n * @param min defines the minimum vector (in local space)\r\n * @param max defines the maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n constructor(min: DeepImmutable, max: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n this.reConstruct(min, max, worldMatrix);\r\n }\r\n\r\n /**\r\n * Recreates the entire bounding sphere from scratch as if we call the constructor in place\r\n * @param min defines the new minimum vector (in local space)\r\n * @param max defines the new maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n public reConstruct(min: DeepImmutable, max: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n this.minimum.copyFrom(min);\r\n this.maximum.copyFrom(max);\r\n\r\n const distance = Vector3.Distance(min, max);\r\n\r\n max.addToRef(min, this.center).scaleInPlace(0.5);\r\n this.radius = distance * 0.5;\r\n\r\n this._update(worldMatrix || Matrix.IdentityReadOnly);\r\n }\r\n\r\n /**\r\n * Scale the current bounding sphere by applying a scale factor\r\n * @param factor defines the scale factor to apply\r\n * @returns the current bounding box\r\n */\r\n public scale(factor: number): BoundingSphere {\r\n const newRadius = this.radius * factor;\r\n const tmpVectors = BoundingSphere._TmpVector3;\r\n const tempRadiusVector = tmpVectors[0].setAll(newRadius);\r\n const min = this.center.subtractToRef(tempRadiusVector, tmpVectors[1]);\r\n const max = this.center.addToRef(tempRadiusVector, tmpVectors[2]);\r\n\r\n this.reConstruct(min, max, this._worldMatrix);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the world matrix of the bounding box\r\n * @returns a matrix\r\n */\r\n public getWorldMatrix(): DeepImmutable {\r\n return this._worldMatrix;\r\n }\r\n\r\n // Methods\r\n /**\r\n * @internal\r\n */\r\n public _update(worldMatrix: DeepImmutable): void {\r\n if (!worldMatrix.isIdentity()) {\r\n Vector3.TransformCoordinatesToRef(this.center, worldMatrix, this.centerWorld);\r\n const tempVector = BoundingSphere._TmpVector3[0];\r\n Vector3.TransformNormalFromFloatsToRef(1.0, 1.0, 1.0, worldMatrix, tempVector);\r\n this.radiusWorld = Math.max(Math.abs(tempVector.x), Math.abs(tempVector.y), Math.abs(tempVector.z)) * this.radius;\r\n } else {\r\n this.centerWorld.copyFrom(this.center);\r\n this.radiusWorld = this.radius;\r\n }\r\n }\r\n\r\n /**\r\n * Tests if the bounding sphere is intersecting the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an intersection\r\n */\r\n public isInFrustum(frustumPlanes: Array>): boolean {\r\n const center = this.centerWorld;\r\n const radius = this.radiusWorld;\r\n for (let i = 0; i < 6; i++) {\r\n if (frustumPlanes[i].dotCoordinate(center) <= -radius) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if the bounding sphere center is in between the frustum planes.\r\n * Used for optimistic fast inclusion.\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if the sphere center is in between the frustum planes\r\n */\r\n public isCenterInFrustum(frustumPlanes: Array>): boolean {\r\n const center = this.centerWorld;\r\n for (let i = 0; i < 6; i++) {\r\n if (frustumPlanes[i].dotCoordinate(center) < 0) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if a point is inside the bounding sphere\r\n * @param point defines the point to test\r\n * @returns true if the point is inside the bounding sphere\r\n */\r\n public intersectsPoint(point: DeepImmutable): boolean {\r\n const squareDistance = Vector3.DistanceSquared(this.centerWorld, point);\r\n if (this.radiusWorld * this.radiusWorld < squareDistance) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Checks if two sphere intersect\r\n * @param sphere0 sphere 0\r\n * @param sphere1 sphere 1\r\n * @returns true if the spheres intersect\r\n */\r\n public static Intersects(sphere0: DeepImmutable, sphere1: DeepImmutable): boolean {\r\n const squareDistance = Vector3.DistanceSquared(sphere0.centerWorld, sphere1.centerWorld);\r\n const radiusSum = sphere0.radiusWorld + sphere1.radiusWorld;\r\n\r\n if (radiusSum * radiusSum < squareDistance) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Creates a sphere from a center and a radius\r\n * @param center The center\r\n * @param radius radius\r\n * @param matrix Optional worldMatrix\r\n * @returns The sphere\r\n */\r\n public static CreateFromCenterAndRadius(center: DeepImmutable, radius: number, matrix?: DeepImmutable): BoundingSphere {\r\n this._TmpVector3[0].copyFrom(center);\r\n this._TmpVector3[1].copyFromFloats(0, 0, radius);\r\n this._TmpVector3[2].copyFrom(center);\r\n this._TmpVector3[0].addInPlace(this._TmpVector3[1]);\r\n this._TmpVector3[2].subtractInPlace(this._TmpVector3[1]);\r\n\r\n const sphere = new BoundingSphere(this._TmpVector3[0], this._TmpVector3[2]);\r\n\r\n if (matrix) {\r\n sphere._worldMatrix = matrix;\r\n } else {\r\n sphere._worldMatrix = Matrix.Identity();\r\n }\r\n\r\n return sphere;\r\n }\r\n}\r\n", "import type { DeepImmutable } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport type { Matrix } from \"../Maths/math.vector\";\r\nimport { TmpVectors } from \"../Maths/math.vector\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { BoundingBox } from \"./boundingBox\";\r\nimport { BoundingSphere } from \"./boundingSphere\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\n\r\nimport type { Collider } from \"../Collisions/collider\";\r\n\r\nconst _result0 = { min: 0, max: 0 };\r\nconst _result1 = { min: 0, max: 0 };\r\nconst computeBoxExtents = (axis: DeepImmutable, box: DeepImmutable, result: { min: number; max: number }) => {\r\n const p = Vector3.Dot(box.centerWorld, axis);\r\n\r\n const r0 = Math.abs(Vector3.Dot(box.directions[0], axis)) * box.extendSize.x;\r\n const r1 = Math.abs(Vector3.Dot(box.directions[1], axis)) * box.extendSize.y;\r\n const r2 = Math.abs(Vector3.Dot(box.directions[2], axis)) * box.extendSize.z;\r\n\r\n const r = r0 + r1 + r2;\r\n result.min = p - r;\r\n result.max = p + r;\r\n};\r\n\r\nconst axisOverlap = (axis: DeepImmutable, box0: DeepImmutable, box1: DeepImmutable): boolean => {\r\n computeBoxExtents(axis, box0, _result0);\r\n computeBoxExtents(axis, box1, _result1);\r\n return !(_result0.min > _result1.max || _result1.min > _result0.max);\r\n};\r\n\r\n/**\r\n * Interface for cullable objects\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#back-face-culling\r\n */\r\nexport interface ICullable {\r\n /**\r\n * Checks if the object or part of the object is in the frustum\r\n * @param frustumPlanes Camera near/planes\r\n * @returns true if the object is in frustum otherwise false\r\n */\r\n isInFrustum(frustumPlanes: Plane[]): boolean;\r\n /**\r\n * Checks if a cullable object (mesh...) is in the camera frustum\r\n * Unlike isInFrustum this checks the full bounding box\r\n * @param frustumPlanes Camera near/planes\r\n * @returns true if the object is in frustum otherwise false\r\n */\r\n isCompletelyInFrustum(frustumPlanes: Plane[]): boolean;\r\n}\r\n\r\n/**\r\n * Info for a bounding data of a mesh\r\n */\r\nexport class BoundingInfo implements ICullable {\r\n /**\r\n * Bounding box for the mesh\r\n */\r\n public readonly boundingBox: BoundingBox;\r\n /**\r\n * Bounding sphere for the mesh\r\n */\r\n public readonly boundingSphere: BoundingSphere;\r\n\r\n private _isLocked = false;\r\n\r\n private static readonly _TmpVector3 = ArrayTools.BuildArray(2, Vector3.Zero);\r\n\r\n /**\r\n * Constructs bounding info\r\n * @param minimum min vector of the bounding box/sphere\r\n * @param maximum max vector of the bounding box/sphere\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n constructor(minimum: DeepImmutable, maximum: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n this.boundingBox = new BoundingBox(minimum, maximum, worldMatrix);\r\n this.boundingSphere = new BoundingSphere(minimum, maximum, worldMatrix);\r\n }\r\n\r\n /**\r\n * Recreates the entire bounding info from scratch as if we call the constructor in place\r\n * @param min defines the new minimum vector (in local space)\r\n * @param max defines the new maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n public reConstruct(min: DeepImmutable, max: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n this.boundingBox.reConstruct(min, max, worldMatrix);\r\n this.boundingSphere.reConstruct(min, max, worldMatrix);\r\n }\r\n\r\n /**\r\n * min vector of the bounding box/sphere\r\n */\r\n public get minimum(): Vector3 {\r\n return this.boundingBox.minimum;\r\n }\r\n\r\n /**\r\n * max vector of the bounding box/sphere\r\n */\r\n public get maximum(): Vector3 {\r\n return this.boundingBox.maximum;\r\n }\r\n\r\n /**\r\n * If the info is locked and won't be updated to avoid perf overhead\r\n */\r\n public get isLocked(): boolean {\r\n return this._isLocked;\r\n }\r\n\r\n public set isLocked(value: boolean) {\r\n this._isLocked = value;\r\n }\r\n\r\n // Methods\r\n /**\r\n * Updates the bounding sphere and box\r\n * @param world world matrix to be used to update\r\n */\r\n public update(world: DeepImmutable) {\r\n if (this._isLocked) {\r\n return;\r\n }\r\n this.boundingBox._update(world);\r\n this.boundingSphere._update(world);\r\n }\r\n\r\n /**\r\n * Recreate the bounding info to be centered around a specific point given a specific extend.\r\n * @param center New center of the bounding info\r\n * @param extend New extend of the bounding info\r\n * @returns the current bounding info\r\n */\r\n public centerOn(center: DeepImmutable, extend: DeepImmutable): BoundingInfo {\r\n const minimum = BoundingInfo._TmpVector3[0].copyFrom(center).subtractInPlace(extend);\r\n const maximum = BoundingInfo._TmpVector3[1].copyFrom(center).addInPlace(extend);\r\n\r\n this.boundingBox.reConstruct(minimum, maximum, this.boundingBox.getWorldMatrix());\r\n this.boundingSphere.reConstruct(minimum, maximum, this.boundingBox.getWorldMatrix());\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Grows the bounding info to include the given point.\r\n * @param point The point that will be included in the current bounding info (in local space)\r\n * @returns the current bounding info\r\n */\r\n public encapsulate(point: Vector3): BoundingInfo {\r\n const minimum = Vector3.Minimize(this.minimum, point);\r\n const maximum = Vector3.Maximize(this.maximum, point);\r\n this.reConstruct(minimum, maximum, this.boundingBox.getWorldMatrix());\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Grows the bounding info to encapsulate the given bounding info.\r\n * @param toEncapsulate The bounding info that will be encapsulated in the current bounding info\r\n * @returns the current bounding info\r\n */\r\n public encapsulateBoundingInfo(toEncapsulate: BoundingInfo): BoundingInfo {\r\n const invw = TmpVectors.Matrix[0];\r\n this.boundingBox.getWorldMatrix().invertToRef(invw);\r\n\r\n const v = TmpVectors.Vector3[0];\r\n\r\n Vector3.TransformCoordinatesToRef(toEncapsulate.boundingBox.minimumWorld, invw, v);\r\n this.encapsulate(v);\r\n\r\n Vector3.TransformCoordinatesToRef(toEncapsulate.boundingBox.maximumWorld, invw, v);\r\n this.encapsulate(v);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Scale the current bounding info by applying a scale factor\r\n * @param factor defines the scale factor to apply\r\n * @returns the current bounding info\r\n */\r\n public scale(factor: number): BoundingInfo {\r\n this.boundingBox.scale(factor);\r\n this.boundingSphere.scale(factor);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns `true` if the bounding info is within the frustum defined by the passed array of planes.\r\n * @param frustumPlanes defines the frustum to test\r\n * @param strategy defines the strategy to use for the culling (default is BABYLON.AbstractMesh.CULLINGSTRATEGY_STANDARD)\r\n * The different strategies available are:\r\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_STANDARD most accurate but slower @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_STANDARD\r\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY faster but less accurate @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY\r\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION can be faster if always visible @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_OPTIMISTIC_INCLUSION\r\n * * BABYLON.AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY can be faster if always visible @see https://doc.babylonjs.com/typedoc/classes/BABYLON.AbstractMesh#CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY\r\n * @returns true if the bounding info is in the frustum planes\r\n */\r\n public isInFrustum(frustumPlanes: Array>, strategy: number = Constants.MESHES_CULLINGSTRATEGY_STANDARD): boolean {\r\n const inclusionTest =\r\n strategy === Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION || strategy === Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY;\r\n if (inclusionTest) {\r\n if (this.boundingSphere.isCenterInFrustum(frustumPlanes)) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!this.boundingSphere.isInFrustum(frustumPlanes)) {\r\n return false;\r\n }\r\n\r\n const bSphereOnlyTest =\r\n strategy === Constants.MESHES_CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY || strategy === Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY;\r\n if (bSphereOnlyTest) {\r\n return true;\r\n }\r\n\r\n return this.boundingBox.isInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * Gets the world distance between the min and max points of the bounding box\r\n */\r\n public get diagonalLength(): number {\r\n const boundingBox = this.boundingBox;\r\n const diag = boundingBox.maximumWorld.subtractToRef(boundingBox.minimumWorld, BoundingInfo._TmpVector3[0]);\r\n return diag.length();\r\n }\r\n\r\n /**\r\n * Checks if a cullable object (mesh...) is in the camera frustum\r\n * Unlike isInFrustum this checks the full bounding box\r\n * @param frustumPlanes Camera near/planes\r\n * @returns true if the object is in frustum otherwise false\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Array>): boolean {\r\n return this.boundingBox.isCompletelyInFrustum(frustumPlanes);\r\n }\r\n /**\r\n * @internal\r\n */\r\n public _checkCollision(collider: Collider): boolean {\r\n return collider._canDoCollision(this.boundingSphere.centerWorld, this.boundingSphere.radiusWorld, this.boundingBox.minimumWorld, this.boundingBox.maximumWorld);\r\n }\r\n\r\n /**\r\n * Checks if a point is inside the bounding box and bounding sphere or the mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\r\n * @param point the point to check intersection with\r\n * @returns if the point intersects\r\n */\r\n public intersectsPoint(point: DeepImmutable): boolean {\r\n if (!this.boundingSphere.centerWorld) {\r\n return false;\r\n }\r\n\r\n if (!this.boundingSphere.intersectsPoint(point)) {\r\n return false;\r\n }\r\n\r\n if (!this.boundingBox.intersectsPoint(point)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Checks if another bounding info intersects the bounding box and bounding sphere or the mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\r\n * @param boundingInfo the bounding info to check intersection with\r\n * @param precise if the intersection should be done using OBB\r\n * @returns if the bounding info intersects\r\n */\r\n public intersects(boundingInfo: DeepImmutable, precise: boolean): boolean {\r\n if (!BoundingSphere.Intersects(this.boundingSphere, boundingInfo.boundingSphere)) {\r\n return false;\r\n }\r\n\r\n if (!BoundingBox.Intersects(this.boundingBox, boundingInfo.boundingBox)) {\r\n return false;\r\n }\r\n\r\n if (!precise) {\r\n return true;\r\n }\r\n\r\n const box0 = this.boundingBox;\r\n const box1 = boundingInfo.boundingBox;\r\n\r\n if (!axisOverlap(box0.directions[0], box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(box0.directions[1], box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(box0.directions[2], box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(box1.directions[0], box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(box1.directions[1], box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(box1.directions[2], box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[0], box1.directions[0]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[0], box1.directions[1]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[0], box1.directions[2]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[1], box1.directions[0]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[1], box1.directions[1]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[1], box1.directions[2]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[2], box1.directions[0]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[2], box1.directions[1]), box0, box1)) {\r\n return false;\r\n }\r\n if (!axisOverlap(Vector3.Cross(box0.directions[2], box1.directions[2]), box0, box1)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n", "import type { FloatArray, Nullable, IndicesArray } from \"../types\";\r\nimport type { Vector2 } from \"./math.vector\";\r\nimport { Vector3 } from \"./math.vector\";\r\nimport { nativeOverride } from \"../Misc/decorators\";\r\n\r\n// This helper class is only here so we can apply the nativeOverride decorator to functions.\r\nclass MathHelpers {\r\n @nativeOverride.filter((...[positions, indices]: Parameters) => !Array.isArray(positions) && !Array.isArray(indices))\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static extractMinAndMaxIndexed(positions: FloatArray, indices: IndicesArray, indexStart: number, indexCount: number, minimum: Vector3, maximum: Vector3): void {\r\n for (let index = indexStart; index < indexStart + indexCount; index++) {\r\n const offset = indices[index] * 3;\r\n const x = positions[offset];\r\n const y = positions[offset + 1];\r\n const z = positions[offset + 2];\r\n minimum.minimizeInPlaceFromFloats(x, y, z);\r\n maximum.maximizeInPlaceFromFloats(x, y, z);\r\n }\r\n }\r\n\r\n @nativeOverride.filter((...[positions]: Parameters) => !Array.isArray(positions))\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static extractMinAndMax(positions: FloatArray, start: number, count: number, stride: number, minimum: Vector3, maximum: Vector3): void {\r\n for (let index = start, offset = start * stride; index < start + count; index++, offset += stride) {\r\n const x = positions[offset];\r\n const y = positions[offset + 1];\r\n const z = positions[offset + 2];\r\n minimum.minimizeInPlaceFromFloats(x, y, z);\r\n maximum.maximizeInPlaceFromFloats(x, y, z);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Extracts minimum and maximum values from a list of indexed positions\r\n * @param positions defines the positions to use\r\n * @param indices defines the indices to the positions\r\n * @param indexStart defines the start index\r\n * @param indexCount defines the end index\r\n * @param bias defines bias value to add to the result\r\n * @returns minimum and maximum values\r\n */\r\nexport function extractMinAndMaxIndexed(\r\n positions: FloatArray,\r\n indices: IndicesArray,\r\n indexStart: number,\r\n indexCount: number,\r\n bias: Nullable = null\r\n): { minimum: Vector3; maximum: Vector3 } {\r\n const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n\r\n MathHelpers.extractMinAndMaxIndexed(positions, indices, indexStart, indexCount, minimum, maximum);\r\n\r\n if (bias) {\r\n minimum.x -= minimum.x * bias.x + bias.y;\r\n minimum.y -= minimum.y * bias.x + bias.y;\r\n minimum.z -= minimum.z * bias.x + bias.y;\r\n maximum.x += maximum.x * bias.x + bias.y;\r\n maximum.y += maximum.y * bias.x + bias.y;\r\n maximum.z += maximum.z * bias.x + bias.y;\r\n }\r\n\r\n return {\r\n minimum: minimum,\r\n maximum: maximum,\r\n };\r\n}\r\n\r\n/**\r\n * Extracts minimum and maximum values from a list of positions\r\n * @param positions defines the positions to use\r\n * @param start defines the start index in the positions array\r\n * @param count defines the number of positions to handle\r\n * @param bias defines bias value to add to the result\r\n * @param stride defines the stride size to use (distance between two positions in the positions array)\r\n * @returns minimum and maximum values\r\n */\r\nexport function extractMinAndMax(positions: FloatArray, start: number, count: number, bias: Nullable = null, stride?: number): { minimum: Vector3; maximum: Vector3 } {\r\n const minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n const maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n\r\n if (!stride) {\r\n stride = 3;\r\n }\r\n\r\n MathHelpers.extractMinAndMax(positions, start, count, stride, minimum, maximum);\r\n\r\n if (bias) {\r\n minimum.x -= minimum.x * bias.x + bias.y;\r\n minimum.y -= minimum.y * bias.x + bias.y;\r\n minimum.z -= minimum.z * bias.x + bias.y;\r\n maximum.x += maximum.x * bias.x + bias.y;\r\n maximum.y += maximum.y * bias.x + bias.y;\r\n maximum.z += maximum.z * bias.x + bias.y;\r\n }\r\n\r\n return {\r\n minimum: minimum,\r\n maximum: maximum,\r\n };\r\n}\r\n", "import type { Nullable, IndicesArray, DeepImmutable, FloatArray } from \"../types\";\r\nimport type { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport type { ICullable } from \"../Culling/boundingInfo\";\r\nimport { BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { extractMinAndMaxIndexed } from \"../Maths/math.functions\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\n\r\nimport type { Collider } from \"../Collisions/collider\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { MaterialDefines } from \"../Materials/materialDefines\";\r\nimport type { MultiMaterial } from \"../Materials/multiMaterial\";\r\nimport type { AbstractMesh } from \"./abstractMesh\";\r\nimport type { Mesh } from \"./mesh\";\r\nimport type { Ray } from \"../Culling/ray\";\r\nimport type { TrianglePickingPredicate } from \"../Culling/ray\";\r\n\r\n/**\r\n * Defines a subdivision inside a mesh\r\n */\r\nexport class SubMesh implements ICullable {\r\n private _engine: Engine;\r\n /** @internal */\r\n public _drawWrappers: Array; // index in this array = pass id\r\n private _mainDrawWrapperOverride: Nullable = null;\r\n\r\n /**\r\n * Gets material defines used by the effect associated to the sub mesh\r\n */\r\n public get materialDefines(): Nullable {\r\n return this._mainDrawWrapperOverride ? (this._mainDrawWrapperOverride.defines as MaterialDefines) : (this._getDrawWrapper()?.defines as Nullable);\r\n }\r\n\r\n /**\r\n * Sets material defines used by the effect associated to the sub mesh\r\n */\r\n public set materialDefines(defines: Nullable) {\r\n const drawWrapper = this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n drawWrapper.defines = defines;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getDrawWrapper(passId?: number, createIfNotExisting = false): DrawWrapper | undefined {\r\n passId = passId ?? this._engine.currentRenderPassId;\r\n let drawWrapper = this._drawWrappers[passId];\r\n if (!drawWrapper && createIfNotExisting) {\r\n this._drawWrappers[passId] = drawWrapper = new DrawWrapper(this._mesh.getScene().getEngine());\r\n }\r\n return drawWrapper;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _removeDrawWrapper(passId: number, disposeWrapper = true) {\r\n if (disposeWrapper) {\r\n this._drawWrappers[passId]?.dispose();\r\n }\r\n this._drawWrappers[passId] = undefined as any;\r\n }\r\n\r\n /**\r\n * Gets associated (main) effect (possibly the effect override if defined)\r\n */\r\n public get effect(): Nullable {\r\n return this._mainDrawWrapperOverride ? this._mainDrawWrapperOverride.effect : this._getDrawWrapper()?.effect ?? null;\r\n }\r\n\r\n /** @internal */\r\n public get _drawWrapper(): DrawWrapper {\r\n return this._mainDrawWrapperOverride ?? this._getDrawWrapper(undefined, true)!;\r\n }\r\n\r\n /** @internal */\r\n public get _drawWrapperOverride(): Nullable {\r\n return this._mainDrawWrapperOverride;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setMainDrawWrapperOverride(wrapper: Nullable): void {\r\n this._mainDrawWrapperOverride = wrapper;\r\n }\r\n\r\n /**\r\n * Sets associated effect (effect used to render this submesh)\r\n * @param effect defines the effect to associate with\r\n * @param defines defines the set of defines used to compile this effect\r\n * @param materialContext material context associated to the effect\r\n * @param resetContext true to reset the draw context\r\n */\r\n public setEffect(effect: Nullable, defines: Nullable = null, materialContext?: IMaterialContext, resetContext = true) {\r\n const drawWrapper = this._drawWrapper;\r\n drawWrapper.setEffect(effect, defines, resetContext);\r\n if (materialContext !== undefined) {\r\n drawWrapper.materialContext = materialContext;\r\n }\r\n if (!effect) {\r\n drawWrapper.defines = null;\r\n drawWrapper.materialContext = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache\r\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\r\n */\r\n public resetDrawCache(passId?: number): void {\r\n if (this._drawWrappers) {\r\n if (passId !== undefined) {\r\n this._removeDrawWrapper(passId);\r\n return;\r\n } else {\r\n for (const drawWrapper of this._drawWrappers) {\r\n drawWrapper?.dispose();\r\n }\r\n }\r\n }\r\n this._drawWrappers = [];\r\n }\r\n\r\n /** @internal */\r\n public _linesIndexCount: number = 0;\r\n private _mesh: AbstractMesh;\r\n private _renderingMesh: Mesh;\r\n private _boundingInfo: BoundingInfo;\r\n private _linesIndexBuffer: Nullable = null;\r\n /** @internal */\r\n public _lastColliderWorldVertices: Nullable = null;\r\n /** @internal */\r\n public _trianglePlanes: Plane[];\r\n /** @internal */\r\n public _lastColliderTransformMatrix: Nullable = null;\r\n /** @internal */\r\n public _wasDispatched = false;\r\n\r\n /** @internal */\r\n public _renderId = 0;\r\n /** @internal */\r\n public _alphaIndex: number = 0;\r\n /** @internal */\r\n public _distanceToCamera: number = 0;\r\n /** @internal */\r\n public _id: number;\r\n\r\n private _currentMaterial: Nullable = null;\r\n\r\n /**\r\n * Add a new submesh to a mesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns the new submesh\r\n */\r\n public static AddToMesh(\r\n materialIndex: number,\r\n verticesStart: number,\r\n verticesCount: number,\r\n indexStart: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n return new SubMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n\r\n /**\r\n * Creates a new submesh\r\n * @param materialIndex defines the material index to use\r\n * @param verticesStart defines vertex index start\r\n * @param verticesCount defines vertices count\r\n * @param indexStart defines index start\r\n * @param indexCount defines indices count\r\n * @param mesh defines the parent mesh\r\n * @param renderingMesh defines an optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @param addToMesh defines a boolean indicating that the submesh must be added to the mesh.subMeshes array (true by default)\r\n */\r\n constructor(\r\n /** the material index to use */\r\n public materialIndex: number,\r\n /** vertex index start */\r\n public verticesStart: number,\r\n /** vertices count */\r\n public verticesCount: number,\r\n /** index start */\r\n public indexStart: number,\r\n /** indices count */\r\n public indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true,\r\n addToMesh = true\r\n ) {\r\n this._mesh = mesh;\r\n this._renderingMesh = renderingMesh || mesh;\r\n if (addToMesh) {\r\n mesh.subMeshes.push(this);\r\n }\r\n\r\n this._engine = this._mesh.getScene().getEngine();\r\n this.resetDrawCache();\r\n this._trianglePlanes = [];\r\n\r\n this._id = mesh.subMeshes.length - 1;\r\n\r\n if (createBoundingBox) {\r\n this.refreshBoundingInfo();\r\n mesh.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if this submesh covers the entire parent mesh\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public get IsGlobal(): boolean {\r\n return this.verticesStart === 0 && this.verticesCount === this._mesh.getTotalVertices() && this.indexStart === 0 && this.indexCount === this._mesh.getTotalIndices();\r\n }\r\n\r\n /**\r\n * Returns the submesh BoundingInfo object\r\n * @returns current bounding info (or mesh's one if the submesh is global)\r\n */\r\n public getBoundingInfo(): BoundingInfo {\r\n if (this.IsGlobal || this._mesh.hasThinInstances) {\r\n return this._mesh.getBoundingInfo();\r\n }\r\n\r\n return this._boundingInfo;\r\n }\r\n\r\n /**\r\n * Sets the submesh BoundingInfo\r\n * @param boundingInfo defines the new bounding info to use\r\n * @returns the SubMesh\r\n */\r\n public setBoundingInfo(boundingInfo: BoundingInfo): SubMesh {\r\n this._boundingInfo = boundingInfo;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh of the current submesh\r\n * @returns the parent mesh\r\n */\r\n public getMesh(): AbstractMesh {\r\n return this._mesh;\r\n }\r\n\r\n /**\r\n * Returns the rendering mesh of the submesh\r\n * @returns the rendering mesh (could be different from parent mesh)\r\n */\r\n public getRenderingMesh(): Mesh {\r\n return this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the replacement mesh of the submesh\r\n * @returns the replacement mesh (could be different from parent mesh)\r\n */\r\n public getReplacementMesh(): Nullable {\r\n return this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n }\r\n\r\n /**\r\n * Returns the effective mesh of the submesh\r\n * @returns the effective mesh (could be different from parent mesh)\r\n */\r\n public getEffectiveMesh(): AbstractMesh {\r\n const replacementMesh = this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : null;\r\n\r\n return replacementMesh ? replacementMesh : this._renderingMesh;\r\n }\r\n\r\n /**\r\n * Returns the submesh material\r\n * @param getDefaultMaterial Defines whether or not to get the default material if nothing has been defined.\r\n * @returns null or the current material\r\n */\r\n public getMaterial(getDefaultMaterial = true): Nullable {\r\n const rootMaterial = this._renderingMesh.getMaterialForRenderPass(this._engine.currentRenderPassId) ?? this._renderingMesh.material;\r\n\r\n if (!rootMaterial) {\r\n return getDefaultMaterial ? this._mesh.getScene().defaultMaterial : null;\r\n } else if (this._isMultiMaterial(rootMaterial)) {\r\n const effectiveMaterial = rootMaterial.getSubMaterial(this.materialIndex);\r\n\r\n if (this._currentMaterial !== effectiveMaterial) {\r\n this._currentMaterial = effectiveMaterial;\r\n this.resetDrawCache();\r\n }\r\n\r\n return effectiveMaterial;\r\n }\r\n\r\n return rootMaterial;\r\n }\r\n\r\n private _isMultiMaterial(material: Material): material is MultiMaterial {\r\n return (material as MultiMaterial).getSubMaterial !== undefined;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Sets a new updated BoundingInfo object to the submesh\r\n * @param data defines an optional position array to use to determine the bounding info\r\n * @returns the SubMesh\r\n */\r\n public refreshBoundingInfo(data: Nullable = null): SubMesh {\r\n this._lastColliderWorldVertices = null;\r\n\r\n if (this.IsGlobal || !this._renderingMesh || !this._renderingMesh.geometry) {\r\n return this;\r\n }\r\n\r\n if (!data) {\r\n data = this._renderingMesh.getVerticesData(VertexBuffer.PositionKind);\r\n }\r\n\r\n if (!data) {\r\n this._boundingInfo = this._mesh.getBoundingInfo();\r\n return this;\r\n }\r\n\r\n const indices = this._renderingMesh.getIndices();\r\n let extend: { minimum: Vector3; maximum: Vector3 };\r\n\r\n //is this the only submesh?\r\n if (this.indexStart === 0 && this.indexCount === indices.length) {\r\n const boundingInfo = this._renderingMesh.getBoundingInfo();\r\n\r\n //the rendering mesh's bounding info can be used, it is the standard submesh for all indices.\r\n extend = { minimum: boundingInfo.minimum.clone(), maximum: boundingInfo.maximum.clone() };\r\n } else {\r\n extend = extractMinAndMaxIndexed(data, indices, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias);\r\n }\r\n\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _checkCollision(collider: Collider): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n return boundingInfo._checkCollision(collider);\r\n }\r\n\r\n /**\r\n * Updates the submesh BoundingInfo\r\n * @param world defines the world matrix to use to update the bounding info\r\n * @returns the submesh\r\n */\r\n public updateBoundingInfo(world: DeepImmutable): SubMesh {\r\n let boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n this.refreshBoundingInfo();\r\n boundingInfo = this.getBoundingInfo();\r\n }\r\n if (boundingInfo) {\r\n (boundingInfo).update(world);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box intersects the frustum defined by the passed array of planes.\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is intersecting with the frustum\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isInFrustum(frustumPlanes, this._mesh.cullingStrategy);\r\n }\r\n\r\n /**\r\n * True is the submesh bounding box is completely inside the frustum defined by the passed array of planes\r\n * @param frustumPlanes defines the frustum planes\r\n * @returns true if the submesh is inside the frustum\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Plane[]): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return boundingInfo.isCompletelyInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * Renders the submesh\r\n * @param enableAlphaMode defines if alpha needs to be used\r\n * @returns the submesh\r\n */\r\n public render(enableAlphaMode: boolean): SubMesh {\r\n this._renderingMesh.render(this, enableAlphaMode, this._mesh._internalAbstractMeshDataInfo._actAsRegularMesh ? this._mesh : undefined);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getLinesIndexBuffer(indices: IndicesArray, engine: Engine): DataBuffer {\r\n if (!this._linesIndexBuffer) {\r\n const linesIndices = [];\r\n\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 3) {\r\n linesIndices.push(indices[index], indices[index + 1], indices[index + 1], indices[index + 2], indices[index + 2], indices[index]);\r\n }\r\n\r\n this._linesIndexBuffer = engine.createIndexBuffer(linesIndices);\r\n this._linesIndexCount = linesIndices.length;\r\n }\r\n return this._linesIndexBuffer;\r\n }\r\n\r\n /**\r\n * Checks if the submesh intersects with a ray\r\n * @param ray defines the ray to test\r\n * @returns true is the passed ray intersects the submesh bounding box\r\n */\r\n public canIntersects(ray: Ray): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return false;\r\n }\r\n return ray.intersectsBox(boundingInfo.boundingBox);\r\n }\r\n\r\n /**\r\n * Intersects current submesh with a ray\r\n * @param ray defines the ray to test\r\n * @param positions defines mesh's positions array\r\n * @param indices defines mesh's indices array\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @returns intersection info or null if no intersection\r\n */\r\n public intersects(ray: Ray, positions: Vector3[], indices: IndicesArray, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable {\r\n const material = this.getMaterial();\r\n if (!material) {\r\n return null;\r\n }\r\n let step = 3;\r\n let checkStopper = false;\r\n\r\n switch (material.fillMode) {\r\n case Constants.MATERIAL_PointListDrawMode:\r\n case Constants.MATERIAL_LineLoopDrawMode:\r\n case Constants.MATERIAL_LineStripDrawMode:\r\n case Constants.MATERIAL_TriangleFanDrawMode:\r\n return null;\r\n case Constants.MATERIAL_TriangleStripDrawMode:\r\n step = 1;\r\n checkStopper = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // LineMesh first as it's also a Mesh...\r\n if (material.fillMode === Constants.MATERIAL_LineListDrawMode) {\r\n // Check if mesh is unindexed\r\n if (!indices.length) {\r\n return this._intersectUnIndexedLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n }\r\n return this._intersectLines(ray, positions, indices, (this._mesh as any).intersectionThreshold, fastCheck);\r\n } else {\r\n // Check if mesh is unindexed\r\n if (!indices.length && this._mesh._unIndexed) {\r\n return this._intersectUnIndexedTriangles(ray, positions, indices, fastCheck, trianglePredicate);\r\n }\r\n\r\n return this._intersectTriangles(ray, positions, indices, step, checkStopper, fastCheck, trianglePredicate);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable {\r\n let intersectInfo: Nullable = null;\r\n\r\n // Line test\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount; index += 2) {\r\n const p0 = positions[indices[index]];\r\n const p1 = positions[indices[index + 1]];\r\n\r\n const length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectUnIndexedLines(ray: Ray, positions: Vector3[], indices: IndicesArray, intersectionThreshold: number, fastCheck?: boolean): Nullable {\r\n let intersectInfo: Nullable = null;\r\n\r\n // Line test\r\n for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 2) {\r\n const p0 = positions[index];\r\n const p1 = positions[index + 1];\r\n\r\n const length = ray.intersectionSegment(p0, p1, intersectionThreshold);\r\n if (length < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || length < intersectInfo.distance) {\r\n intersectInfo = new IntersectionInfo(null, null, length);\r\n intersectInfo.faceId = index / 2;\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n step: number,\r\n checkStopper: boolean,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable {\r\n let intersectInfo: Nullable = null;\r\n\r\n // Triangles test\r\n let faceId = -1;\r\n for (let index = this.indexStart; index < this.indexStart + this.indexCount - (3 - step); index += step) {\r\n faceId++;\r\n const indexA = indices[index];\r\n const indexB = indices[index + 1];\r\n const indexC = indices[index + 2];\r\n\r\n if (checkStopper && indexC === 0xffffffff) {\r\n index += 2;\r\n continue;\r\n }\r\n\r\n const p0 = positions[indexA];\r\n const p1 = positions[indexB];\r\n const p2 = positions[indexC];\r\n\r\n // stay defensive and don't check against undefined positions.\r\n if (!p0 || !p1 || !p2) {\r\n continue;\r\n }\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray, indexA, indexB, indexC)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = faceId;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _intersectUnIndexedTriangles(\r\n ray: Ray,\r\n positions: Vector3[],\r\n indices: IndicesArray,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable {\r\n let intersectInfo: Nullable = null;\r\n // Triangles test\r\n for (let index = this.verticesStart; index < this.verticesStart + this.verticesCount; index += 3) {\r\n const p0 = positions[index];\r\n const p1 = positions[index + 1];\r\n const p2 = positions[index + 2];\r\n\r\n if (trianglePredicate && !trianglePredicate(p0, p1, p2, ray, -1, -1, -1)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = ray.intersectsTriangle(p0, p1, p2);\r\n\r\n if (currentIntersectInfo) {\r\n if (currentIntersectInfo.distance < 0) {\r\n continue;\r\n }\r\n\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.faceId = index / 3;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return intersectInfo;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this._linesIndexBuffer) {\r\n this._linesIndexBuffer = null;\r\n }\r\n }\r\n\r\n // Clone\r\n /**\r\n * Creates a new submesh from the passed mesh\r\n * @param newMesh defines the new hosting mesh\r\n * @param newRenderingMesh defines an optional rendering mesh\r\n * @returns the new submesh\r\n */\r\n public clone(newMesh: AbstractMesh, newRenderingMesh?: Mesh): SubMesh {\r\n const result = new SubMesh(this.materialIndex, this.verticesStart, this.verticesCount, this.indexStart, this.indexCount, newMesh, newRenderingMesh, false);\r\n\r\n if (!this.IsGlobal) {\r\n const boundingInfo = this.getBoundingInfo();\r\n\r\n if (!boundingInfo) {\r\n return result;\r\n }\r\n\r\n result._boundingInfo = new BoundingInfo(boundingInfo.minimum, boundingInfo.maximum);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Dispose\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._linesIndexBuffer) {\r\n this._mesh.getScene().getEngine()._releaseBuffer(this._linesIndexBuffer);\r\n this._linesIndexBuffer = null;\r\n }\r\n\r\n // Remove from mesh\r\n const index = this._mesh.subMeshes.indexOf(this);\r\n this._mesh.subMeshes.splice(index, 1);\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns the string \"SubMesh\".\r\n */\r\n public getClassName(): string {\r\n return \"SubMesh\";\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a new submesh from indices data\r\n * @param materialIndex the index of the main mesh material\r\n * @param startIndex the index where to start the copy in the mesh indices array\r\n * @param indexCount the number of indices to copy then from the startIndex\r\n * @param mesh the main mesh to create the submesh from\r\n * @param renderingMesh the optional rendering mesh\r\n * @param createBoundingBox defines if bounding box should be created for this submesh\r\n * @returns a new submesh\r\n */\r\n public static CreateFromIndices(\r\n materialIndex: number,\r\n startIndex: number,\r\n indexCount: number,\r\n mesh: AbstractMesh,\r\n renderingMesh?: Mesh,\r\n createBoundingBox: boolean = true\r\n ): SubMesh {\r\n let minVertexIndex = Number.MAX_VALUE;\r\n let maxVertexIndex = -Number.MAX_VALUE;\r\n\r\n const whatWillRender = renderingMesh || mesh;\r\n const indices = whatWillRender!.getIndices()!;\r\n\r\n for (let index = startIndex; index < startIndex + indexCount; index++) {\r\n const vertexIndex = indices[index];\r\n\r\n if (vertexIndex < minVertexIndex) {\r\n minVertexIndex = vertexIndex;\r\n }\r\n if (vertexIndex > maxVertexIndex) {\r\n maxVertexIndex = vertexIndex;\r\n }\r\n }\r\n\r\n return new SubMesh(materialIndex, minVertexIndex, maxVertexIndex - minVertexIndex + 1, startIndex, indexCount, mesh, renderingMesh, createBoundingBox);\r\n }\r\n}\r\n", "/* eslint-disable jsdoc/require-returns-check */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Nullable, FloatArray, IndicesArray, DeepImmutable } from \"../types\";\r\nimport type { Matrix, Vector2 } from \"../Maths/math.vector\";\r\nimport { Vector3, Vector4, TmpVectors } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport type { Color3 } from \"../Maths/math.color\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { nativeOverride } from \"../Misc/decorators\";\r\nimport type { Coroutine } from \"../Misc/coroutine\";\r\nimport { makeSyncFunction, runCoroutineSync } from \"../Misc/coroutine\";\r\nimport type { ICreateCapsuleOptions } from \"./Builders/capsuleBuilder\";\r\nimport { RuntimeError, ErrorCodes } from \"../Misc/error\";\r\n\r\nimport type { Geometry } from \"../Meshes/geometry\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { SubMesh } from \"./subMesh\";\r\n\r\n/**\r\n * Define an interface for all classes that will get and set the data on vertices\r\n */\r\nexport interface IGetSetVerticesData {\r\n /**\r\n * Gets a boolean indicating if specific vertex data is present\r\n * @param kind defines the vertex data kind to use\r\n * @returns true is data kind is present\r\n */\r\n isVerticesDataPresent(kind: string): boolean;\r\n /**\r\n * Gets a specific vertex data attached to this geometry. Float data is constructed if the vertex buffer data cannot be returned directly.\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns a float array containing vertex data\r\n */\r\n getVerticesData(kind: string, copyWhenShared?: boolean, forceCopy?: boolean): Nullable;\r\n /**\r\n * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices.\r\n * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one.\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns the indices array or an empty array if the mesh has no geometry\r\n */\r\n getIndices(copyWhenShared?: boolean, forceCopy?: boolean): Nullable;\r\n /**\r\n * Set specific vertex data\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @param data defines the vertex data to use\r\n * @param updatable defines if the vertex must be flagged as updatable (false as default)\r\n * @param stride defines the stride to use (0 by default). This value is deduced from the kind value if not specified\r\n */\r\n setVerticesData(kind: string, data: FloatArray, updatable: boolean): void;\r\n /**\r\n * Update a specific associated vertex buffer\r\n * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for \"position\" kind\r\n * @param makeItUnique defines if the geometry associated with the mesh must be cloned to make the change only for this mesh (and not all meshes associated with the same geometry)\r\n */\r\n updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): void;\r\n /**\r\n * Creates a new index buffer\r\n * @param indices defines the indices to store in the index buffer\r\n * @param totalVertices defines the total number of vertices (could be null)\r\n * @param updatable defines if the index buffer must be flagged as updatable (false by default)\r\n */\r\n setIndices(indices: IndicesArray, totalVertices: Nullable, updatable?: boolean): void;\r\n}\r\n\r\n/** Class used to attach material info to sub section of a vertex data class */\r\nexport class VertexDataMaterialInfo {\r\n /** Defines the material index to use */\r\n public materialIndex: number;\r\n /** Defines vertex index start*/\r\n public verticesStart: number;\r\n /** Defines vertices count */\r\n public verticesCount: number;\r\n /** Defines index start */\r\n public indexStart: number;\r\n /** Defines indices count */\r\n public indexCount: number;\r\n}\r\n\r\n/**\r\n * This class contains the various kinds of data on every vertex of a mesh used in determining its shape and appearance\r\n */\r\nexport class VertexData {\r\n /**\r\n * Mesh side orientation : usually the external or front surface\r\n */\r\n public static readonly FRONTSIDE = 0;\r\n /**\r\n * Mesh side orientation : usually the internal or back surface\r\n */\r\n public static readonly BACKSIDE = 1;\r\n /**\r\n * Mesh side orientation : both internal and external or front and back surfaces\r\n */\r\n public static readonly DOUBLESIDE = 2;\r\n /**\r\n * Mesh side orientation : by default, `FRONTSIDE`\r\n */\r\n public static readonly DEFAULTSIDE = 0;\r\n\r\n private static _UniqueIDGenerator = 0;\r\n\r\n /**\r\n * An array of the x, y, z position of each vertex [...., x, y, z, .....]\r\n */\r\n public positions: Nullable;\r\n\r\n /**\r\n * An array of the x, y, z normal vector of each vertex [...., x, y, z, .....]\r\n */\r\n public normals: Nullable;\r\n\r\n /**\r\n * An array of the x, y, z tangent vector of each vertex [...., x, y, z, .....]\r\n */\r\n public tangents: Nullable;\r\n\r\n /**\r\n * An array of u,v which maps a texture image onto each vertex [...., u, v, .....]\r\n */\r\n public uvs: Nullable;\r\n\r\n /**\r\n * A second array of u,v which maps a texture image onto each vertex [...., u, v, .....]\r\n */\r\n public uvs2: Nullable;\r\n\r\n /**\r\n * A third array of u,v which maps a texture image onto each vertex [...., u, v, .....]\r\n */\r\n public uvs3: Nullable;\r\n\r\n /**\r\n * A fourth array of u,v which maps a texture image onto each vertex [...., u, v, .....]\r\n */\r\n public uvs4: Nullable;\r\n\r\n /**\r\n * A fifth array of u,v which maps a texture image onto each vertex [...., u, v, .....]\r\n */\r\n public uvs5: Nullable;\r\n\r\n /**\r\n * A sixth array of u,v which maps a texture image onto each vertex [...., u, v, .....]\r\n */\r\n public uvs6: Nullable;\r\n\r\n /**\r\n * An array of the r, g, b, a, color of each vertex [...., r, g, b, a, .....]\r\n */\r\n public colors: Nullable;\r\n\r\n /**\r\n * An array containing the list of indices to the array of matrices produced by bones, each vertex have up to 4 indices (8 if the matricesIndicesExtra is set).\r\n */\r\n public matricesIndices: Nullable;\r\n\r\n /**\r\n * An array containing the list of weights defining the weight of each indexed matrix in the final computation\r\n */\r\n public matricesWeights: Nullable;\r\n\r\n /**\r\n * An array extending the number of possible indices\r\n */\r\n public matricesIndicesExtra: Nullable;\r\n\r\n /**\r\n * An array extending the number of possible weights when the number of indices is extended\r\n */\r\n public matricesWeightsExtra: Nullable;\r\n\r\n /**\r\n * An array of i, j, k the three vertex indices required for each triangular facet [...., i, j, k .....]\r\n */\r\n public indices: Nullable;\r\n\r\n /**\r\n * An array defining material association for sub sections of the vertex data\r\n */\r\n public materialInfos: Nullable>;\r\n\r\n /**\r\n * Gets the unique ID of this vertex Data\r\n */\r\n public uniqueId = 0;\r\n\r\n /**\r\n * Metadata used to store contextual values\r\n */\r\n public metadata: any = {};\r\n\r\n /**\r\n * Gets or sets a value indicating that the mesh must be flagged with hasVertexAlpha = true\r\n */\r\n public hasVertexAlpha: boolean;\r\n\r\n /**\r\n * Creates a new VertexData\r\n */\r\n public constructor() {\r\n this.uniqueId = VertexData._UniqueIDGenerator;\r\n VertexData._UniqueIDGenerator++;\r\n }\r\n\r\n /**\r\n * Uses the passed data array to set the set the values for the specified kind of data\r\n * @param data a linear array of floating numbers\r\n * @param kind the type of data that is being set, eg positions, colors etc\r\n */\r\n public set(data: FloatArray, kind: string) {\r\n if (!data.length) {\r\n Logger.Warn(`Setting vertex data kind '${kind}' with an empty array`);\r\n }\r\n\r\n switch (kind) {\r\n case VertexBuffer.PositionKind:\r\n this.positions = data;\r\n break;\r\n case VertexBuffer.NormalKind:\r\n this.normals = data;\r\n break;\r\n case VertexBuffer.TangentKind:\r\n this.tangents = data;\r\n break;\r\n case VertexBuffer.UVKind:\r\n this.uvs = data;\r\n break;\r\n case VertexBuffer.UV2Kind:\r\n this.uvs2 = data;\r\n break;\r\n case VertexBuffer.UV3Kind:\r\n this.uvs3 = data;\r\n break;\r\n case VertexBuffer.UV4Kind:\r\n this.uvs4 = data;\r\n break;\r\n case VertexBuffer.UV5Kind:\r\n this.uvs5 = data;\r\n break;\r\n case VertexBuffer.UV6Kind:\r\n this.uvs6 = data;\r\n break;\r\n case VertexBuffer.ColorKind:\r\n this.colors = data;\r\n break;\r\n case VertexBuffer.MatricesIndicesKind:\r\n this.matricesIndices = data;\r\n break;\r\n case VertexBuffer.MatricesWeightsKind:\r\n this.matricesWeights = data;\r\n break;\r\n case VertexBuffer.MatricesIndicesExtraKind:\r\n this.matricesIndicesExtra = data;\r\n break;\r\n case VertexBuffer.MatricesWeightsExtraKind:\r\n this.matricesWeightsExtra = data;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Associates the vertexData to the passed Mesh.\r\n * Sets it as updatable or not (default `false`)\r\n * @param mesh the mesh the vertexData is applied to\r\n * @param updatable when used and having the value true allows new data to update the vertexData\r\n * @returns the VertexData\r\n */\r\n public applyToMesh(mesh: Mesh, updatable?: boolean): VertexData {\r\n this._applyTo(mesh, updatable, false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Associates the vertexData to the passed Geometry.\r\n * Sets it as updatable or not (default `false`)\r\n * @param geometry the geometry the vertexData is applied to\r\n * @param updatable when used and having the value true allows new data to update the vertexData\r\n * @returns VertexData\r\n */\r\n public applyToGeometry(geometry: Geometry, updatable?: boolean): VertexData {\r\n this._applyTo(geometry, updatable, false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the associated mesh\r\n * @param mesh the mesh to be updated\r\n * @returns VertexData\r\n */\r\n public updateMesh(mesh: Mesh): VertexData {\r\n this._update(mesh);\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the associated geometry\r\n * @param geometry the geometry to be updated\r\n * @returns VertexData.\r\n */\r\n public updateGeometry(geometry: Geometry): VertexData {\r\n this._update(geometry);\r\n return this;\r\n }\r\n\r\n private readonly _applyTo = makeSyncFunction(this._applyToCoroutine.bind(this));\r\n\r\n /**\r\n * @internal\r\n */\r\n public *_applyToCoroutine(meshOrGeometry: IGetSetVerticesData, updatable: boolean = false, isAsync: boolean): Coroutine {\r\n if (this.positions) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.PositionKind, this.positions, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.normals) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.NormalKind, this.normals, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.tangents) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.TangentKind, this.tangents, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.uvs) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.UVKind, this.uvs, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.uvs2) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.UV2Kind, this.uvs2, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.uvs3) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.UV3Kind, this.uvs3, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.uvs4) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.UV4Kind, this.uvs4, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.uvs5) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.UV5Kind, this.uvs5, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.uvs6) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.UV6Kind, this.uvs6, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.colors) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.ColorKind, this.colors, updatable);\r\n if (this.hasVertexAlpha && (meshOrGeometry as any).hasVertexAlpha !== undefined) {\r\n (meshOrGeometry as any).hasVertexAlpha = true;\r\n }\r\n\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.matricesIndices) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.MatricesIndicesKind, this.matricesIndices, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.matricesWeights) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.MatricesWeightsKind, this.matricesWeights, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.matricesIndicesExtra) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.matricesWeightsExtra) {\r\n meshOrGeometry.setVerticesData(VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n if (this.indices) {\r\n meshOrGeometry.setIndices(this.indices, null, updatable);\r\n if (isAsync) {\r\n yield;\r\n }\r\n } else {\r\n meshOrGeometry.setIndices([], null);\r\n }\r\n\r\n if ((meshOrGeometry as Mesh).subMeshes && this.materialInfos && this.materialInfos.length > 1) {\r\n const mesh = meshOrGeometry as Mesh;\r\n mesh.subMeshes = [];\r\n for (const matInfo of this.materialInfos) {\r\n new SubMesh(matInfo.materialIndex, matInfo.verticesStart, matInfo.verticesCount, matInfo.indexStart, matInfo.indexCount, mesh);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private _update(meshOrGeometry: IGetSetVerticesData, updateExtends?: boolean, makeItUnique?: boolean): VertexData {\r\n if (this.positions) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.PositionKind, this.positions, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.normals) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.NormalKind, this.normals, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.tangents) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.TangentKind, this.tangents, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.uvs) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.UVKind, this.uvs, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.uvs2) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.UV2Kind, this.uvs2, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.uvs3) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.UV3Kind, this.uvs3, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.uvs4) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.UV4Kind, this.uvs4, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.uvs5) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.UV5Kind, this.uvs5, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.uvs6) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.UV6Kind, this.uvs6, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.colors) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.ColorKind, this.colors, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.matricesIndices) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.MatricesIndicesKind, this.matricesIndices, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.matricesWeights) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.MatricesWeightsKind, this.matricesWeights, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.matricesIndicesExtra) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.matricesWeightsExtra) {\r\n meshOrGeometry.updateVerticesData(VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra, updateExtends, makeItUnique);\r\n }\r\n\r\n if (this.indices) {\r\n meshOrGeometry.setIndices(this.indices, null);\r\n }\r\n return this;\r\n }\r\n\r\n @nativeOverride.filter((...[coordinates]: Parameters) => !Array.isArray(coordinates))\r\n private static _TransformVector3Coordinates(coordinates: FloatArray, transformation: DeepImmutable, offset = 0, length = coordinates.length) {\r\n const coordinate = TmpVectors.Vector3[0];\r\n const transformedCoordinate = TmpVectors.Vector3[1];\r\n for (let index = offset; index < offset + length; index += 3) {\r\n Vector3.FromArrayToRef(coordinates, index, coordinate);\r\n Vector3.TransformCoordinatesToRef(coordinate, transformation, transformedCoordinate);\r\n coordinates[index] = transformedCoordinate.x;\r\n coordinates[index + 1] = transformedCoordinate.y;\r\n coordinates[index + 2] = transformedCoordinate.z;\r\n }\r\n }\r\n\r\n @nativeOverride.filter((...[normals]: Parameters) => !Array.isArray(normals))\r\n private static _TransformVector3Normals(normals: FloatArray, transformation: DeepImmutable, offset = 0, length = normals.length) {\r\n const normal = TmpVectors.Vector3[0];\r\n const transformedNormal = TmpVectors.Vector3[1];\r\n for (let index = offset; index < offset + length; index += 3) {\r\n Vector3.FromArrayToRef(normals, index, normal);\r\n Vector3.TransformNormalToRef(normal, transformation, transformedNormal);\r\n normals[index] = transformedNormal.x;\r\n normals[index + 1] = transformedNormal.y;\r\n normals[index + 2] = transformedNormal.z;\r\n }\r\n }\r\n\r\n @nativeOverride.filter((...[normals]: Parameters) => !Array.isArray(normals))\r\n private static _TransformVector4Normals(normals: FloatArray, transformation: DeepImmutable, offset = 0, length = normals.length) {\r\n const normal = TmpVectors.Vector4[0];\r\n const transformedNormal = TmpVectors.Vector4[1];\r\n for (let index = offset; index < offset + length; index += 4) {\r\n Vector4.FromArrayToRef(normals, index, normal);\r\n Vector4.TransformNormalToRef(normal, transformation, transformedNormal);\r\n normals[index] = transformedNormal.x;\r\n normals[index + 1] = transformedNormal.y;\r\n normals[index + 2] = transformedNormal.z;\r\n normals[index + 3] = transformedNormal.w;\r\n }\r\n }\r\n\r\n @nativeOverride.filter((...[indices]: Parameters) => !Array.isArray(indices))\r\n private static _FlipFaces(indices: IndicesArray, offset = 0, length = indices.length) {\r\n for (let index = offset; index < offset + length; index += 3) {\r\n const tmp = indices[index + 1];\r\n indices[index + 1] = indices[index + 2];\r\n indices[index + 2] = tmp;\r\n }\r\n }\r\n\r\n /**\r\n * Transforms each position and each normal of the vertexData according to the passed Matrix\r\n * @param matrix the transforming matrix\r\n * @returns the VertexData\r\n */\r\n public transform(matrix: Matrix): VertexData {\r\n const flip = matrix.determinant() < 0;\r\n if (this.positions) {\r\n VertexData._TransformVector3Coordinates(this.positions, matrix);\r\n }\r\n\r\n if (this.normals) {\r\n VertexData._TransformVector3Normals(this.normals, matrix);\r\n }\r\n\r\n if (this.tangents) {\r\n VertexData._TransformVector4Normals(this.tangents, matrix);\r\n }\r\n\r\n if (flip && this.indices) {\r\n VertexData._FlipFaces(this.indices);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Generates an array of vertex data where each vertex data only has one material info\r\n * @returns An array of VertexData\r\n */\r\n public splitBasedOnMaterialID() {\r\n if (!this.materialInfos || this.materialInfos.length < 2) {\r\n return [this];\r\n }\r\n\r\n const result: VertexData[] = [];\r\n for (const materialInfo of this.materialInfos) {\r\n const vertexData = new VertexData();\r\n\r\n if (this.positions) {\r\n vertexData.positions = this.positions.slice(materialInfo.verticesStart * 3, (materialInfo.verticesCount + materialInfo.verticesStart) * 3);\r\n }\r\n\r\n if (this.normals) {\r\n vertexData.normals = this.normals.slice(materialInfo.verticesStart * 3, (materialInfo.verticesCount + materialInfo.verticesStart) * 3);\r\n }\r\n\r\n if (this.tangents) {\r\n vertexData.tangents = this.tangents.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4);\r\n }\r\n\r\n if (this.colors) {\r\n vertexData.colors = this.colors.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4);\r\n }\r\n\r\n if (this.uvs) {\r\n vertexData.uvs = this.uvs.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2);\r\n }\r\n\r\n if (this.uvs2) {\r\n vertexData.uvs2 = this.uvs2.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2);\r\n }\r\n\r\n if (this.uvs3) {\r\n vertexData.uvs3 = this.uvs3.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2);\r\n }\r\n\r\n if (this.uvs4) {\r\n vertexData.uvs4 = this.uvs4.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2);\r\n }\r\n\r\n if (this.uvs5) {\r\n vertexData.uvs5 = this.uvs5.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2);\r\n }\r\n\r\n if (this.uvs6) {\r\n vertexData.uvs6 = this.uvs6.slice(materialInfo.verticesStart * 2, (materialInfo.verticesCount + materialInfo.verticesStart) * 2);\r\n }\r\n\r\n if (this.matricesIndices) {\r\n vertexData.matricesIndices = this.matricesIndices.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4);\r\n }\r\n\r\n if (this.matricesIndicesExtra) {\r\n vertexData.matricesIndicesExtra = this.matricesIndicesExtra.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4);\r\n }\r\n\r\n if (this.matricesWeights) {\r\n vertexData.matricesWeights = this.matricesWeights.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4);\r\n }\r\n\r\n if (this.matricesWeightsExtra) {\r\n vertexData.matricesWeightsExtra = this.matricesWeightsExtra.slice(materialInfo.verticesStart * 4, (materialInfo.verticesCount + materialInfo.verticesStart) * 4);\r\n }\r\n\r\n if (this.indices) {\r\n vertexData.indices = [];\r\n for (let index = materialInfo.indexStart; index < materialInfo.indexStart + materialInfo.indexCount; index++) {\r\n vertexData.indices.push(this.indices[index] - materialInfo.verticesStart);\r\n }\r\n }\r\n\r\n const newMaterialInfo = new VertexDataMaterialInfo();\r\n newMaterialInfo.indexStart = 0;\r\n newMaterialInfo.indexCount = vertexData.indices ? vertexData.indices.length : 0;\r\n newMaterialInfo.materialIndex = materialInfo.materialIndex;\r\n newMaterialInfo.verticesStart = 0;\r\n newMaterialInfo.verticesCount = (vertexData.positions ? vertexData.positions.length : 0) / 3;\r\n vertexData.materialInfos = [newMaterialInfo];\r\n\r\n result.push(vertexData);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Merges the passed VertexData into the current one\r\n * @param others the VertexData to be merged into the current one\r\n * @param use32BitsIndices defines a boolean indicating if indices must be store in a 32 bits array\r\n * @param forceCloneIndices defines a boolean indicating if indices are forced to be cloned\r\n * @param mergeMaterialIds defines a boolean indicating if we need to merge the material infos\r\n * @param enableCompletion defines a boolean indicating if the vertex data should be completed to be compatible\r\n * @returns the modified VertexData\r\n */\r\n public merge(others: VertexData | VertexData[], use32BitsIndices = false, forceCloneIndices = false, mergeMaterialIds = false, enableCompletion = false) {\r\n const vertexDatas: { vertexData: VertexData; transform?: Matrix }[] = Array.isArray(others)\r\n ? others.map((other) => {\r\n return { vertexData: other };\r\n })\r\n : [{ vertexData: others }];\r\n return runCoroutineSync(this._mergeCoroutine(undefined, vertexDatas, use32BitsIndices, false, forceCloneIndices, mergeMaterialIds, enableCompletion));\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public *_mergeCoroutine(\r\n transform: Matrix | undefined,\r\n vertexDatas: { vertexData: VertexData; transform?: Matrix }[],\r\n use32BitsIndices = false,\r\n isAsync: boolean,\r\n forceCloneIndices: boolean,\r\n mergeMaterialIds = false,\r\n enableCompletion = false\r\n ): Coroutine {\r\n this._validate();\r\n\r\n let others = vertexDatas.map((vertexData) => vertexData.vertexData);\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let root: VertexData = this;\r\n\r\n if (enableCompletion) {\r\n // First let's make sure we have the max set of attributes on the main vertex data\r\n for (const other of others) {\r\n if (!other) {\r\n continue;\r\n }\r\n\r\n other._validate();\r\n\r\n if (!this.normals && other.normals) {\r\n this.normals = new Float32Array(this.positions!.length);\r\n }\r\n\r\n if (!this.tangents && other.tangents) {\r\n this.tangents = new Float32Array((this.positions!.length / 3) * 4);\r\n }\r\n\r\n if (!this.uvs && other.uvs) {\r\n this.uvs = new Float32Array((this.positions!.length / 3) * 2);\r\n }\r\n\r\n if (!this.uvs2 && other.uvs2) {\r\n this.uvs2 = new Float32Array((this.positions!.length / 3) * 2);\r\n }\r\n\r\n if (!this.uvs3 && other.uvs3) {\r\n this.uvs3 = new Float32Array((this.positions!.length / 3) * 2);\r\n }\r\n\r\n if (!this.uvs4 && other.uvs4) {\r\n this.uvs4 = new Float32Array((this.positions!.length / 3) * 2);\r\n }\r\n\r\n if (!this.uvs5 && other.uvs5) {\r\n this.uvs5 = new Float32Array((this.positions!.length / 3) * 2);\r\n }\r\n\r\n if (!this.uvs6 && other.uvs6) {\r\n this.uvs6 = new Float32Array((this.positions!.length / 3) * 2);\r\n }\r\n\r\n if (!this.colors && other.colors) {\r\n this.colors = new Float32Array((this.positions!.length / 3) * 4);\r\n this.colors.fill(1); // Set to white by default\r\n }\r\n\r\n if (!this.matricesIndices && other.matricesIndices) {\r\n this.matricesIndices = new Float32Array((this.positions!.length / 3) * 4);\r\n }\r\n\r\n if (!this.matricesWeights && other.matricesWeights) {\r\n this.matricesWeights = new Float32Array((this.positions!.length / 3) * 4);\r\n }\r\n\r\n if (!this.matricesIndicesExtra && other.matricesIndicesExtra) {\r\n this.matricesIndicesExtra = new Float32Array((this.positions!.length / 3) * 4);\r\n }\r\n\r\n if (!this.matricesWeightsExtra && other.matricesWeightsExtra) {\r\n this.matricesWeightsExtra = new Float32Array((this.positions!.length / 3) * 4);\r\n }\r\n }\r\n }\r\n\r\n for (const other of others) {\r\n if (!other) {\r\n continue;\r\n }\r\n\r\n if (!enableCompletion) {\r\n other._validate();\r\n if (\r\n !this.normals !== !other.normals ||\r\n !this.tangents !== !other.tangents ||\r\n !this.uvs !== !other.uvs ||\r\n !this.uvs2 !== !other.uvs2 ||\r\n !this.uvs3 !== !other.uvs3 ||\r\n !this.uvs4 !== !other.uvs4 ||\r\n !this.uvs5 !== !other.uvs5 ||\r\n !this.uvs6 !== !other.uvs6 ||\r\n !this.colors !== !other.colors ||\r\n !this.matricesIndices !== !other.matricesIndices ||\r\n !this.matricesWeights !== !other.matricesWeights ||\r\n !this.matricesIndicesExtra !== !other.matricesIndicesExtra ||\r\n !this.matricesWeightsExtra !== !other.matricesWeightsExtra\r\n ) {\r\n throw new Error(\"Cannot merge vertex data that do not have the same set of attributes\");\r\n }\r\n } else {\r\n // Align the others with main set of attributes\r\n if (this.normals && !other.normals) {\r\n other.normals = new Float32Array(other.positions!.length);\r\n }\r\n\r\n if (this.tangents && !other.tangents) {\r\n other.tangents = new Float32Array((other.positions!.length / 3) * 4);\r\n }\r\n\r\n if (this.uvs && !other.uvs) {\r\n other.uvs = new Float32Array((other.positions!.length / 3) * 2);\r\n }\r\n\r\n if (this.uvs2 && !other.uvs2) {\r\n other.uvs2 = new Float32Array((other.positions!.length / 3) * 2);\r\n }\r\n\r\n if (this.uvs3 && !other.uvs3) {\r\n other.uvs3 = new Float32Array((other.positions!.length / 3) * 2);\r\n }\r\n\r\n if (this.uvs4 && !other.uvs4) {\r\n other.uvs4 = new Float32Array((other.positions!.length / 3) * 2);\r\n }\r\n if (this.uvs5 && !other.uvs5) {\r\n other.uvs5 = new Float32Array((other.positions!.length / 3) * 2);\r\n }\r\n\r\n if (this.uvs6 && !other.uvs6) {\r\n other.uvs6 = new Float32Array((other.positions!.length / 3) * 2);\r\n }\r\n\r\n if (this.colors && !other.colors) {\r\n other.colors = new Float32Array((other.positions!.length / 3) * 4);\r\n other.colors.fill(1); // Set to white by default\r\n }\r\n\r\n if (this.matricesIndices && !other.matricesIndices) {\r\n other.matricesIndices = new Float32Array((other.positions!.length / 3) * 4);\r\n }\r\n if (this.matricesWeights && !other.matricesWeights) {\r\n other.matricesWeights = new Float32Array((other.positions!.length / 3) * 4);\r\n }\r\n\r\n if (this.matricesIndicesExtra && !other.matricesIndicesExtra) {\r\n other.matricesIndicesExtra = new Float32Array((other.positions!.length / 3) * 4);\r\n }\r\n\r\n if (this.matricesWeightsExtra && !other.matricesWeightsExtra) {\r\n other.matricesWeightsExtra = new Float32Array((other.positions!.length / 3) * 4);\r\n }\r\n }\r\n }\r\n\r\n if (mergeMaterialIds) {\r\n // Merge material infos\r\n let materialIndex = 0;\r\n let indexOffset = 0;\r\n let vertexOffset = 0;\r\n const materialInfos: VertexDataMaterialInfo[] = [];\r\n let currentMaterialInfo: Nullable = null;\r\n const vertexDataList: { vertexData: VertexData; transform?: Matrix }[] = [];\r\n\r\n // We need to split vertexData with more than one materialInfo\r\n for (const split of this.splitBasedOnMaterialID()) {\r\n vertexDataList.push({ vertexData: split, transform: transform });\r\n }\r\n\r\n for (const data of vertexDatas) {\r\n if (!data.vertexData) {\r\n continue;\r\n }\r\n for (const split of data.vertexData.splitBasedOnMaterialID()) {\r\n vertexDataList.push({ vertexData: split, transform: data.transform });\r\n }\r\n }\r\n\r\n // Sort by material IDs\r\n vertexDataList.sort((a, b) => {\r\n const matInfoA = a.vertexData.materialInfos ? a.vertexData.materialInfos[0].materialIndex : 0;\r\n const matInfoB = b.vertexData.materialInfos ? b.vertexData.materialInfos[0].materialIndex : 0;\r\n\r\n if (matInfoA > matInfoB) {\r\n return 1;\r\n }\r\n\r\n if (matInfoA === matInfoB) {\r\n return 0;\r\n }\r\n\r\n return -1;\r\n });\r\n\r\n // Build the new material info\r\n for (const vertexDataSource of vertexDataList) {\r\n const vertexData = vertexDataSource.vertexData;\r\n if (vertexData.materialInfos) {\r\n materialIndex = vertexData.materialInfos[0].materialIndex;\r\n } else {\r\n materialIndex = 0;\r\n }\r\n if (currentMaterialInfo && currentMaterialInfo.materialIndex === materialIndex) {\r\n currentMaterialInfo.indexCount += vertexData.indices!.length;\r\n currentMaterialInfo.verticesCount += vertexData.positions!.length / 3;\r\n } else {\r\n const materialInfo = new VertexDataMaterialInfo();\r\n materialInfo.materialIndex = materialIndex;\r\n materialInfo.indexStart = indexOffset;\r\n materialInfo.indexCount = vertexData.indices!.length;\r\n materialInfo.verticesStart = vertexOffset;\r\n materialInfo.verticesCount = vertexData.positions!.length / 3;\r\n\r\n materialInfos.push(materialInfo);\r\n currentMaterialInfo = materialInfo;\r\n }\r\n indexOffset += vertexData.indices!.length;\r\n vertexOffset += vertexData.positions!.length / 3;\r\n }\r\n // Extract sorted values\r\n const first = vertexDataList.splice(0, 1)[0];\r\n root = first.vertexData;\r\n transform = first.transform;\r\n others = vertexDataList.map((v) => v.vertexData);\r\n vertexDatas = vertexDataList;\r\n\r\n this.materialInfos = materialInfos;\r\n }\r\n\r\n // Merge geometries\r\n const totalIndices = others.reduce((indexSum, vertexData) => indexSum + (vertexData.indices?.length ?? 0), root.indices?.length ?? 0);\r\n const sliceIndices = forceCloneIndices || others.some((vertexData) => vertexData.indices === root.indices);\r\n let indices = sliceIndices ? root.indices?.slice() : root.indices;\r\n if (totalIndices > 0) {\r\n let indicesOffset = indices?.length ?? 0;\r\n\r\n if (!indices) {\r\n indices = new Array(totalIndices);\r\n }\r\n\r\n if (indices.length !== totalIndices) {\r\n if (Array.isArray(indices)) {\r\n indices.length = totalIndices;\r\n } else {\r\n const temp = use32BitsIndices || indices instanceof Uint32Array ? new Uint32Array(totalIndices) : new Uint16Array(totalIndices);\r\n temp.set(indices);\r\n indices = temp;\r\n }\r\n\r\n if (transform && transform.determinant() < 0) {\r\n VertexData._FlipFaces(indices, 0, indicesOffset);\r\n }\r\n }\r\n\r\n let positionsOffset = root.positions ? root.positions.length / 3 : 0;\r\n for (const { vertexData: other, transform } of vertexDatas) {\r\n if (other.indices) {\r\n for (let index = 0; index < other.indices.length; index++) {\r\n indices[indicesOffset + index] = other.indices[index] + positionsOffset;\r\n }\r\n\r\n if (transform && transform.determinant() < 0) {\r\n VertexData._FlipFaces(indices, indicesOffset, other.indices.length);\r\n }\r\n\r\n // The call to _validate already checked for positions\r\n positionsOffset += other.positions!.length / 3;\r\n indicesOffset += other.indices.length;\r\n\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.indices = indices!;\r\n\r\n this.positions = VertexData._MergeElement(\r\n VertexBuffer.PositionKind,\r\n root.positions,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.positions, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n if (root.normals) {\r\n this.normals = VertexData._MergeElement(\r\n VertexBuffer.NormalKind,\r\n root.normals,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.normals, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.tangents) {\r\n this.tangents = VertexData._MergeElement(\r\n VertexBuffer.TangentKind,\r\n root.tangents,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.tangents, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.uvs) {\r\n this.uvs = VertexData._MergeElement(\r\n VertexBuffer.UVKind,\r\n root.uvs,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.uvs, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.uvs2) {\r\n this.uvs2 = VertexData._MergeElement(\r\n VertexBuffer.UV2Kind,\r\n root.uvs2,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.uvs2, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.uvs3) {\r\n this.uvs3 = VertexData._MergeElement(\r\n VertexBuffer.UV3Kind,\r\n root.uvs3,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.uvs3, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.uvs4) {\r\n this.uvs4 = VertexData._MergeElement(\r\n VertexBuffer.UV4Kind,\r\n root.uvs4,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.uvs4, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.uvs5) {\r\n this.uvs5 = VertexData._MergeElement(\r\n VertexBuffer.UV5Kind,\r\n root.uvs5,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.uvs5, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.uvs6) {\r\n this.uvs6 = VertexData._MergeElement(\r\n VertexBuffer.UV6Kind,\r\n root.uvs6,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.uvs6, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.colors) {\r\n this.colors = VertexData._MergeElement(\r\n VertexBuffer.ColorKind,\r\n root.colors,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.colors, other.transform])\r\n );\r\n if (root.hasVertexAlpha !== undefined || vertexDatas.some((other) => other.vertexData.hasVertexAlpha !== undefined)) {\r\n this.hasVertexAlpha = root.hasVertexAlpha || vertexDatas.some((other) => other.vertexData.hasVertexAlpha);\r\n }\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.matricesIndices) {\r\n this.matricesIndices = VertexData._MergeElement(\r\n VertexBuffer.MatricesIndicesKind,\r\n root.matricesIndices,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.matricesIndices, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.matricesWeights) {\r\n this.matricesWeights = VertexData._MergeElement(\r\n VertexBuffer.MatricesWeightsKind,\r\n root.matricesWeights,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.matricesWeights, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.matricesIndicesExtra) {\r\n this.matricesIndicesExtra = VertexData._MergeElement(\r\n VertexBuffer.MatricesIndicesExtraKind,\r\n root.matricesIndicesExtra,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.matricesIndicesExtra, other.transform])\r\n );\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n if (root.matricesWeightsExtra) {\r\n this.matricesWeightsExtra = VertexData._MergeElement(\r\n VertexBuffer.MatricesWeightsExtraKind,\r\n root.matricesWeightsExtra,\r\n transform,\r\n vertexDatas.map((other) => [other.vertexData.matricesWeightsExtra, other.transform])\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private static _MergeElement(\r\n kind: string,\r\n source: Nullable,\r\n transform: Matrix | undefined,\r\n others: readonly (readonly [element: Nullable, transform?: Matrix])[]\r\n ): Nullable {\r\n const nonNullOthers = others.filter((other): other is [element: FloatArray, transform?: Matrix] => other[0] !== null && other[0] !== undefined);\r\n\r\n // If there is no source to copy and no other non-null sources then skip this element.\r\n if (!source && nonNullOthers.length == 0) {\r\n return source;\r\n }\r\n\r\n if (!source) {\r\n return this._MergeElement(kind, nonNullOthers[0][0], nonNullOthers[0][1], nonNullOthers.slice(1));\r\n }\r\n\r\n const len = nonNullOthers.reduce((sumLen, elements) => sumLen + elements[0].length, source.length);\r\n\r\n const transformRange =\r\n kind === VertexBuffer.PositionKind\r\n ? VertexData._TransformVector3Coordinates\r\n : kind === VertexBuffer.NormalKind\r\n ? VertexData._TransformVector3Normals\r\n : kind === VertexBuffer.TangentKind\r\n ? VertexData._TransformVector4Normals\r\n : () => {};\r\n\r\n if (source instanceof Float32Array) {\r\n // use non-loop method when the source is Float32Array\r\n const ret32 = new Float32Array(len);\r\n ret32.set(source);\r\n transform && transformRange(ret32, transform, 0, source.length);\r\n\r\n let offset = source.length;\r\n for (const [vertexData, transform] of nonNullOthers) {\r\n ret32.set(vertexData, offset);\r\n transform && transformRange(ret32, transform, offset, vertexData.length);\r\n offset += vertexData.length;\r\n }\r\n return ret32;\r\n } else {\r\n // don't use concat as it is super slow, just loop for other cases\r\n const ret = new Array(len);\r\n for (let i = 0; i < source.length; i++) {\r\n ret[i] = source[i];\r\n }\r\n transform && transformRange(ret, transform, 0, source.length);\r\n\r\n let offset = source.length;\r\n for (const [vertexData, transform] of nonNullOthers) {\r\n for (let i = 0; i < vertexData.length; i++) {\r\n ret[offset + i] = vertexData[i];\r\n }\r\n transform && transformRange(ret, transform, offset, vertexData.length);\r\n offset += vertexData.length;\r\n }\r\n return ret;\r\n }\r\n }\r\n\r\n private _validate(): void {\r\n if (!this.positions) {\r\n throw new RuntimeError(\"Positions are required\", ErrorCodes.MeshInvalidPositionsError);\r\n }\r\n\r\n const getElementCount = (kind: string, values: FloatArray) => {\r\n const stride = VertexBuffer.DeduceStride(kind);\r\n if (values.length % stride !== 0) {\r\n throw new Error(\"The \" + kind + \"s array count must be a multiple of \" + stride);\r\n }\r\n\r\n return values.length / stride;\r\n };\r\n\r\n const positionsElementCount = getElementCount(VertexBuffer.PositionKind, this.positions);\r\n\r\n const validateElementCount = (kind: string, values: FloatArray) => {\r\n const elementCount = getElementCount(kind, values);\r\n if (elementCount !== positionsElementCount) {\r\n throw new Error(\"The \" + kind + \"s element count (\" + elementCount + \") does not match the positions count (\" + positionsElementCount + \")\");\r\n }\r\n };\r\n\r\n if (this.normals) {\r\n validateElementCount(VertexBuffer.NormalKind, this.normals);\r\n }\r\n if (this.tangents) {\r\n validateElementCount(VertexBuffer.TangentKind, this.tangents);\r\n }\r\n if (this.uvs) {\r\n validateElementCount(VertexBuffer.UVKind, this.uvs);\r\n }\r\n if (this.uvs2) {\r\n validateElementCount(VertexBuffer.UV2Kind, this.uvs2);\r\n }\r\n if (this.uvs3) {\r\n validateElementCount(VertexBuffer.UV3Kind, this.uvs3);\r\n }\r\n if (this.uvs4) {\r\n validateElementCount(VertexBuffer.UV4Kind, this.uvs4);\r\n }\r\n if (this.uvs5) {\r\n validateElementCount(VertexBuffer.UV5Kind, this.uvs5);\r\n }\r\n if (this.uvs6) {\r\n validateElementCount(VertexBuffer.UV6Kind, this.uvs6);\r\n }\r\n if (this.colors) {\r\n validateElementCount(VertexBuffer.ColorKind, this.colors);\r\n }\r\n if (this.matricesIndices) {\r\n validateElementCount(VertexBuffer.MatricesIndicesKind, this.matricesIndices);\r\n }\r\n if (this.matricesWeights) {\r\n validateElementCount(VertexBuffer.MatricesWeightsKind, this.matricesWeights);\r\n }\r\n if (this.matricesIndicesExtra) {\r\n validateElementCount(VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra);\r\n }\r\n if (this.matricesWeightsExtra) {\r\n validateElementCount(VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra);\r\n }\r\n }\r\n\r\n /**\r\n * Clone the current vertex data\r\n * @returns a copy of the current data\r\n */\r\n public clone() {\r\n const serializationObject = this.serialize();\r\n return VertexData.Parse(serializationObject);\r\n }\r\n\r\n /**\r\n * Serializes the VertexData\r\n * @returns a serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n if (this.positions) {\r\n serializationObject.positions = Array.from(this.positions);\r\n }\r\n\r\n if (this.normals) {\r\n serializationObject.normals = Array.from(this.normals);\r\n }\r\n\r\n if (this.tangents) {\r\n serializationObject.tangents = Array.from(this.tangents);\r\n }\r\n\r\n if (this.uvs) {\r\n serializationObject.uvs = Array.from(this.uvs);\r\n }\r\n\r\n if (this.uvs2) {\r\n serializationObject.uvs2 = Array.from(this.uvs2);\r\n }\r\n\r\n if (this.uvs3) {\r\n serializationObject.uvs3 = Array.from(this.uvs3);\r\n }\r\n\r\n if (this.uvs4) {\r\n serializationObject.uvs4 = Array.from(this.uvs4);\r\n }\r\n\r\n if (this.uvs5) {\r\n serializationObject.uvs5 = Array.from(this.uvs5);\r\n }\r\n\r\n if (this.uvs6) {\r\n serializationObject.uvs6 = Array.from(this.uvs6);\r\n }\r\n\r\n if (this.colors) {\r\n serializationObject.colors = Array.from(this.colors);\r\n serializationObject.hasVertexAlpha = this.hasVertexAlpha;\r\n }\r\n\r\n if (this.matricesIndices) {\r\n serializationObject.matricesIndices = Array.from(this.matricesIndices);\r\n serializationObject.matricesIndices._isExpanded = true;\r\n }\r\n\r\n if (this.matricesWeights) {\r\n serializationObject.matricesWeights = Array.from(this.matricesWeights);\r\n }\r\n\r\n if (this.matricesIndicesExtra) {\r\n serializationObject.matricesIndicesExtra = Array.from(this.matricesIndicesExtra);\r\n serializationObject.matricesIndicesExtra._isExpanded = true;\r\n }\r\n\r\n if (this.matricesWeightsExtra) {\r\n serializationObject.matricesWeightsExtra = Array.from(this.matricesWeightsExtra);\r\n }\r\n\r\n serializationObject.indices = Array.from(this.indices as number[]);\r\n\r\n if (this.materialInfos) {\r\n serializationObject.materialInfos = [];\r\n for (const materialInfo of this.materialInfos) {\r\n const materialInfoSerializationObject = {\r\n indexStart: materialInfo.indexStart,\r\n indexCount: materialInfo.indexCount,\r\n materialIndex: materialInfo.materialIndex,\r\n verticesStart: materialInfo.verticesStart,\r\n verticesCount: materialInfo.verticesCount,\r\n };\r\n serializationObject.materialInfos.push(materialInfoSerializationObject);\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Extracts the vertexData from a mesh\r\n * @param mesh the mesh from which to extract the VertexData\r\n * @param copyWhenShared defines if the VertexData must be cloned when shared between multiple meshes, optional, default false\r\n * @param forceCopy indicating that the VertexData must be cloned, optional, default false\r\n * @returns the object VertexData associated to the passed mesh\r\n */\r\n public static ExtractFromMesh(mesh: Mesh, copyWhenShared?: boolean, forceCopy?: boolean): VertexData {\r\n return VertexData._ExtractFrom(mesh, copyWhenShared, forceCopy);\r\n }\r\n\r\n /**\r\n * Extracts the vertexData from the geometry\r\n * @param geometry the geometry from which to extract the VertexData\r\n * @param copyWhenShared defines if the VertexData must be cloned when the geometry is shared between multiple meshes, optional, default false\r\n * @param forceCopy indicating that the VertexData must be cloned, optional, default false\r\n * @returns the object VertexData associated to the passed mesh\r\n */\r\n public static ExtractFromGeometry(geometry: Geometry, copyWhenShared?: boolean, forceCopy?: boolean): VertexData {\r\n return VertexData._ExtractFrom(geometry, copyWhenShared, forceCopy);\r\n }\r\n\r\n private static _ExtractFrom(meshOrGeometry: IGetSetVerticesData, copyWhenShared?: boolean, forceCopy?: boolean): VertexData {\r\n const result = new VertexData();\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.PositionKind)) {\r\n result.positions = meshOrGeometry.getVerticesData(VertexBuffer.PositionKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.NormalKind)) {\r\n result.normals = meshOrGeometry.getVerticesData(VertexBuffer.NormalKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.TangentKind)) {\r\n result.tangents = meshOrGeometry.getVerticesData(VertexBuffer.TangentKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n result.uvs = meshOrGeometry.getVerticesData(VertexBuffer.UVKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV2Kind)) {\r\n result.uvs2 = meshOrGeometry.getVerticesData(VertexBuffer.UV2Kind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV3Kind)) {\r\n result.uvs3 = meshOrGeometry.getVerticesData(VertexBuffer.UV3Kind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV4Kind)) {\r\n result.uvs4 = meshOrGeometry.getVerticesData(VertexBuffer.UV4Kind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV5Kind)) {\r\n result.uvs5 = meshOrGeometry.getVerticesData(VertexBuffer.UV5Kind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.UV6Kind)) {\r\n result.uvs6 = meshOrGeometry.getVerticesData(VertexBuffer.UV6Kind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.ColorKind)) {\r\n result.colors = meshOrGeometry.getVerticesData(VertexBuffer.ColorKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind)) {\r\n result.matricesIndices = meshOrGeometry.getVerticesData(VertexBuffer.MatricesIndicesKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) {\r\n result.matricesWeights = meshOrGeometry.getVerticesData(VertexBuffer.MatricesWeightsKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesIndicesExtraKind)) {\r\n result.matricesIndicesExtra = meshOrGeometry.getVerticesData(VertexBuffer.MatricesIndicesExtraKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n if (meshOrGeometry.isVerticesDataPresent(VertexBuffer.MatricesWeightsExtraKind)) {\r\n result.matricesWeightsExtra = meshOrGeometry.getVerticesData(VertexBuffer.MatricesWeightsExtraKind, copyWhenShared, forceCopy);\r\n }\r\n\r\n result.indices = meshOrGeometry.getIndices(copyWhenShared, forceCopy);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a Ribbon\r\n * @param options an object used to set the following optional parameters for the ribbon, required but can be empty\r\n * * pathArray array of paths, each of which an array of successive Vector3\r\n * * closeArray creates a seam between the first and the last paths of the pathArray, optional, default false\r\n * * closePath creates a seam between the first and the last points of each path of the path array, optional, default false\r\n * * offset a positive integer, only used when pathArray contains a single path (offset = 10 means the point 1 is joined to the point 11), default rounded half size of the pathArray length\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * * invertUV swaps in the U and V coordinates when applying a texture, optional, default false\r\n * * uvs a linear array, of length 2 * number of vertices, of custom UV values, optional\r\n * * colors a linear array, of length 4 * number of vertices, of custom color values, optional\r\n * @returns the VertexData of the ribbon\r\n * @deprecated use CreateRibbonVertexData instead\r\n */\r\n public static CreateRibbon(options: {\r\n pathArray: Vector3[][];\r\n closeArray?: boolean;\r\n closePath?: boolean;\r\n offset?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n invertUV?: boolean;\r\n uvs?: Vector2[];\r\n colors?: Color4[];\r\n }): VertexData {\r\n throw _WarnImport(\"ribbonBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a box\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * size sets the width, height and depth of the box to the value of size, optional default 1\r\n * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size\r\n * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size\r\n * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size\r\n * * faceUV an array of 6 Vector4 elements used to set different images to each box side\r\n * * faceColors an array of 6 Color3 elements used to set different colors to each box side\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the box\r\n * @deprecated Please use CreateBoxVertexData from the BoxBuilder file instead\r\n */\r\n public static CreateBox(options: {\r\n size?: number;\r\n width?: number;\r\n height?: number;\r\n depth?: number;\r\n faceUV?: Vector4[];\r\n faceColors?: Color4[];\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"boxBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a tiled box\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * faceTiles sets the pattern, tile size and number of tiles for a face\r\n * * faceUV an array of 6 Vector4 elements used to set different images to each box side\r\n * * faceColors an array of 6 Color3 elements used to set different colors to each box side\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * @param options.pattern\r\n * @param options.width\r\n * @param options.height\r\n * @param options.depth\r\n * @param options.tileSize\r\n * @param options.tileWidth\r\n * @param options.tileHeight\r\n * @param options.alignHorizontal\r\n * @param options.alignVertical\r\n * @param options.faceUV\r\n * @param options.faceColors\r\n * @param options.sideOrientation\r\n * @returns the VertexData of the box\r\n * @deprecated Please use CreateTiledBoxVertexData instead\r\n */\r\n public static CreateTiledBox(options: {\r\n pattern?: number;\r\n width?: number;\r\n height?: number;\r\n depth?: number;\r\n tileSize?: number;\r\n tileWidth?: number;\r\n tileHeight?: number;\r\n alignHorizontal?: number;\r\n alignVertical?: number;\r\n faceUV?: Vector4[];\r\n faceColors?: Color4[];\r\n sideOrientation?: number;\r\n }): VertexData {\r\n throw _WarnImport(\"tiledBoxBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a tiled plane\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * pattern a limited pattern arrangement depending on the number\r\n * * tileSize sets the width, height and depth of the tile to the value of size, optional default 1\r\n * * tileWidth sets the width (x direction) of the tile, overwrites the width set by size, optional, default size\r\n * * tileHeight sets the height (y direction) of the tile, overwrites the height set by size, optional, default size\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the tiled plane\r\n * @deprecated use CreateTiledPlaneVertexData instead\r\n */\r\n public static CreateTiledPlane(options: {\r\n pattern?: number;\r\n tileSize?: number;\r\n tileWidth?: number;\r\n tileHeight?: number;\r\n size?: number;\r\n width?: number;\r\n height?: number;\r\n alignHorizontal?: number;\r\n alignVertical?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"tiledPlaneBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for an ellipsoid, defaults to a sphere\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * segments sets the number of horizontal strips optional, default 32\r\n * * diameter sets the axes dimensions, diameterX, diameterY and diameterZ to the value of diameter, optional default 1\r\n * * diameterX sets the diameterX (x direction) of the ellipsoid, overwrites the diameterX set by diameter, optional, default diameter\r\n * * diameterY sets the diameterY (y direction) of the ellipsoid, overwrites the diameterY set by diameter, optional, default diameter\r\n * * diameterZ sets the diameterZ (z direction) of the ellipsoid, overwrites the diameterZ set by diameter, optional, default diameter\r\n * * arc a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the circumference (latitude) given by the arc value, optional, default 1\r\n * * slice a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the height (latitude) given by the arc value, optional, default 1\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the ellipsoid\r\n * @deprecated use CreateSphereVertexData instead\r\n */\r\n public static CreateSphere(options: {\r\n segments?: number;\r\n diameter?: number;\r\n diameterX?: number;\r\n diameterY?: number;\r\n diameterZ?: number;\r\n arc?: number;\r\n slice?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"sphereBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a cylinder, cone or prism\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * height sets the height (y direction) of the cylinder, optional, default 2\r\n * * diameterTop sets the diameter of the top of the cone, overwrites diameter, optional, default diameter\r\n * * diameterBottom sets the diameter of the bottom of the cone, overwrites diameter, optional, default diameter\r\n * * diameter sets the diameter of the top and bottom of the cone, optional default 1\r\n * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24\r\n * * subdivisions` the number of rings along the cylinder height, optional, default 1\r\n * * arc a number from 0 to 1, to create an unclosed cylinder based on the fraction of the circumference given by the arc value, optional, default 1\r\n * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively\r\n * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively\r\n * * hasRings when true makes each subdivision independently treated as a face for faceUV and faceColors, optional, default false\r\n * * enclose when true closes an open cylinder by adding extra flat faces between the height axis and vertical edges, think cut cake\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the cylinder, cone or prism\r\n * @deprecated please use CreateCylinderVertexData instead\r\n */\r\n public static CreateCylinder(options: {\r\n height?: number;\r\n diameterTop?: number;\r\n diameterBottom?: number;\r\n diameter?: number;\r\n tessellation?: number;\r\n subdivisions?: number;\r\n arc?: number;\r\n faceColors?: Color4[];\r\n faceUV?: Vector4[];\r\n hasRings?: boolean;\r\n enclose?: boolean;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"cylinderBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a torus\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * diameter the diameter of the torus, optional default 1\r\n * * thickness the diameter of the tube forming the torus, optional default 0.5\r\n * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the torus\r\n * @deprecated use CreateTorusVertexData instead\r\n */\r\n public static CreateTorus(options: {\r\n diameter?: number;\r\n thickness?: number;\r\n tessellation?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"torusBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData of the LineSystem\r\n * @param options an object used to set the following optional parameters for the LineSystem, required but can be empty\r\n * - lines an array of lines, each line being an array of successive Vector3\r\n * - colors an array of line colors, each of the line colors being an array of successive Color4, one per line point\r\n * @returns the VertexData of the LineSystem\r\n * @deprecated use CreateLineSystemVertexData instead\r\n */\r\n public static CreateLineSystem(options: { lines: Vector3[][]; colors?: Nullable }): VertexData {\r\n throw _WarnImport(\"linesBuilder\");\r\n }\r\n\r\n /**\r\n * Create the VertexData for a DashedLines\r\n * @param options an object used to set the following optional parameters for the DashedLines, required but can be empty\r\n * - points an array successive Vector3\r\n * - dashSize the size of the dashes relative to the dash number, optional, default 3\r\n * - gapSize the size of the gap between two successive dashes relative to the dash number, optional, default 1\r\n * - dashNb the intended total number of dashes, optional, default 200\r\n * @returns the VertexData for the DashedLines\r\n * @deprecated use CreateDashedLinesVertexData instead\r\n */\r\n public static CreateDashedLines(options: { points: Vector3[]; dashSize?: number; gapSize?: number; dashNb?: number }): VertexData {\r\n throw _WarnImport(\"linesBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a Ground\r\n * @param options an object used to set the following optional parameters for the Ground, required but can be empty\r\n * - width the width (x direction) of the ground, optional, default 1\r\n * - height the height (z direction) of the ground, optional, default 1\r\n * - subdivisions the number of subdivisions per side, optional, default 1\r\n * @returns the VertexData of the Ground\r\n * @deprecated Please use CreateGroundVertexData instead\r\n */\r\n public static CreateGround(options: { width?: number; height?: number; subdivisions?: number; subdivisionsX?: number; subdivisionsY?: number }): VertexData {\r\n throw _WarnImport(\"groundBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a TiledGround by subdividing the ground into tiles\r\n * @param options an object used to set the following optional parameters for the Ground, required but can be empty\r\n * * xmin the ground minimum X coordinate, optional, default -1\r\n * * zmin the ground minimum Z coordinate, optional, default -1\r\n * * xmax the ground maximum X coordinate, optional, default 1\r\n * * zmax the ground maximum Z coordinate, optional, default 1\r\n * * subdivisions a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the ground width and height creating 'tiles', default {w: 6, h: 6}\r\n * * precision a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the tile width and height, default {w: 2, h: 2}\r\n * @returns the VertexData of the TiledGround\r\n * @deprecated use CreateTiledGroundVertexData instead\r\n */\r\n public static CreateTiledGround(options: {\r\n xmin: number;\r\n zmin: number;\r\n xmax: number;\r\n zmax: number;\r\n subdivisions?: { w: number; h: number };\r\n precision?: { w: number; h: number };\r\n }): VertexData {\r\n throw _WarnImport(\"groundBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData of the Ground designed from a heightmap\r\n * @param options an object used to set the following parameters for the Ground, required and provided by CreateGroundFromHeightMap\r\n * * width the width (x direction) of the ground\r\n * * height the height (z direction) of the ground\r\n * * subdivisions the number of subdivisions per side\r\n * * minHeight the minimum altitude on the ground, optional, default 0\r\n * * maxHeight the maximum altitude on the ground, optional default 1\r\n * * colorFilter the filter to apply to the image pixel colors to compute the height, optional Color3, default (0.3, 0.59, 0.11)\r\n * * buffer the array holding the image color data\r\n * * bufferWidth the width of image\r\n * * bufferHeight the height of image\r\n * * alphaFilter Remove any data where the alpha channel is below this value, defaults 0 (all data visible)\r\n * @returns the VertexData of the Ground designed from a heightmap\r\n * @deprecated use CreateGroundFromHeightMapVertexData instead\r\n */\r\n public static CreateGroundFromHeightMap(options: {\r\n width: number;\r\n height: number;\r\n subdivisions: number;\r\n minHeight: number;\r\n maxHeight: number;\r\n colorFilter: Color3;\r\n buffer: Uint8Array;\r\n bufferWidth: number;\r\n bufferHeight: number;\r\n alphaFilter: number;\r\n }): VertexData {\r\n throw _WarnImport(\"groundBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a Plane\r\n * @param options an object used to set the following optional parameters for the plane, required but can be empty\r\n * * size sets the width and height of the plane to the value of size, optional default 1\r\n * * width sets the width (x direction) of the plane, overwrites the width set by size, optional, default size\r\n * * height sets the height (y direction) of the plane, overwrites the height set by size, optional, default size\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the box\r\n * @deprecated use CreatePlaneVertexData instead\r\n */\r\n public static CreatePlane(options: { size?: number; width?: number; height?: number; sideOrientation?: number; frontUVs?: Vector4; backUVs?: Vector4 }): VertexData {\r\n throw _WarnImport(\"planeBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData of the Disc or regular Polygon\r\n * @param options an object used to set the following optional parameters for the disc, required but can be empty\r\n * * radius the radius of the disc, optional default 0.5\r\n * * tessellation the number of polygon sides, optional, default 64\r\n * * arc a number from 0 to 1, to create an unclosed polygon based on the fraction of the circumference given by the arc value, optional, default 1\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the box\r\n * @deprecated use CreateDiscVertexData instead\r\n */\r\n public static CreateDisc(options: { radius?: number; tessellation?: number; arc?: number; sideOrientation?: number; frontUVs?: Vector4; backUVs?: Vector4 }): VertexData {\r\n throw _WarnImport(\"discBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for an irregular Polygon in the XoZ plane using a mesh built by polygonTriangulation.build()\r\n * All parameters are provided by CreatePolygon as needed\r\n * @param polygon a mesh built from polygonTriangulation.build()\r\n * @param sideOrientation takes the values Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * @param fUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively\r\n * @param fColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively\r\n * @param frontUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * @param backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @param wrap a boolean, default false, when true and fUVs used texture is wrapped around all sides, when false texture is applied side\r\n * @returns the VertexData of the Polygon\r\n * @deprecated use CreatePolygonVertexData instead\r\n */\r\n public static CreatePolygon(polygon: Mesh, sideOrientation: number, fUV?: Vector4[], fColors?: Color4[], frontUVs?: Vector4, backUVs?: Vector4, wrap?: boolean): VertexData {\r\n throw _WarnImport(\"polygonBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData of the IcoSphere\r\n * @param options an object used to set the following optional parameters for the IcoSphere, required but can be empty\r\n * * radius the radius of the IcoSphere, optional default 1\r\n * * radiusX allows stretching in the x direction, optional, default radius\r\n * * radiusY allows stretching in the y direction, optional, default radius\r\n * * radiusZ allows stretching in the z direction, optional, default radius\r\n * * flat when true creates a flat shaded mesh, optional, default true\r\n * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the IcoSphere\r\n * @deprecated use CreateIcoSphereVertexData instead\r\n */\r\n public static CreateIcoSphere(options: {\r\n radius?: number;\r\n radiusX?: number;\r\n radiusY?: number;\r\n radiusZ?: number;\r\n flat?: boolean;\r\n subdivisions?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"icoSphereBuilder\");\r\n }\r\n\r\n // inspired from // http://stemkoski.github.io/Three.js/Polyhedra.html\r\n /**\r\n * Creates the VertexData for a Polyhedron\r\n * @param options an object used to set the following optional parameters for the polyhedron, required but can be empty\r\n * * type provided types are:\r\n * * 0 : Tetrahedron, 1 : Octahedron, 2 : Dodecahedron, 3 : Icosahedron, 4 : Rhombicuboctahedron, 5 : Triangular Prism, 6 : Pentagonal Prism, 7 : Hexagonal Prism, 8 : Square Pyramid (J1)\r\n * * 9 : Pentagonal Pyramid (J2), 10 : Triangular Dipyramid (J12), 11 : Pentagonal Dipyramid (J13), 12 : Elongated Square Dipyramid (J15), 13 : Elongated Pentagonal Dipyramid (J16), 14 : Elongated Pentagonal Cupola (J20)\r\n * * size the size of the IcoSphere, optional default 1\r\n * * sizeX allows stretching in the x direction, optional, default size\r\n * * sizeY allows stretching in the y direction, optional, default size\r\n * * sizeZ allows stretching in the z direction, optional, default size\r\n * * custom a number that overwrites the type to create from an extended set of polyhedron from https://www.babylonjs-playground.com/#21QRSK#15 with minimised editor\r\n * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively\r\n * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively\r\n * * flat when true creates a flat shaded mesh, optional, default true\r\n * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the Polyhedron\r\n * @deprecated use CreatePolyhedronVertexData instead\r\n */\r\n public static CreatePolyhedron(options: {\r\n type?: number;\r\n size?: number;\r\n sizeX?: number;\r\n sizeY?: number;\r\n sizeZ?: number;\r\n custom?: any;\r\n faceUV?: Vector4[];\r\n faceColors?: Color4[];\r\n flat?: boolean;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"polyhedronBuilder\");\r\n }\r\n\r\n /**\r\n * Creates the VertexData for a Capsule, inspired from https://github.com/maximeq/three-js-capsule-geometry/blob/master/src/CapsuleBufferGeometry.js\r\n * @param options an object used to set the following optional parameters for the capsule, required but can be empty\r\n * @returns the VertexData of the Capsule\r\n * @deprecated Please use CreateCapsuleVertexData from the capsuleBuilder file instead\r\n */\r\n public static CreateCapsule(\r\n options: ICreateCapsuleOptions = {\r\n orientation: Vector3.Up(),\r\n subdivisions: 2,\r\n tessellation: 16,\r\n height: 1,\r\n radius: 0.25,\r\n capSubdivisions: 6,\r\n }\r\n ): VertexData {\r\n throw _WarnImport(\"capsuleBuilder\");\r\n }\r\n\r\n // based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3D/src/away3d/primitives/TorusKnot.as?spec=svn2473&r=2473\r\n /**\r\n * Creates the VertexData for a TorusKnot\r\n * @param options an object used to set the following optional parameters for the TorusKnot, required but can be empty\r\n * * radius the radius of the torus knot, optional, default 2\r\n * * tube the thickness of the tube, optional, default 0.5\r\n * * radialSegments the number of sides on each tube segments, optional, default 32\r\n * * tubularSegments the number of tubes to decompose the knot into, optional, default 32\r\n * * p the number of windings around the z axis, optional, default 2\r\n * * q the number of windings around the x axis, optional, default 3\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the Torus Knot\r\n * @deprecated use CreateTorusKnotVertexData instead\r\n */\r\n public static CreateTorusKnot(options: {\r\n radius?: number;\r\n tube?: number;\r\n radialSegments?: number;\r\n tubularSegments?: number;\r\n p?: number;\r\n q?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n }): VertexData {\r\n throw _WarnImport(\"torusKnotBuilder\");\r\n }\r\n\r\n // Tools\r\n\r\n /**\r\n * Compute normals for given positions and indices\r\n * @param positions an array of vertex positions, [...., x, y, z, ......]\r\n * @param indices an array of indices in groups of three for each triangular facet, [...., i, j, k, ......]\r\n * @param normals an array of vertex normals, [...., x, y, z, ......]\r\n * @param options an object used to set the following optional parameters for the TorusKnot, optional\r\n * * facetNormals : optional array of facet normals (vector3)\r\n * * facetPositions : optional array of facet positions (vector3)\r\n * * facetPartitioning : optional partitioning array. facetPositions is required for facetPartitioning computation\r\n * * ratio : optional partitioning ratio / bounding box, required for facetPartitioning computation\r\n * * bInfo : optional bounding info, required for facetPartitioning computation\r\n * * bbSize : optional bounding box size data, required for facetPartitioning computation\r\n * * subDiv : optional partitioning data about subdivisions on each axis (int), required for facetPartitioning computation\r\n * * useRightHandedSystem: optional boolean to for right handed system computation\r\n * * depthSort : optional boolean to enable the facet depth sort computation\r\n * * distanceTo : optional Vector3 to compute the facet depth from this location\r\n * * depthSortedFacets : optional array of depthSortedFacets to store the facet distances from the reference location\r\n */\r\n public static ComputeNormals(\r\n positions: any,\r\n indices: any,\r\n normals: any,\r\n options?: {\r\n facetNormals?: any;\r\n facetPositions?: any;\r\n facetPartitioning?: any;\r\n ratio?: number;\r\n bInfo?: any;\r\n bbSize?: Vector3;\r\n subDiv?: any;\r\n useRightHandedSystem?: boolean;\r\n depthSort?: boolean;\r\n distanceTo?: Vector3;\r\n depthSortedFacets?: any;\r\n }\r\n ): void {\r\n // temporary scalar variables\r\n let index = 0; // facet index\r\n let p1p2x = 0.0; // p1p2 vector x coordinate\r\n let p1p2y = 0.0; // p1p2 vector y coordinate\r\n let p1p2z = 0.0; // p1p2 vector z coordinate\r\n let p3p2x = 0.0; // p3p2 vector x coordinate\r\n let p3p2y = 0.0; // p3p2 vector y coordinate\r\n let p3p2z = 0.0; // p3p2 vector z coordinate\r\n let faceNormalx = 0.0; // facet normal x coordinate\r\n let faceNormaly = 0.0; // facet normal y coordinate\r\n let faceNormalz = 0.0; // facet normal z coordinate\r\n let length = 0.0; // facet normal length before normalization\r\n let v1x = 0; // vector1 x index in the positions array\r\n let v1y = 0; // vector1 y index in the positions array\r\n let v1z = 0; // vector1 z index in the positions array\r\n let v2x = 0; // vector2 x index in the positions array\r\n let v2y = 0; // vector2 y index in the positions array\r\n let v2z = 0; // vector2 z index in the positions array\r\n let v3x = 0; // vector3 x index in the positions array\r\n let v3y = 0; // vector3 y index in the positions array\r\n let v3z = 0; // vector3 z index in the positions array\r\n let computeFacetNormals = false;\r\n let computeFacetPositions = false;\r\n let computeFacetPartitioning = false;\r\n let computeDepthSort = false;\r\n let faceNormalSign = 1;\r\n let ratio = 0;\r\n let distanceTo: Nullable = null;\r\n if (options) {\r\n computeFacetNormals = options.facetNormals ? true : false;\r\n computeFacetPositions = options.facetPositions ? true : false;\r\n computeFacetPartitioning = options.facetPartitioning ? true : false;\r\n faceNormalSign = options.useRightHandedSystem === true ? -1 : 1;\r\n ratio = options.ratio || 0;\r\n computeDepthSort = options.depthSort ? true : false;\r\n distanceTo = options.distanceTo;\r\n if (computeDepthSort) {\r\n if (distanceTo === undefined) {\r\n distanceTo = Vector3.Zero();\r\n }\r\n }\r\n }\r\n\r\n // facetPartitioning reinit if needed\r\n let xSubRatio = 0;\r\n let ySubRatio = 0;\r\n let zSubRatio = 0;\r\n let subSq = 0;\r\n if (computeFacetPartitioning && options && options.bbSize) {\r\n //let bbSizeMax = options.bbSize.x > options.bbSize.y ? options.bbSize.x : options.bbSize.y;\r\n //bbSizeMax = bbSizeMax > options.bbSize.z ? bbSizeMax : options.bbSize.z;\r\n xSubRatio = (options.subDiv.X * ratio) / options.bbSize.x;\r\n ySubRatio = (options.subDiv.Y * ratio) / options.bbSize.y;\r\n zSubRatio = (options.subDiv.Z * ratio) / options.bbSize.z;\r\n subSq = options.subDiv.max * options.subDiv.max;\r\n options.facetPartitioning.length = 0;\r\n }\r\n\r\n // reset the normals\r\n for (index = 0; index < positions.length; index++) {\r\n normals[index] = 0.0;\r\n }\r\n\r\n // Loop : 1 indice triplet = 1 facet\r\n const nbFaces = (indices.length / 3) | 0;\r\n for (index = 0; index < nbFaces; index++) {\r\n // get the indexes of the coordinates of each vertex of the facet\r\n v1x = indices[index * 3] * 3;\r\n v1y = v1x + 1;\r\n v1z = v1x + 2;\r\n v2x = indices[index * 3 + 1] * 3;\r\n v2y = v2x + 1;\r\n v2z = v2x + 2;\r\n v3x = indices[index * 3 + 2] * 3;\r\n v3y = v3x + 1;\r\n v3z = v3x + 2;\r\n\r\n p1p2x = positions[v1x] - positions[v2x]; // compute two vectors per facet : p1p2 and p3p2\r\n p1p2y = positions[v1y] - positions[v2y];\r\n p1p2z = positions[v1z] - positions[v2z];\r\n\r\n p3p2x = positions[v3x] - positions[v2x];\r\n p3p2y = positions[v3y] - positions[v2y];\r\n p3p2z = positions[v3z] - positions[v2z];\r\n\r\n // compute the face normal with the cross product\r\n faceNormalx = faceNormalSign * (p1p2y * p3p2z - p1p2z * p3p2y);\r\n faceNormaly = faceNormalSign * (p1p2z * p3p2x - p1p2x * p3p2z);\r\n faceNormalz = faceNormalSign * (p1p2x * p3p2y - p1p2y * p3p2x);\r\n // normalize this normal and store it in the array facetData\r\n length = Math.sqrt(faceNormalx * faceNormalx + faceNormaly * faceNormaly + faceNormalz * faceNormalz);\r\n length = length === 0 ? 1.0 : length;\r\n faceNormalx /= length;\r\n faceNormaly /= length;\r\n faceNormalz /= length;\r\n\r\n if (computeFacetNormals && options) {\r\n options.facetNormals[index].x = faceNormalx;\r\n options.facetNormals[index].y = faceNormaly;\r\n options.facetNormals[index].z = faceNormalz;\r\n }\r\n\r\n if (computeFacetPositions && options) {\r\n // compute and the facet barycenter coordinates in the array facetPositions\r\n options.facetPositions[index].x = (positions[v1x] + positions[v2x] + positions[v3x]) / 3.0;\r\n options.facetPositions[index].y = (positions[v1y] + positions[v2y] + positions[v3y]) / 3.0;\r\n options.facetPositions[index].z = (positions[v1z] + positions[v2z] + positions[v3z]) / 3.0;\r\n }\r\n\r\n if (computeFacetPartitioning && options) {\r\n // store the facet indexes in arrays in the main facetPartitioning array :\r\n // compute each facet vertex (+ facet barycenter) index in the partiniong array\r\n const ox = Math.floor((options.facetPositions[index].x - options.bInfo.minimum.x * ratio) * xSubRatio);\r\n const oy = Math.floor((options.facetPositions[index].y - options.bInfo.minimum.y * ratio) * ySubRatio);\r\n const oz = Math.floor((options.facetPositions[index].z - options.bInfo.minimum.z * ratio) * zSubRatio);\r\n const b1x = Math.floor((positions[v1x] - options.bInfo.minimum.x * ratio) * xSubRatio);\r\n const b1y = Math.floor((positions[v1y] - options.bInfo.minimum.y * ratio) * ySubRatio);\r\n const b1z = Math.floor((positions[v1z] - options.bInfo.minimum.z * ratio) * zSubRatio);\r\n const b2x = Math.floor((positions[v2x] - options.bInfo.minimum.x * ratio) * xSubRatio);\r\n const b2y = Math.floor((positions[v2y] - options.bInfo.minimum.y * ratio) * ySubRatio);\r\n const b2z = Math.floor((positions[v2z] - options.bInfo.minimum.z * ratio) * zSubRatio);\r\n const b3x = Math.floor((positions[v3x] - options.bInfo.minimum.x * ratio) * xSubRatio);\r\n const b3y = Math.floor((positions[v3y] - options.bInfo.minimum.y * ratio) * ySubRatio);\r\n const b3z = Math.floor((positions[v3z] - options.bInfo.minimum.z * ratio) * zSubRatio);\r\n\r\n const block_idx_v1 = b1x + options.subDiv.max * b1y + subSq * b1z;\r\n const block_idx_v2 = b2x + options.subDiv.max * b2y + subSq * b2z;\r\n const block_idx_v3 = b3x + options.subDiv.max * b3y + subSq * b3z;\r\n const block_idx_o = ox + options.subDiv.max * oy + subSq * oz;\r\n\r\n options.facetPartitioning[block_idx_o] = options.facetPartitioning[block_idx_o] ? options.facetPartitioning[block_idx_o] : new Array();\r\n options.facetPartitioning[block_idx_v1] = options.facetPartitioning[block_idx_v1] ? options.facetPartitioning[block_idx_v1] : new Array();\r\n options.facetPartitioning[block_idx_v2] = options.facetPartitioning[block_idx_v2] ? options.facetPartitioning[block_idx_v2] : new Array();\r\n options.facetPartitioning[block_idx_v3] = options.facetPartitioning[block_idx_v3] ? options.facetPartitioning[block_idx_v3] : new Array();\r\n\r\n // push each facet index in each block containing the vertex\r\n options.facetPartitioning[block_idx_v1].push(index);\r\n if (block_idx_v2 != block_idx_v1) {\r\n options.facetPartitioning[block_idx_v2].push(index);\r\n }\r\n if (!(block_idx_v3 == block_idx_v2 || block_idx_v3 == block_idx_v1)) {\r\n options.facetPartitioning[block_idx_v3].push(index);\r\n }\r\n if (!(block_idx_o == block_idx_v1 || block_idx_o == block_idx_v2 || block_idx_o == block_idx_v3)) {\r\n options.facetPartitioning[block_idx_o].push(index);\r\n }\r\n }\r\n\r\n if (computeDepthSort && options && options.facetPositions) {\r\n const dsf = options.depthSortedFacets[index];\r\n dsf.ind = index * 3;\r\n dsf.sqDistance = Vector3.DistanceSquared(options.facetPositions[index], distanceTo!);\r\n }\r\n\r\n // compute the normals anyway\r\n normals[v1x] += faceNormalx; // accumulate all the normals per face\r\n normals[v1y] += faceNormaly;\r\n normals[v1z] += faceNormalz;\r\n normals[v2x] += faceNormalx;\r\n normals[v2y] += faceNormaly;\r\n normals[v2z] += faceNormalz;\r\n normals[v3x] += faceNormalx;\r\n normals[v3y] += faceNormaly;\r\n normals[v3z] += faceNormalz;\r\n }\r\n // last normalization of each normal\r\n for (index = 0; index < normals.length / 3; index++) {\r\n faceNormalx = normals[index * 3];\r\n faceNormaly = normals[index * 3 + 1];\r\n faceNormalz = normals[index * 3 + 2];\r\n\r\n length = Math.sqrt(faceNormalx * faceNormalx + faceNormaly * faceNormaly + faceNormalz * faceNormalz);\r\n length = length === 0 ? 1.0 : length;\r\n faceNormalx /= length;\r\n faceNormaly /= length;\r\n faceNormalz /= length;\r\n\r\n normals[index * 3] = faceNormalx;\r\n normals[index * 3 + 1] = faceNormaly;\r\n normals[index * 3 + 2] = faceNormalz;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _ComputeSides(\r\n sideOrientation: number,\r\n positions: FloatArray,\r\n indices: FloatArray | IndicesArray,\r\n normals: FloatArray,\r\n uvs: FloatArray,\r\n frontUVs?: Vector4,\r\n backUVs?: Vector4\r\n ) {\r\n const li: number = indices.length;\r\n const ln: number = normals.length;\r\n let i: number;\r\n let n: number;\r\n sideOrientation = sideOrientation || VertexData.DEFAULTSIDE;\r\n\r\n switch (sideOrientation) {\r\n case VertexData.FRONTSIDE:\r\n // nothing changed\r\n break;\r\n\r\n case VertexData.BACKSIDE:\r\n // indices\r\n for (i = 0; i < li; i += 3) {\r\n const tmp = indices[i];\r\n indices[i] = indices[i + 2];\r\n indices[i + 2] = tmp;\r\n }\r\n // normals\r\n for (n = 0; n < ln; n++) {\r\n normals[n] = -normals[n];\r\n }\r\n break;\r\n\r\n case VertexData.DOUBLESIDE: {\r\n // positions\r\n const lp: number = positions.length;\r\n const l: number = lp / 3;\r\n for (let p = 0; p < lp; p++) {\r\n positions[lp + p] = positions[p];\r\n }\r\n // indices\r\n for (i = 0; i < li; i += 3) {\r\n indices[i + li] = indices[i + 2] + l;\r\n indices[i + 1 + li] = indices[i + 1] + l;\r\n indices[i + 2 + li] = indices[i] + l;\r\n }\r\n // normals\r\n for (n = 0; n < ln; n++) {\r\n normals[ln + n] = -normals[n];\r\n }\r\n\r\n // uvs\r\n const lu: number = uvs.length;\r\n let u: number = 0;\r\n for (u = 0; u < lu; u++) {\r\n uvs[u + lu] = uvs[u];\r\n }\r\n frontUVs = frontUVs ? frontUVs : new Vector4(0.0, 0.0, 1.0, 1.0);\r\n backUVs = backUVs ? backUVs : new Vector4(0.0, 0.0, 1.0, 1.0);\r\n u = 0;\r\n for (i = 0; i < lu / 2; i++) {\r\n uvs[u] = frontUVs.x + (frontUVs.z - frontUVs.x) * uvs[u];\r\n uvs[u + 1] = frontUVs.y + (frontUVs.w - frontUVs.y) * uvs[u + 1];\r\n uvs[u + lu] = backUVs.x + (backUVs.z - backUVs.x) * uvs[u + lu];\r\n uvs[u + lu + 1] = backUVs.y + (backUVs.w - backUVs.y) * uvs[u + lu + 1];\r\n u += 2;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a VertexData from serialized data\r\n * @param parsedVertexData the parsed data from an imported file\r\n * @returns a VertexData\r\n */\r\n public static Parse(parsedVertexData: any) {\r\n const vertexData = new VertexData();\r\n\r\n // positions\r\n const positions = parsedVertexData.positions;\r\n if (positions) {\r\n vertexData.set(positions, VertexBuffer.PositionKind);\r\n }\r\n\r\n // normals\r\n const normals = parsedVertexData.normals;\r\n if (normals) {\r\n vertexData.set(normals, VertexBuffer.NormalKind);\r\n }\r\n\r\n // tangents\r\n const tangents = parsedVertexData.tangents;\r\n if (tangents) {\r\n vertexData.set(tangents, VertexBuffer.TangentKind);\r\n }\r\n\r\n // uvs\r\n const uvs = parsedVertexData.uvs;\r\n if (uvs) {\r\n vertexData.set(uvs, VertexBuffer.UVKind);\r\n }\r\n\r\n // uv2s\r\n const uvs2 = parsedVertexData.uvs2;\r\n if (uvs2) {\r\n vertexData.set(uvs2, VertexBuffer.UV2Kind);\r\n }\r\n\r\n // uv3s\r\n const uvs3 = parsedVertexData.uvs3;\r\n if (uvs3) {\r\n vertexData.set(uvs3, VertexBuffer.UV3Kind);\r\n }\r\n\r\n // uv4s\r\n const uvs4 = parsedVertexData.uvs4;\r\n if (uvs4) {\r\n vertexData.set(uvs4, VertexBuffer.UV4Kind);\r\n }\r\n\r\n // uv5s\r\n const uvs5 = parsedVertexData.uvs5;\r\n if (uvs5) {\r\n vertexData.set(uvs5, VertexBuffer.UV5Kind);\r\n }\r\n\r\n // uv6s\r\n const uvs6 = parsedVertexData.uvs6;\r\n if (uvs6) {\r\n vertexData.set(uvs6, VertexBuffer.UV6Kind);\r\n }\r\n\r\n // colors\r\n const colors = parsedVertexData.colors;\r\n if (colors) {\r\n vertexData.set(Color4.CheckColors4(colors, positions.length / 3), VertexBuffer.ColorKind);\r\n if (parsedVertexData.hasVertexAlpha !== undefined) {\r\n vertexData.hasVertexAlpha = parsedVertexData.hasVertexAlpha;\r\n }\r\n }\r\n\r\n // matricesIndices\r\n const matricesIndices = parsedVertexData.matricesIndices;\r\n if (matricesIndices) {\r\n vertexData.set(matricesIndices, VertexBuffer.MatricesIndicesKind);\r\n }\r\n\r\n // matricesWeights\r\n const matricesWeights = parsedVertexData.matricesWeights;\r\n if (matricesWeights) {\r\n vertexData.set(matricesWeights, VertexBuffer.MatricesWeightsKind);\r\n }\r\n\r\n // indices\r\n const indices = parsedVertexData.indices;\r\n if (indices) {\r\n vertexData.indices = indices;\r\n }\r\n\r\n // MaterialInfos\r\n const materialInfos = parsedVertexData.materialInfos;\r\n if (materialInfos) {\r\n vertexData.materialInfos = [];\r\n for (const materialInfoFromJSON of materialInfos) {\r\n const materialInfo = new VertexDataMaterialInfo();\r\n materialInfo.indexCount = materialInfoFromJSON.indexCount;\r\n materialInfo.indexStart = materialInfoFromJSON.indexStart;\r\n materialInfo.verticesCount = materialInfoFromJSON.verticesCount;\r\n materialInfo.verticesStart = materialInfoFromJSON.verticesStart;\r\n materialInfo.materialIndex = materialInfoFromJSON.materialIndex;\r\n vertexData.materialInfos.push(materialInfo);\r\n }\r\n }\r\n\r\n return vertexData;\r\n }\r\n\r\n /**\r\n * Applies VertexData created from the imported parameters to the geometry\r\n * @param parsedVertexData the parsed data from an imported file\r\n * @param geometry the geometry to apply the VertexData to\r\n */\r\n public static ImportVertexData(parsedVertexData: any, geometry: Geometry) {\r\n const vertexData = VertexData.Parse(parsedVertexData);\r\n\r\n geometry.setAllVerticesData(vertexData, parsedVertexData.updatable);\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Scene } from \"./scene\";\r\nimport type { Nullable } from \"./types\";\r\nimport { Matrix, Vector3 } from \"./Maths/math.vector\";\r\nimport type { Engine } from \"./Engines/engine\";\r\nimport type { IBehaviorAware, Behavior } from \"./Behaviors/behavior\";\r\nimport { serialize } from \"./Misc/decorators\";\r\nimport type { Observer } from \"./Misc/observable\";\r\nimport { Observable } from \"./Misc/observable\";\r\nimport { EngineStore } from \"./Engines/engineStore\";\r\nimport { _WarnImport } from \"./Misc/devTools\";\r\nimport type { AbstractActionManager } from \"./Actions/abstractActionManager\";\r\nimport type { IInspectable } from \"./Misc/iInspectable\";\r\nimport type { AbstractScene } from \"./abstractScene\";\r\nimport type { IAccessibilityTag } from \"./IAccessibilityTag\";\r\nimport type { AnimationRange } from \"./Animations/animationRange\";\r\nimport type { AnimationPropertiesOverride } from \"./Animations/animationPropertiesOverride\";\r\nimport type { AbstractMesh } from \"./Meshes/abstractMesh\";\r\nimport type { Animation } from \"./Animations/animation\";\r\nimport type { Animatable } from \"./Animations/animatable\";\r\nimport { SerializationHelper } from \"./Misc/decorators.serialization\";\r\n\r\n/**\r\n * Defines how a node can be built from a string name.\r\n */\r\nexport type NodeConstructor = (name: string, scene: Scene, options?: any) => () => Node;\r\n\r\n/** @internal */\r\nclass _InternalNodeDataInfo {\r\n public _doNotSerialize = false;\r\n public _isDisposed = false;\r\n public _sceneRootNodesIndex = -1;\r\n public _isEnabled = true;\r\n public _isParentEnabled = true;\r\n public _isReady = true;\r\n public _onEnabledStateChangedObservable = new Observable();\r\n public _onClonedObservable = new Observable();\r\n}\r\n\r\n/**\r\n * Node is the basic class for all scene objects (Mesh, Light, Camera.)\r\n */\r\nexport class Node implements IBehaviorAware {\r\n protected _isDirty = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _AnimationRangeFactory = (_name: string, _from: number, _to: number): AnimationRange => {\r\n throw _WarnImport(\"AnimationRange\");\r\n };\r\n\r\n private static _NodeConstructors: { [key: string]: any } = {};\r\n\r\n /**\r\n * Add a new node constructor\r\n * @param type defines the type name of the node to construct\r\n * @param constructorFunc defines the constructor function\r\n */\r\n public static AddNodeConstructor(type: string, constructorFunc: NodeConstructor) {\r\n this._NodeConstructors[type] = constructorFunc;\r\n }\r\n\r\n /**\r\n * Returns a node constructor based on type name\r\n * @param type defines the type name\r\n * @param name defines the new node name\r\n * @param scene defines the hosting scene\r\n * @param options defines optional options to transmit to constructors\r\n * @returns the new constructor or null\r\n */\r\n public static Construct(type: string, name: string, scene: Scene, options?: any): Nullable<() => Node> {\r\n const constructorFunc = this._NodeConstructors[type];\r\n\r\n if (!constructorFunc) {\r\n return null;\r\n }\r\n\r\n return constructorFunc(name, scene, options);\r\n }\r\n\r\n private _nodeDataStorage = new _InternalNodeDataInfo();\r\n\r\n /**\r\n * Gets or sets the name of the node\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Gets or sets the id of the node\r\n */\r\n @serialize()\r\n public id: string;\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n @serialize()\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets or sets a string used to store user defined state for the node\r\n */\r\n @serialize()\r\n public state = \"\";\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the node\r\n */\r\n @serialize()\r\n public metadata: any = null;\r\n\r\n /** @internal */\r\n public _internalMetadata: any;\r\n\r\n /**\r\n * For internal use only. Please do not use.\r\n */\r\n public reservedDataStore: any = null;\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility\r\n */\r\n public inspectableCustomProperties: IInspectable[];\r\n\r\n /**\r\n * Gets or sets the accessibility tag to describe the node for accessibility purpose.\r\n */\r\n public set accessibilityTag(value: Nullable) {\r\n this._accessibilityTag = value;\r\n this.onAccessibilityTagChangedObservable.notifyObservers(value);\r\n }\r\n\r\n public get accessibilityTag() {\r\n return this._accessibilityTag;\r\n }\r\n\r\n protected _accessibilityTag: Nullable = null;\r\n\r\n /**\r\n * Observable fired when an accessibility tag is changed\r\n */\r\n public onAccessibilityTagChangedObservable = new Observable>();\r\n\r\n /**\r\n * Gets or sets a boolean used to define if the node must be serialized\r\n */\r\n public get doNotSerialize() {\r\n if (this._nodeDataStorage._doNotSerialize) {\r\n return true;\r\n }\r\n\r\n if (this._parentNode) {\r\n return this._parentNode.doNotSerialize;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public set doNotSerialize(value: boolean) {\r\n this._nodeDataStorage._doNotSerialize = value;\r\n }\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable = null;\r\n\r\n /**\r\n * Gets a list of Animations associated with the node\r\n */\r\n public animations: Animation[] = [];\r\n protected _ranges: { [name: string]: Nullable } = {};\r\n\r\n /**\r\n * Callback raised when the node is ready to be used\r\n */\r\n public onReady: Nullable<(node: Node) => void> = null;\r\n\r\n /** @internal */\r\n public _currentRenderId = -1;\r\n private _parentUpdateId = -1;\r\n /** @internal */\r\n public _childUpdateId = -1;\r\n\r\n /** @internal */\r\n public _waitingParentId: Nullable = null;\r\n /** @internal */\r\n public _waitingParentInstanceIndex: Nullable = null;\r\n /** @internal */\r\n public _waitingParsedUniqueId: Nullable = null;\r\n /** @internal */\r\n public _scene: Scene;\r\n /** @internal */\r\n public _cache: any = {};\r\n\r\n protected _parentNode: Nullable = null;\r\n\r\n /** @internal */\r\n protected _children: Nullable = null;\r\n\r\n /** @internal */\r\n public _worldMatrix = Matrix.Identity();\r\n /** @internal */\r\n public _worldMatrixDeterminant = 0;\r\n /** @internal */\r\n public _worldMatrixDeterminantIsDirty = true;\r\n\r\n /**\r\n * Gets a boolean indicating if the node has been disposed\r\n * @returns true if the node was disposed\r\n */\r\n public isDisposed(): boolean {\r\n return this._nodeDataStorage._isDisposed;\r\n }\r\n\r\n /**\r\n * Gets or sets the parent of the node (without keeping the current position in the scene)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/parent\r\n */\r\n public set parent(parent: Nullable) {\r\n if (this._parentNode === parent) {\r\n return;\r\n }\r\n\r\n const previousParentNode = this._parentNode;\r\n\r\n // Remove self from list of children of parent\r\n if (this._parentNode && this._parentNode._children !== undefined && this._parentNode._children !== null) {\r\n const index = this._parentNode._children.indexOf(this);\r\n if (index !== -1) {\r\n this._parentNode._children.splice(index, 1);\r\n }\r\n\r\n if (!parent && !this._nodeDataStorage._isDisposed) {\r\n this._addToSceneRootNodes();\r\n }\r\n }\r\n\r\n // Store new parent\r\n this._parentNode = parent;\r\n this._isDirty = true;\r\n\r\n // Add as child to new parent\r\n if (this._parentNode) {\r\n if (this._parentNode._children === undefined || this._parentNode._children === null) {\r\n this._parentNode._children = new Array();\r\n }\r\n this._parentNode._children.push(this);\r\n\r\n if (!previousParentNode) {\r\n this._removeFromSceneRootNodes();\r\n }\r\n }\r\n\r\n // Enabled state\r\n this._syncParentEnabledState();\r\n }\r\n\r\n public get parent(): Nullable {\r\n return this._parentNode;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _serializeAsParent(serializationObject: any): void {\r\n serializationObject.parentId = this.uniqueId;\r\n }\r\n\r\n /** @internal */\r\n public _addToSceneRootNodes() {\r\n if (this._nodeDataStorage._sceneRootNodesIndex === -1) {\r\n this._nodeDataStorage._sceneRootNodesIndex = this._scene.rootNodes.length;\r\n this._scene.rootNodes.push(this);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _removeFromSceneRootNodes() {\r\n if (this._nodeDataStorage._sceneRootNodesIndex !== -1) {\r\n const rootNodes = this._scene.rootNodes;\r\n const lastIdx = rootNodes.length - 1;\r\n rootNodes[this._nodeDataStorage._sceneRootNodesIndex] = rootNodes[lastIdx];\r\n rootNodes[this._nodeDataStorage._sceneRootNodesIndex]._nodeDataStorage._sceneRootNodesIndex = this._nodeDataStorage._sceneRootNodesIndex;\r\n this._scene.rootNodes.pop();\r\n this._nodeDataStorage._sceneRootNodesIndex = -1;\r\n }\r\n }\r\n\r\n private _animationPropertiesOverride: Nullable = null;\r\n\r\n /**\r\n * Gets or sets the animation properties override\r\n */\r\n public get animationPropertiesOverride(): Nullable {\r\n if (!this._animationPropertiesOverride) {\r\n return this._scene.animationPropertiesOverride;\r\n }\r\n return this._animationPropertiesOverride;\r\n }\r\n\r\n public set animationPropertiesOverride(value: Nullable) {\r\n this._animationPropertiesOverride = value;\r\n }\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"Node\" string\r\n */\r\n public getClassName(): string {\r\n return \"Node\";\r\n }\r\n\r\n /** @internal */\r\n public readonly _isNode = true;\r\n\r\n /**\r\n * An event triggered when the mesh is disposed\r\n */\r\n public onDisposeObservable = new Observable();\r\n\r\n private _onDisposeObserver: Nullable> = null;\r\n /**\r\n * Sets a callback that will be raised when the node will be disposed\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the enabled state of the node changes\r\n */\r\n public get onEnabledStateChangedObservable(): Observable {\r\n return this._nodeDataStorage._onEnabledStateChangedObservable;\r\n }\r\n\r\n /**\r\n * An event triggered when the node is cloned\r\n */\r\n public get onClonedObservable(): Observable {\r\n return this._nodeDataStorage._onClonedObservable;\r\n }\r\n\r\n /**\r\n * Creates a new Node\r\n * @param name the name and id to be given to this node\r\n * @param scene the scene this node will be added to\r\n */\r\n constructor(name: string, scene: Nullable = null) {\r\n this.name = name;\r\n this.id = name;\r\n this._scene = (scene || EngineStore.LastCreatedScene);\r\n this.uniqueId = this._scene.getUniqueId();\r\n this._initCache();\r\n }\r\n\r\n /**\r\n * Gets the scene of the node\r\n * @returns a scene\r\n */\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Gets the engine of the node\r\n * @returns a Engine\r\n */\r\n public getEngine(): Engine {\r\n return this._scene.getEngine();\r\n }\r\n\r\n // Behaviors\r\n private _behaviors = new Array>();\r\n\r\n /**\r\n * Attach a behavior to the node\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\r\n * @param behavior defines the behavior to attach\r\n * @param attachImmediately defines that the behavior must be attached even if the scene is still loading\r\n * @returns the current Node\r\n */\r\n public addBehavior(behavior: Behavior, attachImmediately = false): Node {\r\n const index = this._behaviors.indexOf(behavior);\r\n\r\n if (index !== -1) {\r\n return this;\r\n }\r\n\r\n behavior.init();\r\n if (this._scene.isLoading && !attachImmediately) {\r\n // We defer the attach when the scene will be loaded\r\n this._scene.onDataLoadedObservable.addOnce(() => {\r\n behavior.attach(this);\r\n });\r\n } else {\r\n behavior.attach(this);\r\n }\r\n this._behaviors.push(behavior);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove an attached behavior\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\r\n * @param behavior defines the behavior to attach\r\n * @returns the current Node\r\n */\r\n public removeBehavior(behavior: Behavior): Node {\r\n const index = this._behaviors.indexOf(behavior);\r\n\r\n if (index === -1) {\r\n return this;\r\n }\r\n\r\n this._behaviors[index].detach();\r\n this._behaviors.splice(index, 1);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the list of attached behaviors\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\r\n */\r\n public get behaviors(): Behavior[] {\r\n return this._behaviors;\r\n }\r\n\r\n /**\r\n * Gets an attached behavior by name\r\n * @param name defines the name of the behavior to look for\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\r\n * @returns null if behavior was not found else the requested behavior\r\n */\r\n public getBehaviorByName(name: string): Nullable> {\r\n for (const behavior of this._behaviors) {\r\n if (behavior.name === name) {\r\n return behavior;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the latest update of the World matrix\r\n * @returns a Matrix\r\n */\r\n public getWorldMatrix(): Matrix {\r\n if (this._currentRenderId !== this._scene.getRenderId()) {\r\n this.computeWorldMatrix();\r\n }\r\n return this._worldMatrix;\r\n }\r\n\r\n /** @internal */\r\n public _getWorldMatrixDeterminant(): number {\r\n if (this._worldMatrixDeterminantIsDirty) {\r\n this._worldMatrixDeterminantIsDirty = false;\r\n this._worldMatrixDeterminant = this._worldMatrix.determinant();\r\n }\r\n return this._worldMatrixDeterminant;\r\n }\r\n\r\n /**\r\n * Returns directly the latest state of the mesh World matrix.\r\n * A Matrix is returned.\r\n */\r\n public get worldMatrixFromCache(): Matrix {\r\n return this._worldMatrix;\r\n }\r\n\r\n // override it in derived class if you add new variables to the cache\r\n // and call the parent class method\r\n /** @internal */\r\n public _initCache() {\r\n this._cache = {};\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public updateCache(force?: boolean): void {\r\n if (!force && this.isSynchronized()) {\r\n return;\r\n }\r\n\r\n this._updateCache();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getActionManagerForTrigger(trigger?: number, _initialCall = true): Nullable {\r\n if (!this.parent) {\r\n return null;\r\n }\r\n\r\n return this.parent._getActionManagerForTrigger(trigger, false);\r\n }\r\n\r\n // override it in derived class if you add new variables to the cache\r\n // and call the parent class method if !ignoreParentClass\r\n /**\r\n * @internal\r\n */\r\n public _updateCache(_ignoreParentClass?: boolean): void {}\r\n\r\n // override it in derived class if you add new variables to the cache\r\n /** @internal */\r\n public _isSynchronized(): boolean {\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _markSyncedWithParent() {\r\n if (this._parentNode) {\r\n this._parentUpdateId = this._parentNode._childUpdateId;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public isSynchronizedWithParent(): boolean {\r\n if (!this._parentNode) {\r\n return true;\r\n }\r\n\r\n if (this._parentNode._isDirty || this._parentUpdateId !== this._parentNode._childUpdateId) {\r\n return false;\r\n }\r\n\r\n return this._parentNode.isSynchronized();\r\n }\r\n\r\n /** @internal */\r\n public isSynchronized(): boolean {\r\n if (this._parentNode && !this.isSynchronizedWithParent()) {\r\n return false;\r\n }\r\n\r\n return this._isSynchronized();\r\n }\r\n\r\n /**\r\n * Is this node ready to be used/rendered\r\n * @param _completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\r\n * @returns true if the node is ready\r\n */\r\n public isReady(_completeCheck = false): boolean {\r\n return this._nodeDataStorage._isReady;\r\n }\r\n\r\n /**\r\n * Flag the node as dirty (Forcing it to update everything)\r\n * @param _property helps children apply precise \"dirtyfication\"\r\n * @returns this node\r\n */\r\n public markAsDirty(_property?: string): Node {\r\n this._currentRenderId = Number.MAX_VALUE;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Is this node enabled?\r\n * If the node has a parent, all ancestors will be checked and false will be returned if any are false (not enabled), otherwise will return true\r\n * @param checkAncestors indicates if this method should check the ancestors. The default is to check the ancestors. If set to false, the method will return the value of this node without checking ancestors\r\n * @returns whether this node (and its parent) is enabled\r\n */\r\n public isEnabled(checkAncestors: boolean = true): boolean {\r\n if (checkAncestors === false) {\r\n return this._nodeDataStorage._isEnabled;\r\n }\r\n\r\n if (!this._nodeDataStorage._isEnabled) {\r\n return false;\r\n }\r\n\r\n return this._nodeDataStorage._isParentEnabled;\r\n }\r\n\r\n /** @internal */\r\n protected _syncParentEnabledState() {\r\n this._nodeDataStorage._isParentEnabled = this._parentNode ? this._parentNode.isEnabled() : true;\r\n\r\n if (this._children) {\r\n this._children.forEach((c) => {\r\n c._syncParentEnabledState(); // Force children to update accordingly\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Set the enabled state of this node\r\n * @param value defines the new enabled state\r\n */\r\n public setEnabled(value: boolean): void {\r\n if (this._nodeDataStorage._isEnabled === value) {\r\n return;\r\n }\r\n this._nodeDataStorage._isEnabled = value;\r\n this._syncParentEnabledState();\r\n this._nodeDataStorage._onEnabledStateChangedObservable.notifyObservers(value);\r\n }\r\n\r\n /**\r\n * Is this node a descendant of the given node?\r\n * The function will iterate up the hierarchy until the ancestor was found or no more parents defined\r\n * @param ancestor defines the parent node to inspect\r\n * @returns a boolean indicating if this node is a descendant of the given node\r\n */\r\n public isDescendantOf(ancestor: Node): boolean {\r\n if (this.parent) {\r\n if (this.parent === ancestor) {\r\n return true;\r\n }\r\n\r\n return this.parent.isDescendantOf(ancestor);\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getDescendants(results: Node[], directDescendantsOnly: boolean = false, predicate?: (node: Node) => boolean): void {\r\n if (!this._children) {\r\n return;\r\n }\r\n\r\n for (let index = 0; index < this._children.length; index++) {\r\n const item = this._children[index];\r\n\r\n if (!predicate || predicate(item)) {\r\n results.push(item);\r\n }\r\n\r\n if (!directDescendantsOnly) {\r\n item._getDescendants(results, false, predicate);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Will return all nodes that have this node as ascendant\r\n * @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\r\n * @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\r\n * @returns all children nodes of all types\r\n */\r\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (node: Node) => node is T): T[];\r\n\r\n /**\r\n * Will return all nodes that have this node as ascendant\r\n * @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\r\n * @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\r\n * @returns all children nodes of all types\r\n */\r\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): Node[];\r\n\r\n /**\r\n * Will return all nodes that have this node as ascendant\r\n * @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\r\n * @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\r\n * @returns all children nodes of all types\r\n */\r\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): Node[] {\r\n const results: Node[] = [];\r\n\r\n this._getDescendants(results, directDescendantsOnly, predicate);\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Get all child-meshes of this node\r\n * @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 (Default: false)\r\n * @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\r\n * @returns an array of AbstractMesh\r\n */\r\n public getChildMeshes(directDescendantsOnly?: boolean, predicate?: (node: Node) => node is T): T[];\r\n\r\n /**\r\n * Get all child-meshes of this node\r\n * @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 (Default: false)\r\n * @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\r\n * @returns an array of AbstractMesh\r\n */\r\n public getChildMeshes(directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): AbstractMesh[];\r\n\r\n /**\r\n * Get all child-meshes of this node\r\n * @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 (Default: false)\r\n * @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\r\n * @returns an array of AbstractMesh\r\n */\r\n public getChildMeshes(directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): AbstractMesh[] {\r\n const results: Array = [];\r\n this._getDescendants(results, directDescendantsOnly, (node: Node) => {\r\n return (!predicate || predicate(node)) && (node).cullingStrategy !== undefined;\r\n });\r\n return results;\r\n }\r\n\r\n /**\r\n * Get all direct children of this node\r\n * @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\r\n * @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 (Default: true)\r\n * @returns an array of Node\r\n */\r\n public getChildren(predicate?: (node: Node) => node is T, directDescendantsOnly?: boolean): T[];\r\n\r\n /**\r\n * Get all direct children of this node\r\n * @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\r\n * @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 (Default: true)\r\n * @returns an array of Node\r\n */\r\n public getChildren(predicate?: (node: Node) => boolean, directDescendantsOnly?: boolean): Node[];\r\n\r\n /**\r\n * Get all direct children of this node\r\n * @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\r\n * @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 (Default: true)\r\n * @returns an array of Node\r\n */\r\n public getChildren(predicate?: (node: Node) => boolean, directDescendantsOnly = true): Node[] {\r\n return this.getDescendants(directDescendantsOnly, predicate);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setReady(state: boolean): void {\r\n if (state === this._nodeDataStorage._isReady) {\r\n return;\r\n }\r\n\r\n if (!state) {\r\n this._nodeDataStorage._isReady = false;\r\n return;\r\n }\r\n\r\n if (this.onReady) {\r\n this.onReady(this);\r\n }\r\n this._nodeDataStorage._isReady = true;\r\n }\r\n\r\n /**\r\n * Get an animation by name\r\n * @param name defines the name of the animation to look for\r\n * @returns null if not found else the requested animation\r\n */\r\n public getAnimationByName(name: string): Nullable {\r\n for (let i = 0; i < this.animations.length; i++) {\r\n const animation = this.animations[i];\r\n\r\n if (animation.name === name) {\r\n return animation;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Creates an animation range for this node\r\n * @param name defines the name of the range\r\n * @param from defines the starting key\r\n * @param to defines the end key\r\n */\r\n public createAnimationRange(name: string, from: number, to: number): void {\r\n // check name not already in use\r\n if (!this._ranges[name]) {\r\n this._ranges[name] = Node._AnimationRangeFactory(name, from, to);\r\n for (let i = 0, nAnimations = this.animations.length; i < nAnimations; i++) {\r\n if (this.animations[i]) {\r\n this.animations[i].createRange(name, from, to);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Delete a specific animation range\r\n * @param name defines the name of the range to delete\r\n * @param deleteFrames defines if animation frames from the range must be deleted as well\r\n */\r\n public deleteAnimationRange(name: string, deleteFrames = true): void {\r\n for (let i = 0, nAnimations = this.animations.length; i < nAnimations; i++) {\r\n if (this.animations[i]) {\r\n this.animations[i].deleteRange(name, deleteFrames);\r\n }\r\n }\r\n this._ranges[name] = null; // said much faster than 'delete this._range[name]'\r\n }\r\n\r\n /**\r\n * Get an animation range by name\r\n * @param name defines the name of the animation range to look for\r\n * @returns null if not found else the requested animation range\r\n */\r\n public getAnimationRange(name: string): Nullable {\r\n return this._ranges[name] || null;\r\n }\r\n\r\n /**\r\n * Clone the current node\r\n * @param name Name of the new clone\r\n * @param newParent New parent for the clone\r\n * @param doNotCloneChildren Do not clone children hierarchy\r\n * @returns the new transform node\r\n */\r\n public clone(name: string, newParent: Nullable, doNotCloneChildren?: boolean): Nullable {\r\n const result = SerializationHelper.Clone(() => new Node(name, this.getScene()), this);\r\n\r\n if (newParent) {\r\n result.parent = newParent;\r\n }\r\n\r\n if (!doNotCloneChildren) {\r\n // Children\r\n const directDescendants = this.getDescendants(true);\r\n for (let index = 0; index < directDescendants.length; index++) {\r\n const child = directDescendants[index];\r\n\r\n child.clone(name + \".\" + child.name, result);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the list of all animation ranges defined on this node\r\n * @returns an array\r\n */\r\n public getAnimationRanges(): Nullable[] {\r\n const animationRanges: Nullable[] = [];\r\n let name: string;\r\n for (name in this._ranges) {\r\n animationRanges.push(this._ranges[name]);\r\n }\r\n return animationRanges;\r\n }\r\n\r\n /**\r\n * Will start the animation sequence\r\n * @param name defines the range frames for animation sequence\r\n * @param loop defines if the animation should loop (false by default)\r\n * @param speedRatio defines the speed factor in which to run the animation (1 by default)\r\n * @param onAnimationEnd defines a function to be executed when the animation ended (undefined by default)\r\n * @returns the object created for this animation. If range does not exist, it will return null\r\n */\r\n public beginAnimation(name: string, loop?: boolean, speedRatio?: number, onAnimationEnd?: () => void): Nullable {\r\n const range = this.getAnimationRange(name);\r\n\r\n if (!range) {\r\n return null;\r\n }\r\n\r\n return this._scene.beginAnimation(this, range.from, range.to, loop, speedRatio, onAnimationEnd);\r\n }\r\n\r\n /**\r\n * Serialize animation ranges into a JSON compatible object\r\n * @returns serialization object\r\n */\r\n public serializeAnimationRanges(): any {\r\n const serializationRanges = [];\r\n for (const name in this._ranges) {\r\n const localRange = this._ranges[name];\r\n if (!localRange) {\r\n continue;\r\n }\r\n const range: any = {};\r\n range.name = name;\r\n range.from = localRange.from;\r\n range.to = localRange.to;\r\n serializationRanges.push(range);\r\n }\r\n return serializationRanges;\r\n }\r\n\r\n /**\r\n * Computes the world matrix of the node\r\n * @param _force defines if the cache version should be invalidated forcing the world matrix to be created from scratch\r\n * @returns the world matrix\r\n */\r\n public computeWorldMatrix(_force?: boolean): Matrix {\r\n if (!this._worldMatrix) {\r\n this._worldMatrix = Matrix.Identity();\r\n }\r\n return this._worldMatrix;\r\n }\r\n\r\n /**\r\n * Releases resources associated with this node.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n this._nodeDataStorage._isDisposed = true;\r\n\r\n if (!doNotRecurse) {\r\n const nodes = this.getDescendants(true);\r\n for (const node of nodes) {\r\n node.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n }\r\n\r\n if (!this.parent) {\r\n this._removeFromSceneRootNodes();\r\n } else {\r\n this.parent = null;\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n\r\n this.onEnabledStateChangedObservable.clear();\r\n this.onClonedObservable.clear();\r\n\r\n // Behaviors\r\n for (const behavior of this._behaviors) {\r\n behavior.detach();\r\n }\r\n\r\n this._behaviors.length = 0;\r\n\r\n this.metadata = null;\r\n }\r\n\r\n /**\r\n * Parse animation range data from a serialization object and store them into a given node\r\n * @param node defines where to store the animation ranges\r\n * @param parsedNode defines the serialization object to read data from\r\n * @param _scene defines the hosting scene\r\n */\r\n public static ParseAnimationRanges(node: Node, parsedNode: any, _scene: Scene): void {\r\n if (parsedNode.ranges) {\r\n for (let index = 0; index < parsedNode.ranges.length; index++) {\r\n const data = parsedNode.ranges[index];\r\n node.createAnimationRange(data.name, data.from, data.to);\r\n }\r\n }\r\n }\r\n /**\r\n * Return the minimum and maximum world vectors of the entire hierarchy under current node\r\n * @param includeDescendants Include bounding info from descendants as well (true by default)\r\n * @param predicate defines a callback function that can be customize to filter what meshes should be included in the list used to compute the bounding vectors\r\n * @returns the new bounding vectors\r\n */\r\n public getHierarchyBoundingVectors(includeDescendants = true, predicate: Nullable<(abstractMesh: AbstractMesh) => boolean> = null): { min: Vector3; max: Vector3 } {\r\n // Ensures that all world matrix will be recomputed.\r\n this.getScene().incrementRenderId();\r\n\r\n this.computeWorldMatrix(true);\r\n\r\n let min: Vector3;\r\n let max: Vector3;\r\n\r\n const thisAbstractMesh = this as Node as AbstractMesh;\r\n if (thisAbstractMesh.getBoundingInfo && thisAbstractMesh.subMeshes) {\r\n // If this is an abstract mesh get its bounding info\r\n const boundingInfo = thisAbstractMesh.getBoundingInfo();\r\n min = boundingInfo.boundingBox.minimumWorld.clone();\r\n max = boundingInfo.boundingBox.maximumWorld.clone();\r\n } else {\r\n min = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n max = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n }\r\n\r\n if (includeDescendants) {\r\n const descendants = this.getDescendants(false);\r\n\r\n for (const descendant of descendants) {\r\n const childMesh = descendant;\r\n childMesh.computeWorldMatrix(true);\r\n\r\n // Filters meshes based on custom predicate function.\r\n if (predicate && !predicate(childMesh)) {\r\n continue;\r\n }\r\n\r\n //make sure we have the needed params to get mix and max\r\n if (!childMesh.getBoundingInfo || childMesh.getTotalVertices() === 0) {\r\n continue;\r\n }\r\n\r\n const childBoundingInfo = childMesh.getBoundingInfo();\r\n const boundingBox = childBoundingInfo.boundingBox;\r\n\r\n const minBox = boundingBox.minimumWorld;\r\n const maxBox = boundingBox.maximumWorld;\r\n\r\n Vector3.CheckExtends(minBox, min, max);\r\n Vector3.CheckExtends(maxBox, min, max);\r\n }\r\n }\r\n\r\n return {\r\n min: min,\r\n max: max,\r\n };\r\n }\r\n}\r\n", "import { Vector3 } from \"./math.vector\";\r\n\r\n/** Defines supported spaces */\r\nexport enum Space {\r\n /** Local (object) space */\r\n LOCAL = 0,\r\n /** World space */\r\n WORLD = 1,\r\n /** Bone space */\r\n BONE = 2,\r\n}\r\n\r\n/** Defines the 3 main axes */\r\nexport class Axis {\r\n /** X axis */\r\n public static X: Vector3 = new Vector3(1.0, 0.0, 0.0);\r\n /** Y axis */\r\n public static Y: Vector3 = new Vector3(0.0, 1.0, 0.0);\r\n /** Z axis */\r\n public static Z: Vector3 = new Vector3(0.0, 0.0, 1.0);\r\n}\r\n\r\n/**\r\n * Defines cartesian components.\r\n */\r\nexport enum Coordinate {\r\n /** X axis */\r\n X,\r\n /** Y axis */\r\n Y,\r\n /** Z axis */\r\n Z,\r\n}\r\n", "import type { DeepImmutable, Nullable } from \"../types\";\r\nimport { serialize, serializeAsVector3, serializeAsQuaternion } from \"../Misc/decorators\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport { Observable } from \"../Misc/observable\";\r\n\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Quaternion, Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Node } from \"../node\";\r\nimport type { Bone } from \"../Bones/bone\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Space } from \"../Maths/math.axis\";\r\nimport { GetClass } from \"../Misc/typeStore\";\r\n\r\nconst convertRHSToLHS = Matrix.Compose(Vector3.One(), Quaternion.FromEulerAngles(0, Math.PI, 0), Vector3.Zero());\r\n\r\n/**\r\n * A TransformNode is an object that is not rendered but can be used as a center of transformation. This can decrease memory usage and increase rendering speed compared to using an empty mesh as a parent and is less complicated than using a pivot matrix.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/transform_node\r\n */\r\nexport class TransformNode extends Node {\r\n // Statics\r\n /**\r\n * Object will not rotate to face the camera\r\n */\r\n public static BILLBOARDMODE_NONE = 0;\r\n /**\r\n * Object will rotate to face the camera but only on the x axis\r\n */\r\n public static BILLBOARDMODE_X = 1;\r\n /**\r\n * Object will rotate to face the camera but only on the y axis\r\n */\r\n public static BILLBOARDMODE_Y = 2;\r\n /**\r\n * Object will rotate to face the camera but only on the z axis\r\n */\r\n public static BILLBOARDMODE_Z = 4;\r\n /**\r\n * Object will rotate to face the camera\r\n */\r\n public static BILLBOARDMODE_ALL = 7;\r\n /**\r\n * Object will rotate to face the camera's position instead of orientation\r\n */\r\n public static BILLBOARDMODE_USE_POSITION = 128;\r\n /**\r\n * Child transform with Billboard flags should or should not apply parent rotation (default if off)\r\n */\r\n public static BillboardUseParentOrientation: boolean = false;\r\n\r\n private static _TmpRotation = Quaternion.Zero();\r\n private static _TmpScaling = Vector3.Zero();\r\n private static _TmpTranslation = Vector3.Zero();\r\n\r\n private _forward = new Vector3(0, 0, 1);\r\n private _up = new Vector3(0, 1, 0);\r\n private _right = new Vector3(1, 0, 0);\r\n\r\n // Properties\r\n @serializeAsVector3(\"position\")\r\n private _position = Vector3.Zero();\r\n\r\n @serializeAsVector3(\"rotation\")\r\n private _rotation = Vector3.Zero();\r\n\r\n @serializeAsQuaternion(\"rotationQuaternion\")\r\n private _rotationQuaternion: Nullable = null;\r\n\r\n @serializeAsVector3(\"scaling\")\r\n protected _scaling = Vector3.One();\r\n private _transformToBoneReferal: Nullable = null;\r\n private _currentParentWhenAttachingToBone: Nullable;\r\n private _isAbsoluteSynced = false;\r\n\r\n @serialize(\"billboardMode\")\r\n private _billboardMode = TransformNode.BILLBOARDMODE_NONE;\r\n\r\n /**\r\n * Gets or sets the billboard mode. Default is 0.\r\n *\r\n * | Value | Type | Description |\r\n * | --- | --- | --- |\r\n * | 0 | BILLBOARDMODE_NONE | |\r\n * | 1 | BILLBOARDMODE_X | |\r\n * | 2 | BILLBOARDMODE_Y | |\r\n * | 4 | BILLBOARDMODE_Z | |\r\n * | 7 | BILLBOARDMODE_ALL | |\r\n *\r\n */\r\n public get billboardMode() {\r\n return this._billboardMode;\r\n }\r\n\r\n public set billboardMode(value: number) {\r\n if (this._billboardMode === value) {\r\n return;\r\n }\r\n this._billboardMode = value;\r\n this._cache.useBillboardPosition = (this._billboardMode & TransformNode.BILLBOARDMODE_USE_POSITION) !== 0;\r\n this._computeUseBillboardPath();\r\n }\r\n\r\n private _preserveParentRotationForBillboard = false;\r\n /**\r\n * Gets or sets a boolean indicating that parent rotation should be preserved when using billboards.\r\n * This could be useful for glTF objects where parent rotation helps converting from right handed to left handed\r\n */\r\n public get preserveParentRotationForBillboard() {\r\n return this._preserveParentRotationForBillboard;\r\n }\r\n\r\n public set preserveParentRotationForBillboard(value: boolean) {\r\n if (value === this._preserveParentRotationForBillboard) {\r\n return;\r\n }\r\n this._preserveParentRotationForBillboard = value;\r\n this._computeUseBillboardPath();\r\n }\r\n\r\n private _computeUseBillboardPath(): void {\r\n this._cache.useBillboardPath = this._billboardMode !== TransformNode.BILLBOARDMODE_NONE && !this.preserveParentRotationForBillboard;\r\n }\r\n\r\n /**\r\n * Multiplication factor on scale x/y/z when computing the world matrix. Eg. for a 1x1x1 cube setting this to 2 will make it a 2x2x2 cube\r\n */\r\n @serialize()\r\n public scalingDeterminant = 1;\r\n\r\n @serialize(\"infiniteDistance\")\r\n private _infiniteDistance = false;\r\n\r\n /**\r\n * Gets or sets the distance of the object to max, often used by skybox\r\n */\r\n public get infiniteDistance() {\r\n return this._infiniteDistance;\r\n }\r\n\r\n public set infiniteDistance(value: boolean) {\r\n if (this._infiniteDistance === value) {\r\n return;\r\n }\r\n\r\n this._infiniteDistance = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that non uniform scaling (when at least one component is different from others) should be ignored.\r\n * By default the system will update normals to compensate\r\n */\r\n @serialize()\r\n public ignoreNonUniformScaling = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that even if rotationQuaternion is defined, you can keep updating rotation property and Babylon.js will just mix both\r\n */\r\n @serialize()\r\n public reIntegrateRotationIntoRotationQuaternion = false;\r\n\r\n // Cache\r\n /** @internal */\r\n public _poseMatrix: Nullable = null;\r\n /** @internal */\r\n public _localMatrix = Matrix.Zero();\r\n\r\n private _usePivotMatrix = false;\r\n private _absolutePosition = Vector3.Zero();\r\n private _absoluteScaling = Vector3.Zero();\r\n private _absoluteRotationQuaternion = Quaternion.Identity();\r\n private _pivotMatrix = Matrix.Identity();\r\n private _pivotMatrixInverse: Matrix;\r\n /** @internal */\r\n public _postMultiplyPivotMatrix = false;\r\n\r\n protected _isWorldMatrixFrozen = false;\r\n\r\n /** @internal */\r\n public _indexInSceneTransformNodesArray = -1;\r\n\r\n /**\r\n * An event triggered after the world matrix is updated\r\n */\r\n public onAfterWorldMatrixUpdateObservable = new Observable();\r\n\r\n constructor(name: string, scene: Nullable = null, isPure = true) {\r\n super(name, scene);\r\n\r\n if (isPure) {\r\n this.getScene().addTransformNode(this);\r\n }\r\n }\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"TransformNode\" string\r\n */\r\n public getClassName(): string {\r\n return \"TransformNode\";\r\n }\r\n\r\n /**\r\n * Gets or set the node position (default is (0.0, 0.0, 0.0))\r\n */\r\n public get position(): Vector3 {\r\n return this._position;\r\n }\r\n\r\n public set position(newPosition: Vector3) {\r\n this._position = newPosition;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * return true if a pivot has been set\r\n * @returns true if a pivot matrix is used\r\n */\r\n public isUsingPivotMatrix(): boolean {\r\n return this._usePivotMatrix;\r\n }\r\n\r\n /**\r\n * @returns true if pivot matrix must be cancelled in the world matrix. When this parameter is set to true (default), the inverse of the pivot matrix is also applied at the end to cancel the transformation effect.\r\n */\r\n public isUsingPostMultiplyPivotMatrix(): boolean {\r\n return this._postMultiplyPivotMatrix;\r\n }\r\n\r\n /**\r\n * Gets or sets the rotation property : a Vector3 defining the rotation value in radians around each local axis X, Y, Z (default is (0.0, 0.0, 0.0)).\r\n * If rotation quaternion is set, this Vector3 will be ignored and copy from the quaternion\r\n */\r\n public get rotation(): Vector3 {\r\n return this._rotation;\r\n }\r\n\r\n public set rotation(newRotation: Vector3) {\r\n this._rotation = newRotation;\r\n this._rotationQuaternion = null;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Gets or sets the scaling property : a Vector3 defining the node scaling along each local axis X, Y, Z (default is (1.0, 1.0, 1.0)).\r\n */\r\n public get scaling(): Vector3 {\r\n return this._scaling;\r\n }\r\n\r\n public set scaling(newScaling: Vector3) {\r\n this._scaling = newScaling;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Gets or sets the rotation Quaternion property : this a Quaternion object defining the node rotation by using a unit quaternion (undefined by default, but can be null).\r\n * If set, only the rotationQuaternion is then used to compute the node rotation (ie. node.rotation will be ignored)\r\n */\r\n public get rotationQuaternion(): Nullable {\r\n return this._rotationQuaternion;\r\n }\r\n\r\n public set rotationQuaternion(quaternion: Nullable) {\r\n this._rotationQuaternion = quaternion;\r\n //reset the rotation vector.\r\n if (quaternion) {\r\n this._rotation.setAll(0.0);\r\n }\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * The forward direction of that transform in world space.\r\n */\r\n public get forward(): Vector3 {\r\n Vector3.TransformNormalFromFloatsToRef(0, 0, this.getScene().useRightHandedSystem ? -1.0 : 1.0, this.getWorldMatrix(), this._forward);\r\n return this._forward.normalize();\r\n }\r\n\r\n /**\r\n * The up direction of that transform in world space.\r\n */\r\n public get up(): Vector3 {\r\n Vector3.TransformNormalFromFloatsToRef(0, 1, 0, this.getWorldMatrix(), this._up);\r\n return this._up.normalize();\r\n }\r\n\r\n /**\r\n * The right direction of that transform in world space.\r\n */\r\n public get right(): Vector3 {\r\n Vector3.TransformNormalFromFloatsToRef(this.getScene().useRightHandedSystem ? -1.0 : 1.0, 0, 0, this.getWorldMatrix(), this._right);\r\n return this._right.normalize();\r\n }\r\n\r\n /**\r\n * Copies the parameter passed Matrix into the mesh Pose matrix.\r\n * @param matrix the matrix to copy the pose from\r\n * @returns this TransformNode.\r\n */\r\n public updatePoseMatrix(matrix: Matrix): TransformNode {\r\n if (!this._poseMatrix) {\r\n this._poseMatrix = matrix.clone();\r\n return this;\r\n }\r\n this._poseMatrix.copyFrom(matrix);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh Pose matrix.\r\n * @returns the pose matrix\r\n */\r\n public getPoseMatrix(): Matrix {\r\n if (!this._poseMatrix) {\r\n this._poseMatrix = Matrix.Identity();\r\n }\r\n return this._poseMatrix;\r\n }\r\n\r\n /** @internal */\r\n public _isSynchronized(): boolean {\r\n const cache = this._cache;\r\n\r\n if (this._billboardMode !== cache.billboardMode || this._billboardMode !== TransformNode.BILLBOARDMODE_NONE) {\r\n return false;\r\n }\r\n\r\n if (cache.pivotMatrixUpdated) {\r\n return false;\r\n }\r\n\r\n if (this._infiniteDistance) {\r\n return false;\r\n }\r\n\r\n if (this._position._isDirty) {\r\n return false;\r\n }\r\n\r\n if (this._scaling._isDirty) {\r\n return false;\r\n }\r\n\r\n if ((this._rotationQuaternion && this._rotationQuaternion._isDirty) || this._rotation._isDirty) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _initCache() {\r\n super._initCache();\r\n\r\n const cache = this._cache;\r\n cache.localMatrixUpdated = false;\r\n cache.billboardMode = -1;\r\n cache.infiniteDistance = false;\r\n cache.useBillboardPosition = false;\r\n cache.useBillboardPath = false;\r\n }\r\n\r\n /**\r\n * Returns the current mesh absolute position.\r\n * Returns a Vector3.\r\n */\r\n public get absolutePosition(): Vector3 {\r\n return this.getAbsolutePosition();\r\n }\r\n\r\n /**\r\n * Returns the current mesh absolute scaling.\r\n * Returns a Vector3.\r\n */\r\n public get absoluteScaling(): Vector3 {\r\n this._syncAbsoluteScalingAndRotation();\r\n return this._absoluteScaling;\r\n }\r\n\r\n /**\r\n * Returns the current mesh absolute rotation.\r\n * Returns a Quaternion.\r\n */\r\n public get absoluteRotationQuaternion(): Quaternion {\r\n this._syncAbsoluteScalingAndRotation();\r\n return this._absoluteRotationQuaternion;\r\n }\r\n\r\n /**\r\n * Sets a new matrix to apply before all other transformation\r\n * @param matrix defines the transform matrix\r\n * @returns the current TransformNode\r\n */\r\n public setPreTransformMatrix(matrix: Matrix): TransformNode {\r\n return this.setPivotMatrix(matrix, false);\r\n }\r\n\r\n /**\r\n * Sets a new pivot matrix to the current node\r\n * @param matrix defines the new pivot matrix to use\r\n * @param postMultiplyPivotMatrix defines if the pivot matrix must be cancelled in the world matrix. When this parameter is set to true (default), the inverse of the pivot matrix is also applied at the end to cancel the transformation effect\r\n * @returns the current TransformNode\r\n */\r\n public setPivotMatrix(matrix: DeepImmutable, postMultiplyPivotMatrix = true): TransformNode {\r\n this._pivotMatrix.copyFrom(matrix);\r\n this._usePivotMatrix = !this._pivotMatrix.isIdentity();\r\n\r\n this._cache.pivotMatrixUpdated = true;\r\n this._postMultiplyPivotMatrix = postMultiplyPivotMatrix;\r\n\r\n if (this._postMultiplyPivotMatrix) {\r\n if (!this._pivotMatrixInverse) {\r\n this._pivotMatrixInverse = Matrix.Invert(this._pivotMatrix);\r\n } else {\r\n this._pivotMatrix.invertToRef(this._pivotMatrixInverse);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh pivot matrix.\r\n * Default : Identity.\r\n * @returns the matrix\r\n */\r\n public getPivotMatrix(): Matrix {\r\n return this._pivotMatrix;\r\n }\r\n\r\n /**\r\n * Instantiate (when possible) or clone that node with its hierarchy\r\n * @param newParent defines the new parent to use for the instance (or clone)\r\n * @param options defines options to configure how copy is done\r\n * @param options.doNotInstantiate defines if the model must be instantiated or just cloned\r\n * @param onNewNodeCreated defines an option callback to call when a clone or an instance is created\r\n * @returns an instance (or a clone) of the current node with its hierarchy\r\n */\r\n public instantiateHierarchy(\r\n newParent: Nullable = null,\r\n options?: { doNotInstantiate: boolean | ((node: TransformNode) => boolean) },\r\n onNewNodeCreated?: (source: TransformNode, clone: TransformNode) => void\r\n ): Nullable {\r\n const clone = this.clone(\"Clone of \" + (this.name || this.id), newParent || this.parent, true);\r\n\r\n if (clone) {\r\n if (onNewNodeCreated) {\r\n onNewNodeCreated(this, clone);\r\n }\r\n }\r\n\r\n for (const child of this.getChildTransformNodes(true)) {\r\n child.instantiateHierarchy(clone, options, onNewNodeCreated);\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Prevents the World matrix to be computed any longer\r\n * @param newWorldMatrix defines an optional matrix to use as world matrix\r\n * @param decompose defines whether to decompose the given newWorldMatrix or directly assign\r\n * @returns the TransformNode.\r\n */\r\n public freezeWorldMatrix(newWorldMatrix: Nullable = null, decompose = false): TransformNode {\r\n if (newWorldMatrix) {\r\n if (decompose) {\r\n this._rotation.setAll(0);\r\n this._rotationQuaternion = this._rotationQuaternion || Quaternion.Identity();\r\n newWorldMatrix.decompose(this._scaling, this._rotationQuaternion, this._position);\r\n this.computeWorldMatrix(true);\r\n } else {\r\n this._worldMatrix = newWorldMatrix;\r\n this._absolutePosition.copyFromFloats(this._worldMatrix.m[12], this._worldMatrix.m[13], this._worldMatrix.m[14]);\r\n this._afterComputeWorldMatrix();\r\n }\r\n } else {\r\n this._isWorldMatrixFrozen = false; // no guarantee world is not already frozen, switch off temporarily\r\n this.computeWorldMatrix(true);\r\n }\r\n this._isDirty = false;\r\n this._isWorldMatrixFrozen = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Allows back the World matrix computation.\r\n * @returns the TransformNode.\r\n */\r\n public unfreezeWorldMatrix() {\r\n this._isWorldMatrixFrozen = false;\r\n this.computeWorldMatrix(true);\r\n return this;\r\n }\r\n\r\n /**\r\n * True if the World matrix has been frozen.\r\n */\r\n public get isWorldMatrixFrozen(): boolean {\r\n return this._isWorldMatrixFrozen;\r\n }\r\n\r\n /**\r\n * Returns the mesh absolute position in the World.\r\n * @returns a Vector3.\r\n */\r\n public getAbsolutePosition(): Vector3 {\r\n this.computeWorldMatrix();\r\n return this._absolutePosition;\r\n }\r\n\r\n /**\r\n * Sets the mesh absolute position in the World from a Vector3 or an Array(3).\r\n * @param absolutePosition the absolute position to set\r\n * @returns the TransformNode.\r\n */\r\n public setAbsolutePosition(absolutePosition: Vector3): TransformNode {\r\n if (!absolutePosition) {\r\n return this;\r\n }\r\n let absolutePositionX;\r\n let absolutePositionY;\r\n let absolutePositionZ;\r\n if (absolutePosition.x === undefined) {\r\n if (arguments.length < 3) {\r\n return this;\r\n }\r\n absolutePositionX = arguments[0];\r\n absolutePositionY = arguments[1];\r\n absolutePositionZ = arguments[2];\r\n } else {\r\n absolutePositionX = absolutePosition.x;\r\n absolutePositionY = absolutePosition.y;\r\n absolutePositionZ = absolutePosition.z;\r\n }\r\n if (this.parent) {\r\n const invertParentWorldMatrix = TmpVectors.Matrix[0];\r\n this.parent.getWorldMatrix().invertToRef(invertParentWorldMatrix);\r\n Vector3.TransformCoordinatesFromFloatsToRef(absolutePositionX, absolutePositionY, absolutePositionZ, invertParentWorldMatrix, this.position);\r\n } else {\r\n this.position.x = absolutePositionX;\r\n this.position.y = absolutePositionY;\r\n this.position.z = absolutePositionZ;\r\n }\r\n\r\n this._absolutePosition.copyFrom(absolutePosition);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the mesh position in its local space.\r\n * @param vector3 the position to set in localspace\r\n * @returns the TransformNode.\r\n */\r\n public setPositionWithLocalVector(vector3: Vector3): TransformNode {\r\n this.computeWorldMatrix();\r\n this.position = Vector3.TransformNormal(vector3, this._localMatrix);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the mesh position in the local space from the current World matrix values.\r\n * @returns a new Vector3.\r\n */\r\n public getPositionExpressedInLocalSpace(): Vector3 {\r\n this.computeWorldMatrix();\r\n const invLocalWorldMatrix = TmpVectors.Matrix[0];\r\n this._localMatrix.invertToRef(invLocalWorldMatrix);\r\n return Vector3.TransformNormal(this.position, invLocalWorldMatrix);\r\n }\r\n\r\n /**\r\n * Translates the mesh along the passed Vector3 in its local space.\r\n * @param vector3 the distance to translate in localspace\r\n * @returns the TransformNode.\r\n */\r\n public locallyTranslate(vector3: Vector3): TransformNode {\r\n this.computeWorldMatrix(true);\r\n this.position = Vector3.TransformCoordinates(vector3, this._localMatrix);\r\n return this;\r\n }\r\n\r\n private static _LookAtVectorCache = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Orients a mesh towards a target point. Mesh must be drawn facing user.\r\n * @param targetPoint the position (must be in same space as current mesh) to look at\r\n * @param yawCor optional yaw (y-axis) correction in radians\r\n * @param pitchCor optional pitch (x-axis) correction in radians\r\n * @param rollCor optional roll (z-axis) correction in radians\r\n * @param space the chosen space of the target\r\n * @returns the TransformNode.\r\n */\r\n public lookAt(targetPoint: Vector3, yawCor: number = 0, pitchCor: number = 0, rollCor: number = 0, space: Space = Space.LOCAL): TransformNode {\r\n const dv = TransformNode._LookAtVectorCache;\r\n const pos = space === Space.LOCAL ? this.position : this.getAbsolutePosition();\r\n targetPoint.subtractToRef(pos, dv);\r\n this.setDirection(dv, yawCor, pitchCor, rollCor);\r\n\r\n // Correct for parent's rotation offset\r\n if (space === Space.WORLD && this.parent) {\r\n if (this.rotationQuaternion) {\r\n // Get local rotation matrix of the looking object\r\n const rotationMatrix = TmpVectors.Matrix[0];\r\n this.rotationQuaternion.toRotationMatrix(rotationMatrix);\r\n\r\n // Offset rotation by parent's inverted rotation matrix to correct in world space\r\n const parentRotationMatrix = TmpVectors.Matrix[1];\r\n this.parent.getWorldMatrix().getRotationMatrixToRef(parentRotationMatrix);\r\n parentRotationMatrix.invert();\r\n rotationMatrix.multiplyToRef(parentRotationMatrix, rotationMatrix);\r\n this.rotationQuaternion.fromRotationMatrix(rotationMatrix);\r\n } else {\r\n // Get local rotation matrix of the looking object\r\n const quaternionRotation = TmpVectors.Quaternion[0];\r\n Quaternion.FromEulerVectorToRef(this.rotation, quaternionRotation);\r\n const rotationMatrix = TmpVectors.Matrix[0];\r\n quaternionRotation.toRotationMatrix(rotationMatrix);\r\n\r\n // Offset rotation by parent's inverted rotation matrix to correct in world space\r\n const parentRotationMatrix = TmpVectors.Matrix[1];\r\n this.parent.getWorldMatrix().getRotationMatrixToRef(parentRotationMatrix);\r\n parentRotationMatrix.invert();\r\n rotationMatrix.multiplyToRef(parentRotationMatrix, rotationMatrix);\r\n quaternionRotation.fromRotationMatrix(rotationMatrix);\r\n quaternionRotation.toEulerAnglesToRef(this.rotation);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 that is the localAxis, expressed in the mesh local space, rotated like the mesh.\r\n * This Vector3 is expressed in the World space.\r\n * @param localAxis axis to rotate\r\n * @returns a new Vector3 that is the localAxis, expressed in the mesh local space, rotated like the mesh.\r\n */\r\n public getDirection(localAxis: Vector3): Vector3 {\r\n const result = Vector3.Zero();\r\n\r\n this.getDirectionToRef(localAxis, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the Vector3 \"result\" as the rotated Vector3 \"localAxis\" in the same rotation than the mesh.\r\n * localAxis is expressed in the mesh local space.\r\n * result is computed in the World space from the mesh World matrix.\r\n * @param localAxis axis to rotate\r\n * @param result the resulting transformnode\r\n * @returns this TransformNode.\r\n */\r\n public getDirectionToRef(localAxis: Vector3, result: Vector3): TransformNode {\r\n Vector3.TransformNormalToRef(localAxis, this.getWorldMatrix(), result);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets this transform node rotation to the given local axis.\r\n * @param localAxis the axis in local space\r\n * @param yawCor optional yaw (y-axis) correction in radians\r\n * @param pitchCor optional pitch (x-axis) correction in radians\r\n * @param rollCor optional roll (z-axis) correction in radians\r\n * @returns this TransformNode\r\n */\r\n public setDirection(localAxis: Vector3, yawCor: number = 0, pitchCor: number = 0, rollCor: number = 0): TransformNode {\r\n const yaw = -Math.atan2(localAxis.z, localAxis.x) + Math.PI / 2;\r\n const len = Math.sqrt(localAxis.x * localAxis.x + localAxis.z * localAxis.z);\r\n const pitch = -Math.atan2(localAxis.y, len);\r\n if (this.rotationQuaternion) {\r\n Quaternion.RotationYawPitchRollToRef(yaw + yawCor, pitch + pitchCor, rollCor, this.rotationQuaternion);\r\n } else {\r\n this.rotation.x = pitch + pitchCor;\r\n this.rotation.y = yaw + yawCor;\r\n this.rotation.z = rollCor;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a new pivot point to the current node\r\n * @param point defines the new pivot point to use\r\n * @param space defines if the point is in world or local space (local by default)\r\n * @returns the current TransformNode\r\n */\r\n public setPivotPoint(point: Vector3, space: Space = Space.LOCAL): TransformNode {\r\n if (this.getScene().getRenderId() == 0) {\r\n this.computeWorldMatrix(true);\r\n }\r\n\r\n const wm = this.getWorldMatrix();\r\n\r\n if (space == Space.WORLD) {\r\n const tmat = TmpVectors.Matrix[0];\r\n wm.invertToRef(tmat);\r\n point = Vector3.TransformCoordinates(point, tmat);\r\n }\r\n\r\n return this.setPivotMatrix(Matrix.Translation(-point.x, -point.y, -point.z), true);\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the mesh pivot point coordinates in the local space.\r\n * @returns the pivot point\r\n */\r\n public getPivotPoint(): Vector3 {\r\n const point = Vector3.Zero();\r\n this.getPivotPointToRef(point);\r\n return point;\r\n }\r\n\r\n /**\r\n * Sets the passed Vector3 \"result\" with the coordinates of the mesh pivot point in the local space.\r\n * @param result the vector3 to store the result\r\n * @returns this TransformNode.\r\n */\r\n public getPivotPointToRef(result: Vector3): TransformNode {\r\n result.x = -this._pivotMatrix.m[12];\r\n result.y = -this._pivotMatrix.m[13];\r\n result.z = -this._pivotMatrix.m[14];\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Vector3 set with the mesh pivot point World coordinates.\r\n * @returns a new Vector3 set with the mesh pivot point World coordinates.\r\n */\r\n public getAbsolutePivotPoint(): Vector3 {\r\n const point = Vector3.Zero();\r\n this.getAbsolutePivotPointToRef(point);\r\n return point;\r\n }\r\n\r\n /**\r\n * Sets the Vector3 \"result\" coordinates with the mesh pivot point World coordinates.\r\n * @param result vector3 to store the result\r\n * @returns this TransformNode.\r\n */\r\n public getAbsolutePivotPointToRef(result: Vector3): TransformNode {\r\n this.getPivotPointToRef(result);\r\n Vector3.TransformCoordinatesToRef(result, this.getWorldMatrix(), result);\r\n return this;\r\n }\r\n\r\n /**\r\n * Flag the transform node as dirty (Forcing it to update everything)\r\n * @param property if set to \"rotation\" the objects rotationQuaternion will be set to null\r\n * @returns this node\r\n */\r\n public markAsDirty(property?: string): Node {\r\n if (this._isDirty) {\r\n return this;\r\n }\r\n\r\n // We need to explicitly update the children\r\n // as the scene.evaluateActiveMeshes will not poll the transform nodes\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.markAsDirty(property);\r\n }\r\n }\r\n return super.markAsDirty(property);\r\n }\r\n\r\n /**\r\n * Defines the passed node as the parent of the current node.\r\n * The node will remain exactly where it is and its position / rotation will be updated accordingly.\r\n * Note that if the mesh has a pivot matrix / point defined it will be applied after the parent was updated.\r\n * In that case the node will not remain in the same space as it is, as the pivot will be applied.\r\n * To avoid this, you can set updatePivot to true and the pivot will be updated to identity\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/parent\r\n * @param node the node ot set as the parent\r\n * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.\r\n * @param updatePivot if true, update the pivot matrix to keep the node in the same space as before\r\n * @returns this TransformNode.\r\n */\r\n public setParent(node: Nullable, preserveScalingSign: boolean = false, updatePivot = false): TransformNode {\r\n if (!node && !this.parent) {\r\n return this;\r\n }\r\n\r\n const quatRotation = TmpVectors.Quaternion[0];\r\n const position = TmpVectors.Vector3[0];\r\n const scale = TmpVectors.Vector3[1];\r\n const invParentMatrix = TmpVectors.Matrix[1];\r\n Matrix.IdentityToRef(invParentMatrix);\r\n const composedMatrix = TmpVectors.Matrix[0];\r\n this.computeWorldMatrix(true);\r\n\r\n let currentRotation = this.rotationQuaternion;\r\n if (!currentRotation) {\r\n currentRotation = TransformNode._TmpRotation;\r\n Quaternion.RotationYawPitchRollToRef(this._rotation.y, this._rotation.x, this._rotation.z, currentRotation);\r\n }\r\n\r\n // current global transformation without pivot\r\n Matrix.ComposeToRef(this.scaling, currentRotation, this.position, composedMatrix);\r\n if (this.parent) {\r\n composedMatrix.multiplyToRef(this.parent.computeWorldMatrix(true), composedMatrix);\r\n }\r\n\r\n // is a node was set, calculate the difference between this and the node\r\n if (node) {\r\n node.computeWorldMatrix(true).invertToRef(invParentMatrix);\r\n composedMatrix.multiplyToRef(invParentMatrix, composedMatrix);\r\n }\r\n composedMatrix.decompose(scale, quatRotation, position, preserveScalingSign ? this : undefined);\r\n\r\n if (this.rotationQuaternion) {\r\n this.rotationQuaternion.copyFrom(quatRotation);\r\n } else {\r\n quatRotation.toEulerAnglesToRef(this.rotation);\r\n }\r\n\r\n this.scaling.copyFrom(scale);\r\n this.position.copyFrom(position);\r\n\r\n this.parent = node;\r\n\r\n if (updatePivot) {\r\n this.setPivotMatrix(Matrix.Identity());\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private _nonUniformScaling = false;\r\n /**\r\n * True if the scaling property of this object is non uniform eg. (1,2,1)\r\n */\r\n public get nonUniformScaling(): boolean {\r\n return this._nonUniformScaling;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateNonUniformScalingState(value: boolean): boolean {\r\n if (this._nonUniformScaling === value) {\r\n return false;\r\n }\r\n\r\n this._nonUniformScaling = value;\r\n return true;\r\n }\r\n\r\n /**\r\n * Attach the current TransformNode to another TransformNode associated with a bone\r\n * @param bone Bone affecting the TransformNode\r\n * @param affectedTransformNode TransformNode associated with the bone\r\n * @returns this object\r\n */\r\n public attachToBone(bone: Bone, affectedTransformNode: TransformNode): TransformNode {\r\n this._currentParentWhenAttachingToBone = this.parent;\r\n this._transformToBoneReferal = affectedTransformNode;\r\n this.parent = bone;\r\n\r\n bone.getSkeleton().prepare(true); // make sure bone.getFinalMatrix() is up to date\r\n\r\n if (bone.getFinalMatrix().determinant() < 0) {\r\n this.scalingDeterminant *= -1;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Detach the transform node if its associated with a bone\r\n * @param resetToPreviousParent Indicates if the parent that was in effect when attachToBone was called should be set back or if we should set parent to null instead (defaults to the latter)\r\n * @returns this object\r\n */\r\n public detachFromBone(resetToPreviousParent = false): TransformNode {\r\n if (!this.parent) {\r\n if (resetToPreviousParent) {\r\n this.parent = this._currentParentWhenAttachingToBone;\r\n }\r\n return this;\r\n }\r\n\r\n if (this.parent.getWorldMatrix().determinant() < 0) {\r\n this.scalingDeterminant *= -1;\r\n }\r\n this._transformToBoneReferal = null;\r\n if (resetToPreviousParent) {\r\n this.parent = this._currentParentWhenAttachingToBone;\r\n } else {\r\n this.parent = null;\r\n }\r\n return this;\r\n }\r\n\r\n private static _RotationAxisCache = new Quaternion();\r\n /**\r\n * Rotates the mesh around the axis vector for the passed angle (amount) expressed in radians, in the given space.\r\n * space (default LOCAL) can be either Space.LOCAL, either Space.WORLD.\r\n * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.\r\n * The passed axis is also normalized.\r\n * @param axis the axis to rotate around\r\n * @param amount the amount to rotate in radians\r\n * @param space Space to rotate in (Default: local)\r\n * @returns the TransformNode.\r\n */\r\n public rotate(axis: Vector3, amount: number, space?: Space): TransformNode {\r\n axis.normalize();\r\n if (!this.rotationQuaternion) {\r\n this.rotationQuaternion = this.rotation.toQuaternion();\r\n this.rotation.setAll(0);\r\n }\r\n let rotationQuaternion: Quaternion;\r\n if (!space || (space as any) === Space.LOCAL) {\r\n rotationQuaternion = Quaternion.RotationAxisToRef(axis, amount, TransformNode._RotationAxisCache);\r\n this.rotationQuaternion.multiplyToRef(rotationQuaternion, this.rotationQuaternion);\r\n } else {\r\n if (this.parent) {\r\n const parentWorldMatrix = this.parent.getWorldMatrix();\r\n const invertParentWorldMatrix = TmpVectors.Matrix[0];\r\n parentWorldMatrix.invertToRef(invertParentWorldMatrix);\r\n axis = Vector3.TransformNormal(axis, invertParentWorldMatrix);\r\n\r\n if (parentWorldMatrix.determinant() < 0) {\r\n amount *= -1;\r\n }\r\n }\r\n rotationQuaternion = Quaternion.RotationAxisToRef(axis, amount, TransformNode._RotationAxisCache);\r\n rotationQuaternion.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Rotates the mesh around the axis vector for the passed angle (amount) expressed in radians, in world space.\r\n * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.\r\n * The passed axis is also normalized. .\r\n * Method is based on http://www.euclideanspace.com/maths/geometry/affine/aroundPoint/index.htm\r\n * @param point the point to rotate around\r\n * @param axis the axis to rotate around\r\n * @param amount the amount to rotate in radians\r\n * @returns the TransformNode\r\n */\r\n public rotateAround(point: Vector3, axis: Vector3, amount: number): TransformNode {\r\n axis.normalize();\r\n if (!this.rotationQuaternion) {\r\n this.rotationQuaternion = Quaternion.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z);\r\n this.rotation.setAll(0);\r\n }\r\n\r\n const tmpVector = TmpVectors.Vector3[0];\r\n const finalScale = TmpVectors.Vector3[1];\r\n const finalTranslation = TmpVectors.Vector3[2];\r\n\r\n const finalRotation = TmpVectors.Quaternion[0];\r\n\r\n const translationMatrix = TmpVectors.Matrix[0]; // T\r\n const translationMatrixInv = TmpVectors.Matrix[1]; // T'\r\n const rotationMatrix = TmpVectors.Matrix[2]; // R\r\n const finalMatrix = TmpVectors.Matrix[3]; // T' x R x T\r\n\r\n point.subtractToRef(this.position, tmpVector);\r\n Matrix.TranslationToRef(tmpVector.x, tmpVector.y, tmpVector.z, translationMatrix); // T\r\n Matrix.TranslationToRef(-tmpVector.x, -tmpVector.y, -tmpVector.z, translationMatrixInv); // T'\r\n Matrix.RotationAxisToRef(axis, amount, rotationMatrix); // R\r\n\r\n translationMatrixInv.multiplyToRef(rotationMatrix, finalMatrix); // T' x R\r\n finalMatrix.multiplyToRef(translationMatrix, finalMatrix); // T' x R x T\r\n\r\n finalMatrix.decompose(finalScale, finalRotation, finalTranslation);\r\n\r\n this.position.addInPlace(finalTranslation);\r\n finalRotation.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Translates the mesh along the axis vector for the passed distance in the given space.\r\n * space (default LOCAL) can be either Space.LOCAL, either Space.WORLD.\r\n * @param axis the axis to translate in\r\n * @param distance the distance to translate\r\n * @param space Space to rotate in (Default: local)\r\n * @returns the TransformNode.\r\n */\r\n public translate(axis: Vector3, distance: number, space?: Space): TransformNode {\r\n const displacementVector = axis.scale(distance);\r\n if (!space || (space as any) === Space.LOCAL) {\r\n const tempV3 = this.getPositionExpressedInLocalSpace().add(displacementVector);\r\n this.setPositionWithLocalVector(tempV3);\r\n } else {\r\n this.setAbsolutePosition(this.getAbsolutePosition().add(displacementVector));\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a rotation step to the mesh current rotation.\r\n * x, y, z are Euler angles expressed in radians.\r\n * This methods updates the current mesh rotation, either mesh.rotation, either mesh.rotationQuaternion if it's set.\r\n * This means this rotation is made in the mesh local space only.\r\n * It's useful to set a custom rotation order different from the BJS standard one YXZ.\r\n * Example : this rotates the mesh first around its local X axis, then around its local Z axis, finally around its local Y axis.\r\n * ```javascript\r\n * mesh.addRotation(x1, 0, 0).addRotation(0, 0, z2).addRotation(0, 0, y3);\r\n * ```\r\n * Note that `addRotation()` accumulates the passed rotation values to the current ones and computes the .rotation or .rotationQuaternion updated values.\r\n * Under the hood, only quaternions are used. So it's a little faster is you use .rotationQuaternion because it doesn't need to translate them back to Euler angles.\r\n * @param x Rotation to add\r\n * @param y Rotation to add\r\n * @param z Rotation to add\r\n * @returns the TransformNode.\r\n */\r\n public addRotation(x: number, y: number, z: number): TransformNode {\r\n let rotationQuaternion;\r\n if (this.rotationQuaternion) {\r\n rotationQuaternion = this.rotationQuaternion;\r\n } else {\r\n rotationQuaternion = TmpVectors.Quaternion[1];\r\n Quaternion.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, rotationQuaternion);\r\n }\r\n const accumulation = TmpVectors.Quaternion[0];\r\n Quaternion.RotationYawPitchRollToRef(y, x, z, accumulation);\r\n rotationQuaternion.multiplyInPlace(accumulation);\r\n if (!this.rotationQuaternion) {\r\n rotationQuaternion.toEulerAnglesToRef(this.rotation);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _getEffectiveParent(): Nullable {\r\n return this.parent;\r\n }\r\n\r\n /**\r\n * Returns whether the transform node world matrix computation needs the camera information to be computed.\r\n * This is the case when the node is a billboard or has an infinite distance for instance.\r\n * @returns true if the world matrix computation needs the camera information to be computed\r\n */\r\n public isWorldMatrixCameraDependent(): boolean {\r\n return (this._infiniteDistance && !this.parent) || (this._billboardMode !== TransformNode.BILLBOARDMODE_NONE && !this.preserveParentRotationForBillboard);\r\n }\r\n\r\n /**\r\n * Computes the world matrix of the node\r\n * @param force defines if the cache version should be invalidated forcing the world matrix to be created from scratch\r\n * @param camera defines the camera used if different from the scene active camera (This is used with modes like Billboard or infinite distance)\r\n * @returns the world matrix\r\n */\r\n public computeWorldMatrix(force: boolean = false, camera: Nullable = null): Matrix {\r\n if (this._isWorldMatrixFrozen && !this._isDirty) {\r\n return this._worldMatrix;\r\n }\r\n\r\n const currentRenderId = this.getScene().getRenderId();\r\n if (!this._isDirty && !force && (this._currentRenderId === currentRenderId || this.isSynchronized())) {\r\n this._currentRenderId = currentRenderId;\r\n return this._worldMatrix;\r\n }\r\n\r\n camera = camera || this.getScene().activeCamera;\r\n\r\n this._updateCache();\r\n const cache = this._cache;\r\n cache.pivotMatrixUpdated = false;\r\n cache.billboardMode = this.billboardMode;\r\n cache.infiniteDistance = this.infiniteDistance;\r\n cache.parent = this._parentNode;\r\n\r\n this._currentRenderId = currentRenderId;\r\n this._childUpdateId += 1;\r\n this._isDirty = false;\r\n this._position._isDirty = false;\r\n this._rotation._isDirty = false;\r\n this._scaling._isDirty = false;\r\n const parent = this._getEffectiveParent();\r\n\r\n // Scaling\r\n const scaling: Vector3 = TransformNode._TmpScaling;\r\n let translation: Vector3 = this._position;\r\n\r\n // Translation\r\n if (this._infiniteDistance) {\r\n if (!this.parent && camera) {\r\n const cameraWorldMatrix = camera.getWorldMatrix();\r\n const cameraGlobalPosition = new Vector3(cameraWorldMatrix.m[12], cameraWorldMatrix.m[13], cameraWorldMatrix.m[14]);\r\n\r\n translation = TransformNode._TmpTranslation;\r\n translation.copyFromFloats(this._position.x + cameraGlobalPosition.x, this._position.y + cameraGlobalPosition.y, this._position.z + cameraGlobalPosition.z);\r\n }\r\n }\r\n\r\n // Scaling\r\n scaling.copyFromFloats(this._scaling.x * this.scalingDeterminant, this._scaling.y * this.scalingDeterminant, this._scaling.z * this.scalingDeterminant);\r\n\r\n // Rotation\r\n let rotation: Quaternion;\r\n if (this._rotationQuaternion) {\r\n this._rotationQuaternion._isDirty = false;\r\n rotation = this._rotationQuaternion;\r\n if (this.reIntegrateRotationIntoRotationQuaternion) {\r\n const len = this.rotation.lengthSquared();\r\n if (len) {\r\n this._rotationQuaternion.multiplyInPlace(Quaternion.RotationYawPitchRoll(this._rotation.y, this._rotation.x, this._rotation.z));\r\n this._rotation.copyFromFloats(0, 0, 0);\r\n }\r\n }\r\n } else {\r\n rotation = TransformNode._TmpRotation;\r\n Quaternion.RotationYawPitchRollToRef(this._rotation.y, this._rotation.x, this._rotation.z, rotation);\r\n }\r\n\r\n // Compose\r\n if (this._usePivotMatrix) {\r\n const scaleMatrix = TmpVectors.Matrix[1];\r\n Matrix.ScalingToRef(scaling.x, scaling.y, scaling.z, scaleMatrix);\r\n\r\n // Rotation\r\n const rotationMatrix = TmpVectors.Matrix[0];\r\n rotation.toRotationMatrix(rotationMatrix);\r\n\r\n // Composing transformations\r\n this._pivotMatrix.multiplyToRef(scaleMatrix, TmpVectors.Matrix[4]);\r\n TmpVectors.Matrix[4].multiplyToRef(rotationMatrix, this._localMatrix);\r\n\r\n // Post multiply inverse of pivotMatrix\r\n if (this._postMultiplyPivotMatrix) {\r\n this._localMatrix.multiplyToRef(this._pivotMatrixInverse, this._localMatrix);\r\n }\r\n\r\n this._localMatrix.addTranslationFromFloats(translation.x, translation.y, translation.z);\r\n } else {\r\n Matrix.ComposeToRef(scaling, rotation, translation, this._localMatrix);\r\n }\r\n\r\n // Parent\r\n if (parent && parent.getWorldMatrix) {\r\n if (force) {\r\n parent.computeWorldMatrix(force);\r\n }\r\n if (cache.useBillboardPath) {\r\n if (this._transformToBoneReferal) {\r\n const bone = this.parent as Bone;\r\n bone.getSkeleton().prepare();\r\n bone.getFinalMatrix().multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), TmpVectors.Matrix[7]);\r\n } else {\r\n TmpVectors.Matrix[7].copyFrom(parent.getWorldMatrix());\r\n }\r\n\r\n // Extract scaling and translation from parent\r\n const translation = TmpVectors.Vector3[5];\r\n const scale = TmpVectors.Vector3[6];\r\n const orientation = TmpVectors.Quaternion[0];\r\n TmpVectors.Matrix[7].decompose(scale, orientation, translation);\r\n Matrix.ScalingToRef(scale.x, scale.y, scale.z, TmpVectors.Matrix[7]);\r\n TmpVectors.Matrix[7].setTranslation(translation);\r\n\r\n if (TransformNode.BillboardUseParentOrientation) {\r\n // set localMatrix translation to be transformed against parent's orientation.\r\n this._position.applyRotationQuaternionToRef(orientation, translation);\r\n this._localMatrix.setTranslation(translation);\r\n }\r\n\r\n this._localMatrix.multiplyToRef(TmpVectors.Matrix[7], this._worldMatrix);\r\n } else {\r\n if (this._transformToBoneReferal) {\r\n const bone = this.parent as Bone;\r\n bone.getSkeleton().prepare();\r\n this._localMatrix.multiplyToRef(bone.getFinalMatrix(), TmpVectors.Matrix[6]);\r\n TmpVectors.Matrix[6].multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), this._worldMatrix);\r\n } else {\r\n this._localMatrix.multiplyToRef(parent.getWorldMatrix(), this._worldMatrix);\r\n }\r\n }\r\n this._markSyncedWithParent();\r\n } else {\r\n this._worldMatrix.copyFrom(this._localMatrix);\r\n }\r\n\r\n // Billboarding based on camera orientation (testing PG:http://www.babylonjs-playground.com/#UJEIL#13)\r\n if (cache.useBillboardPath && camera && this.billboardMode && !cache.useBillboardPosition) {\r\n const storedTranslation = TmpVectors.Vector3[0];\r\n this._worldMatrix.getTranslationToRef(storedTranslation); // Save translation\r\n\r\n // Cancel camera rotation\r\n TmpVectors.Matrix[1].copyFrom(camera.getViewMatrix());\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n TmpVectors.Matrix[1].multiplyToRef(convertRHSToLHS, TmpVectors.Matrix[1]);\r\n }\r\n\r\n TmpVectors.Matrix[1].setTranslationFromFloats(0, 0, 0);\r\n TmpVectors.Matrix[1].invertToRef(TmpVectors.Matrix[0]);\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_ALL) !== TransformNode.BILLBOARDMODE_ALL) {\r\n TmpVectors.Matrix[0].decompose(undefined, TmpVectors.Quaternion[0], undefined);\r\n const eulerAngles = TmpVectors.Vector3[1];\r\n TmpVectors.Quaternion[0].toEulerAnglesToRef(eulerAngles);\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_X) !== TransformNode.BILLBOARDMODE_X) {\r\n eulerAngles.x = 0;\r\n }\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_Y) !== TransformNode.BILLBOARDMODE_Y) {\r\n eulerAngles.y = 0;\r\n }\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_Z) !== TransformNode.BILLBOARDMODE_Z) {\r\n eulerAngles.z = 0;\r\n }\r\n\r\n Matrix.RotationYawPitchRollToRef(eulerAngles.y, eulerAngles.x, eulerAngles.z, TmpVectors.Matrix[0]);\r\n }\r\n this._worldMatrix.setTranslationFromFloats(0, 0, 0);\r\n this._worldMatrix.multiplyToRef(TmpVectors.Matrix[0], this._worldMatrix);\r\n\r\n // Restore translation\r\n this._worldMatrix.setTranslation(TmpVectors.Vector3[0]);\r\n }\r\n // Billboarding based on camera position\r\n else if (cache.useBillboardPath && camera && cache.useBillboardPosition) {\r\n const storedTranslation = TmpVectors.Vector3[0];\r\n // Save translation\r\n this._worldMatrix.getTranslationToRef(storedTranslation);\r\n\r\n // Compute camera position in local space\r\n const cameraPosition = camera.globalPosition;\r\n this._worldMatrix.invertToRef(TmpVectors.Matrix[1]);\r\n const camInObjSpace = TmpVectors.Vector3[1];\r\n Vector3.TransformCoordinatesToRef(cameraPosition, TmpVectors.Matrix[1], camInObjSpace);\r\n camInObjSpace.normalize();\r\n\r\n // Find the lookAt info in local space\r\n const yaw = -Math.atan2(camInObjSpace.z, camInObjSpace.x) + Math.PI / 2;\r\n const len = Math.sqrt(camInObjSpace.x * camInObjSpace.x + camInObjSpace.z * camInObjSpace.z);\r\n const pitch = -Math.atan2(camInObjSpace.y, len);\r\n Quaternion.RotationYawPitchRollToRef(yaw, pitch, 0, TmpVectors.Quaternion[0]);\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_ALL) !== TransformNode.BILLBOARDMODE_ALL) {\r\n const eulerAngles = TmpVectors.Vector3[1];\r\n TmpVectors.Quaternion[0].toEulerAnglesToRef(eulerAngles);\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_X) !== TransformNode.BILLBOARDMODE_X) {\r\n eulerAngles.x = 0;\r\n }\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_Y) !== TransformNode.BILLBOARDMODE_Y) {\r\n eulerAngles.y = 0;\r\n }\r\n\r\n if ((this.billboardMode & TransformNode.BILLBOARDMODE_Z) !== TransformNode.BILLBOARDMODE_Z) {\r\n eulerAngles.z = 0;\r\n }\r\n\r\n Matrix.RotationYawPitchRollToRef(eulerAngles.y, eulerAngles.x, eulerAngles.z, TmpVectors.Matrix[0]);\r\n } else {\r\n Matrix.FromQuaternionToRef(TmpVectors.Quaternion[0], TmpVectors.Matrix[0]);\r\n }\r\n\r\n // Cancel translation\r\n this._worldMatrix.setTranslationFromFloats(0, 0, 0);\r\n\r\n // Rotate according to lookat (diff from local to lookat)\r\n this._worldMatrix.multiplyToRef(TmpVectors.Matrix[0], this._worldMatrix);\r\n\r\n // Restore translation\r\n this._worldMatrix.setTranslation(TmpVectors.Vector3[0]);\r\n }\r\n\r\n // Normal matrix\r\n if (!this.ignoreNonUniformScaling) {\r\n if (this._scaling.isNonUniformWithinEpsilon(0.000001)) {\r\n this._updateNonUniformScalingState(true);\r\n } else if (parent && (parent)._nonUniformScaling) {\r\n this._updateNonUniformScalingState((parent)._nonUniformScaling);\r\n } else {\r\n this._updateNonUniformScalingState(false);\r\n }\r\n } else {\r\n this._updateNonUniformScalingState(false);\r\n }\r\n\r\n this._afterComputeWorldMatrix();\r\n\r\n // Absolute position\r\n this._absolutePosition.copyFromFloats(this._worldMatrix.m[12], this._worldMatrix.m[13], this._worldMatrix.m[14]);\r\n this._isAbsoluteSynced = false;\r\n\r\n // Callbacks\r\n this.onAfterWorldMatrixUpdateObservable.notifyObservers(this);\r\n\r\n if (!this._poseMatrix) {\r\n this._poseMatrix = Matrix.Invert(this._worldMatrix);\r\n }\r\n\r\n // Cache the determinant\r\n this._worldMatrixDeterminantIsDirty = true;\r\n\r\n return this._worldMatrix;\r\n }\r\n\r\n /**\r\n * Resets this nodeTransform's local matrix to Matrix.Identity().\r\n * @param independentOfChildren indicates if all child nodeTransform's world-space transform should be preserved.\r\n */\r\n public resetLocalMatrix(independentOfChildren: boolean = true): void {\r\n this.computeWorldMatrix();\r\n if (independentOfChildren) {\r\n const children = this.getChildren();\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i] as TransformNode;\r\n if (child) {\r\n child.computeWorldMatrix();\r\n const bakedMatrix = TmpVectors.Matrix[0];\r\n child._localMatrix.multiplyToRef(this._localMatrix, bakedMatrix);\r\n const tmpRotationQuaternion = TmpVectors.Quaternion[0];\r\n bakedMatrix.decompose(child.scaling, tmpRotationQuaternion, child.position);\r\n if (child.rotationQuaternion) {\r\n child.rotationQuaternion.copyFrom(tmpRotationQuaternion);\r\n } else {\r\n tmpRotationQuaternion.toEulerAnglesToRef(child.rotation);\r\n }\r\n }\r\n }\r\n }\r\n this.scaling.copyFromFloats(1, 1, 1);\r\n this.position.copyFromFloats(0, 0, 0);\r\n this.rotation.copyFromFloats(0, 0, 0);\r\n\r\n //only if quaternion is already set\r\n if (this.rotationQuaternion) {\r\n this.rotationQuaternion = Quaternion.Identity();\r\n }\r\n this._worldMatrix = Matrix.Identity();\r\n }\r\n\r\n protected _afterComputeWorldMatrix(): void {}\r\n\r\n /**\r\n * If you'd like to be called back after the mesh position, rotation or scaling has been updated.\r\n * @param func callback function to add\r\n *\r\n * @returns the TransformNode.\r\n */\r\n public registerAfterWorldMatrixUpdate(func: (mesh: TransformNode) => void): TransformNode {\r\n this.onAfterWorldMatrixUpdateObservable.add(func);\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a registered callback function.\r\n * @param func callback function to remove\r\n * @returns the TransformNode.\r\n */\r\n public unregisterAfterWorldMatrixUpdate(func: (mesh: TransformNode) => void): TransformNode {\r\n this.onAfterWorldMatrixUpdateObservable.removeCallback(func);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the position of the current mesh in camera space\r\n * @param camera defines the camera to use\r\n * @returns a position\r\n */\r\n public getPositionInCameraSpace(camera: Nullable = null): Vector3 {\r\n if (!camera) {\r\n camera = this.getScene().activeCamera;\r\n }\r\n\r\n return Vector3.TransformCoordinates(this.getAbsolutePosition(), camera.getViewMatrix());\r\n }\r\n\r\n /**\r\n * Returns the distance from the mesh to the active camera\r\n * @param camera defines the camera to use\r\n * @returns the distance\r\n */\r\n public getDistanceToCamera(camera: Nullable = null): number {\r\n if (!camera) {\r\n camera = this.getScene().activeCamera;\r\n }\r\n return this.getAbsolutePosition().subtract(camera.globalPosition).length();\r\n }\r\n\r\n /**\r\n * Clone the current transform node\r\n * @param name Name of the new clone\r\n * @param newParent New parent for the clone\r\n * @param doNotCloneChildren Do not clone children hierarchy\r\n * @returns the new transform node\r\n */\r\n public clone(name: string, newParent: Nullable, doNotCloneChildren?: boolean): Nullable {\r\n const result = SerializationHelper.Clone(() => new TransformNode(name, this.getScene()), this);\r\n\r\n result.name = name;\r\n result.id = name;\r\n\r\n if (newParent) {\r\n result.parent = newParent;\r\n }\r\n\r\n if (!doNotCloneChildren) {\r\n // Children\r\n const directDescendants = this.getDescendants(true);\r\n for (let index = 0; index < directDescendants.length; index++) {\r\n const child = directDescendants[index];\r\n\r\n if ((child).clone) {\r\n (child).clone(name + \".\" + child.name, result);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Serializes the objects information.\r\n * @param currentSerializationObject defines the object to serialize in\r\n * @returns the serialized object\r\n */\r\n public serialize(currentSerializationObject?: any): any {\r\n const serializationObject = SerializationHelper.Serialize(this, currentSerializationObject);\r\n serializationObject.type = this.getClassName();\r\n serializationObject.uniqueId = this.uniqueId;\r\n\r\n // Parent\r\n if (this.parent) {\r\n this.parent._serializeAsParent(serializationObject);\r\n }\r\n\r\n serializationObject.localMatrix = this.getPivotMatrix().asArray();\r\n\r\n serializationObject.isEnabled = this.isEnabled();\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n serializationObject.ranges = this.serializeAnimationRanges();\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Returns a new TransformNode object parsed from the source provided.\r\n * @param parsedTransformNode is the source.\r\n * @param scene the scene the object belongs to\r\n * @param rootUrl is a string, it's the root URL to prefix the `delayLoadingFile` property with\r\n * @returns a new TransformNode object parsed from the source provided.\r\n */\r\n public static Parse(parsedTransformNode: any, scene: Scene, rootUrl: string): TransformNode {\r\n const transformNode = SerializationHelper.Parse(() => new TransformNode(parsedTransformNode.name, scene), parsedTransformNode, scene, rootUrl);\r\n\r\n if (parsedTransformNode.localMatrix) {\r\n transformNode.setPreTransformMatrix(Matrix.FromArray(parsedTransformNode.localMatrix));\r\n } else if (parsedTransformNode.pivotMatrix) {\r\n transformNode.setPivotMatrix(Matrix.FromArray(parsedTransformNode.pivotMatrix));\r\n }\r\n\r\n transformNode.setEnabled(parsedTransformNode.isEnabled);\r\n\r\n transformNode._waitingParsedUniqueId = parsedTransformNode.uniqueId;\r\n\r\n // Parent\r\n if (parsedTransformNode.parentId !== undefined) {\r\n transformNode._waitingParentId = parsedTransformNode.parentId;\r\n }\r\n\r\n if (parsedTransformNode.parentInstanceIndex !== undefined) {\r\n transformNode._waitingParentInstanceIndex = parsedTransformNode.parentInstanceIndex;\r\n }\r\n\r\n // Animations\r\n if (parsedTransformNode.animations) {\r\n for (let animationIndex = 0; animationIndex < parsedTransformNode.animations.length; animationIndex++) {\r\n const parsedAnimation = parsedTransformNode.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n transformNode.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n Node.ParseAnimationRanges(transformNode, parsedTransformNode, scene);\r\n }\r\n\r\n if (parsedTransformNode.autoAnimate) {\r\n scene.beginAnimation(\r\n transformNode,\r\n parsedTransformNode.autoAnimateFrom,\r\n parsedTransformNode.autoAnimateTo,\r\n parsedTransformNode.autoAnimateLoop,\r\n parsedTransformNode.autoAnimateSpeed || 1.0\r\n );\r\n }\r\n\r\n return transformNode;\r\n }\r\n\r\n /**\r\n * Get all child-transformNodes of this node\r\n * @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\r\n * @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\r\n * @returns an array of TransformNode\r\n */\r\n public getChildTransformNodes(directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): TransformNode[] {\r\n const results: Array = [];\r\n this._getDescendants(results, directDescendantsOnly, (node: Node) => {\r\n return (!predicate || predicate(node)) && node instanceof TransformNode;\r\n });\r\n return results;\r\n }\r\n\r\n /**\r\n * Releases resources associated with this transform node.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n // Animations\r\n this.getScene().stopAnimation(this);\r\n\r\n // Remove from scene\r\n this.getScene().removeTransformNode(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.transformNodes.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.transformNodes.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n this.onAfterWorldMatrixUpdateObservable.clear();\r\n\r\n if (doNotRecurse) {\r\n const transformNodes = this.getChildTransformNodes(true);\r\n for (const transformNode of transformNodes) {\r\n transformNode.parent = null;\r\n transformNode.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n /**\r\n * Uniformly scales the mesh to fit inside of a unit cube (1 X 1 X 1 units)\r\n * @param includeDescendants Use the hierarchy's bounding box instead of the mesh's bounding box. Default is false\r\n * @param ignoreRotation ignore rotation when computing the scale (ie. object will be axis aligned). Default is false\r\n * @param predicate predicate that is passed in to getHierarchyBoundingVectors when selecting which object should be included when scaling\r\n * @returns the current mesh\r\n */\r\n public normalizeToUnitCube(includeDescendants = true, ignoreRotation = false, predicate?: Nullable<(node: AbstractMesh) => boolean>): TransformNode {\r\n let storedRotation: Nullable = null;\r\n let storedRotationQuaternion: Nullable = null;\r\n\r\n if (ignoreRotation) {\r\n if (this.rotationQuaternion) {\r\n storedRotationQuaternion = this.rotationQuaternion.clone();\r\n this.rotationQuaternion.copyFromFloats(0, 0, 0, 1);\r\n } else if (this.rotation) {\r\n storedRotation = this.rotation.clone();\r\n this.rotation.copyFromFloats(0, 0, 0);\r\n }\r\n }\r\n\r\n const boundingVectors = this.getHierarchyBoundingVectors(includeDescendants, predicate);\r\n const sizeVec = boundingVectors.max.subtract(boundingVectors.min);\r\n const maxDimension = Math.max(sizeVec.x, sizeVec.y, sizeVec.z);\r\n\r\n if (maxDimension === 0) {\r\n return this;\r\n }\r\n\r\n const scale = 1 / maxDimension;\r\n\r\n this.scaling.scaleInPlace(scale);\r\n\r\n if (ignoreRotation) {\r\n if (this.rotationQuaternion && storedRotationQuaternion) {\r\n this.rotationQuaternion.copyFrom(storedRotationQuaternion);\r\n } else if (this.rotation && storedRotation) {\r\n this.rotation.copyFrom(storedRotation);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private _syncAbsoluteScalingAndRotation(): void {\r\n if (!this._isAbsoluteSynced) {\r\n this._worldMatrix.decompose(this._absoluteScaling, this._absoluteRotationQuaternion);\r\n this._isAbsoluteSynced = true;\r\n }\r\n }\r\n}\r\n", "import type { Collider } from \"./collider\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\n\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class _MeshCollisionData {\r\n public _checkCollisions = false;\r\n public _collisionMask = -1;\r\n public _collisionGroup = -1;\r\n public _surroundingMeshes: Nullable = null;\r\n public _collider: Nullable = null;\r\n public _oldPositionForCollisions = new Vector3(0, 0, 0);\r\n public _diffPositionForCollisions = new Vector3(0, 0, 0);\r\n public _onCollideObserver: Nullable>;\r\n public _onCollisionPositionChangeObserver: Nullable>;\r\n public _collisionResponse = true;\r\n}\r\n", "import { Observable } from \"../Misc/observable\";\r\nimport type { Nullable, FloatArray, IndicesArray, DeepImmutable } from \"../types\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { ScenePerformancePriority } from \"../scene\";\r\nimport type { Vector2 } from \"../Maths/math.vector\";\r\nimport { Quaternion, Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport type { Node } from \"../node\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { IGetSetVerticesData } from \"../Meshes/mesh.vertexData\";\r\nimport { VertexData } from \"../Meshes/mesh.vertexData\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport type { ICullable } from \"../Culling/boundingInfo\";\r\nimport { BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport type { Material } from \"../Materials/material\";\r\nimport type { MaterialDefines } from \"../Materials/materialDefines\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport type { Skeleton } from \"../Bones/skeleton\";\r\nimport type { MorphTargetManager } from \"../Morph/morphTargetManager\";\r\nimport type { IBakedVertexAnimationManager } from \"../BakedVertexAnimation/bakedVertexAnimationManager\";\r\nimport type { IEdgesRenderer } from \"../Rendering/edgesRenderer\";\r\nimport type { SolidParticle } from \"../Particles/solidParticle\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { AbstractActionManager } from \"../Actions/abstractActionManager\";\r\nimport { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport { _MeshCollisionData } from \"../Collisions/meshCollisionData\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport type { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { extractMinAndMax } from \"../Maths/math.functions\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { Axis } from \"../Maths/math.axis\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\nimport type { Ray } from \"../Culling/ray\";\r\nimport type { Collider } from \"../Collisions/collider\";\r\nimport type { TrianglePickingPredicate } from \"../Culling/ray\";\r\nimport type { RenderingGroup } from \"../Rendering/renderingGroup\";\r\nimport type { IEdgesRendererOptions } from \"../Rendering/edgesRenderer\";\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nclass _FacetDataStorage {\r\n // facetData private properties\r\n public facetPositions: Vector3[]; // facet local positions\r\n public facetNormals: Vector3[]; // facet local normals\r\n public facetPartitioning: number[][]; // partitioning array of facet index arrays\r\n public facetNb: number = 0; // facet number\r\n public partitioningSubdivisions: number = 10; // number of subdivisions per axis in the partitioning space\r\n public partitioningBBoxRatio: number = 1.01; // the partitioning array space is by default 1% bigger than the bounding box\r\n public facetDataEnabled: boolean = false; // is the facet data feature enabled on this mesh ?\r\n public facetParameters: any = {}; // keep a reference to the object parameters to avoid memory re-allocation\r\n public bbSize: Vector3 = Vector3.Zero(); // bbox size approximated for facet data\r\n public subDiv = {\r\n // actual number of subdivisions per axis for ComputeNormals()\r\n max: 1,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n X: 1,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n Y: 1,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n Z: 1,\r\n };\r\n\r\n public facetDepthSort: boolean = false; // is the facet depth sort to be computed\r\n public facetDepthSortEnabled: boolean = false; // is the facet depth sort initialized\r\n public depthSortedIndices: IndicesArray; // copy of the indices array to store them once sorted\r\n public depthSortedFacets: { ind: number; sqDistance: number }[]; // array of depth sorted facets\r\n public facetDepthSortFunction: (f1: { ind: number; sqDistance: number }, f2: { ind: number; sqDistance: number }) => number; // facet depth sort function\r\n public facetDepthSortFrom: Vector3; // location where to depth sort from\r\n public facetDepthSortOrigin: Vector3; // same as facetDepthSortFrom but expressed in the mesh local space\r\n\r\n public invertedMatrix: Matrix; // Inverted world matrix.\r\n}\r\n\r\n/**\r\n * @internal\r\n **/\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nclass _InternalAbstractMeshDataInfo {\r\n public _hasVertexAlpha = false;\r\n public _useVertexColors = true;\r\n public _numBoneInfluencers = 4;\r\n public _applyFog = true;\r\n public _receiveShadows = false;\r\n public _facetData = new _FacetDataStorage();\r\n public _visibility = 1.0;\r\n public _skeleton: Nullable = null;\r\n public _layerMask: number = 0x0fffffff;\r\n public _computeBonesUsingShaders = true;\r\n public _isActive = false;\r\n public _onlyForInstances = false;\r\n public _isActiveIntermediate = false;\r\n public _onlyForInstancesIntermediate = false;\r\n public _actAsRegularMesh = false;\r\n public _currentLOD: Nullable = null;\r\n public _currentLODIsUpToDate: boolean = false;\r\n public _collisionRetryCount: number = 3;\r\n public _morphTargetManager: Nullable = null;\r\n public _renderingGroupId = 0;\r\n public _bakedVertexAnimationManager: Nullable = null;\r\n public _material: Nullable = null;\r\n public _materialForRenderPass: Array; // map a render pass id (index in the array) to a Material\r\n public _positions: Nullable = null;\r\n public _pointerOverDisableMeshTesting: boolean = false;\r\n // Collisions\r\n public _meshCollisionData = new _MeshCollisionData();\r\n public _enableDistantPicking = false;\r\n /** @internal\r\n * Bounding info that is unnafected by the addition of thin instances\r\n */\r\n public _rawBoundingInfo: Nullable = null;\r\n}\r\n\r\n/**\r\n * Class used to store all common mesh properties\r\n */\r\nexport class AbstractMesh extends TransformNode implements IDisposable, ICullable, IGetSetVerticesData {\r\n /** No occlusion */\r\n public static OCCLUSION_TYPE_NONE = 0;\r\n /** Occlusion set to optimistic */\r\n public static OCCLUSION_TYPE_OPTIMISTIC = 1;\r\n /** Occlusion set to strict */\r\n public static OCCLUSION_TYPE_STRICT = 2;\r\n /** Use an accurate occlusion algorithm */\r\n public static OCCLUSION_ALGORITHM_TYPE_ACCURATE = 0;\r\n /** Use a conservative occlusion algorithm */\r\n public static OCCLUSION_ALGORITHM_TYPE_CONSERVATIVE = 1;\r\n\r\n /** Default culling strategy : this is an exclusion test and it's the more accurate.\r\n * Test order :\r\n * Is the bounding sphere outside the frustum ?\r\n * If not, are the bounding box vertices outside the frustum ?\r\n * It not, then the cullable object is in the frustum.\r\n */\r\n public static readonly CULLINGSTRATEGY_STANDARD = Constants.MESHES_CULLINGSTRATEGY_STANDARD;\r\n /** Culling strategy : Bounding Sphere Only.\r\n * This is an exclusion test. It's faster than the standard strategy because the bounding box is not tested.\r\n * It's also less accurate than the standard because some not visible objects can still be selected.\r\n * Test : is the bounding sphere outside the frustum ?\r\n * If not, then the cullable object is in the frustum.\r\n */\r\n public static readonly CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY = Constants.MESHES_CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY;\r\n /** Culling strategy : Optimistic Inclusion.\r\n * This in an inclusion test first, then the standard exclusion test.\r\n * This can be faster when a cullable object is expected to be almost always in the camera frustum.\r\n * This could also be a little slower than the standard test when the tested object center is not the frustum but one of its bounding box vertex is still inside.\r\n * Anyway, it's as accurate as the standard strategy.\r\n * Test :\r\n * Is the cullable object bounding sphere center in the frustum ?\r\n * If not, apply the default culling strategy.\r\n */\r\n public static readonly CULLINGSTRATEGY_OPTIMISTIC_INCLUSION = Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION;\r\n /** Culling strategy : Optimistic Inclusion then Bounding Sphere Only.\r\n * This in an inclusion test first, then the bounding sphere only exclusion test.\r\n * This can be the fastest test when a cullable object is expected to be almost always in the camera frustum.\r\n * This could also be a little slower than the BoundingSphereOnly strategy when the tested object center is not in the frustum but its bounding sphere still intersects it.\r\n * It's less accurate than the standard strategy and as accurate as the BoundingSphereOnly strategy.\r\n * Test :\r\n * Is the cullable object bounding sphere center in the frustum ?\r\n * If not, apply the Bounding Sphere Only strategy. No Bounding Box is tested here.\r\n */\r\n public static readonly CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY = Constants.MESHES_CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY;\r\n\r\n /**\r\n * No billboard\r\n */\r\n public static get BILLBOARDMODE_NONE(): number {\r\n return TransformNode.BILLBOARDMODE_NONE;\r\n }\r\n\r\n /** Billboard on X axis */\r\n public static get BILLBOARDMODE_X(): number {\r\n return TransformNode.BILLBOARDMODE_X;\r\n }\r\n\r\n /** Billboard on Y axis */\r\n public static get BILLBOARDMODE_Y(): number {\r\n return TransformNode.BILLBOARDMODE_Y;\r\n }\r\n\r\n /** Billboard on Z axis */\r\n public static get BILLBOARDMODE_Z(): number {\r\n return TransformNode.BILLBOARDMODE_Z;\r\n }\r\n\r\n /** Billboard on all axes */\r\n public static get BILLBOARDMODE_ALL(): number {\r\n return TransformNode.BILLBOARDMODE_ALL;\r\n }\r\n\r\n /** Billboard on using position instead of orientation */\r\n public static get BILLBOARDMODE_USE_POSITION(): number {\r\n return TransformNode.BILLBOARDMODE_USE_POSITION;\r\n }\r\n\r\n // Internal data\r\n /** @internal */\r\n public _internalAbstractMeshDataInfo = new _InternalAbstractMeshDataInfo();\r\n\r\n /** @internal */\r\n public _waitingMaterialId: Nullable = null;\r\n\r\n /**\r\n * The culling strategy to use to check whether the mesh must be rendered or not.\r\n * This value can be changed at any time and will be used on the next render mesh selection.\r\n * The possible values are :\r\n * - AbstractMesh.CULLINGSTRATEGY_STANDARD\r\n * - AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY\r\n * - AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION\r\n * - AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY\r\n * Please read each static variable documentation to get details about the culling process.\r\n * */\r\n public cullingStrategy = AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY;\r\n\r\n /**\r\n * Gets the number of facets in the mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet\r\n */\r\n public get facetNb(): number {\r\n return this._internalAbstractMeshDataInfo._facetData.facetNb;\r\n }\r\n /**\r\n * Gets or set the number (integer) of subdivisions per axis in the partitioning space\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning\r\n */\r\n public get partitioningSubdivisions(): number {\r\n return this._internalAbstractMeshDataInfo._facetData.partitioningSubdivisions;\r\n }\r\n public set partitioningSubdivisions(nb: number) {\r\n this._internalAbstractMeshDataInfo._facetData.partitioningSubdivisions = nb;\r\n }\r\n /**\r\n * The ratio (float) to apply to the bounding box size to set to the partitioning space.\r\n * Ex : 1.01 (default) the partitioning space is 1% bigger than the bounding box\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning\r\n */\r\n public get partitioningBBoxRatio(): number {\r\n return this._internalAbstractMeshDataInfo._facetData.partitioningBBoxRatio;\r\n }\r\n public set partitioningBBoxRatio(ratio: number) {\r\n this._internalAbstractMeshDataInfo._facetData.partitioningBBoxRatio = ratio;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the facets must be depth sorted on next call to `updateFacetData()`.\r\n * Works only for updatable meshes.\r\n * Doesn't work with multi-materials\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort\r\n */\r\n public get mustDepthSortFacets(): boolean {\r\n return this._internalAbstractMeshDataInfo._facetData.facetDepthSort;\r\n }\r\n public set mustDepthSortFacets(sort: boolean) {\r\n this._internalAbstractMeshDataInfo._facetData.facetDepthSort = sort;\r\n }\r\n\r\n /**\r\n * The location (Vector3) where the facet depth sort must be computed from.\r\n * By default, the active camera position.\r\n * Used only when facet depth sort is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort\r\n */\r\n public get facetDepthSortFrom(): Vector3 {\r\n return this._internalAbstractMeshDataInfo._facetData.facetDepthSortFrom;\r\n }\r\n public set facetDepthSortFrom(location: Vector3) {\r\n this._internalAbstractMeshDataInfo._facetData.facetDepthSortFrom = location;\r\n }\r\n\r\n /** number of collision detection tries. Change this value if not all collisions are detected and handled properly */\r\n public get collisionRetryCount(): number {\r\n return this._internalAbstractMeshDataInfo._collisionRetryCount;\r\n }\r\n public set collisionRetryCount(retryCount: number) {\r\n this._internalAbstractMeshDataInfo._collisionRetryCount = retryCount;\r\n }\r\n /**\r\n * gets a boolean indicating if facetData is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet\r\n */\r\n public get isFacetDataEnabled(): boolean {\r\n return this._internalAbstractMeshDataInfo._facetData.facetDataEnabled;\r\n }\r\n\r\n /**\r\n * Gets or sets the morph target manager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets\r\n */\r\n public get morphTargetManager(): Nullable {\r\n return this._internalAbstractMeshDataInfo._morphTargetManager;\r\n }\r\n\r\n public set morphTargetManager(value: Nullable) {\r\n if (this._internalAbstractMeshDataInfo._morphTargetManager === value) {\r\n return;\r\n }\r\n this._internalAbstractMeshDataInfo._morphTargetManager = value;\r\n this._syncGeometryWithMorphTargetManager();\r\n }\r\n\r\n /**\r\n * Gets or sets the baked vertex animation manager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/baked_texture_animations\r\n */\r\n public get bakedVertexAnimationManager(): Nullable {\r\n return this._internalAbstractMeshDataInfo._bakedVertexAnimationManager;\r\n }\r\n\r\n public set bakedVertexAnimationManager(value: Nullable) {\r\n if (this._internalAbstractMeshDataInfo._bakedVertexAnimationManager === value) {\r\n return;\r\n }\r\n this._internalAbstractMeshDataInfo._bakedVertexAnimationManager = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /** @internal */\r\n public _syncGeometryWithMorphTargetManager(): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateNonUniformScalingState(value: boolean): boolean {\r\n if (!super._updateNonUniformScalingState(value)) {\r\n return false;\r\n }\r\n this._markSubMeshesAsMiscDirty();\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public get rawBoundingInfo(): Nullable {\r\n return this._internalAbstractMeshDataInfo._rawBoundingInfo;\r\n }\r\n public set rawBoundingInfo(boundingInfo: Nullable) {\r\n this._internalAbstractMeshDataInfo._rawBoundingInfo = boundingInfo;\r\n }\r\n\r\n // Events\r\n\r\n /**\r\n * An event triggered when this mesh collides with another one\r\n */\r\n public onCollideObservable = new Observable();\r\n\r\n /** Set a function to call when this mesh collides with another one */\r\n public set onCollide(callback: (collidedMesh?: AbstractMesh) => void) {\r\n if (this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver) {\r\n this.onCollideObservable.remove(this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver);\r\n }\r\n this._internalAbstractMeshDataInfo._meshCollisionData._onCollideObserver = this.onCollideObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the collision's position changes\r\n */\r\n public onCollisionPositionChangeObservable = new Observable();\r\n\r\n /** Set a function to call when the collision's position changes */\r\n public set onCollisionPositionChange(callback: () => void) {\r\n if (this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver) {\r\n this.onCollisionPositionChangeObservable.remove(this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver);\r\n }\r\n this._internalAbstractMeshDataInfo._meshCollisionData._onCollisionPositionChangeObserver = this.onCollisionPositionChangeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when material is changed\r\n */\r\n public onMaterialChangedObservable = new Observable();\r\n\r\n // Properties\r\n\r\n /**\r\n * Gets or sets the orientation for POV movement & rotation\r\n */\r\n public definedFacingForward = true;\r\n\r\n /** @internal */\r\n public _occlusionQuery: Nullable = null;\r\n\r\n /** @internal */\r\n public _renderingGroup: Nullable = null;\r\n\r\n /**\r\n * Gets or sets mesh visibility between 0 and 1 (default is 1)\r\n */\r\n public get visibility(): number {\r\n return this._internalAbstractMeshDataInfo._visibility;\r\n }\r\n\r\n /**\r\n * Gets or sets mesh visibility between 0 and 1 (default is 1)\r\n */\r\n public set visibility(value: number) {\r\n if (this._internalAbstractMeshDataInfo._visibility === value) {\r\n return;\r\n }\r\n\r\n const oldValue = this._internalAbstractMeshDataInfo._visibility;\r\n\r\n this._internalAbstractMeshDataInfo._visibility = value;\r\n\r\n if ((oldValue === 1 && value !== 1) || (oldValue !== 1 && value === 1)) {\r\n this._markSubMeshesAsDirty((defines) => {\r\n defines.markAsMiscDirty();\r\n defines.markAsPrePassDirty();\r\n });\r\n }\r\n }\r\n\r\n /** Gets or sets the alpha index used to sort transparent meshes\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#alpha-index\r\n */\r\n public alphaIndex = Number.MAX_VALUE;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh is visible (renderable). Default is true\r\n */\r\n public isVisible = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be picked (by scene.pick for instance or through actions). Default is true\r\n */\r\n public isPickable = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be near picked (touched by the XR controller or hands). Default is false\r\n */\r\n public isNearPickable = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be grabbed. Default is false.\r\n * Setting this to true, while using the XR near interaction feature, will trigger a pointer event when the mesh is grabbed.\r\n * Grabbing means that the controller is using the squeeze or main trigger button to grab the mesh.\r\n * This is different from nearPickable which only triggers the event when the mesh is touched by the controller\r\n */\r\n public isNearGrabbable = false;\r\n\r\n /** Gets or sets a boolean indicating that bounding boxes of subMeshes must be rendered as well (false by default) */\r\n public showSubMeshesBoundingBox = false;\r\n\r\n /** Gets or sets a boolean indicating if the mesh must be considered as a ray blocker for lens flares (false by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/lenseFlare\r\n */\r\n public isBlocker = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that pointer move events must be supported on this mesh (false by default)\r\n */\r\n public enablePointerMoveEvents = false;\r\n\r\n /**\r\n * Gets or sets the property which disables the test that is checking that the mesh under the pointer is the same than the previous time we tested for it (default: false).\r\n * Set this property to true if you want thin instances picking to be reported accurately when moving over the mesh.\r\n * Note that setting this property to true will incur some performance penalties when dealing with pointer events for this mesh so use it sparingly.\r\n */\r\n public get pointerOverDisableMeshTesting() {\r\n return this._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting;\r\n }\r\n\r\n public set pointerOverDisableMeshTesting(disable: boolean) {\r\n this._internalAbstractMeshDataInfo._pointerOverDisableMeshTesting = disable;\r\n }\r\n\r\n /**\r\n * Specifies the rendering group id for this mesh (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#rendering-groups\r\n */\r\n public get renderingGroupId() {\r\n return this._internalAbstractMeshDataInfo._renderingGroupId;\r\n }\r\n\r\n public set renderingGroupId(value: number) {\r\n this._internalAbstractMeshDataInfo._renderingGroupId = value;\r\n }\r\n\r\n /** Gets or sets current material */\r\n public get material(): Nullable {\r\n return this._internalAbstractMeshDataInfo._material;\r\n }\r\n public set material(value: Nullable) {\r\n if (this._internalAbstractMeshDataInfo._material === value) {\r\n return;\r\n }\r\n\r\n // remove from material mesh map id needed\r\n if (this._internalAbstractMeshDataInfo._material && this._internalAbstractMeshDataInfo._material.meshMap) {\r\n this._internalAbstractMeshDataInfo._material.meshMap[this.uniqueId] = undefined;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._material = value;\r\n\r\n if (value && value.meshMap) {\r\n value.meshMap[this.uniqueId] = this;\r\n }\r\n\r\n if (this.onMaterialChangedObservable.hasObservers()) {\r\n this.onMaterialChangedObservable.notifyObservers(this);\r\n }\r\n\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n this.resetDrawCache();\r\n this._unBindEffect();\r\n }\r\n\r\n /**\r\n * Gets the material used to render the mesh in a specific render pass\r\n * @param renderPassId render pass id\r\n * @returns material used for the render pass. If no specific material is used for this render pass, undefined is returned (meaning mesh.material is used for this pass)\r\n */\r\n public getMaterialForRenderPass(renderPassId: number): Material | undefined {\r\n return this._internalAbstractMeshDataInfo._materialForRenderPass?.[renderPassId];\r\n }\r\n\r\n /**\r\n * Sets the material to be used to render the mesh in a specific render pass\r\n * @param renderPassId render pass id\r\n * @param material material to use for this render pass. If undefined is passed, no specific material will be used for this render pass but the regular material will be used instead (mesh.material)\r\n */\r\n public setMaterialForRenderPass(renderPassId: number, material?: Material): void {\r\n this.resetDrawCache(renderPassId);\r\n if (!this._internalAbstractMeshDataInfo._materialForRenderPass) {\r\n this._internalAbstractMeshDataInfo._materialForRenderPass = [];\r\n }\r\n this._internalAbstractMeshDataInfo._materialForRenderPass[renderPassId] = material;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this mesh can receive realtime shadows\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows\r\n */\r\n public get receiveShadows(): boolean {\r\n return this._internalAbstractMeshDataInfo._receiveShadows;\r\n }\r\n public set receiveShadows(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._receiveShadows === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._receiveShadows = value;\r\n this._markSubMeshesAsLightDirty();\r\n }\r\n\r\n /** Defines color to use when rendering outline */\r\n public outlineColor = Color3.Red();\r\n /** Define width to use when rendering outline */\r\n public outlineWidth = 0.02;\r\n\r\n /** Defines color to use when rendering overlay */\r\n public overlayColor = Color3.Red();\r\n /** Defines alpha to use when rendering overlay */\r\n public overlayAlpha = 0.5;\r\n\r\n /** Gets or sets a boolean indicating that this mesh contains vertex color data with alpha values */\r\n public get hasVertexAlpha(): boolean {\r\n return this._internalAbstractMeshDataInfo._hasVertexAlpha;\r\n }\r\n public set hasVertexAlpha(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._hasVertexAlpha === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._hasVertexAlpha = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n this._markSubMeshesAsMiscDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating that this mesh needs to use vertex color data to render (if this kind of vertex data is available in the geometry) */\r\n public get useVertexColors(): boolean {\r\n return this._internalAbstractMeshDataInfo._useVertexColors;\r\n }\r\n public set useVertexColors(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._useVertexColors === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._useVertexColors = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that bone animations must be computed by the GPU (true by default)\r\n */\r\n public get computeBonesUsingShaders(): boolean {\r\n return this._internalAbstractMeshDataInfo._computeBonesUsingShaders;\r\n }\r\n public set computeBonesUsingShaders(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._computeBonesUsingShaders === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._computeBonesUsingShaders = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /** Gets or sets the number of allowed bone influences per vertex (4 by default) */\r\n public get numBoneInfluencers(): number {\r\n return this._internalAbstractMeshDataInfo._numBoneInfluencers;\r\n }\r\n public set numBoneInfluencers(value: number) {\r\n if (this._internalAbstractMeshDataInfo._numBoneInfluencers === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._numBoneInfluencers = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating that this mesh will allow fog to be rendered on it (true by default) */\r\n public get applyFog(): boolean {\r\n return this._internalAbstractMeshDataInfo._applyFog;\r\n }\r\n public set applyFog(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._applyFog === value) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._applyFog = value;\r\n this._markSubMeshesAsMiscDirty();\r\n }\r\n\r\n /** When enabled, decompose picking matrices for better precision with large values for mesh position and scling */\r\n public get enableDistantPicking(): boolean {\r\n return this._internalAbstractMeshDataInfo._enableDistantPicking;\r\n }\r\n public set enableDistantPicking(value: boolean) {\r\n this._internalAbstractMeshDataInfo._enableDistantPicking = value;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes selection (true by default) */\r\n public useOctreeForRenderingSelection = true;\r\n /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes picking (true by default) */\r\n public useOctreeForPicking = true;\r\n /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes collision (true by default) */\r\n public useOctreeForCollisions = true;\r\n /**\r\n * Gets or sets the current layer mask (default is 0x0FFFFFFF)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/layerMasksAndMultiCam\r\n */\r\n public get layerMask(): number {\r\n return this._internalAbstractMeshDataInfo._layerMask;\r\n }\r\n\r\n public set layerMask(value: number) {\r\n if (value === this._internalAbstractMeshDataInfo._layerMask) {\r\n return;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._layerMask = value;\r\n this._resyncLightSources();\r\n }\r\n\r\n /**\r\n * True if the mesh must be rendered in any case (this will shortcut the frustum clipping phase)\r\n */\r\n public alwaysSelectAsActiveMesh = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the bounding info does not need to be kept in sync (for performance reason)\r\n */\r\n public doNotSyncBoundingInfo = false;\r\n\r\n /**\r\n * Gets or sets the current action manager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions\r\n */\r\n public actionManager: Nullable = null;\r\n\r\n /**\r\n * Gets or sets the ellipsoid used to impersonate this mesh when using collision engine (default is (0.5, 1, 0.5))\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public ellipsoid = new Vector3(0.5, 1, 0.5);\r\n /**\r\n * Gets or sets the ellipsoid offset used to impersonate this mesh when using collision engine (default is (0, 0, 0))\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public ellipsoidOffset = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Gets or sets a collision mask used to mask collisions (default is -1).\r\n * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0\r\n */\r\n public get collisionMask(): number {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionMask;\r\n }\r\n\r\n public set collisionMask(mask: number) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionMask = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * Gets or sets a collision response flag (default is true).\r\n * when collisionResponse is false, events are still triggered but colliding entity has no response\r\n * This helps creating trigger volume when user wants collision feedback events but not position/velocity\r\n * to respond to the collision.\r\n */\r\n public get collisionResponse(): boolean {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionResponse;\r\n }\r\n\r\n public set collisionResponse(response: boolean) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionResponse = response;\r\n }\r\n /**\r\n * Gets or sets the current collision group mask (-1 by default).\r\n * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0\r\n */\r\n public get collisionGroup(): number {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collisionGroup;\r\n }\r\n\r\n public set collisionGroup(mask: number) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collisionGroup = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * Gets or sets current surrounding meshes (null by default).\r\n *\r\n * By default collision detection is tested against every mesh in the scene.\r\n * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified\r\n * meshes will be tested for the collision.\r\n *\r\n * Note: if set to an empty array no collision will happen when this mesh is moved.\r\n */\r\n public get surroundingMeshes(): Nullable {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._surroundingMeshes;\r\n }\r\n\r\n public set surroundingMeshes(meshes: Nullable) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._surroundingMeshes = meshes;\r\n }\r\n\r\n // Edges\r\n /**\r\n * Defines edge width used when edgesRenderer is enabled\r\n * @see https://www.babylonjs-playground.com/#10OJSG#13\r\n */\r\n public edgesWidth = 1;\r\n /**\r\n * Defines edge color used when edgesRenderer is enabled\r\n * @see https://www.babylonjs-playground.com/#10OJSG#13\r\n */\r\n public edgesColor = new Color4(1, 0, 0, 1);\r\n /** @internal */\r\n public _edgesRenderer: Nullable = null;\r\n\r\n /** @internal */\r\n public _masterMesh: Nullable = null;\r\n protected _boundingInfo: Nullable = null;\r\n protected _boundingInfoIsDirty = true;\r\n /** @internal */\r\n public _renderId = 0;\r\n\r\n /**\r\n * Gets or sets the list of subMeshes\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials\r\n */\r\n public subMeshes: SubMesh[];\r\n\r\n /** @internal */\r\n public _intersectionsInProgress = new Array();\r\n\r\n /** @internal */\r\n public _unIndexed = false;\r\n\r\n /** @internal */\r\n public _lightSources = new Array();\r\n\r\n /** Gets the list of lights affecting that mesh */\r\n public get lightSources(): Light[] {\r\n return this._lightSources;\r\n }\r\n\r\n /** @internal */\r\n public get _positions(): Nullable {\r\n return null;\r\n }\r\n\r\n // Loading properties\r\n /** @internal */\r\n public _waitingData: {\r\n lods: Nullable;\r\n actions: Nullable;\r\n freezeWorldMatrix: Nullable;\r\n } = {\r\n lods: null,\r\n actions: null,\r\n freezeWorldMatrix: null,\r\n };\r\n\r\n /** @internal */\r\n public _bonesTransformMatrices: Nullable = null;\r\n\r\n /** @internal */\r\n public _transformMatrixTexture: Nullable = null;\r\n\r\n /**\r\n * Gets or sets a skeleton to apply skinning transformations\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons\r\n */\r\n public set skeleton(value: Nullable) {\r\n const skeleton = this._internalAbstractMeshDataInfo._skeleton;\r\n if (skeleton && skeleton.needInitialSkinMatrix) {\r\n skeleton._unregisterMeshWithPoseMatrix(this);\r\n }\r\n\r\n if (value && value.needInitialSkinMatrix) {\r\n value._registerMeshWithPoseMatrix(this);\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._skeleton = value;\r\n\r\n if (!this._internalAbstractMeshDataInfo._skeleton) {\r\n this._bonesTransformMatrices = null;\r\n }\r\n\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n public get skeleton(): Nullable {\r\n return this._internalAbstractMeshDataInfo._skeleton;\r\n }\r\n\r\n /**\r\n * An event triggered when the mesh is rebuilt.\r\n */\r\n public onRebuildObservable = new Observable();\r\n\r\n /**\r\n * The current mesh uniform buffer.\r\n * @internal Internal use only.\r\n */\r\n public _uniformBuffer: UniformBuffer;\r\n\r\n // Constructor\r\n\r\n /**\r\n * Creates a new AbstractMesh\r\n * @param name defines the name of the mesh\r\n * @param scene defines the hosting scene\r\n */\r\n constructor(name: string, scene: Nullable = null) {\r\n super(name, scene, false);\r\n\r\n scene = this.getScene();\r\n\r\n scene.addMesh(this);\r\n\r\n this._resyncLightSources();\r\n\r\n // Mesh Uniform Buffer.\r\n this._uniformBuffer = new UniformBuffer(this.getScene().getEngine(), undefined, undefined, name, !this.getScene().getEngine().isWebGPU);\r\n this._buildUniformLayout();\r\n\r\n switch (scene.performancePriority) {\r\n case ScenePerformancePriority.Aggressive:\r\n this.doNotSyncBoundingInfo = true;\r\n // eslint-disable-next-line no-fallthrough\r\n case ScenePerformancePriority.Intermediate:\r\n this.alwaysSelectAsActiveMesh = true;\r\n this.isPickable = false;\r\n break;\r\n }\r\n }\r\n\r\n protected _buildUniformLayout(): void {\r\n this._uniformBuffer.addUniform(\"world\", 16);\r\n this._uniformBuffer.addUniform(\"visibility\", 1);\r\n this._uniformBuffer.create();\r\n }\r\n\r\n /**\r\n * Transfer the mesh values to its UBO.\r\n * @param world The world matrix associated with the mesh\r\n */\r\n public transferToEffect(world: Matrix): void {\r\n const ubo = this._uniformBuffer;\r\n\r\n ubo.updateMatrix(\"world\", world);\r\n ubo.updateFloat(\"visibility\", this._internalAbstractMeshDataInfo._visibility);\r\n\r\n ubo.update();\r\n }\r\n\r\n /**\r\n * Gets the mesh uniform buffer.\r\n * @returns the uniform buffer of the mesh.\r\n */\r\n public getMeshUniformBuffer(): UniformBuffer {\r\n return this._uniformBuffer;\r\n }\r\n\r\n /**\r\n * Returns the string \"AbstractMesh\"\r\n * @returns \"AbstractMesh\"\r\n */\r\n public getClassName(): string {\r\n return \"AbstractMesh\";\r\n }\r\n\r\n /**\r\n * Gets a string representation of the current mesh\r\n * @param fullDetails defines a boolean indicating if full details must be included\r\n * @returns a string representation of the current mesh\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name + \", isInstance: \" + (this.getClassName() !== \"InstancedMesh\" ? \"YES\" : \"NO\");\r\n ret += \", # of submeshes: \" + (this.subMeshes ? this.subMeshes.length : 0);\r\n\r\n const skeleton = this._internalAbstractMeshDataInfo._skeleton;\r\n if (skeleton) {\r\n ret += \", skeleton: \" + skeleton.name;\r\n }\r\n if (fullDetails) {\r\n ret += \", billboard mode: \" + [\"NONE\", \"X\", \"Y\", null, \"Z\", null, null, \"ALL\"][this.billboardMode];\r\n ret += \", freeze wrld mat: \" + (this._isWorldMatrixFrozen || this._waitingData.freezeWorldMatrix ? \"YES\" : \"NO\");\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _getEffectiveParent(): Nullable {\r\n if (this._masterMesh && this.billboardMode !== TransformNode.BILLBOARDMODE_NONE) {\r\n return this._masterMesh;\r\n }\r\n\r\n return super._getEffectiveParent();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getActionManagerForTrigger(trigger?: number, initialCall = true): Nullable {\r\n if (this.actionManager && (initialCall || this.actionManager.isRecursive)) {\r\n if (trigger) {\r\n if (this.actionManager.hasSpecificTrigger(trigger)) {\r\n return this.actionManager;\r\n }\r\n } else {\r\n return this.actionManager;\r\n }\r\n }\r\n\r\n if (!this.parent) {\r\n return null;\r\n }\r\n\r\n return this.parent._getActionManagerForTrigger(trigger, false);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _rebuild(dispose = false): void {\r\n this.onRebuildObservable.notifyObservers(this);\r\n\r\n if (this._occlusionQuery !== null) {\r\n this._occlusionQuery = null;\r\n }\r\n\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n for (const subMesh of this.subMeshes) {\r\n subMesh._rebuild();\r\n }\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n /** @internal */\r\n public _resyncLightSources(): void {\r\n this._lightSources.length = 0;\r\n\r\n for (const light of this.getScene().lights) {\r\n if (!light.isEnabled()) {\r\n continue;\r\n }\r\n\r\n if (light.canAffectMesh(this)) {\r\n this._lightSources.push(light);\r\n }\r\n }\r\n\r\n this._markSubMeshesAsLightDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _resyncLightSource(light: Light): void {\r\n const isIn = light.isEnabled() && light.canAffectMesh(this);\r\n\r\n const index = this._lightSources.indexOf(light);\r\n let removed = false;\r\n if (index === -1) {\r\n if (!isIn) {\r\n return;\r\n }\r\n this._lightSources.push(light);\r\n } else {\r\n if (isIn) {\r\n return;\r\n }\r\n removed = true;\r\n this._lightSources.splice(index, 1);\r\n }\r\n\r\n this._markSubMeshesAsLightDirty(removed);\r\n }\r\n\r\n /** @internal */\r\n public _unBindEffect() {\r\n for (const subMesh of this.subMeshes) {\r\n subMesh.setEffect(null);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _removeLightSource(light: Light, dispose: boolean): void {\r\n const index = this._lightSources.indexOf(light);\r\n\r\n if (index === -1) {\r\n return;\r\n }\r\n this._lightSources.splice(index, 1);\r\n\r\n this._markSubMeshesAsLightDirty(dispose);\r\n }\r\n\r\n private _markSubMeshesAsDirty(func: (defines: MaterialDefines) => void) {\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n for (const subMesh of this.subMeshes) {\r\n for (let i = 0; i < subMesh._drawWrappers.length; ++i) {\r\n const drawWrapper = subMesh._drawWrappers[i];\r\n if (!drawWrapper || !drawWrapper.defines || !(drawWrapper.defines as MaterialDefines).markAllAsDirty) {\r\n continue;\r\n }\r\n func(drawWrapper.defines as MaterialDefines);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _markSubMeshesAsLightDirty(dispose: boolean = false) {\r\n this._markSubMeshesAsDirty((defines) => defines.markAsLightDirty(dispose));\r\n }\r\n\r\n /** @internal */\r\n public _markSubMeshesAsAttributesDirty() {\r\n this._markSubMeshesAsDirty((defines) => defines.markAsAttributesDirty());\r\n }\r\n\r\n /** @internal */\r\n public _markSubMeshesAsMiscDirty() {\r\n this._markSubMeshesAsDirty((defines) => defines.markAsMiscDirty());\r\n }\r\n\r\n /**\r\n * Flag the AbstractMesh as dirty (Forcing it to update everything)\r\n * @param property if set to \"rotation\" the objects rotationQuaternion will be set to null\r\n * @returns this AbstractMesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public markAsDirty(property?: string): AbstractMesh {\r\n this._currentRenderId = Number.MAX_VALUE;\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache for all submeshes of this abstract mesh\r\n * @param passId If provided, releases only the draw wrapper corresponding to this render pass id\r\n */\r\n public resetDrawCache(passId?: number): void {\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n for (const subMesh of this.subMeshes) {\r\n subMesh.resetDrawCache(passId);\r\n }\r\n }\r\n\r\n // Methods\r\n /**\r\n * Returns true if the mesh is blocked. Implemented by child classes\r\n */\r\n public get isBlocked(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns the mesh itself by default. Implemented by child classes\r\n * @param camera defines the camera to use to pick the right LOD level\r\n * @returns the currentAbstractMesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getLOD(camera: Camera): Nullable {\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns 0 by default. Implemented by child classes\r\n * @returns an integer\r\n */\r\n public getTotalVertices(): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Returns a positive integer : the total number of indices in this mesh geometry.\r\n * @returns the number of indices or zero if the mesh has no geometry.\r\n */\r\n public getTotalIndices(): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Returns null by default. Implemented by child classes\r\n * @returns null\r\n */\r\n public getIndices(): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the array of the requested vertex data kind. Implemented by child classes\r\n * @param kind defines the vertex data kind to use\r\n * @returns null\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getVerticesData(kind: string): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Sets the vertex data of the mesh geometry for the requested `kind`.\r\n * If the mesh has no geometry, a new Geometry object is set to the mesh and then passed this vertex data.\r\n * Note that a new underlying VertexBuffer object is created each call.\r\n * If the `kind` is the `PositionKind`, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.\r\n * @param kind defines vertex data kind:\r\n * * VertexBuffer.PositionKind\r\n * * VertexBuffer.UVKind\r\n * * VertexBuffer.UV2Kind\r\n * * VertexBuffer.UV3Kind\r\n * * VertexBuffer.UV4Kind\r\n * * VertexBuffer.UV5Kind\r\n * * VertexBuffer.UV6Kind\r\n * * VertexBuffer.ColorKind\r\n * * VertexBuffer.MatricesIndicesKind\r\n * * VertexBuffer.MatricesIndicesExtraKind\r\n * * VertexBuffer.MatricesWeightsKind\r\n * * VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updatable defines if the data must be flagged as updatable (or static)\r\n * @param stride defines the vertex stride (size of an entire vertex). Can be null and in this case will be deduced from vertex data kind\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setVerticesData(kind: string, data: FloatArray, updatable?: boolean, stride?: number): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the existing vertex data of the mesh geometry for the requested `kind`.\r\n * If the mesh has no geometry, it is simply returned as it is.\r\n * @param kind defines vertex data kind:\r\n * * VertexBuffer.PositionKind\r\n * * VertexBuffer.UVKind\r\n * * VertexBuffer.UV2Kind\r\n * * VertexBuffer.UV3Kind\r\n * * VertexBuffer.UV4Kind\r\n * * VertexBuffer.UV5Kind\r\n * * VertexBuffer.UV6Kind\r\n * * VertexBuffer.ColorKind\r\n * * VertexBuffer.MatricesIndicesKind\r\n * * VertexBuffer.MatricesIndicesExtraKind\r\n * * VertexBuffer.MatricesWeightsKind\r\n * * VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updateExtends If `kind` is `PositionKind` and if `updateExtends` is true, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed\r\n * @param makeItUnique If true, a new global geometry is created from this data and is set to the mesh\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the mesh indices,\r\n * If the mesh has no geometry, a new Geometry object is created and set to the mesh.\r\n * @param indices Expects an array populated with integers or a typed array (Int32Array, Uint32Array, Uint16Array)\r\n * @param totalVertices Defines the total number of vertices\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setIndices(indices: IndicesArray, totalVertices: Nullable): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if specific vertex data is present\r\n * @param kind defines the vertex data kind to use\r\n * @returns true is data kind is present\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isVerticesDataPresent(kind: string): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns the mesh BoundingInfo object or creates a new one and returns if it was undefined.\r\n * Note that it returns a shallow bounding of the mesh (i.e. it does not include children).\r\n * However, if the mesh contains thin instances, it will be expanded to include them. If you want the \"raw\" bounding data instead, then use `getRawBoundingInfo()`.\r\n * To get the full bounding of all children, call `getHierarchyBoundingVectors` instead.\r\n * @returns a BoundingInfo\r\n */\r\n public getBoundingInfo(): BoundingInfo {\r\n if (this._masterMesh) {\r\n return this._masterMesh.getBoundingInfo();\r\n }\r\n\r\n if (this._boundingInfoIsDirty) {\r\n this._boundingInfoIsDirty = false;\r\n // this._boundingInfo is being created if undefined\r\n this._updateBoundingInfo();\r\n }\r\n // cannot be null.\r\n return this._boundingInfo!;\r\n }\r\n\r\n /**\r\n * Returns the bounding info unnafected by instance data.\r\n * @returns the bounding info of the mesh unaffected by instance data.\r\n */\r\n public getRawBoundingInfo() {\r\n return this.rawBoundingInfo ?? this.getBoundingInfo();\r\n }\r\n\r\n /**\r\n * Overwrite the current bounding info\r\n * @param boundingInfo defines the new bounding info\r\n * @returns the current mesh\r\n */\r\n public setBoundingInfo(boundingInfo: BoundingInfo): AbstractMesh {\r\n this._boundingInfo = boundingInfo;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns true if there is already a bounding info\r\n */\r\n public get hasBoundingInfo(): boolean {\r\n return this._boundingInfo !== null;\r\n }\r\n\r\n /**\r\n * Creates a new bounding info for the mesh\r\n * @param minimum min vector of the bounding box/sphere\r\n * @param maximum max vector of the bounding box/sphere\r\n * @param worldMatrix defines the new world matrix\r\n * @returns the new bounding info\r\n */\r\n public buildBoundingInfo(minimum: DeepImmutable, maximum: DeepImmutable, worldMatrix?: DeepImmutable) {\r\n this._boundingInfo = new BoundingInfo(minimum, maximum, worldMatrix);\r\n return this._boundingInfo;\r\n }\r\n\r\n /**\r\n * Uniformly scales the mesh to fit inside of a unit cube (1 X 1 X 1 units)\r\n * @param includeDescendants Use the hierarchy's bounding box instead of the mesh's bounding box. Default is false\r\n * @param ignoreRotation ignore rotation when computing the scale (ie. object will be axis aligned). Default is false\r\n * @param predicate predicate that is passed in to getHierarchyBoundingVectors when selecting which object should be included when scaling\r\n * @returns the current mesh\r\n */\r\n public normalizeToUnitCube(includeDescendants = true, ignoreRotation = false, predicate?: Nullable<(node: AbstractMesh) => boolean>): AbstractMesh {\r\n return super.normalizeToUnitCube(includeDescendants, ignoreRotation, predicate);\r\n }\r\n\r\n /** Gets a boolean indicating if this mesh has skinning data and an attached skeleton */\r\n public get useBones(): boolean {\r\n return (\r\n (this.skeleton &&\r\n this.getScene().skeletonsEnabled &&\r\n this.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind) &&\r\n this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind))\r\n );\r\n }\r\n\r\n /** @internal */\r\n public _preActivate(): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _preActivateForIntermediateRendering(renderId: number): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _activate(renderId: number, intermediateRendering: boolean): boolean {\r\n this._renderId = renderId;\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _postActivate(): void {\r\n // Do nothing\r\n }\r\n\r\n /** @internal */\r\n public _freeze() {\r\n // Do nothing\r\n }\r\n\r\n /** @internal */\r\n public _unFreeze() {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Gets the current world matrix\r\n * @returns a Matrix\r\n */\r\n public getWorldMatrix(): Matrix {\r\n if (this._masterMesh && this.billboardMode === TransformNode.BILLBOARDMODE_NONE) {\r\n return this._masterMesh.getWorldMatrix();\r\n }\r\n\r\n return super.getWorldMatrix();\r\n }\r\n\r\n /** @internal */\r\n public _getWorldMatrixDeterminant(): number {\r\n if (this._masterMesh) {\r\n return this._masterMesh._getWorldMatrixDeterminant();\r\n }\r\n\r\n return super._getWorldMatrixDeterminant();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh is an instance or a regular mesh\r\n */\r\n public get isAnInstance(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh has instances\r\n */\r\n public get hasInstances(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh has thin instances\r\n */\r\n public get hasThinInstances(): boolean {\r\n return false;\r\n }\r\n\r\n // ================================== Point of View Movement =================================\r\n\r\n /**\r\n * Perform relative position change from the point of view of behind the front of the mesh.\r\n * This is performed taking into account the meshes current rotation, so you do not have to care.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param amountRight defines the distance on the right axis\r\n * @param amountUp defines the distance on the up axis\r\n * @param amountForward defines the distance on the forward axis\r\n * @returns the current mesh\r\n */\r\n public movePOV(amountRight: number, amountUp: number, amountForward: number): AbstractMesh {\r\n this.position.addInPlace(this.calcMovePOV(amountRight, amountUp, amountForward));\r\n return this;\r\n }\r\n\r\n /**\r\n * Calculate relative position change from the point of view of behind the front of the mesh.\r\n * This is performed taking into account the meshes current rotation, so you do not have to care.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param amountRight defines the distance on the right axis\r\n * @param amountUp defines the distance on the up axis\r\n * @param amountForward defines the distance on the forward axis\r\n * @returns the new displacement vector\r\n */\r\n public calcMovePOV(amountRight: number, amountUp: number, amountForward: number): Vector3 {\r\n const rotMatrix = new Matrix();\r\n const rotQuaternion = this.rotationQuaternion ? this.rotationQuaternion : Quaternion.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z);\r\n rotQuaternion.toRotationMatrix(rotMatrix);\r\n\r\n const translationDelta = Vector3.Zero();\r\n const defForwardMult = this.definedFacingForward ? -1 : 1;\r\n Vector3.TransformCoordinatesFromFloatsToRef(amountRight * defForwardMult, amountUp, amountForward * defForwardMult, rotMatrix, translationDelta);\r\n return translationDelta;\r\n }\r\n // ================================== Point of View Rotation =================================\r\n /**\r\n * Perform relative rotation change from the point of view of behind the front of the mesh.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param flipBack defines the flip\r\n * @param twirlClockwise defines the twirl\r\n * @param tiltRight defines the tilt\r\n * @returns the current mesh\r\n */\r\n public rotatePOV(flipBack: number, twirlClockwise: number, tiltRight: number): AbstractMesh {\r\n this.rotation.addInPlace(this.calcRotatePOV(flipBack, twirlClockwise, tiltRight));\r\n return this;\r\n }\r\n\r\n /**\r\n * Calculate relative rotation change from the point of view of behind the front of the mesh.\r\n * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.\r\n * @param flipBack defines the flip\r\n * @param twirlClockwise defines the twirl\r\n * @param tiltRight defines the tilt\r\n * @returns the new rotation vector\r\n */\r\n public calcRotatePOV(flipBack: number, twirlClockwise: number, tiltRight: number): Vector3 {\r\n const defForwardMult = this.definedFacingForward ? 1 : -1;\r\n return new Vector3(flipBack * defForwardMult, twirlClockwise, tiltRight * defForwardMult);\r\n }\r\n\r\n /**\r\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\r\n * This means the mesh underlying bounding box and sphere are recomputed.\r\n * @param applySkeleton defines whether to apply the skeleton before computing the bounding info\r\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\r\n * @returns the current mesh\r\n */\r\n public refreshBoundingInfo(applySkeleton: boolean = false, applyMorph: boolean = false): AbstractMesh {\r\n if (this._boundingInfo && this._boundingInfo.isLocked) {\r\n return this;\r\n }\r\n\r\n this._refreshBoundingInfo(this._getPositionData(applySkeleton, applyMorph), null);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _refreshBoundingInfo(data: Nullable, bias: Nullable): void {\r\n if (data) {\r\n const extend = extractMinAndMax(data, 0, this.getTotalVertices(), bias);\r\n if (this._boundingInfo) {\r\n this._boundingInfo.reConstruct(extend.minimum, extend.maximum);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(extend.minimum, extend.maximum);\r\n }\r\n }\r\n\r\n if (this.subMeshes) {\r\n for (let index = 0; index < this.subMeshes.length; index++) {\r\n this.subMeshes[index].refreshBoundingInfo(data);\r\n }\r\n }\r\n\r\n this._updateBoundingInfo();\r\n }\r\n\r\n /**\r\n * Internal function to get buffer data and possibly apply morphs and normals\r\n * @param applySkeleton\r\n * @param applyMorph\r\n * @param data\r\n * @param kind the kind of data you want. Can be Normal or Position\r\n * @returns a FloatArray of the vertex data\r\n */\r\n private _getData(applySkeleton: boolean = false, applyMorph: boolean = false, data?: Nullable, kind: string = VertexBuffer.PositionKind): Nullable {\r\n data = data ?? this.getVerticesData(kind)!.slice();\r\n\r\n if (data && applyMorph && this.morphTargetManager) {\r\n let faceIndexCount = 0;\r\n let positionIndex = 0;\r\n for (let vertexCount = 0; vertexCount < data.length; vertexCount++) {\r\n let value = data[vertexCount];\r\n for (let targetCount = 0; targetCount < this.morphTargetManager.numTargets; targetCount++) {\r\n const targetMorph = this.morphTargetManager.getTarget(targetCount);\r\n const influence = targetMorph.influence;\r\n if (influence !== 0.0) {\r\n let morphTargetData: Nullable = null;\r\n switch (kind) {\r\n case VertexBuffer.PositionKind:\r\n morphTargetData = targetMorph.getPositions();\r\n break;\r\n case VertexBuffer.NormalKind:\r\n morphTargetData = targetMorph.getNormals();\r\n break;\r\n case VertexBuffer.TangentKind:\r\n morphTargetData = targetMorph.getTangents();\r\n break;\r\n case VertexBuffer.UVKind:\r\n morphTargetData = targetMorph.getUVs();\r\n break;\r\n }\r\n if (morphTargetData) {\r\n value += (morphTargetData[vertexCount] - data[vertexCount]) * influence;\r\n }\r\n }\r\n }\r\n data[vertexCount] = value;\r\n\r\n faceIndexCount++;\r\n if (kind === VertexBuffer.PositionKind) {\r\n if (this._positions && faceIndexCount === 3) {\r\n // We want to merge into positions every 3 indices starting (but not 0)\r\n faceIndexCount = 0;\r\n const index = positionIndex * 3;\r\n this._positions[positionIndex++].copyFromFloats(data[index], data[index + 1], data[index + 2]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (data && applySkeleton && this.skeleton) {\r\n const matricesIndicesData = this.getVerticesData(VertexBuffer.MatricesIndicesKind);\r\n const matricesWeightsData = this.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n if (matricesWeightsData && matricesIndicesData) {\r\n const needExtras = this.numBoneInfluencers > 4;\r\n const matricesIndicesExtraData = needExtras ? this.getVerticesData(VertexBuffer.MatricesIndicesExtraKind) : null;\r\n const matricesWeightsExtraData = needExtras ? this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind) : null;\r\n\r\n const skeletonMatrices = this.skeleton.getTransformMatrices(this);\r\n\r\n const tempVector = TmpVectors.Vector3[0];\r\n const finalMatrix = TmpVectors.Matrix[0];\r\n const tempMatrix = TmpVectors.Matrix[1];\r\n\r\n let matWeightIdx = 0;\r\n for (let index = 0; index < data.length; index += 3, matWeightIdx += 4) {\r\n finalMatrix.reset();\r\n\r\n let inf: number;\r\n let weight: number;\r\n for (inf = 0; inf < 4; inf++) {\r\n weight = matricesWeightsData[matWeightIdx + inf];\r\n if (weight > 0) {\r\n Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesData[matWeightIdx + inf] * 16), weight, tempMatrix);\r\n finalMatrix.addToSelf(tempMatrix);\r\n }\r\n }\r\n if (needExtras) {\r\n for (inf = 0; inf < 4; inf++) {\r\n weight = matricesWeightsExtraData![matWeightIdx + inf];\r\n if (weight > 0) {\r\n Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesExtraData![matWeightIdx + inf] * 16), weight, tempMatrix);\r\n finalMatrix.addToSelf(tempMatrix);\r\n }\r\n }\r\n }\r\n\r\n if (kind === VertexBuffer.NormalKind) {\r\n Vector3.TransformNormalFromFloatsToRef(data[index], data[index + 1], data[index + 2], finalMatrix, tempVector);\r\n } else {\r\n Vector3.TransformCoordinatesFromFloatsToRef(data[index], data[index + 1], data[index + 2], finalMatrix, tempVector);\r\n }\r\n tempVector.toArray(data, index);\r\n\r\n if (kind === VertexBuffer.PositionKind && this._positions) {\r\n this._positions[index / 3].copyFrom(tempVector);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Get the normals vertex data and optionally apply skeleton and morphing.\r\n * @param applySkeleton defines whether to apply the skeleton\r\n * @param applyMorph defines whether to apply the morph target\r\n * @returns the normals data\r\n */\r\n public getNormalsData(applySkeleton = false, applyMorph = false): Nullable {\r\n return this._getData(applySkeleton, applyMorph, null, VertexBuffer.NormalKind);\r\n }\r\n\r\n /**\r\n * Get the position vertex data and optionally apply skeleton and morphing.\r\n * @param applySkeleton defines whether to apply the skeleton\r\n * @param applyMorph defines whether to apply the morph target\r\n * @param data defines the position data to apply the skeleton and morph to\r\n * @returns the position data\r\n */\r\n public getPositionData(applySkeleton: boolean = false, applyMorph: boolean = false, data?: Nullable): Nullable {\r\n return this._getData(applySkeleton, applyMorph, data, VertexBuffer.PositionKind);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getPositionData(applySkeleton: boolean, applyMorph: boolean): Nullable {\r\n let data = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (this._internalAbstractMeshDataInfo._positions) {\r\n this._internalAbstractMeshDataInfo._positions = null;\r\n }\r\n\r\n if (data && ((applySkeleton && this.skeleton) || (applyMorph && this.morphTargetManager))) {\r\n data = data.slice();\r\n this._generatePointsArray();\r\n if (this._positions) {\r\n const pos = this._positions;\r\n this._internalAbstractMeshDataInfo._positions = new Array(pos.length);\r\n for (let i = 0; i < pos.length; i++) {\r\n this._internalAbstractMeshDataInfo._positions[i] = pos[i]?.clone() || new Vector3();\r\n }\r\n }\r\n return this.getPositionData(applySkeleton, applyMorph, data);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /** @internal */\r\n public _updateBoundingInfo(): AbstractMesh {\r\n if (this._boundingInfo) {\r\n this._boundingInfo.update(this.worldMatrixFromCache);\r\n } else {\r\n this._boundingInfo = new BoundingInfo(Vector3.Zero(), Vector3.Zero(), this.worldMatrixFromCache);\r\n }\r\n this._updateSubMeshesBoundingInfo(this.worldMatrixFromCache);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateSubMeshesBoundingInfo(matrix: DeepImmutable): AbstractMesh {\r\n if (!this.subMeshes) {\r\n return this;\r\n }\r\n const count = this.subMeshes.length;\r\n for (let subIndex = 0; subIndex < count; subIndex++) {\r\n const subMesh = this.subMeshes[subIndex];\r\n if (count > 1 || !subMesh.IsGlobal) {\r\n subMesh.updateBoundingInfo(matrix);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n protected _afterComputeWorldMatrix(): void {\r\n if (this.doNotSyncBoundingInfo) {\r\n return;\r\n }\r\n // Bounding info\r\n this._boundingInfoIsDirty = true;\r\n }\r\n\r\n /**\r\n * Returns `true` if the mesh is within the frustum defined by the passed array of planes.\r\n * A mesh is in the frustum if its bounding box intersects the frustum\r\n * @param frustumPlanes defines the frustum to test\r\n * @returns true if the mesh is in the frustum planes\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n return this.getBoundingInfo().isInFrustum(frustumPlanes, this.cullingStrategy);\r\n }\r\n\r\n /**\r\n * Returns `true` if the mesh is completely in the frustum defined be the passed array of planes.\r\n * A mesh is completely in the frustum if its bounding box it completely inside the frustum.\r\n * @param frustumPlanes defines the frustum to test\r\n * @returns true if the mesh is completely in the frustum planes\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Plane[]): boolean {\r\n return this.getBoundingInfo().isCompletelyInFrustum(frustumPlanes);\r\n }\r\n\r\n /**\r\n * True if the mesh intersects another mesh or a SolidParticle object\r\n * @param mesh defines a target mesh or SolidParticle to test\r\n * @param precise Unless the parameter `precise` is set to `true` the intersection is computed according to Axis Aligned Bounding Boxes (AABB), else according to OBB (Oriented BBoxes)\r\n * @param includeDescendants Can be set to true to test if the mesh defined in parameters intersects with the current mesh or any child meshes\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsMesh(mesh: AbstractMesh | SolidParticle, precise: boolean = false, includeDescendants?: boolean): boolean {\r\n const boundingInfo = this.getBoundingInfo();\r\n const otherBoundingInfo = mesh.getBoundingInfo();\r\n\r\n if (boundingInfo.intersects(otherBoundingInfo, precise)) {\r\n return true;\r\n }\r\n\r\n if (includeDescendants) {\r\n for (const child of this.getChildMeshes()) {\r\n if (child.intersectsMesh(mesh, precise, true)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns true if the passed point (Vector3) is inside the mesh bounding box\r\n * @param point defines the point to test\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsPoint(point: Vector3): boolean {\r\n return this.getBoundingInfo().intersectsPoint(point);\r\n }\r\n\r\n // Collisions\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this mesh can be used in the collision engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public get checkCollisions(): boolean {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._checkCollisions;\r\n }\r\n\r\n public set checkCollisions(collisionEnabled: boolean) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._checkCollisions = collisionEnabled;\r\n }\r\n\r\n /**\r\n * Gets Collider object used to compute collisions (not physics)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n */\r\n public get collider(): Nullable {\r\n return this._internalAbstractMeshDataInfo._meshCollisionData._collider;\r\n }\r\n\r\n /**\r\n * Move the mesh using collision engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions\r\n * @param displacement defines the requested displacement vector\r\n * @returns the current mesh\r\n */\r\n public moveWithCollisions(displacement: Vector3): AbstractMesh {\r\n const globalPosition = this.getAbsolutePosition();\r\n\r\n globalPosition.addToRef(this.ellipsoidOffset, this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions);\r\n const coordinator = this.getScene().collisionCoordinator;\r\n\r\n if (!this._internalAbstractMeshDataInfo._meshCollisionData._collider) {\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collider = coordinator.createCollider();\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collider._radius = this.ellipsoid;\r\n\r\n coordinator.getNewPosition(\r\n this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions,\r\n displacement,\r\n this._internalAbstractMeshDataInfo._meshCollisionData._collider,\r\n this.collisionRetryCount,\r\n this,\r\n this._onCollisionPositionChange,\r\n this.uniqueId\r\n );\r\n return this;\r\n }\r\n\r\n private _onCollisionPositionChange = (collisionId: number, newPosition: Vector3, collidedMesh: Nullable = null) => {\r\n newPosition.subtractToRef(\r\n this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions,\r\n this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions\r\n );\r\n\r\n if (this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions.length() > Engine.CollisionsEpsilon) {\r\n this.position.addInPlace(this._internalAbstractMeshDataInfo._meshCollisionData._diffPositionForCollisions);\r\n }\r\n\r\n if (collidedMesh) {\r\n this.onCollideObservable.notifyObservers(collidedMesh);\r\n }\r\n\r\n this.onCollisionPositionChangeObservable.notifyObservers(this.position);\r\n };\r\n\r\n // Collisions\r\n /**\r\n * @internal\r\n */\r\n public _collideForSubMesh(subMesh: SubMesh, transformMatrix: Matrix, collider: Collider): AbstractMesh {\r\n this._generatePointsArray();\r\n\r\n if (!this._positions) {\r\n return this;\r\n }\r\n\r\n // Transformation\r\n if (!subMesh._lastColliderWorldVertices || !subMesh._lastColliderTransformMatrix!.equals(transformMatrix)) {\r\n subMesh._lastColliderTransformMatrix = transformMatrix.clone();\r\n subMesh._lastColliderWorldVertices = [];\r\n subMesh._trianglePlanes = [];\r\n const start = subMesh.verticesStart;\r\n const end = subMesh.verticesStart + subMesh.verticesCount;\r\n for (let i = start; i < end; i++) {\r\n subMesh._lastColliderWorldVertices.push(Vector3.TransformCoordinates(this._positions[i], transformMatrix));\r\n }\r\n }\r\n\r\n // Collide\r\n collider._collide(\r\n subMesh._trianglePlanes,\r\n subMesh._lastColliderWorldVertices,\r\n this.getIndices(),\r\n subMesh.indexStart,\r\n subMesh.indexStart + subMesh.indexCount,\r\n subMesh.verticesStart,\r\n !!subMesh.getMaterial(),\r\n this,\r\n this._shouldConvertRHS(),\r\n subMesh.getMaterial()?.fillMode === Constants.MATERIAL_TriangleStripDrawMode\r\n );\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processCollisionsForSubMeshes(collider: Collider, transformMatrix: Matrix): AbstractMesh {\r\n const subMeshes = this._scene.getCollidingSubMeshCandidates(this, collider);\r\n const len = subMeshes.length;\r\n\r\n for (let index = 0; index < len; index++) {\r\n const subMesh = subMeshes.data[index];\r\n\r\n // Bounding test\r\n if (len > 1 && !subMesh._checkCollision(collider)) {\r\n continue;\r\n }\r\n\r\n this._collideForSubMesh(subMesh, transformMatrix, collider);\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public _shouldConvertRHS() {\r\n return false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _checkCollision(collider: Collider): AbstractMesh {\r\n // Bounding box test\r\n if (!this.getBoundingInfo()._checkCollision(collider)) {\r\n return this;\r\n }\r\n\r\n // Transformation matrix\r\n const collisionsScalingMatrix = TmpVectors.Matrix[0];\r\n const collisionsTransformMatrix = TmpVectors.Matrix[1];\r\n Matrix.ScalingToRef(1.0 / collider._radius.x, 1.0 / collider._radius.y, 1.0 / collider._radius.z, collisionsScalingMatrix);\r\n this.worldMatrixFromCache.multiplyToRef(collisionsScalingMatrix, collisionsTransformMatrix);\r\n this._processCollisionsForSubMeshes(collider, collisionsTransformMatrix);\r\n return this;\r\n }\r\n\r\n // Picking\r\n /** @internal */\r\n public _generatePointsArray(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if the passed Ray intersects with the mesh. A mesh triangle can be picked both from its front and back sides,\r\n * irrespective of orientation.\r\n * @param ray defines the ray to use. It should be in the mesh's LOCAL coordinate space.\r\n * @param fastCheck defines if fast mode (but less precise) must be used (false by default)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\r\n * @param worldToUse defines the world matrix to use to get the world coordinate of the intersection point\r\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\r\n * @returns the picking info\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect\r\n */\r\n public intersects(\r\n ray: Ray,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate,\r\n onlyBoundingInfo = false,\r\n worldToUse?: Matrix,\r\n skipBoundingInfo = false\r\n ): PickingInfo {\r\n const pickingInfo = new PickingInfo();\r\n const className = this.getClassName();\r\n const intersectionThreshold = className === \"InstancedLinesMesh\" || className === \"LinesMesh\" || className === \"GreasedLineMesh\" ? (this as any).intersectionThreshold : 0;\r\n const boundingInfo = this.getBoundingInfo();\r\n if (!this.subMeshes) {\r\n return pickingInfo;\r\n }\r\n if (\r\n !skipBoundingInfo &&\r\n (!ray.intersectsSphere(boundingInfo.boundingSphere, intersectionThreshold) || !ray.intersectsBox(boundingInfo.boundingBox, intersectionThreshold))\r\n ) {\r\n return pickingInfo;\r\n }\r\n\r\n if (onlyBoundingInfo) {\r\n pickingInfo.hit = skipBoundingInfo ? false : true;\r\n pickingInfo.pickedMesh = skipBoundingInfo ? null : this;\r\n pickingInfo.distance = skipBoundingInfo ? 0 : Vector3.Distance(ray.origin, boundingInfo.boundingSphere.center);\r\n pickingInfo.subMeshId = 0;\r\n return pickingInfo;\r\n }\r\n\r\n if (!this._generatePointsArray()) {\r\n return pickingInfo;\r\n }\r\n\r\n let intersectInfo: Nullable = null;\r\n\r\n const subMeshes = this._scene.getIntersectingSubMeshCandidates(this, ray);\r\n const len: number = subMeshes.length;\r\n\r\n // Check if all submeshes are using a material that don't allow picking (point/lines rendering)\r\n // if no submesh can be picked that way, then fallback to BBox picking\r\n let anySubmeshSupportIntersect = false;\r\n for (let index = 0; index < len; index++) {\r\n const subMesh = subMeshes.data[index];\r\n const material = subMesh.getMaterial();\r\n if (!material) {\r\n continue;\r\n }\r\n if (\r\n material.fillMode == Constants.MATERIAL_TriangleStripDrawMode ||\r\n material.fillMode == Constants.MATERIAL_TriangleFillMode ||\r\n material.fillMode == Constants.MATERIAL_WireFrameFillMode ||\r\n material.fillMode == Constants.MATERIAL_PointFillMode ||\r\n material.fillMode == Constants.MATERIAL_LineListDrawMode\r\n ) {\r\n anySubmeshSupportIntersect = true;\r\n break;\r\n }\r\n }\r\n\r\n // no sub mesh support intersection, fallback to BBox that has already be done\r\n if (!anySubmeshSupportIntersect) {\r\n pickingInfo.hit = true;\r\n pickingInfo.pickedMesh = this;\r\n pickingInfo.distance = Vector3.Distance(ray.origin, boundingInfo.boundingSphere.center);\r\n pickingInfo.subMeshId = -1;\r\n return pickingInfo;\r\n }\r\n\r\n // at least 1 submesh supports intersection, keep going\r\n for (let index = 0; index < len; index++) {\r\n const subMesh = subMeshes.data[index];\r\n\r\n // Bounding test\r\n if (len > 1 && !skipBoundingInfo && !subMesh.canIntersects(ray)) {\r\n continue;\r\n }\r\n\r\n const currentIntersectInfo = subMesh.intersects(ray, this._positions, this.getIndices(), fastCheck, trianglePredicate);\r\n\r\n if (currentIntersectInfo) {\r\n if (fastCheck || !intersectInfo || currentIntersectInfo.distance < intersectInfo.distance) {\r\n intersectInfo = currentIntersectInfo;\r\n intersectInfo.subMeshId = index;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (intersectInfo) {\r\n // Get picked point\r\n const world = worldToUse ?? this.getWorldMatrix();\r\n const worldOrigin = TmpVectors.Vector3[0];\r\n const direction = TmpVectors.Vector3[1];\r\n Vector3.TransformCoordinatesToRef(ray.origin, world, worldOrigin);\r\n ray.direction.scaleToRef(intersectInfo.distance, direction);\r\n const worldDirection = Vector3.TransformNormal(direction, world);\r\n const pickedPoint = worldDirection.addInPlace(worldOrigin);\r\n\r\n // Return result\r\n pickingInfo.hit = true;\r\n pickingInfo.distance = Vector3.Distance(worldOrigin, pickedPoint);\r\n pickingInfo.pickedPoint = pickedPoint;\r\n pickingInfo.pickedMesh = this;\r\n pickingInfo.bu = intersectInfo.bu || 0;\r\n pickingInfo.bv = intersectInfo.bv || 0;\r\n pickingInfo.subMeshFaceId = intersectInfo.faceId;\r\n pickingInfo.faceId = intersectInfo.faceId + subMeshes.data[intersectInfo.subMeshId].indexStart / (this.getClassName().indexOf(\"LinesMesh\") !== -1 ? 2 : 3);\r\n pickingInfo.subMeshId = intersectInfo.subMeshId;\r\n return pickingInfo;\r\n }\r\n\r\n return pickingInfo;\r\n }\r\n\r\n /**\r\n * Clones the current mesh\r\n * @param name defines the mesh name\r\n * @param newParent defines the new mesh parent\r\n * @param doNotCloneChildren defines a boolean indicating that children must not be cloned (false by default)\r\n * @returns the new mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public clone(name: string, newParent: Nullable, doNotCloneChildren?: boolean): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Disposes all the submeshes of the current meshnp\r\n * @returns the current mesh\r\n */\r\n public releaseSubMeshes(): AbstractMesh {\r\n if (this.subMeshes) {\r\n while (this.subMeshes.length) {\r\n this.subMeshes[0].dispose();\r\n }\r\n } else {\r\n this.subMeshes = [] as SubMesh[];\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Releases resources associated with this abstract mesh.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n let index: number;\r\n\r\n const scene = this.getScene();\r\n\r\n // mesh map release.\r\n if (this._scene.useMaterialMeshMap) {\r\n // remove from material mesh map id needed\r\n if (this._internalAbstractMeshDataInfo._material && this._internalAbstractMeshDataInfo._material.meshMap) {\r\n this._internalAbstractMeshDataInfo._material.meshMap[this.uniqueId] = undefined;\r\n }\r\n }\r\n\r\n // Smart Array Retainers.\r\n scene.freeActiveMeshes();\r\n scene.freeRenderingGroups();\r\n if (scene.renderingManager.maintainStateBetweenFrames) {\r\n scene.renderingManager.restoreDispachedFlags();\r\n }\r\n\r\n // Action manager\r\n if (this.actionManager !== undefined && this.actionManager !== null) {\r\n // If it's the only mesh using the action manager, dispose of it.\r\n if (!this._scene.meshes.some((m) => m !== this && m.actionManager === this.actionManager)) {\r\n this.actionManager.dispose();\r\n }\r\n this.actionManager = null;\r\n }\r\n\r\n // Skeleton\r\n this._internalAbstractMeshDataInfo._skeleton = null;\r\n\r\n if (this._transformMatrixTexture) {\r\n this._transformMatrixTexture.dispose();\r\n this._transformMatrixTexture = null;\r\n }\r\n\r\n // Intersections in progress\r\n for (index = 0; index < this._intersectionsInProgress.length; index++) {\r\n const other = this._intersectionsInProgress[index];\r\n\r\n const pos = other._intersectionsInProgress.indexOf(this);\r\n other._intersectionsInProgress.splice(pos, 1);\r\n }\r\n\r\n this._intersectionsInProgress.length = 0;\r\n\r\n // Lights\r\n const lights = scene.lights;\r\n\r\n lights.forEach((light: Light) => {\r\n let meshIndex = light.includedOnlyMeshes.indexOf(this);\r\n\r\n if (meshIndex !== -1) {\r\n light.includedOnlyMeshes.splice(meshIndex, 1);\r\n }\r\n\r\n meshIndex = light.excludedMeshes.indexOf(this);\r\n\r\n if (meshIndex !== -1) {\r\n light.excludedMeshes.splice(meshIndex, 1);\r\n }\r\n\r\n // Shadow generators\r\n const generators = light.getShadowGenerators();\r\n if (generators) {\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n const shadowMap = generator.getShadowMap();\r\n\r\n if (shadowMap && shadowMap.renderList) {\r\n meshIndex = shadowMap.renderList.indexOf(this);\r\n\r\n if (meshIndex !== -1) {\r\n shadowMap.renderList.splice(meshIndex, 1);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n // SubMeshes\r\n if (this.getClassName() !== \"InstancedMesh\" || this.getClassName() !== \"InstancedLinesMesh\") {\r\n this.releaseSubMeshes();\r\n }\r\n\r\n // Query\r\n const engine = scene.getEngine();\r\n if (this._occlusionQuery !== null) {\r\n this.isOcclusionQueryInProgress = false;\r\n engine.deleteQuery(this._occlusionQuery);\r\n this._occlusionQuery = null;\r\n }\r\n\r\n // Engine\r\n engine.wipeCaches();\r\n\r\n // Remove from scene\r\n scene.removeMesh(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.meshes.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.meshes.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n if (disposeMaterialAndTextures) {\r\n if (this.material) {\r\n if (this.material.getClassName() === \"MultiMaterial\") {\r\n this.material.dispose(false, true, true);\r\n } else {\r\n this.material.dispose(false, true);\r\n }\r\n }\r\n }\r\n\r\n if (!doNotRecurse) {\r\n // Particles\r\n for (index = 0; index < scene.particleSystems.length; index++) {\r\n if (scene.particleSystems[index].emitter === this) {\r\n scene.particleSystems[index].dispose();\r\n index--;\r\n }\r\n }\r\n }\r\n\r\n // facet data\r\n if (this._internalAbstractMeshDataInfo._facetData.facetDataEnabled) {\r\n this.disableFacetData();\r\n }\r\n\r\n this._uniformBuffer.dispose();\r\n\r\n this.onAfterWorldMatrixUpdateObservable.clear();\r\n this.onCollideObservable.clear();\r\n this.onCollisionPositionChangeObservable.clear();\r\n this.onRebuildObservable.clear();\r\n\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n /**\r\n * Adds the passed mesh as a child to the current mesh\r\n * @param mesh defines the child mesh\r\n * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.\r\n * @returns the current mesh\r\n */\r\n public addChild(mesh: AbstractMesh, preserveScalingSign: boolean = false): AbstractMesh {\r\n mesh.setParent(this, preserveScalingSign);\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes the passed mesh from the current mesh children list\r\n * @param mesh defines the child mesh\r\n * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.\r\n * @returns the current mesh\r\n */\r\n public removeChild(mesh: AbstractMesh, preserveScalingSign: boolean = false): AbstractMesh {\r\n mesh.setParent(null, preserveScalingSign);\r\n return this;\r\n }\r\n\r\n // Facet data\r\n /** @internal */\r\n private _initFacetData(): AbstractMesh {\r\n const data = this._internalAbstractMeshDataInfo._facetData;\r\n if (!data.facetNormals) {\r\n data.facetNormals = [] as Vector3[];\r\n }\r\n if (!data.facetPositions) {\r\n data.facetPositions = [] as Vector3[];\r\n }\r\n if (!data.facetPartitioning) {\r\n data.facetPartitioning = new Array();\r\n }\r\n data.facetNb = ((this.getIndices()).length / 3) | 0;\r\n data.partitioningSubdivisions = data.partitioningSubdivisions ? data.partitioningSubdivisions : 10; // default nb of partitioning subdivisions = 10\r\n data.partitioningBBoxRatio = data.partitioningBBoxRatio ? data.partitioningBBoxRatio : 1.01; // default ratio 1.01 = the partitioning is 1% bigger than the bounding box\r\n for (let f = 0; f < data.facetNb; f++) {\r\n data.facetNormals[f] = Vector3.Zero();\r\n data.facetPositions[f] = Vector3.Zero();\r\n }\r\n data.facetDataEnabled = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the mesh facetData arrays and the internal partitioning when the mesh is morphed or updated.\r\n * This method can be called within the render loop.\r\n * You don't need to call this method by yourself in the render loop when you update/morph a mesh with the methods CreateXXX() as they automatically manage this computation\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public updateFacetData(): AbstractMesh {\r\n const data = this._internalAbstractMeshDataInfo._facetData;\r\n if (!data.facetDataEnabled) {\r\n this._initFacetData();\r\n }\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = this.getIndices();\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n const bInfo = this.getBoundingInfo();\r\n\r\n if (data.facetDepthSort && !data.facetDepthSortEnabled) {\r\n // init arrays, matrix and sort function on first call\r\n data.facetDepthSortEnabled = true;\r\n if (indices instanceof Uint16Array) {\r\n data.depthSortedIndices = new Uint16Array(indices!);\r\n } else if (indices instanceof Uint32Array) {\r\n data.depthSortedIndices = new Uint32Array(indices!);\r\n } else {\r\n let needs32bits = false;\r\n for (let i = 0; i < indices!.length; i++) {\r\n if (indices![i] > 65535) {\r\n needs32bits = true;\r\n break;\r\n }\r\n }\r\n if (needs32bits) {\r\n data.depthSortedIndices = new Uint32Array(indices!);\r\n } else {\r\n data.depthSortedIndices = new Uint16Array(indices!);\r\n }\r\n }\r\n data.facetDepthSortFunction = function (f1, f2) {\r\n return f2.sqDistance - f1.sqDistance;\r\n };\r\n if (!data.facetDepthSortFrom) {\r\n const camera = this.getScene().activeCamera;\r\n data.facetDepthSortFrom = camera ? camera.position : Vector3.Zero();\r\n }\r\n data.depthSortedFacets = [];\r\n for (let f = 0; f < data.facetNb; f++) {\r\n const depthSortedFacet = { ind: f * 3, sqDistance: 0.0 };\r\n data.depthSortedFacets.push(depthSortedFacet);\r\n }\r\n data.invertedMatrix = Matrix.Identity();\r\n data.facetDepthSortOrigin = Vector3.Zero();\r\n }\r\n\r\n data.bbSize.x = bInfo.maximum.x - bInfo.minimum.x > Epsilon ? bInfo.maximum.x - bInfo.minimum.x : Epsilon;\r\n data.bbSize.y = bInfo.maximum.y - bInfo.minimum.y > Epsilon ? bInfo.maximum.y - bInfo.minimum.y : Epsilon;\r\n data.bbSize.z = bInfo.maximum.z - bInfo.minimum.z > Epsilon ? bInfo.maximum.z - bInfo.minimum.z : Epsilon;\r\n let bbSizeMax = data.bbSize.x > data.bbSize.y ? data.bbSize.x : data.bbSize.y;\r\n bbSizeMax = bbSizeMax > data.bbSize.z ? bbSizeMax : data.bbSize.z;\r\n data.subDiv.max = data.partitioningSubdivisions;\r\n data.subDiv.X = Math.floor((data.subDiv.max * data.bbSize.x) / bbSizeMax); // adjust the number of subdivisions per axis\r\n data.subDiv.Y = Math.floor((data.subDiv.max * data.bbSize.y) / bbSizeMax); // according to each bbox size per axis\r\n data.subDiv.Z = Math.floor((data.subDiv.max * data.bbSize.z) / bbSizeMax);\r\n data.subDiv.X = data.subDiv.X < 1 ? 1 : data.subDiv.X; // at least one subdivision\r\n data.subDiv.Y = data.subDiv.Y < 1 ? 1 : data.subDiv.Y;\r\n data.subDiv.Z = data.subDiv.Z < 1 ? 1 : data.subDiv.Z;\r\n // set the parameters for ComputeNormals()\r\n data.facetParameters.facetNormals = this.getFacetLocalNormals();\r\n data.facetParameters.facetPositions = this.getFacetLocalPositions();\r\n data.facetParameters.facetPartitioning = this.getFacetLocalPartitioning();\r\n data.facetParameters.bInfo = bInfo;\r\n data.facetParameters.bbSize = data.bbSize;\r\n data.facetParameters.subDiv = data.subDiv;\r\n data.facetParameters.ratio = this.partitioningBBoxRatio;\r\n data.facetParameters.depthSort = data.facetDepthSort;\r\n if (data.facetDepthSort && data.facetDepthSortEnabled) {\r\n this.computeWorldMatrix(true);\r\n this._worldMatrix.invertToRef(data.invertedMatrix);\r\n Vector3.TransformCoordinatesToRef(data.facetDepthSortFrom, data.invertedMatrix, data.facetDepthSortOrigin);\r\n data.facetParameters.distanceTo = data.facetDepthSortOrigin;\r\n }\r\n data.facetParameters.depthSortedFacets = data.depthSortedFacets;\r\n if (normals) {\r\n VertexData.ComputeNormals(positions, indices, normals, data.facetParameters);\r\n }\r\n\r\n if (data.facetDepthSort && data.facetDepthSortEnabled) {\r\n data.depthSortedFacets.sort(data.facetDepthSortFunction);\r\n const l = (data.depthSortedIndices.length / 3) | 0;\r\n for (let f = 0; f < l; f++) {\r\n const sind = data.depthSortedFacets[f].ind;\r\n data.depthSortedIndices[f * 3] = indices![sind];\r\n data.depthSortedIndices[f * 3 + 1] = indices![sind + 1];\r\n data.depthSortedIndices[f * 3 + 2] = indices![sind + 2];\r\n }\r\n this.updateIndices(data.depthSortedIndices, undefined, true);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the facetLocalNormals array.\r\n * The normals are expressed in the mesh local spac\r\n * @returns an array of Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetLocalNormals(): Vector3[] {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n if (!facetData.facetNormals) {\r\n this.updateFacetData();\r\n }\r\n return facetData.facetNormals;\r\n }\r\n\r\n /**\r\n * Returns the facetLocalPositions array.\r\n * The facet positions are expressed in the mesh local space\r\n * @returns an array of Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetLocalPositions(): Vector3[] {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n if (!facetData.facetPositions) {\r\n this.updateFacetData();\r\n }\r\n return facetData.facetPositions;\r\n }\r\n\r\n /**\r\n * Returns the facetLocalPartitioning array\r\n * @returns an array of array of numbers\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetLocalPartitioning(): number[][] {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n\r\n if (!facetData.facetPartitioning) {\r\n this.updateFacetData();\r\n }\r\n return facetData.facetPartitioning;\r\n }\r\n\r\n /**\r\n * Returns the i-th facet position in the world system.\r\n * This method allocates a new Vector3 per call\r\n * @param i defines the facet index\r\n * @returns a new Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetPosition(i: number): Vector3 {\r\n const pos = Vector3.Zero();\r\n this.getFacetPositionToRef(i, pos);\r\n return pos;\r\n }\r\n\r\n /**\r\n * Sets the reference Vector3 with the i-th facet position in the world system\r\n * @param i defines the facet index\r\n * @param ref defines the target vector\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetPositionToRef(i: number, ref: Vector3): AbstractMesh {\r\n const localPos = this.getFacetLocalPositions()[i];\r\n const world = this.getWorldMatrix();\r\n Vector3.TransformCoordinatesToRef(localPos, world, ref);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the i-th facet normal in the world system.\r\n * This method allocates a new Vector3 per call\r\n * @param i defines the facet index\r\n * @returns a new Vector3\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetNormal(i: number): Vector3 {\r\n const norm = Vector3.Zero();\r\n this.getFacetNormalToRef(i, norm);\r\n return norm;\r\n }\r\n\r\n /**\r\n * Sets the reference Vector3 with the i-th facet normal in the world system\r\n * @param i defines the facet index\r\n * @param ref defines the target vector\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetNormalToRef(i: number, ref: Vector3) {\r\n const localNorm = this.getFacetLocalNormals()[i];\r\n Vector3.TransformNormalToRef(localNorm, this.getWorldMatrix(), ref);\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the facets (in an array) in the same partitioning block than the one the passed coordinates are located (expressed in the mesh local system)\r\n * @param x defines x coordinate\r\n * @param y defines y coordinate\r\n * @param z defines z coordinate\r\n * @returns the array of facet indexes\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetsAtLocalCoordinates(x: number, y: number, z: number): Nullable {\r\n const bInfo = this.getBoundingInfo();\r\n const data = this._internalAbstractMeshDataInfo._facetData;\r\n\r\n const ox = Math.floor(((x - bInfo.minimum.x * data.partitioningBBoxRatio) * data.subDiv.X * data.partitioningBBoxRatio) / data.bbSize.x);\r\n const oy = Math.floor(((y - bInfo.minimum.y * data.partitioningBBoxRatio) * data.subDiv.Y * data.partitioningBBoxRatio) / data.bbSize.y);\r\n const oz = Math.floor(((z - bInfo.minimum.z * data.partitioningBBoxRatio) * data.subDiv.Z * data.partitioningBBoxRatio) / data.bbSize.z);\r\n if (ox < 0 || ox > data.subDiv.max || oy < 0 || oy > data.subDiv.max || oz < 0 || oz > data.subDiv.max) {\r\n return null;\r\n }\r\n return data.facetPartitioning[ox + data.subDiv.max * oy + data.subDiv.max * data.subDiv.max * oz];\r\n }\r\n\r\n /**\r\n * Returns the closest mesh facet index at (x,y,z) World coordinates, null if not found\r\n * @param x defines x coordinate\r\n * @param y defines y coordinate\r\n * @param z defines z coordinate\r\n * @param projected sets as the (x,y,z) world projection on the facet\r\n * @param checkFace if true (default false), only the facet \"facing\" to (x,y,z) or only the ones \"turning their backs\", according to the parameter \"facing\" are returned\r\n * @param facing if facing and checkFace are true, only the facet \"facing\" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet \"turning their backs\" to (x, y, z) are returned : negative dot (x, y, z) * facet position\r\n * @returns the face index if found (or null instead)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getClosestFacetAtCoordinates(x: number, y: number, z: number, projected?: Vector3, checkFace: boolean = false, facing: boolean = true): Nullable {\r\n const world = this.getWorldMatrix();\r\n const invMat = TmpVectors.Matrix[5];\r\n world.invertToRef(invMat);\r\n const invVect = TmpVectors.Vector3[8];\r\n Vector3.TransformCoordinatesFromFloatsToRef(x, y, z, invMat, invVect); // transform (x,y,z) to coordinates in the mesh local space\r\n const closest = this.getClosestFacetAtLocalCoordinates(invVect.x, invVect.y, invVect.z, projected, checkFace, facing);\r\n if (projected) {\r\n // transform the local computed projected vector to world coordinates\r\n Vector3.TransformCoordinatesFromFloatsToRef(projected.x, projected.y, projected.z, world, projected);\r\n }\r\n return closest;\r\n }\r\n\r\n /**\r\n * Returns the closest mesh facet index at (x,y,z) local coordinates, null if not found\r\n * @param x defines x coordinate\r\n * @param y defines y coordinate\r\n * @param z defines z coordinate\r\n * @param projected sets as the (x,y,z) local projection on the facet\r\n * @param checkFace if true (default false), only the facet \"facing\" to (x,y,z) or only the ones \"turning their backs\", according to the parameter \"facing\" are returned\r\n * @param facing if facing and checkFace are true, only the facet \"facing\" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet \"turning their backs\" to (x, y, z) are returned : negative dot (x, y, z) * facet position\r\n * @returns the face index if found (or null instead)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getClosestFacetAtLocalCoordinates(x: number, y: number, z: number, projected?: Vector3, checkFace: boolean = false, facing: boolean = true): Nullable {\r\n let closest = null;\r\n let tmpx = 0.0;\r\n let tmpy = 0.0;\r\n let tmpz = 0.0;\r\n let d = 0.0; // tmp dot facet normal * facet position\r\n let t0 = 0.0;\r\n let projx = 0.0;\r\n let projy = 0.0;\r\n let projz = 0.0;\r\n // Get all the facets in the same partitioning block than (x, y, z)\r\n const facetPositions = this.getFacetLocalPositions();\r\n const facetNormals = this.getFacetLocalNormals();\r\n const facetsInBlock = this.getFacetsAtLocalCoordinates(x, y, z);\r\n if (!facetsInBlock) {\r\n return null;\r\n }\r\n // Get the closest facet to (x, y, z)\r\n let shortest = Number.MAX_VALUE; // init distance vars\r\n let tmpDistance = shortest;\r\n let fib; // current facet in the block\r\n let norm; // current facet normal\r\n let p0; // current facet barycenter position\r\n // loop on all the facets in the current partitioning block\r\n for (let idx = 0; idx < facetsInBlock.length; idx++) {\r\n fib = facetsInBlock[idx];\r\n norm = facetNormals[fib];\r\n p0 = facetPositions[fib];\r\n\r\n d = (x - p0.x) * norm.x + (y - p0.y) * norm.y + (z - p0.z) * norm.z;\r\n if (!checkFace || (checkFace && facing && d >= 0.0) || (checkFace && !facing && d <= 0.0)) {\r\n // compute (x,y,z) projection on the facet = (projx, projy, projz)\r\n d = norm.x * p0.x + norm.y * p0.y + norm.z * p0.z;\r\n t0 = -(norm.x * x + norm.y * y + norm.z * z - d) / (norm.x * norm.x + norm.y * norm.y + norm.z * norm.z);\r\n projx = x + norm.x * t0;\r\n projy = y + norm.y * t0;\r\n projz = z + norm.z * t0;\r\n\r\n tmpx = projx - x;\r\n tmpy = projy - y;\r\n tmpz = projz - z;\r\n tmpDistance = tmpx * tmpx + tmpy * tmpy + tmpz * tmpz; // compute length between (x, y, z) and its projection on the facet\r\n if (tmpDistance < shortest) {\r\n // just keep the closest facet to (x, y, z)\r\n shortest = tmpDistance;\r\n closest = fib;\r\n if (projected) {\r\n projected.x = projx;\r\n projected.y = projy;\r\n projected.z = projz;\r\n }\r\n }\r\n }\r\n }\r\n return closest;\r\n }\r\n\r\n /**\r\n * Returns the object \"parameter\" set with all the expected parameters for facetData computation by ComputeNormals()\r\n * @returns the parameters\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public getFacetDataParameters(): any {\r\n return this._internalAbstractMeshDataInfo._facetData.facetParameters;\r\n }\r\n\r\n /**\r\n * Disables the feature FacetData and frees the related memory\r\n * @returns the current mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData\r\n */\r\n public disableFacetData(): AbstractMesh {\r\n const facetData = this._internalAbstractMeshDataInfo._facetData;\r\n if (facetData.facetDataEnabled) {\r\n facetData.facetDataEnabled = false;\r\n facetData.facetPositions = [] as Vector3[];\r\n facetData.facetNormals = [] as Vector3[];\r\n facetData.facetPartitioning = new Array();\r\n facetData.facetParameters = null;\r\n facetData.depthSortedIndices = new Uint32Array(0);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the AbstractMesh indices array\r\n * @param indices defines the data source\r\n * @param offset defines the offset in the index buffer where to store the new data (can be null)\r\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\r\n * @returns the current mesh\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public updateIndices(indices: IndicesArray, offset?: number, gpuMemoryOnly = false): AbstractMesh {\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates new normals data for the mesh\r\n * @param updatable defines if the normal vertex buffer must be flagged as updatable\r\n * @returns the current mesh\r\n */\r\n public createNormals(updatable: boolean): AbstractMesh {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const indices = this.getIndices();\r\n let normals: FloatArray;\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.NormalKind)) {\r\n normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n } else {\r\n normals = [];\r\n }\r\n\r\n VertexData.ComputeNormals(positions, indices, normals, { useRightHandedSystem: this.getScene().useRightHandedSystem });\r\n this.setVerticesData(VertexBuffer.NormalKind, normals, updatable);\r\n return this;\r\n }\r\n\r\n /**\r\n * Align the mesh with a normal\r\n * @param normal defines the normal to use\r\n * @param upDirection can be used to redefined the up vector to use (will use the (0, 1, 0) by default)\r\n * @returns the current mesh\r\n */\r\n public alignWithNormal(normal: Vector3, upDirection?: Vector3): AbstractMesh {\r\n if (!upDirection) {\r\n upDirection = Axis.Y;\r\n }\r\n\r\n const axisX = TmpVectors.Vector3[0];\r\n const axisZ = TmpVectors.Vector3[1];\r\n Vector3.CrossToRef(upDirection, normal, axisZ);\r\n Vector3.CrossToRef(normal, axisZ, axisX);\r\n\r\n if (this.rotationQuaternion) {\r\n Quaternion.RotationQuaternionFromAxisToRef(axisX, normal, axisZ, this.rotationQuaternion);\r\n } else {\r\n Vector3.RotationFromAxisToRef(axisX, normal, axisZ, this.rotation);\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public _checkOcclusionQuery(): boolean {\r\n // Will be replaced by correct code if Occlusion queries are referenced\r\n return false;\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Disables the mesh edge rendering mode\r\n * @returns the currentAbstractMesh\r\n */\r\n disableEdgesRendering(): AbstractMesh {\r\n throw _WarnImport(\"EdgesRenderer\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Enables the edge rendering mode on the mesh.\r\n * This mode makes the mesh edges visible\r\n * @param epsilon defines the maximal distance between two angles to detect a face\r\n * @param checkVerticesInsteadOfIndices indicates that we should check vertex list directly instead of faces\r\n * @param options options to the edge renderer\r\n * @returns the currentAbstractMesh\r\n * @see https://www.babylonjs-playground.com/#19O9TU#0\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n enableEdgesRendering(epsilon?: number, checkVerticesInsteadOfIndices?: boolean, options?: IEdgesRendererOptions): AbstractMesh {\r\n throw _WarnImport(\"EdgesRenderer\");\r\n }\r\n\r\n /**\r\n * This function returns all of the particle systems in the scene that use the mesh as an emitter.\r\n * @returns an array of particle systems in the scene that use the mesh as an emitter\r\n */\r\n public getConnectedParticleSystems(): IParticleSystem[] {\r\n return this._scene.particleSystems.filter((particleSystem) => particleSystem.emitter === this);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.AbstractMesh\", AbstractMesh);\r\n", "import type { ShaderCustomProcessingFunction } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { SmartArray } from \"../Misc/smartArray\";\r\n\r\nimport type { BaseTexture } from \"./Textures/baseTexture\";\r\nimport type { EffectFallbacks } from \"./effectFallbacks\";\r\nimport type { MaterialDefines } from \"./materialDefines\";\r\nimport type { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport type { RenderTargetTexture } from \"./Textures/renderTargetTexture\";\r\n\r\n/** @internal */\r\nexport type MaterialPluginCreated = {};\r\n\r\n/** @internal */\r\nexport type MaterialPluginDisposed = {\r\n forceDisposeTextures?: boolean;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginHasTexture = {\r\n hasTexture: boolean;\r\n texture: BaseTexture;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginIsReadyForSubMesh = {\r\n isReadyForSubMesh: boolean;\r\n defines: MaterialDefines;\r\n subMesh: SubMesh;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginGetDefineNames = {\r\n defineNames?: { [name: string]: { type: string; default: any } };\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginPrepareEffect = {\r\n defines: MaterialDefines;\r\n fallbacks: EffectFallbacks;\r\n fallbackRank: number;\r\n customCode?: ShaderCustomProcessingFunction;\r\n attributes: string[];\r\n uniforms: string[];\r\n samplers: string[];\r\n uniformBuffersNames: string[];\r\n mesh: AbstractMesh;\r\n indexParameters: any;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginPrepareDefines = {\r\n defines: MaterialDefines;\r\n mesh: AbstractMesh;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginPrepareUniformBuffer = {\r\n ubo: UniformBuffer;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginBindForSubMesh = {\r\n subMesh: SubMesh;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginGetAnimatables = {\r\n animatables: IAnimatable[];\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginGetActiveTextures = {\r\n activeTextures: BaseTexture[];\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginFillRenderTargetTextures = {\r\n renderTargets: SmartArray;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginHasRenderTargetTextures = {\r\n hasRenderTargetTextures: boolean;\r\n};\r\n\r\n/** @internal */\r\nexport type MaterialPluginHardBindForSubMesh = {\r\n subMesh: SubMesh;\r\n};\r\n\r\n/**\r\n * @internal\r\n */\r\nexport enum MaterialPluginEvent {\r\n Created = 0x0001,\r\n Disposed = 0x0002,\r\n GetDefineNames = 0x0004,\r\n PrepareUniformBuffer = 0x0008,\r\n IsReadyForSubMesh = 0x0010,\r\n PrepareDefines = 0x0020,\r\n BindForSubMesh = 0x0040,\r\n PrepareEffect = 0x0080,\r\n GetAnimatables = 0x0100,\r\n GetActiveTextures = 0x0200,\r\n HasTexture = 0x0400,\r\n FillRenderTargetTextures = 0x0800,\r\n HasRenderTargetTextures = 0x1000,\r\n HardBindForSubMesh = 0x2000,\r\n}\r\n", "import type { Effect } from \"./effect\";\r\nimport type { IClipPlanesHolder } from \"../Misc/interfaces/iClipPlanesHolder\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\n\r\n/** @internal */\r\nexport function addClipPlaneUniforms(uniforms: string[]): void {\r\n if (uniforms.indexOf(\"vClipPlane\") === -1) {\r\n uniforms.push(\"vClipPlane\");\r\n }\r\n if (uniforms.indexOf(\"vClipPlane2\") === -1) {\r\n uniforms.push(\"vClipPlane2\");\r\n }\r\n if (uniforms.indexOf(\"vClipPlane3\") === -1) {\r\n uniforms.push(\"vClipPlane3\");\r\n }\r\n if (uniforms.indexOf(\"vClipPlane4\") === -1) {\r\n uniforms.push(\"vClipPlane4\");\r\n }\r\n if (uniforms.indexOf(\"vClipPlane5\") === -1) {\r\n uniforms.push(\"vClipPlane5\");\r\n }\r\n if (uniforms.indexOf(\"vClipPlane6\") === -1) {\r\n uniforms.push(\"vClipPlane6\");\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport function prepareStringDefinesForClipPlanes(primaryHolder: IClipPlanesHolder, secondaryHolder: IClipPlanesHolder, defines: string[]): void {\r\n const clipPlane = !!(primaryHolder.clipPlane ?? secondaryHolder.clipPlane);\r\n const clipPlane2 = !!(primaryHolder.clipPlane2 ?? secondaryHolder.clipPlane2);\r\n const clipPlane3 = !!(primaryHolder.clipPlane3 ?? secondaryHolder.clipPlane3);\r\n const clipPlane4 = !!(primaryHolder.clipPlane4 ?? secondaryHolder.clipPlane4);\r\n const clipPlane5 = !!(primaryHolder.clipPlane5 ?? secondaryHolder.clipPlane5);\r\n const clipPlane6 = !!(primaryHolder.clipPlane6 ?? secondaryHolder.clipPlane6);\r\n\r\n if (clipPlane) defines.push(\"#define CLIPPLANE\");\r\n if (clipPlane2) defines.push(\"#define CLIPPLANE2\");\r\n if (clipPlane3) defines.push(\"#define CLIPPLANE3\");\r\n if (clipPlane4) defines.push(\"#define CLIPPLANE4\");\r\n if (clipPlane5) defines.push(\"#define CLIPPLANE5\");\r\n if (clipPlane6) defines.push(\"#define CLIPPLANE6\");\r\n}\r\n\r\n/** @internal */\r\nexport function prepareDefinesForClipPlanes(primaryHolder: IClipPlanesHolder, secondaryHolder: IClipPlanesHolder, defines: Record): boolean {\r\n let changed = false;\r\n\r\n const clipPlane = !!(primaryHolder.clipPlane ?? secondaryHolder.clipPlane);\r\n const clipPlane2 = !!(primaryHolder.clipPlane2 ?? secondaryHolder.clipPlane2);\r\n const clipPlane3 = !!(primaryHolder.clipPlane3 ?? secondaryHolder.clipPlane3);\r\n const clipPlane4 = !!(primaryHolder.clipPlane4 ?? secondaryHolder.clipPlane4);\r\n const clipPlane5 = !!(primaryHolder.clipPlane5 ?? secondaryHolder.clipPlane5);\r\n const clipPlane6 = !!(primaryHolder.clipPlane6 ?? secondaryHolder.clipPlane6);\r\n\r\n // Do not factorize this code, it breaks browsers optimizations.\r\n if (defines[\"CLIPPLANE\"] !== clipPlane) {\r\n defines[\"CLIPPLANE\"] = clipPlane;\r\n changed = true;\r\n }\r\n if (defines[\"CLIPPLANE2\"] !== clipPlane2) {\r\n defines[\"CLIPPLANE2\"] = clipPlane2;\r\n changed = true;\r\n }\r\n if (defines[\"CLIPPLANE3\"] !== clipPlane3) {\r\n defines[\"CLIPPLANE3\"] = clipPlane3;\r\n changed = true;\r\n }\r\n if (defines[\"CLIPPLANE4\"] !== clipPlane4) {\r\n defines[\"CLIPPLANE4\"] = clipPlane4;\r\n changed = true;\r\n }\r\n if (defines[\"CLIPPLANE5\"] !== clipPlane5) {\r\n defines[\"CLIPPLANE5\"] = clipPlane5;\r\n changed = true;\r\n }\r\n if (defines[\"CLIPPLANE6\"] !== clipPlane6) {\r\n defines[\"CLIPPLANE6\"] = clipPlane6;\r\n changed = true;\r\n }\r\n\r\n return changed;\r\n}\r\n\r\n/** @internal */\r\nexport function bindClipPlane(effect: Effect, primaryHolder: IClipPlanesHolder, secondaryHolder: IClipPlanesHolder): void {\r\n let clipPlane = primaryHolder.clipPlane ?? secondaryHolder.clipPlane;\r\n setClipPlane(effect, \"vClipPlane\", clipPlane);\r\n clipPlane = primaryHolder.clipPlane2 ?? secondaryHolder.clipPlane2;\r\n setClipPlane(effect, \"vClipPlane2\", clipPlane);\r\n clipPlane = primaryHolder.clipPlane3 ?? secondaryHolder.clipPlane3;\r\n setClipPlane(effect, \"vClipPlane3\", clipPlane);\r\n clipPlane = primaryHolder.clipPlane4 ?? secondaryHolder.clipPlane4;\r\n setClipPlane(effect, \"vClipPlane4\", clipPlane);\r\n clipPlane = primaryHolder.clipPlane5 ?? secondaryHolder.clipPlane5;\r\n setClipPlane(effect, \"vClipPlane5\", clipPlane);\r\n clipPlane = primaryHolder.clipPlane6 ?? secondaryHolder.clipPlane6;\r\n setClipPlane(effect, \"vClipPlane6\", clipPlane);\r\n}\r\n\r\nfunction setClipPlane(effect: Effect, uniformName: string, clipPlane: Nullable): void {\r\n if (clipPlane) {\r\n effect.setFloat4(uniformName, clipPlane.normal.x, clipPlane.normal.y, clipPlane.normal.z, clipPlane.d);\r\n }\r\n}\r\n", "import { Logger } from \"../Misc/logger\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Effect, IEffectCreationOptions } from \"./effect\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { BaseTexture } from \"./Textures/baseTexture\";\r\nimport type { PrePassConfiguration } from \"./prePassConfiguration\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport type { MaterialDefines } from \"./materialDefines\";\r\nimport type { EffectFallbacks } from \"./effectFallbacks\";\r\nimport { LightConstants } from \"../Lights/lightConstants\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { Material } from \"./material\";\r\nimport type { Nullable } from \"../types\";\r\nimport { prepareDefinesForClipPlanes } from \"./clipPlaneMaterialHelper\";\r\n\r\n// Temps\r\nconst _TempFogColor = Color3.Black();\r\nconst _TmpMorphInfluencers = { NUM_MORPH_INFLUENCERS: 0 };\r\n\r\n/**\r\n * Binds the logarithmic depth information from the scene to the effect for the given defines.\r\n * @param defines The generated defines used in the effect\r\n * @param effect The effect we are binding the data to\r\n * @param scene The scene we are willing to render with logarithmic scale for\r\n */\r\nexport function BindLogDepth(defines: any, effect: Effect, scene: Scene): void {\r\n if (!defines || defines[\"LOGARITHMICDEPTH\"] || (defines.indexOf && defines.indexOf(\"LOGARITHMICDEPTH\") >= 0)) {\r\n const camera = scene.activeCamera as Camera;\r\n if (camera.mode === Constants.ORTHOGRAPHIC_CAMERA) {\r\n Logger.Error(\"Logarithmic depth is not compatible with orthographic cameras!\", 20);\r\n }\r\n effect.setFloat(\"logarithmicDepthConstant\", 2.0 / (Math.log(camera.maxZ + 1.0) / Math.LN2));\r\n }\r\n}\r\n\r\n/**\r\n * Binds the fog information from the scene to the effect for the given mesh.\r\n * @param scene The scene the lights belongs to\r\n * @param mesh The mesh we are binding the information to render\r\n * @param effect The effect we are binding the data to\r\n * @param linearSpace Defines if the fog effect is applied in linear space\r\n */\r\nexport function BindFogParameters(scene: Scene, mesh?: AbstractMesh, effect?: Effect, linearSpace = false): void {\r\n if (effect && scene.fogEnabled && (!mesh || mesh.applyFog) && scene.fogMode !== Constants.FOGMODE_NONE) {\r\n effect.setFloat4(\"vFogInfos\", scene.fogMode, scene.fogStart, scene.fogEnd, scene.fogDensity);\r\n // Convert fog color to linear space if used in a linear space computed shader.\r\n if (linearSpace) {\r\n scene.fogColor.toLinearSpaceToRef(_TempFogColor, scene.getEngine().useExactSrgbConversions);\r\n effect.setColor3(\"vFogColor\", _TempFogColor);\r\n } else {\r\n effect.setColor3(\"vFogColor\", scene.fogColor);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the list of attributes required for morph targets according to the effect defines.\r\n * @param attribs The current list of supported attribs\r\n * @param mesh The mesh to prepare the morph targets attributes for\r\n * @param influencers The number of influencers\r\n */\r\nexport function PrepareAttributesForMorphTargetsInfluencers(attribs: string[], mesh: AbstractMesh, influencers: number): void {\r\n _TmpMorphInfluencers.NUM_MORPH_INFLUENCERS = influencers;\r\n PrepareAttributesForMorphTargets(attribs, mesh, _TmpMorphInfluencers);\r\n}\r\n\r\n/**\r\n * Prepares the list of attributes required for morph targets according to the effect defines.\r\n * @param attribs The current list of supported attribs\r\n * @param mesh The mesh to prepare the morph targets attributes for\r\n * @param defines The current Defines of the effect\r\n */\r\nexport function PrepareAttributesForMorphTargets(attribs: string[], mesh: AbstractMesh, defines: any): void {\r\n const influencers = defines[\"NUM_MORPH_INFLUENCERS\"];\r\n\r\n if (influencers > 0 && EngineStore.LastCreatedEngine) {\r\n const maxAttributesCount = EngineStore.LastCreatedEngine.getCaps().maxVertexAttribs;\r\n const manager = (mesh as Mesh).morphTargetManager;\r\n if (manager?.isUsingTextureForTargets) {\r\n return;\r\n }\r\n const normal = manager && manager.supportsNormals && defines[\"NORMAL\"];\r\n const tangent = manager && manager.supportsTangents && defines[\"TANGENT\"];\r\n const uv = manager && manager.supportsUVs && defines[\"UV1\"];\r\n for (let index = 0; index < influencers; index++) {\r\n attribs.push(Constants.PositionKind + index);\r\n\r\n if (normal) {\r\n attribs.push(Constants.NormalKind + index);\r\n }\r\n\r\n if (tangent) {\r\n attribs.push(Constants.TangentKind + index);\r\n }\r\n\r\n if (uv) {\r\n attribs.push(Constants.UVKind + \"_\" + index);\r\n }\r\n\r\n if (attribs.length > maxAttributesCount) {\r\n Logger.Error(\"Cannot add more vertex attributes for mesh \" + mesh.name);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Add the list of attributes required for instances to the attribs array.\r\n * @param attribs The current list of supported attribs\r\n * @param needsPreviousMatrices If the shader needs previous matrices\r\n */\r\nexport function PushAttributesForInstances(attribs: string[], needsPreviousMatrices: boolean = false): void {\r\n attribs.push(\"world0\");\r\n attribs.push(\"world1\");\r\n attribs.push(\"world2\");\r\n attribs.push(\"world3\");\r\n if (needsPreviousMatrices) {\r\n attribs.push(\"previousWorld0\");\r\n attribs.push(\"previousWorld1\");\r\n attribs.push(\"previousWorld2\");\r\n attribs.push(\"previousWorld3\");\r\n }\r\n}\r\n\r\n/**\r\n * Binds the morph targets information from the mesh to the effect.\r\n * @param abstractMesh The mesh we are binding the information to render\r\n * @param effect The effect we are binding the data to\r\n */\r\nexport function BindMorphTargetParameters(abstractMesh: AbstractMesh, effect: Effect): void {\r\n const manager = (abstractMesh).morphTargetManager;\r\n if (!abstractMesh || !manager) {\r\n return;\r\n }\r\n\r\n effect.setFloatArray(\"morphTargetInfluences\", manager.influences);\r\n}\r\n\r\n/**\r\n * Binds the scene's uniform buffer to the effect.\r\n * @param effect defines the effect to bind to the scene uniform buffer\r\n * @param sceneUbo defines the uniform buffer storing scene data\r\n */\r\nexport function BindSceneUniformBuffer(effect: Effect, sceneUbo: UniformBuffer): void {\r\n sceneUbo.bindToEffect(effect, \"Scene\");\r\n}\r\n\r\n/**\r\n * Helps preparing the defines values about the UVs in used in the effect.\r\n * UVs are shared as much as we can across channels in the shaders.\r\n * @param texture The texture we are preparing the UVs for\r\n * @param defines The defines to update\r\n * @param key The channel key \"diffuse\", \"specular\"... used in the shader\r\n */\r\nexport function PrepareDefinesForMergedUV(texture: BaseTexture, defines: any, key: string): void {\r\n defines._needUVs = true;\r\n defines[key] = true;\r\n if (texture.optimizeUVAllocation && texture.getTextureMatrix().isIdentityAs3x2()) {\r\n defines[key + \"DIRECTUV\"] = texture.coordinatesIndex + 1;\r\n defines[\"MAINUV\" + (texture.coordinatesIndex + 1)] = true;\r\n } else {\r\n defines[key + \"DIRECTUV\"] = 0;\r\n }\r\n}\r\n\r\n/**\r\n * Binds a texture matrix value to its corresponding uniform\r\n * @param texture The texture to bind the matrix for\r\n * @param uniformBuffer The uniform buffer receiving the data\r\n * @param key The channel key \"diffuse\", \"specular\"... used in the shader\r\n */\r\nexport function BindTextureMatrix(texture: BaseTexture, uniformBuffer: UniformBuffer, key: string): void {\r\n const matrix = texture.getTextureMatrix();\r\n\r\n uniformBuffer.updateMatrix(key + \"Matrix\", matrix);\r\n}\r\n\r\n/**\r\n * Prepares the list of attributes required for baked vertex animations according to the effect defines.\r\n * @param attribs The current list of supported attribs\r\n * @param mesh The mesh to prepare for baked vertex animations\r\n * @param defines The current Defines of the effect\r\n */\r\nexport function PrepareAttributesForBakedVertexAnimation(attribs: string[], mesh: AbstractMesh, defines: any): void {\r\n const enabled = defines[\"BAKED_VERTEX_ANIMATION_TEXTURE\"] && defines[\"INSTANCES\"];\r\n\r\n if (enabled) {\r\n attribs.push(\"bakedVertexAnimationSettingsInstanced\");\r\n }\r\n}\r\n\r\n// Copies the bones transformation matrices into the target array and returns the target's reference\r\nfunction _CopyBonesTransformationMatrices(source: Float32Array, target: Float32Array): Float32Array {\r\n target.set(source);\r\n\r\n return target;\r\n}\r\n\r\n/**\r\n * Binds the bones information from the mesh to the effect.\r\n * @param mesh The mesh we are binding the information to render\r\n * @param effect The effect we are binding the data to\r\n * @param prePassConfiguration Configuration for the prepass, in case prepass is activated\r\n */\r\nexport function BindBonesParameters(mesh?: AbstractMesh, effect?: Effect, prePassConfiguration?: PrePassConfiguration): void {\r\n if (!effect || !mesh) {\r\n return;\r\n }\r\n if (mesh.computeBonesUsingShaders && effect._bonesComputationForcedToCPU) {\r\n mesh.computeBonesUsingShaders = false;\r\n }\r\n\r\n if (mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n const skeleton = mesh.skeleton;\r\n\r\n if (skeleton.isUsingTextureForMatrices && effect.getUniformIndex(\"boneTextureWidth\") > -1) {\r\n const boneTexture = skeleton.getTransformMatrixTexture(mesh);\r\n effect.setTexture(\"boneSampler\", boneTexture);\r\n effect.setFloat(\"boneTextureWidth\", 4.0 * (skeleton.bones.length + 1));\r\n } else {\r\n const matrices = skeleton.getTransformMatrices(mesh);\r\n\r\n if (matrices) {\r\n effect.setMatrices(\"mBones\", matrices);\r\n if (prePassConfiguration && mesh.getScene().prePassRenderer && mesh.getScene().prePassRenderer!.getIndex(Constants.PREPASS_VELOCITY_TEXTURE_TYPE)) {\r\n if (!prePassConfiguration.previousBones[mesh.uniqueId]) {\r\n prePassConfiguration.previousBones[mesh.uniqueId] = matrices.slice();\r\n }\r\n effect.setMatrices(\"mPreviousBones\", prePassConfiguration.previousBones[mesh.uniqueId]);\r\n _CopyBonesTransformationMatrices(matrices, prePassConfiguration.previousBones[mesh.uniqueId]);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Binds the light information to the effect.\r\n * @param light The light containing the generator\r\n * @param effect The effect we are binding the data to\r\n * @param lightIndex The light index in the effect used to render\r\n */\r\nexport function BindLightProperties(light: Light, effect: Effect, lightIndex: number): void {\r\n light.transferToEffect(effect, lightIndex + \"\");\r\n}\r\n\r\n/**\r\n * Binds the lights information from the scene to the effect for the given mesh.\r\n * @param light Light to bind\r\n * @param lightIndex Light index\r\n * @param scene The scene where the light belongs to\r\n * @param effect The effect we are binding the data to\r\n * @param useSpecular Defines if specular is supported\r\n * @param receiveShadows Defines if the effect (mesh) we bind the light for receives shadows\r\n */\r\nexport function BindLight(light: Light, lightIndex: number, scene: Scene, effect: Effect, useSpecular: boolean, receiveShadows = true): void {\r\n light._bindLight(lightIndex, scene, effect, useSpecular, receiveShadows);\r\n}\r\n\r\n/**\r\n * Binds the lights information from the scene to the effect for the given mesh.\r\n * @param scene The scene the lights belongs to\r\n * @param mesh The mesh we are binding the information to render\r\n * @param effect The effect we are binding the data to\r\n * @param defines The generated defines for the effect\r\n * @param maxSimultaneousLights The maximum number of light that can be bound to the effect\r\n */\r\nexport function BindLights(scene: Scene, mesh: AbstractMesh, effect: Effect, defines: any, maxSimultaneousLights = 4): void {\r\n const len = Math.min(mesh.lightSources.length, maxSimultaneousLights);\r\n\r\n for (let i = 0; i < len; i++) {\r\n const light = mesh.lightSources[i];\r\n BindLight(light, i, scene, effect, typeof defines === \"boolean\" ? defines : defines[\"SPECULARTERM\"], mesh.receiveShadows);\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the list of attributes required for bones according to the effect defines.\r\n * @param attribs The current list of supported attribs\r\n * @param mesh The mesh to prepare the bones attributes for\r\n * @param defines The current Defines of the effect\r\n * @param fallbacks The current effect fallback strategy\r\n */\r\nexport function PrepareAttributesForBones(attribs: string[], mesh: AbstractMesh, defines: any, fallbacks: EffectFallbacks): void {\r\n if (defines[\"NUM_BONE_INFLUENCERS\"] > 0) {\r\n fallbacks.addCPUSkinningFallback(0, mesh);\r\n\r\n attribs.push(Constants.MatricesIndicesKind);\r\n attribs.push(Constants.MatricesWeightsKind);\r\n if (defines[\"NUM_BONE_INFLUENCERS\"] > 4) {\r\n attribs.push(Constants.MatricesIndicesExtraKind);\r\n attribs.push(Constants.MatricesWeightsExtraKind);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Check and prepare the list of attributes required for instances according to the effect defines.\r\n * @param attribs The current list of supported attribs\r\n * @param defines The current MaterialDefines of the effect\r\n */\r\nexport function PrepareAttributesForInstances(attribs: string[], defines: MaterialDefines): void {\r\n if (defines[\"INSTANCES\"] || defines[\"THIN_INSTANCES\"]) {\r\n PushAttributesForInstances(attribs, !!defines[\"PREPASS_VELOCITY\"]);\r\n }\r\n\r\n if (defines.INSTANCESCOLOR) {\r\n attribs.push(Constants.ColorInstanceKind);\r\n }\r\n}\r\n\r\n/**\r\n * This helps decreasing rank by rank the shadow quality (0 being the highest rank and quality)\r\n * @param defines The defines to update while falling back\r\n * @param fallbacks The authorized effect fallbacks\r\n * @param maxSimultaneousLights The maximum number of lights allowed\r\n * @param rank the current rank of the Effect\r\n * @returns The newly affected rank\r\n */\r\nexport function HandleFallbacksForShadows(defines: any, fallbacks: EffectFallbacks, maxSimultaneousLights = 4, rank = 0): number {\r\n let lightFallbackRank = 0;\r\n for (let lightIndex = 0; lightIndex < maxSimultaneousLights; lightIndex++) {\r\n if (!defines[\"LIGHT\" + lightIndex]) {\r\n break;\r\n }\r\n\r\n if (lightIndex > 0) {\r\n lightFallbackRank = rank + lightIndex;\r\n fallbacks.addFallback(lightFallbackRank, \"LIGHT\" + lightIndex);\r\n }\r\n\r\n if (!defines[\"SHADOWS\"]) {\r\n if (defines[\"SHADOW\" + lightIndex]) {\r\n fallbacks.addFallback(rank, \"SHADOW\" + lightIndex);\r\n }\r\n\r\n if (defines[\"SHADOWPCF\" + lightIndex]) {\r\n fallbacks.addFallback(rank, \"SHADOWPCF\" + lightIndex);\r\n }\r\n\r\n if (defines[\"SHADOWPCSS\" + lightIndex]) {\r\n fallbacks.addFallback(rank, \"SHADOWPCSS\" + lightIndex);\r\n }\r\n\r\n if (defines[\"SHADOWPOISSON\" + lightIndex]) {\r\n fallbacks.addFallback(rank, \"SHADOWPOISSON\" + lightIndex);\r\n }\r\n\r\n if (defines[\"SHADOWESM\" + lightIndex]) {\r\n fallbacks.addFallback(rank, \"SHADOWESM\" + lightIndex);\r\n }\r\n\r\n if (defines[\"SHADOWCLOSEESM\" + lightIndex]) {\r\n fallbacks.addFallback(rank, \"SHADOWCLOSEESM\" + lightIndex);\r\n }\r\n }\r\n }\r\n return lightFallbackRank++;\r\n}\r\n\r\n/**\r\n * Gets the current status of the fog (should it be enabled?)\r\n * @param mesh defines the mesh to evaluate for fog support\r\n * @param scene defines the hosting scene\r\n * @returns true if fog must be enabled\r\n */\r\nexport function GetFogState(mesh: AbstractMesh, scene: Scene) {\r\n return scene.fogEnabled && mesh.applyFog && scene.fogMode !== Constants.FOGMODE_NONE;\r\n}\r\n\r\n/**\r\n * Helper used to prepare the list of defines associated with misc. values for shader compilation\r\n * @param mesh defines the current mesh\r\n * @param scene defines the current scene\r\n * @param useLogarithmicDepth defines if logarithmic depth has to be turned on\r\n * @param pointsCloud defines if point cloud rendering has to be turned on\r\n * @param fogEnabled defines if fog has to be turned on\r\n * @param alphaTest defines if alpha testing has to be turned on\r\n * @param defines defines the current list of defines\r\n * @param applyDecalAfterDetail Defines if the decal is applied after or before the detail\r\n */\r\nexport function PrepareDefinesForMisc(\r\n mesh: AbstractMesh,\r\n scene: Scene,\r\n useLogarithmicDepth: boolean,\r\n pointsCloud: boolean,\r\n fogEnabled: boolean,\r\n alphaTest: boolean,\r\n defines: any,\r\n applyDecalAfterDetail: boolean = false\r\n): void {\r\n if (defines._areMiscDirty) {\r\n defines[\"LOGARITHMICDEPTH\"] = useLogarithmicDepth;\r\n defines[\"POINTSIZE\"] = pointsCloud;\r\n defines[\"FOG\"] = fogEnabled && GetFogState(mesh, scene);\r\n defines[\"NONUNIFORMSCALING\"] = mesh.nonUniformScaling;\r\n defines[\"ALPHATEST\"] = alphaTest;\r\n defines[\"DECAL_AFTER_DETAIL\"] = applyDecalAfterDetail;\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the defines related to the light information passed in parameter\r\n * @param scene The scene we are intending to draw\r\n * @param mesh The mesh the effect is compiling for\r\n * @param defines The defines to update\r\n * @param specularSupported Specifies whether specular is supported or not (override lights data)\r\n * @param maxSimultaneousLights Specifies how manuy lights can be added to the effect at max\r\n * @param disableLighting Specifies whether the lighting is disabled (override scene and light)\r\n * @returns true if normals will be required for the rest of the effect\r\n */\r\nexport function PrepareDefinesForLights(scene: Scene, mesh: AbstractMesh, defines: any, specularSupported: boolean, maxSimultaneousLights = 4, disableLighting = false): boolean {\r\n if (!defines._areLightsDirty) {\r\n return defines._needNormals;\r\n }\r\n\r\n let lightIndex = 0;\r\n const state = {\r\n needNormals: defines._needNormals, // prevents overriding previous reflection or other needs for normals\r\n needRebuild: false,\r\n lightmapMode: false,\r\n shadowEnabled: false,\r\n specularEnabled: false,\r\n };\r\n\r\n if (scene.lightsEnabled && !disableLighting) {\r\n for (const light of mesh.lightSources) {\r\n PrepareDefinesForLight(scene, mesh, light, lightIndex, defines, specularSupported, state);\r\n\r\n lightIndex++;\r\n if (lightIndex === maxSimultaneousLights) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n defines[\"SPECULARTERM\"] = state.specularEnabled;\r\n defines[\"SHADOWS\"] = state.shadowEnabled;\r\n\r\n // Resetting all other lights if any\r\n for (let index = lightIndex; index < maxSimultaneousLights; index++) {\r\n if (defines[\"LIGHT\" + index] !== undefined) {\r\n defines[\"LIGHT\" + index] = false;\r\n defines[\"HEMILIGHT\" + index] = false;\r\n defines[\"POINTLIGHT\" + index] = false;\r\n defines[\"DIRLIGHT\" + index] = false;\r\n defines[\"SPOTLIGHT\" + index] = false;\r\n defines[\"SHADOW\" + index] = false;\r\n defines[\"SHADOWCSM\" + index] = false;\r\n defines[\"SHADOWCSMDEBUG\" + index] = false;\r\n defines[\"SHADOWCSMNUM_CASCADES\" + index] = false;\r\n defines[\"SHADOWCSMUSESHADOWMAXZ\" + index] = false;\r\n defines[\"SHADOWCSMNOBLEND\" + index] = false;\r\n defines[\"SHADOWCSM_RIGHTHANDED\" + index] = false;\r\n defines[\"SHADOWPCF\" + index] = false;\r\n defines[\"SHADOWPCSS\" + index] = false;\r\n defines[\"SHADOWPOISSON\" + index] = false;\r\n defines[\"SHADOWESM\" + index] = false;\r\n defines[\"SHADOWCLOSEESM\" + index] = false;\r\n defines[\"SHADOWCUBE\" + index] = false;\r\n defines[\"SHADOWLOWQUALITY\" + index] = false;\r\n defines[\"SHADOWMEDIUMQUALITY\" + index] = false;\r\n }\r\n }\r\n\r\n const caps = scene.getEngine().getCaps();\r\n\r\n if (defines[\"SHADOWFLOAT\"] === undefined) {\r\n state.needRebuild = true;\r\n }\r\n\r\n defines[\"SHADOWFLOAT\"] =\r\n state.shadowEnabled && ((caps.textureFloatRender && caps.textureFloatLinearFiltering) || (caps.textureHalfFloatRender && caps.textureHalfFloatLinearFiltering));\r\n defines[\"LIGHTMAPEXCLUDED\"] = state.lightmapMode;\r\n\r\n if (state.needRebuild) {\r\n defines.rebuild();\r\n }\r\n\r\n return state.needNormals;\r\n}\r\n\r\n/**\r\n * Prepares the defines related to the light information passed in parameter\r\n * @param scene The scene we are intending to draw\r\n * @param mesh The mesh the effect is compiling for\r\n * @param light The light the effect is compiling for\r\n * @param lightIndex The index of the light\r\n * @param defines The defines to update\r\n * @param specularSupported Specifies whether specular is supported or not (override lights data)\r\n * @param state Defines the current state regarding what is needed (normals, etc...)\r\n * @param state.needNormals\r\n * @param state.needRebuild\r\n * @param state.shadowEnabled\r\n * @param state.specularEnabled\r\n * @param state.lightmapMode\r\n */\r\nexport function PrepareDefinesForLight(\r\n scene: Scene,\r\n mesh: AbstractMesh,\r\n light: Light,\r\n lightIndex: number,\r\n defines: any,\r\n specularSupported: boolean,\r\n state: {\r\n needNormals: boolean;\r\n needRebuild: boolean;\r\n shadowEnabled: boolean;\r\n specularEnabled: boolean;\r\n lightmapMode: boolean;\r\n }\r\n) {\r\n state.needNormals = true;\r\n\r\n if (defines[\"LIGHT\" + lightIndex] === undefined) {\r\n state.needRebuild = true;\r\n }\r\n\r\n defines[\"LIGHT\" + lightIndex] = true;\r\n\r\n defines[\"SPOTLIGHT\" + lightIndex] = false;\r\n defines[\"HEMILIGHT\" + lightIndex] = false;\r\n defines[\"POINTLIGHT\" + lightIndex] = false;\r\n defines[\"DIRLIGHT\" + lightIndex] = false;\r\n\r\n light.prepareLightSpecificDefines(defines, lightIndex);\r\n\r\n // FallOff.\r\n defines[\"LIGHT_FALLOFF_PHYSICAL\" + lightIndex] = false;\r\n defines[\"LIGHT_FALLOFF_GLTF\" + lightIndex] = false;\r\n defines[\"LIGHT_FALLOFF_STANDARD\" + lightIndex] = false;\r\n\r\n switch (light.falloffType) {\r\n case LightConstants.FALLOFF_GLTF:\r\n defines[\"LIGHT_FALLOFF_GLTF\" + lightIndex] = true;\r\n break;\r\n case LightConstants.FALLOFF_PHYSICAL:\r\n defines[\"LIGHT_FALLOFF_PHYSICAL\" + lightIndex] = true;\r\n break;\r\n case LightConstants.FALLOFF_STANDARD:\r\n defines[\"LIGHT_FALLOFF_STANDARD\" + lightIndex] = true;\r\n break;\r\n }\r\n\r\n // Specular\r\n if (specularSupported && !light.specular.equalsFloats(0, 0, 0)) {\r\n state.specularEnabled = true;\r\n }\r\n\r\n // Shadows\r\n defines[\"SHADOW\" + lightIndex] = false;\r\n defines[\"SHADOWCSM\" + lightIndex] = false;\r\n defines[\"SHADOWCSMDEBUG\" + lightIndex] = false;\r\n defines[\"SHADOWCSMNUM_CASCADES\" + lightIndex] = false;\r\n defines[\"SHADOWCSMUSESHADOWMAXZ\" + lightIndex] = false;\r\n defines[\"SHADOWCSMNOBLEND\" + lightIndex] = false;\r\n defines[\"SHADOWCSM_RIGHTHANDED\" + lightIndex] = false;\r\n defines[\"SHADOWPCF\" + lightIndex] = false;\r\n defines[\"SHADOWPCSS\" + lightIndex] = false;\r\n defines[\"SHADOWPOISSON\" + lightIndex] = false;\r\n defines[\"SHADOWESM\" + lightIndex] = false;\r\n defines[\"SHADOWCLOSEESM\" + lightIndex] = false;\r\n defines[\"SHADOWCUBE\" + lightIndex] = false;\r\n defines[\"SHADOWLOWQUALITY\" + lightIndex] = false;\r\n defines[\"SHADOWMEDIUMQUALITY\" + lightIndex] = false;\r\n\r\n if (mesh && mesh.receiveShadows && scene.shadowsEnabled && light.shadowEnabled) {\r\n const shadowGenerator = light.getShadowGenerator(scene.activeCamera) ?? light.getShadowGenerator();\r\n if (shadowGenerator) {\r\n const shadowMap = shadowGenerator.getShadowMap();\r\n if (shadowMap) {\r\n if (shadowMap.renderList && shadowMap.renderList.length > 0) {\r\n state.shadowEnabled = true;\r\n shadowGenerator.prepareDefines(defines, lightIndex);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (light.lightmapMode != LightConstants.LIGHTMAP_DEFAULT) {\r\n state.lightmapMode = true;\r\n defines[\"LIGHTMAPEXCLUDED\" + lightIndex] = true;\r\n defines[\"LIGHTMAPNOSPECULAR\" + lightIndex] = light.lightmapMode == LightConstants.LIGHTMAP_SHADOWSONLY;\r\n } else {\r\n defines[\"LIGHTMAPEXCLUDED\" + lightIndex] = false;\r\n defines[\"LIGHTMAPNOSPECULAR\" + lightIndex] = false;\r\n }\r\n}\r\n\r\n/**\r\n * Helper used to prepare the list of defines associated with frame values for shader compilation\r\n * @param scene defines the current scene\r\n * @param engine defines the current engine\r\n * @param material defines the material we are compiling the shader for\r\n * @param defines specifies the list of active defines\r\n * @param useInstances defines if instances have to be turned on\r\n * @param useClipPlane defines if clip plane have to be turned on\r\n * @param useThinInstances defines if thin instances have to be turned on\r\n */\r\nexport function PrepareDefinesForFrameBoundValues(\r\n scene: Scene,\r\n engine: Engine,\r\n material: Material,\r\n defines: any,\r\n useInstances: boolean,\r\n useClipPlane: Nullable = null,\r\n useThinInstances: boolean = false\r\n): void {\r\n let changed = PrepareDefinesForCamera(scene, defines);\r\n\r\n if (useClipPlane !== false) {\r\n changed = prepareDefinesForClipPlanes(material, scene, defines);\r\n }\r\n\r\n if (defines[\"DEPTHPREPASS\"] !== !engine.getColorWrite()) {\r\n defines[\"DEPTHPREPASS\"] = !defines[\"DEPTHPREPASS\"];\r\n changed = true;\r\n }\r\n\r\n if (defines[\"INSTANCES\"] !== useInstances) {\r\n defines[\"INSTANCES\"] = useInstances;\r\n changed = true;\r\n }\r\n\r\n if (defines[\"THIN_INSTANCES\"] !== useThinInstances) {\r\n defines[\"THIN_INSTANCES\"] = useThinInstances;\r\n changed = true;\r\n }\r\n\r\n if (changed) {\r\n defines.markAsUnprocessed();\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the defines for bones\r\n * @param mesh The mesh containing the geometry data we will draw\r\n * @param defines The defines to update\r\n */\r\nexport function PrepareDefinesForBones(mesh: AbstractMesh, defines: any) {\r\n if (mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n defines[\"NUM_BONE_INFLUENCERS\"] = mesh.numBoneInfluencers;\r\n\r\n const materialSupportsBoneTexture = defines[\"BONETEXTURE\"] !== undefined;\r\n\r\n if (mesh.skeleton.isUsingTextureForMatrices && materialSupportsBoneTexture) {\r\n defines[\"BONETEXTURE\"] = true;\r\n } else {\r\n defines[\"BonesPerMesh\"] = mesh.skeleton.bones.length + 1;\r\n defines[\"BONETEXTURE\"] = materialSupportsBoneTexture ? false : undefined;\r\n\r\n const prePassRenderer = mesh.getScene().prePassRenderer;\r\n if (prePassRenderer && prePassRenderer.enabled) {\r\n const nonExcluded = prePassRenderer.excludedSkinnedMesh.indexOf(mesh) === -1;\r\n defines[\"BONES_VELOCITY_ENABLED\"] = nonExcluded;\r\n }\r\n }\r\n } else {\r\n defines[\"NUM_BONE_INFLUENCERS\"] = 0;\r\n defines[\"BonesPerMesh\"] = 0;\r\n if (defines[\"BONETEXTURE\"] !== undefined) {\r\n defines[\"BONETEXTURE\"] = false;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the defines for morph targets\r\n * @param mesh The mesh containing the geometry data we will draw\r\n * @param defines The defines to update\r\n */\r\nexport function PrepareDefinesForMorphTargets(mesh: AbstractMesh, defines: any) {\r\n const manager = (mesh).morphTargetManager;\r\n if (manager) {\r\n defines[\"MORPHTARGETS_UV\"] = manager.supportsUVs && defines[\"UV1\"];\r\n defines[\"MORPHTARGETS_TANGENT\"] = manager.supportsTangents && defines[\"TANGENT\"];\r\n defines[\"MORPHTARGETS_NORMAL\"] = manager.supportsNormals && defines[\"NORMAL\"];\r\n defines[\"NUM_MORPH_INFLUENCERS\"] = manager.numMaxInfluencers || manager.numInfluencers;\r\n defines[\"MORPHTARGETS\"] = defines[\"NUM_MORPH_INFLUENCERS\"] > 0;\r\n\r\n defines[\"MORPHTARGETS_TEXTURE\"] = manager.isUsingTextureForTargets;\r\n } else {\r\n defines[\"MORPHTARGETS_UV\"] = false;\r\n defines[\"MORPHTARGETS_TANGENT\"] = false;\r\n defines[\"MORPHTARGETS_NORMAL\"] = false;\r\n defines[\"MORPHTARGETS\"] = false;\r\n defines[\"NUM_MORPH_INFLUENCERS\"] = 0;\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the defines for baked vertex animation\r\n * @param mesh The mesh containing the geometry data we will draw\r\n * @param defines The defines to update\r\n */\r\nexport function PrepareDefinesForBakedVertexAnimation(mesh: AbstractMesh, defines: any) {\r\n const manager = (mesh).bakedVertexAnimationManager;\r\n defines[\"BAKED_VERTEX_ANIMATION_TEXTURE\"] = manager && manager.isEnabled ? true : false;\r\n}\r\n\r\n/**\r\n * Prepares the defines used in the shader depending on the attributes data available in the mesh\r\n * @param mesh The mesh containing the geometry data we will draw\r\n * @param defines The defines to update\r\n * @param useVertexColor Precise whether vertex colors should be used or not (override mesh info)\r\n * @param useBones Precise whether bones should be used or not (override mesh info)\r\n * @param useMorphTargets Precise whether morph targets should be used or not (override mesh info)\r\n * @param useVertexAlpha Precise whether vertex alpha should be used or not (override mesh info)\r\n * @param useBakedVertexAnimation Precise whether baked vertex animation should be used or not (override mesh info)\r\n * @returns false if defines are considered not dirty and have not been checked\r\n */\r\nexport function PrepareDefinesForAttributes(\r\n mesh: AbstractMesh,\r\n defines: any,\r\n useVertexColor: boolean,\r\n useBones: boolean,\r\n useMorphTargets = false,\r\n useVertexAlpha = true,\r\n useBakedVertexAnimation = true\r\n): boolean {\r\n if (!defines._areAttributesDirty && defines._needNormals === defines._normals && defines._needUVs === defines._uvs) {\r\n return false;\r\n }\r\n\r\n defines._normals = defines._needNormals;\r\n defines._uvs = defines._needUVs;\r\n\r\n defines[\"NORMAL\"] = defines._needNormals && mesh.isVerticesDataPresent(Constants.NormalKind);\r\n\r\n if (defines._needNormals && mesh.isVerticesDataPresent(Constants.TangentKind)) {\r\n defines[\"TANGENT\"] = true;\r\n }\r\n\r\n for (let i = 1; i <= Constants.MAX_SUPPORTED_UV_SETS; ++i) {\r\n defines[\"UV\" + i] = defines._needUVs ? mesh.isVerticesDataPresent(`uv${i === 1 ? \"\" : i}`) : false;\r\n }\r\n\r\n if (useVertexColor) {\r\n const hasVertexColors = mesh.useVertexColors && mesh.isVerticesDataPresent(Constants.ColorKind);\r\n defines[\"VERTEXCOLOR\"] = hasVertexColors;\r\n defines[\"VERTEXALPHA\"] = mesh.hasVertexAlpha && hasVertexColors && useVertexAlpha;\r\n }\r\n\r\n if (mesh.isVerticesDataPresent(Constants.ColorInstanceKind) && (mesh.hasInstances || mesh.hasThinInstances)) {\r\n defines[\"INSTANCESCOLOR\"] = true;\r\n }\r\n\r\n if (useBones) {\r\n PrepareDefinesForBones(mesh, defines);\r\n }\r\n\r\n if (useMorphTargets) {\r\n PrepareDefinesForMorphTargets(mesh, defines);\r\n }\r\n\r\n if (useBakedVertexAnimation) {\r\n PrepareDefinesForBakedVertexAnimation(mesh, defines);\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Prepares the defines related to multiview\r\n * @param scene The scene we are intending to draw\r\n * @param defines The defines to update\r\n */\r\nexport function PrepareDefinesForMultiview(scene: Scene, defines: any) {\r\n if (scene.activeCamera) {\r\n const previousMultiview = defines.MULTIVIEW;\r\n defines.MULTIVIEW = scene.activeCamera.outputRenderTarget !== null && scene.activeCamera.outputRenderTarget.getViewCount() > 1;\r\n if (defines.MULTIVIEW != previousMultiview) {\r\n defines.markAsUnprocessed();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the defines related to order independant transparency\r\n * @param scene The scene we are intending to draw\r\n * @param defines The defines to update\r\n * @param needAlphaBlending Determines if the material needs alpha blending\r\n */\r\nexport function PrepareDefinesForOIT(scene: Scene, defines: any, needAlphaBlending: boolean) {\r\n const previousDefine = defines.ORDER_INDEPENDENT_TRANSPARENCY;\r\n const previousDefine16Bits = defines.ORDER_INDEPENDENT_TRANSPARENCY_16BITS;\r\n\r\n defines.ORDER_INDEPENDENT_TRANSPARENCY = scene.useOrderIndependentTransparency && needAlphaBlending;\r\n defines.ORDER_INDEPENDENT_TRANSPARENCY_16BITS = !scene.getEngine().getCaps().textureFloatLinearFiltering;\r\n\r\n if (previousDefine !== defines.ORDER_INDEPENDENT_TRANSPARENCY || previousDefine16Bits !== defines.ORDER_INDEPENDENT_TRANSPARENCY_16BITS) {\r\n defines.markAsUnprocessed();\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the defines related to the prepass\r\n * @param scene The scene we are intending to draw\r\n * @param defines The defines to update\r\n * @param canRenderToMRT Indicates if this material renders to several textures in the prepass\r\n */\r\nexport function PrepareDefinesForPrePass(scene: Scene, defines: any, canRenderToMRT: boolean) {\r\n const previousPrePass = defines.PREPASS;\r\n\r\n if (!defines._arePrePassDirty) {\r\n return;\r\n }\r\n\r\n const texturesList = [\r\n {\r\n type: Constants.PREPASS_POSITION_TEXTURE_TYPE,\r\n define: \"PREPASS_POSITION\",\r\n index: \"PREPASS_POSITION_INDEX\",\r\n },\r\n {\r\n type: Constants.PREPASS_VELOCITY_TEXTURE_TYPE,\r\n define: \"PREPASS_VELOCITY\",\r\n index: \"PREPASS_VELOCITY_INDEX\",\r\n },\r\n {\r\n type: Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE,\r\n define: \"PREPASS_REFLECTIVITY\",\r\n index: \"PREPASS_REFLECTIVITY_INDEX\",\r\n },\r\n {\r\n type: Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE,\r\n define: \"PREPASS_IRRADIANCE\",\r\n index: \"PREPASS_IRRADIANCE_INDEX\",\r\n },\r\n {\r\n type: Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE,\r\n define: \"PREPASS_ALBEDO_SQRT\",\r\n index: \"PREPASS_ALBEDO_SQRT_INDEX\",\r\n },\r\n {\r\n type: Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n define: \"PREPASS_DEPTH\",\r\n index: \"PREPASS_DEPTH_INDEX\",\r\n },\r\n {\r\n type: Constants.PREPASS_NORMAL_TEXTURE_TYPE,\r\n define: \"PREPASS_NORMAL\",\r\n index: \"PREPASS_NORMAL_INDEX\",\r\n },\r\n ];\r\n\r\n if (scene.prePassRenderer && scene.prePassRenderer.enabled && canRenderToMRT) {\r\n defines.PREPASS = true;\r\n defines.SCENE_MRT_COUNT = scene.prePassRenderer.mrtCount;\r\n defines.PREPASS_NORMAL_WORLDSPACE = scene.prePassRenderer.generateNormalsInWorldSpace;\r\n\r\n for (let i = 0; i < texturesList.length; i++) {\r\n const index = scene.prePassRenderer.getIndex(texturesList[i].type);\r\n if (index !== -1) {\r\n defines[texturesList[i].define] = true;\r\n defines[texturesList[i].index] = index;\r\n } else {\r\n defines[texturesList[i].define] = false;\r\n }\r\n }\r\n } else {\r\n defines.PREPASS = false;\r\n for (let i = 0; i < texturesList.length; i++) {\r\n defines[texturesList[i].define] = false;\r\n }\r\n }\r\n\r\n if (defines.PREPASS != previousPrePass) {\r\n defines.markAsUnprocessed();\r\n defines.markAsImageProcessingDirty();\r\n }\r\n}\r\n\r\n/**\r\n * Helper used to prepare the defines relative to the active camera\r\n * @param scene defines the current scene\r\n * @param defines specifies the list of active defines\r\n * @returns true if the defines have been updated, else false\r\n */\r\nexport function PrepareDefinesForCamera(scene: Scene, defines: any): boolean {\r\n let changed = false;\r\n\r\n if (scene.activeCamera) {\r\n const wasOrtho = defines[\"CAMERA_ORTHOGRAPHIC\"] ? 1 : 0;\r\n const wasPersp = defines[\"CAMERA_PERSPECTIVE\"] ? 1 : 0;\r\n const isOrtho = scene.activeCamera.mode === Constants.ORTHOGRAPHIC_CAMERA ? 1 : 0;\r\n const isPersp = scene.activeCamera.mode === Constants.PERSPECTIVE_CAMERA ? 1 : 0;\r\n\r\n if (wasOrtho ^ isOrtho || wasPersp ^ isPersp) {\r\n defines[\"CAMERA_ORTHOGRAPHIC\"] = isOrtho === 1;\r\n defines[\"CAMERA_PERSPECTIVE\"] = isPersp === 1;\r\n changed = true;\r\n }\r\n }\r\n\r\n return changed;\r\n}\r\n\r\n/**\r\n * Prepares the uniforms and samplers list to be used in the effect (for a specific light)\r\n * @param lightIndex defines the light index\r\n * @param uniformsList The uniform list\r\n * @param samplersList The sampler list\r\n * @param projectedLightTexture defines if projected texture must be used\r\n * @param uniformBuffersList defines an optional list of uniform buffers\r\n * @param updateOnlyBuffersList True to only update the uniformBuffersList array\r\n */\r\nexport function PrepareUniformsAndSamplersForLight(\r\n lightIndex: number,\r\n uniformsList: string[],\r\n samplersList: string[],\r\n projectedLightTexture?: any,\r\n uniformBuffersList: Nullable = null,\r\n updateOnlyBuffersList = false\r\n) {\r\n if (uniformBuffersList) {\r\n uniformBuffersList.push(\"Light\" + lightIndex);\r\n }\r\n\r\n if (updateOnlyBuffersList) {\r\n return;\r\n }\r\n\r\n uniformsList.push(\r\n \"vLightData\" + lightIndex,\r\n \"vLightDiffuse\" + lightIndex,\r\n \"vLightSpecular\" + lightIndex,\r\n \"vLightDirection\" + lightIndex,\r\n \"vLightFalloff\" + lightIndex,\r\n \"vLightGround\" + lightIndex,\r\n \"lightMatrix\" + lightIndex,\r\n \"shadowsInfo\" + lightIndex,\r\n \"depthValues\" + lightIndex\r\n );\r\n\r\n samplersList.push(\"shadowSampler\" + lightIndex);\r\n samplersList.push(\"depthSampler\" + lightIndex);\r\n\r\n uniformsList.push(\r\n \"viewFrustumZ\" + lightIndex,\r\n \"cascadeBlendFactor\" + lightIndex,\r\n \"lightSizeUVCorrection\" + lightIndex,\r\n \"depthCorrection\" + lightIndex,\r\n \"penumbraDarkness\" + lightIndex,\r\n \"frustumLengths\" + lightIndex\r\n );\r\n\r\n if (projectedLightTexture) {\r\n samplersList.push(\"projectionLightSampler\" + lightIndex);\r\n uniformsList.push(\"textureProjectionMatrix\" + lightIndex);\r\n }\r\n}\r\n\r\n/**\r\n * Prepares the uniforms and samplers list to be used in the effect\r\n * @param uniformsListOrOptions The uniform names to prepare or an EffectCreationOptions containing the list and extra information\r\n * @param samplersList The sampler list\r\n * @param defines The defines helping in the list generation\r\n * @param maxSimultaneousLights The maximum number of simultaneous light allowed in the effect\r\n */\r\nexport function PrepareUniformsAndSamplersList(uniformsListOrOptions: string[] | IEffectCreationOptions, samplersList?: string[], defines?: any, maxSimultaneousLights = 4): void {\r\n let uniformsList: string[];\r\n let uniformBuffersList: Nullable = null;\r\n\r\n if ((uniformsListOrOptions).uniformsNames) {\r\n const options = uniformsListOrOptions;\r\n uniformsList = options.uniformsNames;\r\n uniformBuffersList = options.uniformBuffersNames;\r\n samplersList = options.samplers;\r\n defines = options.defines;\r\n maxSimultaneousLights = options.maxSimultaneousLights || 0;\r\n } else {\r\n uniformsList = uniformsListOrOptions;\r\n if (!samplersList) {\r\n samplersList = [];\r\n }\r\n }\r\n\r\n for (let lightIndex = 0; lightIndex < maxSimultaneousLights; lightIndex++) {\r\n if (!defines[\"LIGHT\" + lightIndex]) {\r\n break;\r\n }\r\n PrepareUniformsAndSamplersForLight(lightIndex, uniformsList, samplersList, defines[\"PROJECTEDLIGHTTEXTURE\" + lightIndex], uniformBuffersList);\r\n }\r\n\r\n if (defines[\"NUM_MORPH_INFLUENCERS\"]) {\r\n uniformsList.push(\"morphTargetInfluences\");\r\n uniformsList.push(\"morphTargetCount\");\r\n }\r\n\r\n if (defines[\"BAKED_VERTEX_ANIMATION_TEXTURE\"]) {\r\n uniformsList.push(\"bakedVertexAnimationSettings\");\r\n uniformsList.push(\"bakedVertexAnimationTextureSizeInverted\");\r\n uniformsList.push(\"bakedVertexAnimationTime\");\r\n samplersList.push(\"bakedVertexAnimationTexture\");\r\n }\r\n}\r\n", "import { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { serialize } from \"../Misc/decorators\";\r\nimport type { IStencilState } from \"../States/IStencilState\";\r\n\r\nimport type { Scene } from \"../scene\";\r\n\r\n/**\r\n * Class that holds the different stencil states of a material\r\n * Usage example: https://playground.babylonjs.com/#CW5PRI#10\r\n */\r\nexport class MaterialStencilState implements IStencilState {\r\n /**\r\n * Creates a material stencil state instance\r\n */\r\n public constructor() {\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Resets all the stencil states to default values\r\n */\r\n public reset() {\r\n this.enabled = false;\r\n this.mask = 0xff;\r\n\r\n this.func = Constants.ALWAYS;\r\n this.funcRef = 1;\r\n this.funcMask = 0xff;\r\n\r\n this.opStencilFail = Constants.KEEP;\r\n this.opDepthFail = Constants.KEEP;\r\n this.opStencilDepthPass = Constants.REPLACE;\r\n }\r\n\r\n private _func: number;\r\n /**\r\n * Gets or sets the stencil function\r\n */\r\n @serialize()\r\n public get func(): number {\r\n return this._func;\r\n }\r\n\r\n public set func(value: number) {\r\n this._func = value;\r\n }\r\n\r\n private _funcRef: number;\r\n /**\r\n * Gets or sets the stencil function reference\r\n */\r\n @serialize()\r\n public get funcRef(): number {\r\n return this._funcRef;\r\n }\r\n\r\n public set funcRef(value: number) {\r\n this._funcRef = value;\r\n }\r\n\r\n private _funcMask: number;\r\n /**\r\n * Gets or sets the stencil function mask\r\n */\r\n @serialize()\r\n public get funcMask(): number {\r\n return this._funcMask;\r\n }\r\n\r\n public set funcMask(value: number) {\r\n this._funcMask = value;\r\n }\r\n\r\n private _opStencilFail: number;\r\n /**\r\n * Gets or sets the operation when the stencil test fails\r\n */\r\n @serialize()\r\n public get opStencilFail(): number {\r\n return this._opStencilFail;\r\n }\r\n\r\n public set opStencilFail(value: number) {\r\n this._opStencilFail = value;\r\n }\r\n\r\n private _opDepthFail: number;\r\n /**\r\n * Gets or sets the operation when the depth test fails\r\n */\r\n @serialize()\r\n public get opDepthFail(): number {\r\n return this._opDepthFail;\r\n }\r\n\r\n public set opDepthFail(value: number) {\r\n this._opDepthFail = value;\r\n }\r\n\r\n private _opStencilDepthPass: number;\r\n /**\r\n * Gets or sets the operation when the stencil+depth test succeeds\r\n */\r\n @serialize()\r\n public get opStencilDepthPass(): number {\r\n return this._opStencilDepthPass;\r\n }\r\n\r\n public set opStencilDepthPass(value: number) {\r\n this._opStencilDepthPass = value;\r\n }\r\n\r\n private _mask: number;\r\n /**\r\n * Gets or sets the stencil mask\r\n */\r\n @serialize()\r\n public get mask(): number {\r\n return this._mask;\r\n }\r\n\r\n public set mask(value: number) {\r\n this._mask = value;\r\n }\r\n\r\n private _enabled: boolean;\r\n /**\r\n * Enables or disables the stencil test\r\n */\r\n @serialize()\r\n public get enabled(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n public set enabled(value: boolean) {\r\n this._enabled = value;\r\n }\r\n\r\n /**\r\n * Get the current class name, useful for serialization or dynamic coding.\r\n * @returns \"MaterialStencilState\"\r\n */\r\n public getClassName(): string {\r\n return \"MaterialStencilState\";\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current configuration into another one.\r\n * @param stencilState defines stencil state where to copy the info\r\n */\r\n public copyTo(stencilState: MaterialStencilState): void {\r\n SerializationHelper.Clone(() => stencilState, this);\r\n }\r\n\r\n /**\r\n * Serializes this stencil configuration.\r\n * @returns - An object with the serialized config.\r\n */\r\n public serialize(): any {\r\n return SerializationHelper.Serialize(this);\r\n }\r\n\r\n /**\r\n * Parses a stencil state configuration from a serialized object.\r\n * @param source - Serialized object.\r\n * @param scene Defines the scene we are parsing for\r\n * @param rootUrl Defines the rootUrl to load from\r\n */\r\n public parse(source: any, scene: Scene, rootUrl: string): void {\r\n SerializationHelper.Parse(() => this, source, scene, rootUrl);\r\n }\r\n}\r\n", "import { serialize } from \"../Misc/decorators\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport type { SmartArray } from \"../Misc/smartArray\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Matrix } from \"../Maths/math.vector\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { Effect } from \"./effect\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { MaterialDefines } from \"./materialDefines\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { IInspectable } from \"../Misc/iInspectable\";\r\nimport { Plane } from \"../Maths/math.plane\";\r\nimport type { ShadowDepthWrapper } from \"./shadowDepthWrapper\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\nimport { DrawWrapper } from \"./drawWrapper\";\r\nimport { MaterialStencilState } from \"./materialStencilState\";\r\nimport { ScenePerformancePriority } from \"../scene\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport type {\r\n MaterialPluginDisposed,\r\n MaterialPluginIsReadyForSubMesh,\r\n MaterialPluginGetDefineNames,\r\n MaterialPluginBindForSubMesh,\r\n MaterialPluginGetActiveTextures,\r\n MaterialPluginHasTexture,\r\n MaterialPluginGetAnimatables,\r\n MaterialPluginPrepareDefines,\r\n MaterialPluginPrepareEffect,\r\n MaterialPluginPrepareUniformBuffer,\r\n MaterialPluginCreated,\r\n MaterialPluginFillRenderTargetTextures,\r\n MaterialPluginHasRenderTargetTextures,\r\n MaterialPluginHardBindForSubMesh,\r\n} from \"./materialPluginEvent\";\r\nimport { MaterialPluginEvent } from \"./materialPluginEvent\";\r\nimport type { ShaderCustomProcessingFunction } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { IClipPlanesHolder } from \"../Misc/interfaces/iClipPlanesHolder\";\r\n\r\nimport type { PrePassRenderer } from \"../Rendering/prePassRenderer\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { Animation } from \"../Animations/animation\";\r\nimport type { InstancedMesh } from \"../Meshes/instancedMesh\";\r\nimport { BindSceneUniformBuffer } from \"./materialHelper.functions\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\n\r\ndeclare let BABYLON: any;\r\n\r\n/**\r\n * Options for compiling materials.\r\n */\r\nexport interface IMaterialCompilationOptions {\r\n /**\r\n * Defines whether clip planes are enabled.\r\n */\r\n clipPlane: boolean;\r\n\r\n /**\r\n * Defines whether instances are enabled.\r\n */\r\n useInstances: boolean;\r\n}\r\n\r\n/**\r\n * Options passed when calling customShaderNameResolve\r\n */\r\nexport interface ICustomShaderNameResolveOptions {\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: Nullable;\r\n}\r\n\r\n/**\r\n * Base class for the main features of a material in Babylon.js\r\n */\r\nexport class Material implements IAnimatable, IClipPlanesHolder {\r\n /**\r\n * Returns the triangle fill mode\r\n */\r\n public static readonly TriangleFillMode = Constants.MATERIAL_TriangleFillMode;\r\n /**\r\n * Returns the wireframe mode\r\n */\r\n public static readonly WireFrameFillMode = Constants.MATERIAL_WireFrameFillMode;\r\n /**\r\n * Returns the point fill mode\r\n */\r\n public static readonly PointFillMode = Constants.MATERIAL_PointFillMode;\r\n /**\r\n * Returns the point list draw mode\r\n */\r\n public static readonly PointListDrawMode = Constants.MATERIAL_PointListDrawMode;\r\n /**\r\n * Returns the line list draw mode\r\n */\r\n public static readonly LineListDrawMode = Constants.MATERIAL_LineListDrawMode;\r\n /**\r\n * Returns the line loop draw mode\r\n */\r\n public static readonly LineLoopDrawMode = Constants.MATERIAL_LineLoopDrawMode;\r\n /**\r\n * Returns the line strip draw mode\r\n */\r\n public static readonly LineStripDrawMode = Constants.MATERIAL_LineStripDrawMode;\r\n /**\r\n * Returns the triangle strip draw mode\r\n */\r\n public static readonly TriangleStripDrawMode = Constants.MATERIAL_TriangleStripDrawMode;\r\n /**\r\n * Returns the triangle fan draw mode\r\n */\r\n public static readonly TriangleFanDrawMode = Constants.MATERIAL_TriangleFanDrawMode;\r\n\r\n /**\r\n * Stores the clock-wise side orientation\r\n */\r\n public static readonly ClockWiseSideOrientation = Constants.MATERIAL_ClockWiseSideOrientation;\r\n\r\n /**\r\n * Stores the counter clock-wise side orientation\r\n */\r\n public static readonly CounterClockWiseSideOrientation = Constants.MATERIAL_CounterClockWiseSideOrientation;\r\n\r\n /**\r\n * The dirty texture flag value\r\n */\r\n public static readonly TextureDirtyFlag = Constants.MATERIAL_TextureDirtyFlag;\r\n\r\n /**\r\n * The dirty light flag value\r\n */\r\n public static readonly LightDirtyFlag = Constants.MATERIAL_LightDirtyFlag;\r\n\r\n /**\r\n * The dirty fresnel flag value\r\n */\r\n public static readonly FresnelDirtyFlag = Constants.MATERIAL_FresnelDirtyFlag;\r\n\r\n /**\r\n * The dirty attribute flag value\r\n */\r\n public static readonly AttributesDirtyFlag = Constants.MATERIAL_AttributesDirtyFlag;\r\n\r\n /**\r\n * The dirty misc flag value\r\n */\r\n public static readonly MiscDirtyFlag = Constants.MATERIAL_MiscDirtyFlag;\r\n\r\n /**\r\n * The dirty prepass flag value\r\n */\r\n public static readonly PrePassDirtyFlag = Constants.MATERIAL_PrePassDirtyFlag;\r\n\r\n /**\r\n * The all dirty flag value\r\n */\r\n public static readonly AllDirtyFlag = Constants.MATERIAL_AllDirtyFlag;\r\n\r\n /**\r\n * MaterialTransparencyMode: No transparency mode, Alpha channel is not use.\r\n */\r\n public static readonly MATERIAL_OPAQUE = 0;\r\n\r\n /**\r\n * MaterialTransparencyMode: Alpha Test mode, pixel are discarded below a certain threshold defined by the alpha cutoff value.\r\n */\r\n public static readonly MATERIAL_ALPHATEST = 1;\r\n\r\n /**\r\n * MaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.\r\n */\r\n public static readonly MATERIAL_ALPHABLEND = 2;\r\n\r\n /**\r\n * MaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.\r\n * They are also discarded below the alpha cutoff threshold to improve performances.\r\n */\r\n public static readonly MATERIAL_ALPHATESTANDBLEND = 3;\r\n\r\n /**\r\n * The Whiteout method is used to blend normals.\r\n * Details of the algorithm can be found here: https://blog.selfshadow.com/publications/blending-in-detail/\r\n */\r\n public static readonly MATERIAL_NORMALBLENDMETHOD_WHITEOUT = 0;\r\n\r\n /**\r\n * The Reoriented Normal Mapping method is used to blend normals.\r\n * Details of the algorithm can be found here: https://blog.selfshadow.com/publications/blending-in-detail/\r\n */\r\n public static readonly MATERIAL_NORMALBLENDMETHOD_RNM = 1;\r\n\r\n /**\r\n * Event observable which raises global events common to all materials (like MaterialPluginEvent.Created)\r\n */\r\n public static OnEventObservable = new Observable();\r\n\r\n /**\r\n * Custom callback helping to override the default shader used in the material.\r\n */\r\n public customShaderNameResolve: (\r\n shaderName: string,\r\n uniforms: string[],\r\n uniformBuffers: string[],\r\n samplers: string[],\r\n defines: MaterialDefines | string[],\r\n attributes?: string[],\r\n options?: ICustomShaderNameResolveOptions\r\n ) => string;\r\n\r\n /**\r\n * Custom shadow depth material to use for shadow rendering instead of the in-built one\r\n */\r\n public shadowDepthWrapper: Nullable = null;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the material is allowed (if supported) to do shader hot swapping.\r\n * This means that the material can keep using a previous shader while a new one is being compiled.\r\n * This is mostly used when shader parallel compilation is supported (true by default)\r\n */\r\n public allowShaderHotSwapping = true;\r\n\r\n /**\r\n * The ID of the material\r\n */\r\n @serialize()\r\n public id: string;\r\n\r\n /**\r\n * Gets or sets the unique id of the material\r\n */\r\n @serialize()\r\n public uniqueId: number;\r\n\r\n /** @internal */\r\n public _loadedUniqueId: string;\r\n\r\n /**\r\n * The name of the material\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Gets or sets user defined metadata\r\n */\r\n @serialize()\r\n public metadata: any = null;\r\n\r\n /** @internal */\r\n public _internalMetadata: any;\r\n\r\n /**\r\n * For internal use only. Please do not use.\r\n */\r\n public reservedDataStore: any = null;\r\n\r\n /**\r\n * Specifies if the ready state should be checked on each call\r\n */\r\n @serialize()\r\n public checkReadyOnEveryCall = false;\r\n\r\n /**\r\n * Specifies if the ready state should be checked once\r\n */\r\n @serialize()\r\n public checkReadyOnlyOnce = false;\r\n\r\n /**\r\n * The state of the material\r\n */\r\n @serialize()\r\n public state = \"\";\r\n\r\n /**\r\n * If the material can be rendered to several textures with MRT extension\r\n */\r\n public get canRenderToMRT(): boolean {\r\n // By default, shaders are not compatible with MRTs\r\n // Base classes should override that if their shader supports MRT\r\n return false;\r\n }\r\n\r\n /**\r\n * The alpha value of the material\r\n */\r\n @serialize(\"alpha\")\r\n protected _alpha = 1.0;\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility\r\n */\r\n public inspectableCustomProperties: IInspectable[];\r\n\r\n /**\r\n * Sets the alpha value of the material\r\n */\r\n public set alpha(value: number) {\r\n if (this._alpha === value) {\r\n return;\r\n }\r\n\r\n const oldValue = this._alpha;\r\n this._alpha = value;\r\n\r\n // Only call dirty when there is a state change (no alpha / alpha)\r\n if (oldValue === 1 || value === 1) {\r\n this.markAsDirty(Material.MiscDirtyFlag + Material.PrePassDirtyFlag);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the alpha value of the material\r\n */\r\n public get alpha(): number {\r\n return this._alpha;\r\n }\r\n\r\n /**\r\n * Specifies if back face culling is enabled\r\n */\r\n @serialize(\"backFaceCulling\")\r\n protected _backFaceCulling = true;\r\n\r\n /**\r\n * Sets the culling state (true to enable culling, false to disable)\r\n */\r\n public set backFaceCulling(value: boolean) {\r\n if (this._backFaceCulling === value) {\r\n return;\r\n }\r\n this._backFaceCulling = value;\r\n this.markAsDirty(Material.TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the culling state\r\n */\r\n public get backFaceCulling(): boolean {\r\n return this._backFaceCulling;\r\n }\r\n\r\n /**\r\n * Specifies if back or front faces should be culled (when culling is enabled)\r\n */\r\n @serialize(\"cullBackFaces\")\r\n protected _cullBackFaces = true;\r\n\r\n /**\r\n * Sets the type of faces that should be culled (true for back faces, false for front faces)\r\n */\r\n public set cullBackFaces(value: boolean) {\r\n if (this._cullBackFaces === value) {\r\n return;\r\n }\r\n this._cullBackFaces = value;\r\n this.markAsDirty(Material.TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the type of faces that should be culled\r\n */\r\n public get cullBackFaces(): boolean {\r\n return this._cullBackFaces;\r\n }\r\n\r\n private _blockDirtyMechanism = false;\r\n\r\n /**\r\n * Block the dirty-mechanism for this specific material\r\n * When set to false after being true the material will be marked as dirty.\r\n */\r\n public get blockDirtyMechanism(): boolean {\r\n return this._blockDirtyMechanism;\r\n }\r\n\r\n public set blockDirtyMechanism(value: boolean) {\r\n if (this._blockDirtyMechanism === value) {\r\n return;\r\n }\r\n\r\n this._blockDirtyMechanism = value;\r\n\r\n if (!value) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * This allows you to modify the material without marking it as dirty after every change.\r\n * This function should be used if you need to make more than one dirty-enabling change to the material - adding a texture, setting a new fill mode and so on.\r\n * The callback will pass the material as an argument, so you can make your changes to it.\r\n * @param callback the callback to be executed that will update the material\r\n */\r\n public atomicMaterialsUpdate(callback: (material: this) => void): void {\r\n this.blockDirtyMechanism = true;\r\n try {\r\n callback(this);\r\n } finally {\r\n this.blockDirtyMechanism = false;\r\n }\r\n }\r\n\r\n /**\r\n * Stores the value for side orientation\r\n */\r\n @serialize()\r\n public sideOrientation: number;\r\n\r\n /**\r\n * Callback triggered when the material is compiled\r\n */\r\n public onCompiled: Nullable<(effect: Effect) => void> = null;\r\n\r\n /**\r\n * Callback triggered when an error occurs\r\n */\r\n public onError: Nullable<(effect: Effect, errors: string) => void> = null;\r\n\r\n /**\r\n * Callback triggered to get the render target textures\r\n */\r\n public getRenderTargetTextures: Nullable<() => SmartArray> = null;\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public get hasRenderTargetTextures(): boolean {\r\n this._eventInfo.hasRenderTargetTextures = false;\r\n this._callbackPluginEventHasRenderTargetTextures(this._eventInfo);\r\n return this._eventInfo.hasRenderTargetTextures;\r\n }\r\n\r\n /**\r\n * Specifies if the material should be serialized\r\n */\r\n public doNotSerialize = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _storeEffectOnSubMeshes = false;\r\n\r\n /**\r\n * Stores the animations for the material\r\n */\r\n public animations: Nullable> = null;\r\n\r\n /**\r\n * An event triggered when the material is disposed\r\n */\r\n public onDisposeObservable = new Observable();\r\n\r\n /**\r\n * An observer which watches for dispose events\r\n */\r\n private _onDisposeObserver: Nullable> = null;\r\n private _onUnBindObservable: Nullable> = null;\r\n\r\n /**\r\n * Called during a dispose event\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n private _onBindObservable: Nullable>;\r\n\r\n /**\r\n * An event triggered when the material is bound\r\n */\r\n public get onBindObservable(): Observable {\r\n if (!this._onBindObservable) {\r\n this._onBindObservable = new Observable();\r\n }\r\n\r\n return this._onBindObservable;\r\n }\r\n\r\n /**\r\n * An observer which watches for bind events\r\n */\r\n private _onBindObserver: Nullable> = null;\r\n\r\n /**\r\n * Called during a bind event\r\n */\r\n public set onBind(callback: (Mesh: AbstractMesh) => void) {\r\n if (this._onBindObserver) {\r\n this.onBindObservable.remove(this._onBindObserver);\r\n }\r\n this._onBindObserver = this.onBindObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the material is unbound\r\n */\r\n public get onUnBindObservable(): Observable {\r\n if (!this._onUnBindObservable) {\r\n this._onUnBindObservable = new Observable();\r\n }\r\n\r\n return this._onUnBindObservable;\r\n }\r\n\r\n protected _onEffectCreatedObservable: Nullable }>>;\r\n\r\n /**\r\n * An event triggered when the effect is (re)created\r\n */\r\n public get onEffectCreatedObservable(): Observable<{ effect: Effect; subMesh: Nullable }> {\r\n if (!this._onEffectCreatedObservable) {\r\n this._onEffectCreatedObservable = new Observable<{ effect: Effect; subMesh: Nullable }>();\r\n }\r\n\r\n return this._onEffectCreatedObservable;\r\n }\r\n\r\n /**\r\n * Stores the value of the alpha mode\r\n */\r\n @serialize(\"alphaMode\")\r\n private _alphaMode: number = Constants.ALPHA_COMBINE;\r\n\r\n /**\r\n * Sets the value of the alpha mode.\r\n *\r\n * | Value | Type | Description |\r\n * | --- | --- | --- |\r\n * | 0 | ALPHA_DISABLE | |\r\n * | 1 | ALPHA_ADD | |\r\n * | 2 | ALPHA_COMBINE | |\r\n * | 3 | ALPHA_SUBTRACT | |\r\n * | 4 | ALPHA_MULTIPLY | |\r\n * | 5 | ALPHA_MAXIMIZED | |\r\n * | 6 | ALPHA_ONEONE | |\r\n * | 7 | ALPHA_PREMULTIPLIED | |\r\n * | 8 | ALPHA_PREMULTIPLIED_PORTERDUFF | |\r\n * | 9 | ALPHA_INTERPOLATE | |\r\n * | 10 | ALPHA_SCREENMODE | |\r\n *\r\n */\r\n public set alphaMode(value: number) {\r\n if (this._alphaMode === value) {\r\n return;\r\n }\r\n this._alphaMode = value;\r\n this.markAsDirty(Material.TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the value of the alpha mode\r\n */\r\n public get alphaMode(): number {\r\n return this._alphaMode;\r\n }\r\n\r\n /**\r\n * Stores the state of the need depth pre-pass value\r\n */\r\n @serialize()\r\n private _needDepthPrePass = false;\r\n\r\n /**\r\n * Sets the need depth pre-pass value\r\n */\r\n public set needDepthPrePass(value: boolean) {\r\n if (this._needDepthPrePass === value) {\r\n return;\r\n }\r\n this._needDepthPrePass = value;\r\n if (this._needDepthPrePass) {\r\n this.checkReadyOnEveryCall = true;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the depth pre-pass value\r\n */\r\n public get needDepthPrePass(): boolean {\r\n return this._needDepthPrePass;\r\n }\r\n\r\n /**\r\n * Can this material render to prepass\r\n */\r\n public get isPrePassCapable(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies if depth writing should be disabled\r\n */\r\n @serialize()\r\n public disableDepthWrite = false;\r\n\r\n /**\r\n * Specifies if color writing should be disabled\r\n */\r\n @serialize()\r\n public disableColorWrite = false;\r\n\r\n /**\r\n * Specifies if depth writing should be forced\r\n */\r\n @serialize()\r\n public forceDepthWrite = false;\r\n\r\n /**\r\n * Specifies the depth function that should be used. 0 means the default engine function\r\n */\r\n @serialize()\r\n public depthFunction = 0;\r\n\r\n /**\r\n * Specifies if there should be a separate pass for culling\r\n */\r\n @serialize()\r\n public separateCullingPass = false;\r\n\r\n /**\r\n * Stores the state specifying if fog should be enabled\r\n */\r\n @serialize(\"fogEnabled\")\r\n private _fogEnabled = true;\r\n\r\n /**\r\n * Sets the state for enabling fog\r\n */\r\n public set fogEnabled(value: boolean) {\r\n if (this._fogEnabled === value) {\r\n return;\r\n }\r\n this._fogEnabled = value;\r\n this.markAsDirty(Material.MiscDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets the value of the fog enabled state\r\n */\r\n public get fogEnabled(): boolean {\r\n return this._fogEnabled;\r\n }\r\n\r\n /**\r\n * Stores the size of points\r\n */\r\n @serialize()\r\n public pointSize = 1.0;\r\n\r\n /**\r\n * Stores the z offset Factor value\r\n */\r\n @serialize()\r\n public zOffset = 0;\r\n\r\n /**\r\n * Stores the z offset Units value\r\n */\r\n @serialize()\r\n public zOffsetUnits = 0;\r\n\r\n public get wireframe(): boolean {\r\n switch (this._fillMode) {\r\n case Material.WireFrameFillMode:\r\n case Material.LineListDrawMode:\r\n case Material.LineLoopDrawMode:\r\n case Material.LineStripDrawMode:\r\n return true;\r\n }\r\n\r\n return this._scene.forceWireframe;\r\n }\r\n\r\n /**\r\n * Sets the state of wireframe mode\r\n */\r\n public set wireframe(value: boolean) {\r\n this.fillMode = value ? Material.WireFrameFillMode : Material.TriangleFillMode;\r\n }\r\n\r\n /**\r\n * Gets the value specifying if point clouds are enabled\r\n */\r\n @serialize()\r\n public get pointsCloud(): boolean {\r\n switch (this._fillMode) {\r\n case Material.PointFillMode:\r\n case Material.PointListDrawMode:\r\n return true;\r\n }\r\n\r\n return this._scene.forcePointsCloud;\r\n }\r\n\r\n /**\r\n * Sets the state of point cloud mode\r\n */\r\n public set pointsCloud(value: boolean) {\r\n this.fillMode = value ? Material.PointFillMode : Material.TriangleFillMode;\r\n }\r\n\r\n /**\r\n * Gets the material fill mode\r\n */\r\n @serialize()\r\n public get fillMode(): number {\r\n return this._fillMode;\r\n }\r\n\r\n /**\r\n * Sets the material fill mode\r\n */\r\n public set fillMode(value: number) {\r\n if (this._fillMode === value) {\r\n return;\r\n }\r\n\r\n this._fillMode = value;\r\n this.markAsDirty(Material.MiscDirtyFlag);\r\n }\r\n\r\n /**\r\n * Gets or sets the active clipplane 1\r\n */\r\n public clipPlane: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 2\r\n */\r\n public clipPlane2: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 3\r\n */\r\n public clipPlane3: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 4\r\n */\r\n public clipPlane4: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 5\r\n */\r\n public clipPlane5: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 6\r\n */\r\n public clipPlane6: Nullable;\r\n\r\n /**\r\n * Gives access to the stencil properties of the material\r\n */\r\n public readonly stencil = new MaterialStencilState();\r\n\r\n protected _useLogarithmicDepth: boolean;\r\n\r\n /**\r\n * In case the depth buffer does not allow enough depth precision for your scene (might be the case in large scenes)\r\n * You can try switching to logarithmic depth.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/logarithmicDepthBuffer\r\n */\r\n @serialize()\r\n public get useLogarithmicDepth(): boolean {\r\n return this._useLogarithmicDepth;\r\n }\r\n\r\n public set useLogarithmicDepth(value: boolean) {\r\n const fragmentDepthSupported = this.getScene().getEngine().getCaps().fragmentDepthSupported;\r\n\r\n if (value && !fragmentDepthSupported) {\r\n Logger.Warn(\"Logarithmic depth has been requested for a material on a device that doesn't support it.\");\r\n }\r\n\r\n this._useLogarithmicDepth = value && fragmentDepthSupported;\r\n\r\n this._markAllSubMeshesAsMiscDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n * Stores the effects for the material\r\n */\r\n public _materialContext: IMaterialContext | undefined;\r\n\r\n protected _drawWrapper: DrawWrapper;\r\n /** @internal */\r\n public _getDrawWrapper(): DrawWrapper {\r\n return this._drawWrapper;\r\n }\r\n /**\r\n * @internal\r\n */\r\n public _setDrawWrapper(drawWrapper: DrawWrapper) {\r\n this._drawWrapper = drawWrapper;\r\n }\r\n\r\n /**\r\n * Specifies if uniform buffers should be used\r\n */\r\n private _useUBO: boolean = false;\r\n\r\n /**\r\n * Stores a reference to the scene\r\n */\r\n private _scene: Scene;\r\n protected _needToBindSceneUbo: boolean;\r\n\r\n /**\r\n * Stores the fill mode state\r\n */\r\n private _fillMode = Material.TriangleFillMode;\r\n\r\n /**\r\n * Specifies if the depth write state should be cached\r\n */\r\n private _cachedDepthWriteState: boolean = false;\r\n\r\n /**\r\n * Specifies if the color write state should be cached\r\n */\r\n private _cachedColorWriteState: boolean = false;\r\n\r\n /**\r\n * Specifies if the depth function state should be cached\r\n */\r\n private _cachedDepthFunctionState: number = 0;\r\n\r\n /**\r\n * Stores the uniform buffer\r\n * @internal\r\n */\r\n public _uniformBuffer: UniformBuffer;\r\n\r\n /** @internal */\r\n public _indexInSceneMaterialArray = -1;\r\n\r\n /** @internal */\r\n public meshMap: Nullable<{ [id: string]: AbstractMesh | undefined }> = null;\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable = null;\r\n\r\n /** @internal */\r\n public _dirtyCallbacks: { [code: number]: () => void };\r\n\r\n /** @internal */\r\n public _uniformBufferLayoutBuilt = false;\r\n\r\n protected _eventInfo: MaterialPluginCreated &\r\n MaterialPluginDisposed &\r\n MaterialPluginHasTexture &\r\n MaterialPluginIsReadyForSubMesh &\r\n MaterialPluginGetDefineNames &\r\n MaterialPluginPrepareEffect &\r\n MaterialPluginPrepareDefines &\r\n MaterialPluginPrepareUniformBuffer &\r\n MaterialPluginBindForSubMesh &\r\n MaterialPluginGetAnimatables &\r\n MaterialPluginGetActiveTextures &\r\n MaterialPluginFillRenderTargetTextures &\r\n MaterialPluginHasRenderTargetTextures &\r\n MaterialPluginHardBindForSubMesh = {} as any; // will be initialized before each event notification\r\n\r\n /** @internal */\r\n public _callbackPluginEventGeneric: (\r\n id: number,\r\n info:\r\n | MaterialPluginGetActiveTextures\r\n | MaterialPluginGetAnimatables\r\n | MaterialPluginHasTexture\r\n | MaterialPluginDisposed\r\n | MaterialPluginGetDefineNames\r\n | MaterialPluginPrepareEffect\r\n | MaterialPluginPrepareUniformBuffer\r\n ) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventIsReadyForSubMesh: (eventData: MaterialPluginIsReadyForSubMesh) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventPrepareDefines: (eventData: MaterialPluginPrepareDefines) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventPrepareDefinesBeforeAttributes: (eventData: MaterialPluginPrepareDefines) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventHardBindForSubMesh: (eventData: MaterialPluginHardBindForSubMesh) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventBindForSubMesh: (eventData: MaterialPluginBindForSubMesh) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventHasRenderTargetTextures: (eventData: MaterialPluginHasRenderTargetTextures) => void = () => void 0;\r\n /** @internal */\r\n public _callbackPluginEventFillRenderTargetTextures: (eventData: MaterialPluginFillRenderTargetTextures) => void = () => void 0;\r\n\r\n /**\r\n * Creates a material instance\r\n * @param name defines the name of the material\r\n * @param scene defines the scene to reference\r\n * @param doNotAdd specifies if the material should be added to the scene\r\n */\r\n constructor(name: string, scene?: Nullable, doNotAdd?: boolean) {\r\n this.name = name;\r\n const setScene = scene || EngineStore.LastCreatedScene;\r\n if (!setScene) {\r\n return;\r\n }\r\n this._scene = setScene;\r\n this._dirtyCallbacks = {};\r\n\r\n this._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag] = this._markAllSubMeshesAsTexturesDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_LightDirtyFlag] = this._markAllSubMeshesAsLightsDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_FresnelDirtyFlag] = this._markAllSubMeshesAsFresnelDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_AttributesDirtyFlag] = this._markAllSubMeshesAsAttributesDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_MiscDirtyFlag] = this._markAllSubMeshesAsMiscDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_PrePassDirtyFlag] = this._markAllSubMeshesAsPrePassDirty.bind(this);\r\n this._dirtyCallbacks[Constants.MATERIAL_AllDirtyFlag] = this._markAllSubMeshesAsAllDirty.bind(this);\r\n\r\n this.id = name || Tools.RandomId();\r\n this.uniqueId = this._scene.getUniqueId();\r\n this._materialContext = this._scene.getEngine().createMaterialContext();\r\n this._drawWrapper = new DrawWrapper(this._scene.getEngine(), false);\r\n this._drawWrapper.materialContext = this._materialContext;\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n this.sideOrientation = Material.ClockWiseSideOrientation;\r\n } else {\r\n this.sideOrientation = Material.CounterClockWiseSideOrientation;\r\n }\r\n\r\n this._uniformBuffer = new UniformBuffer(this._scene.getEngine(), undefined, undefined, name);\r\n this._useUBO = this.getScene().getEngine().supportsUniformBuffers;\r\n\r\n if (!doNotAdd) {\r\n this._scene.addMaterial(this);\r\n }\r\n\r\n if (this._scene.useMaterialMeshMap) {\r\n this.meshMap = {};\r\n }\r\n\r\n Material.OnEventObservable.notifyObservers(this, MaterialPluginEvent.Created);\r\n }\r\n\r\n /**\r\n * Returns a string representation of the current material\r\n * @param fullDetails defines a boolean indicating which levels of logging is desired\r\n * @returns a string with material information\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public toString(fullDetails?: boolean): string {\r\n const ret = \"Name: \" + this.name;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Gets the class name of the material\r\n * @returns a string with the class name of the material\r\n */\r\n public getClassName(): string {\r\n return \"Material\";\r\n }\r\n\r\n /** @internal */\r\n public get _isMaterial() {\r\n return true;\r\n }\r\n\r\n /**\r\n * Specifies if updates for the material been locked\r\n */\r\n public get isFrozen(): boolean {\r\n return this.checkReadyOnlyOnce;\r\n }\r\n\r\n /**\r\n * Locks updates for the material\r\n */\r\n public freeze(): void {\r\n this.markDirty();\r\n this.checkReadyOnlyOnce = true;\r\n }\r\n\r\n /**\r\n * Unlocks updates for the material\r\n */\r\n public unfreeze(): void {\r\n this.markDirty();\r\n this.checkReadyOnlyOnce = false;\r\n }\r\n\r\n /**\r\n * Specifies if the material is ready to be used\r\n * @param mesh defines the mesh to check\r\n * @param useInstances specifies if instances should be used\r\n * @returns a boolean indicating if the material is ready to be used\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReady(mesh?: AbstractMesh, useInstances?: boolean): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Specifies that the submesh is ready to be used\r\n * @param mesh defines the mesh to check\r\n * @param subMesh defines which submesh to check\r\n * @param useInstances specifies that instances should be used\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean {\r\n const defines = subMesh.materialDefines;\r\n if (!defines) {\r\n return false;\r\n }\r\n\r\n this._eventInfo.isReadyForSubMesh = true;\r\n this._eventInfo.defines = defines;\r\n this._callbackPluginEventIsReadyForSubMesh(this._eventInfo);\r\n\r\n return this._eventInfo.isReadyForSubMesh;\r\n }\r\n\r\n /**\r\n * Returns the material effect\r\n * @returns the effect associated with the material\r\n */\r\n public getEffect(): Nullable {\r\n return this._drawWrapper.effect;\r\n }\r\n\r\n /**\r\n * Returns the current scene\r\n * @returns a Scene\r\n */\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Enforces alpha test in opaque or blend mode in order to improve the performances of some situations.\r\n */\r\n protected _forceAlphaTest = false;\r\n\r\n /**\r\n * The transparency mode of the material.\r\n */\r\n protected _transparencyMode: Nullable = null;\r\n\r\n /**\r\n * Gets the current transparency mode.\r\n */\r\n @serialize()\r\n public get transparencyMode(): Nullable {\r\n return this._transparencyMode;\r\n }\r\n\r\n /**\r\n * Sets the transparency mode of the material.\r\n *\r\n * | Value | Type | Description |\r\n * | ----- | ----------------------------------- | ----------- |\r\n * | 0 | OPAQUE | |\r\n * | 1 | ALPHATEST | |\r\n * | 2 | ALPHABLEND | |\r\n * | 3 | ALPHATESTANDBLEND | |\r\n *\r\n */\r\n public set transparencyMode(value: Nullable) {\r\n if (this._transparencyMode === value) {\r\n return;\r\n }\r\n\r\n this._transparencyMode = value;\r\n\r\n this._forceAlphaTest = value === Material.MATERIAL_ALPHATESTANDBLEND;\r\n\r\n this._markAllSubMeshesAsTexturesAndMiscDirty();\r\n }\r\n\r\n /**\r\n * Returns true if alpha blending should be disabled.\r\n */\r\n protected get _disableAlphaBlending(): boolean {\r\n return this._transparencyMode === Material.MATERIAL_OPAQUE || this._transparencyMode === Material.MATERIAL_ALPHATEST;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha blend mode.\r\n * @returns a boolean specifying if alpha blending is needed\r\n */\r\n public needAlphaBlending(): boolean {\r\n if (this._disableAlphaBlending) {\r\n return false;\r\n }\r\n\r\n return this.alpha < 1.0;\r\n }\r\n\r\n /**\r\n * Specifies if the mesh will require alpha blending\r\n * @param mesh defines the mesh to check\r\n * @returns a boolean specifying if alpha blending is needed for the mesh\r\n */\r\n public needAlphaBlendingForMesh(mesh: AbstractMesh): boolean {\r\n if (mesh.visibility < 1.0) {\r\n return true;\r\n }\r\n\r\n if (this._disableAlphaBlending) {\r\n return false;\r\n }\r\n\r\n return mesh.hasVertexAlpha || this.needAlphaBlending();\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha test mode.\r\n * @returns a boolean specifying if an alpha test is needed.\r\n */\r\n public needAlphaTesting(): boolean {\r\n if (this._forceAlphaTest) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies if material alpha testing should be turned on for the mesh\r\n * @param mesh defines the mesh to check\r\n * @returns a boolean specifying if alpha testing should be turned on for the mesh\r\n */\r\n protected _shouldTurnAlphaTestOn(mesh: AbstractMesh): boolean {\r\n return !this.needAlphaBlendingForMesh(mesh) && this.needAlphaTesting();\r\n }\r\n\r\n /**\r\n * Gets the texture used for the alpha test\r\n * @returns the texture to use for alpha testing\r\n */\r\n public getAlphaTestTexture(): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate that it needs to be re-calculated\r\n * @param forceMaterialDirty - Forces the material to be marked as dirty for all components (same as this.markAsDirty(Material.AllDirtyFlag)). You should use this flag if the material is frozen and you want to force a recompilation.\r\n */\r\n public markDirty(forceMaterialDirty = false): void {\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n if (subMesh.getMaterial() !== this) {\r\n continue;\r\n }\r\n\r\n for (const drawWrapper of subMesh._drawWrappers) {\r\n if (!drawWrapper) {\r\n continue;\r\n }\r\n if (this._materialContext === drawWrapper.materialContext) {\r\n drawWrapper._wasPreviouslyReady = false;\r\n drawWrapper._wasPreviouslyUsingInstances = null;\r\n drawWrapper._forceRebindOnNextCall = forceMaterialDirty;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (forceMaterialDirty) {\r\n this.markAsDirty(Material.AllDirtyFlag);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _preBind(effect?: Effect | DrawWrapper, overrideOrientation: Nullable = null): boolean {\r\n const engine = this._scene.getEngine();\r\n\r\n const orientation = overrideOrientation == null ? this.sideOrientation : overrideOrientation;\r\n const reverse = orientation === Material.ClockWiseSideOrientation;\r\n\r\n engine.enableEffect(effect ? effect : this._getDrawWrapper());\r\n engine.setState(\r\n this.backFaceCulling,\r\n this.zOffset,\r\n false,\r\n reverse,\r\n this._scene._mirroredCameraPosition ? !this.cullBackFaces : this.cullBackFaces,\r\n this.stencil,\r\n this.zOffsetUnits\r\n );\r\n\r\n return reverse;\r\n }\r\n\r\n /**\r\n * Binds the material to the mesh\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh to bind the material to\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bind(world: Matrix, mesh?: Mesh): void {}\r\n\r\n /**\r\n * Initializes the uniform buffer layout for the shader.\r\n */\r\n public buildUniformLayout(): void {\r\n const ubo = this._uniformBuffer;\r\n\r\n this._eventInfo.ubo = ubo;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.PrepareUniformBuffer, this._eventInfo);\r\n\r\n ubo.create();\r\n\r\n this._uniformBufferLayoutBuilt = true;\r\n }\r\n\r\n /**\r\n * Binds the submesh to the material\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventBindForSubMesh(this._eventInfo);\r\n drawWrapper._forceRebindOnNextCall = false;\r\n }\r\n\r\n /**\r\n * Binds the world matrix to the material\r\n * @param world defines the world transformation matrix\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bindOnlyWorldMatrix(world: Matrix): void {}\r\n\r\n /**\r\n * Binds the view matrix to the effect\r\n * @param effect defines the effect to bind the view matrix to\r\n */\r\n public bindView(effect: Effect): void {\r\n if (!this._useUBO) {\r\n effect.setMatrix(\"view\", this.getScene().getViewMatrix());\r\n } else {\r\n this._needToBindSceneUbo = true;\r\n }\r\n }\r\n\r\n /**\r\n * Binds the view projection and projection matrices to the effect\r\n * @param effect defines the effect to bind the view projection and projection matrices to\r\n */\r\n public bindViewProjection(effect: Effect): void {\r\n if (!this._useUBO) {\r\n effect.setMatrix(\"viewProjection\", this.getScene().getTransformMatrix());\r\n effect.setMatrix(\"projection\", this.getScene().getProjectionMatrix());\r\n } else {\r\n this._needToBindSceneUbo = true;\r\n }\r\n }\r\n\r\n /**\r\n * Binds the view matrix to the effect\r\n * @param effect defines the effect to bind the view matrix to\r\n * @param variableName name of the shader variable that will hold the eye position\r\n */\r\n public bindEyePosition(effect: Effect, variableName?: string): void {\r\n if (!this._useUBO) {\r\n this._scene.bindEyePosition(effect, variableName);\r\n } else {\r\n this._needToBindSceneUbo = true;\r\n }\r\n }\r\n\r\n /**\r\n * Processes to execute after binding the material to a mesh\r\n * @param mesh defines the rendered mesh\r\n * @param effect defines the effect used to bind the material\r\n * @param _subMesh defines the subMesh that the material has been bound for\r\n */\r\n protected _afterBind(mesh?: Mesh, effect: Nullable = null, _subMesh?: SubMesh): void {\r\n this._scene._cachedMaterial = this;\r\n if (this._needToBindSceneUbo) {\r\n if (effect) {\r\n this._needToBindSceneUbo = false;\r\n BindSceneUniformBuffer(effect, this.getScene().getSceneUniformBuffer());\r\n this._scene.finalizeSceneUbo();\r\n }\r\n }\r\n if (mesh) {\r\n this._scene._cachedVisibility = mesh.visibility;\r\n } else {\r\n this._scene._cachedVisibility = 1;\r\n }\r\n\r\n if (this._onBindObservable && mesh) {\r\n this._onBindObservable.notifyObservers(mesh);\r\n }\r\n\r\n if (this.disableDepthWrite) {\r\n const engine = this._scene.getEngine();\r\n this._cachedDepthWriteState = engine.getDepthWrite();\r\n engine.setDepthWrite(false);\r\n }\r\n\r\n if (this.disableColorWrite) {\r\n const engine = this._scene.getEngine();\r\n this._cachedColorWriteState = engine.getColorWrite();\r\n engine.setColorWrite(false);\r\n }\r\n\r\n if (this.depthFunction !== 0) {\r\n const engine = this._scene.getEngine();\r\n this._cachedDepthFunctionState = engine.getDepthFunction() || 0;\r\n engine.setDepthFunction(this.depthFunction);\r\n }\r\n }\r\n\r\n /**\r\n * Unbinds the material from the mesh\r\n */\r\n public unbind(): void {\r\n if (this._onUnBindObservable) {\r\n this._onUnBindObservable.notifyObservers(this);\r\n }\r\n\r\n if (this.depthFunction !== 0) {\r\n const engine = this._scene.getEngine();\r\n engine.setDepthFunction(this._cachedDepthFunctionState);\r\n }\r\n\r\n if (this.disableDepthWrite) {\r\n const engine = this._scene.getEngine();\r\n engine.setDepthWrite(this._cachedDepthWriteState);\r\n }\r\n\r\n if (this.disableColorWrite) {\r\n const engine = this._scene.getEngine();\r\n engine.setColorWrite(this._cachedColorWriteState);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the animatable textures.\r\n * @returns - Array of animatable textures.\r\n */\r\n public getAnimatables(): IAnimatable[] {\r\n this._eventInfo.animatables = [];\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetAnimatables, this._eventInfo);\r\n return this._eventInfo.animatables;\r\n }\r\n\r\n /**\r\n * Gets the active textures from the material\r\n * @returns an array of textures\r\n */\r\n public getActiveTextures(): BaseTexture[] {\r\n this._eventInfo.activeTextures = [];\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetActiveTextures, this._eventInfo);\r\n return this._eventInfo.activeTextures;\r\n }\r\n\r\n /**\r\n * Specifies if the material uses a texture\r\n * @param texture defines the texture to check against the material\r\n * @returns a boolean specifying if the material uses the texture\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n this._eventInfo.hasTexture = false;\r\n this._eventInfo.texture = texture;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.HasTexture, this._eventInfo);\r\n return this._eventInfo.hasTexture;\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the material, and gives it a new name\r\n * @param name defines the new name for the duplicated material\r\n * @returns the cloned material\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public clone(name: string): Nullable {\r\n return null;\r\n }\r\n\r\n protected _clonePlugins(targetMaterial: Material, rootUrl: string) {\r\n const serializationObject: any = {};\r\n\r\n // Create plugins in targetMaterial in case they don't exist\r\n this._serializePlugins(serializationObject);\r\n\r\n Material._ParsePlugins(serializationObject, targetMaterial, this._scene, rootUrl);\r\n\r\n // Copy the properties of the current plugins to the cloned material's plugins\r\n if (this.pluginManager) {\r\n for (const plugin of this.pluginManager._plugins) {\r\n const targetPlugin = targetMaterial.pluginManager!.getPlugin(plugin.name);\r\n if (targetPlugin) {\r\n plugin.copyTo(targetPlugin);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the meshes bound to the material\r\n * @returns an array of meshes bound to the material\r\n */\r\n public getBindedMeshes(): AbstractMesh[] {\r\n if (this.meshMap) {\r\n const result: AbstractMesh[] = [];\r\n for (const meshId in this.meshMap) {\r\n const mesh = this.meshMap[meshId];\r\n if (mesh) {\r\n result.push(mesh);\r\n }\r\n }\r\n return result;\r\n } else {\r\n const meshes = this._scene.meshes;\r\n return meshes.filter((mesh) => mesh.material === this);\r\n }\r\n }\r\n\r\n /**\r\n * Force shader compilation\r\n * @param mesh defines the mesh associated with this material\r\n * @param onCompiled defines a function to execute once the material is compiled\r\n * @param options defines the options to configure the compilation\r\n * @param onError defines a function to execute if the material fails compiling\r\n */\r\n public forceCompilation(\r\n mesh: AbstractMesh,\r\n onCompiled?: (material: Material) => void,\r\n options?: Partial,\r\n onError?: (reason: string) => void\r\n ): void {\r\n const localOptions = {\r\n clipPlane: false,\r\n useInstances: false,\r\n ...options,\r\n };\r\n\r\n const scene = this.getScene();\r\n const currentHotSwapingState = this.allowShaderHotSwapping;\r\n this.allowShaderHotSwapping = false; // Turned off to let us evaluate the real compilation state\r\n\r\n const checkReady = () => {\r\n if (!this._scene || !this._scene.getEngine()) {\r\n return;\r\n }\r\n\r\n const clipPlaneState = scene.clipPlane;\r\n\r\n if (localOptions.clipPlane) {\r\n scene.clipPlane = new Plane(0, 0, 0, 1);\r\n }\r\n\r\n if (this._storeEffectOnSubMeshes) {\r\n let allDone = true,\r\n lastError = null;\r\n if (mesh.subMeshes) {\r\n const tempSubMesh = new SubMesh(0, 0, 0, 0, 0, mesh, undefined, false, false);\r\n if (tempSubMesh.materialDefines) {\r\n tempSubMesh.materialDefines._renderId = -1;\r\n }\r\n if (!this.isReadyForSubMesh(mesh, tempSubMesh, localOptions.useInstances)) {\r\n if (tempSubMesh.effect && tempSubMesh.effect.getCompilationError() && tempSubMesh.effect.allFallbacksProcessed()) {\r\n lastError = tempSubMesh.effect.getCompilationError();\r\n } else {\r\n allDone = false;\r\n setTimeout(checkReady, 16);\r\n }\r\n }\r\n }\r\n if (allDone) {\r\n this.allowShaderHotSwapping = currentHotSwapingState;\r\n if (lastError) {\r\n if (onError) {\r\n onError(lastError);\r\n }\r\n }\r\n if (onCompiled) {\r\n onCompiled(this);\r\n }\r\n }\r\n } else {\r\n if (this.isReady()) {\r\n this.allowShaderHotSwapping = currentHotSwapingState;\r\n if (onCompiled) {\r\n onCompiled(this);\r\n }\r\n } else {\r\n setTimeout(checkReady, 16);\r\n }\r\n }\r\n\r\n if (localOptions.clipPlane) {\r\n scene.clipPlane = clipPlaneState;\r\n }\r\n };\r\n\r\n checkReady();\r\n }\r\n\r\n /**\r\n * Force shader compilation\r\n * @param mesh defines the mesh that will use this material\r\n * @param options defines additional options for compiling the shaders\r\n * @returns a promise that resolves when the compilation completes\r\n */\r\n public forceCompilationAsync(mesh: AbstractMesh, options?: Partial): Promise {\r\n return new Promise((resolve, reject) => {\r\n this.forceCompilation(\r\n mesh,\r\n () => {\r\n resolve();\r\n },\r\n options,\r\n (reason) => {\r\n reject(reason);\r\n }\r\n );\r\n });\r\n }\r\n\r\n private static readonly _AllDirtyCallBack = (defines: MaterialDefines) => defines.markAllAsDirty();\r\n private static readonly _ImageProcessingDirtyCallBack = (defines: MaterialDefines) => defines.markAsImageProcessingDirty();\r\n private static readonly _TextureDirtyCallBack = (defines: MaterialDefines) => defines.markAsTexturesDirty();\r\n private static readonly _FresnelDirtyCallBack = (defines: MaterialDefines) => defines.markAsFresnelDirty();\r\n private static readonly _MiscDirtyCallBack = (defines: MaterialDefines) => defines.markAsMiscDirty();\r\n private static readonly _PrePassDirtyCallBack = (defines: MaterialDefines) => defines.markAsPrePassDirty();\r\n private static readonly _LightsDirtyCallBack = (defines: MaterialDefines) => defines.markAsLightDirty();\r\n private static readonly _AttributeDirtyCallBack = (defines: MaterialDefines) => defines.markAsAttributesDirty();\r\n\r\n private static _FresnelAndMiscDirtyCallBack = (defines: MaterialDefines) => {\r\n Material._FresnelDirtyCallBack(defines);\r\n Material._MiscDirtyCallBack(defines);\r\n };\r\n\r\n private static _TextureAndMiscDirtyCallBack = (defines: MaterialDefines) => {\r\n Material._TextureDirtyCallBack(defines);\r\n Material._MiscDirtyCallBack(defines);\r\n };\r\n\r\n private static readonly _DirtyCallbackArray: Array<(defines: MaterialDefines) => void> = [];\r\n private static readonly _RunDirtyCallBacks = (defines: MaterialDefines) => {\r\n for (const cb of Material._DirtyCallbackArray) {\r\n cb(defines);\r\n }\r\n };\r\n\r\n /**\r\n * Marks a define in the material to indicate that it needs to be re-computed\r\n * @param flag defines a flag used to determine which parts of the material have to be marked as dirty\r\n */\r\n public markAsDirty(flag: number): void {\r\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism) {\r\n return;\r\n }\r\n\r\n Material._DirtyCallbackArray.length = 0;\r\n\r\n if (flag & Material.TextureDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._TextureDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.LightDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._LightsDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.FresnelDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._FresnelDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.AttributesDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._AttributeDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.MiscDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._MiscDirtyCallBack);\r\n }\r\n\r\n if (flag & Material.PrePassDirtyFlag) {\r\n Material._DirtyCallbackArray.push(Material._PrePassDirtyCallBack);\r\n }\r\n\r\n if (Material._DirtyCallbackArray.length) {\r\n this._markAllSubMeshesAsDirty(Material._RunDirtyCallBacks);\r\n }\r\n\r\n this.getScene().resetCachedMaterial();\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache for all submeshes that are using this material\r\n */\r\n public resetDrawCache(): void {\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n if (subMesh.getMaterial() !== this) {\r\n continue;\r\n }\r\n\r\n subMesh.resetDrawCache();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Marks all submeshes of a material to indicate that their material defines need to be re-calculated\r\n * @param func defines a function which checks material defines against the submeshes\r\n */\r\n protected _markAllSubMeshesAsDirty(func: (defines: MaterialDefines) => void) {\r\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism) {\r\n return;\r\n }\r\n\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n // We want to skip the submeshes which are not using this material or which have not yet rendered at least once\r\n if (subMesh.getMaterial(false) !== this) {\r\n continue;\r\n }\r\n\r\n for (const drawWrapper of subMesh._drawWrappers) {\r\n if (!drawWrapper || !drawWrapper.defines || !(drawWrapper.defines as MaterialDefines).markAllAsDirty) {\r\n continue;\r\n }\r\n if (this._materialContext === drawWrapper.materialContext) {\r\n func(drawWrapper.defines as MaterialDefines);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Indicates that the scene should check if the rendering now needs a prepass\r\n */\r\n protected _markScenePrePassDirty() {\r\n if (this.getScene().blockMaterialDirtyMechanism || this._blockDirtyMechanism) {\r\n return;\r\n }\r\n\r\n const prePassRenderer = this.getScene().enablePrePassRenderer();\r\n if (prePassRenderer) {\r\n prePassRenderer.markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Indicates that we need to re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsAllDirty() {\r\n this._markAllSubMeshesAsDirty(Material._AllDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that image processing needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsImageProcessingDirty() {\r\n this._markAllSubMeshesAsDirty(Material._ImageProcessingDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that textures need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsTexturesDirty() {\r\n this._markAllSubMeshesAsDirty(Material._TextureDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that fresnel needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsFresnelDirty() {\r\n this._markAllSubMeshesAsDirty(Material._FresnelDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that fresnel and misc need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsFresnelAndMiscDirty() {\r\n this._markAllSubMeshesAsDirty(Material._FresnelAndMiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that lights need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsLightsDirty() {\r\n this._markAllSubMeshesAsDirty(Material._LightsDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that attributes need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsAttributesDirty() {\r\n this._markAllSubMeshesAsDirty(Material._AttributeDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that misc needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsMiscDirty() {\r\n this._markAllSubMeshesAsDirty(Material._MiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that prepass needs to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsPrePassDirty() {\r\n this._markAllSubMeshesAsDirty(Material._MiscDirtyCallBack);\r\n }\r\n\r\n /**\r\n * Indicates that textures and misc need to be re-calculated for all submeshes\r\n */\r\n protected _markAllSubMeshesAsTexturesAndMiscDirty() {\r\n this._markAllSubMeshesAsDirty(Material._TextureAndMiscDirtyCallBack);\r\n }\r\n\r\n protected _checkScenePerformancePriority() {\r\n if (this._scene.performancePriority !== ScenePerformancePriority.BackwardCompatible) {\r\n this.checkReadyOnlyOnce = true;\r\n // re-set the flag when the perf priority changes\r\n const observer = this._scene.onScenePerformancePriorityChangedObservable.addOnce(() => {\r\n this.checkReadyOnlyOnce = false;\r\n });\r\n // if this material is disposed before the scene is disposed, cleanup the observer\r\n this.onDisposeObservable.add(() => {\r\n this._scene.onScenePerformancePriorityChangedObservable.remove(observer);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Sets the required values to the prepass renderer.\r\n * @param prePassRenderer defines the prepass renderer to setup.\r\n * @returns true if the pre pass is needed.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean {\r\n // Do Nothing by default\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the material\r\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\r\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\r\n * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh\r\n */\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean): void {\r\n const scene = this.getScene();\r\n // Animations\r\n scene.stopAnimation(this);\r\n scene.freeProcessedMaterials();\r\n\r\n // Remove from scene\r\n scene.removeMaterial(this);\r\n\r\n this._eventInfo.forceDisposeTextures = forceDisposeTextures;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.Disposed, this._eventInfo);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.materials.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.materials.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n if (notBoundToMesh !== true) {\r\n // Remove from meshes\r\n if (this.meshMap) {\r\n for (const meshId in this.meshMap) {\r\n const mesh = this.meshMap[meshId];\r\n if (mesh) {\r\n mesh.material = null; // will set the entry in the map to undefined\r\n this.releaseVertexArrayObject(mesh, forceDisposeEffect);\r\n }\r\n }\r\n } else {\r\n const meshes = scene.meshes;\r\n for (const mesh of meshes) {\r\n if (mesh.material === this && !(mesh as InstancedMesh).sourceMesh) {\r\n mesh.material = null;\r\n this.releaseVertexArrayObject(mesh, forceDisposeEffect);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._uniformBuffer.dispose();\r\n\r\n // Shader are kept in cache for further use but we can get rid of this by using forceDisposeEffect\r\n if (forceDisposeEffect && this._drawWrapper.effect) {\r\n if (!this._storeEffectOnSubMeshes) {\r\n this._drawWrapper.effect.dispose();\r\n }\r\n\r\n this._drawWrapper.effect = null;\r\n }\r\n\r\n this.metadata = null;\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n\r\n this.onDisposeObservable.clear();\r\n if (this._onBindObservable) {\r\n this._onBindObservable.clear();\r\n }\r\n\r\n if (this._onUnBindObservable) {\r\n this._onUnBindObservable.clear();\r\n }\r\n\r\n if (this._onEffectCreatedObservable) {\r\n this._onEffectCreatedObservable.clear();\r\n }\r\n\r\n if (this._eventInfo) {\r\n this._eventInfo = {} as any;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private releaseVertexArrayObject(mesh: AbstractMesh, forceDisposeEffect?: boolean) {\r\n const geometry = (mesh).geometry;\r\n if (geometry) {\r\n if (this._storeEffectOnSubMeshes) {\r\n if (mesh.subMeshes) {\r\n for (const subMesh of mesh.subMeshes) {\r\n geometry._releaseVertexArrayObject(subMesh.effect);\r\n if (forceDisposeEffect && subMesh.effect) {\r\n subMesh.effect.dispose();\r\n }\r\n }\r\n }\r\n } else {\r\n geometry._releaseVertexArrayObject(this._drawWrapper.effect);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Serializes this material\r\n * @returns the serialized material object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n\r\n serializationObject.stencil = this.stencil.serialize();\r\n serializationObject.uniqueId = this.uniqueId;\r\n\r\n this._serializePlugins(serializationObject);\r\n\r\n return serializationObject;\r\n }\r\n\r\n protected _serializePlugins(serializationObject: any) {\r\n serializationObject.plugins = {};\r\n\r\n if (this.pluginManager) {\r\n for (const plugin of this.pluginManager._plugins) {\r\n serializationObject.plugins[plugin.getClassName()] = plugin.serialize();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a material from parsed material data\r\n * @param parsedMaterial defines parsed material data\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures\r\n * @returns a new material\r\n */\r\n public static Parse(parsedMaterial: any, scene: Scene, rootUrl: string): Nullable {\r\n if (!parsedMaterial.customType) {\r\n parsedMaterial.customType = \"BABYLON.StandardMaterial\";\r\n } else if (parsedMaterial.customType === \"BABYLON.PBRMaterial\" && parsedMaterial.overloadedAlbedo) {\r\n parsedMaterial.customType = \"BABYLON.LegacyPBRMaterial\";\r\n if (!BABYLON.LegacyPBRMaterial) {\r\n Logger.Error(\"Your scene is trying to load a legacy version of the PBRMaterial, please, include it from the materials library.\");\r\n return null;\r\n }\r\n }\r\n\r\n const materialType = Tools.Instantiate(parsedMaterial.customType);\r\n const material = materialType.Parse(parsedMaterial, scene, rootUrl);\r\n material._loadedUniqueId = parsedMaterial.uniqueId;\r\n\r\n return material;\r\n }\r\n\r\n protected static _ParsePlugins(serializationObject: any, material: Material, scene: Scene, rootUrl: string) {\r\n if (!serializationObject.plugins) {\r\n return;\r\n }\r\n\r\n for (const pluginClassName in serializationObject.plugins) {\r\n const pluginData = serializationObject.plugins[pluginClassName];\r\n\r\n let plugin = material.pluginManager?.getPlugin(pluginData.name);\r\n\r\n if (!plugin) {\r\n const pluginClassType = Tools.Instantiate(\"BABYLON.\" + pluginClassName);\r\n if (pluginClassType) {\r\n plugin = new pluginClassType(material);\r\n }\r\n }\r\n\r\n plugin?.parse(pluginData, scene, rootUrl);\r\n }\r\n }\r\n}\r\n", "import type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { ISceneComponent } from \"../sceneComponent\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport type { Layer } from \"./layer\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\ndeclare module \"../abstractScene\" {\r\n export interface AbstractScene {\r\n /**\r\n * The list of layers (background and foreground) of the scene\r\n */\r\n layers: Array;\r\n }\r\n}\r\n\r\n/**\r\n * Defines the layer scene component responsible to manage any layers\r\n * in a given scene.\r\n */\r\nexport class LayerSceneComponent implements ISceneComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_LAYER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n private _engine: Engine;\r\n\r\n /**\r\n * Creates a new instance of the component for the given scene\r\n * @param scene Defines the scene to register the component in\r\n */\r\n constructor(scene?: Scene) {\r\n this.scene = scene || EngineStore.LastCreatedScene;\r\n if (!this.scene) {\r\n return;\r\n }\r\n this._engine = this.scene.getEngine();\r\n this.scene.layers = [] as Layer[];\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {\r\n this.scene._beforeCameraDrawStage.registerStep(SceneComponentConstants.STEP_BEFORECAMERADRAW_LAYER, this, this._drawCameraBackground);\r\n this.scene._afterCameraDrawStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERADRAW_LAYER, this, this._drawCameraForegroundWithPostProcessing);\r\n this.scene._afterCameraPostProcessStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERAPOSTPROCESS_LAYER, this, this._drawCameraForegroundWithoutPostProcessing);\r\n\r\n this.scene._beforeRenderTargetDrawStage.registerStep(SceneComponentConstants.STEP_BEFORERENDERTARGETDRAW_LAYER, this, this._drawRenderTargetBackground);\r\n this.scene._afterRenderTargetDrawStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERTARGETDRAW_LAYER, this, this._drawRenderTargetForegroundWithPostProcessing);\r\n this.scene._afterRenderTargetPostProcessStage.registerStep(\r\n SceneComponentConstants.STEP_AFTERRENDERTARGETPOSTPROCESS_LAYER,\r\n this,\r\n this._drawRenderTargetForegroundWithoutPostProcessing\r\n );\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n const layers = this.scene.layers;\r\n\r\n for (const layer of layers) {\r\n layer._rebuild();\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources.\r\n */\r\n public dispose(): void {\r\n const layers = this.scene.layers;\r\n\r\n while (layers.length) {\r\n layers[0].dispose();\r\n }\r\n }\r\n\r\n private _draw(predicate: (layer: Layer) => boolean): void {\r\n const layers = this.scene.layers;\r\n\r\n if (layers.length) {\r\n this._engine.setDepthBuffer(false);\r\n for (const layer of layers) {\r\n if (predicate(layer)) {\r\n layer.render();\r\n }\r\n }\r\n this._engine.setDepthBuffer(true);\r\n }\r\n }\r\n\r\n private _drawCameraPredicate(layer: Layer, isBackground: boolean, applyPostProcess: boolean, cameraLayerMask: number): boolean {\r\n return (\r\n !layer.renderOnlyInRenderTargetTextures &&\r\n layer.isBackground === isBackground &&\r\n layer.applyPostProcess === applyPostProcess &&\r\n (layer.layerMask & cameraLayerMask) !== 0\r\n );\r\n }\r\n\r\n private _drawCameraBackground(camera: Camera): void {\r\n this._draw((layer: Layer) => {\r\n return this._drawCameraPredicate(layer, true, true, camera.layerMask);\r\n });\r\n }\r\n\r\n private _drawCameraForegroundWithPostProcessing(camera: Camera): void {\r\n this._draw((layer: Layer) => {\r\n return this._drawCameraPredicate(layer, false, true, camera.layerMask);\r\n });\r\n }\r\n\r\n private _drawCameraForegroundWithoutPostProcessing(camera: Camera): void {\r\n this._draw((layer: Layer) => {\r\n return this._drawCameraPredicate(layer, false, false, camera.layerMask);\r\n });\r\n }\r\n\r\n private _drawRenderTargetPredicate(layer: Layer, isBackground: boolean, applyPostProcess: boolean, cameraLayerMask: number, renderTargetTexture: RenderTargetTexture): boolean {\r\n return (\r\n layer.renderTargetTextures.length > 0 &&\r\n layer.isBackground === isBackground &&\r\n layer.applyPostProcess === applyPostProcess &&\r\n layer.renderTargetTextures.indexOf(renderTargetTexture) > -1 &&\r\n (layer.layerMask & cameraLayerMask) !== 0\r\n );\r\n }\r\n\r\n private _drawRenderTargetBackground(renderTarget: RenderTargetTexture): void {\r\n this._draw((layer: Layer) => {\r\n return this._drawRenderTargetPredicate(layer, true, true, this.scene.activeCamera!.layerMask, renderTarget);\r\n });\r\n }\r\n\r\n private _drawRenderTargetForegroundWithPostProcessing(renderTarget: RenderTargetTexture): void {\r\n this._draw((layer: Layer) => {\r\n return this._drawRenderTargetPredicate(layer, false, true, this.scene.activeCamera!.layerMask, renderTarget);\r\n });\r\n }\r\n\r\n private _drawRenderTargetForegroundWithoutPostProcessing(renderTarget: RenderTargetTexture): void {\r\n this._draw((layer: Layer) => {\r\n return this._drawRenderTargetPredicate(layer, false, false, this.scene.activeCamera!.layerMask, renderTarget);\r\n });\r\n }\r\n\r\n /**\r\n * Adds all the elements from the container to the scene\r\n * @param container the container holding the elements\r\n */\r\n public addFromContainer(container: AbstractScene): void {\r\n if (!container.layers) {\r\n return;\r\n }\r\n container.layers.forEach((layer) => {\r\n this.scene.layers.push(layer);\r\n });\r\n }\r\n\r\n /**\r\n * Removes all the elements in the container from the scene\r\n * @param container contains the elements to remove\r\n * @param dispose if the removed element should be disposed (default: false)\r\n */\r\n public removeFromContainer(container: AbstractScene, dispose = false): void {\r\n if (!container.layers) {\r\n return;\r\n }\r\n container.layers.forEach((layer) => {\r\n const index = this.scene.layers.indexOf(layer);\r\n if (index !== -1) {\r\n this.scene.layers.splice(index, 1);\r\n }\r\n if (dispose) {\r\n layer.dispose();\r\n }\r\n });\r\n }\r\n}\r\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"helperFunctions\";\nconst shader = `const float PI=3.1415926535897932384626433832795;const float RECIPROCAL_PI=0.3183098861837907;const float RECIPROCAL_PI2=0.15915494309189535;const float HALF_MIN=5.96046448e-08; \nconst float LinearEncodePowerApprox=2.2;const float GammaEncodePowerApprox=1.0/LinearEncodePowerApprox;const vec3 LuminanceEncodeApprox=vec3(0.2126,0.7152,0.0722);const float Epsilon=0.0000001;\n#define saturate(x) clamp(x,0.0,1.0)\n#define absEps(x) abs(x)+Epsilon\n#define maxEps(x) max(x,Epsilon)\n#define saturateEps(x) clamp(x,Epsilon,1.0)\nmat3 transposeMat3(mat3 inMatrix) {vec3 i0=inMatrix[0];vec3 i1=inMatrix[1];vec3 i2=inMatrix[2];mat3 outMatrix=mat3(\nvec3(i0.x,i1.x,i2.x),\nvec3(i0.y,i1.y,i2.y),\nvec3(i0.z,i1.z,i2.z)\n);return outMatrix;}\nmat3 inverseMat3(mat3 inMatrix) {float a00=inMatrix[0][0],a01=inMatrix[0][1],a02=inMatrix[0][2];float a10=inMatrix[1][0],a11=inMatrix[1][1],a12=inMatrix[1][2];float a20=inMatrix[2][0],a21=inMatrix[2][1],a22=inMatrix[2][2];float b01=a22*a11-a12*a21;float b11=-a22*a10+a12*a20;float b21=a21*a10-a11*a20;float det=a00*b01+a01*b11+a02*b21;return mat3(b01,(-a22*a01+a02*a21),(a12*a01-a02*a11),\nb11,(a22*a00-a02*a20),(-a12*a00+a02*a10),\nb21,(-a21*a00+a01*a20),(a11*a00-a01*a10))/det;}\n#if USE_EXACT_SRGB_CONVERSIONS\nvec3 toLinearSpaceExact(vec3 color)\n{vec3 nearZeroSection=0.0773993808*color;vec3 remainingSection=pow(0.947867299*(color+vec3(0.055)),vec3(2.4));\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nreturn mix(remainingSection,nearZeroSection,lessThanEqual(color,vec3(0.04045)));\n#else\nreturn\nvec3(\ncolor.r<=0.04045 ? nearZeroSection.r : remainingSection.r,\ncolor.g<=0.04045 ? nearZeroSection.g : remainingSection.g,\ncolor.b<=0.04045 ? nearZeroSection.b : remainingSection.b);\n#endif\n}\nvec3 toGammaSpaceExact(vec3 color)\n{vec3 nearZeroSection=12.92*color;vec3 remainingSection=1.055*pow(color,vec3(0.41666))-vec3(0.055);\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nreturn mix(remainingSection,nearZeroSection,lessThanEqual(color,vec3(0.0031308)));\n#else\nreturn\nvec3(\ncolor.r<=0.0031308 ? nearZeroSection.r : remainingSection.r,\ncolor.g<=0.0031308 ? nearZeroSection.g : remainingSection.g,\ncolor.b<=0.0031308 ? nearZeroSection.b : remainingSection.b);\n#endif\n}\n#endif\nfloat toLinearSpace(float color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nfloat nearZeroSection=0.0773993808*color;float remainingSection=pow(0.947867299*(color+0.055),2.4);return color<=0.04045 ? nearZeroSection : remainingSection;\n#else\nreturn pow(color,LinearEncodePowerApprox);\n#endif\n}\nvec3 toLinearSpace(vec3 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn toLinearSpaceExact(color);\n#else\nreturn pow(color,vec3(LinearEncodePowerApprox));\n#endif\n}\nvec4 toLinearSpace(vec4 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn vec4(toLinearSpaceExact(color.rgb),color.a);\n#else\nreturn vec4(pow(color.rgb,vec3(LinearEncodePowerApprox)),color.a);\n#endif\n}\nfloat toGammaSpace(float color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nfloat nearZeroSection=12.92*color;float remainingSection=1.055*pow(color,0.41666)-0.055;return color<=0.0031308 ? nearZeroSection : remainingSection;\n#else\nreturn pow(color,GammaEncodePowerApprox);\n#endif\n}\nvec3 toGammaSpace(vec3 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn toGammaSpaceExact(color);\n#else\nreturn pow(color,vec3(GammaEncodePowerApprox));\n#endif\n}\nvec4 toGammaSpace(vec4 color)\n{\n#if USE_EXACT_SRGB_CONVERSIONS\nreturn vec4(toGammaSpaceExact(color.rgb),color.a);\n#else\nreturn vec4(pow(color.rgb,vec3(GammaEncodePowerApprox)),color.a);\n#endif\n}\nfloat square(float value)\n{return value*value;}\nvec3 square(vec3 value)\n{return value*value;}\nfloat pow5(float value) {float sq=value*value;return sq*sq*value;}\nfloat getLuminance(vec3 color)\n{return clamp(dot(color,LuminanceEncodeApprox),0.,1.);}\nfloat getRand(vec2 seed) {return fract(sin(dot(seed.xy ,vec2(12.9898,78.233)))*43758.5453);}\nfloat dither(vec2 seed,float varianceAmount) {float rand=getRand(seed);float normVariance=varianceAmount/255.0;float dither=mix(-normVariance,normVariance,rand);return dither;}\nconst float rgbdMaxRange=255.0;vec4 toRGBD(vec3 color) {float maxRGB=maxEps(max(color.r,max(color.g,color.b)));float D =max(rgbdMaxRange/maxRGB,1.);D =clamp(floor(D)/255.0,0.,1.);vec3 rgb=color.rgb*D;rgb=toGammaSpace(rgb);return vec4(clamp(rgb,0.,1.),D); }\nvec3 fromRGBD(vec4 rgbd) {rgbd.rgb=toLinearSpace(rgbd.rgb);return rgbd.rgb/rgbd.a;}\nvec3 parallaxCorrectNormal( vec3 vertexPos,vec3 origVec,vec3 cubeSize,vec3 cubePos ) {vec3 invOrigVec=vec3(1.0,1.0,1.0)/origVec;vec3 halfSize=cubeSize*0.5;vec3 intersecAtMaxPlane=(cubePos+halfSize-vertexPos)*invOrigVec;vec3 intersecAtMinPlane=(cubePos-halfSize-vertexPos)*invOrigVec;vec3 largestIntersec=max(intersecAtMaxPlane,intersecAtMinPlane);float distance=min(min(largestIntersec.x,largestIntersec.y),largestIntersec.z);vec3 intersectPositionWS=vertexPos+origVec*distance;return intersectPositionWS-cubePos;}\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const helperFunctions = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/helperFunctions\";\n\nconst name = \"layerPixelShader\";\nconst shader = `varying vec2 vUV;uniform sampler2D textureSampler;uniform vec4 color;\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\nvec4 baseColor=texture2D(textureSampler,vUV);\n#ifdef LINEAR\nbaseColor.rgb=toGammaSpace(baseColor.rgb);\n#endif\n#ifdef ALPHATEST\nif (baseColor.a<0.4)\ndiscard;\n#endif\ngl_FragColor=baseColor*color;\n#define CUSTOM_FRAGMENT_MAIN_END\n}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const layerPixelShader = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"layerVertexShader\";\nconst shader = `attribute vec2 position;uniform vec2 scale;uniform vec2 offset;uniform mat4 textureMatrix;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5);\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvec2 shiftedPosition=position*scale+offset;vUV=vec2(textureMatrix*vec4(shiftedPosition*madd+madd,1.0,0.0));gl_Position=vec4(shiftedPosition,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const layerVertexShader = { name, shader };\n", "import type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Vector2 } from \"../Maths/math.vector\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { LayerSceneComponent } from \"./layerSceneComponent\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\nimport \"../Shaders/layer.fragment\";\r\nimport \"../Shaders/layer.vertex\";\r\n\r\n/**\r\n * This represents a full screen 2d layer.\r\n * This can be useful to display a picture in the background of your scene for instance.\r\n * @see https://www.babylonjs-playground.com/#08A2BS#1\r\n */\r\nexport class Layer {\r\n /**\r\n * Define the texture the layer should display.\r\n */\r\n public texture: Nullable;\r\n\r\n /**\r\n * Is the layer in background or foreground.\r\n */\r\n public isBackground: boolean;\r\n\r\n private _applyPostProcess: boolean = true;\r\n /**\r\n * Determines if the layer is drawn before (true) or after (false) post-processing.\r\n * If the layer is background, it is always before.\r\n */\r\n public set applyPostProcess(value: boolean) {\r\n this._applyPostProcess = value;\r\n }\r\n public get applyPostProcess(): boolean {\r\n return this.isBackground || this._applyPostProcess;\r\n }\r\n\r\n /**\r\n * Define the color of the layer (instead of texture).\r\n */\r\n public color: Color4;\r\n\r\n /**\r\n * Define the scale of the layer in order to zoom in out of the texture.\r\n */\r\n public scale = new Vector2(1, 1);\r\n\r\n /**\r\n * Define an offset for the layer in order to shift the texture.\r\n */\r\n public offset = new Vector2(0, 0);\r\n\r\n /**\r\n * Define the alpha blending mode used in the layer in case the texture or color has an alpha.\r\n */\r\n public alphaBlendingMode = Constants.ALPHA_COMBINE;\r\n\r\n /**\r\n * Define if the layer should alpha test or alpha blend with the rest of the scene.\r\n * Alpha test will not mix with the background color in case of transparency.\r\n * It will either use the texture color or the background depending on the alpha value of the current pixel.\r\n */\r\n public alphaTest: boolean;\r\n\r\n /**\r\n * Define a mask to restrict the layer to only some of the scene cameras.\r\n */\r\n public layerMask: number = 0x0fffffff;\r\n\r\n /**\r\n * Define the list of render target the layer is visible into.\r\n */\r\n public renderTargetTextures: RenderTargetTexture[] = [];\r\n\r\n /**\r\n * Define if the layer is only used in renderTarget or if it also\r\n * renders in the main frame buffer of the canvas.\r\n */\r\n public renderOnlyInRenderTargetTextures = false;\r\n\r\n /**\r\n * Define if the layer is enabled (ie. should be displayed). Default: true\r\n */\r\n public isEnabled = true;\r\n\r\n private _scene: Scene;\r\n private _vertexBuffers: { [key: string]: Nullable } = {};\r\n private _indexBuffer: Nullable;\r\n private _drawWrapper: DrawWrapper;\r\n private _previousDefines: string;\r\n\r\n /**\r\n * An event triggered when the layer is disposed.\r\n */\r\n public onDisposeObservable = new Observable();\r\n\r\n private _onDisposeObserver: Nullable>;\r\n /**\r\n * Back compatibility with callback before the onDisposeObservable existed.\r\n * The set callback will be triggered when the layer has been disposed.\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered before rendering the scene\r\n */\r\n public onBeforeRenderObservable = new Observable();\r\n\r\n private _onBeforeRenderObserver: Nullable>;\r\n /**\r\n * Back compatibility with callback before the onBeforeRenderObservable existed.\r\n * The set callback will be triggered just before rendering the layer.\r\n */\r\n public set onBeforeRender(callback: () => void) {\r\n if (this._onBeforeRenderObserver) {\r\n this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n }\r\n this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered after rendering the scene\r\n */\r\n public onAfterRenderObservable = new Observable();\r\n\r\n private _onAfterRenderObserver: Nullable>;\r\n /**\r\n * Back compatibility with callback before the onAfterRenderObservable existed.\r\n * The set callback will be triggered just after rendering the layer.\r\n */\r\n public set onAfterRender(callback: () => void) {\r\n if (this._onAfterRenderObserver) {\r\n this.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n }\r\n this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Instantiates a new layer.\r\n * This represents a full screen 2d layer.\r\n * This can be useful to display a picture in the background of your scene for instance.\r\n * @see https://www.babylonjs-playground.com/#08A2BS#1\r\n * @param name Define the name of the layer in the scene\r\n * @param imgUrl Define the url of the texture to display in the layer\r\n * @param scene Define the scene the layer belongs to\r\n * @param isBackground Defines whether the layer is displayed in front or behind the scene\r\n * @param color Defines a color for the layer\r\n */\r\n constructor(\r\n /**\r\n * Define the name of the layer.\r\n */\r\n public name: string,\r\n imgUrl: Nullable,\r\n scene: Nullable,\r\n isBackground?: boolean,\r\n color?: Color4\r\n ) {\r\n this.texture = imgUrl ? new Texture(imgUrl, scene, true) : null;\r\n this.isBackground = isBackground === undefined ? true : isBackground;\r\n this.color = color === undefined ? new Color4(1, 1, 1, 1) : color;\r\n\r\n this._scene = (scene || EngineStore.LastCreatedScene);\r\n let layerComponent = this._scene._getComponent(SceneComponentConstants.NAME_LAYER) as LayerSceneComponent;\r\n if (!layerComponent) {\r\n layerComponent = new LayerSceneComponent(this._scene);\r\n this._scene._addComponent(layerComponent);\r\n }\r\n this._scene.layers.push(this);\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n this._drawWrapper = new DrawWrapper(engine);\r\n\r\n // VBO\r\n const vertices = [];\r\n vertices.push(1, 1);\r\n vertices.push(-1, 1);\r\n vertices.push(-1, -1);\r\n vertices.push(1, -1);\r\n\r\n const vertexBuffer = new VertexBuffer(engine, vertices, VertexBuffer.PositionKind, false, false, 2);\r\n this._vertexBuffers[VertexBuffer.PositionKind] = vertexBuffer;\r\n\r\n this._createIndexBuffer();\r\n }\r\n\r\n private _createIndexBuffer(): void {\r\n const engine = this._scene.getEngine();\r\n\r\n // Indices\r\n const indices = [];\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n const vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n\r\n if (vb) {\r\n vb._rebuild();\r\n }\r\n\r\n this._createIndexBuffer();\r\n }\r\n\r\n /**\r\n * Checks if the layer is ready to be rendered\r\n * @returns true if the layer is ready. False otherwise.\r\n */\r\n public isReady() {\r\n const engine = this._scene.getEngine();\r\n\r\n let defines = \"\";\r\n\r\n if (this.alphaTest) {\r\n defines = \"#define ALPHATEST\";\r\n }\r\n\r\n if (this.texture && !this.texture.gammaSpace) {\r\n defines += \"\\n#define LINEAR\";\r\n }\r\n\r\n if (this._previousDefines !== defines) {\r\n this._previousDefines = defines;\r\n this._drawWrapper.effect = engine.createEffect(\"layer\", [VertexBuffer.PositionKind], [\"textureMatrix\", \"color\", \"scale\", \"offset\"], [\"textureSampler\"], defines);\r\n }\r\n\r\n const currentEffect = this._drawWrapper.effect;\r\n\r\n return currentEffect?.isReady() && this.texture?.isReady();\r\n }\r\n\r\n /**\r\n * Renders the layer in the scene.\r\n */\r\n public render(): void {\r\n if (!this.isEnabled) {\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n // Check\r\n if (!this.isReady()) {\r\n return;\r\n }\r\n\r\n const currentEffect = this._drawWrapper.effect!;\r\n\r\n this.onBeforeRenderObservable.notifyObservers(this);\r\n\r\n // Render\r\n engine.enableEffect(this._drawWrapper);\r\n engine.setState(false);\r\n\r\n // Texture\r\n currentEffect.setTexture(\"textureSampler\", this.texture);\r\n currentEffect.setMatrix(\"textureMatrix\", this.texture!.getTextureMatrix());\r\n\r\n // Color\r\n currentEffect.setFloat4(\"color\", this.color.r, this.color.g, this.color.b, this.color.a);\r\n\r\n // Scale / offset\r\n currentEffect.setVector2(\"offset\", this.offset);\r\n currentEffect.setVector2(\"scale\", this.scale);\r\n\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, currentEffect);\r\n\r\n // Draw order\r\n if (!this.alphaTest) {\r\n engine.setAlphaMode(this.alphaBlendingMode);\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n } else {\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n }\r\n\r\n this.onAfterRenderObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Disposes and releases the associated resources.\r\n */\r\n public dispose(): void {\r\n const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vertexBuffer) {\r\n vertexBuffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._scene.getEngine()._releaseBuffer(this._indexBuffer);\r\n this._indexBuffer = null;\r\n }\r\n\r\n if (this.texture) {\r\n this.texture.dispose();\r\n this.texture = null;\r\n }\r\n\r\n // Clean RTT list\r\n this.renderTargetTextures = [];\r\n\r\n // Remove from scene\r\n const index = this._scene.layers.indexOf(this);\r\n this._scene.layers.splice(index, 1);\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n\r\n this.onDisposeObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onBeforeRenderObservable.clear();\r\n }\r\n}\r\n", "import type { IViewportLike } from \"./math.like\";\r\n\r\n/**\r\n * Class used to represent a viewport on screen\r\n */\r\nexport class Viewport implements IViewportLike {\r\n /**\r\n * Creates a Viewport object located at (x, y) and sized (width, height)\r\n * @param x defines viewport left coordinate\r\n * @param y defines viewport top coordinate\r\n * @param width defines the viewport width\r\n * @param height defines the viewport height\r\n */\r\n constructor(\r\n /** viewport left coordinate */\r\n public x: number,\r\n /** viewport top coordinate */\r\n public y: number,\r\n /**viewport width */\r\n public width: number,\r\n /** viewport height */\r\n public height: number\r\n ) {}\r\n\r\n /**\r\n * Creates a new viewport using absolute sizing (from 0-> width, 0-> height instead of 0->1)\r\n * @param renderWidth defines the rendering width\r\n * @param renderHeight defines the rendering height\r\n * @returns a new Viewport\r\n */\r\n public toGlobal(renderWidth: number, renderHeight: number): Viewport {\r\n return new Viewport(this.x * renderWidth, this.y * renderHeight, this.width * renderWidth, this.height * renderHeight);\r\n }\r\n\r\n /**\r\n * Stores absolute viewport value into a target viewport (from 0-> width, 0-> height instead of 0->1)\r\n * @param renderWidth defines the rendering width\r\n * @param renderHeight defines the rendering height\r\n * @param ref defines the target viewport\r\n * @returns the current viewport\r\n */\r\n public toGlobalToRef(renderWidth: number, renderHeight: number, ref: Viewport): Viewport {\r\n ref.x = this.x * renderWidth;\r\n ref.y = this.y * renderHeight;\r\n ref.width = this.width * renderWidth;\r\n ref.height = this.height * renderHeight;\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a new Viewport copied from the current one\r\n * @returns a new Viewport\r\n */\r\n public clone(): Viewport {\r\n return new Viewport(this.x, this.y, this.width, this.height);\r\n }\r\n}\r\n", "import { serialize, serializeAsVector3 } from \"../Misc/decorators\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { DeepImmutable, Nullable } from \"../types\";\r\nimport type { CameraInputsManager } from \"./cameraInputsManager\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Matrix, Vector3, Quaternion } from \"../Maths/math.vector\";\r\nimport { Node } from \"../node\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { ICullable } from \"../Culling/boundingInfo\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { GetClass } from \"../Misc/typeStore\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { Frustum } from \"../Maths/math.frustum\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\nimport type { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { FreeCamera } from \"./freeCamera\";\r\nimport type { TargetCamera } from \"./targetCamera\";\r\nimport type { Ray } from \"../Culling/ray\";\r\nimport type { ArcRotateCamera } from \"./arcRotateCamera\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\n\r\n/**\r\n * Oblique projection values\r\n */\r\nexport interface IObliqueParams {\r\n /** The angle of the plane */\r\n angle: number;\r\n /** The length of the plane */\r\n length: number;\r\n /** The offset of the plane */\r\n offset: number;\r\n}\r\n\r\n/**\r\n * This is the base class of all the camera used in the application.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras\r\n */\r\nexport class Camera extends Node {\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _CreateDefaultParsedCamera = (name: string, scene: Scene): Camera => {\r\n throw _WarnImport(\"UniversalCamera\");\r\n };\r\n\r\n /**\r\n * This is the default projection mode used by the cameras.\r\n * It helps recreating a feeling of perspective and better appreciate depth.\r\n * This is the best way to simulate real life cameras.\r\n */\r\n public static readonly PERSPECTIVE_CAMERA = Constants.PERSPECTIVE_CAMERA;\r\n /**\r\n * This helps creating camera with an orthographic mode.\r\n * Orthographic is commonly used in engineering as a means to produce object specifications that communicate dimensions unambiguously, each line of 1 unit length (cm, meter..whatever) will appear to have the same length everywhere on the drawing. This allows the drafter to dimension only a subset of lines and let the reader know that other lines of that length on the drawing are also that length in reality. Every parallel line in the drawing is also parallel in the object.\r\n */\r\n public static readonly ORTHOGRAPHIC_CAMERA = Constants.ORTHOGRAPHIC_CAMERA;\r\n\r\n /**\r\n * This is the default FOV mode for perspective cameras.\r\n * This setting aligns the upper and lower bounds of the viewport to the upper and lower bounds of the camera frustum.\r\n */\r\n public static readonly FOVMODE_VERTICAL_FIXED = Constants.FOVMODE_VERTICAL_FIXED;\r\n /**\r\n * This setting aligns the left and right bounds of the viewport to the left and right bounds of the camera frustum.\r\n */\r\n public static readonly FOVMODE_HORIZONTAL_FIXED = Constants.FOVMODE_HORIZONTAL_FIXED;\r\n\r\n /**\r\n * This specifies there is no need for a camera rig.\r\n * Basically only one eye is rendered corresponding to the camera.\r\n */\r\n public static readonly RIG_MODE_NONE = Constants.RIG_MODE_NONE;\r\n /**\r\n * Simulates a camera Rig with one blue eye and one red eye.\r\n * This can be use with 3d blue and red glasses.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_ANAGLYPH = Constants.RIG_MODE_STEREOSCOPIC_ANAGLYPH;\r\n /**\r\n * Defines that both eyes of the camera will be rendered side by side with a parallel target.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL = Constants.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL;\r\n /**\r\n * Defines that both eyes of the camera will be rendered side by side with a none parallel target.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED = Constants.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED;\r\n /**\r\n * Defines that both eyes of the camera will be rendered over under each other.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_OVERUNDER = Constants.RIG_MODE_STEREOSCOPIC_OVERUNDER;\r\n /**\r\n * Defines that both eyes of the camera will be rendered on successive lines interlaced for passive 3d monitors.\r\n */\r\n public static readonly RIG_MODE_STEREOSCOPIC_INTERLACED = Constants.RIG_MODE_STEREOSCOPIC_INTERLACED;\r\n /**\r\n * Defines that both eyes of the camera should be renderered in a VR mode (carbox).\r\n */\r\n public static readonly RIG_MODE_VR = Constants.RIG_MODE_VR;\r\n /**\r\n * Custom rig mode allowing rig cameras to be populated manually with any number of cameras\r\n */\r\n public static readonly RIG_MODE_CUSTOM = Constants.RIG_MODE_CUSTOM;\r\n\r\n /**\r\n * Defines if by default attaching controls should prevent the default javascript event to continue.\r\n */\r\n public static ForceAttachControlToAlwaysPreventDefault = false;\r\n\r\n /**\r\n * Define the input manager associated with the camera.\r\n */\r\n public inputs: CameraInputsManager;\r\n\r\n /** @internal */\r\n @serializeAsVector3(\"position\")\r\n public _position = Vector3.Zero();\r\n\r\n /**\r\n * Define the current local position of the camera in the scene\r\n */\r\n public get position(): Vector3 {\r\n return this._position;\r\n }\r\n\r\n public set position(newPosition: Vector3) {\r\n this._position = newPosition;\r\n }\r\n\r\n @serializeAsVector3(\"upVector\")\r\n protected _upVector = Vector3.Up();\r\n\r\n /**\r\n * The vector the camera should consider as up.\r\n * (default is Vector3(0, 1, 0) aka Vector3.Up())\r\n */\r\n public set upVector(vec: Vector3) {\r\n this._upVector = vec;\r\n }\r\n\r\n public get upVector() {\r\n return this._upVector;\r\n }\r\n\r\n /**\r\n * Object containing oblique projection values (only used with ORTHOGRAPHIC_CAMERA)\r\n */\r\n public oblique: Nullable = null;\r\n\r\n /**\r\n * The screen area in scene units squared\r\n */\r\n public get screenArea(): number {\r\n let x = 0;\r\n let y = 0;\r\n if (this.mode === Camera.PERSPECTIVE_CAMERA) {\r\n if (this.fovMode === Camera.FOVMODE_VERTICAL_FIXED) {\r\n y = this.minZ * 2 * Math.tan(this.fov / 2);\r\n x = this.getEngine().getAspectRatio(this) * y;\r\n } else {\r\n x = this.minZ * 2 * Math.tan(this.fov / 2);\r\n y = x / this.getEngine().getAspectRatio(this);\r\n }\r\n } else {\r\n const halfWidth = this.getEngine().getRenderWidth() / 2.0;\r\n const halfHeight = this.getEngine().getRenderHeight() / 2.0;\r\n\r\n x = (this.orthoRight ?? halfWidth) - (this.orthoLeft ?? -halfWidth);\r\n y = (this.orthoTop ?? halfHeight) - (this.orthoBottom ?? -halfHeight);\r\n }\r\n\r\n return x * y;\r\n }\r\n\r\n private _orthoLeft: Nullable = null;\r\n\r\n /**\r\n * Define the current limit on the left side for an orthographic camera\r\n * In scene unit\r\n */\r\n public set orthoLeft(value: Nullable) {\r\n this._orthoLeft = value;\r\n\r\n for (const rigCamera of this._rigCameras) {\r\n rigCamera.orthoLeft = value;\r\n }\r\n }\r\n\r\n @serialize()\r\n public get orthoLeft(): Nullable {\r\n return this._orthoLeft;\r\n }\r\n\r\n private _orthoRight: Nullable = null;\r\n\r\n /**\r\n * Define the current limit on the right side for an orthographic camera\r\n * In scene unit\r\n */\r\n public set orthoRight(value: Nullable) {\r\n this._orthoRight = value;\r\n\r\n for (const rigCamera of this._rigCameras) {\r\n rigCamera.orthoRight = value;\r\n }\r\n }\r\n\r\n @serialize()\r\n public get orthoRight(): Nullable {\r\n return this._orthoRight;\r\n }\r\n\r\n private _orthoBottom: Nullable = null;\r\n\r\n /**\r\n * Define the current limit on the bottom side for an orthographic camera\r\n * In scene unit\r\n */\r\n public set orthoBottom(value: Nullable) {\r\n this._orthoBottom = value;\r\n\r\n for (const rigCamera of this._rigCameras) {\r\n rigCamera.orthoBottom = value;\r\n }\r\n }\r\n\r\n @serialize()\r\n public get orthoBottom(): Nullable {\r\n return this._orthoBottom;\r\n }\r\n\r\n private _orthoTop: Nullable = null;\r\n\r\n /**\r\n * Define the current limit on the top side for an orthographic camera\r\n * In scene unit\r\n */\r\n public set orthoTop(value: Nullable) {\r\n this._orthoTop = value;\r\n\r\n for (const rigCamera of this._rigCameras) {\r\n rigCamera.orthoTop = value;\r\n }\r\n }\r\n\r\n @serialize()\r\n public get orthoTop(): Nullable {\r\n return this._orthoTop;\r\n }\r\n\r\n /**\r\n * Field Of View is set in Radians. (default is 0.8)\r\n */\r\n @serialize()\r\n public fov = 0.8;\r\n\r\n /**\r\n * Projection plane tilt around the X axis (horizontal), set in Radians. (default is 0)\r\n * Can be used to make vertical lines in world space actually vertical on the screen.\r\n * See https://forum.babylonjs.com/t/add-vertical-shift-to-3ds-max-exporter-babylon-cameras/17480\r\n */\r\n @serialize()\r\n public projectionPlaneTilt = 0;\r\n\r\n /**\r\n * Define the minimum distance the camera can see from.\r\n * This is important to note that the depth buffer are not infinite and the closer it starts\r\n * the more your scene might encounter depth fighting issue.\r\n */\r\n @serialize()\r\n public minZ = 1;\r\n\r\n /**\r\n * Define the maximum distance the camera can see to.\r\n * This is important to note that the depth buffer are not infinite and the further it end\r\n * the more your scene might encounter depth fighting issue.\r\n */\r\n @serialize()\r\n public maxZ = 10000.0;\r\n\r\n /**\r\n * Define the default inertia of the camera.\r\n * This helps giving a smooth feeling to the camera movement.\r\n */\r\n @serialize()\r\n public inertia = 0.9;\r\n\r\n private _mode = Camera.PERSPECTIVE_CAMERA;\r\n\r\n /**\r\n * Define the mode of the camera (Camera.PERSPECTIVE_CAMERA or Camera.ORTHOGRAPHIC_CAMERA)\r\n */\r\n set mode(mode: number) {\r\n this._mode = mode;\r\n\r\n // Pass the mode down to the rig cameras\r\n for (const rigCamera of this._rigCameras) {\r\n rigCamera.mode = mode;\r\n }\r\n }\r\n\r\n @serialize()\r\n get mode(): number {\r\n return this._mode;\r\n }\r\n\r\n /**\r\n * Define whether the camera is intermediate.\r\n * This is useful to not present the output directly to the screen in case of rig without post process for instance\r\n */\r\n public isIntermediate = false;\r\n\r\n /**\r\n * Define the viewport of the camera.\r\n * This correspond to the portion of the screen the camera will render to in normalized 0 to 1 unit.\r\n */\r\n public viewport = new Viewport(0, 0, 1.0, 1.0);\r\n\r\n /**\r\n * Restricts the camera to viewing objects with the same layerMask.\r\n * A camera with a layerMask of 1 will render mesh.layerMask & camera.layerMask!== 0\r\n */\r\n @serialize()\r\n public layerMask: number = 0x0fffffff;\r\n\r\n /**\r\n * fovMode sets the camera frustum bounds to the viewport bounds. (default is FOVMODE_VERTICAL_FIXED)\r\n */\r\n @serialize()\r\n public fovMode: number = Camera.FOVMODE_VERTICAL_FIXED;\r\n\r\n /**\r\n * Rig mode of the camera.\r\n * This is useful to create the camera with two \"eyes\" instead of one to create VR or stereoscopic scenes.\r\n * This is normally controlled byt the camera themselves as internal use.\r\n */\r\n @serialize()\r\n public cameraRigMode = Camera.RIG_MODE_NONE;\r\n\r\n /**\r\n * Defines the distance between both \"eyes\" in case of a RIG\r\n */\r\n @serialize()\r\n public interaxialDistance: number;\r\n\r\n /**\r\n * Defines if stereoscopic rendering is done side by side or over under.\r\n */\r\n @serialize()\r\n public isStereoscopicSideBySide: boolean;\r\n\r\n /**\r\n * Defines the list of custom render target which are rendered to and then used as the input to this camera's render. Eg. display another camera view on a TV in the main scene\r\n * This is pretty helpful if you wish to make a camera render to a texture you could reuse somewhere\r\n * else in the scene. (Eg. security camera)\r\n *\r\n * To change the final output target of the camera, camera.outputRenderTarget should be used instead (eg. webXR renders to a render target corresponding to an HMD)\r\n */\r\n public customRenderTargets: RenderTargetTexture[] = [];\r\n /**\r\n * When set, the camera will render to this render target instead of the default canvas\r\n *\r\n * If the desire is to use the output of a camera as a texture in the scene consider using camera.customRenderTargets instead\r\n */\r\n public outputRenderTarget: Nullable = null;\r\n\r\n /**\r\n * Observable triggered when the camera view matrix has changed.\r\n */\r\n public onViewMatrixChangedObservable = new Observable();\r\n /**\r\n * Observable triggered when the camera Projection matrix has changed.\r\n */\r\n public onProjectionMatrixChangedObservable = new Observable();\r\n /**\r\n * Observable triggered when the inputs have been processed.\r\n */\r\n public onAfterCheckInputsObservable = new Observable();\r\n /**\r\n * Observable triggered when reset has been called and applied to the camera.\r\n */\r\n public onRestoreStateObservable = new Observable();\r\n\r\n /**\r\n * Is this camera a part of a rig system?\r\n */\r\n public isRigCamera: boolean = false;\r\n\r\n /**\r\n * If isRigCamera set to true this will be set with the parent camera.\r\n * The parent camera is not (!) necessarily the .parent of this camera (like in the case of XR)\r\n */\r\n public rigParent?: Camera;\r\n\r\n /**\r\n * Render pass id used by the camera to render into the main framebuffer\r\n */\r\n public renderPassId: number;\r\n\r\n private _hasMoved = false;\r\n\r\n /**\r\n * Gets a flag indicating that the camera has moved in some way since the last call to Camera.update()\r\n */\r\n public get hasMoved() {\r\n return this._hasMoved;\r\n }\r\n\r\n /** @internal */\r\n public _cameraRigParams: any;\r\n /** @internal */\r\n public _rigCameras = new Array();\r\n /** @internal */\r\n public _rigPostProcess: Nullable;\r\n\r\n /** @internal */\r\n public _skipRendering = false;\r\n\r\n /** @internal */\r\n public _projectionMatrix = new Matrix();\r\n\r\n /** @internal */\r\n public _postProcesses = new Array>();\r\n\r\n /** @internal */\r\n public _activeMeshes = new SmartArray(256);\r\n\r\n protected _globalPosition = Vector3.Zero();\r\n\r\n /** @internal */\r\n public _computedViewMatrix = Matrix.Identity();\r\n private _doNotComputeProjectionMatrix = false;\r\n private _transformMatrix = Matrix.Zero();\r\n private _frustumPlanes: Plane[];\r\n private _refreshFrustumPlanes = true;\r\n private _storedFov: number;\r\n private _stateStored: boolean;\r\n private _absoluteRotation: Quaternion = Quaternion.Identity();\r\n\r\n /**\r\n * Instantiates a new camera object.\r\n * This should not be used directly but through the inherited cameras: ArcRotate, Free...\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras\r\n * @param name Defines the name of the camera in the scene\r\n * @param position Defines the position of the camera\r\n * @param scene Defines the scene the camera belongs too\r\n * @param setActiveOnSceneIfNoneActive Defines if the camera should be set as active after creation if no other camera have been defined in the scene\r\n */\r\n constructor(name: string, position: Vector3, scene?: Scene, setActiveOnSceneIfNoneActive = true) {\r\n super(name, scene);\r\n\r\n this.getScene().addCamera(this);\r\n\r\n if (setActiveOnSceneIfNoneActive && !this.getScene().activeCamera) {\r\n this.getScene().activeCamera = this;\r\n }\r\n\r\n this.position = position;\r\n this.renderPassId = this.getScene().getEngine().createRenderPassId(`Camera ${name}`);\r\n }\r\n\r\n /**\r\n * Store current camera state (fov, position, etc..)\r\n * @returns the camera\r\n */\r\n public storeState(): Camera {\r\n this._stateStored = true;\r\n this._storedFov = this.fov;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Restores the camera state values if it has been stored. You must call storeState() first\r\n * @returns true if restored and false otherwise\r\n */\r\n protected _restoreStateValues(): boolean {\r\n if (!this._stateStored) {\r\n return false;\r\n }\r\n\r\n this.fov = this._storedFov;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Restored camera state. You must call storeState() first.\r\n * @returns true if restored and false otherwise\r\n */\r\n public restoreState(): boolean {\r\n if (this._restoreStateValues()) {\r\n this.onRestoreStateObservable.notifyObservers(this);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets the class name of the camera.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"Camera\";\r\n }\r\n\r\n /** @internal */\r\n public readonly _isCamera = true;\r\n\r\n /**\r\n * Gets a string representation of the camera useful for debug purpose.\r\n * @param fullDetails Defines that a more verbose level of logging is required\r\n * @returns the string representation\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name;\r\n ret += \", type: \" + this.getClassName();\r\n if (this.animations) {\r\n for (let i = 0; i < this.animations.length; i++) {\r\n ret += \", animation[0]: \" + this.animations[i].toString(fullDetails);\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Automatically tilts the projection plane, using `projectionPlaneTilt`, to correct the perspective effect on vertical lines.\r\n */\r\n public applyVerticalCorrection() {\r\n const rot = this.absoluteRotation.toEulerAngles();\r\n\r\n this.projectionPlaneTilt = this._scene.useRightHandedSystem ? -rot.x : rot.x;\r\n }\r\n\r\n /**\r\n * Gets the current world space position of the camera.\r\n */\r\n public get globalPosition(): Vector3 {\r\n return this._globalPosition;\r\n }\r\n\r\n /**\r\n * Gets the list of active meshes this frame (meshes no culled or excluded by lod s in the frame)\r\n * @returns the active meshe list\r\n */\r\n public getActiveMeshes(): SmartArray {\r\n return this._activeMeshes;\r\n }\r\n\r\n /**\r\n * Check whether a mesh is part of the current active mesh list of the camera\r\n * @param mesh Defines the mesh to check\r\n * @returns true if active, false otherwise\r\n */\r\n public isActiveMesh(mesh: Mesh): boolean {\r\n return this._activeMeshes.indexOf(mesh) !== -1;\r\n }\r\n\r\n /**\r\n * Is this camera ready to be used/rendered\r\n * @param completeCheck defines if a complete check (including post processes) has to be done (false by default)\r\n * @returns true if the camera is ready\r\n */\r\n public isReady(completeCheck = false): boolean {\r\n if (completeCheck) {\r\n for (const pp of this._postProcesses) {\r\n if (pp && !pp.isReady()) {\r\n return false;\r\n }\r\n }\r\n }\r\n return super.isReady(completeCheck);\r\n }\r\n\r\n /** @internal */\r\n public _initCache() {\r\n super._initCache();\r\n\r\n this._cache.position = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n this._cache.upVector = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n\r\n this._cache.mode = undefined;\r\n this._cache.minZ = undefined;\r\n this._cache.maxZ = undefined;\r\n\r\n this._cache.fov = undefined;\r\n this._cache.fovMode = undefined;\r\n this._cache.aspectRatio = undefined;\r\n\r\n this._cache.orthoLeft = undefined;\r\n this._cache.orthoRight = undefined;\r\n this._cache.orthoBottom = undefined;\r\n this._cache.orthoTop = undefined;\r\n this._cache.obliqueAngle = undefined;\r\n this._cache.obliqueLength = undefined;\r\n this._cache.obliqueOffset = undefined;\r\n this._cache.renderWidth = undefined;\r\n this._cache.renderHeight = undefined;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _updateCache(ignoreParentClass?: boolean): void {\r\n if (!ignoreParentClass) {\r\n super._updateCache();\r\n }\r\n\r\n this._cache.position.copyFrom(this.position);\r\n this._cache.upVector.copyFrom(this.upVector);\r\n }\r\n\r\n /** @internal */\r\n public _isSynchronized(): boolean {\r\n return this._isSynchronizedViewMatrix() && this._isSynchronizedProjectionMatrix();\r\n }\r\n\r\n /** @internal */\r\n public _isSynchronizedViewMatrix(): boolean {\r\n if (!super._isSynchronized()) {\r\n return false;\r\n }\r\n\r\n return this._cache.position.equals(this.position) && this._cache.upVector.equals(this.upVector) && this.isSynchronizedWithParent();\r\n }\r\n\r\n /** @internal */\r\n public _isSynchronizedProjectionMatrix(): boolean {\r\n let isSynchronized = this._cache.mode === this.mode && this._cache.minZ === this.minZ && this._cache.maxZ === this.maxZ;\r\n\r\n if (!isSynchronized) {\r\n return false;\r\n }\r\n\r\n const engine = this.getEngine();\r\n\r\n if (this.mode === Camera.PERSPECTIVE_CAMERA) {\r\n isSynchronized =\r\n this._cache.fov === this.fov &&\r\n this._cache.fovMode === this.fovMode &&\r\n this._cache.aspectRatio === engine.getAspectRatio(this) &&\r\n this._cache.projectionPlaneTilt === this.projectionPlaneTilt;\r\n } else {\r\n isSynchronized =\r\n this._cache.orthoLeft === this.orthoLeft &&\r\n this._cache.orthoRight === this.orthoRight &&\r\n this._cache.orthoBottom === this.orthoBottom &&\r\n this._cache.orthoTop === this.orthoTop &&\r\n this._cache.renderWidth === engine.getRenderWidth() &&\r\n this._cache.renderHeight === engine.getRenderHeight();\r\n\r\n if (this.oblique) {\r\n isSynchronized =\r\n isSynchronized &&\r\n this._cache.obliqueAngle === this.oblique.angle &&\r\n this._cache.obliqueLength === this.oblique.length &&\r\n this._cache.obliqueOffset === this.oblique.offset;\r\n }\r\n }\r\n\r\n return isSynchronized;\r\n }\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(noPreventDefault?: boolean): void;\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param ignored defines an ignored parameter kept for backward compatibility.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n * BACK COMPAT SIGNATURE ONLY.\r\n */\r\n public attachControl(ignored: any, noPreventDefault?: boolean): void;\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * This function is here because typescript removes the typing of the last function.\r\n * @param _ignored defines an ignored parameter kept for backward compatibility.\r\n * @param _noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(_ignored?: any, _noPreventDefault?: boolean): void {}\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public detachControl(): void;\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n * @param ignored defines an ignored parameter kept for backward compatibility.\r\n */\r\n public detachControl(ignored?: any): void;\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n * This function is here because typescript removes the typing of the last function.\r\n * @param _ignored defines an ignored parameter kept for backward compatibility.\r\n */\r\n public detachControl(_ignored?: any): void {}\r\n\r\n /**\r\n * Update the camera state according to the different inputs gathered during the frame.\r\n */\r\n public update(): void {\r\n this._hasMoved = false;\r\n this._checkInputs();\r\n if (this.cameraRigMode !== Camera.RIG_MODE_NONE) {\r\n this._updateRigCameras();\r\n }\r\n\r\n // Attempt to update the camera's view and projection matrices.\r\n // This call is being made because these matrices are no longer being updated\r\n // as a part of the picking ray process (in addition to scene.render).\r\n this.getViewMatrix();\r\n this.getProjectionMatrix();\r\n }\r\n\r\n /** @internal */\r\n public _checkInputs(): void {\r\n this.onAfterCheckInputsObservable.notifyObservers(this);\r\n }\r\n\r\n /** @internal */\r\n public get rigCameras(): Camera[] {\r\n return this._rigCameras;\r\n }\r\n\r\n /**\r\n * Gets the post process used by the rig cameras\r\n */\r\n public get rigPostProcess(): Nullable {\r\n return this._rigPostProcess;\r\n }\r\n\r\n /**\r\n * Internal, gets the first post process.\r\n * @returns the first post process to be run on this camera.\r\n */\r\n public _getFirstPostProcess(): Nullable {\r\n for (let ppIndex = 0; ppIndex < this._postProcesses.length; ppIndex++) {\r\n if (this._postProcesses[ppIndex] !== null) {\r\n return this._postProcesses[ppIndex];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _cascadePostProcessesToRigCams(): void {\r\n // invalidate framebuffer\r\n const firstPostProcess = this._getFirstPostProcess();\r\n if (firstPostProcess) {\r\n firstPostProcess.markTextureDirty();\r\n }\r\n\r\n // glue the rigPostProcess to the end of the user postprocesses & assign to each sub-camera\r\n for (let i = 0, len = this._rigCameras.length; i < len; i++) {\r\n const cam = this._rigCameras[i];\r\n const rigPostProcess = cam._rigPostProcess;\r\n\r\n // for VR rig, there does not have to be a post process\r\n if (rigPostProcess) {\r\n const isPass = rigPostProcess.getEffectName() === \"pass\";\r\n if (isPass) {\r\n // any rig which has a PassPostProcess for rig[0], cannot be isIntermediate when there are also user postProcesses\r\n cam.isIntermediate = this._postProcesses.length === 0;\r\n }\r\n cam._postProcesses = this._postProcesses.slice(0).concat(rigPostProcess);\r\n rigPostProcess.markTextureDirty();\r\n } else {\r\n cam._postProcesses = this._postProcesses.slice(0);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Attach a post process to the camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#attach-postprocess\r\n * @param postProcess The post process to attach to the camera\r\n * @param insertAt The position of the post process in case several of them are in use in the scene\r\n * @returns the position the post process has been inserted at\r\n */\r\n public attachPostProcess(postProcess: PostProcess, insertAt: Nullable = null): number {\r\n if (!postProcess.isReusable() && this._postProcesses.indexOf(postProcess) > -1) {\r\n Logger.Error(\"You're trying to reuse a post process not defined as reusable.\");\r\n return 0;\r\n }\r\n\r\n if (insertAt == null || insertAt < 0) {\r\n this._postProcesses.push(postProcess);\r\n } else if (this._postProcesses[insertAt] === null) {\r\n this._postProcesses[insertAt] = postProcess;\r\n } else {\r\n this._postProcesses.splice(insertAt, 0, postProcess);\r\n }\r\n this._cascadePostProcessesToRigCams(); // also ensures framebuffer invalidated\r\n\r\n // Update prePass\r\n if (this._scene.prePassRenderer) {\r\n this._scene.prePassRenderer.markAsDirty();\r\n }\r\n\r\n return this._postProcesses.indexOf(postProcess);\r\n }\r\n\r\n /**\r\n * Detach a post process to the camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#attach-postprocess\r\n * @param postProcess The post process to detach from the camera\r\n */\r\n public detachPostProcess(postProcess: PostProcess): void {\r\n const idx = this._postProcesses.indexOf(postProcess);\r\n if (idx !== -1) {\r\n this._postProcesses[idx] = null;\r\n }\r\n\r\n // Update prePass\r\n if (this._scene.prePassRenderer) {\r\n this._scene.prePassRenderer.markAsDirty();\r\n }\r\n\r\n this._cascadePostProcessesToRigCams(); // also ensures framebuffer invalidated\r\n }\r\n\r\n /**\r\n * Gets the current world matrix of the camera\r\n * @returns the world matrix\r\n */\r\n public getWorldMatrix(): Matrix {\r\n if (this._isSynchronizedViewMatrix()) {\r\n return this._worldMatrix;\r\n }\r\n\r\n // Getting the view matrix will also compute the world matrix.\r\n this.getViewMatrix();\r\n\r\n return this._worldMatrix;\r\n }\r\n\r\n /** @internal */\r\n public _getViewMatrix(): Matrix {\r\n return Matrix.Identity();\r\n }\r\n\r\n /**\r\n * Gets the current view matrix of the camera.\r\n * @param force forces the camera to recompute the matrix without looking at the cached state\r\n * @returns the view matrix\r\n */\r\n public getViewMatrix(force?: boolean): Matrix {\r\n if (!force && this._isSynchronizedViewMatrix()) {\r\n return this._computedViewMatrix;\r\n }\r\n\r\n this._hasMoved = true;\r\n\r\n this.updateCache();\r\n this._computedViewMatrix = this._getViewMatrix();\r\n\r\n this._currentRenderId = this.getScene().getRenderId();\r\n this._childUpdateId++;\r\n\r\n this._refreshFrustumPlanes = true;\r\n\r\n if (this._cameraRigParams && this._cameraRigParams.vrPreViewMatrix) {\r\n this._computedViewMatrix.multiplyToRef(this._cameraRigParams.vrPreViewMatrix, this._computedViewMatrix);\r\n }\r\n\r\n // Notify parent camera if rig camera is changed\r\n if (this.parent && (this.parent as Camera).onViewMatrixChangedObservable) {\r\n (this.parent as Camera).onViewMatrixChangedObservable.notifyObservers(this.parent as Camera);\r\n }\r\n\r\n this.onViewMatrixChangedObservable.notifyObservers(this);\r\n\r\n this._computedViewMatrix.invertToRef(this._worldMatrix);\r\n\r\n return this._computedViewMatrix;\r\n }\r\n\r\n /**\r\n * Freeze the projection matrix.\r\n * It will prevent the cache check of the camera projection compute and can speed up perf\r\n * if no parameter of the camera are meant to change\r\n * @param projection Defines manually a projection if necessary\r\n */\r\n public freezeProjectionMatrix(projection?: Matrix): void {\r\n this._doNotComputeProjectionMatrix = true;\r\n if (projection !== undefined) {\r\n this._projectionMatrix = projection;\r\n }\r\n }\r\n\r\n /**\r\n * Unfreeze the projection matrix if it has previously been freezed by freezeProjectionMatrix.\r\n */\r\n public unfreezeProjectionMatrix(): void {\r\n this._doNotComputeProjectionMatrix = false;\r\n }\r\n\r\n /**\r\n * Gets the current projection matrix of the camera.\r\n * @param force forces the camera to recompute the matrix without looking at the cached state\r\n * @returns the projection matrix\r\n */\r\n public getProjectionMatrix(force?: boolean): Matrix {\r\n if (this._doNotComputeProjectionMatrix || (!force && this._isSynchronizedProjectionMatrix())) {\r\n return this._projectionMatrix;\r\n }\r\n\r\n // Cache\r\n this._cache.mode = this.mode;\r\n this._cache.minZ = this.minZ;\r\n this._cache.maxZ = this.maxZ;\r\n\r\n // Matrix\r\n this._refreshFrustumPlanes = true;\r\n\r\n const engine = this.getEngine();\r\n const scene = this.getScene();\r\n const reverseDepth = engine.useReverseDepthBuffer;\r\n if (this.mode === Camera.PERSPECTIVE_CAMERA) {\r\n this._cache.fov = this.fov;\r\n this._cache.fovMode = this.fovMode;\r\n this._cache.aspectRatio = engine.getAspectRatio(this);\r\n this._cache.projectionPlaneTilt = this.projectionPlaneTilt;\r\n\r\n if (this.minZ <= 0) {\r\n this.minZ = 0.1;\r\n }\r\n\r\n let getProjectionMatrix: (\r\n fov: number,\r\n aspect: number,\r\n znear: number,\r\n zfar: number,\r\n result: Matrix,\r\n isVerticalFovFixed: boolean,\r\n halfZRange: boolean,\r\n projectionPlaneTilt: number,\r\n reverseDepthBufferMode: boolean\r\n ) => void;\r\n if (scene.useRightHandedSystem) {\r\n getProjectionMatrix = Matrix.PerspectiveFovRHToRef;\r\n } else {\r\n getProjectionMatrix = Matrix.PerspectiveFovLHToRef;\r\n }\r\n\r\n getProjectionMatrix(\r\n this.fov,\r\n engine.getAspectRatio(this),\r\n reverseDepth ? this.maxZ : this.minZ,\r\n reverseDepth ? this.minZ : this.maxZ,\r\n this._projectionMatrix,\r\n this.fovMode === Camera.FOVMODE_VERTICAL_FIXED,\r\n engine.isNDCHalfZRange,\r\n this.projectionPlaneTilt,\r\n reverseDepth\r\n );\r\n } else {\r\n const halfWidth = engine.getRenderWidth() / 2.0;\r\n const halfHeight = engine.getRenderHeight() / 2.0;\r\n if (scene.useRightHandedSystem) {\r\n if (this.oblique) {\r\n Matrix.ObliqueOffCenterRHToRef(\r\n this.orthoLeft ?? -halfWidth,\r\n this.orthoRight ?? halfWidth,\r\n this.orthoBottom ?? -halfHeight,\r\n this.orthoTop ?? halfHeight,\r\n reverseDepth ? this.maxZ : this.minZ,\r\n reverseDepth ? this.minZ : this.maxZ,\r\n this.oblique.length,\r\n this.oblique.angle,\r\n this._computeObliqueDistance(this.oblique.offset),\r\n this._projectionMatrix,\r\n engine.isNDCHalfZRange\r\n );\r\n } else {\r\n Matrix.OrthoOffCenterRHToRef(\r\n this.orthoLeft ?? -halfWidth,\r\n this.orthoRight ?? halfWidth,\r\n this.orthoBottom ?? -halfHeight,\r\n this.orthoTop ?? halfHeight,\r\n reverseDepth ? this.maxZ : this.minZ,\r\n reverseDepth ? this.minZ : this.maxZ,\r\n this._projectionMatrix,\r\n engine.isNDCHalfZRange\r\n );\r\n }\r\n } else {\r\n if (this.oblique) {\r\n Matrix.ObliqueOffCenterLHToRef(\r\n this.orthoLeft ?? -halfWidth,\r\n this.orthoRight ?? halfWidth,\r\n this.orthoBottom ?? -halfHeight,\r\n this.orthoTop ?? halfHeight,\r\n reverseDepth ? this.maxZ : this.minZ,\r\n reverseDepth ? this.minZ : this.maxZ,\r\n this.oblique.length,\r\n this.oblique.angle,\r\n this._computeObliqueDistance(this.oblique.offset),\r\n this._projectionMatrix,\r\n engine.isNDCHalfZRange\r\n );\r\n } else {\r\n Matrix.OrthoOffCenterLHToRef(\r\n this.orthoLeft ?? -halfWidth,\r\n this.orthoRight ?? halfWidth,\r\n this.orthoBottom ?? -halfHeight,\r\n this.orthoTop ?? halfHeight,\r\n reverseDepth ? this.maxZ : this.minZ,\r\n reverseDepth ? this.minZ : this.maxZ,\r\n this._projectionMatrix,\r\n engine.isNDCHalfZRange\r\n );\r\n }\r\n }\r\n\r\n this._cache.orthoLeft = this.orthoLeft;\r\n this._cache.orthoRight = this.orthoRight;\r\n this._cache.orthoBottom = this.orthoBottom;\r\n this._cache.orthoTop = this.orthoTop;\r\n this._cache.obliqueAngle = this.oblique?.angle;\r\n this._cache.obliqueLength = this.oblique?.length;\r\n this._cache.obliqueOffset = this.oblique?.offset;\r\n this._cache.renderWidth = engine.getRenderWidth();\r\n this._cache.renderHeight = engine.getRenderHeight();\r\n }\r\n\r\n this.onProjectionMatrixChangedObservable.notifyObservers(this);\r\n\r\n return this._projectionMatrix;\r\n }\r\n\r\n /**\r\n * Gets the transformation matrix (ie. the multiplication of view by projection matrices)\r\n * @returns a Matrix\r\n */\r\n public getTransformationMatrix(): Matrix {\r\n this._computedViewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix);\r\n return this._transformMatrix;\r\n }\r\n\r\n private _computeObliqueDistance(offset: number): number {\r\n const arcRotateCamera = this as Camera as ArcRotateCamera;\r\n const targetCamera = this as Camera as TargetCamera;\r\n return (arcRotateCamera.radius || (targetCamera.target ? Vector3.Distance(this.position, targetCamera.target) : this.position.length())) + offset;\r\n }\r\n\r\n private _updateFrustumPlanes(): void {\r\n if (!this._refreshFrustumPlanes) {\r\n return;\r\n }\r\n\r\n this.getTransformationMatrix();\r\n\r\n if (!this._frustumPlanes) {\r\n this._frustumPlanes = Frustum.GetPlanes(this._transformMatrix);\r\n } else {\r\n Frustum.GetPlanesToRef(this._transformMatrix, this._frustumPlanes);\r\n }\r\n\r\n this._refreshFrustumPlanes = false;\r\n }\r\n\r\n /**\r\n * Checks if a cullable object (mesh...) is in the camera frustum\r\n * This checks the bounding box center. See isCompletelyInFrustum for a full bounding check\r\n * @param target The object to check\r\n * @param checkRigCameras If the rig cameras should be checked (eg. with VR camera both eyes should be checked) (Default: false)\r\n * @returns true if the object is in frustum otherwise false\r\n */\r\n public isInFrustum(target: ICullable, checkRigCameras = false): boolean {\r\n this._updateFrustumPlanes();\r\n\r\n if (checkRigCameras && this.rigCameras.length > 0) {\r\n let result = false;\r\n this.rigCameras.forEach((cam) => {\r\n cam._updateFrustumPlanes();\r\n result = result || target.isInFrustum(cam._frustumPlanes);\r\n });\r\n return result;\r\n } else {\r\n return target.isInFrustum(this._frustumPlanes);\r\n }\r\n }\r\n\r\n /**\r\n * Checks if a cullable object (mesh...) is in the camera frustum\r\n * Unlike isInFrustum this checks the full bounding box\r\n * @param target The object to check\r\n * @returns true if the object is in frustum otherwise false\r\n */\r\n public isCompletelyInFrustum(target: ICullable): boolean {\r\n this._updateFrustumPlanes();\r\n\r\n return target.isCompletelyInFrustum(this._frustumPlanes);\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Gets a ray in the forward direction from the camera.\r\n * @param length Defines the length of the ray to create\r\n * @param transform Defines the transform to apply to the ray, by default the world matrix is used to create a workd space ray\r\n * @param origin Defines the start point of the ray which defaults to the camera position\r\n * @returns the forward ray\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getForwardRay(length = 100, transform?: Matrix, origin?: Vector3): Ray {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Gets a ray in the forward direction from the camera.\r\n * @param refRay the ray to (re)use when setting the values\r\n * @param length Defines the length of the ray to create\r\n * @param transform Defines the transform to apply to the ray, by default the world matrx is used to create a workd space ray\r\n * @param origin Defines the start point of the ray which defaults to the camera position\r\n * @returns the forward ray\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getForwardRayToRef(refRay: Ray, length = 100, transform?: Matrix, origin?: Vector3): Ray {\r\n throw _WarnImport(\"Ray\");\r\n }\r\n\r\n /**\r\n * Releases resources associated with this node.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n // Observables\r\n this.onViewMatrixChangedObservable.clear();\r\n this.onProjectionMatrixChangedObservable.clear();\r\n this.onAfterCheckInputsObservable.clear();\r\n this.onRestoreStateObservable.clear();\r\n\r\n // Inputs\r\n if (this.inputs) {\r\n this.inputs.clear();\r\n }\r\n\r\n // Animations\r\n this.getScene().stopAnimation(this);\r\n\r\n // Remove from scene\r\n this.getScene().removeCamera(this);\r\n while (this._rigCameras.length > 0) {\r\n const camera = this._rigCameras.pop();\r\n if (camera) {\r\n camera.dispose();\r\n }\r\n }\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.cameras.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.cameras.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n // Postprocesses\r\n if (this._rigPostProcess) {\r\n this._rigPostProcess.dispose(this);\r\n this._rigPostProcess = null;\r\n this._postProcesses.length = 0;\r\n } else if (this.cameraRigMode !== Camera.RIG_MODE_NONE) {\r\n this._rigPostProcess = null;\r\n this._postProcesses.length = 0;\r\n } else {\r\n let i = this._postProcesses.length;\r\n while (--i >= 0) {\r\n const postProcess = this._postProcesses[i];\r\n if (postProcess) {\r\n postProcess.dispose(this);\r\n }\r\n }\r\n }\r\n\r\n // Render targets\r\n let i = this.customRenderTargets.length;\r\n while (--i >= 0) {\r\n this.customRenderTargets[i].dispose();\r\n }\r\n this.customRenderTargets.length = 0;\r\n\r\n // Active Meshes\r\n this._activeMeshes.dispose();\r\n\r\n this.getScene().getEngine().releaseRenderPassId(this.renderPassId);\r\n\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n /** @internal */\r\n public _isLeftCamera = false;\r\n /**\r\n * Gets the left camera of a rig setup in case of Rigged Camera\r\n */\r\n public get isLeftCamera(): boolean {\r\n return this._isLeftCamera;\r\n }\r\n\r\n /** @internal */\r\n public _isRightCamera = false;\r\n /**\r\n * Gets the right camera of a rig setup in case of Rigged Camera\r\n */\r\n public get isRightCamera(): boolean {\r\n return this._isRightCamera;\r\n }\r\n\r\n /**\r\n * Gets the left camera of a rig setup in case of Rigged Camera\r\n */\r\n public get leftCamera(): Nullable {\r\n if (this._rigCameras.length < 1) {\r\n return null;\r\n }\r\n return this._rigCameras[0];\r\n }\r\n\r\n /**\r\n * Gets the right camera of a rig setup in case of Rigged Camera\r\n */\r\n public get rightCamera(): Nullable {\r\n if (this._rigCameras.length < 2) {\r\n return null;\r\n }\r\n return this._rigCameras[1];\r\n }\r\n\r\n /**\r\n * Gets the left camera target of a rig setup in case of Rigged Camera\r\n * @returns the target position\r\n */\r\n public getLeftTarget(): Nullable {\r\n if (this._rigCameras.length < 1) {\r\n return null;\r\n }\r\n return (this._rigCameras[0]).getTarget();\r\n }\r\n\r\n /**\r\n * Gets the right camera target of a rig setup in case of Rigged Camera\r\n * @returns the target position\r\n */\r\n public getRightTarget(): Nullable {\r\n if (this._rigCameras.length < 2) {\r\n return null;\r\n }\r\n return (this._rigCameras[1]).getTarget();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public setCameraRigMode(mode: number, rigParams: any): void {\r\n if (this.cameraRigMode === mode) {\r\n return;\r\n }\r\n\r\n while (this._rigCameras.length > 0) {\r\n const camera = this._rigCameras.pop();\r\n\r\n if (camera) {\r\n camera.dispose();\r\n }\r\n }\r\n this.cameraRigMode = mode;\r\n this._cameraRigParams = {};\r\n //we have to implement stereo camera calcultating left and right viewpoints from interaxialDistance and target,\r\n //not from a given angle as it is now, but until that complete code rewriting provisional stereoHalfAngle value is introduced\r\n this._cameraRigParams.interaxialDistance = rigParams.interaxialDistance || 0.0637;\r\n this._cameraRigParams.stereoHalfAngle = Tools.ToRadians(this._cameraRigParams.interaxialDistance / 0.0637);\r\n\r\n // create the rig cameras, unless none\r\n if (this.cameraRigMode !== Camera.RIG_MODE_NONE) {\r\n const leftCamera = this.createRigCamera(this.name + \"_L\", 0);\r\n if (leftCamera) {\r\n leftCamera._isLeftCamera = true;\r\n }\r\n const rightCamera = this.createRigCamera(this.name + \"_R\", 1);\r\n if (rightCamera) {\r\n rightCamera._isRightCamera = true;\r\n }\r\n if (leftCamera && rightCamera) {\r\n this._rigCameras.push(leftCamera);\r\n this._rigCameras.push(rightCamera);\r\n }\r\n }\r\n\r\n this._setRigMode(rigParams);\r\n\r\n this._cascadePostProcessesToRigCams();\r\n this.update();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _setRigMode(rigParams: any) {\r\n // no-op\r\n }\r\n\r\n /** @internal */\r\n public _getVRProjectionMatrix(): Matrix {\r\n Matrix.PerspectiveFovLHToRef(\r\n this._cameraRigParams.vrMetrics.aspectRatioFov,\r\n this._cameraRigParams.vrMetrics.aspectRatio,\r\n this.minZ,\r\n this.maxZ,\r\n this._cameraRigParams.vrWorkMatrix,\r\n true,\r\n this.getEngine().isNDCHalfZRange\r\n );\r\n this._cameraRigParams.vrWorkMatrix.multiplyToRef(this._cameraRigParams.vrHMatrix, this._projectionMatrix);\r\n return this._projectionMatrix;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public setCameraRigParameter(name: string, value: any) {\r\n if (!this._cameraRigParams) {\r\n this._cameraRigParams = {};\r\n }\r\n this._cameraRigParams[name] = value;\r\n //provisionnally:\r\n if (name === \"interaxialDistance\") {\r\n this._cameraRigParams.stereoHalfAngle = Tools.ToRadians(value / 0.0637);\r\n }\r\n }\r\n\r\n /**\r\n * needs to be overridden by children so sub has required properties to be copied\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public createRigCamera(name: string, cameraIndex: number): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * May need to be overridden by children\r\n * @internal\r\n */\r\n public _updateRigCameras() {\r\n for (let i = 0; i < this._rigCameras.length; i++) {\r\n this._rigCameras[i].minZ = this.minZ;\r\n this._rigCameras[i].maxZ = this.maxZ;\r\n this._rigCameras[i].fov = this.fov;\r\n this._rigCameras[i].upVector.copyFrom(this.upVector);\r\n }\r\n\r\n // only update viewport when ANAGLYPH\r\n if (this.cameraRigMode === Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH) {\r\n this._rigCameras[0].viewport = this._rigCameras[1].viewport = this.viewport;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _setupInputs() {}\r\n\r\n /**\r\n * Serialiaze the camera setup to a json representation\r\n * @returns the JSON representation\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.uniqueId = this.uniqueId;\r\n\r\n // Type\r\n serializationObject.type = this.getClassName();\r\n\r\n // Parent\r\n if (this.parent) {\r\n this.parent._serializeAsParent(serializationObject);\r\n }\r\n\r\n if (this.inputs) {\r\n this.inputs.serialize(serializationObject);\r\n }\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n serializationObject.ranges = this.serializeAnimationRanges();\r\n\r\n serializationObject.isEnabled = this.isEnabled();\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Clones the current camera.\r\n * @param name The cloned camera name\r\n * @param newParent The cloned camera's new parent (none by default)\r\n * @returns the cloned camera\r\n */\r\n public clone(name: string, newParent: Nullable = null): Camera {\r\n const camera = SerializationHelper.Clone(\r\n Camera.GetConstructorFromName(this.getClassName(), name, this.getScene(), this.interaxialDistance, this.isStereoscopicSideBySide),\r\n this\r\n );\r\n camera.name = name;\r\n camera.parent = newParent;\r\n\r\n this.onClonedObservable.notifyObservers(camera);\r\n\r\n return camera;\r\n }\r\n\r\n /**\r\n * Gets the direction of the camera relative to a given local axis.\r\n * @param localAxis Defines the reference axis to provide a relative direction.\r\n * @returns the direction\r\n */\r\n public getDirection(localAxis: DeepImmutable): Vector3 {\r\n const result = Vector3.Zero();\r\n\r\n this.getDirectionToRef(localAxis, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns the current camera absolute rotation\r\n */\r\n public get absoluteRotation(): Quaternion {\r\n this.getWorldMatrix().decompose(undefined, this._absoluteRotation);\r\n\r\n return this._absoluteRotation;\r\n }\r\n\r\n /**\r\n * Gets the direction of the camera relative to a given local axis into a passed vector.\r\n * @param localAxis Defines the reference axis to provide a relative direction.\r\n * @param result Defines the vector to store the result in\r\n */\r\n public getDirectionToRef(localAxis: DeepImmutable, result: Vector3): void {\r\n Vector3.TransformNormalToRef(localAxis, this.getWorldMatrix(), result);\r\n }\r\n\r\n /**\r\n * Gets a camera constructor for a given camera type\r\n * @param type The type of the camera to construct (should be equal to one of the camera class name)\r\n * @param name The name of the camera the result will be able to instantiate\r\n * @param scene The scene the result will construct the camera in\r\n * @param interaxial_distance In case of stereoscopic setup, the distance between both eyes\r\n * @param isStereoscopicSideBySide In case of stereoscopic setup, should the sereo be side b side\r\n * @returns a factory method to construct the camera\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n static GetConstructorFromName(type: string, name: string, scene: Scene, interaxial_distance: number = 0, isStereoscopicSideBySide: boolean = true): () => Camera {\r\n const constructorFunc = Node.Construct(type, name, scene, {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n interaxial_distance: interaxial_distance,\r\n isStereoscopicSideBySide: isStereoscopicSideBySide,\r\n });\r\n\r\n if (constructorFunc) {\r\n return <() => Camera>constructorFunc;\r\n }\r\n\r\n // Default to universal camera\r\n return () => Camera._CreateDefaultParsedCamera(name, scene);\r\n }\r\n\r\n /**\r\n * Compute the world matrix of the camera.\r\n * @returns the camera world matrix\r\n */\r\n public computeWorldMatrix(): Matrix {\r\n return this.getWorldMatrix();\r\n }\r\n\r\n /**\r\n * Parse a JSON and creates the camera from the parsed information\r\n * @param parsedCamera The JSON to parse\r\n * @param scene The scene to instantiate the camera in\r\n * @returns the newly constructed camera\r\n */\r\n public static Parse(parsedCamera: any, scene: Scene): Camera {\r\n const type = parsedCamera.type;\r\n const construct = Camera.GetConstructorFromName(type, parsedCamera.name, scene, parsedCamera.interaxial_distance, parsedCamera.isStereoscopicSideBySide);\r\n\r\n const camera = SerializationHelper.Parse(construct, parsedCamera, scene);\r\n\r\n // Parent\r\n if (parsedCamera.parentId !== undefined) {\r\n camera._waitingParentId = parsedCamera.parentId;\r\n }\r\n\r\n // Parent instance index\r\n if (parsedCamera.parentInstanceIndex !== undefined) {\r\n camera._waitingParentInstanceIndex = parsedCamera.parentInstanceIndex;\r\n }\r\n\r\n //If camera has an input manager, let it parse inputs settings\r\n if (camera.inputs) {\r\n camera.inputs.parse(parsedCamera);\r\n\r\n camera._setupInputs();\r\n }\r\n\r\n if (parsedCamera.upVector) {\r\n camera.upVector = Vector3.FromArray(parsedCamera.upVector); // need to force the upVector\r\n }\r\n\r\n if ((camera).setPosition) {\r\n // need to force position\r\n camera.position.copyFromFloats(0, 0, 0);\r\n (camera).setPosition(Vector3.FromArray(parsedCamera.position));\r\n }\r\n\r\n // Target\r\n if (parsedCamera.target) {\r\n if ((camera).setTarget) {\r\n (camera).setTarget(Vector3.FromArray(parsedCamera.target));\r\n }\r\n }\r\n\r\n // Apply 3d rig, when found\r\n if (parsedCamera.cameraRigMode) {\r\n const rigParams = parsedCamera.interaxial_distance ? { interaxialDistance: parsedCamera.interaxial_distance } : {};\r\n camera.setCameraRigMode(parsedCamera.cameraRigMode, rigParams);\r\n }\r\n\r\n // Animations\r\n if (parsedCamera.animations) {\r\n for (let animationIndex = 0; animationIndex < parsedCamera.animations.length; animationIndex++) {\r\n const parsedAnimation = parsedCamera.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n camera.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n Node.ParseAnimationRanges(camera, parsedCamera, scene);\r\n }\r\n\r\n if (parsedCamera.autoAnimate) {\r\n scene.beginAnimation(camera, parsedCamera.autoAnimateFrom, parsedCamera.autoAnimateTo, parsedCamera.autoAnimateLoop, parsedCamera.autoAnimateSpeed || 1.0);\r\n }\r\n\r\n // Check if isEnabled is defined to be back compatible with prior serialized versions.\r\n if (parsedCamera.isEnabled !== undefined) {\r\n camera.setEnabled(parsedCamera.isEnabled);\r\n }\r\n\r\n return camera;\r\n }\r\n\r\n /** @internal */\r\n public _calculateHandednessMultiplier(): number {\r\n let handednessMultiplier = this.getScene().useRightHandedSystem ? -1 : 1;\r\n if (this.parent && this.parent._getWorldMatrixDeterminant() < 0) {\r\n handednessMultiplier *= -1;\r\n }\r\n\r\n return handednessMultiplier;\r\n }\r\n}\r\n", "import { Constants } from \"../Engines/constants\";\r\n\r\n/**\r\n * Class used to represent data loading progression\r\n */\r\nexport class SceneLoaderFlags {\r\n // Flags\r\n private static _ForceFullSceneLoadingForIncremental = false;\r\n private static _ShowLoadingScreen = true;\r\n private static _CleanBoneMatrixWeights = false;\r\n private static _LoggingLevel = Constants.SCENELOADER_NO_LOGGING;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if entire scene must be loaded even if scene contains incremental data\r\n */\r\n public static get ForceFullSceneLoadingForIncremental() {\r\n return SceneLoaderFlags._ForceFullSceneLoadingForIncremental;\r\n }\r\n\r\n public static set ForceFullSceneLoadingForIncremental(value: boolean) {\r\n SceneLoaderFlags._ForceFullSceneLoadingForIncremental = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if loading screen must be displayed while loading a scene\r\n */\r\n public static get ShowLoadingScreen(): boolean {\r\n return SceneLoaderFlags._ShowLoadingScreen;\r\n }\r\n\r\n public static set ShowLoadingScreen(value: boolean) {\r\n SceneLoaderFlags._ShowLoadingScreen = value;\r\n }\r\n\r\n /**\r\n * Defines the current logging level (while loading the scene)\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static get loggingLevel(): number {\r\n return SceneLoaderFlags._LoggingLevel;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static set loggingLevel(value: number) {\r\n SceneLoaderFlags._LoggingLevel = value;\r\n }\r\n\r\n /**\r\n * Gets or set a boolean indicating if matrix weights must be cleaned upon loading\r\n */\r\n public static get CleanBoneMatrixWeights(): boolean {\r\n return SceneLoaderFlags._CleanBoneMatrixWeights;\r\n }\r\n\r\n public static set CleanBoneMatrixWeights(value: boolean) {\r\n SceneLoaderFlags._CleanBoneMatrixWeights = value;\r\n }\r\n}\r\n", "import type { Nullable, FloatArray, DataArray, IndicesArray } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Vector2 } from \"../Maths/math.vector\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { IGetSetVerticesData } from \"../Meshes/mesh.vertexData\";\r\nimport { VertexData } from \"../Meshes/mesh.vertexData\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { SceneLoaderFlags } from \"../Loading/sceneLoaderFlags\";\r\nimport { BoundingInfo } from \"../Culling/boundingInfo\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport { Tags } from \"../Misc/tags\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { extractMinAndMax } from \"../Maths/math.functions\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { CompatibilityOptions } from \"../Compat/compatibilityOptions\";\r\n\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { Buffer } from \"../Buffers/buffer\";\r\n\r\n/**\r\n * Class used to store geometry data (vertex buffers + index buffer)\r\n */\r\nexport class Geometry implements IGetSetVerticesData {\r\n // Members\r\n /**\r\n * Gets or sets the ID of the geometry\r\n */\r\n public id: string;\r\n /**\r\n * Gets or sets the unique ID of the geometry\r\n */\r\n public uniqueId: number;\r\n /**\r\n * Gets the delay loading state of the geometry (none by default which means not delayed)\r\n */\r\n public delayLoadState = Constants.DELAYLOADSTATE_NONE;\r\n /**\r\n * Gets the file containing the data to load when running in delay load state\r\n */\r\n public delayLoadingFile: Nullable;\r\n /**\r\n * Callback called when the geometry is updated\r\n */\r\n public onGeometryUpdated: (geometry: Geometry, kind?: string) => void;\r\n\r\n // Private\r\n private _scene: Scene;\r\n private _engine: Engine;\r\n private _meshes: Mesh[];\r\n private _totalVertices = 0;\r\n private _totalIndices?: number;\r\n /** @internal */\r\n public _loadedUniqueId: string;\r\n /** @internal */\r\n public _indices: IndicesArray;\r\n /** @internal */\r\n public _vertexBuffers: { [key: string]: VertexBuffer };\r\n private _isDisposed = false;\r\n private _extend: { minimum: Vector3; maximum: Vector3 };\r\n private _boundingBias: Vector2;\r\n /** @internal */\r\n public _delayInfo: Array;\r\n private _indexBuffer: Nullable;\r\n private _indexBufferIsUpdatable = false;\r\n /** @internal */\r\n public _boundingInfo: Nullable;\r\n /** @internal */\r\n public _delayLoadingFunction: Nullable<(any: any, geometry: Geometry) => void>;\r\n /** @internal */\r\n public _softwareSkinningFrameId: number;\r\n private _vertexArrayObjects: { [key: string]: WebGLVertexArrayObject };\r\n private _updatable: boolean;\r\n\r\n // Cache\r\n /** @internal */\r\n public _positions: Nullable;\r\n private _positionsCache: Vector3[] = [];\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable = null;\r\n\r\n /**\r\n * Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y\r\n */\r\n public get boundingBias(): Vector2 {\r\n return this._boundingBias;\r\n }\r\n\r\n /**\r\n * Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y\r\n */\r\n public set boundingBias(value: Vector2) {\r\n if (this._boundingBias) {\r\n this._boundingBias.copyFrom(value);\r\n } else {\r\n this._boundingBias = value.clone();\r\n }\r\n\r\n this._updateBoundingInfo(true, null);\r\n }\r\n\r\n /**\r\n * Static function used to attach a new empty geometry to a mesh\r\n * @param mesh defines the mesh to attach the geometry to\r\n * @returns the new Geometry\r\n */\r\n public static CreateGeometryForMesh(mesh: Mesh): Geometry {\r\n const geometry = new Geometry(Geometry.RandomId(), mesh.getScene());\r\n\r\n geometry.applyToMesh(mesh);\r\n\r\n return geometry;\r\n }\r\n\r\n /** Get the list of meshes using this geometry */\r\n public get meshes(): Mesh[] {\r\n return this._meshes;\r\n }\r\n\r\n /**\r\n * If set to true (false by default), the bounding info applied to the meshes sharing this geometry will be the bounding info defined at the class level\r\n * and won't be computed based on the vertex positions (which is what we get when useBoundingInfoFromGeometry = false)\r\n */\r\n public useBoundingInfoFromGeometry = false;\r\n\r\n /**\r\n * Creates a new geometry\r\n * @param id defines the unique ID\r\n * @param scene defines the hosting scene\r\n * @param vertexData defines the VertexData used to get geometry data\r\n * @param updatable defines if geometry must be updatable (false by default)\r\n * @param mesh defines the mesh that will be associated with the geometry\r\n */\r\n constructor(id: string, scene?: Scene, vertexData?: VertexData, updatable: boolean = false, mesh: Nullable = null) {\r\n this._scene = scene || EngineStore.LastCreatedScene;\r\n if (!this._scene) {\r\n return;\r\n }\r\n this.id = id;\r\n this.uniqueId = this._scene.getUniqueId();\r\n this._engine = this._scene.getEngine();\r\n this._meshes = [];\r\n //Init vertex buffer cache\r\n this._vertexBuffers = {};\r\n this._indices = [];\r\n this._updatable = updatable;\r\n\r\n // vertexData\r\n if (vertexData) {\r\n this.setAllVerticesData(vertexData, updatable);\r\n } else {\r\n this._totalVertices = 0;\r\n }\r\n\r\n if (this._engine.getCaps().vertexArrayObject) {\r\n this._vertexArrayObjects = {};\r\n }\r\n\r\n // applyToMesh\r\n if (mesh) {\r\n this.applyToMesh(mesh);\r\n mesh.computeWorldMatrix(true);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current extend of the geometry\r\n */\r\n public get extend(): { minimum: Vector3; maximum: Vector3 } {\r\n return this._extend;\r\n }\r\n\r\n /**\r\n * Gets the hosting scene\r\n * @returns the hosting Scene\r\n */\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Gets the hosting engine\r\n * @returns the hosting Engine\r\n */\r\n public getEngine(): Engine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * Defines if the geometry is ready to use\r\n * @returns true if the geometry is ready to be used\r\n */\r\n public isReady(): boolean {\r\n return this.delayLoadState === Constants.DELAYLOADSTATE_LOADED || this.delayLoadState === Constants.DELAYLOADSTATE_NONE;\r\n }\r\n\r\n /**\r\n * Gets a value indicating that the geometry should not be serialized\r\n */\r\n public get doNotSerialize(): boolean {\r\n for (let index = 0; index < this._meshes.length; index++) {\r\n if (!this._meshes[index].doNotSerialize) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this._vertexArrayObjects) {\r\n this._vertexArrayObjects = {};\r\n }\r\n\r\n // Index buffer\r\n if (this._meshes.length !== 0 && this._indices) {\r\n this._indexBuffer = this._engine.createIndexBuffer(this._indices, this._updatable, \"Geometry_\" + this.id + \"_IndexBuffer\");\r\n }\r\n\r\n // Vertex buffers\r\n const buffers = new Set();\r\n for (const key in this._vertexBuffers) {\r\n buffers.add(this._vertexBuffers[key].getWrapperBuffer());\r\n }\r\n\r\n buffers.forEach((buffer) => {\r\n buffer._rebuild();\r\n });\r\n }\r\n\r\n /**\r\n * Affects all geometry data in one call\r\n * @param vertexData defines the geometry data\r\n * @param updatable defines if the geometry must be flagged as updatable (false as default)\r\n */\r\n public setAllVerticesData(vertexData: VertexData, updatable?: boolean): void {\r\n vertexData.applyToGeometry(this, updatable);\r\n this._notifyUpdate();\r\n }\r\n\r\n /**\r\n * Set specific vertex data\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @param data defines the vertex data to use\r\n * @param updatable defines if the vertex must be flagged as updatable (false as default)\r\n * @param stride defines the stride to use (0 by default). This value is deduced from the kind value if not specified\r\n */\r\n public setVerticesData(kind: string, data: FloatArray, updatable: boolean = false, stride?: number): void {\r\n if (updatable && Array.isArray(data)) {\r\n // to avoid converting to Float32Array at each draw call in engine.updateDynamicVertexBuffer, we make the conversion a single time here\r\n data = new Float32Array(data);\r\n }\r\n const buffer = new VertexBuffer(this._engine, data, kind, {\r\n updatable,\r\n postponeInternalCreation: this._meshes.length === 0,\r\n stride,\r\n label: \"Geometry_\" + this.id + \"_\" + kind,\r\n });\r\n this.setVerticesBuffer(buffer);\r\n }\r\n\r\n /**\r\n * Removes a specific vertex data\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n */\r\n public removeVerticesData(kind: string) {\r\n if (this._vertexBuffers[kind]) {\r\n this._vertexBuffers[kind].dispose();\r\n delete this._vertexBuffers[kind];\r\n }\r\n\r\n if (this._vertexArrayObjects) {\r\n this._disposeVertexArrayObjects();\r\n }\r\n }\r\n\r\n /**\r\n * Affect a vertex buffer to the geometry. the vertexBuffer.getKind() function is used to determine where to store the data\r\n * @param buffer defines the vertex buffer to use\r\n * @param totalVertices defines the total number of vertices for position kind (could be null)\r\n * @param disposeExistingBuffer disposes the existing buffer, if any (default: true)\r\n */\r\n public setVerticesBuffer(buffer: VertexBuffer, totalVertices: Nullable = null, disposeExistingBuffer = true): void {\r\n const kind = buffer.getKind();\r\n if (this._vertexBuffers[kind] && disposeExistingBuffer) {\r\n this._vertexBuffers[kind].dispose();\r\n }\r\n\r\n if (buffer._buffer) {\r\n buffer._buffer._increaseReferences();\r\n }\r\n\r\n this._vertexBuffers[kind] = buffer;\r\n const meshes = this._meshes;\r\n const numOfMeshes = meshes.length;\r\n\r\n if (kind === VertexBuffer.PositionKind) {\r\n this._totalVertices = totalVertices ?? buffer._maxVerticesCount;\r\n\r\n this._updateExtend(buffer.getFloatData(this._totalVertices));\r\n this._resetPointsArrayCache();\r\n\r\n // this._extend can be empty if buffer.getFloatData(this._totalVertices) returned null\r\n const minimum = (this._extend && this._extend.minimum) || new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n const maximum = (this._extend && this._extend.maximum) || new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n\r\n for (let index = 0; index < numOfMeshes; index++) {\r\n const mesh = meshes[index];\r\n mesh.buildBoundingInfo(minimum, maximum);\r\n mesh._createGlobalSubMesh(mesh.isUnIndexed);\r\n mesh.computeWorldMatrix(true);\r\n mesh.synchronizeInstances();\r\n }\r\n }\r\n\r\n this._notifyUpdate(kind);\r\n }\r\n\r\n /**\r\n * Update a specific vertex buffer\r\n * This function will directly update the underlying DataBuffer according to the passed numeric array or Float32Array\r\n * It will do nothing if the buffer is not updatable\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @param data defines the data to use\r\n * @param offset defines the offset in the target buffer where to store the data\r\n * @param useBytes set to true if the offset is in bytes\r\n */\r\n public updateVerticesDataDirectly(kind: string, data: DataArray, offset: number, useBytes: boolean = false): void {\r\n const vertexBuffer = this.getVertexBuffer(kind);\r\n\r\n if (!vertexBuffer) {\r\n return;\r\n }\r\n\r\n vertexBuffer.updateDirectly(data, offset, useBytes);\r\n this._notifyUpdate(kind);\r\n }\r\n\r\n /**\r\n * Update a specific vertex buffer\r\n * This function will create a new buffer if the current one is not updatable\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @param data defines the data to use\r\n * @param updateExtends defines if the geometry extends must be recomputed (false by default)\r\n */\r\n public updateVerticesData(kind: string, data: FloatArray, updateExtends: boolean = false): void {\r\n const vertexBuffer = this.getVertexBuffer(kind);\r\n\r\n if (!vertexBuffer) {\r\n return;\r\n }\r\n\r\n vertexBuffer.update(data);\r\n\r\n if (kind === VertexBuffer.PositionKind) {\r\n this._updateBoundingInfo(updateExtends, data);\r\n }\r\n this._notifyUpdate(kind);\r\n }\r\n\r\n private _updateBoundingInfo(updateExtends: boolean, data: Nullable) {\r\n if (updateExtends) {\r\n this._updateExtend(data);\r\n }\r\n\r\n this._resetPointsArrayCache();\r\n\r\n if (updateExtends) {\r\n const meshes = this._meshes;\r\n for (const mesh of meshes) {\r\n if (mesh.hasBoundingInfo) {\r\n mesh.getBoundingInfo().reConstruct(this._extend.minimum, this._extend.maximum);\r\n } else {\r\n mesh.buildBoundingInfo(this._extend.minimum, this._extend.maximum);\r\n }\r\n\r\n const subMeshes = mesh.subMeshes;\r\n for (const subMesh of subMeshes) {\r\n subMesh.refreshBoundingInfo();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bind(\r\n effect: Nullable,\r\n indexToBind?: Nullable,\r\n overrideVertexBuffers?: { [kind: string]: Nullable },\r\n overrideVertexArrayObjects?: { [key: string]: WebGLVertexArrayObject }\r\n ): void {\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n if (indexToBind === undefined) {\r\n indexToBind = this._indexBuffer;\r\n }\r\n const vbs = this.getVertexBuffers();\r\n\r\n if (!vbs) {\r\n return;\r\n }\r\n\r\n if (indexToBind != this._indexBuffer || (!this._vertexArrayObjects && !overrideVertexArrayObjects)) {\r\n this._engine.bindBuffers(vbs, indexToBind, effect, overrideVertexBuffers);\r\n return;\r\n }\r\n\r\n const vaos = overrideVertexArrayObjects ? overrideVertexArrayObjects : this._vertexArrayObjects;\r\n\r\n // Using VAO\r\n if (!vaos[effect.key]) {\r\n vaos[effect.key] = this._engine.recordVertexArrayObject(vbs, indexToBind, effect, overrideVertexBuffers);\r\n }\r\n\r\n this._engine.bindVertexArrayObject(vaos[effect.key], indexToBind);\r\n }\r\n\r\n /**\r\n * Gets total number of vertices\r\n * @returns the total number of vertices\r\n */\r\n public getTotalVertices(): number {\r\n if (!this.isReady()) {\r\n return 0;\r\n }\r\n\r\n return this._totalVertices;\r\n }\r\n\r\n /**\r\n * Gets a specific vertex data attached to this geometry. Float data is constructed if the vertex buffer data cannot be returned directly.\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns a float array containing vertex data\r\n */\r\n public getVerticesData(kind: string, copyWhenShared?: boolean, forceCopy?: boolean): Nullable {\r\n const vertexBuffer = this.getVertexBuffer(kind);\r\n if (!vertexBuffer) {\r\n return null;\r\n }\r\n\r\n return vertexBuffer.getFloatData(this._totalVertices, forceCopy || (copyWhenShared && this._meshes.length !== 1));\r\n }\r\n\r\n /**\r\n * Returns a boolean defining if the vertex data for the requested `kind` is updatable\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @returns true if the vertex buffer with the specified kind is updatable\r\n */\r\n public isVertexBufferUpdatable(kind: string): boolean {\r\n const vb = this._vertexBuffers[kind];\r\n\r\n if (!vb) {\r\n return false;\r\n }\r\n\r\n return vb.isUpdatable();\r\n }\r\n\r\n /**\r\n * Gets a specific vertex buffer\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @returns a VertexBuffer\r\n */\r\n public getVertexBuffer(kind: string): Nullable {\r\n if (!this.isReady()) {\r\n return null;\r\n }\r\n return this._vertexBuffers[kind];\r\n }\r\n\r\n /**\r\n * Returns all vertex buffers\r\n * @returns an object holding all vertex buffers indexed by kind\r\n */\r\n public getVertexBuffers(): Nullable<{ [key: string]: VertexBuffer }> {\r\n if (!this.isReady()) {\r\n return null;\r\n }\r\n return this._vertexBuffers;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if specific vertex buffer is present\r\n * @param kind defines the data kind (Position, normal, etc...)\r\n * @returns true if data is present\r\n */\r\n public isVerticesDataPresent(kind: string): boolean {\r\n if (!this._vertexBuffers) {\r\n if (this._delayInfo) {\r\n return this._delayInfo.indexOf(kind) !== -1;\r\n }\r\n return false;\r\n }\r\n return this._vertexBuffers[kind] !== undefined;\r\n }\r\n\r\n /**\r\n * Gets a list of all attached data kinds (Position, normal, etc...)\r\n * @returns a list of string containing all kinds\r\n */\r\n public getVerticesDataKinds(): string[] {\r\n const result = [];\r\n let kind;\r\n if (!this._vertexBuffers && this._delayInfo) {\r\n for (kind in this._delayInfo) {\r\n result.push(kind);\r\n }\r\n } else {\r\n for (kind in this._vertexBuffers) {\r\n result.push(kind);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Update index buffer\r\n * @param indices defines the indices to store in the index buffer\r\n * @param offset defines the offset in the target buffer where to store the data\r\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\r\n */\r\n public updateIndices(indices: IndicesArray, offset?: number, gpuMemoryOnly = false): void {\r\n if (!this._indexBuffer) {\r\n return;\r\n }\r\n\r\n if (!this._indexBufferIsUpdatable) {\r\n this.setIndices(indices, null, true);\r\n } else {\r\n const needToUpdateSubMeshes = indices.length !== this._indices.length;\r\n\r\n if (!gpuMemoryOnly) {\r\n this._indices = indices.slice();\r\n }\r\n this._engine.updateDynamicIndexBuffer(this._indexBuffer, indices, offset);\r\n if (needToUpdateSubMeshes) {\r\n for (const mesh of this._meshes) {\r\n mesh._createGlobalSubMesh(true);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the index buffer for this geometry.\r\n * @param indexBuffer Defines the index buffer to use for this geometry\r\n * @param totalVertices Defines the total number of vertices used by the buffer\r\n * @param totalIndices Defines the total number of indices in the index buffer\r\n */\r\n public setIndexBuffer(indexBuffer: DataBuffer, totalVertices: number, totalIndices: number): void {\r\n this._indices = [];\r\n this._indexBufferIsUpdatable = false;\r\n this._indexBuffer = indexBuffer;\r\n this._totalVertices = totalVertices;\r\n this._totalIndices = totalIndices;\r\n\r\n indexBuffer.is32Bits ||= this._totalIndices > 65535;\r\n\r\n for (const mesh of this._meshes) {\r\n mesh._createGlobalSubMesh(true);\r\n mesh.synchronizeInstances();\r\n }\r\n\r\n this._notifyUpdate();\r\n }\r\n\r\n /**\r\n * Creates a new index buffer\r\n * @param indices defines the indices to store in the index buffer\r\n * @param totalVertices defines the total number of vertices (could be null)\r\n * @param updatable defines if the index buffer must be flagged as updatable (false by default)\r\n */\r\n public setIndices(indices: IndicesArray, totalVertices: Nullable = null, updatable: boolean = false): void {\r\n if (this._indexBuffer) {\r\n this._engine._releaseBuffer(this._indexBuffer);\r\n }\r\n\r\n this._indices = indices;\r\n this._indexBufferIsUpdatable = updatable;\r\n if (this._meshes.length !== 0 && this._indices) {\r\n this._indexBuffer = this._engine.createIndexBuffer(this._indices, updatable, \"Geometry_\" + this.id + \"_IndexBuffer\");\r\n }\r\n\r\n if (totalVertices != undefined) {\r\n // including null and undefined\r\n this._totalVertices = totalVertices;\r\n }\r\n\r\n for (const mesh of this._meshes) {\r\n mesh._createGlobalSubMesh(true);\r\n mesh.synchronizeInstances();\r\n }\r\n\r\n this._notifyUpdate();\r\n }\r\n\r\n /**\r\n * Return the total number of indices\r\n * @returns the total number of indices\r\n */\r\n public getTotalIndices(): number {\r\n if (!this.isReady()) {\r\n return 0;\r\n }\r\n return this._totalIndices !== undefined ? this._totalIndices : this._indices.length;\r\n }\r\n\r\n /**\r\n * Gets the index buffer array\r\n * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns the index buffer array\r\n */\r\n public getIndices(copyWhenShared?: boolean, forceCopy?: boolean): Nullable {\r\n if (!this.isReady()) {\r\n return null;\r\n }\r\n const orig = this._indices;\r\n if (!forceCopy && (!copyWhenShared || this._meshes.length === 1)) {\r\n return orig;\r\n } else {\r\n return orig.slice();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the index buffer\r\n * @returns the index buffer\r\n */\r\n public getIndexBuffer(): Nullable {\r\n if (!this.isReady()) {\r\n return null;\r\n }\r\n return this._indexBuffer;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _releaseVertexArrayObject(effect: Nullable = null) {\r\n if (!effect || !this._vertexArrayObjects) {\r\n return;\r\n }\r\n\r\n if (this._vertexArrayObjects[effect.key]) {\r\n this._engine.releaseVertexArrayObject(this._vertexArrayObjects[effect.key]);\r\n delete this._vertexArrayObjects[effect.key];\r\n }\r\n }\r\n\r\n /**\r\n * Release the associated resources for a specific mesh\r\n * @param mesh defines the source mesh\r\n * @param shouldDispose defines if the geometry must be disposed if there is no more mesh pointing to it\r\n */\r\n public releaseForMesh(mesh: Mesh, shouldDispose?: boolean): void {\r\n const meshes = this._meshes;\r\n const index = meshes.indexOf(mesh);\r\n\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n meshes.splice(index, 1);\r\n\r\n if (this._vertexArrayObjects) {\r\n mesh._invalidateInstanceVertexArrayObject();\r\n }\r\n\r\n mesh._geometry = null;\r\n\r\n if (meshes.length === 0 && shouldDispose) {\r\n this.dispose();\r\n }\r\n }\r\n\r\n /**\r\n * Apply current geometry to a given mesh\r\n * @param mesh defines the mesh to apply geometry to\r\n */\r\n public applyToMesh(mesh: Mesh): void {\r\n if (mesh._geometry === this) {\r\n return;\r\n }\r\n\r\n const previousGeometry = mesh._geometry;\r\n if (previousGeometry) {\r\n previousGeometry.releaseForMesh(mesh);\r\n }\r\n\r\n if (this._vertexArrayObjects) {\r\n mesh._invalidateInstanceVertexArrayObject();\r\n }\r\n\r\n const meshes = this._meshes;\r\n\r\n // must be done before setting vertexBuffers because of mesh._createGlobalSubMesh()\r\n mesh._geometry = this;\r\n mesh._internalAbstractMeshDataInfo._positions = null;\r\n\r\n this._scene.pushGeometry(this);\r\n\r\n meshes.push(mesh);\r\n\r\n if (this.isReady()) {\r\n this._applyToMesh(mesh);\r\n } else if (this._boundingInfo) {\r\n mesh.setBoundingInfo(this._boundingInfo);\r\n }\r\n }\r\n\r\n private _updateExtend(data: Nullable = null) {\r\n if (this.useBoundingInfoFromGeometry && this._boundingInfo) {\r\n this._extend = {\r\n minimum: this._boundingInfo.minimum.clone(),\r\n maximum: this._boundingInfo.maximum.clone(),\r\n };\r\n } else {\r\n if (!data) {\r\n data = this.getVerticesData(VertexBuffer.PositionKind)!;\r\n // This can happen if the buffer comes from a Hardware Buffer where\r\n // The data have not been uploaded by Babylon. (ex: Compute Shaders and Storage Buffers)\r\n if (!data) {\r\n return;\r\n }\r\n }\r\n\r\n this._extend = extractMinAndMax(data, 0, this._totalVertices, this.boundingBias, 3);\r\n }\r\n }\r\n\r\n private _applyToMesh(mesh: Mesh): void {\r\n const numOfMeshes = this._meshes.length;\r\n\r\n // vertexBuffers\r\n for (const kind in this._vertexBuffers) {\r\n if (numOfMeshes === 1) {\r\n this._vertexBuffers[kind].create();\r\n }\r\n\r\n if (kind === VertexBuffer.PositionKind) {\r\n if (!this._extend) {\r\n this._updateExtend();\r\n }\r\n mesh.buildBoundingInfo(this._extend.minimum, this._extend.maximum);\r\n\r\n mesh._createGlobalSubMesh(mesh.isUnIndexed);\r\n\r\n //bounding info was just created again, world matrix should be applied again.\r\n mesh._updateBoundingInfo();\r\n }\r\n }\r\n\r\n // indexBuffer\r\n if (numOfMeshes === 1 && this._indices && this._indices.length > 0) {\r\n this._indexBuffer = this._engine.createIndexBuffer(this._indices, this._updatable, \"Geometry_\" + this.id + \"_IndexBuffer\");\r\n }\r\n\r\n // morphTargets\r\n mesh._syncGeometryWithMorphTargetManager();\r\n\r\n // instances\r\n mesh.synchronizeInstances();\r\n }\r\n\r\n private _notifyUpdate(kind?: string) {\r\n if (this.onGeometryUpdated) {\r\n this.onGeometryUpdated(this, kind);\r\n }\r\n\r\n if (this._vertexArrayObjects) {\r\n this._disposeVertexArrayObjects();\r\n }\r\n\r\n for (const mesh of this._meshes) {\r\n mesh._markSubMeshesAsAttributesDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Load the geometry if it was flagged as delay loaded\r\n * @param scene defines the hosting scene\r\n * @param onLoaded defines a callback called when the geometry is loaded\r\n */\r\n public load(scene: Scene, onLoaded?: () => void): void {\r\n if (this.delayLoadState === Constants.DELAYLOADSTATE_LOADING) {\r\n return;\r\n }\r\n\r\n if (this.isReady()) {\r\n if (onLoaded) {\r\n onLoaded();\r\n }\r\n return;\r\n }\r\n\r\n this.delayLoadState = Constants.DELAYLOADSTATE_LOADING;\r\n\r\n this._queueLoad(scene, onLoaded);\r\n }\r\n\r\n private _queueLoad(scene: Scene, onLoaded?: () => void): void {\r\n if (!this.delayLoadingFile) {\r\n return;\r\n }\r\n\r\n scene.addPendingData(this);\r\n scene._loadFile(\r\n this.delayLoadingFile,\r\n (data) => {\r\n if (!this._delayLoadingFunction) {\r\n return;\r\n }\r\n\r\n this._delayLoadingFunction(JSON.parse(data as string), this);\r\n\r\n this.delayLoadState = Constants.DELAYLOADSTATE_LOADED;\r\n this._delayInfo = [];\r\n\r\n scene.removePendingData(this);\r\n\r\n const meshes = this._meshes;\r\n const numOfMeshes = meshes.length;\r\n for (let index = 0; index < numOfMeshes; index++) {\r\n this._applyToMesh(meshes[index]);\r\n }\r\n\r\n if (onLoaded) {\r\n onLoaded();\r\n }\r\n },\r\n undefined,\r\n true\r\n );\r\n }\r\n\r\n /**\r\n * Invert the geometry to move from a right handed system to a left handed one.\r\n */\r\n public toLeftHanded(): void {\r\n // Flip faces\r\n const tIndices = this.getIndices(false);\r\n if (tIndices != null && tIndices.length > 0) {\r\n for (let i = 0; i < tIndices.length; i += 3) {\r\n const tTemp = tIndices[i + 0];\r\n tIndices[i + 0] = tIndices[i + 2];\r\n tIndices[i + 2] = tTemp;\r\n }\r\n this.setIndices(tIndices);\r\n }\r\n\r\n // Negate position.z\r\n const tPositions = this.getVerticesData(VertexBuffer.PositionKind, false);\r\n if (tPositions != null && tPositions.length > 0) {\r\n for (let i = 0; i < tPositions.length; i += 3) {\r\n tPositions[i + 2] = -tPositions[i + 2];\r\n }\r\n this.setVerticesData(VertexBuffer.PositionKind, tPositions, false);\r\n }\r\n\r\n // Negate normal.z\r\n const tNormals = this.getVerticesData(VertexBuffer.NormalKind, false);\r\n if (tNormals != null && tNormals.length > 0) {\r\n for (let i = 0; i < tNormals.length; i += 3) {\r\n tNormals[i + 2] = -tNormals[i + 2];\r\n }\r\n this.setVerticesData(VertexBuffer.NormalKind, tNormals, false);\r\n }\r\n }\r\n\r\n // Cache\r\n /** @internal */\r\n public _resetPointsArrayCache(): void {\r\n this._positions = null;\r\n }\r\n\r\n /** @internal */\r\n public _generatePointsArray(): boolean {\r\n if (this._positions) {\r\n return true;\r\n }\r\n\r\n const data = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (!data || data.length === 0) {\r\n return false;\r\n }\r\n\r\n for (let index = this._positionsCache.length * 3, arrayIdx = this._positionsCache.length; index < data.length; index += 3, ++arrayIdx) {\r\n this._positionsCache[arrayIdx] = Vector3.FromArray(data, index);\r\n }\r\n\r\n for (let index = 0, arrayIdx = 0; index < data.length; index += 3, ++arrayIdx) {\r\n this._positionsCache[arrayIdx].set(data[0 + index], data[1 + index], data[2 + index]);\r\n }\r\n\r\n // just in case the number of positions was reduced, splice the array\r\n this._positionsCache.length = data.length / 3;\r\n\r\n this._positions = this._positionsCache;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets a value indicating if the geometry is disposed\r\n * @returns true if the geometry was disposed\r\n */\r\n public isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n private _disposeVertexArrayObjects(): void {\r\n if (this._vertexArrayObjects) {\r\n for (const kind in this._vertexArrayObjects) {\r\n this._engine.releaseVertexArrayObject(this._vertexArrayObjects[kind]);\r\n }\r\n this._vertexArrayObjects = {}; // Will trigger a rebuild of the VAO if supported\r\n\r\n const meshes = this._meshes;\r\n const numOfMeshes = meshes.length;\r\n for (let index = 0; index < numOfMeshes; index++) {\r\n meshes[index]._invalidateInstanceVertexArrayObject();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Free all associated resources\r\n */\r\n public dispose(): void {\r\n const meshes = this._meshes;\r\n const numOfMeshes = meshes.length;\r\n let index: number;\r\n for (index = 0; index < numOfMeshes; index++) {\r\n this.releaseForMesh(meshes[index]);\r\n }\r\n this._meshes.length = 0;\r\n\r\n this._disposeVertexArrayObjects();\r\n\r\n for (const kind in this._vertexBuffers) {\r\n this._vertexBuffers[kind].dispose();\r\n }\r\n this._vertexBuffers = {};\r\n this._totalVertices = 0;\r\n\r\n if (this._indexBuffer) {\r\n this._engine._releaseBuffer(this._indexBuffer);\r\n }\r\n this._indexBuffer = null;\r\n this._indices = [];\r\n\r\n this.delayLoadState = Constants.DELAYLOADSTATE_NONE;\r\n this.delayLoadingFile = null;\r\n this._delayLoadingFunction = null;\r\n this._delayInfo = [];\r\n\r\n this._boundingInfo = null;\r\n\r\n this._scene.removeGeometry(this);\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.geometries.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.geometries.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * Clone the current geometry into a new geometry\r\n * @param id defines the unique ID of the new geometry\r\n * @returns a new geometry object\r\n */\r\n public copy(id: string): Geometry {\r\n const vertexData = new VertexData();\r\n\r\n vertexData.indices = [];\r\n\r\n const indices = this.getIndices();\r\n if (indices) {\r\n for (let index = 0; index < indices.length; index++) {\r\n (vertexData.indices).push(indices[index]);\r\n }\r\n }\r\n\r\n let updatable = false;\r\n let stopChecking = false;\r\n let kind;\r\n for (kind in this._vertexBuffers) {\r\n // using slice() to make a copy of the array and not just reference it\r\n const data = this.getVerticesData(kind);\r\n\r\n if (data) {\r\n if (data instanceof Float32Array) {\r\n vertexData.set(new Float32Array(data), kind);\r\n } else {\r\n vertexData.set((data).slice(0), kind);\r\n }\r\n if (!stopChecking) {\r\n const vb = this.getVertexBuffer(kind);\r\n\r\n if (vb) {\r\n updatable = vb.isUpdatable();\r\n stopChecking = !updatable;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const geometry = new Geometry(id, this._scene, vertexData, updatable);\r\n\r\n geometry.delayLoadState = this.delayLoadState;\r\n geometry.delayLoadingFile = this.delayLoadingFile;\r\n geometry._delayLoadingFunction = this._delayLoadingFunction;\r\n\r\n for (kind in this._delayInfo) {\r\n geometry._delayInfo = geometry._delayInfo || [];\r\n geometry._delayInfo.push(kind);\r\n }\r\n\r\n // Bounding info\r\n geometry._boundingInfo = new BoundingInfo(this._extend.minimum, this._extend.maximum);\r\n\r\n return geometry;\r\n }\r\n\r\n /**\r\n * Serialize the current geometry info (and not the vertices data) into a JSON object\r\n * @returns a JSON representation of the current geometry data (without the vertices data)\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.id = this.id;\r\n serializationObject.uniqueId = this.uniqueId;\r\n serializationObject.updatable = this._updatable;\r\n\r\n if (Tags && Tags.HasTags(this)) {\r\n serializationObject.tags = Tags.GetTags(this);\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n private _toNumberArray(origin: Nullable): number[] {\r\n if (Array.isArray(origin)) {\r\n return origin;\r\n } else {\r\n return Array.prototype.slice.call(origin);\r\n }\r\n }\r\n\r\n /**\r\n * Release any memory retained by the cached data on the Geometry.\r\n *\r\n * Call this function to reduce memory footprint of the mesh.\r\n * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly)\r\n */\r\n public clearCachedData(): void {\r\n this._indices = [];\r\n this._resetPointsArrayCache();\r\n\r\n for (const vbName in this._vertexBuffers) {\r\n if (!Object.prototype.hasOwnProperty.call(this._vertexBuffers, vbName)) {\r\n continue;\r\n }\r\n this._vertexBuffers[vbName]._buffer._data = null;\r\n }\r\n }\r\n\r\n /**\r\n * Serialize all vertices data into a JSON object\r\n * @returns a JSON representation of the current geometry data\r\n */\r\n public serializeVerticeData(): any {\r\n const serializationObject = this.serialize();\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.PositionKind)) {\r\n serializationObject.positions = this._toNumberArray(this.getVerticesData(VertexBuffer.PositionKind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.PositionKind)) {\r\n serializationObject.positions._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.NormalKind)) {\r\n serializationObject.normals = this._toNumberArray(this.getVerticesData(VertexBuffer.NormalKind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.NormalKind)) {\r\n serializationObject.normals._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.TangentKind)) {\r\n serializationObject.tangents = this._toNumberArray(this.getVerticesData(VertexBuffer.TangentKind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.TangentKind)) {\r\n serializationObject.tangents._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n serializationObject.uvs = this._toNumberArray(this.getVerticesData(VertexBuffer.UVKind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.UVKind)) {\r\n serializationObject.uvs._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.UV2Kind)) {\r\n serializationObject.uvs2 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV2Kind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.UV2Kind)) {\r\n serializationObject.uvs2._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.UV3Kind)) {\r\n serializationObject.uvs3 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV3Kind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.UV3Kind)) {\r\n serializationObject.uvs3._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.UV4Kind)) {\r\n serializationObject.uvs4 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV4Kind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.UV4Kind)) {\r\n serializationObject.uvs4._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.UV5Kind)) {\r\n serializationObject.uvs5 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV5Kind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.UV5Kind)) {\r\n serializationObject.uvs5._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.UV6Kind)) {\r\n serializationObject.uvs6 = this._toNumberArray(this.getVerticesData(VertexBuffer.UV6Kind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.UV6Kind)) {\r\n serializationObject.uvs6._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.ColorKind)) {\r\n serializationObject.colors = this._toNumberArray(this.getVerticesData(VertexBuffer.ColorKind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.ColorKind)) {\r\n serializationObject.colors._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind)) {\r\n serializationObject.matricesIndices = this._toNumberArray(this.getVerticesData(VertexBuffer.MatricesIndicesKind));\r\n serializationObject.matricesIndices._isExpanded = true;\r\n if (this.isVertexBufferUpdatable(VertexBuffer.MatricesIndicesKind)) {\r\n serializationObject.matricesIndices._updatable = true;\r\n }\r\n }\r\n\r\n if (this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) {\r\n serializationObject.matricesWeights = this._toNumberArray(this.getVerticesData(VertexBuffer.MatricesWeightsKind));\r\n if (this.isVertexBufferUpdatable(VertexBuffer.MatricesWeightsKind)) {\r\n serializationObject.matricesWeights._updatable = true;\r\n }\r\n }\r\n\r\n serializationObject.indices = this._toNumberArray(this.getIndices());\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Extracts a clone of a mesh geometry\r\n * @param mesh defines the source mesh\r\n * @param id defines the unique ID of the new geometry object\r\n * @returns the new geometry object\r\n */\r\n public static ExtractFromMesh(mesh: Mesh, id: string): Nullable {\r\n const geometry = mesh._geometry;\r\n\r\n if (!geometry) {\r\n return null;\r\n }\r\n\r\n return geometry.copy(id);\r\n }\r\n\r\n /**\r\n * You should now use Tools.RandomId(), this method is still here for legacy reasons.\r\n * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523\r\n * Be aware Math.random() could cause collisions, but:\r\n * \"All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide\"\r\n * @returns a string containing a new GUID\r\n */\r\n public static RandomId(): string {\r\n return Tools.RandomId();\r\n }\r\n\r\n private static _GetGeometryByLoadedUniqueId(uniqueId: string, scene: Scene) {\r\n for (let index = 0; index < scene.geometries.length; index++) {\r\n if (scene.geometries[index]._loadedUniqueId === uniqueId) {\r\n return scene.geometries[index];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _ImportGeometry(parsedGeometry: any, mesh: Mesh): void {\r\n const scene = mesh.getScene();\r\n\r\n // Geometry\r\n const geometryUniqueId = parsedGeometry.geometryUniqueId;\r\n const geometryId = parsedGeometry.geometryId;\r\n if (geometryUniqueId || geometryId) {\r\n const geometry = geometryUniqueId ? this._GetGeometryByLoadedUniqueId(geometryUniqueId, scene) : scene.getGeometryById(geometryId);\r\n if (geometry) {\r\n geometry.applyToMesh(mesh);\r\n }\r\n } else if (parsedGeometry instanceof ArrayBuffer) {\r\n const binaryInfo = mesh._binaryInfo;\r\n\r\n if (binaryInfo.positionsAttrDesc && binaryInfo.positionsAttrDesc.count > 0) {\r\n const positionsData = new Float32Array(parsedGeometry, binaryInfo.positionsAttrDesc.offset, binaryInfo.positionsAttrDesc.count);\r\n mesh.setVerticesData(VertexBuffer.PositionKind, positionsData, false);\r\n }\r\n\r\n if (binaryInfo.normalsAttrDesc && binaryInfo.normalsAttrDesc.count > 0) {\r\n const normalsData = new Float32Array(parsedGeometry, binaryInfo.normalsAttrDesc.offset, binaryInfo.normalsAttrDesc.count);\r\n mesh.setVerticesData(VertexBuffer.NormalKind, normalsData, false);\r\n }\r\n\r\n if (binaryInfo.tangetsAttrDesc && binaryInfo.tangetsAttrDesc.count > 0) {\r\n const tangentsData = new Float32Array(parsedGeometry, binaryInfo.tangetsAttrDesc.offset, binaryInfo.tangetsAttrDesc.count);\r\n mesh.setVerticesData(VertexBuffer.TangentKind, tangentsData, false);\r\n }\r\n\r\n if (binaryInfo.uvsAttrDesc && binaryInfo.uvsAttrDesc.count > 0) {\r\n const uvsData = new Float32Array(parsedGeometry, binaryInfo.uvsAttrDesc.offset, binaryInfo.uvsAttrDesc.count);\r\n if (CompatibilityOptions.UseOpenGLOrientationForUV) {\r\n for (let index = 1; index < uvsData.length; index += 2) {\r\n uvsData[index] = 1 - uvsData[index];\r\n }\r\n }\r\n mesh.setVerticesData(VertexBuffer.UVKind, uvsData, false);\r\n }\r\n\r\n if (binaryInfo.uvs2AttrDesc && binaryInfo.uvs2AttrDesc.count > 0) {\r\n const uvs2Data = new Float32Array(parsedGeometry, binaryInfo.uvs2AttrDesc.offset, binaryInfo.uvs2AttrDesc.count);\r\n if (CompatibilityOptions.UseOpenGLOrientationForUV) {\r\n for (let index = 1; index < uvs2Data.length; index += 2) {\r\n uvs2Data[index] = 1 - uvs2Data[index];\r\n }\r\n }\r\n mesh.setVerticesData(VertexBuffer.UV2Kind, uvs2Data, false);\r\n }\r\n\r\n if (binaryInfo.uvs3AttrDesc && binaryInfo.uvs3AttrDesc.count > 0) {\r\n const uvs3Data = new Float32Array(parsedGeometry, binaryInfo.uvs3AttrDesc.offset, binaryInfo.uvs3AttrDesc.count);\r\n if (CompatibilityOptions.UseOpenGLOrientationForUV) {\r\n for (let index = 1; index < uvs3Data.length; index += 2) {\r\n uvs3Data[index] = 1 - uvs3Data[index];\r\n }\r\n }\r\n mesh.setVerticesData(VertexBuffer.UV3Kind, uvs3Data, false);\r\n }\r\n\r\n if (binaryInfo.uvs4AttrDesc && binaryInfo.uvs4AttrDesc.count > 0) {\r\n const uvs4Data = new Float32Array(parsedGeometry, binaryInfo.uvs4AttrDesc.offset, binaryInfo.uvs4AttrDesc.count);\r\n if (CompatibilityOptions.UseOpenGLOrientationForUV) {\r\n for (let index = 1; index < uvs4Data.length; index += 2) {\r\n uvs4Data[index] = 1 - uvs4Data[index];\r\n }\r\n }\r\n mesh.setVerticesData(VertexBuffer.UV4Kind, uvs4Data, false);\r\n }\r\n\r\n if (binaryInfo.uvs5AttrDesc && binaryInfo.uvs5AttrDesc.count > 0) {\r\n const uvs5Data = new Float32Array(parsedGeometry, binaryInfo.uvs5AttrDesc.offset, binaryInfo.uvs5AttrDesc.count);\r\n if (CompatibilityOptions.UseOpenGLOrientationForUV) {\r\n for (let index = 1; index < uvs5Data.length; index += 2) {\r\n uvs5Data[index] = 1 - uvs5Data[index];\r\n }\r\n }\r\n mesh.setVerticesData(VertexBuffer.UV5Kind, uvs5Data, false);\r\n }\r\n\r\n if (binaryInfo.uvs6AttrDesc && binaryInfo.uvs6AttrDesc.count > 0) {\r\n const uvs6Data = new Float32Array(parsedGeometry, binaryInfo.uvs6AttrDesc.offset, binaryInfo.uvs6AttrDesc.count);\r\n if (CompatibilityOptions.UseOpenGLOrientationForUV) {\r\n for (let index = 1; index < uvs6Data.length; index += 2) {\r\n uvs6Data[index] = 1 - uvs6Data[index];\r\n }\r\n }\r\n mesh.setVerticesData(VertexBuffer.UV6Kind, uvs6Data, false);\r\n }\r\n\r\n if (binaryInfo.colorsAttrDesc && binaryInfo.colorsAttrDesc.count > 0) {\r\n const colorsData = new Float32Array(parsedGeometry, binaryInfo.colorsAttrDesc.offset, binaryInfo.colorsAttrDesc.count);\r\n mesh.setVerticesData(VertexBuffer.ColorKind, colorsData, false, binaryInfo.colorsAttrDesc.stride);\r\n }\r\n\r\n if (binaryInfo.matricesIndicesAttrDesc && binaryInfo.matricesIndicesAttrDesc.count > 0) {\r\n const matricesIndicesData = new Int32Array(parsedGeometry, binaryInfo.matricesIndicesAttrDesc.offset, binaryInfo.matricesIndicesAttrDesc.count);\r\n const floatIndices = [];\r\n for (let i = 0; i < matricesIndicesData.length; i++) {\r\n const index = matricesIndicesData[i];\r\n floatIndices.push(index & 0x000000ff);\r\n floatIndices.push((index & 0x0000ff00) >> 8);\r\n floatIndices.push((index & 0x00ff0000) >> 16);\r\n floatIndices.push((index >> 24) & 0xff); // & 0xFF to convert to v + 256 if v < 0\r\n }\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, floatIndices, false);\r\n }\r\n\r\n if (binaryInfo.matricesIndicesExtraAttrDesc && binaryInfo.matricesIndicesExtraAttrDesc.count > 0) {\r\n const matricesIndicesData = new Int32Array(parsedGeometry, binaryInfo.matricesIndicesExtraAttrDesc.offset, binaryInfo.matricesIndicesExtraAttrDesc.count);\r\n const floatIndices = [];\r\n for (let i = 0; i < matricesIndicesData.length; i++) {\r\n const index = matricesIndicesData[i];\r\n floatIndices.push(index & 0x000000ff);\r\n floatIndices.push((index & 0x0000ff00) >> 8);\r\n floatIndices.push((index & 0x00ff0000) >> 16);\r\n floatIndices.push((index >> 24) & 0xff); // & 0xFF to convert to v + 256 if v < 0\r\n }\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, floatIndices, false);\r\n }\r\n\r\n if (binaryInfo.matricesWeightsAttrDesc && binaryInfo.matricesWeightsAttrDesc.count > 0) {\r\n const matricesWeightsData = new Float32Array(parsedGeometry, binaryInfo.matricesWeightsAttrDesc.offset, binaryInfo.matricesWeightsAttrDesc.count);\r\n mesh.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeightsData, false);\r\n }\r\n\r\n if (binaryInfo.indicesAttrDesc && binaryInfo.indicesAttrDesc.count > 0) {\r\n const indicesData = new Int32Array(parsedGeometry, binaryInfo.indicesAttrDesc.offset, binaryInfo.indicesAttrDesc.count);\r\n mesh.setIndices(indicesData, null);\r\n }\r\n\r\n if (binaryInfo.subMeshesAttrDesc && binaryInfo.subMeshesAttrDesc.count > 0) {\r\n const subMeshesData = new Int32Array(parsedGeometry, binaryInfo.subMeshesAttrDesc.offset, binaryInfo.subMeshesAttrDesc.count * 5);\r\n\r\n mesh.subMeshes = [];\r\n for (let i = 0; i < binaryInfo.subMeshesAttrDesc.count; i++) {\r\n const materialIndex = subMeshesData[i * 5 + 0];\r\n const verticesStart = subMeshesData[i * 5 + 1];\r\n const verticesCount = subMeshesData[i * 5 + 2];\r\n const indexStart = subMeshesData[i * 5 + 3];\r\n const indexCount = subMeshesData[i * 5 + 4];\r\n\r\n SubMesh.AddToMesh(materialIndex, verticesStart, verticesCount, indexStart, indexCount, mesh);\r\n }\r\n }\r\n } else if (parsedGeometry.positions && parsedGeometry.normals && parsedGeometry.indices) {\r\n mesh.setVerticesData(VertexBuffer.PositionKind, parsedGeometry.positions, parsedGeometry.positions._updatable);\r\n\r\n mesh.setVerticesData(VertexBuffer.NormalKind, parsedGeometry.normals, parsedGeometry.normals._updatable);\r\n\r\n if (parsedGeometry.tangents) {\r\n mesh.setVerticesData(VertexBuffer.TangentKind, parsedGeometry.tangents, parsedGeometry.tangents._updatable);\r\n }\r\n\r\n if (parsedGeometry.uvs) {\r\n mesh.setVerticesData(VertexBuffer.UVKind, parsedGeometry.uvs, parsedGeometry.uvs._updatable);\r\n }\r\n\r\n if (parsedGeometry.uvs2) {\r\n mesh.setVerticesData(VertexBuffer.UV2Kind, parsedGeometry.uvs2, parsedGeometry.uvs2._updatable);\r\n }\r\n\r\n if (parsedGeometry.uvs3) {\r\n mesh.setVerticesData(VertexBuffer.UV3Kind, parsedGeometry.uvs3, parsedGeometry.uvs3._updatable);\r\n }\r\n\r\n if (parsedGeometry.uvs4) {\r\n mesh.setVerticesData(VertexBuffer.UV4Kind, parsedGeometry.uvs4, parsedGeometry.uvs4._updatable);\r\n }\r\n\r\n if (parsedGeometry.uvs5) {\r\n mesh.setVerticesData(VertexBuffer.UV5Kind, parsedGeometry.uvs5, parsedGeometry.uvs5._updatable);\r\n }\r\n\r\n if (parsedGeometry.uvs6) {\r\n mesh.setVerticesData(VertexBuffer.UV6Kind, parsedGeometry.uvs6, parsedGeometry.uvs6._updatable);\r\n }\r\n\r\n if (parsedGeometry.colors) {\r\n mesh.setVerticesData(VertexBuffer.ColorKind, Color4.CheckColors4(parsedGeometry.colors, parsedGeometry.positions.length / 3), parsedGeometry.colors._updatable);\r\n }\r\n\r\n if (parsedGeometry.matricesIndices) {\r\n if (!parsedGeometry.matricesIndices._isExpanded) {\r\n const floatIndices = [];\r\n\r\n for (let i = 0; i < parsedGeometry.matricesIndices.length; i++) {\r\n const matricesIndex = parsedGeometry.matricesIndices[i];\r\n\r\n floatIndices.push(matricesIndex & 0x000000ff);\r\n floatIndices.push((matricesIndex & 0x0000ff00) >> 8);\r\n floatIndices.push((matricesIndex & 0x00ff0000) >> 16);\r\n floatIndices.push((matricesIndex >> 24) & 0xff); // & 0xFF to convert to v + 256 if v < 0\r\n }\r\n\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, floatIndices, parsedGeometry.matricesIndices._updatable);\r\n } else {\r\n delete parsedGeometry.matricesIndices._isExpanded;\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, parsedGeometry.matricesIndices, parsedGeometry.matricesIndices._updatable);\r\n }\r\n }\r\n\r\n if (parsedGeometry.matricesIndicesExtra) {\r\n if (!parsedGeometry.matricesIndicesExtra._isExpanded) {\r\n const floatIndices = [];\r\n\r\n for (let i = 0; i < parsedGeometry.matricesIndicesExtra.length; i++) {\r\n const matricesIndex = parsedGeometry.matricesIndicesExtra[i];\r\n\r\n floatIndices.push(matricesIndex & 0x000000ff);\r\n floatIndices.push((matricesIndex & 0x0000ff00) >> 8);\r\n floatIndices.push((matricesIndex & 0x00ff0000) >> 16);\r\n floatIndices.push((matricesIndex >> 24) & 0xff); // & 0xFF to convert to v + 256 if v < 0\r\n }\r\n\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, floatIndices, parsedGeometry.matricesIndicesExtra._updatable);\r\n } else {\r\n delete parsedGeometry.matricesIndices._isExpanded;\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, parsedGeometry.matricesIndicesExtra, parsedGeometry.matricesIndicesExtra._updatable);\r\n }\r\n }\r\n\r\n if (parsedGeometry.matricesWeights) {\r\n Geometry._CleanMatricesWeights(parsedGeometry, mesh);\r\n mesh.setVerticesData(VertexBuffer.MatricesWeightsKind, parsedGeometry.matricesWeights, parsedGeometry.matricesWeights._updatable);\r\n }\r\n\r\n if (parsedGeometry.matricesWeightsExtra) {\r\n mesh.setVerticesData(VertexBuffer.MatricesWeightsExtraKind, parsedGeometry.matricesWeightsExtra, parsedGeometry.matricesWeights._updatable);\r\n }\r\n\r\n mesh.setIndices(parsedGeometry.indices, null);\r\n }\r\n\r\n // SubMeshes\r\n if (parsedGeometry.subMeshes) {\r\n mesh.subMeshes = [];\r\n for (let subIndex = 0; subIndex < parsedGeometry.subMeshes.length; subIndex++) {\r\n const parsedSubMesh = parsedGeometry.subMeshes[subIndex];\r\n\r\n SubMesh.AddToMesh(\r\n parsedSubMesh.materialIndex,\r\n parsedSubMesh.verticesStart,\r\n parsedSubMesh.verticesCount,\r\n parsedSubMesh.indexStart,\r\n parsedSubMesh.indexCount,\r\n mesh\r\n );\r\n }\r\n }\r\n\r\n // Flat shading\r\n if (mesh._shouldGenerateFlatShading) {\r\n mesh.convertToFlatShadedMesh();\r\n mesh._shouldGenerateFlatShading = false;\r\n }\r\n\r\n // Update\r\n mesh.computeWorldMatrix(true);\r\n\r\n scene.onMeshImportedObservable.notifyObservers(mesh);\r\n }\r\n\r\n private static _CleanMatricesWeights(parsedGeometry: any, mesh: Mesh): void {\r\n const epsilon: number = 1e-3;\r\n if (!SceneLoaderFlags.CleanBoneMatrixWeights) {\r\n return;\r\n }\r\n let noInfluenceBoneIndex = 0.0;\r\n if (parsedGeometry.skeletonId > -1) {\r\n const skeleton = mesh.getScene().getLastSkeletonById(parsedGeometry.skeletonId);\r\n\r\n if (!skeleton) {\r\n return;\r\n }\r\n noInfluenceBoneIndex = skeleton.bones.length;\r\n } else {\r\n return;\r\n }\r\n const matricesIndices = mesh.getVerticesData(VertexBuffer.MatricesIndicesKind);\r\n const matricesIndicesExtra = mesh.getVerticesData(VertexBuffer.MatricesIndicesExtraKind);\r\n const matricesWeights = parsedGeometry.matricesWeights;\r\n const matricesWeightsExtra = parsedGeometry.matricesWeightsExtra;\r\n const influencers = parsedGeometry.numBoneInfluencer;\r\n const size = matricesWeights.length;\r\n\r\n for (let i = 0; i < size; i += 4) {\r\n let weight = 0.0;\r\n let firstZeroWeight = -1;\r\n for (let j = 0; j < 4; j++) {\r\n const w = matricesWeights[i + j];\r\n weight += w;\r\n if (w < epsilon && firstZeroWeight < 0) {\r\n firstZeroWeight = j;\r\n }\r\n }\r\n if (matricesWeightsExtra) {\r\n for (let j = 0; j < 4; j++) {\r\n const w = matricesWeightsExtra[i + j];\r\n weight += w;\r\n if (w < epsilon && firstZeroWeight < 0) {\r\n firstZeroWeight = j + 4;\r\n }\r\n }\r\n }\r\n if (firstZeroWeight < 0 || firstZeroWeight > influencers - 1) {\r\n firstZeroWeight = influencers - 1;\r\n }\r\n if (weight > epsilon) {\r\n const mweight = 1.0 / weight;\r\n for (let j = 0; j < 4; j++) {\r\n matricesWeights[i + j] *= mweight;\r\n }\r\n if (matricesWeightsExtra) {\r\n for (let j = 0; j < 4; j++) {\r\n matricesWeightsExtra[i + j] *= mweight;\r\n }\r\n }\r\n } else {\r\n if (firstZeroWeight >= 4) {\r\n matricesWeightsExtra[i + firstZeroWeight - 4] = 1.0 - weight;\r\n matricesIndicesExtra[i + firstZeroWeight - 4] = noInfluenceBoneIndex;\r\n } else {\r\n matricesWeights[i + firstZeroWeight] = 1.0 - weight;\r\n matricesIndices[i + firstZeroWeight] = noInfluenceBoneIndex;\r\n }\r\n }\r\n }\r\n\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesKind, matricesIndices);\r\n if (parsedGeometry.matricesWeightsExtra) {\r\n mesh.setVerticesData(VertexBuffer.MatricesIndicesExtraKind, matricesIndicesExtra);\r\n }\r\n }\r\n\r\n /**\r\n * Create a new geometry from persisted data (Using .babylon file format)\r\n * @param parsedVertexData defines the persisted data\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root url to use to load assets (like delayed data)\r\n * @returns the new geometry object\r\n */\r\n public static Parse(parsedVertexData: any, scene: Scene, rootUrl: string): Nullable {\r\n const geometry = new Geometry(parsedVertexData.id, scene, undefined, parsedVertexData.updatable);\r\n geometry._loadedUniqueId = parsedVertexData.uniqueId;\r\n\r\n if (Tags) {\r\n Tags.AddTagsTo(geometry, parsedVertexData.tags);\r\n }\r\n\r\n if (parsedVertexData.delayLoadingFile) {\r\n geometry.delayLoadState = Constants.DELAYLOADSTATE_NOTLOADED;\r\n geometry.delayLoadingFile = rootUrl + parsedVertexData.delayLoadingFile;\r\n geometry._boundingInfo = new BoundingInfo(Vector3.FromArray(parsedVertexData.boundingBoxMinimum), Vector3.FromArray(parsedVertexData.boundingBoxMaximum));\r\n\r\n geometry._delayInfo = [];\r\n if (parsedVertexData.hasUVs) {\r\n geometry._delayInfo.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (parsedVertexData.hasUVs2) {\r\n geometry._delayInfo.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (parsedVertexData.hasUVs3) {\r\n geometry._delayInfo.push(VertexBuffer.UV3Kind);\r\n }\r\n\r\n if (parsedVertexData.hasUVs4) {\r\n geometry._delayInfo.push(VertexBuffer.UV4Kind);\r\n }\r\n\r\n if (parsedVertexData.hasUVs5) {\r\n geometry._delayInfo.push(VertexBuffer.UV5Kind);\r\n }\r\n\r\n if (parsedVertexData.hasUVs6) {\r\n geometry._delayInfo.push(VertexBuffer.UV6Kind);\r\n }\r\n\r\n if (parsedVertexData.hasColors) {\r\n geometry._delayInfo.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (parsedVertexData.hasMatricesIndices) {\r\n geometry._delayInfo.push(VertexBuffer.MatricesIndicesKind);\r\n }\r\n\r\n if (parsedVertexData.hasMatricesWeights) {\r\n geometry._delayInfo.push(VertexBuffer.MatricesWeightsKind);\r\n }\r\n\r\n geometry._delayLoadingFunction = VertexData.ImportVertexData;\r\n } else {\r\n VertexData.ImportVertexData(parsedVertexData, geometry);\r\n }\r\n\r\n scene.pushGeometry(geometry, true);\r\n\r\n return geometry;\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { Tags } from \"../Misc/tags\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\n/**\r\n * A multi-material is used to apply different materials to different parts of the same object without the need of\r\n * separate meshes. This can be use to improve performances.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials\r\n */\r\nexport class MultiMaterial extends Material {\r\n private _subMaterials: Nullable[];\r\n /** @internal */\r\n public _waitingSubMaterialsUniqueIds: string[] = [];\r\n\r\n /**\r\n * Gets or Sets the list of Materials used within the multi material.\r\n * They need to be ordered according to the submeshes order in the associated mesh\r\n */\r\n public get subMaterials(): Nullable[] {\r\n return this._subMaterials;\r\n }\r\n\r\n public set subMaterials(value: Nullable[]) {\r\n this._subMaterials = value;\r\n this._hookArray(value);\r\n }\r\n\r\n /**\r\n * Function used to align with Node.getChildren()\r\n * @returns the list of Materials used within the multi material\r\n */\r\n public getChildren(): Nullable[] {\r\n return this.subMaterials;\r\n }\r\n\r\n /**\r\n * Instantiates a new Multi Material\r\n * A multi-material is used to apply different materials to different parts of the same object without the need of\r\n * separate meshes. This can be use to improve performances.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials\r\n * @param name Define the name in the scene\r\n * @param scene Define the scene the material belongs to\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene, true);\r\n\r\n this.getScene().addMultiMaterial(this);\r\n\r\n this.subMaterials = [] as Material[];\r\n\r\n this._storeEffectOnSubMeshes = true; // multimaterial is considered like a push material\r\n }\r\n\r\n private _hookArray(array: Nullable[]): void {\r\n const oldPush = array.push;\r\n array.push = (...items: Nullable[]) => {\r\n const result = oldPush.apply(array, items);\r\n\r\n this._markAllSubMeshesAsTexturesDirty();\r\n\r\n return result;\r\n };\r\n\r\n const oldSplice = array.splice;\r\n array.splice = (index: number, deleteCount?: number) => {\r\n const deleted = oldSplice.apply(array, [index, deleteCount]);\r\n\r\n this._markAllSubMeshesAsTexturesDirty();\r\n\r\n return deleted;\r\n };\r\n }\r\n\r\n /**\r\n * Get one of the submaterial by its index in the submaterials array\r\n * @param index The index to look the sub material at\r\n * @returns The Material if the index has been defined\r\n */\r\n public getSubMaterial(index: number): Nullable {\r\n if (index < 0 || index >= this.subMaterials.length) {\r\n return this.getScene().defaultMaterial;\r\n }\r\n\r\n return this.subMaterials[index];\r\n }\r\n\r\n /**\r\n * Get the list of active textures for the whole sub materials list.\r\n * @returns All the textures that will be used during the rendering\r\n */\r\n public getActiveTextures(): BaseTexture[] {\r\n return super.getActiveTextures().concat(\r\n ...this.subMaterials.map((subMaterial) => {\r\n if (subMaterial) {\r\n return subMaterial.getActiveTextures();\r\n } else {\r\n return [];\r\n }\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Specifies if any sub-materials of this multi-material use a given texture.\r\n * @param texture Defines the texture to check against this multi-material's sub-materials.\r\n * @returns A boolean specifying if any sub-material of this multi-material uses the texture.\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n if (super.hasTexture(texture)) {\r\n return true;\r\n }\r\n\r\n for (let i = 0; i < this.subMaterials.length; i++) {\r\n if (this.subMaterials[i]?.hasTexture(texture)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets the current class name of the material e.g. \"MultiMaterial\"\r\n * Mainly use in serialization.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"MultiMaterial\";\r\n }\r\n\r\n /**\r\n * Checks if the material is ready to render the requested sub mesh\r\n * @param mesh Define the mesh the submesh belongs to\r\n * @param subMesh Define the sub mesh to look readiness for\r\n * @param useInstances Define whether or not the material is used with instances\r\n * @returns true if ready, otherwise false\r\n */\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean {\r\n for (let index = 0; index < this.subMaterials.length; index++) {\r\n const subMaterial = this.subMaterials[index];\r\n if (subMaterial) {\r\n if (subMaterial._storeEffectOnSubMeshes) {\r\n if (!subMaterial.isReadyForSubMesh(mesh, subMesh, useInstances)) {\r\n return false;\r\n }\r\n continue;\r\n }\r\n\r\n if (!subMaterial.isReady(mesh)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Clones the current material and its related sub materials\r\n * @param name Define the name of the newly cloned material\r\n * @param cloneChildren Define if submaterial will be cloned or shared with the parent instance\r\n * @returns the cloned material\r\n */\r\n public clone(name: string, cloneChildren?: boolean): MultiMaterial {\r\n const newMultiMaterial = new MultiMaterial(name, this.getScene());\r\n\r\n for (let index = 0; index < this.subMaterials.length; index++) {\r\n let subMaterial: Nullable = null;\r\n const current = this.subMaterials[index];\r\n if (cloneChildren && current) {\r\n subMaterial = current.clone(name + \"-\" + current.name);\r\n } else {\r\n subMaterial = this.subMaterials[index];\r\n }\r\n newMultiMaterial.subMaterials.push(subMaterial);\r\n }\r\n\r\n return newMultiMaterial;\r\n }\r\n\r\n /**\r\n * Serializes the materials into a JSON representation.\r\n * @returns the JSON representation\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.id = this.id;\r\n serializationObject.uniqueId = this.uniqueId;\r\n if (Tags) {\r\n serializationObject.tags = Tags.GetTags(this);\r\n }\r\n serializationObject.materialsUniqueIds = [];\r\n serializationObject.materials = [];\r\n\r\n for (let matIndex = 0; matIndex < this.subMaterials.length; matIndex++) {\r\n const subMat = this.subMaterials[matIndex];\r\n\r\n if (subMat) {\r\n serializationObject.materialsUniqueIds.push(subMat.uniqueId);\r\n serializationObject.materials.push(subMat.id);\r\n } else {\r\n serializationObject.materialsUniqueIds.push(null);\r\n serializationObject.materials.push(null);\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Dispose the material and release its associated resources\r\n * @param forceDisposeEffect Define if we want to force disposing the associated effect (if false the shader is not released and could be reuse later on)\r\n * @param forceDisposeTextures Define if we want to force disposing the associated textures (if false, they will not be disposed and can still be use elsewhere in the app)\r\n * @param forceDisposeChildren Define if we want to force disposing the associated submaterials (if false, they will not be disposed and can still be use elsewhere in the app)\r\n */\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, forceDisposeChildren?: boolean): void {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n if (forceDisposeChildren) {\r\n for (let index = 0; index < this.subMaterials.length; index++) {\r\n const subMaterial = this.subMaterials[index];\r\n if (subMaterial) {\r\n subMaterial.dispose(forceDisposeEffect, forceDisposeTextures);\r\n }\r\n }\r\n }\r\n\r\n const index = scene.multiMaterials.indexOf(this);\r\n if (index >= 0) {\r\n scene.multiMaterials.splice(index, 1);\r\n }\r\n\r\n super.dispose(forceDisposeEffect, forceDisposeTextures);\r\n }\r\n\r\n /**\r\n * Creates a MultiMaterial from parsed MultiMaterial data.\r\n * @param parsedMultiMaterial defines parsed MultiMaterial data.\r\n * @param scene defines the hosting scene\r\n * @returns a new MultiMaterial\r\n */\r\n public static ParseMultiMaterial(parsedMultiMaterial: any, scene: Scene): MultiMaterial {\r\n const multiMaterial = new MultiMaterial(parsedMultiMaterial.name, scene);\r\n\r\n multiMaterial.id = parsedMultiMaterial.id;\r\n multiMaterial._loadedUniqueId = parsedMultiMaterial.uniqueId;\r\n\r\n if (Tags) {\r\n Tags.AddTagsTo(multiMaterial, parsedMultiMaterial.tags);\r\n }\r\n\r\n if (parsedMultiMaterial.materialsUniqueIds) {\r\n multiMaterial._waitingSubMaterialsUniqueIds = parsedMultiMaterial.materialsUniqueIds;\r\n } else {\r\n parsedMultiMaterial.materials.forEach((subMatId: string) => multiMaterial.subMaterials.push(scene.getLastMaterialById(subMatId)));\r\n }\r\n\r\n return multiMaterial;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.MultiMaterial\", MultiMaterial);\r\n", "import type { Mesh } from \"./mesh\";\r\nimport type { Nullable } from \"../types\";\r\n\r\n/**\r\n * Class used to represent a specific level of detail of a mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\r\n */\r\nexport class MeshLODLevel {\r\n /**\r\n * Creates a new LOD level\r\n * @param distanceOrScreenCoverage defines either the distance or the screen coverage where this level should start being displayed\r\n * @param mesh defines the mesh to use to render this level\r\n */\r\n constructor(\r\n /** Either distance from the center of the object to show this level or the screen coverage if `useLODScreenCoverage` is set to `true` on the mesh*/\r\n public distanceOrScreenCoverage: number,\r\n /** Defines the mesh to use to render this level */\r\n public mesh: Nullable\r\n ) {}\r\n}\r\n", "/* eslint-disable jsdoc/require-returns-check */\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Tools, AsyncLoop } from \"../Misc/tools\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport { DeepCopier } from \"../Misc/deepCopier\";\r\nimport { Tags } from \"../Misc/tags\";\r\nimport type { Coroutine } from \"../Misc/coroutine\";\r\nimport { runCoroutineSync, runCoroutineAsync, createYieldingScheduler } from \"../Misc/coroutine\";\r\nimport type { Nullable, FloatArray, IndicesArray } from \"../types\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport type { Scene } from \"../scene\";\r\nimport { ScenePerformancePriority } from \"../scene\";\r\nimport type { Vector4 } from \"../Maths/math.vector\";\r\nimport { Quaternion, Matrix, Vector3, Vector2 } from \"../Maths/math.vector\";\r\nimport type { Color4 } from \"../Maths/math.color\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport { Node } from \"../node\";\r\nimport { VertexBuffer, Buffer } from \"../Buffers/buffer\";\r\nimport type { IGetSetVerticesData } from \"./mesh.vertexData\";\r\nimport { VertexData } from \"./mesh.vertexData\";\r\n\r\nimport { Geometry } from \"./geometry\";\r\nimport { AbstractMesh } from \"./abstractMesh\";\r\nimport { SubMesh } from \"./subMesh\";\r\nimport type { BoundingSphere } from \"../Culling/boundingSphere\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { MultiMaterial } from \"../Materials/multiMaterial\";\r\nimport { SceneLoaderFlags } from \"../Loading/sceneLoaderFlags\";\r\nimport type { Skeleton } from \"../Bones/skeleton\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { GetClass, RegisterClass } from \"../Misc/typeStore\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { MeshLODLevel } from \"./meshLODLevel\";\r\nimport type { Path3D } from \"../Maths/math.path\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport type { TransformNode } from \"./transformNode\";\r\nimport type { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { PhysicsEngine as PhysicsEngineV1 } from \"../Physics/v1/physicsEngine\";\r\n\r\nimport type { GoldbergMesh } from \"./goldbergMesh\";\r\nimport type { InstancedMesh } from \"./instancedMesh\";\r\nimport type { IPhysicsEnabledObject, PhysicsImpostor } from \"../Physics/v1/physicsImpostor\";\r\nimport type { ICreateCapsuleOptions } from \"./Builders/capsuleBuilder\";\r\nimport type { LinesMesh } from \"./linesMesh\";\r\nimport type { GroundMesh } from \"./groundMesh\";\r\nimport type { DataBuffer } from \"core/Buffers/dataBuffer\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class _CreationDataStorage {\r\n public closePath?: boolean;\r\n public closeArray?: boolean;\r\n public idx: number[];\r\n public dashSize: number;\r\n public gapSize: number;\r\n public path3D: Path3D;\r\n public pathArray: Vector3[][];\r\n public arc: number;\r\n public radius: number;\r\n public cap: number;\r\n public tessellation: number;\r\n}\r\n\r\n/**\r\n * @internal\r\n **/\r\nclass _InstanceDataStorage {\r\n public visibleInstances: any = {};\r\n public batchCache = new _InstancesBatch();\r\n public batchCacheReplacementModeInFrozenMode = new _InstancesBatch();\r\n public instancesBufferSize = 32 * 16 * 4; // let's start with a maximum of 32 instances\r\n public instancesBuffer: Nullable;\r\n public instancesPreviousBuffer: Nullable;\r\n public instancesData: Float32Array;\r\n public instancesPreviousData: Float32Array;\r\n public overridenInstanceCount: number;\r\n public isFrozen: boolean;\r\n public forceMatrixUpdates: boolean;\r\n public previousBatch: Nullable<_InstancesBatch>;\r\n public hardwareInstancedRendering: boolean;\r\n public sideOrientation: number;\r\n public manualUpdate: boolean;\r\n public previousManualUpdate: boolean;\r\n public previousRenderId: number;\r\n public masterMeshPreviousWorldMatrix: Nullable;\r\n}\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class _InstancesBatch {\r\n public mustReturn = false;\r\n public visibleInstances = new Array>>();\r\n public renderSelf: boolean[] = [];\r\n public hardwareInstancedRendering: boolean[] = [];\r\n}\r\n\r\n/**\r\n * @internal\r\n **/\r\nclass _ThinInstanceDataStorage {\r\n public instancesCount: number = 0;\r\n public matrixBuffer: Nullable = null;\r\n public previousMatrixBuffer: Nullable = null;\r\n public matrixBufferSize = 32 * 16; // let's start with a maximum of 32 thin instances\r\n public matrixData: Nullable = null;\r\n public previousMatrixData: Nullable;\r\n public boundingVectors: Array = [];\r\n public worldMatrices: Nullable = null;\r\n public masterMeshPreviousWorldMatrix: Nullable;\r\n}\r\n\r\n/**\r\n * @internal\r\n **/\r\nclass _InternalMeshDataInfo {\r\n // Events\r\n public _onBeforeRenderObservable: Nullable>;\r\n public _onBeforeBindObservable: Nullable>;\r\n public _onAfterRenderObservable: Nullable>;\r\n public _onBeforeDrawObservable: Nullable>;\r\n public _onBetweenPassObservable: Nullable>;\r\n\r\n public _areNormalsFrozen: boolean = false; // Will be used by ribbons mainly\r\n public _sourcePositions: Nullable; // Will be used to save original positions when using software skinning\r\n public _sourceNormals: Nullable; // Will be used to save original normals when using software skinning\r\n\r\n // Will be used to save a source mesh reference, If any\r\n public _source: Nullable = null;\r\n // Will be used to for fast cloned mesh lookup\r\n public meshMap: Nullable<{ [id: string]: Mesh | undefined }> = null;\r\n\r\n public _preActivateId: number = -1;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public _LODLevels = new Array();\r\n /** Alternative definition of LOD level, using screen coverage instead of distance */\r\n public _useLODScreenCoverage: boolean = false;\r\n public _checkReadinessObserver: Nullable>;\r\n\r\n public _onMeshReadyObserverAdded: (observer: Observer) => void;\r\n\r\n public _effectiveMaterial: Nullable = null;\r\n\r\n public _forcedInstanceCount: number = 0;\r\n\r\n public _overrideRenderingFillMode: Nullable = null;\r\n}\r\n\r\n/**\r\n * Class used to represent renderable models\r\n */\r\nexport class Mesh extends AbstractMesh implements IGetSetVerticesData {\r\n // Consts\r\n\r\n /**\r\n * Mesh side orientation : usually the external or front surface\r\n */\r\n public static readonly FRONTSIDE = VertexData.FRONTSIDE;\r\n\r\n /**\r\n * Mesh side orientation : usually the internal or back surface\r\n */\r\n public static readonly BACKSIDE = VertexData.BACKSIDE;\r\n /**\r\n * Mesh side orientation : both internal and external or front and back surfaces\r\n */\r\n public static readonly DOUBLESIDE = VertexData.DOUBLESIDE;\r\n /**\r\n * Mesh side orientation : by default, `FRONTSIDE`\r\n */\r\n public static readonly DEFAULTSIDE = VertexData.DEFAULTSIDE;\r\n /**\r\n * Mesh cap setting : no cap\r\n */\r\n public static readonly NO_CAP = 0;\r\n /**\r\n * Mesh cap setting : one cap at the beginning of the mesh\r\n */\r\n public static readonly CAP_START = 1;\r\n /**\r\n * Mesh cap setting : one cap at the end of the mesh\r\n */\r\n public static readonly CAP_END = 2;\r\n /**\r\n * Mesh cap setting : two caps, one at the beginning and one at the end of the mesh\r\n */\r\n public static readonly CAP_ALL = 3;\r\n /**\r\n * Mesh pattern setting : no flip or rotate\r\n */\r\n public static readonly NO_FLIP = 0;\r\n /**\r\n * Mesh pattern setting : flip (reflect in y axis) alternate tiles on each row or column\r\n */\r\n public static readonly FLIP_TILE = 1;\r\n /**\r\n * Mesh pattern setting : rotate (180degs) alternate tiles on each row or column\r\n */\r\n public static readonly ROTATE_TILE = 2;\r\n /**\r\n * Mesh pattern setting : flip (reflect in y axis) all tiles on alternate rows\r\n */\r\n public static readonly FLIP_ROW = 3;\r\n /**\r\n * Mesh pattern setting : rotate (180degs) all tiles on alternate rows\r\n */\r\n public static readonly ROTATE_ROW = 4;\r\n /**\r\n * Mesh pattern setting : flip and rotate alternate tiles on each row or column\r\n */\r\n public static readonly FLIP_N_ROTATE_TILE = 5;\r\n /**\r\n * Mesh pattern setting : rotate pattern and rotate\r\n */\r\n public static readonly FLIP_N_ROTATE_ROW = 6;\r\n /**\r\n * Mesh tile positioning : part tiles same on left/right or top/bottom\r\n */\r\n public static readonly CENTER = 0;\r\n /**\r\n * Mesh tile positioning : part tiles on left\r\n */\r\n public static readonly LEFT = 1;\r\n /**\r\n * Mesh tile positioning : part tiles on right\r\n */\r\n public static readonly RIGHT = 2;\r\n /**\r\n * Mesh tile positioning : part tiles on top\r\n */\r\n public static readonly TOP = 3;\r\n /**\r\n * Mesh tile positioning : part tiles on bottom\r\n */\r\n public static readonly BOTTOM = 4;\r\n\r\n /**\r\n * Indicates that the instanced meshes should be sorted from back to front before rendering if their material is transparent\r\n */\r\n public static INSTANCEDMESH_SORT_TRANSPARENT = false;\r\n\r\n /**\r\n * Gets the default side orientation.\r\n * @param orientation the orientation to value to attempt to get\r\n * @returns the default orientation\r\n * @internal\r\n */\r\n public static _GetDefaultSideOrientation(orientation?: number): number {\r\n return orientation || Mesh.FRONTSIDE; // works as Mesh.FRONTSIDE is 0\r\n }\r\n\r\n // Internal data\r\n private _internalMeshDataInfo = new _InternalMeshDataInfo();\r\n\r\n /**\r\n * Determines if the LOD levels are intended to be calculated using screen coverage (surface area ratio) instead of distance.\r\n */\r\n public get useLODScreenCoverage() {\r\n return this._internalMeshDataInfo._useLODScreenCoverage;\r\n }\r\n\r\n public set useLODScreenCoverage(value: boolean) {\r\n this._internalMeshDataInfo._useLODScreenCoverage = value;\r\n this._sortLODLevels();\r\n }\r\n\r\n /**\r\n * Will notify when the mesh is completely ready, including materials.\r\n * Observers added to this observable will be removed once triggered\r\n */\r\n public onMeshReadyObservable: Observable;\r\n\r\n public get computeBonesUsingShaders(): boolean {\r\n return this._internalAbstractMeshDataInfo._computeBonesUsingShaders;\r\n }\r\n public set computeBonesUsingShaders(value: boolean) {\r\n if (this._internalAbstractMeshDataInfo._computeBonesUsingShaders === value) {\r\n return;\r\n }\r\n\r\n if (value && this._internalMeshDataInfo._sourcePositions) {\r\n // switch from software to GPU computation: we need to reset the vertex and normal buffers that have been updated by the software process\r\n this.setVerticesData(VertexBuffer.PositionKind, this._internalMeshDataInfo._sourcePositions, true);\r\n if (this._internalMeshDataInfo._sourceNormals) {\r\n this.setVerticesData(VertexBuffer.NormalKind, this._internalMeshDataInfo._sourceNormals, true);\r\n }\r\n\r\n this._internalMeshDataInfo._sourcePositions = null;\r\n this._internalMeshDataInfo._sourceNormals = null;\r\n }\r\n\r\n this._internalAbstractMeshDataInfo._computeBonesUsingShaders = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n\r\n /**\r\n * An event triggered before rendering the mesh\r\n */\r\n public get onBeforeRenderObservable(): Observable {\r\n if (!this._internalMeshDataInfo._onBeforeRenderObservable) {\r\n this._internalMeshDataInfo._onBeforeRenderObservable = new Observable();\r\n }\r\n\r\n return this._internalMeshDataInfo._onBeforeRenderObservable;\r\n }\r\n\r\n /**\r\n * An event triggered before binding the mesh\r\n */\r\n public get onBeforeBindObservable(): Observable {\r\n if (!this._internalMeshDataInfo._onBeforeBindObservable) {\r\n this._internalMeshDataInfo._onBeforeBindObservable = new Observable();\r\n }\r\n\r\n return this._internalMeshDataInfo._onBeforeBindObservable;\r\n }\r\n\r\n /**\r\n * An event triggered after rendering the mesh\r\n */\r\n public get onAfterRenderObservable(): Observable {\r\n if (!this._internalMeshDataInfo._onAfterRenderObservable) {\r\n this._internalMeshDataInfo._onAfterRenderObservable = new Observable();\r\n }\r\n\r\n return this._internalMeshDataInfo._onAfterRenderObservable;\r\n }\r\n\r\n /**\r\n * An event triggeredbetween rendering pass when using separateCullingPass = true\r\n */\r\n public get onBetweenPassObservable(): Observable {\r\n if (!this._internalMeshDataInfo._onBetweenPassObservable) {\r\n this._internalMeshDataInfo._onBetweenPassObservable = new Observable();\r\n }\r\n\r\n return this._internalMeshDataInfo._onBetweenPassObservable;\r\n }\r\n\r\n /**\r\n * An event triggered before drawing the mesh\r\n */\r\n public get onBeforeDrawObservable(): Observable {\r\n if (!this._internalMeshDataInfo._onBeforeDrawObservable) {\r\n this._internalMeshDataInfo._onBeforeDrawObservable = new Observable();\r\n }\r\n\r\n return this._internalMeshDataInfo._onBeforeDrawObservable;\r\n }\r\n\r\n private _onBeforeDrawObserver: Nullable>;\r\n\r\n /**\r\n * Sets a callback to call before drawing the mesh. It is recommended to use onBeforeDrawObservable instead\r\n */\r\n public set onBeforeDraw(callback: () => void) {\r\n if (this._onBeforeDrawObserver) {\r\n this.onBeforeDrawObservable.remove(this._onBeforeDrawObserver);\r\n }\r\n this._onBeforeDrawObserver = this.onBeforeDrawObservable.add(callback);\r\n }\r\n\r\n public get hasInstances(): boolean {\r\n return this.instances.length > 0;\r\n }\r\n\r\n public get hasThinInstances(): boolean {\r\n return (this.forcedInstanceCount || this._thinInstanceDataStorage.instancesCount || 0) > 0;\r\n }\r\n\r\n // Members\r\n\r\n /**\r\n * Gets the delay loading state of the mesh (when delay loading is turned on)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/incrementalLoading\r\n */\r\n public delayLoadState = Constants.DELAYLOADSTATE_NONE;\r\n\r\n /**\r\n * Gets the list of instances created from this mesh\r\n * it is not supposed to be modified manually.\r\n * Note also that the order of the InstancedMesh wihin the array is not significant and might change.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\r\n */\r\n public instances: InstancedMesh[] = [];\r\n\r\n /**\r\n * Gets the file containing delay loading data for this mesh\r\n */\r\n public delayLoadingFile: string;\r\n\r\n /** @internal */\r\n public _binaryInfo: any;\r\n\r\n /**\r\n * User defined function used to change how LOD level selection is done\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\r\n */\r\n public onLODLevelSelection: (distance: number, mesh: Mesh, selectedLevel: Nullable) => void;\r\n\r\n // Private\r\n /** @internal */\r\n public _creationDataStorage: Nullable<_CreationDataStorage> = null;\r\n\r\n /** @internal */\r\n public _geometry: Nullable = null;\r\n /** @internal */\r\n public _delayInfo: Array;\r\n /** @internal */\r\n public _delayLoadingFunction: (any: any, mesh: Mesh) => void;\r\n\r\n /**\r\n * Gets or sets the forced number of instances to display.\r\n * If 0 (default value), the number of instances is not forced and depends on the draw type\r\n * (regular / instance / thin instances mesh)\r\n */\r\n public get forcedInstanceCount(): number {\r\n return this._internalMeshDataInfo._forcedInstanceCount;\r\n }\r\n\r\n public set forcedInstanceCount(count: number) {\r\n this._internalMeshDataInfo._forcedInstanceCount = count;\r\n }\r\n\r\n /** @internal */\r\n public _instanceDataStorage = new _InstanceDataStorage();\r\n\r\n /** @internal */\r\n public _thinInstanceDataStorage = new _ThinInstanceDataStorage();\r\n\r\n /** @internal */\r\n public _shouldGenerateFlatShading: boolean = false;\r\n\r\n // Use by builder only to know what orientation were the mesh build in.\r\n /** @internal */\r\n public _originalBuilderSideOrientation: number = Mesh.DEFAULTSIDE;\r\n\r\n /**\r\n * Use this property to change the original side orientation defined at construction time\r\n */\r\n public overrideMaterialSideOrientation: Nullable = null;\r\n\r\n /**\r\n * Use this property to override the Material's fillMode value\r\n */\r\n public get overrideRenderingFillMode(): Nullable {\r\n return this._internalMeshDataInfo._overrideRenderingFillMode;\r\n }\r\n\r\n public set overrideRenderingFillMode(fillMode: Nullable) {\r\n this._internalMeshDataInfo._overrideRenderingFillMode = fillMode;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating whether to render ignoring the active camera's max z setting. (false by default)\r\n * You should not mix meshes that have this property set to true with meshes that have it set to false if they all write\r\n * to the depth buffer, because the z-values are not comparable in the two cases and you will get rendering artifacts if you do.\r\n * You can set the property to true for meshes that do not write to the depth buffer, or set the same value (either false or true) otherwise.\r\n * Note this will reduce performance when set to true.\r\n */\r\n public ignoreCameraMaxZ = false;\r\n\r\n /**\r\n * Gets the source mesh (the one used to clone this one from)\r\n */\r\n public get source(): Nullable {\r\n return this._internalMeshDataInfo._source;\r\n }\r\n\r\n /**\r\n * Gets the list of clones of this mesh\r\n * The scene must have been constructed with useClonedMeshMap=true for this to work!\r\n * Note that useClonedMeshMap=true is the default setting\r\n */\r\n public get cloneMeshMap(): Nullable<{ [id: string]: Mesh | undefined }> {\r\n return this._internalMeshDataInfo.meshMap;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this mesh does not use index buffer\r\n */\r\n public get isUnIndexed(): boolean {\r\n return this._unIndexed;\r\n }\r\n\r\n public set isUnIndexed(value: boolean) {\r\n if (this._unIndexed !== value) {\r\n this._unIndexed = value;\r\n this._markSubMeshesAsAttributesDirty();\r\n }\r\n }\r\n\r\n /** Gets the array buffer used to store the instanced buffer used for instances' world matrices */\r\n public get worldMatrixInstancedBuffer() {\r\n return this._instanceDataStorage.instancesData;\r\n }\r\n\r\n /** Gets the array buffer used to store the instanced buffer used for instances' previous world matrices */\r\n public get previousWorldMatrixInstancedBuffer() {\r\n return this._instanceDataStorage.instancesPreviousData;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */\r\n public get manualUpdateOfWorldMatrixInstancedBuffer() {\r\n return this._instanceDataStorage.manualUpdate;\r\n }\r\n\r\n public set manualUpdateOfWorldMatrixInstancedBuffer(value: boolean) {\r\n this._instanceDataStorage.manualUpdate = value;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */\r\n public get manualUpdateOfPreviousWorldMatrixInstancedBuffer() {\r\n return this._instanceDataStorage.previousManualUpdate;\r\n }\r\n\r\n public set manualUpdateOfPreviousWorldMatrixInstancedBuffer(value: boolean) {\r\n this._instanceDataStorage.previousManualUpdate = value;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices must be performed in all cases (and notably even in frozen mode) */\r\n public get forceWorldMatrixInstancedBufferUpdate() {\r\n return this._instanceDataStorage.forceMatrixUpdates;\r\n }\r\n\r\n public set forceWorldMatrixInstancedBufferUpdate(value: boolean) {\r\n this._instanceDataStorage.forceMatrixUpdates = value;\r\n }\r\n\r\n /**\r\n * @constructor\r\n * @param name The value used by scene.getMeshByName() to do a lookup.\r\n * @param scene The scene to add this mesh to.\r\n * @param parent The parent of this mesh, if it has one\r\n * @param source An optional Mesh from which geometry is shared, cloned.\r\n * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False.\r\n * When false, achieved by calling a clone(), also passing False.\r\n * This will make creation of children, recursive.\r\n * @param clonePhysicsImpostor When cloning, include cloning mesh physics impostor, default True.\r\n */\r\n constructor(\r\n name: string,\r\n scene: Nullable = null,\r\n parent: Nullable = null,\r\n source: Nullable = null,\r\n doNotCloneChildren?: boolean,\r\n clonePhysicsImpostor: boolean = true\r\n ) {\r\n super(name, scene);\r\n\r\n scene = this.getScene();\r\n\r\n this._onBeforeDraw = (isInstance: boolean, world: Matrix, effectiveMaterial?: Material) => {\r\n if (isInstance && effectiveMaterial) {\r\n if (this._uniformBuffer) {\r\n this.transferToEffect(world);\r\n } else {\r\n effectiveMaterial.bindOnlyWorldMatrix(world);\r\n }\r\n }\r\n };\r\n\r\n if (source) {\r\n // Geometry\r\n if (source._geometry) {\r\n source._geometry.applyToMesh(this);\r\n }\r\n\r\n // Deep copy\r\n DeepCopier.DeepCopy(\r\n source,\r\n this,\r\n [\r\n \"name\",\r\n \"material\",\r\n \"skeleton\",\r\n \"instances\",\r\n \"parent\",\r\n \"uniqueId\",\r\n \"source\",\r\n \"metadata\",\r\n \"morphTargetManager\",\r\n \"hasInstances\",\r\n \"worldMatrixInstancedBuffer\",\r\n \"previousWorldMatrixInstancedBuffer\",\r\n \"hasLODLevels\",\r\n \"geometry\",\r\n \"isBlocked\",\r\n \"areNormalsFrozen\",\r\n \"facetNb\",\r\n \"isFacetDataEnabled\",\r\n \"lightSources\",\r\n \"useBones\",\r\n \"isAnInstance\",\r\n \"collider\",\r\n \"edgesRenderer\",\r\n \"forward\",\r\n \"up\",\r\n \"right\",\r\n \"absolutePosition\",\r\n \"absoluteScaling\",\r\n \"absoluteRotationQuaternion\",\r\n \"isWorldMatrixFrozen\",\r\n \"nonUniformScaling\",\r\n \"behaviors\",\r\n \"worldMatrixFromCache\",\r\n \"hasThinInstances\",\r\n \"cloneMeshMap\",\r\n \"hasBoundingInfo\",\r\n \"physicsBody\",\r\n \"physicsImpostor\",\r\n ],\r\n [\"_poseMatrix\"]\r\n );\r\n\r\n // Source mesh\r\n this._internalMeshDataInfo._source = source;\r\n if (scene.useClonedMeshMap) {\r\n if (!source._internalMeshDataInfo.meshMap) {\r\n source._internalMeshDataInfo.meshMap = {};\r\n }\r\n source._internalMeshDataInfo.meshMap[this.uniqueId] = this;\r\n }\r\n\r\n // Construction Params\r\n // Clone parameters allowing mesh to be updated in case of parametric shapes.\r\n this._originalBuilderSideOrientation = source._originalBuilderSideOrientation;\r\n this._creationDataStorage = source._creationDataStorage;\r\n\r\n // Animation ranges\r\n if (source._ranges) {\r\n const ranges = source._ranges;\r\n for (const name in ranges) {\r\n if (!Object.prototype.hasOwnProperty.call(ranges, name)) {\r\n continue;\r\n }\r\n\r\n if (!ranges[name]) {\r\n continue;\r\n }\r\n\r\n this.createAnimationRange(name, ranges[name]!.from, ranges[name]!.to);\r\n }\r\n }\r\n\r\n // Metadata\r\n if (source.metadata && source.metadata.clone) {\r\n this.metadata = source.metadata.clone();\r\n } else {\r\n this.metadata = source.metadata;\r\n }\r\n this._internalMetadata = source._internalMetadata;\r\n\r\n // Tags\r\n if (Tags && Tags.HasTags(source)) {\r\n Tags.AddTagsTo(this, Tags.GetTags(source, true));\r\n }\r\n\r\n // Enabled. We shouldn't need to check the source's ancestors, as this mesh\r\n // will have the same ones.\r\n this.setEnabled(source.isEnabled(false));\r\n\r\n // Parent\r\n this.parent = source.parent;\r\n\r\n // Pivot\r\n this.setPivotMatrix(source.getPivotMatrix(), this._postMultiplyPivotMatrix);\r\n\r\n this.id = name + \".\" + source.id;\r\n\r\n // Material\r\n this.material = source.material;\r\n\r\n if (!doNotCloneChildren) {\r\n // Children\r\n const directDescendants = source.getDescendants(true);\r\n for (let index = 0; index < directDescendants.length; index++) {\r\n const child = directDescendants[index];\r\n\r\n if ((child).clone) {\r\n (child).clone(name + \".\" + child.name, this);\r\n }\r\n }\r\n }\r\n\r\n // Morphs\r\n if (source.morphTargetManager) {\r\n this.morphTargetManager = source.morphTargetManager;\r\n }\r\n\r\n // Physics clone\r\n if (scene.getPhysicsEngine) {\r\n const physicsEngine = scene.getPhysicsEngine();\r\n if (clonePhysicsImpostor && physicsEngine) {\r\n if (physicsEngine.getPluginVersion() === 1) {\r\n const impostor = (physicsEngine as PhysicsEngineV1).getImpostorForPhysicsObject(source);\r\n if (impostor) {\r\n this.physicsImpostor = impostor.clone(this);\r\n }\r\n } else if (physicsEngine.getPluginVersion() === 2) {\r\n if (source.physicsBody) {\r\n source.physicsBody.clone(this);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Particles\r\n for (let index = 0; index < scene.particleSystems.length; index++) {\r\n const system = scene.particleSystems[index];\r\n\r\n if (system.emitter === source) {\r\n system.clone(system.name, this);\r\n }\r\n }\r\n\r\n // Skeleton\r\n this.skeleton = source.skeleton;\r\n\r\n this.refreshBoundingInfo(true, true);\r\n this.computeWorldMatrix(true);\r\n }\r\n\r\n // Parent\r\n if (parent !== null) {\r\n this.parent = parent;\r\n }\r\n\r\n this._instanceDataStorage.hardwareInstancedRendering = this.getEngine().getCaps().instancedArrays;\r\n\r\n this._internalMeshDataInfo._onMeshReadyObserverAdded = (observer: Observer) => {\r\n // only notify once! then unregister the observer\r\n observer.unregisterOnNextCall = true;\r\n if (this.isReady(true)) {\r\n this.onMeshReadyObservable.notifyObservers(this);\r\n } else {\r\n if (!this._internalMeshDataInfo._checkReadinessObserver) {\r\n this._internalMeshDataInfo._checkReadinessObserver = this._scene.onBeforeRenderObservable.add(() => {\r\n // check for complete readiness\r\n if (this.isReady(true)) {\r\n this._scene.onBeforeRenderObservable.remove(this._internalMeshDataInfo._checkReadinessObserver);\r\n this._internalMeshDataInfo._checkReadinessObserver = null;\r\n this.onMeshReadyObservable.notifyObservers(this);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n this.onMeshReadyObservable = new Observable(this._internalMeshDataInfo._onMeshReadyObserverAdded);\r\n\r\n if (source) {\r\n source.onClonedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n public instantiateHierarchy(\r\n newParent: Nullable = null,\r\n options?: { doNotInstantiate: boolean | ((node: TransformNode) => boolean) },\r\n onNewNodeCreated?: (source: TransformNode, clone: TransformNode) => void\r\n ): Nullable {\r\n const instance =\r\n this.getTotalVertices() === 0 || (options && options.doNotInstantiate && (options.doNotInstantiate === true || options.doNotInstantiate(this)))\r\n ? this.clone(\"Clone of \" + (this.name || this.id), newParent || this.parent, true)\r\n : this.createInstance(\"instance of \" + (this.name || this.id));\r\n\r\n instance.parent = newParent || this.parent;\r\n instance.position = this.position.clone();\r\n instance.scaling = this.scaling.clone();\r\n if (this.rotationQuaternion) {\r\n instance.rotationQuaternion = this.rotationQuaternion.clone();\r\n } else {\r\n instance.rotation = this.rotation.clone();\r\n }\r\n\r\n if (onNewNodeCreated) {\r\n onNewNodeCreated(this, instance);\r\n }\r\n\r\n for (const child of this.getChildTransformNodes(true)) {\r\n // instancedMesh should have a different sourced mesh\r\n if (child.getClassName() === \"InstancedMesh\" && instance.getClassName() === \"Mesh\" && (child as InstancedMesh).sourceMesh === this) {\r\n (child as InstancedMesh).instantiateHierarchy(\r\n instance,\r\n {\r\n doNotInstantiate: (options && options.doNotInstantiate) || false,\r\n newSourcedMesh: instance as Mesh,\r\n },\r\n onNewNodeCreated\r\n );\r\n } else {\r\n child.instantiateHierarchy(instance, options, onNewNodeCreated);\r\n }\r\n }\r\n\r\n return instance;\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns the string \"Mesh\".\r\n */\r\n public getClassName(): string {\r\n return \"Mesh\";\r\n }\r\n\r\n /** @internal */\r\n public get _isMesh() {\r\n return true;\r\n }\r\n\r\n /**\r\n * Returns a description of this mesh\r\n * @param fullDetails define if full details about this mesh must be used\r\n * @returns a descriptive string representing this mesh\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = super.toString(fullDetails);\r\n ret += \", n vertices: \" + this.getTotalVertices();\r\n ret += \", parent: \" + (this._waitingParentId ? this._waitingParentId : this.parent ? this.parent.name : \"NONE\");\r\n\r\n if (this.animations) {\r\n for (let i = 0; i < this.animations.length; i++) {\r\n ret += \", animation[0]: \" + this.animations[i].toString(fullDetails);\r\n }\r\n }\r\n\r\n if (fullDetails) {\r\n if (this._geometry) {\r\n const ib = this.getIndices();\r\n const vb = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (vb && ib) {\r\n ret += \", flat shading: \" + (vb.length / 3 === ib.length ? \"YES\" : \"NO\");\r\n }\r\n } else {\r\n ret += \", flat shading: UNKNOWN\";\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /** @internal */\r\n public _unBindEffect() {\r\n super._unBindEffect();\r\n\r\n for (const instance of this.instances) {\r\n instance._unBindEffect();\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this mesh has LOD\r\n */\r\n public get hasLODLevels(): boolean {\r\n return this._internalMeshDataInfo._LODLevels.length > 0;\r\n }\r\n\r\n /**\r\n * Gets the list of MeshLODLevel associated with the current mesh\r\n * @returns an array of MeshLODLevel\r\n */\r\n public getLODLevels(): MeshLODLevel[] {\r\n return this._internalMeshDataInfo._LODLevels;\r\n }\r\n\r\n private _sortLODLevels(): void {\r\n const sortingOrderFactor = this._internalMeshDataInfo._useLODScreenCoverage ? -1 : 1;\r\n this._internalMeshDataInfo._LODLevels.sort((a, b) => {\r\n if (a.distanceOrScreenCoverage < b.distanceOrScreenCoverage) {\r\n return sortingOrderFactor;\r\n }\r\n if (a.distanceOrScreenCoverage > b.distanceOrScreenCoverage) {\r\n return -sortingOrderFactor;\r\n }\r\n\r\n return 0;\r\n });\r\n }\r\n\r\n /**\r\n * Add a mesh as LOD level triggered at the given distance.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\r\n * @param distanceOrScreenCoverage Either distance from the center of the object to show this level or the screen coverage if `useScreenCoverage` is set to `true`.\r\n * If screen coverage, value is a fraction of the screen's total surface, between 0 and 1.\r\n * Example Playground for distance https://playground.babylonjs.com/#QE7KM#197\r\n * Example Playground for screen coverage https://playground.babylonjs.com/#QE7KM#196\r\n * @param mesh The mesh to be added as LOD level (can be null)\r\n * @returns This mesh (for chaining)\r\n */\r\n public addLODLevel(distanceOrScreenCoverage: number, mesh: Nullable): Mesh {\r\n if (mesh && mesh._masterMesh) {\r\n Logger.Warn(\"You cannot use a mesh as LOD level twice\");\r\n return this;\r\n }\r\n\r\n const level = new MeshLODLevel(distanceOrScreenCoverage, mesh);\r\n this._internalMeshDataInfo._LODLevels.push(level);\r\n\r\n if (mesh) {\r\n mesh._masterMesh = this;\r\n }\r\n\r\n this._sortLODLevels();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the LOD level mesh at the passed distance or null if not found.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\r\n * @param distance The distance from the center of the object to show this level\r\n * @returns a Mesh or `null`\r\n */\r\n public getLODLevelAtDistance(distance: number): Nullable {\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n for (let index = 0; index < internalDataInfo._LODLevels.length; index++) {\r\n const level = internalDataInfo._LODLevels[index];\r\n\r\n if (level.distanceOrScreenCoverage === distance) {\r\n return level.mesh;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Remove a mesh from the LOD array\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\r\n * @param mesh defines the mesh to be removed\r\n * @returns This mesh (for chaining)\r\n */\r\n public removeLODLevel(mesh: Nullable): Mesh {\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n for (let index = 0; index < internalDataInfo._LODLevels.length; index++) {\r\n if (internalDataInfo._LODLevels[index].mesh === mesh) {\r\n internalDataInfo._LODLevels.splice(index, 1);\r\n if (mesh) {\r\n mesh._masterMesh = null;\r\n }\r\n }\r\n }\r\n\r\n this._sortLODLevels();\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the registered LOD mesh distant from the parameter `camera` position if any, else returns the current mesh.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD\r\n * @param camera defines the camera to use to compute distance\r\n * @param boundingSphere defines a custom bounding sphere to use instead of the one from this mesh\r\n * @returns This mesh (for chaining)\r\n */\r\n public getLOD(camera: Camera, boundingSphere?: BoundingSphere): Nullable {\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n if (!internalDataInfo._LODLevels || internalDataInfo._LODLevels.length === 0) {\r\n return this;\r\n }\r\n\r\n const bSphere = boundingSphere || this.getBoundingInfo().boundingSphere;\r\n\r\n const distanceToCamera = camera.mode === Camera.ORTHOGRAPHIC_CAMERA ? camera.minZ : bSphere.centerWorld.subtract(camera.globalPosition).length();\r\n let compareValue = distanceToCamera;\r\n let compareSign = 1;\r\n\r\n if (internalDataInfo._useLODScreenCoverage) {\r\n const screenArea = camera.screenArea;\r\n let meshArea = (bSphere.radiusWorld * camera.minZ) / distanceToCamera;\r\n meshArea = meshArea * meshArea * Math.PI;\r\n compareValue = meshArea / screenArea;\r\n compareSign = -1;\r\n }\r\n\r\n if (compareSign * internalDataInfo._LODLevels[internalDataInfo._LODLevels.length - 1].distanceOrScreenCoverage > compareSign * compareValue) {\r\n if (this.onLODLevelSelection) {\r\n this.onLODLevelSelection(compareValue, this, this);\r\n }\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < internalDataInfo._LODLevels.length; index++) {\r\n const level = internalDataInfo._LODLevels[index];\r\n\r\n if (compareSign * level.distanceOrScreenCoverage < compareSign * compareValue) {\r\n if (level.mesh) {\r\n if (level.mesh.delayLoadState === Constants.DELAYLOADSTATE_NOTLOADED) {\r\n level.mesh._checkDelayState();\r\n return this;\r\n }\r\n\r\n if (level.mesh.delayLoadState === Constants.DELAYLOADSTATE_LOADING) {\r\n return this;\r\n }\r\n\r\n level.mesh._preActivate();\r\n level.mesh._updateSubMeshesBoundingInfo(this.worldMatrixFromCache);\r\n }\r\n\r\n if (this.onLODLevelSelection) {\r\n this.onLODLevelSelection(compareValue, this, level.mesh);\r\n }\r\n\r\n return level.mesh;\r\n }\r\n }\r\n\r\n if (this.onLODLevelSelection) {\r\n this.onLODLevelSelection(compareValue, this, this);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the mesh internal Geometry object\r\n */\r\n public get geometry(): Nullable {\r\n return this._geometry;\r\n }\r\n\r\n /**\r\n * Returns the total number of vertices within the mesh geometry or zero if the mesh has no geometry.\r\n * @returns the total number of vertices\r\n */\r\n public getTotalVertices(): number {\r\n if (this._geometry === null || this._geometry === undefined) {\r\n return 0;\r\n }\r\n return this._geometry.getTotalVertices();\r\n }\r\n\r\n /**\r\n * Returns the content of an associated vertex buffer\r\n * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param copyWhenShared defines a boolean indicating that if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one\r\n * @param forceCopy defines a boolean forcing the copy of the buffer no matter what the value of copyWhenShared is\r\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\r\n * @returns a FloatArray or null if the mesh has no geometry or no vertex buffer for this kind.\r\n */\r\n public getVerticesData(kind: string, copyWhenShared?: boolean, forceCopy?: boolean, bypassInstanceData?: boolean): Nullable {\r\n if (!this._geometry) {\r\n return null;\r\n }\r\n let data = bypassInstanceData\r\n ? undefined\r\n : this._userInstancedBuffersStorage?.vertexBuffers[kind]?.getFloatData(\r\n this.instances.length + 1, // +1 because the master mesh is not included in the instances array\r\n forceCopy || (copyWhenShared && this._geometry.meshes.length !== 1)\r\n );\r\n if (!data) {\r\n data = this._geometry.getVerticesData(kind, copyWhenShared, forceCopy);\r\n }\r\n return data;\r\n }\r\n\r\n /**\r\n * Returns the mesh VertexBuffer object from the requested `kind`\r\n * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.NormalKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\r\n * @returns a FloatArray or null if the mesh has no vertex buffer for this kind.\r\n */\r\n public getVertexBuffer(kind: string, bypassInstanceData?: boolean): Nullable {\r\n if (!this._geometry) {\r\n return null;\r\n }\r\n\r\n return (bypassInstanceData ? undefined : this._userInstancedBuffersStorage?.vertexBuffers[kind]) ?? this._geometry.getVertexBuffer(kind);\r\n }\r\n\r\n /**\r\n * Tests if a specific vertex buffer is associated with this mesh\r\n * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.NormalKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\r\n * @returns a boolean\r\n */\r\n public isVerticesDataPresent(kind: string, bypassInstanceData?: boolean): boolean {\r\n if (!this._geometry) {\r\n if (this._delayInfo) {\r\n return this._delayInfo.indexOf(kind) !== -1;\r\n }\r\n return false;\r\n }\r\n return (!bypassInstanceData && this._userInstancedBuffersStorage?.vertexBuffers[kind] !== undefined) || this._geometry.isVerticesDataPresent(kind);\r\n }\r\n\r\n /**\r\n * Returns a boolean defining if the vertex data for the requested `kind` is updatable.\r\n * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\r\n * @returns a boolean\r\n */\r\n public isVertexBufferUpdatable(kind: string, bypassInstanceData?: boolean): boolean {\r\n if (!this._geometry) {\r\n if (this._delayInfo) {\r\n return this._delayInfo.indexOf(kind) !== -1;\r\n }\r\n return false;\r\n }\r\n if (!bypassInstanceData) {\r\n const buffer = this._userInstancedBuffersStorage?.vertexBuffers[kind];\r\n if (buffer) {\r\n return buffer.isUpdatable();\r\n }\r\n }\r\n return this._geometry.isVertexBufferUpdatable(kind);\r\n }\r\n\r\n /**\r\n * Returns a string which contains the list of existing `kinds` of Vertex Data associated with this mesh.\r\n * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false\r\n * @returns an array of strings\r\n */\r\n public getVerticesDataKinds(bypassInstanceData?: boolean): string[] {\r\n if (!this._geometry) {\r\n const result: string[] = [];\r\n if (this._delayInfo) {\r\n this._delayInfo.forEach(function (kind) {\r\n result.push(kind);\r\n });\r\n }\r\n return result;\r\n }\r\n const kinds = this._geometry.getVerticesDataKinds();\r\n if (!bypassInstanceData && this._userInstancedBuffersStorage) {\r\n for (const kind in this._userInstancedBuffersStorage.vertexBuffers) {\r\n if (kinds.indexOf(kind) === -1) {\r\n kinds.push(kind);\r\n }\r\n }\r\n }\r\n return kinds;\r\n }\r\n\r\n /**\r\n * Returns a positive integer : the total number of indices in this mesh geometry.\r\n * @returns the numner of indices or zero if the mesh has no geometry.\r\n */\r\n public getTotalIndices(): number {\r\n if (!this._geometry) {\r\n return 0;\r\n }\r\n return this._geometry.getTotalIndices();\r\n }\r\n\r\n /**\r\n * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices.\r\n * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one.\r\n * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it\r\n * @returns the indices array or an empty array if the mesh has no geometry\r\n */\r\n public getIndices(copyWhenShared?: boolean, forceCopy?: boolean): Nullable {\r\n if (!this._geometry) {\r\n return [];\r\n }\r\n return this._geometry.getIndices(copyWhenShared, forceCopy);\r\n }\r\n\r\n public get isBlocked(): boolean {\r\n return this._masterMesh !== null && this._masterMesh !== undefined;\r\n }\r\n\r\n /**\r\n * Determine if the current mesh is ready to be rendered\r\n * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)\r\n * @param forceInstanceSupport will check if the mesh will be ready when used with instances (false by default)\r\n * @returns true if all associated assets are ready (material, textures, shaders)\r\n */\r\n public isReady(completeCheck = false, forceInstanceSupport = false): boolean {\r\n if (this.delayLoadState === Constants.DELAYLOADSTATE_LOADING) {\r\n return false;\r\n }\r\n\r\n if (!super.isReady(completeCheck)) {\r\n return false;\r\n }\r\n\r\n if (!this.subMeshes || this.subMeshes.length === 0) {\r\n return true;\r\n }\r\n\r\n if (!completeCheck) {\r\n return true;\r\n }\r\n\r\n const engine = this.getEngine();\r\n const scene = this.getScene();\r\n const hardwareInstancedRendering = forceInstanceSupport || (engine.getCaps().instancedArrays && (this.instances.length > 0 || this.hasThinInstances));\r\n\r\n this.computeWorldMatrix();\r\n\r\n const mat = this.material || scene.defaultMaterial;\r\n if (mat) {\r\n if (mat._storeEffectOnSubMeshes) {\r\n for (const subMesh of this.subMeshes) {\r\n const effectiveMaterial = subMesh.getMaterial();\r\n if (effectiveMaterial) {\r\n if (effectiveMaterial._storeEffectOnSubMeshes) {\r\n if (!effectiveMaterial.isReadyForSubMesh(this, subMesh, hardwareInstancedRendering)) {\r\n return false;\r\n }\r\n } else {\r\n if (!effectiveMaterial.isReady(this, hardwareInstancedRendering)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n if (!mat.isReady(this, hardwareInstancedRendering)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n // Shadows\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n for (const light of this.lightSources) {\r\n const generators = light.getShadowGenerators();\r\n\r\n if (!generators) {\r\n continue;\r\n }\r\n\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n if (generator && (!generator.getShadowMap()?.renderList || (generator.getShadowMap()?.renderList && generator.getShadowMap()?.renderList?.indexOf(this) !== -1))) {\r\n const shadowMap = generator.getShadowMap()!;\r\n const renderPassIds = shadowMap.renderPassIds ?? [engine.currentRenderPassId];\r\n for (let p = 0; p < renderPassIds.length; ++p) {\r\n engine.currentRenderPassId = renderPassIds[p];\r\n for (const subMesh of this.subMeshes) {\r\n if (!generator.isReady(subMesh, hardwareInstancedRendering, subMesh.getMaterial()?.needAlphaBlendingForMesh(this) ?? false)) {\r\n engine.currentRenderPassId = currentRenderPassId;\r\n return false;\r\n }\r\n }\r\n }\r\n engine.currentRenderPassId = currentRenderPassId;\r\n }\r\n }\r\n }\r\n\r\n // LOD\r\n for (const lod of this._internalMeshDataInfo._LODLevels) {\r\n if (lod.mesh && !lod.mesh.isReady(hardwareInstancedRendering)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the normals aren't to be recomputed on next mesh `positions` array update. This property is pertinent only for updatable parametric shapes.\r\n */\r\n public get areNormalsFrozen(): boolean {\r\n return this._internalMeshDataInfo._areNormalsFrozen;\r\n }\r\n\r\n /**\r\n * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It prevents the mesh normals from being recomputed on next `positions` array update.\r\n * @returns the current mesh\r\n */\r\n public freezeNormals(): Mesh {\r\n this._internalMeshDataInfo._areNormalsFrozen = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It reactivates the mesh normals computation if it was previously frozen\r\n * @returns the current mesh\r\n */\r\n public unfreezeNormals(): Mesh {\r\n this._internalMeshDataInfo._areNormalsFrozen = false;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets a value overriding the instance count. Only applicable when custom instanced InterleavedVertexBuffer are used rather than InstancedMeshs\r\n */\r\n public set overridenInstanceCount(count: number) {\r\n this._instanceDataStorage.overridenInstanceCount = count;\r\n }\r\n\r\n // Methods\r\n /** @internal */\r\n public _preActivate(): Mesh {\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n const sceneRenderId = this.getScene().getRenderId();\r\n if (internalDataInfo._preActivateId === sceneRenderId) {\r\n return this;\r\n }\r\n\r\n internalDataInfo._preActivateId = sceneRenderId;\r\n this._instanceDataStorage.visibleInstances = null;\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _preActivateForIntermediateRendering(renderId: number): Mesh {\r\n if (this._instanceDataStorage.visibleInstances) {\r\n this._instanceDataStorage.visibleInstances.intermediateDefaultRenderId = renderId;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _registerInstanceForRenderId(instance: InstancedMesh, renderId: number): Mesh {\r\n if (!this._instanceDataStorage.visibleInstances) {\r\n this._instanceDataStorage.visibleInstances = {\r\n defaultRenderId: renderId,\r\n selfDefaultRenderId: this._renderId,\r\n };\r\n }\r\n\r\n if (!this._instanceDataStorage.visibleInstances[renderId]) {\r\n if (this._instanceDataStorage.previousRenderId !== undefined && this._instanceDataStorage.isFrozen) {\r\n this._instanceDataStorage.visibleInstances[this._instanceDataStorage.previousRenderId] = null;\r\n }\r\n this._instanceDataStorage.previousRenderId = renderId;\r\n this._instanceDataStorage.visibleInstances[renderId] = new Array();\r\n }\r\n\r\n this._instanceDataStorage.visibleInstances[renderId].push(instance);\r\n return this;\r\n }\r\n\r\n protected _afterComputeWorldMatrix(): void {\r\n super._afterComputeWorldMatrix();\r\n\r\n if (!this.hasThinInstances) {\r\n return;\r\n }\r\n\r\n if (!this.doNotSyncBoundingInfo) {\r\n this.thinInstanceRefreshBoundingInfo(false);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _postActivate(): void {\r\n if (this.edgesShareWithInstances && this.edgesRenderer && this.edgesRenderer.isEnabled && this._renderingGroup) {\r\n this._renderingGroup._edgesRenderers.pushNoDuplicate(this.edgesRenderer);\r\n this.edgesRenderer.customInstances.push(this.getWorldMatrix());\r\n }\r\n }\r\n\r\n /**\r\n * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.\r\n * This means the mesh underlying bounding box and sphere are recomputed.\r\n * @param applySkeleton defines whether to apply the skeleton before computing the bounding info\r\n * @param applyMorph defines whether to apply the morph target before computing the bounding info\r\n * @returns the current mesh\r\n */\r\n public refreshBoundingInfo(applySkeleton: boolean = false, applyMorph: boolean = false): Mesh {\r\n if (this.hasBoundingInfo && this.getBoundingInfo().isLocked) {\r\n return this;\r\n }\r\n\r\n const bias = this.geometry ? this.geometry.boundingBias : null;\r\n this._refreshBoundingInfo(this._getPositionData(applySkeleton, applyMorph), bias);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _createGlobalSubMesh(force: boolean): Nullable {\r\n const totalVertices = this.getTotalVertices();\r\n if (!totalVertices || !this.getIndices()) {\r\n return null;\r\n }\r\n\r\n // Check if we need to recreate the submeshes\r\n if (this.subMeshes && this.subMeshes.length > 0) {\r\n const ib = this.getIndices();\r\n\r\n if (!ib) {\r\n return null;\r\n }\r\n\r\n const totalIndices = ib.length;\r\n let needToRecreate = false;\r\n\r\n if (force) {\r\n needToRecreate = true;\r\n } else {\r\n for (const submesh of this.subMeshes) {\r\n if (submesh.indexStart + submesh.indexCount > totalIndices) {\r\n needToRecreate = true;\r\n break;\r\n }\r\n\r\n if (submesh.verticesStart + submesh.verticesCount > totalVertices) {\r\n needToRecreate = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!needToRecreate) {\r\n return this.subMeshes[0];\r\n }\r\n }\r\n\r\n this.releaseSubMeshes();\r\n return new SubMesh(0, 0, totalVertices, 0, this.getTotalIndices(), this);\r\n }\r\n\r\n /**\r\n * This function will subdivide the mesh into multiple submeshes\r\n * @param count defines the expected number of submeshes\r\n */\r\n public subdivide(count: number): void {\r\n if (count < 1) {\r\n return;\r\n }\r\n\r\n const totalIndices = this.getTotalIndices();\r\n let subdivisionSize = (totalIndices / count) | 0;\r\n let offset = 0;\r\n\r\n // Ensure that subdivisionSize is a multiple of 3\r\n while (subdivisionSize % 3 !== 0) {\r\n subdivisionSize++;\r\n }\r\n\r\n this.releaseSubMeshes();\r\n for (let index = 0; index < count; index++) {\r\n if (offset >= totalIndices) {\r\n break;\r\n }\r\n\r\n SubMesh.CreateFromIndices(0, offset, index === count - 1 ? totalIndices - offset : subdivisionSize, this, undefined, false);\r\n\r\n offset += subdivisionSize;\r\n }\r\n\r\n this.refreshBoundingInfo();\r\n this.synchronizeInstances();\r\n }\r\n\r\n /**\r\n * Copy a FloatArray into a specific associated vertex buffer\r\n * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updatable defines if the updated vertex buffer must be flagged as updatable\r\n * @param stride defines the data stride size (can be null)\r\n * @returns the current mesh\r\n */\r\n public setVerticesData(kind: string, data: FloatArray, updatable: boolean = false, stride?: number): AbstractMesh {\r\n if (!this._geometry) {\r\n const vertexData = new VertexData();\r\n vertexData.set(data, kind);\r\n\r\n const scene = this.getScene();\r\n\r\n new Geometry(Geometry.RandomId(), scene, vertexData, updatable, this);\r\n } else {\r\n this._geometry.setVerticesData(kind, data, updatable, stride);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Delete a vertex buffer associated with this mesh\r\n * @param kind defines which buffer to delete (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n */\r\n public removeVerticesData(kind: string) {\r\n if (!this._geometry) {\r\n return;\r\n }\r\n\r\n this._geometry.removeVerticesData(kind);\r\n }\r\n\r\n /**\r\n * Flags an associated vertex buffer as updatable\r\n * @param kind defines which buffer to use (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param updatable defines if the updated vertex buffer must be flagged as updatable\r\n */\r\n public markVerticesDataAsUpdatable(kind: string, updatable = true) {\r\n const vb = this.getVertexBuffer(kind);\r\n\r\n if (!vb || vb.isUpdatable() === updatable) {\r\n return;\r\n }\r\n\r\n this.setVerticesData(kind, this.getVerticesData(kind), updatable);\r\n }\r\n\r\n /**\r\n * Sets the mesh global Vertex Buffer\r\n * @param buffer defines the buffer to use\r\n * @param disposeExistingBuffer disposes the existing buffer, if any (default: true)\r\n * @returns the current mesh\r\n */\r\n public setVerticesBuffer(buffer: VertexBuffer, disposeExistingBuffer = true): Mesh {\r\n if (!this._geometry) {\r\n this._geometry = Geometry.CreateGeometryForMesh(this);\r\n }\r\n\r\n this._geometry.setVerticesBuffer(buffer, null, disposeExistingBuffer);\r\n return this;\r\n }\r\n\r\n /**\r\n * Update a specific associated vertex buffer\r\n * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values :\r\n * - VertexBuffer.PositionKind\r\n * - VertexBuffer.UVKind\r\n * - VertexBuffer.UV2Kind\r\n * - VertexBuffer.UV3Kind\r\n * - VertexBuffer.UV4Kind\r\n * - VertexBuffer.UV5Kind\r\n * - VertexBuffer.UV6Kind\r\n * - VertexBuffer.ColorKind\r\n * - VertexBuffer.MatricesIndicesKind\r\n * - VertexBuffer.MatricesIndicesExtraKind\r\n * - VertexBuffer.MatricesWeightsKind\r\n * - VertexBuffer.MatricesWeightsExtraKind\r\n * @param data defines the data source\r\n * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for \"position\" kind\r\n * @param makeItUnique defines if the geometry associated with the mesh must be cloned to make the change only for this mesh (and not all meshes associated with the same geometry)\r\n * @returns the current mesh\r\n */\r\n public updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): AbstractMesh {\r\n if (!this._geometry) {\r\n return this;\r\n }\r\n if (!makeItUnique) {\r\n this._geometry.updateVerticesData(kind, data, updateExtends);\r\n } else {\r\n this.makeGeometryUnique();\r\n this.updateVerticesData(kind, data, updateExtends, false);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * This method updates the vertex positions of an updatable mesh according to the `positionFunction` returned values.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#other-shapes-updatemeshpositions\r\n * @param positionFunction is a simple JS function what is passed the mesh `positions` array. It doesn't need to return anything\r\n * @param computeNormals is a boolean (default true) to enable/disable the mesh normal recomputation after the vertex position update\r\n * @returns the current mesh\r\n */\r\n public updateMeshPositions(positionFunction: (data: FloatArray) => void, computeNormals: boolean = true): Mesh {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n if (!positions) {\r\n return this;\r\n }\r\n\r\n positionFunction(positions);\r\n this.updateVerticesData(VertexBuffer.PositionKind, positions, false, false);\r\n\r\n if (computeNormals) {\r\n const indices = this.getIndices();\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n\r\n if (!normals) {\r\n return this;\r\n }\r\n\r\n VertexData.ComputeNormals(positions, indices, normals);\r\n this.updateVerticesData(VertexBuffer.NormalKind, normals, false, false);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates a un-shared specific occurence of the geometry for the mesh.\r\n * @returns the current mesh\r\n */\r\n public makeGeometryUnique(): Mesh {\r\n if (!this._geometry) {\r\n return this;\r\n }\r\n\r\n if (this._geometry.meshes.length === 1) {\r\n return this;\r\n }\r\n\r\n const oldGeometry = this._geometry;\r\n const geometry = this._geometry.copy(Geometry.RandomId());\r\n oldGeometry.releaseForMesh(this, true);\r\n geometry.applyToMesh(this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the index buffer of this mesh.\r\n * @param indexBuffer Defines the index buffer to use for this mesh\r\n * @param totalVertices Defines the total number of vertices used by the buffer\r\n * @param totalIndices Defines the total number of indices in the index buffer\r\n */\r\n public setIndexBuffer(indexBuffer: DataBuffer, totalVertices: number, totalIndices: number): void {\r\n let geometry = this._geometry;\r\n if (!geometry) {\r\n geometry = new Geometry(Geometry.RandomId(), this.getScene(), undefined, undefined, this);\r\n }\r\n geometry.setIndexBuffer(indexBuffer, totalVertices, totalIndices);\r\n }\r\n\r\n /**\r\n * Set the index buffer of this mesh\r\n * @param indices defines the source data\r\n * @param totalVertices defines the total number of vertices referenced by this index data (can be null)\r\n * @param updatable defines if the updated index buffer must be flagged as updatable (default is false)\r\n * @returns the current mesh\r\n */\r\n public setIndices(indices: IndicesArray, totalVertices: Nullable = null, updatable: boolean = false): AbstractMesh {\r\n if (!this._geometry) {\r\n const vertexData = new VertexData();\r\n vertexData.indices = indices;\r\n\r\n const scene = this.getScene();\r\n\r\n new Geometry(Geometry.RandomId(), scene, vertexData, updatable, this);\r\n } else {\r\n this._geometry.setIndices(indices, totalVertices, updatable);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Update the current index buffer\r\n * @param indices defines the source data\r\n * @param offset defines the offset in the index buffer where to store the new data (can be null)\r\n * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)\r\n * @returns the current mesh\r\n */\r\n public updateIndices(indices: IndicesArray, offset?: number, gpuMemoryOnly = false): AbstractMesh {\r\n if (!this._geometry) {\r\n return this;\r\n }\r\n\r\n this._geometry.updateIndices(indices, offset, gpuMemoryOnly);\r\n return this;\r\n }\r\n\r\n /**\r\n * Invert the geometry to move from a right handed system to a left handed one.\r\n * @returns the current mesh\r\n */\r\n public toLeftHanded(): Mesh {\r\n if (!this._geometry) {\r\n return this;\r\n }\r\n this._geometry.toLeftHanded();\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bind(subMesh: SubMesh, effect: Effect, fillMode: number, allowInstancedRendering = true): Mesh {\r\n if (!this._geometry) {\r\n return this;\r\n }\r\n\r\n const engine = this.getScene().getEngine();\r\n\r\n // Morph targets\r\n if (this.morphTargetManager && this.morphTargetManager.isUsingTextureForTargets) {\r\n this.morphTargetManager._bind(effect);\r\n }\r\n\r\n // Wireframe\r\n let indexToBind;\r\n if (this._unIndexed) {\r\n indexToBind = null;\r\n } else {\r\n switch (this._getRenderingFillMode(fillMode)) {\r\n case Material.PointFillMode:\r\n indexToBind = null;\r\n break;\r\n case Material.WireFrameFillMode:\r\n indexToBind = subMesh._getLinesIndexBuffer(this.getIndices(), engine);\r\n break;\r\n default:\r\n case Material.TriangleFillMode:\r\n indexToBind = this._geometry.getIndexBuffer();\r\n break;\r\n }\r\n }\r\n\r\n // VBOs\r\n if (!allowInstancedRendering || !this._userInstancedBuffersStorage || this.hasThinInstances) {\r\n this._geometry._bind(effect, indexToBind);\r\n } else {\r\n this._geometry._bind(effect, indexToBind, this._userInstancedBuffersStorage.vertexBuffers, this._userInstancedBuffersStorage.vertexArrayObjects);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _draw(subMesh: SubMesh, fillMode: number, instancesCount?: number): Mesh {\r\n if (!this._geometry || !this._geometry.getVertexBuffers() || (!this._unIndexed && !this._geometry.getIndexBuffer())) {\r\n return this;\r\n }\r\n\r\n if (this._internalMeshDataInfo._onBeforeDrawObservable) {\r\n this._internalMeshDataInfo._onBeforeDrawObservable.notifyObservers(this);\r\n }\r\n\r\n const scene = this.getScene();\r\n const engine = scene.getEngine();\r\n\r\n if (this._unIndexed || fillMode == Material.PointFillMode) {\r\n // or triangles as points\r\n engine.drawArraysType(fillMode, subMesh.verticesStart, subMesh.verticesCount, this.forcedInstanceCount || instancesCount);\r\n } else if (fillMode == Material.WireFrameFillMode) {\r\n // Triangles as wireframe\r\n engine.drawElementsType(fillMode, 0, subMesh._linesIndexCount, this.forcedInstanceCount || instancesCount);\r\n } else {\r\n engine.drawElementsType(fillMode, subMesh.indexStart, subMesh.indexCount, this.forcedInstanceCount || instancesCount);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Registers for this mesh a javascript function called just before the rendering process\r\n * @param func defines the function to call before rendering this mesh\r\n * @returns the current mesh\r\n */\r\n public registerBeforeRender(func: (mesh: AbstractMesh) => void): Mesh {\r\n this.onBeforeRenderObservable.add(func);\r\n return this;\r\n }\r\n\r\n /**\r\n * Disposes a previously registered javascript function called before the rendering\r\n * @param func defines the function to remove\r\n * @returns the current mesh\r\n */\r\n public unregisterBeforeRender(func: (mesh: AbstractMesh) => void): Mesh {\r\n this.onBeforeRenderObservable.removeCallback(func);\r\n return this;\r\n }\r\n\r\n /**\r\n * Registers for this mesh a javascript function called just after the rendering is complete\r\n * @param func defines the function to call after rendering this mesh\r\n * @returns the current mesh\r\n */\r\n public registerAfterRender(func: (mesh: AbstractMesh) => void): Mesh {\r\n this.onAfterRenderObservable.add(func);\r\n return this;\r\n }\r\n\r\n /**\r\n * Disposes a previously registered javascript function called after the rendering.\r\n * @param func defines the function to remove\r\n * @returns the current mesh\r\n */\r\n public unregisterAfterRender(func: (mesh: AbstractMesh) => void): Mesh {\r\n this.onAfterRenderObservable.removeCallback(func);\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getInstancesRenderList(subMeshId: number, isReplacementMode: boolean = false): _InstancesBatch {\r\n if (this._instanceDataStorage.isFrozen) {\r\n if (isReplacementMode) {\r\n this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.hardwareInstancedRendering[subMeshId] = false;\r\n this._instanceDataStorage.batchCacheReplacementModeInFrozenMode.renderSelf[subMeshId] = true;\r\n return this._instanceDataStorage.batchCacheReplacementModeInFrozenMode;\r\n }\r\n if (this._instanceDataStorage.previousBatch) {\r\n return this._instanceDataStorage.previousBatch;\r\n }\r\n }\r\n const scene = this.getScene();\r\n const isInIntermediateRendering = scene._isInIntermediateRendering();\r\n const onlyForInstances = isInIntermediateRendering\r\n ? this._internalAbstractMeshDataInfo._onlyForInstancesIntermediate\r\n : this._internalAbstractMeshDataInfo._onlyForInstances;\r\n const batchCache = this._instanceDataStorage.batchCache;\r\n batchCache.mustReturn = false;\r\n batchCache.renderSelf[subMeshId] = isReplacementMode || (!onlyForInstances && this.isEnabled() && this.isVisible);\r\n batchCache.visibleInstances[subMeshId] = null;\r\n\r\n if (this._instanceDataStorage.visibleInstances && !isReplacementMode) {\r\n const visibleInstances = this._instanceDataStorage.visibleInstances;\r\n const currentRenderId = scene.getRenderId();\r\n const defaultRenderId = isInIntermediateRendering ? visibleInstances.intermediateDefaultRenderId : visibleInstances.defaultRenderId;\r\n batchCache.visibleInstances[subMeshId] = visibleInstances[currentRenderId];\r\n\r\n if (!batchCache.visibleInstances[subMeshId] && defaultRenderId) {\r\n batchCache.visibleInstances[subMeshId] = visibleInstances[defaultRenderId];\r\n }\r\n }\r\n batchCache.hardwareInstancedRendering[subMeshId] =\r\n !isReplacementMode &&\r\n this._instanceDataStorage.hardwareInstancedRendering &&\r\n batchCache.visibleInstances[subMeshId] !== null &&\r\n batchCache.visibleInstances[subMeshId] !== undefined;\r\n this._instanceDataStorage.previousBatch = batchCache;\r\n\r\n return batchCache;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderWithInstances(subMesh: SubMesh, fillMode: number, batch: _InstancesBatch, effect: Effect, engine: Engine): Mesh {\r\n const visibleInstances = batch.visibleInstances[subMesh._id];\r\n const visibleInstanceCount = visibleInstances ? visibleInstances.length : 0;\r\n\r\n const instanceStorage = this._instanceDataStorage;\r\n const currentInstancesBufferSize = instanceStorage.instancesBufferSize;\r\n let instancesBuffer = instanceStorage.instancesBuffer;\r\n let instancesPreviousBuffer = instanceStorage.instancesPreviousBuffer;\r\n const matricesCount = visibleInstanceCount + 1;\r\n const bufferSize = matricesCount * 16 * 4;\r\n\r\n while (instanceStorage.instancesBufferSize < bufferSize) {\r\n instanceStorage.instancesBufferSize *= 2;\r\n }\r\n\r\n if (!instanceStorage.instancesData || currentInstancesBufferSize != instanceStorage.instancesBufferSize) {\r\n instanceStorage.instancesData = new Float32Array(instanceStorage.instancesBufferSize / 4);\r\n }\r\n if ((this._scene.needsPreviousWorldMatrices && !instanceStorage.instancesPreviousData) || currentInstancesBufferSize != instanceStorage.instancesBufferSize) {\r\n instanceStorage.instancesPreviousData = new Float32Array(instanceStorage.instancesBufferSize / 4);\r\n }\r\n\r\n let offset = 0;\r\n let instancesCount = 0;\r\n\r\n const renderSelf = batch.renderSelf[subMesh._id];\r\n\r\n const needUpdateBuffer =\r\n !instancesBuffer ||\r\n currentInstancesBufferSize !== instanceStorage.instancesBufferSize ||\r\n (this._scene.needsPreviousWorldMatrices && !instanceStorage.instancesPreviousBuffer);\r\n\r\n if (!this._instanceDataStorage.manualUpdate && (!instanceStorage.isFrozen || needUpdateBuffer)) {\r\n const world = this.getWorldMatrix();\r\n if (renderSelf) {\r\n if (this._scene.needsPreviousWorldMatrices) {\r\n if (!instanceStorage.masterMeshPreviousWorldMatrix) {\r\n instanceStorage.masterMeshPreviousWorldMatrix = world.clone();\r\n instanceStorage.masterMeshPreviousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset);\r\n } else {\r\n instanceStorage.masterMeshPreviousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset);\r\n instanceStorage.masterMeshPreviousWorldMatrix.copyFrom(world);\r\n }\r\n }\r\n world.copyToArray(instanceStorage.instancesData, offset);\r\n offset += 16;\r\n instancesCount++;\r\n }\r\n\r\n if (visibleInstances) {\r\n if (Mesh.INSTANCEDMESH_SORT_TRANSPARENT && this._scene.activeCamera && subMesh.getMaterial()?.needAlphaBlendingForMesh(subMesh.getRenderingMesh())) {\r\n const cameraPosition = this._scene.activeCamera.globalPosition;\r\n for (let instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) {\r\n const instanceMesh = visibleInstances[instanceIndex];\r\n instanceMesh._distanceToCamera = Vector3.Distance(instanceMesh.getBoundingInfo().boundingSphere.centerWorld, cameraPosition);\r\n }\r\n visibleInstances.sort((m1, m2) => {\r\n return m1._distanceToCamera > m2._distanceToCamera ? -1 : m1._distanceToCamera < m2._distanceToCamera ? 1 : 0;\r\n });\r\n }\r\n for (let instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) {\r\n const instance = visibleInstances[instanceIndex];\r\n const matrix = instance.getWorldMatrix();\r\n matrix.copyToArray(instanceStorage.instancesData, offset);\r\n\r\n if (this._scene.needsPreviousWorldMatrices) {\r\n if (!instance._previousWorldMatrix) {\r\n instance._previousWorldMatrix = matrix.clone();\r\n instance._previousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset);\r\n } else {\r\n instance._previousWorldMatrix.copyToArray(instanceStorage.instancesPreviousData, offset);\r\n instance._previousWorldMatrix.copyFrom(matrix);\r\n }\r\n }\r\n\r\n offset += 16;\r\n instancesCount++;\r\n }\r\n }\r\n } else {\r\n instancesCount = (renderSelf ? 1 : 0) + visibleInstanceCount;\r\n }\r\n\r\n if (needUpdateBuffer) {\r\n if (instancesBuffer) {\r\n instancesBuffer.dispose();\r\n }\r\n\r\n if (instancesPreviousBuffer) {\r\n instancesPreviousBuffer.dispose();\r\n }\r\n\r\n instancesBuffer = new Buffer(engine, instanceStorage.instancesData, true, 16, false, true);\r\n instanceStorage.instancesBuffer = instancesBuffer;\r\n if (!this._userInstancedBuffersStorage) {\r\n this._userInstancedBuffersStorage = {\r\n data: {},\r\n vertexBuffers: {},\r\n strides: {},\r\n sizes: {},\r\n vertexArrayObjects: this.getEngine().getCaps().vertexArrayObject ? {} : undefined,\r\n };\r\n }\r\n\r\n this._userInstancedBuffersStorage.vertexBuffers[\"world0\"] = instancesBuffer.createVertexBuffer(\"world0\", 0, 4);\r\n this._userInstancedBuffersStorage.vertexBuffers[\"world1\"] = instancesBuffer.createVertexBuffer(\"world1\", 4, 4);\r\n this._userInstancedBuffersStorage.vertexBuffers[\"world2\"] = instancesBuffer.createVertexBuffer(\"world2\", 8, 4);\r\n this._userInstancedBuffersStorage.vertexBuffers[\"world3\"] = instancesBuffer.createVertexBuffer(\"world3\", 12, 4);\r\n\r\n if (this._scene.needsPreviousWorldMatrices) {\r\n instancesPreviousBuffer = new Buffer(engine, instanceStorage.instancesPreviousData, true, 16, false, true);\r\n instanceStorage.instancesPreviousBuffer = instancesPreviousBuffer;\r\n\r\n this._userInstancedBuffersStorage.vertexBuffers[\"previousWorld0\"] = instancesPreviousBuffer.createVertexBuffer(\"previousWorld0\", 0, 4);\r\n this._userInstancedBuffersStorage.vertexBuffers[\"previousWorld1\"] = instancesPreviousBuffer.createVertexBuffer(\"previousWorld1\", 4, 4);\r\n this._userInstancedBuffersStorage.vertexBuffers[\"previousWorld2\"] = instancesPreviousBuffer.createVertexBuffer(\"previousWorld2\", 8, 4);\r\n this._userInstancedBuffersStorage.vertexBuffers[\"previousWorld3\"] = instancesPreviousBuffer.createVertexBuffer(\"previousWorld3\", 12, 4);\r\n }\r\n this._invalidateInstanceVertexArrayObject();\r\n } else {\r\n if (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) {\r\n instancesBuffer!.updateDirectly(instanceStorage.instancesData, 0, instancesCount);\r\n if (this._scene.needsPreviousWorldMatrices && (!this._instanceDataStorage.manualUpdate || this._instanceDataStorage.previousManualUpdate)) {\r\n instancesPreviousBuffer!.updateDirectly(instanceStorage.instancesPreviousData, 0, instancesCount);\r\n }\r\n }\r\n }\r\n\r\n this._processInstancedBuffers(visibleInstances, renderSelf);\r\n\r\n // Stats\r\n this.getScene()._activeIndices.addCount(subMesh.indexCount * instancesCount, false);\r\n\r\n // Draw\r\n if (engine._currentDrawContext) {\r\n engine._currentDrawContext.useInstancing = true;\r\n }\r\n this._bind(subMesh, effect, fillMode);\r\n this._draw(subMesh, fillMode, instancesCount);\r\n\r\n // Write current matrices as previous matrices in case of manual update\r\n // Default behaviour when previous matrices are not specified explicitly\r\n // Will break if instances number/order changes\r\n if (\r\n this._scene.needsPreviousWorldMatrices &&\r\n !needUpdateBuffer &&\r\n this._instanceDataStorage.manualUpdate &&\r\n (!this._instanceDataStorage.isFrozen || this._instanceDataStorage.forceMatrixUpdates) &&\r\n !this._instanceDataStorage.previousManualUpdate\r\n ) {\r\n instancesPreviousBuffer!.updateDirectly(instanceStorage.instancesData, 0, instancesCount);\r\n }\r\n\r\n engine.unbindInstanceAttributes();\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderWithThinInstances(subMesh: SubMesh, fillMode: number, effect: Effect, engine: Engine) {\r\n // Stats\r\n const instancesCount = this._thinInstanceDataStorage?.instancesCount ?? 0;\r\n\r\n this.getScene()._activeIndices.addCount(subMesh.indexCount * instancesCount, false);\r\n\r\n // Draw\r\n if (engine._currentDrawContext) {\r\n engine._currentDrawContext.useInstancing = true;\r\n }\r\n this._bind(subMesh, effect, fillMode);\r\n this._draw(subMesh, fillMode, instancesCount);\r\n\r\n // Write current matrices as previous matrices\r\n // Default behaviour when previous matrices are not specified explicitly\r\n // Will break if instances number/order changes\r\n if (this._scene.needsPreviousWorldMatrices && !this._thinInstanceDataStorage.previousMatrixData && this._thinInstanceDataStorage.matrixData) {\r\n if (!this._thinInstanceDataStorage.previousMatrixBuffer) {\r\n this._thinInstanceDataStorage.previousMatrixBuffer = this._thinInstanceCreateMatrixBuffer(\"previousWorld\", this._thinInstanceDataStorage.matrixData, false);\r\n } else {\r\n this._thinInstanceDataStorage.previousMatrixBuffer!.updateDirectly(this._thinInstanceDataStorage.matrixData, 0, instancesCount);\r\n }\r\n }\r\n\r\n engine.unbindInstanceAttributes();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _processInstancedBuffers(visibleInstances: Nullable, renderSelf: boolean) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processRendering(\r\n renderingMesh: AbstractMesh,\r\n subMesh: SubMesh,\r\n effect: Effect,\r\n fillMode: number,\r\n batch: _InstancesBatch,\r\n hardwareInstancedRendering: boolean,\r\n onBeforeDraw: (isInstance: boolean, world: Matrix, effectiveMaterial?: Material) => void,\r\n effectiveMaterial?: Material\r\n ): Mesh {\r\n const scene = this.getScene();\r\n const engine = scene.getEngine();\r\n fillMode = this._getRenderingFillMode(fillMode);\r\n\r\n if (hardwareInstancedRendering && subMesh.getRenderingMesh().hasThinInstances) {\r\n this._renderWithThinInstances(subMesh, fillMode, effect, engine);\r\n return this;\r\n }\r\n\r\n if (hardwareInstancedRendering) {\r\n this._renderWithInstances(subMesh, fillMode, batch, effect, engine);\r\n } else {\r\n if (engine._currentDrawContext) {\r\n engine._currentDrawContext.useInstancing = false;\r\n }\r\n\r\n let instanceCount = 0;\r\n if (batch.renderSelf[subMesh._id]) {\r\n // Draw\r\n if (onBeforeDraw) {\r\n onBeforeDraw(false, renderingMesh.getWorldMatrix(), effectiveMaterial);\r\n }\r\n instanceCount++;\r\n\r\n this._draw(subMesh, fillMode, this._instanceDataStorage.overridenInstanceCount);\r\n }\r\n\r\n const visibleInstancesForSubMesh = batch.visibleInstances[subMesh._id];\r\n\r\n if (visibleInstancesForSubMesh) {\r\n const visibleInstanceCount = visibleInstancesForSubMesh.length;\r\n instanceCount += visibleInstanceCount;\r\n\r\n // Stats\r\n for (let instanceIndex = 0; instanceIndex < visibleInstanceCount; instanceIndex++) {\r\n const instance = visibleInstancesForSubMesh[instanceIndex];\r\n\r\n // World\r\n const world = instance.getWorldMatrix();\r\n if (onBeforeDraw) {\r\n onBeforeDraw(true, world, effectiveMaterial);\r\n }\r\n // Draw\r\n this._draw(subMesh, fillMode);\r\n }\r\n }\r\n\r\n // Stats\r\n scene._activeIndices.addCount(subMesh.indexCount * instanceCount, false);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _rebuild(dispose = false): void {\r\n if (this._instanceDataStorage.instancesBuffer) {\r\n // Dispose instance buffer to be recreated in _renderWithInstances when rendered\r\n if (dispose) {\r\n this._instanceDataStorage.instancesBuffer.dispose();\r\n }\r\n this._instanceDataStorage.instancesBuffer = null;\r\n }\r\n if (this._userInstancedBuffersStorage) {\r\n for (const kind in this._userInstancedBuffersStorage.vertexBuffers) {\r\n const buffer = this._userInstancedBuffersStorage.vertexBuffers[kind];\r\n if (buffer) {\r\n // Dispose instance buffer to be recreated in _renderWithInstances when rendered\r\n if (dispose) {\r\n buffer.dispose();\r\n }\r\n this._userInstancedBuffersStorage.vertexBuffers[kind] = null;\r\n }\r\n }\r\n if (this._userInstancedBuffersStorage.vertexArrayObjects) {\r\n this._userInstancedBuffersStorage.vertexArrayObjects = {};\r\n }\r\n }\r\n this._internalMeshDataInfo._effectiveMaterial = null;\r\n super._rebuild(dispose);\r\n }\r\n\r\n /** @internal */\r\n public _freeze() {\r\n if (!this.subMeshes) {\r\n return;\r\n }\r\n\r\n // Prepare batches\r\n for (let index = 0; index < this.subMeshes.length; index++) {\r\n this._getInstancesRenderList(index);\r\n }\r\n\r\n this._internalMeshDataInfo._effectiveMaterial = null;\r\n this._instanceDataStorage.isFrozen = true;\r\n }\r\n\r\n /** @internal */\r\n public _unFreeze() {\r\n this._instanceDataStorage.isFrozen = false;\r\n this._instanceDataStorage.previousBatch = null;\r\n }\r\n\r\n /**\r\n * Triggers the draw call for the mesh (or a submesh), for a specific render pass id\r\n * @param renderPassId defines the render pass id to use to draw the mesh / submesh. If not provided, use the current renderPassId of the engine.\r\n * @param enableAlphaMode defines if alpha mode can be changed (default: false)\r\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering (default: undefined)\r\n * @param subMesh defines the subMesh to render. If not provided, draw all mesh submeshes (default: undefined)\r\n * @param checkFrustumCulling defines if frustum culling must be checked (default: true). If you know the mesh is in the frustum (or if you don't care!), you can pass false to optimize.\r\n * @returns the current mesh\r\n */\r\n public renderWithRenderPassId(renderPassId?: number, enableAlphaMode?: boolean, effectiveMeshReplacement?: AbstractMesh, subMesh?: SubMesh, checkFrustumCulling = true) {\r\n const engine = this._scene.getEngine();\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n\r\n if (renderPassId !== undefined) {\r\n engine.currentRenderPassId = renderPassId;\r\n }\r\n\r\n if (subMesh) {\r\n if (!checkFrustumCulling || (checkFrustumCulling && subMesh.isInFrustum(this._scene._frustumPlanes))) {\r\n this.render(subMesh, !!enableAlphaMode, effectiveMeshReplacement);\r\n }\r\n } else {\r\n for (let s = 0; s < this.subMeshes.length; s++) {\r\n const subMesh = this.subMeshes[s];\r\n if (!checkFrustumCulling || (checkFrustumCulling && subMesh.isInFrustum(this._scene._frustumPlanes))) {\r\n this.render(subMesh, !!enableAlphaMode, effectiveMeshReplacement);\r\n }\r\n }\r\n }\r\n\r\n if (renderPassId !== undefined) {\r\n engine.currentRenderPassId = currentRenderPassId;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager\r\n * @param subMesh defines the subMesh to render\r\n * @param enableAlphaMode defines if alpha mode can be changed\r\n * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering\r\n * @returns the current mesh\r\n */\r\n public render(subMesh: SubMesh, enableAlphaMode: boolean, effectiveMeshReplacement?: AbstractMesh): Mesh {\r\n const scene = this.getScene();\r\n\r\n if (this._internalAbstractMeshDataInfo._isActiveIntermediate) {\r\n this._internalAbstractMeshDataInfo._isActiveIntermediate = false;\r\n } else {\r\n this._internalAbstractMeshDataInfo._isActive = false;\r\n }\r\n\r\n const numActiveCameras = scene.activeCameras?.length ?? 0;\r\n const canCheckOcclusionQuery = (numActiveCameras > 1 && scene.activeCamera === scene.activeCameras![0]) || numActiveCameras <= 1;\r\n\r\n if (canCheckOcclusionQuery && this._checkOcclusionQuery() && !this._occlusionDataStorage.forceRenderingWhenOccluded) {\r\n return this;\r\n }\r\n\r\n // Managing instances\r\n const batch = this._getInstancesRenderList(subMesh._id, !!effectiveMeshReplacement);\r\n\r\n if (batch.mustReturn) {\r\n return this;\r\n }\r\n\r\n // Checking geometry state\r\n if (!this._geometry || !this._geometry.getVertexBuffers() || (!this._unIndexed && !this._geometry.getIndexBuffer())) {\r\n return this;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n let oldCameraMaxZ = 0;\r\n let oldCamera: Nullable = null;\r\n if (this.ignoreCameraMaxZ && scene.activeCamera && !scene._isInIntermediateRendering()) {\r\n oldCameraMaxZ = scene.activeCamera.maxZ;\r\n oldCamera = scene.activeCamera;\r\n scene.activeCamera.maxZ = 0;\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n if (this._internalMeshDataInfo._onBeforeRenderObservable) {\r\n this._internalMeshDataInfo._onBeforeRenderObservable.notifyObservers(this);\r\n }\r\n\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n const hardwareInstancedRendering =\r\n batch.hardwareInstancedRendering[subMesh._id] ||\r\n renderingMesh.hasThinInstances ||\r\n (!!this._userInstancedBuffersStorage && !subMesh.getMesh()._internalAbstractMeshDataInfo._actAsRegularMesh);\r\n const instanceDataStorage = this._instanceDataStorage;\r\n\r\n const material = subMesh.getMaterial();\r\n if (!material) {\r\n if (oldCamera) {\r\n oldCamera.maxZ = oldCameraMaxZ;\r\n scene.updateTransformMatrix(true);\r\n }\r\n return this;\r\n }\r\n\r\n // Material\r\n if (!instanceDataStorage.isFrozen || !this._internalMeshDataInfo._effectiveMaterial || this._internalMeshDataInfo._effectiveMaterial !== material) {\r\n if (material._storeEffectOnSubMeshes) {\r\n if (!material.isReadyForSubMesh(this, subMesh, hardwareInstancedRendering)) {\r\n if (oldCamera) {\r\n oldCamera.maxZ = oldCameraMaxZ;\r\n scene.updateTransformMatrix(true);\r\n }\r\n return this;\r\n }\r\n } else if (!material.isReady(this, hardwareInstancedRendering)) {\r\n if (oldCamera) {\r\n oldCamera.maxZ = oldCameraMaxZ;\r\n scene.updateTransformMatrix(true);\r\n }\r\n return this;\r\n }\r\n\r\n this._internalMeshDataInfo._effectiveMaterial = material;\r\n } else if (\r\n (material._storeEffectOnSubMeshes && !subMesh._drawWrapper?._wasPreviouslyReady) ||\r\n (!material._storeEffectOnSubMeshes && !material._getDrawWrapper()._wasPreviouslyReady)\r\n ) {\r\n if (oldCamera) {\r\n oldCamera.maxZ = oldCameraMaxZ;\r\n scene.updateTransformMatrix(true);\r\n }\r\n return this;\r\n }\r\n\r\n // Alpha mode\r\n if (enableAlphaMode) {\r\n engine.setAlphaMode(this._internalMeshDataInfo._effectiveMaterial.alphaMode);\r\n }\r\n\r\n let drawWrapper: Nullable;\r\n if (this._internalMeshDataInfo._effectiveMaterial._storeEffectOnSubMeshes) {\r\n drawWrapper = subMesh._drawWrapper;\r\n } else {\r\n drawWrapper = this._internalMeshDataInfo._effectiveMaterial._getDrawWrapper();\r\n }\r\n\r\n const effect = drawWrapper?.effect ?? null;\r\n\r\n for (const step of scene._beforeRenderingMeshStage) {\r\n step.action(this, subMesh, batch, effect);\r\n }\r\n\r\n if (!drawWrapper || !effect) {\r\n if (oldCamera) {\r\n oldCamera.maxZ = oldCameraMaxZ;\r\n scene.updateTransformMatrix(true);\r\n }\r\n return this;\r\n }\r\n\r\n const effectiveMesh = effectiveMeshReplacement || this;\r\n\r\n let sideOrientation: Nullable;\r\n\r\n if (\r\n !instanceDataStorage.isFrozen &&\r\n (this._internalMeshDataInfo._effectiveMaterial.backFaceCulling ||\r\n this.overrideMaterialSideOrientation !== null ||\r\n (this._internalMeshDataInfo._effectiveMaterial as any).twoSidedLighting)\r\n ) {\r\n // Note: if two sided lighting is enabled, we need to ensure that the normal will point in the right direction even if the determinant of the world matrix is negative\r\n const mainDeterminant = effectiveMesh._getWorldMatrixDeterminant();\r\n sideOrientation = this.overrideMaterialSideOrientation;\r\n if (sideOrientation == null) {\r\n sideOrientation = this._internalMeshDataInfo._effectiveMaterial.sideOrientation;\r\n }\r\n if (mainDeterminant < 0) {\r\n sideOrientation = sideOrientation === Material.ClockWiseSideOrientation ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\r\n }\r\n instanceDataStorage.sideOrientation = sideOrientation!;\r\n } else {\r\n sideOrientation = instanceDataStorage.sideOrientation;\r\n }\r\n\r\n const reverse = this._internalMeshDataInfo._effectiveMaterial._preBind(drawWrapper, sideOrientation);\r\n\r\n if (this._internalMeshDataInfo._effectiveMaterial.forceDepthWrite) {\r\n engine.setDepthWrite(true);\r\n }\r\n\r\n // Bind\r\n const effectiveMaterial = this._internalMeshDataInfo._effectiveMaterial;\r\n const fillMode = effectiveMaterial.fillMode;\r\n\r\n if (this._internalMeshDataInfo._onBeforeBindObservable) {\r\n this._internalMeshDataInfo._onBeforeBindObservable.notifyObservers(this);\r\n }\r\n\r\n if (!hardwareInstancedRendering) {\r\n // Binding will be done later because we need to add more info to the VB\r\n this._bind(subMesh, effect, fillMode, false);\r\n }\r\n\r\n const world = effectiveMesh.getWorldMatrix();\r\n if (effectiveMaterial._storeEffectOnSubMeshes) {\r\n effectiveMaterial.bindForSubMesh(world, this, subMesh);\r\n } else {\r\n effectiveMaterial.bind(world, this);\r\n }\r\n\r\n if (!effectiveMaterial.backFaceCulling && effectiveMaterial.separateCullingPass) {\r\n engine.setState(true, effectiveMaterial.zOffset, false, !reverse, effectiveMaterial.cullBackFaces, effectiveMaterial.stencil, effectiveMaterial.zOffsetUnits);\r\n this._processRendering(this, subMesh, effect, fillMode, batch, hardwareInstancedRendering, this._onBeforeDraw, this._internalMeshDataInfo._effectiveMaterial);\r\n engine.setState(true, effectiveMaterial.zOffset, false, reverse, effectiveMaterial.cullBackFaces, effectiveMaterial.stencil, effectiveMaterial.zOffsetUnits);\r\n\r\n if (this._internalMeshDataInfo._onBetweenPassObservable) {\r\n this._internalMeshDataInfo._onBetweenPassObservable.notifyObservers(subMesh);\r\n }\r\n }\r\n\r\n // Draw\r\n this._processRendering(this, subMesh, effect, fillMode, batch, hardwareInstancedRendering, this._onBeforeDraw, this._internalMeshDataInfo._effectiveMaterial);\r\n\r\n // Unbind\r\n this._internalMeshDataInfo._effectiveMaterial.unbind();\r\n\r\n for (const step of scene._afterRenderingMeshStage) {\r\n step.action(this, subMesh, batch, effect);\r\n }\r\n\r\n if (this._internalMeshDataInfo._onAfterRenderObservable) {\r\n this._internalMeshDataInfo._onAfterRenderObservable.notifyObservers(this);\r\n }\r\n\r\n if (oldCamera) {\r\n oldCamera.maxZ = oldCameraMaxZ;\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n if (scene.performancePriority === ScenePerformancePriority.Aggressive && !instanceDataStorage.isFrozen) {\r\n this._freeze();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private _onBeforeDraw: (isInstance: boolean, world: Matrix, effectiveMaterial?: Material) => void;\r\n\r\n /**\r\n * Renormalize the mesh and patch it up if there are no weights\r\n * Similar to normalization by adding the weights compute the reciprocal and multiply all elements, this wil ensure that everything adds to 1.\r\n * However in the case of zero weights then we set just a single influence to 1.\r\n * We check in the function for extra's present and if so we use the normalizeSkinWeightsWithExtras rather than the FourWeights version.\r\n */\r\n public cleanMatrixWeights(): void {\r\n if (this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) {\r\n if (this.isVerticesDataPresent(VertexBuffer.MatricesWeightsExtraKind)) {\r\n this._normalizeSkinWeightsAndExtra();\r\n } else {\r\n this._normalizeSkinFourWeights();\r\n }\r\n }\r\n }\r\n\r\n // faster 4 weight version.\r\n private _normalizeSkinFourWeights(): void {\r\n const matricesWeights = this.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n const numWeights = matricesWeights.length;\r\n\r\n for (let a = 0; a < numWeights; a += 4) {\r\n // accumulate weights\r\n const t = matricesWeights[a] + matricesWeights[a + 1] + matricesWeights[a + 2] + matricesWeights[a + 3];\r\n // check for invalid weight and just set it to 1.\r\n if (t === 0) {\r\n matricesWeights[a] = 1;\r\n } else {\r\n // renormalize so everything adds to 1 use reciprocal\r\n const recip = 1 / t;\r\n matricesWeights[a] *= recip;\r\n matricesWeights[a + 1] *= recip;\r\n matricesWeights[a + 2] *= recip;\r\n matricesWeights[a + 3] *= recip;\r\n }\r\n }\r\n this.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeights);\r\n }\r\n // handle special case of extra verts. (in theory gltf can handle 12 influences)\r\n private _normalizeSkinWeightsAndExtra(): void {\r\n const matricesWeightsExtra = this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind);\r\n const matricesWeights = this.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n const numWeights = matricesWeights.length;\r\n\r\n for (let a = 0; a < numWeights; a += 4) {\r\n // accumulate weights\r\n let t = matricesWeights[a] + matricesWeights[a + 1] + matricesWeights[a + 2] + matricesWeights[a + 3];\r\n t += matricesWeightsExtra[a] + matricesWeightsExtra[a + 1] + matricesWeightsExtra[a + 2] + matricesWeightsExtra[a + 3];\r\n // check for invalid weight and just set it to 1.\r\n if (t === 0) {\r\n matricesWeights[a] = 1;\r\n } else {\r\n // renormalize so everything adds to 1 use reciprocal\r\n const recip = 1 / t;\r\n matricesWeights[a] *= recip;\r\n matricesWeights[a + 1] *= recip;\r\n matricesWeights[a + 2] *= recip;\r\n matricesWeights[a + 3] *= recip;\r\n // same goes for extras\r\n matricesWeightsExtra[a] *= recip;\r\n matricesWeightsExtra[a + 1] *= recip;\r\n matricesWeightsExtra[a + 2] *= recip;\r\n matricesWeightsExtra[a + 3] *= recip;\r\n }\r\n }\r\n this.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeights);\r\n this.setVerticesData(VertexBuffer.MatricesWeightsKind, matricesWeightsExtra);\r\n }\r\n\r\n /**\r\n * ValidateSkinning is used to determine that a mesh has valid skinning data along with skin metrics, if missing weights,\r\n * or not normalized it is returned as invalid mesh the string can be used for console logs, or on screen messages to let\r\n * the user know there was an issue with importing the mesh\r\n * @returns a validation object with skinned, valid and report string\r\n */\r\n public validateSkinning(): { skinned: boolean; valid: boolean; report: string } {\r\n const matricesWeightsExtra = this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind);\r\n const matricesWeights = this.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n if (matricesWeights === null || this.skeleton == null) {\r\n return { skinned: false, valid: true, report: \"not skinned\" };\r\n }\r\n\r\n const numWeights = matricesWeights.length;\r\n let numberNotSorted: number = 0;\r\n let missingWeights: number = 0;\r\n let maxUsedWeights: number = 0;\r\n let numberNotNormalized: number = 0;\r\n const numInfluences: number = matricesWeightsExtra === null ? 4 : 8;\r\n const usedWeightCounts: number[] = [];\r\n for (let a = 0; a <= numInfluences; a++) {\r\n usedWeightCounts[a] = 0;\r\n }\r\n const toleranceEpsilon: number = 0.001;\r\n\r\n for (let a = 0; a < numWeights; a += 4) {\r\n let lastWeight: number = matricesWeights[a];\r\n let t = lastWeight;\r\n let usedWeights: number = t === 0 ? 0 : 1;\r\n\r\n for (let b = 1; b < numInfluences; b++) {\r\n const d = b < 4 ? matricesWeights[a + b] : matricesWeightsExtra[a + b - 4];\r\n if (d > lastWeight) {\r\n numberNotSorted++;\r\n }\r\n if (d !== 0) {\r\n usedWeights++;\r\n }\r\n t += d;\r\n lastWeight = d;\r\n }\r\n // count the buffer weights usage\r\n usedWeightCounts[usedWeights]++;\r\n\r\n // max influences\r\n if (usedWeights > maxUsedWeights) {\r\n maxUsedWeights = usedWeights;\r\n }\r\n\r\n // check for invalid weight and just set it to 1.\r\n if (t === 0) {\r\n missingWeights++;\r\n } else {\r\n // renormalize so everything adds to 1 use reciprocal\r\n const recip = 1 / t;\r\n let tolerance = 0;\r\n for (let b = 0; b < numInfluences; b++) {\r\n if (b < 4) {\r\n tolerance += Math.abs(matricesWeights[a + b] - matricesWeights[a + b] * recip);\r\n } else {\r\n tolerance += Math.abs(matricesWeightsExtra[a + b - 4] - matricesWeightsExtra[a + b - 4] * recip);\r\n }\r\n }\r\n // arbitrary epsilon value for dictating not normalized\r\n if (tolerance > toleranceEpsilon) {\r\n numberNotNormalized++;\r\n }\r\n }\r\n }\r\n\r\n // validate bone indices are in range of the skeleton\r\n const numBones: number = this.skeleton.bones.length;\r\n const matricesIndices = this.getVerticesData(VertexBuffer.MatricesIndicesKind);\r\n const matricesIndicesExtra = this.getVerticesData(VertexBuffer.MatricesIndicesExtraKind);\r\n let numBadBoneIndices: number = 0;\r\n for (let a = 0; a < numWeights; a += 4) {\r\n for (let b = 0; b < numInfluences; b++) {\r\n const index = b < 4 ? matricesIndices[a + b] : matricesIndicesExtra[a + b - 4];\r\n if (index >= numBones || index < 0) {\r\n numBadBoneIndices++;\r\n }\r\n }\r\n }\r\n\r\n // log mesh stats\r\n const output =\r\n \"Number of Weights = \" +\r\n numWeights / 4 +\r\n \"\\nMaximum influences = \" +\r\n maxUsedWeights +\r\n \"\\nMissing Weights = \" +\r\n missingWeights +\r\n \"\\nNot Sorted = \" +\r\n numberNotSorted +\r\n \"\\nNot Normalized = \" +\r\n numberNotNormalized +\r\n \"\\nWeightCounts = [\" +\r\n usedWeightCounts +\r\n \"]\" +\r\n \"\\nNumber of bones = \" +\r\n numBones +\r\n \"\\nBad Bone Indices = \" +\r\n numBadBoneIndices;\r\n\r\n return { skinned: true, valid: missingWeights === 0 && numberNotNormalized === 0 && numBadBoneIndices === 0, report: output };\r\n }\r\n\r\n /** @internal */\r\n public _checkDelayState(): Mesh {\r\n const scene = this.getScene();\r\n if (this._geometry) {\r\n this._geometry.load(scene);\r\n } else if (this.delayLoadState === Constants.DELAYLOADSTATE_NOTLOADED) {\r\n this.delayLoadState = Constants.DELAYLOADSTATE_LOADING;\r\n\r\n this._queueLoad(scene);\r\n }\r\n return this;\r\n }\r\n\r\n private _queueLoad(scene: Scene): Mesh {\r\n scene.addPendingData(this);\r\n\r\n const getBinaryData = this.delayLoadingFile.indexOf(\".babylonbinarymeshdata\") !== -1;\r\n\r\n Tools.LoadFile(\r\n this.delayLoadingFile,\r\n (data) => {\r\n if (data instanceof ArrayBuffer) {\r\n this._delayLoadingFunction(data, this);\r\n } else {\r\n this._delayLoadingFunction(JSON.parse(data), this);\r\n }\r\n\r\n this.instances.forEach((instance) => {\r\n instance.refreshBoundingInfo();\r\n instance._syncSubMeshes();\r\n });\r\n\r\n this.delayLoadState = Constants.DELAYLOADSTATE_LOADED;\r\n scene.removePendingData(this);\r\n },\r\n () => {},\r\n scene.offlineProvider,\r\n getBinaryData\r\n );\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns `true` if the mesh is within the frustum defined by the passed array of planes.\r\n * A mesh is in the frustum if its bounding box intersects the frustum\r\n * @param frustumPlanes defines the frustum to test\r\n * @returns true if the mesh is in the frustum planes\r\n */\r\n public isInFrustum(frustumPlanes: Plane[]): boolean {\r\n if (this.delayLoadState === Constants.DELAYLOADSTATE_LOADING) {\r\n return false;\r\n }\r\n\r\n if (!super.isInFrustum(frustumPlanes)) {\r\n return false;\r\n }\r\n\r\n this._checkDelayState();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Sets the mesh material by the material or multiMaterial `id` property\r\n * @param id is a string identifying the material or the multiMaterial\r\n * @returns the current mesh\r\n */\r\n public setMaterialById(id: string): Mesh {\r\n const materials = this.getScene().materials;\r\n let index: number;\r\n for (index = materials.length - 1; index > -1; index--) {\r\n if (materials[index].id === id) {\r\n this.material = materials[index];\r\n return this;\r\n }\r\n }\r\n\r\n // Multi\r\n const multiMaterials = this.getScene().multiMaterials;\r\n for (index = multiMaterials.length - 1; index > -1; index--) {\r\n if (multiMaterials[index].id === id) {\r\n this.material = multiMaterials[index];\r\n return this;\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns as a new array populated with the mesh material and/or skeleton, if any.\r\n * @returns an array of IAnimatable\r\n */\r\n public getAnimatables(): IAnimatable[] {\r\n const results: IAnimatable[] = [];\r\n\r\n if (this.material) {\r\n results.push(this.material);\r\n }\r\n\r\n if (this.skeleton) {\r\n results.push(this.skeleton);\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Modifies the mesh geometry according to the passed transformation matrix.\r\n * This method returns nothing, but it really modifies the mesh even if it's originally not set as updatable.\r\n * The mesh normals are modified using the same transformation.\r\n * Note that, under the hood, this method sets a new VertexBuffer each call.\r\n * @param transform defines the transform matrix to use\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms\r\n * @returns the current mesh\r\n */\r\n public bakeTransformIntoVertices(transform: Matrix): Mesh {\r\n // Position\r\n if (!this.isVerticesDataPresent(VertexBuffer.PositionKind)) {\r\n return this;\r\n }\r\n\r\n const submeshes = this.subMeshes.splice(0);\r\n\r\n this._resetPointsArrayCache();\r\n\r\n let data = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n const temp = Vector3.Zero();\r\n let index: number;\r\n for (index = 0; index < data.length; index += 3) {\r\n Vector3.TransformCoordinatesFromFloatsToRef(data[index], data[index + 1], data[index + 2], transform, temp).toArray(data, index);\r\n }\r\n\r\n this.setVerticesData(VertexBuffer.PositionKind, data, (this.getVertexBuffer(VertexBuffer.PositionKind)).isUpdatable());\r\n\r\n // Normals\r\n if (this.isVerticesDataPresent(VertexBuffer.NormalKind)) {\r\n data = this.getVerticesData(VertexBuffer.NormalKind);\r\n for (index = 0; index < data.length; index += 3) {\r\n Vector3.TransformNormalFromFloatsToRef(data[index], data[index + 1], data[index + 2], transform, temp)\r\n .normalize()\r\n .toArray(data, index);\r\n }\r\n this.setVerticesData(VertexBuffer.NormalKind, data, (this.getVertexBuffer(VertexBuffer.NormalKind)).isUpdatable());\r\n }\r\n\r\n // Tangents\r\n if (this.isVerticesDataPresent(VertexBuffer.TangentKind)) {\r\n data = this.getVerticesData(VertexBuffer.TangentKind);\r\n for (index = 0; index < data.length; index += 4) {\r\n Vector3.TransformNormalFromFloatsToRef(data[index], data[index + 1], data[index + 2], transform, temp)\r\n .normalize()\r\n .toArray(data, index);\r\n }\r\n this.setVerticesData(VertexBuffer.TangentKind, data, (this.getVertexBuffer(VertexBuffer.TangentKind)).isUpdatable());\r\n }\r\n\r\n // flip faces?\r\n if (transform.determinant() < 0) {\r\n this.flipFaces();\r\n }\r\n\r\n // Restore submeshes\r\n this.releaseSubMeshes();\r\n this.subMeshes = submeshes;\r\n return this;\r\n }\r\n\r\n /**\r\n * Modifies the mesh geometry according to its own current World Matrix.\r\n * The mesh World Matrix is then reset.\r\n * This method returns nothing but really modifies the mesh even if it's originally not set as updatable.\r\n * Note that, under the hood, this method sets a new VertexBuffer each call.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms\r\n * @param bakeIndependentlyOfChildren indicates whether to preserve all child nodes' World Matrix during baking\r\n * @returns the current mesh\r\n */\r\n public bakeCurrentTransformIntoVertices(bakeIndependentlyOfChildren: boolean = true): Mesh {\r\n this.bakeTransformIntoVertices(this.computeWorldMatrix(true));\r\n this.resetLocalMatrix(bakeIndependentlyOfChildren);\r\n return this;\r\n }\r\n\r\n // Cache\r\n\r\n /** @internal */\r\n public get _positions(): Nullable {\r\n if (this._internalAbstractMeshDataInfo._positions) {\r\n return this._internalAbstractMeshDataInfo._positions;\r\n }\r\n\r\n if (this._geometry) {\r\n return this._geometry._positions;\r\n }\r\n return null;\r\n }\r\n\r\n /** @internal */\r\n public _resetPointsArrayCache(): Mesh {\r\n if (this._geometry) {\r\n this._geometry._resetPointsArrayCache();\r\n }\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n public _generatePointsArray(): boolean {\r\n if (this._geometry) {\r\n return this._geometry._generatePointsArray();\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns a new Mesh object generated from the current mesh properties.\r\n * This method must not get confused with createInstance()\r\n * @param name is a string, the name given to the new mesh\r\n * @param newParent can be any Node object (default `null`)\r\n * @param doNotCloneChildren allows/denies the recursive cloning of the original mesh children if any (default `false`)\r\n * @param clonePhysicsImpostor allows/denies the cloning in the same time of the original mesh `body` used by the physics engine, if any (default `true`)\r\n * @returns a new mesh\r\n */\r\n public clone(name: string = \"\", newParent: Nullable = null, doNotCloneChildren?: boolean, clonePhysicsImpostor: boolean = true): Mesh {\r\n return new Mesh(name, this.getScene(), newParent, this, doNotCloneChildren, clonePhysicsImpostor);\r\n }\r\n\r\n /**\r\n * Releases resources associated with this mesh.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n this.morphTargetManager = null;\r\n\r\n if (this._geometry) {\r\n this._geometry.releaseForMesh(this, true);\r\n }\r\n\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n\r\n if (internalDataInfo._onBeforeDrawObservable) {\r\n internalDataInfo._onBeforeDrawObservable.clear();\r\n }\r\n\r\n if (internalDataInfo._onBeforeBindObservable) {\r\n internalDataInfo._onBeforeBindObservable.clear();\r\n }\r\n\r\n if (internalDataInfo._onBeforeRenderObservable) {\r\n internalDataInfo._onBeforeRenderObservable.clear();\r\n }\r\n\r\n if (internalDataInfo._onAfterRenderObservable) {\r\n internalDataInfo._onAfterRenderObservable.clear();\r\n }\r\n\r\n if (internalDataInfo._onBetweenPassObservable) {\r\n internalDataInfo._onBetweenPassObservable.clear();\r\n }\r\n\r\n // Sources\r\n if (this._scene.useClonedMeshMap) {\r\n if (internalDataInfo.meshMap) {\r\n for (const uniqueId in internalDataInfo.meshMap) {\r\n const mesh = internalDataInfo.meshMap[uniqueId];\r\n if (mesh) {\r\n mesh._internalMeshDataInfo._source = null;\r\n internalDataInfo.meshMap[uniqueId] = undefined;\r\n }\r\n }\r\n }\r\n\r\n if (internalDataInfo._source && internalDataInfo._source._internalMeshDataInfo.meshMap) {\r\n internalDataInfo._source._internalMeshDataInfo.meshMap[this.uniqueId] = undefined;\r\n }\r\n } else {\r\n const meshes = this.getScene().meshes;\r\n for (const abstractMesh of meshes) {\r\n const mesh = abstractMesh as Mesh;\r\n if (mesh._internalMeshDataInfo && mesh._internalMeshDataInfo._source && mesh._internalMeshDataInfo._source === this) {\r\n mesh._internalMeshDataInfo._source = null;\r\n }\r\n }\r\n }\r\n\r\n internalDataInfo._source = null;\r\n this._instanceDataStorage.visibleInstances = {};\r\n\r\n // Instances\r\n this._disposeInstanceSpecificData();\r\n\r\n // Thin instances\r\n this._disposeThinInstanceSpecificData();\r\n\r\n if (this._internalMeshDataInfo._checkReadinessObserver) {\r\n this._scene.onBeforeRenderObservable.remove(this._internalMeshDataInfo._checkReadinessObserver);\r\n }\r\n\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n /** @internal */\r\n public _disposeInstanceSpecificData() {\r\n // Do nothing\r\n }\r\n\r\n /** @internal */\r\n public _disposeThinInstanceSpecificData() {\r\n // Do nothing\r\n }\r\n\r\n /** @internal */\r\n public _invalidateInstanceVertexArrayObject() {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Modifies the mesh geometry according to a displacement map.\r\n * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex.\r\n * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated.\r\n * @param url is a string, the URL from the image file is to be downloaded.\r\n * @param minHeight is the lower limit of the displacement.\r\n * @param maxHeight is the upper limit of the displacement.\r\n * @param onSuccess is an optional Javascript function to be called just after the mesh is modified. It is passed the modified mesh and must return nothing.\r\n * @param uvOffset is an optional vector2 used to offset UV.\r\n * @param uvScale is an optional vector2 used to scale UV.\r\n * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance.\r\n * @param onError defines a callback called when an error occurs during the processing of the request.\r\n * @returns the Mesh.\r\n */\r\n public applyDisplacementMap(\r\n url: string,\r\n minHeight: number,\r\n maxHeight: number,\r\n onSuccess?: (mesh: Mesh) => void,\r\n uvOffset?: Vector2,\r\n uvScale?: Vector2,\r\n forceUpdate = false,\r\n onError?: (message?: string, exception?: any) => void\r\n ): Mesh {\r\n const scene = this.getScene();\r\n\r\n const onload = (img: HTMLImageElement | ImageBitmap) => {\r\n // Getting height map data\r\n const heightMapWidth = img.width;\r\n const heightMapHeight = img.height;\r\n const canvas = this.getEngine().createCanvas(heightMapWidth, heightMapHeight);\r\n const context = canvas.getContext(\"2d\");\r\n\r\n context.drawImage(img, 0, 0);\r\n\r\n // Create VertexData from map data\r\n //Cast is due to wrong definition in lib.d.ts from ts 1.3 - https://github.com/Microsoft/TypeScript/issues/949\r\n const buffer = (context.getImageData(0, 0, heightMapWidth, heightMapHeight).data);\r\n\r\n this.applyDisplacementMapFromBuffer(buffer, heightMapWidth, heightMapHeight, minHeight, maxHeight, uvOffset, uvScale, forceUpdate);\r\n //execute success callback, if set\r\n if (onSuccess) {\r\n onSuccess(this);\r\n }\r\n };\r\n\r\n Tools.LoadImage(url, onload, onError ? onError : () => {}, scene.offlineProvider);\r\n return this;\r\n }\r\n\r\n /**\r\n * Modifies the mesh geometry according to a displacementMap buffer.\r\n * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex.\r\n * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated.\r\n * @param buffer is a `Uint8Array` buffer containing series of `Uint8` lower than 255, the red, green, blue and alpha values of each successive pixel.\r\n * @param heightMapWidth is the width of the buffer image.\r\n * @param heightMapHeight is the height of the buffer image.\r\n * @param minHeight is the lower limit of the displacement.\r\n * @param maxHeight is the upper limit of the displacement.\r\n * @param uvOffset is an optional vector2 used to offset UV.\r\n * @param uvScale is an optional vector2 used to scale UV.\r\n * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance.\r\n * @returns the Mesh.\r\n */\r\n public applyDisplacementMapFromBuffer(\r\n buffer: Uint8Array,\r\n heightMapWidth: number,\r\n heightMapHeight: number,\r\n minHeight: number,\r\n maxHeight: number,\r\n uvOffset?: Vector2,\r\n uvScale?: Vector2,\r\n forceUpdate = false\r\n ): Mesh {\r\n if (!this.isVerticesDataPresent(VertexBuffer.PositionKind) || !this.isVerticesDataPresent(VertexBuffer.NormalKind) || !this.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n Logger.Warn(\"Cannot call applyDisplacementMap: Given mesh is not complete. Position, Normal or UV are missing\");\r\n return this;\r\n }\r\n\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind, true, true);\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n const uvs = this.getVerticesData(VertexBuffer.UVKind);\r\n let position = Vector3.Zero();\r\n const normal = Vector3.Zero();\r\n const uv = Vector2.Zero();\r\n\r\n uvOffset = uvOffset || Vector2.Zero();\r\n uvScale = uvScale || new Vector2(1, 1);\r\n\r\n for (let index = 0; index < positions.length; index += 3) {\r\n Vector3.FromArrayToRef(positions, index, position);\r\n Vector3.FromArrayToRef(normals, index, normal);\r\n Vector2.FromArrayToRef(uvs, (index / 3) * 2, uv);\r\n\r\n // Compute height\r\n const u = (Math.abs(uv.x * uvScale.x + (uvOffset.x % 1)) * (heightMapWidth - 1)) % heightMapWidth | 0;\r\n const v = (Math.abs(uv.y * uvScale.y + (uvOffset.y % 1)) * (heightMapHeight - 1)) % heightMapHeight | 0;\r\n\r\n const pos = (u + v * heightMapWidth) * 4;\r\n const r = buffer[pos] / 255.0;\r\n const g = buffer[pos + 1] / 255.0;\r\n const b = buffer[pos + 2] / 255.0;\r\n\r\n const gradient = r * 0.3 + g * 0.59 + b * 0.11;\r\n\r\n normal.normalize();\r\n normal.scaleInPlace(minHeight + (maxHeight - minHeight) * gradient);\r\n position = position.add(normal);\r\n\r\n position.toArray(positions, index);\r\n }\r\n\r\n VertexData.ComputeNormals(positions, this.getIndices(), normals);\r\n\r\n if (forceUpdate) {\r\n this.setVerticesData(VertexBuffer.PositionKind, positions);\r\n this.setVerticesData(VertexBuffer.NormalKind, normals);\r\n this.setVerticesData(VertexBuffer.UVKind, uvs);\r\n } else {\r\n this.updateVerticesData(VertexBuffer.PositionKind, positions);\r\n this.updateVerticesData(VertexBuffer.NormalKind, normals);\r\n }\r\n return this;\r\n }\r\n\r\n private _getFlattenedNormals(indices: IndicesArray, positions: FloatArray): Float32Array {\r\n const normals = new Float32Array(indices.length * 3);\r\n let normalsCount = 0;\r\n\r\n // Decide if normals should be flipped\r\n const flipNormalGeneration =\r\n this.overrideMaterialSideOrientation ===\r\n (this._scene.useRightHandedSystem ? Constants.MATERIAL_CounterClockWiseSideOrientation : Constants.MATERIAL_ClockWiseSideOrientation);\r\n\r\n // Generate new normals\r\n for (let index = 0; index < indices.length; index += 3) {\r\n const p1 = Vector3.FromArray(positions, indices[index] * 3);\r\n const p2 = Vector3.FromArray(positions, indices[index + 1] * 3);\r\n const p3 = Vector3.FromArray(positions, indices[index + 2] * 3);\r\n\r\n const p1p2 = p1.subtract(p2);\r\n const p3p2 = p3.subtract(p2);\r\n\r\n const normal = Vector3.Normalize(Vector3.Cross(p1p2, p3p2));\r\n if (flipNormalGeneration) {\r\n normal.scaleInPlace(-1);\r\n }\r\n\r\n // Store same normals for every vertex\r\n for (let localIndex = 0; localIndex < 3; localIndex++) {\r\n normals[normalsCount++] = normal.x;\r\n normals[normalsCount++] = normal.y;\r\n normals[normalsCount++] = normal.z;\r\n }\r\n }\r\n\r\n return normals;\r\n }\r\n\r\n private _convertToUnIndexedMesh(flattenNormals: boolean = false): Mesh {\r\n const kinds = this.getVerticesDataKinds();\r\n const indices = this.getIndices()!;\r\n const data: { [kind: string]: FloatArray } = {};\r\n\r\n const separateVertices = (data: FloatArray, stride: number): Float32Array => {\r\n const newData = new Float32Array(indices.length * stride);\r\n let count = 0;\r\n for (let index = 0; index < indices.length; index++) {\r\n for (let offset = 0; offset < stride; offset++) {\r\n newData[count++] = data[indices[index] * stride + offset];\r\n }\r\n }\r\n return newData;\r\n };\r\n\r\n // Save previous submeshes\r\n const previousSubmeshes = this.geometry ? this.subMeshes.slice(0) : [];\r\n\r\n // Cache vertex data\r\n for (const kind of kinds) {\r\n data[kind] = this.getVerticesData(kind)!;\r\n }\r\n\r\n // Update vertex data\r\n for (const kind of kinds) {\r\n const vertexBuffer = this.getVertexBuffer(kind)!;\r\n const stride = vertexBuffer.getStrideSize();\r\n\r\n if (flattenNormals && kind === VertexBuffer.NormalKind) {\r\n const normals = this._getFlattenedNormals(indices, data[VertexBuffer.PositionKind]);\r\n this.setVerticesData(VertexBuffer.NormalKind, normals, vertexBuffer.isUpdatable(), stride);\r\n } else {\r\n this.setVerticesData(kind, separateVertices(data[kind], stride), vertexBuffer.isUpdatable(), stride);\r\n }\r\n }\r\n\r\n // Update morph targets\r\n if (this.morphTargetManager) {\r\n for (let targetIndex = 0; targetIndex < this.morphTargetManager.numTargets; targetIndex++) {\r\n const target = this.morphTargetManager.getTarget(targetIndex);\r\n\r\n const positions = target.getPositions()!;\r\n target.setPositions(separateVertices(positions, 3));\r\n\r\n const normals = target.getNormals();\r\n if (normals) {\r\n target.setNormals(flattenNormals ? this._getFlattenedNormals(indices, positions) : separateVertices(normals, 3));\r\n }\r\n\r\n const tangents = target.getTangents();\r\n if (tangents) {\r\n target.setTangents(separateVertices(tangents, 3));\r\n }\r\n\r\n const uvs = target.getUVs();\r\n if (uvs) {\r\n target.setUVs(separateVertices(uvs, 2));\r\n }\r\n }\r\n this.morphTargetManager.synchronize();\r\n }\r\n\r\n // Update indices\r\n for (let index = 0; index < indices.length; index++) {\r\n indices[index] = index;\r\n }\r\n this.setIndices(indices);\r\n\r\n this._unIndexed = true;\r\n\r\n // Update submeshes\r\n this.releaseSubMeshes();\r\n for (const previousOne of previousSubmeshes) {\r\n SubMesh.AddToMesh(previousOne.materialIndex, previousOne.indexStart, previousOne.indexCount, previousOne.indexStart, previousOne.indexCount, this);\r\n }\r\n\r\n this.synchronizeInstances();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Modify the mesh to get a flat shading rendering.\r\n * This means each mesh facet will then have its own normals. Usually new vertices are added in the mesh geometry to get this result.\r\n * Warning : the mesh is really modified even if not set originally as updatable and, under the hood, a new VertexBuffer is allocated.\r\n * @returns current mesh\r\n */\r\n public convertToFlatShadedMesh(): Mesh {\r\n return this._convertToUnIndexedMesh(true);\r\n }\r\n\r\n /**\r\n * This method removes all the mesh indices and add new vertices (duplication) in order to unfold facets into buffers.\r\n * In other words, more vertices, no more indices and a single bigger VBO.\r\n * The mesh is really modified even if not set originally as updatable. Under the hood, a new VertexBuffer is allocated.\r\n * @returns current mesh\r\n */\r\n public convertToUnIndexedMesh(): Mesh {\r\n return this._convertToUnIndexedMesh();\r\n }\r\n\r\n /**\r\n * Inverses facet orientations.\r\n * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.\r\n * @param flipNormals will also inverts the normals\r\n * @returns current mesh\r\n */\r\n public flipFaces(flipNormals: boolean = false): Mesh {\r\n const vertex_data = VertexData.ExtractFromMesh(this);\r\n let i: number;\r\n if (flipNormals && this.isVerticesDataPresent(VertexBuffer.NormalKind) && vertex_data.normals) {\r\n for (i = 0; i < vertex_data.normals.length; i++) {\r\n vertex_data.normals[i] *= -1;\r\n }\r\n }\r\n\r\n if (vertex_data.indices) {\r\n let temp;\r\n for (i = 0; i < vertex_data.indices.length; i += 3) {\r\n // reassign indices\r\n temp = vertex_data.indices[i + 1];\r\n vertex_data.indices[i + 1] = vertex_data.indices[i + 2];\r\n vertex_data.indices[i + 2] = temp;\r\n }\r\n }\r\n\r\n vertex_data.applyToMesh(this, this.isVertexBufferUpdatable(VertexBuffer.PositionKind));\r\n return this;\r\n }\r\n\r\n /**\r\n * Increase the number of facets and hence vertices in a mesh\r\n * Vertex normals are interpolated from existing vertex normals\r\n * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.\r\n * @param numberPerEdge the number of new vertices to add to each edge of a facet, optional default 1\r\n */\r\n public increaseVertices(numberPerEdge: number = 1): void {\r\n const vertex_data = VertexData.ExtractFromMesh(this);\r\n const currentIndices = vertex_data.indices && !Array.isArray(vertex_data.indices) && Array.from ? Array.from(vertex_data.indices) : vertex_data.indices;\r\n const positions = vertex_data.positions && !Array.isArray(vertex_data.positions) && Array.from ? Array.from(vertex_data.positions) : vertex_data.positions;\r\n const uvs = vertex_data.uvs && !Array.isArray(vertex_data.uvs) && Array.from ? Array.from(vertex_data.uvs) : vertex_data.uvs;\r\n const normals = vertex_data.normals && !Array.isArray(vertex_data.normals) && Array.from ? Array.from(vertex_data.normals) : vertex_data.normals;\r\n\r\n if (!currentIndices || !positions) {\r\n Logger.Warn(\"Couldn't increase number of vertices : VertexData must contain at least indices and positions\");\r\n } else {\r\n vertex_data.indices = currentIndices;\r\n vertex_data.positions = positions;\r\n if (uvs) {\r\n vertex_data.uvs = uvs;\r\n }\r\n if (normals) {\r\n vertex_data.normals = normals;\r\n }\r\n\r\n const segments: number = numberPerEdge + 1; //segments per current facet edge, become sides of new facets\r\n const tempIndices: Array> = new Array();\r\n for (let i = 0; i < segments + 1; i++) {\r\n tempIndices[i] = new Array();\r\n }\r\n let a: number; //vertex index of one end of a side\r\n let b: number; //vertex index of other end of the side\r\n const deltaPosition: Vector3 = new Vector3(0, 0, 0);\r\n const deltaNormal: Vector3 = new Vector3(0, 0, 0);\r\n const deltaUV: Vector2 = new Vector2(0, 0);\r\n const indices: number[] = new Array();\r\n const vertexIndex: number[] = new Array();\r\n const side: Array>> = new Array();\r\n let len: number;\r\n let positionPtr: number = positions.length;\r\n let uvPtr: number;\r\n if (uvs) {\r\n uvPtr = uvs.length;\r\n }\r\n let normalsPtr: number;\r\n if (normals) {\r\n normalsPtr = normals.length;\r\n }\r\n\r\n for (let i = 0; i < currentIndices.length; i += 3) {\r\n vertexIndex[0] = currentIndices[i];\r\n vertexIndex[1] = currentIndices[i + 1];\r\n vertexIndex[2] = currentIndices[i + 2];\r\n for (let j = 0; j < 3; j++) {\r\n a = vertexIndex[j];\r\n b = vertexIndex[(j + 1) % 3];\r\n if (side[a] === undefined && side[b] === undefined) {\r\n side[a] = new Array();\r\n side[b] = new Array();\r\n } else {\r\n if (side[a] === undefined) {\r\n side[a] = new Array();\r\n }\r\n if (side[b] === undefined) {\r\n side[b] = new Array();\r\n }\r\n }\r\n if (side[a][b] === undefined && side[b][a] === undefined) {\r\n side[a][b] = [];\r\n deltaPosition.x = (positions[3 * b] - positions[3 * a]) / segments;\r\n deltaPosition.y = (positions[3 * b + 1] - positions[3 * a + 1]) / segments;\r\n deltaPosition.z = (positions[3 * b + 2] - positions[3 * a + 2]) / segments;\r\n if (normals) {\r\n deltaNormal.x = (normals[3 * b] - normals[3 * a]) / segments;\r\n deltaNormal.y = (normals[3 * b + 1] - normals[3 * a + 1]) / segments;\r\n deltaNormal.z = (normals[3 * b + 2] - normals[3 * a + 2]) / segments;\r\n }\r\n if (uvs) {\r\n deltaUV.x = (uvs[2 * b] - uvs[2 * a]) / segments;\r\n deltaUV.y = (uvs[2 * b + 1] - uvs[2 * a + 1]) / segments;\r\n }\r\n side[a][b].push(a);\r\n for (let k = 1; k < segments; k++) {\r\n side[a][b].push(positions.length / 3);\r\n positions[positionPtr++] = positions[3 * a] + k * deltaPosition.x;\r\n positions[positionPtr++] = positions[3 * a + 1] + k * deltaPosition.y;\r\n positions[positionPtr++] = positions[3 * a + 2] + k * deltaPosition.z;\r\n if (normals) {\r\n normals[normalsPtr!++] = normals[3 * a] + k * deltaNormal.x;\r\n normals[normalsPtr!++] = normals[3 * a + 1] + k * deltaNormal.y;\r\n normals[normalsPtr!++] = normals[3 * a + 2] + k * deltaNormal.z;\r\n }\r\n if (uvs) {\r\n uvs[uvPtr!++] = uvs[2 * a] + k * deltaUV.x;\r\n uvs[uvPtr!++] = uvs[2 * a + 1] + k * deltaUV.y;\r\n }\r\n }\r\n side[a][b].push(b);\r\n side[b][a] = new Array();\r\n len = side[a][b].length;\r\n for (let idx = 0; idx < len; idx++) {\r\n side[b][a][idx] = side[a][b][len - 1 - idx];\r\n }\r\n }\r\n }\r\n //Calculate positions, normals and uvs of new internal vertices\r\n tempIndices[0][0] = currentIndices[i];\r\n tempIndices[1][0] = side[currentIndices[i]][currentIndices[i + 1]][1];\r\n tempIndices[1][1] = side[currentIndices[i]][currentIndices[i + 2]][1];\r\n for (let k = 2; k < segments; k++) {\r\n tempIndices[k][0] = side[currentIndices[i]][currentIndices[i + 1]][k];\r\n tempIndices[k][k] = side[currentIndices[i]][currentIndices[i + 2]][k];\r\n deltaPosition.x = (positions[3 * tempIndices[k][k]] - positions[3 * tempIndices[k][0]]) / k;\r\n deltaPosition.y = (positions[3 * tempIndices[k][k] + 1] - positions[3 * tempIndices[k][0] + 1]) / k;\r\n deltaPosition.z = (positions[3 * tempIndices[k][k] + 2] - positions[3 * tempIndices[k][0] + 2]) / k;\r\n if (normals) {\r\n deltaNormal.x = (normals[3 * tempIndices[k][k]] - normals[3 * tempIndices[k][0]]) / k;\r\n deltaNormal.y = (normals[3 * tempIndices[k][k] + 1] - normals[3 * tempIndices[k][0] + 1]) / k;\r\n deltaNormal.z = (normals[3 * tempIndices[k][k] + 2] - normals[3 * tempIndices[k][0] + 2]) / k;\r\n }\r\n if (uvs) {\r\n deltaUV.x = (uvs[2 * tempIndices[k][k]] - uvs[2 * tempIndices[k][0]]) / k;\r\n deltaUV.y = (uvs[2 * tempIndices[k][k] + 1] - uvs[2 * tempIndices[k][0] + 1]) / k;\r\n }\r\n for (let j = 1; j < k; j++) {\r\n tempIndices[k][j] = positions.length / 3;\r\n positions[positionPtr++] = positions[3 * tempIndices[k][0]] + j * deltaPosition.x;\r\n positions[positionPtr++] = positions[3 * tempIndices[k][0] + 1] + j * deltaPosition.y;\r\n positions[positionPtr++] = positions[3 * tempIndices[k][0] + 2] + j * deltaPosition.z;\r\n if (normals) {\r\n normals[normalsPtr!++] = normals[3 * tempIndices[k][0]] + j * deltaNormal.x;\r\n normals[normalsPtr!++] = normals[3 * tempIndices[k][0] + 1] + j * deltaNormal.y;\r\n normals[normalsPtr!++] = normals[3 * tempIndices[k][0] + 2] + j * deltaNormal.z;\r\n }\r\n if (uvs) {\r\n uvs[uvPtr!++] = uvs[2 * tempIndices[k][0]] + j * deltaUV.x;\r\n uvs[uvPtr!++] = uvs[2 * tempIndices[k][0] + 1] + j * deltaUV.y;\r\n }\r\n }\r\n }\r\n tempIndices[segments] = side[currentIndices[i + 1]][currentIndices[i + 2]];\r\n\r\n // reform indices\r\n indices.push(tempIndices[0][0], tempIndices[1][0], tempIndices[1][1]);\r\n for (let k = 1; k < segments; k++) {\r\n let j: number;\r\n for (j = 0; j < k; j++) {\r\n indices.push(tempIndices[k][j], tempIndices[k + 1][j], tempIndices[k + 1][j + 1]);\r\n indices.push(tempIndices[k][j], tempIndices[k + 1][j + 1], tempIndices[k][j + 1]);\r\n }\r\n indices.push(tempIndices[k][j], tempIndices[k + 1][j], tempIndices[k + 1][j + 1]);\r\n }\r\n }\r\n\r\n vertex_data.indices = indices;\r\n vertex_data.applyToMesh(this, this.isVertexBufferUpdatable(VertexBuffer.PositionKind));\r\n }\r\n }\r\n\r\n /**\r\n * Force adjacent facets to share vertices and remove any facets that have all vertices in a line\r\n * This will undo any application of covertToFlatShadedMesh\r\n * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.\r\n */\r\n public forceSharedVertices(): void {\r\n const vertex_data = VertexData.ExtractFromMesh(this);\r\n const currentUVs = vertex_data.uvs;\r\n const currentIndices = vertex_data.indices;\r\n const currentPositions = vertex_data.positions;\r\n const currentColors = vertex_data.colors;\r\n const currentMatrixIndices = vertex_data.matricesIndices;\r\n const currentMatrixWeights = vertex_data.matricesWeights;\r\n const currentMatrixIndicesExtra = vertex_data.matricesIndicesExtra;\r\n const currentMatrixWeightsExtra = vertex_data.matricesWeightsExtra;\r\n\r\n if (currentIndices === void 0 || currentPositions === void 0 || currentIndices === null || currentPositions === null) {\r\n Logger.Warn(\"VertexData contains empty entries\");\r\n } else {\r\n const positions: Array = new Array();\r\n const indices: Array = new Array();\r\n const uvs: Array = new Array();\r\n const colors: Array = new Array();\r\n const matrixIndices: Array = new Array();\r\n const matrixWeights: Array = new Array();\r\n const matrixIndicesExtra: Array = new Array();\r\n const matrixWeightsExtra: Array = new Array();\r\n let pstring: Array = new Array(); //lists facet vertex positions (a,b,c) as string \"a|b|c\"\r\n\r\n let indexPtr: number = 0; // pointer to next available index value\r\n const uniquePositions: { [key: string]: number } = {}; // unique vertex positions\r\n let ptr: number; // pointer to element in uniquePositions\r\n let facet: Array;\r\n\r\n for (let i = 0; i < currentIndices.length; i += 3) {\r\n facet = [currentIndices[i], currentIndices[i + 1], currentIndices[i + 2]]; //facet vertex indices\r\n pstring = [];\r\n for (let j = 0; j < 3; j++) {\r\n pstring[j] = \"\";\r\n for (let k = 0; k < 3; k++) {\r\n //small values make 0\r\n if (Math.abs(currentPositions[3 * facet[j] + k]) < 0.00000001) {\r\n currentPositions[3 * facet[j] + k] = 0;\r\n }\r\n pstring[j] += currentPositions[3 * facet[j] + k] + \"|\";\r\n }\r\n }\r\n //check facet vertices to see that none are repeated\r\n // do not process any facet that has a repeated vertex, ie is a line\r\n if (!(pstring[0] == pstring[1] || pstring[0] == pstring[2] || pstring[1] == pstring[2])) {\r\n //for each facet position check if already listed in uniquePositions\r\n // if not listed add to uniquePositions and set index pointer\r\n // if listed use its index in uniquePositions and new index pointer\r\n for (let j = 0; j < 3; j++) {\r\n ptr = uniquePositions[pstring[j]];\r\n if (ptr === undefined) {\r\n uniquePositions[pstring[j]] = indexPtr;\r\n ptr = indexPtr++;\r\n //not listed so add individual x, y, z coordinates to positions\r\n for (let k = 0; k < 3; k++) {\r\n positions.push(currentPositions[3 * facet[j] + k]);\r\n }\r\n if (currentColors !== null && currentColors !== void 0) {\r\n for (let k = 0; k < 4; k++) {\r\n colors.push(currentColors[4 * facet[j] + k]);\r\n }\r\n }\r\n if (currentUVs !== null && currentUVs !== void 0) {\r\n for (let k = 0; k < 2; k++) {\r\n uvs.push(currentUVs[2 * facet[j] + k]);\r\n }\r\n }\r\n if (currentMatrixIndices !== null && currentMatrixIndices !== void 0) {\r\n for (let k = 0; k < 4; k++) {\r\n matrixIndices.push(currentMatrixIndices[4 * facet[j] + k]);\r\n }\r\n }\r\n if (currentMatrixWeights !== null && currentMatrixWeights !== void 0) {\r\n for (let k = 0; k < 4; k++) {\r\n matrixWeights.push(currentMatrixWeights[4 * facet[j] + k]);\r\n }\r\n }\r\n if (currentMatrixIndicesExtra !== null && currentMatrixIndicesExtra !== void 0) {\r\n for (let k = 0; k < 4; k++) {\r\n matrixIndicesExtra.push(currentMatrixIndicesExtra[4 * facet[j] + k]);\r\n }\r\n }\r\n if (currentMatrixWeightsExtra !== null && currentMatrixWeightsExtra !== void 0) {\r\n for (let k = 0; k < 4; k++) {\r\n matrixWeightsExtra.push(currentMatrixWeightsExtra[4 * facet[j] + k]);\r\n }\r\n }\r\n }\r\n // add new index pointer to indices array\r\n indices.push(ptr);\r\n }\r\n }\r\n }\r\n\r\n const normals: Array = new Array();\r\n VertexData.ComputeNormals(positions, indices, normals);\r\n\r\n //create new vertex data object and update\r\n vertex_data.positions = positions;\r\n vertex_data.indices = indices;\r\n vertex_data.normals = normals;\r\n if (currentUVs !== null && currentUVs !== void 0) {\r\n vertex_data.uvs = uvs;\r\n }\r\n if (currentColors !== null && currentColors !== void 0) {\r\n vertex_data.colors = colors;\r\n }\r\n if (currentMatrixIndices !== null && currentMatrixIndices !== void 0) {\r\n vertex_data.matricesIndices = matrixIndices;\r\n }\r\n if (currentMatrixWeights !== null && currentMatrixWeights !== void 0) {\r\n vertex_data.matricesWeights = matrixWeights;\r\n }\r\n if (currentMatrixIndicesExtra !== null && currentMatrixIndicesExtra !== void 0) {\r\n vertex_data.matricesIndicesExtra = matrixIndicesExtra;\r\n }\r\n if (currentMatrixWeights !== null && currentMatrixWeights !== void 0) {\r\n vertex_data.matricesWeightsExtra = matrixWeightsExtra;\r\n }\r\n\r\n vertex_data.applyToMesh(this, this.isVertexBufferUpdatable(VertexBuffer.PositionKind));\r\n }\r\n }\r\n\r\n // Instances\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/naming-convention\r\n public static _instancedMeshFactory(name: string, mesh: Mesh): InstancedMesh {\r\n throw _WarnImport(\"InstancedMesh\");\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _PhysicsImpostorParser(scene: Scene, physicObject: IPhysicsEnabledObject, jsonObject: any): PhysicsImpostor {\r\n throw _WarnImport(\"PhysicsImpostor\");\r\n }\r\n\r\n /**\r\n * Creates a new InstancedMesh object from the mesh model.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances\r\n * @param name defines the name of the new instance\r\n * @returns a new InstancedMesh\r\n */\r\n public createInstance(name: string): InstancedMesh {\r\n return Mesh._instancedMeshFactory(name, this);\r\n }\r\n\r\n /**\r\n * Synchronises all the mesh instance submeshes to the current mesh submeshes, if any.\r\n * After this call, all the mesh instances have the same submeshes than the current mesh.\r\n * @returns the current mesh\r\n */\r\n public synchronizeInstances(): Mesh {\r\n for (let instanceIndex = 0; instanceIndex < this.instances.length; instanceIndex++) {\r\n const instance = this.instances[instanceIndex];\r\n instance._syncSubMeshes();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Optimization of the mesh's indices, in case a mesh has duplicated vertices.\r\n * The function will only reorder the indices and will not remove unused vertices to avoid problems with submeshes.\r\n * This should be used together with the simplification to avoid disappearing triangles.\r\n * @param successCallback an optional success callback to be called after the optimization finished.\r\n * @returns the current mesh\r\n */\r\n public optimizeIndices(successCallback?: (mesh?: Mesh) => void): Mesh {\r\n const indices = this.getIndices();\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (!positions || !indices) {\r\n return this;\r\n }\r\n\r\n const vectorPositions: Vector3[] = [];\r\n for (let pos = 0; pos < positions.length; pos = pos + 3) {\r\n vectorPositions.push(Vector3.FromArray(positions, pos));\r\n }\r\n const dupes: number[] = [];\r\n\r\n AsyncLoop.SyncAsyncForLoop(\r\n vectorPositions.length,\r\n 40,\r\n (iteration) => {\r\n const realPos = vectorPositions.length - 1 - iteration;\r\n const testedPosition = vectorPositions[realPos];\r\n for (let j = 0; j < realPos; ++j) {\r\n const againstPosition = vectorPositions[j];\r\n if (testedPosition.equals(againstPosition)) {\r\n dupes[realPos] = j;\r\n break;\r\n }\r\n }\r\n },\r\n () => {\r\n for (let i = 0; i < indices.length; ++i) {\r\n indices[i] = dupes[indices[i]] || indices[i];\r\n }\r\n\r\n //indices are now reordered\r\n const originalSubMeshes = this.subMeshes.slice(0);\r\n this.setIndices(indices);\r\n this.subMeshes = originalSubMeshes;\r\n if (successCallback) {\r\n successCallback(this);\r\n }\r\n }\r\n );\r\n return this;\r\n }\r\n\r\n /**\r\n * Serialize current mesh\r\n * @param serializationObject defines the object which will receive the serialization data\r\n * @returns the serialized object\r\n */\r\n public serialize(serializationObject: any = {}): any {\r\n serializationObject.name = this.name;\r\n serializationObject.id = this.id;\r\n serializationObject.uniqueId = this.uniqueId;\r\n serializationObject.type = this.getClassName();\r\n\r\n if (Tags && Tags.HasTags(this)) {\r\n serializationObject.tags = Tags.GetTags(this);\r\n }\r\n\r\n serializationObject.position = this.position.asArray();\r\n\r\n if (this.rotationQuaternion) {\r\n serializationObject.rotationQuaternion = this.rotationQuaternion.asArray();\r\n } else if (this.rotation) {\r\n serializationObject.rotation = this.rotation.asArray();\r\n }\r\n\r\n serializationObject.scaling = this.scaling.asArray();\r\n if (this._postMultiplyPivotMatrix) {\r\n serializationObject.pivotMatrix = this.getPivotMatrix().asArray();\r\n } else {\r\n serializationObject.localMatrix = this.getPivotMatrix().asArray();\r\n }\r\n\r\n serializationObject.isEnabled = this.isEnabled(false);\r\n serializationObject.isVisible = this.isVisible;\r\n serializationObject.infiniteDistance = this.infiniteDistance;\r\n serializationObject.pickable = this.isPickable;\r\n\r\n serializationObject.receiveShadows = this.receiveShadows;\r\n\r\n serializationObject.billboardMode = this.billboardMode;\r\n serializationObject.visibility = this.visibility;\r\n serializationObject.alwaysSelectAsActiveMesh = this.alwaysSelectAsActiveMesh;\r\n\r\n serializationObject.checkCollisions = this.checkCollisions;\r\n serializationObject.ellipsoid = this.ellipsoid.asArray();\r\n serializationObject.ellipsoidOffset = this.ellipsoidOffset.asArray();\r\n serializationObject.doNotSyncBoundingInfo = this.doNotSyncBoundingInfo;\r\n serializationObject.isBlocker = this.isBlocker;\r\n serializationObject.overrideMaterialSideOrientation = this.overrideMaterialSideOrientation;\r\n\r\n // Parent\r\n if (this.parent) {\r\n this.parent._serializeAsParent(serializationObject);\r\n }\r\n\r\n // Geometry\r\n serializationObject.isUnIndexed = this.isUnIndexed;\r\n const geometry = this._geometry;\r\n if (geometry && this.subMeshes) {\r\n serializationObject.geometryUniqueId = geometry.uniqueId;\r\n serializationObject.geometryId = geometry.id;\r\n\r\n // SubMeshes\r\n serializationObject.subMeshes = [];\r\n for (let subIndex = 0; subIndex < this.subMeshes.length; subIndex++) {\r\n const subMesh = this.subMeshes[subIndex];\r\n\r\n serializationObject.subMeshes.push({\r\n materialIndex: subMesh.materialIndex,\r\n verticesStart: subMesh.verticesStart,\r\n verticesCount: subMesh.verticesCount,\r\n indexStart: subMesh.indexStart,\r\n indexCount: subMesh.indexCount,\r\n });\r\n }\r\n }\r\n\r\n // Material\r\n if (this.material) {\r\n if (!this.material.doNotSerialize) {\r\n serializationObject.materialUniqueId = this.material.uniqueId;\r\n serializationObject.materialId = this.material.id; // back compat\r\n }\r\n } else {\r\n this.material = null;\r\n serializationObject.materialUniqueId = this._scene.defaultMaterial.uniqueId;\r\n serializationObject.materialId = this._scene.defaultMaterial.id; // back compat\r\n }\r\n\r\n // Morph targets\r\n if (this.morphTargetManager) {\r\n serializationObject.morphTargetManagerId = this.morphTargetManager.uniqueId;\r\n }\r\n\r\n // Skeleton\r\n if (this.skeleton) {\r\n serializationObject.skeletonId = this.skeleton.id;\r\n serializationObject.numBoneInfluencers = this.numBoneInfluencers;\r\n }\r\n\r\n // Physics\r\n //TODO implement correct serialization for physics impostors.\r\n if (this.getScene()._getComponent(SceneComponentConstants.NAME_PHYSICSENGINE)) {\r\n const impostor = this.getPhysicsImpostor();\r\n if (impostor) {\r\n serializationObject.physicsMass = impostor.getParam(\"mass\");\r\n serializationObject.physicsFriction = impostor.getParam(\"friction\");\r\n serializationObject.physicsRestitution = impostor.getParam(\"mass\");\r\n serializationObject.physicsImpostor = impostor.type;\r\n }\r\n }\r\n\r\n // Metadata\r\n if (this.metadata) {\r\n serializationObject.metadata = this.metadata;\r\n }\r\n\r\n // Instances\r\n serializationObject.instances = [];\r\n for (let index = 0; index < this.instances.length; index++) {\r\n const instance = this.instances[index];\r\n if (instance.doNotSerialize) {\r\n continue;\r\n }\r\n\r\n const serializationInstance: any = {\r\n name: instance.name,\r\n id: instance.id,\r\n isEnabled: instance.isEnabled(false),\r\n isVisible: instance.isVisible,\r\n isPickable: instance.isPickable,\r\n checkCollisions: instance.checkCollisions,\r\n position: instance.position.asArray(),\r\n scaling: instance.scaling.asArray(),\r\n };\r\n\r\n if (instance.parent) {\r\n instance.parent._serializeAsParent(serializationInstance);\r\n }\r\n\r\n if (instance.rotationQuaternion) {\r\n serializationInstance.rotationQuaternion = instance.rotationQuaternion.asArray();\r\n } else if (instance.rotation) {\r\n serializationInstance.rotation = instance.rotation.asArray();\r\n }\r\n\r\n // Physics\r\n //TODO implement correct serialization for physics impostors.\r\n if (this.getScene()._getComponent(SceneComponentConstants.NAME_PHYSICSENGINE)) {\r\n const impostor = instance.getPhysicsImpostor();\r\n if (impostor) {\r\n serializationInstance.physicsMass = impostor.getParam(\"mass\");\r\n serializationInstance.physicsFriction = impostor.getParam(\"friction\");\r\n serializationInstance.physicsRestitution = impostor.getParam(\"mass\");\r\n serializationInstance.physicsImpostor = impostor.type;\r\n }\r\n }\r\n\r\n // Metadata\r\n if (instance.metadata) {\r\n serializationInstance.metadata = instance.metadata;\r\n }\r\n\r\n // Action Manager\r\n if (instance.actionManager) {\r\n serializationInstance.actions = instance.actionManager.serialize(instance.name);\r\n }\r\n\r\n serializationObject.instances.push(serializationInstance);\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(instance, serializationInstance);\r\n serializationInstance.ranges = instance.serializeAnimationRanges();\r\n }\r\n\r\n // Thin instances\r\n if (this._thinInstanceDataStorage.instancesCount && this._thinInstanceDataStorage.matrixData) {\r\n serializationObject.thinInstances = {\r\n instancesCount: this._thinInstanceDataStorage.instancesCount,\r\n matrixData: Array.from(this._thinInstanceDataStorage.matrixData),\r\n matrixBufferSize: this._thinInstanceDataStorage.matrixBufferSize,\r\n enablePicking: this.thinInstanceEnablePicking,\r\n };\r\n\r\n if (this._userThinInstanceBuffersStorage) {\r\n const userThinInstance: any = {\r\n data: {},\r\n sizes: {},\r\n strides: {},\r\n };\r\n\r\n for (const kind in this._userThinInstanceBuffersStorage.data) {\r\n userThinInstance.data[kind] = Array.from(this._userThinInstanceBuffersStorage.data[kind]);\r\n userThinInstance.sizes[kind] = this._userThinInstanceBuffersStorage.sizes[kind];\r\n userThinInstance.strides[kind] = this._userThinInstanceBuffersStorage.strides[kind];\r\n }\r\n\r\n serializationObject.thinInstances.userThinInstance = userThinInstance;\r\n }\r\n }\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n serializationObject.ranges = this.serializeAnimationRanges();\r\n\r\n // Layer mask\r\n serializationObject.layerMask = this.layerMask;\r\n\r\n // Alpha\r\n serializationObject.alphaIndex = this.alphaIndex;\r\n serializationObject.hasVertexAlpha = this.hasVertexAlpha;\r\n\r\n // Overlay\r\n serializationObject.overlayAlpha = this.overlayAlpha;\r\n serializationObject.overlayColor = this.overlayColor.asArray();\r\n serializationObject.renderOverlay = this.renderOverlay;\r\n\r\n // Fog\r\n serializationObject.applyFog = this.applyFog;\r\n\r\n // Action Manager\r\n if (this.actionManager) {\r\n serializationObject.actions = this.actionManager.serialize(this.name);\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /** @internal */\r\n public _syncGeometryWithMorphTargetManager() {\r\n if (!this.geometry) {\r\n return;\r\n }\r\n\r\n this._markSubMeshesAsAttributesDirty();\r\n\r\n const morphTargetManager = this._internalAbstractMeshDataInfo._morphTargetManager;\r\n if (morphTargetManager && morphTargetManager.vertexCount) {\r\n if (morphTargetManager.vertexCount !== this.getTotalVertices()) {\r\n Logger.Error(\"Mesh is incompatible with morph targets. Targets and mesh must all have the same vertices count.\");\r\n this.morphTargetManager = null;\r\n return;\r\n }\r\n\r\n if (morphTargetManager.isUsingTextureForTargets) {\r\n return;\r\n }\r\n\r\n for (let index = 0; index < morphTargetManager.numInfluencers; index++) {\r\n const morphTarget = morphTargetManager.getActiveTarget(index);\r\n\r\n const positions = morphTarget.getPositions();\r\n if (!positions) {\r\n Logger.Error(\"Invalid morph target. Target must have positions.\");\r\n return;\r\n }\r\n\r\n this.geometry.setVerticesData(VertexBuffer.PositionKind + index, positions, false, 3);\r\n\r\n const normals = morphTarget.getNormals();\r\n if (normals) {\r\n this.geometry.setVerticesData(VertexBuffer.NormalKind + index, normals, false, 3);\r\n }\r\n\r\n const tangents = morphTarget.getTangents();\r\n if (tangents) {\r\n this.geometry.setVerticesData(VertexBuffer.TangentKind + index, tangents, false, 3);\r\n }\r\n\r\n const uvs = morphTarget.getUVs();\r\n if (uvs) {\r\n this.geometry.setVerticesData(VertexBuffer.UVKind + \"_\" + index, uvs, false, 2);\r\n }\r\n }\r\n } else {\r\n let index = 0;\r\n\r\n // Positions\r\n while (this.geometry.isVerticesDataPresent(VertexBuffer.PositionKind + index)) {\r\n this.geometry.removeVerticesData(VertexBuffer.PositionKind + index);\r\n\r\n if (this.geometry.isVerticesDataPresent(VertexBuffer.NormalKind + index)) {\r\n this.geometry.removeVerticesData(VertexBuffer.NormalKind + index);\r\n }\r\n if (this.geometry.isVerticesDataPresent(VertexBuffer.TangentKind + index)) {\r\n this.geometry.removeVerticesData(VertexBuffer.TangentKind + index);\r\n }\r\n if (this.geometry.isVerticesDataPresent(VertexBuffer.UVKind + index)) {\r\n this.geometry.removeVerticesData(VertexBuffer.UVKind + \"_\" + index);\r\n }\r\n index++;\r\n }\r\n }\r\n }\r\n\r\n // Statics\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _GroundMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n throw _WarnImport(\"GroundMesh\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _GoldbergMeshParser = (parsedMesh: any, scene: Scene): GoldbergMesh => {\r\n throw _WarnImport(\"GoldbergMesh\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _LinesMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n throw _WarnImport(\"LinesMesh\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _GreasedLineMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n throw _WarnImport(\"GreasedLineMesh\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _GreasedLineRibbonMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n throw _WarnImport(\"GreasedLineRibbonMesh\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static _TrailMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n throw _WarnImport(\"TrailMesh\");\r\n };\r\n\r\n /**\r\n * Returns a new Mesh object parsed from the source provided.\r\n * @param parsedMesh is the source\r\n * @param scene defines the hosting scene\r\n * @param rootUrl is the root URL to prefix the `delayLoadingFile` property with\r\n * @returns a new Mesh\r\n */\r\n public static Parse(parsedMesh: any, scene: Scene, rootUrl: string): Mesh {\r\n let mesh: Mesh;\r\n\r\n if (parsedMesh.type && parsedMesh.type === \"LinesMesh\") {\r\n mesh = Mesh._LinesMeshParser(parsedMesh, scene);\r\n } else if (parsedMesh.type && parsedMesh.type === \"GroundMesh\") {\r\n mesh = Mesh._GroundMeshParser(parsedMesh, scene);\r\n } else if (parsedMesh.type && parsedMesh.type === \"GoldbergMesh\") {\r\n mesh = Mesh._GoldbergMeshParser(parsedMesh, scene);\r\n } else if (parsedMesh.type && parsedMesh.type === \"GreasedLineMesh\") {\r\n mesh = Mesh._GreasedLineMeshParser(parsedMesh, scene);\r\n } else if (parsedMesh.type && parsedMesh.type === \"TrailMesh\") {\r\n mesh = Mesh._TrailMeshParser(parsedMesh, scene);\r\n } else {\r\n mesh = new Mesh(parsedMesh.name, scene);\r\n }\r\n mesh.id = parsedMesh.id;\r\n mesh._waitingParsedUniqueId = parsedMesh.uniqueId;\r\n\r\n if (Tags) {\r\n Tags.AddTagsTo(mesh, parsedMesh.tags);\r\n }\r\n\r\n mesh.position = Vector3.FromArray(parsedMesh.position);\r\n\r\n if (parsedMesh.metadata !== undefined) {\r\n mesh.metadata = parsedMesh.metadata;\r\n }\r\n\r\n if (parsedMesh.rotationQuaternion) {\r\n mesh.rotationQuaternion = Quaternion.FromArray(parsedMesh.rotationQuaternion);\r\n } else if (parsedMesh.rotation) {\r\n mesh.rotation = Vector3.FromArray(parsedMesh.rotation);\r\n }\r\n\r\n mesh.scaling = Vector3.FromArray(parsedMesh.scaling);\r\n\r\n if (parsedMesh.localMatrix) {\r\n mesh.setPreTransformMatrix(Matrix.FromArray(parsedMesh.localMatrix));\r\n } else if (parsedMesh.pivotMatrix) {\r\n mesh.setPivotMatrix(Matrix.FromArray(parsedMesh.pivotMatrix));\r\n }\r\n\r\n mesh.setEnabled(parsedMesh.isEnabled);\r\n mesh.isVisible = parsedMesh.isVisible;\r\n mesh.infiniteDistance = parsedMesh.infiniteDistance;\r\n mesh.alwaysSelectAsActiveMesh = !!parsedMesh.alwaysSelectAsActiveMesh;\r\n\r\n mesh.showBoundingBox = parsedMesh.showBoundingBox;\r\n mesh.showSubMeshesBoundingBox = parsedMesh.showSubMeshesBoundingBox;\r\n\r\n if (parsedMesh.applyFog !== undefined) {\r\n mesh.applyFog = parsedMesh.applyFog;\r\n }\r\n\r\n if (parsedMesh.pickable !== undefined) {\r\n mesh.isPickable = parsedMesh.pickable;\r\n }\r\n\r\n if (parsedMesh.alphaIndex !== undefined) {\r\n mesh.alphaIndex = parsedMesh.alphaIndex;\r\n }\r\n\r\n mesh.receiveShadows = parsedMesh.receiveShadows;\r\n\r\n if (parsedMesh.billboardMode !== undefined) {\r\n mesh.billboardMode = parsedMesh.billboardMode;\r\n }\r\n\r\n if (parsedMesh.visibility !== undefined) {\r\n mesh.visibility = parsedMesh.visibility;\r\n }\r\n\r\n mesh.checkCollisions = parsedMesh.checkCollisions;\r\n mesh.doNotSyncBoundingInfo = !!parsedMesh.doNotSyncBoundingInfo;\r\n\r\n if (parsedMesh.ellipsoid) {\r\n mesh.ellipsoid = Vector3.FromArray(parsedMesh.ellipsoid);\r\n }\r\n\r\n if (parsedMesh.ellipsoidOffset) {\r\n mesh.ellipsoidOffset = Vector3.FromArray(parsedMesh.ellipsoidOffset);\r\n }\r\n\r\n if (parsedMesh.overrideMaterialSideOrientation !== undefined) {\r\n mesh.overrideMaterialSideOrientation = parsedMesh.overrideMaterialSideOrientation;\r\n }\r\n\r\n if (parsedMesh.isBlocker !== undefined) {\r\n mesh.isBlocker = parsedMesh.isBlocker;\r\n }\r\n\r\n mesh._shouldGenerateFlatShading = parsedMesh.useFlatShading;\r\n\r\n // freezeWorldMatrix\r\n if (parsedMesh.freezeWorldMatrix) {\r\n mesh._waitingData.freezeWorldMatrix = parsedMesh.freezeWorldMatrix;\r\n }\r\n\r\n // Parent\r\n if (parsedMesh.parentId !== undefined) {\r\n mesh._waitingParentId = parsedMesh.parentId;\r\n }\r\n\r\n if (parsedMesh.parentInstanceIndex !== undefined) {\r\n mesh._waitingParentInstanceIndex = parsedMesh.parentInstanceIndex;\r\n }\r\n\r\n // Actions\r\n if (parsedMesh.actions !== undefined) {\r\n mesh._waitingData.actions = parsedMesh.actions;\r\n }\r\n\r\n // Overlay\r\n if (parsedMesh.overlayAlpha !== undefined) {\r\n mesh.overlayAlpha = parsedMesh.overlayAlpha;\r\n }\r\n\r\n if (parsedMesh.overlayColor !== undefined) {\r\n mesh.overlayColor = Color3.FromArray(parsedMesh.overlayColor);\r\n }\r\n\r\n if (parsedMesh.renderOverlay !== undefined) {\r\n mesh.renderOverlay = parsedMesh.renderOverlay;\r\n }\r\n\r\n // Geometry\r\n mesh.isUnIndexed = !!parsedMesh.isUnIndexed;\r\n mesh.hasVertexAlpha = parsedMesh.hasVertexAlpha;\r\n\r\n if (parsedMesh.delayLoadingFile) {\r\n mesh.delayLoadState = Constants.DELAYLOADSTATE_NOTLOADED;\r\n mesh.delayLoadingFile = rootUrl + parsedMesh.delayLoadingFile;\r\n mesh.buildBoundingInfo(Vector3.FromArray(parsedMesh.boundingBoxMinimum), Vector3.FromArray(parsedMesh.boundingBoxMaximum));\r\n\r\n if (parsedMesh._binaryInfo) {\r\n mesh._binaryInfo = parsedMesh._binaryInfo;\r\n }\r\n\r\n mesh._delayInfo = [];\r\n if (parsedMesh.hasUVs) {\r\n mesh._delayInfo.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (parsedMesh.hasUVs2) {\r\n mesh._delayInfo.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (parsedMesh.hasUVs3) {\r\n mesh._delayInfo.push(VertexBuffer.UV3Kind);\r\n }\r\n\r\n if (parsedMesh.hasUVs4) {\r\n mesh._delayInfo.push(VertexBuffer.UV4Kind);\r\n }\r\n\r\n if (parsedMesh.hasUVs5) {\r\n mesh._delayInfo.push(VertexBuffer.UV5Kind);\r\n }\r\n\r\n if (parsedMesh.hasUVs6) {\r\n mesh._delayInfo.push(VertexBuffer.UV6Kind);\r\n }\r\n\r\n if (parsedMesh.hasColors) {\r\n mesh._delayInfo.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (parsedMesh.hasMatricesIndices) {\r\n mesh._delayInfo.push(VertexBuffer.MatricesIndicesKind);\r\n }\r\n\r\n if (parsedMesh.hasMatricesWeights) {\r\n mesh._delayInfo.push(VertexBuffer.MatricesWeightsKind);\r\n }\r\n\r\n mesh._delayLoadingFunction = Geometry._ImportGeometry;\r\n\r\n if (SceneLoaderFlags.ForceFullSceneLoadingForIncremental) {\r\n mesh._checkDelayState();\r\n }\r\n } else {\r\n Geometry._ImportGeometry(parsedMesh, mesh);\r\n }\r\n\r\n // Material\r\n if (parsedMesh.materialUniqueId) {\r\n mesh._waitingMaterialId = parsedMesh.materialUniqueId;\r\n } else if (parsedMesh.materialId) {\r\n mesh._waitingMaterialId = parsedMesh.materialId;\r\n }\r\n\r\n // Morph targets\r\n if (parsedMesh.morphTargetManagerId > -1) {\r\n mesh.morphTargetManager = scene.getMorphTargetManagerById(parsedMesh.morphTargetManagerId);\r\n }\r\n\r\n // Skeleton\r\n if (parsedMesh.skeletonId !== undefined && parsedMesh.skeletonId !== null) {\r\n mesh.skeleton = scene.getLastSkeletonById(parsedMesh.skeletonId);\r\n if (parsedMesh.numBoneInfluencers) {\r\n mesh.numBoneInfluencers = parsedMesh.numBoneInfluencers;\r\n }\r\n }\r\n\r\n // Animations\r\n if (parsedMesh.animations) {\r\n for (let animationIndex = 0; animationIndex < parsedMesh.animations.length; animationIndex++) {\r\n const parsedAnimation = parsedMesh.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n mesh.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n Node.ParseAnimationRanges(mesh, parsedMesh, scene);\r\n }\r\n\r\n if (parsedMesh.autoAnimate) {\r\n scene.beginAnimation(mesh, parsedMesh.autoAnimateFrom, parsedMesh.autoAnimateTo, parsedMesh.autoAnimateLoop, parsedMesh.autoAnimateSpeed || 1.0);\r\n }\r\n\r\n // Layer Mask\r\n if (parsedMesh.layerMask && !isNaN(parsedMesh.layerMask)) {\r\n mesh.layerMask = Math.abs(parseInt(parsedMesh.layerMask));\r\n } else {\r\n mesh.layerMask = 0x0fffffff;\r\n }\r\n\r\n // Physics\r\n if (parsedMesh.physicsImpostor) {\r\n Mesh._PhysicsImpostorParser(scene, mesh, parsedMesh);\r\n }\r\n\r\n // Levels\r\n if (parsedMesh.lodMeshIds) {\r\n mesh._waitingData.lods = {\r\n ids: parsedMesh.lodMeshIds,\r\n distances: parsedMesh.lodDistances ? parsedMesh.lodDistances : null,\r\n coverages: parsedMesh.lodCoverages ? parsedMesh.lodCoverages : null,\r\n };\r\n }\r\n\r\n // Instances\r\n if (parsedMesh.instances) {\r\n for (let index = 0; index < parsedMesh.instances.length; index++) {\r\n const parsedInstance = parsedMesh.instances[index];\r\n const instance = mesh.createInstance(parsedInstance.name);\r\n\r\n if (parsedInstance.id) {\r\n instance.id = parsedInstance.id;\r\n }\r\n\r\n if (Tags) {\r\n if (parsedInstance.tags) {\r\n Tags.AddTagsTo(instance, parsedInstance.tags);\r\n } else {\r\n Tags.AddTagsTo(instance, parsedMesh.tags);\r\n }\r\n }\r\n\r\n instance.position = Vector3.FromArray(parsedInstance.position);\r\n\r\n if (parsedInstance.metadata !== undefined) {\r\n instance.metadata = parsedInstance.metadata;\r\n }\r\n\r\n if (parsedInstance.parentId !== undefined) {\r\n instance._waitingParentId = parsedInstance.parentId;\r\n }\r\n\r\n if (parsedInstance.parentInstanceIndex !== undefined) {\r\n instance._waitingParentInstanceIndex = parsedInstance.parentInstanceIndex;\r\n }\r\n\r\n if (parsedInstance.isEnabled !== undefined && parsedInstance.isEnabled !== null) {\r\n instance.setEnabled(parsedInstance.isEnabled);\r\n }\r\n\r\n if (parsedInstance.isVisible !== undefined && parsedInstance.isVisible !== null) {\r\n instance.isVisible = parsedInstance.isVisible;\r\n }\r\n\r\n if (parsedInstance.isPickable !== undefined && parsedInstance.isPickable !== null) {\r\n instance.isPickable = parsedInstance.isPickable;\r\n }\r\n\r\n if (parsedInstance.rotationQuaternion) {\r\n instance.rotationQuaternion = Quaternion.FromArray(parsedInstance.rotationQuaternion);\r\n } else if (parsedInstance.rotation) {\r\n instance.rotation = Vector3.FromArray(parsedInstance.rotation);\r\n }\r\n\r\n instance.scaling = Vector3.FromArray(parsedInstance.scaling);\r\n\r\n if (parsedInstance.checkCollisions != undefined && parsedInstance.checkCollisions != null) {\r\n instance.checkCollisions = parsedInstance.checkCollisions;\r\n }\r\n if (parsedInstance.pickable != undefined && parsedInstance.pickable != null) {\r\n instance.isPickable = parsedInstance.pickable;\r\n }\r\n if (parsedInstance.showBoundingBox != undefined && parsedInstance.showBoundingBox != null) {\r\n instance.showBoundingBox = parsedInstance.showBoundingBox;\r\n }\r\n if (parsedInstance.showSubMeshesBoundingBox != undefined && parsedInstance.showSubMeshesBoundingBox != null) {\r\n instance.showSubMeshesBoundingBox = parsedInstance.showSubMeshesBoundingBox;\r\n }\r\n if (parsedInstance.alphaIndex != undefined && parsedInstance.showSubMeshesBoundingBox != null) {\r\n instance.alphaIndex = parsedInstance.alphaIndex;\r\n }\r\n\r\n // Physics\r\n if (parsedInstance.physicsImpostor) {\r\n Mesh._PhysicsImpostorParser(scene, instance, parsedInstance);\r\n }\r\n\r\n // Actions\r\n if (parsedInstance.actions !== undefined) {\r\n instance._waitingData.actions = parsedInstance.actions;\r\n }\r\n\r\n // Animation\r\n if (parsedInstance.animations) {\r\n for (let animationIndex = 0; animationIndex < parsedInstance.animations.length; animationIndex++) {\r\n const parsedAnimation = parsedInstance.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n instance.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n Node.ParseAnimationRanges(instance, parsedInstance, scene);\r\n\r\n if (parsedInstance.autoAnimate) {\r\n scene.beginAnimation(\r\n instance,\r\n parsedInstance.autoAnimateFrom,\r\n parsedInstance.autoAnimateTo,\r\n parsedInstance.autoAnimateLoop,\r\n parsedInstance.autoAnimateSpeed || 1.0\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Thin instances\r\n if (parsedMesh.thinInstances) {\r\n const thinInstances = parsedMesh.thinInstances;\r\n\r\n mesh.thinInstanceEnablePicking = !!thinInstances.enablePicking;\r\n\r\n if (thinInstances.matrixData) {\r\n mesh.thinInstanceSetBuffer(\"matrix\", new Float32Array(thinInstances.matrixData), 16, false);\r\n\r\n mesh._thinInstanceDataStorage.matrixBufferSize = thinInstances.matrixBufferSize;\r\n mesh._thinInstanceDataStorage.instancesCount = thinInstances.instancesCount;\r\n } else {\r\n mesh._thinInstanceDataStorage.matrixBufferSize = thinInstances.matrixBufferSize;\r\n }\r\n\r\n if (parsedMesh.thinInstances.userThinInstance) {\r\n const userThinInstance = parsedMesh.thinInstances.userThinInstance;\r\n\r\n for (const kind in userThinInstance.data) {\r\n mesh.thinInstanceSetBuffer(kind, new Float32Array(userThinInstance.data[kind]), userThinInstance.strides[kind], false);\r\n mesh._userThinInstanceBuffersStorage.sizes[kind] = userThinInstance.sizes[kind];\r\n }\r\n }\r\n }\r\n\r\n return mesh;\r\n }\r\n\r\n // Skeletons\r\n\r\n /**\r\n * Prepare internal position array for software CPU skinning\r\n * @returns original positions used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh\r\n */\r\n public setPositionsForCPUSkinning(): Nullable {\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n if (!internalDataInfo._sourcePositions) {\r\n const source = this.getVerticesData(VertexBuffer.PositionKind);\r\n if (!source) {\r\n return internalDataInfo._sourcePositions;\r\n }\r\n\r\n internalDataInfo._sourcePositions = new Float32Array(source);\r\n\r\n if (!this.isVertexBufferUpdatable(VertexBuffer.PositionKind)) {\r\n this.setVerticesData(VertexBuffer.PositionKind, source, true);\r\n }\r\n }\r\n return internalDataInfo._sourcePositions;\r\n }\r\n\r\n /**\r\n * Prepare internal normal array for software CPU skinning\r\n * @returns original normals used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh.\r\n */\r\n public setNormalsForCPUSkinning(): Nullable {\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n\r\n if (!internalDataInfo._sourceNormals) {\r\n const source = this.getVerticesData(VertexBuffer.NormalKind);\r\n\r\n if (!source) {\r\n return internalDataInfo._sourceNormals;\r\n }\r\n\r\n internalDataInfo._sourceNormals = new Float32Array(source);\r\n\r\n if (!this.isVertexBufferUpdatable(VertexBuffer.NormalKind)) {\r\n this.setVerticesData(VertexBuffer.NormalKind, source, true);\r\n }\r\n }\r\n return internalDataInfo._sourceNormals;\r\n }\r\n\r\n /**\r\n * Updates the vertex buffer by applying transformation from the bones\r\n * @param skeleton defines the skeleton to apply to current mesh\r\n * @returns the current mesh\r\n */\r\n public applySkeleton(skeleton: Skeleton): Mesh {\r\n if (!this.geometry) {\r\n return this;\r\n }\r\n\r\n if (this.geometry._softwareSkinningFrameId == this.getScene().getFrameId()) {\r\n return this;\r\n }\r\n\r\n this.geometry._softwareSkinningFrameId = this.getScene().getFrameId();\r\n\r\n if (!this.isVerticesDataPresent(VertexBuffer.PositionKind)) {\r\n return this;\r\n }\r\n if (!this.isVerticesDataPresent(VertexBuffer.MatricesIndicesKind)) {\r\n return this;\r\n }\r\n if (!this.isVerticesDataPresent(VertexBuffer.MatricesWeightsKind)) {\r\n return this;\r\n }\r\n\r\n const hasNormals = this.isVerticesDataPresent(VertexBuffer.NormalKind);\r\n\r\n const internalDataInfo = this._internalMeshDataInfo;\r\n\r\n if (!internalDataInfo._sourcePositions) {\r\n const submeshes = this.subMeshes.slice();\r\n this.setPositionsForCPUSkinning();\r\n this.subMeshes = submeshes;\r\n }\r\n\r\n if (hasNormals && !internalDataInfo._sourceNormals) {\r\n this.setNormalsForCPUSkinning();\r\n }\r\n\r\n // positionsData checks for not being Float32Array will only pass at most once\r\n let positionsData = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (!positionsData) {\r\n return this;\r\n }\r\n\r\n if (!(positionsData instanceof Float32Array)) {\r\n positionsData = new Float32Array(positionsData);\r\n }\r\n\r\n // normalsData checks for not being Float32Array will only pass at most once\r\n let normalsData = this.getVerticesData(VertexBuffer.NormalKind);\r\n\r\n if (hasNormals) {\r\n if (!normalsData) {\r\n return this;\r\n }\r\n\r\n if (!(normalsData instanceof Float32Array)) {\r\n normalsData = new Float32Array(normalsData);\r\n }\r\n }\r\n\r\n const matricesIndicesData = this.getVerticesData(VertexBuffer.MatricesIndicesKind);\r\n const matricesWeightsData = this.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n\r\n if (!matricesWeightsData || !matricesIndicesData) {\r\n return this;\r\n }\r\n\r\n const needExtras = this.numBoneInfluencers > 4;\r\n const matricesIndicesExtraData = needExtras ? this.getVerticesData(VertexBuffer.MatricesIndicesExtraKind) : null;\r\n const matricesWeightsExtraData = needExtras ? this.getVerticesData(VertexBuffer.MatricesWeightsExtraKind) : null;\r\n\r\n const skeletonMatrices = skeleton.getTransformMatrices(this);\r\n\r\n const tempVector3 = Vector3.Zero();\r\n const finalMatrix = new Matrix();\r\n const tempMatrix = new Matrix();\r\n\r\n let matWeightIdx = 0;\r\n let inf: number;\r\n for (let index = 0; index < positionsData.length; index += 3, matWeightIdx += 4) {\r\n let weight: number;\r\n for (inf = 0; inf < 4; inf++) {\r\n weight = matricesWeightsData[matWeightIdx + inf];\r\n if (weight > 0) {\r\n Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesData[matWeightIdx + inf] * 16), weight, tempMatrix);\r\n finalMatrix.addToSelf(tempMatrix);\r\n }\r\n }\r\n if (needExtras) {\r\n for (inf = 0; inf < 4; inf++) {\r\n weight = matricesWeightsExtraData![matWeightIdx + inf];\r\n if (weight > 0) {\r\n Matrix.FromFloat32ArrayToRefScaled(skeletonMatrices, Math.floor(matricesIndicesExtraData![matWeightIdx + inf] * 16), weight, tempMatrix);\r\n finalMatrix.addToSelf(tempMatrix);\r\n }\r\n }\r\n }\r\n\r\n Vector3.TransformCoordinatesFromFloatsToRef(\r\n internalDataInfo._sourcePositions![index],\r\n internalDataInfo._sourcePositions![index + 1],\r\n internalDataInfo._sourcePositions![index + 2],\r\n finalMatrix,\r\n tempVector3\r\n );\r\n tempVector3.toArray(positionsData, index);\r\n\r\n if (hasNormals) {\r\n Vector3.TransformNormalFromFloatsToRef(\r\n internalDataInfo._sourceNormals![index],\r\n internalDataInfo._sourceNormals![index + 1],\r\n internalDataInfo._sourceNormals![index + 2],\r\n finalMatrix,\r\n tempVector3\r\n );\r\n tempVector3.toArray(normalsData!, index);\r\n }\r\n\r\n finalMatrix.reset();\r\n }\r\n\r\n this.updateVerticesData(VertexBuffer.PositionKind, positionsData);\r\n if (hasNormals) {\r\n this.updateVerticesData(VertexBuffer.NormalKind, normalsData!);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // Tools\r\n\r\n /**\r\n * Returns an object containing a min and max Vector3 which are the minimum and maximum vectors of each mesh bounding box from the passed array, in the world coordinates\r\n * @param meshes defines the list of meshes to scan\r\n * @returns an object `{min:` Vector3`, max:` Vector3`}`\r\n */\r\n public static MinMax(meshes: AbstractMesh[]): { min: Vector3; max: Vector3 } {\r\n let minVector: Nullable = null;\r\n let maxVector: Nullable = null;\r\n\r\n meshes.forEach(function (mesh) {\r\n const boundingInfo = mesh.getBoundingInfo();\r\n\r\n const boundingBox = boundingInfo.boundingBox;\r\n if (!minVector || !maxVector) {\r\n minVector = boundingBox.minimumWorld;\r\n maxVector = boundingBox.maximumWorld;\r\n } else {\r\n minVector.minimizeInPlace(boundingBox.minimumWorld);\r\n maxVector.maximizeInPlace(boundingBox.maximumWorld);\r\n }\r\n });\r\n\r\n if (!minVector || !maxVector) {\r\n return {\r\n min: Vector3.Zero(),\r\n max: Vector3.Zero(),\r\n };\r\n }\r\n\r\n return {\r\n min: minVector,\r\n max: maxVector,\r\n };\r\n }\r\n\r\n /**\r\n * Returns the center of the `{min:` Vector3`, max:` Vector3`}` or the center of MinMax vector3 computed from a mesh array\r\n * @param meshesOrMinMaxVector could be an array of meshes or a `{min:` Vector3`, max:` Vector3`}` object\r\n * @returns a vector3\r\n */\r\n public static Center(meshesOrMinMaxVector: { min: Vector3; max: Vector3 } | AbstractMesh[]): Vector3 {\r\n const minMaxVector = meshesOrMinMaxVector instanceof Array ? Mesh.MinMax(meshesOrMinMaxVector) : meshesOrMinMaxVector;\r\n return Vector3.Center(minMaxVector.min, minMaxVector.max);\r\n }\r\n\r\n /**\r\n * Merge the array of meshes into a single mesh for performance reasons.\r\n * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes.\r\n * @param disposeSource when true (default), dispose of the vertices from the source meshes.\r\n * @param allow32BitsIndices when the sum of the vertices > 64k, this must be set to true.\r\n * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted.\r\n * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes.\r\n * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes.\r\n * @returns a new mesh\r\n */\r\n public static MergeMeshes(\r\n meshes: Array,\r\n disposeSource = true,\r\n allow32BitsIndices?: boolean,\r\n meshSubclass?: Mesh,\r\n subdivideWithSubMeshes?: boolean,\r\n multiMultiMaterials?: boolean\r\n ) {\r\n return runCoroutineSync(Mesh._MergeMeshesCoroutine(meshes, disposeSource, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials, false));\r\n }\r\n\r\n /**\r\n * Merge the array of meshes into a single mesh for performance reasons.\r\n * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes.\r\n * @param disposeSource when true (default), dispose of the vertices from the source meshes.\r\n * @param allow32BitsIndices when the sum of the vertices > 64k, this must be set to true.\r\n * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted.\r\n * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes.\r\n * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes.\r\n * @returns a new mesh\r\n */\r\n public static MergeMeshesAsync(\r\n meshes: Array,\r\n disposeSource = true,\r\n allow32BitsIndices?: boolean,\r\n meshSubclass?: Mesh,\r\n subdivideWithSubMeshes?: boolean,\r\n multiMultiMaterials?: boolean\r\n ) {\r\n return runCoroutineAsync(\r\n Mesh._MergeMeshesCoroutine(meshes, disposeSource, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials, true),\r\n createYieldingScheduler()\r\n );\r\n }\r\n\r\n private static *_MergeMeshesCoroutine(\r\n meshes: Array,\r\n disposeSource = true,\r\n allow32BitsIndices: boolean | undefined,\r\n meshSubclass: Mesh | undefined,\r\n subdivideWithSubMeshes: boolean | undefined,\r\n multiMultiMaterials: boolean | undefined,\r\n isAsync: boolean\r\n ): Coroutine> {\r\n // Remove any null/undefined entries from the mesh array\r\n meshes = meshes.filter(Boolean);\r\n\r\n if (meshes.length === 0) {\r\n return null;\r\n }\r\n\r\n let index: number;\r\n if (!allow32BitsIndices) {\r\n let totalVertices = 0;\r\n\r\n // Counting vertices\r\n for (index = 0; index < meshes.length; index++) {\r\n totalVertices += meshes[index].getTotalVertices();\r\n\r\n if (totalVertices >= 65536) {\r\n Logger.Warn(\"Cannot merge meshes because resulting mesh will have more than 65536 vertices. Please use allow32BitsIndices = true to use 32 bits indices\");\r\n return null;\r\n }\r\n }\r\n }\r\n if (multiMultiMaterials) {\r\n subdivideWithSubMeshes = false;\r\n }\r\n const materialArray: Array = new Array();\r\n const materialIndexArray: Array = new Array();\r\n // Merge\r\n const indiceArray: Array = new Array();\r\n const currentOverrideMaterialSideOrientation = meshes[0].overrideMaterialSideOrientation;\r\n\r\n for (index = 0; index < meshes.length; index++) {\r\n const mesh = meshes[index];\r\n if (mesh.isAnInstance) {\r\n Logger.Warn(\"Cannot merge instance meshes.\");\r\n return null;\r\n }\r\n\r\n if (currentOverrideMaterialSideOrientation !== mesh.overrideMaterialSideOrientation) {\r\n Logger.Warn(\"Cannot merge meshes with different overrideMaterialSideOrientation values.\");\r\n return null;\r\n }\r\n\r\n if (subdivideWithSubMeshes) {\r\n indiceArray.push(mesh.getTotalIndices());\r\n }\r\n\r\n if (multiMultiMaterials) {\r\n if (mesh.material) {\r\n const material = mesh.material;\r\n if (material instanceof MultiMaterial) {\r\n for (let matIndex = 0; matIndex < material.subMaterials.length; matIndex++) {\r\n if (materialArray.indexOf(material.subMaterials[matIndex]) < 0) {\r\n materialArray.push(material.subMaterials[matIndex]);\r\n }\r\n }\r\n for (let subIndex = 0; subIndex < mesh.subMeshes.length; subIndex++) {\r\n materialIndexArray.push(materialArray.indexOf(material.subMaterials[mesh.subMeshes[subIndex].materialIndex]));\r\n indiceArray.push(mesh.subMeshes[subIndex].indexCount);\r\n }\r\n } else {\r\n if (materialArray.indexOf(material) < 0) {\r\n materialArray.push(material);\r\n }\r\n for (let subIndex = 0; subIndex < mesh.subMeshes.length; subIndex++) {\r\n materialIndexArray.push(materialArray.indexOf(material));\r\n indiceArray.push(mesh.subMeshes[subIndex].indexCount);\r\n }\r\n }\r\n } else {\r\n for (let subIndex = 0; subIndex < mesh.subMeshes.length; subIndex++) {\r\n materialIndexArray.push(0);\r\n indiceArray.push(mesh.subMeshes[subIndex].indexCount);\r\n }\r\n }\r\n }\r\n }\r\n\r\n const source = meshes[0];\r\n\r\n const getVertexDataFromMesh = (mesh: Mesh) => {\r\n const wm = mesh.computeWorldMatrix(true);\r\n const vertexData = VertexData.ExtractFromMesh(mesh, false, false);\r\n return { vertexData, transform: wm };\r\n };\r\n\r\n const { vertexData: sourceVertexData, transform: sourceTransform } = getVertexDataFromMesh(source);\r\n if (isAsync) {\r\n yield;\r\n }\r\n\r\n const meshVertexDatas = new Array<{ vertexData: VertexData; transform?: Matrix }>(meshes.length - 1);\r\n for (let i = 1; i < meshes.length; i++) {\r\n meshVertexDatas[i - 1] = getVertexDataFromMesh(meshes[i]);\r\n if (isAsync) {\r\n yield;\r\n }\r\n }\r\n\r\n const mergeCoroutine = sourceVertexData._mergeCoroutine(sourceTransform, meshVertexDatas, allow32BitsIndices, isAsync, !disposeSource);\r\n let mergeCoroutineStep = mergeCoroutine.next();\r\n while (!mergeCoroutineStep.done) {\r\n if (isAsync) {\r\n yield;\r\n }\r\n mergeCoroutineStep = mergeCoroutine.next();\r\n }\r\n const vertexData = mergeCoroutineStep.value;\r\n\r\n if (!meshSubclass) {\r\n meshSubclass = new Mesh(source.name + \"_merged\", source.getScene());\r\n }\r\n\r\n const applyToCoroutine = vertexData._applyToCoroutine(meshSubclass, undefined, isAsync);\r\n let applyToCoroutineStep = applyToCoroutine.next();\r\n while (!applyToCoroutineStep.done) {\r\n if (isAsync) {\r\n yield;\r\n }\r\n applyToCoroutineStep = applyToCoroutine.next();\r\n }\r\n\r\n // Setting properties\r\n meshSubclass.checkCollisions = source.checkCollisions;\r\n meshSubclass.overrideMaterialSideOrientation = source.overrideMaterialSideOrientation;\r\n\r\n // Cleaning\r\n if (disposeSource) {\r\n for (index = 0; index < meshes.length; index++) {\r\n meshes[index].dispose();\r\n }\r\n }\r\n\r\n // Subdivide\r\n if (subdivideWithSubMeshes || multiMultiMaterials) {\r\n //-- removal of global submesh\r\n meshSubclass.releaseSubMeshes();\r\n index = 0;\r\n let offset = 0;\r\n\r\n //-- apply subdivision according to index table\r\n while (index < indiceArray.length) {\r\n SubMesh.CreateFromIndices(0, offset, indiceArray[index], meshSubclass, undefined, false);\r\n offset += indiceArray[index];\r\n index++;\r\n }\r\n\r\n for (const subMesh of meshSubclass.subMeshes) {\r\n subMesh.refreshBoundingInfo();\r\n }\r\n\r\n meshSubclass.computeWorldMatrix(true);\r\n }\r\n\r\n if (multiMultiMaterials) {\r\n const newMultiMaterial = new MultiMaterial(source.name + \"_merged\", source.getScene());\r\n newMultiMaterial.subMaterials = materialArray;\r\n for (let subIndex = 0; subIndex < meshSubclass.subMeshes.length; subIndex++) {\r\n meshSubclass.subMeshes[subIndex].materialIndex = materialIndexArray[subIndex];\r\n }\r\n meshSubclass.material = newMultiMaterial;\r\n } else {\r\n meshSubclass.material = source.material;\r\n }\r\n\r\n return meshSubclass;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public addInstance(instance: InstancedMesh) {\r\n instance._indexInSourceMeshInstanceArray = this.instances.length;\r\n this.instances.push(instance);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public removeInstance(instance: InstancedMesh) {\r\n // Remove from mesh\r\n const index = instance._indexInSourceMeshInstanceArray;\r\n if (index != -1) {\r\n if (index !== this.instances.length - 1) {\r\n const last = this.instances[this.instances.length - 1];\r\n this.instances[index] = last;\r\n last._indexInSourceMeshInstanceArray = index;\r\n }\r\n\r\n instance._indexInSourceMeshInstanceArray = -1;\r\n this.instances.pop();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _shouldConvertRHS() {\r\n return this.overrideMaterialSideOrientation === Material.CounterClockWiseSideOrientation;\r\n }\r\n\r\n /** @internal */\r\n public _getRenderingFillMode(fillMode: number): number {\r\n const scene = this.getScene();\r\n\r\n if (scene.forcePointsCloud) return Material.PointFillMode;\r\n\r\n if (scene.forceWireframe) return Material.WireFrameFillMode;\r\n\r\n return this.overrideRenderingFillMode ?? fillMode;\r\n }\r\n\r\n // deprecated methods\r\n /**\r\n * Sets the mesh material by the material or multiMaterial `id` property\r\n * @param id is a string identifying the material or the multiMaterial\r\n * @returns the current mesh\r\n * @deprecated Please use MeshBuilder instead Please use setMaterialById instead\r\n */\r\n public setMaterialByID(id: string): Mesh {\r\n return this.setMaterialById(id);\r\n }\r\n\r\n /**\r\n * Creates a ribbon mesh.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\r\n * @param name defines the name of the mesh to create\r\n * @param pathArray is a required array of paths, what are each an array of successive Vector3. The pathArray parameter depicts the ribbon geometry.\r\n * @param closeArray creates a seam between the first and the last paths of the path array (default is false)\r\n * @param closePath creates a seam between the first and the last points of each path of the path array\r\n * @param offset is taken in account only if the `pathArray` is containing a single path\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @param instance defines an instance of an existing Ribbon object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#ribbon)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateRibbon(\r\n name: string,\r\n pathArray: Vector3[][],\r\n closeArray: boolean,\r\n closePath: boolean,\r\n offset: number,\r\n scene?: Scene,\r\n updatable?: boolean,\r\n sideOrientation?: number,\r\n instance?: Mesh\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a plane polygonal mesh. By default, this is a disc.\r\n * @param name defines the name of the mesh to create\r\n * @param radius sets the radius size (float) of the polygon (default 0.5)\r\n * @param tessellation sets the number of polygon sides (positive integer, default 64). So a tessellation valued to 3 will build a triangle, to 4 a square, etc\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateDisc(name: string, radius: number, tessellation: number, scene: Nullable, updatable?: boolean, sideOrientation?: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a box mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param size sets the size (float) of each box side (default 1)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateBox(name: string, size: number, scene: Nullable, updatable?: boolean, sideOrientation?: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a sphere mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param segments sets the sphere number of horizontal stripes (positive integer, default 32)\r\n * @param diameter sets the diameter size (float) of the sphere (default 1)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateSphere(name: string, segments: number, diameter: number, scene?: Scene, updatable?: boolean, sideOrientation?: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a hemisphere mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param segments sets the sphere number of horizontal stripes (positive integer, default 32)\r\n * @param diameter sets the diameter size (float) of the sphere (default 1)\r\n * @param scene defines the hosting scene\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateHemisphere(name: string, segments: number, diameter: number, scene?: Scene): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a cylinder or a cone mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param height sets the height size (float) of the cylinder/cone (float, default 2)\r\n * @param diameterTop set the top cap diameter (floats, default 1)\r\n * @param diameterBottom set the bottom cap diameter (floats, default 1). This value can't be zero\r\n * @param tessellation sets the number of cylinder sides (positive integer, default 24). Set it to 3 to get a prism for instance\r\n * @param subdivisions sets the number of rings along the cylinder height (positive integer, default 1)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateCylinder(\r\n name: string,\r\n height: number,\r\n diameterTop: number,\r\n diameterBottom: number,\r\n tessellation: number,\r\n subdivisions: any,\r\n scene?: Scene,\r\n updatable?: any,\r\n sideOrientation?: number\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n // Torus (Code from SharpDX.org)\r\n /**\r\n * Creates a torus mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param diameter sets the diameter size (float) of the torus (default 1)\r\n * @param thickness sets the diameter size of the tube of the torus (float, default 0.5)\r\n * @param tessellation sets the number of torus sides (positive integer, default 16)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateTorus(name: string, diameter: number, thickness: number, tessellation: number, scene?: Scene, updatable?: boolean, sideOrientation?: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a torus knot mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param radius sets the global radius size (float) of the torus knot (default 2)\r\n * @param tube sets the diameter size of the tube of the torus (float, default 0.5)\r\n * @param radialSegments sets the number of sides on each tube segments (positive integer, default 32)\r\n * @param tubularSegments sets the number of tubes to decompose the knot into (positive integer, default 32)\r\n * @param p the number of windings on X axis (positive integers, default 2)\r\n * @param q the number of windings on Y axis (positive integers, default 3)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateTorusKnot(\r\n name: string,\r\n radius: number,\r\n tube: number,\r\n radialSegments: number,\r\n tubularSegments: number,\r\n p: number,\r\n q: number,\r\n scene?: Scene,\r\n updatable?: boolean,\r\n sideOrientation?: number\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a line mesh..\r\n * @param name defines the name of the mesh to create\r\n * @param points is an array successive Vector3\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines).\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateLines(name: string, points: Vector3[], scene: Nullable, updatable: boolean, instance?: Nullable): LinesMesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a dashed line mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param points is an array successive Vector3\r\n * @param dashSize is the size of the dashes relatively the dash number (positive float, default 3)\r\n * @param gapSize is the size of the gap between two successive dashes relatively the dash number (positive float, default 1)\r\n * @param dashNb is the intended total number of dashes (positive integer, default 200)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateDashedLines(\r\n name: string,\r\n points: Vector3[],\r\n dashSize: number,\r\n gapSize: number,\r\n dashNb: number,\r\n scene: Nullable,\r\n updatable?: boolean,\r\n instance?: LinesMesh\r\n ): LinesMesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a polygon mesh.Please consider using the same method from the MeshBuilder class instead\r\n * The polygon's shape will depend on the input parameters and is constructed parallel to a ground mesh.\r\n * The parameter `shape` is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors.\r\n * You can set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created.\r\n * Remember you can only change the shape positions, not their number when updating a polygon.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#non-regular-polygon\r\n * @param name defines the name of the mesh to create\r\n * @param shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors\r\n * @param scene defines the hosting scene\r\n * @param holes is a required array of arrays of successive Vector3 used to defines holes in the polygon\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @param earcutInjection can be used to inject your own earcut reference\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreatePolygon(name: string, shape: Vector3[], scene: Scene, holes?: Vector3[][], updatable?: boolean, sideOrientation?: number, earcutInjection?: any): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates an extruded polygon mesh, with depth in the Y direction..\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-non-regular-polygon\r\n * @param name defines the name of the mesh to create\r\n * @param shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors\r\n * @param depth defines the height of extrusion\r\n * @param scene defines the hosting scene\r\n * @param holes is a required array of arrays of successive Vector3 used to defines holes in the polygon\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @param earcutInjection can be used to inject your own earcut reference\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static ExtrudePolygon(\r\n name: string,\r\n shape: Vector3[],\r\n depth: number,\r\n scene: Scene,\r\n holes?: Vector3[][],\r\n updatable?: boolean,\r\n sideOrientation?: number,\r\n earcutInjection?: any\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates an extruded shape mesh.\r\n * The extrusion is a parametric shape. It has no predefined shape. Its final shape will depend on the input parameters.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes\r\n * @param name defines the name of the mesh to create\r\n * @param shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis\r\n * @param path is a required array of successive Vector3. This is the axis curve the shape is extruded along\r\n * @param scale is the value to scale the shape\r\n * @param rotation is the angle value to rotate the shape each step (each path point), from the former step (so rotation added each step) along the curve\r\n * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @param instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#extruded-shape)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static ExtrudeShape(\r\n name: string,\r\n shape: Vector3[],\r\n path: Vector3[],\r\n scale: number,\r\n rotation: number,\r\n cap: number,\r\n scene: Nullable,\r\n updatable?: boolean,\r\n sideOrientation?: number,\r\n instance?: Mesh\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates an custom extruded shape mesh.\r\n * The custom extrusion is a parametric shape.\r\n * It has no predefined shape. Its final shape will depend on the input parameters.\r\n *\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes\r\n * @param name defines the name of the mesh to create\r\n * @param shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis\r\n * @param path is a required array of successive Vector3. This is the axis curve the shape is extruded along\r\n * @param scaleFunction is a custom Javascript function called on each path point\r\n * @param rotationFunction is a custom Javascript function called on each path point\r\n * @param ribbonCloseArray forces the extrusion underlying ribbon to close all the paths in its `pathArray`\r\n * @param ribbonClosePath forces the extrusion underlying ribbon to close its `pathArray`\r\n * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @param instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#extruded-shape)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static ExtrudeShapeCustom(\r\n name: string,\r\n shape: Vector3[],\r\n path: Vector3[],\r\n scaleFunction: Nullable<{ (i: number, distance: number): number }>,\r\n rotationFunction: Nullable<{ (i: number, distance: number): number }>,\r\n ribbonCloseArray: boolean,\r\n ribbonClosePath: boolean,\r\n cap: number,\r\n scene: Scene,\r\n updatable?: boolean,\r\n sideOrientation?: number,\r\n instance?: Mesh\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates lathe mesh.\r\n * The lathe is a shape with a symmetry axis : a 2D model shape is rotated around this axis to design the lathe.\r\n * @param name defines the name of the mesh to create\r\n * @param shape is a required array of successive Vector3. This array depicts the shape to be rotated in its local space : the shape must be designed in the xOy plane and will be rotated around the Y axis. It's usually a 2D shape, so the Vector3 z coordinates are often set to zero\r\n * @param radius is the radius value of the lathe\r\n * @param tessellation is the side number of the lathe.\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateLathe(name: string, shape: Vector3[], radius: number, tessellation: number, scene: Scene, updatable?: boolean, sideOrientation?: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a plane mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param size sets the size (float) of both sides of the plane at once (default 1)\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreatePlane(name: string, size: number, scene: Scene, updatable?: boolean, sideOrientation?: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a ground mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param width set the width of the ground\r\n * @param height set the height of the ground\r\n * @param subdivisions sets the number of subdivisions per side\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateGround(name: string, width: number, height: number, subdivisions: number, scene?: Scene, updatable?: boolean): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a tiled ground mesh.\r\n * @param name defines the name of the mesh to create\r\n * @param xmin set the ground minimum X coordinate\r\n * @param zmin set the ground minimum Y coordinate\r\n * @param xmax set the ground maximum X coordinate\r\n * @param zmax set the ground maximum Z coordinate\r\n * @param subdivisions is an object `{w: positive integer, h: positive integer}` (default `{w: 6, h: 6}`). `w` and `h` are the numbers of subdivisions on the ground width and height. Each subdivision is called a tile\r\n * @param precision is an object `{w: positive integer, h: positive integer}` (default `{w: 2, h: 2}`). `w` and `h` are the numbers of subdivisions on the ground width and height of each tile\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateTiledGround(\r\n name: string,\r\n xmin: number,\r\n zmin: number,\r\n xmax: number,\r\n zmax: number,\r\n subdivisions: { w: number; h: number },\r\n precision: { w: number; h: number },\r\n scene: Scene,\r\n updatable?: boolean\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a ground mesh from a height map.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/height_map\r\n * @param name defines the name of the mesh to create\r\n * @param url sets the URL of the height map image resource\r\n * @param width set the ground width size\r\n * @param height set the ground height size\r\n * @param subdivisions sets the number of subdivision per side\r\n * @param minHeight is the minimum altitude on the ground\r\n * @param maxHeight is the maximum altitude on the ground\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param onReady is a callback function that will be called once the mesh is built (the height map download can last some time)\r\n * @param alphaFilter will filter any data where the alpha channel is below this value, defaults 0 (all data visible)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateGroundFromHeightMap(\r\n name: string,\r\n url: string,\r\n width: number,\r\n height: number,\r\n subdivisions: number,\r\n minHeight: number,\r\n maxHeight: number,\r\n scene: Scene,\r\n updatable?: boolean,\r\n onReady?: (mesh: GroundMesh) => void,\r\n alphaFilter?: number\r\n ): GroundMesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a tube mesh.\r\n * The tube is a parametric shape.\r\n * It has no predefined shape. Its final shape will depend on the input parameters.\r\n *\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param\r\n * @param name defines the name of the mesh to create\r\n * @param path is a required array of successive Vector3. It is the curve used as the axis of the tube\r\n * @param radius sets the tube radius size\r\n * @param tessellation is the number of sides on the tubular surface\r\n * @param radiusFunction is a custom function. If it is not null, it overrides the parameter `radius`. This function is called on each point of the tube path and is passed the index `i` of the i-th point and the distance of this point from the first point of the path\r\n * @param cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL\r\n * @param scene defines the hosting scene\r\n * @param updatable defines if the mesh must be flagged as updatable\r\n * @param sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)\r\n * @param instance is an instance of an existing Tube object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#tube)\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateTube(\r\n name: string,\r\n path: Vector3[],\r\n radius: number,\r\n tessellation: number,\r\n radiusFunction: { (i: number, distance: number): number },\r\n cap: number,\r\n scene: Scene,\r\n updatable?: boolean,\r\n sideOrientation?: number,\r\n instance?: Mesh\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a polyhedron mesh.\r\n *.\r\n * * The parameter `type` (positive integer, max 14, default 0) sets the polyhedron type to build among the 15 embedded types. Please refer to the type sheet in the tutorial to choose the wanted type\r\n * * The parameter `size` (positive float, default 1) sets the polygon size\r\n * * You can overwrite the `size` on each dimension bu using the parameters `sizeX`, `sizeY` or `sizeZ` (positive floats, default to `size` value)\r\n * * You can build other polyhedron types than the 15 embbeded ones by setting the parameter `custom` (`polyhedronObject`, default null). If you set the parameter `custom`, this overwrittes the parameter `type`\r\n * * A `polyhedronObject` is a formatted javascript object. You'll find a full file with pre-set polyhedra here : https://github.com/BabylonJS/Extensions/tree/master/Polyhedron\r\n * * You can set the color and the UV of each side of the polyhedron with the parameters `faceColors` (Color4, default `(1, 1, 1, 1)`) and faceUV (Vector4, default `(0, 0, 1, 1)`)\r\n * * To understand how to set `faceUV` or `faceColors`, please read this by considering the right number of faces of your polyhedron, instead of only 6 for the box : https://doc.babylonjs.com/features/featuresDeepDive/materials/using/texturePerBoxFace\r\n * * The parameter `flat` (boolean, default true). If set to false, it gives the polyhedron a single global face, so less vertices and shared normals. In this case, `faceColors` and `faceUV` are ignored\r\n * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\r\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\r\n * @param name defines the name of the mesh to create\r\n * @param options defines the options used to create the mesh\r\n * @param scene defines the hosting scene\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreatePolyhedron(\r\n name: string,\r\n options: {\r\n type?: number;\r\n size?: number;\r\n sizeX?: number;\r\n sizeY?: number;\r\n sizeZ?: number;\r\n custom?: any;\r\n faceUV?: Vector4[];\r\n faceColors?: Color4[];\r\n updatable?: boolean;\r\n sideOrientation?: number;\r\n },\r\n scene: Scene\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a sphere based upon an icosahedron with 20 triangular faces which can be subdivided\r\n * * The parameter `radius` sets the radius size (float) of the icosphere (default 1)\r\n * * You can set some different icosphere dimensions, for instance to build an ellipsoid, by using the parameters `radiusX`, `radiusY` and `radiusZ` (all by default have the same value than `radius`)\r\n * * The parameter `subdivisions` sets the number of subdivisions (positive integer, default 4). The more subdivisions, the more faces on the icosphere whatever its size\r\n * * The parameter `flat` (boolean, default true) gives each side its own normals. Set it to false to get a smooth continuous light reflection on the surface\r\n * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\r\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/polyhedra#icosphere\r\n * @param name defines the name of the mesh\r\n * @param options defines the options used to create the mesh\r\n * @param scene defines the hosting scene\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateIcoSphere(\r\n name: string,\r\n options: { radius?: number; flat?: boolean; subdivisions?: number; sideOrientation?: number; updatable?: boolean },\r\n scene: Scene\r\n ): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Creates a decal mesh.\r\n *.\r\n * A decal is a mesh usually applied as a model onto the surface of another mesh\r\n * @param name defines the name of the mesh\r\n * @param sourceMesh defines the mesh receiving the decal\r\n * @param position sets the position of the decal in world coordinates\r\n * @param normal sets the normal of the mesh where the decal is applied onto in world coordinates\r\n * @param size sets the decal scaling\r\n * @param angle sets the angle to rotate the decal\r\n * @returns a new Mesh\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateDecal(name: string, sourceMesh: AbstractMesh, position: Vector3, normal: Vector3, size: Vector3, angle: number): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /** Creates a Capsule Mesh\r\n * @param name defines the name of the mesh.\r\n * @param options the constructors options used to shape the mesh.\r\n * @param scene defines the scene the mesh is scoped to.\r\n * @returns the capsule mesh\r\n * @see https://doc.babylonjs.com/how_to/capsule_shape\r\n * @deprecated Please use MeshBuilder instead\r\n */\r\n public static CreateCapsule(name: string, options: ICreateCapsuleOptions, scene: Scene): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n\r\n /**\r\n * Extends a mesh to a Goldberg mesh\r\n * Warning the mesh to convert MUST be an import of a perviously exported Goldberg mesh\r\n * @param mesh the mesh to convert\r\n * @returns the extended mesh\r\n * @deprecated Please use ExtendMeshToGoldberg instead\r\n */\r\n public static ExtendToGoldberg(mesh: Mesh): Mesh {\r\n throw new Error(\"Import MeshBuilder to populate this function\");\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.Mesh\", Mesh);\r\n", "import type { Scene } from \"../scene\";\r\nimport { Vector3, Vector2, TmpVectors, Vector4 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\n\r\nMesh._GroundMeshParser = (parsedMesh: any, scene: Scene): Mesh => {\r\n return GroundMesh.Parse(parsedMesh, scene);\r\n};\r\n\r\n/**\r\n * Mesh representing the ground\r\n */\r\nexport class GroundMesh extends Mesh {\r\n /** If octree should be generated */\r\n public generateOctree = false;\r\n\r\n private _heightQuads: { slope: Vector2; facet1: Vector4; facet2: Vector4 }[];\r\n\r\n /** @internal */\r\n public _subdivisionsX: number;\r\n /** @internal */\r\n public _subdivisionsY: number;\r\n /** @internal */\r\n public _width: number;\r\n /** @internal */\r\n public _height: number;\r\n /** @internal */\r\n public _minX: number;\r\n /** @internal */\r\n public _maxX: number;\r\n /** @internal */\r\n public _minZ: number;\r\n /** @internal */\r\n public _maxZ: number;\r\n\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n }\r\n\r\n /**\r\n * \"GroundMesh\"\r\n * @returns \"GroundMesh\"\r\n */\r\n public getClassName(): string {\r\n return \"GroundMesh\";\r\n }\r\n\r\n /**\r\n * The minimum of x and y subdivisions\r\n */\r\n public get subdivisions(): number {\r\n return Math.min(this._subdivisionsX, this._subdivisionsY);\r\n }\r\n\r\n /**\r\n * X subdivisions\r\n */\r\n public get subdivisionsX(): number {\r\n return this._subdivisionsX;\r\n }\r\n\r\n /**\r\n * Y subdivisions\r\n */\r\n public get subdivisionsY(): number {\r\n return this._subdivisionsY;\r\n }\r\n\r\n /**\r\n * This function will divide the mesh into submeshes and update an octree to help to select the right submeshes\r\n * for rendering, picking and collision computations. Please note that you must have a decent number of submeshes\r\n * to get performance improvements when using an octree.\r\n * @param chunksCount the number of submeshes the mesh will be divided into\r\n * @param octreeBlocksSize the maximum size of the octree blocks (Default: 32)\r\n */\r\n public optimize(chunksCount: number, octreeBlocksSize = 32): void {\r\n this._subdivisionsX = chunksCount;\r\n this._subdivisionsY = chunksCount;\r\n this.subdivide(chunksCount);\r\n\r\n // Call the octree system optimization if it is defined.\r\n const thisAsAny = this as any;\r\n if (thisAsAny.createOrUpdateSubmeshesOctree) {\r\n thisAsAny.createOrUpdateSubmeshesOctree(octreeBlocksSize);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a height (y) value in the World system :\r\n * the ground altitude at the coordinates (x, z) expressed in the World system.\r\n * @param x x coordinate\r\n * @param z z coordinate\r\n * @returns the ground y position if (x, z) are outside the ground surface.\r\n */\r\n public getHeightAtCoordinates(x: number, z: number): number {\r\n const world = this.getWorldMatrix();\r\n const invMat = TmpVectors.Matrix[5];\r\n world.invertToRef(invMat);\r\n const tmpVect = TmpVectors.Vector3[8];\r\n Vector3.TransformCoordinatesFromFloatsToRef(x, 0.0, z, invMat, tmpVect); // transform x,z in the mesh local space\r\n x = tmpVect.x;\r\n z = tmpVect.z;\r\n if (x < this._minX || x >= this._maxX || z <= this._minZ || z > this._maxZ) {\r\n return this.position.y;\r\n }\r\n if (!this._heightQuads || this._heightQuads.length == 0) {\r\n this._initHeightQuads();\r\n this._computeHeightQuads();\r\n }\r\n const facet = this._getFacetAt(x, z);\r\n const y = -(facet.x * x + facet.z * z + facet.w) / facet.y;\r\n // return y in the World system\r\n Vector3.TransformCoordinatesFromFloatsToRef(0.0, y, 0.0, world, tmpVect);\r\n return tmpVect.y;\r\n }\r\n\r\n /**\r\n * Returns a normalized vector (Vector3) orthogonal to the ground\r\n * at the ground coordinates (x, z) expressed in the World system.\r\n * @param x x coordinate\r\n * @param z z coordinate\r\n * @returns Vector3(0.0, 1.0, 0.0) if (x, z) are outside the ground surface.\r\n */\r\n public getNormalAtCoordinates(x: number, z: number): Vector3 {\r\n const normal = new Vector3(0.0, 1.0, 0.0);\r\n this.getNormalAtCoordinatesToRef(x, z, normal);\r\n return normal;\r\n }\r\n\r\n /**\r\n * Updates the Vector3 passed a reference with a normalized vector orthogonal to the ground\r\n * at the ground coordinates (x, z) expressed in the World system.\r\n * Doesn't update the reference Vector3 if (x, z) are outside the ground surface.\r\n * @param x x coordinate\r\n * @param z z coordinate\r\n * @param ref vector to store the result\r\n * @returns the GroundMesh.\r\n */\r\n public getNormalAtCoordinatesToRef(x: number, z: number, ref: Vector3): GroundMesh {\r\n const world = this.getWorldMatrix();\r\n const tmpMat = TmpVectors.Matrix[5];\r\n world.invertToRef(tmpMat);\r\n const tmpVect = TmpVectors.Vector3[8];\r\n Vector3.TransformCoordinatesFromFloatsToRef(x, 0.0, z, tmpMat, tmpVect); // transform x,z in the mesh local space\r\n x = tmpVect.x;\r\n z = tmpVect.z;\r\n if (x < this._minX || x > this._maxX || z < this._minZ || z > this._maxZ) {\r\n return this;\r\n }\r\n if (!this._heightQuads || this._heightQuads.length == 0) {\r\n this._initHeightQuads();\r\n this._computeHeightQuads();\r\n }\r\n const facet = this._getFacetAt(x, z);\r\n Vector3.TransformNormalFromFloatsToRef(facet.x, facet.y, facet.z, world, ref);\r\n return this;\r\n }\r\n\r\n /**\r\n * Force the heights to be recomputed for getHeightAtCoordinates() or getNormalAtCoordinates()\r\n * if the ground has been updated.\r\n * This can be used in the render loop.\r\n * @returns the GroundMesh.\r\n */\r\n public updateCoordinateHeights(): GroundMesh {\r\n if (!this._heightQuads || this._heightQuads.length == 0) {\r\n this._initHeightQuads();\r\n }\r\n this._computeHeightQuads();\r\n return this;\r\n }\r\n\r\n // Returns the element \"facet\" from the heightQuads array relative to (x, z) local coordinates\r\n private _getFacetAt(x: number, z: number): Vector4 {\r\n // retrieve col and row from x, z coordinates in the ground local system\r\n const col = Math.floor(((x + this._maxX) * this._subdivisionsX) / this._width);\r\n const row = Math.floor((-(z + this._maxZ) * this._subdivisionsY) / this._height + this._subdivisionsY);\r\n const quad = this._heightQuads[row * this._subdivisionsX + col];\r\n let facet;\r\n if (z < quad.slope.x * x + quad.slope.y) {\r\n facet = quad.facet1;\r\n } else {\r\n facet = quad.facet2;\r\n }\r\n return facet;\r\n }\r\n\r\n // Creates and populates the heightMap array with \"facet\" elements :\r\n // a quad is two triangular facets separated by a slope, so a \"facet\" element is 1 slope + 2 facets\r\n // slope : Vector2(c, h) = 2D diagonal line equation setting apart two triangular facets in a quad : z = cx + h\r\n // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0\r\n // facet2 : Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0\r\n // Returns the GroundMesh.\r\n private _initHeightQuads(): GroundMesh {\r\n const subdivisionsX = this._subdivisionsX;\r\n const subdivisionsY = this._subdivisionsY;\r\n this._heightQuads = new Array();\r\n for (let row = 0; row < subdivisionsY; row++) {\r\n for (let col = 0; col < subdivisionsX; col++) {\r\n const quad = { slope: Vector2.Zero(), facet1: new Vector4(0.0, 0.0, 0.0, 0.0), facet2: new Vector4(0.0, 0.0, 0.0, 0.0) };\r\n this._heightQuads[row * subdivisionsX + col] = quad;\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n // Compute each quad element values and update the heightMap array :\r\n // slope : Vector2(c, h) = 2D diagonal line equation setting apart two triangular facets in a quad : z = cx + h\r\n // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0\r\n // facet2 : Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0\r\n // Returns the GroundMesh.\r\n private _computeHeightQuads(): GroundMesh {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n\r\n if (!positions) {\r\n return this;\r\n }\r\n\r\n const v1 = TmpVectors.Vector3[3];\r\n const v2 = TmpVectors.Vector3[2];\r\n const v3 = TmpVectors.Vector3[1];\r\n const v4 = TmpVectors.Vector3[0];\r\n const v1v2 = TmpVectors.Vector3[4];\r\n const v1v3 = TmpVectors.Vector3[5];\r\n const v1v4 = TmpVectors.Vector3[6];\r\n const norm1 = TmpVectors.Vector3[7];\r\n const norm2 = TmpVectors.Vector3[8];\r\n let i = 0;\r\n let j = 0;\r\n let k = 0;\r\n let cd = 0; // 2D slope coefficient : z = cd * x + h\r\n let h = 0;\r\n let d1 = 0; // facet plane equation : ax + by + cz + d = 0\r\n let d2 = 0;\r\n\r\n const subdivisionsX = this._subdivisionsX;\r\n const subdivisionsY = this._subdivisionsY;\r\n\r\n for (let row = 0; row < subdivisionsY; row++) {\r\n for (let col = 0; col < subdivisionsX; col++) {\r\n i = col * 3;\r\n j = row * (subdivisionsX + 1) * 3;\r\n k = (row + 1) * (subdivisionsX + 1) * 3;\r\n v1.x = positions[j + i];\r\n v1.y = positions[j + i + 1];\r\n v1.z = positions[j + i + 2];\r\n v2.x = positions[j + i + 3];\r\n v2.y = positions[j + i + 4];\r\n v2.z = positions[j + i + 5];\r\n v3.x = positions[k + i];\r\n v3.y = positions[k + i + 1];\r\n v3.z = positions[k + i + 2];\r\n v4.x = positions[k + i + 3];\r\n v4.y = positions[k + i + 4];\r\n v4.z = positions[k + i + 5];\r\n\r\n // 2D slope V1V4\r\n cd = (v4.z - v1.z) / (v4.x - v1.x);\r\n h = v1.z - cd * v1.x; // v1 belongs to the slope\r\n\r\n // facet equations :\r\n // we compute each facet normal vector\r\n // the equation of the facet plane is : norm.x * x + norm.y * y + norm.z * z + d = 0\r\n // we compute the value d by applying the equation to v1 which belongs to the plane\r\n // then we store the facet equation in a Vector4\r\n v2.subtractToRef(v1, v1v2);\r\n v3.subtractToRef(v1, v1v3);\r\n v4.subtractToRef(v1, v1v4);\r\n Vector3.CrossToRef(v1v4, v1v3, norm1); // caution : CrossToRef uses the Tmp class\r\n Vector3.CrossToRef(v1v2, v1v4, norm2);\r\n norm1.normalize();\r\n norm2.normalize();\r\n d1 = -(norm1.x * v1.x + norm1.y * v1.y + norm1.z * v1.z);\r\n d2 = -(norm2.x * v2.x + norm2.y * v2.y + norm2.z * v2.z);\r\n\r\n const quad = this._heightQuads[row * subdivisionsX + col];\r\n quad.slope.copyFromFloats(cd, h);\r\n quad.facet1.copyFromFloats(norm1.x, norm1.y, norm1.z, d1);\r\n quad.facet2.copyFromFloats(norm2.x, norm2.y, norm2.z, d2);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Serializes this ground mesh\r\n * @param serializationObject object to write serialization to\r\n */\r\n public serialize(serializationObject: any): void {\r\n super.serialize(serializationObject);\r\n serializationObject.subdivisionsX = this._subdivisionsX;\r\n serializationObject.subdivisionsY = this._subdivisionsY;\r\n\r\n serializationObject.minX = this._minX;\r\n serializationObject.maxX = this._maxX;\r\n\r\n serializationObject.minZ = this._minZ;\r\n serializationObject.maxZ = this._maxZ;\r\n\r\n serializationObject.width = this._width;\r\n serializationObject.height = this._height;\r\n }\r\n\r\n /**\r\n * Parses a serialized ground mesh\r\n * @param parsedMesh the serialized mesh\r\n * @param scene the scene to create the ground mesh in\r\n * @returns the created ground mesh\r\n */\r\n public static Parse(parsedMesh: any, scene: Scene): GroundMesh {\r\n const result = new GroundMesh(parsedMesh.name, scene);\r\n\r\n result._subdivisionsX = parsedMesh.subdivisionsX || 1;\r\n result._subdivisionsY = parsedMesh.subdivisionsY || 1;\r\n\r\n result._minX = parsedMesh.minX;\r\n result._maxX = parsedMesh.maxX;\r\n\r\n result._minZ = parsedMesh.minZ;\r\n result._maxZ = parsedMesh.maxZ;\r\n\r\n result._width = parsedMesh.width;\r\n result._height = parsedMesh.height;\r\n\r\n return result;\r\n }\r\n}\r\n", "import type { Scene } from \"../../scene\";\r\nimport { Vector3 } from \"../../Maths/math.vector\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport { GroundMesh } from \"../groundMesh\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport { Epsilon } from \"../../Maths/math.constants\";\r\nimport { CompatibilityOptions } from \"../../Compat/compatibilityOptions\";\r\n\r\n/**\r\n * Creates the VertexData for a Ground\r\n * @param options an object used to set the following optional parameters for the Ground, required but can be empty\r\n * @param options.width the width (x direction) of the ground, optional, default 1\r\n * @param options.height the height (z direction) of the ground, optional, default 1\r\n * @param options.subdivisions the number of subdivisions per side, optional, default 1\r\n * @param options.subdivisionsX the number of subdivisions in the x direction, overrides options.subdivisions, optional, default undefined\r\n * @param options.subdivisionsY the number of subdivisions in the y direction, overrides options.subdivisions, optional, default undefined\r\n * @returns the VertexData of the Ground\r\n */\r\nexport function CreateGroundVertexData(options: { width?: number; height?: number; subdivisions?: number; subdivisionsX?: number; subdivisionsY?: number }): VertexData {\r\n const indices = [];\r\n const positions = [];\r\n const normals = [];\r\n const uvs = [];\r\n let row: number, col: number;\r\n\r\n const width: number = options.width || 1;\r\n const height: number = options.height || 1;\r\n const subdivisionsX: number = (options.subdivisionsX || options.subdivisions || 1) | 0;\r\n const subdivisionsY: number = (options.subdivisionsY || options.subdivisions || 1) | 0;\r\n\r\n for (row = 0; row <= subdivisionsY; row++) {\r\n for (col = 0; col <= subdivisionsX; col++) {\r\n const position = new Vector3((col * width) / subdivisionsX - width / 2.0, 0, ((subdivisionsY - row) * height) / subdivisionsY - height / 2.0);\r\n const normal = new Vector3(0, 1.0, 0);\r\n\r\n positions.push(position.x, position.y, position.z);\r\n normals.push(normal.x, normal.y, normal.z);\r\n uvs.push(col / subdivisionsX, CompatibilityOptions.UseOpenGLOrientationForUV ? row / subdivisionsY : 1.0 - row / subdivisionsY);\r\n }\r\n }\r\n\r\n for (row = 0; row < subdivisionsY; row++) {\r\n for (col = 0; col < subdivisionsX; col++) {\r\n indices.push(col + 1 + (row + 1) * (subdivisionsX + 1));\r\n indices.push(col + 1 + row * (subdivisionsX + 1));\r\n indices.push(col + row * (subdivisionsX + 1));\r\n\r\n indices.push(col + (row + 1) * (subdivisionsX + 1));\r\n indices.push(col + 1 + (row + 1) * (subdivisionsX + 1));\r\n indices.push(col + row * (subdivisionsX + 1));\r\n }\r\n }\r\n\r\n // Result\r\n const vertexData = new VertexData();\r\n\r\n vertexData.indices = indices;\r\n vertexData.positions = positions;\r\n vertexData.normals = normals;\r\n vertexData.uvs = uvs;\r\n\r\n return vertexData;\r\n}\r\n\r\n/**\r\n * Creates the VertexData for a TiledGround by subdividing the ground into tiles\r\n * @param options an object used to set the following optional parameters for the Ground\r\n * @param options.xmin ground minimum X coordinate, default -1\r\n * @param options.zmin ground minimum Z coordinate, default -1\r\n * @param options.xmax ground maximum X coordinate, default 1\r\n * @param options.zmax ground maximum Z coordinate, default 1\r\n * @param options.subdivisions a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the ground width and height creating 'tiles', default {w: 6, h: 6}\r\n * @param options.subdivisions.w positive integer, default 6\r\n * @param options.subdivisions.h positive integer, default 6\r\n * @param options.precision a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the tile width and height, default {w: 2, h: 2}\r\n * @param options.precision.w positive integer, default 2\r\n * @param options.precision.h positive integer, default 2\r\n * @returns the VertexData of the TiledGround\r\n */\r\nexport function CreateTiledGroundVertexData(options: {\r\n xmin: number;\r\n zmin: number;\r\n xmax: number;\r\n zmax: number;\r\n subdivisions?: { w: number; h: number };\r\n precision?: { w: number; h: number };\r\n}): VertexData {\r\n const xmin = options.xmin !== undefined && options.xmin !== null ? options.xmin : -1.0;\r\n const zmin = options.zmin !== undefined && options.zmin !== null ? options.zmin : -1.0;\r\n const xmax = options.xmax !== undefined && options.xmax !== null ? options.xmax : 1.0;\r\n const zmax = options.zmax !== undefined && options.zmax !== null ? options.zmax : 1.0;\r\n const subdivisions = options.subdivisions || { w: 1, h: 1 };\r\n const precision = options.precision || { w: 1, h: 1 };\r\n\r\n const indices: number[] = [];\r\n const positions: number[] = [];\r\n const normals: number[] = [];\r\n const uvs: number[] = [];\r\n let row: number, col: number, tileRow: number, tileCol: number;\r\n\r\n subdivisions.h = subdivisions.h < 1 ? 1 : subdivisions.h;\r\n subdivisions.w = subdivisions.w < 1 ? 1 : subdivisions.w;\r\n precision.w = precision.w < 1 ? 1 : precision.w;\r\n precision.h = precision.h < 1 ? 1 : precision.h;\r\n\r\n const tileSize = {\r\n w: (xmax - xmin) / subdivisions.w,\r\n h: (zmax - zmin) / subdivisions.h,\r\n };\r\n\r\n function applyTile(xTileMin: number, zTileMin: number, xTileMax: number, zTileMax: number) {\r\n // Indices\r\n const base = positions.length / 3;\r\n const rowLength = precision.w + 1;\r\n for (row = 0; row < precision.h; row++) {\r\n for (col = 0; col < precision.w; col++) {\r\n const square = [base + col + row * rowLength, base + (col + 1) + row * rowLength, base + (col + 1) + (row + 1) * rowLength, base + col + (row + 1) * rowLength];\r\n\r\n indices.push(square[1]);\r\n indices.push(square[2]);\r\n indices.push(square[3]);\r\n indices.push(square[0]);\r\n indices.push(square[1]);\r\n indices.push(square[3]);\r\n }\r\n }\r\n\r\n // Position, normals and uvs\r\n const position = Vector3.Zero();\r\n const normal = new Vector3(0, 1.0, 0);\r\n for (row = 0; row <= precision.h; row++) {\r\n position.z = (row * (zTileMax - zTileMin)) / precision.h + zTileMin;\r\n for (col = 0; col <= precision.w; col++) {\r\n position.x = (col * (xTileMax - xTileMin)) / precision.w + xTileMin;\r\n position.y = 0;\r\n\r\n positions.push(position.x, position.y, position.z);\r\n normals.push(normal.x, normal.y, normal.z);\r\n uvs.push(col / precision.w, row / precision.h);\r\n }\r\n }\r\n }\r\n\r\n for (tileRow = 0; tileRow < subdivisions.h; tileRow++) {\r\n for (tileCol = 0; tileCol < subdivisions.w; tileCol++) {\r\n applyTile(xmin + tileCol * tileSize.w, zmin + tileRow * tileSize.h, xmin + (tileCol + 1) * tileSize.w, zmin + (tileRow + 1) * tileSize.h);\r\n }\r\n }\r\n\r\n // Result\r\n const vertexData = new VertexData();\r\n\r\n vertexData.indices = indices;\r\n vertexData.positions = positions;\r\n vertexData.normals = normals;\r\n vertexData.uvs = uvs;\r\n\r\n return vertexData;\r\n}\r\n\r\n/**\r\n * Creates the VertexData of the Ground designed from a heightmap\r\n * @param options an object used to set the following parameters for the Ground, required and provided by CreateGroundFromHeightMap\r\n * @param options.width the width (x direction) of the ground\r\n * @param options.height the height (z direction) of the ground\r\n * @param options.subdivisions the number of subdivisions per side\r\n * @param options.minHeight the minimum altitude on the ground, optional, default 0\r\n * @param options.maxHeight the maximum altitude on the ground, optional default 1\r\n * @param options.colorFilter the filter to apply to the image pixel colors to compute the height, optional Color3, default (0.3, 0.59, 0.11)\r\n * @param options.buffer the array holding the image color data\r\n * @param options.bufferWidth the width of image\r\n * @param options.bufferHeight the height of image\r\n * @param options.alphaFilter Remove any data where the alpha channel is below this value, defaults 0 (all data visible)\r\n * @param options.heightBuffer a array of floats where the height data can be saved, if its length is greater than zero.\r\n * @returns the VertexData of the Ground designed from a heightmap\r\n */\r\nexport function CreateGroundFromHeightMapVertexData(options: {\r\n width: number;\r\n height: number;\r\n subdivisions: number;\r\n minHeight: number;\r\n maxHeight: number;\r\n colorFilter: Color3;\r\n buffer: Uint8Array;\r\n bufferWidth: number;\r\n bufferHeight: number;\r\n alphaFilter: number;\r\n heightBuffer?: Float32Array;\r\n}): VertexData {\r\n const indices = [];\r\n const positions = [];\r\n const normals = [];\r\n const uvs = [];\r\n let row, col;\r\n const filter = options.colorFilter || new Color3(0.3, 0.59, 0.11);\r\n const alphaFilter = options.alphaFilter || 0.0;\r\n let invert = false;\r\n\r\n if (options.minHeight > options.maxHeight) {\r\n invert = true;\r\n const temp = options.maxHeight;\r\n options.maxHeight = options.minHeight;\r\n options.minHeight = temp;\r\n }\r\n\r\n // Vertices\r\n for (row = 0; row <= options.subdivisions; row++) {\r\n for (col = 0; col <= options.subdivisions; col++) {\r\n const position = new Vector3(\r\n (col * options.width) / options.subdivisions - options.width / 2.0,\r\n 0,\r\n ((options.subdivisions - row) * options.height) / options.subdivisions - options.height / 2.0\r\n );\r\n\r\n // Compute height\r\n const heightMapX = (((position.x + options.width / 2) / options.width) * (options.bufferWidth - 1)) | 0;\r\n const heightMapY = ((1.0 - (position.z + options.height / 2) / options.height) * (options.bufferHeight - 1)) | 0;\r\n const pos = (heightMapX + heightMapY * options.bufferWidth) * 4;\r\n let r = options.buffer[pos] / 255.0;\r\n let g = options.buffer[pos + 1] / 255.0;\r\n let b = options.buffer[pos + 2] / 255.0;\r\n const a = options.buffer[pos + 3] / 255.0;\r\n\r\n if (invert) {\r\n r = 1.0 - r;\r\n g = 1.0 - g;\r\n b = 1.0 - b;\r\n }\r\n\r\n const gradient = r * filter.r + g * filter.g + b * filter.b;\r\n\r\n // If our alpha channel is not within our filter then we will assign a 'special' height\r\n // Then when building the indices, we will ignore any vertex that is using the special height\r\n if (a >= alphaFilter) {\r\n position.y = options.minHeight + (options.maxHeight - options.minHeight) * gradient;\r\n } else {\r\n position.y = options.minHeight - Epsilon; // We can't have a height below minHeight, normally.\r\n }\r\n if (options.heightBuffer) {\r\n // set the height buffer information in row major order.\r\n options.heightBuffer[row * (options.subdivisions + 1) + col] = position.y;\r\n }\r\n\r\n // Add vertex\r\n positions.push(position.x, position.y, position.z);\r\n normals.push(0, 0, 0);\r\n uvs.push(col / options.subdivisions, 1.0 - row / options.subdivisions);\r\n }\r\n }\r\n\r\n // Indices\r\n for (row = 0; row < options.subdivisions; row++) {\r\n for (col = 0; col < options.subdivisions; col++) {\r\n // Calculate Indices\r\n const idx1 = col + 1 + (row + 1) * (options.subdivisions + 1);\r\n const idx2 = col + 1 + row * (options.subdivisions + 1);\r\n const idx3 = col + row * (options.subdivisions + 1);\r\n const idx4 = col + (row + 1) * (options.subdivisions + 1);\r\n\r\n // Check that all indices are visible (based on our special height)\r\n // Only display the vertex if all Indices are visible\r\n // Positions are stored x,y,z for each vertex, hence the * 3 and + 1 for height\r\n const isVisibleIdx1 = positions[idx1 * 3 + 1] >= options.minHeight;\r\n const isVisibleIdx2 = positions[idx2 * 3 + 1] >= options.minHeight;\r\n const isVisibleIdx3 = positions[idx3 * 3 + 1] >= options.minHeight;\r\n if (isVisibleIdx1 && isVisibleIdx2 && isVisibleIdx3) {\r\n indices.push(idx1);\r\n indices.push(idx2);\r\n indices.push(idx3);\r\n }\r\n\r\n const isVisibleIdx4 = positions[idx4 * 3 + 1] >= options.minHeight;\r\n if (isVisibleIdx4 && isVisibleIdx1 && isVisibleIdx3) {\r\n indices.push(idx4);\r\n indices.push(idx1);\r\n indices.push(idx3);\r\n }\r\n }\r\n }\r\n\r\n // Normals\r\n VertexData.ComputeNormals(positions, indices, normals);\r\n\r\n // Result\r\n const vertexData = new VertexData();\r\n\r\n vertexData.indices = indices;\r\n vertexData.positions = positions;\r\n vertexData.normals = normals;\r\n vertexData.uvs = uvs;\r\n\r\n return vertexData;\r\n}\r\n\r\n/**\r\n * Creates a ground mesh\r\n * @param name defines the name of the mesh\r\n * @param options defines the options used to create the mesh\r\n * @param options.width set the width size (float, default 1)\r\n * @param options.height set the height size (float, default 1)\r\n * @param options.subdivisions sets the number of subdivision per side (default 1)\r\n * @param options.subdivisionsX sets the number of subdivision on the X axis (overrides subdivisions)\r\n * @param options.subdivisionsY sets the number of subdivision on the Y axis (overrides subdivisions)\r\n * @param options.updatable defines if the mesh must be flagged as updatable (default false)\r\n * @param scene defines the hosting scene\r\n * @returns the ground mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#ground\r\n */\r\nexport function CreateGround(\r\n name: string,\r\n options: { width?: number; height?: number; subdivisions?: number; subdivisionsX?: number; subdivisionsY?: number; updatable?: boolean } = {},\r\n scene?: Scene\r\n): GroundMesh {\r\n const ground = new GroundMesh(name, scene);\r\n ground._setReady(false);\r\n ground._subdivisionsX = options.subdivisionsX || options.subdivisions || 1;\r\n ground._subdivisionsY = options.subdivisionsY || options.subdivisions || 1;\r\n ground._width = options.width || 1;\r\n ground._height = options.height || 1;\r\n ground._maxX = ground._width / 2;\r\n ground._maxZ = ground._height / 2;\r\n ground._minX = -ground._maxX;\r\n ground._minZ = -ground._maxZ;\r\n\r\n const vertexData = CreateGroundVertexData(options);\r\n\r\n vertexData.applyToMesh(ground, options.updatable);\r\n\r\n ground._setReady(true);\r\n\r\n return ground;\r\n}\r\n\r\n/**\r\n * Creates a tiled ground mesh\r\n * @param name defines the name of the mesh\r\n * @param options defines the options used to create the mesh\r\n * @param options.xmin ground minimum X coordinate (float, default -1)\r\n * @param options.zmin ground minimum Z coordinate (float, default -1)\r\n * @param options.xmax ground maximum X coordinate (float, default 1)\r\n * @param options.zmax ground maximum Z coordinate (float, default 1)\r\n * @param options.subdivisions a javascript object `{w: positive integer, h: positive integer}` (default `{w: 6, h: 6}`). `w` and `h` are the numbers of subdivisions on the ground width and height. Each subdivision is called a tile\r\n * @param options.subdivisions.w positive integer, default 6\r\n * @param options.subdivisions.h positive integer, default 6\r\n * @param options.precision a javascript object `{w: positive integer, h: positive integer}` (default `{w: 2, h: 2}`). `w` and `h` are the numbers of subdivisions on the ground width and height of each tile\r\n * @param options.precision.w positive integer, default 2\r\n * @param options.precision.h positive integer, default 2\r\n * @param options.updatable boolean, default false, true if the mesh must be flagged as updatable\r\n * @param scene defines the hosting scene\r\n * @returns the tiled ground mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#tiled-ground\r\n */\r\nexport function CreateTiledGround(\r\n name: string,\r\n options: { xmin: number; zmin: number; xmax: number; zmax: number; subdivisions?: { w: number; h: number }; precision?: { w: number; h: number }; updatable?: boolean },\r\n scene: Nullable = null\r\n): Mesh {\r\n const tiledGround = new Mesh(name, scene);\r\n\r\n const vertexData = CreateTiledGroundVertexData(options);\r\n\r\n vertexData.applyToMesh(tiledGround, options.updatable);\r\n\r\n return tiledGround;\r\n}\r\n\r\n/**\r\n * Creates a ground mesh from a height map. The height map download can take some frames,\r\n * so the mesh is not immediately ready. To wait for the mesh to be completely built,\r\n * you should use the `onReady` callback option.\r\n * @param name defines the name of the mesh\r\n * @param url sets the URL of the height map image resource.\r\n * @param options defines the options used to create the mesh\r\n * @param options.width sets the ground width size (positive float, default 10)\r\n * @param options.height sets the ground height size (positive float, default 10)\r\n * @param options.subdivisions sets the number of subdivision per side (positive integer, default 1)\r\n * @param options.minHeight is the minimum altitude on the ground (float, default 0)\r\n * @param options.maxHeight is the maximum altitude on the ground (float, default 1)\r\n * @param options.colorFilter is the filter to apply to the image pixel colors to compute the height (optional Color3, default (0.3, 0.59, 0.11) )\r\n * @param options.alphaFilter will filter any data where the alpha channel is below this value, defaults 0 (all data visible)\r\n * @param options.updatable defines if the mesh must be flagged as updatable\r\n * @param options.onReady is a javascript callback function that will be called once the mesh is just built (the height map download can last some time)\r\n * @param options.onError is a javascript callback function that will be called if there is an error\r\n * @param options.passHeightBufferInCallback a boolean that indicates if the calculated height data will be passed in the onReady callback. Useful if you need the height data for physics, for example.\r\n * @param scene defines the hosting scene\r\n * @returns the ground mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/height_map\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#ground-from-a-height-map\r\n */\r\nexport function CreateGroundFromHeightMap(\r\n name: string,\r\n url: string | { data: Uint8Array; width: number; height: number },\r\n options: {\r\n width?: number;\r\n height?: number;\r\n subdivisions?: number;\r\n minHeight?: number;\r\n maxHeight?: number;\r\n colorFilter?: Color3;\r\n alphaFilter?: number;\r\n updatable?: boolean;\r\n onReady?: (mesh: GroundMesh, heightBuffer?: Float32Array) => void;\r\n onError?: (message?: string, exception?: any) => void;\r\n passHeightBufferInCallback?: boolean;\r\n } = {},\r\n scene: Nullable = null\r\n): GroundMesh {\r\n const width = options.width || 10.0;\r\n const height = options.height || 10.0;\r\n const subdivisions = options.subdivisions || 1 | 0;\r\n const minHeight = options.minHeight || 0.0;\r\n const maxHeight = options.maxHeight || 1.0;\r\n const filter = options.colorFilter || new Color3(0.3, 0.59, 0.11);\r\n const alphaFilter = options.alphaFilter || 0.0;\r\n const updatable = options.updatable;\r\n const onReady = options.onReady;\r\n\r\n scene = scene || EngineStore.LastCreatedScene!;\r\n\r\n const ground = new GroundMesh(name, scene);\r\n ground._subdivisionsX = subdivisions;\r\n ground._subdivisionsY = subdivisions;\r\n ground._width = width;\r\n ground._height = height;\r\n ground._maxX = ground._width / 2.0;\r\n ground._maxZ = ground._height / 2.0;\r\n ground._minX = -ground._maxX;\r\n ground._minZ = -ground._maxZ;\r\n\r\n ground._setReady(false);\r\n\r\n let heightBuffer: Float32Array;\r\n if (options.passHeightBufferInCallback) {\r\n heightBuffer = new Float32Array((subdivisions + 1) * (subdivisions + 1));\r\n }\r\n\r\n const onBufferLoaded = (buffer: Uint8Array, bufferWidth: number, bufferHeight: number) => {\r\n const vertexData = CreateGroundFromHeightMapVertexData({\r\n width: width,\r\n height: height,\r\n subdivisions: subdivisions,\r\n minHeight: minHeight,\r\n maxHeight: maxHeight,\r\n colorFilter: filter,\r\n buffer: buffer,\r\n bufferWidth: bufferWidth,\r\n bufferHeight: bufferHeight,\r\n alphaFilter: alphaFilter,\r\n heightBuffer,\r\n });\r\n\r\n vertexData.applyToMesh(ground, updatable);\r\n\r\n //execute ready callback, if set\r\n if (onReady) {\r\n onReady(ground, heightBuffer);\r\n }\r\n\r\n ground._setReady(true);\r\n };\r\n\r\n if (typeof url === \"string\") {\r\n const onload = (img: HTMLImageElement | ImageBitmap) => {\r\n const bufferWidth = img.width;\r\n const bufferHeight = img.height;\r\n\r\n if (scene!.isDisposed) {\r\n return;\r\n }\r\n\r\n const buffer = scene?.getEngine().resizeImageBitmap(img, bufferWidth, bufferHeight);\r\n\r\n onBufferLoaded(buffer, bufferWidth, bufferHeight);\r\n };\r\n\r\n Tools.LoadImage(url, onload, options.onError ? options.onError : () => {}, scene.offlineProvider);\r\n } else {\r\n onBufferLoaded(url.data, url.width, url.height);\r\n }\r\n\r\n return ground;\r\n}\r\n/**\r\n * Class containing static functions to help procedurally build meshes\r\n * @deprecated use the functions directly from the module\r\n */\r\nexport const GroundBuilder = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CreateGround,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CreateGroundFromHeightMap,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CreateTiledGround,\r\n};\r\n\r\nVertexData.CreateGround = CreateGroundVertexData;\r\nVertexData.CreateTiledGround = CreateTiledGroundVertexData;\r\nVertexData.CreateGroundFromHeightMap = CreateGroundFromHeightMapVertexData;\r\n\r\nMesh.CreateGround = (name: string, width: number, height: number, subdivisions: number, scene?: Scene, updatable?: boolean): Mesh => {\r\n const options = {\r\n width,\r\n height,\r\n subdivisions,\r\n updatable,\r\n };\r\n\r\n return CreateGround(name, options, scene);\r\n};\r\n\r\nMesh.CreateTiledGround = (\r\n name: string,\r\n xmin: number,\r\n zmin: number,\r\n xmax: number,\r\n zmax: number,\r\n subdivisions: { w: number; h: number },\r\n precision: { w: number; h: number },\r\n scene: Scene,\r\n updatable?: boolean\r\n): Mesh => {\r\n const options = {\r\n xmin,\r\n zmin,\r\n xmax,\r\n zmax,\r\n subdivisions,\r\n precision,\r\n updatable,\r\n };\r\n\r\n return CreateTiledGround(name, options, scene);\r\n};\r\n\r\nMesh.CreateGroundFromHeightMap = (\r\n name: string,\r\n url: string,\r\n width: number,\r\n height: number,\r\n subdivisions: number,\r\n minHeight: number,\r\n maxHeight: number,\r\n scene: Scene,\r\n updatable?: boolean,\r\n onReady?: (mesh: GroundMesh) => void,\r\n alphaFilter?: number\r\n): GroundMesh => {\r\n const options = {\r\n width,\r\n height,\r\n subdivisions,\r\n minHeight,\r\n maxHeight,\r\n updatable,\r\n onReady,\r\n alphaFilter,\r\n };\r\n\r\n return CreateGroundFromHeightMap(name, url, options, scene);\r\n};\r\n", "import type { Nullable } from \"../../types\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector4 } from \"../../Maths/math.vector\";\r\nimport { Color4 } from \"../../Maths/math.color\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport { CompatibilityOptions } from \"../../Compat/compatibilityOptions\";\r\nimport { CreateGroundVertexData } from \"./groundBuilder\";\r\n\r\n/**\r\n * Creates the VertexData for a box\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * size sets the width, height and depth of the box to the value of size, optional default 1\r\n * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size\r\n * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size\r\n * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size\r\n * * faceUV an array of 6 Vector4 elements used to set different images to each box side\r\n * * faceColors an array of 6 Color3 elements used to set different colors to each box side\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the box\r\n */\r\nexport function CreateBoxVertexData(options: {\r\n size?: number;\r\n width?: number;\r\n height?: number;\r\n depth?: number;\r\n faceUV?: Vector4[];\r\n faceColors?: Color4[];\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n wrap?: boolean;\r\n topBaseAt?: number;\r\n bottomBaseAt?: number;\r\n}): VertexData {\r\n const nbFaces = 6;\r\n let indices = [0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23];\r\n const normals = [\r\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0,\r\n 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0,\r\n ];\r\n const uvs = [];\r\n let positions = [];\r\n const width = options.width || options.size || 1;\r\n const height = options.height || options.size || 1;\r\n const depth = options.depth || options.size || 1;\r\n const wrap = options.wrap || false;\r\n let topBaseAt = options.topBaseAt === void 0 ? 1 : options.topBaseAt;\r\n let bottomBaseAt = options.bottomBaseAt === void 0 ? 0 : options.bottomBaseAt;\r\n topBaseAt = (topBaseAt + 4) % 4; // places values as 0 to 3\r\n bottomBaseAt = (bottomBaseAt + 4) % 4; // places values as 0 to 3\r\n const topOrder = [2, 0, 3, 1];\r\n const bottomOrder = [2, 0, 1, 3];\r\n let topIndex = topOrder[topBaseAt];\r\n let bottomIndex = bottomOrder[bottomBaseAt];\r\n let basePositions = [\r\n 1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1,\r\n 1, 1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1,\r\n ];\r\n if (wrap) {\r\n indices = [2, 3, 0, 2, 0, 1, 4, 5, 6, 4, 6, 7, 9, 10, 11, 9, 11, 8, 12, 14, 15, 12, 13, 14];\r\n basePositions = [\r\n -1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1,\r\n ];\r\n let topFaceBase: any = [\r\n [1, 1, 1],\r\n [-1, 1, 1],\r\n [-1, 1, -1],\r\n [1, 1, -1],\r\n ];\r\n let bottomFaceBase: any = [\r\n [-1, -1, 1],\r\n [1, -1, 1],\r\n [1, -1, -1],\r\n [-1, -1, -1],\r\n ];\r\n const topFaceOrder: any = [17, 18, 19, 16];\r\n const bottomFaceOrder: any = [22, 23, 20, 21];\r\n while (topIndex > 0) {\r\n topFaceBase.unshift(topFaceBase.pop());\r\n topFaceOrder.unshift(topFaceOrder.pop());\r\n topIndex--;\r\n }\r\n while (bottomIndex > 0) {\r\n bottomFaceBase.unshift(bottomFaceBase.pop());\r\n bottomFaceOrder.unshift(bottomFaceOrder.pop());\r\n bottomIndex--;\r\n }\r\n topFaceBase = topFaceBase.flat();\r\n bottomFaceBase = bottomFaceBase.flat();\r\n basePositions = basePositions.concat(topFaceBase).concat(bottomFaceBase);\r\n indices.push(topFaceOrder[0], topFaceOrder[2], topFaceOrder[3], topFaceOrder[0], topFaceOrder[1], topFaceOrder[2]);\r\n indices.push(bottomFaceOrder[0], bottomFaceOrder[2], bottomFaceOrder[3], bottomFaceOrder[0], bottomFaceOrder[1], bottomFaceOrder[2]);\r\n }\r\n const scaleArray = [width / 2, height / 2, depth / 2];\r\n positions = basePositions.reduce((accumulator: Array, currentValue, currentIndex) => accumulator.concat(currentValue * scaleArray[currentIndex % 3]), []);\r\n\r\n const sideOrientation = options.sideOrientation === 0 ? 0 : options.sideOrientation || VertexData.DEFAULTSIDE;\r\n\r\n const faceUV: Vector4[] = options.faceUV || new Array(6);\r\n const faceColors = options.faceColors;\r\n const colors = [];\r\n\r\n // default face colors and UV if undefined\r\n for (let f = 0; f < 6; f++) {\r\n if (faceUV[f] === undefined) {\r\n faceUV[f] = new Vector4(0, 0, 1, 1);\r\n }\r\n if (faceColors && faceColors[f] === undefined) {\r\n faceColors[f] = new Color4(1, 1, 1, 1);\r\n }\r\n }\r\n\r\n // Create each face in turn.\r\n for (let index = 0; index < nbFaces; index++) {\r\n uvs.push(faceUV[index].z, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 - faceUV[index].w : faceUV[index].w);\r\n uvs.push(faceUV[index].x, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 - faceUV[index].w : faceUV[index].w);\r\n uvs.push(faceUV[index].x, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 - faceUV[index].y : faceUV[index].y);\r\n uvs.push(faceUV[index].z, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 - faceUV[index].y : faceUV[index].y);\r\n if (faceColors) {\r\n for (let c = 0; c < 4; c++) {\r\n colors.push(faceColors[index].r, faceColors[index].g, faceColors[index].b, faceColors[index].a);\r\n }\r\n }\r\n }\r\n\r\n // sides\r\n VertexData._ComputeSides(sideOrientation, positions, indices, normals, uvs, options.frontUVs, options.backUVs);\r\n\r\n // Result\r\n const vertexData = new VertexData();\r\n\r\n vertexData.indices = indices;\r\n vertexData.positions = positions;\r\n vertexData.normals = normals;\r\n vertexData.uvs = uvs;\r\n\r\n if (faceColors) {\r\n const totalColors = sideOrientation === VertexData.DOUBLESIDE ? colors.concat(colors) : colors;\r\n vertexData.colors = totalColors;\r\n }\r\n\r\n return vertexData;\r\n}\r\n\r\n/**\r\n * Creates the VertexData for a segmented box\r\n * @param options an object used to set the following optional parameters for the box, required but can be empty\r\n * * size sets the width, height and depth of the box to the value of size, optional default 1\r\n * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size\r\n * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size\r\n * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size\r\n * * segments sets the number of segments on the all axis (1 by default)\r\n * * widthSegments sets the number of segments on the x axis (1 by default)\r\n * * heightSegments sets the number of segments on the y axis (1 by default)\r\n * * depthSegments sets the number of segments on the z axis (1 by default)\r\n * @returns the VertexData of the box\r\n */\r\nexport function CreateSegmentedBoxVertexData(options: {\r\n size?: number;\r\n width?: number;\r\n height?: number;\r\n depth?: number;\r\n segments?: number;\r\n widthSegments?: number;\r\n heightSegments?: number;\r\n depthSegments?: number;\r\n}): VertexData {\r\n const width = options.width || options.size || 1;\r\n const height = options.height || options.size || 1;\r\n const depth = options.depth || options.size || 1;\r\n const widthSegments = (options.widthSegments || options.segments || 1) | 0;\r\n const heightSegments = (options.heightSegments || options.segments || 1) | 0;\r\n const depthSegments = (options.depthSegments || options.segments || 1) | 0;\r\n const rotationMatrix = new Matrix();\r\n const translationMatrix = new Matrix();\r\n const transformMatrix = new Matrix();\r\n\r\n const bottomPlane = CreateGroundVertexData({ width: width, height: depth, subdivisionsX: widthSegments, subdivisionsY: depthSegments });\r\n Matrix.TranslationToRef(0, -height / 2, 0, translationMatrix);\r\n Matrix.RotationZToRef(Math.PI, rotationMatrix);\r\n rotationMatrix.multiplyToRef(translationMatrix, transformMatrix);\r\n bottomPlane.transform(transformMatrix);\r\n\r\n const topPlane = CreateGroundVertexData({ width: width, height: depth, subdivisionsX: widthSegments, subdivisionsY: depthSegments });\r\n Matrix.TranslationToRef(0, height / 2, 0, transformMatrix);\r\n topPlane.transform(transformMatrix);\r\n\r\n const negXPlane = CreateGroundVertexData({ width: height, height: depth, subdivisionsX: heightSegments, subdivisionsY: depthSegments });\r\n Matrix.TranslationToRef(-width / 2, 0, 0, translationMatrix);\r\n Matrix.RotationZToRef(Math.PI / 2, rotationMatrix);\r\n rotationMatrix.multiplyToRef(translationMatrix, transformMatrix);\r\n negXPlane.transform(transformMatrix);\r\n\r\n const posXPlane = CreateGroundVertexData({ width: height, height: depth, subdivisionsX: heightSegments, subdivisionsY: depthSegments });\r\n Matrix.TranslationToRef(width / 2, 0, 0, translationMatrix);\r\n Matrix.RotationZToRef(-Math.PI / 2, rotationMatrix);\r\n rotationMatrix.multiplyToRef(translationMatrix, transformMatrix);\r\n posXPlane.transform(transformMatrix);\r\n\r\n const negZPlane = CreateGroundVertexData({ width: width, height: height, subdivisionsX: widthSegments, subdivisionsY: heightSegments });\r\n Matrix.TranslationToRef(0, 0, -depth / 2, translationMatrix);\r\n Matrix.RotationXToRef(-Math.PI / 2, rotationMatrix);\r\n rotationMatrix.multiplyToRef(translationMatrix, transformMatrix);\r\n negZPlane.transform(transformMatrix);\r\n\r\n const posZPlane = CreateGroundVertexData({ width: width, height: height, subdivisionsX: widthSegments, subdivisionsY: heightSegments });\r\n Matrix.TranslationToRef(0, 0, depth / 2, translationMatrix);\r\n Matrix.RotationXToRef(Math.PI / 2, rotationMatrix);\r\n rotationMatrix.multiplyToRef(translationMatrix, transformMatrix);\r\n posZPlane.transform(transformMatrix);\r\n\r\n // Result\r\n bottomPlane.merge([topPlane, posXPlane, negXPlane, negZPlane, posZPlane], true);\r\n\r\n return bottomPlane;\r\n}\r\n\r\n/**\r\n * Creates a box mesh\r\n * * The parameter `size` sets the size (float) of each box side (default 1)\r\n * * You can set some different box dimensions by using the parameters `width`, `height` and `depth` (all by default have the same value of `size`)\r\n * * You can set different colors and different images to each box side by using the parameters `faceColors` (an array of 6 Color3 elements) and `faceUV` (an array of 6 Vector4 elements)\r\n * * Please read this tutorial : https://doc.babylonjs.com/features/featuresDeepDive/materials/using/texturePerBoxFace\r\n * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE\r\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\r\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#box\r\n * @param name defines the name of the mesh\r\n * @param options defines the options used to create the mesh\r\n * @param scene defines the hosting scene\r\n * @returns the box mesh\r\n */\r\nexport function CreateBox(\r\n name: string,\r\n options: {\r\n size?: number;\r\n width?: number;\r\n height?: number;\r\n depth?: number;\r\n faceUV?: Vector4[];\r\n faceColors?: Color4[];\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n wrap?: boolean;\r\n topBaseAt?: number;\r\n bottomBaseAt?: number;\r\n updatable?: boolean;\r\n } = {},\r\n scene: Nullable = null\r\n): Mesh {\r\n const box = new Mesh(name, scene);\r\n\r\n options.sideOrientation = Mesh._GetDefaultSideOrientation(options.sideOrientation);\r\n box._originalBuilderSideOrientation = options.sideOrientation;\r\n\r\n const vertexData = CreateBoxVertexData(options);\r\n\r\n vertexData.applyToMesh(box, options.updatable);\r\n\r\n return box;\r\n}\r\n\r\n/**\r\n * Class containing static functions to help procedurally build meshes\r\n * @deprecated please use CreateBox directly\r\n */\r\nexport const BoxBuilder = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CreateBox,\r\n};\r\n\r\n// Side effects\r\nVertexData.CreateBox = CreateBoxVertexData;\r\n\r\nMesh.CreateBox = (name: string, size: number, scene: Nullable = null, updatable?: boolean, sideOrientation?: number): Mesh => {\r\n const options = {\r\n size,\r\n sideOrientation,\r\n updatable,\r\n };\r\n\r\n return CreateBox(name, options, scene);\r\n};\r\n", "/**\r\n * Manages the defines for the Material\r\n */\r\nexport class MaterialDefines {\r\n /** @internal */\r\n protected _keys: string[] = [];\r\n private _isDirty = true;\r\n /** @internal */\r\n public _renderId: number;\r\n\r\n /** @internal */\r\n public _areLightsDirty = true;\r\n /** @internal */\r\n public _areLightsDisposed = false;\r\n /** @internal */\r\n public _areAttributesDirty = true;\r\n /** @internal */\r\n public _areTexturesDirty = true;\r\n /** @internal */\r\n public _areFresnelDirty = true;\r\n /** @internal */\r\n public _areMiscDirty = true;\r\n /** @internal */\r\n public _arePrePassDirty = true;\r\n /** @internal */\r\n public _areImageProcessingDirty = true;\r\n\r\n /** @internal */\r\n public _normals = false;\r\n /** @internal */\r\n public _uvs = false;\r\n\r\n /** @internal */\r\n public _needNormals = false;\r\n /** @internal */\r\n public _needUVs = false;\r\n\r\n protected _externalProperties?: { [name: string]: { type: string; default: any } };\r\n\r\n [id: string]: any;\r\n\r\n /**\r\n * Creates a new instance\r\n * @param externalProperties list of external properties to inject into the object\r\n */\r\n constructor(externalProperties?: { [name: string]: { type: string; default: any } }) {\r\n this._externalProperties = externalProperties;\r\n\r\n // Initialize External Properties\r\n if (externalProperties) {\r\n for (const prop in externalProperties) {\r\n if (Object.prototype.hasOwnProperty.call(externalProperties, prop)) {\r\n this._setDefaultValue(prop);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Specifies if the material needs to be re-calculated\r\n */\r\n public get isDirty(): boolean {\r\n return this._isDirty;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate that it has been re-calculated\r\n */\r\n public markAsProcessed() {\r\n this._isDirty = false;\r\n this._areAttributesDirty = false;\r\n this._areTexturesDirty = false;\r\n this._areFresnelDirty = false;\r\n this._areLightsDirty = false;\r\n this._areLightsDisposed = false;\r\n this._areMiscDirty = false;\r\n this._arePrePassDirty = false;\r\n this._areImageProcessingDirty = false;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate that it needs to be re-calculated\r\n */\r\n public markAsUnprocessed() {\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate all of its defines need to be re-calculated\r\n */\r\n public markAllAsDirty() {\r\n this._areTexturesDirty = true;\r\n this._areAttributesDirty = true;\r\n this._areLightsDirty = true;\r\n this._areFresnelDirty = true;\r\n this._areMiscDirty = true;\r\n this._arePrePassDirty = false;\r\n this._areImageProcessingDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate that image processing needs to be re-calculated\r\n */\r\n public markAsImageProcessingDirty() {\r\n this._areImageProcessingDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the material to indicate the lights need to be re-calculated\r\n * @param disposed Defines whether the light is dirty due to dispose or not\r\n */\r\n public markAsLightDirty(disposed = false) {\r\n this._areLightsDirty = true;\r\n this._areLightsDisposed = this._areLightsDisposed || disposed;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the attribute state as changed\r\n */\r\n public markAsAttributesDirty() {\r\n this._areAttributesDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the texture state as changed\r\n */\r\n public markAsTexturesDirty() {\r\n this._areTexturesDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the fresnel state as changed\r\n */\r\n public markAsFresnelDirty() {\r\n this._areFresnelDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the misc state as changed\r\n */\r\n public markAsMiscDirty() {\r\n this._areMiscDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Marks the prepass state as changed\r\n */\r\n public markAsPrePassDirty() {\r\n this._arePrePassDirty = true;\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Rebuilds the material defines\r\n */\r\n public rebuild() {\r\n this._keys.length = 0;\r\n\r\n for (const key of Object.keys(this)) {\r\n if (key[0] === \"_\") {\r\n continue;\r\n }\r\n\r\n this._keys.push(key);\r\n }\r\n\r\n if (this._externalProperties) {\r\n for (const name in this._externalProperties) {\r\n if (this._keys.indexOf(name) === -1) {\r\n this._keys.push(name);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Specifies if two material defines are equal\r\n * @param other - A material define instance to compare to\r\n * @returns - Boolean indicating if the material defines are equal (true) or not (false)\r\n */\r\n public isEqual(other: MaterialDefines): boolean {\r\n if (this._keys.length !== other._keys.length) {\r\n return false;\r\n }\r\n\r\n for (let index = 0; index < this._keys.length; index++) {\r\n const prop = this._keys[index];\r\n\r\n if ((this)[prop] !== (other)[prop]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Clones this instance's defines to another instance\r\n * @param other - material defines to clone values to\r\n */\r\n public cloneTo(other: MaterialDefines): void {\r\n if (this._keys.length !== other._keys.length) {\r\n other._keys = this._keys.slice(0);\r\n }\r\n\r\n for (let index = 0; index < this._keys.length; index++) {\r\n const prop = this._keys[index];\r\n\r\n (other)[prop] = (this)[prop];\r\n }\r\n }\r\n\r\n /**\r\n * Resets the material define values\r\n */\r\n public reset(): void {\r\n this._keys.forEach((prop) => this._setDefaultValue(prop));\r\n }\r\n\r\n private _setDefaultValue(prop: string): void {\r\n const type = this._externalProperties?.[prop]?.type ?? typeof (this)[prop];\r\n const defValue = this._externalProperties?.[prop]?.default;\r\n\r\n switch (type) {\r\n case \"number\":\r\n (this)[prop] = defValue ?? 0;\r\n break;\r\n case \"string\":\r\n (this)[prop] = defValue ?? \"\";\r\n break;\r\n default:\r\n (this)[prop] = defValue ?? false;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Converts the material define values to a string\r\n * @returns - String of material define information\r\n */\r\n public toString(): string {\r\n let result = \"\";\r\n for (let index = 0; index < this._keys.length; index++) {\r\n const prop = this._keys[index];\r\n const value = (this)[prop];\r\n const type = typeof value;\r\n\r\n switch (type) {\r\n case \"number\":\r\n case \"string\":\r\n result += \"#define \" + prop + \" \" + value + \"\\n\";\r\n break;\r\n default:\r\n if (value) {\r\n result += \"#define \" + prop + \"\\n\";\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Matrix } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { Material } from \"../Materials/material\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\n/**\r\n * Base class of materials working in push mode in babylon JS\r\n * @internal\r\n */\r\nexport class PushMaterial extends Material {\r\n protected _activeEffect?: Effect;\r\n\r\n protected _normalMatrix: Matrix = new Matrix();\r\n\r\n constructor(name: string, scene?: Scene, storeEffectOnSubMeshes = true) {\r\n super(name, scene);\r\n this._storeEffectOnSubMeshes = storeEffectOnSubMeshes;\r\n }\r\n\r\n public getEffect(): Effect {\r\n return this._storeEffectOnSubMeshes ? this._activeEffect! : super.getEffect()!;\r\n }\r\n\r\n public isReady(mesh?: AbstractMesh, useInstances?: boolean): boolean {\r\n if (!mesh) {\r\n return false;\r\n }\r\n\r\n if (!this._storeEffectOnSubMeshes) {\r\n return true;\r\n }\r\n\r\n if (!mesh.subMeshes || mesh.subMeshes.length === 0) {\r\n return true;\r\n }\r\n\r\n return this.isReadyForSubMesh(mesh, mesh.subMeshes[0], useInstances);\r\n }\r\n\r\n protected _isReadyForSubMesh(subMesh: SubMesh) {\r\n const defines = subMesh.materialDefines;\r\n if (!this.checkReadyOnEveryCall && subMesh.effect && defines) {\r\n if (defines._renderId === this.getScene().getRenderId()) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Binds the given world matrix to the active effect\r\n *\r\n * @param world the matrix to bind\r\n */\r\n public bindOnlyWorldMatrix(world: Matrix): void {\r\n this._activeEffect!.setMatrix(\"world\", world);\r\n }\r\n\r\n /**\r\n * Binds the given normal matrix to the active effect\r\n *\r\n * @param normalMatrix the matrix to bind\r\n */\r\n public bindOnlyNormalMatrix(normalMatrix: Matrix): void {\r\n this._activeEffect!.setMatrix(\"normalMatrix\", normalMatrix);\r\n }\r\n\r\n public bind(world: Matrix, mesh?: Mesh): void {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n this.bindForSubMesh(world, mesh, mesh.subMeshes[0]);\r\n }\r\n\r\n protected _afterBind(mesh?: Mesh, effect: Nullable = null, subMesh?: SubMesh): void {\r\n super._afterBind(mesh, effect, subMesh);\r\n this.getScene()._cachedEffect = effect;\r\n if (subMesh) {\r\n subMesh._drawWrapper._forceRebindOnNextCall = false;\r\n } else {\r\n this._drawWrapper._forceRebindOnNextCall = false;\r\n }\r\n }\r\n\r\n protected _mustRebind(scene: Scene, effect: Effect, subMesh: SubMesh, visibility = 1): boolean {\r\n return subMesh._drawWrapper._forceRebindOnNextCall || scene.isCachedMaterialInvalid(this, effect, visibility);\r\n }\r\n\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean) {\r\n this._activeEffect = undefined;\r\n super.dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh);\r\n }\r\n}\r\n", "import { Engine } from \"../Engines/engine\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\n/**\r\n * This groups all the flags used to control the materials channel.\r\n */\r\nexport class MaterialFlags {\r\n // Flags used to enable or disable a type of texture for all Standard Materials\r\n private static _DiffuseTextureEnabled = true;\r\n /**\r\n * Are diffuse textures enabled in the application.\r\n */\r\n public static get DiffuseTextureEnabled(): boolean {\r\n return this._DiffuseTextureEnabled;\r\n }\r\n public static set DiffuseTextureEnabled(value: boolean) {\r\n if (this._DiffuseTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._DiffuseTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _DetailTextureEnabled = true;\r\n /**\r\n * Are detail textures enabled in the application.\r\n */\r\n public static get DetailTextureEnabled(): boolean {\r\n return this._DetailTextureEnabled;\r\n }\r\n public static set DetailTextureEnabled(value: boolean) {\r\n if (this._DetailTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._DetailTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _DecalMapEnabled = true;\r\n /**\r\n * Are decal maps enabled in the application.\r\n */\r\n public static get DecalMapEnabled(): boolean {\r\n return this._DecalMapEnabled;\r\n }\r\n public static set DecalMapEnabled(value: boolean) {\r\n if (this._DecalMapEnabled === value) {\r\n return;\r\n }\r\n\r\n this._DecalMapEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _AmbientTextureEnabled = true;\r\n /**\r\n * Are ambient textures enabled in the application.\r\n */\r\n public static get AmbientTextureEnabled(): boolean {\r\n return this._AmbientTextureEnabled;\r\n }\r\n public static set AmbientTextureEnabled(value: boolean) {\r\n if (this._AmbientTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._AmbientTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _OpacityTextureEnabled = true;\r\n /**\r\n * Are opacity textures enabled in the application.\r\n */\r\n public static get OpacityTextureEnabled(): boolean {\r\n return this._OpacityTextureEnabled;\r\n }\r\n public static set OpacityTextureEnabled(value: boolean) {\r\n if (this._OpacityTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._OpacityTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _ReflectionTextureEnabled = true;\r\n /**\r\n * Are reflection textures enabled in the application.\r\n */\r\n public static get ReflectionTextureEnabled(): boolean {\r\n return this._ReflectionTextureEnabled;\r\n }\r\n public static set ReflectionTextureEnabled(value: boolean) {\r\n if (this._ReflectionTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ReflectionTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _EmissiveTextureEnabled = true;\r\n /**\r\n * Are emissive textures enabled in the application.\r\n */\r\n public static get EmissiveTextureEnabled(): boolean {\r\n return this._EmissiveTextureEnabled;\r\n }\r\n public static set EmissiveTextureEnabled(value: boolean) {\r\n if (this._EmissiveTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._EmissiveTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _SpecularTextureEnabled = true;\r\n /**\r\n * Are specular textures enabled in the application.\r\n */\r\n public static get SpecularTextureEnabled(): boolean {\r\n return this._SpecularTextureEnabled;\r\n }\r\n public static set SpecularTextureEnabled(value: boolean) {\r\n if (this._SpecularTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._SpecularTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _BumpTextureEnabled = true;\r\n /**\r\n * Are bump textures enabled in the application.\r\n */\r\n public static get BumpTextureEnabled(): boolean {\r\n return this._BumpTextureEnabled;\r\n }\r\n public static set BumpTextureEnabled(value: boolean) {\r\n if (this._BumpTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._BumpTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _LightmapTextureEnabled = true;\r\n /**\r\n * Are lightmap textures enabled in the application.\r\n */\r\n public static get LightmapTextureEnabled(): boolean {\r\n return this._LightmapTextureEnabled;\r\n }\r\n public static set LightmapTextureEnabled(value: boolean) {\r\n if (this._LightmapTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._LightmapTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _RefractionTextureEnabled = true;\r\n /**\r\n * Are refraction textures enabled in the application.\r\n */\r\n public static get RefractionTextureEnabled(): boolean {\r\n return this._RefractionTextureEnabled;\r\n }\r\n public static set RefractionTextureEnabled(value: boolean) {\r\n if (this._RefractionTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._RefractionTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _ColorGradingTextureEnabled = true;\r\n /**\r\n * Are color grading textures enabled in the application.\r\n */\r\n public static get ColorGradingTextureEnabled(): boolean {\r\n return this._ColorGradingTextureEnabled;\r\n }\r\n public static set ColorGradingTextureEnabled(value: boolean) {\r\n if (this._ColorGradingTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ColorGradingTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _FresnelEnabled = true;\r\n /**\r\n * Are fresnels enabled in the application.\r\n */\r\n public static get FresnelEnabled(): boolean {\r\n return this._FresnelEnabled;\r\n }\r\n public static set FresnelEnabled(value: boolean) {\r\n if (this._FresnelEnabled === value) {\r\n return;\r\n }\r\n\r\n this._FresnelEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_FresnelDirtyFlag);\r\n }\r\n\r\n private static _ClearCoatTextureEnabled = true;\r\n /**\r\n * Are clear coat textures enabled in the application.\r\n */\r\n public static get ClearCoatTextureEnabled(): boolean {\r\n return this._ClearCoatTextureEnabled;\r\n }\r\n public static set ClearCoatTextureEnabled(value: boolean) {\r\n if (this._ClearCoatTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ClearCoatTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _ClearCoatBumpTextureEnabled = true;\r\n /**\r\n * Are clear coat bump textures enabled in the application.\r\n */\r\n public static get ClearCoatBumpTextureEnabled(): boolean {\r\n return this._ClearCoatBumpTextureEnabled;\r\n }\r\n public static set ClearCoatBumpTextureEnabled(value: boolean) {\r\n if (this._ClearCoatBumpTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ClearCoatBumpTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _ClearCoatTintTextureEnabled = true;\r\n /**\r\n * Are clear coat tint textures enabled in the application.\r\n */\r\n public static get ClearCoatTintTextureEnabled(): boolean {\r\n return this._ClearCoatTintTextureEnabled;\r\n }\r\n public static set ClearCoatTintTextureEnabled(value: boolean) {\r\n if (this._ClearCoatTintTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ClearCoatTintTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _SheenTextureEnabled = true;\r\n /**\r\n * Are sheen textures enabled in the application.\r\n */\r\n public static get SheenTextureEnabled(): boolean {\r\n return this._SheenTextureEnabled;\r\n }\r\n public static set SheenTextureEnabled(value: boolean) {\r\n if (this._SheenTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._SheenTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _AnisotropicTextureEnabled = true;\r\n /**\r\n * Are anisotropic textures enabled in the application.\r\n */\r\n public static get AnisotropicTextureEnabled(): boolean {\r\n return this._AnisotropicTextureEnabled;\r\n }\r\n public static set AnisotropicTextureEnabled(value: boolean) {\r\n if (this._AnisotropicTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._AnisotropicTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _ThicknessTextureEnabled = true;\r\n /**\r\n * Are thickness textures enabled in the application.\r\n */\r\n public static get ThicknessTextureEnabled(): boolean {\r\n return this._ThicknessTextureEnabled;\r\n }\r\n public static set ThicknessTextureEnabled(value: boolean) {\r\n if (this._ThicknessTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._ThicknessTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _RefractionIntensityTextureEnabled = true;\r\n /**\r\n * Are refraction intensity textures enabled in the application.\r\n */\r\n public static get RefractionIntensityTextureEnabled(): boolean {\r\n return this._ThicknessTextureEnabled;\r\n }\r\n public static set RefractionIntensityTextureEnabled(value: boolean) {\r\n if (this._RefractionIntensityTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._RefractionIntensityTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _TranslucencyIntensityTextureEnabled = true;\r\n /**\r\n * Are translucency intensity textures enabled in the application.\r\n */\r\n public static get TranslucencyIntensityTextureEnabled(): boolean {\r\n return this._ThicknessTextureEnabled;\r\n }\r\n public static set TranslucencyIntensityTextureEnabled(value: boolean) {\r\n if (this._TranslucencyIntensityTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._TranslucencyIntensityTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n private static _IridescenceTextureEnabled = true;\r\n /**\r\n * Are translucency intensity textures enabled in the application.\r\n */\r\n public static get IridescenceTextureEnabled(): boolean {\r\n return this._IridescenceTextureEnabled;\r\n }\r\n public static set IridescenceTextureEnabled(value: boolean) {\r\n if (this._IridescenceTextureEnabled === value) {\r\n return;\r\n }\r\n\r\n this._IridescenceTextureEnabled = value;\r\n Engine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n}\r\n", "import type { Nullable } from \"../types\";\r\nimport type { IEffectFallbacks } from \"./iEffectFallbacks\";\r\n\r\nimport type { Effect } from \"./effect\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\n\r\n/**\r\n * EffectFallbacks can be used to add fallbacks (properties to disable) to certain properties when desired to improve performance.\r\n * (Eg. Start at high quality with reflection and fog, if fps is low, remove reflection, if still low remove fog)\r\n */\r\nexport class EffectFallbacks implements IEffectFallbacks {\r\n private _defines: { [key: string]: Array } = {};\r\n\r\n private _currentRank = 32;\r\n private _maxRank = -1;\r\n\r\n private _mesh: Nullable = null;\r\n\r\n /**\r\n * Removes the fallback from the bound mesh.\r\n */\r\n public unBindMesh() {\r\n this._mesh = null;\r\n }\r\n\r\n /**\r\n * Adds a fallback on the specified property.\r\n * @param rank The rank of the fallback (Lower ranks will be fallbacked to first)\r\n * @param define The name of the define in the shader\r\n */\r\n public addFallback(rank: number, define: string): void {\r\n if (!this._defines[rank]) {\r\n if (rank < this._currentRank) {\r\n this._currentRank = rank;\r\n }\r\n\r\n if (rank > this._maxRank) {\r\n this._maxRank = rank;\r\n }\r\n\r\n this._defines[rank] = new Array();\r\n }\r\n\r\n this._defines[rank].push(define);\r\n }\r\n\r\n /**\r\n * Sets the mesh to use CPU skinning when needing to fallback.\r\n * @param rank The rank of the fallback (Lower ranks will be fallbacked to first)\r\n * @param mesh The mesh to use the fallbacks.\r\n */\r\n public addCPUSkinningFallback(rank: number, mesh: AbstractMesh) {\r\n this._mesh = mesh;\r\n\r\n if (rank < this._currentRank) {\r\n this._currentRank = rank;\r\n }\r\n if (rank > this._maxRank) {\r\n this._maxRank = rank;\r\n }\r\n }\r\n\r\n /**\r\n * Checks to see if more fallbacks are still available.\r\n */\r\n public get hasMoreFallbacks(): boolean {\r\n return this._currentRank <= this._maxRank;\r\n }\r\n\r\n /**\r\n * Removes the defines that should be removed when falling back.\r\n * @param currentDefines defines the current define statements for the shader.\r\n * @param effect defines the current effect we try to compile\r\n * @returns The resulting defines with defines of the current rank removed.\r\n */\r\n public reduce(currentDefines: string, effect: Effect): string {\r\n // First we try to switch to CPU skinning\r\n if (this._mesh && this._mesh.computeBonesUsingShaders && this._mesh.numBoneInfluencers > 0) {\r\n this._mesh.computeBonesUsingShaders = false;\r\n currentDefines = currentDefines.replace(\"#define NUM_BONE_INFLUENCERS \" + this._mesh.numBoneInfluencers, \"#define NUM_BONE_INFLUENCERS 0\");\r\n effect._bonesComputationForcedToCPU = true;\r\n\r\n const scene = this._mesh.getScene();\r\n for (let index = 0; index < scene.meshes.length; index++) {\r\n const otherMesh = scene.meshes[index];\r\n\r\n if (!otherMesh.material) {\r\n if (!this._mesh.material && otherMesh.computeBonesUsingShaders && otherMesh.numBoneInfluencers > 0) {\r\n otherMesh.computeBonesUsingShaders = false;\r\n }\r\n continue;\r\n }\r\n\r\n if (!otherMesh.computeBonesUsingShaders || otherMesh.numBoneInfluencers === 0) {\r\n continue;\r\n }\r\n\r\n if (otherMesh.material.getEffect() === effect) {\r\n otherMesh.computeBonesUsingShaders = false;\r\n } else if (otherMesh.subMeshes) {\r\n for (const subMesh of otherMesh.subMeshes) {\r\n const subMeshEffect = subMesh.effect;\r\n\r\n if (subMeshEffect === effect) {\r\n otherMesh.computeBonesUsingShaders = false;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n const currentFallbacks = this._defines[this._currentRank];\r\n if (currentFallbacks) {\r\n for (let index = 0; index < currentFallbacks.length; index++) {\r\n currentDefines = currentDefines.replace(\"#define \" + currentFallbacks[index], \"\");\r\n }\r\n }\r\n\r\n this._currentRank++;\r\n }\r\n\r\n return currentDefines;\r\n }\r\n}\r\n", "import type { ProcessingOptions, ShaderCustomProcessingFunction } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Material } from \"./material\";\r\nimport type {\r\n MaterialPluginPrepareEffect,\r\n MaterialPluginBindForSubMesh,\r\n MaterialPluginDisposed,\r\n MaterialPluginGetActiveTextures,\r\n MaterialPluginGetAnimatables,\r\n MaterialPluginGetDefineNames,\r\n MaterialPluginHasTexture,\r\n MaterialPluginIsReadyForSubMesh,\r\n MaterialPluginPrepareDefines,\r\n MaterialPluginPrepareUniformBuffer,\r\n MaterialPluginHardBindForSubMesh,\r\n MaterialPluginHasRenderTargetTextures,\r\n MaterialPluginFillRenderTargetTextures,\r\n} from \"./materialPluginEvent\";\r\nimport { MaterialPluginEvent } from \"./materialPluginEvent\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\nimport type { Scene } from \"../scene\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { MaterialPluginBase } from \"./materialPluginBase\";\r\nimport { ShaderProcessor } from \"../Engines/Processors/shaderProcessor\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\nimport { ShaderStore } from \"../Engines/shaderStore\";\r\n\r\ndeclare module \"./material\" {\r\n export interface Material {\r\n /**\r\n * Plugin manager for this material\r\n */\r\n pluginManager?: MaterialPluginManager;\r\n }\r\n}\r\n\r\nconst rxOption = new RegExp(\"^([gimus]+)!\");\r\n\r\n/**\r\n * Class that manages the plugins of a material\r\n * @since 5.0\r\n */\r\nexport class MaterialPluginManager {\r\n /** Map a plugin class name to a #define name (used in the vertex/fragment shaders as a marker of the plugin usage) */\r\n private static _MaterialPluginClassToMainDefine: { [name: string]: string } = {};\r\n private static _MaterialPluginCounter: number = 0;\r\n\r\n protected _material: Material;\r\n protected _scene: Scene;\r\n protected _engine: Engine;\r\n /** @internal */\r\n public _plugins: MaterialPluginBase[] = [];\r\n protected _activePlugins: MaterialPluginBase[] = [];\r\n protected _activePluginsForExtraEvents: MaterialPluginBase[] = [];\r\n protected _codeInjectionPoints: { [shaderType: string]: { [codeName: string]: boolean } };\r\n protected _defineNamesFromPlugins?: { [name: string]: { type: string; default: any } };\r\n protected _uboDeclaration: string;\r\n protected _vertexDeclaration: string;\r\n protected _fragmentDeclaration: string;\r\n protected _uniformList: string[];\r\n protected _samplerList: string[];\r\n protected _uboList: string[];\r\n\r\n static {\r\n EngineStore.OnEnginesDisposedObservable.add(() => {\r\n UnregisterAllMaterialPlugins();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a new instance of the plugin manager\r\n * @param material material that this manager will manage the plugins for\r\n */\r\n constructor(material: Material) {\r\n this._material = material;\r\n this._scene = material.getScene();\r\n this._engine = this._scene.getEngine();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _addPlugin(plugin: MaterialPluginBase): boolean {\r\n for (let i = 0; i < this._plugins.length; ++i) {\r\n if (this._plugins[i].name === plugin.name) {\r\n return false;\r\n }\r\n }\r\n\r\n if (this._material._uniformBufferLayoutBuilt) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw `The plugin \"${plugin.name}\" can't be added to the material \"${this._material.name}\" because this material has already been used for rendering! Please add plugins to materials before any rendering with this material occurs.`;\r\n }\r\n\r\n const pluginClassName = plugin.getClassName();\r\n if (!MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName]) {\r\n MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName] = \"MATERIALPLUGIN_\" + ++MaterialPluginManager._MaterialPluginCounter;\r\n }\r\n\r\n this._material._callbackPluginEventGeneric = (id, info) => this._handlePluginEvent(id, info);\r\n\r\n this._plugins.push(plugin);\r\n this._plugins.sort((a, b) => a.priority - b.priority);\r\n\r\n this._codeInjectionPoints = {};\r\n\r\n const defineNamesFromPlugins: { [name: string]: { type: string; default: any } } = {};\r\n defineNamesFromPlugins[MaterialPluginManager._MaterialPluginClassToMainDefine[pluginClassName]] = {\r\n type: \"boolean\",\r\n default: true,\r\n };\r\n\r\n for (const plugin of this._plugins) {\r\n plugin.collectDefines(defineNamesFromPlugins);\r\n this._collectPointNames(\"vertex\", plugin.getCustomCode(\"vertex\"));\r\n this._collectPointNames(\"fragment\", plugin.getCustomCode(\"fragment\"));\r\n }\r\n\r\n this._defineNamesFromPlugins = defineNamesFromPlugins;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _activatePlugin(plugin: MaterialPluginBase): void {\r\n if (this._activePlugins.indexOf(plugin) === -1) {\r\n this._activePlugins.push(plugin);\r\n this._activePlugins.sort((a, b) => a.priority - b.priority);\r\n\r\n this._material._callbackPluginEventIsReadyForSubMesh = this._handlePluginEventIsReadyForSubMesh.bind(this);\r\n this._material._callbackPluginEventPrepareDefinesBeforeAttributes = this._handlePluginEventPrepareDefinesBeforeAttributes.bind(this);\r\n this._material._callbackPluginEventPrepareDefines = this._handlePluginEventPrepareDefines.bind(this);\r\n this._material._callbackPluginEventBindForSubMesh = this._handlePluginEventBindForSubMesh.bind(this);\r\n\r\n if (plugin.registerForExtraEvents) {\r\n this._activePluginsForExtraEvents.push(plugin);\r\n this._activePluginsForExtraEvents.sort((a, b) => a.priority - b.priority);\r\n this._material._callbackPluginEventHasRenderTargetTextures = this._handlePluginEventHasRenderTargetTextures.bind(this);\r\n this._material._callbackPluginEventFillRenderTargetTextures = this._handlePluginEventFillRenderTargetTextures.bind(this);\r\n this._material._callbackPluginEventHardBindForSubMesh = this._handlePluginEventHardBindForSubMesh.bind(this);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets a plugin from the list of plugins managed by this manager\r\n * @param name name of the plugin\r\n * @returns the plugin if found, else null\r\n */\r\n public getPlugin(name: string): Nullable {\r\n for (let i = 0; i < this._plugins.length; ++i) {\r\n if (this._plugins[i].name === name) {\r\n return this._plugins[i] as T;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n protected _handlePluginEventIsReadyForSubMesh(eventData: MaterialPluginIsReadyForSubMesh): void {\r\n let isReady = true;\r\n for (const plugin of this._activePlugins) {\r\n isReady = isReady && plugin.isReadyForSubMesh(eventData.defines, this._scene, this._engine, eventData.subMesh);\r\n }\r\n eventData.isReadyForSubMesh = isReady;\r\n }\r\n\r\n protected _handlePluginEventPrepareDefinesBeforeAttributes(eventData: MaterialPluginPrepareDefines): void {\r\n for (const plugin of this._activePlugins) {\r\n plugin.prepareDefinesBeforeAttributes(eventData.defines, this._scene, eventData.mesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventPrepareDefines(eventData: MaterialPluginPrepareDefines): void {\r\n for (const plugin of this._activePlugins) {\r\n plugin.prepareDefines(eventData.defines, this._scene, eventData.mesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventHardBindForSubMesh(eventData: MaterialPluginHardBindForSubMesh): void {\r\n for (const plugin of this._activePluginsForExtraEvents) {\r\n plugin.hardBindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, eventData.subMesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventBindForSubMesh(eventData: MaterialPluginBindForSubMesh): void {\r\n for (const plugin of this._activePlugins) {\r\n plugin.bindForSubMesh(this._material._uniformBuffer, this._scene, this._engine, eventData.subMesh);\r\n }\r\n }\r\n\r\n protected _handlePluginEventHasRenderTargetTextures(eventData: MaterialPluginHasRenderTargetTextures): void {\r\n let hasRenderTargetTextures = false;\r\n for (const plugin of this._activePluginsForExtraEvents) {\r\n hasRenderTargetTextures = plugin.hasRenderTargetTextures();\r\n if (hasRenderTargetTextures) {\r\n break;\r\n }\r\n }\r\n eventData.hasRenderTargetTextures = hasRenderTargetTextures;\r\n }\r\n\r\n protected _handlePluginEventFillRenderTargetTextures(eventData: MaterialPluginFillRenderTargetTextures): void {\r\n for (const plugin of this._activePluginsForExtraEvents) {\r\n plugin.fillRenderTargetTextures(eventData.renderTargets);\r\n }\r\n }\r\n\r\n protected _handlePluginEvent(\r\n id: number,\r\n info:\r\n | MaterialPluginGetActiveTextures\r\n | MaterialPluginGetAnimatables\r\n | MaterialPluginHasTexture\r\n | MaterialPluginDisposed\r\n | MaterialPluginGetDefineNames\r\n | MaterialPluginPrepareEffect\r\n | MaterialPluginPrepareUniformBuffer\r\n ): void {\r\n switch (id) {\r\n case MaterialPluginEvent.GetActiveTextures: {\r\n const eventData = info as MaterialPluginGetActiveTextures;\r\n for (const plugin of this._activePlugins) {\r\n plugin.getActiveTextures(eventData.activeTextures);\r\n }\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.GetAnimatables: {\r\n const eventData = info as MaterialPluginGetAnimatables;\r\n for (const plugin of this._activePlugins) {\r\n plugin.getAnimatables(eventData.animatables);\r\n }\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.HasTexture: {\r\n const eventData = info as MaterialPluginHasTexture;\r\n let hasTexture = false;\r\n for (const plugin of this._activePlugins) {\r\n hasTexture = plugin.hasTexture(eventData.texture);\r\n if (hasTexture) {\r\n break;\r\n }\r\n }\r\n eventData.hasTexture = hasTexture;\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.Disposed: {\r\n const eventData = info as MaterialPluginDisposed;\r\n for (const plugin of this._plugins) {\r\n plugin.dispose(eventData.forceDisposeTextures);\r\n }\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.GetDefineNames: {\r\n const eventData = info as MaterialPluginGetDefineNames;\r\n eventData.defineNames = this._defineNamesFromPlugins;\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.PrepareEffect: {\r\n const eventData = info as MaterialPluginPrepareEffect;\r\n for (const plugin of this._activePlugins) {\r\n eventData.fallbackRank = plugin.addFallbacks(eventData.defines, eventData.fallbacks, eventData.fallbackRank);\r\n plugin.getAttributes(eventData.attributes, this._scene, eventData.mesh);\r\n }\r\n if (this._uniformList.length > 0) {\r\n eventData.uniforms.push(...this._uniformList);\r\n }\r\n if (this._samplerList.length > 0) {\r\n eventData.samplers.push(...this._samplerList);\r\n }\r\n if (this._uboList.length > 0) {\r\n eventData.uniformBuffersNames.push(...this._uboList);\r\n }\r\n eventData.customCode = this._injectCustomCode(eventData, eventData.customCode);\r\n break;\r\n }\r\n\r\n case MaterialPluginEvent.PrepareUniformBuffer: {\r\n const eventData = info as MaterialPluginPrepareUniformBuffer;\r\n this._uboDeclaration = \"\";\r\n this._vertexDeclaration = \"\";\r\n this._fragmentDeclaration = \"\";\r\n this._uniformList = [];\r\n this._samplerList = [];\r\n this._uboList = [];\r\n for (const plugin of this._plugins) {\r\n const uniforms = plugin.getUniforms();\r\n if (uniforms) {\r\n if (uniforms.ubo) {\r\n for (const uniform of uniforms.ubo) {\r\n if (uniform.size && uniform.type) {\r\n const arraySize = uniform.arraySize ?? 0;\r\n eventData.ubo.addUniform(uniform.name, uniform.size, arraySize);\r\n this._uboDeclaration += `${uniform.type} ${uniform.name}${arraySize > 0 ? `[${arraySize}]` : \"\"};\\n`;\r\n }\r\n this._uniformList.push(uniform.name);\r\n }\r\n }\r\n if (uniforms.vertex) {\r\n this._vertexDeclaration += uniforms.vertex + \"\\n\";\r\n }\r\n if (uniforms.fragment) {\r\n this._fragmentDeclaration += uniforms.fragment + \"\\n\";\r\n }\r\n }\r\n plugin.getSamplers(this._samplerList);\r\n plugin.getUniformBuffersNames(this._uboList);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n protected _collectPointNames(shaderType: string, customCode: Nullable<{ [pointName: string]: string }> | undefined): void {\r\n if (!customCode) {\r\n return;\r\n }\r\n for (const pointName in customCode) {\r\n if (!this._codeInjectionPoints[shaderType]) {\r\n this._codeInjectionPoints[shaderType] = {};\r\n }\r\n this._codeInjectionPoints[shaderType][pointName] = true;\r\n }\r\n }\r\n\r\n protected _injectCustomCode(eventData: MaterialPluginPrepareEffect, existingCallback?: (shaderType: string, code: string) => string): ShaderCustomProcessingFunction {\r\n return (shaderType: string, code: string) => {\r\n if (existingCallback) {\r\n code = existingCallback(shaderType, code);\r\n }\r\n if (this._uboDeclaration) {\r\n code = code.replace(\"#define ADDITIONAL_UBO_DECLARATION\", this._uboDeclaration);\r\n }\r\n if (this._vertexDeclaration) {\r\n code = code.replace(\"#define ADDITIONAL_VERTEX_DECLARATION\", this._vertexDeclaration);\r\n }\r\n if (this._fragmentDeclaration) {\r\n code = code.replace(\"#define ADDITIONAL_FRAGMENT_DECLARATION\", this._fragmentDeclaration);\r\n }\r\n const points = this._codeInjectionPoints?.[shaderType];\r\n if (!points) {\r\n return code;\r\n }\r\n let processorOptions: Nullable = null;\r\n for (let pointName in points) {\r\n let injectedCode = \"\";\r\n for (const plugin of this._activePlugins) {\r\n let customCode = plugin.getCustomCode(shaderType)?.[pointName];\r\n if (!customCode) {\r\n continue;\r\n }\r\n if (plugin.resolveIncludes) {\r\n if (processorOptions === null) {\r\n const shaderLanguage = ShaderLanguage.GLSL;\r\n processorOptions = {\r\n defines: [], // not used by _ProcessIncludes\r\n indexParameters: eventData.indexParameters,\r\n isFragment: false,\r\n shouldUseHighPrecisionShader: this._engine._shouldUseHighPrecisionShader,\r\n processor: undefined as any, // not used by _ProcessIncludes\r\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\r\n shadersRepository: ShaderStore.GetShadersRepository(shaderLanguage),\r\n includesShadersStore: ShaderStore.GetIncludesShadersStore(shaderLanguage),\r\n version: undefined as any, // not used by _ProcessIncludes\r\n platformName: this._engine.shaderPlatformName,\r\n processingContext: undefined as any, // not used by _ProcessIncludes\r\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\r\n processCodeAfterIncludes: undefined as any, // not used by _ProcessIncludes\r\n };\r\n }\r\n processorOptions.isFragment = shaderType === \"fragment\";\r\n ShaderProcessor._ProcessIncludes(customCode, processorOptions, (code) => (customCode = code));\r\n }\r\n injectedCode += customCode + \"\\n\";\r\n }\r\n if (injectedCode.length > 0) {\r\n if (pointName.charAt(0) === \"!\") {\r\n // pointName is a regular expression\r\n pointName = pointName.substring(1);\r\n\r\n let regexFlags = \"g\";\r\n if (pointName.charAt(0) === \"!\") {\r\n // no flags\r\n regexFlags = \"\";\r\n pointName = pointName.substring(1);\r\n } else {\r\n // get the flag(s)\r\n const matchOption = rxOption.exec(pointName);\r\n if (matchOption && matchOption.length >= 2) {\r\n regexFlags = matchOption[1];\r\n pointName = pointName.substring(regexFlags.length + 1);\r\n }\r\n }\r\n\r\n if (regexFlags.indexOf(\"g\") < 0) {\r\n // we force the \"g\" flag so that the regexp object is stateful!\r\n regexFlags += \"g\";\r\n }\r\n\r\n const sourceCode = code;\r\n const rx = new RegExp(pointName, regexFlags);\r\n let match = rx.exec(sourceCode);\r\n while (match !== null) {\r\n let newCode = injectedCode;\r\n for (let i = 0; i < match.length; ++i) {\r\n newCode = newCode.replace(\"$\" + i, match[i]);\r\n }\r\n code = code.replace(match[0], newCode);\r\n match = rx.exec(sourceCode);\r\n }\r\n } else {\r\n const fullPointName = \"#define \" + pointName;\r\n code = code.replace(fullPointName, \"\\n\" + injectedCode + \"\\n\" + fullPointName);\r\n }\r\n }\r\n }\r\n return code;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Type for plugin material factories.\r\n */\r\nexport type PluginMaterialFactory = (material: Material) => Nullable;\r\n\r\nconst plugins: Array<[string, PluginMaterialFactory]> = [];\r\nlet inited = false;\r\nlet observer: Nullable> = null;\r\n\r\n/**\r\n * Registers a new material plugin through a factory, or updates it. This makes the plugin available to all materials instantiated after its registration.\r\n * @param pluginName The plugin name\r\n * @param factory The factory function which allows to create the plugin\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterMaterialPlugin(pluginName: string, factory: PluginMaterialFactory): void {\r\n if (!inited) {\r\n observer = Material.OnEventObservable.add((material: Material) => {\r\n for (const [, factory] of plugins) {\r\n factory(material);\r\n }\r\n }, MaterialPluginEvent.Created);\r\n inited = true;\r\n }\r\n const existing = plugins.filter(([name, _factory]) => name === pluginName);\r\n if (existing.length > 0) {\r\n existing[0][1] = factory;\r\n } else {\r\n plugins.push([pluginName, factory]);\r\n }\r\n}\r\n\r\n/**\r\n * Removes a material plugin from the list of global plugins.\r\n * @param pluginName The plugin name\r\n * @returns true if the plugin has been removed, else false\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function UnregisterMaterialPlugin(pluginName: string): boolean {\r\n for (let i = 0; i < plugins.length; ++i) {\r\n if (plugins[i][0] === pluginName) {\r\n plugins.splice(i, 1);\r\n if (plugins.length === 0) {\r\n UnregisterAllMaterialPlugins();\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Clear the list of global material plugins\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function UnregisterAllMaterialPlugins(): void {\r\n plugins.length = 0;\r\n inited = false;\r\n Material.OnEventObservable.remove(observer);\r\n observer = null;\r\n}\r\n", "import { serialize } from \"../Misc/decorators\";\r\nimport type { Nullable } from \"../types\";\r\nimport { MaterialPluginManager } from \"./materialPluginManager\";\r\nimport type { SmartArray } from \"../Misc/smartArray\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport type { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { EffectFallbacks } from \"./effectFallbacks\";\r\nimport type { MaterialDefines } from \"./materialDefines\";\r\nimport type { Material } from \"./material\";\r\nimport type { BaseTexture } from \"./Textures/baseTexture\";\r\nimport type { RenderTargetTexture } from \"./Textures/renderTargetTexture\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\n\r\n/**\r\n * Base class for material plugins.\r\n * @since 5.0\r\n */\r\nexport class MaterialPluginBase {\r\n /**\r\n * Defines the name of the plugin\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Defines the priority of the plugin. Lower numbers run first.\r\n */\r\n @serialize()\r\n public priority: number = 500;\r\n\r\n /**\r\n * Indicates that any #include directive in the plugin code must be replaced by the corresponding code.\r\n */\r\n @serialize()\r\n public resolveIncludes: boolean = false;\r\n\r\n /**\r\n * Indicates that this plugin should be notified for the extra events (HasRenderTargetTextures / FillRenderTargetTextures / HardBindForSubMesh)\r\n */\r\n @serialize()\r\n public registerForExtraEvents: boolean = false;\r\n\r\n protected _material: Material;\r\n protected _pluginManager: MaterialPluginManager;\r\n protected _pluginDefineNames?: { [name: string]: any };\r\n\r\n protected _enable(enable: boolean) {\r\n if (enable) {\r\n this._pluginManager._activatePlugin(this);\r\n }\r\n }\r\n\r\n /**\r\n * Helper function to mark defines as being dirty.\r\n */\r\n public readonly markAllDefinesAsDirty: () => void;\r\n\r\n /**\r\n * Creates a new material plugin\r\n * @param material parent material of the plugin\r\n * @param name name of the plugin\r\n * @param priority priority of the plugin\r\n * @param defines list of defines used by the plugin. The value of the property is the default value for this property\r\n * @param addToPluginList true to add the plugin to the list of plugins managed by the material plugin manager of the material (default: true)\r\n * @param enable true to enable the plugin (it is handy if the plugin does not handle properties to switch its current activation)\r\n * @param resolveIncludes Indicates that any #include directive in the plugin code must be replaced by the corresponding code (default: false)\r\n */\r\n constructor(material: Material, name: string, priority: number, defines?: { [key: string]: any }, addToPluginList = true, enable = false, resolveIncludes = false) {\r\n this._material = material;\r\n this.name = name;\r\n this.priority = priority;\r\n this.resolveIncludes = resolveIncludes;\r\n\r\n if (!material.pluginManager) {\r\n material.pluginManager = new MaterialPluginManager(material);\r\n material.onDisposeObservable.add(() => {\r\n material.pluginManager = undefined;\r\n });\r\n }\r\n\r\n this._pluginDefineNames = defines;\r\n this._pluginManager = material.pluginManager;\r\n\r\n if (addToPluginList) {\r\n this._pluginManager._addPlugin(this);\r\n }\r\n\r\n if (enable) {\r\n this._enable(true);\r\n }\r\n\r\n this.markAllDefinesAsDirty = material._dirtyCallbacks[Constants.MATERIAL_AllDirtyFlag];\r\n }\r\n\r\n /**\r\n * Gets the current class name useful for serialization or dynamic coding.\r\n * @returns The class name.\r\n */\r\n public getClassName(): string {\r\n return \"MaterialPluginBase\";\r\n }\r\n\r\n /**\r\n * Specifies that the submesh is ready to be used.\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine the engine this scene belongs to.\r\n * @param subMesh the submesh to check for readiness\r\n * @returns - boolean indicating that the submesh is ready or not.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReadyForSubMesh(defines: MaterialDefines, scene: Scene, engine: Engine, subMesh: SubMesh): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Binds the material data (this function is called even if mustRebind() returns false)\r\n * @param uniformBuffer defines the Uniform buffer to fill in.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine defines the engine the material belongs to.\r\n * @param subMesh the submesh to bind data for\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public hardBindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, subMesh: SubMesh): void {}\r\n\r\n /**\r\n * Binds the material data.\r\n * @param uniformBuffer defines the Uniform buffer to fill in.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine the engine this scene belongs to.\r\n * @param subMesh the submesh to bind data for\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, subMesh: SubMesh): void {}\r\n\r\n /**\r\n * Disposes the resources of the material.\r\n * @param forceDisposeTextures - Forces the disposal of all textures.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public dispose(forceDisposeTextures?: boolean): void {}\r\n\r\n /**\r\n * Returns a list of custom shader code fragments to customize the shader.\r\n * @param shaderType \"vertex\" or \"fragment\"\r\n * @returns null if no code to be added, or a list of pointName =\\> code.\r\n * Note that `pointName` can also be a regular expression if it starts with a `!`.\r\n * In that case, the string found by the regular expression (if any) will be\r\n * replaced by the code provided.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getCustomCode(shaderType: string): Nullable<{ [pointName: string]: string }> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Collects all defines.\r\n * @param defines The object to append to.\r\n */\r\n public collectDefines(defines: { [name: string]: { type: string; default: any } }): void {\r\n if (!this._pluginDefineNames) {\r\n return;\r\n }\r\n for (const key of Object.keys(this._pluginDefineNames)) {\r\n if (key[0] === \"_\") {\r\n continue;\r\n }\r\n\r\n const type = typeof this._pluginDefineNames[key];\r\n defines[key] = {\r\n type: type === \"number\" ? \"number\" : type === \"string\" ? \"string\" : type === \"boolean\" ? \"boolean\" : \"object\",\r\n default: this._pluginDefineNames[key],\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Sets the defines for the next rendering. Called before PrepareDefinesForAttributes is called.\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene to the material belongs to.\r\n * @param mesh the mesh being rendered\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public prepareDefinesBeforeAttributes(defines: MaterialDefines, scene: Scene, mesh: AbstractMesh): void {}\r\n\r\n /**\r\n * Sets the defines for the next rendering\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene to the material belongs to.\r\n * @param mesh the mesh being rendered\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public prepareDefines(defines: MaterialDefines, scene: Scene, mesh: AbstractMesh): void {}\r\n\r\n /**\r\n * Checks to see if a texture is used in the material.\r\n * @param texture - Base texture to use.\r\n * @returns - Boolean specifying if a texture is used in the material.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public hasTexture(texture: BaseTexture): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n * @returns true if this uses a render target otherwise false.\r\n */\r\n public hasRenderTargetTextures(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Fills the list of render target textures.\r\n * @param renderTargets the list of render targets to update\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public fillRenderTargetTextures(renderTargets: SmartArray): void {}\r\n\r\n /**\r\n * Returns an array of the actively used textures.\r\n * @param activeTextures Array of BaseTextures\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getActiveTextures(activeTextures: BaseTexture[]): void {}\r\n\r\n /**\r\n * Returns the animatable textures.\r\n * @param animatables Array of animatable textures.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getAnimatables(animatables: IAnimatable[]): void {}\r\n\r\n /**\r\n * Add fallbacks to the effect fallbacks list.\r\n * @param defines defines the Base texture to use.\r\n * @param fallbacks defines the current fallback list.\r\n * @param currentRank defines the current fallback rank.\r\n * @returns the new fallback rank.\r\n */\r\n public addFallbacks(defines: MaterialDefines, fallbacks: EffectFallbacks, currentRank: number): number {\r\n return currentRank;\r\n }\r\n\r\n /**\r\n * Gets the samplers used by the plugin.\r\n * @param samplers list that the sampler names should be added to.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getSamplers(samplers: string[]): void {}\r\n\r\n /**\r\n * Gets the attributes used by the plugin.\r\n * @param attributes list that the attribute names should be added to.\r\n * @param scene the scene that the material belongs to.\r\n * @param mesh the mesh being rendered.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getAttributes(attributes: string[], scene: Scene, mesh: AbstractMesh): void {}\r\n\r\n /**\r\n * Gets the uniform buffers names added by the plugin.\r\n * @param ubos list that the ubo names should be added to.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public getUniformBuffersNames(ubos: string[]): void {}\r\n\r\n /**\r\n * Gets the description of the uniforms to add to the ubo (if engine supports ubos) or to inject directly in the vertex/fragment shaders (if engine does not support ubos)\r\n * @returns the description of the uniforms\r\n */\r\n public getUniforms(): { ubo?: Array<{ name: string; size?: number; type?: string; arraySize?: number }>; vertex?: string; fragment?: string } {\r\n return {};\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current configuration into another one.\r\n * @param plugin define the config where to copy the info\r\n */\r\n public copyTo(plugin: MaterialPluginBase): void {\r\n SerializationHelper.Clone(() => plugin, this);\r\n }\r\n\r\n /**\r\n * Serializes this plugin configuration.\r\n * @returns - An object with the serialized config.\r\n */\r\n public serialize(): any {\r\n return SerializationHelper.Serialize(this);\r\n }\r\n\r\n /**\r\n * Parses a plugin configuration from a serialized object.\r\n * @param source - Serialized object.\r\n * @param scene Defines the scene we are parsing for\r\n * @param rootUrl Defines the rootUrl to load from\r\n */\r\n public parse(source: any, scene: Scene, rootUrl: string): void {\r\n SerializationHelper.Parse(() => this, source, scene, rootUrl);\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"../types\";\r\nimport { Material } from \"./material\";\r\nimport { serialize, expandToProperty, serializeAsTexture } from \"../Misc/decorators\";\r\nimport { MaterialFlags } from \"./materialFlags\";\r\nimport type { BaseTexture } from \"./Textures/baseTexture\";\r\nimport type { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport { MaterialDefines } from \"./materialDefines\";\r\nimport { MaterialPluginBase } from \"./materialPluginBase\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { StandardMaterial } from \"./standardMaterial\";\r\nimport type { PBRBaseMaterial } from \"./PBR/pbrBaseMaterial\";\r\nimport { BindTextureMatrix, PrepareDefinesForMergedUV } from \"./materialHelper.functions\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class MaterialDetailMapDefines extends MaterialDefines {\r\n DETAIL = false;\r\n DETAILDIRECTUV = 0;\r\n DETAIL_NORMALBLENDMETHOD = 0;\r\n}\r\n\r\n/**\r\n * Plugin that implements the detail map component of a material\r\n *\r\n * Inspired from:\r\n * Unity: https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@9.0/manual/Mask-Map-and-Detail-Map.html and https://docs.unity3d.com/Manual/StandardShaderMaterialParameterDetail.html\r\n * Unreal: https://docs.unrealengine.com/en-US/Engine/Rendering/Materials/HowTo/DetailTexturing/index.html\r\n * Cryengine: https://docs.cryengine.com/display/SDKDOC2/Detail+Maps\r\n */\r\nexport class DetailMapConfiguration extends MaterialPluginBase {\r\n private _texture: Nullable = null;\r\n /**\r\n * The detail texture of the material.\r\n */\r\n @serializeAsTexture(\"detailTexture\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public texture: Nullable;\r\n\r\n /**\r\n * Defines how strongly the detail diffuse/albedo channel is blended with the regular diffuse/albedo texture\r\n * Bigger values mean stronger blending\r\n */\r\n @serialize()\r\n public diffuseBlendLevel = 1;\r\n\r\n /**\r\n * Defines how strongly the detail roughness channel is blended with the regular roughness value\r\n * Bigger values mean stronger blending. Only used with PBR materials\r\n */\r\n @serialize()\r\n public roughnessBlendLevel = 1;\r\n\r\n /**\r\n * Defines how strong the bump effect from the detail map is\r\n * Bigger values mean stronger effect\r\n */\r\n @serialize()\r\n public bumpLevel = 1;\r\n\r\n private _normalBlendMethod = Material.MATERIAL_NORMALBLENDMETHOD_WHITEOUT;\r\n /**\r\n * The method used to blend the bump and detail normals together\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public normalBlendMethod: number;\r\n\r\n private _isEnabled = false;\r\n /**\r\n * Enable or disable the detail map on this material\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isEnabled = false;\r\n\r\n /** @internal */\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n\r\n /** @internal */\r\n public _markAllSubMeshesAsTexturesDirty(): void {\r\n this._enable(this._isEnabled);\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n constructor(material: PBRBaseMaterial | StandardMaterial, addToPluginList = true) {\r\n super(material, \"DetailMap\", 140, new MaterialDetailMapDefines(), addToPluginList);\r\n\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n }\r\n\r\n public isReadyForSubMesh(defines: MaterialDetailMapDefines, scene: Scene, engine: Engine): boolean {\r\n if (!this._isEnabled) {\r\n return true;\r\n }\r\n\r\n if (defines._areTexturesDirty && scene.texturesEnabled) {\r\n if (engine.getCaps().standardDerivatives && this._texture && MaterialFlags.DetailTextureEnabled) {\r\n // Detail texture cannot be not blocking.\r\n if (!this._texture.isReady()) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public prepareDefines(defines: MaterialDetailMapDefines, scene: Scene): void {\r\n if (this._isEnabled) {\r\n defines.DETAIL_NORMALBLENDMETHOD = this._normalBlendMethod;\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (defines._areTexturesDirty) {\r\n if (engine.getCaps().standardDerivatives && this._texture && MaterialFlags.DetailTextureEnabled && this._isEnabled) {\r\n PrepareDefinesForMergedUV(this._texture, defines, \"DETAIL\");\r\n defines.DETAIL_NORMALBLENDMETHOD = this._normalBlendMethod;\r\n } else {\r\n defines.DETAIL = false;\r\n }\r\n }\r\n } else {\r\n defines.DETAIL = false;\r\n }\r\n }\r\n\r\n public bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n\r\n const isFrozen = this._material.isFrozen;\r\n\r\n if (!uniformBuffer.useUbo || !isFrozen || !uniformBuffer.isSync) {\r\n if (this._texture && MaterialFlags.DetailTextureEnabled) {\r\n uniformBuffer.updateFloat4(\"vDetailInfos\", this._texture.coordinatesIndex, this.diffuseBlendLevel, this.bumpLevel, this.roughnessBlendLevel);\r\n BindTextureMatrix(this._texture, uniformBuffer, \"detail\");\r\n }\r\n }\r\n\r\n // Textures\r\n if (scene.texturesEnabled) {\r\n if (this._texture && MaterialFlags.DetailTextureEnabled) {\r\n uniformBuffer.setTexture(\"detailSampler\", this._texture);\r\n }\r\n }\r\n }\r\n\r\n public hasTexture(texture: BaseTexture): boolean {\r\n if (this._texture === texture) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public getActiveTextures(activeTextures: BaseTexture[]): void {\r\n if (this._texture) {\r\n activeTextures.push(this._texture);\r\n }\r\n }\r\n\r\n public getAnimatables(animatables: IAnimatable[]): void {\r\n if (this._texture && this._texture.animations && this._texture.animations.length > 0) {\r\n animatables.push(this._texture);\r\n }\r\n }\r\n\r\n public dispose(forceDisposeTextures?: boolean): void {\r\n if (forceDisposeTextures) {\r\n this._texture?.dispose();\r\n }\r\n }\r\n\r\n public getClassName(): string {\r\n return \"DetailMapConfiguration\";\r\n }\r\n\r\n public getSamplers(samplers: string[]): void {\r\n samplers.push(\"detailSampler\");\r\n }\r\n\r\n public getUniforms(): { ubo?: Array<{ name: string; size: number; type: string }>; vertex?: string; fragment?: string } {\r\n return {\r\n ubo: [\r\n { name: \"vDetailInfos\", size: 4, type: \"vec4\" },\r\n { name: \"detailMatrix\", size: 16, type: \"mat4\" },\r\n ],\r\n };\r\n }\r\n}\r\n", "import type { Matrix } from \"../Maths/math.vector\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\n/**\r\n * Configuration needed for prepass-capable materials\r\n */\r\nexport class PrePassConfiguration {\r\n /**\r\n * Previous world matrices of meshes carrying this material\r\n * Used for computing velocity\r\n */\r\n public previousWorldMatrices: { [index: number]: Matrix } = {};\r\n /**\r\n * Previous view project matrix\r\n * Used for computing velocity\r\n */\r\n public previousViewProjection: Matrix;\r\n /**\r\n * Current view projection matrix\r\n * Used for computing velocity\r\n */\r\n public currentViewProjection: Matrix;\r\n /**\r\n * Previous bones of meshes carrying this material\r\n * Used for computing velocity\r\n */\r\n public previousBones: { [index: number]: Float32Array } = {};\r\n\r\n private _lastUpdateFrameId: number;\r\n\r\n /**\r\n * Add the required uniforms to the current list.\r\n * @param uniforms defines the current uniform list.\r\n */\r\n public static AddUniforms(uniforms: string[]): void {\r\n uniforms.push(\"previousWorld\", \"previousViewProjection\", \"mPreviousBones\");\r\n }\r\n\r\n /**\r\n * Add the required samplers to the current list.\r\n * @param samplers defines the current sampler list.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static AddSamplers(samplers: string[]): void {\r\n // pass\r\n }\r\n\r\n /**\r\n * Binds the material data.\r\n * @param effect defines the effect to update\r\n * @param scene defines the scene the material belongs to.\r\n * @param mesh The mesh\r\n * @param world World matrix of this mesh\r\n * @param isFrozen Is the material frozen\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bindForSubMesh(effect: Effect, scene: Scene, mesh: Mesh, world: Matrix, isFrozen: boolean): void {\r\n if (scene.prePassRenderer && scene.prePassRenderer.enabled && scene.prePassRenderer.currentRTisSceneRT) {\r\n if (scene.prePassRenderer.getIndex(Constants.PREPASS_VELOCITY_TEXTURE_TYPE) !== -1) {\r\n if (!this.previousWorldMatrices[mesh.uniqueId]) {\r\n this.previousWorldMatrices[mesh.uniqueId] = world.clone();\r\n }\r\n\r\n if (!this.previousViewProjection) {\r\n this.previousViewProjection = scene.getTransformMatrix().clone();\r\n this.currentViewProjection = scene.getTransformMatrix().clone();\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (this.currentViewProjection.updateFlag !== scene.getTransformMatrix().updateFlag) {\r\n // First update of the prepass configuration for this rendering pass\r\n this._lastUpdateFrameId = engine.frameId;\r\n this.previousViewProjection.copyFrom(this.currentViewProjection);\r\n this.currentViewProjection.copyFrom(scene.getTransformMatrix());\r\n } else if (this._lastUpdateFrameId !== engine.frameId) {\r\n // The scene transformation did not change from the previous frame (so no camera motion), we must update previousViewProjection accordingly\r\n this._lastUpdateFrameId = engine.frameId;\r\n this.previousViewProjection.copyFrom(this.currentViewProjection);\r\n }\r\n\r\n effect.setMatrix(\"previousWorld\", this.previousWorldMatrices[mesh.uniqueId]);\r\n effect.setMatrix(\"previousViewProjection\", this.previousViewProjection);\r\n\r\n this.previousWorldMatrices[mesh.uniqueId] = world.clone();\r\n }\r\n }\r\n }\r\n}\r\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"decalFragmentDeclaration\";\nconst shader = `#ifdef DECAL\nuniform vec4 vDecalInfos;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const decalFragmentDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nimport \"./decalFragmentDeclaration\";\n\nconst name = \"defaultFragmentDeclaration\";\nconst shader = `uniform vec4 vEyePosition;uniform vec4 vDiffuseColor;\n#ifdef SPECULARTERM\nuniform vec4 vSpecularColor;\n#endif\nuniform vec3 vEmissiveColor;uniform vec3 vAmbientColor;uniform float visibility;\n#ifdef DIFFUSE\nuniform vec2 vDiffuseInfos;\n#endif\n#ifdef AMBIENT\nuniform vec2 vAmbientInfos;\n#endif\n#ifdef OPACITY \nuniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;uniform vec2 vTangentSpaceParams;\n#endif\n#ifdef ALPHATEST\nuniform float alphaCutOff;\n#endif\n#if defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_PROJECTION) || defined(REFRACTION) || defined(PREPASS)\nuniform mat4 view;\n#endif\n#ifdef REFRACTION\nuniform vec4 vRefractionInfos;\n#ifndef REFRACTIONMAP_3D\nuniform mat4 refractionMatrix;\n#endif\n#ifdef REFRACTIONFRESNEL\nuniform vec4 refractionLeftColor;uniform vec4 refractionRightColor;\n#endif\n#if defined(USE_LOCAL_REFRACTIONMAP_CUBIC) && defined(REFRACTIONMAP_3D)\nuniform vec3 vRefractionPosition;uniform vec3 vRefractionSize; \n#endif\n#endif\n#if defined(SPECULAR) && defined(SPECULARTERM)\nuniform vec2 vSpecularInfos;\n#endif\n#ifdef DIFFUSEFRESNEL\nuniform vec4 diffuseLeftColor;uniform vec4 diffuseRightColor;\n#endif\n#ifdef OPACITYFRESNEL\nuniform vec4 opacityParts;\n#endif\n#ifdef EMISSIVEFRESNEL\nuniform vec4 emissiveLeftColor;uniform vec4 emissiveRightColor;\n#endif\n#ifdef REFLECTION\nuniform vec2 vReflectionInfos;\n#if defined(REFLECTIONMAP_PLANAR) || defined(REFLECTIONMAP_CUBIC) || defined(REFLECTIONMAP_PROJECTION) || defined(REFLECTIONMAP_EQUIRECTANGULAR) || defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_SKYBOX)\nuniform mat4 reflectionMatrix;\n#endif\n#ifndef REFLECTIONMAP_SKYBOX\n#if defined(USE_LOCAL_REFLECTIONMAP_CUBIC) && defined(REFLECTIONMAP_CUBIC)\nuniform vec3 vReflectionPosition;uniform vec3 vReflectionSize; \n#endif\n#endif\n#ifdef REFLECTIONFRESNEL\nuniform vec4 reflectionLeftColor;uniform vec4 reflectionRightColor;\n#endif\n#endif\n#ifdef DETAIL\nuniform vec4 vDetailInfos;\n#endif\n#include\n#define ADDITIONAL_FRAGMENT_DECLARATION\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const defaultFragmentDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"sceneUboDeclaration\";\nconst shader = `layout(std140,column_major) uniform;uniform Scene {mat4 viewProjection;\n#ifdef MULTIVIEW\nmat4 viewProjectionR;\n#endif \nmat4 view;mat4 projection;vec4 vEyePosition;};\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const sceneUboDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"meshUboDeclaration\";\nconst shader = `#ifdef WEBGL2\nuniform mat4 world;uniform float visibility;\n#else\nlayout(std140,column_major) uniform;uniform Mesh\n{mat4 world;float visibility;};\n#endif\n#define WORLD_UBO\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const meshUboDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nimport \"./sceneUboDeclaration\";\nimport \"./meshUboDeclaration\";\n\nconst name = \"defaultUboDeclaration\";\nconst shader = `layout(std140,column_major) uniform;uniform Material\n{vec4 diffuseLeftColor;vec4 diffuseRightColor;vec4 opacityParts;vec4 reflectionLeftColor;vec4 reflectionRightColor;vec4 refractionLeftColor;vec4 refractionRightColor;vec4 emissiveLeftColor;vec4 emissiveRightColor;vec2 vDiffuseInfos;vec2 vAmbientInfos;vec2 vOpacityInfos;vec2 vReflectionInfos;vec3 vReflectionPosition;vec3 vReflectionSize;vec2 vEmissiveInfos;vec2 vLightmapInfos;vec2 vSpecularInfos;vec3 vBumpInfos;mat4 diffuseMatrix;mat4 ambientMatrix;mat4 opacityMatrix;mat4 reflectionMatrix;mat4 emissiveMatrix;mat4 lightmapMatrix;mat4 specularMatrix;mat4 bumpMatrix;vec2 vTangentSpaceParams;float pointSize;float alphaCutOff;mat4 refractionMatrix;vec4 vRefractionInfos;vec3 vRefractionPosition;vec3 vRefractionSize;vec4 vSpecularColor;vec3 vEmissiveColor;vec4 vDiffuseColor;vec3 vAmbientColor;\n#define ADDITIONAL_UBO_DECLARATION\n};\n#include\n#include\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const defaultUboDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"prePassDeclaration\";\nconst shader = `#ifdef PREPASS\n#extension GL_EXT_draw_buffers : require\nlayout(location=0) out highp vec4 glFragData[{X}];highp vec4 gl_FragColor;\n#ifdef PREPASS_DEPTH\nvarying highp vec3 vViewPos;\n#endif\n#ifdef PREPASS_VELOCITY\nvarying highp vec4 vCurrentPosition;varying highp vec4 vPreviousPosition;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const prePassDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"oitDeclaration\";\nconst shader = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY\n#extension GL_EXT_draw_buffers : require\nlayout(location=0) out vec2 depth; \nlayout(location=1) out vec4 frontColor;layout(location=2) out vec4 backColor;\n#define MAX_DEPTH 99999.0\nhighp vec4 gl_FragColor;uniform sampler2D oitDepthSampler;uniform sampler2D oitFrontColorSampler;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const oitDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"mainUVVaryingDeclaration\";\nconst shader = `#ifdef MAINUV{X}\nvarying vec2 vMainUV{X};\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const mainUVVaryingDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightFragmentDeclaration\";\nconst shader = `#ifdef LIGHT{X}\nuniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X};\n#ifdef SPECULARTERM\nuniform vec4 vLightSpecular{X};\n#else\nvec4 vLightSpecular{X}=vec4(0.);\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];uniform float viewFrustumZ{X}[SHADOWCSMNUM_CASCADES{X}];uniform float frustumLengths{X}[SHADOWCSMNUM_CASCADES{X}];uniform float cascadeBlendFactor{X};varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};uniform highp sampler2DArray depthSampler{X};uniform vec2 lightSizeUVCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float depthCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float penumbraDarkness{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};\n#else\nuniform highp sampler2DArray shadowSampler{X};\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nconst vec3 vCascadeColorsMultiplier{X}[8]=vec3[8]\n(\nvec3 ( 1.5,0.0,0.0 ),\nvec3 ( 0.0,1.5,0.0 ),\nvec3 ( 0.0,0.0,5.5 ),\nvec3 ( 1.5,0.0,5.5 ),\nvec3 ( 1.5,1.5,0.0 ),\nvec3 ( 1.0,1.0,1.0 ),\nvec3 ( 0.0,1.0,5.5 ),\nvec3 ( 0.5,3.5,0.75 )\n);vec3 shadowDebug{X};\n#endif\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nint index{X}=-1;\n#else\nint index{X}=SHADOWCSMNUM_CASCADES{X}-1;\n#endif\nfloat diff{X}=0.;\n#elif defined(SHADOWCUBE{X})\nuniform samplerCube shadowSampler{X};\n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DShadow shadowSampler{X};uniform highp sampler2D depthSampler{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DShadow shadowSampler{X};\n#else\nuniform sampler2D shadowSampler{X};\n#endif\nuniform mat4 lightMatrix{X};\n#endif\nuniform vec4 shadowsInfo{X};uniform vec2 depthValues{X};\n#endif\n#ifdef SPOTLIGHT{X}\nuniform vec4 vLightDirection{X};uniform vec4 vLightFalloff{X};\n#elif defined(POINTLIGHT{X})\nuniform vec4 vLightFalloff{X};\n#elif defined(HEMILIGHT{X})\nuniform vec3 vLightGround{X};\n#endif\n#ifdef PROJECTEDLIGHTTEXTURE{X}\nuniform mat4 textureProjectionMatrix{X};uniform sampler2D projectionLightSampler{X};\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const lightFragmentDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightUboDeclaration\";\nconst shader = `#ifdef LIGHT{X}\nuniform Light{X}\n{vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular;\n#ifdef SPOTLIGHT{X}\nvec4 vLightDirection;vec4 vLightFalloff;\n#elif defined(POINTLIGHT{X})\nvec4 vLightFalloff;\n#elif defined(HEMILIGHT{X})\nvec3 vLightGround;\n#endif\nvec4 shadowsInfo;vec2 depthValues;} light{X};\n#ifdef PROJECTEDLIGHTTEXTURE{X}\nuniform mat4 textureProjectionMatrix{X};uniform sampler2D projectionLightSampler{X};\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];uniform float viewFrustumZ{X}[SHADOWCSMNUM_CASCADES{X}];uniform float frustumLengths{X}[SHADOWCSMNUM_CASCADES{X}];uniform float cascadeBlendFactor{X};varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};uniform highp sampler2DArray depthSampler{X};uniform vec2 lightSizeUVCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float depthCorrection{X}[SHADOWCSMNUM_CASCADES{X}];uniform float penumbraDarkness{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DArrayShadow shadowSampler{X};\n#else\nuniform highp sampler2DArray shadowSampler{X};\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nconst vec3 vCascadeColorsMultiplier{X}[8]=vec3[8]\n(\nvec3 ( 1.5,0.0,0.0 ),\nvec3 ( 0.0,1.5,0.0 ),\nvec3 ( 0.0,0.0,5.5 ),\nvec3 ( 1.5,0.0,5.5 ),\nvec3 ( 1.5,1.5,0.0 ),\nvec3 ( 1.0,1.0,1.0 ),\nvec3 ( 0.0,1.0,5.5 ),\nvec3 ( 0.5,3.5,0.75 )\n);vec3 shadowDebug{X};\n#endif\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nint index{X}=-1;\n#else\nint index{X}=SHADOWCSMNUM_CASCADES{X}-1;\n#endif\nfloat diff{X}=0.;\n#elif defined(SHADOWCUBE{X})\nuniform samplerCube shadowSampler{X}; \n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};\n#if defined(SHADOWPCSS{X})\nuniform highp sampler2DShadow shadowSampler{X};uniform highp sampler2D depthSampler{X};\n#elif defined(SHADOWPCF{X})\nuniform highp sampler2DShadow shadowSampler{X};\n#else\nuniform sampler2D shadowSampler{X};\n#endif\nuniform mat4 lightMatrix{X};\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const lightUboDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightsFragmentFunctions\";\nconst shader = `struct lightingInfo\n{vec3 diffuse;\n#ifdef SPECULARTERM\nvec3 specular;\n#endif\n#ifdef NDOTL\nfloat ndl;\n#endif\n};lightingInfo computeLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {lightingInfo result;vec3 lightVectorW;float attenuation=1.0;if (lightData.w==0.)\n{vec3 direction=lightData.xyz-vPositionW;attenuation=max(0.,1.0-length(direction)/range);lightVectorW=normalize(direction);}\nelse\n{lightVectorW=normalize(-lightData.xyz);}\nfloat ndl=max(0.,dot(vNormal,lightVectorW));\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=ndl*diffuseColor*attenuation;\n#ifdef SPECULARTERM\nvec3 angleW=normalize(viewDirectionW+lightVectorW);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor*attenuation;\n#endif\nreturn result;}\nlightingInfo computeSpotLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec4 lightDirection,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {lightingInfo result;vec3 direction=lightData.xyz-vPositionW;vec3 lightVectorW=normalize(direction);float attenuation=max(0.,1.0-length(direction)/range);float cosAngle=max(0.,dot(lightDirection.xyz,-lightVectorW));if (cosAngle>=lightDirection.w)\n{cosAngle=max(0.,pow(cosAngle,lightData.w));attenuation*=cosAngle;float ndl=max(0.,dot(vNormal,lightVectorW));\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=ndl*diffuseColor*attenuation;\n#ifdef SPECULARTERM\nvec3 angleW=normalize(viewDirectionW+lightVectorW);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor*attenuation;\n#endif\nreturn result;}\nresult.diffuse=vec3(0.);\n#ifdef SPECULARTERM\nresult.specular=vec3(0.);\n#endif\n#ifdef NDOTL\nresult.ndl=0.;\n#endif\nreturn result;}\nlightingInfo computeHemisphericLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,vec3 groundColor,float glossiness) {lightingInfo result;float ndl=dot(vNormal,lightData.xyz)*0.5+0.5;\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=mix(groundColor,diffuseColor,ndl);\n#ifdef SPECULARTERM\nvec3 angleW=normalize(viewDirectionW+lightData.xyz);float specComp=max(0.,dot(vNormal,angleW));specComp=pow(specComp,max(1.,glossiness));result.specular=specComp*specularColor;\n#endif\nreturn result;}\n#define inline\nvec3 computeProjectionTextureDiffuseLighting(sampler2D projectionLightSampler,mat4 textureProjectionMatrix){vec4 strq=textureProjectionMatrix*vec4(vPositionW,1.0);strq/=strq.w;vec3 textureColor=texture2D(projectionLightSampler,strq.xy).rgb;return textureColor;}`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const lightsFragmentFunctions = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"shadowsFragmentFunctions\";\nconst shader = `#ifdef SHADOWS\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\n#define TEXTUREFUNC(s,c,l) texture2DLodEXT(s,c,l)\n#else\n#define TEXTUREFUNC(s,c,b) texture2D(s,c,b)\n#endif\n#ifndef SHADOWFLOAT\nfloat unpack(vec4 color)\n{const vec4 bit_shift=vec4(1.0/(255.0*255.0*255.0),1.0/(255.0*255.0),1.0/255.0,1.0);return dot(color,bit_shift);}\n#endif\nfloat computeFallOff(float value,vec2 clipSpace,float frustumEdgeFalloff)\n{float mask=smoothstep(1.0-frustumEdgeFalloff,1.00000012,clamp(dot(clipSpace,clipSpace),0.,1.));return mix(value,1.0,mask);}\n#define inline\nfloat computeShadowCube(vec3 worldPos,vec3 lightPosition,samplerCube shadowSampler,float darkness,vec2 depthValues)\n{vec3 directionToLight=worldPos-lightPosition;float depth=length(directionToLight);depth=(depth+depthValues.x)/(depthValues.y);depth=clamp(depth,0.,1.0);directionToLight=normalize(directionToLight);directionToLight.y=-directionToLight.y;\n#ifndef SHADOWFLOAT\nfloat shadow=unpack(textureCube(shadowSampler,directionToLight));\n#else\nfloat shadow=textureCube(shadowSampler,directionToLight).x;\n#endif\nreturn depth>shadow ? darkness : 1.0;}\n#define inline\nfloat computeShadowWithPoissonSamplingCube(vec3 worldPos,vec3 lightPosition,samplerCube shadowSampler,float mapSize,float darkness,vec2 depthValues)\n{vec3 directionToLight=worldPos-lightPosition;float depth=length(directionToLight);depth=(depth+depthValues.x)/(depthValues.y);depth=clamp(depth,0.,1.0);directionToLight=normalize(directionToLight);directionToLight.y=-directionToLight.y;float visibility=1.;vec3 poissonDisk[4];poissonDisk[0]=vec3(-1.0,1.0,-1.0);poissonDisk[1]=vec3(1.0,-1.0,-1.0);poissonDisk[2]=vec3(-1.0,-1.0,-1.0);poissonDisk[3]=vec3(1.0,-1.0,1.0);\n#ifndef SHADOWFLOAT\nif (unpack(textureCube(shadowSampler,directionToLight+poissonDisk[0]*mapSize))shadow ? computeFallOff(darkness,clipSpace.xy,frustumEdgeFalloff) : 1.;}\n#endif\n#define inline\nfloat computeShadow(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0);\n#ifndef SHADOWFLOAT\nfloat shadow=unpack(TEXTUREFUNC(shadowSampler,uv,0.));\n#else\nfloat shadow=TEXTUREFUNC(shadowSampler,uv,0.).x;\n#endif\nreturn shadowPixelDepth>shadow ? computeFallOff(darkness,clipSpace.xy,frustumEdgeFalloff) : 1.;}}\n#define inline\nfloat computeShadowWithPoissonSampling(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float mapSize,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0);float visibility=1.;vec2 poissonDisk[4];poissonDisk[0]=vec2(-0.94201624,-0.39906216);poissonDisk[1]=vec2(0.94558609,-0.76890725);poissonDisk[2]=vec2(-0.094184101,-0.92938870);poissonDisk[3]=vec2(0.34495938,0.29387760);\n#ifndef SHADOWFLOAT\nif (unpack(TEXTUREFUNC(shadowSampler,uv+poissonDisk[0]*mapSize,0.))1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0);\n#ifndef SHADOWFLOAT\nfloat shadowMapSample=unpack(TEXTUREFUNC(shadowSampler,uv,0.));\n#else\nfloat shadowMapSample=TEXTUREFUNC(shadowSampler,uv,0.).x;\n#endif\nfloat esm=1.0-clamp(exp(min(87.,depthScale*shadowPixelDepth))*shadowMapSample,0.,1.-darkness);return computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);}}\n#define inline\nfloat computeShadowWithCloseESM(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float depthScale,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec2 uv=0.5*clipSpace.xy+vec2(0.5);if (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{return 1.0;}\nelse\n{float shadowPixelDepth=clamp(depthMetric,0.,1.0); \n#ifndef SHADOWFLOAT\nfloat shadowMapSample=unpack(TEXTUREFUNC(shadowSampler,uv,0.));\n#else\nfloat shadowMapSample=TEXTUREFUNC(shadowSampler,uv,0.).x;\n#endif\nfloat esm=clamp(exp(min(87.,-depthScale*(shadowPixelDepth-shadowMapSample))),darkness,1.);return computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);}}\n#ifdef IS_NDC_HALF_ZRANGE\n#define ZINCLIP clipSpace.z\n#else\n#define ZINCLIP uvDepth.z\n#endif\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\n#define GREATEST_LESS_THAN_ONE 0.99999994\n/* disable_uniformity_analysis */\n#define inline\nfloat computeShadowWithCSMPCF1(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec4 uvDepthLayer=vec4(uvDepth.x,uvDepth.y,layer,uvDepth.z);float shadow=texture2D(shadowSampler,uvDepthLayer);shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}\n#define inline\nfloat computeShadowWithCSMPCF3(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=3.-2.*st;vec2 uvw1=1.+2.*st;vec2 u=vec2((2.-st.x)/uvw0.x-1.,st.x/uvw1.x+1.)*shadowMapSizeAndInverse.y;vec2 v=vec2((2.-st.y)/uvw0.y-1.,st.y/uvw1.y+1.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[0]),layer,uvDepth.z));shadow+=uvw1.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[0]),layer,uvDepth.z));shadow+=uvw0.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[1]),layer,uvDepth.z));shadow+=uvw1.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[1]),layer,uvDepth.z));shadow=shadow/16.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}\n#define inline\nfloat computeShadowWithCSMPCF5(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArrayShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=4.-3.*st;vec2 uvw1=vec2(7.);vec2 uvw2=1.+3.*st;vec3 u=vec3((3.-2.*st.x)/uvw0.x-2.,(3.+st.x)/uvw1.x,st.x/uvw2.x+2.)*shadowMapSizeAndInverse.y;vec3 v=vec3((3.-2.*st.y)/uvw0.y-2.,(3.+st.y)/uvw1.y,st.y/uvw2.y+2.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[0]),layer,uvDepth.z));shadow+=uvw1.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[0]),layer,uvDepth.z));shadow+=uvw2.x*uvw0.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[0]),layer,uvDepth.z));shadow+=uvw0.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[1]),layer,uvDepth.z));shadow+=uvw1.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[1]),layer,uvDepth.z));shadow+=uvw2.x*uvw1.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[1]),layer,uvDepth.z));shadow+=uvw0.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[0],v[2]),layer,uvDepth.z));shadow+=uvw1.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[1],v[2]),layer,uvDepth.z));shadow+=uvw2.x*uvw2.y*texture2D(shadowSampler,vec4(base_uv.xy+vec2(u[2],v[2]),layer,uvDepth.z));shadow=shadow/144.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}\n#define inline\nfloat computeShadowWithPCF1(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,float darkness,float frustumEdgeFalloff)\n{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;float shadow=TEXTUREFUNC(shadowSampler,uvDepth,0.);shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}}\n#define inline\nfloat computeShadowWithPCF3(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=3.-2.*st;vec2 uvw1=1.+2.*st;vec2 u=vec2((2.-st.x)/uvw0.x-1.,st.x/uvw1.x+1.)*shadowMapSizeAndInverse.y;vec2 v=vec2((2.-st.y)/uvw0.y-1.,st.y/uvw1.y+1.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[0]),uvDepth.z),0.);shadow+=uvw1.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[0]),uvDepth.z),0.);shadow+=uvw0.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[1]),uvDepth.z),0.);shadow+=uvw1.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[1]),uvDepth.z),0.);shadow=shadow/16.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}}\n#define inline\nfloat computeShadowWithPCF5(vec4 vPositionFromLight,float depthMetric,highp sampler2DShadow shadowSampler,vec2 shadowMapSizeAndInverse,float darkness,float frustumEdgeFalloff)\n{if (depthMetric>1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;vec2 uv=uvDepth.xy*shadowMapSizeAndInverse.x; \nuv+=0.5; \nvec2 st=fract(uv); \nvec2 base_uv=floor(uv)-0.5; \nbase_uv*=shadowMapSizeAndInverse.y; \nvec2 uvw0=4.-3.*st;vec2 uvw1=vec2(7.);vec2 uvw2=1.+3.*st;vec3 u=vec3((3.-2.*st.x)/uvw0.x-2.,(3.+st.x)/uvw1.x,st.x/uvw2.x+2.)*shadowMapSizeAndInverse.y;vec3 v=vec3((3.-2.*st.y)/uvw0.y-2.,(3.+st.y)/uvw1.y,st.y/uvw2.y+2.)*shadowMapSizeAndInverse.y;float shadow=0.;shadow+=uvw0.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[0]),uvDepth.z),0.);shadow+=uvw1.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[0]),uvDepth.z),0.);shadow+=uvw2.x*uvw0.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[0]),uvDepth.z),0.);shadow+=uvw0.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[1]),uvDepth.z),0.);shadow+=uvw1.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[1]),uvDepth.z),0.);shadow+=uvw2.x*uvw1.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[1]),uvDepth.z),0.);shadow+=uvw0.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[0],v[2]),uvDepth.z),0.);shadow+=uvw1.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[1],v[2]),uvDepth.z),0.);shadow+=uvw2.x*uvw2.y*TEXTUREFUNC(shadowSampler,vec3(base_uv.xy+vec2(u[2],v[2]),uvDepth.z),0.);shadow=shadow/144.;shadow=mix(darkness,1.,shadow);return computeFallOff(shadow,clipSpace.xy,frustumEdgeFalloff);}}\nconst vec3 PoissonSamplers32[64]=vec3[64](\nvec3(0.06407013,0.05409927,0.),\nvec3(0.7366577,0.5789394,0.),\nvec3(-0.6270542,-0.5320278,0.),\nvec3(-0.4096107,0.8411095,0.),\nvec3(0.6849564,-0.4990818,0.),\nvec3(-0.874181,-0.04579735,0.),\nvec3(0.9989998,0.0009880066,0.),\nvec3(-0.004920578,-0.9151649,0.),\nvec3(0.1805763,0.9747483,0.),\nvec3(-0.2138451,0.2635818,0.),\nvec3(0.109845,0.3884785,0.),\nvec3(0.06876755,-0.3581074,0.),\nvec3(0.374073,-0.7661266,0.),\nvec3(0.3079132,-0.1216763,0.),\nvec3(-0.3794335,-0.8271583,0.),\nvec3(-0.203878,-0.07715034,0.),\nvec3(0.5912697,0.1469799,0.),\nvec3(-0.88069,0.3031784,0.),\nvec3(0.5040108,0.8283722,0.),\nvec3(-0.5844124,0.5494877,0.),\nvec3(0.6017799,-0.1726654,0.),\nvec3(-0.5554981,0.1559997,0.),\nvec3(-0.3016369,-0.3900928,0.),\nvec3(-0.5550632,-0.1723762,0.),\nvec3(0.925029,0.2995041,0.),\nvec3(-0.2473137,0.5538505,0.),\nvec3(0.9183037,-0.2862392,0.),\nvec3(0.2469421,0.6718712,0.),\nvec3(0.3916397,-0.4328209,0.),\nvec3(-0.03576927,-0.6220032,0.),\nvec3(-0.04661255,0.7995201,0.),\nvec3(0.4402924,0.3640312,0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.),\nvec3(0.)\n);const vec3 PoissonSamplers64[64]=vec3[64](\nvec3(-0.613392,0.617481,0.),\nvec3(0.170019,-0.040254,0.),\nvec3(-0.299417,0.791925,0.),\nvec3(0.645680,0.493210,0.),\nvec3(-0.651784,0.717887,0.),\nvec3(0.421003,0.027070,0.),\nvec3(-0.817194,-0.271096,0.),\nvec3(-0.705374,-0.668203,0.),\nvec3(0.977050,-0.108615,0.),\nvec3(0.063326,0.142369,0.),\nvec3(0.203528,0.214331,0.),\nvec3(-0.667531,0.326090,0.),\nvec3(-0.098422,-0.295755,0.),\nvec3(-0.885922,0.215369,0.),\nvec3(0.566637,0.605213,0.),\nvec3(0.039766,-0.396100,0.),\nvec3(0.751946,0.453352,0.),\nvec3(0.078707,-0.715323,0.),\nvec3(-0.075838,-0.529344,0.),\nvec3(0.724479,-0.580798,0.),\nvec3(0.222999,-0.215125,0.),\nvec3(-0.467574,-0.405438,0.),\nvec3(-0.248268,-0.814753,0.),\nvec3(0.354411,-0.887570,0.),\nvec3(0.175817,0.382366,0.),\nvec3(0.487472,-0.063082,0.),\nvec3(-0.084078,0.898312,0.),\nvec3(0.488876,-0.783441,0.),\nvec3(0.470016,0.217933,0.),\nvec3(-0.696890,-0.549791,0.),\nvec3(-0.149693,0.605762,0.),\nvec3(0.034211,0.979980,0.),\nvec3(0.503098,-0.308878,0.),\nvec3(-0.016205,-0.872921,0.),\nvec3(0.385784,-0.393902,0.),\nvec3(-0.146886,-0.859249,0.),\nvec3(0.643361,0.164098,0.),\nvec3(0.634388,-0.049471,0.),\nvec3(-0.688894,0.007843,0.),\nvec3(0.464034,-0.188818,0.),\nvec3(-0.440840,0.137486,0.),\nvec3(0.364483,0.511704,0.),\nvec3(0.034028,0.325968,0.),\nvec3(0.099094,-0.308023,0.),\nvec3(0.693960,-0.366253,0.),\nvec3(0.678884,-0.204688,0.),\nvec3(0.001801,0.780328,0.),\nvec3(0.145177,-0.898984,0.),\nvec3(0.062655,-0.611866,0.),\nvec3(0.315226,-0.604297,0.),\nvec3(-0.780145,0.486251,0.),\nvec3(-0.371868,0.882138,0.),\nvec3(0.200476,0.494430,0.),\nvec3(-0.494552,-0.711051,0.),\nvec3(0.612476,0.705252,0.),\nvec3(-0.578845,-0.768792,0.),\nvec3(-0.772454,-0.090976,0.),\nvec3(0.504440,0.372295,0.),\nvec3(0.155736,0.065157,0.),\nvec3(0.391522,0.849605,0.),\nvec3(-0.620106,-0.328104,0.),\nvec3(0.789239,-0.419965,0.),\nvec3(-0.545396,0.538133,0.),\nvec3(-0.178564,-0.596057,0.)\n);\n#define inline\nfloat computeShadowWithCSMPCSS(float layer,vec4 vPositionFromLight,float depthMetric,highp sampler2DArray depthSampler,highp sampler2DArrayShadow shadowSampler,float shadowMapSizeInverse,float lightSizeUV,float darkness,float frustumEdgeFalloff,int searchTapCount,int pcfTapCount,vec3[64] poissonSamplers,vec2 lightSizeUVCorrection,float depthCorrection,float penumbraDarkness)\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=clamp(ZINCLIP,0.,GREATEST_LESS_THAN_ONE);vec4 uvDepthLayer=vec4(uvDepth.x,uvDepth.y,layer,uvDepth.z);float blockerDepth=0.0;float sumBlockerDepth=0.0;float numBlocker=0.0;for (int i=0; i1.0 || depthMetric<0.0) {return 1.0;}\nelse\n{vec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;vec3 uvDepth=vec3(0.5*clipSpace.xyz+vec3(0.5));uvDepth.z=ZINCLIP;float blockerDepth=0.0;float sumBlockerDepth=0.0;float numBlocker=0.0;for (int i=0; i(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_SAMPLERNAME_,bump)\n#endif\n#if defined(DETAIL)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_SAMPLERNAME_,detail)\n#endif\n#if defined(BUMP) && defined(PARALLAX)\nconst float minSamples=4.;const float maxSamples=15.;const int iMaxSamples=15;vec2 parallaxOcclusion(vec3 vViewDirCoT,vec3 vNormalCoT,vec2 texCoord,float parallaxScale) {float parallaxLimit=length(vViewDirCoT.xy)/vViewDirCoT.z;parallaxLimit*=parallaxScale;vec2 vOffsetDir=normalize(vViewDirCoT.xy);vec2 vMaxOffset=vOffsetDir*parallaxLimit;float numSamples=maxSamples+(dot(vViewDirCoT,vNormalCoT)*(minSamples-maxSamples));float stepSize=1.0/numSamples;float currRayHeight=1.0;vec2 vCurrOffset=vec2(0,0);vec2 vLastOffset=vec2(0,0);float lastSampledHeight=1.0;float currSampledHeight=1.0;bool keepWorking=true;for (int i=0; icurrRayHeight)\n{float delta1=currSampledHeight-currRayHeight;float delta2=(currRayHeight+stepSize)-lastSampledHeight;float ratio=delta1/(delta1+delta2);vCurrOffset=(ratio)* vLastOffset+(1.0-ratio)*vCurrOffset;keepWorking=false;}\nelse\n{currRayHeight-=stepSize;vLastOffset=vCurrOffset;\n#ifdef PARALLAX_RHS\nvCurrOffset-=stepSize*vMaxOffset;\n#else\nvCurrOffset+=stepSize*vMaxOffset;\n#endif\nlastSampledHeight=currSampledHeight;}}\nreturn vCurrOffset;}\nvec2 parallaxOffset(vec3 viewDir,float heightScale)\n{float height=texture2D(bumpSampler,vBumpUV).w;vec2 texCoordOffset=heightScale*viewDir.xy*height;\n#ifdef PARALLAX_RHS\nreturn texCoordOffset;\n#else\nreturn -texCoordOffset;\n#endif\n}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bumpFragmentFunctions = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"clipPlaneFragmentDeclaration\";\nconst shader = `#ifdef CLIPPLANE\nvarying float fClipDistance;\n#endif\n#ifdef CLIPPLANE2\nvarying float fClipDistance2;\n#endif\n#ifdef CLIPPLANE3\nvarying float fClipDistance3;\n#endif\n#ifdef CLIPPLANE4\nvarying float fClipDistance4;\n#endif\n#ifdef CLIPPLANE5\nvarying float fClipDistance5;\n#endif\n#ifdef CLIPPLANE6\nvarying float fClipDistance6;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const clipPlaneFragmentDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"logDepthDeclaration\";\nconst shader = `#ifdef LOGARITHMICDEPTH\nuniform float logarithmicDepthConstant;varying float vFragmentDepth;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const logDepthDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"fogFragmentDeclaration\";\nconst shader = `#ifdef FOG\n#define FOGMODE_NONE 0.\n#define FOGMODE_EXP 1.\n#define FOGMODE_EXP2 2.\n#define FOGMODE_LINEAR 3.\n#define E 2.71828\nuniform vec4 vFogInfos;uniform vec3 vFogColor;varying vec3 vFogDistance;float CalcFogFactor()\n{float fogCoeff=1.0;float fogStart=vFogInfos.y;float fogEnd=vFogInfos.z;float fogDensity=vFogInfos.w;float fogDistance=length(vFogDistance);if (FOGMODE_LINEAR==vFogInfos.x)\n{fogCoeff=(fogEnd-fogDistance)/(fogEnd-fogStart);}\nelse if (FOGMODE_EXP==vFogInfos.x)\n{fogCoeff=1.0/pow(E,fogDistance*fogDensity);}\nelse if (FOGMODE_EXP2==vFogInfos.x)\n{fogCoeff=1.0/pow(E,fogDistance*fogDistance*fogDensity*fogDensity);}\nreturn clamp(fogCoeff,0.0,1.0);}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const fogFragmentDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"clipPlaneFragment\";\nconst shader = `#if defined(CLIPPLANE) || defined(CLIPPLANE2) || defined(CLIPPLANE3) || defined(CLIPPLANE4) || defined(CLIPPLANE5) || defined(CLIPPLANE6)\nif (false) {}\n#endif\n#ifdef CLIPPLANE\nelse if (fClipDistance>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE2\nelse if (fClipDistance2>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE3\nelse if (fClipDistance3>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE4\nelse if (fClipDistance4>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE5\nelse if (fClipDistance5>0.0)\n{discard;}\n#endif\n#ifdef CLIPPLANE6\nelse if (fClipDistance6>0.0)\n{discard;}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const clipPlaneFragment = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bumpFragment\";\nconst shader = `vec2 uvOffset=vec2(0.0,0.0);\n#if defined(BUMP) || defined(PARALLAX) || defined(DETAIL)\n#ifdef NORMALXYSCALE\nfloat normalScale=1.0;\n#elif defined(BUMP)\nfloat normalScale=vBumpInfos.y;\n#else\nfloat normalScale=1.0;\n#endif\n#if defined(TANGENT) && defined(NORMAL)\nmat3 TBN=vTBN;\n#elif defined(BUMP)\nvec2 TBNUV=gl_FrontFacing ? vBumpUV : -vBumpUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vTangentSpaceParams);\n#else\nvec2 TBNUV=gl_FrontFacing ? vDetailUV : -vDetailUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vec2(1.,1.));\n#endif\n#elif defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL)\nmat3 TBN=vTBN;\n#else\nvec2 TBNUV=gl_FrontFacing ? vMainUV1 : -vMainUV1;mat3 TBN=cotangent_frame(normalW,vPositionW,TBNUV,vec2(1.,1.));\n#endif\n#endif\n#ifdef PARALLAX\nmat3 invTBN=transposeMat3(TBN);\n#ifdef PARALLAXOCCLUSION\nuvOffset=parallaxOcclusion(invTBN*-viewDirectionW,invTBN*normalW,vBumpUV,vBumpInfos.z);\n#else\nuvOffset=parallaxOffset(invTBN*viewDirectionW,vBumpInfos.z);\n#endif\n#endif\n#ifdef DETAIL\nvec4 detailColor=texture2D(detailSampler,vDetailUV+uvOffset);vec2 detailNormalRG=detailColor.wy*2.0-1.0;float detailNormalB=sqrt(1.-saturate(dot(detailNormalRG,detailNormalRG)));vec3 detailNormal=vec3(detailNormalRG,detailNormalB);\n#endif\n#ifdef BUMP\n#ifdef OBJECTSPACE_NORMALMAP\n#define CUSTOM_FRAGMENT_BUMP_FRAGMENT\nnormalW=normalize(texture2D(bumpSampler,vBumpUV).xyz *2.0-1.0);normalW=normalize(mat3(normalMatrix)*normalW);\n#elif !defined(DETAIL)\nnormalW=perturbNormal(TBN,texture2D(bumpSampler,vBumpUV+uvOffset).xyz,vBumpInfos.y);\n#else\nvec3 bumpNormal=texture2D(bumpSampler,vBumpUV+uvOffset).xyz*2.0-1.0;\n#if DETAIL_NORMALBLENDMETHOD==0 \ndetailNormal.xy*=vDetailInfos.z;vec3 blendedNormal=normalize(vec3(bumpNormal.xy+detailNormal.xy,bumpNormal.z*detailNormal.z));\n#elif DETAIL_NORMALBLENDMETHOD==1 \ndetailNormal.xy*=vDetailInfos.z;bumpNormal+=vec3(0.0,0.0,1.0);detailNormal*=vec3(-1.0,-1.0,1.0);vec3 blendedNormal=bumpNormal*dot(bumpNormal,detailNormal)/bumpNormal.z-detailNormal;\n#endif\nnormalW=perturbNormalBase(TBN,blendedNormal,vBumpInfos.y);\n#endif\n#elif defined(DETAIL)\ndetailNormal.xy*=vDetailInfos.z;normalW=perturbNormalBase(TBN,detailNormal,vDetailInfos.z);\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bumpFragment = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"decalFragment\";\nconst shader = `#ifdef DECAL\n#ifdef GAMMADECAL\ndecalColor.rgb=toLinearSpace(decalColor.rgb);\n#endif\n#ifdef DECAL_SMOOTHALPHA\ndecalColor.a*=decalColor.a;\n#endif\nsurfaceAlbedo.rgb=mix(surfaceAlbedo.rgb,decalColor.rgb,decalColor.a);\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const decalFragment = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"depthPrePass\";\nconst shader = `#ifdef DEPTHPREPASS\ngl_FragColor=vec4(0.,0.,0.,1.0);return;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const depthPrePass = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightFragment\";\nconst shader = `#ifdef LIGHT{X}\n#if defined(SHADOWONLY) || defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X}) && defined(LIGHTMAPNOSPECULAR{X})\n#else\n#ifdef PBR\n#ifdef SPOTLIGHT{X}\npreInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(POINTLIGHT{X})\npreInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(HEMILIGHT{X})\npreInfo=computeHemisphericPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(DIRLIGHT{X})\npreInfo=computeDirectionalPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#endif\npreInfo.NdotV=NdotV;\n#ifdef SPOTLIGHT{X}\n#ifdef LIGHT_FALLOFF_GLTF{X}\npreInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff_GLTF(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);\n#elif defined(LIGHT_FALLOFF_PHYSICAL{X})\npreInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);preInfo.attenuation*=computeDirectionalLightFalloff_Physical(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w);\n#elif defined(LIGHT_FALLOFF_STANDARD{X})\npreInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);preInfo.attenuation*=computeDirectionalLightFalloff_Standard(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w);\n#else\npreInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);preInfo.attenuation*=computeDirectionalLightFalloff(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);\n#endif\n#elif defined(POINTLIGHT{X})\n#ifdef LIGHT_FALLOFF_GLTF{X}\npreInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);\n#elif defined(LIGHT_FALLOFF_PHYSICAL{X})\npreInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);\n#elif defined(LIGHT_FALLOFF_STANDARD{X})\npreInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);\n#else\npreInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);\n#endif\n#else\npreInfo.attenuation=1.0;\n#endif\n#ifdef HEMILIGHT{X}\npreInfo.roughness=roughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(roughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\n#ifdef IRIDESCENCE\npreInfo.iridescenceIntensity=iridescenceIntensity;\n#endif\n#ifdef HEMILIGHT{X}\ninfo.diffuse=computeHemisphericDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb,light{X}.vLightGround);\n#elif defined(SS_TRANSLUCENCY)\ninfo.diffuse=computeDiffuseAndTransmittedLighting(preInfo,light{X}.vLightDiffuse.rgb,subSurfaceOut.transmittance);\n#else\ninfo.diffuse=computeDiffuseLighting(preInfo,light{X}.vLightDiffuse.rgb);\n#endif\n#ifdef SPECULARTERM\n#ifdef ANISOTROPIC\ninfo.specular=computeAnisotropicSpecularLighting(preInfo,viewDirectionW,normalW,anisotropicOut.anisotropicTangent,anisotropicOut.anisotropicBitangent,anisotropicOut.anisotropy,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);\n#else\ninfo.specular=computeSpecularLighting(preInfo,normalW,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);\n#endif\n#endif\n#ifdef SHEEN\n#ifdef SHEEN_LINKWITHALBEDO\npreInfo.roughness=sheenOut.sheenIntensity;\n#else\n#ifdef HEMILIGHT{X}\npreInfo.roughness=sheenOut.sheenRoughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(sheenOut.sheenRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\n#endif\ninfo.sheen=computeSheenLighting(preInfo,normalW,sheenOut.sheenColor,specularEnvironmentR90,AARoughnessFactors.x,light{X}.vLightDiffuse.rgb);\n#endif\n#ifdef CLEARCOAT\n#ifdef HEMILIGHT{X}\npreInfo.roughness=clearcoatOut.clearCoatRoughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(clearcoatOut.clearCoatRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\ninfo.clearCoat=computeClearCoatLighting(preInfo,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatAARoughnessFactors.x,clearcoatOut.clearCoatIntensity,light{X}.vLightDiffuse.rgb);\n#ifdef CLEARCOAT_TINT\nabsorption=computeClearCoatLightingAbsorption(clearcoatOut.clearCoatNdotVRefract,preInfo.L,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatColor,clearcoatOut.clearCoatThickness,clearcoatOut.clearCoatIntensity);info.diffuse*=absorption;\n#ifdef SPECULARTERM\ninfo.specular*=absorption;\n#endif\n#endif\ninfo.diffuse*=info.clearCoat.w;\n#ifdef SPECULARTERM\ninfo.specular*=info.clearCoat.w;\n#endif\n#ifdef SHEEN\ninfo.sheen*=info.clearCoat.w;\n#endif\n#endif\n#else\n#ifdef SPOTLIGHT{X}\ninfo=computeSpotLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDirection,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness);\n#elif defined(HEMILIGHT{X})\ninfo=computeHemisphericLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightGround,glossiness);\n#elif defined(POINTLIGHT{X}) || defined(DIRLIGHT{X})\ninfo=computeLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightDiffuse.a,glossiness);\n#endif\n#endif\n#ifdef PROJECTEDLIGHTTEXTURE{X}\ninfo.diffuse*=computeProjectionTextureDiffuseLighting(projectionLightSampler{X},textureProjectionMatrix{X});\n#endif\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nfor (int i=0; i=0.) {index{X}=i;break;}}\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nif (index{X}>=0)\n#endif\n{\n#if defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#else\nshadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#endif\n#else\nshadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nshadowDebug{X}=vec3(shadow)*vCascadeColorsMultiplier{X}[index{X}];\n#endif\n#ifndef SHADOWCSMNOBLEND{X}\nfloat frustumLength=frustumLengths{X}[index{X}];float diffRatio=clamp(diff{X}/frustumLength,0.,1.)*cascadeBlendFactor{X};if (index{X}<(SHADOWCSMNUM_CASCADES{X}-1) && diffRatio<1.)\n{index{X}+=1;float nextShadow=0.;\n#if defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nnextShadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nnextShadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nnextShadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nnextShadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#elif defined(SHADOWMEDIUMQUALITY{X})\nnextShadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#else\nnextShadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#endif\n#else\nnextShadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\nshadow=mix(nextShadow,shadow,diffRatio);\n#ifdef SHADOWCSMDEBUG{X}\nshadowDebug{X}=mix(vec3(nextShadow)*vCascadeColorsMultiplier{X}[index{X}],shadowDebug{X},diffRatio);\n#endif\n}\n#endif\n}\n#elif defined(SHADOWCLOSEESM{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithCloseESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);\n#else\nshadow=computeShadowWithCloseESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWESM{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithESMCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);\n#else\nshadow=computeShadowWithESM(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPOISSON{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithPoissonSamplingCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.depthValues);\n#else\nshadow=computeShadowWithPoissonSampling(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithPCF1(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithPCF3(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithPCF5(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithPCSS16(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithPCSS32(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithPCSS64(vPositionFromLight{X},vDepthMetric{X},depthSampler{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#else\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowCube(vPositionW,light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.x,light{X}.depthValues);\n#else\nshadow=computeShadow(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#endif\n#ifdef SHADOWONLY\n#ifndef SHADOWINUSE\n#define SHADOWINUSE\n#endif\nglobalShadow+=shadow;shadowLightCount+=1.0;\n#endif\n#else\nshadow=1.;\n#endif\naggShadow+=shadow;numLights+=1.0;\n#ifndef SHADOWONLY\n#ifdef CUSTOMUSERLIGHTING\ndiffuseBase+=computeCustomDiffuseLighting(info,diffuseBase,shadow);\n#ifdef SPECULARTERM\nspecularBase+=computeCustomSpecularLighting(info,specularBase,shadow);\n#endif\n#elif defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X})\ndiffuseBase+=lightmapColor.rgb*shadow;\n#ifdef SPECULARTERM\n#ifndef LIGHTMAPNOSPECULAR{X}\nspecularBase+=info.specular*shadow*lightmapColor.rgb;\n#endif\n#endif\n#ifdef CLEARCOAT\n#ifndef LIGHTMAPNOSPECULAR{X}\nclearCoatBase+=info.clearCoat.rgb*shadow*lightmapColor.rgb;\n#endif\n#endif\n#ifdef SHEEN\n#ifndef LIGHTMAPNOSPECULAR{X}\nsheenBase+=info.sheen.rgb*shadow;\n#endif\n#endif\n#else\n#ifdef SHADOWCSMDEBUG{X}\ndiffuseBase+=info.diffuse*shadowDebug{X};\n#else \ndiffuseBase+=info.diffuse*shadow;\n#endif\n#ifdef SPECULARTERM\nspecularBase+=info.specular*shadow;\n#endif\n#ifdef CLEARCOAT\nclearCoatBase+=info.clearCoat.rgb*shadow;\n#endif\n#ifdef SHEEN\nsheenBase+=info.sheen.rgb*shadow;\n#endif\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const lightFragment = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"logDepthFragment\";\nconst shader = `#ifdef LOGARITHMICDEPTH\ngl_FragDepthEXT=log2(vFragmentDepth)*logarithmicDepthConstant*0.5;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const logDepthFragment = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"fogFragment\";\nconst shader = `#ifdef FOG\nfloat fog=CalcFogFactor();\n#ifdef PBR\nfog=toLinearSpace(fog);\n#endif\ncolor.rgb=mix(vFogColor,color.rgb,fog);\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const fogFragment = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"oitFragment\";\nconst shader = `#ifdef ORDER_INDEPENDENT_TRANSPARENCY\nfloat fragDepth=gl_FragCoord.z; \n#ifdef ORDER_INDEPENDENT_TRANSPARENCY_16BITS\nuint halfFloat=packHalf2x16(vec2(fragDepth));vec2 full=unpackHalf2x16(halfFloat);fragDepth=full.x;\n#endif\nivec2 fragCoord=ivec2(gl_FragCoord.xy);vec2 lastDepth=texelFetch(oitDepthSampler,fragCoord,0).rg;vec4 lastFrontColor=texelFetch(oitFrontColorSampler,fragCoord,0);depth.rg=vec2(-MAX_DEPTH);frontColor=lastFrontColor;backColor=vec4(0.0);\n#ifdef USE_REVERSE_DEPTHBUFFER\nfloat furthestDepth=-lastDepth.x;float nearestDepth=lastDepth.y;\n#else\nfloat nearestDepth=-lastDepth.x;float furthestDepth=lastDepth.y;\n#endif\nfloat alphaMultiplier=1.0-lastFrontColor.a;\n#ifdef USE_REVERSE_DEPTHBUFFER\nif (fragDepth>nearestDepth || fragDepthfurthestDepth) {\n#endif\nreturn;}\n#ifdef USE_REVERSE_DEPTHBUFFER\nif (fragDepthfurthestDepth) {\n#else\nif (fragDepth>nearestDepth && fragDepth\n#if defined(BUMP) || !defined(NORMAL)\n#extension GL_OES_standard_derivatives : enable\n#endif\n#include[SCENE_MRT_COUNT]\n#include\n#define CUSTOM_FRAGMENT_BEGIN\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#include[1..7]\n#include\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n#include\n#include\n#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse,_SAMPLERNAME_,diffuse)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_SAMPLERNAME_,ambient)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_SAMPLERNAME_,opacity)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_SAMPLERNAME_,emissive)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_SAMPLERNAME_,lightmap)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_SAMPLERNAME_,decal)\n#ifdef REFRACTION\n#ifdef REFRACTIONMAP_3D\nuniform samplerCube refractionCubeSampler;\n#else\nuniform sampler2D refraction2DSampler;\n#endif\n#endif\n#if defined(SPECULARTERM)\n#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular,_SAMPLERNAME_,specular)\n#endif\n#include\n#ifdef REFLECTION\n#ifdef REFLECTIONMAP_3D\nuniform samplerCube reflectionCubeSampler;\n#else\nuniform sampler2D reflection2DSampler;\n#endif\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#else\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#endif\n#include\n#endif\n#include\n#include\n#include\n#include\n#include\n#include\n#include\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include\nvec3 viewDirectionW=normalize(vEyePosition.xyz-vPositionW);vec4 baseColor=vec4(1.,1.,1.,1.);vec3 diffuseColor=vDiffuseColor.rgb;float alpha=vDiffuseColor.a;\n#ifdef NORMAL\nvec3 normalW=normalize(vNormalW);\n#else\nvec3 normalW=normalize(-cross(dFdx(vPositionW),dFdy(vPositionW)));\n#endif\n#include\n#ifdef TWOSIDEDLIGHTING\nnormalW=gl_FrontFacing ? normalW : -normalW;\n#endif\n#ifdef DIFFUSE\nbaseColor=texture2D(diffuseSampler,vDiffuseUV+uvOffset);\n#if defined(ALPHATEST) && !defined(ALPHATEST_AFTERALLALPHACOMPUTATIONS)\nif (baseColor.a(surfaceAlbedo,baseColor,GAMMADECAL,_GAMMADECAL_NOTUSED_)\n#endif\n#include\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nbaseColor.rgb*=vColor.rgb;\n#endif\n#ifdef DETAIL\nbaseColor.rgb=baseColor.rgb*2.0*mix(0.5,detailColor.r,vDetailInfos.y);\n#endif\n#if defined(DECAL) && defined(DECAL_AFTER_DETAIL)\nvec4 decalColor=texture2D(decalSampler,vDecalUV+uvOffset);\n#include(surfaceAlbedo,baseColor,GAMMADECAL,_GAMMADECAL_NOTUSED_)\n#endif\n#define CUSTOM_FRAGMENT_UPDATE_DIFFUSE\nvec3 baseAmbientColor=vec3(1.,1.,1.);\n#ifdef AMBIENT\nbaseAmbientColor=texture2D(ambientSampler,vAmbientUV+uvOffset).rgb*vAmbientInfos.y;\n#endif\n#define CUSTOM_FRAGMENT_BEFORE_LIGHTS\n#ifdef SPECULARTERM\nfloat glossiness=vSpecularColor.a;vec3 specularColor=vSpecularColor.rgb;\n#ifdef SPECULAR\nvec4 specularMapColor=texture2D(specularSampler,vSpecularUV+uvOffset);specularColor=specularMapColor.rgb;\n#ifdef GLOSSINESS\nglossiness=glossiness*specularMapColor.a;\n#endif\n#endif\n#else\nfloat glossiness=0.;\n#endif\nvec3 diffuseBase=vec3(0.,0.,0.);lightingInfo info;\n#ifdef SPECULARTERM\nvec3 specularBase=vec3(0.,0.,0.);\n#endif\nfloat shadow=1.;float aggShadow=0.;float numLights=0.;\n#ifdef LIGHTMAP\nvec4 lightmapColor=texture2D(lightmapSampler,vLightmapUV+uvOffset);\n#ifdef RGBDLIGHTMAP\nlightmapColor.rgb=fromRGBD(lightmapColor);\n#endif\nlightmapColor.rgb*=vLightmapInfos.y;\n#endif\n#include[0..maxSimultaneousLights]\naggShadow=aggShadow/numLights;vec4 refractionColor=vec4(0.,0.,0.,1.);\n#ifdef REFRACTION\nvec3 refractionVector=normalize(refract(-viewDirectionW,normalW,vRefractionInfos.y));\n#ifdef REFRACTIONMAP_3D\n#ifdef USE_LOCAL_REFRACTIONMAP_CUBIC\nrefractionVector=parallaxCorrectNormal(vPositionW,refractionVector,vRefractionSize,vRefractionPosition);\n#endif\nrefractionVector.y=refractionVector.y*vRefractionInfos.w;vec4 refractionLookup=textureCube(refractionCubeSampler,refractionVector);if (dot(refractionVector,viewDirectionW)<1.0) {refractionColor=refractionLookup;}\n#else\nvec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*vRefractionInfos.z,1.0)));vec2 refractionCoords=vRefractionUVW.xy/vRefractionUVW.z;refractionCoords.y=1.0-refractionCoords.y;refractionColor=texture2D(refraction2DSampler,refractionCoords);\n#endif\n#ifdef RGBDREFRACTION\nrefractionColor.rgb=fromRGBD(refractionColor);\n#endif\n#ifdef IS_REFRACTION_LINEAR\nrefractionColor.rgb=toGammaSpace(refractionColor.rgb);\n#endif\nrefractionColor.rgb*=vRefractionInfos.x;\n#endif\nvec4 reflectionColor=vec4(0.,0.,0.,1.);\n#ifdef REFLECTION\nvec3 vReflectionUVW=computeReflectionCoords(vec4(vPositionW,1.0),normalW);\n#ifdef REFLECTIONMAP_OPPOSITEZ\nvReflectionUVW.z*=-1.0;\n#endif\n#ifdef REFLECTIONMAP_3D\n#ifdef ROUGHNESS\nfloat bias=vReflectionInfos.y;\n#ifdef SPECULARTERM\n#ifdef SPECULAR\n#ifdef GLOSSINESS\nbias*=(1.0-specularMapColor.a);\n#endif\n#endif\n#endif\nreflectionColor=textureCube(reflectionCubeSampler,vReflectionUVW,bias);\n#else\nreflectionColor=textureCube(reflectionCubeSampler,vReflectionUVW);\n#endif\n#else\nvec2 coords=vReflectionUVW.xy;\n#ifdef REFLECTIONMAP_PROJECTION\ncoords/=vReflectionUVW.z;\n#endif\ncoords.y=1.0-coords.y;reflectionColor=texture2D(reflection2DSampler,coords);\n#endif\n#ifdef RGBDREFLECTION\nreflectionColor.rgb=fromRGBD(reflectionColor);\n#endif\n#ifdef IS_REFLECTION_LINEAR\nreflectionColor.rgb=toGammaSpace(reflectionColor.rgb);\n#endif\nreflectionColor.rgb*=vReflectionInfos.x;\n#ifdef REFLECTIONFRESNEL\nfloat reflectionFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,reflectionRightColor.a,reflectionLeftColor.a);\n#ifdef REFLECTIONFRESNELFROMSPECULAR\n#ifdef SPECULARTERM\nreflectionColor.rgb*=specularColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#else\nreflectionColor.rgb*=reflectionLeftColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#endif\n#else\nreflectionColor.rgb*=reflectionLeftColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#endif\n#endif\n#endif\n#ifdef REFRACTIONFRESNEL\nfloat refractionFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,refractionRightColor.a,refractionLeftColor.a);refractionColor.rgb*=refractionLeftColor.rgb*(1.0-refractionFresnelTerm)+refractionFresnelTerm*refractionRightColor.rgb;\n#endif\n#ifdef OPACITY\nvec4 opacityMap=texture2D(opacitySampler,vOpacityUV+uvOffset);\n#ifdef OPACITYRGB\nopacityMap.rgb=opacityMap.rgb*vec3(0.3,0.59,0.11);alpha*=(opacityMap.x+opacityMap.y+opacityMap.z)* vOpacityInfos.y;\n#else\nalpha*=opacityMap.a*vOpacityInfos.y;\n#endif\n#endif\n#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nalpha*=vColor.a;\n#endif\n#ifdef OPACITYFRESNEL\nfloat opacityFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,opacityParts.z,opacityParts.w);alpha+=opacityParts.x*(1.0-opacityFresnelTerm)+opacityFresnelTerm*opacityParts.y;\n#endif\n#ifdef ALPHATEST\n#ifdef ALPHATEST_AFTERALLALPHACOMPUTATIONS\nif (alpha\n#include\n#ifdef IMAGEPROCESSINGPOSTPROCESS\ncolor.rgb=toLinearSpace(color.rgb);\n#else\n#ifdef IMAGEPROCESSING\ncolor.rgb=toLinearSpace(color.rgb);color=applyImageProcessing(color);\n#endif\n#endif\ncolor.a*=visibility;\n#ifdef PREMULTIPLYALPHA\ncolor.rgb*=color.a;\n#endif\n#define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\n#ifdef PREPASS\nfloat writeGeometryInfo=color.a>0.4 ? 1.0 : 0.0;gl_FragData[0]=color; \n#ifdef PREPASS_POSITION\ngl_FragData[PREPASS_POSITION_INDEX]=vec4(vPositionW,writeGeometryInfo);\n#endif\n#ifdef PREPASS_VELOCITY\nvec2 a=(vCurrentPosition.xy/vCurrentPosition.w)*0.5+0.5;vec2 b=(vPreviousPosition.xy/vPreviousPosition.w)*0.5+0.5;vec2 velocity=abs(a-b);velocity=vec2(pow(velocity.x,1.0/3.0),pow(velocity.y,1.0/3.0))*sign(a-b)*0.5+0.5;gl_FragData[PREPASS_VELOCITY_INDEX]=vec4(velocity,0.0,writeGeometryInfo);\n#endif\n#ifdef PREPASS_IRRADIANCE\ngl_FragData[PREPASS_IRRADIANCE_INDEX]=vec4(0.0,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_DEPTH\ngl_FragData[PREPASS_DEPTH_INDEX]=vec4(vViewPos.z,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_NORMAL\n#ifdef PREPASS_NORMAL_WORLDSPACE\ngl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalW,writeGeometryInfo); \n#else\ngl_FragData[PREPASS_NORMAL_INDEX]=vec4(normalize((view*vec4(normalW,0.0)).rgb),writeGeometryInfo); \n#endif\n#endif\n#ifdef PREPASS_ALBEDO_SQRT\ngl_FragData[PREPASS_ALBEDO_SQRT_INDEX]=vec4(0.0,0.0,0.0,writeGeometryInfo); \n#endif\n#ifdef PREPASS_REFLECTIVITY\n#if defined(SPECULARTERM)\n#if defined(SPECULAR)\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(toLinearSpace(specularMapColor))*writeGeometryInfo; \n#else\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(toLinearSpace(specularColor),1.0)*writeGeometryInfo;\n#endif\n#else\ngl_FragData[PREPASS_REFLECTIVITY_INDEX]=vec4(0.0,0.0,0.0,1.0)*writeGeometryInfo;\n#endif\n#endif\n#endif\n#if !defined(PREPASS) || defined(WEBGL2)\ngl_FragColor=color;\n#endif\n#include\n#if ORDER_INDEPENDENT_TRANSPARENCY\nif (fragDepth==nearestDepth) {frontColor.rgb+=color.rgb*color.a*alphaMultiplier;frontColor.a=1.0-alphaMultiplier*(1.0-color.a);} else {backColor+=color;}\n#endif\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const defaultPixelShader = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"decalVertexDeclaration\";\nconst shader = `#ifdef DECAL\nuniform vec4 vDecalInfos;uniform mat4 decalMatrix;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const decalVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nimport \"./decalVertexDeclaration\";\n\nconst name = \"defaultVertexDeclaration\";\nconst shader = `uniform mat4 viewProjection;uniform mat4 view;\n#ifdef DIFFUSE\nuniform mat4 diffuseMatrix;uniform vec2 vDiffuseInfos;\n#endif\n#ifdef AMBIENT\nuniform mat4 ambientMatrix;uniform vec2 vAmbientInfos;\n#endif\n#ifdef OPACITY\nuniform mat4 opacityMatrix;uniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;uniform mat4 emissiveMatrix;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;uniform mat4 lightmapMatrix;\n#endif\n#if defined(SPECULAR) && defined(SPECULARTERM)\nuniform vec2 vSpecularInfos;uniform mat4 specularMatrix;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;uniform mat4 bumpMatrix;\n#endif\n#ifdef REFLECTION\nuniform mat4 reflectionMatrix;\n#endif\n#ifdef POINTSIZE\nuniform float pointSize;\n#endif\n#ifdef DETAIL\nuniform vec4 vDetailInfos;uniform mat4 detailMatrix;\n#endif\n#include\n#define ADDITIONAL_VERTEX_DECLARATION\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const defaultVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"uvAttributeDeclaration\";\nconst shader = `#ifdef UV{X}\nattribute vec2 uv{X};\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const uvAttributeDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bonesDeclaration\";\nconst shader = `#if NUM_BONE_INFLUENCERS>0\nattribute vec4 matricesIndices;attribute vec4 matricesWeights;\n#if NUM_BONE_INFLUENCERS>4\nattribute vec4 matricesIndicesExtra;attribute vec4 matricesWeightsExtra;\n#endif\n#ifndef BAKED_VERTEX_ANIMATION_TEXTURE\n#ifdef BONETEXTURE\nuniform highp sampler2D boneSampler;uniform float boneTextureWidth;\n#else\nuniform mat4 mBones[BonesPerMesh];\n#endif\n#ifdef BONES_VELOCITY_ENABLED\nuniform mat4 mPreviousBones[BonesPerMesh];\n#endif\n#ifdef BONETEXTURE\n#define inline\nmat4 readMatrixFromRawSampler(sampler2D smp,float index)\n{float offset=index *4.0;float dx=1.0/boneTextureWidth;vec4 m0=texture2D(smp,vec2(dx*(offset+0.5),0.));vec4 m1=texture2D(smp,vec2(dx*(offset+1.5),0.));vec4 m2=texture2D(smp,vec2(dx*(offset+2.5),0.));vec4 m3=texture2D(smp,vec2(dx*(offset+3.5),0.));return mat4(m0,m1,m2,m3);}\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bonesDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bakedVertexAnimationDeclaration\";\nconst shader = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE\nuniform float bakedVertexAnimationTime;uniform vec2 bakedVertexAnimationTextureSizeInverted;uniform vec4 bakedVertexAnimationSettings;uniform sampler2D bakedVertexAnimationTexture;\n#ifdef INSTANCES\nattribute vec4 bakedVertexAnimationSettingsInstanced;\n#endif\n#define inline\nmat4 readMatrixFromRawSamplerVAT(sampler2D smp,float index,float frame)\n{float offset=index*4.0;float frameUV=(frame+0.5)*bakedVertexAnimationTextureSizeInverted.y;float dx=bakedVertexAnimationTextureSizeInverted.x;vec4 m0=texture2D(smp,vec2(dx*(offset+0.5),frameUV));vec4 m1=texture2D(smp,vec2(dx*(offset+1.5),frameUV));vec4 m2=texture2D(smp,vec2(dx*(offset+2.5),frameUV));vec4 m3=texture2D(smp,vec2(dx*(offset+3.5),frameUV));return mat4(m0,m1,m2,m3);}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bakedVertexAnimationDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"instancesDeclaration\";\nconst shader = `#ifdef INSTANCES\nattribute vec4 world0;attribute vec4 world1;attribute vec4 world2;attribute vec4 world3;\n#ifdef INSTANCESCOLOR\nattribute vec4 instanceColor;\n#endif\n#if defined(THIN_INSTANCES) && !defined(WORLD_UBO)\nuniform mat4 world;\n#endif\n#if defined(VELOCITY) || defined(PREPASS_VELOCITY)\nattribute vec4 previousWorld0;attribute vec4 previousWorld1;attribute vec4 previousWorld2;attribute vec4 previousWorld3;\n#ifdef THIN_INSTANCES\nuniform mat4 previousWorld;\n#endif\n#endif\n#else\n#if !defined(WORLD_UBO)\nuniform mat4 world;\n#endif\n#if defined(VELOCITY) || defined(PREPASS_VELOCITY)\nuniform mat4 previousWorld;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const instancesDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"prePassVertexDeclaration\";\nconst shader = `#ifdef PREPASS\n#ifdef PREPASS_DEPTH\nvarying vec3 vViewPos;\n#endif\n#ifdef PREPASS_VELOCITY\nuniform mat4 previousViewProjection;varying vec4 vCurrentPosition;varying vec4 vPreviousPosition;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const prePassVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"samplerVertexDeclaration\";\nconst shader = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0\nvarying vec2 v_VARYINGNAME_UV;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const samplerVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bumpVertexDeclaration\";\nconst shader = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL) \nvarying mat3 vTBN;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bumpVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"clipPlaneVertexDeclaration\";\nconst shader = `#ifdef CLIPPLANE\nuniform vec4 vClipPlane;varying float fClipDistance;\n#endif\n#ifdef CLIPPLANE2\nuniform vec4 vClipPlane2;varying float fClipDistance2;\n#endif\n#ifdef CLIPPLANE3\nuniform vec4 vClipPlane3;varying float fClipDistance3;\n#endif\n#ifdef CLIPPLANE4\nuniform vec4 vClipPlane4;varying float fClipDistance4;\n#endif\n#ifdef CLIPPLANE5\nuniform vec4 vClipPlane5;varying float fClipDistance5;\n#endif\n#ifdef CLIPPLANE6\nuniform vec4 vClipPlane6;varying float fClipDistance6;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const clipPlaneVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"fogVertexDeclaration\";\nconst shader = `#ifdef FOG\nvarying vec3 vFogDistance;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const fogVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightVxFragmentDeclaration\";\nconst shader = `#ifdef LIGHT{X}\nuniform vec4 vLightData{X};uniform vec4 vLightDiffuse{X};\n#ifdef SPECULARTERM\nuniform vec4 vLightSpecular{X};\n#else\nvec4 vLightSpecular{X}=vec4(0.);\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#elif defined(SHADOWCUBE{X})\n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};uniform mat4 lightMatrix{X};\n#endif\nuniform vec4 shadowsInfo{X};uniform vec2 depthValues{X};\n#endif\n#ifdef SPOTLIGHT{X}\nuniform vec4 vLightDirection{X};uniform vec4 vLightFalloff{X};\n#elif defined(POINTLIGHT{X})\nuniform vec4 vLightFalloff{X};\n#elif defined(HEMILIGHT{X})\nuniform vec3 vLightGround{X};\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const lightVxFragmentDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightVxUboDeclaration\";\nconst shader = `#ifdef LIGHT{X}\nuniform Light{X}\n{vec4 vLightData;vec4 vLightDiffuse;vec4 vLightSpecular;\n#ifdef SPOTLIGHT{X}\nvec4 vLightDirection;vec4 vLightFalloff;\n#elif defined(POINTLIGHT{X})\nvec4 vLightFalloff;\n#elif defined(HEMILIGHT{X})\nvec3 vLightGround;\n#endif\nvec4 shadowsInfo;vec2 depthValues;} light{X};\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nuniform mat4 lightMatrix{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromLight{X}[SHADOWCSMNUM_CASCADES{X}];varying float vDepthMetric{X}[SHADOWCSMNUM_CASCADES{X}];varying vec4 vPositionFromCamera{X};\n#elif defined(SHADOWCUBE{X})\n#else\nvarying vec4 vPositionFromLight{X};varying float vDepthMetric{X};uniform mat4 lightMatrix{X};\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const lightVxUboDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"morphTargetsVertexGlobalDeclaration\";\nconst shader = `#ifdef MORPHTARGETS\nuniform float morphTargetInfluences[NUM_MORPH_INFLUENCERS];\n#ifdef MORPHTARGETS_TEXTURE \nuniform float morphTargetTextureIndices[NUM_MORPH_INFLUENCERS];uniform vec3 morphTargetTextureInfo;uniform highp sampler2DArray morphTargets;vec3 readVector3FromRawSampler(int targetIndex,float vertexIndex)\n{ \nfloat y=floor(vertexIndex/morphTargetTextureInfo.y);float x=vertexIndex-y*morphTargetTextureInfo.y;vec3 textureUV=vec3((x+0.5)/morphTargetTextureInfo.y,(y+0.5)/morphTargetTextureInfo.z,morphTargetTextureIndices[targetIndex]);return texture(morphTargets,textureUV).xyz;}\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const morphTargetsVertexGlobalDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"morphTargetsVertexDeclaration\";\nconst shader = `#ifdef MORPHTARGETS\n#ifndef MORPHTARGETS_TEXTURE\nattribute vec3 position{X};\n#ifdef MORPHTARGETS_NORMAL\nattribute vec3 normal{X};\n#endif\n#ifdef MORPHTARGETS_TANGENT\nattribute vec3 tangent{X};\n#endif\n#ifdef MORPHTARGETS_UV\nattribute vec2 uv_{X};\n#endif\n#elif {X}==0\nuniform int morphTargetCount;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const morphTargetsVertexDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"morphTargetsVertexGlobal\";\nconst shader = `#ifdef MORPHTARGETS\n#ifdef MORPHTARGETS_TEXTURE\nfloat vertexID;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const morphTargetsVertexGlobal = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"morphTargetsVertex\";\nconst shader = `#ifdef MORPHTARGETS\n#ifdef MORPHTARGETS_TEXTURE\n#if {X}==0\nfor (int i=0; i=morphTargetCount) break;vertexID=float(gl_VertexID)*morphTargetTextureInfo.x;positionUpdated+=(readVector3FromRawSampler(i,vertexID)-position)*morphTargetInfluences[i];vertexID+=1.0;\n#ifdef MORPHTARGETS_NORMAL\nnormalUpdated+=(readVector3FromRawSampler(i,vertexID) -normal)*morphTargetInfluences[i];vertexID+=1.0;\n#endif\n#ifdef MORPHTARGETS_UV\nuvUpdated+=(readVector3FromRawSampler(i,vertexID).xy-uv)*morphTargetInfluences[i];vertexID+=1.0;\n#endif\n#ifdef MORPHTARGETS_TANGENT\ntangentUpdated.xyz+=(readVector3FromRawSampler(i,vertexID) -tangent.xyz)*morphTargetInfluences[i];\n#endif\n}\n#endif\n#else\npositionUpdated+=(position{X}-position)*morphTargetInfluences[{X}];\n#ifdef MORPHTARGETS_NORMAL\nnormalUpdated+=(normal{X}-normal)*morphTargetInfluences[{X}];\n#endif\n#ifdef MORPHTARGETS_TANGENT\ntangentUpdated.xyz+=(tangent{X}-tangent.xyz)*morphTargetInfluences[{X}];\n#endif\n#ifdef MORPHTARGETS_UV\nuvUpdated+=(uv_{X}-uv)*morphTargetInfluences[{X}];\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const morphTargetsVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"instancesVertex\";\nconst shader = `#ifdef INSTANCES\nmat4 finalWorld=mat4(world0,world1,world2,world3);\n#if defined(PREPASS_VELOCITY) || defined(VELOCITY)\nmat4 finalPreviousWorld=mat4(previousWorld0,previousWorld1,previousWorld2,previousWorld3);\n#endif\n#ifdef THIN_INSTANCES\nfinalWorld=world*finalWorld;\n#if defined(PREPASS_VELOCITY) || defined(VELOCITY)\nfinalPreviousWorld=previousWorld*finalPreviousWorld;\n#endif\n#endif\n#else\nmat4 finalWorld=world;\n#if defined(PREPASS_VELOCITY) || defined(VELOCITY)\nmat4 finalPreviousWorld=previousWorld;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const instancesVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bonesVertex\";\nconst shader = `#ifndef BAKED_VERTEX_ANIMATION_TEXTURE\n#if NUM_BONE_INFLUENCERS>0\nmat4 influence;\n#ifdef BONETEXTURE\ninfluence=readMatrixFromRawSampler(boneSampler,matricesIndices[0])*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndices[1])*matricesWeights[1];\n#endif\n#if NUM_BONE_INFLUENCERS>2\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndices[2])*matricesWeights[2];\n#endif\n#if NUM_BONE_INFLUENCERS>3\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndices[3])*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[0])*matricesWeightsExtra[0];\n#endif\n#if NUM_BONE_INFLUENCERS>5\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[1])*matricesWeightsExtra[1];\n#endif\n#if NUM_BONE_INFLUENCERS>6\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[2])*matricesWeightsExtra[2];\n#endif\n#if NUM_BONE_INFLUENCERS>7\ninfluence+=readMatrixFromRawSampler(boneSampler,matricesIndicesExtra[3])*matricesWeightsExtra[3];\n#endif\n#else\ninfluence=mBones[int(matricesIndices[0])]*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\ninfluence+=mBones[int(matricesIndices[1])]*matricesWeights[1];\n#endif\n#if NUM_BONE_INFLUENCERS>2\ninfluence+=mBones[int(matricesIndices[2])]*matricesWeights[2];\n#endif\n#if NUM_BONE_INFLUENCERS>3\ninfluence+=mBones[int(matricesIndices[3])]*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\ninfluence+=mBones[int(matricesIndicesExtra[0])]*matricesWeightsExtra[0];\n#endif\n#if NUM_BONE_INFLUENCERS>5\ninfluence+=mBones[int(matricesIndicesExtra[1])]*matricesWeightsExtra[1];\n#endif\n#if NUM_BONE_INFLUENCERS>6\ninfluence+=mBones[int(matricesIndicesExtra[2])]*matricesWeightsExtra[2];\n#endif\n#if NUM_BONE_INFLUENCERS>7\ninfluence+=mBones[int(matricesIndicesExtra[3])]*matricesWeightsExtra[3];\n#endif\n#endif\nfinalWorld=finalWorld*influence;\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bonesVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bakedVertexAnimation\";\nconst shader = `#ifdef BAKED_VERTEX_ANIMATION_TEXTURE\n{\n#ifdef INSTANCES\n#define BVASNAME bakedVertexAnimationSettingsInstanced\n#else\n#define BVASNAME bakedVertexAnimationSettings\n#endif\nfloat VATStartFrame=BVASNAME.x;float VATEndFrame=BVASNAME.y;float VATOffsetFrame=BVASNAME.z;float VATSpeed=BVASNAME.w;float totalFrames=VATEndFrame-VATStartFrame+1.0;float time=bakedVertexAnimationTime*VATSpeed/totalFrames;float frameCorrection=time<1.0 ? 0.0 : 1.0;float numOfFrames=totalFrames-frameCorrection;float VATFrameNum=fract(time)*numOfFrames;VATFrameNum=mod(VATFrameNum+VATOffsetFrame,numOfFrames);VATFrameNum=floor(VATFrameNum);VATFrameNum+=VATStartFrame+frameCorrection;mat4 VATInfluence;VATInfluence=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[0],VATFrameNum)*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[1],VATFrameNum)*matricesWeights[1];\n#endif\n#if NUM_BONE_INFLUENCERS>2\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[2],VATFrameNum)*matricesWeights[2];\n#endif\n#if NUM_BONE_INFLUENCERS>3\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndices[3],VATFrameNum)*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[0],VATFrameNum)*matricesWeightsExtra[0];\n#endif\n#if NUM_BONE_INFLUENCERS>5\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[1],VATFrameNum)*matricesWeightsExtra[1];\n#endif\n#if NUM_BONE_INFLUENCERS>6\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[2],VATFrameNum)*matricesWeightsExtra[2];\n#endif\n#if NUM_BONE_INFLUENCERS>7\nVATInfluence+=readMatrixFromRawSamplerVAT(bakedVertexAnimationTexture,matricesIndicesExtra[3],VATFrameNum)*matricesWeightsExtra[3];\n#endif\nfinalWorld=finalWorld*VATInfluence;}\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bakedVertexAnimation = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"prePassVertex\";\nconst shader = `#ifdef PREPASS_DEPTH\nvViewPos=(view*worldPos).rgb;\n#endif\n#if defined(PREPASS_VELOCITY) && defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*worldPos;\n#if NUM_BONE_INFLUENCERS>0\nmat4 previousInfluence;previousInfluence=mPreviousBones[int(matricesIndices[0])]*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\npreviousInfluence+=mPreviousBones[int(matricesIndices[1])]*matricesWeights[1];\n#endif \n#if NUM_BONE_INFLUENCERS>2\npreviousInfluence+=mPreviousBones[int(matricesIndices[2])]*matricesWeights[2];\n#endif \n#if NUM_BONE_INFLUENCERS>3\npreviousInfluence+=mPreviousBones[int(matricesIndices[3])]*matricesWeights[3];\n#endif\n#if NUM_BONE_INFLUENCERS>4\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[0])]*matricesWeightsExtra[0];\n#endif \n#if NUM_BONE_INFLUENCERS>5\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[1])]*matricesWeightsExtra[1];\n#endif \n#if NUM_BONE_INFLUENCERS>6\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[2])]*matricesWeightsExtra[2];\n#endif \n#if NUM_BONE_INFLUENCERS>7\npreviousInfluence+=mPreviousBones[int(matricesIndicesExtra[3])]*matricesWeightsExtra[3];\n#endif\nvPreviousPosition=previousViewProjection*finalPreviousWorld*previousInfluence*vec4(positionUpdated,1.0);\n#else\nvPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const prePassVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"uvVariableDeclaration\";\nconst shader = `#if !defined(UV{X}) && defined(MAINUV{X})\nvec2 uv{X}=vec2(0.,0.);\n#endif\n#ifdef MAINUV{X}\nvMainUV{X}=uv{X};\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const uvVariableDeclaration = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"samplerVertexImplementation\";\nconst shader = `#if defined(_DEFINENAME_) && _DEFINENAME_DIRECTUV==0\nif (v_INFONAME_==0.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uvUpdated,1.0,0.0));}\n#ifdef UV2\nelse if (v_INFONAME_==1.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv2,1.0,0.0));}\n#endif\n#ifdef UV3\nelse if (v_INFONAME_==2.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv3,1.0,0.0));}\n#endif\n#ifdef UV4\nelse if (v_INFONAME_==3.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv4,1.0,0.0));}\n#endif\n#ifdef UV5\nelse if (v_INFONAME_==4.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv5,1.0,0.0));}\n#endif\n#ifdef UV6\nelse if (v_INFONAME_==5.)\n{v_VARYINGNAME_UV=vec2(_MATRIXNAME_Matrix*vec4(uv6,1.0,0.0));}\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const samplerVertexImplementation = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"bumpVertex\";\nconst shader = `#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)\n#if defined(TANGENT) && defined(NORMAL)\nvec3 tbnNormal=normalize(normalUpdated);vec3 tbnTangent=normalize(tangentUpdated.xyz);vec3 tbnBitangent=cross(tbnNormal,tbnTangent)*tangentUpdated.w;vTBN=mat3(finalWorld)*mat3(tbnTangent,tbnBitangent,tbnNormal);\n#endif\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const bumpVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"clipPlaneVertex\";\nconst shader = `#ifdef CLIPPLANE\nfClipDistance=dot(worldPos,vClipPlane);\n#endif\n#ifdef CLIPPLANE2\nfClipDistance2=dot(worldPos,vClipPlane2);\n#endif\n#ifdef CLIPPLANE3\nfClipDistance3=dot(worldPos,vClipPlane3);\n#endif\n#ifdef CLIPPLANE4\nfClipDistance4=dot(worldPos,vClipPlane4);\n#endif\n#ifdef CLIPPLANE5\nfClipDistance5=dot(worldPos,vClipPlane5);\n#endif\n#ifdef CLIPPLANE6\nfClipDistance6=dot(worldPos,vClipPlane6);\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const clipPlaneVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"fogVertex\";\nconst shader = `#ifdef FOG\nvFogDistance=(view*worldPos).xyz;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const fogVertex = { name, shader };\n", "// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"shadowsVertex\";\nconst shader = `#ifdef SHADOWS\n#if defined(SHADOWCSM{X})\nvPositionFromCamera{X}=view*worldPos;for (int i=0; i\n#define CUSTOM_VERTEX_BEGIN\nattribute vec3 position;\n#ifdef NORMAL\nattribute vec3 normal;\n#endif\n#ifdef TANGENT\nattribute vec4 tangent;\n#endif\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#include[2..7]\n#ifdef VERTEXCOLOR\nattribute vec4 color;\n#endif\n#include\n#include\n#include\n#include\n#include\n#include[1..7]\n#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap)\n#if defined(SPECULARTERM)\n#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular)\n#endif\n#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal)\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)\nvarying vec4 vColor;\n#endif\n#include\n#include\n#include\n#include<__decl__lightVxFragment>[0..maxSimultaneousLights]\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\n#include\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvec3 positionUpdated=position;\n#ifdef NORMAL\nvec3 normalUpdated=normal;\n#endif\n#ifdef TANGENT\nvec4 tangentUpdated=tangent;\n#endif\n#ifdef UV1\nvec2 uvUpdated=uv;\n#endif\n#include\n#include[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvPositionUVW=positionUpdated;\n#endif\n#define CUSTOM_VERTEX_UPDATE_POSITION\n#define CUSTOM_VERTEX_UPDATE_NORMAL\n#include\n#if defined(PREPASS) && defined(PREPASS_VELOCITY) && !defined(BONES_VELOCITY_ENABLED)\nvCurrentPosition=viewProjection*finalWorld*vec4(positionUpdated,1.0);vPreviousPosition=previousViewProjection*finalPreviousWorld*vec4(positionUpdated,1.0);\n#endif\n#include\n#include\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\n#ifdef NORMAL\nmat3 normalWorld=mat3(finalWorld);\n#if defined(INSTANCES) && defined(THIN_INSTANCES)\nvNormalW=normalUpdated/vec3(dot(normalWorld[0],normalWorld[0]),dot(normalWorld[1],normalWorld[1]),dot(normalWorld[2],normalWorld[2]));vNormalW=normalize(normalWorld*vNormalW);\n#else\n#ifdef NONUNIFORMSCALING\nnormalWorld=transposeMat3(inverseMat3(normalWorld));\n#endif\nvNormalW=normalize(normalWorld*normalUpdated);\n#endif\n#endif\n#define CUSTOM_VERTEX_UPDATE_WORLDPOS\n#ifdef MULTIVIEW\nif (gl_ViewID_OVR==0u) {gl_Position=viewProjection*worldPos;} else {gl_Position=viewProjectionR*worldPos;}\n#else\ngl_Position=viewProjection*worldPos;\n#endif\nvPositionW=vec3(worldPos);\n#include\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0)));\n#endif\n#ifndef UV1\nvec2 uvUpdated=vec2(0.,0.);\n#endif\n#ifdef MAINUV1\nvMainUV1=uvUpdated;\n#endif\n#include[2..7]\n#include(_DEFINENAME_,DIFFUSE,_VARYINGNAME_,Diffuse,_MATRIXNAME_,diffuse,_INFONAME_,DiffuseInfos.x)\n#include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x)\n#include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x)\n#include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x)\n#include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_MATRIXNAME_,emissive,_INFONAME_,EmissiveInfos.x)\n#include(_DEFINENAME_,LIGHTMAP,_VARYINGNAME_,Lightmap,_MATRIXNAME_,lightmap,_INFONAME_,LightmapInfos.x)\n#if defined(SPECULARTERM)\n#include(_DEFINENAME_,SPECULAR,_VARYINGNAME_,Specular,_MATRIXNAME_,specular,_INFONAME_,SpecularInfos.x)\n#endif\n#include(_DEFINENAME_,BUMP,_VARYINGNAME_,Bump,_MATRIXNAME_,bump,_INFONAME_,BumpInfos.x)\n#include(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_MATRIXNAME_,decal,_INFONAME_,DecalInfos.x)\n#include\n#include\n#include\n#include[0..maxSimultaneousLights]\n#include\n#include\n#include\n#define CUSTOM_VERTEX_MAIN_END\n}\n`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const defaultVertexShader = { name, shader };\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { serialize, serializeAsColor3, expandToProperty, serializeAsFresnelParameters, serializeAsTexture } from \"../Misc/decorators\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\n\r\nimport type { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { Matrix } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { PrePassConfiguration } from \"./prePassConfiguration\";\r\n\r\nimport type { IImageProcessingConfigurationDefines } from \"./imageProcessingConfiguration.defines\";\r\nimport { ImageProcessingConfiguration } from \"./imageProcessingConfiguration\";\r\nimport type { ColorCurves } from \"./colorCurves\";\r\nimport type { FresnelParameters } from \"./fresnelParameters\";\r\nimport type { ICustomShaderNameResolveOptions } from \"../Materials/material\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { MaterialPluginEvent } from \"./materialPluginEvent\";\r\nimport { MaterialDefines } from \"../Materials/materialDefines\";\r\nimport { PushMaterial } from \"./pushMaterial\";\r\n\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport type { CubeTexture } from \"../Materials/Textures/cubeTexture\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport { MaterialFlags } from \"./materialFlags\";\r\n\r\nimport \"../Shaders/default.fragment\";\r\nimport \"../Shaders/default.vertex\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { EffectFallbacks } from \"./effectFallbacks\";\r\nimport type { Effect, IEffectCreationOptions } from \"./effect\";\r\nimport { DetailMapConfiguration } from \"./material.detailMapConfiguration\";\r\nimport { addClipPlaneUniforms, bindClipPlane } from \"./clipPlaneMaterialHelper\";\r\nimport {\r\n BindBonesParameters,\r\n BindFogParameters,\r\n BindLights,\r\n BindLogDepth,\r\n BindMorphTargetParameters,\r\n BindTextureMatrix,\r\n HandleFallbacksForShadows,\r\n PrepareAttributesForBakedVertexAnimation,\r\n PrepareAttributesForBones,\r\n PrepareAttributesForInstances,\r\n PrepareAttributesForMorphTargets,\r\n PrepareDefinesForAttributes,\r\n PrepareDefinesForFrameBoundValues,\r\n PrepareDefinesForLights,\r\n PrepareDefinesForMergedUV,\r\n PrepareDefinesForMisc,\r\n PrepareDefinesForMultiview,\r\n PrepareDefinesForOIT,\r\n PrepareDefinesForPrePass,\r\n PrepareUniformsAndSamplersList,\r\n} from \"./materialHelper.functions\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\n\r\nconst onCreatedEffectParameters = { effect: null as unknown as Effect, subMesh: null as unknown as Nullable };\r\n\r\n/** @internal */\r\nexport class StandardMaterialDefines extends MaterialDefines implements IImageProcessingConfigurationDefines {\r\n public MAINUV1 = false;\r\n public MAINUV2 = false;\r\n public MAINUV3 = false;\r\n public MAINUV4 = false;\r\n public MAINUV5 = false;\r\n public MAINUV6 = false;\r\n public DIFFUSE = false;\r\n public DIFFUSEDIRECTUV = 0;\r\n public BAKED_VERTEX_ANIMATION_TEXTURE = false;\r\n public AMBIENT = false;\r\n public AMBIENTDIRECTUV = 0;\r\n public OPACITY = false;\r\n public OPACITYDIRECTUV = 0;\r\n public OPACITYRGB = false;\r\n public REFLECTION = false;\r\n public EMISSIVE = false;\r\n public EMISSIVEDIRECTUV = 0;\r\n public SPECULAR = false;\r\n public SPECULARDIRECTUV = 0;\r\n public BUMP = false;\r\n public BUMPDIRECTUV = 0;\r\n public PARALLAX = false;\r\n public PARALLAX_RHS = false;\r\n public PARALLAXOCCLUSION = false;\r\n public SPECULAROVERALPHA = false;\r\n public CLIPPLANE = false;\r\n public CLIPPLANE2 = false;\r\n public CLIPPLANE3 = false;\r\n public CLIPPLANE4 = false;\r\n public CLIPPLANE5 = false;\r\n public CLIPPLANE6 = false;\r\n public ALPHATEST = false;\r\n public DEPTHPREPASS = false;\r\n public ALPHAFROMDIFFUSE = false;\r\n public POINTSIZE = false;\r\n public FOG = false;\r\n public SPECULARTERM = false;\r\n public DIFFUSEFRESNEL = false;\r\n public OPACITYFRESNEL = false;\r\n public REFLECTIONFRESNEL = false;\r\n public REFRACTIONFRESNEL = false;\r\n public EMISSIVEFRESNEL = false;\r\n public FRESNEL = false;\r\n public NORMAL = false;\r\n public TANGENT = false;\r\n public UV1 = false;\r\n public UV2 = false;\r\n public UV3 = false;\r\n public UV4 = false;\r\n public UV5 = false;\r\n public UV6 = false;\r\n public VERTEXCOLOR = false;\r\n public VERTEXALPHA = false;\r\n public NUM_BONE_INFLUENCERS = 0;\r\n public BonesPerMesh = 0;\r\n public BONETEXTURE = false;\r\n public BONES_VELOCITY_ENABLED = false;\r\n public INSTANCES = false;\r\n public THIN_INSTANCES = false;\r\n public INSTANCESCOLOR = false;\r\n public GLOSSINESS = false;\r\n public ROUGHNESS = false;\r\n public EMISSIVEASILLUMINATION = false;\r\n public LINKEMISSIVEWITHDIFFUSE = false;\r\n public REFLECTIONFRESNELFROMSPECULAR = false;\r\n public LIGHTMAP = false;\r\n public LIGHTMAPDIRECTUV = 0;\r\n public OBJECTSPACE_NORMALMAP = false;\r\n public USELIGHTMAPASSHADOWMAP = false;\r\n public REFLECTIONMAP_3D = false;\r\n public REFLECTIONMAP_SPHERICAL = false;\r\n public REFLECTIONMAP_PLANAR = false;\r\n public REFLECTIONMAP_CUBIC = false;\r\n public USE_LOCAL_REFLECTIONMAP_CUBIC = false;\r\n public USE_LOCAL_REFRACTIONMAP_CUBIC = false;\r\n public REFLECTIONMAP_PROJECTION = false;\r\n public REFLECTIONMAP_SKYBOX = false;\r\n public REFLECTIONMAP_EXPLICIT = false;\r\n public REFLECTIONMAP_EQUIRECTANGULAR = false;\r\n public REFLECTIONMAP_EQUIRECTANGULAR_FIXED = false;\r\n public REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = false;\r\n public REFLECTIONMAP_OPPOSITEZ = false;\r\n public INVERTCUBICMAP = false;\r\n public LOGARITHMICDEPTH = false;\r\n public REFRACTION = false;\r\n public REFRACTIONMAP_3D = false;\r\n public REFLECTIONOVERALPHA = false;\r\n public TWOSIDEDLIGHTING = false;\r\n public SHADOWFLOAT = false;\r\n public MORPHTARGETS = false;\r\n public MORPHTARGETS_NORMAL = false;\r\n public MORPHTARGETS_TANGENT = false;\r\n public MORPHTARGETS_UV = false;\r\n public NUM_MORPH_INFLUENCERS = 0;\r\n public MORPHTARGETS_TEXTURE = false;\r\n public NONUNIFORMSCALING = false; // https://playground.babylonjs.com#V6DWIH\r\n public PREMULTIPLYALPHA = false; // https://playground.babylonjs.com#LNVJJ7\r\n public ALPHATEST_AFTERALLALPHACOMPUTATIONS = false;\r\n public ALPHABLEND = true;\r\n\r\n public PREPASS = false;\r\n public PREPASS_IRRADIANCE = false;\r\n public PREPASS_IRRADIANCE_INDEX = -1;\r\n public PREPASS_ALBEDO_SQRT = false;\r\n public PREPASS_ALBEDO_SQRT_INDEX = -1;\r\n public PREPASS_DEPTH = false;\r\n public PREPASS_DEPTH_INDEX = -1;\r\n public PREPASS_NORMAL = false;\r\n public PREPASS_NORMAL_INDEX = -1;\r\n public PREPASS_NORMAL_WORLDSPACE = false;\r\n public PREPASS_POSITION = false;\r\n public PREPASS_POSITION_INDEX = -1;\r\n public PREPASS_VELOCITY = false;\r\n public PREPASS_VELOCITY_INDEX = -1;\r\n public PREPASS_REFLECTIVITY = false;\r\n public PREPASS_REFLECTIVITY_INDEX = -1;\r\n public SCENE_MRT_COUNT = 0;\r\n\r\n public RGBDLIGHTMAP = false;\r\n public RGBDREFLECTION = false;\r\n public RGBDREFRACTION = false;\r\n\r\n public IMAGEPROCESSING = false;\r\n public VIGNETTE = false;\r\n public VIGNETTEBLENDMODEMULTIPLY = false;\r\n public VIGNETTEBLENDMODEOPAQUE = false;\r\n public TONEMAPPING = false;\r\n public TONEMAPPING_ACES = false;\r\n public CONTRAST = false;\r\n public COLORCURVES = false;\r\n public COLORGRADING = false;\r\n public COLORGRADING3D = false;\r\n public SAMPLER3DGREENDEPTH = false;\r\n public SAMPLER3DBGRMAP = false;\r\n public DITHER = false;\r\n public IMAGEPROCESSINGPOSTPROCESS = false;\r\n public SKIPFINALCOLORCLAMP = false;\r\n public MULTIVIEW = false;\r\n public ORDER_INDEPENDENT_TRANSPARENCY = false;\r\n public ORDER_INDEPENDENT_TRANSPARENCY_16BITS = false;\r\n public CAMERA_ORTHOGRAPHIC = false;\r\n public CAMERA_PERSPECTIVE = false;\r\n\r\n /**\r\n * If the reflection texture on this material is in linear color space\r\n * @internal\r\n */\r\n public IS_REFLECTION_LINEAR = false;\r\n /**\r\n * If the refraction texture on this material is in linear color space\r\n * @internal\r\n */\r\n public IS_REFRACTION_LINEAR = false;\r\n public EXPOSURE = false;\r\n\r\n public DECAL_AFTER_DETAIL = false;\r\n\r\n /**\r\n * Initializes the Standard Material defines.\r\n * @param externalProperties The external properties\r\n */\r\n constructor(externalProperties?: { [name: string]: { type: string; default: any } }) {\r\n super(externalProperties);\r\n this.rebuild();\r\n }\r\n\r\n public setReflectionMode(modeToEnable: string) {\r\n const modes = [\r\n \"REFLECTIONMAP_CUBIC\",\r\n \"REFLECTIONMAP_EXPLICIT\",\r\n \"REFLECTIONMAP_PLANAR\",\r\n \"REFLECTIONMAP_PROJECTION\",\r\n \"REFLECTIONMAP_PROJECTION\",\r\n \"REFLECTIONMAP_SKYBOX\",\r\n \"REFLECTIONMAP_SPHERICAL\",\r\n \"REFLECTIONMAP_EQUIRECTANGULAR\",\r\n \"REFLECTIONMAP_EQUIRECTANGULAR_FIXED\",\r\n \"REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED\",\r\n ];\r\n\r\n for (const mode of modes) {\r\n (this)[mode] = mode === modeToEnable;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This is the default material used in Babylon. It is the best trade off between quality\r\n * and performances.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction\r\n */\r\nexport class StandardMaterial extends PushMaterial {\r\n @serializeAsTexture(\"diffuseTexture\")\r\n private _diffuseTexture: Nullable = null;\r\n /**\r\n * The basic texture of the material as viewed under a light.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public diffuseTexture: Nullable;\r\n\r\n @serializeAsTexture(\"ambientTexture\")\r\n private _ambientTexture: Nullable = null;\r\n /**\r\n * AKA Occlusion Texture in other nomenclature, it helps adding baked shadows into your material.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public ambientTexture: Nullable;\r\n\r\n @serializeAsTexture(\"opacityTexture\")\r\n private _opacityTexture: Nullable = null;\r\n /**\r\n * Define the transparency of the material from a texture.\r\n * The final alpha value can be read either from the red channel (if texture.getAlphaFromRGB is false)\r\n * or from the luminance or the current texel (if texture.getAlphaFromRGB is true)\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public opacityTexture: Nullable;\r\n\r\n @serializeAsTexture(\"reflectionTexture\")\r\n private _reflectionTexture: Nullable = null;\r\n /**\r\n * Define the texture used to display the reflection.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#how-to-obtain-reflections-and-refractions\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public reflectionTexture: Nullable;\r\n\r\n @serializeAsTexture(\"emissiveTexture\")\r\n private _emissiveTexture: Nullable = null;\r\n /**\r\n * Define texture of the material as if self lit.\r\n * This will be mixed in the final result even in the absence of light.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public emissiveTexture: Nullable;\r\n\r\n @serializeAsTexture(\"specularTexture\")\r\n private _specularTexture: Nullable = null;\r\n /**\r\n * Define how the color and intensity of the highlight given by the light in the material.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public specularTexture: Nullable;\r\n\r\n @serializeAsTexture(\"bumpTexture\")\r\n private _bumpTexture: Nullable = null;\r\n /**\r\n * Bump mapping is a technique to simulate bump and dents on a rendered surface.\r\n * These are made by creating a normal map from an image. The means to do this can be found on the web, a search for 'normal map generator' will bring up free and paid for methods of doing this.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#bump-map\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public bumpTexture: Nullable;\r\n\r\n @serializeAsTexture(\"lightmapTexture\")\r\n private _lightmapTexture: Nullable = null;\r\n /**\r\n * Complex lighting can be computationally expensive to compute at runtime.\r\n * To save on computation, lightmaps may be used to store calculated lighting in a texture which will be applied to a given mesh.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction#lightmaps\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public lightmapTexture: Nullable;\r\n\r\n @serializeAsTexture(\"refractionTexture\")\r\n private _refractionTexture: Nullable = null;\r\n /**\r\n * Define the texture used to display the refraction.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#how-to-obtain-reflections-and-refractions\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public refractionTexture: Nullable;\r\n\r\n /**\r\n * The color of the material lit by the environmental background lighting.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#ambient-color-example\r\n */\r\n @serializeAsColor3(\"ambient\")\r\n public ambientColor = new Color3(0, 0, 0);\r\n\r\n /**\r\n * The basic color of the material as viewed under a light.\r\n */\r\n @serializeAsColor3(\"diffuse\")\r\n public diffuseColor = new Color3(1, 1, 1);\r\n\r\n /**\r\n * Define how the color and intensity of the highlight given by the light in the material.\r\n */\r\n @serializeAsColor3(\"specular\")\r\n public specularColor = new Color3(1, 1, 1);\r\n\r\n /**\r\n * Define the color of the material as if self lit.\r\n * This will be mixed in the final result even in the absence of light.\r\n */\r\n @serializeAsColor3(\"emissive\")\r\n public emissiveColor = new Color3(0, 0, 0);\r\n\r\n /**\r\n * Defines how sharp are the highlights in the material.\r\n * The bigger the value the sharper giving a more glossy feeling to the result.\r\n * Reversely, the smaller the value the blurrier giving a more rough feeling to the result.\r\n */\r\n @serialize()\r\n public specularPower = 64;\r\n\r\n @serialize(\"useAlphaFromDiffuseTexture\")\r\n private _useAlphaFromDiffuseTexture = false;\r\n /**\r\n * Does the transparency come from the diffuse texture alpha channel.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public useAlphaFromDiffuseTexture: boolean;\r\n\r\n @serialize(\"useEmissiveAsIllumination\")\r\n private _useEmissiveAsIllumination = false;\r\n /**\r\n * If true, the emissive value is added into the end result, otherwise it is multiplied in.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useEmissiveAsIllumination: boolean;\r\n\r\n @serialize(\"linkEmissiveWithDiffuse\")\r\n private _linkEmissiveWithDiffuse = false;\r\n /**\r\n * If true, some kind of energy conservation will prevent the end result to be more than 1 by reducing\r\n * the emissive level when the final color is close to one.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public linkEmissiveWithDiffuse: boolean;\r\n\r\n @serialize(\"useSpecularOverAlpha\")\r\n private _useSpecularOverAlpha = false;\r\n /**\r\n * Specifies that the material will keep the specular highlights over a transparent surface (only the most luminous ones).\r\n * A car glass is a good exemple of that. When sun reflects on it you can not see what is behind.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useSpecularOverAlpha: boolean;\r\n\r\n @serialize(\"useReflectionOverAlpha\")\r\n private _useReflectionOverAlpha = false;\r\n /**\r\n * Specifies that the material will keeps the reflection highlights over a transparent surface (only the most luminous ones).\r\n * A car glass is a good exemple of that. When the street lights reflects on it you can not see what is behind.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useReflectionOverAlpha: boolean;\r\n\r\n @serialize(\"disableLighting\")\r\n private _disableLighting = false;\r\n /**\r\n * Does lights from the scene impacts this material.\r\n * It can be a nice trick for performance to disable lighting on a fully emissive material.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsLightsDirty\")\r\n public disableLighting: boolean;\r\n\r\n @serialize(\"useObjectSpaceNormalMap\")\r\n private _useObjectSpaceNormalMap = false;\r\n /**\r\n * Allows using an object space normal map (instead of tangent space).\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useObjectSpaceNormalMap: boolean;\r\n\r\n @serialize(\"useParallax\")\r\n private _useParallax = false;\r\n /**\r\n * Is parallax enabled or not.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/parallaxMapping\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useParallax: boolean;\r\n\r\n @serialize(\"useParallaxOcclusion\")\r\n private _useParallaxOcclusion = false;\r\n /**\r\n * Is parallax occlusion enabled or not.\r\n * If true, the outcome is way more realistic than traditional Parallax but you can expect a performance hit that worthes consideration.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/parallaxMapping\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useParallaxOcclusion: boolean;\r\n\r\n /**\r\n * Apply a scaling factor that determine which \"depth\" the height map should reprensent. A value between 0.05 and 0.1 is reasonnable in Parallax, you can reach 0.2 using Parallax Occlusion.\r\n */\r\n @serialize()\r\n public parallaxScaleBias = 0.05;\r\n\r\n @serialize(\"roughness\")\r\n private _roughness = 0;\r\n /**\r\n * Helps to define how blurry the reflections should appears in the material.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public roughness: number;\r\n\r\n /**\r\n * In case of refraction, define the value of the index of refraction.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#how-to-obtain-reflections-and-refractions\r\n */\r\n @serialize()\r\n public indexOfRefraction = 0.98;\r\n\r\n /**\r\n * Invert the refraction texture alongside the y axis.\r\n * It can be useful with procedural textures or probe for instance.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#how-to-obtain-reflections-and-refractions\r\n */\r\n @serialize()\r\n public invertRefractionY = true;\r\n\r\n /**\r\n * Defines the alpha limits in alpha test mode.\r\n */\r\n @serialize()\r\n public alphaCutOff = 0.4;\r\n\r\n @serialize(\"useLightmapAsShadowmap\")\r\n private _useLightmapAsShadowmap = false;\r\n /**\r\n * In case of light mapping, define whether the map contains light or shadow informations.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useLightmapAsShadowmap: boolean;\r\n\r\n // Fresnel\r\n @serializeAsFresnelParameters(\"diffuseFresnelParameters\")\r\n private _diffuseFresnelParameters: FresnelParameters;\r\n /**\r\n * Define the diffuse fresnel parameters of the material.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsFresnelDirty\")\r\n public diffuseFresnelParameters: FresnelParameters;\r\n\r\n @serializeAsFresnelParameters(\"opacityFresnelParameters\")\r\n private _opacityFresnelParameters: FresnelParameters;\r\n /**\r\n * Define the opacity fresnel parameters of the material.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsFresnelAndMiscDirty\")\r\n public opacityFresnelParameters: FresnelParameters;\r\n\r\n @serializeAsFresnelParameters(\"reflectionFresnelParameters\")\r\n private _reflectionFresnelParameters: FresnelParameters;\r\n /**\r\n * Define the reflection fresnel parameters of the material.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsFresnelDirty\")\r\n public reflectionFresnelParameters: FresnelParameters;\r\n\r\n @serializeAsFresnelParameters(\"refractionFresnelParameters\")\r\n private _refractionFresnelParameters: FresnelParameters;\r\n /**\r\n * Define the refraction fresnel parameters of the material.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsFresnelDirty\")\r\n public refractionFresnelParameters: FresnelParameters;\r\n\r\n @serializeAsFresnelParameters(\"emissiveFresnelParameters\")\r\n private _emissiveFresnelParameters: FresnelParameters;\r\n /**\r\n * Define the emissive fresnel parameters of the material.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsFresnelDirty\")\r\n public emissiveFresnelParameters: FresnelParameters;\r\n\r\n @serialize(\"useReflectionFresnelFromSpecular\")\r\n private _useReflectionFresnelFromSpecular = false;\r\n /**\r\n * If true automatically deducts the fresnels values from the material specularity.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsFresnelDirty\")\r\n public useReflectionFresnelFromSpecular: boolean;\r\n\r\n @serialize(\"useGlossinessFromSpecularMapAlpha\")\r\n private _useGlossinessFromSpecularMapAlpha = false;\r\n /**\r\n * Defines if the glossiness/roughness of the material should be read from the specular map alpha channel\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useGlossinessFromSpecularMapAlpha: boolean;\r\n\r\n @serialize(\"maxSimultaneousLights\")\r\n private _maxSimultaneousLights = 4;\r\n /**\r\n * Defines the maximum number of lights that can be used in the material\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsLightsDirty\")\r\n public maxSimultaneousLights: number;\r\n\r\n @serialize(\"invertNormalMapX\")\r\n private _invertNormalMapX = false;\r\n /**\r\n * If sets to true, x component of normal map value will invert (x = 1.0 - x).\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public invertNormalMapX: boolean;\r\n\r\n @serialize(\"invertNormalMapY\")\r\n private _invertNormalMapY = false;\r\n /**\r\n * If sets to true, y component of normal map value will invert (y = 1.0 - y).\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public invertNormalMapY: boolean;\r\n\r\n @serialize(\"twoSidedLighting\")\r\n private _twoSidedLighting = false;\r\n /**\r\n * If sets to true and backfaceCulling is false, normals will be flipped on the backside.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public twoSidedLighting: boolean;\r\n\r\n @serialize(\"applyDecalMapAfterDetailMap\")\r\n private _applyDecalMapAfterDetailMap = false;\r\n /**\r\n * If sets to true, the decal map will be applied after the detail map. Else, it is applied before (default: false)\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsMiscDirty\")\r\n public applyDecalMapAfterDetailMap: boolean;\r\n\r\n /**\r\n * Default configuration related to image processing available in the standard Material.\r\n */\r\n protected _imageProcessingConfiguration: ImageProcessingConfiguration;\r\n\r\n /**\r\n * Gets the image processing configuration used either in this material.\r\n */\r\n public get imageProcessingConfiguration(): ImageProcessingConfiguration {\r\n return this._imageProcessingConfiguration;\r\n }\r\n\r\n /**\r\n * Sets the Default image processing configuration used either in the this material.\r\n *\r\n * If sets to null, the scene one is in use.\r\n */\r\n public set imageProcessingConfiguration(value: ImageProcessingConfiguration) {\r\n this._attachImageProcessingConfiguration(value);\r\n\r\n // Ensure the effect will be rebuilt.\r\n this._markAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n /**\r\n * Keep track of the image processing observer to allow dispose and replace.\r\n */\r\n private _imageProcessingObserver: Nullable>;\r\n\r\n /**\r\n * Attaches a new image processing configuration to the Standard Material.\r\n * @param configuration\r\n */\r\n protected _attachImageProcessingConfiguration(configuration: Nullable): void {\r\n if (configuration === this._imageProcessingConfiguration) {\r\n return;\r\n }\r\n\r\n // Detaches observer\r\n if (this._imageProcessingConfiguration && this._imageProcessingObserver) {\r\n this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver);\r\n }\r\n\r\n // Pick the scene configuration if needed\r\n if (!configuration) {\r\n this._imageProcessingConfiguration = this.getScene().imageProcessingConfiguration;\r\n } else {\r\n this._imageProcessingConfiguration = configuration;\r\n }\r\n\r\n // Attaches observer\r\n if (this._imageProcessingConfiguration) {\r\n this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add(() => {\r\n this._markAllSubMeshesAsImageProcessingDirty();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Defines additional PrePass parameters for the material.\r\n */\r\n public readonly prePassConfiguration: PrePassConfiguration;\r\n\r\n /**\r\n * Can this material render to prepass\r\n */\r\n public get isPrePassCapable(): boolean {\r\n return !this.disableDepthWrite;\r\n }\r\n\r\n /**\r\n * Gets whether the color curves effect is enabled.\r\n */\r\n public get cameraColorCurvesEnabled(): boolean {\r\n return this.imageProcessingConfiguration.colorCurvesEnabled;\r\n }\r\n /**\r\n * Sets whether the color curves effect is enabled.\r\n */\r\n public set cameraColorCurvesEnabled(value: boolean) {\r\n this.imageProcessingConfiguration.colorCurvesEnabled = value;\r\n }\r\n\r\n /**\r\n * Gets whether the color grading effect is enabled.\r\n */\r\n public get cameraColorGradingEnabled(): boolean {\r\n return this.imageProcessingConfiguration.colorGradingEnabled;\r\n }\r\n /**\r\n * Gets whether the color grading effect is enabled.\r\n */\r\n public set cameraColorGradingEnabled(value: boolean) {\r\n this.imageProcessingConfiguration.colorGradingEnabled = value;\r\n }\r\n\r\n /**\r\n * Gets whether tonemapping is enabled or not.\r\n */\r\n public get cameraToneMappingEnabled(): boolean {\r\n return this._imageProcessingConfiguration.toneMappingEnabled;\r\n }\r\n /**\r\n * Sets whether tonemapping is enabled or not\r\n */\r\n public set cameraToneMappingEnabled(value: boolean) {\r\n this._imageProcessingConfiguration.toneMappingEnabled = value;\r\n }\r\n\r\n /**\r\n * The camera exposure used on this material.\r\n * This property is here and not in the camera to allow controlling exposure without full screen post process.\r\n * This corresponds to a photographic exposure.\r\n */\r\n public get cameraExposure(): number {\r\n return this._imageProcessingConfiguration.exposure;\r\n }\r\n /**\r\n * The camera exposure used on this material.\r\n * This property is here and not in the camera to allow controlling exposure without full screen post process.\r\n * This corresponds to a photographic exposure.\r\n */\r\n public set cameraExposure(value: number) {\r\n this._imageProcessingConfiguration.exposure = value;\r\n }\r\n\r\n /**\r\n * Gets The camera contrast used on this material.\r\n */\r\n public get cameraContrast(): number {\r\n return this._imageProcessingConfiguration.contrast;\r\n }\r\n\r\n /**\r\n * Sets The camera contrast used on this material.\r\n */\r\n public set cameraContrast(value: number) {\r\n this._imageProcessingConfiguration.contrast = value;\r\n }\r\n\r\n /**\r\n * Gets the Color Grading 2D Lookup Texture.\r\n */\r\n public get cameraColorGradingTexture(): Nullable {\r\n return this._imageProcessingConfiguration.colorGradingTexture;\r\n }\r\n /**\r\n * Sets the Color Grading 2D Lookup Texture.\r\n */\r\n public set cameraColorGradingTexture(value: Nullable) {\r\n this._imageProcessingConfiguration.colorGradingTexture = value;\r\n }\r\n\r\n /**\r\n * The color grading curves provide additional color adjustmnent that is applied after any color grading transform (3D LUT).\r\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\r\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\r\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\r\n */\r\n public get cameraColorCurves(): Nullable {\r\n return this._imageProcessingConfiguration.colorCurves;\r\n }\r\n /**\r\n * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT).\r\n * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.\r\n * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;\r\n * corresponding to low luminance, medium luminance, and high luminance areas respectively.\r\n */\r\n public set cameraColorCurves(value: Nullable) {\r\n this._imageProcessingConfiguration.colorCurves = value;\r\n }\r\n\r\n /**\r\n * Can this material render to several textures at once\r\n */\r\n public get canRenderToMRT() {\r\n return true;\r\n }\r\n\r\n /**\r\n * Defines the detail map parameters for the material.\r\n */\r\n public readonly detailMap: DetailMapConfiguration;\r\n\r\n protected _renderTargets = new SmartArray(16);\r\n protected _worldViewProjectionMatrix = Matrix.Zero();\r\n protected _globalAmbientColor = new Color3(0, 0, 0);\r\n protected _cacheHasRenderTargetTextures = false;\r\n\r\n /**\r\n * Instantiates a new standard material.\r\n * This is the default material used in Babylon. It is the best trade off between quality\r\n * and performances.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction\r\n * @param name Define the name of the material in the scene\r\n * @param scene Define the scene the material belong to\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n\r\n this.detailMap = new DetailMapConfiguration(this);\r\n\r\n // Setup the default processing configuration to the scene.\r\n this._attachImageProcessingConfiguration(null);\r\n this.prePassConfiguration = new PrePassConfiguration();\r\n\r\n this.getRenderTargetTextures = (): SmartArray => {\r\n this._renderTargets.reset();\r\n\r\n if (StandardMaterial.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget) {\r\n this._renderTargets.push(this._reflectionTexture);\r\n }\r\n\r\n if (StandardMaterial.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget) {\r\n this._renderTargets.push(this._refractionTexture);\r\n }\r\n\r\n this._eventInfo.renderTargets = this._renderTargets;\r\n this._callbackPluginEventFillRenderTargetTextures(this._eventInfo);\r\n\r\n return this._renderTargets;\r\n };\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public get hasRenderTargetTextures(): boolean {\r\n if (StandardMaterial.ReflectionTextureEnabled && this._reflectionTexture && this._reflectionTexture.isRenderTarget) {\r\n return true;\r\n }\r\n\r\n if (StandardMaterial.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget) {\r\n return true;\r\n }\r\n\r\n return this._cacheHasRenderTargetTextures;\r\n }\r\n\r\n /**\r\n * Gets the current class name of the material e.g. \"StandardMaterial\"\r\n * Mainly use in serialization.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"StandardMaterial\";\r\n }\r\n\r\n /**\r\n * Specifies if the material will require alpha blending\r\n * @returns a boolean specifying if alpha blending is needed\r\n */\r\n public needAlphaBlending(): boolean {\r\n if (this._disableAlphaBlending) {\r\n return false;\r\n }\r\n\r\n return (\r\n this.alpha < 1.0 ||\r\n this._opacityTexture != null ||\r\n this._shouldUseAlphaFromDiffuseTexture() ||\r\n (this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled)\r\n );\r\n }\r\n\r\n /**\r\n * Specifies if this material should be rendered in alpha test mode\r\n * @returns a boolean specifying if an alpha test is needed.\r\n */\r\n public needAlphaTesting(): boolean {\r\n if (this._forceAlphaTest) {\r\n return true;\r\n }\r\n\r\n return this._hasAlphaChannel() && (this._transparencyMode == null || this._transparencyMode === Material.MATERIAL_ALPHATEST);\r\n }\r\n\r\n /**\r\n * @returns whether or not the alpha value of the diffuse texture should be used for alpha blending.\r\n */\r\n protected _shouldUseAlphaFromDiffuseTexture(): boolean {\r\n return this._diffuseTexture != null && this._diffuseTexture.hasAlpha && this._useAlphaFromDiffuseTexture && this._transparencyMode !== Material.MATERIAL_OPAQUE;\r\n }\r\n\r\n /**\r\n * @returns whether or not there is a usable alpha channel for transparency.\r\n */\r\n protected _hasAlphaChannel(): boolean {\r\n return (this._diffuseTexture != null && this._diffuseTexture.hasAlpha) || this._opacityTexture != null;\r\n }\r\n\r\n /**\r\n * Get the texture used for alpha test purpose.\r\n * @returns the diffuse texture in case of the standard material.\r\n */\r\n public getAlphaTestTexture(): Nullable {\r\n return this._diffuseTexture;\r\n }\r\n\r\n /**\r\n * Get if the submesh is ready to be used and all its information available.\r\n * Child classes can use it to update shaders\r\n * @param mesh defines the mesh to check\r\n * @param subMesh defines which submesh to check\r\n * @param useInstances specifies that instances should be used\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances: boolean = false): boolean {\r\n if (!this._uniformBufferLayoutBuilt) {\r\n this.buildUniformLayout();\r\n }\r\n\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (drawWrapper.effect && this.isFrozen) {\r\n if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetDefineNames, this._eventInfo);\r\n subMesh.materialDefines = new StandardMaterialDefines(this._eventInfo.defineNames);\r\n }\r\n\r\n const scene = this.getScene();\r\n const defines = subMesh.materialDefines;\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Lights\r\n defines._needNormals = PrepareDefinesForLights(scene, mesh, defines, true, this._maxSimultaneousLights, this._disableLighting);\r\n\r\n // Multiview\r\n PrepareDefinesForMultiview(scene, defines);\r\n\r\n // PrePass\r\n const oit = this.needAlphaBlendingForMesh(mesh) && this.getScene().useOrderIndependentTransparency;\r\n PrepareDefinesForPrePass(scene, defines, this.canRenderToMRT && !oit);\r\n\r\n // Order independant transparency\r\n PrepareDefinesForOIT(scene, defines, oit);\r\n\r\n // Textures\r\n if (defines._areTexturesDirty) {\r\n this._eventInfo.hasRenderTargetTextures = false;\r\n this._callbackPluginEventHasRenderTargetTextures(this._eventInfo);\r\n this._cacheHasRenderTargetTextures = this._eventInfo.hasRenderTargetTextures;\r\n defines._needUVs = false;\r\n for (let i = 1; i <= Constants.MAX_SUPPORTED_UV_SETS; ++i) {\r\n defines[\"MAINUV\" + i] = false;\r\n }\r\n if (scene.texturesEnabled) {\r\n defines.DIFFUSEDIRECTUV = 0;\r\n defines.BUMPDIRECTUV = 0;\r\n defines.AMBIENTDIRECTUV = 0;\r\n defines.OPACITYDIRECTUV = 0;\r\n defines.EMISSIVEDIRECTUV = 0;\r\n defines.SPECULARDIRECTUV = 0;\r\n defines.LIGHTMAPDIRECTUV = 0;\r\n\r\n if (this._diffuseTexture && StandardMaterial.DiffuseTextureEnabled) {\r\n if (!this._diffuseTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._diffuseTexture, defines, \"DIFFUSE\");\r\n }\r\n } else {\r\n defines.DIFFUSE = false;\r\n }\r\n\r\n if (this._ambientTexture && StandardMaterial.AmbientTextureEnabled) {\r\n if (!this._ambientTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._ambientTexture, defines, \"AMBIENT\");\r\n }\r\n } else {\r\n defines.AMBIENT = false;\r\n }\r\n\r\n if (this._opacityTexture && StandardMaterial.OpacityTextureEnabled) {\r\n if (!this._opacityTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._opacityTexture, defines, \"OPACITY\");\r\n defines.OPACITYRGB = this._opacityTexture.getAlphaFromRGB;\r\n }\r\n } else {\r\n defines.OPACITY = false;\r\n }\r\n\r\n if (this._reflectionTexture && StandardMaterial.ReflectionTextureEnabled) {\r\n if (!this._reflectionTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n defines._needNormals = true;\r\n defines.REFLECTION = true;\r\n\r\n defines.ROUGHNESS = this._roughness > 0;\r\n defines.REFLECTIONOVERALPHA = this._useReflectionOverAlpha;\r\n defines.INVERTCUBICMAP = this._reflectionTexture.coordinatesMode === Texture.INVCUBIC_MODE;\r\n defines.REFLECTIONMAP_3D = this._reflectionTexture.isCube;\r\n defines.REFLECTIONMAP_OPPOSITEZ =\r\n defines.REFLECTIONMAP_3D && this.getScene().useRightHandedSystem ? !this._reflectionTexture.invertZ : this._reflectionTexture.invertZ;\r\n defines.RGBDREFLECTION = this._reflectionTexture.isRGBD;\r\n\r\n switch (this._reflectionTexture.coordinatesMode) {\r\n case Texture.EXPLICIT_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_EXPLICIT\");\r\n break;\r\n case Texture.PLANAR_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_PLANAR\");\r\n break;\r\n case Texture.PROJECTION_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_PROJECTION\");\r\n break;\r\n case Texture.SKYBOX_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_SKYBOX\");\r\n break;\r\n case Texture.SPHERICAL_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_SPHERICAL\");\r\n break;\r\n case Texture.EQUIRECTANGULAR_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_EQUIRECTANGULAR\");\r\n break;\r\n case Texture.FIXED_EQUIRECTANGULAR_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_EQUIRECTANGULAR_FIXED\");\r\n break;\r\n case Texture.FIXED_EQUIRECTANGULAR_MIRRORED_MODE:\r\n defines.setReflectionMode(\"REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED\");\r\n break;\r\n case Texture.CUBIC_MODE:\r\n case Texture.INVCUBIC_MODE:\r\n default:\r\n defines.setReflectionMode(\"REFLECTIONMAP_CUBIC\");\r\n break;\r\n }\r\n\r\n defines.USE_LOCAL_REFLECTIONMAP_CUBIC = (this._reflectionTexture).boundingBoxSize ? true : false;\r\n }\r\n } else {\r\n defines.REFLECTION = false;\r\n defines.REFLECTIONMAP_OPPOSITEZ = false;\r\n }\r\n\r\n if (this._emissiveTexture && StandardMaterial.EmissiveTextureEnabled) {\r\n if (!this._emissiveTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._emissiveTexture, defines, \"EMISSIVE\");\r\n }\r\n } else {\r\n defines.EMISSIVE = false;\r\n }\r\n\r\n if (this._lightmapTexture && StandardMaterial.LightmapTextureEnabled) {\r\n if (!this._lightmapTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._lightmapTexture, defines, \"LIGHTMAP\");\r\n defines.USELIGHTMAPASSHADOWMAP = this._useLightmapAsShadowmap;\r\n defines.RGBDLIGHTMAP = this._lightmapTexture.isRGBD;\r\n }\r\n } else {\r\n defines.LIGHTMAP = false;\r\n }\r\n\r\n if (this._specularTexture && StandardMaterial.SpecularTextureEnabled) {\r\n if (!this._specularTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._specularTexture, defines, \"SPECULAR\");\r\n defines.GLOSSINESS = this._useGlossinessFromSpecularMapAlpha;\r\n }\r\n } else {\r\n defines.SPECULAR = false;\r\n }\r\n\r\n if (scene.getEngine().getCaps().standardDerivatives && this._bumpTexture && StandardMaterial.BumpTextureEnabled) {\r\n // Bump texture can not be not blocking.\r\n if (!this._bumpTexture.isReady()) {\r\n return false;\r\n } else {\r\n PrepareDefinesForMergedUV(this._bumpTexture, defines, \"BUMP\");\r\n\r\n defines.PARALLAX = this._useParallax;\r\n defines.PARALLAX_RHS = scene.useRightHandedSystem;\r\n defines.PARALLAXOCCLUSION = this._useParallaxOcclusion;\r\n }\r\n\r\n defines.OBJECTSPACE_NORMALMAP = this._useObjectSpaceNormalMap;\r\n } else {\r\n defines.BUMP = false;\r\n defines.PARALLAX = false;\r\n defines.PARALLAX_RHS = false;\r\n defines.PARALLAXOCCLUSION = false;\r\n }\r\n\r\n if (this._refractionTexture && StandardMaterial.RefractionTextureEnabled) {\r\n if (!this._refractionTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n defines._needUVs = true;\r\n defines.REFRACTION = true;\r\n\r\n defines.REFRACTIONMAP_3D = this._refractionTexture.isCube;\r\n defines.RGBDREFRACTION = this._refractionTexture.isRGBD;\r\n defines.USE_LOCAL_REFRACTIONMAP_CUBIC = (this._refractionTexture).boundingBoxSize ? true : false;\r\n }\r\n } else {\r\n defines.REFRACTION = false;\r\n }\r\n\r\n defines.TWOSIDEDLIGHTING = !this._backFaceCulling && this._twoSidedLighting;\r\n } else {\r\n defines.DIFFUSE = false;\r\n defines.AMBIENT = false;\r\n defines.OPACITY = false;\r\n defines.REFLECTION = false;\r\n defines.EMISSIVE = false;\r\n defines.LIGHTMAP = false;\r\n defines.BUMP = false;\r\n defines.REFRACTION = false;\r\n }\r\n\r\n defines.ALPHAFROMDIFFUSE = this._shouldUseAlphaFromDiffuseTexture();\r\n\r\n defines.EMISSIVEASILLUMINATION = this._useEmissiveAsIllumination;\r\n\r\n defines.LINKEMISSIVEWITHDIFFUSE = this._linkEmissiveWithDiffuse;\r\n\r\n defines.SPECULAROVERALPHA = this._useSpecularOverAlpha;\r\n\r\n defines.PREMULTIPLYALPHA = this.alphaMode === Constants.ALPHA_PREMULTIPLIED || this.alphaMode === Constants.ALPHA_PREMULTIPLIED_PORTERDUFF;\r\n\r\n defines.ALPHATEST_AFTERALLALPHACOMPUTATIONS = this.transparencyMode !== null;\r\n\r\n defines.ALPHABLEND = this.transparencyMode === null || this.needAlphaBlendingForMesh(mesh); // check on null for backward compatibility\r\n }\r\n\r\n this._eventInfo.isReadyForSubMesh = true;\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventIsReadyForSubMesh(this._eventInfo);\r\n\r\n if (!this._eventInfo.isReadyForSubMesh) {\r\n return false;\r\n }\r\n\r\n if (defines._areImageProcessingDirty && this._imageProcessingConfiguration) {\r\n if (!this._imageProcessingConfiguration.isReady()) {\r\n return false;\r\n }\r\n\r\n this._imageProcessingConfiguration.prepareDefines(defines);\r\n\r\n defines.IS_REFLECTION_LINEAR = this.reflectionTexture != null && !this.reflectionTexture.gammaSpace;\r\n defines.IS_REFRACTION_LINEAR = this.refractionTexture != null && !this.refractionTexture.gammaSpace;\r\n }\r\n\r\n if (defines._areFresnelDirty) {\r\n if (StandardMaterial.FresnelEnabled) {\r\n // Fresnel\r\n if (\r\n this._diffuseFresnelParameters ||\r\n this._opacityFresnelParameters ||\r\n this._emissiveFresnelParameters ||\r\n this._refractionFresnelParameters ||\r\n this._reflectionFresnelParameters\r\n ) {\r\n defines.DIFFUSEFRESNEL = this._diffuseFresnelParameters && this._diffuseFresnelParameters.isEnabled;\r\n\r\n defines.OPACITYFRESNEL = this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled;\r\n\r\n defines.REFLECTIONFRESNEL = this._reflectionFresnelParameters && this._reflectionFresnelParameters.isEnabled;\r\n\r\n defines.REFLECTIONFRESNELFROMSPECULAR = this._useReflectionFresnelFromSpecular;\r\n\r\n defines.REFRACTIONFRESNEL = this._refractionFresnelParameters && this._refractionFresnelParameters.isEnabled;\r\n\r\n defines.EMISSIVEFRESNEL = this._emissiveFresnelParameters && this._emissiveFresnelParameters.isEnabled;\r\n\r\n defines._needNormals = true;\r\n defines.FRESNEL = true;\r\n }\r\n } else {\r\n defines.FRESNEL = false;\r\n }\r\n }\r\n\r\n // Misc.\r\n PrepareDefinesForMisc(\r\n mesh,\r\n scene,\r\n this._useLogarithmicDepth,\r\n this.pointsCloud,\r\n this.fogEnabled,\r\n this._shouldTurnAlphaTestOn(mesh) || this._forceAlphaTest,\r\n defines,\r\n this._applyDecalMapAfterDetailMap\r\n );\r\n\r\n // Values that need to be evaluated on every frame\r\n PrepareDefinesForFrameBoundValues(scene, engine, this, defines, useInstances, null, subMesh.getRenderingMesh().hasThinInstances);\r\n\r\n // External config\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.mesh = mesh;\r\n this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo);\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, true, true, true);\r\n\r\n // External config\r\n this._callbackPluginEventPrepareDefines(this._eventInfo);\r\n\r\n // Get correct effect\r\n let forceWasNotReadyPreviously = false;\r\n\r\n if (defines.isDirty) {\r\n const lightDisposed = defines._areLightsDisposed;\r\n defines.markAsProcessed();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.REFLECTION) {\r\n fallbacks.addFallback(0, \"REFLECTION\");\r\n }\r\n\r\n if (defines.SPECULAR) {\r\n fallbacks.addFallback(0, \"SPECULAR\");\r\n }\r\n\r\n if (defines.BUMP) {\r\n fallbacks.addFallback(0, \"BUMP\");\r\n }\r\n\r\n if (defines.PARALLAX) {\r\n fallbacks.addFallback(1, \"PARALLAX\");\r\n }\r\n\r\n if (defines.PARALLAX_RHS) {\r\n fallbacks.addFallback(1, \"PARALLAX_RHS\");\r\n }\r\n\r\n if (defines.PARALLAXOCCLUSION) {\r\n fallbacks.addFallback(0, \"PARALLAXOCCLUSION\");\r\n }\r\n\r\n if (defines.SPECULAROVERALPHA) {\r\n fallbacks.addFallback(0, \"SPECULAROVERALPHA\");\r\n }\r\n\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n if (defines.POINTSIZE) {\r\n fallbacks.addFallback(0, \"POINTSIZE\");\r\n }\r\n\r\n if (defines.LOGARITHMICDEPTH) {\r\n fallbacks.addFallback(0, \"LOGARITHMICDEPTH\");\r\n }\r\n\r\n HandleFallbacksForShadows(defines, fallbacks, this._maxSimultaneousLights);\r\n\r\n if (defines.SPECULARTERM) {\r\n fallbacks.addFallback(0, \"SPECULARTERM\");\r\n }\r\n\r\n if (defines.DIFFUSEFRESNEL) {\r\n fallbacks.addFallback(1, \"DIFFUSEFRESNEL\");\r\n }\r\n\r\n if (defines.OPACITYFRESNEL) {\r\n fallbacks.addFallback(2, \"OPACITYFRESNEL\");\r\n }\r\n\r\n if (defines.REFLECTIONFRESNEL) {\r\n fallbacks.addFallback(3, \"REFLECTIONFRESNEL\");\r\n }\r\n\r\n if (defines.EMISSIVEFRESNEL) {\r\n fallbacks.addFallback(4, \"EMISSIVEFRESNEL\");\r\n }\r\n\r\n if (defines.FRESNEL) {\r\n fallbacks.addFallback(4, \"FRESNEL\");\r\n }\r\n\r\n if (defines.MULTIVIEW) {\r\n fallbacks.addFallback(0, \"MULTIVIEW\");\r\n }\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.NORMAL) {\r\n attribs.push(VertexBuffer.NormalKind);\r\n }\r\n\r\n if (defines.TANGENT) {\r\n attribs.push(VertexBuffer.TangentKind);\r\n }\r\n\r\n for (let i = 1; i <= Constants.MAX_SUPPORTED_UV_SETS; ++i) {\r\n if (defines[\"UV\" + i]) {\r\n attribs.push(`uv${i === 1 ? \"\" : i}`);\r\n }\r\n }\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n PrepareAttributesForBones(attribs, mesh, defines, fallbacks);\r\n PrepareAttributesForInstances(attribs, defines);\r\n PrepareAttributesForMorphTargets(attribs, mesh, defines);\r\n PrepareAttributesForBakedVertexAnimation(attribs, mesh, defines);\r\n\r\n let shaderName = \"default\";\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"view\",\r\n \"viewProjection\",\r\n \"vEyePosition\",\r\n \"vLightsType\",\r\n \"vAmbientColor\",\r\n \"vDiffuseColor\",\r\n \"vSpecularColor\",\r\n \"vEmissiveColor\",\r\n \"visibility\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"pointSize\",\r\n \"vDiffuseInfos\",\r\n \"vAmbientInfos\",\r\n \"vOpacityInfos\",\r\n \"vReflectionInfos\",\r\n \"vEmissiveInfos\",\r\n \"vSpecularInfos\",\r\n \"vBumpInfos\",\r\n \"vLightmapInfos\",\r\n \"vRefractionInfos\",\r\n \"mBones\",\r\n \"diffuseMatrix\",\r\n \"ambientMatrix\",\r\n \"opacityMatrix\",\r\n \"reflectionMatrix\",\r\n \"emissiveMatrix\",\r\n \"specularMatrix\",\r\n \"bumpMatrix\",\r\n \"normalMatrix\",\r\n \"lightmapMatrix\",\r\n \"refractionMatrix\",\r\n \"diffuseLeftColor\",\r\n \"diffuseRightColor\",\r\n \"opacityParts\",\r\n \"reflectionLeftColor\",\r\n \"reflectionRightColor\",\r\n \"emissiveLeftColor\",\r\n \"emissiveRightColor\",\r\n \"refractionLeftColor\",\r\n \"refractionRightColor\",\r\n \"vReflectionPosition\",\r\n \"vReflectionSize\",\r\n \"vRefractionPosition\",\r\n \"vRefractionSize\",\r\n \"logarithmicDepthConstant\",\r\n \"vTangentSpaceParams\",\r\n \"alphaCutOff\",\r\n \"boneTextureWidth\",\r\n \"morphTargetTextureInfo\",\r\n \"morphTargetTextureIndices\",\r\n ];\r\n\r\n const samplers = [\r\n \"diffuseSampler\",\r\n \"ambientSampler\",\r\n \"opacitySampler\",\r\n \"reflectionCubeSampler\",\r\n \"reflection2DSampler\",\r\n \"emissiveSampler\",\r\n \"specularSampler\",\r\n \"bumpSampler\",\r\n \"lightmapSampler\",\r\n \"refractionCubeSampler\",\r\n \"refraction2DSampler\",\r\n \"boneSampler\",\r\n \"morphTargets\",\r\n \"oitDepthSampler\",\r\n \"oitFrontColorSampler\",\r\n ];\r\n\r\n const uniformBuffers = [\"Material\", \"Scene\", \"Mesh\"];\r\n\r\n const indexParameters = { maxSimultaneousLights: this._maxSimultaneousLights, maxSimultaneousMorphTargets: defines.NUM_MORPH_INFLUENCERS };\r\n\r\n this._eventInfo.fallbacks = fallbacks;\r\n this._eventInfo.fallbackRank = 0;\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.uniforms = uniforms;\r\n this._eventInfo.attributes = attribs;\r\n this._eventInfo.samplers = samplers;\r\n this._eventInfo.uniformBuffersNames = uniformBuffers;\r\n this._eventInfo.customCode = undefined;\r\n this._eventInfo.mesh = mesh;\r\n this._eventInfo.indexParameters = indexParameters;\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.PrepareEffect, this._eventInfo);\r\n\r\n PrePassConfiguration.AddUniforms(uniforms);\r\n PrePassConfiguration.AddSamplers(samplers);\r\n\r\n if (ImageProcessingConfiguration) {\r\n ImageProcessingConfiguration.PrepareUniforms(uniforms, defines);\r\n ImageProcessingConfiguration.PrepareSamplers(samplers, defines);\r\n }\r\n\r\n PrepareUniformsAndSamplersList({\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n maxSimultaneousLights: this._maxSimultaneousLights,\r\n });\r\n\r\n addClipPlaneUniforms(uniforms);\r\n\r\n const csnrOptions: ICustomShaderNameResolveOptions = {};\r\n\r\n if (this.customShaderNameResolve) {\r\n shaderName = this.customShaderNameResolve(shaderName, uniforms, uniformBuffers, samplers, defines, attribs, csnrOptions);\r\n }\r\n\r\n const join = defines.toString();\r\n\r\n const previousEffect = subMesh.effect;\r\n let effect = scene.getEngine().createEffect(\r\n shaderName,\r\n {\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters,\r\n processFinalCode: csnrOptions.processFinalCode,\r\n processCodeAfterIncludes: this._eventInfo.customCode,\r\n multiTarget: defines.PREPASS,\r\n },\r\n engine\r\n );\r\n\r\n this._eventInfo.customCode = undefined;\r\n\r\n if (effect) {\r\n if (this._onEffectCreatedObservable) {\r\n onCreatedEffectParameters.effect = effect;\r\n onCreatedEffectParameters.subMesh = subMesh;\r\n this._onEffectCreatedObservable.notifyObservers(onCreatedEffectParameters);\r\n }\r\n\r\n // Use previous effect while new one is compiling\r\n if (this.allowShaderHotSwapping && previousEffect && !effect.isReady()) {\r\n effect = previousEffect;\r\n defines.markAsUnprocessed();\r\n\r\n forceWasNotReadyPreviously = this.isFrozen;\r\n\r\n if (lightDisposed) {\r\n // re register in case it takes more than one frame.\r\n defines._areLightsDisposed = true;\r\n return false;\r\n }\r\n } else {\r\n scene.resetCachedMaterial();\r\n subMesh.setEffect(effect, defines, this._materialContext);\r\n }\r\n }\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = forceWasNotReadyPreviously ? false : true;\r\n drawWrapper._wasPreviouslyUsingInstances = useInstances;\r\n\r\n this._checkScenePerformancePriority();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Builds the material UBO layouts.\r\n * Used internally during the effect preparation.\r\n */\r\n public buildUniformLayout(): void {\r\n // Order is important !\r\n const ubo = this._uniformBuffer;\r\n ubo.addUniform(\"diffuseLeftColor\", 4);\r\n ubo.addUniform(\"diffuseRightColor\", 4);\r\n ubo.addUniform(\"opacityParts\", 4);\r\n ubo.addUniform(\"reflectionLeftColor\", 4);\r\n ubo.addUniform(\"reflectionRightColor\", 4);\r\n ubo.addUniform(\"refractionLeftColor\", 4);\r\n ubo.addUniform(\"refractionRightColor\", 4);\r\n ubo.addUniform(\"emissiveLeftColor\", 4);\r\n ubo.addUniform(\"emissiveRightColor\", 4);\r\n\r\n ubo.addUniform(\"vDiffuseInfos\", 2);\r\n ubo.addUniform(\"vAmbientInfos\", 2);\r\n ubo.addUniform(\"vOpacityInfos\", 2);\r\n ubo.addUniform(\"vReflectionInfos\", 2);\r\n ubo.addUniform(\"vReflectionPosition\", 3);\r\n ubo.addUniform(\"vReflectionSize\", 3);\r\n ubo.addUniform(\"vEmissiveInfos\", 2);\r\n ubo.addUniform(\"vLightmapInfos\", 2);\r\n ubo.addUniform(\"vSpecularInfos\", 2);\r\n ubo.addUniform(\"vBumpInfos\", 3);\r\n\r\n ubo.addUniform(\"diffuseMatrix\", 16);\r\n ubo.addUniform(\"ambientMatrix\", 16);\r\n ubo.addUniform(\"opacityMatrix\", 16);\r\n ubo.addUniform(\"reflectionMatrix\", 16);\r\n ubo.addUniform(\"emissiveMatrix\", 16);\r\n ubo.addUniform(\"lightmapMatrix\", 16);\r\n ubo.addUniform(\"specularMatrix\", 16);\r\n ubo.addUniform(\"bumpMatrix\", 16);\r\n ubo.addUniform(\"vTangentSpaceParams\", 2);\r\n ubo.addUniform(\"pointSize\", 1);\r\n ubo.addUniform(\"alphaCutOff\", 1);\r\n ubo.addUniform(\"refractionMatrix\", 16);\r\n ubo.addUniform(\"vRefractionInfos\", 4);\r\n ubo.addUniform(\"vRefractionPosition\", 3);\r\n ubo.addUniform(\"vRefractionSize\", 3);\r\n ubo.addUniform(\"vSpecularColor\", 4);\r\n ubo.addUniform(\"vEmissiveColor\", 3);\r\n ubo.addUniform(\"vDiffuseColor\", 4);\r\n ubo.addUniform(\"vAmbientColor\", 3);\r\n\r\n super.buildUniformLayout();\r\n }\r\n\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices Mesh.\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n mesh.transferToEffect(world);\r\n\r\n // Binding unconditionally\r\n this._uniformBuffer.bindToEffect(effect, \"Material\");\r\n\r\n this.prePassConfiguration.bindForSubMesh(this._activeEffect, scene, mesh, world, this.isFrozen);\r\n\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventHardBindForSubMesh(this._eventInfo);\r\n\r\n // Normal Matrix\r\n if (defines.OBJECTSPACE_NORMALMAP) {\r\n world.toNormalMatrix(this._normalMatrix);\r\n this.bindOnlyNormalMatrix(this._normalMatrix);\r\n }\r\n\r\n const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility);\r\n\r\n // Bones\r\n BindBonesParameters(mesh, effect);\r\n const ubo = this._uniformBuffer;\r\n if (mustRebind) {\r\n this.bindViewProjection(effect);\r\n if (!ubo.useUbo || !this.isFrozen || !ubo.isSync || subMesh._drawWrapper._forceRebindOnNextCall) {\r\n if (StandardMaterial.FresnelEnabled && defines.FRESNEL) {\r\n // Fresnel\r\n if (this.diffuseFresnelParameters && this.diffuseFresnelParameters.isEnabled) {\r\n ubo.updateColor4(\"diffuseLeftColor\", this.diffuseFresnelParameters.leftColor, this.diffuseFresnelParameters.power);\r\n ubo.updateColor4(\"diffuseRightColor\", this.diffuseFresnelParameters.rightColor, this.diffuseFresnelParameters.bias);\r\n }\r\n\r\n if (this.opacityFresnelParameters && this.opacityFresnelParameters.isEnabled) {\r\n ubo.updateColor4(\r\n \"opacityParts\",\r\n new Color3(\r\n this.opacityFresnelParameters.leftColor.toLuminance(),\r\n this.opacityFresnelParameters.rightColor.toLuminance(),\r\n this.opacityFresnelParameters.bias\r\n ),\r\n this.opacityFresnelParameters.power\r\n );\r\n }\r\n\r\n if (this.reflectionFresnelParameters && this.reflectionFresnelParameters.isEnabled) {\r\n ubo.updateColor4(\"reflectionLeftColor\", this.reflectionFresnelParameters.leftColor, this.reflectionFresnelParameters.power);\r\n ubo.updateColor4(\"reflectionRightColor\", this.reflectionFresnelParameters.rightColor, this.reflectionFresnelParameters.bias);\r\n }\r\n\r\n if (this.refractionFresnelParameters && this.refractionFresnelParameters.isEnabled) {\r\n ubo.updateColor4(\"refractionLeftColor\", this.refractionFresnelParameters.leftColor, this.refractionFresnelParameters.power);\r\n ubo.updateColor4(\"refractionRightColor\", this.refractionFresnelParameters.rightColor, this.refractionFresnelParameters.bias);\r\n }\r\n\r\n if (this.emissiveFresnelParameters && this.emissiveFresnelParameters.isEnabled) {\r\n ubo.updateColor4(\"emissiveLeftColor\", this.emissiveFresnelParameters.leftColor, this.emissiveFresnelParameters.power);\r\n ubo.updateColor4(\"emissiveRightColor\", this.emissiveFresnelParameters.rightColor, this.emissiveFresnelParameters.bias);\r\n }\r\n }\r\n\r\n // Textures\r\n if (scene.texturesEnabled) {\r\n if (this._diffuseTexture && StandardMaterial.DiffuseTextureEnabled) {\r\n ubo.updateFloat2(\"vDiffuseInfos\", this._diffuseTexture.coordinatesIndex, this._diffuseTexture.level);\r\n BindTextureMatrix(this._diffuseTexture, ubo, \"diffuse\");\r\n }\r\n\r\n if (this._ambientTexture && StandardMaterial.AmbientTextureEnabled) {\r\n ubo.updateFloat2(\"vAmbientInfos\", this._ambientTexture.coordinatesIndex, this._ambientTexture.level);\r\n BindTextureMatrix(this._ambientTexture, ubo, \"ambient\");\r\n }\r\n\r\n if (this._opacityTexture && StandardMaterial.OpacityTextureEnabled) {\r\n ubo.updateFloat2(\"vOpacityInfos\", this._opacityTexture.coordinatesIndex, this._opacityTexture.level);\r\n BindTextureMatrix(this._opacityTexture, ubo, \"opacity\");\r\n }\r\n\r\n if (this._hasAlphaChannel()) {\r\n ubo.updateFloat(\"alphaCutOff\", this.alphaCutOff);\r\n }\r\n\r\n if (this._reflectionTexture && StandardMaterial.ReflectionTextureEnabled) {\r\n ubo.updateFloat2(\"vReflectionInfos\", this._reflectionTexture.level, this.roughness);\r\n ubo.updateMatrix(\"reflectionMatrix\", this._reflectionTexture.getReflectionTextureMatrix());\r\n\r\n if ((this._reflectionTexture).boundingBoxSize) {\r\n const cubeTexture = this._reflectionTexture;\r\n\r\n ubo.updateVector3(\"vReflectionPosition\", cubeTexture.boundingBoxPosition);\r\n ubo.updateVector3(\"vReflectionSize\", cubeTexture.boundingBoxSize);\r\n }\r\n }\r\n\r\n if (this._emissiveTexture && StandardMaterial.EmissiveTextureEnabled) {\r\n ubo.updateFloat2(\"vEmissiveInfos\", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level);\r\n BindTextureMatrix(this._emissiveTexture, ubo, \"emissive\");\r\n }\r\n\r\n if (this._lightmapTexture && StandardMaterial.LightmapTextureEnabled) {\r\n ubo.updateFloat2(\"vLightmapInfos\", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level);\r\n BindTextureMatrix(this._lightmapTexture, ubo, \"lightmap\");\r\n }\r\n\r\n if (this._specularTexture && StandardMaterial.SpecularTextureEnabled) {\r\n ubo.updateFloat2(\"vSpecularInfos\", this._specularTexture.coordinatesIndex, this._specularTexture.level);\r\n BindTextureMatrix(this._specularTexture, ubo, \"specular\");\r\n }\r\n\r\n if (this._bumpTexture && scene.getEngine().getCaps().standardDerivatives && StandardMaterial.BumpTextureEnabled) {\r\n ubo.updateFloat3(\"vBumpInfos\", this._bumpTexture.coordinatesIndex, 1.0 / this._bumpTexture.level, this.parallaxScaleBias);\r\n BindTextureMatrix(this._bumpTexture, ubo, \"bump\");\r\n\r\n if (scene._mirroredCameraPosition) {\r\n ubo.updateFloat2(\"vTangentSpaceParams\", this._invertNormalMapX ? 1.0 : -1.0, this._invertNormalMapY ? 1.0 : -1.0);\r\n } else {\r\n ubo.updateFloat2(\"vTangentSpaceParams\", this._invertNormalMapX ? -1.0 : 1.0, this._invertNormalMapY ? -1.0 : 1.0);\r\n }\r\n }\r\n\r\n if (this._refractionTexture && StandardMaterial.RefractionTextureEnabled) {\r\n let depth = 1.0;\r\n if (!this._refractionTexture.isCube) {\r\n ubo.updateMatrix(\"refractionMatrix\", this._refractionTexture.getReflectionTextureMatrix());\r\n\r\n if ((this._refractionTexture).depth) {\r\n depth = (this._refractionTexture).depth;\r\n }\r\n }\r\n ubo.updateFloat4(\"vRefractionInfos\", this._refractionTexture.level, this.indexOfRefraction, depth, this.invertRefractionY ? -1 : 1);\r\n\r\n if ((this._refractionTexture).boundingBoxSize) {\r\n const cubeTexture = this._refractionTexture;\r\n\r\n ubo.updateVector3(\"vRefractionPosition\", cubeTexture.boundingBoxPosition);\r\n ubo.updateVector3(\"vRefractionSize\", cubeTexture.boundingBoxSize);\r\n }\r\n }\r\n }\r\n\r\n // Point size\r\n if (this.pointsCloud) {\r\n ubo.updateFloat(\"pointSize\", this.pointSize);\r\n }\r\n\r\n if (defines.SPECULARTERM) {\r\n ubo.updateColor4(\"vSpecularColor\", this.specularColor, this.specularPower);\r\n }\r\n\r\n ubo.updateColor3(\"vEmissiveColor\", StandardMaterial.EmissiveTextureEnabled ? this.emissiveColor : Color3.BlackReadOnly);\r\n ubo.updateColor4(\"vDiffuseColor\", this.diffuseColor, this.alpha);\r\n\r\n scene.ambientColor.multiplyToRef(this.ambientColor, this._globalAmbientColor);\r\n ubo.updateColor3(\"vAmbientColor\", this._globalAmbientColor);\r\n }\r\n\r\n // Textures\r\n if (scene.texturesEnabled) {\r\n if (this._diffuseTexture && StandardMaterial.DiffuseTextureEnabled) {\r\n effect.setTexture(\"diffuseSampler\", this._diffuseTexture);\r\n }\r\n\r\n if (this._ambientTexture && StandardMaterial.AmbientTextureEnabled) {\r\n effect.setTexture(\"ambientSampler\", this._ambientTexture);\r\n }\r\n\r\n if (this._opacityTexture && StandardMaterial.OpacityTextureEnabled) {\r\n effect.setTexture(\"opacitySampler\", this._opacityTexture);\r\n }\r\n\r\n if (this._reflectionTexture && StandardMaterial.ReflectionTextureEnabled) {\r\n if (this._reflectionTexture.isCube) {\r\n effect.setTexture(\"reflectionCubeSampler\", this._reflectionTexture);\r\n } else {\r\n effect.setTexture(\"reflection2DSampler\", this._reflectionTexture);\r\n }\r\n }\r\n\r\n if (this._emissiveTexture && StandardMaterial.EmissiveTextureEnabled) {\r\n effect.setTexture(\"emissiveSampler\", this._emissiveTexture);\r\n }\r\n\r\n if (this._lightmapTexture && StandardMaterial.LightmapTextureEnabled) {\r\n effect.setTexture(\"lightmapSampler\", this._lightmapTexture);\r\n }\r\n\r\n if (this._specularTexture && StandardMaterial.SpecularTextureEnabled) {\r\n effect.setTexture(\"specularSampler\", this._specularTexture);\r\n }\r\n\r\n if (this._bumpTexture && scene.getEngine().getCaps().standardDerivatives && StandardMaterial.BumpTextureEnabled) {\r\n effect.setTexture(\"bumpSampler\", this._bumpTexture);\r\n }\r\n\r\n if (this._refractionTexture && StandardMaterial.RefractionTextureEnabled) {\r\n if (this._refractionTexture.isCube) {\r\n effect.setTexture(\"refractionCubeSampler\", this._refractionTexture);\r\n } else {\r\n effect.setTexture(\"refraction2DSampler\", this._refractionTexture);\r\n }\r\n }\r\n }\r\n\r\n // OIT with depth peeling\r\n if (this.getScene().useOrderIndependentTransparency && this.needAlphaBlendingForMesh(mesh)) {\r\n this.getScene().depthPeelingRenderer!.bind(effect);\r\n }\r\n\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventBindForSubMesh(this._eventInfo);\r\n\r\n // Clip plane\r\n bindClipPlane(effect, this, scene);\r\n\r\n // Colors\r\n this.bindEyePosition(effect);\r\n } else if (scene.getEngine()._features.needToAlwaysBindUniformBuffers) {\r\n this._needToBindSceneUbo = true;\r\n }\r\n\r\n if (mustRebind || !this.isFrozen) {\r\n // Lights\r\n if (scene.lightsEnabled && !this._disableLighting) {\r\n BindLights(scene, mesh, effect, defines, this._maxSimultaneousLights);\r\n }\r\n\r\n // View\r\n if (\r\n (scene.fogEnabled && mesh.applyFog && scene.fogMode !== Scene.FOGMODE_NONE) ||\r\n this._reflectionTexture ||\r\n this._refractionTexture ||\r\n mesh.receiveShadows ||\r\n defines.PREPASS\r\n ) {\r\n this.bindView(effect);\r\n }\r\n\r\n // Fog\r\n BindFogParameters(scene, mesh, effect);\r\n\r\n // Morph targets\r\n if (defines.NUM_MORPH_INFLUENCERS) {\r\n BindMorphTargetParameters(mesh, effect);\r\n }\r\n\r\n if (defines.BAKED_VERTEX_ANIMATION_TEXTURE) {\r\n mesh.bakedVertexAnimationManager?.bind(effect, defines.INSTANCES);\r\n }\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n\r\n // image processing\r\n if (this._imageProcessingConfiguration && !this._imageProcessingConfiguration.applyByPostProcess) {\r\n this._imageProcessingConfiguration.bind(this._activeEffect);\r\n }\r\n }\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n ubo.update();\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public getAnimatables(): IAnimatable[] {\r\n const results = super.getAnimatables();\r\n\r\n if (this._diffuseTexture && this._diffuseTexture.animations && this._diffuseTexture.animations.length > 0) {\r\n results.push(this._diffuseTexture);\r\n }\r\n\r\n if (this._ambientTexture && this._ambientTexture.animations && this._ambientTexture.animations.length > 0) {\r\n results.push(this._ambientTexture);\r\n }\r\n\r\n if (this._opacityTexture && this._opacityTexture.animations && this._opacityTexture.animations.length > 0) {\r\n results.push(this._opacityTexture);\r\n }\r\n\r\n if (this._reflectionTexture && this._reflectionTexture.animations && this._reflectionTexture.animations.length > 0) {\r\n results.push(this._reflectionTexture);\r\n }\r\n\r\n if (this._emissiveTexture && this._emissiveTexture.animations && this._emissiveTexture.animations.length > 0) {\r\n results.push(this._emissiveTexture);\r\n }\r\n\r\n if (this._specularTexture && this._specularTexture.animations && this._specularTexture.animations.length > 0) {\r\n results.push(this._specularTexture);\r\n }\r\n\r\n if (this._bumpTexture && this._bumpTexture.animations && this._bumpTexture.animations.length > 0) {\r\n results.push(this._bumpTexture);\r\n }\r\n\r\n if (this._lightmapTexture && this._lightmapTexture.animations && this._lightmapTexture.animations.length > 0) {\r\n results.push(this._lightmapTexture);\r\n }\r\n\r\n if (this._refractionTexture && this._refractionTexture.animations && this._refractionTexture.animations.length > 0) {\r\n results.push(this._refractionTexture);\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Gets the active textures from the material\r\n * @returns an array of textures\r\n */\r\n public getActiveTextures(): BaseTexture[] {\r\n const activeTextures = super.getActiveTextures();\r\n\r\n if (this._diffuseTexture) {\r\n activeTextures.push(this._diffuseTexture);\r\n }\r\n\r\n if (this._ambientTexture) {\r\n activeTextures.push(this._ambientTexture);\r\n }\r\n\r\n if (this._opacityTexture) {\r\n activeTextures.push(this._opacityTexture);\r\n }\r\n\r\n if (this._reflectionTexture) {\r\n activeTextures.push(this._reflectionTexture);\r\n }\r\n\r\n if (this._emissiveTexture) {\r\n activeTextures.push(this._emissiveTexture);\r\n }\r\n\r\n if (this._specularTexture) {\r\n activeTextures.push(this._specularTexture);\r\n }\r\n\r\n if (this._bumpTexture) {\r\n activeTextures.push(this._bumpTexture);\r\n }\r\n\r\n if (this._lightmapTexture) {\r\n activeTextures.push(this._lightmapTexture);\r\n }\r\n\r\n if (this._refractionTexture) {\r\n activeTextures.push(this._refractionTexture);\r\n }\r\n\r\n return activeTextures;\r\n }\r\n\r\n /**\r\n * Specifies if the material uses a texture\r\n * @param texture defines the texture to check against the material\r\n * @returns a boolean specifying if the material uses the texture\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n if (super.hasTexture(texture)) {\r\n return true;\r\n }\r\n\r\n if (this._diffuseTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._ambientTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._opacityTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._reflectionTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._emissiveTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._specularTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._bumpTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._lightmapTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._refractionTexture === texture) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the material\r\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\r\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\r\n */\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean): void {\r\n if (forceDisposeTextures) {\r\n this._diffuseTexture?.dispose();\r\n this._ambientTexture?.dispose();\r\n this._opacityTexture?.dispose();\r\n this._reflectionTexture?.dispose();\r\n this._emissiveTexture?.dispose();\r\n this._specularTexture?.dispose();\r\n this._bumpTexture?.dispose();\r\n this._lightmapTexture?.dispose();\r\n this._refractionTexture?.dispose();\r\n }\r\n\r\n if (this._imageProcessingConfiguration && this._imageProcessingObserver) {\r\n this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver);\r\n }\r\n\r\n super.dispose(forceDisposeEffect, forceDisposeTextures);\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the material, and gives it a new name\r\n * @param name defines the new name for the duplicated material\r\n * @param cloneTexturesOnlyOnce - if a texture is used in more than one channel (e.g diffuse and opacity), only clone it once and reuse it on the other channels. Default false.\r\n * @param rootUrl defines the root URL to use to load textures\r\n * @returns the cloned material\r\n */\r\n public clone(name: string, cloneTexturesOnlyOnce: boolean = true, rootUrl = \"\"): StandardMaterial {\r\n const result = SerializationHelper.Clone(() => new StandardMaterial(name, this.getScene()), this, { cloneTexturesOnlyOnce });\r\n\r\n result.name = name;\r\n result.id = name;\r\n\r\n this.stencil.copyTo(result.stencil);\r\n\r\n this._clonePlugins(result, rootUrl);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a standard material from parsed material data\r\n * @param source defines the JSON representation of the material\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a new standard material\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): StandardMaterial {\r\n const material = SerializationHelper.Parse(() => new StandardMaterial(source.name, scene), source, scene, rootUrl);\r\n\r\n if (source.stencil) {\r\n material.stencil.parse(source.stencil, scene, rootUrl);\r\n }\r\n\r\n Material._ParsePlugins(source, material, scene, rootUrl);\r\n\r\n return material;\r\n }\r\n\r\n // Flags used to enable or disable a type of texture for all Standard Materials\r\n /**\r\n * Are diffuse textures enabled in the application.\r\n */\r\n public static get DiffuseTextureEnabled(): boolean {\r\n return MaterialFlags.DiffuseTextureEnabled;\r\n }\r\n public static set DiffuseTextureEnabled(value: boolean) {\r\n MaterialFlags.DiffuseTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are detail textures enabled in the application.\r\n */\r\n public static get DetailTextureEnabled(): boolean {\r\n return MaterialFlags.DetailTextureEnabled;\r\n }\r\n public static set DetailTextureEnabled(value: boolean) {\r\n MaterialFlags.DetailTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are ambient textures enabled in the application.\r\n */\r\n public static get AmbientTextureEnabled(): boolean {\r\n return MaterialFlags.AmbientTextureEnabled;\r\n }\r\n public static set AmbientTextureEnabled(value: boolean) {\r\n MaterialFlags.AmbientTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are opacity textures enabled in the application.\r\n */\r\n public static get OpacityTextureEnabled(): boolean {\r\n return MaterialFlags.OpacityTextureEnabled;\r\n }\r\n public static set OpacityTextureEnabled(value: boolean) {\r\n MaterialFlags.OpacityTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are reflection textures enabled in the application.\r\n */\r\n public static get ReflectionTextureEnabled(): boolean {\r\n return MaterialFlags.ReflectionTextureEnabled;\r\n }\r\n public static set ReflectionTextureEnabled(value: boolean) {\r\n MaterialFlags.ReflectionTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are emissive textures enabled in the application.\r\n */\r\n public static get EmissiveTextureEnabled(): boolean {\r\n return MaterialFlags.EmissiveTextureEnabled;\r\n }\r\n public static set EmissiveTextureEnabled(value: boolean) {\r\n MaterialFlags.EmissiveTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are specular textures enabled in the application.\r\n */\r\n public static get SpecularTextureEnabled(): boolean {\r\n return MaterialFlags.SpecularTextureEnabled;\r\n }\r\n public static set SpecularTextureEnabled(value: boolean) {\r\n MaterialFlags.SpecularTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are bump textures enabled in the application.\r\n */\r\n public static get BumpTextureEnabled(): boolean {\r\n return MaterialFlags.BumpTextureEnabled;\r\n }\r\n public static set BumpTextureEnabled(value: boolean) {\r\n MaterialFlags.BumpTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are lightmap textures enabled in the application.\r\n */\r\n public static get LightmapTextureEnabled(): boolean {\r\n return MaterialFlags.LightmapTextureEnabled;\r\n }\r\n public static set LightmapTextureEnabled(value: boolean) {\r\n MaterialFlags.LightmapTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are refraction textures enabled in the application.\r\n */\r\n public static get RefractionTextureEnabled(): boolean {\r\n return MaterialFlags.RefractionTextureEnabled;\r\n }\r\n public static set RefractionTextureEnabled(value: boolean) {\r\n MaterialFlags.RefractionTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are color grading textures enabled in the application.\r\n */\r\n public static get ColorGradingTextureEnabled(): boolean {\r\n return MaterialFlags.ColorGradingTextureEnabled;\r\n }\r\n public static set ColorGradingTextureEnabled(value: boolean) {\r\n MaterialFlags.ColorGradingTextureEnabled = value;\r\n }\r\n\r\n /**\r\n * Are fresnels enabled in the application.\r\n */\r\n public static get FresnelEnabled(): boolean {\r\n return MaterialFlags.FresnelEnabled;\r\n }\r\n public static set FresnelEnabled(value: boolean) {\r\n MaterialFlags.FresnelEnabled = value;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.StandardMaterial\", StandardMaterial);\r\n\r\nScene.DefaultMaterialFactory = (scene: Scene) => {\r\n return new StandardMaterial(\"default material\", scene);\r\n};\r\n", "import type { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport type { IDisposable } from \"../scene\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport type { Observable } from \"core/Misc/observable\";\r\n\r\n/**\r\n * Defining the interface required for a (webxr) feature\r\n */\r\nexport interface IWebXRFeature extends IDisposable {\r\n /**\r\n * Is this feature attached\r\n */\r\n attached: boolean;\r\n /**\r\n * Should auto-attach be disabled?\r\n */\r\n disableAutoAttach: boolean;\r\n\r\n /**\r\n * Attach the feature to the session\r\n * Will usually be called by the features manager\r\n *\r\n * @param force should attachment be forced (even when already attached)\r\n * @returns true if successful.\r\n */\r\n attach(force?: boolean): boolean;\r\n /**\r\n * Detach the feature from the session\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n detach(): boolean;\r\n\r\n /**\r\n * This function will be executed during before enabling the feature and can be used to not-allow enabling it.\r\n * Note that at this point the session has NOT started, so this is purely checking if the browser supports it\r\n *\r\n * @returns whether or not the feature is compatible in this environment\r\n */\r\n isCompatible(): boolean;\r\n\r\n /**\r\n * Was this feature disposed;\r\n */\r\n isDisposed: boolean;\r\n\r\n /**\r\n * The name of the native xr feature name, if applicable (like anchor, hit-test, or hand-tracking)\r\n */\r\n xrNativeFeatureName?: string;\r\n\r\n /**\r\n * A list of (Babylon WebXR) features this feature depends on\r\n */\r\n dependsOn?: string[];\r\n\r\n /**\r\n * If this feature requires to extend the XRSessionInit object, this function will return the partial XR session init object\r\n */\r\n getXRSessionInitExtension?: () => Promise>;\r\n\r\n /**\r\n * Triggered when the feature is attached\r\n */\r\n onFeatureAttachObservable: Observable;\r\n /**\r\n * Triggered when the feature is detached\r\n */\r\n onFeatureDetachObservable: Observable;\r\n}\r\n\r\n/**\r\n * A list of the currently available features without referencing them\r\n */\r\nexport class WebXRFeatureName {\r\n /**\r\n * The name of the anchor system feature\r\n */\r\n public static readonly ANCHOR_SYSTEM = \"xr-anchor-system\";\r\n /**\r\n * The name of the background remover feature\r\n */\r\n public static readonly BACKGROUND_REMOVER = \"xr-background-remover\";\r\n /**\r\n * The name of the hit test feature\r\n */\r\n public static readonly HIT_TEST = \"xr-hit-test\";\r\n /**\r\n * The name of the mesh detection feature\r\n */\r\n public static readonly MESH_DETECTION = \"xr-mesh-detection\";\r\n /**\r\n * physics impostors for xr controllers feature\r\n */\r\n public static readonly PHYSICS_CONTROLLERS = \"xr-physics-controller\";\r\n /**\r\n * The name of the plane detection feature\r\n */\r\n public static readonly PLANE_DETECTION = \"xr-plane-detection\";\r\n /**\r\n * The name of the pointer selection feature\r\n */\r\n public static readonly POINTER_SELECTION = \"xr-controller-pointer-selection\";\r\n /**\r\n * The name of the teleportation feature\r\n */\r\n public static readonly TELEPORTATION = \"xr-controller-teleportation\";\r\n /**\r\n * The name of the feature points feature.\r\n */\r\n public static readonly FEATURE_POINTS = \"xr-feature-points\";\r\n /**\r\n * The name of the hand tracking feature.\r\n */\r\n public static readonly HAND_TRACKING = \"xr-hand-tracking\";\r\n /**\r\n * The name of the image tracking feature\r\n */\r\n public static readonly IMAGE_TRACKING = \"xr-image-tracking\";\r\n /**\r\n * The name of the near interaction feature\r\n */\r\n public static readonly NEAR_INTERACTION = \"xr-near-interaction\";\r\n /**\r\n * The name of the DOM overlay feature\r\n */\r\n public static readonly DOM_OVERLAY = \"xr-dom-overlay\";\r\n /**\r\n * The name of the movement feature\r\n */\r\n public static readonly MOVEMENT = \"xr-controller-movement\";\r\n /**\r\n * The name of the light estimation feature\r\n */\r\n public static readonly LIGHT_ESTIMATION = \"xr-light-estimation\";\r\n /**\r\n * The name of the eye tracking feature\r\n */\r\n public static readonly EYE_TRACKING = \"xr-eye-tracking\";\r\n /**\r\n * The name of the walking locomotion feature\r\n */\r\n public static readonly WALKING_LOCOMOTION = \"xr-walking-locomotion\";\r\n /**\r\n * The name of the composition layers feature\r\n */\r\n public static readonly LAYERS = \"xr-layers\";\r\n /**\r\n * The name of the depth sensing feature\r\n */\r\n public static readonly DEPTH_SENSING = \"xr-depth-sensing\";\r\n /**\r\n * The name of the WebXR Space Warp feature\r\n */\r\n public static readonly SPACE_WARP = \"xr-space-warp\";\r\n /**\r\n * The name of the WebXR Raw Camera Access feature\r\n */\r\n public static readonly RAW_CAMERA_ACCESS = \"xr-raw-camera-access\";\r\n}\r\n\r\n/**\r\n * Defining the constructor of a feature. Used to register the modules.\r\n */\r\nexport type WebXRFeatureConstructor = (xrSessionManager: WebXRSessionManager, options?: any) => () => IWebXRFeature;\r\n\r\n/**\r\n * The WebXR features manager is responsible of enabling or disabling features required for the current XR session.\r\n * It is mainly used in AR sessions.\r\n *\r\n * A feature can have a version that is defined by Babylon (and does not correspond with the webxr version).\r\n */\r\nexport class WebXRFeaturesManager implements IDisposable {\r\n private static readonly _AvailableFeatures: {\r\n [name: string]: {\r\n stable: number;\r\n latest: number;\r\n [version: number]: WebXRFeatureConstructor;\r\n };\r\n } = {};\r\n\r\n private _features: {\r\n [name: string]: {\r\n featureImplementation: IWebXRFeature;\r\n version: number;\r\n enabled: boolean;\r\n required: boolean;\r\n };\r\n } = {};\r\n\r\n /**\r\n * The key is the feature to check and the value is the feature that conflicts.\r\n */\r\n private static readonly _ConflictingFeatures: { [key: string]: string } = {\r\n [WebXRFeatureName.TELEPORTATION]: WebXRFeatureName.MOVEMENT,\r\n [WebXRFeatureName.MOVEMENT]: WebXRFeatureName.TELEPORTATION,\r\n };\r\n\r\n /**\r\n * constructs a new features manages.\r\n *\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n */\r\n constructor(private _xrSessionManager: WebXRSessionManager) {\r\n // when session starts / initialized - attach\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this.getEnabledFeatures().forEach((featureName) => {\r\n const feature = this._features[featureName];\r\n if (feature.enabled && !feature.featureImplementation.attached && !feature.featureImplementation.disableAutoAttach) {\r\n this.attachFeature(featureName);\r\n }\r\n });\r\n });\r\n\r\n // when session ends - detach\r\n this._xrSessionManager.onXRSessionEnded.add(() => {\r\n this.getEnabledFeatures().forEach((featureName) => {\r\n const feature = this._features[featureName];\r\n if (feature.enabled && feature.featureImplementation.attached) {\r\n // detach, but don't disable!\r\n this.detachFeature(featureName);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Used to register a module. After calling this function a developer can use this feature in the scene.\r\n * Mainly used internally.\r\n *\r\n * @param featureName the name of the feature to register\r\n * @param constructorFunction the function used to construct the module\r\n * @param version the (babylon) version of the module\r\n * @param stable is that a stable version of this module\r\n */\r\n public static AddWebXRFeature(featureName: string, constructorFunction: WebXRFeatureConstructor, version: number = 1, stable: boolean = false) {\r\n this._AvailableFeatures[featureName] = this._AvailableFeatures[featureName] || { latest: version };\r\n if (version > this._AvailableFeatures[featureName].latest) {\r\n this._AvailableFeatures[featureName].latest = version;\r\n }\r\n if (stable) {\r\n this._AvailableFeatures[featureName].stable = version;\r\n }\r\n this._AvailableFeatures[featureName][version] = constructorFunction;\r\n }\r\n\r\n /**\r\n * Returns a constructor of a specific feature.\r\n *\r\n * @param featureName the name of the feature to construct\r\n * @param version the version of the feature to load\r\n * @param xrSessionManager the xrSessionManager. Used to construct the module\r\n * @param options optional options provided to the module.\r\n * @returns a function that, when called, will return a new instance of this feature\r\n */\r\n public static ConstructFeature(featureName: string, version: number = 1, xrSessionManager: WebXRSessionManager, options?: any): () => IWebXRFeature {\r\n const constructorFunction = this._AvailableFeatures[featureName][version];\r\n if (!constructorFunction) {\r\n // throw an error? return nothing?\r\n throw new Error(\"feature not found\");\r\n }\r\n\r\n return constructorFunction(xrSessionManager, options);\r\n }\r\n\r\n /**\r\n * Can be used to return the list of features currently registered\r\n *\r\n * @returns an Array of available features\r\n */\r\n public static GetAvailableFeatures() {\r\n return Object.keys(this._AvailableFeatures);\r\n }\r\n\r\n /**\r\n * Gets the versions available for a specific feature\r\n * @param featureName the name of the feature\r\n * @returns an array with the available versions\r\n */\r\n public static GetAvailableVersions(featureName: string) {\r\n return Object.keys(this._AvailableFeatures[featureName]);\r\n }\r\n\r\n /**\r\n * Return the latest unstable version of this feature\r\n * @param featureName the name of the feature to search\r\n * @returns the version number. if not found will return -1\r\n */\r\n public static GetLatestVersionOfFeature(featureName: string): number {\r\n return (this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].latest) || -1;\r\n }\r\n\r\n /**\r\n * Return the latest stable version of this feature\r\n * @param featureName the name of the feature to search\r\n * @returns the version number. if not found will return -1\r\n */\r\n public static GetStableVersionOfFeature(featureName: string): number {\r\n return (this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].stable) || -1;\r\n }\r\n\r\n /**\r\n * Attach a feature to the current session. Mainly used when session started to start the feature effect.\r\n * Can be used during a session to start a feature\r\n * @param featureName the name of feature to attach\r\n */\r\n public attachFeature(featureName: string) {\r\n const feature = this._features[featureName];\r\n if (feature && feature.enabled && !feature.featureImplementation.attached) {\r\n const attached = feature.featureImplementation.attach();\r\n if (!attached) {\r\n Tools.Warn(`Feature ${featureName} failed to attach`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Can be used inside a session or when the session ends to detach a specific feature\r\n * @param featureName the name of the feature to detach\r\n */\r\n public detachFeature(featureName: string) {\r\n const feature = this._features[featureName];\r\n if (feature && feature.featureImplementation.attached) {\r\n const detached = feature.featureImplementation.detach();\r\n if (!detached) {\r\n Tools.Warn(`Feature ${featureName} failed to detach`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Used to disable an already-enabled feature\r\n * The feature will be disposed and will be recreated once enabled.\r\n * @param featureName the feature to disable\r\n * @returns true if disable was successful\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public disableFeature(featureName: string | { Name: string }): boolean {\r\n const name = typeof featureName === \"string\" ? featureName : featureName.Name;\r\n const feature = this._features[name];\r\n if (feature && feature.enabled) {\r\n feature.enabled = false;\r\n this.detachFeature(name);\r\n feature.featureImplementation.dispose();\r\n delete this._features[name];\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * dispose this features manager\r\n */\r\n public dispose(): void {\r\n this.getEnabledFeatures().forEach((feature) => {\r\n this.disableFeature(feature);\r\n });\r\n }\r\n\r\n /**\r\n * Enable a feature using its name and a version. This will enable it in the scene, and will be responsible to attach it when the session starts.\r\n * If used twice, the old version will be disposed and a new one will be constructed. This way you can re-enable with different configuration.\r\n *\r\n * @param featureName the name of the feature to load or the class of the feature\r\n * @param version optional version to load. if not provided the latest version will be enabled\r\n * @param moduleOptions options provided to the module. Ses the module documentation / constructor\r\n * @param attachIfPossible if set to true (default) the feature will be automatically attached, if it is currently possible\r\n * @param required is this feature required to the app. If set to true the session init will fail if the feature is not available.\r\n * @returns a new constructed feature or throws an error if feature not found or conflicts with another enabled feature.\r\n */\r\n public enableFeature(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n featureName: string | { Name: string },\r\n version: number | string = \"latest\",\r\n moduleOptions: any = {},\r\n attachIfPossible: boolean = true,\r\n required: boolean = true\r\n ): IWebXRFeature {\r\n const name = typeof featureName === \"string\" ? featureName : featureName.Name;\r\n let versionToLoad = 0;\r\n if (typeof version === \"string\") {\r\n if (!version) {\r\n throw new Error(`Error in provided version - ${name} (${version})`);\r\n }\r\n if (version === \"stable\") {\r\n versionToLoad = WebXRFeaturesManager.GetStableVersionOfFeature(name);\r\n } else if (version === \"latest\") {\r\n versionToLoad = WebXRFeaturesManager.GetLatestVersionOfFeature(name);\r\n } else {\r\n // try loading the number the string represents\r\n versionToLoad = +version;\r\n }\r\n if (versionToLoad === -1 || isNaN(versionToLoad)) {\r\n throw new Error(`feature not found - ${name} (${version})`);\r\n }\r\n } else {\r\n versionToLoad = version;\r\n }\r\n\r\n // check if there is a feature conflict\r\n const conflictingFeature = WebXRFeaturesManager._ConflictingFeatures[name];\r\n if (conflictingFeature !== undefined && this.getEnabledFeatures().indexOf(conflictingFeature) !== -1) {\r\n throw new Error(`Feature ${name} cannot be enabled while ${conflictingFeature} is enabled.`);\r\n }\r\n\r\n // check if already initialized\r\n const feature = this._features[name];\r\n const constructFunction = WebXRFeaturesManager.ConstructFeature(name, versionToLoad, this._xrSessionManager, moduleOptions);\r\n if (!constructFunction) {\r\n // report error?\r\n throw new Error(`feature not found - ${name}`);\r\n }\r\n\r\n /* If the feature is already enabled, detach and dispose it, and create a new one */\r\n if (feature) {\r\n this.disableFeature(name);\r\n }\r\n\r\n const constructed = constructFunction();\r\n if (constructed.dependsOn) {\r\n const dependentsFound = constructed.dependsOn.every((featureName) => !!this._features[featureName]);\r\n if (!dependentsFound) {\r\n throw new Error(`Dependant features missing. Make sure the following features are enabled - ${constructed.dependsOn.join(\", \")}`);\r\n }\r\n }\r\n if (constructed.isCompatible()) {\r\n this._features[name] = {\r\n featureImplementation: constructed,\r\n enabled: true,\r\n version: versionToLoad,\r\n required,\r\n };\r\n\r\n if (attachIfPossible) {\r\n // if session started already, request and enable\r\n if (this._xrSessionManager.session && !this._features[name].featureImplementation.attached) {\r\n // enable feature\r\n this.attachFeature(name);\r\n }\r\n } else {\r\n // disable auto-attach when session starts\r\n this._features[name].featureImplementation.disableAutoAttach = true;\r\n }\r\n\r\n return this._features[name].featureImplementation;\r\n } else {\r\n if (required) {\r\n throw new Error(\"required feature not compatible\");\r\n } else {\r\n Tools.Warn(`Feature ${name} not compatible with the current environment/browser and was not enabled.`);\r\n return constructed;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * get the implementation of an enabled feature.\r\n * @param featureName the name of the feature to load\r\n * @returns the feature class, if found\r\n */\r\n public getEnabledFeature(featureName: string): IWebXRFeature {\r\n return this._features[featureName] && this._features[featureName].featureImplementation;\r\n }\r\n\r\n /**\r\n * Get the list of enabled features\r\n * @returns an array of enabled features\r\n */\r\n public getEnabledFeatures() {\r\n return Object.keys(this._features);\r\n }\r\n\r\n /**\r\n * This function will extend the session creation configuration object with enabled features.\r\n * If, for example, the anchors feature is enabled, it will be automatically added to the optional or required features list,\r\n * according to the defined \"required\" variable, provided during enableFeature call\r\n * @param xrSessionInit the xr Session init object to extend\r\n *\r\n * @returns an extended XRSessionInit object\r\n */\r\n public async _extendXRSessionInitObject(xrSessionInit: XRSessionInit): Promise {\r\n const enabledFeatures = this.getEnabledFeatures();\r\n for (const featureName of enabledFeatures) {\r\n const feature = this._features[featureName];\r\n const nativeName = feature.featureImplementation.xrNativeFeatureName;\r\n if (nativeName) {\r\n if (feature.required) {\r\n xrSessionInit.requiredFeatures = xrSessionInit.requiredFeatures || [];\r\n if (xrSessionInit.requiredFeatures.indexOf(nativeName) === -1) {\r\n xrSessionInit.requiredFeatures.push(nativeName);\r\n }\r\n } else {\r\n xrSessionInit.optionalFeatures = xrSessionInit.optionalFeatures || [];\r\n if (xrSessionInit.optionalFeatures.indexOf(nativeName) === -1) {\r\n xrSessionInit.optionalFeatures.push(nativeName);\r\n }\r\n }\r\n }\r\n if (feature.featureImplementation.getXRSessionInitExtension) {\r\n const extended = await feature.featureImplementation.getXRSessionInitExtension();\r\n xrSessionInit = {\r\n ...xrSessionInit,\r\n ...extended,\r\n };\r\n }\r\n }\r\n return xrSessionInit;\r\n }\r\n}\r\n", "import type { IWebXRFeature } from \"../webXRFeaturesManager\";\r\nimport type { Observer, EventState } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * This is the base class for all WebXR features.\r\n * Since most features require almost the same resources and callbacks, this class can be used to simplify the development\r\n * Note that since the features manager is using the `IWebXRFeature` you are in no way obligated to use this class\r\n */\r\nexport abstract class WebXRAbstractFeature implements IWebXRFeature {\r\n private _attached: boolean = false;\r\n private _removeOnDetach: {\r\n observer: Nullable>;\r\n observable: Observable;\r\n }[] = [];\r\n\r\n /**\r\n * Is this feature disposed?\r\n */\r\n public isDisposed: boolean = false;\r\n\r\n /**\r\n * Should auto-attach be disabled?\r\n */\r\n public disableAutoAttach: boolean = false;\r\n\r\n protected _xrNativeFeatureName: string = \"\";\r\n\r\n /**\r\n * The name of the native xr feature name (like anchor, hit-test, or hand-tracking)\r\n */\r\n public get xrNativeFeatureName() {\r\n return this._xrNativeFeatureName;\r\n }\r\n\r\n public set xrNativeFeatureName(name: string) {\r\n // check if feature was initialized while in session but needs to be initialized before the session starts\r\n if (!this._xrSessionManager.isNative && name && this._xrSessionManager.inXRSession && this._xrSessionManager.enabledFeatures?.indexOf(name) === -1) {\r\n Logger.Warn(`The feature ${name} needs to be enabled before starting the XR session. Note - It is still possible it is not supported.`);\r\n }\r\n this._xrNativeFeatureName = name;\r\n }\r\n\r\n /**\r\n * Observers registered here will be executed when the feature is attached\r\n */\r\n public onFeatureAttachObservable: Observable = new Observable();\r\n /**\r\n * Observers registered here will be executed when the feature is detached\r\n */\r\n public onFeatureDetachObservable: Observable = new Observable();\r\n\r\n /**\r\n * The dependencies of this feature, if any\r\n */\r\n public dependsOn?: string[];\r\n\r\n /**\r\n * Construct a new (abstract) WebXR feature\r\n * @param _xrSessionManager the xr session manager for this feature\r\n */\r\n constructor(protected _xrSessionManager: WebXRSessionManager) {}\r\n\r\n /**\r\n * Is this feature attached\r\n */\r\n public get attached() {\r\n return this._attached;\r\n }\r\n\r\n /**\r\n * attach this feature\r\n *\r\n * @param force should attachment be forced (even when already attached)\r\n * @returns true if successful, false is failed or already attached\r\n */\r\n public attach(force?: boolean): boolean {\r\n // do not attach a disposed feature\r\n if (this.isDisposed) {\r\n return false;\r\n }\r\n if (!force) {\r\n if (this.attached) {\r\n return false;\r\n }\r\n } else {\r\n if (this.attached) {\r\n // detach first, to be sure\r\n this.detach();\r\n }\r\n }\r\n\r\n // if this is a native WebXR feature, check if it is enabled on the session\r\n // For now only check if not using babylon native\r\n // vision OS doesn't support the enabledFeatures array, so just warn instead of failing\r\n if (!this._xrSessionManager.enabledFeatures) {\r\n Logger.Warn(\"session.enabledFeatures is not available on this device. It is possible that this feature is not supported.\");\r\n } else if (!this._xrSessionManager.isNative && this.xrNativeFeatureName && this._xrSessionManager.enabledFeatures.indexOf(this.xrNativeFeatureName) === -1) {\r\n return false;\r\n }\r\n\r\n this._attached = true;\r\n this._addNewAttachObserver(this._xrSessionManager.onXRFrameObservable, (frame) => this._onXRFrame(frame));\r\n this.onFeatureAttachObservable.notifyObservers(this);\r\n return true;\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n *\r\n * @returns true if successful, false if failed or already detached\r\n */\r\n public detach(): boolean {\r\n if (!this._attached) {\r\n this.disableAutoAttach = true;\r\n return false;\r\n }\r\n this._attached = false;\r\n this._removeOnDetach.forEach((toRemove) => {\r\n toRemove.observable.remove(toRemove.observer);\r\n });\r\n this.onFeatureDetachObservable.notifyObservers(this);\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public dispose(): void {\r\n this.detach();\r\n this.isDisposed = true;\r\n this.onFeatureAttachObservable.clear();\r\n this.onFeatureDetachObservable.clear();\r\n }\r\n\r\n /**\r\n * This function will be executed during before enabling the feature and can be used to not-allow enabling it.\r\n * Note that at this point the session has NOT started, so this is purely checking if the browser supports it\r\n *\r\n * @returns whether or not the feature is compatible in this environment\r\n */\r\n public isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * This is used to register callbacks that will automatically be removed when detach is called.\r\n * @param observable the observable to which the observer will be attached\r\n * @param callback the callback to register\r\n * @param insertFirst should the callback be executed as soon as it is registered\r\n */\r\n protected _addNewAttachObserver(observable: Observable, callback: (eventData: T, eventState: EventState) => void, insertFirst?: boolean) {\r\n this._removeOnDetach.push({\r\n observable,\r\n observer: observable.add(callback, undefined, insertFirst),\r\n });\r\n }\r\n\r\n /**\r\n * Code in this function will be executed on each xrFrame received from the browser.\r\n * This function will not execute after the feature is detached.\r\n * @param _xrFrame the current frame\r\n */\r\n protected abstract _onXRFrame(_xrFrame: XRFrame): void;\r\n}\r\n", "import type { Vector3 } from \"../../Maths/math.vector\";\r\nimport type { IPhysicsEnginePlugin } from \"./IPhysicsEnginePlugin\";\r\n/**\r\n * Interface for Physics-Joint data\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport interface PhysicsJointData {\r\n //Important for some engines, optional!\r\n /**\r\n * The main pivot of the joint\r\n */\r\n mainPivot?: Vector3;\r\n /**\r\n * The connected pivot of the joint\r\n */\r\n connectedPivot?: Vector3;\r\n /**\r\n * The main axis of the joint\r\n */\r\n mainAxis?: Vector3;\r\n /**\r\n * The connected axis of the joint\r\n */\r\n connectedAxis?: Vector3;\r\n /**\r\n * The collision of the joint\r\n */\r\n collision?: boolean;\r\n /**\r\n * Native Oimo/Cannon/Energy data\r\n */\r\n nativeParams?: any;\r\n}\r\n\r\n/**\r\n * This is a holder class for the physics joint created by the physics plugin\r\n * It holds a set of functions to control the underlying joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport class PhysicsJoint {\r\n private _physicsJoint: any;\r\n protected _physicsPlugin: IPhysicsEnginePlugin;\r\n\r\n /**\r\n * Initializes the physics joint\r\n * @param type The type of the physics joint\r\n * @param jointData The data for the physics joint\r\n */\r\n constructor(\r\n /**\r\n * The type of the physics joint\r\n */\r\n public type: number,\r\n /**\r\n * The data for the physics joint\r\n */\r\n public jointData: PhysicsJointData\r\n ) {\r\n jointData.nativeParams = jointData.nativeParams || {};\r\n }\r\n\r\n /**\r\n * Gets the physics joint\r\n */\r\n public get physicsJoint(): any {\r\n return this._physicsJoint;\r\n }\r\n\r\n /**\r\n * Sets the physics joint\r\n */\r\n public set physicsJoint(newJoint: any) {\r\n if (this._physicsJoint) {\r\n //remove from the world\r\n }\r\n\r\n this._physicsJoint = newJoint;\r\n }\r\n\r\n /**\r\n * Sets the physics plugin\r\n */\r\n public set physicsPlugin(physicsPlugin: IPhysicsEnginePlugin) {\r\n this._physicsPlugin = physicsPlugin;\r\n }\r\n\r\n /**\r\n * Execute a function that is physics-plugin specific.\r\n * @param {Function} func the function that will be executed.\r\n * It accepts two parameters: the physics world and the physics joint\r\n */\r\n public executeNativeFunction(func: (world: any, physicsJoint: any) => void) {\r\n func(this._physicsPlugin.world, this._physicsJoint);\r\n }\r\n\r\n //TODO check if the native joints are the same\r\n\r\n //Joint Types\r\n /**\r\n * Distance-Joint type\r\n */\r\n public static DistanceJoint = 0;\r\n /**\r\n * Hinge-Joint type\r\n */\r\n public static HingeJoint = 1;\r\n /**\r\n * Ball-and-Socket joint type\r\n */\r\n public static BallAndSocketJoint = 2;\r\n /**\r\n * Wheel-Joint type\r\n */\r\n public static WheelJoint = 3;\r\n /**\r\n * Slider-Joint type\r\n */\r\n public static SliderJoint = 4;\r\n //OIMO\r\n /**\r\n * Prismatic-Joint type\r\n */\r\n public static PrismaticJoint = 5;\r\n //\r\n /**\r\n * Universal-Joint type\r\n * ENERGY FTW! (compare with this - @see http://ode-wiki.org/wiki/index.php?title=Manual:_Joint_Types_and_Functions)\r\n */\r\n public static UniversalJoint = 6;\r\n /**\r\n * Hinge-Joint 2 type\r\n */\r\n public static Hinge2Joint = PhysicsJoint.WheelJoint;\r\n //Cannon\r\n /**\r\n * Point to Point Joint type. Similar to a Ball-Joint. Different in parameters\r\n */\r\n public static PointToPointJoint = 8;\r\n //Cannon only at the moment\r\n /**\r\n * Spring-Joint type\r\n */\r\n public static SpringJoint = 9;\r\n /**\r\n * Lock-Joint type\r\n */\r\n public static LockJoint = 10;\r\n}\r\n\r\n/**\r\n * A class representing a physics distance joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport class DistanceJoint extends PhysicsJoint {\r\n /**\r\n *\r\n * @param jointData The data for the Distance-Joint\r\n */\r\n constructor(jointData: DistanceJointData) {\r\n super(PhysicsJoint.DistanceJoint, jointData);\r\n }\r\n\r\n /**\r\n * Update the predefined distance.\r\n * @param maxDistance The maximum preferred distance\r\n * @param minDistance The minimum preferred distance\r\n */\r\n public updateDistance(maxDistance: number, minDistance?: number) {\r\n this._physicsPlugin.updateDistanceJoint(this, maxDistance, minDistance);\r\n }\r\n}\r\n\r\n/**\r\n * Represents a Motor-Enabled Joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport class MotorEnabledJoint extends PhysicsJoint implements IMotorEnabledJoint {\r\n /**\r\n * Initializes the Motor-Enabled Joint\r\n * @param type The type of the joint\r\n * @param jointData The physical joint data for the joint\r\n */\r\n constructor(type: number, jointData: PhysicsJointData) {\r\n super(type, jointData);\r\n }\r\n\r\n /**\r\n * Set the motor values.\r\n * Attention, this function is plugin specific. Engines won't react 100% the same.\r\n * @param force the force to apply\r\n * @param maxForce max force for this motor.\r\n */\r\n public setMotor(force?: number, maxForce?: number) {\r\n this._physicsPlugin.setMotor(this, force || 0, maxForce);\r\n }\r\n\r\n /**\r\n * Set the motor's limits.\r\n * Attention, this function is plugin specific. Engines won't react 100% the same.\r\n * @param upperLimit The upper limit of the motor\r\n * @param lowerLimit The lower limit of the motor\r\n */\r\n public setLimit(upperLimit: number, lowerLimit?: number) {\r\n this._physicsPlugin.setLimit(this, upperLimit, lowerLimit);\r\n }\r\n}\r\n\r\n/**\r\n * This class represents a single physics Hinge-Joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport class HingeJoint extends MotorEnabledJoint {\r\n /**\r\n * Initializes the Hinge-Joint\r\n * @param jointData The joint data for the Hinge-Joint\r\n */\r\n constructor(jointData: PhysicsJointData) {\r\n super(PhysicsJoint.HingeJoint, jointData);\r\n }\r\n\r\n /**\r\n * Set the motor values.\r\n * Attention, this function is plugin specific. Engines won't react 100% the same.\r\n * @param {number} force the force to apply\r\n * @param {number} maxForce max force for this motor.\r\n */\r\n public setMotor(force?: number, maxForce?: number) {\r\n this._physicsPlugin.setMotor(this, force || 0, maxForce);\r\n }\r\n\r\n /**\r\n * Set the motor's limits.\r\n * Attention, this function is plugin specific. Engines won't react 100% the same.\r\n * @param upperLimit The upper limit of the motor\r\n * @param lowerLimit The lower limit of the motor\r\n */\r\n public setLimit(upperLimit: number, lowerLimit?: number) {\r\n this._physicsPlugin.setLimit(this, upperLimit, lowerLimit);\r\n }\r\n}\r\n\r\n/**\r\n * This class represents a dual hinge physics joint (same as wheel joint)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport class Hinge2Joint extends MotorEnabledJoint {\r\n /**\r\n * Initializes the Hinge2-Joint\r\n * @param jointData The joint data for the Hinge2-Joint\r\n */\r\n constructor(jointData: PhysicsJointData) {\r\n super(PhysicsJoint.Hinge2Joint, jointData);\r\n }\r\n\r\n /**\r\n * Set the motor values.\r\n * Attention, this function is plugin specific. Engines won't react 100% the same.\r\n * @param targetSpeed the speed the motor is to reach\r\n * @param maxForce max force for this motor.\r\n * @param motorIndex motor's index, 0 or 1.\r\n */\r\n public setMotor(targetSpeed?: number, maxForce?: number, motorIndex: number = 0) {\r\n this._physicsPlugin.setMotor(this, targetSpeed || 0, maxForce, motorIndex);\r\n }\r\n\r\n /**\r\n * Set the motor limits.\r\n * Attention, this function is plugin specific. Engines won't react 100% the same.\r\n * @param upperLimit the upper limit\r\n * @param lowerLimit lower limit\r\n * @param motorIndex the motor's index, 0 or 1.\r\n */\r\n public setLimit(upperLimit: number, lowerLimit?: number, motorIndex: number = 0) {\r\n this._physicsPlugin.setLimit(this, upperLimit, lowerLimit, motorIndex);\r\n }\r\n}\r\n\r\n/**\r\n * Interface for a motor enabled joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport interface IMotorEnabledJoint {\r\n /**\r\n * Physics joint\r\n */\r\n physicsJoint: any;\r\n /**\r\n * Sets the motor of the motor-enabled joint\r\n * @param force The force of the motor\r\n * @param maxForce The maximum force of the motor\r\n * @param motorIndex The index of the motor\r\n */\r\n setMotor(force?: number, maxForce?: number, motorIndex?: number): void;\r\n /**\r\n * Sets the limit of the motor\r\n * @param upperLimit The upper limit of the motor\r\n * @param lowerLimit The lower limit of the motor\r\n * @param motorIndex The index of the motor\r\n */\r\n setLimit(upperLimit: number, lowerLimit?: number, motorIndex?: number): void;\r\n}\r\n\r\n/**\r\n * Joint data for a Distance-Joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport interface DistanceJointData extends PhysicsJointData {\r\n /**\r\n * Max distance the 2 joint objects can be apart\r\n */\r\n maxDistance: number;\r\n //Oimo - minDistance\r\n //Cannon - maxForce\r\n}\r\n\r\n/**\r\n * Joint data from a spring joint\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport interface SpringJointData extends PhysicsJointData {\r\n /**\r\n * Length of the spring\r\n */\r\n length: number;\r\n /**\r\n * Stiffness of the spring\r\n */\r\n stiffness: number;\r\n /**\r\n * Damping of the spring\r\n */\r\n damping: number;\r\n /** this callback will be called when applying the force to the impostors. */\r\n forceApplicationCallback: () => void;\r\n}\r\n", "import type { Nullable, IndicesArray } from \"../../types\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { ArrayTools } from \"../../Misc/arrayTools\";\r\nimport type { Matrix } from \"../../Maths/math.vector\";\r\nimport { Vector3, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Bone } from \"../../Bones/bone\";\r\nimport type { BoundingInfo } from \"../../Culling/boundingInfo\";\r\nimport type { PhysicsEngine as PhysicsEngineV1 } from \"./physicsEngine\";\r\n\r\nimport type { PhysicsJointData } from \"./physicsJoint\";\r\nimport { PhysicsJoint } from \"./physicsJoint\";\r\nimport { Space } from \"../../Maths/math.axis\";\r\n\r\n/**\r\n * The interface for the physics imposter parameters\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport interface PhysicsImpostorParameters {\r\n /**\r\n * The mass of the physics imposter\r\n */\r\n mass: number;\r\n /**\r\n * The friction of the physics imposter\r\n */\r\n friction?: number;\r\n /**\r\n * The coefficient of restitution of the physics imposter\r\n */\r\n restitution?: number;\r\n /**\r\n * The native options of the physics imposter\r\n */\r\n nativeOptions?: any;\r\n /**\r\n * Specifies if the parent should be ignored\r\n */\r\n ignoreParent?: boolean;\r\n /**\r\n * Specifies if bi-directional transformations should be disabled\r\n */\r\n disableBidirectionalTransformation?: boolean;\r\n /**\r\n * The pressure inside the physics imposter, soft object only\r\n */\r\n pressure?: number;\r\n /**\r\n * The stiffness the physics imposter, soft object only\r\n */\r\n stiffness?: number;\r\n /**\r\n * The number of iterations used in maintaining consistent vertex velocities, soft object only\r\n */\r\n velocityIterations?: number;\r\n /**\r\n * The number of iterations used in maintaining consistent vertex positions, soft object only\r\n */\r\n positionIterations?: number;\r\n /**\r\n * The number used to fix points on a cloth (0, 1, 2, 4, 8) or rope (0, 1, 2) only\r\n * 0 None, 1, back left or top, 2, back right or bottom, 4, front left, 8, front right\r\n * Add to fix multiple points\r\n */\r\n fixedPoints?: number;\r\n /**\r\n * The collision margin around a soft object\r\n */\r\n margin?: number;\r\n /**\r\n * The collision margin around a soft object\r\n */\r\n damping?: number;\r\n /**\r\n * The path for a rope based on an extrusion\r\n */\r\n path?: any;\r\n /**\r\n * The shape of an extrusion used for a rope based on an extrusion\r\n */\r\n shape?: any;\r\n}\r\n\r\n/**\r\n * Interface for a physics-enabled object\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport interface IPhysicsEnabledObject {\r\n /**\r\n * The position of the physics-enabled object\r\n */\r\n position: Vector3;\r\n /**\r\n * The rotation of the physics-enabled object\r\n */\r\n rotationQuaternion: Nullable;\r\n /**\r\n * The scale of the physics-enabled object\r\n */\r\n scaling: Vector3;\r\n /**\r\n * The rotation of the physics-enabled object\r\n */\r\n rotation?: Vector3;\r\n /**\r\n * The parent of the physics-enabled object\r\n */\r\n parent?: any;\r\n /**\r\n * The bounding info of the physics-enabled object\r\n * @returns The bounding info of the physics-enabled object\r\n */\r\n getBoundingInfo(): BoundingInfo;\r\n /**\r\n * Computes the world matrix\r\n * @param force Specifies if the world matrix should be computed by force\r\n * @returns A world matrix\r\n */\r\n computeWorldMatrix(force: boolean): Matrix;\r\n /**\r\n * Gets the world matrix\r\n * @returns A world matrix\r\n */\r\n getWorldMatrix?(): Matrix;\r\n /**\r\n * Gets the child meshes\r\n * @param directDescendantsOnly Specifies if only direct-descendants should be obtained\r\n * @returns An array of abstract meshes\r\n */\r\n getChildMeshes?(directDescendantsOnly?: boolean): Array;\r\n /**\r\n * Gets the vertex data\r\n * @param kind The type of vertex data\r\n * @returns A nullable array of numbers, or a float32 array\r\n */\r\n getVerticesData(kind: string): Nullable | Float32Array>;\r\n /**\r\n * Gets the indices from the mesh\r\n * @returns A nullable array of index arrays\r\n */\r\n getIndices?(): Nullable;\r\n /**\r\n * Gets the scene from the mesh\r\n * @returns the indices array or null\r\n */\r\n getScene?(): Scene;\r\n /**\r\n * Gets the absolute position from the mesh\r\n * @returns the absolute position\r\n */\r\n getAbsolutePosition(): Vector3;\r\n /**\r\n * Gets the absolute pivot point from the mesh\r\n * @returns the absolute pivot point\r\n */\r\n getAbsolutePivotPoint(): Vector3;\r\n /**\r\n * Rotates the mesh\r\n * @param axis The axis of rotation\r\n * @param amount The amount of rotation\r\n * @param space The space of the rotation\r\n * @returns The rotation transform node\r\n */\r\n rotate(axis: Vector3, amount: number, space?: Space): TransformNode;\r\n /**\r\n * Translates the mesh\r\n * @param axis The axis of translation\r\n * @param distance The distance of translation\r\n * @param space The space of the translation\r\n * @returns The transform node\r\n */\r\n translate(axis: Vector3, distance: number, space?: Space): TransformNode;\r\n /**\r\n * Sets the absolute position of the mesh\r\n * @param absolutePosition The absolute position of the mesh\r\n * @returns The transform node\r\n */\r\n setAbsolutePosition(absolutePosition: Vector3): TransformNode;\r\n /**\r\n * Gets the class name of the mesh\r\n * @returns The class name\r\n */\r\n getClassName(): string;\r\n}\r\n\r\nMesh._PhysicsImpostorParser = function (scene: Scene, physicObject: IPhysicsEnabledObject, jsonObject: any): PhysicsImpostor {\r\n return new PhysicsImpostor(\r\n physicObject,\r\n jsonObject.physicsImpostor,\r\n {\r\n mass: jsonObject.physicsMass,\r\n friction: jsonObject.physicsFriction,\r\n restitution: jsonObject.physicsRestitution,\r\n },\r\n scene\r\n );\r\n};\r\n\r\n/**\r\n * Represents a physics imposter\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport class PhysicsImpostor {\r\n /**\r\n * The default object size of the imposter\r\n */\r\n public static DEFAULT_OBJECT_SIZE: Vector3 = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * The identity quaternion of the imposter\r\n */\r\n public static IDENTITY_QUATERNION = Quaternion.Identity();\r\n\r\n /** @internal */\r\n public _pluginData: any = {};\r\n\r\n private _physicsEngine: Nullable;\r\n //The native cannon/oimo/energy physics body object.\r\n private _physicsBody: any;\r\n private _bodyUpdateRequired: boolean = false;\r\n\r\n private _onBeforePhysicsStepCallbacks = new Array<(impostor: PhysicsImpostor) => void>();\r\n private _onAfterPhysicsStepCallbacks = new Array<(impostor: PhysicsImpostor) => void>();\r\n /** @internal */\r\n public _onPhysicsCollideCallbacks: Array<{\r\n callback: (collider: PhysicsImpostor, collidedAgainst: PhysicsImpostor, point: Nullable, distance: number, impulse: number, normal: Nullable) => void;\r\n otherImpostors: Array;\r\n }> = [];\r\n\r\n private _deltaPosition: Vector3 = Vector3.Zero();\r\n private _deltaRotation: Quaternion;\r\n private _deltaRotationConjugated: Quaternion;\r\n\r\n /** @internal */\r\n public _isFromLine: boolean;\r\n\r\n //If set, this is this impostor's parent\r\n private _parent: Nullable;\r\n\r\n private _isDisposed = false;\r\n\r\n private static _TmpVecs: Vector3[] = ArrayTools.BuildArray(3, Vector3.Zero);\r\n private static _TmpQuat: Quaternion = Quaternion.Identity();\r\n\r\n /**\r\n * Specifies if the physics imposter is disposed\r\n */\r\n get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * Gets the mass of the physics imposter\r\n */\r\n get mass(): number {\r\n return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyMass(this) : 0;\r\n }\r\n\r\n set mass(value: number) {\r\n this.setMass(value);\r\n }\r\n\r\n /**\r\n * Gets the coefficient of friction\r\n */\r\n get friction(): number {\r\n return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyFriction(this) : 0;\r\n }\r\n\r\n /**\r\n * Sets the coefficient of friction\r\n */\r\n set friction(value: number) {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n this._physicsEngine.getPhysicsPlugin().setBodyFriction(this, value);\r\n }\r\n\r\n /**\r\n * Gets the coefficient of restitution\r\n */\r\n get restitution(): number {\r\n return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyRestitution(this) : 0;\r\n }\r\n\r\n /**\r\n * Sets the coefficient of restitution\r\n */\r\n set restitution(value: number) {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n this._physicsEngine.getPhysicsPlugin().setBodyRestitution(this, value);\r\n }\r\n\r\n /**\r\n * Gets the pressure of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n get pressure(): number {\r\n if (!this._physicsEngine) {\r\n return 0;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.setBodyPressure) {\r\n return 0;\r\n }\r\n return plugin.getBodyPressure!(this);\r\n }\r\n\r\n /**\r\n * Sets the pressure of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n set pressure(value: number) {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.setBodyPressure) {\r\n return;\r\n }\r\n plugin.setBodyPressure!(this, value);\r\n }\r\n\r\n /**\r\n * Gets the stiffness of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n get stiffness(): number {\r\n if (!this._physicsEngine) {\r\n return 0;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.getBodyStiffness) {\r\n return 0;\r\n }\r\n return plugin.getBodyStiffness!(this);\r\n }\r\n\r\n /**\r\n * Sets the stiffness of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n set stiffness(value: number) {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.setBodyStiffness) {\r\n return;\r\n }\r\n plugin.setBodyStiffness!(this, value);\r\n }\r\n\r\n /**\r\n * Gets the velocityIterations of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n get velocityIterations(): number {\r\n if (!this._physicsEngine) {\r\n return 0;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.getBodyVelocityIterations) {\r\n return 0;\r\n }\r\n return plugin.getBodyVelocityIterations!(this);\r\n }\r\n\r\n /**\r\n * Sets the velocityIterations of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n set velocityIterations(value: number) {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.setBodyVelocityIterations) {\r\n return;\r\n }\r\n plugin.setBodyVelocityIterations!(this, value);\r\n }\r\n\r\n /**\r\n * Gets the positionIterations of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n get positionIterations(): number {\r\n if (!this._physicsEngine) {\r\n return 0;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.getBodyPositionIterations) {\r\n return 0;\r\n }\r\n return plugin.getBodyPositionIterations!(this);\r\n }\r\n\r\n /**\r\n * Sets the positionIterations of a soft body; only supported by the AmmoJSPlugin\r\n */\r\n set positionIterations(value: number) {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.setBodyPositionIterations) {\r\n return;\r\n }\r\n plugin.setBodyPositionIterations!(this, value);\r\n }\r\n\r\n /**\r\n * The unique id of the physics imposter\r\n * set by the physics engine when adding this impostor to the array\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * @internal\r\n */\r\n public soft: boolean = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public segments: number = 0;\r\n\r\n private _joints: Array<{\r\n joint: PhysicsJoint;\r\n otherImpostor: PhysicsImpostor;\r\n }>;\r\n\r\n /**\r\n * Initializes the physics imposter\r\n * @param object The physics-enabled object used as the physics imposter\r\n * @param type The type of the physics imposter. Types are available as static members of this class.\r\n * @param _options The options for the physics imposter\r\n * @param _scene The Babylon scene\r\n */\r\n constructor(\r\n /**\r\n * The physics-enabled object used as the physics imposter\r\n */\r\n public object: IPhysicsEnabledObject,\r\n /**\r\n * The type of the physics imposter\r\n */\r\n public type: number,\r\n private _options: PhysicsImpostorParameters = { mass: 0 },\r\n private _scene?: Scene\r\n ) {\r\n //sanity check!\r\n if (!this.object) {\r\n Logger.Error(\"No object was provided. A physics object is obligatory\");\r\n return;\r\n }\r\n if (this.object.parent && _options.mass !== 0) {\r\n Logger.Warn(\"A physics impostor has been created for an object which has a parent. Babylon physics currently works in local space so unexpected issues may occur.\");\r\n }\r\n\r\n // Legacy support for old syntax.\r\n if (!this._scene && object.getScene) {\r\n this._scene = object.getScene();\r\n }\r\n\r\n if (!this._scene) {\r\n return;\r\n }\r\n\r\n if (this.type > 100) {\r\n this.soft = true;\r\n }\r\n\r\n this._physicsEngine = this._scene.getPhysicsEngine() as any;\r\n if (!this._physicsEngine) {\r\n Logger.Error(\"Physics not enabled. Please use scene.enablePhysics(...) before creating impostors.\");\r\n } else {\r\n //set the object's quaternion, if not set\r\n if (!this.object.rotationQuaternion) {\r\n if (this.object.rotation) {\r\n this.object.rotationQuaternion = Quaternion.RotationYawPitchRoll(this.object.rotation.y, this.object.rotation.x, this.object.rotation.z);\r\n } else {\r\n this.object.rotationQuaternion = new Quaternion();\r\n }\r\n }\r\n //default options params\r\n this._options.mass = _options.mass === void 0 ? 0 : _options.mass;\r\n this._options.friction = _options.friction === void 0 ? 0.2 : _options.friction;\r\n this._options.restitution = _options.restitution === void 0 ? 0.2 : _options.restitution;\r\n if (this.soft) {\r\n //softbody mass must be above 0;\r\n this._options.mass = this._options.mass > 0 ? this._options.mass : 1;\r\n this._options.pressure = _options.pressure === void 0 ? 200 : _options.pressure;\r\n this._options.stiffness = _options.stiffness === void 0 ? 1 : _options.stiffness;\r\n this._options.velocityIterations = _options.velocityIterations === void 0 ? 20 : _options.velocityIterations;\r\n this._options.positionIterations = _options.positionIterations === void 0 ? 20 : _options.positionIterations;\r\n this._options.fixedPoints = _options.fixedPoints === void 0 ? 0 : _options.fixedPoints;\r\n this._options.margin = _options.margin === void 0 ? 0 : _options.margin;\r\n this._options.damping = _options.damping === void 0 ? 0 : _options.damping;\r\n this._options.path = _options.path === void 0 ? null : _options.path;\r\n this._options.shape = _options.shape === void 0 ? null : _options.shape;\r\n }\r\n this._joints = [];\r\n //If the mesh has a parent, don't initialize the physicsBody. Instead wait for the parent to do that.\r\n if (!this.object.parent || this._options.ignoreParent) {\r\n this._init();\r\n } else if (this.object.parent.physicsImpostor) {\r\n Logger.Warn(\"You must affect impostors to children before affecting impostor to parent.\");\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This function will completely initialize this impostor.\r\n * It will create a new body - but only if this mesh has no parent.\r\n * If it has, this impostor will not be used other than to define the impostor\r\n * of the child mesh.\r\n * @internal\r\n */\r\n public _init() {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n\r\n this._physicsEngine.removeImpostor(this);\r\n this.physicsBody = null;\r\n this._parent = this._parent || this._getPhysicsParent();\r\n if (!this._isDisposed && (!this.parent || this._options.ignoreParent)) {\r\n this._physicsEngine.addImpostor(this);\r\n }\r\n }\r\n\r\n private _getPhysicsParent(): Nullable {\r\n if (this.object.parent instanceof AbstractMesh) {\r\n const parentMesh: AbstractMesh = this.object.parent;\r\n return parentMesh.physicsImpostor;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Should a new body be generated.\r\n * @returns boolean specifying if body initialization is required\r\n */\r\n public isBodyInitRequired(): boolean {\r\n return this._bodyUpdateRequired || (!this._physicsBody && (!this._parent || !!this._options.ignoreParent));\r\n }\r\n\r\n /**\r\n * Sets the updated scaling\r\n */\r\n public setScalingUpdated() {\r\n this.forceUpdate();\r\n }\r\n\r\n /**\r\n * Force a regeneration of this or the parent's impostor's body.\r\n * Use with caution - This will remove all previously-instantiated joints.\r\n */\r\n public forceUpdate() {\r\n this._init();\r\n if (this.parent && !this._options.ignoreParent) {\r\n this.parent.forceUpdate();\r\n }\r\n }\r\n\r\n /*public get mesh(): AbstractMesh {\r\n return this._mesh;\r\n }*/\r\n\r\n /**\r\n * Gets the body that holds this impostor. Either its own, or its parent.\r\n */\r\n public get physicsBody(): any {\r\n return this._parent && !this._options.ignoreParent ? this._parent.physicsBody : this._physicsBody;\r\n }\r\n\r\n /**\r\n * Get the parent of the physics imposter\r\n * @returns Physics imposter or null\r\n */\r\n public get parent(): Nullable {\r\n return !this._options.ignoreParent && this._parent ? this._parent : null;\r\n }\r\n\r\n /**\r\n * Sets the parent of the physics imposter\r\n */\r\n public set parent(value: Nullable) {\r\n this._parent = value;\r\n }\r\n\r\n /**\r\n * Set the physics body. Used mainly by the physics engine/plugin\r\n */\r\n public set physicsBody(physicsBody: any) {\r\n if (this._physicsBody && this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().removePhysicsBody(this);\r\n }\r\n this._physicsBody = physicsBody;\r\n this.resetUpdateFlags();\r\n }\r\n\r\n /**\r\n * Resets the update flags\r\n */\r\n public resetUpdateFlags() {\r\n this._bodyUpdateRequired = false;\r\n }\r\n\r\n /**\r\n * Gets the object extents\r\n * @returns the object extents\r\n */\r\n public getObjectExtents(): Vector3 {\r\n if (this.object.getBoundingInfo) {\r\n const q = this.object.rotationQuaternion;\r\n const scaling = this.object.scaling.clone();\r\n //reset rotation\r\n this.object.rotationQuaternion = PhysicsImpostor.IDENTITY_QUATERNION;\r\n //calculate the world matrix with no rotation\r\n const worldMatrix = this.object.computeWorldMatrix && this.object.computeWorldMatrix(true);\r\n if (worldMatrix) {\r\n worldMatrix.decompose(scaling, undefined, undefined);\r\n }\r\n const boundingInfo = this.object.getBoundingInfo();\r\n // get the global scaling of the object\r\n const size = boundingInfo.boundingBox.extendSize.scale(2).multiplyInPlace(scaling);\r\n size.x = Math.abs(size.x);\r\n size.y = Math.abs(size.y);\r\n size.z = Math.abs(size.z);\r\n //bring back the rotation\r\n this.object.rotationQuaternion = q;\r\n //calculate the world matrix with the new rotation\r\n this.object.computeWorldMatrix && this.object.computeWorldMatrix(true);\r\n return size;\r\n } else {\r\n return PhysicsImpostor.DEFAULT_OBJECT_SIZE;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the object center\r\n * @returns The object center\r\n */\r\n public getObjectCenter(): Vector3 {\r\n if (this.object.getBoundingInfo) {\r\n const boundingInfo = this.object.getBoundingInfo();\r\n return boundingInfo.boundingBox.centerWorld;\r\n } else {\r\n return this.object.position;\r\n }\r\n }\r\n\r\n /**\r\n * Get a specific parameter from the options parameters\r\n * @param paramName The object parameter name\r\n * @returns The object parameter\r\n */\r\n public getParam(paramName: string): any {\r\n return (this._options)[paramName];\r\n }\r\n\r\n /**\r\n * Sets a specific parameter in the options given to the physics plugin\r\n * @param paramName The parameter name\r\n * @param value The value of the parameter\r\n */\r\n public setParam(paramName: string, value: number) {\r\n (this._options)[paramName] = value;\r\n this._bodyUpdateRequired = true;\r\n }\r\n\r\n /**\r\n * Specifically change the body's mass. Won't recreate the physics body object\r\n * @param mass The mass of the physics imposter\r\n */\r\n public setMass(mass: number) {\r\n if (this.getParam(\"mass\") !== mass) {\r\n this.setParam(\"mass\", mass);\r\n }\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().setBodyMass(this, mass);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the linear velocity\r\n * @returns linear velocity or null\r\n */\r\n public getLinearVelocity(): Nullable {\r\n return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getLinearVelocity(this) : Vector3.Zero();\r\n }\r\n\r\n /**\r\n * Sets the linear velocity\r\n * @param velocity linear velocity or null\r\n */\r\n public setLinearVelocity(velocity: Nullable) {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().setLinearVelocity(this, velocity);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the angular velocity\r\n * @returns angular velocity or null\r\n */\r\n public getAngularVelocity(): Nullable {\r\n return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getAngularVelocity(this) : Vector3.Zero();\r\n }\r\n\r\n /**\r\n * Sets the angular velocity\r\n * @param velocity The velocity or null\r\n */\r\n public setAngularVelocity(velocity: Nullable) {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().setAngularVelocity(this, velocity);\r\n }\r\n }\r\n\r\n /**\r\n * Execute a function with the physics plugin native code\r\n * Provide a function the will have two variables - the world object and the physics body object\r\n * @param func The function to execute with the physics plugin native code\r\n */\r\n public executeNativeFunction(func: (world: any, physicsBody: any) => void) {\r\n if (this._physicsEngine) {\r\n func(this._physicsEngine.getPhysicsPlugin().world, this.physicsBody);\r\n }\r\n }\r\n\r\n /**\r\n * Register a function that will be executed before the physics world is stepping forward\r\n * @param func The function to execute before the physics world is stepped forward\r\n */\r\n public registerBeforePhysicsStep(func: (impostor: PhysicsImpostor) => void): void {\r\n this._onBeforePhysicsStepCallbacks.push(func);\r\n }\r\n\r\n /**\r\n * Unregister a function that will be executed before the physics world is stepping forward\r\n * @param func The function to execute before the physics world is stepped forward\r\n */\r\n public unregisterBeforePhysicsStep(func: (impostor: PhysicsImpostor) => void): void {\r\n const index = this._onBeforePhysicsStepCallbacks.indexOf(func);\r\n\r\n if (index > -1) {\r\n this._onBeforePhysicsStepCallbacks.splice(index, 1);\r\n } else {\r\n Logger.Warn(\"Function to remove was not found\");\r\n }\r\n }\r\n\r\n /**\r\n * Register a function that will be executed after the physics step\r\n * @param func The function to execute after physics step\r\n */\r\n public registerAfterPhysicsStep(func: (impostor: PhysicsImpostor) => void): void {\r\n this._onAfterPhysicsStepCallbacks.push(func);\r\n }\r\n\r\n /**\r\n * Unregisters a function that will be executed after the physics step\r\n * @param func The function to execute after physics step\r\n */\r\n public unregisterAfterPhysicsStep(func: (impostor: PhysicsImpostor) => void): void {\r\n const index = this._onAfterPhysicsStepCallbacks.indexOf(func);\r\n\r\n if (index > -1) {\r\n this._onAfterPhysicsStepCallbacks.splice(index, 1);\r\n } else {\r\n Logger.Warn(\"Function to remove was not found\");\r\n }\r\n }\r\n\r\n /**\r\n * register a function that will be executed when this impostor collides against a different body\r\n * @param collideAgainst Physics imposter, or array of physics imposters to collide against\r\n * @param func Callback that is executed on collision\r\n */\r\n public registerOnPhysicsCollide(\r\n collideAgainst: PhysicsImpostor | Array,\r\n func: (collider: PhysicsImpostor, collidedAgainst: PhysicsImpostor, point: Nullable) => void\r\n ): void {\r\n const collidedAgainstList: Array = collideAgainst instanceof Array ? >collideAgainst : [collideAgainst];\r\n this._onPhysicsCollideCallbacks.push({ callback: func, otherImpostors: collidedAgainstList });\r\n }\r\n\r\n /**\r\n * Unregisters the physics imposter's collision callback\r\n * @param collideAgainst The physics object to collide against\r\n * @param func Callback to execute on collision\r\n */\r\n public unregisterOnPhysicsCollide(\r\n collideAgainst: PhysicsImpostor | Array,\r\n func: (collider: PhysicsImpostor, collidedAgainst: PhysicsImpostor | Array, point: Nullable) => void\r\n ): void {\r\n const collidedAgainstList: Array = collideAgainst instanceof Array ? >collideAgainst : [collideAgainst];\r\n let index = -1;\r\n const found = this._onPhysicsCollideCallbacks.some((cbDef, idx) => {\r\n if (cbDef.callback === func && cbDef.otherImpostors.length === collidedAgainstList.length) {\r\n // chcek the arrays match\r\n const sameList = cbDef.otherImpostors.every((impostor) => {\r\n return collidedAgainstList.indexOf(impostor) > -1;\r\n });\r\n if (sameList) {\r\n index = idx;\r\n }\r\n return sameList;\r\n }\r\n return false;\r\n });\r\n\r\n if (found) {\r\n this._onPhysicsCollideCallbacks.splice(index, 1);\r\n } else {\r\n Logger.Warn(\"Function to remove was not found\");\r\n }\r\n }\r\n\r\n //temp variables for parent rotation calculations\r\n //private _mats: Array = [new Matrix(), new Matrix()];\r\n private _tmpQuat: Quaternion = new Quaternion();\r\n private _tmpQuat2: Quaternion = new Quaternion();\r\n\r\n /**\r\n * Get the parent rotation\r\n * @returns The parent rotation\r\n */\r\n public getParentsRotation(): Quaternion {\r\n let parent = this.object.parent;\r\n this._tmpQuat.copyFromFloats(0, 0, 0, 1);\r\n while (parent) {\r\n if (parent.rotationQuaternion) {\r\n this._tmpQuat2.copyFrom(parent.rotationQuaternion);\r\n } else {\r\n Quaternion.RotationYawPitchRollToRef(parent.rotation.y, parent.rotation.x, parent.rotation.z, this._tmpQuat2);\r\n }\r\n this._tmpQuat.multiplyToRef(this._tmpQuat2, this._tmpQuat);\r\n parent = parent.parent;\r\n }\r\n return this._tmpQuat;\r\n }\r\n\r\n /**\r\n * this function is executed by the physics engine.\r\n */\r\n public beforeStep = () => {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n\r\n this.object.translate(this._deltaPosition, -1);\r\n this._deltaRotationConjugated &&\r\n this.object.rotationQuaternion &&\r\n this.object.rotationQuaternion.multiplyToRef(this._deltaRotationConjugated, this.object.rotationQuaternion);\r\n this.object.computeWorldMatrix(false);\r\n if (this.object.parent && this.object.rotationQuaternion) {\r\n this.getParentsRotation();\r\n this._tmpQuat.multiplyToRef(this.object.rotationQuaternion, this._tmpQuat);\r\n } else {\r\n this._tmpQuat.copyFrom(this.object.rotationQuaternion || new Quaternion());\r\n }\r\n if (!this._options.disableBidirectionalTransformation) {\r\n this.object.rotationQuaternion &&\r\n this._physicsEngine.getPhysicsPlugin().setPhysicsBodyTransformation(this, /*bInfo.boundingBox.centerWorld*/ this.object.getAbsolutePosition(), this._tmpQuat);\r\n }\r\n\r\n this._onBeforePhysicsStepCallbacks.forEach((func) => {\r\n func(this);\r\n });\r\n };\r\n\r\n /**\r\n * this function is executed by the physics engine\r\n */\r\n public afterStep = () => {\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n\r\n this._onAfterPhysicsStepCallbacks.forEach((func) => {\r\n func(this);\r\n });\r\n\r\n this._physicsEngine.getPhysicsPlugin().setTransformationFromPhysicsBody(this);\r\n // object has now its world rotation. needs to be converted to local.\r\n if (this.object.parent && this.object.rotationQuaternion) {\r\n this.getParentsRotation();\r\n this._tmpQuat.conjugateInPlace();\r\n this._tmpQuat.multiplyToRef(this.object.rotationQuaternion, this.object.rotationQuaternion);\r\n }\r\n // take the position set and make it the absolute position of this object.\r\n this.object.setAbsolutePosition(this.object.position);\r\n if (this._deltaRotation) {\r\n this.object.rotationQuaternion && this.object.rotationQuaternion.multiplyToRef(this._deltaRotation, this.object.rotationQuaternion);\r\n this._deltaPosition.applyRotationQuaternionToRef(this._deltaRotation, PhysicsImpostor._TmpVecs[0]);\r\n this.object.translate(PhysicsImpostor._TmpVecs[0], 1);\r\n } else {\r\n this.object.translate(this._deltaPosition, 1);\r\n }\r\n this.object.computeWorldMatrix(true);\r\n };\r\n\r\n /**\r\n * Legacy collision detection event support\r\n */\r\n public onCollideEvent: Nullable<(collider: PhysicsImpostor, collidedWith: PhysicsImpostor) => void> = null;\r\n\r\n /**\r\n * define an onCollide function to call when this impostor collides against a different body\r\n * @param e collide event data\r\n */\r\n public onCollide = (e: { body: any; point: Nullable; distance: number; impulse: number; normal: Nullable }) => {\r\n if (!this._onPhysicsCollideCallbacks.length && !this.onCollideEvent) {\r\n return;\r\n }\r\n\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n const otherImpostor = this._physicsEngine.getImpostorWithPhysicsBody(e.body);\r\n if (otherImpostor) {\r\n // Legacy collision detection event support\r\n if (this.onCollideEvent) {\r\n this.onCollideEvent(this, otherImpostor);\r\n }\r\n this._onPhysicsCollideCallbacks\r\n .filter((obj) => {\r\n return obj.otherImpostors.indexOf(otherImpostor) !== -1;\r\n })\r\n .forEach((obj) => {\r\n obj.callback(this, otherImpostor, e.point, e.distance, e.impulse, e.normal);\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Apply a force\r\n * @param force The force to apply\r\n * @param contactPoint The contact point for the force\r\n * @returns The physics imposter\r\n */\r\n public applyForce(force: Vector3, contactPoint: Vector3): PhysicsImpostor {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().applyForce(this, force, contactPoint);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Apply an impulse\r\n * @param force The impulse force\r\n * @param contactPoint The contact point for the impulse force\r\n * @returns The physics imposter\r\n */\r\n public applyImpulse(force: Vector3, contactPoint: Vector3): PhysicsImpostor {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().applyImpulse(this, force, contactPoint);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * A help function to create a joint\r\n * @param otherImpostor A physics imposter used to create a joint\r\n * @param jointType The type of joint\r\n * @param jointData The data for the joint\r\n * @returns The physics imposter\r\n */\r\n public createJoint(otherImpostor: PhysicsImpostor, jointType: number, jointData: PhysicsJointData): PhysicsImpostor {\r\n const joint = new PhysicsJoint(jointType, jointData);\r\n this.addJoint(otherImpostor, joint);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a joint to this impostor with a different impostor\r\n * @param otherImpostor A physics imposter used to add a joint\r\n * @param joint The joint to add\r\n * @returns The physics imposter\r\n */\r\n public addJoint(otherImpostor: PhysicsImpostor, joint: PhysicsJoint): PhysicsImpostor {\r\n this._joints.push({\r\n otherImpostor: otherImpostor,\r\n joint: joint,\r\n });\r\n\r\n if (this._physicsEngine) {\r\n this._physicsEngine.addJoint(this, otherImpostor, joint);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add an anchor to a cloth impostor\r\n * @param otherImpostor rigid impostor to anchor to\r\n * @param width ratio across width from 0 to 1\r\n * @param height ratio up height from 0 to 1\r\n * @param influence the elasticity between cloth impostor and anchor from 0, very stretchy to 1, little stretch\r\n * @param noCollisionBetweenLinkedBodies when true collisions between cloth impostor and anchor are ignored; default false\r\n * @returns impostor the soft imposter\r\n */\r\n public addAnchor(otherImpostor: PhysicsImpostor, width: number, height: number, influence: number, noCollisionBetweenLinkedBodies: boolean): PhysicsImpostor {\r\n if (!this._physicsEngine) {\r\n return this;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.appendAnchor) {\r\n return this;\r\n }\r\n if (this._physicsEngine) {\r\n plugin.appendAnchor!(this, otherImpostor, width, height, influence, noCollisionBetweenLinkedBodies);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a hook to a rope impostor\r\n * @param otherImpostor rigid impostor to anchor to\r\n * @param length ratio across rope from 0 to 1\r\n * @param influence the elasticity between rope impostor and anchor from 0, very stretchy to 1, little stretch\r\n * @param noCollisionBetweenLinkedBodies when true collisions between soft impostor and anchor are ignored; default false\r\n * @returns impostor the rope imposter\r\n */\r\n public addHook(otherImpostor: PhysicsImpostor, length: number, influence: number, noCollisionBetweenLinkedBodies: boolean): PhysicsImpostor {\r\n if (!this._physicsEngine) {\r\n return this;\r\n }\r\n const plugin = this._physicsEngine.getPhysicsPlugin();\r\n if (!plugin.appendAnchor) {\r\n return this;\r\n }\r\n if (this._physicsEngine) {\r\n plugin.appendHook!(this, otherImpostor, length, influence, noCollisionBetweenLinkedBodies);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Will keep this body still, in a sleep mode.\r\n * @returns the physics imposter\r\n */\r\n public sleep(): PhysicsImpostor {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().sleepBody(this);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Wake the body up.\r\n * @returns The physics imposter\r\n */\r\n public wakeUp(): PhysicsImpostor {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().wakeUpBody(this);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Clones the physics imposter\r\n * @param newObject The physics imposter clones to this physics-enabled object\r\n * @returns A nullable physics imposter\r\n */\r\n public clone(newObject: IPhysicsEnabledObject): Nullable {\r\n if (!newObject) {\r\n return null;\r\n }\r\n return new PhysicsImpostor(newObject, this.type, this._options, this._scene);\r\n }\r\n\r\n /**\r\n * Disposes the physics imposter\r\n */\r\n public dispose(/*disposeChildren: boolean = true*/) {\r\n //no dispose if no physics engine is available.\r\n if (!this._physicsEngine) {\r\n return;\r\n }\r\n\r\n this._joints.forEach((j) => {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.removeJoint(this, j.otherImpostor, j.joint);\r\n }\r\n });\r\n //dispose the physics body\r\n this._physicsEngine.removeImpostor(this);\r\n if (this.parent) {\r\n this.parent.forceUpdate();\r\n } else {\r\n /*this._object.getChildMeshes().forEach(function(mesh) {\r\n if (mesh.physicsImpostor) {\r\n if (disposeChildren) {\r\n mesh.physicsImpostor.dispose();\r\n mesh.physicsImpostor = null;\r\n }\r\n }\r\n })*/\r\n }\r\n\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * Sets the delta position\r\n * @param position The delta position amount\r\n */\r\n public setDeltaPosition(position: Vector3) {\r\n this._deltaPosition.copyFrom(position);\r\n }\r\n\r\n /**\r\n * Sets the delta rotation\r\n * @param rotation The delta rotation amount\r\n */\r\n public setDeltaRotation(rotation: Quaternion) {\r\n if (!this._deltaRotation) {\r\n this._deltaRotation = new Quaternion();\r\n }\r\n this._deltaRotation.copyFrom(rotation);\r\n this._deltaRotationConjugated = this._deltaRotation.conjugate();\r\n }\r\n\r\n /**\r\n * Gets the box size of the physics imposter and stores the result in the input parameter\r\n * @param result Stores the box size\r\n * @returns The physics imposter\r\n */\r\n public getBoxSizeToRef(result: Vector3): PhysicsImpostor {\r\n if (this._physicsEngine) {\r\n this._physicsEngine.getPhysicsPlugin().getBoxSizeToRef(this, result);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the radius of the physics imposter\r\n * @returns Radius of the physics imposter\r\n */\r\n public getRadius(): number {\r\n return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getRadius(this) : 0;\r\n }\r\n\r\n /**\r\n * Sync a bone with this impostor\r\n * @param bone The bone to sync to the impostor.\r\n * @param boneMesh The mesh that the bone is influencing.\r\n * @param jointPivot The pivot of the joint / bone in local space.\r\n * @param distToJoint Optional distance from the impostor to the joint.\r\n * @param adjustRotation Optional quaternion for adjusting the local rotation of the bone.\r\n */\r\n public syncBoneWithImpostor(bone: Bone, boneMesh: AbstractMesh, jointPivot: Vector3, distToJoint?: number, adjustRotation?: Quaternion) {\r\n const tempVec = PhysicsImpostor._TmpVecs[0];\r\n const mesh = this.object;\r\n\r\n if (mesh.rotationQuaternion) {\r\n if (adjustRotation) {\r\n const tempQuat = PhysicsImpostor._TmpQuat;\r\n mesh.rotationQuaternion.multiplyToRef(adjustRotation, tempQuat);\r\n bone.setRotationQuaternion(tempQuat, Space.WORLD, boneMesh);\r\n } else {\r\n bone.setRotationQuaternion(mesh.rotationQuaternion, Space.WORLD, boneMesh);\r\n }\r\n }\r\n\r\n tempVec.x = 0;\r\n tempVec.y = 0;\r\n tempVec.z = 0;\r\n\r\n if (jointPivot) {\r\n tempVec.x = jointPivot.x;\r\n tempVec.y = jointPivot.y;\r\n tempVec.z = jointPivot.z;\r\n\r\n bone.getDirectionToRef(tempVec, boneMesh, tempVec);\r\n\r\n if (distToJoint === undefined || distToJoint === null) {\r\n distToJoint = jointPivot.length();\r\n }\r\n\r\n tempVec.x *= distToJoint;\r\n tempVec.y *= distToJoint;\r\n tempVec.z *= distToJoint;\r\n }\r\n\r\n if (bone.getParent()) {\r\n tempVec.addInPlace(mesh.getAbsolutePosition());\r\n bone.setAbsolutePosition(tempVec, boneMesh);\r\n } else {\r\n boneMesh.setAbsolutePosition(mesh.getAbsolutePosition());\r\n boneMesh.position.x -= tempVec.x;\r\n boneMesh.position.y -= tempVec.y;\r\n boneMesh.position.z -= tempVec.z;\r\n }\r\n }\r\n\r\n /**\r\n * Sync impostor to a bone\r\n * @param bone The bone that the impostor will be synced to.\r\n * @param boneMesh The mesh that the bone is influencing.\r\n * @param jointPivot The pivot of the joint / bone in local space.\r\n * @param distToJoint Optional distance from the impostor to the joint.\r\n * @param adjustRotation Optional quaternion for adjusting the local rotation of the bone.\r\n * @param boneAxis Optional vector3 axis the bone is aligned with\r\n */\r\n public syncImpostorWithBone(bone: Bone, boneMesh: AbstractMesh, jointPivot: Vector3, distToJoint?: number, adjustRotation?: Quaternion, boneAxis?: Vector3) {\r\n const mesh = this.object;\r\n\r\n if (mesh.rotationQuaternion) {\r\n if (adjustRotation) {\r\n const tempQuat = PhysicsImpostor._TmpQuat;\r\n bone.getRotationQuaternionToRef(Space.WORLD, boneMesh, tempQuat);\r\n tempQuat.multiplyToRef(adjustRotation, mesh.rotationQuaternion);\r\n } else {\r\n bone.getRotationQuaternionToRef(Space.WORLD, boneMesh, mesh.rotationQuaternion);\r\n }\r\n }\r\n\r\n const pos = PhysicsImpostor._TmpVecs[0];\r\n const boneDir = PhysicsImpostor._TmpVecs[1];\r\n\r\n if (!boneAxis) {\r\n boneAxis = PhysicsImpostor._TmpVecs[2];\r\n boneAxis.x = 0;\r\n boneAxis.y = 1;\r\n boneAxis.z = 0;\r\n }\r\n\r\n bone.getDirectionToRef(boneAxis, boneMesh, boneDir);\r\n bone.getAbsolutePositionToRef(boneMesh, pos);\r\n\r\n if ((distToJoint === undefined || distToJoint === null) && jointPivot) {\r\n distToJoint = jointPivot.length();\r\n }\r\n\r\n if (distToJoint !== undefined && distToJoint !== null) {\r\n pos.x += boneDir.x * distToJoint;\r\n pos.y += boneDir.y * distToJoint;\r\n pos.z += boneDir.z * distToJoint;\r\n }\r\n\r\n mesh.setAbsolutePosition(pos);\r\n }\r\n\r\n //Impostor types\r\n /**\r\n * No-Imposter type\r\n */\r\n public static NoImpostor = 0;\r\n /**\r\n * Sphere-Imposter type\r\n */\r\n public static SphereImpostor = 1;\r\n /**\r\n * Box-Imposter type\r\n */\r\n public static BoxImpostor = 2;\r\n /**\r\n * Plane-Imposter type\r\n */\r\n public static PlaneImpostor = 3;\r\n /**\r\n * Mesh-imposter type (Only available to objects with vertices data)\r\n */\r\n public static MeshImpostor = 4;\r\n /**\r\n * Capsule-Impostor type (Ammo.js plugin only)\r\n */\r\n public static CapsuleImpostor = 6;\r\n /**\r\n * Cylinder-Imposter type\r\n */\r\n public static CylinderImpostor = 7;\r\n /**\r\n * Particle-Imposter type\r\n */\r\n public static ParticleImpostor = 8;\r\n /**\r\n * Heightmap-Imposter type\r\n */\r\n public static HeightmapImpostor = 9;\r\n /**\r\n * ConvexHull-Impostor type (Ammo.js plugin only)\r\n */\r\n public static ConvexHullImpostor = 10;\r\n /**\r\n * Custom-Imposter type (Ammo.js plugin only)\r\n */\r\n public static CustomImpostor = 100;\r\n /**\r\n * Rope-Imposter type\r\n */\r\n public static RopeImpostor = 101;\r\n /**\r\n * Cloth-Imposter type\r\n */\r\n public static ClothImpostor = 102;\r\n /**\r\n * Softbody-Imposter type\r\n */\r\n public static SoftbodyImpostor = 103;\r\n}\r\n", "import { Tools } from \"../Misc/tools\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { AnimationGroup } from \"../Animations/animationGroup\";\r\nimport type { AssetContainer } from \"../assetContainer\";\r\nimport type { IParticleSystem } from \"../Particles/IParticleSystem\";\r\nimport type { Skeleton } from \"../Bones/skeleton\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { SceneLoaderFlags } from \"./sceneLoaderFlags\";\r\nimport type { IFileRequest } from \"../Misc/fileRequest\";\r\nimport type { WebRequest } from \"../Misc/webRequest\";\r\nimport type { LoadFileError } from \"../Misc/fileTools\";\r\nimport { IsBase64DataUrl } from \"../Misc/fileTools\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { Geometry } from \"../Meshes/geometry\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport { RuntimeError, ErrorCodes } from \"../Misc/error\";\r\nimport type { ISpriteManager } from \"../Sprites/spriteManager\";\r\nimport { RandomGUID } from \"../Misc/guid\";\r\n\r\n/**\r\n * Type used for the success callback of ImportMesh\r\n */\r\nexport type SceneLoaderSuccessCallback = (\r\n meshes: AbstractMesh[],\r\n particleSystems: IParticleSystem[],\r\n skeletons: Skeleton[],\r\n animationGroups: AnimationGroup[],\r\n transformNodes: TransformNode[],\r\n geometries: Geometry[],\r\n lights: Light[],\r\n spriteManagers: ISpriteManager[]\r\n) => void;\r\n\r\n/**\r\n * Interface used for the result of ImportMeshAsync\r\n */\r\nexport interface ISceneLoaderAsyncResult {\r\n /**\r\n * The array of loaded meshes\r\n */\r\n readonly meshes: AbstractMesh[];\r\n\r\n /**\r\n * The array of loaded particle systems\r\n */\r\n readonly particleSystems: IParticleSystem[];\r\n\r\n /**\r\n * The array of loaded skeletons\r\n */\r\n readonly skeletons: Skeleton[];\r\n\r\n /**\r\n * The array of loaded animation groups\r\n */\r\n readonly animationGroups: AnimationGroup[];\r\n\r\n /**\r\n * The array of loaded transform nodes\r\n */\r\n readonly transformNodes: TransformNode[];\r\n\r\n /**\r\n * The array of loaded geometries\r\n */\r\n readonly geometries: Geometry[];\r\n\r\n /**\r\n * The array of loaded lights\r\n */\r\n readonly lights: Light[];\r\n\r\n /**\r\n * The array of loaded sprite managers\r\n */\r\n readonly spriteManagers: ISpriteManager[];\r\n}\r\n\r\n/**\r\n * Interface used to represent data loading progression\r\n */\r\nexport interface ISceneLoaderProgressEvent {\r\n /**\r\n * Defines if data length to load can be evaluated\r\n */\r\n readonly lengthComputable: boolean;\r\n\r\n /**\r\n * Defines the loaded data length\r\n */\r\n readonly loaded: number;\r\n\r\n /**\r\n * Defines the data length to load\r\n */\r\n readonly total: number;\r\n}\r\n\r\n/**\r\n * Interface used by SceneLoader plugins to define supported file extensions\r\n */\r\nexport interface ISceneLoaderPluginExtensions {\r\n /**\r\n * Defines the list of supported extensions\r\n */\r\n [extension: string]: {\r\n isBinary: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Interface used by SceneLoader plugin factory\r\n */\r\nexport interface ISceneLoaderPluginFactory {\r\n /**\r\n * Defines the name of the factory\r\n */\r\n name: string;\r\n\r\n /**\r\n * Function called to create a new plugin\r\n * @returns the new plugin\r\n */\r\n createPlugin(): ISceneLoaderPlugin | ISceneLoaderPluginAsync;\r\n\r\n /**\r\n * The callback that returns true if the data can be directly loaded.\r\n * @param data string containing the file data\r\n * @returns if the data can be loaded directly\r\n */\r\n canDirectLoad?(data: string): boolean;\r\n}\r\n\r\n/**\r\n * Interface used to define the base of ISceneLoaderPlugin and ISceneLoaderPluginAsync\r\n */\r\nexport interface ISceneLoaderPluginBase {\r\n /**\r\n * The friendly name of this plugin.\r\n */\r\n name: string;\r\n\r\n /**\r\n * The file extensions supported by this plugin.\r\n */\r\n extensions: string | ISceneLoaderPluginExtensions;\r\n\r\n /**\r\n * The callback called when loading from a url.\r\n * @param scene scene loading this url\r\n * @param fileOrUrl file or url to load\r\n * @param rootUrl root url to use to load assets\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @param name defines the name of the file when loading a binary file\r\n * @returns a file request object\r\n */\r\n loadFile?(\r\n scene: Scene,\r\n fileOrUrl: File | string | ArrayBufferView,\r\n rootUrl: string,\r\n onSuccess: (data: any, responseURL?: string) => void,\r\n onProgress?: (ev: ISceneLoaderProgressEvent) => void,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n name?: string\r\n ): Nullable;\r\n\r\n /**\r\n * The callback that returns true if the data can be directly loaded.\r\n * @param data string containing the file data\r\n * @returns if the data can be loaded directly\r\n */\r\n canDirectLoad?(data: string): boolean;\r\n\r\n /**\r\n * The callback that returns the data to pass to the plugin if the data can be directly loaded.\r\n * @param scene scene loading this data\r\n * @param data string containing the data\r\n * @returns data to pass to the plugin\r\n */\r\n directLoad?(scene: Scene, data: string): any;\r\n\r\n /**\r\n * The callback that allows custom handling of the root url based on the response url.\r\n * @param rootUrl the original root url\r\n * @param responseURL the response url if available\r\n * @returns the new root url\r\n */\r\n rewriteRootURL?(rootUrl: string, responseURL?: string): string;\r\n}\r\n\r\n/**\r\n * Interface used to define a SceneLoader plugin\r\n */\r\nexport interface ISceneLoaderPlugin extends ISceneLoaderPluginBase {\r\n /**\r\n * Import meshes into a scene.\r\n * @param meshesNames An array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported\r\n * @param scene The scene to import into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @param meshes The meshes array to import into\r\n * @param particleSystems The particle systems array to import into\r\n * @param skeletons The skeletons array to import into\r\n * @param onError The callback when import fails\r\n * @returns True if successful or false otherwise\r\n */\r\n importMesh(\r\n meshesNames: any,\r\n scene: Scene,\r\n data: any,\r\n rootUrl: string,\r\n meshes: AbstractMesh[],\r\n particleSystems: IParticleSystem[],\r\n skeletons: Skeleton[],\r\n onError?: (message: string, exception?: any) => void\r\n ): boolean;\r\n\r\n /**\r\n * Load into a scene.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @param onError The callback when import fails\r\n * @returns True if successful or false otherwise\r\n */\r\n load(scene: Scene, data: any, rootUrl: string, onError?: (message: string, exception?: any) => void): boolean;\r\n\r\n /**\r\n * Load into an asset container.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @param onError The callback when import fails\r\n * @returns The loaded asset container\r\n */\r\n loadAssetContainer(scene: Scene, data: any, rootUrl: string, onError?: (message: string, exception?: any) => void): AssetContainer;\r\n}\r\n\r\n/**\r\n * Interface used to define an async SceneLoader plugin\r\n */\r\nexport interface ISceneLoaderPluginAsync extends ISceneLoaderPluginBase {\r\n /**\r\n * Import meshes into a scene.\r\n * @param meshesNames An array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported\r\n * @param scene The scene to import into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @param onProgress The callback when the load progresses\r\n * @param fileName Defines the name of the file to load\r\n * @returns The loaded objects (e.g. meshes, particle systems, skeletons, animation groups, etc.)\r\n */\r\n importMeshAsync(\r\n meshesNames: any,\r\n scene: Scene,\r\n data: any,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName?: string\r\n ): Promise;\r\n\r\n /**\r\n * Load into a scene.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @param onProgress The callback when the load progresses\r\n * @param fileName Defines the name of the file to load\r\n * @returns Nothing\r\n */\r\n loadAsync(scene: Scene, data: any, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise;\r\n\r\n /**\r\n * Load into an asset container.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @param onProgress The callback when the load progresses\r\n * @param fileName Defines the name of the file to load\r\n * @returns The loaded asset container\r\n */\r\n loadAssetContainerAsync(scene: Scene, data: any, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise;\r\n}\r\n\r\n/**\r\n * Mode that determines how to handle old animation groups before loading new ones.\r\n */\r\nexport enum SceneLoaderAnimationGroupLoadingMode {\r\n /**\r\n * Reset all old animations to initial state then dispose them.\r\n */\r\n Clean = 0,\r\n\r\n /**\r\n * Stop all old animations.\r\n */\r\n Stop = 1,\r\n\r\n /**\r\n * Restart old animations from first frame.\r\n */\r\n Sync = 2,\r\n\r\n /**\r\n * Old animations remains untouched.\r\n */\r\n NoSync = 3,\r\n}\r\n\r\n/**\r\n * Defines a plugin registered by the SceneLoader\r\n */\r\ninterface IRegisteredPlugin {\r\n /**\r\n * Defines the plugin to use\r\n */\r\n plugin: ISceneLoaderPlugin | ISceneLoaderPluginAsync | ISceneLoaderPluginFactory;\r\n /**\r\n * Defines if the plugin supports binary data\r\n */\r\n isBinary: boolean;\r\n}\r\n\r\n/**\r\n * Defines file information\r\n */\r\ninterface IFileInfo {\r\n /**\r\n * Gets the file url\r\n */\r\n url: string;\r\n /**\r\n * Gets the root url\r\n */\r\n rootUrl: string;\r\n /**\r\n * Gets filename\r\n */\r\n name: string;\r\n /**\r\n * Gets the file\r\n */\r\n file: Nullable;\r\n\r\n /**\r\n * Gets raw binary data.\r\n */\r\n rawData: Nullable;\r\n}\r\n\r\n/**\r\n * Class used to load scene from various file formats using registered plugins\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/loadingFileTypes\r\n */\r\nexport class SceneLoader {\r\n /**\r\n * No logging while loading\r\n */\r\n public static readonly NO_LOGGING = Constants.SCENELOADER_NO_LOGGING;\r\n\r\n /**\r\n * Minimal logging while loading\r\n */\r\n public static readonly MINIMAL_LOGGING = Constants.SCENELOADER_MINIMAL_LOGGING;\r\n\r\n /**\r\n * Summary logging while loading\r\n */\r\n public static readonly SUMMARY_LOGGING = Constants.SCENELOADER_SUMMARY_LOGGING;\r\n\r\n /**\r\n * Detailed logging while loading\r\n */\r\n public static readonly DETAILED_LOGGING = Constants.SCENELOADER_DETAILED_LOGGING;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if entire scene must be loaded even if scene contains incremental data\r\n */\r\n public static get ForceFullSceneLoadingForIncremental() {\r\n return SceneLoaderFlags.ForceFullSceneLoadingForIncremental;\r\n }\r\n\r\n public static set ForceFullSceneLoadingForIncremental(value: boolean) {\r\n SceneLoaderFlags.ForceFullSceneLoadingForIncremental = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if loading screen must be displayed while loading a scene\r\n */\r\n public static get ShowLoadingScreen(): boolean {\r\n return SceneLoaderFlags.ShowLoadingScreen;\r\n }\r\n\r\n public static set ShowLoadingScreen(value: boolean) {\r\n SceneLoaderFlags.ShowLoadingScreen = value;\r\n }\r\n\r\n /**\r\n * Defines the current logging level (while loading the scene)\r\n * @ignorenaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static get loggingLevel(): number {\r\n return SceneLoaderFlags.loggingLevel;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static set loggingLevel(value: number) {\r\n SceneLoaderFlags.loggingLevel = value;\r\n }\r\n\r\n /**\r\n * Gets or set a boolean indicating if matrix weights must be cleaned upon loading\r\n */\r\n public static get CleanBoneMatrixWeights(): boolean {\r\n return SceneLoaderFlags.CleanBoneMatrixWeights;\r\n }\r\n\r\n public static set CleanBoneMatrixWeights(value: boolean) {\r\n SceneLoaderFlags.CleanBoneMatrixWeights = value;\r\n }\r\n\r\n // Members\r\n\r\n /**\r\n * Event raised when a plugin is used to load a scene\r\n */\r\n public static OnPluginActivatedObservable = new Observable();\r\n\r\n private static _RegisteredPlugins: { [extension: string]: IRegisteredPlugin } = {};\r\n\r\n private static _ShowingLoadingScreen = false;\r\n\r\n /**\r\n * Gets the default plugin (used to load Babylon files)\r\n * @returns the .babylon plugin\r\n */\r\n public static GetDefaultPlugin(): IRegisteredPlugin {\r\n return SceneLoader._RegisteredPlugins[\".babylon\"];\r\n }\r\n\r\n private static _GetPluginForExtension(extension: string): IRegisteredPlugin {\r\n const registeredPlugin = SceneLoader._RegisteredPlugins[extension];\r\n if (registeredPlugin) {\r\n return registeredPlugin;\r\n }\r\n Logger.Warn(\r\n \"Unable to find a plugin to load \" +\r\n extension +\r\n \" files. Trying to use .babylon default plugin. To load from a specific filetype (eg. gltf) see: https://doc.babylonjs.com/features/featuresDeepDive/importers/loadingFileTypes\"\r\n );\r\n return SceneLoader.GetDefaultPlugin();\r\n }\r\n\r\n private static _GetPluginForDirectLoad(data: string): IRegisteredPlugin {\r\n for (const extension in SceneLoader._RegisteredPlugins) {\r\n const plugin = SceneLoader._RegisteredPlugins[extension].plugin;\r\n\r\n if (plugin.canDirectLoad && plugin.canDirectLoad(data)) {\r\n return SceneLoader._RegisteredPlugins[extension];\r\n }\r\n }\r\n\r\n return SceneLoader.GetDefaultPlugin();\r\n }\r\n\r\n private static _GetPluginForFilename(sceneFilename: string): IRegisteredPlugin {\r\n const queryStringPosition = sceneFilename.indexOf(\"?\");\r\n\r\n if (queryStringPosition !== -1) {\r\n sceneFilename = sceneFilename.substring(0, queryStringPosition);\r\n }\r\n\r\n const dotPosition = sceneFilename.lastIndexOf(\".\");\r\n\r\n const extension = sceneFilename.substring(dotPosition, sceneFilename.length).toLowerCase();\r\n return SceneLoader._GetPluginForExtension(extension);\r\n }\r\n\r\n private static _GetDirectLoad(sceneFilename: string): Nullable {\r\n if (sceneFilename.substr(0, 5) === \"data:\") {\r\n return sceneFilename.substr(5);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private static _FormatErrorMessage(fileInfo: IFileInfo, message?: string, exception?: any): string {\r\n const fromLoad = fileInfo.rawData ? \"binary data\" : fileInfo.url;\r\n let errorMessage = \"Unable to load from \" + fromLoad;\r\n\r\n if (message) {\r\n errorMessage += `: ${message}`;\r\n } else if (exception) {\r\n errorMessage += `: ${exception}`;\r\n }\r\n\r\n return errorMessage;\r\n }\r\n\r\n private static _LoadData(\r\n fileInfo: IFileInfo,\r\n scene: Scene,\r\n onSuccess: (plugin: ISceneLoaderPlugin | ISceneLoaderPluginAsync, data: any, responseURL?: string) => void,\r\n onProgress: ((event: ISceneLoaderProgressEvent) => void) | undefined,\r\n onError: (message?: string, exception?: any) => void,\r\n onDispose: () => void,\r\n pluginExtension: Nullable,\r\n name: string\r\n ): Nullable {\r\n const directLoad = SceneLoader._GetDirectLoad(fileInfo.url);\r\n\r\n if (fileInfo.rawData && !pluginExtension) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"When using ArrayBufferView to load data the file extension must be provided.\";\r\n }\r\n\r\n const registeredPlugin = pluginExtension\r\n ? SceneLoader._GetPluginForExtension(pluginExtension)\r\n : directLoad\r\n ? SceneLoader._GetPluginForDirectLoad(fileInfo.url)\r\n : SceneLoader._GetPluginForFilename(fileInfo.url);\r\n\r\n if (fileInfo.rawData && !registeredPlugin.isBinary) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Loading from ArrayBufferView can not be used with plugins that don't support binary loading.\";\r\n }\r\n\r\n let plugin: ISceneLoaderPlugin | ISceneLoaderPluginAsync;\r\n\r\n if ((registeredPlugin.plugin as ISceneLoaderPluginFactory).createPlugin !== undefined) {\r\n plugin = (registeredPlugin.plugin as ISceneLoaderPluginFactory).createPlugin();\r\n } else {\r\n plugin = registeredPlugin.plugin;\r\n }\r\n\r\n if (!plugin) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"The loader plugin corresponding to the file type you are trying to load has not been found. If using es6, please import the plugin you wish to use before.\";\r\n }\r\n\r\n SceneLoader.OnPluginActivatedObservable.notifyObservers(plugin);\r\n\r\n // Check if we have a direct load url. If the plugin is registered to handle\r\n // it or it's not a base64 data url, then pass it through the direct load path.\r\n if (directLoad && ((plugin.canDirectLoad && plugin.canDirectLoad(fileInfo.url)) || !IsBase64DataUrl(fileInfo.url))) {\r\n if (plugin.directLoad) {\r\n const result = plugin.directLoad(scene, directLoad);\r\n if (result.then) {\r\n result\r\n .then((data: any) => {\r\n onSuccess(plugin, data);\r\n })\r\n .catch((error: any) => {\r\n onError(\"Error in directLoad of _loadData: \" + error, error);\r\n });\r\n } else {\r\n onSuccess(plugin, result);\r\n }\r\n } else {\r\n onSuccess(plugin, directLoad);\r\n }\r\n return plugin;\r\n }\r\n\r\n const useArrayBuffer = registeredPlugin.isBinary;\r\n\r\n const dataCallback = (data: any, responseURL?: string) => {\r\n if (scene.isDisposed) {\r\n onError(\"Scene has been disposed\");\r\n return;\r\n }\r\n\r\n onSuccess(plugin, data, responseURL);\r\n };\r\n\r\n let request: Nullable = null;\r\n let pluginDisposed = false;\r\n const onDisposeObservable = (plugin as any).onDisposeObservable as Observable;\r\n if (onDisposeObservable) {\r\n onDisposeObservable.add(() => {\r\n pluginDisposed = true;\r\n\r\n if (request) {\r\n request.abort();\r\n request = null;\r\n }\r\n\r\n onDispose();\r\n });\r\n }\r\n\r\n const manifestChecked = () => {\r\n if (pluginDisposed) {\r\n return;\r\n }\r\n\r\n const errorCallback = (request?: WebRequest, exception?: LoadFileError) => {\r\n onError(request?.statusText, exception);\r\n };\r\n\r\n if (!plugin.loadFile && fileInfo.rawData) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Plugin does not support loading ArrayBufferView.\";\r\n }\r\n\r\n request = plugin.loadFile\r\n ? plugin.loadFile(scene, fileInfo.rawData || fileInfo.file || fileInfo.url, fileInfo.rootUrl, dataCallback, onProgress, useArrayBuffer, errorCallback, name)\r\n : scene._loadFile(fileInfo.file || fileInfo.url, dataCallback, onProgress, true, useArrayBuffer, errorCallback);\r\n };\r\n\r\n const engine = scene.getEngine();\r\n let canUseOfflineSupport = engine.enableOfflineSupport;\r\n if (canUseOfflineSupport) {\r\n // Also check for exceptions\r\n let exceptionFound = false;\r\n for (const regex of scene.disableOfflineSupportExceptionRules) {\r\n if (regex.test(fileInfo.url)) {\r\n exceptionFound = true;\r\n break;\r\n }\r\n }\r\n\r\n canUseOfflineSupport = !exceptionFound;\r\n }\r\n\r\n if (canUseOfflineSupport && Engine.OfflineProviderFactory) {\r\n // Checking if a manifest file has been set for this scene and if offline mode has been requested\r\n scene.offlineProvider = Engine.OfflineProviderFactory(fileInfo.url, manifestChecked, engine.disableManifestCheck);\r\n } else {\r\n manifestChecked();\r\n }\r\n\r\n return plugin;\r\n }\r\n\r\n private static _GetFileInfo(rootUrl: string, sceneFilename: string | File | ArrayBufferView): Nullable {\r\n let url: string;\r\n let name: string;\r\n let file: Nullable = null;\r\n let rawData: Nullable = null;\r\n\r\n if (!sceneFilename) {\r\n url = rootUrl;\r\n name = Tools.GetFilename(rootUrl);\r\n rootUrl = Tools.GetFolderPath(rootUrl);\r\n } else if ((sceneFilename as File).name) {\r\n const sceneFile = sceneFilename as File;\r\n url = `file:${sceneFile.name}`;\r\n name = sceneFile.name;\r\n file = sceneFile;\r\n } else if (ArrayBuffer.isView(sceneFilename)) {\r\n url = \"\";\r\n name = RandomGUID();\r\n rawData = sceneFilename as ArrayBufferView;\r\n } else if (typeof sceneFilename === \"string\" && sceneFilename.startsWith(\"data:\")) {\r\n url = sceneFilename;\r\n name = \"\";\r\n } else {\r\n const filename = sceneFilename as string;\r\n if (filename.substr(0, 1) === \"/\") {\r\n Tools.Error(\"Wrong sceneFilename parameter\");\r\n return null;\r\n }\r\n\r\n url = rootUrl + filename;\r\n name = filename;\r\n }\r\n\r\n return {\r\n url: url,\r\n rootUrl: rootUrl,\r\n name: name,\r\n file: file,\r\n rawData,\r\n };\r\n }\r\n\r\n // Public functions\r\n\r\n /**\r\n * Gets a plugin that can load the given extension\r\n * @param extension defines the extension to load\r\n * @returns a plugin or null if none works\r\n */\r\n public static GetPluginForExtension(extension: string): ISceneLoaderPlugin | ISceneLoaderPluginAsync | ISceneLoaderPluginFactory {\r\n return SceneLoader._GetPluginForExtension(extension).plugin;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the given extension can be loaded\r\n * @param extension defines the extension to load\r\n * @returns true if the extension is supported\r\n */\r\n public static IsPluginForExtensionAvailable(extension: string): boolean {\r\n return !!SceneLoader._RegisteredPlugins[extension];\r\n }\r\n\r\n /**\r\n * Adds a new plugin to the list of registered plugins\r\n * @param plugin defines the plugin to add\r\n */\r\n public static RegisterPlugin(plugin: ISceneLoaderPlugin | ISceneLoaderPluginAsync): void {\r\n if (typeof plugin.extensions === \"string\") {\r\n const extension = plugin.extensions;\r\n SceneLoader._RegisteredPlugins[extension.toLowerCase()] = {\r\n plugin: plugin,\r\n isBinary: false,\r\n };\r\n } else {\r\n const extensions = plugin.extensions;\r\n Object.keys(extensions).forEach((extension) => {\r\n SceneLoader._RegisteredPlugins[extension.toLowerCase()] = {\r\n plugin: plugin,\r\n isBinary: extensions[extension].isBinary,\r\n };\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Import meshes into a scene\r\n * @param meshNames an array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene the instance of BABYLON.Scene to append to\r\n * @param onSuccess a callback with a list of imported meshes, particleSystems, skeletons, and animationGroups when import succeeds\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param onError a callback with the scene, a message, and possibly an exception when import fails\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the name of the file, if the data is binary\r\n * @returns The loaded plugin\r\n */\r\n public static ImportMesh(\r\n meshNames: any,\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n onSuccess: Nullable = null,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n onError: Nullable<(scene: Scene, message: string, exception?: any) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Nullable {\r\n if (!scene) {\r\n Logger.Error(\"No scene available to import mesh to\");\r\n return null;\r\n }\r\n\r\n const fileInfo = SceneLoader._GetFileInfo(rootUrl, sceneFilename);\r\n if (!fileInfo) {\r\n return null;\r\n }\r\n\r\n const loadingToken = {};\r\n scene.addPendingData(loadingToken);\r\n\r\n const disposeHandler = () => {\r\n scene.removePendingData(loadingToken);\r\n };\r\n\r\n const errorHandler = (message?: string, exception?: any) => {\r\n const errorMessage = SceneLoader._FormatErrorMessage(fileInfo, message, exception);\r\n\r\n if (onError) {\r\n onError(scene, errorMessage, new RuntimeError(errorMessage, ErrorCodes.SceneLoaderError, exception));\r\n } else {\r\n Logger.Error(errorMessage);\r\n // should the exception be thrown?\r\n }\r\n\r\n disposeHandler();\r\n };\r\n\r\n const progressHandler = onProgress\r\n ? (event: ISceneLoaderProgressEvent) => {\r\n try {\r\n onProgress(event);\r\n } catch (e) {\r\n errorHandler(\"Error in onProgress callback: \" + e, e);\r\n }\r\n }\r\n : undefined;\r\n\r\n const successHandler: SceneLoaderSuccessCallback = (meshes, particleSystems, skeletons, animationGroups, transformNodes, geometries, lights, spriteManagers) => {\r\n scene.importedMeshesFiles.push(fileInfo.url);\r\n\r\n if (onSuccess) {\r\n try {\r\n onSuccess(meshes, particleSystems, skeletons, animationGroups, transformNodes, geometries, lights, spriteManagers);\r\n } catch (e) {\r\n errorHandler(\"Error in onSuccess callback: \" + e, e);\r\n }\r\n }\r\n\r\n scene.removePendingData(loadingToken);\r\n };\r\n\r\n return SceneLoader._LoadData(\r\n fileInfo,\r\n scene,\r\n (plugin, data, responseURL) => {\r\n if (plugin.rewriteRootURL) {\r\n fileInfo.rootUrl = plugin.rewriteRootURL(fileInfo.rootUrl, responseURL);\r\n }\r\n\r\n if ((plugin).importMesh) {\r\n const syncedPlugin = plugin;\r\n const meshes: AbstractMesh[] = [];\r\n const particleSystems: IParticleSystem[] = [];\r\n const skeletons: Skeleton[] = [];\r\n\r\n if (!syncedPlugin.importMesh(meshNames, scene, data, fileInfo.rootUrl, meshes, particleSystems, skeletons, errorHandler)) {\r\n return;\r\n }\r\n\r\n scene.loadingPluginName = plugin.name;\r\n successHandler(meshes, particleSystems, skeletons, [], [], [], [], []);\r\n } else {\r\n const asyncedPlugin = plugin;\r\n asyncedPlugin\r\n .importMeshAsync(meshNames, scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name)\r\n .then((result) => {\r\n scene.loadingPluginName = plugin.name;\r\n successHandler(\r\n result.meshes,\r\n result.particleSystems,\r\n result.skeletons,\r\n result.animationGroups,\r\n result.transformNodes,\r\n result.geometries,\r\n result.lights,\r\n result.spriteManagers\r\n );\r\n })\r\n .catch((error) => {\r\n errorHandler(error.message, error);\r\n });\r\n }\r\n },\r\n progressHandler,\r\n errorHandler,\r\n disposeHandler,\r\n pluginExtension,\r\n name\r\n );\r\n }\r\n\r\n /**\r\n * Import meshes into a scene\r\n * @param meshNames an array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene the instance of BABYLON.Scene to append to\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the name of the file\r\n * @returns The loaded list of imported meshes, particle systems, skeletons, and animation groups\r\n */\r\n public static ImportMeshAsync(\r\n meshNames: any,\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n SceneLoader.ImportMesh(\r\n meshNames,\r\n rootUrl,\r\n sceneFilename,\r\n scene,\r\n (meshes, particleSystems, skeletons, animationGroups, transformNodes, geometries, lights, spriteManagers) => {\r\n resolve({\r\n meshes: meshes,\r\n particleSystems: particleSystems,\r\n skeletons: skeletons,\r\n animationGroups: animationGroups,\r\n transformNodes: transformNodes,\r\n geometries: geometries,\r\n lights: lights,\r\n spriteManagers: spriteManagers,\r\n });\r\n },\r\n onProgress,\r\n (scene, message, exception) => {\r\n reject(exception || new Error(message));\r\n },\r\n pluginExtension,\r\n name\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Load a scene\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param engine is the instance of BABYLON.Engine to use to create the scene\r\n * @param onSuccess a callback with the scene when import succeeds\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param onError a callback with the scene, a message, and possibly an exception when import fails\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the filename, if the data is binary\r\n * @returns The loaded plugin\r\n */\r\n public static Load(\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n engine: Nullable = EngineStore.LastCreatedEngine,\r\n onSuccess: Nullable<(scene: Scene) => void> = null,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n onError: Nullable<(scene: Scene, message: string, exception?: any) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Nullable {\r\n if (!engine) {\r\n Tools.Error(\"No engine available\");\r\n return null;\r\n }\r\n\r\n return SceneLoader.Append(rootUrl, sceneFilename, new Scene(engine), onSuccess, onProgress, onError, pluginExtension, name);\r\n }\r\n\r\n /**\r\n * Load a scene\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param engine is the instance of BABYLON.Engine to use to create the scene\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the filename, if the data is binary\r\n * @returns The loaded scene\r\n */\r\n public static LoadAsync(\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n engine: Nullable = EngineStore.LastCreatedEngine,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n SceneLoader.Load(\r\n rootUrl,\r\n sceneFilename,\r\n engine,\r\n (scene) => {\r\n resolve(scene);\r\n },\r\n onProgress,\r\n (scene, message, exception) => {\r\n reject(exception || new Error(message));\r\n },\r\n pluginExtension,\r\n name\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Append a scene\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene is the instance of BABYLON.Scene to append to\r\n * @param onSuccess a callback with the scene when import succeeds\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param onError a callback with the scene, a message, and possibly an exception when import fails\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the name of the file, if the data is binary\r\n * @returns The loaded plugin\r\n */\r\n public static Append(\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n onSuccess: Nullable<(scene: Scene) => void> = null,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n onError: Nullable<(scene: Scene, message: string, exception?: any) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Nullable {\r\n if (!scene) {\r\n Logger.Error(\"No scene available to append to\");\r\n return null;\r\n }\r\n\r\n const fileInfo = SceneLoader._GetFileInfo(rootUrl, sceneFilename);\r\n if (!fileInfo) {\r\n return null;\r\n }\r\n\r\n const loadingToken = {};\r\n scene.addPendingData(loadingToken);\r\n\r\n const disposeHandler = () => {\r\n scene.removePendingData(loadingToken);\r\n };\r\n\r\n if (SceneLoader.ShowLoadingScreen && !this._ShowingLoadingScreen) {\r\n this._ShowingLoadingScreen = true;\r\n scene.getEngine().displayLoadingUI();\r\n scene.executeWhenReady(() => {\r\n scene.getEngine().hideLoadingUI();\r\n this._ShowingLoadingScreen = false;\r\n });\r\n }\r\n\r\n const errorHandler = (message?: string, exception?: any) => {\r\n const errorMessage = SceneLoader._FormatErrorMessage(fileInfo, message, exception);\r\n\r\n if (onError) {\r\n onError(scene, errorMessage, new RuntimeError(errorMessage, ErrorCodes.SceneLoaderError, exception));\r\n } else {\r\n Logger.Error(errorMessage);\r\n // should the exception be thrown?\r\n }\r\n\r\n disposeHandler();\r\n };\r\n\r\n const progressHandler = onProgress\r\n ? (event: ISceneLoaderProgressEvent) => {\r\n try {\r\n onProgress(event);\r\n } catch (e) {\r\n errorHandler(\"Error in onProgress callback\", e);\r\n }\r\n }\r\n : undefined;\r\n\r\n const successHandler = () => {\r\n if (onSuccess) {\r\n try {\r\n onSuccess(scene);\r\n } catch (e) {\r\n errorHandler(\"Error in onSuccess callback\", e);\r\n }\r\n }\r\n\r\n scene.removePendingData(loadingToken);\r\n };\r\n\r\n return SceneLoader._LoadData(\r\n fileInfo,\r\n scene,\r\n (plugin, data) => {\r\n if ((plugin).load) {\r\n const syncedPlugin = plugin;\r\n if (!syncedPlugin.load(scene, data, fileInfo.rootUrl, errorHandler)) {\r\n return;\r\n }\r\n\r\n scene.loadingPluginName = plugin.name;\r\n successHandler();\r\n } else {\r\n const asyncedPlugin = plugin;\r\n asyncedPlugin\r\n .loadAsync(scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name)\r\n .then(() => {\r\n scene.loadingPluginName = plugin.name;\r\n successHandler();\r\n })\r\n .catch((error) => {\r\n errorHandler(error.message, error);\r\n });\r\n }\r\n },\r\n progressHandler,\r\n errorHandler,\r\n disposeHandler,\r\n pluginExtension,\r\n name\r\n );\r\n }\r\n\r\n /**\r\n * Append a scene\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene is the instance of BABYLON.Scene to append to\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the name of the file, if the data is binary\r\n * @returns The given scene\r\n */\r\n public static AppendAsync(\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n SceneLoader.Append(\r\n rootUrl,\r\n sceneFilename,\r\n scene,\r\n (scene) => {\r\n resolve(scene);\r\n },\r\n onProgress,\r\n (scene, message, exception) => {\r\n reject(exception || new Error(message));\r\n },\r\n pluginExtension,\r\n name\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Load a scene into an asset container\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene is the instance of BABYLON.Scene to append to (default: last created scene)\r\n * @param onSuccess a callback with the scene when import succeeds\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param onError a callback with the scene, a message, and possibly an exception when import fails\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @param name defines the filename, if the data is binary\r\n * @returns The loaded plugin\r\n */\r\n public static LoadAssetContainer(\r\n rootUrl: string,\r\n sceneFilename: string | File | ArrayBufferView = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n onSuccess: Nullable<(assets: AssetContainer) => void> = null,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n onError: Nullable<(scene: Scene, message: string, exception?: any) => void> = null,\r\n pluginExtension: Nullable = null,\r\n name: string = \"\"\r\n ): Nullable {\r\n if (!scene) {\r\n Logger.Error(\"No scene available to load asset container to\");\r\n return null;\r\n }\r\n\r\n const fileInfo = SceneLoader._GetFileInfo(rootUrl, sceneFilename);\r\n if (!fileInfo) {\r\n return null;\r\n }\r\n\r\n const loadingToken = {};\r\n scene.addPendingData(loadingToken);\r\n\r\n const disposeHandler = () => {\r\n scene.removePendingData(loadingToken);\r\n };\r\n\r\n const errorHandler = (message?: string, exception?: any) => {\r\n const errorMessage = SceneLoader._FormatErrorMessage(fileInfo, message, exception);\r\n\r\n if (onError) {\r\n onError(scene, errorMessage, new RuntimeError(errorMessage, ErrorCodes.SceneLoaderError, exception));\r\n } else {\r\n Logger.Error(errorMessage);\r\n // should the exception be thrown?\r\n }\r\n\r\n disposeHandler();\r\n };\r\n\r\n const progressHandler = onProgress\r\n ? (event: ISceneLoaderProgressEvent) => {\r\n try {\r\n onProgress(event);\r\n } catch (e) {\r\n errorHandler(\"Error in onProgress callback\", e);\r\n }\r\n }\r\n : undefined;\r\n\r\n const successHandler = (assets: AssetContainer) => {\r\n if (onSuccess) {\r\n try {\r\n onSuccess(assets);\r\n } catch (e) {\r\n errorHandler(\"Error in onSuccess callback\", e);\r\n }\r\n }\r\n\r\n scene.removePendingData(loadingToken);\r\n };\r\n\r\n return SceneLoader._LoadData(\r\n fileInfo,\r\n scene,\r\n (plugin, data) => {\r\n if ((plugin).loadAssetContainer) {\r\n const syncedPlugin = plugin;\r\n const assetContainer = syncedPlugin.loadAssetContainer(scene, data, fileInfo.rootUrl, errorHandler);\r\n if (!assetContainer) {\r\n return;\r\n }\r\n assetContainer.populateRootNodes();\r\n scene.loadingPluginName = plugin.name;\r\n successHandler(assetContainer);\r\n } else if ((plugin).loadAssetContainerAsync) {\r\n const asyncedPlugin = plugin;\r\n asyncedPlugin\r\n .loadAssetContainerAsync(scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name)\r\n .then((assetContainer) => {\r\n assetContainer.populateRootNodes();\r\n scene.loadingPluginName = plugin.name;\r\n successHandler(assetContainer);\r\n })\r\n .catch((error) => {\r\n errorHandler(error.message, error);\r\n });\r\n } else {\r\n errorHandler(\"LoadAssetContainer is not supported by this plugin. Plugin did not provide a loadAssetContainer or loadAssetContainerAsync method.\");\r\n }\r\n },\r\n progressHandler,\r\n errorHandler,\r\n disposeHandler,\r\n pluginExtension,\r\n name\r\n );\r\n }\r\n\r\n /**\r\n * Load a scene into an asset container\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene (default: empty string)\r\n * @param scene is the instance of Scene to append to\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @returns The loaded asset container\r\n */\r\n public static LoadAssetContainerAsync(\r\n rootUrl: string,\r\n sceneFilename: string | File = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n pluginExtension: Nullable = null\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n SceneLoader.LoadAssetContainer(\r\n rootUrl,\r\n sceneFilename,\r\n scene,\r\n (assetContainer) => {\r\n resolve(assetContainer);\r\n },\r\n onProgress,\r\n (scene, message, exception) => {\r\n reject(exception || new Error(message));\r\n },\r\n pluginExtension\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Import animations from a file into a scene\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene is the instance of BABYLON.Scene to append to (default: last created scene)\r\n * @param overwriteAnimations when true, animations are cleaned before importing new ones. Animations are appended otherwise\r\n * @param animationGroupLoadingMode defines how to handle old animations groups before importing new ones\r\n * @param targetConverter defines a function used to convert animation targets from loaded scene to current scene (default: search node by name)\r\n * @param onSuccess a callback with the scene when import succeeds\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param onError a callback with the scene, a message, and possibly an exception when import fails\r\n * @param pluginExtension the extension used to determine the plugin\r\n */\r\n public static ImportAnimations(\r\n rootUrl: string,\r\n sceneFilename: string | File = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n overwriteAnimations = true,\r\n animationGroupLoadingMode = SceneLoaderAnimationGroupLoadingMode.Clean,\r\n targetConverter: Nullable<(target: any) => any> = null,\r\n onSuccess: Nullable<(scene: Scene) => void> = null,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n onError: Nullable<(scene: Scene, message: string, exception?: any) => void> = null,\r\n pluginExtension: Nullable = null\r\n ): void {\r\n if (!scene) {\r\n Logger.Error(\"No scene available to load animations to\");\r\n return;\r\n }\r\n\r\n if (overwriteAnimations) {\r\n // Reset, stop and dispose all animations before loading new ones\r\n for (const animatable of scene.animatables) {\r\n animatable.reset();\r\n }\r\n scene.stopAllAnimations();\r\n scene.animationGroups.slice().forEach((animationGroup) => {\r\n animationGroup.dispose();\r\n });\r\n const nodes = scene.getNodes();\r\n nodes.forEach((node) => {\r\n if (node.animations) {\r\n node.animations = [];\r\n }\r\n });\r\n } else {\r\n switch (animationGroupLoadingMode) {\r\n case SceneLoaderAnimationGroupLoadingMode.Clean:\r\n scene.animationGroups.slice().forEach((animationGroup) => {\r\n animationGroup.dispose();\r\n });\r\n break;\r\n case SceneLoaderAnimationGroupLoadingMode.Stop:\r\n scene.animationGroups.forEach((animationGroup) => {\r\n animationGroup.stop();\r\n });\r\n break;\r\n case SceneLoaderAnimationGroupLoadingMode.Sync:\r\n scene.animationGroups.forEach((animationGroup) => {\r\n animationGroup.reset();\r\n animationGroup.restart();\r\n });\r\n break;\r\n case SceneLoaderAnimationGroupLoadingMode.NoSync:\r\n // nothing to do\r\n break;\r\n default:\r\n Logger.Error(\"Unknown animation group loading mode value '\" + animationGroupLoadingMode + \"'\");\r\n return;\r\n }\r\n }\r\n\r\n const startingIndexForNewAnimatables = scene.animatables.length;\r\n\r\n const onAssetContainerLoaded = (container: AssetContainer) => {\r\n container.mergeAnimationsTo(scene, scene.animatables.slice(startingIndexForNewAnimatables), targetConverter);\r\n\r\n container.dispose();\r\n\r\n scene.onAnimationFileImportedObservable.notifyObservers(scene);\r\n\r\n if (onSuccess) {\r\n onSuccess(scene);\r\n }\r\n };\r\n\r\n this.LoadAssetContainer(rootUrl, sceneFilename, scene, onAssetContainerLoaded, onProgress, onError, pluginExtension);\r\n }\r\n\r\n /**\r\n * Import animations from a file into a scene\r\n * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)\r\n * @param sceneFilename a string that defines the name of the scene file or starts with \"data:\" following by the stringified version of the scene or a File object (default: empty string)\r\n * @param scene is the instance of BABYLON.Scene to append to (default: last created scene)\r\n * @param overwriteAnimations when true, animations are cleaned before importing new ones. Animations are appended otherwise\r\n * @param animationGroupLoadingMode defines how to handle old animations groups before importing new ones\r\n * @param targetConverter defines a function used to convert animation targets from loaded scene to current scene (default: search node by name)\r\n * @param onSuccess a callback with the scene when import succeeds\r\n * @param onProgress a callback with a progress event for each file being loaded\r\n * @param onError a callback with the scene, a message, and possibly an exception when import fails\r\n * @param pluginExtension the extension used to determine the plugin\r\n * @returns the updated scene with imported animations\r\n */\r\n public static ImportAnimationsAsync(\r\n rootUrl: string,\r\n sceneFilename: string | File = \"\",\r\n scene: Nullable = EngineStore.LastCreatedScene,\r\n overwriteAnimations = true,\r\n animationGroupLoadingMode = SceneLoaderAnimationGroupLoadingMode.Clean,\r\n targetConverter: Nullable<(target: any) => any> = null,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onSuccess: Nullable<(scene: Scene) => void> = null,\r\n onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void> = null,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onError: Nullable<(scene: Scene, message: string, exception?: any) => void> = null,\r\n pluginExtension: Nullable = null\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n SceneLoader.ImportAnimations(\r\n rootUrl,\r\n sceneFilename,\r\n scene,\r\n overwriteAnimations,\r\n animationGroupLoadingMode,\r\n targetConverter,\r\n (_scene: Scene) => {\r\n resolve(_scene);\r\n },\r\n onProgress,\r\n (_scene: Scene, message: string, exception: any) => {\r\n reject(exception || new Error(message));\r\n },\r\n pluginExtension\r\n );\r\n });\r\n }\r\n}\r\n", "/**\r\n * Defines the kind of connection point for node based material\r\n */\r\nexport enum NodeMaterialBlockConnectionPointTypes {\r\n /** Float */\r\n Float = 0x0001,\r\n /** Int */\r\n Int = 0x0002,\r\n /** Vector2 */\r\n Vector2 = 0x0004,\r\n /** Vector3 */\r\n Vector3 = 0x0008,\r\n /** Vector4 */\r\n Vector4 = 0x0010,\r\n /** Color3 */\r\n Color3 = 0x0020,\r\n /** Color4 */\r\n Color4 = 0x0040,\r\n /** Matrix */\r\n Matrix = 0x0080,\r\n /** Custom object */\r\n Object = 0x0100,\r\n /** Detect type based on connection */\r\n AutoDetect = 0x0400,\r\n /** Output type that will be defined by input type */\r\n BasedOnInput = 0x0800,\r\n /** Bitmask of all types */\r\n All = 0x0fff,\r\n}\r\n", "/**\r\n * Enum used to define the target of a block\r\n */\r\nexport enum NodeMaterialBlockTargets {\r\n /** Vertex shader */\r\n Vertex = 1,\r\n /** Fragment shader */\r\n Fragment = 2,\r\n /** Neutral */\r\n Neutral = 4,\r\n /** Vertex and Fragment */\r\n VertexAndFragment = Vertex | Fragment,\r\n}\r\n", "import { NodeMaterialBlockConnectionPointTypes } from \"./Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport { NodeMaterialBlockTargets } from \"./Enums/nodeMaterialBlockTargets\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { InputBlock } from \"./Blocks/Input/inputBlock\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { NodeMaterialBlock } from \"./nodeMaterialBlock\";\r\n\r\n/**\r\n * Enum used to define the compatibility state between two connection points\r\n */\r\nexport enum NodeMaterialConnectionPointCompatibilityStates {\r\n /** Points are compatibles */\r\n Compatible,\r\n /** Points are incompatible because of their types */\r\n TypeIncompatible,\r\n /** Points are incompatible because of their targets (vertex vs fragment) */\r\n TargetIncompatible,\r\n /** Points are incompatible because they are in the same hierarchy **/\r\n HierarchyIssue,\r\n}\r\n\r\n/**\r\n * Defines the direction of a connection point\r\n */\r\nexport enum NodeMaterialConnectionPointDirection {\r\n /** Input */\r\n Input,\r\n /** Output */\r\n Output,\r\n}\r\n\r\n/**\r\n * Defines a connection point for a block\r\n */\r\nexport class NodeMaterialConnectionPoint {\r\n /**\r\n * Checks if two types are equivalent\r\n * @param type1 type 1 to check\r\n * @param type2 type 2 to check\r\n * @returns true if both types are equivalent, else false\r\n */\r\n public static AreEquivalentTypes(type1: number, type2: number): boolean {\r\n switch (type1) {\r\n case NodeMaterialBlockConnectionPointTypes.Vector3: {\r\n if (type2 === NodeMaterialBlockConnectionPointTypes.Color3) {\r\n return true;\r\n }\r\n break;\r\n }\r\n case NodeMaterialBlockConnectionPointTypes.Vector4: {\r\n if (type2 === NodeMaterialBlockConnectionPointTypes.Color4) {\r\n return true;\r\n }\r\n break;\r\n }\r\n case NodeMaterialBlockConnectionPointTypes.Color3: {\r\n if (type2 === NodeMaterialBlockConnectionPointTypes.Vector3) {\r\n return true;\r\n }\r\n break;\r\n }\r\n case NodeMaterialBlockConnectionPointTypes.Color4: {\r\n if (type2 === NodeMaterialBlockConnectionPointTypes.Vector4) {\r\n return true;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /** @internal */\r\n public _ownerBlock: NodeMaterialBlock;\r\n /** @internal */\r\n public _connectedPoint: Nullable = null;\r\n\r\n private _endpoints = new Array();\r\n private _associatedVariableName: string;\r\n private _direction: NodeMaterialConnectionPointDirection;\r\n\r\n /** @internal */\r\n public _typeConnectionSource: Nullable = null;\r\n\r\n /** @internal */\r\n public _defaultConnectionPointType: Nullable = null;\r\n\r\n /** @internal */\r\n public _linkedConnectionSource: Nullable = null;\r\n\r\n /** @internal */\r\n public _acceptedConnectionPointType: Nullable = null;\r\n\r\n private _type = NodeMaterialBlockConnectionPointTypes.Float;\r\n\r\n /** @internal */\r\n public _enforceAssociatedVariableName = false;\r\n\r\n /** Gets the direction of the point */\r\n public get direction() {\r\n return this._direction;\r\n }\r\n\r\n /** Indicates that this connection point needs dual validation before being connected to another point */\r\n public needDualDirectionValidation: boolean = false;\r\n\r\n /**\r\n * Gets or sets the additional types supported by this connection point\r\n */\r\n public acceptedConnectionPointTypes: NodeMaterialBlockConnectionPointTypes[] = [];\r\n\r\n /**\r\n * Gets or sets the additional types excluded by this connection point\r\n */\r\n public excludedConnectionPointTypes: NodeMaterialBlockConnectionPointTypes[] = [];\r\n\r\n /**\r\n * Observable triggered when this point is connected\r\n */\r\n public onConnectionObservable = new Observable();\r\n\r\n /**\r\n * Observable triggered when this point is disconnected\r\n */\r\n public onDisconnectionObservable = new Observable();\r\n\r\n /**\r\n * Gets or sets the associated variable name in the shader\r\n */\r\n public get associatedVariableName(): string {\r\n if (this._ownerBlock.isInput) {\r\n return (this._ownerBlock as InputBlock).associatedVariableName;\r\n }\r\n\r\n if ((!this._enforceAssociatedVariableName || !this._associatedVariableName) && this._connectedPoint) {\r\n return this._connectedPoint.associatedVariableName;\r\n }\r\n\r\n return this._associatedVariableName;\r\n }\r\n\r\n public set associatedVariableName(value: string) {\r\n this._associatedVariableName = value;\r\n }\r\n\r\n /** Get the inner type (ie AutoDetect for instance instead of the inferred one) */\r\n public get innerType() {\r\n if (this._linkedConnectionSource && this._linkedConnectionSource.isConnected) {\r\n return this.type;\r\n }\r\n return this._type;\r\n }\r\n\r\n /**\r\n * Gets or sets the connection point type (default is float)\r\n */\r\n public get type(): NodeMaterialBlockConnectionPointTypes {\r\n if (this._type === NodeMaterialBlockConnectionPointTypes.AutoDetect) {\r\n if (this._ownerBlock.isInput) {\r\n return (this._ownerBlock as InputBlock).type;\r\n }\r\n\r\n if (this._connectedPoint) {\r\n return this._connectedPoint.type;\r\n }\r\n\r\n if (this._linkedConnectionSource && this._linkedConnectionSource.isConnected) {\r\n return this._linkedConnectionSource.type;\r\n }\r\n }\r\n\r\n if (this._type === NodeMaterialBlockConnectionPointTypes.BasedOnInput) {\r\n if (this._typeConnectionSource) {\r\n if (!this._typeConnectionSource.isConnected && this._defaultConnectionPointType) {\r\n return this._defaultConnectionPointType;\r\n }\r\n return this._typeConnectionSource.type;\r\n } else if (this._defaultConnectionPointType) {\r\n return this._defaultConnectionPointType;\r\n }\r\n }\r\n\r\n return this._type;\r\n }\r\n\r\n public set type(value: NodeMaterialBlockConnectionPointTypes) {\r\n this._type = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the connection point name\r\n */\r\n public name: string;\r\n\r\n /**\r\n * Gets or sets the connection point name\r\n */\r\n public displayName: string;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this connection point can be omitted\r\n */\r\n public isOptional: boolean;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this connection point is exposed on a frame\r\n */\r\n public isExposedOnFrame: boolean = false;\r\n\r\n /**\r\n * Gets or sets number indicating the position that the port is exposed to on a frame\r\n */\r\n public exposedPortPosition: number = -1;\r\n\r\n /**\r\n * Gets or sets a string indicating that this uniform must be defined under a #ifdef\r\n */\r\n public define: string;\r\n\r\n /** @internal */\r\n public _prioritizeVertex = false;\r\n\r\n private _target: NodeMaterialBlockTargets = NodeMaterialBlockTargets.VertexAndFragment;\r\n\r\n /** Gets or sets the target of that connection point */\r\n public get target(): NodeMaterialBlockTargets {\r\n if (!this._prioritizeVertex || !this._ownerBlock) {\r\n return this._target;\r\n }\r\n\r\n if (this._target !== NodeMaterialBlockTargets.VertexAndFragment) {\r\n return this._target;\r\n }\r\n\r\n if (this._ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n return NodeMaterialBlockTargets.Fragment;\r\n }\r\n\r\n return NodeMaterialBlockTargets.Vertex;\r\n }\r\n\r\n public set target(value: NodeMaterialBlockTargets) {\r\n this._target = value;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the current point is connected to another NodeMaterialBlock\r\n */\r\n public get isConnected(): boolean {\r\n return this.connectedPoint !== null || this.hasEndpoints;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the current point is connected to an input block\r\n */\r\n public get isConnectedToInputBlock(): boolean {\r\n return this.connectedPoint !== null && this.connectedPoint.ownerBlock.isInput;\r\n }\r\n\r\n /**\r\n * Gets a the connected input block (if any)\r\n */\r\n public get connectInputBlock(): Nullable {\r\n if (!this.isConnectedToInputBlock) {\r\n return null;\r\n }\r\n\r\n return this.connectedPoint!.ownerBlock as InputBlock;\r\n }\r\n\r\n /** Get the other side of the connection (if any) */\r\n public get connectedPoint(): Nullable {\r\n return this._connectedPoint;\r\n }\r\n\r\n /** Get the block that owns this connection point */\r\n public get ownerBlock(): NodeMaterialBlock {\r\n return this._ownerBlock;\r\n }\r\n\r\n /** Get the block connected on the other side of this connection (if any) */\r\n public get sourceBlock(): Nullable {\r\n if (!this._connectedPoint) {\r\n return null;\r\n }\r\n\r\n return this._connectedPoint.ownerBlock;\r\n }\r\n\r\n /** Get the block connected on the endpoints of this connection (if any) */\r\n public get connectedBlocks(): Array {\r\n if (this._endpoints.length === 0) {\r\n return [];\r\n }\r\n\r\n return this._endpoints.map((e) => e.ownerBlock);\r\n }\r\n\r\n /** Gets the list of connected endpoints */\r\n public get endpoints() {\r\n return this._endpoints;\r\n }\r\n\r\n /** Gets a boolean indicating if that output point is connected to at least one input */\r\n public get hasEndpoints(): boolean {\r\n return this._endpoints && this._endpoints.length > 0;\r\n }\r\n\r\n /** Gets a boolean indicating that this connection has a path to the vertex output*/\r\n public get isDirectlyConnectedToVertexOutput(): boolean {\r\n if (!this.hasEndpoints) {\r\n return false;\r\n }\r\n\r\n for (const endpoint of this._endpoints) {\r\n if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Vertex) {\r\n return true;\r\n }\r\n\r\n if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Neutral || endpoint.ownerBlock.target === NodeMaterialBlockTargets.VertexAndFragment) {\r\n if (endpoint.ownerBlock.outputs.some((o) => o.isDirectlyConnectedToVertexOutput)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /** Gets a boolean indicating that this connection will be used in the vertex shader */\r\n public get isConnectedInVertexShader(): boolean {\r\n if (this.target === NodeMaterialBlockTargets.Vertex) {\r\n return true;\r\n }\r\n\r\n if (!this.hasEndpoints) {\r\n return false;\r\n }\r\n\r\n for (const endpoint of this._endpoints) {\r\n if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Vertex) {\r\n return true;\r\n }\r\n\r\n if (endpoint.target === NodeMaterialBlockTargets.Vertex) {\r\n return true;\r\n }\r\n\r\n if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Neutral || endpoint.ownerBlock.target === NodeMaterialBlockTargets.VertexAndFragment) {\r\n if (endpoint.ownerBlock.outputs.some((o) => o.isConnectedInVertexShader)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /** Gets a boolean indicating that this connection will be used in the fragment shader */\r\n public get isConnectedInFragmentShader(): boolean {\r\n if (this.target === NodeMaterialBlockTargets.Fragment) {\r\n return true;\r\n }\r\n\r\n if (!this.hasEndpoints) {\r\n return false;\r\n }\r\n\r\n for (const endpoint of this._endpoints) {\r\n if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n return true;\r\n }\r\n\r\n if (endpoint.ownerBlock.target === NodeMaterialBlockTargets.Neutral || endpoint.ownerBlock.target === NodeMaterialBlockTargets.VertexAndFragment) {\r\n if (endpoint.ownerBlock.isConnectedInFragmentShader()) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Creates a block suitable to be used as an input for this input point.\r\n * If null is returned, a block based on the point type will be created.\r\n * @returns The returned string parameter is the name of the output point of NodeMaterialBlock (first parameter of the returned array) that can be connected to the input\r\n */\r\n public createCustomInputBlock(): Nullable<[NodeMaterialBlock, string]> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Creates a new connection point\r\n * @param name defines the connection point name\r\n * @param ownerBlock defines the block hosting this connection point\r\n * @param direction defines the direction of the connection point\r\n */\r\n public constructor(name: string, ownerBlock: NodeMaterialBlock, direction: NodeMaterialConnectionPointDirection) {\r\n this._ownerBlock = ownerBlock;\r\n this.name = name;\r\n this._direction = direction;\r\n }\r\n\r\n /**\r\n * Gets the current class name e.g. \"NodeMaterialConnectionPoint\"\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"NodeMaterialConnectionPoint\";\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the current point can be connected to another point\r\n * @param connectionPoint defines the other connection point\r\n * @returns a boolean\r\n */\r\n public canConnectTo(connectionPoint: NodeMaterialConnectionPoint) {\r\n return this.checkCompatibilityState(connectionPoint) === NodeMaterialConnectionPointCompatibilityStates.Compatible;\r\n }\r\n\r\n /**\r\n * Gets a number indicating if the current point can be connected to another point\r\n * @param connectionPoint defines the other connection point\r\n * @returns a number defining the compatibility state\r\n */\r\n public checkCompatibilityState(connectionPoint: NodeMaterialConnectionPoint): NodeMaterialConnectionPointCompatibilityStates {\r\n const ownerBlock = this._ownerBlock;\r\n const otherBlock = connectionPoint.ownerBlock;\r\n\r\n if (ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n // Let's check we are not going reverse\r\n\r\n if (otherBlock.target === NodeMaterialBlockTargets.Vertex) {\r\n return NodeMaterialConnectionPointCompatibilityStates.TargetIncompatible;\r\n }\r\n\r\n for (const output of otherBlock.outputs) {\r\n if (output.ownerBlock.target != NodeMaterialBlockTargets.Neutral && output.isConnectedInVertexShader) {\r\n return NodeMaterialConnectionPointCompatibilityStates.TargetIncompatible;\r\n }\r\n }\r\n }\r\n\r\n if (this.type !== connectionPoint.type && connectionPoint.innerType !== NodeMaterialBlockConnectionPointTypes.AutoDetect) {\r\n // Equivalents\r\n if (NodeMaterialConnectionPoint.AreEquivalentTypes(this.type, connectionPoint.type)) {\r\n return NodeMaterialConnectionPointCompatibilityStates.Compatible;\r\n }\r\n\r\n // Accepted types\r\n if (\r\n (connectionPoint.acceptedConnectionPointTypes && connectionPoint.acceptedConnectionPointTypes.indexOf(this.type) !== -1) ||\r\n (connectionPoint._acceptedConnectionPointType && NodeMaterialConnectionPoint.AreEquivalentTypes(connectionPoint._acceptedConnectionPointType.type, this.type))\r\n ) {\r\n return NodeMaterialConnectionPointCompatibilityStates.Compatible;\r\n } else {\r\n return NodeMaterialConnectionPointCompatibilityStates.TypeIncompatible;\r\n }\r\n }\r\n\r\n // Excluded\r\n if (connectionPoint.excludedConnectionPointTypes && connectionPoint.excludedConnectionPointTypes.indexOf(this.type) !== -1) {\r\n return NodeMaterialConnectionPointCompatibilityStates.TypeIncompatible;\r\n }\r\n\r\n // Check hierarchy\r\n let targetBlock = otherBlock;\r\n let sourceBlock = ownerBlock;\r\n if (this.direction === NodeMaterialConnectionPointDirection.Input) {\r\n targetBlock = ownerBlock;\r\n sourceBlock = otherBlock;\r\n }\r\n\r\n if (targetBlock.isAnAncestorOf(sourceBlock)) {\r\n return NodeMaterialConnectionPointCompatibilityStates.HierarchyIssue;\r\n }\r\n\r\n return NodeMaterialConnectionPointCompatibilityStates.Compatible;\r\n }\r\n\r\n /**\r\n * Connect this point to another connection point\r\n * @param connectionPoint defines the other connection point\r\n * @param ignoreConstraints defines if the system will ignore connection type constraints (default is false)\r\n * @returns the current connection point\r\n */\r\n public connectTo(connectionPoint: NodeMaterialConnectionPoint, ignoreConstraints = false): NodeMaterialConnectionPoint {\r\n if (!ignoreConstraints && !this.canConnectTo(connectionPoint)) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Cannot connect these two connectors.\";\r\n }\r\n\r\n this._endpoints.push(connectionPoint);\r\n connectionPoint._connectedPoint = this;\r\n\r\n this._enforceAssociatedVariableName = false;\r\n\r\n this.onConnectionObservable.notifyObservers(connectionPoint);\r\n connectionPoint.onConnectionObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Disconnect this point from one of his endpoint\r\n * @param endpoint defines the other connection point\r\n * @returns the current connection point\r\n */\r\n public disconnectFrom(endpoint: NodeMaterialConnectionPoint): NodeMaterialConnectionPoint {\r\n const index = this._endpoints.indexOf(endpoint);\r\n\r\n if (index === -1) {\r\n return this;\r\n }\r\n\r\n this._endpoints.splice(index, 1);\r\n endpoint._connectedPoint = null;\r\n this._enforceAssociatedVariableName = false;\r\n endpoint._enforceAssociatedVariableName = false;\r\n\r\n this.onDisconnectionObservable.notifyObservers(endpoint);\r\n endpoint.onDisconnectionObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Fill the list of excluded connection point types with all types other than those passed in the parameter\r\n * @param mask Types (ORed values of NodeMaterialBlockConnectionPointTypes) that are allowed, and thus will not be pushed to the excluded list\r\n */\r\n public addExcludedConnectionPointFromAllowedTypes(mask: number): void {\r\n let bitmask = 1;\r\n while (bitmask < NodeMaterialBlockConnectionPointTypes.All) {\r\n if (!(mask & bitmask)) {\r\n this.excludedConnectionPointTypes.push(bitmask);\r\n }\r\n bitmask = bitmask << 1;\r\n }\r\n }\r\n\r\n /**\r\n * Serializes this point in a JSON representation\r\n * @param isInput defines if the connection point is an input (default is true)\r\n * @returns the serialized point object\r\n */\r\n public serialize(isInput = true): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.displayName = this.displayName;\r\n\r\n if (isInput && this.connectedPoint) {\r\n serializationObject.inputName = this.name;\r\n serializationObject.targetBlockId = this.connectedPoint.ownerBlock.uniqueId;\r\n serializationObject.targetConnectionName = this.connectedPoint.name;\r\n serializationObject.isExposedOnFrame = true;\r\n serializationObject.exposedPortPosition = this.exposedPortPosition;\r\n }\r\n\r\n if (this.isExposedOnFrame || this.exposedPortPosition >= 0) {\r\n serializationObject.isExposedOnFrame = true;\r\n serializationObject.exposedPortPosition = this.exposedPortPosition;\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Release resources\r\n */\r\n public dispose() {\r\n this.onConnectionObservable.clear();\r\n this.onDisconnectionObservable.clear();\r\n }\r\n}\r\n", "import { NodeMaterialBlockConnectionPointTypes } from \"./Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"./nodeMaterialBuildState\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { NodeMaterialConnectionPoint, NodeMaterialConnectionPointDirection } from \"./nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"./Enums/nodeMaterialBlockTargets\";\r\nimport type { Effect } from \"../effect\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"./nodeMaterial\";\r\nimport type { InputBlock } from \"./Blocks/Input/inputBlock\";\r\nimport { UniqueIdGenerator } from \"../../Misc/uniqueIdGenerator\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { GetClass } from \"../../Misc/typeStore\";\r\nimport type { EffectFallbacks } from \"../effectFallbacks\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Defines a block that can be used inside a node based material\r\n */\r\nexport class NodeMaterialBlock {\r\n private _buildId: number;\r\n private _buildTarget: NodeMaterialBlockTargets;\r\n protected _target: NodeMaterialBlockTargets;\r\n private _isFinalMerger = false;\r\n private _isInput = false;\r\n private _isTeleportOut = false;\r\n private _isTeleportIn = false;\r\n private _name = \"\";\r\n protected _isUnique = false;\r\n\r\n /** Gets or sets a boolean indicating that only one input can be connected at a time */\r\n public inputsAreExclusive = false;\r\n\r\n /** @internal */\r\n public _codeVariableName = \"\";\r\n\r\n /** @internal */\r\n public _inputs = new Array();\r\n /** @internal */\r\n public _outputs = new Array();\r\n\r\n /** @internal */\r\n public _preparationId: number;\r\n\r\n /** @internal */\r\n public readonly _originalTargetIsNeutral: boolean;\r\n\r\n /**\r\n * Gets the name of the block\r\n */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n /**\r\n * Sets the name of the block. Will check if the name is valid.\r\n */\r\n public set name(newName: string) {\r\n if (!this.validateBlockName(newName)) {\r\n return;\r\n }\r\n\r\n this._name = newName;\r\n }\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets or sets the comments associated with this block\r\n */\r\n public comments: string = \"\";\r\n\r\n /**\r\n * Gets a boolean indicating that this block can only be used once per NodeMaterial\r\n */\r\n public get isUnique() {\r\n return this._isUnique;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this block is an end block (e.g. it is generating a system value)\r\n */\r\n public get isFinalMerger(): boolean {\r\n return this._isFinalMerger;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this block is an input (e.g. it sends data to the shader)\r\n */\r\n public get isInput(): boolean {\r\n return this._isInput;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a teleport out\r\n */\r\n public get isTeleportOut(): boolean {\r\n return this._isTeleportOut;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a teleport in\r\n */\r\n public get isTeleportIn(): boolean {\r\n return this._isTeleportIn;\r\n }\r\n\r\n /**\r\n * Gets or sets the build Id\r\n */\r\n public get buildId(): number {\r\n return this._buildId;\r\n }\r\n\r\n public set buildId(value: number) {\r\n this._buildId = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the target of the block\r\n */\r\n public get target() {\r\n return this._target;\r\n }\r\n\r\n public set target(value: NodeMaterialBlockTargets) {\r\n if ((this._target & value) !== 0) {\r\n return;\r\n }\r\n this._target = value;\r\n }\r\n\r\n /**\r\n * Gets the list of input points\r\n */\r\n public get inputs(): NodeMaterialConnectionPoint[] {\r\n return this._inputs;\r\n }\r\n\r\n /** Gets the list of output points */\r\n public get outputs(): NodeMaterialConnectionPoint[] {\r\n return this._outputs;\r\n }\r\n\r\n /**\r\n * Find an input by its name\r\n * @param name defines the name of the input to look for\r\n * @returns the input or null if not found\r\n */\r\n public getInputByName(name: string) {\r\n const filter = this._inputs.filter((e) => e.name === name);\r\n\r\n if (filter.length) {\r\n return filter[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Find an output by its name\r\n * @param name defines the name of the output to look for\r\n * @returns the output or null if not found\r\n */\r\n public getOutputByName(name: string) {\r\n const filter = this._outputs.filter((e) => e.name === name);\r\n\r\n if (filter.length) {\r\n return filter[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that this input can be edited in the Inspector (false by default) */\r\n public visibleInInspector = false;\r\n\r\n /** Gets or sets a boolean indicating that this input can be edited from a collapsed frame */\r\n public visibleOnFrame = false;\r\n\r\n /**\r\n * Creates a new NodeMaterialBlock\r\n * @param name defines the block name\r\n * @param target defines the target of that block (Vertex by default)\r\n * @param isFinalMerger defines a boolean indicating that this block is an end block (e.g. it is generating a system value). Default is false\r\n */\r\n public constructor(name: string, target = NodeMaterialBlockTargets.Vertex, isFinalMerger = false) {\r\n this._target = target;\r\n this._originalTargetIsNeutral = target === NodeMaterialBlockTargets.Neutral;\r\n this._isFinalMerger = isFinalMerger;\r\n this._isInput = this.getClassName() === \"InputBlock\";\r\n this._isTeleportOut = this.getClassName() === \"NodeMaterialTeleportOutBlock\";\r\n this._isTeleportIn = this.getClassName() === \"NodeMaterialTeleportInBlock\";\r\n this._name = name;\r\n this.uniqueId = UniqueIdGenerator.UniqueId;\r\n }\r\n\r\n /** @internal */\r\n public _setInitialTarget(target: NodeMaterialBlockTargets): void {\r\n this._target = target;\r\n (this._originalTargetIsNeutral as boolean) = target === NodeMaterialBlockTargets.Neutral;\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public initialize(state: NodeMaterialBuildState) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Bind data to effect. Will only be called for blocks with isBindable === true\r\n * @param effect defines the effect to bind data to\r\n * @param nodeMaterial defines the hosting NodeMaterial\r\n * @param mesh defines the mesh that will be rendered\r\n * @param subMesh defines the submesh that will be rendered\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh, subMesh?: SubMesh) {\r\n // Do nothing\r\n }\r\n\r\n protected _declareOutput(output: NodeMaterialConnectionPoint, state: NodeMaterialBuildState): string {\r\n return `${state._getGLType(output.type)} ${output.associatedVariableName}`;\r\n }\r\n\r\n protected _writeVariable(currentPoint: NodeMaterialConnectionPoint): string {\r\n const connectionPoint = currentPoint.connectedPoint;\r\n\r\n if (connectionPoint) {\r\n return `${currentPoint.associatedVariableName}`;\r\n }\r\n\r\n return `0.`;\r\n }\r\n\r\n protected _writeFloat(value: number) {\r\n let stringVersion = value.toString();\r\n\r\n if (stringVersion.indexOf(\".\") === -1) {\r\n stringVersion += \".0\";\r\n }\r\n return `${stringVersion}`;\r\n }\r\n\r\n /**\r\n * Gets the current class name e.g. \"NodeMaterialBlock\"\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"NodeMaterialBlock\";\r\n }\r\n\r\n /** Gets a boolean indicating that this connection will be used in the fragment shader\r\n * @returns true if connected in fragment shader\r\n */\r\n public isConnectedInFragmentShader() {\r\n return this.outputs.some((o) => o.isConnectedInFragmentShader);\r\n }\r\n\r\n /**\r\n * Register a new input. Must be called inside a block constructor\r\n * @param name defines the connection point name\r\n * @param type defines the connection point type\r\n * @param isOptional defines a boolean indicating that this input can be omitted\r\n * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default)\r\n * @param point an already created connection point. If not provided, create a new one\r\n * @returns the current block\r\n */\r\n public registerInput(\r\n name: string,\r\n type: NodeMaterialBlockConnectionPointTypes,\r\n isOptional: boolean = false,\r\n target?: NodeMaterialBlockTargets,\r\n point?: NodeMaterialConnectionPoint\r\n ) {\r\n point = point ?? new NodeMaterialConnectionPoint(name, this, NodeMaterialConnectionPointDirection.Input);\r\n point.type = type;\r\n point.isOptional = isOptional;\r\n if (target) {\r\n point.target = target;\r\n }\r\n\r\n this._inputs.push(point);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a new output. Must be called inside a block constructor\r\n * @param name defines the connection point name\r\n * @param type defines the connection point type\r\n * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default)\r\n * @param point an already created connection point. If not provided, create a new one\r\n * @returns the current block\r\n */\r\n public registerOutput(name: string, type: NodeMaterialBlockConnectionPointTypes, target?: NodeMaterialBlockTargets, point?: NodeMaterialConnectionPoint) {\r\n point = point ?? new NodeMaterialConnectionPoint(name, this, NodeMaterialConnectionPointDirection.Output);\r\n point.type = type;\r\n if (target) {\r\n point.target = target;\r\n }\r\n\r\n this._outputs.push(point);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Will return the first available input e.g. the first one which is not an uniform or an attribute\r\n * @param forOutput defines an optional connection point to check compatibility with\r\n * @returns the first available input or null\r\n */\r\n public getFirstAvailableInput(forOutput: Nullable = null) {\r\n for (const input of this._inputs) {\r\n if (!input.connectedPoint) {\r\n if (!forOutput || forOutput.type === input.type || input.type === NodeMaterialBlockConnectionPointTypes.AutoDetect) {\r\n return input;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Will return the first available output e.g. the first one which is not yet connected and not a varying\r\n * @param forBlock defines an optional block to check compatibility with\r\n * @returns the first available input or null\r\n */\r\n public getFirstAvailableOutput(forBlock: Nullable = null) {\r\n for (const output of this._outputs) {\r\n if (!forBlock || !forBlock.target || forBlock.target === NodeMaterialBlockTargets.Neutral || (forBlock.target & output.target) !== 0) {\r\n return output;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the sibling of the given output\r\n * @param current defines the current output\r\n * @returns the next output in the list or null\r\n */\r\n public getSiblingOutput(current: NodeMaterialConnectionPoint) {\r\n const index = this._outputs.indexOf(current);\r\n\r\n if (index === -1 || index >= this._outputs.length) {\r\n return null;\r\n }\r\n\r\n return this._outputs[index + 1];\r\n }\r\n\r\n /**\r\n * Checks if the current block is an ancestor of a given block\r\n * @param block defines the potential descendant block to check\r\n * @returns true if block is a descendant\r\n */\r\n public isAnAncestorOf(block: NodeMaterialBlock): boolean {\r\n for (const output of this._outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n if (endpoint.ownerBlock === block) {\r\n return true;\r\n }\r\n if (endpoint.ownerBlock.isAnAncestorOf(block)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Connect current block with another block\r\n * @param other defines the block to connect with\r\n * @param options define the various options to help pick the right connections\r\n * @param options.input\r\n * @param options.output\r\n * @param options.outputSwizzle\r\n * @returns the current block\r\n */\r\n public connectTo(\r\n other: NodeMaterialBlock,\r\n options?: {\r\n input?: string;\r\n output?: string;\r\n outputSwizzle?: string;\r\n }\r\n ) {\r\n if (this._outputs.length === 0) {\r\n return;\r\n }\r\n\r\n let output = options && options.output ? this.getOutputByName(options.output) : this.getFirstAvailableOutput(other);\r\n\r\n let notFound = true;\r\n while (notFound) {\r\n const input = options && options.input ? other.getInputByName(options.input) : other.getFirstAvailableInput(output);\r\n\r\n if (output && input && output.canConnectTo(input)) {\r\n output.connectTo(input);\r\n notFound = false;\r\n } else if (!output) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Unable to find a compatible match\";\r\n } else {\r\n output = this.getSiblingOutput(output);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n // Empty. Must be defined by child nodes\r\n }\r\n\r\n /**\r\n * Add uniforms, samplers and uniform buffers at compilation time\r\n * @param state defines the state to update\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param uniformBuffers defines the list of uniform buffer names\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public updateUniformsAndSamples(state: NodeMaterialBuildState, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, uniformBuffers: string[]) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Add potential fallbacks if shader compilation fails\r\n * @param mesh defines the mesh to be rendered\r\n * @param fallbacks defines the current prioritized list of fallbacks\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public provideFallbacks(mesh: AbstractMesh, fallbacks: EffectFallbacks) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Initialize defines for shader compilation\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param useInstances specifies that instances should be used\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public initializeDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, useInstances: boolean = false) {}\r\n\r\n /**\r\n * Update defines for shader compilation\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param useInstances specifies that instances should be used\r\n * @param subMesh defines which submesh to render\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, useInstances: boolean = false, subMesh?: SubMesh) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Lets the block try to connect some inputs automatically\r\n * @param material defines the hosting NodeMaterial\r\n * @param additionalFilteringInfo optional additional filtering condition when looking for compatible blocks\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Function called when a block is declared as repeatable content generator\r\n * @param vertexShaderState defines the current compilation state for the vertex shader\r\n * @param fragmentShaderState defines the current compilation state for the fragment shader\r\n * @param mesh defines the mesh to be rendered\r\n * @param defines defines the material defines to update\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public replaceRepeatableContent(vertexShaderState: NodeMaterialBuildState, fragmentShaderState: NodeMaterialBuildState, mesh: AbstractMesh, defines: NodeMaterialDefines) {\r\n // Do nothing\r\n }\r\n\r\n /** Gets a boolean indicating that the code of this block will be promoted to vertex shader even if connected to fragment output */\r\n public get willBeGeneratedIntoVertexShaderFromFragmentShader(): boolean {\r\n if (this.isInput || this.isFinalMerger) {\r\n return false;\r\n }\r\n\r\n if (this._outputs.some((o) => o.isDirectlyConnectedToVertexOutput)) {\r\n return false;\r\n }\r\n\r\n if (this.target === NodeMaterialBlockTargets.Vertex) {\r\n return false;\r\n }\r\n\r\n if (this.target === NodeMaterialBlockTargets.VertexAndFragment || this.target === NodeMaterialBlockTargets.Neutral) {\r\n if (this._outputs.some((o) => o.isConnectedInVertexShader)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if the block is ready\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param useInstances specifies that instances should be used\r\n * @returns true if the block is ready\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReady(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, useInstances: boolean = false) {\r\n return true;\r\n }\r\n\r\n protected _linkConnectionTypes(inputIndex0: number, inputIndex1: number, looseCoupling = false) {\r\n if (looseCoupling) {\r\n this._inputs[inputIndex1]._acceptedConnectionPointType = this._inputs[inputIndex0];\r\n } else {\r\n this._inputs[inputIndex0]._linkedConnectionSource = this._inputs[inputIndex1];\r\n }\r\n this._inputs[inputIndex1]._linkedConnectionSource = this._inputs[inputIndex0];\r\n }\r\n\r\n private _processBuild(block: NodeMaterialBlock, state: NodeMaterialBuildState, input: NodeMaterialConnectionPoint, activeBlocks: NodeMaterialBlock[]) {\r\n block.build(state, activeBlocks);\r\n\r\n const localBlockIsFragment = state._vertexState != null;\r\n const otherBlockWasGeneratedInVertexShader = block._buildTarget === NodeMaterialBlockTargets.Vertex && block.target !== NodeMaterialBlockTargets.VertexAndFragment;\r\n\r\n if (\r\n localBlockIsFragment &&\r\n ((block.target & block._buildTarget) === 0 ||\r\n (block.target & input.target) === 0 ||\r\n (this.target !== NodeMaterialBlockTargets.VertexAndFragment && otherBlockWasGeneratedInVertexShader))\r\n ) {\r\n // context switch! We need a varying\r\n if (\r\n (!block.isInput && state.target !== block._buildTarget) || // block was already emitted by vertex shader\r\n (block.isInput && (block as InputBlock).isAttribute && !(block as InputBlock)._noContextSwitch) // block is an attribute\r\n ) {\r\n const connectedPoint = input.connectedPoint!;\r\n if (state._vertexState._emitVaryingFromString(\"v_\" + connectedPoint.associatedVariableName, state._getGLType(connectedPoint.type))) {\r\n state._vertexState.compilationString += `${\"v_\" + connectedPoint.associatedVariableName} = ${connectedPoint.associatedVariableName};\\n`;\r\n }\r\n input.associatedVariableName = \"v_\" + connectedPoint.associatedVariableName;\r\n input._enforceAssociatedVariableName = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Validates the new name for the block node.\r\n * @param newName the new name to be given to the node.\r\n * @returns false if the name is a reserve word, else true.\r\n */\r\n public validateBlockName(newName: string) {\r\n const reservedNames: Array = [\r\n \"position\",\r\n \"normal\",\r\n \"tangent\",\r\n \"particle_positionw\",\r\n \"uv\",\r\n \"uv2\",\r\n \"uv3\",\r\n \"uv4\",\r\n \"uv5\",\r\n \"uv6\",\r\n \"position2d\",\r\n \"particle_uv\",\r\n \"matricesIndices\",\r\n \"matricesWeights\",\r\n \"world0\",\r\n \"world1\",\r\n \"world2\",\r\n \"world3\",\r\n \"particle_color\",\r\n \"particle_texturemask\",\r\n ];\r\n for (const reservedName of reservedNames) {\r\n if (newName === reservedName) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _customBuildStep(state: NodeMaterialBuildState, activeBlocks: NodeMaterialBlock[]): void {\r\n // Must be implemented by children\r\n }\r\n\r\n /**\r\n * Compile the current node and generate the shader code\r\n * @param state defines the current compilation state (uniforms, samplers, current string)\r\n * @param activeBlocks defines the list of active blocks (i.e. blocks to compile)\r\n * @returns true if already built\r\n */\r\n public build(state: NodeMaterialBuildState, activeBlocks: NodeMaterialBlock[]): boolean {\r\n if (this._buildId === state.sharedData.buildId) {\r\n return true;\r\n }\r\n\r\n if (!this.isInput) {\r\n /** Prepare outputs */\r\n for (const output of this._outputs) {\r\n if (!output.associatedVariableName) {\r\n output.associatedVariableName = state._getFreeVariableName(output.name);\r\n }\r\n }\r\n }\r\n\r\n // Check if \"parent\" blocks are compiled\r\n for (const input of this._inputs) {\r\n if (!input.connectedPoint) {\r\n if (!input.isOptional) {\r\n // Emit a warning\r\n state.sharedData.checks.notConnectedNonOptionalInputs.push(input);\r\n }\r\n continue;\r\n }\r\n\r\n if (this.target !== NodeMaterialBlockTargets.Neutral) {\r\n if ((input.target & this.target!) === 0) {\r\n continue;\r\n }\r\n\r\n if ((input.target & state.target!) === 0) {\r\n continue;\r\n }\r\n }\r\n\r\n const block = input.connectedPoint.ownerBlock;\r\n if (block && block !== this) {\r\n this._processBuild(block, state, input, activeBlocks);\r\n }\r\n }\r\n\r\n this._customBuildStep(state, activeBlocks);\r\n\r\n if (this._buildId === state.sharedData.buildId) {\r\n return true; // Need to check again as inputs can be connected multiple time to this endpoint\r\n }\r\n\r\n // Logs\r\n if (state.sharedData.verbose) {\r\n Logger.Log(`${state.target === NodeMaterialBlockTargets.Vertex ? \"Vertex shader\" : \"Fragment shader\"}: Building ${this.name} [${this.getClassName()}]`);\r\n }\r\n\r\n // Checks final outputs\r\n if (this.isFinalMerger) {\r\n switch (state.target) {\r\n case NodeMaterialBlockTargets.Vertex:\r\n state.sharedData.checks.emitVertex = true;\r\n break;\r\n case NodeMaterialBlockTargets.Fragment:\r\n state.sharedData.checks.emitFragment = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!this.isInput && state.sharedData.emitComments) {\r\n state.compilationString += `\\n//${this.name}\\n`;\r\n }\r\n\r\n this._buildBlock(state);\r\n\r\n this._buildId = state.sharedData.buildId;\r\n this._buildTarget = state.target;\r\n\r\n // Compile connected blocks\r\n for (const output of this._outputs) {\r\n if ((output.target & state.target) === 0) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n const block = endpoint.ownerBlock;\r\n\r\n if (block && (block.target & state.target) !== 0 && activeBlocks.indexOf(block) !== -1) {\r\n this._processBuild(block, state, endpoint, activeBlocks);\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n protected _inputRename(name: string) {\r\n return name;\r\n }\r\n\r\n protected _outputRename(name: string) {\r\n return name;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n const variableName = this._codeVariableName;\r\n return `${variableName}.visibleInInspector = ${this.visibleInInspector};\\n${variableName}.visibleOnFrame = ${this.visibleOnFrame};\\n${variableName}.target = ${this.target};\\n`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _dumpCode(uniqueNames: string[], alreadyDumped: NodeMaterialBlock[]) {\r\n alreadyDumped.push(this);\r\n\r\n // Get unique name\r\n const nameAsVariableName = this.name.replace(/[^A-Za-z_]+/g, \"\");\r\n this._codeVariableName = nameAsVariableName || `${this.getClassName()}_${this.uniqueId}`;\r\n\r\n if (uniqueNames.indexOf(this._codeVariableName) !== -1) {\r\n let index = 0;\r\n do {\r\n index++;\r\n this._codeVariableName = nameAsVariableName + index;\r\n } while (uniqueNames.indexOf(this._codeVariableName) !== -1);\r\n }\r\n\r\n uniqueNames.push(this._codeVariableName);\r\n\r\n // Declaration\r\n let codeString = `\\n// ${this.getClassName()}\\n`;\r\n if (this.comments) {\r\n codeString += `// ${this.comments}\\n`;\r\n }\r\n codeString += `var ${this._codeVariableName} = new BABYLON.${this.getClassName()}(\"${this.name}\");\\n`;\r\n\r\n // Properties\r\n codeString += this._dumpPropertiesCode();\r\n\r\n // Inputs\r\n for (const input of this.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n\r\n const connectedOutput = input.connectedPoint!;\r\n const connectedBlock = connectedOutput.ownerBlock;\r\n\r\n if (alreadyDumped.indexOf(connectedBlock) === -1) {\r\n codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n\r\n // Outputs\r\n for (const output of this.outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n const connectedBlock = endpoint.ownerBlock;\r\n if (connectedBlock && alreadyDumped.indexOf(connectedBlock) === -1) {\r\n codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _dumpCodeForOutputConnections(alreadyDumped: NodeMaterialBlock[]) {\r\n let codeString = \"\";\r\n\r\n if (alreadyDumped.indexOf(this) !== -1) {\r\n return codeString;\r\n }\r\n\r\n alreadyDumped.push(this);\r\n\r\n for (const input of this.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n\r\n const connectedOutput = input.connectedPoint!;\r\n const connectedBlock = connectedOutput.ownerBlock;\r\n\r\n codeString += connectedBlock._dumpCodeForOutputConnections(alreadyDumped);\r\n codeString += `${connectedBlock._codeVariableName}.${connectedBlock._outputRename(connectedOutput.name)}.connectTo(${this._codeVariableName}.${this._inputRename(\r\n input.name\r\n )});\\n`;\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * Clone the current block to a new identical block\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a copy of the current block\r\n */\r\n public clone(scene: Scene, rootUrl: string = \"\") {\r\n const serializationObject = this.serialize();\r\n\r\n const blockType = GetClass(serializationObject.customType);\r\n if (blockType) {\r\n const block: NodeMaterialBlock = new blockType();\r\n block._deserialize(serializationObject, scene, rootUrl);\r\n\r\n return block;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Serializes this block in a JSON representation\r\n * @returns the serialized block object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n serializationObject.customType = \"BABYLON.\" + this.getClassName();\r\n serializationObject.id = this.uniqueId;\r\n serializationObject.name = this.name;\r\n serializationObject.comments = this.comments;\r\n serializationObject.visibleInInspector = this.visibleInInspector;\r\n serializationObject.visibleOnFrame = this.visibleOnFrame;\r\n serializationObject.target = this.target;\r\n\r\n serializationObject.inputs = [];\r\n serializationObject.outputs = [];\r\n\r\n for (const input of this.inputs) {\r\n serializationObject.inputs.push(input.serialize());\r\n }\r\n\r\n for (const output of this.outputs) {\r\n serializationObject.outputs.push(output.serialize(false));\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n this.name = serializationObject.name;\r\n this.comments = serializationObject.comments;\r\n this.visibleInInspector = !!serializationObject.visibleInInspector;\r\n this.visibleOnFrame = !!serializationObject.visibleOnFrame;\r\n this._target = serializationObject.target ?? this.target;\r\n this._deserializePortDisplayNamesAndExposedOnFrame(serializationObject);\r\n }\r\n\r\n private _deserializePortDisplayNamesAndExposedOnFrame(serializationObject: any) {\r\n const serializedInputs = serializationObject.inputs;\r\n const serializedOutputs = serializationObject.outputs;\r\n if (serializedInputs) {\r\n serializedInputs.forEach((port: any, i: number) => {\r\n if (port.displayName) {\r\n this.inputs[i].displayName = port.displayName;\r\n }\r\n if (port.isExposedOnFrame) {\r\n this.inputs[i].isExposedOnFrame = port.isExposedOnFrame;\r\n this.inputs[i].exposedPortPosition = port.exposedPortPosition;\r\n }\r\n });\r\n }\r\n if (serializedOutputs) {\r\n serializedOutputs.forEach((port: any, i: number) => {\r\n if (port.displayName) {\r\n this.outputs[i].displayName = port.displayName;\r\n }\r\n if (port.isExposedOnFrame) {\r\n this.outputs[i].isExposedOnFrame = port.isExposedOnFrame;\r\n this.outputs[i].exposedPortPosition = port.exposedPortPosition;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Release resources\r\n */\r\n public dispose() {\r\n for (const input of this.inputs) {\r\n input.dispose();\r\n }\r\n\r\n for (const output of this.outputs) {\r\n output.dispose();\r\n }\r\n }\r\n}\r\n", "import { NodeMaterialBlock } from \"../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport type { InputBlock } from \"./Input/inputBlock\";\r\nimport type { AbstractMesh } from \"../../../Meshes/abstractMesh\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"../nodeMaterial\";\r\n\r\n/**\r\n * Block used to transform a vector (2, 3 or 4) with a matrix. It will generate a Vector4\r\n */\r\nexport class TransformBlock extends NodeMaterialBlock {\r\n /**\r\n * Defines the value to use to complement W value to transform it to a Vector4\r\n */\r\n public complementW = 1;\r\n\r\n /**\r\n * Defines the value to use to complement z value to transform it to a Vector4\r\n */\r\n public complementZ = 0;\r\n\r\n /**\r\n * Creates a new TransformBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.target = NodeMaterialBlockTargets.Vertex;\r\n\r\n this.registerInput(\"vector\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerInput(\"transform\", NodeMaterialBlockConnectionPointTypes.Matrix);\r\n this.registerOutput(\"output\", NodeMaterialBlockConnectionPointTypes.Vector4);\r\n this.registerOutput(\"xyz\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n\r\n this._inputs[0].onConnectionObservable.add((other) => {\r\n if (other.ownerBlock.isInput) {\r\n const otherAsInput = other.ownerBlock as InputBlock;\r\n\r\n if (otherAsInput.name === \"normal\" || otherAsInput.name === \"tangent\") {\r\n this.complementW = 0;\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"TransformBlock\";\r\n }\r\n\r\n /**\r\n * Gets the vector input\r\n */\r\n public get vector(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the xyz output component\r\n */\r\n public get xyz(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the matrix transform input\r\n */\r\n public get transform(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const vector = this.vector;\r\n const transform = this.transform;\r\n\r\n if (vector.connectedPoint) {\r\n // None uniform scaling case.\r\n if (this.complementW === 0) {\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n state.sharedData.blocksWithDefines.push(this);\r\n\r\n const transformName = state._getFreeVariableName(`${transform.associatedVariableName}_NUS`);\r\n state.compilationString += `mat3 ${transformName} = mat3(${transform.associatedVariableName});\\n`;\r\n state.compilationString += `#ifdef NONUNIFORMSCALING\\n`;\r\n state.compilationString += `${transformName} = transposeMat3(inverseMat3(${transformName}));\\n`;\r\n state.compilationString += `#endif\\n`;\r\n switch (vector.connectedPoint.type) {\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n state.compilationString +=\r\n this._declareOutput(this.output, state) +\r\n ` = vec4(${transformName} * vec3(${vector.associatedVariableName}, ${this._writeFloat(this.complementZ)}), ${this._writeFloat(this.complementW)});\\n`;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n state.compilationString +=\r\n this._declareOutput(this.output, state) + ` = vec4(${transformName} * ${vector.associatedVariableName}, ${this._writeFloat(this.complementW)});\\n`;\r\n break;\r\n default:\r\n state.compilationString +=\r\n this._declareOutput(this.output, state) + ` = vec4(${transformName} * ${vector.associatedVariableName}.xyz, ${this._writeFloat(this.complementW)});\\n`;\r\n break;\r\n }\r\n } else {\r\n const transformName = transform.associatedVariableName;\r\n switch (vector.connectedPoint.type) {\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n state.compilationString +=\r\n this._declareOutput(this.output, state) +\r\n ` = ${transformName} * vec4(${vector.associatedVariableName}, ${this._writeFloat(this.complementZ)}, ${this._writeFloat(this.complementW)});\\n`;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n state.compilationString +=\r\n this._declareOutput(this.output, state) + ` = ${transformName} * vec4(${vector.associatedVariableName}, ${this._writeFloat(this.complementW)});\\n`;\r\n break;\r\n default:\r\n state.compilationString += this._declareOutput(this.output, state) + ` = ${transformName} * ${vector.associatedVariableName};\\n`;\r\n break;\r\n }\r\n }\r\n\r\n if (this.xyz.hasEndpoints) {\r\n state.compilationString += this._declareOutput(this.xyz, state) + ` = ${this.output.associatedVariableName}.xyz;\\n`;\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Update defines for shader compilation\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n */\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n // Do nothing\r\n if (mesh.nonUniformScaling) {\r\n defines.setValue(\"NONUNIFORMSCALING\", true);\r\n }\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.complementZ = this.complementZ;\r\n serializationObject.complementW = this.complementW;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.complementZ = serializationObject.complementZ !== undefined ? serializationObject.complementZ : 0.0;\r\n this.complementW = serializationObject.complementW !== undefined ? serializationObject.complementW : 1.0;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode() + `${this._codeVariableName}.complementZ = ${this.complementZ};\\n`;\r\n\r\n codeString += `${this._codeVariableName}.complementW = ${this.complementW};\\n`;\r\n\r\n return codeString;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TransformBlock\", TransformBlock);\r\n", "import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport type { Immutable } from \"../../../../types\";\r\n\r\nimport type { FragmentOutputBlock } from \"../Fragment/fragmentOutputBlock\";\r\n\r\n/**\r\n * Block used to output the vertex position\r\n */\r\nexport class VertexOutputBlock extends NodeMaterialBlock {\r\n /**\r\n * Creates a new VertexOutputBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Vertex, true);\r\n\r\n this.registerInput(\"vector\", NodeMaterialBlockConnectionPointTypes.Vector4);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"VertexOutputBlock\";\r\n }\r\n\r\n /**\r\n * Gets the vector input component\r\n */\r\n public get vector(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n private _isLogarithmicDepthEnabled(nodeList: Immutable, useLogarithmicDepth: boolean): boolean {\r\n if (useLogarithmicDepth) {\r\n return true;\r\n }\r\n\r\n for (const node of nodeList) {\r\n if ((node as FragmentOutputBlock).useLogarithmicDepth) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const input = this.vector;\r\n\r\n state.compilationString += `gl_Position = ${input.associatedVariableName};\\n`;\r\n\r\n if (this._isLogarithmicDepthEnabled(state.sharedData.fragmentOutputNodes, state.sharedData.nodeMaterial.useLogarithmicDepth)) {\r\n state._emitUniformFromString(\"logarithmicDepthConstant\", \"float\");\r\n state._emitVaryingFromString(\"vFragmentDepth\", \"float\");\r\n\r\n state.compilationString += `vFragmentDepth = 1.0 + gl_Position.w;\\n`;\r\n state.compilationString += `gl_Position.z = log2(max(0.000001, vFragmentDepth)) * logarithmicDepthConstant;\\n`;\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.VertexOutputBlock\", VertexOutputBlock);\r\n", "import type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\n\r\n/**\r\n * Enum defining the type of properties that can be edited in the property pages in the node editor\r\n */\r\nexport enum PropertyTypeForEdition {\r\n /** property is a boolean */\r\n Boolean,\r\n /** property is a float */\r\n Float,\r\n /** property is a int */\r\n Int,\r\n /** property is a Vector2 */\r\n Vector2,\r\n /** property is a list of values */\r\n List,\r\n}\r\n\r\n/**\r\n * Interface that defines an option in a variable of type list\r\n */\r\nexport interface IEditablePropertyListOption {\r\n /** label of the option */\r\n label: string;\r\n /** value of the option */\r\n value: number;\r\n}\r\n\r\n/**\r\n * Interface that defines the options available for an editable property\r\n */\r\nexport interface IEditablePropertyOption {\r\n /** min value */\r\n min?: number;\r\n /** max value */\r\n max?: number;\r\n /** notifiers: indicates which actions to take when the property is changed */\r\n notifiers?: {\r\n /** the entity should be rebuilt */\r\n rebuild?: boolean;\r\n /** the preview should be updated */\r\n update?: boolean;\r\n /** the onPreviewCommandActivated observer of the preview manager should be triggered */\r\n activatePreviewCommand?: boolean;\r\n /** a callback to trigger */\r\n callback?: (scene: Nullable, block: any) => boolean | undefined | void;\r\n /** a callback to validate the property. Returns true if the property is ok, else false. If false, the rebuild/update/callback events won't be called */\r\n onValidation?: (block: any, propertyName: string) => boolean;\r\n };\r\n /** list of the options for a variable of type list */\r\n options?: IEditablePropertyListOption[];\r\n}\r\n\r\n/**\r\n * Interface that describes an editable property\r\n */\r\nexport interface IPropertyDescriptionForEdition {\r\n /** name of the property */\r\n propertyName: string;\r\n /** display name of the property */\r\n displayName: string;\r\n /** type of the property */\r\n type: PropertyTypeForEdition;\r\n /** group of the property - all properties with the same group value will be displayed in a specific section */\r\n groupName: string;\r\n /** options for the property */\r\n options: IEditablePropertyOption;\r\n}\r\n\r\n/**\r\n * Decorator that flags a property in a node block as being editable\r\n * @param displayName the display name of the property\r\n * @param propertyType the type of the property\r\n * @param groupName the group name of the property\r\n * @param options the options of the property\r\n * @returns the decorator\r\n */\r\nexport function editableInPropertyPage(\r\n displayName: string,\r\n propertyType: PropertyTypeForEdition = PropertyTypeForEdition.Boolean,\r\n groupName: string = \"PROPERTIES\",\r\n options?: IEditablePropertyOption\r\n) {\r\n return (target: any, propertyKey: string) => {\r\n let propStore: IPropertyDescriptionForEdition[] = target._propStore;\r\n if (!propStore) {\r\n propStore = [];\r\n target._propStore = propStore;\r\n }\r\n propStore.push({\r\n propertyName: propertyKey,\r\n displayName: displayName,\r\n type: propertyType,\r\n groupName: groupName,\r\n options: options ?? {},\r\n });\r\n };\r\n}\r\n", "import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport type { Scene } from \"../../../../scene\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { NodeMaterialDefines, NodeMaterial } from \"../../nodeMaterial\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../../Decorators/nodeDecorator\";\r\nimport type { Effect } from \"../../../effect\";\r\nimport type { Mesh } from \"../../../../Meshes/mesh\";\r\nimport { BindLogDepth } from \"../../../materialHelper.functions\";\r\n\r\n/**\r\n * Block used to output the final color\r\n */\r\nexport class FragmentOutputBlock extends NodeMaterialBlock {\r\n private _linearDefineName: string;\r\n private _gammaDefineName: string;\r\n\r\n /**\r\n * Create a new FragmentOutputBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment, true);\r\n\r\n this.registerInput(\"rgba\", NodeMaterialBlockConnectionPointTypes.Color4, true);\r\n this.registerInput(\"rgb\", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);\r\n this.registerInput(\"a\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.rgb.addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Color3 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Float\r\n );\r\n }\r\n\r\n /** Gets or sets a boolean indicating if content needs to be converted to gamma space */\r\n @editableInPropertyPage(\"Convert to gamma space\", PropertyTypeForEdition.Boolean, \"PROPERTIES\", { notifiers: { update: true } })\r\n public convertToGammaSpace = false;\r\n\r\n /** Gets or sets a boolean indicating if content needs to be converted to linear space */\r\n @editableInPropertyPage(\"Convert to linear space\", PropertyTypeForEdition.Boolean, \"PROPERTIES\", { notifiers: { update: true } })\r\n public convertToLinearSpace = false;\r\n\r\n /** Gets or sets a boolean indicating if logarithmic depth should be used */\r\n @editableInPropertyPage(\"Use logarithmic depth\", PropertyTypeForEdition.Boolean, \"PROPERTIES\")\r\n public useLogarithmicDepth = false;\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"FragmentOutputBlock\";\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"logarithmicDepthConstant\");\r\n state._excludeVariableName(\"vFragmentDepth\");\r\n }\r\n\r\n /**\r\n * Gets the rgba input component\r\n */\r\n public get rgba(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgb input component\r\n */\r\n public get rgb(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the a input component\r\n */\r\n public get a(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n defines.setValue(this._linearDefineName, this.convertToLinearSpace, true);\r\n defines.setValue(this._gammaDefineName, this.convertToGammaSpace, true);\r\n }\r\n\r\n public bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh) {\r\n if ((this.useLogarithmicDepth || nodeMaterial.useLogarithmicDepth) && mesh) {\r\n BindLogDepth(undefined, effect, mesh.getScene());\r\n }\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const rgba = this.rgba;\r\n const rgb = this.rgb;\r\n const a = this.a;\r\n\r\n state.sharedData.hints.needAlphaBlending = rgba.isConnected || a.isConnected;\r\n state.sharedData.blocksWithDefines.push(this);\r\n if (this.useLogarithmicDepth || state.sharedData.nodeMaterial.useLogarithmicDepth) {\r\n state._emitUniformFromString(\"logarithmicDepthConstant\", \"float\");\r\n state._emitVaryingFromString(\"vFragmentDepth\", \"float\");\r\n state.sharedData.bindableBlocks.push(this);\r\n }\r\n this._linearDefineName = state._getFreeDefineName(\"CONVERTTOLINEAR\");\r\n this._gammaDefineName = state._getFreeDefineName(\"CONVERTTOGAMMA\");\r\n\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n\r\n if (rgba.connectedPoint) {\r\n if (a.isConnected) {\r\n state.compilationString += `gl_FragColor = vec4(${rgba.associatedVariableName}.rgb, ${a.associatedVariableName});\\n`;\r\n } else {\r\n state.compilationString += `gl_FragColor = ${rgba.associatedVariableName};\\n`;\r\n }\r\n } else if (rgb.connectedPoint) {\r\n let aValue = \"1.0\";\r\n\r\n if (a.connectedPoint) {\r\n aValue = a.associatedVariableName;\r\n }\r\n\r\n if (rgb.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Float) {\r\n state.compilationString += `gl_FragColor = vec4(${rgb.associatedVariableName}, ${rgb.associatedVariableName}, ${rgb.associatedVariableName}, ${aValue});\\n`;\r\n } else {\r\n state.compilationString += `gl_FragColor = vec4(${rgb.associatedVariableName}, ${aValue});\\n`;\r\n }\r\n } else {\r\n state.sharedData.checks.notConnectedNonOptionalInputs.push(rgba);\r\n }\r\n\r\n state.compilationString += `#ifdef ${this._linearDefineName}\\n`;\r\n state.compilationString += `gl_FragColor = toLinearSpace(gl_FragColor);\\n`;\r\n state.compilationString += `#endif\\n`;\r\n\r\n state.compilationString += `#ifdef ${this._gammaDefineName}\\n`;\r\n state.compilationString += `gl_FragColor = toGammaSpace(gl_FragColor);\\n`;\r\n state.compilationString += `#endif\\n`;\r\n\r\n if (this.useLogarithmicDepth || state.sharedData.nodeMaterial.useLogarithmicDepth) {\r\n state.compilationString += `gl_FragDepthEXT = log2(vFragmentDepth) * logarithmicDepthConstant * 0.5;\\n`;\r\n }\r\n\r\n state.compilationString += `#if defined(PREPASS)\\r\\n`;\r\n state.compilationString += `gl_FragData[0] = gl_FragColor;\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n\r\n return this;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode();\r\n codeString += `${this._codeVariableName}.convertToGammaSpace = ${this.convertToGammaSpace};\\n`;\r\n codeString += `${this._codeVariableName}.convertToLinearSpace = ${this.convertToLinearSpace};\\n`;\r\n codeString += `${this._codeVariableName}.useLogarithmicDepth = ${this.useLogarithmicDepth};\\n`;\r\n\r\n return codeString;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.convertToGammaSpace = this.convertToGammaSpace;\r\n serializationObject.convertToLinearSpace = this.convertToLinearSpace;\r\n serializationObject.useLogarithmicDepth = this.useLogarithmicDepth;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.convertToGammaSpace = serializationObject.convertToGammaSpace;\r\n this.convertToLinearSpace = serializationObject.convertToLinearSpace;\r\n this.useLogarithmicDepth = serializationObject.useLogarithmicDepth ?? false;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.FragmentOutputBlock\", FragmentOutputBlock);\r\n", "/**\r\n * Enum defining the mode of a NodeMaterialBlockConnectionPoint\r\n */\r\nexport enum NodeMaterialBlockConnectionPointMode {\r\n /** Value is an uniform */\r\n Uniform,\r\n /** Value is a mesh attribute */\r\n Attribute,\r\n /** Value is a varying between vertex and fragment shaders */\r\n Varying,\r\n /** Mode is undefined */\r\n Undefined,\r\n}\r\n", "/**\r\n * Enum used to define system values e.g. values automatically provided by the system\r\n */\r\nexport enum NodeMaterialSystemValues {\r\n /** World */\r\n World = 1,\r\n /** View */\r\n View = 2,\r\n /** Projection */\r\n Projection = 3,\r\n /** ViewProjection */\r\n ViewProjection = 4,\r\n /** WorldView */\r\n WorldView = 5,\r\n /** WorldViewProjection */\r\n WorldViewProjection = 6,\r\n /** CameraPosition */\r\n CameraPosition = 7,\r\n /** Fog Color */\r\n FogColor = 8,\r\n /** Delta time */\r\n DeltaTime = 9,\r\n /** Camera parameters */\r\n CameraParameters = 10,\r\n /** Material alpha */\r\n MaterialAlpha = 11,\r\n}\r\n", "import type { DeepImmutable, Nullable } from \"../types\";\r\nimport { Scalar } from \"./math.scalar\";\r\nimport { Vector2, Vector3, Quaternion, Matrix } from \"./math.vector\";\r\nimport type { Vector4 } from \"./math.vector\";\r\nimport { Epsilon } from \"./math.constants\";\r\n\r\n/**\r\n * Defines potential orientation for back face culling\r\n */\r\nexport enum Orientation {\r\n /**\r\n * Clockwise\r\n */\r\n CW = 0,\r\n /** Counter clockwise */\r\n CCW = 1,\r\n}\r\n\r\n/** Class used to represent a Bezier curve */\r\nexport class BezierCurve {\r\n /**\r\n * Returns the cubic Bezier interpolated value (float) at \"t\" (float) from the given x1, y1, x2, y2 floats\r\n * @param t defines the time\r\n * @param x1 defines the left coordinate on X axis\r\n * @param y1 defines the left coordinate on Y axis\r\n * @param x2 defines the right coordinate on X axis\r\n * @param y2 defines the right coordinate on Y axis\r\n * @returns the interpolated value\r\n */\r\n public static Interpolate(t: number, x1: number, y1: number, x2: number, y2: number): number {\r\n // Extract X (which is equal to time here)\r\n const f0 = 1 - 3 * x2 + 3 * x1;\r\n const f1 = 3 * x2 - 6 * x1;\r\n const f2 = 3 * x1;\r\n\r\n let refinedT = t;\r\n for (let i = 0; i < 5; i++) {\r\n const refinedT2 = refinedT * refinedT;\r\n const refinedT3 = refinedT2 * refinedT;\r\n\r\n const x = f0 * refinedT3 + f1 * refinedT2 + f2 * refinedT;\r\n const slope = 1.0 / (3.0 * f0 * refinedT2 + 2.0 * f1 * refinedT + f2);\r\n refinedT -= (x - t) * slope;\r\n refinedT = Math.min(1, Math.max(0, refinedT));\r\n }\r\n\r\n // Resolve cubic bezier for the given x\r\n return 3 * Math.pow(1 - refinedT, 2) * refinedT * y1 + 3 * (1 - refinedT) * Math.pow(refinedT, 2) * y2 + Math.pow(refinedT, 3);\r\n }\r\n}\r\n\r\n/**\r\n * Defines angle representation\r\n */\r\nexport class Angle {\r\n private _radians: number;\r\n\r\n /**\r\n * Creates an Angle object of \"radians\" radians (float).\r\n * @param radians the angle in radians\r\n */\r\n constructor(radians: number) {\r\n this._radians = radians;\r\n if (this._radians < 0.0) {\r\n this._radians += 2.0 * Math.PI;\r\n }\r\n }\r\n\r\n /**\r\n * Get value in degrees\r\n * @returns the Angle value in degrees (float)\r\n */\r\n public degrees() {\r\n return (this._radians * 180.0) / Math.PI;\r\n }\r\n\r\n /**\r\n * Get value in radians\r\n * @returns the Angle value in radians (float)\r\n */\r\n public radians() {\r\n return this._radians;\r\n }\r\n\r\n /**\r\n * Gets a new Angle object with a value of the angle (in radians) between the line connecting the two points and the x-axis\r\n * @param a defines first point as the origin\r\n * @param b defines point\r\n * @returns a new Angle\r\n */\r\n public static BetweenTwoPoints(a: DeepImmutable, b: DeepImmutable): Angle {\r\n const delta = b.subtract(a);\r\n const theta = Math.atan2(delta.y, delta.x);\r\n return new Angle(theta);\r\n }\r\n\r\n /**\r\n * Gets the angle between the two vectors\r\n * @param a defines first vector\r\n * @param b defines vector\r\n * @returns Returns an new Angle between 0 and PI\r\n */\r\n public static BetweenTwoVectors(a: DeepImmutable, b: DeepImmutable): Angle {\r\n let product = a.lengthSquared() * b.lengthSquared();\r\n if (product === 0) return new Angle(Math.PI / 2);\r\n product = Math.sqrt(product);\r\n let cosVal = a.dot(b as any) / product;\r\n cosVal = Scalar.Clamp(cosVal, -1, 1);\r\n const angle = Math.acos(cosVal);\r\n return new Angle(angle);\r\n }\r\n\r\n /**\r\n * Gets a new Angle object from the given float in radians\r\n * @param radians defines the angle value in radians\r\n * @returns a new Angle\r\n */\r\n public static FromRadians(radians: number): Angle {\r\n return new Angle(radians);\r\n }\r\n /**\r\n * Gets a new Angle object from the given float in degrees\r\n * @param degrees defines the angle value in degrees\r\n * @returns a new Angle\r\n */\r\n public static FromDegrees(degrees: number): Angle {\r\n return new Angle((degrees * Math.PI) / 180.0);\r\n }\r\n}\r\n\r\n/**\r\n * This represents an arc in a 2d space.\r\n */\r\nexport class Arc2 {\r\n /**\r\n * Defines the center point of the arc.\r\n */\r\n public centerPoint: Vector2;\r\n /**\r\n * Defines the radius of the arc.\r\n */\r\n public radius: number;\r\n /**\r\n * Defines the angle of the arc (from mid point to end point).\r\n */\r\n public angle: Angle;\r\n /**\r\n * Defines the start angle of the arc (from start point to middle point).\r\n */\r\n public startAngle: Angle;\r\n /**\r\n * Defines the orientation of the arc (clock wise/counter clock wise).\r\n */\r\n public orientation: Orientation;\r\n\r\n /**\r\n * Creates an Arc object from the three given points : start, middle and end.\r\n * @param startPoint Defines the start point of the arc\r\n * @param midPoint Defines the middle point of the arc\r\n * @param endPoint Defines the end point of the arc\r\n */\r\n constructor(\r\n /** Defines the start point of the arc */\r\n public startPoint: Vector2,\r\n /** Defines the mid point of the arc */\r\n public midPoint: Vector2,\r\n /** Defines the end point of the arc */\r\n public endPoint: Vector2\r\n ) {\r\n const temp = Math.pow(midPoint.x, 2) + Math.pow(midPoint.y, 2);\r\n const startToMid = (Math.pow(startPoint.x, 2) + Math.pow(startPoint.y, 2) - temp) / 2;\r\n const midToEnd = (temp - Math.pow(endPoint.x, 2) - Math.pow(endPoint.y, 2)) / 2;\r\n const det = (startPoint.x - midPoint.x) * (midPoint.y - endPoint.y) - (midPoint.x - endPoint.x) * (startPoint.y - midPoint.y);\r\n\r\n this.centerPoint = new Vector2(\r\n (startToMid * (midPoint.y - endPoint.y) - midToEnd * (startPoint.y - midPoint.y)) / det,\r\n ((startPoint.x - midPoint.x) * midToEnd - (midPoint.x - endPoint.x) * startToMid) / det\r\n );\r\n\r\n this.radius = this.centerPoint.subtract(this.startPoint).length();\r\n\r\n this.startAngle = Angle.BetweenTwoPoints(this.centerPoint, this.startPoint);\r\n\r\n const a1 = this.startAngle.degrees();\r\n let a2 = Angle.BetweenTwoPoints(this.centerPoint, this.midPoint).degrees();\r\n let a3 = Angle.BetweenTwoPoints(this.centerPoint, this.endPoint).degrees();\r\n\r\n // angles correction\r\n if (a2 - a1 > +180.0) {\r\n a2 -= 360.0;\r\n }\r\n if (a2 - a1 < -180.0) {\r\n a2 += 360.0;\r\n }\r\n if (a3 - a2 > +180.0) {\r\n a3 -= 360.0;\r\n }\r\n if (a3 - a2 < -180.0) {\r\n a3 += 360.0;\r\n }\r\n\r\n this.orientation = a2 - a1 < 0 ? Orientation.CW : Orientation.CCW;\r\n this.angle = Angle.FromDegrees(this.orientation === Orientation.CW ? a1 - a3 : a3 - a1);\r\n }\r\n}\r\n\r\n/**\r\n * Represents a 2D path made up of multiple 2D points\r\n */\r\nexport class Path2 {\r\n private _points = new Array();\r\n private _length = 0.0;\r\n\r\n /**\r\n * If the path start and end point are the same\r\n */\r\n public closed = false;\r\n\r\n /**\r\n * Creates a Path2 object from the starting 2D coordinates x and y.\r\n * @param x the starting points x value\r\n * @param y the starting points y value\r\n */\r\n constructor(x: number, y: number) {\r\n this._points.push(new Vector2(x, y));\r\n }\r\n\r\n /**\r\n * Adds a new segment until the given coordinates (x, y) to the current Path2.\r\n * @param x the added points x value\r\n * @param y the added points y value\r\n * @returns the updated Path2.\r\n */\r\n public addLineTo(x: number, y: number): Path2 {\r\n if (this.closed) {\r\n return this;\r\n }\r\n const newPoint = new Vector2(x, y);\r\n const previousPoint = this._points[this._points.length - 1];\r\n this._points.push(newPoint);\r\n this._length += newPoint.subtract(previousPoint).length();\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds _numberOfSegments_ segments according to the arc definition (middle point coordinates, end point coordinates, the arc start point being the current Path2 last point) to the current Path2.\r\n * @param midX middle point x value\r\n * @param midY middle point y value\r\n * @param endX end point x value\r\n * @param endY end point y value\r\n * @param numberOfSegments (default: 36)\r\n * @returns the updated Path2.\r\n */\r\n public addArcTo(midX: number, midY: number, endX: number, endY: number, numberOfSegments = 36): Path2 {\r\n if (this.closed) {\r\n return this;\r\n }\r\n const startPoint = this._points[this._points.length - 1];\r\n const midPoint = new Vector2(midX, midY);\r\n const endPoint = new Vector2(endX, endY);\r\n\r\n const arc = new Arc2(startPoint, midPoint, endPoint);\r\n\r\n let increment = arc.angle.radians() / numberOfSegments;\r\n if (arc.orientation === Orientation.CW) {\r\n increment *= -1;\r\n }\r\n let currentAngle = arc.startAngle.radians() + increment;\r\n\r\n for (let i = 0; i < numberOfSegments; i++) {\r\n const x = Math.cos(currentAngle) * arc.radius + arc.centerPoint.x;\r\n const y = Math.sin(currentAngle) * arc.radius + arc.centerPoint.y;\r\n this.addLineTo(x, y);\r\n currentAngle += increment;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds _numberOfSegments_ segments according to the quadratic curve definition to the current Path2.\r\n * @param controlX control point x value\r\n * @param controlY control point y value\r\n * @param endX end point x value\r\n * @param endY end point y value\r\n * @param numberOfSegments (default: 36)\r\n * @returns the updated Path2.\r\n */\r\n public addQuadraticCurveTo(controlX: number, controlY: number, endX: number, endY: number, numberOfSegments = 36): Path2 {\r\n if (this.closed) {\r\n return this;\r\n }\r\n\r\n const equation = (t: number, val0: number, val1: number, val2: number) => {\r\n const res = (1.0 - t) * (1.0 - t) * val0 + 2.0 * t * (1.0 - t) * val1 + t * t * val2;\r\n return res;\r\n };\r\n const startPoint = this._points[this._points.length - 1];\r\n for (let i = 0; i <= numberOfSegments; i++) {\r\n const step = i / numberOfSegments;\r\n const x = equation(step, startPoint.x, controlX, endX);\r\n const y = equation(step, startPoint.y, controlY, endY);\r\n this.addLineTo(x, y);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds _numberOfSegments_ segments according to the bezier curve definition to the current Path2.\r\n * @param originTangentX tangent vector at the origin point x value\r\n * @param originTangentY tangent vector at the origin point y value\r\n * @param destinationTangentX tangent vector at the destination point x value\r\n * @param destinationTangentY tangent vector at the destination point y value\r\n * @param endX end point x value\r\n * @param endY end point y value\r\n * @param numberOfSegments (default: 36)\r\n * @returns the updated Path2.\r\n */\r\n public addBezierCurveTo(\r\n originTangentX: number,\r\n originTangentY: number,\r\n destinationTangentX: number,\r\n destinationTangentY: number,\r\n endX: number,\r\n endY: number,\r\n numberOfSegments = 36\r\n ): Path2 {\r\n if (this.closed) {\r\n return this;\r\n }\r\n\r\n const equation = (t: number, val0: number, val1: number, val2: number, val3: number) => {\r\n const res = (1.0 - t) * (1.0 - t) * (1.0 - t) * val0 + 3.0 * t * (1.0 - t) * (1.0 - t) * val1 + 3.0 * t * t * (1.0 - t) * val2 + t * t * t * val3;\r\n return res;\r\n };\r\n const startPoint = this._points[this._points.length - 1];\r\n for (let i = 0; i <= numberOfSegments; i++) {\r\n const step = i / numberOfSegments;\r\n const x = equation(step, startPoint.x, originTangentX, destinationTangentX, endX);\r\n const y = equation(step, startPoint.y, originTangentY, destinationTangentY, endY);\r\n this.addLineTo(x, y);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Defines if a given point is inside the polygon defines by the path\r\n * @param point defines the point to test\r\n * @returns true if the point is inside\r\n */\r\n public isPointInside(point: Vector2) {\r\n let isInside = false;\r\n const count = this._points.length;\r\n for (let p = count - 1, q = 0; q < count; p = q++) {\r\n let edgeLow = this._points[p];\r\n let edgeHigh = this._points[q];\r\n\r\n let edgeDx = edgeHigh.x - edgeLow.x;\r\n let edgeDy = edgeHigh.y - edgeLow.y;\r\n\r\n if (Math.abs(edgeDy) > Number.EPSILON) {\r\n // Not parallel\r\n if (edgeDy < 0) {\r\n edgeLow = this._points[q];\r\n edgeDx = -edgeDx;\r\n edgeHigh = this._points[p];\r\n edgeDy = -edgeDy;\r\n }\r\n\r\n if (point.y < edgeLow.y || point.y > edgeHigh.y) {\r\n continue;\r\n }\r\n\r\n if (point.y === edgeLow.y && point.x === edgeLow.x) {\r\n return true;\r\n } else {\r\n const perpEdge = edgeDy * (point.x - edgeLow.x) - edgeDx * (point.y - edgeLow.y);\r\n if (perpEdge === 0) {\r\n return true;\r\n }\r\n if (perpEdge < 0) {\r\n continue;\r\n }\r\n isInside = !isInside;\r\n }\r\n } else {\r\n // parallel or collinear\r\n if (point.y !== edgeLow.y) {\r\n continue;\r\n }\r\n\r\n if ((edgeHigh.x <= point.x && point.x <= edgeLow.x) || (edgeLow.x <= point.x && point.x <= edgeHigh.x)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return isInside;\r\n }\r\n\r\n /**\r\n * Closes the Path2.\r\n * @returns the Path2.\r\n */\r\n public close(): Path2 {\r\n this.closed = true;\r\n return this;\r\n }\r\n /**\r\n * Gets the sum of the distance between each sequential point in the path\r\n * @returns the Path2 total length (float).\r\n */\r\n public length(): number {\r\n let result = this._length;\r\n\r\n if (this.closed) {\r\n const lastPoint = this._points[this._points.length - 1];\r\n const firstPoint = this._points[0];\r\n result += firstPoint.subtract(lastPoint).length();\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the area of the polygon defined by the path\r\n * @returns area value\r\n */\r\n public area(): number {\r\n const n = this._points.length;\r\n let value = 0.0;\r\n\r\n for (let p = n - 1, q = 0; q < n; p = q++) {\r\n value += this._points[p].x * this._points[q].y - this._points[q].x * this._points[p].y;\r\n }\r\n\r\n return value * 0.5;\r\n }\r\n\r\n /**\r\n * Gets the points which construct the path\r\n * @returns the Path2 internal array of points.\r\n */\r\n public getPoints(): Vector2[] {\r\n return this._points;\r\n }\r\n\r\n /**\r\n * Retrieves the point at the distance aways from the starting point\r\n * @param normalizedLengthPosition the length along the path to retrieve the point from\r\n * @returns a new Vector2 located at a percentage of the Path2 total length on this path.\r\n */\r\n public getPointAtLengthPosition(normalizedLengthPosition: number): Vector2 {\r\n if (normalizedLengthPosition < 0 || normalizedLengthPosition > 1) {\r\n return Vector2.Zero();\r\n }\r\n\r\n const lengthPosition = normalizedLengthPosition * this.length();\r\n\r\n let previousOffset = 0;\r\n for (let i = 0; i < this._points.length; i++) {\r\n const j = (i + 1) % this._points.length;\r\n\r\n const a = this._points[i];\r\n const b = this._points[j];\r\n const bToA = b.subtract(a);\r\n\r\n const nextOffset = bToA.length() + previousOffset;\r\n if (lengthPosition >= previousOffset && lengthPosition <= nextOffset) {\r\n const dir = bToA.normalize();\r\n const localOffset = lengthPosition - previousOffset;\r\n\r\n return new Vector2(a.x + dir.x * localOffset, a.y + dir.y * localOffset);\r\n }\r\n previousOffset = nextOffset;\r\n }\r\n\r\n return Vector2.Zero();\r\n }\r\n\r\n /**\r\n * Creates a new path starting from an x and y position\r\n * @param x starting x value\r\n * @param y starting y value\r\n * @returns a new Path2 starting at the coordinates (x, y).\r\n */\r\n public static StartingAt(x: number, y: number): Path2 {\r\n return new Path2(x, y);\r\n }\r\n}\r\n\r\n/**\r\n * Represents a 3D path made up of multiple 3D points\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/path3D\r\n */\r\nexport class Path3D {\r\n private _curve = new Array();\r\n private _distances = new Array();\r\n private _tangents = new Array();\r\n private _normals = new Array();\r\n private _binormals = new Array();\r\n private _raw: boolean;\r\n private _alignTangentsWithPath: boolean;\r\n\r\n // holds interpolated point data\r\n private readonly _pointAtData = {\r\n id: 0,\r\n point: Vector3.Zero(),\r\n previousPointArrayIndex: 0,\r\n\r\n position: 0,\r\n subPosition: 0,\r\n\r\n interpolateReady: false,\r\n interpolationMatrix: Matrix.Identity(),\r\n };\r\n\r\n /**\r\n * new Path3D(path, normal, raw)\r\n * Creates a Path3D. A Path3D is a logical math object, so not a mesh.\r\n * please read the description in the tutorial : https://doc.babylonjs.com/features/featuresDeepDive/mesh/path3D\r\n * @param path an array of Vector3, the curve axis of the Path3D\r\n * @param firstNormal (options) Vector3, the first wanted normal to the curve. Ex (0, 1, 0) for a vertical normal.\r\n * @param raw (optional, default false) : boolean, if true the returned Path3D isn't normalized. Useful to depict path acceleration or speed.\r\n * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path.\r\n */\r\n constructor(\r\n /**\r\n * an array of Vector3, the curve axis of the Path3D\r\n */\r\n public path: Vector3[],\r\n firstNormal: Nullable = null,\r\n raw?: boolean,\r\n alignTangentsWithPath = false\r\n ) {\r\n for (let p = 0; p < path.length; p++) {\r\n this._curve[p] = path[p].clone(); // hard copy\r\n }\r\n this._raw = raw || false;\r\n this._alignTangentsWithPath = alignTangentsWithPath;\r\n this._compute(firstNormal, alignTangentsWithPath);\r\n }\r\n\r\n /**\r\n * Returns the Path3D array of successive Vector3 designing its curve.\r\n * @returns the Path3D array of successive Vector3 designing its curve.\r\n */\r\n public getCurve(): Vector3[] {\r\n return this._curve;\r\n }\r\n\r\n /**\r\n * Returns the Path3D array of successive Vector3 designing its curve.\r\n * @returns the Path3D array of successive Vector3 designing its curve.\r\n */\r\n public getPoints(): Vector3[] {\r\n return this._curve;\r\n }\r\n\r\n /**\r\n * @returns the computed length (float) of the path.\r\n */\r\n public length() {\r\n return this._distances[this._distances.length - 1];\r\n }\r\n\r\n /**\r\n * Returns an array populated with tangent vectors on each Path3D curve point.\r\n * @returns an array populated with tangent vectors on each Path3D curve point.\r\n */\r\n public getTangents(): Vector3[] {\r\n return this._tangents;\r\n }\r\n\r\n /**\r\n * Returns an array populated with normal vectors on each Path3D curve point.\r\n * @returns an array populated with normal vectors on each Path3D curve point.\r\n */\r\n public getNormals(): Vector3[] {\r\n return this._normals;\r\n }\r\n\r\n /**\r\n * Returns an array populated with binormal vectors on each Path3D curve point.\r\n * @returns an array populated with binormal vectors on each Path3D curve point.\r\n */\r\n public getBinormals(): Vector3[] {\r\n return this._binormals;\r\n }\r\n\r\n /**\r\n * Returns an array populated with distances (float) of the i-th point from the first curve point.\r\n * @returns an array populated with distances (float) of the i-th point from the first curve point.\r\n */\r\n public getDistances(): number[] {\r\n return this._distances;\r\n }\r\n\r\n /**\r\n * Returns an interpolated point along this path\r\n * @param position the position of the point along this path, from 0.0 to 1.0\r\n * @returns a new Vector3 as the point\r\n */\r\n public getPointAt(position: number): Vector3 {\r\n return this._updatePointAtData(position).point;\r\n }\r\n\r\n /**\r\n * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path.\r\n * @param position the position of the point along this path, from 0.0 to 1.0\r\n * @param interpolated (optional, default false) : boolean, if true returns an interpolated tangent instead of the tangent of the previous path point.\r\n * @returns a tangent vector corresponding to the interpolated Path3D curve point, if not interpolated, the tangent is taken from the precomputed tangents array.\r\n */\r\n public getTangentAt(position: number, interpolated = false): Vector3 {\r\n this._updatePointAtData(position, interpolated);\r\n return interpolated ? Vector3.TransformCoordinates(Vector3.Forward(), this._pointAtData.interpolationMatrix) : this._tangents[this._pointAtData.previousPointArrayIndex];\r\n }\r\n\r\n /**\r\n * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path.\r\n * @param position the position of the point along this path, from 0.0 to 1.0\r\n * @param interpolated (optional, default false) : boolean, if true returns an interpolated normal instead of the normal of the previous path point.\r\n * @returns a normal vector corresponding to the interpolated Path3D curve point, if not interpolated, the normal is taken from the precomputed normals array.\r\n */\r\n public getNormalAt(position: number, interpolated = false): Vector3 {\r\n this._updatePointAtData(position, interpolated);\r\n return interpolated ? Vector3.TransformCoordinates(Vector3.Right(), this._pointAtData.interpolationMatrix) : this._normals[this._pointAtData.previousPointArrayIndex];\r\n }\r\n\r\n /**\r\n * Returns the binormal vector of an interpolated Path3D curve point at the specified position along this path.\r\n * @param position the position of the point along this path, from 0.0 to 1.0\r\n * @param interpolated (optional, default false) : boolean, if true returns an interpolated binormal instead of the binormal of the previous path point.\r\n * @returns a binormal vector corresponding to the interpolated Path3D curve point, if not interpolated, the binormal is taken from the precomputed binormals array.\r\n */\r\n public getBinormalAt(position: number, interpolated = false): Vector3 {\r\n this._updatePointAtData(position, interpolated);\r\n return interpolated ? Vector3.TransformCoordinates(Vector3.UpReadOnly, this._pointAtData.interpolationMatrix) : this._binormals[this._pointAtData.previousPointArrayIndex];\r\n }\r\n\r\n /**\r\n * Returns the distance (float) of an interpolated Path3D curve point at the specified position along this path.\r\n * @param position the position of the point along this path, from 0.0 to 1.0\r\n * @returns the distance of the interpolated Path3D curve point at the specified position along this path.\r\n */\r\n public getDistanceAt(position: number): number {\r\n return this.length() * position;\r\n }\r\n\r\n /**\r\n * Returns the array index of the previous point of an interpolated point along this path\r\n * @param position the position of the point to interpolate along this path, from 0.0 to 1.0\r\n * @returns the array index\r\n */\r\n public getPreviousPointIndexAt(position: number) {\r\n this._updatePointAtData(position);\r\n return this._pointAtData.previousPointArrayIndex;\r\n }\r\n\r\n /**\r\n * Returns the position of an interpolated point relative to the two path points it lies between, from 0.0 (point A) to 1.0 (point B)\r\n * @param position the position of the point to interpolate along this path, from 0.0 to 1.0\r\n * @returns the sub position\r\n */\r\n public getSubPositionAt(position: number) {\r\n this._updatePointAtData(position);\r\n return this._pointAtData.subPosition;\r\n }\r\n\r\n /**\r\n * Returns the position of the closest virtual point on this path to an arbitrary Vector3, from 0.0 to 1.0\r\n * @param target the vector of which to get the closest position to\r\n * @returns the position of the closest virtual point on this path to the target vector\r\n */\r\n public getClosestPositionTo(target: Vector3) {\r\n let smallestDistance = Number.MAX_VALUE;\r\n let closestPosition = 0.0;\r\n for (let i = 0; i < this._curve.length - 1; i++) {\r\n const point = this._curve[i + 0];\r\n const tangent = this._curve[i + 1].subtract(point).normalize();\r\n const subLength = this._distances[i + 1] - this._distances[i + 0];\r\n const subPosition = Math.min((Math.max(Vector3.Dot(tangent, target.subtract(point).normalize()), 0.0) * Vector3.Distance(point, target)) / subLength, 1.0);\r\n const distance = Vector3.Distance(point.add(tangent.scale(subPosition * subLength)), target);\r\n\r\n if (distance < smallestDistance) {\r\n smallestDistance = distance;\r\n closestPosition = (this._distances[i + 0] + subLength * subPosition) / this.length();\r\n }\r\n }\r\n return closestPosition;\r\n }\r\n\r\n /**\r\n * Returns a sub path (slice) of this path\r\n * @param start the position of the fist path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values\r\n * @param end the position of the last path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values\r\n * @returns a sub path (slice) of this path\r\n */\r\n public slice(start: number = 0.0, end: number = 1.0) {\r\n if (start < 0.0) {\r\n start = 1 - ((start * -1.0) % 1.0);\r\n }\r\n if (end < 0.0) {\r\n end = 1 - ((end * -1.0) % 1.0);\r\n }\r\n if (start > end) {\r\n const _start = start;\r\n start = end;\r\n end = _start;\r\n }\r\n const curvePoints = this.getCurve();\r\n\r\n const startPoint = this.getPointAt(start);\r\n let startIndex = this.getPreviousPointIndexAt(start);\r\n\r\n const endPoint = this.getPointAt(end);\r\n const endIndex = this.getPreviousPointIndexAt(end) + 1;\r\n\r\n const slicePoints: Vector3[] = [];\r\n if (start !== 0.0) {\r\n startIndex++;\r\n slicePoints.push(startPoint);\r\n }\r\n\r\n slicePoints.push(...curvePoints.slice(startIndex, endIndex));\r\n if (end !== 1.0 || start === 1.0) {\r\n slicePoints.push(endPoint);\r\n }\r\n return new Path3D(slicePoints, this.getNormalAt(start), this._raw, this._alignTangentsWithPath);\r\n }\r\n\r\n /**\r\n * Forces the Path3D tangent, normal, binormal and distance recomputation.\r\n * @param path path which all values are copied into the curves points\r\n * @param firstNormal which should be projected onto the curve\r\n * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path\r\n * @returns the same object updated.\r\n */\r\n public update(path: Vector3[], firstNormal: Nullable = null, alignTangentsWithPath = false): Path3D {\r\n for (let p = 0; p < path.length; p++) {\r\n this._curve[p].x = path[p].x;\r\n this._curve[p].y = path[p].y;\r\n this._curve[p].z = path[p].z;\r\n }\r\n this._compute(firstNormal, alignTangentsWithPath);\r\n return this;\r\n }\r\n\r\n // private function compute() : computes tangents, normals and binormals\r\n private _compute(firstNormal: Nullable, alignTangentsWithPath = false): void {\r\n const l = this._curve.length;\r\n\r\n if (l < 2) {\r\n return;\r\n }\r\n\r\n // first and last tangents\r\n this._tangents[0] = this._getFirstNonNullVector(0);\r\n if (!this._raw) {\r\n this._tangents[0].normalize();\r\n }\r\n this._tangents[l - 1] = this._curve[l - 1].subtract(this._curve[l - 2]);\r\n if (!this._raw) {\r\n this._tangents[l - 1].normalize();\r\n }\r\n\r\n // normals and binormals at first point : arbitrary vector with _normalVector()\r\n const tg0 = this._tangents[0];\r\n const pp0 = this._normalVector(tg0, firstNormal);\r\n this._normals[0] = pp0;\r\n if (!this._raw) {\r\n this._normals[0].normalize();\r\n }\r\n this._binormals[0] = Vector3.Cross(tg0, this._normals[0]);\r\n if (!this._raw) {\r\n this._binormals[0].normalize();\r\n }\r\n this._distances[0] = 0.0;\r\n\r\n // normals and binormals : next points\r\n let prev: Vector3; // previous vector (segment)\r\n let cur: Vector3; // current vector (segment)\r\n let curTang: Vector3; // current tangent\r\n // previous normal\r\n let prevNor: Vector3; // previous normal\r\n let prevBinor: Vector3; // previous binormal\r\n\r\n for (let i = 1; i < l; i++) {\r\n // tangents\r\n prev = this._getLastNonNullVector(i);\r\n if (i < l - 1) {\r\n cur = this._getFirstNonNullVector(i);\r\n this._tangents[i] = alignTangentsWithPath ? cur : prev.add(cur);\r\n this._tangents[i].normalize();\r\n }\r\n this._distances[i] = this._distances[i - 1] + this._curve[i].subtract(this._curve[i - 1]).length();\r\n\r\n // normals and binormals\r\n // http://www.cs.cmu.edu/afs/andrew/scs/cs/15-462/web/old/asst2camera.html\r\n curTang = this._tangents[i];\r\n prevBinor = this._binormals[i - 1];\r\n this._normals[i] = Vector3.Cross(prevBinor, curTang);\r\n if (!this._raw) {\r\n if (this._normals[i].length() === 0) {\r\n prevNor = this._normals[i - 1];\r\n this._normals[i] = prevNor.clone();\r\n } else {\r\n this._normals[i].normalize();\r\n }\r\n }\r\n this._binormals[i] = Vector3.Cross(curTang, this._normals[i]);\r\n if (!this._raw) {\r\n this._binormals[i].normalize();\r\n }\r\n }\r\n this._pointAtData.id = NaN;\r\n }\r\n\r\n // private function getFirstNonNullVector(index)\r\n // returns the first non null vector from index : curve[index + N].subtract(curve[index])\r\n private _getFirstNonNullVector(index: number): Vector3 {\r\n let i = 1;\r\n let nNVector: Vector3 = this._curve[index + i].subtract(this._curve[index]);\r\n while (nNVector.length() === 0 && index + i + 1 < this._curve.length) {\r\n i++;\r\n nNVector = this._curve[index + i].subtract(this._curve[index]);\r\n }\r\n return nNVector;\r\n }\r\n\r\n // private function getLastNonNullVector(index)\r\n // returns the last non null vector from index : curve[index].subtract(curve[index - N])\r\n private _getLastNonNullVector(index: number): Vector3 {\r\n let i = 1;\r\n let nLVector: Vector3 = this._curve[index].subtract(this._curve[index - i]);\r\n while (nLVector.length() === 0 && index > i + 1) {\r\n i++;\r\n nLVector = this._curve[index].subtract(this._curve[index - i]);\r\n }\r\n return nLVector;\r\n }\r\n\r\n // private function normalVector(v0, vt, va) :\r\n // returns an arbitrary point in the plane defined by the point v0 and the vector vt orthogonal to this plane\r\n // if va is passed, it returns the va projection on the plane orthogonal to vt at the point v0\r\n private _normalVector(vt: Vector3, va: Nullable): Vector3 {\r\n let normal0: Vector3;\r\n let tgl = vt.length();\r\n if (tgl === 0.0) {\r\n tgl = 1.0;\r\n }\r\n\r\n if (va === undefined || va === null) {\r\n let point: Vector3;\r\n if (!Scalar.WithinEpsilon(Math.abs(vt.y) / tgl, 1.0, Epsilon)) {\r\n // search for a point in the plane\r\n point = new Vector3(0.0, -1.0, 0.0);\r\n } else if (!Scalar.WithinEpsilon(Math.abs(vt.x) / tgl, 1.0, Epsilon)) {\r\n point = new Vector3(1.0, 0.0, 0.0);\r\n } else if (!Scalar.WithinEpsilon(Math.abs(vt.z) / tgl, 1.0, Epsilon)) {\r\n point = new Vector3(0.0, 0.0, 1.0);\r\n } else {\r\n point = Vector3.Zero();\r\n }\r\n normal0 = Vector3.Cross(vt, point);\r\n } else {\r\n normal0 = Vector3.Cross(vt, va);\r\n Vector3.CrossToRef(normal0, vt, normal0);\r\n }\r\n normal0.normalize();\r\n return normal0;\r\n }\r\n\r\n /**\r\n * Updates the point at data for an interpolated point along this curve\r\n * @param position the position of the point along this curve, from 0.0 to 1.0\r\n * @param interpolateTNB\r\n * @interpolateTNB whether to compute the interpolated tangent, normal and binormal\r\n * @returns the (updated) point at data\r\n */\r\n private _updatePointAtData(position: number, interpolateTNB: boolean = false) {\r\n // set an id for caching the result\r\n if (this._pointAtData.id === position) {\r\n if (!this._pointAtData.interpolateReady) {\r\n this._updateInterpolationMatrix();\r\n }\r\n return this._pointAtData;\r\n } else {\r\n this._pointAtData.id = position;\r\n }\r\n const curvePoints = this.getPoints();\r\n\r\n // clamp position between 0.0 and 1.0\r\n if (position <= 0.0) {\r\n return this._setPointAtData(0.0, 0.0, curvePoints[0], 0, interpolateTNB);\r\n } else if (position >= 1.0) {\r\n return this._setPointAtData(1.0, 1.0, curvePoints[curvePoints.length - 1], curvePoints.length - 1, interpolateTNB);\r\n }\r\n\r\n let previousPoint: Vector3 = curvePoints[0];\r\n let currentPoint: Vector3;\r\n let currentLength = 0.0;\r\n const targetLength = position * this.length();\r\n\r\n for (let i = 1; i < curvePoints.length; i++) {\r\n currentPoint = curvePoints[i];\r\n const distance = Vector3.Distance(previousPoint, currentPoint);\r\n currentLength += distance;\r\n if (currentLength === targetLength) {\r\n return this._setPointAtData(position, 1.0, currentPoint, i, interpolateTNB);\r\n } else if (currentLength > targetLength) {\r\n const toLength = currentLength - targetLength;\r\n const diff = toLength / distance;\r\n const dir = previousPoint.subtract(currentPoint);\r\n const point = currentPoint.add(dir.scaleInPlace(diff));\r\n return this._setPointAtData(position, 1 - diff, point, i - 1, interpolateTNB);\r\n }\r\n previousPoint = currentPoint;\r\n }\r\n return this._pointAtData;\r\n }\r\n\r\n /**\r\n * Updates the point at data from the specified parameters\r\n * @param position where along the path the interpolated point is, from 0.0 to 1.0\r\n * @param subPosition\r\n * @param point the interpolated point\r\n * @param parentIndex the index of an existing curve point that is on, or else positionally the first behind, the interpolated point\r\n * @param interpolateTNB whether to compute the interpolated tangent, normal and binormal\r\n * @returns the (updated) point at data\r\n */\r\n private _setPointAtData(position: number, subPosition: number, point: Vector3, parentIndex: number, interpolateTNB: boolean) {\r\n this._pointAtData.point = point;\r\n this._pointAtData.position = position;\r\n this._pointAtData.subPosition = subPosition;\r\n this._pointAtData.previousPointArrayIndex = parentIndex;\r\n this._pointAtData.interpolateReady = interpolateTNB;\r\n\r\n if (interpolateTNB) {\r\n this._updateInterpolationMatrix();\r\n }\r\n return this._pointAtData;\r\n }\r\n\r\n /**\r\n * Updates the point at interpolation matrix for the tangents, normals and binormals\r\n */\r\n private _updateInterpolationMatrix() {\r\n this._pointAtData.interpolationMatrix = Matrix.Identity();\r\n const parentIndex = this._pointAtData.previousPointArrayIndex;\r\n\r\n if (parentIndex !== this._tangents.length - 1) {\r\n const index = parentIndex + 1;\r\n\r\n const tangentFrom = this._tangents[parentIndex].clone();\r\n const normalFrom = this._normals[parentIndex].clone();\r\n const binormalFrom = this._binormals[parentIndex].clone();\r\n\r\n const tangentTo = this._tangents[index].clone();\r\n const normalTo = this._normals[index].clone();\r\n const binormalTo = this._binormals[index].clone();\r\n\r\n const quatFrom = Quaternion.RotationQuaternionFromAxis(normalFrom, binormalFrom, tangentFrom);\r\n const quatTo = Quaternion.RotationQuaternionFromAxis(normalTo, binormalTo, tangentTo);\r\n const quatAt = Quaternion.Slerp(quatFrom, quatTo, this._pointAtData.subPosition);\r\n\r\n quatAt.toRotationMatrix(this._pointAtData.interpolationMatrix);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * A Curve3 object is a logical object, so not a mesh, to handle curves in the 3D geometric space.\r\n * A Curve3 is designed from a series of successive Vector3.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves\r\n */\r\nexport class Curve3 {\r\n private _points: Vector3[];\r\n private _length: number = 0.0;\r\n\r\n /**\r\n * Returns a Curve3 object along a Quadratic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#quadratic-bezier-curve\r\n * @param v0 (Vector3) the origin point of the Quadratic Bezier\r\n * @param v1 (Vector3) the control point\r\n * @param v2 (Vector3) the end point of the Quadratic Bezier\r\n * @param nbPoints (integer) the wanted number of points in the curve\r\n * @returns the created Curve3\r\n */\r\n public static CreateQuadraticBezier(v0: DeepImmutable, v1: DeepImmutable, v2: DeepImmutable, nbPoints: number): Curve3 {\r\n nbPoints = nbPoints > 2 ? nbPoints : 3;\r\n const bez: Vector3[] = [];\r\n const equation = (t: number, val0: number, val1: number, val2: number) => {\r\n const res = (1.0 - t) * (1.0 - t) * val0 + 2.0 * t * (1.0 - t) * val1 + t * t * val2;\r\n return res;\r\n };\r\n for (let i = 0; i <= nbPoints; i++) {\r\n bez.push(new Vector3(equation(i / nbPoints, v0.x, v1.x, v2.x), equation(i / nbPoints, v0.y, v1.y, v2.y), equation(i / nbPoints, v0.z, v1.z, v2.z)));\r\n }\r\n return new Curve3(bez);\r\n }\r\n\r\n /**\r\n * Returns a Curve3 object along a Cubic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#cubic-bezier-curve\r\n * @param v0 (Vector3) the origin point of the Cubic Bezier\r\n * @param v1 (Vector3) the first control point\r\n * @param v2 (Vector3) the second control point\r\n * @param v3 (Vector3) the end point of the Cubic Bezier\r\n * @param nbPoints (integer) the wanted number of points in the curve\r\n * @returns the created Curve3\r\n */\r\n public static CreateCubicBezier(v0: DeepImmutable, v1: DeepImmutable, v2: DeepImmutable, v3: DeepImmutable, nbPoints: number): Curve3 {\r\n nbPoints = nbPoints > 3 ? nbPoints : 4;\r\n const bez: Vector3[] = [];\r\n const equation = (t: number, val0: number, val1: number, val2: number, val3: number) => {\r\n const res = (1.0 - t) * (1.0 - t) * (1.0 - t) * val0 + 3.0 * t * (1.0 - t) * (1.0 - t) * val1 + 3.0 * t * t * (1.0 - t) * val2 + t * t * t * val3;\r\n return res;\r\n };\r\n for (let i = 0; i <= nbPoints; i++) {\r\n bez.push(new Vector3(equation(i / nbPoints, v0.x, v1.x, v2.x, v3.x), equation(i / nbPoints, v0.y, v1.y, v2.y, v3.y), equation(i / nbPoints, v0.z, v1.z, v2.z, v3.z)));\r\n }\r\n return new Curve3(bez);\r\n }\r\n\r\n /**\r\n * Returns a Curve3 object along a Hermite Spline curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#hermite-spline\r\n * @param p1 (Vector3) the origin point of the Hermite Spline\r\n * @param t1 (Vector3) the tangent vector at the origin point\r\n * @param p2 (Vector3) the end point of the Hermite Spline\r\n * @param t2 (Vector3) the tangent vector at the end point\r\n * @param nSeg (integer) the number of curve segments or nSeg + 1 points in the array\r\n * @returns the created Curve3\r\n */\r\n public static CreateHermiteSpline(p1: DeepImmutable, t1: DeepImmutable, p2: DeepImmutable, t2: DeepImmutable, nSeg: number): Curve3 {\r\n const hermite: Vector3[] = [];\r\n const step = 1.0 / nSeg;\r\n for (let i = 0; i <= nSeg; i++) {\r\n hermite.push(Vector3.Hermite(p1, t1, p2, t2, i * step));\r\n }\r\n return new Curve3(hermite);\r\n }\r\n\r\n /**\r\n * Returns a Curve3 object along a CatmullRom Spline curve :\r\n * @param points (array of Vector3) the points the spline must pass through. At least, four points required\r\n * @param nbPoints (integer) the wanted number of points between each curve control points\r\n * @param closed (boolean) optional with default false, when true forms a closed loop from the points\r\n * @returns the created Curve3\r\n */\r\n public static CreateCatmullRomSpline(points: DeepImmutable, nbPoints: number, closed?: boolean): Curve3 {\r\n const catmullRom: Vector3[] = [];\r\n const step = 1.0 / nbPoints;\r\n let amount = 0.0;\r\n if (closed) {\r\n const pointsCount = points.length;\r\n for (let i = 0; i < pointsCount; i++) {\r\n amount = 0;\r\n for (let c = 0; c < nbPoints; c++) {\r\n catmullRom.push(\r\n Vector3.CatmullRom(points[i % pointsCount], points[(i + 1) % pointsCount], points[(i + 2) % pointsCount], points[(i + 3) % pointsCount], amount)\r\n );\r\n amount += step;\r\n }\r\n }\r\n catmullRom.push(catmullRom[0]);\r\n } else {\r\n const totalPoints: Vector3[] = [];\r\n totalPoints.push(points[0].clone());\r\n Array.prototype.push.apply(totalPoints, points);\r\n totalPoints.push(points[points.length - 1].clone());\r\n let i = 0;\r\n for (; i < totalPoints.length - 3; i++) {\r\n amount = 0;\r\n for (let c = 0; c < nbPoints; c++) {\r\n catmullRom.push(Vector3.CatmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount));\r\n amount += step;\r\n }\r\n }\r\n i--;\r\n catmullRom.push(Vector3.CatmullRom(totalPoints[i], totalPoints[i + 1], totalPoints[i + 2], totalPoints[i + 3], amount));\r\n }\r\n return new Curve3(catmullRom);\r\n }\r\n\r\n /**\r\n * Returns a Curve3 object along an arc through three vector3 points:\r\n * The three points should not be colinear. When they are the Curve3 is empty.\r\n * @param first (Vector3) the first point the arc must pass through.\r\n * @param second (Vector3) the second point the arc must pass through.\r\n * @param third (Vector3) the third point the arc must pass through.\r\n * @param steps (number) the larger the number of steps the more detailed the arc.\r\n * @param closed (boolean) optional with default false, when true forms the chord from the first and third point\r\n * @param fullCircle Circle (boolean) optional with default false, when true forms the complete circle through the three points\r\n * @returns the created Curve3\r\n */\r\n public static ArcThru3Points(first: Vector3, second: Vector3, third: Vector3, steps: number = 32, closed: boolean = false, fullCircle: boolean = false): Curve3 {\r\n const arc: Vector3[] = [];\r\n const vec1 = second.subtract(first);\r\n const vec2 = third.subtract(second);\r\n const vec3 = first.subtract(third);\r\n const zAxis = Vector3.Cross(vec1, vec2);\r\n const len4 = zAxis.length();\r\n if (len4 < Math.pow(10, -8)) {\r\n return new Curve3(arc); // colinear points arc is empty\r\n }\r\n const len1_sq = vec1.lengthSquared();\r\n const len2_sq = vec2.lengthSquared();\r\n const len3_sq = vec3.lengthSquared();\r\n const len4_sq = zAxis.lengthSquared();\r\n const len1 = vec1.length();\r\n const len2 = vec2.length();\r\n const len3 = vec3.length();\r\n const radius = (0.5 * len1 * len2 * len3) / len4;\r\n const dot1 = Vector3.Dot(vec1, vec3);\r\n const dot2 = Vector3.Dot(vec1, vec2);\r\n const dot3 = Vector3.Dot(vec2, vec3);\r\n const a = (-0.5 * len2_sq * dot1) / len4_sq;\r\n const b = (-0.5 * len3_sq * dot2) / len4_sq;\r\n const c = (-0.5 * len1_sq * dot3) / len4_sq;\r\n const center = first.scale(a).add(second.scale(b)).add(third.scale(c));\r\n const radiusVec = first.subtract(center);\r\n const xAxis = radiusVec.normalize();\r\n const yAxis = Vector3.Cross(zAxis, xAxis).normalize();\r\n if (fullCircle) {\r\n const dStep = (2 * Math.PI) / steps;\r\n for (let theta = 0; theta <= 2 * Math.PI; theta += dStep) {\r\n arc.push(center.add(xAxis.scale(radius * Math.cos(theta)).add(yAxis.scale(radius * Math.sin(theta)))));\r\n }\r\n arc.push(first);\r\n } else {\r\n const dStep = 1 / steps;\r\n let theta = 0;\r\n let point = Vector3.Zero();\r\n do {\r\n point = center.add(xAxis.scale(radius * Math.cos(theta)).add(yAxis.scale(radius * Math.sin(theta))));\r\n arc.push(point);\r\n theta += dStep;\r\n } while (!point.equalsWithEpsilon(third, radius * dStep * 1.1));\r\n arc.push(third);\r\n if (closed) {\r\n arc.push(first);\r\n }\r\n }\r\n return new Curve3(arc);\r\n }\r\n\r\n /**\r\n * A Curve3 object is a logical object, so not a mesh, to handle curves in the 3D geometric space.\r\n * A Curve3 is designed from a series of successive Vector3.\r\n * Tuto : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#curve3-object\r\n * @param points points which make up the curve\r\n */\r\n constructor(points: Vector3[]) {\r\n this._points = points;\r\n this._length = this._computeLength(points);\r\n }\r\n\r\n /**\r\n * @returns the Curve3 stored array of successive Vector3\r\n */\r\n public getPoints() {\r\n return this._points;\r\n }\r\n\r\n /**\r\n * @returns the computed length (float) of the curve.\r\n */\r\n public length() {\r\n return this._length;\r\n }\r\n\r\n /**\r\n * Returns a new instance of Curve3 object : var curve = curveA.continue(curveB);\r\n * This new Curve3 is built by translating and sticking the curveB at the end of the curveA.\r\n * curveA and curveB keep unchanged.\r\n * @param curve the curve to continue from this curve\r\n * @returns the newly constructed curve\r\n */\r\n public continue(curve: DeepImmutable): Curve3 {\r\n const lastPoint = this._points[this._points.length - 1];\r\n const continuedPoints = this._points.slice();\r\n const curvePoints = curve.getPoints();\r\n for (let i = 1; i < curvePoints.length; i++) {\r\n continuedPoints.push(curvePoints[i].subtract(curvePoints[0]).add(lastPoint));\r\n }\r\n const continuedCurve = new Curve3(continuedPoints);\r\n return continuedCurve;\r\n }\r\n\r\n private _computeLength(path: DeepImmutable): number {\r\n let l = 0;\r\n for (let i = 1; i < path.length; i++) {\r\n l += path[i].subtract(path[i - 1]).length();\r\n }\r\n return l;\r\n }\r\n}\r\n", "import { Vector3, Vector2 } from \"./math.vector\";\r\n\r\n/**\r\n * Contains position and normal vectors for a vertex\r\n */\r\nexport class PositionNormalVertex {\r\n /**\r\n * Creates a PositionNormalVertex\r\n * @param position the position of the vertex (defaut: 0,0,0)\r\n * @param normal the normal of the vertex (defaut: 0,1,0)\r\n */\r\n constructor(\r\n /** the position of the vertex (defaut: 0,0,0) */\r\n public position: Vector3 = Vector3.Zero(),\r\n /** the normal of the vertex (defaut: 0,1,0) */\r\n public normal: Vector3 = Vector3.Up()\r\n ) {}\r\n\r\n /**\r\n * Clones the PositionNormalVertex\r\n * @returns the cloned PositionNormalVertex\r\n */\r\n public clone(): PositionNormalVertex {\r\n return new PositionNormalVertex(this.position.clone(), this.normal.clone());\r\n }\r\n}\r\n\r\n/**\r\n * Contains position, normal and uv vectors for a vertex\r\n */\r\nexport class PositionNormalTextureVertex {\r\n /**\r\n * Creates a PositionNormalTextureVertex\r\n * @param position the position of the vertex (defaut: 0,0,0)\r\n * @param normal the normal of the vertex (defaut: 0,1,0)\r\n * @param uv the uv of the vertex (default: 0,0)\r\n */\r\n constructor(\r\n /** the position of the vertex (defaut: 0,0,0) */\r\n public position: Vector3 = Vector3.Zero(),\r\n /** the normal of the vertex (defaut: 0,1,0) */\r\n public normal: Vector3 = Vector3.Up(),\r\n /** the uv of the vertex (default: 0,0) */\r\n public uv: Vector2 = Vector2.Zero()\r\n ) {}\r\n /**\r\n * Clones the PositionNormalTextureVertex\r\n * @returns the cloned PositionNormalTextureVertex\r\n */\r\n public clone(): PositionNormalTextureVertex {\r\n return new PositionNormalTextureVertex(this.position.clone(), this.normal.clone(), this.uv.clone());\r\n }\r\n}\r\n", "/**\r\n * Enum defining the type of animations supported by InputBlock\r\n */\r\nexport enum AnimatedInputBlockTypes {\r\n /** No animation */\r\n None,\r\n /** Time based animation (is incremented by 0.6 each second). Will only work for floats */\r\n Time,\r\n /** Time elapsed (in seconds) since the engine was initialized. Will only work for floats */\r\n RealTime,\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport { NodeMaterialBlockConnectionPointMode } from \"../../Enums/nodeMaterialBlockConnectionPointMode\";\r\nimport { NodeMaterialSystemValues } from \"../../Enums/nodeMaterialSystemValues\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport type { Effect } from \"../../../../Materials/effect\";\r\nimport { Matrix, Vector2, Vector3, Vector4 } from \"../../../../Maths/math.vector\";\r\nimport type { Scene } from \"../../../../scene\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport { GetClass, RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { Color3, Color4, TmpColors } from \"../../../../Maths/math\";\r\nimport { AnimatedInputBlockTypes } from \"./animatedInputBlockTypes\";\r\nimport { Observable } from \"../../../../Misc/observable\";\r\nimport type { NodeMaterial } from \"../../nodeMaterial\";\r\nimport { PrecisionDate } from \"core/Misc/precisionDate\";\r\n\r\nconst remapAttributeName: { [name: string]: string } = {\r\n position2d: \"position\",\r\n particle_uv: \"vUV\",\r\n particle_color: \"vColor\",\r\n particle_texturemask: \"textureMask\",\r\n particle_positionw: \"vPositionW\",\r\n};\r\n\r\nconst attributeInFragmentOnly: { [name: string]: boolean } = {\r\n particle_uv: true,\r\n particle_color: true,\r\n particle_texturemask: true,\r\n particle_positionw: true,\r\n};\r\n\r\nconst attributeAsUniform: { [name: string]: boolean } = {\r\n particle_texturemask: true,\r\n};\r\n\r\n/**\r\n * Block used to expose an input value\r\n */\r\nexport class InputBlock extends NodeMaterialBlock {\r\n private _mode = NodeMaterialBlockConnectionPointMode.Undefined;\r\n private _associatedVariableName: string;\r\n private _storedValue: any;\r\n private _valueCallback: () => any;\r\n private _type: NodeMaterialBlockConnectionPointTypes;\r\n private _animationType = AnimatedInputBlockTypes.None;\r\n\r\n /** Gets or set a value used to limit the range of float values */\r\n public min: number = 0;\r\n\r\n /** Gets or set a value used to limit the range of float values */\r\n public max: number = 0;\r\n\r\n /** Gets or set a value indicating that this input can only get 0 and 1 values */\r\n public isBoolean: boolean = false;\r\n\r\n /** Gets or sets a value used by the Node Material editor to determine how to configure the current value if it is a matrix */\r\n public matrixMode: number = 0;\r\n\r\n /** @internal */\r\n public _systemValue: Nullable = null;\r\n\r\n /** Gets or sets a boolean indicating that the value of this input will not change after a build */\r\n public isConstant = false;\r\n\r\n /** Gets or sets the group to use to display this block in the Inspector */\r\n public groupInInspector = \"\";\r\n\r\n /** Gets an observable raised when the value is changed */\r\n public onValueChangedObservable = new Observable();\r\n\r\n /** Gets or sets a boolean indicating if content needs to be converted to gamma space (for color3/4 only) */\r\n public convertToGammaSpace = false;\r\n\r\n /** Gets or sets a boolean indicating if content needs to be converted to linear space (for color3/4 only) */\r\n public convertToLinearSpace = false;\r\n\r\n /**\r\n * Gets or sets the connection point type (default is float)\r\n */\r\n public get type(): NodeMaterialBlockConnectionPointTypes {\r\n if (this._type === NodeMaterialBlockConnectionPointTypes.AutoDetect) {\r\n if (this.isUniform && this.value != null) {\r\n if (!isNaN(this.value)) {\r\n this._type = NodeMaterialBlockConnectionPointTypes.Float;\r\n return this._type;\r\n }\r\n\r\n switch (this.value.getClassName()) {\r\n case \"Vector2\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector2;\r\n return this._type;\r\n case \"Vector3\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector3;\r\n return this._type;\r\n case \"Vector4\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector4;\r\n return this._type;\r\n case \"Color3\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Color3;\r\n return this._type;\r\n case \"Color4\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Color4;\r\n return this._type;\r\n case \"Matrix\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Matrix;\r\n return this._type;\r\n }\r\n }\r\n\r\n if (this.isAttribute) {\r\n switch (this.name) {\r\n case \"position\":\r\n case \"normal\":\r\n case \"particle_positionw\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector3;\r\n return this._type;\r\n case \"uv\":\r\n case \"uv2\":\r\n case \"uv3\":\r\n case \"uv4\":\r\n case \"uv5\":\r\n case \"uv6\":\r\n case \"position2d\":\r\n case \"particle_uv\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector2;\r\n return this._type;\r\n case \"matricesIndices\":\r\n case \"matricesWeights\":\r\n case \"matricesIndicesExtra\":\r\n case \"matricesWeightsExtra\":\r\n case \"world0\":\r\n case \"world1\":\r\n case \"world2\":\r\n case \"world3\":\r\n case \"tangent\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector4;\r\n return this._type;\r\n case \"color\":\r\n case \"instanceColor\":\r\n case \"particle_color\":\r\n case \"particle_texturemask\":\r\n this._type = NodeMaterialBlockConnectionPointTypes.Color4;\r\n return this._type;\r\n }\r\n }\r\n\r\n if (this.isSystemValue) {\r\n switch (this._systemValue) {\r\n case NodeMaterialSystemValues.World:\r\n case NodeMaterialSystemValues.WorldView:\r\n case NodeMaterialSystemValues.WorldViewProjection:\r\n case NodeMaterialSystemValues.View:\r\n case NodeMaterialSystemValues.ViewProjection:\r\n case NodeMaterialSystemValues.Projection:\r\n this._type = NodeMaterialBlockConnectionPointTypes.Matrix;\r\n return this._type;\r\n case NodeMaterialSystemValues.CameraPosition:\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector3;\r\n return this._type;\r\n case NodeMaterialSystemValues.FogColor:\r\n this._type = NodeMaterialBlockConnectionPointTypes.Color3;\r\n return this._type;\r\n case NodeMaterialSystemValues.DeltaTime:\r\n case NodeMaterialSystemValues.MaterialAlpha:\r\n this._type = NodeMaterialBlockConnectionPointTypes.Float;\r\n return this._type;\r\n case NodeMaterialSystemValues.CameraParameters:\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector4;\r\n return this._type;\r\n }\r\n }\r\n }\r\n\r\n return this._type;\r\n }\r\n\r\n /**\r\n * Creates a new InputBlock\r\n * @param name defines the block name\r\n * @param target defines the target of that block (Vertex by default)\r\n * @param type defines the type of the input (can be set to NodeMaterialBlockConnectionPointTypes.AutoDetect)\r\n */\r\n public constructor(name: string, target = NodeMaterialBlockTargets.Vertex, type: NodeMaterialBlockConnectionPointTypes = NodeMaterialBlockConnectionPointTypes.AutoDetect) {\r\n super(name, target, false);\r\n\r\n this._type = type;\r\n\r\n this.setDefaultValue();\r\n\r\n this.registerOutput(\"output\", type);\r\n }\r\n\r\n /**\r\n * Validates if a name is a reserve word.\r\n * @param newName the new name to be given to the node.\r\n * @returns false if the name is a reserve word, else true.\r\n */\r\n public validateBlockName(newName: string) {\r\n if (!this.isAttribute) {\r\n return super.validateBlockName(newName);\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Set the source of this connection point to a vertex attribute\r\n * @param attributeName defines the attribute name (position, uv, normal, etc...). If not specified it will take the connection point name\r\n * @returns the current connection point\r\n */\r\n public setAsAttribute(attributeName?: string): InputBlock {\r\n this._mode = NodeMaterialBlockConnectionPointMode.Attribute;\r\n if (attributeName) {\r\n this.name = attributeName;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the source of this connection point to a system value\r\n * @param value define the system value to use (world, view, etc...) or null to switch to manual value\r\n * @returns the current connection point\r\n */\r\n public setAsSystemValue(value: Nullable): InputBlock {\r\n this.systemValue = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets or sets the value of that point.\r\n * Please note that this value will be ignored if valueCallback is defined\r\n */\r\n public get value(): any {\r\n return this._storedValue;\r\n }\r\n\r\n public set value(value: any) {\r\n if (this.type === NodeMaterialBlockConnectionPointTypes.Float) {\r\n if (this.isBoolean) {\r\n value = value ? 1 : 0;\r\n } else if (this.min !== this.max) {\r\n value = Math.max(this.min, value);\r\n value = Math.min(this.max, value);\r\n }\r\n }\r\n\r\n this._storedValue = value;\r\n this._mode = NodeMaterialBlockConnectionPointMode.Uniform;\r\n\r\n this.onValueChangedObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Gets or sets a callback used to get the value of that point.\r\n * Please note that setting this value will force the connection point to ignore the value property\r\n */\r\n public get valueCallback(): () => any {\r\n return this._valueCallback;\r\n }\r\n\r\n public set valueCallback(value: () => any) {\r\n this._valueCallback = value;\r\n this._mode = NodeMaterialBlockConnectionPointMode.Uniform;\r\n }\r\n\r\n /**\r\n * Gets or sets the associated variable name in the shader\r\n */\r\n public get associatedVariableName(): string {\r\n return this._associatedVariableName;\r\n }\r\n\r\n public set associatedVariableName(value: string) {\r\n this._associatedVariableName = value;\r\n }\r\n\r\n /** Gets or sets the type of animation applied to the input */\r\n public get animationType() {\r\n return this._animationType;\r\n }\r\n\r\n public set animationType(value: AnimatedInputBlockTypes) {\r\n this._animationType = value;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this connection point not defined yet\r\n */\r\n public get isUndefined(): boolean {\r\n return this._mode === NodeMaterialBlockConnectionPointMode.Undefined;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this connection point is coming from an uniform.\r\n * In this case the connection point name must be the name of the uniform to use.\r\n * Can only be set on inputs\r\n */\r\n public get isUniform(): boolean {\r\n return this._mode === NodeMaterialBlockConnectionPointMode.Uniform;\r\n }\r\n\r\n public set isUniform(value: boolean) {\r\n this._mode = value ? NodeMaterialBlockConnectionPointMode.Uniform : NodeMaterialBlockConnectionPointMode.Undefined;\r\n this.associatedVariableName = \"\";\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this connection point is coming from an attribute.\r\n * In this case the connection point name must be the name of the attribute to use\r\n * Can only be set on inputs\r\n */\r\n public get isAttribute(): boolean {\r\n return this._mode === NodeMaterialBlockConnectionPointMode.Attribute;\r\n }\r\n\r\n public set isAttribute(value: boolean) {\r\n this._mode = value ? NodeMaterialBlockConnectionPointMode.Attribute : NodeMaterialBlockConnectionPointMode.Undefined;\r\n this.associatedVariableName = \"\";\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this connection point is generating a varying variable.\r\n * Can only be set on exit points\r\n */\r\n public get isVarying(): boolean {\r\n return this._mode === NodeMaterialBlockConnectionPointMode.Varying;\r\n }\r\n\r\n public set isVarying(value: boolean) {\r\n this._mode = value ? NodeMaterialBlockConnectionPointMode.Varying : NodeMaterialBlockConnectionPointMode.Undefined;\r\n this.associatedVariableName = \"\";\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the current connection point is a system value\r\n */\r\n public get isSystemValue(): boolean {\r\n return this._systemValue != null;\r\n }\r\n\r\n /**\r\n * Gets or sets the current well known value or null if not defined as a system value\r\n */\r\n public get systemValue(): Nullable {\r\n return this._systemValue;\r\n }\r\n\r\n public set systemValue(value: Nullable) {\r\n this._mode = NodeMaterialBlockConnectionPointMode.Uniform;\r\n this.associatedVariableName = \"\";\r\n this._systemValue = value;\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"InputBlock\";\r\n }\r\n\r\n /**\r\n * Animate the input if animationType !== None\r\n * @param scene defines the rendering scene\r\n */\r\n public animate(scene: Scene) {\r\n switch (this._animationType) {\r\n case AnimatedInputBlockTypes.Time: {\r\n if (this.type === NodeMaterialBlockConnectionPointTypes.Float) {\r\n this.value += scene.getAnimationRatio() * 0.01;\r\n }\r\n break;\r\n }\r\n case AnimatedInputBlockTypes.RealTime: {\r\n if (this.type === NodeMaterialBlockConnectionPointTypes.Float) {\r\n this.value = (PrecisionDate.Now - scene.getEngine().startTime) / 1000;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private _emitDefine(define: string): string {\r\n if (define[0] === \"!\") {\r\n return `#ifndef ${define.substring(1)}\\n`;\r\n }\r\n\r\n return `#ifdef ${define}\\n`;\r\n }\r\n\r\n public initialize() {\r\n this.associatedVariableName = \"\";\r\n }\r\n\r\n /**\r\n * Set the input block to its default value (based on its type)\r\n */\r\n public setDefaultValue() {\r\n switch (this.type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n this.value = 0;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n this.value = Vector2.Zero();\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n this.value = Vector3.Zero();\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n this.value = Vector4.Zero();\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n this.value = Color3.White();\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n this.value = new Color4(1, 1, 1, 1);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Matrix:\r\n this.value = Matrix.Identity();\r\n break;\r\n }\r\n }\r\n\r\n private _emitConstant(state: NodeMaterialBuildState) {\r\n switch (this.type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n return `${state._emitFloat(this.value)}`;\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n return `vec2(${this.value.x}, ${this.value.y})`;\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n return `vec3(${this.value.x}, ${this.value.y}, ${this.value.z})`;\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n return `vec4(${this.value.x}, ${this.value.y}, ${this.value.z}, ${this.value.w})`;\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n TmpColors.Color3[0].set(this.value.r, this.value.g, this.value.b);\r\n if (this.convertToGammaSpace) {\r\n TmpColors.Color3[0].toGammaSpaceToRef(TmpColors.Color3[0], state.sharedData.scene.getEngine().useExactSrgbConversions);\r\n }\r\n if (this.convertToLinearSpace) {\r\n TmpColors.Color3[0].toLinearSpaceToRef(TmpColors.Color3[0], state.sharedData.scene.getEngine().useExactSrgbConversions);\r\n }\r\n return `vec3(${TmpColors.Color3[0].r}, ${TmpColors.Color3[0].g}, ${TmpColors.Color3[0].b})`;\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n TmpColors.Color4[0].set(this.value.r, this.value.g, this.value.b, this.value.a);\r\n if (this.convertToGammaSpace) {\r\n TmpColors.Color4[0].toGammaSpaceToRef(TmpColors.Color4[0], state.sharedData.scene.getEngine().useExactSrgbConversions);\r\n }\r\n if (this.convertToLinearSpace) {\r\n TmpColors.Color4[0].toLinearSpaceToRef(TmpColors.Color4[0], state.sharedData.scene.getEngine().useExactSrgbConversions);\r\n }\r\n return `vec4(${TmpColors.Color4[0].r}, ${TmpColors.Color4[0].g}, ${TmpColors.Color4[0].b}, ${TmpColors.Color4[0].a})`;\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n /** @internal */\r\n public get _noContextSwitch(): boolean {\r\n return attributeInFragmentOnly[this.name];\r\n }\r\n\r\n private _emit(state: NodeMaterialBuildState, define?: string) {\r\n // Uniforms\r\n if (this.isUniform) {\r\n if (!this.associatedVariableName) {\r\n this.associatedVariableName = state._getFreeVariableName(\"u_\" + this.name);\r\n }\r\n\r\n if (this.isConstant) {\r\n if (state.constants.indexOf(this.associatedVariableName) !== -1) {\r\n return;\r\n }\r\n state.constants.push(this.associatedVariableName);\r\n state._constantDeclaration += this._declareOutput(this.output, state) + ` = ${this._emitConstant(state)};\\n`;\r\n return;\r\n }\r\n\r\n if (state.uniforms.indexOf(this.associatedVariableName) !== -1) {\r\n return;\r\n }\r\n\r\n state.uniforms.push(this.associatedVariableName);\r\n if (define) {\r\n state._uniformDeclaration += this._emitDefine(define);\r\n }\r\n state._uniformDeclaration += `uniform ${state._getGLType(this.type)} ${this.associatedVariableName};\\n`;\r\n if (define) {\r\n state._uniformDeclaration += `#endif\\n`;\r\n }\r\n\r\n // well known\r\n const hints = state.sharedData.hints;\r\n if (this._systemValue !== null && this._systemValue !== undefined) {\r\n switch (this._systemValue) {\r\n case NodeMaterialSystemValues.WorldView:\r\n hints.needWorldViewMatrix = true;\r\n break;\r\n case NodeMaterialSystemValues.WorldViewProjection:\r\n hints.needWorldViewProjectionMatrix = true;\r\n break;\r\n }\r\n } else {\r\n if (this._animationType !== AnimatedInputBlockTypes.None) {\r\n state.sharedData.animatedInputs.push(this);\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Attribute\r\n if (this.isAttribute) {\r\n this.associatedVariableName = remapAttributeName[this.name] ?? this.name;\r\n\r\n if (this.target === NodeMaterialBlockTargets.Vertex && state._vertexState) {\r\n // Attribute for fragment need to be carried over by varyings\r\n if (attributeInFragmentOnly[this.name]) {\r\n if (attributeAsUniform[this.name]) {\r\n state._emitUniformFromString(this.associatedVariableName, state._getGLType(this.type), define);\r\n } else {\r\n state._emitVaryingFromString(this.associatedVariableName, state._getGLType(this.type), define);\r\n }\r\n } else {\r\n this._emit(state._vertexState, define);\r\n }\r\n return;\r\n }\r\n\r\n if (state.attributes.indexOf(this.associatedVariableName) !== -1) {\r\n return;\r\n }\r\n\r\n state.attributes.push(this.associatedVariableName);\r\n\r\n if (attributeInFragmentOnly[this.name]) {\r\n if (attributeAsUniform[this.name]) {\r\n state._emitUniformFromString(this.associatedVariableName, state._getGLType(this.type), define);\r\n } else {\r\n state._emitVaryingFromString(this.associatedVariableName, state._getGLType(this.type), define);\r\n }\r\n } else {\r\n if (define) {\r\n state._attributeDeclaration += this._emitDefine(define);\r\n }\r\n state._attributeDeclaration += `attribute ${state._getGLType(this.type)} ${this.associatedVariableName};\\n`;\r\n if (define) {\r\n state._attributeDeclaration += `#endif\\n`;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _transmitWorld(effect: Effect, world: Matrix, worldView: Matrix, worldViewProjection: Matrix) {\r\n if (!this._systemValue) {\r\n return;\r\n }\r\n\r\n const variableName = this.associatedVariableName;\r\n switch (this._systemValue) {\r\n case NodeMaterialSystemValues.World:\r\n effect.setMatrix(variableName, world);\r\n break;\r\n case NodeMaterialSystemValues.WorldView:\r\n effect.setMatrix(variableName, worldView);\r\n break;\r\n case NodeMaterialSystemValues.WorldViewProjection:\r\n effect.setMatrix(variableName, worldViewProjection);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _transmit(effect: Effect, scene: Scene, material: NodeMaterial) {\r\n if (this.isAttribute) {\r\n return;\r\n }\r\n\r\n const variableName = this.associatedVariableName;\r\n if (this._systemValue) {\r\n switch (this._systemValue) {\r\n case NodeMaterialSystemValues.World:\r\n case NodeMaterialSystemValues.WorldView:\r\n case NodeMaterialSystemValues.WorldViewProjection:\r\n return;\r\n case NodeMaterialSystemValues.View:\r\n effect.setMatrix(variableName, scene.getViewMatrix());\r\n break;\r\n case NodeMaterialSystemValues.Projection:\r\n effect.setMatrix(variableName, scene.getProjectionMatrix());\r\n break;\r\n case NodeMaterialSystemValues.ViewProjection:\r\n effect.setMatrix(variableName, scene.getTransformMatrix());\r\n break;\r\n case NodeMaterialSystemValues.CameraPosition:\r\n scene.bindEyePosition(effect, variableName, true);\r\n break;\r\n case NodeMaterialSystemValues.FogColor:\r\n effect.setColor3(variableName, scene.fogColor);\r\n break;\r\n case NodeMaterialSystemValues.DeltaTime:\r\n effect.setFloat(variableName, scene.deltaTime / 1000.0);\r\n break;\r\n case NodeMaterialSystemValues.CameraParameters:\r\n if (scene.activeCamera) {\r\n effect.setFloat4(\r\n variableName,\r\n scene.getEngine().hasOriginBottomLeft ? -1 : 1,\r\n scene.activeCamera.minZ,\r\n scene.activeCamera.maxZ,\r\n 1 / scene.activeCamera.maxZ\r\n );\r\n }\r\n break;\r\n case NodeMaterialSystemValues.MaterialAlpha:\r\n effect.setFloat(variableName, material.alpha);\r\n break;\r\n }\r\n return;\r\n }\r\n\r\n const value = this._valueCallback ? this._valueCallback() : this._storedValue;\r\n\r\n if (value === null) {\r\n return;\r\n }\r\n\r\n switch (this.type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n effect.setFloat(variableName, value);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Int:\r\n effect.setInt(variableName, value);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n TmpColors.Color3[0].set(this.value.r, this.value.g, this.value.b);\r\n if (this.convertToGammaSpace) {\r\n TmpColors.Color3[0].toGammaSpaceToRef(TmpColors.Color3[0], scene.getEngine().useExactSrgbConversions);\r\n }\r\n if (this.convertToLinearSpace) {\r\n TmpColors.Color3[0].toLinearSpaceToRef(TmpColors.Color3[0], scene.getEngine().useExactSrgbConversions);\r\n }\r\n effect.setColor3(variableName, TmpColors.Color3[0]);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n TmpColors.Color4[0].set(this.value.r, this.value.g, this.value.b, this.value.a);\r\n if (this.convertToGammaSpace) {\r\n TmpColors.Color4[0].toGammaSpaceToRef(TmpColors.Color4[0], scene.getEngine().useExactSrgbConversions);\r\n }\r\n if (this.convertToLinearSpace) {\r\n TmpColors.Color4[0].toLinearSpaceToRef(TmpColors.Color4[0], scene.getEngine().useExactSrgbConversions);\r\n }\r\n effect.setDirectColor4(variableName, TmpColors.Color4[0]);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n effect.setVector2(variableName, value);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n effect.setVector3(variableName, value);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n effect.setVector4(variableName, value);\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Matrix:\r\n effect.setMatrix(variableName, value);\r\n break;\r\n }\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (this.isUniform || this.isSystemValue) {\r\n state.sharedData.inputBlocks.push(this);\r\n }\r\n\r\n this._emit(state);\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n const variableName = this._codeVariableName;\r\n\r\n if (this.isAttribute) {\r\n return super._dumpPropertiesCode() + `${variableName}.setAsAttribute(\"${this.name}\");\\n`;\r\n }\r\n if (this.isSystemValue) {\r\n return super._dumpPropertiesCode() + `${variableName}.setAsSystemValue(BABYLON.NodeMaterialSystemValues.${NodeMaterialSystemValues[this._systemValue!]});\\n`;\r\n }\r\n if (this.isUniform) {\r\n const codes: string[] = [];\r\n\r\n let valueString = \"\";\r\n\r\n switch (this.type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n valueString = `${this.value}`;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n valueString = `new BABYLON.Vector2(${this.value.x}, ${this.value.y})`;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n valueString = `new BABYLON.Vector3(${this.value.x}, ${this.value.y}, ${this.value.z})`;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n valueString = `new BABYLON.Vector4(${this.value.x}, ${this.value.y}, ${this.value.z}, ${this.value.w})`;\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n valueString = `new BABYLON.Color3(${this.value.r}, ${this.value.g}, ${this.value.b})`;\r\n if (this.convertToGammaSpace) {\r\n valueString += \".toGammaSpace()\";\r\n }\r\n if (this.convertToLinearSpace) {\r\n valueString += \".toLinearSpace()\";\r\n }\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n valueString = `new BABYLON.Color4(${this.value.r}, ${this.value.g}, ${this.value.b}, ${this.value.a})`;\r\n if (this.convertToGammaSpace) {\r\n valueString += \".toGammaSpace()\";\r\n }\r\n if (this.convertToLinearSpace) {\r\n valueString += \".toLinearSpace()\";\r\n }\r\n break;\r\n case NodeMaterialBlockConnectionPointTypes.Matrix:\r\n valueString = `BABYLON.Matrix.FromArray([${(this.value as Matrix).m}])`;\r\n break;\r\n }\r\n\r\n // Common Property \"Value\"\r\n codes.push(`${variableName}.value = ${valueString}`);\r\n\r\n // Float-Value-Specific Properties\r\n if (this.type === NodeMaterialBlockConnectionPointTypes.Float) {\r\n codes.push(\r\n `${variableName}.min = ${this.min}`,\r\n `${variableName}.max = ${this.max}`,\r\n `${variableName}.isBoolean = ${this.isBoolean}`,\r\n `${variableName}.matrixMode = ${this.matrixMode}`,\r\n `${variableName}.animationType = BABYLON.AnimatedInputBlockTypes.${AnimatedInputBlockTypes[this.animationType]}`\r\n );\r\n }\r\n\r\n // Common Property \"Type\"\r\n codes.push(`${variableName}.isConstant = ${this.isConstant}`);\r\n\r\n codes.push(\"\");\r\n\r\n return super._dumpPropertiesCode() + codes.join(\";\\n\");\r\n }\r\n return super._dumpPropertiesCode();\r\n }\r\n\r\n public dispose() {\r\n this.onValueChangedObservable.clear();\r\n\r\n super.dispose();\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.type = this.type;\r\n serializationObject.mode = this._mode;\r\n serializationObject.systemValue = this._systemValue;\r\n serializationObject.animationType = this._animationType;\r\n serializationObject.min = this.min;\r\n serializationObject.max = this.max;\r\n serializationObject.isBoolean = this.isBoolean;\r\n serializationObject.matrixMode = this.matrixMode;\r\n serializationObject.isConstant = this.isConstant;\r\n serializationObject.groupInInspector = this.groupInInspector;\r\n serializationObject.convertToGammaSpace = this.convertToGammaSpace;\r\n serializationObject.convertToLinearSpace = this.convertToLinearSpace;\r\n\r\n if (this._storedValue != null && this._mode === NodeMaterialBlockConnectionPointMode.Uniform) {\r\n if (this._storedValue.asArray) {\r\n serializationObject.valueType = \"BABYLON.\" + this._storedValue.getClassName();\r\n serializationObject.value = this._storedValue.asArray();\r\n } else {\r\n serializationObject.valueType = \"number\";\r\n serializationObject.value = this._storedValue;\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n this._mode = serializationObject.mode;\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this._type = serializationObject.type;\r\n\r\n this._systemValue = serializationObject.systemValue || serializationObject.wellKnownValue;\r\n this._animationType = serializationObject.animationType;\r\n this.min = serializationObject.min || 0;\r\n this.max = serializationObject.max || 0;\r\n this.isBoolean = !!serializationObject.isBoolean;\r\n this.matrixMode = serializationObject.matrixMode || 0;\r\n this.isConstant = !!serializationObject.isConstant;\r\n this.groupInInspector = serializationObject.groupInInspector || \"\";\r\n this.convertToGammaSpace = !!serializationObject.convertToGammaSpace;\r\n this.convertToLinearSpace = !!serializationObject.convertToLinearSpace;\r\n\r\n // Tangents back compat\r\n if (\r\n serializationObject.name === \"tangent\" &&\r\n serializationObject.mode === NodeMaterialBlockConnectionPointMode.Attribute &&\r\n serializationObject.type === NodeMaterialBlockConnectionPointTypes.Vector3\r\n ) {\r\n this._type = NodeMaterialBlockConnectionPointTypes.Vector4;\r\n }\r\n\r\n if (!serializationObject.valueType) {\r\n return;\r\n }\r\n\r\n if (serializationObject.valueType === \"number\") {\r\n this._storedValue = serializationObject.value;\r\n } else {\r\n const valueType = GetClass(serializationObject.valueType);\r\n\r\n if (valueType) {\r\n this._storedValue = valueType.FromArray(serializationObject.value);\r\n }\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.InputBlock\", InputBlock);\r\n", "import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport type { BaseTexture } from \"../../../Textures/baseTexture\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { Texture } from \"../../../Textures/texture\";\r\nimport type { Scene } from \"../../../../scene\";\r\nimport type { InputBlock } from \"../Input/inputBlock\";\r\n\r\nimport type { NodeMaterial } from \"../../nodeMaterial\";\r\n\r\n/**\r\n * Base block used as input for post process\r\n */\r\nexport class CurrentScreenBlock extends NodeMaterialBlock {\r\n private _samplerName = \"textureSampler\";\r\n private _linearDefineName: string;\r\n private _gammaDefineName: string;\r\n private _mainUVName: string;\r\n private _tempTextureRead: string;\r\n\r\n /**\r\n * Gets or sets the texture associated with the node\r\n */\r\n public texture: Nullable;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if content needs to be converted to gamma space\r\n */\r\n public convertToGammaSpace = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if content needs to be converted to linear space\r\n */\r\n public convertToLinearSpace = false;\r\n\r\n /**\r\n * Create a new CurrentScreenBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.VertexAndFragment);\r\n\r\n this._isUnique = false;\r\n\r\n this.registerInput(\"uv\", NodeMaterialBlockConnectionPointTypes.AutoDetect, false, NodeMaterialBlockTargets.VertexAndFragment);\r\n\r\n this.registerOutput(\"rgba\", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"rgb\", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"r\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"g\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"b\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"a\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n\r\n this._inputs[0].addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Vector2 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4\r\n );\r\n\r\n this._inputs[0]._prioritizeVertex = false;\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"CurrentScreenBlock\";\r\n }\r\n\r\n /**\r\n * Gets the uv input component\r\n */\r\n public get uv(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgba output component\r\n */\r\n public get rgba(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgb output component\r\n */\r\n public get rgb(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the r output component\r\n */\r\n public get r(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the g output component\r\n */\r\n public get g(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n\r\n /**\r\n * Gets the b output component\r\n */\r\n public get b(): NodeMaterialConnectionPoint {\r\n return this._outputs[4];\r\n }\r\n\r\n /**\r\n * Gets the a output component\r\n */\r\n public get a(): NodeMaterialConnectionPoint {\r\n return this._outputs[5];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"textureSampler\");\r\n }\r\n\r\n public get target() {\r\n if (!this.uv.isConnected) {\r\n return NodeMaterialBlockTargets.VertexAndFragment;\r\n }\r\n\r\n if (this.uv.sourceBlock!.isInput) {\r\n return NodeMaterialBlockTargets.VertexAndFragment;\r\n }\r\n\r\n return NodeMaterialBlockTargets.Fragment;\r\n }\r\n\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n defines.setValue(this._linearDefineName, this.convertToGammaSpace, true);\r\n defines.setValue(this._gammaDefineName, this.convertToLinearSpace, true);\r\n }\r\n\r\n public isReady() {\r\n if (this.texture && !this.texture.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _injectVertexCode(state: NodeMaterialBuildState) {\r\n const uvInput = this.uv;\r\n\r\n if (uvInput.connectedPoint!.ownerBlock.isInput) {\r\n const uvInputOwnerBlock = uvInput.connectedPoint!.ownerBlock as InputBlock;\r\n\r\n if (!uvInputOwnerBlock.isAttribute) {\r\n state._emitUniformFromString(uvInput.associatedVariableName, \"vec2\");\r\n }\r\n }\r\n\r\n this._mainUVName = \"vMain\" + uvInput.associatedVariableName;\r\n\r\n state._emitVaryingFromString(this._mainUVName, \"vec2\");\r\n\r\n state.compilationString += `${this._mainUVName} = ${uvInput.associatedVariableName}.xy;\\n`;\r\n\r\n if (!this._outputs.some((o) => o.isConnectedInVertexShader)) {\r\n return;\r\n }\r\n\r\n this._writeTextureRead(state, true);\r\n\r\n for (const output of this._outputs) {\r\n if (output.hasEndpoints) {\r\n this._writeOutput(state, output, output.name, true);\r\n }\r\n }\r\n }\r\n\r\n private _writeTextureRead(state: NodeMaterialBuildState, vertexMode = false) {\r\n const uvInput = this.uv;\r\n\r\n if (vertexMode) {\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n return;\r\n }\r\n\r\n state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${uvInput.associatedVariableName});\\n`;\r\n return;\r\n }\r\n\r\n if (this.uv.ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${uvInput.associatedVariableName});\\n`;\r\n return;\r\n }\r\n\r\n state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${this._mainUVName});\\n`;\r\n }\r\n\r\n private _writeOutput(state: NodeMaterialBuildState, output: NodeMaterialConnectionPoint, swizzle: string, vertexMode = false) {\r\n if (vertexMode) {\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n return;\r\n }\r\n\r\n state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle};\\n`;\r\n\r\n return;\r\n }\r\n\r\n if (this.uv.ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle};\\n`;\r\n return;\r\n }\r\n\r\n state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle};\\n`;\r\n\r\n state.compilationString += `#ifdef ${this._linearDefineName}\\n`;\r\n state.compilationString += `${output.associatedVariableName} = toGammaSpace(${output.associatedVariableName});\\n`;\r\n state.compilationString += `#endif\\n`;\r\n\r\n state.compilationString += `#ifdef ${this._gammaDefineName}\\n`;\r\n state.compilationString += `${output.associatedVariableName} = toLinearSpace(${output.associatedVariableName});\\n`;\r\n state.compilationString += `#endif\\n`;\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n this._tempTextureRead = state._getFreeVariableName(\"tempTextureRead\");\r\n\r\n if (state.sharedData.blockingBlocks.indexOf(this) < 0) {\r\n state.sharedData.blockingBlocks.push(this);\r\n }\r\n if (state.sharedData.textureBlocks.indexOf(this) < 0) {\r\n state.sharedData.textureBlocks.push(this);\r\n }\r\n if (state.sharedData.blocksWithDefines.indexOf(this) < 0) {\r\n state.sharedData.blocksWithDefines.push(this);\r\n }\r\n\r\n if (state.target !== NodeMaterialBlockTargets.Fragment) {\r\n // Vertex\r\n state._emit2DSampler(this._samplerName);\r\n this._injectVertexCode(state);\r\n return;\r\n }\r\n\r\n // Fragment\r\n if (!this._outputs.some((o) => o.isConnectedInFragmentShader)) {\r\n return;\r\n }\r\n\r\n state._emit2DSampler(this._samplerName);\r\n\r\n this._linearDefineName = state._getFreeDefineName(\"ISLINEAR\");\r\n this._gammaDefineName = state._getFreeDefineName(\"ISGAMMA\");\r\n\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n\r\n this._writeTextureRead(state);\r\n\r\n for (const output of this._outputs) {\r\n if (output.hasEndpoints) {\r\n this._writeOutput(state, output, output.name);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.convertToGammaSpace = this.convertToGammaSpace;\r\n serializationObject.convertToLinearSpace = this.convertToLinearSpace;\r\n if (this.texture && !this.texture.isRenderTarget) {\r\n serializationObject.texture = this.texture.serialize();\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.convertToGammaSpace = serializationObject.convertToGammaSpace;\r\n this.convertToLinearSpace = !!serializationObject.convertToLinearSpace;\r\n\r\n if (serializationObject.texture) {\r\n rootUrl = serializationObject.texture.url.indexOf(\"data:\") === 0 ? \"\" : rootUrl;\r\n this.texture = Texture.Parse(serializationObject.texture, scene, rootUrl) as Texture;\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.CurrentScreenBlock\", CurrentScreenBlock);\r\n", "import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport { InputBlock } from \"../Input/inputBlock\";\r\nimport type { BaseTexture } from \"../../../Textures/baseTexture\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { Texture } from \"../../../Textures/texture\";\r\nimport type { Scene } from \"../../../../scene\";\r\n\r\nimport type { NodeMaterial } from \"../../nodeMaterial\";\r\n\r\n/**\r\n * Base block used for the particle texture\r\n */\r\nexport class ParticleTextureBlock extends NodeMaterialBlock {\r\n private _samplerName = \"diffuseSampler\";\r\n private _linearDefineName: string;\r\n private _gammaDefineName: string;\r\n private _tempTextureRead: string;\r\n\r\n /**\r\n * Gets or sets the texture associated with the node\r\n */\r\n public texture: Nullable;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if content needs to be converted to gamma space\r\n */\r\n public convertToGammaSpace = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if content needs to be converted to linear space\r\n */\r\n public convertToLinearSpace = false;\r\n\r\n /**\r\n * Create a new ParticleTextureBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this._isUnique = false;\r\n\r\n this.registerInput(\"uv\", NodeMaterialBlockConnectionPointTypes.AutoDetect, false, NodeMaterialBlockTargets.VertexAndFragment);\r\n\r\n this.registerOutput(\"rgba\", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"rgb\", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"r\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"g\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"b\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"a\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n\r\n this._inputs[0].addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Vector2 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4\r\n );\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"ParticleTextureBlock\";\r\n }\r\n\r\n /**\r\n * Gets the uv input component\r\n */\r\n public get uv(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgba output component\r\n */\r\n public get rgba(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgb output component\r\n */\r\n public get rgb(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the r output component\r\n */\r\n public get r(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the g output component\r\n */\r\n public get g(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n\r\n /**\r\n * Gets the b output component\r\n */\r\n public get b(): NodeMaterialConnectionPoint {\r\n return this._outputs[4];\r\n }\r\n\r\n /**\r\n * Gets the a output component\r\n */\r\n public get a(): NodeMaterialConnectionPoint {\r\n return this._outputs[5];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"diffuseSampler\");\r\n }\r\n\r\n public autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\r\n if (!this.uv.isConnected) {\r\n let uvInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"particle_uv\" && additionalFilteringInfo(b));\r\n\r\n if (!uvInput) {\r\n uvInput = new InputBlock(\"uv\");\r\n uvInput.setAsAttribute(\"particle_uv\");\r\n }\r\n uvInput.output.connectTo(this.uv);\r\n }\r\n }\r\n\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n defines.setValue(this._linearDefineName, this.convertToGammaSpace, true);\r\n defines.setValue(this._gammaDefineName, this.convertToLinearSpace, true);\r\n }\r\n\r\n public isReady() {\r\n if (this.texture && !this.texture.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _writeOutput(state: NodeMaterialBuildState, output: NodeMaterialConnectionPoint, swizzle: string) {\r\n state.compilationString += `${this._declareOutput(output, state)} = ${this._tempTextureRead}.${swizzle};\\n`;\r\n\r\n state.compilationString += `#ifdef ${this._linearDefineName}\\n`;\r\n state.compilationString += `${output.associatedVariableName} = toGammaSpace(${output.associatedVariableName});\\n`;\r\n state.compilationString += `#endif\\n`;\r\n\r\n state.compilationString += `#ifdef ${this._gammaDefineName}\\n`;\r\n state.compilationString += `${output.associatedVariableName} = toLinearSpace(${output.associatedVariableName});\\n`;\r\n state.compilationString += `#endif\\n`;\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Vertex) {\r\n return;\r\n }\r\n\r\n this._tempTextureRead = state._getFreeVariableName(\"tempTextureRead\");\r\n\r\n state._emit2DSampler(this._samplerName);\r\n\r\n state.sharedData.blockingBlocks.push(this);\r\n state.sharedData.textureBlocks.push(this);\r\n state.sharedData.blocksWithDefines.push(this);\r\n\r\n this._linearDefineName = state._getFreeDefineName(\"ISLINEAR\");\r\n this._gammaDefineName = state._getFreeDefineName(\"ISGAMMA\");\r\n\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n\r\n state.compilationString += `vec4 ${this._tempTextureRead} = texture2D(${this._samplerName}, ${this.uv.associatedVariableName});\\n`;\r\n\r\n for (const output of this._outputs) {\r\n if (output.hasEndpoints) {\r\n this._writeOutput(state, output, output.name);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.convertToGammaSpace = this.convertToGammaSpace;\r\n serializationObject.convertToLinearSpace = this.convertToLinearSpace;\r\n if (this.texture && !this.texture.isRenderTarget) {\r\n serializationObject.texture = this.texture.serialize();\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.convertToGammaSpace = serializationObject.convertToGammaSpace;\r\n this.convertToLinearSpace = !!serializationObject.convertToLinearSpace;\r\n\r\n if (serializationObject.texture) {\r\n rootUrl = serializationObject.texture.url.indexOf(\"data:\") === 0 ? \"\" : rootUrl;\r\n this.texture = Texture.Parse(serializationObject.texture, scene, rootUrl) as Texture;\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ParticleTextureBlock\", ParticleTextureBlock);\r\n", "import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n\r\n/**\r\n * Block used for the particle ramp gradient section\r\n */\r\nexport class ParticleRampGradientBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new ParticleRampGradientBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"color\", NodeMaterialBlockConnectionPointTypes.Color4, false, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerOutput(\"rampColor\", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Fragment);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"ParticleRampGradientBlock\";\r\n }\r\n\r\n /**\r\n * Gets the color input component\r\n */\r\n public get color(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rampColor output component\r\n */\r\n public get rampColor(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"remapRanges\");\r\n state._excludeVariableName(\"rampSampler\");\r\n state._excludeVariableName(\"baseColor\");\r\n state._excludeVariableName(\"alpha\");\r\n state._excludeVariableName(\"remappedColorIndex\");\r\n state._excludeVariableName(\"rampColor\");\r\n state._excludeVariableName(\"finalAlpha\");\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Vertex) {\r\n return;\r\n }\r\n\r\n state._emit2DSampler(\"rampSampler\");\r\n state._emitVaryingFromString(\"remapRanges\", \"vec4\", \"RAMPGRADIENT\");\r\n\r\n state.compilationString += `\r\n #ifdef RAMPGRADIENT\r\n vec4 baseColor = ${this.color.associatedVariableName};\r\n float alpha = ${this.color.associatedVariableName}.a;\r\n\r\n float remappedColorIndex = clamp((alpha - remapRanges.x) / remapRanges.y, 0.0, 1.0);\r\n\r\n vec4 rampColor = texture2D(rampSampler, vec2(1.0 - remappedColorIndex, 0.));\r\n baseColor.rgb *= rampColor.rgb;\r\n\r\n // Remapped alpha\r\n float finalAlpha = baseColor.a;\r\n baseColor.a = clamp((alpha * rampColor.a - remapRanges.z) / remapRanges.w, 0.0, 1.0);\r\n\r\n ${this._declareOutput(this.rampColor, state)} = baseColor;\r\n #else\r\n ${this._declareOutput(this.rampColor, state)} = ${this.color.associatedVariableName};\r\n #endif\r\n `;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ParticleRampGradientBlock\", ParticleRampGradientBlock);\r\n", "import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n\r\n/**\r\n * Block used for the particle blend multiply section\r\n */\r\nexport class ParticleBlendMultiplyBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new ParticleBlendMultiplyBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"color\", NodeMaterialBlockConnectionPointTypes.Color4, false, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"alphaTexture\", NodeMaterialBlockConnectionPointTypes.Float, false, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"alphaColor\", NodeMaterialBlockConnectionPointTypes.Float, false, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerOutput(\"blendColor\", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Fragment);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"ParticleBlendMultiplyBlock\";\r\n }\r\n\r\n /**\r\n * Gets the color input component\r\n */\r\n public get color(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the alphaTexture input component\r\n */\r\n public get alphaTexture(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the alphaColor input component\r\n */\r\n public get alphaColor(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the blendColor output component\r\n */\r\n public get blendColor(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"sourceAlpha\");\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Vertex) {\r\n return;\r\n }\r\n\r\n state.compilationString += `\r\n #ifdef BLENDMULTIPLYMODE\r\n ${this._declareOutput(this.blendColor, state)};\r\n float sourceAlpha = ${this.alphaColor.associatedVariableName} * ${this.alphaTexture.associatedVariableName};\r\n ${this.blendColor.associatedVariableName}.rgb = ${this.color.associatedVariableName}.rgb * sourceAlpha + vec3(1.0) * (1.0 - sourceAlpha);\r\n ${this.blendColor.associatedVariableName}.a = ${this.color.associatedVariableName}.a;\r\n #else\r\n ${this._declareOutput(this.blendColor, state)} = ${this.color.associatedVariableName};\r\n #endif\r\n `;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ParticleBlendMultiplyBlock\", ParticleBlendMultiplyBlock);\r\n", "import type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport { InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport type { RenderTargetCreationOptions, TextureSize } from \"../Materials/Textures/textureCreationOptions\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Constants } from \"./constants\";\r\nimport type { ThinEngine } from \"./thinEngine\";\r\nimport type { IMultiRenderTargetOptions } from \"../Materials/Textures/multiRenderTarget\";\r\n\r\n/**\r\n * An interface enforcing the renderTarget accessor to used by render target textures.\r\n */\r\nexport interface IRenderTargetTexture {\r\n /**\r\n * Entry point to access the wrapper on a texture.\r\n */\r\n renderTarget: Nullable;\r\n}\r\n\r\n/**\r\n * Wrapper around a render target (either single or multi textures)\r\n */\r\nexport class RenderTargetWrapper {\r\n protected _engine: ThinEngine;\r\n private _size: TextureSize;\r\n private _isCube: boolean;\r\n private _isMulti: boolean;\r\n private _textures: Nullable = null;\r\n private _faceIndices: Nullable = null;\r\n private _layerIndices: Nullable = null;\r\n private _depthStencilTextureLabel?: string;\r\n /** @internal */\r\n public _samples = 1;\r\n\r\n /** @internal */\r\n public _attachments: Nullable = null;\r\n /** @internal */\r\n public _generateStencilBuffer: boolean = false;\r\n /** @internal */\r\n public _generateDepthBuffer: boolean = false;\r\n\r\n /** @internal */\r\n public _depthStencilTexture: Nullable;\r\n /** @internal */\r\n public _depthStencilTextureWithStencil: boolean = false;\r\n\r\n /**\r\n * Gets or sets the label of the render target wrapper (optional, for debugging purpose)\r\n */\r\n public label?: string;\r\n\r\n /**\r\n * Gets the depth/stencil texture (if created by a createDepthStencilTexture() call)\r\n */\r\n public get depthStencilTexture() {\r\n return this._depthStencilTexture;\r\n }\r\n\r\n /**\r\n * Indicates if the depth/stencil texture has a stencil aspect\r\n */\r\n public get depthStencilTextureWithStencil() {\r\n return this._depthStencilTextureWithStencil;\r\n }\r\n\r\n /**\r\n * Defines if the render target wrapper is for a cube texture or if false a 2d texture\r\n */\r\n public get isCube(): boolean {\r\n return this._isCube;\r\n }\r\n\r\n /**\r\n * Defines if the render target wrapper is for a single or multi target render wrapper\r\n */\r\n public get isMulti(): boolean {\r\n return this._isMulti;\r\n }\r\n\r\n /**\r\n * Defines if the render target wrapper is for a single or an array of textures\r\n */\r\n public get is2DArray(): boolean {\r\n return this.layers > 0;\r\n }\r\n\r\n /**\r\n * Defines if the render target wrapper is for a 3D texture\r\n */\r\n public get is3D(): boolean {\r\n return this.depth > 0;\r\n }\r\n\r\n /**\r\n * Gets the size of the render target wrapper (used for cubes, as width=height in this case)\r\n */\r\n public get size(): number {\r\n return this.width;\r\n }\r\n\r\n /**\r\n * Gets the width of the render target wrapper\r\n */\r\n public get width(): number {\r\n return (<{ width: number; height: number }>this._size).width || this._size;\r\n }\r\n\r\n /**\r\n * Gets the height of the render target wrapper\r\n */\r\n public get height(): number {\r\n return (<{ width: number; height: number }>this._size).height || this._size;\r\n }\r\n\r\n /**\r\n * Gets the number of layers of the render target wrapper (only used if is2DArray is true and wrapper is not a multi render target)\r\n */\r\n public get layers(): number {\r\n return (<{ width: number; height: number; depth?: number; layers?: number }>this._size).layers || 0;\r\n }\r\n\r\n /**\r\n * Gets the depth of the render target wrapper (only used if is3D is true and wrapper is not a multi render target)\r\n */\r\n public get depth(): number {\r\n return (<{ width: number; height: number; depth?: number; layers?: number }>this._size).depth || 0;\r\n }\r\n\r\n /**\r\n * Gets the render texture. If this is a multi render target, gets the first texture\r\n */\r\n public get texture(): Nullable {\r\n return this._textures?.[0] ?? null;\r\n }\r\n\r\n /**\r\n * Gets the list of render textures. If we are not in a multi render target, the list will be null (use the texture getter instead)\r\n */\r\n public get textures(): Nullable {\r\n return this._textures;\r\n }\r\n\r\n /**\r\n * Gets the face indices that correspond to the list of render textures. If we are not in a multi render target, the list will be null\r\n */\r\n public get faceIndices(): Nullable {\r\n return this._faceIndices;\r\n }\r\n\r\n /**\r\n * Gets the layer indices that correspond to the list of render textures. If we are not in a multi render target, the list will be null\r\n */\r\n public get layerIndices(): Nullable {\r\n return this._layerIndices;\r\n }\r\n\r\n /**\r\n * Gets the sample count of the render target\r\n */\r\n public get samples(): number {\r\n return this._samples;\r\n }\r\n\r\n /**\r\n * Sets the sample count of the render target\r\n * @param value sample count\r\n * @param initializeBuffers If set to true, the engine will make an initializing call to drawBuffers (only used when isMulti=true).\r\n * @param force true to force calling the update sample count engine function even if the current sample count is equal to value\r\n * @returns the sample count that has been set\r\n */\r\n public setSamples(value: number, initializeBuffers = true, force = false): number {\r\n if (this.samples === value && !force) {\r\n return value;\r\n }\r\n\r\n const result = this._isMulti\r\n ? this._engine.updateMultipleRenderTargetTextureSampleCount(this, value, initializeBuffers)\r\n : this._engine.updateRenderTargetTextureSampleCount(this, value);\r\n this._samples = value;\r\n return result;\r\n }\r\n\r\n /**\r\n * Initializes the render target wrapper\r\n * @param isMulti true if the wrapper is a multi render target\r\n * @param isCube true if the wrapper should render to a cube texture\r\n * @param size size of the render target (width/height/layers)\r\n * @param engine engine used to create the render target\r\n * @param label defines the label to use for the wrapper (for debugging purpose only)\r\n */\r\n constructor(isMulti: boolean, isCube: boolean, size: TextureSize, engine: ThinEngine, label?: string) {\r\n this._isMulti = isMulti;\r\n this._isCube = isCube;\r\n this._size = size;\r\n this._engine = engine;\r\n this._depthStencilTexture = null;\r\n this.label = label;\r\n }\r\n\r\n /**\r\n * Sets the render target texture(s)\r\n * @param textures texture(s) to set\r\n */\r\n public setTextures(textures: Nullable | Nullable): void {\r\n if (Array.isArray(textures)) {\r\n this._textures = textures;\r\n } else if (textures) {\r\n this._textures = [textures];\r\n } else {\r\n this._textures = null;\r\n }\r\n }\r\n\r\n /**\r\n * Set a texture in the textures array\r\n * @param texture The texture to set\r\n * @param index The index in the textures array to set\r\n * @param disposePrevious If this function should dispose the previous texture\r\n */\r\n public setTexture(texture: InternalTexture, index: number = 0, disposePrevious: boolean = true): void {\r\n if (!this._textures) {\r\n this._textures = [];\r\n }\r\n if (this._textures[index] === texture) {\r\n return;\r\n }\r\n\r\n if (this._textures[index] && disposePrevious) {\r\n this._textures[index].dispose();\r\n }\r\n\r\n this._textures[index] = texture;\r\n }\r\n\r\n /**\r\n * Sets the layer and face indices of every render target texture bound to each color attachment\r\n * @param layers The layers of each texture to be set\r\n * @param faces The faces of each texture to be set\r\n */\r\n public setLayerAndFaceIndices(layers: number[], faces: number[]) {\r\n this._layerIndices = layers;\r\n this._faceIndices = faces;\r\n }\r\n\r\n /**\r\n * Sets the layer and face indices of a texture in the textures array that should be bound to each color attachment\r\n * @param index The index of the texture in the textures array to modify\r\n * @param layer The layer of the texture to be set\r\n * @param face The face of the texture to be set\r\n */\r\n public setLayerAndFaceIndex(index: number = 0, layer?: number, face?: number): void {\r\n if (!this._layerIndices) {\r\n this._layerIndices = [];\r\n }\r\n if (!this._faceIndices) {\r\n this._faceIndices = [];\r\n }\r\n\r\n if (layer !== undefined && layer >= 0) {\r\n this._layerIndices[index] = layer;\r\n }\r\n if (face !== undefined && face >= 0) {\r\n this._faceIndices[index] = face;\r\n }\r\n }\r\n\r\n /**\r\n * Creates the depth/stencil texture\r\n * @param comparisonFunction Comparison function to use for the texture\r\n * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture\r\n * @param generateStencil true if the stencil aspect should also be created\r\n * @param samples sample count to use when creating the texture\r\n * @param format format of the depth texture\r\n * @param label defines the label to use for the texture (for debugging purpose only)\r\n * @returns the depth/stencil created texture\r\n */\r\n public createDepthStencilTexture(\r\n comparisonFunction: number = 0,\r\n bilinearFiltering: boolean = true,\r\n generateStencil: boolean = false,\r\n samples: number = 1,\r\n format: number = Constants.TEXTUREFORMAT_DEPTH32_FLOAT,\r\n label?: string\r\n ): InternalTexture {\r\n this._depthStencilTexture?.dispose();\r\n\r\n this._depthStencilTextureWithStencil = generateStencil;\r\n this._depthStencilTextureLabel = label;\r\n this._depthStencilTexture = this._engine.createDepthStencilTexture(\r\n this._size,\r\n {\r\n bilinearFiltering,\r\n comparisonFunction,\r\n generateStencil,\r\n isCube: this._isCube,\r\n samples,\r\n depthTextureFormat: format,\r\n label,\r\n },\r\n this\r\n );\r\n\r\n return this._depthStencilTexture;\r\n }\r\n\r\n /**\r\n * Shares the depth buffer of this render target with another render target.\r\n * @internal\r\n * @param renderTarget Destination renderTarget\r\n */\r\n public _shareDepth(renderTarget: RenderTargetWrapper): void {\r\n if (this._depthStencilTexture) {\r\n if (renderTarget._depthStencilTexture) {\r\n renderTarget._depthStencilTexture.dispose();\r\n }\r\n\r\n renderTarget._depthStencilTexture = this._depthStencilTexture;\r\n this._depthStencilTexture.incrementReferences();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _swapAndDie(target: InternalTexture): void {\r\n if (this.texture) {\r\n this.texture._swapAndDie(target);\r\n }\r\n this._textures = null;\r\n this.dispose(true);\r\n }\r\n\r\n protected _cloneRenderTargetWrapper(): Nullable {\r\n let rtw: Nullable = null;\r\n\r\n if (this._isMulti) {\r\n const textureArray = this.textures;\r\n if (textureArray && textureArray.length > 0) {\r\n let generateDepthTexture = false;\r\n let textureCount = textureArray.length;\r\n let depthTextureFormat = -1;\r\n\r\n const lastTextureSource = textureArray[textureArray.length - 1]._source;\r\n if (lastTextureSource === InternalTextureSource.Depth || lastTextureSource === InternalTextureSource.DepthStencil) {\r\n generateDepthTexture = true;\r\n depthTextureFormat = textureArray[textureArray.length - 1].format;\r\n textureCount--;\r\n }\r\n\r\n const samplingModes: number[] = [];\r\n const types: number[] = [];\r\n const formats: number[] = [];\r\n const targetTypes: number[] = [];\r\n const faceIndex: number[] = [];\r\n const layerIndex: number[] = [];\r\n const layerCounts: number[] = [];\r\n const internalTexture2Index: { [id: number]: number } = {};\r\n\r\n for (let i = 0; i < textureCount; ++i) {\r\n const texture = textureArray[i];\r\n\r\n samplingModes.push(texture.samplingMode);\r\n types.push(texture.type);\r\n formats.push(texture.format);\r\n\r\n const index = internalTexture2Index[texture.uniqueId];\r\n if (index !== undefined) {\r\n targetTypes.push(-1);\r\n layerCounts.push(0);\r\n } else {\r\n internalTexture2Index[texture.uniqueId] = i;\r\n if (texture.is2DArray) {\r\n targetTypes.push(Constants.TEXTURE_2D_ARRAY);\r\n layerCounts.push(texture.depth);\r\n } else if (texture.isCube) {\r\n targetTypes.push(Constants.TEXTURE_CUBE_MAP);\r\n layerCounts.push(0);\r\n } /*else if (texture.isCubeArray) {\r\n targetTypes.push(Constants.TEXTURE_CUBE_MAP_ARRAY);\r\n layerCounts.push(texture.depth);\r\n }*/ else if (texture.is3D) {\r\n targetTypes.push(Constants.TEXTURE_3D);\r\n layerCounts.push(texture.depth);\r\n } else {\r\n targetTypes.push(Constants.TEXTURE_2D);\r\n layerCounts.push(0);\r\n }\r\n }\r\n\r\n if (this._faceIndices) {\r\n faceIndex.push(this._faceIndices[i] ?? 0);\r\n }\r\n if (this._layerIndices) {\r\n layerIndex.push(this._layerIndices[i] ?? 0);\r\n }\r\n }\r\n\r\n const optionsMRT: IMultiRenderTargetOptions = {\r\n samplingModes,\r\n generateMipMaps: textureArray[0].generateMipMaps,\r\n generateDepthBuffer: this._generateDepthBuffer,\r\n generateStencilBuffer: this._generateStencilBuffer,\r\n generateDepthTexture,\r\n depthTextureFormat,\r\n types,\r\n formats,\r\n textureCount,\r\n targetTypes,\r\n faceIndex,\r\n layerIndex,\r\n layerCounts,\r\n label: this.label,\r\n };\r\n const size = {\r\n width: this.width,\r\n height: this.height,\r\n depth: this.depth,\r\n };\r\n\r\n rtw = this._engine.createMultipleRenderTarget(size, optionsMRT);\r\n\r\n for (let i = 0; i < textureCount; ++i) {\r\n if (targetTypes[i] !== -1) {\r\n continue;\r\n }\r\n const index = internalTexture2Index[textureArray[i].uniqueId];\r\n rtw.setTexture(rtw.textures![index], i);\r\n }\r\n }\r\n } else {\r\n const options: RenderTargetCreationOptions = {};\r\n\r\n options.generateDepthBuffer = this._generateDepthBuffer;\r\n options.generateMipMaps = this.texture?.generateMipMaps ?? false;\r\n options.generateStencilBuffer = this._generateStencilBuffer;\r\n options.samplingMode = this.texture?.samplingMode;\r\n options.type = this.texture?.type;\r\n options.format = this.texture?.format;\r\n options.noColorAttachment = !this._textures;\r\n options.label = this.label;\r\n\r\n if (this.isCube) {\r\n rtw = this._engine.createRenderTargetCubeTexture(this.width, options);\r\n } else {\r\n const size = {\r\n width: this.width,\r\n height: this.height,\r\n layers: this.is2DArray || this.is3D ? this.texture?.depth : undefined,\r\n };\r\n\r\n rtw = this._engine.createRenderTargetTexture(size, options);\r\n }\r\n if (rtw.texture) {\r\n rtw.texture!.isReady = true;\r\n }\r\n }\r\n\r\n return rtw;\r\n }\r\n\r\n protected _swapRenderTargetWrapper(target: RenderTargetWrapper): void {\r\n if (this._textures && target._textures) {\r\n for (let i = 0; i < this._textures.length; ++i) {\r\n this._textures[i]._swapAndDie(target._textures[i], false);\r\n target._textures[i].isReady = true;\r\n }\r\n }\r\n if (this._depthStencilTexture && target._depthStencilTexture) {\r\n this._depthStencilTexture._swapAndDie(target._depthStencilTexture);\r\n target._depthStencilTexture.isReady = true;\r\n }\r\n\r\n this._textures = null;\r\n this._depthStencilTexture = null;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n const rtw = this._cloneRenderTargetWrapper();\r\n if (!rtw) {\r\n return;\r\n }\r\n\r\n if (this._depthStencilTexture) {\r\n const samplingMode = this._depthStencilTexture.samplingMode;\r\n const format = this._depthStencilTexture.format;\r\n const bilinear =\r\n samplingMode === Constants.TEXTURE_BILINEAR_SAMPLINGMODE ||\r\n samplingMode === Constants.TEXTURE_TRILINEAR_SAMPLINGMODE ||\r\n samplingMode === Constants.TEXTURE_LINEAR_LINEAR_MIPNEAREST;\r\n\r\n rtw.createDepthStencilTexture(\r\n this._depthStencilTexture._comparisonFunction,\r\n bilinear,\r\n this._depthStencilTextureWithStencil,\r\n this._depthStencilTexture.samples,\r\n format,\r\n this._depthStencilTextureLabel\r\n );\r\n }\r\n\r\n if (this.samples > 1) {\r\n rtw.setSamples(this.samples);\r\n }\r\n\r\n rtw._swapRenderTargetWrapper(this);\r\n rtw.dispose();\r\n }\r\n\r\n /**\r\n * Releases the internal render textures\r\n */\r\n public releaseTextures(): void {\r\n if (this._textures) {\r\n for (let i = 0; i < this._textures?.length ?? 0; ++i) {\r\n this._textures[i].dispose();\r\n }\r\n }\r\n this._textures = null;\r\n }\r\n\r\n /**\r\n * Disposes the whole render target wrapper\r\n * @param disposeOnlyFramebuffers true if only the frame buffers should be released (used for the WebGL engine). If false, all the textures will also be released\r\n */\r\n public dispose(disposeOnlyFramebuffers = false): void {\r\n if (!disposeOnlyFramebuffers) {\r\n this._depthStencilTexture?.dispose();\r\n this._depthStencilTexture = null;\r\n this.releaseTextures();\r\n }\r\n\r\n this._engine._releaseRenderTargetWrapper(this);\r\n }\r\n}\r\n", "// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"postprocessVertexShader\";\nconst shader = `attribute vec2 position;uniform vec2 scale;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5);\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvUV=(position*madd+madd)*scale;gl_Position=vec4(position,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const postprocessVertexShader = { name, shader };\n", "import type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport type { TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../constants\";\r\nimport type { Engine } from \"../engine\";\r\nimport { RenderTargetWrapper } from \"../renderTargetWrapper\";\r\nimport type { ThinEngine } from \"../thinEngine\";\r\n\r\n/** @internal */\r\nexport class WebGLRenderTargetWrapper extends RenderTargetWrapper {\r\n private _context: WebGLRenderingContext;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _framebuffer: Nullable = null;\r\n /**\r\n * @internal\r\n */\r\n public _depthStencilBuffer: Nullable = null;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public _MSAAFramebuffer: Nullable = null;\r\n\r\n // Multiview\r\n /**\r\n * @internal\r\n */\r\n public _colorTextureArray: Nullable = null;\r\n /**\r\n * @internal\r\n */\r\n public _depthStencilTextureArray: Nullable = null;\r\n /**\r\n * @internal\r\n */\r\n public _disposeOnlyFramebuffers = false;\r\n /**\r\n * @internal\r\n */\r\n public _currentLOD = 0;\r\n\r\n constructor(isMulti: boolean, isCube: boolean, size: TextureSize, engine: ThinEngine, context: WebGLRenderingContext) {\r\n super(isMulti, isCube, size, engine);\r\n\r\n this._context = context;\r\n }\r\n\r\n protected _cloneRenderTargetWrapper(): Nullable {\r\n let rtw: Nullable = null;\r\n\r\n if (this._colorTextureArray && this._depthStencilTextureArray) {\r\n rtw = (this._engine as Engine).createMultiviewRenderTargetTexture(this.width, this.height);\r\n rtw.texture!.isReady = true;\r\n } else {\r\n rtw = super._cloneRenderTargetWrapper();\r\n }\r\n\r\n return rtw;\r\n }\r\n\r\n protected _swapRenderTargetWrapper(target: WebGLRenderTargetWrapper): void {\r\n super._swapRenderTargetWrapper(target);\r\n\r\n target._framebuffer = this._framebuffer;\r\n target._depthStencilBuffer = this._depthStencilBuffer;\r\n target._MSAAFramebuffer = this._MSAAFramebuffer;\r\n target._colorTextureArray = this._colorTextureArray;\r\n target._depthStencilTextureArray = this._depthStencilTextureArray;\r\n\r\n this._framebuffer = this._depthStencilBuffer = this._MSAAFramebuffer = this._colorTextureArray = this._depthStencilTextureArray = null;\r\n }\r\n\r\n /**\r\n * Creates the depth/stencil texture\r\n * @param comparisonFunction Comparison function to use for the texture\r\n * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture\r\n * @param generateStencil true if the stencil aspect should also be created\r\n * @param samples sample count to use when creating the texture\r\n * @param format format of the depth texture\r\n * @param label defines the label to use for the texture (for debugging purpose only)\r\n * @returns the depth/stencil created texture\r\n */\r\n public createDepthStencilTexture(\r\n comparisonFunction: number = 0,\r\n bilinearFiltering: boolean = true,\r\n generateStencil: boolean = false,\r\n samples: number = 1,\r\n format: number = Constants.TEXTUREFORMAT_DEPTH32_FLOAT,\r\n label?: string\r\n ): InternalTexture {\r\n if (this._depthStencilBuffer) {\r\n // Dispose previous depth/stencil render buffers and clear the corresponding attachment.\r\n // Next time this framebuffer is bound, the new depth/stencil texture will be attached.\r\n const currentFrameBuffer = this._engine._currentFramebuffer;\r\n const gl = this._context;\r\n\r\n this._engine._bindUnboundFramebuffer(this._framebuffer);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, null);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, null);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, null);\r\n this._engine._bindUnboundFramebuffer(currentFrameBuffer);\r\n gl.deleteRenderbuffer(this._depthStencilBuffer);\r\n\r\n this._depthStencilBuffer = null;\r\n }\r\n\r\n return super.createDepthStencilTexture(comparisonFunction, bilinearFiltering, generateStencil, samples, format, label);\r\n }\r\n\r\n /**\r\n * Shares the depth buffer of this render target with another render target.\r\n * @internal\r\n * @param renderTarget Destination renderTarget\r\n */\r\n public _shareDepth(renderTarget: WebGLRenderTargetWrapper): void {\r\n super._shareDepth(renderTarget);\r\n\r\n const gl = this._context;\r\n const depthbuffer = this._depthStencilBuffer;\r\n const framebuffer = renderTarget._MSAAFramebuffer || renderTarget._framebuffer;\r\n\r\n if (renderTarget._depthStencilBuffer && renderTarget._depthStencilBuffer !== depthbuffer) {\r\n gl.deleteRenderbuffer(renderTarget._depthStencilBuffer);\r\n }\r\n renderTarget._depthStencilBuffer = depthbuffer;\r\n const attachment = renderTarget._generateStencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\r\n this._engine._bindUnboundFramebuffer(framebuffer);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, depthbuffer);\r\n this._engine._bindUnboundFramebuffer(null);\r\n }\r\n\r\n /**\r\n * Binds a texture to this render target on a specific attachment\r\n * @param texture The texture to bind to the framebuffer\r\n * @param attachmentIndex Index of the attachment\r\n * @param faceIndexOrLayer The face or layer of the texture to render to in case of cube texture or array texture\r\n * @param lodLevel defines the lod level to bind to the frame buffer\r\n */\r\n private _bindTextureRenderTarget(texture: InternalTexture, attachmentIndex: number = 0, faceIndexOrLayer?: number, lodLevel: number = 0) {\r\n if (!texture._hardwareTexture) {\r\n return;\r\n }\r\n\r\n const framebuffer = this._framebuffer;\r\n\r\n const currentFB = this._engine._currentFramebuffer;\r\n this._engine._bindUnboundFramebuffer(framebuffer);\r\n\r\n if (this._engine.webGLVersion > 1) {\r\n const gl = this._context as WebGL2RenderingContext;\r\n\r\n const attachment = (gl)[\"COLOR_ATTACHMENT\" + attachmentIndex];\r\n if (texture.is2DArray || texture.is3D) {\r\n faceIndexOrLayer = faceIndexOrLayer ?? this.layerIndices?.[attachmentIndex] ?? 0;\r\n gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachment, texture._hardwareTexture.underlyingResource, lodLevel, faceIndexOrLayer);\r\n } else if (texture.isCube) {\r\n // if face index is not specified, try to query it from faceIndices\r\n // default is face 0\r\n faceIndexOrLayer = faceIndexOrLayer ?? this.faceIndices?.[attachmentIndex] ?? 0;\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndexOrLayer, texture._hardwareTexture.underlyingResource, lodLevel);\r\n } else {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, texture._hardwareTexture.underlyingResource, lodLevel);\r\n }\r\n } else {\r\n // Default behavior (WebGL)\r\n const gl = this._context;\r\n\r\n const attachment = (gl)[\"COLOR_ATTACHMENT\" + attachmentIndex + \"_WEBGL\"];\r\n const target = faceIndexOrLayer !== undefined ? gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndexOrLayer : gl.TEXTURE_2D;\r\n\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, target, texture._hardwareTexture.underlyingResource, lodLevel);\r\n }\r\n\r\n this._engine._bindUnboundFramebuffer(currentFB);\r\n }\r\n\r\n /**\r\n * Set a texture in the textures array\r\n * @param texture the texture to set\r\n * @param index the index in the textures array to set\r\n * @param disposePrevious If this function should dispose the previous texture\r\n */\r\n public setTexture(texture: InternalTexture, index: number = 0, disposePrevious: boolean = true) {\r\n super.setTexture(texture, index, disposePrevious);\r\n this._bindTextureRenderTarget(texture, index);\r\n }\r\n\r\n /**\r\n * Sets the layer and face indices of every render target texture\r\n * @param layers The layer of the texture to be set (make negative to not modify)\r\n * @param faces The face of the texture to be set (make negative to not modify)\r\n */\r\n public setLayerAndFaceIndices(layers: number[], faces: number[]) {\r\n super.setLayerAndFaceIndices(layers, faces);\r\n\r\n if (!this.textures || !this.layerIndices || !this.faceIndices) {\r\n return;\r\n }\r\n\r\n // the length of this._attachments is the right one as it does not count the depth texture, in case we generated it\r\n const textureCount = this._attachments?.length ?? this.textures.length;\r\n for (let index = 0; index < textureCount; index++) {\r\n const texture = this.textures[index];\r\n if (!texture) {\r\n // The target type was probably -1 at creation time and setTexture has not been called yet for this index\r\n continue;\r\n }\r\n if (texture.is2DArray || texture.is3D) {\r\n this._bindTextureRenderTarget(texture, index, this.layerIndices[index]);\r\n } else if (texture.isCube) {\r\n this._bindTextureRenderTarget(texture, index, this.faceIndices[index]);\r\n } else {\r\n this._bindTextureRenderTarget(texture, index);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set the face and layer indices of a texture in the textures array\r\n * @param index The index of the texture in the textures array to modify\r\n * @param layer The layer of the texture to be set\r\n * @param face The face of the texture to be set\r\n */\r\n public setLayerAndFaceIndex(index: number = 0, layer?: number, face?: number): void {\r\n super.setLayerAndFaceIndex(index, layer, face);\r\n\r\n if (!this.textures || !this.layerIndices || !this.faceIndices) {\r\n return;\r\n }\r\n\r\n const texture = this.textures[index];\r\n if (texture.is2DArray || texture.is3D) {\r\n this._bindTextureRenderTarget(this.textures[index], index, this.layerIndices[index]);\r\n } else if (texture.isCube) {\r\n this._bindTextureRenderTarget(this.textures[index], index, this.faceIndices[index]);\r\n }\r\n }\r\n\r\n public dispose(disposeOnlyFramebuffers = this._disposeOnlyFramebuffers): void {\r\n const gl = this._context;\r\n\r\n if (!disposeOnlyFramebuffers) {\r\n if (this._colorTextureArray) {\r\n this._context.deleteTexture(this._colorTextureArray);\r\n this._colorTextureArray = null;\r\n }\r\n if (this._depthStencilTextureArray) {\r\n this._context.deleteTexture(this._depthStencilTextureArray);\r\n this._depthStencilTextureArray = null;\r\n }\r\n }\r\n\r\n if (this._framebuffer) {\r\n gl.deleteFramebuffer(this._framebuffer);\r\n this._framebuffer = null;\r\n }\r\n\r\n if (this._depthStencilBuffer) {\r\n gl.deleteRenderbuffer(this._depthStencilBuffer);\r\n this._depthStencilBuffer = null;\r\n }\r\n\r\n if (this._MSAAFramebuffer) {\r\n gl.deleteFramebuffer(this._MSAAFramebuffer);\r\n this._MSAAFramebuffer = null;\r\n }\r\n\r\n super.dispose(disposeOnlyFramebuffers);\r\n }\r\n}\r\n", "import { InternalTexture, InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport type { RenderTargetCreationOptions, DepthTextureCreationOptions, TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\r\nimport { ThinEngine } from \"../thinEngine\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { RenderTargetWrapper } from \"../renderTargetWrapper\";\r\nimport { WebGLRenderTargetWrapper } from \"../WebGL/webGLRenderTargetWrapper\";\r\nimport type { WebGLHardwareTexture } from \"../WebGL/webGLHardwareTexture\";\r\n\r\nimport { Constants } from \"../constants\";\r\n\r\n/**\r\n * Type used to define a texture size (either with a number or with a rect width and height)\r\n * @deprecated please use TextureSize instead\r\n */\r\nexport type RenderTargetTextureSize = TextureSize;\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Creates a new render target texture\r\n * @param size defines the size of the texture\r\n * @param options defines the options used to create the texture\r\n * @returns a new render target wrapper ready to render texture\r\n */\r\n createRenderTargetTexture(size: TextureSize, options: boolean | RenderTargetCreationOptions): RenderTargetWrapper;\r\n\r\n /**\r\n * Creates a depth stencil texture.\r\n * This is only available in WebGL 2 or with the depth texture extension available.\r\n * @param size The size of face edge in the texture.\r\n * @param options The options defining the texture.\r\n * @param rtWrapper The render target wrapper for which the depth/stencil texture must be created\r\n * @returns The texture\r\n */\r\n createDepthStencilTexture(size: TextureSize, options: DepthTextureCreationOptions, rtWrapper: RenderTargetWrapper): InternalTexture;\r\n\r\n /**\r\n * Updates the sample count of a render target texture\r\n * @see https://doc.babylonjs.com/setup/support/webGL2#multisample-render-targets\r\n * @param rtWrapper defines the render target wrapper to update\r\n * @param samples defines the sample count to set\r\n * @returns the effective sample count (could be 0 if multisample render targets are not supported)\r\n */\r\n updateRenderTargetTextureSampleCount(rtWrapper: Nullable, samples: number): number;\r\n\r\n /** @internal */\r\n _createDepthStencilTexture(size: TextureSize, options: DepthTextureCreationOptions, rtWrapper: RenderTargetWrapper): InternalTexture;\r\n\r\n /** @internal */\r\n _createHardwareRenderTargetWrapper(isMulti: boolean, isCube: boolean, size: TextureSize): RenderTargetWrapper;\r\n }\r\n}\r\n\r\nThinEngine.prototype._createHardwareRenderTargetWrapper = function (isMulti: boolean, isCube: boolean, size: TextureSize): RenderTargetWrapper {\r\n const rtWrapper = new WebGLRenderTargetWrapper(isMulti, isCube, size, this, this._gl);\r\n this._renderTargetWrapperCache.push(rtWrapper);\r\n return rtWrapper;\r\n};\r\n\r\nThinEngine.prototype.createRenderTargetTexture = function (this: ThinEngine, size: TextureSize, options: boolean | RenderTargetCreationOptions): RenderTargetWrapper {\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(false, false, size) as WebGLRenderTargetWrapper;\r\n\r\n let generateDepthBuffer = true;\r\n let generateStencilBuffer = false;\r\n let noColorAttachment = false;\r\n let colorAttachment: InternalTexture | undefined = undefined;\r\n let samples = 1;\r\n let label: string | undefined = undefined;\r\n if (options !== undefined && typeof options === \"object\") {\r\n generateDepthBuffer = options.generateDepthBuffer ?? true;\r\n generateStencilBuffer = !!options.generateStencilBuffer;\r\n noColorAttachment = !!options.noColorAttachment;\r\n colorAttachment = options.colorAttachment;\r\n samples = options.samples ?? 1;\r\n label = options.label;\r\n }\r\n\r\n const texture = colorAttachment || (noColorAttachment ? null : this._createInternalTexture(size, options, true, InternalTextureSource.RenderTarget));\r\n const width = (<{ width: number; height: number; layers?: number }>size).width || size;\r\n const height = (<{ width: number; height: number; layers?: number }>size).height || size;\r\n\r\n const currentFrameBuffer = this._currentFramebuffer;\r\n const gl = this._gl;\r\n\r\n // Create the framebuffer\r\n const framebuffer = gl.createFramebuffer();\r\n this._bindUnboundFramebuffer(framebuffer);\r\n rtWrapper._depthStencilBuffer = this._setupFramebufferDepthAttachments(generateStencilBuffer, generateDepthBuffer, width, height);\r\n\r\n // No need to rebind on every frame\r\n if (texture && !texture.is2DArray && !texture.is3D) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture._hardwareTexture!.underlyingResource, 0);\r\n }\r\n\r\n this._bindUnboundFramebuffer(currentFrameBuffer);\r\n\r\n rtWrapper.label = label ?? \"RenderTargetWrapper\";\r\n rtWrapper._framebuffer = framebuffer;\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n\r\n rtWrapper.setTextures(texture);\r\n\r\n this.updateRenderTargetTextureSampleCount(rtWrapper, samples);\r\n\r\n return rtWrapper;\r\n};\r\n\r\nThinEngine.prototype.createDepthStencilTexture = function (size: TextureSize, options: DepthTextureCreationOptions, rtWrapper: RenderTargetWrapper): InternalTexture {\r\n if (options.isCube) {\r\n const width = (<{ width: number; height: number }>size).width || size;\r\n return this._createDepthStencilCubeTexture(width, options);\r\n } else {\r\n return this._createDepthStencilTexture(size, options, rtWrapper);\r\n }\r\n};\r\n\r\nThinEngine.prototype._createDepthStencilTexture = function (size: TextureSize, options: DepthTextureCreationOptions): InternalTexture {\r\n const gl = this._gl;\r\n const layers = (<{ width: number; height: number; depth?: number; layers?: number }>size).layers || 0;\r\n const depth = (<{ width: number; height: number; depth?: number; layers?: number }>size).depth || 0;\r\n let target: number = gl.TEXTURE_2D;\r\n if (layers !== 0) {\r\n target = gl.TEXTURE_2D_ARRAY;\r\n } else if (depth !== 0) {\r\n target = gl.TEXTURE_3D;\r\n }\r\n const internalTexture = new InternalTexture(this, InternalTextureSource.DepthStencil);\r\n internalTexture.label = options.label;\r\n if (!this._caps.depthTextureExtension) {\r\n Logger.Error(\"Depth texture is not supported by your browser or hardware.\");\r\n return internalTexture;\r\n }\r\n\r\n const internalOptions = {\r\n bilinearFiltering: false,\r\n comparisonFunction: 0,\r\n generateStencil: false,\r\n ...options,\r\n };\r\n\r\n this._bindTextureDirectly(target, internalTexture, true);\r\n\r\n this._setupDepthStencilTexture(\r\n internalTexture,\r\n size,\r\n internalOptions.generateStencil,\r\n internalOptions.comparisonFunction === 0 ? false : internalOptions.bilinearFiltering,\r\n internalOptions.comparisonFunction,\r\n internalOptions.samples\r\n );\r\n\r\n if (internalOptions.depthTextureFormat !== undefined) {\r\n if (\r\n internalOptions.depthTextureFormat !== Constants.TEXTUREFORMAT_DEPTH16 &&\r\n internalOptions.depthTextureFormat !== Constants.TEXTUREFORMAT_DEPTH24 &&\r\n internalOptions.depthTextureFormat !== Constants.TEXTUREFORMAT_DEPTH24UNORM_STENCIL8 &&\r\n internalOptions.depthTextureFormat !== Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 &&\r\n internalOptions.depthTextureFormat !== Constants.TEXTUREFORMAT_DEPTH32_FLOAT &&\r\n internalOptions.depthTextureFormat !== Constants.TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8\r\n ) {\r\n Logger.Error(\"Depth texture format is not supported.\");\r\n return internalTexture;\r\n }\r\n internalTexture.format = internalOptions.depthTextureFormat;\r\n } else {\r\n internalTexture.format = internalOptions.generateStencil ? Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 : Constants.TEXTUREFORMAT_DEPTH24;\r\n }\r\n\r\n const hasStencil =\r\n internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24UNORM_STENCIL8 ||\r\n internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24_STENCIL8 ||\r\n internalTexture.format === Constants.TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8;\r\n\r\n let type: GLenum = gl.UNSIGNED_INT;\r\n if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH16) {\r\n type = gl.UNSIGNED_SHORT;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24UNORM_STENCIL8 || internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24_STENCIL8) {\r\n type = gl.UNSIGNED_INT_24_8;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH32_FLOAT) {\r\n type = gl.FLOAT;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8) {\r\n type = gl.FLOAT_32_UNSIGNED_INT_24_8_REV;\r\n }\r\n\r\n const format: GLenum = hasStencil ? gl.DEPTH_STENCIL : gl.DEPTH_COMPONENT;\r\n let internalFormat = format;\r\n if (this.webGLVersion > 1) {\r\n if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH16) {\r\n internalFormat = gl.DEPTH_COMPONENT16;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24) {\r\n internalFormat = gl.DEPTH_COMPONENT24;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24UNORM_STENCIL8 || internalTexture.format === Constants.TEXTUREFORMAT_DEPTH24_STENCIL8) {\r\n internalFormat = gl.DEPTH24_STENCIL8;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH32_FLOAT) {\r\n internalFormat = gl.DEPTH_COMPONENT32F;\r\n } else if (internalTexture.format === Constants.TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8) {\r\n internalFormat = gl.DEPTH32F_STENCIL8;\r\n }\r\n }\r\n\r\n if (internalTexture.is2DArray) {\r\n gl.texImage3D(target, 0, internalFormat, internalTexture.width, internalTexture.height, layers, 0, format, type, null);\r\n } else if (internalTexture.is3D) {\r\n gl.texImage3D(target, 0, internalFormat, internalTexture.width, internalTexture.height, depth, 0, format, type, null);\r\n } else {\r\n gl.texImage2D(target, 0, internalFormat, internalTexture.width, internalTexture.height, 0, format, type, null);\r\n }\r\n\r\n this._bindTextureDirectly(target, null);\r\n\r\n this._internalTexturesCache.push(internalTexture);\r\n\r\n return internalTexture;\r\n};\r\n\r\nThinEngine.prototype.updateRenderTargetTextureSampleCount = function (rtWrapper: Nullable, samples: number): number {\r\n if (this.webGLVersion < 2 || !rtWrapper || !rtWrapper.texture) {\r\n return 1;\r\n }\r\n\r\n if (rtWrapper.samples === samples) {\r\n return samples;\r\n }\r\n\r\n const gl = this._gl;\r\n\r\n samples = Math.min(samples, this.getCaps().maxMSAASamples);\r\n\r\n // Dispose previous render buffers\r\n if (rtWrapper._depthStencilBuffer) {\r\n gl.deleteRenderbuffer(rtWrapper._depthStencilBuffer);\r\n rtWrapper._depthStencilBuffer = null;\r\n }\r\n\r\n if (rtWrapper._MSAAFramebuffer) {\r\n gl.deleteFramebuffer(rtWrapper._MSAAFramebuffer);\r\n rtWrapper._MSAAFramebuffer = null;\r\n }\r\n\r\n const hardwareTexture = rtWrapper.texture._hardwareTexture as WebGLHardwareTexture;\r\n hardwareTexture.releaseMSAARenderBuffers();\r\n\r\n if (samples > 1 && typeof gl.renderbufferStorageMultisample === \"function\") {\r\n const framebuffer = gl.createFramebuffer();\r\n\r\n if (!framebuffer) {\r\n throw new Error(\"Unable to create multi sampled framebuffer\");\r\n }\r\n\r\n rtWrapper._MSAAFramebuffer = framebuffer;\r\n this._bindUnboundFramebuffer(rtWrapper._MSAAFramebuffer);\r\n\r\n const colorRenderbuffer = this._createRenderBuffer(\r\n rtWrapper.texture.width,\r\n rtWrapper.texture.height,\r\n samples,\r\n -1 /* not used */,\r\n this._getRGBABufferInternalSizedFormat(rtWrapper.texture.type, rtWrapper.texture.format, rtWrapper.texture._useSRGBBuffer),\r\n gl.COLOR_ATTACHMENT0,\r\n false\r\n );\r\n\r\n if (!colorRenderbuffer) {\r\n throw new Error(\"Unable to create multi sampled framebuffer\");\r\n }\r\n\r\n hardwareTexture.addMSAARenderBuffer(colorRenderbuffer);\r\n } else {\r\n this._bindUnboundFramebuffer(rtWrapper._framebuffer);\r\n }\r\n\r\n rtWrapper.texture.samples = samples;\r\n rtWrapper._samples = samples;\r\n rtWrapper._depthStencilBuffer = this._setupFramebufferDepthAttachments(\r\n rtWrapper._generateStencilBuffer,\r\n rtWrapper._generateDepthBuffer,\r\n rtWrapper.texture.width,\r\n rtWrapper.texture.height,\r\n samples\r\n );\r\n\r\n this._bindUnboundFramebuffer(null);\r\n\r\n return samples;\r\n};\r\n", "import type { Nullable } from \"../types\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Vector2 } from \"../Maths/math.vector\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { RenderTargetCreationOptions } from \"../Materials/Textures/textureCreationOptions\";\r\nimport \"../Shaders/postprocess.vertex\";\r\nimport type { IInspectable } from \"../Misc/iInspectable\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport type { Color4 } from \"../Maths/math.color\";\r\n\r\nimport \"../Engines/Extensions/engine.renderTarget\";\r\nimport type { NodeMaterial } from \"../Materials/Node/nodeMaterial\";\r\nimport { serialize, serializeAsColor4 } from \"../Misc/decorators\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport { GetClass, RegisterClass } from \"../Misc/typeStore\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport type { RenderTargetWrapper } from \"../Engines/renderTargetWrapper\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\n\r\nimport type { Scene } from \"../scene\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport type { Animation } from \"../Animations/animation\";\r\nimport type { PrePassRenderer } from \"../Rendering/prePassRenderer\";\r\nimport type { PrePassEffectConfiguration } from \"../Rendering/prePassEffectConfiguration\";\r\n\r\n/**\r\n * Allows for custom processing of the shader code used by a post process\r\n */\r\nexport type PostProcessCustomShaderCodeProcessing = {\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated after the #include have been processed\r\n */\r\n processCodeAfterIncludes?: (postProcessName: string, shaderType: string, code: string) => string;\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: (postProcessName: string, shaderType: string, code: string) => string;\r\n /**\r\n * If provided, will be called before creating the effect to collect additional custom bindings (defines, uniforms, samplers)\r\n */\r\n defineCustomBindings?: (postProcessName: string, defines: Nullable, uniforms: string[], samplers: string[]) => Nullable;\r\n /**\r\n * If provided, will be called when binding inputs to the shader code to allow the user to add custom bindings\r\n */\r\n bindCustomBindings?: (postProcessName: string, effect: Effect) => void;\r\n};\r\n\r\n/**\r\n * Options for the PostProcess constructor\r\n */\r\nexport type PostProcessOptions = {\r\n /**\r\n * The width of the texture created for this post process.\r\n * This parameter (and height) is only used when passing a value for the 5th parameter (options) to the PostProcess constructor function.\r\n * If you use a PostProcessOptions for the 3rd parameter of the constructor, size is used instead of width and height.\r\n */\r\n width?: number;\r\n /**\r\n * The height of the texture created for this post process.\r\n * This parameter (and width) is only used when passing a value for the 5th parameter (options) to the PostProcess constructor function.\r\n * If you use a PostProcessOptions for the 3rd parameter of the constructor, size is used instead of width and height.\r\n */\r\n height?: number;\r\n\r\n /**\r\n * The list of uniforms used in the shader (if any)\r\n */\r\n uniforms?: Nullable;\r\n /**\r\n * The list of samplers used in the shader (if any)\r\n */\r\n samplers?: Nullable;\r\n /**\r\n * The list of uniform buffers used in the shader (if any)\r\n */\r\n uniformBuffers?: Nullable;\r\n /**\r\n * String of defines that will be set when running the fragment shader. (default: null)\r\n */\r\n defines?: Nullable;\r\n /**\r\n * The size of the post process texture.\r\n * It is either a ratio to downscale or upscale the texture create for this post process, or an object containing width and height values.\r\n * Default: 1\r\n */\r\n size?: number | { width: number; height: number };\r\n /**\r\n * The camera that the post process will be attached to (default: null)\r\n */\r\n camera?: Nullable;\r\n /**\r\n * The sampling mode to be used by the shader (default: Constants.TEXTURE_NEAREST_SAMPLINGMODE)\r\n */\r\n samplingMode?: number;\r\n /**\r\n * The engine to be used to render the post process (default: engine from scene)\r\n */\r\n engine?: Engine;\r\n /**\r\n * If the post process can be reused on the same frame. (default: false)\r\n */\r\n reusable?: boolean;\r\n /**\r\n * Type of the texture created for this post process (default: Constants.TEXTURETYPE_UNSIGNED_INT)\r\n */\r\n textureType?: number;\r\n /**\r\n * The url of the vertex shader to be used. (default: \"postprocess\")\r\n */\r\n vertexUrl?: string;\r\n /**\r\n * The index parameters to be used for babylons include syntax \"#include[0..varyingCount]\". (default: undefined)\r\n * See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\r\n */\r\n indexParameters?: any;\r\n /**\r\n * If the shader should not be compiled immediately. (default: false)\r\n */\r\n blockCompilation?: boolean;\r\n /**\r\n * Format of the texture created for this post process (default: TEXTUREFORMAT_RGBA)\r\n */\r\n textureFormat?: number;\r\n /**\r\n * The shader language of the shader. (default: GLSL)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n};\r\n\r\ntype TextureCache = { texture: RenderTargetWrapper; postProcessChannel: number; lastUsedRenderId: number };\r\n\r\n/**\r\n * PostProcess can be used to apply a shader to a texture after it has been rendered\r\n * See https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses\r\n */\r\nexport class PostProcess {\r\n /** @internal */\r\n public _parentContainer: Nullable = null;\r\n\r\n private static _CustomShaderCodeProcessing: { [postProcessName: string]: PostProcessCustomShaderCodeProcessing } = {};\r\n\r\n /**\r\n * Registers a shader code processing with a post process name.\r\n * @param postProcessName name of the post process. Use null for the fallback shader code processing. This is the shader code processing that will be used in case no specific shader code processing has been associated to a post process name\r\n * @param customShaderCodeProcessing shader code processing to associate to the post process name\r\n */\r\n public static RegisterShaderCodeProcessing(postProcessName: Nullable, customShaderCodeProcessing?: PostProcessCustomShaderCodeProcessing) {\r\n if (!customShaderCodeProcessing) {\r\n delete PostProcess._CustomShaderCodeProcessing[postProcessName ?? \"\"];\r\n return;\r\n }\r\n\r\n PostProcess._CustomShaderCodeProcessing[postProcessName ?? \"\"] = customShaderCodeProcessing;\r\n }\r\n\r\n private static _GetShaderCodeProcessing(postProcessName: string) {\r\n return PostProcess._CustomShaderCodeProcessing[postProcessName] ?? PostProcess._CustomShaderCodeProcessing[\"\"];\r\n }\r\n\r\n /**\r\n * Gets or sets the unique id of the post process\r\n */\r\n @serialize()\r\n public uniqueId: number;\r\n\r\n /** Name of the PostProcess. */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * Width of the texture to apply the post process on\r\n */\r\n @serialize()\r\n public width = -1;\r\n\r\n /**\r\n * Height of the texture to apply the post process on\r\n */\r\n @serialize()\r\n public height = -1;\r\n\r\n /**\r\n * Gets the node material used to create this postprocess (null if the postprocess was manually created)\r\n */\r\n public nodeMaterialSource: Nullable = null;\r\n\r\n /**\r\n * Internal, reference to the location where this postprocess was output to. (Typically the texture on the next postprocess in the chain)\r\n * @internal\r\n */\r\n public _outputTexture: Nullable = null;\r\n /**\r\n * Sampling mode used by the shader\r\n * See https://doc.babylonjs.com/classes/3.1/texture\r\n */\r\n @serialize()\r\n public renderTargetSamplingMode: number;\r\n /**\r\n * Clear color to use when screen clearing\r\n */\r\n @serializeAsColor4()\r\n public clearColor: Color4;\r\n /**\r\n * If the buffer needs to be cleared before applying the post process. (default: true)\r\n * Should be set to false if shader will overwrite all previous pixels.\r\n */\r\n @serialize()\r\n public autoClear = true;\r\n /**\r\n * If clearing the buffer should be forced in autoClear mode, even when alpha mode is enabled (default: false).\r\n * By default, the buffer will only be cleared if alpha mode is disabled (and autoClear is true).\r\n */\r\n @serialize()\r\n public forceAutoClearInAlphaMode = false;\r\n /**\r\n * Type of alpha mode to use when performing the post process (default: Engine.ALPHA_DISABLE)\r\n */\r\n @serialize()\r\n public alphaMode = Constants.ALPHA_DISABLE;\r\n /**\r\n * Sets the setAlphaBlendConstants of the babylon engine\r\n */\r\n @serialize()\r\n public alphaConstants: Color4;\r\n /**\r\n * Animations to be used for the post processing\r\n */\r\n public animations: Animation[] = [];\r\n\r\n /**\r\n * Enable Pixel Perfect mode where texture is not scaled to be power of 2.\r\n * Can only be used on a single postprocess or on the last one of a chain. (default: false)\r\n */\r\n @serialize()\r\n public enablePixelPerfectMode = false;\r\n\r\n /**\r\n * Force the postprocess to be applied without taking in account viewport\r\n */\r\n @serialize()\r\n public forceFullscreenViewport = true;\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility\r\n */\r\n public inspectableCustomProperties: IInspectable[];\r\n\r\n /**\r\n * Scale mode for the post process (default: Engine.SCALEMODE_FLOOR)\r\n *\r\n * | Value | Type | Description |\r\n * | ----- | ----------------------------------- | ----------- |\r\n * | 1 | SCALEMODE_FLOOR | [engine.scalemode_floor](https://doc.babylonjs.com/api/classes/babylon.engine#scalemode_floor) |\r\n * | 2 | SCALEMODE_NEAREST | [engine.scalemode_nearest](https://doc.babylonjs.com/api/classes/babylon.engine#scalemode_nearest) |\r\n * | 3 | SCALEMODE_CEILING | [engine.scalemode_ceiling](https://doc.babylonjs.com/api/classes/babylon.engine#scalemode_ceiling) |\r\n *\r\n */\r\n @serialize()\r\n public scaleMode = Constants.SCALEMODE_FLOOR;\r\n /**\r\n * Force textures to be a power of two (default: false)\r\n */\r\n @serialize()\r\n public alwaysForcePOT = false;\r\n\r\n @serialize(\"samples\")\r\n private _samples = 1;\r\n\r\n /**\r\n * Number of sample textures (default: 1)\r\n */\r\n public get samples() {\r\n return this._samples;\r\n }\r\n\r\n public set samples(n: number) {\r\n this._samples = Math.min(n, this._engine.getCaps().maxMSAASamples);\r\n\r\n this._textures.forEach((texture) => {\r\n texture.setSamples(this._samples);\r\n });\r\n }\r\n\r\n /**\r\n * Modify the scale of the post process to be the same as the viewport (default: false)\r\n */\r\n @serialize()\r\n public adaptScaleToCurrentViewport = false;\r\n\r\n private _camera: Camera;\r\n protected _scene: Scene;\r\n private _engine: Engine;\r\n\r\n private _options: number | { width: number; height: number };\r\n private _reusable = false;\r\n private _renderId = 0;\r\n private _textureType: number;\r\n private _textureFormat: number;\r\n private _shaderLanguage: ShaderLanguage;\r\n\r\n /**\r\n * if externalTextureSamplerBinding is true, the \"apply\" method won't bind the textureSampler texture, it is expected to be done by the \"outside\" (by the onApplyObservable observer most probably).\r\n * counter-productive in some cases because if the texture bound by \"apply\" is different from the currently texture bound, (the one set by the onApplyObservable observer, for eg) some\r\n * internal structures (materialContext) will be dirtified, which may impact performances\r\n */\r\n public externalTextureSamplerBinding = false;\r\n\r\n /**\r\n * Smart array of input and output textures for the post process.\r\n * @internal\r\n */\r\n public _textures = new SmartArray(2);\r\n /**\r\n * Smart array of input and output textures for the post process.\r\n * @internal\r\n */\r\n private _textureCache: TextureCache[] = [];\r\n /**\r\n * The index in _textures that corresponds to the output texture.\r\n * @internal\r\n */\r\n public _currentRenderTextureInd = 0;\r\n private _drawWrapper: DrawWrapper;\r\n private _samplers: string[];\r\n private _fragmentUrl: string;\r\n private _vertexUrl: string;\r\n private _parameters: string[];\r\n private _uniformBuffers: string[];\r\n protected _postProcessDefines: Nullable;\r\n private _scaleRatio = new Vector2(1, 1);\r\n protected _indexParameters: any;\r\n private _shareOutputWithPostProcess: Nullable;\r\n private _texelSize = Vector2.Zero();\r\n\r\n /** @internal */\r\n public _forcedOutputTexture: Nullable;\r\n\r\n /**\r\n * Prepass configuration in case this post process needs a texture from prepass\r\n * @internal\r\n */\r\n public _prePassEffectConfiguration: PrePassEffectConfiguration;\r\n\r\n /**\r\n * Returns the fragment url or shader name used in the post process.\r\n * @returns the fragment url or name in the shader store.\r\n */\r\n public getEffectName(): string {\r\n return this._fragmentUrl;\r\n }\r\n\r\n // Events\r\n\r\n /**\r\n * An event triggered when the postprocess is activated.\r\n */\r\n public onActivateObservable = new Observable();\r\n\r\n private _onActivateObserver: Nullable>;\r\n /**\r\n * A function that is added to the onActivateObservable\r\n */\r\n public set onActivate(callback: Nullable<(camera: Camera) => void>) {\r\n if (this._onActivateObserver) {\r\n this.onActivateObservable.remove(this._onActivateObserver);\r\n }\r\n if (callback) {\r\n this._onActivateObserver = this.onActivateObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * An event triggered when the postprocess changes its size.\r\n */\r\n public onSizeChangedObservable = new Observable();\r\n\r\n private _onSizeChangedObserver: Nullable>;\r\n /**\r\n * A function that is added to the onSizeChangedObservable\r\n */\r\n public set onSizeChanged(callback: (postProcess: PostProcess) => void) {\r\n if (this._onSizeChangedObserver) {\r\n this.onSizeChangedObservable.remove(this._onSizeChangedObserver);\r\n }\r\n this._onSizeChangedObserver = this.onSizeChangedObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the postprocess applies its effect.\r\n */\r\n public onApplyObservable = new Observable();\r\n\r\n private _onApplyObserver: Nullable>;\r\n /**\r\n * A function that is added to the onApplyObservable\r\n */\r\n public set onApply(callback: (effect: Effect) => void) {\r\n if (this._onApplyObserver) {\r\n this.onApplyObservable.remove(this._onApplyObserver);\r\n }\r\n this._onApplyObserver = this.onApplyObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered before rendering the postprocess\r\n */\r\n public onBeforeRenderObservable = new Observable();\r\n\r\n private _onBeforeRenderObserver: Nullable>;\r\n /**\r\n * A function that is added to the onBeforeRenderObservable\r\n */\r\n public set onBeforeRender(callback: (effect: Effect) => void) {\r\n if (this._onBeforeRenderObserver) {\r\n this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n }\r\n this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered after rendering the postprocess\r\n */\r\n public onAfterRenderObservable = new Observable();\r\n\r\n private _onAfterRenderObserver: Nullable>;\r\n /**\r\n * A function that is added to the onAfterRenderObservable\r\n */\r\n public set onAfterRender(callback: (efect: Effect) => void) {\r\n if (this._onAfterRenderObserver) {\r\n this.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n }\r\n this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * The input texture for this post process and the output texture of the previous post process. When added to a pipeline the previous post process will\r\n * render it's output into this texture and this texture will be used as textureSampler in the fragment shader of this post process.\r\n */\r\n public get inputTexture(): RenderTargetWrapper {\r\n return this._textures.data[this._currentRenderTextureInd];\r\n }\r\n\r\n public set inputTexture(value: RenderTargetWrapper) {\r\n this._forcedOutputTexture = value;\r\n }\r\n\r\n /**\r\n * Since inputTexture should always be defined, if we previously manually set `inputTexture`,\r\n * the only way to unset it is to use this function to restore its internal state\r\n */\r\n public restoreDefaultInputTexture() {\r\n if (this._forcedOutputTexture) {\r\n this._forcedOutputTexture = null;\r\n this.markTextureDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the camera which post process is applied to.\r\n * @returns The camera the post process is applied to.\r\n */\r\n public getCamera(): Camera {\r\n return this._camera;\r\n }\r\n\r\n /**\r\n * Gets the texel size of the postprocess.\r\n * See https://en.wikipedia.org/wiki/Texel_(graphics)\r\n */\r\n public get texelSize(): Vector2 {\r\n if (this._shareOutputWithPostProcess) {\r\n return this._shareOutputWithPostProcess.texelSize;\r\n }\r\n\r\n if (this._forcedOutputTexture) {\r\n this._texelSize.copyFromFloats(1.0 / this._forcedOutputTexture.width, 1.0 / this._forcedOutputTexture.height);\r\n }\r\n\r\n return this._texelSize;\r\n }\r\n\r\n /**\r\n * Creates a new instance PostProcess\r\n * @param name The name of the PostProcess.\r\n * @param fragmentUrl The url of the fragment shader to be used.\r\n * @param options The options to be used when constructing the post process.\r\n */\r\n constructor(name: string, fragmentUrl: string, options?: PostProcessOptions);\r\n\r\n /**\r\n * Creates a new instance PostProcess\r\n * @param name The name of the PostProcess.\r\n * @param fragmentUrl The url of the fragment shader to be used.\r\n * @param parameters Array of the names of uniform non-sampler2D variables that will be passed to the shader.\r\n * @param samplers Array of the names of uniform sampler2D variables that will be passed to the shader.\r\n * @param options The required width/height ratio to downsize to before computing the render pass. (Use 1.0 for full size)\r\n * @param camera The camera to apply the render pass to.\r\n * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)\r\n * @param engine The engine which the post process will be applied. (default: current engine)\r\n * @param reusable If the post process can be reused on the same frame. (default: false)\r\n * @param defines String of defines that will be set when running the fragment shader. (default: null)\r\n * @param textureType Type of textures used when performing the post process. (default: 0)\r\n * @param vertexUrl The url of the vertex shader to be used. (default: \"postprocess\")\r\n * @param indexParameters The index parameters to be used for babylons include syntax \"#include[0..varyingCount]\". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\r\n * @param blockCompilation If the shader should not be compiled immediatly. (default: false)\r\n * @param textureFormat Format of textures used when performing the post process. (default: TEXTUREFORMAT_RGBA)\r\n * @param shaderLanguage The shader language of the shader. (default: GLSL)\r\n */\r\n constructor(\r\n name: string,\r\n fragmentUrl: string,\r\n parameters: Nullable,\r\n samplers: Nullable,\r\n options: number | PostProcessOptions,\r\n camera: Nullable,\r\n samplingMode?: number,\r\n engine?: Engine,\r\n reusable?: boolean,\r\n defines?: Nullable,\r\n textureType?: number,\r\n vertexUrl?: string,\r\n indexParameters?: any,\r\n blockCompilation?: boolean,\r\n textureFormat?: number,\r\n shaderLanguage?: ShaderLanguage\r\n );\r\n\r\n /** @internal */\r\n constructor(\r\n name: string,\r\n fragmentUrl: string,\r\n parameters?: Nullable | PostProcessOptions,\r\n samplers?: Nullable,\r\n _size?: number | PostProcessOptions,\r\n camera?: Nullable,\r\n samplingMode: number = Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n engine?: Engine,\r\n reusable?: boolean,\r\n defines: Nullable = null,\r\n textureType: number = Constants.TEXTURETYPE_UNSIGNED_INT,\r\n vertexUrl: string = \"postprocess\",\r\n indexParameters?: any,\r\n blockCompilation = false,\r\n textureFormat = Constants.TEXTUREFORMAT_RGBA,\r\n shaderLanguage = ShaderLanguage.GLSL\r\n ) {\r\n this.name = name;\r\n let size: number | { width: number; height: number } = 1;\r\n let uniformBuffers: Nullable = null;\r\n if (parameters && !Array.isArray(parameters)) {\r\n const options = parameters;\r\n parameters = options.uniforms ?? null;\r\n samplers = options.samplers ?? null;\r\n size = options.size ?? 1;\r\n camera = options.camera ?? null;\r\n samplingMode = options.samplingMode ?? Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n engine = options.engine;\r\n reusable = options.reusable;\r\n defines = options.defines ?? null;\r\n textureType = options.textureType ?? Constants.TEXTURETYPE_UNSIGNED_INT;\r\n vertexUrl = options.vertexUrl ?? \"postprocess\";\r\n indexParameters = options.indexParameters;\r\n blockCompilation = options.blockCompilation ?? false;\r\n textureFormat = options.textureFormat ?? Constants.TEXTUREFORMAT_RGBA;\r\n shaderLanguage = options.shaderLanguage ?? ShaderLanguage.GLSL;\r\n uniformBuffers = options.uniformBuffers ?? null;\r\n } else if (_size) {\r\n if (typeof _size === \"number\") {\r\n size = _size;\r\n } else {\r\n size = { width: _size.width!, height: _size.height! };\r\n }\r\n }\r\n\r\n if (camera != null) {\r\n this._camera = camera;\r\n this._scene = camera.getScene();\r\n camera.attachPostProcess(this);\r\n this._engine = this._scene.getEngine();\r\n\r\n this._scene.postProcesses.push(this);\r\n this.uniqueId = this._scene.getUniqueId();\r\n } else if (engine) {\r\n this._engine = engine;\r\n this._engine.postProcesses.push(this);\r\n }\r\n\r\n this._options = size;\r\n this.renderTargetSamplingMode = samplingMode ? samplingMode : Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n this._reusable = reusable || false;\r\n this._textureType = textureType;\r\n this._textureFormat = textureFormat;\r\n this._shaderLanguage = shaderLanguage;\r\n\r\n this._samplers = samplers || [];\r\n this._samplers.push(\"textureSampler\");\r\n\r\n this._fragmentUrl = fragmentUrl;\r\n this._vertexUrl = vertexUrl;\r\n this._parameters = parameters || [];\r\n\r\n this._parameters.push(\"scale\");\r\n this._uniformBuffers = uniformBuffers || [];\r\n\r\n this._indexParameters = indexParameters;\r\n this._drawWrapper = new DrawWrapper(this._engine);\r\n\r\n if (!blockCompilation) {\r\n this.updateEffect(defines);\r\n }\r\n }\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"PostProcess\" string\r\n */\r\n public getClassName(): string {\r\n return \"PostProcess\";\r\n }\r\n\r\n /**\r\n * Gets the engine which this post process belongs to.\r\n * @returns The engine the post process was enabled with.\r\n */\r\n public getEngine(): Engine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * The effect that is created when initializing the post process.\r\n * @returns The created effect corresponding the postprocess.\r\n */\r\n public getEffect(): Effect {\r\n return this._drawWrapper.effect!;\r\n }\r\n\r\n /**\r\n * To avoid multiple redundant textures for multiple post process, the output the output texture for this post process can be shared with another.\r\n * @param postProcess The post process to share the output with.\r\n * @returns This post process.\r\n */\r\n public shareOutputWith(postProcess: PostProcess): PostProcess {\r\n this._disposeTextures();\r\n\r\n this._shareOutputWithPostProcess = postProcess;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Reverses the effect of calling shareOutputWith and returns the post process back to its original state.\r\n * This should be called if the post process that shares output with this post process is disabled/disposed.\r\n */\r\n public useOwnOutput() {\r\n if (this._textures.length == 0) {\r\n this._textures = new SmartArray(2);\r\n }\r\n\r\n this._shareOutputWithPostProcess = null;\r\n }\r\n\r\n /**\r\n * Updates the effect with the current post process compile time values and recompiles the shader.\r\n * @param defines Define statements that should be added at the beginning of the shader. (default: null)\r\n * @param uniforms Set of uniform variables that will be passed to the shader. (default: null)\r\n * @param samplers Set of Texture2D variables that will be passed to the shader. (default: null)\r\n * @param indexParameters The index parameters to be used for babylons include syntax \"#include[0..varyingCount]\". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\r\n * @param onCompiled Called when the shader has been compiled.\r\n * @param onError Called if there is an error when compiling a shader.\r\n * @param vertexUrl The url of the vertex shader to be used (default: the one given at construction time)\r\n * @param fragmentUrl The url of the fragment shader to be used (default: the one given at construction time)\r\n */\r\n public updateEffect(\r\n defines: Nullable = null,\r\n uniforms: Nullable = null,\r\n samplers: Nullable = null,\r\n indexParameters?: any,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n vertexUrl?: string,\r\n fragmentUrl?: string\r\n ) {\r\n const customShaderCodeProcessing = PostProcess._GetShaderCodeProcessing(this.name);\r\n if (customShaderCodeProcessing?.defineCustomBindings) {\r\n const newUniforms = uniforms?.slice() ?? [];\r\n newUniforms.push(...this._parameters);\r\n\r\n const newSamplers = samplers?.slice() ?? [];\r\n newSamplers.push(...this._samplers);\r\n\r\n defines = customShaderCodeProcessing.defineCustomBindings(this.name, defines, newUniforms, newSamplers);\r\n uniforms = newUniforms;\r\n samplers = newSamplers;\r\n }\r\n this._postProcessDefines = defines;\r\n this._drawWrapper.effect = this._engine.createEffect(\r\n { vertex: vertexUrl ?? this._vertexUrl, fragment: fragmentUrl ?? this._fragmentUrl },\r\n {\r\n attributes: [\"position\"],\r\n uniformsNames: uniforms || this._parameters,\r\n uniformBuffersNames: this._uniformBuffers,\r\n samplers: samplers || this._samplers,\r\n defines: defines !== null ? defines : \"\",\r\n fallbacks: null,\r\n onCompiled: onCompiled ?? null,\r\n onError: onError ?? null,\r\n indexParameters: indexParameters || this._indexParameters,\r\n processCodeAfterIncludes: customShaderCodeProcessing?.processCodeAfterIncludes\r\n ? (shaderType: string, code: string) => customShaderCodeProcessing!.processCodeAfterIncludes!(this.name, shaderType, code)\r\n : null,\r\n processFinalCode: customShaderCodeProcessing?.processFinalCode\r\n ? (shaderType: string, code: string) => customShaderCodeProcessing!.processFinalCode!(this.name, shaderType, code)\r\n : null,\r\n shaderLanguage: this._shaderLanguage,\r\n },\r\n this._engine\r\n );\r\n }\r\n\r\n /**\r\n * The post process is reusable if it can be used multiple times within one frame.\r\n * @returns If the post process is reusable\r\n */\r\n public isReusable(): boolean {\r\n return this._reusable;\r\n }\r\n\r\n /** invalidate frameBuffer to hint the postprocess to create a depth buffer */\r\n public markTextureDirty(): void {\r\n this.width = -1;\r\n }\r\n\r\n private _createRenderTargetTexture(textureSize: { width: number; height: number }, textureOptions: RenderTargetCreationOptions, channel = 0) {\r\n for (let i = 0; i < this._textureCache.length; i++) {\r\n if (\r\n this._textureCache[i].texture.width === textureSize.width &&\r\n this._textureCache[i].texture.height === textureSize.height &&\r\n this._textureCache[i].postProcessChannel === channel &&\r\n this._textureCache[i].texture._generateDepthBuffer === textureOptions.generateDepthBuffer &&\r\n this._textureCache[i].texture.samples === textureOptions.samples\r\n ) {\r\n return this._textureCache[i].texture;\r\n }\r\n }\r\n\r\n const tex = this._engine.createRenderTargetTexture(textureSize, textureOptions);\r\n this._textureCache.push({ texture: tex, postProcessChannel: channel, lastUsedRenderId: -1 });\r\n\r\n return tex;\r\n }\r\n\r\n private _flushTextureCache() {\r\n const currentRenderId = this._renderId;\r\n\r\n for (let i = this._textureCache.length - 1; i >= 0; i--) {\r\n if (currentRenderId - this._textureCache[i].lastUsedRenderId > 100) {\r\n let currentlyUsed = false;\r\n for (let j = 0; j < this._textures.length; j++) {\r\n if (this._textures.data[j] === this._textureCache[i].texture) {\r\n currentlyUsed = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!currentlyUsed) {\r\n this._textureCache[i].texture.dispose();\r\n this._textureCache.splice(i, 1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resizes the post-process texture\r\n * @param width Width of the texture\r\n * @param height Height of the texture\r\n * @param camera The camera this post-process is applied to. Pass null if the post-process is used outside the context of a camera post-process chain (default: null)\r\n * @param needMipMaps True if mip maps need to be generated after render (default: false)\r\n * @param forceDepthStencil True to force post-process texture creation with stencil depth and buffer (default: false)\r\n */\r\n public resize(width: number, height: number, camera: Nullable = null, needMipMaps = false, forceDepthStencil = false) {\r\n if (this._textures.length > 0) {\r\n this._textures.reset();\r\n }\r\n\r\n this.width = width;\r\n this.height = height;\r\n\r\n let firstPP = null;\r\n if (camera) {\r\n for (let i = 0; i < camera._postProcesses.length; i++) {\r\n if (camera._postProcesses[i] !== null) {\r\n firstPP = camera._postProcesses[i];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const textureSize = { width: this.width, height: this.height };\r\n const textureOptions = {\r\n generateMipMaps: needMipMaps,\r\n generateDepthBuffer: forceDepthStencil || firstPP === this,\r\n generateStencilBuffer: (forceDepthStencil || firstPP === this) && this._engine.isStencilEnable,\r\n samplingMode: this.renderTargetSamplingMode,\r\n type: this._textureType,\r\n format: this._textureFormat,\r\n samples: this._samples,\r\n label: \"PostProcessRTT-\" + this.name,\r\n };\r\n\r\n this._textures.push(this._createRenderTargetTexture(textureSize, textureOptions, 0));\r\n\r\n if (this._reusable) {\r\n this._textures.push(this._createRenderTargetTexture(textureSize, textureOptions, 1));\r\n }\r\n\r\n this._texelSize.copyFromFloats(1.0 / this.width, 1.0 / this.height);\r\n\r\n this.onSizeChangedObservable.notifyObservers(this);\r\n }\r\n\r\n private _getTarget() {\r\n let target: RenderTargetWrapper;\r\n\r\n if (this._shareOutputWithPostProcess) {\r\n target = this._shareOutputWithPostProcess.inputTexture;\r\n } else if (this._forcedOutputTexture) {\r\n target = this._forcedOutputTexture;\r\n\r\n this.width = this._forcedOutputTexture.width;\r\n this.height = this._forcedOutputTexture.height;\r\n } else {\r\n target = this.inputTexture;\r\n\r\n let cache;\r\n for (let i = 0; i < this._textureCache.length; i++) {\r\n if (this._textureCache[i].texture === target) {\r\n cache = this._textureCache[i];\r\n break;\r\n }\r\n }\r\n\r\n if (cache) {\r\n cache.lastUsedRenderId = this._renderId;\r\n }\r\n }\r\n\r\n return target;\r\n }\r\n\r\n /**\r\n * Activates the post process by intializing the textures to be used when executed. Notifies onActivateObservable.\r\n * When this post process is used in a pipeline, this is call will bind the input texture of this post process to the output of the previous.\r\n * @param camera The camera that will be used in the post process. This camera will be used when calling onActivateObservable.\r\n * @param sourceTexture The source texture to be inspected to get the width and height if not specified in the post process constructor. (default: null)\r\n * @param forceDepthStencil If true, a depth and stencil buffer will be generated. (default: false)\r\n * @returns The render target wrapper that was bound to be written to.\r\n */\r\n public activate(camera: Nullable, sourceTexture: Nullable = null, forceDepthStencil?: boolean): RenderTargetWrapper {\r\n camera = camera || this._camera;\r\n\r\n const scene = camera.getScene();\r\n const engine = scene.getEngine();\r\n const maxSize = engine.getCaps().maxTextureSize;\r\n\r\n const requiredWidth = ((sourceTexture ? sourceTexture.width : this._engine.getRenderWidth(true)) * this._options) | 0;\r\n const requiredHeight = ((sourceTexture ? sourceTexture.height : this._engine.getRenderHeight(true)) * this._options) | 0;\r\n\r\n let desiredWidth = (this._options).width || requiredWidth;\r\n let desiredHeight = (this._options).height || requiredHeight;\r\n\r\n const needMipMaps =\r\n this.renderTargetSamplingMode !== Constants.TEXTURE_NEAREST_LINEAR &&\r\n this.renderTargetSamplingMode !== Constants.TEXTURE_NEAREST_NEAREST &&\r\n this.renderTargetSamplingMode !== Constants.TEXTURE_LINEAR_LINEAR;\r\n\r\n let target: Nullable = null;\r\n\r\n if (!this._shareOutputWithPostProcess && !this._forcedOutputTexture) {\r\n if (this.adaptScaleToCurrentViewport) {\r\n const currentViewport = engine.currentViewport;\r\n\r\n if (currentViewport) {\r\n desiredWidth *= currentViewport.width;\r\n desiredHeight *= currentViewport.height;\r\n }\r\n }\r\n\r\n if (needMipMaps || this.alwaysForcePOT) {\r\n if (!(this._options).width) {\r\n desiredWidth = engine.needPOTTextures ? Engine.GetExponentOfTwo(desiredWidth, maxSize, this.scaleMode) : desiredWidth;\r\n }\r\n\r\n if (!(this._options).height) {\r\n desiredHeight = engine.needPOTTextures ? Engine.GetExponentOfTwo(desiredHeight, maxSize, this.scaleMode) : desiredHeight;\r\n }\r\n }\r\n\r\n if (this.width !== desiredWidth || this.height !== desiredHeight || !(target = this._getTarget())) {\r\n this.resize(desiredWidth, desiredHeight, camera, needMipMaps, forceDepthStencil);\r\n }\r\n\r\n this._textures.forEach((texture) => {\r\n if (texture.samples !== this.samples) {\r\n this._engine.updateRenderTargetTextureSampleCount(texture, this.samples);\r\n }\r\n });\r\n\r\n this._flushTextureCache();\r\n this._renderId++;\r\n }\r\n\r\n if (!target) {\r\n target = this._getTarget();\r\n }\r\n\r\n // Bind the input of this post process to be used as the output of the previous post process.\r\n if (this.enablePixelPerfectMode) {\r\n this._scaleRatio.copyFromFloats(requiredWidth / desiredWidth, requiredHeight / desiredHeight);\r\n this._engine.bindFramebuffer(target, 0, requiredWidth, requiredHeight, this.forceFullscreenViewport);\r\n } else {\r\n this._scaleRatio.copyFromFloats(1, 1);\r\n this._engine.bindFramebuffer(target, 0, undefined, undefined, this.forceFullscreenViewport);\r\n }\r\n\r\n this._engine._debugInsertMarker?.(`post process ${this.name} input`);\r\n\r\n this.onActivateObservable.notifyObservers(camera);\r\n\r\n // Clear\r\n if (this.autoClear && (this.alphaMode === Constants.ALPHA_DISABLE || this.forceAutoClearInAlphaMode)) {\r\n this._engine.clear(this.clearColor ? this.clearColor : scene.clearColor, scene._allowPostProcessClearColor, true, true);\r\n }\r\n\r\n if (this._reusable) {\r\n this._currentRenderTextureInd = (this._currentRenderTextureInd + 1) % 2;\r\n }\r\n return target;\r\n }\r\n\r\n /**\r\n * If the post process is supported.\r\n */\r\n public get isSupported(): boolean {\r\n return this._drawWrapper.effect!.isSupported;\r\n }\r\n\r\n /**\r\n * The aspect ratio of the output texture.\r\n */\r\n public get aspectRatio(): number {\r\n if (this._shareOutputWithPostProcess) {\r\n return this._shareOutputWithPostProcess.aspectRatio;\r\n }\r\n\r\n if (this._forcedOutputTexture) {\r\n return this._forcedOutputTexture.width / this._forcedOutputTexture.height;\r\n }\r\n return this.width / this.height;\r\n }\r\n\r\n /**\r\n * Get a value indicating if the post-process is ready to be used\r\n * @returns true if the post-process is ready (shader is compiled)\r\n */\r\n public isReady(): boolean {\r\n return this._drawWrapper.effect?.isReady() ?? false;\r\n }\r\n\r\n /**\r\n * Binds all textures and uniforms to the shader, this will be run on every pass.\r\n * @returns the effect corresponding to this post process. Null if not compiled or not ready.\r\n */\r\n public apply(): Nullable {\r\n // Check\r\n if (!this._drawWrapper.effect?.isReady()) {\r\n return null;\r\n }\r\n\r\n // States\r\n this._engine.enableEffect(this._drawWrapper);\r\n this._engine.setState(false);\r\n this._engine.setDepthBuffer(false);\r\n this._engine.setDepthWrite(false);\r\n\r\n // Alpha\r\n this._engine.setAlphaMode(this.alphaMode);\r\n if (this.alphaConstants) {\r\n this.getEngine().setAlphaConstants(this.alphaConstants.r, this.alphaConstants.g, this.alphaConstants.b, this.alphaConstants.a);\r\n }\r\n\r\n // Bind the output texture of the preivous post process as the input to this post process.\r\n let source: RenderTargetWrapper;\r\n if (this._shareOutputWithPostProcess) {\r\n source = this._shareOutputWithPostProcess.inputTexture;\r\n } else if (this._forcedOutputTexture) {\r\n source = this._forcedOutputTexture;\r\n } else {\r\n source = this.inputTexture;\r\n }\r\n\r\n if (!this.externalTextureSamplerBinding) {\r\n this._drawWrapper.effect._bindTexture(\"textureSampler\", source?.texture);\r\n }\r\n\r\n // Parameters\r\n this._drawWrapper.effect.setVector2(\"scale\", this._scaleRatio);\r\n this.onApplyObservable.notifyObservers(this._drawWrapper.effect);\r\n\r\n PostProcess._GetShaderCodeProcessing(this.name)?.bindCustomBindings?.(this.name, this._drawWrapper.effect);\r\n\r\n return this._drawWrapper.effect;\r\n }\r\n\r\n private _disposeTextures() {\r\n if (this._shareOutputWithPostProcess || this._forcedOutputTexture) {\r\n this._disposeTextureCache();\r\n return;\r\n }\r\n\r\n this._disposeTextureCache();\r\n this._textures.dispose();\r\n }\r\n\r\n private _disposeTextureCache() {\r\n for (let i = this._textureCache.length - 1; i >= 0; i--) {\r\n this._textureCache[i].texture.dispose();\r\n }\r\n\r\n this._textureCache.length = 0;\r\n }\r\n\r\n /**\r\n * Sets the required values to the prepass renderer.\r\n * @param prePassRenderer defines the prepass renderer to setup.\r\n * @returns true if the pre pass is needed.\r\n */\r\n public setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean {\r\n if (this._prePassEffectConfiguration) {\r\n this._prePassEffectConfiguration = prePassRenderer.addEffectConfiguration(this._prePassEffectConfiguration);\r\n this._prePassEffectConfiguration.enabled = true;\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the post process.\r\n * @param camera The camera to dispose the post process on.\r\n */\r\n public dispose(camera?: Camera): void {\r\n camera = camera || this._camera;\r\n\r\n this._disposeTextures();\r\n\r\n let index;\r\n if (this._scene) {\r\n index = this._scene.postProcesses.indexOf(this);\r\n if (index !== -1) {\r\n this._scene.postProcesses.splice(index, 1);\r\n }\r\n }\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.postProcesses.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.postProcesses.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n index = this._engine.postProcesses.indexOf(this);\r\n if (index !== -1) {\r\n this._engine.postProcesses.splice(index, 1);\r\n }\r\n\r\n if (!camera) {\r\n return;\r\n }\r\n camera.detachPostProcess(this);\r\n\r\n index = camera._postProcesses.indexOf(this);\r\n if (index === 0 && camera._postProcesses.length > 0) {\r\n const firstPostProcess = this._camera._getFirstPostProcess();\r\n if (firstPostProcess) {\r\n firstPostProcess.markTextureDirty();\r\n }\r\n }\r\n\r\n this.onActivateObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onApplyObservable.clear();\r\n this.onBeforeRenderObservable.clear();\r\n this.onSizeChangedObservable.clear();\r\n }\r\n\r\n /**\r\n * Serializes the post process to a JSON object\r\n * @returns the JSON object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n const camera = this.getCamera() || (this._scene && this._scene.activeCamera);\r\n serializationObject.customType = \"BABYLON.\" + this.getClassName();\r\n serializationObject.cameraId = camera ? camera.id : null;\r\n serializationObject.reusable = this._reusable;\r\n serializationObject.textureType = this._textureType;\r\n serializationObject.fragmentUrl = this._fragmentUrl;\r\n serializationObject.parameters = this._parameters;\r\n serializationObject.samplers = this._samplers;\r\n serializationObject.options = this._options;\r\n serializationObject.defines = this._postProcessDefines;\r\n serializationObject.textureFormat = this._textureFormat;\r\n serializationObject.vertexUrl = this._vertexUrl;\r\n serializationObject.indexParameters = this._indexParameters;\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Clones this post process\r\n * @returns a new post process similar to this one\r\n */\r\n public clone(): Nullable {\r\n const serializationObject = this.serialize();\r\n serializationObject._engine = this._engine;\r\n serializationObject.cameraId = null;\r\n\r\n const result = PostProcess.Parse(serializationObject, this._scene, \"\");\r\n\r\n if (!result) {\r\n return null;\r\n }\r\n\r\n result.onActivateObservable = this.onActivateObservable.clone();\r\n result.onSizeChangedObservable = this.onSizeChangedObservable.clone();\r\n result.onApplyObservable = this.onApplyObservable.clone();\r\n result.onBeforeRenderObservable = this.onBeforeRenderObservable.clone();\r\n result.onAfterRenderObservable = this.onAfterRenderObservable.clone();\r\n\r\n result._prePassEffectConfiguration = this._prePassEffectConfiguration;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a material from parsed material data\r\n * @param parsedPostProcess defines parsed post process data\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures\r\n * @returns a new post process\r\n */\r\n public static Parse(parsedPostProcess: any, scene: Scene, rootUrl: string): Nullable {\r\n const postProcessType = GetClass(parsedPostProcess.customType);\r\n\r\n if (!postProcessType || !postProcessType._Parse) {\r\n return null;\r\n }\r\n\r\n const camera = scene ? scene.getCameraById(parsedPostProcess.cameraId) : null;\r\n return postProcessType._Parse(parsedPostProcess, camera, scene, rootUrl);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): Nullable {\r\n return SerializationHelper.Parse(\r\n () => {\r\n return new PostProcess(\r\n parsedPostProcess.name,\r\n parsedPostProcess.fragmentUrl,\r\n parsedPostProcess.parameters,\r\n parsedPostProcess.samplers,\r\n parsedPostProcess.options,\r\n targetCamera,\r\n parsedPostProcess.renderTargetSamplingMode,\r\n parsedPostProcess._engine,\r\n parsedPostProcess.reusable,\r\n parsedPostProcess.defines,\r\n parsedPostProcess.textureType,\r\n parsedPostProcess.vertexUrl,\r\n parsedPostProcess.indexParameters,\r\n false,\r\n parsedPostProcess.textureFormat\r\n );\r\n },\r\n parsedPostProcess,\r\n scene,\r\n rootUrl\r\n );\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.PostProcess\", PostProcess);\r\n", "import { NodeMaterialBlock } from \"../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport type { Scene } from \"../../../scene\";\r\n\r\n/**\r\n * Block used to create a Vector2/3/4 out of individual inputs (one for each component)\r\n */\r\nexport class VectorMergerBlock extends NodeMaterialBlock {\r\n /**\r\n * Gets or sets the swizzle for x (meaning which component to affect to the output.x)\r\n */\r\n public xSwizzle: \"x\" | \"y\" | \"z\" | \"w\" = \"x\";\r\n /**\r\n * Gets or sets the swizzle for y (meaning which component to affect to the output.y)\r\n */\r\n public ySwizzle: \"x\" | \"y\" | \"z\" | \"w\" = \"y\";\r\n /**\r\n * Gets or sets the swizzle for z (meaning which component to affect to the output.z)\r\n */\r\n public zSwizzle: \"x\" | \"y\" | \"z\" | \"w\" = \"z\";\r\n /**\r\n * Gets or sets the swizzle for w (meaning which component to affect to the output.w)\r\n */\r\n public wSwizzle: \"x\" | \"y\" | \"z\" | \"w\" = \"w\";\r\n\r\n /**\r\n * Create a new VectorMergerBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerInput(\"xyzw \", NodeMaterialBlockConnectionPointTypes.Vector4, true);\r\n this.registerInput(\"xyz \", NodeMaterialBlockConnectionPointTypes.Vector3, true);\r\n this.registerInput(\"xy \", NodeMaterialBlockConnectionPointTypes.Vector2, true);\r\n this.registerInput(\"zw \", NodeMaterialBlockConnectionPointTypes.Vector2, true);\r\n this.registerInput(\"x\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"y\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"z\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"w\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n\r\n this.registerOutput(\"xyzw\", NodeMaterialBlockConnectionPointTypes.Vector4);\r\n this.registerOutput(\"xyz\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerOutput(\"xy\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n this.registerOutput(\"zw\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"VectorMergerBlock\";\r\n }\r\n\r\n /**\r\n * Gets the xyzw component (input)\r\n */\r\n public get xyzwIn(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the xyz component (input)\r\n */\r\n public get xyzIn(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the xy component (input)\r\n */\r\n public get xyIn(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the zw component (input)\r\n */\r\n public get zwIn(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the x component (input)\r\n */\r\n public get x(): NodeMaterialConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the y component (input)\r\n */\r\n public get y(): NodeMaterialConnectionPoint {\r\n return this._inputs[5];\r\n }\r\n\r\n /**\r\n * Gets the z component (input)\r\n */\r\n public get z(): NodeMaterialConnectionPoint {\r\n return this._inputs[6];\r\n }\r\n\r\n /**\r\n * Gets the w component (input)\r\n */\r\n public get w(): NodeMaterialConnectionPoint {\r\n return this._inputs[7];\r\n }\r\n\r\n /**\r\n * Gets the xyzw component (output)\r\n */\r\n public get xyzw(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the xyz component (output)\r\n */\r\n public get xyzOut(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the xy component (output)\r\n */\r\n public get xyOut(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the zw component (output)\r\n */\r\n public get zwOut(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n\r\n /**\r\n * Gets the xy component (output)\r\n * @deprecated Please use xyOut instead.\r\n */\r\n public get xy(): NodeMaterialConnectionPoint {\r\n return this.xyOut;\r\n }\r\n\r\n /**\r\n * Gets the xyz component (output)\r\n * @deprecated Please use xyzOut instead.\r\n */\r\n public get xyz(): NodeMaterialConnectionPoint {\r\n return this.xyzOut;\r\n }\r\n\r\n protected _inputRename(name: string) {\r\n if (name === \"xyzw \") {\r\n return \"xyzwIn\";\r\n }\r\n if (name === \"xyz \") {\r\n return \"xyzIn\";\r\n }\r\n if (name === \"xy \") {\r\n return \"xyIn\";\r\n }\r\n if (name === \"zw \") {\r\n return \"zwIn\";\r\n }\r\n return name;\r\n }\r\n\r\n private _buildSwizzle(len: number) {\r\n const swizzle = this.xSwizzle + this.ySwizzle + this.zSwizzle + this.wSwizzle;\r\n\r\n return \".\" + swizzle.substr(0, len);\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const xInput = this.x;\r\n const yInput = this.y;\r\n const zInput = this.z;\r\n const wInput = this.w;\r\n const xyInput = this.xyIn;\r\n const zwInput = this.zwIn;\r\n const xyzInput = this.xyzIn;\r\n const xyzwInput = this.xyzwIn;\r\n\r\n const v4Output = this._outputs[0];\r\n const v3Output = this._outputs[1];\r\n const v2Output = this._outputs[2];\r\n const v2CompOutput = this._outputs[3];\r\n\r\n if (xyzwInput.isConnected) {\r\n if (v4Output.hasEndpoints) {\r\n state.compilationString += this._declareOutput(v4Output, state) + ` = ${xyzwInput.associatedVariableName}${this._buildSwizzle(4)};\\n`;\r\n }\r\n\r\n if (v3Output.hasEndpoints) {\r\n state.compilationString += this._declareOutput(v3Output, state) + ` = ${xyzwInput.associatedVariableName}${this._buildSwizzle(3)};\\n`;\r\n }\r\n\r\n if (v2Output.hasEndpoints) {\r\n state.compilationString += this._declareOutput(v2Output, state) + ` = ${xyzwInput.associatedVariableName}${this._buildSwizzle(2)};\\n`;\r\n }\r\n } else if (xyzInput.isConnected) {\r\n if (v4Output.hasEndpoints) {\r\n state.compilationString +=\r\n this._declareOutput(v4Output, state) +\r\n ` = vec4(${xyzInput.associatedVariableName}, ${wInput.isConnected ? this._writeVariable(wInput) : \"0.0\"})${this._buildSwizzle(4)};\\n`;\r\n }\r\n\r\n if (v3Output.hasEndpoints) {\r\n state.compilationString += this._declareOutput(v3Output, state) + ` = ${xyzInput.associatedVariableName}${this._buildSwizzle(3)};\\n`;\r\n }\r\n\r\n if (v2Output.hasEndpoints) {\r\n state.compilationString += this._declareOutput(v2Output, state) + ` = ${xyzInput.associatedVariableName}${this._buildSwizzle(2)};\\n`;\r\n }\r\n } else if (xyInput.isConnected) {\r\n if (v4Output.hasEndpoints) {\r\n if (zwInput.isConnected) {\r\n state.compilationString +=\r\n this._declareOutput(v4Output, state) + ` = vec4(${xyInput.associatedVariableName}, ${zwInput.associatedVariableName})${this._buildSwizzle(4)};\\n`;\r\n } else {\r\n state.compilationString +=\r\n this._declareOutput(v4Output, state) +\r\n ` = vec4(${xyInput.associatedVariableName}, ${zInput.isConnected ? this._writeVariable(zInput) : \"0.0\"}, ${\r\n wInput.isConnected ? this._writeVariable(wInput) : \"0.0\"\r\n })${this._buildSwizzle(4)};\\n`;\r\n }\r\n }\r\n\r\n if (v3Output.hasEndpoints) {\r\n state.compilationString +=\r\n this._declareOutput(v3Output, state) +\r\n ` = vec3(${xyInput.associatedVariableName}, ${zInput.isConnected ? this._writeVariable(zInput) : \"0.0\"})${this._buildSwizzle(3)};\\n`;\r\n }\r\n\r\n if (v2Output.hasEndpoints) {\r\n state.compilationString += this._declareOutput(v2Output, state) + ` = ${xyInput.associatedVariableName}${this._buildSwizzle(2)};\\n`;\r\n }\r\n\r\n if (v2CompOutput.hasEndpoints) {\r\n if (zwInput.isConnected) {\r\n state.compilationString += this._declareOutput(v2CompOutput, state) + ` = ${zwInput.associatedVariableName}${this._buildSwizzle(2)};\\n`;\r\n } else {\r\n state.compilationString +=\r\n this._declareOutput(v2CompOutput, state) +\r\n ` = vec2(${zInput.isConnected ? this._writeVariable(zInput) : \"0.0\"}, ${wInput.isConnected ? this._writeVariable(wInput) : \"0.0\"})${this._buildSwizzle(\r\n 2\r\n )};\\n`;\r\n }\r\n }\r\n } else {\r\n if (v4Output.hasEndpoints) {\r\n if (zwInput.isConnected) {\r\n state.compilationString +=\r\n this._declareOutput(v4Output, state) +\r\n ` = vec4(${xInput.isConnected ? this._writeVariable(xInput) : \"0.0\"}, ${yInput.isConnected ? this._writeVariable(yInput) : \"0.0\"}, ${\r\n zwInput.associatedVariableName\r\n })${this._buildSwizzle(4)};\\n`;\r\n } else {\r\n state.compilationString +=\r\n this._declareOutput(v4Output, state) +\r\n ` = vec4(${xInput.isConnected ? this._writeVariable(xInput) : \"0.0\"}, ${yInput.isConnected ? this._writeVariable(yInput) : \"0.0\"}, ${\r\n zInput.isConnected ? this._writeVariable(zInput) : \"0.0\"\r\n }, ${wInput.isConnected ? this._writeVariable(wInput) : \"0.0\"})${this._buildSwizzle(4)};\\n`;\r\n }\r\n }\r\n\r\n if (v3Output.hasEndpoints) {\r\n state.compilationString +=\r\n this._declareOutput(v3Output, state) +\r\n ` = vec3(${xInput.isConnected ? this._writeVariable(xInput) : \"0.0\"}, ${yInput.isConnected ? this._writeVariable(yInput) : \"0.0\"}, ${\r\n zInput.isConnected ? this._writeVariable(zInput) : \"0.0\"\r\n })${this._buildSwizzle(3)};\\n`;\r\n }\r\n\r\n if (v2Output.hasEndpoints) {\r\n state.compilationString +=\r\n this._declareOutput(v2Output, state) +\r\n ` = vec2(${xInput.isConnected ? this._writeVariable(xInput) : \"0.0\"}, ${yInput.isConnected ? this._writeVariable(yInput) : \"0.0\"})${this._buildSwizzle(2)};\\n`;\r\n }\r\n\r\n if (v2CompOutput.hasEndpoints) {\r\n if (zwInput.isConnected) {\r\n state.compilationString += this._declareOutput(v2CompOutput, state) + ` = ${zwInput.associatedVariableName}${this._buildSwizzle(2)};\\n`;\r\n } else {\r\n state.compilationString +=\r\n this._declareOutput(v2CompOutput, state) +\r\n ` = vec2(${zInput.isConnected ? this._writeVariable(zInput) : \"0.0\"}, ${wInput.isConnected ? this._writeVariable(wInput) : \"0.0\"})${this._buildSwizzle(\r\n 2\r\n )};\\n`;\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.xSwizzle = this.xSwizzle;\r\n serializationObject.ySwizzle = this.ySwizzle;\r\n serializationObject.zSwizzle = this.zSwizzle;\r\n serializationObject.wSwizzle = this.wSwizzle;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.xSwizzle = serializationObject.xSwizzle ?? \"x\";\r\n this.ySwizzle = serializationObject.ySwizzle ?? \"y\";\r\n this.zSwizzle = serializationObject.zSwizzle ?? \"z\";\r\n this.wSwizzle = serializationObject.wSwizzle ?? \"w\";\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode();\r\n codeString += `${this._codeVariableName}.xSwizzle = \"${this.xSwizzle}\";\\n`;\r\n codeString += `${this._codeVariableName}.ySwizzle = \"${this.ySwizzle}\";\\n`;\r\n codeString += `${this._codeVariableName}.zSwizzle = \"${this.zSwizzle}\";\\n`;\r\n codeString += `${this._codeVariableName}.wSwizzle = \"${this.wSwizzle}\";\\n`;\r\n\r\n return codeString;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.VectorMergerBlock\", VectorMergerBlock);\r\n", "import { NodeMaterialBlock } from \"../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../nodeMaterialBuildState\";\r\nimport type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { Vector2 } from \"../../../Maths/math.vector\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../Decorators/nodeDecorator\";\r\n/**\r\n * Block used to remap a float from a range to a new one\r\n */\r\nexport class RemapBlock extends NodeMaterialBlock {\r\n /**\r\n * Gets or sets the source range\r\n */\r\n @editableInPropertyPage(\"From\", PropertyTypeForEdition.Vector2)\r\n public sourceRange = new Vector2(-1, 1);\r\n\r\n /**\r\n * Gets or sets the target range\r\n */\r\n @editableInPropertyPage(\"To\", PropertyTypeForEdition.Vector2)\r\n public targetRange = new Vector2(0, 1);\r\n\r\n /**\r\n * Creates a new RemapBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerInput(\"input\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerInput(\"sourceMin\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"sourceMax\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"targetMin\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"targetMax\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n\r\n this.registerOutput(\"output\", NodeMaterialBlockConnectionPointTypes.BasedOnInput);\r\n\r\n this._outputs[0]._typeConnectionSource = this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"RemapBlock\";\r\n }\r\n\r\n /**\r\n * Gets the input component\r\n */\r\n public get input(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the source min input component\r\n */\r\n public get sourceMin(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the source max input component\r\n */\r\n public get sourceMax(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the target min input component\r\n */\r\n public get targetMin(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the target max input component\r\n */\r\n public get targetMax(): NodeMaterialConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const output = this._outputs[0];\r\n\r\n const sourceMin = this.sourceMin.isConnected ? this.sourceMin.associatedVariableName : this._writeFloat(this.sourceRange.x);\r\n const sourceMax = this.sourceMax.isConnected ? this.sourceMax.associatedVariableName : this._writeFloat(this.sourceRange.y);\r\n\r\n const targetMin = this.targetMin.isConnected ? this.targetMin.associatedVariableName : this._writeFloat(this.targetRange.x);\r\n const targetMax = this.targetMax.isConnected ? this.targetMax.associatedVariableName : this._writeFloat(this.targetRange.y);\r\n\r\n state.compilationString +=\r\n this._declareOutput(output, state) +\r\n ` = ${targetMin} + (${this._inputs[0].associatedVariableName} - ${sourceMin}) * (${targetMax} - ${targetMin}) / (${sourceMax} - ${sourceMin});\\n`;\r\n\r\n return this;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode() + `${this._codeVariableName}.sourceRange = new BABYLON.Vector2(${this.sourceRange.x}, ${this.sourceRange.y});\\n`;\r\n\r\n codeString += `${this._codeVariableName}.targetRange = new BABYLON.Vector2(${this.targetRange.x}, ${this.targetRange.y});\\n`;\r\n\r\n return codeString;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.sourceRange = this.sourceRange.asArray();\r\n serializationObject.targetRange = this.targetRange.asArray();\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.sourceRange = Vector2.FromArray(serializationObject.sourceRange);\r\n this.targetRange = Vector2.FromArray(serializationObject.targetRange);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.RemapBlock\", RemapBlock);\r\n", "import type { Observer } from \"core/Misc/observable\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport { NodeMaterialBlock } from \"../nodeMaterialBlock\";\r\nimport type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../Enums/nodeMaterialBlockConnectionPointTypes\";\r\n\r\n/**\r\n * Block used to perform a mathematical operation on 2 values\r\n */\r\nexport class BaseMathBlock extends NodeMaterialBlock {\r\n private readonly _connectionObservers: Observer[];\r\n\r\n protected constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerInput(\"left\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerInput(\"right\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerOutput(\"output\", NodeMaterialBlockConnectionPointTypes.BasedOnInput);\r\n\r\n this.output._typeConnectionSource = this.left;\r\n this._linkConnectionTypes(0, 1, true);\r\n\r\n this.left.acceptedConnectionPointTypes.push(NodeMaterialBlockConnectionPointTypes.Float);\r\n this.right.acceptedConnectionPointTypes.push(NodeMaterialBlockConnectionPointTypes.Float);\r\n\r\n this._connectionObservers = [\r\n this.left.onConnectionObservable.add(() => this._updateInputOutputTypes()),\r\n this.left.onDisconnectionObservable.add(() => this._updateInputOutputTypes()),\r\n this.right.onConnectionObservable.add(() => this._updateInputOutputTypes()),\r\n this.right.onDisconnectionObservable.add(() => this._updateInputOutputTypes()),\r\n ];\r\n }\r\n\r\n /**\r\n * Gets the left operand input component\r\n */\r\n public get left(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the right operand input component\r\n */\r\n public get right(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n private _updateInputOutputTypes() {\r\n // First update the output type with the initial assumption that we'll base it on the left input.\r\n this.output._typeConnectionSource = this.left;\r\n\r\n if (this.left.isConnected && this.right.isConnected) {\r\n // Both inputs are connected, so we need to determine the output type based on the input types.\r\n if (\r\n this.left.type === NodeMaterialBlockConnectionPointTypes.Int ||\r\n (this.left.type === NodeMaterialBlockConnectionPointTypes.Float && this.right.type !== NodeMaterialBlockConnectionPointTypes.Int)\r\n ) {\r\n this.output._typeConnectionSource = this.right;\r\n }\r\n } else if (this.left.isConnected !== this.right.isConnected) {\r\n // Only one input is connected, so we need to determine the output type based on the connected input.\r\n this.output._typeConnectionSource = this.left.isConnected ? this.left : this.right;\r\n }\r\n\r\n // Next update the accepted connection point types for the inputs based on the current input connection state.\r\n if (this.left.isConnected || this.right.isConnected) {\r\n for (const [first, second] of [\r\n [this.left, this.right],\r\n [this.right, this.left],\r\n ]) {\r\n // Always allow Ints and Floats.\r\n first.acceptedConnectionPointTypes = [NodeMaterialBlockConnectionPointTypes.Int, NodeMaterialBlockConnectionPointTypes.Float];\r\n\r\n if (second.isConnected) {\r\n // The same types as the connected input are always allowed.\r\n first.acceptedConnectionPointTypes.push(second.type);\r\n\r\n // If the other input is a scalar, then we also allow Vector/Color/Matrix types.\r\n if (second.type === NodeMaterialBlockConnectionPointTypes.Int || second.type === NodeMaterialBlockConnectionPointTypes.Float) {\r\n first.acceptedConnectionPointTypes.push(\r\n NodeMaterialBlockConnectionPointTypes.Vector2,\r\n NodeMaterialBlockConnectionPointTypes.Vector3,\r\n NodeMaterialBlockConnectionPointTypes.Vector4,\r\n NodeMaterialBlockConnectionPointTypes.Color3,\r\n NodeMaterialBlockConnectionPointTypes.Color4,\r\n NodeMaterialBlockConnectionPointTypes.Matrix\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Release resources\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this._connectionObservers.forEach((observer) => observer.remove());\r\n this._connectionObservers.length = 0;\r\n }\r\n}\r\n", "import type { NodeMaterialBuildState } from \"../nodeMaterialBuildState\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { BaseMathBlock } from \"./baseMathBlock\";\r\n\r\n/**\r\n * Block used to multiply 2 values\r\n */\r\nexport class MultiplyBlock extends BaseMathBlock {\r\n /**\r\n * Creates a new MultiplyBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"MultiplyBlock\";\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n state.compilationString += this._declareOutput(this.output, state) + ` = ${this.left.associatedVariableName} * ${this.right.associatedVariableName};\\n`;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.MultiplyBlock\", MultiplyBlock);\r\n", "/**\r\n * Enum used to define the material modes\r\n */\r\nexport enum NodeMaterialModes {\r\n /** Regular material */\r\n Material = 0,\r\n /** For post process */\r\n PostProcess = 1,\r\n /** For particle system */\r\n Particle = 2,\r\n /** For procedural texture */\r\n ProceduralTexture = 3,\r\n}\r\n", "import { MaterialDefines } from \"./materialDefines\";\r\n/**\r\n * Interface to follow in your material defines to integrate easily the\r\n * Image processing functions.\r\n * @internal\r\n */\r\nexport interface IImageProcessingConfigurationDefines {\r\n IMAGEPROCESSING: boolean;\r\n VIGNETTE: boolean;\r\n VIGNETTEBLENDMODEMULTIPLY: boolean;\r\n VIGNETTEBLENDMODEOPAQUE: boolean;\r\n TONEMAPPING: boolean;\r\n TONEMAPPING_ACES: boolean;\r\n CONTRAST: boolean;\r\n EXPOSURE: boolean;\r\n COLORCURVES: boolean;\r\n COLORGRADING: boolean;\r\n COLORGRADING3D: boolean;\r\n SAMPLER3DGREENDEPTH: boolean;\r\n SAMPLER3DBGRMAP: boolean;\r\n DITHER: boolean;\r\n IMAGEPROCESSINGPOSTPROCESS: boolean;\r\n SKIPFINALCOLORCLAMP: boolean;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ImageProcessingConfigurationDefines extends MaterialDefines implements IImageProcessingConfigurationDefines {\r\n public IMAGEPROCESSING = false;\r\n public VIGNETTE = false;\r\n public VIGNETTEBLENDMODEMULTIPLY = false;\r\n public VIGNETTEBLENDMODEOPAQUE = false;\r\n public TONEMAPPING = false;\r\n public TONEMAPPING_ACES = false;\r\n public CONTRAST = false;\r\n public COLORCURVES = false;\r\n public COLORGRADING = false;\r\n public COLORGRADING3D = false;\r\n public SAMPLER3DGREENDEPTH = false;\r\n public SAMPLER3DBGRMAP = false;\r\n public DITHER = false;\r\n public IMAGEPROCESSINGPOSTPROCESS = false;\r\n public EXPOSURE = false;\r\n public SKIPFINALCOLORCLAMP = false;\r\n\r\n constructor() {\r\n super();\r\n this.rebuild();\r\n }\r\n}\r\n", "/* eslint-disable import/no-internal-modules */\r\nimport type { Nullable } from \"../types\";\r\nimport { Vector2, Vector3 } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { ImageProcessingConfiguration } from \"../Materials/imageProcessingConfiguration\";\r\nimport { ImageProcessingConfigurationDefines } from \"../Materials/imageProcessingConfiguration.defines\";\r\nimport type { ColorGradient, FactorGradient, Color3Gradient, IValueGradient } from \"../Misc/gradients\";\r\nimport type { BoxParticleEmitter } from \"../Particles/EmitterTypes/boxParticleEmitter\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\n\r\nimport \"../Engines/Extensions/engine.dynamicBuffer\";\r\nimport type { IClipPlanesHolder } from \"../Misc/interfaces/iClipPlanesHolder\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport type { Animation } from \"../Animations/animation\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { ProceduralTexture } from \"../Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport type { IParticleEmitterType } from \"./EmitterTypes/IParticleEmitterType\";\r\nimport type { PointParticleEmitter } from \"./EmitterTypes/pointParticleEmitter\";\r\nimport type { HemisphericParticleEmitter } from \"./EmitterTypes/hemisphericParticleEmitter\";\r\nimport type { SphereDirectedParticleEmitter, SphereParticleEmitter } from \"./EmitterTypes/sphereParticleEmitter\";\r\nimport type { CylinderDirectedParticleEmitter, CylinderParticleEmitter } from \"./EmitterTypes/cylinderParticleEmitter\";\r\nimport type { ConeParticleEmitter } from \"./EmitterTypes/coneParticleEmitter\";\r\n\r\n/**\r\n * This represents the base class for particle system in Babylon.\r\n * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust.\r\n * Particles can take different shapes while emitted like box, sphere, cone or you can write your custom function.\r\n * @example https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro\r\n */\r\nexport class BaseParticleSystem implements IClipPlanesHolder {\r\n /**\r\n * Source color is added to the destination color without alpha affecting the result\r\n */\r\n public static BLENDMODE_ONEONE = 0;\r\n /**\r\n * Blend current color and particle color using particle’s alpha\r\n */\r\n public static BLENDMODE_STANDARD = 1;\r\n /**\r\n * Add current color and particle color multiplied by particle’s alpha\r\n */\r\n public static BLENDMODE_ADD = 2;\r\n /**\r\n * Multiply current color with particle color\r\n */\r\n public static BLENDMODE_MULTIPLY = 3;\r\n\r\n /**\r\n * Multiply current color with particle color then add current color and particle color multiplied by particle’s alpha\r\n */\r\n public static BLENDMODE_MULTIPLYADD = 4;\r\n\r\n /**\r\n * List of animations used by the particle system.\r\n */\r\n public animations: Animation[] = [];\r\n\r\n /**\r\n * Gets or sets the unique id of the particle system\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * The id of the Particle system.\r\n */\r\n public id: string;\r\n\r\n /**\r\n * The friendly name of the Particle system.\r\n */\r\n public name: string;\r\n\r\n /**\r\n * Snippet ID if the particle system was created from the snippet server\r\n */\r\n public snippetId: string;\r\n\r\n /**\r\n * The rendering group used by the Particle system to chose when to render.\r\n */\r\n public renderingGroupId = 0;\r\n\r\n /**\r\n * The emitter represents the Mesh or position we are attaching the particle system to.\r\n */\r\n public emitter: Nullable = Vector3.Zero();\r\n\r\n /**\r\n * The maximum number of particles to emit per frame\r\n */\r\n public emitRate = 10;\r\n\r\n /**\r\n * If you want to launch only a few particles at once, that can be done, as well.\r\n */\r\n public manualEmitCount = -1;\r\n\r\n /**\r\n * The overall motion speed (0.01 is default update speed, faster updates = faster animation)\r\n */\r\n public updateSpeed = 0.01;\r\n\r\n /**\r\n * The amount of time the particle system is running (depends of the overall update speed).\r\n */\r\n public targetStopDuration = 0;\r\n\r\n /**\r\n * Specifies whether the particle system will be disposed once it reaches the end of the animation.\r\n */\r\n public disposeOnStop = false;\r\n\r\n /**\r\n * Minimum power of emitting particles.\r\n */\r\n public minEmitPower = 1;\r\n /**\r\n * Maximum power of emitting particles.\r\n */\r\n public maxEmitPower = 1;\r\n\r\n /**\r\n * Minimum life time of emitting particles.\r\n */\r\n public minLifeTime = 1;\r\n /**\r\n * Maximum life time of emitting particles.\r\n */\r\n public maxLifeTime = 1;\r\n\r\n /**\r\n * Minimum Size of emitting particles.\r\n */\r\n public minSize = 1;\r\n /**\r\n * Maximum Size of emitting particles.\r\n */\r\n public maxSize = 1;\r\n\r\n /**\r\n * Minimum scale of emitting particles on X axis.\r\n */\r\n public minScaleX = 1;\r\n /**\r\n * Maximum scale of emitting particles on X axis.\r\n */\r\n public maxScaleX = 1;\r\n\r\n /**\r\n * Minimum scale of emitting particles on Y axis.\r\n */\r\n public minScaleY = 1;\r\n /**\r\n * Maximum scale of emitting particles on Y axis.\r\n */\r\n public maxScaleY = 1;\r\n\r\n /**\r\n * Gets or sets the minimal initial rotation in radians.\r\n */\r\n public minInitialRotation = 0;\r\n /**\r\n * Gets or sets the maximal initial rotation in radians.\r\n */\r\n public maxInitialRotation = 0;\r\n\r\n /**\r\n * Minimum angular speed of emitting particles (Z-axis rotation for each particle).\r\n */\r\n public minAngularSpeed = 0;\r\n /**\r\n * Maximum angular speed of emitting particles (Z-axis rotation for each particle).\r\n */\r\n public maxAngularSpeed = 0;\r\n\r\n /**\r\n * The texture used to render each particle. (this can be a spritesheet)\r\n */\r\n public particleTexture: Nullable;\r\n\r\n /**\r\n * The layer mask we are rendering the particles through.\r\n */\r\n public layerMask: number = 0x0fffffff;\r\n\r\n /**\r\n * This can help using your own shader to render the particle system.\r\n * The according effect will be created\r\n */\r\n public customShader: any = null;\r\n\r\n /**\r\n * By default particle system starts as soon as they are created. This prevents the\r\n * automatic start to happen and let you decide when to start emitting particles.\r\n */\r\n public preventAutoStart: boolean = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this particle system will allow fog to be rendered on it (false by default)\r\n */\r\n public applyFog = false;\r\n\r\n /** @internal */\r\n _wasDispatched = false;\r\n\r\n protected _rootUrl = \"\";\r\n private _noiseTexture: Nullable;\r\n\r\n /**\r\n * Gets or sets a texture used to add random noise to particle positions\r\n */\r\n public get noiseTexture(): Nullable {\r\n return this._noiseTexture;\r\n }\r\n\r\n public set noiseTexture(value: Nullable) {\r\n if (this._noiseTexture === value) {\r\n return;\r\n }\r\n\r\n this._noiseTexture = value;\r\n this._reset();\r\n }\r\n\r\n /** Gets or sets the strength to apply to the noise value (default is (10, 10, 10)) */\r\n public noiseStrength = new Vector3(10, 10, 10);\r\n\r\n /**\r\n * Callback triggered when the particle animation is ending.\r\n */\r\n public onAnimationEnd: Nullable<() => void> = null;\r\n\r\n /**\r\n * Blend mode use to render the particle, it can be either ParticleSystem.BLENDMODE_ONEONE or ParticleSystem.BLENDMODE_STANDARD.\r\n */\r\n public blendMode = BaseParticleSystem.BLENDMODE_ONEONE;\r\n\r\n /**\r\n * Forces the particle to write their depth information to the depth buffer. This can help preventing other draw calls\r\n * to override the particles.\r\n */\r\n public forceDepthWrite = false;\r\n\r\n /** Gets or sets a value indicating how many cycles (or frames) must be executed before first rendering (this value has to be set before starting the system). Default is 0 */\r\n public preWarmCycles = 0;\r\n\r\n /** Gets or sets a value indicating the time step multiplier to use in pre-warm mode (default is 1) */\r\n public preWarmStepOffset = 1;\r\n\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled) defines the speed of the sprite loop (default is 1 meaning the animation will play once during the entire particle lifetime)\r\n */\r\n public spriteCellChangeSpeed = 1;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled) defines the first sprite cell to display\r\n */\r\n public startSpriteCellID = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled) defines the last sprite cell to display\r\n */\r\n public endSpriteCellID = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled), defines the sprite cell width to use\r\n */\r\n public spriteCellWidth = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled), defines the sprite cell height to use\r\n */\r\n public spriteCellHeight = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled), defines wether the sprite animation is looping\r\n */\r\n public spriteCellLoop = true;\r\n /**\r\n * This allows the system to random pick the start cell ID between startSpriteCellID and endSpriteCellID\r\n */\r\n public spriteRandomStartCell = false;\r\n\r\n /** Gets or sets a Vector2 used to move the pivot (by default (0,0)) */\r\n public translationPivot = new Vector2(0, 0);\r\n\r\n /** @internal */\r\n public _isAnimationSheetEnabled: boolean;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that hosted animations (in the system.animations array) must be started when system.start() is called\r\n */\r\n public beginAnimationOnStart = false;\r\n\r\n /**\r\n * Gets or sets the frame to start the animation from when beginAnimationOnStart is true\r\n */\r\n public beginAnimationFrom = 0;\r\n\r\n /**\r\n * Gets or sets the frame to end the animation on when beginAnimationOnStart is true\r\n */\r\n public beginAnimationTo = 60;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if animations must loop when beginAnimationOnStart is true\r\n */\r\n public beginAnimationLoop = false;\r\n\r\n /**\r\n * Gets or sets a world offset applied to all particles\r\n */\r\n public worldOffset = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Gets or sets the active clipplane 1\r\n */\r\n public clipPlane: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 2\r\n */\r\n public clipPlane2: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 3\r\n */\r\n public clipPlane3: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 4\r\n */\r\n public clipPlane4: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 5\r\n */\r\n public clipPlane5: Nullable;\r\n\r\n /**\r\n * Gets or sets the active clipplane 6\r\n */\r\n public clipPlane6: Nullable;\r\n\r\n /**\r\n * Gets or sets whether an animation sprite sheet is enabled or not on the particle system\r\n */\r\n public get isAnimationSheetEnabled(): boolean {\r\n return this._isAnimationSheetEnabled;\r\n }\r\n\r\n public set isAnimationSheetEnabled(value: boolean) {\r\n if (this._isAnimationSheetEnabled == value) {\r\n return;\r\n }\r\n\r\n this._isAnimationSheetEnabled = value;\r\n\r\n this._reset();\r\n }\r\n\r\n private _useLogarithmicDepth: boolean = false;\r\n\r\n /**\r\n * Gets or sets a boolean enabling the use of logarithmic depth buffers, which is good for wide depth buffers.\r\n */\r\n public get useLogarithmicDepth(): boolean {\r\n return this._useLogarithmicDepth;\r\n }\r\n\r\n public set useLogarithmicDepth(value: boolean) {\r\n this._useLogarithmicDepth = value && this.getScene()!.getEngine().getCaps().fragmentDepthSupported;\r\n }\r\n\r\n /**\r\n * Get hosting scene\r\n * @returns the scene\r\n */\r\n public getScene(): Nullable {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * You can use gravity if you want to give an orientation to your particles.\r\n */\r\n public gravity = Vector3.Zero();\r\n\r\n protected _colorGradients: Nullable> = null;\r\n protected _sizeGradients: Nullable> = null;\r\n protected _lifeTimeGradients: Nullable> = null;\r\n protected _angularSpeedGradients: Nullable> = null;\r\n protected _velocityGradients: Nullable> = null;\r\n protected _limitVelocityGradients: Nullable> = null;\r\n protected _dragGradients: Nullable> = null;\r\n protected _emitRateGradients: Nullable> = null;\r\n protected _startSizeGradients: Nullable> = null;\r\n protected _rampGradients: Nullable> = null;\r\n protected _colorRemapGradients: Nullable> = null;\r\n protected _alphaRemapGradients: Nullable> = null;\r\n\r\n protected _hasTargetStopDurationDependantGradient() {\r\n return (\r\n (this._startSizeGradients && this._startSizeGradients.length > 0) ||\r\n (this._emitRateGradients && this._emitRateGradients.length > 0) ||\r\n (this._lifeTimeGradients && this._lifeTimeGradients.length > 0)\r\n );\r\n }\r\n\r\n /**\r\n * Defines the delay in milliseconds before starting the system (0 by default)\r\n */\r\n public startDelay = 0;\r\n\r\n /**\r\n * Gets the current list of drag gradients.\r\n * You must use addDragGradient and removeDragGradient to update this list\r\n * @returns the list of drag gradients\r\n */\r\n public getDragGradients(): Nullable> {\r\n return this._dragGradients;\r\n }\r\n\r\n /** Gets or sets a value indicating the damping to apply if the limit velocity factor is reached */\r\n public limitVelocityDamping = 0.4;\r\n\r\n /**\r\n * Gets the current list of limit velocity gradients.\r\n * You must use addLimitVelocityGradient and removeLimitVelocityGradient to update this list\r\n * @returns the list of limit velocity gradients\r\n */\r\n public getLimitVelocityGradients(): Nullable> {\r\n return this._limitVelocityGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of color gradients.\r\n * You must use addColorGradient and removeColorGradient to update this list\r\n * @returns the list of color gradients\r\n */\r\n public getColorGradients(): Nullable> {\r\n return this._colorGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of size gradients.\r\n * You must use addSizeGradient and removeSizeGradient to update this list\r\n * @returns the list of size gradients\r\n */\r\n public getSizeGradients(): Nullable> {\r\n return this._sizeGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of color remap gradients.\r\n * You must use addColorRemapGradient and removeColorRemapGradient to update this list\r\n * @returns the list of color remap gradients\r\n */\r\n public getColorRemapGradients(): Nullable> {\r\n return this._colorRemapGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of alpha remap gradients.\r\n * You must use addAlphaRemapGradient and removeAlphaRemapGradient to update this list\r\n * @returns the list of alpha remap gradients\r\n */\r\n public getAlphaRemapGradients(): Nullable> {\r\n return this._alphaRemapGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of life time gradients.\r\n * You must use addLifeTimeGradient and removeLifeTimeGradient to update this list\r\n * @returns the list of life time gradients\r\n */\r\n public getLifeTimeGradients(): Nullable> {\r\n return this._lifeTimeGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of angular speed gradients.\r\n * You must use addAngularSpeedGradient and removeAngularSpeedGradient to update this list\r\n * @returns the list of angular speed gradients\r\n */\r\n public getAngularSpeedGradients(): Nullable> {\r\n return this._angularSpeedGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of velocity gradients.\r\n * You must use addVelocityGradient and removeVelocityGradient to update this list\r\n * @returns the list of velocity gradients\r\n */\r\n public getVelocityGradients(): Nullable> {\r\n return this._velocityGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of start size gradients.\r\n * You must use addStartSizeGradient and removeStartSizeGradient to update this list\r\n * @returns the list of start size gradients\r\n */\r\n public getStartSizeGradients(): Nullable> {\r\n return this._startSizeGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of emit rate gradients.\r\n * You must use addEmitRateGradient and removeEmitRateGradient to update this list\r\n * @returns the list of emit rate gradients\r\n */\r\n public getEmitRateGradients(): Nullable> {\r\n return this._emitRateGradients;\r\n }\r\n\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get direction1(): Vector3 {\r\n if ((this.particleEmitterType).direction1) {\r\n return (this.particleEmitterType).direction1;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set direction1(value: Vector3) {\r\n if ((this.particleEmitterType).direction1) {\r\n (this.particleEmitterType).direction1 = value;\r\n }\r\n }\r\n\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get direction2(): Vector3 {\r\n if ((this.particleEmitterType).direction2) {\r\n return (this.particleEmitterType).direction2;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set direction2(value: Vector3) {\r\n if ((this.particleEmitterType).direction2) {\r\n (this.particleEmitterType).direction2 = value;\r\n }\r\n }\r\n\r\n /**\r\n * Minimum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get minEmitBox(): Vector3 {\r\n if ((this.particleEmitterType).minEmitBox) {\r\n return (this.particleEmitterType).minEmitBox;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set minEmitBox(value: Vector3) {\r\n if ((this.particleEmitterType).minEmitBox) {\r\n (this.particleEmitterType).minEmitBox = value;\r\n }\r\n }\r\n\r\n /**\r\n * Maximum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get maxEmitBox(): Vector3 {\r\n if ((this.particleEmitterType).maxEmitBox) {\r\n return (this.particleEmitterType).maxEmitBox;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set maxEmitBox(value: Vector3) {\r\n if ((this.particleEmitterType).maxEmitBox) {\r\n (this.particleEmitterType).maxEmitBox = value;\r\n }\r\n }\r\n\r\n /**\r\n * Random color of each particle after it has been emitted, between color1 and color2 vectors\r\n */\r\n public color1 = new Color4(1.0, 1.0, 1.0, 1.0);\r\n /**\r\n * Random color of each particle after it has been emitted, between color1 and color2 vectors\r\n */\r\n public color2 = new Color4(1.0, 1.0, 1.0, 1.0);\r\n /**\r\n * Color the particle will have at the end of its lifetime\r\n */\r\n public colorDead = new Color4(0, 0, 0, 1.0);\r\n\r\n /**\r\n * An optional mask to filter some colors out of the texture, or filter a part of the alpha channel\r\n */\r\n public textureMask = new Color4(1.0, 1.0, 1.0, 1.0);\r\n\r\n /**\r\n * The particle emitter type defines the emitter used by the particle system.\r\n * It can be for example box, sphere, or cone...\r\n */\r\n public particleEmitterType: IParticleEmitterType;\r\n\r\n /** @internal */\r\n public _isSubEmitter = false;\r\n\r\n /** @internal */\r\n public _billboardMode = Constants.PARTICLES_BILLBOARDMODE_ALL;\r\n /**\r\n * Gets or sets the billboard mode to use when isBillboardBased = true.\r\n * Value can be: ParticleSystem.BILLBOARDMODE_ALL, ParticleSystem.BILLBOARDMODE_Y, ParticleSystem.BILLBOARDMODE_STRETCHED\r\n */\r\n public get billboardMode(): number {\r\n return this._billboardMode;\r\n }\r\n\r\n public set billboardMode(value: number) {\r\n if (this._billboardMode === value) {\r\n return;\r\n }\r\n\r\n this._billboardMode = value;\r\n this._reset();\r\n }\r\n\r\n /** @internal */\r\n public _isBillboardBased = true;\r\n /**\r\n * Gets or sets a boolean indicating if the particles must be rendered as billboard or aligned with the direction\r\n */\r\n public get isBillboardBased(): boolean {\r\n return this._isBillboardBased;\r\n }\r\n\r\n public set isBillboardBased(value: boolean) {\r\n if (this._isBillboardBased === value) {\r\n return;\r\n }\r\n\r\n this._isBillboardBased = value;\r\n this._reset();\r\n }\r\n\r\n /**\r\n * The scene the particle system belongs to.\r\n */\r\n protected _scene: Nullable;\r\n\r\n /**\r\n * The engine the particle system belongs to.\r\n */\r\n protected _engine: ThinEngine;\r\n\r\n /**\r\n * Local cache of defines for image processing.\r\n */\r\n protected _imageProcessingConfigurationDefines = new ImageProcessingConfigurationDefines();\r\n\r\n /**\r\n * Default configuration related to image processing available in the standard Material.\r\n */\r\n protected _imageProcessingConfiguration: Nullable;\r\n\r\n /**\r\n * Gets the image processing configuration used either in this material.\r\n */\r\n public get imageProcessingConfiguration(): Nullable {\r\n return this._imageProcessingConfiguration;\r\n }\r\n\r\n /**\r\n * Sets the Default image processing configuration used either in the this material.\r\n *\r\n * If sets to null, the scene one is in use.\r\n */\r\n public set imageProcessingConfiguration(value: Nullable) {\r\n this._attachImageProcessingConfiguration(value);\r\n }\r\n\r\n /**\r\n * Attaches a new image processing configuration to the Standard Material.\r\n * @param configuration\r\n */\r\n protected _attachImageProcessingConfiguration(configuration: Nullable): void {\r\n if (configuration === this._imageProcessingConfiguration) {\r\n return;\r\n }\r\n\r\n // Pick the scene configuration if needed.\r\n if (!configuration && this._scene) {\r\n this._imageProcessingConfiguration = this._scene.imageProcessingConfiguration;\r\n } else {\r\n this._imageProcessingConfiguration = configuration;\r\n }\r\n }\r\n\r\n /** @internal */\r\n protected _reset() {}\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _removeGradientAndTexture(gradient: number, gradients: Nullable, texture: Nullable): BaseParticleSystem {\r\n if (!gradients) {\r\n return this;\r\n }\r\n\r\n let index = 0;\r\n for (const valueGradient of gradients) {\r\n if (valueGradient.gradient === gradient) {\r\n gradients.splice(index, 1);\r\n break;\r\n }\r\n index++;\r\n }\r\n\r\n if (texture) {\r\n texture.dispose();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Instantiates a particle system.\r\n * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust.\r\n * @param name The name of the particle system\r\n */\r\n public constructor(name: string) {\r\n this.id = name;\r\n this.name = name;\r\n }\r\n\r\n /**\r\n * Creates a Point Emitter for the particle system (emits directly from the emitter position)\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the box\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the box\r\n */\r\n public createPointEmitter(direction1: Vector3, direction2: Vector3): PointParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Hemisphere Emitter for the particle system (emits along the hemisphere radius)\r\n * @param radius The radius of the hemisphere to emit from\r\n * @param radiusRange The range of the hemisphere to emit from [0-1] 0 Surface Only, 1 Entire Radius\r\n */\r\n public createHemisphericEmitter(radius = 1, radiusRange = 1): HemisphericParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Sphere Emitter for the particle system (emits along the sphere radius)\r\n * @param radius The radius of the sphere to emit from\r\n * @param radiusRange The range of the sphere to emit from [0-1] 0 Surface Only, 1 Entire Radius\r\n */\r\n public createSphereEmitter(radius = 1, radiusRange = 1): SphereParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Directed Sphere Emitter for the particle system (emits between direction1 and direction2)\r\n * @param radius The radius of the sphere to emit from\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the sphere\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the sphere\r\n */\r\n public createDirectedSphereEmitter(radius = 1, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)): SphereDirectedParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Cylinder Emitter for the particle system (emits from the cylinder to the particle position)\r\n * @param radius The radius of the emission cylinder\r\n * @param height The height of the emission cylinder\r\n * @param radiusRange The range of emission [0-1] 0 Surface only, 1 Entire Radius\r\n * @param directionRandomizer How much to randomize the particle direction [0-1]\r\n */\r\n public createCylinderEmitter(radius = 1, height = 1, radiusRange = 1, directionRandomizer = 0): CylinderParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Directed Cylinder Emitter for the particle system (emits between direction1 and direction2)\r\n * @param radius The radius of the cylinder to emit from\r\n * @param height The height of the emission cylinder\r\n * @param radiusRange the range of the emission cylinder [0-1] 0 Surface only, 1 Entire Radius (1 by default)\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the cylinder\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the cylinder\r\n */\r\n public createDirectedCylinderEmitter(\r\n radius = 1,\r\n height = 1,\r\n radiusRange = 1,\r\n direction1 = new Vector3(0, 1.0, 0),\r\n direction2 = new Vector3(0, 1.0, 0)\r\n ): CylinderDirectedParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Cone Emitter for the particle system (emits from the cone to the particle position)\r\n * @param radius The radius of the cone to emit from\r\n * @param angle The base angle of the cone\r\n */\r\n public createConeEmitter(radius = 1, angle = Math.PI / 4): ConeParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n /**\r\n * Creates a Box Emitter for the particle system. (emits between direction1 and direction2 from withing the box defined by minEmitBox and maxEmitBox)\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the box\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the box\r\n * @param minEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox\r\n * @param maxEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox\r\n */\r\n public createBoxEmitter(direction1: Vector3, direction2: Vector3, minEmitBox: Vector3, maxEmitBox: Vector3): BoxParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n}\r\n", "import { NodeMaterialBlock } from \"../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\n\r\n/**\r\n * Block used to expand a Color3/4 into 4 outputs (one for each component)\r\n */\r\nexport class ColorSplitterBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new ColorSplitterBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerInput(\"rgba\", NodeMaterialBlockConnectionPointTypes.Color4, true);\r\n this.registerInput(\"rgb \", NodeMaterialBlockConnectionPointTypes.Color3, true);\r\n\r\n this.registerOutput(\"rgb\", NodeMaterialBlockConnectionPointTypes.Color3);\r\n this.registerOutput(\"r\", NodeMaterialBlockConnectionPointTypes.Float);\r\n this.registerOutput(\"g\", NodeMaterialBlockConnectionPointTypes.Float);\r\n this.registerOutput(\"b\", NodeMaterialBlockConnectionPointTypes.Float);\r\n this.registerOutput(\"a\", NodeMaterialBlockConnectionPointTypes.Float);\r\n\r\n this.inputsAreExclusive = true;\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"ColorSplitterBlock\";\r\n }\r\n\r\n /**\r\n * Gets the rgba component (input)\r\n */\r\n public get rgba(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgb component (input)\r\n */\r\n public get rgbIn(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the rgb component (output)\r\n */\r\n public get rgbOut(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the r component (output)\r\n */\r\n public get r(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the g component (output)\r\n */\r\n public get g(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n /**\r\n * Gets the b component (output)\r\n */\r\n public get b(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n /**\r\n * Gets the a component (output)\r\n */\r\n public get a(): NodeMaterialConnectionPoint {\r\n return this._outputs[4];\r\n }\r\n\r\n protected _inputRename(name: string) {\r\n if (name === \"rgb \") {\r\n return \"rgbIn\";\r\n }\r\n return name;\r\n }\r\n\r\n protected _outputRename(name: string) {\r\n if (name === \"rgb\") {\r\n return \"rgbOut\";\r\n }\r\n return name;\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const input = this.rgba.isConnected ? this.rgba : this.rgbIn;\r\n\r\n if (!input.isConnected) {\r\n return;\r\n }\r\n\r\n const rgbOutput = this._outputs[0];\r\n const rOutput = this._outputs[1];\r\n const gOutput = this._outputs[2];\r\n const bOutput = this._outputs[3];\r\n const aOutput = this._outputs[4];\r\n\r\n if (rgbOutput.hasEndpoints) {\r\n state.compilationString += this._declareOutput(rgbOutput, state) + ` = ${input.associatedVariableName}.rgb;\\n`;\r\n }\r\n if (rOutput.hasEndpoints) {\r\n state.compilationString += this._declareOutput(rOutput, state) + ` = ${input.associatedVariableName}.r;\\n`;\r\n }\r\n if (gOutput.hasEndpoints) {\r\n state.compilationString += this._declareOutput(gOutput, state) + ` = ${input.associatedVariableName}.g;\\n`;\r\n }\r\n if (bOutput.hasEndpoints) {\r\n state.compilationString += this._declareOutput(bOutput, state) + ` = ${input.associatedVariableName}.b;\\n`;\r\n }\r\n if (aOutput.hasEndpoints) {\r\n state.compilationString += this._declareOutput(aOutput, state) + ` = ${input.associatedVariableName}.a;\\n`;\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ColorSplitterBlock\", ColorSplitterBlock);\r\n", "import type { Nullable } from \"../types\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Effect } from \"./effect\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { DrawWrapper } from \"./drawWrapper\";\r\nimport type { IRenderTargetTexture, RenderTargetWrapper } from \"../Engines/renderTargetWrapper\";\r\nimport type { ShaderLanguage } from \"./shaderLanguage\";\r\n\r\n// Prevents ES6 Crash if not imported.\r\nimport \"../Shaders/postprocess.vertex\";\r\n\r\n/**\r\n * Effect Render Options\r\n */\r\nexport interface IEffectRendererOptions {\r\n /**\r\n * Defines the vertices positions.\r\n */\r\n positions?: number[];\r\n /**\r\n * Defines the indices.\r\n */\r\n indices?: number[];\r\n}\r\n\r\n// Fullscreen quad buffers by default.\r\nconst defaultOptions = {\r\n positions: [1, 1, -1, 1, -1, -1, 1, -1],\r\n indices: [0, 1, 2, 0, 2, 3],\r\n};\r\n\r\n/**\r\n * Helper class to render one or more effects.\r\n * You can access the previous rendering in your shader by declaring a sampler named textureSampler\r\n */\r\nexport class EffectRenderer {\r\n /**\r\n * The engine the effect renderer has been created for.\r\n */\r\n public readonly engine: ThinEngine;\r\n\r\n private _vertexBuffers: { [key: string]: VertexBuffer };\r\n private _indexBuffer: DataBuffer;\r\n\r\n private _fullscreenViewport = new Viewport(0, 0, 1, 1);\r\n private _onContextRestoredObserver: Nullable>;\r\n\r\n private _savedStateDepthTest: boolean;\r\n private _savedStateStencilTest: boolean;\r\n\r\n /**\r\n * Creates an effect renderer\r\n * @param engine the engine to use for rendering\r\n * @param options defines the options of the effect renderer\r\n */\r\n constructor(engine: ThinEngine, options: IEffectRendererOptions = defaultOptions) {\r\n const positions = options.positions ?? defaultOptions.positions;\r\n const indices = options.indices ?? defaultOptions.indices;\r\n\r\n this.engine = engine;\r\n this._vertexBuffers = {\r\n [VertexBuffer.PositionKind]: new VertexBuffer(engine, positions, VertexBuffer.PositionKind, false, false, 2),\r\n };\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n\r\n this._onContextRestoredObserver = engine.onContextRestoredObservable.add(() => {\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n\r\n for (const key in this._vertexBuffers) {\r\n const vertexBuffer = this._vertexBuffers[key];\r\n vertexBuffer._rebuild();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the current viewport in normalized coordinates 0-1\r\n * @param viewport Defines the viewport to set (defaults to 0 0 1 1)\r\n */\r\n public setViewport(viewport = this._fullscreenViewport): void {\r\n this.engine.setViewport(viewport);\r\n }\r\n\r\n /**\r\n * Binds the embedded attributes buffer to the effect.\r\n * @param effect Defines the effect to bind the attributes for\r\n */\r\n public bindBuffers(effect: Effect): void {\r\n this.engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n\r\n /**\r\n * Sets the current effect wrapper to use during draw.\r\n * The effect needs to be ready before calling this api.\r\n * This also sets the default full screen position attribute.\r\n * @param effectWrapper Defines the effect to draw with\r\n */\r\n public applyEffectWrapper(effectWrapper: EffectWrapper): void {\r\n this.engine.setState(true);\r\n this.engine.depthCullingState.depthTest = false;\r\n this.engine.stencilState.stencilTest = false;\r\n this.engine.enableEffect(effectWrapper._drawWrapper);\r\n this.bindBuffers(effectWrapper.effect);\r\n effectWrapper.onApplyObservable.notifyObservers({});\r\n }\r\n\r\n /**\r\n * Saves engine states\r\n */\r\n public saveStates(): void {\r\n this._savedStateDepthTest = this.engine.depthCullingState.depthTest;\r\n this._savedStateStencilTest = this.engine.stencilState.stencilTest;\r\n }\r\n\r\n /**\r\n * Restores engine states\r\n */\r\n public restoreStates(): void {\r\n this.engine.depthCullingState.depthTest = this._savedStateDepthTest;\r\n this.engine.stencilState.stencilTest = this._savedStateStencilTest;\r\n }\r\n\r\n /**\r\n * Draws a full screen quad.\r\n */\r\n public draw(): void {\r\n this.engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, 6);\r\n }\r\n\r\n private _isRenderTargetTexture(texture: RenderTargetWrapper | IRenderTargetTexture): texture is IRenderTargetTexture {\r\n return (texture as IRenderTargetTexture).renderTarget !== undefined;\r\n }\r\n\r\n /**\r\n * renders one or more effects to a specified texture\r\n * @param effectWrapper the effect to renderer\r\n * @param outputTexture texture to draw to, if null it will render to the screen.\r\n */\r\n public render(effectWrapper: EffectWrapper, outputTexture: Nullable = null) {\r\n // Ensure effect is ready\r\n if (!effectWrapper.effect.isReady()) {\r\n return;\r\n }\r\n\r\n this.saveStates();\r\n\r\n // Reset state\r\n this.setViewport();\r\n\r\n const out = outputTexture === null ? null : this._isRenderTargetTexture(outputTexture) ? outputTexture.renderTarget! : outputTexture;\r\n\r\n if (out) {\r\n this.engine.bindFramebuffer(out);\r\n }\r\n\r\n this.applyEffectWrapper(effectWrapper);\r\n\r\n this.draw();\r\n\r\n if (out) {\r\n this.engine.unBindFramebuffer(out);\r\n }\r\n\r\n this.restoreStates();\r\n }\r\n\r\n /**\r\n * Disposes of the effect renderer\r\n */\r\n dispose() {\r\n const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vertexBuffer) {\r\n vertexBuffer.dispose();\r\n delete this._vertexBuffers[VertexBuffer.PositionKind];\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this.engine._releaseBuffer(this._indexBuffer);\r\n }\r\n\r\n if (this._onContextRestoredObserver) {\r\n this.engine.onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Options to create an EffectWrapper\r\n */\r\ninterface EffectWrapperCreationOptions {\r\n /**\r\n * Engine to use to create the effect\r\n */\r\n engine: ThinEngine;\r\n /**\r\n * Fragment shader for the effect\r\n */\r\n fragmentShader: string;\r\n /**\r\n * Use the shader store instead of direct source code\r\n */\r\n useShaderStore?: boolean;\r\n /**\r\n * Vertex shader for the effect\r\n */\r\n vertexShader?: string;\r\n /**\r\n * Attributes to use in the shader\r\n */\r\n attributeNames?: Array;\r\n /**\r\n * Uniforms to use in the shader\r\n */\r\n uniformNames?: Array;\r\n /**\r\n * Texture sampler names to use in the shader\r\n */\r\n samplerNames?: Array;\r\n /**\r\n * Defines to use in the shader\r\n */\r\n defines?: Array;\r\n /**\r\n * Callback when effect is compiled\r\n */\r\n onCompiled?: Nullable<(effect: Effect) => void>;\r\n /**\r\n * The friendly name of the effect displayed in Spector.\r\n */\r\n name?: string;\r\n /**\r\n * The language the shader is written in (default: GLSL)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n}\r\n\r\n/**\r\n * Wraps an effect to be used for rendering\r\n */\r\nexport class EffectWrapper {\r\n /**\r\n * Event that is fired right before the effect is drawn (should be used to update uniforms)\r\n */\r\n public onApplyObservable = new Observable<{}>();\r\n /**\r\n * The underlying effect\r\n */\r\n public get effect(): Effect {\r\n return this._drawWrapper.effect!;\r\n }\r\n\r\n public set effect(effect: Effect) {\r\n this._drawWrapper.effect = effect;\r\n }\r\n\r\n /** @internal */\r\n public _drawWrapper: DrawWrapper;\r\n\r\n private _onContextRestoredObserver: Nullable>;\r\n\r\n /**\r\n * Creates an effect to be renderer\r\n * @param creationOptions options to create the effect\r\n */\r\n constructor(creationOptions: EffectWrapperCreationOptions) {\r\n let effectCreationOptions: any;\r\n const uniformNames = creationOptions.uniformNames || [];\r\n\r\n if (creationOptions.vertexShader) {\r\n effectCreationOptions = {\r\n fragmentSource: creationOptions.fragmentShader,\r\n vertexSource: creationOptions.vertexShader,\r\n spectorName: creationOptions.name || \"effectWrapper\",\r\n };\r\n } else {\r\n // Default scale to use in post process vertex shader.\r\n uniformNames.push(\"scale\");\r\n\r\n effectCreationOptions = {\r\n fragmentSource: creationOptions.fragmentShader,\r\n vertex: \"postprocess\",\r\n spectorName: creationOptions.name || \"effectWrapper\",\r\n };\r\n\r\n // Sets the default scale to identity for the post process vertex shader.\r\n this.onApplyObservable.add(() => {\r\n this.effect.setFloat2(\"scale\", 1, 1);\r\n });\r\n }\r\n\r\n const defines = creationOptions.defines ? creationOptions.defines.join(\"\\n\") : \"\";\r\n this._drawWrapper = new DrawWrapper(creationOptions.engine);\r\n\r\n if (creationOptions.useShaderStore) {\r\n effectCreationOptions.fragment = effectCreationOptions.fragmentSource;\r\n if (!effectCreationOptions.vertex) {\r\n effectCreationOptions.vertex = effectCreationOptions.vertexSource;\r\n }\r\n\r\n delete effectCreationOptions.fragmentSource;\r\n delete effectCreationOptions.vertexSource;\r\n\r\n this.effect = creationOptions.engine.createEffect(\r\n effectCreationOptions,\r\n creationOptions.attributeNames || [\"position\"],\r\n uniformNames,\r\n creationOptions.samplerNames,\r\n defines,\r\n undefined,\r\n creationOptions.onCompiled,\r\n undefined,\r\n undefined,\r\n creationOptions.shaderLanguage\r\n );\r\n } else {\r\n this.effect = new Effect(\r\n effectCreationOptions,\r\n creationOptions.attributeNames || [\"position\"],\r\n uniformNames,\r\n creationOptions.samplerNames,\r\n creationOptions.engine,\r\n defines,\r\n undefined,\r\n creationOptions.onCompiled,\r\n undefined,\r\n undefined,\r\n undefined,\r\n creationOptions.shaderLanguage\r\n );\r\n\r\n this._onContextRestoredObserver = creationOptions.engine.onContextRestoredObservable.add(() => {\r\n this.effect._pipelineContext = null; // because _prepareEffect will try to dispose this pipeline before recreating it and that would lead to webgl errors\r\n this.effect._prepareEffect();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the effect wrapper\r\n */\r\n public dispose() {\r\n if (this._onContextRestoredObserver) {\r\n this.effect.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n this.effect.dispose();\r\n }\r\n}\r\n", "// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"passPixelShader\";\nconst shader = `varying vec2 vUV;uniform sampler2D textureSampler;\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) \n{gl_FragColor=texture2D(textureSampler,vUV);}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const passPixelShader = { name, shader };\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { _WarnImport } from \"./devTools\";\r\nimport type { Engine } from \"../Engines/engine\";\r\n\r\nimport { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { EffectRenderer, EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { Tools } from \"./tools\";\r\nimport type { Nullable } from \"../types\";\r\n\r\nimport { passPixelShader } from \"../Shaders/pass.fragment\";\r\nimport { Scalar } from \"../Maths/math.scalar\";\r\n\r\ntype DumpToolsEngine = {\r\n canvas: HTMLCanvasElement | OffscreenCanvas;\r\n engine: ThinEngine;\r\n renderer: EffectRenderer;\r\n wrapper: EffectWrapper;\r\n};\r\n\r\n/**\r\n * Class containing a set of static utilities functions to dump data from a canvas\r\n */\r\nexport class DumpTools {\r\n private static _DumpToolsEngine: Nullable;\r\n\r\n private static _CreateDumpRenderer(): DumpToolsEngine {\r\n if (!DumpTools._DumpToolsEngine) {\r\n let canvas: HTMLCanvasElement | OffscreenCanvas;\r\n let engine: Nullable = null;\r\n const options = {\r\n preserveDrawingBuffer: true,\r\n depth: false,\r\n stencil: false,\r\n alpha: true,\r\n premultipliedAlpha: false,\r\n antialias: false,\r\n failIfMajorPerformanceCaveat: false,\r\n };\r\n try {\r\n canvas = new OffscreenCanvas(100, 100); // will be resized later\r\n engine = new ThinEngine(canvas, false, options);\r\n } catch (e) {\r\n // The browser either does not support OffscreenCanvas or WebGL context in OffscreenCanvas, fallback on a regular canvas\r\n canvas = document.createElement(\"canvas\");\r\n engine = new ThinEngine(canvas, false, options);\r\n }\r\n engine.getCaps().parallelShaderCompile = undefined;\r\n const renderer = new EffectRenderer(engine);\r\n const wrapper = new EffectWrapper({\r\n engine,\r\n name: passPixelShader.name,\r\n fragmentShader: passPixelShader.shader,\r\n samplerNames: [\"textureSampler\"],\r\n });\r\n DumpTools._DumpToolsEngine = {\r\n canvas,\r\n engine,\r\n renderer,\r\n wrapper,\r\n };\r\n }\r\n return DumpTools._DumpToolsEngine!;\r\n }\r\n\r\n /**\r\n * Dumps the current bound framebuffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param engine defines the hosting engine\r\n * @param successCallback defines the callback triggered once the data are available\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns a void promise\r\n */\r\n public static async DumpFramebuffer(\r\n width: number,\r\n height: number,\r\n engine: Engine,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n quality?: number\r\n ) {\r\n // Read the contents of the framebuffer\r\n const bufferView = await engine.readPixels(0, 0, width, height);\r\n\r\n const data = new Uint8Array(bufferView.buffer);\r\n\r\n DumpTools.DumpData(width, height, data, successCallback as (data: string | ArrayBuffer) => void, mimeType, fileName, true, undefined, quality);\r\n }\r\n\r\n /**\r\n * Dumps an array buffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param data the data array\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param invertY true to invert the picture in the Y dimension\r\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns a promise that resolve to the final data\r\n */\r\n public static DumpDataAsync(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n invertY = false,\r\n toArrayBuffer = false,\r\n quality?: number\r\n ): Promise {\r\n return new Promise((resolve) => {\r\n DumpTools.DumpData(width, height, data, (result) => resolve(result), mimeType, fileName, invertY, toArrayBuffer, quality);\r\n });\r\n }\r\n\r\n /**\r\n * Dumps an array buffer\r\n * @param width defines the rendering width\r\n * @param height defines the rendering height\r\n * @param data the data array\r\n * @param successCallback defines the callback triggered once the data are available\r\n * @param mimeType defines the mime type of the result\r\n * @param fileName defines the filename to download. If present, the result will automatically be downloaded\r\n * @param invertY true to invert the picture in the Y dimension\r\n * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n public static DumpData(\r\n width: number,\r\n height: number,\r\n data: ArrayBufferView,\r\n successCallback?: (data: string | ArrayBuffer) => void,\r\n mimeType = \"image/png\",\r\n fileName?: string,\r\n invertY = false,\r\n toArrayBuffer = false,\r\n quality?: number\r\n ) {\r\n const renderer = DumpTools._CreateDumpRenderer();\r\n renderer.engine.setSize(width, height, true);\r\n\r\n // Convert if data are float32\r\n if (data instanceof Float32Array) {\r\n const data2 = new Uint8Array(data.length);\r\n let n = data.length;\r\n while (n--) {\r\n const v = data[n];\r\n data2[n] = Math.round(Scalar.Clamp(v) * 255);\r\n }\r\n data = data2;\r\n }\r\n\r\n // Create the image\r\n const texture = renderer.engine.createRawTexture(data, width, height, Constants.TEXTUREFORMAT_RGBA, false, !invertY, Constants.TEXTURE_NEAREST_NEAREST);\r\n\r\n renderer.renderer.setViewport();\r\n renderer.renderer.applyEffectWrapper(renderer.wrapper);\r\n renderer.wrapper.effect._bindTexture(\"textureSampler\", texture);\r\n renderer.renderer.draw();\r\n\r\n if (toArrayBuffer) {\r\n Tools.ToBlob(\r\n renderer.canvas,\r\n (blob) => {\r\n const fileReader = new FileReader();\r\n fileReader.onload = (event: any) => {\r\n const arrayBuffer = event.target!.result as ArrayBuffer;\r\n if (successCallback) {\r\n successCallback(arrayBuffer);\r\n }\r\n };\r\n fileReader.readAsArrayBuffer(blob!);\r\n },\r\n mimeType,\r\n quality\r\n );\r\n } else {\r\n Tools.EncodeScreenshotCanvasData(renderer.canvas, successCallback, mimeType, fileName, quality);\r\n }\r\n\r\n texture.dispose();\r\n }\r\n\r\n /**\r\n * Dispose the dump tools associated resources\r\n */\r\n public static Dispose() {\r\n if (DumpTools._DumpToolsEngine) {\r\n DumpTools._DumpToolsEngine.wrapper.dispose();\r\n DumpTools._DumpToolsEngine.renderer.dispose();\r\n DumpTools._DumpToolsEngine.engine.dispose();\r\n }\r\n DumpTools._DumpToolsEngine = null;\r\n }\r\n}\r\n\r\n/**\r\n * This will be executed automatically for UMD and es5.\r\n * If esm dev wants the side effects to execute they will have to run it manually\r\n * Once we build native modules those need to be exported.\r\n * @internal\r\n */\r\nconst initSideEffects = () => {\r\n // References the dependencies.\r\n Tools.DumpData = DumpTools.DumpData;\r\n Tools.DumpDataAsync = DumpTools.DumpDataAsync;\r\n Tools.DumpFramebuffer = DumpTools.DumpFramebuffer;\r\n};\r\n\r\ninitSideEffects();\r\n", "import { InternalTexture, InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { Constants } from \"../constants\";\r\nimport { ThinEngine } from \"../thinEngine\";\r\nimport type { RenderTargetWrapper } from \"../renderTargetWrapper\";\r\nimport type { WebGLRenderTargetWrapper } from \"../WebGL/webGLRenderTargetWrapper\";\r\nimport type { RenderTargetCreationOptions } from \"../../Materials/Textures/textureCreationOptions\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Creates a new render target cube wrapper\r\n * @param size defines the size of the texture\r\n * @param options defines the options used to create the texture\r\n * @returns a new render target cube wrapper\r\n */\r\n createRenderTargetCubeTexture(size: number, options?: RenderTargetCreationOptions): RenderTargetWrapper;\r\n }\r\n}\r\n\r\nThinEngine.prototype.createRenderTargetCubeTexture = function (size: number, options?: RenderTargetCreationOptions): RenderTargetWrapper {\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(false, true, size) as WebGLRenderTargetWrapper;\r\n\r\n const fullOptions = {\r\n generateMipMaps: true,\r\n generateDepthBuffer: true,\r\n generateStencilBuffer: false,\r\n type: Constants.TEXTURETYPE_UNSIGNED_INT,\r\n samplingMode: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n ...options,\r\n };\r\n fullOptions.generateStencilBuffer = fullOptions.generateDepthBuffer && fullOptions.generateStencilBuffer;\r\n\r\n if (fullOptions.type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloatLinearFiltering) {\r\n // if floating point linear (gl.FLOAT) then force to NEAREST_SAMPLINGMODE\r\n fullOptions.samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n } else if (fullOptions.type === Constants.TEXTURETYPE_HALF_FLOAT && !this._caps.textureHalfFloatLinearFiltering) {\r\n // if floating point linear (HALF_FLOAT) then force to NEAREST_SAMPLINGMODE\r\n fullOptions.samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n }\r\n const gl = this._gl;\r\n\r\n const texture = new InternalTexture(this, InternalTextureSource.RenderTarget);\r\n this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, texture, true);\r\n\r\n const filters = this._getSamplingParameters(fullOptions.samplingMode, fullOptions.generateMipMaps);\r\n\r\n if (fullOptions.type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloat) {\r\n fullOptions.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n Logger.Warn(\"Float textures are not supported. Cube render target forced to TEXTURETYPE_UNESIGNED_BYTE type\");\r\n }\r\n\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, filters.mag);\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, filters.min);\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n\r\n for (let face = 0; face < 6; face++) {\r\n gl.texImage2D(\r\n gl.TEXTURE_CUBE_MAP_POSITIVE_X + face,\r\n 0,\r\n this._getRGBABufferInternalSizedFormat(fullOptions.type, fullOptions.format),\r\n size,\r\n size,\r\n 0,\r\n this._getInternalFormat(fullOptions.format),\r\n this._getWebGLTextureType(fullOptions.type),\r\n null\r\n );\r\n }\r\n\r\n // Create the framebuffer\r\n const framebuffer = gl.createFramebuffer();\r\n this._bindUnboundFramebuffer(framebuffer);\r\n\r\n rtWrapper._depthStencilBuffer = this._setupFramebufferDepthAttachments(fullOptions.generateStencilBuffer, fullOptions.generateDepthBuffer, size, size);\r\n\r\n // MipMaps\r\n if (fullOptions.generateMipMaps) {\r\n gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\r\n }\r\n\r\n // Unbind\r\n this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, null);\r\n this._bindUnboundFramebuffer(null);\r\n\r\n rtWrapper._framebuffer = framebuffer;\r\n rtWrapper._generateDepthBuffer = fullOptions.generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = fullOptions.generateStencilBuffer;\r\n\r\n texture.width = size;\r\n texture.height = size;\r\n texture.isReady = true;\r\n texture.isCube = true;\r\n texture.samples = 1;\r\n texture.generateMipMaps = fullOptions.generateMipMaps;\r\n texture.samplingMode = fullOptions.samplingMode;\r\n texture.type = fullOptions.type;\r\n texture.format = fullOptions.format;\r\n\r\n this._internalTexturesCache.push(texture);\r\n rtWrapper.setTextures(texture);\r\n\r\n return rtWrapper;\r\n};\r\n", "import type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { SmartArray } from \"../../Misc/smartArray\";\r\nimport type { Nullable, Immutable } from \"../../types\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { Color4 } from \"../../Maths/math.color\";\r\nimport type { RenderTargetCreationOptions, TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { PostProcessManager } from \"../../PostProcesses/postProcessManager\";\r\nimport type { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport { RenderingManager } from \"../../Rendering/renderingManager\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { IRenderTargetTexture, RenderTargetWrapper } from \"../../Engines/renderTargetWrapper\";\r\n\r\nimport \"../../Engines/Extensions/engine.renderTarget\";\r\nimport \"../../Engines/Extensions/engine.renderTargetCube\";\r\nimport { Engine } from \"../../Engines/engine\";\r\nimport { _ObserveArray } from \"../../Misc/arrayTools\";\r\nimport { DumpTools } from \"../../Misc/dumpTools\";\r\n\r\nimport type { Material } from \"../material\";\r\n\r\n/**\r\n * Options for the RenderTargetTexture constructor\r\n */\r\nexport interface RenderTargetTextureOptions {\r\n /** True (default: false) if mipmaps need to be generated after render */\r\n generateMipMaps?: boolean;\r\n\r\n /** True (default) to not change the aspect ratio of the scene in the RTT */\r\n doNotChangeAspectRatio?: boolean;\r\n\r\n /** The type of the buffer in the RTT (byte (default), half float, float...) */\r\n type?: number;\r\n\r\n /** True (default: false) if a cube texture needs to be created */\r\n isCube?: boolean;\r\n\r\n /** The sampling mode to be used with the render target (Trilinear (default), Linear, Nearest...) */\r\n samplingMode?: number;\r\n\r\n /** True (default) to generate a depth buffer */\r\n generateDepthBuffer?: boolean;\r\n\r\n /** True (default: false) to generate a stencil buffer */\r\n generateStencilBuffer?: boolean;\r\n\r\n /** True (default: false) if multiple textures need to be created (Draw Buffers) */\r\n isMulti?: boolean;\r\n\r\n /** The internal format of the buffer in the RTT (RED, RG, RGB, RGBA (default), ALPHA...) */\r\n format?: number;\r\n\r\n /** True (default: false) if the texture allocation should be delayed */\r\n delayAllocation?: boolean;\r\n\r\n /** Sample count to use when creating the RTT */\r\n samples?: number;\r\n\r\n /** specific flags to use when creating the texture (e.g., Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures) */\r\n creationFlags?: number;\r\n\r\n /** True (default: false) to indicate that no color target should be created. (e.g., if you only want to write to the depth buffer) */\r\n noColorAttachment?: boolean;\r\n\r\n /** Specifies the internal texture to use directly instead of creating one (ignores `noColorAttachment` flag when set) **/\r\n colorAttachment?: InternalTexture;\r\n\r\n /** True (default: false) to create a SRGB texture */\r\n useSRGBBuffer?: boolean;\r\n\r\n /** Defines the underlying texture texture space */\r\n gammaSpace?: boolean;\r\n}\r\n\r\n/**\r\n * This Helps creating a texture that will be created from a camera in your scene.\r\n * It is basically a dynamic texture that could be used to create special effects for instance.\r\n * Actually, It is the base of lot of effects in the framework like post process, shadows, effect layers and rendering pipelines...\r\n */\r\nexport class RenderTargetTexture extends Texture implements IRenderTargetTexture {\r\n /**\r\n * The texture will only be rendered once which can be useful to improve performance if everything in your render is static for instance.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONCE: number = 0;\r\n /**\r\n * The texture will only be rendered rendered every frame and is recommended for dynamic contents.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONEVERYFRAME: number = 1;\r\n /**\r\n * The texture will be rendered every 2 frames which could be enough if your dynamic objects are not\r\n * the central point of your effect and can save a lot of performances.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONEVERYTWOFRAMES: number = 2;\r\n\r\n /**\r\n * Use this predicate to dynamically define the list of mesh you want to render.\r\n * If set, the renderList property will be overwritten.\r\n */\r\n public renderListPredicate: (AbstractMesh: AbstractMesh) => boolean;\r\n\r\n private _renderList: Nullable>;\r\n private _unObserveRenderList: Nullable<() => void> = null;\r\n\r\n /**\r\n * Use this list to define the list of mesh you want to render.\r\n */\r\n public get renderList(): Nullable> {\r\n return this._renderList;\r\n }\r\n\r\n public set renderList(value: Nullable>) {\r\n if (this._unObserveRenderList) {\r\n this._unObserveRenderList();\r\n this._unObserveRenderList = null;\r\n }\r\n\r\n if (value) {\r\n this._unObserveRenderList = _ObserveArray(value, this._renderListHasChanged);\r\n }\r\n\r\n this._renderList = value;\r\n }\r\n\r\n private _renderListHasChanged = (_functionName: String, previousLength: number) => {\r\n const newLength = this._renderList ? this._renderList.length : 0;\r\n if ((previousLength === 0 && newLength > 0) || newLength === 0) {\r\n this.getScene()?.meshes.forEach((mesh) => {\r\n mesh._markSubMeshesAsLightDirty();\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Use this function to overload the renderList array at rendering time.\r\n * Return null to render with the current renderList, else return the list of meshes to use for rendering.\r\n * For 2DArray RTT, layerOrFace is the index of the layer that is going to be rendered, else it is the faceIndex of\r\n * the cube (if the RTT is a cube, else layerOrFace=0).\r\n * The renderList passed to the function is the current render list (the one that will be used if the function returns null).\r\n * The length of this list is passed through renderListLength: don't use renderList.length directly because the array can\r\n * hold dummy elements!\r\n */\r\n public getCustomRenderList: (layerOrFace: number, renderList: Nullable>>, renderListLength: number) => Nullable>;\r\n\r\n /**\r\n * Define if particles should be rendered in your texture.\r\n */\r\n public renderParticles = true;\r\n /**\r\n * Define if sprites should be rendered in your texture.\r\n */\r\n public renderSprites = false;\r\n\r\n /**\r\n * Force checking the layerMask property even if a custom list of meshes is provided (ie. if renderList is not undefined)\r\n */\r\n public forceLayerMaskCheck = false;\r\n\r\n /**\r\n * Define the camera used to render the texture.\r\n */\r\n public activeCamera: Nullable;\r\n /**\r\n * Override the mesh isReady function with your own one.\r\n */\r\n public customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number, preWarm?: boolean) => boolean;\r\n /**\r\n * Override the render function of the texture with your own one.\r\n */\r\n public customRenderFunction: (\r\n opaqueSubMeshes: SmartArray,\r\n alphaTestSubMeshes: SmartArray,\r\n transparentSubMeshes: SmartArray,\r\n depthOnlySubMeshes: SmartArray,\r\n beforeTransparents?: () => void\r\n ) => void;\r\n /**\r\n * Define if camera post processes should be use while rendering the texture.\r\n */\r\n public useCameraPostProcesses: boolean;\r\n /**\r\n * Define if the camera viewport should be respected while rendering the texture or if the render should be done to the entire texture.\r\n */\r\n public ignoreCameraViewport: boolean = false;\r\n\r\n private _postProcessManager: Nullable;\r\n\r\n /**\r\n * Post-processes for this render target\r\n */\r\n public get postProcesses() {\r\n return this._postProcesses;\r\n }\r\n private _postProcesses: PostProcess[];\r\n private _resizeObserver: Nullable>;\r\n\r\n private get _prePassEnabled() {\r\n return !!this._prePassRenderTarget && this._prePassRenderTarget.enabled;\r\n }\r\n\r\n /**\r\n * An event triggered when the texture is unbind.\r\n */\r\n public onBeforeBindObservable = new Observable();\r\n\r\n /**\r\n * An event triggered when the texture is unbind.\r\n */\r\n public onAfterUnbindObservable = new Observable();\r\n\r\n private _onAfterUnbindObserver: Nullable>;\r\n /**\r\n * Set a after unbind callback in the texture.\r\n * This has been kept for backward compatibility and use of onAfterUnbindObservable is recommended.\r\n */\r\n public set onAfterUnbind(callback: () => void) {\r\n if (this._onAfterUnbindObserver) {\r\n this.onAfterUnbindObservable.remove(this._onAfterUnbindObserver);\r\n }\r\n this._onAfterUnbindObserver = this.onAfterUnbindObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered before rendering the texture\r\n */\r\n public onBeforeRenderObservable = new Observable();\r\n\r\n private _onBeforeRenderObserver: Nullable>;\r\n /**\r\n * Set a before render callback in the texture.\r\n * This has been kept for backward compatibility and use of onBeforeRenderObservable is recommended.\r\n */\r\n public set onBeforeRender(callback: (faceIndex: number) => void) {\r\n if (this._onBeforeRenderObserver) {\r\n this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n }\r\n this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered after rendering the texture\r\n */\r\n public onAfterRenderObservable = new Observable();\r\n\r\n private _onAfterRenderObserver: Nullable>;\r\n /**\r\n * Set a after render callback in the texture.\r\n * This has been kept for backward compatibility and use of onAfterRenderObservable is recommended.\r\n */\r\n public set onAfterRender(callback: (faceIndex: number) => void) {\r\n if (this._onAfterRenderObserver) {\r\n this.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n }\r\n this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered after the texture clear\r\n */\r\n public onClearObservable = new Observable();\r\n\r\n private _onClearObserver: Nullable>;\r\n /**\r\n * Set a clear callback in the texture.\r\n * This has been kept for backward compatibility and use of onClearObservable is recommended.\r\n */\r\n public set onClear(callback: (Engine: Engine) => void) {\r\n if (this._onClearObserver) {\r\n this.onClearObservable.remove(this._onClearObserver);\r\n }\r\n this._onClearObserver = this.onClearObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered when the texture is resized.\r\n */\r\n public onResizeObservable = new Observable();\r\n\r\n /**\r\n * Define the clear color of the Render Target if it should be different from the scene.\r\n */\r\n public clearColor: Color4;\r\n protected _size: TextureSize;\r\n protected _initialSizeParameter: TextureSize | { ratio: number };\r\n protected _sizeRatio: Nullable;\r\n /** @internal */\r\n public _generateMipMaps: boolean;\r\n /** @internal */\r\n public _cleared = false;\r\n /**\r\n * Skip the initial clear of the rtt at the beginning of the frame render loop\r\n */\r\n public skipInitialClear = false;\r\n protected _renderingManager: RenderingManager;\r\n /** @internal */\r\n public _waitingRenderList?: string[];\r\n protected _doNotChangeAspectRatio: boolean;\r\n protected _currentRefreshId = -1;\r\n protected _refreshRate = 1;\r\n protected _textureMatrix: Matrix;\r\n protected _samples = 1;\r\n protected _renderTargetOptions: RenderTargetCreationOptions;\r\n private _canRescale = true;\r\n protected _renderTarget: Nullable = null;\r\n /**\r\n * Current render pass id of the render target texture. Note it can change over the rendering as there's a separate id for each face of a cube / each layer of an array layer!\r\n */\r\n public renderPassId: number;\r\n private _renderPassIds: number[];\r\n /**\r\n * Gets the render pass ids used by the render target texture. For a single render target the array length will be 1, for a cube texture it will be 6 and for\r\n * a 2D texture array it will return an array of ids the size of the 2D texture array\r\n */\r\n public get renderPassIds(): readonly number[] {\r\n return this._renderPassIds;\r\n }\r\n\r\n /**\r\n * Gets the current value of the refreshId counter\r\n */\r\n public get currentRefreshId() {\r\n return this._currentRefreshId;\r\n }\r\n\r\n /**\r\n * Sets a specific material to be used to render a mesh/a list of meshes in this render target texture\r\n * @param mesh mesh or array of meshes\r\n * @param material material or array of materials to use for this render pass. If undefined is passed, no specific material will be used but the regular material instead (mesh.material). It's possible to provide an array of materials to use a different material for each rendering in the case of a cube texture (6 rendering) and a 2D texture array (as many rendering as the length of the array)\r\n */\r\n public setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material | Material[]): void {\r\n let meshes;\r\n if (!Array.isArray(mesh)) {\r\n meshes = [mesh];\r\n } else {\r\n meshes = mesh;\r\n }\r\n for (let j = 0; j < meshes.length; ++j) {\r\n for (let i = 0; i < this._renderPassIds.length; ++i) {\r\n meshes[j].setMaterialForRenderPass(this._renderPassIds[i], material !== undefined ? (Array.isArray(material) ? material[i] : material) : undefined);\r\n }\r\n }\r\n }\r\n\r\n private _isCubeData: boolean;\r\n\r\n /**\r\n * Define if the texture has multiple draw buffers or if false a single draw buffer.\r\n */\r\n public get isMulti(): boolean {\r\n return this._renderTarget?.isMulti ?? false;\r\n }\r\n\r\n /**\r\n * Gets render target creation options that were used.\r\n */\r\n public get renderTargetOptions(): RenderTargetCreationOptions {\r\n return this._renderTargetOptions;\r\n }\r\n\r\n /**\r\n * Gets the render target wrapper associated with this render target\r\n */\r\n public get renderTarget(): Nullable {\r\n return this._renderTarget;\r\n }\r\n\r\n protected _onRatioRescale(): void {\r\n if (this._sizeRatio) {\r\n this.resize(this._initialSizeParameter);\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the center of the bounding box associated with the texture (when in cube mode)\r\n * It must define where the camera used to render the texture is set\r\n */\r\n public boundingBoxPosition = Vector3.Zero();\r\n\r\n private _boundingBoxSize: Vector3;\r\n\r\n /**\r\n * Gets or sets the size of the bounding box associated with the texture (when in cube mode)\r\n * When defined, the cubemap will switch to local mode\r\n * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity\r\n * @example https://www.babylonjs-playground.com/#RNASML\r\n */\r\n public set boundingBoxSize(value: Vector3) {\r\n if (this._boundingBoxSize && this._boundingBoxSize.equals(value)) {\r\n return;\r\n }\r\n this._boundingBoxSize = value;\r\n const scene = this.getScene();\r\n if (scene) {\r\n scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n }\r\n public get boundingBoxSize(): Vector3 {\r\n return this._boundingBoxSize;\r\n }\r\n\r\n /**\r\n * In case the RTT has been created with a depth texture, get the associated\r\n * depth texture.\r\n * Otherwise, return null.\r\n */\r\n public get depthStencilTexture(): Nullable {\r\n return this._renderTarget?._depthStencilTexture ?? null;\r\n }\r\n\r\n /**\r\n * Instantiate a render target texture. This is mainly used to render of screen the scene to for instance apply post process\r\n * or used a shadow, depth texture...\r\n * @param name The friendly name of the texture\r\n * @param size The size of the RTT (number if square, or {width: number, height:number} or {ratio:} to define a ratio from the main scene)\r\n * @param scene The scene the RTT belongs to. Default is the last created scene.\r\n * @param options The options for creating the render target texture.\r\n */\r\n constructor(name: string, size: TextureSize | { ratio: number }, scene?: Nullable, options?: RenderTargetTextureOptions);\r\n\r\n /**\r\n * Instantiate a render target texture. This is mainly used to render of screen the scene to for instance apply post process\r\n * or used a shadow, depth texture...\r\n * @param name The friendly name of the texture\r\n * @param size The size of the RTT (number if square, or {width: number, height:number} or {ratio:} to define a ratio from the main scene)\r\n * @param scene The scene the RTT belongs to. Default is the last created scene\r\n * @param generateMipMaps True (default: false) if mipmaps need to be generated after render\r\n * @param doNotChangeAspectRatio True (default) to not change the aspect ratio of the scene in the RTT\r\n * @param type The type of the buffer in the RTT (byte (default), half float, float...)\r\n * @param isCube True (default: false) if a cube texture needs to be created\r\n * @param samplingMode The sampling mode to be used with the render target (Trilinear (default), Linear, Nearest...)\r\n * @param generateDepthBuffer True (default) to generate a depth buffer\r\n * @param generateStencilBuffer True (default: false) to generate a stencil buffer\r\n * @param isMulti True (default: false) if multiple textures need to be created (Draw Buffers)\r\n * @param format The internal format of the buffer in the RTT (RED, RG, RGB, RGBA (default), ALPHA...)\r\n * @param delayAllocation True (default: false) if the texture allocation should be delayed\r\n * @param samples Sample count to use when creating the RTT\r\n * @param creationFlags specific flags to use when creating the texture (e.g., Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures)\r\n * @param noColorAttachment True (default: false) to indicate that no color target should be created. (e.g., if you only want to write to the depth buffer)\r\n * @param useSRGBBuffer True (default: false) to create a SRGB texture\r\n */\r\n constructor(\r\n name: string,\r\n size: TextureSize | { ratio: number },\r\n scene?: Nullable,\r\n generateMipMaps?: boolean,\r\n doNotChangeAspectRatio?: boolean,\r\n type?: number,\r\n isCube?: boolean,\r\n samplingMode?: number,\r\n generateDepthBuffer?: boolean,\r\n generateStencilBuffer?: boolean,\r\n isMulti?: boolean,\r\n format?: number,\r\n delayAllocation?: boolean,\r\n samples?: number,\r\n creationFlags?: number,\r\n noColorAttachment?: boolean,\r\n useSRGBBuffer?: boolean\r\n );\r\n\r\n /** @internal */\r\n constructor(\r\n name: string,\r\n size: TextureSize | { ratio: number },\r\n scene?: Nullable,\r\n generateMipMaps: boolean | RenderTargetTextureOptions = false,\r\n doNotChangeAspectRatio: boolean = true,\r\n type: number = Constants.TEXTURETYPE_UNSIGNED_INT,\r\n isCube = false,\r\n samplingMode = Texture.TRILINEAR_SAMPLINGMODE,\r\n generateDepthBuffer = true,\r\n generateStencilBuffer = false,\r\n isMulti = false,\r\n format = Constants.TEXTUREFORMAT_RGBA,\r\n delayAllocation = false,\r\n samples?: number,\r\n creationFlags?: number,\r\n noColorAttachment = false,\r\n useSRGBBuffer = false\r\n ) {\r\n let colorAttachment: InternalTexture | undefined = undefined;\r\n let gammaSpace = true;\r\n if (typeof generateMipMaps === \"object\") {\r\n const options = generateMipMaps;\r\n generateMipMaps = !!options.generateMipMaps;\r\n doNotChangeAspectRatio = options.doNotChangeAspectRatio ?? true;\r\n type = options.type ?? Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n isCube = !!options.isCube;\r\n samplingMode = options.samplingMode ?? Texture.TRILINEAR_SAMPLINGMODE;\r\n generateDepthBuffer = options.generateDepthBuffer ?? true;\r\n generateStencilBuffer = !!options.generateStencilBuffer;\r\n isMulti = !!options.isMulti;\r\n format = options.format ?? Constants.TEXTUREFORMAT_RGBA;\r\n delayAllocation = !!options.delayAllocation;\r\n samples = options.samples;\r\n creationFlags = options.creationFlags;\r\n noColorAttachment = !!options.noColorAttachment;\r\n useSRGBBuffer = !!options.useSRGBBuffer;\r\n colorAttachment = options.colorAttachment;\r\n gammaSpace = options.gammaSpace ?? gammaSpace;\r\n }\r\n\r\n super(null, scene, !generateMipMaps, undefined, samplingMode, undefined, undefined, undefined, undefined, format);\r\n\r\n scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n const engine = this.getScene()!.getEngine();\r\n\r\n this._gammaSpace = gammaSpace;\r\n this._coordinatesMode = Texture.PROJECTION_MODE;\r\n this.renderList = [] as AbstractMesh[];\r\n this.name = name;\r\n this.isRenderTarget = true;\r\n this._initialSizeParameter = size;\r\n this._renderPassIds = [];\r\n this._isCubeData = isCube;\r\n\r\n this._processSizeParameter(size);\r\n\r\n this.renderPassId = this._renderPassIds[0];\r\n\r\n this._resizeObserver = engine.onResizeObservable.add(() => {});\r\n\r\n this._generateMipMaps = generateMipMaps ? true : false;\r\n this._doNotChangeAspectRatio = doNotChangeAspectRatio;\r\n\r\n // Rendering groups\r\n this._renderingManager = new RenderingManager(scene);\r\n this._renderingManager._useSceneAutoClearSetup = true;\r\n\r\n if (isMulti) {\r\n return;\r\n }\r\n\r\n this._renderTargetOptions = {\r\n generateMipMaps: generateMipMaps,\r\n type: type,\r\n format: this._format ?? undefined,\r\n samplingMode: this.samplingMode,\r\n generateDepthBuffer: generateDepthBuffer,\r\n generateStencilBuffer: generateStencilBuffer,\r\n samples,\r\n creationFlags,\r\n noColorAttachment: noColorAttachment,\r\n useSRGBBuffer,\r\n colorAttachment: colorAttachment,\r\n label: this.name,\r\n };\r\n\r\n if (this.samplingMode === Texture.NEAREST_SAMPLINGMODE) {\r\n this.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n this.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n }\r\n\r\n if (!delayAllocation) {\r\n if (isCube) {\r\n this._renderTarget = scene.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions);\r\n this.coordinatesMode = Texture.INVCUBIC_MODE;\r\n this._textureMatrix = Matrix.Identity();\r\n } else {\r\n this._renderTarget = scene.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions);\r\n }\r\n this._texture = this._renderTarget.texture;\r\n if (samples !== undefined) {\r\n this.samples = samples;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a depth stencil texture.\r\n * This is only available in WebGL 2 or with the depth texture extension available.\r\n * @param comparisonFunction Specifies the comparison function to set on the texture. If 0 or undefined, the texture is not in comparison mode (default: 0)\r\n * @param bilinearFiltering Specifies whether or not bilinear filtering is enable on the texture (default: true)\r\n * @param generateStencil Specifies whether or not a stencil should be allocated in the texture (default: false)\r\n * @param samples sample count of the depth/stencil texture (default: 1)\r\n * @param format format of the depth texture (default: Constants.TEXTUREFORMAT_DEPTH32_FLOAT)\r\n */\r\n public createDepthStencilTexture(\r\n comparisonFunction: number = 0,\r\n bilinearFiltering: boolean = true,\r\n generateStencil: boolean = false,\r\n samples: number = 1,\r\n format: number = Constants.TEXTUREFORMAT_DEPTH32_FLOAT\r\n ): void {\r\n this._renderTarget?.createDepthStencilTexture(comparisonFunction, bilinearFiltering, generateStencil, samples, format);\r\n }\r\n\r\n private _releaseRenderPassId(): void {\r\n if (this._scene) {\r\n const engine = this._scene.getEngine();\r\n for (let i = 0; i < this._renderPassIds.length; ++i) {\r\n engine.releaseRenderPassId(this._renderPassIds[i]);\r\n }\r\n }\r\n this._renderPassIds = [];\r\n }\r\n\r\n private _createRenderPassId(): void {\r\n this._releaseRenderPassId();\r\n\r\n const engine = this._scene!.getEngine(); // scene can't be null in a RenderTargetTexture, see constructor\r\n const numPasses = this._isCubeData ? 6 : this.getRenderLayers() || 1;\r\n\r\n for (let i = 0; i < numPasses; ++i) {\r\n this._renderPassIds[i] = engine.createRenderPassId(`RenderTargetTexture - ${this.name}#${i}`);\r\n }\r\n }\r\n\r\n protected _processSizeParameter(size: TextureSize | { ratio: number }, createRenderPassIds = true): void {\r\n if ((<{ ratio: number }>size).ratio) {\r\n this._sizeRatio = (<{ ratio: number }>size).ratio;\r\n const engine = this._getEngine()!;\r\n this._size = {\r\n width: this._bestReflectionRenderTargetDimension(engine.getRenderWidth(), this._sizeRatio),\r\n height: this._bestReflectionRenderTargetDimension(engine.getRenderHeight(), this._sizeRatio),\r\n };\r\n } else {\r\n this._size = size;\r\n }\r\n\r\n if (createRenderPassIds) {\r\n this._createRenderPassId();\r\n }\r\n }\r\n\r\n /**\r\n * Define the number of samples to use in case of MSAA.\r\n * It defaults to one meaning no MSAA has been enabled.\r\n */\r\n public get samples(): number {\r\n return this._renderTarget?.samples ?? this._samples;\r\n }\r\n\r\n public set samples(value: number) {\r\n if (this._renderTarget) {\r\n this._samples = this._renderTarget.setSamples(value);\r\n }\r\n }\r\n\r\n /**\r\n * Resets the refresh counter of the texture and start bak from scratch.\r\n * Could be useful to regenerate the texture if it is setup to render only once.\r\n */\r\n public resetRefreshCounter(): void {\r\n this._currentRefreshId = -1;\r\n }\r\n\r\n /**\r\n * Define the refresh rate of the texture or the rendering frequency.\r\n * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...\r\n */\r\n public get refreshRate(): number {\r\n return this._refreshRate;\r\n }\r\n public set refreshRate(value: number) {\r\n this._refreshRate = value;\r\n this.resetRefreshCounter();\r\n }\r\n\r\n /**\r\n * Adds a post process to the render target rendering passes.\r\n * @param postProcess define the post process to add\r\n */\r\n public addPostProcess(postProcess: PostProcess): void {\r\n if (!this._postProcessManager) {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n this._postProcessManager = new PostProcessManager(scene);\r\n this._postProcesses = new Array();\r\n }\r\n\r\n this._postProcesses.push(postProcess);\r\n this._postProcesses[0].autoClear = false;\r\n }\r\n\r\n /**\r\n * Clear all the post processes attached to the render target\r\n * @param dispose define if the cleared post processes should also be disposed (false by default)\r\n */\r\n public clearPostProcesses(dispose: boolean = false): void {\r\n if (!this._postProcesses) {\r\n return;\r\n }\r\n\r\n if (dispose) {\r\n for (const postProcess of this._postProcesses) {\r\n postProcess.dispose();\r\n }\r\n }\r\n\r\n this._postProcesses = [];\r\n }\r\n\r\n /**\r\n * Remove one of the post process from the list of attached post processes to the texture\r\n * @param postProcess define the post process to remove from the list\r\n */\r\n public removePostProcess(postProcess: PostProcess): void {\r\n if (!this._postProcesses) {\r\n return;\r\n }\r\n\r\n const index = this._postProcesses.indexOf(postProcess);\r\n\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n this._postProcesses.splice(index, 1);\r\n\r\n if (this._postProcesses.length > 0) {\r\n this._postProcesses[0].autoClear = false;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _shouldRender(): boolean {\r\n if (this._currentRefreshId === -1) {\r\n // At least render once\r\n this._currentRefreshId = 1;\r\n return true;\r\n }\r\n\r\n if (this.refreshRate === this._currentRefreshId) {\r\n this._currentRefreshId = 1;\r\n return true;\r\n }\r\n\r\n this._currentRefreshId++;\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets the actual render size of the texture.\r\n * @returns the width of the render size\r\n */\r\n public getRenderSize(): number {\r\n return this.getRenderWidth();\r\n }\r\n\r\n /**\r\n * Gets the actual render width of the texture.\r\n * @returns the width of the render size\r\n */\r\n public getRenderWidth(): number {\r\n if ((<{ width: number; height: number }>this._size).width) {\r\n return (<{ width: number; height: number }>this._size).width;\r\n }\r\n\r\n return this._size;\r\n }\r\n\r\n /**\r\n * Gets the actual render height of the texture.\r\n * @returns the height of the render size\r\n */\r\n public getRenderHeight(): number {\r\n if ((<{ width: number; height: number }>this._size).width) {\r\n return (<{ width: number; height: number }>this._size).height;\r\n }\r\n\r\n return this._size;\r\n }\r\n\r\n /**\r\n * Gets the actual number of layers of the texture or, in the case of a 3D texture, return the depth.\r\n * @returns the number of layers\r\n */\r\n public getRenderLayers(): number {\r\n const layers = (<{ width: number; height: number; depth?: number; layers?: number }>this._size).layers;\r\n if (layers) {\r\n return layers;\r\n }\r\n const depth = (<{ width: number; height: number; depth?: number; layers?: number }>this._size).depth;\r\n if (depth) {\r\n return depth;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Don't allow this render target texture to rescale. Mainly used to prevent rescaling by the scene optimizer.\r\n */\r\n public disableRescaling() {\r\n this._canRescale = false;\r\n }\r\n\r\n /**\r\n * Get if the texture can be rescaled or not.\r\n */\r\n public get canRescale(): boolean {\r\n return this._canRescale;\r\n }\r\n\r\n /**\r\n * Resize the texture using a ratio.\r\n * @param ratio the ratio to apply to the texture size in order to compute the new target size\r\n */\r\n public scale(ratio: number): void {\r\n const newSize = Math.max(1, this.getRenderSize() * ratio);\r\n\r\n this.resize(newSize);\r\n }\r\n\r\n /**\r\n * Get the texture reflection matrix used to rotate/transform the reflection.\r\n * @returns the reflection matrix\r\n */\r\n public getReflectionTextureMatrix(): Matrix {\r\n if (this.isCube) {\r\n return this._textureMatrix;\r\n }\r\n\r\n return super.getReflectionTextureMatrix();\r\n }\r\n\r\n /**\r\n * Resize the texture to a new desired size.\r\n * Be careful as it will recreate all the data in the new texture.\r\n * @param size Define the new size. It can be:\r\n * - a number for squared texture,\r\n * - an object containing { width: number, height: number }\r\n * - or an object containing a ratio { ratio: number }\r\n */\r\n public resize(size: TextureSize | { ratio: number }): void {\r\n const wasCube = this.isCube;\r\n\r\n this._renderTarget?.dispose();\r\n this._renderTarget = null;\r\n\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n this._processSizeParameter(size, false);\r\n\r\n if (wasCube) {\r\n this._renderTarget = scene.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions);\r\n } else {\r\n this._renderTarget = scene.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions);\r\n }\r\n this._texture = this._renderTarget.texture;\r\n\r\n if (this._renderTargetOptions.samples !== undefined) {\r\n this.samples = this._renderTargetOptions.samples;\r\n }\r\n\r\n if (this.onResizeObservable.hasObservers()) {\r\n this.onResizeObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n private _defaultRenderListPrepared: boolean;\r\n\r\n /**\r\n * Renders all the objects from the render list into the texture.\r\n * @param useCameraPostProcess Define if camera post processes should be used during the rendering\r\n * @param dumpForDebug Define if the rendering result should be dumped (copied) for debugging purpose\r\n */\r\n public render(useCameraPostProcess: boolean = false, dumpForDebug: boolean = false): void {\r\n this._render(useCameraPostProcess, dumpForDebug);\r\n }\r\n\r\n /**\r\n * This function will check if the render target texture can be rendered (textures are loaded, shaders are compiled)\r\n * @returns true if all required resources are ready\r\n */\r\n public isReadyForRendering(): boolean {\r\n return this._render(false, false, true);\r\n }\r\n\r\n private _render(useCameraPostProcess: boolean = false, dumpForDebug: boolean = false, checkReadiness: boolean = false): boolean {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return checkReadiness;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (this.useCameraPostProcesses !== undefined) {\r\n useCameraPostProcess = this.useCameraPostProcesses;\r\n }\r\n\r\n if (this._waitingRenderList) {\r\n if (!this.renderListPredicate) {\r\n this.renderList = [];\r\n for (let index = 0; index < this._waitingRenderList.length; index++) {\r\n const id = this._waitingRenderList[index];\r\n const mesh = scene.getMeshById(id);\r\n if (mesh) {\r\n this.renderList.push(mesh);\r\n }\r\n }\r\n }\r\n this._waitingRenderList = undefined;\r\n }\r\n\r\n // Is predicate defined?\r\n if (this.renderListPredicate) {\r\n if (this.renderList) {\r\n this.renderList.length = 0; // Clear previous renderList\r\n } else {\r\n this.renderList = [];\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return checkReadiness;\r\n }\r\n\r\n const sceneMeshes = scene.meshes;\r\n\r\n for (let index = 0; index < sceneMeshes.length; index++) {\r\n const mesh = sceneMeshes[index];\r\n if (this.renderListPredicate(mesh)) {\r\n this.renderList.push(mesh);\r\n }\r\n }\r\n }\r\n\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n\r\n this.onBeforeBindObservable.notifyObservers(this);\r\n\r\n // Set custom projection.\r\n // Needs to be before binding to prevent changing the aspect ratio.\r\n const camera: Nullable = this.activeCamera ?? scene.activeCamera;\r\n const sceneCamera = scene.activeCamera;\r\n\r\n if (camera) {\r\n if (camera !== scene.activeCamera) {\r\n scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(true));\r\n scene.activeCamera = camera;\r\n }\r\n engine.setViewport(camera.rigParent ? camera.rigParent.viewport : camera.viewport, this.getRenderWidth(), this.getRenderHeight());\r\n }\r\n\r\n this._defaultRenderListPrepared = false;\r\n\r\n let returnValue = checkReadiness;\r\n\r\n if (!checkReadiness) {\r\n if ((this.is2DArray || this.is3D) && !this.isMulti) {\r\n for (let layer = 0; layer < this.getRenderLayers(); layer++) {\r\n this._renderToTarget(0, useCameraPostProcess, dumpForDebug, layer, camera);\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n }\r\n } else if (this.isCube && !this.isMulti) {\r\n for (let face = 0; face < 6; face++) {\r\n this._renderToTarget(face, useCameraPostProcess, dumpForDebug, undefined, camera);\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n }\r\n } else {\r\n this._renderToTarget(0, useCameraPostProcess, dumpForDebug, undefined, camera);\r\n }\r\n } else {\r\n if (!scene.getViewMatrix()) {\r\n // We probably didn't execute scene.render() yet, so make sure we have a view/projection matrix setup for the scene\r\n scene.updateTransformMatrix();\r\n }\r\n const numLayers = this.is2DArray || this.is3D ? this.getRenderLayers() : this.isCube ? 6 : 1;\r\n for (let layer = 0; layer < numLayers && returnValue; layer++) {\r\n let currentRenderList: Nullable> = null;\r\n const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data;\r\n const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length;\r\n\r\n engine.currentRenderPassId = this._renderPassIds[layer];\r\n\r\n this.onBeforeRenderObservable.notifyObservers(layer);\r\n\r\n if (this.getCustomRenderList) {\r\n currentRenderList = this.getCustomRenderList(layer, defaultRenderList, defaultRenderListLength);\r\n }\r\n\r\n if (!currentRenderList) {\r\n currentRenderList = defaultRenderList;\r\n }\r\n\r\n if (!this._doNotChangeAspectRatio) {\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n for (let i = 0; i < currentRenderList.length && returnValue; ++i) {\r\n const mesh = currentRenderList[i];\r\n\r\n if (!mesh.isEnabled() || mesh.isBlocked || !mesh.isVisible || !mesh.subMeshes) {\r\n continue;\r\n }\r\n\r\n if (this.customIsReadyFunction) {\r\n if (!this.customIsReadyFunction(mesh, this.refreshRate, checkReadiness)) {\r\n returnValue = false;\r\n continue;\r\n }\r\n } else if (!mesh.isReady(true)) {\r\n returnValue = false;\r\n continue;\r\n }\r\n }\r\n\r\n this.onAfterRenderObservable.notifyObservers(layer);\r\n\r\n if (this.is2DArray || this.is3D || this.isCube) {\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n }\r\n }\r\n }\r\n\r\n this.onAfterUnbindObservable.notifyObservers(this);\r\n\r\n engine.currentRenderPassId = currentRenderPassId;\r\n\r\n if (sceneCamera) {\r\n scene.activeCamera = sceneCamera;\r\n if (this.activeCamera && this.activeCamera !== scene.activeCamera) {\r\n scene.setTransformMatrix(scene.activeCamera.getViewMatrix(), scene.activeCamera.getProjectionMatrix(true));\r\n }\r\n engine.setViewport(scene.activeCamera.viewport);\r\n }\r\n\r\n scene.resetCachedMaterial();\r\n\r\n return returnValue;\r\n }\r\n\r\n private _bestReflectionRenderTargetDimension(renderDimension: number, scale: number): number {\r\n const minimum = 128;\r\n const x = renderDimension * scale;\r\n const curved = Engine.NearestPOT(x + (minimum * minimum) / (minimum + x));\r\n\r\n // Ensure we don't exceed the render dimension (while staying POT)\r\n return Math.min(Engine.FloorPOT(renderDimension), curved);\r\n }\r\n\r\n private _prepareRenderingManager(currentRenderList: Array, currentRenderListLength: number, camera: Nullable, checkLayerMask: boolean): void {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n this._renderingManager.reset();\r\n\r\n const sceneRenderId = scene.getRenderId();\r\n for (let meshIndex = 0; meshIndex < currentRenderListLength; meshIndex++) {\r\n const mesh = currentRenderList[meshIndex];\r\n\r\n if (mesh && !mesh.isBlocked) {\r\n if (this.customIsReadyFunction) {\r\n if (!this.customIsReadyFunction(mesh, this.refreshRate, false)) {\r\n this.resetRefreshCounter();\r\n continue;\r\n }\r\n } else if (!mesh.isReady(this.refreshRate === 0)) {\r\n this.resetRefreshCounter();\r\n continue;\r\n }\r\n\r\n if (!mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate && scene.activeCamera) {\r\n mesh._internalAbstractMeshDataInfo._currentLOD = scene.customLODSelector\r\n ? scene.customLODSelector(mesh, this.activeCamera || scene.activeCamera)\r\n : mesh.getLOD(this.activeCamera || scene.activeCamera);\r\n mesh._internalAbstractMeshDataInfo._currentLODIsUpToDate = true;\r\n }\r\n if (!mesh._internalAbstractMeshDataInfo._currentLOD) {\r\n continue;\r\n }\r\n\r\n let meshToRender = mesh._internalAbstractMeshDataInfo._currentLOD;\r\n\r\n meshToRender._preActivateForIntermediateRendering(sceneRenderId);\r\n\r\n let isMasked;\r\n if (checkLayerMask && camera) {\r\n isMasked = (mesh.layerMask & camera.layerMask) === 0;\r\n } else {\r\n isMasked = false;\r\n }\r\n\r\n if (mesh.isEnabled() && mesh.isVisible && mesh.subMeshes && !isMasked) {\r\n if (meshToRender !== mesh) {\r\n meshToRender._activate(sceneRenderId, true);\r\n }\r\n if (mesh._activate(sceneRenderId, true) && mesh.subMeshes.length) {\r\n if (!mesh.isAnInstance) {\r\n meshToRender._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = false;\r\n } else {\r\n if (mesh._internalAbstractMeshDataInfo._actAsRegularMesh) {\r\n meshToRender = mesh;\r\n }\r\n }\r\n meshToRender._internalAbstractMeshDataInfo._isActiveIntermediate = true;\r\n\r\n for (let subIndex = 0; subIndex < meshToRender.subMeshes.length; subIndex++) {\r\n const subMesh = meshToRender.subMeshes[subIndex];\r\n this._renderingManager.dispatch(subMesh, meshToRender);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (let particleIndex = 0; particleIndex < scene.particleSystems.length; particleIndex++) {\r\n const particleSystem = scene.particleSystems[particleIndex];\r\n\r\n const emitter: any = particleSystem.emitter;\r\n\r\n if (!particleSystem.isStarted() || !emitter || (emitter.position && !emitter.isEnabled())) {\r\n continue;\r\n }\r\n\r\n this._renderingManager.dispatchParticles(particleSystem);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * @param faceIndex face index to bind to if this is a cubetexture\r\n * @param layer defines the index of the texture to bind in the array\r\n */\r\n public _bindFrameBuffer(faceIndex: number = 0, layer = 0) {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n if (this._renderTarget) {\r\n engine.bindFramebuffer(this._renderTarget, this.isCube ? faceIndex : undefined, undefined, undefined, this.ignoreCameraViewport, 0, layer);\r\n }\r\n }\r\n\r\n protected _unbindFrameBuffer(engine: Engine, faceIndex: number): void {\r\n if (!this._renderTarget) {\r\n return;\r\n }\r\n engine.unBindFramebuffer(this._renderTarget, this.isCube, () => {\r\n this.onAfterRenderObservable.notifyObservers(faceIndex);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _prepareFrame(scene: Scene, faceIndex?: number, layer?: number, useCameraPostProcess?: boolean) {\r\n if (this._postProcessManager) {\r\n if (!this._prePassEnabled) {\r\n this._postProcessManager._prepareFrame(this._texture, this._postProcesses);\r\n }\r\n } else if (!useCameraPostProcess || !scene.postProcessManager._prepareFrame(this._texture)) {\r\n this._bindFrameBuffer(faceIndex, layer);\r\n }\r\n }\r\n\r\n private _renderToTarget(faceIndex: number, useCameraPostProcess: boolean, dumpForDebug: boolean, layer = 0, camera: Nullable = null): void {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n engine._debugPushGroup?.(`render to face #${faceIndex} layer #${layer}`, 1);\r\n\r\n // Bind\r\n this._prepareFrame(scene, faceIndex, layer, useCameraPostProcess);\r\n\r\n if (this.is2DArray || this.is3D) {\r\n engine.currentRenderPassId = this._renderPassIds[layer];\r\n this.onBeforeRenderObservable.notifyObservers(layer);\r\n } else {\r\n engine.currentRenderPassId = this._renderPassIds[faceIndex];\r\n this.onBeforeRenderObservable.notifyObservers(faceIndex);\r\n }\r\n\r\n const fastPath = engine.snapshotRendering && engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST;\r\n\r\n if (!fastPath) {\r\n // Get the list of meshes to render\r\n let currentRenderList: Nullable> = null;\r\n const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data;\r\n const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length;\r\n\r\n if (this.getCustomRenderList) {\r\n currentRenderList = this.getCustomRenderList(this.is2DArray || this.is3D ? layer : faceIndex, defaultRenderList, defaultRenderListLength);\r\n }\r\n\r\n if (!currentRenderList) {\r\n // No custom render list provided, we prepare the rendering for the default list, but check\r\n // first if we did not already performed the preparation before so as to avoid re-doing it several times\r\n if (!this._defaultRenderListPrepared) {\r\n this._prepareRenderingManager(defaultRenderList, defaultRenderListLength, camera, !this.renderList || this.forceLayerMaskCheck);\r\n this._defaultRenderListPrepared = true;\r\n }\r\n currentRenderList = defaultRenderList;\r\n } else {\r\n // Prepare the rendering for the custom render list provided\r\n this._prepareRenderingManager(currentRenderList, currentRenderList.length, camera, this.forceLayerMaskCheck);\r\n }\r\n\r\n // Before clear\r\n for (const step of scene._beforeRenderTargetClearStage) {\r\n step.action(this, faceIndex, layer);\r\n }\r\n\r\n // Clear\r\n if (this.onClearObservable.hasObservers()) {\r\n this.onClearObservable.notifyObservers(engine);\r\n } else if (!this.skipInitialClear) {\r\n engine.clear(this.clearColor || scene.clearColor, true, true, true);\r\n }\r\n\r\n if (!this._doNotChangeAspectRatio) {\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n // Before Camera Draw\r\n for (const step of scene._beforeRenderTargetDrawStage) {\r\n step.action(this, faceIndex, layer);\r\n }\r\n\r\n // Render\r\n this._renderingManager.render(this.customRenderFunction, currentRenderList, this.renderParticles, this.renderSprites);\r\n\r\n // After Camera Draw\r\n for (const step of scene._afterRenderTargetDrawStage) {\r\n step.action(this, faceIndex, layer);\r\n }\r\n\r\n const saveGenerateMipMaps = this._texture?.generateMipMaps ?? false;\r\n\r\n if (this._texture) {\r\n this._texture.generateMipMaps = false; // if left true, the mipmaps will be generated (if this._texture.generateMipMaps = true) when the first post process binds its own RTT: by doing so it will unbind the current RTT,\r\n // which will trigger a mipmap generation. We don't want this because it's a wasted work, we will do an unbind of the current RTT at the end of the process (see unbindFrameBuffer) which will\r\n // trigger the generation of the final mipmaps\r\n }\r\n\r\n if (this._postProcessManager) {\r\n this._postProcessManager._finalizeFrame(false, this._renderTarget ?? undefined, faceIndex, this._postProcesses, this.ignoreCameraViewport);\r\n } else if (useCameraPostProcess) {\r\n scene.postProcessManager._finalizeFrame(false, this._renderTarget ?? undefined, faceIndex);\r\n }\r\n\r\n for (const step of scene._afterRenderTargetPostProcessStage) {\r\n step.action(this, faceIndex, layer);\r\n }\r\n\r\n if (this._texture) {\r\n this._texture.generateMipMaps = saveGenerateMipMaps;\r\n }\r\n\r\n if (!this._doNotChangeAspectRatio) {\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n // Dump ?\r\n if (dumpForDebug) {\r\n DumpTools.DumpFramebuffer(this.getRenderWidth(), this.getRenderHeight(), engine);\r\n }\r\n } else {\r\n // Clear\r\n if (this.onClearObservable.hasObservers()) {\r\n this.onClearObservable.notifyObservers(engine);\r\n } else {\r\n if (!this.skipInitialClear) {\r\n engine.clear(this.clearColor || scene.clearColor, true, true, true);\r\n }\r\n }\r\n }\r\n\r\n // Unbind\r\n this._unbindFrameBuffer(engine, faceIndex);\r\n\r\n if (this._texture && this.isCube && faceIndex === 5) {\r\n engine.generateMipMapsForCubemap(this._texture);\r\n }\r\n\r\n engine._debugPopGroup?.(1);\r\n }\r\n\r\n /**\r\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\r\n * This allowed control for front to back rendering or reversely depending of the special needs.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\r\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\r\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\r\n */\r\n public setRenderingOrder(\r\n renderingGroupId: number,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ): void {\r\n this._renderingManager.setRenderingOrder(renderingGroupId, opaqueSortCompareFn, alphaTestSortCompareFn, transparentSortCompareFn);\r\n }\r\n\r\n /**\r\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\r\n */\r\n public setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean): void {\r\n this._renderingManager.setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil);\r\n this._renderingManager._useSceneAutoClearSetup = false;\r\n }\r\n\r\n /**\r\n * Clones the texture.\r\n * @returns the cloned texture\r\n */\r\n public clone(): RenderTargetTexture {\r\n const textureSize = this.getSize();\r\n const newTexture = new RenderTargetTexture(\r\n this.name,\r\n textureSize,\r\n this.getScene(),\r\n this._renderTargetOptions.generateMipMaps,\r\n this._doNotChangeAspectRatio,\r\n this._renderTargetOptions.type,\r\n this.isCube,\r\n this._renderTargetOptions.samplingMode,\r\n this._renderTargetOptions.generateDepthBuffer,\r\n this._renderTargetOptions.generateStencilBuffer,\r\n undefined,\r\n this._renderTargetOptions.format,\r\n undefined,\r\n this._renderTargetOptions.samples\r\n );\r\n\r\n // Base texture\r\n newTexture.hasAlpha = this.hasAlpha;\r\n newTexture.level = this.level;\r\n\r\n // RenderTarget Texture\r\n newTexture.coordinatesMode = this.coordinatesMode;\r\n if (this.renderList) {\r\n newTexture.renderList = this.renderList.slice(0);\r\n }\r\n\r\n return newTexture;\r\n }\r\n\r\n /**\r\n * Serialize the texture to a JSON representation we can easily use in the respective Parse function.\r\n * @returns The JSON representation of the texture\r\n */\r\n public serialize(): any {\r\n if (!this.name) {\r\n return null;\r\n }\r\n\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.renderTargetSize = this.getRenderSize();\r\n serializationObject.renderList = [];\r\n\r\n if (this.renderList) {\r\n for (let index = 0; index < this.renderList.length; index++) {\r\n serializationObject.renderList.push(this.renderList[index].id);\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * This will remove the attached framebuffer objects. The texture will not be able to be used as render target anymore\r\n */\r\n public disposeFramebufferObjects(): void {\r\n this._renderTarget?.dispose(true);\r\n }\r\n\r\n /**\r\n * Release and destroy the underlying lower level texture aka internalTexture.\r\n */\r\n public releaseInternalTexture(): void {\r\n this._renderTarget?.releaseTextures();\r\n this._texture = null;\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public dispose(): void {\r\n this.onResizeObservable.clear();\r\n this.onClearObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onAfterUnbindObservable.clear();\r\n this.onBeforeBindObservable.clear();\r\n this.onBeforeRenderObservable.clear();\r\n\r\n if (this._postProcessManager) {\r\n this._postProcessManager.dispose();\r\n this._postProcessManager = null;\r\n }\r\n\r\n if (this._prePassRenderTarget) {\r\n this._prePassRenderTarget.dispose();\r\n }\r\n\r\n this._releaseRenderPassId();\r\n this.clearPostProcesses(true);\r\n\r\n if (this._resizeObserver) {\r\n this.getScene()!.getEngine().onResizeObservable.remove(this._resizeObserver);\r\n this._resizeObserver = null;\r\n }\r\n\r\n this.renderList = null;\r\n\r\n // Remove from custom render targets\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n let index = scene.customRenderTargets.indexOf(this);\r\n\r\n if (index >= 0) {\r\n scene.customRenderTargets.splice(index, 1);\r\n }\r\n\r\n for (const camera of scene.cameras) {\r\n index = camera.customRenderTargets.indexOf(this);\r\n\r\n if (index >= 0) {\r\n camera.customRenderTargets.splice(index, 1);\r\n }\r\n }\r\n\r\n this._renderTarget?.dispose();\r\n this._renderTarget = null;\r\n this._texture = null;\r\n\r\n super.dispose();\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this.refreshRate === RenderTargetTexture.REFRESHRATE_RENDER_ONCE) {\r\n this.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE;\r\n }\r\n\r\n if (this._postProcessManager) {\r\n this._postProcessManager._rebuild();\r\n }\r\n }\r\n\r\n /**\r\n * Clear the info related to rendering groups preventing retention point in material dispose.\r\n */\r\n public freeRenderingGroups(): void {\r\n if (this._renderingManager) {\r\n this._renderingManager.freeRenderingGroups();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the number of views the corresponding to the texture (eg. a MultiviewRenderTarget will have > 1)\r\n * @returns the view count\r\n */\r\n public getViewCount() {\r\n return 1;\r\n }\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nTexture._CreateRenderTargetTexture = (name: string, renderTargetSize: number, scene: Scene, generateMipMaps: boolean, creationFlags?: number) => {\r\n return new RenderTargetTexture(name, renderTargetSize, scene, generateMipMaps);\r\n};\r\n", "import { Tools } from \"../../../Misc/tools\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport type { ISceneComponent } from \"../../../sceneComponent\";\r\nimport { SceneComponentConstants } from \"../../../sceneComponent\";\r\n\r\nimport type { ProceduralTexture } from \"./proceduralTexture\";\r\n\r\ndeclare module \"../../../abstractScene\" {\r\n export interface AbstractScene {\r\n /**\r\n * The list of procedural textures added to the scene\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures\r\n */\r\n proceduralTextures: Array;\r\n }\r\n}\r\n/**\r\n * Defines the Procedural Texture scene component responsible to manage any Procedural Texture\r\n * in a given scene.\r\n */\r\nexport class ProceduralTextureSceneComponent implements ISceneComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_PROCEDURALTEXTURE;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Creates a new instance of the component for the given scene\r\n * @param scene Defines the scene to register the component in\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n this.scene.proceduralTextures = [] as ProceduralTexture[];\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {\r\n this.scene._beforeClearStage.registerStep(SceneComponentConstants.STEP_BEFORECLEAR_PROCEDURALTEXTURE, this, this._beforeClear);\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n // Nothing to do here.\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources.\r\n */\r\n public dispose(): void {\r\n // Nothing to do here.\r\n }\r\n\r\n private _beforeClear(): void {\r\n if (this.scene.proceduralTexturesEnabled) {\r\n Tools.StartPerformanceCounter(\"Procedural textures\", this.scene.proceduralTextures.length > 0);\r\n for (let proceduralIndex = 0; proceduralIndex < this.scene.proceduralTextures.length; proceduralIndex++) {\r\n const proceduralTexture = this.scene.proceduralTextures[proceduralIndex];\r\n if (proceduralTexture._shouldRender()) {\r\n proceduralTexture.render();\r\n }\r\n }\r\n Tools.EndPerformanceCounter(\"Procedural textures\", this.scene.proceduralTextures.length > 0);\r\n }\r\n }\r\n}\r\n", "// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"proceduralVertexShader\";\nconst shader = `attribute vec2 position;varying vec2 vPosition;varying vec2 vUV;const vec2 madd=vec2(0.5,0.5);\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\nvPosition=position;vUV=position*madd+madd;gl_Position=vec4(position,0.0,1.0);\n#define CUSTOM_VERTEX_MAIN_END\n}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const proceduralVertexShader = { name, shader };\n", "import { serialize } from \"../../../Misc/decorators\";\r\nimport { Observable } from \"../../../Misc/observable\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport type { Matrix, Vector3, Vector2 } from \"../../../Maths/math.vector\";\r\nimport type { Color4, Color3 } from \"../../../Maths/math.color\";\r\nimport type { Engine } from \"../../../Engines/engine\";\r\nimport { VertexBuffer } from \"../../../Buffers/buffer\";\r\nimport { SceneComponentConstants } from \"../../../sceneComponent\";\r\n\r\nimport { Material } from \"../../../Materials/material\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { Texture } from \"../../../Materials/Textures/texture\";\r\nimport type { RenderTargetTextureOptions } from \"../../../Materials/Textures/renderTargetTexture\";\r\nimport { RenderTargetTexture } from \"../../../Materials/Textures/renderTargetTexture\";\r\nimport { ProceduralTextureSceneComponent } from \"./proceduralTextureSceneComponent\";\r\n\r\nimport \"../../../Engines/Extensions/engine.renderTarget\";\r\nimport \"../../../Engines/Extensions/engine.renderTargetCube\";\r\nimport \"../../../Shaders/procedural.vertex\";\r\nimport type { DataBuffer } from \"../../../Buffers/dataBuffer\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport type { NodeMaterial } from \"../../Node/nodeMaterial\";\r\nimport type { TextureSize } from \"../../../Materials/Textures/textureCreationOptions\";\r\nimport { EngineStore } from \"../../../Engines/engineStore\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport { DrawWrapper } from \"../../drawWrapper\";\r\nimport type { RenderTargetWrapper } from \"../../../Engines/renderTargetWrapper\";\r\n\r\n/**\r\n * Options to create a procedural texture\r\n */\r\nexport interface IProceduralTextureCreationOptions extends RenderTargetTextureOptions {\r\n /**\r\n * Defines a fallback texture in case there were issues to create the custom texture\r\n */\r\n fallbackTexture?: Nullable;\r\n}\r\n\r\n/**\r\n * Procedural texturing is a way to programmatically create a texture. There are 2 types of procedural textures: code-only, and code that references some classic 2D images, sometimes calmpler' images.\r\n * This is the base class of any Procedural texture and contains most of the shareable code.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures\r\n */\r\nexport class ProceduralTexture extends Texture {\r\n /**\r\n * Define if the texture is enabled or not (disabled texture will not render)\r\n */\r\n @serialize()\r\n public isEnabled = true;\r\n\r\n /**\r\n * Define if the texture must be cleared before rendering (default is true)\r\n */\r\n @serialize()\r\n public autoClear = true;\r\n\r\n /**\r\n * Callback called when the texture is generated\r\n */\r\n public onGenerated: () => void;\r\n\r\n /**\r\n * Event raised when the texture is generated\r\n */\r\n public onGeneratedObservable = new Observable();\r\n\r\n /**\r\n * Event raised before the texture is generated\r\n */\r\n public onBeforeGenerationObservable = new Observable();\r\n\r\n /**\r\n * Gets or sets the node material used to create this texture (null if the texture was manually created)\r\n */\r\n public nodeMaterialSource: Nullable = null;\r\n\r\n /** @internal */\r\n @serialize()\r\n public _generateMipMaps: boolean;\r\n\r\n private _drawWrapper: DrawWrapper;\r\n\r\n /** @internal */\r\n public _textures: { [key: string]: Texture } = {};\r\n\r\n /** @internal */\r\n protected _fallbackTexture: Nullable;\r\n\r\n @serialize()\r\n private _size: TextureSize;\r\n private _textureType: number;\r\n private _currentRefreshId = -1;\r\n private _frameId = -1;\r\n private _refreshRate = 1;\r\n private _vertexBuffers: { [key: string]: Nullable } = {};\r\n private _indexBuffer: Nullable;\r\n private _uniforms = new Array();\r\n private _samplers = new Array();\r\n private _fragment: any;\r\n\r\n private _floats: { [key: string]: number } = {};\r\n private _ints: { [key: string]: number } = {};\r\n private _floatsArrays: { [key: string]: number[] } = {};\r\n private _colors3: { [key: string]: Color3 } = {};\r\n private _colors4: { [key: string]: Color4 } = {};\r\n private _vectors2: { [key: string]: Vector2 } = {};\r\n private _vectors3: { [key: string]: Vector3 } = {};\r\n private _matrices: { [key: string]: Matrix } = {};\r\n\r\n private _fallbackTextureUsed = false;\r\n private _fullEngine: Engine;\r\n\r\n private _cachedDefines: Nullable = null;\r\n\r\n private _contentUpdateId = -1;\r\n private _contentData: Nullable>;\r\n\r\n private _rtWrapper: Nullable = null;\r\n private _options: IProceduralTextureCreationOptions;\r\n\r\n /**\r\n * Instantiates a new procedural texture.\r\n * Procedural texturing is a way to programmatically create a texture. There are 2 types of procedural textures: code-only, and code that references some classic 2D images, sometimes called 'refMaps' or 'sampler' images.\r\n * This is the base class of any Procedural texture and contains most of the shareable code.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures\r\n * @param name Define the name of the texture\r\n * @param size Define the size of the texture to create\r\n * @param fragment Define the fragment shader to use to generate the texture or null if it is defined later:\r\n * * object: \\{ fragmentElement: \"fragmentShaderCode\" \\}, used with shader code in script tags\r\n * * object: \\{ fragmentSource: \"fragment shader code string\" \\}, the string contains the shader code\r\n * * string: the string contains a name \"XXX\" to lookup in Effect.ShadersStore[\"XXXFragmentShader\"]\r\n * @param scene Define the scene the texture belongs to\r\n * @param fallbackTexture Define a fallback texture in case there were issues to create the custom texture\r\n * @param generateMipMaps Define if the texture should creates mip maps or not\r\n * @param isCube Define if the texture is a cube texture or not (this will render each faces of the cube)\r\n * @param textureType The FBO internal texture type\r\n */\r\n constructor(\r\n name: string,\r\n size: TextureSize,\r\n fragment: any,\r\n scene: Nullable,\r\n fallbackTexture: Nullable | IProceduralTextureCreationOptions = null,\r\n generateMipMaps = true,\r\n isCube = false,\r\n textureType = Constants.TEXTURETYPE_UNSIGNED_INT\r\n ) {\r\n super(null, scene, !generateMipMaps);\r\n\r\n if (fallbackTexture !== null && !(fallbackTexture instanceof Texture)) {\r\n this._options = fallbackTexture;\r\n this._fallbackTexture = fallbackTexture.fallbackTexture ?? null;\r\n } else {\r\n this._options = {};\r\n this._fallbackTexture = fallbackTexture;\r\n }\r\n\r\n scene = this.getScene() || EngineStore.LastCreatedScene!;\r\n let component = scene._getComponent(SceneComponentConstants.NAME_PROCEDURALTEXTURE);\r\n if (!component) {\r\n component = new ProceduralTextureSceneComponent(scene);\r\n scene._addComponent(component);\r\n }\r\n scene.proceduralTextures.push(this);\r\n\r\n this._fullEngine = scene.getEngine();\r\n\r\n this.name = name;\r\n this.isRenderTarget = true;\r\n this._size = size;\r\n this._textureType = textureType;\r\n this._generateMipMaps = generateMipMaps;\r\n this._drawWrapper = new DrawWrapper(this._fullEngine);\r\n\r\n this.setFragment(fragment);\r\n\r\n const rtWrapper = this._createRtWrapper(isCube, size, generateMipMaps, textureType);\r\n this._texture = rtWrapper.texture;\r\n\r\n // VBO\r\n const vertices = [];\r\n vertices.push(1, 1);\r\n vertices.push(-1, 1);\r\n vertices.push(-1, -1);\r\n vertices.push(1, -1);\r\n\r\n this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(this._fullEngine, vertices, VertexBuffer.PositionKind, false, false, 2);\r\n\r\n this._createIndexBuffer();\r\n }\r\n\r\n private _createRtWrapper(isCube: boolean, size: TextureSize, generateMipMaps: boolean, textureType: number) {\r\n if (isCube) {\r\n this._rtWrapper = this._fullEngine.createRenderTargetCubeTexture(size as number, {\r\n generateMipMaps: generateMipMaps,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n type: textureType,\r\n ...this._options,\r\n });\r\n this.setFloat(\"face\", 0);\r\n } else {\r\n this._rtWrapper = this._fullEngine.createRenderTargetTexture(size, {\r\n generateMipMaps: generateMipMaps,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n type: textureType,\r\n ...this._options,\r\n });\r\n }\r\n return this._rtWrapper;\r\n }\r\n\r\n /**\r\n * The effect that is created when initializing the post process.\r\n * @returns The created effect corresponding the postprocess.\r\n */\r\n public getEffect(): Effect {\r\n return this._drawWrapper.effect!;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setEffect(effect: Effect) {\r\n this._drawWrapper.effect = effect;\r\n }\r\n\r\n /**\r\n * Gets texture content (Use this function wisely as reading from a texture can be slow)\r\n * @returns an ArrayBufferView promise (Uint8Array or Float32Array)\r\n */\r\n public getContent(): Nullable> {\r\n if (this._contentData && this._frameId === this._contentUpdateId) {\r\n return this._contentData;\r\n }\r\n\r\n if (this._contentData) {\r\n this._contentData.then((buffer) => {\r\n this._contentData = this.readPixels(0, 0, buffer);\r\n this._contentUpdateId = this._frameId;\r\n });\r\n } else {\r\n this._contentData = this.readPixels(0, 0);\r\n this._contentUpdateId = this._frameId;\r\n }\r\n\r\n return this._contentData;\r\n }\r\n\r\n private _createIndexBuffer(): void {\r\n const engine = this._fullEngine;\r\n\r\n // Indices\r\n const indices = [];\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n const vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n\r\n if (vb) {\r\n vb._rebuild();\r\n }\r\n\r\n this._createIndexBuffer();\r\n\r\n if (this.refreshRate === RenderTargetTexture.REFRESHRATE_RENDER_ONCE) {\r\n this.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE;\r\n }\r\n }\r\n\r\n /**\r\n * Resets the texture in order to recreate its associated resources.\r\n * This can be called in case of context loss or if you change the shader code and need to regenerate the texture with the new code\r\n */\r\n public reset(): void {\r\n this._drawWrapper.effect?.dispose();\r\n this._drawWrapper.effect = null;\r\n this._cachedDefines = null;\r\n }\r\n\r\n protected _getDefines(): string {\r\n return \"\";\r\n }\r\n\r\n /**\r\n * Executes a function when the texture will be ready to be drawn.\r\n * @param func The callback to be used.\r\n */\r\n public executeWhenReady(func: (texture: ProceduralTexture) => void): void {\r\n if (this.isReady()) {\r\n func(this);\r\n return;\r\n }\r\n\r\n const effect = this.getEffect();\r\n if (effect) {\r\n effect.executeWhenCompiled(() => {\r\n func(this);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Is the texture ready to be used ? (rendered at least once)\r\n * @returns true if ready, otherwise, false.\r\n */\r\n public isReady(): boolean {\r\n const engine = this._fullEngine;\r\n\r\n if (this.nodeMaterialSource) {\r\n return this._drawWrapper.effect!.isReady();\r\n }\r\n\r\n if (!this._fragment) {\r\n return false;\r\n }\r\n\r\n if (this._fallbackTextureUsed) {\r\n return true;\r\n }\r\n\r\n if (!this._texture) {\r\n return false;\r\n }\r\n\r\n const defines = this._getDefines();\r\n if (this._drawWrapper.effect && defines === this._cachedDefines && this._drawWrapper.effect.isReady()) {\r\n return true;\r\n }\r\n\r\n const shaders = {\r\n vertex: \"procedural\",\r\n fragmentElement: this._fragment.fragmentElement,\r\n fragmentSource: this._fragment.fragmentSource,\r\n fragment: typeof this._fragment === \"string\" ? this._fragment : undefined,\r\n };\r\n\r\n if (this._cachedDefines !== defines) {\r\n this._cachedDefines = defines;\r\n\r\n this._drawWrapper.effect = engine.createEffect(shaders, [VertexBuffer.PositionKind], this._uniforms, this._samplers, defines, undefined, undefined, () => {\r\n this._rtWrapper?.dispose();\r\n this._rtWrapper = this._texture = null;\r\n\r\n if (this._fallbackTexture) {\r\n this._texture = this._fallbackTexture._texture;\r\n\r\n if (this._texture) {\r\n this._texture.incrementReferences();\r\n }\r\n }\r\n\r\n this._fallbackTextureUsed = true;\r\n });\r\n }\r\n\r\n return this._drawWrapper.effect!.isReady();\r\n }\r\n\r\n /**\r\n * Resets the refresh counter of the texture and start bak from scratch.\r\n * Could be useful to regenerate the texture if it is setup to render only once.\r\n */\r\n public resetRefreshCounter(): void {\r\n this._currentRefreshId = -1;\r\n }\r\n\r\n /**\r\n * Set the fragment shader to use in order to render the texture.\r\n * @param fragment This can be set to a path (into the shader store) or to a json object containing a fragmentElement property.\r\n */\r\n public setFragment(fragment: any) {\r\n this._fragment = fragment;\r\n }\r\n\r\n /**\r\n * Define the refresh rate of the texture or the rendering frequency.\r\n * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...\r\n */\r\n @serialize()\r\n public get refreshRate(): number {\r\n return this._refreshRate;\r\n }\r\n\r\n public set refreshRate(value: number) {\r\n this._refreshRate = value;\r\n this.resetRefreshCounter();\r\n }\r\n\r\n /** @internal */\r\n public _shouldRender(): boolean {\r\n if (!this.isEnabled || !this.isReady() || !this._texture) {\r\n if (this._texture) {\r\n this._texture.isReady = false;\r\n }\r\n return false;\r\n }\r\n\r\n if (this._fallbackTextureUsed) {\r\n return false;\r\n }\r\n\r\n if (this._currentRefreshId === -1) {\r\n // At least render once\r\n this._currentRefreshId = 1;\r\n this._frameId++;\r\n return true;\r\n }\r\n\r\n if (this.refreshRate === this._currentRefreshId) {\r\n this._currentRefreshId = 1;\r\n this._frameId++;\r\n return true;\r\n }\r\n\r\n this._currentRefreshId++;\r\n return false;\r\n }\r\n\r\n /**\r\n * Get the size the texture is rendering at.\r\n * @returns the size (on cube texture it is always squared)\r\n */\r\n public getRenderSize(): TextureSize {\r\n return this._size;\r\n }\r\n\r\n /**\r\n * Resize the texture to new value.\r\n * @param size Define the new size the texture should have\r\n * @param generateMipMaps Define whether the new texture should create mip maps\r\n */\r\n public resize(size: TextureSize, generateMipMaps: boolean): void {\r\n if (this._fallbackTextureUsed || !this._rtWrapper || !this._texture) {\r\n return;\r\n }\r\n\r\n const isCube = this._texture.isCube;\r\n this._rtWrapper.dispose();\r\n\r\n const rtWrapper = this._createRtWrapper(isCube, size, generateMipMaps, this._textureType);\r\n this._texture = rtWrapper.texture;\r\n\r\n // Update properties\r\n this._size = size;\r\n this._generateMipMaps = generateMipMaps;\r\n }\r\n\r\n private _checkUniform(uniformName: string): void {\r\n if (this._uniforms.indexOf(uniformName) === -1) {\r\n this._uniforms.push(uniformName);\r\n }\r\n }\r\n\r\n /**\r\n * Set a texture in the shader program used to render.\r\n * @param name Define the name of the uniform samplers as defined in the shader\r\n * @param texture Define the texture to bind to this sampler\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setTexture(name: string, texture: Texture): ProceduralTexture {\r\n if (this._samplers.indexOf(name) === -1) {\r\n this._samplers.push(name);\r\n }\r\n this._textures[name] = texture;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a float in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setFloat(name: string, value: number): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._floats[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a int in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setInt(name: string, value: number): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._ints[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set an array of floats in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setFloats(name: string, value: number[]): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._floatsArrays[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec3 in the shader from a Color3.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setColor3(name: string, value: Color3): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._colors3[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 in the shader from a Color4.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setColor4(name: string, value: Color4): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._colors4[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec2 in the shader from a Vector2.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setVector2(name: string, value: Vector2): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._vectors2[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec3 in the shader from a Vector3.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setVector3(name: string, value: Vector3): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._vectors3[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a mat4 in the shader from a MAtrix.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the texture itself allowing \"fluent\" like uniform updates\r\n */\r\n public setMatrix(name: string, value: Matrix): ProceduralTexture {\r\n this._checkUniform(name);\r\n this._matrices[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Render the texture to its associated render target.\r\n * @param useCameraPostProcess Define if camera post process should be applied to the texture\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public render(useCameraPostProcess?: boolean): void {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n const engine = this._fullEngine;\r\n\r\n // Render\r\n engine.enableEffect(this._drawWrapper);\r\n this.onBeforeGenerationObservable.notifyObservers(this);\r\n engine.setState(false);\r\n\r\n if (!this.nodeMaterialSource) {\r\n // Texture\r\n for (const name in this._textures) {\r\n this._drawWrapper.effect!.setTexture(name, this._textures[name]);\r\n }\r\n\r\n // Float\r\n for (const name in this._ints) {\r\n this._drawWrapper.effect!.setInt(name, this._ints[name]);\r\n }\r\n\r\n // Float\r\n for (const name in this._floats) {\r\n this._drawWrapper.effect!.setFloat(name, this._floats[name]);\r\n }\r\n\r\n // Floats\r\n for (const name in this._floatsArrays) {\r\n this._drawWrapper.effect!.setArray(name, this._floatsArrays[name]);\r\n }\r\n\r\n // Color3\r\n for (const name in this._colors3) {\r\n this._drawWrapper.effect!.setColor3(name, this._colors3[name]);\r\n }\r\n\r\n // Color4\r\n for (const name in this._colors4) {\r\n const color = this._colors4[name];\r\n this._drawWrapper.effect!.setFloat4(name, color.r, color.g, color.b, color.a);\r\n }\r\n\r\n // Vector2\r\n for (const name in this._vectors2) {\r\n this._drawWrapper.effect!.setVector2(name, this._vectors2[name]);\r\n }\r\n\r\n // Vector3\r\n for (const name in this._vectors3) {\r\n this._drawWrapper.effect!.setVector3(name, this._vectors3[name]);\r\n }\r\n\r\n // Matrix\r\n for (const name in this._matrices) {\r\n this._drawWrapper.effect!.setMatrix(name, this._matrices[name]);\r\n }\r\n }\r\n\r\n if (!this._texture || !this._rtWrapper) {\r\n return;\r\n }\r\n\r\n engine._debugPushGroup?.(`procedural texture generation for ${this.name}`, 1);\r\n\r\n const viewPort = engine.currentViewport;\r\n if (this.isCube) {\r\n for (let face = 0; face < 6; face++) {\r\n engine.bindFramebuffer(this._rtWrapper, face, undefined, undefined, true);\r\n\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, this._drawWrapper.effect!);\r\n\r\n this._drawWrapper.effect!.setFloat(\"face\", face);\r\n\r\n // Clear\r\n if (this.autoClear) {\r\n engine.clear(scene.clearColor, true, false, false);\r\n }\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n }\r\n } else {\r\n engine.bindFramebuffer(this._rtWrapper, 0, undefined, undefined, true);\r\n\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, this._drawWrapper.effect!);\r\n\r\n // Clear\r\n if (this.autoClear) {\r\n engine.clear(scene.clearColor, true, false, false);\r\n }\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n }\r\n\r\n // Unbind and restore viewport\r\n engine.unBindFramebuffer(this._rtWrapper, this.isCube);\r\n if (viewPort) {\r\n engine.setViewport(viewPort);\r\n }\r\n\r\n // Mipmaps\r\n if (this.isCube) {\r\n engine.generateMipMapsForCubemap(this._texture);\r\n }\r\n\r\n engine._debugPopGroup?.(1);\r\n\r\n if (this.onGenerated) {\r\n this.onGenerated();\r\n }\r\n\r\n this.onGeneratedObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Clone the texture.\r\n * @returns the cloned texture\r\n */\r\n public clone(): ProceduralTexture {\r\n const textureSize = this.getSize();\r\n const newTexture = new ProceduralTexture(this.name, textureSize.width, this._fragment, this.getScene(), this._fallbackTexture, this._generateMipMaps);\r\n\r\n // Base texture\r\n newTexture.hasAlpha = this.hasAlpha;\r\n newTexture.level = this.level;\r\n\r\n // RenderTarget Texture\r\n newTexture.coordinatesMode = this.coordinatesMode;\r\n\r\n return newTexture;\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public dispose(): void {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n const index = scene.proceduralTextures.indexOf(this);\r\n\r\n if (index >= 0) {\r\n scene.proceduralTextures.splice(index, 1);\r\n }\r\n\r\n const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vertexBuffer) {\r\n vertexBuffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n\r\n if (this._indexBuffer && this._fullEngine._releaseBuffer(this._indexBuffer)) {\r\n this._indexBuffer = null;\r\n }\r\n\r\n this.onGeneratedObservable.clear();\r\n this.onBeforeGenerationObservable.clear();\r\n\r\n super.dispose();\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ProceduralTexture\", ProceduralTexture);\r\n", "import { NodeMaterialBlock } from \"../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../nodeMaterialBuildState\";\r\nimport type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport type { Scene } from \"../../../scene\";\r\n\r\n/**\r\n * Operations supported by the Trigonometry block\r\n */\r\nexport enum TrigonometryBlockOperations {\r\n /** Cos */\r\n Cos,\r\n /** Sin */\r\n Sin,\r\n /** Abs */\r\n Abs,\r\n /** Exp */\r\n Exp,\r\n /** Exp2 */\r\n Exp2,\r\n /** Round */\r\n Round,\r\n /** Floor */\r\n Floor,\r\n /** Ceiling */\r\n Ceiling,\r\n /** Square root */\r\n Sqrt,\r\n /** Log */\r\n Log,\r\n /** Tangent */\r\n Tan,\r\n /** Arc tangent */\r\n ArcTan,\r\n /** Arc cosinus */\r\n ArcCos,\r\n /** Arc sinus */\r\n ArcSin,\r\n /** Fraction */\r\n Fract,\r\n /** Sign */\r\n Sign,\r\n /** To radians (from degrees) */\r\n Radians,\r\n /** To degrees (from radians) */\r\n Degrees,\r\n}\r\n\r\n/**\r\n * Block used to apply trigonometry operation to floats\r\n */\r\nexport class TrigonometryBlock extends NodeMaterialBlock {\r\n /**\r\n * Gets or sets the operation applied by the block\r\n */\r\n public operation = TrigonometryBlockOperations.Cos;\r\n\r\n /**\r\n * Creates a new TrigonometryBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerInput(\"input\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerOutput(\"output\", NodeMaterialBlockConnectionPointTypes.BasedOnInput);\r\n\r\n this._outputs[0]._typeConnectionSource = this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"TrigonometryBlock\";\r\n }\r\n\r\n /**\r\n * Gets the input component\r\n */\r\n public get input(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const output = this._outputs[0];\r\n let operation = \"\";\r\n\r\n switch (this.operation) {\r\n case TrigonometryBlockOperations.Cos: {\r\n operation = \"cos\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Sin: {\r\n operation = \"sin\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Abs: {\r\n operation = \"abs\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Exp: {\r\n operation = \"exp\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Exp2: {\r\n operation = \"exp2\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Round: {\r\n operation = \"round\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Floor: {\r\n operation = \"floor\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Ceiling: {\r\n operation = \"ceil\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Sqrt: {\r\n operation = \"sqrt\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Log: {\r\n operation = \"log\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Tan: {\r\n operation = \"tan\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.ArcTan: {\r\n operation = \"atan\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.ArcCos: {\r\n operation = \"acos\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.ArcSin: {\r\n operation = \"asin\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Fract: {\r\n operation = \"fract\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Sign: {\r\n operation = \"sign\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Radians: {\r\n operation = \"radians\";\r\n break;\r\n }\r\n case TrigonometryBlockOperations.Degrees: {\r\n operation = \"degrees\";\r\n break;\r\n }\r\n }\r\n\r\n state.compilationString += this._declareOutput(output, state) + ` = ${operation}(${this.input.associatedVariableName});\\n`;\r\n\r\n return this;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.operation = this.operation;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.operation = serializationObject.operation;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n const codeString =\r\n super._dumpPropertiesCode() + `${this._codeVariableName}.operation = BABYLON.TrigonometryBlockOperations.${TrigonometryBlockOperations[this.operation]};\\n`;\r\n return codeString;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TrigonometryBlock\", TrigonometryBlock);\r\n", "import { NodeMaterialBlockConnectionPointTypes } from \"./Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport { NodeMaterialBlockTargets } from \"./Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialBuildStateSharedData } from \"./nodeMaterialBuildStateSharedData\";\r\nimport { Effect } from \"../effect\";\r\n\r\n/**\r\n * Class used to store node based material build state\r\n */\r\nexport class NodeMaterialBuildState {\r\n /** Gets or sets a boolean indicating if the current state can emit uniform buffers */\r\n public supportUniformBuffers = false;\r\n /**\r\n * Gets the list of emitted attributes\r\n */\r\n public attributes: string[] = [];\r\n /**\r\n * Gets the list of emitted uniforms\r\n */\r\n public uniforms: string[] = [];\r\n /**\r\n * Gets the list of emitted constants\r\n */\r\n public constants: string[] = [];\r\n /**\r\n * Gets the list of emitted samplers\r\n */\r\n public samplers: string[] = [];\r\n /**\r\n * Gets the list of emitted functions\r\n */\r\n public functions: { [key: string]: string } = {};\r\n /**\r\n * Gets the list of emitted extensions\r\n */\r\n public extensions: { [key: string]: string } = {};\r\n /**\r\n * Gets the list of emitted prePass outputs - if using the prepass\r\n */\r\n public prePassOutput: { [key: string]: string } = {};\r\n\r\n /**\r\n * Gets the target of the compilation state\r\n */\r\n public target: NodeMaterialBlockTargets;\r\n /**\r\n * Gets the list of emitted counters\r\n */\r\n public counters: { [key: string]: number } = {};\r\n\r\n /**\r\n * Shared data between multiple NodeMaterialBuildState instances\r\n */\r\n public sharedData: NodeMaterialBuildStateSharedData;\r\n\r\n /** @internal */\r\n public _vertexState: NodeMaterialBuildState;\r\n\r\n /** @internal */\r\n public _attributeDeclaration = \"\";\r\n /** @internal */\r\n public _uniformDeclaration = \"\";\r\n /** @internal */\r\n public _constantDeclaration = \"\";\r\n /** @internal */\r\n public _samplerDeclaration = \"\";\r\n /** @internal */\r\n public _varyingTransfer = \"\";\r\n /** @internal */\r\n public _injectAtEnd = \"\";\r\n\r\n private _repeatableContentAnchorIndex = 0;\r\n /** @internal */\r\n public _builtCompilationString = \"\";\r\n\r\n /**\r\n * Gets the emitted compilation strings\r\n */\r\n public compilationString = \"\";\r\n\r\n /**\r\n * Finalize the compilation strings\r\n * @param state defines the current compilation state\r\n */\r\n public finalize(state: NodeMaterialBuildState) {\r\n const emitComments = state.sharedData.emitComments;\r\n const isFragmentMode = this.target === NodeMaterialBlockTargets.Fragment;\r\n\r\n this.compilationString = `\\n${emitComments ? \"//Entry point\\n\" : \"\"}void main(void) {\\n${this.compilationString}`;\r\n\r\n if (this._constantDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Constants\\n\" : \"\"}${this._constantDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n let functionCode = \"\";\r\n for (const functionName in this.functions) {\r\n functionCode += this.functions[functionName] + `\\n`;\r\n }\r\n this.compilationString = `\\n${functionCode}\\n${this.compilationString}`;\r\n\r\n if (!isFragmentMode && this._varyingTransfer) {\r\n this.compilationString = `${this.compilationString}\\n${this._varyingTransfer}`;\r\n }\r\n\r\n if (this._injectAtEnd) {\r\n this.compilationString = `${this.compilationString}\\n${this._injectAtEnd}`;\r\n }\r\n\r\n this.compilationString = `${this.compilationString}\\n}`;\r\n\r\n if (this.sharedData.varyingDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Varyings\\n\" : \"\"}${this.sharedData.varyingDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this._samplerDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Samplers\\n\" : \"\"}${this._samplerDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this._uniformDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Uniforms\\n\" : \"\"}${this._uniformDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this._attributeDeclaration && !isFragmentMode) {\r\n this.compilationString = `\\n${emitComments ? \"//Attributes\\n\" : \"\"}${this._attributeDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n this.compilationString = \"precision highp float;\\n\" + this.compilationString;\r\n this.compilationString = \"#if defined(WEBGL2) || defined(WEBGPU)\\nprecision highp sampler2DArray;\\n#endif\\n\" + this.compilationString;\r\n\r\n if (isFragmentMode) {\r\n this.compilationString =\r\n \"#if defined(PREPASS)\\r\\n#extension GL_EXT_draw_buffers : require\\r\\nlayout(location = 0) out highp vec4 glFragData[SCENE_MRT_COUNT];\\r\\nhighp vec4 gl_FragColor;\\r\\n#endif\\r\\n\" +\r\n this.compilationString;\r\n }\r\n\r\n for (const extensionName in this.extensions) {\r\n const extension = this.extensions[extensionName];\r\n this.compilationString = `\\n${extension}\\n${this.compilationString}`;\r\n }\r\n\r\n this._builtCompilationString = this.compilationString;\r\n }\r\n\r\n /** @internal */\r\n public get _repeatableContentAnchor(): string {\r\n return `###___ANCHOR${this._repeatableContentAnchorIndex++}___###`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getFreeVariableName(prefix: string): string {\r\n prefix = prefix.replace(/[^a-zA-Z_]+/g, \"\");\r\n\r\n if (this.sharedData.variableNames[prefix] === undefined) {\r\n this.sharedData.variableNames[prefix] = 0;\r\n\r\n // Check reserved words\r\n if (prefix === \"output\" || prefix === \"texture\") {\r\n return prefix + this.sharedData.variableNames[prefix];\r\n }\r\n\r\n return prefix;\r\n } else {\r\n this.sharedData.variableNames[prefix]++;\r\n }\r\n\r\n return prefix + this.sharedData.variableNames[prefix];\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getFreeDefineName(prefix: string): string {\r\n if (this.sharedData.defineNames[prefix] === undefined) {\r\n this.sharedData.defineNames[prefix] = 0;\r\n } else {\r\n this.sharedData.defineNames[prefix]++;\r\n }\r\n\r\n return prefix + this.sharedData.defineNames[prefix];\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _excludeVariableName(name: string) {\r\n this.sharedData.variableNames[name] = 0;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emit2DSampler(name: string) {\r\n if (this.samplers.indexOf(name) < 0) {\r\n this._samplerDeclaration += `uniform sampler2D ${name};\\n`;\r\n this.samplers.push(name);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emit2DArraySampler(name: string) {\r\n if (this.samplers.indexOf(name) < 0) {\r\n this._samplerDeclaration += `uniform sampler2DArray ${name};\\n`;\r\n this.samplers.push(name);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getGLType(type: NodeMaterialBlockConnectionPointTypes): string {\r\n switch (type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n return \"float\";\r\n case NodeMaterialBlockConnectionPointTypes.Int:\r\n return \"int\";\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n return \"vec2\";\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n return \"vec3\";\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n return \"vec4\";\r\n case NodeMaterialBlockConnectionPointTypes.Matrix:\r\n return \"mat4\";\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitExtension(name: string, extension: string, define: string = \"\") {\r\n if (this.extensions[name]) {\r\n return;\r\n }\r\n\r\n if (define) {\r\n extension = `#if ${define}\\n${extension}\\n#endif`;\r\n }\r\n this.extensions[name] = extension;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitFunction(name: string, code: string, comments: string) {\r\n if (this.functions[name]) {\r\n return;\r\n }\r\n\r\n if (this.sharedData.emitComments) {\r\n code = comments + `\\n` + code;\r\n }\r\n\r\n this.functions[name] = code;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitCodeFromInclude(\r\n includeName: string,\r\n comments: string,\r\n options?: {\r\n replaceStrings?: { search: RegExp; replace: string }[];\r\n repeatKey?: string;\r\n substitutionVars?: string;\r\n }\r\n ) {\r\n if (options && options.repeatKey) {\r\n return `#include<${includeName}>${options.substitutionVars ? \"(\" + options.substitutionVars + \")\" : \"\"}[0..${options.repeatKey}]\\n`;\r\n }\r\n\r\n let code = Effect.IncludesShadersStore[includeName] + \"\\n\";\r\n\r\n if (this.sharedData.emitComments) {\r\n code = comments + `\\n` + code;\r\n }\r\n\r\n if (!options) {\r\n return code;\r\n }\r\n\r\n if (options.replaceStrings) {\r\n for (let index = 0; index < options.replaceStrings.length; index++) {\r\n const replaceString = options.replaceStrings[index];\r\n code = code.replace(replaceString.search, replaceString.replace);\r\n }\r\n }\r\n\r\n return code;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitFunctionFromInclude(\r\n includeName: string,\r\n comments: string,\r\n options?: {\r\n repeatKey?: string;\r\n substitutionVars?: string;\r\n removeAttributes?: boolean;\r\n removeUniforms?: boolean;\r\n removeVaryings?: boolean;\r\n removeIfDef?: boolean;\r\n replaceStrings?: { search: RegExp; replace: string }[];\r\n },\r\n storeKey: string = \"\"\r\n ) {\r\n const key = includeName + storeKey;\r\n if (this.functions[key]) {\r\n return;\r\n }\r\n\r\n if (!options || (!options.removeAttributes && !options.removeUniforms && !options.removeVaryings && !options.removeIfDef && !options.replaceStrings)) {\r\n if (options && options.repeatKey) {\r\n this.functions[key] = `#include<${includeName}>${options.substitutionVars ? \"(\" + options.substitutionVars + \")\" : \"\"}[0..${options.repeatKey}]\\n`;\r\n } else {\r\n this.functions[key] = `#include<${includeName}>${options?.substitutionVars ? \"(\" + options?.substitutionVars + \")\" : \"\"}\\n`;\r\n }\r\n\r\n if (this.sharedData.emitComments) {\r\n this.functions[key] = comments + `\\n` + this.functions[key];\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.functions[key] = Effect.IncludesShadersStore[includeName];\r\n\r\n if (this.sharedData.emitComments) {\r\n this.functions[key] = comments + `\\n` + this.functions[key];\r\n }\r\n\r\n if (options.removeIfDef) {\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#ifdef.+$/gm, \"\");\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#endif.*$/gm, \"\");\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#else.*$/gm, \"\");\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#elif.*$/gm, \"\");\r\n }\r\n\r\n if (options.removeAttributes) {\r\n this.functions[key] = this.functions[key].replace(/\\s*?attribute .+?;/g, \"\\n\");\r\n }\r\n\r\n if (options.removeUniforms) {\r\n this.functions[key] = this.functions[key].replace(/\\s*?uniform .*?;/g, \"\\n\");\r\n }\r\n\r\n if (options.removeVaryings) {\r\n this.functions[key] = this.functions[key].replace(/\\s*?(varying|in) .+?;/g, \"\\n\");\r\n }\r\n\r\n if (options.replaceStrings) {\r\n for (let index = 0; index < options.replaceStrings.length; index++) {\r\n const replaceString = options.replaceStrings[index];\r\n this.functions[key] = this.functions[key].replace(replaceString.search, replaceString.replace);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _registerTempVariable(name: string) {\r\n if (this.sharedData.temps.indexOf(name) !== -1) {\r\n return false;\r\n }\r\n\r\n this.sharedData.temps.push(name);\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitVaryingFromString(name: string, type: string, define: string = \"\", notDefine = false) {\r\n if (this.sharedData.varyings.indexOf(name) !== -1) {\r\n return false;\r\n }\r\n\r\n this.sharedData.varyings.push(name);\r\n\r\n if (define) {\r\n if (define.startsWith(\"defined(\")) {\r\n this.sharedData.varyingDeclaration += `#if ${define}\\n`;\r\n } else {\r\n this.sharedData.varyingDeclaration += `${notDefine ? \"#ifndef\" : \"#ifdef\"} ${define}\\n`;\r\n }\r\n }\r\n this.sharedData.varyingDeclaration += `varying ${type} ${name};\\n`;\r\n if (define) {\r\n this.sharedData.varyingDeclaration += `#endif\\n`;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitUniformFromString(name: string, type: string, define: string = \"\", notDefine = false) {\r\n if (this.uniforms.indexOf(name) !== -1) {\r\n return;\r\n }\r\n\r\n this.uniforms.push(name);\r\n\r\n if (define) {\r\n if (define.startsWith(\"defined(\")) {\r\n this._uniformDeclaration += `#if ${define}\\n`;\r\n } else {\r\n this._uniformDeclaration += `${notDefine ? \"#ifndef\" : \"#ifdef\"} ${define}\\n`;\r\n }\r\n }\r\n this._uniformDeclaration += `uniform ${type} ${name};\\n`;\r\n if (define) {\r\n this._uniformDeclaration += `#endif\\n`;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitFloat(value: number) {\r\n if (value.toString() === value.toFixed(0)) {\r\n return `${value}.0`;\r\n }\r\n\r\n return value.toString();\r\n }\r\n}\r\n", "import type { NodeMaterialConnectionPoint } from \"./nodeMaterialBlockConnectionPoint\";\r\nimport type { NodeMaterialBlock } from \"./nodeMaterialBlock\";\r\nimport type { InputBlock } from \"./Blocks/Input/inputBlock\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Immutable } from \"../../types\";\r\nimport type { NodeMaterial, NodeMaterialTextureBlocks } from \"./nodeMaterial\";\r\n\r\n/**\r\n * Class used to store shared data between 2 NodeMaterialBuildState\r\n */\r\nexport class NodeMaterialBuildStateSharedData {\r\n /**\r\n * The node material we are currently building\r\n */\r\n public nodeMaterial: NodeMaterial;\r\n\r\n /**\r\n * Gets the list of emitted varyings\r\n */\r\n public temps: string[] = [];\r\n\r\n /**\r\n * Gets the list of emitted varyings\r\n */\r\n public varyings: string[] = [];\r\n\r\n /**\r\n * Gets the varying declaration string\r\n */\r\n public varyingDeclaration = \"\";\r\n\r\n /**\r\n * List of the fragment output nodes\r\n */\r\n public fragmentOutputNodes: Immutable>;\r\n\r\n /**\r\n * Input blocks\r\n */\r\n public inputBlocks: InputBlock[] = [];\r\n\r\n /**\r\n * Input blocks\r\n */\r\n public textureBlocks: NodeMaterialTextureBlocks[] = [];\r\n\r\n /**\r\n * Bindable blocks (Blocks that need to set data to the effect)\r\n */\r\n public bindableBlocks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * Bindable blocks (Blocks that need to set data to the effect) that will always be called (by bindForSubMesh), contrary to bindableBlocks that won't be called if _mustRebind() returns false\r\n */\r\n public forcedBindableBlocks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * List of blocks that can provide a compilation fallback\r\n */\r\n public blocksWithFallbacks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * List of blocks that can provide a define update\r\n */\r\n public blocksWithDefines: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * List of blocks that can provide a repeatable content\r\n */\r\n public repeatableContentBlocks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * List of blocks that can provide a dynamic list of uniforms\r\n */\r\n public dynamicUniformBlocks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * List of blocks that can block the isReady function for the material\r\n */\r\n public blockingBlocks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * Gets the list of animated inputs\r\n */\r\n public animatedInputs: InputBlock[] = [];\r\n\r\n /**\r\n * Build Id used to avoid multiple recompilations\r\n */\r\n public buildId: number;\r\n\r\n /** List of emitted variables */\r\n public variableNames: { [key: string]: number } = {};\r\n\r\n /** List of emitted defines */\r\n public defineNames: { [key: string]: number } = {};\r\n\r\n /** Should emit comments? */\r\n public emitComments: boolean;\r\n\r\n /** Emit build activity */\r\n public verbose: boolean;\r\n\r\n /** Gets or sets the hosting scene */\r\n public scene: Scene;\r\n\r\n /**\r\n * Gets the compilation hints emitted at compilation time\r\n */\r\n public hints = {\r\n needWorldViewMatrix: false,\r\n needWorldViewProjectionMatrix: false,\r\n needAlphaBlending: false,\r\n needAlphaTesting: false,\r\n };\r\n\r\n /**\r\n * List of compilation checks\r\n */\r\n public checks = {\r\n emitVertex: false,\r\n emitFragment: false,\r\n notConnectedNonOptionalInputs: new Array(),\r\n };\r\n\r\n /**\r\n * Is vertex program allowed to be empty?\r\n */\r\n public allowEmptyVertexProgram: boolean = false;\r\n\r\n /** Creates a new shared data */\r\n public constructor() {\r\n // Exclude usual attributes from free variable names\r\n this.variableNames[\"position\"] = 0;\r\n this.variableNames[\"normal\"] = 0;\r\n this.variableNames[\"tangent\"] = 0;\r\n this.variableNames[\"uv\"] = 0;\r\n this.variableNames[\"uv2\"] = 0;\r\n this.variableNames[\"uv3\"] = 0;\r\n this.variableNames[\"uv4\"] = 0;\r\n this.variableNames[\"uv5\"] = 0;\r\n this.variableNames[\"uv6\"] = 0;\r\n this.variableNames[\"color\"] = 0;\r\n this.variableNames[\"matricesIndices\"] = 0;\r\n this.variableNames[\"matricesWeights\"] = 0;\r\n this.variableNames[\"matricesIndicesExtra\"] = 0;\r\n this.variableNames[\"matricesWeightsExtra\"] = 0;\r\n this.variableNames[\"diffuseBase\"] = 0;\r\n this.variableNames[\"specularBase\"] = 0;\r\n this.variableNames[\"worldPos\"] = 0;\r\n this.variableNames[\"shadow\"] = 0;\r\n this.variableNames[\"view\"] = 0;\r\n\r\n // Exclude known varyings\r\n this.variableNames[\"vTBN\"] = 0;\r\n\r\n // Exclude defines\r\n this.defineNames[\"MAINUV0\"] = 0;\r\n this.defineNames[\"MAINUV1\"] = 0;\r\n this.defineNames[\"MAINUV2\"] = 0;\r\n this.defineNames[\"MAINUV3\"] = 0;\r\n this.defineNames[\"MAINUV4\"] = 0;\r\n this.defineNames[\"MAINUV5\"] = 0;\r\n this.defineNames[\"MAINUV6\"] = 0;\r\n this.defineNames[\"MAINUV7\"] = 0;\r\n }\r\n\r\n /**\r\n * Emits console errors and exceptions if there is a failing check\r\n */\r\n public emitErrors() {\r\n let errorMessage = \"\";\r\n\r\n if (!this.checks.emitVertex && !this.allowEmptyVertexProgram) {\r\n errorMessage += \"NodeMaterial does not have a vertex output. You need to at least add a block that generates a glPosition value.\\n\";\r\n }\r\n if (!this.checks.emitFragment) {\r\n errorMessage += \"NodeMaterial does not have a fragment output. You need to at least add a block that generates a glFragColor value.\\n\";\r\n }\r\n for (const notConnectedInput of this.checks.notConnectedNonOptionalInputs) {\r\n errorMessage += `input ${notConnectedInput.name} from block ${\r\n notConnectedInput.ownerBlock.name\r\n }[${notConnectedInput.ownerBlock.getClassName()}] is not connected and is not optional.\\n`;\r\n }\r\n\r\n if (errorMessage) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Build of NodeMaterial failed:\\n\" + errorMessage;\r\n }\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { NodeMaterialBlock } from \"./nodeMaterialBlock\";\r\nimport { PushMaterial } from \"../pushMaterial\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Matrix, Vector2 } from \"../../Maths/math.vector\";\r\nimport { Color3, Color4 } from \"../../Maths/math.color\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport { Engine } from \"../../Engines/engine\";\r\nimport { NodeMaterialBuildState } from \"./nodeMaterialBuildState\";\r\nimport type { IEffectCreationOptions } from \"../effect\";\r\nimport { Effect } from \"../effect\";\r\nimport type { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { NodeMaterialBlockTargets } from \"./Enums/nodeMaterialBlockTargets\";\r\nimport { NodeMaterialBuildStateSharedData } from \"./nodeMaterialBuildStateSharedData\";\r\nimport type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport { MaterialDefines } from \"../../Materials/materialDefines\";\r\nimport type { NodeMaterialOptimizer } from \"./Optimizers/nodeMaterialOptimizer\";\r\nimport type { ImageProcessingConfiguration } from \"../imageProcessingConfiguration\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { TransformBlock } from \"./Blocks/transformBlock\";\r\nimport { VertexOutputBlock } from \"./Blocks/Vertex/vertexOutputBlock\";\r\nimport { FragmentOutputBlock } from \"./Blocks/Fragment/fragmentOutputBlock\";\r\nimport { InputBlock } from \"./Blocks/Input/inputBlock\";\r\nimport { GetClass, RegisterClass } from \"../../Misc/typeStore\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport type { TextureBlock } from \"./Blocks/Dual/textureBlock\";\r\nimport type { ReflectionTextureBaseBlock } from \"./Blocks/Dual/reflectionTextureBaseBlock\";\r\nimport type { RefractionBlock } from \"./Blocks/PBR/refractionBlock\";\r\nimport { CurrentScreenBlock } from \"./Blocks/Dual/currentScreenBlock\";\r\nimport { ParticleTextureBlock } from \"./Blocks/Particle/particleTextureBlock\";\r\nimport { ParticleRampGradientBlock } from \"./Blocks/Particle/particleRampGradientBlock\";\r\nimport { ParticleBlendMultiplyBlock } from \"./Blocks/Particle/particleBlendMultiplyBlock\";\r\nimport { EffectFallbacks } from \"../effectFallbacks\";\r\nimport { WebRequest } from \"../../Misc/webRequest\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport { VectorMergerBlock } from \"./Blocks/vectorMergerBlock\";\r\nimport { RemapBlock } from \"./Blocks/remapBlock\";\r\nimport { MultiplyBlock } from \"./Blocks/multiplyBlock\";\r\nimport { NodeMaterialModes } from \"./Enums/nodeMaterialModes\";\r\nimport { Texture } from \"../Textures/texture\";\r\nimport type { IParticleSystem } from \"../../Particles/IParticleSystem\";\r\nimport { BaseParticleSystem } from \"../../Particles/baseParticleSystem\";\r\nimport { ColorSplitterBlock } from \"./Blocks/colorSplitterBlock\";\r\nimport { TimingTools } from \"../../Misc/timingTools\";\r\nimport { ProceduralTexture } from \"../Textures/Procedurals/proceduralTexture\";\r\nimport { AnimatedInputBlockTypes } from \"./Blocks/Input/animatedInputBlockTypes\";\r\nimport { TrigonometryBlock, TrigonometryBlockOperations } from \"./Blocks/trigonometryBlock\";\r\nimport { NodeMaterialSystemValues } from \"./Enums/nodeMaterialSystemValues\";\r\nimport type { ImageSourceBlock } from \"./Blocks/Dual/imageSourceBlock\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport type { Material } from \"../material\";\r\nimport type { TriPlanarBlock } from \"./Blocks/triPlanarBlock\";\r\nimport type { BiPlanarBlock } from \"./Blocks/biPlanarBlock\";\r\nimport type { PrePassRenderer } from \"../../Rendering/prePassRenderer\";\r\nimport type { PrePassTextureBlock } from \"./Blocks/Input/prePassTextureBlock\";\r\nimport type { PrePassOutputBlock } from \"./Blocks/Fragment/prePassOutputBlock\";\r\nimport type { NodeMaterialTeleportOutBlock } from \"./Blocks/Teleport/teleportOutBlock\";\r\nimport type { NodeMaterialTeleportInBlock } from \"./Blocks/Teleport/teleportInBlock\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { PrepareDefinesForCamera, PrepareDefinesForPrePass } from \"../materialHelper.functions\";\r\nimport type { IImageProcessingConfigurationDefines } from \"../imageProcessingConfiguration.defines\";\r\n\r\nconst onCreatedEffectParameters = { effect: null as unknown as Effect, subMesh: null as unknown as Nullable };\r\n\r\n// declare NODEEDITOR namespace for compilation issue\r\ndeclare let NODEEDITOR: any;\r\ndeclare let BABYLON: any;\r\n\r\n/**\r\n * Interface used to configure the node material editor\r\n */\r\nexport interface INodeMaterialEditorOptions {\r\n /** Define the URL to load node editor script from */\r\n editorURL?: string;\r\n /** Additional configuration for the NME */\r\n nodeEditorConfig?: {\r\n backgroundColor?: Color4;\r\n };\r\n}\r\n\r\n/** @internal */\r\nexport class NodeMaterialDefines extends MaterialDefines implements IImageProcessingConfigurationDefines {\r\n /** Normal */\r\n public NORMAL = false;\r\n /** Tangent */\r\n public TANGENT = false;\r\n /** Vertex color */\r\n public VERTEXCOLOR_NME = false;\r\n /** Uv1 **/\r\n public UV1 = false;\r\n /** Uv2 **/\r\n public UV2 = false;\r\n /** Uv3 **/\r\n public UV3 = false;\r\n /** Uv4 **/\r\n public UV4 = false;\r\n /** Uv5 **/\r\n public UV5 = false;\r\n /** Uv6 **/\r\n public UV6 = false;\r\n\r\n /** Prepass **/\r\n public PREPASS = false;\r\n /** Prepass normal */\r\n public PREPASS_NORMAL = false;\r\n /** Prepass normal index */\r\n public PREPASS_NORMAL_INDEX = -1;\r\n /** Prepass position */\r\n public PREPASS_POSITION = false;\r\n /** Prepass position index */\r\n public PREPASS_POSITION_INDEX = -1;\r\n /** Prepass depth */\r\n public PREPASS_DEPTH = false;\r\n /** Prepass depth index */\r\n public PREPASS_DEPTH_INDEX = -1;\r\n /** Scene MRT count */\r\n public SCENE_MRT_COUNT = 0;\r\n\r\n /** BONES */\r\n public NUM_BONE_INFLUENCERS = 0;\r\n /** Bones per mesh */\r\n public BonesPerMesh = 0;\r\n /** Using texture for bone storage */\r\n public BONETEXTURE = false;\r\n\r\n /** MORPH TARGETS */\r\n public MORPHTARGETS = false;\r\n /** Morph target normal */\r\n public MORPHTARGETS_NORMAL = false;\r\n /** Morph target tangent */\r\n public MORPHTARGETS_TANGENT = false;\r\n /** Morph target uv */\r\n public MORPHTARGETS_UV = false;\r\n /** Number of morph influencers */\r\n public NUM_MORPH_INFLUENCERS = 0;\r\n /** Using a texture to store morph target data */\r\n public MORPHTARGETS_TEXTURE = false;\r\n\r\n /** IMAGE PROCESSING */\r\n public IMAGEPROCESSING = false;\r\n /** Vignette */\r\n public VIGNETTE = false;\r\n /** Multiply blend mode for vignette */\r\n public VIGNETTEBLENDMODEMULTIPLY = false;\r\n /** Opaque blend mode for vignette */\r\n public VIGNETTEBLENDMODEOPAQUE = false;\r\n /** Tone mapping */\r\n public TONEMAPPING = false;\r\n /** ACES tone mapping mode */\r\n public TONEMAPPING_ACES = false;\r\n /** Contrast */\r\n public CONTRAST = false;\r\n /** Exposure */\r\n public EXPOSURE = false;\r\n /** Color curves */\r\n public COLORCURVES = false;\r\n /** Color grading */\r\n public COLORGRADING = false;\r\n /** 3D color grading */\r\n public COLORGRADING3D = false;\r\n /** Sampler green depth */\r\n public SAMPLER3DGREENDEPTH = false;\r\n /** Sampler for BGR map */\r\n public SAMPLER3DBGRMAP = false;\r\n /** Dithering */\r\n public DITHER = false;\r\n /** Using post process for image processing */\r\n public IMAGEPROCESSINGPOSTPROCESS = false;\r\n /** Skip color clamp */\r\n public SKIPFINALCOLORCLAMP = false;\r\n\r\n /** MISC. */\r\n public BUMPDIRECTUV = 0;\r\n /** Camera is orthographic */\r\n public CAMERA_ORTHOGRAPHIC = false;\r\n /** Camera is perspective */\r\n public CAMERA_PERSPECTIVE = false;\r\n\r\n /**\r\n * Creates a new NodeMaterialDefines\r\n */\r\n constructor() {\r\n super();\r\n this.rebuild();\r\n }\r\n\r\n /**\r\n * Set the value of a specific key\r\n * @param name defines the name of the key to set\r\n * @param value defines the value to set\r\n * @param markAsUnprocessedIfDirty Flag to indicate to the cache that this value needs processing\r\n */\r\n public setValue(name: string, value: any, markAsUnprocessedIfDirty = false) {\r\n if (this[name] === undefined) {\r\n this._keys.push(name);\r\n }\r\n\r\n if (markAsUnprocessedIfDirty && this[name] !== value) {\r\n this.markAsUnprocessed();\r\n }\r\n\r\n this[name] = value;\r\n }\r\n}\r\n\r\n/**\r\n * Class used to configure NodeMaterial\r\n */\r\nexport interface INodeMaterialOptions {\r\n /**\r\n * Defines if blocks should emit comments\r\n */\r\n emitComments: boolean;\r\n}\r\n\r\n/**\r\n * Blocks that manage a texture\r\n */\r\nexport type NodeMaterialTextureBlocks =\r\n | TextureBlock\r\n | ReflectionTextureBaseBlock\r\n | RefractionBlock\r\n | CurrentScreenBlock\r\n | ParticleTextureBlock\r\n | ImageSourceBlock\r\n | TriPlanarBlock\r\n | BiPlanarBlock\r\n | PrePassTextureBlock;\r\n\r\n/**\r\n * Class used to create a node based material built by assembling shader blocks\r\n */\r\nexport class NodeMaterial extends PushMaterial {\r\n private static _BuildIdGenerator: number = 0;\r\n private _options: INodeMaterialOptions;\r\n private _vertexCompilationState: NodeMaterialBuildState;\r\n private _fragmentCompilationState: NodeMaterialBuildState;\r\n private _sharedData: NodeMaterialBuildStateSharedData;\r\n private _buildId: number = NodeMaterial._BuildIdGenerator++;\r\n private _buildWasSuccessful = false;\r\n private _cachedWorldViewMatrix = new Matrix();\r\n private _cachedWorldViewProjectionMatrix = new Matrix();\r\n private _optimizers = new Array();\r\n private _animationFrame = -1;\r\n\r\n /** Define the Url to load node editor script */\r\n public static EditorURL = `${Tools._DefaultCdnUrl}/v${Engine.Version}/nodeEditor/babylon.nodeEditor.js`;\r\n\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n /** Gets or sets a boolean indicating that node materials should not deserialize textures from json / snippet content */\r\n public static IgnoreTexturesAtLoadTime = false;\r\n\r\n /**\r\n * Checks if a block is a texture block\r\n * @param block The block to check\r\n * @returns True if the block is a texture block\r\n */\r\n public static _BlockIsTextureBlock(block: NodeMaterialBlock): block is NodeMaterialTextureBlocks {\r\n return (\r\n block.getClassName() === \"TextureBlock\" ||\r\n block.getClassName() === \"ReflectionTextureBaseBlock\" ||\r\n block.getClassName() === \"ReflectionTextureBlock\" ||\r\n block.getClassName() === \"ReflectionBlock\" ||\r\n block.getClassName() === \"RefractionBlock\" ||\r\n block.getClassName() === \"CurrentScreenBlock\" ||\r\n block.getClassName() === \"ParticleTextureBlock\" ||\r\n block.getClassName() === \"ImageSourceBlock\" ||\r\n block.getClassName() === \"TriPlanarBlock\" ||\r\n block.getClassName() === \"BiPlanarBlock\" ||\r\n block.getClassName() === \"PrePassTextureBlock\"\r\n );\r\n }\r\n\r\n private BJSNODEMATERIALEDITOR = this._getGlobalNodeMaterialEditor();\r\n\r\n /** Get the inspector from bundle or global\r\n * @returns the global NME\r\n */\r\n private _getGlobalNodeMaterialEditor(): any {\r\n // UMD Global name detection from Webpack Bundle UMD Name.\r\n if (typeof NODEEDITOR !== \"undefined\") {\r\n return NODEEDITOR;\r\n }\r\n\r\n // In case of module let's check the global emitted from the editor entry point.\r\n if (typeof BABYLON !== \"undefined\" && typeof BABYLON.NodeEditor !== \"undefined\") {\r\n return BABYLON;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Snippet ID if the material was created from the snippet server\r\n */\r\n public snippetId: string;\r\n\r\n /**\r\n * Gets or sets data used by visual editor\r\n * @see https://nme.babylonjs.com\r\n */\r\n public editorData: any = null;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that alpha value must be ignored (This will turn alpha blending off even if an alpha value is produced by the material)\r\n */\r\n @serialize()\r\n public ignoreAlpha = false;\r\n\r\n /**\r\n * Defines the maximum number of lights that can be used in the material\r\n */\r\n @serialize()\r\n public maxSimultaneousLights = 4;\r\n\r\n /**\r\n * Observable raised when the material is built\r\n */\r\n public onBuildObservable = new Observable();\r\n\r\n /**\r\n * Gets or sets the root nodes of the material vertex shader\r\n */\r\n public _vertexOutputNodes = new Array();\r\n\r\n /**\r\n * Gets or sets the root nodes of the material fragment (pixel) shader\r\n */\r\n public _fragmentOutputNodes = new Array();\r\n\r\n /** Gets or sets options to control the node material overall behavior */\r\n public get options() {\r\n return this._options;\r\n }\r\n\r\n public set options(options: INodeMaterialOptions) {\r\n this._options = options;\r\n }\r\n\r\n /**\r\n * Default configuration related to image processing available in the standard Material.\r\n */\r\n protected _imageProcessingConfiguration: ImageProcessingConfiguration;\r\n\r\n /**\r\n * Gets the image processing configuration used either in this material.\r\n */\r\n public get imageProcessingConfiguration(): ImageProcessingConfiguration {\r\n return this._imageProcessingConfiguration;\r\n }\r\n\r\n /**\r\n * Sets the Default image processing configuration used either in the this material.\r\n *\r\n * If sets to null, the scene one is in use.\r\n */\r\n public set imageProcessingConfiguration(value: ImageProcessingConfiguration) {\r\n this._attachImageProcessingConfiguration(value);\r\n\r\n // Ensure the effect will be rebuilt.\r\n this._markAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n /**\r\n * Gets an array of blocks that needs to be serialized even if they are not yet connected\r\n */\r\n public attachedBlocks: NodeMaterialBlock[] = [];\r\n\r\n /**\r\n * Specifies the mode of the node material\r\n * @internal\r\n */\r\n @serialize(\"mode\")\r\n public _mode: NodeMaterialModes = NodeMaterialModes.Material;\r\n\r\n /**\r\n * Gets or sets the mode property\r\n */\r\n public get mode(): NodeMaterialModes {\r\n return this._mode;\r\n }\r\n\r\n public set mode(value: NodeMaterialModes) {\r\n this._mode = value;\r\n }\r\n\r\n /** Gets or sets the unique identifier used to identified the effect associated with the material */\r\n public get buildId() {\r\n return this._buildId;\r\n }\r\n\r\n public set buildId(value: number) {\r\n this._buildId = value;\r\n }\r\n\r\n /**\r\n * A free comment about the material\r\n */\r\n @serialize(\"comment\")\r\n public comment: string;\r\n\r\n /**\r\n * Create a new node based material\r\n * @param name defines the material name\r\n * @param scene defines the hosting scene\r\n * @param options defines creation option\r\n */\r\n constructor(name: string, scene?: Scene, options: Partial = {}) {\r\n super(name, scene || EngineStore.LastCreatedScene!);\r\n\r\n this._options = {\r\n emitComments: false,\r\n ...options,\r\n };\r\n\r\n // Setup the default processing configuration to the scene.\r\n this._attachImageProcessingConfiguration(null);\r\n }\r\n\r\n /**\r\n * Gets the current class name of the material e.g. \"NodeMaterial\"\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"NodeMaterial\";\r\n }\r\n\r\n /**\r\n * Keep track of the image processing observer to allow dispose and replace.\r\n */\r\n private _imageProcessingObserver: Nullable>;\r\n\r\n /**\r\n * Attaches a new image processing configuration to the Standard Material.\r\n * @param configuration\r\n */\r\n protected _attachImageProcessingConfiguration(configuration: Nullable): void {\r\n if (configuration === this._imageProcessingConfiguration) {\r\n return;\r\n }\r\n\r\n // Detaches observer.\r\n if (this._imageProcessingConfiguration && this._imageProcessingObserver) {\r\n this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver);\r\n }\r\n\r\n // Pick the scene configuration if needed.\r\n if (!configuration) {\r\n this._imageProcessingConfiguration = this.getScene().imageProcessingConfiguration;\r\n } else {\r\n this._imageProcessingConfiguration = configuration;\r\n }\r\n\r\n // Attaches observer.\r\n if (this._imageProcessingConfiguration) {\r\n this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add(() => {\r\n this._markAllSubMeshesAsImageProcessingDirty();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get a block by its name\r\n * @param name defines the name of the block to retrieve\r\n * @returns the required block or null if not found\r\n */\r\n public getBlockByName(name: string) {\r\n let result = null;\r\n for (const block of this.attachedBlocks) {\r\n if (block.name === name) {\r\n if (!result) {\r\n result = block;\r\n } else {\r\n Tools.Warn(\"More than one block was found with the name `\" + name + \"`\");\r\n return result;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get a block using a predicate\r\n * @param predicate defines the predicate used to find the good candidate\r\n * @returns the required block or null if not found\r\n */\r\n public getBlockByPredicate(predicate: (block: NodeMaterialBlock) => boolean) {\r\n for (const block of this.attachedBlocks) {\r\n if (predicate(block)) {\r\n return block;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Get an input block using a predicate\r\n * @param predicate defines the predicate used to find the good candidate\r\n * @returns the required input block or null if not found\r\n */\r\n public getInputBlockByPredicate(predicate: (block: InputBlock) => boolean): Nullable {\r\n for (const block of this.attachedBlocks) {\r\n if (block.isInput && predicate(block as InputBlock)) {\r\n return block as InputBlock;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the list of input blocks attached to this material\r\n * @returns an array of InputBlocks\r\n */\r\n public getInputBlocks() {\r\n const blocks: InputBlock[] = [];\r\n for (const block of this.attachedBlocks) {\r\n if (block.isInput) {\r\n blocks.push(block as InputBlock);\r\n }\r\n }\r\n\r\n return blocks;\r\n }\r\n\r\n /**\r\n * Adds a new optimizer to the list of optimizers\r\n * @param optimizer defines the optimizers to add\r\n * @returns the current material\r\n */\r\n public registerOptimizer(optimizer: NodeMaterialOptimizer) {\r\n const index = this._optimizers.indexOf(optimizer);\r\n\r\n if (index > -1) {\r\n return;\r\n }\r\n\r\n this._optimizers.push(optimizer);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove an optimizer from the list of optimizers\r\n * @param optimizer defines the optimizers to remove\r\n * @returns the current material\r\n */\r\n public unregisterOptimizer(optimizer: NodeMaterialOptimizer) {\r\n const index = this._optimizers.indexOf(optimizer);\r\n\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n this._optimizers.splice(index, 1);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a new block to the list of output nodes\r\n * @param node defines the node to add\r\n * @returns the current material\r\n */\r\n public addOutputNode(node: NodeMaterialBlock) {\r\n if (node.target === null) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"This node is not meant to be an output node. You may want to explicitly set its target value.\";\r\n }\r\n\r\n if ((node.target & NodeMaterialBlockTargets.Vertex) !== 0) {\r\n this._addVertexOutputNode(node);\r\n }\r\n\r\n if ((node.target & NodeMaterialBlockTargets.Fragment) !== 0) {\r\n this._addFragmentOutputNode(node);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a block from the list of root nodes\r\n * @param node defines the node to remove\r\n * @returns the current material\r\n */\r\n public removeOutputNode(node: NodeMaterialBlock) {\r\n if (node.target === null) {\r\n return this;\r\n }\r\n\r\n if ((node.target & NodeMaterialBlockTargets.Vertex) !== 0) {\r\n this._removeVertexOutputNode(node);\r\n }\r\n\r\n if ((node.target & NodeMaterialBlockTargets.Fragment) !== 0) {\r\n this._removeFragmentOutputNode(node);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private _addVertexOutputNode(node: NodeMaterialBlock) {\r\n if (this._vertexOutputNodes.indexOf(node) !== -1) {\r\n return;\r\n }\r\n\r\n node.target = NodeMaterialBlockTargets.Vertex;\r\n this._vertexOutputNodes.push(node);\r\n\r\n return this;\r\n }\r\n\r\n private _removeVertexOutputNode(node: NodeMaterialBlock) {\r\n const index = this._vertexOutputNodes.indexOf(node);\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n this._vertexOutputNodes.splice(index, 1);\r\n\r\n return this;\r\n }\r\n\r\n private _addFragmentOutputNode(node: NodeMaterialBlock) {\r\n if (this._fragmentOutputNodes.indexOf(node) !== -1) {\r\n return;\r\n }\r\n\r\n node.target = NodeMaterialBlockTargets.Fragment;\r\n this._fragmentOutputNodes.push(node);\r\n\r\n return this;\r\n }\r\n\r\n private _removeFragmentOutputNode(node: NodeMaterialBlock) {\r\n const index = this._fragmentOutputNodes.indexOf(node);\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n this._fragmentOutputNodes.splice(index, 1);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that alpha blending must be enabled no matter what alpha value or alpha channel of the FragmentBlock are\r\n */\r\n @serialize()\r\n public forceAlphaBlending = false;\r\n\r\n /**\r\n * Specifies if the material will require alpha blending\r\n * @returns a boolean specifying if alpha blending is needed\r\n */\r\n public needAlphaBlending(): boolean {\r\n if (this.ignoreAlpha) {\r\n return false;\r\n }\r\n return this.forceAlphaBlending || this.alpha < 1.0 || (this._sharedData && this._sharedData.hints.needAlphaBlending);\r\n }\r\n\r\n /**\r\n * Specifies if this material should be rendered in alpha test mode\r\n * @returns a boolean specifying if an alpha test is needed.\r\n */\r\n public needAlphaTesting(): boolean {\r\n return this._sharedData && this._sharedData.hints.needAlphaTesting;\r\n }\r\n\r\n private _processInitializeOnLink(block: NodeMaterialBlock, state: NodeMaterialBuildState, nodesToProcessForOtherBuildState: NodeMaterialBlock[], autoConfigure = true) {\r\n if (block.target === NodeMaterialBlockTargets.VertexAndFragment) {\r\n nodesToProcessForOtherBuildState.push(block);\r\n } else if (state.target === NodeMaterialBlockTargets.Fragment && block.target === NodeMaterialBlockTargets.Vertex && block._preparationId !== this._buildId) {\r\n nodesToProcessForOtherBuildState.push(block);\r\n }\r\n this._initializeBlock(block, state, nodesToProcessForOtherBuildState, autoConfigure);\r\n }\r\n\r\n private _initializeBlock(node: NodeMaterialBlock, state: NodeMaterialBuildState, nodesToProcessForOtherBuildState: NodeMaterialBlock[], autoConfigure = true) {\r\n node.initialize(state);\r\n if (autoConfigure) {\r\n node.autoConfigure(this);\r\n }\r\n node._preparationId = this._buildId;\r\n\r\n if (this.attachedBlocks.indexOf(node) === -1) {\r\n if (node.isUnique) {\r\n const className = node.getClassName();\r\n\r\n for (const other of this.attachedBlocks) {\r\n if (other.getClassName() === className) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw `Cannot have multiple blocks of type ${className} in the same NodeMaterial`;\r\n }\r\n }\r\n }\r\n this.attachedBlocks.push(node);\r\n }\r\n\r\n for (const input of node.inputs) {\r\n input.associatedVariableName = \"\";\r\n\r\n const connectedPoint = input.connectedPoint;\r\n if (connectedPoint) {\r\n const block = connectedPoint.ownerBlock;\r\n if (block !== node) {\r\n this._processInitializeOnLink(block, state, nodesToProcessForOtherBuildState, autoConfigure);\r\n }\r\n }\r\n }\r\n\r\n // Teleportation\r\n if (node.isTeleportOut) {\r\n const teleport = node as NodeMaterialTeleportOutBlock;\r\n if (teleport.entryPoint) {\r\n this._processInitializeOnLink(teleport.entryPoint, state, nodesToProcessForOtherBuildState, autoConfigure);\r\n }\r\n }\r\n\r\n for (const output of node.outputs) {\r\n output.associatedVariableName = \"\";\r\n }\r\n }\r\n\r\n private _resetDualBlocks(node: NodeMaterialBlock, id: number) {\r\n if (node.target === NodeMaterialBlockTargets.VertexAndFragment) {\r\n node.buildId = id;\r\n }\r\n\r\n for (const inputs of node.inputs) {\r\n const connectedPoint = inputs.connectedPoint;\r\n if (connectedPoint) {\r\n const block = connectedPoint.ownerBlock;\r\n if (block !== node) {\r\n this._resetDualBlocks(block, id);\r\n }\r\n }\r\n }\r\n\r\n // If this is a teleport out, we need to reset the connected block\r\n if (node.isTeleportOut) {\r\n const teleportOut = node as NodeMaterialTeleportOutBlock;\r\n if (teleportOut.entryPoint) {\r\n this._resetDualBlocks(teleportOut.entryPoint, id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove a block from the current node material\r\n * @param block defines the block to remove\r\n */\r\n public removeBlock(block: NodeMaterialBlock) {\r\n const attachedBlockIndex = this.attachedBlocks.indexOf(block);\r\n if (attachedBlockIndex > -1) {\r\n this.attachedBlocks.splice(attachedBlockIndex, 1);\r\n }\r\n\r\n if (block.isFinalMerger) {\r\n this.removeOutputNode(block);\r\n }\r\n }\r\n\r\n /**\r\n * Build the material and generates the inner effect\r\n * @param verbose defines if the build should log activity\r\n * @param updateBuildId defines if the internal build Id should be updated (default is true)\r\n * @param autoConfigure defines if the autoConfigure method should be called when initializing blocks (default is false)\r\n */\r\n public build(verbose: boolean = false, updateBuildId = true, autoConfigure = false) {\r\n // First time?\r\n if (!this._vertexCompilationState && !autoConfigure) {\r\n autoConfigure = true;\r\n }\r\n\r\n this._buildWasSuccessful = false;\r\n const engine = this.getScene().getEngine();\r\n\r\n const allowEmptyVertexProgram = this._mode === NodeMaterialModes.Particle;\r\n\r\n if (this._vertexOutputNodes.length === 0 && !allowEmptyVertexProgram) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"You must define at least one vertexOutputNode\";\r\n }\r\n\r\n if (this._fragmentOutputNodes.length === 0) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"You must define at least one fragmentOutputNode\";\r\n }\r\n\r\n // Compilation state\r\n this._vertexCompilationState = new NodeMaterialBuildState();\r\n this._vertexCompilationState.supportUniformBuffers = engine.supportsUniformBuffers;\r\n this._vertexCompilationState.target = NodeMaterialBlockTargets.Vertex;\r\n this._fragmentCompilationState = new NodeMaterialBuildState();\r\n this._fragmentCompilationState.supportUniformBuffers = engine.supportsUniformBuffers;\r\n this._fragmentCompilationState.target = NodeMaterialBlockTargets.Fragment;\r\n\r\n // Shared data\r\n this._sharedData = new NodeMaterialBuildStateSharedData();\r\n this._sharedData.nodeMaterial = this;\r\n this._sharedData.fragmentOutputNodes = this._fragmentOutputNodes;\r\n this._vertexCompilationState.sharedData = this._sharedData;\r\n this._fragmentCompilationState.sharedData = this._sharedData;\r\n this._sharedData.buildId = this._buildId;\r\n this._sharedData.emitComments = this._options.emitComments;\r\n this._sharedData.verbose = verbose;\r\n this._sharedData.scene = this.getScene();\r\n this._sharedData.allowEmptyVertexProgram = allowEmptyVertexProgram;\r\n\r\n // Initialize blocks\r\n const vertexNodes: NodeMaterialBlock[] = [];\r\n const fragmentNodes: NodeMaterialBlock[] = [];\r\n\r\n for (const vertexOutputNode of this._vertexOutputNodes) {\r\n vertexNodes.push(vertexOutputNode);\r\n this._initializeBlock(vertexOutputNode, this._vertexCompilationState, fragmentNodes, autoConfigure);\r\n }\r\n\r\n for (const fragmentOutputNode of this._fragmentOutputNodes) {\r\n fragmentNodes.push(fragmentOutputNode);\r\n this._initializeBlock(fragmentOutputNode, this._fragmentCompilationState, vertexNodes, autoConfigure);\r\n }\r\n\r\n // Optimize\r\n this.optimize();\r\n\r\n // Vertex\r\n for (const vertexOutputNode of vertexNodes) {\r\n vertexOutputNode.build(this._vertexCompilationState, vertexNodes);\r\n }\r\n\r\n // Fragment\r\n this._fragmentCompilationState.uniforms = this._vertexCompilationState.uniforms.slice(0);\r\n this._fragmentCompilationState._uniformDeclaration = this._vertexCompilationState._uniformDeclaration;\r\n this._fragmentCompilationState._constantDeclaration = this._vertexCompilationState._constantDeclaration;\r\n this._fragmentCompilationState._vertexState = this._vertexCompilationState;\r\n\r\n for (const fragmentOutputNode of fragmentNodes) {\r\n this._resetDualBlocks(fragmentOutputNode, this._buildId - 1);\r\n }\r\n\r\n for (const fragmentOutputNode of fragmentNodes) {\r\n fragmentOutputNode.build(this._fragmentCompilationState, fragmentNodes);\r\n }\r\n\r\n // Finalize\r\n this._vertexCompilationState.finalize(this._vertexCompilationState);\r\n this._fragmentCompilationState.finalize(this._fragmentCompilationState);\r\n\r\n if (updateBuildId) {\r\n this._buildId = NodeMaterial._BuildIdGenerator++;\r\n }\r\n\r\n // Errors\r\n this._sharedData.emitErrors();\r\n\r\n if (verbose) {\r\n Logger.Log(\"Vertex shader:\");\r\n Logger.Log(this._vertexCompilationState.compilationString);\r\n Logger.Log(\"Fragment shader:\");\r\n Logger.Log(this._fragmentCompilationState.compilationString);\r\n }\r\n\r\n this._buildWasSuccessful = true;\r\n this.onBuildObservable.notifyObservers(this);\r\n\r\n // Wipe defines\r\n const meshes = this.getScene().meshes;\r\n for (const mesh of meshes) {\r\n if (!mesh.subMeshes) {\r\n continue;\r\n }\r\n for (const subMesh of mesh.subMeshes) {\r\n if (subMesh.getMaterial() !== this) {\r\n continue;\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n continue;\r\n }\r\n\r\n const defines = subMesh.materialDefines;\r\n defines.markAllAsDirty();\r\n defines.reset();\r\n }\r\n }\r\n\r\n if (this.prePassTextureInputs.length) {\r\n this.getScene().enablePrePassRenderer();\r\n }\r\n const prePassRenderer = this.getScene().prePassRenderer;\r\n if (prePassRenderer) {\r\n prePassRenderer.markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Runs an otpimization phase to try to improve the shader code\r\n */\r\n public optimize() {\r\n for (const optimizer of this._optimizers) {\r\n optimizer.optimize(this._vertexOutputNodes, this._fragmentOutputNodes);\r\n }\r\n }\r\n\r\n private _prepareDefinesForAttributes(mesh: AbstractMesh, defines: NodeMaterialDefines) {\r\n const oldNormal = defines[\"NORMAL\"];\r\n const oldTangent = defines[\"TANGENT\"];\r\n const oldColor = defines[\"VERTEXCOLOR_NME\"];\r\n\r\n defines[\"NORMAL\"] = mesh.isVerticesDataPresent(VertexBuffer.NormalKind);\r\n defines[\"TANGENT\"] = mesh.isVerticesDataPresent(VertexBuffer.TangentKind);\r\n\r\n const hasVertexColors = mesh.useVertexColors && mesh.isVerticesDataPresent(VertexBuffer.ColorKind);\r\n defines[\"VERTEXCOLOR_NME\"] = hasVertexColors;\r\n\r\n let uvChanged = false;\r\n for (let i = 1; i <= Constants.MAX_SUPPORTED_UV_SETS; ++i) {\r\n const oldUV = defines[\"UV\" + i];\r\n defines[\"UV\" + i] = mesh.isVerticesDataPresent(`uv${i === 1 ? \"\" : i}`);\r\n uvChanged = uvChanged || defines[\"UV\" + i] !== oldUV;\r\n }\r\n\r\n // PrePass\r\n const oit = this.needAlphaBlendingForMesh(mesh) && this.getScene().useOrderIndependentTransparency;\r\n PrepareDefinesForPrePass(this.getScene(), defines, !oit);\r\n\r\n if (oldNormal !== defines[\"NORMAL\"] || oldTangent !== defines[\"TANGENT\"] || oldColor !== defines[\"VERTEXCOLOR_NME\"] || uvChanged) {\r\n defines.markAsAttributesDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Can this material render to prepass\r\n */\r\n public get isPrePassCapable(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Outputs written to the prepass\r\n */\r\n public get prePassTextureOutputs(): number[] {\r\n const prePassOutputBlock = this.getBlockByPredicate((block) => block.getClassName() === \"PrePassOutputBlock\") as PrePassOutputBlock;\r\n const result = [Constants.PREPASS_COLOR_TEXTURE_TYPE];\r\n if (!prePassOutputBlock) {\r\n return result;\r\n }\r\n // Cannot write to prepass if we alread read from prepass\r\n if (this.prePassTextureInputs.length) {\r\n return result;\r\n }\r\n\r\n if (prePassOutputBlock.viewDepth.isConnected) {\r\n result.push(Constants.PREPASS_DEPTH_TEXTURE_TYPE);\r\n }\r\n\r\n if (prePassOutputBlock.viewNormal.isConnected) {\r\n result.push(Constants.PREPASS_NORMAL_TEXTURE_TYPE);\r\n }\r\n\r\n if (prePassOutputBlock.worldPosition.isConnected) {\r\n result.push(Constants.PREPASS_POSITION_TEXTURE_TYPE);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the list of prepass texture required\r\n */\r\n public get prePassTextureInputs(): number[] {\r\n const prePassTextureBlocks = this.getAllTextureBlocks().filter((block) => block.getClassName() === \"PrePassTextureBlock\") as PrePassTextureBlock[];\r\n const result = [] as number[];\r\n\r\n for (const block of prePassTextureBlocks) {\r\n if (block.position.isConnected && !result.includes(Constants.PREPASS_POSITION_TEXTURE_TYPE)) {\r\n result.push(Constants.PREPASS_POSITION_TEXTURE_TYPE);\r\n }\r\n if (block.depth.isConnected && !result.includes(Constants.PREPASS_DEPTH_TEXTURE_TYPE)) {\r\n result.push(Constants.PREPASS_DEPTH_TEXTURE_TYPE);\r\n }\r\n if (block.normal.isConnected && !result.includes(Constants.PREPASS_NORMAL_TEXTURE_TYPE)) {\r\n result.push(Constants.PREPASS_NORMAL_TEXTURE_TYPE);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the required values to the prepass renderer.\r\n * @param prePassRenderer defines the prepass renderer to set\r\n * @returns true if the pre pass is needed\r\n */\r\n public setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean {\r\n const prePassTexturesRequired = this.prePassTextureInputs.concat(this.prePassTextureOutputs);\r\n\r\n if (prePassRenderer && prePassTexturesRequired.length > 1) {\r\n let cfg = prePassRenderer.getEffectConfiguration(\"nodeMaterial\");\r\n if (!cfg) {\r\n cfg = prePassRenderer.addEffectConfiguration({\r\n enabled: true,\r\n needsImageProcessing: false,\r\n name: \"nodeMaterial\",\r\n texturesRequired: [],\r\n });\r\n }\r\n for (const prePassTexture of prePassTexturesRequired) {\r\n if (!cfg.texturesRequired.includes(prePassTexture)) {\r\n cfg.texturesRequired.push(prePassTexture);\r\n }\r\n }\r\n cfg.enabled = true;\r\n }\r\n\r\n // COLOR_TEXTURE is always required for prepass, length > 1 means\r\n // we actually need to write to special prepass textures\r\n return prePassTexturesRequired.length > 1;\r\n }\r\n\r\n /**\r\n * Create a post process from the material\r\n * @param camera The camera to apply the render pass to.\r\n * @param options The required width/height ratio to downsize to before computing the render pass. (Use 1.0 for full size)\r\n * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)\r\n * @param engine The engine which the post process will be applied. (default: current engine)\r\n * @param reusable If the post process can be reused on the same frame. (default: false)\r\n * @param textureType Type of textures used when performing the post process. (default: 0)\r\n * @param textureFormat Format of textures used when performing the post process. (default: TEXTUREFORMAT_RGBA)\r\n * @returns the post process created\r\n */\r\n public createPostProcess(\r\n camera: Nullable,\r\n options: number | PostProcessOptions = 1,\r\n samplingMode: number = Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n engine?: Engine,\r\n reusable?: boolean,\r\n textureType: number = Constants.TEXTURETYPE_UNSIGNED_INT,\r\n textureFormat = Constants.TEXTUREFORMAT_RGBA\r\n ): Nullable {\r\n if (this.mode !== NodeMaterialModes.PostProcess) {\r\n Logger.Log(\"Incompatible material mode\");\r\n return null;\r\n }\r\n return this._createEffectForPostProcess(null, camera, options, samplingMode, engine, reusable, textureType, textureFormat);\r\n }\r\n\r\n /**\r\n * Create the post process effect from the material\r\n * @param postProcess The post process to create the effect for\r\n */\r\n public createEffectForPostProcess(postProcess: PostProcess) {\r\n this._createEffectForPostProcess(postProcess);\r\n }\r\n\r\n private _createEffectForPostProcess(\r\n postProcess: Nullable,\r\n camera?: Nullable,\r\n options: number | PostProcessOptions = 1,\r\n samplingMode: number = Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n engine?: Engine,\r\n reusable?: boolean,\r\n textureType: number = Constants.TEXTURETYPE_UNSIGNED_INT,\r\n textureFormat = Constants.TEXTUREFORMAT_RGBA\r\n ): PostProcess {\r\n let tempName = this.name + this._buildId;\r\n\r\n const defines = new NodeMaterialDefines();\r\n\r\n const dummyMesh = new AbstractMesh(tempName + \"PostProcess\", this.getScene());\r\n\r\n let buildId = this._buildId;\r\n\r\n this._processDefines(dummyMesh, defines);\r\n\r\n Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString);\r\n\r\n if (!postProcess) {\r\n postProcess = new PostProcess(\r\n this.name + \"PostProcess\",\r\n tempName,\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n options,\r\n camera!,\r\n samplingMode,\r\n engine,\r\n reusable,\r\n defines.toString(),\r\n textureType,\r\n tempName,\r\n { maxSimultaneousLights: this.maxSimultaneousLights },\r\n false,\r\n textureFormat\r\n );\r\n } else {\r\n postProcess.updateEffect(\r\n defines.toString(),\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n { maxSimultaneousLights: this.maxSimultaneousLights },\r\n undefined,\r\n undefined,\r\n tempName,\r\n tempName\r\n );\r\n }\r\n\r\n postProcess.nodeMaterialSource = this;\r\n\r\n postProcess.onApplyObservable.add((effect) => {\r\n if (buildId !== this._buildId) {\r\n delete Effect.ShadersStore[tempName + \"VertexShader\"];\r\n delete Effect.ShadersStore[tempName + \"PixelShader\"];\r\n\r\n tempName = this.name + this._buildId;\r\n\r\n defines.markAllAsDirty();\r\n\r\n buildId = this._buildId;\r\n }\r\n\r\n const result = this._processDefines(dummyMesh, defines);\r\n\r\n if (result) {\r\n Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString);\r\n\r\n TimingTools.SetImmediate(() =>\r\n postProcess!.updateEffect(\r\n defines.toString(),\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n { maxSimultaneousLights: this.maxSimultaneousLights },\r\n undefined,\r\n undefined,\r\n tempName,\r\n tempName\r\n )\r\n );\r\n }\r\n\r\n this._checkInternals(effect);\r\n });\r\n\r\n return postProcess;\r\n }\r\n\r\n /**\r\n * Create a new procedural texture based on this node material\r\n * @param size defines the size of the texture\r\n * @param scene defines the hosting scene\r\n * @returns the new procedural texture attached to this node material\r\n */\r\n public createProceduralTexture(size: number | { width: number; height: number; layers?: number }, scene: Scene): Nullable {\r\n if (this.mode !== NodeMaterialModes.ProceduralTexture) {\r\n Logger.Log(\"Incompatible material mode\");\r\n return null;\r\n }\r\n\r\n let tempName = this.name + this._buildId;\r\n\r\n const proceduralTexture = new ProceduralTexture(tempName, size, null, scene);\r\n\r\n const dummyMesh = new AbstractMesh(tempName + \"Procedural\", this.getScene());\r\n dummyMesh.reservedDataStore = {\r\n hidden: true,\r\n };\r\n\r\n const defines = new NodeMaterialDefines();\r\n const result = this._processDefines(dummyMesh, defines);\r\n Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString);\r\n\r\n let effect = this.getScene().getEngine().createEffect(\r\n {\r\n vertexElement: tempName,\r\n fragmentElement: tempName,\r\n },\r\n [VertexBuffer.PositionKind],\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n defines.toString(),\r\n result?.fallbacks,\r\n undefined\r\n );\r\n\r\n proceduralTexture.nodeMaterialSource = this;\r\n proceduralTexture._setEffect(effect);\r\n\r\n let buildId = this._buildId;\r\n proceduralTexture.onBeforeGenerationObservable.add(() => {\r\n if (buildId !== this._buildId) {\r\n delete Effect.ShadersStore[tempName + \"VertexShader\"];\r\n delete Effect.ShadersStore[tempName + \"PixelShader\"];\r\n\r\n tempName = this.name + this._buildId;\r\n\r\n defines.markAllAsDirty();\r\n\r\n buildId = this._buildId;\r\n }\r\n\r\n const result = this._processDefines(dummyMesh, defines);\r\n\r\n if (result) {\r\n Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString, this._vertexCompilationState._builtCompilationString);\r\n\r\n TimingTools.SetImmediate(() => {\r\n effect = this.getScene().getEngine().createEffect(\r\n {\r\n vertexElement: tempName,\r\n fragmentElement: tempName,\r\n },\r\n [VertexBuffer.PositionKind],\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n defines.toString(),\r\n result?.fallbacks,\r\n undefined\r\n );\r\n\r\n proceduralTexture._setEffect(effect);\r\n });\r\n }\r\n\r\n this._checkInternals(effect);\r\n });\r\n\r\n return proceduralTexture;\r\n }\r\n\r\n private _createEffectForParticles(\r\n particleSystem: IParticleSystem,\r\n blendMode: number,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n effect?: Effect,\r\n defines?: NodeMaterialDefines,\r\n dummyMesh?: Nullable,\r\n particleSystemDefinesJoined = \"\"\r\n ) {\r\n let tempName = this.name + this._buildId + \"_\" + blendMode;\r\n\r\n if (!defines) {\r\n defines = new NodeMaterialDefines();\r\n }\r\n\r\n if (!dummyMesh) {\r\n dummyMesh = this.getScene().getMeshByName(this.name + \"Particle\");\r\n if (!dummyMesh) {\r\n dummyMesh = new AbstractMesh(this.name + \"Particle\", this.getScene());\r\n dummyMesh.reservedDataStore = {\r\n hidden: true,\r\n };\r\n }\r\n }\r\n\r\n let buildId = this._buildId;\r\n\r\n const particleSystemDefines: Array = [];\r\n let join = particleSystemDefinesJoined;\r\n\r\n if (!effect) {\r\n const result = this._processDefines(dummyMesh, defines);\r\n\r\n Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString);\r\n\r\n particleSystem.fillDefines(particleSystemDefines, blendMode);\r\n\r\n join = particleSystemDefines.join(\"\\n\");\r\n\r\n effect = this.getScene()\r\n .getEngine()\r\n .createEffectForParticles(\r\n tempName,\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n defines.toString() + \"\\n\" + join,\r\n result?.fallbacks,\r\n onCompiled,\r\n onError,\r\n particleSystem\r\n );\r\n\r\n particleSystem.setCustomEffect(effect, blendMode);\r\n }\r\n\r\n effect.onBindObservable.add((effect) => {\r\n if (buildId !== this._buildId) {\r\n delete Effect.ShadersStore[tempName + \"PixelShader\"];\r\n\r\n tempName = this.name + this._buildId + \"_\" + blendMode;\r\n\r\n defines!.markAllAsDirty();\r\n\r\n buildId = this._buildId;\r\n }\r\n\r\n particleSystemDefines.length = 0;\r\n\r\n particleSystem.fillDefines(particleSystemDefines, blendMode);\r\n\r\n const particleSystemDefinesJoinedCurrent = particleSystemDefines.join(\"\\n\");\r\n\r\n if (particleSystemDefinesJoinedCurrent !== join) {\r\n defines!.markAllAsDirty();\r\n join = particleSystemDefinesJoinedCurrent;\r\n }\r\n\r\n const result = this._processDefines(dummyMesh!, defines!);\r\n\r\n if (result) {\r\n Effect.RegisterShader(tempName, this._fragmentCompilationState._builtCompilationString);\r\n\r\n effect = this.getScene()\r\n .getEngine()\r\n .createEffectForParticles(\r\n tempName,\r\n this._fragmentCompilationState.uniforms,\r\n this._fragmentCompilationState.samplers,\r\n defines!.toString() + \"\\n\" + join,\r\n result?.fallbacks,\r\n onCompiled,\r\n onError,\r\n particleSystem\r\n );\r\n particleSystem.setCustomEffect(effect, blendMode);\r\n this._createEffectForParticles(particleSystem, blendMode, onCompiled, onError, effect, defines, dummyMesh, particleSystemDefinesJoined); // add the effect.onBindObservable observer\r\n return;\r\n }\r\n\r\n this._checkInternals(effect);\r\n });\r\n }\r\n\r\n private _checkInternals(effect: Effect) {\r\n // Animated blocks\r\n if (this._sharedData.animatedInputs) {\r\n const scene = this.getScene();\r\n\r\n const frameId = scene.getFrameId();\r\n\r\n if (this._animationFrame !== frameId) {\r\n for (const input of this._sharedData.animatedInputs) {\r\n input.animate(scene);\r\n }\r\n\r\n this._animationFrame = frameId;\r\n }\r\n }\r\n\r\n // Bindable blocks\r\n for (const block of this._sharedData.bindableBlocks) {\r\n block.bind(effect, this);\r\n }\r\n\r\n // Connection points\r\n for (const inputBlock of this._sharedData.inputBlocks) {\r\n inputBlock._transmit(effect, this.getScene(), this);\r\n }\r\n }\r\n\r\n /**\r\n * Create the effect to be used as the custom effect for a particle system\r\n * @param particleSystem Particle system to create the effect for\r\n * @param onCompiled defines a function to call when the effect creation is successful\r\n * @param onError defines a function to call when the effect creation has failed\r\n */\r\n public createEffectForParticles(particleSystem: IParticleSystem, onCompiled?: (effect: Effect) => void, onError?: (effect: Effect, errors: string) => void) {\r\n if (this.mode !== NodeMaterialModes.Particle) {\r\n Logger.Log(\"Incompatible material mode\");\r\n return;\r\n }\r\n\r\n this._createEffectForParticles(particleSystem, BaseParticleSystem.BLENDMODE_ONEONE, onCompiled, onError);\r\n this._createEffectForParticles(particleSystem, BaseParticleSystem.BLENDMODE_MULTIPLY, onCompiled, onError);\r\n }\r\n\r\n /**\r\n * Use this material as the shadow depth wrapper of a target material\r\n * @param targetMaterial defines the target material\r\n */\r\n public createAsShadowDepthWrapper(targetMaterial: Material) {\r\n if (this.mode !== NodeMaterialModes.Material) {\r\n Logger.Log(\"Incompatible material mode\");\r\n return;\r\n }\r\n\r\n targetMaterial.shadowDepthWrapper = new BABYLON.ShadowDepthWrapper(this, this.getScene());\r\n }\r\n\r\n private _processDefines(\r\n mesh: AbstractMesh,\r\n defines: NodeMaterialDefines,\r\n useInstances = false,\r\n subMesh?: SubMesh\r\n ): Nullable<{\r\n lightDisposed: boolean;\r\n uniformBuffers: string[];\r\n mergedUniforms: string[];\r\n mergedSamplers: string[];\r\n fallbacks: EffectFallbacks;\r\n }> {\r\n let result = null;\r\n\r\n // Global defines\r\n const scene = this.getScene();\r\n if (PrepareDefinesForCamera(scene, defines)) {\r\n defines.markAsMiscDirty();\r\n }\r\n\r\n // Shared defines\r\n this._sharedData.blocksWithDefines.forEach((b) => {\r\n b.initializeDefines(mesh, this, defines, useInstances);\r\n });\r\n\r\n this._sharedData.blocksWithDefines.forEach((b) => {\r\n b.prepareDefines(mesh, this, defines, useInstances, subMesh);\r\n });\r\n\r\n // Need to recompile?\r\n if (defines.isDirty) {\r\n const lightDisposed = defines._areLightsDisposed;\r\n defines.markAsProcessed();\r\n\r\n // Repeatable content generators\r\n this._vertexCompilationState.compilationString = this._vertexCompilationState._builtCompilationString;\r\n this._fragmentCompilationState.compilationString = this._fragmentCompilationState._builtCompilationString;\r\n\r\n this._sharedData.repeatableContentBlocks.forEach((b) => {\r\n b.replaceRepeatableContent(this._vertexCompilationState, this._fragmentCompilationState, mesh, defines);\r\n });\r\n\r\n // Uniforms\r\n const uniformBuffers: string[] = [];\r\n this._sharedData.dynamicUniformBlocks.forEach((b) => {\r\n b.updateUniformsAndSamples(this._vertexCompilationState, this, defines, uniformBuffers);\r\n });\r\n\r\n const mergedUniforms = this._vertexCompilationState.uniforms;\r\n\r\n this._fragmentCompilationState.uniforms.forEach((u) => {\r\n const index = mergedUniforms.indexOf(u);\r\n\r\n if (index === -1) {\r\n mergedUniforms.push(u);\r\n }\r\n });\r\n\r\n // Samplers\r\n const mergedSamplers = this._vertexCompilationState.samplers;\r\n\r\n this._fragmentCompilationState.samplers.forEach((s) => {\r\n const index = mergedSamplers.indexOf(s);\r\n\r\n if (index === -1) {\r\n mergedSamplers.push(s);\r\n }\r\n });\r\n\r\n const fallbacks = new EffectFallbacks();\r\n\r\n this._sharedData.blocksWithFallbacks.forEach((b) => {\r\n b.provideFallbacks(mesh, fallbacks);\r\n });\r\n\r\n result = {\r\n lightDisposed,\r\n uniformBuffers,\r\n mergedUniforms,\r\n mergedSamplers,\r\n fallbacks,\r\n };\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get if the submesh is ready to be used and all its information available.\r\n * Child classes can use it to update shaders\r\n * @param mesh defines the mesh to check\r\n * @param subMesh defines which submesh to check\r\n * @param useInstances specifies that instances should be used\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances: boolean = false): boolean {\r\n if (!this._buildWasSuccessful) {\r\n return false;\r\n }\r\n\r\n const scene = this.getScene();\r\n if (this._sharedData.animatedInputs) {\r\n const frameId = scene.getFrameId();\r\n\r\n if (this._animationFrame !== frameId) {\r\n for (const input of this._sharedData.animatedInputs) {\r\n input.animate(scene);\r\n }\r\n\r\n this._animationFrame = frameId;\r\n }\r\n }\r\n\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (drawWrapper.effect && this.isFrozen) {\r\n if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new NodeMaterialDefines();\r\n }\r\n\r\n const defines = subMesh.materialDefines;\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n this._prepareDefinesForAttributes(mesh, defines);\r\n\r\n // Check if blocks are ready\r\n if (this._sharedData.blockingBlocks.some((b) => !b.isReady(mesh, this, defines, useInstances))) {\r\n return false;\r\n }\r\n\r\n const result = this._processDefines(mesh, defines, useInstances, subMesh);\r\n\r\n if (result) {\r\n const previousEffect = subMesh.effect;\r\n // Compilation\r\n const join = defines.toString();\r\n let effect = engine.createEffect(\r\n {\r\n vertex: \"nodeMaterial\" + this._buildId,\r\n fragment: \"nodeMaterial\" + this._buildId,\r\n vertexSource: this._vertexCompilationState.compilationString,\r\n fragmentSource: this._fragmentCompilationState.compilationString,\r\n },\r\n {\r\n attributes: this._vertexCompilationState.attributes,\r\n uniformsNames: result.mergedUniforms,\r\n uniformBuffersNames: result.uniformBuffers,\r\n samplers: result.mergedSamplers,\r\n defines: join,\r\n fallbacks: result.fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n multiTarget: defines.PREPASS,\r\n indexParameters: { maxSimultaneousLights: this.maxSimultaneousLights, maxSimultaneousMorphTargets: defines.NUM_MORPH_INFLUENCERS },\r\n },\r\n engine\r\n );\r\n\r\n if (effect) {\r\n if (this._onEffectCreatedObservable) {\r\n onCreatedEffectParameters.effect = effect;\r\n onCreatedEffectParameters.subMesh = subMesh;\r\n this._onEffectCreatedObservable.notifyObservers(onCreatedEffectParameters);\r\n }\r\n\r\n // Use previous effect while new one is compiling\r\n if (this.allowShaderHotSwapping && previousEffect && !effect.isReady()) {\r\n effect = previousEffect;\r\n defines.markAsUnprocessed();\r\n\r\n if (result.lightDisposed) {\r\n // re register in case it takes more than one frame.\r\n defines._areLightsDisposed = true;\r\n return false;\r\n }\r\n } else {\r\n scene.resetCachedMaterial();\r\n subMesh.setEffect(effect, defines, this._materialContext);\r\n }\r\n }\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n drawWrapper._wasPreviouslyUsingInstances = useInstances;\r\n\r\n this._checkScenePerformancePriority();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Get a string representing the shaders built by the current node graph\r\n */\r\n public get compiledShaders() {\r\n return `// Vertex shader\\n${this._vertexCompilationState.compilationString}\\n\\n// Fragment shader\\n${this._fragmentCompilationState.compilationString}`;\r\n }\r\n\r\n /**\r\n * Binds the world matrix to the material\r\n * @param world defines the world transformation matrix\r\n */\r\n public bindOnlyWorldMatrix(world: Matrix): void {\r\n const scene = this.getScene();\r\n\r\n if (!this._activeEffect) {\r\n return;\r\n }\r\n\r\n const hints = this._sharedData.hints;\r\n\r\n if (hints.needWorldViewMatrix) {\r\n world.multiplyToRef(scene.getViewMatrix(), this._cachedWorldViewMatrix);\r\n }\r\n\r\n if (hints.needWorldViewProjectionMatrix) {\r\n world.multiplyToRef(scene.getTransformMatrix(), this._cachedWorldViewProjectionMatrix);\r\n }\r\n\r\n // Connection points\r\n for (const inputBlock of this._sharedData.inputBlocks) {\r\n inputBlock._transmitWorld(this._activeEffect, world, this._cachedWorldViewMatrix, this._cachedWorldViewProjectionMatrix);\r\n }\r\n }\r\n\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n\r\n const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility);\r\n const sharedData = this._sharedData;\r\n\r\n if (mustRebind) {\r\n // Bindable blocks\r\n for (const block of sharedData.bindableBlocks) {\r\n block.bind(effect, this, mesh, subMesh);\r\n }\r\n\r\n for (const block of sharedData.forcedBindableBlocks) {\r\n block.bind(effect, this, mesh, subMesh);\r\n }\r\n\r\n // Connection points\r\n for (const inputBlock of sharedData.inputBlocks) {\r\n inputBlock._transmit(effect, scene, this);\r\n }\r\n } else if (!this.isFrozen) {\r\n for (const block of sharedData.forcedBindableBlocks) {\r\n block.bind(effect, this, mesh, subMesh);\r\n }\r\n }\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Gets the active textures from the material\r\n * @returns an array of textures\r\n */\r\n public getActiveTextures(): BaseTexture[] {\r\n const activeTextures = super.getActiveTextures();\r\n\r\n if (this._sharedData) {\r\n activeTextures.push(...this._sharedData.textureBlocks.filter((tb) => tb.texture).map((tb) => tb.texture!));\r\n }\r\n\r\n return activeTextures;\r\n }\r\n\r\n /**\r\n * Gets the list of texture blocks\r\n * Note that this method will only return blocks that are reachable from the final block(s) and only after the material has been built!\r\n * @returns an array of texture blocks\r\n */\r\n public getTextureBlocks(): NodeMaterialTextureBlocks[] {\r\n if (!this._sharedData) {\r\n return [];\r\n }\r\n\r\n return this._sharedData.textureBlocks;\r\n }\r\n\r\n /**\r\n * Gets the list of all texture blocks\r\n * Note that this method will scan all attachedBlocks and return blocks that are texture blocks\r\n * @returns\r\n */\r\n public getAllTextureBlocks(): NodeMaterialTextureBlocks[] {\r\n const textureBlocks: NodeMaterialTextureBlocks[] = [];\r\n\r\n for (const block of this.attachedBlocks) {\r\n if (NodeMaterial._BlockIsTextureBlock(block)) {\r\n textureBlocks.push(block);\r\n }\r\n }\r\n\r\n return textureBlocks;\r\n }\r\n\r\n /**\r\n * Specifies if the material uses a texture\r\n * @param texture defines the texture to check against the material\r\n * @returns a boolean specifying if the material uses the texture\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n if (super.hasTexture(texture)) {\r\n return true;\r\n }\r\n\r\n if (!this._sharedData) {\r\n return false;\r\n }\r\n\r\n for (const t of this._sharedData.textureBlocks) {\r\n if (t.texture === texture) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the material\r\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\r\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\r\n * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh\r\n */\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean): void {\r\n if (forceDisposeTextures) {\r\n for (const texture of this.getTextureBlocks()\r\n .filter((tb) => tb.texture)\r\n .map((tb) => tb.texture!)) {\r\n texture.dispose();\r\n }\r\n }\r\n\r\n for (const block of this.attachedBlocks) {\r\n block.dispose();\r\n }\r\n\r\n this.attachedBlocks.length = 0;\r\n (this._sharedData as any) = null;\r\n (this._vertexCompilationState as any) = null;\r\n (this._fragmentCompilationState as any) = null;\r\n\r\n this.onBuildObservable.clear();\r\n\r\n if (this._imageProcessingObserver) {\r\n this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver);\r\n this._imageProcessingObserver = null;\r\n }\r\n\r\n super.dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh);\r\n }\r\n\r\n /** Creates the node editor window.\r\n * @param additionalConfig Define the configuration of the editor\r\n */\r\n private _createNodeEditor(additionalConfig?: any) {\r\n const nodeEditorConfig: any = {\r\n nodeMaterial: this,\r\n ...additionalConfig,\r\n };\r\n this.BJSNODEMATERIALEDITOR.NodeEditor.Show(nodeEditorConfig);\r\n }\r\n\r\n /**\r\n * Launch the node material editor\r\n * @param config Define the configuration of the editor\r\n * @returns a promise fulfilled when the node editor is visible\r\n */\r\n public edit(config?: INodeMaterialEditorOptions): Promise {\r\n return new Promise((resolve) => {\r\n this.BJSNODEMATERIALEDITOR = this.BJSNODEMATERIALEDITOR || this._getGlobalNodeMaterialEditor();\r\n if (typeof this.BJSNODEMATERIALEDITOR == \"undefined\") {\r\n const editorUrl = config && config.editorURL ? config.editorURL : NodeMaterial.EditorURL;\r\n\r\n // Load editor and add it to the DOM\r\n Tools.LoadBabylonScript(editorUrl, () => {\r\n this.BJSNODEMATERIALEDITOR = this.BJSNODEMATERIALEDITOR || this._getGlobalNodeMaterialEditor();\r\n this._createNodeEditor(config?.nodeEditorConfig);\r\n resolve();\r\n });\r\n } else {\r\n // Otherwise creates the editor\r\n this._createNodeEditor(config?.nodeEditorConfig);\r\n resolve();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Clear the current material\r\n */\r\n public clear() {\r\n this._vertexOutputNodes.length = 0;\r\n this._fragmentOutputNodes.length = 0;\r\n this.attachedBlocks.length = 0;\r\n }\r\n\r\n /**\r\n * Clear the current material and set it to a default state\r\n */\r\n public setToDefault() {\r\n this.clear();\r\n\r\n this.editorData = null;\r\n\r\n const positionInput = new InputBlock(\"Position\");\r\n positionInput.setAsAttribute(\"position\");\r\n\r\n const worldInput = new InputBlock(\"World\");\r\n worldInput.setAsSystemValue(NodeMaterialSystemValues.World);\r\n\r\n const worldPos = new TransformBlock(\"WorldPos\");\r\n positionInput.connectTo(worldPos);\r\n worldInput.connectTo(worldPos);\r\n\r\n const viewProjectionInput = new InputBlock(\"ViewProjection\");\r\n viewProjectionInput.setAsSystemValue(NodeMaterialSystemValues.ViewProjection);\r\n\r\n const worldPosdMultipliedByViewProjection = new TransformBlock(\"WorldPos * ViewProjectionTransform\");\r\n worldPos.connectTo(worldPosdMultipliedByViewProjection);\r\n viewProjectionInput.connectTo(worldPosdMultipliedByViewProjection);\r\n\r\n const vertexOutput = new VertexOutputBlock(\"VertexOutput\");\r\n worldPosdMultipliedByViewProjection.connectTo(vertexOutput);\r\n\r\n // Pixel\r\n const pixelColor = new InputBlock(\"color\");\r\n pixelColor.value = new Color4(0.8, 0.8, 0.8, 1);\r\n\r\n const fragmentOutput = new FragmentOutputBlock(\"FragmentOutput\");\r\n pixelColor.connectTo(fragmentOutput);\r\n\r\n // Add to nodes\r\n this.addOutputNode(vertexOutput);\r\n this.addOutputNode(fragmentOutput);\r\n\r\n this._mode = NodeMaterialModes.Material;\r\n }\r\n\r\n /**\r\n * Clear the current material and set it to a default state for post process\r\n */\r\n public setToDefaultPostProcess() {\r\n this.clear();\r\n\r\n this.editorData = null;\r\n\r\n const position = new InputBlock(\"Position\");\r\n position.setAsAttribute(\"position2d\");\r\n\r\n const const1 = new InputBlock(\"Constant1\");\r\n const1.isConstant = true;\r\n const1.value = 1;\r\n\r\n const vmerger = new VectorMergerBlock(\"Position3D\");\r\n\r\n position.connectTo(vmerger);\r\n const1.connectTo(vmerger, { input: \"w\" });\r\n\r\n const vertexOutput = new VertexOutputBlock(\"VertexOutput\");\r\n vmerger.connectTo(vertexOutput);\r\n\r\n // Pixel\r\n const scale = new InputBlock(\"Scale\");\r\n scale.visibleInInspector = true;\r\n scale.value = new Vector2(1, 1);\r\n\r\n const uv0 = new RemapBlock(\"uv0\");\r\n position.connectTo(uv0);\r\n\r\n const uv = new MultiplyBlock(\"UV scale\");\r\n uv0.connectTo(uv);\r\n scale.connectTo(uv);\r\n\r\n const currentScreen = new CurrentScreenBlock(\"CurrentScreen\");\r\n uv.connectTo(currentScreen);\r\n\r\n currentScreen.texture = new Texture(\"https://assets.babylonjs.com/nme/currentScreenPostProcess.png\", this.getScene());\r\n\r\n const fragmentOutput = new FragmentOutputBlock(\"FragmentOutput\");\r\n currentScreen.connectTo(fragmentOutput, { output: \"rgba\" });\r\n\r\n // Add to nodes\r\n this.addOutputNode(vertexOutput);\r\n this.addOutputNode(fragmentOutput);\r\n\r\n this._mode = NodeMaterialModes.PostProcess;\r\n }\r\n\r\n /**\r\n * Clear the current material and set it to a default state for procedural texture\r\n */\r\n public setToDefaultProceduralTexture() {\r\n this.clear();\r\n\r\n this.editorData = null;\r\n\r\n const position = new InputBlock(\"Position\");\r\n position.setAsAttribute(\"position2d\");\r\n\r\n const const1 = new InputBlock(\"Constant1\");\r\n const1.isConstant = true;\r\n const1.value = 1;\r\n\r\n const vmerger = new VectorMergerBlock(\"Position3D\");\r\n\r\n position.connectTo(vmerger);\r\n const1.connectTo(vmerger, { input: \"w\" });\r\n\r\n const vertexOutput = new VertexOutputBlock(\"VertexOutput\");\r\n vmerger.connectTo(vertexOutput);\r\n\r\n // Pixel\r\n const time = new InputBlock(\"Time\");\r\n time.value = 0;\r\n time.min = 0;\r\n time.max = 0;\r\n time.isBoolean = false;\r\n time.matrixMode = 0;\r\n time.animationType = AnimatedInputBlockTypes.Time;\r\n time.isConstant = false;\r\n\r\n const color = new InputBlock(\"Color3\");\r\n color.value = new Color3(1, 1, 1);\r\n color.isConstant = false;\r\n const fragmentOutput = new FragmentOutputBlock(\"FragmentOutput\");\r\n\r\n const vectorMerger = new VectorMergerBlock(\"VectorMerger\");\r\n vectorMerger.visibleInInspector = false;\r\n\r\n const cos = new TrigonometryBlock(\"Cos\");\r\n cos.operation = TrigonometryBlockOperations.Cos;\r\n\r\n position.connectTo(vectorMerger);\r\n time.output.connectTo(cos.input);\r\n cos.output.connectTo(vectorMerger.z);\r\n vectorMerger.xyzOut.connectTo(fragmentOutput.rgb);\r\n\r\n // Add to nodes\r\n this.addOutputNode(vertexOutput);\r\n this.addOutputNode(fragmentOutput);\r\n\r\n this._mode = NodeMaterialModes.ProceduralTexture;\r\n }\r\n\r\n /**\r\n * Clear the current material and set it to a default state for particle\r\n */\r\n public setToDefaultParticle() {\r\n this.clear();\r\n\r\n this.editorData = null;\r\n\r\n // Pixel\r\n const uv = new InputBlock(\"uv\");\r\n uv.setAsAttribute(\"particle_uv\");\r\n\r\n const texture = new ParticleTextureBlock(\"ParticleTexture\");\r\n uv.connectTo(texture);\r\n\r\n const color = new InputBlock(\"Color\");\r\n color.setAsAttribute(\"particle_color\");\r\n\r\n const multiply = new MultiplyBlock(\"Texture * Color\");\r\n texture.connectTo(multiply);\r\n color.connectTo(multiply);\r\n\r\n const rampGradient = new ParticleRampGradientBlock(\"ParticleRampGradient\");\r\n multiply.connectTo(rampGradient);\r\n\r\n const cSplitter = new ColorSplitterBlock(\"ColorSplitter\");\r\n color.connectTo(cSplitter);\r\n\r\n const blendMultiply = new ParticleBlendMultiplyBlock(\"ParticleBlendMultiply\");\r\n rampGradient.connectTo(blendMultiply);\r\n texture.connectTo(blendMultiply, { output: \"a\" });\r\n cSplitter.connectTo(blendMultiply, { output: \"a\" });\r\n\r\n const fragmentOutput = new FragmentOutputBlock(\"FragmentOutput\");\r\n blendMultiply.connectTo(fragmentOutput);\r\n\r\n // Add to nodes\r\n this.addOutputNode(fragmentOutput);\r\n\r\n this._mode = NodeMaterialModes.Particle;\r\n }\r\n\r\n /**\r\n * Loads the current Node Material from a url pointing to a file save by the Node Material Editor\r\n * @deprecated Please use NodeMaterial.ParseFromFileAsync instead\r\n * @param url defines the url to load from\r\n * @param rootUrl defines the root URL for nested url in the node material\r\n * @returns a promise that will fulfil when the material is fully loaded\r\n */\r\n public async loadAsync(url: string, rootUrl: string = \"\") {\r\n return NodeMaterial.ParseFromFileAsync(\"\", url, this.getScene(), rootUrl, true, this);\r\n }\r\n\r\n private _gatherBlocks(rootNode: NodeMaterialBlock, list: NodeMaterialBlock[]) {\r\n if (list.indexOf(rootNode) !== -1) {\r\n return;\r\n }\r\n list.push(rootNode);\r\n\r\n for (const input of rootNode.inputs) {\r\n const connectedPoint = input.connectedPoint;\r\n if (connectedPoint) {\r\n const block = connectedPoint.ownerBlock;\r\n if (block !== rootNode) {\r\n this._gatherBlocks(block, list);\r\n }\r\n }\r\n }\r\n\r\n // Teleportation\r\n if (rootNode.isTeleportOut) {\r\n const block = rootNode as NodeMaterialTeleportOutBlock;\r\n if (block.entryPoint) {\r\n this._gatherBlocks(block.entryPoint, list);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Generate a string containing the code declaration required to create an equivalent of this material\r\n * @returns a string\r\n */\r\n public generateCode() {\r\n let alreadyDumped: NodeMaterialBlock[] = [];\r\n const vertexBlocks: NodeMaterialBlock[] = [];\r\n const uniqueNames: string[] = [\"const\", \"var\", \"let\"];\r\n // Gets active blocks\r\n for (const outputNode of this._vertexOutputNodes) {\r\n this._gatherBlocks(outputNode, vertexBlocks);\r\n }\r\n\r\n const fragmentBlocks: NodeMaterialBlock[] = [];\r\n for (const outputNode of this._fragmentOutputNodes) {\r\n this._gatherBlocks(outputNode, fragmentBlocks);\r\n }\r\n\r\n // Generate vertex shader\r\n let codeString = `var nodeMaterial = new BABYLON.NodeMaterial(\"${this.name || \"node material\"}\");\\n`;\r\n codeString += `nodeMaterial.mode = BABYLON.NodeMaterialModes.${NodeMaterialModes[this.mode]};\\n`;\r\n for (const node of vertexBlocks) {\r\n if (node.isInput && alreadyDumped.indexOf(node) === -1) {\r\n codeString += node._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n\r\n // Generate fragment shader\r\n for (const node of fragmentBlocks) {\r\n if (node.isInput && alreadyDumped.indexOf(node) === -1) {\r\n codeString += node._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n\r\n // Connections\r\n alreadyDumped = [];\r\n codeString += \"\\n// Connections\\n\";\r\n for (const node of this._vertexOutputNodes) {\r\n codeString += node._dumpCodeForOutputConnections(alreadyDumped);\r\n }\r\n for (const node of this._fragmentOutputNodes) {\r\n codeString += node._dumpCodeForOutputConnections(alreadyDumped);\r\n }\r\n\r\n // Output nodes\r\n codeString += \"\\n// Output nodes\\n\";\r\n for (const node of this._vertexOutputNodes) {\r\n codeString += `nodeMaterial.addOutputNode(${node._codeVariableName});\\n`;\r\n }\r\n\r\n for (const node of this._fragmentOutputNodes) {\r\n codeString += `nodeMaterial.addOutputNode(${node._codeVariableName});\\n`;\r\n }\r\n\r\n codeString += `nodeMaterial.build();\\n`;\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * Serializes this material in a JSON representation\r\n * @param selectedBlocks defines an optional list of blocks to serialize\r\n * @returns the serialized material object\r\n */\r\n public serialize(selectedBlocks?: NodeMaterialBlock[]): any {\r\n const serializationObject = selectedBlocks ? {} : SerializationHelper.Serialize(this);\r\n serializationObject.editorData = JSON.parse(JSON.stringify(this.editorData)); // Copy\r\n\r\n let blocks: NodeMaterialBlock[] = [];\r\n\r\n if (selectedBlocks) {\r\n blocks = selectedBlocks;\r\n } else {\r\n serializationObject.customType = \"BABYLON.NodeMaterial\";\r\n serializationObject.outputNodes = [];\r\n\r\n // Outputs\r\n for (const outputNode of this._vertexOutputNodes) {\r\n this._gatherBlocks(outputNode, blocks);\r\n serializationObject.outputNodes.push(outputNode.uniqueId);\r\n }\r\n\r\n for (const outputNode of this._fragmentOutputNodes) {\r\n this._gatherBlocks(outputNode, blocks);\r\n\r\n if (serializationObject.outputNodes.indexOf(outputNode.uniqueId) === -1) {\r\n serializationObject.outputNodes.push(outputNode.uniqueId);\r\n }\r\n }\r\n }\r\n\r\n // Blocks\r\n serializationObject.blocks = [];\r\n\r\n for (const block of blocks) {\r\n serializationObject.blocks.push(block.serialize());\r\n }\r\n\r\n if (!selectedBlocks) {\r\n for (const block of this.attachedBlocks) {\r\n if (blocks.indexOf(block) !== -1) {\r\n continue;\r\n }\r\n serializationObject.blocks.push(block.serialize());\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n private _restoreConnections(block: NodeMaterialBlock, source: any, map: { [key: number]: NodeMaterialBlock }) {\r\n for (const outputPoint of block.outputs) {\r\n for (const candidate of source.blocks) {\r\n const target = map[candidate.id];\r\n\r\n if (!target) {\r\n continue;\r\n }\r\n\r\n for (const input of candidate.inputs) {\r\n if (map[input.targetBlockId] === block && input.targetConnectionName === outputPoint.name) {\r\n const inputPoint = target.getInputByName(input.inputName);\r\n if (!inputPoint || inputPoint.isConnected) {\r\n continue;\r\n }\r\n\r\n outputPoint.connectTo(inputPoint, true);\r\n this._restoreConnections(target, source, map);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current graph and load a new one from a serialization object\r\n * @param source defines the JSON representation of the material\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @param merge defines whether or not the source must be merged or replace the current content\r\n */\r\n public parseSerializedObject(source: any, rootUrl: string = \"\", merge = false) {\r\n if (!merge) {\r\n this.clear();\r\n }\r\n\r\n const map: { [key: number]: NodeMaterialBlock } = {};\r\n\r\n // Create blocks\r\n for (const parsedBlock of source.blocks) {\r\n const blockType = GetClass(parsedBlock.customType);\r\n if (blockType) {\r\n const block: NodeMaterialBlock = new blockType();\r\n block._deserialize(parsedBlock, this.getScene(), rootUrl);\r\n map[parsedBlock.id] = block;\r\n\r\n this.attachedBlocks.push(block);\r\n }\r\n }\r\n\r\n // Reconnect teleportation\r\n for (const block of this.attachedBlocks) {\r\n if (block.isTeleportOut) {\r\n const teleportOut = block as NodeMaterialTeleportOutBlock;\r\n const id = teleportOut._tempEntryPointUniqueId;\r\n if (id) {\r\n const source = map[id] as NodeMaterialTeleportInBlock;\r\n source.attachToEndpoint(teleportOut);\r\n }\r\n }\r\n }\r\n\r\n // Connections - Starts with input blocks only (except if in \"merge\" mode where we scan all blocks)\r\n for (let blockIndex = 0; blockIndex < source.blocks.length; blockIndex++) {\r\n const parsedBlock = source.blocks[blockIndex];\r\n const block = map[parsedBlock.id];\r\n\r\n if (!block) {\r\n continue;\r\n }\r\n\r\n if (block.inputs.length && !merge) {\r\n continue;\r\n }\r\n this._restoreConnections(block, source, map);\r\n }\r\n\r\n // Outputs\r\n if (source.outputNodes) {\r\n for (const outputNodeId of source.outputNodes) {\r\n this.addOutputNode(map[outputNodeId]);\r\n }\r\n }\r\n\r\n // UI related info\r\n if (source.locations || (source.editorData && source.editorData.locations)) {\r\n const locations: {\r\n blockId: number;\r\n x: number;\r\n y: number;\r\n }[] = source.locations || source.editorData.locations;\r\n\r\n for (const location of locations) {\r\n if (map[location.blockId]) {\r\n location.blockId = map[location.blockId].uniqueId;\r\n }\r\n }\r\n\r\n if (merge && this.editorData && this.editorData.locations) {\r\n locations.concat(this.editorData.locations);\r\n }\r\n\r\n if (source.locations) {\r\n this.editorData = {\r\n locations: locations,\r\n };\r\n } else {\r\n this.editorData = source.editorData;\r\n this.editorData.locations = locations;\r\n }\r\n\r\n const blockMap: number[] = [];\r\n\r\n for (const key in map) {\r\n blockMap[key] = map[key].uniqueId;\r\n }\r\n\r\n this.editorData.map = blockMap;\r\n }\r\n\r\n this.comment = source.comment;\r\n\r\n if (source.forceAlphaBlending !== undefined) {\r\n this.forceAlphaBlending = source.forceAlphaBlending;\r\n }\r\n\r\n if (source.alphaMode !== undefined) {\r\n this.alphaMode = source.alphaMode;\r\n }\r\n\r\n if (!merge) {\r\n this._mode = source.mode ?? NodeMaterialModes.Material;\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current graph and load a new one from a serialization object\r\n * @param source defines the JSON representation of the material\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @param merge defines whether or not the source must be merged or replace the current content\r\n * @deprecated Please use the parseSerializedObject method instead\r\n */\r\n public loadFromSerialization(source: any, rootUrl: string = \"\", merge = false) {\r\n this.parseSerializedObject(source, rootUrl, merge);\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current material.\r\n * @param name defines the name to use for the new material\r\n * @param shareEffect defines if the clone material should share the same effect (default is false)\r\n * @returns the cloned material\r\n */\r\n public clone(name: string, shareEffect: boolean = false): NodeMaterial {\r\n const serializationObject = this.serialize();\r\n\r\n const clone = SerializationHelper.Clone(() => new NodeMaterial(name, this.getScene(), this.options), this);\r\n clone.id = name;\r\n clone.name = name;\r\n\r\n clone.parseSerializedObject(serializationObject);\r\n clone._buildId = this._buildId;\r\n clone.build(false, !shareEffect);\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Awaits for all the material textures to be ready before resolving the returned promise.\r\n * @returns A promise that resolves when the textures are ready.\r\n */\r\n public whenTexturesReadyAsync(): Promise {\r\n // Ensures all textures are ready to render.\r\n const textureReadyPromises: Promise[] = [];\r\n this.getActiveTextures().forEach((texture) => {\r\n const internalTexture = texture.getInternalTexture();\r\n if (internalTexture && !internalTexture.isReady) {\r\n textureReadyPromises.push(\r\n new Promise((textureResolve, textureReject) => {\r\n internalTexture.onLoadedObservable.addOnce(() => {\r\n textureResolve();\r\n });\r\n internalTexture.onErrorObservable.addOnce((e) => {\r\n textureReject(e);\r\n });\r\n })\r\n );\r\n }\r\n });\r\n\r\n return Promise.all(textureReadyPromises);\r\n }\r\n\r\n /**\r\n * Creates a node material from parsed material data\r\n * @param source defines the JSON representation of the material\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a new node material\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string = \"\"): NodeMaterial {\r\n const nodeMaterial = SerializationHelper.Parse(() => new NodeMaterial(source.name, scene), source, scene, rootUrl);\r\n\r\n nodeMaterial.parseSerializedObject(source, rootUrl);\r\n nodeMaterial.build();\r\n\r\n return nodeMaterial;\r\n }\r\n\r\n /**\r\n * Creates a node material from a snippet saved in a remote file\r\n * @param name defines the name of the material to create\r\n * @param url defines the url to load from\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL for nested url in the node material\r\n * @param skipBuild defines whether to build the node material\r\n * @param targetMaterial defines a material to use instead of creating a new one\r\n * @returns a promise that will resolve to the new node material\r\n */\r\n public static async ParseFromFileAsync(\r\n name: string,\r\n url: string,\r\n scene: Scene,\r\n rootUrl: string = \"\",\r\n skipBuild: boolean = false,\r\n targetMaterial?: NodeMaterial\r\n ): Promise {\r\n const material = targetMaterial ?? new NodeMaterial(name, scene);\r\n\r\n const data = await scene._loadFileAsync(url);\r\n const serializationObject = JSON.parse(data);\r\n material.parseSerializedObject(serializationObject, rootUrl);\r\n if (!skipBuild) {\r\n material.build();\r\n }\r\n return material;\r\n }\r\n\r\n /**\r\n * Creates a node material from a snippet saved by the node material editor\r\n * @param snippetId defines the snippet to load\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @param nodeMaterial defines a node material to update (instead of creating a new one)\r\n * @param skipBuild defines whether to build the node material\r\n * @param waitForTextureReadyness defines whether to wait for texture readiness resolving the promise (default: false)\r\n * @returns a promise that will resolve to the new node material\r\n */\r\n public static ParseFromSnippetAsync(\r\n snippetId: string,\r\n scene: Scene = EngineStore.LastCreatedScene!,\r\n rootUrl: string = \"\",\r\n nodeMaterial?: NodeMaterial,\r\n skipBuild: boolean = false,\r\n waitForTextureReadyness: boolean = false\r\n ): Promise {\r\n if (snippetId === \"_BLANK\") {\r\n return Promise.resolve(NodeMaterial.CreateDefault(\"blank\", scene));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n const serializationObject = JSON.parse(snippet.nodeMaterial);\r\n\r\n if (!nodeMaterial) {\r\n nodeMaterial = SerializationHelper.Parse(() => new NodeMaterial(snippetId, scene), serializationObject, scene, rootUrl);\r\n nodeMaterial.uniqueId = scene.getUniqueId();\r\n }\r\n\r\n nodeMaterial.parseSerializedObject(serializationObject);\r\n nodeMaterial.snippetId = snippetId;\r\n\r\n try {\r\n if (!skipBuild) {\r\n nodeMaterial.build();\r\n }\r\n } catch (err) {\r\n reject(err);\r\n }\r\n\r\n if (waitForTextureReadyness) {\r\n nodeMaterial\r\n .whenTexturesReadyAsync()\r\n .then(() => {\r\n resolve(nodeMaterial!);\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n } else {\r\n resolve(nodeMaterial);\r\n }\r\n } else {\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a new node material set to default basic configuration\r\n * @param name defines the name of the material\r\n * @param scene defines the hosting scene\r\n * @returns a new NodeMaterial\r\n */\r\n public static CreateDefault(name: string, scene?: Scene) {\r\n const newMaterial = new NodeMaterial(name, scene);\r\n\r\n newMaterial.setToDefault();\r\n newMaterial.build();\r\n\r\n return newMaterial;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.NodeMaterial\", NodeMaterial);\r\n", "import type { Scene } from \"../../scene\";\r\nimport type { Vector4 } from \"../../Maths/math.vector\";\r\nimport { Vector3, Vector2 } from \"../../Maths/math.vector\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { CompatibilityOptions } from \"../../Compat/compatibilityOptions\";\r\n\r\n/**\r\n * Creates the VertexData of the IcoSphere\r\n * @param options an object used to set the following optional parameters for the IcoSphere, required but can be empty\r\n * * radius the radius of the IcoSphere, optional default 1\r\n * * radiusX allows stretching in the x direction, optional, default radius\r\n * * radiusY allows stretching in the y direction, optional, default radius\r\n * * radiusZ allows stretching in the z direction, optional, default radius\r\n * * flat when true creates a flat shaded mesh, optional, default true\r\n * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the IcoSphere\r\n */\r\nexport function CreateIcoSphereVertexData(options: {\r\n radius?: number;\r\n radiusX?: number;\r\n radiusY?: number;\r\n radiusZ?: number;\r\n flat?: boolean;\r\n subdivisions?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n}): VertexData {\r\n const sideOrientation = options.sideOrientation || VertexData.DEFAULTSIDE;\r\n const radius = options.radius || 1;\r\n const flat = options.flat === undefined ? true : options.flat;\r\n const subdivisions = (options.subdivisions || 4) | 0;\r\n const radiusX = options.radiusX || radius;\r\n const radiusY = options.radiusY || radius;\r\n const radiusZ = options.radiusZ || radius;\r\n\r\n const t = (1 + Math.sqrt(5)) / 2;\r\n\r\n // 12 vertex x,y,z\r\n const icoVertices = [\r\n -1,\r\n t,\r\n -0,\r\n 1,\r\n t,\r\n 0,\r\n -1,\r\n -t,\r\n 0,\r\n 1,\r\n -t,\r\n 0, // v0-3\r\n 0,\r\n -1,\r\n -t,\r\n 0,\r\n 1,\r\n -t,\r\n 0,\r\n -1,\r\n t,\r\n 0,\r\n 1,\r\n t, // v4-7\r\n t,\r\n 0,\r\n 1,\r\n t,\r\n 0,\r\n -1,\r\n -t,\r\n 0,\r\n 1,\r\n -t,\r\n 0,\r\n -1, // v8-11\r\n ];\r\n\r\n // index of 3 vertex makes a face of icopshere\r\n const ico_indices = [\r\n 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 12, 22, 23, 1, 5, 20, 5, 11, 4, 23, 22, 13, 22, 18, 6, 7, 1, 8, 14, 21, 4, 14, 4, 2, 16, 13, 6, 15, 6, 19, 3, 8, 9, 4, 21, 5, 13, 17,\r\n 23, 6, 13, 22, 19, 6, 18, 9, 8, 1,\r\n ];\r\n // vertex for uv have aliased position, not for UV\r\n const vertices_unalias_id = [\r\n 0,\r\n 1,\r\n 2,\r\n 3,\r\n 4,\r\n 5,\r\n 6,\r\n 7,\r\n 8,\r\n 9,\r\n 10,\r\n 11,\r\n // vertex alias\r\n 0, // 12: 0 + 12\r\n 2, // 13: 2 + 11\r\n 3, // 14: 3 + 11\r\n 3, // 15: 3 + 12\r\n 3, // 16: 3 + 13\r\n 4, // 17: 4 + 13\r\n 7, // 18: 7 + 11\r\n 8, // 19: 8 + 11\r\n 9, // 20: 9 + 11\r\n 9, // 21: 9 + 12\r\n 10, // 22: A + 12\r\n 11, // 23: B + 12\r\n ];\r\n\r\n // uv as integer step (not pixels !)\r\n const ico_vertexuv = [\r\n 5,\r\n 1,\r\n 3,\r\n 1,\r\n 6,\r\n 4,\r\n 0,\r\n 0, // v0-3\r\n 5,\r\n 3,\r\n 4,\r\n 2,\r\n 2,\r\n 2,\r\n 4,\r\n 0, // v4-7\r\n 2,\r\n 0,\r\n 1,\r\n 1,\r\n 6,\r\n 0,\r\n 6,\r\n 2, // v8-11\r\n // vertex alias (for same vertex on different faces)\r\n 0,\r\n 4, // 12: 0 + 12\r\n 3,\r\n 3, // 13: 2 + 11\r\n 4,\r\n 4, // 14: 3 + 11\r\n 3,\r\n 1, // 15: 3 + 12\r\n 4,\r\n 2, // 16: 3 + 13\r\n 4,\r\n 4, // 17: 4 + 13\r\n 0,\r\n 2, // 18: 7 + 11\r\n 1,\r\n 1, // 19: 8 + 11\r\n 2,\r\n 2, // 20: 9 + 11\r\n 3,\r\n 3, // 21: 9 + 12\r\n 1,\r\n 3, // 22: A + 12\r\n 2,\r\n 4, // 23: B + 12\r\n ];\r\n\r\n // Vertices[0, 1, ...9, A, B] : position on UV plane\r\n // '+' indicate duplicate position to be fixed (3,9:0,2,3,4,7,8,A,B)\r\n // First island of uv mapping\r\n // v = 4h 3+ 2\r\n // v = 3h 9+ 4\r\n // v = 2h 9+ 5 B\r\n // v = 1h 9 1 0\r\n // v = 0h 3 8 7 A\r\n // u = 0 1 2 3 4 5 6 *a\r\n\r\n // Second island of uv mapping\r\n // v = 4h 0+ B+ 4+\r\n // v = 3h A+ 2+\r\n // v = 2h 7+ 6 3+\r\n // v = 1h 8+ 3+\r\n // v = 0h\r\n // u = 0 1 2 3 4 5 6 *a\r\n\r\n // Face layout on texture UV mapping\r\n // ============\r\n // \\ 4 /\\ 16 / ======\r\n // \\ / \\ / /\\ 11 /\r\n // \\/ 7 \\/ / \\ /\r\n // ======= / 10 \\/\r\n // /\\ 17 /\\ =======\r\n // / \\ / \\ \\ 15 /\\\r\n // / 8 \\/ 12 \\ \\ / \\\r\n // ============ \\/ 6 \\\r\n // \\ 18 /\\ ============\r\n // \\ / \\ \\ 5 /\\ 0 /\r\n // \\/ 13 \\ \\ / \\ /\r\n // ======= \\/ 1 \\/\r\n // =============\r\n // /\\ 19 /\\ 2 /\\\r\n // / \\ / \\ / \\\r\n // / 14 \\/ 9 \\/ 3 \\\r\n // ===================\r\n\r\n // uv step is u:1 or 0.5, v:cos(30)=sqrt(3)/2, ratio approx is 84/97\r\n const ustep = 138 / 1024;\r\n const vstep = 239 / 1024;\r\n const uoffset = 60 / 1024;\r\n const voffset = 26 / 1024;\r\n // Second island should have margin, not to touch the first island\r\n // avoid any borderline artefact in pixel rounding\r\n const island_u_offset = -40 / 1024;\r\n const island_v_offset = +20 / 1024;\r\n // face is either island 0 or 1 :\r\n // second island is for faces : [4, 7, 8, 12, 13, 16, 17, 18]\r\n const island = [\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n 1, // 0 - 4\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n 0, // 5 - 9\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n 0, // 10 - 14\r\n 0,\r\n 1,\r\n 1,\r\n 1,\r\n 0, // 15 - 19\r\n ];\r\n\r\n const indices: number[] = [];\r\n const positions: number[] = [];\r\n const normals: number[] = [];\r\n const uvs: number[] = [];\r\n\r\n let current_indice = 0;\r\n // prepare array of 3 vector (empty) (to be worked in place, shared for each face)\r\n const face_vertex_pos = new Array(3);\r\n const face_vertex_uv = new Array(3);\r\n let v012;\r\n for (v012 = 0; v012 < 3; v012++) {\r\n face_vertex_pos[v012] = Vector3.Zero();\r\n face_vertex_uv[v012] = Vector2.Zero();\r\n }\r\n // create all with normals\r\n for (let face = 0; face < 20; face++) {\r\n // 3 vertex per face\r\n for (v012 = 0; v012 < 3; v012++) {\r\n // look up vertex 0,1,2 to its index in 0 to 11 (or 23 including alias)\r\n const v_id = ico_indices[3 * face + v012];\r\n // vertex have 3D position (x,y,z)\r\n face_vertex_pos[v012].copyFromFloats(\r\n icoVertices[3 * vertices_unalias_id[v_id]],\r\n icoVertices[3 * vertices_unalias_id[v_id] + 1],\r\n icoVertices[3 * vertices_unalias_id[v_id] + 2]\r\n );\r\n // Normalize to get normal\r\n face_vertex_pos[v012].normalize();\r\n\r\n // uv Coordinates from vertex ID\r\n face_vertex_uv[v012].copyFromFloats(\r\n ico_vertexuv[2 * v_id] * ustep + uoffset + island[face] * island_u_offset,\r\n ico_vertexuv[2 * v_id + 1] * vstep + voffset + island[face] * island_v_offset\r\n );\r\n }\r\n\r\n // Subdivide the face (interpolate pos, norm, uv)\r\n // - pos is linear interpolation, then projected to sphere (converge polyhedron to sphere)\r\n // - norm is linear interpolation of vertex corner normal\r\n // (to be checked if better to re-calc from face vertex, or if approximation is OK ??? )\r\n // - uv is linear interpolation\r\n //\r\n // Topology is as below for sub-divide by 2\r\n // vertex shown as v0,v1,v2\r\n // interp index is i1 to progress in range [v0,v1[\r\n // interp index is i2 to progress in range [v0,v2[\r\n // face index as (i1,i2) for /\\ : (i1,i2),(i1+1,i2),(i1,i2+1)\r\n // and (i1,i2)' for \\/ : (i1+1,i2),(i1+1,i2+1),(i1,i2+1)\r\n //\r\n //\r\n // i2 v2\r\n // ^ ^\r\n // / / \\\r\n // / / \\\r\n // / / \\\r\n // / / (0,1) \\\r\n // / #---------\\\r\n // / / \\ (0,0)'/ \\\r\n // / / \\ / \\\r\n // / / \\ / \\\r\n // / / (0,0) \\ / (1,0) \\\r\n // / #---------#---------\\\r\n // v0 v1\r\n //\r\n // --------------------> i1\r\n //\r\n // interp of (i1,i2):\r\n // along i2 : x0=lerp(v0,v2, i2/S) <---> x1=lerp(v1,v2, i2/S)\r\n // along i1 : lerp(x0,x1, i1/(S-i2))\r\n //\r\n // centroid of triangle is needed to get help normal computation\r\n // (c1,c2) are used for centroid location\r\n\r\n const interp_vertex = (i1: number, i2: number, c1: number, c2: number) => {\r\n // vertex is interpolated from\r\n // - face_vertex_pos[0..2]\r\n // - face_vertex_uv[0..2]\r\n const pos_x0 = Vector3.Lerp(face_vertex_pos[0], face_vertex_pos[2], i2 / subdivisions);\r\n const pos_x1 = Vector3.Lerp(face_vertex_pos[1], face_vertex_pos[2], i2 / subdivisions);\r\n const pos_interp = subdivisions === i2 ? face_vertex_pos[2] : Vector3.Lerp(pos_x0, pos_x1, i1 / (subdivisions - i2));\r\n pos_interp.normalize();\r\n\r\n let vertex_normal;\r\n if (flat) {\r\n // in flat mode, recalculate normal as face centroid normal\r\n const centroid_x0 = Vector3.Lerp(face_vertex_pos[0], face_vertex_pos[2], c2 / subdivisions);\r\n const centroid_x1 = Vector3.Lerp(face_vertex_pos[1], face_vertex_pos[2], c2 / subdivisions);\r\n vertex_normal = Vector3.Lerp(centroid_x0, centroid_x1, c1 / (subdivisions - c2));\r\n } else {\r\n // in smooth mode, recalculate normal from each single vertex position\r\n vertex_normal = new Vector3(pos_interp.x, pos_interp.y, pos_interp.z);\r\n }\r\n // Vertex normal need correction due to X,Y,Z radius scaling\r\n vertex_normal.x /= radiusX;\r\n vertex_normal.y /= radiusY;\r\n vertex_normal.z /= radiusZ;\r\n vertex_normal.normalize();\r\n\r\n const uv_x0 = Vector2.Lerp(face_vertex_uv[0], face_vertex_uv[2], i2 / subdivisions);\r\n const uv_x1 = Vector2.Lerp(face_vertex_uv[1], face_vertex_uv[2], i2 / subdivisions);\r\n const uv_interp = subdivisions === i2 ? face_vertex_uv[2] : Vector2.Lerp(uv_x0, uv_x1, i1 / (subdivisions - i2));\r\n positions.push(pos_interp.x * radiusX, pos_interp.y * radiusY, pos_interp.z * radiusZ);\r\n normals.push(vertex_normal.x, vertex_normal.y, vertex_normal.z);\r\n uvs.push(uv_interp.x, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 - uv_interp.y : uv_interp.y);\r\n // push each vertex has member of a face\r\n // Same vertex can belong to multiple face, it is pushed multiple time (duplicate vertex are present)\r\n indices.push(current_indice);\r\n current_indice++;\r\n };\r\n\r\n for (let i2 = 0; i2 < subdivisions; i2++) {\r\n for (let i1 = 0; i1 + i2 < subdivisions; i1++) {\r\n // face : (i1,i2) for /\\ :\r\n // interp for : (i1,i2),(i1+1,i2),(i1,i2+1)\r\n interp_vertex(i1, i2, i1 + 1.0 / 3, i2 + 1.0 / 3);\r\n interp_vertex(i1 + 1, i2, i1 + 1.0 / 3, i2 + 1.0 / 3);\r\n interp_vertex(i1, i2 + 1, i1 + 1.0 / 3, i2 + 1.0 / 3);\r\n if (i1 + i2 + 1 < subdivisions) {\r\n // face : (i1,i2)' for \\/ :\r\n // interp for (i1+1,i2),(i1+1,i2+1),(i1,i2+1)\r\n interp_vertex(i1 + 1, i2, i1 + 2.0 / 3, i2 + 2.0 / 3);\r\n interp_vertex(i1 + 1, i2 + 1, i1 + 2.0 / 3, i2 + 2.0 / 3);\r\n interp_vertex(i1, i2 + 1, i1 + 2.0 / 3, i2 + 2.0 / 3);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Sides\r\n VertexData._ComputeSides(sideOrientation, positions, indices, normals, uvs, options.frontUVs, options.backUVs);\r\n\r\n // Result\r\n const vertexData = new VertexData();\r\n vertexData.indices = indices;\r\n vertexData.positions = positions;\r\n vertexData.normals = normals;\r\n vertexData.uvs = uvs;\r\n return vertexData;\r\n}\r\n\r\n/**\r\n * Creates a sphere based upon an icosahedron with 20 triangular faces which can be subdivided\r\n * * The parameter `radius` sets the radius size (float) of the icosphere (default 1)\r\n * * You can set some different icosphere dimensions, for instance to build an ellipsoid, by using the parameters `radiusX`, `radiusY` and `radiusZ` (all by default have the same value of `radius`)\r\n * * The parameter `subdivisions` sets the number of subdivisions (positive integer, default 4). The more subdivisions, the more faces on the icosphere whatever its size\r\n * * The parameter `flat` (boolean, default true) gives each side its own normals. Set it to false to get a smooth continuous light reflection on the surface\r\n * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE\r\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\r\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\r\n * @param name defines the name of the mesh\r\n * @param options defines the options used to create the mesh\r\n * @param scene defines the hosting scene\r\n * @returns the icosahedron mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/polyhedra#icosphere\r\n */\r\nexport function CreateIcoSphere(\r\n name: string,\r\n options: {\r\n radius?: number;\r\n radiusX?: number;\r\n radiusY?: number;\r\n radiusZ?: number;\r\n flat?: boolean;\r\n subdivisions?: number;\r\n sideOrientation?: number;\r\n frontUVs?: Vector4;\r\n backUVs?: Vector4;\r\n updatable?: boolean;\r\n } = {},\r\n scene: Nullable = null\r\n): Mesh {\r\n const sphere = new Mesh(name, scene);\r\n\r\n options.sideOrientation = Mesh._GetDefaultSideOrientation(options.sideOrientation);\r\n sphere._originalBuilderSideOrientation = options.sideOrientation;\r\n\r\n const vertexData = CreateIcoSphereVertexData(options);\r\n\r\n vertexData.applyToMesh(sphere, options.updatable);\r\n\r\n return sphere;\r\n}\r\n/**\r\n * Class containing static functions to help procedurally build meshes\r\n * @deprecated use the function directly from the module\r\n */\r\nexport const IcoSphereBuilder = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CreateIcoSphere,\r\n};\r\n\r\nVertexData.CreateIcoSphere = CreateIcoSphereVertexData;\r\n\r\nMesh.CreateIcoSphere = (name: string, options: { radius?: number; flat?: boolean; subdivisions?: number; sideOrientation?: number; updatable?: boolean }, scene: Scene): Mesh => {\r\n return CreateIcoSphere(name, options, scene);\r\n};\r\n", "import { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { WebXRInput } from \"../webXRInput\";\r\nimport type { WebXRInputSource } from \"../webXRInputSource\";\r\nimport { Matrix, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { PhysicsImpostor } from \"../../Physics/v1/physicsImpostor\";\r\n\r\nimport type { IDisposable, Scene } from \"../../scene\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { InstancedMesh } from \"../../Meshes/instancedMesh\";\r\nimport type { ISceneLoaderAsyncResult } from \"../../Loading/sceneLoader\";\r\nimport { SceneLoader } from \"../../Loading/sceneLoader\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { NodeMaterial } from \"../../Materials/Node/nodeMaterial\";\r\nimport type { InputBlock } from \"../../Materials/Node/Blocks/Input/inputBlock\";\r\nimport { Material } from \"../../Materials/material\";\r\nimport { CreateIcoSphere } from \"../../Meshes/Builders/icoSphereBuilder\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Axis } from \"../../Maths/math.axis\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { WebXRCompositionLayerWrapper } from \"./Layers/WebXRCompositionLayer\";\r\n\r\ndeclare const XRHand: XRHand;\r\n\r\n/**\r\n * Configuration interface for the hand tracking feature\r\n */\r\nexport interface IWebXRHandTrackingOptions {\r\n /**\r\n * The xrInput that will be used as source for new hands\r\n */\r\n xrInput: WebXRInput;\r\n\r\n /**\r\n * Configuration object for the joint meshes.\r\n */\r\n jointMeshes?: {\r\n /**\r\n * Should the meshes created be invisible (defaults to false).\r\n */\r\n invisible?: boolean;\r\n /**\r\n * A source mesh to be used to create instances. Defaults to an icosphere with two subdivisions and smooth lighting.\r\n * This mesh will be the source for all other (25) meshes.\r\n * It should have the general size of a single unit, as the instances will be scaled according to the provided radius.\r\n */\r\n sourceMesh?: Mesh;\r\n /**\r\n * This function will be called after a mesh was created for a specific joint.\r\n * Using this function you can either manipulate the instance or return a new mesh.\r\n * When returning a new mesh the instance created before will be disposed.\r\n * @param meshInstance An instance of the original joint mesh being used for the joint.\r\n * @param jointId The joint's index, see https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section for more info.\r\n * @param hand Which hand (\"left\", \"right\") the joint will be on.\r\n */\r\n onHandJointMeshGenerated?: (meshInstance: InstancedMesh, jointId: number, hand: XRHandedness) => AbstractMesh | undefined;\r\n /**\r\n * Should the source mesh stay visible (defaults to false).\r\n */\r\n keepOriginalVisible?: boolean;\r\n /**\r\n * Should each instance have its own physics impostor\r\n */\r\n enablePhysics?: boolean;\r\n /**\r\n * If enabled, override default physics properties\r\n */\r\n physicsProps?: { friction?: number; restitution?: number; impostorType?: number };\r\n /**\r\n * Scale factor for all joint meshes (defaults to 1)\r\n */\r\n scaleFactor?: number;\r\n };\r\n\r\n /**\r\n * Configuration object for the hand meshes.\r\n */\r\n handMeshes?: {\r\n /**\r\n * Should the default hand mesh be disabled. In this case, the spheres will be visible (unless set invisible).\r\n */\r\n disableDefaultMeshes?: boolean;\r\n /**\r\n * Rigged hand meshes that will be tracked to the user's hands. This will override the default hand mesh.\r\n */\r\n customMeshes?: {\r\n right: AbstractMesh;\r\n left: AbstractMesh;\r\n };\r\n /**\r\n * Are the meshes prepared for a left-handed system. Default hand meshes are right-handed.\r\n */\r\n meshesUseLeftHandedCoordinates?: boolean;\r\n /**\r\n * If a hand mesh was provided, this array will define what axis will update which node. This will override the default hand mesh\r\n */\r\n customRigMappings?: {\r\n right: XRHandMeshRigMapping;\r\n left: XRHandMeshRigMapping;\r\n };\r\n\r\n /**\r\n * Override the colors of the hand meshes.\r\n */\r\n customColors?: {\r\n base?: Color3;\r\n fresnel?: Color3;\r\n fingerColor?: Color3;\r\n tipFresnel?: Color3;\r\n };\r\n\r\n /**\r\n * Define whether or not the hand meshes should be disposed on just invisible when the session ends.\r\n * Not setting, or setting to false, will maintain the hand meshes in the scene after the session ends, which will allow q quicker re-entry into XR.\r\n */\r\n disposeOnSessionEnd?: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Parts of the hands divided to writs and finger names\r\n */\r\nexport enum HandPart {\r\n /**\r\n * HandPart - Wrist\r\n */\r\n WRIST = \"wrist\",\r\n /**\r\n * HandPart - The thumb\r\n */\r\n THUMB = \"thumb\",\r\n /**\r\n * HandPart - Index finger\r\n */\r\n INDEX = \"index\",\r\n /**\r\n * HandPart - Middle finger\r\n */\r\n MIDDLE = \"middle\",\r\n /**\r\n * HandPart - Ring finger\r\n */\r\n RING = \"ring\",\r\n /**\r\n * HandPart - Little finger\r\n */\r\n LITTLE = \"little\",\r\n}\r\n\r\n/**\r\n * Joints of the hand as defined by the WebXR specification.\r\n * https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section\r\n */\r\nexport enum WebXRHandJoint {\r\n /** Wrist */\r\n WRIST = \"wrist\",\r\n\r\n /** Thumb near wrist */\r\n THUMB_METACARPAL = \"thumb-metacarpal\",\r\n /** Thumb first knuckle */\r\n THUMB_PHALANX_PROXIMAL = \"thumb-phalanx-proximal\",\r\n /** Thumb second knuckle */\r\n THUMB_PHALANX_DISTAL = \"thumb-phalanx-distal\",\r\n /** Thumb tip */\r\n THUMB_TIP = \"thumb-tip\",\r\n\r\n /** Index finger near wrist */\r\n INDEX_FINGER_METACARPAL = \"index-finger-metacarpal\",\r\n /** Index finger first knuckle */\r\n INDEX_FINGER_PHALANX_PROXIMAL = \"index-finger-phalanx-proximal\",\r\n /** Index finger second knuckle */\r\n INDEX_FINGER_PHALANX_INTERMEDIATE = \"index-finger-phalanx-intermediate\",\r\n /** Index finger third knuckle */\r\n INDEX_FINGER_PHALANX_DISTAL = \"index-finger-phalanx-distal\",\r\n /** Index finger tip */\r\n INDEX_FINGER_TIP = \"index-finger-tip\",\r\n\r\n /** Middle finger near wrist */\r\n MIDDLE_FINGER_METACARPAL = \"middle-finger-metacarpal\",\r\n /** Middle finger first knuckle */\r\n MIDDLE_FINGER_PHALANX_PROXIMAL = \"middle-finger-phalanx-proximal\",\r\n /** Middle finger second knuckle */\r\n MIDDLE_FINGER_PHALANX_INTERMEDIATE = \"middle-finger-phalanx-intermediate\",\r\n /** Middle finger third knuckle */\r\n MIDDLE_FINGER_PHALANX_DISTAL = \"middle-finger-phalanx-distal\",\r\n /** Middle finger tip */\r\n MIDDLE_FINGER_TIP = \"middle-finger-tip\",\r\n\r\n /** Ring finger near wrist */\r\n RING_FINGER_METACARPAL = \"ring-finger-metacarpal\",\r\n /** Ring finger first knuckle */\r\n RING_FINGER_PHALANX_PROXIMAL = \"ring-finger-phalanx-proximal\",\r\n /** Ring finger second knuckle */\r\n RING_FINGER_PHALANX_INTERMEDIATE = \"ring-finger-phalanx-intermediate\",\r\n /** Ring finger third knuckle */\r\n RING_FINGER_PHALANX_DISTAL = \"ring-finger-phalanx-distal\",\r\n /** Ring finger tip */\r\n RING_FINGER_TIP = \"ring-finger-tip\",\r\n\r\n /** Pinky finger near wrist */\r\n PINKY_FINGER_METACARPAL = \"pinky-finger-metacarpal\",\r\n /** Pinky finger first knuckle */\r\n PINKY_FINGER_PHALANX_PROXIMAL = \"pinky-finger-phalanx-proximal\",\r\n /** Pinky finger second knuckle */\r\n PINKY_FINGER_PHALANX_INTERMEDIATE = \"pinky-finger-phalanx-intermediate\",\r\n /** Pinky finger third knuckle */\r\n PINKY_FINGER_PHALANX_DISTAL = \"pinky-finger-phalanx-distal\",\r\n /** Pinky finger tip */\r\n PINKY_FINGER_TIP = \"pinky-finger-tip\",\r\n}\r\n\r\n/** A type encapsulating a dictionary mapping WebXR joints to bone names in a rigged hand mesh. */\r\nexport type XRHandMeshRigMapping = { [webXRJointName in WebXRHandJoint]: string };\r\n\r\nconst handJointReferenceArray: WebXRHandJoint[] = [\r\n WebXRHandJoint.WRIST,\r\n WebXRHandJoint.THUMB_METACARPAL,\r\n WebXRHandJoint.THUMB_PHALANX_PROXIMAL,\r\n WebXRHandJoint.THUMB_PHALANX_DISTAL,\r\n WebXRHandJoint.THUMB_TIP,\r\n WebXRHandJoint.INDEX_FINGER_METACARPAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.INDEX_FINGER_TIP,\r\n WebXRHandJoint.MIDDLE_FINGER_METACARPAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.MIDDLE_FINGER_TIP,\r\n WebXRHandJoint.RING_FINGER_METACARPAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.RING_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.RING_FINGER_TIP,\r\n WebXRHandJoint.PINKY_FINGER_METACARPAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.PINKY_FINGER_TIP,\r\n];\r\n\r\nconst handPartsDefinition: { [key in HandPart]: WebXRHandJoint[] } = {\r\n [HandPart.WRIST]: [WebXRHandJoint.WRIST],\r\n [HandPart.THUMB]: [WebXRHandJoint.THUMB_METACARPAL, WebXRHandJoint.THUMB_PHALANX_PROXIMAL, WebXRHandJoint.THUMB_PHALANX_DISTAL, WebXRHandJoint.THUMB_TIP],\r\n [HandPart.INDEX]: [\r\n WebXRHandJoint.INDEX_FINGER_METACARPAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.INDEX_FINGER_TIP,\r\n ],\r\n [HandPart.MIDDLE]: [\r\n WebXRHandJoint.MIDDLE_FINGER_METACARPAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.MIDDLE_FINGER_TIP,\r\n ],\r\n [HandPart.RING]: [\r\n WebXRHandJoint.RING_FINGER_METACARPAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.RING_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.RING_FINGER_TIP,\r\n ],\r\n [HandPart.LITTLE]: [\r\n WebXRHandJoint.PINKY_FINGER_METACARPAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE,\r\n WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL,\r\n WebXRHandJoint.PINKY_FINGER_TIP,\r\n ],\r\n};\r\n\r\n/**\r\n * Representing a single hand (with its corresponding native XRHand object)\r\n */\r\nexport class WebXRHand implements IDisposable {\r\n private _scene: Scene;\r\n\r\n /**\r\n * Transform nodes that will directly receive the transforms from the WebXR matrix data.\r\n */\r\n private _jointTransforms = new Array(handJointReferenceArray.length);\r\n\r\n /**\r\n * The float array that will directly receive the transform matrix data from WebXR.\r\n */\r\n private _jointTransformMatrices = new Float32Array(handJointReferenceArray.length * 16);\r\n\r\n private _tempJointMatrix = new Matrix();\r\n\r\n /**\r\n * The float array that will directly receive the joint radii from WebXR.\r\n */\r\n private _jointRadii = new Float32Array(handJointReferenceArray.length);\r\n\r\n /**\r\n * Get the hand mesh.\r\n */\r\n public get handMesh(): Nullable {\r\n return this._handMesh;\r\n }\r\n\r\n /**\r\n * Get meshes of part of the hand.\r\n * @param part The part of hand to get.\r\n * @returns An array of meshes that correlate to the hand part requested.\r\n */\r\n public getHandPartMeshes(part: HandPart): AbstractMesh[] {\r\n return handPartsDefinition[part].map((name) => this._jointMeshes[handJointReferenceArray.indexOf(name)]!);\r\n }\r\n\r\n /**\r\n * Retrieves a mesh linked to a named joint in the hand.\r\n * @param jointName The name of the joint.\r\n * @returns An AbstractMesh whose position corresponds with the joint position.\r\n */\r\n public getJointMesh(jointName: WebXRHandJoint): AbstractMesh {\r\n return this._jointMeshes[handJointReferenceArray.indexOf(jointName)!];\r\n }\r\n\r\n /**\r\n * Construct a new hand object\r\n * @param xrController The controller to which the hand correlates.\r\n * @param _jointMeshes The meshes to be used to track the hand joints.\r\n * @param _handMesh An optional hand mesh.\r\n * @param rigMapping An optional rig mapping for the hand mesh.\r\n * If not provided (but a hand mesh is provided),\r\n * it will be assumed that the hand mesh's bones are named\r\n * directly after the WebXR bone names.\r\n * @param _leftHandedMeshes Are the hand meshes left-handed-system meshes\r\n * @param _jointsInvisible Are the tracked joint meshes visible\r\n * @param _jointScaleFactor Scale factor for all joint meshes\r\n */\r\n constructor(\r\n /** The controller to which the hand correlates. */\r\n public readonly xrController: WebXRInputSource,\r\n private readonly _jointMeshes: AbstractMesh[],\r\n private _handMesh: Nullable,\r\n /** An optional rig mapping for the hand mesh. If not provided (but a hand mesh is provided),\r\n * it will be assumed that the hand mesh's bones are named directly after the WebXR bone names. */\r\n readonly rigMapping: Nullable,\r\n private readonly _leftHandedMeshes: boolean = false,\r\n private readonly _jointsInvisible: boolean = false,\r\n private readonly _jointScaleFactor: number = 1\r\n ) {\r\n this._scene = _jointMeshes[0].getScene();\r\n\r\n // Initialize the joint transform quaternions and link the transforms to the bones.\r\n for (let jointIdx = 0; jointIdx < this._jointTransforms.length; jointIdx++) {\r\n const jointTransform = (this._jointTransforms[jointIdx] = new TransformNode(handJointReferenceArray[jointIdx], this._scene));\r\n jointTransform.rotationQuaternion = new Quaternion();\r\n\r\n // Set the rotation quaternion so we can use it later for tracking.\r\n _jointMeshes[jointIdx].rotationQuaternion = new Quaternion();\r\n }\r\n\r\n if (_handMesh) {\r\n // Note that this logic needs to happen after we initialize the joint tracking transform nodes.\r\n this.setHandMesh(_handMesh, rigMapping);\r\n }\r\n\r\n // hide the motion controller, if available/loaded\r\n if (this.xrController.motionController) {\r\n if (this.xrController.motionController.rootMesh) {\r\n this.xrController.motionController.rootMesh.dispose(false, true);\r\n }\r\n }\r\n\r\n this.xrController.onMotionControllerInitObservable.add((motionController) => {\r\n motionController._doNotLoadControllerMesh = true;\r\n });\r\n }\r\n\r\n /**\r\n * Sets the current hand mesh to render for the WebXRHand.\r\n * @param handMesh The rigged hand mesh that will be tracked to the user's hand.\r\n * @param rigMapping The mapping from XRHandJoint to bone names to use with the mesh.\r\n * @param _xrSessionManager The XRSessionManager used to initialize the hand mesh.\r\n */\r\n public setHandMesh(handMesh: AbstractMesh, rigMapping: Nullable, _xrSessionManager?: WebXRSessionManager) {\r\n this._handMesh = handMesh;\r\n\r\n // Avoid any strange frustum culling. We will manually control visibility via attach and detach.\r\n handMesh.alwaysSelectAsActiveMesh = true;\r\n handMesh.getChildMeshes().forEach((mesh) => {\r\n mesh.alwaysSelectAsActiveMesh = true;\r\n });\r\n\r\n // Link the bones in the hand mesh to the transform nodes that will be bound to the WebXR tracked joints.\r\n if (this._handMesh.skeleton) {\r\n const handMeshSkeleton = this._handMesh.skeleton;\r\n handJointReferenceArray.forEach((jointName, jointIdx) => {\r\n const jointBoneIdx = handMeshSkeleton.getBoneIndexByName(rigMapping ? rigMapping[jointName] : jointName);\r\n if (jointBoneIdx !== -1) {\r\n handMeshSkeleton.bones[jointBoneIdx].linkTransformNode(this._jointTransforms[jointIdx]);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Update this hand from the latest xr frame.\r\n * @param xrFrame The latest frame received from WebXR.\r\n * @param referenceSpace The current viewer reference space.\r\n */\r\n public updateFromXRFrame(xrFrame: XRFrame, referenceSpace: XRReferenceSpace) {\r\n const hand = this.xrController.inputSource.hand;\r\n if (!hand) {\r\n return;\r\n }\r\n\r\n // TODO: Modify webxr.d.ts to better match WebXR IDL so we don't need this any cast.\r\n const anyHand: any = hand;\r\n const jointSpaces: XRJointSpace[] = handJointReferenceArray.map((jointName) => anyHand[jointName] || hand.get(jointName));\r\n let trackingSuccessful = false;\r\n\r\n if (xrFrame.fillPoses && xrFrame.fillJointRadii) {\r\n trackingSuccessful = xrFrame.fillPoses(jointSpaces, referenceSpace, this._jointTransformMatrices) && xrFrame.fillJointRadii(jointSpaces, this._jointRadii);\r\n } else if (xrFrame.getJointPose) {\r\n trackingSuccessful = true;\r\n // Warning: This codepath is slow by comparison, only here for compat.\r\n for (let jointIdx = 0; jointIdx < jointSpaces.length; jointIdx++) {\r\n const jointPose = xrFrame.getJointPose(jointSpaces[jointIdx], referenceSpace);\r\n if (jointPose) {\r\n this._jointTransformMatrices.set(jointPose.transform.matrix, jointIdx * 16);\r\n this._jointRadii[jointIdx] = jointPose.radius || 0.008;\r\n } else {\r\n trackingSuccessful = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!trackingSuccessful) {\r\n return;\r\n }\r\n\r\n handJointReferenceArray.forEach((_jointName, jointIdx) => {\r\n const jointTransform = this._jointTransforms[jointIdx];\r\n Matrix.FromArrayToRef(this._jointTransformMatrices, jointIdx * 16, this._tempJointMatrix);\r\n this._tempJointMatrix.decompose(undefined, jointTransform.rotationQuaternion!, jointTransform.position);\r\n\r\n // The radius we need to make the joint in order for it to roughly cover the joints of the user's real hand.\r\n const scaledJointRadius = this._jointRadii[jointIdx] * this._jointScaleFactor;\r\n\r\n const jointMesh = this._jointMeshes[jointIdx];\r\n jointMesh.isVisible = !this._handMesh && !this._jointsInvisible;\r\n jointMesh.position.copyFrom(jointTransform.position);\r\n jointMesh.rotationQuaternion!.copyFrom(jointTransform.rotationQuaternion!);\r\n jointMesh.scaling.setAll(scaledJointRadius);\r\n\r\n // The WebXR data comes as right-handed, so we might need to do some conversions.\r\n if (!this._scene.useRightHandedSystem) {\r\n jointMesh.position.z *= -1;\r\n jointMesh.rotationQuaternion!.z *= -1;\r\n jointMesh.rotationQuaternion!.w *= -1;\r\n\r\n if (this._leftHandedMeshes && this._handMesh) {\r\n jointTransform.position.z *= -1;\r\n jointTransform.rotationQuaternion!.z *= -1;\r\n jointTransform.rotationQuaternion!.w *= -1;\r\n }\r\n }\r\n });\r\n\r\n if (this._handMesh) {\r\n this._handMesh.isVisible = true;\r\n }\r\n }\r\n\r\n /**\r\n * Dispose this Hand object\r\n * @param disposeMeshes Should the meshes be disposed as well\r\n */\r\n public dispose(disposeMeshes = false) {\r\n if (this._handMesh) {\r\n if (disposeMeshes) {\r\n this._handMesh.skeleton?.dispose();\r\n this._handMesh.dispose(false, true);\r\n } else {\r\n this._handMesh.isVisible = false;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * WebXR Hand Joint tracking feature, available for selected browsers and devices\r\n */\r\nexport class WebXRHandTracking extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.HAND_TRACKING;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /** The base URL for the default hand model. */\r\n public static DEFAULT_HAND_MODEL_BASE_URL = \"https://assets.babylonjs.com/meshes/HandMeshes/\";\r\n /** The filename to use for the default right hand model. */\r\n public static DEFAULT_HAND_MODEL_RIGHT_FILENAME = \"r_hand_rhs.glb\";\r\n /** The filename to use for the default left hand model. */\r\n public static DEFAULT_HAND_MODEL_LEFT_FILENAME = \"l_hand_rhs.glb\";\r\n /** The URL pointing to the default hand model NodeMaterial shader. */\r\n public static DEFAULT_HAND_MODEL_SHADER_URL = \"https://assets.babylonjs.com/meshes/HandMeshes/handsShader.json\";\r\n\r\n // We want to use lightweight models, diameter will initially be 1 but scaled to the values returned from WebXR.\r\n private static readonly _ICOSPHERE_PARAMS = { radius: 0.5, flat: false, subdivisions: 2 };\r\n\r\n private static _RightHandGLB: Nullable = null;\r\n private static _LeftHandGLB: Nullable = null;\r\n\r\n private static _GenerateTrackedJointMeshes(featureOptions: IWebXRHandTrackingOptions): { left: AbstractMesh[]; right: AbstractMesh[] } {\r\n const meshes: { [handedness: string]: AbstractMesh[] } = {};\r\n [\"left\" as XRHandedness, \"right\" as XRHandedness].map((handedness) => {\r\n const trackedMeshes = [];\r\n const originalMesh = featureOptions.jointMeshes?.sourceMesh || CreateIcoSphere(\"jointParent\", WebXRHandTracking._ICOSPHERE_PARAMS);\r\n originalMesh.isVisible = !!featureOptions.jointMeshes?.keepOriginalVisible;\r\n for (let i = 0; i < handJointReferenceArray.length; ++i) {\r\n let newInstance: AbstractMesh = originalMesh.createInstance(`${handedness}-handJoint-${i}`);\r\n if (featureOptions.jointMeshes?.onHandJointMeshGenerated) {\r\n const returnedMesh = featureOptions.jointMeshes.onHandJointMeshGenerated(newInstance as InstancedMesh, i, handedness);\r\n if (returnedMesh) {\r\n if (returnedMesh !== newInstance) {\r\n newInstance.dispose();\r\n newInstance = returnedMesh;\r\n }\r\n }\r\n }\r\n newInstance.isPickable = false;\r\n if (featureOptions.jointMeshes?.enablePhysics) {\r\n const props = featureOptions.jointMeshes?.physicsProps || {};\r\n // downscale the instances so that physics will be initialized correctly\r\n newInstance.scaling.setAll(0.02);\r\n const type = props.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;\r\n newInstance.physicsImpostor = new PhysicsImpostor(newInstance, type, { mass: 0, ...props });\r\n }\r\n newInstance.rotationQuaternion = new Quaternion();\r\n newInstance.isVisible = false;\r\n trackedMeshes.push(newInstance);\r\n }\r\n\r\n meshes[handedness] = trackedMeshes;\r\n });\r\n return { left: meshes.left, right: meshes.right };\r\n }\r\n\r\n private static _GenerateDefaultHandMeshesAsync(\r\n scene: Scene,\r\n xrSessionManager: WebXRSessionManager,\r\n options?: IWebXRHandTrackingOptions\r\n ): Promise<{ left: AbstractMesh; right: AbstractMesh }> {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const riggedMeshes: { [handedness: string]: AbstractMesh } = {};\r\n // check the cache, defensive\r\n if (WebXRHandTracking._RightHandGLB?.meshes[1]?.isDisposed()) {\r\n WebXRHandTracking._RightHandGLB = null;\r\n }\r\n if (WebXRHandTracking._LeftHandGLB?.meshes[1]?.isDisposed()) {\r\n WebXRHandTracking._LeftHandGLB = null;\r\n }\r\n\r\n const handsDefined = !!(WebXRHandTracking._RightHandGLB && WebXRHandTracking._LeftHandGLB);\r\n // load them in parallel\r\n const handGLBs = await Promise.all([\r\n WebXRHandTracking._RightHandGLB ||\r\n SceneLoader.ImportMeshAsync(\"\", WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL, WebXRHandTracking.DEFAULT_HAND_MODEL_RIGHT_FILENAME, scene),\r\n WebXRHandTracking._LeftHandGLB ||\r\n SceneLoader.ImportMeshAsync(\"\", WebXRHandTracking.DEFAULT_HAND_MODEL_BASE_URL, WebXRHandTracking.DEFAULT_HAND_MODEL_LEFT_FILENAME, scene),\r\n ]);\r\n WebXRHandTracking._RightHandGLB = handGLBs[0];\r\n WebXRHandTracking._LeftHandGLB = handGLBs[1];\r\n\r\n const handShader = await NodeMaterial.ParseFromFileAsync(\"handShader\", WebXRHandTracking.DEFAULT_HAND_MODEL_SHADER_URL, scene);\r\n\r\n // depth prepass and alpha mode\r\n handShader.needDepthPrePass = true;\r\n handShader.transparencyMode = Material.MATERIAL_ALPHABLEND;\r\n handShader.alphaMode = Constants.ALPHA_COMBINE;\r\n\r\n // build node materials\r\n handShader.build(false);\r\n\r\n // shader\r\n const handColors = {\r\n base: Color3.FromInts(116, 63, 203),\r\n fresnel: Color3.FromInts(149, 102, 229),\r\n fingerColor: Color3.FromInts(177, 130, 255),\r\n tipFresnel: Color3.FromInts(220, 200, 255),\r\n ...options?.handMeshes?.customColors,\r\n };\r\n\r\n const handNodes = {\r\n base: handShader.getBlockByName(\"baseColor\") as InputBlock,\r\n fresnel: handShader.getBlockByName(\"fresnelColor\") as InputBlock,\r\n fingerColor: handShader.getBlockByName(\"fingerColor\") as InputBlock,\r\n tipFresnel: handShader.getBlockByName(\"tipFresnelColor\") as InputBlock,\r\n };\r\n\r\n handNodes.base.value = handColors.base;\r\n handNodes.fresnel.value = handColors.fresnel;\r\n handNodes.fingerColor.value = handColors.fingerColor;\r\n handNodes.tipFresnel.value = handColors.tipFresnel;\r\n const isMultiview = (xrSessionManager._getBaseLayerWrapper() as WebXRCompositionLayerWrapper)?.isMultiview;\r\n [\"left\", \"right\"].forEach((handedness) => {\r\n const handGLB = handedness == \"left\" ? WebXRHandTracking._LeftHandGLB : WebXRHandTracking._RightHandGLB;\r\n if (!handGLB) {\r\n // this should never happen!\r\n throw new Error(\"Could not load hand model\");\r\n }\r\n const handMesh = handGLB.meshes[1];\r\n handMesh._internalAbstractMeshDataInfo._computeBonesUsingShaders = true;\r\n // if in multiview do not use the material\r\n if (!isMultiview) {\r\n handMesh.material = handShader.clone(`${handedness}HandShaderClone`, true);\r\n }\r\n handMesh.isVisible = false;\r\n\r\n riggedMeshes[handedness] = handMesh;\r\n\r\n // single change for left handed systems\r\n if (!handsDefined && !scene.useRightHandedSystem) {\r\n handGLB.meshes[1].rotate(Axis.Y, Math.PI);\r\n }\r\n });\r\n\r\n handShader.dispose();\r\n resolve({ left: riggedMeshes.left, right: riggedMeshes.right });\r\n });\r\n }\r\n\r\n /**\r\n * Generates a mapping from XRHandJoint to bone name for the default hand mesh.\r\n * @param handedness The handedness being mapped for.\r\n * @returns A mapping from XRHandJoint to bone name.\r\n */\r\n private static _GenerateDefaultHandMeshRigMapping(handedness: XRHandedness): XRHandMeshRigMapping {\r\n const H = handedness == \"right\" ? \"R\" : \"L\";\r\n return {\r\n [WebXRHandJoint.WRIST]: `wrist_${H}`,\r\n [WebXRHandJoint.THUMB_METACARPAL]: `thumb_metacarpal_${H}`,\r\n [WebXRHandJoint.THUMB_PHALANX_PROXIMAL]: `thumb_proxPhalanx_${H}`,\r\n [WebXRHandJoint.THUMB_PHALANX_DISTAL]: `thumb_distPhalanx_${H}`,\r\n [WebXRHandJoint.THUMB_TIP]: `thumb_tip_${H}`,\r\n [WebXRHandJoint.INDEX_FINGER_METACARPAL]: `index_metacarpal_${H}`,\r\n [WebXRHandJoint.INDEX_FINGER_PHALANX_PROXIMAL]: `index_proxPhalanx_${H}`,\r\n [WebXRHandJoint.INDEX_FINGER_PHALANX_INTERMEDIATE]: `index_intPhalanx_${H}`,\r\n [WebXRHandJoint.INDEX_FINGER_PHALANX_DISTAL]: `index_distPhalanx_${H}`,\r\n [WebXRHandJoint.INDEX_FINGER_TIP]: `index_tip_${H}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_METACARPAL]: `middle_metacarpal_${H}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_PROXIMAL]: `middle_proxPhalanx_${H}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_INTERMEDIATE]: `middle_intPhalanx_${H}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_PHALANX_DISTAL]: `middle_distPhalanx_${H}`,\r\n [WebXRHandJoint.MIDDLE_FINGER_TIP]: `middle_tip_${H}`,\r\n [WebXRHandJoint.RING_FINGER_METACARPAL]: `ring_metacarpal_${H}`,\r\n [WebXRHandJoint.RING_FINGER_PHALANX_PROXIMAL]: `ring_proxPhalanx_${H}`,\r\n [WebXRHandJoint.RING_FINGER_PHALANX_INTERMEDIATE]: `ring_intPhalanx_${H}`,\r\n [WebXRHandJoint.RING_FINGER_PHALANX_DISTAL]: `ring_distPhalanx_${H}`,\r\n [WebXRHandJoint.RING_FINGER_TIP]: `ring_tip_${H}`,\r\n [WebXRHandJoint.PINKY_FINGER_METACARPAL]: `little_metacarpal_${H}`,\r\n [WebXRHandJoint.PINKY_FINGER_PHALANX_PROXIMAL]: `little_proxPhalanx_${H}`,\r\n [WebXRHandJoint.PINKY_FINGER_PHALANX_INTERMEDIATE]: `little_intPhalanx_${H}`,\r\n [WebXRHandJoint.PINKY_FINGER_PHALANX_DISTAL]: `little_distPhalanx_${H}`,\r\n [WebXRHandJoint.PINKY_FINGER_TIP]: `little_tip_${H}`,\r\n };\r\n }\r\n\r\n private _attachedHands: {\r\n [uniqueId: string]: WebXRHand;\r\n } = {};\r\n\r\n private _trackingHands: {\r\n left: Nullable;\r\n right: Nullable;\r\n } = { left: null, right: null };\r\n\r\n private _handResources: {\r\n jointMeshes: Nullable<{ left: AbstractMesh[]; right: AbstractMesh[] }>;\r\n handMeshes: Nullable<{ left: AbstractMesh; right: AbstractMesh }>;\r\n rigMappings: Nullable<{ left: XRHandMeshRigMapping; right: XRHandMeshRigMapping }>;\r\n } = { jointMeshes: null, handMeshes: null, rigMappings: null };\r\n\r\n private _worldScaleObserver?: Nullable> = null;\r\n\r\n /**\r\n * This observable will notify registered observers when a new hand object was added and initialized\r\n */\r\n public onHandAddedObservable: Observable = new Observable();\r\n /**\r\n * This observable will notify its observers right before the hand object is disposed\r\n */\r\n public onHandRemovedObservable: Observable = new Observable();\r\n\r\n /**\r\n * Check if the needed objects are defined.\r\n * This does not mean that the feature is enabled, but that the objects needed are well defined.\r\n * @returns true if the needed objects for this feature are defined\r\n */\r\n public isCompatible(): boolean {\r\n return typeof XRHand !== \"undefined\";\r\n }\r\n\r\n /**\r\n * Get the hand object according to the controller id\r\n * @param controllerId the controller id to which we want to get the hand\r\n * @returns null if not found or the WebXRHand object if found\r\n */\r\n public getHandByControllerId(controllerId: string): Nullable {\r\n return this._attachedHands[controllerId];\r\n }\r\n\r\n /**\r\n * Get a hand object according to the requested handedness\r\n * @param handedness the handedness to request\r\n * @returns null if not found or the WebXRHand object if found\r\n */\r\n public getHandByHandedness(handedness: XRHandedness): Nullable {\r\n if (handedness == \"none\") {\r\n return null;\r\n }\r\n return this._trackingHands[handedness];\r\n }\r\n\r\n /**\r\n * Creates a new instance of the XR hand tracking feature.\r\n * @param _xrSessionManager An instance of WebXRSessionManager.\r\n * @param options Options to use when constructing this feature.\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /** Options to use when constructing this feature. */\r\n public readonly options: IWebXRHandTrackingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"hand-tracking\";\r\n\r\n // Support legacy versions of the options object by copying over joint mesh properties\r\n const anyOptions = options as any;\r\n const anyJointMeshOptions = anyOptions.jointMeshes;\r\n if (anyJointMeshOptions) {\r\n if (typeof anyJointMeshOptions.disableDefaultHandMesh !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.disableDefaultMeshes = anyJointMeshOptions.disableDefaultHandMesh;\r\n }\r\n if (typeof anyJointMeshOptions.handMeshes !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.customMeshes = anyJointMeshOptions.handMeshes;\r\n }\r\n if (typeof anyJointMeshOptions.leftHandedSystemMeshes !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n options.handMeshes.meshesUseLeftHandedCoordinates = anyJointMeshOptions.leftHandedSystemMeshes;\r\n }\r\n if (typeof anyJointMeshOptions.rigMapping !== \"undefined\") {\r\n options.handMeshes = options.handMeshes || {};\r\n const leftRigMapping = {};\r\n const rightRigMapping = {};\r\n [\r\n [anyJointMeshOptions.rigMapping.left, leftRigMapping],\r\n [anyJointMeshOptions.rigMapping.right, rightRigMapping],\r\n ].forEach((rigMappingTuple) => {\r\n const legacyRigMapping = rigMappingTuple[0] as string[];\r\n const rigMapping = rigMappingTuple[1] as XRHandMeshRigMapping;\r\n legacyRigMapping.forEach((modelJointName, index) => {\r\n rigMapping[handJointReferenceArray[index]] = modelJointName;\r\n });\r\n });\r\n options.handMeshes.customRigMappings = {\r\n left: leftRigMapping as XRHandMeshRigMapping,\r\n right: rightRigMapping as XRHandMeshRigMapping,\r\n };\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Attach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n this._handResources = {\r\n jointMeshes: WebXRHandTracking._GenerateTrackedJointMeshes(this.options),\r\n handMeshes: this.options.handMeshes?.customMeshes || null,\r\n rigMappings: this.options.handMeshes?.customRigMappings || null,\r\n };\r\n\r\n // If they didn't supply custom meshes and are not disabling the default meshes...\r\n if (!this.options.handMeshes?.customMeshes && !this.options.handMeshes?.disableDefaultMeshes) {\r\n WebXRHandTracking._GenerateDefaultHandMeshesAsync(EngineStore.LastCreatedScene!, this._xrSessionManager, this.options).then((defaultHandMeshes) => {\r\n this._handResources.handMeshes = defaultHandMeshes;\r\n this._handResources.rigMappings = {\r\n left: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"left\"),\r\n right: WebXRHandTracking._GenerateDefaultHandMeshRigMapping(\"right\"),\r\n };\r\n\r\n // Apply meshes to existing hands if already tracking.\r\n this._trackingHands.left?.setHandMesh(this._handResources.handMeshes.left, this._handResources.rigMappings.left, this._xrSessionManager);\r\n this._trackingHands.right?.setHandMesh(this._handResources.handMeshes.right, this._handResources.rigMappings.right, this._xrSessionManager);\r\n this._handResources.handMeshes.left.scaling.setAll(this._xrSessionManager.worldScalingFactor);\r\n this._handResources.handMeshes.right.scaling.setAll(this._xrSessionManager.worldScalingFactor);\r\n });\r\n this._worldScaleObserver = this._xrSessionManager.onWorldScaleFactorChangedObservable.add((scalingFactors) => {\r\n if (this._handResources.handMeshes) {\r\n this._handResources.handMeshes.left.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor);\r\n this._handResources.handMeshes.right.scaling.scaleInPlace(scalingFactors.newScaleFactor / scalingFactors.previousScaleFactor);\r\n }\r\n });\r\n }\r\n\r\n this.options.xrInput.controllers.forEach(this._attachHand);\r\n this._addNewAttachObserver(this.options.xrInput.onControllerAddedObservable, this._attachHand);\r\n this._addNewAttachObserver(this.options.xrInput.onControllerRemovedObservable, this._detachHand);\r\n\r\n return true;\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n this._trackingHands.left?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace);\r\n this._trackingHands.right?.updateFromXRFrame(_xrFrame, this._xrSessionManager.referenceSpace);\r\n }\r\n\r\n private _attachHand = (xrController: WebXRInputSource) => {\r\n if (!xrController.inputSource.hand || xrController.inputSource.handedness == \"none\" || !this._handResources.jointMeshes) {\r\n return;\r\n }\r\n\r\n const handedness = xrController.inputSource.handedness;\r\n const webxrHand = new WebXRHand(\r\n xrController,\r\n this._handResources.jointMeshes[handedness],\r\n this._handResources.handMeshes && this._handResources.handMeshes[handedness],\r\n this._handResources.rigMappings && this._handResources.rigMappings[handedness],\r\n this.options.handMeshes?.meshesUseLeftHandedCoordinates,\r\n this.options.jointMeshes?.invisible,\r\n this.options.jointMeshes?.scaleFactor\r\n );\r\n\r\n this._attachedHands[xrController.uniqueId] = webxrHand;\r\n this._trackingHands[handedness] = webxrHand;\r\n\r\n this.onHandAddedObservable.notifyObservers(webxrHand);\r\n };\r\n\r\n private _detachHandById(controllerId: string, disposeMesh?: boolean) {\r\n const hand = this.getHandByControllerId(controllerId);\r\n if (hand) {\r\n const handedness = hand.xrController.inputSource.handedness == \"left\" ? \"left\" : \"right\";\r\n if (this._trackingHands[handedness]?.xrController.uniqueId === controllerId) {\r\n this._trackingHands[handedness] = null;\r\n }\r\n this.onHandRemovedObservable.notifyObservers(hand);\r\n hand.dispose(disposeMesh);\r\n delete this._attachedHands[controllerId];\r\n }\r\n }\r\n\r\n private _detachHand = (xrController: WebXRInputSource) => {\r\n this._detachHandById(xrController.uniqueId);\r\n };\r\n\r\n /**\r\n * Detach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n Object.keys(this._attachedHands).forEach((uniqueId) => this._detachHandById(uniqueId, this.options.handMeshes?.disposeOnSessionEnd));\r\n if (this.options.handMeshes?.disposeOnSessionEnd) {\r\n if (this._handResources.jointMeshes) {\r\n this._handResources.jointMeshes.left.forEach((trackedMesh) => trackedMesh.dispose());\r\n this._handResources.jointMeshes.right.forEach((trackedMesh) => trackedMesh.dispose());\r\n }\r\n }\r\n\r\n // remove world scale observer\r\n if (this._worldScaleObserver) {\r\n this._xrSessionManager.onWorldScaleFactorChangedObservable.remove(this._worldScaleObserver);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n this.onHandAddedObservable.clear();\r\n this.onHandRemovedObservable.clear();\r\n\r\n if (this._handResources.handMeshes && !this.options.handMeshes?.customMeshes) {\r\n // this will dispose the cached meshes\r\n this._handResources.handMeshes.left.dispose();\r\n this._handResources.handMeshes.right.dispose();\r\n // remove the cached meshes\r\n WebXRHandTracking._RightHandGLB = null;\r\n WebXRHandTracking._LeftHandGLB = null;\r\n }\r\n\r\n if (this._handResources.jointMeshes) {\r\n this._handResources.jointMeshes.left.forEach((trackedMesh) => trackedMesh.dispose());\r\n this._handResources.jointMeshes.right.forEach((trackedMesh) => trackedMesh.dispose());\r\n }\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRHandTracking.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRHandTracking(xrSessionManager, options);\r\n },\r\n WebXRHandTracking.Version,\r\n false\r\n);\r\n", "import type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { WebXRFeatureName } from \"../../XR/webXRFeaturesManager\";\r\nimport type { WebXRFeaturesManager } from \"../../XR/webXRFeaturesManager\";\r\nimport type { WebXREyeTracking } from \"../../XR/features/WebXREyeTracking\";\r\nimport type { WebXRHandTracking } from \"../../XR/features/WebXRHandTracking\";\r\nimport { WebXRHandJoint } from \"../../XR/features/WebXRHandTracking\";\r\nimport type { WebXRExperienceHelper } from \"../../XR/webXRExperienceHelper\";\r\nimport type { Behavior } from \"../behavior\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Quaternion, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { Ray } from \"../../Culling/ray\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/**\r\n * Zones around the hand\r\n */\r\nexport enum HandConstraintZone {\r\n /**\r\n * Above finger tips\r\n */\r\n ABOVE_FINGER_TIPS,\r\n /**\r\n * Next to the thumb\r\n */\r\n RADIAL_SIDE,\r\n /**\r\n * Next to the pinky finger\r\n */\r\n ULNAR_SIDE,\r\n /**\r\n * Below the wrist\r\n */\r\n BELOW_WRIST,\r\n}\r\n\r\n/**\r\n * Orientations for the hand zones and for the attached node\r\n */\r\nexport enum HandConstraintOrientation {\r\n /**\r\n * Orientation is towards the camera\r\n */\r\n LOOK_AT_CAMERA,\r\n /**\r\n * Orientation is determined by the rotation of the palm\r\n */\r\n HAND_ROTATION,\r\n}\r\n\r\n/**\r\n * Orientations for the hand zones and for the attached node\r\n */\r\nexport enum HandConstraintVisibility {\r\n /**\r\n * Constraint is always visible\r\n */\r\n ALWAYS_VISIBLE,\r\n /**\r\n * Constraint is only visible when the palm is up\r\n */\r\n PALM_UP,\r\n /**\r\n * Constraint is only visible when the user is looking at the constraint.\r\n * Uses XR Eye Tracking if enabled/available, otherwise uses camera direction\r\n */\r\n GAZE_FOCUS,\r\n /**\r\n * Constraint is only visible when the palm is up and the user is looking at it\r\n */\r\n PALM_AND_GAZE,\r\n}\r\n\r\ntype HandPoseInfo = {\r\n position: Vector3;\r\n quaternion: Quaternion;\r\n id: string;\r\n};\r\n\r\n/**\r\n * Hand constraint behavior that makes the attached `TransformNode` follow hands in XR experiences.\r\n * @since 5.0.0\r\n */\r\nexport class HandConstraintBehavior implements Behavior {\r\n private _scene: Scene;\r\n private _node: TransformNode;\r\n private _eyeTracking: Nullable;\r\n private _handTracking: Nullable;\r\n private _sceneRenderObserver: Nullable> = null;\r\n private _zoneAxis: { [id: number]: Vector3 } = {};\r\n\r\n /**\r\n * Sets the HandConstraintVisibility level for the hand constraint\r\n */\r\n public handConstraintVisibility: HandConstraintVisibility = HandConstraintVisibility.PALM_AND_GAZE;\r\n\r\n /**\r\n * A number from 0.0 to 1.0, marking how restricted the direction the palm faces is for the attached node to be enabled.\r\n * A 1 means the palm must be directly facing the user before the node is enabled, a 0 means it is always enabled.\r\n * Used with HandConstraintVisibility.PALM_UP\r\n */\r\n public palmUpStrictness: number = 0.95;\r\n\r\n /**\r\n * The radius in meters around the center of the hand that the user must gaze inside for the attached node to be enabled and appear.\r\n * Used with HandConstraintVisibility.GAZE_FOCUS\r\n */\r\n public gazeProximityRadius: number = 0.15;\r\n\r\n /**\r\n * Offset distance from the hand in meters\r\n */\r\n public targetOffset: number = 0.1;\r\n\r\n /**\r\n * Where to place the node regarding the center of the hand.\r\n */\r\n public targetZone: HandConstraintZone = HandConstraintZone.ULNAR_SIDE;\r\n\r\n /**\r\n * Orientation mode of the 4 zones around the hand\r\n */\r\n public zoneOrientationMode: HandConstraintOrientation = HandConstraintOrientation.HAND_ROTATION;\r\n /**\r\n * Orientation mode of the node attached to this behavior\r\n */\r\n public nodeOrientationMode: HandConstraintOrientation = HandConstraintOrientation.HAND_ROTATION;\r\n\r\n /**\r\n * Set the hand this behavior should follow. If set to \"none\", it will follow any visible hand (prioritising the left one).\r\n */\r\n public handedness: XRHandedness = \"none\";\r\n\r\n /**\r\n * Rate of interpolation of position and rotation of the attached node.\r\n * Higher values will give a slower interpolation.\r\n */\r\n public lerpTime = 100;\r\n\r\n /**\r\n * Builds a hand constraint behavior\r\n */\r\n constructor() {\r\n // For a right hand\r\n this._zoneAxis[HandConstraintZone.ABOVE_FINGER_TIPS] = new Vector3(0, 1, 0);\r\n this._zoneAxis[HandConstraintZone.RADIAL_SIDE] = new Vector3(-1, 0, 0);\r\n this._zoneAxis[HandConstraintZone.ULNAR_SIDE] = new Vector3(1, 0, 0);\r\n this._zoneAxis[HandConstraintZone.BELOW_WRIST] = new Vector3(0, -1, 0);\r\n }\r\n\r\n /** gets or sets behavior's name */\r\n public get name() {\r\n return \"HandConstraint\";\r\n }\r\n\r\n /** Enable the behavior */\r\n public enable() {\r\n this._node.setEnabled(true);\r\n }\r\n\r\n /** Disable the behavior */\r\n public disable() {\r\n this._node.setEnabled(false);\r\n }\r\n\r\n private _getHandPose(): Nullable {\r\n if (!this._handTracking) {\r\n return null;\r\n }\r\n\r\n // Retrieve any available hand, starting by the left\r\n let hand;\r\n if (this.handedness === \"none\") {\r\n hand = this._handTracking.getHandByHandedness(\"left\") || this._handTracking.getHandByHandedness(\"right\");\r\n } else {\r\n hand = this._handTracking.getHandByHandedness(this.handedness);\r\n }\r\n\r\n if (hand) {\r\n const pinkyMetacarpal = hand.getJointMesh(WebXRHandJoint.PINKY_FINGER_METACARPAL);\r\n const middleMetacarpal = hand.getJointMesh(WebXRHandJoint.MIDDLE_FINGER_METACARPAL);\r\n const wrist = hand.getJointMesh(WebXRHandJoint.WRIST);\r\n\r\n if (wrist && middleMetacarpal && pinkyMetacarpal) {\r\n const handPose: HandPoseInfo = { position: middleMetacarpal.absolutePosition, quaternion: new Quaternion(), id: hand.xrController.uniqueId };\r\n\r\n // palm forward\r\n const up = TmpVectors.Vector3[0];\r\n const forward = TmpVectors.Vector3[1];\r\n const left = TmpVectors.Vector3[2];\r\n up.copyFrom(middleMetacarpal.absolutePosition).subtractInPlace(wrist.absolutePosition).normalize();\r\n forward.copyFrom(pinkyMetacarpal.absolutePosition).subtractInPlace(middleMetacarpal.absolutePosition).normalize();\r\n\r\n // Create vectors for a rotation quaternion, where forward points out from the palm\r\n Vector3.CrossToRef(up, forward, forward);\r\n Vector3.CrossToRef(forward, up, left);\r\n\r\n Quaternion.FromLookDirectionLHToRef(forward, up, handPose.quaternion);\r\n\r\n return handPose;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Initializes the hand constraint behavior\r\n */\r\n public init() {}\r\n\r\n /**\r\n * Attaches the hand constraint to a `TransformNode`\r\n * @param node defines the node to attach the behavior to\r\n */\r\n public attach(node: TransformNode): void {\r\n this._node = node;\r\n this._scene = node.getScene();\r\n\r\n if (!this._node.rotationQuaternion) {\r\n this._node.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._node.rotation.y, this._node.rotation.x, this._node.rotation.z);\r\n }\r\n\r\n let lastTick = Date.now();\r\n this._sceneRenderObserver = this._scene.onBeforeRenderObservable.add(() => {\r\n const pose = this._getHandPose();\r\n\r\n this._node.reservedDataStore = this._node.reservedDataStore || {};\r\n this._node.reservedDataStore.nearInteraction = this._node.reservedDataStore.nearInteraction || {};\r\n this._node.reservedDataStore.nearInteraction.excludedControllerId = null;\r\n\r\n if (pose) {\r\n const zoneOffset = TmpVectors.Vector3[0];\r\n const camera = this._scene.activeCamera;\r\n\r\n zoneOffset.copyFrom(this._zoneAxis[this.targetZone]);\r\n\r\n const cameraLookAtQuaternion = TmpVectors.Quaternion[0];\r\n if (camera && (this.zoneOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA || this.nodeOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA)) {\r\n const toCamera = TmpVectors.Vector3[1];\r\n toCamera.copyFrom(camera.position).subtractInPlace(pose.position).normalize();\r\n if (this._scene.useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion);\r\n }\r\n }\r\n\r\n if (this.zoneOrientationMode === HandConstraintOrientation.HAND_ROTATION) {\r\n pose.quaternion.toRotationMatrix(TmpVectors.Matrix[0]);\r\n } else {\r\n cameraLookAtQuaternion.toRotationMatrix(TmpVectors.Matrix[0]);\r\n }\r\n\r\n Vector3.TransformNormalToRef(zoneOffset, TmpVectors.Matrix[0], zoneOffset);\r\n zoneOffset.scaleInPlace(this.targetOffset);\r\n\r\n const targetPosition = TmpVectors.Vector3[2];\r\n const targetRotation = TmpVectors.Quaternion[1];\r\n targetPosition.copyFrom(pose.position).addInPlace(zoneOffset);\r\n\r\n if (this.nodeOrientationMode === HandConstraintOrientation.HAND_ROTATION) {\r\n targetRotation.copyFrom(pose.quaternion);\r\n } else {\r\n targetRotation.copyFrom(cameraLookAtQuaternion);\r\n }\r\n\r\n const elapsed = Date.now() - lastTick;\r\n\r\n Vector3.SmoothToRef(this._node.position, targetPosition, elapsed, this.lerpTime, this._node.position);\r\n Quaternion.SmoothToRef(this._node.rotationQuaternion!, targetRotation, elapsed, this.lerpTime, this._node.rotationQuaternion!);\r\n\r\n this._node.reservedDataStore.nearInteraction.excludedControllerId = pose.id;\r\n }\r\n\r\n this._setVisibility(pose);\r\n\r\n lastTick = Date.now();\r\n });\r\n }\r\n\r\n private _setVisibility(pose: Nullable) {\r\n let palmVisible = true;\r\n let gazeVisible = true;\r\n const camera = this._scene.activeCamera;\r\n\r\n if (camera) {\r\n const cameraForward = camera.getForwardRay();\r\n\r\n if (this.handConstraintVisibility === HandConstraintVisibility.GAZE_FOCUS || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {\r\n gazeVisible = false;\r\n let gaze: Ray | undefined;\r\n if (this._eyeTracking) {\r\n gaze = this._eyeTracking.getEyeGaze()!;\r\n }\r\n\r\n gaze = gaze || cameraForward;\r\n\r\n const gazeToBehavior = TmpVectors.Vector3[0];\r\n if (pose) {\r\n pose.position.subtractToRef(gaze.origin, gazeToBehavior);\r\n } else {\r\n this._node.getAbsolutePosition().subtractToRef(gaze.origin, gazeToBehavior);\r\n }\r\n\r\n const projectedDistance = Vector3.Dot(gazeToBehavior, gaze.direction);\r\n const projectedSquared = projectedDistance * projectedDistance;\r\n\r\n if (projectedDistance > 0) {\r\n const radiusSquared = gazeToBehavior.lengthSquared() - projectedSquared;\r\n if (radiusSquared < this.gazeProximityRadius * this.gazeProximityRadius) {\r\n gazeVisible = true;\r\n }\r\n }\r\n }\r\n\r\n if (this.handConstraintVisibility === HandConstraintVisibility.PALM_UP || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {\r\n palmVisible = false;\r\n\r\n if (pose) {\r\n const palmDirection = TmpVectors.Vector3[0];\r\n Vector3.LeftHandedForwardReadOnly.rotateByQuaternionToRef(pose.quaternion, palmDirection);\r\n\r\n if (Vector3.Dot(palmDirection, cameraForward.direction) > this.palmUpStrictness * 2 - 1) {\r\n palmVisible = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._node.setEnabled(palmVisible && gazeVisible);\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the `TransformNode`\r\n */\r\n public detach(): void {\r\n this._scene.onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n }\r\n\r\n /**\r\n * Links the behavior to the XR experience in which to retrieve hand transform information.\r\n * @param xr xr experience\r\n */\r\n public linkToXRExperience(xr: WebXRExperienceHelper | WebXRFeaturesManager) {\r\n const featuresManager: WebXRFeaturesManager = (xr as WebXRExperienceHelper).featuresManager ? (xr as WebXRExperienceHelper).featuresManager : (xr as WebXRFeaturesManager);\r\n if (!featuresManager) {\r\n Tools.Error(\"XR features manager must be available or provided directly for the Hand Menu to work\");\r\n } else {\r\n try {\r\n this._eyeTracking = featuresManager.getEnabledFeature(WebXRFeatureName.EYE_TRACKING) as WebXREyeTracking;\r\n } catch {}\r\n\r\n try {\r\n this._handTracking = featuresManager.getEnabledFeature(WebXRFeatureName.HAND_TRACKING) as WebXRHandTracking;\r\n } catch {\r\n Tools.Error(\"Hand tracking must be enabled for the Hand Menu to work\");\r\n }\r\n }\r\n }\r\n}\r\n", "import type { Scene } from \"../../scene\";\r\nimport type { Vector4 } from \"../../Maths/math.vector\";\r\nimport { Mesh } from \"../mesh\";\r\nimport { VertexData } from \"../mesh.vertexData\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Plane } from \"../../Maths/math.plane\";\r\nimport { CompatibilityOptions } from \"../../Compat/compatibilityOptions\";\r\n\r\n/**\r\n * Creates the VertexData for a Plane\r\n * @param options an object used to set the following optional parameters for the plane, required but can be empty\r\n * * size sets the width and height of the plane to the value of size, optional default 1\r\n * * width sets the width (x direction) of the plane, overwrites the width set by size, optional, default size\r\n * * height sets the height (y direction) of the plane, overwrites the height set by size, optional, default size\r\n * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE\r\n * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)\r\n * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)\r\n * @returns the VertexData of the box\r\n */\r\nexport function CreatePlaneVertexData(options: { size?: number; width?: number; height?: number; sideOrientation?: number; frontUVs?: Vector4; backUVs?: Vector4 }): VertexData {\r\n const indices = [];\r\n const positions = [];\r\n const normals = [];\r\n const uvs = [];\r\n\r\n const width: number = options.width || options.size || 1;\r\n const height: number = options.height || options.size || 1;\r\n const sideOrientation = options.sideOrientation === 0 ? 0 : options.sideOrientation || VertexData.DEFAULTSIDE;\r\n\r\n // Vertices\r\n const halfWidth = width / 2.0;\r\n const halfHeight = height / 2.0;\r\n\r\n positions.push(-halfWidth, -halfHeight, 0);\r\n normals.push(0, 0, -1.0);\r\n uvs.push(0.0, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 : 0.0);\r\n\r\n positions.push(halfWidth, -halfHeight, 0);\r\n normals.push(0, 0, -1.0);\r\n uvs.push(1.0, CompatibilityOptions.UseOpenGLOrientationForUV ? 1.0 : 0.0);\r\n\r\n positions.push(halfWidth, halfHeight, 0);\r\n normals.push(0, 0, -1.0);\r\n uvs.push(1.0, CompatibilityOptions.UseOpenGLOrientationForUV ? 0.0 : 1.0);\r\n\r\n positions.push(-halfWidth, halfHeight, 0);\r\n normals.push(0, 0, -1.0);\r\n uvs.push(0.0, CompatibilityOptions.UseOpenGLOrientationForUV ? 0.0 : 1.0);\r\n\r\n // Indices\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n // Sides\r\n VertexData._ComputeSides(sideOrientation, positions, indices, normals, uvs, options.frontUVs, options.backUVs);\r\n\r\n // Result\r\n const vertexData = new VertexData();\r\n\r\n vertexData.indices = indices;\r\n vertexData.positions = positions;\r\n vertexData.normals = normals;\r\n vertexData.uvs = uvs;\r\n\r\n return vertexData;\r\n}\r\n\r\n/**\r\n * Creates a plane mesh\r\n * * The parameter `size` sets the size (float) of both sides of the plane at once (default 1)\r\n * * You can set some different plane dimensions by using the parameters `width` and `height` (both by default have the same value of `size`)\r\n * * The parameter `sourcePlane` is a Plane instance. It builds a mesh plane from a Math plane\r\n * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE\r\n * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation\r\n * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created\r\n * @param name defines the name of the mesh\r\n * @param options defines the options used to create the mesh\r\n * @param scene defines the hosting scene\r\n * @returns the plane mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#plane\r\n */\r\nexport function CreatePlane(\r\n name: string,\r\n options: { size?: number; width?: number; height?: number; sideOrientation?: number; frontUVs?: Vector4; backUVs?: Vector4; updatable?: boolean; sourcePlane?: Plane } = {},\r\n scene: Nullable = null\r\n): Mesh {\r\n const plane = new Mesh(name, scene);\r\n\r\n options.sideOrientation = Mesh._GetDefaultSideOrientation(options.sideOrientation);\r\n plane._originalBuilderSideOrientation = options.sideOrientation;\r\n\r\n const vertexData = CreatePlaneVertexData(options);\r\n\r\n vertexData.applyToMesh(plane, options.updatable);\r\n\r\n if (options.sourcePlane) {\r\n plane.translate(options.sourcePlane.normal, -options.sourcePlane.d);\r\n plane.setDirection(options.sourcePlane.normal.scale(-1));\r\n }\r\n\r\n return plane;\r\n}\r\n\r\n/**\r\n * Class containing static functions to help procedurally build meshes\r\n * @deprecated use the function directly from the module\r\n */\r\nexport const PlaneBuilder = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CreatePlane,\r\n};\r\n\r\nVertexData.CreatePlane = CreatePlaneVertexData;\r\nMesh.CreatePlane = (name: string, size: number, scene: Scene, updatable?: boolean, sideOrientation?: number): Mesh => {\r\n const options = {\r\n size,\r\n width: size,\r\n height: size,\r\n sideOrientation,\r\n updatable,\r\n };\r\n\r\n return CreatePlane(name, options, scene);\r\n};\r\n", "import type { Behavior } from \"../behavior\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport type { Scene } from \"core/scene\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will allow the mesh to fade in and out\r\n */\r\nexport class FadeInOutBehavior implements Behavior {\r\n /**\r\n * Time in milliseconds to delay before fading in (Default: 0)\r\n */\r\n public fadeInDelay = 0;\r\n\r\n /**\r\n * Time in milliseconds to delay before fading out (Default: 0)\r\n */\r\n public fadeOutDelay = 0;\r\n\r\n /**\r\n * Time in milliseconds for the mesh to fade in (Default: 300)\r\n */\r\n public fadeInTime = 300;\r\n\r\n /**\r\n * Time in milliseconds for the mesh to fade out (Default: 300)\r\n */\r\n public fadeOutTime = 300;\r\n\r\n /**\r\n * Time in milliseconds to delay before fading in (Default: 0)\r\n * Will set both fade in and out delay to the same value\r\n */\r\n public get delay(): number {\r\n return this.fadeInDelay;\r\n }\r\n\r\n public set delay(value: number) {\r\n this.fadeInDelay = value;\r\n this.fadeOutDelay = value;\r\n }\r\n\r\n private _millisecondsPerFrame = 1000 / 60;\r\n private _hovered = false;\r\n private _hoverValue = 0;\r\n private _ownerNode: Nullable = null;\r\n private _onBeforeRenderObserver: Nullable> | undefined;\r\n private _delay: number = 0;\r\n private _time: number = 300;\r\n\r\n /**\r\n * Instantiates the FadeInOutBehavior\r\n */\r\n constructor() {}\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"FadeInOut\";\r\n }\r\n\r\n /**\r\n * Initializes the behavior\r\n */\r\n public init() {}\r\n\r\n /**\r\n * Attaches the fade behavior on the passed in mesh\r\n * @param ownerNode The mesh that will be faded in/out once attached\r\n */\r\n public attach(ownerNode: Mesh): void {\r\n this._ownerNode = ownerNode;\r\n this._setAllVisibility(this._ownerNode, 0);\r\n }\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n this._ownerNode = null;\r\n }\r\n\r\n /**\r\n * Triggers the mesh to begin fading in (or out)\r\n * @param fadeIn if the object should fade in or out (true to fade in)\r\n */\r\n public fadeIn(fadeIn: boolean = true) {\r\n this._delay = fadeIn ? this.fadeInDelay : this.fadeOutDelay;\r\n this._time = fadeIn ? this.fadeInTime : this.fadeOutTime;\r\n\r\n // Cancel any pending updates\r\n this._detachObserver();\r\n\r\n // If fading in and already visible or fading out and already not visible do nothing\r\n if (this._ownerNode && ((fadeIn && this._ownerNode.visibility >= 1) || (!fadeIn && this._ownerNode.visibility <= 0))) {\r\n return;\r\n }\r\n\r\n this._hovered = fadeIn;\r\n if (!this._hovered) {\r\n // Make the delay the negative of fadeout delay so the hoverValue is kept above 1 until\r\n // fadeOutDelay has elapsed\r\n this._delay *= -1;\r\n }\r\n\r\n // Reset the hoverValue. This is necessary because we may have been fading out, e.g. but not yet reached\r\n // the delay, so the hover value is greater than 1\r\n if (this._ownerNode!.visibility >= 1) {\r\n this._hoverValue = this._time;\r\n } else if (this._ownerNode!.visibility <= 0) {\r\n this._hoverValue = 0;\r\n }\r\n this._update();\r\n }\r\n\r\n /**\r\n * Triggers the mesh to begin fading out\r\n */\r\n public fadeOut() {\r\n this.fadeIn(false);\r\n }\r\n\r\n private _update = () => {\r\n if (this._ownerNode) {\r\n this._hoverValue += this._hovered ? this._millisecondsPerFrame : -this._millisecondsPerFrame;\r\n\r\n this._setAllVisibility(this._ownerNode, (this._hoverValue - this._delay) / this._time);\r\n\r\n if (this._ownerNode.visibility > 1) {\r\n this._setAllVisibility(this._ownerNode, 1);\r\n if (this._hoverValue > this._time) {\r\n this._hoverValue = this._time;\r\n this._detachObserver();\r\n return;\r\n }\r\n } else if (this._ownerNode.visibility < 0) {\r\n this._setAllVisibility(this._ownerNode, 0);\r\n if (this._hoverValue < 0) {\r\n this._hoverValue = 0;\r\n this._detachObserver();\r\n return;\r\n }\r\n }\r\n\r\n this._attachObserver();\r\n }\r\n };\r\n\r\n private _setAllVisibility(mesh: AbstractMesh, value: number) {\r\n mesh.visibility = value;\r\n mesh.getChildMeshes().forEach((c) => {\r\n this._setAllVisibility(c, value);\r\n });\r\n }\r\n\r\n private _attachObserver() {\r\n if (!this._onBeforeRenderObserver) {\r\n this._onBeforeRenderObserver = this._ownerNode?.getScene().onBeforeRenderObservable.add(this._update);\r\n }\r\n }\r\n\r\n private _detachObserver() {\r\n if (this._onBeforeRenderObserver) {\r\n this._ownerNode?.getScene().onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n this._onBeforeRenderObserver = null;\r\n }\r\n }\r\n}\r\n", "import type { Behavior } from \"../behavior\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport { Matrix, Quaternion, Vector3 } from \"../../Maths/math.vector\";\r\nimport { Scalar } from \"../../Maths/math.scalar\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Epsilon } from \"../../Maths/math.constants\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will follow a camera\r\n * @since 5.0.0\r\n */\r\nexport class FollowBehavior implements Behavior {\r\n private _scene: Scene;\r\n\r\n // Memory cache to avoid GC usage\r\n private _tmpQuaternion: Quaternion = new Quaternion();\r\n private _tmpVectors: Vector3[] = [new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3()];\r\n private _tmpMatrix: Matrix = new Matrix();\r\n private _tmpInvertView: Matrix = new Matrix();\r\n private _tmpForward: Vector3 = new Vector3();\r\n private _tmpNodeForward: Vector3 = new Vector3();\r\n private _tmpPosition: Vector3 = new Vector3();\r\n\r\n private _followedCamera: Nullable;\r\n private _onBeforeRender: Nullable>;\r\n\r\n private _workingPosition: Vector3 = new Vector3();\r\n private _workingQuaternion: Quaternion = new Quaternion();\r\n private _lastTick: number = -1;\r\n private _recenterNextUpdate = true;\r\n\r\n /**\r\n * Attached node of this behavior\r\n */\r\n public attachedNode: Nullable;\r\n\r\n /**\r\n * Set to false if the node should strictly follow the camera without any interpolation time\r\n */\r\n public interpolatePose = true;\r\n\r\n /**\r\n * Rate of interpolation of position and rotation of the attached node.\r\n * Higher values will give a slower interpolation.\r\n */\r\n public lerpTime = 500;\r\n\r\n /**\r\n * If the behavior should ignore the pitch and roll of the camera.\r\n */\r\n public ignoreCameraPitchAndRoll = false;\r\n\r\n /**\r\n * Pitch offset from camera (relative to Max Distance)\r\n * Is only effective if `ignoreCameraPitchAndRoll` is set to `true`.\r\n */\r\n public pitchOffset = 15;\r\n\r\n /**\r\n * The vertical angle from the camera forward axis to the owner will not exceed this value\r\n */\r\n public maxViewVerticalDegrees = 30;\r\n\r\n /**\r\n * The horizontal angle from the camera forward axis to the owner will not exceed this value\r\n */\r\n public maxViewHorizontalDegrees = 30;\r\n /**\r\n * The attached node will not reorient until the angle between its forward vector and the vector to the camera is greater than this value\r\n */\r\n public orientToCameraDeadzoneDegrees = 60;\r\n /**\r\n * Option to ignore distance clamping\r\n */\r\n public ignoreDistanceClamp = false;\r\n /**\r\n * Option to ignore angle clamping\r\n */\r\n public ignoreAngleClamp = false;\r\n /**\r\n * Max vertical distance between the attachedNode and camera\r\n */\r\n public verticalMaxDistance = 0;\r\n /**\r\n * Default distance from eye to attached node, i.e. the sphere radius\r\n */\r\n public defaultDistance = 0.8;\r\n /**\r\n * Max distance from eye to attached node, i.e. the sphere radius\r\n */\r\n public maximumDistance = 2;\r\n /**\r\n * Min distance from eye to attached node, i.e. the sphere radius\r\n */\r\n public minimumDistance = 0.3;\r\n\r\n /**\r\n * Ignore vertical movement and lock the Y position of the object.\r\n */\r\n public useFixedVerticalOffset = false;\r\n\r\n /**\r\n * Fixed vertical position offset distance.\r\n */\r\n public fixedVerticalOffset = 0;\r\n\r\n /**\r\n * Enables/disables the behavior\r\n * @internal\r\n */\r\n public _enabled = true;\r\n\r\n /**\r\n * The camera that should be followed by this behavior\r\n */\r\n public get followedCamera(): Nullable {\r\n return this._followedCamera || this._scene.activeCamera;\r\n }\r\n\r\n public set followedCamera(camera: Nullable) {\r\n this._followedCamera = camera;\r\n }\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"Follow\";\r\n }\r\n\r\n /**\r\n * Initializes the behavior\r\n */\r\n public init() {}\r\n\r\n /**\r\n * Attaches the follow behavior\r\n * @param ownerNode The mesh that will be following once attached\r\n * @param followedCamera The camera that should be followed by the node\r\n */\r\n public attach(ownerNode: TransformNode, followedCamera?: Camera): void {\r\n this._scene = ownerNode.getScene();\r\n this.attachedNode = ownerNode;\r\n\r\n if (followedCamera) {\r\n this.followedCamera = followedCamera;\r\n }\r\n\r\n this._addObservables();\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n this.attachedNode = null;\r\n this._removeObservables();\r\n }\r\n\r\n /**\r\n * Recenters the attached node in front of the camera on the next update\r\n */\r\n public recenter() {\r\n this._recenterNextUpdate = true;\r\n }\r\n\r\n private _angleBetweenVectorAndPlane(vector: Vector3, normal: Vector3) {\r\n // Work on copies\r\n this._tmpVectors[0].copyFrom(vector);\r\n vector = this._tmpVectors[0];\r\n this._tmpVectors[1].copyFrom(normal);\r\n normal = this._tmpVectors[1];\r\n\r\n vector.normalize();\r\n normal.normalize();\r\n\r\n return Math.PI / 2 - Math.acos(Vector3.Dot(vector, normal));\r\n }\r\n\r\n private _length2D(vector: Vector3) {\r\n return Math.sqrt(vector.x * vector.x + vector.z * vector.z);\r\n }\r\n\r\n private _distanceClamp(currentToTarget: Vector3, moveToDefault: boolean = false) {\r\n let minDistance = this.minimumDistance;\r\n let maxDistance = this.maximumDistance;\r\n const defaultDistance = this.defaultDistance;\r\n\r\n const direction = this._tmpVectors[0];\r\n direction.copyFrom(currentToTarget);\r\n let currentDistance = direction.length();\r\n direction.normalizeFromLength(currentDistance);\r\n\r\n if (this.ignoreCameraPitchAndRoll) {\r\n // If we don't account for pitch offset, the casted object will float up/down as the reference\r\n // gets closer to it because we will still be casting in the direction of the pitched offset.\r\n // To fix this, only modify the XZ position of the object.\r\n minDistance = this._length2D(direction) * minDistance;\r\n maxDistance = this._length2D(direction) * maxDistance;\r\n\r\n const currentDistance2D = this._length2D(currentToTarget);\r\n direction.scaleInPlace(currentDistance / currentDistance2D);\r\n currentDistance = currentDistance2D;\r\n }\r\n\r\n let clampedDistance = currentDistance;\r\n\r\n if (moveToDefault) {\r\n clampedDistance = defaultDistance;\r\n } else {\r\n clampedDistance = Scalar.Clamp(currentDistance, minDistance, maxDistance);\r\n }\r\n\r\n currentToTarget.copyFrom(direction).scaleInPlace(clampedDistance);\r\n\r\n return currentDistance !== clampedDistance;\r\n }\r\n\r\n private _applyVerticalClamp(currentToTarget: Vector3) {\r\n if (this.verticalMaxDistance !== 0) {\r\n currentToTarget.y = Scalar.Clamp(currentToTarget.y, -this.verticalMaxDistance, this.verticalMaxDistance);\r\n }\r\n }\r\n\r\n private _toOrientationQuatToRef(vector: Vector3, quaternion: Quaternion) {\r\n Quaternion.RotationYawPitchRollToRef(Math.atan2(vector.x, vector.z), Math.atan2(vector.y, Math.sqrt(vector.z * vector.z + vector.x * vector.x)), 0, quaternion);\r\n }\r\n\r\n private _applyPitchOffset(invertView: Matrix) {\r\n const forward = this._tmpVectors[0];\r\n const right = this._tmpVectors[1];\r\n forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n right.copyFromFloats(1, 0, 0);\r\n Vector3.TransformNormalToRef(forward, invertView, forward);\r\n forward.y = 0;\r\n forward.normalize();\r\n Vector3.TransformNormalToRef(right, invertView, right);\r\n\r\n Quaternion.RotationAxisToRef(right, (this.pitchOffset * Math.PI) / 180, this._tmpQuaternion);\r\n forward.rotateByQuaternionToRef(this._tmpQuaternion, forward);\r\n this._toOrientationQuatToRef(forward, this._tmpQuaternion);\r\n this._tmpQuaternion.toRotationMatrix(this._tmpMatrix);\r\n\r\n // Since we already extracted position from the invert view matrix, we can\r\n // disregard the position part of the matrix in the copy\r\n invertView.copyFrom(this._tmpMatrix);\r\n }\r\n\r\n private _angularClamp(invertView: Matrix, currentToTarget: Vector3): boolean {\r\n const forward = this._tmpVectors[5];\r\n forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n const right = this._tmpVectors[6];\r\n right.copyFromFloats(1, 0, 0);\r\n\r\n // forward and right are related to camera frame of reference\r\n Vector3.TransformNormalToRef(forward, invertView, forward);\r\n Vector3.TransformNormalToRef(right, invertView, right);\r\n\r\n // Up is global Z\r\n const up = Vector3.UpReadOnly;\r\n\r\n const dist = currentToTarget.length();\r\n\r\n if (dist < Epsilon) {\r\n return false;\r\n }\r\n\r\n let angularClamped = false;\r\n const rotationQuat = this._tmpQuaternion;\r\n\r\n // X-axis leashing\r\n if (this.ignoreCameraPitchAndRoll) {\r\n const angle = Vector3.GetAngleBetweenVectorsOnPlane(currentToTarget, forward, right);\r\n Quaternion.RotationAxisToRef(right, angle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n } else {\r\n const angle = -Vector3.GetAngleBetweenVectorsOnPlane(currentToTarget, forward, right);\r\n const minMaxAngle = ((this.maxViewVerticalDegrees * Math.PI) / 180) * 0.5;\r\n if (angle < -minMaxAngle) {\r\n Quaternion.RotationAxisToRef(right, -angle - minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n } else if (angle > minMaxAngle) {\r\n Quaternion.RotationAxisToRef(right, -angle + minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n }\r\n }\r\n\r\n // Y-axis leashing\r\n const angle = this._angleBetweenVectorAndPlane(currentToTarget, right) * (this._scene.useRightHandedSystem ? -1 : 1);\r\n const minMaxAngle = ((this.maxViewHorizontalDegrees * Math.PI) / 180) * 0.5;\r\n if (angle < -minMaxAngle) {\r\n Quaternion.RotationAxisToRef(up, -angle - minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n } else if (angle > minMaxAngle) {\r\n Quaternion.RotationAxisToRef(up, -angle + minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n }\r\n\r\n return angularClamped;\r\n }\r\n\r\n private _orientationClamp(currentToTarget: Vector3, rotationQuaternion: Quaternion) {\r\n // Construct a rotation quat from up vector and target vector\r\n const toFollowed = this._tmpVectors[0];\r\n toFollowed.copyFrom(currentToTarget).scaleInPlace(-1).normalize();\r\n\r\n const up = this._tmpVectors[1];\r\n const right = this._tmpVectors[2];\r\n // We use global up vector to orient the following node (global +Y)\r\n up.copyFromFloats(0, 1, 0);\r\n\r\n // Gram-Schmidt to create an orthonormal frame\r\n Vector3.CrossToRef(toFollowed, up, right);\r\n const length = right.length();\r\n\r\n if (length < Epsilon) {\r\n return;\r\n }\r\n\r\n right.normalizeFromLength(length);\r\n\r\n Vector3.CrossToRef(right, toFollowed, up);\r\n if (this.attachedNode?.getScene().useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toFollowed, up, rotationQuaternion);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toFollowed, up, rotationQuaternion);\r\n }\r\n }\r\n\r\n private _passedOrientationDeadzone(currentToTarget: Vector3, forward: Vector3) {\r\n const leashToFollow = this._tmpVectors[5];\r\n leashToFollow.copyFrom(currentToTarget);\r\n leashToFollow.normalize();\r\n\r\n const angle = Math.abs(Vector3.GetAngleBetweenVectorsOnPlane(forward, leashToFollow, Vector3.UpReadOnly));\r\n return (angle * 180) / Math.PI > this.orientToCameraDeadzoneDegrees;\r\n }\r\n\r\n private _updateLeashing(camera: Camera) {\r\n if (this.attachedNode && this._enabled) {\r\n const oldParent = this.attachedNode.parent;\r\n this.attachedNode.setParent(null);\r\n\r\n const worldMatrix = this.attachedNode.getWorldMatrix();\r\n const currentToTarget = this._workingPosition;\r\n const rotationQuaternion = this._workingQuaternion;\r\n const pivot = this.attachedNode.getPivotPoint();\r\n const invertView = this._tmpInvertView;\r\n invertView.copyFrom(camera.getViewMatrix());\r\n invertView.invert();\r\n\r\n Vector3.TransformCoordinatesToRef(pivot, worldMatrix, currentToTarget);\r\n const position = this._tmpPosition;\r\n position.copyFromFloats(0, 0, 0);\r\n Vector3.TransformCoordinatesToRef(position, worldMatrix, position);\r\n position.scaleInPlace(-1).subtractInPlace(pivot);\r\n currentToTarget.subtractInPlace(camera.globalPosition);\r\n\r\n if (this.ignoreCameraPitchAndRoll) {\r\n this._applyPitchOffset(invertView);\r\n }\r\n\r\n let angularClamped = false;\r\n const forward = this._tmpForward;\r\n forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n Vector3.TransformNormalToRef(forward, invertView, forward);\r\n\r\n const nodeForward = this._tmpNodeForward;\r\n nodeForward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n Vector3.TransformNormalToRef(nodeForward, worldMatrix, nodeForward);\r\n\r\n if (this._recenterNextUpdate) {\r\n currentToTarget.copyFrom(forward).scaleInPlace(this.defaultDistance);\r\n } else {\r\n if (this.ignoreAngleClamp) {\r\n const currentDistance = currentToTarget.length();\r\n currentToTarget.copyFrom(forward).scaleInPlace(currentDistance);\r\n } else {\r\n angularClamped = this._angularClamp(invertView, currentToTarget);\r\n }\r\n }\r\n\r\n let distanceClamped = false;\r\n if (!this.ignoreDistanceClamp) {\r\n distanceClamped = this._distanceClamp(currentToTarget, angularClamped);\r\n this._applyVerticalClamp(currentToTarget);\r\n }\r\n\r\n if (this.useFixedVerticalOffset) {\r\n currentToTarget.y = position.y - camera.globalPosition.y + this.fixedVerticalOffset;\r\n }\r\n\r\n if (angularClamped || distanceClamped || this._passedOrientationDeadzone(currentToTarget, nodeForward) || this._recenterNextUpdate) {\r\n this._orientationClamp(currentToTarget, rotationQuaternion);\r\n }\r\n\r\n this._workingPosition.subtractInPlace(pivot);\r\n this._recenterNextUpdate = false;\r\n\r\n this.attachedNode.setParent(oldParent);\r\n }\r\n }\r\n\r\n private _updateTransformToGoal(elapsed: number) {\r\n if (!this.attachedNode || !this.followedCamera || !this._enabled) {\r\n return;\r\n }\r\n\r\n if (!this.attachedNode.rotationQuaternion) {\r\n this.attachedNode.rotationQuaternion = Quaternion.Identity();\r\n }\r\n\r\n const oldParent = this.attachedNode.parent;\r\n this.attachedNode.setParent(null);\r\n\r\n if (!this.interpolatePose) {\r\n this.attachedNode.position.copyFrom(this.followedCamera.globalPosition).addInPlace(this._workingPosition);\r\n this.attachedNode.rotationQuaternion.copyFrom(this._workingQuaternion);\r\n return;\r\n }\r\n\r\n // position\r\n const currentDirection = new Vector3();\r\n currentDirection.copyFrom(this.attachedNode.position).subtractInPlace(this.followedCamera.globalPosition);\r\n Vector3.SmoothToRef(currentDirection, this._workingPosition, elapsed, this.lerpTime, currentDirection);\r\n currentDirection.addInPlace(this.followedCamera.globalPosition);\r\n this.attachedNode.position.copyFrom(currentDirection);\r\n\r\n // rotation\r\n const currentRotation = new Quaternion();\r\n currentRotation.copyFrom(this.attachedNode.rotationQuaternion);\r\n Quaternion.SmoothToRef(currentRotation, this._workingQuaternion, elapsed, this.lerpTime, this.attachedNode.rotationQuaternion);\r\n\r\n this.attachedNode.setParent(oldParent);\r\n }\r\n\r\n private _addObservables() {\r\n this._lastTick = Date.now();\r\n this._onBeforeRender = this._scene.onBeforeRenderObservable.add(() => {\r\n if (!this.followedCamera) {\r\n return;\r\n }\r\n\r\n const tick = Date.now();\r\n this._updateLeashing(this.followedCamera);\r\n this._updateTransformToGoal(tick - this._lastTick);\r\n this._lastTick = tick;\r\n });\r\n }\r\n\r\n private _removeObservables() {\r\n if (this._onBeforeRender) {\r\n this._scene.onBeforeRenderObservable.remove(this._onBeforeRender);\r\n }\r\n }\r\n}\r\n", "/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Behavior } from \"../../Behaviors/behavior\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { PointerInfo } from \"../../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../../Events/pointerEvents\";\r\nimport { Vector3, Quaternion, TmpVectors } from \"../../Maths/math.vector\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport type { PickingInfo } from \"../../Collisions/pickingInfo\";\r\nimport { Camera } from \"../../Cameras/camera\";\r\nimport type { Ray } from \"../../Culling/ray\";\r\nimport type { IPointerEvent } from \"../../Events/deviceInputEvents\";\r\nimport type { ArcRotateCamera } from \"../../Cameras/arcRotateCamera\";\r\n\r\n/**\r\n * Data store to track virtual pointers movement\r\n */\r\ntype VirtualMeshInfo = {\r\n dragging: boolean;\r\n moving: boolean;\r\n dragMesh: AbstractMesh;\r\n originMesh: AbstractMesh;\r\n pivotMesh: AbstractMesh;\r\n startingPivotPosition: Vector3;\r\n startingPivotOrientation: Quaternion;\r\n startingPosition: Vector3;\r\n startingOrientation: Quaternion;\r\n lastOriginPosition: Vector3;\r\n lastDragPosition: Vector3;\r\n};\r\n\r\n/**\r\n * Base behavior for six degrees of freedom interactions in XR experiences.\r\n * Creates virtual meshes that are dragged around\r\n * And observables for position/rotation changes\r\n */\r\nexport class BaseSixDofDragBehavior implements Behavior {\r\n protected static _virtualScene: Scene;\r\n private _pointerObserver: Nullable>;\r\n private _attachedToElement: boolean = false;\r\n protected _virtualMeshesInfo: {\r\n [id: number]: VirtualMeshInfo;\r\n } = {};\r\n\r\n private _tmpVector: Vector3 = new Vector3();\r\n private _tmpQuaternion: Quaternion = new Quaternion();\r\n\r\n protected _dragType = {\r\n NONE: 0,\r\n DRAG: 1,\r\n DRAG_WITH_CONTROLLER: 2,\r\n NEAR_DRAG: 3,\r\n };\r\n\r\n protected _scene: Scene;\r\n protected _moving = false;\r\n protected _ownerNode: TransformNode;\r\n protected _dragging = this._dragType.NONE;\r\n\r\n /**\r\n * The list of child meshes that can receive drag events\r\n * If `null`, all child meshes will receive drag event\r\n */\r\n public draggableMeshes: Nullable = null;\r\n\r\n /**\r\n * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)\r\n */\r\n public zDragFactor = 3;\r\n /**\r\n * The id of the pointer that is currently interacting with the behavior (-1 when no pointer is active)\r\n */\r\n public get currentDraggingPointerId() {\r\n if (this.currentDraggingPointerIds[0] !== undefined) {\r\n return this.currentDraggingPointerIds[0];\r\n }\r\n return -1;\r\n }\r\n\r\n public set currentDraggingPointerId(value: number) {\r\n this.currentDraggingPointerIds[0] = value;\r\n }\r\n\r\n /**\r\n * In case of multipointer interaction, all pointer ids currently active are stored here\r\n */\r\n public currentDraggingPointerIds: number[] = [];\r\n\r\n /**\r\n * Get or set the currentDraggingPointerId\r\n * @deprecated Please use currentDraggingPointerId instead\r\n */\r\n public get currentDraggingPointerID(): number {\r\n return this.currentDraggingPointerId;\r\n }\r\n public set currentDraggingPointerID(currentDraggingPointerID: number) {\r\n this.currentDraggingPointerId = currentDraggingPointerID;\r\n }\r\n /**\r\n /**\r\n * If camera controls should be detached during the drag\r\n */\r\n public detachCameraControls = true;\r\n\r\n /**\r\n * Fires each time a drag starts\r\n */\r\n public onDragStartObservable = new Observable<{ position: Vector3 }>();\r\n /**\r\n * Fires each time a drag happens\r\n */\r\n public onDragObservable = new Observable<{ delta: Vector3; position: Vector3; pickInfo: PickingInfo }>();\r\n /**\r\n * Fires each time a drag ends (eg. mouse release after drag)\r\n */\r\n public onDragEndObservable = new Observable<{}>();\r\n\r\n /**\r\n * Should the behavior allow simultaneous pointers to interact with the owner node.\r\n */\r\n public allowMultiPointer: boolean = true;\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"BaseSixDofDrag\";\r\n }\r\n\r\n /**\r\n * Returns true if the attached mesh is currently moving with this behavior\r\n */\r\n public get isMoving(): boolean {\r\n return this._moving;\r\n }\r\n\r\n /**\r\n * Initializes the behavior\r\n */\r\n public init() {}\r\n\r\n /**\r\n * In the case of multiple active cameras, the cameraToUseForPointers should be used if set instead of active camera\r\n */\r\n private get _pointerCamera() {\r\n if (this._scene.cameraToUseForPointers) {\r\n return this._scene.cameraToUseForPointers;\r\n } else {\r\n return this._scene.activeCamera;\r\n }\r\n }\r\n\r\n private _createVirtualMeshInfo() {\r\n // Setup virtual meshes to be used for dragging without dirtying the existing scene\r\n\r\n const dragMesh = new AbstractMesh(\"\", BaseSixDofDragBehavior._virtualScene);\r\n dragMesh.rotationQuaternion = new Quaternion();\r\n const originMesh = new AbstractMesh(\"\", BaseSixDofDragBehavior._virtualScene);\r\n originMesh.rotationQuaternion = new Quaternion();\r\n const pivotMesh = new AbstractMesh(\"\", BaseSixDofDragBehavior._virtualScene);\r\n pivotMesh.rotationQuaternion = new Quaternion();\r\n\r\n return {\r\n dragging: false,\r\n moving: false,\r\n dragMesh,\r\n originMesh,\r\n pivotMesh,\r\n startingPivotPosition: new Vector3(),\r\n startingPivotOrientation: new Quaternion(),\r\n startingPosition: new Vector3(),\r\n startingOrientation: new Quaternion(),\r\n lastOriginPosition: new Vector3(),\r\n lastDragPosition: new Vector3(),\r\n };\r\n }\r\n\r\n protected _resetVirtualMeshesPosition() {\r\n for (let i = 0; i < this.currentDraggingPointerIds.length; i++) {\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.position.copyFrom(this._ownerNode.getAbsolutePivotPoint());\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.rotationQuaternion!.copyFrom(this._ownerNode.rotationQuaternion!);\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingPivotPosition.copyFrom(\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.position\r\n );\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingPivotOrientation.copyFrom(\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].pivotMesh.rotationQuaternion!\r\n );\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingPosition.copyFrom(this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].dragMesh.position);\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].startingOrientation.copyFrom(\r\n this._virtualMeshesInfo[this.currentDraggingPointerIds[i]].dragMesh.rotationQuaternion!\r\n );\r\n }\r\n }\r\n\r\n private _pointerUpdate2D(ray: Ray, pointerId: number, zDragFactor: number) {\r\n if (this._pointerCamera && this._pointerCamera.cameraRigMode == Camera.RIG_MODE_NONE && !this._pointerCamera._isLeftCamera && !this._pointerCamera._isRightCamera) {\r\n ray.origin.copyFrom(this._pointerCamera!.globalPosition);\r\n zDragFactor = 0;\r\n }\r\n\r\n const virtualMeshesInfo = this._virtualMeshesInfo[pointerId];\r\n\r\n // Calculate controller drag distance in controller space\r\n const originDragDifference = TmpVectors.Vector3[0];\r\n ray.origin.subtractToRef(virtualMeshesInfo.lastOriginPosition, originDragDifference);\r\n virtualMeshesInfo.lastOriginPosition.copyFrom(ray.origin);\r\n const localOriginDragDifference = -Vector3.Dot(originDragDifference, ray.direction);\r\n\r\n virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.dragMesh);\r\n virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.pivotMesh);\r\n\r\n this._applyZOffset(virtualMeshesInfo.dragMesh, localOriginDragDifference, zDragFactor);\r\n this._applyZOffset(virtualMeshesInfo.pivotMesh, localOriginDragDifference, zDragFactor);\r\n\r\n // Update the controller position\r\n virtualMeshesInfo.originMesh.position.copyFrom(ray.origin);\r\n const lookAt = TmpVectors.Vector3[0];\r\n ray.origin.addToRef(ray.direction, lookAt);\r\n virtualMeshesInfo.originMesh.lookAt(lookAt);\r\n\r\n virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.dragMesh);\r\n virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.pivotMesh);\r\n }\r\n\r\n private _pointerUpdateXR(controllerAimTransform: TransformNode, controllerGripTransform: Nullable, pointerId: number, zDragFactor: number) {\r\n const virtualMeshesInfo = this._virtualMeshesInfo[pointerId];\r\n virtualMeshesInfo.originMesh.position.copyFrom(controllerAimTransform.position);\r\n if (this._dragging === this._dragType.NEAR_DRAG && controllerGripTransform) {\r\n virtualMeshesInfo.originMesh.rotationQuaternion!.copyFrom(controllerGripTransform.rotationQuaternion!);\r\n } else {\r\n virtualMeshesInfo.originMesh.rotationQuaternion!.copyFrom(controllerAimTransform.rotationQuaternion!);\r\n }\r\n\r\n virtualMeshesInfo.pivotMesh.computeWorldMatrix(true);\r\n virtualMeshesInfo.dragMesh.computeWorldMatrix(true);\r\n\r\n // Z scaling logic\r\n if (zDragFactor !== 0) {\r\n // Camera.getForwardRay modifies TmpVectors.Vector[0-3], so cache it in advance\r\n const cameraForwardVec = TmpVectors.Vector3[0];\r\n const originDragDirection = TmpVectors.Vector3[1];\r\n cameraForwardVec.copyFrom(this._pointerCamera!.getForwardRay().direction);\r\n virtualMeshesInfo.originMesh.position.subtractToRef(virtualMeshesInfo.lastOriginPosition, originDragDirection);\r\n virtualMeshesInfo.lastOriginPosition.copyFrom(virtualMeshesInfo.originMesh.position);\r\n const controllerDragDistance = originDragDirection.length();\r\n originDragDirection.normalize();\r\n\r\n const cameraToDrag = TmpVectors.Vector3[2];\r\n const controllerToDrag = TmpVectors.Vector3[3];\r\n virtualMeshesInfo.dragMesh.absolutePosition.subtractToRef(this._pointerCamera!.globalPosition, cameraToDrag);\r\n virtualMeshesInfo.dragMesh.absolutePosition.subtractToRef(virtualMeshesInfo.originMesh.position, controllerToDrag);\r\n const controllerToDragDistance = controllerToDrag.length();\r\n cameraToDrag.normalize();\r\n controllerToDrag.normalize();\r\n\r\n const controllerDragScaling = Math.abs(Vector3.Dot(originDragDirection, controllerToDrag)) * Vector3.Dot(originDragDirection, cameraForwardVec);\r\n let zOffsetScaling = controllerDragScaling * zDragFactor * controllerDragDistance * controllerToDragDistance;\r\n\r\n // Prevent pulling the mesh through the controller\r\n const minDistanceFromControllerToDragMesh = 0.01;\r\n if (zOffsetScaling < 0 && minDistanceFromControllerToDragMesh - controllerToDragDistance > zOffsetScaling) {\r\n zOffsetScaling = Math.min(minDistanceFromControllerToDragMesh - controllerToDragDistance, 0);\r\n }\r\n controllerToDrag.scaleInPlace(zOffsetScaling);\r\n\r\n controllerToDrag.addToRef(virtualMeshesInfo.pivotMesh.absolutePosition, this._tmpVector);\r\n virtualMeshesInfo.pivotMesh.setAbsolutePosition(this._tmpVector);\r\n controllerToDrag.addToRef(virtualMeshesInfo.dragMesh.absolutePosition, this._tmpVector);\r\n virtualMeshesInfo.dragMesh.setAbsolutePosition(this._tmpVector);\r\n }\r\n }\r\n\r\n /**\r\n * Attaches the scale behavior the passed in mesh\r\n * @param ownerNode The mesh that will be scaled around once attached\r\n */\r\n public attach(ownerNode: TransformNode): void {\r\n this._ownerNode = ownerNode;\r\n this._scene = this._ownerNode.getScene();\r\n if (!BaseSixDofDragBehavior._virtualScene) {\r\n BaseSixDofDragBehavior._virtualScene = new Scene(this._scene.getEngine(), { virtual: true });\r\n BaseSixDofDragBehavior._virtualScene.detachControl();\r\n }\r\n\r\n const pickPredicate = (m: AbstractMesh) => {\r\n return this._ownerNode === m || (m.isDescendantOf(this._ownerNode) && (!this.draggableMeshes || this.draggableMeshes.indexOf(m) !== -1));\r\n };\r\n\r\n this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => {\r\n const pointerId = (pointerInfo.event).pointerId;\r\n if (!this._virtualMeshesInfo[pointerId]) {\r\n this._virtualMeshesInfo[pointerId] = this._createVirtualMeshInfo();\r\n }\r\n const virtualMeshesInfo = this._virtualMeshesInfo[pointerId];\r\n const isXRPointer = (pointerInfo.event).pointerType === \"xr-near\" || (pointerInfo.event).pointerType === \"xr\";\r\n\r\n if (pointerInfo.type == PointerEventTypes.POINTERDOWN) {\r\n if (\r\n !virtualMeshesInfo.dragging &&\r\n pointerInfo.pickInfo &&\r\n pointerInfo.pickInfo.hit &&\r\n pointerInfo.pickInfo.pickedMesh &&\r\n pointerInfo.pickInfo.pickedPoint &&\r\n pointerInfo.pickInfo.ray &&\r\n (!isXRPointer || pointerInfo.pickInfo.aimTransform) &&\r\n pickPredicate(pointerInfo.pickInfo.pickedMesh)\r\n ) {\r\n if ((!this.allowMultiPointer || isXRPointer) && this.currentDraggingPointerIds.length > 0) {\r\n return;\r\n }\r\n\r\n if (\r\n this._pointerCamera &&\r\n this._pointerCamera.cameraRigMode === Camera.RIG_MODE_NONE &&\r\n !this._pointerCamera._isLeftCamera &&\r\n !this._pointerCamera._isRightCamera\r\n ) {\r\n pointerInfo.pickInfo.ray.origin.copyFrom(this._pointerCamera!.globalPosition);\r\n }\r\n\r\n this._ownerNode.computeWorldMatrix(true);\r\n const virtualMeshesInfo = this._virtualMeshesInfo[pointerId];\r\n\r\n if (isXRPointer) {\r\n this._dragging = pointerInfo.pickInfo.originMesh ? this._dragType.NEAR_DRAG : this._dragType.DRAG_WITH_CONTROLLER;\r\n virtualMeshesInfo.originMesh.position.copyFrom(pointerInfo.pickInfo.aimTransform!.position);\r\n if (this._dragging === this._dragType.NEAR_DRAG && pointerInfo.pickInfo.gripTransform) {\r\n virtualMeshesInfo.originMesh.rotationQuaternion!.copyFrom(pointerInfo.pickInfo.gripTransform.rotationQuaternion!);\r\n } else {\r\n virtualMeshesInfo.originMesh.rotationQuaternion!.copyFrom(pointerInfo.pickInfo.aimTransform!.rotationQuaternion!);\r\n }\r\n } else {\r\n this._dragging = this._dragType.DRAG;\r\n virtualMeshesInfo.originMesh.position.copyFrom(pointerInfo.pickInfo.ray.origin);\r\n }\r\n\r\n virtualMeshesInfo.lastOriginPosition.copyFrom(virtualMeshesInfo.originMesh.position);\r\n\r\n virtualMeshesInfo.dragMesh.position.copyFrom(pointerInfo.pickInfo.pickedPoint);\r\n virtualMeshesInfo.lastDragPosition.copyFrom(pointerInfo.pickInfo.pickedPoint);\r\n\r\n virtualMeshesInfo.pivotMesh.position.copyFrom(this._ownerNode.getAbsolutePivotPoint());\r\n virtualMeshesInfo.pivotMesh.rotationQuaternion!.copyFrom(this._ownerNode.absoluteRotationQuaternion);\r\n\r\n virtualMeshesInfo.startingPosition.copyFrom(virtualMeshesInfo.dragMesh.position);\r\n virtualMeshesInfo.startingPivotPosition.copyFrom(virtualMeshesInfo.pivotMesh.position);\r\n virtualMeshesInfo.startingOrientation.copyFrom(virtualMeshesInfo.dragMesh.rotationQuaternion!);\r\n virtualMeshesInfo.startingPivotOrientation.copyFrom(virtualMeshesInfo.pivotMesh.rotationQuaternion!);\r\n\r\n if (isXRPointer) {\r\n virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.dragMesh);\r\n virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.pivotMesh);\r\n } else {\r\n virtualMeshesInfo.originMesh.lookAt(virtualMeshesInfo.dragMesh.position);\r\n }\r\n\r\n // Update state\r\n virtualMeshesInfo.dragging = true;\r\n\r\n if (this.currentDraggingPointerIds.indexOf(pointerId) === -1) {\r\n this.currentDraggingPointerIds.push(pointerId);\r\n }\r\n\r\n // Detach camera controls\r\n if (this.detachCameraControls && this._pointerCamera && !this._pointerCamera.leftCamera) {\r\n if (this._pointerCamera.inputs && this._pointerCamera.inputs.attachedToElement) {\r\n this._pointerCamera.detachControl();\r\n this._attachedToElement = true;\r\n } else if (!this.allowMultiPointer || this.currentDraggingPointerIds.length === 0) {\r\n this._attachedToElement = false;\r\n }\r\n }\r\n\r\n this._targetDragStart(virtualMeshesInfo.pivotMesh.position, virtualMeshesInfo.pivotMesh.rotationQuaternion!, pointerId);\r\n this.onDragStartObservable.notifyObservers({ position: virtualMeshesInfo.pivotMesh.position });\r\n }\r\n } else if (pointerInfo.type == PointerEventTypes.POINTERUP || pointerInfo.type == PointerEventTypes.POINTERDOUBLETAP) {\r\n const registeredPointerIndex = this.currentDraggingPointerIds.indexOf(pointerId);\r\n\r\n // Update state\r\n virtualMeshesInfo.dragging = false;\r\n\r\n if (registeredPointerIndex !== -1) {\r\n this.currentDraggingPointerIds.splice(registeredPointerIndex, 1);\r\n if (this.currentDraggingPointerIds.length === 0) {\r\n this._moving = false;\r\n this._dragging = this._dragType.NONE;\r\n\r\n // Reattach camera controls\r\n if (this.detachCameraControls && this._attachedToElement && this._pointerCamera && !this._pointerCamera.leftCamera) {\r\n this._reattachCameraControls();\r\n this._attachedToElement = false;\r\n }\r\n }\r\n\r\n virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.dragMesh);\r\n virtualMeshesInfo.originMesh.removeChild(virtualMeshesInfo.pivotMesh);\r\n this._targetDragEnd(pointerId);\r\n this.onDragEndObservable.notifyObservers({});\r\n }\r\n } else if (pointerInfo.type == PointerEventTypes.POINTERMOVE) {\r\n const registeredPointerIndex = this.currentDraggingPointerIds.indexOf(pointerId);\r\n\r\n if (registeredPointerIndex !== -1 && virtualMeshesInfo.dragging && pointerInfo.pickInfo && (pointerInfo.pickInfo.ray || pointerInfo.pickInfo.aimTransform)) {\r\n let zDragFactor = this.zDragFactor;\r\n\r\n // 2 pointer interaction should not have a z axis drag factor\r\n // as well as near interaction\r\n if (this.currentDraggingPointerIds.length > 1 || pointerInfo.pickInfo.originMesh) {\r\n zDragFactor = 0;\r\n }\r\n\r\n this._ownerNode.computeWorldMatrix(true);\r\n if (!isXRPointer) {\r\n this._pointerUpdate2D(pointerInfo.pickInfo.ray!, pointerId, zDragFactor);\r\n } else {\r\n this._pointerUpdateXR(pointerInfo.pickInfo.aimTransform!, pointerInfo.pickInfo.gripTransform, pointerId, zDragFactor);\r\n }\r\n\r\n // Get change in rotation\r\n this._tmpQuaternion.copyFrom(virtualMeshesInfo.startingPivotOrientation);\r\n this._tmpQuaternion.x = -this._tmpQuaternion.x;\r\n this._tmpQuaternion.y = -this._tmpQuaternion.y;\r\n this._tmpQuaternion.z = -this._tmpQuaternion.z;\r\n virtualMeshesInfo.pivotMesh.absoluteRotationQuaternion!.multiplyToRef(this._tmpQuaternion, this._tmpQuaternion);\r\n virtualMeshesInfo.pivotMesh.absolutePosition.subtractToRef(virtualMeshesInfo.startingPivotPosition, this._tmpVector);\r\n\r\n this.onDragObservable.notifyObservers({ delta: this._tmpVector, position: virtualMeshesInfo.pivotMesh.position, pickInfo: pointerInfo.pickInfo });\r\n\r\n // Notify herited methods and observables\r\n this._targetDrag(this._tmpVector, this._tmpQuaternion, pointerId);\r\n virtualMeshesInfo.lastDragPosition.copyFrom(virtualMeshesInfo.dragMesh.absolutePosition);\r\n\r\n this._moving = true;\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _applyZOffset(node: TransformNode, localOriginDragDifference: number, zDragFactor: number) {\r\n // Determine how much the controller moved to/away towards the dragged object and use this to move the object further when its further away\r\n node.position.z -= node.position.z < 1 ? localOriginDragDifference * zDragFactor : localOriginDragDifference * zDragFactor * node.position.z;\r\n if (node.position.z < 0) {\r\n node.position.z = 0;\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _targetDragStart(worldPosition: Vector3, worldRotation: Quaternion, pointerId: number) {\r\n // Herited classes can override that\r\n }\r\n\r\n protected _targetDrag(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion, pointerId: number) {\r\n // Herited classes can override that\r\n }\r\n\r\n protected _targetDragEnd(pointerId: number) {\r\n // Herited classes can override that\r\n }\r\n\r\n protected _reattachCameraControls() {\r\n if (this._pointerCamera) {\r\n // If the camera is an ArcRotateCamera, preserve the settings from the camera\r\n // when reattaching control\r\n if (this._pointerCamera.getClassName() === \"ArcRotateCamera\") {\r\n const arcRotateCamera = this._pointerCamera as ArcRotateCamera;\r\n arcRotateCamera.attachControl(\r\n arcRotateCamera.inputs ? arcRotateCamera.inputs.noPreventDefault : true,\r\n arcRotateCamera._useCtrlForPanning,\r\n arcRotateCamera._panningMouseButton\r\n );\r\n } else {\r\n // preserve the settings from the camera when reattaching control\r\n this._pointerCamera.attachControl(this._pointerCamera.inputs ? this._pointerCamera.inputs.noPreventDefault : true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n if (this._scene) {\r\n if (this.detachCameraControls && this._attachedToElement && this._pointerCamera && !this._pointerCamera.leftCamera) {\r\n this._reattachCameraControls();\r\n this._attachedToElement = false;\r\n }\r\n this._scene.onPointerObservable.remove(this._pointerObserver);\r\n }\r\n\r\n for (const pointerId in this._virtualMeshesInfo) {\r\n this._virtualMeshesInfo[pointerId].originMesh.dispose();\r\n this._virtualMeshesInfo[pointerId].dragMesh.dispose();\r\n }\r\n\r\n this.onDragEndObservable.clear();\r\n this.onDragObservable.clear();\r\n this.onDragStartObservable.clear();\r\n }\r\n}\r\n", "import type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Vector3, Quaternion, Matrix, TmpVectors } from \"../../Maths/math.vector\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { BaseSixDofDragBehavior } from \"./baseSixDofDragBehavior\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Space } from \"../../Maths/math.axis\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will allow the mesh to be dragged around based on directions and origin of the pointer's ray\r\n */\r\nexport class SixDofDragBehavior extends BaseSixDofDragBehavior {\r\n private _sceneRenderObserver: Nullable> = null;\r\n private _virtualTransformNode: TransformNode;\r\n\r\n protected _targetPosition = new Vector3(0, 0, 0);\r\n protected _targetOrientation = new Quaternion();\r\n protected _targetScaling = new Vector3(1, 1, 1);\r\n protected _startingPosition = new Vector3(0, 0, 0);\r\n protected _startingOrientation = new Quaternion();\r\n protected _startingScaling = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * Fires when position is updated\r\n */\r\n public onPositionChangedObservable = new Observable<{ position: Vector3 }>();\r\n\r\n /**\r\n * The distance towards the target drag position to move each frame. This can be useful to avoid jitter. Set this to 1 for no delay. (Default: 0.2)\r\n */\r\n public dragDeltaRatio = 0.2;\r\n\r\n /**\r\n * If the object should rotate to face the drag origin\r\n */\r\n public rotateDraggedObject = true;\r\n\r\n /**\r\n * If `rotateDraggedObject` is set to `true`, this parameter determines if we are only rotating around the y axis (yaw)\r\n */\r\n public rotateAroundYOnly = false;\r\n\r\n /**\r\n * Should the behavior rotate 1:1 with the motion controller, when one is used.\r\n */\r\n public rotateWithMotionController = true;\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"SixDofDrag\";\r\n }\r\n\r\n /**\r\n * Use this flag to update the target but not move the owner node towards the target\r\n */\r\n public disableMovement: boolean = false;\r\n\r\n /**\r\n * Should the object rotate towards the camera when we start dragging it\r\n */\r\n public faceCameraOnDragStart = false;\r\n\r\n /**\r\n * Attaches the six DoF drag behavior\r\n * In XR mode the mesh and its children will have their isNearGrabbable property set to true\r\n * @param ownerNode The mesh that will be dragged around once attached\r\n */\r\n public attach(ownerNode: Mesh): void {\r\n super.attach(ownerNode);\r\n\r\n ownerNode.isNearGrabbable = true;\r\n // if it has children, make sure they are grabbable too\r\n ownerNode.getChildMeshes().forEach((m) => {\r\n m.isNearGrabbable = true;\r\n });\r\n\r\n // Node that will save the owner's transform\r\n this._virtualTransformNode = new TransformNode(\"virtual_sixDof\", BaseSixDofDragBehavior._virtualScene);\r\n this._virtualTransformNode.rotationQuaternion = Quaternion.Identity();\r\n\r\n // On every frame move towards target scaling to avoid jitter caused by vr controllers\r\n this._sceneRenderObserver = ownerNode.getScene().onBeforeRenderObservable.add(() => {\r\n if (this.currentDraggingPointerIds.length === 1 && this._moving && !this.disableMovement) {\r\n // 1 pointer only drags mesh\r\n const deltaToAdd = TmpVectors.Vector3[0];\r\n deltaToAdd.copyFrom(this._targetPosition).subtractInPlace(ownerNode.absolutePosition).scaleInPlace(this.dragDeltaRatio);\r\n const deltaToAddTransformed = TmpVectors.Vector3[1];\r\n deltaToAddTransformed.copyFrom(deltaToAdd);\r\n // If the node has a parent, transform the delta to local space, so it can be added to the\r\n // position in local space\r\n if (ownerNode.parent) {\r\n const parentRotationMatrixInverse = TmpVectors.Matrix[0];\r\n (ownerNode.parent as TransformNode).absoluteRotationQuaternion.toRotationMatrix(parentRotationMatrixInverse);\r\n parentRotationMatrixInverse.invert();\r\n Vector3.TransformNormalToRef(deltaToAdd, parentRotationMatrixInverse, deltaToAddTransformed);\r\n }\r\n ownerNode.position.addInPlace(deltaToAddTransformed);\r\n\r\n this.onPositionChangedObservable.notifyObservers({ position: ownerNode.absolutePosition });\r\n\r\n // Only rotate the mesh if it's parent has uniform scaling\r\n if (!ownerNode.parent || ((ownerNode.parent as TransformNode).scaling && !(ownerNode.parent as TransformNode).scaling.isNonUniformWithinEpsilon(0.001))) {\r\n const rotationToApply = TmpVectors.Quaternion[0];\r\n rotationToApply.copyFrom(this._targetOrientation);\r\n if (ownerNode.parent) {\r\n const parentRotationInverse = TmpVectors.Quaternion[0];\r\n parentRotationInverse.copyFrom((ownerNode.parent as TransformNode).absoluteRotationQuaternion);\r\n parentRotationInverse.invertInPlace();\r\n parentRotationInverse.multiplyToRef(this._targetOrientation, rotationToApply);\r\n }\r\n Quaternion.SlerpToRef(ownerNode.rotationQuaternion!, rotationToApply, this.dragDeltaRatio, ownerNode.rotationQuaternion!);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _getPositionOffsetAround(transformationLocalOrigin: Vector3, scaling: number, rotation: Quaternion): Vector3 {\r\n const translationMatrix = TmpVectors.Matrix[0]; // T\r\n const translationMatrixInv = TmpVectors.Matrix[1]; // T'\r\n const rotationMatrix = TmpVectors.Matrix[2]; // R\r\n const scaleMatrix = TmpVectors.Matrix[3]; // S\r\n const finalMatrix = TmpVectors.Matrix[4]; // T' x R x S x T\r\n\r\n Matrix.TranslationToRef(transformationLocalOrigin.x, transformationLocalOrigin.y, transformationLocalOrigin.z, translationMatrix); // T\r\n Matrix.TranslationToRef(-transformationLocalOrigin.x, -transformationLocalOrigin.y, -transformationLocalOrigin.z, translationMatrixInv); // T'\r\n Matrix.FromQuaternionToRef(rotation, rotationMatrix); // R\r\n Matrix.ScalingToRef(scaling, scaling, scaling, scaleMatrix);\r\n translationMatrixInv.multiplyToRef(rotationMatrix, finalMatrix); // T' x R\r\n finalMatrix.multiplyToRef(scaleMatrix, finalMatrix); // T' x R x S\r\n finalMatrix.multiplyToRef(translationMatrix, finalMatrix); // T' x R x S x T\r\n\r\n return finalMatrix.getTranslation();\r\n }\r\n\r\n private _onePointerPositionUpdated(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion) {\r\n const pointerDelta = TmpVectors.Vector3[0];\r\n pointerDelta.setAll(0);\r\n\r\n if (this._dragging === this._dragType.DRAG) {\r\n if (this.rotateDraggedObject) {\r\n if (this.rotateAroundYOnly) {\r\n // Convert change in rotation to only y axis rotation\r\n Quaternion.RotationYawPitchRollToRef(worldDeltaRotation.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]);\r\n } else {\r\n TmpVectors.Quaternion[0].copyFrom(worldDeltaRotation);\r\n }\r\n TmpVectors.Quaternion[0].multiplyToRef(this._startingOrientation, this._targetOrientation);\r\n }\r\n } else if (this._dragging === this._dragType.NEAR_DRAG || (this._dragging === this._dragType.DRAG_WITH_CONTROLLER && this.rotateWithMotionController)) {\r\n worldDeltaRotation.multiplyToRef(this._startingOrientation, this._targetOrientation);\r\n }\r\n\r\n this._targetPosition.copyFrom(this._startingPosition).addInPlace(worldDeltaPosition);\r\n }\r\n\r\n private _twoPointersPositionUpdated() {\r\n const startingPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].startingPosition;\r\n const startingPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].startingPosition;\r\n const startingCenter = TmpVectors.Vector3[0];\r\n startingPosition0.addToRef(startingPosition1, startingCenter);\r\n startingCenter.scaleInPlace(0.5);\r\n const startingVector = TmpVectors.Vector3[1];\r\n startingPosition1.subtractToRef(startingPosition0, startingVector);\r\n\r\n const currentPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].dragMesh.absolutePosition;\r\n const currentPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].dragMesh.absolutePosition;\r\n const currentCenter = TmpVectors.Vector3[2];\r\n currentPosition0.addToRef(currentPosition1, currentCenter);\r\n currentCenter.scaleInPlace(0.5);\r\n const currentVector = TmpVectors.Vector3[3];\r\n currentPosition1.subtractToRef(currentPosition0, currentVector);\r\n\r\n const scaling = currentVector.length() / startingVector.length();\r\n const translation = currentCenter.subtract(startingCenter);\r\n const rotationQuaternion = Quaternion.FromEulerAngles(\r\n 0,\r\n Vector3.GetAngleBetweenVectorsOnPlane(startingVector.normalize(), currentVector.normalize(), Vector3.UpReadOnly),\r\n 0\r\n );\r\n\r\n const oldParent = this._ownerNode.parent;\r\n this._ownerNode.setParent(null);\r\n\r\n const positionOffset = this._getPositionOffsetAround(startingCenter.subtract(this._virtualTransformNode.getAbsolutePivotPoint()), scaling, rotationQuaternion);\r\n this._virtualTransformNode.rotationQuaternion!.multiplyToRef(rotationQuaternion, this._ownerNode.rotationQuaternion!);\r\n this._virtualTransformNode.scaling.scaleToRef(scaling, this._ownerNode.scaling);\r\n this._virtualTransformNode.position.addToRef(translation.addInPlace(positionOffset), this._ownerNode.position);\r\n this.onPositionChangedObservable.notifyObservers({ position: this._ownerNode.position });\r\n\r\n this._ownerNode.setParent(oldParent);\r\n }\r\n\r\n protected _targetDragStart() {\r\n const pointerCount = this.currentDraggingPointerIds.length;\r\n\r\n if (!this._ownerNode.rotationQuaternion) {\r\n this._ownerNode.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._ownerNode.rotation.y, this._ownerNode.rotation.x, this._ownerNode.rotation.z);\r\n }\r\n const worldPivot = this._ownerNode.getAbsolutePivotPoint();\r\n\r\n if (pointerCount === 1) {\r\n this._targetPosition.copyFrom(this._ownerNode.absolutePosition);\r\n this._targetOrientation.copyFrom(this._ownerNode.absoluteRotationQuaternion);\r\n this._targetScaling.copyFrom(this._ownerNode.absoluteScaling);\r\n\r\n if (this.faceCameraOnDragStart && this._scene.activeCamera) {\r\n const toCamera = TmpVectors.Vector3[0];\r\n this._scene.activeCamera.position.subtractToRef(worldPivot, toCamera);\r\n toCamera.normalize();\r\n const quat = TmpVectors.Quaternion[0];\r\n if (this._scene.useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toCamera, new Vector3(0, 1, 0), quat);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toCamera, new Vector3(0, 1, 0), quat);\r\n }\r\n quat.normalize();\r\n Quaternion.RotationYawPitchRollToRef(quat.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]);\r\n this._targetOrientation.copyFrom(TmpVectors.Quaternion[0]);\r\n }\r\n this._startingPosition.copyFrom(this._targetPosition);\r\n this._startingOrientation.copyFrom(this._targetOrientation);\r\n this._startingScaling.copyFrom(this._targetScaling);\r\n } else if (pointerCount === 2) {\r\n this._virtualTransformNode.setPivotPoint(new Vector3(0, 0, 0), Space.LOCAL);\r\n this._virtualTransformNode.position.copyFrom(this._ownerNode.absolutePosition);\r\n this._virtualTransformNode.scaling.copyFrom(this._ownerNode.absoluteScaling);\r\n this._virtualTransformNode.rotationQuaternion!.copyFrom(this._ownerNode.absoluteRotationQuaternion);\r\n this._virtualTransformNode.setPivotPoint(worldPivot, Space.WORLD);\r\n this._resetVirtualMeshesPosition();\r\n }\r\n }\r\n\r\n protected _targetDrag(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion) {\r\n if (this.currentDraggingPointerIds.length === 1) {\r\n this._onePointerPositionUpdated(worldDeltaPosition, worldDeltaRotation);\r\n } else if (this.currentDraggingPointerIds.length === 2) {\r\n this._twoPointersPositionUpdated();\r\n }\r\n }\r\n\r\n protected _targetDragEnd() {\r\n if (this.currentDraggingPointerIds.length === 1) {\r\n // We still have 1 active pointer, we must simulate a dragstart with a reseted position/orientation\r\n this._resetVirtualMeshesPosition();\r\n const previousFaceCameraFlag = this.faceCameraOnDragStart;\r\n this.faceCameraOnDragStart = false;\r\n this._targetDragStart();\r\n this.faceCameraOnDragStart = previousFaceCameraFlag;\r\n }\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n super.detach();\r\n\r\n if (this._ownerNode) {\r\n this._ownerNode.getScene().onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n }\r\n\r\n if (this._virtualTransformNode) {\r\n this._virtualTransformNode.dispose();\r\n }\r\n }\r\n}\r\n", "import type { PickingInfo } from \"../../Collisions/pickingInfo\";\r\nimport type { PointerInfo } from \"../../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../../Events/pointerEvents\";\r\nimport { Quaternion, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Behavior } from \"../behavior\";\r\n\r\n/**\r\n * A behavior that allows a transform node to stick to a surface position/orientation\r\n * @since 5.0.0\r\n */\r\nexport class SurfaceMagnetismBehavior implements Behavior {\r\n private _scene: Scene;\r\n private _attachedMesh: Nullable;\r\n private _attachPointLocalOffset: Vector3 = new Vector3();\r\n private _pointerObserver: Nullable>;\r\n private _workingPosition: Vector3 = new Vector3();\r\n private _workingQuaternion: Quaternion = new Quaternion();\r\n private _lastTick: number = -1;\r\n private _onBeforeRender: Nullable>;\r\n private _hit = false;\r\n\r\n /**\r\n * Distance offset from the hit point to place the target at, along the hit normal.\r\n */\r\n public hitNormalOffset: number = 0.05;\r\n\r\n /**\r\n * Name of the behavior\r\n */\r\n public get name(): string {\r\n return \"SurfaceMagnetism\";\r\n }\r\n\r\n /**\r\n * Spatial mapping meshes to collide with\r\n */\r\n public meshes: AbstractMesh[] = [];\r\n\r\n /**\r\n * Function called when the behavior needs to be initialized (after attaching it to a target)\r\n */\r\n public init(): void {}\r\n\r\n /**\r\n * Set to false if the node should strictly follow the camera without any interpolation time\r\n */\r\n public interpolatePose = true;\r\n\r\n /**\r\n * Rate of interpolation of position and rotation of the attached node.\r\n * Higher values will give a slower interpolation.\r\n */\r\n public lerpTime = 250;\r\n\r\n /**\r\n * If true, pitch and roll are omitted.\r\n */\r\n public keepOrientationVertical = true;\r\n\r\n /**\r\n * Is this behavior reacting to pointer events\r\n */\r\n public enabled = true;\r\n\r\n /**\r\n * Maximum distance for the node to stick to the surface\r\n */\r\n public maxStickingDistance = 0.8;\r\n\r\n /**\r\n * Attaches the behavior to a transform node\r\n * @param target defines the target where the behavior is attached to\r\n * @param scene the scene\r\n */\r\n public attach(target: Mesh, scene?: Scene): void {\r\n this._attachedMesh = target;\r\n this._scene = scene || target.getScene();\r\n if (!this._attachedMesh.rotationQuaternion) {\r\n this._attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._attachedMesh.rotation.y, this._attachedMesh.rotation.x, this._attachedMesh.rotation.z);\r\n }\r\n this.updateAttachPoint();\r\n\r\n this._workingPosition.copyFrom(this._attachedMesh.position);\r\n this._workingQuaternion.copyFrom(this._attachedMesh.rotationQuaternion);\r\n this._addObservables();\r\n }\r\n\r\n /**\r\n * Detaches the behavior\r\n */\r\n public detach(): void {\r\n this._attachedMesh = null;\r\n this._removeObservables();\r\n }\r\n\r\n private _getTargetPose(pickingInfo: PickingInfo): Nullable<{ position: Vector3; quaternion: Quaternion }> {\r\n if (!this._attachedMesh) {\r\n return null;\r\n }\r\n\r\n if (pickingInfo && pickingInfo.hit) {\r\n const pickedNormal = pickingInfo.getNormal(true, true);\r\n const pickedPoint = pickingInfo.pickedPoint;\r\n\r\n if (!pickedNormal || !pickedPoint) {\r\n return null;\r\n }\r\n pickedNormal.normalize();\r\n\r\n const worldTarget = TmpVectors.Vector3[0];\r\n worldTarget.copyFrom(pickedNormal);\r\n worldTarget.scaleInPlace(this.hitNormalOffset);\r\n worldTarget.addInPlace(pickedPoint);\r\n\r\n if (this._attachedMesh.parent) {\r\n TmpVectors.Matrix[0].copyFrom(this._attachedMesh.parent.getWorldMatrix()).invert();\r\n Vector3.TransformNormalToRef(worldTarget, TmpVectors.Matrix[0], worldTarget);\r\n }\r\n\r\n return {\r\n position: worldTarget,\r\n quaternion: Quaternion.RotationYawPitchRoll(\r\n -Math.atan2(pickedNormal.x, -pickedNormal.z),\r\n this.keepOrientationVertical ? 0 : Math.atan2(pickedNormal.y, Math.sqrt(pickedNormal.z * pickedNormal.z + pickedNormal.x * pickedNormal.x)),\r\n 0\r\n ),\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Updates the attach point with the current geometry extents of the attached mesh\r\n */\r\n public updateAttachPoint() {\r\n this._getAttachPointOffsetToRef(this._attachPointLocalOffset);\r\n }\r\n\r\n /**\r\n * Finds the intersection point of the given ray onto the meshes and updates the target.\r\n * Transformation will be interpolated according to `interpolatePose` and `lerpTime` properties.\r\n * If no mesh of `meshes` are hit, this does nothing.\r\n * @param pickInfo The input pickingInfo that will be used to intersect the meshes\r\n * @returns a boolean indicating if we found a hit to stick to\r\n */\r\n public findAndUpdateTarget(pickInfo: PickingInfo): boolean {\r\n this._hit = false;\r\n if (!pickInfo.ray) {\r\n return false;\r\n }\r\n\r\n const subPicking = pickInfo.ray.intersectsMeshes(this.meshes)[0];\r\n\r\n if (this._attachedMesh && subPicking && subPicking.hit && subPicking.pickedMesh) {\r\n const pose = this._getTargetPose(subPicking);\r\n if (pose && Vector3.Distance(this._attachedMesh.position, pose.position) < this.maxStickingDistance) {\r\n this._workingPosition.copyFrom(pose.position);\r\n this._workingQuaternion.copyFrom(pose.quaternion);\r\n this._hit = true;\r\n }\r\n }\r\n\r\n return this._hit;\r\n }\r\n\r\n private _getAttachPointOffsetToRef(ref: Vector3) {\r\n if (!this._attachedMesh) {\r\n ref.setAll(0);\r\n return;\r\n }\r\n\r\n const storedQuat = TmpVectors.Quaternion[0];\r\n storedQuat.copyFrom(this._attachedMesh.rotationQuaternion!);\r\n this._attachedMesh.rotationQuaternion!.copyFromFloats(0, 0, 0, 1);\r\n this._attachedMesh.computeWorldMatrix();\r\n const boundingMinMax = this._attachedMesh.getHierarchyBoundingVectors();\r\n const center = TmpVectors.Vector3[0];\r\n boundingMinMax.max.addToRef(boundingMinMax.min, center);\r\n center.scaleInPlace(0.5);\r\n center.z = boundingMinMax.max.z;\r\n // We max the z coordinate because we want the attach point to be on the back of the mesh\r\n const invWorld = TmpVectors.Matrix[0];\r\n this._attachedMesh.getWorldMatrix().invertToRef(invWorld);\r\n Vector3.TransformCoordinatesToRef(center, invWorld, ref);\r\n this._attachedMesh.rotationQuaternion!.copyFrom(storedQuat);\r\n }\r\n\r\n private _updateTransformToGoal(elapsed: number) {\r\n if (!this._attachedMesh || !this._hit) {\r\n return;\r\n }\r\n\r\n const oldParent = this._attachedMesh.parent;\r\n this._attachedMesh.setParent(null);\r\n\r\n const worldOffset = TmpVectors.Vector3[0];\r\n Vector3.TransformNormalToRef(this._attachPointLocalOffset, this._attachedMesh.getWorldMatrix(), worldOffset);\r\n\r\n if (!this.interpolatePose) {\r\n this._attachedMesh.position.copyFrom(this._workingPosition).subtractInPlace(worldOffset);\r\n this._attachedMesh.rotationQuaternion!.copyFrom(this._workingQuaternion);\r\n return;\r\n }\r\n\r\n // position\r\n const interpolatedPosition = new Vector3();\r\n Vector3.SmoothToRef(this._attachedMesh.position, this._workingPosition, elapsed, this.lerpTime, interpolatedPosition);\r\n this._attachedMesh.position.copyFrom(interpolatedPosition);\r\n\r\n // rotation\r\n const currentRotation = new Quaternion();\r\n currentRotation.copyFrom(this._attachedMesh.rotationQuaternion!);\r\n Quaternion.SmoothToRef(currentRotation, this._workingQuaternion, elapsed, this.lerpTime, this._attachedMesh.rotationQuaternion!);\r\n\r\n this._attachedMesh.setParent(oldParent);\r\n }\r\n\r\n private _addObservables() {\r\n this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => {\r\n if (this.enabled && pointerInfo.type == PointerEventTypes.POINTERMOVE && pointerInfo.pickInfo) {\r\n this.findAndUpdateTarget(pointerInfo.pickInfo);\r\n }\r\n });\r\n\r\n this._lastTick = Date.now();\r\n this._onBeforeRender = this._scene.onBeforeRenderObservable.add(() => {\r\n const tick = Date.now();\r\n this._updateTransformToGoal(tick - this._lastTick);\r\n this._lastTick = tick;\r\n });\r\n }\r\n\r\n private _removeObservables() {\r\n this._scene.onPointerObservable.remove(this._pointerObserver);\r\n this._scene.onBeforeRenderObservable.remove(this._onBeforeRender);\r\n this._pointerObserver = null;\r\n this._onBeforeRender = null;\r\n }\r\n}\r\n", "import { serialize, serializeAsColor3, expandToProperty } from \"../Misc/decorators\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Matrix } from \"../Maths/math.vector\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3, TmpColors } from \"../Maths/math.color\";\r\nimport { Node } from \"../node\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport type { IShadowGenerator } from \"./Shadows/shadowGenerator\";\r\nimport { GetClass } from \"../Misc/typeStore\";\r\nimport type { ISortableLight } from \"./lightConstants\";\r\nimport { LightConstants } from \"./lightConstants\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\n\r\n/**\r\n * Base class of all the lights in Babylon. It groups all the generic information about lights.\r\n * Lights are used, as you would expect, to affect how meshes are seen, in terms of both illumination and colour.\r\n * All meshes allow light to pass through them unless shadow generation is activated. The default number of lights allowed is four but this can be increased.\r\n */\r\nexport abstract class Light extends Node implements ISortableLight {\r\n /**\r\n * Falloff Default: light is falling off following the material specification:\r\n * standard material is using standard falloff whereas pbr material can request special falloff per materials.\r\n */\r\n public static readonly FALLOFF_DEFAULT = LightConstants.FALLOFF_DEFAULT;\r\n\r\n /**\r\n * Falloff Physical: light is falling off following the inverse squared distance law.\r\n */\r\n public static readonly FALLOFF_PHYSICAL = LightConstants.FALLOFF_PHYSICAL;\r\n\r\n /**\r\n * Falloff gltf: light is falling off as described in the gltf moving to PBR document\r\n * to enhance interoperability with other engines.\r\n */\r\n public static readonly FALLOFF_GLTF = LightConstants.FALLOFF_GLTF;\r\n\r\n /**\r\n * Falloff Standard: light is falling off like in the standard material\r\n * to enhance interoperability with other materials.\r\n */\r\n public static readonly FALLOFF_STANDARD = LightConstants.FALLOFF_STANDARD;\r\n\r\n //lightmapMode Consts\r\n /**\r\n * If every light affecting the material is in this lightmapMode,\r\n * material.lightmapTexture adds or multiplies\r\n * (depends on material.useLightmapAsShadowmap)\r\n * after every other light calculations.\r\n */\r\n public static readonly LIGHTMAP_DEFAULT = LightConstants.LIGHTMAP_DEFAULT;\r\n /**\r\n * material.lightmapTexture as only diffuse lighting from this light\r\n * adds only specular lighting from this light\r\n * adds dynamic shadows\r\n */\r\n public static readonly LIGHTMAP_SPECULAR = LightConstants.LIGHTMAP_SPECULAR;\r\n /**\r\n * material.lightmapTexture as only lighting\r\n * no light calculation from this light\r\n * only adds dynamic shadows from this light\r\n */\r\n public static readonly LIGHTMAP_SHADOWSONLY = LightConstants.LIGHTMAP_SHADOWSONLY;\r\n\r\n // Intensity Mode Consts\r\n /**\r\n * Each light type uses the default quantity according to its type:\r\n * point/spot lights use luminous intensity\r\n * directional lights use illuminance\r\n */\r\n public static readonly INTENSITYMODE_AUTOMATIC = LightConstants.INTENSITYMODE_AUTOMATIC;\r\n /**\r\n * lumen (lm)\r\n */\r\n public static readonly INTENSITYMODE_LUMINOUSPOWER = LightConstants.INTENSITYMODE_LUMINOUSPOWER;\r\n /**\r\n * candela (lm/sr)\r\n */\r\n public static readonly INTENSITYMODE_LUMINOUSINTENSITY = LightConstants.INTENSITYMODE_LUMINOUSINTENSITY;\r\n /**\r\n * lux (lm/m^2)\r\n */\r\n public static readonly INTENSITYMODE_ILLUMINANCE = LightConstants.INTENSITYMODE_ILLUMINANCE;\r\n /**\r\n * nit (cd/m^2)\r\n */\r\n public static readonly INTENSITYMODE_LUMINANCE = LightConstants.INTENSITYMODE_LUMINANCE;\r\n\r\n // Light types ids const.\r\n /**\r\n * Light type const id of the point light.\r\n */\r\n public static readonly LIGHTTYPEID_POINTLIGHT = LightConstants.LIGHTTYPEID_POINTLIGHT;\r\n /**\r\n * Light type const id of the directional light.\r\n */\r\n public static readonly LIGHTTYPEID_DIRECTIONALLIGHT = LightConstants.LIGHTTYPEID_DIRECTIONALLIGHT;\r\n /**\r\n * Light type const id of the spot light.\r\n */\r\n public static readonly LIGHTTYPEID_SPOTLIGHT = LightConstants.LIGHTTYPEID_SPOTLIGHT;\r\n /**\r\n * Light type const id of the hemispheric light.\r\n */\r\n public static readonly LIGHTTYPEID_HEMISPHERICLIGHT = LightConstants.LIGHTTYPEID_HEMISPHERICLIGHT;\r\n\r\n /**\r\n * Diffuse gives the basic color to an object.\r\n */\r\n @serializeAsColor3()\r\n public diffuse = new Color3(1.0, 1.0, 1.0);\r\n\r\n /**\r\n * Specular produces a highlight color on an object.\r\n * Note: This is not affecting PBR materials.\r\n */\r\n @serializeAsColor3()\r\n public specular = new Color3(1.0, 1.0, 1.0);\r\n\r\n /**\r\n * Defines the falloff type for this light. This lets overriding how punctual light are\r\n * falling off base on range or angle.\r\n * This can be set to any values in Light.FALLOFF_x.\r\n *\r\n * Note: This is only useful for PBR Materials at the moment. This could be extended if required to\r\n * other types of materials.\r\n */\r\n @serialize()\r\n public falloffType = Light.FALLOFF_DEFAULT;\r\n\r\n /**\r\n * Strength of the light.\r\n * Note: By default it is define in the framework own unit.\r\n * Note: In PBR materials the intensityMode can be use to chose what unit the intensity is defined in.\r\n */\r\n @serialize()\r\n public intensity = 1.0;\r\n\r\n private _range = Number.MAX_VALUE;\r\n protected _inverseSquaredRange = 0;\r\n\r\n /**\r\n * Defines how far from the source the light is impacting in scene units.\r\n * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff.\r\n */\r\n @serialize()\r\n public get range(): number {\r\n return this._range;\r\n }\r\n /**\r\n * Defines how far from the source the light is impacting in scene units.\r\n * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff.\r\n */\r\n public set range(value: number) {\r\n this._range = value;\r\n this._inverseSquaredRange = 1.0 / (this.range * this.range);\r\n }\r\n\r\n /**\r\n * Cached photometric scale default to 1.0 as the automatic intensity mode defaults to 1.0 for every type\r\n * of light.\r\n */\r\n private _photometricScale = 1.0;\r\n\r\n private _intensityMode: number = Light.INTENSITYMODE_AUTOMATIC;\r\n /**\r\n * Gets the photometric scale used to interpret the intensity.\r\n * This is only relevant with PBR Materials where the light intensity can be defined in a physical way.\r\n */\r\n @serialize()\r\n public get intensityMode(): number {\r\n return this._intensityMode;\r\n }\r\n /**\r\n * Sets the photometric scale used to interpret the intensity.\r\n * This is only relevant with PBR Materials where the light intensity can be defined in a physical way.\r\n */\r\n public set intensityMode(value: number) {\r\n this._intensityMode = value;\r\n this._computePhotometricScale();\r\n }\r\n\r\n private _radius = 0.00001;\r\n /**\r\n * Gets the light radius used by PBR Materials to simulate soft area lights.\r\n */\r\n @serialize()\r\n public get radius(): number {\r\n return this._radius;\r\n }\r\n /**\r\n * sets the light radius used by PBR Materials to simulate soft area lights.\r\n */\r\n public set radius(value: number) {\r\n this._radius = value;\r\n this._computePhotometricScale();\r\n }\r\n\r\n @serialize()\r\n private _renderPriority: number;\r\n /**\r\n * Defines the rendering priority of the lights. It can help in case of fallback or number of lights\r\n * exceeding the number allowed of the materials.\r\n */\r\n @expandToProperty(\"_reorderLightsInScene\")\r\n public renderPriority: number = 0;\r\n\r\n @serialize(\"shadowEnabled\")\r\n private _shadowEnabled: boolean = true;\r\n /**\r\n * Gets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching\r\n * the current shadow generator.\r\n */\r\n public get shadowEnabled(): boolean {\r\n return this._shadowEnabled;\r\n }\r\n /**\r\n * Sets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching\r\n * the current shadow generator.\r\n */\r\n public set shadowEnabled(value: boolean) {\r\n if (this._shadowEnabled === value) {\r\n return;\r\n }\r\n\r\n this._shadowEnabled = value;\r\n this._markMeshesAsLightDirty();\r\n }\r\n\r\n private _includedOnlyMeshes: AbstractMesh[];\r\n /**\r\n * Gets the only meshes impacted by this light.\r\n */\r\n public get includedOnlyMeshes(): AbstractMesh[] {\r\n return this._includedOnlyMeshes;\r\n }\r\n /**\r\n * Sets the only meshes impacted by this light.\r\n */\r\n public set includedOnlyMeshes(value: AbstractMesh[]) {\r\n this._includedOnlyMeshes = value;\r\n this._hookArrayForIncludedOnly(value);\r\n }\r\n\r\n private _excludedMeshes: AbstractMesh[];\r\n /**\r\n * Gets the meshes not impacted by this light.\r\n */\r\n public get excludedMeshes(): AbstractMesh[] {\r\n return this._excludedMeshes;\r\n }\r\n /**\r\n * Sets the meshes not impacted by this light.\r\n */\r\n public set excludedMeshes(value: AbstractMesh[]) {\r\n this._excludedMeshes = value;\r\n this._hookArrayForExcluded(value);\r\n }\r\n\r\n @serialize(\"excludeWithLayerMask\")\r\n private _excludeWithLayerMask = 0;\r\n /**\r\n * Gets the layer id use to find what meshes are not impacted by the light.\r\n * Inactive if 0\r\n */\r\n public get excludeWithLayerMask(): number {\r\n return this._excludeWithLayerMask;\r\n }\r\n /**\r\n * Sets the layer id use to find what meshes are not impacted by the light.\r\n * Inactive if 0\r\n */\r\n public set excludeWithLayerMask(value: number) {\r\n this._excludeWithLayerMask = value;\r\n this._resyncMeshes();\r\n }\r\n\r\n @serialize(\"includeOnlyWithLayerMask\")\r\n private _includeOnlyWithLayerMask = 0;\r\n /**\r\n * Gets the layer id use to find what meshes are impacted by the light.\r\n * Inactive if 0\r\n */\r\n public get includeOnlyWithLayerMask(): number {\r\n return this._includeOnlyWithLayerMask;\r\n }\r\n /**\r\n * Sets the layer id use to find what meshes are impacted by the light.\r\n * Inactive if 0\r\n */\r\n public set includeOnlyWithLayerMask(value: number) {\r\n this._includeOnlyWithLayerMask = value;\r\n this._resyncMeshes();\r\n }\r\n\r\n @serialize(\"lightmapMode\")\r\n private _lightmapMode = 0;\r\n /**\r\n * Gets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x)\r\n */\r\n public get lightmapMode(): number {\r\n return this._lightmapMode;\r\n }\r\n /**\r\n * Sets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x)\r\n */\r\n public set lightmapMode(value: number) {\r\n if (this._lightmapMode === value) {\r\n return;\r\n }\r\n\r\n this._lightmapMode = value;\r\n this._markMeshesAsLightDirty();\r\n }\r\n\r\n /**\r\n * Returns the view matrix.\r\n * @param _faceIndex The index of the face for which we want to extract the view matrix. Only used for point light types.\r\n * @returns The view matrix. Can be null, if a view matrix cannot be defined for the type of light considered (as for a hemispherical light, for example).\r\n */\r\n public getViewMatrix(_faceIndex?: number): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the projection matrix.\r\n * Note that viewMatrix and renderList are optional and are only used by lights that calculate the projection matrix from a list of meshes (e.g. directional lights with automatic extents calculation).\r\n * @param _viewMatrix The view transform matrix of the light (optional).\r\n * @param _renderList The list of meshes to take into account when calculating the projection matrix (optional).\r\n * @returns The projection matrix. Can be null, if a projection matrix cannot be defined for the type of light considered (as for a hemispherical light, for example).\r\n */\r\n public getProjectionMatrix(_viewMatrix?: Matrix, _renderList?: Array): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Shadow generators associated to the light.\r\n * @internal Internal use only.\r\n */\r\n public _shadowGenerators: Nullable, IShadowGenerator>> = null;\r\n\r\n /**\r\n * @internal Internal use only.\r\n */\r\n public _excludedMeshesIds = new Array();\r\n\r\n /**\r\n * @internal Internal use only.\r\n */\r\n public _includedOnlyMeshesIds = new Array();\r\n\r\n /**\r\n * The current light uniform buffer.\r\n * @internal Internal use only.\r\n */\r\n public _uniformBuffer: UniformBuffer;\r\n\r\n /** @internal */\r\n public _renderId: number;\r\n\r\n private _lastUseSpecular: boolean;\r\n\r\n /**\r\n * Creates a Light object in the scene.\r\n * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction\r\n * @param name The friendly name of the light\r\n * @param scene The scene the light belongs too\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n this.getScene().addLight(this);\r\n this._uniformBuffer = new UniformBuffer(this.getScene().getEngine(), undefined, undefined, name);\r\n this._buildUniformLayout();\r\n\r\n this.includedOnlyMeshes = [] as AbstractMesh[];\r\n this.excludedMeshes = [] as AbstractMesh[];\r\n\r\n this._resyncMeshes();\r\n }\r\n\r\n protected abstract _buildUniformLayout(): void;\r\n\r\n /**\r\n * Sets the passed Effect \"effect\" with the Light information.\r\n * @param effect The effect to update\r\n * @param lightIndex The index of the light in the effect to update\r\n * @returns The light\r\n */\r\n public abstract transferToEffect(effect: Effect, lightIndex: string): Light;\r\n\r\n /**\r\n * Sets the passed Effect \"effect\" with the Light textures.\r\n * @param effect The effect to update\r\n * @param lightIndex The index of the light in the effect to update\r\n * @returns The light\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public transferTexturesToEffect(effect: Effect, lightIndex: string): Light {\r\n // Do nothing by default.\r\n return this;\r\n }\r\n\r\n /**\r\n * Binds the lights information from the scene to the effect for the given mesh.\r\n * @param lightIndex Light index\r\n * @param scene The scene where the light belongs to\r\n * @param effect The effect we are binding the data to\r\n * @param useSpecular Defines if specular is supported\r\n * @param receiveShadows Defines if the effect (mesh) we bind the light for receives shadows\r\n */\r\n public _bindLight(lightIndex: number, scene: Scene, effect: Effect, useSpecular: boolean, receiveShadows = true): void {\r\n const iAsString = lightIndex.toString();\r\n let needUpdate = false;\r\n\r\n this._uniformBuffer.bindToEffect(effect, \"Light\" + iAsString);\r\n\r\n if (this._renderId !== scene.getRenderId() || this._lastUseSpecular !== useSpecular || !this._uniformBuffer.useUbo) {\r\n this._renderId = scene.getRenderId();\r\n this._lastUseSpecular = useSpecular;\r\n\r\n const scaledIntensity = this.getScaledIntensity();\r\n\r\n this.transferToEffect(effect, iAsString);\r\n\r\n this.diffuse.scaleToRef(scaledIntensity, TmpColors.Color3[0]);\r\n this._uniformBuffer.updateColor4(\"vLightDiffuse\", TmpColors.Color3[0], this.range, iAsString);\r\n if (useSpecular) {\r\n this.specular.scaleToRef(scaledIntensity, TmpColors.Color3[1]);\r\n this._uniformBuffer.updateColor4(\"vLightSpecular\", TmpColors.Color3[1], this.radius, iAsString);\r\n }\r\n needUpdate = true;\r\n }\r\n\r\n // Textures might still need to be rebound.\r\n this.transferTexturesToEffect(effect, iAsString);\r\n\r\n // Shadows\r\n if (scene.shadowsEnabled && this.shadowEnabled && receiveShadows) {\r\n const shadowGenerator = this.getShadowGenerator(scene.activeCamera) ?? this.getShadowGenerator();\r\n if (shadowGenerator) {\r\n shadowGenerator.bindShadowLight(iAsString, effect);\r\n needUpdate = true;\r\n }\r\n }\r\n\r\n if (needUpdate) {\r\n this._uniformBuffer.update();\r\n } else {\r\n this._uniformBuffer.bindUniformBuffer();\r\n }\r\n }\r\n\r\n /**\r\n * Sets the passed Effect \"effect\" with the Light information.\r\n * @param effect The effect to update\r\n * @param lightDataUniformName The uniform used to store light data (position or direction)\r\n * @returns The light\r\n */\r\n public abstract transferToNodeMaterialEffect(effect: Effect, lightDataUniformName: string): Light;\r\n\r\n /**\r\n * Returns the string \"Light\".\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"Light\";\r\n }\r\n\r\n /** @internal */\r\n public readonly _isLight = true;\r\n\r\n /**\r\n * Converts the light information to a readable string for debug purpose.\r\n * @param fullDetails Supports for multiple levels of logging within scene loading\r\n * @returns the human readable light info\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name;\r\n ret += \", type: \" + [\"Point\", \"Directional\", \"Spot\", \"Hemispheric\"][this.getTypeID()];\r\n if (this.animations) {\r\n for (let i = 0; i < this.animations.length; i++) {\r\n ret += \", animation[0]: \" + this.animations[i].toString(fullDetails);\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /** @internal */\r\n protected _syncParentEnabledState() {\r\n super._syncParentEnabledState();\r\n if (!this.isDisposed()) {\r\n this._resyncMeshes();\r\n }\r\n }\r\n\r\n /**\r\n * Set the enabled state of this node.\r\n * @param value - the new enabled state\r\n */\r\n public setEnabled(value: boolean): void {\r\n super.setEnabled(value);\r\n\r\n this._resyncMeshes();\r\n }\r\n\r\n /**\r\n * Returns the Light associated shadow generator if any.\r\n * @param camera Camera for which the shadow generator should be retrieved (default: null). If null, retrieves the default shadow generator\r\n * @returns the associated shadow generator.\r\n */\r\n public getShadowGenerator(camera: Nullable = null): Nullable {\r\n if (this._shadowGenerators === null) {\r\n return null;\r\n }\r\n\r\n return this._shadowGenerators.get(camera) ?? null;\r\n }\r\n\r\n /**\r\n * Returns all the shadow generators associated to this light\r\n * @returns\r\n */\r\n public getShadowGenerators(): Nullable, IShadowGenerator>> {\r\n return this._shadowGenerators;\r\n }\r\n\r\n /**\r\n * Returns a Vector3, the absolute light position in the World.\r\n * @returns the world space position of the light\r\n */\r\n public getAbsolutePosition(): Vector3 {\r\n return Vector3.Zero();\r\n }\r\n\r\n /**\r\n * Specifies if the light will affect the passed mesh.\r\n * @param mesh The mesh to test against the light\r\n * @returns true the mesh is affected otherwise, false.\r\n */\r\n public canAffectMesh(mesh: AbstractMesh): boolean {\r\n if (!mesh) {\r\n return true;\r\n }\r\n\r\n if (this.includedOnlyMeshes && this.includedOnlyMeshes.length > 0 && this.includedOnlyMeshes.indexOf(mesh) === -1) {\r\n return false;\r\n }\r\n\r\n if (this.excludedMeshes && this.excludedMeshes.length > 0 && this.excludedMeshes.indexOf(mesh) !== -1) {\r\n return false;\r\n }\r\n\r\n if (this.includeOnlyWithLayerMask !== 0 && (this.includeOnlyWithLayerMask & mesh.layerMask) === 0) {\r\n return false;\r\n }\r\n\r\n if (this.excludeWithLayerMask !== 0 && this.excludeWithLayerMask & mesh.layerMask) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Releases resources associated with this node.\r\n * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)\r\n * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)\r\n */\r\n public dispose(doNotRecurse?: boolean, disposeMaterialAndTextures = false): void {\r\n if (this._shadowGenerators) {\r\n const iterator = this._shadowGenerators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const shadowGenerator = key.value;\r\n shadowGenerator.dispose();\r\n }\r\n this._shadowGenerators = null;\r\n }\r\n\r\n // Animations\r\n this.getScene().stopAnimation(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.lights.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.lights.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n // Remove from meshes\r\n for (const mesh of this.getScene().meshes) {\r\n mesh._removeLightSource(this, true);\r\n }\r\n\r\n this._uniformBuffer.dispose();\r\n\r\n // Remove from scene\r\n this.getScene().removeLight(this);\r\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\r\n }\r\n\r\n /**\r\n * Returns the light type ID (integer).\r\n * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x\r\n */\r\n public getTypeID(): number {\r\n return 0;\r\n }\r\n\r\n /**\r\n * Returns the intensity scaled by the Photometric Scale according to the light type and intensity mode.\r\n * @returns the scaled intensity in intensity mode unit\r\n */\r\n public getScaledIntensity() {\r\n return this._photometricScale * this.intensity;\r\n }\r\n\r\n /**\r\n * Returns a new Light object, named \"name\", from the current one.\r\n * @param name The name of the cloned light\r\n * @param newParent The parent of this light, if it has one\r\n * @returns the new created light\r\n */\r\n public clone(name: string, newParent: Nullable = null): Nullable {\r\n const constructor = Light.GetConstructorFromName(this.getTypeID(), name, this.getScene());\r\n\r\n if (!constructor) {\r\n return null;\r\n }\r\n const clonedLight = SerializationHelper.Clone(constructor, this);\r\n if (name) {\r\n clonedLight.name = name;\r\n }\r\n if (newParent) {\r\n clonedLight.parent = newParent;\r\n }\r\n clonedLight.setEnabled(this.isEnabled());\r\n\r\n this.onClonedObservable.notifyObservers(clonedLight);\r\n\r\n return clonedLight;\r\n }\r\n\r\n /**\r\n * Serializes the current light into a Serialization object.\r\n * @returns the serialized object.\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.uniqueId = this.uniqueId;\r\n\r\n // Type\r\n serializationObject.type = this.getTypeID();\r\n\r\n // Parent\r\n if (this.parent) {\r\n this.parent._serializeAsParent(serializationObject);\r\n }\r\n\r\n // Inclusion / exclusions\r\n if (this.excludedMeshes.length > 0) {\r\n serializationObject.excludedMeshesIds = [];\r\n this.excludedMeshes.forEach((mesh: AbstractMesh) => {\r\n serializationObject.excludedMeshesIds.push(mesh.id);\r\n });\r\n }\r\n\r\n if (this.includedOnlyMeshes.length > 0) {\r\n serializationObject.includedOnlyMeshesIds = [];\r\n this.includedOnlyMeshes.forEach((mesh: AbstractMesh) => {\r\n serializationObject.includedOnlyMeshesIds.push(mesh.id);\r\n });\r\n }\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n serializationObject.ranges = this.serializeAnimationRanges();\r\n\r\n serializationObject.isEnabled = this.isEnabled();\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Creates a new typed light from the passed type (integer) : point light = 0, directional light = 1, spot light = 2, hemispheric light = 3.\r\n * This new light is named \"name\" and added to the passed scene.\r\n * @param type Type according to the types available in Light.LIGHTTYPEID_x\r\n * @param name The friendly name of the light\r\n * @param scene The scene the new light will belong to\r\n * @returns the constructor function\r\n */\r\n static GetConstructorFromName(type: number, name: string, scene: Scene): Nullable<() => Light> {\r\n const constructorFunc = Node.Construct(\"Light_Type_\" + type, name, scene);\r\n\r\n if (constructorFunc) {\r\n return <() => Light>constructorFunc;\r\n }\r\n\r\n // Default to no light for none present once.\r\n return null;\r\n }\r\n\r\n /**\r\n * Parses the passed \"parsedLight\" and returns a new instanced Light from this parsing.\r\n * @param parsedLight The JSON representation of the light\r\n * @param scene The scene to create the parsed light in\r\n * @returns the created light after parsing\r\n */\r\n public static Parse(parsedLight: any, scene: Scene): Nullable {\r\n const constructor = Light.GetConstructorFromName(parsedLight.type, parsedLight.name, scene);\r\n\r\n if (!constructor) {\r\n return null;\r\n }\r\n\r\n const light = SerializationHelper.Parse(constructor, parsedLight, scene);\r\n\r\n // Inclusion / exclusions\r\n if (parsedLight.excludedMeshesIds) {\r\n light._excludedMeshesIds = parsedLight.excludedMeshesIds;\r\n }\r\n\r\n if (parsedLight.includedOnlyMeshesIds) {\r\n light._includedOnlyMeshesIds = parsedLight.includedOnlyMeshesIds;\r\n }\r\n\r\n // Parent\r\n if (parsedLight.parentId !== undefined) {\r\n light._waitingParentId = parsedLight.parentId;\r\n }\r\n\r\n if (parsedLight.parentInstanceIndex !== undefined) {\r\n light._waitingParentInstanceIndex = parsedLight.parentInstanceIndex;\r\n }\r\n\r\n // Falloff\r\n if (parsedLight.falloffType !== undefined) {\r\n light.falloffType = parsedLight.falloffType;\r\n }\r\n\r\n // Lightmaps\r\n if (parsedLight.lightmapMode !== undefined) {\r\n light.lightmapMode = parsedLight.lightmapMode;\r\n }\r\n\r\n // Animations\r\n if (parsedLight.animations) {\r\n for (let animationIndex = 0; animationIndex < parsedLight.animations.length; animationIndex++) {\r\n const parsedAnimation = parsedLight.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n light.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n Node.ParseAnimationRanges(light, parsedLight, scene);\r\n }\r\n\r\n if (parsedLight.autoAnimate) {\r\n scene.beginAnimation(light, parsedLight.autoAnimateFrom, parsedLight.autoAnimateTo, parsedLight.autoAnimateLoop, parsedLight.autoAnimateSpeed || 1.0);\r\n }\r\n\r\n // Check if isEnabled is defined to be back compatible with prior serialized versions.\r\n if (parsedLight.isEnabled !== undefined) {\r\n light.setEnabled(parsedLight.isEnabled);\r\n }\r\n\r\n return light;\r\n }\r\n\r\n private _hookArrayForExcluded(array: AbstractMesh[]): void {\r\n const oldPush = array.push;\r\n array.push = (...items: AbstractMesh[]) => {\r\n const result = oldPush.apply(array, items);\r\n\r\n for (const item of items) {\r\n item._resyncLightSource(this);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const oldSplice = array.splice;\r\n array.splice = (index: number, deleteCount?: number) => {\r\n const deleted = oldSplice.apply(array, [index, deleteCount]);\r\n\r\n for (const item of deleted) {\r\n item._resyncLightSource(this);\r\n }\r\n\r\n return deleted;\r\n };\r\n\r\n for (const item of array) {\r\n item._resyncLightSource(this);\r\n }\r\n }\r\n\r\n private _hookArrayForIncludedOnly(array: AbstractMesh[]): void {\r\n const oldPush = array.push;\r\n array.push = (...items: AbstractMesh[]) => {\r\n const result = oldPush.apply(array, items);\r\n\r\n this._resyncMeshes();\r\n\r\n return result;\r\n };\r\n\r\n const oldSplice = array.splice;\r\n array.splice = (index: number, deleteCount?: number) => {\r\n const deleted = oldSplice.apply(array, [index, deleteCount]);\r\n\r\n this._resyncMeshes();\r\n\r\n return deleted;\r\n };\r\n\r\n this._resyncMeshes();\r\n }\r\n\r\n private _resyncMeshes() {\r\n for (const mesh of this.getScene().meshes) {\r\n mesh._resyncLightSource(this);\r\n }\r\n }\r\n\r\n /**\r\n * Forces the meshes to update their light related information in their rendering used effects\r\n * @internal Internal Use Only\r\n */\r\n public _markMeshesAsLightDirty() {\r\n for (const mesh of this.getScene().meshes) {\r\n if (mesh.lightSources.indexOf(this) !== -1) {\r\n mesh._markSubMeshesAsLightDirty();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Recomputes the cached photometric scale if needed.\r\n */\r\n private _computePhotometricScale(): void {\r\n this._photometricScale = this._getPhotometricScale();\r\n this.getScene().resetCachedMaterial();\r\n }\r\n\r\n /**\r\n * @returns the Photometric Scale according to the light type and intensity mode.\r\n */\r\n private _getPhotometricScale() {\r\n let photometricScale = 0.0;\r\n const lightTypeID = this.getTypeID();\r\n\r\n //get photometric mode\r\n let photometricMode = this.intensityMode;\r\n if (photometricMode === Light.INTENSITYMODE_AUTOMATIC) {\r\n if (lightTypeID === Light.LIGHTTYPEID_DIRECTIONALLIGHT) {\r\n photometricMode = Light.INTENSITYMODE_ILLUMINANCE;\r\n } else {\r\n photometricMode = Light.INTENSITYMODE_LUMINOUSINTENSITY;\r\n }\r\n }\r\n\r\n //compute photometric scale\r\n switch (lightTypeID) {\r\n case Light.LIGHTTYPEID_POINTLIGHT:\r\n case Light.LIGHTTYPEID_SPOTLIGHT:\r\n switch (photometricMode) {\r\n case Light.INTENSITYMODE_LUMINOUSPOWER:\r\n photometricScale = 1.0 / (4.0 * Math.PI);\r\n break;\r\n case Light.INTENSITYMODE_LUMINOUSINTENSITY:\r\n photometricScale = 1.0;\r\n break;\r\n case Light.INTENSITYMODE_LUMINANCE:\r\n photometricScale = this.radius * this.radius;\r\n break;\r\n }\r\n break;\r\n\r\n case Light.LIGHTTYPEID_DIRECTIONALLIGHT:\r\n switch (photometricMode) {\r\n case Light.INTENSITYMODE_ILLUMINANCE:\r\n photometricScale = 1.0;\r\n break;\r\n case Light.INTENSITYMODE_LUMINANCE: {\r\n // When radius (and therefore solid angle) is non-zero a directional lights brightness can be specified via central (peak) luminance.\r\n // For a directional light the 'radius' defines the angular radius (in radians) rather than world-space radius (e.g. in metres).\r\n let apexAngleRadians = this.radius;\r\n // Impose a minimum light angular size to avoid the light becoming an infinitely small angular light source (i.e. a dirac delta function).\r\n apexAngleRadians = Math.max(apexAngleRadians, 0.001);\r\n const solidAngle = 2.0 * Math.PI * (1.0 - Math.cos(apexAngleRadians));\r\n photometricScale = solidAngle;\r\n break;\r\n }\r\n }\r\n break;\r\n\r\n case Light.LIGHTTYPEID_HEMISPHERICLIGHT:\r\n // No fall off in hemispheric light.\r\n photometricScale = 1.0;\r\n break;\r\n }\r\n return photometricScale;\r\n }\r\n\r\n /**\r\n * Reorder the light in the scene according to their defined priority.\r\n * @internal Internal Use Only\r\n */\r\n public _reorderLightsInScene(): void {\r\n const scene = this.getScene();\r\n if (this._renderPriority != 0) {\r\n scene.requireLightSorting = true;\r\n }\r\n this.getScene().sortLightsByPriority();\r\n }\r\n\r\n /**\r\n * Prepares the list of defines specific to the light type.\r\n * @param defines the list of defines\r\n * @param lightIndex defines the index of the light for the effect\r\n */\r\n public abstract prepareLightSpecificDefines(defines: any, lightIndex: number): void;\r\n}\r\n", "import { serializeAsColor3, serializeAsVector3 } from \"../Misc/decorators\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { Node } from \"../node\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Light } from \"./light\";\r\nimport type { IShadowGenerator } from \"./Shadows/shadowGenerator\";\r\n\r\nNode.AddNodeConstructor(\"Light_Type_3\", (name, scene) => {\r\n return () => new HemisphericLight(name, Vector3.Zero(), scene);\r\n});\r\n\r\n/**\r\n * The HemisphericLight simulates the ambient environment light,\r\n * so the passed direction is the light reflection direction, not the incoming direction.\r\n */\r\nexport class HemisphericLight extends Light {\r\n /**\r\n * The groundColor is the light in the opposite direction to the one specified during creation.\r\n * You can think of the diffuse and specular light as coming from the centre of the object in the given direction and the groundColor light in the opposite direction.\r\n */\r\n @serializeAsColor3()\r\n public groundColor = new Color3(0.0, 0.0, 0.0);\r\n\r\n /**\r\n * The light reflection direction, not the incoming direction.\r\n */\r\n @serializeAsVector3()\r\n public direction: Vector3;\r\n\r\n /**\r\n * Creates a HemisphericLight object in the scene according to the passed direction (Vector3).\r\n * The HemisphericLight simulates the ambient environment light, so the passed direction is the light reflection direction, not the incoming direction.\r\n * The HemisphericLight can't cast shadows.\r\n * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction\r\n * @param name The friendly name of the light\r\n * @param direction The direction of the light reflection\r\n * @param scene The scene the light belongs to\r\n */\r\n constructor(name: string, direction: Vector3, scene?: Scene) {\r\n super(name, scene);\r\n this.direction = direction || Vector3.Up();\r\n }\r\n\r\n protected _buildUniformLayout(): void {\r\n this._uniformBuffer.addUniform(\"vLightData\", 4);\r\n this._uniformBuffer.addUniform(\"vLightDiffuse\", 4);\r\n this._uniformBuffer.addUniform(\"vLightSpecular\", 4);\r\n this._uniformBuffer.addUniform(\"vLightGround\", 3);\r\n this._uniformBuffer.addUniform(\"shadowsInfo\", 3);\r\n this._uniformBuffer.addUniform(\"depthValues\", 2);\r\n this._uniformBuffer.create();\r\n }\r\n\r\n /**\r\n * Returns the string \"HemisphericLight\".\r\n * @returns The class name\r\n */\r\n public getClassName(): string {\r\n return \"HemisphericLight\";\r\n }\r\n\r\n /**\r\n * Sets the HemisphericLight direction towards the passed target (Vector3).\r\n * Returns the updated direction.\r\n * @param target The target the direction should point to\r\n * @returns The computed direction\r\n */\r\n public setDirectionToTarget(target: Vector3): Vector3 {\r\n this.direction = Vector3.Normalize(target.subtract(Vector3.Zero()));\r\n return this.direction;\r\n }\r\n\r\n /**\r\n * Returns the shadow generator associated to the light.\r\n * @returns Always null for hemispheric lights because it does not support shadows.\r\n */\r\n public getShadowGenerator(): Nullable {\r\n return null;\r\n }\r\n\r\n /**\r\n * Sets the passed Effect object with the HemisphericLight normalized direction and color and the passed name (string).\r\n * @param _effect The effect to update\r\n * @param lightIndex The index of the light in the effect to update\r\n * @returns The hemispheric light\r\n */\r\n public transferToEffect(_effect: Effect, lightIndex: string): HemisphericLight {\r\n const normalizeDirection = Vector3.Normalize(this.direction);\r\n this._uniformBuffer.updateFloat4(\"vLightData\", normalizeDirection.x, normalizeDirection.y, normalizeDirection.z, 0.0, lightIndex);\r\n this._uniformBuffer.updateColor3(\"vLightGround\", this.groundColor.scale(this.intensity), lightIndex);\r\n return this;\r\n }\r\n\r\n public transferToNodeMaterialEffect(effect: Effect, lightDataUniformName: string) {\r\n const normalizeDirection = Vector3.Normalize(this.direction);\r\n effect.setFloat3(lightDataUniformName, normalizeDirection.x, normalizeDirection.y, normalizeDirection.z);\r\n return this;\r\n }\r\n\r\n /**\r\n * Computes the world matrix of the node\r\n * @returns the world matrix\r\n */\r\n public computeWorldMatrix(): Matrix {\r\n if (!this._worldMatrix) {\r\n this._worldMatrix = Matrix.Identity();\r\n }\r\n return this._worldMatrix;\r\n }\r\n\r\n /**\r\n * Returns the integer 3.\r\n * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x\r\n */\r\n public getTypeID(): number {\r\n return Light.LIGHTTYPEID_HEMISPHERICLIGHT;\r\n }\r\n\r\n /**\r\n * Prepares the list of defines specific to the light type.\r\n * @param defines the list of defines\r\n * @param lightIndex defines the index of the light for the effect\r\n */\r\n public prepareLightSpecificDefines(defines: any, lightIndex: number): void {\r\n defines[\"HEMILIGHT\" + lightIndex] = true;\r\n }\r\n}\r\n", "import type { IDisposable } from \"../scene\";\r\nimport { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { PointerInfoPre } from \"../Events/pointerEvents\";\r\nimport { PointerInfo, PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { HemisphericLight } from \"../Lights/hemisphericLight\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { IPointerEvent } from \"../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Renders a layer on top of an existing scene\r\n */\r\nexport class UtilityLayerRenderer implements IDisposable {\r\n private _pointerCaptures: { [pointerId: number]: boolean } = {};\r\n private _lastPointerEvents: { [pointerId: number]: boolean } = {};\r\n /** @internal */\r\n public static _DefaultUtilityLayer: Nullable = null;\r\n /** @internal */\r\n public static _DefaultKeepDepthUtilityLayer: Nullable = null;\r\n private _sharedGizmoLight: Nullable = null;\r\n\r\n private _renderCamera: Nullable = null;\r\n\r\n /**\r\n * Gets the camera that is used to render the utility layer (when not set, this will be the last active camera)\r\n * @param getRigParentIfPossible if the current active camera is a rig camera, should its parent camera be returned\r\n * @returns the camera that is used when rendering the utility layer\r\n */\r\n public getRenderCamera(getRigParentIfPossible?: boolean) {\r\n if (this._renderCamera) {\r\n return this._renderCamera;\r\n } else {\r\n let activeCam: Camera;\r\n if (this.originalScene.activeCameras && this.originalScene.activeCameras.length > 1) {\r\n activeCam = this.originalScene.activeCameras[this.originalScene.activeCameras.length - 1];\r\n } else {\r\n activeCam = this.originalScene.activeCamera!;\r\n }\r\n\r\n if (getRigParentIfPossible && activeCam && activeCam.isRigCamera) {\r\n return activeCam.rigParent!;\r\n }\r\n return activeCam;\r\n }\r\n }\r\n /**\r\n * Sets the camera that should be used when rendering the utility layer (If set to null the last active camera will be used)\r\n * @param cam the camera that should be used when rendering the utility layer\r\n */\r\n public setRenderCamera(cam: Nullable) {\r\n this._renderCamera = cam;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Light which used by gizmos to get light shading\r\n */\r\n public _getSharedGizmoLight(): HemisphericLight {\r\n if (!this._sharedGizmoLight) {\r\n this._sharedGizmoLight = new HemisphericLight(\"shared gizmo light\", new Vector3(0, 1, 0), this.utilityLayerScene);\r\n this._sharedGizmoLight.intensity = 2;\r\n this._sharedGizmoLight.groundColor = Color3.Gray();\r\n }\r\n return this._sharedGizmoLight;\r\n }\r\n\r\n /**\r\n * If the picking should be done on the utility layer prior to the actual scene (Default: true)\r\n */\r\n public pickUtilitySceneFirst = true;\r\n /**\r\n * A shared utility layer that can be used to overlay objects into a scene (Depth map of the previous scene is cleared before drawing on top of it)\r\n */\r\n public static get DefaultUtilityLayer(): UtilityLayerRenderer {\r\n if (UtilityLayerRenderer._DefaultUtilityLayer == null) {\r\n return UtilityLayerRenderer._CreateDefaultUtilityLayerFromScene(EngineStore.LastCreatedScene!);\r\n }\r\n\r\n return UtilityLayerRenderer._DefaultUtilityLayer;\r\n }\r\n\r\n /**\r\n * Creates an utility layer, and set it as a default utility layer\r\n * @param scene associated scene\r\n * @internal\r\n */\r\n public static _CreateDefaultUtilityLayerFromScene(scene: Scene): UtilityLayerRenderer {\r\n UtilityLayerRenderer._DefaultUtilityLayer = new UtilityLayerRenderer(scene);\r\n UtilityLayerRenderer._DefaultUtilityLayer.originalScene.onDisposeObservable.addOnce(() => {\r\n UtilityLayerRenderer._DefaultUtilityLayer = null;\r\n });\r\n\r\n return UtilityLayerRenderer._DefaultUtilityLayer;\r\n }\r\n /**\r\n * A shared utility layer that can be used to embed objects into a scene (Depth map of the previous scene is not cleared before drawing on top of it)\r\n */\r\n public static get DefaultKeepDepthUtilityLayer(): UtilityLayerRenderer {\r\n if (UtilityLayerRenderer._DefaultKeepDepthUtilityLayer == null) {\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = new UtilityLayerRenderer(EngineStore.LastCreatedScene!);\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.utilityLayerScene.autoClearDepthAndStencil = false;\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.originalScene.onDisposeObservable.addOnce(() => {\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = null;\r\n });\r\n }\r\n return UtilityLayerRenderer._DefaultKeepDepthUtilityLayer;\r\n }\r\n\r\n /**\r\n * The scene that is rendered on top of the original scene\r\n */\r\n public utilityLayerScene: Scene;\r\n\r\n /**\r\n * If the utility layer should automatically be rendered on top of existing scene\r\n */\r\n public shouldRender: boolean = true;\r\n /**\r\n * If set to true, only pointer down onPointerObservable events will be blocked when picking is occluded by original scene\r\n */\r\n public onlyCheckPointerDownEvents = true;\r\n\r\n /**\r\n * If set to false, only pointerUp, pointerDown and pointerMove will be sent to the utilityLayerScene (false by default)\r\n */\r\n public processAllEvents = false;\r\n\r\n /**\r\n * Set to false to disable picking\r\n */\r\n public pickingEnabled = true;\r\n\r\n /**\r\n * Observable raised when the pointer moves from the utility layer scene to the main scene\r\n */\r\n public onPointerOutObservable = new Observable();\r\n\r\n /** Gets or sets a predicate that will be used to indicate utility meshes present in the main scene */\r\n public mainSceneTrackerPredicate: (mesh: Nullable) => boolean;\r\n\r\n private _afterRenderObserver: Nullable>;\r\n private _sceneDisposeObserver: Nullable>;\r\n private _originalPointerObserver: Nullable>;\r\n /**\r\n * Instantiates a UtilityLayerRenderer\r\n * @param originalScene the original scene that will be rendered on top of\r\n * @param handleEvents boolean indicating if the utility layer should handle events\r\n */\r\n constructor(\r\n /** the original scene that will be rendered on top of */\r\n public originalScene: Scene,\r\n handleEvents: boolean = true\r\n ) {\r\n // Create scene which will be rendered in the foreground and remove it from being referenced by engine to avoid interfering with existing app\r\n this.utilityLayerScene = new Scene(originalScene.getEngine(), { virtual: true });\r\n this.utilityLayerScene.useRightHandedSystem = originalScene.useRightHandedSystem;\r\n this.utilityLayerScene._allowPostProcessClearColor = false;\r\n\r\n // Deactivate post processes\r\n this.utilityLayerScene.postProcessesEnabled = false;\r\n\r\n // Detach controls on utility scene, events will be fired by logic below to handle picking priority\r\n this.utilityLayerScene.detachControl();\r\n\r\n if (handleEvents) {\r\n this._originalPointerObserver = originalScene.onPrePointerObservable.add((prePointerInfo) => {\r\n if (!this.utilityLayerScene.activeCamera) {\r\n return;\r\n }\r\n if (!this.pickingEnabled) {\r\n return;\r\n }\r\n\r\n if (!this.processAllEvents) {\r\n if (\r\n prePointerInfo.type !== PointerEventTypes.POINTERMOVE &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERUP &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERDOWN &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERDOUBLETAP\r\n ) {\r\n return;\r\n }\r\n }\r\n this.utilityLayerScene.pointerX = originalScene.pointerX;\r\n this.utilityLayerScene.pointerY = originalScene.pointerY;\r\n const pointerEvent = prePointerInfo.event;\r\n if (originalScene!.isPointerCaptured(pointerEvent.pointerId)) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n return;\r\n }\r\n\r\n const getNearPickDataForScene = (scene: Scene) => {\r\n let scenePick = null;\r\n\r\n if (prePointerInfo.nearInteractionPickingInfo) {\r\n if (prePointerInfo.nearInteractionPickingInfo.pickedMesh!.getScene() == scene) {\r\n scenePick = prePointerInfo.nearInteractionPickingInfo;\r\n } else {\r\n scenePick = new PickingInfo();\r\n }\r\n } else if (scene !== this.utilityLayerScene && prePointerInfo.originalPickingInfo) {\r\n scenePick = prePointerInfo.originalPickingInfo;\r\n } else {\r\n let previousActiveCamera: Nullable = null;\r\n // If a camera is set for rendering with this layer\r\n // it will also be used for the ray computation\r\n // To preserve back compat and because scene.pick always use activeCamera\r\n // it's substituted temporarily and a new scenePick is forced.\r\n // otherwise, the ray with previously active camera is always used.\r\n // It's set back to previous activeCamera after operation.\r\n if (this._renderCamera) {\r\n previousActiveCamera = scene._activeCamera;\r\n scene._activeCamera = this._renderCamera;\r\n prePointerInfo.ray = null;\r\n }\r\n scenePick = prePointerInfo.ray ? scene.pickWithRay(prePointerInfo.ray) : scene.pick(originalScene.pointerX, originalScene.pointerY);\r\n if (previousActiveCamera) {\r\n scene._activeCamera = previousActiveCamera;\r\n }\r\n }\r\n\r\n return scenePick;\r\n };\r\n\r\n const utilityScenePick = getNearPickDataForScene(this.utilityLayerScene);\r\n\r\n if (!prePointerInfo.ray && utilityScenePick) {\r\n prePointerInfo.ray = utilityScenePick.ray;\r\n }\r\n\r\n // always fire the prepointer observable\r\n this.utilityLayerScene.onPrePointerObservable.notifyObservers(prePointerInfo);\r\n\r\n // allow every non pointer down event to flow to the utility layer\r\n if (this.onlyCheckPointerDownEvents && prePointerInfo.type != PointerEventTypes.POINTERDOWN) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(\r\n new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick),\r\n prePointerInfo.type\r\n );\r\n }\r\n if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n }\r\n return;\r\n }\r\n\r\n if (this.utilityLayerScene.autoClearDepthAndStencil || this.pickUtilitySceneFirst) {\r\n // If this layer is an overlay, check if this layer was hit and if so, skip pointer events for the main scene\r\n if (utilityScenePick && utilityScenePick.hit) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(\r\n new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick),\r\n prePointerInfo.type\r\n );\r\n }\r\n prePointerInfo.skipOnPointerObservable = true;\r\n }\r\n } else {\r\n const originalScenePick = getNearPickDataForScene(originalScene);\r\n const pointerEvent = prePointerInfo.event;\r\n\r\n // If the layer can be occluded by the original scene, only fire pointer events to the first layer that hit they ray\r\n if (originalScenePick && utilityScenePick) {\r\n // No pick in utility scene\r\n if (utilityScenePick.distance === 0 && originalScenePick.pickedMesh) {\r\n if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) {\r\n // We touched an utility mesh present in the main scene\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n prePointerInfo.skipOnPointerObservable = true;\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n this._pointerCaptures[pointerEvent.pointerId] = true;\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastPointerEvents[pointerEvent.pointerId]) {\r\n // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete\r\n this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId);\r\n delete this._lastPointerEvents[pointerEvent.pointerId];\r\n }\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n }\r\n } else if (!this._pointerCaptures[pointerEvent.pointerId] && (utilityScenePick.distance < originalScenePick.distance || originalScenePick.distance === 0)) {\r\n // We pick something in utility scene or the pick in utility is closer than the one in main scene\r\n this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent);\r\n // If a previous utility layer set this, do not unset this\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n prePointerInfo.skipOnPointerObservable = utilityScenePick.distance > 0;\r\n }\r\n } else if (!this._pointerCaptures[pointerEvent.pointerId] && utilityScenePick.distance >= originalScenePick.distance) {\r\n // We have a pick in both scenes but main is closer than utility\r\n\r\n // We touched an utility mesh present in the main scene\r\n if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) {\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n prePointerInfo.skipOnPointerObservable = true;\r\n } else {\r\n if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastPointerEvents[pointerEvent.pointerId]) {\r\n // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete\r\n this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId);\r\n delete this._lastPointerEvents[pointerEvent.pointerId];\r\n }\r\n }\r\n this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent);\r\n }\r\n }\r\n\r\n if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n }\r\n }\r\n }\r\n });\r\n\r\n // As a newly added utility layer will be rendered over the screen last, it's pointer events should be processed first\r\n if (this._originalPointerObserver) {\r\n originalScene.onPrePointerObservable.makeObserverTopPriority(this._originalPointerObserver);\r\n }\r\n }\r\n\r\n // Render directly on top of existing scene without clearing\r\n this.utilityLayerScene.autoClear = false;\r\n\r\n this._afterRenderObserver = this.originalScene.onAfterRenderCameraObservable.add((camera) => {\r\n // Only render when the render camera finishes rendering\r\n if (this.shouldRender && camera == this.getRenderCamera()) {\r\n this.render();\r\n }\r\n });\r\n\r\n this._sceneDisposeObserver = this.originalScene.onDisposeObservable.add(() => {\r\n this.dispose();\r\n });\r\n\r\n this._updateCamera();\r\n }\r\n\r\n private _notifyObservers(prePointerInfo: PointerInfoPre, pickInfo: PickingInfo, pointerEvent: IPointerEvent) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(new PointerInfo(prePointerInfo.type, prePointerInfo.event, pickInfo), prePointerInfo.type);\r\n this._lastPointerEvents[pointerEvent.pointerId] = true;\r\n }\r\n }\r\n\r\n /**\r\n * Renders the utility layers scene on top of the original scene\r\n */\r\n public render() {\r\n this._updateCamera();\r\n if (this.utilityLayerScene.activeCamera) {\r\n // Set the camera's scene to utility layers scene\r\n const oldScene = this.utilityLayerScene.activeCamera.getScene();\r\n const camera = this.utilityLayerScene.activeCamera;\r\n camera._scene = this.utilityLayerScene;\r\n if (camera.leftCamera) {\r\n camera.leftCamera._scene = this.utilityLayerScene;\r\n }\r\n if (camera.rightCamera) {\r\n camera.rightCamera._scene = this.utilityLayerScene;\r\n }\r\n\r\n this.utilityLayerScene.render(false);\r\n\r\n // Reset camera's scene back to original\r\n camera._scene = oldScene;\r\n if (camera.leftCamera) {\r\n camera.leftCamera._scene = oldScene;\r\n }\r\n if (camera.rightCamera) {\r\n camera.rightCamera._scene = oldScene;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the renderer\r\n */\r\n public dispose() {\r\n this.onPointerOutObservable.clear();\r\n\r\n if (this._afterRenderObserver) {\r\n this.originalScene.onAfterCameraRenderObservable.remove(this._afterRenderObserver);\r\n }\r\n if (this._sceneDisposeObserver) {\r\n this.originalScene.onDisposeObservable.remove(this._sceneDisposeObserver);\r\n }\r\n if (this._originalPointerObserver) {\r\n this.originalScene.onPrePointerObservable.remove(this._originalPointerObserver);\r\n }\r\n this.utilityLayerScene.dispose();\r\n }\r\n\r\n private _updateCamera() {\r\n this.utilityLayerScene.cameraToUseForPointers = this.getRenderCamera();\r\n this.utilityLayerScene.activeCamera = this.getRenderCamera();\r\n }\r\n}\r\n", "import type { Observer } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { Quaternion, Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport type { TargetCamera } from \"../Cameras/targetCamera\";\r\nimport type { Node } from \"../node\";\r\nimport type { Bone } from \"../Bones/bone\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport type { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { ShadowLight } from \"../Lights/shadowLight\";\r\nimport { Light } from \"../Lights/light\";\r\n\r\n/**\r\n * Cache built by each axis. Used for managing state between all elements of gizmo for enhanced UI\r\n */\r\nexport interface GizmoAxisCache {\r\n /** Mesh used to render the Gizmo */\r\n gizmoMeshes: Mesh[];\r\n /** Mesh used to detect user interaction with Gizmo */\r\n colliderMeshes: Mesh[];\r\n /** Material used to indicate color of gizmo mesh */\r\n material: StandardMaterial;\r\n /** Material used to indicate hover state of the Gizmo */\r\n hoverMaterial: StandardMaterial;\r\n /** Material used to indicate disabled state of the Gizmo */\r\n disableMaterial: StandardMaterial;\r\n /** Used to indicate Active state of the Gizmo */\r\n active: boolean;\r\n /** DragBehavior */\r\n dragBehavior: PointerDragBehavior;\r\n}\r\n\r\n/**\r\n * Anchor options where the Gizmo can be positioned in relation to its anchored node\r\n */\r\nexport enum GizmoAnchorPoint {\r\n /** The origin of the attached node */\r\n Origin,\r\n /** The pivot point of the attached node*/\r\n Pivot,\r\n}\r\n\r\n/**\r\n * Coordinates mode: Local or World. Defines how axis is aligned: either on world axis or transform local axis\r\n */\r\nexport enum GizmoCoordinatesMode {\r\n World,\r\n Local,\r\n}\r\n\r\n/**\r\n * Interface for basic gizmo\r\n */\r\nexport interface IGizmo extends IDisposable {\r\n /** True when the mouse pointer is hovered a gizmo mesh */\r\n readonly isHovered: boolean;\r\n /** The root mesh of the gizmo */\r\n _rootMesh: Mesh;\r\n /** Ratio for the scale of the gizmo */\r\n scaleRatio: number;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedMesh: Nullable;\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedNode: Nullable;\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoRotationToMatchAttachedMesh: boolean;\r\n /** The utility layer the gizmo will be added to */\r\n gizmoLayer: UtilityLayerRenderer;\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoPositionToMatchAttachedMesh: boolean;\r\n /**\r\n * Defines where the gizmo will be positioned if `updateGizmoPositionToMatchAttachedMesh` is enabled.\r\n * (Default: GizmoAnchorPoint.Origin)\r\n */\r\n anchorPoint: GizmoAnchorPoint;\r\n\r\n /**\r\n * Set the coordinate mode to use. By default it's local.\r\n */\r\n coordinatesMode: GizmoCoordinatesMode;\r\n\r\n /**\r\n * When set, the gizmo will always appear the same size no matter where the camera is (default: true)\r\n */\r\n updateScale: boolean;\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n customRotationQuaternion: Nullable;\r\n /**\r\n * Disposes and replaces the current meshes in the gizmo with the specified mesh\r\n * @param mesh The mesh to replace the default mesh of the gizmo\r\n */\r\n setCustomMesh(mesh: Mesh): void;\r\n\r\n /**\r\n * Additional transform applied to the gizmo.\r\n * It's useful when the gizmo is attached to a bone: if the bone is part of a skeleton attached to a mesh, you should define the mesh as additionalTransformNode if you want the gizmo to be displayed at the bone's correct location.\r\n * Otherwise, as the gizmo is relative to the skeleton root, the mesh transformation will not be taken into account.\r\n */\r\n additionalTransformNode?: TransformNode | undefined;\r\n}\r\n/**\r\n * Renders gizmos on top of an existing scene which provide controls for position, rotation, etc.\r\n */\r\nexport class Gizmo implements IGizmo {\r\n /**\r\n * The root mesh of the gizmo\r\n */\r\n public _rootMesh: Mesh;\r\n protected _attachedMesh: Nullable = null;\r\n protected _attachedNode: Nullable = null;\r\n protected _customRotationQuaternion: Nullable = null;\r\n protected _additionalTransformNode?: TransformNode;\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n protected _scaleRatio = 1;\r\n\r\n /**\r\n * boolean updated by pointermove when a gizmo mesh is hovered\r\n */\r\n protected _isHovered = false;\r\n\r\n /**\r\n * When enabled, any gizmo operation will perserve scaling sign. Default is off.\r\n * Only valid for TransformNode derived classes (Mesh, AbstractMesh, ...)\r\n */\r\n public static PreserveScaling = false;\r\n\r\n /**\r\n * There are 2 ways to preserve scaling: using mesh scaling or absolute scaling. Depending of hierarchy, non uniform scaling and LH or RH coordinates. One is preferable than the other.\r\n * If the scaling to be preserved is the local scaling, then set this value to false.\r\n * Default is true which means scaling to be preserved is absolute one (with hierarchy applied)\r\n */\r\n public static UseAbsoluteScaling = true;\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n }\r\n\r\n public get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovered a gizmo mesh\r\n */\r\n public get isHovered() {\r\n return this._isHovered;\r\n }\r\n\r\n /**\r\n * If a custom mesh has been set (Default: false)\r\n */\r\n protected _customMeshSet = false;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedMesh() {\r\n return this._attachedMesh;\r\n }\r\n public set attachedMesh(value) {\r\n this._attachedMesh = value;\r\n if (value) {\r\n this._attachedNode = value;\r\n }\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedNode() {\r\n return this._attachedNode;\r\n }\r\n public set attachedNode(value) {\r\n this._attachedNode = value;\r\n this._attachedMesh = null;\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n\r\n /**\r\n * Disposes and replaces the current meshes in the gizmo with the specified mesh\r\n * @param mesh The mesh to replace the default mesh of the gizmo\r\n */\r\n public setCustomMesh(mesh: Mesh) {\r\n if (mesh.getScene() != this.gizmoLayer.utilityLayerScene) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"When setting a custom mesh on a gizmo, the custom meshes scene must be the same as the gizmos (eg. gizmo.gizmoLayer.utilityLayerScene)\";\r\n }\r\n this._rootMesh.getChildMeshes().forEach((c) => {\r\n c.dispose();\r\n });\r\n mesh.parent = this._rootMesh;\r\n this._customMeshSet = true;\r\n }\r\n\r\n /**\r\n * Additional transform applied to the gizmo.\r\n * It's useful when the gizmo is attached to a bone: if the bone is part of a skeleton attached to a mesh, you should define the mesh as additionalTransformNode if you want the gizmo to be displayed at the bone's correct location.\r\n * Otherwise, as the gizmo is relative to the skeleton root, the mesh transformation will not be taken into account.\r\n */\r\n public get additionalTransformNode() {\r\n return this._additionalTransformNode;\r\n }\r\n\r\n public set additionalTransformNode(value: TransformNode | undefined) {\r\n this._additionalTransformNode = value;\r\n }\r\n\r\n protected _updateGizmoRotationToMatchAttachedMesh = true;\r\n protected _updateGizmoPositionToMatchAttachedMesh = true;\r\n protected _anchorPoint = GizmoAnchorPoint.Origin;\r\n protected _updateScale = true;\r\n protected _coordinatesMode = GizmoCoordinatesMode.Local;\r\n\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n * NOTE: This is only possible for meshes with uniform scaling, as otherwise it's not possible to decompose the rotation\r\n */\r\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoRotationToMatchAttachedMesh() {\r\n return this._updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n public set updateGizmoPositionToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoPositionToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoPositionToMatchAttachedMesh() {\r\n return this._updateGizmoPositionToMatchAttachedMesh;\r\n }\r\n\r\n /**\r\n * Defines where the gizmo will be positioned if `updateGizmoPositionToMatchAttachedMesh` is enabled.\r\n * (Default: GizmoAnchorPoint.Origin)\r\n */\r\n public set anchorPoint(value: GizmoAnchorPoint) {\r\n this._anchorPoint = value;\r\n }\r\n public get anchorPoint() {\r\n return this._anchorPoint;\r\n }\r\n\r\n /**\r\n * Set the coordinate system to use. By default it's local.\r\n * But it's possible for a user to tweak so its local for translation and world for rotation.\r\n * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh`\r\n */\r\n public set coordinatesMode(coordinatesMode: GizmoCoordinatesMode) {\r\n this._coordinatesMode = coordinatesMode;\r\n const local = coordinatesMode == GizmoCoordinatesMode.Local;\r\n this.updateGizmoRotationToMatchAttachedMesh = local;\r\n this.updateGizmoPositionToMatchAttachedMesh = true;\r\n }\r\n\r\n public get coordinatesMode() {\r\n return this._coordinatesMode;\r\n }\r\n\r\n /**\r\n * When set, the gizmo will always appear the same size no matter where the camera is (default: true)\r\n */\r\n\r\n public set updateScale(value: boolean) {\r\n this._updateScale = value;\r\n }\r\n public get updateScale() {\r\n return this._updateScale;\r\n }\r\n protected _interactionsEnabled = true;\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _attachedNodeChanged(value: Nullable) {}\r\n\r\n protected _beforeRenderObserver: Nullable>;\r\n private _rightHandtoLeftHandMatrix = Matrix.RotationY(Math.PI);\r\n\r\n /**\r\n * Creates a gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(\r\n /** The utility layer the gizmo will be added to */\r\n public gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer\r\n ) {\r\n this._rootMesh = new Mesh(\"gizmoRootNode\", gizmoLayer.utilityLayerScene);\r\n this._rootMesh.rotationQuaternion = Quaternion.Identity();\r\n\r\n this._beforeRenderObserver = this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.add(() => {\r\n this._update();\r\n });\r\n }\r\n\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n public get customRotationQuaternion(): Nullable {\r\n return this._customRotationQuaternion;\r\n }\r\n\r\n public set customRotationQuaternion(customRotationQuaternion: Nullable) {\r\n this._customRotationQuaternion = customRotationQuaternion;\r\n }\r\n\r\n /**\r\n * Updates the gizmo to match the attached mesh's position/rotation\r\n */\r\n protected _update() {\r\n if (this.attachedNode) {\r\n let effectiveNode = this.attachedNode;\r\n if (this.attachedMesh) {\r\n effectiveNode = this.attachedMesh || this.attachedNode;\r\n }\r\n\r\n // Position\r\n if (this.updateGizmoPositionToMatchAttachedMesh) {\r\n if (this.anchorPoint == GizmoAnchorPoint.Pivot && (effectiveNode).getAbsolutePivotPoint) {\r\n const position = (effectiveNode).getAbsolutePivotPoint();\r\n this._rootMesh.position.copyFrom(position);\r\n } else {\r\n const row = effectiveNode.getWorldMatrix().getRow(3);\r\n const position = row ? row.toVector3() : new Vector3(0, 0, 0);\r\n this._rootMesh.position.copyFrom(position);\r\n }\r\n }\r\n\r\n // Rotation\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n const supportedNode =\r\n (effectiveNode)._isMesh ||\r\n effectiveNode.getClassName() === \"AbstractMesh\" ||\r\n effectiveNode.getClassName() === \"TransformNode\" ||\r\n effectiveNode.getClassName() === \"InstancedMesh\";\r\n const transformNode = supportedNode ? (effectiveNode as TransformNode) : undefined;\r\n effectiveNode.getWorldMatrix().decompose(undefined, this._rootMesh.rotationQuaternion!, undefined, Gizmo.PreserveScaling ? transformNode : undefined);\r\n this._rootMesh.rotationQuaternion!.normalize();\r\n } else {\r\n if (this._customRotationQuaternion) {\r\n this._rootMesh.rotationQuaternion!.copyFrom(this._customRotationQuaternion);\r\n } else {\r\n this._rootMesh.rotationQuaternion!.set(0, 0, 0, 1);\r\n }\r\n }\r\n\r\n // Scale\r\n if (this.updateScale) {\r\n const activeCamera = this.gizmoLayer.utilityLayerScene.activeCamera!;\r\n const cameraPosition = activeCamera.globalPosition;\r\n this._rootMesh.position.subtractToRef(cameraPosition, TmpVectors.Vector3[0]);\r\n let scale = this.scaleRatio;\r\n if (activeCamera.mode == Camera.ORTHOGRAPHIC_CAMERA) {\r\n if (activeCamera.orthoTop && activeCamera.orthoBottom) {\r\n const orthoHeight = activeCamera.orthoTop - activeCamera.orthoBottom;\r\n scale *= orthoHeight;\r\n }\r\n } else {\r\n const camForward = activeCamera.getScene().useRightHandedSystem ? Vector3.RightHandedForwardReadOnly : Vector3.LeftHandedForwardReadOnly;\r\n const direction = activeCamera.getDirection(camForward);\r\n scale *= Vector3.Dot(TmpVectors.Vector3[0], direction);\r\n }\r\n this._rootMesh.scaling.setAll(scale);\r\n\r\n // Account for handedness, similar to Matrix.decompose\r\n if (effectiveNode._getWorldMatrixDeterminant() < 0 && !Gizmo.PreserveScaling) {\r\n this._rootMesh.scaling.y *= -1;\r\n }\r\n } else {\r\n this._rootMesh.scaling.setAll(this.scaleRatio);\r\n }\r\n }\r\n\r\n if (this.additionalTransformNode) {\r\n this._rootMesh.computeWorldMatrix(true);\r\n this._rootMesh.getWorldMatrix().multiplyToRef(this.additionalTransformNode.getWorldMatrix(), TmpVectors.Matrix[0]);\r\n TmpVectors.Matrix[0].decompose(this._rootMesh.scaling, this._rootMesh.rotationQuaternion!, this._rootMesh.position);\r\n }\r\n }\r\n\r\n /**\r\n * if transform has a pivot and is not using PostMultiplyPivotMatrix, then the worldMatrix contains the pivot matrix (it's not cancelled at the end)\r\n * so, when extracting the world matrix component, the translation (and other components) is containing the pivot translation.\r\n * And the pivot is applied each frame. Removing it anyway here makes it applied only in computeWorldMatrix.\r\n * @param transform local transform that needs to be transform by the pivot inverse matrix\r\n * @param localMatrix local matrix that needs to be transform by the pivot inverse matrix\r\n * @param result resulting matrix transformed by pivot inverse if the transform node is using pivot without using post Multiply Pivot Matrix\r\n */\r\n protected _handlePivotMatrixInverse(transform: TransformNode, localMatrix: Matrix, result: Matrix): void {\r\n if (transform.isUsingPivotMatrix() && !transform.isUsingPostMultiplyPivotMatrix()) {\r\n transform.getPivotMatrix().invertToRef(TmpVectors.Matrix[5]);\r\n TmpVectors.Matrix[5].multiplyToRef(localMatrix, result);\r\n return;\r\n }\r\n result.copyFrom(localMatrix);\r\n }\r\n /**\r\n * computes the rotation/scaling/position of the transform once the Node world matrix has changed.\r\n */\r\n protected _matrixChanged() {\r\n if (!this._attachedNode) {\r\n return;\r\n }\r\n\r\n if ((this._attachedNode)._isCamera) {\r\n const camera = this._attachedNode as Camera;\r\n let worldMatrix;\r\n let worldMatrixUC;\r\n if (camera.parent) {\r\n const parentInv = TmpVectors.Matrix[1];\r\n camera.parent._worldMatrix.invertToRef(parentInv);\r\n this._attachedNode._worldMatrix.multiplyToRef(parentInv, TmpVectors.Matrix[0]);\r\n worldMatrix = TmpVectors.Matrix[0];\r\n } else {\r\n worldMatrix = this._attachedNode._worldMatrix;\r\n }\r\n\r\n if (camera.getScene().useRightHandedSystem) {\r\n // avoid desync with RH matrix computation. Otherwise, rotation of PI around Y axis happens each frame resulting in axis flipped because worldMatrix is computed as inverse of viewMatrix.\r\n this._rightHandtoLeftHandMatrix.multiplyToRef(worldMatrix, TmpVectors.Matrix[1]);\r\n worldMatrixUC = TmpVectors.Matrix[1];\r\n } else {\r\n worldMatrixUC = worldMatrix;\r\n }\r\n\r\n worldMatrixUC.decompose(TmpVectors.Vector3[1], TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n\r\n const inheritsTargetCamera =\r\n this._attachedNode.getClassName() === \"FreeCamera\" ||\r\n this._attachedNode.getClassName() === \"FlyCamera\" ||\r\n this._attachedNode.getClassName() === \"ArcFollowCamera\" ||\r\n this._attachedNode.getClassName() === \"TargetCamera\" ||\r\n this._attachedNode.getClassName() === \"TouchCamera\" ||\r\n this._attachedNode.getClassName() === \"UniversalCamera\";\r\n\r\n if (inheritsTargetCamera) {\r\n const targetCamera = this._attachedNode as TargetCamera;\r\n targetCamera.rotation = TmpVectors.Quaternion[0].toEulerAngles();\r\n\r\n if (targetCamera.rotationQuaternion) {\r\n targetCamera.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]);\r\n targetCamera.rotationQuaternion.normalize();\r\n }\r\n }\r\n\r\n camera.position.copyFrom(TmpVectors.Vector3[0]);\r\n } else if (\r\n (this._attachedNode)._isMesh ||\r\n this._attachedNode.getClassName() === \"AbstractMesh\" ||\r\n this._attachedNode.getClassName() === \"TransformNode\" ||\r\n this._attachedNode.getClassName() === \"InstancedMesh\"\r\n ) {\r\n const transform = this._attachedNode as TransformNode;\r\n if (transform.parent) {\r\n const parentInv = TmpVectors.Matrix[0];\r\n const localMat = TmpVectors.Matrix[1];\r\n transform.parent.getWorldMatrix().invertToRef(parentInv);\r\n this._attachedNode.getWorldMatrix().multiplyToRef(parentInv, localMat);\r\n const matrixToDecompose = TmpVectors.Matrix[4];\r\n this._handlePivotMatrixInverse(transform, localMat, matrixToDecompose);\r\n matrixToDecompose.decompose(\r\n TmpVectors.Vector3[0],\r\n TmpVectors.Quaternion[0],\r\n transform.position,\r\n Gizmo.PreserveScaling ? transform : undefined,\r\n Gizmo.UseAbsoluteScaling\r\n );\r\n TmpVectors.Quaternion[0].normalize();\r\n if (transform.isUsingPivotMatrix()) {\r\n // Calculate the local matrix without the translation.\r\n // Copied from TranslateNode.computeWorldMatrix\r\n const r = TmpVectors.Quaternion[1];\r\n Quaternion.RotationYawPitchRollToRef(transform.rotation.y, transform.rotation.x, transform.rotation.z, r);\r\n\r\n const scaleMatrix = TmpVectors.Matrix[2];\r\n Matrix.ScalingToRef(transform.scaling.x, transform.scaling.y, transform.scaling.z, scaleMatrix);\r\n\r\n const rotationMatrix = TmpVectors.Matrix[2];\r\n r.toRotationMatrix(rotationMatrix);\r\n\r\n const pivotMatrix = transform.getPivotMatrix();\r\n const invPivotMatrix = TmpVectors.Matrix[3];\r\n pivotMatrix.invertToRef(invPivotMatrix);\r\n\r\n pivotMatrix.multiplyToRef(scaleMatrix, TmpVectors.Matrix[4]);\r\n TmpVectors.Matrix[4].multiplyToRef(rotationMatrix, TmpVectors.Matrix[5]);\r\n TmpVectors.Matrix[5].multiplyToRef(invPivotMatrix, TmpVectors.Matrix[6]);\r\n\r\n TmpVectors.Matrix[6].getTranslationToRef(TmpVectors.Vector3[1]);\r\n\r\n transform.position.subtractInPlace(TmpVectors.Vector3[1]);\r\n }\r\n } else {\r\n const matrixToDecompose = TmpVectors.Matrix[4];\r\n this._handlePivotMatrixInverse(transform, this._attachedNode._worldMatrix, matrixToDecompose);\r\n matrixToDecompose.decompose(\r\n TmpVectors.Vector3[0],\r\n TmpVectors.Quaternion[0],\r\n transform.position,\r\n Gizmo.PreserveScaling ? transform : undefined,\r\n Gizmo.UseAbsoluteScaling\r\n );\r\n }\r\n TmpVectors.Vector3[0].scaleInPlace(1.0 / transform.scalingDeterminant);\r\n transform.scaling.copyFrom(TmpVectors.Vector3[0]);\r\n if (!transform.billboardMode) {\r\n if (transform.rotationQuaternion) {\r\n transform.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]);\r\n transform.rotationQuaternion.normalize();\r\n } else {\r\n transform.rotation = TmpVectors.Quaternion[0].toEulerAngles();\r\n }\r\n }\r\n } else if (this._attachedNode.getClassName() === \"Bone\") {\r\n const bone = this._attachedNode as Bone;\r\n const parent = bone.getParent();\r\n\r\n if (parent) {\r\n const invParent = TmpVectors.Matrix[0];\r\n const boneLocalMatrix = TmpVectors.Matrix[1];\r\n parent.getFinalMatrix().invertToRef(invParent);\r\n bone.getFinalMatrix().multiplyToRef(invParent, boneLocalMatrix);\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(boneLocalMatrix);\r\n } else {\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(bone.getFinalMatrix());\r\n }\r\n bone.markAsDirty();\r\n } else {\r\n const light = this._attachedNode as ShadowLight;\r\n if (light.getTypeID) {\r\n const type = light.getTypeID();\r\n if (type === Light.LIGHTTYPEID_DIRECTIONALLIGHT || type === Light.LIGHTTYPEID_SPOTLIGHT || type === Light.LIGHTTYPEID_POINTLIGHT) {\r\n const parent = light.parent;\r\n\r\n if (parent) {\r\n const invParent = TmpVectors.Matrix[0];\r\n const nodeLocalMatrix = TmpVectors.Matrix[1];\r\n parent.getWorldMatrix().invertToRef(invParent);\r\n light.getWorldMatrix().multiplyToRef(invParent, nodeLocalMatrix);\r\n nodeLocalMatrix.decompose(undefined, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n } else {\r\n this._attachedNode._worldMatrix.decompose(undefined, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n }\r\n // setter doesn't copy values. Need a new Vector3\r\n light.position = new Vector3(TmpVectors.Vector3[0].x, TmpVectors.Vector3[0].y, TmpVectors.Vector3[0].z);\r\n if (light.direction) {\r\n light.direction = new Vector3(light.direction.x, light.direction.y, light.direction.z);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * refresh gizmo mesh material\r\n * @param gizmoMeshes\r\n * @param material material to apply\r\n */\r\n protected _setGizmoMeshMaterial(gizmoMeshes: Mesh[], material: StandardMaterial) {\r\n if (gizmoMeshes) {\r\n gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m).color) {\r\n (m).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Subscribes to pointer up, down, and hover events. Used for responsive gizmos.\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI\r\n * @returns {Observer} pointerObserver\r\n */\r\n public static GizmoAxisPointerObserver(gizmoLayer: UtilityLayerRenderer, gizmoAxisCache: Map): Observer {\r\n let dragging = false;\r\n\r\n const pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (pointerInfo.pickInfo) {\r\n // On Hover Logic\r\n if (pointerInfo.type === PointerEventTypes.POINTERMOVE) {\r\n if (dragging) {\r\n return;\r\n }\r\n gizmoAxisCache.forEach((cache) => {\r\n if (cache.colliderMeshes && cache.gizmoMeshes) {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = cache.dragBehavior.enabled ? (isHovered || cache.active ? cache.hoverMaterial : cache.material) : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // On Mouse Down\r\n if (pointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n // If user Clicked Gizmo\r\n if (gizmoAxisCache.has(pointerInfo.pickInfo.pickedMesh?.parent as Mesh)) {\r\n dragging = true;\r\n const statusMap = gizmoAxisCache.get(pointerInfo.pickInfo.pickedMesh?.parent as Mesh);\r\n statusMap!.active = true;\r\n gizmoAxisCache.forEach((cache) => {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = (isHovered || cache.active) && cache.dragBehavior.enabled ? cache.hoverMaterial : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n // On Mouse Up\r\n if (pointerInfo.type === PointerEventTypes.POINTERUP) {\r\n gizmoAxisCache.forEach((cache) => {\r\n cache.active = false;\r\n dragging = false;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = cache.dragBehavior.enabled ? cache.material : cache.disableMaterial;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = cache.material.diffuseColor;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return pointerObserver!;\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this._rootMesh.dispose();\r\n if (this._beforeRenderObserver) {\r\n this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n }\r\n}\r\n", "import { Vector3, Matrix } from \"../Maths/math.vector\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\n\r\n/**\r\n * Class containing a set of static utilities functions for managing Pivots\r\n * @internal\r\n */\r\nexport class PivotTools {\r\n // Stores the state of the pivot cache (_oldPivotPoint, _pivotTranslation)\r\n // store/remove pivot point should only be applied during their outermost calls\r\n private static _PivotCached = 0;\r\n private static _OldPivotPoint = new Vector3();\r\n private static _PivotTranslation = new Vector3();\r\n private static _PivotTmpVector = new Vector3();\r\n private static _PivotPostMultiplyPivotMatrix = false;\r\n /**\r\n * @internal\r\n */\r\n public static _RemoveAndStorePivotPoint(mesh: TransformNode) {\r\n if (mesh && PivotTools._PivotCached === 0) {\r\n // Save old pivot and set pivot to 0,0,0\r\n mesh.getPivotPointToRef(PivotTools._OldPivotPoint);\r\n PivotTools._PivotPostMultiplyPivotMatrix = mesh._postMultiplyPivotMatrix;\r\n if (!PivotTools._OldPivotPoint.equalsToFloats(0, 0, 0)) {\r\n mesh.setPivotMatrix(Matrix.IdentityReadOnly);\r\n PivotTools._OldPivotPoint.subtractToRef(mesh.getPivotPoint(), PivotTools._PivotTranslation);\r\n PivotTools._PivotTmpVector.copyFromFloats(1, 1, 1);\r\n PivotTools._PivotTmpVector.subtractInPlace(mesh.scaling);\r\n PivotTools._PivotTmpVector.multiplyInPlace(PivotTools._PivotTranslation);\r\n mesh.position.addInPlace(PivotTools._PivotTmpVector);\r\n }\r\n }\r\n PivotTools._PivotCached++;\r\n }\r\n /**\r\n * @internal\r\n */\r\n public static _RestorePivotPoint(mesh: TransformNode) {\r\n if (mesh && !PivotTools._OldPivotPoint.equalsToFloats(0, 0, 0) && PivotTools._PivotCached === 1) {\r\n mesh.setPivotPoint(PivotTools._OldPivotPoint);\r\n mesh._postMultiplyPivotMatrix = PivotTools._PivotPostMultiplyPivotMatrix;\r\n PivotTools._PivotTmpVector.copyFromFloats(1, 1, 1);\r\n PivotTools._PivotTmpVector.subtractInPlace(mesh.scaling);\r\n PivotTools._PivotTmpVector.multiplyInPlace(PivotTools._PivotTranslation);\r\n mesh.position.subtractInPlace(PivotTools._PivotTmpVector);\r\n }\r\n this._PivotCached--;\r\n }\r\n}\r\n", "import { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { Matrix, Vector3, Vector2, Vector4, Quaternion } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport type { Effect, IEffectCreationOptions, IShaderPath } from \"./effect\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport { EffectFallbacks } from \"./effectFallbacks\";\r\nimport { WebRequest } from \"../Misc/webRequest\";\r\nimport type { ShaderLanguage } from \"./shaderLanguage\";\r\nimport type { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { TextureSampler } from \"./Textures/textureSampler\";\r\nimport type { StorageBuffer } from \"../Buffers/storageBuffer\";\r\nimport { PushMaterial } from \"./pushMaterial\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { addClipPlaneUniforms, bindClipPlane, prepareStringDefinesForClipPlanes } from \"./clipPlaneMaterialHelper\";\r\n\r\nimport type { ExternalTexture } from \"./Textures/externalTexture\";\r\nimport {\r\n BindBonesParameters,\r\n BindFogParameters,\r\n BindLogDepth,\r\n BindMorphTargetParameters,\r\n BindSceneUniformBuffer,\r\n PrepareAttributesForBakedVertexAnimation,\r\n PushAttributesForInstances,\r\n} from \"./materialHelper.functions\";\r\n\r\nconst onCreatedEffectParameters = { effect: null as unknown as Effect, subMesh: null as unknown as Nullable };\r\n\r\n/**\r\n * Defines the options associated with the creation of a shader material.\r\n */\r\nexport interface IShaderMaterialOptions {\r\n /**\r\n * Does the material work in alpha blend mode\r\n */\r\n needAlphaBlending: boolean;\r\n\r\n /**\r\n * Does the material work in alpha test mode\r\n */\r\n needAlphaTesting: boolean;\r\n\r\n /**\r\n * The list of attribute names used in the shader\r\n */\r\n attributes: string[];\r\n\r\n /**\r\n * The list of uniform names used in the shader\r\n */\r\n uniforms: string[];\r\n\r\n /**\r\n * The list of UBO names used in the shader\r\n */\r\n uniformBuffers: string[];\r\n\r\n /**\r\n * The list of sampler (texture) names used in the shader\r\n */\r\n samplers: string[];\r\n\r\n /**\r\n * The list of external texture names used in the shader\r\n */\r\n externalTextures: string[];\r\n\r\n /**\r\n * The list of sampler object names used in the shader\r\n */\r\n samplerObjects: string[];\r\n\r\n /**\r\n * The list of storage buffer names used in the shader\r\n */\r\n storageBuffers: string[];\r\n\r\n /**\r\n * The list of defines used in the shader\r\n */\r\n defines: string[];\r\n\r\n /**\r\n * Defines if clip planes have to be turned on: true to turn them on, false to turn them off and null to turn them on/off depending on the scene configuration (scene.clipPlaneX)\r\n */\r\n useClipPlane: Nullable;\r\n\r\n /**\r\n * The language the shader is written in (default: GLSL)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n}\r\n\r\n/**\r\n * The ShaderMaterial object has the necessary methods to pass data from your scene to the Vertex and Fragment Shaders and returns a material that can be applied to any mesh.\r\n *\r\n * This returned material effects how the mesh will look based on the code in the shaders.\r\n *\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/shaders/shaderMaterial\r\n */\r\nexport class ShaderMaterial extends PushMaterial {\r\n private _shaderPath: IShaderPath | string;\r\n private _options: IShaderMaterialOptions;\r\n private _textures: { [name: string]: BaseTexture } = {};\r\n private _textureArrays: { [name: string]: BaseTexture[] } = {};\r\n private _externalTextures: { [name: string]: ExternalTexture } = {};\r\n private _floats: { [name: string]: number } = {};\r\n private _ints: { [name: string]: number } = {};\r\n private _uints: { [name: string]: number } = {};\r\n private _floatsArrays: { [name: string]: number[] } = {};\r\n private _colors3: { [name: string]: Color3 } = {};\r\n private _colors3Arrays: { [name: string]: number[] } = {};\r\n private _colors4: { [name: string]: Color4 } = {};\r\n private _colors4Arrays: { [name: string]: number[] } = {};\r\n private _vectors2: { [name: string]: Vector2 } = {};\r\n private _vectors3: { [name: string]: Vector3 } = {};\r\n private _vectors4: { [name: string]: Vector4 } = {};\r\n private _quaternions: { [name: string]: Quaternion } = {};\r\n private _quaternionsArrays: { [name: string]: number[] } = {};\r\n private _matrices: { [name: string]: Matrix } = {};\r\n private _matrixArrays: { [name: string]: Float32Array | Array } = {};\r\n private _matrices3x3: { [name: string]: Float32Array | Array } = {};\r\n private _matrices2x2: { [name: string]: Float32Array | Array } = {};\r\n private _vectors2Arrays: { [name: string]: number[] } = {};\r\n private _vectors3Arrays: { [name: string]: number[] } = {};\r\n private _vectors4Arrays: { [name: string]: number[] } = {};\r\n private _uniformBuffers: { [name: string]: UniformBuffer } = {};\r\n private _textureSamplers: { [name: string]: TextureSampler } = {};\r\n private _storageBuffers: { [name: string]: StorageBuffer } = {};\r\n private _cachedWorldViewMatrix = new Matrix();\r\n private _cachedWorldViewProjectionMatrix = new Matrix();\r\n private _multiview = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _materialHelperNeedsPreviousMatrices = false;\r\n\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n /** Snippet ID if the material was created from the snippet server */\r\n public snippetId: string;\r\n\r\n /**\r\n * Instantiate a new shader material.\r\n * The ShaderMaterial object has the necessary methods to pass data from your scene to the Vertex and Fragment Shaders and returns a material that can be applied to any mesh.\r\n * This returned material effects how the mesh will look based on the code in the shaders.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/shaders/shaderMaterial\r\n * @param name Define the name of the material in the scene\r\n * @param scene Define the scene the material belongs to\r\n * @param shaderPath Defines the route to the shader code.\r\n * @param options Define the options used to create the shader\r\n * @param storeEffectOnSubMeshes true to store effect on submeshes, false to store the effect directly in the material class.\r\n */\r\n constructor(name: string, scene: Scene, shaderPath: IShaderPath | string, options: Partial = {}, storeEffectOnSubMeshes = true) {\r\n super(name, scene, storeEffectOnSubMeshes);\r\n this._shaderPath = shaderPath;\r\n\r\n this._options = {\r\n needAlphaBlending: false,\r\n needAlphaTesting: false,\r\n attributes: [\"position\", \"normal\", \"uv\"],\r\n uniforms: [\"worldViewProjection\"],\r\n uniformBuffers: [],\r\n samplers: [],\r\n externalTextures: [],\r\n samplerObjects: [],\r\n storageBuffers: [],\r\n defines: [],\r\n useClipPlane: false,\r\n ...options,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the shader path used to define the shader code\r\n * It can be modified to trigger a new compilation\r\n */\r\n public get shaderPath() {\r\n return this._shaderPath;\r\n }\r\n\r\n /**\r\n * Sets the shader path used to define the shader code\r\n * It can be modified to trigger a new compilation\r\n */\r\n public set shaderPath(shaderPath: IShaderPath | string) {\r\n this._shaderPath = shaderPath;\r\n }\r\n\r\n /**\r\n * Gets the options used to compile the shader.\r\n * They can be modified to trigger a new compilation\r\n */\r\n public get options(): IShaderMaterialOptions {\r\n return this._options;\r\n }\r\n\r\n /**\r\n * is multiview set to true?\r\n */\r\n public get isMultiview(): boolean {\r\n return this._multiview;\r\n }\r\n\r\n /**\r\n * Gets the current class name of the material e.g. \"ShaderMaterial\"\r\n * Mainly use in serialization.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"ShaderMaterial\";\r\n }\r\n\r\n /**\r\n * Specifies if the material will require alpha blending\r\n * @returns a boolean specifying if alpha blending is needed\r\n */\r\n public needAlphaBlending(): boolean {\r\n return this.alpha < 1.0 || this._options.needAlphaBlending;\r\n }\r\n\r\n /**\r\n * Specifies if this material should be rendered in alpha test mode\r\n * @returns a boolean specifying if an alpha test is needed.\r\n */\r\n public needAlphaTesting(): boolean {\r\n return this._options.needAlphaTesting;\r\n }\r\n\r\n private _checkUniform(uniformName: string): void {\r\n if (this._options.uniforms.indexOf(uniformName) === -1) {\r\n this._options.uniforms.push(uniformName);\r\n }\r\n }\r\n\r\n /**\r\n * Set a texture in the shader.\r\n * @param name Define the name of the uniform samplers as defined in the shader\r\n * @param texture Define the texture to bind to this sampler\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setTexture(name: string, texture: BaseTexture): ShaderMaterial {\r\n if (this._options.samplers.indexOf(name) === -1) {\r\n this._options.samplers.push(name);\r\n }\r\n this._textures[name] = texture;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a texture array in the shader.\r\n * @param name Define the name of the uniform sampler array as defined in the shader\r\n * @param textures Define the list of textures to bind to this sampler\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setTextureArray(name: string, textures: BaseTexture[]): ShaderMaterial {\r\n if (this._options.samplers.indexOf(name) === -1) {\r\n this._options.samplers.push(name);\r\n }\r\n\r\n this._checkUniform(name);\r\n\r\n this._textureArrays[name] = textures;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set an internal texture in the shader.\r\n * @param name Define the name of the uniform samplers as defined in the shader\r\n * @param texture Define the texture to bind to this sampler\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setExternalTexture(name: string, texture: ExternalTexture): ShaderMaterial {\r\n if (this._options.externalTextures.indexOf(name) === -1) {\r\n this._options.externalTextures.push(name);\r\n }\r\n this._externalTextures[name] = texture;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a float in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setFloat(name: string, value: number): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._floats[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a int in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setInt(name: string, value: number): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._ints[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a unsigned int in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setUInt(name: string, value: number): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._uints[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set an array of floats in the shader.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setFloats(name: string, value: number[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._floatsArrays[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec3 in the shader from a Color3.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setColor3(name: string, value: Color3): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._colors3[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec3 array in the shader from a Color3 array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setColor3Array(name: string, value: Color3[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._colors3Arrays[name] = value.reduce((arr, color) => {\r\n color.toArray(arr, arr.length);\r\n return arr;\r\n }, []);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 in the shader from a Color4.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setColor4(name: string, value: Color4): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._colors4[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 array in the shader from a Color4 array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setColor4Array(name: string, value: Color4[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._colors4Arrays[name] = value.reduce((arr, color) => {\r\n color.toArray(arr, arr.length);\r\n return arr;\r\n }, []);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec2 in the shader from a Vector2.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setVector2(name: string, value: Vector2): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._vectors2[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec3 in the shader from a Vector3.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setVector3(name: string, value: Vector3): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._vectors3[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 in the shader from a Vector4.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setVector4(name: string, value: Vector4): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._vectors4[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 in the shader from a Quaternion.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setQuaternion(name: string, value: Quaternion): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._quaternions[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 array in the shader from a Quaternion array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setQuaternionArray(name: string, value: Quaternion[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._quaternionsArrays[name] = value.reduce((arr, quaternion) => {\r\n quaternion.toArray(arr, arr.length);\r\n return arr;\r\n }, []);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a mat4 in the shader from a Matrix.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setMatrix(name: string, value: Matrix): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._matrices[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a float32Array in the shader from a matrix array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setMatrices(name: string, value: Matrix[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n\r\n const float32Array = new Float32Array(value.length * 16);\r\n\r\n for (let index = 0; index < value.length; index++) {\r\n const matrix = value[index];\r\n\r\n matrix.copyToArray(float32Array, index * 16);\r\n }\r\n\r\n this._matrixArrays[name] = float32Array;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a mat3 in the shader from a Float32Array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setMatrix3x3(name: string, value: Float32Array | Array): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._matrices3x3[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a mat2 in the shader from a Float32Array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setMatrix2x2(name: string, value: Float32Array | Array): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._matrices2x2[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec2 array in the shader from a number array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setArray2(name: string, value: number[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._vectors2Arrays[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec3 array in the shader from a number array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setArray3(name: string, value: number[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._vectors3Arrays[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a vec4 array in the shader from a number array.\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param value Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setArray4(name: string, value: number[]): ShaderMaterial {\r\n this._checkUniform(name);\r\n this._vectors4Arrays[name] = value;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a uniform buffer in the shader\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param buffer Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setUniformBuffer(name: string, buffer: UniformBuffer): ShaderMaterial {\r\n if (this._options.uniformBuffers.indexOf(name) === -1) {\r\n this._options.uniformBuffers.push(name);\r\n }\r\n this._uniformBuffers[name] = buffer;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a texture sampler in the shader\r\n * @param name Define the name of the uniform as defined in the shader\r\n * @param sampler Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setTextureSampler(name: string, sampler: TextureSampler): ShaderMaterial {\r\n if (this._options.samplerObjects.indexOf(name) === -1) {\r\n this._options.samplerObjects.push(name);\r\n }\r\n this._textureSamplers[name] = sampler;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a storage buffer in the shader\r\n * @param name Define the name of the storage buffer as defined in the shader\r\n * @param buffer Define the value to give to the uniform\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setStorageBuffer(name: string, buffer: StorageBuffer): ShaderMaterial {\r\n if (this._options.storageBuffers.indexOf(name) === -1) {\r\n this._options.storageBuffers.push(name);\r\n }\r\n this._storageBuffers[name] = buffer;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds, removes, or replaces the specified shader define and value.\r\n * * setDefine(\"MY_DEFINE\", true); // enables a boolean define\r\n * * setDefine(\"MY_DEFINE\", \"0.5\"); // adds \"#define MY_DEFINE 0.5\" to the shader (or sets and replaces the value of any existing define with that name)\r\n * * setDefine(\"MY_DEFINE\", false); // disables and removes the define\r\n * Note if the active defines do change, the shader will be recompiled and this can be expensive.\r\n * @param define the define name e.g., \"OUTPUT_TO_SRGB\" or \"#define OUTPUT_TO_SRGB\". If the define was passed into the constructor already, the version used should match that, and in either case, it should not include any appended value.\r\n * @param value either the value of the define (e.g. a numerical value) or for booleans, true if the define should be enabled or false if it should be disabled\r\n * @returns the material itself allowing \"fluent\" like uniform updates\r\n */\r\n public setDefine(define: string, value: boolean | string): ShaderMaterial {\r\n // First remove any existing define with this name.\r\n const defineName = define.trimEnd() + \" \";\r\n const existingDefineIdx = this.options.defines.findIndex((x) => x === define || x.startsWith(defineName));\r\n if (existingDefineIdx >= 0) {\r\n this.options.defines.splice(existingDefineIdx, 1);\r\n }\r\n\r\n // Then add the new define value. (If it's a boolean value and false, don't add it.)\r\n if (typeof value !== \"boolean\" || value) {\r\n this.options.defines.push(defineName + value);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Specifies that the submesh is ready to be used\r\n * @param mesh defines the mesh to check\r\n * @param subMesh defines which submesh to check\r\n * @param useInstances specifies that instances should be used\r\n * @returns a boolean indicating that the submesh is ready or not\r\n */\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean {\r\n return this.isReady(mesh, useInstances, subMesh);\r\n }\r\n\r\n /**\r\n * Checks if the material is ready to render the requested mesh\r\n * @param mesh Define the mesh to render\r\n * @param useInstances Define whether or not the material is used with instances\r\n * @param subMesh defines which submesh to render\r\n * @returns true if ready, otherwise false\r\n */\r\n public isReady(mesh?: AbstractMesh, useInstances?: boolean, subMesh?: SubMesh): boolean {\r\n const storeEffectOnSubMeshes = subMesh && this._storeEffectOnSubMeshes;\r\n\r\n if (this.isFrozen) {\r\n const drawWrapper = storeEffectOnSubMeshes ? subMesh._drawWrapper : this._drawWrapper;\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n const scene = this.getScene();\r\n const engine = scene.getEngine();\r\n\r\n // Instances\r\n const defines = [];\r\n const attribs = [];\r\n const fallbacks = new EffectFallbacks();\r\n\r\n let shaderName = this._shaderPath,\r\n uniforms = this._options.uniforms,\r\n uniformBuffers = this._options.uniformBuffers,\r\n samplers = this._options.samplers;\r\n\r\n // global multiview\r\n if (engine.getCaps().multiview && scene.activeCamera && scene.activeCamera.outputRenderTarget && scene.activeCamera.outputRenderTarget.getViewCount() > 1) {\r\n this._multiview = true;\r\n defines.push(\"#define MULTIVIEW\");\r\n if (uniforms.indexOf(\"viewProjection\") !== -1 && uniforms.indexOf(\"viewProjectionR\") === -1) {\r\n uniforms.push(\"viewProjectionR\");\r\n }\r\n }\r\n\r\n for (let index = 0; index < this._options.defines.length; index++) {\r\n const defineToAdd = this._options.defines[index].indexOf(\"#define\") === 0 ? this._options.defines[index] : `#define ${this._options.defines[index]}`;\r\n defines.push(defineToAdd);\r\n }\r\n\r\n for (let index = 0; index < this._options.attributes.length; index++) {\r\n attribs.push(this._options.attributes[index]);\r\n }\r\n\r\n if (mesh && mesh.isVerticesDataPresent(VertexBuffer.ColorKind)) {\r\n if (attribs.indexOf(VertexBuffer.ColorKind) === -1) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n defines.push(\"#define VERTEXCOLOR\");\r\n }\r\n\r\n if (useInstances) {\r\n defines.push(\"#define INSTANCES\");\r\n PushAttributesForInstances(attribs, this._materialHelperNeedsPreviousMatrices);\r\n if (mesh?.hasThinInstances) {\r\n defines.push(\"#define THIN_INSTANCES\");\r\n if (mesh && mesh.isVerticesDataPresent(VertexBuffer.ColorInstanceKind)) {\r\n attribs.push(VertexBuffer.ColorInstanceKind);\r\n defines.push(\"#define INSTANCESCOLOR\");\r\n }\r\n }\r\n }\r\n\r\n // Bones\r\n if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n attribs.push(VertexBuffer.MatricesIndicesKind);\r\n attribs.push(VertexBuffer.MatricesWeightsKind);\r\n if (mesh.numBoneInfluencers > 4) {\r\n attribs.push(VertexBuffer.MatricesIndicesExtraKind);\r\n attribs.push(VertexBuffer.MatricesWeightsExtraKind);\r\n }\r\n\r\n const skeleton = mesh.skeleton;\r\n\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n fallbacks.addCPUSkinningFallback(0, mesh);\r\n\r\n if (skeleton.isUsingTextureForMatrices) {\r\n defines.push(\"#define BONETEXTURE\");\r\n\r\n if (uniforms.indexOf(\"boneTextureWidth\") === -1) {\r\n uniforms.push(\"boneTextureWidth\");\r\n }\r\n\r\n if (this._options.samplers.indexOf(\"boneSampler\") === -1) {\r\n this._options.samplers.push(\"boneSampler\");\r\n }\r\n } else {\r\n defines.push(\"#define BonesPerMesh \" + (skeleton.bones.length + 1));\r\n\r\n if (uniforms.indexOf(\"mBones\") === -1) {\r\n uniforms.push(\"mBones\");\r\n }\r\n }\r\n } else {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\r\n }\r\n\r\n // Morph\r\n let numInfluencers = 0;\r\n const manager = mesh ? (mesh).morphTargetManager : null;\r\n if (manager) {\r\n const uv = manager.supportsUVs && defines.indexOf(\"#define UV1\") !== -1;\r\n const tangent = manager.supportsTangents && defines.indexOf(\"#define TANGENT\") !== -1;\r\n const normal = manager.supportsNormals && defines.indexOf(\"#define NORMAL\") !== -1;\r\n numInfluencers = manager.numMaxInfluencers || manager.numInfluencers;\r\n if (uv) {\r\n defines.push(\"#define MORPHTARGETS_UV\");\r\n }\r\n if (tangent) {\r\n defines.push(\"#define MORPHTARGETS_TANGENT\");\r\n }\r\n if (normal) {\r\n defines.push(\"#define MORPHTARGETS_NORMAL\");\r\n }\r\n if (numInfluencers > 0) {\r\n defines.push(\"#define MORPHTARGETS\");\r\n }\r\n if (manager.isUsingTextureForTargets) {\r\n defines.push(\"#define MORPHTARGETS_TEXTURE\");\r\n\r\n if (uniforms.indexOf(\"morphTargetTextureIndices\") === -1) {\r\n uniforms.push(\"morphTargetTextureIndices\");\r\n }\r\n\r\n if (this._options.samplers.indexOf(\"morphTargets\") === -1) {\r\n this._options.samplers.push(\"morphTargets\");\r\n }\r\n }\r\n defines.push(\"#define NUM_MORPH_INFLUENCERS \" + numInfluencers);\r\n for (let index = 0; index < numInfluencers; index++) {\r\n attribs.push(VertexBuffer.PositionKind + index);\r\n\r\n if (normal) {\r\n attribs.push(VertexBuffer.NormalKind + index);\r\n }\r\n\r\n if (tangent) {\r\n attribs.push(VertexBuffer.TangentKind + index);\r\n }\r\n\r\n if (uv) {\r\n attribs.push(VertexBuffer.UVKind + \"_\" + index);\r\n }\r\n }\r\n if (numInfluencers > 0) {\r\n uniforms = uniforms.slice();\r\n uniforms.push(\"morphTargetInfluences\");\r\n uniforms.push(\"morphTargetCount\");\r\n uniforms.push(\"morphTargetTextureInfo\");\r\n uniforms.push(\"morphTargetTextureIndices\");\r\n }\r\n } else {\r\n defines.push(\"#define NUM_MORPH_INFLUENCERS 0\");\r\n }\r\n\r\n // Baked Vertex Animation\r\n if (mesh) {\r\n const bvaManager = (mesh).bakedVertexAnimationManager;\r\n\r\n if (bvaManager && bvaManager.isEnabled) {\r\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\r\n if (uniforms.indexOf(\"bakedVertexAnimationSettings\") === -1) {\r\n uniforms.push(\"bakedVertexAnimationSettings\");\r\n }\r\n if (uniforms.indexOf(\"bakedVertexAnimationTextureSizeInverted\") === -1) {\r\n uniforms.push(\"bakedVertexAnimationTextureSizeInverted\");\r\n }\r\n if (uniforms.indexOf(\"bakedVertexAnimationTime\") === -1) {\r\n uniforms.push(\"bakedVertexAnimationTime\");\r\n }\r\n\r\n if (this._options.samplers.indexOf(\"bakedVertexAnimationTexture\") === -1) {\r\n this._options.samplers.push(\"bakedVertexAnimationTexture\");\r\n }\r\n }\r\n\r\n PrepareAttributesForBakedVertexAnimation(attribs, mesh, defines);\r\n }\r\n\r\n // Textures\r\n for (const name in this._textures) {\r\n if (!this._textures[name].isReady()) {\r\n return false;\r\n }\r\n }\r\n\r\n // Alpha test\r\n if (mesh && this._shouldTurnAlphaTestOn(mesh)) {\r\n defines.push(\"#define ALPHATEST\");\r\n }\r\n\r\n // Clip planes\r\n if (this._options.useClipPlane !== false) {\r\n addClipPlaneUniforms(uniforms);\r\n\r\n prepareStringDefinesForClipPlanes(this, scene, defines);\r\n }\r\n\r\n // Fog\r\n if (scene.fogEnabled && mesh?.applyFog && scene.fogMode !== Scene.FOGMODE_NONE) {\r\n defines.push(\"#define FOG\");\r\n if (uniforms.indexOf(\"view\") === -1) {\r\n uniforms.push(\"view\");\r\n }\r\n if (uniforms.indexOf(\"vFogInfos\") === -1) {\r\n uniforms.push(\"vFogInfos\");\r\n }\r\n if (uniforms.indexOf(\"vFogColor\") === -1) {\r\n uniforms.push(\"vFogColor\");\r\n }\r\n }\r\n\r\n // Misc\r\n if (this._useLogarithmicDepth) {\r\n defines.push(\"#define LOGARITHMICDEPTH\");\r\n if (uniforms.indexOf(\"logarithmicDepthConstant\") === -1) {\r\n uniforms.push(\"logarithmicDepthConstant\");\r\n }\r\n }\r\n\r\n if (this.customShaderNameResolve) {\r\n uniforms = uniforms.slice();\r\n uniformBuffers = uniformBuffers.slice();\r\n samplers = samplers.slice();\r\n shaderName = this.customShaderNameResolve(this.name, uniforms, uniformBuffers, samplers, defines, attribs);\r\n }\r\n\r\n const drawWrapper = storeEffectOnSubMeshes ? subMesh._getDrawWrapper(undefined, true) : this._drawWrapper;\r\n const previousEffect = drawWrapper?.effect ?? null;\r\n const previousDefines = drawWrapper?.defines ?? null;\r\n const join = defines.join(\"\\n\");\r\n\r\n let effect = previousEffect;\r\n if (previousDefines !== join) {\r\n effect = engine.createEffect(\r\n shaderName,\r\n {\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { maxSimultaneousMorphTargets: numInfluencers },\r\n shaderLanguage: this._options.shaderLanguage,\r\n },\r\n engine\r\n );\r\n\r\n if (storeEffectOnSubMeshes) {\r\n subMesh.setEffect(effect, join, this._materialContext);\r\n } else if (drawWrapper) {\r\n drawWrapper.setEffect(effect, join);\r\n }\r\n\r\n if (this._onEffectCreatedObservable) {\r\n onCreatedEffectParameters.effect = effect;\r\n onCreatedEffectParameters.subMesh = subMesh ?? mesh?.subMeshes[0] ?? null;\r\n this._onEffectCreatedObservable.notifyObservers(onCreatedEffectParameters);\r\n }\r\n }\r\n\r\n drawWrapper!._wasPreviouslyUsingInstances = !!useInstances;\r\n\r\n if (!effect?.isReady() ?? true) {\r\n return false;\r\n }\r\n\r\n if (previousEffect !== effect) {\r\n scene.resetCachedMaterial();\r\n }\r\n\r\n drawWrapper!._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Binds the world matrix to the material\r\n * @param world defines the world transformation matrix\r\n * @param effectOverride - If provided, use this effect instead of internal effect\r\n */\r\n public bindOnlyWorldMatrix(world: Matrix, effectOverride?: Nullable): void {\r\n const scene = this.getScene();\r\n\r\n const effect = effectOverride ?? this.getEffect();\r\n\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n if (this._options.uniforms.indexOf(\"world\") !== -1) {\r\n effect.setMatrix(\"world\", world);\r\n }\r\n\r\n if (this._options.uniforms.indexOf(\"worldView\") !== -1) {\r\n world.multiplyToRef(scene.getViewMatrix(), this._cachedWorldViewMatrix);\r\n effect.setMatrix(\"worldView\", this._cachedWorldViewMatrix);\r\n }\r\n\r\n if (this._options.uniforms.indexOf(\"worldViewProjection\") !== -1) {\r\n world.multiplyToRef(scene.getTransformMatrix(), this._cachedWorldViewProjectionMatrix);\r\n effect.setMatrix(\"worldViewProjection\", this._cachedWorldViewProjectionMatrix);\r\n }\r\n\r\n if (this._options.uniforms.indexOf(\"view\") !== -1) {\r\n effect.setMatrix(\"view\", scene.getViewMatrix());\r\n }\r\n }\r\n\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n this.bind(world, mesh, subMesh._drawWrapperOverride?.effect, subMesh);\r\n }\r\n\r\n /**\r\n * Binds the material to the mesh\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh to bind the material to\r\n * @param effectOverride - If provided, use this effect instead of internal effect\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public bind(world: Matrix, mesh?: Mesh, effectOverride?: Nullable, subMesh?: SubMesh): void {\r\n // Std values\r\n const storeEffectOnSubMeshes = subMesh && this._storeEffectOnSubMeshes;\r\n const effect = effectOverride ?? (storeEffectOnSubMeshes ? subMesh.effect : this.getEffect());\r\n\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n this._activeEffect = effect;\r\n\r\n this.bindOnlyWorldMatrix(world, effectOverride);\r\n\r\n const uniformBuffers = this._options.uniformBuffers;\r\n\r\n let useSceneUBO = false;\r\n\r\n if (effect && uniformBuffers && uniformBuffers.length > 0 && scene.getEngine().supportsUniformBuffers) {\r\n for (let i = 0; i < uniformBuffers.length; ++i) {\r\n const bufferName = uniformBuffers[i];\r\n switch (bufferName) {\r\n case \"Mesh\":\r\n if (mesh) {\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n mesh.transferToEffect(world);\r\n }\r\n break;\r\n case \"Scene\":\r\n BindSceneUniformBuffer(effect, scene.getSceneUniformBuffer());\r\n scene.finalizeSceneUbo();\r\n useSceneUBO = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const mustRebind = mesh && storeEffectOnSubMeshes ? this._mustRebind(scene, effect, subMesh, mesh.visibility) : scene.getCachedMaterial() !== this;\r\n\r\n if (effect && mustRebind) {\r\n if (!useSceneUBO && this._options.uniforms.indexOf(\"view\") !== -1) {\r\n effect.setMatrix(\"view\", scene.getViewMatrix());\r\n }\r\n\r\n if (!useSceneUBO && this._options.uniforms.indexOf(\"projection\") !== -1) {\r\n effect.setMatrix(\"projection\", scene.getProjectionMatrix());\r\n }\r\n\r\n if (!useSceneUBO && this._options.uniforms.indexOf(\"viewProjection\") !== -1) {\r\n effect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n if (this._multiview) {\r\n effect.setMatrix(\"viewProjectionR\", scene._transformMatrixR);\r\n }\r\n }\r\n\r\n if (scene.activeCamera && this._options.uniforms.indexOf(\"cameraPosition\") !== -1) {\r\n effect.setVector3(\"cameraPosition\", scene.activeCamera!.globalPosition);\r\n }\r\n\r\n // Bones\r\n BindBonesParameters(mesh, effect);\r\n\r\n // Clip plane\r\n bindClipPlane(effect, this, scene);\r\n\r\n // Misc\r\n if (this._useLogarithmicDepth) {\r\n BindLogDepth(storeEffectOnSubMeshes ? subMesh.materialDefines : effect.defines, effect, scene);\r\n }\r\n\r\n // Fog\r\n if (mesh) {\r\n BindFogParameters(scene, mesh, effect);\r\n }\r\n\r\n let name: string;\r\n // Texture\r\n for (name in this._textures) {\r\n effect.setTexture(name, this._textures[name]);\r\n }\r\n\r\n // Texture arrays\r\n for (name in this._textureArrays) {\r\n effect.setTextureArray(name, this._textureArrays[name]);\r\n }\r\n\r\n // External texture\r\n for (name in this._externalTextures) {\r\n effect.setExternalTexture(name, this._externalTextures[name]);\r\n }\r\n\r\n // Int\r\n for (name in this._ints) {\r\n effect.setInt(name, this._ints[name]);\r\n }\r\n\r\n // UInt\r\n for (name in this._uints) {\r\n effect.setUInt(name, this._uints[name]);\r\n }\r\n\r\n // Float\r\n for (name in this._floats) {\r\n effect.setFloat(name, this._floats[name]);\r\n }\r\n\r\n // Floats\r\n for (name in this._floatsArrays) {\r\n effect.setArray(name, this._floatsArrays[name]);\r\n }\r\n\r\n // Color3\r\n for (name in this._colors3) {\r\n effect.setColor3(name, this._colors3[name]);\r\n }\r\n\r\n // Color3Array\r\n for (name in this._colors3Arrays) {\r\n effect.setArray3(name, this._colors3Arrays[name]);\r\n }\r\n\r\n // Color4\r\n for (name in this._colors4) {\r\n const color = this._colors4[name];\r\n effect.setFloat4(name, color.r, color.g, color.b, color.a);\r\n }\r\n\r\n // Color4Array\r\n for (name in this._colors4Arrays) {\r\n effect.setArray4(name, this._colors4Arrays[name]);\r\n }\r\n\r\n // Vector2\r\n for (name in this._vectors2) {\r\n effect.setVector2(name, this._vectors2[name]);\r\n }\r\n\r\n // Vector3\r\n for (name in this._vectors3) {\r\n effect.setVector3(name, this._vectors3[name]);\r\n }\r\n\r\n // Vector4\r\n for (name in this._vectors4) {\r\n effect.setVector4(name, this._vectors4[name]);\r\n }\r\n\r\n // Quaternion\r\n for (name in this._quaternions) {\r\n effect.setQuaternion(name, this._quaternions[name]);\r\n }\r\n\r\n // Matrix\r\n for (name in this._matrices) {\r\n effect.setMatrix(name, this._matrices[name]);\r\n }\r\n\r\n // MatrixArray\r\n for (name in this._matrixArrays) {\r\n effect.setMatrices(name, this._matrixArrays[name]);\r\n }\r\n\r\n // Matrix 3x3\r\n for (name in this._matrices3x3) {\r\n effect.setMatrix3x3(name, this._matrices3x3[name]);\r\n }\r\n\r\n // Matrix 2x2\r\n for (name in this._matrices2x2) {\r\n effect.setMatrix2x2(name, this._matrices2x2[name]);\r\n }\r\n\r\n // Vector2Array\r\n for (name in this._vectors2Arrays) {\r\n effect.setArray2(name, this._vectors2Arrays[name]);\r\n }\r\n\r\n // Vector3Array\r\n for (name in this._vectors3Arrays) {\r\n effect.setArray3(name, this._vectors3Arrays[name]);\r\n }\r\n\r\n // Vector4Array\r\n for (name in this._vectors4Arrays) {\r\n effect.setArray4(name, this._vectors4Arrays[name]);\r\n }\r\n\r\n // QuaternionArray\r\n for (name in this._quaternionsArrays) {\r\n effect.setArray4(name, this._quaternionsArrays[name]);\r\n }\r\n\r\n // Uniform buffers\r\n for (name in this._uniformBuffers) {\r\n const buffer = this._uniformBuffers[name].getBuffer();\r\n if (buffer) {\r\n effect.bindUniformBuffer(buffer, name);\r\n }\r\n }\r\n\r\n // Samplers\r\n for (name in this._textureSamplers) {\r\n effect.setTextureSampler(name, this._textureSamplers[name]);\r\n }\r\n\r\n // Storage buffers\r\n for (name in this._storageBuffers) {\r\n effect.setStorageBuffer(name, this._storageBuffers[name]);\r\n }\r\n }\r\n\r\n if (effect && mesh && (mustRebind || !this.isFrozen)) {\r\n // Morph targets\r\n const manager = (mesh).morphTargetManager;\r\n if (manager && manager.numInfluencers > 0) {\r\n BindMorphTargetParameters(mesh, effect);\r\n }\r\n\r\n const bvaManager = (mesh).bakedVertexAnimationManager;\r\n\r\n if (bvaManager && bvaManager.isEnabled) {\r\n const drawWrapper = storeEffectOnSubMeshes ? subMesh._drawWrapper : this._drawWrapper;\r\n mesh.bakedVertexAnimationManager?.bind(effect, !!drawWrapper._wasPreviouslyUsingInstances);\r\n }\r\n }\r\n\r\n this._afterBind(mesh, effect, subMesh);\r\n }\r\n\r\n /**\r\n * Gets the active textures from the material\r\n * @returns an array of textures\r\n */\r\n public getActiveTextures(): BaseTexture[] {\r\n const activeTextures = super.getActiveTextures();\r\n\r\n for (const name in this._textures) {\r\n activeTextures.push(this._textures[name]);\r\n }\r\n\r\n for (const name in this._textureArrays) {\r\n const array = this._textureArrays[name];\r\n for (let index = 0; index < array.length; index++) {\r\n activeTextures.push(array[index]);\r\n }\r\n }\r\n\r\n return activeTextures;\r\n }\r\n\r\n /**\r\n * Specifies if the material uses a texture\r\n * @param texture defines the texture to check against the material\r\n * @returns a boolean specifying if the material uses the texture\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n if (super.hasTexture(texture)) {\r\n return true;\r\n }\r\n\r\n for (const name in this._textures) {\r\n if (this._textures[name] === texture) {\r\n return true;\r\n }\r\n }\r\n\r\n for (const name in this._textureArrays) {\r\n const array = this._textureArrays[name];\r\n for (let index = 0; index < array.length; index++) {\r\n if (array[index] === texture) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the material, and gives it a new name\r\n * @param name defines the new name for the duplicated material\r\n * @returns the cloned material\r\n */\r\n public clone(name: string): ShaderMaterial {\r\n const result = SerializationHelper.Clone(() => new ShaderMaterial(name, this.getScene(), this._shaderPath, this._options, this._storeEffectOnSubMeshes), this);\r\n\r\n result.name = name;\r\n result.id = name;\r\n\r\n // Shader code path\r\n if (typeof result._shaderPath === \"object\") {\r\n result._shaderPath = { ...result._shaderPath };\r\n }\r\n\r\n // Options\r\n this._options = { ...this._options };\r\n\r\n (Object.keys(this._options) as Array).forEach((propName) => {\r\n const propValue = this._options[propName];\r\n if (Array.isArray(propValue)) {\r\n (this._options[propName]) = propValue.slice(0);\r\n }\r\n });\r\n\r\n // Stencil\r\n this.stencil.copyTo(result.stencil);\r\n\r\n // Texture\r\n for (const key in this._textures) {\r\n result.setTexture(key, this._textures[key]);\r\n }\r\n\r\n // TextureArray\r\n for (const key in this._textureArrays) {\r\n result.setTextureArray(key, this._textureArrays[key]);\r\n }\r\n\r\n // External texture\r\n for (const key in this._externalTextures) {\r\n result.setExternalTexture(key, this._externalTextures[key]);\r\n }\r\n\r\n // Int\r\n for (const key in this._ints) {\r\n result.setInt(key, this._ints[key]);\r\n }\r\n\r\n // UInt\r\n for (const key in this._uints) {\r\n result.setUInt(key, this._uints[key]);\r\n }\r\n\r\n // Float\r\n for (const key in this._floats) {\r\n result.setFloat(key, this._floats[key]);\r\n }\r\n\r\n // Floats\r\n for (const key in this._floatsArrays) {\r\n result.setFloats(key, this._floatsArrays[key]);\r\n }\r\n\r\n // Color3\r\n for (const key in this._colors3) {\r\n result.setColor3(key, this._colors3[key]);\r\n }\r\n\r\n // Color3Array\r\n for (const key in this._colors3Arrays) {\r\n result._colors3Arrays[key] = this._colors3Arrays[key];\r\n }\r\n\r\n // Color4\r\n for (const key in this._colors4) {\r\n result.setColor4(key, this._colors4[key]);\r\n }\r\n\r\n // Color4Array\r\n for (const key in this._colors4Arrays) {\r\n result._colors4Arrays[key] = this._colors4Arrays[key];\r\n }\r\n\r\n // Vector2\r\n for (const key in this._vectors2) {\r\n result.setVector2(key, this._vectors2[key]);\r\n }\r\n\r\n // Vector3\r\n for (const key in this._vectors3) {\r\n result.setVector3(key, this._vectors3[key]);\r\n }\r\n\r\n // Vector4\r\n for (const key in this._vectors4) {\r\n result.setVector4(key, this._vectors4[key]);\r\n }\r\n\r\n // Quaternion\r\n for (const key in this._quaternions) {\r\n result.setQuaternion(key, this._quaternions[key]);\r\n }\r\n\r\n // QuaternionArray\r\n for (const key in this._quaternionsArrays) {\r\n result._quaternionsArrays[key] = this._quaternionsArrays[key];\r\n }\r\n\r\n // Matrix\r\n for (const key in this._matrices) {\r\n result.setMatrix(key, this._matrices[key]);\r\n }\r\n\r\n // MatrixArray\r\n for (const key in this._matrixArrays) {\r\n result._matrixArrays[key] = this._matrixArrays[key].slice();\r\n }\r\n\r\n // Matrix 3x3\r\n for (const key in this._matrices3x3) {\r\n result.setMatrix3x3(key, this._matrices3x3[key]);\r\n }\r\n\r\n // Matrix 2x2\r\n for (const key in this._matrices2x2) {\r\n result.setMatrix2x2(key, this._matrices2x2[key]);\r\n }\r\n\r\n // Vector2Array\r\n for (const key in this._vectors2Arrays) {\r\n result.setArray2(key, this._vectors2Arrays[key]);\r\n }\r\n\r\n // Vector3Array\r\n for (const key in this._vectors3Arrays) {\r\n result.setArray3(key, this._vectors3Arrays[key]);\r\n }\r\n\r\n // Vector4Array\r\n for (const key in this._vectors4Arrays) {\r\n result.setArray4(key, this._vectors4Arrays[key]);\r\n }\r\n\r\n // Uniform buffers\r\n for (const key in this._uniformBuffers) {\r\n result.setUniformBuffer(key, this._uniformBuffers[key]);\r\n }\r\n\r\n // Samplers\r\n for (const key in this._textureSamplers) {\r\n result.setTextureSampler(key, this._textureSamplers[key]);\r\n }\r\n\r\n // Storag buffers\r\n for (const key in this._storageBuffers) {\r\n result.setStorageBuffer(key, this._storageBuffers[key]);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Disposes the material\r\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\r\n * @param forceDisposeTextures specifies if textures should be forcefully disposed\r\n * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh\r\n */\r\n public dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean): void {\r\n if (forceDisposeTextures) {\r\n let name: string;\r\n for (name in this._textures) {\r\n this._textures[name].dispose();\r\n }\r\n\r\n for (name in this._textureArrays) {\r\n const array = this._textureArrays[name];\r\n for (let index = 0; index < array.length; index++) {\r\n array[index].dispose();\r\n }\r\n }\r\n }\r\n\r\n this._textures = {};\r\n\r\n super.dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh);\r\n }\r\n\r\n /**\r\n * Serializes this material in a JSON representation\r\n * @returns the serialized material object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"BABYLON.ShaderMaterial\";\r\n serializationObject.uniqueId = this.uniqueId;\r\n\r\n serializationObject.options = this._options;\r\n serializationObject.shaderPath = this._shaderPath;\r\n serializationObject.storeEffectOnSubMeshes = this._storeEffectOnSubMeshes;\r\n\r\n let name: string;\r\n\r\n // Stencil\r\n serializationObject.stencil = this.stencil.serialize();\r\n\r\n // Texture\r\n serializationObject.textures = {};\r\n for (name in this._textures) {\r\n serializationObject.textures[name] = this._textures[name].serialize();\r\n }\r\n\r\n // Texture arrays\r\n serializationObject.textureArrays = {};\r\n for (name in this._textureArrays) {\r\n serializationObject.textureArrays[name] = [];\r\n const array = this._textureArrays[name];\r\n for (let index = 0; index < array.length; index++) {\r\n serializationObject.textureArrays[name].push(array[index].serialize());\r\n }\r\n }\r\n\r\n // Int\r\n serializationObject.ints = {};\r\n for (name in this._ints) {\r\n serializationObject.ints[name] = this._ints[name];\r\n }\r\n\r\n // UInt\r\n serializationObject.uints = {};\r\n for (name in this._uints) {\r\n serializationObject.uints[name] = this._uints[name];\r\n }\r\n\r\n // Float\r\n serializationObject.floats = {};\r\n for (name in this._floats) {\r\n serializationObject.floats[name] = this._floats[name];\r\n }\r\n\r\n // Floats\r\n serializationObject.floatsArrays = {};\r\n for (name in this._floatsArrays) {\r\n serializationObject.floatsArrays[name] = this._floatsArrays[name];\r\n }\r\n\r\n // Color3\r\n serializationObject.colors3 = {};\r\n for (name in this._colors3) {\r\n serializationObject.colors3[name] = this._colors3[name].asArray();\r\n }\r\n\r\n // Color3 array\r\n serializationObject.colors3Arrays = {};\r\n for (name in this._colors3Arrays) {\r\n serializationObject.colors3Arrays[name] = this._colors3Arrays[name];\r\n }\r\n\r\n // Color4\r\n serializationObject.colors4 = {};\r\n for (name in this._colors4) {\r\n serializationObject.colors4[name] = this._colors4[name].asArray();\r\n }\r\n\r\n // Color4 array\r\n serializationObject.colors4Arrays = {};\r\n for (name in this._colors4Arrays) {\r\n serializationObject.colors4Arrays[name] = this._colors4Arrays[name];\r\n }\r\n\r\n // Vector2\r\n serializationObject.vectors2 = {};\r\n for (name in this._vectors2) {\r\n serializationObject.vectors2[name] = this._vectors2[name].asArray();\r\n }\r\n\r\n // Vector3\r\n serializationObject.vectors3 = {};\r\n for (name in this._vectors3) {\r\n serializationObject.vectors3[name] = this._vectors3[name].asArray();\r\n }\r\n\r\n // Vector4\r\n serializationObject.vectors4 = {};\r\n for (name in this._vectors4) {\r\n serializationObject.vectors4[name] = this._vectors4[name].asArray();\r\n }\r\n\r\n // Quaternion\r\n serializationObject.quaternions = {};\r\n for (name in this._quaternions) {\r\n serializationObject.quaternions[name] = this._quaternions[name].asArray();\r\n }\r\n\r\n // Matrix\r\n serializationObject.matrices = {};\r\n for (name in this._matrices) {\r\n serializationObject.matrices[name] = this._matrices[name].asArray();\r\n }\r\n\r\n // MatrixArray\r\n serializationObject.matrixArray = {};\r\n for (name in this._matrixArrays) {\r\n serializationObject.matrixArray[name] = this._matrixArrays[name];\r\n }\r\n\r\n // Matrix 3x3\r\n serializationObject.matrices3x3 = {};\r\n for (name in this._matrices3x3) {\r\n serializationObject.matrices3x3[name] = this._matrices3x3[name];\r\n }\r\n\r\n // Matrix 2x2\r\n serializationObject.matrices2x2 = {};\r\n for (name in this._matrices2x2) {\r\n serializationObject.matrices2x2[name] = this._matrices2x2[name];\r\n }\r\n\r\n // Vector2Array\r\n serializationObject.vectors2Arrays = {};\r\n for (name in this._vectors2Arrays) {\r\n serializationObject.vectors2Arrays[name] = this._vectors2Arrays[name];\r\n }\r\n\r\n // Vector3Array\r\n serializationObject.vectors3Arrays = {};\r\n for (name in this._vectors3Arrays) {\r\n serializationObject.vectors3Arrays[name] = this._vectors3Arrays[name];\r\n }\r\n\r\n // Vector4Array\r\n serializationObject.vectors4Arrays = {};\r\n for (name in this._vectors4Arrays) {\r\n serializationObject.vectors4Arrays[name] = this._vectors4Arrays[name];\r\n }\r\n\r\n // QuaternionArray\r\n serializationObject.quaternionsArrays = {};\r\n for (name in this._quaternionsArrays) {\r\n serializationObject.quaternionsArrays[name] = this._quaternionsArrays[name];\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Creates a shader material from parsed shader material data\r\n * @param source defines the JSON representation of the material\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a new material\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): ShaderMaterial {\r\n const material = SerializationHelper.Parse(\r\n () => new ShaderMaterial(source.name, scene, source.shaderPath, source.options, source.storeEffectOnSubMeshes),\r\n source,\r\n scene,\r\n rootUrl\r\n );\r\n\r\n let name: string;\r\n\r\n // Stencil\r\n if (source.stencil) {\r\n material.stencil.parse(source.stencil, scene, rootUrl);\r\n }\r\n\r\n // Texture\r\n for (name in source.textures) {\r\n material.setTexture(name, Texture.Parse(source.textures[name], scene, rootUrl));\r\n }\r\n\r\n // Texture arrays\r\n for (name in source.textureArrays) {\r\n const array = source.textureArrays[name];\r\n const textureArray: Texture[] = [];\r\n\r\n for (let index = 0; index < array.length; index++) {\r\n textureArray.push(Texture.Parse(array[index], scene, rootUrl));\r\n }\r\n material.setTextureArray(name, textureArray);\r\n }\r\n\r\n // Int\r\n for (name in source.ints) {\r\n material.setInt(name, source.ints[name]);\r\n }\r\n\r\n // UInt\r\n for (name in source.uints) {\r\n material.setUInt(name, source.uints[name]);\r\n }\r\n\r\n // Float\r\n for (name in source.floats) {\r\n material.setFloat(name, source.floats[name]);\r\n }\r\n\r\n // Floats\r\n for (name in source.floatsArrays) {\r\n material.setFloats(name, source.floatsArrays[name]);\r\n }\r\n\r\n // Color3\r\n for (name in source.colors3) {\r\n material.setColor3(name, Color3.FromArray(source.colors3[name]));\r\n }\r\n\r\n // Color3 arrays\r\n for (name in source.colors3Arrays) {\r\n const colors: Color3[] = source.colors3Arrays[name]\r\n .reduce((arr: Array>, num: number, i: number) => {\r\n if (i % 3 === 0) {\r\n arr.push([num]);\r\n } else {\r\n arr[arr.length - 1].push(num);\r\n }\r\n return arr;\r\n }, [])\r\n .map((color: ArrayLike) => Color3.FromArray(color));\r\n material.setColor3Array(name, colors);\r\n }\r\n\r\n // Color4\r\n for (name in source.colors4) {\r\n material.setColor4(name, Color4.FromArray(source.colors4[name]));\r\n }\r\n\r\n // Color4 arrays\r\n for (name in source.colors4Arrays) {\r\n const colors: Color4[] = source.colors4Arrays[name]\r\n .reduce((arr: Array>, num: number, i: number) => {\r\n if (i % 4 === 0) {\r\n arr.push([num]);\r\n } else {\r\n arr[arr.length - 1].push(num);\r\n }\r\n return arr;\r\n }, [])\r\n .map((color: ArrayLike) => Color4.FromArray(color));\r\n material.setColor4Array(name, colors);\r\n }\r\n\r\n // Vector2\r\n for (name in source.vectors2) {\r\n material.setVector2(name, Vector2.FromArray(source.vectors2[name]));\r\n }\r\n\r\n // Vector3\r\n for (name in source.vectors3) {\r\n material.setVector3(name, Vector3.FromArray(source.vectors3[name]));\r\n }\r\n\r\n // Vector4\r\n for (name in source.vectors4) {\r\n material.setVector4(name, Vector4.FromArray(source.vectors4[name]));\r\n }\r\n\r\n // Quaternion\r\n for (name in source.quaternions) {\r\n material.setQuaternion(name, Quaternion.FromArray(source.quaternions[name]));\r\n }\r\n\r\n // Matrix\r\n for (name in source.matrices) {\r\n material.setMatrix(name, Matrix.FromArray(source.matrices[name]));\r\n }\r\n\r\n // MatrixArray\r\n for (name in source.matrixArray) {\r\n material._matrixArrays[name] = new Float32Array(source.matrixArray[name]);\r\n }\r\n\r\n // Matrix 3x3\r\n for (name in source.matrices3x3) {\r\n material.setMatrix3x3(name, source.matrices3x3[name]);\r\n }\r\n\r\n // Matrix 2x2\r\n for (name in source.matrices2x2) {\r\n material.setMatrix2x2(name, source.matrices2x2[name]);\r\n }\r\n\r\n // Vector2Array\r\n for (name in source.vectors2Arrays) {\r\n material.setArray2(name, source.vectors2Arrays[name]);\r\n }\r\n\r\n // Vector3Array\r\n for (name in source.vectors3Arrays) {\r\n material.setArray3(name, source.vectors3Arrays[name]);\r\n }\r\n\r\n // Vector4Array\r\n for (name in source.vectors4Arrays) {\r\n material.setArray4(name, source.vectors4Arrays[name]);\r\n }\r\n\r\n // QuaternionArray\r\n for (name in source.quaternionsArrays) {\r\n material.setArray4(name, source.quaternionsArrays[name]);\r\n }\r\n\r\n return material;\r\n }\r\n\r\n /**\r\n * Creates a new ShaderMaterial from a snippet saved in a remote file\r\n * @param name defines the name of the ShaderMaterial to create (can be null or empty to use the one from the json data)\r\n * @param url defines the url to load from\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new ShaderMaterial\r\n */\r\n public static ParseFromFileAsync(name: Nullable, url: string, scene: Scene, rootUrl = \"\"): Promise {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const serializationObject = JSON.parse(request.responseText);\r\n const output = this.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\r\n\r\n if (name) {\r\n output.name = name;\r\n }\r\n\r\n resolve(output);\r\n } else {\r\n reject(\"Unable to load the ShaderMaterial\");\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", url);\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a ShaderMaterial from a snippet saved by the Inspector\r\n * @param snippetId defines the snippet to load\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new ShaderMaterial\r\n */\r\n public static ParseFromSnippetAsync(snippetId: string, scene: Scene, rootUrl = \"\"): Promise {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n const serializationObject = JSON.parse(snippet.shaderMaterial);\r\n const output = this.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\r\n\r\n output.snippetId = snippetId;\r\n\r\n resolve(output);\r\n } else {\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a ShaderMaterial from a snippet saved by the Inspector\r\n * @deprecated Please use ParseFromSnippetAsync instead\r\n * @param snippetId defines the snippet to load\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new ShaderMaterial\r\n */\r\n public static CreateFromSnippetAsync = ShaderMaterial.ParseFromSnippetAsync;\r\n}\r\n\r\nRegisterClass(\"BABYLON.ShaderMaterial\", ShaderMaterial);\r\n", "import type { DeepImmutable, Nullable, float } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport type { BoundingBox } from \"./boundingBox\";\r\nimport type { BoundingSphere } from \"./boundingSphere\";\r\nimport { Scene } from \"../scene\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { Epsilon } from \"core/Maths/math.constants\";\r\n\r\n/**\r\n * Class representing a ray with position and direction\r\n */\r\nexport class Ray {\r\n private static readonly _TmpVector3 = ArrayTools.BuildArray(6, Vector3.Zero);\r\n private static _RayDistant = Ray.Zero();\r\n private _tmpRay: Ray;\r\n\r\n /**\r\n * Creates a new ray\r\n * @param origin origin point\r\n * @param direction direction\r\n * @param length length of the ray\r\n * @param epsilon The epsilon value to use when calculating the ray/triangle intersection (default: 0)\r\n */\r\n constructor(\r\n /** origin point */\r\n public origin: Vector3,\r\n /** direction */\r\n public direction: Vector3,\r\n /** length of the ray */\r\n public length: number = Number.MAX_VALUE,\r\n /** The epsilon value to use when calculating the ray/triangle intersection (default: Epsilon from math constants) */\r\n public epsilon: number = Epsilon\r\n ) {}\r\n\r\n // Methods\r\n\r\n /**\r\n * Clone the current ray\r\n * @returns a new ray\r\n */\r\n public clone(): Ray {\r\n return new Ray(this.origin.clone(), this.direction.clone(), this.length);\r\n }\r\n\r\n /**\r\n * Checks if the ray intersects a box\r\n * This does not account for the ray length by design to improve perfs.\r\n * @param minimum bound of the box\r\n * @param maximum bound of the box\r\n * @param intersectionTreshold extra extend to be added to the box in all direction\r\n * @returns if the box was hit\r\n */\r\n public intersectsBoxMinMax(minimum: DeepImmutable, maximum: DeepImmutable, intersectionTreshold: number = 0): boolean {\r\n const newMinimum = Ray._TmpVector3[0].copyFromFloats(minimum.x - intersectionTreshold, minimum.y - intersectionTreshold, minimum.z - intersectionTreshold);\r\n const newMaximum = Ray._TmpVector3[1].copyFromFloats(maximum.x + intersectionTreshold, maximum.y + intersectionTreshold, maximum.z + intersectionTreshold);\r\n let d = 0.0;\r\n let maxValue = Number.MAX_VALUE;\r\n let inv: number;\r\n let min: number;\r\n let max: number;\r\n let temp: number;\r\n if (Math.abs(this.direction.x) < 0.0000001) {\r\n if (this.origin.x < newMinimum.x || this.origin.x > newMaximum.x) {\r\n return false;\r\n }\r\n } else {\r\n inv = 1.0 / this.direction.x;\r\n min = (newMinimum.x - this.origin.x) * inv;\r\n max = (newMaximum.x - this.origin.x) * inv;\r\n if (max === -Infinity) {\r\n max = Infinity;\r\n }\r\n\r\n if (min > max) {\r\n temp = min;\r\n min = max;\r\n max = temp;\r\n }\r\n\r\n d = Math.max(min, d);\r\n maxValue = Math.min(max, maxValue);\r\n\r\n if (d > maxValue) {\r\n return false;\r\n }\r\n }\r\n\r\n if (Math.abs(this.direction.y) < 0.0000001) {\r\n if (this.origin.y < newMinimum.y || this.origin.y > newMaximum.y) {\r\n return false;\r\n }\r\n } else {\r\n inv = 1.0 / this.direction.y;\r\n min = (newMinimum.y - this.origin.y) * inv;\r\n max = (newMaximum.y - this.origin.y) * inv;\r\n\r\n if (max === -Infinity) {\r\n max = Infinity;\r\n }\r\n\r\n if (min > max) {\r\n temp = min;\r\n min = max;\r\n max = temp;\r\n }\r\n\r\n d = Math.max(min, d);\r\n maxValue = Math.min(max, maxValue);\r\n\r\n if (d > maxValue) {\r\n return false;\r\n }\r\n }\r\n\r\n if (Math.abs(this.direction.z) < 0.0000001) {\r\n if (this.origin.z < newMinimum.z || this.origin.z > newMaximum.z) {\r\n return false;\r\n }\r\n } else {\r\n inv = 1.0 / this.direction.z;\r\n min = (newMinimum.z - this.origin.z) * inv;\r\n max = (newMaximum.z - this.origin.z) * inv;\r\n\r\n if (max === -Infinity) {\r\n max = Infinity;\r\n }\r\n\r\n if (min > max) {\r\n temp = min;\r\n min = max;\r\n max = temp;\r\n }\r\n\r\n d = Math.max(min, d);\r\n maxValue = Math.min(max, maxValue);\r\n\r\n if (d > maxValue) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Checks if the ray intersects a box\r\n * This does not account for the ray lenght by design to improve perfs.\r\n * @param box the bounding box to check\r\n * @param intersectionTreshold extra extend to be added to the BoundingBox in all direction\r\n * @returns if the box was hit\r\n */\r\n public intersectsBox(box: DeepImmutable, intersectionTreshold: number = 0): boolean {\r\n return this.intersectsBoxMinMax(box.minimum, box.maximum, intersectionTreshold);\r\n }\r\n\r\n /**\r\n * If the ray hits a sphere\r\n * @param sphere the bounding sphere to check\r\n * @param intersectionTreshold extra extend to be added to the BoundingSphere in all direction\r\n * @returns true if it hits the sphere\r\n */\r\n public intersectsSphere(sphere: DeepImmutable, intersectionTreshold: number = 0): boolean {\r\n const x = sphere.center.x - this.origin.x;\r\n const y = sphere.center.y - this.origin.y;\r\n const z = sphere.center.z - this.origin.z;\r\n const pyth = x * x + y * y + z * z;\r\n const radius = sphere.radius + intersectionTreshold;\r\n const rr = radius * radius;\r\n\r\n if (pyth <= rr) {\r\n return true;\r\n }\r\n\r\n const dot = x * this.direction.x + y * this.direction.y + z * this.direction.z;\r\n if (dot < 0.0) {\r\n return false;\r\n }\r\n\r\n const temp = pyth - dot * dot;\r\n\r\n return temp <= rr;\r\n }\r\n\r\n /**\r\n * If the ray hits a triange\r\n * @param vertex0 triangle vertex\r\n * @param vertex1 triangle vertex\r\n * @param vertex2 triangle vertex\r\n * @returns intersection information if hit\r\n */\r\n public intersectsTriangle(vertex0: DeepImmutable, vertex1: DeepImmutable, vertex2: DeepImmutable): Nullable {\r\n const edge1 = Ray._TmpVector3[0];\r\n const edge2 = Ray._TmpVector3[1];\r\n const pvec = Ray._TmpVector3[2];\r\n const tvec = Ray._TmpVector3[3];\r\n const qvec = Ray._TmpVector3[4];\r\n\r\n vertex1.subtractToRef(vertex0, edge1);\r\n vertex2.subtractToRef(vertex0, edge2);\r\n Vector3.CrossToRef(this.direction, edge2, pvec);\r\n const det = Vector3.Dot(edge1, pvec);\r\n\r\n if (det === 0) {\r\n return null;\r\n }\r\n\r\n const invdet = 1 / det;\r\n\r\n this.origin.subtractToRef(vertex0, tvec);\r\n\r\n const bv = Vector3.Dot(tvec, pvec) * invdet;\r\n\r\n if (bv < -this.epsilon || bv > 1.0 + this.epsilon) {\r\n return null;\r\n }\r\n\r\n Vector3.CrossToRef(tvec, edge1, qvec);\r\n\r\n const bw = Vector3.Dot(this.direction, qvec) * invdet;\r\n\r\n if (bw < -this.epsilon || bv + bw > 1.0 + this.epsilon) {\r\n return null;\r\n }\r\n\r\n //check if the distance is longer than the predefined length.\r\n const distance = Vector3.Dot(edge2, qvec) * invdet;\r\n if (distance > this.length) {\r\n return null;\r\n }\r\n\r\n return new IntersectionInfo(1 - bv - bw, bv, distance);\r\n }\r\n\r\n /**\r\n * Checks if ray intersects a plane\r\n * @param plane the plane to check\r\n * @returns the distance away it was hit\r\n */\r\n public intersectsPlane(plane: DeepImmutable): Nullable {\r\n let distance: number;\r\n const result1 = Vector3.Dot(plane.normal, this.direction);\r\n if (Math.abs(result1) < 9.99999997475243e-7) {\r\n return null;\r\n } else {\r\n const result2 = Vector3.Dot(plane.normal, this.origin);\r\n distance = (-plane.d - result2) / result1;\r\n if (distance < 0.0) {\r\n if (distance < -9.99999997475243e-7) {\r\n return null;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n return distance;\r\n }\r\n }\r\n /**\r\n * Calculate the intercept of a ray on a given axis\r\n * @param axis to check 'x' | 'y' | 'z'\r\n * @param offset from axis interception (i.e. an offset of 1y is intercepted above ground)\r\n * @returns a vector containing the coordinates where 'axis' is equal to zero (else offset), or null if there is no intercept.\r\n */\r\n public intersectsAxis(axis: string, offset: number = 0): Nullable {\r\n switch (axis) {\r\n case \"y\": {\r\n const t = (this.origin.y - offset) / this.direction.y;\r\n if (t > 0) {\r\n return null;\r\n }\r\n return new Vector3(this.origin.x + this.direction.x * -t, offset, this.origin.z + this.direction.z * -t);\r\n }\r\n case \"x\": {\r\n const t = (this.origin.x - offset) / this.direction.x;\r\n if (t > 0) {\r\n return null;\r\n }\r\n return new Vector3(offset, this.origin.y + this.direction.y * -t, this.origin.z + this.direction.z * -t);\r\n }\r\n case \"z\": {\r\n const t = (this.origin.z - offset) / this.direction.z;\r\n if (t > 0) {\r\n return null;\r\n }\r\n return new Vector3(this.origin.x + this.direction.x * -t, this.origin.y + this.direction.y * -t, offset);\r\n }\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Checks if ray intersects a mesh. The ray is defined in WORLD space. A mesh triangle can be picked both from its front and back sides,\r\n * irrespective of orientation.\r\n * @param mesh the mesh to check\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected\r\n * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)\r\n * @param worldToUse defines the world matrix to use to get the world coordinate of the intersection point\r\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\r\n * @returns picking info of the intersection\r\n */\r\n public intersectsMesh(\r\n mesh: DeepImmutable,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate,\r\n onlyBoundingInfo = false,\r\n worldToUse?: Matrix,\r\n skipBoundingInfo = false\r\n ): PickingInfo {\r\n const tm = TmpVectors.Matrix[0];\r\n\r\n mesh.getWorldMatrix().invertToRef(tm);\r\n\r\n if (this._tmpRay) {\r\n Ray.TransformToRef(this, tm, this._tmpRay);\r\n } else {\r\n this._tmpRay = Ray.Transform(this, tm);\r\n }\r\n\r\n return mesh.intersects(this._tmpRay, fastCheck, trianglePredicate, onlyBoundingInfo, worldToUse, skipBoundingInfo);\r\n }\r\n\r\n /**\r\n * Checks if ray intersects a mesh\r\n * @param meshes the meshes to check\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param results array to store result in\r\n * @returns Array of picking infos\r\n */\r\n public intersectsMeshes(meshes: Array>, fastCheck?: boolean, results?: Array): Array {\r\n if (results) {\r\n results.length = 0;\r\n } else {\r\n results = [];\r\n }\r\n\r\n for (let i = 0; i < meshes.length; i++) {\r\n const pickInfo = this.intersectsMesh(meshes[i], fastCheck);\r\n\r\n if (pickInfo.hit) {\r\n results.push(pickInfo);\r\n }\r\n }\r\n\r\n results.sort(this._comparePickingInfo);\r\n\r\n return results;\r\n }\r\n\r\n private _comparePickingInfo(pickingInfoA: DeepImmutable, pickingInfoB: DeepImmutable): number {\r\n if (pickingInfoA.distance < pickingInfoB.distance) {\r\n return -1;\r\n } else if (pickingInfoA.distance > pickingInfoB.distance) {\r\n return 1;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n private static _Smallnum = 0.00000001;\r\n private static _Rayl = 10e8;\r\n\r\n /**\r\n * Intersection test between the ray and a given segment within a given tolerance (threshold)\r\n * @param sega the first point of the segment to test the intersection against\r\n * @param segb the second point of the segment to test the intersection against\r\n * @param threshold the tolerance margin, if the ray doesn't intersect the segment but is close to the given threshold, the intersection is successful\r\n * @returns the distance from the ray origin to the intersection point if there's intersection, or -1 if there's no intersection\r\n */\r\n intersectionSegment(sega: DeepImmutable, segb: DeepImmutable, threshold: number): number {\r\n const o = this.origin;\r\n const u = TmpVectors.Vector3[0];\r\n const rsegb = TmpVectors.Vector3[1];\r\n const v = TmpVectors.Vector3[2];\r\n const w = TmpVectors.Vector3[3];\r\n\r\n segb.subtractToRef(sega, u);\r\n\r\n this.direction.scaleToRef(Ray._Rayl, v);\r\n o.addToRef(v, rsegb);\r\n\r\n sega.subtractToRef(o, w);\r\n\r\n const a = Vector3.Dot(u, u); // always >= 0\r\n const b = Vector3.Dot(u, v);\r\n const c = Vector3.Dot(v, v); // always >= 0\r\n const d = Vector3.Dot(u, w);\r\n const e = Vector3.Dot(v, w);\r\n const D = a * c - b * b; // always >= 0\r\n let sN: number,\r\n sD = D; // sc = sN / sD, default sD = D >= 0\r\n let tN: number,\r\n tD = D; // tc = tN / tD, default tD = D >= 0\r\n\r\n // compute the line parameters of the two closest points\r\n if (D < Ray._Smallnum) {\r\n // the lines are almost parallel\r\n sN = 0.0; // force using point P0 on segment S1\r\n sD = 1.0; // to prevent possible division by 0.0 later\r\n tN = e;\r\n tD = c;\r\n } else {\r\n // get the closest points on the infinite lines\r\n sN = b * e - c * d;\r\n tN = a * e - b * d;\r\n if (sN < 0.0) {\r\n // sc < 0 => the s=0 edge is visible\r\n sN = 0.0;\r\n tN = e;\r\n tD = c;\r\n } else if (sN > sD) {\r\n // sc > 1 => the s=1 edge is visible\r\n sN = sD;\r\n tN = e + b;\r\n tD = c;\r\n }\r\n }\r\n\r\n if (tN < 0.0) {\r\n // tc < 0 => the t=0 edge is visible\r\n tN = 0.0;\r\n // recompute sc for this edge\r\n if (-d < 0.0) {\r\n sN = 0.0;\r\n } else if (-d > a) {\r\n sN = sD;\r\n } else {\r\n sN = -d;\r\n sD = a;\r\n }\r\n } else if (tN > tD) {\r\n // tc > 1 => the t=1 edge is visible\r\n tN = tD;\r\n // recompute sc for this edge\r\n if (-d + b < 0.0) {\r\n sN = 0;\r\n } else if (-d + b > a) {\r\n sN = sD;\r\n } else {\r\n sN = -d + b;\r\n sD = a;\r\n }\r\n }\r\n // finally do the division to get sc and tc\r\n const sc = Math.abs(sN) < Ray._Smallnum ? 0.0 : sN / sD;\r\n const tc = Math.abs(tN) < Ray._Smallnum ? 0.0 : tN / tD;\r\n\r\n // get the difference of the two closest points\r\n const qtc = TmpVectors.Vector3[4];\r\n v.scaleToRef(tc, qtc);\r\n const qsc = TmpVectors.Vector3[5];\r\n u.scaleToRef(sc, qsc);\r\n qsc.addInPlace(w);\r\n const dP = TmpVectors.Vector3[6];\r\n qsc.subtractToRef(qtc, dP); // = S1(sc) - S2(tc)\r\n\r\n const isIntersected = tc > 0 && tc <= this.length && dP.lengthSquared() < threshold * threshold; // return intersection result\r\n\r\n if (isIntersected) {\r\n return qsc.length();\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * Update the ray from viewport position\r\n * @param x position\r\n * @param y y position\r\n * @param viewportWidth viewport width\r\n * @param viewportHeight viewport height\r\n * @param world world matrix\r\n * @param view view matrix\r\n * @param projection projection matrix\r\n * @param enableDistantPicking defines if picking should handle large values for mesh position/scaling (false by default)\r\n * @returns this ray updated\r\n */\r\n public update(\r\n x: number,\r\n y: number,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable,\r\n enableDistantPicking: boolean = false\r\n ): Ray {\r\n if (enableDistantPicking) {\r\n // With world matrices having great values (like 8000000000 on 1 or more scaling or position axis),\r\n // multiplying view/projection/world and doing invert will result in loss of float precision in the matrix.\r\n // One way to fix it is to compute the ray with world at identity then transform the ray in object space.\r\n // This is slower (2 matrix inverts instead of 1) but precision is preserved.\r\n // This is hidden behind `EnableDistantPicking` flag (default is false)\r\n if (!Ray._RayDistant) {\r\n Ray._RayDistant = Ray.Zero();\r\n }\r\n\r\n Ray._RayDistant.unprojectRayToRef(x, y, viewportWidth, viewportHeight, Matrix.IdentityReadOnly, view, projection);\r\n\r\n const tm = TmpVectors.Matrix[0];\r\n world.invertToRef(tm);\r\n Ray.TransformToRef(Ray._RayDistant, tm, this);\r\n } else {\r\n this.unprojectRayToRef(x, y, viewportWidth, viewportHeight, world, view, projection);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a ray with origin and direction of 0,0,0\r\n * @returns the new ray\r\n */\r\n public static Zero(): Ray {\r\n return new Ray(Vector3.Zero(), Vector3.Zero());\r\n }\r\n\r\n /**\r\n * Creates a new ray from screen space and viewport\r\n * @param x position\r\n * @param y y position\r\n * @param viewportWidth viewport width\r\n * @param viewportHeight viewport height\r\n * @param world world matrix\r\n * @param view view matrix\r\n * @param projection projection matrix\r\n * @returns new ray\r\n */\r\n public static CreateNew(\r\n x: number,\r\n y: number,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable\r\n ): Ray {\r\n const result = Ray.Zero();\r\n\r\n return result.update(x, y, viewportWidth, viewportHeight, world, view, projection);\r\n }\r\n\r\n /**\r\n * Function will create a new transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be\r\n * transformed to the given world matrix.\r\n * @param origin The origin point\r\n * @param end The end point\r\n * @param world a matrix to transform the ray to. Default is the identity matrix.\r\n * @returns the new ray\r\n */\r\n public static CreateNewFromTo(origin: Vector3, end: Vector3, world: DeepImmutable = Matrix.IdentityReadOnly): Ray {\r\n const result = new Ray(new Vector3(0, 0, 0), new Vector3(0, 0, 0));\r\n return Ray.CreateFromToToRef(origin, end, result, world);\r\n }\r\n\r\n /**\r\n * Function will update a transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be\r\n * transformed to the given world matrix.\r\n * @param origin The origin point\r\n * @param end The end point\r\n * @param result the object to store the result\r\n * @param world a matrix to transform the ray to. Default is the identity matrix.\r\n * @returns the ref ray\r\n */\r\n public static CreateFromToToRef(origin: Vector3, end: Vector3, result: Ray, world: DeepImmutable = Matrix.IdentityReadOnly): Ray {\r\n result.origin.copyFrom(origin);\r\n const direction = end.subtractToRef(origin, result.direction);\r\n const length = Math.sqrt(direction.x * direction.x + direction.y * direction.y + direction.z * direction.z);\r\n result.length = length;\r\n result.direction.normalize();\r\n\r\n return Ray.TransformToRef(result, world, result);\r\n }\r\n\r\n /**\r\n * Transforms a ray by a matrix\r\n * @param ray ray to transform\r\n * @param matrix matrix to apply\r\n * @returns the resulting new ray\r\n */\r\n public static Transform(ray: DeepImmutable, matrix: DeepImmutable): Ray {\r\n const result = new Ray(new Vector3(0, 0, 0), new Vector3(0, 0, 0));\r\n Ray.TransformToRef(ray, matrix, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Transforms a ray by a matrix\r\n * @param ray ray to transform\r\n * @param matrix matrix to apply\r\n * @param result ray to store result in\r\n * @returns the updated result ray\r\n */\r\n public static TransformToRef(ray: DeepImmutable, matrix: DeepImmutable, result: Ray): Ray {\r\n Vector3.TransformCoordinatesToRef(ray.origin, matrix, result.origin);\r\n Vector3.TransformNormalToRef(ray.direction, matrix, result.direction);\r\n result.length = ray.length;\r\n result.epsilon = ray.epsilon;\r\n\r\n const dir = result.direction;\r\n const len = dir.length();\r\n\r\n if (!(len === 0 || len === 1)) {\r\n const num = 1.0 / len;\r\n dir.x *= num;\r\n dir.y *= num;\r\n dir.z *= num;\r\n result.length *= len;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Unproject a ray from screen space to object space\r\n * @param sourceX defines the screen space x coordinate to use\r\n * @param sourceY defines the screen space y coordinate to use\r\n * @param viewportWidth defines the current width of the viewport\r\n * @param viewportHeight defines the current height of the viewport\r\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\r\n * @param view defines the view matrix to use\r\n * @param projection defines the projection matrix to use\r\n */\r\n public unprojectRayToRef(\r\n sourceX: float,\r\n sourceY: float,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n world: DeepImmutable,\r\n view: DeepImmutable,\r\n projection: DeepImmutable\r\n ): void {\r\n const matrix = TmpVectors.Matrix[0];\r\n world.multiplyToRef(view, matrix);\r\n matrix.multiplyToRef(projection, matrix);\r\n matrix.invert();\r\n\r\n const engine = EngineStore.LastCreatedEngine;\r\n const nearScreenSource = TmpVectors.Vector3[0];\r\n nearScreenSource.x = (sourceX / viewportWidth) * 2 - 1;\r\n nearScreenSource.y = -((sourceY / viewportHeight) * 2 - 1);\r\n nearScreenSource.z = engine?.useReverseDepthBuffer ? 1 : engine?.isNDCHalfZRange ? 0 : -1;\r\n\r\n // far Z need to be close but < to 1 or camera projection matrix with maxZ = 0 will NaN\r\n const farScreenSource = TmpVectors.Vector3[1].copyFromFloats(nearScreenSource.x, nearScreenSource.y, 1.0 - 1e-8);\r\n const nearVec3 = TmpVectors.Vector3[2];\r\n const farVec3 = TmpVectors.Vector3[3];\r\n Vector3._UnprojectFromInvertedMatrixToRef(nearScreenSource, matrix, nearVec3);\r\n Vector3._UnprojectFromInvertedMatrixToRef(farScreenSource, matrix, farVec3);\r\n\r\n this.origin.copyFrom(nearVec3);\r\n farVec3.subtractToRef(nearVec3, this.direction);\r\n this.direction.normalize();\r\n }\r\n}\r\n\r\n// Picking\r\n/**\r\n * Type used to define predicate used to select faces when a mesh intersection is detected\r\n */\r\nexport type TrianglePickingPredicate = (p0: Vector3, p1: Vector3, p2: Vector3, ray: Ray, i0: number, i1: number, i2: number) => boolean;\r\n\r\ndeclare module \"../scene\" {\r\n export interface Scene {\r\n /** @internal */\r\n _tempPickingRay: Nullable;\r\n\r\n /** @internal */\r\n _cachedRayForTransform: Ray;\r\n\r\n /** @internal */\r\n _pickWithRayInverseMatrix: Matrix;\r\n\r\n /** @internal */\r\n _internalPick(\r\n rayFunction: (world: Matrix, enableDistantPicking: boolean) => Ray,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n fastCheck?: boolean,\r\n onlyBoundingInfo?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): PickingInfo;\r\n\r\n /** @internal */\r\n _internalMultiPick(\r\n rayFunction: (world: Matrix, enableDistantPicking: boolean) => Ray,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n ): Nullable;\r\n\r\n /** @internal */\r\n _internalPickForMesh(\r\n pickingInfo: Nullable,\r\n rayFunction: (world: Matrix, enableDistantPicking: boolean) => Ray,\r\n mesh: AbstractMesh,\r\n world: Matrix,\r\n fastCheck?: boolean,\r\n onlyBoundingInfo?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate,\r\n skipBoundingInfo?: boolean\r\n ): Nullable;\r\n }\r\n}\r\n\r\nScene.prototype.createPickingRay = function (x: number, y: number, world: Nullable, camera: Nullable, cameraViewSpace = false): Ray {\r\n const result = Ray.Zero();\r\n\r\n this.createPickingRayToRef(x, y, world, result, camera, cameraViewSpace);\r\n\r\n return result;\r\n};\r\n\r\nScene.prototype.createPickingRayToRef = function (\r\n x: number,\r\n y: number,\r\n world: Nullable,\r\n result: Ray,\r\n camera: Nullable,\r\n cameraViewSpace = false,\r\n enableDistantPicking = false\r\n): Scene {\r\n const engine = this.getEngine();\r\n\r\n if (!camera && !(camera = this.activeCamera!)) {\r\n return this;\r\n }\r\n\r\n const cameraViewport = camera.viewport;\r\n const renderHeight = engine.getRenderHeight();\r\n const { x: vx, y: vy, width, height } = cameraViewport.toGlobal(engine.getRenderWidth(), renderHeight);\r\n\r\n // Moving coordinates to local viewport world\r\n const levelInv = 1 / engine.getHardwareScalingLevel();\r\n x = x * levelInv - vx;\r\n y = y * levelInv - (renderHeight - vy - height);\r\n\r\n result.update(\r\n x,\r\n y,\r\n width,\r\n height,\r\n world ? world : Matrix.IdentityReadOnly,\r\n cameraViewSpace ? Matrix.IdentityReadOnly : camera.getViewMatrix(),\r\n camera.getProjectionMatrix(),\r\n enableDistantPicking\r\n );\r\n return this;\r\n};\r\n\r\nScene.prototype.createPickingRayInCameraSpace = function (x: number, y: number, camera?: Camera): Ray {\r\n const result = Ray.Zero();\r\n\r\n this.createPickingRayInCameraSpaceToRef(x, y, result, camera);\r\n\r\n return result;\r\n};\r\n\r\nScene.prototype.createPickingRayInCameraSpaceToRef = function (x: number, y: number, result: Ray, camera?: Camera): Scene {\r\n if (!PickingInfo) {\r\n return this;\r\n }\r\n\r\n const engine = this.getEngine();\r\n\r\n if (!camera && !(camera = this.activeCamera!)) {\r\n throw new Error(\"Active camera not set\");\r\n }\r\n\r\n const cameraViewport = camera.viewport;\r\n const renderHeight = engine.getRenderHeight();\r\n const { x: vx, y: vy, width, height } = cameraViewport.toGlobal(engine.getRenderWidth(), renderHeight);\r\n const identity = Matrix.Identity();\r\n\r\n // Moving coordinates to local viewport world\r\n const levelInv = 1 / engine.getHardwareScalingLevel();\r\n x = x * levelInv - vx;\r\n y = y * levelInv - (renderHeight - vy - height);\r\n result.update(x, y, width, height, identity, identity, camera.getProjectionMatrix());\r\n return this;\r\n};\r\n\r\nScene.prototype._internalPickForMesh = function (\r\n pickingInfo: Nullable,\r\n rayFunction: (world: Matrix, enableDistantPicking: boolean) => Ray,\r\n mesh: AbstractMesh,\r\n world: Matrix,\r\n fastCheck?: boolean,\r\n onlyBoundingInfo?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate,\r\n skipBoundingInfo?: boolean\r\n) {\r\n const ray = rayFunction(world, mesh.enableDistantPicking);\r\n\r\n const result = mesh.intersects(ray, fastCheck, trianglePredicate, onlyBoundingInfo, world, skipBoundingInfo);\r\n if (!result || !result.hit) {\r\n return null;\r\n }\r\n\r\n if (!fastCheck && pickingInfo != null && result.distance >= pickingInfo.distance) {\r\n return null;\r\n }\r\n\r\n return result;\r\n};\r\n\r\nScene.prototype._internalPick = function (\r\n rayFunction: (world: Matrix, enableDistantPicking: boolean) => Ray,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n fastCheck?: boolean,\r\n onlyBoundingInfo?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n): PickingInfo {\r\n let pickingInfo = null;\r\n\r\n const computeWorldMatrixForCamera = !!(this.activeCameras && this.activeCameras.length > 1 && this.cameraToUseForPointers !== this.activeCamera);\r\n const currentCamera = this.cameraToUseForPointers || this.activeCamera;\r\n\r\n for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) {\r\n const mesh = this.meshes[meshIndex];\r\n\r\n if (predicate) {\r\n if (!predicate(mesh)) {\r\n continue;\r\n }\r\n } else if (!mesh.isEnabled() || !mesh.isVisible || !mesh.isPickable) {\r\n continue;\r\n }\r\n\r\n const forceCompute = computeWorldMatrixForCamera && mesh.isWorldMatrixCameraDependent();\r\n const world = mesh.computeWorldMatrix(forceCompute, currentCamera);\r\n\r\n if (mesh.hasThinInstances && (mesh as Mesh).thinInstanceEnablePicking) {\r\n // first check if the ray intersects the whole bounding box/sphere of the mesh\r\n const result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, world, true, true, trianglePredicate);\r\n if (result) {\r\n if (onlyBoundingInfo) {\r\n // the user only asked for a bounding info check so we can return\r\n return result;\r\n }\r\n const tmpMatrix = TmpVectors.Matrix[1];\r\n const thinMatrices = (mesh as Mesh).thinInstanceGetWorldMatrices();\r\n for (let index = 0; index < thinMatrices.length; index++) {\r\n const thinMatrix = thinMatrices[index];\r\n thinMatrix.multiplyToRef(world, tmpMatrix);\r\n const result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, tmpMatrix, fastCheck, onlyBoundingInfo, trianglePredicate, true);\r\n\r\n if (result) {\r\n pickingInfo = result;\r\n pickingInfo.thinInstanceIndex = index;\r\n\r\n if (fastCheck) {\r\n return pickingInfo;\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n const result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, world, fastCheck, onlyBoundingInfo, trianglePredicate);\r\n\r\n if (result) {\r\n pickingInfo = result;\r\n\r\n if (fastCheck) {\r\n return pickingInfo;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return pickingInfo || new PickingInfo();\r\n};\r\n\r\nScene.prototype._internalMultiPick = function (\r\n rayFunction: (world: Matrix, enableDistantPicking: boolean) => Ray,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n): Nullable {\r\n if (!PickingInfo) {\r\n return null;\r\n }\r\n const pickingInfos: PickingInfo[] = [];\r\n const computeWorldMatrixForCamera = !!(this.activeCameras && this.activeCameras.length > 1 && this.cameraToUseForPointers !== this.activeCamera);\r\n const currentCamera = this.cameraToUseForPointers || this.activeCamera;\r\n\r\n for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) {\r\n const mesh = this.meshes[meshIndex];\r\n\r\n if (predicate) {\r\n if (!predicate(mesh)) {\r\n continue;\r\n }\r\n } else if (!mesh.isEnabled() || !mesh.isVisible || !mesh.isPickable) {\r\n continue;\r\n }\r\n\r\n const forceCompute = computeWorldMatrixForCamera && mesh.isWorldMatrixCameraDependent();\r\n const world = mesh.computeWorldMatrix(forceCompute, currentCamera);\r\n\r\n if (mesh.hasThinInstances && (mesh as Mesh).thinInstanceEnablePicking) {\r\n const result = this._internalPickForMesh(null, rayFunction, mesh, world, true, true, trianglePredicate);\r\n if (result) {\r\n const tmpMatrix = TmpVectors.Matrix[1];\r\n const thinMatrices = (mesh as Mesh).thinInstanceGetWorldMatrices();\r\n for (let index = 0; index < thinMatrices.length; index++) {\r\n const thinMatrix = thinMatrices[index];\r\n thinMatrix.multiplyToRef(world, tmpMatrix);\r\n const result = this._internalPickForMesh(null, rayFunction, mesh, tmpMatrix, false, false, trianglePredicate, true);\r\n\r\n if (result) {\r\n result.thinInstanceIndex = index;\r\n pickingInfos.push(result);\r\n }\r\n }\r\n }\r\n } else {\r\n const result = this._internalPickForMesh(null, rayFunction, mesh, world, false, false, trianglePredicate);\r\n\r\n if (result) {\r\n pickingInfos.push(result);\r\n }\r\n }\r\n }\r\n\r\n return pickingInfos;\r\n};\r\n\r\nScene.prototype.pickWithBoundingInfo = function (\r\n x: number,\r\n y: number,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n fastCheck?: boolean,\r\n camera?: Nullable\r\n): Nullable {\r\n if (!PickingInfo) {\r\n return null;\r\n }\r\n const result = this._internalPick(\r\n (world) => {\r\n if (!this._tempPickingRay) {\r\n this._tempPickingRay = Ray.Zero();\r\n }\r\n\r\n this.createPickingRayToRef(x, y, world, this._tempPickingRay, camera || null);\r\n return this._tempPickingRay;\r\n },\r\n predicate,\r\n fastCheck,\r\n true\r\n );\r\n if (result) {\r\n result.ray = this.createPickingRay(x, y, Matrix.Identity(), camera || null);\r\n }\r\n return result;\r\n};\r\n\r\nObject.defineProperty(Scene.prototype, \"_pickingAvailable\", {\r\n get: () => true,\r\n enumerable: false,\r\n configurable: false,\r\n});\r\n\r\nScene.prototype.pick = function (\r\n x: number,\r\n y: number,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n fastCheck?: boolean,\r\n camera?: Nullable,\r\n trianglePredicate?: TrianglePickingPredicate,\r\n _enableDistantPicking = false\r\n): PickingInfo {\r\n const result = this._internalPick(\r\n (world, enableDistantPicking) => {\r\n if (!this._tempPickingRay) {\r\n this._tempPickingRay = Ray.Zero();\r\n }\r\n\r\n this.createPickingRayToRef(x, y, world, this._tempPickingRay, camera || null, false, enableDistantPicking);\r\n return this._tempPickingRay;\r\n },\r\n predicate,\r\n fastCheck,\r\n false,\r\n trianglePredicate\r\n );\r\n if (result) {\r\n result.ray = this.createPickingRay(x, y, Matrix.Identity(), camera || null);\r\n }\r\n return result;\r\n};\r\n\r\nScene.prototype.pickWithRay = function (\r\n ray: Ray,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n fastCheck?: boolean,\r\n trianglePredicate?: TrianglePickingPredicate\r\n): Nullable {\r\n const result = this._internalPick(\r\n (world) => {\r\n if (!this._pickWithRayInverseMatrix) {\r\n this._pickWithRayInverseMatrix = Matrix.Identity();\r\n }\r\n world.invertToRef(this._pickWithRayInverseMatrix);\r\n\r\n if (!this._cachedRayForTransform) {\r\n this._cachedRayForTransform = Ray.Zero();\r\n }\r\n\r\n Ray.TransformToRef(ray, this._pickWithRayInverseMatrix, this._cachedRayForTransform);\r\n return this._cachedRayForTransform;\r\n },\r\n predicate,\r\n fastCheck,\r\n false,\r\n trianglePredicate\r\n );\r\n if (result) {\r\n result.ray = ray;\r\n }\r\n return result;\r\n};\r\n\r\nScene.prototype.multiPick = function (\r\n x: number,\r\n y: number,\r\n predicate?: (mesh: AbstractMesh) => boolean,\r\n camera?: Camera,\r\n trianglePredicate?: TrianglePickingPredicate\r\n): Nullable {\r\n return this._internalMultiPick((world) => this.createPickingRay(x, y, world, camera || null), predicate, trianglePredicate);\r\n};\r\n\r\nScene.prototype.multiPickWithRay = function (ray: Ray, predicate?: (mesh: AbstractMesh) => boolean, trianglePredicate?: TrianglePickingPredicate): Nullable {\r\n return this._internalMultiPick(\r\n (world) => {\r\n if (!this._pickWithRayInverseMatrix) {\r\n this._pickWithRayInverseMatrix = Matrix.Identity();\r\n }\r\n world.invertToRef(this._pickWithRayInverseMatrix);\r\n\r\n if (!this._cachedRayForTransform) {\r\n this._cachedRayForTransform = Ray.Zero();\r\n }\r\n\r\n Ray.TransformToRef(ray, this._pickWithRayInverseMatrix, this._cachedRayForTransform);\r\n return this._cachedRayForTransform;\r\n },\r\n predicate,\r\n trianglePredicate\r\n );\r\n};\r\n\r\nCamera.prototype.getForwardRay = function (length = 100, transform?: Matrix, origin?: Vector3): Ray {\r\n return this.getForwardRayToRef(new Ray(Vector3.Zero(), Vector3.Zero(), length), length, transform, origin);\r\n};\r\n\r\nCamera.prototype.getForwardRayToRef = function (refRay: Ray, length = 100, transform?: Matrix, origin?: Vector3): Ray {\r\n if (!transform) {\r\n transform = this.getWorldMatrix();\r\n }\r\n refRay.length = length;\r\n\r\n if (origin) {\r\n refRay.origin.copyFrom(origin);\r\n } else {\r\n refRay.origin.copyFrom(this.position);\r\n }\r\n const forward = TmpVectors.Vector3[2];\r\n forward.set(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n const worldForward = TmpVectors.Vector3[3];\r\n Vector3.TransformNormalToRef(forward, transform, worldForward);\r\n Vector3.NormalizeToRef(worldForward, refRay.direction);\r\n\r\n return refRay;\r\n};\r\n", "import type { Behavior } from \"../../Behaviors/behavior\";\r\nimport { Mesh } from \"../../Meshes/mesh\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { PointerInfo } from \"../../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../../Events/pointerEvents\";\r\nimport { Ray } from \"../../Culling/ray\";\r\nimport { PivotTools } from \"../../Misc/pivotTools\";\r\nimport type { ArcRotateCamera } from \"../../Cameras/arcRotateCamera\";\r\nimport { CreatePlane } from \"../../Meshes/Builders/planeBuilder\";\r\n\r\nimport type { IPointerEvent } from \"../../Events/deviceInputEvents\";\r\nimport { Epsilon } from \"../../Maths/math.constants\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will allow the mesh to be dragged around the screen based on pointer events\r\n */\r\nexport class PointerDragBehavior implements Behavior {\r\n private static _AnyMouseId = -2;\r\n /**\r\n * Abstract mesh the behavior is set on\r\n */\r\n public attachedNode: AbstractMesh;\r\n protected _dragPlane: Mesh;\r\n private _scene: Scene;\r\n private _pointerObserver: Nullable>;\r\n private _beforeRenderObserver: Nullable>;\r\n private static _PlaneScene: Scene;\r\n private _useAlternatePickedPointAboveMaxDragAngleDragSpeed = -1.1;\r\n private _activeDragButton: number = -1;\r\n private _activePointerInfo: Nullable;\r\n /**\r\n * The maximum tolerated angle between the drag plane and dragging pointer rays to trigger pointer events. Set to 0 to allow any angle (default: 0)\r\n */\r\n public maxDragAngle = 0;\r\n /**\r\n * Butttons that can be used to initiate a drag\r\n */\r\n public dragButtons = [0, 1, 2];\r\n /**\r\n * @internal\r\n */\r\n public _useAlternatePickedPointAboveMaxDragAngle = false;\r\n /**\r\n * Get or set the currentDraggingPointerId\r\n * @deprecated Please use currentDraggingPointerId instead\r\n */\r\n public get currentDraggingPointerID(): number {\r\n return this.currentDraggingPointerId;\r\n }\r\n public set currentDraggingPointerID(currentDraggingPointerID: number) {\r\n this.currentDraggingPointerId = currentDraggingPointerID;\r\n }\r\n /**\r\n * The id of the pointer that is currently interacting with the behavior (-1 when no pointer is active)\r\n */\r\n public currentDraggingPointerId = -1;\r\n /**\r\n * The last position where the pointer hit the drag plane in world space\r\n */\r\n public lastDragPosition: Vector3;\r\n /**\r\n * If the behavior is currently in a dragging state\r\n */\r\n public dragging = false;\r\n /**\r\n * The distance towards the target drag position to move each frame. This can be useful to avoid jitter. Set this to 1 for no delay. (Default: 0.2)\r\n */\r\n public dragDeltaRatio = 0.2;\r\n /**\r\n * If the drag plane orientation should be updated during the dragging (Default: true)\r\n */\r\n public updateDragPlane = true;\r\n // Debug mode will display drag planes to help visualize behavior\r\n private _debugMode = false;\r\n private _moving = false;\r\n /**\r\n * Fires each time the attached mesh is dragged with the pointer\r\n * * delta between last drag position and current drag position in world space\r\n * * dragDistance along the drag axis\r\n * * dragPlaneNormal normal of the current drag plane used during the drag\r\n * * dragPlanePoint in world space where the drag intersects the drag plane\r\n *\r\n * (if validatedDrag is used, the position of the attached mesh might not equal dragPlanePoint)\r\n */\r\n public onDragObservable = new Observable<{\r\n delta: Vector3;\r\n dragPlanePoint: Vector3;\r\n dragPlaneNormal: Vector3;\r\n dragDistance: number;\r\n pointerId: number;\r\n pointerInfo: Nullable;\r\n }>();\r\n /**\r\n * Fires each time a drag begins (eg. mouse down on mesh)\r\n * * dragPlanePoint in world space where the drag intersects the drag plane\r\n *\r\n * (if validatedDrag is used, the position of the attached mesh might not equal dragPlanePoint)\r\n */\r\n public onDragStartObservable = new Observable<{ dragPlanePoint: Vector3; pointerId: number; pointerInfo: Nullable }>();\r\n /**\r\n * Fires each time a drag ends (eg. mouse release after drag)\r\n * * dragPlanePoint in world space where the drag intersects the drag plane\r\n *\r\n * (if validatedDrag is used, the position of the attached mesh might not equal dragPlanePoint)\r\n */\r\n public onDragEndObservable = new Observable<{ dragPlanePoint: Vector3; pointerId: number; pointerInfo: Nullable }>();\r\n /**\r\n * Fires each time behavior enabled state changes\r\n */\r\n public onEnabledObservable = new Observable();\r\n\r\n /**\r\n * If the attached mesh should be moved when dragged\r\n */\r\n public moveAttached = true;\r\n\r\n /**\r\n * If the drag behavior will react to drag events (Default: true)\r\n */\r\n public set enabled(value: boolean) {\r\n if (value != this._enabled) {\r\n this.onEnabledObservable.notifyObservers(value);\r\n }\r\n this._enabled = value;\r\n }\r\n\r\n public get enabled() {\r\n return this._enabled;\r\n }\r\n private _enabled = true;\r\n\r\n /**\r\n * If pointer events should start and release the drag (Default: true)\r\n */\r\n public startAndReleaseDragOnPointerEvents = true;\r\n /**\r\n * If camera controls should be detached during the drag\r\n */\r\n public detachCameraControls = true;\r\n\r\n /**\r\n * If set, the drag plane/axis will be rotated based on the attached mesh's world rotation (Default: true)\r\n */\r\n public useObjectOrientationForDragging = true;\r\n\r\n private _options: { dragAxis?: Vector3; dragPlaneNormal?: Vector3 };\r\n\r\n /**\r\n * Gets the options used by the behavior\r\n */\r\n public get options(): { dragAxis?: Vector3; dragPlaneNormal?: Vector3 } {\r\n return this._options;\r\n }\r\n\r\n /**\r\n * Sets the options used by the behavior\r\n */\r\n public set options(options: { dragAxis?: Vector3; dragPlaneNormal?: Vector3 }) {\r\n this._options = options;\r\n }\r\n\r\n /**\r\n * Creates a pointer drag behavior that can be attached to a mesh\r\n * @param options The drag axis or normal of the plane that will be dragged across. If no options are specified the drag plane will always face the ray's origin (eg. camera)\r\n * @param options.dragAxis\r\n * @param options.dragPlaneNormal\r\n */\r\n constructor(options?: { dragAxis?: Vector3; dragPlaneNormal?: Vector3 }) {\r\n this._options = options ? options : {};\r\n\r\n let optionCount = 0;\r\n if (this._options.dragAxis) {\r\n optionCount++;\r\n }\r\n if (this._options.dragPlaneNormal) {\r\n optionCount++;\r\n }\r\n if (optionCount > 1) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Multiple drag modes specified in dragBehavior options. Only one expected\";\r\n }\r\n }\r\n\r\n /**\r\n * Predicate to determine if it is valid to move the object to a new position when it is moved.\r\n * In the case of rotation gizmo, target contains the angle.\r\n * @param target destination position or desired angle delta\r\n * @returns boolean for whether or not it is valid to move\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public validateDrag = (target: Vector3) => {\r\n return true;\r\n };\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"PointerDrag\";\r\n }\r\n\r\n /**\r\n * Initializes the behavior\r\n */\r\n public init() {}\r\n\r\n private _tmpVector = new Vector3(0, 0, 0);\r\n private _alternatePickedPoint = new Vector3(0, 0, 0);\r\n private _worldDragAxis = new Vector3(0, 0, 0);\r\n private _targetPosition = new Vector3(0, 0, 0);\r\n private _attachedToElement: boolean = false;\r\n /**\r\n * Attaches the drag behavior the passed in mesh\r\n * @param ownerNode The mesh that will be dragged around once attached\r\n * @param predicate Predicate to use for pick filtering\r\n */\r\n public attach(ownerNode: AbstractMesh, predicate?: (m: AbstractMesh) => boolean): void {\r\n this._scene = ownerNode.getScene();\r\n ownerNode.isNearGrabbable = true;\r\n this.attachedNode = ownerNode;\r\n\r\n // Initialize drag plane to not interfere with existing scene\r\n if (!PointerDragBehavior._PlaneScene) {\r\n if (this._debugMode) {\r\n PointerDragBehavior._PlaneScene = this._scene;\r\n } else {\r\n PointerDragBehavior._PlaneScene = new Scene(this._scene.getEngine(), { virtual: true });\r\n PointerDragBehavior._PlaneScene.detachControl();\r\n this._scene.onDisposeObservable.addOnce(() => {\r\n PointerDragBehavior._PlaneScene.dispose();\r\n (PointerDragBehavior._PlaneScene) = null;\r\n });\r\n }\r\n }\r\n this._dragPlane = CreatePlane(\r\n \"pointerDragPlane\",\r\n { size: this._debugMode ? 1 : 10000, updatable: false, sideOrientation: Mesh.DOUBLESIDE },\r\n PointerDragBehavior._PlaneScene\r\n );\r\n\r\n // State of the drag\r\n this.lastDragPosition = new Vector3(0, 0, 0);\r\n\r\n const pickPredicate = predicate\r\n ? predicate\r\n : (m: AbstractMesh) => {\r\n return this.attachedNode == m || m.isDescendantOf(this.attachedNode);\r\n };\r\n\r\n this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => {\r\n if (!this.enabled) {\r\n // If behavior is disabled before releaseDrag is ever called, call it now.\r\n if (this._attachedToElement) {\r\n this.releaseDrag();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (pointerInfo.type == PointerEventTypes.POINTERDOWN) {\r\n if (\r\n this.startAndReleaseDragOnPointerEvents &&\r\n !this.dragging &&\r\n pointerInfo.pickInfo &&\r\n pointerInfo.pickInfo.hit &&\r\n pointerInfo.pickInfo.pickedMesh &&\r\n pointerInfo.pickInfo.pickedPoint &&\r\n pointerInfo.pickInfo.ray &&\r\n pickPredicate(pointerInfo.pickInfo.pickedMesh)\r\n ) {\r\n if (this._activeDragButton === -1 && this.dragButtons.indexOf(pointerInfo.event.button) !== -1) {\r\n this._activeDragButton = pointerInfo.event.button;\r\n this._activePointerInfo = pointerInfo;\r\n this._startDrag((pointerInfo.event).pointerId, pointerInfo.pickInfo.ray, pointerInfo.pickInfo.pickedPoint);\r\n }\r\n }\r\n } else if (pointerInfo.type == PointerEventTypes.POINTERUP) {\r\n if (\r\n this.startAndReleaseDragOnPointerEvents &&\r\n this.currentDraggingPointerId == (pointerInfo.event).pointerId &&\r\n (this._activeDragButton === pointerInfo.event.button || this._activeDragButton === -1)\r\n ) {\r\n this.releaseDrag();\r\n }\r\n } else if (pointerInfo.type == PointerEventTypes.POINTERMOVE) {\r\n const pointerId = (pointerInfo.event).pointerId;\r\n\r\n // If drag was started with anyMouseID specified, set pointerID to the next mouse that moved\r\n if (this.currentDraggingPointerId === PointerDragBehavior._AnyMouseId && pointerId !== PointerDragBehavior._AnyMouseId) {\r\n const evt = pointerInfo.event;\r\n const isMouseEvent = evt.pointerType === \"mouse\" || (!this._scene.getEngine().hostInformation.isMobile && evt instanceof MouseEvent);\r\n if (isMouseEvent) {\r\n if (this._lastPointerRay[this.currentDraggingPointerId]) {\r\n this._lastPointerRay[pointerId] = this._lastPointerRay[this.currentDraggingPointerId];\r\n delete this._lastPointerRay[this.currentDraggingPointerId];\r\n }\r\n this.currentDraggingPointerId = pointerId;\r\n }\r\n }\r\n\r\n // Keep track of last pointer ray, this is used simulating the start of a drag in startDrag()\r\n if (!this._lastPointerRay[pointerId]) {\r\n this._lastPointerRay[pointerId] = new Ray(new Vector3(), new Vector3());\r\n }\r\n if (pointerInfo.pickInfo && pointerInfo.pickInfo.ray) {\r\n this._lastPointerRay[pointerId].origin.copyFrom(pointerInfo.pickInfo.ray.origin);\r\n this._lastPointerRay[pointerId].direction.copyFrom(pointerInfo.pickInfo.ray.direction);\r\n\r\n if (this.currentDraggingPointerId == pointerId && this.dragging) {\r\n this._moveDrag(pointerInfo.pickInfo.ray);\r\n }\r\n }\r\n }\r\n });\r\n\r\n this._beforeRenderObserver = this._scene.onBeforeRenderObservable.add(() => {\r\n if (this._moving && this.moveAttached) {\r\n let needMatrixUpdate = false;\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedNode);\r\n // Slowly move mesh to avoid jitter\r\n this._targetPosition.subtractToRef(this.attachedNode.absolutePosition, this._tmpVector);\r\n this._tmpVector.scaleInPlace(this.dragDeltaRatio);\r\n this.attachedNode.getAbsolutePosition().addToRef(this._tmpVector, this._tmpVector);\r\n if (this.validateDrag(this._tmpVector)) {\r\n this.attachedNode.setAbsolutePosition(this._tmpVector);\r\n needMatrixUpdate = true;\r\n }\r\n PivotTools._RestorePivotPoint(this.attachedNode);\r\n if (needMatrixUpdate) {\r\n this.attachedNode.computeWorldMatrix();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Force release the drag action by code.\r\n */\r\n public releaseDrag() {\r\n if (this.dragging) {\r\n this.dragging = false;\r\n this.onDragEndObservable.notifyObservers({ dragPlanePoint: this.lastDragPosition, pointerId: this.currentDraggingPointerId, pointerInfo: this._activePointerInfo });\r\n }\r\n\r\n this.currentDraggingPointerId = -1;\r\n this._activeDragButton = -1;\r\n this._activePointerInfo = null;\r\n this._moving = false;\r\n\r\n // Reattach camera controls\r\n if (this.detachCameraControls && this._attachedToElement && this._scene.activeCamera && !this._scene.activeCamera.leftCamera) {\r\n if (this._scene.activeCamera.getClassName() === \"ArcRotateCamera\") {\r\n const arcRotateCamera = this._scene.activeCamera as ArcRotateCamera;\r\n arcRotateCamera.attachControl(\r\n arcRotateCamera.inputs ? arcRotateCamera.inputs.noPreventDefault : true,\r\n arcRotateCamera._useCtrlForPanning,\r\n arcRotateCamera._panningMouseButton\r\n );\r\n } else {\r\n this._scene.activeCamera.attachControl(this._scene.activeCamera.inputs ? this._scene.activeCamera.inputs.noPreventDefault : true);\r\n }\r\n this._attachedToElement = false;\r\n }\r\n }\r\n\r\n private _startDragRay = new Ray(new Vector3(), new Vector3());\r\n private _lastPointerRay: { [key: number]: Ray } = {};\r\n /**\r\n * Simulates the start of a pointer drag event on the behavior\r\n * @param pointerId pointerID of the pointer that should be simulated (Default: Any mouse pointer ID)\r\n * @param fromRay initial ray of the pointer to be simulated (Default: Ray from camera to attached mesh)\r\n * @param startPickedPoint picked point of the pointer to be simulated (Default: attached mesh position)\r\n */\r\n public startDrag(pointerId: number = PointerDragBehavior._AnyMouseId, fromRay?: Ray, startPickedPoint?: Vector3) {\r\n this._startDrag(pointerId, fromRay, startPickedPoint);\r\n\r\n let lastRay = this._lastPointerRay[pointerId];\r\n if (pointerId === PointerDragBehavior._AnyMouseId) {\r\n lastRay = this._lastPointerRay[Object.keys(this._lastPointerRay)[0]];\r\n }\r\n\r\n if (lastRay) {\r\n // if there was a last pointer ray drag the object there\r\n this._moveDrag(lastRay);\r\n }\r\n }\r\n\r\n protected _startDrag(pointerId: number, fromRay?: Ray, startPickedPoint?: Vector3) {\r\n if (!this._scene.activeCamera || this.dragging || !this.attachedNode) {\r\n return;\r\n }\r\n\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedNode);\r\n // Create start ray from the camera to the object\r\n if (fromRay) {\r\n this._startDragRay.direction.copyFrom(fromRay.direction);\r\n this._startDragRay.origin.copyFrom(fromRay.origin);\r\n } else {\r\n this._startDragRay.origin.copyFrom(this._scene.activeCamera.position);\r\n this.attachedNode.getWorldMatrix().getTranslationToRef(this._tmpVector);\r\n this._tmpVector.subtractToRef(this._scene.activeCamera.position, this._startDragRay.direction);\r\n }\r\n\r\n this._updateDragPlanePosition(this._startDragRay, startPickedPoint ? startPickedPoint : this._tmpVector);\r\n\r\n const pickedPoint = this._pickWithRayOnDragPlane(this._startDragRay);\r\n if (pickedPoint) {\r\n this.dragging = true;\r\n this.currentDraggingPointerId = pointerId;\r\n this.lastDragPosition.copyFrom(pickedPoint);\r\n this.onDragStartObservable.notifyObservers({ dragPlanePoint: pickedPoint, pointerId: this.currentDraggingPointerId, pointerInfo: this._activePointerInfo });\r\n this._targetPosition.copyFrom(this.attachedNode.getAbsolutePosition());\r\n\r\n // Detatch camera controls\r\n if (this.detachCameraControls && this._scene.activeCamera && this._scene.activeCamera.inputs && !this._scene.activeCamera.leftCamera) {\r\n if (this._scene.activeCamera.inputs.attachedToElement) {\r\n this._scene.activeCamera.detachControl();\r\n this._attachedToElement = true;\r\n } else {\r\n this._attachedToElement = false;\r\n }\r\n }\r\n } else {\r\n this.releaseDrag();\r\n }\r\n PivotTools._RestorePivotPoint(this.attachedNode);\r\n }\r\n\r\n private _dragDelta = new Vector3();\r\n protected _moveDrag(ray: Ray) {\r\n this._moving = true;\r\n const pickedPoint = this._pickWithRayOnDragPlane(ray);\r\n\r\n if (pickedPoint) {\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedNode);\r\n\r\n if (this.updateDragPlane) {\r\n this._updateDragPlanePosition(ray, pickedPoint);\r\n }\r\n let dragLength = 0;\r\n // depending on the drag mode option drag accordingly\r\n if (this._options.dragAxis) {\r\n // Convert local drag axis to world if useObjectOrientationForDragging\r\n this.useObjectOrientationForDragging\r\n ? Vector3.TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._worldDragAxis)\r\n : this._worldDragAxis.copyFrom(this._options.dragAxis);\r\n\r\n // Project delta drag from the drag plane onto the drag axis\r\n pickedPoint.subtractToRef(this.lastDragPosition, this._tmpVector);\r\n dragLength = Vector3.Dot(this._tmpVector, this._worldDragAxis);\r\n this._worldDragAxis.scaleToRef(dragLength, this._dragDelta);\r\n } else {\r\n dragLength = this._dragDelta.length();\r\n pickedPoint.subtractToRef(this.lastDragPosition, this._dragDelta);\r\n }\r\n this._targetPosition.addInPlace(this._dragDelta);\r\n this.onDragObservable.notifyObservers({\r\n dragDistance: dragLength,\r\n delta: this._dragDelta,\r\n dragPlanePoint: pickedPoint,\r\n dragPlaneNormal: this._dragPlane.forward,\r\n pointerId: this.currentDraggingPointerId,\r\n pointerInfo: this._activePointerInfo,\r\n });\r\n this.lastDragPosition.copyFrom(pickedPoint);\r\n\r\n PivotTools._RestorePivotPoint(this.attachedNode);\r\n }\r\n }\r\n\r\n private _pickWithRayOnDragPlane(ray: Nullable) {\r\n if (!ray) {\r\n return null;\r\n }\r\n\r\n // Calculate angle between plane normal and ray\r\n let angle = Math.acos(Vector3.Dot(this._dragPlane.forward, ray.direction));\r\n // Correct if ray is casted from oposite side\r\n if (angle > Math.PI / 2) {\r\n angle = Math.PI - angle;\r\n }\r\n\r\n // If the angle is too perpendicular to the plane pick another point on the plane where it is looking\r\n if (this.maxDragAngle > 0 && angle > this.maxDragAngle) {\r\n if (this._useAlternatePickedPointAboveMaxDragAngle) {\r\n // Invert ray direction along the towards object axis\r\n this._tmpVector.copyFrom(ray.direction);\r\n this.attachedNode.absolutePosition.subtractToRef(ray.origin, this._alternatePickedPoint);\r\n this._alternatePickedPoint.normalize();\r\n this._alternatePickedPoint.scaleInPlace(this._useAlternatePickedPointAboveMaxDragAngleDragSpeed * Vector3.Dot(this._alternatePickedPoint, this._tmpVector));\r\n this._tmpVector.addInPlace(this._alternatePickedPoint);\r\n\r\n // Project resulting vector onto the drag plane and add it to the attached nodes absolute position to get a picked point\r\n const dot = Vector3.Dot(this._dragPlane.forward, this._tmpVector);\r\n this._dragPlane.forward.scaleToRef(-dot, this._alternatePickedPoint);\r\n this._alternatePickedPoint.addInPlace(this._tmpVector);\r\n this._alternatePickedPoint.addInPlace(this.attachedNode.absolutePosition);\r\n return this._alternatePickedPoint;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n // use an infinite plane instead of ray picking a mesh that must be updated every frame\r\n const planeNormal = this._dragPlane.forward;\r\n const planePosition = this._dragPlane.position;\r\n const dotProduct = ray.direction.dot(planeNormal);\r\n if (Math.abs(dotProduct) < Epsilon) {\r\n // Ray and plane are parallel, no intersection\r\n return null;\r\n }\r\n\r\n planePosition.subtractToRef(ray.origin, TmpVectors.Vector3[0]);\r\n const t = TmpVectors.Vector3[0].dot(planeNormal) / dotProduct;\r\n // Ensure the intersection point is in front of the ray (t must be positive)\r\n if (t < 0) {\r\n // Intersection point is behind the ray\r\n return null;\r\n }\r\n\r\n // Calculate the intersection point using the parameter t\r\n ray.direction.scaleToRef(t, TmpVectors.Vector3[0]);\r\n const intersectionPoint = ray.origin.add(TmpVectors.Vector3[0]);\r\n return intersectionPoint;\r\n }\r\n\r\n // Variables to avoid instantiation in the below method\r\n private _pointA = new Vector3(0, 0, 0);\r\n private _pointC = new Vector3(0, 0, 0);\r\n private _localAxis = new Vector3(0, 0, 0);\r\n private _lookAt = new Vector3(0, 0, 0);\r\n // Position the drag plane based on the attached mesh position, for single axis rotate the plane along the axis to face the camera\r\n private _updateDragPlanePosition(ray: Ray, dragPlanePosition: Vector3) {\r\n this._pointA.copyFrom(dragPlanePosition);\r\n if (this._options.dragAxis) {\r\n this.useObjectOrientationForDragging\r\n ? Vector3.TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis)\r\n : this._localAxis.copyFrom(this._options.dragAxis);\r\n\r\n // Calculate plane normal that is the cross product of local axis and (eye-dragPlanePosition)\r\n ray.origin.subtractToRef(this._pointA, this._pointC);\r\n this._pointC.normalize();\r\n if (Math.abs(Vector3.Dot(this._localAxis, this._pointC)) > 0.999) {\r\n // the drag axis is colinear with the (eye to position) ray. The cross product will give jittered values.\r\n // A new axis vector need to be computed\r\n if (Math.abs(Vector3.Dot(Vector3.UpReadOnly, this._pointC)) > 0.999) {\r\n this._lookAt.copyFrom(Vector3.Right());\r\n } else {\r\n this._lookAt.copyFrom(Vector3.UpReadOnly);\r\n }\r\n } else {\r\n Vector3.CrossToRef(this._localAxis, this._pointC, this._lookAt);\r\n // Get perpendicular line from previous result and drag axis to adjust lineB to be perpendicular to camera\r\n Vector3.CrossToRef(this._localAxis, this._lookAt, this._lookAt);\r\n this._lookAt.normalize();\r\n }\r\n\r\n this._dragPlane.position.copyFrom(this._pointA);\r\n this._pointA.addToRef(this._lookAt, this._lookAt);\r\n this._dragPlane.lookAt(this._lookAt);\r\n } else if (this._options.dragPlaneNormal) {\r\n this.useObjectOrientationForDragging\r\n ? Vector3.TransformCoordinatesToRef(this._options.dragPlaneNormal, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis)\r\n : this._localAxis.copyFrom(this._options.dragPlaneNormal);\r\n this._dragPlane.position.copyFrom(this._pointA);\r\n this._pointA.addToRef(this._localAxis, this._lookAt);\r\n this._dragPlane.lookAt(this._lookAt);\r\n } else {\r\n this._dragPlane.position.copyFrom(this._pointA);\r\n this._dragPlane.lookAt(ray.origin);\r\n }\r\n // Update the position of the drag plane so it doesn't get out of sync with the node (eg. when moving back and forth quickly)\r\n this._dragPlane.position.copyFrom(this.attachedNode.getAbsolutePosition());\r\n\r\n this._dragPlane.computeWorldMatrix(true);\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n this._lastPointerRay = {};\r\n if (this.attachedNode) {\r\n this.attachedNode.isNearGrabbable = false;\r\n }\r\n if (this._pointerObserver) {\r\n this._scene.onPointerObservable.remove(this._pointerObserver);\r\n }\r\n if (this._beforeRenderObserver) {\r\n this._scene.onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n if (this._dragPlane) {\r\n this._dragPlane.dispose();\r\n }\r\n this.releaseDrag();\r\n }\r\n}\r\n", "import type { IEasingFunction } from \"./easing\";\r\n\r\n/**\r\n * Defines an interface which represents an animation key frame\r\n */\r\nexport interface IAnimationKey {\r\n /**\r\n * Frame of the key frame\r\n */\r\n frame: number;\r\n /**\r\n * Value at the specifies key frame\r\n */\r\n value: any;\r\n /**\r\n * The input tangent for the cubic hermite spline\r\n */\r\n inTangent?: any;\r\n /**\r\n * The output tangent for the cubic hermite spline\r\n */\r\n outTangent?: any;\r\n /**\r\n * The animation interpolation type\r\n */\r\n interpolation?: AnimationKeyInterpolation;\r\n /**\r\n * Property defined by UI tools to link (or not ) the tangents\r\n */\r\n lockedTangent?: boolean;\r\n /**\r\n * The easing function associated with the key frame (optional). If not defined, the easing function defined at the animation level (if any) will be used instead\r\n */\r\n easingFunction?: IEasingFunction;\r\n}\r\n\r\n/**\r\n * Enum for the animation key frame interpolation type\r\n */\r\nexport enum AnimationKeyInterpolation {\r\n /**\r\n * Use tangents to interpolate between start and end values.\r\n */\r\n NONE = 0,\r\n /**\r\n * Do not interpolate between keys and use the start key value only. Tangents are ignored\r\n */\r\n STEP = 1,\r\n}\r\n", "/**\r\n * Represents the range of an animation\r\n */\r\nexport class AnimationRange {\r\n /**\r\n * Initializes the range of an animation\r\n * @param name The name of the animation range\r\n * @param from The starting frame of the animation\r\n * @param to The ending frame of the animation\r\n */\r\n constructor(\r\n /**The name of the animation range**/\r\n public name: string,\r\n /**The starting frame of the animation */\r\n public from: number,\r\n /**The ending frame of the animation*/\r\n public to: number\r\n ) {}\r\n\r\n /**\r\n * Makes a copy of the animation range\r\n * @returns A copy of the animation range\r\n */\r\n public clone(): AnimationRange {\r\n return new AnimationRange(this.name, this.from, this.to);\r\n }\r\n}\r\n", "import type { IEasingFunction, EasingFunction } from \"./easing\";\r\nimport { Vector3, Quaternion, Vector2, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport { Scalar } from \"../Maths/math.scalar\";\r\nimport type { DeepImmutable, Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\nimport type { IAnimationKey } from \"./animationKey\";\r\nimport { AnimationKeyInterpolation } from \"./animationKey\";\r\nimport { AnimationRange } from \"./animationRange\";\r\nimport type { AnimationEvent } from \"./animationEvent\";\r\nimport { Node } from \"../node\";\r\nimport type { IAnimatable } from \"./animatable.interface\";\r\nimport { Size } from \"../Maths/math.size\";\r\nimport { WebRequest } from \"../Misc/webRequest\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Animatable } from \"./animatable\";\r\nimport type { RuntimeAnimation } from \"./runtimeAnimation\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\n\r\n// Static values to help the garbage collector\r\n\r\n// Quaternion\r\nexport const _staticOffsetValueQuaternion: DeepImmutable = Object.freeze(new Quaternion(0, 0, 0, 0));\r\n\r\n// Vector3\r\nexport const _staticOffsetValueVector3: DeepImmutable = Object.freeze(Vector3.Zero());\r\n\r\n// Vector2\r\nexport const _staticOffsetValueVector2: DeepImmutable = Object.freeze(Vector2.Zero());\r\n\r\n// Size\r\nexport const _staticOffsetValueSize: DeepImmutable = Object.freeze(Size.Zero());\r\n\r\n// Color3\r\nexport const _staticOffsetValueColor3: DeepImmutable = Object.freeze(Color3.Black());\r\n\r\n// Color4\r\nexport const _staticOffsetValueColor4: DeepImmutable = Object.freeze(new Color4(0, 0, 0, 0));\r\n\r\n/**\r\n * Options to be used when creating an additive animation\r\n */\r\nexport interface IMakeAnimationAdditiveOptions {\r\n /**\r\n * The frame that the animation should be relative to (if not provided, 0 will be used)\r\n */\r\n referenceFrame?: number;\r\n /**\r\n * The name of the animation range to convert to additive. If not provided, fromFrame / toFrame will be used\r\n * If fromFrame / toFrame are not provided either, the whole animation will be converted to additive\r\n */\r\n range?: string;\r\n /**\r\n * If true, the original animation will be cloned and converted to additive. If false, the original animation will be converted to additive (default is false)\r\n */\r\n cloneOriginalAnimation?: boolean;\r\n /**\r\n * The name of the cloned animation if cloneOriginalAnimation is true. If not provided, use the original animation name\r\n */\r\n clonedAnimationName?: string;\r\n /**\r\n * Together with toFrame, defines the range of the animation to convert to additive. Will only be used if range is not provided\r\n * If range and fromFrame / toFrame are not provided, the whole animation will be converted to additive\r\n */\r\n fromFrame?: number;\r\n /**\r\n * Together with fromFrame, defines the range of the animation to convert to additive.\r\n */\r\n toFrame?: number;\r\n /**\r\n * If true, the key frames will be clipped to the range specified by range or fromFrame / toFrame (default is false)\r\n */\r\n clipKeys?: boolean;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface _IAnimationState {\r\n key: number;\r\n repeatCount: number;\r\n workValue?: any;\r\n loopMode?: number;\r\n offsetValue?: any;\r\n highLimitValue?: any;\r\n}\r\n\r\nconst evaluateAnimationState: _IAnimationState = {\r\n key: 0,\r\n repeatCount: 0,\r\n loopMode: 2 /*Animation.ANIMATIONLOOPMODE_CONSTANT*/,\r\n};\r\n\r\n/**\r\n * Class used to store any kind of animation\r\n */\r\nexport class Animation {\r\n private static _UniqueIdGenerator = 0;\r\n\r\n /**\r\n * Use matrix interpolation instead of using direct key value when animating matrices\r\n */\r\n public static AllowMatricesInterpolation = false;\r\n\r\n /**\r\n * When matrix interpolation is enabled, this boolean forces the system to use Matrix.DecomposeLerp instead of Matrix.Lerp. Interpolation is more precise but slower\r\n */\r\n public static AllowMatrixDecomposeForInterpolation = true;\r\n\r\n /**\r\n * Gets or sets the unique id of the animation (the uniqueness is solely among other animations)\r\n */\r\n public uniqueId: number;\r\n\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n /** Snippet ID if the animation was created from the snippet server */\r\n public snippetId: string;\r\n\r\n /**\r\n * Stores the key frames of the animation\r\n */\r\n private _keys: Array;\r\n\r\n /**\r\n * Stores the easing function of the animation\r\n */\r\n private _easingFunction: Nullable = null;\r\n\r\n /**\r\n * @internal Internal use only\r\n */\r\n public _runtimeAnimations = new Array();\r\n\r\n /**\r\n * The set of event that will be linked to this animation\r\n */\r\n private _events = new Array();\r\n\r\n /**\r\n * Stores an array of target property paths\r\n */\r\n public targetPropertyPath: string[];\r\n\r\n /**\r\n * Stores the blending speed of the animation\r\n */\r\n public blendingSpeed = 0.01;\r\n\r\n /**\r\n * Stores the animation ranges for the animation\r\n */\r\n private _ranges: { [name: string]: Nullable } = {};\r\n\r\n /**\r\n * @internal Internal use\r\n */\r\n public static _PrepareAnimation(\r\n name: string,\r\n targetProperty: string,\r\n framePerSecond: number,\r\n totalFrame: number,\r\n from: any,\r\n to: any,\r\n loopMode?: number,\r\n easingFunction?: EasingFunction\r\n ): Nullable {\r\n let dataType = undefined;\r\n\r\n if (!isNaN(parseFloat(from)) && isFinite(from)) {\r\n dataType = Animation.ANIMATIONTYPE_FLOAT;\r\n } else if (from instanceof Quaternion) {\r\n dataType = Animation.ANIMATIONTYPE_QUATERNION;\r\n } else if (from instanceof Vector3) {\r\n dataType = Animation.ANIMATIONTYPE_VECTOR3;\r\n } else if (from instanceof Vector2) {\r\n dataType = Animation.ANIMATIONTYPE_VECTOR2;\r\n } else if (from instanceof Color3) {\r\n dataType = Animation.ANIMATIONTYPE_COLOR3;\r\n } else if (from instanceof Color4) {\r\n dataType = Animation.ANIMATIONTYPE_COLOR4;\r\n } else if (from instanceof Size) {\r\n dataType = Animation.ANIMATIONTYPE_SIZE;\r\n }\r\n\r\n if (dataType == undefined) {\r\n return null;\r\n }\r\n\r\n const animation = new Animation(name, targetProperty, framePerSecond, dataType, loopMode);\r\n\r\n const keys: Array = [\r\n { frame: 0, value: from },\r\n { frame: totalFrame, value: to },\r\n ];\r\n animation.setKeys(keys);\r\n\r\n if (easingFunction !== undefined) {\r\n animation.setEasingFunction(easingFunction);\r\n }\r\n\r\n return animation;\r\n }\r\n\r\n /**\r\n * Sets up an animation\r\n * @param property The property to animate\r\n * @param animationType The animation type to apply\r\n * @param framePerSecond The frames per second of the animation\r\n * @param easingFunction The easing function used in the animation\r\n * @returns The created animation\r\n */\r\n public static CreateAnimation(property: string, animationType: number, framePerSecond: number, easingFunction: EasingFunction): Animation {\r\n const animation: Animation = new Animation(property + \"Animation\", property, framePerSecond, animationType, Animation.ANIMATIONLOOPMODE_CONSTANT);\r\n\r\n animation.setEasingFunction(easingFunction);\r\n\r\n return animation;\r\n }\r\n\r\n /**\r\n * Create and start an animation on a node\r\n * @param name defines the name of the global animation that will be run on all nodes\r\n * @param target defines the target where the animation will take place\r\n * @param targetProperty defines property to animate\r\n * @param framePerSecond defines the number of frame per second yo use\r\n * @param totalFrame defines the number of frames in total\r\n * @param from defines the initial value\r\n * @param to defines the final value\r\n * @param loopMode defines which loop mode you want to use (off by default)\r\n * @param easingFunction defines the easing function to use (linear by default)\r\n * @param onAnimationEnd defines the callback to call when animation end\r\n * @param scene defines the hosting scene\r\n * @returns the animatable created for this animation\r\n */\r\n public static CreateAndStartAnimation(\r\n name: string,\r\n target: any,\r\n targetProperty: string,\r\n framePerSecond: number,\r\n totalFrame: number,\r\n from: any,\r\n to: any,\r\n loopMode?: number,\r\n easingFunction?: EasingFunction,\r\n onAnimationEnd?: () => void,\r\n scene?: Scene\r\n ): Nullable {\r\n const animation = Animation._PrepareAnimation(name, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction);\r\n\r\n if (!animation) {\r\n return null;\r\n }\r\n\r\n if (target.getScene) {\r\n scene = target.getScene();\r\n }\r\n\r\n if (!scene) {\r\n return null;\r\n }\r\n\r\n return scene.beginDirectAnimation(target, [animation], 0, totalFrame, animation.loopMode === 1, 1.0, onAnimationEnd);\r\n }\r\n\r\n /**\r\n * Create and start an animation on a node and its descendants\r\n * @param name defines the name of the global animation that will be run on all nodes\r\n * @param node defines the root node where the animation will take place\r\n * @param directDescendantsOnly if true only direct descendants will be used, if false direct and also indirect (children of children, an so on in a recursive manner) descendants will be used\r\n * @param targetProperty defines property to animate\r\n * @param framePerSecond defines the number of frame per second to use\r\n * @param totalFrame defines the number of frames in total\r\n * @param from defines the initial value\r\n * @param to defines the final value\r\n * @param loopMode defines which loop mode you want to use (off by default)\r\n * @param easingFunction defines the easing function to use (linear by default)\r\n * @param onAnimationEnd defines the callback to call when an animation ends (will be called once per node)\r\n * @returns the list of animatables created for all nodes\r\n * @example https://www.babylonjs-playground.com/#MH0VLI\r\n */\r\n public static CreateAndStartHierarchyAnimation(\r\n name: string,\r\n node: Node,\r\n directDescendantsOnly: boolean,\r\n targetProperty: string,\r\n framePerSecond: number,\r\n totalFrame: number,\r\n from: any,\r\n to: any,\r\n loopMode?: number,\r\n easingFunction?: EasingFunction,\r\n onAnimationEnd?: () => void\r\n ): Nullable {\r\n const animation = Animation._PrepareAnimation(name, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction);\r\n\r\n if (!animation) {\r\n return null;\r\n }\r\n\r\n const scene = node.getScene();\r\n return scene.beginDirectHierarchyAnimation(node, directDescendantsOnly, [animation], 0, totalFrame, animation.loopMode === 1, 1.0, onAnimationEnd);\r\n }\r\n\r\n /**\r\n * Creates a new animation, merges it with the existing animations and starts it\r\n * @param name Name of the animation\r\n * @param node Node which contains the scene that begins the animations\r\n * @param targetProperty Specifies which property to animate\r\n * @param framePerSecond The frames per second of the animation\r\n * @param totalFrame The total number of frames\r\n * @param from The frame at the beginning of the animation\r\n * @param to The frame at the end of the animation\r\n * @param loopMode Specifies the loop mode of the animation\r\n * @param easingFunction (Optional) The easing function of the animation, which allow custom mathematical formulas for animations\r\n * @param onAnimationEnd Callback to run once the animation is complete\r\n * @returns Nullable animation\r\n */\r\n public static CreateMergeAndStartAnimation(\r\n name: string,\r\n node: Node,\r\n targetProperty: string,\r\n framePerSecond: number,\r\n totalFrame: number,\r\n from: any,\r\n to: any,\r\n loopMode?: number,\r\n easingFunction?: EasingFunction,\r\n onAnimationEnd?: () => void\r\n ): Nullable {\r\n const animation = Animation._PrepareAnimation(name, targetProperty, framePerSecond, totalFrame, from, to, loopMode, easingFunction);\r\n\r\n if (!animation) {\r\n return null;\r\n }\r\n\r\n node.animations.push(animation);\r\n\r\n return node.getScene().beginAnimation(node, 0, totalFrame, animation.loopMode === 1, 1.0, onAnimationEnd);\r\n }\r\n\r\n /**\r\n * Convert the keyframes of an animation to be relative to a given reference frame.\r\n * @param sourceAnimation defines the Animation containing keyframes to convert\r\n * @param referenceFrame defines the frame that keyframes in the range will be relative to (default: 0)\r\n * @param range defines the name of the AnimationRange belonging to the Animation to convert\r\n * @param cloneOriginal defines whether or not to clone the animation and convert the clone or convert the original animation (default is false)\r\n * @param clonedName defines the name of the resulting cloned Animation if cloneOriginal is true\r\n * @returns a new Animation if cloneOriginal is true or the original Animation if cloneOriginal is false\r\n */\r\n public static MakeAnimationAdditive(sourceAnimation: Animation, referenceFrame?: number, range?: string, cloneOriginal?: boolean, clonedName?: string): Animation;\r\n\r\n /**\r\n * Convert the keyframes of an animation to be relative to a given reference frame.\r\n * @param sourceAnimation defines the Animation containing keyframes to convert\r\n * @param options defines the options to use when converting ey keyframes\r\n * @returns a new Animation if options.cloneOriginalAnimation is true or the original Animation if options.cloneOriginalAnimation is false\r\n */\r\n public static MakeAnimationAdditive(sourceAnimation: Animation, options?: IMakeAnimationAdditiveOptions): Animation;\r\n\r\n /** @internal */\r\n public static MakeAnimationAdditive(\r\n sourceAnimation: Animation,\r\n referenceFrameOrOptions?: number | IMakeAnimationAdditiveOptions,\r\n range?: string,\r\n cloneOriginal = false,\r\n clonedName?: string\r\n ): Animation {\r\n let options: IMakeAnimationAdditiveOptions;\r\n\r\n if (typeof referenceFrameOrOptions === \"object\") {\r\n options = referenceFrameOrOptions;\r\n } else {\r\n options = {\r\n referenceFrame: referenceFrameOrOptions ?? 0,\r\n range: range,\r\n cloneOriginalAnimation: cloneOriginal,\r\n clonedAnimationName: clonedName,\r\n };\r\n }\r\n\r\n let animation = sourceAnimation;\r\n\r\n if (options.cloneOriginalAnimation) {\r\n animation = sourceAnimation.clone();\r\n animation.name = options.clonedAnimationName || animation.name;\r\n }\r\n\r\n if (!animation._keys.length) {\r\n return animation;\r\n }\r\n\r\n const referenceFrame = options.referenceFrame && options.referenceFrame >= 0 ? options.referenceFrame : 0;\r\n let startIndex = 0;\r\n const firstKey = animation._keys[0];\r\n let endIndex = animation._keys.length - 1;\r\n const lastKey = animation._keys[endIndex];\r\n const valueStore = {\r\n referenceValue: firstKey.value,\r\n referencePosition: TmpVectors.Vector3[0],\r\n referenceQuaternion: TmpVectors.Quaternion[0],\r\n referenceScaling: TmpVectors.Vector3[1],\r\n keyPosition: TmpVectors.Vector3[2],\r\n keyQuaternion: TmpVectors.Quaternion[1],\r\n keyScaling: TmpVectors.Vector3[3],\r\n };\r\n let from = firstKey.frame;\r\n let to = lastKey.frame;\r\n if (options.range) {\r\n const rangeValue = animation.getRange(options.range);\r\n\r\n if (rangeValue) {\r\n from = rangeValue.from;\r\n to = rangeValue.to;\r\n }\r\n } else {\r\n from = options.fromFrame ?? from;\r\n to = options.toFrame ?? to;\r\n }\r\n\r\n if (from !== firstKey.frame) {\r\n startIndex = animation.createKeyForFrame(from);\r\n }\r\n\r\n if (to !== lastKey.frame) {\r\n endIndex = animation.createKeyForFrame(to);\r\n }\r\n\r\n // There's only one key, so use it\r\n if (animation._keys.length === 1) {\r\n const value = animation._getKeyValue(animation._keys[0]);\r\n valueStore.referenceValue = value.clone ? value.clone() : value;\r\n }\r\n\r\n // Reference frame is before the first frame, so just use the first frame\r\n else if (referenceFrame <= firstKey.frame) {\r\n const value = animation._getKeyValue(firstKey.value);\r\n valueStore.referenceValue = value.clone ? value.clone() : value;\r\n }\r\n\r\n // Reference frame is after the last frame, so just use the last frame\r\n else if (referenceFrame >= lastKey.frame) {\r\n const value = animation._getKeyValue(lastKey.value);\r\n valueStore.referenceValue = value.clone ? value.clone() : value;\r\n }\r\n\r\n // Interpolate the reference value from the animation\r\n else {\r\n evaluateAnimationState.key = 0;\r\n const value = animation._interpolate(referenceFrame, evaluateAnimationState);\r\n valueStore.referenceValue = value.clone ? value.clone() : value;\r\n }\r\n\r\n // Conjugate the quaternion\r\n if (animation.dataType === Animation.ANIMATIONTYPE_QUATERNION) {\r\n valueStore.referenceValue.normalize().conjugateInPlace();\r\n }\r\n\r\n // Decompose matrix and conjugate the quaternion\r\n else if (animation.dataType === Animation.ANIMATIONTYPE_MATRIX) {\r\n valueStore.referenceValue.decompose(valueStore.referenceScaling, valueStore.referenceQuaternion, valueStore.referencePosition);\r\n valueStore.referenceQuaternion.normalize().conjugateInPlace();\r\n }\r\n\r\n let startFrame = Number.MAX_VALUE;\r\n const clippedKeys: Nullable = options.clipKeys ? [] : null;\r\n\r\n // Subtract the reference value from all of the key values\r\n for (let index = startIndex; index <= endIndex; index++) {\r\n let key = animation._keys[index];\r\n\r\n if (clippedKeys) {\r\n key = {\r\n frame: key.frame,\r\n value: key.value.clone ? key.value.clone() : key.value,\r\n inTangent: key.inTangent,\r\n outTangent: key.outTangent,\r\n interpolation: key.interpolation,\r\n lockedTangent: key.lockedTangent,\r\n };\r\n if (startFrame === Number.MAX_VALUE) {\r\n startFrame = key.frame;\r\n }\r\n key.frame -= startFrame;\r\n clippedKeys.push(key);\r\n }\r\n\r\n // If this key was duplicated to create a frame 0 key, skip it because its value has already been updated\r\n if (index && animation.dataType !== Animation.ANIMATIONTYPE_FLOAT && key.value === firstKey.value) {\r\n continue;\r\n }\r\n\r\n switch (animation.dataType) {\r\n case Animation.ANIMATIONTYPE_MATRIX:\r\n key.value.decompose(valueStore.keyScaling, valueStore.keyQuaternion, valueStore.keyPosition);\r\n valueStore.keyPosition.subtractInPlace(valueStore.referencePosition);\r\n valueStore.keyScaling.divideInPlace(valueStore.referenceScaling);\r\n valueStore.referenceQuaternion.multiplyToRef(valueStore.keyQuaternion, valueStore.keyQuaternion);\r\n Matrix.ComposeToRef(valueStore.keyScaling, valueStore.keyQuaternion, valueStore.keyPosition, key.value);\r\n break;\r\n\r\n case Animation.ANIMATIONTYPE_QUATERNION:\r\n valueStore.referenceValue.multiplyToRef(key.value, key.value);\r\n break;\r\n\r\n case Animation.ANIMATIONTYPE_VECTOR2:\r\n case Animation.ANIMATIONTYPE_VECTOR3:\r\n case Animation.ANIMATIONTYPE_COLOR3:\r\n case Animation.ANIMATIONTYPE_COLOR4:\r\n key.value.subtractToRef(valueStore.referenceValue, key.value);\r\n break;\r\n\r\n case Animation.ANIMATIONTYPE_SIZE:\r\n key.value.width -= valueStore.referenceValue.width;\r\n key.value.height -= valueStore.referenceValue.height;\r\n break;\r\n\r\n default:\r\n key.value -= valueStore.referenceValue;\r\n }\r\n }\r\n\r\n if (clippedKeys) {\r\n animation.setKeys(clippedKeys, true);\r\n }\r\n\r\n return animation;\r\n }\r\n\r\n /**\r\n * Transition property of an host to the target Value\r\n * @param property The property to transition\r\n * @param targetValue The target Value of the property\r\n * @param host The object where the property to animate belongs\r\n * @param scene Scene used to run the animation\r\n * @param frameRate Framerate (in frame/s) to use\r\n * @param transition The transition type we want to use\r\n * @param duration The duration of the animation, in milliseconds\r\n * @param onAnimationEnd Callback trigger at the end of the animation\r\n * @returns Nullable animation\r\n */\r\n public static TransitionTo(\r\n property: string,\r\n targetValue: any,\r\n host: any,\r\n scene: Scene,\r\n frameRate: number,\r\n transition: Animation,\r\n duration: number,\r\n onAnimationEnd: Nullable<() => void> = null\r\n ): Nullable {\r\n if (duration <= 0) {\r\n host[property] = targetValue;\r\n if (onAnimationEnd) {\r\n onAnimationEnd();\r\n }\r\n return null;\r\n }\r\n\r\n const endFrame: number = frameRate * (duration / 1000);\r\n\r\n transition.setKeys([\r\n {\r\n frame: 0,\r\n value: host[property].clone ? host[property].clone() : host[property],\r\n },\r\n {\r\n frame: endFrame,\r\n value: targetValue,\r\n },\r\n ]);\r\n\r\n if (!host.animations) {\r\n host.animations = [];\r\n }\r\n\r\n host.animations.push(transition);\r\n\r\n const animation: Animatable = scene.beginAnimation(host, 0, endFrame, false);\r\n animation.onAnimationEnd = onAnimationEnd;\r\n return animation;\r\n }\r\n\r\n /**\r\n * Return the array of runtime animations currently using this animation\r\n */\r\n public get runtimeAnimations(): RuntimeAnimation[] {\r\n return this._runtimeAnimations;\r\n }\r\n\r\n /**\r\n * Specifies if any of the runtime animations are currently running\r\n */\r\n public get hasRunningRuntimeAnimations(): boolean {\r\n for (const runtimeAnimation of this._runtimeAnimations) {\r\n if (!runtimeAnimation.isStopped()) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Initializes the animation\r\n * @param name Name of the animation\r\n * @param targetProperty Property to animate\r\n * @param framePerSecond The frames per second of the animation\r\n * @param dataType The data type of the animation\r\n * @param loopMode The loop mode of the animation\r\n * @param enableBlending Specifies if blending should be enabled\r\n */\r\n constructor(\r\n /**Name of the animation */\r\n public name: string,\r\n /**Property to animate */\r\n public targetProperty: string,\r\n /**The frames per second of the animation */\r\n public framePerSecond: number,\r\n /**The data type of the animation */\r\n public dataType: number,\r\n /**The loop mode of the animation */\r\n public loopMode?: number,\r\n /**Specifies if blending should be enabled */\r\n public enableBlending?: boolean\r\n ) {\r\n this.targetPropertyPath = targetProperty.split(\".\");\r\n this.dataType = dataType;\r\n this.loopMode = loopMode === undefined ? Animation.ANIMATIONLOOPMODE_CYCLE : loopMode;\r\n this.uniqueId = Animation._UniqueIdGenerator++;\r\n }\r\n\r\n // Methods\r\n /**\r\n * Converts the animation to a string\r\n * @param fullDetails support for multiple levels of logging within scene loading\r\n * @returns String form of the animation\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name + \", property: \" + this.targetProperty;\r\n ret += \", datatype: \" + [\"Float\", \"Vector3\", \"Quaternion\", \"Matrix\", \"Color3\", \"Vector2\"][this.dataType];\r\n ret += \", nKeys: \" + (this._keys ? this._keys.length : \"none\");\r\n ret += \", nRanges: \" + (this._ranges ? Object.keys(this._ranges).length : \"none\");\r\n if (fullDetails) {\r\n ret += \", Ranges: {\";\r\n let first = true;\r\n for (const name in this._ranges) {\r\n if (first) {\r\n ret += \", \";\r\n first = false;\r\n }\r\n ret += name;\r\n }\r\n ret += \"}\";\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Add an event to this animation\r\n * @param event Event to add\r\n */\r\n public addEvent(event: AnimationEvent): void {\r\n this._events.push(event);\r\n this._events.sort((a, b) => a.frame - b.frame);\r\n }\r\n\r\n /**\r\n * Remove all events found at the given frame\r\n * @param frame The frame to remove events from\r\n */\r\n public removeEvents(frame: number): void {\r\n for (let index = 0; index < this._events.length; index++) {\r\n if (this._events[index].frame === frame) {\r\n this._events.splice(index, 1);\r\n index--;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Retrieves all the events from the animation\r\n * @returns Events from the animation\r\n */\r\n public getEvents(): AnimationEvent[] {\r\n return this._events;\r\n }\r\n\r\n /**\r\n * Creates an animation range\r\n * @param name Name of the animation range\r\n * @param from Starting frame of the animation range\r\n * @param to Ending frame of the animation\r\n */\r\n public createRange(name: string, from: number, to: number): void {\r\n // check name not already in use; could happen for bones after serialized\r\n if (!this._ranges[name]) {\r\n this._ranges[name] = new AnimationRange(name, from, to);\r\n }\r\n }\r\n\r\n /**\r\n * Deletes an animation range by name\r\n * @param name Name of the animation range to delete\r\n * @param deleteFrames Specifies if the key frames for the range should also be deleted (true) or not (false)\r\n */\r\n public deleteRange(name: string, deleteFrames = true): void {\r\n const range = this._ranges[name];\r\n if (!range) {\r\n return;\r\n }\r\n if (deleteFrames) {\r\n const from = range.from;\r\n const to = range.to;\r\n\r\n // this loop MUST go high to low for multiple splices to work\r\n for (let key = this._keys.length - 1; key >= 0; key--) {\r\n if (this._keys[key].frame >= from && this._keys[key].frame <= to) {\r\n this._keys.splice(key, 1);\r\n }\r\n }\r\n }\r\n this._ranges[name] = null; // said much faster than 'delete this._range[name]'\r\n }\r\n\r\n /**\r\n * Gets the animation range by name, or null if not defined\r\n * @param name Name of the animation range\r\n * @returns Nullable animation range\r\n */\r\n public getRange(name: string): Nullable {\r\n return this._ranges[name];\r\n }\r\n\r\n /**\r\n * Gets the key frames from the animation\r\n * @returns The key frames of the animation\r\n */\r\n public getKeys(): Array {\r\n return this._keys;\r\n }\r\n\r\n /**\r\n * Gets the highest frame rate of the animation\r\n * @returns Highest frame rate of the animation\r\n */\r\n public getHighestFrame(): number {\r\n let ret = 0;\r\n\r\n for (let key = 0, nKeys = this._keys.length; key < nKeys; key++) {\r\n if (ret < this._keys[key].frame) {\r\n ret = this._keys[key].frame;\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Gets the easing function of the animation\r\n * @returns Easing function of the animation\r\n */\r\n public getEasingFunction(): Nullable {\r\n return this._easingFunction;\r\n }\r\n\r\n /**\r\n * Sets the easing function of the animation\r\n * @param easingFunction A custom mathematical formula for animation\r\n */\r\n public setEasingFunction(easingFunction: Nullable): void {\r\n this._easingFunction = easingFunction;\r\n }\r\n\r\n /**\r\n * Interpolates a scalar linearly\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated scalar value\r\n */\r\n public floatInterpolateFunction(startValue: number, endValue: number, gradient: number): number {\r\n return Scalar.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a scalar cubically\r\n * @param startValue Start value of the animation curve\r\n * @param outTangent End tangent of the animation\r\n * @param endValue End value of the animation curve\r\n * @param inTangent Start tangent of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated scalar value\r\n */\r\n public floatInterpolateFunctionWithTangents(startValue: number, outTangent: number, endValue: number, inTangent: number, gradient: number): number {\r\n return Scalar.Hermite(startValue, outTangent, endValue, inTangent, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a quaternion using a spherical linear interpolation\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated quaternion value\r\n */\r\n public quaternionInterpolateFunction(startValue: Quaternion, endValue: Quaternion, gradient: number): Quaternion {\r\n return Quaternion.Slerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a quaternion cubically\r\n * @param startValue Start value of the animation curve\r\n * @param outTangent End tangent of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param inTangent Start tangent of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated quaternion value\r\n */\r\n public quaternionInterpolateFunctionWithTangents(startValue: Quaternion, outTangent: Quaternion, endValue: Quaternion, inTangent: Quaternion, gradient: number): Quaternion {\r\n return Quaternion.Hermite(startValue, outTangent, endValue, inTangent, gradient).normalize();\r\n }\r\n\r\n /**\r\n * Interpolates a Vector3 linearly\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\r\n * @returns Interpolated scalar value\r\n */\r\n public vector3InterpolateFunction(startValue: Vector3, endValue: Vector3, gradient: number): Vector3 {\r\n return Vector3.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Vector3 cubically\r\n * @param startValue Start value of the animation curve\r\n * @param outTangent End tangent of the animation\r\n * @param endValue End value of the animation curve\r\n * @param inTangent Start tangent of the animation curve\r\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\r\n * @returns InterpolatedVector3 value\r\n */\r\n public vector3InterpolateFunctionWithTangents(startValue: Vector3, outTangent: Vector3, endValue: Vector3, inTangent: Vector3, gradient: number): Vector3 {\r\n return Vector3.Hermite(startValue, outTangent, endValue, inTangent, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Vector2 linearly\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\r\n * @returns Interpolated Vector2 value\r\n */\r\n public vector2InterpolateFunction(startValue: Vector2, endValue: Vector2, gradient: number): Vector2 {\r\n return Vector2.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Vector2 cubically\r\n * @param startValue Start value of the animation curve\r\n * @param outTangent End tangent of the animation\r\n * @param endValue End value of the animation curve\r\n * @param inTangent Start tangent of the animation curve\r\n * @param gradient Scalar amount to interpolate (value between 0 and 1)\r\n * @returns Interpolated Vector2 value\r\n */\r\n public vector2InterpolateFunctionWithTangents(startValue: Vector2, outTangent: Vector2, endValue: Vector2, inTangent: Vector2, gradient: number): Vector2 {\r\n return Vector2.Hermite(startValue, outTangent, endValue, inTangent, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a size linearly\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated Size value\r\n */\r\n public sizeInterpolateFunction(startValue: Size, endValue: Size, gradient: number): Size {\r\n return Size.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Color3 linearly\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated Color3 value\r\n */\r\n public color3InterpolateFunction(startValue: Color3, endValue: Color3, gradient: number): Color3 {\r\n return Color3.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Color3 cubically\r\n * @param startValue Start value of the animation curve\r\n * @param outTangent End tangent of the animation\r\n * @param endValue End value of the animation curve\r\n * @param inTangent Start tangent of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns interpolated value\r\n */\r\n public color3InterpolateFunctionWithTangents(startValue: Color3, outTangent: Color3, endValue: Color3, inTangent: Color3, gradient: number): Color3 {\r\n return Color3.Hermite(startValue, outTangent, endValue, inTangent, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Color4 linearly\r\n * @param startValue Start value of the animation curve\r\n * @param endValue End value of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns Interpolated Color3 value\r\n */\r\n public color4InterpolateFunction(startValue: Color4, endValue: Color4, gradient: number): Color4 {\r\n return Color4.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Interpolates a Color4 cubically\r\n * @param startValue Start value of the animation curve\r\n * @param outTangent End tangent of the animation\r\n * @param endValue End value of the animation curve\r\n * @param inTangent Start tangent of the animation curve\r\n * @param gradient Scalar amount to interpolate\r\n * @returns interpolated value\r\n */\r\n public color4InterpolateFunctionWithTangents(startValue: Color4, outTangent: Color4, endValue: Color4, inTangent: Color4, gradient: number): Color4 {\r\n return Color4.Hermite(startValue, outTangent, endValue, inTangent, gradient);\r\n }\r\n\r\n /**\r\n * @internal Internal use only\r\n */\r\n public _getKeyValue(value: any): any {\r\n if (typeof value === \"function\") {\r\n return value();\r\n }\r\n\r\n return value;\r\n }\r\n\r\n /**\r\n * Evaluate the animation value at a given frame\r\n * @param currentFrame defines the frame where we want to evaluate the animation\r\n * @returns the animation value\r\n */\r\n public evaluate(currentFrame: number) {\r\n evaluateAnimationState.key = 0;\r\n return this._interpolate(currentFrame, evaluateAnimationState);\r\n }\r\n\r\n /**\r\n * @internal Internal use only\r\n */\r\n public _interpolate(currentFrame: number, state: _IAnimationState, searchClosestKeyOnly = false): any {\r\n if (state.loopMode === Animation.ANIMATIONLOOPMODE_CONSTANT && state.repeatCount > 0) {\r\n return state.highLimitValue.clone ? state.highLimitValue.clone() : state.highLimitValue;\r\n }\r\n\r\n const keys = this._keys;\r\n const keysLength = keys.length;\r\n\r\n let key = state.key;\r\n\r\n while (key >= 0 && currentFrame < keys[key].frame) {\r\n --key;\r\n }\r\n\r\n while (key + 1 <= keysLength - 1 && currentFrame >= keys[key + 1].frame) {\r\n ++key;\r\n }\r\n\r\n state.key = key;\r\n\r\n if (key < 0) {\r\n return searchClosestKeyOnly ? undefined : this._getKeyValue(keys[0].value);\r\n } else if (key + 1 > keysLength - 1) {\r\n return searchClosestKeyOnly ? undefined : this._getKeyValue(keys[keysLength - 1].value);\r\n }\r\n\r\n const startKey = keys[key];\r\n const endKey = keys[key + 1];\r\n\r\n if (searchClosestKeyOnly && (currentFrame === startKey.frame || currentFrame === endKey.frame)) {\r\n return undefined;\r\n }\r\n\r\n const startValue = this._getKeyValue(startKey.value);\r\n const endValue = this._getKeyValue(endKey.value);\r\n if (startKey.interpolation === AnimationKeyInterpolation.STEP) {\r\n if (endKey.frame > currentFrame) {\r\n return startValue;\r\n } else {\r\n return endValue;\r\n }\r\n }\r\n\r\n const useTangent = startKey.outTangent !== undefined && endKey.inTangent !== undefined;\r\n const frameDelta = endKey.frame - startKey.frame;\r\n\r\n // gradient : percent of currentFrame between the frame inf and the frame sup\r\n let gradient = (currentFrame - startKey.frame) / frameDelta;\r\n\r\n // check for easingFunction and correction of gradient\r\n const easingFunction = startKey.easingFunction || this.getEasingFunction();\r\n if (easingFunction !== null) {\r\n gradient = easingFunction.ease(gradient);\r\n }\r\n\r\n switch (this.dataType) {\r\n // Float\r\n case Animation.ANIMATIONTYPE_FLOAT: {\r\n const floatValue = useTangent\r\n ? this.floatInterpolateFunctionWithTangents(startValue, startKey.outTangent * frameDelta, endValue, endKey.inTangent * frameDelta, gradient)\r\n : this.floatInterpolateFunction(startValue, endValue, gradient);\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return floatValue;\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return (state.offsetValue ?? 0) * state.repeatCount + floatValue;\r\n }\r\n break;\r\n }\r\n // Quaternion\r\n case Animation.ANIMATIONTYPE_QUATERNION: {\r\n const quatValue = useTangent\r\n ? this.quaternionInterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient)\r\n : this.quaternionInterpolateFunction(startValue, endValue, gradient);\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return quatValue;\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return quatValue.addInPlace((state.offsetValue || _staticOffsetValueQuaternion).scale(state.repeatCount));\r\n }\r\n\r\n return quatValue;\r\n }\r\n // Vector3\r\n case Animation.ANIMATIONTYPE_VECTOR3: {\r\n const vec3Value = useTangent\r\n ? this.vector3InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient)\r\n : this.vector3InterpolateFunction(startValue, endValue, gradient);\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return vec3Value;\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return vec3Value.add((state.offsetValue || _staticOffsetValueVector3).scale(state.repeatCount));\r\n }\r\n break;\r\n }\r\n // Vector2\r\n case Animation.ANIMATIONTYPE_VECTOR2: {\r\n const vec2Value = useTangent\r\n ? this.vector2InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient)\r\n : this.vector2InterpolateFunction(startValue, endValue, gradient);\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return vec2Value;\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return vec2Value.add((state.offsetValue || _staticOffsetValueVector2).scale(state.repeatCount));\r\n }\r\n break;\r\n }\r\n // Size\r\n case Animation.ANIMATIONTYPE_SIZE: {\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return this.sizeInterpolateFunction(startValue, endValue, gradient);\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return this.sizeInterpolateFunction(startValue, endValue, gradient).add((state.offsetValue || _staticOffsetValueSize).scale(state.repeatCount));\r\n }\r\n break;\r\n }\r\n // Color3\r\n case Animation.ANIMATIONTYPE_COLOR3: {\r\n const color3Value = useTangent\r\n ? this.color3InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient)\r\n : this.color3InterpolateFunction(startValue, endValue, gradient);\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return color3Value;\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return color3Value.add((state.offsetValue || _staticOffsetValueColor3).scale(state.repeatCount));\r\n }\r\n break;\r\n }\r\n // Color4\r\n case Animation.ANIMATIONTYPE_COLOR4: {\r\n const color4Value = useTangent\r\n ? this.color4InterpolateFunctionWithTangents(startValue, startKey.outTangent.scale(frameDelta), endValue, endKey.inTangent.scale(frameDelta), gradient)\r\n : this.color4InterpolateFunction(startValue, endValue, gradient);\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO:\r\n return color4Value;\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT:\r\n return color4Value.add((state.offsetValue || _staticOffsetValueColor4).scale(state.repeatCount));\r\n }\r\n break;\r\n }\r\n // Matrix\r\n case Animation.ANIMATIONTYPE_MATRIX: {\r\n switch (state.loopMode) {\r\n case Animation.ANIMATIONLOOPMODE_CYCLE:\r\n case Animation.ANIMATIONLOOPMODE_CONSTANT:\r\n case Animation.ANIMATIONLOOPMODE_YOYO: {\r\n if (Animation.AllowMatricesInterpolation) {\r\n return this.matrixInterpolateFunction(startValue, endValue, gradient, state.workValue);\r\n }\r\n return startValue;\r\n }\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE:\r\n case Animation.ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT: {\r\n return startValue;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Defines the function to use to interpolate matrices\r\n * @param startValue defines the start matrix\r\n * @param endValue defines the end matrix\r\n * @param gradient defines the gradient between both matrices\r\n * @param result defines an optional target matrix where to store the interpolation\r\n * @returns the interpolated matrix\r\n */\r\n public matrixInterpolateFunction(startValue: Matrix, endValue: Matrix, gradient: number, result?: Matrix): Matrix {\r\n if (Animation.AllowMatrixDecomposeForInterpolation) {\r\n if (result) {\r\n Matrix.DecomposeLerpToRef(startValue, endValue, gradient, result);\r\n return result;\r\n }\r\n return Matrix.DecomposeLerp(startValue, endValue, gradient);\r\n }\r\n\r\n if (result) {\r\n Matrix.LerpToRef(startValue, endValue, gradient, result);\r\n return result;\r\n }\r\n return Matrix.Lerp(startValue, endValue, gradient);\r\n }\r\n\r\n /**\r\n * Makes a copy of the animation\r\n * @returns Cloned animation\r\n */\r\n public clone(): Animation {\r\n const clone = new Animation(this.name, this.targetPropertyPath.join(\".\"), this.framePerSecond, this.dataType, this.loopMode);\r\n\r\n clone.enableBlending = this.enableBlending;\r\n clone.blendingSpeed = this.blendingSpeed;\r\n\r\n if (this._keys) {\r\n clone.setKeys(this._keys);\r\n }\r\n\r\n if (this._ranges) {\r\n clone._ranges = {};\r\n for (const name in this._ranges) {\r\n const range = this._ranges[name];\r\n if (!range) {\r\n continue;\r\n }\r\n clone._ranges[name] = range.clone();\r\n }\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Sets the key frames of the animation\r\n * @param values The animation key frames to set\r\n * @param dontClone Whether to clone the keys or not (default is false, so the array of keys is cloned)\r\n */\r\n public setKeys(values: Array, dontClone = false): void {\r\n this._keys = !dontClone ? values.slice(0) : values;\r\n }\r\n\r\n /**\r\n * Creates a key for the frame passed as a parameter and adds it to the animation IF a key doesn't already exist for that frame\r\n * @param frame Frame number\r\n * @returns The key index if the key was added or the index of the pre existing key if the frame passed as parameter already has a corresponding key\r\n */\r\n public createKeyForFrame(frame: number) {\r\n // Find the key corresponding to frame\r\n evaluateAnimationState.key = 0;\r\n const value = this._interpolate(frame, evaluateAnimationState, true);\r\n\r\n if (!value) {\r\n // A key corresponding to this frame already exists\r\n return this._keys[evaluateAnimationState.key].frame === frame ? evaluateAnimationState.key : evaluateAnimationState.key + 1;\r\n }\r\n\r\n // The frame is between two keys, so create a new key\r\n const newKey: IAnimationKey = {\r\n frame,\r\n value: value.clone ? value.clone() : value,\r\n };\r\n\r\n this._keys.splice(evaluateAnimationState.key + 1, 0, newKey);\r\n\r\n return evaluateAnimationState.key + 1;\r\n }\r\n\r\n /**\r\n * Serializes the animation to an object\r\n * @returns Serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.property = this.targetProperty;\r\n serializationObject.framePerSecond = this.framePerSecond;\r\n serializationObject.dataType = this.dataType;\r\n serializationObject.loopBehavior = this.loopMode;\r\n serializationObject.enableBlending = this.enableBlending;\r\n serializationObject.blendingSpeed = this.blendingSpeed;\r\n\r\n const dataType = this.dataType;\r\n serializationObject.keys = [];\r\n const keys = this.getKeys();\r\n for (let index = 0; index < keys.length; index++) {\r\n const animationKey = keys[index];\r\n\r\n const key: any = {};\r\n key.frame = animationKey.frame;\r\n\r\n switch (dataType) {\r\n case Animation.ANIMATIONTYPE_FLOAT:\r\n key.values = [animationKey.value];\r\n if (animationKey.inTangent !== undefined) {\r\n key.values.push(animationKey.inTangent);\r\n }\r\n if (animationKey.outTangent !== undefined) {\r\n if (animationKey.inTangent === undefined) {\r\n key.values.push(undefined);\r\n }\r\n key.values.push(animationKey.outTangent);\r\n }\r\n if (animationKey.interpolation !== undefined) {\r\n if (animationKey.inTangent === undefined) {\r\n key.values.push(undefined);\r\n }\r\n if (animationKey.outTangent === undefined) {\r\n key.values.push(undefined);\r\n }\r\n key.values.push(animationKey.interpolation);\r\n }\r\n break;\r\n case Animation.ANIMATIONTYPE_QUATERNION:\r\n case Animation.ANIMATIONTYPE_MATRIX:\r\n case Animation.ANIMATIONTYPE_VECTOR3:\r\n case Animation.ANIMATIONTYPE_COLOR3:\r\n case Animation.ANIMATIONTYPE_COLOR4:\r\n key.values = animationKey.value.asArray();\r\n if (animationKey.inTangent != undefined) {\r\n key.values.push(animationKey.inTangent.asArray());\r\n }\r\n if (animationKey.outTangent != undefined) {\r\n if (animationKey.inTangent === undefined) {\r\n key.values.push(undefined);\r\n }\r\n key.values.push(animationKey.outTangent.asArray());\r\n }\r\n if (animationKey.interpolation !== undefined) {\r\n if (animationKey.inTangent === undefined) {\r\n key.values.push(undefined);\r\n }\r\n if (animationKey.outTangent === undefined) {\r\n key.values.push(undefined);\r\n }\r\n key.values.push(animationKey.interpolation);\r\n }\r\n break;\r\n }\r\n\r\n serializationObject.keys.push(key);\r\n }\r\n\r\n serializationObject.ranges = [];\r\n for (const name in this._ranges) {\r\n const source = this._ranges[name];\r\n\r\n if (!source) {\r\n continue;\r\n }\r\n const range: any = {};\r\n range.name = name;\r\n range.from = source.from;\r\n range.to = source.to;\r\n serializationObject.ranges.push(range);\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Float animation type\r\n */\r\n public static readonly ANIMATIONTYPE_FLOAT = 0;\r\n /**\r\n * Vector3 animation type\r\n */\r\n public static readonly ANIMATIONTYPE_VECTOR3 = 1;\r\n /**\r\n * Quaternion animation type\r\n */\r\n public static readonly ANIMATIONTYPE_QUATERNION = 2;\r\n /**\r\n * Matrix animation type\r\n */\r\n public static readonly ANIMATIONTYPE_MATRIX = 3;\r\n /**\r\n * Color3 animation type\r\n */\r\n public static readonly ANIMATIONTYPE_COLOR3 = 4;\r\n /**\r\n * Color3 animation type\r\n */\r\n public static readonly ANIMATIONTYPE_COLOR4 = 7;\r\n /**\r\n * Vector2 animation type\r\n */\r\n public static readonly ANIMATIONTYPE_VECTOR2 = 5;\r\n /**\r\n * Size animation type\r\n */\r\n public static readonly ANIMATIONTYPE_SIZE = 6;\r\n /**\r\n * Relative Loop Mode\r\n */\r\n public static readonly ANIMATIONLOOPMODE_RELATIVE = 0;\r\n /**\r\n * Cycle Loop Mode\r\n */\r\n public static readonly ANIMATIONLOOPMODE_CYCLE = 1;\r\n /**\r\n * Constant Loop Mode\r\n */\r\n public static readonly ANIMATIONLOOPMODE_CONSTANT = 2;\r\n /**\r\n * Yoyo Loop Mode\r\n */\r\n public static readonly ANIMATIONLOOPMODE_YOYO = 4;\r\n /**\r\n * Relative Loop Mode (add to current value of animated object, unlike ANIMATIONLOOPMODE_RELATIVE)\r\n */\r\n public static readonly ANIMATIONLOOPMODE_RELATIVE_FROM_CURRENT = 5;\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _UniversalLerp(left: any, right: any, amount: number): any {\r\n const constructor = left.constructor;\r\n if (constructor.Lerp) {\r\n // Lerp supported\r\n return constructor.Lerp(left, right, amount);\r\n } else if (constructor.Slerp) {\r\n // Slerp supported\r\n return constructor.Slerp(left, right, amount);\r\n } else if (left.toFixed) {\r\n // Number\r\n return left * (1.0 - amount) + amount * right;\r\n } else {\r\n // Blending not supported\r\n return right;\r\n }\r\n }\r\n\r\n /**\r\n * Parses an animation object and creates an animation\r\n * @param parsedAnimation Parsed animation object\r\n * @returns Animation object\r\n */\r\n public static Parse(parsedAnimation: any): Animation {\r\n const animation = new Animation(parsedAnimation.name, parsedAnimation.property, parsedAnimation.framePerSecond, parsedAnimation.dataType, parsedAnimation.loopBehavior);\r\n\r\n const dataType = parsedAnimation.dataType;\r\n const keys: Array = [];\r\n let data;\r\n let index: number;\r\n\r\n if (parsedAnimation.enableBlending) {\r\n animation.enableBlending = parsedAnimation.enableBlending;\r\n }\r\n\r\n if (parsedAnimation.blendingSpeed) {\r\n animation.blendingSpeed = parsedAnimation.blendingSpeed;\r\n }\r\n\r\n for (index = 0; index < parsedAnimation.keys.length; index++) {\r\n const key = parsedAnimation.keys[index];\r\n let inTangent: any = undefined;\r\n let outTangent: any = undefined;\r\n let interpolation: any = undefined;\r\n\r\n switch (dataType) {\r\n case Animation.ANIMATIONTYPE_FLOAT:\r\n data = key.values[0];\r\n if (key.values.length >= 2) {\r\n inTangent = key.values[1];\r\n }\r\n if (key.values.length >= 3) {\r\n outTangent = key.values[2];\r\n }\r\n if (key.values.length >= 4) {\r\n interpolation = key.values[3];\r\n }\r\n break;\r\n case Animation.ANIMATIONTYPE_QUATERNION:\r\n data = Quaternion.FromArray(key.values);\r\n if (key.values.length >= 8) {\r\n const _inTangent = Quaternion.FromArray(key.values.slice(4, 8));\r\n if (!_inTangent.equals(Quaternion.Zero())) {\r\n inTangent = _inTangent;\r\n }\r\n }\r\n if (key.values.length >= 12) {\r\n const _outTangent = Quaternion.FromArray(key.values.slice(8, 12));\r\n if (!_outTangent.equals(Quaternion.Zero())) {\r\n outTangent = _outTangent;\r\n }\r\n }\r\n if (key.values.length >= 13) {\r\n interpolation = key.values[12];\r\n }\r\n break;\r\n case Animation.ANIMATIONTYPE_MATRIX:\r\n data = Matrix.FromArray(key.values);\r\n if (key.values.length >= 17) {\r\n interpolation = key.values[16];\r\n }\r\n break;\r\n case Animation.ANIMATIONTYPE_COLOR3:\r\n data = Color3.FromArray(key.values);\r\n if (key.values[3]) {\r\n inTangent = Color3.FromArray(key.values[3]);\r\n }\r\n if (key.values[4]) {\r\n outTangent = Color3.FromArray(key.values[4]);\r\n }\r\n if (key.values[5]) {\r\n interpolation = key.values[5];\r\n }\r\n break;\r\n case Animation.ANIMATIONTYPE_COLOR4:\r\n data = Color4.FromArray(key.values);\r\n if (key.values[4]) {\r\n inTangent = Color4.FromArray(key.values[4]);\r\n }\r\n if (key.values[5]) {\r\n outTangent = Color4.FromArray(key.values[5]);\r\n }\r\n if (key.values[6]) {\r\n interpolation = Color4.FromArray(key.values[6]);\r\n }\r\n break;\r\n case Animation.ANIMATIONTYPE_VECTOR3:\r\n default:\r\n data = Vector3.FromArray(key.values);\r\n if (key.values[3]) {\r\n inTangent = Vector3.FromArray(key.values[3]);\r\n }\r\n if (key.values[4]) {\r\n outTangent = Vector3.FromArray(key.values[4]);\r\n }\r\n if (key.values[5]) {\r\n interpolation = key.values[5];\r\n }\r\n break;\r\n }\r\n\r\n const keyData: any = {};\r\n keyData.frame = key.frame;\r\n keyData.value = data;\r\n\r\n if (inTangent != undefined) {\r\n keyData.inTangent = inTangent;\r\n }\r\n if (outTangent != undefined) {\r\n keyData.outTangent = outTangent;\r\n }\r\n if (interpolation != undefined) {\r\n keyData.interpolation = interpolation;\r\n }\r\n keys.push(keyData);\r\n }\r\n\r\n animation.setKeys(keys);\r\n\r\n if (parsedAnimation.ranges) {\r\n for (index = 0; index < parsedAnimation.ranges.length; index++) {\r\n data = parsedAnimation.ranges[index];\r\n animation.createRange(data.name, data.from, data.to);\r\n }\r\n }\r\n\r\n return animation;\r\n }\r\n\r\n /**\r\n * Appends the serialized animations from the source animations\r\n * @param source Source containing the animations\r\n * @param destination Target to store the animations\r\n */\r\n public static AppendSerializedAnimations(source: IAnimatable, destination: any): void {\r\n SerializationHelper.AppendSerializedAnimations(source, destination);\r\n }\r\n\r\n /**\r\n * Creates a new animation or an array of animations from a snippet saved in a remote file\r\n * @param name defines the name of the animation to create (can be null or empty to use the one from the json data)\r\n * @param url defines the url to load from\r\n * @returns a promise that will resolve to the new animation or an array of animations\r\n */\r\n public static ParseFromFileAsync(name: Nullable, url: string): Promise> {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n let serializationObject = JSON.parse(request.responseText);\r\n if (serializationObject.animations) {\r\n serializationObject = serializationObject.animations;\r\n }\r\n\r\n if (serializationObject.length) {\r\n const output: Animation[] = [];\r\n for (const serializedAnimation of serializationObject) {\r\n output.push(this.Parse(serializedAnimation));\r\n }\r\n\r\n resolve(output);\r\n } else {\r\n const output = this.Parse(serializationObject);\r\n\r\n if (name) {\r\n output.name = name;\r\n }\r\n\r\n resolve(output);\r\n }\r\n } else {\r\n reject(\"Unable to load the animation\");\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", url);\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates an animation or an array of animations from a snippet saved by the Inspector\r\n * @param snippetId defines the snippet to load\r\n * @returns a promise that will resolve to the new animation or a new array of animations\r\n */\r\n public static ParseFromSnippetAsync(snippetId: string): Promise> {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n\r\n if (snippet.animations) {\r\n const serializationObject = JSON.parse(snippet.animations);\r\n const outputs: Animation[] = [];\r\n for (const serializedAnimation of serializationObject.animations) {\r\n const output = this.Parse(serializedAnimation);\r\n output.snippetId = snippetId;\r\n outputs.push(output);\r\n }\r\n\r\n resolve(outputs);\r\n } else {\r\n const serializationObject = JSON.parse(snippet.animation);\r\n const output = this.Parse(serializationObject);\r\n\r\n output.snippetId = snippetId;\r\n\r\n resolve(output);\r\n }\r\n } else {\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates an animation or an array of animations from a snippet saved by the Inspector\r\n * @deprecated Please use ParseFromSnippetAsync instead\r\n * @param snippetId defines the snippet to load\r\n * @returns a promise that will resolve to the new animation or a new array of animations\r\n */\r\n public static CreateFromSnippetAsync = Animation.ParseFromSnippetAsync;\r\n}\r\n\r\nRegisterClass(\"BABYLON.Animation\", Animation);\r\nNode._AnimationRangeFactory = (name: string, from: number, to: number) => new AnimationRange(name, from, to);\r\n", "import type { Animatable } from \"./animatable\";\r\nimport { Animation } from \"./animation\";\r\nimport type { IMakeAnimationAdditiveOptions } from \"./animation\";\r\nimport type { IAnimationKey } from \"./animationKey\";\r\n\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport { Tags } from \"../Misc/tags\";\r\nimport type { AnimationGroupMask } from \"./animationGroupMask\";\r\n\r\n/**\r\n * This class defines the direct association between an animation and a target\r\n */\r\nexport class TargetedAnimation {\r\n /**\r\n * Animation to perform\r\n */\r\n public animation: Animation;\r\n /**\r\n * Target to animate\r\n */\r\n public target: any;\r\n\r\n /**\r\n * Returns the string \"TargetedAnimation\"\r\n * @returns \"TargetedAnimation\"\r\n */\r\n public getClassName(): string {\r\n return \"TargetedAnimation\";\r\n }\r\n\r\n /**\r\n * Serialize the object\r\n * @returns the JSON object representing the current entity\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n serializationObject.animation = this.animation.serialize();\r\n serializationObject.targetId = this.target.id;\r\n\r\n return serializationObject;\r\n }\r\n}\r\n\r\n/**\r\n * Options to be used when creating an additive group animation\r\n */\r\nexport interface IMakeAnimationGroupAdditiveOptions extends IMakeAnimationAdditiveOptions {\r\n /**\r\n * Defines if the animation group should be cloned or not (default is false)\r\n */\r\n cloneOriginalAnimationGroup?: boolean;\r\n /**\r\n * The name of the cloned animation group if cloneOriginalAnimationGroup is true\r\n */\r\n clonedAnimationGroupName?: string;\r\n}\r\n\r\n/**\r\n * Use this class to create coordinated animations on multiple targets\r\n */\r\nexport class AnimationGroup implements IDisposable {\r\n private _scene: Scene;\r\n\r\n private _targetedAnimations = new Array();\r\n private _animatables = new Array();\r\n private _from = Number.MAX_VALUE;\r\n private _to = -Number.MAX_VALUE;\r\n private _isStarted: boolean;\r\n private _isPaused: boolean;\r\n private _speedRatio = 1;\r\n private _loopAnimation = false;\r\n private _isAdditive = false;\r\n private _weight = -1;\r\n private _playOrder = 0;\r\n private _enableBlending: Nullable = null;\r\n private _blendingSpeed: Nullable = null;\r\n private _numActiveAnimatables = 0;\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable = null;\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * This observable will notify when one animation have ended\r\n */\r\n public onAnimationEndObservable = new Observable();\r\n\r\n /**\r\n * Observer raised when one animation loops\r\n */\r\n public onAnimationLoopObservable = new Observable();\r\n\r\n /**\r\n * Observer raised when all animations have looped\r\n */\r\n public onAnimationGroupLoopObservable = new Observable();\r\n\r\n /**\r\n * This observable will notify when all animations have ended.\r\n */\r\n public onAnimationGroupEndObservable = new Observable();\r\n\r\n /**\r\n * This observable will notify when all animations have paused.\r\n */\r\n public onAnimationGroupPauseObservable = new Observable();\r\n\r\n /**\r\n * This observable will notify when all animations are playing.\r\n */\r\n public onAnimationGroupPlayObservable = new Observable();\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the node\r\n */\r\n public metadata: any = null;\r\n\r\n private _mask: Nullable = null;\r\n\r\n /**\r\n * Gets or sets the mask associated with this animation group. This mask is used to filter which objects should be animated.\r\n */\r\n public get mask() {\r\n return this._mask;\r\n }\r\n\r\n public set mask(value: Nullable) {\r\n if (this._mask === value) {\r\n return;\r\n }\r\n\r\n this._mask = value;\r\n\r\n this.syncWithMask(true);\r\n }\r\n\r\n /**\r\n * Makes sure that the animations are either played or stopped according to the animation group mask.\r\n * Note however that the call won't have any effect if the animation group has not been started yet.\r\n * @param forceUpdate If true, forces to loop over the animatables even if no mask is defined (used internally, you shouldn't need to use it). Default: false.\r\n */\r\n public syncWithMask(forceUpdate = false) {\r\n if (!this.mask && !forceUpdate) {\r\n this._numActiveAnimatables = this._targetedAnimations.length;\r\n return;\r\n }\r\n\r\n this._numActiveAnimatables = 0;\r\n\r\n for (let i = 0; i < this._animatables.length; ++i) {\r\n const animatable = this._animatables[i];\r\n\r\n if (!this.mask || this.mask.disabled || this.mask.retainsTarget(animatable.target.name)) {\r\n this._numActiveAnimatables++;\r\n if (animatable.paused) {\r\n animatable.restart();\r\n }\r\n } else {\r\n if (!animatable.paused) {\r\n animatable.pause();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Removes all animations for the targets not retained by the animation group mask.\r\n * Use this function if you know you won't need those animations anymore and if you want to free memory.\r\n */\r\n public removeUnmaskedAnimations() {\r\n if (!this.mask || this.mask.disabled) {\r\n return;\r\n }\r\n\r\n // Removes all animatables (in case the animation group has already been started)\r\n for (let i = 0; i < this._animatables.length; ++i) {\r\n const animatable = this._animatables[i];\r\n\r\n if (!this.mask.retainsTarget(animatable.target.name)) {\r\n animatable.stop();\r\n this._animatables.splice(i, 1);\r\n --i;\r\n }\r\n }\r\n\r\n // Removes the targeted animations\r\n for (let index = 0; index < this._targetedAnimations.length; index++) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n\r\n if (!this.mask.retainsTarget(targetedAnimation.target.name)) {\r\n this._targetedAnimations.splice(index, 1);\r\n --index;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the first frame\r\n */\r\n public get from(): number {\r\n return this._from;\r\n }\r\n\r\n public set from(value: number) {\r\n if (this._from === value) {\r\n return;\r\n }\r\n\r\n this._from = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.fromFrame = this._from;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the last frame\r\n */\r\n public get to(): number {\r\n return this._to;\r\n }\r\n\r\n public set to(value: number) {\r\n if (this._to === value) {\r\n return;\r\n }\r\n\r\n this._to = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.toFrame = this._to;\r\n }\r\n }\r\n\r\n /**\r\n * Define if the animations are started\r\n */\r\n public get isStarted(): boolean {\r\n return this._isStarted;\r\n }\r\n\r\n /**\r\n * Gets a value indicating that the current group is playing\r\n */\r\n public get isPlaying(): boolean {\r\n return this._isStarted && !this._isPaused;\r\n }\r\n\r\n /**\r\n * Gets or sets the speed ratio to use for all animations\r\n */\r\n public get speedRatio(): number {\r\n return this._speedRatio;\r\n }\r\n\r\n /**\r\n * Gets or sets the speed ratio to use for all animations\r\n */\r\n public set speedRatio(value: number) {\r\n if (this._speedRatio === value) {\r\n return;\r\n }\r\n\r\n this._speedRatio = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.speedRatio = this._speedRatio;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets if all animations should loop or not\r\n */\r\n public get loopAnimation(): boolean {\r\n return this._loopAnimation;\r\n }\r\n\r\n public set loopAnimation(value: boolean) {\r\n if (this._loopAnimation === value) {\r\n return;\r\n }\r\n\r\n this._loopAnimation = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.loopAnimation = this._loopAnimation;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets if all animations should be evaluated additively\r\n */\r\n public get isAdditive(): boolean {\r\n return this._isAdditive;\r\n }\r\n\r\n public set isAdditive(value: boolean) {\r\n if (this._isAdditive === value) {\r\n return;\r\n }\r\n\r\n this._isAdditive = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.isAdditive = this._isAdditive;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the weight to apply to all animations of the group\r\n */\r\n public get weight(): number {\r\n return this._weight;\r\n }\r\n\r\n public set weight(value: number) {\r\n if (this._weight === value) {\r\n return;\r\n }\r\n\r\n this._weight = value;\r\n this.setWeightForAllAnimatables(this._weight);\r\n }\r\n\r\n /**\r\n * Gets the targeted animations for this animation group\r\n */\r\n public get targetedAnimations(): Array {\r\n return this._targetedAnimations;\r\n }\r\n\r\n /**\r\n * returning the list of animatables controlled by this animation group.\r\n */\r\n public get animatables(): Array {\r\n return this._animatables;\r\n }\r\n\r\n /**\r\n * Gets the list of target animations\r\n */\r\n public get children() {\r\n return this._targetedAnimations;\r\n }\r\n\r\n /**\r\n * Gets or sets the order of play of the animation group (default: 0)\r\n */\r\n public get playOrder() {\r\n return this._playOrder;\r\n }\r\n\r\n public set playOrder(value: number) {\r\n if (this._playOrder === value) {\r\n return;\r\n }\r\n\r\n this._playOrder = value;\r\n\r\n if (this._animatables.length > 0) {\r\n for (let i = 0; i < this._animatables.length; i++) {\r\n this._animatables[i].playOrder = this._playOrder;\r\n }\r\n\r\n this._scene.sortActiveAnimatables();\r\n }\r\n }\r\n\r\n /**\r\n * Allows the animations of the animation group to blend with current running animations\r\n * Note that a null value means that each animation will use their own existing blending configuration (Animation.enableBlending)\r\n */\r\n public get enableBlending() {\r\n return this._enableBlending;\r\n }\r\n\r\n public set enableBlending(value: Nullable) {\r\n if (this._enableBlending === value) {\r\n return;\r\n }\r\n\r\n this._enableBlending = value;\r\n\r\n if (value !== null) {\r\n for (let i = 0; i < this._targetedAnimations.length; ++i) {\r\n this._targetedAnimations[i].animation.enableBlending = value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the animation blending speed\r\n * Note that a null value means that each animation will use their own existing blending configuration (Animation.blendingSpeed)\r\n */\r\n public get blendingSpeed() {\r\n return this._blendingSpeed;\r\n }\r\n\r\n public set blendingSpeed(value: Nullable) {\r\n if (this._blendingSpeed === value) {\r\n return;\r\n }\r\n\r\n this._blendingSpeed = value;\r\n\r\n if (value !== null) {\r\n for (let i = 0; i < this._targetedAnimations.length; ++i) {\r\n this._targetedAnimations[i].animation.blendingSpeed = value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the length (in seconds) of the animation group\r\n * This function assumes that all animations are played at the same framePerSecond speed!\r\n * Note: you can only call this method after you've added at least one targeted animation!\r\n * @param from Starting frame range (default is AnimationGroup.from)\r\n * @param to Ending frame range (default is AnimationGroup.to)\r\n * @returns The length in seconds\r\n */\r\n public getLength(from?: number, to?: number): number {\r\n from = from ?? this._from;\r\n to = to ?? this._to;\r\n\r\n const fps = this.targetedAnimations[0].animation.framePerSecond * this._speedRatio;\r\n\r\n return (to - from) / fps;\r\n }\r\n\r\n /**\r\n * Merge the array of animation groups into a new animation group\r\n * @param animationGroups List of animation groups to merge\r\n * @param disposeSource If true, animation groups will be disposed after being merged (default: true)\r\n * @param normalize If true, animation groups will be normalized before being merged, so that all animations have the same \"from\" and \"to\" frame (default: false)\r\n * @param weight Weight for the new animation group. If not provided, it will inherit the weight from the first animation group of the array\r\n * @returns The new animation group or null if no animation groups were passed\r\n */\r\n public static MergeAnimationGroups(animationGroups: Array, disposeSource = true, normalize = false, weight?: number): Nullable {\r\n if (animationGroups.length === 0) {\r\n return null;\r\n }\r\n\r\n weight = weight ?? animationGroups[0].weight;\r\n\r\n let beginFrame = Number.MAX_VALUE;\r\n let endFrame = -Number.MAX_VALUE;\r\n\r\n if (normalize) {\r\n for (const animationGroup of animationGroups) {\r\n if (animationGroup.from < beginFrame) {\r\n beginFrame = animationGroup.from;\r\n }\r\n\r\n if (animationGroup.to > endFrame) {\r\n endFrame = animationGroup.to;\r\n }\r\n }\r\n }\r\n\r\n const mergedAnimationGroup = new AnimationGroup(animationGroups[0].name + \"_merged\", animationGroups[0]._scene, weight);\r\n\r\n for (const animationGroup of animationGroups) {\r\n if (normalize) {\r\n animationGroup.normalize(beginFrame, endFrame);\r\n }\r\n\r\n for (const targetedAnimation of animationGroup.targetedAnimations) {\r\n mergedAnimationGroup.addTargetedAnimation(targetedAnimation.animation, targetedAnimation.target);\r\n }\r\n\r\n if (disposeSource) {\r\n animationGroup.dispose();\r\n }\r\n }\r\n\r\n return mergedAnimationGroup;\r\n }\r\n\r\n /**\r\n * Instantiates a new Animation Group.\r\n * This helps managing several animations at once.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/groupAnimations\r\n * @param name Defines the name of the group\r\n * @param scene Defines the scene the group belongs to\r\n * @param weight Defines the weight to use for animations in the group (-1.0 by default, meaning \"no weight\")\r\n * @param playOrder Defines the order of play of the animation group (default is 0)\r\n */\r\n public constructor(\r\n /** The name of the animation group */\r\n public name: string,\r\n scene: Nullable = null,\r\n weight = -1,\r\n playOrder = 0\r\n ) {\r\n this._scene = scene || EngineStore.LastCreatedScene!;\r\n this._weight = weight;\r\n this._playOrder = playOrder;\r\n this.uniqueId = this._scene.getUniqueId();\r\n\r\n this._scene.addAnimationGroup(this);\r\n }\r\n\r\n /**\r\n * Add an animation (with its target) in the group\r\n * @param animation defines the animation we want to add\r\n * @param target defines the target of the animation\r\n * @returns the TargetedAnimation object\r\n */\r\n public addTargetedAnimation(animation: Animation, target: any): TargetedAnimation {\r\n const targetedAnimation = new TargetedAnimation();\r\n targetedAnimation.animation = animation;\r\n targetedAnimation.target = target;\r\n\r\n const keys = animation.getKeys();\r\n if (this._from > keys[0].frame) {\r\n this._from = keys[0].frame;\r\n }\r\n\r\n if (this._to < keys[keys.length - 1].frame) {\r\n this._to = keys[keys.length - 1].frame;\r\n }\r\n\r\n if (this._enableBlending !== null) {\r\n animation.enableBlending = this._enableBlending;\r\n }\r\n\r\n if (this._blendingSpeed !== null) {\r\n animation.blendingSpeed = this._blendingSpeed;\r\n }\r\n\r\n this._targetedAnimations.push(targetedAnimation);\r\n\r\n return targetedAnimation;\r\n }\r\n\r\n /**\r\n * Remove an animation from the group\r\n * @param animation defines the animation we want to remove\r\n */\r\n public removeTargetedAnimation(animation: Animation) {\r\n for (let index = this._targetedAnimations.length - 1; index > -1; index--) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n if (targetedAnimation.animation === animation) {\r\n this._targetedAnimations.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This function will normalize every animation in the group to make sure they all go from beginFrame to endFrame\r\n * It can add constant keys at begin or end\r\n * @param beginFrame defines the new begin frame for all animations or the smallest begin frame of all animations if null (defaults to null)\r\n * @param endFrame defines the new end frame for all animations or the largest end frame of all animations if null (defaults to null)\r\n * @returns the animation group\r\n */\r\n public normalize(beginFrame: Nullable = null, endFrame: Nullable = null): AnimationGroup {\r\n if (beginFrame == null) {\r\n beginFrame = this._from;\r\n }\r\n if (endFrame == null) {\r\n endFrame = this._to;\r\n }\r\n\r\n for (let index = 0; index < this._targetedAnimations.length; index++) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n const keys = targetedAnimation.animation.getKeys();\r\n const startKey = keys[0];\r\n const endKey = keys[keys.length - 1];\r\n\r\n if (startKey.frame > beginFrame) {\r\n const newKey: IAnimationKey = {\r\n frame: beginFrame,\r\n value: startKey.value,\r\n inTangent: startKey.inTangent,\r\n outTangent: startKey.outTangent,\r\n interpolation: startKey.interpolation,\r\n };\r\n keys.splice(0, 0, newKey);\r\n }\r\n\r\n if (endKey.frame < endFrame) {\r\n const newKey: IAnimationKey = {\r\n frame: endFrame,\r\n value: endKey.value,\r\n inTangent: endKey.inTangent,\r\n outTangent: endKey.outTangent,\r\n interpolation: endKey.interpolation,\r\n };\r\n keys.push(newKey);\r\n }\r\n }\r\n\r\n this._from = beginFrame;\r\n this._to = endFrame;\r\n\r\n return this;\r\n }\r\n\r\n private _animationLoopCount: number;\r\n private _animationLoopFlags: boolean[] = [];\r\n\r\n private _processLoop(animatable: Animatable, targetedAnimation: TargetedAnimation, index: number) {\r\n animatable.onAnimationLoop = () => {\r\n this.onAnimationLoopObservable.notifyObservers(targetedAnimation);\r\n\r\n if (this._animationLoopFlags[index]) {\r\n return;\r\n }\r\n\r\n this._animationLoopFlags[index] = true;\r\n\r\n this._animationLoopCount++;\r\n if (this._animationLoopCount === this._numActiveAnimatables) {\r\n this.onAnimationGroupLoopObservable.notifyObservers(this);\r\n this._animationLoopCount = 0;\r\n this._animationLoopFlags.length = 0;\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Start all animations on given targets\r\n * @param loop defines if animations must loop\r\n * @param speedRatio defines the ratio to apply to animation speed (1 by default)\r\n * @param from defines the from key (optional)\r\n * @param to defines the to key (optional)\r\n * @param isAdditive defines the additive state for the resulting animatables (optional)\r\n * @returns the current animation group\r\n */\r\n public start(loop = false, speedRatio = 1, from?: number, to?: number, isAdditive?: boolean): AnimationGroup {\r\n if (this._isStarted || this._targetedAnimations.length === 0) {\r\n return this;\r\n }\r\n\r\n this._loopAnimation = loop;\r\n\r\n this._animationLoopCount = 0;\r\n this._animationLoopFlags.length = 0;\r\n\r\n for (let index = 0; index < this._targetedAnimations.length; index++) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n const animatable = this._scene.beginDirectAnimation(\r\n targetedAnimation.target,\r\n [targetedAnimation.animation],\r\n from !== undefined ? from : this._from,\r\n to !== undefined ? to : this._to,\r\n loop,\r\n speedRatio,\r\n undefined,\r\n undefined,\r\n isAdditive !== undefined ? isAdditive : this._isAdditive\r\n );\r\n animatable.weight = this._weight;\r\n animatable.playOrder = this._playOrder;\r\n animatable.onAnimationEnd = () => {\r\n this.onAnimationEndObservable.notifyObservers(targetedAnimation);\r\n this._checkAnimationGroupEnded(animatable);\r\n };\r\n\r\n this._processLoop(animatable, targetedAnimation, index);\r\n this._animatables.push(animatable);\r\n }\r\n\r\n this.syncWithMask();\r\n\r\n this._scene.sortActiveAnimatables();\r\n\r\n this._speedRatio = speedRatio;\r\n\r\n this._isStarted = true;\r\n this._isPaused = false;\r\n\r\n this.onAnimationGroupPlayObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Pause all animations\r\n * @returns the animation group\r\n */\r\n public pause(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n this._isPaused = true;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.pause();\r\n }\r\n\r\n this.onAnimationGroupPauseObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Play all animations to initial state\r\n * This function will start() the animations if they were not started or will restart() them if they were paused\r\n * @param loop defines if animations must loop\r\n * @returns the animation group\r\n */\r\n public play(loop?: boolean): AnimationGroup {\r\n // only if all animatables are ready and exist\r\n if (this.isStarted && this._animatables.length === this._targetedAnimations.length) {\r\n if (loop !== undefined) {\r\n this.loopAnimation = loop;\r\n }\r\n this.restart();\r\n } else {\r\n this.stop();\r\n this.start(loop, this._speedRatio);\r\n }\r\n\r\n this._isPaused = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Reset all animations to initial state\r\n * @returns the animation group\r\n */\r\n public reset(): AnimationGroup {\r\n if (!this._isStarted) {\r\n this.play();\r\n this.goToFrame(0);\r\n this.stop();\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.reset();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Restart animations from key 0\r\n * @returns the animation group\r\n */\r\n public restart(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.restart();\r\n }\r\n\r\n this.syncWithMask();\r\n\r\n this.onAnimationGroupPlayObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Stop all animations\r\n * @returns the animation group\r\n */\r\n public stop(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n const list = this._animatables.slice();\r\n for (let index = 0; index < list.length; index++) {\r\n list[index].stop(undefined, undefined, true);\r\n }\r\n\r\n // We will take care of removing all stopped animatables\r\n let curIndex = 0;\r\n for (let index = 0; index < this._scene._activeAnimatables.length; index++) {\r\n const animatable = this._scene._activeAnimatables[index];\r\n if (animatable._runtimeAnimations.length > 0) {\r\n this._scene._activeAnimatables[curIndex++] = animatable;\r\n }\r\n }\r\n this._scene._activeAnimatables.length = curIndex;\r\n\r\n this._isStarted = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set animation weight for all animatables\r\n *\r\n * @since 6.12.4\r\n * You can pass the weight to the AnimationGroup constructor, or use the weight property to set it after the group has been created,\r\n * making it easier to define the overall animation weight than calling setWeightForAllAnimatables() after the animation group has been started\r\n * @param weight defines the weight to use\r\n * @returns the animationGroup\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#animation-weights\r\n */\r\n public setWeightForAllAnimatables(weight: number): AnimationGroup {\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.weight = weight;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Synchronize and normalize all animatables with a source animatable\r\n * @param root defines the root animatable to synchronize with (null to stop synchronizing)\r\n * @returns the animationGroup\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#animation-weights\r\n */\r\n public syncAllAnimationsWith(root: Nullable): AnimationGroup {\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.syncWith(root);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Goes to a specific frame in this animation group\r\n * @param frame the frame number to go to\r\n * @returns the animationGroup\r\n */\r\n public goToFrame(frame: number): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.goToFrame(frame);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Dispose all associated resources\r\n */\r\n public dispose(): void {\r\n this._targetedAnimations.length = 0;\r\n this._animatables.length = 0;\r\n\r\n // Remove from scene\r\n const index = this._scene.animationGroups.indexOf(this);\r\n\r\n if (index > -1) {\r\n this._scene.animationGroups.splice(index, 1);\r\n }\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.animationGroups.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.animationGroups.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n this.onAnimationEndObservable.clear();\r\n this.onAnimationGroupEndObservable.clear();\r\n this.onAnimationGroupPauseObservable.clear();\r\n this.onAnimationGroupPlayObservable.clear();\r\n this.onAnimationLoopObservable.clear();\r\n this.onAnimationGroupLoopObservable.clear();\r\n }\r\n\r\n private _checkAnimationGroupEnded(animatable: Animatable) {\r\n // animatable should be taken out of the array\r\n const idx = this._animatables.indexOf(animatable);\r\n if (idx > -1) {\r\n this._animatables.splice(idx, 1);\r\n }\r\n\r\n // all animatables were removed? animation group ended!\r\n if (this._animatables.length === 0) {\r\n this._isStarted = false;\r\n this.onAnimationGroupEndObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Clone the current animation group and returns a copy\r\n * @param newName defines the name of the new group\r\n * @param targetConverter defines an optional function used to convert current animation targets to new ones\r\n * @param cloneAnimations defines if the animations should be cloned or referenced\r\n * @returns the new animation group\r\n */\r\n public clone(newName: string, targetConverter?: (oldTarget: any) => any, cloneAnimations = false): AnimationGroup {\r\n const newGroup = new AnimationGroup(newName || this.name, this._scene, this._weight, this._playOrder);\r\n\r\n newGroup._from = this.from;\r\n newGroup._to = this.to;\r\n newGroup._speedRatio = this.speedRatio;\r\n newGroup._loopAnimation = this.loopAnimation;\r\n newGroup._isAdditive = this.isAdditive;\r\n newGroup._enableBlending = this.enableBlending;\r\n newGroup._blendingSpeed = this.blendingSpeed;\r\n newGroup.metadata = this.metadata;\r\n newGroup.mask = this.mask;\r\n\r\n for (const targetAnimation of this._targetedAnimations) {\r\n newGroup.addTargetedAnimation(\r\n cloneAnimations ? targetAnimation.animation.clone() : targetAnimation.animation,\r\n targetConverter ? targetConverter(targetAnimation.target) : targetAnimation.target\r\n );\r\n }\r\n\r\n return newGroup;\r\n }\r\n\r\n /**\r\n * Serializes the animationGroup to an object\r\n * @returns Serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.from = this.from;\r\n serializationObject.to = this.to;\r\n serializationObject.speedRatio = this.speedRatio;\r\n serializationObject.loopAnimation = this.loopAnimation;\r\n serializationObject.isAdditive = this.isAdditive;\r\n serializationObject.weight = this.weight;\r\n serializationObject.playOrder = this.playOrder;\r\n serializationObject.enableBlending = this.enableBlending;\r\n serializationObject.blendingSpeed = this.blendingSpeed;\r\n\r\n serializationObject.targetedAnimations = [];\r\n for (let targetedAnimationIndex = 0; targetedAnimationIndex < this.targetedAnimations.length; targetedAnimationIndex++) {\r\n const targetedAnimation = this.targetedAnimations[targetedAnimationIndex];\r\n serializationObject.targetedAnimations[targetedAnimationIndex] = targetedAnimation.serialize();\r\n }\r\n\r\n if (Tags && Tags.HasTags(this)) {\r\n serializationObject.tags = Tags.GetTags(this);\r\n }\r\n\r\n // Metadata\r\n if (this.metadata) {\r\n serializationObject.metadata = this.metadata;\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Returns a new AnimationGroup object parsed from the source provided.\r\n * @param parsedAnimationGroup defines the source\r\n * @param scene defines the scene that will receive the animationGroup\r\n * @returns a new AnimationGroup\r\n */\r\n public static Parse(parsedAnimationGroup: any, scene: Scene): AnimationGroup {\r\n const animationGroup = new AnimationGroup(parsedAnimationGroup.name, scene, parsedAnimationGroup.weight, parsedAnimationGroup.playOrder);\r\n for (let i = 0; i < parsedAnimationGroup.targetedAnimations.length; i++) {\r\n const targetedAnimation = parsedAnimationGroup.targetedAnimations[i];\r\n const animation = Animation.Parse(targetedAnimation.animation);\r\n const id = targetedAnimation.targetId;\r\n if (targetedAnimation.animation.property === \"influence\") {\r\n // morph target animation\r\n const morphTarget = scene.getMorphTargetById(id);\r\n if (morphTarget) {\r\n animationGroup.addTargetedAnimation(animation, morphTarget);\r\n }\r\n } else {\r\n const targetNode = scene.getNodeById(id);\r\n\r\n if (targetNode != null) {\r\n animationGroup.addTargetedAnimation(animation, targetNode);\r\n }\r\n }\r\n }\r\n\r\n if (Tags) {\r\n Tags.AddTagsTo(animationGroup, parsedAnimationGroup.tags);\r\n }\r\n\r\n if (parsedAnimationGroup.from !== null && parsedAnimationGroup.to !== null) {\r\n animationGroup.normalize(parsedAnimationGroup.from, parsedAnimationGroup.to);\r\n }\r\n\r\n if (parsedAnimationGroup.speedRatio !== undefined) {\r\n animationGroup._speedRatio = parsedAnimationGroup.speedRatio;\r\n }\r\n if (parsedAnimationGroup.loopAnimation !== undefined) {\r\n animationGroup._loopAnimation = parsedAnimationGroup.loopAnimation;\r\n }\r\n\r\n if (parsedAnimationGroup.isAdditive !== undefined) {\r\n animationGroup._isAdditive = parsedAnimationGroup.isAdditive;\r\n }\r\n\r\n if (parsedAnimationGroup.weight !== undefined) {\r\n animationGroup._weight = parsedAnimationGroup.weight;\r\n }\r\n\r\n if (parsedAnimationGroup.playOrder !== undefined) {\r\n animationGroup._playOrder = parsedAnimationGroup.playOrder;\r\n }\r\n\r\n if (parsedAnimationGroup.enableBlending !== undefined) {\r\n animationGroup._enableBlending = parsedAnimationGroup.enableBlending;\r\n }\r\n\r\n if (parsedAnimationGroup.blendingSpeed !== undefined) {\r\n animationGroup._blendingSpeed = parsedAnimationGroup.blendingSpeed;\r\n }\r\n\r\n if (parsedAnimationGroup.metadata !== undefined) {\r\n animationGroup.metadata = parsedAnimationGroup.metadata;\r\n }\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Convert the keyframes for all animations belonging to the group to be relative to a given reference frame.\r\n * @param sourceAnimationGroup defines the AnimationGroup containing animations to convert\r\n * @param referenceFrame defines the frame that keyframes in the range will be relative to (default: 0)\r\n * @param range defines the name of the AnimationRange belonging to the animations in the group to convert\r\n * @param cloneOriginal defines whether or not to clone the group and convert the clone or convert the original group (default is false)\r\n * @param clonedName defines the name of the resulting cloned AnimationGroup if cloneOriginal is true\r\n * @returns a new AnimationGroup if cloneOriginal is true or the original AnimationGroup if cloneOriginal is false\r\n */\r\n public static MakeAnimationAdditive(sourceAnimationGroup: AnimationGroup, referenceFrame: number, range?: string, cloneOriginal?: boolean, clonedName?: string): AnimationGroup;\r\n\r\n /**\r\n * Convert the keyframes for all animations belonging to the group to be relative to a given reference frame.\r\n * @param sourceAnimationGroup defines the AnimationGroup containing animations to convert\r\n * @param options defines the options to use when converting keyframes\r\n * @returns a new AnimationGroup if options.cloneOriginalAnimationGroup is true or the original AnimationGroup if options.cloneOriginalAnimationGroup is false\r\n */\r\n public static MakeAnimationAdditive(sourceAnimationGroup: AnimationGroup, options?: IMakeAnimationGroupAdditiveOptions): AnimationGroup;\r\n\r\n /** @internal */\r\n public static MakeAnimationAdditive(\r\n sourceAnimationGroup: AnimationGroup,\r\n referenceFrameOrOptions?: number | IMakeAnimationGroupAdditiveOptions,\r\n range?: string,\r\n cloneOriginal = false,\r\n clonedName?: string\r\n ): AnimationGroup {\r\n let options: IMakeAnimationGroupAdditiveOptions;\r\n\r\n if (typeof referenceFrameOrOptions === \"object\") {\r\n options = referenceFrameOrOptions;\r\n } else {\r\n options = {\r\n referenceFrame: referenceFrameOrOptions,\r\n range: range,\r\n cloneOriginalAnimationGroup: cloneOriginal,\r\n clonedAnimationName: clonedName,\r\n };\r\n }\r\n\r\n let animationGroup = sourceAnimationGroup;\r\n if (options.cloneOriginalAnimationGroup) {\r\n animationGroup = sourceAnimationGroup.clone(options.clonedAnimationGroupName || animationGroup.name);\r\n }\r\n\r\n const targetedAnimations = animationGroup.targetedAnimations;\r\n for (let index = 0; index < targetedAnimations.length; index++) {\r\n const targetedAnimation = targetedAnimations[index];\r\n targetedAnimation.animation = Animation.MakeAnimationAdditive(targetedAnimation.animation, options);\r\n }\r\n\r\n animationGroup.isAdditive = true;\r\n\r\n if (options.clipKeys) {\r\n // We need to recalculate the from/to frames for the animation group because some keys may have been removed\r\n let from = Number.MAX_VALUE;\r\n let to = -Number.MAX_VALUE;\r\n\r\n const targetedAnimations = animationGroup.targetedAnimations;\r\n for (let index = 0; index < targetedAnimations.length; index++) {\r\n const targetedAnimation = targetedAnimations[index];\r\n const animation = targetedAnimation.animation;\r\n const keys = animation.getKeys();\r\n\r\n if (from > keys[0].frame) {\r\n from = keys[0].frame;\r\n }\r\n\r\n if (to < keys[keys.length - 1].frame) {\r\n to = keys[keys.length - 1].frame;\r\n }\r\n }\r\n\r\n animationGroup._from = from;\r\n animationGroup._to = to;\r\n }\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Creates a new animation, keeping only the keys that are inside a given key range\r\n * @param sourceAnimationGroup defines the animation group on which to operate\r\n * @param fromKey defines the lower bound of the range\r\n * @param toKey defines the upper bound of the range\r\n * @param name defines the name of the new animation group. If not provided, use the same name as animationGroup\r\n * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the keys. Default is false, so animations will be cloned\r\n * @returns a new animation group stripped from all the keys outside the given range\r\n */\r\n public static ClipKeys(sourceAnimationGroup: AnimationGroup, fromKey: number, toKey: number, name?: string, dontCloneAnimations?: boolean): AnimationGroup {\r\n const animationGroup = sourceAnimationGroup.clone(name || sourceAnimationGroup.name);\r\n\r\n return AnimationGroup.ClipKeysInPlace(animationGroup, fromKey, toKey, dontCloneAnimations);\r\n }\r\n\r\n /**\r\n * Updates an existing animation, keeping only the keys that are inside a given key range\r\n * @param animationGroup defines the animation group on which to operate\r\n * @param fromKey defines the lower bound of the range\r\n * @param toKey defines the upper bound of the range\r\n * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the keys. Default is false, so animations will be cloned\r\n * @returns the animationGroup stripped from all the keys outside the given range\r\n */\r\n public static ClipKeysInPlace(animationGroup: AnimationGroup, fromKey: number, toKey: number, dontCloneAnimations?: boolean): AnimationGroup {\r\n return AnimationGroup.ClipInPlace(animationGroup, fromKey, toKey, dontCloneAnimations, false);\r\n }\r\n\r\n /**\r\n * Creates a new animation, keeping only the frames that are inside a given frame range\r\n * @param sourceAnimationGroup defines the animation group on which to operate\r\n * @param fromFrame defines the lower bound of the range\r\n * @param toFrame defines the upper bound of the range\r\n * @param name defines the name of the new animation group. If not provided, use the same name as animationGroup\r\n * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the frames. Default is false, so animations will be cloned\r\n * @returns a new animation group stripped from all the frames outside the given range\r\n */\r\n public static ClipFrames(sourceAnimationGroup: AnimationGroup, fromFrame: number, toFrame: number, name?: string, dontCloneAnimations?: boolean): AnimationGroup {\r\n const animationGroup = sourceAnimationGroup.clone(name || sourceAnimationGroup.name);\r\n\r\n return AnimationGroup.ClipFramesInPlace(animationGroup, fromFrame, toFrame, dontCloneAnimations);\r\n }\r\n\r\n /**\r\n * Updates an existing animation, keeping only the frames that are inside a given frame range\r\n * @param animationGroup defines the animation group on which to operate\r\n * @param fromFrame defines the lower bound of the range\r\n * @param toFrame defines the upper bound of the range\r\n * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the frames. Default is false, so animations will be cloned\r\n * @returns the animationGroup stripped from all the frames outside the given range\r\n */\r\n public static ClipFramesInPlace(animationGroup: AnimationGroup, fromFrame: number, toFrame: number, dontCloneAnimations?: boolean): AnimationGroup {\r\n return AnimationGroup.ClipInPlace(animationGroup, fromFrame, toFrame, dontCloneAnimations, true);\r\n }\r\n\r\n /**\r\n * Updates an existing animation, keeping only the keys that are inside a given key or frame range\r\n * @param animationGroup defines the animation group on which to operate\r\n * @param start defines the lower bound of the range\r\n * @param end defines the upper bound of the range\r\n * @param dontCloneAnimations defines whether or not the animations should be cloned before clipping the keys. Default is false, so animations will be cloned\r\n * @param useFrame defines if the range is defined by frame numbers or key indices (default is false which means use key indices)\r\n * @returns the animationGroup stripped from all the keys outside the given range\r\n */\r\n public static ClipInPlace(animationGroup: AnimationGroup, start: number, end: number, dontCloneAnimations?: boolean, useFrame = false): AnimationGroup {\r\n let from = Number.MAX_VALUE;\r\n let to = -Number.MAX_VALUE;\r\n\r\n const targetedAnimations = animationGroup.targetedAnimations;\r\n for (let index = 0; index < targetedAnimations.length; index++) {\r\n const targetedAnimation = targetedAnimations[index];\r\n const animation = dontCloneAnimations ? targetedAnimation.animation : targetedAnimation.animation.clone();\r\n\r\n if (useFrame) {\r\n // Make sure we have keys corresponding to the bounds of the frame range\r\n animation.createKeyForFrame(start);\r\n animation.createKeyForFrame(end);\r\n }\r\n\r\n const keys = animation.getKeys();\r\n const newKeys: IAnimationKey[] = [];\r\n\r\n let startFrame = Number.MAX_VALUE;\r\n for (let k = 0; k < keys.length; k++) {\r\n const key = keys[k];\r\n if ((!useFrame && k >= start && k <= end) || (useFrame && key.frame >= start && key.frame <= end)) {\r\n const newKey: IAnimationKey = {\r\n frame: key.frame,\r\n value: key.value.clone ? key.value.clone() : key.value,\r\n inTangent: key.inTangent,\r\n outTangent: key.outTangent,\r\n interpolation: key.interpolation,\r\n lockedTangent: key.lockedTangent,\r\n };\r\n if (startFrame === Number.MAX_VALUE) {\r\n startFrame = newKey.frame;\r\n }\r\n newKey.frame -= startFrame;\r\n newKeys.push(newKey);\r\n }\r\n }\r\n\r\n if (newKeys.length === 0) {\r\n targetedAnimations.splice(index, 1);\r\n index--;\r\n continue;\r\n }\r\n\r\n if (from > newKeys[0].frame) {\r\n from = newKeys[0].frame;\r\n }\r\n\r\n if (to < newKeys[newKeys.length - 1].frame) {\r\n to = newKeys[newKeys.length - 1].frame;\r\n }\r\n\r\n animation.setKeys(newKeys, true);\r\n targetedAnimation.animation = animation; // in case the animation has been cloned\r\n }\r\n\r\n animationGroup._from = from;\r\n animationGroup._to = to;\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Returns the string \"AnimationGroup\"\r\n * @returns \"AnimationGroup\"\r\n */\r\n public getClassName(): string {\r\n return \"AnimationGroup\";\r\n }\r\n\r\n /**\r\n * Creates a detailed string about the object\r\n * @param fullDetails defines if the output string will support multiple levels of logging within scene loading\r\n * @returns a string representing the object\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name;\r\n ret += \", type: \" + this.getClassName();\r\n if (fullDetails) {\r\n ret += \", from: \" + this._from;\r\n ret += \", to: \" + this._to;\r\n ret += \", isStarted: \" + this._isStarted;\r\n ret += \", speedRatio: \" + this._speedRatio;\r\n ret += \", targetedAnimations length: \" + this._targetedAnimations.length;\r\n ret += \", animatables length: \" + this._animatables;\r\n }\r\n return ret;\r\n }\r\n}\r\n"], + "mappings": "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", + "names": ["observer", "className", "name", "name", "ShaderLanguage", "name", "match", "name", "shader", "InternalTextureSource", "proxy", "name", "index", "cancelAnimationFrame", "name", "shader", "request", "requestAnimationFrame", "url", "DecodeBase64UrlToBinary", "DecodeBase64UrlToString", "FileToolsOptions", "IsBase64DataUrl", "IsFileURL", "LoadFile", "LoadImage", "ReadFile", "RequestFile", "SetCorsBehavior", "className", "className", "quality", "name", "params", "index", "name", "texture", "name", "name", "location", "name", "name", "location", "DeviceType", "PointerInput", "NativePointerInput", "DualShockInput", "DualSenseInput", "XboxInput", "SwitchInput", "DeviceInputEventType", "deviceEvent", "observer", "observer", "pickResult", "pi", "ScenePerformancePriority", "name", "len", "index", "request", "buffer", "name", "cancelAnimationFrame", "_a", "transform", "name", "Space", "Coordinate", "name", "translation", "location", "name", "className", "index", "MaterialPluginEvent", "name", "observer", "name", "shader", "name", "shader", "name", "name", "i", "index", "name", "index", "name", "observer", "subMesh", "data", "vertexData", "name", "name", "name", "name", "name", "plugin", "name", "code", "factory", "name", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "shader", "name", "name", "featureName", "name", "SceneLoaderAnimationGroupLoadingMode", "name", "request", "scene", "NodeMaterialBlockConnectionPointTypes", "NodeMaterialBlockTargets", "NodeMaterialConnectionPointCompatibilityStates", "NodeMaterialConnectionPointDirection", "name", "name", "name", "name", "PropertyTypeForEdition", "name", "NodeMaterialBlockConnectionPointMode", "NodeMaterialSystemValues", "Orientation", "AnimatedInputBlockTypes", "name", "name", "name", "name", "name", "name", "shader", "name", "index", "name", "name", "name", "observer", "name", "NodeMaterialModes", "name", "name", "name", "shader", "initSideEffects", "name", "scene", "name", "shader", "name", "TrigonometryBlockOperations", "name", "name", "onCreatedEffectParameters", "name", "className", "result", "effect", "source", "location", "name", "HandPart", "WebXRHandJoint", "name", "_a", "_b", "HandConstraintZone", "HandConstraintOrientation", "HandConstraintVisibility", "name", "angle", "minMaxAngle", "virtualMeshesInfo", "name", "name", "pointerEvent", "GizmoAnchorPoint", "GizmoCoordinatesMode", "_a", "_b", "onCreatedEffectParameters", "name", "drawWrapper", "result", "AnimationKeyInterpolation", "name", "name", "name", "index", "targetedAnimations"] +} diff --git a/package-lock.json b/package-lock.json index 6645d4e5..f1538db5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@jpmorganchase/anu", - "version": "0.0.52", + "version": "0.0.54", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@jpmorganchase/anu", - "version": "0.0.52", + "version": "0.0.54", "license": "Apache-2.0", "dependencies": { "@babylonjs/core": "^7.1.0", diff --git a/src/bind.ts b/src/bind.ts index f4784bea..d8b93f0f 100644 --- a/src/bind.ts +++ b/src/bind.ts @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright : J.P. Morgan Chase & Co. -import { Node, ActionManager, Tags, Mesh, Scene, InstancedMesh } from '@babylonjs/core'; +import { Node, ActionManager, Tags, Mesh, Scene, InstancedMesh, Matrix } from '@babylonjs/core'; import { Selection } from './index'; import { create, MeshTypes } from './create'; @@ -50,3 +50,21 @@ export function bindInstance(mesh: Mesh, data: Array = [{}], scene?: Sce return new Selection(meshes, scene); } + +export function bindThinInstance(mesh: Mesh, data: Array = [{}], scene?: Scene): Selection { + scene = (scene != undefined) ? scene : mesh.getScene(); + Tags.EnableFor(mesh); + mesh.actionManager = new ActionManager(scene); + mesh.metadata = { ...mesh.metadata, data: data }; + + let matrices = new Float32Array(16 * data.length * 3); + + data.forEach((element, i) => { + let matrix = Matrix.Identity(); + matrix.copyToArray(matrices, i * 16); + }); + + mesh.thinInstanceSetBuffer("matrix", matrices); + + return new Selection([mesh], scene); +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 91e595c2..124afadf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,7 +12,7 @@ export { Layout } from './prefabs/Layout/Layout'; export { select, selectName, selectId, selectTag, selectData } from './select'; export { create } from './create'; -export { bind, bindInstance } from './bind'; +export { bind, bindInstance, bindThinInstance} from './bind'; export { createPlaneText } from './prefabs/Text/planeText'; export { createTextureMap } from './prefabs/Mapping/textureMap'; export { createTextureGlobe } from './prefabs/Mapping/textureGlobe'; diff --git a/src/selection/index.ts b/src/selection/index.ts index 1910a39b..259bb432 100644 --- a/src/selection/index.ts +++ b/src/selection/index.ts @@ -32,6 +32,7 @@ import { boundingBox } from './utility/boundingBox'; import { filter } from './utility/filter'; import { name, id, metadata } from './property/metadata'; import { positionUI, rotateUI, scaleUI } from '../prefabs/Interactions/facetPosition'; +import { thinInstanceSetBuffer } from './property/thin'; /* The core class of anujs. All functions should return @@ -99,5 +100,6 @@ export class Selection { public positionUI = positionUI; public scaleUI = scaleUI; public rotateUI = rotateUI; + public thinInstanceSetBuffer = thinInstanceSetBuffer; } diff --git a/src/selection/property/thin.ts b/src/selection/property/thin.ts new file mode 100644 index 00000000..73576fbd --- /dev/null +++ b/src/selection/property/thin.ts @@ -0,0 +1,16 @@ +import { Node, Mesh} from '@babylonjs/core'; +import { Selection } from '../index'; + +export function thinInstanceSetBuffer(this: Selection, attribute: string, value: Float32Array | ((d: any, n: Node, i: number) => Float32Array)): Selection{ + + this.selected.forEach((node, i) => { + node instanceof Mesh + ? node.hasThinInstances + ? node.thinInstanceSetBuffer(attribute, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value) + : console.warn(node + "has no thin instances, skipping") + : console.warn(node + "Node is not a mesh, skipping"); + }) + + return this; +} + From d445fd10622eae9d213071bec98646a3d0d5ad70 Mon Sep 17 00:00:00 2001 From: "Saffo, David" Date: Fri, 26 Jul 2024 16:23:05 -0400 Subject: [PATCH 2/8] added matrix and transform helpers --- .../ScatterPlots/ScatterplotThinInstance.js | 52 ++++++----- src/selection/index.ts | 5 +- src/selection/property/thin.ts | 89 ++++++++++++++++++- 3 files changed, 121 insertions(+), 25 deletions(-) diff --git a/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js b/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js index ab52183d..03f35fce 100644 --- a/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js +++ b/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js @@ -4,7 +4,7 @@ //Import everything we need to create our babylon scene and write our visualization code. import * as anu from '@jpmorganchase/anu' //Anu for Scene-Graph Manipulation import iris from '../../data/iris.json' assert {type: 'json'}; //Our data -import {HemisphericLight, Vector3, Scene, ArcRotateCamera, ActionManager, InterpolateValueAction, Matrix } from '@babylonjs/core'; +import {HemisphericLight, Vector3, Scene, ArcRotateCamera, ActionManager, InterpolateValueAction, Matrix , SceneLoader} from '@babylonjs/core'; import {extent, scaleOrdinal, scaleLinear, map,} from "d3"; //import { Mesh } from 'anu'; @@ -39,6 +39,7 @@ export const scatterplotThinInstance = function(engine){ //Select our center or transform with Anu to give us a selection obj CoT. let chart = anu.selectName('cot', scene); + SceneLoader.Append('./', "test.obj", scene); // let spheres = chart.bind('sphere', {diameter: 0.05}, iris) // .positionX((d) => scaleX(d.sepalLength)) @@ -46,30 +47,35 @@ export const scatterplotThinInstance = function(engine){ // .positionZ((d) => scaleZ(d.sepalWidth)) // .material((d) => scaleC(d.species)) - let root = anu.create('sphere', 'root', {diameter: 1}); + let root = anu.create('box', 'root', {size: 1}); //root.scaling = new Vector3(0.1,0.1,0.1); - let thinInstance = anu.bindThinInstance(root, iris) - .thinInstanceSetBuffer('matrix', (d,n,i) => { - var bufferMatrices = new Float32Array(n.thinInstanceCount * 16 * 3); - d.forEach((e, i) => { - let matrix = Matrix.Scaling(0.1,0.1,0.1) - matrix.copyToArray(bufferMatrices, i * 16); - }); - return bufferMatrices; - - }) - .thinInstanceSetBuffer('matrix', (d,n,i) => { - var bufferMatrices = new Float32Array(n.thinInstanceCount * 16 * 3); - let matricies = n.thinInstanceGetWorldMatrices(); - d.forEach((e, i) => { - let matrix = matricies[i].multiply( Matrix.Translation(scaleX(e.sepalLength), scaleY(e.petalLength), scaleZ(e.sepalWidth))) - matrix.copyToArray(bufferMatrices, i * 16); - }); - return bufferMatrices; - }) - + // let thinInstance = anu.bindThinInstance(root, iris) + // .thinInstanceSetBuffer('matrix', (d,n,i) => { + // var bufferMatrices = new Float32Array(n.thinInstanceCount * 16 * 3); + // d.forEach((e, i) => { + // let matrix = Matrix.Scaling(0.1,0.1,0.1) + // matrix.copyToArray(bufferMatrices, i * 16); + // }); + // return bufferMatrices; + + // }) + // .thinInstanceSetBuffer('matrix', (d,n,i) => { + // var bufferMatrices = new Float32Array(n.thinInstanceCount * 16 * 3); + // let matricies = n.thinInstanceGetWorldMatrices(); + // d.forEach((e, i) => { + // let matrix = matricies[i].multiply( Matrix.Translation(scaleX(e.sepalLength), scaleY(e.petalLength), scaleZ(e.sepalWidth))) + // matrix.copyToArray(bufferMatrices, i * 16); + // }); + // return bufferMatrices; + // }) + + let thinInstance = anu.bindThinInstance(root, iris) + //.thinInstanceScaling(new Vector3(0.2,0.2,0.2)) + .thinInstancePosition((d,n,i) => new Vector3(scaleX(d.sepalLength), scaleY(d.petalLength), scaleZ(d.sepalWidth))) + .thinInstanceScaling(new Vector3(0.1,0.1,0.1)) + .thinInstanceRotation(() => Vector3.Random()); //root.scaling = new Vector3(0.1,0.1,0.1); @@ -77,7 +83,7 @@ export const scatterplotThinInstance = function(engine){ console.log(thinInstance.selected[0]) - anu.createAxes('test', scene, {parent: chart, scale: {x: scaleX, y: scaleY, z: scaleZ}}); + //anu.createAxes('test', scene, {parent: chart, scale: {x: scaleX, y: scaleY, z: scaleZ}}); return scene; diff --git a/src/selection/index.ts b/src/selection/index.ts index 259bb432..39801316 100644 --- a/src/selection/index.ts +++ b/src/selection/index.ts @@ -32,7 +32,7 @@ import { boundingBox } from './utility/boundingBox'; import { filter } from './utility/filter'; import { name, id, metadata } from './property/metadata'; import { positionUI, rotateUI, scaleUI } from '../prefabs/Interactions/facetPosition'; -import { thinInstanceSetBuffer } from './property/thin'; +import { thinInstanceSetBuffer, thinInstancePosition, thinInstanceScaling, thinInstanceRotation} from './property/thin'; /* The core class of anujs. All functions should return @@ -101,5 +101,8 @@ export class Selection { public scaleUI = scaleUI; public rotateUI = rotateUI; public thinInstanceSetBuffer = thinInstanceSetBuffer; + public thinInstancePosition = thinInstancePosition; + public thinInstanceScaling = thinInstanceScaling; + public thinInstanceRotation = thinInstanceRotation; } diff --git a/src/selection/property/thin.ts b/src/selection/property/thin.ts index 73576fbd..f3b25953 100644 --- a/src/selection/property/thin.ts +++ b/src/selection/property/thin.ts @@ -1,4 +1,4 @@ -import { Node, Mesh} from '@babylonjs/core'; +import { Node, Mesh, Matrix, Vector3, Quaternion} from '@babylonjs/core'; import { Selection } from '../index'; export function thinInstanceSetBuffer(this: Selection, attribute: string, value: Float32Array | ((d: any, n: Node, i: number) => Float32Array)): Selection{ @@ -14,3 +14,90 @@ export function thinInstanceSetBuffer(this: Selection, attribute: string, value: return this; } +export function thinInstancePosition(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3)): Selection{ + + this.selected.forEach((node, i) => { + if (node instanceof Mesh && node.hasThinInstances){ + let bufferMatrices = new Float32Array(node.thinInstanceCount * 16 * 3); + let matricies = node.thinInstanceGetWorldMatrices(); + if (value instanceof Function){ + let data = node.metadata.data ??= {}; + data.forEach((e, j) => { + let evaluated = value(e,node,j) + let matrix = Matrix.Translation(evaluated.x, evaluated.y, evaluated.z).multiply(matricies[j]) + matrix.copyToArray(bufferMatrices, j * 16); + }); + } else { + for (let k = 0; k < node.thinInstanceCount; k++){ + let matrix = Matrix.Scaling(value.x, value.y, value.z).multiply(matricies[k]) + matrix.copyToArray(bufferMatrices, k * 16); + } + } + node.thinInstanceSetBuffer("matrix", bufferMatrices) + } else { + console.warn(node + "Node is not a mesh or has no thin instances, skipping"); + } + }) + + return this; +} + +export function thinInstanceScaling(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3)): Selection{ + + this.selected.forEach((node, i) => { + if (node instanceof Mesh && node.hasThinInstances){ + let bufferMatrices = new Float32Array(node.thinInstanceCount * 16 * 3); + let matricies = node.thinInstanceGetWorldMatrices(); + if (value instanceof Function){ + let data = node.metadata.data ??= {}; + data.forEach((e, j) => { + let evaluated = value(e,node,j) + let matrix = Matrix.Scaling(evaluated.x, evaluated.y, evaluated.z).multiply(matricies[j]) + matrix.copyToArray(bufferMatrices, j * 16); + }); + } else { + for (let k = 0; k < node.thinInstanceCount; k++){ + let matrix = Matrix.Scaling(value.x, value.y, value.z).multiply(matricies[k]) + matrix.copyToArray(bufferMatrices, k * 16); + } + } + node.thinInstanceSetBuffer("matrix", bufferMatrices) + } else { + console.warn(node + "Node is not a mesh or has no thin instances, skipping"); + } + }) + + return this; +} + +export function thinInstanceRotation(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3)): Selection{ + + this.selected.forEach((node, i) => { + if (node instanceof Mesh && node.hasThinInstances){ + let bufferMatrices = new Float32Array(node.thinInstanceCount * 16 * 3); + let matricies = node.thinInstanceGetWorldMatrices(); + if (value instanceof Function){ + let data = node.metadata.data ??= {}; + data.forEach((e, j) => { + let evaluated = value(e,node,j) + let matrix = Matrix.RotationX(evaluated.x).multiply(matricies[j]) + matrix = Matrix.RotationY(evaluated.y).multiply(matrix) + matrix = Matrix.RotationZ(evaluated.z).multiply(matrix) + matrix.copyToArray(bufferMatrices, j * 16); + }); + } else { + for (let k = 0; k < node.thinInstanceCount; k++){ + let matrix = Matrix.RotationX(value.x).multiply(matricies[k]) + matrix = Matrix.RotationY(value.y).multiply(matrix) + matrix = Matrix.RotationZ(value.z).multiply(matrix) + matrix.copyToArray(bufferMatrices, k * 16); + } + } + node.thinInstanceSetBuffer("matrix", bufferMatrices) + } else { + console.warn(node + "Node is not a mesh or has no thin instances, skipping"); + } + }) + + return this; +} \ No newline at end of file From 77520d4cd5fb9a44f688039084d66d26f3e0ede0 Mon Sep 17 00:00:00 2001 From: "Saffo, David" Date: Mon, 29 Jul 2024 17:27:26 -0400 Subject: [PATCH 3/8] thin instance more functions --- .../ScatterPlots/ScatterplotThinInstance.js | 14 +- src/bind.ts | 5 +- src/selection/index.ts | 7 +- src/selection/property/thin.ts | 120 +++++++++++++++--- 4 files changed, 120 insertions(+), 26 deletions(-) diff --git a/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js b/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js index 03f35fce..b73a8cf7 100644 --- a/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js +++ b/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js @@ -4,7 +4,7 @@ //Import everything we need to create our babylon scene and write our visualization code. import * as anu from '@jpmorganchase/anu' //Anu for Scene-Graph Manipulation import iris from '../../data/iris.json' assert {type: 'json'}; //Our data -import {HemisphericLight, Vector3, Scene, ArcRotateCamera, ActionManager, InterpolateValueAction, Matrix , SceneLoader} from '@babylonjs/core'; +import {HemisphericLight, Vector3, Scene, ArcRotateCamera, ActionManager, InterpolateValueAction, Matrix , SceneLoader, Color4} from '@babylonjs/core'; import {extent, scaleOrdinal, scaleLinear, map,} from "d3"; //import { Mesh } from 'anu'; @@ -31,7 +31,7 @@ export const scatterplotThinInstance = function(engine){ //This is a function that will create a color scale for our three types of flowers in our data //pass in the flower name and it will return the hex of its color coding. schemecategory10 is an array of 10 color hexes - var scaleC = scaleOrdinal(anu.ordinalChromatic('d310').toStandardMaterial()) + var scaleC = scaleOrdinal(anu.ordinalChromatic('d310').toColor4()) //Create a transform node to use as the parent node for all our meshes let CoT = anu.create("cot", "cot"); @@ -72,18 +72,18 @@ export const scatterplotThinInstance = function(engine){ let thinInstance = anu.bindThinInstance(root, iris) - //.thinInstanceScaling(new Vector3(0.2,0.2,0.2)) .thinInstancePosition((d,n,i) => new Vector3(scaleX(d.sepalLength), scaleY(d.petalLength), scaleZ(d.sepalWidth))) - .thinInstanceScaling(new Vector3(0.1,0.1,0.1)) - .thinInstanceRotation(() => Vector3.Random()); + .thinInstanceScaling(new Vector3(0.05,0.05,0.05)) + .thinInstanceRotation(() => Vector3.Random()) + .thinInstanceColor((d,n,i) => scaleC(d.species)) //root.scaling = new Vector3(0.1,0.1,0.1); - console.log(thinInstance.selected[0]) + //console.log(thinInstance.selected[0]) - //anu.createAxes('test', scene, {parent: chart, scale: {x: scaleX, y: scaleY, z: scaleZ}}); + anu.createAxes('test', scene, {parent: chart, scale: {x: scaleX, y: scaleY, z: scaleZ}}); return scene; diff --git a/src/bind.ts b/src/bind.ts index d8b93f0f..78a6dff7 100644 --- a/src/bind.ts +++ b/src/bind.ts @@ -64,7 +64,8 @@ export function bindThinInstance(mesh: Mesh, data: Array = [{}], scene?: matrix.copyToArray(matrices, i * 16); }); - mesh.thinInstanceSetBuffer("matrix", matrices); + mesh.thinInstanceSetBuffer("matrix", matrices, 16); return new Selection([mesh], scene); -} \ No newline at end of file +} + diff --git a/src/selection/index.ts b/src/selection/index.ts index 39801316..fdfad057 100644 --- a/src/selection/index.ts +++ b/src/selection/index.ts @@ -32,7 +32,7 @@ import { boundingBox } from './utility/boundingBox'; import { filter } from './utility/filter'; import { name, id, metadata } from './property/metadata'; import { positionUI, rotateUI, scaleUI } from '../prefabs/Interactions/facetPosition'; -import { thinInstanceSetBuffer, thinInstancePosition, thinInstanceScaling, thinInstanceRotation} from './property/thin'; +import { thinInstanceSetBuffer, thinInstancePosition, thinInstanceScaling, thinInstanceRotation, thinInstanceColor, thinInstanceRegisterAttribute, thinInstanceSetAttribute, thinInstanceSetAttributeAt, thinInstanceSetMatrixAt} from './property/thin'; /* The core class of anujs. All functions should return @@ -104,5 +104,10 @@ export class Selection { public thinInstancePosition = thinInstancePosition; public thinInstanceScaling = thinInstanceScaling; public thinInstanceRotation = thinInstanceRotation; + public thinInstanceColor = thinInstanceColor; + public thinInstanceSetAttribute = thinInstanceSetAttribute; + public thinInstanceSetAttributeAt = thinInstanceSetAttributeAt + public thinInstanceRegisterAttribute = thinInstanceRegisterAttribute; + public thinInstanceSetMatrixAt = thinInstanceSetMatrixAt; } diff --git a/src/selection/property/thin.ts b/src/selection/property/thin.ts index f3b25953..8e7547cc 100644 --- a/src/selection/property/thin.ts +++ b/src/selection/property/thin.ts @@ -1,12 +1,12 @@ -import { Node, Mesh, Matrix, Vector3, Quaternion} from '@babylonjs/core'; +import { Node, Mesh, Matrix, Vector3, Quaternion, Color4} from '@babylonjs/core'; import { Selection } from '../index'; -export function thinInstanceSetBuffer(this: Selection, attribute: string, value: Float32Array | ((d: any, n: Node, i: number) => Float32Array)): Selection{ +export function thinInstanceSetBuffer(this: Selection, attribute: string, value: Float32Array | ((d: any, n: Node, i: number) => Float32Array), stride?: number, staticBuffer?: boolean): Selection{ this.selected.forEach((node, i) => { node instanceof Mesh ? node.hasThinInstances - ? node.thinInstanceSetBuffer(attribute, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value) + ? node.thinInstanceSetBuffer(attribute, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value, stride, staticBuffer) : console.warn(node + "has no thin instances, skipping") : console.warn(node + "Node is not a mesh, skipping"); }) @@ -18,22 +18,22 @@ export function thinInstancePosition(this: Selection, value: Vector3 | ((d: any, this.selected.forEach((node, i) => { if (node instanceof Mesh && node.hasThinInstances){ - let bufferMatrices = new Float32Array(node.thinInstanceCount * 16 * 3); + let bufferMatricies = new Float32Array(node.thinInstanceCount * 16); let matricies = node.thinInstanceGetWorldMatrices(); if (value instanceof Function){ let data = node.metadata.data ??= {}; data.forEach((e, j) => { let evaluated = value(e,node,j) let matrix = Matrix.Translation(evaluated.x, evaluated.y, evaluated.z).multiply(matricies[j]) - matrix.copyToArray(bufferMatrices, j * 16); + matrix.copyToArray(bufferMatricies, j * 16); }); } else { for (let k = 0; k < node.thinInstanceCount; k++){ let matrix = Matrix.Scaling(value.x, value.y, value.z).multiply(matricies[k]) - matrix.copyToArray(bufferMatrices, k * 16); + matrix.copyToArray(bufferMatricies, k * 16); } } - node.thinInstanceSetBuffer("matrix", bufferMatrices) + node.thinInstanceSetBuffer("matrix", bufferMatricies, 16) } else { console.warn(node + "Node is not a mesh or has no thin instances, skipping"); } @@ -46,22 +46,22 @@ export function thinInstanceScaling(this: Selection, value: Vector3 | ((d: any, this.selected.forEach((node, i) => { if (node instanceof Mesh && node.hasThinInstances){ - let bufferMatrices = new Float32Array(node.thinInstanceCount * 16 * 3); + let bufferMatricies = new Float32Array(node.thinInstanceCount * 16); let matricies = node.thinInstanceGetWorldMatrices(); if (value instanceof Function){ let data = node.metadata.data ??= {}; data.forEach((e, j) => { let evaluated = value(e,node,j) let matrix = Matrix.Scaling(evaluated.x, evaluated.y, evaluated.z).multiply(matricies[j]) - matrix.copyToArray(bufferMatrices, j * 16); + matrix.copyToArray(bufferMatricies, j * 16); }); } else { for (let k = 0; k < node.thinInstanceCount; k++){ let matrix = Matrix.Scaling(value.x, value.y, value.z).multiply(matricies[k]) - matrix.copyToArray(bufferMatrices, k * 16); + matrix.copyToArray(bufferMatricies, k * 16); } } - node.thinInstanceSetBuffer("matrix", bufferMatrices) + node.thinInstanceSetBuffer("matrix", bufferMatricies, 16) } else { console.warn(node + "Node is not a mesh or has no thin instances, skipping"); } @@ -74,7 +74,7 @@ export function thinInstanceRotation(this: Selection, value: Vector3 | ((d: any, this.selected.forEach((node, i) => { if (node instanceof Mesh && node.hasThinInstances){ - let bufferMatrices = new Float32Array(node.thinInstanceCount * 16 * 3); + let bufferMatricies = new Float32Array(node.thinInstanceCount * 16); let matricies = node.thinInstanceGetWorldMatrices(); if (value instanceof Function){ let data = node.metadata.data ??= {}; @@ -83,21 +83,109 @@ export function thinInstanceRotation(this: Selection, value: Vector3 | ((d: any, let matrix = Matrix.RotationX(evaluated.x).multiply(matricies[j]) matrix = Matrix.RotationY(evaluated.y).multiply(matrix) matrix = Matrix.RotationZ(evaluated.z).multiply(matrix) - matrix.copyToArray(bufferMatrices, j * 16); + matrix.copyToArray(bufferMatricies, j * 16); }); } else { for (let k = 0; k < node.thinInstanceCount; k++){ let matrix = Matrix.RotationX(value.x).multiply(matricies[k]) matrix = Matrix.RotationY(value.y).multiply(matrix) matrix = Matrix.RotationZ(value.z).multiply(matrix) - matrix.copyToArray(bufferMatrices, k * 16); + matrix.copyToArray(bufferMatricies, k * 16); } } - node.thinInstanceSetBuffer("matrix", bufferMatrices) + node.thinInstanceSetBuffer("matrix", bufferMatricies, 16) } else { console.warn(node + "Node is not a mesh or has no thin instances, skipping"); } }) return this; -} \ No newline at end of file +} + +export function thinInstanceColor(this: Selection, value: Color4 | ((d: any, n: Node, i: number) => Color4)): Selection{ + + this.selected.forEach((node, i) => { + if (node instanceof Mesh && node.hasThinInstances){ + let colorMatricies = new Float32Array(node.thinInstanceCount * 4); + let matricies = node.thinInstanceGetWorldMatrices(); + if (value instanceof Function){ + let data = node.metadata.data ??= {}; + data.forEach((e, j) => { + let evaluated = value(e,node,j) + colorMatricies[j * 4 + 0] = evaluated.r + colorMatricies[j * 4 + 1] = evaluated.g + colorMatricies[j * 4 + 2] = evaluated.b + colorMatricies[j * 4 + 3] = evaluated.a; + + }); + } else { + for (let k = 0; k < node.thinInstanceCount; k++){ + colorMatricies[k * 4 + 0] = value.r + colorMatricies[k * 4 + 1] = value.g + colorMatricies[k * 4 + 2] = value.b + colorMatricies[k * 4 + 3] = value.a; + } + } + node.thinInstanceSetBuffer("color", colorMatricies, 4) + } else { + console.warn(node + "Node is not a mesh or has no thin instances, skipping"); + } + }) + + return this; +} + +export function thinInstanceRegisterAttribute(this: Selection, attribute: string, value: any | ((d: any, n: Node, i: number) => any)): Selection{ + + this.selected.forEach((node, i) => { + node instanceof Mesh + ? node.hasThinInstances + ? node.thinInstanceRegisterAttribute(attribute, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value) + : console.warn(node + "has no thin instances, skipping") + : console.warn(node + "Node is not a mesh, skipping"); + }) + + return this; +} + +export function thinInstanceSetAttribute(this: Selection, attribute: string, value: any | ((d: any, n: Node, i: number) => any)): Selection{ + + this.selected.forEach((node, i) => { + node instanceof Mesh + ? node.hasThinInstances + ? (node.metadata.data ??= {}).forEach((d,i) => { + node.thinInstanceSetAttributeAt(attribute, i, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value) + }) + : console.warn(node + "has no thin instances, skipping") + : console.warn(node + "Node is not a mesh, skipping"); + }) + + return this; +} + +export function thinInstanceSetAttributeAt(this: Selection, attribute: string, index: number, value: any | ((d: any, n: Node, i: number) => any)): Selection{ + + this.selected.forEach((node, i) => { + node instanceof Mesh + ? node.hasThinInstances + ? node.thinInstanceSetAttributeAt(attribute, index, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value) + : console.warn(node + "has no thin instances, skipping") + : console.warn(node + "Node is not a mesh, skipping"); + }) + + return this; +} + +export function thinInstanceSetMatrixAt(this: Selection, index: number, value: Matrix | ((d: any, n: Node, i: number) => Matrix)): Selection{ + + this.selected.forEach((node, i) => { + node instanceof Mesh + ? node.hasThinInstances + ? node.thinInstanceSetMatrixAt(index, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value) + : console.warn(node + "has no thin instances, skipping") + : console.warn(node + "Node is not a mesh, skipping"); + }) + + return this; +} + From 12d95e29c841076aa14a456a44498c9ad12cade1 Mon Sep 17 00:00:00 2001 From: "Saffo, David" Date: Thu, 1 Aug 2024 10:08:22 -0400 Subject: [PATCH 4/8] more methods --- .../ScatterPlots/ScatterplotThinInstance.js | 11 ++ src/bind.ts | 2 +- src/selection/index.ts | 3 +- src/selection/property/thin.ts | 150 ++++++++++++++++-- 4 files changed, 151 insertions(+), 15 deletions(-) diff --git a/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js b/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js index b73a8cf7..08713227 100644 --- a/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js +++ b/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js @@ -76,7 +76,18 @@ export const scatterplotThinInstance = function(engine){ .thinInstanceScaling(new Vector3(0.05,0.05,0.05)) .thinInstanceRotation(() => Vector3.Random()) .thinInstanceColor((d,n,i) => scaleC(d.species)) + .thinInstanceRegisterAttribute("color", 4) + //.thinInstanceSetAttribute("color", [0,0,0,1]) + //.thinInstanceSetMatrixAt(0, Matrix.Translation(-1,-1,-1)) + .thinInstanceSetMatrixFor((d,n,i) => d.species == "setosa", Matrix.Translation(1,1,1)) + + + + // public thinInstanceSetAttribute = thinInstanceSetAttribute; + // public thinInstanceSetAttributeAt = thinInstanceSetAttributeAt + // public thinInstanceRegisterAttribute = thinInstanceRegisterAttribute; + // public thinInstanceSetMatrixAt = thinInstanceSetMatrixAt; //root.scaling = new Vector3(0.1,0.1,0.1); diff --git a/src/bind.ts b/src/bind.ts index 78a6dff7..dd832574 100644 --- a/src/bind.ts +++ b/src/bind.ts @@ -64,7 +64,7 @@ export function bindThinInstance(mesh: Mesh, data: Array = [{}], scene?: matrix.copyToArray(matrices, i * 16); }); - mesh.thinInstanceSetBuffer("matrix", matrices, 16); + mesh.thinInstanceSetBuffer("matrix", matrices, 16, false); return new Selection([mesh], scene); } diff --git a/src/selection/index.ts b/src/selection/index.ts index fdfad057..103ec565 100644 --- a/src/selection/index.ts +++ b/src/selection/index.ts @@ -32,7 +32,7 @@ import { boundingBox } from './utility/boundingBox'; import { filter } from './utility/filter'; import { name, id, metadata } from './property/metadata'; import { positionUI, rotateUI, scaleUI } from '../prefabs/Interactions/facetPosition'; -import { thinInstanceSetBuffer, thinInstancePosition, thinInstanceScaling, thinInstanceRotation, thinInstanceColor, thinInstanceRegisterAttribute, thinInstanceSetAttribute, thinInstanceSetAttributeAt, thinInstanceSetMatrixAt} from './property/thin'; +import { thinInstanceSetBuffer, thinInstancePosition, thinInstanceScaling, thinInstanceRotation, thinInstanceColor, thinInstanceRegisterAttribute, thinInstanceSetAttribute, thinInstanceSetAttributeAt, thinInstanceSetMatrixAt, thinInstanceSetMatrixFor} from './property/thin'; /* The core class of anujs. All functions should return @@ -109,5 +109,6 @@ export class Selection { public thinInstanceSetAttributeAt = thinInstanceSetAttributeAt public thinInstanceRegisterAttribute = thinInstanceRegisterAttribute; public thinInstanceSetMatrixAt = thinInstanceSetMatrixAt; + public thinInstanceSetMatrixFor = thinInstanceSetMatrixFor; } diff --git a/src/selection/property/thin.ts b/src/selection/property/thin.ts index 8e7547cc..8e86a2d8 100644 --- a/src/selection/property/thin.ts +++ b/src/selection/property/thin.ts @@ -14,7 +14,7 @@ export function thinInstanceSetBuffer(this: Selection, attribute: string, value: return this; } -export function thinInstancePosition(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3)): Selection{ +export function thinInstancePosition(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3), staticBuffer: boolean = false): Selection{ this.selected.forEach((node, i) => { if (node instanceof Mesh && node.hasThinInstances){ @@ -33,7 +33,7 @@ export function thinInstancePosition(this: Selection, value: Vector3 | ((d: any, matrix.copyToArray(bufferMatricies, k * 16); } } - node.thinInstanceSetBuffer("matrix", bufferMatricies, 16) + node.thinInstanceSetBuffer("matrix", bufferMatricies, 16, staticBuffer) } else { console.warn(node + "Node is not a mesh or has no thin instances, skipping"); } @@ -42,7 +42,7 @@ export function thinInstancePosition(this: Selection, value: Vector3 | ((d: any, return this; } -export function thinInstanceScaling(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3)): Selection{ +export function thinInstanceScaling(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3), staticBuffer: boolean = false): Selection{ this.selected.forEach((node, i) => { if (node instanceof Mesh && node.hasThinInstances){ @@ -61,7 +61,7 @@ export function thinInstanceScaling(this: Selection, value: Vector3 | ((d: any, matrix.copyToArray(bufferMatricies, k * 16); } } - node.thinInstanceSetBuffer("matrix", bufferMatricies, 16) + node.thinInstanceSetBuffer("matrix", bufferMatricies, 16, staticBuffer) } else { console.warn(node + "Node is not a mesh or has no thin instances, skipping"); } @@ -70,7 +70,7 @@ export function thinInstanceScaling(this: Selection, value: Vector3 | ((d: any, return this; } -export function thinInstanceRotation(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3)): Selection{ +export function thinInstanceRotation(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3), staticBuffer: boolean = false): Selection{ this.selected.forEach((node, i) => { if (node instanceof Mesh && node.hasThinInstances){ @@ -93,7 +93,7 @@ export function thinInstanceRotation(this: Selection, value: Vector3 | ((d: any, matrix.copyToArray(bufferMatricies, k * 16); } } - node.thinInstanceSetBuffer("matrix", bufferMatricies, 16) + node.thinInstanceSetBuffer("matrix", bufferMatricies, 16, staticBuffer) } else { console.warn(node + "Node is not a mesh or has no thin instances, skipping"); } @@ -102,12 +102,11 @@ export function thinInstanceRotation(this: Selection, value: Vector3 | ((d: any, return this; } -export function thinInstanceColor(this: Selection, value: Color4 | ((d: any, n: Node, i: number) => Color4)): Selection{ +export function thinInstanceColor(this: Selection, value: Color4 | ((d: any, n: Node, i: number) => Color4), staticBuffer: boolean = false): Selection{ this.selected.forEach((node, i) => { if (node instanceof Mesh && node.hasThinInstances){ let colorMatricies = new Float32Array(node.thinInstanceCount * 4); - let matricies = node.thinInstanceGetWorldMatrices(); if (value instanceof Function){ let data = node.metadata.data ??= {}; data.forEach((e, j) => { @@ -126,7 +125,7 @@ export function thinInstanceColor(this: Selection, value: Color4 | ((d: any, n: colorMatricies[k * 4 + 3] = value.a; } } - node.thinInstanceSetBuffer("color", colorMatricies, 4) + node.thinInstanceSetBuffer("color", colorMatricies, 4, staticBuffer) } else { console.warn(node + "Node is not a mesh or has no thin instances, skipping"); } @@ -135,12 +134,12 @@ export function thinInstanceColor(this: Selection, value: Color4 | ((d: any, n: return this; } -export function thinInstanceRegisterAttribute(this: Selection, attribute: string, value: any | ((d: any, n: Node, i: number) => any)): Selection{ +export function thinInstanceRegisterAttribute(this: Selection, attribute: string, stride: number): Selection{ this.selected.forEach((node, i) => { node instanceof Mesh ? node.hasThinInstances - ? node.thinInstanceRegisterAttribute(attribute, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value) + ? node.thinInstanceRegisterAttribute(attribute, stride) : console.warn(node + "has no thin instances, skipping") : console.warn(node + "Node is not a mesh, skipping"); }) @@ -153,8 +152,8 @@ export function thinInstanceSetAttribute(this: Selection, attribute: string, val this.selected.forEach((node, i) => { node instanceof Mesh ? node.hasThinInstances - ? (node.metadata.data ??= {}).forEach((d,i) => { - node.thinInstanceSetAttributeAt(attribute, i, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value) + ? (node.metadata.data ??= {}).forEach((d,k) => { + node.thinInstanceSetAttributeAt(attribute, k, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value) }) : console.warn(node + "has no thin instances, skipping") : console.warn(node + "Node is not a mesh, skipping"); @@ -189,3 +188,128 @@ export function thinInstanceSetMatrixAt(this: Selection, index: number, value: M return this; } +// export function thinInstancePositionAt(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3), staticBuffer: boolean = false): Selection{ + +// this.selected.forEach((node, i) => { +// node instanceof Mesh +// ? node.hasThinInstances +// ? node.thinInstanceSetMatrixAt(index, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value) +// : console.warn(node + "has no thin instances, skipping") +// : console.warn(node + "Node is not a mesh, skipping"); +// }) + +// return this; +// } + +// export function thinInstanceScalingAt(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3), staticBuffer: boolean = false): Selection{ + +// this.selected.forEach((node, i) => { +// if (node instanceof Mesh && node.hasThinInstances){ +// let bufferMatricies = new Float32Array(node.thinInstanceCount * 16); +// let matricies = node.thinInstanceGetWorldMatrices(); +// if (value instanceof Function){ +// let data = node.metadata.data ??= {}; +// data.forEach((e, j) => { +// let evaluated = value(e,node,j) +// let matrix = Matrix.Scaling(evaluated.x, evaluated.y, evaluated.z).multiply(matricies[j]) +// matrix.copyToArray(bufferMatricies, j * 16); +// }); +// } else { +// for (let k = 0; k < node.thinInstanceCount; k++){ +// let matrix = Matrix.Scaling(value.x, value.y, value.z).multiply(matricies[k]) +// matrix.copyToArray(bufferMatricies, k * 16); +// } +// } +// node.thinInstanceSetBuffer("matrix", bufferMatricies, 16, staticBuffer) +// } else { +// console.warn(node + "Node is not a mesh or has no thin instances, skipping"); +// } +// }) + +// return this; +// } + +// export function thinInstanceRotationAt(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3), staticBuffer: boolean = false): Selection{ + +// this.selected.forEach((node, i) => { +// if (node instanceof Mesh && node.hasThinInstances){ +// let bufferMatricies = new Float32Array(node.thinInstanceCount * 16); +// let matricies = node.thinInstanceGetWorldMatrices(); +// if (value instanceof Function){ +// let data = node.metadata.data ??= {}; +// data.forEach((e, j) => { +// let evaluated = value(e,node,j) +// let matrix = Matrix.RotationX(evaluated.x).multiply(matricies[j]) +// matrix = Matrix.RotationY(evaluated.y).multiply(matrix) +// matrix = Matrix.RotationZ(evaluated.z).multiply(matrix) +// matrix.copyToArray(bufferMatricies, j * 16); +// }); +// } else { +// for (let k = 0; k < node.thinInstanceCount; k++){ +// let matrix = Matrix.RotationX(value.x).multiply(matricies[k]) +// matrix = Matrix.RotationY(value.y).multiply(matrix) +// matrix = Matrix.RotationZ(value.z).multiply(matrix) +// matrix.copyToArray(bufferMatricies, k * 16); +// } +// } +// node.thinInstanceSetBuffer("matrix", bufferMatricies, 16, staticBuffer) +// } else { +// console.warn(node + "Node is not a mesh or has no thin instances, skipping"); +// } +// }) + +// return this; +// } + +// export function thinInstanceColorAt(this: Selection, value: Color4 | ((d: any, n: Node, i: number) => Color4), staticBuffer: boolean = false): Selection{ + +// this.selected.forEach((node, i) => { +// if (node instanceof Mesh && node.hasThinInstances){ +// let colorMatricies = new Float32Array(node.thinInstanceCount * 4); +// if (value instanceof Function){ +// let data = node.metadata.data ??= {}; +// data.forEach((e, j) => { +// let evaluated = value(e,node,j) +// colorMatricies[j * 4 + 0] = evaluated.r +// colorMatricies[j * 4 + 1] = evaluated.g +// colorMatricies[j * 4 + 2] = evaluated.b +// colorMatricies[j * 4 + 3] = evaluated.a; + +// }); +// } else { +// for (let k = 0; k < node.thinInstanceCount; k++){ +// colorMatricies[k * 4 + 0] = value.r +// colorMatricies[k * 4 + 1] = value.g +// colorMatricies[k * 4 + 2] = value.b +// colorMatricies[k * 4 + 3] = value.a; +// } +// } +// node.thinInstanceSetBuffer("color", colorMatricies, 4, staticBuffer) +// } else { +// console.warn(node + "Node is not a mesh or has no thin instances, skipping"); +// } +// }) + +// return this; +// } + +export function thinInstanceSetMatrixFor(this: Selection, method: (d: any, n: Node, i: number) => boolean, value: Matrix | ((d: any, n: Node, i: number) => Matrix)): Selection{ + + this.selected.forEach((node, i) => { + node instanceof Mesh + if (node instanceof Mesh && node.hasThinInstances){ + let data = node.metadata.data ??= {}; + (data).forEach((d, k) => { + if (method(d, node, k)) { + node.thinInstanceSetMatrixAt(k, value instanceof Function ? value(node.metadata.data ??= {}, node, k) : value, false); + } + }); + node.thinInstanceSetMatrixAt(0, node.thinInstanceGetWorldMatrices()[0], true); + } + else console.warn(node + "is not a mesh or has no thin instances, skipping"); + + }) + + return this; +} + From 49d44b9243f0eedebbe82bf301db9cc39a8c6ba0 Mon Sep 17 00:00:00 2001 From: "Saffo, David" Date: Fri, 2 Aug 2024 17:31:10 -0400 Subject: [PATCH 5/8] refactoring and fixing methods --- .../ScatterPlots/ScatterplotThinInstance.js | 13 +- src/selection/index.ts | 16 +- src/selection/property/thin.ts | 321 ++++++++---------- 3 files changed, 161 insertions(+), 189 deletions(-) diff --git a/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js b/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js index 08713227..22106165 100644 --- a/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js +++ b/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js @@ -72,15 +72,18 @@ export const scatterplotThinInstance = function(engine){ let thinInstance = anu.bindThinInstance(root, iris) + .thinInstanceScaling(new Vector3(0.05,0.05,0.05)) .thinInstancePosition((d,n,i) => new Vector3(scaleX(d.sepalLength), scaleY(d.petalLength), scaleZ(d.sepalWidth))) - .thinInstanceScaling(new Vector3(0.05,0.05,0.05)) .thinInstanceRotation(() => Vector3.Random()) - .thinInstanceColor((d,n,i) => scaleC(d.species)) + //.thinInstanceColor((d,n,i) => scaleC(d.species)) .thinInstanceRegisterAttribute("color", 4) //.thinInstanceSetAttribute("color", [0,0,0,1]) - //.thinInstanceSetMatrixAt(0, Matrix.Translation(-1,-1,-1)) - .thinInstanceSetMatrixFor((d,n,i) => d.species == "setosa", Matrix.Translation(1,1,1)) - + //.thinInstanceMatrixAt(0, (d,n,i) => Matrix.Translation(-1,-1,-1).multiply(n.thinInstanceGetWorldMatrices()[i])) + //.thinInstanceMatrixFor((d,n,i) => d.species == "setosa", Matrix.Translation(1,1,1)) + .thinInstancePositionAt(0, new Vector3(-1,-1,-1)) + .thinInstanceScalingAt(0, new Vector3(1,1,1)) + .thinInstanceRotationAt(0, new Vector3(0,0,0)) + .thinInstanceColorAt(0, new Color4(0,0,0,1)) diff --git a/src/selection/index.ts b/src/selection/index.ts index 103ec565..1eab8dae 100644 --- a/src/selection/index.ts +++ b/src/selection/index.ts @@ -32,7 +32,10 @@ import { boundingBox } from './utility/boundingBox'; import { filter } from './utility/filter'; import { name, id, metadata } from './property/metadata'; import { positionUI, rotateUI, scaleUI } from '../prefabs/Interactions/facetPosition'; -import { thinInstanceSetBuffer, thinInstancePosition, thinInstanceScaling, thinInstanceRotation, thinInstanceColor, thinInstanceRegisterAttribute, thinInstanceSetAttribute, thinInstanceSetAttributeAt, thinInstanceSetMatrixAt, thinInstanceSetMatrixFor} from './property/thin'; +import { thinInstanceSetBuffer, thinInstancePosition, thinInstanceScaling, thinInstanceRotation, thinInstanceColor, + thinInstanceRegisterAttribute, thinInstanceSetAttribute, thinInstanceAttributeAt, thinInstanceMatrixAt, thinInstanceMatrixFor, + thinInstancePositionAt, thinInstanceScalingAt, thinInstanceRotationAt, thinInstanceColorAt +} from './property/thin'; /* The core class of anujs. All functions should return @@ -106,9 +109,12 @@ export class Selection { public thinInstanceRotation = thinInstanceRotation; public thinInstanceColor = thinInstanceColor; public thinInstanceSetAttribute = thinInstanceSetAttribute; - public thinInstanceSetAttributeAt = thinInstanceSetAttributeAt + public thinInstanceAttributeAt = thinInstanceAttributeAt public thinInstanceRegisterAttribute = thinInstanceRegisterAttribute; - public thinInstanceSetMatrixAt = thinInstanceSetMatrixAt; - public thinInstanceSetMatrixFor = thinInstanceSetMatrixFor; - + public thinInstanceMatrixAt = thinInstanceMatrixAt; + public thinInstanceMatrixFor = thinInstanceMatrixFor; + public thinInstancePositionAt = thinInstancePositionAt; + public thinInstanceScalingAt = thinInstanceScalingAt; + public thinInstanceRotationAt = thinInstanceRotationAt; + public thinInstanceColorAt = thinInstanceColorAt; } diff --git a/src/selection/property/thin.ts b/src/selection/property/thin.ts index 8e86a2d8..0ec7e7d5 100644 --- a/src/selection/property/thin.ts +++ b/src/selection/property/thin.ts @@ -1,7 +1,7 @@ import { Node, Mesh, Matrix, Vector3, Quaternion, Color4} from '@babylonjs/core'; import { Selection } from '../index'; -export function thinInstanceSetBuffer(this: Selection, attribute: string, value: Float32Array | ((d: any, n: Node, i: number) => Float32Array), stride?: number, staticBuffer?: boolean): Selection{ +export function thinInstanceSetBuffer(this: Selection, attribute: string, value: Float32Array | ((d: any, n: Node, i: number) => Float32Array), stride?: number, staticBuffer: boolean = false): Selection{ this.selected.forEach((node, i) => { node instanceof Mesh @@ -17,26 +17,21 @@ export function thinInstanceSetBuffer(this: Selection, attribute: string, value: export function thinInstancePosition(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3), staticBuffer: boolean = false): Selection{ this.selected.forEach((node, i) => { - if (node instanceof Mesh && node.hasThinInstances){ - let bufferMatricies = new Float32Array(node.thinInstanceCount * 16); - let matricies = node.thinInstanceGetWorldMatrices(); - if (value instanceof Function){ - let data = node.metadata.data ??= {}; + node instanceof Mesh + ? node.hasThinInstances + ? (() => { + let bufferMatrices = new Float32Array(node.thinInstanceCount * 16); + let matricies = node.thinInstanceGetWorldMatrices(); + let data = node.metadata.data ??={} data.forEach((e, j) => { - let evaluated = value(e,node,j) - let matrix = Matrix.Translation(evaluated.x, evaluated.y, evaluated.z).multiply(matricies[j]) - matrix.copyToArray(bufferMatricies, j * 16); + let evaluated = value instanceof Function ? value(e, node, j) : value + let matrix = matricies[j].setTranslation(evaluated) + matrix.copyToArray(bufferMatrices, j * 16); }); - } else { - for (let k = 0; k < node.thinInstanceCount; k++){ - let matrix = Matrix.Scaling(value.x, value.y, value.z).multiply(matricies[k]) - matrix.copyToArray(bufferMatricies, k * 16); - } - } - node.thinInstanceSetBuffer("matrix", bufferMatricies, 16, staticBuffer) - } else { - console.warn(node + "Node is not a mesh or has no thin instances, skipping"); - } + node.thinInstanceSetBuffer("matrix", bufferMatrices, 16, staticBuffer) + })() + : console.warn(node + "has no thin instances, skipping") + : console.warn(node + "Node is not a mesh, skipping"); }) return this; @@ -45,58 +40,53 @@ export function thinInstancePosition(this: Selection, value: Vector3 | ((d: any, export function thinInstanceScaling(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3), staticBuffer: boolean = false): Selection{ this.selected.forEach((node, i) => { - if (node instanceof Mesh && node.hasThinInstances){ - let bufferMatricies = new Float32Array(node.thinInstanceCount * 16); - let matricies = node.thinInstanceGetWorldMatrices(); - if (value instanceof Function){ - let data = node.metadata.data ??= {}; + node instanceof Mesh + ? node.hasThinInstances + ? (() => { + let bufferMatrices = new Float32Array(node.thinInstanceCount * 16); + let matrices = node.thinInstanceGetWorldMatrices(); + let data = node.metadata.data ??={} data.forEach((e, j) => { - let evaluated = value(e,node,j) - let matrix = Matrix.Scaling(evaluated.x, evaluated.y, evaluated.z).multiply(matricies[j]) - matrix.copyToArray(bufferMatricies, j * 16); + let evaluated = value instanceof Function ? value(e, node, j) : value + let previousMatrix = matrices[j]; + let matrix = Matrix.ComposeToRef(evaluated, Quaternion.FromRotationMatrix(previousMatrix.getRotationMatrix()), previousMatrix.getTranslation(), previousMatrix) + matrix.copyToArray(bufferMatrices, j * 16); + }); - } else { - for (let k = 0; k < node.thinInstanceCount; k++){ - let matrix = Matrix.Scaling(value.x, value.y, value.z).multiply(matricies[k]) - matrix.copyToArray(bufferMatricies, k * 16); - } - } - node.thinInstanceSetBuffer("matrix", bufferMatricies, 16, staticBuffer) - } else { - console.warn(node + "Node is not a mesh or has no thin instances, skipping"); - } + node.thinInstanceSetBuffer("matrix", bufferMatrices, 16, staticBuffer) + })() + : console.warn(node + "has no thin instances, skipping") + : console.warn(node + "Node is not a mesh, skipping"); }) return this; } + + export function thinInstanceRotation(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3), staticBuffer: boolean = false): Selection{ this.selected.forEach((node, i) => { - if (node instanceof Mesh && node.hasThinInstances){ - let bufferMatricies = new Float32Array(node.thinInstanceCount * 16); - let matricies = node.thinInstanceGetWorldMatrices(); - if (value instanceof Function){ - let data = node.metadata.data ??= {}; + node instanceof Mesh + ? node.hasThinInstances + ? (() => { + + let bufferMatrices = new Float32Array(node.thinInstanceCount * 16); + let matrices = node.thinInstanceGetWorldMatrices(); + let data = node.metadata.data ??={} data.forEach((e, j) => { - let evaluated = value(e,node,j) - let matrix = Matrix.RotationX(evaluated.x).multiply(matricies[j]) - matrix = Matrix.RotationY(evaluated.y).multiply(matrix) - matrix = Matrix.RotationZ(evaluated.z).multiply(matrix) - matrix.copyToArray(bufferMatricies, j * 16); + let evaluated = value instanceof Function ? value(e, node, j) : value + let previousMatrix = matrices[j]; + let previousScale = new Vector3; + previousMatrix.decompose(previousScale) + let matrix = Matrix.ComposeToRef(previousScale, Quaternion.FromEulerVector(evaluated), previousMatrix.getTranslation(), previousMatrix) + matrix.copyToArray(bufferMatrices, j * 16); + }); - } else { - for (let k = 0; k < node.thinInstanceCount; k++){ - let matrix = Matrix.RotationX(value.x).multiply(matricies[k]) - matrix = Matrix.RotationY(value.y).multiply(matrix) - matrix = Matrix.RotationZ(value.z).multiply(matrix) - matrix.copyToArray(bufferMatricies, k * 16); - } - } - node.thinInstanceSetBuffer("matrix", bufferMatricies, 16, staticBuffer) - } else { - console.warn(node + "Node is not a mesh or has no thin instances, skipping"); - } + node.thinInstanceSetBuffer("matrix", bufferMatrices, 16, staticBuffer) + })() + : console.warn(node + "has no thin instances, skipping") + : console.warn(node + "Node is not a mesh, skipping"); }) return this; @@ -106,26 +96,26 @@ export function thinInstanceColor(this: Selection, value: Color4 | ((d: any, n: this.selected.forEach((node, i) => { if (node instanceof Mesh && node.hasThinInstances){ - let colorMatricies = new Float32Array(node.thinInstanceCount * 4); + let colorMatrices = new Float32Array(node.thinInstanceCount * 4); if (value instanceof Function){ let data = node.metadata.data ??= {}; data.forEach((e, j) => { let evaluated = value(e,node,j) - colorMatricies[j * 4 + 0] = evaluated.r - colorMatricies[j * 4 + 1] = evaluated.g - colorMatricies[j * 4 + 2] = evaluated.b - colorMatricies[j * 4 + 3] = evaluated.a; + colorMatrices[j * 4 + 0] = evaluated.r + colorMatrices[j * 4 + 1] = evaluated.g + colorMatrices[j * 4 + 2] = evaluated.b + colorMatrices[j * 4 + 3] = evaluated.a; }); } else { for (let k = 0; k < node.thinInstanceCount; k++){ - colorMatricies[k * 4 + 0] = value.r - colorMatricies[k * 4 + 1] = value.g - colorMatricies[k * 4 + 2] = value.b - colorMatricies[k * 4 + 3] = value.a; + colorMatrices[k * 4 + 0] = value.r + colorMatrices[k * 4 + 1] = value.g + colorMatrices[k * 4 + 2] = value.b + colorMatrices[k * 4 + 3] = value.a; } } - node.thinInstanceSetBuffer("color", colorMatricies, 4, staticBuffer) + node.thinInstanceSetBuffer("color", colorMatrices, 4, staticBuffer) } else { console.warn(node + "Node is not a mesh or has no thin instances, skipping"); } @@ -162,9 +152,11 @@ export function thinInstanceSetAttribute(this: Selection, attribute: string, val return this; } -export function thinInstanceSetAttributeAt(this: Selection, attribute: string, index: number, value: any | ((d: any, n: Node, i: number) => any)): Selection{ - +export function thinInstanceAttributeAt(this: Selection, attribute: string, index: number, value: any | ((d: any, n: Node, i: number) => any)): Selection{ this.selected.forEach((node, i) => { + + let evaluated = value instanceof Function ? value(node.metadata.data[index] ??= {}, node, index) : value + node instanceof Mesh ? node.hasThinInstances ? node.thinInstanceSetAttributeAt(attribute, index, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value) @@ -175,12 +167,31 @@ export function thinInstanceSetAttributeAt(this: Selection, attribute: string, i return this; } -export function thinInstanceSetMatrixAt(this: Selection, index: number, value: Matrix | ((d: any, n: Node, i: number) => Matrix)): Selection{ +export function thinInstanceMatrixAt(this: Selection, index: number, value: Matrix | ((d: any, n: Node, i: number) => Matrix)): Selection{ + + this.selected.forEach((node, i) => { + let evaluated = value instanceof Function ? value(node.metadata.data[index] ??= {}, node, index) : value + node instanceof Mesh + ? node.hasThinInstances + ? node.thinInstanceSetMatrixAt(index, evaluated) + : console.warn(node + "has no thin instances, skipping") + : console.warn(node + "Node is not a mesh, skipping"); + }) + + return this; +} + +export function thinInstancePositionAt(this: Selection, index: number, value: Vector3 | ((d: any, n: Node, i: number) => Vector3)): Selection{ this.selected.forEach((node, i) => { node instanceof Mesh ? node.hasThinInstances - ? node.thinInstanceSetMatrixAt(index, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value) + ? (() => { + let evaluated = value instanceof Function ? value(node.metadata.data[index] ??= {}, node, index) : value + let previousMatrix = node.thinInstanceGetWorldMatrices()[index]; + let matrix = previousMatrix.setTranslation(evaluated); + node.thinInstanceSetMatrixAt(index, matrix) + })() : console.warn(node + "has no thin instances, skipping") : console.warn(node + "Node is not a mesh, skipping"); }) @@ -188,112 +199,64 @@ export function thinInstanceSetMatrixAt(this: Selection, index: number, value: M return this; } -// export function thinInstancePositionAt(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3), staticBuffer: boolean = false): Selection{ - -// this.selected.forEach((node, i) => { -// node instanceof Mesh -// ? node.hasThinInstances -// ? node.thinInstanceSetMatrixAt(index, value instanceof Function ? value(node.metadata.data ??= {}, node, i) : value) -// : console.warn(node + "has no thin instances, skipping") -// : console.warn(node + "Node is not a mesh, skipping"); -// }) - -// return this; -// } - -// export function thinInstanceScalingAt(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3), staticBuffer: boolean = false): Selection{ - -// this.selected.forEach((node, i) => { -// if (node instanceof Mesh && node.hasThinInstances){ -// let bufferMatricies = new Float32Array(node.thinInstanceCount * 16); -// let matricies = node.thinInstanceGetWorldMatrices(); -// if (value instanceof Function){ -// let data = node.metadata.data ??= {}; -// data.forEach((e, j) => { -// let evaluated = value(e,node,j) -// let matrix = Matrix.Scaling(evaluated.x, evaluated.y, evaluated.z).multiply(matricies[j]) -// matrix.copyToArray(bufferMatricies, j * 16); -// }); -// } else { -// for (let k = 0; k < node.thinInstanceCount; k++){ -// let matrix = Matrix.Scaling(value.x, value.y, value.z).multiply(matricies[k]) -// matrix.copyToArray(bufferMatricies, k * 16); -// } -// } -// node.thinInstanceSetBuffer("matrix", bufferMatricies, 16, staticBuffer) -// } else { -// console.warn(node + "Node is not a mesh or has no thin instances, skipping"); -// } -// }) - -// return this; -// } - -// export function thinInstanceRotationAt(this: Selection, value: Vector3 | ((d: any, n: Node, i: number) => Vector3), staticBuffer: boolean = false): Selection{ - -// this.selected.forEach((node, i) => { -// if (node instanceof Mesh && node.hasThinInstances){ -// let bufferMatricies = new Float32Array(node.thinInstanceCount * 16); -// let matricies = node.thinInstanceGetWorldMatrices(); -// if (value instanceof Function){ -// let data = node.metadata.data ??= {}; -// data.forEach((e, j) => { -// let evaluated = value(e,node,j) -// let matrix = Matrix.RotationX(evaluated.x).multiply(matricies[j]) -// matrix = Matrix.RotationY(evaluated.y).multiply(matrix) -// matrix = Matrix.RotationZ(evaluated.z).multiply(matrix) -// matrix.copyToArray(bufferMatricies, j * 16); -// }); -// } else { -// for (let k = 0; k < node.thinInstanceCount; k++){ -// let matrix = Matrix.RotationX(value.x).multiply(matricies[k]) -// matrix = Matrix.RotationY(value.y).multiply(matrix) -// matrix = Matrix.RotationZ(value.z).multiply(matrix) -// matrix.copyToArray(bufferMatricies, k * 16); -// } -// } -// node.thinInstanceSetBuffer("matrix", bufferMatricies, 16, staticBuffer) -// } else { -// console.warn(node + "Node is not a mesh or has no thin instances, skipping"); -// } -// }) - -// return this; -// } - -// export function thinInstanceColorAt(this: Selection, value: Color4 | ((d: any, n: Node, i: number) => Color4), staticBuffer: boolean = false): Selection{ - -// this.selected.forEach((node, i) => { -// if (node instanceof Mesh && node.hasThinInstances){ -// let colorMatricies = new Float32Array(node.thinInstanceCount * 4); -// if (value instanceof Function){ -// let data = node.metadata.data ??= {}; -// data.forEach((e, j) => { -// let evaluated = value(e,node,j) -// colorMatricies[j * 4 + 0] = evaluated.r -// colorMatricies[j * 4 + 1] = evaluated.g -// colorMatricies[j * 4 + 2] = evaluated.b -// colorMatricies[j * 4 + 3] = evaluated.a; - -// }); -// } else { -// for (let k = 0; k < node.thinInstanceCount; k++){ -// colorMatricies[k * 4 + 0] = value.r -// colorMatricies[k * 4 + 1] = value.g -// colorMatricies[k * 4 + 2] = value.b -// colorMatricies[k * 4 + 3] = value.a; -// } -// } -// node.thinInstanceSetBuffer("color", colorMatricies, 4, staticBuffer) -// } else { -// console.warn(node + "Node is not a mesh or has no thin instances, skipping"); -// } -// }) - -// return this; -// } - -export function thinInstanceSetMatrixFor(this: Selection, method: (d: any, n: Node, i: number) => boolean, value: Matrix | ((d: any, n: Node, i: number) => Matrix)): Selection{ +export function thinInstanceScalingAt(this: Selection, index: number, value: Vector3 | ((d: any, n: Node, i: number) => Vector3)): Selection{ + + this.selected.forEach((node, i) => { + node instanceof Mesh + ? node.hasThinInstances + ? (() => { + let evaluated = value instanceof Function ? value(node.metadata.data[index] ??= {}, node, index) : value + let previousMatrix = node.thinInstanceGetWorldMatrices()[index]; + let matrix = Matrix.ComposeToRef(evaluated, Quaternion.FromRotationMatrix(previousMatrix.getRotationMatrix()), previousMatrix.getTranslation(), previousMatrix) + node.thinInstanceSetMatrixAt(index, matrix) + })() + : console.warn(node + "has no thin instances, skipping") + : console.warn(node + "Node is not a mesh, skipping"); + }) + + return this; +} + +export function thinInstanceRotationAt(this: Selection, index: number, value: Vector3 | ((d: any, n: Node, i: number) => Vector3)): Selection{ + + this.selected.forEach((node, i) => { + node instanceof Mesh + ? node.hasThinInstances + ? (() => { + let evaluated = value instanceof Function ? value(node.metadata.data[index] ??= {}, node, index) : value + let previousMatrix = node.thinInstanceGetWorldMatrices()[index]; + let previousScale = new Vector3; + previousMatrix.decompose(previousScale) + let matrix = Matrix.ComposeToRef(previousScale, Quaternion.FromEulerVector(evaluated), previousMatrix.getTranslation(), previousMatrix) + node.thinInstanceSetMatrixAt(index, matrix) + })() + : console.warn(node + "has no thin instances, skipping") + : console.warn(node + "Node is not a mesh, skipping"); + }) + + return this; +} + + +export function thinInstanceColorAt(this: Selection, index: number, value: Color4 | ((d: any, n: Node, i: number) => Color4)): Selection{ + + this.selected.forEach((node, i) => { + node instanceof Mesh + ? node.hasThinInstances + ? (() => { + let evaluated = value instanceof Function ? value(node.metadata.data[index] ??= {}, node, index) : value + node.thinInstanceSetAttributeAt("color", index, [evaluated.r, evaluated.g, evaluated.b, evaluated.a]) + })() + : console.warn(node + "has no thin instances, skipping") + : console.warn(node + "Node is not a mesh, skipping"); + }) + + return this; +} + + + +export function thinInstanceMatrixFor(this: Selection, method: (d: any, n: Node, i: number) => boolean, value: Matrix | ((d: any, n: Node, i: number) => Matrix)): Selection{ this.selected.forEach((node, i) => { node instanceof Mesh From 5cf215c8381b0dcb24f891b9ff6d6441bbd3e796 Mon Sep 17 00:00:00 2001 From: "Saffo, David" Date: Mon, 5 Aug 2024 11:57:44 -0400 Subject: [PATCH 6/8] thinInstanceMethods first sprint complete --- .../ScatterPlots/ScatterplotThinInstance.js | 24 +++-- src/bind.ts | 1 + src/selection/bind/bind.ts | 20 +++- src/selection/index.ts | 11 ++- src/selection/property/thin.ts | 98 ++++++++++++++++++- 5 files changed, 135 insertions(+), 19 deletions(-) diff --git a/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js b/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js index 22106165..c439b0ad 100644 --- a/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js +++ b/anu-examples/examples/ScatterPlots/ScatterplotThinInstance.js @@ -71,31 +71,29 @@ export const scatterplotThinInstance = function(engine){ // }) - let thinInstance = anu.bindThinInstance(root, iris) - .thinInstanceScaling(new Vector3(0.05,0.05,0.05)) + let thinInstance = chart.bindThinInstance(root, iris) + .thinInstanceScaling(new Vector3(0.05,0.05,0.05)) .thinInstancePosition((d,n,i) => new Vector3(scaleX(d.sepalLength), scaleY(d.petalLength), scaleZ(d.sepalWidth))) .thinInstanceRotation(() => Vector3.Random()) //.thinInstanceColor((d,n,i) => scaleC(d.species)) .thinInstanceRegisterAttribute("color", 4) - //.thinInstanceSetAttribute("color", [0,0,0,1]) - //.thinInstanceMatrixAt(0, (d,n,i) => Matrix.Translation(-1,-1,-1).multiply(n.thinInstanceGetWorldMatrices()[i])) - //.thinInstanceMatrixFor((d,n,i) => d.species == "setosa", Matrix.Translation(1,1,1)) + .thinInstanceSetAttribute("color", [0.5,0.5,0.5,1]) + .thinInstanceMatrixAt(0, (d,n,i) => Matrix.Translation(-1,-1,-1).multiply(n.thinInstanceGetWorldMatrices()[i])) + .thinInstanceMatrixFor((d,n,i) => d.species == "setosa", Matrix.Translation(1,1,1)) + .thinInstancePositionFor((d,n,i) => d.species == "setosa", new Vector3(1,1,1)) + .thinInstanceScalingFor((d,n,i) => d.species == "setosa", new Vector3(0.1,0.1,0.1)) + .thinInstanceRotationFor((d,n,i) => d.species == "setosa", new Vector3(0,0,0)) + .thinInstanceColorFor((d,n,i) => d.species == "virginica", new Color4(0,0,0, 1)) .thinInstancePositionAt(0, new Vector3(-1,-1,-1)) .thinInstanceScalingAt(0, new Vector3(1,1,1)) .thinInstanceRotationAt(0, new Vector3(0,0,0)) .thinInstanceColorAt(0, new Color4(0,0,0,1)) - - - // public thinInstanceSetAttribute = thinInstanceSetAttribute; - // public thinInstanceSetAttributeAt = thinInstanceSetAttributeAt - // public thinInstanceRegisterAttribute = thinInstanceRegisterAttribute; - // public thinInstanceSetMatrixAt = thinInstanceSetMatrixAt; - + //root.scaling = new Vector3(0.1,0.1,0.1); - //console.log(thinInstance.selected[0]) + console.log(thinInstance.selected) anu.createAxes('test', scene, {parent: chart, scale: {x: scaleX, y: scaleY, z: scaleZ}}); diff --git a/src/bind.ts b/src/bind.ts index dd832574..e10bfde5 100644 --- a/src/bind.ts +++ b/src/bind.ts @@ -52,6 +52,7 @@ export function bindInstance(mesh: Mesh, data: Array = [{}], scene?: Sce } export function bindThinInstance(mesh: Mesh, data: Array = [{}], scene?: Scene): Selection { + console.log('hello') scene = (scene != undefined) ? scene : mesh.getScene(); Tags.EnableFor(mesh); mesh.actionManager = new ActionManager(scene); diff --git a/src/selection/bind/bind.ts b/src/selection/bind/bind.ts index 92eb7696..73cb3715 100644 --- a/src/selection/bind/bind.ts +++ b/src/selection/bind/bind.ts @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright : J.P. Morgan Chase & Co. -import { Node, ActionManager, Tags, Mesh, InstancedMesh } from '@babylonjs/core'; +import { Node, ActionManager, Tags, Mesh, InstancedMesh, Matrix } from '@babylonjs/core'; import { Selection } from '../index'; import { create, MeshTypes } from '../../create'; @@ -54,3 +54,21 @@ export function bindInstance(this: Selection, mesh: Mesh, data: Array = return new Selection(meshes, this.scene); } + +export function bindThinInstance(this: Selection, mesh: Mesh, data: Array = [{}]): Selection { + let meshes: Node[] = []; + this.selected.forEach((node) => { + Tags.EnableFor(mesh); + mesh.actionManager = new ActionManager(this.scene); + mesh.metadata = { ...mesh.metadata, data: data }; + mesh.setParent(node); + let matrices = new Float32Array(16 * data.length * 3); + data.forEach((element, i) => { + let matrix = Matrix.Identity(); + matrix.copyToArray(matrices, i * 16); + }); + mesh.thinInstanceSetBuffer("matrix", matrices, 16, false); + meshes.push(mesh) + }); + return new Selection(meshes, this.scene); +} \ No newline at end of file diff --git a/src/selection/index.ts b/src/selection/index.ts index 1eab8dae..b22e4ccc 100644 --- a/src/selection/index.ts +++ b/src/selection/index.ts @@ -4,7 +4,7 @@ import { Node, Mesh, TransformNode, InstancedMesh } from '@babylonjs/core'; import { Scene } from '@babylonjs/core/scene'; import { select, selectName, selectId, selectTag } from './utility/select'; -import { bind, bindInstance } from './bind/bind'; +import { bind, bindInstance, bindThinInstance } from './bind/bind'; import { position, positionX, positionY, positionZ } from './property/position'; import { translate } from './bind/translate'; import { rotation, rotationX, rotationY, rotationZ } from './property/rotation'; @@ -34,7 +34,8 @@ import { name, id, metadata } from './property/metadata'; import { positionUI, rotateUI, scaleUI } from '../prefabs/Interactions/facetPosition'; import { thinInstanceSetBuffer, thinInstancePosition, thinInstanceScaling, thinInstanceRotation, thinInstanceColor, thinInstanceRegisterAttribute, thinInstanceSetAttribute, thinInstanceAttributeAt, thinInstanceMatrixAt, thinInstanceMatrixFor, - thinInstancePositionAt, thinInstanceScalingAt, thinInstanceRotationAt, thinInstanceColorAt + thinInstancePositionAt, thinInstanceScalingAt, thinInstanceRotationAt, thinInstanceColorAt, + thinInstancePositionFor, thinInstanceScalingFor, thinInstanceRotationFor, thinInstanceColorFor } from './property/thin'; /* @@ -117,4 +118,10 @@ export class Selection { public thinInstanceScalingAt = thinInstanceScalingAt; public thinInstanceRotationAt = thinInstanceRotationAt; public thinInstanceColorAt = thinInstanceColorAt; + public thinInstancePositionFor = thinInstancePositionFor; + public thinInstanceScalingFor = thinInstanceScalingFor; + public thinInstanceRotationFor = thinInstanceRotationFor; + public thinInstanceColorFor = thinInstanceColorFor; + public bindThinInstance = bindThinInstance; + } diff --git a/src/selection/property/thin.ts b/src/selection/property/thin.ts index 0ec7e7d5..b8aed4a1 100644 --- a/src/selection/property/thin.ts +++ b/src/selection/property/thin.ts @@ -21,11 +21,11 @@ export function thinInstancePosition(this: Selection, value: Vector3 | ((d: any, ? node.hasThinInstances ? (() => { let bufferMatrices = new Float32Array(node.thinInstanceCount * 16); - let matricies = node.thinInstanceGetWorldMatrices(); + let matrices = node.thinInstanceGetWorldMatrices(); let data = node.metadata.data ??={} data.forEach((e, j) => { let evaluated = value instanceof Function ? value(e, node, j) : value - let matrix = matricies[j].setTranslation(evaluated) + let matrix = matrices[j].setTranslation(evaluated) matrix.copyToArray(bufferMatrices, j * 16); }); node.thinInstanceSetBuffer("matrix", bufferMatrices, 16, staticBuffer) @@ -259,7 +259,6 @@ export function thinInstanceColorAt(this: Selection, index: number, value: Color export function thinInstanceMatrixFor(this: Selection, method: (d: any, n: Node, i: number) => boolean, value: Matrix | ((d: any, n: Node, i: number) => Matrix)): Selection{ this.selected.forEach((node, i) => { - node instanceof Mesh if (node instanceof Mesh && node.hasThinInstances){ let data = node.metadata.data ??= {}; (data).forEach((d, k) => { @@ -276,3 +275,96 @@ export function thinInstanceMatrixFor(this: Selection, method: (d: any, n: Node, return this; } +export function thinInstancePositionFor(this: Selection, method: (d: any, n: Node, i: number) => boolean, value: Vector3| ((d: any, n: Node, i: number) => Vector3)): Selection{ + + this.selected.forEach((node, i) => { + if (node instanceof Mesh && node.hasThinInstances){ + let bufferMatrices = new Float32Array(node.thinInstanceCount * 16); + let matrices = node.thinInstanceGetWorldMatrices(); + let data = node.metadata.data ??={} + data.forEach((e, j) => { + if (method(e, node, j)) { + let evaluated = value instanceof Function ? value(e, node, j) : value + let previousMatrix = node.thinInstanceGetWorldMatrices()[j]; + let matrix = previousMatrix.setTranslation(evaluated); + node.thinInstanceSetMatrixAt(j, matrix, false) + } + }); + node.thinInstanceSetMatrixAt(0, node.thinInstanceGetWorldMatrices()[0], true); + } + else console.warn(node + "is not a mesh or has no thin instances, skipping"); + }) + + return this; +} + +export function thinInstanceRotationFor(this: Selection, method: (d: any, n: Node, i: number) => boolean, value: Vector3| ((d: any, n: Node, i: number) => Vector3)): Selection{ + + this.selected.forEach((node, i) => { + if (node instanceof Mesh && node.hasThinInstances){ + let bufferMatrices = new Float32Array(node.thinInstanceCount * 16); + let matrices = node.thinInstanceGetWorldMatrices(); + let data = node.metadata.data ??={} + data.forEach((e, j) => { + if (method(e, node, j)) { + let evaluated = value instanceof Function ? value(e, node, j) : value + let previousMatrix = node.thinInstanceGetWorldMatrices()[j]; + let previousScale = new Vector3; + previousMatrix.decompose(previousScale) + let matrix = Matrix.ComposeToRef(previousScale, Quaternion.FromEulerVector(evaluated), previousMatrix.getTranslation(), previousMatrix) + node.thinInstanceSetMatrixAt(j, matrix, false) + } + }); + node.thinInstanceSetMatrixAt(0, node.thinInstanceGetWorldMatrices()[0], true); + } + else console.warn(node + "is not a mesh or has no thin instances, skipping"); + }) + + return this; +} + +export function thinInstanceScalingFor(this: Selection, method: (d: any, n: Node, i: number) => boolean, value: Vector3| ((d: any, n: Node, i: number) => Vector3)): Selection{ + + this.selected.forEach((node, i) => { + if (node instanceof Mesh && node.hasThinInstances){ + let bufferMatrices = new Float32Array(node.thinInstanceCount * 16); + let matrices = node.thinInstanceGetWorldMatrices(); + let data = node.metadata.data ??={} + data.forEach((e, j) => { + if (method(e, node, j)) { + console.log('hello') + let evaluated = value instanceof Function ? value(e, node, j) : value + let previousMatrix = node.thinInstanceGetWorldMatrices()[j]; + let matrix = Matrix.ComposeToRef(evaluated, Quaternion.FromRotationMatrix(previousMatrix.getRotationMatrix()), previousMatrix.getTranslation(), previousMatrix) + node.thinInstanceSetMatrixAt(j, matrix, true) + } + }); + //node.thinInstanceSetMatrixAt(0, node.thinInstanceGetWorldMatrices()[0], true); + } + else console.warn(node + "is not a mesh or has no thin instances, skipping"); + }) + + return this; +} + +export function thinInstanceColorFor(this: Selection, method: (d: any, n: Node, i: number) => boolean, value: Color4 | ((d: any, n: Node, i: number) => Color4)): Selection{ + + this.selected.forEach((node, i) => { + if (node instanceof Mesh && node.hasThinInstances){ + let bufferMatrices = new Float32Array(node.thinInstanceCount * 16); + let matrices = node.thinInstanceGetWorldMatrices(); + let data = node.metadata.data ??={} + data.forEach((e, j) => { + if (method(e, node, j)) { + let evaluated = value instanceof Function ? value(e, node, j) : value + node.thinInstanceSetAttributeAt("color", j, [evaluated.r, evaluated.g, evaluated.b, evaluated.a]) + } + }); + node.thinInstanceSetMatrixAt(0, node.thinInstanceGetWorldMatrices()[0], true); + } + else console.warn(node + "is not a mesh or has no thin instances, skipping"); + }) + + return this; +} + From c46589338923573270df28a7aa22c335c21d72e2 Mon Sep 17 00:00:00 2001 From: "Saffo, David" Date: Mon, 5 Aug 2024 11:59:31 -0400 Subject: [PATCH 7/8] typedocs --- src/bind.ts | 9 +++++++++ src/selection/bind/bind.ts | 15 ++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/bind.ts b/src/bind.ts index e10bfde5..9212f029 100644 --- a/src/bind.ts +++ b/src/bind.ts @@ -51,6 +51,15 @@ export function bindInstance(mesh: Mesh, data: Array = [{}], scene?: Sce return new Selection(meshes, scene); } +/** + * Take a selection, a shape type, and data. For each index in the data create a new mesh for each node in the selection as the parent. + * The data index of the mesh is also attached to the mesh node object under the metadata property. + * + * @param mesh The mesh to create instances from. + * @param data The data to bind elements too, must be passed as a list of objects where each object represents a row of tabular data. + * @returns An instance of Selection, a class containing a array of selected nodes, the scene, and the functions of the class Selection, + * or undefined if a selection could not be made. + */ export function bindThinInstance(mesh: Mesh, data: Array = [{}], scene?: Scene): Selection { console.log('hello') scene = (scene != undefined) ? scene : mesh.getScene(); diff --git a/src/selection/bind/bind.ts b/src/selection/bind/bind.ts index 73cb3715..290ba6c6 100644 --- a/src/selection/bind/bind.ts +++ b/src/selection/bind/bind.ts @@ -31,12 +31,12 @@ export function bind(this: Selection, shape: M } /** - * Take a selection, a shape type, and data. For each index in the data create a new mesh for each node in the selection as the parrent. - * The data index of the mesh is also attached to the mesh node object under the metadate property. + * Take a selection, a shape type, and data. For each index in the data create a new mesh for each node in the selection as the parent. + * The data index of the mesh is also attached to the mesh node object under the metadata property. * * @param mesh The mesh to create instances from. * @param data The data to bind elements too, must be passed as a list of objects where each object represents a row of tabular data. - * @returns An instance of Selection, a class contating a array of selected nodes, the scene, and the functions of the class Selection, + * @returns An instance of Selection, a class containing a array of selected nodes, the scene, and the functions of the class Selection, * or undefined if a selection could not be made. */ export function bindInstance(this: Selection, mesh: Mesh, data: Array = [{}]): Selection { @@ -55,6 +55,15 @@ export function bindInstance(this: Selection, mesh: Mesh, data: Array = return new Selection(meshes, this.scene); } +/** + * Take a selection, a mesh, and data. For each index in the data create a new mesh for each node in the selection as the parent. + * The data index of the mesh is also attached to the mesh node object under the metadata property. + * + * @param mesh The mesh to create instances from. + * @param data The data to bind elements too, must be passed as a list of objects where each object represents a row of tabular data. + * @returns An instance of Selection, a class containing a array of selected nodes, the scene, and the functions of the class Selection, + * or undefined if a selection could not be made. + */ export function bindThinInstance(this: Selection, mesh: Mesh, data: Array = [{}]): Selection { let meshes: Node[] = []; this.selected.forEach((node) => { From 80716122a4911837dbbe6095a022d9c265963a3e Mon Sep 17 00:00:00 2001 From: "Saffo, David" Date: Mon, 5 Aug 2024 12:01:02 -0400 Subject: [PATCH 8/8] version push --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 98dc01e3..201c4d05 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jpmorganchase/anu", - "version": "0.0.55", + "version": "0.1", "description": "", "type": "module", "files": [